ZGlmZiAtLWdpdCBhLy5jbGFuZy1mb3JtYXQgYi8uY2xhbmctZm9ybWF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2MmVlZjgKLS0tIC9kZXYvbnVsbAorKysgYi8uY2xhbmctZm9ybWF0CkBAIC0wLDAgKzEsNTYgQEAKKy0tLQorTGFuZ3VhZ2U6ICAgICAgICBDcHAKKyMgQmFzZWRPblN0eWxlOiAgTExWTQorQWNjZXNzTW9kaWZpZXJPZmZzZXQ6IC0yCitDb25zdHJ1Y3RvckluaXRpYWxpemVySW5kZW50V2lkdGg6IDIKK0FsaWduRXNjYXBlZE5ld2xpbmVzTGVmdDogZmFsc2UKK0FsaWduVHJhaWxpbmdDb21tZW50czogdHJ1ZQorQWxsb3dBbGxQYXJhbWV0ZXJzT2ZEZWNsYXJhdGlvbk9uTmV4dExpbmU6IGZhbHNlCitBbGxvd1Nob3J0QmxvY2tzT25BU2luZ2xlTGluZTogZmFsc2UKK0FsbG93U2hvcnRJZlN0YXRlbWVudHNPbkFTaW5nbGVMaW5lOiBmYWxzZQorQWxsb3dTaG9ydExvb3BzT25BU2luZ2xlTGluZTogZmFsc2UKK0FsbG93U2hvcnRGdW5jdGlvbnNPbkFTaW5nbGVMaW5lOiBJbmxpbmUKK0Fsd2F5c0JyZWFrVGVtcGxhdGVEZWNsYXJhdGlvbnM6IHRydWUKK0Fsd2F5c0JyZWFrQmVmb3JlTXVsdGlsaW5lU3RyaW5nczogdHJ1ZQorQnJlYWtCZWZvcmVCaW5hcnlPcGVyYXRvcnM6IHRydWUKK0JyZWFrQmVmb3JlVGVybmFyeU9wZXJhdG9yczogdHJ1ZQorQnJlYWtDb25zdHJ1Y3RvckluaXRpYWxpemVyc0JlZm9yZUNvbW1hOiBmYWxzZQorQmluUGFja1BhcmFtZXRlcnM6IGZhbHNlCitDb2x1bW5MaW1pdDogICAgIDEwMAorQ29uc3RydWN0b3JJbml0aWFsaXplckFsbE9uT25lTGluZU9yT25lUGVyTGluZTogdHJ1ZQorRGVyaXZlUG9pbnRlckFsaWdubWVudDogZmFsc2UKK0luZGVudENhc2VMYWJlbHM6IGZhbHNlCitJbmRlbnRXcmFwcGVkRnVuY3Rpb25OYW1lczogZmFsc2UKK0luZGVudEZ1bmN0aW9uRGVjbGFyYXRpb25BZnRlclR5cGU6IGZhbHNlCitNYXhFbXB0eUxpbmVzVG9LZWVwOiAxCitLZWVwRW1wdHlMaW5lc0F0VGhlU3RhcnRPZkJsb2NrczogdHJ1ZQorTmFtZXNwYWNlSW5kZW50YXRpb246IE5vbmUKK09iakNTcGFjZUFmdGVyUHJvcGVydHk6IGZhbHNlCitPYmpDU3BhY2VCZWZvcmVQcm90b2NvbExpc3Q6IHRydWUKK1BlbmFsdHlCcmVha0JlZm9yZUZpcnN0Q2FsbFBhcmFtZXRlcjogMTkwCitQZW5hbHR5QnJlYWtDb21tZW50OiAzMDAKK1BlbmFsdHlCcmVha1N0cmluZzogMTAwMDAKK1BlbmFsdHlCcmVha0ZpcnN0TGVzc0xlc3M6IDEyMAorUGVuYWx0eUV4Y2Vzc0NoYXJhY3RlcjogMTAwMDAwMAorUGVuYWx0eVJldHVyblR5cGVPbkl0c093bkxpbmU6IDEyMDAKK1BvaW50ZXJBbGlnbm1lbnQ6IExlZnQKK1NwYWNlc0JlZm9yZVRyYWlsaW5nQ29tbWVudHM6IDEKK0NwcDExQnJhY2VkTGlzdFN0eWxlOiB0cnVlCitTdGFuZGFyZDogICAgICAgIEF1dG8KK0luZGVudFdpZHRoOiAgICAgMgorVGFiV2lkdGg6ICAgICAgICA0CitVc2VUYWI6ICAgICAgICAgIE5ldmVyCitCcmVha0JlZm9yZUJyYWNlczogQXR0YWNoCitTcGFjZXNJblBhcmVudGhlc2VzOiBmYWxzZQorU3BhY2VzSW5BbmdsZXM6ICBmYWxzZQorU3BhY2VJbkVtcHR5UGFyZW50aGVzZXM6IGZhbHNlCitTcGFjZXNJbkNTdHlsZUNhc3RQYXJlbnRoZXNlczogZmFsc2UKK1NwYWNlc0luQ29udGFpbmVyTGl0ZXJhbHM6IHRydWUKK1NwYWNlQmVmb3JlQXNzaWdubWVudE9wZXJhdG9yczogdHJ1ZQorQ29udGludWF0aW9uSW5kZW50V2lkdGg6IDQKK0NvbW1lbnRQcmFnbWFzOiAgJ14gSVdZVSBwcmFnbWE6JworRm9yRWFjaE1hY3JvczogICBbIGZvcmVhY2gsIFFfRk9SRUFDSCwgQk9PU1RfRk9SRUFDSCBdCitTcGFjZUJlZm9yZVBhcmVuczogQ29udHJvbFN0YXRlbWVudHMKK0Rpc2FibGVGb3JtYXQ6ICAgZmFsc2UKKy4uLgorCmRpZmYgLS1naXQgYS8uZG9ja2VyaWdub3JlIGIvLmRvY2tlcmlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDJlY2Q2Ci0tLSAvZGV2L251bGwKKysrIGIvLmRvY2tlcmlnbm9yZQpAQCAtMCwwICsxIEBACisuZ2l0LwpkaWZmIC0tZ2l0IGEvLmVkaXRvcmNvbmZpZyBiLy5lZGl0b3Jjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzYxMTc2MgotLS0gL2Rldi9udWxsCisrKyBiLy5lZGl0b3Jjb25maWcKQEAgLTAsMCArMSwxMTIgQEAKKyMKKyMjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMjCisjIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIyMKKyMjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIyB1bmRlciB0aGUgTGljZW5zZS4KKyMjCisjCisKKyMgRWRpdG9yQ29uZmlnOiBodHRwOi8vZWRpdG9yY29uZmlnLm9yZworIyBzZWUgZG9jL2NvZGluZ19zdGFuZGFyZHMubWQKKworcm9vdCA9IHRydWUKKworWypdCitlbmRfb2ZfbGluZSA9IGxmCitjaGFyc2V0ID0gdXRmLTgKK3RyaW1fdHJhaWxpbmdfd2hpdGVzcGFjZSA9IHRydWUKK2luc2VydF9maW5hbF9uZXdsaW5lID0gdHJ1ZQorCisjIEFjdGlvblNjcmlwdAorIyBbKi5hc10KKworIyBDCisjIFsqLmNdCisKKyMgQysrCitbKi5jcHBdCitpbmRlbnRfc3R5bGUgPSBzcGFjZQoraW5kZW50X3NpemUgPSAyCisKKyMgQy1TaGFycAorIyBbKi5jc10KKworIyBECisjIFsqLmRdCisKKyMgRXJsYW5nCisjIFsqLmVybF0KKworIyBHby1sYW5nCitbKi5nb10KK2luZGVudF9zdHlsZSA9IHRhYgoraW5kZW50X3NpemUgPSA4CisKKyMgQyBoZWFkZXIgZmlsZXMKKyMgWyouaF0KKworIyBIYXNrZWxsCisjIFsqLmhzXQorCisjIEhheGUKKyMgWyouaHhdCisKKyMgSmF2YQorIyBbKi5qYXZhXQorCisjIEphdmFzY3JpcHQKK1sqLmpzXQoraW5kZW50X3N0eWxlID0gc3BhY2UKK2luZGVudF9zaXplID0gMgorCisjIEpTT04KK1sqLmpzb25dCitpbmRlbnRfc3R5bGUgPSBzcGFjZQoraW5kZW50X3NpemUgPSAyCisKKyMgTHVhCisjIFsqLmx1YV0KKworWyoubWFya2Rvd25dCitpbmRlbnRfc3R5bGUgPSBzcGFjZQordHJpbV90cmFpbGluZ193aGl0ZXNwYWNlID0gZmFsc2UKKworWyoubWRdCitpbmRlbnRfc3R5bGUgPSBzcGFjZQordHJpbV90cmFpbGluZ193aGl0ZXNwYWNlID0gZmFsc2UKKworIyBPQ2FtbAorIyBbKi5tbF0KKworIyBEZWxwaGkgUGFzY2FsCisjIFsqLnBhc10KKworIyBQSFAKKyMgWyoucGhwXQorCisjIFBlcmwKKyMgWyoucG1dCisKKyMgUHl0aG9uCisjIFsqLnB5XQorCisjIFJ1YnkKKyMgWyoucmJdCisKKyMgVHlwZXNjcmlwdAorIyBbKi50c10KKworIyBYTUwKKyMgWyoueG1sXQpkaWZmIC0tZ2l0IGEvLmVzbGludGlnbm9yZSBiLy5lc2xpbnRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRlMmRiYQotLS0gL2Rldi9udWxsCisrKyBiLy5lc2xpbnRpZ25vcmUKQEAgLTAsMCArMSw5IEBACisjIFRPRE86IFVzZSBlc2xpbnQgb24ganMgbGliIGFuZCBnZW5lcmF0ZWQgY29kZQorCisjIElnbm9yZSBsaWIvanMgZm9yIG5vdywgd2hpY2ggdXNlcyBqc2hpbnQgY3VycmVudGx5CitsaWIvanMvKgorIyBJZ25vcmUgYWxsIGdlbmVyYXRlZCBjb2RlIGZvciBub3cKKyoqL2dlbi0qCisKKyMgRG9uJ3QgbGludCBuZXN0ZWQgbm9kZV9tb2R1bGVzCisqKi9ub2RlX21vZHVsZXMKZGlmZiAtLWdpdCBhLy5lc2xpbnRyYy5qc29uIGIvLmVzbGludHJjLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFhZTgyMAotLS0gL2Rldi9udWxsCisrKyBiLy5lc2xpbnRyYy5qc29uCkBAIC0wLDAgKzEsMjQgQEAKK3sKKyAgImVudiI6IHsKKyAgICAiZXM2IjogdHJ1ZSwKKyAgICAibm9kZSI6IHRydWUKKyAgfSwKKyAgImV4dGVuZHMiOiBbCisgICAgImVzbGludDpyZWNvbW1lbmRlZCIsCisgICAgInBsdWdpbjpwcmV0dGllci9yZWNvbW1lbmRlZCIKKyAgXSwKKyAgInBhcnNlck9wdGlvbnMiOiB7CisgICAgImVjbWFWZXJzaW9uIjogMjAxNworICB9LAorICAicnVsZXMiOiB7CisgICAgIm5vLWNvbnNvbGUiOiAib2ZmIiwKKyAgICAibm8tdmFyIjogImVycm9yIiwKKyAgICAicHJlZmVyLWNvbnN0IjogImVycm9yIiwKKyAgICAibm8tY29uc3RhbnQtY29uZGl0aW9uIjogWworICAgICAgImVycm9yIiwKKyAgICAgIHsKKyAgICAgICAgImNoZWNrTG9vcHMiOiBmYWxzZQorICAgICAgfQorICAgIF0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvLmdpdGF0dHJpYnV0ZXMgYi8uZ2l0YXR0cmlidXRlcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzZhNDU4Ci0tLSAvZGV2L251bGwKKysrIGIvLmdpdGF0dHJpYnV0ZXMKQEAgLTAsMCArMSBAQAorKiB0ZXh0PWF1dG8KZGlmZiAtLWdpdCBhLy5naXRodWIvc3RhbGUueW1sIGIvLmdpdGh1Yi9zdGFsZS55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJkNGFmYgotLS0gL2Rldi9udWxsCisrKyBiLy5naXRodWIvc3RhbGUueW1sCkBAIC0wLDAgKzEsNTkgQEAKKyMgQ29uZmlndXJhdGlvbiBmb3IgcHJvYm90LXN0YWxlIC0gaHR0cHM6Ly9naXRodWIuY29tL3Byb2JvdC9zdGFsZQorCisjIE51bWJlciBvZiBkYXlzIG9mIGluYWN0aXZpdHkgYmVmb3JlIGFuIElzc3VlIG9yIFB1bGwgUmVxdWVzdCBiZWNvbWVzIHN0YWxlCitkYXlzVW50aWxTdGFsZTogNjAKKworIyBOdW1iZXIgb2YgZGF5cyBvZiBpbmFjdGl2aXR5IGJlZm9yZSBhbiBJc3N1ZSBvciBQdWxsIFJlcXVlc3Qgd2l0aCB0aGUgc3RhbGUgbGFiZWwgaXMgY2xvc2VkLgorIyBTZXQgdG8gZmFsc2UgdG8gZGlzYWJsZS4gSWYgZGlzYWJsZWQsIGlzc3VlcyBzdGlsbCBuZWVkIHRvIGJlIGNsb3NlZCBtYW51YWxseSwgYnV0IHdpbGwgcmVtYWluIG1hcmtlZCBhcyBzdGFsZS4KK2RheXNVbnRpbENsb3NlOiA3CisKKyMgSXNzdWVzIG9yIFB1bGwgUmVxdWVzdHMgd2l0aCB0aGVzZSBsYWJlbHMgd2lsbCBuZXZlciBiZSBjb25zaWRlcmVkIHN0YWxlLiBTZXQgdG8gYFtdYCB0byBkaXNhYmxlCitleGVtcHRMYWJlbHM6CisgIC0gRG8gTm90IE1lcmdlCisgIC0gYmxvY2tlZAorICAtIHBpbm5lZAorICAtIHNlY3VyaXR5CisgIC0gIltTdGF0dXNdIE1heWJlIExhdGVyIgorCisjIFNldCB0byB0cnVlIHRvIGlnbm9yZSBpc3N1ZXMgaW4gYSBwcm9qZWN0IChkZWZhdWx0cyB0byBmYWxzZSkKK2V4ZW1wdFByb2plY3RzOiBmYWxzZQorCisjIFNldCB0byB0cnVlIHRvIGlnbm9yZSBpc3N1ZXMgaW4gYSBtaWxlc3RvbmUgKGRlZmF1bHRzIHRvIGZhbHNlKQorZXhlbXB0TWlsZXN0b25lczogZmFsc2UKKworIyBMYWJlbCB0byB1c2Ugd2hlbiBtYXJraW5nIGFzIHN0YWxlCitzdGFsZUxhYmVsOiB3b250Zml4CisKKyMgQ29tbWVudCB0byBwb3N0IHdoZW4gbWFya2luZyBhcyBzdGFsZS4gU2V0IHRvIGBmYWxzZWAgdG8gZGlzYWJsZQorbWFya0NvbW1lbnQ6ID4KKyAgVGhpcyBpc3N1ZSBoYXMgYmVlbiBhdXRvbWF0aWNhbGx5IG1hcmtlZCBhcyBzdGFsZSBiZWNhdXNlIGl0IGhhcyBub3QgaGFkCisgIHJlY2VudCBhY3Rpdml0eS4gSXQgd2lsbCBiZSBjbG9zZWQgaW4gNyBkYXlzIGlmIG5vIGZ1cnRoZXIgYWN0aXZpdHkgb2NjdXJzLgorICBUaGFuayB5b3UgZm9yIHlvdXIgY29udHJpYnV0aW9ucy4KKworIyBDb21tZW50IHRvIHBvc3Qgd2hlbiByZW1vdmluZyB0aGUgc3RhbGUgbGFiZWwuCit1bm1hcmtDb21tZW50OiA+CisgIFRoaXMgaXNzdWUgaXMgbm8gbG9uZ2VyIHN0YWxlLgorICBUaGFuayB5b3UgZm9yIHlvdXIgY29udHJpYnV0aW9ucy4KKworIyBDb21tZW50IHRvIHBvc3Qgd2hlbiBjbG9zaW5nIGEgc3RhbGUgSXNzdWUgb3IgUHVsbCBSZXF1ZXN0LgorY2xvc2VDb21tZW50OiA+CisgIFRoaXMgaXNzdWUgaGFzIGJlZW4gYXV0b21hdGljYWxseSBjbG9zZWQgZHVlIHRvIGluYWN0aXZpdHkuCisgIFRoYW5rIHlvdSBmb3IgeW91ciBjb250cmlidXRpb25zLgorCisjIExpbWl0IHRoZSBudW1iZXIgb2YgYWN0aW9ucyBwZXIgaG91ciwgZnJvbSAxLTMwLiBEZWZhdWx0IGlzIDMwCitsaW1pdFBlclJ1bjogMzAKKworIyBMaW1pdCB0byBvbmx5IGBpc3N1ZXNgIG9yIGBwdWxsc2AKKyMgb25seTogaXNzdWVzCisKKyMgT3B0aW9uYWxseSwgc3BlY2lmeSBjb25maWd1cmF0aW9uIHNldHRpbmdzIHRoYXQgYXJlIHNwZWNpZmljIHRvIGp1c3QgJ2lzc3Vlcycgb3IgJ3B1bGxzJzoKKyMgcHVsbHM6CisjICAgZGF5c1VudGlsU3RhbGU6IDMwCisjICAgbWFya0NvbW1lbnQ6ID4KKyMgICAgIFRoaXMgcHVsbCByZXF1ZXN0IGhhcyBiZWVuIGF1dG9tYXRpY2FsbHkgbWFya2VkIGFzIHN0YWxlIGJlY2F1c2UgaXQgaGFzIG5vdCBoYWQKKyMgICAgIHJlY2VudCBhY3Rpdml0eS4gSXQgd2lsbCBiZSBjbG9zZWQgaWYgbm8gZnVydGhlciBhY3Rpdml0eSBvY2N1cnMuIFRoYW5rIHlvdQorIyAgICAgZm9yIHlvdXIgY29udHJpYnV0aW9ucy4KKworIyBpc3N1ZXM6CisjICAgZXhlbXB0TGFiZWxzOgorIyAgICAgLSBjb25maXJtZWQKZGlmZiAtLWdpdCBhLy5naXRpZ25vcmUgYi8uZ2l0aWdub3JlCmluZGV4IGQwZjkzZjcuLmIzYTU5MjAgMTAwNjQ0Ci0tLSBhLy5naXRpZ25vcmUKKysrIGIvLmdpdGlnbm9yZQpAQCAtMjEsNDYgKzIxLDc2IEBACiAqLnN3cAogKi5oaQogKn4KK3RhZ3MKIAogLipwcm9qZWN0CisuY2xhc3NwYXRoCisuZHViCisuc2V0dGluZ3MKKy5jaGVja3N0eWxlCiBqdW5pdCoucHJvcGVydGllcwogLmlkZWEKKyouaW1sCisqLmlwcgorKi5pd3MKIGdlbi0qCiBNYWtlZmlsZQogTWFrZWZpbGUuaW4KIGFjbG9jYWwubTQKIGFjaW5jbHVkZS5tNAorYXBhY2hlLXRocmlmdC10ZXN0LWxpYnJhcnkKIGF1dG9tNHRlLmNhY2hlCitjbWFrZS0qCitkdWIuc2VsZWN0aW9ucy5qc29uCitsaWJhcGFjaGUtdGhyaWZ0LmEKIG5vZGVfbW9kdWxlcwogY29tcGlsZQogdGVzdC1kcml2ZXIKK2VybF9jcmFzaC5kdW1wCitwcm9qZWN0LmxvY2suanNvbgogCiAuc29uYXIKIC5EU19TdG9yZQogLnN2bgogLnZhZ3JhbnQKKy52c2NvZGUKKy52cwogCi0vY29udHJpYi8udmFncmFudC8KIC9hY2xvY2FsL2xpYnRvb2wubTQKIC9hY2xvY2FsL2x0Ki5tNAogL2F1dG9zY2FuLmxvZwogL2F1dG9zY2FuLSoubG9nCisvY21ha2VfKgorL2NvbXBpbGVyL2NwcC9jb21waWxlci5WQy5kYgorL2NvbXBpbGVyL2NwcC9jb21waWxlci5WQy5WQy5vcGVuZGIKKy9jb21waWxlci9jcHAvdGVzdC9wbHVnaW4vdF9jcHBfZ2VuZXJhdG9yLmNjCisvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGx1Z2luL3BsdWdpbl9jb25zdGFudHMuY3BwCisvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGx1Z2luL3BsdWdpbl9jb25zdGFudHMuaAorL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW5fdHlwZXMuY3BwCisvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGx1Z2luL3BsdWdpbl90eXBlcy5oCisvY29tcGlsZXIvY3BwL3Rlc3QvKnRlc3QKKy9jb21waWxlci9jcHAvdGVzdC90aHJpZnQtZ2VuLSoKKy9jb21waWxlci9jcHAvc3JjL3RocmlmdC90aHJpZnQtYm9vdHN0cmFwCisvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGx1Z2luL2dlbi5zdGFtcAogL2NvbXBpbGVyL2NwcC9EZWJ1ZwotL2NvbXBpbGVyL2NwcC9saWJwYXJzZS5hCi0vY29tcGlsZXIvY3BwL3NyYy90aHJpZnRsLmNjCi0vY29tcGlsZXIvY3BwL3NyYy90aHJpZnR5LmNjCi0vY29tcGlsZXIvY3BwL3NyYy90aHJpZnR5LmhoCi0vY29tcGlsZXIvY3BwL3NyYy93aW5kb3dzL3ZlcnNpb24uaAorL2NvbXBpbGVyL2NwcC9SZWxlYXNlCisvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvbGlicGFyc2UuYQorL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3RocmlmdGwuY2MKKy9jb21waWxlci9jcHAvc3JjL3RocmlmdC90aHJpZnR5LmNjCisvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvdGhyaWZ0eS5oaAorL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvdmVyc2lvbi5oCiAvY29tcGlsZXIvY3BwL3RocmlmdAogL2NvbXBpbGVyL2NwcC90aHJpZnRsLmNjCiAvY29tcGlsZXIvY3BwL3RocmlmdHkuY2MKKy9jb21waWxlci9jcHAvbGV4Lnl5dGhyaWZ0bC5jYwogL2NvbXBpbGVyL2NwcC90aHJpZnR5LmgKIC9jb21waWxlci9jcHAvdGhyaWZ0eS5oaAotL2NvbXBpbGVyL2NwcC92ZXJzaW9uLmgKKy9jb21waWxlci9jcHAvc3JjL3RocmlmdC92ZXJzaW9uLmgKIC9jb25maWcuKgogL2NvbmZpZ3VyZQogL2NvbmZpZ3VyZS5saW5lbm8KIC9jb25maWd1cmUuc2NhbgorL2NvbnRyaWIvLnZhZ3JhbnQvCiAvY29udHJpYi9mYjMwMy9jb25maWcuY2FjaGUKIC9jb250cmliL2ZiMzAzL2NvbmZpZy5sb2cKIC9jb250cmliL2ZiMzAzL2NvbmZpZy5zdGF0dXMKQEAgLTc1LDI1ICsxMDUsNDIgQEAKIC9jb250cmliL2ZiMzAzL3B5L2ZiMzAzL3R0eXBlcy5weQogL2RlcGNvbXAKIC9pbnN0YWxsLXNoCisvbGliL2NsL2JhY2twb3J0LXVwZGF0ZS56aXAKKy9saWIvY2wvbGliCisvbGliL2NsL3J1bi10ZXN0cworL2xpYi9jbC9xdWlja2xpc3AubGlzcAorL2xpYi9jbC9leHRlcm5hbHMvCisvbGliL2NsL3J1bi10ZXN0cworL2xpYi9jbC9xdWlja2xpc3AvCiAvbGliL2NwcC9EZWJ1Zy8KIC9saWIvY3BwL0RlYnVnLW10LwogL2xpYi9jcHAvUmVsZWFzZS8KIC9saWIvY3BwL1JlbGVhc2UtbXQvCiAvbGliL2NwcC9zcmMvdGhyaWZ0L3F0L21vY19UUVRjcFNlcnZlci5jcHAKKy9saWIvY3BwL3NyYy90aHJpZnQvcXQvbW9jX19UUVRjcFNlcnZlci5jcHAKIC9saWIvY3BwL3NyYy90aHJpZnQvY29uZmlnLmgKIC9saWIvY3BwL3NyYy90aHJpZnQvc3RhbXAtaDIKIC9saWIvY3BwL3Rlc3QvQmVuY2htYXJrCiAvbGliL2NwcC90ZXN0L0FsbFByb3RvY29sc1Rlc3QKKy9saWIvY3BwL3Rlc3QvQW5ub3RhdGlvblRlc3QKIC9saWIvY3BwL3Rlc3QvRGVidWdQcm90b1Rlc3QKKy9saWIvY3BwL3Rlc3QvRGVuc2VQcm90b1Rlc3QKIC9saWIvY3BwL3Rlc3QvRW51bVRlc3QKIC9saWIvY3BwL3Rlc3QvSlNPTlByb3RvVGVzdAogL2xpYi9jcHAvdGVzdC9PcHRpb25hbFJlcXVpcmVkVGVzdAorL2xpYi9jcHAvdGVzdC9TZWN1cml0eVRlc3QKIC9saWIvY3BwL3Rlc3QvU3BlY2lhbGl6YXRpb25UZXN0Ci0vbGliL2NwcC90ZXN0L1JlZmxlY3Rpb25UZXN0CiAvbGliL2NwcC90ZXN0L1JlY3Vyc2l2ZVRlc3QKKy9saWIvY3BwL3Rlc3QvUmVmbGVjdGlvblRlc3QKKy9saWIvY3BwL3Rlc3QvUmVuZGVyZWREb3VibGVDb25zdGFudHNUZXN0CiAvbGliL2NwcC90ZXN0L1RGRFRyYW5zcG9ydFRlc3QKIC9saWIvY3BwL3Rlc3QvVEZpbGVUcmFuc3BvcnRUZXN0CisvbGliL2NwcC90ZXN0L1RJbnRlcnJ1cHRUZXN0CisvbGliL2NwcC90ZXN0L1ROb25ibG9ja2luZ1NlcnZlclRlc3QKKy9saWIvY3BwL3Rlc3QvVE5vbmJsb2NraW5nU1NMU2VydmVyVGVzdAogL2xpYi9jcHAvdGVzdC9UUGlwZWRUcmFuc3BvcnRUZXN0CisvbGliL2NwcC90ZXN0L1RTZXJ2ZXJJbnRlZ3JhdGlvblRlc3QKKy9saWIvY3BwL3Rlc3QvVFNvY2tldEludGVycnVwdFRlc3QKIC9saWIvY3BwL3Rlc3QvVHJhbnNwb3J0VGVzdAogL2xpYi9jcHAvdGVzdC9Vbml0VGVzdHMKIC9saWIvY3BwL3Rlc3QvWmxpYlRlc3QKQEAgLTExMSw2MiArMTU4LDc4IEBACiAvbGliL2NfZ2xpYi8qLmdjZGEKIC9saWIvY19nbGliLyouZ2NubwogL2xpYi9jX2dsaWIvKi5sb1QKKy9saWIvY19nbGliL3NyYy90aHJpZnQvY29uZmlnLmgKKy9saWIvY19nbGliL3NyYy90aHJpZnQvc3RhbXAtaDMKIC9saWIvY19nbGliL3Rlc3QvKi5nY25vCiAvbGliL2NfZ2xpYi90ZXN0L3Rlc3R3cmFwcGVyLnNoCiAvbGliL2NfZ2xpYi90ZXN0L3Rlc3R3cmFwcGVyLXRlc3QqCiAvbGliL2NfZ2xpYi90ZXN0L3Rlc3RhcHBsaWNhdGlvbmV4Y2VwdGlvbgogL2xpYi9jX2dsaWIvdGVzdC90ZXN0YmluYXJ5cHJvdG9jb2wKKy9saWIvY19nbGliL3Rlc3QvdGVzdGNvbXBhY3Rwcm90b2NvbAogL2xpYi9jX2dsaWIvdGVzdC90ZXN0YnVmZmVyZWR0cmFuc3BvcnQKKy9saWIvY19nbGliL3Rlc3QvdGVzdGNvbnRhaW5lcnRlc3QKIC9saWIvY19nbGliL3Rlc3QvdGVzdGRlYnVncHJvdG8KKy9saWIvY19nbGliL3Rlc3QvdGVzdGZkdHJhbnNwb3J0CiAvbGliL2NfZ2xpYi90ZXN0L3Rlc3RmcmFtZWR0cmFuc3BvcnQKIC9saWIvY19nbGliL3Rlc3QvdGVzdG1lbW9yeWJ1ZmZlcgogL2xpYi9jX2dsaWIvdGVzdC90ZXN0b3B0aW9uYWxyZXF1aXJlZAorL2xpYi9jX2dsaWIvdGVzdC90ZXN0dHJhbnNwb3J0c3Nsc29ja2V0CiAvbGliL2NfZ2xpYi90ZXN0L3Rlc3RzaW1wbGVzZXJ2ZXIKIC9saWIvY19nbGliL3Rlc3QvdGVzdHN0cnVjdAogL2xpYi9jX2dsaWIvdGVzdC90ZXN0dGhyaWZ0dGVzdAogL2xpYi9jX2dsaWIvdGVzdC90ZXN0dGhyaWZ0dGVzdGNsaWVudAogL2xpYi9jX2dsaWIvdGVzdC90ZXN0dHJhbnNwb3J0c29ja2V0CisvbGliL2NfZ2xpYi90ZXN0L3Rlc3RzZXJpYWxpemF0aW9uCiAvbGliL2NfZ2xpYi90aHJpZnRjLnBjCiAvbGliL2NfZ2xpYi90aHJpZnRfY19nbGliLnBjCiAvbGliL2NzaGFycC8qKi9iaW4vCiAvbGliL2NzaGFycC8qKi9vYmovCi0vbGliL2QvbGlidGhyaWZ0ZC5hCisvbGliL2NzaGFycC9zcmMvcGFja2FnZXMKKy9saWIvZC90ZXN0LyoucGVtCisvbGliL2QvbGlidGhyaWZ0ZCouYQorL2xpYi9kL3Rlc3QvYXN5bmNfdGVzdAorL2xpYi9kL3Rlc3QvY2xpZW50X3Bvb2xfdGVzdAogL2xpYi9kL3Rlc3Qvc2VyaWFsaXphdGlvbl9iZW5jaG1hcmsKKy9saWIvZC90ZXN0L3N0cmVzc190ZXN0X3NlcnZlcgorL2xpYi9kL3Rlc3QvdGhyaWZ0X3Rlc3RfY2xpZW50CisvbGliL2QvdGVzdC90aHJpZnRfdGVzdF9zZXJ2ZXIKIC9saWIvZC90ZXN0L3RyYW5zcG9ydF90ZXN0CiAvbGliL2QvdW5pdHRlc3QvCi0vbGliL2RlbHBoaS9zcmMvKi5kY3UKLS9saWIvZGVscGhpL3Rlc3QvKi5pZGVudGNhY2hlCi0vbGliL2RlbHBoaS90ZXN0LyoubG9jYWwKLS9saWIvZGVscGhpL3Rlc3QvKi5kY3UKLS9saWIvZGVscGhpL3Rlc3QvKi4yMDA3Ci0vbGliL2RlbHBoaS90ZXN0LyouZHByb2oKLS9saWIvZGVscGhpL3Rlc3QvKi5kcHJvagotL2xpYi9kZWxwaGkvdGVzdC9jb2RlZ2VuLyouYmF0Ci0vbGliL2RlbHBoaS90ZXN0L3NraXAvKi5sb2NhbAotL2xpYi9kZWxwaGkvdGVzdC9za2lwLyouaWRlbnRjYWNoZQotL2xpYi9kZWxwaGkvdGVzdC9za2lwLyouaWRlbnRjYWNoZQotL2xpYi9kZWxwaGkvdGVzdC9za2lwLyouZHByb2oKLS9saWIvZGVscGhpL3Rlc3Qvc2tpcC8qLmRwcm9qCi0vbGliL2RlbHBoaS90ZXN0L3NraXAvKi4yMDA3Ci0vbGliL2RlbHBoaS90ZXN0L3NlcmlhbGl6ZXIvKi5pZGVudGNhY2hlCi0vbGliL2RlbHBoaS90ZXN0L3NlcmlhbGl6ZXIvKi5kcHJvagotL2xpYi9kZWxwaGkvdGVzdC9zZXJpYWxpemVyLyoubG9jYWwKLS9saWIvZGVscGhpL3Rlc3Qvc2VyaWFsaXplci8qLjIwMDcKLS9saWIvZGVscGhpL3Rlc3QvbXVsdGlwbGV4ZWQvKi5kcHJvagotL2xpYi9kZWxwaGkvdGVzdC9tdWx0aXBsZXhlZC8qLjIwMDcKLS9saWIvZGVscGhpL3Rlc3QvbXVsdGlwbGV4ZWQvKi5sb2NhbAotL2xpYi9kZWxwaGkvdGVzdC9tdWx0aXBsZXhlZC8qLmlkZW50Y2FjaGUKLS9saWIvZGVscGhpL3Rlc3QvdHlwZXJlZ2lzdHJ5LyouMjAwNwotL2xpYi9kZWxwaGkvdGVzdC90eXBlcmVnaXN0cnkvKi5kcHJvagotL2xpYi9kZWxwaGkvdGVzdC90eXBlcmVnaXN0cnkvKi5pZGVudGNhY2hlCi0vbGliL2RlbHBoaS90ZXN0L3R5cGVyZWdpc3RyeS8qLmxvY2FsCi0vbGliL2VybC8uZ2VuZXJhdGVkCisvbGliL2RhcnQvY292ZXJhZ2UKKy9saWIvZGFydC8qKi8ucGFja2FnZXMKKy9saWIvZGFydC8qKi9wYWNrYWdlcworL2xpYi9kYXJ0LyoqLy5wdWIvCisvbGliL2RhcnQvKiovcHVic3BlYy5sb2NrCisvbGliL2RlbHBoaS90ZXN0L3NraXAvKi5yZXF1ZXN0CisvbGliL2RlbHBoaS90ZXN0L3NraXAvKi5yZXNwb25zZQorL2xpYi9kZWxwaGkvKiovKi5pZGVudGNhY2hlCisvbGliL2RlbHBoaS8qKi8qLmxvY2FsCisvbGliL2RlbHBoaS8qKi8qLmRjdQorL2xpYi9kZWxwaGkvKiovKi4yMDA3CisvbGliL2RlbHBoaS8qKi8qLmRwcm9qCisvbGliL2RlbHBoaS8qKi9jb2RlZ2VuLyouYmF0CiAvbGliL2VybC8uZXVuaXQKLS9saWIvZXJsL2ViaW4KKy9saWIvZXJsLy5nZW5lcmF0ZWQKKy9saWIvZXJsLy5yZWJhci8KIC9saWIvZXJsL2RlcHMvCisvbGliL2VybC9lYmluCisvbGliL2VybC9zcmMvdGhyaWZ0LmFwcC5zcmMKKy9saWIvZXJsL3Rlc3QvKi5iZWFtCisvbGliL2VybC90ZXN0LyouaHJsCisvbGliL2VybC90ZXN0L1RocmlmdF9vbWl0X3dpdGhvdXQudGhyaWZ0CisvbGliL2hheGUvdGVzdC9iaW4KKy9saWIvaGF4ZS90ZXN0L2RhdGEudG1wCiAvbGliL2hzL2Rpc3QKKy9saWIvamF2YS8uZ3JhZGxlCisvbGliL2phdmEvYW5kcm9pZC8uZ3JhZGxlCiAvbGliL2phdmEvYnVpbGQKKy9saWIvamF2YS90YXJnZXQKKy9saWIvanMvZGlzdAorL2xpYi9qcy9kb2MKIC9saWIvanMvdGVzdC9idWlsZAorL2xpYi9uZXRjb3JlLyoqL2JpbgorL2xpYi9uZXRjb3JlLyoqL29iagorL2xpYi9ub2RlanMvY292ZXJhZ2UKIC9saWIvbm9kZWpzL25vZGVfbW9kdWxlcy8KIC9saWIvcGVybC9NQU5JRkVTVAogL2xpYi9wZXJsL01ZTUVUQS5qc29uCkBAIC0xODksNiArMjUyLDcgQEAKIC9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL2J1aWxkLwogL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvY29uZmlnLioKIC9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL2NvbmZpZ3VyZQorL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvY29uZmlndXJlLmFjCiAvbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9jb25maWd1cmUuaW4KIC9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL2luc3RhbGwtc2gKIC9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL2xpYnRvb2wKQEAgLTIwNSw1MyArMjY5LDEyOCBAQAogL2xpYi9waHAvdGVzdC9wYWNrYWdlcy8KIC9saWIvcHkvZGlzdC8KIC9saWIvZXJsL2xvZ3MvCisvbGliL2dvL3BrZworL2xpYi9nby9zcmMKKy9saWIvZ28vdGVzdC9nb3BhdGgvCisvbGliL2dvL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKKy9saWIvcnMvdGFyZ2V0LworL2xpYi9ycy9DYXJnby5sb2NrCisvbGliL3JzL3Rlc3QvQ2FyZ28ubG9jaworL2xpYi9ycy90ZXN0L3RhcmdldC8KKy9saWIvcnMvdGVzdC9iaW4vCisvbGliL3JzL3Rlc3Qvc3JjL2Jhc2Vfb25lLnJzCisvbGliL3JzL3Rlc3Qvc3JjL2Jhc2VfdHdvLnJzCisvbGliL3JzL3Rlc3Qvc3JjL21pZGxheWVyLnJzCisvbGliL3JzL3Rlc3Qvc3JjL3JlY3Vyc2l2ZS5ycworL2xpYi9ycy90ZXN0L3NyYy91bHRpbWF0ZS5ycworL2xpYi9ycy8qLmltbAorL2xpYi9ycy8qKi8qLmltbAorL2xpYi9zd2lmdC8uYnVpbGQKIC9saWJ0b29sCiAvbHRtYWluLnNoCiAvbWlzc2luZworL25vZGVfbW9kdWxlcy8KKy92ZW5kb3IvCisvY29tcG9zZXIubG9jawogL3N0YW1wLWgxCi0vdGVzdC9zdGF0dXMuaHRtbAorL3Rlc3QvZmVhdHVyZXMvcmVzdWx0cy5qc29uCisvdGVzdC9yZXN1bHRzLmpzb24KIC90ZXN0L2NfZ2xpYi90ZXN0X2NsaWVudAogL3Rlc3QvY19nbGliL3Rlc3Rfc2VydmVyCisvdGVzdC9jbC9UZXN0U2VydmVyCisvdGVzdC9jbC9UZXN0Q2xpZW50CiAvdGVzdC9jcHAvU3RyZXNzVGVzdAogL3Rlc3QvY3BwL1N0cmVzc1Rlc3ROb25CbG9ja2luZwogL3Rlc3QvY3BwL1Rlc3RDbGllbnQKIC90ZXN0L2NwcC9UZXN0U2VydmVyCi0vbGliL2dvL3Rlc3QvZ29wYXRoLwotL2xpYi9nby90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CisvdGVzdC9jc2hhcnAvb2JqCisvdGVzdC9jc2hhcnAvYmluCisvdGVzdC9kYXJ0LyoqLy5wYWNrYWdlcworL3Rlc3QvZGFydC8qKi9wYWNrYWdlcworL3Rlc3QvZGFydC8qKi8ucHViLworL3Rlc3QvZGFydC8qKi9wdWJzcGVjLmxvY2sKIC90ZXN0L2xvZy8KIC90ZXN0L3Rlc3QubG9nCi0vdGVzdC9lcmwvLmV1bml0LwogL3Rlc3QvZXJsLy5nZW5lcmF0ZWQKKy90ZXN0L2VybC8ucmViYXIKKy90ZXN0L2VybC9lYmluCiAvdGVzdC9nby9iaW4vCiAvdGVzdC9nby9UaHJpZnRUZXN0LnRocmlmdAogL3Rlc3QvZ28vZ29wYXRoCiAvdGVzdC9nby9wa2cvCiAvdGVzdC9nby9zcmMvY29kZS5nb29nbGUuY29tLworL3Rlc3QvZ28vc3JjL2NvbW1vbi9tb2NrX2hhbmRsZXIuZ28KKy90ZXN0L2dvL3NyYy9naXRodWIuY29tL2dvbGFuZy8KKy90ZXN0L2dvL3NyYy9nb2xhbmcub3JnLwogL3Rlc3QvZ28vc3JjL2dlbi8KIC90ZXN0L2dvL3NyYy90aHJpZnQKKy90ZXN0L2hheGUvYmluCiAvdGVzdC9ocy9UZXN0Q2xpZW50CiAvdGVzdC9ocy9UZXN0U2VydmVyCisvdGVzdC9waHAvcGhwX2V4dF9kaXIvCiAvdGVzdC9weS50d2lzdGVkL190cmlhbF90ZW1wLwogL3Rlc3QvcmIvR2VtZmlsZS5sb2NrCisvdGVzdC9uZXRjb3JlLyoqL2JpbgorL3Rlc3QvbmV0Y29yZS8qKi9vYmoKKy90ZXN0L25ldGNvcmUvVGhyaWZ0CisvdGVzdC9waHAvcGhwX2V4dF9kaXIvCisvdGVzdC9ycy9DYXJnby5sb2NrCisvdGVzdC9ycy9zcmMvdGhyaWZ0X3Rlc3QucnMKKy90ZXN0L3JzL2Jpbi8KKy90ZXN0L3JzL3RhcmdldC8KKy90ZXN0L3JzLyouaW1sCisvdGVzdC9ycy8qKi8qLmltbAorL2xpYi9jbC9iYWNrcG9ydC11cGRhdGUuemlwCisvbGliL2NsL2xpYgorL3R1dG9yaWFsL2NsL3F1aWNrbGlzcC5saXNwCisvdHV0b3JpYWwvY2wvZXh0ZXJuYWxzLworL3R1dG9yaWFsL2NsL3F1aWNrbGlzcC8KKy90dXRvcmlhbC9jbC9UdXRvcmlhbENsaWVudAorL3R1dG9yaWFsL2NsL1R1dG9yaWFsU2VydmVyCisvdHV0b3JpYWwvY2wvYmFja3BvcnQtdXBkYXRlLnppcAorL3R1dG9yaWFsL2NsL2xpYi8KKy90dXRvcmlhbC9jbC9zaGFyZWQtaW1wbGVtZW50YXRpb24uZmFzbAorL3R1dG9yaWFsL2NsL3R1dG9yaWFsLWltcGxlbWVudGF0aW9uLmZhc2wKIC90dXRvcmlhbC9jcHAvVHV0b3JpYWxDbGllbnQKIC90dXRvcmlhbC9jcHAvVHV0b3JpYWxTZXJ2ZXIKIC90dXRvcmlhbC9jX2dsaWIvdHV0b3JpYWxfY2xpZW50CiAvdHV0b3JpYWwvY19nbGliL3R1dG9yaWFsX3NlcnZlcgotL3R1dG9yaWFsL2RlbHBoaS8qLmRzawotL3R1dG9yaWFsL2RlbHBoaS8qLmxvY2FsCi0vdHV0b3JpYWwvZGVscGhpL0RlbHBoaUNsaWVudC9kY3UKLS90dXRvcmlhbC9kZWxwaGkvRGVscGhpU2VydmVyL2RjdQotL3R1dG9yaWFsL2RlbHBoaS9EZWxwaGlDbGllbnQvKi5sb2NhbAotL3R1dG9yaWFsL2RlbHBoaS9EZWxwaGlDbGllbnQvKi5pZGVudGNhY2hlCi0vdHV0b3JpYWwvZGVscGhpL0RlbHBoaVNlcnZlci8qLmlkZW50Y2FjaGUKLS90dXRvcmlhbC9kZWxwaGkvRGVscGhpU2VydmVyLyoubG9jYWwKKy90dXRvcmlhbC9jc2hhcnAvQ3NoYXJwU2VydmVyL29iagorL3R1dG9yaWFsL2NzaGFycC9Dc2hhcnBTZXJ2ZXIvYmluCisvdHV0b3JpYWwvY3NoYXJwL0NzaGFycENsaWVudC9vYmoKKy90dXRvcmlhbC9jc2hhcnAvQ3NoYXJwQ2xpZW50L2JpbgorL3R1dG9yaWFsL2QvYXN5bmNfY2xpZW50CisvdHV0b3JpYWwvZC9jbGllbnQKKy90dXRvcmlhbC9kL3NlcnZlcgorL3R1dG9yaWFsL2RhcnQvKiovLnBhY2thZ2VzCisvdHV0b3JpYWwvZGFydC8qKi9wYWNrYWdlcworL3R1dG9yaWFsL2RhcnQvKiovLnB1Yi8KKy90dXRvcmlhbC9kYXJ0LyoqL3B1YnNwZWMubG9jaworL3R1dG9yaWFsL2RlbHBoaS8qKi8qLmRzaworL3R1dG9yaWFsL2RlbHBoaS8qKi8qLmxvY2FsCisvdHV0b3JpYWwvZGVscGhpLyoqLyoudHZzY29uZmlnCisvdHV0b3JpYWwvZGVscGhpLyoqL2RjdQorL3R1dG9yaWFsL2RlbHBoaS8qKi8qLmxvY2FsCisvdHV0b3JpYWwvZGVscGhpLyoqLyouaWRlbnRjYWNoZQorL3R1dG9yaWFsL2dvL2dvcGF0aAogL3R1dG9yaWFsL2dvL2dvLXR1dG9yaWFsCiAvdHV0b3JpYWwvZ28vY2FsY3VsYXRvci1yZW1vdGUKIC90dXRvcmlhbC9nby9zcmMvc2hhcmVkCiAvdHV0b3JpYWwvZ28vc3JjL3R1dG9yaWFsCiAvdHV0b3JpYWwvZ28vc3JjL2dpdC5hcGFjaGUub3JnCisvdHV0b3JpYWwvZ28vc3JjL2dvbGFuZy5vcmcKKy90dXRvcmlhbC9oYXhlL2JpbgogL3R1dG9yaWFsL2hzL2Rpc3QvCiAvdHV0b3JpYWwvamF2YS9idWlsZC8KIC90dXRvcmlhbC9qcy9idWlsZC8KKy90dXRvcmlhbC9uZXRjb3JlLyoqL2JpbgorL3R1dG9yaWFsL25ldGNvcmUvKiovb2JqCisvdHV0b3JpYWwvbmV0Y29yZS9UaHJpZnQKKy90dXRvcmlhbC9ycy8qLmltbAorL3R1dG9yaWFsL3JzL3NyYy9zaGFyZWQucnMKKy90dXRvcmlhbC9ycy9zcmMvdHV0b3JpYWwucnMKKy90dXRvcmlhbC9ycy9iaW4KKy90dXRvcmlhbC9ycy90YXJnZXQKKy90dXRvcmlhbC9ycy9DYXJnby5sb2NrCiAveWx3cmFwCiAKZGlmZiAtLWdpdCBhLy5ydXN0Zm10LnRvbWwgYi8ucnVzdGZtdC50b21sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjYTVhZmQKLS0tIC9kZXYvbnVsbAorKysgYi8ucnVzdGZtdC50b21sCkBAIC0wLDAgKzEsNjQgQEAKK21heF93aWR0aCA9IDEwMAoraGFyZF90YWJzID0gZmFsc2UKK3RhYl9zcGFjZXMgPSA0CituZXdsaW5lX3N0eWxlID0gIkF1dG8iCit1c2Vfc21hbGxfaGV1cmlzdGljcyA9ICJEZWZhdWx0IgoraW5kZW50X3N0eWxlID0gIkJsb2NrIgord3JhcF9jb21tZW50cyA9IGZhbHNlCitmb3JtYXRfZG9jX2NvbW1lbnRzID0gZmFsc2UKK2NvbW1lbnRfd2lkdGggPSA4MAorbm9ybWFsaXplX2NvbW1lbnRzID0gZmFsc2UKK25vcm1hbGl6ZV9kb2NfYXR0cmlidXRlcyA9IGZhbHNlCitsaWNlbnNlX3RlbXBsYXRlX3BhdGggPSAiIgorZm9ybWF0X3N0cmluZ3MgPSBmYWxzZQorZm9ybWF0X21hY3JvX21hdGNoZXJzID0gZmFsc2UKK2Zvcm1hdF9tYWNyb19ib2RpZXMgPSB0cnVlCitlbXB0eV9pdGVtX3NpbmdsZV9saW5lID0gdHJ1ZQorc3RydWN0X2xpdF9zaW5nbGVfbGluZSA9IHRydWUKK2ZuX3NpbmdsZV9saW5lID0gZmFsc2UKK3doZXJlX3NpbmdsZV9saW5lID0gZmFsc2UKK2ltcG9ydHNfaW5kZW50ID0gIkJsb2NrIgoraW1wb3J0c19sYXlvdXQgPSAiTWl4ZWQiCittZXJnZV9pbXBvcnRzID0gZmFsc2UKK3Jlb3JkZXJfaW1wb3J0cyA9IHRydWUKK3Jlb3JkZXJfbW9kdWxlcyA9IHRydWUKK3Jlb3JkZXJfaW1wbF9pdGVtcyA9IGZhbHNlCit0eXBlX3B1bmN0dWF0aW9uX2RlbnNpdHkgPSAiV2lkZSIKK3NwYWNlX2JlZm9yZV9jb2xvbiA9IGZhbHNlCitzcGFjZV9hZnRlcl9jb2xvbiA9IHRydWUKK3NwYWNlc19hcm91bmRfcmFuZ2VzID0gZmFsc2UKK2Jpbm9wX3NlcGFyYXRvciA9ICJGcm9udCIKK3JlbW92ZV9uZXN0ZWRfcGFyZW5zID0gdHJ1ZQorY29tYmluZV9jb250cm9sX2V4cHIgPSB0cnVlCitvdmVyZmxvd19kZWxpbWl0ZWRfZXhwciA9IGZhbHNlCitzdHJ1Y3RfZmllbGRfYWxpZ25fdGhyZXNob2xkID0gMAorZW51bV9kaXNjcmltX2FsaWduX3RocmVzaG9sZCA9IDAKK21hdGNoX2FybV9ibG9ja3MgPSB0cnVlCitmb3JjZV9tdWx0aWxpbmVfYmxvY2tzID0gZmFsc2UKK2ZuX2FyZ3NfZGVuc2l0eSA9ICJUYWxsIgorYnJhY2Vfc3R5bGUgPSAiU2FtZUxpbmVXaGVyZSIKK2NvbnRyb2xfYnJhY2Vfc3R5bGUgPSAiQWx3YXlzU2FtZUxpbmUiCit0cmFpbGluZ19zZW1pY29sb24gPSB0cnVlCit0cmFpbGluZ19jb21tYSA9ICJWZXJ0aWNhbCIKK21hdGNoX2Jsb2NrX3RyYWlsaW5nX2NvbW1hID0gZmFsc2UKK2JsYW5rX2xpbmVzX3VwcGVyX2JvdW5kID0gMQorYmxhbmtfbGluZXNfbG93ZXJfYm91bmQgPSAwCitlZGl0aW9uID0gIjIwMTUiCittZXJnZV9kZXJpdmVzID0gdHJ1ZQordXNlX3RyeV9zaG9ydGhhbmQgPSBmYWxzZQordXNlX2ZpZWxkX2luaXRfc2hvcnRoYW5kID0gZmFsc2UKK2ZvcmNlX2V4cGxpY2l0X2FiaSA9IHRydWUKK2NvbmRlbnNlX3dpbGRjYXJkX3N1ZmZpeGVzID0gZmFsc2UKK2NvbG9yID0gIkF1dG8iCityZXF1aXJlZF92ZXJzaW9uID0gIjEuMC4wIgordW5zdGFibGVfZmVhdHVyZXMgPSBmYWxzZQorZGlzYWJsZV9hbGxfZm9ybWF0dGluZyA9IGZhbHNlCitza2lwX2NoaWxkcmVuID0gZmFsc2UKK2hpZGVfcGFyc2VfZXJyb3JzID0gZmFsc2UKK2Vycm9yX29uX2xpbmVfb3ZlcmZsb3cgPSBmYWxzZQorZXJyb3Jfb25fdW5mb3JtYXR0ZWQgPSBmYWxzZQorcmVwb3J0X3RvZG8gPSAiTmV2ZXIiCityZXBvcnRfZml4bWUgPSAiTmV2ZXIiCitpZ25vcmUgPSBbXQorZW1pdF9tb2RlID0gIkZpbGVzIgorbWFrZV9iYWNrdXAgPSBmYWxzZQpkaWZmIC0tZ2l0IGEvLnRyYXZpcy55bWwgYi8udHJhdmlzLnltbAppbmRleCA2M2FlODAxLi42MzdiNWQ1IDEwMDY0NAotLS0gYS8udHJhdmlzLnltbAorKysgYi8udHJhdmlzLnltbApAQCAtMTksNjAgKzE5LDE1NSBAQAogCiAjIGJ1aWxkIEFwYWNoZSBUaHJpZnQgb24gVHJhdmlzIENJIC0gaHR0cHM6Ly90cmF2aXMtY2kub3JnLwogCisjCisjIERvY2tlciBJbnRlZ3JhdGlvbgorIyBzZWU6IGJ1aWxkL2RvY2tlci9SRUFETUUubWQKKyMgCisKK3N1ZG86IHJlcXVpcmVkCitkaXN0OiB0cnVzdHkKIGxhbmd1YWdlOiBjcHAKIAotY2FjaGU6Ci0gLSBhcHQKLSAtIG5wbQotIC0gbWF2ZW4KLQotCi0KLSMjIEJ1aWxkIG1hdHJpeDoKLWVudjoKLSAjIFNtYWxsIFNldAotIC0gQ09ORklHPSItLXdpdGhvdXQtZXJsYW5nIC0td2l0aG91dC1oYXNrZWxsIC0td2l0aG91dC1weXRob24gLS13aXRob3V0LWdvIC0td2l0aG91dC1sdWEgLS13aXRob3V0LWQgLS13aXRob3V0LXJ1YnkgLS13aXRob3V0LW5vZGVqcyAtLXdpdGhvdXQtamF2YSIKLQotICMgQyAmIEMrKyAmIEhhc2tlbGwgKGZvciBzb21lIHJlYXNvbiBxdDQgaXMgcmVxdWlyZWQpCi0gLSBDT05GSUc9Ii0td2l0aG91dC1jc2hhcnAgLS13aXRob3V0LWphdmEgLS13aXRob3V0LWVybGFuZyAtLXdpdGhvdXQtbm9kZWpzIC0td2l0aG91dC1sdWEgLS13aXRob3V0LXB5dGhvbiAtLXdpdGhvdXQtcGVybCAtLXdpdGhvdXQtcGhwIC0td2l0aG91dC1waHAtZXh0ZW5zaW9uIC0td2l0aG91dC1ydWJ5IC0td2l0aG91dC1nbyAtLXdpdGhvdXQtZCIgR0hDVkVSPTcuOC4zCi0KLSAjIEJ1aWxkIEFsbAotICMgVE9ETzogZml4IHRoZXNlIGxhbmd1YWdlcwotIC0gQ09ORklHPSItLXdpdGhvdXQtZXJsYW5nIC0td2l0aG91dC1weXRob24gLS13aXRob3V0LWdvIC0td2l0aG91dC1sdWEiIEdIQ1ZFUj03LjguMwotCi0KLW1hdHJpeDoKLSAgaW5jbHVkZToKLSAgICAtIGNvbXBpbGVyOiBnY2MKLSAgICAgIGVudjogQ09ORklHPSItLWRpc2FibGUtbGlicyIKLSAgICAgIGJlZm9yZV9pbnN0YWxsOgotICAgICAgIC0gc2ggY29udHJpYi9pbnN0YWxsQ1hYRGVwZW5kZW5jaWVzLnNoOwotICAgICAgc2NyaXB0OgotICAgICAgIC0gbWFrZSBjaGVjayAtajQ7Ci0gICAgICAgLSBta2RpciBidWlsZF9uYXRpdmUgJiYgY2QgYnVpbGRfbmF0aXZlICYmIGNtYWtlIC4uL2NvbXBpbGVyL2NwcC8gJiYgbWFrZSAtajQgJiYgY2QgLi47Ci0gICAgICAgLSBta2RpciBidWlsZF9taW5ndzMyICYmIGNkIGJ1aWxkX21pbmd3MzIgJiYgY21ha2UgLURDTUFLRV9UT09MQ0hBSU5fRklMRT0uLi9jb250cmliL21pbmd3MzItdG9vbGNoYWluLmNtYWtlIC4uL2NvbXBpbGVyL2NwcC8gJiYgbWFrZSAtajQgJiYgY2QgLi47Ci0KLSAgICAtIGNvbXBpbGVyOiBjbGFuZwotICAgICAgZW52OiBDT05GSUc9Ii0tZGlzYWJsZS1saWJzIgotICAgICAgYmVmb3JlX2luc3RhbGw6Ci0gICAgICAgLSBzaCBjb250cmliL2luc3RhbGxDWFhEZXBlbmRlbmNpZXMuc2g7Ci0gICAgICBzY3JpcHQ6Ci0gICAgICAgLSBtYWtlIGNoZWNrIC1qNDsKLQotCi0KLSMjIERlZmF1bHQgYnVpbGQgc2VxdWVuY2U6Ci1iZWZvcmVfaW5zdGFsbDoKLSAtIHNoIGNvbnRyaWIvaW5zdGFsbERlcGVuZGVuY2llcy5zaCAxPiAvZGV2L251bGw7Ci0gLSBleHBvcnQgUEFUSD0vb3B0L2doYy8kR0hDVkVSL2Jpbjovb3B0L2NhYmFsLzEuMjAvYmluOiRQQVRICi0gLSBjYWJhbCB1cGRhdGUKK3NlcnZpY2VzOgorICAtIGRvY2tlcgogCiBpbnN0YWxsOgotIC0gc2ggYm9vdHN0cmFwLnNoOwotIC0gc2ggY29uZmlndXJlICRDT05GSUc7CisgIC0gaWYgW1sgYHVuYW1lYCA9PSAiTGludXgiIF1dOyB0aGVuIGJ1aWxkL2RvY2tlci9yZWZyZXNoLnNoOyBmaQogCi1zY3JpcHQ6Ci0gLSBtYWtlIC1qNCAmJiBtYWtlIGRpc3Q7Ci0gLSBtYWtlIGNyb3NzIC1qNDsKLSMgVE9ETzogYWRkIHRoZXNlIHN0ZXBzCi0jICAtIHNoIGJvb3RzdHJhcC5zaCA7IGRwa2ctYnVpbGRwYWNrYWdlIC10Yworc3RhZ2VzOgorICAtIGRvY2tlciAgICAjIGRvY2tlciBpbWFnZXMKKyAgLSB0aHJpZnQgICAgIyB0aHJpZnQgYnVpbGQgam9icworCitlbnY6CisgIGdsb2JhbDoKKyAgICAtIFNDUklQVD0iY21ha2Uuc2giCisgICAgLSBCVUlMRF9BUkc9IiIKKyAgICAtIEJVSUxEX0VOVj0iLWUgQ0M9Z2NjIC1lIENYWD1nKysgLWUgVEhSSUZUX0NST1NTVEVTVF9DT05DVVJSRU5DWT00IgorICAgIC0gRElTVFJPPXVidW50dS1iaW9uaWMKKyAgICAtIEJVSUxEX0xJQlM9IkNQUCBDX0dMSUIgSEFTS0VMTCBKQVZBIFBZVEhPTiBURVNUSU5HIFRVVE9SSUFMUyIgICMgb25seSBtZWFuaW5nZnVsIGZvciBDTWFrZSBidWlsZHMKKyAgICAtIFRSQVZJU19CVUlMRF9TVEFHRT10ZXN0CisgICAgIyBET0NLRVJfUkVQTyAodGhpcyB3b3JrcyBmb3IgYWxsIGJ1aWxkcyBhcyBhIHNvdXJjZSBmb3IgZG9ja2VyIGltYWdlcyAtIHlvdSBjYW4gb3ZlcnJpZGUgZm9yIGZvcmsgYnVpbGRzIGluIHlvdXIgVHJhdmlzIHNldHRpbmdzKQorICAgIC0gRE9DS0VSX1JFUE89InRocmlmdC90aHJpZnQtYnVpbGQiCisgICAgIyBET0NLRVJfVVNFUiAocHJvdmlkZSBpbiB5b3VyIFRyYXZpcyBzZXR0aW5ncyBpZiB5b3Ugd2FudCB0byBidWlsZCBhbmQgdXBkYXRlIGRvY2tlciBpbWFnZXMgb25jZSwgaW5zdGVhZCBvZiBvbiBldmVyeSBqb2IpCisgICAgIyBET0NLRVJfUEFTUyAoc2FtZSkKKworam9iczoKKyAgaW5jbHVkZToKKyAgICAjID09PT09PT09PT09PT09PT09PT09PT09PT0gc3RhZ2U6IGRvY2tlciA9PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgLSBzdGFnZTogZG9ja2VyCisgICAgICBzY3JpcHQ6IHRydWUKKyAgICAgIGVudjoKKyAgICAgICAgLSBKT0I9IkRvY2tlciBCdWlsZCB1YnVudHUteGVuaWFsIDE2LjA0IExUUyIKKyAgICAgICAgLSBESVNUUk89dWJ1bnR1LXhlbmlhbAorICAgICAgICAtIFRSQVZJU19CVUlMRF9TVEFHRT1kb2NrZXIKKyAgICAtIHNjcmlwdDogdHJ1ZQorICAgICAgZW52OgorICAgICAgICAtIEpPQj0iRG9ja2VyIEJ1aWxkIHVidW50dS1iaW9uaWMgMTguMDQgTFRTIgorICAgICAgICAtIERJU1RSTz11YnVudHUtYmlvbmljCisgICAgICAgIC0gVFJBVklTX0JVSUxEX1NUQUdFPWRvY2tlcgorCisgICAgIyA9PT09PT09PT09PT09PT09PT09PT09PT09IHN0YWdlOiB0aHJpZnQgPT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcGhhc2U6IGNyb3NzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICMgYXBhY2hlL3RocmlmdCBvZmZpY2lhbCBQUiBidWlsZHMgY2FuIGV4Y2VlZCA1MCBtaW51dGVzIHBlciBqb2Igc28gY29tYmluZSBhbGwgY3Jvc3MgdGVzdHMKKyAgICAtIHN0YWdlOiB0aHJpZnQKKyAgICAgIHNjcmlwdDogYnVpbGQvZG9ja2VyL3J1bi5zaAorICAgICAgaWY6IHJlcG8gPSBhcGFjaGUvdGhyaWZ0CisgICAgICBlbnY6CisgICAgICAgIC0gSk9CPSJDcm9zcyBMYW5ndWFnZSBUZXN0cyIKKyAgICAgICAgLSBTQ1JJUFQ9ImNyb3NzLXRlc3Quc2giCisKKyAgICAjIGZvcmsgYmFzZWQgUFIgYnVpbGRzIGNhbm5vdCBleGNlZWQgNTAgbWludXRlcyBwZXIgam9iCisgICAgLSBzdGFnZTogdGhyaWZ0CisgICAgICBzY3JpcHQ6IGJ1aWxkL2RvY2tlci9ydW4uc2gKKyAgICAgIGlmOiByZXBvICE9IGFwYWNoZS90aHJpZnQKKyAgICAgIGVudjoKKyAgICAgICAgLSBKT0I9IkNyb3NzIExhbmd1YWdlIFRlc3RzIChCaW5hcnkgUHJvdG9jb2wpIgorICAgICAgICAtIFNDUklQVD0iY3Jvc3MtdGVzdC5zaCIKKyAgICAgICAgLSBCVUlMRF9BUkc9Ii0nKGJpbmFyeSknIgorCisgICAgLSBzdGFnZTogdGhyaWZ0CisgICAgICBzY3JpcHQ6IGJ1aWxkL2RvY2tlci9ydW4uc2gKKyAgICAgIGlmOiByZXBvICE9IGFwYWNoZS90aHJpZnQKKyAgICAgIGVudjoKKyAgICAgICAgLSBKT0I9IkNyb3NzIExhbmd1YWdlIFRlc3RzIChIZWFkZXIsIEpTT04gUHJvdG9jb2xzKSIKKyAgICAgICAgLSBTQ1JJUFQ9ImNyb3NzLXRlc3Quc2giCisgICAgICAgIC0gQlVJTERfQVJHPSItJyhoZWFkZXJ8anNvbiknIgorCisgICAgLSBzdGFnZTogdGhyaWZ0CisgICAgICBzY3JpcHQ6IGJ1aWxkL2RvY2tlci9ydW4uc2gKKyAgICAgIGlmOiByZXBvICE9IGFwYWNoZS90aHJpZnQKKyAgICAgIGVudjoKKyAgICAgICAgLSBKT0I9IkNyb3NzIExhbmd1YWdlIFRlc3RzIChDb21wYWN0IGFuZCBNdWx0aXBsZXhlZCBQcm90b2NvbHMpIgorICAgICAgICAtIFNDUklQVD0iY3Jvc3MtdGVzdC5zaCIKKyAgICAgICAgLSBCVUlMRF9BUkc9Ii0nKGNvbXBhY3R8bXVsdGlwbGV4ZWQpJyIKKworICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBwaGFzZTogc2NhIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyBRQSBqb2JzIGZvciBjb2RlIGFuYWx5dGljcyBhbmQgbWV0cmljcworICAgIC0gc3RhZ2U6IHRocmlmdAorICAgICAgc2NyaXB0OiBidWlsZC9kb2NrZXIvcnVuLnNoCisgICAgICBlbnY6CisgICAgICAgIC0gSk9CPSJTdGF0aWMgQ29kZSBBbmFseXNpcyIKKyAgICAgICAgLSBTQ1JJUFQ9InNjYS5zaCIKKworICAgICMgQyBhbmQgQysrIHVuZGVmaW5lZCBiZWhhdmlvci4KKyAgICAjIEEgYmluYXJ5IGNyYXNoZXMgaWYgdW5kZWZpbmVkIGJlaGF2aW9yIG9jY3VycyBhbmQgcHJvZHVjZXMgYSBzdGFjayB0cmFjZS4KKyAgICAjIHB5dGhvbiBpcyBkaXNhYmxlZCwgc2VlOiBUSFJJRlQtNDM2MAorICAgIC0gc2NyaXB0OiBidWlsZC9kb2NrZXIvcnVuLnNoCisgICAgICBlbnY6CisgICAgICAgIC0gSk9CPSJVQlNhbiIKKyAgICAgICAgLSBTQ1JJUFQ9InVic2FuLnNoIgorICAgICAgICAtIEJVSUxEX0FSRz0iLS13aXRob3V0LXB5dGhvbiAtLXdpdGhvdXQtcHkzIgorCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHBoYXNlOiBhdXRvdG9vbHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjIFRPRE86IFJlbW92ZSB0aGVtIG9uY2UgbWlncmF0ZWQgdG8gQ01ha2UKKyAgICAtIHNjcmlwdDogYnVpbGQvZG9ja2VyL3J1bi5zaAorICAgICAgZW52OgorICAgICAgICAtIEpPQj0iQXV0b3Rvb2xzIChVYnVudHUgQmlvbmljKSIKKyAgICAgICAgLSBTQ1JJUFQ9ImF1dG90b29scy5zaCIKKworICAgIC0gc2NyaXB0OiBidWlsZC9kb2NrZXIvcnVuLnNoCisgICAgICBlbnY6CisgICAgICAgIC0gSk9CPSJBdXRvdG9vbHMgKFVidW50dSBYZW5pYWwpIgorICAgICAgICAtIERJU1RSTz11YnVudHUteGVuaWFsCisgICAgICAgIC0gU0NSSVBUPSJhdXRvdG9vbHMuc2giCisKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcGhhc2U6IGNtYWtlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC0gc2NyaXB0OiBidWlsZC9kb2NrZXIvcnVuLnNoCisgICAgICBlbnY6CisgICAgICAgIC0gSk9CPSJDTWFrZSIKKworICAgICMgQysrIHNwZWNpZmljIG9wdGlvbnM6IGNvbXBpbGVyIHBsdWctaW4sIHRocmVhZGluZyBtb2RlbAorICAgIC0gc2NyaXB0OiBidWlsZC9kb2NrZXIvcnVuLnNoCisgICAgICBlbnY6CisgICAgICAgIC0gSk9CPSJDKysgKFN0ZCBUaHJlYWQpIGFuZCBQbHVnaW4iCisgICAgICAgIC0gU0NSSVBUPSJjbWFrZS5zaCIKKyAgICAgICAgLSBCVUlMRF9MSUJTPSJDUFAgVEVTVElORyBUVVRPUklBTFMiCisgICAgICAgIC0gQlVJTERfQVJHPSItRFdJVEhfUExVR0lOPU9OIC1EV0lUSF9TVERUSFJFQURTPU9OIC1EV0lUSF9QWVRIT049T0ZGIC1EV0lUSF9DX0dMSUI9T0ZGIC1EV0lUSF9KQVZBPU9GRiAtRFdJVEhfSEFTS0VMTD1PRkYiCisgICAgICAgIC0gQlVJTERfRU5WPSItZSBDQz1jbGFuZyAtZSBDWFg9Y2xhbmcrKyIKKworICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBwaGFzZTogZGlzdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLSBzY3JpcHQ6IGJ1aWxkL2RvY2tlci9ydW4uc2gKKyAgICAgIGVudjoKKyAgICAgICAgLSBKT0I9Im1ha2UgZGlzdCIKKyAgICAgICAgLSBTQ1JJUFQ9Im1ha2UtZGlzdC5zaCIKKworICAgIC0gc2NyaXB0OiBidWlsZC9kb2NrZXIvcnVuLnNoCisgICAgICBlbnY6CisgICAgICAgIC0gSk9CPSJEZWJpYW4gUGFja2FnZXMiCisgICAgICAgIC0gU0NSSVBUPSJkcGtnLnNoIgorCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHBoYXNlOiBjb3Zlcml0eSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjIFdlIGJ1aWxkIHRoZSBjb3Zlcml0eSBzY2FuIGJ1aWxkIG9uY2UgbW9udGhseSB1c2luZyBhIHRyYXZpcyBjcm9uIGpvYgorICAgIC0gaWY6IChlbnYoQ09WRVJJVFlfU0NBTl9OT1RJRklDQVRJT05fRU1BSUwpIElTIHByZXNlbnQpIEFORCAoYnJhbmNoIElOIChtYXN0ZXIpKSBBTkQgKHR5cGUgSU4gKGNyb24pKQorICAgICAgc2NyaXB0OiBidWlsZC9kb2NrZXIvcnVuLnNoCisgICAgICBlbnY6CisgICAgICAgIC0gSk9CPSJDb3Zlcml0eSBTY2FuIgorICAgICAgICAtIFNDUklQVD0iY292c2Nhbi5zaCIKKyAgICAgCisKKyAgIyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcGhhc2U6IG9zeCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAjIGRpc2FibGVkIGR1ZSB0byB0aGUgdGltZSBkZWxheXMgaXQgaW1wb3NlcyBvbiBidWlsZCBqb2JzCisgICMgLSBvczogb3N4CisgICMgICBvc3hfaW1hZ2U6IHhjb2RlOQorICAjICAgc2NyaXB0OiBidWlsZC9kb2NrZXIvc2NyaXB0cy9hdXRvdG9vbHMuc2gKKwpkaWZmIC0tZ2l0IGEvQXBhY2hlVGhyaWZ0Lm51c3BlYyBiL0FwYWNoZVRocmlmdC5udXNwZWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRlZDJjNgotLS0gL2Rldi9udWxsCisrKyBiL0FwYWNoZVRocmlmdC5udXNwZWMKQEAgLTAsMCArMSw1MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+CisKKzwhLS0KKyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisgIEluc3RydWN0aW9ucyBmb3IgYnVpbGRpbmcgYSBudWdldCBwYWNrYWdlOgorCisgIDEuIE9wZW4gVGhyaWZ0LnNsbiBpbiBsaWJcY3NoYXJwXHNyYyBhbmQgYnVpbGQgdGhlIHJlbGVhc2UgdmVyc2lvbgorICAgICBvZiB0aGUgIlRocmlmdCIgYW5kICJUaHJpZnQuNDUiIHByb2plY3RzLgorICAyLiBPcGVuIFRocmlmdC5zbG4gaW4gbGliXG5ldGNvcmUgYW5kIGJ1aWxkIHRoZSByZWxlYXNlIHZlcnNpb24gb2YKKyAgICAgdGhlICJUaHJpZnQiIHByb2plY3QuCisgIDMuIG51Z2V0IHNldEFwaUtleSA8eW91ci1hcGkta2V5PgorICAzLiBudWdldCBwYWNrIEFwYWNoZVRocmlmdC5udXNwZWMgLVN5bWJvbHMgLVN5bWJvbFBhY2thZ2VGb3JtYXQgc251cGtnCisgIDQuIG51Z2V0IHB1c2ggQXBhY2hlVGhyaWZ0LjEuMC4wLm51cGtnIC1Tb3VyY2UgaHR0cHM6Ly9hcGkubnVnZXQub3JnL3YzL2luZGV4Lmpzb24KKyAgLS0+CisKKzxwYWNrYWdlIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL3BhY2thZ2luZy8yMDEzLzA1L251c3BlYy54c2QiPgorICA8bWV0YWRhdGE+CisgICAgPGlkPkFwYWNoZVRocmlmdDwvaWQ+CisgICAgPHZlcnNpb24+MS4wLjA8L3ZlcnNpb24+CisgICAgPHRpdGxlPkFwYWNoZSBUaHJpZnQgMS4wLjA8L3RpdGxlPgorICAgIDxhdXRob3JzPkFwYWNoZSBUaHJpZnQgRGV2ZWxvcGVyczwvYXV0aG9ycz4KKyAgICA8b3duZXJzPkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uPC9vd25lcnM+CisgICAgPGxpY2Vuc2UgdHlwZT0iZXhwcmVzc2lvbiI+QXBhY2hlLTIuMDwvbGljZW5zZT4KKyAgICA8cHJvamVjdFVybD5odHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcvPC9wcm9qZWN0VXJsPgorICAgIDxyZXF1aXJlTGljZW5zZUFjY2VwdGFuY2U+dHJ1ZTwvcmVxdWlyZUxpY2Vuc2VBY2NlcHRhbmNlPgorICAgIDxzdW1tYXJ5PkFwYWNoZSBUaHJpZnQgLk5FVCBMaWJyYXJ5PC9zdW1tYXJ5PgorICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgIENvbnRhaW5zIHJ1bnRpbWUgbGlicmFyaWVzIGZyb20gbGliL2NzaGFycCBmb3IgbmV0MzUgYW5kIG5ldDQ1IGZyYW1ld29ya3MsIAorICAgICAgYW5kIGZyb20gbGliL25ldGNvcmUgZm9yIG5ldHN0YW5kYXJkMi4wIGZyYW1ld29yayBkZXZlbG9wbWVudC4KKyAgICA8L2Rlc2NyaXB0aW9uPgorICAgIDxyZXBvc2l0b3J5IHR5cGU9IkdpdEh1YiIgdXJsPSJodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdCIgYnJhbmNoPSJyZWxlYXNlLzEuMC4wIiAvPgorICAgIDx0YWdzPkFwYWNoZSBUaHJpZnQgUlBDPC90YWdzPgorICA8L21ldGFkYXRhPgorICA8ZmlsZXM+CisgICAgPGZpbGUgc3JjPSJsaWJcY3NoYXJwXHNyY1xiaW5cUmVsZWFzZVxUaHJpZnQuKiIgdGFyZ2V0PSJsaWJcbmV0MzUiIC8+CisgICAgPGZpbGUgc3JjPSJsaWJcY3NoYXJwXHNyY1xiaW5cUmVsZWFzZVxUaHJpZnQ0NS4qIiB0YXJnZXQ9ImxpYlxuZXQ0NSIgLz4KKyAgICA8ZmlsZSBzcmM9ImxpYlxuZXRjb3JlXFRocmlmdFxiaW5cUmVsZWFzZVxuZXRzdGFuZGFyZDIuMFwqLioiIHRhcmdldD0ibGliXG5ldHN0YW5kYXJkMi4wIiAvPgorICA8L2ZpbGVzPgorPC9wYWNrYWdlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL0NIQU5HRVMgYi9DSEFOR0VTCmluZGV4IDAzNzFkMWYuLjI0NGYwZGEgMTAwNjQ0Ci0tLSBhL0NIQU5HRVMKKysrIGIvQ0hBTkdFUwpAQCAtMSw1NzggKzEsMTk4OCBAQAogQXBhY2hlIFRocmlmdCBDaGFuZ2Vsb2cKIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1RocmlmdCAwLjEyLjAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIyBOZXcgTGFuZ3VhZ2VzCisgICAgKiBDb21tb24gTElTUCAoY2wpCisgICAgKiBTd2lmdAorICAgICogVHlwZXNjcmlwdCAobm9kZXRzKQorCisjIyBEZXByZWNhdGVkIExhbmd1YWdlcworICAgICogQ29jb2EKKworIyMgQnJlYWtpbmcgQ2hhbmdlcyAoc2luY2UgMC4xMS4wKQorICAgICogW1RIUklGVC00NTI5XSAtIFJ1c3QgZW51bSB2YXJpYW50cyBhcmUgbm93IGNhbWVsLWNhc2VkIGluc3RlYWQgb2YgdXBwZXJjYXNlZCB0byBjb25mb3JtIHRvIFJ1c3QgbmFtaW5nIGNvbnZlbnRpb25zCisgICAgKiBbVEhSSUZULTQ0NDhdIC0gU3VwcG9ydCBmb3IgZ29sYW5nIDEuNiBhbmQgZWFybGllciBoYXMgYmVlbiBkcm9wcGVkLgorICAgICogW1RIUklGVC00NDc0XSAtIFBIUCBub3cgdXNlcyB0aGUgUFNSLTQgbG9hZGVyIGJ5IGRlZmF1bHQgaW5zdGVhZCBvZiBjbGFzcyBtYXBzLgorICAgICogW1RIUklGVC00NTMyXSAtIG1ldGhvZCBzaWduYXR1cmVzIGNoYW5nZWQgaW4gdGhlIGNvbXBpbGVyJ3MgdF9vb3BfZ2VuZXJhdG9yLgorICAgICogW1RIUklGVC00NjQ4XSAtIFRoZSBDIChHTGliKSBjb21waWxlcidzIGhhbmRsaW5nIG9mIG5hbWVzcGFjZXMgaGFzIGJlZW4gaW1wcm92ZWQuCisKKyMjIEtub3duIElzc3VlcyAoQmxvY2tlciBvciBDcml0aWNhbCkKKyAgICAqIFtUSFJJRlQtNDAzN10gLSBidWlsZDogdXNlIGEgc2luZ2xlIGJ1aWxkIHN5c3RlbSBmb3IgdGhyaWZ0CisgICAgKiBbVEhSSUZULTQxMTldIC0gYnVpbGQ6IGJvb3RzdHJhcC5zaCBpcyBtaXNzaW5nIGZyb20gc291cmNlIHRhcmJhbGwKKyAgICAqIFtUSFJJRlQtMzI4OV0gLSBjc2hhcnA6IHNvY2tldCBleGhhdXN0aW9uIGluIGNzaGFycCBpbXBsZW1lbnRhdGlvbgorICAgICogW1RIUklGVC0zMDI5XSAtIGNvY29hOiBHZXR0ZXJzIGZvciBmaWVsZHMgZGVmaW5lZCB3aXRoIHVwcGVyY2FzZSBuYW1lcyBkbyBub3Qgd29yaworICAgICogW1RIUklGVC0zMzI1XSAtIGNvY29hOiBFeHRlbmRlZCBzZXJ2aWNlcyBhcmVuJ3Qgc3ViY2xhc3NlcyBpbiBnZW5lcmF0ZWQgQ29jb2EKKyAgICAqIFtUSFJJRlQtNDExNl0gLSBjb2NvYTogVGhyaWZ0IGRlLWNhcGl0YWxpemVzIHRoZSBuYW1lIG9mIElzU2V0IHByb3BlcnR5IGluIENvY29hCisgICAgKiBbVEhSSUZULTM4NzddIC0gY3BwOiB0aGUgaHR0cCBpbXBsZW1lbnRhdGlvbiBpcyBub3Qgc3RhbmRhcmQ7IGludGVyb3Agd2l0aCBvdGhlciBsYW5ndWFnZXMgaXMgc3BvdHR5IGF0IGJlc3QKKyAgICAqIFtUSFJJRlQtNDE4MF0gLSBjcHA6IEltcG9zc2libGUgdG8gYnVpbGQgVGhyaWZ0IEMrKyBsaWJyYXJ5IGZvciBBbmRyb2lkIChOREspCisgICAgKiBbVEhSSUZULTQzODRdIC0gY3BwOiBVc2luZyBtdWx0aXBsZSBhc3luYyBzZXJ2aWNlcyBzaW11bHRhbmVvdXNseSBpcyBub3QgdGhyZWFkLXNhZmUKKyAgICAqIFtUSFJJRlQtMzEwOF0gLSBoYXNrZWxsOiBEZWZhdWx0ZWQgc3RydWN0IHBhcmFtZXRlcnMgb24gYSBzZXJ2aWNlIGdlbmVyYXRlcyBpbnZhbGlkIEhhc2tlbGwKKyAgICAqIFtUSFJJRlQtMzk5MF0gLSBub2RlanM6IEV4Y2VwdGlvbiBzd2FsbG93ZWQgYnkgZGVzZXJpYWxpemF0aW9uIGZ1bmN0aW9uCisgICAgKiBbVEhSSUZULTQyMTRdIC0gbm9kZWpzOiBtYXA8aTY0LHZhbHVlPiBrZXkgdHJlYXRlZCBhcyBoZXggdmFsdWUgaW4gSmF2YVNjcmlwdAorICAgICogW1RIUklGVC00NjAyXSAtIG5vZGVqczogRVJST1IgaW4gLi9ub2RlX21vZHVsZXMvdGhyaWZ0L2xpYi9ub2RlanMvbGliL3RocmlmdC9jb25uZWN0aW9uLmpzIE1vZHVsZSBub3QgZm91bmQ6IEVycm9yOiBDYW4ndCByZXNvbHZlICdjaGlsZF9wcm9jZXNzJworICAgICogW1RIUklGVC00NjM5XSAtIG5vZGVqczogU2VxdWVuY2UgbnVtYmVyaW5nIGZvciBtdWx0aXBsZXhlZCBwcm90b2NvbCBicm9rZW4KKyAgICAqIFtUSFJJRlQtMTMxMF0gLSBwaHA6IHNlcXVlbmNlIGFuZCByZWNvbm5lY3Rpb24gbWFuYWdlbWVudCBpc3N1ZXMKKyAgICAqIFtUSFJJRlQtMTUzOF0gLSBwaHA6IEVycm9yIGR1cmluZyBkZXNlcmlhbGl6YXRpb24gaW50NjQgb24gMzItYml0IGFyY2hpdGVjdHVyZQorICAgICogW1RIUklGVC0xNTgwXSAtIHBocDogdGhyaWZ0IHR5cGUgaTY0IGphdmEgdG8gcGhwIHNlcmlhbGl6ZS9kZXNlcmVhbGl6ZSBub3Qgd29ya2luZworICAgICogW1RIUklGVC0xOTUwXSAtIHBocDogUEhQIGdldHMgc3R1Y2sgaW4gaW5maW5pdGUgbG9vcAorICAgICogW1RIUklGVC0yOTU0XSAtIHB5dGhvbjogc2VuZGluZyBpbnQgb3IgZmxvYXQgaW4gYSBkb3VibGUgZmllbGQgYnJlYWtzIHRoZSBjb25uZWN0aW9uCisgICAgKiBbVEhSSUZULTQwODBdIC0gcHl0aG9uOiB1bml4IHNvY2tldHMgY2FuIGdldCBzdHVjayBmb3JldmVyCisgICAgKiBbVEhSSUZULTQyODFdIC0gcHl0aG9uOiBnZW5lcmF0ZWQgY29kZSBpcyBvdXQgb2Ygb3JkZXIgYW5kIGNhdXNlcyBsb2FkIGlzc3VlcworICAgICogW1RIUklGVC00Njc3XSAtIHB5MzogVW5pY29kZURlY2lkZUVycm9yIGluIFB5dGhvbjMKKworIyMgQnVpbGQgUHJvY2VzcworICAgICogW1RIUklGVC00MDY3XSAtIFdpbmRvd3MgdGhyaWZ0IGNvbXBpbGVyIGRpc3RyaWJ1dGVkIG9uIHRoZSBhcGFjaGUgd2ViIHNpdGUgaGFzIHJ1bnRpbWUgZGVwZW5kZW5jaWVzCisgICAgKiBbVEhSSUZULTQzMDhdIC0gRCBsYW5ndWFnZSBkb2NrZXIgaW1hZ2VzIG5lZWQgZGVtaW9zIGZvciBsaWJldmVudCBhbmQgb3BlbnNzbCBmaXhlZCB0byByZS1lbmFibGUgbWFrZSBjcm9zcyBvbiBkbGFuZworICAgICogW1RIUklGVC00NTc5XSAtIFVzZSBVYnVudHUgQmlvbmljICgxOC4wNCBMVFMpIGZvciBDSSBidWlsZHMgaW5zdGVhZCBvZiBBcnRmdWwgKDE3LjEwKQorICAgICogW1RIUklGVC00NTA4XSAtIERlZmluZSBDSSBvcGVyYXRpbmcgc3lzdGVtIGNvdmVyYWdlIHJ1bGVzIGZvciB0aGUgcHJvamVjdCBhbmQgKGhvcGVmdWxseSkgc2ltcGxpZnkgQ0kgYSBsaXR0bGUgbW9yZQorICAgICogW1RIUklGVC00Mzk3XSAtIHVidW50dSBpbnN0YWxsIGluc3RydWN0aW9ucyBicm9rZW4gb24gMTYuMDQKKyAgICAqIFtUSFJJRlQtNDU0NV0gLSBBcHB2ZXlvciBidWlsZHMgYXJlIGZhaWxpbmcgZHVlIHRvIGEgaGFza2VsbCAvIGNhYmFsIHVwZGF0ZSBpbiBjaG9jb2xhdGV5CisgICAgKiBbVEhSSUZULTQ0NTJdIC0gb3B0aW1pemUgRG9ja2VyZmlsZSAob25seSBvbmV0aW1lIGFwdC1nZXQgdXBkYXRlKQorICAgICogW1RIUklGVC00NDQwXSAtIHJtIGBidWlsZC9kb2NrZXIvdWJ1bnR1LXRydXN0eS9Eb2NrZXJmaWxlLm9yaWdgCisgICAgKiBbVEhSSUZULTQzNTJdIC0gVWJ1bnR1IEFydGZ1bCBkb2Vzbid0IGFwcGVhciB0byBiZSBjb21wYXRpYmxlIHdpdGggVGhyaWZ0IGFuZCBIYXhlIDMuNC4yCisgICAgKiBbVEhSSUZULTQ2NjZdIC0gRExhbmcgQ2xpZW50IFBvb2wgVGVzdCBmYWlscyBzcG9yYWRpY2FsbHkKKyAgICAqIFtUSFJJRlQtNDY3Nl0gLSBDTCB0dXRvcmlhbCBidWlsZCBmYWlscyBzcG9yYWRpY2FsbHkKKyAgICAqIFtUSFJJRlQtNDQ1Nl0gLSBNYWtlIGhheGVsaWIgZG93bmxvYWQgcXVpZXQgc28gaXQgZG9lc24ndCBibG93IHVwIHRoZSBidWlsZCBsb2cKKyAgICAqIFtUSFJJRlQtNDYwNV0gLSBib290c3RyYXAuc2ggZmFpbHMgaWYgYXV0b21ha2U9MS4xNi4xCisKKyMjIGNfZ2xpYgorICAgICogW1RIUklGVC00NjQ4XSAtIFRoZSBDIChHTGliKSBjb21waWxlcidzIGhhbmRsaW5nIG9mIG5hbWVzcGFjZXMgaGFzIGJlZW4gaW1wcm92ZWQuCisgICAgKiBbVEhSSUZULTQ2MjJdIC0gZ2xpYkMgY29tcGlsYXRpb24gaXNzdWUKKyAgICAqIFtUSFJJRlQtNDY3MV0gLSBjIGdsaWIgaXMgdW5hYmxlIHRvIGhhbmRsZSBjbGllbnQgY2xvc2UgdW5leHBlY3RlZGx5CisKKyMjIGNsIChuZXcgbGFuZ3VhZ2Ugc3VwcG9ydCBpbiAwLjEyLjApCisgICAgKiBbVEhSSUZULTgyXSAtIENvbW1vbiBMaXNwIHN1cHBvcnQKKworIyMgY3NoYXJwCisgICAgKiBbVEhSSUZULTQ1NThdIC0gcmVzZXJ2ZWQgQ3NoYXJwIGtleXdvcmRzIGFyZSBub3QgZXNjYXBlZCBpbiBzb21lIGNhc2VzCisgICAgKiBbVEhSSUZULTQ2MzddIC0gQyMgYXN5bmMgbW9kZSBnZW5lcmF0ZXMgaW5jb3JyZWN0IGNvZGUgd2l0aCBpbmhlcml0ZWQgc2VydmljZXMKKyAgICAqIFtUSFJJRlQtNDY3Ml0gLSBJQXN5bmNSZXN1bHQgc3R5bGUgbWV0aG9kcyBub3QgYmVpbmcgc3VwcG9ydGVkIGJ5IGNlcnRhaW4gdHJhbnNwb3J0cyBsZWFkcyB0byBpc3N1ZXMgaW4gbWl4ZWQgSVN5bmMvSUFzeW5jIHVzZSBjYXNlcworICAgICogW1RIUklGVC00NTM5XSAtIEFsbG93IFRCdWZmZXJlZFRyYW5zcG9ydCB0byBiZSB1c2VkIGFzIGJhc2UgY2xhc3MKKyAgICAqIFtUSFJJRlQtNDUzNV0gLSBYTUwgZG9jczsgY29kZSBjbGVhbnVwICh0YWJzLT5zcGFjZXM7IFN0cmluZy0+c3RyaW5nKQorICAgICogW1RIUklGVC00NDkyXSAtIHByb3RlY3RlZCBFeGNlcHRpb25UeXBlIHR5cGUgbWVtYmVyIG9mIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBjYW5ub3QgYmUgYWNjZXNzZWQKKyAgICAqIFtUSFJJRlQtNDQ0Nl0gLSBKU09OUHJvdG9jb2wgQmFzZTY0IEVuY29kaW5nIFRyaW1zIFBhZGRpbmcKKyAgICAqIFtUSFJJRlQtNDQ1NV0gLSBNaXNzaW5nIGRpc3Bvc2UgY2FsbHMgaW4gVGhyZWFkZWRTZXJ2ZXIgJiBUaHJlYWRwb29sU2VydmVyCisgICAgKiBbVEhSSUZULTQ2MDldIC0ga2VlcCBJbm5lckV4Y2VwdGlvbiB3aGVyZXZlciBhcHByb3ByaWF0ZQorICAgICogW1RIUklGVC00NjczXSAtIElBc3luY1Jlc3VsdCBub3Qgc3VwcG9ydGVkIGJ5IGxheWVyZWQgdHJhbnNwb3J0cyAoYnVmZmVyZWQvZnJhbWVkKQorCisjIyBjcHAKKyAgICAqIFtUSFJJRlQtNDQ3Nl0gLSBUeXBlY2FzdGluZyBwcm9ibGVtIG9uIGxpc3QgaXRlbXMKKyAgICAqIFtUSFJJRlQtNDQ2NV0gLSBUTm9uYmxvY2tpbmdTZXJ2ZXIgdGhyb3dpbmcgVEhSSUZUIExPR0dFUjogVENvbm5lY3Rpb246OndvcmtTb2NrZXQoKTogVEhSSUZUX0VBR0FJTiAodW5hdmFpbGFibGUgcmVzb3VyY2VzKQorICAgICogW1RIUklGVC00NjgwXSAtIFRCdWZmZXJUcmFuc3BvcnRzLmggZG9lcyBub3QgY29tcGlsZSB1bmRlciBWaXN1YWwgU3R1ZGlvIDIwMTcKKyAgICAqIFtUSFJJRlQtNDYxOF0gLSBUTm9uYmxvY2tpbmdTZXJ2ZXIgY3Jhc2ggYmVjYXVzZSBvZiBsaW1pdGF0aW9uIG9mIHNlbGVjdCgpCisgICAgKiBbVEhSSUZULTQ2MjBdIC0gVFpsaWJUcmFuc3BvcnQuY3BwIGRvZXNuJ3QgZW5zdXJlIHRoYXQgdGhlcmUgaXMgZW5vdWdoIHNwYWNlIGZvciB0aGUgemxpYiBmbHVzaCBtYXJrZXIgaW4gdGhlIGJ1ZmZlci4KKyAgICAqIFtUSFJJRlQtNDU3MV0gLSBaZXJvTVEgY29udHJpYiBsaWJyYXJ5IG5lZWRzIGEgcmVmcmVzaAorICAgICogW1RIUklGVC00NTU5XSAtIFRTU0xTZXJ2ZXJTb2NrZXQgaW5jb3JyZWN0bHkgcHJpbnRzIGVycm9ycworICAgICogW1RIUklGVC00NTc4XSAtIE1vdmUgYFRBc3luY1Byb3RvY29sUHJvY2Vzc29yYCBpbnRvIG1haW4gdGhyaWZ0IGxpYnJhcnkKKyAgICAqIFtUSFJJRlQtNDQxOF0gLSBldmh0dHBfY29ubmVjdGlvbl9uZXcgaXMgZGVwcmVjYXRlZDsgdXNlIGV2aHR0cF9jb25uZWN0aW9uX2Jhc2VfbmV3CisKKyMjIGNvbXBpbGVyCisgICAgKiBbVEhSSUZULTQ2NDRdIC0gQ29tcGlsZXIgY2Fubm90IGJlIGNvbXBpbGVkIG9uIG1hY09TKG1heWJlIGFsc28gb24gb3RoZXIgcGxhdGZvcm1zIHdpdGggY2xhbmcpCisgICAgKiBbVEhSSUZULTQ1MzFdIC0gVGhyaWZ0IGdlbmVyYXRlcyB3cm9uZyBQeXRob24gY29kZSBmb3IgaW1tdXRhYmxlIHN0cnVjdHVyZXMgd2l0aCBvcHRpb25hbCBtZW1iZXJzCisgICAgKiBbVEhSSUZULTQ1MTNdIC0gdGhyaWZ0IGdlbmVyYXRlZCBjb2RlIGlzIG5vdCBzdGFibGUgZm9yIGNvbnN0YW50cworICAgICogW1RIUklGVC00NTMyXSAtIEF2b2lkIHVwZGF0aW5nIFRocmlmdCBjb21waWxlciBnZW5lcmF0ZWQgY29kZSBpZiB0aGUgb3V0cHV0IGhhcyBub3QgY2hhbmdlZAorICAgICogW1RIUklGVC00NDAwXSAtIFZpc3VhbCBTdHVkaW8gQ29tcGlsZXIgcHJvamVjdCBzaG91bGQgbGluayBydW50aW1lIHN0YXRpY2FsbHkgaW4gcmVsZWFzZSBidWlsZHMKKyAgICAqIFtUSFJJRlQtNDM5OV0gLSBwbHVnaW4udGhyaWZ0IHRfY29uc3RfdmFsdWUgaXMgbm90IHVzZWQgYXMgYSB1bmlvbiBpbiBDKysgY29kZSAtLSBmaXggdGhpcworICAgICogW1RIUklGVC00NDk2XSAtIERlYWxpbmcgd2l0aCBsYW5ndWFnZSBrZXl3b3JkcyBpbiBUaHJpZnQgKGUuZy4gc2VydmljZSBtZXRob2QgbmFtZXMpCisgICAgKiBbVEhSSUZULTQzOTNdIC0gcmVwZWF0ZWQgcnVucyBvZiBjb21waWxlciBwcm9kdWNlIGRpZmZlcmVudCBiaW5hcnkgb3V0cHV0IGF0IHBsdWdpbiBpbnRlcmZhY2UKKworIyMgZGxhbmcKKyAgICAqIFtUSFJJRlQtNDQ3OF0gLSBUaHJpZnQgd2lsbCBub3QgYnVpbGQgd2l0aCBkbGFuZyAyLjA3OCBvciBsYXRlcgorICAgICogW1RIUklGVC00NTAzXSAtIGRsYW5nIHNlcnZlcnMgbG9nRXJyb3Igb24gbm9ybWFsIGNsaWVudCBkaXNjb25uZWN0aW9uCisgICAgKiBbVEhSSUZULTQzMDhdIC0gRCBsYW5ndWFnZSBkb2NrZXIgaW1hZ2VzIG5lZWQgZGVtaW9zIGZvciBsaWJldmVudCBhbmQgb3BlbnNzbCBmaXhlZCB0byByZS1lbmFibGUgbWFrZSBjcm9zcyBvbiBkbGFuZworCisjIyBkYXJ0CisgICAgKiBbVEhSSUZULTQ2NDZdIC0gRWZmZWN0aXZlIERhcnQgYW5kIEV4Y2VwdGlvbnMKKyAgICAqIFtUSFJJRlQtNDQzOV0gLSBTaG91bGRuJ3QgZG93bmxvYWQgZGFydC5kZWIgZGlyZWN0bHkuCisKKyMjIGRlbHBoaQorICAgICogW1RIUklGVC00NTYyXSAtIENhbGxpbmcgd3JvbmcgZXhjZXB0aW9uIENUT1IgbGVhZHMgdG8gImNhbGwgZmFpbGVkOiB1bmtub3duIHJlc3VsdCIgaW5zdGVhZCBvZiB0aGUgcmVhbCBleGNlcHRpb24gYmVpbmcgdGhyb3duCisgICAgKiBbVEhSSUZULTQ1NTRdIC0gdW5jb21waWxlYWJsZSBjb2RlIHdpdGggbWVtYmVyIG5hbWVzIHRoYXQgYXJlIGFsc28gdHlwZXMgdW5kZXIgc3BlY2lmaWMgY29uZGl0aW9ucworICAgICogW1RIUklGVC00NDIyXSAtIEFkZCBBc3luYyBpbXBsZW1lbnRhdGlvbiB2aWEgSUZ1dHVyZQorICAgICogW1RIUklGVC00NDg1XSAtIFBvc3NpYmxlIGludmFsaWQgcHRyIEFWIHdpdGggb3ZlcmxhcHBlZCByZWFkL3dyaXRlIG9uIHBpcGVzCisgICAgKiBbVEhSSUZULTQ1NDldIC0gVGhyaWZ0IGV4Y2VwdGlvbnMgc2hvdWxkIGRlcml2ZSBmcm9tIFRFeGNlcHRpb24KKyAgICAqIFtUSFJJRlQtNDU0MF0gLSBidWZmZXJlZCB0cmFuc3BvcnQgYnJva2VuIHdoZW4gdHJ5aW5nIHRvIHJlLW9wZW4gYSBmb3JtZXJseSBjbG9zZWQgdHJhbnNwb3J0CisgICAgKiBbVEhSSUZULTQ0NzNdIC0gTW92ZSBUaHJpZnQuQ29uc29sZS5wYXMgb3V0IG9mIHRoZSBMaWJyYXJ5CisgICAgKiBbVEhSSUZULTQ0OTBdIC0gQWxsb3cgYSBkZWZhdWx0IHNlcnZpY2UgYXMgZmFsbGJhY2sgZm9yIG11bHRpcGxleCBwcm9jZXNzb3JzIGNvbm5lY3RlZCBieSBvbGQgY2xpZW50cworICAgICogW1RIUklGVC00NDU0XSAtIExhcmdlIHdyaXRlcy9yZWFkcyBtYXkgY2F1c2UgcmFuZ2UgY2hlY2sgZXJyb3JzIGluIGRlYnVnIG1vZGUKKyAgICAqIFtUSFJJRlQtNDQ2MV0gLSBDb21waWxlciBkaXJlY3RpdmUgc2hvdWxkIG1hdGNoIERlbHBoaSBYRTQKKyAgICAqIFtUSFJJRlQtNDQ2Ml0gLSBGaXJzdCBsaW5lIGluIENvbnNvbGUgZHVwbGljYXRlZAorICAgICogW1RIUklGVC00NjQyXSAtIEZQVSBjdHJsIHdvcmQgc2V0dGluZ3MgbWF5IGNhdXNlIGFuIHVuZXhwZWN0ZWQgImRlbm9ybWFsaXplZCIgZXJyb3IKKyAgICAqIFtUSFJJRlQtNDU4OV0gLSBIVFRQIGNsaWVudCB0aW1lb3V0cyBhcmUgYSkgaW5jb21wbGV0ZSBhbmQgYikgbm90IHVzZWQgYXQgYWxsCisgICAgKiBbVEhSSUZULTQ1OTBdIC0gcnVubmluZyB0aGUgdGVzdCBjbGllbnQgdXNpbmcgSFRUUCB0cmFuc3BvcnQgbGVhZHMgdG8gIkNvSW5pdGlhbGl6ZSBub3QgY2FsbGVkIgorCisjIyBlcmxhbmcKKyAgICAqIFtUSFJJRlQtNDQ5N10gLSBFcmxhbmcgcmVjb3JkcyBzaG91bGQgdXNlIG1hcCgpIGZvciBtYXAgdHlwZQorICAgICogW1RIUklGVC00NDk1XSAtIEVybGFuZyByZWNvcmRzIHNob3VsZCBhbGxvdyAndW5kZWZpbmVkJyBmb3Igbm9uLXJlcXVpcmVkIGZpZWxkcworICAgICogW1RIUklGVC00NTgwXSAtIEZpeCBlcmxhbmcgdHV0b3JpYWwgdW5wYWNrIG9uIFdpbmRvd3MKKyAgICAqIFtUSFJJRlQtNDU4Ml0gLSBVYnVudHUgWGVuaWFsIGVybGFuZyAxOC4zICJtYWtlIGNoZWNrIiBmYWlscworCisjIyBnb2xhbmcKKyAgICAqIFtUSFJJRlQtNDQ0OF0gLSBTdXBwb3J0IGZvciBnb2xhbmcgMS42IGFuZCBlYXJsaWVyIGhhcyBiZWVuIGRyb3BwZWQuCisgICAgKiBbVEhSSUZULTQyNTNdIC0gR28gZ2VuZXJhdG9yIGFzc2lnbnMgc3RyaW5ncyB0byBmaWVsZCBpbiBjb25zdCBpbnN0ZWFkIG9mIHBvaW50ZXJzLgorICAgICogW1RIUklGVC00NTczXSAtIFVuaW9ucyBGaWVsZCBDb3VudCBEb2VzIE5vdCBDb25zaWRlciBCaW5hcnkKKyAgICAqIFtUSFJJRlQtNDQ0N10gLSBHb2xhbmc6IFBhbmljIG9uIHAuYy5DYWxsIHdoZW4gdXNpbmcgZGVwcmVjYXRlZCBpbml0aWFsaXplcnMKKyAgICAqIFtUSFJJRlQtNDY1MF0gLSBSZXF1aXJlZCBmaWVsZCBpbmNvcnJlY3RseSBtYXJrZWQgYXMgc2V0IHdoZW4gZmllbGRUeXBlIGRvZXMgbm90IG1hdGNoCisgICAgKiBbVEhSSUZULTQ0ODZdIC0gR29sYW5nOiAtcmVtb3RlLmdvIGNsaWVudCBjbGVhbnVwCisgICAgKiBbVEhSSUZULTQ1MzddIC0gVFNpbXBsZVNlcnZlciBjYW4gZXhpdCBBY2NlcHQgbG9vcCB3aXRoIGxvY2sgc3RpbGwgYWNxdWlyZWQKKyAgICAqIFtUSFJJRlQtNDUxNl0gLSBBZGQgc3VwcG9ydCBmb3IgZ28gMS4xMAorICAgICogW1RIUklGVC00NDIxXSAtIGdvbGFuZyB0ZXN0cyByZWx5IG9uIGdvbW9jaywgd2hpY2ggaGFzIGNoYW5nZSBiZWhhdmlvdXIsIGNhdXNpbmcgdGVzdHMgdG8gZmFpbAorICAgICogW1RIUklGVC00NjI2XSAtIENvbW11bmljYXRpb24gY3Jhc2ggd2hlbiB1c2luZyBiaW5hcnkvY29tcGFjdCBwcm90b2NvbCBhbmQgemxpYiB0cmFuc3BvcnQKKyAgICAqIFtUSFJJRlQtNDY1OV0gLSBnb2xhbmcgcmFjZSBkZXRlY3RlZCB3aGVuIGNsb3NpbmcgbGlzdGVuZXIgc29ja2V0CisKKyMjIGhhc2tlbGwKKyAgICAqIFtUSFJJRlQtNDYzNF0gLSBIYXNrZWxsIGJ1aWxkcyB3aXRoIG9sZGVyIGNhYmFsIGNhbm5vdCByZWNvbmNpbGUgY29tcGxleCB2ZXJzaW9uIHJlcXVpcmVtZW50cworCisjIyBqYXZhCisgICAgKiBbVEhSSUZULTQyNTldIC0gVGhyaWZ0IGRvZXMgbm90IGNvbXBpbGUgZHVlIHRvIEFudCBNYXZlbiB0YXNrIGVycm9ycworICAgICogW1RIUklGVC0xNDE4XSAtIENvbXBpbGluZyBUaHJpZnQgZnJvbSBzb3VyY2U6IENsYXNzIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkNvbmRpdGlvblRhc2sgZG9lc24ndCBzdXBwb3J0IHRoZSBuZXN0ZWQgInR5cGVmb3VuZCIgZWxlbWVudAorICAgICogW1RIUklGVC00NTMwXSAtIHByb3Bvc2FsOiBhZGQgbnVsbGFiaWxpdHkgYW5ub3RhdGlvbnMgdG8gZ2VuZXJhdGVkIEphdmEgY29kZQorICAgICogW1RIUklGVC00NjE0XSAtIEdlbmVyYXRlIG1pc3NpbmcgQE51bGxhYmxlIGFubm90YXRpb25zIGZvciBKYXZhIGl0ZXJhdG9yIGdldHRlcnMKKyAgICAqIFtUSFJJRlQtNDU1NV0gLSBHZXR0ZXIgb2YgYmluYXJ5IGZpZWxkIGluIEphdmEgY3JlYXRlcyB1bm5lY2Vzc2FyeSBjb3B5CisgICAgKiBbVEhSSUZULTM5ODNdIC0gbGlidGhyaWZ0IGlzIGRlcGxveWVkIG9uIGNlbnRyYWwgd2l0aCBwb20gcGFja2FnaW5nIGluc3RlYWQgb2YgamFyCisgICAgKiBbVEhSSUZULTQyOTRdIC0gSmF2YSBDb25maWd1cmUgRmFpbHMgZm9yIEFudCA+PSAxLjEwCisgICAgKiBbVEhSSUZULTQxNzhdIC0gSmF2YSBsaWJyYXJpZXMgbWlzc2luZyBmcm9tIHBhY2thZ2Ugd2hlbiB1c2luZyBjbWFrZQorICAgICogW1RIUklGVC00MTIwXSAtIHBvbSBmaWxlcyBhcmUgbm90IGdlbmVyYXRlZCBvciBwcm92aWRlZCBpbiB0aGUgYnVpbGQKKyAgICAqIFtUSFJJRlQtMTUwN10gLSBNYXZlbiBjYW4ndCBkb3dubG9hZCByZXNvdXJjZSBmcm9tIGNlbnRyYWwgd2hlbiBiZWhpbmQgYSBwcm94eSBhbmQgd29uJ3QgdXNlIGxvY2FsIHJlcG9zaXRvcnkKKyAgICAqIFtUSFJJRlQtNDU1Nl0gLSBPcHRpb25hbCByZXRocm93IG9mIHVuaGFuZGxlZCBleGNlcHRpb25zIGluIGphdmEgcHJvY2Vzc29yCisgICAgKiBbVEhSSUZULTQzMzddIC0gQWJsZSB0byBzZXQga2V5U3RvcmUgYW5kIHRydXN0U3RvcmUgYXMgSW5wdXRTdHJlYW0gaW4gdGhlIFRTU0xUcmFuc3BvcnRGYWN0b3J5LlRTU0xUcmFuc3BvcnRQYXJhbWV0ZXJzCisgICAgKiBbVEhSSUZULTQ1NjZdIC0gUGFzcyBtZXNzYWdlIG9mIHVuaGFuZGxlZCBleGNlcHRpb24gdG8gb3B0aW9uYWwgcmV0aHJvdy4KKyAgICAqIFtUSFJJRlQtNDUwNl0gLSBSZW1vdmUgYXNzZXJ0aW9uIGluIEphdmEgU0FTTCBjb2RlIHRoYXQgd291bGQgYmUgaWdub3JlZCBpbiByZWxlYXNlIGJ1aWxkcworICAgICogW1RIUklGVC00NDcwXSAtIEluY2x1ZGUgcG9wdWxhciBJREUgZmlsZSB0ZW1wbGF0ZXMgdG8gZ2l0aWdub3JlCisgICAgKiBbVEhSSUZULTQ0MjldIC0gTWFrZSBUVGhyZWFkUG9vbFNlcnZlci5leGVjdXRvclNlcnZpY2VfIGF2YWlsYWJsZSBpbiBpbmhlcml0ZWQgY2xhc3NlcyBhbmQgcmVmYWN0b3IgbWV0aG9kcyB0byBiZSBhYmxlIGN1c3RvbWl6YXRpb24KKyAgICAqIFtUSFJJRlQtMzc2OV0gLSBGaXggbG9naWMgb2YgVEhSSUZULTIyNjgKKyAgICAqIFtUSFJJRlQtNDQ5NF0gLSBJbmNyZWFzZSBKYXZhIFNvY2tldCBCdWZmZXIgU2l6ZQorICAgICogW1RIUklGVC00NDk5XSAtIFJlbW92ZSBNYWdpYyBOdW1iZXIgSW4gVEZJbGVUcmFuc3BvcnQKKworIyMganMKKyAgICAqIFtUSFJJRlQtNDQwNl0gLSBKYXZhU2NyaXB0OiBVc2UgbW9kZXJuIFByb21pc2UgaW1wbGVtZW50YXRpb25zCisgICAgKiBbVEhSSUZULTQ2MjVdIC0gbGV0IC8gY29uc3QgdmFyaWFibGUgZGVjb3JhdG9ycyBmb3IgZXM2IGNvbXBpbGVyCisgICAgKiBbVEhSSUZULTQ2NTNdIC0gRVM2IENsYXNzZXMKKyAgICAqIFtUSFJJRlQtNDU5Ml0gLSBKUzogcmVhZEkzMiBwZXJmb3JtYW5jZSBvbiBsYXJnZSBhcnJheXMgaXMgdmVyeSBwb29yIGluIENocm9tZQorICAgICogW1RIUklGVC00NTA5XSAtIGpzIGFuZCBub2RlanMgbGlicmFyaWVzIG5lZWQgdG8gYmUgcmVmcmVzaGVkIHdpdGggY3VycmVudCBsaWJyYXJpZXMKKyAgICAqIFtUSFJJRlQtNDQwM10gLSB0aHJpZnQuanM6IEluY29ycmVjdCB1c2FnZSBvZiAndGhpcycgaW4gVFdlYlNvY2tldFRyYW5zcG9ydC5fX29uT3BlbgorICAgICogW1RIUklGVC00NDM2XSAtIERlc2VyaWFsaXphdGlvbiBvZiBuZXN0ZWQgbGlzdCBkaXNjYXJkcyBjb250ZW50CisgICAgKiBbVEhSSUZULTQ0MzddIC0gSlMgV2ViU29ja2V0IGNsaWVudCBjYWxsYmFja3MgaW52b2tlZCB0d2ljZSBvbiBwYXJhbGxlbCByZXF1ZXN0cworICAgICogW1RIUklGVC00Njc5XSAtIER1cGxpY2F0ZSBkZWNsYXJhdGlvbiBvZiBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IgaW4gbGliL25vZGVqcy9saWIvdGhyaWZ0L2pzb25fcHJvdG9jb2wuanMKKyAgICAqIFtUSFJJRlQtNDU1MV0gLSBBZGQgcHJldHRpZXIgZm9yIGNvbnNpc3RlbnQgSlMgY29kZSBmb3JtYXR0aW5nCisKKyMjIGx1YQorICAgICogW1RIUklGVC00NTkxXSAtIGx1YSBjbGllbnQgdXNlcyB0d28gd3JpdGUoKSBjYWxscyBwZXIgZnJhbWVkIG1lc3NhZ2Ugc2VuZAorICAgICogW1RIUklGVC0zODYzXSAtIENhbid0ICJtYWtlIGluc3RhbGwiIEx1YSBMaWJyYXJ5CisKKyMjIG5ldGNvcmUKKyAgICAqIFtUSFJJRlQtNDUyNF0gLSAuTkVUIENvcmUgU2VydmVyIGRvZXNuJ3QgY2xvc2UgcHJvcGVybHkgd2hlbiBjYW5jZWxsZWQKKyAgICAqIFtUSFJJRlQtNDQzNF0gLSBVcGRhdGUgLk5FVCBDb3JlIGNvbXBvbmVudHMsIGFkZCB0ZXN0cyBmb3IgLk5ldCBDb3JlIGxpYnJhcnkgYW5kIC5OZXQgQ29yZSBjb21waWxlciwgZml4IGJ1Z3MgYW5kIGJ1aWxkIHByb2Nlc3MKKyAgICAqIFtUSFJJRlQtNDQ0Nl0gLSBKU09OUHJvdG9jb2wgQmFzZTY0IEVuY29kaW5nIFRyaW1zIFBhZGRpbmcKKworIyMgbm9kZS5qcworICAgICogW1RIUklGVC00MjI1XSAtIEVycm9yIGhhbmRsaW5nIG1hbGZvcm1lZCBhcmd1bWVudHMgbGVha3MgbWVtb3J5LCBjb3JydXB0cyB0cmFuc3BvcnQgYnVmZmVycyBjYXVzaW5nIG5leHQgUlBDIHRvIGZhaWwKKyAgICAqIFtUSFJJRlQtMzk1MF0gLSBNZW1vcnkgbGVhayB3aGlsZSBjYWxsaW5nIG9uZXdheSBtZXRob2QKKyAgICAqIFtUSFJJRlQtMzE0M10gLSBhZGQgdHlwZXNjcmlwdCBkaXJlY3Rvcnkgc3VwcG9ydAorICAgICogW1RIUklGVC00NTY0XSAtIFRCdWZmZXJlZFRyYW5zcG9ydCBjYW4gbGVhdmUgY29ycnVwdCBkYXRhIGluIHRoZSBidWZmZXIKKyAgICAqIFtUSFJJRlQtNDY0N10gLSBOb2RlLmpzIEZpbGVzZXJ2ZXIgd2Vicm9vdCBwYXRoCisgICAgKiBbVEhSSUZULTQ0ODldIC0gVW5peCBkb21haW4gc29ja2V0IHN1cHBvcnQgZm9yIE5vZGVKUyBjbGllbnQKKyAgICAqIFtUSFJJRlQtNDQ0M10gLSBub2RlLmpzIGpzb25fcHJvdG9jb2wgdGhyb3dzIGVycm9yIGluIHNraXAgZnVuY3Rpb24KKyAgICAqIFtUSFJJRlQtNDYwNF0gLSBOb2RlSlM6IEV4cG9zZSBJbnQ2NCBmcm9tIGJyb3dzZXIuanMgZm9yIGNvbnN1bXB0aW9uIGJ5IGJyb3dzZXIKKyAgICAqIFtUSFJJRlQtNDQ4MF0gLSBOb2RlSlMgd2FybmluZyBvbiBiaW5hcnlfcHJvdG9jb2wgd3JpdGVNZXNzYWdlRW5kIHdoZW4gc2VxaWQgPSAwCisKKyMjIHBlcmwKKyAgICAqIFtUSFJJRlQtNDM4Ml0gLSBSZXBsYWNlIHRoZSB1c2Ugb2YgUGVybCBJbmRpcmVjdCBPYmplY3QgU3ludGF4IGNhbGxzIHRvIG5ldygpCisgICAgKiBbVEhSSUZULTQ0NzFdIC0gVGhyaWZ0IENQQU4gcmVsZWFzZSBpcyBtaXNzaW5nIE1ha2VmaWxlLlBMIGFuZCB0aGUgY2xpZW50cyBhcmUgdW5hYmxlIHRvIGJ1aWxkIHRoZSBtb2R1bGUKKyAgICAqIFtUSFJJRlQtNDQxNl0gLSBQZXJsIENQQU4gUGFja2FnaW5nIEltcHJvdmVtZW50cworCisjIyBwaHAKKyAgICAqIFtUSFJJRlQtNDQ3NF0gLSBQSFAgZ2VuZXJhdG9yIHVzZSBQU1ItNCBkZWZhdWx0CisgICAgKiBbVEhSSUZULTQ0NjNdIC0gUEhQIGdlbmVyYXRlZCBjb2RlIG1hdGNoIFBTUi0yCisgICAgKiBbVEhSSUZULTQzNzNdIC0gRXh0ZW5kaW5nIFRocmlmdCBjbGFzcyByZXN1bHRzIGluICJBdHRlbXB0IHNlcmlhbGl6ZSBmcm9tIG5vbi1UaHJpZnQgb2JqZWN0IgorICAgICogW1RIUklGVC00MzU0XSAtIFRTb2NrZXQgYmxvY2sgb24gcmVhZAorICAgICogW1RIUklGVC00NDIzXSAtIG1pZ3JhdGUgcGhwIGxpYnJhcnkgdG8gcHNyLTQKKyAgICAqIFtUSFJJRlQtNDY1Nl0gLSBpbmZpbml0ZSBsb29wIGluIGxhdGVzdCBQSFAgbGlicmFyeQorICAgICogW1RIUklGVC00NDc3XSAtIFRCdWZmZXJlZFRyYW5zcG9ydCBtdXN0IGhhdmUgdW5kZXJseWluZyB0cmFuc3BvcnQKKyAgICAqIFtUSFJJRlQtNDQ3NV0gLSBsaWIvcGhwL3Rlc3Qgc2hvdWxkIGJlIGNoZWNrZWQgZm9yIFBTUi0yCisgICAgKiBbVEhSSUZULTQ0OThdIC0gYWRkIHBocGNzIGJhY2sKKyAgICAqIFtUSFJJRlQtNDQ2MF0gLSBwaHAgbGlicmFyeSB1c2UgUFNSLTIKKyAgICAqIFtUSFJJRlQtNDY0MV0gLSBUQ3VybENsaWVudCBkb2Vzbid0IGNoZWNrIGZvciBIVFRQIHN0YXR1cyBjb2RlCisgICAgKiBbVEhSSUZULTQ2NDVdIC0gVEN1cmxDbGllbnQ6IHNob3cgYWN0dWFsIGVycm9yIG1lc3NhZ2Ugd2hlbiB0aHJvd2luZyBUVHJhbnNwb3J0RXhjZXB0aW9uCisgICAgKiBbVEhSSUZULTQ2NzRdIC0gQWRkIHN0cmVhbSBjb250ZXh0IHN1cHBvcnQgaW50byBQSFAvVEh0dHBDbGllbnQKKyAgICAqIFtUSFJJRlQtNDQ1OV0gLSByZWR1Y2UgcGhwIGxpYnJhcnkgZGlyZWN0b3J5IGRlcHRoCisKKyMjIHB5dGhvbgorICAgICogW1RIUklGVC00NjcwXSAtIFR3aXN0ZWQsIHNsb3RzLCBhbmQgdm9pZCBtZXRob2QgZmFpbHMgd2l0aCAib2JqZWN0IGhhcyBubyBhdHRyaWJ1dGUgJ3N1Y2Nlc3MnIgorICAgICogW1RIUklGVC00NDY0XSAtIFBvdGVudGlhbGx5IHNlcnZlci1jcmFzaGluZyB0eXBvIGluIFB5dGhvbiBUTm9uYmxvY2tpbmdTZXJ2ZXIKKyAgICAqIFtUSFJJRlQtNDU0OF0gLSBTdXBwb3J0aW5nIFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkIHByb3RvY29sIHdoZW4gdXNpbmcgVE11bHRpcGxleGVkUHJvY2Vzc29yIGluIFB5dGhvbgorICAgICogW1RIUklGVC00NTc3XSAtIE91dGRhdGVkIGNpcGhlciBzdHJpbmcgaW4gcHl0aG9uIHVuaXQgdGVzdAorICAgICogW1RIUklGVC00NTA1XSAtIHB5dGhvbiBidWlsZCBvbiBWYWdyYW50IFdpbmRvd3MgYm94ZXMgZmFpbHMKKyAgICAqIFtUSFJJRlQtNDYyMV0gLSBUSGVhZGVyIGZvciBQeXRob24KKyAgICAqIFtUSFJJRlQtNDY2OF0gLSBtYWtlIHNvY2tldCBiYWNrbG9nIGNvbmZpZ3VyYWJsZSBmb3IgcHl0aG9uCisgICAgKiBbVEhSSUZULTQ1NjFdIC0gUHl0aG9uOiBjbGVhbnVwIHNvY2tldCB0aW1lb3V0IHNldHRpbmdzCisKKyMjIHJ1YnkKKyAgICAqIFtUSFJJRlQtNDI4OV0gLSBUaHJpZnQgUlNwZWMgdGVzdCBzdWl0ZSBmYWlscyB3aXRoIFJ1YnkgMi40LnggZHVlIHRvIEZpeG51bSBkZXByZWNhdGlvbgorICAgICogW1RIUklGVC00MzQyXSAtIFN1cHBvcnQgcnVieSByc3BlYyAzCisgICAgKiBbVEhSSUZULTQ1MjVdIC0gQWRkIHNzbCBzb2NrZXQgb3B0aW9uIHRvIHJ1YnkgY3Jvc3MgdGVzdHMKKyAgICAqIFtUSFJJRlQtNDQ1MF0gLSBBZGQgc2VlayBzdXBwb3J0IHRvIFRDb21wYWN0SW5wdXRQcm90b2NvbCBpbiBSdXN0CisgICAgKiBbVEhSSUZULTQ2MzFdIC0gQ29kZWdlbiBDcmVhdGVzIEludmFsaWQgUnVieSBmb3IgUmVjdXJzaXZlIFN0cnVjdHMKKyAgICAqIFtUSFJJRlQtNDQ3Ml0gLSBGaXggdGhlIGdlbnNwZWMgZm9yIHJ1Ynkgc28gaXQgZG9lcyBub3QgY29tcGxhaW4gYWJvdXQgYW4gaW52YWxpZCBsaWNlbnNlCisKKyMjIHJ1c3QKKyAgICAqIFtUSFJJRlQtNDY2Ml0gLSBSdXN0IGNvbnN0IHN0cmluZyBjYWxscyBmdW5jdGlvbiBhdCBjb21waWxlIHRpbWUKKyAgICAqIFtUSFJJRlQtNDY2MV0gLSBSdXN0IGVudW0gbmFtZSB3cm9uZyBjYXNlIGluIGdlbmVyYXRlZCBzdHJ1Y3RzCisgICAgKiBbVEhSSUZULTQ2MTddIC0gQXZvaWQgZ2VuZXJhdGluZyBjb25mbGljdGluZyBzdHJ1Y3QgbmFtZXMgaW4gUnVzdCBjb2RlCisgICAgKiBbVEhSSUZULTQ1MjldIC0gUnVzdCBnZW5lcmF0aW9uIHNob3VsZCBpbmNsdWRlICMhW2FsbG93KG5vbl9zbmFrZV9jYXNlKV0gb3IgZm9yY2UgY29uZm9ybSB0byBSdXN0IHN0eWxlIGd1aWRlbGluZXMKKyAgICAqIFtUSFJJRlQtNDM5MF0gLSBSdXN0IGJpbmFyeSBwcm90b2NvbCBhbmQgYnVmZmVyZWQgdHJhbnNwb3J0IGNhbm5vdCBoYW5kbGUgd3JpdGVzIGFib3ZlIDQwOTYgYnl0ZXMKKyAgICAqIFtUSFJJRlQtNDQxOV0gLSBSdXN0IGZyYW1lZCB0cmFuc3BvcnQgY2Fubm90IGhhbmRsZSB3cml0ZXMgYWJvdmUgNDA5NiBieXRlcworICAgICogW1RIUklGVC00NjU4XSAtIFJ1c3QncyBUQmluYXJ5SW5wdXRQcm90b2NvbCBmYWlscyB3aGVuIHN0cmljdCBpcyBmYWxzZQorICAgICogW1RIUklGVC00MTg3XSAtIERhcnQgLT4gUnVzdCBGcmFtZWQgY3Jvc3MgdGVzdHMgZmFpbAorICAgICogW1RIUklGVC00NjY0XSAtIFJ1c3QgY2Fubm90IGNyZWF0ZSBSZWFkSGFsZi9Xcml0ZUhhbGYgdG8gaW1wbGVtZW50IGN1c3RvbSB0cmFucG9ydHMKKyAgICAqIFtUSFJJRlQtNDY2NV0gLSBLZWVwIFJ1c3QgbGlicmFyeSB1cC10by1kYXRlIG9uIGNyYXRlcy5pbworCisjIyBzd2lmdCAobmV3IGxhbmd1YWdlIHN1cHBvcnQgaW4gMC4xMi4wKQorICAgICogW1RIUklGVC0zNzczXSAtIFN3aWZ0IExpYnJhcnkKKworIyMgdGVzdCBzdWl0ZQorICAgICogW1RIUklGVC00NTE1XSAtIEdyYWNlZnVsbHkgc2h1dGRvd24gY3Jvc3MtdGVzdCBzZXJ2ZXJzIHRvIGZ1bGx5IHRlc3QgdGVhcmRvd24KKyAgICAqIFtUSFJJRlQtNDA4NV0gLSBBZGQgLk5FVCBDb3JlIHRvIHRoZSBtYWtlIGNyb3NzIHN0YW5kYXJkIHRlc3Qgc3VpdGUKKyAgICAqIFtUSFJJRlQtNDM1OF0gLSBBZGQgdW5peCBkb21haW4gc29ja2V0cyBpbiBydWJ5IHRvIGNyb3NzIHRlc3QgLSBjb2RlIGV4aXN0cworCisjIyB0eXBlc2NyaXB0IChuZXcgbGFuZ3VhZ2Ugc3VwcG9ydCBpbiAwLjEyLjApCisgICAgKiBbVEhSSUZULTMxNDNdIC0gYWRkIHR5cGVzY3JpcHQgZGlyZWN0b3J5IHN1cHBvcnQKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1RocmlmdCAwLjExLjAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIyBTdWItdGFzaworICAgICogW1RIUklGVC0yNzMzXSAtIEVybGFuZyBjb2Rpbmcgc3RhbmRhcmRzCisgICAgKiBbVEhSSUZULTI3NDBdIC0gUGVybCBjb2Rpbmcgc3RhbmRhcmRzCisgICAgKiBbVEhSSUZULTM2MTBdIC0gU3RyZWFtbGluZSBleGNlcHRpb24gaGFuZGxpbmcgaW4gUHl0aG9uIHNlcnZlciBoYW5kbGVyCisgICAgKiBbVEhSSUZULTM2ODZdIC0gSmF2YSBwcm9jZXNzb3Igc2hvdWxkIHJlcG9ydCBpbnRlcm5hbCBlcnJvciBvbiB1bmNhdWdodCBleGNlcHRpb24KKyAgICAqIFtUSFJJRlQtNDA0OV0gLSBTa2lwKCkgc2hvdWxkIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEgb24gdW5rbm93biBkYXRhIHR5cGVzCisgICAgKiBbVEhSSUZULTQwNTNdIC0gU2tpcCgpIHNob3VsZCB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBIG9uIHVua25vd24gZGF0YSB0eXBlcworICAgICogW1RIUklGVC00MTM2XSAtIEFsaWduIGlzX2JpbmFyeSgpIG1ldGhvZCB3aXRoIGlzX3N0cmluZygpIHRvIHNpbXBsaWZ5IHRob3NlIGNoZWNrcworICAgICogW1RIUklGVC00MTM3XSAtIEZpeCByZW1haW5pbmcgdW5kZWZpbmVkIGJlaGF2aW9yIGludmFsaWQgdnB0ciBjYXN0cyBpbiBUaHJpZnQgQ29tcGlsZXIKKyAgICAqIFtUSFJJRlQtNDEzOF0gLSBGaXggcmVtYWluaW5nIHVuZGVmaW5lZCBiZWhhdmlvciBpbnZhbGlkIHZwdHIgY2FzdHMgaW4gQysrIGxpYnJhcnkKKyAgICAqIFtUSFJJRlQtNDI5Nl0gLSBGaXggVWJ1bnR1IFhlbmlhbCBidWlsZCBlbnZpcm9ubWVudCBmb3IgdGhlIHB5dGhvbiBsYW5ndWFnZQorICAgICogW1RIUklGVC00Mjk4XSAtIEZpeCBVYnVudHUgWGVuaWFsIGJ1aWxkIGVudmlyb25tZW50IGZvciB0aGUgZ28gMS42IGxhbmd1YWdlCisgICAgKiBbVEhSSUZULTQyOTldIC0gRml4IFVidW50dSBYZW5pYWwgYnVpbGQgZW52aXJvbm1lbnQgZm9yIHRoZSBEIGxhbmd1YWdlCisgICAgKiBbVEhSSUZULTQzMDBdIC0gRml4IG1ha2UgY3Jvc3MgaW4gVWJ1bnR1IFhlbmlhbCBkb2NrZXIgZW52aXJvbm1lbnQsIG9uY2UgYWxsIGxhbmd1YWdlIHN1cHBvcnQgaXNzdWVzIGFyZSBmaXhlZAorICAgICogW1RIUklGVC00MzAyXSAtIEZpeCBVYnVudHUgWGVuaWFsIG1ha2UgY3Jvc3MgdGVzdGluZyBmb3IgbHVhIGFuZCBwaHA3CisgICAgKiBbVEhSSUZULTQzOThdIC0gVXBkYXRlIEVYVFJBX0RJU1QgZm9yICJtYWtlIGRpc3QiCisKKyMjIEJ1ZworICAgICogW1RIUklGVC0zODFdIC0gRmFpbCBmYXN0IGlmIGNvbmZpZ3VyZSBkZXRlY3RzIEMrKyBwcm9ibGVtcworICAgICogW1RIUklGVC0xNjc3XSAtIE1pbkdXIHN1cHBvcnQgYnJva2VuCisgICAgKiBbVEhSSUZULTE4MDVdIC0gVGhyaWZ0IHNob3VsZCBub3Qgc3dhbGxvdyBBTEwgZXhjZXB0aW9ucworICAgICogW1RIUklGVC0yMDI2XSAtIEZpeCBUQ29tcGFjdFByb3RvY29sIDY0IGJpdCBidWlsZHMKKyAgICAqIFtUSFJJRlQtMjY0Ml0gLSBSZWN1cnNpdmUgc3RydWN0cyBkb24ndCB3b3JrIGluIHB5dGhvbgorICAgICogW1RIUklGVC0yODg5XSAtIHN0YWJsZSByZWxlYXNlIDAuOS4yLCBlcmxhbmcgdHV0b3JpYWwgYnJva2VuCisgICAgKiBbVEhSSUZULTI5MTNdIC0gUnVieSBTZXJ2ZXIgVGhyaWZ0OjpUaHJlYWRQb29sU2VydmVyIHNob3VsZCBzZXJ2ZSBpbnNpZGUgYSB0aHJlYWQKKyAgICAqIFtUSFJJRlQtMjk5OF0gLSBOb2RlLmpzOiBNaXNzaW5nIGhlYWRlciBmcm9tIGh0dHAgcmVxdWVzdAorICAgICogW1RIUklGVC0zMDAwXSAtIC5ORVQgaW1wbGVtZW50YXRpb24gaGFzIHRyb3VibGUgd2l0aCBtaXhlZCBJUCBtb2RlcworICAgICogW1RIUklGVC0zMjgxXSAtIFRyYXZpcyBDSSBidWlsZCBwYXNzZWQgYnV0IHRoZSBsb2cgc2F5cyBCVUlMRCBGQUlMRUQKKyAgICAqIFtUSFJJRlQtMzM1OF0gLSBNYWtlZmlsZToxMzYyOiAqKiogbWlzc2luZyBzZXBhcmF0b3IuIFN0b3AuCisgICAgKiBbVEhSSUZULTM2MDBdIC0gTWFrZSBUVHdpc3RlZCBzZXJ2ZXIgc2VuZCBleGNlcHRpb24gb24gdW5leHBlY3RlZCBoYW5kbGVyIGVycm9yCisgICAgKiBbVEhSSUZULTM2MDJdIC0gTWFrZSBUb3JuYWRvIHNlcnZlciBzZW5kIGV4Y2VwdGlvbiBvbiB1bmV4cGVjdGVkIGhhbmRsZXIgZXJyb3IKKyAgICAqIFtUSFJJRlQtMzY1N10gLSBEIFRGaWxlV3JpdGVyVHJhbnNwb3J0IGNsb3NlIHNob3VsZCB1c2Ugbm9uLXByaW9yaXR5IHNlbmQKKyAgICAqIFtUSFJJRlQtMzcwMF0gLSBHbyBNYXAgaGFzIHdyb25nIGRlZmF1bHQgdmFsdWUgd2hlbiBvcHRpb25hbAorICAgICogW1RIUklGVC0zNzAzXSAtIFVuaW9ucyBGaWVsZCBDb3VudCBEb2VzIE5vdCBDb25zaWRlciBNYXAvU2V0L0xpc3QgRmllbGRzCisgICAgKiBbVEhSSUZULTM3MzBdIC0gc2VydmVyIGxvZyBlcnJvciB0d2ljZQorICAgICogW1RIUklGVC0zNzc4XSAtIGdvIGNsaWVudCBjYW4gbm90IHBhc3MgbWV0aG9kIHBhcmFtZXRlciB0byBzZXJ2ZXIgb2Ygb3RoZXIgbGFuZ3VhZ2UgaWYgbm8gZmllbGRfaWQgaXMgZ2l2ZW4KKyAgICAqIFtUSFJJRlQtMzc4NF0gLSB0aHJpZnQtbWF2ZW4tcGx1Z2luIGdlbmVyYXRlcyBpbnZhbGlkIGluY2x1ZGUgZGlyZWN0b3JpZXMgZm9yIElETCBpbiBkZXBlbmRlbmN5IEpBUnMKKyAgICAqIFtUSFJJRlQtMzgwMV0gLSBOb2RlIFRocmlmdCBjbGllbnQgdGhyb3dzIGV4Y2VwdGlvbiB3aXRoIG11bHRpcGxleGVyIGFuZCByZXNwb25zZXMgdGhhdCBhcmUgYmlnZ2VyIHRoYW4gYSBzaW5nbGUgYnVmZmVyCisgICAgKiBbVEhSSUZULTM4MjFdIC0gVE1lbW9yeUJ1ZmZlciBidWZmZXIgbWF5IG92ZXJmbG93IHdoZW4gcmVzaXppbmcKKyAgICAqIFtUSFJJRlQtMzgzMl0gLSBUaHJpZnQgdmVyc2lvbiAwLjkuMyBleGFtcGxlIG9uIFdpbmRvd3MsIFZpc3VhbCBTdHVkaW8sIGxpbmtpbmcgZXJyb3JzIGR1cmluZyBjb21waWxpbmcKKyAgICAqIFtUSFJJRlQtMzg0N10gLSB0aHJpZnQvY29uZmlnLmggaW5jbHVkZXMgYSAjZGVmaW5lIGZvciBWRVJTSU9OIHdoaWNoIHdpbGwgbGlrZWx5IGNvbmZsaWN0IHdpdGggZXhpc3RpbmcgdXNlciBlbnZpcm9ubWVudCBvciBjb2RlCisgICAgKiBbVEhSSUZULTM4NzNdIC0gRml4IHZhcmlvdXMgYnVpbGQgd2FybmluZ3Mgd2hlbiB1c2luZyBWaXN1YWwgU3R1ZGlvCisgICAgKiBbVEhSSUZULTM4OTFdIC0gVE5vbmJsb2NraW5nU2VydmVyIGNvbmZpZ3VyZWQgd2l0aCBtb3JlIHRoYW4gb25lIElPIHRocmVhZHMgZG9lcyBub3QgYWx3YXlzIHJldHVybiBmcm9tIHNlcnZlKCkgdXBvbiBzdG9wKCkKKyAgICAqIFtUSFJJRlQtMzg5Ml0gLSBUaHJpZnQgdXNlcyBUTFMgU05JIGV4dGVuc2lvbiBwcm92aWRlZCBieSBPcGVuU1NMIGxpYnJhcnkuIE9sZGVyIHZlcnNpb24gb2YgT3BlblNTTCg8IDAuOS44ZikgbWF5IGNyZWF0ZSBwcm9ibGVtIGJlY2F1c2UgdGhleSBkbyBub3Qgc3VwcG9ydCAnU1NMX3NldF90bHNleHRfaG9zdF9uYW1lKCknLgorICAgICogW1RIUklGVC0zODk1XSAtIEJ1aWxkIGZhaWxzIHVzaW5nIEphdmEgMS44IHdpdGggQW50IDwgMS45CisgICAgKiBbVEhSSUZULTM4OTZdIC0gbWFwPHN0cmluZyxzdHJpbmc+IGRhdGEgd2l0aCBudW1iZXIgc3RyaW5nIGtleSBjYW5ub3QgYWNjZXNzIHRoYXQgZGVzZXJpYWxpemVkIGJ5IHBocCBleHRlbnNpb24KKyAgICAqIFtUSFJJRlQtMzkzOF0gLSBQeXRob24gVE5vbmJsb2NraW5nU2VydmVyIGRvZXMgbm90IHdvcmsgd2l0aCBTU0wKKyAgICAqIFtUSFJJRlQtMzk0NF0gLSBUU1NMU29ja2V0IGhhcyBkZWFkIGNvZGUgaW4gY2hlY2tIYW5kc2hha2UKKyAgICAqIFtUSFJJRlQtMzk0Nl0gLSBKYXZhIDEuNSBjb21wYXRpYmlsaXR5IGJyb2tlbiBmb3IgYmluYXJ5IGZpZWxkcyAoamF2YTUgb3B0aW9uKQorICAgICogW1RIUklGVC0zOTYwXSAtIEluaGVyaXRlZCBzZXJ2aWNlcyBpbiBMdWEgZ2VuZXJhdG9yIGFyZSBub3QgbmFtZWQgY29ycmVjdGx5CisgICAgKiBbVEhSSUZULTM5NjJdIC0gQW50IGJ1aWxkLnhtbCBicm9rZW4gb24gV2luZG93cyBmb3IgSmF2YSBsaWJyYXJ5CisgICAgKiBbVEhSSUZULTM5NjNdIC0gVGhyaWZ0LmNhYmFsIGZpbGVuYW1lIGRvZXMgbm90IG1hdGNoIG1vZHVsZSBuYW1lCisgICAgKiBbVEhSSUZULTM5NjddIC0gZ29iamVjdC9ncGFyYW0uaDoxNjY6MzM6IHdhcm5pbmc6IGVudW1lcmF0b3IgdmFsdWUgZm9yIOKAmEdfUEFSQU1fREVQUkVDQVRFROKAmSBpcyBub3QgYW4gaW50ZWdlciBjb25zdGFudCBleHByZXNzaW9uCisgICAgKiBbVEhSSUZULTM5NjhdIC0gRGVzZXJpYWxpemluZyBlbXB0eSBzdHJpbmcvYmluYXJ5IGZpZWxkcworICAgICogW1RIUklGVC0zOTc0XSAtIFVzaW5nIGNsYW5nLTMuOCBhbmQgVGhyZWFkU2FuaXRpemVyIG9uIHRoZSBjb25jdXJyZW5jeV90ZXN0IGNsYWltcyBiYWQgUFRocmVhZCBiZWhhdmlvcgorICAgICogW1RIUklGVC0zOTg0XSAtIFBIUDcgZXh0ZW5zaW9uIGNhdXNlcyBzZWdmYXVsdAorICAgICogW1RIUklGVC00MDA4XSAtIGJyb2tlbiBjaSBkdWUgdG8gdXBzdHJlYW0gZGVwZW5kZW5jeSB2ZXJzaW9uaW5nIGJyZWFrCisgICAgKiBbVEhSSUZULTQwMDldIC0gVXNlIEBpbXBsZW1lbnRlciBpbnN0ZWFkIG9mIGltcGxlbWVudHMgaW4gVFR3aXN0ZWQucHkKKyAgICAqIFtUSFJJRlQtNDAxMF0gLSBRLmZjYWxsIG1lc3NpbmcgdXAgd2l0aCAqdGhpcyogcG9pbnRlciBpbnNpZGUgY2FsbGVkIGZ1bmN0aW9uCisgICAgKiBbVEhSSUZULTQwMTFdIC0gU2V0cyBvZiBUaHJpZnQgc3RydWN0cyBnZW5lcmF0ZSBHbyBjb2RlIHRoYXQgY2FuJ3QgYmUgc2VyaWFsaXplZCB0byBKU09OCisgICAgKiBbVEhSSUZULTQwMTJdIC0gUHl0aG9uIFR3aXN0ZWQgaW1wbGVtZW50YXRpb24gdXNlcyBpbXBsZW1lbnRzLCBub3QgY29tcGF0aWJsZSB3aXRoIFB5MworICAgICogW1RIUklGVC00MDE0XSAtIGFsaWduIEMjIG1ldGEgZGF0YSBpbiBBc3NlbWJseUluZm8uY3MKKyAgICAqIFtUSFJJRlQtNDAxNV0gLSBGaXggd3JvbmdseSBzcGVsbGVkICJUaGlyZnQicworICAgICogW1RIUklGVC00MDE2XSAtIHRlc3RJbnNhbml0eSgpIGltcGwgZG9lcyBub3QgY29uZm9ybSB0byB0ZXN0IHNwZWMgaW4gVGhyaWZ0VGVzdC50aHJpZnQKKyAgICAqIFtUSFJJRlQtNDAyM10gLSBTa2lwIHVuZXhwZWN0ZWQgZmllbGQgdHlwZXMgb24gcmVhZC93cml0ZQorICAgICogW1RIUklGVC00MDI0XSAtIFNraXAoKSBzaG91bGQgdGhyb3cgb24gdW5rbm93biBkYXRhIHR5cGVzCisgICAgKiBbVEhSSUZULTQwMjZdIC0gVFNTTFNvY2tldCBkb2Vzbid0IHdvcmsgd2l0aCBQeXRob24gPCAyLjcuOQorICAgICogW1RIUklGVC00MDI5XSAtIEFjY2VsZXJhdGVkIHByb3RvY29scyBkbyBub3QgYnVpbGQgZnJvbSB0aHJpZnQtcHkgMC4xMC4wIG9uIFB5UEkKKyAgICAqIFtUSFJJRlQtNDAzMV0gLSBHbyBwbHVnaW4gZ2VuZXJhdGVzIGludmFsaWQgY29kZSBmb3IgbGlzdHMgb2YgdHlwZWRlZidlZCBidWlsdC1pbiB0eXBlcworICAgICogW1RIUklGVC00MDMzXSAtIERlZmF1bHQgYnVpbGQgV0lUSF9QTFVHSU49T04gZm9yIGFsbCBidWlsZHMgcmVzdWx0cyBpbiBwYWNrYWdpbmcgZXJyb3JzCisgICAgKiBbVEhSSUZULTQwMzRdIC0gQ01ha2UgZG9lc24ndCB3b3JrIHRvIGJ1aWxkIGNvbXBpbGVyIG9uIE1hY09TCisgICAgKiBbVEhSSUZULTQwMzZdIC0gQWRkIC5ORVQgQ29yZSBlbnZpcm9ubWVudC9idWlsZCBzdXBwb3J0IHRvIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAqIFtUSFJJRlQtNDAzOF0gLSBzb2NrZXQgY2hlY2s6IGNoZWNraW5nIGFuIHVuc2lnbmVkIG51bWJlciBhZ2FpbnN0ID49IDAgbmV2ZXIgZmFpbHMKKyAgICAqIFtUSFJJRlQtNDA0Ml0gLSBFeHRyYWN0aW9uRXJyb3Igd2hlbiB1c2luZyBhY2NlbGVyYXRlZCB0aHJpZnQgaW4gYSBtdWx0aXByb2Nlc3MgdGVzdAorICAgICogW1RIUklGVC00MDQzXSAtIHRocmlmdCBwZXJsIGRlYmlhbiBwYWNrYWdlIGlzIHBsYWNpbmcgZmlsZXMgaW4gdGhlIHdyb25nIHBsYWNlCisgICAgKiBbVEhSSUZULTQwNDRdIC0gQnVpbGQgam9iIDE3IGZhaWxpbmcgb24gZXZlcnkgcHVsbCByZXF1ZXN0OyBoc3BlYyBjb3JlIChoYXNrZWxsKSAyLjQgaXNzdWUKKyAgICAqIFtUSFJJRlQtNDA0Nl0gLSBNaW5HVyB3aXRoIGdjYyA2LjIgZG9lcyBub3QgY29tcGlsZSBvbiBXaW5kb3dzCisgICAgKiBbVEhSSUZULTQwNjBdIC0gVGhyaWZ0IHByaW50VG8gb3N0cmVhbSBvdmVybG9hZCBtZWNoYW5pc20gYnJlYWtzIGRvd24gd2hlbiB0eXBlcyBhcmUgbmVzdGVkCisgICAgKiBbVEhSSUZULTQwNjJdIC0gUmVtb3ZlIGRlYnVnIHByaW50IGZyb20gVFNlcnZpY2VDbGllbnQKKyAgICAqIFtUSFJJRlQtNDA2NV0gLSBEb2N1bWVudCBQZXJsIEZvcmtpbmdTZXJ2ZXIgc2lnbmFsIHJlc3RyaWN0aW9uIGltcG9zZWQgYnkgVEhSSUZULTM4NDggYW5kIHJlbW92ZSB1bm5lY2Vzc2FyeSBjb2RlCisgICAgKiBbVEhSSUZULTQwNjhdIC0gQSBjb2RlIGNvbW1lbnQgaW4gSmF2YSBTZXJ2ZXJTb2NrZXQgaXMgd3JvbmcgYXJvdW5kIGFjY2VwdCgpCisgICAgKiBbVEhSSUZULTQwNzNdIC0gZW51bSBmaWxlcyBhcmUgc3RpbGwgYmVpbmcgZ2VuZXJhdGVkIHdpdGggdW51c2VkIGltcG9ydHMKKyAgICAqIFtUSFJJRlQtNDA3Nl0gLSBBcHB2ZXlvciBidWlsZHMgZmFpbGluZyBiZWNhdXNlIGFudCAxLjkuOCB3YXMgcmVtb3ZlZCBmcm9tIGFwYWNoZSBzZXJ2ZXJzCisgICAgKiBbVEhSSUZULTQwNzddIC0gQUlfQUREUkNPTkZJRyByZWRlZmluZWQgYWZ0ZXIgcmVjZW50IGNoYW5nZSB0byBQbGF0Zm9ybVNvY2tldCBoZWFkZXIKKyAgICAqIFtUSFJJRlQtNDA3OV0gLSBHZW5lcmF0ZWQgcGVybCBjb2RlIHRoYXQgcmV0dXJucyBzdHJ1Y3R1cmVzIGZyb20gaW5jbHVkZWQgdGhyaWZ0IGZpbGVzIGlzIG1pc3NpbmcgYSBuZWNlc3NhcnkgdXNlIGNsYXVzZQorICAgICogW1RIUklGVC00MDg3XSAtIFNwdXJpb3VzIGV4Y2VwdGlvbiBkZXN0cm95aW5nIFRUaHJlYWRlZFNlcnZlciBiZWNhdXNlIG9mIGluY29ycmVjdCBqb2luKCkgY2FsbAorICAgICogW1RIUklGVC00MTAyXSAtIFRCdWZmZXJlZFRyYW5zcG9ydCBwZXJmb3JtYW5jZSBpc3N1ZSBzaW5jZSAwLjEwLjAKKyAgICAqIFtUSFJJRlQtNDEwNl0gLSBjb25jdXJyZW5jeV90ZXN0IGZhaWxzIHJhbmRvbWx5CisgICAgKiBbVEhSSUZULTQxMDhdIC0gY19nbGliIHRocmlmdCBzc2wgaGFzIG11bHRpcGxlIGJ1Z3MgYW5kIGRlcHJlY2F0ZWQgZnVuY3Rpb25zCisgICAgKiBbVEhSSUZULTQxMDldIC0gQ29uZmlndXJlIFNjcmlwdCB1c2VzIHN0cmluZyBjb21wYXJpc29uIGZvciB2ZXJzaW9ucworICAgICogW1RIUklGVC00MTI5XSAtIEMrKyBUTm9uYmxvY2tpbmdTZXJ2ZXIgZmQgbGVhayB3aGVuIGZhaWxpbmcgdG8gZGlzcGF0Y2ggbmV3IGNvbm5lY3Rpb25zCisgICAgKiBbVEhSSUZULTQxMzFdIC0gSmF2YXNjcmlwdCB3aXRoIFdlYlNvY2tldCBoYW5kbGVzIG9uZXdheSBtZXRob2RzIHdyb25nCisgICAgKiBbVEhSSUZULTQxMzRdIC0gRml4IHJlbWFpbmluZyB1bmRlZmluZWQgYmVoYXZpb3IgaW52YWxpZCB2cHRyIGNhc3RzCisgICAgKiBbVEhSSUZULTQxNDBdIC0gVXNlIG9mIG5vbi10aHJlYWQtc2FmZSBmdW5jdGlvbiBnbXRpbWUoKQorICAgICogW1RIUklGVC00MTQxXSAtIEluc3RhbGxhdGlvbiBvZiBoYXhlIGluIGRvY2tlciBmaWxlcyByZWZlcnMgdG8gYSByZWRpcmVjdCBsaW5rIGFuZCBmYWlscworICAgICogW1RIUklGVC00MTQ3XSAtIFJ1c3Q6IHByb3RvY29sIHNob3VsZCBhY2NlcHQgdHJhbnNwb3J0cyB3aXRoIG5vbi1zdGF0aWMgbGlmZXRpbWUKKyAgICAqIFtUSFJJRlQtNDE0OF0gLSBbbWF2ZW4tdGhyaWZ0LXBsdWdpbl0gY29tcGlsZSBlcnJvciB3aGlsZSBpbXBvcnQgYSB0aHJpZnQgaW4gZGVwZW5kZW5jeSBqYXIgZmlsZS4KKyAgICAqIFtUSFJJRlQtNDE0OV0gLSBTeXN0ZW0ub3V0IHBvbGx1dGVzIGxvZyBmaWxlcyAKKyAgICAqIFtUSFJJRlQtNDE1NF0gLSBQSFAgY2xvc2UoKSBvZiBhIFRTb2NrZXQgbmVlZHMgdG8gY2xvc2UgYW55IHR5cGUgb2Ygc29ja2V0CisgICAgKiBbVEhSSUZULTQxNThdIC0gbWlub3IgaXNzdWUgaW4gUkVBRE1FLU1TWVMyLm1kCisgICAgKiBbVEhSSUZULTQxNTldIC0gQnVpbGRpbmcgdGVzdHMgZmFpbHMgb24gTVNZUzIgKE1pbkdXNjQpIGR1ZSB0byBhIChzbWFsbD8pIGxpbmtlciBlcnJvcgorICAgICogW1RIUklGVC00MTYwXSAtIFROb25ibG9ja2luZyBzZXJ2ZXIgZml4IHVzZSBvZiBjbG9zZWQvZnJlZWQgY29ubmVjdGlvbnMKKyAgICAqIFtUSFJJRlQtNDE2MV0gLSBUTm9uQmxvY2tpbmcgc2VydmVyIHVzaW5nIHVuaW5pdGlhbGl6ZWQgZXZlbnQgaW4gZXJyb3IgcGF0aHMKKyAgICAqIFtUSFJJRlQtNDE2Ml0gLSBUTm9uQmxvY2tpbmcgaGFuZGxpbmcgb2YgVFNvY2tldHMgaW4gZXJyb3Igc3RhdGUgaXMgaW5jb3JyZWN0IGFmdGVyIGZkIGlzIGNsb3NlZAorICAgICogW1RIUklGVC00MTY0XSAtIENvcmUgaW4gVFNTTFNvY2tldCBjbGVhbnVwT3BlblNTTCB3aGVuIGRlc3Ryb3lpbmcgYSBtdXRleCB1c2VkIGJ5IG9wZW5zc2wKKyAgICAqIFtUSFJJRlQtNDE2NV0gLSBDKysgYnVpbGQgaGFzIG1hbnkgd2FybmluZ3MgdW5kZXIgYysrMDMgZHVlIHRvIHJlY2VudCBjaGFuZ2VzLCBjbWFrZSBuZWVkcyBiZXR0ZXIgcGxhdGZvcm0taW5kZXBlbmRlbnQgbGFuZ3VhZ2UgbGV2ZWwgY29udHJvbAorICAgICogW1RIUklGVC00MTY2XSAtIFJlY2VudCBmaXggdG8gcmVtb3ZlIGJvb3N0OjpsZXhpY2FsX2Nhc3QgdXNhZ2UgYnJva2UgVlMyMDEwCisgICAgKiBbVEhSSUZULTQxNjddIC0gTWlzc2luZyBjb21waWxlIGZsYWcKKyAgICAqIFtUSFJJRlQtNDE3MF0gLSBTdXBwb3J0IGx1YSA1LjEgb3IgZWFybGllciBwcm9wZXJseSBmb3Igb2JqZWN0IGxlbmd0aCBkZXRlcm1pbmF0aW9uCisgICAgKiBbVEhSSUZULTQxNzJdIC0gbm9kZS5qcyB0dXRvcmlhbCBjbGllbnQgZG9lcyBub3QgaW1wb3J0IGFzc2VydCwgY29ubmVjdGlvbiBpc3N1ZXMgYXJlIG5vdCBoYW5kbGVkIHByb3Blcmx5CisgICAgKiBbVEhSSUZULTQxNzddIC0gSmF2YSBjb21waWxlciBwcm9kdWNlcyBkZWVwIGNvcHkgY29uc3RydWN0b3IgdGhhdCBjb3VsZCBtYWtlIHNoYWxsb3cgY29weSBpbnN0ZWFkCisgICAgKiBbVEhSSUZULTQxODRdIC0gQnVpbGRpbmcgb24gQXBwdmV5b3I6IGludmFsaWQgZXNjYXBlIHNlcXVlbmNlIFxMCisgICAgKiBbVEhSSUZULTQxODVdIC0gZmIzMDMgY291bnRlciBlbmNvZGluZyBmaXgKKyAgICAqIFtUSFJJRlQtNDE4OV0gLSBGcmFtZWQvYnVmZmVyZWQgdHJhbnNwb3J0IERpc3Bvc2UoKSBkb2VzIG5vdCBkaXNwb3NlIHRoZSBuZXN0ZWQgdHJhbnNwb3J0CisgICAgKiBbVEhSSUZULTQxOTNdIC0gTG93ZXIgdGhlIGRlZmF1bHQgbWF4UmVhZEJ1ZmZlckJ5dGVzIGZvciBub24tYmxvY2tpbmcgc2VydmVycworICAgICogW1RIUklGVC00MTk1XSAtIENvbXBpbGF0aW9uIHRvIEdPIHByb2R1Y2VzIGJyb2tlbiBjb2RlCisgICAgKiBbVEhSSUZULTQxOTZdIC0gQ2Fubm90IGdlbmVyYXRlIHJlY3Vyc2l2ZSBSdXN0IHR5cGVzCisgICAgKiBbVEhSSUZULTQyMDRdIC0gdHlwbyBpbiBjb21wYWN0IHNwZWMKKyAgICAqIFtUSFJJRlQtNDIwNl0gLSBTdHJpbmdzIGluIGNvbnRhaW5lciBmaWVsZHMgYXJlIG5vdCBkZWNvZGVkIHByb3Blcmx5IHdpdGggcHk6ZHluYW1pYyBhbmQgcHk6dXRmOHN0cmluZ3MKKyAgICAqIFtUSFJJRlQtNDIwOF0gLSBDIyBOYW1lZFBpcGVzU2VydmVyIG5vdCByZWFsbHkgd29ya2luZyBpbiBzb21lIHNjZW5hcmlvcworICAgICogW1RIUklGVC00MjExXSAtIEZpeCBHRXJyb3IgZ2xpYiBtYW5hZ2VtZW50IHVuZGVyIFRocmlmdAorICAgICogW1RIUklGVC00MjEyXSAtIGNfZ2xpYiBmbHVzaCB0cmllcyB0byBjbG9zZSBTU0wgZXZlbiBpZiBzb2NrZXQgaXMgaW52YWxpZAorICAgICogW1RIUklGVC00MjEzXSAtIFRyYXZpcyBidWlsZCBmYWlscyBhdCBjdXJsIC1zU0wgaHR0cHM6Ly93d3cubnBtanMuY29tL2luc3RhbGwuc2ggfCBzaAorICAgICogW1RIUklGVC00MjE1XSAtIEdvbGFuZyBUVHJhbnNwb3J0RmFjdG9yeSBQYXR0ZXJuIFNxdWVsY2hlcyBFcnJvcnMKKyAgICAqIFtUSFJJRlQtNDIxNl0gLSBHb2xhbmcgSHR0cCBDbGllbnRzIERvIE5vdCBSZXNwZWN0IFVzZXIgT3B0aW9ucworICAgICogW1RIUklGVC00MjE4XSAtIFNldCBUQ1BfTk9ERUxBWSBmb3IgUEhQIGNsaWVudCBzb2NrZXQKKyAgICAqIFtUSFJJRlQtNDIxOV0gLSBHb2xhbmcgSFRUUCBjbGllbnRzIGNyZWF0ZWQgd2l0aCBOaWwgYnVmZmVyCisgICAgKiBbVEhSSUZULTQyMzFdIC0gVEpTT05Qcm90b2NvbCB0aHJvd3MgdW5leHBlY3RlZCBub24tVGhyaWZ0LWV4Y2VwdGlvbiBvbiBudWxsIHN0cmluZ3MKKyAgICAqIFtUSFJJRlQtNDIzMl0gLSAuL2NvbmZpZ3VyZSBkb2VzIGJhZCBhbnQgdmVyc2lvbiBjaGVjaworICAgICogW1RIUklGVC00MjM0XSAtIFRyYXZpcyBidWlsZCBmYWlscyBjcm9zcyBsYW5ndWFnZSB0ZXN0cyB3aXRoICJVbnN1cHBvcnRlZCBzZWN1cml0eSBwcm90b2NvbCB0eXBlIgorICAgICogW1RIUklGVC00MjM3XSAtIEdvIFRTZXJ2ZXJTb2NrZXQgUmFjZSBDb25kaXRpb25zCisgICAgKiBbVEhSSUZULTQyNDBdIC0gR28gVFNpbXBsZVNlcnZlciBkb2VzIG5vdCBjbG9zZSBwcm9wZXJseQorICAgICogW1RIUklGVC00MjQzXSAtIEdvIFRTaW1wbGVTZXJ2ZXIgcmFjZSBvbiB3YWl0IGluIFN0b3AoKSBtZXRob2QKKyAgICAqIFtUSFJJRlQtNDI0NV0gLSBHb2xhbmcgVEZyYW1lZFRyYW5zcG9ydCdzIHdyaXRlQnVmZmVyIGluY3JlYXNlcyBpZiB3cml0ZXMgdG8gdHJhbnNwb3J0IGZhaWxlZAorICAgICogW1RIUklGVC00MjQ2XSAtIFNlcXVlbmNlIG51bWJlciBtaXNtYXRjaCBvbiBtdWx0aXBsZXhlZCBjbGllbnRzCisgICAgKiBbVEhSSUZULTQyNDddIC0gQ29tcGlsZSBmYWlscyB3aXRoIG9wZW5zc2wgMS4xCisgICAgKiBbVEhSSUZULTQyNDhdIC0gQ29tcGlsZSBmYWlscyAtIHN0cm5jcHksIG1lbWNtcCwgbWVtc2V0IG5vdCBkZWNsYXJlZCBpbiBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU1NMU29ja2V0LmNwcAorICAgICogW1RIUklGVC00MjUxXSAtIEphdmEgRXBvbGwgU2VsZWN0b3IgQnVnCisgICAgKiBbVEhSSUZULTQyNTddIC0gVHlwZXNjcmlwdCBhc3luYyBjYWxsYmFja3MgZG8gbm90IHByb3ZpZGUgdGhlIGNvcnJlY3QgdHlwZXMKKyAgICAqIFtUSFJJRlQtNDI1OF0gLSBCb29zdC9zdGQgdGhyZWFkIHdyYXBwaW5nIGZhdWx0aW5lc3MKKyAgICAqIFtUSFJJRlQtNDI2MF0gLSBHbyBjb250ZXh0IGdlbmVyYXRpb24gaXNzdWUuIENvbnRleHQgaXMgcGFyYW1ldGVyIGluIEludGVyZmFjZSBub3QgaW4gaW1wbGVtZW50YXRpb24KKyAgICAqIFtUSFJJRlQtNDI2MV0gLSBHbyBjb250ZXh0IGdlbmVyYXRpb24gaXNzdWU6IGJyZWFraW5nIGNoYW5nZSBpbiBnZW5lcmF0ZWQgY29kZSByZWdhcmRpbmcgdGhyaWZ0LlRQcm9jZXNzb3JGdW5jdGlvbiBpbnRlcmZhY2UKKyAgICAqIFtUSFJJRlQtNDI2Ml0gLSBJbnZhbGlkIGJpbmRpbmcgdG8gSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2U2NCgpIHdpdGggNjQtYml0IHRhcmdldHMKKyAgICAqIFtUSFJJRlQtNDI2M10gLSBGaXggdXNlIGFmdGVyIGZyZWUgYnVnIGZvciB0aHJvd24gZXhjZXB0aW9ucworICAgICogW1RIUklGVC00MjY2XSAtIEVybGFuZyBsaWJyYXJ5IHRocm93cyBkdXJpbmcgc2tpcHBpbmcgZmllbGRzIG9mIGNvbXBvc2l0ZSB0eXBlIChtYXBzLCBsaXN0cywgc3RydWN0cywgc2V0cykKKyAgICAqIFtUSFJJRlQtNDI2OF0gLSBFcmxhbmcgbGlicmFyeSBlbWl0cyBkZWJ1Z2dpbmcgb3V0cHV0IGluIHRyYW5zcG9ydCBsYXllcgorICAgICogW1RIUklGVC00MjczXSAtIGVybGFuZzpub3cvMDogRGVwcmVjYXRlZCBCSUYuIAorICAgICogW1RIUklGVC00Mjc0XSAtIFB5dGhvbiBmZWF0dXJlIHRlc3RzIGZvciBTU0wvVExTIGZhaWxpbmcKKyAgICAqIFtUSFJJRlQtNDI3OV0gLSBXcm9uZyBwYXRoIGluIGluY2x1ZGUgZGlyZWN0aXZlIGluIGdlbmVyYXRlZCBUaHJpZnQgc291cmNlcworICAgICogW1RIUklGVC00MjgzXSAtIFROYW1lZFBpcGVTZXJ2ZXIgcmFjZSBjb25kaXRpb24gaW4gaW50ZXJydXB0CisgICAgKiBbVEhSSUZULTQyODRdIC0gRmlsZSBjb250YWlucyBhIE5CU1A6IGxpYi9ub2RlanMvbGliL3RocmlmdC93ZWJfc2VydmVyLmpzCisgICAgKiBbVEhSSUZULTQyOTBdIC0gQyMgbnVsbGFibGUgb3B0aW9uIGdlbmVyYXRlcyBpbnZhbGlkIGNvZGUgZm9yIG5vbi1yZXF1aXJlZCBlbnVtIGZpZWxkIHdpdGggZGVmYXVsdCB2YWx1ZQorICAgICogW1RIUklGVC00MjkyXSAtIFRpbWVyTWFuYWdlcjo6cmVtb3ZlKCkgaXMgbm90IGltcGxlbWVudGVkCisgICAgKiBbVEhSSUZULTQzMDddIC0gTWFrZSBzc2wtb3BlbiB0aW1lb3V0IGVmZmVjdGl2ZSBpbiBnb2xhbmcgY2xpZW50CisgICAgKiBbVEhSSUZULTQzMTJdIC0gRXJsYW5nIGNsaWVudCBjYW5ub3QgY29ubmVjdCB0byBQeXRob24gc2VydmVyOiBleGNlcHRpb24gZXJyb3I6IGVjb25ucmVmdXNlZAorICAgICogW1RIUklGVC00MzEzXSAtIFByb2dyYW0gY29kZSBvZiB0aGUgRXJsYW5nIHR1dG9yaWFsIGZpbGVzIGNvbnRhaW4gc3ludGF4IGVycm9ycworICAgICogW1RIUklGVC00MzE2XSAtIFRCeXRlQnVmZmVyLmphdmEgd2lsbCByZWFkIHRvbyBtdWNoIGRhdGEgaWYgYSBwcmV2aW91cyByZWFkIHJldHVybnMgZmV3ZXIgYnl0ZXMgdGhhbiByZXF1ZXN0ZWQKKyAgICAqIFtUSFJJRlQtNDMxOV0gLSBjb21tYW5kIGxpbmUgc3dpdGNoIGZvciAiZXZodHRwIiBpbmNvcnJlY3RseSByZXNvbHZlZCB0byBhbm9uIHBpcGVzCisgICAgKiBbVEhSSUZULTQzMjNdIC0gcmFuZ2UgY2hlY2sgZXJyb3JzIG9yIE5QRSBpbiBlZGdlIGNhc2VzCisgICAgKiBbVEhSSUZULTQzMjRdIC0gZmllbGQgbmFtZXMgY2FuIGNvbmZsaWN0IHdpdGggbG9jYWwgdmFycyBpbiBnZW5lcmF0ZWQgY29kZQorICAgICogW1RIUklGVC00MzI4XSAtIFRyYXZpcyBDSSBidWlsZHMgYXJlIHRpbWluZyBvdXQgKGpvYiAxKSBhbmQgaGF4ZSBidWlsZHMgYXJlIGZhaWxpbmcgc2luY2UgOS8xMQorICAgICogW1RIUklGVC00MzI5XSAtIGNfZ2xpYiBEb2Vzbid0IGhhdmUgYSBtdWx0aXBsZXhlZCBwcm9jZXNzb3IKKyAgICAqIFtUSFJJRlQtNDMzMV0gLSBDKys6IFRTU0xTb2NrZXRzIGJ1ZyBpbiBoYW5kbGluZyBodWdlIG1lc3NhZ2VzLCBidWcgaW4gaGFuZGxpbmcgcG9sbGluZworICAgICogW1RIUklGVC00MzMyXSAtIEJpbmFyeSBwcm90b2NvbCBoYXMgbWVtb3J5IGxlYWtzCisgICAgKiBbVEhSSUZULTQzMzRdIC0gUGVybCBpbmRlbnRhdGlvbiBpbmNvcnJlY3Qgd2hlbiBkZWZhdWx0aW5nIGZpZWxkIGF0dHJpYnV0ZSB0byBhIHN0cnVjdAorICAgICogW1RIUklGVC00MzM5XSAtIFRocmlmdCBGcmFtZWQgVHJhbnNwb3J0IGluIEVybGFuZyBjcmFzaGVzIHNlcnZlciB3aGVuIGNsaWVudCBkaXNjb25uZWN0cworICAgICogW1RIUklGVC00MzQwXSAtIEVybGFuZyBmaXggYSBjcmFzaCBvbiBjbGllbnQgY2xvc2UKKyAgICAqIFtUSFJJRlQtNDM1NV0gLSBKYXZhc2NyaXB0IGluZGVudGF0aW9uIGluY29ycmVjdCB3aGVuIGRlZmF1bHRpbmcgZmllbGQgYXR0cmlidXRlIHRvIGEgc3RydWN0CisgICAgKiBbVEhSSUZULTQzNTZdIC0gdGhyaWZ0X3Byb3RvY29sIGNhbGwgVHJhbnNwb3J0IGNhdXNlIFNlZ21lbnRhdGlvbiBmYXVsdAorICAgICogW1RIUklGVC00MzU5XSAtIEhheGUgY29tcGlsZXIgbG9va3MgbGlrZSBpdCBpcyBwcm9kdWNpbmcgaW5jb3JyZWN0IGNvZGUgZm9yIG1hcCBvciBzZXQga2V5IHRoYXQgaXMgYmluYXJ5IHR5cGUKKyAgICAqIFtUSFJJRlQtNDM2Ml0gLSBNaXNzaW5nIHNpemUtY2hlY2sgY2FuIGxlYWQgdG8gaHVnZSBtZW1vcnkgYWxsb2NhdGlvbgorICAgICogW1RIUklGVC00MzY0XSAtIFdlYnNpdGUgY29udHJpYnV0aW5nIGd1aWRlIGVycm9uZW91c2x5IHJlY29tbWVuZHMgc3VibWl0dGluZyBwYXRjaGVzIGluIEpJUkEKKyAgICAqIFtUSFJJRlQtNDM2NV0gLSBQZXJsIGdlbmVyYXRlZCBjb2RlIHVzZXMgaW5kaXJlY3Qgb2JqZWN0IHN5bnRheCwgd2hpY2ggb2NjYXNpb25hbGx5IGNhdXNlcyBjb21waWxhdGlvbiBlcnJvcnMuCisgICAgKiBbVEhSSUZULTQzNjddIC0gcHl0aG9uIFRQcm9jZXNzb3IucHJvY2VzcyBpcyBtaXNzaW5nICJzZWxmIgorICAgICogW1RIUklGVC00MzcwXSAtIFVidW50dSBBcnRmdWwgY3BwY2hlY2sgYW5kIGZsYWtlOCBhcmUgbW9yZSBzdHJpbmdlbnQgYW5kIGNhdXNpbmcgU0NBIGJ1aWxkIGpvYiBmYWlsdXJlcworICAgICogW1RIUklGVC00MzcyXSAtIFBpcGUgd3JpdGUgb3BlcmF0aW9ucyBhY3Jvc3MgYSBuZXR3b3JrIGFyZSBsaW1pdGVkIHRvIDY1LDUzNSBieXRlcyBwZXIgd3JpdGUuIAorICAgICogW1RIUklGVC00Mzc0XSAtIGNhbm5vdCBsb2FkIHRocmlmdF9wcm90b2NvbCBkdWUgdG8gdW5kZWZpbmVkIHN5bWJvbDogX1pUVk4xMF9fY3h4YWJpdjEyMF9fc2lfY2xhc3NfdHlwZV9pbmZvRQorICAgICogW1RIUklGVC00Mzc1XSAtIFRNZW1vcnkgdGhyb3cgYmFkX2FsbG9jIGR1ZSB0byBjb3VudGVyIG92ZXJmbG93CisgICAgKiBbVEhSSUZULTQzNzZdIC0gQ292ZXJpdHkgaGlnaCBpbXBhY3QgaXNzdWUgcmVzb2x1dGlvbgorICAgICogW1RIUklGVC00Mzc3XSAtIGhheGUuIHNvY2tldCBoYW5kbGVzIGxlYWsgaW4gVFNpbXBsZVNlcnZlcgorICAgICogW1RIUklGVC00MzgxXSAtIFdyb25nIGlzc2V0IGJpdGZpZWxkIHZhbHVlIGFmdGVyIHRyYW5zbWlzc2lvbgorICAgICogW1RIUklGVC00Mzg1XSAtIEdvIHJlbW90ZSBjbGllbnQgLXUgZmxhZyBpcyBicm9rZW4KKyAgICAqIFtUSFJJRlQtNDM5Ml0gLSBjb21waWxlci8uLi4uL3BsdWdpbi50aHJpZnQgc3RydWN0cyBtaXMtb3JkZXJlZCBibG93cyB1cCBvY2FtbCBnZW5lcmF0b3IKKyAgICAqIFtUSFJJRlQtNDM5NV0gLSBVbmFibGUgdG8gYnVpbGQgaW4gdGhlIHVidW50dS14ZW5pYWwgZG9ja2VyIGltYWdlOiBjbGFwIDIuMjggcmVxdWlyZXMgUnVzdCAxLjIwCisgICAgKiBbVEhSSUZULTQzOTZdIC0gaW5jb25zaXN0ZW50IChvciBwbGFpbiB3cm9uZykgdmVyc2lvbiBudW1iZXJzIGluIG1hc3Rlci90cnVuayAKKworIyMgRG9jdW1lbnRhdGlvbgorICAgICogW1RIUklGVC00MTU3XSAtIG91dGRhdGVkIHJlYWRtZSBhYm91dCBIYXhlIGluc3RhbGxhdGlvbiBvbiBMaW51eAorCisjIyBJbXByb3ZlbWVudAorICAgICogW1RIUklGVC0xMDVdIC0gbWFrZSBhIHRocmlmdF9zcGVjIGZvciBhIHN0cnVjdHVyZXMgd2l0aCBuZWdhdGl2ZSB0YWdzCisgICAgKiBbVEhSSUZULTI4MV0gLSBDb2NvYSBsaWJyYXJ5IGNvZGUgbmVlZHMgY29tbWVudHMsIGJhZGx5CisgICAgKiBbVEhSSUZULTc3NV0gLSBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudHMgZm9yIFBlcmwKKyAgICAqIFtUSFJJRlQtMjIyMV0gLSBHZW5lcmF0ZSBjKysgY29kZSB3aXRoIHN0ZDo6c2hhcmVkX3B0ciBpbnN0ZWFkIG9mIGJvb3N0OjpzaGFyZWRfcHRyLgorICAgICogW1RIUklGVC0yMzY0XSAtIE9DYW1sOiBVc2UgT2FzaXMgZXhjbHVzaXZlbHkgZm9yIGJ1aWxkIHByb2Nlc3MKKyAgICAqIFtUSFJJRlQtMjUwNF0gLSBUTXVsdGlwbGV4ZWRQcm9jZXNzb3Igc2hvdWxkIGFsbG93IHJlZ2lzdGVyaW5nIGRlZmF1bHQgcHJvY2Vzc29yIGNhbGxlZCBpZiBubyBzZXJ2aWNlIG5hbWUgaXMgcHJlc2VudAorICAgICogW1RIUklGVC0zMjA3XSAtIEVuYWJsZSBidWlsZCB3aXRoIE9wZW5TU0wgMS4xLjAgc2VyaWVzCisgICAgKiBbVEhSSUZULTMyNzJdIC0gUGVybCBTU0wgQXV0aGVudGljYXRpb24gU3VwcG9ydAorICAgICogW1RIUklGVC0zMzU3XSAtIEdlbmVyYXRlIEVudW1TZXQvRW51bU1hcCB3aGVyZSBlbGVtZW50cy9rZXlzIGFyZSBlbnVtcworICAgICogW1RIUklGVC0zMzY5XSAtIEltcGxlbWVudCBTU0wvVExTIHN1cHBvcnQgb24gQyB3aXRoIGNfZ2xpYgorICAgICogW1RIUklGVC0zNDY3XSAtIEdvIE1hcHMgZm9yIFRocmlmdCBTZXRzIFNob3VsZCBIYXZlIFZhbHVlcyBvZiBUeXBlIHN0cnVjdHt9IAorICAgICogW1RIUklGVC0zNTgwXSAtIFRIZWFkZXIgZm9yIEhhc2tlbGwKKyAgICAqIFtUSFJJRlQtMzYyN10gLSBNaXNzaW5nIGJhc2ljIGNvZGUgc3R5bGUgY29uc2lzdGVuY3kgb2YgSmF2YVNjcmlwdC4KKyAgICAqIFtUSFJJRlQtMzcwNl0gLSBUaGVyZSdzIG5vIHN1cHBvcnQgZm9yIE11bHRpcGxleGVkIHByb3RvY29sIG9uIGNfZ2xpYiBsaWJyYXJ5CisgICAgKiBbVEhSSUZULTM3NjZdIC0gQWRkIGdldFVuZGVybHlpbmdUcmFuc3BvcnQoKSB0byBUWmxpYlRyYW5zcG9ydAorICAgICogW1RIUklGVC0zNzc2XSAtIEdvIGNvZGUgZnJvbSBtdWx0aXBsZSB0aHJpZnQgZmlsZXMgd2l0aCB0aGUgc2FtZSBuYW1lc3BhY2UKKyAgICAqIFtUSFJJRlQtMzgyM10gLSBFc2NhcGUgZG9jdW1lbnRhdGlvbiB3aGlsZSBnZW5lcmF0aW5nIG5vbiBlc2NhcGVkIGRvY3VtZXRhdGlvbgorICAgICogW1RIUklGVC0zODU0XSAtIGFsbG93IHVzZXJzIHRvIGNsZWFyIHJlYWQgYnVmZmVycworICAgICogW1RIUklGVC0zODU5XSAtIFVuaXggRG9tYWluIFNvY2tldCBTdXBwb3J0IGluIE9iamVjdGl2ZS1DCisgICAgKiBbVEhSSUZULTM5MjFdIC0gQysrIGNvZGUgc2hvdWxkIHByaW50IGVudW1zIGFzIHN0cmluZ3MKKyAgICAqIFtUSFJJRlQtMzkyNl0gLSBUaGVyZSBzaG91bGQgYmUgYW4gZXJyb3IgZW1pdHRlZCB3aGVuIGh0dHAgc3RhdHVzIGNvZGUgaXMgbm90IDIwMCAKKyAgICAqIFtUSFJJRlQtNDAwN10gLSBNaWNyby1vcHRpbWl6YXRpb24gb2YgVFRyYW5zcG9ydC5weQorICAgICogW1RIUklGVC00MDQwXSAtIEFkZCByZWFsIGNhdXNlIG9mIFROb25ibG9ja2luZ1NlcnZlclNvY2tldCBlcnJvciB0byBleGNlcHRpb24KKyAgICAqIFtUSFJJRlQtNDA2NF0gLSBVcGRhdGUgbm9kZSBsaWJyYXJ5IGRlcGVuZGVuY2llcworICAgICogW1RIUklGVC00MDY5XSAtIEFsbCBwZXJsIHBhY2thZ2VzIHNob3VsZCBoYXZlIHByb3BlciBuYW1lc3BhY2UsIHZlcnNpb24gc3ludGF4LCBhbmQgdXNlIHByb3BlciB0aHJpZnQgZXhjZXB0aW9ucworICAgICogW1RIUklGVC00MDcxXSAtIENvbnNvbGlkYXRlIHRoZSBUcmF2aXMgQ0kgam9icyB3aGVyZSBwb3NzaWJsZSB0byBwdXQgbGVzcyBzdHJlc3Mgb24gdGhlIEFwYWNoZSBGb3VuZGF0aW9uJ3MgYWxsb2NhdGlvbiBvZiBDSSBidWlsZCBzbGF2ZXMKKyAgICAqIFtUSFJJRlQtNDA3Ml0gLSBBZGQgdGhlIHBvc3NpYmlsaXR5IHRvIHNlbmQgY3VzdG9tIGhlYWRlcnMgaW4gVEN1cmxDbGllbnQKKyAgICAqIFtUSFJJRlQtNDA3NV0gLSBCZXR0ZXIgTWluR1cgc3VwcG9ydCBmb3IgaGVhZGVycy1vbmx5IGJvb3N0ICh3aXRob3V0IHRocmVhZCBsaWJyYXJ5KQorICAgICogW1RIUklGVC00MDgxXSAtIFByb3ZpZGUgYSBNaW5HVyA2NC1iaXQgQXBwdmV5b3IgQ0kgYnVpbGQgZm9yIGJldHRlciBwdWxsIHJlcXVlc3QgdmFsaWRhdGlvbgorICAgICogW1RIUklGVC00MDg0XSAtIEltcHJvdmUgU1NMIHNlY3VyaXR5IGluIHRocmlmdCBieSBhZGRpbmcgYSBtYWtlIGNyb3NzIGNsaWVudCB0aGF0IGNoZWNrcyB0byBtYWtlIHN1cmUgU1NMdjMgcHJvdG9jb2wgY2Fubm90IGJlIG5lZ290aWF0ZWQKKyAgICAqIFtUSFJJRlQtNDA5NV0gLSBBZGQgbXVsdGlwbGV4ZWQgcHJvdG9jb2wgdG8gVHJhdmlzIENJIGZvciBtYWtlIGNyb3NzCisgICAgKiBbVEhSSUZULTQwOTldIC0gQXV0by1kZXJpdmUgSGFzaCBmb3IgZ2VuZXJhdGVkIFJ1c3Qgc3RydWN0cworICAgICogW1RIUklGVC00MTEwXSAtIFRoZSBkZWJpYW4gYnVpbGQgZmlsZXMgZG8gbm90IHByb2R1Y2UgYSAiLWRiZyIgcGFja2FnZSBmb3IgZGVidWcgc3ltYm9scyBvZiBsaWJ0aHJpZnQwCisgICAgKiBbVEhSSUZULTQxMTRdIC0gU3BhY2UgYWZ0ZXIgJy8vLycgaW4gZG9jIGNvbW1lbnRzCisgICAgKiBbVEhSSUZULTQxMjZdIC0gVmFsaWRhdGUgb2JqZWN0cyBpbiBwaHAgZXh0ZW5zaW9uCisgICAgKiBbVEhSSUZULTQxMzBdIC0gRW5zdXJlIEFwYWNoZSBIdHRwIGNvbm5lY3Rpb24gaXMgcmVsZWFzZWQgYmFjayB0byBwb29sIGFmdGVyIHVzZQorICAgICogW1RIUklGVC00MTUxXSAtIFRocmlmdCBNdXRleCBDb250ZW50aW9uIFByb2ZpbGluZyAocHRocmVhZHMpIHNob3VsZCBiZSBkaXNhYmxlZCBieSBkZWZhdWx0CisgICAgKiBbVEhSSUZULTQxNzZdIC0gSW1wbGVtZW50IGEgdGhyZWFkZWQgYW5kIHRocmVhZHBvb2wgc2VydmVyIHR5cGUgZm9yIFJ1c3QKKyAgICAqIFtUSFJJRlQtNDE4M10gLSBOYW1lZCBwaXBlIGNsaWVudCBibG9ja3MgZm9yZXZlciBvbiBPcGVuKCkgd2hlbiB0aGVyZSBpcyBubyBzZXJ2ZXIgYXQgdGhlIG90aGVyIGVuZAorICAgICogW1RIUklGVC00MTkwXSAtIGltcHJvdmUgQyMgVFRocmVhZFBvb2xTZXJ2ZXIgZGVmYXVsdHMKKyAgICAqIFtUSFJJRlQtNDE5N10gLSBJbXBsZW1lbnQgdHJhbnNwYXJlbnQgZ3ppcCBjb21wcmVzc2lvbiBmb3IgSFRUUCB0cmFuc3BvcnQKKyAgICAqIFtUSFJJRlQtNDE5OF0gLSBSdWJ5IHNob3VsZCBsb2cgVGhyaWZ0IGludGVybmFsIGVycm9ycyB0byBnbG9iYWwgbG9nZ2VyCisgICAgKiBbVEhSSUZULTQyMDNdIC0gdGhyaWZ0IHNlcnZlciBzdG9wIGdyYWNlZnVsbHkKKyAgICAqIFtUSFJJRlQtNDIwNV0gLSBjX2dsaWIgaXMgbm90IGxpbmtpbmcgYWdhaW5zdCBnbGliICsgZ29iamVjdAorICAgICogW1RIUklGVC00MjA5XSAtIHdhcm5pbmcgQ1MwNDE0IGluIFRbVExTXVNlcnZlclNvY2tldC5jcworICAgICogW1RIUklGVC00MjEwXSAtIGluY2x1ZGUgVGhyaWZ0LjQ1LmNzcHJvaiBpbnRvIENJIHJ1bnMgCisgICAgKiBbVEhSSUZULTQyMTddIC0gSHR0cENsaWVudCBzaG91bGQgc3VwcG9ydCBnemlwIGFuZCBkZWZsYXRlCisgICAgKiBbVEhSSUZULTQyMjJdIC0gU3VwcG9ydCBVbml4IERvbWFpbiBTb2NrZXRzIGluIEdvbGFuZyBUU2VydmVyU29ja2V0CisgICAgKiBbVEhSSUZULTQyMzNdIC0gTWFrZSBUSHNIYVNlcnZlci5pbnZva2VyIGF2YWlsYWJsZSAoZ2V0IG1ldGhvZCBvbmx5KSBpbiBpbmhlcml0ZWQgY2xhc3NlcworICAgICogW1RIUklGVC00MjM2XSAtIFN1cHBvcnQgY29udGV4dCBpbiBnbyBnZW5lcmF0ZWQgY29kZS4KKyAgICAqIFtUSFJJRlQtNDIzOF0gLSBKU09OIGdlbmVyYXRvcjogbWFrZSBhbm5vdGF0aW9uLWF3YXJlCisgICAgKiBbVEhSSUZULTQyNjldIC0gRG9uJ3QgYXBwZW5kICcuJyB0byBFcmxhbmcgbmFtZXNwYWNlIGlmIGl0IGVuZHMgaW4gJ18nLgorICAgICogW1RIUklGVC00MjcwXSAtIEdlbmVyYXRlIEVybGFuZyBtYXBwaW5nIGZ1bmN0aW9ucyBmb3IgY29uc3QgbWFwcyBhbmQgbGlzdHMKKyAgICAqIFtUSFJJRlQtNDI3NV0gLSBBZGQgc3VwcG9ydCBmb3Igem9wZS5pbnRlcmZhY2Ugb25seSwgYXBhcnQgZnJvbSB0d2lzdGVkIHN1cHBvcnQuCisgICAgKiBbVEhSSUZULTQyODVdIC0gUHVsbCBnZW5lcmF0ZWQgc2VuZC9yZWN2IGludG8gbGlicmFyeSB0byBhbGxvdyBiZWhhdmlvdXIgdG8gYmUgY3VzdG9taXNlZAorICAgICogW1RIUklGVC00Mjg3XSAtIEFkZCBjKysgY29tcGlsZXIgIm5vX3NrZWxldG9uIiBmbGFnIG9wdGlvbgorICAgICogW1RIUklGVC00Mjg4XSAtIEltcGxlbWVudCBsb2dnaW5nIGxldmVscyBwcm9wZXJseSBmb3Igbm9kZS5qcworICAgICogW1RIUklGVC00Mjk1XSAtIFJlZnJlc2ggdGhlIERvY2tlciBpbWFnZSBmaWxlIHN1aXRlIGZvciBVYnVudHUsIERlYmlhbiwgYW5kIENlbnRPUworICAgICogW1RIUklGVC00MzA1XSAtIEVtaXQgZGRvYyBmb3IgZ2VuZXJhdGVkIGl0ZW1zCisgICAgKiBbVEhSSUZULTQzMDZdIC0gVGhyaWZ0IGltcG9ydHMgbm90IHJlcGxpY2F0ZWQgdG8gRCBzZXJ2aWNlIG91dHB1dAorICAgICogW1RIUklGVC00MzE1XSAtIEFkZCBkZWZhdWx0IG1lc3NhZ2UgZm9yIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbgorICAgICogW1RIUklGVC00MzE4XSAtIERlbHBoaSBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudHMKKyAgICAqIFtUSFJJRlQtNDMyNV0gLSBTaW1wbGlmeSBhdXRvbWFrZSBjcm9zcyBjb21waWxhdGlvbiBieSByZWx5aW5nIG9uIG9uZSBnbG9iYWwgVEhSSUZUIGNvbXBpbGVyIHBhdGgKKyAgICAqIFtUSFJJRlQtNDMyN10gLSBJbXByb3ZlIFRpbWVyTWFuYWdlciBBUEkgdG8gYWxsb3cgcmVtb3Zpbmcgc3BlY2lmaWMgdGFzaworICAgICogW1RIUklGVC00MzMwXSAtIEFsbG93IHVudXNlZCBjcmF0ZXMgaW4gUnVzdCBmaWxlcworICAgICogW1RIUklGVC00MzMzXSAtIEVybGFuZyB0dXRvcmlhbCBleGFtcGxlcyBhcmUgdXNpbmcgYSBkaWZmZXJlbnQgcG9ydCAoOTk5OSkKKyAgICAqIFtUSFJJRlQtNDM0M10gLSBDaGFuZ2UgQ0kgYnVpbGRzIHRvIHVzZSBub2RlLmpzIDgueCBMVFMgb25jZSBhdmFpbGFibGUKKyAgICAqIFtUSFJJRlQtNDM0NV0gLSBDcmVhdGUgYSBkb2NrZXIgYnVpbGQgZW52aXJvbm1lbnQgdGhhdCB1c2VzIHRoZSBtaW5pbXVtIHN1cHBvcnRlZCBsYW5ndWFnZSBsZXZlbHMKKyAgICAqIFtUSFJJRlQtNDM0Nl0gLSBBbGxvdyBabGliIHRyYW5zcG9ydCBmYWN0b3J5IHRvIHdyYXAgb3RoZXIgdHJhbnNwb3J0cworICAgICogW1RIUklGVC00MzQ4XSAtIFBlcmwgSFRUUCBDbGllbnQgY3VzdG9tIEhUVFAgaGVhZGVycworICAgICogW1RIUklGVC00MzUwXSAtIFVwZGF0ZSBuZXRjb3JlIGJ1aWxkIGZvciBkb3RuZXQgMi4wIHNkayBhbmQgbWFrZSBjcm9zcyB2YWxpZGF0aW9uCisgICAgKiBbVEhSSUZULTQzNTFdIC0gVXNlIFRyYXZpcyBDSSBCdWlsZCBTdGFnZXMgdG8gb3B0aW1pemUgdGhlIENJIGJ1aWxkCisgICAgKiBbVEhSSUZULTQzNTNdIC0gY2Fubm90IHJlYWQgdmlhIHRocmlmdF9wcm90b2NvbCBhdCBzZXJ2ZXIgc2lkZQorICAgICogW1RIUklGVC00Mzc4XSAtIGFkZCBzZXQgc3RvcFRpbWVvdXRVbml0IG1ldGhvZCB0byBUVGhyZWFkUG9vbFNlcnZlcgorCisjIyBOZXcgRmVhdHVyZQorICAgICogW1RIUklGVC03NTBdIC0gQysrIENvbXBpbGVyIFZpcnR1YWwgRnVuY3Rpb24gT3B0aW9uCisgICAgKiBbVEhSSUZULTI5NDVdIC0gSW1wbGVtZW50IHN1cHBvcnQgZm9yIFJ1c3QgbGFuZ3VhZ2UKKyAgICAqIFtUSFJJRlQtMzg1N10gLSB0aHJpZnQganM6bm9kZSBjb21wbGllciBzdXBwb3J0IGFuIG9iamVjdCBhcyBwYXJhbWV0ZXIgbm90IGFuIGluc3RhbmNlIG9mIHN0cnVjdAorICAgICogW1RIUklGVC0zOTMzXSAtIFBvcnQgb2ZmaWNpYWwgQyMgLk5FVCBsaWJyYXJ5IGZvciBUaHJpZnQgdG8gQyMgLk5FVCBDb3JlIGxpYmFyeQorICAgICogW1RIUklGVC00MDM5XSAtIFVwZGF0ZSBvZiBBcGFjaGUgVGhyaWZ0IC5OZXQgQ29yZSBsaWIgCisgICAgKiBbVEhSSUZULTQxMTNdIC0gUHJvdmlkZSBhIGJ1ZmZlciB0cmFuc3BvcnQgZm9yIHJlYWRpbmcvd3JpdGluZyBpbiBtZW1vcnkgYnl0ZSBzdHJlYW0KKworIyMgUXVlc3Rpb24KKyAgICAqIFtUSFJJRlQtMjk1Nl0gLSBhdXRvY29uZiAtIHBvc3NpYmx5IHVuZGVmaW5lZCBtYWNybyAtIEFDX1BST0dfQklTT04KKyAgICAqIFtUSFJJRlQtNDIyM10gLSBBZGQgc3VwcG9ydCB0byB0aGUgaXNTZXJ2aW5nKCkgbWV0aG9kIGZvciB0aGUgQysrIGxpYnJhcnkKKworIyMgVGFzaworICAgICogW1RIUklGVC0zNjIyXSAtIEZpeCBkZXByZWNhdGVkIHVzZXMgb2Ygc3RkOjphdXRvX3B0cgorICAgICogW1RIUklGVC00MDI4XSAtIFBsZWFzZSByZW1vdmUgU3lzdGVtLm91dC5mb3JtYXQgZnJvbSB0aGUgc291cmNlIGNvZGUKKyAgICAqIFtUSFJJRlQtNDE4Nl0gLSBCdWlsZCBhbmQgdGVzdCBydXN0IGNsaWVudCBpbiBUcmF2aXMKKworIyMgVGVzdAorICAgICogW1RIUklGVC00MjY0XSAtIFBIUCAtIFN1cHBvcnQgYm90aCBzaGFyZWQgJiBzdGF0aWMgbGlua2luZyBvZiBzb2NrZXRzIGxpYnJhcnkKKworIyMgV2lzaAorICAgICogW1RIUklGVC00MzQ0XSAtIERlZmluZSBhbmQgbWFpbnRhaW4gdGhlIG1pbmltdW0gbGFuZ3VhZ2UgbGV2ZWwgZm9yIGFsbCBsYW5ndWFnZXMgaW4gb25lIHBsYWNlCisKKwkKK1RocmlmdCAwLjEwLjAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIyBCdWcKKyAgICAqIFtUSFJJRlQtMTg0MF0gLSBUaHJpZnQgR2VuZXJhdGVkIENvZGUgQ2F1c2VzIEdsb2JhbCBWYXJpYWJsZSBMZWFrcworICAgICogW1RIUklGVC0xODI4XSAtIG1vY19UUVRjcFNlcnZlci5jcHAgd2FzIHJlbW92ZWQgZnJvbSBzb3VyY2UgdHJlZSBidXQgaXMgaW4gdGhyaWZ0LTAuOS4wLnRhci5negorICAgICogW1RIUklGVC0xNzkwXSAtIGNvY29hOiBEdXBsaWNhdGUgaW50ZXJmYWNlIGRlZmluaXRpb24gZXJyb3IKKyAgICAqIFtUSFJJRlQtMTc3Nl0gLSBUUGlwZVNlcnZlciBzaG91bGQgaW1wbGVtZW50ICJsaXN0ZW4iLCBzbyB0aGF0IFRTZXJ2ZXJFdmVudEhhbmRsZXIgcHJlU2VydmUgd2lsbCB3b3JrIHJpZ2h0CisgICAgKiBbVEhSSUZULTEzNTFdIC0gQ29tcGlsZXIgZG9lcyBub3QgY2FyZSBhYm91dCBiaW5hcnkgc3RyaW5ncworICAgICogW1RIUklGVC0xMjI5XSAtIFB5dGhvbiBmYXN0YmluYXJ5LmMgY2FuIG5vdCBoYW5kbGUgdW5pY29kZSBhcyBnZW5lcmF0ZWQgcHl0aG9uIGNvZGUKKyAgICAqIFtUSFJJRlQtNzQ5XSAtIEMrKyBUQnVmZmVyZWRUcmFuc3BvcnRzIGRvIG5vdCBmbHVzaCB0aGVpciBidWZmZXJzIG9uIGRlbGV0ZQorICAgICogW1RIUklGVC03NDddIC0gQysrIFRTb2NrZXQtPmNsb3NlIGNhbGxzIHNodXRkb3duIGJyZWFraW5nIGZvcmtlZCBwYXJlbnQgcHJvY2VzcworICAgICogW1RIUklGVC03MzJdIC0gc2VydmVyIGV4aXRzIGFibm9ybWFsbHkgd2hlbiBjbGllbnQgY2FsbHMgc2VuZF94eHggZnVuY3Rpb24gd2l0aG91dCBjYWxsaW5nIHJlY3ZfeHh4IGZ1bmN0aW9uCisgICAgKiBbVEhSSUZULTM5NDJdIC0gVFNTTFNvY2tldCBkb2VzIG5vdCBob25vciBzZW5kIGFuZCByZWNlaXZlIHRpbWVvdXRzCisgICAgKiBbVEhSSUZULTM5NDFdIC0gV2luWFAgdmVyc2lvbiBvZiB0aHJpZnRfcG9sbCgpIHJlbGllcyBvbiB1bmRlZmluZWQgYmVoYXZpb3IgYnkgcGFzc2luZyBhIGRlc3RydWN0ZWQgdmFyaWFibGUgdG8gc2VsZWN0KCkKKyAgICAqIFtUSFJJRlQtMzk0MF0gLSBWaXN1YWwgU3R1ZGlvIHByb2plY3QgZmlsZSBmb3IgY29tcGlsZXIgaXMgYnJva2VuCisgICAgKiBbVEhSSUZULTM5NDNdIC0gQ292ZXJpdHkgU2NhbiBpZGVudGlmaWVkIHNvbWUgaGlnaCBzZXZlcml0eSBkZWZlY3RzCisgICAgKiBbVEhSSUZULTM5MjldIC0gUEhQICJuc2dsb2JhbCIgT3B0aW9uIFJlc3VsdHMgaW4gU3ludGF4IEVycm9yIGluIEdlbmVyYXRlZCBDb2RlIChUcmFpbGluZyBCYWNrc2xhc2gpCisgICAgKiBbVEhSSUZULTM5MzZdIC0gQ2Fubm90IGNvbXBpbGUgMC4xMC4wIGRldmVsb3BtZW50IHRpcCB3aXRoIFZTMjAxMyBhbmQgZWFybGllciAoc25wcmludGYsIHVpbnQzMl90KQorICAgICogW1RIUklGVC0zOTM1XSAtIEluY29ycmVjdCBza2lwcGluZyBvZiBtYXAgYW5kIHNldAorICAgICogW1RIUklGVC0zOTIwXSAtIFJ1Ynk6IEVuc3VyaW5nIHRoYXQgSFRUUCBmYWlsdXJlcyB3aWxsIGNsZWFyIHRoZSBodHRwIHRyYW5zcG9ydCBvdXRidWYgdmFyCisgICAgKiBbVEhSSUZULTM5MTldIC0gQyMgVFRMU1NlcnZlclNvY2tldCBkb2VzIG5vdCB1c2UgY2xpZW50VGltZW91dAorICAgICogW1RIUklGVC0zOTE3XSAtIENoZWNrIGJhY2twb3J0cy5zc2xfbWF0Y2hfaG9zdG5hbWUgbW9kdWxlIHZlcnNpb24KKyAgICAqIFtUSFJJRlQtMzkwOV0gLSBGaXggY19nbGliIHN0YXRpYyBsaWIgQ01ha2UgYnVpbGQKKyAgICAqIFtUSFJJRlQtMzkwNF0gLSBUeXBvIGluIG5vZGUgdHV0b3JpYWwgbGVhZHMgdG8gd3JvbmcgdHJhbnNwb3J0IGJlaW5nIHVzZWQKKyAgICAqIFtUSFJJRlQtMzg0OF0gLSBBcyBhbiBpbXBsZW1lbnRlciBvZiBhIHBlcmwgc29ja2V0IHNlcnZlciwgSSBkbyBub3Qgd2FudCB0byBoYXZlIHRvIHJlbWVtYmVyIHRvIGlnbm9yZSBTSUdDSExEIGZvciBpdCB0byB3b3JrIHByb3Blcmx5CisgICAgKiBbVEhSSUZULTM4NDRdIC0gdGhyaWZ0X3Byb3RvY29sIGNhbm5vdCBjb21waWxlIGluIDcuMC43CisgICAgKiBbVEhSSUZULTM4NDNdIC0gaW50ZWdlciBpc3N1ZXMgd2l0aCBIYXhlIFBIUCB0YXJnZXRzIGNhdXNlIFppZ1phZyBlbmNvZGluZyB0byBmYWlsCisgICAgKiBbVEhSSUZULTM4NDJdIC0gRGFydCBnZW5lcmF0ZXMgaW5jb3JyZWN0IGNvZGUgZm9yIGEgY29uc3Qgc3RydWN0CisgICAgKiBbVEhSSUZULTM4NDFdIC0gZGFydCBjb21wYWN0IHByb3RvY29sIGluY29ycmVjdGx5IHNlcmlhbGl6ZXMvZGVzZXJpYWxpemVkIGRvdWJsZXMKKyAgICAqIFtUSFJJRlQtMzcwOF0gLSBOYW1lRXJyb3I6IGdsb2JhbCBuYW1lICdUUHJvdG9jb2wnIGlzIG5vdCBkZWZpbmVkCisgICAgKiBbVEhSSUZULTM3MDRdIC0gIlRDb25uZWN0ZWRDbGllbnQgZGllZDogQ291bGQgbm90IHJlZmlsbCBidWZmZXIiIG1lc3NhZ2Ugc2hvd24gd2hlbiB1c2luZyBIVFRQIFNlcnZlcgorICAgICogW1RIUklGVC0zNjc4XSAtIEZpeCBqYXZhZG9jIGVycm9ycyBvbiBKREsgOAorICAgICogW1RIUklGVC0zMDE0XSAtIEFwcFZleW9yIHN1cHBvcnQKKyAgICAqIFtUSFJJRlQtMjk5NF0gLSBOb2RlLmpzIFRKU09OUHJvdG9jb2wgY2Fubm90IGJlIHVzZWQgZm9yIG9iamVjdCBzZXJpYWxpemF0aW9uLgorICAgICogW1RIUklGVC0yOTc0XSAtIHdyaXRlVG9QYXJjZWwgdGhyb3dzIE5QRSBmb3Igb3B0aW9uYWwgZW51bSBmaWVsZHMKKyAgICAqIFtUSFJJRlQtMjk0OF0gLSBQeXRob24gVEpTT05Qcm90b2NvbCBkb2Vzbid0IGhhbmRsZSBzdHJ1Y3RzIHdpdGggYmluYXJ5IGZpZWxkcyBjb250YWluaW5nIGludmFsaWQgdW5pY29kZS4KKyAgICAqIFtUSFJJRlQtMjg0NV0gLSBDaGlsZFNlcnZpY2UuUGxvOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5CisgICAgKiBbVEhSSUZULTMyNzZdIC0gQmluYXJ5IGRhdGEgZG9lcyBub3QgZGVjb2RlIGNvcnJlY3RseSB1c2luZyB0aGUgVEpTT05Qcm90b2NvbCB3aGVuIHRoZSBiYXNlNjQgZW5jb2RlZCBkYXRhIGlzIHBhZGRlZC4KKyAgICAqIFtUSFJJRlQtMzI1M10gLSBVc2luZyBsYXRlc3QgdmVyc2lvbiBvZiBEIGdpdmVzIGRlcHJlY2F0aW9uIG5vdGljZXMKKyAgICAqIFtUSFJJRlQtMjg4M10gLSBUVHdpc3RlZC5weSwgZHVyaW5nIENvbm5lY3Rpb25Mb3N0IHByb2Nlc3Npbmc6IGV4Y2VwdGlvbnMuUnVudGltZUVycm9yOiBkaWN0aW9uYXJ5IGNoYW5nZWQgc2l6ZSBkdXJpbmcgaXRlcmF0aW9uCisgICAgKiBbVEhSSUZULTIwMTldIC0gV3JpdGluZyBvbiBhIGRpc2Nvbm5lY3RlZCBzb2NrZXQgb24gTWFjIGNhdXNlcyBTSUcgUElQRQorICAgICogW1RIUklGVC0yMDIwXSAtIFRocmlmdCBsaWJyYXJ5IGhhcyBzb21lIGVtcHR5IGZpbGVzIHRoYXQgaGF2ZW4ndCByZWFsbHkgYmVlbiBkZWxldGVkCisgICAgKiBbVEhSSUZULTIwNDldIC0gR28gY29tcGlsZXIgZG9lc24ndCBidWlsZCBvbiBuYXRpdmUgV2luZG93cworICAgICogW1RIUklGVC0yMDI0XSAtIFRTZXJ2ZXIuY3BwIHdhcm5zIG9uIDY0LWJpdCBwbGF0Zm9ybXMgYWJvdXQgdHJ1bmNhdGluZyBhbiBybGltX3QgaW50byBhbiBpbnQKKyAgICAqIFtUSFJJRlQtMjAyM10gLSBnZXR0aW1lb2ZkYXkgaW1wbGVtZW50YXRpb24gb24gV2luZG93cyBlcnJvcnMgd2hlbiBubyB0aW1lIHpvbmUgaXMgcGFzc2VkIGluLgorICAgICogW1RIUklGVC0yMDIyXSAtIENvQiBhbmQgZGVuc2UgY29kZSBnZW5lcmF0aW9uIHN0aWxsIHVzZXMgVFIxIGJpbmQsIGV2ZW4gdGhvdWdoIHRoYXQgZG9lc24ndCB3b3JrIHdpdGggY2xhbmcKKyAgICAqIFtUSFJJRlQtMjAyN10gLSBNaW5vciA2NC1iaXQgYW5kIE5PTUlOTUFYIGlzc3VlcyBpbiBDKysgbGlicmFyeQorICAgICogW1RIUklGVC0yMTU2XSAtIFRTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIGlzIHRocm93aW5nIGV4Y2VwdGlvbnMgd2l0aCBtaXNsZWFkaW5nIGluZm9ybWF0aW9uCisgICAgKiBbVEhSSUZULTIxNTRdIC0gTWlzc2luZyA8b3BlcmF0b3IgYm9keQorICAgICogW1RIUklGVC0yMTQ4XSAtIFROb25ibG9ja2luZ011bHRpRmV0Y2hDbGllbnQgaW1wb3J0cyBsb2c0agorICAgICogW1RIUklGVC0yMTAzXSAtIFtweXRob25dIFN1cHBvcnQgZm9yIFNTTCBjZXJ0aWZpY2F0ZXMgd2l0aCBTdWJqZWN0IEFsdGVybmF0aXZlIE5hbWVzCisgICAgKiBbVEhSSUZULTE5MzFdIC0gU2VuZGluZyBhIGZyYW1lIHNpemUgb2YgemVybyB0byBhIFROb25ibG9ja2luZ1NlcnZlciBjYXVzZXMgYW4gYXNzZXJ0aW9uIGZhaWx1cmUKKyAgICAqIFtUSFJJRlQtMTc1MV0gLSBkZWZpbml0aW9uIG9mIGluY3JlYXNlX21heF9mZHMgZG9lc24ndCBjb21waWxlIHdoZW4gSEFWRV9TWVNfUkVTT1VSQ0VfSCBpcyBub3QgZGVmaW5lZAorICAgICogW1RIUklGVC0xNTIyXSAtIFRTZXJ2ZXJTb2NrZXQgcG90ZW50aWFsIG1lbW9yeSBsZWFrIHdpdGggYWRkcmluZm8gKnJlczAKKyAgICAqIFtUSFJJRlQtMTU0N10gLSBQcm9ibGVtcyBidWlsZGluZyBhZ2FpbnN0IHN0YXRpYyBsaWJldmVudAorICAgICogW1RIUklGVC0xNTQ1XSAtIEdlbmVyYXRlZCBqYXZhc2NyaXB0IGNvZGUgdXNlcyAiZm9yIGluIiBmb3IgbG9vcGluZyBvdmVyIGFycmF5cworICAgICogW1RIUklGVC0xNDg3XSAtIE5hbWVzcGFjZSBwcm9ibGVtLCBjb21waWxlIGZhaWxzIG9uIGdlbmVyYXRlZCBjb2RlCisgICAgKiBbVEhSSUZULTE0NzJdIC0gQ29uZmlndXJhdGlvbiBjb25mbGljdHMgd2l0aCBib29zdCBwbGF0Zm9ybSBpbmNsdWRlIGhlYWRlcgorICAgICogW1RIUklGVC02XSAtIFRocmlmdCBsaWJyYXJpZXMgYW5kIGNvbXBpbGVyIGxhY2sgdmVyc2lvbiBudW1iZXIKKyAgICAqIFtUSFJJRlQtMTY4MF0gLSBtYWtlIGluc3RhbGwgcmVxdWlyZXMgR05VIG1ha2UKKyAgICAqIFtUSFJJRlQtMzg2OV0gLSBEYXJ0IFR1dG9yaWFsIGJ1aWxkIGZhaWxzIHdpdGggRXJyb3IgNjUgYXQgInB1YiBnZXQiCisgICAgKiBbVEhSSUZULTM4NjFdIC0gVHJhdmlzIENJIGJ1aWxkcyBhcmUgdGltaW5nIG91dCAtIEMrK1RTZXJ2ZXJJbnRlZ3JhdGlvblRlc3QgYXBwZWFycyB0byBiZSBoYW5naW5nCisgICAgKiBbVEhSSUZULTM4NTVdIC0gSW4gdGhlIGdvIHNpbXBsZSBzZXJ2ZXIsIGlmIFN0b3AoKSBpcyBjYWxsZWQgbXVsdGlwbGUgdGltZXMgaXQgaGFuZ3MKKyAgICAqIFtUSFJJRlQtMzg4NV0gLSBQSFA6IEVycm9yIHdoZW4gcmVhZEk2NCBpbiBUQ29tcGFjdFByb3RvY29sCisgICAgKiBbVEhSSUZULTM4ODNdIC0gR28gVGVzdEFsbENvbm5lY3Rpb24gY2FuIGZhaWwgd2l0aCBwb3J0IDkwOTAgY29sbGlzaW9uCisgICAgKiBbVEhSSUZULTM4ODRdIC0gRml4IEVybGFuZyBjb21wYWN0IHByb3RvY29sIGRvdWJsZSBlbmRpYW5lc3MgYW5kIGJvb2xlYW4gbGlzdAorICAgICogW1RIUklGVC0zODgwXSAtIEVybGFuZyBDb21wYWN0IHByb3RvY29sIC0gYm9vbGVhbiB2YWx1ZXMgaW52ZXJ0ZWQKKyAgICAqIFtUSFJJRlQtMzg3OV0gLSBVbmRlZmluZWQgZXZhbHVhdGlvbiBvcmRlciBjYXVzZXMgaW5jb3JyZWN0IHByb2Nlc3NpbmcgaW4gdGhlIEMrKyBsaWJyYXJ5IEpTT04gcHJvdG9jb2wKKyAgICAqIFtUSFJJRlQtMzg1MV0gLSBHb2xhbmcgdGhyaWZ0IGNvbnRpbnVhbGx5IGFkZHMgdGhlIHgvdGhyaWZ0IGNvbnRlbnQgdHlwZSAKKyAgICAqIFtUSFJJRlQtMzg1MF0gLSBBbGwgYXBhY2hlIGJ1aWxkcyBhcmUgZmFpbGluZyB3aGVuIGluaXRpYXRlZCBmcm9tIGEgZ2l0aHViIHB1bGwgcmVxdWVzdAorICAgICogW1RIUklGVC0zODM3XSAtIFRoaWZ0IDAuOS4zIGNhbid0IGJlIGJ1aWxkIHdpdGggUXVpY2tDaGVjayAyLjguMiBhbmQgdW5vcmRlcmVkLWNvbnRhaW5lcnMgMC4yLjYKKyAgICAqIFtUSFJJRlQtMzgzMV0gLSBidWlsZCBvZiB0ZXN0L2NwcC9zcmMvVGVzdENsaWVudC5jcHAgZmFpbHMgd2l0aCBuZXdlciBnY2Mgb24gcGxhdGZvcm1zIHdpdGggdW5zaWduZWQgY2hhciBkdWUgdG8gbmFycm93aW5nIGNvbnZlcnNpb25zCisgICAgKiBbVEhSSUZULTM4MjddIC0gcGhwIENvbXBhY3RQcm90b2NvbCByZWFkSTY0IGZ1bmN0aW9uIGhhcyBidWcsIHdoZW4gdmFsdWUgaGFzIDMyYml0IH42NGJpdCwgRXhhbXBsZe+8mnZhbHVlPTE0NjE1NjM0NTcwMDAgCisgICAgKiBbVEhSSUZULTM4MjVdIC0gSmF2YXNjcmlwdCB0ZXN0IGRlcGVuZGVuY3kgaXMgbm8gbG9uZ2VyIGF2YWlsYWJsZQorICAgICogW1RIUklGVC0zODE0XSAtIEZpeCBjb250ZW50aW9uIGluIFROb25ibG9ja2luZ1NlcnZlclRlc3QKKyAgICAqIFtUSFJJRlQtMzc5M10gLSBBcHB2ZXlvciBidWlsZHMgcmVmZXJlbmNlIGFuIGFudCB2ZXJzaW9uIHRoYXQgaXMgbm8gbG9uZ2VyIHRoZXJlCisgICAgKiBbVEhSSUZULTM3ODZdIC0gTm9kZS5qcyBUTFMgZW1pdHMgJ2Nvbm5lY3QnIGJlZm9yZSBjb25uZWN0aW9uIGlzIHJlYWR5CisgICAgKiBbVEhSSUZULTM3ODBdIC0gRml4IGRhcnQgaW50NjQgdXNhZ2Ugd2hlbiBjb21waWxlZCB0byBqcworICAgICogW1RIUklGVC0zNzg5XSAtIE5vZGUuanMgbGFja3MgYWJpbGl0eSB0byBkZXN0cm95IGNvbm5lY3Rpb24KKyAgICAqIFtUSFJJRlQtMzc5Nl0gLSBUaGVyZSdzIG5vIC0tZGJnIGZvciBkaF9zdHJpcCwgbWF5YmUgc29tZW9uZSBoYXMgbWlzdGFrZW4gdGhpcyBmb3IgLS1kYmctcGFja2FnZS4KKyAgICAqIFtUSFJJRlQtMzc5NV0gLSBHZW5lcmF0ZWQgaGFzaFZhbHVlIG1ldGhvZCBpbiBTd2lmdCB3aWxsIG92ZXJmbG93CisgICAgKiBbVEhSSUZULTM3OTBdIC0gRml4IERlbHBoaSBuYW1lZCBwaXBlIGNsaWVudCB0byB1c2UgdGltZW91dCBldmVuIHdoZW4gcGlwZSBkb2Vzbid0IHlldCBleGlzdAorICAgICogW1RIUklGVC0zNzg3XSAtIE5vZGUuanMgQ29ubmVjdGlvbiBvYmplY3QgZG9lc24ndCBoYW5kbGUgZXJyb3JzIGNvcnJlY3RseQorICAgICogW1RIUklGVC0zNzkxXSAtIERlbHBoaSBwaXBlIGNsaWVudCBtYXkgZmFpbCBldmVuIGluIGEgbm9uLWVycm9yIGNvbmRpdGlvbgorICAgICogW1RIUklGVC0zNzcxXSAtIFRCdWZmZXJlZFRyYW5zcG9ydCBnZXRzIGluIGludmFsaWQgc3RhdGUgb24gcmVhZC93cml0ZSBlcnJvcnMKKyAgICAqIFtUSFJJRlQtMzc2NF0gLSBQSFAgIm1ha2UgaW5zdGFsbCIgZG9lcyBub3QgaW5zdGFsbCBUTXVsdGlwbGV4ZWRQcm90b2NvbC5waHAgbm9yIFRTaW1wbGVKU09OUHJvdG9jb2wucGhwCisgICAgKiBbVEhSSUZULTM3NjhdIC0gVFRocmVhZGVkU2VydmVyIG1heSBjcmFzaCBpZiBpdCBpcyBkZXN0cm95ZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgaXQgcmV0dXJucyBmcm9tIHNlcnZlKCk7IFRUaHJlYWRlZFNlcnZlciBkaXNjb25uZWN0cyBjbGllbnRzCisgICAgKiBbVEhSSUZULTM3NjVdIC0gbWVtb3J5IGxlYWsgaW4gcHl0aG9uIGNvbXBhY3QgcHJvdG9jb2wgZXh0ZW5zaW9uCisgICAgKiBbVEhSSUZULTM3NThdIC0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uOjpnZXRUeXBlIGFuZCBUUHJvdG9jb2xFeGNlcHRpb246OmdldFR5cGUgc2hvdWxkIGJlIGNvbnN0CisgICAgKiBbVEhSSUZULTM3NjNdIC0gRml4IHNlcmlhbGl6YXRpb24gb2YgaTY0IGxhcmdlciB0aGFuIDJeNTMgZm9yIGJyb3dzZXJpZnkKKyAgICAqIFtUSFJJRlQtMzc1OV0gLSByZXF1aXJlZCBmaWVsZHMgdGhhdCBhcmUgbmlsIGFyZSBzaWxlbnRseSBpZ25vcmVkIG9uIHdyaXRlCisgICAgKiBbVEhSSUZULTM3NTNdIC0gVFNlcnZlckZyYW1ld29yazo6c3RvcCBtYXkgZmFpbCB0byBpbnRlcnJ1cHQgY29ubmVjdGVkIGNsaWVudHMKKyAgICAqIFtUSFJJRlQtMzc1NV0gLSBURGVidWdQcm90b2NvbDo6d3JpdGVTdHJpbmcgaGl0cyBhc3NlcnQgaW4gaXNwcmludCBvbiBXaW5kb3dzIHdpdGggZGVidWcgQ1JUCisgICAgKiBbVEhSSUZULTM3NTFdIC0gQ29tcGlsZXIgYWxsb3dzIGZpZWxkIGlkcyB0aGF0IGFyZSB0b28gbGFyZ2UgZm9yIGdlbmVyYXRlZCBjb2RlCisgICAgKiBbVEhSSUZULTM3NDhdIC0gTm9kZS5qcyBEZXNlcmlhbGl6YXRpb24gb2YgbGlzdHMgb2YgbGlzdHMgaXMgYnJva2VuCisgICAgKiBbVEhSSUZULTM3NjBdIC0gRml4IGluc3RhbGwgcGF0aHMgZXRjIG9mIGRlYmlhbiBwYWNrYWdlcyBmb3IgcHkgYW5kIHBlcmwKKyAgICAqIFtUSFJJRlQtMzc1N10gLSBGaXggdmFyaW91cyBidWlsZCB3YXJuaW5ncyBvbiBXaW5kb3dzIHdpdGggVlMyMDE1IGNvbXBpbGVyCisgICAgKiBbVEhSSUZULTM3NTBdIC0gTlNDb3B5aW5nIGNvcHlXaXRoWm9uZTogaW1wbGVtZW50YXRpb24gZG9lcyBub3QgY2hlY2sgaXNTZXQKKyAgICAqIFtUSFJJRlQtMzc0N10gLSBEdXBsaWNhdGUgbm9kZS5qcyBidWlsZCBvbiBUcmF2aXMtQ0kKKyAgICAqIFtUSFJJRlQtMzc0NF0gLSBUaGUgcHJlY2lzaW9uIHNob3VsZCBiZSAxNyAoMTYgYml0cyBuZWVkIGFmdGVyIGRvdCkgYWZ0ZXIgZG90IGZvciBkb3VibGUgdHlwZS4KKyAgICAqIFtUSFJJRlQtMzc0MV0gLSBoYXhlIHRlc3QgaXMgYnJva2VuCisgICAgKiBbVEhSSUZULTM3MzldIC0gRGVwcmVjYXRpb24gd2FybmluZyBpbiBjb2RlZ2VuL2Jhc2UuZAorICAgICogW1RIUklGVC0zNzM1XSAtIEpTT04gcHJvdG9jb2wgbGVmdCBpbiBpbmNvcnJlY3Qgc3RhdGUgd2hlbiBhbiBleGNlcHRpb24gaXMgdGhyb3duIGR1cmluZyByZWFkIG9yIHdyaXRlIG9wZXJhdGlvbnMKKyAgICAqIFtUSFJJRlQtMzczNF0gLSBUbyBjb21wYXJlIHR3byBzdHJpbmcgYXMgbG93ZXJjYXNlLgorICAgICogW1RIUklGVC0zNzQzXSAtIEphdmEgSlNPTiBwcm90b2NvbCBsZWZ0IGluIGluY29ycmVjdCBzdGF0ZSB3aGVuIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gZHVyaW5nIHJlYWQgb3Igd3JpdGUgb3BlcmF0aW9ucworICAgICogW1RIUklGVC0zNzMxXSAtIFBlcmwgbXVsdGlwbGV4IHRlc3QgaXMgZmxha3kKKyAgICAqIFtUSFJJRlQtMzcyOV0gLSBSZXN0cmljdCByYWtlIHZlcnNpb24KKyAgICAqIFtUSFJJRlQtMzcyN10gLSBJbmNvcnJlY3QgcmVxdWlyZSBwYXRocyBpbiBOb2RlLmpzIHR1dG9yaWFsCisgICAgKiBbVEhSSUZULTM3MjNdIC0gRml4IEx1YSBpbmNsdWRlIHBhdGgKKyAgICAqIFtUSFJJRlQtMzcyMl0gLSBGaXggY2VydCBwYXRoIGluIEMrKyBjcm9zcyB0ZXN0cyBmb3Igbm9uLUxpbnV4IHBsYXRmb3JtCisgICAgKiBbVEhSSUZULTM3MjZdIC0gRml4IGluY29ycmVjdCBjb25kaXRpb25hbCBpbiBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IucHkKKyAgICAqIFtUSFJJRlQtMzcyNV0gLSBTa2lwIGEgZmxha3kgY3Jvc3MgdGVzdCBlbnRyeSAoZC1kYXJ0IGNvbXBhY3QgZnJhbWVkLWlwKQorICAgICogW1RIUklGVC0zNzI0XSAtIEZpeCBpbmNvcnJlY3QgdGltZXZhbCBjb252ZXJzaW9uIGluIGxpYmV2ZW50LmQKKyAgICAqIFtUSFJJRlQtMzcyMV0gLSBDTE9ORSAtIHdoeSBub3QgYWRkIHVuaWNvZGUgc3RyaW5ncyBzdXBwb3J0IHRvIHB5dGhvbiBkaXJlY3RseT8KKyAgICAqIFtUSFJJRlQtMzcyMF0gLSBUVGNwU29ja2V0U3RyZWFtSW1wbC5SZWFkKCkgcmV0dXJucyAwIGlmIG5vdCBhbGwgcmVxdWVzdGVkIGJ5dGVzIGNvdWxkIGJlIHJlYWQKKyAgICAqIFtUSFJJRlQtMzcxOV0gLSBEYXJ0IGdlbmVyYXRvciBzaG91bGQgdXNlIGxvd2VyQ2FtZWxDYXNlIGZvciBzZXJ2aWNlIG5hbWVzCisgICAgKiBbVEhSSUZULTM5MDJdIC0gVFNvY2tldC5vcGVuIHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICogW1RIUklGVC0zOTAxXSAtIFRGcmFtZWRUcmFuc3BvcnQub3BlbiB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAqIFtUSFJJRlQtMzg5M10gLSBDb21tYW5kIGluamVjdGlvbiBpbiBmb3JtYXRfZ29fb3V0cHV0CisgICAgKiBbVEhSSUZULTM4MDddIC0gU3dpZnQgY29tcGlsZXIgZG9lcyBub3QgZXNjYXBlIHJlc2VydmVkIHdvcmRzCisgICAgKiBbVEhSSUZULTM3OThdIC0gVEh0dHBDbGllbnQgZG9lcyBub3QgdXNlIHByb3h5IGZyb20gaHR0cF9wcm94eSwgaHR0cHNfcHJveHkgZW52aXJvbm1lbnQgdmFyaWFibGVzCisgICAgKiBbVEhSSUZULTM4MDldIC0gd3JvbmcvdW51c2VkIEJJTkFSWSB0eXBlIGNvZGUKKyAgICAqIFtUSFJJRlQtMzgwNl0gLSBTd2lmdCBnZW5lcmF0b3IgZG9lcyBub3QgaGFuZGxlIHNlbGYtcmVmZXJyaW5nIHN0cnVjdHMKKyAgICAqIFtUSFJJRlQtMzgwNV0gLSBHb2xhbmcgc2VydmVyIHN1c2NlcHRpYmxlIHRvIG1lbW9yeSBzcGlrZSBmcm9tIG1hbGZvcm1lZCBtZXNzYWdlCisgICAgKiBbVEhSSUZULTM3OTddIC0gR2VuZXJhdGVkIERlbHBoaSBwcm9jZXNzb3Igc2hvdWxkbid0IGVycm9yIG91dCBvbiB0aW1lZCBvdXQgZXhjZXB0aW9ucworICAgICogW1RIUklGVC0zODEzXSAtIEFwcHZleW9yIGJ1aWxkcyByZWZlcmVuY2UgYW4gb3BlbnNzbCB2ZXJzaW9uIHRoYXQgaXMgbm8gbG9uZ2VyIHRoZXJlCisgICAgKiBbVEhSSUZULTM2NThdIC0gTWlzc2luZyBmaWxlIGluIFRIUklGVC0zNTk5CisgICAgKiBbVEhSSUZULTM2NDldIC0gUHl0aG9uIFRTYXNsQ2xpZW50VHJhbnNwb3J0IGluaXRpYWxpemVzIFRUcmFuc3BvcnRFeGNlcHRpb24gaW5jb3JyZWN0bHkKKyAgICAqIFtUSFJJRlQtMzY1MF0gLSBpbmNvcnJlY3QgdW5pb24gc2VyaWFsaXphdGlvbiAKKyAgICAqIFtUSFJJRlQtMzcxM10gLSBsaWIvZC90ZXN0L3RocmlmdF90ZXN0X3J1bm5lci5zaCBpcyBmbGFreSBvbiBKZW5raW5zCisgICAgKiBbVEhSSUZULTM2NjhdIC0gcmFuZ2UgY2hlY2sgZXJyb3IgaW4gY29tcGFjdCBwcm90b2NvbAorICAgICogW1RIUklGVC0zNjYzXSAtIENNYWtlIGNwcCB0ZXN0IGZhaWxzIHRvIGJ1aWxkIG9uIHN5c3RlbSB3aXRob3V0IHpsaWIKKyAgICAqIFtUSFJJRlQtMzcxMl0gLSBUVG9ybmFkb1NlcnZlciBjYW5ub3QgaGFuZGxlIElQdjYgYWRkcmVzcworICAgICogW1RIUklGVC0zNzEwXSAtIERhcnQgZ2VuZXJhdG9yIGRvZXMgbm90IGNhbWVsIGNhc2UgQ29uc3RhbnRzIGNsYXNzIG5hbWVzCisgICAgKiBbVEhSSUZULTM2OTddIC0gRGFydCBnZW5lcmF0b3IgZG9lcyBub3QgbmFtZSBpbXBvcnRzCisgICAgKiBbVEhSSUZULTM2OTBdIC0gV29yayBhcm91bmQgZG9ja2VyIGltYWdlIGJ1aWxkIGZhaWx1cmVzIG9uIFRyYXZpcy1DSQorICAgICogW1RIUklGVC0zNjg5XSAtIHRocmlmdF9yZWNvbm5lY3RpbmdfY2xpZW50IHN0YXJ0IGZhaWxlZCB3aGVuIHNlcnZlciBpcyBub3QgYXZhaWxhYmxlCisgICAgKiBbVEhSSUZULTM2OTVdIC0gRml4IEQgdGVzdCBzY3JpcHRzCisgICAgKiBbVEhSSUZULTM2NzVdIC0gVW5pb24gaXMgbm90IHNlcmlhbGl6ZWQgY29ycmVjdGx5IGJ5IFRocmlmdCBDIEdsaWIKKyAgICAqIFtUSFJJRlQtMzY3M10gLSBBUEkgZmFpbHMgd2l0aCBzdGQ6OmV4Y2VwdGlvbiBhZnRlciBhIHRpbWVvdXQgb2NjdXJlZCBpbiBlYXJsaWVyIGFueSBBUEkgY2FsbAorICAgICogW1RIUklGVC0zNzA5XSAtIENvbW1lbnQgc3ludGF4IGNhbiBwcm9kdWNlIGJyb2tlbiBjb2RlCisgICAgKiBbVEhSSUZULTM3MDVdIC0gR28gbWFwIGhhcyBpbmNvcnJlY3QgdHlwZXMgd2hlbiB1c2VkIHdpdGggZm9yd2FyZC1kZWZpbmVkIHR5cGVzCisgICAgKiBbVEhSSUZULTM3MDJdIC0gRml4IGNyb3NzIHRlc3RzIGZvciBEYXJ0IGNvbXBhY3QgcHJvdG9jb2wgKDMgZmFpbGluZykKKyAgICAqIFtUSFJJRlQtMzY4M10gLSBCYWRZaWVsZEVycm9yIGluIHRocmlmdCBweTp0b3JuYWRvIHNlcnZlcgorICAgICogW1RIUklGVC0zNjgyXSAtIERvIG5vdCByZXVzZSByZWZ1c2VkIHNvY2tldHMgaW4gdGVzdCBzY3JpcHRzCisgICAgKiBbVEhSSUZULTM2ODFdIC0gRml4IERhcnQgdHV0b3JpYWwgYnVpbGQKKyAgICAqIFtUSFJJRlQtMzY4MF0gLSBKYXZhIGFzeW5jIHByb2Nlc3NvciBmYWlscyB0byBub3RpZnkgZXJyb3JzIHRvIGNsaWVudHMKKyAgICAqIFtUSFJJRlQtMzcxNF0gLSBUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uIGlzIG5vdCBkZWZpbmVkIGluIGpzL3NyYy90aHJpZnQuanMKKyAgICAqIFtUSFJJRlQtMzY4OF0gLSBGaXggc29ja2V0IGJpbmQgZmFpbHVyZSBkZXRlY3Rpb24gb2YgY3Jvc3MgdGVzdAorICAgICogW1RIUklGVC0zNjQxXSAtIFJ1YnkgY2xpZW50IHNob3VsZCB0cnkgdG8gY29ubmVjdCB0byBldmVyeSByZXN1bHQgb2YgZ2V0YWRkcmluZm8KKyAgICAqIFtUSFJJRlQtMzYzNV0gLSBEIHRyYW5zcG9ydF90ZXN0IGlzIGZsYWt5IG9uIEplbmtpbnMgYW5kIFRyYXZpcworICAgICogW1RIUklGVC0zNjE4XSAtIFB5dGhvbiBUU1NMU29ja2V0IGRlcHJlY2F0aW9uIG1lc3NhZ2Ugc2hvdWxkIHByaW50IGNhbGxlcidzIGxvY2F0aW9uCisgICAgKiBbVEhSSUZULTMxNDVdIC0gSlNPTiBwcm90b2NvbCBkb2VzIG5vdCBoYW5kbGUgYm9vbCBhbmQgZW1wdHkgY29udGFpbmVycyBjb3JyZWN0bHkKKyAgICAqIFtUSFJJRlQtMzE1OF0gLSBUQmFzZTxULEY+I2RlZXBDb3B5IHNob3VsZCByZXR1cm4gVAorICAgICogW1RIUklGVC0zMTU3XSAtIFRCYXNlIHNpZ25hdHVyZSBzaG91bGQgYmUgVEJhc2U8VCBleHRlbmRzIFRCYXNlPFQsRj4sIEYgZXh0ZW5kcyBURmllbGRJZEVudW0+CisgICAgKiBbVEhSSUZULTMxNTZdIC0gTm9kZSBUTFM6IHNlcnZlciBleGVjdXRlcyBwcm9jZXNzaW5nIGxvZ2ljIHR3byBmdWxsIHRpbWVzCisgICAgKiBbVEhSSUZULTMxNTRdIC0gdHV0b3JpYWwvcHkudG9ybmFkbyB0aHJvdyBFT0YgZXhjZXB0aW9uCisgICAgKiBbVEhSSUZULTMwNjNdIC0gQysrIGJ1aWxkIC1XdW51c2VkLXBhcmFtZXRlciB3YXJuaW5ncyBvbiBwcm9jZXNzb3JfdGVzdCwgVHJhbnNwb3J0VGVzdAorICAgICogW1RIUklGVC0zMDU2XSAtIEFkZCBzdHJpbmcvY29sbGVjdGlvbiBsZW5ndGggbGltaXRzIGZvciBQeXRob24gcHJvdG9jb2wgcmVhZGVycworICAgICogW1RIUklGVC0zMjM3XSAtIEZpeCBUTmFtZWRQaXBlU2VydmVyOjpjcmVhdGVOYW1lZFBpcGUgbWVtb3J5IGxlYWsKKyAgICAqIFtUSFJJRlQtMzIzM10gLSBGaXggQysrIFRocmVhZE1hbmFnZXI6OkltcGw6OnJlbW92ZVdvcmtlciB3b3JrZXIgam9pbgorICAgICogW1RIUklGVC0zMjMyXSAtIENhbm5vdCBkZXNlcmlhbGl6ZSBqc29uIG1lc3NhZ2VzIGNyZWF0ZWQgd2l0aCBmaWVsZE5hbWVzQXNTdHJpbmcgCisgICAgKiBbVEhSSUZULTMyMDZdIC0gRml4IFZpc3VhbCBTdHVkaW8gYnVpbGQgZmFpbHVyZSBkdWUgJ3B0aHJlYWRfc2VsZic6IGlkZW50aWZpZXIgbm90IGZvdW5kCisgICAgKiBbVEhSSUZULTMyMDBdIC0gSlMgYW5kIG5vZGVqcyBkbyBub3QgZW5jb2RlIEpTT04gcHJvdG9jb2wgYmluYXJ5IGZpZWxkcyBhcyBiYXNlNjQKKyAgICAqIFtUSFJJRlQtMzE5OV0gLSBFeGNlcHRpb24gZmllbGQgaGFzIGJhc2ljIG1ldGFkYXRhCisgICAgKiBbVEhSSUZULTMxODJdIC0gVEZyYW1lZFRyYW5zcG9ydCBpcyBpbiBhbiBpbnZhbGlkIHN0YXRlIGFmdGVyIGZyYW1lIHNpemUgZXhjZXB0aW9uCisgICAgKiBbVEhSSUZULTI1MzZdIC0gbmV3IFRTb2NrZXQsIHVuaW5pdGlhbGlzZWQgdmFsdWUgcmVwb3J0ZWQgYnkgdmFsZ3JpbmQKKyAgICAqIFtUSFJJRlQtMjUyN10gLSBBcGFjaGUgVGhyaWZ0IElETCBDb21waWxlciBjb2RlIGdlbmVyYXRlZCBmb3IgTm9kZS5qcyBzaG91bGQgYmUganNoaW50IGNsZWFuCisgICAgKiBbVEhSSUZULTI1MTldIC0gInByb2Nlc3NvciIgY2xhc3MgaXMgbm90IGJlaW5nIGdlbmVyYXRlZAorICAgICogW1RIUklGVC0yNDMxXSAtIFRGaWxlVHJhbnNwb3J0VGVzdCBmYWlscyB3aXRoICJjaGVjayBkZWx0YSA8IFhYWCBmYWlsZWQiCisgICAgKiBbVEhSSUZULTI3MDhdIC0gRXJsYW5nIGxpYnJhcnkgZG9lcyBub3Qgc3VwcG9ydCAib25ld2F5IiBtZXNzYWdlIHR5cGUKKyAgICAqIFtUSFJJRlQtMzM3N10gLSBEZWVwIGNvcHkgaXMgYWN0dWFsbHkgc2hhbGxvdyB3aGVuIHVzaW5nIHR5cGVkZWYgbWVtYmVycworICAgICogW1RIUklGVC0zMzc2XSAtIEMjIGFuZCBQeXRob24gSlNPTiBwcm90b2NvbCBkb3VibGUgdmFsdWVzIGxvc2UgcHJlY2lzaW9uCisgICAgKiBbVEhSSUZULTMzNzNdIC0gVmFyaW91cyBmaXhlcyBmb3IgY3Jvc3MgdGVzdCBzZXJ2ZXJzIGFuZCBjbGllbnRzCisgICAgKiBbVEhSSUZULTMzNzBdIC0gZXJybm8gZXh0ZXJuIHZhcmlhYmxlIHJlZGVmaW5lZC4gTm90IGNvbXBpbGluZyBmb3IgQW5kcm9pZAorICAgICogW1RIUklGVC0zMzc5XSAtICBQb3RlbnRpYWwgb3V0IG9mIHJhbmdlIHBhbmljIGluIEdvIEpTT04gcHJvdG9jb2xzCisgICAgKiBbVEhSSUZULTMzNzFdIC0gQWJzdHJhY3QgbmFtZXNwYWNlIFVuaXggZG9tYWluIHNvY2tldHMgYnJva2VuIGluIEMrKworICAgICogW1RIUklGVC0zMzgwXSAtIG5vZGVqczogMC45LjIgLT4gMC45LjMgdXBncmFkZSBicmVha3MgUHJvdG9jb2wgYW5kIFRyYW5zcG9ydCByZXF1aXJlcworICAgICogW1RIUklGVC0zMzY3XSAtIEZpeCBiYWQgbGlua3MgdG8gY29kaW5nX3N0YW5kYXJkcy5tZCAjNjM0IAorICAgICogW1RIUklGVC0zNDAxXSAtIE5lc3RlZCBjb2xsZWN0aW9ucyBlbWl0IE9iamVjdGl2ZS1DIGNvZGUgdGhhdCBjYW5ub3QgY29tcGlsZQorICAgICogW1RIUklGVC0zNDAzXSAtIEpTT04gU3RyaW5nIHJlYWRlciBkb2Vzbid0IHJlY29nbml6ZSBVVEYtMTYgc3Vycm9nYXRlIHBhaXJzCisgICAgKiBbVEhSSUZULTMzNjJdIC0gbWFrZSBjaGVjayBmYWlscyBmb3IgQysrIGF0IHRoZSBTZWN1cml0eVRlc3QKKyAgICAqIFtUSFJJRlQtMzM5NV0gLSBDb2NvYSBjb21waWxlciBwcm9kdWNlcyBjb3JydXB0IGNvZGUgd2hlbiBib3hpbmcgZW51bXMgaW5zaWRlIG1hcC4KKyAgICAqIFtUSFJJRlQtMzM5NF0gLSBjb21waWxlciBnZW5lcmF0ZXMgdW5jb21waWxhYmxlIGNvZGUKKyAgICAqIFtUSFJJRlQtMzM4OF0gLSBoYXNoIGRvZXNuJ3Qgd29yayBvbiBzZXQvbGlzdAorICAgICogW1RIUklGVC0zMzkxXSAtIFdyb25nIGJvb2wgZm9ybWF0dGluZyBpbiB0ZXN0IHNlcnZlcgorICAgICogW1RIUklGVC0zMzkwXSAtIFRUb3JuYWRvIHNlcnZlciBkb2Vzbid0IGhhbmRsZSBjbG9zZWQgY29ubmVjdGlvbnMgcHJvcGVybHkKKyAgICAqIFtUSFJJRlQtMzM4Ml0gLSBUQmFzZSBjbGFzcyBmb3IgQysrIExpYnJhcnkKKyAgICAqIFtUSFJJRlQtMzM5Ml0gLSBKYXZhIFRabGliVHJhbnNwb3J0IGRvZXMgbm90IGNsb3NlIGl0cyB3cmFwcGVyIHN0cmVhbXMgdXBvbiBjbG9zZSgpCisgICAgKiBbVEhSSUZULTMzODNdIC0gaTY0IHJlbGF0ZWQgd2FybmluZ3MgCisgICAgKiBbVEhSSUZULTMzODZdIC0gbWlzYy4gd2FybmluZ3Mgd2l0aCBtYWtlIGNoZWNrCisgICAgKiBbVEhSSUZULTMzODVdIC0gd2FybmluZzogZm9ybWF0IOKAmCVsdeKAmSBleHBlY3RzIOKAmGxvbmcgdW5zaWduZWQgaW504oCZLCBidXQgaGFzIHR5cGUg4oCYc3RkOjpiYXNpY19zdHJpbmc8Y2hhcj46OnNpemVfdHlwZSB7YWthIHVuc2lnbmVkIGludH0KKyAgICAqIFtUSFJJRlQtMzM1NV0gLSBucG0gV0FSTiBwYWNrYWdlLmpzb24gdGhyaWZ0QDEuMC4wLWRldiBObyBsaWNlbnNlIGZpZWxkLgorICAgICogW1RIUklGVC0zMzYwXSAtIEltcHJvdmUgY3Jvc3MgdGVzdCBzZXJ2ZXJzIGFuZCBjbGllbnRzIGZ1cnRoZXIKKyAgICAqIFtUSFJJRlQtMzM1OV0gLSBCaW5hcnkgZmllbGQgaW5jb21wYXRpYmlsaXRpZXMKKyAgICAqIFtUSFJJRlQtMzM1NF0gLSBGaXggd29yZC1leHRyYWN0aW9uIHN1YnN0ciBidWcgaW4gaW5pdGlhbGlzbSBjb2RlCisgICAgKiBbVEhSSUZULTMzNTBdIC0gUHl0aG9uIEpTT04gcHJvdG9jb2wgZG9lcyBub3QgZW5jb2RlIGJpbmFyeSBhcyBCYXNlNjQKKyAgICAqIFtUSFJJRlQtMzU3N10gLSBhc3NlcnRpb24gZmFpbGVkIGF0IGxpbmUgNTEyIG9mIHRlc3Rjb250YWluZXJ0ZXN0LmMKKyAgICAqIFtUSFJJRlQtMzU3Nl0gLSBCb29zdCB0ZXN0IC0tbG9nX2Zvcm1hdCBhcmcgZG9lcyBub3QgYWNjZXB0IGxvd2VyY2FzZQorICAgICogW1RIUklGVC0zNTc1XSAtIEdvIGNvbXBpbGVyIHRyaWVzIHRvIHVzZSB1bmV4cG9ydGVkIGxpYnJhcnkgbWV0aG9kcyB3aGVuIHVzaW5nIHJlYWRfd3JpdGVfcHJpdmF0ZQorICAgICogW1RIUklGVC0zNTc0XSAtIENvY29hIGdlbmVyYXRvciBtYWtlcyB1bmNvbXBpbGFibGUgaW1wb3J0cworICAgICogW1RIUklGVC0zNTcwXSAtIFJlbW92ZSBkdXBsaWNhdGUgaW5zdGFuY2VzIHRoYXQgYXJlIGFkZGVkIGJ5IHVwc3RyZWFtCisgICAgKiBbVEhSSUZULTM1NzFdIC0gTWFrZSBmZWF0dXJlIHRlc3QgcmVzdWx0IGJyb3dzYWJsZQorICAgICogW1RIUklGVC0zNTY5XSAtIGNfZ2xpYiBwcm90b2NvbHMgZG8gbm90IGNoZWNrIG51bWJlciBvZiBieXRlcyByZWFkIGJ5IHRyYW5zcG9ydAorICAgICogW1RIUklGVC0zNTY4XSAtIFRIZWFkZXIgc2VydmVyIGNyYXNoZXMgb24gcmVhZFNsb3cKKyAgICAqIFtUSFJJRlQtMzU2N10gLSBHTGliLUdPYmplY3QtQ1JJVElDQUwgKio6IGdfb2JqZWN0X3VucmVmOiBhc3NlcnRpb24gJ0dfSVNfT0JKRUNUIChvYmplY3QpJyBmYWlsZWQKKyAgICAqIFtUSFJJRlQtMzU2Nl0gLSBDKysvUXQ6IFRRVGNwU2VydmVyVGVzdDo6dGVzdF9jb21tdW5pY2F0ZSgpIGlzIG5ldmVyIGV4ZWN1dGVkCisgICAgKiBbVEhSSUZULTM1NjRdIC0gQysrL1F0OiBwb3RlbnRpYWwgY29yZSBkdW1wIGluIFRRVGNwU2VydmVyIGluIGNhc2UgYW4gZXhjZXB0aW9uIG9jY3VycyBpbiBUQXN5bmNQcm9jZXNzb3I6OnByb2Nlc3MoKQorICAgICogW1RIUklGVC0zNTU4XSAtIHR5cG9zIGluIGNfZ2xpYiB0ZXN0cworICAgICogW1RIUklGVC0zNTU5XSAtIEZpeCBhd2t3YXJkIGV4dHJhIHNlbWktY29sb25zIHdpdGggQ29jb2EgY29udGFpbmVyIGxpdGVyYWxzCisgICAgKiBbVEhSSUZULTM1NTVdIC0gJ2NvbmZpZ3VyZScgc2NyaXB0IGRvZXMgbm90IGhvbm9yIC0td2l0aC1vcGVuc3NsPTxwYXRoPiBmb3IgbGliY3J5cHRvIGZvciBCTl9pbml0CisgICAgKiBbVEhSSUZULTM1NTRdIC0gQ29uc3RhbnQgZGVjbHMgbWF5IGxlYWQgdG8gIkVycm9yOiBpbnRlcm5hbCBlcnJvcjogcHJlcGFyZV9tZW1iZXJfbmFtZV9tYXBwaW5nKCkgYWxyZWFkeSBhY3RpdmUgZm9yIGRpZmZlcmVudCBzdHJ1Y3QiCisgICAgKiBbVEhSSUZULTM1NTJdIC0gZ2xpYl9jIE1lbW9yeSBMZWFrCisgICAgKiBbVEhSSUZULTM1NTFdIC0gVGhyaWZ0IHBlcmwgbGlicmFyeSBtaXNzaW5nIHBhY2thZ2UgZGVjbGFyYXRpb24KKyAgICAqIFtUSFJJRlQtMzU0OV0gLSBFeGNlcHRpb25zIGFyZSBub3QgcHJvcGVybHkgc3RyaW5naWZpZWQgaW4gUGVybCBsaWJyYXJ5CisgICAgKiBbVEhSSUZULTM1NDZdIC0gTm9kZUpTIGNvZGUgc2hvdWxkIG5vdCBiZSBuYW1lc3BhY2VkIChhbmQgaXMgY3VycmVudGx5IG5vdCBzdHJpY3QtbW9kZSBjb21wbGlhbnQpCisgICAgKiBbVEhSSUZULTM1NDVdIC0gQ29udGFpbmVyIHR5cGUgbGl0ZXJhbHMgZG8gbm90IGNvbXBpbGUKKyAgICAqIFtUSFJJRlQtMzUzOF0gLSBSZW1vdmUgVW5ib3VuZE1ldGhvZFR5cGUgaW4gVFByb3RvY29sRGVjb3JhdG9yCisgICAgKiBbVEhSSUZULTM1MzZdIC0gRXJyb3IgJ2NoYXInIGRvZXMgbm90IGNvbnRhaW4gYSBkZWZpbml0aW9uIGZvciAnSXNMb3dTdXJyb2dhdGUnIGZvciBXUDcgdGFyZ2V0CisgICAgKiBbVEhSSUZULTM1MzRdIC0gTGluayBlcnJvciB3aGVuIGJ1aWxkaW5nIHdpdGggUXQ1CisgICAgKiBbVEhSSUZULTM1MzNdIC0gQ2FuIG5vdCBzZW5kIG5pbCBwb2ludGVyIGFzIHNlcnZpY2UgbWV0aG9kIGFyZ3VtZW50CisgICAgKiBbVEhSSUZULTM1MDddIC0gVEh0dHBDbGllbnQgZG9lcyBub3QgdXNlIHByb3h5IGZyb20gaHR0cF9wcm94eSwgaHR0cHNfcHJveHkgZW52aXJvbm1lbnQgdmFyaWFibGVzCisgICAgKiBbVEhSSUZULTM1MDJdIC0gQysrIFRTZXJ2ZXJTb2NrZXQgcGFzc2VzIHNtYWxsIGJ1ZmZlciB0byBnZXRzb2NrbmFtZQorICAgICogW1RIUklGVC0zNTAxXSAtIEZvcndhcmQgc2xhc2ggaW4gY29tbWVudCBjYXVzZXMgY29tcGlsZXIgZXJyb3IKKyAgICAqIFtUSFJJRlQtMzQ5OF0gLSBDKysgbGlicmFyeSBhc3N1bWVzIG9wdGlvbmFsIGZ1bmN0aW9uIHB0aHJlYWRfYXR0cl9zZXRzY2hlZHBvbGljeSBpcyBhdmFpbGFibGUKKyAgICAqIFtUSFJJRlQtMzQ5N10gLSBCdWlsZCBmYWlscyB3aXRoICJpbnZhbGlkIHVzZSBvZiBpbmNvbXBsZXRlIHR5cGUiCisgICAgKiBbVEhSSUZULTM0OTZdIC0gQysrOiBDb2Igc3R5bGUgY2xpZW50IGZhaWxzIHdoZW4gc2VuZGluZyBhIGNvbnNlY3V0aXZlIHJlcXVlc3QKKyAgICAqIFtUSFJJRlQtMzQ5M10gLSBsaWJ0aHJpZnQgZG9lcyBub3QgY29tcGlsZSBvbiB3aW5kb3dzIHVzaW5nIHZpc3VhbCBzdHVkaW8KKyAgICAqIFtUSFJJRlQtMzQ4OF0gLSB3YXJuaW5nOiB1bnVzZWQgdmFyaWFibGUgJ3Byb2dyYW0nCisgICAgKiBbVEhSSUZULTM0ODldIC0gd2FybmluZzogZGVwcmVjYXRlZCBjb252ZXJzaW9uIGZyb20gc3RyaW5nIGNvbnN0YW50IHRvICdjaGFyKicgWy1Xd3JpdGUtc3RyaW5nc10KKyAgICAqIFtUSFJJRlQtMzQ4N10gLSBGdWxsIHN1cHBvcnQgZm9yIG5ld2VyIERlbHBoaSB2ZXJzaW9ucworICAgICogW1RIUklGVC0zNTI4XSAtIEZpeCB3YXJuaW5ncyBpbiB0aHJpZnQubGwKKyAgICAqIFtUSFJJRlQtMzUyN10gLSAtZ2VuIHB5OmR5bmFtaWMsdXRmOHN0cmluZ3MgaWdub3JlcyB1dGY4c3RyaW5ncyBvcHRpb24KKyAgICAqIFtUSFJJRlQtMzUyNl0gLSBDb2RlIGdlbmVyYXRlZCBieSBweTp1dGY4c3RyaW5ncyBkb2VzIG5vdCB3b3JrIGZvciBQeXRob24zCisgICAgKiBbVEhSSUZULTM1MjRdIC0gZGNjMzIgd2FybmluZyAiVzEwMDAgU3ltYm9sICdJc0xvd1N1cnJvZ2F0ZScgaXMgZGVwcmVjYXRlZDogJ1VzZSBUQ2hhckhlbHBlciciIGluIFRocmlmdC5Qcm90b2NvbC5KU09OLnBhcworICAgICogW1RIUklGVC0zNTI1XSAtIHB5OmR5bmFtaWMgZmFpbHMgdG8gaGFuZGxlIGJpbmFyeSBsaXN0L3NldC9tYXAgZWxlbWVudAorICAgICogW1RIUklGVC0zNTIxXSAtIFRTaW1wbGVKU09OUHJvdG9jb2xUZXN0IGlzIG5vdCBkZXRlcm1pbmlzdGljIChmYWlscyB3aGVuIHJ1biBvbiBKREsgOCkKKyAgICAqIFtUSFJJRlQtMzUyMF0gLSBEYXJ0IFRTb2NrZXQgb25FcnJvciBzdHJlYW0gc2hvdWxkIGJlIHR5cGVkIGFzIE9iamVjdAorICAgICogW1RIUklGVC0zNTE5XSAtIGZhc3RiaW5hcnkgZG9lcyBub3Qgd29yayB3aXRoIC1nZW4gcHk6dXRmOHN0cmluZ3MKKyAgICAqIFtUSFJJRlQtMzUxOF0gLSBUQ29uY3VycmVudENsaWVudFN5bmNJbmZvIGZpbGVzIHdlcmUgbWlzc2luZyBmb3IgVmlzdWFsIFN0dWRpbworICAgICogW1RIUklGVC0zNTEyXSAtIGNfZ2xpYjogQnVpbGQgZmFpbHMgZHVlIHRvIG1pc3NpbmcgZmVhdHVyZXMuaAorICAgICogW1RIUklGVC0zNDgzXSAtIEluY29ycmVjdCBlbXB0eSBiaW5hcnkgaGFuZGxpbmcgaW50cm9kdWNlZCBieSBUSFJJRlQtMzM1OQorICAgICogW1RIUklGVC0zNDc5XSAtIE9uZXdheSBjYWxscyBzaG91bGQgbm90IHJldHVybiBleGNlcHRpb25zIHRvIGNsaWVudHMKKyAgICAqIFtUSFJJRlQtMzQ3OF0gLSBSZXN0b3JlIGRyb3BwZWQgbWV0aG9kIHRvIFRIc0hhU2VydmVyLmphdmEKKyAgICAqIFtUSFJJRlQtMzQ3N10gLSBQYXJzZXIgZmFpbHMgb24gZW51bSBpdGVtIHRoYXQgc3RhcnRzIHdpdGggJ0UnIGxldHRlciBhbmQgY29udGludWVzIHdpdGggbnVtYmVyIAorICAgICogW1RIUklGVC0zNDc2XSAtIE1pc3NpbmcgaW5jbHVkZSBpbiAuL3NyYy90aHJpZnQvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5jcHAKKyAgICAqIFtUSFJJRlQtMzQ3NF0gLSBEb2NrZXI6IHRocmlmdC1jb21waWxlcgorICAgICogW1RIUklGVC0zNDczXSAtIFdoZW4gIm9wdGlvbmFsJyBpcyB1c2VkIHdpdGggYSBzdHJ1Y3QgbWVtYmVyLCBDKysgc2VydmVyIHNlZW1zIHRvIG5vdCByZXR1cm4gaXQgY29ycmVjdGx5CisgICAgKiBbVEhSSUZULTM0NjhdIC0gRGFydCBUU29ja2V0VHJhbnNwb3J0IG9uRXJyb3IgaGFuZGxlciBpcyB0b28gcmVzdHJpY3RpdmUKKyAgICAqIFtUSFJJRlQtMzQ1MV0gLSB0aHJpZnRfcHJvdG9jb2wgUEhQIGV4dGVuc2lvbiBtaXNzaW5nIGNvbmZpZy5tNCBmaWxlCisgICAgKiBbVEhSSUZULTM0NTZdIC0gcm91bmRpbmcgaXNzdWUgaW4gc3RhdGljIGFzc2VydAorICAgICogW1RIUklGVC0zNDU1XSAtIHN0cnVjdCB3cml0ZSBtZXRob2QncyByZXR1cm4gdmFsdWUgaXMgaW5jb3JyZWN0CisgICAgKiBbVEhSSUZULTM0NTRdIC0gUHl0aG9uIFRvcm5hZG8gdHV0b3JpYWwgaXMgYnJva2VuCisgICAgKiBbVEhSSUZULTM0NjNdIC0gSmF2YSBjYW4ndCBiZSBkaXNhYmxlZCBpbiBDTWFrZSBidWlsZAorICAgICogW1RIUklGVC0zNDUwXSAtIE5QRSB3aGVuIHVzaW5nIFNTTAorICAgICogW1RIUklGVC0zNDQ5XSAtIFRCYXNlQXN5bmNQcm9jZXNzb3IgZmIucmVzcG9uc2VSZWFkeSgpIG5ldmVyIGNhbGxlZCBmb3Igb25ld2F5IGZ1bmN0aW9ucworICAgICogW1RIUklGVC0zNDcxXSAtIERhcnQgZ2VuZXJhdG9yIGRvZXMgbm90IGhhbmRsZSB1cHBlcmNhc2UgYXJndW1lbnQgbmFtZXMKKyAgICAqIFtUSFJJRlQtMzQ3MF0gLSBTcG9yYWRpYyB0aW1lb3V0cyB3aXRoIHBpcGVzCisgICAgKiBbVEhSSUZULTM0NjVdIC0gR28gQ29kZSBXaXRoIENvbXBsZXggQ29uc3QgSW5pdGlhbGl6ZXIgQ29tcGlsYXRpb24gRGVwZW5kcyBPbiBTdHJ1Y3QgT3JkZXIKKyAgICAqIFtUSFJJRlQtMzQ2NF0gLSBGaXggc2V2ZXJhbCBkZWZlY3RzIGluIGNfZ2xpYiBjb2RlIGdlbmVyYXRvcgorICAgICogW1RIUklGVC0zNDYyXSAtIENvY29hIGdlbmVyYXRlcyBJbmNvcnJlY3QgI2ltcG9ydCBoZWFkZXIgbmFtZXMKKyAgICAqIFtUSFJJRlQtMzQ1M10gLSByZW1vdmUgcmF0X2V4Y2x1ZGUKKyAgICAqIFtUSFJJRlQtMzQxOF0gLSBVc2Ugb2YgY2lwaGVycyBpbiBzc2wud3JhcF9zb2NrZXQoKSBicmVha3MgcHl0aG9uIDIuNiBjb21wYXRpYmlsaXR5CisgICAgKiBbVEhSSUZULTM0MTddIC0gIm5hbWVzcGFjZSB4c2QiIGlzIG5vdCByZWFsbHkgd29ya2luZworICAgICogW1RIUklGVC0zNDEzXSAtIFRocmlmdCBjb2RlIGdlbmVyYXRpb24gYnVnIGluIEdvIHdoZW4gZXh0ZW5kaW5nIHNlcnZpY2UKKyAgICAqIFtUSFJJRlQtMzQyMF0gLSBDKys6IFRTU0xTb2NrZXRzIGFyZSBub3QgaW50ZXJydXB0YWJsZQorICAgICogW1RIUklGVC0zNDE1XSAtIGluY2x1ZGUgdW5pc3RkLmggY29uZGl0aW9uYWxseQorICAgICogW1RIUklGVC0zNDE0XSAtICNpbmNsdWRlIDxwd2QuaD4gaW4gVEhlYWRlclRyYW5zcG9ydC5oIGJyZWFrcyB3aW5kb3dzIGJ1aWxkCisgICAgKiBbVEhSSUZULTM0MTFdIC0gR28gZ2VuZXJhdGVzIHJlbW90ZXMgd2l0aCB3cm9uZyBwYWNrYWdlIHF1YWxpZmllcnMgd2hlbiBpbmNsdWRpbmcKKyAgICAqIFtUSFJJRlQtMzQzMF0gLSBHbyBUSHR0cENsaWVudCBkb2VzIG5vdCByZWFkIEhUVFAgcmVzcG9uc2UgYm9keSB0byBjb21wbGV0aW9uIHdoZW4gY2xvc2luZworICAgICogW1RIUklGVC0zNDIzXSAtIEZpcnN0IGNhbGwgdG8gdGhyaWZ0X3RyYW5zcG9ydDpyZWFkX2V4YWN0IGZhaWxzIHRvIGRpc3BhdGNoIGNvcnJlY3QgZnVuY3Rpb24KKyAgICAqIFtUSFJJRlQtMzQyMl0gLSBHbyBUU2VydmVyU29ja2V0IGRvZXNuJ3QgY2xvc2Ugb24gSW50ZXJydXB0CisgICAgKiBbVEhSSUZULTM0MjFdIC0gcmViYXIgYXMgZGVwZW5kZW5jeSBpbnN0ZWFkIG9mIGJ1bmRsaW5nICh3YXM6ICByZWJhciBmYWlscyBpZiBQV0QgY29udGFpbnMgVW5pY29kZSkKKyAgICAqIFtUSFJJRlQtMzQyOF0gLSBHbyB0ZXN0IGZhaWxzIHdoZW4gcnVubmluZyBtYWtlIGNoZWNrCisgICAgKiBbVEhSSUZULTM0NDVdIC0gVGhyb3dhYmxlIG1lc3NhZ2VzIGFyZSBoaWRkZW4gZnJvbSBKVk0gc3RhY2sgdHJhY2Ugb3V0cHV0CisgICAgKiBbVEhSSUZULTM0NDNdIC0gVGhyaWZ0IGluY2x1ZGUgY2FuIGdlbmVyYXRlIHVuY29tcGlsYWJsZSBjb2RlCisgICAgKiBbVEhSSUZULTM0NDRdIC0gTGFyZ2UgNjQgYml0IEludGVnZXIgZG9lcyBub3QgcHJlc2VydmUgdmFsdWUgdGhyb3VnaCBOb2RlLmpzIEpTT05Qcm90b2NvbCAKKyAgICAqIFtUSFJJRlQtMzQzNl0gLSBtaXNjLiBjcm9zcyB0ZXN0IGlzc3VlcyB3aXRoIFVURi04IHBhdGggbmFtZXMKKyAgICAqIFtUSFJJRlQtMzQzNV0gLSBQdXQgZ2VuZXJhdGVkIEphdmEgY29kZSBmb3IgZnVsbGNhbWVsIHRlc3RzIGluIGEgc2VwYXJhdGUgcGFja2FnZS9uYW1lc3BhY2UKKyAgICAqIFtUSFJJRlQtMzQzM10gLSBEb3VibGVzIGFyZW4ndCBpbnRlcnByZXRlZCBjb3JyZWN0bHkKKyAgICAqIFtUSFJJRlQtMzQzN10gLSBNaW5ndy13NjQgYnVpbGQgZmFpbAorICAgICogW1RIUklGVC0zNDM0XSAtIERhcnQgZ2VuZXJhdG9yIHByb2R1Y2VzIGVtcHR5IG5hbWUgaW4gcHVic3BlYy55YW1sIGZvciBpbmNsdWRlcyB3aXRob3V0IG5hbWVzcGFjZXMKKyAgICAqIFtUSFJJRlQtMzQwOF0gLSBKU09OIGdlbmVyYXRvciBlbWl0cyBpbmNvcnJlY3QgdHlwZXMKKyAgICAqIFtUSFJJRlQtMzQwNl0gLSBDb2NvYSBjbGllbnQgc2hvdWxkIG5vdCBzY2hlZHVsZSBzdHJlYW1zIG9uIG1haW4gcnVubG9vcAorICAgICogW1RIUklGVC0zNDA0XSAtIEpTT04gU3RyaW5nIHJlYWRlciBkb2Vzbid0IHJlY29nbml6ZSBVVEYtMTYgc3Vycm9nYXRlIHBhaXIKKyAgICAqIFtUSFJJRlQtMzYzNl0gLSBEb3VibGUgcHJlY2lzaW9uIGlzIG5vdCBmdWxseSBwcmVzZXJ2ZWQgaW4gQysrIFRKU09OUHJvdG9jb2wKKyAgICAqIFtUSFJJRlQtMzYzMl0gLSBjX2dsaWIgdGVzdHNlcmlhbGl6YXRpb24gZmFpbHMgd2l0aCBnbGliIGFzc2VydGlvbgorICAgICogW1RIUklGVC0zNjE5XSAtIFVzaW5nIFRocmlmdCAwLjkuMyB3aXRoIGdvb2dsZXRlc3Qgb24gTGludXggZ2NjIDQuOSAvIEMrKzExCisgICAgKiBbVEhSSUZULTM2MTddIC0gQ01ha2UgZG9lcyBub3QgYnVpbGQgZ3YveG1sIGdlbmVyYXRvcnMKKyAgICAqIFtUSFJJRlQtMzYxNV0gLSBGaXggUHl0aG9uIFNTTCBjbGllbnQgcmVzb3VyY2UgbGVhayBvbiBjb25uZWN0aW9uIGZhaWx1cmUKKyAgICAqIFtUSFJJRlQtMzYxNl0gLSBsaWIvcHkvdGVzdC90ZXN0X3NzbHNvY2tldC5weSBpcyBmbGFreQorICAgICogW1RIUklGVC0zNjQzXSAtIFBlcmwgU1NMIHNlcnZlciBjcnVzaGVzIGlmIGEgY2xpZW50IGRpc2Nvbm5lY3Qgd2l0aG91dCBoYW5kc2hha2UKKyAgICAqIFtUSFJJRlQtMzYzOV0gLSBDIyBUaHJpZnQgbGlicmFyeSBmb3JjZXMgVExTIDEuMCwgdGh3YXJ0aW5nIFRMUyAxLjIgdXNhZ2UKKyAgICAqIFtUSFJJRlQtMzYzM10gLSBUcmF2aXMgIkMgQysrIC0gR0NDIiBidWlsZCB3YXMgdXNpbmcgY2xhbmcKKyAgICAqIFtUSFJJRlQtMzYzNF0gLSBGaXggUHl0aG9uIFRTb2NrZXQgcmVzb3VyY2UgbGVhayBvbiBjb25uZWN0aW9uIGZhaWx1cmUKKyAgICAqIFtUSFJJRlQtMzYzMF0gLSBEZWJpYW4vVWJ1bnR1IGluc3RhbGwgZG9jcyBuZWVkIGFuIHVwZGF0ZQorICAgICogW1RIUklGVC0zNjI5XSAtIFBhcnNlciBzZXRzIGV4aXRjb2RlIG9uIGVycm9ycywgYnV0IGdlbmVyYXRvciBkb2VzIG5vdAorICAgICogW1RIUklGVC0zNjA4XSAtIGxpYi9jcHAvdGVzdC9TZWN1cml0eVRlc3QgaXMgZmxha3kgaW4gamVua2lucyBUaHJpZnQtcHJlY29tbWl0IGJ1aWxkLgorICAgICogW1RIUklGVC0zNjAxXSAtIEJldHRlciBjb25mb3JtYW5jZSB0byBQRVA4IGZvciBnZW5lcmF0ZWQgY29kZQorICAgICogW1RIUklGVC0zNTk5XSAtIFZhbGlkYXRlIGNsaWVudCBJUCBhZGRyZXNzIGFnYWluc3QgY2VydCdzIFN1YmplY3RBbHROYW1lCisgICAgKiBbVEhSSUZULTM1OThdIC0gVEJ1ZmZlcmVkVHJhbnNwb3J0IGRvZXNuJ3QgaW5zdGFudGlhdGUgY2xpZW50IGNvbm5lY3Rpb24KKyAgICAqIFtUSFJJRlQtMzU5N10gLSBgbWFrZSBjaGVja2AgaGFuZ3MgaW4gZ28gdGVzdHMKKyAgICAqIFtUSFJJRlQtMzU4OV0gLSBEYXJ0IGdlbmVyYXRvciB1c2VzIHdyb25nIG5hbWUgaW4gY29uc3RydWN0b3IgZm9yIHVwcGVyY2FzZSBhcmd1bWVudHMgd2l0aCBkZWZhdWx0cworICAgICogW1RIUklGVC0zNTg4XSAtIFVzaW5nIFR5cGVTY3JpcHQgd2l0aCAtLW5vSW1wbGljaXRBbnkgZmFpbHMKKyAgICAqIFtUSFJJRlQtMzU4NF0gLSBib29sZWFuIGZhbHNlIHZhbHVlIGNhbm5vdCBiZSB0cmFuc2ZlcnJlZAorICAgICogW1RIUklGVC0zNTc4XSAtIE1ha2UgVEhlYWRlclRyYW5zcG9ydCBkZXRlY3QgVENvbXBhY3QgZnJhbWVkIGFuZCB1bmZyYW1lZAorICAgICogW1RIUklGVC0zMzIzXSAtIFB5dGhvbiBsaWJyYXJ5IGRvZXMgbm90IGhhbmRsZSBlc2NhcGVkIGZvcndhcmQgc2xhc2ggKCIvIikgaW4gSlNPTgorICAgICogW1RIUklGVC0zMzIyXSAtIENNYWtlIGdlbmVyYXRlZCAibWFrZSBjaGVjayIgZmFpbGVzIG9uIHB5dGhvbl90ZXN0CisgICAgKiBbVEhSSUZULTMzMjFdIC0gVGhyaWZ0IGNhbid0IGJlIGFkZGVkIGFzIGEgc3ViZGlyZWN0b3J5IG9mIGFub3RoZXIgQ01ha2UtYmFzZWQgcHJvamVjdAorICAgICogW1RIUklGVC0zMzE0XSAtIERvdHMgaW4gZmlsZSBuYW1lcyBvZiBpbmNsdWRlcyBjYXVzZXMgZG90cyBpbiBqYXZhc2NyaXB0IHZhcmlhYmxlIG5hbWVzCisgICAgKiBbVEhSSUZULTMzMDddIC0gU2VnZmF1bHQgaW4gUnVieSBzZXJpYWxpemVyCisgICAgKiBbVEhSSUZULTMzMDldIC0gTWlzc2luZyBUQ29uc3RhbnQucGhwIGluIC9saWIvcGhwL01ha2VmaWxlLmFtCisgICAgKiBbVEhSSUZULTM4MTBdIC0gdW5yZXNvbHZlZCBleHRlcm5hbCBzeW1ib2wgcHVibGljOiB2aXJ0dWFsIHZvaWQgX19jZGVjbCBhcGFjaGU6OnRocmlmdDo6c2VydmVyOjpUU2VydmVyRnJhbWV3b3JrOjpzZXJ2ZSh2b2lkKQorICAgICogW1RIUklGVC0zNzM2XSAtIEMrKyBsaWJyYXJ5IGJ1aWxkIGZhaWxzIGlmIE9wZW5TU0wgZG9lcyBub3Qgc3VycnBvdCBTU0x2MworICAgICogW1RIUklGVC0zODc4XSAtIENvbXBpbGUgZXJyb3IgaW4gVFNTTFNvY2tldC5jcHAgd2l0aCBuZXcgT3BlblNTTCBbQ1JZUFRPX251bV9sb2Nrc10KKyAgICAqIFtUSFJJRlQtMzk0OV0gLSBtaXNzaW5nIG1ha2UgZGlzdCBlbnRyeSBmb3IgY29tcGlsZXIvY3BwL3Rlc3QKKyAgICAqIFtUSFJJRlQtNDQ5XSAtIFRoZSB3aXJlIGZvcm1hdCBvZiB0aGUgSlNPTiBQcm90b2NvbCBtYXkgbm90IGFsd2F5cyBiZSB2YWxpZCBKU09OIGlmIGl0IGNvbnRhaW5zIG5vbi1VVEY4IGVuY29kZWQgc3RyaW5ncworICAgICogW1RIUklGVC0xNjJdIC0gVGhyaWZ0IHN0cnVjdHVyZXMgYXJlIHVuaGFzaGFibGUsIHByZXZlbnRpbmcgdGhlbSBmcm9tIGJlaW5nIHVzZWQgYXMgc2V0IGVsZW1lbnRzCisgICAgKiBbVEhSSUZULTM5NjFdIC0gVENvbm5lY3RlZENsaWVudCBkb2VzIG5vdCB0ZXJtaW5hdGUgdGhlIGNvbm5lY3Rpb24gdG8gdGhlIGNsaWVudCBpZiBhbiBleGNlcHRpb24gd2hpbGUgcHJvY2Vzc2luZyB0aGUgcmVjZWl2ZWQgbWVzc2FnZSBvY2N1cmVzLgorICAgICogW1RIUklGVC0zODgxXSAtIFRyYXZpcyBDSSBidWlsZHMgYXJlIGZhaWxpbmcgZHVlIHRvIGRvY2tlciBmYWlsdXJlcyAodGhyZWUgcmV0cmllcywgYW5kIGdpdmVzIHVwKQorICAgICogW1RIUklGVC0zOTM3XSAtIENhbm5vdCBjb21waWxlIDAuMTAuMCBkZXZlbG9wbWVudCB0aXAgd2l0aCBnY2MtNC42LngKKyAgICAqIFtUSFJJRlQtMzk2NF0gLSBVbnN1cHBvcnRlZCBtZWNoYW5pc20gdHlwZSA/Pz8/PyBkdWUgdG8gZGVwZW5kZW5jeSBvbiBkZWZhdWx0IE9TLWRlcGVuZGVudCBjaGFyc2V0CisgICAgKiBbVEhSSUZULTMwMzhdIC0gVXNlIG9mIHZvbGF0aWxlIGluIGNwcCBsaWJyYXJ5CisgICAgKiBbVEhSSUZULTMzMDFdIC0gSmF2YSBnZW5lcmF0ZWQgY29kZSB1c2VzIGltcG9ydHMgdGhhdCBjYW4gbGVhZCB0byBjbGFzcyBuYW1lIGNvbGxpc2lvbnMgd2l0aCBJREwgZGVmaW5lZCB0eXBlcworICAgICogW1RIUklGVC0zMzQ4XSAtIFBIUCBUQ29tcGFjdFByb3RvY29sIGJvb2wmaW50NjQgcmVhZHZhbHVlIGJ1ZworICAgICogW1RIUklGVC0zOTU1XSAtIFRUaHJlYWRlZFNlcnZlciBNZW1vcnkgTGVhaworICAgICogW1RIUklGVC0zODI5XSAtIFRocmlmdCBkb2VzIG5vdCBpbnN0YWxsIFB5dGhvbiBMaWJyYXJpZXMgaWYgVHdpc3RlZCBpcyBub3QgaW5zdGFsbGVkCisgICAgKiBbVEhSSUZULTM5MzJdIC0gQysrIFRocmVhZE1hbmFnZXIgaGFzIGEgcmFyZSB0ZXJtaW5hdGlvbiByYWNlCisgICAgKiBbVEhSSUZULTM4MjhdIC0gY21ha2UgZmFpbHMgd2hlbiBCb29zdF9JTkNMVURFX0RJUlMgKGFuZCBvdGhlciB2YXJpYWJsZXMgcGFzc2VkIHRvIGluY2x1ZGVfZGlyZWN0b3JpZXMoKSkgaXMgZW1wdHkgCisgICAgKiBbVEhSSUZULTM5NThdIC0gQ01ha2UgV0lUSF9NVCBvcHRpb24gZm9yIHdpbmRvd3Mgc3RhdGljIHJ1bnRpbWUgbGlua2luZyBkb2VzIG5vdCBzdXBwb3J0IHRoZSBjbWFrZSBidWlsZCB0eXBlIFJlbFdpdGhEZWJJbmZvCisgICAgKiBbVEhSSUZULTM5NTddIC0gVENvbm5lY3RlZENsaWVudCBkb2VzIG5vdCBkaXNjb25uZWN0IGZyb20gY2xpZW50cyB3aGVuIHRoZWlyIHRpbWVvdXQgaXMgcmVhY2hlZC4KKyAgICAqIFtUSFJJRlQtMzk1M10gLSBUU1NMU29ja2V0OjpjbG9zZSBzaG91bGQgaGFuZGxlIGV4Y2VwdGlvbnMgZnJvbSB3YWl0Rm9yRXZlbnQgYmVjYXVzZSBpdCBpcyBjYWxsZWQgYnkgdGhlIGRlc3RydWN0b3IuCisgICAgKiBbVEhSSUZULTM5NzddIC0gUEhQIGV4dGVuc2lvbiBjcmVhdGVzIHVuZGVmaW5lZCB2YWx1ZXMgd2hlbiBkZXNlcmlhbGl6aW5nIHNldHMKKyAgICAqIFtUSFJJRlQtMzk0N10gLSBzb2NrYWRkciB0eXBlIGlzbid0IGFsd2F5cyBsYXJnZSBlbm91Z2ggZm9yIHRoZSByZXR1cm4gb2YgZ2V0c29ja25hbWUKKyAgICAqIFtUSFJJRlQtMjc1NV0gLSBUaHJlYWRTYW5pdGl6ZXIgcmVwb3J0cyBkYXRhIHJhY2UgaW4gVGhyZWFkTWFuYWdlcjo6SW1wbDo6YWRkV29ya2VyCisgICAgKiBbVEhSSUZULTM5NDhdIC0gZXJybm8gaXMgbm90IHRoZSBjb3JyZWN0IG1ldGhvZCBvZiBnZXR0aW5nIHRoZSBlcnJvciBpbiB3aW5kb3dzCisgICAgKiBbVEhSSUZULTQwMDhdIC0gYnJva2VuIGNpIGR1ZSB0byB1cHN0cmVhbSBkZXBlbmRlbmN5IHZlcnNpb25pbmcgYnJlYWsKKyAgICAqIFtUSFJJRlQtMzk5OV0gLSBGaXggRGViaWFuICYgVWJ1bnR1IHBhY2thZ2UgZGVwZW5kZW5jaWVzCisgICAgKiBbVEhSSUZULTM4ODZdIC0gUEhQIGNyb3NzIHRlc3QgY2xpZW50IHJldHVybnMgMCBldmVuIHdoZW4gZmFpbGluZworICAgICogW1RIUklGVC0zOTk3XSAtIGJ1aWxkaW5nIHRocmlmdCBsaWJzIGRvZXMgbm90IHN1cHBvcnQgbmV3IG9wZW5zc2wKKworIyMgRG9jdW1lbnRhdGlvbgorICAgICogW1RIUklGVC0zODY3XSAtIFNwZWNpZnkgQmluYXJ5UHJvdG9jb2wgYW5kIENvbXBhY3RQcm90b2NvbAorCisjIyBFcGljCisgICAgKiBbVEhSSUZULTMwNDldIC0gQXMgYW4gaU9TIGRldmVsb3BlciwgSSB3YW50IGEgZ2VuZXJhdG9yIGFuZCBsaWJyYXJ5IHRoYXQgcHJvZHVjZXMgU3dpZnQgY29kZQorICAgICogW1RIUklGVC0yMzM2XSAtIFVURi04IHNlbnQgYnkgUEhQIGFzIEpTT04gaXMgbm90IHVuZGVyc3Rvb2QgYnkgVEpzb25Qcm90b2NvbAorCisjIyBJbXByb3ZlbWVudAorICAgICogW1RIUklGVC0xODY3XSAtIFB5dGhvbiBjbGllbnQvc2VydmVyIHNob3VsZCBzdXBwb3J0IGNsaWVudC1zaWRlIGNlcnRpZmljYXRlcy4KKyAgICAqIFtUSFJJRlQtMTMxM10gLSBjX2dsaWIgY29tcGFjdCBzdXBwb3J0CisgICAgKiBbVEhSSUZULTEzODVdIC0gbWFrZSBpbnN0YWxsIGRvZXNuJ3QgaW5zdGFsbCBqYXZhIGxpYnJhcnkgaW4gdGhlIHNldHRlZCBmb2xkZXIKKyAgICAqIFtUSFJJRlQtMTQzN10gLSBVcGRhdGUgUlBNIHNwZWMKKyAgICAqIFtUSFJJRlQtODQ3XSAtIFRlc3QgRnJhbWV3b3JrIGhhcm1vbml6YXRpb24gYWNyb3NzIGFsbCBsYW5ndWFnZXMKKyAgICAqIFtUSFJJRlQtODE5XSAtIGFkZCBFbnVtZXJhdGlvbiBmb3IgcHJvdG9jb2wsIHRyYW5zcG9ydCBhbmQgc2VydmVyIHR5cGVzCisgICAgKiBbVEhSSUZULTM5MjddIC0gRW1pdCBhbiBlcnJvciBpbnN0ZWFkIG9mIHRocm93IGFuIGVycm9yIGluIHRoZSBhc3luYyBjYWxsYmFjaworICAgICogW1RIUklGVC0zOTMxXSAtIFRTaW1wbGVTZXJ2ZXI6IElmIHByb2Nlc3MgcmVxdWVzdCBlbmNvdW50ZXIgVU5LTk9XTl9NRVRIT0QsIGRvbid0IGNsb3NlIHRyYW5zcG9ydC4KKyAgICAqIFtUSFJJRlQtMzkzNF0gLSBBdXRvbWF0aWNhbGx5IHJlc29sdmUgT3BlblNTTCBiaW5hcnkgdmVyc2lvbiBvbiBXaW5kb3dzIENJCisgICAgKiBbVEhSSUZULTM5MThdIC0gUnVuIHN1YnNldCBvZiBtYWtlIGNyb3NzCisgICAgKiBbVEhSSUZULTM5MDhdIC0gUmVtb3ZlIHJlZHVuZGFudCBkZXBlbmRlbmNpZXMgZnJvbSBEb2NrZXJmaWxlCisgICAgKiBbVEhSSUZULTM5MDddIC0gU2tpcCBEb2NrZXIgaW1hZ2UgYnVpbGQgb24gQ0kgd2hlbiB1bmNoYW5nZWQKKyAgICAqIFtUSFJJRlQtMzg2OF0gLSBKYXZhIHN0cnVjdCBlcXVhbHMgc2hvdWxkIGRvIGlkZW50aXR5IGNoZWNrIGJlZm9yZSBmaWVsZCBjb21wYXJpc29uCisgICAgKiBbVEhSSUZULTM4NDldIC0gUG9ydCBHbyBzZXJpYWxpemVyIGFuZCBkZXNlcmlhbGl6ZXIgdG8gZGFydAorICAgICogW1RIUklGVC0yOTg5XSAtIENvbXBsZXRlIENNYWtlIGJ1aWxkIGZvciBBcGFjaGUgVGhyaWZ0CisgICAgKiBbVEhSSUZULTI5ODBdIC0gVGhyaWZ0TWVtb3J5QnVmZmVyIGRvZXNuJ3QgaGF2ZSBhIGNvbnN0cnVjdG9yIG9wdGlvbiB0byB0YWtlIGFuIGV4aXN0aW5nIGJ1ZmZlcgorICAgICogW1RIUklGVC0yODU2XSAtIHJlZmFjdG9yIGVybGFuZyBiYXNpYyB0cmFuc3BvcnRzIGFuZCB1bmlmeSBpbnRlcmZhY2VzCisgICAgKiBbVEhSSUZULTI4NzddIC0gT3B0aW1pemUgZ2VuZXJhdGVkIGhhc2hDb2RlCisgICAgKiBbVEhSSUZULTI4NjldIC0gSlNPTjogcnVuIHNjaGVtYSB2YWxpZGF0aW9uIGZyb20gdGVzdHMKKyAgICAqIFtUSFJJRlQtMzExMl0gLSBbSmF2YV0gQXN5bmNNZXRob2RDYWxsYmFjayBzaG91bGQgYmUgdHlwZWQgaW4gZ2VuZXJhdGVkIEFzeW5jSWZhY2UKKyAgICAqIFtUSFJJRlQtMzI2M10gLSBQSFAganNvblNlcmlhbGl6ZSgpIHNob3VsZCBjYXN0IHNjYWxhciB0eXBlcworICAgICogW1RIUklGVC0yOTA1XSAtIENvY29hIGNvbXBpbGVyIHNob3VsZCBoYXZlIG9wdGlvbiB0byBwcm9kdWNlICJtb2Rlcm4iIE9iamVjdGl2ZS1DCisgICAgKiBbVEhSSUZULTI4MjFdIC0gRW5hYmxlIHRoZSB1c2Ugb2YgY3VzdG9tIEhUVFAtSGVhZGVyIGluIHRoZSBUcmFuc3BvcnQKKyAgICAqIFtUSFJJRlQtMjA5M10gLSBhZGRlZCB0aGUgYWJpbGl0eSB0byBzZXQgY29tcHJlc3Npb24gbGV2ZWwgaW4gQysrIHpsaWIgdHJhbnNwb3J0CisgICAgKiBbVEhSSUZULTIwODldIC0gQ29tcGlsZXIgaWdub3JlcyBkdXBsaWNhdGUgdHlwZW5hbWVzCisgICAgKiBbVEhSSUZULTIwNTZdIC0gTW92ZWQgYWxsICNpbmNsdWRlIGNvbmZpZy5oIHN0YXRlbWVudHMgdG8gI2luY2x1ZGUgPHRocmlmdC9jb25maWcuaD4KKyAgICAqIFtUSFJJRlQtMjAzMV0gLSBNYWtlIFNPX0tFRVBBTElWRSBjb25maWd1cmFibGUgZm9yIEMrKyBsaWIKKyAgICAqIFtUSFJJRlQtMjAyMV0gLSBJbXByb3ZlIGxhcmdlIGJpbmFyeSBwcm90b2NvbCBzdHJpbmcgcGVyZm9ybWFuY2UKKyAgICAqIFtUSFJJRlQtMjAyOF0gLSBDbGVhbnVwIHRocmVhZGluZyBoZWFkZXJzIC8gbGlicmFyaWVzCisgICAgKiBbVEhSSUZULTIwMTRdIC0gQ2hhbmdlIEMrKyBsaWIgaW5jbHVkZXMgdG8gdXNlIDxuYW1lc3BhY2UvPiBzdHlsZSB0aHJvdWdob3V0CisgICAgKiBbVEhSSUZULTIzMTJdIC0gdHJhdmlzLnltbDogYnVpbGQgZXZlcnl0aGluZworICAgICogW1RIUklGVC0xOTE1XSAtIE11bHRpcGxleGluZyBTZXJ2aWNlcworICAgICogW1RIUklGVC0xNzM2XSAtIFZpc3VhbCBTdHVkaW8gdG9wIGxldmVsIHByb2plY3QgZmlsZXMgd2l0aGluIG1zdmMKKyAgICAqIFtUSFJJRlQtMTczNV0gLSBpbnRlZ3JhdGUgdHV0b3JpYWwgaW50byByZWd1bGFyIGJ1aWxkCisgICAgKiBbVEhSSUZULTE1MzNdIC0gTWFrZSBUVHJhbnNwb3J0IHNob3VsZCBiZSBDbG9zZWFibGUKKyAgICAqIFtUSFJJRlQtMzVdIC0gTW92ZSBsYW5ndWFnZSB0ZXN0cyBpbnRvIHRoZWlyIGFwcHJvcHJpYXRlIGxpYnJhcnkgZGlyZWN0b3J5CisgICAgKiBbVEhSSUZULTEwNzldIC0gU3VwcG9ydCBpNjQgaW4gQVMzCisgICAgKiBbVEhSSUZULTExMDhdIC0gU1NMIHN1cHBvcnQgZm9yIHRoZSBSdWJ5IGxpYnJhcnkgCisgICAgKiBbVEhSSUZULTM4NTZdIC0gdXBkYXRlIGRlYmlhbiBwYWNrYWdlIGRlZXBlbmRlbmNpZXMKKyAgICAqIFtUSFJJRlQtMzgzM10gLSBoYXhlIGh0dHAgc2VydmVyIGltcGxlbWVudGF0aW9uIChieSBlbWJlZGluZyBpbnRvIHBocCB3ZWIgc2VydmVyKQorICAgICogW1RIUklGVC0zODM5XSAtIFBlcmZvcm1hbmNlIGlzc3VlIHdpdGggYmlnIG1lc3NhZ2UgZGVzZXJpYWxpemF0aW9uIHVzaW5nIHBocCBleHRlbnNpb24KKyAgICAqIFtUSFJJRlQtMzgyMF0gLSBFcmxhbmc6IERldGVjdCBPVFAgPj0gMTggdG8gdXNlIG5ldyB0aW1lIGNvcnJlY3Rpb24KKyAgICAqIFtUSFJJRlQtMzgxNl0gLSBSZWR1Y2UgZG9ja2VyIGJ1aWxkIGR1cmF0aW9uIG9uIFRyYXZpcy1DSQorICAgICogW1RIUklGVC0zODE1XSAtIFB1dCBhcHB2ZXlvciBkZXBlbmRlbmN5IHZlcnNpb25zIHRvIG9uZSBwbGFjZQorICAgICogW1RIUklGVC0zNzg4XSAtIENvbXBhdGliaWxpdHkgaW1wcm92ZW1lbnRzIGFuZCBXaW42NCBzdXBwb3J0CisgICAgKiBbVEhSSUZULTM3OTJdIC0gVGltZW91dHMgZm9yIGFub255bW91cyBwaXBlcyBzaG91bGQgYmUgY29uZmlndXJhYmxlCisgICAgKiBbVEhSSUZULTM3OTRdIC0gU3BsaXQgRGVscGhpIGFwcGxpY2F0aW9uLCBwcm90b2NvbCBhbmQgdHJhbnNwb3J0IGV4Y2VwdGlvbiBzdWJ0eXBlcyBpbnRvIHNlcGFyYXRlIGV4Y2VwdGlvbnMKKyAgICAqIFtUSFJJRlQtMzc3NF0gLSBUaGUgZ2VuZXJhdGVkIGNvZGUgc2hvdWxkIGhhdmUgZXhjZXB0aW9uX25hbWVzIG1ldGEgaW5mbworICAgICogW1RIUklGVC0zNzYyXSAtIEZpeCBidWlsZCB3YXJuaW5ncyBmb3IgZGVwcmVjYXRlZCBUaHJpZnQgImJ5dGUiIGZpZWxkcworICAgICogW1RIUklGVC0zNzU2XSAtIEltcHJvdmUgcmVxdWlyZWRuZXNzIGRvY3VtZW50YXRpb24KKyAgICAqIFtUSFJJRlQtMzc2MV0gLSBBZGQgZGViaWFuIHBhY2thZ2UgZm9yIFB5dGhvbjMKKyAgICAqIFtUSFJJRlQtMzc0Ml0gLSBoYXhlIHBocCBjbGkgc3VwcG9ydAorICAgICogW1RIUklGVC0zNzMzXSAtIFNvY2tldCB0aW1lb3V0IGltcHJvdmVtZW50cworICAgICogW1RIUklGVC0zNzI4XSAtIGh0dHAgdHJhbnNwb3J0IGZvciB0aHJpZnQtbHVhCisgICAgKiBbVEhSSUZULTM5MDVdIC0gRGFydCBjb21waWxlciBkb2VzIG5vdCBpbml0aWFsaXplIGJvb2wsIGludCwgYW5kIGRvdWJsZSBwcm9wZXJ0aWVzCisgICAgKiBbVEhSSUZULTM5MTFdIC0gTG9vc2VuIFJ1YnkgZGV2IGRlcGVuZGVuY3kgdmVyc2lvbiByZXF1aXJlbWVudHMKKyAgICAqIFtUSFJJRlQtMzkwNl0gLSBSdW4gQyMgdGVzdHMgd2l0aCBtYWtlIGNoZWNrCisgICAgKiBbVEhSSUZULTM5MDBdIC0gQWRkIFB5dGhvbiBTU0wgZmxhZ3MKKyAgICAqIFtUSFJJRlQtMzg5N10gLSBQcm92aWRlIG1lYW5pbmdmdWwgZXhjZXB0aW9uIHR5cGUgYmFzZWQgb24gV2ViRXhjZXB0aW9uU3RhdHVzIGluIGNhc2Ugb2YgdGltZW91dAorICAgICogW1RIUklGVC0zODA4XSAtIE1pc3NpbmcgYERPVUJMRWAgaW4gdGhyaWZ0IHR5cGUgZW51bWVyYXRpb24KKyAgICAqIFtUSFJJRlQtMzgwM10gLSBSZW1vdmUgImZpbGUiIGF0dHJpYnV0ZSBmcm9tIFhNTCBnZW5lcmF0b3IKKyAgICAqIFtUSFJJRlQtMzY2MF0gLSBBZGQgVjQgbWFwcGVkIGFkZHJlc3MgdG8gdGVzdCBjbGllbnQgY2VydCdzIGFsdG5hbWUKKyAgICAqIFtUSFJJRlQtMzY2MV0gLSBVc2UgaHR0cHMgdG8gZG93bmxvYWQgbWVjayBpbiBlcmxhbmcgdGVzdCBidWlsZAorICAgICogW1RIUklGVC0zNjU5XSAtIENoZWNrIGNvbmZpZ3VyZSByZXN1bHQgb2YgQ01ha2Ugb24gQ0kKKyAgICAqIFtUSFJJRlQtMzY2N10gLSBBZGQgVExTIFNOSSBzdXBwb3J0IHRvIGNsaWVudHMKKyAgICAqIFtUSFJJRlQtMzY1MV0gLSBNYWtlIGJhY2twb3J0cy5tYXRjaF9ob3N0bmFtZSBhbmQgaXBhZGRyZXNzIG9wdGlvbmFsCisgICAgKiBbVEhSSUZULTM2NjZdIC0gQnVpbGQgRCB0dXRvcmlhbCBhcyBwYXJ0IG9mIEF1dG90b29scyBidWlsZAorICAgICogW1RIUklGVC0zNjY1XSAtIEFkZCBEIGxpYmV2ZW50IGFuZCBPcGVuU1NMIHRvIGRvY2tlciBpbWFnZXMKKyAgICAqIFtUSFJJRlQtMzY2NF0gLSBSZW1vdmUgbWQ1LmMKKyAgICAqIFtUSFJJRlQtMzY2Ml0gLSBBZGQgSGFza2VsbCB0byBkZWJpYW4gZG9ja2VyIGltYWdlCisgICAgKiBbVEhSSUZULTM3MTFdIC0gQWRkIEQgdG8gY3Jvc3MgbGFuZ3VhZ2UgdGVzdAorICAgICogW1RIUklGVC0zNjkxXSAtIFJ1biBmbGFrZTggUHl0aG9uIHN0eWxlIGNoZWNrIG9uIFRyYXZpcy1DSQorICAgICogW1RIUklGVC0zNjkyXSAtIChSZSllbmFibGUgQXBwdmV5b3IgQysrIGFuZCBQeXRob24gYnVpbGQKKyAgICAqIFtUSFJJRlQtMzY3N10gLSBJbXByb3ZlIENNYWtlIEphdmEgYnVpbGQKKyAgICAqIFtUSFJJRlQtMzY3OV0gLSBBZGQgc3Rkb3V0IGxvZyB0byB0ZXN0QmluYXJ5IGluIEphdmEgdGVzdCBzZXJ2ZXIKKyAgICAqIFtUSFJJRlQtMzcxOF0gLSBSZWR1Y2Ugc2l6ZSBvZiBkb2NrZXIgaW1hZ2UgZm9yIGJ1aWxkIGVudmlyb25tZW50CisgICAgKiBbVEhSSUZULTM2OThdIC0gW1RyYXZpcy1DSV0gSW50cm9kdWNlIHJldHJ5IHRvIGFwdCBjb21tYW5kcworICAgICogW1RIUklGVC0zMTI3XSAtIHN3aXRjaCAtcmVjdXJzZSB0byAtLXJlY3Vyc2UgYW5kIHJlc2VydmUgLXIKKyAgICAqIFtUSFJJRlQtMzA4N10gLSBQYXNzIG9uIGVycm9ycyBsaWtlICJjb25uZWN0aW9uIGNsb3NlZCIKKyAgICAqIFtUSFJJRlQtMzI0MF0gLSBUaHJpZnQgUHl0aG9uIGNsaWVudCBzaG91bGQgc3VwcG9ydCBzdWJqZWN0QWx0TmFtZSBhbmQgd2lsZGNhcmQgY2VydHMgaW4gVFNTTFNvY2tldAorICAgICogW1RIUklGVC0zMjEzXSAtIG1ha2UgY3Jvc3Mgc2hvdWxkIGluZGljYXRlIHdoZW4gaXQgc2tpcHMgYSBrbm93biBmYWlsaW5nIHRlc3QKKyAgICAqIFtUSFJJRlQtMzIwOF0gLSBGaXggVmlzdWFsIFN0dWRpbyBzb2x1dGlvbiBidWlsZCBmYWlsdXJlIGR1ZSB0byBtaXNzaW5nIHNvdXJjZQorICAgICogW1RIUklGVC0zMTg2XSAtIEFkZCBUU2VydmVySFRUUCB0byBHbyBsaWJyYXJ5CisgICAgKiBbVEhSSUZULTIzNDJdIC0gQWRkIF9fRklMRV9fIGFuZCBfX0xJTkVfXyB0byBUaHJpZnQgQysrIGV4Y3BldGlvbnMKKyAgICAqIFtUSFJJRlQtMzM3Ml0gLSBBZGQgZGFydCBnZW5lcmF0b3IgdG8gVmlzdWFsIFN0dWRpbyBwcm9qZWN0CisgICAgKiBbVEhSSUZULTMzNjZdIC0gVGhyaWZ0VGVzdCB0byBpbXBsZW1lbnQgc3RhbmRhcmQgcmV0dXJuIHZhbHVlcyAKKyAgICAqIFtUSFJJRlQtMzQwMl0gLSBQcm92aWRlIGEgcGVybCBVbml4IFNvY2tldCBpbXBsZW1lbnRhdGlvbgorICAgICogW1RIUklGVC0zMzYxXSAtIEltcHJvdmUgQyMgbGlicmFyeQorICAgICogW1RIUklGVC0zMzkzXSAtIEludHJvZHVjZSBpOCB0byBwcm92aWRlIGNvbnNpc3RlbnQgc2V0IG9mIFRocmlmdCBJREwgaW50ZWdlciB0eXBlcworICAgICogW1RIUklGVC0zMzM5XSAtIFN1cHBvcnQgZm9yIGRhdGFiYXNlL3NxbAorICAgICogW1RIUklGVC0zNTY1XSAtIEMrKzogVFtBc3luY11Qcm9jZXNzb3I6OmdldEV2ZW50SGFuZGxlcigpIHNob3VsZCBiZSBkZWNsYXJlZCBhcyBjb25zdCBtZW1iZXIgZnVuY3Rpb25zCisgICAgKiBbVEhSSUZULTM1NjNdIC0gQysrL1F0OiByZW1vdmVkIHVzYWdlIG9mIG1hY3JvIFFUX1BSRVBFTkRfTkFNRVNQQUNFIGFzIGl0IGlzbid0IGNvbnNlcXVlbnRseSB1c2VkIGZvciBhbGwgcmVmZXJlbmNlcyB0byBRdCB0eXBlcy4KKyAgICAqIFtUSFJJRlQtMzU2Ml0gLSBSZW1vdmVkIHVudXNlZCBUQXN5bmNQcm9jZXNzb3I6OmdldEFzeW5jU2VydmVyKCkKKyAgICAqIFtUSFJJRlQtMzU2MV0gLSBDKysvUXQ6IG1ha2UgdXNlIG9mIFFfRElTQUJMRV9DT1BZKCkgdG8gZ2V0IHJpZCBvZiBjb3B5IGN0b3IgYW5kIGFzc2lnbm1lbnQgb3BlcmF0b3IKKyAgICAqIFtUSFJJRlQtMzU1Nl0gLSBjX2dsaWIgZmlsZSBkZXNjcmlwdG9yIHRyYW5zcG9ydAorICAgICogW1RIUklGVC0zNTQ0XSAtIE1ha2UgY3Jvc3MgdGVzdCBmYWlsIHdoZW4gc2VydmVyIHByb2Nlc3MgZGllZCB1bmV4cGVjdGVkbHkKKyAgICAqIFtUSFJJRlQtMzU0MF0gLSBNYWtlIHB5dGhvbiB0dXRvcmlhbCBtb3JlIGluIGxpbmUgd2l0aCBQRVA4CisgICAgKiBbVEhSSUZULTM1MzVdIC0gRGFydCBnZW5lcmF0b3IgYXJndW1lbnQgdG8gcHJvZHVjZSBhIGZpbGUgc3RydWN0dXJlIHVzYWJsZSBpbiBwYXJlbnQgbGlicmFyeQorICAgICogW1RIUklGVC0zNTA1XSAtIEVuaGFuY2UgUHl0aG9uIFRTU0xTb2NrZXQKKyAgICAqIFtUSFJJRlQtMzUwNl0gLSBFbGltaW5hdGUgb2xkIHN0eWxlIGNsYXNzZXMgZnJvbSBsaWJyYXJ5IGNvZGUKKyAgICAqIFtUSFJJRlQtMzUwM10gLSBFbmFibGUgcHk6dXRmOHN0cmluZyBieSBkZWZhdWx0CisgICAgKiBbVEhSSUZULTM0OTldIC0gQWRkIHBhY2thZ2VfcHJlZml4IHRvIHB5dGhvbiBnZW5lcmF0b3IKKyAgICAqIFtUSFJJRlQtMzQ5NV0gLSBNaW5vciBlbmhhbmNlbWVudHMgYW5kIGZpeGVzIGZvciBjcm9zcyB0ZXN0CisgICAgKiBbVEhSSUZULTM0ODZdIC0gSmF2YSBnZW5lcmF0ZWQgYGdldEZpZWxkVmFsdWVgIGlzIGluY29tcGF0aWJsZSB3aXRoIGBzZXRGaWVsZFZhbHVlYCBmb3IgYmluYXJ5IHZhbHVlcy4KKyAgICAqIFtUSFJJRlQtMzQ4NF0gLSBDb25zb2xpZGF0ZSB0ZW1wb3JhcnkgYnVmZmVycyBpbiBKYXZhJ3MgVENvbXBhY3RQcm90b2NvbAorICAgICogW1RIUklGVC0zNTE2XSAtIEFkZCBmZWF0dXJlIHRlc3QgZm9yIFRIZWFkZXIgVEJpbmFyeVByb3RvY29sIGludGVyb3AKKyAgICAqIFtUSFJJRlQtMzUxNV0gLSBQeXRob24gMi42IGNvbXBhdGliaWxpdHkgYW5kIHRlc3Qgb24gQ0kKKyAgICAqIFtUSFJJRlQtMzUxNF0gLSBQSFAgNyBjb21wYXRpYmxlIHZlcnNpb24gb2YgYmluYXJ5IHByb3RvY29sCisgICAgKiBbVEhSSUZULTM0NjldIC0gRG9ja2VyOiBEZWJpYW4gc3VwcG9ydAorICAgICogW1RIUklGVC0zNDE2XSAtIFJldGlyZSBvbGQgInh4eF9uYW1lc3BhY2UiIGRlY2xhcmF0aW9ucyBmcm9tIHRoZSBJREwKKyAgICAqIFtUSFJJRlQtMzQyNl0gLSBBbGlnbiBhdXRvZ2VuIGNvbW1lbnQgaW4gWFNECisgICAgKiBbVEhSSUZULTM0MjRdIC0gQWRkIENNYWtlIGFuZHJvaWQgYnVpbGQgb3B0aW9uCisgICAgKiBbVEhSSUZULTM0MzldIC0gUnVuIG1ha2UgY3Jvc3MgdXNpbmcgUHl0aG9uMyB3aGVuIGF2YWlsYWJsZQorICAgICogW1RIUklGVC0zNDQwXSAtIFB5dGhvbiBtYWtlIGNoZWNrIHRha2VzIHRvbyBtdWNoIHRpbWUKKyAgICAqIFtUSFJJRlQtMzQ0MV0gLSBTdGFiaWxpemUgVHJhdmlzLUNJIGJ1aWxkcworICAgICogW1RIUklGVC0zNDMxXSAtIEF2b2lkICJzY2hlbWVzIiBIYXNoTWFwIGxvb2t1cHMgZHVyaW5nIHN0cnVjdCByZWFkcy93cml0ZXMKKyAgICAqIFtUSFJJRlQtMzQzMl0gLSBBZGQgYSBUQnl0ZUJ1ZmZlciB0cmFuc3BvcnQgdG8gdGhlIEphdmEgbGlicmFyeQorICAgICogW1RIUklGVC0zNDM4XSAtIEVuYWJsZSBweTpuZXdfc3R5bGUgYnkgZGVmYXVsdAorICAgICogW1RIUklGVC0zNDA1XSAtIEdvIFRIdHRwQ2xpZW50IG1pc3VzZXMgaHR0cC5DbGllbnQgb2JqZWN0cworICAgICogW1RIUklGVC0zNjE0XSAtIEltcHJvdmUgbG9nZ2luZyBvZiB0ZXN0X3NzbHNvY2tldC5weQorICAgICogW1RIUklGVC0zNjQ3XSAtIEZpeCBwaHAgZXh0ZW5zaW9uIGJ1aWxkIHdhcm5pbmdzCisgICAgKiBbVEhSSUZULTM2NDJdIC0gU3BlZWQgdXAgY3Jvc3MgdGVzdCBydW5uZXIKKyAgICAqIFtUSFJJRlQtMzYzN10gLSBJbXBsZW1lbnQgY29tcGFjdCBwcm90b2NvbCBmb3IgZGFydAorICAgICogW1RIUklGVC0zNjEzXSAtIFBvcnQgUHl0aG9uIEMgZXh0ZW5zaW9uIHRvIFB5dGhvbiAzCisgICAgKiBbVEhSSUZULTM2MTJdIC0gQWRkIFB5dGhvbiBDIGV4dGVuc2lvbiBmb3IgY29tcGFjdCBwcm90b2NvbAorICAgICogW1RIUklGVC0zNjExXSAtIEFkZCAtLXJlZ2V4IGZpbHRlciB0byBjcm9zcyB0ZXN0IHJ1bm5lcgorICAgICogW1RIUklGVC0zNjMxXSAtIEpTT04gcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gZm9yIEx1YQorICAgICogW1RIUklGVC0zNjA5XSAtIFJlbW92ZSBvciByZXBsYWNlIFRlc3RQb3J0Rml4dHVyZS5oCisgICAgKiBbVEhSSUZULTM2MDVdIC0gSGF2ZSB0aGUgY29tcGlsZXIgY29tcGxhaW4gYWJvdXQgaW52YWxpZCBhcmd1bWVudHMgYW5kIG9wdGlvbnMKKyAgICAqIFtUSFJJRlQtMzU5Nl0gLSBCZXR0ZXIgY29uZm9ybWFuY2UgdG8gUEVQOAorICAgICogW1RIUklGVC0zNTg1XSAtIENvbXBhY3QgcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gZm9yIEx1YQorICAgICogW1RIUklGVC0zNTgyXSAtIEVybGFuZyBsaWJyYXJpZXMgc2hvdWxkIGhhdmUgc2VydmljZSBtZXRhZGF0YQorICAgICogW1RIUklGVC0zNTc5XSAtIEludHJvZHVjZSByZXRyeSB0byBtYWtlIGNyb3NzCisgICAgKiBbVEhSSUZULTMzMDZdIC0gSmF2YTogVEJpbmFyeVByb3RvY29sOiBVc2UgMSB0ZW1wIGJ1ZmZlciBpbnN0ZWFkIG9mIGFsbG9jYXRpbmcgOAorICAgICogW1RIUklGVC0zOTEwXSAtIERvIG5vdCBpbnZva2UgcGlwIGFzIHBhcnQgb2YgYnVpbGQgcHJvY2VzcworICAgICogW1RIUklGVC0xODU3XSAtIFB5dGhvbiAzLlggU3VwcG9ydAorICAgICogW1RIUklGVC0xOTQ0XSAtIEJpbmRpbmcgdG8gemVybyBwb3J0CisgICAgKiBbVEhSSUZULTM5NTRdIC0gRW5hYmxlIHRoZSB1c2FnZSBvZiBzdHJ1Y3RzIGNhbGxlZCAiT2JqZWN0IiBpbiBKYXZhCisgICAgKiBbVEhSSUZULTM5ODFdIC0gRW5hYmxlIGFuYWx5emVyIHN0cm9uZyBtb2RlIGluIERhcnQgbGlicmFyeQorICAgICogW1RIUklGVC0zOTk4XSAtIERvY3VtZW50IGFiaWxpdHkgdG8gYWRkIGN1c3RvbSB0YWdzIHRvIHRocmlmdCBzdHJ1Y3RzCisgICAgKiBbVEhSSUZULTQwMDZdIC0gQWRkIGEgcmVtb3ZlRXZlbnRMaXN0ZW5lciBtZXRob2Qgb24gVFNvY2tldAorCisjIyBOZXcgRmVhdHVyZQorICAgICogW1RIUklGVC02NDBdIC0gU3VwcG9ydCBkZXByZWNhdGlvbgorICAgICogW1RIUklGVC05NDhdIC0gU1NMIHNvY2tldCBzdXBwb3J0IGZvciBQSFAKKyAgICAqIFtUSFJJRlQtNzY0XSAtIGFkZCBTdXBwb3J0IGZvciBWYWxhIGxhbmd1YWdlCisgICAgKiBbVEhSSUZULTMwNDZdIC0gQWxsb3cgUFNSNCBjbGFzcyBsb2FkaW5nIGZvciBnZW5lcmF0ZWQgY2xhc3NlcyAoUEhQKQorICAgICogW1RIUklGVC0yMTEzXSAtIEVybGFuZyBTU0wgU29ja2V0IFN1cHBvcnQKKyAgICAqIFtUSFJJRlQtMTQ4Ml0gLSBVbml4IGRvbWFpbiBzb2NrZXQgc3VwcG9ydCB1bmRlciBQSFAKKyAgICAqIFtUSFJJRlQtNTE5XSAtIFN1cHBvcnQgY29sbGVjdGlvbnMgb2YgdHlwZXMgd2l0aG91dCBoYXZpbmcgdG8gZXhwbGljaXRseSBkZWZpbmUgaXQKKyAgICAqIFtUSFJJRlQtNDY4XSAtIFJhY2sgTWlkZGxld2FyZSBBcHBsaWNhdGlvbiBmb3IgUmFpbHMKKyAgICAqIFtUSFJJRlQtMTcwOF0gLSBBZGQgZXZlbnQgaGFuZGxlcnMgZm9yIHByb2Nlc3NvciBldmVudHMKKyAgICAqIFtUSFJJRlQtMzgzNF0gLSBFcmxhbmcgbmFtZXNwYWNpbmcgYW5kIGV4Y2VwdGlvbiBtZXRhZGF0YQorICAgICogW1RIUklGVC0yNTEwXSAtIEltcGxlbWVudCBUTm9uYmxvY2tpbmdTZXJ2ZXIncyBhYmlsaXR5IHRvIGxpc3RlbiBvbiB1bml4IGRvbWFpbiBzb2NrZXRzCisgICAgKiBbVEhSSUZULTMzOTddIC0gSW1wbGVtZW50IFRQcm9jZXNzb3JGYWN0b3J5IGluIEMjIHRvIGVuYWJsZSBwZXItY2xpZW50IHByb2Nlc3NvcnMKKyAgICAqIFtUSFJJRlQtMzUyM10gLSBYTUwgR2VuZXJhdG9yCisgICAgKiBbVEhSSUZULTM1MTBdIC0gQWRkIEh0dHBUYXNrQXN5bmNIYW5kbGVyIGltcGxlbWVudGF0aW9uCisgICAgKiBbVEhSSUZULTMzMThdIC0gUEhQOiBTaW1wbGVKU09OUHJvdG9jb2wgSW1wbGVtZW50YXRpb24KKyAgICAqIFtUSFJJRlQtMzI5OV0gLSBEYXJ0IGxhbmd1YWdlIGJpbmRpbmdzIGluIFRocmlmdAorICAgICogW1RIUklGVC0yODM1XSAtIEFkZCBwb3NzaWJpbGl0eSB0byBkaXN0cmlidXRlIGdlbmVyYXRvcnMgc2VwYXJhdGVseSBmcm9tIHRocmlmdCBjb3JlLCBhbmQgbG9hZCB0aGVtIGR5bmFtaWNhbGx5CisgICAgKiBbVEhSSUZULTE4NF0gLSBBZGQgT1NHaSBNYW5pZmVzdCBoZWFkZXJzIHRvIHRoZSBsaWJ0aHJpZnQgamF2YSBsaWJyYXJ5IHRvIGJlIGFibGUgdG8gdXNlIFRocmlmdCBpbiB0aGUgT1NHaSBydW50aW1lCisgICAgKiBbVEhSSUZULTE0MV0gLSBJZiBhIHJlcXVpcmVkIGZpZWxkIGlzIG5vdCBwcmVzZW50IG9uIHNlcmlhbGl6YXRpb24sIHRocm93IGFuIGV4Y2VwdGlvbgorICAgICogW1RIUklGVC0xODkxXSAtIEFkZCBXaW5kb3dzIEFMUEMgdHJhbnNwb3J0IHdoaWNoIGlzIHJpZ2h0IGNvdW50ZXJwYXJ0IG9mIFVuaXggZG9tYWluIHNvY2tldHMKKworIyMgUXVlc3Rpb24KKyAgICAqIFtUSFJJRlQtMTgwOF0gLSBUaGUgVGhyaWZ0IHN0cnVjdCBzaG91bGQgYmUgY29uc2lkZXJlZCBzZWxmLWNvbnRhaW5lZD8KKyAgICAqIFtUSFJJRlQtMjg5NV0gLSBUdXRvcmlhbCBjcHAKKyAgICAqIFtUSFJJRlQtMzg2MF0gLSBFbGVwaGFudC1iaXJkIGFwcGxpY2F0aW9uIFRlc3QgZmFpbHMgZm9yIFRocmlmdAorICAgICogW1RIUklGVC0zODExXSAtIEhUVFBTIFN1cHBvcnQgZm9yIEMrKyBhcHBsaWNhdGlvbnMKKyAgICAqIFtUSFJJRlQtMzUwOV0gLSAibWFrZSBjaGVjayIgZXJyb3IKKworIyMgU3RvcnkKKyAgICAqIFtUSFJJRlQtMzQ1Ml0gLSAudHJhdmlzLnltbDogTWlncmF0aW5nIGZyb20gbGVnYWN5IHRvIGNvbnRhaW5lci1iYXNlZCBpbmZyYXN0cnVjdHVyZQorCisjIyBTdWItdGFzaworICAgICogW1RIUklGVC0xODExXSAtIHJ1YnkgdHV0b3JpYWwgYXMgcGFydCBvZiB0aGUgcmVndWxhciBidWlsZAorICAgICogW1RIUklGVC0yNzc5XSAtIFBIUCBUSlNPTlByb3RvY29sIGVuY29kZSB1bmljb2RlIGludG8gVUNTLTRMRSB3aGljaCBjYW4ndCBiZSBwYXJzZWQgYnkgb3RoZXIgbGFuZ3VhZ2UgYmluZGluZ3MKKyAgICAqIFtUSFJJRlQtMjExMF0gLSBFcmxhbmc6IFN1cHBvcnQgZm9yIE11bHRpcGxleGluZyBTZXJ2aWNlcyBvbiBhbnkgVHJhbnNwb3J0LCBQcm90b2NvbCBhbmQgU2VydmVyCisgICAgKiBbVEhSSUZULTM4NTJdIC0gQSBUcmF2aXMtQ0kgam9iIGZhaWxzIHdpdGggIndyaXRlIGVycm9yIgorICAgICogW1RIUklGVC0zNzQwXSAtIEZpeCBoYXhlbGliLmpzb24gY2xhc3NwYXRoIAorICAgICogW1RIUklGVC0zNjUzXSAtIGluY29ycmVjdCB1bmlvbiBzZXJpYWxpemF0aW9uCisgICAgKiBbVEhSSUZULTM2NTJdIC0gaW5jb3JyZWN0IHNlcmlhbGl6YXRpb24gb2Ygb3B0aW9uYWxzCisgICAgKiBbVEhSSUZULTM2NTVdIC0gaW5jb3JyZWN0IHVuaW9uIHNlcmlhbGl6YXRpb24KKyAgICAqIFtUSFJJRlQtMzY1NF0gLSBpbmNvcnJlY3Qgc2VyaWFsaXphdGlvbiBvZiBvcHRpb25hbHMKKyAgICAqIFtUSFJJRlQtMzY1Nl0gLSBpbmNvcnJlY3Qgc2VyaWFsaXphdGlvbiBvZiBvcHRpb25hbHMKKyAgICAqIFtUSFJJRlQtMzY5OV0gLSBGaXggaW50ZWdlciBsaW1pdCBzeW1ib2wgaW5jbHVkZXMgaW4gUHl0aG9uIEMgZXh0ZW5zaW9uCisgICAgKiBbVEhSSUZULTM2OTNdIC0gRml4IGluY2x1ZGUgaXNzdWUgaW4gQysrIFRTU0xTb2NrZXRJbnRlcnJ1cHRUZXN0IG9uIFdpbmRvd3MKKyAgICAqIFtUSFJJRlQtMzY5NF0gLSBbV2luZG93c10gRGlzYWJsZSB0ZXN0cyBvZiBhIGZldyBzZXJ2ZXJzIHRoYXQgYXJlIG5vdCBzdXBwb3J0ZWQKKyAgICAqIFtUSFJJRlQtMzY5Nl0gLSBJbnN0YWxsIHBpcCB0byBDZW50T1MgRG9ja2VyIGltYWdlcyB0byBmaXggUHl0aG9uIGJ1aWxkcworICAgICogW1RIUklGVC0zNjM4XSAtIEZpeCBoYXhlbGliLmpzb24KKyAgICAqIFtUSFJJRlQtMzI1MV0gLSBBZGQgaHR0cCB0cmFuc3BvcnQgZm9yIHNlcnZlciB0byBHbyBsaWIKKyAgICAqIFtUSFJJRlQtMjQyNF0gLSBSZWN1cnNpdmUgVHlwZXMKKyAgICAqIFtUSFJJRlQtMjQyM10gLSBUSGVhZGVyCisgICAgKiBbVEhSSUZULTI0MTNdIC0gUHl0aG9uOiBVVEYtOCBzZW50IGJ5IFBIUCBhcyBKU09OIGlzIG5vdCB1bmRlcnN0b29kIGJ5IFRKc29uUHJvdG9jb2wKKyAgICAqIFtUSFJJRlQtMjQwOV0gLSBKYXZhOiBVVEYtOCBzZW50IGJ5IFBIUCBhcyBKU09OIGlzIG5vdCB1bmRlcnN0b29kIGJ5IFRKc29uUHJvdG9jb2wKKyAgICAqIFtUSFJJRlQtMjQxMl0gLSBEOiBVVEYtOCBzZW50IGJ5IFBIUCBhcyBKU09OIGlzIG5vdCB1bmRlcnN0b29kIGJ5IFRKc29uUHJvdG9jb2wKKyAgICAqIFtUSFJJRlQtMjQxMV0gLSBDKys6IFVURi04IHNlbnQgYnkgUEhQIGFzIEpTT04gaXMgbm90IHVuZGVyc3Rvb2QgYnkgVEpzb25Qcm90b2NvbAorICAgICogW1RIUklGVC0yNDEwXSAtIEphdmFNZTogVVRGLTggc2VudCBieSBQSFAgYXMgSlNPTiBpcyBub3QgdW5kZXJzdG9vZCBieSBUSnNvblByb3RvY29sCisgICAgKiBbVEhSSUZULTI2NjhdIC0gVGVzdFN1aXRlOiBkZXRhaWxlZCByZXN1bHQgb24gcGFzc2VkIHRlc3RzIGJ5IGZlYXR1cmUKKyAgICAqIFtUSFJJRlQtMjY1OV0gLSBweXRob24gVGVzdCBTZXJ2ZXIgZmFpbHMgd2hlbiB0aHJvd2luZyBURXhjZXB0aW9uCisgICAgKiBbVEhSSUZULTMzOThdIC0gQWRkIENNYWtlIGJ1aWxkICBmb3IgSGFza2VsbCBsaWJyYXJ5IGFuZCB0ZXN0cworICAgICogW1RIUklGVC0zMzk2XSAtIERBUlQ6IFVURi04IHNlbnQgYnkgUEhQIGFzIEpTT04gaXMgbm90IHVuZGVyc3Rvb2QgYnkgVEpzb25Qcm90b2NvbAorICAgICogW1RIUklGVC0zMzY0XSAtICAgRml4IHJ1YnkgYmluYXJ5IGZpZWxkIGVuY29kaW5nIGluIFRKU09OUHJvdG9jb2wKKyAgICAqIFtUSFJJRlQtMzM4MV0gLSBGaXggZm9yIG1pc2MuIGNvZGVnZW4gaXNzdWVzIHdpdGggVEhSSUZULTI5MDUKKyAgICAqIFtUSFJJRlQtMzU3M10gLSBObyBydWxlIHRvIG1ha2UgdGFyZ2V0IGAuLi8uLi8uLi90ZXN0L2NfZ2xpYi9zcmMvLmRlcHMvdGVzdHRocmlmdHRlc3QtdGhyaWZ0X3Rlc3RfaGFuZGxlci5QbycuCisgICAgKiBbVEhSSUZULTM1NzJdIC0gIlVuYWJsZSB0byBkZXRlcm1pbmUgdGhlIGJlaGF2aW9yIG9mIGEgc2lnbmVkIHJpZ2h0IHNoaWZ0IgorICAgICogW1RIUklGVC0zNTQyXSAtIEFkZCBsZW5ndGggbGltaXQgc3VwcG9ydCB0byBKYXZhIHRlc3Qgc2VydmVyCisgICAgKiBbVEhSSUZULTM1MzddIC0gUmVtb3ZlIHRoZSAobm93IG9ic29sZXRlKSBjc2hhcnA6YXN5bmNjdHAgZmxhZyAKKyAgICAqIFtUSFJJRlQtMzUzMl0gLSBBZGQgY29uZmlndXJhYmxlIHN0cmluZyBhbmQgY29udGFpbmVyIHJlYWQgc2l6ZSBsaW1pdCB0byBQeXRob24gcHJvdG9jb2xzCisgICAgKiBbVEhSSUZULTM1MzFdIC0gQ3JlYXRlIGNyb3NzIGxhbmcgZmVhdHVyZSB0ZXN0IGZvciBzdHJpbmcgYW5kIGNvbnRhaW5lciByZWFkIGxlbmd0aCBsaW1pdAorICAgICogW1RIUklGVC0zNDgyXSAtIEhhc2tlbGwgSlNPTiBwcm90b2NvbCBkb2VzIG5vdCBlbmNvZGUgYmluYXJ5IGZpZWxkIGFzIEJhc2U2NAorICAgICogW1RIUklGVC0zNDI1XSAtIE1pbm9yIGZpeGVzICsgc2ltcGxpZmljYXRpb24gZm9yIENlbnRPUyBEb2NrZXJmaWxlCisgICAgKiBbVEhSSUZULTM0NDJdIC0gUnVuIENNYWtlIHRlc3RzIG9uIEFwcHZleW9yCisgICAgKiBbVEhSSUZULTM0MDldIC0gTm9kZUpTIGJpbmFyeSBmaWVsZCBpc3N1ZXMKKyAgICAqIFtUSFJJRlQtMzYyMV0gLSBGaXggbGliL2NwcC90ZXN0L1NlY3VyaXR5VGVzdC5jcHAgdG8gdXNlIGVwaGVtZXJhbCBwb3J0cworICAgICogW1RIUklGVC0zNjI4XSAtIEZpeCBsaWIvY3BwL3Rlc3QvVFNlcnZlckludGVncmF0aW9uVGVzdC5jcHAgdG8gdXNlIGVwaGVtZXJhbCBwb3J0cworICAgICogW1RIUklGVC0zNjI1XSAtIEtpbGwgdW51c2VkICNpbmNsdWRlICJUZXN0UG9ydEZpeHR1cmUuaCIgaW4gbGliL2NwcC90ZXN0L1RTZXJ2ZXJUcmFuc3BvcnRUZXN0LmNwcC4KKyAgICAqIFtUSFJJRlQtMzY0Nl0gLSBGaXggUHl0aG9uIGV4dGVuc2lvbiBidWlsZCB3YXJuaW5ncworICAgICogW1RIUklGVC0zNjI2XSAtIEZpeCBsaWIvY3BwL3Rlc3QvVFNvY2tldEludGVycnVwdFRlc3QuY3BwIHRvIHVzZSBlcGhlbWVyYWwgcG9ydHMuCisgICAgKiBbVEhSSUZULTM2MjRdIC0gRml4IGxpYi9jcHAvdGVzdC9UU2VydmVyU29ja2V0VGVzdC5jcHAgdG8gdXNlIGVwaGVtZXJhbCBwb3J0cworICAgICogW1RIUklGVC0zNjIzXSAtIEZpeCBGaXggY3BwL2xpYi90ZXN0L1RTU0xTb2NrZXRJbnRlcnJ1cHRUZXN0LmNwcCB0byB1c2UgZXBoZW1lcmFsIHBvcnRzCisgICAgKiBbVEhSSUZULTM1OTJdIC0gQWRkIGJhc2ljIHRlc3QgY2xpZW50CisgICAgKiBbVEhSSUZULTM5ODBdIC0gYWRkIFRFeHRlbmRlZEJpbmFyeVByb3RvY29sLmphdmEKKworIyMgVGFzaworICAgICogW1RIUklGVC0xODAxXSAtIFN5bmMgdXAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGNvZGVzIGFjcm9zcyBsYW5ndWFnZXMgYW5kIHRocmlmdCBpbXBsZW1lbnRhdGlvbnMKKyAgICAqIFtUSFJJRlQtMTI1OV0gLSBBdXRvbWF0ZSB2ZXJzaW9uaW5nIAorCisjIyBUZXN0CisgICAgKiBbVEhSSUZULTM0MDBdIC0gQWRkIEVybGFuZyB0byBjcm9zcyB0ZXN0CisgICAgKiBbVEhSSUZULTM1MDRdIC0gRml4IEZhc3RiaW5hcnlUZXN0LnB5CisKKyMjIFdpc2gKKyAgICAqIFtUSFJJRlQtMzkyM10gLSBNYXliZSByZW1vdmUgQWVyZW8gZnJvbSB0aGUgIlBvd2VyZWQgYnkiIGxpc3QKKyAgICAqIFtUSFJJRlQtMjE0OV0gLSBBZGQgYW4gb3B0aW9uIHRvIGRpc2FibGUgdGhlIGdlbmVyYXRpb24gb2YgZGVmYXVsdCBvcGVyYXRvcnMKKworCisKK1RocmlmdCAwLjkuMworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMjIEJ1ZworICAgICogW1RIUklGVC0yNDQxXSAtIENhbm5vdCBzaHV0ZG93biBUVGhyZWFkZWRTZXJ2ZXIgd2hlbiBjbGllbnRzIGFyZSBzdGlsbCBjb25uZWN0ZWQKKyAgICAqIFtUSFJJRlQtMjQ2NV0gLSBUQmluYXJ5UHJvdG9jb2xUIGJyZWFrcyBpZiBjb3BpZWQvbW92ZWQKKyAgICAqIFtUSFJJRlQtMjQ3NF0gLSB0aHJpZnQuaCBjYXVzZXMgYSBjb21waWxlIGZhaWx1cmUKKyAgICAqIFtUSFJJRlQtMjU0MF0gLSBSdW5uaW5nIGNvbmZpZ3VyZSBmcm9tIG91dHNpZGUgdGhlIHNvdXJjZSBkaXJlY3RvcnkgZmFpbHMKKyAgICAqIFtUSFJJRlQtMjU5OF0gLSBBZGQgY2hlY2sgZm9yIG1pbmltdW0gR28gdmVyc2lvbiB0byBjb25maWd1cmUuYWMKKyAgICAqIFtUSFJJRlQtMjY0N10gLSBjb21waWxlci1oczogZG9uJ3QgZGVjYXBpdGFsaXplIGZpZWxkIG5hbWVzLCBkbyBkZWNhcGl0YWxpemUgYXJndW1lbnQgYmluZGluZ3MKKyAgICAqIFtUSFJJRlQtMjc3M10gLSBHZW5lcmF0ZWQgSmF2YSBjb2RlIGZvciAnb25ld2F5JyBtZXRob2RzIGlzIGluY29ycmVjdC4KKyAgICAqIFtUSFJJRlQtMjc4OV0gLSBUTm9uYmxvY2tpbmdTZXJ2ZXIgbGVha3Mgc29ja2V0IEZEJ3MgdW5kZXIgbG9hZAorICAgICogW1RIUklGVC0yNjgyXSAtIFRUaHJlYWRlZFNlcnZlciBsZWFrcyBwZXItdGhyZWFkIG1lbW9yeQorICAgICogW1RIUklGVC0yNjc0XSAtIEphdmFTY3JpcHQ6IGRlY2xhcmUgQWNjZXB0OiBhbmQgQ29udGVudC1UeXBlOiBpbiByZXF1ZXN0CisgICAgKiBbVEhSSUZULTMwNzhdIC0gVE5vbmJsb2NraW5nU2VydmVyU29ja2V0J3MgbG9nZ2VyIGlzIG5vdCBuYW1lZCBhZnRlciBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQKKyAgICAqIFtUSFJJRlQtMzA3N10gLSBDKysgVEZpbGVUcmFuc3BvcnQgaWdub3JlcyByZXR1cm4gY29kZSBmcm9tIGZ0cnVuY2F0ZQorICAgICogW1RIUklGVC0zMDY3XSAtIEMrKyBjcHBjaGVjayBwZXJmb3JtYW5jZSByZWxhdGVkIHdhcm5pbmdzCisgICAgKiBbVEhSSUZULTMwNjZdIC0gQysrIFREZW5zZVByb3RvY29sIGFzc2VydCBtb2RpZmllcyBpbnN0ZWFkIG9mIGNoZWNrcworICAgICogW1RIUklGVC0zMDcxXSAtIGJvb3RzdHJhcC5zaCBvbiBVYnVudHUgMTIuMDQgKFByZWNpc2UpIGF1dG9tYWtlIGVycm9yCisgICAgKiBbVEhSSUZULTMwNjldIC0gQysrIFRTZXJ2ZXJTb2NrZXQgbGVha3Mgc29ja2V0IG9uIGZjbnRsIGdldCBvciBzZXQgZmxhZ3MgZXJyb3IKKyAgICAqIFtUSFJJRlQtMzA3OV0gLSBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQncyBsb2dnZXIgaXMgbm90IG5hbWVkIGFmdGVyIFROb25ibG9ja2luZ1NlcnZlclNvY2tldAorICAgICogW1RIUklGVC0zMDgwXSAtIEMrKyBUTm9uYmxvY2tpbmdTZXJ2ZXIgY29ubmVjdGlvbiBsZWFrIHdoaWxlIGFjY2VwdCBodWdlIG51bWJlciBjb25uZWN0aW9ucy4KKyAgICAqIFtUSFJJRlQtMzA4Nl0gLSBDKysgVmFsZ3JpbmQgRXJyb3IgQ2xlYW51cAorICAgICogW1RIUklGVC0zMDg1XSAtIHRocmlmdF9yZWNvbm5lY3RpbmdfY2xpZW50IG5ldmVyIHRyeSB0byByZWNvbm5lY3QKKyAgICAqIFtUSFJJRlQtMzEyM10gLSBNaXNzaW5nIGluY2x1ZGUgaW4gY29tcGlsZXIvY3BwL3NyYy9tYWluLmggYnJlYWtzIGJ1aWxkIGluIHNvbWUgZW52aXJvbm1lbnRzCisgICAgKiBbVEhSSUZULTMxMjVdIC0gRml4IHRoZSBsaXN0IG9mIGV4cG9ydGVkIGhlYWRlcnMgaW4gYXV0b21ha2UgaW5wdXQKKyAgICAqIFtUSFJJRlQtMzEyNl0gLSBQSFAgSlNPTiBzZXJpYWxpemVyIGNvbnZlcnRzIGVtcHR5IG9yIGludC1pbmRleGVkIG1hcHMgdG8gbGlzdHMKKyAgICAqIFtUSFJJRlQtMzEzMl0gLSBQcm9wZXJseSBmb3JtYXQgZGF0ZSBpbiBKYXZhIEBHZW5lcmF0ZWQgYW5ub3RhdGlvbnMKKyAgICAqIFtUSFJJRlQtMzEzN10gLSBUcmF2aXMgYnVpbGQgaGFuZ3MgYWZ0ZXIgZmFpbHVyZQorICAgICogW1RIUklGVC0zMTM4XSAtICJtYWtlIGNoZWNrIiBwYXJhbGxlbCBleGVjdXRpb24gaXMgdW5kZXJtaW5pc3RpYworICAgICogW1RIUklGVC0zMTM5XSAtIEpTIGxpYnJhcnkgdGVzdCBpcyBmbGFreQorICAgICogW1RIUklGVC0zMTQwXSAtIENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24gaXMgdGhyb3duIGJ5IEphdmFTY3JpcHQgdGVzdCBzZXJ2ZXIKKyAgICAqIFtUSFJJRlQtMzEyNF0gLSBTb21lIHNpZ25lZC91bnNpZ25lZCB3YXJuaW5ncyB3aGlsZSBidWlsZGluZyBjb21waWxlcgorICAgICogW1RIUklGVC0zMTI4XSAtIEdvIGdlbmVyYXRlZCBjb2RlIHByb2R1Y2VzIG5hbWUgY29sbGlzaW9ucyBiZXR3ZWVuIHNlcnZpY2VzCisgICAgKiBbVEhSSUZULTMxNDZdIC0gR3JhcGh2aXogZ2VuZXJhdGVzIGZ1bmN0aW9uIG5hbWUgY29sbGlzaW9ucyBiZXR3ZWVuIHNlcnZpY2VzCisgICAgKiBbVEhSSUZULTMxNDddIC0gU2VnZmF1bHQgd2hpbGUgcmVjZWl2aW5nIGRhdGEKKyAgICAqIFtUSFJJRlQtMzE0OF0gLSBNYXJrZG93biBsaW5rcyB0byBjb2Rpbmdfc3RhbmRhcmRzIGFyZSBkZWFkCisgICAgKiBbVEhSSUZULTMwOTBdIC0gY21ha2UgYnVpbGQgaXMgYnJva2VuIG9uIE1hY09TWAorICAgICogW1RIUklGVC0zMDk3XSAtIGNtYWtlIHRhcmdldHMgdW5jb25kaXRpb25hbGx5IGRlcGVuZCBvbiBvcHRpb25hbCBsaWJyYXJpZXMKKyAgICAqIFtUSFJJRlQtMzA5NF0gLSBtYXN0ZXIgYXMgb2YgMjAxNS1BUFItMTMgZmFpbHMgLURCT09TVF9USFJFQURTIGNtYWtlIGJ1aWxkCisgICAgKiBbVEhSSUZULTMwOTldIC0gY21ha2UgYnVpbGQgaXMgYnJva2VuIG9uIEZyZWVCU0QKKyAgICAqIFtUSFJJRlQtMzA4OV0gLSBBc3NpZ25pbmcgZGVmYXVsdCBFTlVNIHZhbHVlcyByZXN1bHRzIGluIG5vbi1jb21waWxhYmxlIGphdmEgY29kZSBpZiBqYXZhIG5hbWVzcGFjZSBpcyBub3QgZGVmaW5lZAorICAgICogW1RIUklGVC0zMDkzXSAtIG1pbmd3IGNvbXBpbGUgZml4ZXMgZm9yIGMrKyBsaWJyYXJ5IDAuOS4yCisgICAgKiBbVEhSSUZULTMwOThdIC0gVGhyaWZ0IGRvZXMgbm90IHByZXR0eSBwcmludCBiaW5hcnkgdHlwZWRlZnMgdGhlIHdheSBpdCBkb2VzIGJpbmFyeSBmaWVsZHMKKyAgICAqIFtUSFJJRlQtMzA5MV0gLSBjX2dsaWIgc2VydmljZSBtZXRob2Qgc2hvdWxkIHJldHVybiByZXN1bHQgZnJvbSBoYW5kbGVyIG1ldGhvZAorICAgICogW1RIUklGVC0zMDg4XSAtIFRUaHJlYWRQb29sU2VydmVyIHdpdGggU2FzbCBhdXRoIG1heSBsZWFrIENMT1NFX1dBSVQgc29ja2V0CisgICAgKiBbVEhSSUZULTMxMDldIC0gQ3Jvc3MgdGVzdCBsb2cgZmlsZSBjYW5ub3QgYmUgYnJvd3NlZCB3aGVuIHNlcnZlZCBpbiBIVFRQIHNlcnZlcgorICAgICogW1RIUklGVC0zMTEzXSAtIG00IEMrKzExIG1hY3JvIGlzc3VlCisgICAgKiBbVEhSSUZULTMxMDVdIC0gQysrIGxpYnRocmlmdG5iIGxpYnJhcnkgb24gV2luZG93cyBidWlsZCBmYWlsdXJlCisgICAgKiBbVEhSSUZULTMxMTVdIC0gVW5jb21waWxlYWJsZSBjb2RlIGR1ZSB0byBuYW1lIGNvbGxpc2lvbiB3aXRoIHByZWRlZmluZWQgdXNlZCB0eXBlcworICAgICogW1RIUklGVC0zMTE3XSAtIEphdmEgVFNTTFRyYW5zcG9ydEZhY3RvcnkgY2FuJ3QgbG9hZCBjZXJ0aWZpY2F0ZXMgd2l0aGluIEpBUiBhcmNoaXZlCisgICAgKiBbVEhSSUZULTMxMDJdIC0gY291bGQgbm90IG1ha2UgY2hlY2sgZm9yIEdvIExpYnJhcnkKKyAgICAqIFtUSFJJRlQtMzEyMF0gLSBNaW5vciBzcGVsbGluZyBlcnJvcnMgYW5kIGFuIG91dGRhdGVkIFVSTAorICAgICogW1RIUklGVC0zMTIxXSAtIExpYnJ0IGRvZXMgbm90IGV4aXN0IG9uIE9TIFgKKyAgICAqIFtUSFJJRlQtMzE1Ml0gLSBDb21waWxlciBlcnJvciBvbiBNYWMgT1NYIChtaXNzaW5nICNpbmNsdWRlIDxjc3RkbGliPikKKyAgICAqIFtUSFJJRlQtMzE2Ml0gLSBtYWtlIGZhaWxzIGZvciBkbWQgMi4wNjcKKyAgICAqIFtUSFJJRlQtMzE2NF0gLSBUaHJpZnQgQysrIGxpYnJhcnkgU1NMIHNvY2tldCBieSBkZWZhdWx0IGFsbG93cyBmb3IgdW5zZWN1cmUgU1NMdjMgbmVnb3RpYXRpb24KKyAgICAqIFtUSFJJRlQtMzE2OF0gLSBGaXggTWF2ZW4gUE9NCisgICAgKiBbVEhSSUZULTMxNzBdIC0gSW5pdGlhbGlzbSBjb2RlIGluIHRoZSBHbyBjb21waWxlciBjYXVzZXMgY2hhb3MKKyAgICAqIFtUSFJJRlQtMzE2OV0gLSBEbyBub3QgZXhwb3J0IHRocmlmdC5UZXN0U3RydWN0IGFuZCB0aHJpZnQuVGVzdEVudW0gaW4gdGhyaWZ0IEdvIGxpYnJhcnkgCisgICAgKiBbVEhSSUZULTMxOTFdIC0gUGVybCBjb21waWxlciBkb2VzIG5vdCBhZGQgc3VwcG9ydCBmb3IgdW5leHBlY3RlZCBleGNlcHRpb24gaGFuZGxpbmcKKyAgICAqIFtUSFJJRlQtMzE3OF0gLSBnbGliIEMgZG9lcyBub3QgY29tcGlsZQorICAgICogW1RIUklGVC0zMTg5XSAtIFBlcmwgU2VydmVyU29ja2V0IHNob3VsZCBhbGxvdyBhIHNwZWNpZmljIGludGVyZmFjZSB0byBiZSBsaXN0ZW5lZCB0bworICAgICogW1RIUklGVC0zMjUyXSAtIE1pc3NpbmcgVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mby5oIGluIGNwcCBNYWtlZmlsZSwgc28gZG9lc24ndCBpbnN0YWxsCisgICAgKiBbVEhSSUZULTMyNTVdIC0gVGhyaWZ0IGdlbmVyYXRvciBkb2Vzbid0IGV4Y2x1ZGUgJ3BhY2thZ2UnIGtleXdvcmQgZm9yIHRocmlmdCBwcm9wZXJ0eSBuYW1lcyBicmVha2luZyBqYXZhIGJ1aWxkcworICAgICogW1RIUklGVC0zMjYwXSAtIG11bHRpcGxlIHdhcm5pbmdzIGluIGNfZ2xpYiB0dXRvcmlhbAorICAgICogW1RIUklGVC0zMjU2XSAtIFNvbWUgRCB0ZXN0IHRpbWluZ3MgYXJlIHRvbyBhZ2dyZXNzaXZlIGZvciBzbG93IG1hY2hpbmVzCisgICAgKiBbVEhSSUZULTMyNTddIC0gd2FybmluZzogZXh0cmEgdG9rZW5zIGF0IGVuZCBvZiAjZW5kaWYgZGlyZWN0aXZlCisgICAgKiBbVEhSSUZULTMxODRdIC0gVGhyaWZ0IEdvIGxlYXZlcyBmaWxlIGRlc2NyaXB0b3JzIG9wZW4KKyAgICAqIFtUSFJJRlQtMzIwM10gLSBET0FQIC0gcGxlYXNlIGZpeCAiT2NhbWwiID0+ICJPQ2FtbCIKKyAgICAqIFtUSFJJRlQtMzIxMF0gLSAodW5jb21waWxlYWJsZSkgY29kZSBnZW5lcmF0ZWQgZm9yIHNlcnZlciBldmVudHMgd2hpbGUgYXJlIGV2ZW50cyBub3QgZW5hYmxlZAorICAgICogW1RIUklGVC0zMjE1XSAtIFRKU09OUHJvdG9jb2wgJyhjKyspIHVzZXMgInRocm93IG5ldyIgdG8gdGhyb3cgZXhjZXB0aW9ucyBpbnN0ZWFkIG9mICJ0aHJvdyIKKyAgICAqIFtUSFJJRlQtMzIwMl0gLSBBbGxvdyBIU0hBU2VydmVyIHRvIGNvbmZpZ3VyZSBtaW4gYW5kIG1heCB3b3JrZXIgdGhyZWFkcyBzZXBhcmF0ZWx5LgorICAgICogW1RIUklGVC0zMjA1XSAtIFRDb21wYWN0UHJvdG9jb2wgcmV0dXJuIGEgd3JvbmcgZXJyb3Igd2hlbiB0aGUgaW8uRU9GIGhhcHBlbnMKKyAgICAqIFtUSFJJRlQtMzIwOV0gLSBMR1BMIG1lbnRpb25lZCBpbiBsaWNlbnNlIGZpbGUKKyAgICAqIFtUSFJJRlQtMzE5N10gLSBrZWVwQWxpdmVUaW1lIGlzIGhhcmQgY29kZWQgYXMgNjAgc2VjIGluIFRUaHJlYWRQb29sU2VydmVyCisgICAgKiBbVEhSSUZULTMxOTZdIC0gTWlzc3BlbGxpbmcgaW4gbHVhIFRCaW5hcnlQcm90b2NvbCAoc3RpcmN0V3JpdGUgPT4gc3RyaWN0V3JpdGUpCisgICAgKiBbVEhSSUZULTMxOThdIC0gQWxsb3cgY29uc3RydWN0aW9uIG9mIFRUcmFuc3BvcnRGYWN0b3J5IHdpdGggYSBzcGVjaWZpZWQgbWF4TGVuZ3RoCisgICAgKiBbVEhSSUZULTMxOTJdIC0gR28gaW1wb3J0IHBhdGhzIGNoYW5nZWQgaW4gMS40LCBhbmQgZXhwaXJlZCBKdW5lIDEKKyAgICAqIFtUSFJJRlQtMzI3MV0gLSBDb3VsZCBub3QgZmluZCBvciBsb2FkIG1haW4gY2xhc3MgY29uZmlndGVzdF9heF9qYXZhY19hbmRfamF2YSBvbiBzb21lIG5vbi1lbmdsaXNoIHN5c3RlbXMKKyAgICAqIFtUSFJJRlQtMzI3M10gLSBjX2dsaWI6IEdlbmVyYXRlZCBjb2RlIHRyaWVzIHRvIGNvbnZlcnQgYmV0d2VlbiBmdW5jdGlvbiBhbmQgdm9pZCBwb2ludGVycworICAgICogW1RIUklGVC0zMjY0XSAtIEZpeCBFcmxhbmcgMTYgbmFtZXNwYWNlZCB0eXBlcworICAgICogW1RIUklGVC0zMjcwXSAtIHJldXNpbmcgVE5vbmJsb2NraW5nU2VydmVyOjpUQ29ubmVjdGlvbiBjYXVzZSBkaXJ0eSBUU29ja2V0CisgICAgKiBbVEhSSUZULTMyNjddIC0gY19nbGliOiAiQ3JpdGljYWwiIGZhaWx1cmUgZHVyaW5nIHVuaXQgdGVzdHMKKyAgICAqIFtUSFJJRlQtMzI3N10gLSBUSHR0cENsaWVudCBsZWFrcyBjb25uZWN0aW9ucyBpZiBpdCdzIHVzZWQgZm9yIG11bHRpcGxlIHJlcXVlc3RzCisgICAgKiBbVEhSSUZULTMyNzhdIC0gTm9kZUpTOiBGaXggZXhjZXB0aW9uIHN0YWNrIHRyYWNlcyBhbmQgbmFtZXMKKyAgICAqIFtUSFJJRlQtMzI3OV0gLSBGaXggYSBidWcgaW4gcmV0cnlfbWF4X2RlbGF5IChOb2RlSlMpCisgICAgKiBbVEhSSUZULTMyODBdIC0gSW5pdGlhbGl6ZSByZXRyeSB2YXJpYWJsZXMgb24gY29uc3RydWN0aW9uCisgICAgKiBbVEhSSUZULTMyODNdIC0gY19nbGliOiBUdXRvcmlhbCBzZXJ2ZXIgYWx3YXlzIGV4aXRzIHdpdGggd2FybmluZworICAgICogW1RIUklGVC0zMjg0XSAtIGNfZ2xpYjogRW1wdHkgc2VydmljZSBwcm9kdWNlcyB1bnVzZWQtdmFyaWFibGUgd2FybmluZworICAgICogW1RIUklGVC0xOTI1XSAtIGNfZ2xpYiBnZW5lcmF0ZWQgY29kZSBkb2VzIG5vdCBjb21waWxlCisgICAgKiBbVEhSSUZULTE4NDldIC0gYWZ0ZXIgdHJhbnNwb3J0LT5vcGVuKCkgb3BlbnMgaXNPcGVuIHJldHVybnMgdHJ1ZSBhbmQgbmV4dCBvcGVuKCkgZ29lcyB0aHJ1IHdoZW4gaXQgc2hhbGwgbm90CisgICAgKiBbVEhSSUZULTE4NjZdIC0gamF2YSBjb21waWxlciBnZW5lcmF0ZXMgbm9uLWNvbXBpbGluZyBjb2RlIHdpdGggY29uc3QncyBkZWZpbmVkIGluIGEgdGhyaWZ0IHdoZW4gbmFtZSBpbmNsdWRlcyBub24taWRlbnRpZmllciBjaGFycworICAgICogW1RIUklGVC0xOTM4XSAtIEZ1bmN0aW9uUnVubmVyLmggLS0gdXNlcyB3cm9uZyBwYXRoIGZvciBUaHJlYWQuaCB3aGVuIGluc3RhbGxlZAorICAgICogW1RIUklGVC0xODQ0XSAtIFBhc3N3b3JkIHN0cmluZyBub3QgY2xlYXJlZAorICAgICogW1RIUklGVC0yMDA0XSAtIFRocmlmdDo6VW5pb24gdmlvbGF0ZXMgOj09IG1ldGhvZCBjb250cmFjdCBhbmQgY3Jhc2hlcworICAgICogW1RIUklGVC0yMDczXSAtIFRocmlmdCBDKysgVEh0dHBDbGllbnQgZXJyb3I6IGNhbm5vdCByZWZpbGwgYnVmZmVyCisgICAgKiBbVEhSSUZULTIxMjddIC0gQXV0b2NvbmYgc2NyaXB0aW5nIGRvZXMgbm90IHByb3Blcmx5IGFjY291bnQgZm9yIGNyb3NzLWNvbXBpbGUKKyAgICAqIFtUSFJJRlQtMjE4MF0gLSBJbnRlZ2VyIHR5cGVzIGlzc3VlcyBpbiBDb2NvYSBsaWIgb24gQVJNNjQKKyAgICAqIFtUSFJJRlQtMjE4OV0gLSBHbyBuZWVkcyAiaXNzZXQiIHRvIGZ1bGx5IHN1cHBvcnQgInVuaW9uIiB0eXBlIChhbmQgb3B0aW9uYWxzKQorICAgICogW1RIUklGVC0yMTkyXSAtIGF1dG90b29scyBvbiBSZWRoYXQgYmFzZWQgc3lzdGVtcworICAgICogW1RIUklGVC0yNTQ2XSAtIGNyb3NzIGxhbmd1YWdlIHRlc3RzIGZhaWxzIGF0ICdUZXN0TXVsdGlFeGNlcHRpb24nIHdoZW4gdXNpbmcgbm9kZWpzIHNlcnZlcgorICAgICogW1RIUklGVC0yNTQ3XSAtIG5vZGVqcyBzZXJ2ZXJzIGFuZCBjbGllbnRzIGZhaWxzIHRvIGNvbm5lY3Qgd2l0aCBjcHAgdXNpbmcgY29tcGFjdCBwcm90b2NvbAorICAgICogW1RIUklGVC0yNTQ4XSAtIE5vZGVqcyBzZXJ2ZXJzIGFuZCBjbGllbnRzIGRvZXMgbm90IHdvcmsgcHJvcGVybHkgd2l0aCAgLXNzbAorICAgICogW1RIUklGVC0xNDcxXSAtIHRvU3RyaW5nKCkgZG9lcyBub3QgcHJpbnQgQnl0ZUJ1ZmZlciB2YWx1ZXMgd2hlbiBuZXN0ZWQgaW4gYSBMaXN0CisgICAgKiBbVEhSSUZULTEyMDFdIC0gZ2V0YWRkcmluZm8gcmVzb3VyY2UgbGVhaworICAgICogW1RIUklGVC02MTVdIC0gVFRocmVhZFBvb2xTZXJ2ZXIgZG9lc24ndCBjYWxsIHRhc2tfZG9uZSBhZnRlciBwdWxsaW5nIHRhc2tzIGZyb20gaXQncyBjbGllbnRzIHF1ZXVlCisgICAgKiBbVEhSSUZULTE2Ml0gLSBUaHJpZnQgc3RydWN0dXJlcyBhcmUgdW5oYXNoYWJsZSwgcHJldmVudGluZyB0aGVtIGZyb20gYmVpbmcgdXNlZCBhcyBzZXQgZWxlbWVudHMKKyAgICAqIFtUSFJJRlQtODEwXSAtIENyYXNoZWQgY2xpZW50IG9uIFRTb2NrZXQ6OmNsb3NlIHVuZGVyIGxvYWRzCisgICAgKiBbVEhSSUZULTU1N10gLSBjaGFyc2V0IHByb2JsZW0gd2l0aCBmaWxlIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0CisgICAgKiBbVEhSSUZULTIzM10gLSBJREwgZG9lc24ndCBzdXBwb3J0IG5lZ2F0aXZlIGhleCBsaXRlcmFscworICAgICogW1RIUklGVC0xNjQ5XSAtIGNvbnRyaWIvemVyb21xIGRvZXMgbm90IGJ1aWxkIGluIDAuOC4wCisgICAgKiBbVEhSSUZULTE2NDJdIC0gTWlzY2FsY3VsYXRpb24gbGVhZCB0byB0aHJvdyB1bmV4cGVjdGVkICJUVHJhbnNwb3J0RXhjZXB0aW9uOjpUSU1FRF9PVVQiKG9yIGNhbGxlZCAiRUFHQUlOICh0aW1lZCBvdXQpIikgZXhjZXB0aW9uCisgICAgKiBbVEhSSUZULTE1ODddIC0gVFNvY2tldDo6c2V0UmVjdlRpbWVvdXQgZXJyb3IKKyAgICAqIFtUSFJJRlQtMTI0OF0gLSBwb2ludGVyIHN1YnRyYWN0aW9uIGluIFRNZW1vcnlCdWZmZXIgcmVsaWVzIG9uIHVuZGVmaW5lZCBiZWhhdmlvcgorICAgICogW1RIUklGVC0xNzc0XSAtIFNhc2wgVHJhbnNwb3J0IGNsaWVudCB3b3VsZCBoYW5nIHdoZW4gdHJ5aW5nIHRvIGNvbm5lY3Qgbm9uLXNhc2wgdHJhbnNwb3J0IHNlcnZlcgorICAgICogW1RIUklGVC0xNzU0XSAtIFJhbmdlRXJyb3IgaW4gYnVmZmVyIGhhbmRsaW5nCisgICAgKiBbVEhSSUZULTE2MThdIC0gc3RhdGljIHN0cnVjdE1hcCBpbiBGaWVsZE1ldGFEYXRhIGlzIG5vdCB0aHJlYWQgc2FmZSBhbmQgY2FuIGxlYWQgdG8gZGVhZGxvY2tzCisgICAgKiBbVEhSSUZULTIzMzVdIC0gdGhyaWZ0IGluY29tcGF0aWJpbGl0eSB3aXRoIHB5OnRvcm5hZG8gYXMgc2VydmVyLCBqYXZhIGFzIGNsaWVudAorICAgICogW1RIUklGVC0yODAzXSAtIFRDUF9ERUZFUl9BQ0NFUFQgbm90IHN1cHBvcnRlZCB3aXRoIGRvbWFpbiBzb2NrZXRzCisgICAgKiBbVEhSSUZULTI3OTldIC0gQnVpbGQgUHJvYmxlbShzKTogbGQ6IGxpYnJhcnkgbm90IGZvdW5kIGZvciAtbDpsaWJib29zdF91bml0X3Rlc3RfZnJhbWV3b3JrLmEKKyAgICAqIFtUSFJJRlQtMjgwMV0gLSBDKysgdGVzdCBzdWl0ZSBjb21waWxhdGlvbiB3YXJuaW5ncworICAgICogW1RIUklGVC0yODAyXSAtIEMrKyB0dXRvcmlhbCBjb21waWxhdGlvbiB3YXJuaW5ncworICAgICogW1RIUklGVC0yNzk1XSAtIHRocmlmdF9iaW5hcnlfcHJvdG9jb2wuYzogJ2RlcmVmZXJlbmNpbmcgdHlwZS1wdW5uZWQgcG9pbnRlciB3aWxsIGJyZWFrIHN0cmljdC1hbGlhc2luZyBydWxlcycKKyAgICAqIFtUSFJJRlQtMjgxN10gLSBUU2ltcGxlSlNPTlByb3RvY29sIHJlYWRzIGJleW9uZCBlbmQgb2YgbWVzc2FnZQorICAgICogW1RIUklGVC0yODI2XSAtIGh0bWw6c3RhbmRhbG9uZSBzb21ldGltZXMgaWdub3JlZAorICAgICogW1RIUklGVC0yODI5XSAtIFN1cHBvcnQgaGF4ZWxpYiBpbnN0YWxsYXRpb24gdmlhIGdpdGh1YgorICAgICogW1RIUklGVC0yODI4XSAtIHNsaWdodGx5IHdyb25nIGhlbHAgc2NyZWVuIGluZGVudAorICAgICogW1RIUklGVC0yODMxXSAtIFJlbW92ZXMgZGVhZCBjb2RlIGluIHdlYl9zZXJ2ZXIuanMgaW50cm9kdWNlZCBpbiBUSFJJRlQtMjgxOQorICAgICogW1RIUklGVC0yODIzXSAtIEFsbCBKUy10ZXN0cyBhcmUgZmFpbGluZyB3aGVuIHJ1biB3aXRoIGdydW50IHRlc3QKKyAgICAqIFtUSFJJRlQtMjgyN10gLSBUaHJpZnQgMC45LjIgZmFpbHMgdG8gY29tcGlsZSBvbiBZb3NlbWl0ZSBkdWUgdG8gdHIxL2Z1bmN0aW9uYWwgaW5jbHVkZSBpbiBQcm9jZXNzb3JUZXN0LmNwcAorICAgICogW1RIUklGVC0yODQzXSAtIEF1dG9tYWtlIGNvbmZpZ3VyZS5hYyBoYXMgcG9zc2libGUgdHlwbyByZWxhdGVkIHRvIEphdmEKKyAgICAqIFtUSFJJRlQtMjgxM10gLSBtdWx0aXBsZSBoYXhlIGxpYnJhcnkgZml4ZXMvaW1wcm92ZW1lbnRzCisgICAgKiBbVEhSSUZULTI4MjVdIC0gU3VwcGx5aW5nIHVuaWNvZGUgdG8gcHl0aG9uIFRocmlmdCBjbGllbnQgY2FuIGNhdXNlIG5leHQgcmVxdWVzdCBhcmd1bWVudHMgdG8gZ2V0IG92ZXJ3cml0dGVuCisgICAgKiBbVEhSSUZULTI4NDBdIC0gQ2FiYWwgZmlsZSBwb2ludHMgdG8gTElDRU5TRSBmaWxlIG91dHNpZGUgdGhlIHBhdGggb2YgdGhlIEhhc2tlbGwgcHJvamVjdC4KKyAgICAqIFtUSFJJRlQtMjgxOF0gLSBUcmFpbGluZyBjb21tYXMgaW4gYXJyYXkKKyAgICAqIFtUSFJJRlQtMjgzMF0gLSBDbGVhbiB1cCBhbnQgd2FybmluZ3MgaW4gdHV0b3JpYWwgZGlyCisgICAgKiBbVEhSSUZULTI4NDJdIC0gRXJsYW5nIHRocmlmdCBjbGllbnQgaGFzIGluZmluaXRlIHRpbWVvdXQKKyAgICAqIFtUSFJJRlQtMjgxMF0gLSBEbyBub3QgbGVhdmUgdGhlIHVuZGVybHlpbmcgU2VydmVyU29ja2V0IG9wZW4gaWYgY29uc3RydWN0aW9uIG9mIFRTZXJ2ZXJTb2NrZXQgZmFpbHMKKyAgICAqIFtUSFJJRlQtMjgxMl0gLSBHbyBzZXJ2ZXIgYWRkaW5nIHJlZHVuZGFudCBidWZmZXJpbmcgbGF5ZXIKKyAgICAqIFtUSFJJRlQtMjgzOV0gLSBURnJhbWVkVHJhbnNwb3J0IHJlYWQgYnVnCisgICAgKiBbVEhSSUZULTI4NDRdIC0gTm9kZWpzIHN1cHBvcnQgYnJva2VuIHdoZW4gcnVubmluZyB1bmRlciBCcm93c2VyaWZ5CisgICAgKiBbVEhSSUZULTI4MTRdIC0gYXJncy9yZXN1bHQgY2xhc3NlcyBub3QgZm91bmQgd2hlbiBubyBuYW1lc3BhY2UgaXMgc2V0CisgICAgKiBbVEhSSUZULTI4NDddIC0gZnVuY3Rpb24gSWZWYWx1ZSgpIGlzIGEgZHVwbGljYXRlIG9mIFN5c3RlbS5TdHJVdGlscy5JZlRoZW4KKyAgICAqIFtUSFJJRlQtMjg0OF0gLSBjZXJ0YWluIERlbHBoaSB0ZXN0cyBkbyBub3QgYnVpbGQgaWYgVHlwZVJlZ2lzdHJ5IGlzIHVzZWQKKyAgICAqIFtUSFJJRlQtMjg1NF0gLSBHbyBTdHJ1Y3Qgd3JpdGVyIGFuZCByZWFkZXIgbG9vc2VzIGltcG9ydGFudCBlcnJvciBpbmZvcm1hdGlvbgorICAgICogW1RIUklGVC0yODU4XSAtIEVuYWJsZSBoZWFkZXIgZmllbGQgY2FzZSBpbnNlbnNpdGl2ZSBtYXRjaCBpbiBUSHR0cFNlcnZlcgorICAgICogW1RIUklGVC0yODU3XSAtIEMjIGdlbmVyYXRvciBjcmVhdGVzIHVuY29tcGlsYWJsZSBjb2RlIGZvciBzdHJ1Y3QgY29uc3RhbnRzCisgICAgKiBbVEhSSUZULTI4NjBdIC0gRGVscGhpIHNlcnZlciBjbG9zZXMgY29ubmVjdGlvbiBvbiB1bmV4cGVjdGVkIGV4Y2VwdGlvbnMKKyAgICAqIFtUSFJJRlQtMjg2OF0gLSBFbmhhbmNlIGVycm9yIGhhbmRsaW5nIGluIHRoZSBHbyBjbGllbnQgCisgICAgKiBbVEhSSUZULTI4NzldIC0gVE1lbW9yeUJ1ZmZlcjogdXNpbmcgbHVhIHN0cmluZyBpbiB3cm9uZyB3YXkKKyAgICAqIFtUSFJJRlQtMjg1MV0gLSBSZW1vdmUgc3RyYW5nZSBwdWJsaWMgUGVlaygpIGZyb20gR28gdHJhbnNwb3J0cworICAgICogW1RIUklGVC0yODUyXSAtIEJldHRlciBPcGVuL0lzT3Blbi9DbG9zZSBiZWhhdmlvciBmb3IgU3RyZWFtVHJhbnNwb3J0LgorICAgICogW1RIUklGVC0yODcxXSAtIE1pc3Npbmcgc2VtaWNvbG9uIGluIHRocmlmdC5qcworICAgICogW1RIUklGVC0yODcyXSAtIFRocmVhZE1hbmFnZXIgZGVhZGxvY2sgZm9yIHRhc2sgZXhwaXJhdGlvbgorICAgICogW1RIUklGVC0yODgxXSAtIEhhbmRsZSBlcnJvcnMgZnJvbSBBY2NlcHQoKSBjb3JyZWN0bHkKKyAgICAqIFtUSFJJRlQtMjg0OV0gLSBTcGVsbCBlcnJvcnMgcmVwb3J0ZWQgYnkgY29kZXNwZWxsIHRvb2wKKyAgICAqIFtUSFJJRlQtMjg3MF0gLSBDKysgVEpTT05Qcm90b2NvbCB1c2luZyBsb2NhbGUgZGVwZW5kZW50IGZvcm1hdHRpbmcKKyAgICAqIFtUSFJJRlQtMjg4Ml0gLSBMdWEgR2VuZXJhdG9yOiB1c2luZyBzdHJpbmcubGVuIGZ1bnRpb24gdG8gZ2V0IHN0cnVjdChtYXAsbGlzdCxzZXQpIHNpemUKKyAgICAqIFtUSFJJRlQtMjg2NF0gLSBKU09OIGdlbmVyYXRvciBtaXNzaW5nIGZyb20gVmlzdWFsIFN0dWRpbyBidWlsZCBwcm9qZWN0IAorICAgICogW1RIUklGVC0yODc4XSAtIEdvIHZhbGlkYXRpb24gc3VwcG9ydCBvZiByZXF1aXJlZCBmaWVsZHMKKyAgICAqIFtUSFJJRlQtMjg3M10gLSBUUGlwZSBhbmQgVFBpcGVTZXJ2ZXIgZG9uJ3QgY29tcGlsZSBvbiBXaW5kb3dzIHdpdGggVU5JQ09ERSBlbmFibGVkCisgICAgKiBbVEhSSUZULTI4ODhdIC0gaW1wb3J0IG9mIDxsaW1pdHM+IGlzIG1pc3NpbmcgaW4gSlNPTiBnZW5lcmF0b3IKKyAgICAqIFtUSFJJRlQtMjkwMF0gLSBQeXRob24gVEh0dHBDbGllbnQgZG9lcyBub3QgcmVzZXQgc29ja2V0IHRpbWVvdXQgb24gZXhjZXB0aW9uCisgICAgKiBbVEhSSUZULTI5MDddIC0gJ250b2hsbCcgbWFjcm8gcmVkZWZpbmVkCisgICAgKiBbVEhSSUZULTI4ODRdIC0gTWFwIGRvZXMgbm90IHNlcmlhbGl6ZSBjb3JyZWN0bHkgZm9yIEpTT04gcHJvdG9jb2wgaW4gR28gbGlicmFyeQorICAgICogW1RIUklGVC0yODg3XSAtIC0td2l0aC1vcGVuc3NsIGNvbmZpZ3VyZSBmbGFnIGlzIGlnbm9yZWQKKyAgICAqIFtUSFJJRlQtMjg5NF0gLSBQSFAganNvbiBzZXJpYWxpemVyIHNraXBzIG1hcHMgd2l0aCBpbnQvYm9vbCBrZXlzCisgICAgKiBbVEhSSUZULTI5MDRdIC0ganNvbl9wcm90b2NvbF90ZXN0LmdvIGZhaWxzCisgICAgKiBbVEhSSUZULTI5MDZdIC0gbGlicmFyeSBub3QgZm91bmQgZm9yIC1sOmxpYmJvb3N0X3VuaXRfdGVzdF9mcmFtZXdvcmsuYQorICAgICogW1RIUklGVC0yODkwXSAtIGJpbmFyeSBkYXRhIG1heSBsb3NlIGJ5dGVzIHdpdGggSlNPTiB0cmFuc3BvcnQgdW5kZXIgc3BlY2lmaWMgY2lyY3Vtc3RhbmNlcworICAgICogW1RIUklGVC0yODkxXSAtIGJpbmFyeSBkYXRhIG1heSBjYXVzZSBhIGZhaWx1cmUgd2l0aCBKU09OIHRyYW5zcG9ydCB1bmRlciBzcGVjaWZpYyBjaXJjdW1zdGFuY2VzCisgICAgKiBbVEhSSUZULTI5MDFdIC0gRml4IGZvciBnZW5lcmF0ZWQgVHlwZVNjcmlwdCBmdW5jdGlvbnMgKyBpbmRlbnRhdGlvbiBvZiBKYXZhU2NyaXB0IG1hcHMKKyAgICAqIFtUSFJJRlQtMjkxNl0gLSBtYWtlIGNoZWNrIGZhaWxzIGZvciBEIGxhbmd1YWdlCisgICAgKiBbVEhSSUZULTI5MThdIC0gUmFjZSBjb25kaXRpb24gaW4gUHl0aG9uIFRQcm9jZXNzUG9vbFNlcnZlciB0ZXN0CisgICAgKiBbVEhSSUZULTI5MjBdIC0gRXJsYW5nIFRocmlmdCB0ZXN0IHVzZXMgd3JvbmcgSURMIGZpbGUKKyAgICAqIFtUSFJJRlQtMjkyMl0gLSAkVFJJQUwgaXMgdXNlZCB3aXRoIFB5dGhvbiB0ZXN0cyBidXQgbm90IHRlc3RlZCBhY2NvcmRpbmdseQorICAgICogW1RIUklGVC0yOTEyXSAtIEF1dG90b29sIGJ1aWxkIGZvciBDKysgUXQgbGlicmFyeSBpcyBpbnZhbGlkCisgICAgKiBbVEhSSUZULTI5MTRdIC0gZXhwbGljaXQgZGVwZW5kZW5jeSB0byBMdWE1LjIgZmFpbHMgb24gc29tZSBzeXN0ZW1zCisgICAgKiBbVEhSSUZULTI5MTBdIC0gbGliZXZlbnQgaXMgbm90IHJlYWxseSBvcHRpb25hbAorICAgICogW1RIUklGVC0yOTExXSAtIGZpeCBjKysgdmVyc2lvbiB6ZXJvbXEgdHJhbnNwb3J0LCB0aGUgb2xkIHZlcnNpb24gY2Fubm90IHdvcmsKKyAgICAqIFtUSFJJRlQtMjkxNV0gLSBMdWEgZ2VuZXJhdG9yIG1pc3NpbmcgZnJvbSBWaXN1YWwgU3R1ZGlvIGJ1aWxkIHByb2plY3QKKyAgICAqIFtUSFJJRlQtMjkxN10gLSAibWFrZSBjbGVhbiIgYnJlYWtzIHRlc3QvY19nbGliCisgICAgKiBbVEhSSUZULTI5MTldIC0gSGF4ZSB0ZXN0IHNlcnZlciB0aW1lb3V0IHRvbyBsYXJnZQorICAgICogW1RIUklGVC0yOTIzXSAtIEphdmFTY3JpcHQgY2xpZW50IGFzc3VtZXMgYSBtZXNzYWdlIGJlaW5nIHdyaXR0ZW4KKyAgICAqIFtUSFJJRlQtMjkyNF0gLSBUTm9uYmxvY2tpbmdTZXJ2ZXIgY3Jhc2hlcyB3aGVuIHVzZXItcHJvdmlkZWQgZXZlbnRfYmFzZSBpcyB1c2VkCisgICAgKiBbVEhSSUZULTI5MjVdIC0gQ01ha2UgYnVpbGQgZG9lcyBub3Qgd29yayB3aXRoIE9wZW5TU0wgbm9yIGFueXRoaW5nIGluc3RhbGxlZCBpbiBub24tc3lzdGVtIGxvY2F0aW9uCisgICAgKiBbVEhSSUZULTI5MzFdIC0gQWNjZXNzIHRvIHVuZGVjbGFyZWQgc3RhdGljIHByb3BlcnR5OiBUaHJpZnRcUHJvdG9jb2xcVFByb3RvY29sOjokVEJJTkFSWVBST1RPQ09MQUNDRUxFUkFURUQKKyAgICAqIFtUSFJJRlQtMjg5M10gLSBDTWFrZSBidWlsZCBmYWlscyB3aXRoIGJvb3N0IHRocmVhZCBvciBzdGQgdGhyZWFkCisgICAgKiBbVEhSSUZULTI5MDJdIC0gR2VuZXJhdGVkIGNfZ2xpYiBjb2RlIGRvZXMgbm90IGNvbXBpbGUgd2l0aCBjbGFuZworICAgICogW1RIUklGVC0yOTAzXSAtIFF0NCBsaWJyYXJ5IGJ1aWx0IHdpdGggQ01ha2UgZG9lcyBub3Qgd29yaworICAgICogW1RIUklGVC0yOTQyXSAtIENTaGFycCBnZW5lcmF0ZSBpbnZhbGlkIGNvZGUgZm9yIHByb3BlcnR5IG5hbWVkIHJlYWQgb3Igd3JpdGUKKyAgICAqIFtUSFJJRlQtMjkzMl0gLSBOb2RlLmpzIFRocmlmdCBjb25uZWN0aW9uIGxpYnJhcmllcyB0aHJvdyBFeGNlcHRpb25zIGludG8gZXZlbnQgZW1pdHRlcgorICAgICogW1RIUklGVC0yOTMzXSAtIHYwLjkuMjogZG91YmxlcyBlbmNvZGVkIGluIG5vZGUgd2l0aCBjb21wYWN0IHByb3RvY29sIGNhbm5vdCBiZSBkZWNvZGVkIGJ5IHB5dGhvbgorICAgICogW1RIUklGVC0yOTM0XSAtIGNyZWF0ZVNlcnZlciBzaWduYXR1cmUgbWlzbWF0Y2gKKyAgICAqIFtUSFJJRlQtMjk4MV0gLSBJREwgd2l0aCBubyBuYW1lc3BhY2UgcHJvZHVjZXMgdW5wYXJzYWJsZSBQSFAKKyAgICAqIFtUSFJJRlQtMjk5OV0gLSBBZGRpdGlvbiBvZiAuZ2l0YXR0cmlidXRlcyB0ZXh0IGF1dG8gaW4gVEhSSUZULTI3MjQgY2F1c2VzIG1vZGlmaWVkIGZpbGVzIG9uIGNoZWNrb3V0CisgICAgKiBbVEhSSUZULTI5NDldIC0gdHlwbyBpbiBjb21waWxlci9jcHAvUkVBRE1FLm1kCisgICAgKiBbVEhSSUZULTI5NTddIC0gd2FybmluZzogc291cmNlIGZpbGUgJXMgaXMgaW4gYSBzdWJkaXJlY3RvcnksIGJ1dCBvcHRpb24gJ3N1YmRpci1vYmplY3RzJyBpcyBkaXNhYmxlZAorICAgICogW1RIUklGVC0yOTUzXSAtIFROYW1lZFBpcGVTZXJ2ZXJUcmFuc3BvcnQgaXMgbm90IFN0b3AoKWFibGUKKyAgICAqIFtUSFJJRlQtMjk2Ml0gLSBEb2NrZXIgVGhyaWZ0IGVudiBmb3IgZGV2ZWxvcG1lbnQgYW5kIHRlc3RpbmcKKyAgICAqIFtUSFJJRlQtMjk3MV0gLSBDKysgdGVzdCBhbmQgdHV0b3JpYWwgcGFyYWxsZWwgYnVpbGQgaXMgdW5zdGFibGUKKyAgICAqIFtUSFJJRlQtMjk3Ml0gLSBNaXNzaW5nIGJhY2tzbGFzaCBpbiBsaWIvY3BwL3Rlc3QvTWFrZWZpbGUuYW0KKyAgICAqIFtUSFJJRlQtMjk1MV0gLSBGaXggRXJsYW5nIG5hbWUgY29uZmxpY3QgdGVzdAorICAgICogW1RIUklGVC0yOTU1XSAtIFVzaW5nIGxpc3Qgb2YgdHlwZWRlZnMgZG9lcyBub3QgY29tcGlsZSBvbiBHbworICAgICogW1RIUklGVC0yOTYwXSAtIG5hbWVzcGFjZSByZWdyZXNzaW9uIGZvciBSdWJ5CisgICAgKiBbVEhSSUZULTI5NTldIC0gbm9kZWpzOiBmaXggYmluYXJ5IHVuaXQgdGVzdHMKKyAgICAqIFtUSFJJRlQtMjk2Nl0gLSBub2RlanM6IEZpeCBiYWQgcmVmZXJlbmNlcyB0byBUUHJvdG9jb2xFeGNlcHRpb24gYW5kIFRQcm90b2NvbEV4Y2VwdGlvblR5cGUKKyAgICAqIFtUSFJJRlQtMjk3MF0gLSBncnVudC1qc2RvYyBmYWlscyBkdWUgdG8gZGVwZW5kZW5jeSBpc3N1ZXMKKyAgICAqIFtUSFJJRlQtMzAwMV0gLSBDIyBFcXVhbHMgZmFpbHMgZm9yIGJpbmFyeSBmaWVsZHMgKGJ5dGVbXSkKKyAgICAqIFtUSFJJRlQtMzAwM10gLSBNaXNzaW5nIExJQ0VOU0UgZmlsZSBwcmV2ZW50cyBwYWNrYWdlIGZyb20gYmVpbmcgaW5zdGFsbGVkCisgICAgKiBbVEhSSUZULTMwMDhdIC0gTm9kZS5qcyBzZXJ2ZXIgZG9lcyBub3QgZnVsbHkgc3VwcG9ydCBleGNlcHRpb24KKyAgICAqIFtUSFJJRlQtMzAwN10gLSBUcmF2aXMgYnVpbGQgaXMgYnJva2VuIGJlY2F1c2Ugb2YgZGlyZWN0b3J5IGNvbmZsaWN0CisgICAgKiBbVEhSSUZULTMwMDldIC0gVFNTTFNvY2tldCBkb2VzIG5vdCB1c2UgdGhlIGNvcnJlY3QgaG9zdG5hbWUgKGJyZWFrcyBjZXJ0aWZpY2F0ZSBjaGVja3MpCisgICAgKiBbVEhSSUZULTMwMTFdIC0gQyMgdGVzdCBzZXJ2ZXIgdGVzdEV4Y2VwdGlvbigpIG5vdCBpbXBsZW1lbnRlZCBhY2NvcmRpbmcgdG8gc3BlY3MKKyAgICAqIFtUSFJJRlQtMzAxMl0gLSBUaW1pbmcgcHJvYmxlbXMgaW4gTmFtZWRQaXBlIGltcGxlbWVudGF0aW9uIGR1ZSB0byB1bm5lY2Vzc2FyeSBvcGVuL2Nsb3NlCisgICAgKiBbVEhSSUZULTMwMTldIC0gR29sYW5nIGdlbmVyYXRvciBtaXNzaW5nIGRvY3N0cmluZyBmb3Igc3RydWN0cworICAgICogW1RIUklGVC0zMDIxXSAtIFNlcnZpY2UgcmVtb3RlIHRvb2wgZG9lcyBub3QgaW1wb3J0IHN0dWIgcGFja2FnZSB3aXRoIHBhY2thZ2UgcHJlZml4CisgICAgKiBbVEhSSUZULTMwMjZdIC0gVE11bHRpcGxleGVkUHJvY2Vzc29yIGRvZXMgbm90IGhhdmUgYSBjb25zdHJ1Y3RvcgorICAgICogW1RIUklGVC0zMDI4XSAtIFJlZ3Jlc3Npb24gY2F1c2VkIGJ5IFRIUklGVC0yMTgwCisgICAgKiBbVEhSSUZULTMwMTddIC0gb3JkZXIgb2YgbWFwIGtleS92YWx1ZSB0eXBlcyBpbmNvcnJlY3QgZm9yIG9uZSBDVE9SCisgICAgKiBbVEhSSUZULTMwMjBdIC0gQ2Fubm90IGNvbXBpbGUgdGhyaWZ0IGFzIEMrKzAzCisgICAgKiBbVEhSSUZULTMwMjRdIC0gVXNlci1BZ2VudCAiQmF0dGxlTmV0IiB1c2VkIGluIHNvbWUgVGhyaWZ0IGxpYnJhcnkgZmlsZXMKKyAgICAqIFtUSFJJRlQtMzA0N10gLSBVbmV2ZW4gY2FsbHMgdG8gaW5kZW50X3VwIGFuZCBpbmRlbnRfZG93biBpbiBDb2NvYSBnZW5lcmF0b3IKKyAgICAqIFtUSFJJRlQtMzA0OF0gLSBOb2RlSlMgZGVjb2Rpbmcgb2YgSTY0IGlzIGluY29uc2lzdGVudCBhY3Jvc3MgcHJvdG9jb2xzCisgICAgKiBbVEhSSUZULTMwNDNdIC0gZ28gY29tcGlsZXIgZ2VuZXJhdG9yIHVzZXMgbm9uIEMrKzk4IGNvZGUKKyAgICAqIFtUSFJJRlQtMzA0NF0gLSBEb2NrZXIgUkVBRE1FLm1kIHBhdGhzIHRvIERvY2tlcmZpbGVzIGFyZSBpbmNvcnJlY3QKKyAgICAqIFtUSFJJRlQtMzA0MF0gLSBib3dlci5qc29uIHdyb25nICJtYWluIiBwYXRoCisgICAgKiBbVEhSSUZULTMwNTFdIC0gR28gVGhyaWZ0IGdlbmVyYXRvciBjcmVhdGVzIGJhZCBnbyBjb2RlCisgICAgKiBbVEhSSUZULTMwNTddIC0gSmF2YSBjb21waWxlciBidWlsZCBpcyBicm9rZW4KKyAgICAqIFtUSFJJRlQtMzA2MV0gLSBDKysgVFNTTFNvY2tldCBzaHV0ZG93biBkZWxheS92dWxuZXJhYmlsaXR5CisgICAgKiBbVEhSSUZULTMwNjJdIC0gQysrIFRTZXJ2ZXJTb2NrZXQgaW52YWxpZCBwb3J0IG51bWJlciAob3ZlciA5OTk5OTkpIGNhdXNlcyBzdGFjayBjb3JydXB0aW9uCisgICAgKiBbVEhSSUZULTMwNjVdIC0gVXBkYXRlIGxpYnRocmlmdCBkZXBlbmRlbmNpZXMgKHNsZjRqLCBodHRwY29yZSwgaHR0cGNsaWVudCkKKyAgICAqIFtUSFJJRlQtMzI0NF0gLSBUeXBlU2NyaXB0OiBmaXggbmFtZXNwYWNlIG9mIGluY2x1ZGVkIHR5cGVzCisgICAgKiBbVEhSSUZULTMyNDZdIC0gUmVkdWNlIHRoZSBudW1iZXIgb2YgdHJpdmlhbCB3YXJuaW5ncyBpbiBXaW5kb3dzIEMrKyBDTWFrZSBidWlsZHMKKyAgICAqIFtUSFJJRlQtMzIyNF0gLSBGaXggVE5hbWVkUGlwZVNlcnZlciB1bnByZWRpY3RhYmxlIGJlaGF2aW9yIG9uIGFjY2VwdAorICAgICogW1RIUklGVC0zMjMwXSAtIFB5dGhvbiBjb21waWxlciBnZW5lcmF0ZXMgd3JvbmcgY29kZSBpZiB0aGVyZSBpcyBmdW5jdGlvbiB0aHJvd2luZyBhIHR5cGVkZWYgb2YgZXhjZXB0aW9uIHdpdGggYW5vdGhlciBuYW1lc3BhY2UKKyAgICAqIFtUSFJJRlQtMzIzNl0gLSBNYXhTa2lwRGVwdGggbmV2ZXIgY2hlY2tlZAorICAgICogW1RIUklGVC0zMjM5XSAtIExpbWl0IHJlY3Vyc2lvbiBkZXB0aAorICAgICogW1RIUklGVC0zMjQxXSAtIGZhdGFsIGVycm9yOiBydW50aW1lOiBjYW5ub3QgbWFwIHBhZ2VzIGluIGFyZW5hIGFkZHJlc3Mgc3BhY2UKKyAgICAqIFtUSFJJRlQtMzI0Ml0gLSBPU0dpIEltcG9ydC1QYWNrYWdlIGRpcmVjdGl2ZSBpcyBtaXNzaW5nIHRoZSBBcGFjaGUgSFRUUCBwYWNrYWdlcworICAgICogW1RIUklGVC0zMjM0XSAtIExpbWl0IHJlY3Vyc2lvbiBkZXB0aAorICAgICogW1RIUklGVC0zMjIyXSAtIFR5cGVTY3JpcHQ6IEdlbmVyYXRlZCBFbnVtcyBhcmUgcXVvdGVkCisgICAgKiBbVEhSSUZULTMyMjldIC0gdW5leHBlY3RlZCBUaW1lb3V0IGV4Y2VwdGlvbiB3aGVuIGRlc2lyZWQgYnl0ZXMgYXJlIG9ubHkgcGFydGlhbGx5IGF2YWlsYWJsZQorICAgICogW1RIUklGVC0zMjMxXSAtIENQUDogTGltaXQgcmVjdXJzaW9uIGRlcHRoIHRvIDY0CisgICAgKiBbVEhSSUZULTMyMzVdIC0gTGltaXQgcmVjdXJzaW9uIGRlcHRoCisgICAgKiBbVEhSSUZULTMxNzVdIC0gZmFzdGJpbmFyeS5jIHB5dGhvbiBkZXNlcmlhbGl6ZSBjYW4gY2F1c2UgaHVnZSBhbGxvY2F0aW9ucyBmcm9tIGdhcmJhZ2UKKyAgICAqIFtUSFJJRlQtMzE3Nl0gLSBVbmlvbiBpbmNvcnJlY3RseSBpbXBsZW1lbnRzID09CisgICAgKiBbVEhSSUZULTMxNzddIC0gRmFpbHMgdG8gcnVuIHJha2UgdGVzdAorICAgICogW1RIUklGVC0zMTgwXSAtIGx1YSBwbHVnaW46IGZyYW1lZCB0cmFuc3BvcnQgZG8gbm90IHdvcmsKKyAgICAqIFtUSFJJRlQtMzE3OV0gLSBsdWEgcGx1Z2luIGNhbnQgY29ubmVjdCB0byByZW1vdGUgc2VydmVyIGJlY2F1c2UgZnVuY3Rpb24gbF9zb2NrZXRfY3JlYXRlX2FuZF9jb25uZWN0IGFsd2F5cyBiaW5kIHNvY2tldCB0byBsb2NhbGhvc3QKKyAgICAqIFtUSFJJRlQtMzI0OF0gLSBUeXBlU2NyaXB0OiBhZGRpdGlvbmFsIGNvbW1hIGluIG1ldGhvZCBzaWduYXR1cmUgd2l0aG91dCBwYXJhbWV0ZXJzCisgICAgKiBbVEhSSUZULTMzMDJdIC0gR28gSlNPTiBwcm90b2NvbCBzaG91bGQgZW5jb2RlIFRocmlmdCBieXRlIHR5cGUgYXMgc2lnbmVkIGludGVnZXIgc3RyaW5nCisgICAgKiBbVEhSSUZULTMyOTddIC0gY19nbGliOiBhbiBhYnN0cmFjdCBiYXNlIGNsYXNzIGlzIG5vdCBnZW5lcmF0ZWQKKyAgICAqIFtUSFJJRlQtMzI5NF0gLSBUWmxpYlRyYW5zcG9ydCBmb3IgSmF2YSBkb2VzIG5vdCB3cml0ZSBkYXRhIGNvcnJlY3RseQorICAgICogW1RIUklGVC0zMjk2XSAtIEdvIGNyb3NzIHRlc3QgZG9lcyBub3QgY29uZm9ybSB0byBzcGVjCisgICAgKiBbVEhSSUZULTMyOTVdIC0gQyMgbGlicmFyeSBkb2VzIG5vdCBidWlsZCBvbiBNb25vIDQuMC4yLjUgb3IgbGF0ZXIKKyAgICAqIFtUSFJJRlQtMzI5M10gLSBKYXZhU2NyaXB0OiBudWxsIHZhbHVlcyB0dXJuIGludG8gZW1wdHkgc3RydWN0cyBpbiBjb25zdHJ1Y3RvcgorICAgICogW1RIUklGVC0zMzEwXSAtIGxpYi9lcmwvUkVBRE1FLm1kIGhhcyBpbmNvcnJlY3QgZm9ybWF0dGluZworICAgICogW1RIUklGVC0zMzE5XSAtIENTaGFycCB0dXRvcmlhbCB3aWxsIG5vdCBidWlsZCB1c2luZyB0aGUgKi5zbG4KKyAgICAqIFtUSFJJRlQtMzMzNV0gLSBSdWJ5IHNlcnZlciBkb2VzIG5vdCBoYW5kbGUgcHJvY2Vzc29yIGV4Y2VwdGlvbgorICAgICogW1RIUklGVC0zMzM4XSAtIFN0cmF5IHVuZGVyc2NvcmUgaW4gZ2VuZXJhdGVkIGdvIHdoZW4gc2VydmljZSBuYW1lIHN0YXJ0cyB3aXRoICJOZXciCisgICAgKiBbVEhSSUZULTMzMjRdIC0gVXBkYXRlIEdvIERvY3MgZm9yIHB1bGxpbmcgYWxsIHBhY2thZ2VzCisgICAgKiBbVEhSSUZULTMzNDVdIC0gQ2xpZW50cyBibG9ja2VkIGluZGVmaW5pdGVseSB3aGVuIGEgamF2YS5sYW5nLkVycm9yIGlzIHRocm93bgorICAgICogW1RIUklGVC0zMzMyXSAtIG1ha2UgZGlzdCBmYWlscyBvbiBjbGVhbiBidWlsZAorICAgICogW1RIUklGVC0zMzI2XSAtIFRlc3RzIGRvIG5vdCBjb21waWxlIHVuZGVyICpCU0QKKyAgICAqIFtUSFJJRlQtMzMzNF0gLSBNYXJrZG93biBub3RhdGlvbiBvZiBwcm90b2NvbCBzcGVjIGlzIG1hbGZvcm1lZAorICAgICogW1RIUklGVC0zMzMxXSAtIHdhcm5pbmc6IMOi4oKsy5xldHlwZcOi4oKs4oSiIG1heSBiZSB1c2VkIHVuaW5pdGlhbGl6ZWQgaW4gdGhpcyBmdW5jdGlvbgorICAgICogW1RIUklGVC0zMzQ5XSAtIFB5dGhvbiBzZXJ2ZXIgZG9lcyBub3QgaGFuZGxlIHByb2Nlc3NvciBleGNlcHRpb24KKyAgICAqIFtUSFJJRlQtMzM0M10gLSBGaXggaGFza2VsbCBSRUFETUUKKyAgICAqIFtUSFJJRlQtMzM0MF0gLSBQeXRob246IGVuYWJsZSBqc29uIHRlc3RzIGFnYWluCisgICAgKiBbVEhSSUZULTMzMTFdIC0gVG9wIGxldmVsIFJFQURNRS5tZCBoYXMgaW5jb3JyZWN0IGZvcm1tYXRpbmcKKyAgICAqIFtUSFJJRlQtMjkzNl0gLSBNaW5vciBtZW1vcnkgbGVhayBpbiBTU0wKKyAgICAqIFtUSFJJRlQtMzI5MF0gLSBVc2luZyBmcm9tIGluIHZhcmlhYmxlIG5hbWVzIGNhdXNlcyB0aGUgZ2VuZXJhdGVkIFB5dGhvbiBjb2RlIHRvIGhhdmUgZXJyb3JzCisgICAgKiBbVEhSSUZULTMyMjVdIC0gRml4IFRQaXBlU2VydmVyIHVucHJlZGljdGFibGUgYmVoYXZpb3Igb24gaW50ZXJydXB0KCkKKyAgICAqIFtUSFJJRlQtMzM1NF0gLSBGaXggd29yZC1leHRyYWN0aW9uIHN1YnN0ciBidWcgaW4gaW5pdGlhbGlzbSBjb2RlCisgICAgKiBbVEhSSUZULTIwMDZdIC0gVEJpbmFyeVByb3RvY29sIG1lc3NhZ2UgaGVhZGVyIGNhbGwgbmFtZSBsZW5ndGggaXMgbm90IHZhbGlkYXRlZCBhbmQgY2FuIGJlIHVzZWQgdG8gY29yZSB0aGUgc2VydmVyCisgICAgKiBbVEhSSUZULTMzMjldIC0gQysrIGxpYnJhcnkgdW5pdCB0ZXN0cyBkb24ndCBjb21waWxlIGFnYWluc3QgdGhlIG5ldyBib29zdC0xLjU5IHVuaXQgdGVzdCBmcmFtZXdvcmsKKyAgICAqIFtUSFJJRlQtMjYzMF0gLSB3aW5kb3dzNyA2NGJpdCBwYy4gaXB2NCBhbmQgaXB2NiBwYy5jYW4ndCB1c2UKKyAgICAqIFtUSFJJRlQtMzMzNl0gLSBUaHJpZnQgZ2VuZXJhdGVkIHN0cmVhbWluZyBvcGVyYXRvcnMgYWRkZWQgaW4gMC45LjIgY2Fubm90IGJlIG92ZXJyaWRkZW4KKyAgICAqIFtUSFJJRlQtMjY4MV0gLSBDb3JlIG9mIHVud2luZF9jbGVhbnVwCisgICAgKiBbVEhSSUZULTMzMTddIC0gY3BwIG5hbWVzcGFjZSBvcmcuYXBhY2hlIGlzc3VlIGFwcGVhcnMgaW4gMC45CisKKyMjIERvY3VtZW50YXRpb24KKyAgICAqIFtUSFJJRlQtMzI4Nl0gLSBBcGFjaGUgQW50IGlzIGEgbmVjZXNzYXJ5IGRlcGVuZGVuY3kKKworIyMgSW1wcm92ZW1lbnQKKyAgICAqIFtUSFJJRlQtMjI3XSAtIEJ5dGVbXSBpbiBjb2xsZWN0aW9ucyBhcmVuJ3QgcHJldHR5IHByaW50ZWQgbGlrZSByZWd1bGFyIGJpbmFyeSBmaWVsZHMKKyAgICAqIFtUSFJJRlQtMjc0NF0gLSBWYWdyYW50ZmlsZSBmb3IgQ2VudG9zIDYuNQorICAgICogW1RIUklGVC0yNjQ0XSAtIEhheGUgc3VwcG9ydAorICAgICogW1RIUklGVC0yNzU2XSAtIHJlZ2lzdGVyIE1lZGlhIFR5cGUgQCBJQU5BCisgICAgKiBbVEhSSUZULTMwNzZdIC0gQ29tcGF0aWJpbGl0eSB3aXRoIEhheGUgMy4yLjAKKyAgICAqIFtUSFJJRlQtMzA4MV0gLSBDKysgQ29uc29saWRhdGUgY2xpZW50IHByb2Nlc3NpbmcgbG9vcHMgaW4gVFNlcnZlcnMKKyAgICAqIFtUSFJJRlQtMzA4M10gLSBDKysgQ29uc29saWRhdGUgc2VydmVyIHByb2Nlc3NpbmcgbG9vcHMgaW4gVFNpbXBsZVNlcnZlciwgVFRocmVhZGVkU2VydmVyLCBUVGhyZWFkUG9vbFNlcnZlcgorICAgICogW1RIUklGVC0zMDg0XSAtIEMrKyBhZGQgY29uY3VycmVudCBjbGllbnQgbGltaXQgdG8gdGhyZWFkZWQgc2VydmVycworICAgICogW1RIUklGVC0zMDc0XSAtICAgICBBZGQgY29tcGlsZXIvY3BwL2xleC55eXRocmlmdGwuY2MgdG8gZ2l0aWdub3JlLgorICAgICogW1RIUklGVC0zMTM0XSAtIFJlbW92ZSB1c2Ugb2YgZGVwcmVjYXRlZCAicGhhbnRvbS5hcmdzIgorICAgICogW1RIUklGVC0zMTMzXSAtIEFsbG93ICJtYWtlIGNyb3NzIiBhbmQgIm1ha2UgcHJlY3Jvc3MiIHRvIHJ1biB3aXRob3V0IGJ1aWxkaW5nIGFsbCBsYW5ndWFnZXMKKyAgICAqIFtUSFJJRlQtMzE0Ml0gLSBNYWtlIEphdmFTY3JpcHQgdXNlIGRvd25sb2FkZWQgbGlicmFyaWVzCisgICAgKiBbVEhSSUZULTMxNDFdIC0gSW1wcm92ZSBsb2dnaW5nIG9mIEphdmFTY3JpcHQgdGVzdAorICAgICogW1RIUklGVC0zMTQ0XSAtIFByb3Bvc2FsOiBtYWtlIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBlbnVtcyBpbiBnZW5lcmF0ZWQgZ28gY29kZSBsZXNzIHZlcmJvc2UKKyAgICAqIFtUSFJJRlQtMzEzMF0gLSBSZW1vdmUgdGhlIGxhc3QgdmVzdGlnZXMgb2YgVEhSSUZUX09WRVJMT0FEX0lGIGZyb20gVEhSSUZULTEzMTYKKyAgICAqIFtUSFJJRlQtMzEzMV0gLSBDb25zb2xpZGF0ZSBzdWdnZXN0ZWQgaW1wb3J0IHBhdGggZm9yIGdvIHRocmlmdCBsaWJyYXJ5IHRvIGdpdC5hcGFjaGUub3JnIGluIGRvY3MgYW5kIGNvZGUKKyAgICAqIFtUSFJJRlQtMzA5Ml0gLSBHZW5lcmF0ZWQgSGFza2VsbCB0eXBlcyBzaG91bGQgZGVyaXZlIEdlbmVyaWMKKyAgICAqIFtUSFJJRlQtMzExMF0gLSAgUHJpbnQgZXJyb3IgbG9nIGFmdGVyIGNyb3NzIHRlc3QgZmFpbHVyZXMgb24gVHJhdmlzCisgICAgKiBbVEhSSUZULTMxMTRdIC0gVXNpbmcgbG9jYWwgdGVtcCB2YXJpYWJsZXMgdG8gbm90IHBvbGx1dGUgdGhlIGdsb2JhbCB0YWJsZQorICAgICogW1RIUklGVC0zMTA2XSAtIENNYWtlIHN1bW1hcnkgc2hvdWxkIGdpdmUgbW9yZSBpbmZvcm1hdGlvbiB3aHkgYSBsaWJyYXJ5IGlzIHNldCB0byBvZmYKKyAgICAqIFtUSFJJRlQtMzExOV0gLSBKYXZhJ3MgVFRocmVhZGVkU2VsZWN0b3JTZXJ2ZXIgaGFzIGluZGlzdGluZ3Vpc2hhYmxlIGxvZyBtZXNzYWdlcyBpbiBydW4oKQorICAgICogW1RIUklGVC0zMTIyXSAtIEphdmFzY3JpcHQgc3RydWN0IGNvbnN0cnVjdG9yIHNob3VsZCBwcm9wZXJseSBpbml0aWFsaXplIHN0cnVjdCBhbmQgY29udGFpbmVyIG1lbWJlcnMgZnJvbSBwbGFpbiBqcyBhcmd1bWVudHMKKyAgICAqIFtUSFJJRlQtMzE1MV0gLSBGaXggbGlua3MgdG8gZ2l0LXdpcCogLSBzaG91bGQgYmUgZ2l0LmFwYWNoZS5vcmcKKyAgICAqIFtUSFJJRlQtMzE2N10gLSBXaW5kb3dzIGJ1aWxkIGZyb20gc291cmNlIGluc3RydWN0aW9ucyBuZWVkIHRvIGJlIHJldmlzZWQKKyAgICAqIFtUSFJJRlQtMzE1NV0gLSBtb3ZlIGNvbnRyaWIvbWluZ3czMi10b29sY2hhaW4uY21ha2UgdG8gYnVpbGQvY21ha2UvCisgICAgKiBbVEhSSUZULTMxNjBdIC0gTWFrZSBnZW5lcmF0ZWQgZ28gZW51bXMgaW1wbGVtZW50IFRleHRNYXJzaGFsbGVyIGFuZCBUZXh0VW5tYXJzaGFsbGVyIGludGVyZmFjZXMKKyAgICAqIFtUSFJJRlQtMzE1MF0gLSBBZGQgYW4gb3B0aW9uIHRvIHRocmlmdCBnbyBnZW5lcmF0b3IgdG8gbWFrZSBSZWFkIGFuZCBXcml0ZSBtZXRob2RzIHByaXZhdGUKKyAgICAqIFtUSFJJRlQtMzE0OV0gLSBNYWtlIFJlYWRGaWVsZE4gbWV0aG9kcyBpbiBnZW5lcmF0ZWQgR28gY29kZSBwcml2YXRlCisgICAgKiBbVEhSSUZULTMxNzJdIC0gQWRkIHR1dG9yaWFsIHRvIFRocmlmdCB3ZWIgc2l0ZQorICAgICogW1RIUklGVC0zMjE0XSAtIEFkZCBFcmxhbmcgb3B0aW9uIGZvciB1c2luZyBtYXBzIGluc3RlYWQgb2YgZGljdHMKKyAgICAqIFtUSFJJRlQtMzIwMV0gLSBDYXB0dXJlIGdpdGh1YiB0ZXN0IGFydGlmYWN0cyBmb3IgZmFpbGVkIGJ1aWxkcworICAgICogW1RIUklGVC0zMjY2XSAtIGNfZ2xpYjogTXVsdGlwbGUgY29tcGlsZXIgd2FybmluZ3MgYnVpbGRpbmcgdW5pdCB0ZXN0cworICAgICogW1RIUklGVC0zMjg1XSAtIGNfZ2xpYjogQnVpbGQgbGlicmFyeSB3aXRoIGFsbCB3YXJuaW5ncyBlbmFibGVkLCBubyB3YXJuaW5ncyBnZW5lcmF0ZWQKKyAgICAqIFtUSFJJRlQtMTk1NF0gLSBBbGxvdyBmb3IgYSBzZXBhcmF0ZSBjb25uZWN0aW9uIHRpbWVvdXQgdmFsdWUgCisgICAgKiBbVEhSSUZULTIwOThdIC0gQWRkIHN1cHBvcnQgZm9yIFF0NSsKKyAgICAqIFtUSFJJRlQtMjE5OV0gLSBSZW1vdmUgRGVuc2UgcHJvdG9jb2wgKHdhczogbW92ZSB0byBDb250cmliKQorICAgICogW1RIUklGVC00MDZdIC0gQysrIFRlc3Qgc3VpdGUgY2xlYW51cAorICAgICogW1RIUklGVC05MDJdIC0gc29ja2V0IGFuZCBjb25uZWN0IHRpbWVvdXQgaW4gVFNvY2tldCBzaG91bGQgYmUgZGlzdGluZ3Vpc2hlZAorICAgICogW1RIUklGVC0zODhdIC0gVXNlIGEgc2VwYXJhdGUgd2lyZSBmb3JtYXQgZm9yIGFzeW5jIGNhbGxzCisgICAgKiBbVEhSSUZULTcyN10gLSBzdXBwb3J0IG5hdGl2ZSBDKysgbGFuZ3VhZ2Ugc3BlY2lmaWMgZXhjZXB0aW9uIG1lc3NhZ2UKKyAgICAqIFtUSFJJRlQtMTc4NF0gLSBwZXAtMzExMCBjb21wbGlhbmNlIGZvciBleGNlcHRpb24gaGFuZGxpbmcgCisgICAgKiBbVEhSSUZULTEwMjVdIC0gQysrIFNlcnZlclNvY2tldCBzaG91bGQgaW5oZXJpdCBmcm9tIFNvY2tldCB3aXRoIHRoZSBuZWNlc3NhcnkgQ3RvciB0byBsaXN0ZW4gb24gY29ubmVjdGlvbnMgZnJvbSBhIHNwZWNpZmljIGhvc3QKKyAgICAqIFtUSFJJRlQtMjI2OV0gLSBDYW4gZGVwbG95IGxpYnRocmlmdC1zb3VyY2UuamFyIHRvIG1hdmVuIGNlbnRlciByZXBvc2l0b3J5CisgICAgKiBbVEhSSUZULTI4MDRdIC0gUHVsbCBhbiBpbnRlcmZhY2Ugb3V0IG9mIFRCYXNlQXN5bmNQcm9jZXNzb3IKKyAgICAqIFtUSFJJRlQtMjgwNl0gLSBtb3JlIHdoaXRlc3BhY2UgZml4dXBzCisgICAgKiBbVEhSSUZULTI4MTFdIC0gTWFrZSByZW1vdGUgc29ja2V0IGFkZHJlc3MgYWNjZXNzaWJsZQorICAgICogW1RIUklGVC0yODA5XSAtIC5naXRpZ25vcmUgdXBkYXRlIGZvciBjb21waWxlcidzIHZpc3VhbCBwcm9qZWN0CisgICAgKiBbVEhSSUZULTI4NDZdIC0gRXhwb3NlIGNpcGhlcnMgcGFyYW1ldGVyIGZyb20gc3NsLndyYXBfc29ja2V0KCkKKyAgICAqIFtUSFJJRlQtMjg1OV0gLSBKU09OIGdlbmVyYXRvcjogb3V0cHV0IGNvbXBsZXRlIGRlc2NyaXB0b3JzCisgICAgKiBbVEhSSUZULTI4NjFdIC0gYWRkIGJ1ZmZlcmVkIHRyYW5zcG9ydAorICAgICogW1RIUklGVC0yODY1XSAtIFRlc3QgY2FzZSBmb3IgR286IFNlcUlkIG91dCBvZiBzZXF1ZW5jZQorICAgICogW1RIUklGVC0yODY2XSAtIEdvIGdlbmVyYXRvciBzb3VyY2UgY29kZSBpcyBoYXJkIHRvIHJlYWQgYW5kIG1haW50YWluCisgICAgKiBbVEhSSUZULTI4ODBdIC0gUmVhZCB0aGUgbmV0d29yayBhZGRyZXNzIGZyb20gdGhlIGxpc3RlbmVyIGlmIGF2YWlsYWJsZS4KKyAgICAqIFtUSFJJRlQtMjg3NV0gLSBUeXBvIGluIFREZW5zZVByb3RvY29sLmggY29tbWVudAorICAgICogW1RIUklGVC0yODc0XSAtIFRCaW5hcnlQcm90b2NvbCAgbWVtYmVyIHZhcmlhYmxlICJzdHJpbmdfYnVmXyIgaXMgbmV2ZXIgdXNlZC4KKyAgICAqIFtUSFJJRlQtMjg1NV0gLSBNb3ZlIGNvbnRyaWJ1dGluZy5tZCB0byB0aGUgcm9vdCBvZiB0aGUgcmVwb3NpdG9yeQorICAgICogW1RIUklGVC0yODYyXSAtIEVuYWJsZSBSVFRJIGFuZC9vciBidWlsZCBtYWNyb3MgZm9yIGdlbmVyYXRlZCBjb2RlCisgICAgKiBbVEhSSUZULTI4NzZdIC0gIEFkZCB0ZXN0IGZvciBUSFJJRlQtMjUyNiBBc3NpZ25tZW50IG9wZXJhdG9ycyBhbmQgY29weSBjb25zdHJ1Y3RvcnMgaW4gYysrIGRvbid0IGNvcHkgdGhlIF9faXNzZXQgc3RydWN0CisgICAgKiBbVEhSSUZULTI4OTddIC0gR2VuZXJhdGUgLWlzRXF1YWw6IGFuZCAtaGFzaCBtZXRob2RzCisgICAgKiBbVEhSSUZULTI5MDldIC0gSW1wcm92ZSB0cmF2aXMgYnVpbGQKKyAgICAqIFtUSFJJRlQtMjkyMV0gLSBNYWtlIEVybGFuZyBpbXBsIHJlYWR5IGZvciBPVFAgMTggcmVsZWFzZSAoZGljdC8wIGFuZCBzZXQvMCBhcmUgZGVwcmVjYXRlZCkKKyAgICAqIFtUSFJJRlQtMjkyOF0gLSBSZW5hbWUgdGhlIGVybGFuZyB0ZXN0X3NlcnZlciBtb2R1bGUKKyAgICAqIFtUSFJJRlQtMjk0MF0gLSBBbGxvdyBpbnN0YWxsaW5nIFRocmlmdCBmcm9tIGdpdCBhcyBOUE0gbW9kdWxlIGJ5IHByb3ZpZGluZyBwYWNrYWdlLmpzb24gaW4gdG9wIGxldmVsIGRpcmVjdG9yeQorICAgICogW1RIUklGVC0yOTM3XSAtIEFsbG93IHNldHRpbmcgYSBtYXhpbXVtIGZyYW1lIHNpemUgaW4gVEZyYW1lZFRyYW5zcG9ydAorICAgICogW1RIUklGVC0yOTc2XSAtIG5vZGVqczogeGhyIGFuZCB3ZWJzb2NrZXQgc3VwcG9ydCBmb3IgYnJvd3NlcmlmeQorICAgICogW1RIUklGVC0yOTk2XSAtIFRlc3QgZm9yIEhheGUgMy4xLjMgb3IgYmV0dGVyIAorICAgICogW1RIUklGVC0yOTY5XSAtIG5vZGVqczogRFJZIHVwIGxpYnJhcnkgdGVzdHMKKyAgICAqIFtUSFJJRlQtMjk3M10gLSBVcGRhdGUgSGF4ZSBsaWIgcmVhZG1lIHJlZ2FyZGluZyBIYXhlIDMuMS4zCisgICAgKiBbVEhSSUZULTI5NTJdIC0gSW1wcm92ZSBoYW5kbGluZyBvZiBTZXJ2ZXIuU3RvcCgpIAorICAgICogW1RIUklGVC0yOTY0XSAtIG5vZGVqczogbW92ZSBwcm90b2NvbHMgYW5kIHRyYW5zcG9ydHMgaW50byBzZXBhcmF0ZSBmaWxlcworICAgICogW1RIUklGVC0yOTYzXSAtIG5vZGVqcyAtIGFkZCB0ZXN0IGNvdmVyYWdlCisgICAgKiBbVEhSSUZULTMwMDZdIC0gQXR0YWNoICdvbWl0ZW1wdHknIGpzb24gdGFnIGZvciBvcHRpb25hbCBmaWVsZHMgaW4gR28KKyAgICAqIFtUSFJJRlQtMzAyN10gLSBHbyBjb21waWxlciBkb2VzIG5vdCBlbnN1cmUgY29tbW9uIGluaXRpYWxpc21zIGhhdmUgY29uc2lzdGVudCBjYXNlCisgICAgKiBbVEhSSUZULTMwMzBdIC0gVFRocmVhZGVkU2VydmVyOiBQcm9wZXJ0eSBmb3IgbnVtYmVyIG9mIGNsaWVudFRocmVhZHMKKyAgICAqIFtUSFJJRlQtMzAyM10gLSBHbyBjb21waWxlciBpcyBhIGxpdHRsZSBvdmVybHkgY29uc2VydmF0aXZlIHdpdGggbmFtZXMgb2YgYXR0cmlidXRlcworICAgICogW1RIUklGVC0zMDE4XSAtIENvbXBhY3QgcHJvdG9jb2wgZm9yIERlbHBoaQorICAgICogW1RIUklGVC0zMDI1XSAtIENoYW5nZSBwdXJlIEludCBjb25zdGFudHMgaW50byBAZW51bXMgKHdoZXJlIHBvc3NpYmxlKQorICAgICogW1RIUklGVC0zMDMxXSAtIG1pZ3JhdGUgInNob3VsZFN0b3AiIGZsYWcgdG8gVFNlcnZlcgorICAgICogW1RIUklGVC0zMDIyXSAtIENvbXBhY3QgcHJvdG9jb2wgZm9yIEhheGUKKyAgICAqIFtUSFJJRlQtMzA0MV0gLSBHZW5lcmF0ZSBhc3luY2hyb25vdXMgY2xpZW50cyBmb3IgQ29jb2EKKyAgICAqIFtUSFJJRlQtMzA1M10gLSBQZXJsIFNTTCBTb2NrZXQgU3VwcG9ydCAoRW5jcnlwdGlvbikKKyAgICAqIFtUSFJJRlQtMzI0N10gLSBHZW5lcmF0ZSBhIEMrKyB0aHJlYWQtc2FmZSBjbGllbnQKKyAgICAqIFtUSFJJRlQtMzIxN10gLSBQcm92aWRlIGEgbGl0dGxlIGVuZGlhbiB2YXJpYW50IG9mIHRoZSBiaW5hcnkgcHJvdG9jb2wgaW4gQysrCisgICAgKiBbVEhSSUZULTMyMjNdIC0gVHlwZVNjcmlwdDogQWRkIGluaXRpYWwgc3VwcG9ydCBmb3IgRW51bSBNYXBzCisgICAgKiBbVEhSSUZULTMyMjBdIC0gT3B0aW9uIHRvIHN1cHByZXNzIEBHZW5lcmF0ZWQgQW5ub3RhdGlvbiBlbnRpcmVseQorICAgICogW1RIUklGVC0zMzAwXSAtIFJlaW1wbGVtZW50IFRabGliVHJhbnNwb3J0IGluIEphdmEgdXNpbmcgc3RyZWFtcworICAgICogW1RIUklGVC0zMjg4XSAtIGNfZ2xpYjogQnVpbGQgdW5pdCB0ZXN0cyB3aXRoIGFsbCB3YXJuaW5ncyBlbmFibGVkLCBubyB3YXJuaW5ncyBnZW5lcmF0ZWQKKyAgICAqIFtUSFJJRlQtMzM0N10gLSBJbXByb3ZlIGNyb3NzIHRlc3Qgc2VydmVycyBhbmQgY2xpZW50cworICAgICogW1RIUklGVC0zMzQyXSAtIEltcHJvdmUgcnVieSBjcm9zcyB0ZXN0IGNsaWVudCBhbmQgc2VydmVyIGNvbXBhdGliaWxpdHkKKyAgICAqIFtUSFJJRlQtMjI5Nl0gLSBBZGQgQysrIEJhc2UgY2xhc3MgZm9yIHNlcnZpY2UKKyAgICAqIFtUSFJJRlQtMzMzN10gLSBBZGQgdGVzdEJvb2wgbWV0aG9kIHRvIGNyb3NzIHRlc3RzCisgICAgKiBbVEhSSUZULTMzMDNdIC0gRGlzYWJsZSBjb25jdXJyZW50IGNhYmFsIGpvYnMgb24gVHJhdmlzIHRvIGF2b2lkIEdIQyBjcmFzaAorICAgICogW1RIUklGVC0yNjIzXSAtIERvY2tlciBjb250YWluZXIgZm9yIFRocmlmdAorICAgICogW1RIUklGVC0zMjk4XSAtIHRocmlmdCBlbmRpYW4gY29udmVydGVycyBtYXkgY29uZmxpY3Qgd2l0aCBvdGhlciBsaWJyYXJpZXMKKyAgICAqIFtUSFJJRlQtMTU1OV0gLSBQcm92aWRlIG1lbW9yeSBwb29sIGZvciBUQmluYXJ5UHJvdG9jb2wgdG8gZWxpbWluYXRlIG1lbW9yeSBmcmFnbWVudGF0aW9uCisgICAgKiBbVEhSSUZULTQyNF0gLSBTdGVhbCBQcm90b2NvbEJ1ZmZlcnMnIFZhckludCBpbXBsZW1lbnRhdGlvbiBmb3IgQysrCisKKyMjIE5ldyBGZWF0dXJlCisgICAgKiBbVEhSSUZULTMwNzBdIC0gQWRkIGFiaWxpdHkgdG8gc2V0IHRoZSBMb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sKKyAgICAqIFtUSFJJRlQtMTkwOV0gLSBKYXZhOiBBZGQgY29tcGlsZXIgZmxhZyB0byB1c2UgdGhlICJvcHRpb24gcGF0dGVybiIgZm9yIG9wdGlvbmFsIGZpZWxkcworICAgICogW1RIUklGVC0yMDk5XSAtIFN0b3AgVFRocmVhZFBvb2xTZXJ2ZXIgd2l0aCBhbGl2ZSBjb25uZWN0aW9ucy4KKyAgICAqIFtUSFJJRlQtMTIzXSAtIGltcGxlbWVudCBUWmxpYlRyYW5zcG9ydCBpbiBKYXZhCisgICAgKiBbVEhSSUZULTIzNjhdIC0gTmV3IG9wdGlvbjogcmV1c2Utb2JqZWN0cyBmb3IgSmF2YSBnZW5lcmF0b3IKKyAgICAqIFtUSFJJRlQtMjgzNl0gLSBPcHRpb25hbGx5IGdlbmVyYXRlIEMrKzExIE1vdmVDb25zdHJ1Y3RpYmxlIHR5cGVzCisgICAgKiBbVEhSSUZULTI4MjRdIC0gRmxhZyB0byBkaXNhYmxlIGh0bWwgZXNjYXBpbmcgZG9jdGV4dAorICAgICogW1RIUklGVC0yODE5XSAtIEFkZCBXZWJzU29ja2V0IGNsaWVudCB0byBub2RlLmpzCisgICAgKiBbVEhSSUZULTMwNTBdIC0gQ2xpZW50IGNlcnRpZmljYXRlIGF1dGhlbnRpY2F0aW9uIGZvciBub24taHR0cCBUTFMgaW4gQyMKKyAgICAqIFtUSFJJRlQtMzI5Ml0gLSBJbXBsZW1lbnQgVFpsaWJUcmFuc3BvcnQgaW4gR28KKworIyMgUXVlc3Rpb24KKyAgICAqIFtUSFJJRlQtMjU4M10gLSBUaHJpZnQgb24geFBDIHRhcmdldCAoU3BlZWRHb2F0KQorICAgICogW1RIUklGVC0yNTkyXSAtIHRocmlmdCBzZXJ2ZXIgdXNpbmcgY19nbGliCisgICAgKiBbVEhSSUZULTI4MzJdIC0gY19nbGliOiBIYW5kbGUgc3RyaW5nIGxpc3RzIGNvcnJlY3RseQorICAgICogW1RIUklGVC0zMTM2XSAtIHRocmlmdCBpbnN0YWxsYXRpb24gcHJvYmxlbSBvbiBtYWMKKyAgICAqIFtUSFJJRlQtMzM0Nl0gLSBjX2dsaWI6IFR1dG9yaWFscyBleGFtcGxlIGNyYXNoZXMgc2F5aW5nIENhbGN1bGF0b3IucGluZyBpbXBsZW1lbnRhdGlvbiByZXR1cm5lZCBGQUxTRSBidXQgZGlkIG5vdCBzZXQgYW4gZXJyb3IKKworIyMgU3ViLXRhc2sKKyAgICAqIFtUSFJJRlQtMjU3OF0gLSBNb3ZpbmcgJ21ha2UgY3Jvc3MnIGZyb20gdGVzdC5zaCB0byB0ZXN0LnB5CisgICAgKiBbVEhSSUZULTI3MzRdIC0gR28gY29kaW5nIHN0YW5kYXJkcworICAgICogW1RIUklGVC0yNzQ4XSAtIEFkZCBWYWdyYW50ZmlsZSBmb3IgQ2VudG9zIDYuNQorICAgICogW1RIUklGVC0yNzUzXSAtIE1pc2MuIEhheGUgaW1wcm92ZW1lbnRzCisgICAgKiBbVEhSSUZULTI2NDBdIC0gQ29tcGFjdCBQcm90b2NvbCBpbiBDb2NvYQorICAgICogW1RIUklGVC0zMjYyXSAtIHdhcm5pbmc6IG92ZXJmbG93IGluIGltcGxpY2l0IGNvbnN0YW50IGNvbnZlcnNpb24gaW4gRGVuc2VQcm90b1Rlc3QuY3BwCisgICAgKiBbVEhSSUZULTMxOTRdIC0gQ2FuJ3QgYnVpbGQgd2l0aCBnbyBlbmFibGVkLiAgZ29tb2NrIFNDQyBwYXRoIGluY29ycmVjdC4KKyAgICAqIFtUSFJJRlQtMzI3NV0gLSBjX2dsaWIgdHV0b3JpYWwgd2FybmluZ3MgaW4gZ2VuZXJhdGVkIGNvZGUKKyAgICAqIFtUSFJJRlQtMTEyNV0gLSBNdWx0aXBsZXhpbmcgc3VwcG9ydCBmb3IgdGhlIFJ1YnkgTGlicmFyeQorICAgICogW1RIUklGVC0yODA3XSAtIFBIUCBDb2RlIFN0eWxlCisgICAgKiBbVEhSSUZULTI4NDFdIC0gQWRkIGNvbXByZWhlbnNpdmUgaW50ZWdyYXRpb24gdGVzdHMgZm9yIHRoZSB3aG9sZSBHbyBzdGFjaworICAgICogW1RIUklGVC0yODE1XSAtIEhheGU6IFN1cHBvcnQgZm9yIE11bHRpcGxleGluZyBTZXJ2aWNlcyBvbiBhbnkgVHJhbnNwb3J0LCBQcm90b2NvbCBhbmQgU2VydmVyCisgICAgKiBbVEhSSUZULTI4ODZdIC0gSW50ZWdyYXRlIGJpbmFyeSB0eXBlIGluIHN0YW5kYXJkIFRocmlmdCBjcm9zcyB0ZXN0CisgICAgKiBbVEhSSUZULTI5NDZdIC0gRW5oYW5jZSB1c2FiaWxpdHkgb2YgY3Jvc3MgdGVzdCBmcmFtZXdvcmsKKyAgICAqIFtUSFJJRlQtMjk2N10gLSBBZGQgLmVkaXRvcmNvbmZpZyB0byByb290CisgICAgKiBbVEhSSUZULTMwMzNdIC0gUGVybDogU3VwcG9ydCBmb3IgTXVsdGlwbGV4aW5nIFNlcnZpY2VzIG9uIGFueSBUcmFuc3BvcnQsIFByb3RvY29sIGFuZCBTZXJ2ZXIKKyAgICAqIFtUSFJJRlQtMzE3NF0gLSBJbml0aWFsaXNtIGNvZGUgaW4gdGhlIEdvIGNvbXBpbGVyIGRvZXNuJ3QgY2hlY2sgZmlyc3Qgd29yZAorICAgICogW1RIUklGVC0zMTkzXSAtIE9wdGlvbiB0byBzdXByZXNzIGRhdGUgdmFsdWUgaW4gQEdlbmVyYXRlZCBhbm5vdGF0aW9uCisgICAgKiBbVEhSSUZULTMzMDVdIC0gTWlzc2luZyBkaXN0IGZpbGVzIGZvciAwLjkuMyByZWxlYXNlIGNhbmRpZGF0ZQorICAgICogW1RIUklGVC0zMzQxXSAtIEFkZCB0ZXN0Qm9vbCBtZXRob2RzCisgICAgKiBbVEhSSUZULTMzMDhdIC0gRml4IGJyb2tlbiB0ZXN0IGNhc2VzIGZvciAwLjkuMyByZWxlYXNlIGNhbmRpZGF0ZQorCisjIyBUYXNrCisgICAgKiBbVEhSSUZULTI4MzRdIC0gUmVtb3ZlIHNlbWktY29sb25zIGZyb20gcHl0aG9uIGNvZGUgZ2VuZXJhdG9yCisgICAgKiBbVEhSSUZULTI4NTNdIC0gQWRqdXN0IGNvbW1lbnRzIG5vdCBhcHBseWluZyBhbnltb3JlIGFmdGVyIFRIUklGVC0yODUyCisKKyMjIFRlc3QKKyAgICAqIFtUSFJJRlQtMzIxMV0gLSBBZGQgbWFrZSBjcm9zcyBzdXBwb3J0IGZvciBwaHAgVENvbXBhY3RQcm90b2NvbAorCisjIyBXaXNoCisgICAgKiBbVEhSSUZULTI4MzhdIC0gVE5vbmJsb2NraW5nU2VydmVyIGNhbiBiaW5kIHRvIHBvcnQgMCAoaS5lLiwgZ2V0IGFuIE9TLWFzc2lnbmVkIHBvcnQpIGJ1dCB0aGVyZSBpcyBubyB3YXkgdG8gZ2V0IHRoZSBwb3J0IG51bWJlcgorCisKKwogVGhyaWZ0IDAuOS4yCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIyMgQnVnCi0gICAgKiBbVEhSSUZULTI2NDVdIC0gZ2VuZXJhdGVkIEdvIHNlcnZlciBjb2RlIGFsd2F5cyBzZXRzIFN1Y2Nlc3MgcmV0dmFsCi0gICAgKiBbVEhSSUZULTI2MzRdIC0gdW5kb2N1bWVudGVkIHBocCAibnNnbG9iYWwiIG9wdGlvbgotICAgICogW1RIUklGVC0yNjI3XSAtIGVybGFuZyBiYWNrZW5kIGRvZXNuJ3Qgc3VwcG9ydCBjb3JlY3Vyc2l2ZSBzdHJ1Y3RzCi0gICAgKiBbVEhSSUZULTI1OTVdIC0gTm9kZS5qczogRml4IGdsb2JhbCBsZWFrcyBhbmQgY29weS1wYXN0ZSBlcnJvcnMKLSAgICAqIFtUSFJJRlQtMjU5NF0gLSBKUyBDb21waWxlcjogU2luZ2xlIHF1b3RlcyBhcmUgbm90IGJlaW5nIGVzY2FwZWQgaW4gY29uc3RhbnRzLgotICAgICogW1RIUklGVC0yNjEwXSAtIE1TVkMgd2FybmluZyBpbiBUU29ja2V0LmNwcAotICAgICogW1RIUklGVC0yNjA3XSAtIFRocmVhZE1hbmFnZXIuY3BwIHdhcm5pbmcgb24gY2xhbmcrKyAzLjQKLSAgICAqIFtUSFJJRlQtMjYwOV0gLSBURmlsZVRyYW5zcG9ydC5oIHVudXNlZCBmaWVsZCB3YXJuaW5nIChjbGFuZyAzLjQpCi0gICAgKiBbVEhSSUZULTI2MDhdIC0gVE5vbmJsb2NraW5nU2VydmVyLmNwcCB3YXJuaW5ncyBvbiBjbGFuZyAzLjQKLSAgICAqIFtUSFJJRlQtMjYwNl0gLSBUaHJlYWRNYW5hZ2VyLmggd2FybmluZyBpbiBjbGFuZysrIDMuNAotICAgICogW1RIUklGVC0yNjA1XSAtIFRTb2NrZXQgd2FybmluZyBvbiBnY2MgNC44LjMKLSAgICAqIFtUSFJJRlQtMjYwNF0gLSBGaXggZGViaWFuIHBhY2thZ2luZwotICAgICogW1RIUklGVC0yNjAxXSAtIEZpeCB2YWdyYW50IHRvIHdvcmsgYWdhaW4gZm9yIGJ1aWxkcyBhZ2FpbgotICAgICogW1RIUklGVC0yNTk5XSAtIFVuY29tcGlsZWFibGUgRGVscGhpIGNvZGUgZHVlIHRvIG5hbWluZyBjb25mbGljdHMgd2l0aCBJREwKLSAgICAqIFtUSFJJRlQtMjYyMl0gLSBFeHBlY3RpbmcgPiA0IGJ5dGVzLCBmb3VuZCBvbmx5IDIKLSAgICAqIFtUSFJJRlQtMjYyMF0gLSBGaXggcHl0aG9uIHBhY2thZ2luZwotICAgICogW1RIUklGVC0yNjE5XSAtIEdvIGxpYiBodHRwIHRyYW5zcG9ydCBkb2VzIG5vdCBoYW5kbGUgRU9GIGNvcnJlY3RseQotICAgICogW1RIUklGVC0yNjE4XSAtIFVuaWdub3JlIC9hY2xvY2FsIGZpbGVzIHJlcXVpcmVkIGZvciBidWlsZAotICAgICogW1RIUklGVC0yNjE0XSAtIFROb25ibG9ja2luZ1NlcnZlci5jcHAgd2FybmluZ3Mgb24gTVNWQwotICAgICogW1RIUklGVC0yNTkxXSAtIFRGcmFtZWRUcmFuc3BvcnQgZG9lcyBub3QgaGFuZGxlIHBheWxvYWRzIHNwbGl0IGFjcm9zcyBwYWNrZXRzIGNvcnJlY3RseQotICAgICogW1RIUklGVC0yNjc5XSAtIGdvbGFuZyBnZW5lcmF0aW9uIGZhaWxzIGZvciBzZXJ2aWNlIG5hbWVzIGxlc3MgdGhhbiA1IGNoYXJhY3RlcnMKLSAgICAqIFtUSFJJRlQtMjY2Nl0gLSBVc2FnZSBvZiBQWVRIT05IQVNIU0VFRCBicmVha3Mgb2xkZXIgUHl0aG9uIGNvZGUKLSAgICAqIFtUSFJJRlQtMjU4NF0gLSBFcnJvciBoYW5kbGVyIG5vdCBsaXN0ZW5lZCBvbiBqYXZhc2NyaXB0IGNsaWVudAotICAgICogW1RIUklGVC0yNTgyXSAtICJGaWxlVHJhbnNwb3J0IGVycm9yIiBleGNlcHRpb24gaXMgcmFpc2VkIHdoZW4gdHJ5aW5nIHRvIHVzZSBKYXZhJ3MgVEZpbGVUcmFuc3BvcnQKLSAgICAqIFtUSFJJRlQtMjU4MV0gLSBURkRUcmFuc3BvcnQgZGVzdHJ1Y3RvciBzaG91bGQgbm90IHRocm93Ci0gICAgKiBbVEhSSUZULTI1ODhdIC0gVGhyaWZ0IGNvbXBpbGVyIGlzIG5vdCBidWlsZGFibGUgaW4gVmlzdWFsIFN0dWRpbyAyMDEwCi0gICAgKiBbVEhSSUZULTI1NzddIC0gVEZpbGVUcmFuc3BvcnQgIG1pc3N1c2Ugb2YgY2xvc2Vzb2NrZXQgb24gd2luZG93cyBwbGF0Zm9ybQotICAgICogW1RIUklGVC0yNTc2XSAtIEltcGxlbWVudCBUaHJpZnQuUHJvdG9jb2wucHJvdG90eXBlLnNraXAgbWV0aG9kIGluIEphdmFTY3JpcHQgbGlicmFyeQotICAgICogW1RIUklGVC0yNTc1XSAtIFRocmlmdCBpbmNsdWRlcyBzaWdpbmZvX3Qgd2l0aGluIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbCBuYW1lc3BhY2UKLSAgICAqIFtUSFJJRlQtMjU3MF0gLSBXcm9uZyBVUkwgZ2l2ZW4gaW4gaHR0cDovL3RocmlmdC5hcGFjaGUub3JnL2RldmVsb3BlcnMKLSAgICAqIFtUSFJJRlQtMjU1OV0gLSBDZW50b3MgNi41IHVuYWJsZSB0byAibWFrZSIgd2l0aCBUaHJpZnQgMC45LjEKLSAgICAqIFtUSFJJRlQtMjU2NV0gLSBhdXRvY29uZiBmYWlscyB0byBmaW5kIG1pbmd3LWcrKyBjcm9zcyBjb21waWxlciBvbiB0cmF2aXMgQ0kKLSAgICAqIFtUSFJJRlQtMjU1NV0gLSBleGNlc3NpdmUgInVudXNlZCBmaWVsZCIgY29tbWVudHMKLSAgICAqIFtUSFJJRlQtMjU1NF0gLSBkb3VibGUgaW5pdGlhbGl6YXRpb24gaW4gZ2VuZXJhdGVkIFJlYWQoKSBtZXRob2QKLSAgICAqIFtUSFJJRlQtMjU2Ml0gLSAuL2NvbmZpZ3VyZSBjcmVhdGUgTWFrZUZpbGUgaW4gbGliL2Qgd2l0aCBlcnJvcnMKLSAgICAqIFtUSFJJRlQtMjU2MF0gLSBUaHJpZnQgY29tcGlsZXIgZ2VuZXJhdG9yIHRyaWVzIHRvIGNvbmNhdCBpbnRzIHdpdGggc3RyaW5ncyB1c2luZyArCi0gICAgKiBbVEhSSUZULTI1NDVdIC0gVGVzdCBDUFAgZmFpbHMgdG8gYnVpbGQgKHBvc3NpYmx5IHR5cG8pCi0gICAgKiBbVEhSSUZULTI1MzddIC0gUGF0aCBmb3IgImdvIGdldCIgZG9lcyBub3Qgd29yayAocHVsbCByZXF1ZXN0IDExNSkKLSAgICAqIFtUSFJJRlQtMjU1MV0gLSBPdXRPZk1lbW9yeUVycm9yICJ1bmFibGUgdG8gY3JlYXRlIG5ldyBuYXRpdmUgdGhyZWFkIiBraWxscyBzZXJ2ZSB0aHJlYWQKLSAgICAqIFtUSFJJRlQtMjUxNV0gLSBUTFMgTWV0aG9kIGVycm9yIGR1cmluZyBtYWtlCi0gICAgKiBbVEhSSUZULTI1MDhdIC0gVW5jb21waWxlYWJsZSBDIyBjb2RlIGR1ZSB0byBsYW5ndWFnZSBrZXl3b3JkcyBpbiBJREwKLSAgICAqIFtUSFJJRlQtMjU1N10gLSBDUzA1NDIgbWVtYmVyIG5hbWVzIGNhbm5vdCBiZSB0aGUgc2FtZSBhcyB0aGVpciBlbmNsb3NpbmcgdHlwZQotICAgICogW1RIUklGVC0yNTA2XSAtIFVwZGF0ZSBUUHJvdG9jb2xFeGNlcHRpb24gZXJyb3IgY29kZXMgdG8gYmUgdXNlZCBjb25zaXN0ZW50bHkgdGhyb3VnaG91dCB0aGUgbGlicmFyeQotICAgICogW1RIUklGVC0yNTA1XSAtIGdvOiBzdHJ1Y3Qgc2hvdWxkIGFsd2F5cyBiZSBhIHBvaW50ZXIgdG8gYXZvaWQgY29weWluZyBvZiBwb3RlbnRpYWxseSBzaXplLXVuYm91bmRlZCBzdHJ1Y3RzCi0gICAgKiBbVEhSSUZULTI1MjNdIC0gVmlzdWFsIFN0dWRpbyBwcm9qZWN0IGlzIG1pc3NpbmcgT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQgZmlsZXMKLSAgICAqIFtUSFJJRlQtMjUyOF0gLSBUaHJpZnQgRXJsYW5nIExpYnJhcnk6IE11bHRpcGxlIHRocmlmdCBhcHBsaWNhdGlvbnMgaW4gb25lIGJ1bmRsZQotICAgICogW1RIUklGVC0yNTMzXSAtIEJvb3N0IHZlcnNpb24gaW4gcmVxdWlyZW1lbnRzIHNob3VsZCBiZSB1cGRhdGVkCi0gICAgKiBbVEhSSUZULTI1MzJdIC0gSmF2YSB2ZXJzaW9uIGluIGluc3RhbGxhdGlvbiByZXF1aXJlbWVudHMgc2hvdWxkIGJlIHVwZGF0ZWQKLSAgICAqIFtUSFJJRlQtMjUyOV0gLSBUQnVmZmVyZWRUcmFuc3BvcnQgc3BsaXQgIFRjcCBkYXRhIGJ1ZyBpbiBub2RlSnMKLSAgICAqIFtUSFJJRlQtMjUyNF0gLSBWaXN1YWwgU3R1ZGlvIHByb2plY3QgaXMgbWlzc2luZyBUVGhyZWFkZWRTZXJ2ZXIgZmlsZXMKLSAgICAqIFtUSFJJRlQtMjUyMF0gLSBjcHA6Y29iX3N0eWxlIGdlbmVyYXRlcyBpbmNvcnJlY3QgLnRjYyBmaWxlCi0gICAgKiBbVEhSSUZULTI1OTBdIC0gQysrIFZpc3VhbCBTdHVkaW8gc29sdXRpb24gZG9lc24ndCBpbmNsdWRlIE11bHRpcGxleGluZyBzdXBwb3J0Ci0gICAgKiBbVEhSSUZULTI0OTJdIC0gdGVzdC9jcHAgZG9lcyBub3QgY29tcGlsZSBvbiBtYWMKLSAgICAqIFtUSFJJRlQtMjQ5MV0gLSB1bmFibGUgdG8gaW1wb3J0IGdlbmVyYXRlZCBUaHJpZnRUZXN0IHNlcnZpY2UKLSAgICAqIFtUSFJJRlQtMjQ5MF0gLSBjX2dsaWI6IGlmIGZhaWwgdG8gcmVhZCBhIGV4Y2VwdGlvbiBmcm9tIHNlcnZlciwgY2xpZW50IG1heSBiZSBvY2N1cnJlZCBkb3VibGUgZnJlZQotICAgICogW1RIUklGVC0yNDg5XSAtIFBlZXIgaG9zdCBuYW1lIG5vdCBwcm92aWVkIHdoZW4gcGVyZm9ybWluZyBBY2Nlc3NNYW5hZ2VyIGNvbW1vbiBuYW1lIHZlcmlmaWNhdGlvbi4KLSAgICAqIFtUSFJJRlQtMjQ4N10gLSBUdXRvcmlhbCByZXF1aXJlcyB0d28gSURMIGZpbGVzIGJ1dCBvbmx5IG9uZSBpcyBsaW5rZWQgZnJvbSB0aGUgVGhyaWZ0IHdlYiBzaXRlCi0gICAgKiBbVEhSSUZULTI0NzddIC0gdGhyaWZ0IC0taGVscCB0ZXh0IHdpdGggbWlzcGxhY2VkIGNvbW1hCi0gICAgKiBbVEhSSUZULTIzNDBdIC0gR2VuZXJhdGVkIHNlcnZlciBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBzZW5kIHJlc3BvbnNlIHR5cGUgRVhDRVBUSU9OIG9uIHRoZSBUaHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uVHlwZS5VTktOT1dOX01FVEhPRCBleGNlcHRpb24KLSAgICAqIFtUSFJJRlQtMjMzN10gLSBHb2xhbmcgZG9lcyBub3QgcmVwb3J0IFRJTUVEX09VVCBleGNlcHRpb25zCi0gICAgKiBbVEhSSUZULTIzMzFdIC0gTWlzc2luZyBjYWxsIHRvIFJlYWRTdHJ1Y3RCZWdpbigpIGluIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5SZWFkKCkKLSAgICAqIFtUSFJJRlQtMjMyOV0gLSBtaXNzaW5nIHJlbGVhc2UgdGFncyB3aXRoaW4gZ2l0Ci0gICAgKiBbVEhSSUZULTIzMjNdIC0gVW5jb21waWxlYWJsZSBEZWxwaGkgY29kZSBnZW5lcmF0ZWQgZm9yIHR5cGVkZWYnZCBzdHJ1Y3RzCi0gICAgKiBbVEhSSUZULTIzMjJdIC0gQ29ycmVjdGx5IHNob3cgdGhlIG51bWJlciBvZiB0aW1lcyBFeGVjdXRvclNlcnZpY2UgKGphdmEpIGhhcyByZWplY3RlZCB0aGUgY2xpZW50LgotICAgICogW1RIUklGVC0yMzE2XSAtIGNjcDogVEZpbGVUcmFuc3BvcnRUZXN0Ci0gICAgKiBbVEhSSUZULTIzMTNdIC0gbm9kZWpzIHNlcnZlciBjcmFzaCBhZnRlciBwcm9jZXNzaW5nIHRoZSBmaXJzdCByZXF1ZXN0IHdoZW4gdXNpbmcgTXVsdGlwbGV4ZWRQcm9jZXNzb3IvRnJhbWVkQnVmZmVyL0JpbmFyeVByb3RvY29sCi0gICAgKiBbVEhSSUZULTIzMTFdIC0gR286IGludmFsaWQgY29kZSBnZW5lcmF0ZWQgd2hlbiBleGNlcHRpb24gbmFtZSBpcyBhIGdvIGtleXdvcmQKLSAgICAqIFtUSFJJRlQtMjM2N10gLSBCdWlsZCBmYWlsdXJlOiBzdGRsaWIgYW5kIGJvb3N0IGJvdGggZGVmaW5lIHVpbnQ2NF90Ci0gICAgKiBbVEhSSUZULTIzNjVdIC0gQyMgZGVjb2RlcyB0b28gbWFueSBiaW5hcnkgYnl0ZXMgZnJvbSBKU09OCi0gICAgKiBbVEhSSUZULTIzNjNdIC0gSXNzdWUgd2l0aCBjaGFyYWN0ZXIgZW5jb2Rpbmcgb2YgU3VjY2VzcyByZXR1cm5lZCBmcm9tIExvZ2luIHVzaW5nIFRocmlmdCBQcm94eSBhbmQgTm9kZUpTCi0gICAgKiBbVEhSSUZULTIzNTldIC0gVEJ1ZmZlcmVkVHJhbnNwb3J0IGRvZXNuJ3QgY2xlYXIgaXQncyBidWZmZXIgb24gYSBmYWlsZWQgZmx1c2ggY2FsbAotICAgICogW1RIUklGVC0yMzU3XSAtIHJlY3Vyc2Ugb3B0aW9uIGhhcyBubyBlZmZlY3Qgd2hlbiBnZW5lcmF0aW5nIHBocAotICAgICogW1RIUklGVC0yMzU2XSAtIGMrKyB0aHJpZnQgY2xpZW50IG5vdCB3b3JraW5nIHdpdGggc3NsIChTU0xfY29ubmVjdCBoYW5ncykKLSAgICAqIFtUSFJJRlQtMjM1NF0gLSBDb25uZWN0aW9uIGVycm9ycyBjYW4gbGVhZCB0byBjYXNlX2NsYXVzZSBleGNlcHRpb25zCi0gICAgKiBbVEhSSUZULTIzNTJdIC0gbXN2YyBmYWlsZWQgdG8gY29tcGlsZSB0aHJpZnQgdGVzdHMKLSAgICAqIFtUSFJJRlQtMjM1MV0gLSBQSFAgVENvbXBhY3RQcm90b2NvbCBoYXMgZmFpbHMgdG8gZGVjb2RlIG1lc3NhZ2VzCi0gICAgKiBbVEhSSUZULTIzMDhdIC0gbm9kZTogVEpTT05Qcm90b2NvbCBwYXJzZSBlcnJvciB3aGVuIHJlYWRpbmcgZnJvbSBidWZmZXJlZCBtZXNzYWdlCi0gICAgKiBbVEhSSUZULTIzMDZdIC0gY29uY3VyZW50IGNsaWVudCBjYWxscyB3aXRoIG5vZGVqcwotICAgICogW1RIUklGVC0yMzAzXSAtIFRCdWZmZXJyZWRUcmFuc3BvcnQgbm90IHByb3Blcmx5IGNsb3NpbmcgdW5kZXJseWluZyB0cmFuc3BvcnQKLSAgICAqIFtUSFJJRlQtMjI4NV0gLSBUSnNvblByb3RvY29sIGltcGxlbWVudGF0aW9uIGZvciBKYXZhIGRvZXNuJ3QgYWxsb3cgYSBzbGFzaCAoLykgdG8gYmUgZXNjYXBlZCAoXC8pCi0gICAgKiBbVEhSSUZULTIyODJdIC0gSW5jb3JlY3QgY29kZSBnZW5lcmF0ZWQgZm9yIHNvbWUgdHlwZWRlZnMKLSAgICAqIFtUSFJJRlQtMjI4MF0gLSBUSlNPTlByb3RvY29sLkZsdXNoKCkgZG9lcyBub3QgcmVhbGx5IGZsdXNoIHRoZSB0cmFuc3BvcnQKLSAgICAqIFtUSFJJRlQtMjI4MV0gLSBHZW5lcmF0ZWQgc2VuZC9yZWN2IGNvZGUgaWdub3JlcyBlcnJvcnMgcmV0dXJuZWQgYnkgdGhlIHVuZGVybHlpbmcgcHJvdG9jb2wKLSAgICAqIFtUSFJJRlQtMjI3OV0gLSBUU2VyaWFsaXplciBvbmx5IHJldHVybnMgdGhlIGZpcnN0IDEwMjQgYnl0ZXMgc2VyaWFsaXplZAotICAgICogW1RIUklGVC0yMjc4XSAtIEJ1ZmZlcmVkIHRyYW5zcG9ydCBkb2Vzbid0IHN1cHBvcnQgd3JpdGVzID4gYnVmZmVyIHNpemUKKyAgICAqIFtUSFJJRlQtMjc5M10gLSBHbyBjb21waWxlciBwcm9kdWNlcyB1bmNvbXBpbGFibGUgY29kZQorICAgICogW1RIUklGVC0xNDgxXSAtIFVuaXggZG9tYWluIHNvY2tldHMgaW4gQysrIGRvIG5vdCBzdXBwb3J0IHRoZSBhYnN0cmFjdCBuYW1lc3BhY2UKKyAgICAqIFtUSFJJRlQtMTQ1NV0gLSBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8+Ojp3cml0ZVN0cmluZyBjYXN0cyBmcm9tIHNpemVfdCB0byB1aW50MzJfdCwgd2hpY2ggaXMgbm90IHNhZmUgb24gNjQtYml0IHBsYXRmb3JtcworICAgICogW1RIUklGVC0xNTc5XSAtIFBIUCBFeHRlbnRpb24gLSBmdW5jdGlvbiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9iaW5hcnkgbm90IHdvcmtpbmcgZnJvbSBUQmluYXJ5U2VyaWFsaXplcjo6ZGVzZXJpYWxpemUKKyAgICAqIFtUSFJJRlQtMTU4NF0gLSBFcnJvcjogY291bGQgbm90IFNldE1pblRocmVhZHMgaW4gVGhyZWFkUG9vbCBvbiBzaW5nbGUtY29yZSBtYWNoaW5lcworICAgICogW1RIUklGVC0xNjE0XSAtIFRocmlmdCBidWlsZCBmcm9tIHN2biByZXBvIHNvdXJjZXMgZmFpbHMgd2l0aCBhdXRvbWFrZS0xLjEyCisgICAgKiBbVEhSSUZULTEwNDddIC0gcmJfdGhyaWZ0X21lbW9yeV9idWZmZXJfd3JpdGUgdHJlYXRzIGFyZyBhcyBzdHJpbmcgd2l0aG91dCBjaGVjaywgc2VnZmF1bHRzIGlmIHlvdSBwYXNzIG5vbi1zdHJpbmcKKyAgICAqIFtUSFJJRlQtMTYzOV0gLSBKYXZhL1B5dGhvbjogU2VyaWFsaXphdGlvbi9EZXNlcmlhbGl6YXRpb24gb2YgZG91YmxlIHR5cGUgdXNpbmcgQ29tcGFjdFByb3RvY29sCisgICAgKiBbVEhSSUZULTE2NDddIC0gTm9kZUpTIEJ1ZmZlcmVkVHJhbnNwb3J0IGRvZXMgbm90IHdvcmsgYmV5b25kIHRoZSBoZWxsby13b3JsZCBleGFtcGxlCisgICAgKiBbVEhSSUZULTIxMzBdIC0gVGhyaWZ0J3MgRCBsaWJyYXJ5L3Rlc3Q6IHBhcnRzIG9mICJtYWtlIGNoZWNrIiBjb2RlIGRvIG5vdCBjb21waWxlIHdpdGggcmVjZW50IGRtZC0yLjA2MiB0aHJvdWdoIGRtZC0yLjA2NGFscGhhCisgICAgKiBbVEhSSUZULTIxNDBdIC0gRXJyb3IgY29tcGlsaW5nIGNwcCB0dXRvcmlhbHMKKyAgICAqIFtUSFJJRlQtMjEzOV0gLSBNU1ZDIDIwMTIgRXJyb3IgLSBDYW5ub3QgY29tcGlsZSBkdWUgdG8gQm9vc3RUaHJlYWRGYWN0b3J5CisgICAgKiBbVEhSSUZULTIxMzhdIC0gcGtnY29uZmlnIGZpbGUgY3JlYXRlZCB3aXRoIHdyb25nIGluY2x1ZGUgcGF0aAorICAgICogW1RIUklGVC0yMTYwXSAtIFdhcm5pbmcgaW4gdGhyaWZ0Lmggd2hlbiBjb21waWxpbmcgd2l0aCAtV3VudXNlZCBhbmQgTkRFQlVHCisgICAgKiBbVEhSSUZULTIxNThdIC0gQ29tcGFjdCwgSlNPTiwgYW5kIFNpbXBsZUpTT04gcHJvdG9jb2xzIGFyZSBub3Qgd29ya2luZyBjb3JyZWN0bHkKKyAgICAqIFtUSFJJRlQtMjE2N10gLSBub2RlanMgbGliIHRocm93cyBlcnJvciBpZiBvcHRpb25zIGFyZ3VtZW50IGlzbid0IHBhc3NlZAorICAgICogW1RIUklGVC0yMjg4XSAtIEdvIGltcGwgb2YgVGhyaWZ0IEpTT04gcHJvdG9jb2wgd3JvbmdseSB3cml0ZXMvZXhwZWN0cyB0cnVlL2ZhbHNlIGZvciBib29scworICAgICogW1RIUklGVC0yMTQ3XSAtIFRocmlmdCBJREwgZ3JhbW1hciBhbGxvd3MgZm9yIGRvdHRlZCBpZGVudGlmaWVyIG5hbWVzCisgICAgKiBbVEhSSUZULTIxNDVdIC0gUmFjayBhbmQgVGhpbiBhcmUgbm90IGp1c3QgZGV2ZWxvcG1lbnQgZGVwZW5kZW5jaWVzCisgICAgKiBbVEhSSUZULTIyNjddIC0gU2hvdWxkIGJlIGFibGUgdG8gY2hvb3NlIHNvY2tldCBmYW1pbHkgaW4gUHl0aG9uIFRTb2NrZXQKICAgICAqIFtUSFJJRlQtMjI3Nl0gLSBqYXZhIHBhdGggaW4gc3BlYyBmaWxlIG5lZWRzIHVwZGF0aW5nCi0gICAgKiBbVEhSSUZULTIyNzVdIC0gRml4IG1lbW9yeSBsZWFrIGluIGdvbGFuZyBjb21wYWN0X3Byb3RvY29sLgotICAgICogW1RIUklGVC0yMjQwXSAtIHRocmlmdC52aW0gKGNvbnRyaWIpIGRvZXMgbm90IGNvcnJlY3RseSBoYW5kbGUgJ3VuaW9uJworICAgICogW1RIUklGVC0yMjgxXSAtIEdlbmVyYXRlZCBzZW5kL3JlY3YgY29kZSBpZ25vcmVzIGVycm9ycyByZXR1cm5lZCBieSB0aGUgdW5kZXJseWluZyBwcm90b2NvbAorICAgICogW1RIUklGVC0yMjgwXSAtIFRKU09OUHJvdG9jb2wuRmx1c2goKSBkb2VzIG5vdCByZWFsbHkgZmx1c2ggdGhlIHRyYW5zcG9ydAorICAgICogW1RIUklGVC0yMjc0XSAtIFROb25ibG9ja2luZ1NlcnZlciBhbmQgVFRocmVhZGVkU2VsZWN0b3JTZXJ2ZXIgZG8gbm90IGNsb3NlIHRoZWlyIGNoYW5uZWwgc2VsZWN0b3JzIG9uIGV4aXQgYW5kIGxlYWsgZmlsZSBkZXNjcmlwdG9ycworICAgICogW1RIUklGVC0yMjY1XSAtIHBocCBsaWJyYXJ5IGRvZXNuJ3QgYnVpbGQKICAgICAqIFtUSFJJRlQtMjIzMl0gLSBJc1NldCogYnJva2VuIGluIEdvCi0gICAgKiBbVEhSSUZULTIyMzBdIC0gQ2Fubm90IEJ1aWxkIG9uIFJIRUwvQ2VudG9zL0FtYXpvbiBMaW51eCA2LngKLSAgICAqIFtUSFJJRlQtMjIyN10gLSBUaHJpZnQgY29tcGlsZXIgZ2VuZXJhdGVzIHNwdXJpb3VzIHdhcm5pbmdzIHdpdGggWGxpbnQKLSAgICAqIFtUSFJJRlQtMjIyNl0gLSBUU2VydmVyU29ja2V0IC0ga2VlcEFsaXZlIHdyb25nIGluaXRpYWxpemF0aW9uIG9yZGVyCi0gICAgKiBbVEhSSUZULTIyNTldIC0gQyM6IHVuZXhwZWN0ZWQgbnVsbCBsb2dEZWxlZ2F0ZSgpIHBvaW50ZXIgY2F1c2VzIEFWIGluIFRTZXJ2ZXIuc2VydmUoKQotICAgICogW1RIUklGVC0yMjUzXSAtIFB5dGhvbiBUb3JuYWRvIFRUb3JuYWRvU2VydmVyIGJhc2UgY2xhc3MgY2hhbmdlCi0gICAgKiBbVEhSSUZULTIyNDhdIC0gR28gZ2VuZXJhdG9yIGRvZXNuJ3QgZGVhbCB3ZWxsIHdpdGggbWFwIGtleXMgb2YgdHlwZSBiaW5hcnkKLSAgICAqIFtUSFJJRlQtMjI0N10gLSBHbyBnZW5lcmF0b3IgZG9lc24ndCBkZWFsIHdlbGwgd2l0aCBtYXAga2V5cyBvZiB0eXBlIGJpbmFyeQogICAgICogW1RIUklGVC0yMjQ2XSAtIFVuc2V0IGVudW0gdmFsdWUgaXMgcHJpbnRlZCBieSBUb1N0cmluZygpCisgICAgKiBbVEhSSUZULTIyNDBdIC0gdGhyaWZ0LnZpbSAoY29udHJpYikgZG9lcyBub3QgY29ycmVjdGx5IGhhbmRsZSAndW5pb24nCiAgICAgKiBbVEhSSUZULTIyNDNdIC0gVE5vbmJsb2NraW5nU2VydmVyIGluIHRocmlmdCBjcmFzaGVzIHdoZW4gVEZyYW1lZFRyYW5zcG9ydCBvcGVucworICAgICogW1RIUklGVC0yMjMwXSAtIENhbm5vdCBCdWlsZCBvbiBSSEVML0NlbnRvcy9BbWF6b24gTGludXggNi54CisgICAgKiBbVEhSSUZULTIyNDddIC0gR28gZ2VuZXJhdG9yIGRvZXNuJ3QgZGVhbCB3ZWxsIHdpdGggbWFwIGtleXMgb2YgdHlwZSBiaW5hcnkKKyAgICAqIFtUSFJJRlQtMjI1M10gLSBQeXRob24gVG9ybmFkbyBUVG9ybmFkb1NlcnZlciBiYXNlIGNsYXNzIGNoYW5nZQorICAgICogW1RIUklGVC0yMjYxXSAtIGphdmE6IGVycm9yOiB1bm1hcHBhYmxlIGNoYXJhY3RlciBmb3IgZW5jb2RpbmcgQVNDSUkKKyAgICAqIFtUSFJJRlQtMjI1OV0gLSBDIzogdW5leHBlY3RlZCBudWxsIGxvZ0RlbGVnYXRlKCkgcG9pbnRlciBjYXVzZXMgQVYgaW4gVFNlcnZlci5zZXJ2ZSgpCiAgICAgKiBbVEhSSUZULTIyMjVdIC0gU1NMQ29udGV4dCBkZXN0cm95IGJlZm9yZSBjbGVhbnVwT3BlblNTTAogICAgICogW1RIUklGVC0yMjI0XSAtIFRTU0xTb2NrZXQuaCBhbmQgVFNTTFNlcnZlclNvY2tldC5oIHNob3VsZCB1c2UgdGhlIHBsYXRmcm9tc29ja2V0IHRvbwotICAgICogW1RIUklGVC0yMjIyXSAtIHJ1YnkgZ2VtIGNhbm5vdCBiZSBjb21waWxlZCBvbiBPUyBYIG1hdmVyaWNrcworICAgICogW1RIUklGVC0yMjI5XSAtIHRocmlmdCBmYWlsZWQgdG8gYnVpbGQgb24gT1NYIDEwLjkgR00KKyAgICAqIFtUSFJJRlQtMjIyN10gLSBUaHJpZnQgY29tcGlsZXIgZ2VuZXJhdGVzIHNwdXJpb3VzIHdhcm5pbmdzIHdpdGggWGxpbnQKICAgICAqIFtUSFJJRlQtMjIxOV0gLSBUaHJpZnQgZ2VtIGZhaWxzIHRvIGJ1aWxkIG9uIE9TIFggTWF2ZXJpY2tzIHdpdGggMS45LjMgcnViaWVzCisgICAgKiBbVEhSSUZULTIyMjZdIC0gVFNlcnZlclNvY2tldCAtIGtlZXBBbGl2ZSB3cm9uZyBpbml0aWFsaXphdGlvbiBvcmRlcgorICAgICogW1RIUklGVC0yMjg1XSAtIFRKc29uUHJvdG9jb2wgaW1wbGVtZW50YXRpb24gZm9yIEphdmEgZG9lc24ndCBhbGxvdyBhIHNsYXNoICgvKSB0byBiZSBlc2NhcGVkIChcLykKICAgICAqIFtUSFJJRlQtMjIxNl0gLSBFeHRyYW5lb3VzIHNlbWljb2xvbiBpbiBUUHJvdG9jb2xVdGlsLmggbWFrZXMgY2xhbmcgbWFkCiAgICAgKiBbVEhSSUZULTIyMTVdIC0gR2VuZXJhdGVkIEhUTUwvR3JhcGh2aXogbGlzdHMgcmVmZXJlbmNlZCBlbnVtIGlkZW50aWZpZXJzIGFzIFVOS05PV04uCi0gICAgKiBbVEhSSUZULTI1MDNdIC0gQysrOiBGaXggbmFtZSBjb2xsaXNpb24gd2hlbiBhIHN0cnVjdCBoYXMgYSBtZW1iZXIgbmFtZWQgInZhbCIKLSAgICAqIFtUSFJJRlQtMjUwMF0gLSBzZW5kaW5nIHJhbmRvbSBkYXRhIGNyYXNoZXMgdGhyaWZ0KGdvbGFuZykgc2VydmljZQotICAgICogW1RIUklGVC0yNDk4XSAtIEVycm9yIG1lc3NhZ2UgIkludmFsaWQgbWV0aG9kIG5hbWUiIHdoaWxlIHRyeWluZyB0byBjYWxsIEhCYXNlIFRocmlmdCBBUEkKLSAgICAqIFtUSFJJRlQtMjQ5NV0gLSBKYXZhU2NyaXB0L05vZGUgc3RyaW5nIGNvbnN0YW50cyBsYWNrIHByb3BlciBlc2NhcGluZwotICAgICogW1RIUklGVC0yNDc1XSAtIGNfZ2xpYjogYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlIGZ1bmN0aW9uIHJldHVybiBhbHdheXMgVFJVRS4KLSAgICAqIFtUSFJJRlQtMjQ3MF0gLSBUSHR0cEhhbmRsZXIgc3dhbGxvd3MgZXhjZXB0aW9ucyBmcm9tIHByb2Nlc3NvcgotICAgICogW1RIUklGVC0yNDY4XSAtIFRpbWVzdGFtcCBoYW5kbGluZwotICAgICogW1RIUklGVC0yNDY3XSAtIFVuYWJsZSB0byBidWlsZCBjb250cmliL2ZiMzAzIG9uIE9TWCAxMC45LjIKLSAgICAqIFtUSFJJRlQtMjQ2Nl0gLSBJbXByb3BlciBlcnJvciBoYW5kbGluZyBmb3IgU1NML1RMUyBjb25uZWN0aW9ucyB0aGF0IGRvbid0IGNvbXBsZXRlIGEgaGFuZHNoYWtlCi0gICAgKiBbVEhSSUZULTI0NjNdIC0gdGVzdC9weS9SdW5DbGllbnRTZXJ2ZXIucHkgZmFpbHMgc29tZXRpbWVzCi0gICAgKiBbVEhSSUZULTI0NjFdIC0gQ2FuJ3QgaW5zdGFsbCB0aHJpZnQtMC44LjAgb24gT1MgWCAxMC45LjIKLSAgICAqIFtUSFJJRlQtMjQ1NF0gLSBjX2dsaWI6IFRoZXJlIGlzIG5vIGdldGhvc3RieW5hbWVfcigpIGluIHNvbWUgT1MuCi0gICAgKiBbVEhSSUZULTI0NDhdIC0gdGhyaWZ0L3Rlc3QvdGVzdC5zaCBoYXMgaW5jb3JyZWN0IE5vZGUuanMgdGVzdCBwYXRoCi0gICAgKiBbVEhSSUZULTI0NTldIC0gLS12ZXJzaW9uIHNob3VsZCBub3QgZXhpdCAxCi0gICAgKiBbVEhSSUZULTI0NThdIC0gR2VuZXJhdGVkIGdvbGFuZyBzZXJ2ZXIgY29kZSBmb3IgIm9uZXdheSIgbWV0aG9kcyBpcyBpbmNvcnJlY3QKLSAgICAqIFtUSFJJRlQtMjQ0M10gLSBOb2RlIGZhaWxzIGNyb3NzIGxhbmcgdGVzdHMKLSAgICAqIFtUSFJJRlQtMjQ1Nl0gLSBUSHR0cENsaWVudCBmYWlscyB3aGVuIHVzaW5nIGFzeW5jIHN1cHBvcnQgb3V0c2lkZSBTaWx2ZXJsaWdodAotICAgICogW1RIUklGVC0yNDUxXSAtIERvIG5vdCB1c2UgcG9pbnRlcnMgZm9yIG9wdGlvbmFsIGZpZWxkcyB3aXRoIGRlZmF1bHRzLiBEbyBub3Qgd3JpdGUgc3VjaCBmaWVsZHMgaWYgaXRzIHZhbHVlIHNldCB0byBkZWZhdWx0LiBBbHNvLCBkbyBub3QgdXNlIHBvaW50ZXJzIGZvciBhbnkgb3B0aW9uYWwgZmllbGRzIG1hcHBlZCB0byBnbyBtYXAgb3Igc2xpY2UuIGdlbmVyYXRlIEdldCBhY2Nlc3NvcnMKLSAgICAqIFtUSFJJRlQtMjQ1MF0gLSBpbmNsdWRlIEhvd1RvQ29udHJpYnV0ZSBpbiB0aGUgc3JjIHJlcG8KLSAgICAqIFtUSFJJRlQtMjQ2MF0gLSB1bm9wZW5lZCBzb2NrZXQgZmQgbXVzdCBiZSBsZXNzIHRoYW4gemVyby4KLSAgICAqIFtUSFJJRlQtMjQ0Ml0gLSBGaXggaXNzdWUgd2l0aCBjcHAgc2VydmVyIG9uIFdpbmRvd3MgKFdTQVN0YXJ0dXAgd2Fzbid0IGNhbGxlZCkKLSAgICAqIFtUSFJJRlQtMjQzOV0gLSBCdWcgaW4gVFByb3RvY29sRGVjb3JhdG9yIENsYXNzIGNhdXNlcyBwYXJzaW5nIGVycm9ycwotICAgICogW1RIUklGVC0yNDM4XSAtIFVuZXhwZWN0ZWQgcmVhZEZpZWxkRW5kIGNhbGwgY2F1c2VzIEpTT04gUGFyc2luZyBlcnJvcnMKLSAgICAqIFtUSFJJRlQtMjQzN10gLSBBdXRob3IgZmllbGRzIGluIFB5dGhvbiBzZXR1cC5weSBtdXN0IGJlIHN0cmluZ3Mgbm90IGxpc3RzLgotICAgICogW1RIUklGVC0yNDM1XSAtIEphdmEgY29tcGlsZXIgZG9lc24ndCBsaWtlIHN0cnVjdCBtZW1iZXIgbmFtZXMgdGhhdCBhcmUgaWRlbnRpY2FsIHRvIGFuIGV4aXN0aW5nIGVudW0gb3Igc3RydWN0IHR5cGUKLSAgICAqIFtUSFJJRlQtMjQzNF0gLSBNaXNzaW5nIG5hbWVzcGFjZSBpbXBvcnQgZm9yIHBocCBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IgaW1wbGVtZW50YXRpb24KLSAgICAqIFtUSFJJRlQtMjQzMl0gLSBGbGFreSBwYXJhbGxlbCBidWlsZAotICAgICogW1RIUklGVC0yNDMwXSAtIENyYXNoIGR1cmluZyBUVGhyZWFkUG9vbFNlcnZlciBzaHV0ZG93bgotICAgICogW1RIUklGVC0yNDI4XSAtIFB5dGhvbiAzIHNldHVwLnB5IHN1cHBvcnQKLSAgICAqIFtUSFJJRlQtMjQyNl0gLSBjbGFyaWZ5IElQIHJpZ2h0cyBhbmQgY29udHJpYnV0aW9ucyBmcm9tIGZidGhyaWZ0Ci0gICAgKiBbVEhSSUZULTI0MjBdIC0gR28gYXJndW1lbnQgcGFyc2VyIGZvciBtZXRob2RzIHdpdGhvdXQgYXJndW1lbnRzIGRvZXMgbm90IHNraXAgZmllbGRzCi0gICAgKiBbVEhSSUZULTI0MTldIC0gZ29sYW5nIC0gRml4IGZtdC5FcnJvcmYgaW4gZ2VuZXJhdGVkIGNvZGUKLSAgICAqIFtUSFJJRlQtMjQxOF0gLSBHbyBoYW5kbGVyIGZ1bmN0aW9uIHBhbmljcyBvbiBpbnRlcm5hbCBlcnJvcgotICAgICogW1RIUklGVC0yNDE2XSAtIENhbm5vdCB1c2UgVENvbXBhY3RQcm90b2NvbCB3aXRoIE1TVkMKLSAgICAqIFtUSFJJRlQtMjQxNF0gLSBjX2dsaWIgZml4IHNldmVyYWwgYnVnLgotICAgICogW1RIUklGVC0yNDA1XSAtIE5vZGUuanMgTXVsdGlwbGV4ZXIgdGVzdHMgZmFpbCAoc2lsZW50bHkpCi0gICAgKiBbVEhSSUZULTI0MDJdIC0gYnl0ZSBjb3VudCBvZiBGcmFtZUJ1ZmZlciBpbiBBV0FJVElOR19DTE9TRSBzdGF0ZSBpcyBub3Qgc3VidHJhY3RlZCBmcm9tIHJlYWRCdWZmZXJCeXRlc0FsbG9jYXRlZAotICAgICogW1RIUklGVC0yMzk5XSAtIHRocmlmdC5lbDogcmVjb2duaXplICIvLyItc3R5bGUgY29tbWVudHMgaW4gZW1hY3MgdGhyaWZ0LW1vZGUKLSAgICAqIFtUSFJJRlQtMjQwMF0gLSB0aHJpZnQuZWw6IHJlY29nbml6ZSAiLy8iLXN0eWxlIGNvbW1lbnRzIGluIGVtYWNzIHRocmlmdC1tb2RlCi0gICAgKiBbVEhSSUZULTIzOTZdIC0gQnVpbGQgRXJyb3Igb24gTWFjT1NYCi0gICAgKiBbVEhSSUZULTIzOTVdIC0gdGhyaWZ0IFJ1YnkgZ2VtIHJlcXVpcmVzIGRldmVsb3BtZW50IGRlcGVuZGVuY3kgJ3RoaW4nIHJlZ2FyZGxlc3Mgb2YgZW52aXJvbm1lbnQKLSAgICAqIFtUSFJJRlQtMjM5MF0gLSBubyBjbG9zZSBldmVudCB3aGVuIGNvbm5lY3Rpb24gbG9zdAorICAgICogW1RIUklGVC0yMjExXSAtIEV4Y2VwdGlvbiBjb25zdHJ1Y3RvciBkb2VzIG5vdCBjb250YWluIG5hbWVzcGFjZSBwcmVmaXguCisgICAgKiBbVEhSSUZULTIyMTBdIC0gbGliL2phdmEgVFNpbXBsZUpTT05Qcm90b2NvbCBjYW4gZW1pdCBpbnZhbGlkIEpTT04KKyAgICAqIFtUSFJJRlQtMjIwOV0gLSBSdWJ5IGdlbmVyYXRvciAtLSBwbGVhc2UgbmFtZXNwYWNlIGNsYXNzZXMKKyAgICAqIFtUSFJJRlQtMjIwMl0gLSBEZWxwaGkgVFNlcnZlckltcGwuRGVmYXVsdExvZ0RlbGVnYXRlIG1heSBzdG9wIHRoZSBzZXJ2ZXIgd2l0aCBJL08tRXJyb3IgMTA1CisgICAgKiBbVEhSSUZULTIyMDFdIC0gVGVybmFyeSBvcGVyYXRvciByZXR1cm5zIGRpZmZlcmVudCB0eXBlcyAoYnVpbGQgZXJyb3IgZm9yIHNvbWUgY29tcGlsZXJzKQorICAgICogW1RIUklGVC0yMjAwXSAtIG5lc3RlZCBzdHJ1Y3RzIGNhdXNlIGdlbmVyYXRlX2ZpbmdlcnByaW50KCkgdG8gc2xvdyBkb3duIGF0IGV4Y2Vzc2l2ZSBDUFUgbG9hZAorICAgICogW1RIUklGVC0yMTk3XSAtIGZpeCBqYXIgb3V0cHV0IGRpcmVjdG9yeSBpbiBycG0gc3BlYyBmaWxlCisgICAgKiBbVEhSSUZULTIxOTZdIC0gRml4IGludmFsaWQgZGVwZW5kZW5jeSBpbiBNYWtlZmlsZS5hbQorICAgICogW1RIUklGVC0yMTk0XSAtIE5vZGU6IE5vdCBhY3R1YWxseSBwcmVwZW5kaW5nIHJlc2lkdWFsIGRhdGEgaW4gVEZyYW1lZFRyYW5zcG9ydC5yZWNlaXZlcgorICAgICogW1RIUklGVC0yMTkzXSAtIEphdmEgY29kZSBnZW5lcmF0b3IgZW1pdHMgc3B1cmlvdXMgc2VtaWNvbG9uIHdoZW4gZGVlcCBjb3B5aW5nIGJpbmFyeSBkYXRhCisgICAgKiBbVEhSSUZULTIxOTFdIC0gRml4IGNoYXJwIEpTT05Qcm90b2NvbC5SZWFkSlNPTkRvdWJsZSAoc3BlY2lmeSBJbnZhcmlhbnRDdWx0dXJlKQorICAgICogW1RIUklGVC0yMjE0XSAtIFN5c3RlbSBoZWFkZXIgc3lzL3BhcmFtLmggaXMgaW5jbHVkZWQgaW5zaWRlIHRoZSBUaHJpZnQgbmFtZXNwYWNlCisgICAgKiBbVEhSSUZULTIxNzhdIC0gVGhyaWZ0IGdlbmVyYXRvciByZXR1cm5zIGVycm9yIGV4aXQgY29kZSBvbiAtLXZlcnNpb24KKyAgICAqIFtUSFJJRlQtMjE3MV0gLSBOb2RlSlMgaW1wbGVtZW50YXRpb24gaGFzIGV4dHJlbWVseSBsb3cgdGVzdCBjb3ZlcmFnZQorICAgICogW1RIUklGVC0yMTgzXSAtIGdlbSBpbnN0YWxsIGZhaWxzIG9uIHpzaAorICAgICogW1RIUklGVC0yMTgyXSAtIHNlZ2ZhdWx0IGluIHJlZ3Jlc3Npb24gdGVzdHMgKEdDIGJ1ZyBpbiByYl90aHJpZnRfbWVtb3J5X2J1ZmZlcl93cml0ZSkKKyAgICAqIFtUSFJJRlQtMjE4MV0gLSBvbmV3YXkgY2FsbHMgZG9uJ3Qgd29yayBpbiBOb2RlSlMKKyAgICAqIFtUSFJJRlQtMjE2OV0gLSBKYXZhTUUgVGhyaWZ0IExpYnJhcnkgY2F1c2VzICJqYXZhLmlvLklPRXhjZXB0aW9uOiBObyBSZXNwb25zZSBFbnRyaWVzIEF2YWlsYWJsZSIgYWZ0ZXIgdXNpbmcgdGhlIFRocmlmdCBjbGllbnQgZm9yIHNvbWUgdGltZQorICAgICogW1RIUklGVC0yMTY4XSAtIE5vZGUuanMgYXBwZWFycyBicm9rZW4gKGF0IGxlYXN0LCBleGFtcGxlcyBkb24ndCB3b3JrIGFzIGludGVuZGVkKQorICAgICogW1RIUklGVC0yMjkzXSAtIFRTU0xUcmFuc3BvcnRGYWN0b3J5LmNyZWF0ZVNTTENvbnRleHQoKSBsZWF2ZXMgZmlsZXMgb3BlbgorICAgICogW1RIUklGVC0yMjc5XSAtIFRTZXJpYWxpemVyIG9ubHkgcmV0dXJucyB0aGUgZmlyc3QgMTAyNCBieXRlcyBzZXJpYWxpemVkCisgICAgKiBbVEhSSUZULTIyNzhdIC0gQnVmZmVyZWQgdHJhbnNwb3J0IGRvZXNuJ3Qgc3VwcG9ydCB3cml0ZXMgPiBidWZmZXIgc2l6ZQorICAgICogW1RIUklGVC0yMjc1XSAtIEZpeCBtZW1vcnkgbGVhayBpbiBnb2xhbmcgY29tcGFjdF9wcm90b2NvbC4KKyAgICAqIFtUSFJJRlQtMjI4Ml0gLSBJbmNvcmVjdCBjb2RlIGdlbmVyYXRlZCBmb3Igc29tZSB0eXBlZGVmcworICAgICogW1RIUklGVC0yMDA5XSAtIEdvIHJlZGVjbGFyYXRpb24gZXJyb3IKKyAgICAqIFtUSFJJRlQtMTk2NF0gLSAnSXNzZXQnIGNhdXNlcyBwcm9ibGVtcyB3aXRoIEMjLy5ORVQgc2VyaWFsaXplcnMKKyAgICAqIFtUSFJJRlQtMjAyNl0gLSBGaXggVENvbXBhY3RQcm90b2NvbCA2NCBiaXQgYnVpbGRzCisgICAgKiBbVEhSSUZULTIxMDhdIC0gRml4IFRBc3luY0NsaWVudE1hbmFnZXIgdGltZW91dCByYWNlCisgICAgKiBbVEhSSUZULTIwNjhdIC0gTXVsdGlwbGUgY2FsbHMgZnJvbSBzYW1lIGNvbm5lY3Rpb24gYXJlIG5vdCBwcm9jZXNzZWQgaW4gbm9kZQorICAgICogW1RIUklGVC0xNzUwXSAtIE1ha2UgY29tcGlsZXIgYnVpbGQgY2xlYW5seSB1bmRlciB2aXN1YWwgc3R1ZGlvIDEwCisgICAgKiBbVEhSSUZULTE3NTVdIC0gQ29tbWVudCBwYXJzaW5nIGJ1ZworICAgICogW1RIUklGVC0xNzcxXSAtICJtYWtlIGNoZWNrIiBmYWlscyBvbiB4NjQgZm9yIGxpYmJvb3N0X3VuaXRfdGVzdF9mcmFtZXdvcmsuYQorICAgICogW1RIUklGVC0xODQxXSAtIE5vZGVKUyBUaHJpZnQgaW5jb3JyZWN0bHkgcGFyc2VzIG5vbi1VVEY4LXN0cmluZyB0eXBlcworICAgICogW1RIUklGVC0xOTA4XSAtIFVzaW5nIHBocCB0aHJpZnRfcHJvdG9jb2wgYWNjZWxlcmF0ZWQgdHJhbnNmZXIgY2F1c2VzIGNvcmUgZHVtcAorICAgICogW1RIUklGVC0xODkyXSAtIFNvY2tldCB0aW1lb3V0cyBhcmUgZGVjbGFyZWQgaW4gbWlsbGktc2Vjb25kcywgYnV0IGFyZSBhY3R1YWxseSBzZXQgaW4gbWljcm8tc2Vjb25kcworICAgICogW1RIUklGVC0yMzAzXSAtIFRCdWZmZXJyZWRUcmFuc3BvcnQgbm90IHByb3Blcmx5IGNsb3NpbmcgdW5kZXJseWluZyB0cmFuc3BvcnQKKyAgICAqIFtUSFJJRlQtMjMxM10gLSBub2RlanMgc2VydmVyIGNyYXNoIGFmdGVyIHByb2Nlc3NpbmcgdGhlIGZpcnN0IHJlcXVlc3Qgd2hlbiB1c2luZyBNdWx0aXBsZXhlZFByb2Nlc3Nvci9GcmFtZWRCdWZmZXIvQmluYXJ5UHJvdG9jb2wKKyAgICAqIFtUSFJJRlQtMjMxMV0gLSBHbzogaW52YWxpZCBjb2RlIGdlbmVyYXRlZCB3aGVuIGV4Y2VwdGlvbiBuYW1lIGlzIGEgZ28ga2V5d29yZAorICAgICogW1RIUklGVC0yMzA4XSAtIG5vZGU6IFRKU09OUHJvdG9jb2wgcGFyc2UgZXJyb3Igd2hlbiByZWFkaW5nIGZyb20gYnVmZmVyZWQgbWVzc2FnZQorICAgICogW1RIUklGVC0yMzE2XSAtIGNjcDogVEZpbGVUcmFuc3BvcnRUZXN0CisgICAgKiBbVEhSSUZULTIzNTJdIC0gbXN2YyBmYWlsZWQgdG8gY29tcGlsZSB0aHJpZnQgdGVzdHMKKyAgICAqIFtUSFJJRlQtMjMzN10gLSBHb2xhbmcgZG9lcyBub3QgcmVwb3J0IFRJTUVEX09VVCBleGNlcHRpb25zCisgICAgKiBbVEhSSUZULTIzNDBdIC0gR2VuZXJhdGVkIHNlcnZlciBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBzZW5kIHJlc3BvbnNlIHR5cGUgRVhDRVBUSU9OIG9uIHRoZSBUaHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uVHlwZS5VTktOT1dOX01FVEhPRCBleGNlcHRpb24KKyAgICAqIFtUSFJJRlQtMjM1NF0gLSBDb25uZWN0aW9uIGVycm9ycyBjYW4gbGVhZCB0byBjYXNlX2NsYXVzZSBleGNlcHRpb25zCisgICAgKiBbVEhSSUZULTIzMzldIC0gVW5jYXVnaHQgZXhjZXB0aW9uIGluIHRocmlmdCBjIyBkcml2ZXIKKyAgICAqIFtUSFJJRlQtMjM1Nl0gLSBjKysgdGhyaWZ0IGNsaWVudCBub3Qgd29ya2luZyB3aXRoIHNzbCAoU1NMX2Nvbm5lY3QgaGFuZ3MpCisgICAgKiBbVEhSSUZULTIzMzFdIC0gTWlzc2luZyBjYWxsIHRvIFJlYWRTdHJ1Y3RCZWdpbigpIGluIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5SZWFkKCkKKyAgICAqIFtUSFJJRlQtMjMyM10gLSBVbmNvbXBpbGVhYmxlIERlbHBoaSBjb2RlIGdlbmVyYXRlZCBmb3IgdHlwZWRlZidkIHN0cnVjdHMKKyAgICAqIFtUSFJJRlQtMjMyMl0gLSBDb3JyZWN0bHkgc2hvdyB0aGUgbnVtYmVyIG9mIHRpbWVzIEV4ZWN1dG9yU2VydmljZSAoamF2YSkgaGFzIHJlamVjdGVkIHRoZSBjbGllbnQuCiAgICAgKiBbVEhSSUZULTIzODldIC0gbmFtZXNwYWNlcyBoYW5kbGVkIHdyb25nbHkgaW4gYWNyaW9uc2NyaXB0IDMuMCBpbXBsZW1lbnRhdGlvbgogICAgICogW1RIUklGVC0yMzg4XSAtIEdvTGFuZyAtIEZpeCBkYXRhIHJhY2VzIGluIHNpbXBsZV9zZXJ2ZXIgYW5kIHNlcnZlcl9zb2NrZXQKICAgICAqIFtUSFJJRlQtMjM4Nl0gLSBUaHJpZnQgcmVmdXNlcyB0byBsaW5rIHl5bGV4Ci0gICAgKiBbVEhSSUZULTIzODVdIC0gUHJvYmxlbSB3aXRoIGdldGhvc3RieW5hbWUyIGR1cmluZyBtYWtlIGNoZWNrCi0gICAgKiBbVEhSSUZULTIzODRdIC0gQmluYXJ5IG1hcCBrZXlzIHByb2R1Y2UgdW5jb21waWxhYmxlIGNvZGUgaW4gZ28KLSAgICAqIFtUSFJJRlQtMjM4MV0gLSBjb2RlIHdoaWNoIGdlbmVyYXRlZCBieSB0aHJpZnQyL2hiYXNlLnRocmlmdCBjb21waWxlIGVycm9yCi0gICAgKiBbVEhSSUZULTIzODBdIC0gdW5yZWFjaGFibGUgY29kZSAoQ0lEIDExNzQ1NDYsIENJRCAxMTc0Njc5KQotICAgICogW1RIUklGVC0yMzc4XSAtIHNlcnZpY2UgbWV0aG9kIGFyZ3VtZW50cyBvZiBiaW5hcnkgdHlwZSBsZWFkIHRvIHVuY29tcGlsZWFibGUgR28gY29kZQogICAgICogW1RIUklGVC0yMzc1XSAtIEV4Y2Vzc2l2ZSA8YnI+J3MgaW4gZ2VuZXJhdGVkIEhUTUwKICAgICAqIFtUSFJJRlQtMjM3M10gLSB3YXJuaW5nIENTMDQxNCBpbiBUSHR0cENsaWVudC5jczogcHJpdmF0ZSBmaWVsZCAnVGhyaWZ0LlRyYW5zcG9ydC5USHR0cENsaWVudC5jb25uZWN0aW9uJyBhc3NpZ25lZCBidXQgbmV2ZXIgdXNlZAogICAgICogW1RIUklGVC0yMzcyXSAtIHRocmlmdC9qc29uX3Byb3RvY29sLmdvOjE2MDogZnVuY3Rpb24gZW5kcyB3aXRob3V0IGEgcmV0dXJuIHN0YXRlbWVudAogICAgICogW1RIUklGVC0yMzcxXSAtIHJ1YnkgYnVuZGxlciB2ZXJzaW9uIGZhaWxzIG9uIH4xLjMuMSwgcmVtb3ZlIGFuZCB0YWtlIGxhdGVzdCBhdmFpbAogICAgICogW1RIUklGVC0yMzcwXSAtIENvbXBpbGVyIFNFR0ZBVUxUcyBnZW5lcmF0aW5nIEhUTUwgZG9jdW1lbnRhdGlvbiBmb3IgY29tcGxleCBzdHJ1Y3JlCi0gICAgKiBbVEhSSUZULTIxNDddIC0gVGhyaWZ0IElETCBncmFtbWFyIGFsbG93cyBmb3IgZG90dGVkIGlkZW50aWZpZXIgbmFtZXMKLSAgICAqIFtUSFJJRlQtMjE0NV0gLSBSYWNrIGFuZCBUaGluIGFyZSBub3QganVzdCBkZXZlbG9wbWVudCBkZXBlbmRlbmNpZXMKLSAgICAqIFtUSFJJRlQtMjE0Nl0gLSBVbmFibGUgdG8gcGFzcyBtdWx0aXBsZSAiLS1nZW4iIG9wdGlvbnMgdG8gdGhlIHRocmlmdCBjb21waWxlcgotICAgICogW1RIUklGVC0yMTQwXSAtIEVycm9yIGNvbXBpbGluZyBjcHAgdHV0b3JpYWxzCi0gICAgKiBbVEhSSUZULTIxODJdIC0gc2VnZmF1bHQgaW4gcmVncmVzc2lvbiB0ZXN0cyAoR0MgYnVnIGluIHJiX3RocmlmdF9tZW1vcnlfYnVmZmVyX3dyaXRlKQotICAgICogW1RIUklGVC0yMTcxXSAtIE5vZGVKUyBpbXBsZW1lbnRhdGlvbiBoYXMgZXh0cmVtZWx5IGxvdyB0ZXN0IGNvdmVyYWdlCi0gICAgKiBbVEhSSUZULTIxNjldIC0gSmF2YU1FIFRocmlmdCBMaWJyYXJ5IGNhdXNlcyAiamF2YS5pby5JT0V4Y2VwdGlvbjogTm8gUmVzcG9uc2UgRW50cmllcyBBdmFpbGFibGUiIGFmdGVyIHVzaW5nIHRoZSBUaHJpZnQgY2xpZW50IGZvciBzb21lIHRpbWUKLSAgICAqIFtUSFJJRlQtMjE2NV0gLSBUaHJpZnQgQ29tcGlsZXIgZmFpbHMgYXQgaW5wdXQgZmlsZXMgd2l0aCBVVEYtOCBCT00KLSAgICAqIFtUSFJJRlQtMjE2MF0gLSBXYXJuaW5nIGluIHRocmlmdC5oIHdoZW4gY29tcGlsaW5nIHdpdGggLVd1bnVzZWQgYW5kIE5ERUJVRwotICAgICogW1RIUklGVC0yMTU4XSAtIENvbXBhY3QsIEpTT04sIGFuZCBTaW1wbGVKU09OIHByb3RvY29scyBhcmUgbm90IHdvcmtpbmcgY29ycmVjdGx5Ci0gICAgKiBbVEhSSUZULTIxODFdIC0gb25ld2F5IGNhbGxzIGRvbid0IHdvcmsgaW4gTm9kZUpTCi0gICAgKiBbVEhSSUZULTIxNzhdIC0gVGhyaWZ0IGdlbmVyYXRvciByZXR1cm5zIGVycm9yIGV4aXQgY29kZSBvbiAtLXZlcnNpb24KLSAgICAqIFtUSFJJRlQtMjE3M10gLSBNb3ZlIEZyYW1lQnVmZmVyIGNyZWF0aW9uIHRvIGEgZmFjdG9yeSBtZXRob2QgZm9yIGN1c29taXphdGlvbgotICAgICogW1RIUklGVC0yMTY4XSAtIE5vZGUuanMgYXBwZWFycyBicm9rZW4gKGF0IGxlYXN0LCBleGFtcGxlcyBkb24ndCB3b3JrIGFzIGludGVuZGVkKQotICAgICogW1RIUklGVC0yMTY3XSAtIG5vZGVqcyBsaWIgdGhyb3dzIGVycm9yIGlmIG9wdGlvbnMgYXJndW1lbnQgaXNuJ3QgcGFzc2VkCi0gICAgKiBbVEhSSUZULTIxMzldIC0gTVNWQyAyMDEyIEVycm9yIC0gQ2Fubm90IGNvbXBpbGUgZHVlIHRvIEJvb3N0VGhyZWFkRmFjdG9yeQotICAgICogW1RIUklGVC0yMTM4XSAtIHBrZ2NvbmZpZyBmaWxlIGNyZWF0ZWQgd2l0aCB3cm9uZyBpbmNsdWRlIHBhdGgKLSAgICAqIFtUSFJJRlQtMjEzMF0gLSBUaHJpZnQncyBEIGxpYnJhcnkvdGVzdDogcGFydHMgb2YgIm1ha2UgY2hlY2siIGNvZGUgZG8gbm90IGNvbXBpbGUgd2l0aCByZWNlbnQgZG1kLTIuMDYyIHRocm91Z2ggZG1kLTIuMDY0YWxwaGEKLSAgICAqIFtUSFJJRlQtMjEyMl0gLSBOUEUgaW4gVFNTTFRyYW5zcG9ydEZhY3RvcnkuY3JlYXRlQ2xpZW50IHdoZW4gbm8gdHJ1c3RzdG9yZSBwYXNzd29yZCBpcyBwYXNzZWQgaW4gY3VzdG9tIFNTTCBwYXJhbXMKLSAgICAqIFtUSFJJRlQtMjI4OF0gLSBHbyBpbXBsIG9mIFRocmlmdCBKU09OIHByb3RvY29sIHdyb25nbHkgd3JpdGVzL2V4cGVjdHMgdHJ1ZS9mYWxzZSBmb3IgYm9vbHMKKyAgICAqIFtUSFJJRlQtMjM4NF0gLSBCaW5hcnkgbWFwIGtleXMgcHJvZHVjZSB1bmNvbXBpbGFibGUgY29kZSBpbiBnbworICAgICogW1RIUklGVC0yMzgwXSAtIHVucmVhY2hhYmxlIGNvZGUgKENJRCAxMTc0NTQ2LCBDSUQgMTE3NDY3OSkKKyAgICAqIFtUSFJJRlQtMjM3OF0gLSBzZXJ2aWNlIG1ldGhvZCBhcmd1bWVudHMgb2YgYmluYXJ5IHR5cGUgbGVhZCB0byB1bmNvbXBpbGVhYmxlIEdvIGNvZGUKKyAgICAqIFtUSFJJRlQtMjM2M10gLSBJc3N1ZSB3aXRoIGNoYXJhY3RlciBlbmNvZGluZyBvZiBTdWNjZXNzIHJldHVybmVkIGZyb20gTG9naW4gdXNpbmcgVGhyaWZ0IFByb3h5IGFuZCBOb2RlSlMKKyAgICAqIFtUSFJJRlQtMjM1OV0gLSBUQnVmZmVyZWRUcmFuc3BvcnQgZG9lc24ndCBjbGVhciBpdCdzIGJ1ZmZlciBvbiBhIGZhaWxlZCBmbHVzaCBjYWxsCisgICAgKiBbVEhSSUZULTI0MjhdIC0gUHl0aG9uIDMgc2V0dXAucHkgc3VwcG9ydAorICAgICogW1RIUklGVC0yMzY3XSAtIEJ1aWxkIGZhaWx1cmU6IHN0ZGxpYiBhbmQgYm9vc3QgYm90aCBkZWZpbmUgdWludDY0X3QKKyAgICAqIFtUSFJJRlQtMjM2NV0gLSBDIyBkZWNvZGVzIHRvbyBtYW55IGJpbmFyeSBieXRlcyBmcm9tIEpTT04KKyAgICAqIFtUSFJJRlQtMjQwMl0gLSBieXRlIGNvdW50IG9mIEZyYW1lQnVmZmVyIGluIEFXQUlUSU5HX0NMT1NFIHN0YXRlIGlzIG5vdCBzdWJ0cmFjdGVkIGZyb20gcmVhZEJ1ZmZlckJ5dGVzQWxsb2NhdGVkCisgICAgKiBbVEhSSUZULTIzOTZdIC0gQnVpbGQgRXJyb3Igb24gTWFjT1NYCisgICAgKiBbVEhSSUZULTIzOTVdIC0gdGhyaWZ0IFJ1YnkgZ2VtIHJlcXVpcmVzIGRldmVsb3BtZW50IGRlcGVuZGVuY3kgJ3RoaW4nIHJlZ2FyZGxlc3Mgb2YgZW52aXJvbm1lbnQKKyAgICAqIFtUSFJJRlQtMjQxNF0gLSBjX2dsaWIgZml4IHNldmVyYWwgYnVnLgorICAgICogW1RIUklGVC0yNDIwXSAtIEdvIGFyZ3VtZW50IHBhcnNlciBmb3IgbWV0aG9kcyB3aXRob3V0IGFyZ3VtZW50cyBkb2VzIG5vdCBza2lwIGZpZWxkcworICAgICogW1RIUklGVC0yNDM5XSAtIEJ1ZyBpbiBUUHJvdG9jb2xEZWNvcmF0b3IgQ2xhc3MgY2F1c2VzIHBhcnNpbmcgZXJyb3JzCisgICAgKiBbVEhSSUZULTI0MTldIC0gZ29sYW5nIC0gRml4IGZtdC5FcnJvcmYgaW4gZ2VuZXJhdGVkIGNvZGUKKyAgICAqIFtUSFJJRlQtMjQxOF0gLSBHbyBoYW5kbGVyIGZ1bmN0aW9uIHBhbmljcyBvbiBpbnRlcm5hbCBlcnJvcgorICAgICogW1RIUklGVC0yNDA1XSAtIE5vZGUuanMgTXVsdGlwbGV4ZXIgdGVzdHMgZmFpbCAoc2lsZW50bHkpCisgICAgKiBbVEhSSUZULTI1ODFdIC0gVEZEVHJhbnNwb3J0IGRlc3RydWN0b3Igc2hvdWxkIG5vdCB0aHJvdworICAgICogW1RIUklGVC0yNTc1XSAtIFRocmlmdCBpbmNsdWRlcyBzaWdpbmZvX3Qgd2l0aGluIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbCBuYW1lc3BhY2UKKyAgICAqIFtUSFJJRlQtMjU3N10gLSBURmlsZVRyYW5zcG9ydCAgbWlzc3VzZSBvZiBjbG9zZXNvY2tldCBvbiB3aW5kb3dzIHBsYXRmb3JtCisgICAgKiBbVEhSSUZULTI1NzZdIC0gSW1wbGVtZW50IFRocmlmdC5Qcm90b2NvbC5wcm90b3R5cGUuc2tpcCBtZXRob2QgaW4gSmF2YVNjcmlwdCBsaWJyYXJ5CisgICAgKiBbVEhSSUZULTI1ODhdIC0gVGhyaWZ0IGNvbXBpbGVyIGlzIG5vdCBidWlsZGFibGUgaW4gVmlzdWFsIFN0dWRpbyAyMDEwCisgICAgKiBbVEhSSUZULTI1OTRdIC0gSlMgQ29tcGlsZXI6IFNpbmdsZSBxdW90ZXMgYXJlIG5vdCBiZWluZyBlc2NhcGVkIGluIGNvbnN0YW50cy4KKyAgICAqIFtUSFJJRlQtMjU5MV0gLSBURnJhbWVkVHJhbnNwb3J0IGRvZXMgbm90IGhhbmRsZSBwYXlsb2FkcyBzcGxpdCBhY3Jvc3MgcGFja2V0cyBjb3JyZWN0bHkKKyAgICAqIFtUSFJJRlQtMjU5OV0gLSBVbmNvbXBpbGVhYmxlIERlbHBoaSBjb2RlIGR1ZSB0byBuYW1pbmcgY29uZmxpY3RzIHdpdGggSURMCisgICAgKiBbVEhSSUZULTI1OTBdIC0gQysrIFZpc3VhbCBTdHVkaW8gc29sdXRpb24gZG9lc24ndCBpbmNsdWRlIE11bHRpcGxleGluZyBzdXBwb3J0CisgICAgKiBbVEhSSUZULTI1OTVdIC0gTm9kZS5qczogRml4IGdsb2JhbCBsZWFrcyBhbmQgY29weS1wYXN0ZSBlcnJvcnMKKyAgICAqIFtUSFJJRlQtMjU2NV0gLSBhdXRvY29uZiBmYWlscyB0byBmaW5kIG1pbmd3LWcrKyBjcm9zcyBjb21waWxlciBvbiB0cmF2aXMgQ0kKKyAgICAqIFtUSFJJRlQtMjU1NV0gLSBleGNlc3NpdmUgInVudXNlZCBmaWVsZCIgY29tbWVudHMKKyAgICAqIFtUSFJJRlQtMjU1NF0gLSBkb3VibGUgaW5pdGlhbGl6YXRpb24gaW4gZ2VuZXJhdGVkIFJlYWQoKSBtZXRob2QKKyAgICAqIFtUSFJJRlQtMjU1MV0gLSBPdXRPZk1lbW9yeUVycm9yICJ1bmFibGUgdG8gY3JlYXRlIG5ldyBuYXRpdmUgdGhyZWFkIiBraWxscyBzZXJ2ZSB0aHJlYWQKKyAgICAqIFtUSFJJRlQtMjU0M10gLSBHZW5lcmF0ZWQgZW51bSB0eXBlIGluIGhhc2tlbGwgc2hvdWxkIGJlIHF1YWxpZmllZAorICAgICogW1RIUklGVC0yNTYwXSAtIFRocmlmdCBjb21waWxlciBnZW5lcmF0b3IgdHJpZXMgdG8gY29uY2F0IGludHMgd2l0aCBzdHJpbmdzIHVzaW5nICsKKyAgICAqIFtUSFJJRlQtMjU1OV0gLSBDZW50b3MgNi41IHVuYWJsZSB0byAibWFrZSIgd2l0aCBUaHJpZnQgMC45LjEKKyAgICAqIFtUSFJJRlQtMjUyNl0gLSBBc3NpZ25tZW50IG9wZXJhdG9ycyBhbmQgY29weSBjb25zdHJ1Y3RvcnMgaW4gYysrIGRvbid0IGNvcHkgdGhlIF9faXNzZXQgc3RydWN0CisgICAgKiBbVEhSSUZULTI0NTRdIC0gY19nbGliOiBUaGVyZSBpcyBubyBnZXRob3N0YnluYW1lX3IoKSBpbiBzb21lIE9TLgorICAgICogW1RIUklGVC0yNDUxXSAtIERvIG5vdCB1c2UgcG9pbnRlcnMgZm9yIG9wdGlvbmFsIGZpZWxkcyB3aXRoIGRlZmF1bHRzLiBEbyBub3Qgd3JpdGUgc3VjaCBmaWVsZHMgaWYgaXRzIHZhbHVlIHNldCB0byBkZWZhdWx0LiBBbHNvLCBkbyBub3QgdXNlIHBvaW50ZXJzIGZvciBhbnkgb3B0aW9uYWwgZmllbGRzIG1hcHBlZCB0byBnbyBtYXAgb3Igc2xpY2UuIGdlbmVyYXRlIEdldCBhY2Nlc3NvcnMKKyAgICAqIFtUSFJJRlQtMjQ1MF0gLSBpbmNsdWRlIEhvd1RvQ29udHJpYnV0ZSBpbiB0aGUgc3JjIHJlcG8KKyAgICAqIFtUSFJJRlQtMjQ0OF0gLSB0aHJpZnQvdGVzdC90ZXN0LnNoIGhhcyBpbmNvcnJlY3QgTm9kZS5qcyB0ZXN0IHBhdGgKKyAgICAqIFtUSFJJRlQtMjQ2MF0gLSB1bm9wZW5lZCBzb2NrZXQgZmQgbXVzdCBiZSBsZXNzIHRoYW4gemVyby4KKyAgICAqIFtUSFJJRlQtMjQ1OV0gLSAtLXZlcnNpb24gc2hvdWxkIG5vdCBleGl0IDEKKyAgICAqIFtUSFJJRlQtMjQ2OF0gLSBUaW1lc3RhbXAgaGFuZGxpbmcKKyAgICAqIFtUSFJJRlQtMjQ2N10gLSBVbmFibGUgdG8gYnVpbGQgY29udHJpYi9mYjMwMyBvbiBPU1ggMTAuOS4yCisgICAgKiBbVEhSSUZULTI0NjZdIC0gSW1wcm9wZXIgZXJyb3IgaGFuZGxpbmcgZm9yIFNTTC9UTFMgY29ubmVjdGlvbnMgdGhhdCBkb24ndCBjb21wbGV0ZSBhIGhhbmRzaGFrZQorICAgICogW1RIUklGVC0yNDYzXSAtIHRlc3QvcHkvUnVuQ2xpZW50U2VydmVyLnB5IGZhaWxzIHNvbWV0aW1lcworICAgICogW1RIUklGVC0yNDU4XSAtIEdlbmVyYXRlZCBnb2xhbmcgc2VydmVyIGNvZGUgZm9yICJvbmV3YXkiIG1ldGhvZHMgaXMgaW5jb3JyZWN0CisgICAgKiBbVEhSSUZULTI0NTZdIC0gVEh0dHBDbGllbnQgZmFpbHMgd2hlbiB1c2luZyBhc3luYyBzdXBwb3J0IG91dHNpZGUgU2lsdmVybGlnaHQKKyAgICAqIFtUSFJJRlQtMjUyNF0gLSBWaXN1YWwgU3R1ZGlvIHByb2plY3QgaXMgbWlzc2luZyBUVGhyZWFkZWRTZXJ2ZXIgZmlsZXMKKyAgICAqIFtUSFJJRlQtMjUyM10gLSBWaXN1YWwgU3R1ZGlvIHByb2plY3QgaXMgbWlzc2luZyBPdmVybGFwcGVkU3VibWlzc2lvblRocmVhZCBmaWxlcworICAgICogW1RIUklGVC0yNTIwXSAtIGNwcDpjb2Jfc3R5bGUgZ2VuZXJhdGVzIGluY29ycmVjdCAudGNjIGZpbGUKKyAgICAqIFtUSFJJRlQtMjUwOF0gLSBVbmNvbXBpbGVhYmxlIEMjIGNvZGUgZHVlIHRvIGxhbmd1YWdlIGtleXdvcmRzIGluIElETAorICAgICogW1RIUklGVC0yNTA2XSAtIFVwZGF0ZSBUUHJvdG9jb2xFeGNlcHRpb24gZXJyb3IgY29kZXMgdG8gYmUgdXNlZCBjb25zaXN0ZW50bHkgdGhyb3VnaG91dCB0aGUgbGlicmFyeQorICAgICogW1RIUklGVC0yNTA1XSAtIGdvOiBzdHJ1Y3Qgc2hvdWxkIGFsd2F5cyBiZSBhIHBvaW50ZXIgdG8gYXZvaWQgY29weWluZyBvZiBwb3RlbnRpYWxseSBzaXplLXVuYm91bmRlZCBzdHJ1Y3RzCisgICAgKiBbVEhSSUZULTI1MTVdIC0gVExTIE1ldGhvZCBlcnJvciBkdXJpbmcgbWFrZQorICAgICogW1RIUklGVC0yNTAzXSAtIEMrKzogRml4IG5hbWUgY29sbGlzaW9uIHdoZW4gYSBzdHJ1Y3QgaGFzIGEgbWVtYmVyIG5hbWVkICJ2YWwiCisgICAgKiBbVEhSSUZULTI0NzddIC0gdGhyaWZ0IC0taGVscCB0ZXh0IHdpdGggbWlzcGxhY2VkIGNvbW1hCisgICAgKiBbVEhSSUZULTI0OTJdIC0gdGVzdC9jcHAgZG9lcyBub3QgY29tcGlsZSBvbiBtYWMKKyAgICAqIFtUSFJJRlQtMjUwMF0gLSBzZW5kaW5nIHJhbmRvbSBkYXRhIGNyYXNoZXMgdGhyaWZ0KGdvbGFuZykgc2VydmljZQorICAgICogW1RIUklGVC0yNDc1XSAtIGNfZ2xpYjogYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlIGZ1bmN0aW9uIHJldHVybiBhbHdheXMgVFJVRS4KKyAgICAqIFtUSFJJRlQtMjQ5NV0gLSBKYXZhU2NyaXB0L05vZGUgc3RyaW5nIGNvbnN0YW50cyBsYWNrIHByb3BlciBlc2NhcGluZworICAgICogW1RIUklGVC0yNDkxXSAtIHVuYWJsZSB0byBpbXBvcnQgZ2VuZXJhdGVkIFRocmlmdFRlc3Qgc2VydmljZQorICAgICogW1RIUklGVC0yNDkwXSAtIGNfZ2xpYjogaWYgZmFpbCB0byByZWFkIGEgZXhjZXB0aW9uIGZyb20gc2VydmVyLCBjbGllbnQgbWF5IGJlIG9jY3VycmVkIGRvdWJsZSBmcmVlCisgICAgKiBbVEhSSUZULTI0NzBdIC0gVEh0dHBIYW5kbGVyIHN3YWxsb3dzIGV4Y2VwdGlvbnMgZnJvbSBwcm9jZXNzb3IKKyAgICAqIFtUSFJJRlQtMjUzM10gLSBCb29zdCB2ZXJzaW9uIGluIHJlcXVpcmVtZW50cyBzaG91bGQgYmUgdXBkYXRlZAorICAgICogW1RIUklGVC0yNTMyXSAtIEphdmEgdmVyc2lvbiBpbiBpbnN0YWxsYXRpb24gcmVxdWlyZW1lbnRzIHNob3VsZCBiZSB1cGRhdGVkCisgICAgKiBbVEhSSUZULTI1MjldIC0gVEJ1ZmZlcmVkVHJhbnNwb3J0IHNwbGl0ICBUY3AgZGF0YSBidWcgaW4gbm9kZUpzCisgICAgKiBbVEhSSUZULTI1MzddIC0gUGF0aCBmb3IgImdvIGdldCIgZG9lcyBub3Qgd29yayAocHVsbCByZXF1ZXN0IDExNSkKKyAgICAqIFtUSFJJRlQtMjQ0M10gLSBOb2RlIGZhaWxzIGNyb3NzIGxhbmcgdGVzdHMKKyAgICAqIFtUSFJJRlQtMjQzN10gLSBBdXRob3IgZmllbGRzIGluIFB5dGhvbiBzZXR1cC5weSBtdXN0IGJlIHN0cmluZ3Mgbm90IGxpc3RzLgorICAgICogW1RIUklGVC0yNDM1XSAtIEphdmEgY29tcGlsZXIgZG9lc24ndCBsaWtlIHN0cnVjdCBtZW1iZXIgbmFtZXMgdGhhdCBhcmUgaWRlbnRpY2FsIHRvIGFuIGV4aXN0aW5nIGVudW0gb3Igc3RydWN0IHR5cGUKKyAgICAqIFtUSFJJRlQtMjQzNF0gLSBNaXNzaW5nIG5hbWVzcGFjZSBpbXBvcnQgZm9yIHBocCBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IgaW1wbGVtZW50YXRpb24KKyAgICAqIFtUSFJJRlQtMjQzMl0gLSBGbGFreSBwYXJhbGxlbCBidWlsZAorICAgICogW1RIUklGVC0yNDMwXSAtIENyYXNoIGR1cmluZyBUVGhyZWFkUG9vbFNlcnZlciBzaHV0ZG93bgorICAgICogW1RIUklGVC02NjddIC0gUGVyaW9kIHNob3VsZCBub3QgYmUgYWxsb3dlZCBpbiBpZGVudGlmaWVyIG5hbWVzCisgICAgKiBbVEhSSUZULTEyMTJdIC0gTWVtYmVycyBjYXBpdGFsIGNhc2UgY29uZmxpY3QKKyAgICAqIFtUSFJJRlQtMjU4NF0gLSBFcnJvciBoYW5kbGVyIG5vdCBsaXN0ZW5lZCBvbiBqYXZhc2NyaXB0IGNsaWVudAogICAgICogW1RIUklGVC0yMjk0XSAtIEluY29ycmVjdCBNYWtlZmlsZSBnZW5lcmF0aW9uCi0gICAgKiBbVEhSSUZULTIyOTNdIC0gVFNTTFRyYW5zcG9ydEZhY3RvcnkuY3JlYXRlU1NMQ29udGV4dCgpIGxlYXZlcyBmaWxlcyBvcGVuCi0gICAgKiBbVEhSSUZULTIyNzRdIC0gVE5vbmJsb2NraW5nU2VydmVyIGFuZCBUVGhyZWFkZWRTZWxlY3RvclNlcnZlciBkbyBub3QgY2xvc2UgdGhlaXIgY2hhbm5lbCBzZWxlY3RvcnMgb24gZXhpdCBhbmQgbGVhayBmaWxlIGRlc2NyaXB0b3JzCisgICAgKiBbVEhSSUZULTI2MDFdIC0gRml4IHZhZ3JhbnQgdG8gd29yayBhZ2FpbiBmb3IgYnVpbGRzIGFnYWluCisgICAgKiBbVEhSSUZULTIwOTJdIC0gVE5vbmJsb2NraW5nIHNlcnZlciBzaG91bGQgcmVsZWFzZSBoYW5kbGVyIGFzIHNvb24gYXMgY29ubmVjdGlvbiBjbG9zZXMKKyAgICAqIFtUSFJJRlQtMjU1N10gLSBDUzA1NDIgbWVtYmVyIG5hbWVzIGNhbm5vdCBiZSB0aGUgc2FtZSBhcyB0aGVpciBlbmNsb3NpbmcgdHlwZQorICAgICogW1RIUklGVC0yNjA1XSAtIFRTb2NrZXQgd2FybmluZyBvbiBnY2MgNC44LjMKKyAgICAqIFtUSFJJRlQtMjYwN10gLSBUaHJlYWRNYW5hZ2VyLmNwcCB3YXJuaW5nIG9uIGNsYW5nKysgMy40CisgICAgKiBbVEhSSUZULTE5OThdIC0gVENvbXBhY3RQcm90b2NvbC50Y2MgLSBvbmUgbW9yZSB3YXJuaW5nIG9uIFZpc3VhbCAyMDEwCisgICAgKiBbVEhSSUZULTI2MTBdIC0gTVNWQyB3YXJuaW5nIGluIFRTb2NrZXQuY3BwCisgICAgKiBbVEhSSUZULTI2MTRdIC0gVE5vbmJsb2NraW5nU2VydmVyLmNwcCB3YXJuaW5ncyBvbiBNU1ZDCisgICAgKiBbVEhSSUZULTI2MDhdIC0gVE5vbmJsb2NraW5nU2VydmVyLmNwcCB3YXJuaW5ncyBvbiBjbGFuZyAzLjQKKyAgICAqIFtUSFJJRlQtMjYwNl0gLSBUaHJlYWRNYW5hZ2VyLmggd2FybmluZyBpbiBjbGFuZysrIDMuNAorICAgICogW1RIUklGVC0yNjA5XSAtIFRGaWxlVHJhbnNwb3J0LmggdW51c2VkIGZpZWxkIHdhcm5pbmcgKGNsYW5nIDMuNCkKKyAgICAqIFtUSFJJRlQtMjQxNl0gLSBDYW5ub3QgdXNlIFRDb21wYWN0UHJvdG9jb2wgd2l0aCBNU1ZDCisgICAgKiBbVEhSSUZULTE4MDNdIC0gUnVieSBUaHJpZnQgMC45LjAgdHJpZXMgdG8gZW5jb2RlIFVVSUQgdG8gVVRGOCBhbmQgY3Jhc2hlcworICAgICogW1RIUklGVC0yMzg1XSAtIFByb2JsZW0gd2l0aCBnZXRob3N0YnluYW1lMiBkdXJpbmcgbWFrZSBjaGVjaworICAgICogW1RIUklGVC0yMjYyXSAtIHRocmlmdCBzZXJ2ZXIgJ011dGF0ZVJvdycgb3BlcmF0aW9uIGdpdmVzIG5vIGluZGljYXRpb24gb2Ygc3VjY2VzcyAvIGZhaWx1cmUKKyAgICAqIFtUSFJJRlQtMjA0OF0gLSBQcmVmZXIgYm9vbGVhbiBjb250ZXh0IHRvIG51bGxwdHJfdCBjb252ZXJzaW9uCisgICAgKiBbVEhSSUZULTI1MjhdIC0gVGhyaWZ0IEVybGFuZyBMaWJyYXJ5OiBNdWx0aXBsZSB0aHJpZnQgYXBwbGljYXRpb25zIGluIG9uZSBidW5kbGUKKyAgICAqIFtUSFJJRlQtMTk5OV0gLSB3YXJuaW5nIG9uIGdjYyA0Ljcgd2hpbGUgY29tcGlsaW5nIEJvb3N0TXV0ZXguY3BwCisgICAgKiBbVEhSSUZULTIxMDRdIC0gU3RydWN0cyBsb3NlIGJpbmFyeSBkYXRhIHdoZW4gdHJhbnNmZXJyZWQgZnJvbSBzZXJ2ZXIgdG8gY2xpZW50IGluIEphdmEKKyAgICAqIFtUSFJJRlQtMjE4NF0gLSB1bmRlZmluZWQgbWV0aG9kIHJzcGVjX3ZlcmlmeSBmb3IgVGhyaWZ0OjpNZW1vcnlCdWZmZXJUcmFuc3BvcnQKKyAgICAqIFtUSFJJRlQtMjM1MV0gLSBQSFAgVENvbXBhY3RQcm90b2NvbCBoYXMgZmFpbHMgdG8gZGVjb2RlIG1lc3NhZ2VzCisgICAgKiBbVEhSSUZULTIwMTZdIC0gUmVzb3VyY2UgTGVhayBpbiB0aHJpZnQgc3RydWN0IHVuZGVyIGNvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9mdW5jdGlvbi5oCiAgICAgKiBbVEhSSUZULTIyNzNdIC0gUGxlYXNlIGRlbGV0ZSBvbGQgcmVsZWFzZXMgZnJvbSBtaXJyb3Jpbmcgc3lzdGVtCiAgICAgKiBbVEhSSUZULTIyNzBdIC0gRmF1bHR5IGxpYnJhcnkgdmVyc2lvbiBudW1iZXJpbmcgYXQgYnVpbGQgb3IgZG9jdW1lbnRhdGlvbgotICAgICogW1RIUklGVC0yMjY3XSAtIFNob3VsZCBiZSBhYmxlIHRvIGNob29zZSBzb2NrZXQgZmFtaWx5IGluIFB5dGhvbiBUU29ja2V0Ci0gICAgKiBbVEhSSUZULTIyNjZdIC0gVGhyZWFkTWFuYWdlci5oOjI0OjEwOiBmYXRhbCBlcnJvcjogJ3RyMS9mdW5jdGlvbmFsJyBmaWxlIG5vdCBmb3VuZCBvbiBNYWMgMTAuOSAoTWF2ZXJpY2tzKQotICAgICogW1RIUklGVC0yMjY1XSAtIHBocCBsaWJyYXJ5IGRvZXNuJ3QgYnVpbGQKLSAgICAqIFtUSFJJRlQtMjI2Ml0gLSB0aHJpZnQgc2VydmVyICdNdXRhdGVSb3cnIG9wZXJhdGlvbiBnaXZlcyBubyBpbmRpY2F0aW9uIG9mIHN1Y2Nlc3MgLyBmYWlsdXJlCi0gICAgKiBbVEhSSUZULTIyNjFdIC0gamF2YTogZXJyb3I6IHVubWFwcGFibGUgY2hhcmFjdGVyIGZvciBlbmNvZGluZyBBU0NJSQotICAgICogW1RIUklGVC0yMTA0XSAtIFN0cnVjdHMgbG9zZSBiaW5hcnkgZGF0YSB3aGVuIHRyYW5zZmVycmVkIGZyb20gc2VydmVyIHRvIGNsaWVudCBpbiBKYXZhCi0gICAgKiBbVEhSSUZULTIyMDldIC0gUnVieSBnZW5lcmF0b3IgLS0gcGxlYXNlIG5hbWVzcGFjZSBjbGFzc2VzCi0gICAgKiBbVEhSSUZULTIyMTBdIC0gbGliL2phdmEgVFNpbXBsZUpTT05Qcm90b2NvbCBjYW4gZW1pdCBpbnZhbGlkIEpTT04KLSAgICAqIFtUSFJJRlQtMjIwMV0gLSBUZXJuYXJ5IG9wZXJhdG9yIHJldHVybnMgZGlmZmVyZW50IHR5cGVzIChidWlsZCBlcnJvciBmb3Igc29tZSBjb21waWxlcnMpCi0gICAgKiBbVEhSSUZULTIyMDBdIC0gbmVzdGVkIHN0cnVjdHMgY2F1c2UgZ2VuZXJhdGVfZmluZ2VycHJpbnQoKSB0byBzbG93IGRvd24gYXQgZXhjZXNzaXZlIENQVSBsb2FkCi0gICAgKiBbVEhSSUZULTIxOTddIC0gZml4IGphciBvdXRwdXQgZGlyZWN0b3J5IGluIHJwbSBzcGVjIGZpbGUKLSAgICAqIFtUSFJJRlQtMjE5Nl0gLSBGaXggaW52YWxpZCBkZXBlbmRlbmN5IGluIE1ha2VmaWxlLmFtCi0gICAgKiBbVEhSSUZULTIxOTFdIC0gRml4IGNoYXJwIEpTT05Qcm90b2NvbC5SZWFkSlNPTkRvdWJsZSAoc3BlY2lmeSBJbnZhcmlhbnRDdWx0dXJlKQogICAgICogW1RIUklGVC0yMjAzXSAtIFRlc3RzIGtlZXBpbmcgZmFpbGluZyBvbiBKZW5raW5zIGFuZCBUcmF2aXMgQ0kKLSAgICAqIFtUSFJJRlQtMjIwMl0gLSBEZWxwaGkgVFNlcnZlckltcGwuRGVmYXVsdExvZ0RlbGVnYXRlIG1heSBzdG9wIHRoZSBzZXJ2ZXIgd2l0aCBJL08tRXJyb3IgMTA1Ci0gICAgKiBbVEhSSUZULTIxODddIC0gR3VhcmQgYWdhaW5zdCBhbWJpZ3VvdXMgb2NjdXJyZW5jZXMKLSAgICAqIFtUSFJJRlQtMjIxNF0gLSBTeXN0ZW0gaGVhZGVyIHN5cy9wYXJhbS5oIGlzIGluY2x1ZGVkIGluc2lkZSB0aGUgVGhyaWZ0IG5hbWVzcGFjZQotICAgICogW1RIUklGVC0yMjExXSAtIEV4Y2VwdGlvbiBjb25zdHJ1Y3RvciBkb2VzIG5vdCBjb250YWluIG5hbWVzcGFjZSBwcmVmaXguCi0gICAgKiBbVEhSSUZULTIxOTRdIC0gTm9kZTogTm90IGFjdHVhbGx5IHByZXBlbmRpbmcgcmVzaWR1YWwgZGF0YSBpbiBURnJhbWVkVHJhbnNwb3J0LnJlY2VpdmVyCi0gICAgKiBbVEhSSUZULTIxOTNdIC0gSmF2YSBjb2RlIGdlbmVyYXRvciBlbWl0cyBzcHVyaW91cyBzZW1pY29sb24gd2hlbiBkZWVwIGNvcHlpbmcgYmluYXJ5IGRhdGEKLSAgICAqIFtUSFJJRlQtMjE4NF0gLSB1bmRlZmluZWQgbWV0aG9kIHJzcGVjX3ZlcmlmeSBmb3IgVGhyaWZ0OjpNZW1vcnlCdWZmZXJUcmFuc3BvcnQKLSAgICAqIFtUSFJJRlQtMjE4M10gLSBnZW0gaW5zdGFsbCBmYWlscyBvbiB6c2gKLSAgICAqIFtUSFJJRlQtMjEwOF0gLSBGaXggVEFzeW5jQ2xpZW50TWFuYWdlciB0aW1lb3V0IHJhY2UKLSAgICAqIFtUSFJJRlQtMjA5Ml0gLSBUTm9uYmxvY2tpbmcgc2VydmVyIHNob3VsZCByZWxlYXNlIGhhbmRsZXIgYXMgc29vbiBhcyBjb25uZWN0aW9uIGNsb3NlcwotICAgICogW1RIUklGVC0xOTk5XSAtIHdhcm5pbmcgb24gZ2NjIDQuNyB3aGlsZSBjb21waWxpbmcgQm9vc3RNdXRleC5jcHAKLSAgICAqIFtUSFJJRlQtMTk5OF0gLSBUQ29tcGFjdFByb3RvY29sLnRjYyAtIG9uZSBtb3JlIHdhcm5pbmcgb24gVmlzdWFsIDIwMTAKLSAgICAqIFtUSFJJRlQtMjAwOV0gLSBHbyByZWRlY2xhcmF0aW9uIGVycm9yCi0gICAgKiBbVEhSSUZULTIwMTZdIC0gUmVzb3VyY2UgTGVhayBpbiB0aHJpZnQgc3RydWN0IHVuZGVyIGNvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9mdW5jdGlvbi5oCi0gICAgKiBbVEhSSUZULTIwNDVdIC0gQysrIGNvbXBpbGVyIHdhcm5pbmcgYW5kIGJ1aWxkIGNsZWFudXAKLSAgICAqIFtUSFJJRlQtMjAyNl0gLSBGaXggVENvbXBhY3RQcm90b2NvbCA2NCBiaXQgYnVpbGRzCi0gICAgKiBbVEhSSUZULTIwMjVdIC0gRml4IFRTU0xTZXJ2ZXJTb2NrZXQgNjQtYml0IGJ1aWxkcwotICAgICogW1RIUklGVC0xOTY0XSAtICdJc3NldCcgY2F1c2VzIHByb2JsZW1zIHdpdGggQyMvLk5FVCBzZXJpYWxpemVycwotICAgICogW1RIUklGVC0xOTA4XSAtIFVzaW5nIHBocCB0aHJpZnRfcHJvdG9jb2wgYWNjZWxlcmF0ZWQgdHJhbnNmZXIgY2F1c2VzIGNvcmUgZHVtcAotICAgICogW1RIUklGVC0xODkyXSAtIFNvY2tldCB0aW1lb3V0cyBhcmUgZGVjbGFyZWQgaW4gbWlsbGktc2Vjb25kcywgYnV0IGFyZSBhY3R1YWxseSBzZXQgaW4gbWljcm8tc2Vjb25kcwotICAgICogW1RIUklGVC0yMDY5XSAtIFRQaXBlU2VydmVyIGNyZWF0ZXMgb3ZlcmxhcHBlZCBwaXBlcywgdGhlbiB1c2VzIHN5bmNocm9ub3VzIEkvTyBvbiB0aGVtIHdpdGggVFBpcGUKLSAgICAqIFtUSFJJRlQtMjA2OF0gLSBNdWx0aXBsZSBjYWxscyBmcm9tIHNhbWUgY29ubmVjdGlvbiBhcmUgbm90IHByb2Nlc3NlZCBpbiBub2RlCi0gICAgKiBbVEhSSUZULTIwNDhdIC0gUHJlZmVyIGJvb2xlYW4gY29udGV4dCB0byBudWxscHRyX3QgY29udmVyc2lvbgotICAgICogW1RIUklGVC0yMDQxXSAtIFROb25ibG9ja2luZyBzZXJ2ZXIgY29tcGlsYXRpb24gb24gd2luZG93cyAoQVJJVEhNRVRJQ19SSUdIVF9TSElGVCkKKyAgICAqIFtUSFJJRlQtMjM5OV0gLSB0aHJpZnQuZWw6IHJlY29nbml6ZSAiLy8iLXN0eWxlIGNvbW1lbnRzIGluIGVtYWNzIHRocmlmdC1tb2RlCisgICAgKiBbVEhSSUZULTI1ODJdIC0gIkZpbGVUcmFuc3BvcnQgZXJyb3IiIGV4Y2VwdGlvbiBpcyByYWlzZWQgd2hlbiB0cnlpbmcgdG8gdXNlIEphdmEncyBURmlsZVRyYW5zcG9ydAogICAgICogW1RIUklGVC0xNjgyXSAtIE11bHRpcGxlIHRocmVhZCBjYWxsaW5nIGEgU2VydmljZSBmdW5jdGlvbiB1bnNhZmVseSBjYXVzZXMgbWVzc2FnZSBjb3JydXB0aW9uIGFuZCB0ZXJtaW5hdGVzIHdpdGggQnJva2VuIFBpcGUKLSAgICAqIFtUSFJJRlQtMTY0N10gLSBOb2RlSlMgQnVmZmVyZWRUcmFuc3BvcnQgZG9lcyBub3Qgd29yayBiZXlvbmQgdGhlIGhlbGxvLXdvcmxkIGV4YW1wbGUKLSAgICAqIFtUSFJJRlQtMTYzOV0gLSBKYXZhL1B5dGhvbjogU2VyaWFsaXphdGlvbi9EZXNlcmlhbGl6YXRpb24gb2YgZG91YmxlIHR5cGUgdXNpbmcgQ29tcGFjdFByb3RvY29sCi0gICAgKiBbVEhSSUZULTE3NzFdIC0gIm1ha2UgY2hlY2siIGZhaWxzIG9uIHg2NCBmb3IgbGliYm9vc3RfdW5pdF90ZXN0X2ZyYW1ld29yay5hCi0gICAgKiBbVEhSSUZULTE4NDFdIC0gTm9kZUpTIFRocmlmdCBpbmNvcnJlY3RseSBwYXJzZXMgbm9uLVVURjgtc3RyaW5nIHR5cGVzCi0gICAgKiBbVEhSSUZULTE3NTVdIC0gQ29tbWVudCBwYXJzaW5nIGJ1ZwotICAgICogW1RIUklGVC0xNzUwXSAtIE1ha2UgY29tcGlsZXIgYnVpbGQgY2xlYW5seSB1bmRlciB2aXN1YWwgc3R1ZGlvIDEwCi0gICAgKiBbVEhSSUZULTE4MDNdIC0gUnVieSBUaHJpZnQgMC45LjAgdHJpZXMgdG8gZW5jb2RlIFVVSUQgdG8gVVRGOCBhbmQgY3Jhc2hlcworICAgICogW1RIUklGVC0yMzU3XSAtIHJlY3Vyc2Ugb3B0aW9uIGhhcyBubyBlZmZlY3Qgd2hlbiBnZW5lcmF0aW5nIHBocAorICAgICogW1RIUklGVC0yMjQ4XSAtIEdvIGdlbmVyYXRvciBkb2Vzbid0IGRlYWwgd2VsbCB3aXRoIG1hcCBrZXlzIG9mIHR5cGUgYmluYXJ5CisgICAgKiBbVEhSSUZULTI0MjZdIC0gY2xhcmlmeSBJUCByaWdodHMgYW5kIGNvbnRyaWJ1dGlvbnMgZnJvbSBmYnRocmlmdAorICAgICogW1RIUklGVC0yMDQxXSAtIFROb25ibG9ja2luZyBzZXJ2ZXIgY29tcGlsYXRpb24gb24gd2luZG93cyAoQVJJVEhNRVRJQ19SSUdIVF9TSElGVCkKKyAgICAqIFtUSFJJRlQtMjQwMF0gLSB0aHJpZnQuZWw6IHJlY29nbml6ZSAiLy8iLXN0eWxlIGNvbW1lbnRzIGluIGVtYWNzIHRocmlmdC1tb2RlCiAgICAgKiBbVEhSSUZULTE3MTddIC0gRml4IGRlYiBidWlsZCBpbiBqZW5raW5zCi0gICAgKiBbVEhSSUZULTE2MDldIC0gQ29jb2EgaW1wb3J0IG5hbWVzcGFjZQotICAgICogW1RIUklGVC0xNjE0XSAtIFRocmlmdCBidWlsZCBmcm9tIHN2biByZXBvIHNvdXJjZXMgZmFpbHMgd2l0aCBhdXRvbWFrZS0xLjEyCi0gICAgKiBbVEhSSUZULTE1ODRdIC0gRXJyb3I6IGNvdWxkIG5vdCBTZXRNaW5UaHJlYWRzIGluIFRocmVhZFBvb2wgb24gc2luZ2xlLWNvcmUgbWFjaGluZXMKLSAgICAqIFtUSFJJRlQtMTU3OV0gLSBQSFAgRXh0ZW50aW9uIC0gZnVuY3Rpb24gdGhyaWZ0X3Byb3RvY29sX3JlYWRfYmluYXJ5IG5vdCB3b3JraW5nIGZyb20gVEJpbmFyeVNlcmlhbGl6ZXI6OmRlc2VyaWFsaXplCi0gICAgKiBbVEhSSUZULTE0NTVdIC0gVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfPjo6d3JpdGVTdHJpbmcgY2FzdHMgZnJvbSBzaXplX3QgdG8gdWludDMyX3QsIHdoaWNoIGlzIG5vdCBzYWZlIG9uIDY0LWJpdCBwbGF0Zm9ybXMKLSAgICAqIFtUSFJJRlQtMTQ4MV0gLSBVbml4IGRvbWFpbiBzb2NrZXRzIGluIEMrKyBkbyBub3Qgc3VwcG9ydCB0aGUgYWJzdHJhY3QgbmFtZXNwYWNlCi0gICAgKiBbVEhSSUZULTEzNTddIC0gRXJsYW5nIERlcGVuZGVuY3kgYnJlYWtzIGJ1aWxkCi0gICAgKiBbVEhSSUZULTEyNjBdIC0gVGhlIHRocmlmdCBUSHR0cGNsaWVudCBpbiBjIyBjbGllbnQgaXMgbm90IGNsb3NpbmcgdGhlIGNvbm5lY3Rpb25zIHdoZW4gY2FsbGluZyBTZW5kUmVxdWVzdAorICAgICogW1RIUklGVC0yMjY2XSAtIFRocmVhZE1hbmFnZXIuaDoyNDoxMDogZmF0YWwgZXJyb3I6ICd0cjEvZnVuY3Rpb25hbCcgZmlsZSBub3QgZm91bmQgb24gTWFjIDEwLjkgKE1hdmVyaWNrcykKICAgICAqIFtUSFJJRlQtMTMwMF0gLSBUZXN0IGZhaWx1cmVzIHdpdGggcGFyYWxsZWwgYnVpbGRzIChtYWtlIC1qKQotICAgICogW1RIUklGVC0xMjEyXSAtIE1lbWJlcnMgY2FwaXRhbCBjYXNlIGNvbmZsaWN0CisgICAgKiBbVEhSSUZULTI0ODddIC0gVHV0b3JpYWwgcmVxdWlyZXMgdHdvIElETCBmaWxlcyBidXQgb25seSBvbmUgaXMgbGlua2VkIGZyb20gdGhlIFRocmlmdCB3ZWIgc2l0ZQorICAgICogW1RIUklGVC0yMzI5XSAtIG1pc3NpbmcgcmVsZWFzZSB0YWdzIHdpdGhpbiBnaXQKKyAgICAqIFtUSFJJRlQtMjMwNl0gLSBjb25jdXJlbnQgY2xpZW50IGNhbGxzIHdpdGggbm9kZWpzCisgICAgKiBbVEhSSUZULTIyMjJdIC0gcnVieSBnZW0gY2Fubm90IGJlIGNvbXBpbGVkIG9uIE9TIFggbWF2ZXJpY2tzCisgICAgKiBbVEhSSUZULTIzODFdIC0gY29kZSB3aGljaCBnZW5lcmF0ZWQgYnkgdGhyaWZ0Mi9oYmFzZS50aHJpZnQgY29tcGlsZSBlcnJvcgorICAgICogW1RIUklGVC0yMzkwXSAtIG5vIGNsb3NlIGV2ZW50IHdoZW4gY29ubmVjdGlvbiBsb3N0CisgICAgKiBbVEhSSUZULTIxNDZdIC0gVW5hYmxlIHRvIHBhc3MgbXVsdGlwbGUgIi0tZ2VuIiBvcHRpb25zIHRvIHRoZSB0aHJpZnQgY29tcGlsZXIKKyAgICAqIFtUSFJJRlQtMjQzOF0gLSBVbmV4cGVjdGVkIHJlYWRGaWVsZEVuZCBjYWxsIGNhdXNlcyBKU09OIFBhcnNpbmcgZXJyb3JzCisgICAgKiBbVEhSSUZULTI0OThdIC0gRXJyb3IgbWVzc2FnZSAiSW52YWxpZCBtZXRob2QgbmFtZSIgd2hpbGUgdHJ5aW5nIHRvIGNhbGwgSEJhc2UgVGhyaWZ0IEFQSQogICAgICogW1RIUklGVC04NDFdIC0gQnVpbGQgY3J1ZnQKLSAgICAqIFtUSFJJRlQtMTA0N10gLSByYl90aHJpZnRfbWVtb3J5X2J1ZmZlcl93cml0ZSB0cmVhdHMgYXJnIGFzIHN0cmluZyB3aXRob3V0IGNoZWNrLCBzZWdmYXVsdHMgaWYgeW91IHBhc3Mgbm9uLXN0cmluZwotICAgICogW1RIUklGVC02NjddIC0gUGVyaW9kIHNob3VsZCBub3QgYmUgYWxsb3dlZCBpbiBpZGVudGlmaWVyIG5hbWVzCi0gICAgKiBbVEhSSUZULTEzODldIC0gY19nbGliX2dlbmVyYXRvci5jYyBnZW5lcmF0ZXMgbGVha2luZyBjb2RlIGZvciBjYXNzYW5kcmFfY2xpZW50X2dldF9zbGljZSgpIGFuZCBjYXNzYW5kcmFfY2xpZW50X2dldCgpCi0gICAgKiBbVEhSSUZULTI2NzVdIC0gbWQ1IGZpbGUgY29udGVudCBpcyBtYWxmb3JtZWQgaW4gdGhlIGRvd25sb2FkIHdlYnNpdGUKLSAgICAqIFtUSFJJRlQtMjI4NF0gLSBqYXZhLmxhbmcuT3V0T2ZNZW1vcnlFcnJvcjogSmF2YSBoZWFwIHNwYWNlCi0gICAgKiBbVEhSSUZULTI1OTZdIC0gQ2Fubm90IGNvbXBpbGUgaGFza2VsbCB0aHJpZnQgMC42LjAKLSAgICAqIFtUSFJJRlQtMjA2NF0gLSBOb2RlIHRocmlmdCBjYW4ndCBoYW5kbGUgbWFwcyB3aXRoIHByaW1pdGl2ZSB2YWx1ZXMKLSAgICAqIFtUSFJJRlQtMjY1Nl0gLSAuL2NvbmZpZ3VyZSBtaXMtcmVwb3J0cyBtaW5pbXVtIGJpc29uIHZlcnNpb24gcmVxdWlyZWQKLSAgICAqIFtUSFJJRlQtOTA4XSAtIE1ha2UgcmVxdWlyZWQgdHlwZXMgYWN0dWFsbHkgcmVxdWlyZWQgYnkgdGhlIEhhc2tlbGwgdHlwZSBzeXN0ZW0KLSAgICAqIFtUSFJJRlQtMjY5MF0gLSBjX2dsaWI6IEluY29ycmVjdCBiZWhhdmlvdXIgd2hlbiBzZXJpYWxpemluZyBhIG1hcCB3aXRoIHR5cGVkZWYnZCBrZXlzCi0gICAgKiBbVEhSSUZULTI2NTFdIC0gc3RydWN0IG5hbWVzIHRoYXQgYXJlIHJlc3RyaWN0ZWQgZXJsYW5nIHRlcm1zIGdlbmVyYXRlIGludmFsaWQgdHlwZSBzaWduYXR1cmVzCi0gICAgKiBbVEhSSUZULTI2NjddIC0gY3JlYXRlIFdpbmRvd3MgSW5zdGFsbGVyIHZpYSBDUGFjawotICAgICogW1RIUklGVC0xMDI4XSAtIGZpZWxkIG5hbWVzIG9mIHN0cnVjdHMgdXNlZCB3aXRoIHdyb25nIGNhc2luZyBpbiB0aGUgZ2VuZXJhdGVkIGhhc2tlbGwgY29kZQotICAgICogW1RIUklGVC0yNjQ3XSAtIGNvbXBpbGVyLWhzOiBkb24ndCBkZWNhcGl0YWxpemUgZmllbGQgbmFtZXMsIGRvIGRlY2FwaXRhbGl6ZSBhcmd1bWVudCBiaW5kaW5ncwotICAgICogW1RIUklGVC0yNjQ5XSAtIFRBc3luY0NsaWVudE1hbmFnZXIgbGVha3MgdGhlIHNlbGVjdG9yCi0gICAgKiBbVEhSSUZULTI2ODNdIC0gY19nbGliOiBTZWcgZmF1bHQgd2hlbiBkZXNlcmlhbGl6aW5nIGEgbWFwIHdpdGggdHlwZWRlZidkIGtleXMKLSAgICAqIFtUSFJJRlQtMjY4Nl0gLSBBbm90aGVyIGV4dHJhbmVvdXMgc2VtaWNvbG9uIC0gVEJpbmFyeVByb3RvY29sLmgKLSAgICAqIFtUSFJJRlQtMTQ5N10gLSBpNjQgdHlwZSBub3Qgc3VwcG9ydGVkIGluIEphdmFTY3JpcHQuIExvdy1vcmRlciBiaXRzIGxvc3QuCi0gICAgKiBbVEhSSUZULTEyNjZdIC0gZ2VuZXJhdGVkIEMgY29kZSBmb3IgaXRlcmF0aW5nIG92ZXIgbmVzdGVkIG1hcHMgaXMgd3JvbmcKLSAgICAqIFtUSFJJRlQtMjY4MF0gLSBjX2dsaWI6IFRocmlmdEZyYW1lZFRyYW5zcG9ydCBmYWlscyB3aGVuIHBlZXIgdW5leHBlY3RlZGx5IGNsb3NlcyBjb25uZWN0aW9uCi0gICAgKiBbVEhSSUZULTI2NjBdIC0gVmFsaWRhdGUgdGhlIGJ5dGVzIHJlY2VpdmVkIGluIFRTYXNsVHJhbnNwb3J0Ci0gICAgKiBbVEhSSUZULTIxNTJdIC0gR2VuZXJhdGVkIEhhc2tlbGwgZmlsZXMgZG9lcyBub3QgY29tcGlsZQotICAgICogW1RIUklGVC0yMTk4XSAtIFRIUklGVF9DTE9TRVNPQ0tFVCBvbiB3aW4zMiBwbGF0Zm9ybXMgaXMgd3JvbmcgZGVmaW5lZCBmb3IgVEZpbGVQcm90b2NvbAotICAgICogW1RIUklGVC0yNjczXSAtIFBIUDogZ2VuZXJhdGVkIFNlcnZpY2VfbWV0aG9kX3Jlc3VsdCBjb2RlIHNob3VsZCBub3QgaGF2ZSB2YWxpZGF0b3JzCi0gICAgKiBbVEhSSUZULTI2NTddIC0gcHkudHdpc3RlZC90ZXN0X3N1aXRlLnB5OlRocmlmdFRlc3RDYXNlLnRlc3RPbmV3YXkgc3B1cmlvdXNseSBmYWlscyBvbiBsb2FkZWQgbWFjaGluZXMKLSAgICAqIFtUSFJJRlQtMjYxN10gLSBNaXNzaW5nIC1sYm9vc3Rfc3lzdGVtIHdoZW4gY29tcGlsaW5nIHdpdGggYm9vc3QgdGhyZWFkcwotICAgICogW1RIUklGVC0yNjg3XSAtIHN0cnVjdC9jbGFzcyBpbmNvbnNpdGVuY3kgYmV0d2VlbiBmb3J3YXJkIGRlY2wgYW5kIGRlZmluaXRpb24KLSAgICAqIFtUSFJJRlQtMjY5Nl0gLSBVbmFibGUgdG8gc3RvcCBzb2NrZXQgc2VydmVyIHdoaWxlIHRoZXJlIGFyZSBpZGxlIGNsaWVudHMKLSAgICAqIFtUSFJJRlQtMjcwMl0gLSBlbXB0eSBlbnVtcyBsZWFkIHRvIGludmFsaWQgY29kZQotICAgICogW1RIUklGVC0yNjk0XSAtIE1pbm9yIGdsaXRjaGVzIGluIERlbHBoaSBjcm9zcy10ZXN0IGNvZGUKLSAgICAqIFtUSFJJRlQtMjcxNF0gLSBHcmFwaHZpeiBnZW5lcmF0b3IgaXMgbWlzc2luZyBmcm9tIE1TVkMrKyBwcm9qZWN0IGZpbGVzCi0gICAgKiBbVEhSSUZULTI3MDZdIC0gRCBsaWJyYXJ5IGRvZXMgbm90IHN1cHBvcnQgIm9uZXdheSIgbWVzc2FnZSB0eXBlCi0gICAgKiBbVEhSSUZULTI2NzZdIC0gQ29jb2EgY29kZSBnZW5lcmF0b3IgZW1pdHMgcmVzZXJ2ZWQgc3ltYm9sLCAnaTM4NicKLSAgICAqIFtUSFJJRlQtMjU0M10gLSBHZW5lcmF0ZWQgZW51bSB0eXBlIGluIGhhc2tlbGwgc2hvdWxkIGJlIHF1YWxpZmllZAotICAgICogW1RIUklGVC0yNTI2XSAtIEFzc2lnbm1lbnQgb3BlcmF0b3JzIGFuZCBjb3B5IGNvbnN0cnVjdG9ycyBpbiBjKysgZG9uJ3QgY29weSB0aGUgX19pc3NldCBzdHJ1Y3QKLSAgICAqIFtUSFJJRlQtMjMzOV0gLSBVbmNhdWdodCBleGNlcHRpb24gaW4gdGhyaWZ0IGMjIGRyaXZlcgotICAgICogW1RIUklGVC0yNzE5XSAtIE9iamVjdERpc3Bvc2VkRXhjZXB0aW9uIGluIFRTb2NrZXQgd2hlbiBzZW5kaW5nIHJhcGlkbHkKLSAgICAqIFtUSFJJRlQtMjcwN10gLSBSdWJ5IGxpYnJhcnkgZG9lcyBub3Qgc3VwcG9ydCAib25ld2F5IiBtZXNzYWdlIHR5cGUKLSAgICAqIFtUSFJJRlQtMjcwMV0gLSBVcGRhdGUgVENvbXBhY3RQcm90b2NvbC5waHAKLSAgICAqIFtUSFJJRlQtMjcxMV0gLSBUcmF2aXMgcmVwb3J0cyBmYWxzZSBwb3NzaXRpdmUgd2hpbGUgYnVpbGRpbmcgd2l0aCBtaW5ndwotICAgICogW1RIUklGVC0yNjkzXSAtIEVybGFuZyB0ZXN0IGxlYXZlcyBhIGxvdCBvZiBnZW5lcmF0ZWQgZmlsZXMKLSAgICAqIFtUSFJJRlQtMjcxNl0gLSBhdXRvbWFrZS0xLjEzLjQgcmVwb3J0cyB3YXJuaW5ncyBmb3Igc29tZSBNYWtlZmlsZS5hbQotICAgICogW1RIUklGVC0yNjY0XSAtIFB5dGhvbiB0b3JuYWRvIGdlbmVyYXRlZCBvbmV3YXkgY2xpZW50IGZ1bmN0aW9ucyBjcmFzaCBvbiBzZXJ2ZXIgZXJyb3IKLSAgICAqIFtUSFJJRlQtMjY2Ml0gLSBweXRob24gYmluZGluZ3MgZ2VuZXJhdGUgaW5jb3JyZWN0IGluZGVudGF0aW9uIGZvciBmdW5jdGlvbnMgYWZ0ZXIgYSBvbmV3YXkgZnVuY3Rpb24KLSAgICAqIFtUSFJJRlQtMjY2M10gLSBweXRob24gbGlicmFyeSBzaG91bGQgbm90IHVzZSB0aGUgcm9vdCBsb2dnZXIKKyAgICAqIFtUSFJJRlQtMjU3MF0gLSBXcm9uZyBVUkwgZ2l2ZW4gaW4gaHR0cDovL3RocmlmdC5hcGFjaGUub3JnL2RldmVsb3BlcnMKKyAgICAqIFtUSFJJRlQtMjYwNF0gLSBGaXggZGViaWFuIHBhY2thZ2luZworICAgICogW1RIUklGVC0yNjE4XSAtIFVuaWdub3JlIC9hY2xvY2FsIGZpbGVzIHJlcXVpcmVkIGZvciBidWlsZAorICAgICogW1RIUklGVC0yNTYyXSAtIC4vY29uZmlndXJlIGNyZWF0ZSBNYWtlRmlsZSBpbiBsaWIvZCB3aXRoIGVycm9ycwogICAgICogW1RIUklGVC0yNTkzXSAtIFVuYWJsZSB0byBidWlsZCB0aHJpZnQgb24gdWJ1bnR1LTEyLjA0IChQcmVjaXNlKQotICAgICogW1RIUklGVC01ODVdIC0gZXhjZXB0aW9ucyBpbiB0aGUgYXV0b2dlbmVyYXRlZCBzZW5kX01FVEhPRCBmdW5jdGlvbnMgYXJlIG5vdCBwcm9wYWdhdGVkIChUd2lzdGVkKQotICAgICogW1RIUklGVC0yNjY5XSAtIGphdmFzY3JpcHQgdGhyaWZ0IGxpYnJhcnkgY2FuIG5vdCBkZXNlcmlhbGl6ZSBuZXN0ZWQgbGlzdDxtYXA+IHN0cnVjdHVyZQotICAgICogW1RIUklGVC0xODQ3XSAtIFRTU0xTb2NrZXQuY3BwIGFuZCBURmlsZVRyYW5zcG9ydC5jcHAgaW5jb3JyZWN0bHkgZXhjbHVkZWQgZnJvbSBWaXN1YWwgU3R1ZGlvIHByb2plY3QgZmlsZQotICAgICogW1RIUklGVC0yNzQ1XSAtIEMrKyAtIFVuaXQtdGVzdCBjb21waWxhdGlvbiBvbiBXaW5kb3dzIGZpeGVzCi0gICAgKiBbVEhSSUZULTI2NjVdIC0gdG9ybmFkbyBsaWJyYXJ5IGRlYnVnIG1lc3NhZ2VzIGFyZSB0b28gdmVyYm9zZQotICAgICogW1RIUklGVC0yNzE1XSAtIFdyb25nIEltcG9ydC1QYWNrYWdlIGRpcmVjdGl2ZSBpbiBNQU5JRkVTVAotICAgICogW1RIUklGVC0yMjI5XSAtIHRocmlmdCBmYWlsZWQgdG8gYnVpbGQgb24gT1NYIDEwLjkgR00KLSAgICAqIFtUSFJJRlQtMjc1OV0gLSBUcnVzdHkgVmFncmFudGZpbGUgZG9lcyBub3QgbWFrZSBjbGVhbgotICAgICogW1RIUklGVC0yMTg2XSAtIEJ1aWxkIGZhaWx1cmUgb2YgSGFza2VsbCBleGFtcGxlCi0gICAgKiBbVEhSSUZULTI3NzhdIC0gbm9kZWpzIGJ1aWxkIGNsZWFudXAKLSAgICAqIFtUSFJJRlQtMjU4OV0gLSBDIyBnZW5lcmF0b3I6IGNvbnN0IG9mIEJhc2VUeXBlIGluIElETCBnZW5lcmF0ZXMgc3RhdGljIGluc3RlYWQgb2YgY29uc3QgcHJvcGVydGllcworICAgICogW1RIUklGVC0yNDYxXSAtIENhbid0IGluc3RhbGwgdGhyaWZ0LTAuOC4wIG9uIE9TIFggMTAuOS4yCiAgICAgKiBbVEhSSUZULTI2MDJdIC0gRml4IG1pc3NpbmcgZGlzdCBmaWxlcwotICAgICogW1RIUklGVC0xOTQwXSAtIERlcGxveSBIYXNrZWxsIHBhY2thZ2UgYXMgcGFydCBvZiByZWxlYXNlIHByb2Nlc3MKLSAgICAqIFtUSFJJRlQtMjcwMF0gLSBDb21waWxpbmcgZnJvbSBzb3VyY2UgZm9yIGhhc2tlbGwgcmV2ZWFscyBhIG1pc3NpbmcgY2FiYWwgZGVwZW5kZW5jeQotICAgICogW1RIUklGVC0yNzkyXSAtIFdyb25nIG9wdGlvbiBsZXZlbCBmb3Igc2V0c29ja29wdCguLi5UQ1BfREVGRVJfQUNDRVBUKQotICAgICogW1RIUklGVC0yNzY5XSAtIEQ6IHN0ZC50cmFpdHMucG9pbnRlclRhcmdldCBpcyBkZXByZWNhdGVkCi0gICAgKiBbVEhSSUZULTI3MjJdIC0gRml4IGphdmFzY3JpcHQgc2VydmljZSBpbmhlcml0YW5jZSBuYW1lc3BhY2luZwotICAgICogW1RIUklGVC0yNjI4XSAtIGVybGFuZzogc3RydWN0IG1lbWJlciBuYW1lIGNvbmZsaWN0cyBkdWUgdG8gbG93ZXJjYXNlZCBuYW1lcwotICAgICogW1RIUklGVC0yNzU3XSAtIFRDb21wYWN0UHJvdG9jb2wgYW5kIFRKU09OUHJvdG9jb2wgbmVlZCBib3VuZGFyeSBjaGVja2luZwotICAgICogW1RIUklGVC0yNzc1XSAtIHN0YXRpYyBhc3NlcnQgZmFpbHMgaW4gc3JjL3RocmlmdC9pbnRlcm5hbC9jdGZlLmQKLSAgICAqIFtUSFJJRlQtMjc4MV0gLSBEIGNvbXBpbGVyIHN0dWNrIGF0IGlkbGdlbiBkdWUgdG8gY29tcGlsZXIgYnVnCi0gICAgKiBbVEhSSUZULTI3ODJdIC0gRDogVGltaW5nLWluc2Vuc2l0aXZlIHVuaXQgdGVzdHMgZm9yIHRocmlmdC5pbnRlcm5hbC5yZXNvdXJjZV9wb29sCi0gICAgKiBbVEhSSUZULTI2ODldIC0gc3RydWN0IG5hbWVzIHRoYXQgZGlmZmVyIG9ubHkgaW4gY2FwaXRhbGl6YXRpb24gb2YgZmlyc3QgY2hhcmFjdGVyIGdlbmVyYXRlIGJyb2tlbiBlcmxhbmcgY29kZQotICAgICogW1RIUklGVC0yNzY3XSAtIFRyYW5zcG9ydC5FbXB0eSBpcyBub3QgZXh0ZXJuYWxseSBhdmFpbGFibGUKLSAgICAqIFtUSFJJRlQtMjc4OF0gLSBKYXZhIGNsaWVudCBhbmQgc2VydmVyIGRvZXMgbm90IGVuYWJsZSB0Y3Aga2VlcCBhbGl2ZS4KLSAgICAqIFtUSFJJRlQtMjc3Nl0gLSBEIHRlc3RzIGZhaWxpbmcKLSAgICAqIFtUSFJJRlQtMjc3MF0gLSBEOiB0aHJpZnQuaW50ZXJuYWwudHJhaXRzIHVuaXR0ZXN0IGZhaWxzIGR1ZSB0byBzdGQubWV0YXN0cmluZ3MgaW1wb3J0Ci0gICAgKiBbVEhSSUZULTI3MjBdIC0gbm9kZWpzIC0gRXJyb3Igd2l0aCBlbnVtIGdlbmVyYXRpb24KLSAgICAqIFtUSFJJRlQtMjc3N10gLSBlcmxhbmcgbGliIHRlc3RzIG1heSBmYWlsIGR1ZSB0byBwZXJtaXNzaW9ucyBlcnJvcgorICAgICogW1RIUklGVC0yNjIwXSAtIEZpeCBweXRob24gcGFja2FnaW5nCisgICAgKiBbVEhSSUZULTI1NDVdIC0gVGVzdCBDUFAgZmFpbHMgdG8gYnVpbGQgKHBvc3NpYmx5IHR5cG8pCiAKICMjIERvY3VtZW50YXRpb24KKyAgICAqIFtUSFJJRlQtMjE1NV0gLSBBZGRpbmcgb25lIGxpbmVyIGd1aWRlIHRvIHJlbmFtZSB0aGUgdmVyc2lvbi5oLmluIGFuZCByZW5hbWUgdGhyaWZ0eS5jYy5oCisgICAgKiBbVEhSSUZULTE5OTFdIC0gQWRkIGV4Y2VwdGlvbnMgdG8gZXhhbXBsZXMKICAgICAqIFtUSFJJRlQtMjMzNF0gLSBhZGQgYSB0dXRvcmlhbCBmb3Igbm9kZSBKUwogICAgICogW1RIUklGVC0yMzkyXSAtIEFjdGlvbnNjcmlwdCB0dXRvcmlhbAogICAgICogW1RIUklGVC0yMzgzXSAtIGNvbnRyaWI6IHNhbXBsZSBmb3IgY29ubmVjdGluZyBUaHJpZnQgd2l0aCBSZWJ1cwogICAgICogW1RIUklGVC0yMzgyXSAtIGNvbnRyaWI6IHNhbXBsZSBmb3IgY29ubmVjdGluZyBUaHJpZnQgd2l0aCBTVE9NUAotICAgICogW1RIUklGVC0yMTU1XSAtIEFkZGluZyBvbmUgbGluZXIgZ3VpZGUgdG8gcmVuYW1lIHRoZSB2ZXJzaW9uLmguaW4gYW5kIHJlbmFtZSB0aHJpZnR5LmNjLmgKLSAgICAqIFtUSFJJRlQtMTk5MV0gLSBBZGQgZXhjZXB0aW9ucyB0byBleGFtcGxlcwogCiAjIyBJbXByb3ZlbWVudAotICAgICogW1RIUklGVC0yNjM5XSAtIGNfZ2xpYjogRXhwb3NlIGFzIHByb3BlcnRpZXMgbWVtYmVycyBvZiBnZW5lcmF0ZWQgc3RydWN0cwotICAgICogW1RIUklGVC0yNjUzXSAtIGltcHJvdmVkIERlbHBoaSBjb25zdCBnZW5lcmF0aW9uCi0gICAgKiBbVEhSSUZULTI2MzhdIC0gdHJhdmlzOiBidWlsZCB3aXRoIEhhc2tlbGwKLSAgICAqIFtUSFJJRlQtMjYzNl0gLSBjX2dsaWI6IFRocmlmdEFwcGxpY2F0aW9uRXhjZXB0aW9uOiBFeHBvc2UgInR5cGUiIGFuZCAibWVzc2FnZSIgcHJvcGVydGllcwotICAgICogW1RIUklGVC0yNjM1XSAtIFRyYXZpcyBDSSBidWlsZCBhbmQgdGVzdCBtYXRyaXgKLSAgICAqIFtUSFJJRlQtMjYzM10gLSByZW1vdmUgJ3RoaXMgaXMgYSBkdW1teSBzdHJ1Y3QnIHN0cnVjdHMgZnJvbSBnZW5lcmF0ZWQgZXJsYW5nCi0gICAgKiBbVEhSSUZULTI2MzJdIC0gUEhQOiBhZGQgInZhbGlkYXRlIiBvcHRpb24gdG8gZ2VuZXJhdGUgcmVhZC93cml0ZSB2YWxpZGF0aW9uIGNvZGUKLSAgICAqIFtUSFJJRlQtMjYyOV0gLSBKYXZhRG9jIHN0eWxlIGRvY3VtZW50YXRpb24gc2hvdWxkIGJlIHJldXNlZAotICAgICogW1RIUklGVC0yNjMxXSAtIGNfZ2xpYjogU3VwcG9ydCBzZXJ2aWNlIGluaGVyaXRhbmNlIGluIGNsaWVudHMKLSAgICAqIFtUSFJJRlQtMjYyNF0gLSBBZGQgIFRTZXJ2ZXJFdmVudEhhbmRsZXIgc3VwcG9ydCB0byBDIwotICAgICogW1RIUklGVC0yNjEyXSAtIEphdmEgVENvbXBhY3RQcm90b2NvbC5yZWFkQmluYXJ5IHplcm8gY29weWluZwotICAgICogW1RIUklGVC0yNjIxXSAtIEFkZCBiYXNpYyBkZWZhdWx0IGhhc2ggY29kZSBtZXRob2QgdG8gcHl0aG9uCi0gICAgKiBbVEhSSUZULTI1NzRdIC0gQ29tcGlsZXIgb3B0aW9uIHRvIGdlbmVyYXRlIG5hbWVzcGFjZSBkaXJlY3RvcmllcyBmb3IgUnVieQotICAgICogW1RIUklGVC0yNTY4XSAtIEltcGxlbWVudCBvd24gY2VydGlmaWNhdGUgaGFuZGxlcgotICAgICogW1RIUklGVC0yNTY5XSAtIEludHJvZHVjZSBmaWxlIHRvIHNwZWNpZnkgdGhpcmQgcGFydHkgbGlicmFyeSBsb2NhdGlvbnMgb24gV2luZG93cwotICAgICogW1RIUklGVC0yNTQ5XSAtIEdlbmVyYXRlIGpzb24gdGFnIGZvciBzdHJ1Y3QgbWVtYmVycy4gdXNlIGdvLnRhZyBhbm5vdGF0aW9uIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGdlbmVyYXRlZCB0YWcuCi0gICAgKiBbVEhSSUZULTI1NDFdIC0gcmVjbGFpbSBURnJhbWVkVHJhbnNwb3J0J3MgcmVhZCBhbmQgd3JpdGUgYnVmZmVycyBmb3IgdGhyaWZ0IGNwcAotICAgICogW1RIUklGVC0yNTM1XSAtIFRKU09OUHJvdG9jb2wgd2hlbiBzZXJpYWxpemVkIHlpZWxkcyBURmllbGQgaWRzIHJhdGhlciB0aGFuIG5hbWVzCi0gICAgKiBbVEhSSUZULTI1NDRdIC0gQWRkIHN1cHBvcnQgZm9yIHNvY2tldCB0cmFuc3BvcnQgZm9yIGMjIGxpYnJhcnkgd2hlbiB1c2luZyBXaW5kb3dzIFBob25lIHByb2plY3RzCi0gICAgKiBbVEhSSUZULTI1NTJdIC0gZWxpbWluYXRlIHdhcm5pbmcgZnJvbSBjb25maWd1cmUuYWMKLSAgICAqIFtUSFJJRlQtMjU3MV0gLSBTaW1wbGlmeSBjcm9zcyBjb21waWxhdGlvbiB1c2luZyBDTWFrZQotICAgICogW1RIUklGVC0yNTExXSAtIE5vZGUuanMgbmVlZHMgdGhlIGNvbXBhY3QgcHJvdG9jb2wKLSAgICAqIFtUSFJJRlQtMjU3OV0gLSBXaW5kb3dzIENFIHN1cHBvcnQKLSAgICAqIFtUSFJJRlQtMjM0MV0gLSBFbmFibGUgZ2VuZXJhdGlvbiBvZiBEZWxwaGkgWE1MRG9jIGNvbW1lbnRzIChhLmsuYS4gIkhlbHAgSW5zaWdodCIpCi0gICAgKiBbVEhSSUZULTIzMzJdIC0gUlBNQlVJTEQ6IHJ1biBib290c3RyYXAgKGlmIG5lZWRlZCkKLSAgICAqIFtUSFJJRlQtMjMzMF0gLSBHZW5lcmF0ZSBQSFBEb2MgY29tbWVudHMKLSAgICAqIFtUSFJJRlQtMjMyMF0gLSBQcm9ncmFtIGxldmVsIGRvY3RleHQgZG9lcyBub3QgZ2V0IGF0dGFjaGVkIGJ5IHBhcnNlcgorICAgICogW1RIUklGVC0xNDU3XSAtIENhcGFjaXR5IG9mIFRmcmFtZWRUcmFuc3BvcnQgd3JpdGUgYnVmZmVyIGlzIG5ldmVyIHJlc2V0CisgICAgKiBbVEhSSUZULTExMzVdIC0gTm9kZS5qcyB0dXRvcmlhbAorICAgICogW1RIUklGVC0xMzcxXSAtIFNvY2tldCB0aW1lb3V0cyAoU09fUkNWVElNRU8gYW5kIFNPX1NORFRJTUVPKSBub3Qgc3VwcG9ydGVkIG9uIFNvbGFyaXMKKyAgICAqIFtUSFJJRlQtMjE0Ml0gLSBNaW5vciB0d2Vha3MgdG8gdGhyaWZ0LmVsIGZvciBiZXR0ZXIgZW1hY3MgcGFja2FnZSBjb21wYXRpYmlsaXR5CisgICAgKiBbVEhSSUZULTIyNjhdIC0gTW9kaWZ5IFRTYXNsVHJhbnNwb3J0IHRvIGlnbm9yZSBUQ1AgaGVhbHRoIGNoZWNrcyBmcm9tIGxvYWRiYWxhbmNlcnMKKyAgICAqIFtUSFJJRlQtMjI2NF0gLSBHaXRIdWIgcGFnZSBpbmNvcnJlY3RseSBzdGF0ZXMgdGhhdCBUaHJpZnQgaXMgc3RpbGwgaW5jdWJhdGluZworICAgICogW1RIUklGVC0yMjYzXSAtIEFsd2F5cyBnZW5lcmF0ZSBnb29kIGhhc2hDb2RlIGZvciBKYXZhCisgICAgKiBbVEhSSUZULTIyMzNdIC0gSmF2YSBjb21waWxlciBzaG91bGQgZGVmZW5zaXZlbHkgY29weSBpdHMgYmluYXJ5IGlucHV0cworICAgICogW1RIUklGVC0yMjM5XSAtIEFkZHJlc3MgRmluZEJ1Z3MgZXJyb3JzCisgICAgKiBbVEhSSUZULTIyNDldIC0gQWRkIFNNUCBCdWlsZCBvcHRpb24gdG8gdGhyaWZ0LnNwZWMgKGFuZCB0aHJlZSBjb25maWcgZGVmaW5lcykKKyAgICAqIFtUSFJJRlQtMjI1NF0gLSBFeGNlcHRpb25zIGdlbmVyYXRlZCBieSBHbyBjb21waWxlciBzaG91bGQgaW1wbGVtZW50IGVycm9yIGludGVyZmFjZQorICAgICogW1RIUklGVC0yMjYwXSAtIFRocmlmdCBpbXBvc2VzIHVubmVlZGVkIGRlcGVuZGVuY3kgb24gY29tbW9ucy1sYW5nMworICAgICogW1RIUklGVC0yMjU4XSAtIEFkZCBUTFMgdjEuMS8xLjIgc3VwcG9ydCB0byBUU1NMU29ja2V0LmNwcAorICAgICogW1RIUklGVC0yMjA1XSAtIE5vZGUuanMgVGVzdCBTZXJ2ZXIgdG8gc3VwcG9ydCB0ZXN0LmpzIEphdmFTY3JpcHQgQnJvd3NlciB0ZXN0IGFuZCBzdW5kcnkgZml4ZXMKKyAgICAqIFtUSFJJRlQtMjIwNF0gLSBTU0wgY2xpZW50IGZvciB0aGUgY29jb2EgY2xpZW50CisgICAgKiBbVEhSSUZULTIxNzJdIC0gSmF2YSBjb21waWxlciBhbGxvY2F0ZXMgb3B0aW9uYWxzIGFycmF5IGZvciBldmVyeSBzdHJ1Y3Qgd2l0aCBhbiBvcHRpb25hbCBmaWVsZAorICAgICogW1RIUklGVC0yMTg1XSAtIHVzZSBjYWJhbCBpbnN0ZWFkIG9mIHJ1bmhhc2tlbGwgaW4gaGFza2VsbCBsaWJyYXJ5CisgICAgKiBbVEhSSUZULTE5MjZdIC0gUEhQIENvbnN0YW50IEdlbmVyYXRpb24gUmVmYWN0b3JpbmcKKyAgICAqIFtUSFJJRlQtMjAyOV0gLSBQb3J0IEMrKyB0ZXN0cyB0byBXaW5kb3dzCisgICAgKiBbVEhSSUZULTIwNTRdIC0gVFNpbXBsZUZpbGVUcmFuc3BvcnQgLSBKYXZhIExpYiBoYXMgbm8gc3RyYWlnaHQgZm9yd2FyZCBUVHJhbnNwb3J0IGJhc2VkIGZpbGUgdHJhbnNwb3J0CisgICAgKiBbVEhSSUZULTIwNDBdIC0gInVuaW5pdGlhbGl6ZWQgdmFyaWFibGUiIHdhcm5pbmdzIG9uIE1TVkMvd2luZG93cworICAgICogW1RIUklGVC0yMDM0XSAtIEdpdmUgZGV2ZWxvcGVycycgQysrIGNvZGUgZGlyZWN0IGFjY2VzcyB0byBzb2NrZXQgRkRzIG9uIHNlcnZlciBzaWRlCisgICAgKiBbVEhSSUZULTIwOTVdIC0gVXNlIHByaW50IGZ1bmN0aW9uIGZvciBQeXRob24gMyBjb21wYXRpYmxpdHkKKyAgICAqIFtUSFJJRlQtMTg2OF0gLSBNYWtlIHRoZSBUUEMgYmFja2xvZyBjb25maWd1cmFibGUgaW4gdGhlIEphdmEgc2VydmVycworICAgICogW1RIUklGVC0xODEzXSAtIEFkZCBAR2VuZXJhdGVkIGFubm90YXRpb24gdG8gZ2VuZXJhdGVkIGNsYXNzZXMKKyAgICAqIFtUSFJJRlQtMTgxNV0gLSBDb2RlIGdlbmVyYXRvcnMgbGluZSBidWZmZXIgb3V0cHV0CisgICAgKiBbVEhSSUZULTIzMDVdIC0gVEZyYW1lZFRyYW5zcG9ydCBlbXB0eSBjb25zdHJ1Y3RvciBzaG91bGQgcHJvYmFibHkgYmUgcHJpdmF0ZQorICAgICogW1RIUklGVC0yMzA0XSAtIE1vdmUgY2xpZW50IGFzc2lnbm1lbnRzIGZyb20gY29uc3RydXRvciBpbiBtZXRob2QKKyAgICAqIFtUSFJJRlQtMjMwOV0gLSBSdWJ5IChnZW0pICYgUEhQIFJQTSBzdWJwYWNrYWdlcwogICAgICogW1RIUklGVC0yMzE4XSAtIHBlcmw6IGRlcGVuZGVuY3kgQ2xhc3M6OkFjY2Vzc29yIG5vdCBjaGVja2VkCiAgICAgKiBbVEhSSUZULTIzMTddIC0gZXhjbHVkZSB0dXRvcmlhbCBmcm9tIGJ1aWxkCi0gICAgKiBbVEhSSUZULTIzMDldIC0gUnVieSAoZ2VtKSAmIFBIUCBSUE0gc3VicGFja2FnZXMKLSAgICAqIFtUSFJJRlQtMjM1NV0gLSBBZGQgU1NMIGFuZCBXZWIgU29ja2V0IFN1cHBvcnQgdG8gTm9kZSBhbmQgSmF2YVNjcmlwdAotICAgICogW1RIUklGVC0yMzUwXSAtIEFkZCBhc3luYyBjYWxscyB0byBub3JtYWwgSmF2YVNjcmlwdAorICAgICogW1RIUklGVC0yMzIwXSAtIFByb2dyYW0gbGV2ZWwgZG9jdGV4dCBkb2VzIG5vdCBnZXQgYXR0YWNoZWQgYnkgcGFyc2VyCiAgICAgKiBbVEhSSUZULTIzNDldIC0gR29sYW5nIC0gaW1wcm92ZSB0dXRvcmlhbAogICAgICogW1RIUklGVC0yMzQ4XSAtIFBIUCBHZW5lcmF0b3I6IGFkZCBhcnJheSB0eXBlaGludCB0byBmdW5jdGlvbnMKICAgICAqIFtUSFJJRlQtMjM0NF0gLSBjb25maWd1cmUuYWM6IGNvbXBpbGVyLW9ubHkgb3B0aW9uCiAgICAgKiBbVEhSSUZULTIzNDNdIC0gR29sYW5nIC0gUmV0dXJuIGEgc2luZ2xlIGVycm9yIGZvciBhbGwgZXhjZXB0aW9ucyBpbnN0ZWFkIG9mIG11bHRpcGxlIHJldHVybiB2YWx1ZXMKLSAgICAqIFtUSFJJRlQtMjMwNV0gLSBURnJhbWVkVHJhbnNwb3J0IGVtcHR5IGNvbnN0cnVjdG9yIHNob3VsZCBwcm9iYWJseSBiZSBwcml2YXRlCi0gICAgKiBbVEhSSUZULTIzMDRdIC0gTW92ZSBjbGllbnQgYXNzaWdubWVudHMgZnJvbSBjb25zdHJ1dG9yIGluIG1ldGhvZAotICAgICogW1RIUklGVC0yMzAwXSAtIEQgY29uZmlndXJlIGluZm8gb3V0cHV0IHNob3VsZCBmb2xsb3cgc2FtZSBmb3JtYXQgYXMgb3RoZXIgbGFuZ3VhZ2VzCi0gICAgKiBbVEhSSUZULTIyMzldIC0gQWRkcmVzcyBGaW5kQnVncyBlcnJvcnMKLSAgICAqIFtUSFJJRlQtMjIzM10gLSBKYXZhIGNvbXBpbGVyIHNob3VsZCBkZWZlbnNpdmVseSBjb3B5IGl0cyBiaW5hcnkgaW5wdXRzCi0gICAgKiBbVEhSSUZULTIyNjBdIC0gVGhyaWZ0IGltcG9zZXMgdW5uZWVkZWQgZGVwZW5kZW5jeSBvbiBjb21tb25zLWxhbmczCi0gICAgKiBbVEhSSUZULTIyNThdIC0gQWRkIFRMUyB2MS4xLzEuMiBzdXBwb3J0IHRvIFRTU0xTb2NrZXQuY3BwCi0gICAgKiBbVEhSSUZULTIyNTRdIC0gRXhjZXB0aW9ucyBnZW5lcmF0ZWQgYnkgR28gY29tcGlsZXIgc2hvdWxkIGltcGxlbWVudCBlcnJvciBpbnRlcmZhY2UKLSAgICAqIFtUSFJJRlQtMjI0OV0gLSBBZGQgU01QIEJ1aWxkIG9wdGlvbiB0byB0aHJpZnQuc3BlYyAoYW5kIHRocmVlIGNvbmZpZyBkZWZpbmVzKQotICAgICogW1RIUklGVC0yMjIwXSAtIEFkZCBhIG5ldyBzdHJ1Y3Qgc3RydWN0dj8KLSAgICAqIFtUSFJJRlQtMjQ5N10gLSBzZXJ2ZXIgYW5kIGNsaWVudCBmb3IgdGVzdC9nbywgYWxzbyBzZXZlcmFsIGZpeGVzIGFuZCBpbXByb3ZlbWVudHMKLSAgICAqIFtUSFJJRlQtMjQ5Nl0gLSBzZXJ2ZXIgYW5kIGNsaWVudCBmb3IgdGVzdC9nbywgYWxzbyBzZXZlcmFsIGZpeGVzIGFuZCBpbXByb3ZlbWVudHMKLSAgICAqIFtUSFJJRlQtMjQ5NF0gLSBBZGQgZW51bSB0b1N0cmluZyBoZWxwZXIgZnVuY3Rpb24gaW4gY19nbGliCi0gICAgKiBbVEhSSUZULTI1MDJdIC0gT3B0aW1pemUgZ28gaW1wbGVtZW50YXRpb25zIG9mIGJpbmFyeSBhbmQgY29tcGFjdCBwcm90b2NvbHMgZm9yIHNwZWVkCi0gICAgKiBbVEhSSUZULTI0NzFdIC0gTWFrZSBjcHAucmVmIGFubm90YXRpb24gbGFuZ3VhZ2UgYWdub3N0aWMKLSAgICAqIFtUSFJJRlQtMjQ0OV0gLSBFbmhhbmNlIHR5cGVkZWYgc3RydWN0dXJlIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gZm9yd2FyZHMgYW5kIHJlYWwgdHlwZWRlZnMKLSAgICAqIFtUSFJJRlQtMjQ1M10gLSBoYXNrZWxsIHR1dG9yaWFsOiBmaXggdXAgZGl2aXNpb24gYnkgMCBleGFtcGxlCi0gICAgKiBbVEhSSUZULTI0NTVdIC0gQWxsb3cgY2xpZW50IGNlcnRpZmljYXRlcyB0byBiZSB1c2VkIHdpdGggVEh0dHBDbGllbnQKLSAgICAqIFtUSFJJRlQtMjQ0Nl0gLSBUaGVyZSBpcyBubyB3YXkgdG8gaGFuZGxlIHNlcnZlciBzdHJlYW0gZXJyb3JzCi0gICAgKiBbVEhSSUZULTI0MzNdIC0gQWxsb3cgbWFudWFsIGNvbnRyb2wgb2YgT3BlblNTTCBpbml0aWFsaXphdGlvbi9jbGVhbnVwCi0gICAgKiBbVEhSSUZULTI0MTddIC0gQyMgVW5pb24gY2xhc3NlcyBhcmUgbm90IHBhcnRpYWwKLSAgICAqIFtUSFJJRlQtMjQxNV0gLSBOYW1lZCBwaXBlcyBzZXJ2ZXIgcGVyZm9ybWFuY2UgJiBtZXNzYWdlIG1vZGUKLSAgICAqIFtUSFJJRlQtMjQwN10gLSB1c2UgbWFya2Rvd24gKHJlbmFtZSBSRUFETUUgPT4gUkVBRE1FLm1kKQotICAgICogW1RIUklGVC0yNDA0XSAtIGVtaXQgd2FybmluZyBvbiAodHlwaWNhbGx5IGluZWZmaWNpZW50KSBsaXN0PGJ5dGU+Ci0gICAgKiBbVEhSSUZULTI0MDFdIC0gSGFza2VsbCB0dXRvcmlhbCBjb21waWxlcwotICAgICogW1RIUklGVC0yMzk4XSAtIEltcHJvdmUgTm9kZSBTZXJ2ZXIgTGlicmFyeQotICAgICogW1RIUklGVC0yMzk3XSAtIEFkZCBDT1JTIGFuZCBDU1Agc3VwcG9ydCBmb3IgSmF2YVNjcmlwdCBhbmQgTm9kZS5qcyBsaWJyYXJpZXMKLSAgICAqIFtUSFJJRlQtMjM5NF0gLSBUQ3VybENsaWVudDogYW4gSFRUUCB0cmFuc3BvcnQgaW1wbGVtZW50YXRpb24gdXNpbmcgbGliY3VybAorICAgICogW1RIUklGVC0yMzQxXSAtIEVuYWJsZSBnZW5lcmF0aW9uIG9mIERlbHBoaSBYTUxEb2MgY29tbWVudHMgKGEuay5hLiAiSGVscCBJbnNpZ2h0IikKKyAgICAqIFtUSFJJRlQtMjM1NV0gLSBBZGQgU1NMIGFuZCBXZWIgU29ja2V0IFN1cHBvcnQgdG8gTm9kZSBhbmQgSmF2YVNjcmlwdAorICAgICogW1RIUklGVC0yMzUwXSAtIEFkZCBhc3luYyBjYWxscyB0byBub3JtYWwgSmF2YVNjcmlwdAorICAgICogW1RIUklGVC0yMzMwXSAtIEdlbmVyYXRlIFBIUERvYyBjb21tZW50cworICAgICogW1RIUklGVC0yMzMyXSAtIFJQTUJVSUxEOiBydW4gYm9vdHN0cmFwIChpZiBuZWVkZWQpCiAgICAgKiBbVEhSSUZULTIzOTFdIC0gc2ltcGxlIHNvY2tldCB0cmFuc3BvcnQgZm9yIGFjdGlvbnNjcmlwdCAzLjAKLSAgICAqIFtUSFJJRlQtMjM4N10gLSBub2RlanM6IGV4dGVybmFsIGltcG9ydHMgc2hvdWxkIGJlIGNlbnRyYWxpemVkIGluIGluZGV4LmpzCiAgICAgKiBbVEhSSUZULTIzNzZdIC0gbm9kZWpzOiBhbGxvdyBQcm9taXNlIHN0eWxlIGNhbGxzIGZvciBjbGllbnQgYW5kIHNlcnZlcgogICAgICogW1RIUklGVC0yMzY5XSAtIEFkZCBzc2wgc3VwcG9ydCBmb3Igbm9kZWpzIGltcGxlbWVudGF0aW9uCi0gICAgKiBbVEhSSUZULTIxNDJdIC0gTWlub3IgdHdlYWtzIHRvIHRocmlmdC5lbCBmb3IgYmV0dGVyIGVtYWNzIHBhY2thZ2UgY29tcGF0aWJpbGl0eQotICAgICogW1RIUklGVC0yMTcyXSAtIEphdmEgY29tcGlsZXIgYWxsb2NhdGVzIG9wdGlvbmFscyBhcnJheSBmb3IgZXZlcnkgc3RydWN0IHdpdGggYW4gb3B0aW9uYWwgZmllbGQKLSAgICAqIFtUSFJJRlQtMjI2OF0gLSBNb2RpZnkgVFNhc2xUcmFuc3BvcnQgdG8gaWdub3JlIFRDUCBoZWFsdGggY2hlY2tzIGZyb20gbG9hZGJhbGFuY2VycwotICAgICogW1RIUklGVC0yMjYzXSAtIEFsd2F5cyBnZW5lcmF0ZSBnb29kIGhhc2hDb2RlIGZvciBKYXZhCi0gICAgKiBbVEhSSUZULTIyNjRdIC0gR2l0SHViIHBhZ2UgaW5jb3JyZWN0bHkgc3RhdGVzIHRoYXQgVGhyaWZ0IGlzIHN0aWxsIGluY3ViYXRpbmcKLSAgICAqIFtUSFJJRlQtMjA5NV0gLSBVc2UgcHJpbnQgZnVuY3Rpb24gZm9yIFB5dGhvbiAzIGNvbXBhdGlibGl0eQotICAgICogW1RIUklGVC0yMTg1XSAtIHVzZSBjYWJhbCBpbnN0ZWFkIG9mIHJ1bmhhc2tlbGwgaW4gaGFza2VsbCBsaWJyYXJ5Ci0gICAgKiBbVEhSSUZULTIyMDRdIC0gU1NMIGNsaWVudCBmb3IgdGhlIGNvY29hIGNsaWVudAotICAgICogW1RIUklGVC0yMjA1XSAtIE5vZGUuanMgVGVzdCBTZXJ2ZXIgdG8gc3VwcG9ydCB0ZXN0LmpzIEphdmFTY3JpcHQgQnJvd3NlciB0ZXN0IGFuZCBzdW5kcnkgZml4ZXMKLSAgICAqIFtUSFJJRlQtMjA1NF0gLSBUU2ltcGxlRmlsZVRyYW5zcG9ydCAtIEphdmEgTGliIGhhcyBubyBzdHJhaWdodCBmb3J3YXJkIFRUcmFuc3BvcnQgYmFzZWQgZmlsZSB0cmFuc3BvcnQKLSAgICAqIFtUSFJJRlQtMjAzN10gLSBNb3JlIGdlbmVyYWwgbWFjcm8gVEhSSUZUX1VOVVNFRF9WQVJJQUJMRQotICAgICogW1RIUklGVC0yMDI5XSAtIFBvcnQgQysrIHRlc3RzIHRvIFdpbmRvd3MKLSAgICAqIFtUSFJJRlQtMjAzNF0gLSBHaXZlIGRldmVsb3BlcnMnIEMrKyBjb2RlIGRpcmVjdCBhY2Nlc3MgdG8gc29ja2V0IEZEcyBvbiBzZXJ2ZXIgc2lkZQotICAgICogW1RIUklGVC0xOTI2XSAtIFBIUCBDb25zdGFudCBHZW5lcmF0aW9uIFJlZmFjdG9yaW5nCi0gICAgKiBbVEhSSUZULTIwNDBdIC0gInVuaW5pdGlhbGl6ZWQgdmFyaWFibGUiIHdhcm5pbmdzIG9uIE1TVkMvd2luZG93cworICAgICogW1RIUklGVC0yNDAxXSAtIEhhc2tlbGwgdHV0b3JpYWwgY29tcGlsZXMKKyAgICAqIFtUSFJJRlQtMjQxN10gLSBDIyBVbmlvbiBjbGFzc2VzIGFyZSBub3QgcGFydGlhbAorICAgICogW1RIUklGVC0yNDE1XSAtIE5hbWVkIHBpcGVzIHNlcnZlciBwZXJmb3JtYW5jZSAmIG1lc3NhZ2UgbW9kZQorICAgICogW1RIUklGVC0yNDA0XSAtIGVtaXQgd2FybmluZyBvbiAodHlwaWNhbGx5IGluZWZmaWNpZW50KSBsaXN0PGJ5dGU+CisgICAgKiBbVEhSSUZULTIzOThdIC0gSW1wcm92ZSBOb2RlIFNlcnZlciBMaWJyYXJ5CisgICAgKiBbVEhSSUZULTIzOTddIC0gQWRkIENPUlMgYW5kIENTUCBzdXBwb3J0IGZvciBKYXZhU2NyaXB0IGFuZCBOb2RlLmpzIGxpYnJhcmllcworICAgICogW1RIUklGVC0yNDA3XSAtIHVzZSBtYXJrZG93biAocmVuYW1lIFJFQURNRSA9PiBSRUFETUUubWQpCisgICAgKiBbVEhSSUZULTIzMDBdIC0gRCBjb25maWd1cmUgaW5mbyBvdXRwdXQgc2hvdWxkIGZvbGxvdyBzYW1lIGZvcm1hdCBhcyBvdGhlciBsYW5ndWFnZXMKKyAgICAqIFtUSFJJRlQtMjU3OV0gLSBXaW5kb3dzIENFIHN1cHBvcnQKKyAgICAqIFtUSFJJRlQtMjU3NF0gLSBDb21waWxlciBvcHRpb24gdG8gZ2VuZXJhdGUgbmFtZXNwYWNlIGRpcmVjdG9yaWVzIGZvciBSdWJ5CisgICAgKiBbVEhSSUZULTI1NzFdIC0gU2ltcGxpZnkgY3Jvc3MgY29tcGlsYXRpb24gdXNpbmcgQ01ha2UKKyAgICAqIFtUSFJJRlQtMjU2OV0gLSBJbnRyb2R1Y2UgZmlsZSB0byBzcGVjaWZ5IHRoaXJkIHBhcnR5IGxpYnJhcnkgbG9jYXRpb25zIG9uIFdpbmRvd3MKKyAgICAqIFtUSFJJRlQtMjU2OF0gLSBJbXBsZW1lbnQgb3duIGNlcnRpZmljYXRlIGhhbmRsZXIKKyAgICAqIFtUSFJJRlQtMjU1Ml0gLSBlbGltaW5hdGUgd2FybmluZyBmcm9tIGNvbmZpZ3VyZS5hYworICAgICogW1RIUklGVC0yNTQ5XSAtIEdlbmVyYXRlIGpzb24gdGFnIGZvciBzdHJ1Y3QgbWVtYmVycy4gdXNlIGdvLnRhZyBhbm5vdGF0aW9uIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGdlbmVyYXRlZCB0YWcuCisgICAgKiBbVEhSSUZULTI1NDRdIC0gQWRkIHN1cHBvcnQgZm9yIHNvY2tldCB0cmFuc3BvcnQgZm9yIGMjIGxpYnJhcnkgd2hlbiB1c2luZyBXaW5kb3dzIFBob25lIHByb2plY3RzCisgICAgKiBbVEhSSUZULTI0NTNdIC0gaGFza2VsbCB0dXRvcmlhbDogZml4IHVwIGRpdmlzaW9uIGJ5IDAgZXhhbXBsZQorICAgICogW1RIUklGVC0yNDQ5XSAtIEVuaGFuY2UgdHlwZWRlZiBzdHJ1Y3R1cmUgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBmb3J3YXJkcyBhbmQgcmVhbCB0eXBlZGVmcworICAgICogW1RIUklGVC0yNDQ2XSAtIFRoZXJlIGlzIG5vIHdheSB0byBoYW5kbGUgc2VydmVyIHN0cmVhbSBlcnJvcnMKKyAgICAqIFtUSFJJRlQtMjQ1NV0gLSBBbGxvdyBjbGllbnQgY2VydGlmaWNhdGVzIHRvIGJlIHVzZWQgd2l0aCBUSHR0cENsaWVudAorICAgICogW1RIUklGVC0yNTExXSAtIE5vZGUuanMgbmVlZHMgdGhlIGNvbXBhY3QgcHJvdG9jb2wKKyAgICAqIFtUSFJJRlQtMjQ5M10gLSBOb2RlLmpzIGxpYiBuZWVkcyBIVFRQIGNsaWVudAorICAgICogW1RIUklGVC0yNTAyXSAtIE9wdGltaXplIGdvIGltcGxlbWVudGF0aW9ucyBvZiBiaW5hcnkgYW5kIGNvbXBhY3QgcHJvdG9jb2xzIGZvciBzcGVlZAorICAgICogW1RIUklGVC0yNDk0XSAtIEFkZCBlbnVtIHRvU3RyaW5nIGhlbHBlciBmdW5jdGlvbiBpbiBjX2dsaWIKKyAgICAqIFtUSFJJRlQtMjQ3MV0gLSBNYWtlIGNwcC5yZWYgYW5ub3RhdGlvbiBsYW5ndWFnZSBhZ25vc3RpYworICAgICogW1RIUklGVC0yNDk3XSAtIHNlcnZlciBhbmQgY2xpZW50IGZvciB0ZXN0L2dvLCBhbHNvIHNldmVyYWwgZml4ZXMgYW5kIGltcHJvdmVtZW50cworICAgICogW1RIUklGVC0yNTM1XSAtIFRKU09OUHJvdG9jb2wgd2hlbiBzZXJpYWxpemVkIHlpZWxkcyBURmllbGQgaWRzIHJhdGhlciB0aGFuIG5hbWVzCisgICAgKiBbVEhSSUZULTIyMjBdIC0gQWRkIGEgbmV3IHN0cnVjdCBzdHJ1Y3R2PworICAgICogW1RIUklGVC0xMzUyXSAtIFRocmlmdCBzZXJ2ZXIKKyAgICAqIFtUSFJJRlQtOTg5XSAtIFB1c2ggYm9vc3QgbTQgbWFjcm9zIHVwc3RyZWFtCisgICAgKiBbVEhSSUZULTEzNDldIC0gUmVtb3ZlIHVubmVjZXNzYXJ5IHByaW50IG91dHMKKyAgICAqIFtUSFJJRlQtMjQ5Nl0gLSBzZXJ2ZXIgYW5kIGNsaWVudCBmb3IgdGVzdC9nbywgYWxzbyBzZXZlcmFsIGZpeGVzIGFuZCBpbXByb3ZlbWVudHMKKyAgICAqIFtUSFJJRlQtMTExNF0gLSBNYXZlbiBwdWJsaXNoIHNob3VsZG4ndCByZXF1aXJlIHBhc3N3b3JkcyBoYXJkY29kZWQgaW4gc2V0dGluZ3MueG1sCiAgICAgKiBbVEhSSUZULTIwNDNdIC0gdmlzdWFsIDIwMTAgd2FybmluZ3MgLSB1bnJlYWNoYWJsZSBjb2RlCiAgICAgKiBbVEhSSUZULTE2ODNdIC0gSW1wbGVtZW50IGFsdGVybmF0aXZlcyB0byBKYXZhc2NyaXB0IENsaWVudCBzaWRlIFRyYW5zcG9ydCBwcm90b2NvbCwganVzdCBhcyBOUEFQSSBhbmQgV2ViU29ja2V0LgotICAgICogW1RIUklGVC0xODY4XSAtIE1ha2UgdGhlIFRQQyBiYWNrbG9nIGNvbmZpZ3VyYWJsZSBpbiB0aGUgSmF2YSBzZXJ2ZXJzCi0gICAgKiBbVEhSSUZULTE3NzJdIC0gU2VyaWFsaXphdGlvbiBkb2VzIG5vdCBjaGVjayB0eXBlcyBvZiBlbWJlZGRlZCBzdHJ1Y3R1cmVzLgotICAgICogW1RIUklGVC0xNzQzXSAtIEFkZCBjb21wb3Nlci5qc29uIGZvciBuZXcgU3ltZm9ueSAyLjEgRGVwZW5kZW5jeSBNYW5hZ2VyCiAgICAgKiBbVEhSSUZULTE3NDZdIC0gcHJvdmlkZSBhIFNQRFggZmlsZQotICAgICogW1RIUklGVC0xODE1XSAtIENvZGUgZ2VuZXJhdG9ycyBsaW5lIGJ1ZmZlciBvdXRwdXQKLSAgICAqIFtUSFJJRlQtMTgxM10gLSBBZGQgQEdlbmVyYXRlZCBhbm5vdGF0aW9uIHRvIGdlbmVyYXRlZCBjbGFzc2VzCi0gICAgKiBbVEhSSUZULTE1NDFdIC0gVGhlIHRocmlmdCBjb21waWxlciBpcyBub3QgYnVpbGRhYmxlIHdpdGggdmlzdWFsIHN0dWRpbyAyMDEwIGluIFdpbmRvd3MgNwotICAgICogW1RIUklGVC0xNTQ0XSAtIENyZWF0ZSBjb3JyZWN0IFJ1YnkgbmFtZXNwYWNlIGRpcmVjdG9yaWVzCi0gICAgKiBbVEhSSUZULTE0NTddIC0gQ2FwYWNpdHkgb2YgVGZyYW1lZFRyYW5zcG9ydCB3cml0ZSBidWZmZXIgaXMgbmV2ZXIgcmVzZXQKLSAgICAqIFtUSFJJRlQtMTQ0Ml0gLSBUTm9uYmxvY2tpbmdTZXJ2ZXI6IFJlZmFjdG9yIHRvIGFsbG93IG11bHRpcGxlIElPIFRocmVhZHMKLSAgICAqIFtUSFJJRlQtMTM3MV0gLSBTb2NrZXQgdGltZW91dHMgKFNPX1JDVlRJTUVPIGFuZCBTT19TTkRUSU1FTykgbm90IHN1cHBvcnRlZCBvbiBTb2xhcmlzCi0gICAgKiBbVEhSSUZULTEzNDldIC0gUmVtb3ZlIHVubmVjZXNzYXJ5IHByaW50IG91dHMKLSAgICAqIFtUSFJJRlQtMTM1Ml0gLSBUaHJpZnQgc2VydmVyCi0gICAgKiBbVEhSSUZULTExMzVdIC0gTm9kZS5qcyB0dXRvcmlhbAotICAgICogW1RIUklGVC0xMTE0XSAtIE1hdmVuIHB1Ymxpc2ggc2hvdWxkbid0IHJlcXVpcmUgcGFzc3dvcmRzIGhhcmRjb2RlZCBpbiBzZXR0aW5ncy54bWwKLSAgICAqIFtUSFJJRlQtOTg5XSAtIFB1c2ggYm9vc3QgbTQgbWFjcm9zIHVwc3RyZWFtCi0gICAgKiBbVEhSSUZULTI2OTFdIC0gQysrIC0gbmV3IG9wZXJhdG9yPDwgY291bGQgYmUgdXNlZCBpbiB0dXRvcmlhbAotICAgICogW1RIUklGVC0yMDY3XSAtIFRocmlmdCBvYmplY3RzIHNob3VsZCBoYXZlIGEgZGVmYXVsdCBzdHJpbmcgcmVwcmVzZW50YXRpb24KLSAgICAqIFtUSFJJRlQtMjY0MV0gLSBJbXByb3ZlbWVudHMgdG8gSGFza2VsbCBDb21waWxlci9MaWJyYXJpZXMKLSAgICAqIFtUSFJJRlQtMjIzMV0gLSBTdXBwb3J0IHRvcm5hZG8tNC54IChQeXRob24pCi0gICAgKiBbVEhSSUZULTI2NDNdIC0gT3B0aW9uYWwgb2Zmc2V0L2xlbmd0aCBmb3IgVERlc2VyaWFsaXplci5kZXNlcmlhbGl6ZSgpCi0gICAgKiBbVEhSSUZULTI2ODRdIC0gY19nbGliOiBJbXByb3ZlbWVudHMgdG8gbWFwIGRlc2VyaWFsaXphdGlvbiBpbiBnZW5lcmF0ZWQgY29kZQotICAgICogW1RIUklGVC0yNjcyXSAtIFByb3ZpZGUgb3JpZ2luIG9mIGNhbGwgdmlhIFRUcmFuc3BvcnQKLSAgICAqIFtUSFJJRlQtMjY3N10gLSBIYXNrZWxsIGxpYnJhcnkgbmVlZHMgdG8gYnVpbGQgd2l0aCBuZXR3b3JrID49IDIuNgotICAgICogW1RIUklGVC0yNjQ4XSAtIGNsZWFudXAgZXJsYW5nIGxpYgotICAgICogW1RIUklGVC0yNDkzXSAtIE5vZGUuanMgbGliIG5lZWRzIEhUVFAgY2xpZW50Ci0gICAgKiBbVEhSSUZULTI3MThdIC0gQWxpZ24gY29tbWFuZCBsaW5lIGFyZ3MgZm9yIFRocmlmdCB0ZXN0IHNlcnZlci9jbGllbnQKLSAgICAqIFtUSFJJRlQtMjcwOV0gLSBjX2dsaWI6IFN1cHBvcnQgc2VydmVyIGltcGxlbWVudGF0aW9uCi0gICAgKiBbVEhSSUZULTk3Nl0gLSBjX2dsaWIgdHV0b3JpYWwKLSAgICAqIFtUSFJJRlQtMjc1Ml0gLSBDZW50b3MgNi41IEluc3RhbGxhdGlvbiBEb2NzIHVwZGF0ZQotICAgICogW1RIUklGVC0yMjY5XSAtIENhbiBkZXBsb3kgbGlidGhyaWZ0LXNvdXJjZS5qYXIgdG8gbWF2ZW4gY2VudGVyIHJlcG9zaXRvcnkKLSAgICAqIFtUSFJJRlQtMjUxMl0gLSBsaWIvJHtsYW5ndWFnZX0vUkVBRE1FLm1kCi0gICAgKiBbVEhSSUZULTI3ODNdIC0gQ29ycmVjdGx5IHByb3BhZ2F0ZSBiaW5hcnkgZW5jb2Rpbmcgb2YgV2ViU29ja2V0IGZyYW1lcyBOb2RlLmpzIGxpYnJhcnkKLSAgICAqIFtUSFJJRlQtMjY5Ml0gLSBBbGxvdyB1bml0IHRlc3Rpbmcgb2YgY29tcGlsZXIgcGFydHMKLSAgICAqIFtUSFJJRlQtMjc4N10gLSBEZWxwaGkgTGliIFJFQURNRQotICAgICogW1RIUklGVC0yNzg2XSAtIENwcCBUdXRvcmlhbDogTWFrZSBUVGhyZWFkUG9vbFNlcnZlciAvIFRUaHJlYWRlZFNlcnZlciBhIGJpdCBlYXNpZXIgdG8gdXNlCi0gICAgKiBbVEhSSUZULTI3ODVdIC0gV3JhcCBlcnJvcnMgaW4gaW9zdHJlYW1fdHJhbnNwb3J0LmdvCi0gICAgKiBbVEhSSUZULTIwNjJdIC0gY3BwIGZsYWcgZm9yIHVzaW5nIHVub3JkZXJlZF9zZXQgaW5zdGVhZCBvZiBzZXQKLSAgICAqIFtUSFJJRlQtMjY1NF0gLSByZWR1Y2UgbnVtYmVyIG9mIHNlcnZlciBleGNlcHRpb25zCi0gICAgKiBbVEhSSUZULTIzNjBdIC0gSnNvbiBHZW5lcmF0b3IKLSAgICAqIFtUSFJJRlQtMjc5MV0gLSBBbGxvd2luZyB1c2Ugb2YgYnVmZmVyZWQgc29ja2V0cyBpbiBnbyBzZXJ2ZXIKLSAgICAqIFtUSFJJRlQtODA5XSAtIEphdmFzY3JpcHQgY2xpZW50OiBQbGVhc2UgbWFrZSByZXF1aXJlZCBmaWVsZHMgYWN0dWFsbHkgcmVxdWlyZWQuCi0gICAgKiBbVEhSSUZULTI3ODRdIC0gRWxpbWluYXRlIGNvbXBpbGVyIHdhcm5pbmdzIGluIGdlbmVyYXRlZCBDKysgY29kZQotICAgICogW1RIUklGVC0yNTM4XSAtIEFwYWNoZSBUaHJpZnQgbmVlZHMgYW4gb2ZmaWNpYWwgTnVHZXQgcGFja2FnZQotICAgICogW1RIUklGVC0yMDQ2XSAtIFRoZSB3b3JrdGFzayBjYW4gYmUgdGltZWQgb3V0IGluIFRUaHJlYWRQb29sU2VydmVyIChKYXZhKSB3aGVuIHRoZSBtYXgjIHRocmlmdCB0aHJlYWQgaXMgcmVhY2hlZAorICAgICogW1RIUklGVC0xNzcyXSAtIFNlcmlhbGl6YXRpb24gZG9lcyBub3QgY2hlY2sgdHlwZXMgb2YgZW1iZWRkZWQgc3RydWN0dXJlcy4KKyAgICAqIFtUSFJJRlQtMjM4N10gLSBub2RlanM6IGV4dGVybmFsIGltcG9ydHMgc2hvdWxkIGJlIGNlbnRyYWxpemVkIGluIGluZGV4LmpzCisgICAgKiBbVEhSSUZULTIwMzddIC0gTW9yZSBnZW5lcmFsIG1hY3JvIFRIUklGVF9VTlVTRURfVkFSSUFCTEUKIAogIyMgTmV3IEZlYXR1cmUKLSAgICAqIFtUSFJJRlQtMjYzN10gLSAiamF2YTpmdWxsY2FtZWxfc2VydmljZV9tZXRob2RzIiBvcHRpb24gdG8gYXV0b21hdGljYWxseSBjYW1lbC1jYXNlIEphdmEgc2VydmljZSBtZXRob2RzCi0gICAgKiBbVEhSSUZULTI1NzJdIC0gQWRkIHN0cmluZy9jb2xsZWN0aW9uIGxlbmd0aCBsaW1pdCBjaGVja3MgKGZyb20gQysrKSB0byBqYXZhIHByb3RvY29sIHJlYWRlcnMKLSAgICAqIFtUSFJJRlQtNzk1XSAtIEltcG9ydGluZyBzZXJ2aWNlIGZ1bmN0aW9ucyAoc2ltdWxhdGlvbiBtdWx0aXBsZSBpbmhlcml0YW5jZSkKLSAgICAqIFtUSFJJRlQtMjM0N10gLSBDIyBUTFMgVHJhbnNwb3J0IGJhc2VkIG9uIFRIUklGVC0xODEKLSAgICAqIFtUSFJJRlQtMjI1Nl0gLSBVc2luZyBjKysxMS9jKysweCBzdGQgbGlicmFyeSAgcmVwbGFjZSBib29zdCBsaWJyYXJ5Ci0gICAgKiBbVEhSSUZULTIyNTVdIC0gYWRkIFBhcmVudCBDbGFzcyBmb3IgZ2VuZXJhdGVkIFN0cnVjdCBjbGFzcwotICAgICogW1RIUklGVC0yMjUwXSAtIEpTT04gYW5kIE1lbW9yeUJ1ZmZlciBmb3IgSmF2YU1FCi0gICAgKiBbVEhSSUZULTI0NjldIC0gImphdmE6ZnVsbGNhbWVsIiBvcHRpb24gdG8gYXV0b21hdGljYWxseSBjYW1lbC1jYXNlIHVuZGVyc2NvcmVkIGF0dHJpYnV0ZSBuYW1lcwotICAgICogW1RIUklGVC0yNDA4XSAtIE5hbWVkIFBpcGUgVHJhbnNwb3J0IE9wdGlvbiBmb3IgQyMKLSAgICAqIFtUSFJJRlQtMjM3N10gLSBBbGxvdyBhZGRpdGlvbiBvZiBjdXN0b20gSFRUUCBIZWFkZXJzIHRvIGFuIEhUVFAgVHJhbnNwb3J0Ci0gICAgKiBbVEhSSUZULTIxNjRdIC0gQWRkIGEgR2V0L1Bvc3QgSHR0cCBTZXJ2ZXIgdG8gTm9kZSBhbG9uZyB3aXRoIGV4YW1wbGVzCi0gICAgKiBbVEhSSUZULTIxMTRdIC0gUHl0aG9uIFNlcnZpY2UgUmVtb3RlIFNTTCBPcHRpb24KLSAgICAqIFtUSFJJRlQtMTg5NF0gLSBUaHJpZnQgbXVsdGktdGhyZWFkZWQgYXN5bmMgSmF2YSBTZXJ2ZXIgdXNpbmcgSmF2YSA3IEFzeW5jaHJvbm91c0NoYW5uZWxHcm91cAotICAgICogW1RIUklGVC0yMDU4XSAtIEFkZCByZWNvbm5lY3Qgc3VwcG9ydCB0byBub2RlLmpzIGxpYnJhcnkKLSAgICAqIFtUSFJJRlQtMTcxOV0gLSBTQVNMIGNsaWVudCBzdXBwb3J0IGZvciBQeXRob24KLSAgICAqIFtUSFJJRlQtMTE4OF0gLSBDKys6IFVzZSBiaXQgZmllbGRzIGZvciBhIG1vcmUgY29tcGFjdCBfX2lzc2V0IHN0cnVjdAogICAgICogW1RIUklGVC0xMDEyXSAtIFRyYW5zcG9ydCBmb3IgRGF0YUlucHV0IERhdGFPdXRwdXQgaW50ZXJmYWNlCi0gICAgKiBbVEhSSUZULTI2ODhdIC0gR2VuZXJhdGluZyAqTnVsbCBpbXBsZW1lbnRhdGlvbnMgc2hvdWxkIGJlIG9wdGlvbmFsCi0gICAgKiBbVEhSSUZULTcyOF0gLSBNYWtlIGdlbmVyYXRlZCBIYXNrZWxsIGNvZGUgYW4gaW5zdGFuY2Ugb2YgQXJiaXRyYXJ5Ci0gICAgKiBbVEhSSUZULTI1MjJdIC0gVHlwZVNjcmlwdCBleHRlbnNpb24gZm9yIFRocmlmdCBDb21waWxlcgorICAgICogW1RIUklGVC0yMjU2XSAtIFVzaW5nIGMrKzExL2MrKzB4IHN0ZCBsaWJyYXJ5ICByZXBsYWNlIGJvb3N0IGxpYnJhcnkKKyAgICAqIFtUSFJJRlQtMjI1MF0gLSBKU09OIGFuZCBNZW1vcnlCdWZmZXIgZm9yIEphdmFNRQorICAgICogW1RIUklGVC0yMTE0XSAtIFB5dGhvbiBTZXJ2aWNlIFJlbW90ZSBTU0wgT3B0aW9uCisgICAgKiBbVEhSSUZULTE3MTldIC0gU0FTTCBjbGllbnQgc3VwcG9ydCBmb3IgUHl0aG9uCisgICAgKiBbVEhSSUZULTE4OTRdIC0gVGhyaWZ0IG11bHRpLXRocmVhZGVkIGFzeW5jIEphdmEgU2VydmVyIHVzaW5nIEphdmEgNyBBc3luY2hyb25vdXNDaGFubmVsR3JvdXAKICAgICAqIFtUSFJJRlQtMTg5M10gLSBIVFRQL0pTT04gc2VydmVyL2NsaWVudCBmb3Igbm9kZSBqcwotICAgICogW1RIUklGVC0yNjcwXSAtIEFuZHJvaWQgUGFyY2VsYWJsZSBKYXZhIGdlbmVyYXRpb24gb3B0aW9uCi0gICAgKiBbVEhSSUZULTE1MzZdIC0gTWF2ZW4gdGhyaWZ0IHBsdWdpbgotICAgICogW1RIUklGVC0yNzEyXSAtIFBIUDogYWRkICJqc29uIiBvcHRpb24gdG8gY3JlYXRlIEpzb25TZXJpYWxpemFibGUgY29kZQorICAgICogW1RIUklGVC0yMzQ3XSAtIEMjIFRMUyBUcmFuc3BvcnQgYmFzZWQgb24gVEhSSUZULTE4MQorICAgICogW1RIUklGVC0yMzc3XSAtIEFsbG93IGFkZGl0aW9uIG9mIGN1c3RvbSBIVFRQIEhlYWRlcnMgdG8gYW4gSFRUUCBUcmFuc3BvcnQKKyAgICAqIFtUSFJJRlQtMjQwOF0gLSBOYW1lZCBQaXBlIFRyYW5zcG9ydCBPcHRpb24gZm9yIEMjCisgICAgKiBbVEhSSUZULTI1NzJdIC0gQWRkIHN0cmluZy9jb2xsZWN0aW9uIGxlbmd0aCBsaW1pdCBjaGVja3MgKGZyb20gQysrKSB0byBqYXZhIHByb3RvY29sIHJlYWRlcnMKKyAgICAqIFtUSFJJRlQtMjQ2OV0gLSAiamF2YTpmdWxsY2FtZWwiIG9wdGlvbiB0byBhdXRvbWF0aWNhbGx5IGNhbWVsLWNhc2UgdW5kZXJzY29yZWQgYXR0cmlidXRlIG5hbWVzCisgICAgKiBbVEhSSUZULTc5NV0gLSBJbXBvcnRpbmcgc2VydmljZSBmdW5jdGlvbnMgKHNpbXVsYXRpb24gbXVsdGlwbGUgaW5oZXJpdGFuY2UpCisgICAgKiBbVEhSSUZULTIxNjRdIC0gQWRkIGEgR2V0L1Bvc3QgSHR0cCBTZXJ2ZXIgdG8gTm9kZSBhbG9uZyB3aXRoIGV4YW1wbGVzCisgICAgKiBbVEhSSUZULTIyNTVdIC0gYWRkIFBhcmVudCBDbGFzcyBmb3IgZ2VuZXJhdGVkIFN0cnVjdCBjbGFzcwogCiAjIyBRdWVzdGlvbgotICAgICogW1RIUklGVC0yNTczXSAtIHRocmlmdCAwLjkuMiByZWxlYXNlCi0gICAgKiBbVEhSSUZULTI1NjddIC0gQ3NoYXJwIHNsb3cgPwogICAgICogW1RIUklGVC0yNTM5XSAtIFRzb2NrZXQuY3BwIGFkZHJpbmZvIGFpX2ZsYWdzID0gQUlfQUREUkNPTkZJRwotICAgICogW1RIUklGVC0yMjc3XSAtIFRocmlmdDogaW5zdGFsbGluZyBmYjMwMyBlcnJvcgogICAgICogW1RIUklGVC0yNDQwXSAtIGhvdyB0byBjb25uZWN0IGFzMyB0byBqYXZhIGJ5IHRocmlmdCAsCiAgICAgKiBbVEhSSUZULTIzNzldIC0gTWVtbW9yeSBsZWFraW5nIHdoaWxlIHVzaW5nIG11bHRpdGhyZWFkaW5nIGluIEMrKyBzZXJ2ZXIuCi0gICAgKiBbVEhSSUZULTI2OTldIC0gV2hpY2ggdmVyc2lvbiBvZiBUaHJpZnQgdG8gYmUgdXNlZCBmb3IgV2luQ0UKLSAgICAqIFtUSFJJRlQtMjcwM10gLSBUaHJpZnQgb24gV2luZG93cyBDRQotICAgICogW1RIUklGVC0yNzA1XSAtIG1ha2UgYSBwYWNrYWdlIG91dCBvZiB0aGUgaGFza2VsbCBsaWJyYXJpZXMgZm9yIHRocmlmdAorICAgICogW1RIUklGVC0yMjc3XSAtIFRocmlmdDogaW5zdGFsbGluZyBmYjMwMyBlcnJvcgorICAgICogW1RIUklGVC0yNTY3XSAtIENzaGFycCBzbG93ID8KKyAgICAqIFtUSFJJRlQtMjU3M10gLSB0aHJpZnQgMC45LjIgcmVsZWFzZQogCiAjIyBTdWItdGFzawotICAgICogW1RIUklGVC0yNTM0XSAtIENyb3NzIGxhbmd1YWdlIHRlc3QgcmVzdWx0cyBzaG91bGQgcmVjb3JkZWQgdG8gYSBzdGF0dXMubWQgb3Igc3RhdHVzLmh0bWwgZmlsZSBhdXRvbWF0aWNhbGx5Ci0gICAgKiBbVEhSSUZULTI1NThdIC0gQ1NoYXJwIGNvbXBpbGVyIGdlbmVyYXRvciB0cmllcyB0byBjb25jYXQgaW50cyB3aXRoIHN0cmluZ3MgdXNpbmcgKwotICAgICogW1RIUklGVC0yNTA3XSAtIEFkZGl0aW9uYWwgTFVBIFRQcm90b2NvbEV4Y2VwdGlvbiBlcnJvciBjb2RlIG5lZWRlZD8KLSAgICAqIFtUSFJJRlQtMzM0XSAtIENvbXBhY3QgUHJvdG9jb2wgZm9yIFBIUAotICAgICogW1RIUklGVC02Nl0gLSBKYXZhOiBBbGxvdyBtdWx0aXBsZXhpbmcgbXVsdGlwbGUgc2VydmljZXMgb3ZlciBhIHNpbmdsZSBUQ1AgY29ubmVjdGlvbgotICAgICogW1RIUklGVC0yMzM4XSAtIEZpcnN0IGRvY3RleHQgd3JvbmdseSBpbnRlcnByZXRlZCBhcyBwcm9ncmFtIGRvY3RleHQgaW4gc29tZSBjYXNlcwotICAgICogW1RIUklGVC0yMzI1XSAtIFNTTCB0ZXN0IGNlcnRpZmljYXRlcwotICAgICogW1RIUklGVC0yMzEwXSAtIFBIUDogQ2xpZW50LXNpZGUgc3VwcG9ydCBmb3IgTXVsdGlwbGV4aW5nIFNlcnZpY2VzCi0gICAgKiBbVEhSSUZULTIzNThdIC0gQysrOiBhZGQgY29tcGFjdCBwcm90b2NvbCB0byBjcm9zcyBsYW5ndWFnZSB0ZXN0IHN1aXRlCi0gICAgKiBbVEhSSUZULTIyOTddIC0gVEpzb25Qcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBmb3IgRGVscGhpIGRvZXMgbm90IGFsbG93IGZvciBib3RoIHBvc3NpYmxlIHNsYXNoIChzb2xpZHVzKSBlbmNvZGluZ3MKKyAgICAqIFtUSFJJRlQtOTgxXSAtIGNvY29hOiBhZGQgdmVyc2lvbiBJbmZvIHRvIHRoZSBsaWJyYXJ5CisgICAgKiBbVEhSSUZULTIxMzJdIC0gR286IFN1cHBvcnQgZm9yIE11bHRpcGxleGluZyBTZXJ2aWNlcyBvbiBhbnkgVHJhbnNwb3J0LCBQcm90b2NvbCBhbmQgU2VydmVyCiAgICAgKiBbVEhSSUZULTIyOTldIC0gVEpzb25Qcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBmb3IgUnVieSBkb2VzIG5vdCBhbGxvdyBmb3IgYm90aCBwb3NzaWJsZSBzbGFzaCAoc29saWR1cykgZW5jb2RpbmdzCiAgICAgKiBbVEhSSUZULTIyOThdIC0gVEpzb25Qcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBmb3IgQyMgZG9lcyBub3QgYWxsb3cgZm9yIGJvdGggcG9zc2libGUgc2xhc2ggKHNvbGlkdXMpIGVuY29kaW5ncwotICAgICogW1RIUklGVC0yMjUxXSAtIGdvIHRlc3QgZm9yIGNvbXBhY3QgcHJvdG9jb2wgaXMgbm90IHJ1bm5pbmcKLSAgICAqIFtUSFJJRlQtMjQ5OV0gLSBDb21waWxlcjogYWxsb3cgYW5ub3RhdGlvbnMgd2l0aG91dCAiPSB2YWx1ZSIKLSAgICAqIFtUSFJJRlQtMjQ0NF0gLSBwdWxsIHJlcXVlc3QgODg6IHRocmlmdDogY2xlYW4gdXAgZW51bSB2YWx1ZSBhc3NpZ25tZW50Ci0gICAgKiBbVEhSSUZULTI0MjVdIC0gUEhQOiBTZXJ2ZXItc2lkZSBzdXBwb3J0IGZvciBNdWx0aXBsZXhpbmcgU2VydmljZXMKLSAgICAqIFtUSFJJRlQtMjQyMV0gLSBUcmVlL1JlY3Vyc2l2ZSBzdHJ1Y3Qgc3VwcG9ydCBpbiB0aHJpZnQKLSAgICAqIFtUSFJJRlQtMjE3NV0gLSBXcm9uZyBmaWVsZCB0eXBlIHNldCBmb3IgYmluYXJ5Ci0gICAgKiBbVEhSSUZULTIxNzZdIC0gVFNpbXBsZUpTT05Qcm90b2NvbC5SZWFkRmllbGRCZWdpbigpIGRvZXMgbm90IHJldHVybiBmaWVsZCB0eXBlIGFuZCBJRAotICAgICogW1RIUklGVC0yMTc0XSAtIERlc2VyaWFsaXppbmcgSlNPTiBmYWlscyBpbiBzcGVjaWZpYyBjYXNlcwotICAgICogW1RIUklGVC0yMTMyXSAtIEdvOiBTdXBwb3J0IGZvciBNdWx0aXBsZXhpbmcgU2VydmljZXMgb24gYW55IFRyYW5zcG9ydCwgUHJvdG9jb2wgYW5kIFNlcnZlcgotICAgICogW1RIUklGVC0yMjkwXSAtIFVwZGF0ZSBHbyB0dXRvcmlhbCB0byBhbGlnbiB3aXRoIFRIUklGVC0yMjMyCisgICAgKiBbVEhSSUZULTIyOTddIC0gVEpzb25Qcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBmb3IgRGVscGhpIGRvZXMgbm90IGFsbG93IGZvciBib3RoIHBvc3NpYmxlIHNsYXNoIChzb2xpZHVzKSBlbmNvZGluZ3MKICAgICAqIFtUSFJJRlQtMjI3MV0gLSBKYXZhU2NyaXB0OiBTdXBwb3J0IGZvciBNdWx0aXBsZXhpbmcgU2VydmljZXMKKyAgICAqIFtUSFJJRlQtMjI1MV0gLSBnbyB0ZXN0IGZvciBjb21wYWN0IHByb3RvY29sIGlzIG5vdCBydW5uaW5nCiAgICAgKiBbVEhSSUZULTIxOTVdIC0gRGVscGhpOiBBZGQgZXZlbnQgaGFuZGxlcnMgZm9yIHNlcnZlciBhbmQgcHJvY2Vzc2luZyBldmVudHMKKyAgICAqIFtUSFJJRlQtMjE3Nl0gLSBUU2ltcGxlSlNPTlByb3RvY29sLlJlYWRGaWVsZEJlZ2luKCkgZG9lcyBub3QgcmV0dXJuIGZpZWxkIHR5cGUgYW5kIElECisgICAgKiBbVEhSSUZULTIxNzVdIC0gV3JvbmcgZmllbGQgdHlwZSBzZXQgZm9yIGJpbmFyeQorICAgICogW1RIUklGVC0yMTc0XSAtIERlc2VyaWFsaXppbmcgSlNPTiBmYWlscyBpbiBzcGVjaWZpYyBjYXNlcwogICAgICogW1RIUklGVC0yMDUzXSAtIE5vZGVKUzogU3VwcG9ydCBmb3IgTXVsdGlwbGV4aW5nIFNlcnZpY2VzCiAgICAgKiBbVEhSSUZULTE5MTRdIC0gUHl0aG9uOiBTdXBwb3J0IGZvciBNdWx0aXBsZXhpbmcgU2VydmljZXMgb24gYW55IFRyYW5zcG9ydCwgUHJvdG9jb2wgYW5kIFNlcnZlcgogICAgICogW1RIUklGVC0xODEwXSAtIGFkZCBydWJ5IHRvIHRlc3QvdGVzdC5zaAorICAgICogW1RIUklGVC0yMzEwXSAtIFBIUDogQ2xpZW50LXNpZGUgc3VwcG9ydCBmb3IgTXVsdGlwbGV4aW5nIFNlcnZpY2VzCisgICAgKiBbVEhSSUZULTIzNDZdIC0gQyM6IFVURi04IHNlbnQgYnkgUEhQIGFzIEpTT04gaXMgbm90IHVuZGVyc3Rvb2QgYnkgVEpzb25Qcm90b2NvbAorICAgICogW1RIUklGVC0yMzQ1XSAtIERlbHBoaTogVVRGLTggc2VudCBieSBQSFAgYXMgSlNPTiBpcyBub3QgdW5kZXJzdG9vZCBieSBUSnNvblByb3RvY29sCisgICAgKiBbVEhSSUZULTIzMzhdIC0gRmlyc3QgZG9jdGV4dCB3cm9uZ2x5IGludGVycHJldGVkIGFzIHByb2dyYW0gZG9jdGV4dCBpbiBzb21lIGNhc2VzCisgICAgKiBbVEhSSUZULTIzMjVdIC0gU1NMIHRlc3QgY2VydGlmaWNhdGVzCisgICAgKiBbVEhSSUZULTIzNThdIC0gQysrOiBhZGQgY29tcGFjdCBwcm90b2NvbCB0byBjcm9zcyBsYW5ndWFnZSB0ZXN0IHN1aXRlCisgICAgKiBbVEhSSUZULTI0MjVdIC0gUEhQOiBTZXJ2ZXItc2lkZSBzdXBwb3J0IGZvciBNdWx0aXBsZXhpbmcgU2VydmljZXMKKyAgICAqIFtUSFJJRlQtMjQyMV0gLSBUcmVlL1JlY3Vyc2l2ZSBzdHJ1Y3Qgc3VwcG9ydCBpbiB0aHJpZnQKKyAgICAqIFtUSFJJRlQtMjI5MF0gLSBVcGRhdGUgR28gdHV0b3JpYWwgdG8gYWxpZ24gd2l0aCBUSFJJRlQtMjIzMgorICAgICogW1RIUklGVC0yNTU4XSAtIENTaGFycCBjb21waWxlciBnZW5lcmF0b3IgdHJpZXMgdG8gY29uY2F0IGludHMgd2l0aCBzdHJpbmdzIHVzaW5nICsKKyAgICAqIFtUSFJJRlQtMjUwN10gLSBBZGRpdGlvbmFsIExVQSBUUHJvdG9jb2xFeGNlcHRpb24gZXJyb3IgY29kZSBuZWVkZWQ/CisgICAgKiBbVEhSSUZULTI0OTldIC0gQ29tcGlsZXI6IGFsbG93IGFubm90YXRpb25zIHdpdGhvdXQgIj0gdmFsdWUiCisgICAgKiBbVEhSSUZULTI1MzRdIC0gQ3Jvc3MgbGFuZ3VhZ2UgdGVzdCByZXN1bHRzIHNob3VsZCByZWNvcmRlZCB0byBhIHN0YXR1cy5tZCBvciBzdGF0dXMuaHRtbCBmaWxlIGF1dG9tYXRpY2FsbHkKKyAgICAqIFtUSFJJRlQtNjZdIC0gSmF2YTogQWxsb3cgbXVsdGlwbGV4aW5nIG11bHRpcGxlIHNlcnZpY2VzIG92ZXIgYSBzaW5nbGUgVENQIGNvbm5lY3Rpb24KICAgICAqIFtUSFJJRlQtMTY4MV0gLSBBZGQgTHVhIFN1cHBvcnQKLSAgICAqIFtUSFJJRlQtMTc2Nl0gLSBbUnVieV0gUHJvdmlkZSBzdXBwb3J0IGZvciBiaW5hcnkgdHlwZXMKICAgICAqIFtUSFJJRlQtMTcyN10gLSBSdWJ5LTEuOTogZGF0YSBsb3NzOiAiYmluYXJ5IiBmaWVsZHMgYXJlIHJlLWVuY29kZWQKICAgICAqIFtUSFJJRlQtMTcyNl0gLSBSdWJ5LTEuOTogImJpbmFyeSIgZmllbGRzIGFyZSByZXByZXNlbnRlZCBieSBzdHJpbmcgd2hvc2UgZW5jb2RpbmcgaXMgIlVURi04IgogICAgICogW1RIUklGVC05ODhdIC0gcGVybDogYWRkIHZlcnNpb24gSW5mbyB0byB0aGUgbGlicmFyeSB2aWEgY29uZmlndXJlCi0gICAgKiBbVEhSSUZULTk4MV0gLSBjb2NvYTogYWRkIHZlcnNpb24gSW5mbyB0byB0aGUgbGlicmFyeQotICAgICogW1RIUklGVC0yMzQ1XSAtIERlbHBoaTogVVRGLTggc2VudCBieSBQSFAgYXMgSlNPTiBpcyBub3QgdW5kZXJzdG9vZCBieSBUSnNvblByb3RvY29sCi0gICAgKiBbVEhSSUZULTIzNDZdIC0gQyM6IFVURi04IHNlbnQgYnkgUEhQIGFzIEpTT04gaXMgbm90IHVuZGVyc3Rvb2QgYnkgVEpzb25Qcm90b2NvbAotICAgICogW1RIUklGVC0yNjUyXSAtIFRIUklGVF9URVNUX1BPUlQgdmFyaWFibGUgdmlhIHRvIHJ1biB0ZXN0cyBpbiBwYXJhbGxlbAotICAgICogW1RIUklGVC0yNTEzXSAtIGNsZWFuIHVwIGVudW0gdmFsdWUgYXNzaWdubWVudAotICAgICogW1RIUklGVC0yMTQ0XSAtIENvY29hOiBDbGllbnQtc2lkZSBzdXBwb3J0IGZvciBNdWx0aXBsZXhpbmcgU2VydmljZXMgb24gYW55IFRyYW5zcG9ydCBhbmQgUHJvdG9jb2wKLSAgICAqIFtUSFJJRlQtMjc0Nl0gLSBDb21waWxlciBDKys5OCBjb25mb3JtYW5jZQotICAgICogW1RIUklGVC0yNzUwXSAtIEpTIExpYiBhbnQgYnVpbGQueG1sIGZhaWxzIG9uIG9sZGVyIGFudHMKLSAgICAqIFtUSFJJRlQtMjc1MV0gLSBOb2RlSlMgTGliIGNsZWFuIHVwCi0gICAgKiBbVEhSSUZULTI3NDldIC0gQysrIExpYiBUcmFuc3BvcnQgQ2xlYW4gVXAKLSAgICAqIFtUSFJJRlQtMjc0N10gLSBBZGQgLnZhZ3JhbnQgdG8gLmdpdGlnbm9yZQotICAgICogW1RIUklGVC0yNzU4XSAtIGxpYi9nby90ZXN0L01ha2VmaWxlLmFtIHVzZXMgbG4gLXMgd2hpY2ggYnJlYWtzIGluIHZhZ3JhbnQKLSAgICAqIFtUSFJJRlQtMjc2MF0gLSB0aHJpZnQvdGVzdC9jcHAgZGVwZW5kcyBvbiBib29zdCBsaWJzIG5vdCBpbnN0YWxsZWQgYnkgVmFncmFudGZpbGUKLSAgICAqIFtUSFJJRlQtMjc2Ml0gLSBQeXRob24gVHdpc3RlZCB0ZXN0cyBjcmFzaCBpbiBUcnVzdHkgVmFncmFudGZpbGUKLSAgICAqIFtUSFJJRlQtMjc2OF0gLSBXaGl0ZXNwYWNlIGZpeHVwcwotICAgICogW1RIUklGVC0yNzYxXSAtIGdvIG1ha2UgY3Jhc2hlcyB3aXRoIFRydXN0eSBWYWdyYW50ZmlsZQotICAgICogW1RIUklGVC0yNzYzXSAtIEQgaXMgbm90IGluc3RhbGxlZCAoYW5kIHRodXMgbm90IGJ1aWx0L3Rlc3RlZCkgaW4gdGhlIFRydXN0eSBWYWdyYW50ZmlsZQotICAgICogW1RIUklGVC0yNzc0XSAtIEFkZCBkb2N1bWVudGF0aW9uIGZvciBuZXcgZXJsYW5nIGNhc2UgZmVhdHVyZSBmbGFnCi0gICAgKiBbVEhSSUZULTI3NjRdIC0gSGFza2VsbCBkb2VzIG5vdCBidWlsZC90ZXN0IHdoZW4gdXNpbmcgdGhlIFRydXN0eSBWYWdyYW50ZmlsZQotICAgICogW1RIUklGVC0xNDYyXSAtIGFkZCBtb3JlIHN0cmljdCBjb21waWxlciBmbGFncwotICAgICogW1RIUklGVC0yNzI3XSAtIEMgZ2xpYiBjb2Rpbmcgc3RhbmRhcmRzCi0gICAgKiBbVEhSSUZULTI3MjhdIC0gQyMgY29kaW5nIHN0YW5kYXJkcwotICAgICogW1RIUklGVC0yNzQxXSAtIFB5dGhvbiBjb2Rpbmcgc3RhbmRhcmRzCisgICAgKiBbVEhSSUZULTMzNF0gLSBDb21wYWN0IFByb3RvY29sIGZvciBQSFAKKyAgICAqIFtUSFJJRlQtMjQ0NF0gLSBwdWxsIHJlcXVlc3QgODg6IHRocmlmdDogY2xlYW4gdXAgZW51bSB2YWx1ZSBhc3NpZ25tZW50CiAKICMjIFRhc2sKKyAgICAqIFtUSFJJRlQtMjIyM10gLSBTcGFtIGxpbmtzIG9uIHdpa2kKICAgICAqIFtUSFJJRlQtMjU2Nl0gLSBQbGVhc2UgY3JlYXRlIGEgRE9BUCBmaWxlIGZvciB5b3VyIFRMUAogICAgICogW1RIUklGVC0yMjM3XSAtIFVwZGF0ZSBhcmNoaXZlIHRvIGNvbnRhaW4gYWxsIHZlcnNpb25zCi0gICAgKiBbVEhSSUZULTIyMjNdIC0gU3BhbSBsaW5rcyBvbiB3aWtpCiAgICAgKiBbVEhSSUZULTk2Ml0gLSBUdXRvcmlhbCBwYWdlIG9uIG91ciB3ZWJzaXRlIGlzIHJlYWxseSB1bmhlbHBmdWwKIAogIyMgVGVzdAogICAgICogW1RIUklGVC0yMzI3XSAtIG5vZGVqczogbm9kZWpzIHRlc3Qgc3VpdGUgc2hvdWxkIGJlIGJ1bmRsZWQgd2l0aCB0aGUgbGlicmFyeQotICAgICogW1RIUklGVC0yNTAxXSAtIEMjIFRoZSB0ZXN0IHBhcmFtZXRlcnMgZnJvbSB0aGUgVGVzdFNlcnZlciBhbmQgVGVzdENsaWVudCBhcmUgZGlmZmVyZW50IGZyb20gdGhlIGh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZy90ZXN0LwogICAgICogW1RIUklGVC0yNDQ1XSAtIFRIUklGVC0yMzg0IChjb2RlIGdlbmVyYXRpb24gZm9yIGdvIG1hcHMgd2l0aCBiaW5hcnkga2V5cykgc2hvdWxkIGJlIHRlc3RlZAotICAgICogW1RIUklGVC0yNjg1XSAtIGNfZ2xpYjogSW5jbHVkZSBpbiBpbnRlZ3JhdGlvbiB0ZXN0IHN1aXRlCi0gICAgKiBbVEhSSUZULTI3NTRdIC0gZXJsYW5nIGxpYiB0ZXN0cyBkb24ndCBjbGVhbiB1cCBhZnRlciB0aGVtc2VsdmVzIHByb3Blcmx5CisgICAgKiBbVEhSSUZULTI1MDFdIC0gQyMgVGhlIHRlc3QgcGFyYW1ldGVycyBmcm9tIHRoZSBUZXN0U2VydmVyIGFuZCBUZXN0Q2xpZW50IGFyZSBkaWZmZXJlbnQgZnJvbSB0aGUgaHR0cDovL3RocmlmdC5hcGFjaGUub3JnL3Rlc3QvCiAKICMjIFdpc2gKICAgICAqIFtUSFJJRlQtMjE5MF0gLSBBZGQgdGhlIEphdmFTY3JpcHQgdGhyaWZ0LmpzIGxpYiB0byB0aGUgQm93ZXIgcmVnaXN0cnkKICAgICAqIFtUSFJJRlQtMjA3Nl0gLSBib29zdDo6b3B0aW9uYWwgaW5zdGVhZCBvZiBfX2lzc2V0CiAKIAorCiBUaHJpZnQgMC45LjEKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAjIyBCdWcKZGlmZiAtLWdpdCBhL0NNYWtlTGlzdHMudHh0IGIvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY1N2E2NgotLS0gL2Rldi9udWxsCisrKyBiL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMTI0IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworY21ha2VfbWluaW11bV9yZXF1aXJlZChWRVJTSU9OIDMuMSkKKworIyBDTWFrZSAzLjEgc3VwcG9ydHMgQysrIHN0YW5kYXJkcyBzZWxlY3Rpb24gd2l0aCBDTUFLRV9DWFhfU1RBTkRBUkQKKyMgSWYgeW91IG5lZWQgQ01ha2UgMy4xKyBmb3IgVWJ1bnR1IDE0LjA0LCB0cnkKKyMgICBodHRwczovL2xhdW5jaHBhZC5uZXQvfmdlb3JnZS1lZGlzb241NS8rYXJjaGl2ZS91YnVudHUvY21ha2UtMy54CisjIElmIHlvdSBuZWVkIENNYWtlIDMuMSsgZm9yIGRlYmlhbiAiamVzc2llIiwgZ2V0IGl0IGZyb20gamVzc2llLWJhY2twb3J0cworIyBPdGhlcndpc2UKKyMgICBodHRwOi8vY21ha2Uub3JnCisKK3Byb2plY3QoIkFwYWNoZSBUaHJpZnQiKQorCitzZXQoQ01BS0VfTU9EVUxFX1BBVEggIiR7Q01BS0VfTU9EVUxFX1BBVEh9IiAiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2J1aWxkL2NtYWtlIikKKworIyBUT0RPOiBhZGQgYGdpdCByZXYtcGFyc2UgLS1zaG9ydCBIRUFEYAorIyBSZWFkIHRoZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGZyb20gdGhlIEF1dG9jb25mIGZpbGUKK2ZpbGUgKFNUUklOR1MgIiR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9jb25maWd1cmUuYWMiIENPTkZJR1VSRV9BQyBSRUdFWCAiQUNfSU5JVFxcKC4qXFwpIiApCisKKyMgVGhlIGZvbGxvd2luZyB2YXJpYWJsZSBpcyB1c2VkIGluIHRoZSB2ZXJzaW9uLmguaW4gZmlsZQorc3RyaW5nKFJFR0VYIFJFUExBQ0UgIkFDX0lOSVRcXChcXFsuKlxcXSwgXFxbKFswLTldK1xcLlswLTldK1xcLlswLTldKygtZGV2KT8pXFxdXFwpIiAiXFwxIiBQQUNLQUdFX1ZFUlNJT04gJHtDT05GSUdVUkVfQUN9KQorbWVzc2FnZShTVEFUVVMgIlBhcnNlZCBUaHJpZnQgcGFja2FnZSB2ZXJzaW9uOiAke1BBQ0tBR0VfVkVSU0lPTn0iKQorCisjIFRoZXNlIGFyZSBpbnRlcm5hbCB0byBDTWFrZQorc3RyaW5nKFJFR0VYIFJFUExBQ0UgIihbMC05XStcXC5bMC05XStcXC5bMC05XSspKC1kZXYpPyIgIlxcMSIgdGhyaWZ0X1ZFUlNJT04gJHtQQUNLQUdFX1ZFUlNJT059KQorc3RyaW5nKFJFR0VYIFJFUExBQ0UgIihbMC05XSspXFwuWzAtOV0rXFwuWzAtOV0rIiAiXFwxIiB0aHJpZnRfVkVSU0lPTl9NQUpPUiAke3RocmlmdF9WRVJTSU9OfSkKK3N0cmluZyhSRUdFWCBSRVBMQUNFICJbMC05XStcXC4oWzAtOV0pK1xcLlswLTldKyIgIlxcMSIgdGhyaWZ0X1ZFUlNJT05fTUlOT1IgJHt0aHJpZnRfVkVSU0lPTn0pCitzdHJpbmcoUkVHRVggUkVQTEFDRSAiWzAtOV0rXFwuWzAtOV0rXFwuKFswLTldKykiICJcXDEiIHRocmlmdF9WRVJTSU9OX1BBVENIICR7dGhyaWZ0X1ZFUlNJT059KQorbWVzc2FnZShTVEFUVVMgIlBhcnNlZCBUaHJpZnQgdmVyc2lvbjogJHt0aHJpZnRfVkVSU0lPTn0gKCR7dGhyaWZ0X1ZFUlNJT05fTUFKT1J9LiR7dGhyaWZ0X1ZFUlNJT05fTUlOT1J9LiR7dGhyaWZ0X1ZFUlNJT05fUEFUQ0h9KSIpCisKKyMgU29tZSBkZWZhdWx0IHNldHRpbmdzCitpbmNsdWRlKERlZmluZUNNYWtlRGVmYXVsdHMpCisKKyMgQnVpbGQgdGltZSBvcHRpb25zIGFyZSBkZWZpbmVkIGhlcmUKK2luY2x1ZGUoRGVmaW5lT3B0aW9ucykKK2luY2x1ZGUoRGVmaW5lSW5zdGFsbGF0aW9uUGF0aHMpCisKKyMgQmFzZWQgb24gdGhlIG9wdGlvbnMgc2V0IHNvbWUgcGxhdGZvcm0gc3BlY2lmaWNzCitpbmNsdWRlKERlZmluZVBsYXRmb3JtU3BlY2lmYykKKworIyBHZW5lcmF0ZSB0aGUgY29uZmlnLmggZmlsZQoraW5jbHVkZShDb25maWd1cmVDaGVja3MpCisKKyMgUGFja2FnZSBpdAoraW5jbHVkZShDUGFja0NvbmZpZykKKworCitmaW5kX3BhY2thZ2UoVGhyZWFkcykKKworaW5jbHVkZShDVGVzdCkKK2lmKEJVSUxEX1RFU1RJTkcpCisgIG1lc3NhZ2UoU1RBVFVTICJCdWlsZGluZyB3aXRoIHVuaXR0ZXN0cyIpCisKKyAgZW5hYmxlX3Rlc3RpbmcoKQorICAjIERlZmluZSAibWFrZSBjaGVjayIgYXMgYWxpYXMgZm9yICJtYWtlIHRlc3QiCisgIGFkZF9jdXN0b21fdGFyZ2V0KGNoZWNrIENPTU1BTkQgY3Rlc3QpCitlbHNlICgpCisgIG1lc3NhZ2UoU1RBVFVTICJCdWlsZGluZyB3aXRob3V0IHRlc3RzIikKK2VuZGlmICgpCisKK2lmKEJVSUxEX0NPTVBJTEVSKQorICAgIGlmKE5PVCBFWElTVFMgJHtUSFJJRlRfQ09NUElMRVJ9KQorICAgICAgICBzZXQoVEhSSUZUX0NPTVBJTEVSICQ8VEFSR0VUX0ZJTEU6dGhyaWZ0LWNvbXBpbGVyPikKKyAgICBlbmRpZigpCisgICAgYWRkX3N1YmRpcmVjdG9yeSgke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vY29tcGlsZXIvY3BwKQorZWxzZWlmKEVYSVNUUyAke1RIUklGVF9DT01QSUxFUn0pCisgICAgYWRkX2V4ZWN1dGFibGUodGhyaWZ0LWNvbXBpbGVyIElNUE9SVEVEKQorICAgIHNldF9wcm9wZXJ0eShUQVJHRVQgdGhyaWZ0LWNvbXBpbGVyIFBST1BFUlRZIElNUE9SVEVEX0xPQ0FUSU9OICR7VEhSSUZUX0NPTVBJTEVSfSkKK2VuZGlmKCkKKworaWYoQlVJTERfQ1BQKQorICAgIGFkZF9zdWJkaXJlY3RvcnkoJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2xpYi9jcHApCisgICAgaWYoQlVJTERfVFVUT1JJQUxTKQorICAgICAgICBhZGRfc3ViZGlyZWN0b3J5KCR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS90dXRvcmlhbC9jcHApCisgICAgZW5kaWYoKQorICAgIGlmKEJVSUxEX1RFU1RJTkcpCisgICAgICAgIGlmKFdJVEhfTElCRVZFTlQgQU5EIFdJVEhfWkxJQiBBTkQgV0lUSF9PUEVOU1NMKQorICAgICAgICAgICAgYWRkX3N1YmRpcmVjdG9yeSgke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vdGVzdC9jcHApCisgICAgICAgIGVsc2UoKQorICAgICAgICAgICAgbWVzc2FnZShXQVJOSU5HICJsaWJldmVudCBhbmQvb3IgWkxJQiBhbmQvb3IgT3BlblNTTCBub3QgZm91bmQgb3IgZGlzYWJsZWQ7IHdpbGwgbm90IGJ1aWxkIHNvbWUgdGVzdHMiKQorICAgICAgICBlbmRpZigpCisgICAgZW5kaWYoKQorZW5kaWYoKQorCitpZihCVUlMRF9DX0dMSUIpCisgICAgYWRkX3N1YmRpcmVjdG9yeSgke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vbGliL2NfZ2xpYikKK2VuZGlmKCkKKworaWYoQlVJTERfSkFWQSkKKyAgICBhZGRfc3ViZGlyZWN0b3J5KCR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9saWIvamF2YSkKK2VuZGlmKCkKKworaWYoQlVJTERfUFlUSE9OKQorICAgIGFkZF9zdWJkaXJlY3RvcnkoJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2xpYi9weSkKKyAgICBpZihCVUlMRF9URVNUSU5HKQorICAgICAgICBhZGRfc3ViZGlyZWN0b3J5KCR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS90ZXN0L3B5KQorICAgIGVuZGlmKCkKK2VuZGlmKCkKKworaWYoQlVJTERfSEFTS0VMTCkKKyAgICBhZGRfc3ViZGlyZWN0b3J5KCR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9saWIvaHMpCisgICAgaWYoQlVJTERfVEVTVElORykKKyAgICAgICAgYWRkX3N1YmRpcmVjdG9yeSgke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vdGVzdC9ocykKKyAgICBlbmRpZigpCitlbmRpZigpCisKK1BSSU5UX0NPTkZJR19TVU1NQVJZKCkKZGlmZiAtLWdpdCBhL0NPTlRSSUJVVElORy5tZCBiL0NPTlRSSUJVVElORy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTFkNzEwCi0tLSAvZGV2L251bGwKKysrIGIvQ09OVFJJQlVUSU5HLm1kCkBAIC0wLDAgKzEsMTE2IEBACisjIEhvdyB0byBDb250cmlidXRlICMKKworVGhhbmsgeW91IGZvciB5b3VyIGludGVyZXN0IGluIGNvbnRyaWJ1dGluZyB0byB0aGUgQXBhY2hlIFRocmlmdCBwcm9qZWN0ISAgSW5mb3JtYXRpb24gb24gd2h5IGFuZCBob3cgdG8gY29udHJpYnV0ZSBpcyBhdmFpbGFibGUgb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHdlYiBzaXRlLiBJbiBwYXJ0aWN1bGFyLCB3ZSByZWNvbW1lbmQgdGhlIGZvbGxvd2luZyB0byBiZWNvbWUgYWNxdWFpbnRlZCB3aXRoIEFwYWNoZSBDb250cmlidXRpb25zOgorCisgKiBbQ29udHJpYnV0b3JzIFRlY2ggR3VpZGVdKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kZXYvY29udHJpYnV0b3JzKQorICogW0dldCBpbnZvbHZlZCFdKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9mb3VuZGF0aW9uL2dldGludm9sdmVkLmh0bWwpCisgKiBbTGVnYWwgYXNwZWN0cyBvbiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMgKFBhdGNoZXMpXShodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAuaHRtbCNjb250cmlidXRpb25zKQorCisjIyBHaXRIdWIgcHVsbCByZXF1ZXN0cyAjIworCitUaGlzIGlzIHRoZSBwcmVmZXJyZWQgbWV0aG9kIG9mIHN1Ym1pdHRpbmcgY2hhbmdlcy4gIFdoZW4geW91IHN1Ym1pdCBhIHB1bGwgcmVxdWVzdCB0aHJvdWdoIGdpdGh1YiwKK2l0IGFjdGl2YXRlcyB0aGUgY29udGludW91cyBpbnRlZ3JhdGlvbiAoQ0kpIGJ1aWxkIHN5c3RlbXMgYXQgQXBwdmV5b3IgYW5kIFRyYXZpcyB0byBidWlsZCB5b3VyIGNoYW5nZXN4aQorb24gYSB2YXJpZXR5IG9mIExpbnV4IGFuZCBXaW5kb3dzIGNvbmZpZ3VyYXRpb25zIGFuZCBydW4gYWxsIHRoZSB0ZXN0IHN1aXRlcy4gIEZvbGxvdyB0aGVzZSByZXF1aXJlbWVudHMgCitmb3IgYSBzdWNjZXNzZnVsIHB1bGwgcmVxdWVzdDoKKworIDEuIEFsbCBjb2RlIGNoYW5nZXMgcmVxdWlyZSBhbiBbQXBhY2hlIEppcmEgVEhSSUZUIElzc3VlXShodHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUKSB0aWNrZXQuCisKKyAxLiBBbGwgcHVsbCByZXF1ZXN0cyBzaG91bGQgY29udGFpbiBhIHNpbmdsZSBjb21taXQgcGVyIGlzc3VlLCBvciB3ZSB3aWxsIGFzayB5b3UgdG8gc3F1YXNoIGl0LgorIDEuIFRoZSBwdWxsIHJlcXVlc3QgdGl0bGUgbXVzdCBiZWdpbiB3aXRoIHRoZSBKaXJhIFRIUklGVCB0aWNrZXQgaWRlbnRpZmllciwgZm9yIGV4YW1wbGU6CisKKyAgICAgICAgVEhSSUZULTk5OTk6IGFuIGV4YW1wbGUgcHVsbCByZXF1ZXN0IHRpdGxlCisgICAgICAgIAorIDEuIENvbW1pdCBtZXNzYWdlcyBtdXN0IGZvbGxvdyB0aGlzIHBhdHRlcm4gZm9yIGNvZGUgY2hhbmdlcyAoZGV2aWF0aW9ucyB3aWxsIG5vdCBiZSBtZXJnZWQpOgorICAgICAgICAKKyAgICAgICAgVEhSSUZULTk5OTk6IFtzdW1tYXJ5IG9mIGZpeCwgb25lIGxpbmUgaWYgcG9zc2libGVdCisgICAgICAgIENsaWVudDogW2xhbmd1YWdlKHMpIGFmZmVjdGVkLCBjb21tYSBzZXBhcmF0ZWQsIHVzZSBsaWIvIGRpcmVjdG9yeSBuYW1lcyBwbGVhc2VdCisKK0luc3RydWN0aW9uczoKKworIDEuIENyZWF0ZSBhIGZvcmsgaW4geW91ciBHaXRIdWIgYWNjb3VudCBvZiBodHRwOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0CisgMS4gQ2xvbmUgdGhlIGZvcmsgdG8geW91ciBkZXZlbG9wbWVudCBzeXN0ZW0uCisgMS4gQ3JlYXRlIGEgYnJhbmNoIGZvciB5b3VyIGNoYW5nZXMgKGJlc3QgcHJhY3RpY2UgaXMgaXNzdWUgYXMgYnJhbmNoIG5hbWUsIGUuZy4gVEhSSUZULTk5OTkpLgorIDEuIE1vZGlmeSB0aGUgc291cmNlIHRvIGluY2x1ZGUgdGhlIGltcHJvdmVtZW50L2J1Z2ZpeCwgYW5kOgorCisgICAgKiBSZW1lbWJlciB0byBwcm92aWRlICp0ZXN0cyogZm9yIGFsbCBzdWJtaXR0ZWQgY2hhbmdlcyEKKyAgICAqIFVzZSB0ZXN0LWRyaXZlbiBkZXZlbG9wbWVudCAoVEREKTogYWRkIGEgdGVzdCB0aGF0IHdpbGwgaXNvbGF0ZSB0aGUgYnVnICpiZWZvcmUqIGFwcGx5aW5nIHRoZSBjaGFuZ2UgdGhhdCBmaXhlcyBpdC4KKyAgICAqIFZlcmlmeSB0aGF0IHlvdSBmb2xsb3cgW1RocmlmdCBDb2RpbmcgU3RhbmRhcmRzXSgvZG9jcy9jb2Rpbmdfc3RhbmRhcmRzKSAoeW91IGNhbiBydW4gJ21ha2Ugc3R5bGUnLCB3aGljaCBlbnN1cmVzIHByb3BlciBmb3JtYXQgZm9yIHNvbWUgbGFuZ3VhZ2VzKS4KKyAgICAqIFsqb3B0aW9uYWwqXSBWZXJpZnkgdGhhdCB5b3VyIGNoYW5nZSB3b3JrcyBvbiBvdGhlciBwbGF0Zm9ybXMgYnkgYWRkaW5nIGEgR2l0SHViIHNlcnZpY2UgaG9vayB0byBbVHJhdmlzIENJXShodHRwOi8vZG9jcy50cmF2aXMtY2kuY29tL3VzZXIvZ2V0dGluZy1zdGFydGVkLyNTdGVwLW9uZSUzQS1TaWduLWluKSBhbmQgW0FwcFZleW9yXShodHRwOi8vd3d3LmFwcHZleW9yLmNvbS9kb2NzKS4gIFlvdSBjYW4gdXNlIHRoaXMgdGVjaG5pcXVlIHRvIHJ1biB0aGUgVGhyaWZ0IENJIGpvYnMgaW4geW91ciBhY2NvdW50IHRvIGNoZWNrIHlvdXIgY2hhbmdlcyBiZWZvcmUgdGhleSBhcmUgbWFkZSBwdWJsaWMuICBFdmVyeSBHaXRIdWIgcHVsbCByZXF1ZXN0IGludG8gVGhyaWZ0IHdpbGwgcnVuIHRoZSBmdWxsIENJIGJ1aWxkIGFuZCB0ZXN0IHN1aXRlIG9uIHlvdXIgY2hhbmdlcy4KKworIDEuIFNxdWFzaCB5b3VyIGNoYW5nZXMgdG8gYSBzaW5nbGUgY29tbWl0LiAgVGhpcyBtYWludGFpbnMgY2xlYW4gY2hhbmdlIGhpc3RvcnkuCisgMS4gQ29tbWl0IGFuZCBwdXNoIGNoYW5nZXMgdG8geW91ciBicmFuY2ggKHBsZWFzZSB1c2UgaXNzdWUgbmFtZSBhbmQgZGVzY3JpcHRpb24gYXMgY29tbWl0IHRpdGxlLCBlLmcuICJUSFJJRlQtOTk5OTogbWFrZSBpdCBwZXJmZWN0IiksIHdpdGggdGhlIGFmZmVjdGVkIGxhbmd1YWdlcyBvbiB0aGUgbmV4dCBsaW5lIG9mIHRoZSBkZXNjcmlwdGlvbi4KKyAxLiBVc2UgR2l0SHViIHRvIGNyZWF0ZSBhIHB1bGwgcmVxdWVzdCBnb2luZyBmcm9tIHlvdXIgYnJhbmNoIHRvIGFwYWNoZTptYXN0ZXIuICBFbnN1cmUgdGhhdCB0aGUgSmlyYSB0aWNrZXQgbnVtYmVyIGlzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRpdGxlIG9mIHlvdXIgcHVsbCByZXF1ZXN0LCBzYW1lIGFzIHRoZSBjb21taXQgdGl0bGUuCisgMS4gV2FpdCBmb3Igb3RoZXIgY29udHJpYnV0b3JzIG9yIGNvbW1pdHRlcnMgdG8gcmV2aWV3IHlvdXIgbmV3IGFkZGl0aW9uLCBhbmQgZm9yIGEgQ0kgYnVpbGQgdG8gY29tcGxldGUuCisgMS4gV2FpdCBmb3IgYSBjb21taXR0ZXIgdG8gY29tbWl0IHlvdXIgcGF0Y2guICBZb3UgY2FuIG51ZGdlIHRoZSBjb21taXR0ZXJzIGlmIG5lY2Vzc2FyeSBieSBzZW5kaW5nIGEgbWVzc2FnZSB0byB0aGUgW0FwYWNoZSBUaHJpZnQgbWFpbGluZyBsaXN0XShodHRwczovL3RocmlmdC5hcGFjaGUub3JnL21haWxpbmcpLgorCisjIyBJZiB5b3Ugd2FudCB0byBidWlsZCB0aGUgcHJvamVjdCBsb2NhbGx5ICMjCisKK0ZvciBXaW5kb3dzIHN5c3RlbXMsIHNlZSBvdXIgZGV0YWlsZWQgaW5zdHJ1Y3Rpb25zIG9uIHRoZSBbQ01ha2UgUkVBRE1FXSgvYnVpbGQvY21ha2UvUkVBRE1FLm1kKS4KKworRm9yIFdpbmRvd3MgTmF0aXZlIEMrKyBidWlsZHMsIHNlZSBvdXIgZGV0YWlsZWQgaW5zdHJ1Y3Rpb25zIG9uIHRoZSBbV2luQ1BQIFJFQURNRV0oL2J1aWxkL3dpbmNwcC9SRUFETUUubWQpLgorCitGb3IgdW5peCBzeXN0ZW1zLCBzZWUgb3VyIGRldGFpbGVkIGluc3RydWN0aW9ucyBvbiB0aGUgW0RvY2tlciBSRUFETUVdKC9idWlsZC9kb2NrZXIvUkVBRE1FLm1kKS4KKworIyMgSWYgeW91IHdhbnQgdG8gcmV2aWV3IG9wZW4gaXNzdWVzLi4uICMjCisKKyAxLiBSZXZpZXcgdGhlIFtHaXRIdWIgUHVsbCBSZXF1ZXN0IEJhY2tsb2ddKGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0L3B1bGxzKS4gIENvZGUgcmV2aWV3cyBhcmUgb3BlbiB0byBhbGwuCisgMi4gUmV2aWV3IHRoZSBbSmlyYSBpc3N1ZSB0cmFja2VyXShodHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUKS4gIFlvdSBjYW4gc2VhcmNoIGZvciB0aWNrZXRzIHJlbGF0aW5nIHRvIGxhbmd1YWdlcyB5b3UgYXJlIGludGVyZXN0ZWQgaW4gb3IgY3VycmVudGx5IHVzaW5nIHdpdGggdGhyaWZ0LCBmb3IgZXhhbXBsZSBhIEppcmEgc2VhcmNoIChJc3N1ZXMgLT4gU2VhcmNoIEZvciBJc3N1ZXMpIHF1ZXJ5IG9mIGBgcHJvamVjdCA9IFRIUklGVCBBTkQgY29tcG9uZW50IGluICgiRXJsYW5nIC0gTGlicmFyeSIpIGFuZCBzdGF0dXMgbm90IGluIChyZXNvbHZlZCwgY2xvc2VkKWBgIHdpbGwgbG9jYXRlIGFsbCB0aGUgb3BlbiBFcmxhbmcgTGlicmFyeSBpc3N1ZXMuCisKKyMjIElmIHlvdSBkaXNjb3ZlcmVkIGEgZGVmZWN0Li4uICMjCisKKyAxLiBDaGVjayB0byBzZWUgaWYgdGhlIGlzc3VlIGlzIGFscmVhZHkgaW4gdGhlIFtKaXJhIGlzc3VlIHRyYWNrZXJdKGh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQpLgorIDEuIElmIG5vdCwgY3JlYXRlIGEgdGlja2V0IGRlc2NyaWJpbmcgdGhlIGNoYW5nZSB5b3UncmUgcHJvcG9zaW5nIGluIHRoZSBKaXJhIGlzc3VlIHRyYWNrZXIuCisgMS4gQ29udHJpYnV0ZSB5b3VyIGNvZGUgY2hhbmdlcyB1c2luZyB0aGUgR2l0SHViIHB1bGwgcmVxdWVzdCBtZXRob2Q6CisKKyMjIENvbnRyaWJ1dGluZyB2aWEgUGF0Y2ggIyMKKworU29tZSBjaGFuZ2VzIGRvIG5vdCByZXF1aXJlIGEgYnVpbGQsIGZvciBleGFtcGxlIGluIGRvY3VtZW50YXRpb24uICBGb3IgY2hhbmdlcyB0aGF0IGFyZSBub3QgY29kZSBvciBidWlsZCByZWxhdGVkLCB5b3UgY2FuIHN1Ym1pdCBhIHBhdGNoIG9uIEppcmEgZm9yIHJldmlldy4gIFRvIGNyZWF0ZSBhIHBhdGNoIGZyb20gY2hhbmdlcyBpbiB5b3VyIGxvY2FsIGRpcmVjdG9yeToKKworICAgIGdpdCBkaWZmID4gLi4vVEhSSUZULU5OTk4ucGF0Y2gKKwordGhlbiB3YWl0IGZvciBjb250cmlidXRvcnMgb3IgY29tbWl0dGVycyB0byByZXZpZXcgeW91ciBjaGFuZ2VzLCBhbmQgdGhlbiBmb3IgYSBjb21taXR0ZXIgdG8gYXBwbHkgeW91ciBwYXRjaC4KKworIyMgR2l0SHViIHJlY2lwZXMgZm9yIFB1bGwgUmVxdWVzdHMgIyMKKworU29tZXRpbWVzIGNvbW1taXR0ZXJzIG1heSBhc2sgeW91IHRvIHRha2UgYWN0aW9ucyBpbiB5b3VyIHB1bGwgcmVxdWVzdHMuICBIZXJlIGFyZSBzb21lIHJlY2lwZXMgdGhhdCB3aWxsIGhlbHAgeW91IGFjY29tcGxpc2ggdGhvc2UgcmVxdWVzdHMuICBUaGVzZSBleGFtcGxlcyBhc3N1bWUgeW91IGFyZSB3b3JraW5nIG9uIEppcmEgaXNzdWUgVEhSSUZULTk5OTkuICBZb3Ugc2hvdWxkIGFsc28gYmUgZmFtaWxpYXIgd2l0aCB0aGUgW3Vwc3RyZWFtXShodHRwczovL2hlbHAuZ2l0aHViLmNvbS9hcnRpY2xlcy9zeW5jaW5nLWEtZm9yay8pIHJlcG9zaXRvcnkgY29uY2VwdC4KKworIyMjIFNxdWFzaCB5b3VyIGNoYW5nZXMgIyMjCisKK0lmIHlvdSBoYXZlIG5vdCBzdWJtaXR0ZWQgYSBwdWxsIHJlcXVlc3QgeWV0LCBvciBpZiB5b3UgaGF2ZSBub3QgeWV0IHJlYmFzZWQgeW91ciBleGlzdGluZyBwdWxsIHJlcXVlc3QsIHlvdSBjYW4gc3F1YXNoIGFsbCB5b3VyIGNvbW1pdHMgZG93biB0byBhIHNpbmdsZSBjb21taXQuICBUaGlzIG1ha2VzIGxpZmUgZWFzaWVyIGZvciB0aGUgY29tbWl0dGVycy4gIElmIHlvdXIgcHVsbCByZXF1ZXN0IG9uIEdpdEh1YiBoYXMgbW9yZSB0aGFuIG9uZSBjb21taXQsIHlvdSBzaG91bGQgZG8gdGhpcy4KKworMS4gVXNlIHRoZSBjb21tYW5kIGBgZ2l0IGxvZ2BgIHRvIGlkZW50aWZ5IGhvdyBtYW55IGNvbW1pdHMgeW91IG1hZGUgc2luY2UgeW91IGJlZ2FuLgorMi4gVXNlIHRoZSBjb21tYW5kIGBgZ2l0IHJlYmFzZSAtaSBIRUFEfk5gYCB3aGVyZSBOIGlzIHRoZSBudW1iZXIgb2YgY29tbWl0cy4KKzMuIExlYXZlICJwdWxsIiBpbiB0aGUgZmlyc3QgbGluZS4KKzQuIENoYW5nZSBhbGwgb3RoZXIgbGluZXMgZnJvbSAicHVsbCIgdG8gImZpeHVwIi4KKzUuIEFsbCB5b3VyIGNoYW5nZXMgYXJlIG5vdyBpbiBhIHNpbmdsZSBjb21taXQuCisKK0lmIHlvdSBhbHJlYWR5IGhhdmUgYSBwdWxsIHJlcXVlc3Qgb3V0c3RhbmRpbmcsIHlvdSB3aWxsIG5lZWQgdG8gZG8gYSAiZm9yY2UgcHVzaCIgdG8gb3ZlcndyaXRlIGl0IHNpbmNlIHlvdSBjaGFuZ2VkIHlvdXIgY29tbWl0IGhpc3Rvcnk6CisKKyAgICBnaXQgcHVzaCAtdSBvcmlnaW4gVEhSSUZULTk5OTkgLS1mb3JjZQorCitBIG1vcmUgZGV0YWlsZWQgd2Fsa3Rocm91Z2ggb2YgYSBzcXVhc2ggY2FuIGJlIGZvdW5kIGF0IFtHaXQgUmVhZHldKGh0dHA6Ly9naXRyZWFkeS5jb20vYWR2YW5jZWQvMjAwOS8wMi8xMC9zcXVhc2hpbmctY29tbWl0cy13aXRoLXJlYmFzZS5odG1sKS4KKworIyMjIFJlYmFzZSB5b3VyIHB1bGwgcmVxdWVzdCAjIyMKKworSWYgeW91ciBwdWxsIHJlcXVlc3QgaGFzIGEgY29uZmxpY3Qgd2l0aCBtYXN0ZXIsIGl0IG5lZWRzIHRvIGJlIHJlYmFzZWQ6CisKKyAgICBnaXQgY2hlY2tvdXQgVEhSSUZULTk5OTkKKyAgICBnaXQgcmViYXNlIHVwc3RyZWFtIG1hc3RlcgorICAgICAgKHJlc29sdmUgYW55IGNvbmZsaWN0cywgbWFrZSBzdXJlIGl0IGJ1aWxkcykKKyAgICBnaXQgcHVzaCAtdSBvcmlnaW4gVEhSSUZULTk5OTkgLS1mb3JjZQorCisjIyMgRml4IGEgYmFkIG1lcmdlICMjIworCitJZiB5b3VyIHB1bGwgcmVxdWVzdCBjb250YWlucyBjb21taXRzIHRoYXQgYXJlIG5vdCB5b3VycywgdGhlbiB5b3Ugc2hvdWxkIHVzZSB0aGUgZm9sbG93aW5nIHRlY2huaXF1ZSB0byBmaXggdGhlIGJhZCBtZXJnZSBpbiB5b3VyIGJyYW5jaDoKKworICAgIGdpdCBjaGVja291dCBtYXN0ZXIKKyAgICBnaXQgcHVsbCB1cHN0cmVhbSBtYXN0ZXIKKyAgICBnaXQgY2hlY2tvdXQgLWIgVEhSSUZULTk5OTktdGFrZS0yCisgICAgZ2l0IGNoZXJyeS1waWNrIC4uLgorICAgICAgICAocGljayBvbmx5IHlvdXIgY29tbWl0cyBmcm9tIHlvdXIgb3JpZ2luYWwgcHVsbCByZXF1ZXN0IGluIGFzY2VuZGluZyBjaHJvbm9sb2dpY2FsIG9yZGVyKQorICAgIHNxdWFzaCB5b3VyIGNoYW5nZXMgdG8gYSBzaW5nbGUgY29tbWl0IGlmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgKHNlZSBhYm92ZSkKKyAgICBnaXQgcHVzaCAtdSBvcmlnaW4gVEhSSUZULTk5OTktdGFrZS0yOlRIUklGVC05OTk5CisKK1RoaXMgcHJvY2VkdXJlIHdpbGwgYXBwbHkgb25seSB5b3VyIGNvbW1pdHMgaW4gb3JkZXIgdG8gdGhlIGN1cnJlbnQgbWFzdGVyLCB0aGVuIHlvdSB3aWxsIHNxdWFzaCB0aGVtIHRvIGEgc2luZ2xlIGNvbW1pdCwgYW5kIHRoZW4geW91IGZvcmNlIHB1c2ggeW91ciBsb2NhbCBUSFJJRlQtOTk5OS10YWtlLTIgaW50byByZW1vdGUgVEhSSUZULTk5OTkgd2hpY2ggcmVwcmVzZW50cyB5b3VyIHB1bGwgcmVxdWVzdCwgcmVwbGFjaW5nIGFsbCB0aGUgY29tbWl0cyB3aXRoIHRoZSBuZXcgb25lLgorCisgCmRpZmYgLS1naXQgYS9MQU5HVUFHRVMubWQgYi9MQU5HVUFHRVMubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRhM2NmNQotLS0gL2Rldi9udWxsCisrKyBiL0xBTkdVQUdFUy5tZApAQCAtMCwwICsxLDM1NSBAQAorIyBBcGFjaGUgVGhyaWZ0IExhbmd1YWdlIFN1cHBvcnQgIworCitMYXN0IE1vZGlmaWVkOiAyMDE4LTEyLTE3CisKK0d1aWRhbmNlIEZvcjogMC4xMi4wIG9yIGxhdGVyCisKK1RocmlmdCBzdXBwb3J0cyBtYW55IHByb2dyYW1taW5nIGxhbmd1YWdlcyBhbmQgaGFzIGFuIGltcHJlc3NpdmUgdGVzdCBzdWl0ZSB0aGF0IGV4ZXJjaXNlcyBtb3N0IG9mIHRoZSBsYW5ndWFnZXMsIHByb3RvY29scywgYW5kIHRyYW5zcG9ydHMgdGhhdCByZXByZXNlbnRzIGEgbWF0cml4IG9mIHRob3VzYW5kcyBvZiBwb3NzaWJsZSBjb21iaW5hdGlvbnMuICBFYWNoIGxhbmd1YWdlIHR5cGljYWxseSBoYXMgYSBtaW5pbXVtIHJlcXVpcmVkIHZlcnNpb24gYXMgd2VsbCBhcyBzdXBwb3J0IGxpYnJhcmllcyAtIHNvbWUgbWFuZGF0b3J5IGFuZCBzb21lIG9wdGlvbmFsLiAgQWxsIG9mIHRoaXMgaW5mb3JtYXRpb24gaXMgcHJvdmlkZWQgYmVsb3cgdG8gaGVscCB5b3UgYXNzZXNzIHdoZXRoZXIgeW91IGNhbiB1c2UgQXBhY2hlIFRocmlmdCB3aXRoIHlvdXIgcHJvamVjdC4gIE9idmlvdXNseSB0aGlzIGlzIGEgY29tcGxleCBtYXRyaXggdG8gbWFpbnRhaW4gYW5kIG1heSBub3QgYmUgY29ycmVjdCBpbiBhbGwgY2FzZXMgLSBpZiB5b3Ugc3BvdCBhbiBlcnJvciBwbGVhc2UgaW5mb3JtIHRoZSBkZXZlbG9wZXJzIHVzaW5nIHRoZSBtYWlsaW5nIGxpc3QuCisKK0FwYWNoZSBUaHJpZnQgaGFzIGEgY2hvaWNlIG9mIHR3byBidWlsZCBzeXN0ZW1zLiAgVGhlIGBhdXRvY29uZmAgYnVpbGQgc3lzdGVtIGlzIHRoZSBtb3N0IGNvbXBsZXRlIGJ1aWxkIGFuZCBpcyB1c2VkIHRvIGJ1aWxkIGFsbCBzdXBwb3J0ZWQgbGFuZ3VhZ2VzLiAgVGhlIGBjbWFrZWAgYnVpbGQgc3lzdGVtIGhhcyBiZWVuIGRlc2lnbmF0ZWQgYnkgdGhlIHByb2plY3QgdG8gcmVwbGFjZSBgYXV0b2NvbmZgIGhvd2V2ZXIgdGhpcyB0cmFuc2l0aW9uIHdpbGwgdGFrZSBxdWl0ZSBzb21lIHRpbWUgdG8gY29tcGxldGUuCisKK1RoZSBMYW5ndWFnZS9MaWJyYXJ5IExldmVscyBpbmRpY2F0ZSB0aGUgbWluaW11bSBhbmQgbWF4aW11bSB2ZXJzaW9ucyB0aGF0IGFyZSB1c2VkIGluIHRoZSBbY29udGludW91cyBpbnRlZ3JhdGlvbiBlbnZpcm9ubWVudHNdKGJ1aWxkL2RvY2tlci9SRUFETUUubWQpIChBcHB2ZXlvciwgVHJhdmlzKSBmb3IgQXBhY2hlIFRocmlmdC4gIE90aGVyIGxhbmd1YWdlIGxldmVscyBtYXkgYmUgc3VwcG9ydGVkIGZvciBlYWNoIGxhbmd1YWdlLCBob3dldmVyIHRlc3RlZCBsZXNzIHRob3JvdWdobHk7IGNoZWNrIHRoZSBSRUFETUUgZmlsZSBpbnNpZGUgZWFjaCBsaWIgZGlyZWN0b3J5IGZvciBhZGRpdGlvbmFsIGRldGFpbHMuICBOb3RlIHRoYXQgd2hpbGUgYSBsYW5ndWFnZSBtYXkgY29udGFpbiBzdXBwb3J0IGZvciBwcm90b2NvbHMsIHRyYW5zcG9ydHMsIGFuZCBzZXJ2ZXJzLCB0aGUgZXh0ZW50IHRvIHdoaWNoIGVhY2ggaXMgdGVzdGVkIGFzIHBhcnQgb2YgdGhlIG92ZXJhbGwgYnVpbGQgcHJvY2VzcyB2YXJpZXMuICBUaGUgZGVmaW5pdGl2ZSBpbnRlZ3JhdGlvbiB0ZXN0IGZvciB0aGUgcHJvamVjdCBpcyBjYWxsZWQgdGhlICJjcm9zcyIgdGVzdCB3aGljaCBleGVjdXRlcyBhIHRlc3QgbWF0cml4IHdpdGggY2xpZW50cyBhbmQgc2VydmVycyBjb21tdW5pY2F0aW5nIGFjcm9zcyBsYW5ndWFnZXMuCisKKzx0YWJsZSBzdHlsZT0iZm9udC1zaXplOiA2MCU7IHBhZGRpbmc6IDFweDsiPgorPHRoZWFkPgorPHRyPgorPHRoIHJvd3NwYW49Mj5MYW5ndWFnZTwvdGg+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+CmRpZmYgLS1naXQgYS9MSUNFTlNFIGIvTElDRU5TRQppbmRleCA4ZGI4MzdiLi4zYjZkN2Q3IDEwMDY0NAotLS0gYS9MSUNFTlNFCisrKyBiL0xJQ0VOU0UKQEAgLTIyNiwzNiArMjI2LDE0IEBACiAjICAgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgbm90aWNlIGFyZSBwcmVzZXJ2ZWQuCiAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Gb3IgdGhlIGNvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L21kNS5bY2hdIGNvbXBvbmVudHM6CitGb3IgdGhlIGxpYi9ub2RlanMvbGliL3RocmlmdC9qc29uX3BhcnNlLmpzOgogCiAvKgotICBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDIgQWxhZGRpbiBFbnRlcnByaXNlcy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgICAganNvbl9wYXJzZS5qcworICAgIDIwMTUtMDUtMDIKKyAgICBQdWJsaWMgRG9tYWluLgorICAgIE5PIFdBUlJBTlRZIEVYUFJFU1NFRCBPUiBJTVBMSUVELiBVU0UgQVQgWU9VUiBPV04gUklTSy4KIAotICBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAotICB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCi0gIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCi0KLSAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCi0gIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKLSAgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgotCi0gIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90Ci0gICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCi0gICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQotICAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgotICAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQotICAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCi0gIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCi0KLSAgTC4gUGV0ZXIgRGV1dHNjaAotICBnaG9zdEBhbGFkZGluLmNvbQotCi0gKi8KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Gb3IgdGhlIGxpYi9yYi9zZXR1cC5yYjogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgTWluZXJvIEFva2ksCi1saWIvb2NhbWwvT0NhbWxNYWtlZmlsZSBhbmQgbGliL29jYW1sL1JFQURNRS1PQ2FtbE1ha2VmaWxlIGNvbXBvbmVudHM6Ci0gICAgIENvcHlyaWdodCAoQykgMTk5OSAtIDIwMDcgIE1hcmt1cyBNb3R0bAotCi1MaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAyLjEKLShzZWUgZG9jL2xncGwtMi4xLnR4dCBmb3IgdGhlIGZ1bGwgdGVybXMgb2YgdGhpcyBsaWNlbnNlKQorKi8KKyhCeSBEb3VnbGFzIENyb2NrZm9yZCA8ZG91Z2xhc0Bjcm9ja2ZvcmQuY29tPikKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9NYWtlZmlsZS5hbSBiL01ha2VmaWxlLmFtCmluZGV4IDI2ZGRhYjYuLjUxMTQ1MmQgMTAwNzU1Ci0tLSBhL01ha2VmaWxlLmFtCisrKyBiL01ha2VmaWxlLmFtCkBAIC0xOSw3ICsxOSwxNSBAQAogCiBBQ0xPQ0FMX0FNRkxBR1MgPSAtSSAuL2FjbG9jYWwKIAoraWYgV0lUSF9QTFVHSU4KKyMgVG8gZW5hYmxlIGJvb3RzdHJhcCwgYnVpbGQgb3JkZXIgaXMgbGliL2NwcCAtPiBjb21waWxlciAtPiBvdGhlcnMKK1NVQkRJUlMgPSBsaWIvY3BwIGNvbXBpbGVyL2NwcCBsaWIKK2lmIFdJVEhfVEVTVFMKK1NVQkRJUlMgKz0gbGliL2NwcC90ZXN0CitlbmRpZgorZWxzZQogU1VCRElSUyA9IGNvbXBpbGVyL2NwcCBsaWIKK2VuZGlmCiAKIGlmIFdJVEhfVEVTVFMKIFNVQkRJUlMgKz0gdGVzdApAQCAtMzUsMjIgKzQzLDkzIEBACiAJZmluZCAkKGRpc3RkaXIpIC10eXBlIGQgXCggLWluYW1lICIuc3ZuIiAtb3IgLWluYW1lICIuZ2l0IiBcKSB8IHhhcmdzIHJtIC1yZgogCiBwcmludC12ZXJzaW9uOgotCUBlY2hvICQoVkVSU0lPTikKKwlAZWNobyAkKFBBQ0tBR0VfVkVSU0lPTikKIAorLlBIT05ZOiBwcmVjcm9zcyBjcm9zcworcHJlY3Jvc3MtJTogYWxsCisJJChNQUtFKSAtQyAkKiBwcmVjcm9zcworcHJlY3Jvc3M6IGFsbCBwcmVjcm9zcy10ZXN0IHByZWNyb3NzLWxpYgogCi1jcm9zczogY2hlY2sKLQlzaCB0ZXN0L3Rlc3Quc2gKK2VtcHR5IDo9CitzcGFjZSA6PSAkKGVtcHR5KSAkKGVtcHR5KQorY29tbWEgOj0gLAorCitDUk9TU19MQU5HUyA9IEBNQVlCRV9DUFBAIEBNQVlCRV9DX0dMSUJAIEBNQVlCRV9DTEAgQE1BWUJFX0RAIEBNQVlCRV9KQVZBQCBATUFZQkVfQ1NIQVJQQCBATUFZQkVfUFlUSE9OQCBATUFZQkVfUFkzQCBATUFZQkVfUlVCWUAgQE1BWUJFX0hBU0tFTExAIEBNQVlCRV9QRVJMQCBATUFZQkVfUEhQQCBATUFZQkVfR09AIEBNQVlCRV9OT0RFSlNAIEBNQVlCRV9EQVJUQCBATUFZQkVfRVJMQU5HQCBATUFZQkVfTFVBQCBATUFZQkVfUlNAIEBNQVlCRV9ET1RORVRDT1JFQCBATUFZQkVfTk9ERVRTQAorQ1JPU1NfTEFOR1NfQ09NTUFfU0VQQVJBVEVEID0gJChzdWJzdCAkKHNwYWNlKSwkKGNvbW1hKSwkKENST1NTX0xBTkdTKSkKKworaWYgV0lUSF9QWTMKK0NST1NTX1BZPSQoUFlUSE9OMykKK2Vsc2UKK0NST1NTX1BZPSQoUFlUSE9OKQorZW5kaWYKKworaWYgV0lUSF9QWVRIT04KK2Nyb3NzZmVhdHVyZTogcHJlY3Jvc3MKKwkkKENST1NTX1BZKSB0ZXN0L3Rlc3QucHkgLS1yZXRyeS1jb3VudCA1IC0tZmVhdHVyZXMgLiogLS1za2lwLWtub3duLWZhaWx1cmVzIC0tc2VydmVyICQoQ1JPU1NfTEFOR1NfQ09NTUFfU0VQQVJBVEVEKQorZWxzZQorIyBmZWF0dXJlIHRlc3QgbmVlZHMgcHl0aG9uIGJ1aWxkCitjcm9zc2ZlYXR1cmU6CitlbmRpZgorCitjcm9zcy0lOiBwcmVjcm9zcyBjcm9zc2ZlYXR1cmUKKwkkKENST1NTX1BZKSB0ZXN0L3Rlc3QucHkgLS1yZXRyeS1jb3VudCA1IC0tc2tpcC1rbm93bi1mYWlsdXJlcyAtLXNlcnZlciAkKENST1NTX0xBTkdTX0NPTU1BX1NFUEFSQVRFRCkgLS1jbGllbnQgJChDUk9TU19MQU5HU19DT01NQV9TRVBBUkFURUQpIC0tcmVnZXggIiQqIgorCitjcm9zczogY3Jvc3MtLioKKworVElNRVMgPSAxIDIgMworZmFpbDogcHJlY3Jvc3MKKwkkKENST1NTX1BZKSB0ZXN0L3Rlc3QucHkgfHwgdHJ1ZQorCSQoQ1JPU1NfUFkpIHRlc3QvdGVzdC5weSAtLXVwZGF0ZS1leHBlY3RlZC1mYWlsdXJlcz1vdmVyd3JpdGUKKwkkKGZvcmVhY2ggdmFyLCQoVElNRVMpLHRlc3QvdGVzdC5weSAtcyB8fCB0cnVlO3Rlc3QvdGVzdC5weSAtLXVwZGF0ZS1leHBlY3RlZC1mYWlsdXJlcz1tZXJnZTspCisKK2NvZGVzcGVsbF9za2lwX2ZpbGVzID0gXAorCSouamFyIFwKKwkqLmNsYXNzIFwKKwkqLnNvIFwKKwkqLmEgXAorCSoubGEgXAorCSoubyBcCisJKi5wMTIgXAorCSpPQ2FtbE1ha2VmaWxlIFwKKwkua2V5c3RvcmUgXAorCS50cnVzdHN0b3JlIFwKKwlDSEFOR0VTIFwKKwljb25maWcuc3ViIFwKKwljb25maWd1cmUgXAorCWRlcGNvbXAgXAorCWxpYnRvb2wubTQgXAorCW91dHB1dC4qIFwKKwlyZWJhciBcCisJdGhyaWZ0CisKK3NraXBwZWRfZmlsZXMgPSAkKHN1YnN0ICQoc3BhY2UpLCQoY29tbWEpLCQoY29kZXNwZWxsX3NraXBfZmlsZXMpKQorCitzdHlsZS1sb2NhbDoKKwljb2Rlc3BlbGwgLS13cml0ZS1jaGFuZ2VzIC0tc2tpcD0kKHNraXBwZWRfZmlsZXMpIC0tZGlzYWJsZS1jb2xvcnMKIAogRVhUUkFfRElTVCA9IFwKKwkuY2xhbmctZm9ybWF0IFwKKwkuZWRpdG9yY29uZmlnIFwKIAkudHJhdmlzLnltbCBcCisJLnJ1c3RmbXQudG9tbCBcCisJLmRvY2tlcmlnbm9yZSBcCisJYXBwdmV5b3IueW1sIFwKIAlib3dlci5qc29uIFwKKwlidWlsZCBcCisJYm9vdHN0cmFwLnNoIFwKKwljbGVhbnVwLnNoIFwKKwlDTWFrZUxpc3RzLnR4dCBcCiAJY29tcG9zZXIuanNvbiBcCiAJY29udHJpYiBcCisJQ09OVFJJQlVUSU5HLm1kIFwKIAlkZWJpYW4gXAogCWRvYyBcCiAJZG9hcC5yZGYgXAorCXBhY2thZ2UuanNvbiBcCiAJc29uYXItcHJvamVjdC5wcm9wZXJ0aWVzIFwKKwlMQU5HVUFHRVMubWQgXAogCUxJQ0VOU0UgXAogCUNIQU5HRVMgXAogCU5PVElDRSBcCi0JUkVBRE1FLm1kCisJUkVBRE1FLm1kIFwKKwlUaHJpZnQucG9kc3BlYwpkaWZmIC0tZ2l0IGEvTk9USUNFIGIvTk9USUNFCmluZGV4IGMyMzk5NWEuLjkwMmRjOGQgMTAwNjQ0Ci0tLSBhL05PVElDRQorKysgYi9OT1RJQ0UKQEAgLTEsNSArMSw1IEBACiBBcGFjaGUgVGhyaWZ0Ci1Db3B5cmlnaHQgMjAwNi0yMDEwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KK0NvcHlyaWdodCAyMDA2LTIwMTcgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogCiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGF0Ci1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK1RoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuCmRpZmYgLS1naXQgYS9SRUFETUUubWQgYi9SRUFETUUubWQKaW5kZXggYWRkNWNkYi4uZDA5ZTZlMSAxMDA2NDQKLS0tIGEvUkVBRE1FLm1kCisrKyBiL1JFQURNRS5tZApAQCAtMSw3ICsxLDQzIEBACiBBcGFjaGUgVGhyaWZ0CiA9PT09PT09PT09PT09CiAKLUxhc3QgTW9kaWZpZWQ6IDIwMTQtMDMtMTYKK0ludHJvZHVjdGlvbgorPT09PT09PT09PT09CisKK1RocmlmdCBpcyBhIGxpZ2h0d2VpZ2h0LCBsYW5ndWFnZS1pbmRlcGVuZGVudCBzb2Z0d2FyZSBzdGFjayB3aXRoIGFuCithc3NvY2lhdGVkIGNvZGUgZ2VuZXJhdGlvbiBtZWNoYW5pc20gZm9yIHBvaW50LXRvLXBvaW50IFJQQy4gVGhyaWZ0IHByb3ZpZGVzIAorY2xlYW4gYWJzdHJhY3Rpb25zIGZvciBkYXRhIHRyYW5zcG9ydCwgZGF0YSBzZXJpYWxpemF0aW9uLCBhbmQgYXBwbGljYXRpb24KK2xldmVsIHByb2Nlc3NpbmcuIFRoZSBjb2RlIGdlbmVyYXRpb24gc3lzdGVtIHRha2VzIGEgc2ltcGxlIGRlZmluaXRpb24KK2xhbmd1YWdlIGFzIGlucHV0IGFuZCBnZW5lcmF0ZXMgY29kZSBhY3Jvc3MgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzIHRoYXQKK3VzZXMgdGhlIGFic3RyYWN0ZWQgc3RhY2sgdG8gYnVpbGQgaW50ZXJvcGVyYWJsZSBSUEMgY2xpZW50cyBhbmQgc2VydmVycy4KKworIVtBcGFjaGUgVGhyaWZ0IExheWVyZWQgQXJjaGl0ZWN0dXJlXShkb2MvaW1hZ2VzL3RocmlmdC1sYXllcnMucG5nKQorCitUaHJpZnQgbWFrZXMgaXQgZWFzeSBmb3IgcHJvZ3JhbXMgd3JpdHRlbiBpbiBkaWZmZXJlbnQgcHJvZ3JhbW1pbmcKK2xhbmd1YWdlcyB0byBzaGFyZSBkYXRhIGFuZCBjYWxsIHJlbW90ZSBwcm9jZWR1cmVzLiAgV2l0aCBzdXBwb3J0IAorZm9yIFsyNSBwcm9ncmFtbWluZyBsYW5ndWFnZXNdKExBTkdVQUdFUy5tZCksIGNoYW5jZXMgYXJlIFRocmlmdCAKK3N1cHBvcnRzIHRoZSBsYW5ndWFnZXMgdGhhdCB5b3UgY3VycmVudGx5IHVzZS4KKworVGhyaWZ0IGlzIHNwZWNpZmljYWxseSBkZXNpZ25lZCB0byBzdXBwb3J0IG5vbi1hdG9taWMgdmVyc2lvbiBjaGFuZ2VzCithY3Jvc3MgY2xpZW50IGFuZCBzZXJ2ZXIgY29kZS4KKworRm9yIG1vcmUgZGV0YWlscyBvbiBUaHJpZnQncyBkZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uLCBzZWUgdGhlIFRocmlmdAord2hpdGVwYXBlciBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgb3IgYXQgdGhlIFJFQURNRS5tZCBmaWxlCitpbiB5b3VyIHBhcnRpY3VsYXIgc3ViZGlyZWN0b3J5IG9mIGludGVyZXN0LgorCitTdGF0dXMKKz09PT09PQorCit8IEJyYW5jaCB8IFRyYXZpcyB8IEFwcHZleW9yIHwgQ292ZXJpdHkgU2NhbiB8IGNvZGVjb3YuaW8gfCBXZWJzaXRlIHwKK3wgOi0tLS0tIHwgOi0tLS0tIHwgOi0tLS0tLS0gfCA6LS0tLS0tLS0tLS0tIHwgOi0tLS0tLS0tLSB8IDotLS0tLS0gfAorfCBbYG1hc3RlcmBdKGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0L3RyZWUvbWFzdGVyKSB8IFshW0J1aWxkIFN0YXR1c10oaHR0cHM6Ly90cmF2aXMtY2kub3JnL2FwYWNoZS90aHJpZnQuc3ZnP2JyYW5jaD1tYXN0ZXIpXShodHRwczovL3RyYXZpcy1jaS5vcmcvYXBhY2hlL3RocmlmdCkgfCBbIVtCdWlsZCBzdGF0dXNdKGh0dHBzOi8vY2kuYXBwdmV5b3IuY29tL2FwaS9wcm9qZWN0cy9zdGF0dXMvZ2l0aHViL2FwYWNoZS90aHJpZnQ/YnJhbmNoPW1hc3RlciZzdmc9dHJ1ZSldKGh0dHBzOi8vY2kuYXBwdmV5b3IuY29tL3Byb2plY3QvQXBhY2hlU29mdHdhcmVGb3VuZGF0aW9uL3RocmlmdC9oaXN0b3J5KSB8IFshW0NvdmVyaXR5IFNjYW4gQnVpbGQgU3RhdHVzXShodHRwczovL3NjYW4uY292ZXJpdHkuY29tL3Byb2plY3RzLzEzNDUvYmFkZ2Uuc3ZnKV0oaHR0cHM6Ly9zY2FuLmNvdmVyaXR5LmNvbS9wcm9qZWN0cy90aHJpZnQpIHwgfCBbIVtXZWJzaXRlXShodHRwczovL2ltZy5zaGllbGRzLmlvL2JhZGdlL29mZmljaWFsLXdlYnNpdGUtYnJpZ2h0Z3JlZW4uc3ZnKV0oaHR0cHM6Ly90aHJpZnQuYXBhY2hlLm9yZy8pIHwKKworUmVsZWFzZXMKKz09PT09PT09CisKK1RocmlmdCBkb2VzIG5vdCBtYWludGFpbiBhIHNwZWNpZmljIHJlbGVhc2UgY2FsZW5kYXIgYXQgdGhpcyB0aW1lLiAgCisKK1dlIHN0cml2ZSB0byByZWxlYXNlIHR3aWNlIHllYXJseS4gIERvd25sb2FkIHRoZSBbY3VycmVudCByZWxlYXNlXShodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcvZG93bmxvYWQpLgogCiBMaWNlbnNlCiA9PT09PT09CkBAIC0yMywzMiArNTksMTcgQEAKIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKIHVuZGVyIHRoZSBMaWNlbnNlLgogCi1JbnRyb2R1Y3Rpb24KLT09PT09PT09PT09PQotCi1UaHJpZnQgaXMgYSBsaWdodHdlaWdodCwgbGFuZ3VhZ2UtaW5kZXBlbmRlbnQgc29mdHdhcmUgc3RhY2sgd2l0aCBhbgotYXNzb2NpYXRlZCBjb2RlIGdlbmVyYXRpb24gbWVjaGFuaXNtIGZvciBSUEMuIFRocmlmdCBwcm92aWRlcyBjbGVhbgotYWJzdHJhY3Rpb25zIGZvciBkYXRhIHRyYW5zcG9ydCwgZGF0YSBzZXJpYWxpemF0aW9uLCBhbmQgYXBwbGljYXRpb24KLWxldmVsIHByb2Nlc3NpbmcuIFRoZSBjb2RlIGdlbmVyYXRpb24gc3lzdGVtIHRha2VzIGEgc2ltcGxlIGRlZmluaXRpb24KLWxhbmd1YWdlIGFzIGl0cyBpbnB1dCBhbmQgZ2VuZXJhdGVzIGNvZGUgYWNyb3NzIHByb2dyYW1taW5nIGxhbmd1YWdlcyB0aGF0Ci11c2VzIHRoZSBhYnN0cmFjdGVkIHN0YWNrIHRvIGJ1aWxkIGludGVyb3BlcmFibGUgUlBDIGNsaWVudHMgYW5kIHNlcnZlcnMuCi0KLVRocmlmdCBpcyBzcGVjaWZpY2FsbHkgZGVzaWduZWQgdG8gc3VwcG9ydCBub24tYXRvbWljIHZlcnNpb24gY2hhbmdlcwotYWNyb3NzIGNsaWVudCBhbmQgc2VydmVyIGNvZGUuCi0KLUZvciBtb3JlIGRldGFpbHMgb24gVGhyaWZ0J3MgZGVzaWduIGFuZCBpbXBsZW1lbnRhdGlvbiwgdGFrZSBhIGdhbmRlciBhdAotdGhlIFRocmlmdCB3aGl0ZXBhcGVyIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIG9yIGF0IHRoZSBSRUFETUUubWQgZmlsZXMKLWluIHlvdXIgcGFydGljdWxhciBzdWJkaXJlY3Rvcnkgb2YgaW50ZXJlc3QuCi0KLUhpZXJhcmNoeQotPT09PT09PT09CitQcm9qZWN0IEhpZXJhcmNoeQorPT09PT09PT09PT09PT09PT0KIAogdGhyaWZ0LwogCiAgIGNvbXBpbGVyLworCiAgICAgQ29udGFpbnMgdGhlIFRocmlmdCBjb21waWxlciwgaW1wbGVtZW50ZWQgaW4gQysrLgogCiAgIGxpYi8KKwogICAgIENvbnRhaW5zIHRoZSBUaHJpZnQgc29mdHdhcmUgbGlicmFyeSBpbXBsZW1lbnRhdGlvbiwgc3ViZGl2aWRlZCBieQogICAgIGxhbmd1YWdlIG9mIGltcGxlbWVudGF0aW9uLgogCkBAIC01OCw2ICs3OSw3IEBACiAgICAgcGhwLwogICAgIHB5LwogICAgIHJiLworICAgIC4uLgogCiAgIHRlc3QvCiAKQEAgLTY5LDEwICs5MSwxNiBAQAogICAgIENvbnRhaW5zIGEgYmFzaWMgdHV0b3JpYWwgdGhhdCB3aWxsIHRlYWNoIHlvdSBob3cgdG8gZGV2ZWxvcCBzb2Z0d2FyZQogICAgIHVzaW5nIFRocmlmdC4KIAorRGV2ZWxvcG1lbnQKKz09PT09PT09PT09CisKK1RvIGJ1aWxkIHRoZSBzYW1lIHdheSBUcmF2aXMgQ0kgYnVpbGRzIHRoZSBwcm9qZWN0IHlvdSBzaG91bGQgdXNlIGRvY2tlci4KK1dlIGhhdmUgW2NvbXByZWhlbnNpdmUgYnVpbGRpbmcgaW5zdHJ1Y3Rpb25zIGZvciBkb2NrZXJdKGJ1aWxkL2RvY2tlci9SRUFETUUubWQpLgorCiBSZXF1aXJlbWVudHMKID09PT09PT09PT09PQogCi1TZWUgaHR0cDovL3RocmlmdC5hcGFjaGUub3JnL2RvY3MvaW5zdGFsbCBmb3IgYW4gdXAtdG8tZGF0ZSBsaXN0IG9mIGJ1aWxkIHJlcXVpcmVtZW50cy4KK1NlZSBodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcvZG9jcy9pbnN0YWxsIGZvciBhIGxpc3Qgb2YgYnVpbGQgcmVxdWlyZW1lbnRzIChtYXkgYmUgc3RhbGUpLiAgQWx0ZXJuYXRpdmVseSBzZWUgdGhlIGRvY2tlciBidWlsZCBlbnZpcm9ubWVudHMgZm9yIGEgbGlzdCBvZiBwcmVyZXF1aXNpdGVzLgogCiBSZXNvdXJjZXMKID09PT09PT09PQpAQCAtMTYwLDMgKzE4OCw1IEBACiAKIFRoaXMgd2lsbCBydW4gYSBzZXQgb2YgdGVzdHMgdGhhdCB1c2UgZGlmZmVyZW50IGxhbmd1YWdlIGNsaWVudHMgYW5kCiBzZXJ2ZXJzLgorCisKZGlmZiAtLWdpdCBhL1RocmlmdC1zd2lmdDMucG9kc3BlYyBiL1RocmlmdC1zd2lmdDMucG9kc3BlYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjZjMDBiCi0tLSAvZGV2L251bGwKKysrIGIvVGhyaWZ0LXN3aWZ0My5wb2RzcGVjCkBAIC0wLDAgKzEsMTYgQEAKK1BvZDo6U3BlYy5uZXcgZG8gfHN8CisgIHMubmFtZSAgICAgICAgICA9ICJUaHJpZnQtc3dpZnQzIgorICBzLnZlcnNpb24gICAgICAgPSAiMS4wLjAiCisgIHMuc3VtbWFyeSAgICAgICA9ICJBcGFjaGUgVGhyaWZ0IGlzIGEgbGlnaHR3ZWlnaHQsIGxhbmd1YWdlLWluZGVwZW5kZW50IHNvZnR3YXJlIHN0YWNrIHdpdGggYW4gYXNzb2NpYXRlZCBjb2RlIGdlbmVyYXRpb24gbWVjaGFuaXNtIGZvciBSUEMuIgorICBzLmRlc2NyaXB0aW9uICAgPSA8PC1ERVNDCitUaGUgQXBhY2hlIFRocmlmdCBzY2FsYWJsZSBjcm9zcy1sYW5ndWFnZSBzb2Z0d2FyZSBmcmFtZXdvcmsgZm9yIG5ldHdvcmtlZCBzZXJ2aWNlcyBkZXZlbG9wbWVudCBjb21iaW5lcyBhIHNvZnR3YXJlIHN0YWNrIHdpdGggYSBjb2RlIGdlbmVyYXRpb24gZW5naW5lIHRvIGJ1aWxkIHNlcnZpY2VzIHRoYXQgd29yayBlZmZpY2llbnRseSBhbmQgc2VhbWxlc3NseSBiZXR3ZWVuIG1hbnkgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzLgorICAgICAgICAgICAgICAgICAgICBERVNDCisgIHMuaG9tZXBhZ2UgICAgICA9ICJodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmciCisgIHMubGljZW5zZSAgICAgICA9IHsgOnR5cGUgPT4gJ0FwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCcsIDp1cmwgPT4gJ2h0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAnIH0KKyAgcy5hdXRob3IgICAgICAgID0geyAiQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzIiA9PiAiZGV2QHRocmlmdC5hcGFjaGUub3JnIiB9CisgIHMuaW9zLmRlcGxveW1lbnRfdGFyZ2V0ID0gJzkuMCcKKyAgcy5vc3guZGVwbG95bWVudF90YXJnZXQgPSAnMTAuMTAnCisgIHMucmVxdWlyZXNfYXJjICA9IHRydWUKKyAgcy5zb3VyY2UgICAgICAgID0geyA6Z2l0ID0+ICJodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC5naXQiLCA6dGFnID0+ICJ2MS4wLjAiIH0KKyAgcy5zb3VyY2VfZmlsZXMgID0gImxpYi9zd2lmdC9Tb3VyY2VzLyouc3dpZnQiCitlbmQKZGlmZiAtLWdpdCBhL1RocmlmdC5wb2RzcGVjIGIvVGhyaWZ0LnBvZHNwZWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQwNmVlYwotLS0gL2Rldi9udWxsCisrKyBiL1RocmlmdC5wb2RzcGVjCkBAIC0wLDAgKzEsMTggQEAKK1BvZDo6U3BlYy5uZXcgZG8gfHN8CisgIHMubmFtZSAgICAgICAgICA9ICJUaHJpZnQiCisgIHMudmVyc2lvbiAgICAgICA9ICIxLjAuMCIKKyAgcy5zdW1tYXJ5ICAgICAgID0gIkFwYWNoZSBUaHJpZnQgaXMgYSBsaWdodHdlaWdodCwgbGFuZ3VhZ2UtaW5kZXBlbmRlbnQgc29mdHdhcmUgc3RhY2sgd2l0aCBhbiBhc3NvY2lhdGVkIGNvZGUgZ2VuZXJhdGlvbiBtZWNoYW5pc20gZm9yIFJQQy4iCisgIHMuZGVzY3JpcHRpb24gICA9IDw8LURFU0MKK1RoZSBBcGFjaGUgVGhyaWZ0IHNjYWxhYmxlIGNyb3NzLWxhbmd1YWdlIHNvZnR3YXJlIGZyYW1ld29yayBmb3IgbmV0d29ya2VkIHNlcnZpY2VzIGRldmVsb3BtZW50IGNvbWJpbmVzIGEgc29mdHdhcmUgc3RhY2sgd2l0aCBhIGNvZGUgZ2VuZXJhdGlvbiBlbmdpbmUgdG8gYnVpbGQgc2VydmljZXMgdGhhdCB3b3JrIGVmZmljaWVudGx5IGFuZCBzZWFtbGVzc2x5IGJldHdlZW4gbWFueSBwcm9ncmFtbWluZyBsYW5ndWFnZXMuCisgICAgICAgICAgICAgICAgICAgIERFU0MKKyAgcy5ob21lcGFnZSAgICAgID0gImh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZyIKKyAgcy5saWNlbnNlICAgICAgID0geyA6dHlwZSA9PiAnQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wJywgOnVybCA9PiAnaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCcgfQorICBzLmF1dGhvciAgICAgICAgPSB7ICJBcGFjaGUgVGhyaWZ0IERldmVsb3BlcnMiID0+ICJkZXZAdGhyaWZ0LmFwYWNoZS5vcmciIH0KKyAgcy5yZXF1aXJlc19hcmMgID0gdHJ1ZQorICBzLmlvcy5kZXBsb3ltZW50X3RhcmdldCA9ICc3LjAnCisgIHMub3N4LmRlcGxveW1lbnRfdGFyZ2V0ID0gJzEwLjgnCisgIHMuaW9zLmZyYW1ld29yayA9ICdDRk5ldHdvcmsnCisgIHMub3N4LmZyYW1ld29yayA9ICdDb3JlU2VydmljZXMnCisgIHMuc291cmNlICAgICAgICA9IHsgOmdpdCA9PiAiaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQuZ2l0IiwgOnRhZyA9PiAidjEuMC4wIiB9CisgIHMuc291cmNlX2ZpbGVzICA9ICdsaWIvY29jb2Evc3JjLyoqLyoue2gsbSxzd2lmdH0nCitlbmQKZGlmZiAtLWdpdCBhL2FjbG9jYWwvYXhfYm9vc3RfYmFzZS5tNCBiL2FjbG9jYWwvYXhfYm9vc3RfYmFzZS5tNAppbmRleCBiNDk2MDIwLi5kNTQwMzk1IDEwMDY0NAotLS0gYS9hY2xvY2FsL2F4X2Jvb3N0X2Jhc2UubTQKKysrIGIvYWNsb2NhbC9heF9ib29zdF9iYXNlLm00CkBAIC0xLDUgKzEsNSBAQAogIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgICAgICAgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2F1dG9jb25mLWFyY2hpdmUvYXhfYm9vc3RfYmFzZS5odG1sCisjICAgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9hdXRvY29uZi1hcmNoaXZlL2F4X2Jvb3N0X2Jhc2UuaHRtbAogIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICMKICMgU1lOT1BTSVMKQEAgLTMzLDcgKzMzLDE1IEBACiAjICAgYW5kIHRoaXMgbm90aWNlIGFyZSBwcmVzZXJ2ZWQuIFRoaXMgZmlsZSBpcyBvZmZlcmVkIGFzLWlzLCB3aXRob3V0IGFueQogIyAgIHdhcnJhbnR5LgogCi0jc2VyaWFsIDIzCisjc2VyaWFsIDQ1CisKKyMgZXhhbXBsZSBib29zdCBwcm9ncmFtIChuZWVkIHRvIHBhc3MgdmVyc2lvbikKK200X2RlZmluZShbX0FYX0JPT1NUX0JBU0VfUFJPR1JBTV0sCisgICAgICAgICAgW0FDX0xBTkdfUFJPR1JBTShbWworI2luY2x1ZGUgPGJvb3N0L3ZlcnNpb24uaHBwPgorXV0sW1sKKyh2b2lkKSAoKHZvaWQpc2l6ZW9mKGNoYXJbMSAtIDIqISEoKEJPT1NUX1ZFUlNJT04pIDwgKCQxKSldKSk7CitdXSldKQogCiBBQ19ERUZVTihbQVhfQk9PU1RfQkFTRV0sCiBbCkBAIC00NCwxMDEgKzUyLDEyMSBAQAogICAgICBvciBkaXNhYmxlIGl0IChBUkc9bm8pCiAgICAgIEA8OkBBUkc9eWVzQDo+QCBdKV0sCiAgICAgWwotICAgIGlmIHRlc3QgIiR3aXRodmFsIiA9ICJubyI7IHRoZW4KLSAgICAgICAgd2FudF9ib29zdD0ibm8iCi0gICAgZWxpZiB0ZXN0ICIkd2l0aHZhbCIgPSAieWVzIjsgdGhlbgotICAgICAgICB3YW50X2Jvb3N0PSJ5ZXMiCi0gICAgICAgIGFjX2Jvb3N0X3BhdGg9IiIKLSAgICBlbHNlCi0gICAgICAgIHdhbnRfYm9vc3Q9InllcyIKLSAgICAgICAgYWNfYm9vc3RfcGF0aD0iJHdpdGh2YWwiCi0gICAgZmkKKyAgICAgQVNfQ0FTRShbJHdpdGh2YWxdLAorICAgICAgIFtub10sW3dhbnRfYm9vc3Q9Im5vIjtfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoPSIiXSwKKyAgICAgICBbeWVzXSxbd2FudF9ib29zdD0ieWVzIjtfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoPSIiXSwKKyAgICAgICBbd2FudF9ib29zdD0ieWVzIjtfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoPSIkd2l0aHZhbCJdKQogICAgIF0sCiAgICAgW3dhbnRfYm9vc3Q9InllcyJdKQogCiAKIEFDX0FSR19XSVRIKFtib29zdC1saWJkaXJdLAotICAgICAgICBBU19IRUxQX1NUUklORyhbLS13aXRoLWJvb3N0LWxpYmRpcj1MSUJfRElSXSwKLSAgICAgICAgW0ZvcmNlIGdpdmVuIGRpcmVjdG9yeSBmb3IgYm9vc3QgbGlicmFyaWVzLiBOb3RlIHRoYXQgdGhpcyB3aWxsIG92ZXJyaWRlIGxpYnJhcnkgcGF0aCBkZXRlY3Rpb24sIHNvIHVzZSB0aGlzIHBhcmFtZXRlciBvbmx5IGlmIGRlZmF1bHQgbGlicmFyeSBkZXRlY3Rpb24gZmFpbHMgYW5kIHlvdSBrbm93IGV4YWN0bHkgd2hlcmUgeW91ciBib29zdCBsaWJyYXJpZXMgYXJlIGxvY2F0ZWQuXSksCi0gICAgICAgIFsKLSAgICAgICAgaWYgdGVzdCAtZCAiJHdpdGh2YWwiCi0gICAgICAgIHRoZW4KLSAgICAgICAgICAgICAgICBhY19ib29zdF9saWJfcGF0aD0iJHdpdGh2YWwiCi0gICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBBQ19NU0dfRVJST1IoLS13aXRoLWJvb3N0LWxpYmRpciBleHBlY3RlZCBkaXJlY3RvcnkgbmFtZSkKLSAgICAgICAgZmkKLSAgICAgICAgXSwKLSAgICAgICAgW2FjX2Jvb3N0X2xpYl9wYXRoPSIiXQotKQorICBbQVNfSEVMUF9TVFJJTkcoWy0td2l0aC1ib29zdC1saWJkaXI9TElCX0RJUl0sCisgICAgW0ZvcmNlIGdpdmVuIGRpcmVjdG9yeSBmb3IgYm9vc3QgbGlicmFyaWVzLgorICAgICBOb3RlIHRoYXQgdGhpcyB3aWxsIG92ZXJyaWRlIGxpYnJhcnkgcGF0aCBkZXRlY3Rpb24sCisgICAgIHNvIHVzZSB0aGlzIHBhcmFtZXRlciBvbmx5IGlmIGRlZmF1bHQgbGlicmFyeSBkZXRlY3Rpb24gZmFpbHMKKyAgICAgYW5kIHlvdSBrbm93IGV4YWN0bHkgd2hlcmUgeW91ciBib29zdCBsaWJyYXJpZXMgYXJlIGxvY2F0ZWQuXSldLAorICBbCisgICBBU19JRihbdGVzdCAtZCAiJHdpdGh2YWwiXSwKKyAgICAgICAgIFtfQVhfQk9PU1RfQkFTRV9ib29zdF9saWJfcGF0aD0iJHdpdGh2YWwiXSwKKyAgICBbQUNfTVNHX0VSUk9SKFstLXdpdGgtYm9vc3QtbGliZGlyIGV4cGVjdGVkIGRpcmVjdG9yeSBuYW1lXSldKQorICBdLAorICBbX0FYX0JPT1NUX0JBU0VfYm9vc3RfbGliX3BhdGg9IiJdKQogCi1pZiB0ZXN0ICJ4JHdhbnRfYm9vc3QiID0gInh5ZXMiOyB0aGVuCi0gICAgYm9vc3RfbGliX3ZlcnNpb25fcmVxPWlmZWxzZShbJDFdLCAsMS4yMC4wLCQxKQotICAgIGJvb3N0X2xpYl92ZXJzaW9uX3JlcV9zaG9ydGVuPWBleHByICRib29zdF9saWJfdmVyc2lvbl9yZXEgOiAnXChbWzAtOV1dKlwuW1swLTldXSpcKSdgCi0gICAgYm9vc3RfbGliX3ZlcnNpb25fcmVxX21ham9yPWBleHByICRib29zdF9saWJfdmVyc2lvbl9yZXEgOiAnXChbWzAtOV1dKlwpJ2AKLSAgICBib29zdF9saWJfdmVyc2lvbl9yZXFfbWlub3I9YGV4cHIgJGJvb3N0X2xpYl92ZXJzaW9uX3JlcSA6ICdbWzAtOV1dKlwuXChbWzAtOV1dKlwpJ2AKLSAgICBib29zdF9saWJfdmVyc2lvbl9yZXFfc3ViX21pbm9yPWBleHByICRib29zdF9saWJfdmVyc2lvbl9yZXEgOiAnW1swLTldXSpcLltbMC05XV0qXC5cKFtbMC05XV0qXCknYAotICAgIGlmIHRlc3QgIngkYm9vc3RfbGliX3ZlcnNpb25fcmVxX3N1Yl9taW5vciIgPSAieCIgOyB0aGVuCi0gICAgICAgIGJvb3N0X2xpYl92ZXJzaW9uX3JlcV9zdWJfbWlub3I9IjAiCi0gICAgICAgIGZpCi0gICAgV0FOVF9CT09TVF9WRVJTSU9OPWBleHByICRib29zdF9saWJfdmVyc2lvbl9yZXFfbWFqb3IgXCogMTAwMDAwIFwrICAkYm9vc3RfbGliX3ZlcnNpb25fcmVxX21pbm9yIFwqIDEwMCBcKyAkYm9vc3RfbGliX3ZlcnNpb25fcmVxX3N1Yl9taW5vcmAKLSAgICBBQ19NU0dfQ0hFQ0tJTkcoZm9yIGJvb3N0bGliID49ICRib29zdF9saWJfdmVyc2lvbl9yZXEpCitCT09TVF9MREZMQUdTPSIiCitCT09TVF9DUFBGTEFHUz0iIgorQVNfSUYoW3Rlc3QgIngkd2FudF9ib29zdCIgPSAieHllcyJdLAorICAgICAgW19BWF9CT09TVF9CQVNFX1JVTkRFVEVDVChbJDFdLFskMl0sWyQzXSldKQorQUNfU1VCU1QoQk9PU1RfQ1BQRkxBR1MpCitBQ19TVUJTVChCT09TVF9MREZMQUdTKQorXSkKKworCisjIGNvbnZlcnQgYSB2ZXJzaW9uIHN0cmluZyBpbiAkMiB0byBudW1lcmljIGFuZCBhZmZlY3QgdG8gcG9seW1vcnBoaWMgdmFyICQxCitBQ19ERUZVTihbX0FYX0JPT1NUX0JBU0VfVE9OVU1FUklDVkVSU0lPTl0sWworICBBU19JRihbdGVzdCAieCQyIiA9ICJ4Il0sW19BWF9CT09TVF9CQVNFX1RPTlVNRVJJQ1ZFUlNJT05fcmVxPSIxLjIwLjAiXSxbX0FYX0JPT1NUX0JBU0VfVE9OVU1FUklDVkVSU0lPTl9yZXE9IiQyIl0pCisgIF9BWF9CT09TVF9CQVNFX1RPTlVNRVJJQ1ZFUlNJT05fcmVxX3Nob3J0ZW49YGV4cHIgJF9BWF9CT09TVF9CQVNFX1RPTlVNRVJJQ1ZFUlNJT05fcmVxIDogJ1woW1swLTldXSpcLltbMC05XV0qXCknYAorICBfQVhfQk9PU1RfQkFTRV9UT05VTUVSSUNWRVJTSU9OX3JlcV9tYWpvcj1gZXhwciAkX0FYX0JPT1NUX0JBU0VfVE9OVU1FUklDVkVSU0lPTl9yZXEgOiAnXChbWzAtOV1dKlwpJ2AKKyAgQVNfSUYoW3Rlc3QgIngkX0FYX0JPT1NUX0JBU0VfVE9OVU1FUklDVkVSU0lPTl9yZXFfbWFqb3IiID0gIngiXSwKKyAgICAgICAgW0FDX01TR19FUlJPUihbWW91IHNob3VsZCBhdCBsZWFzdCBzcGVjaWZ5IGxpYmJvb3N0IG1ham9yIHZlcnNpb25dKV0pCisgIF9BWF9CT09TVF9CQVNFX1RPTlVNRVJJQ1ZFUlNJT05fcmVxX21pbm9yPWBleHByICRfQVhfQk9PU1RfQkFTRV9UT05VTUVSSUNWRVJTSU9OX3JlcSA6ICdbWzAtOV1dKlwuXChbWzAtOV1dKlwpJ2AKKyAgQVNfSUYoW3Rlc3QgIngkX0FYX0JPT1NUX0JBU0VfVE9OVU1FUklDVkVSU0lPTl9yZXFfbWlub3IiID0gIngiXSwKKyAgICAgICAgW19BWF9CT09TVF9CQVNFX1RPTlVNRVJJQ1ZFUlNJT05fcmVxX21pbm9yPSIwIl0pCisgIF9BWF9CT09TVF9CQVNFX1RPTlVNRVJJQ1ZFUlNJT05fcmVxX3N1Yl9taW5vcj1gZXhwciAkX0FYX0JPT1NUX0JBU0VfVE9OVU1FUklDVkVSU0lPTl9yZXEgOiAnW1swLTldXSpcLltbMC05XV0qXC5cKFtbMC05XV0qXCknYAorICBBU19JRihbdGVzdCAiWCRfQVhfQk9PU1RfQkFTRV9UT05VTUVSSUNWRVJTSU9OX3JlcV9zdWJfbWlub3IiID0gIlgiXSwKKyAgICAgICAgW19BWF9CT09TVF9CQVNFX1RPTlVNRVJJQ1ZFUlNJT05fcmVxX3N1Yl9taW5vcj0iMCJdKQorICBfQVhfQk9PU1RfQkFTRV9UT05VTUVSSUNWRVJTSU9OX1JFVD1gZXhwciAkX0FYX0JPT1NUX0JBU0VfVE9OVU1FUklDVkVSU0lPTl9yZXFfbWFqb3IgXCogMTAwMDAwIFwrICAkX0FYX0JPT1NUX0JBU0VfVE9OVU1FUklDVkVSU0lPTl9yZXFfbWlub3IgXCogMTAwIFwrICRfQVhfQk9PU1RfQkFTRV9UT05VTUVSSUNWRVJTSU9OX3JlcV9zdWJfbWlub3JgCisgIEFTX1ZBUl9TRVQoJDEsJF9BWF9CT09TVF9CQVNFX1RPTlVNRVJJQ1ZFUlNJT05fUkVUKQorXSkKKworZG5sIFJ1biB0aGUgZGV0ZWN0aW9uIG9mIGJvb3N0IHNob3VsZCBiZSBydW4gb25seSBpZiAkd2FudF9ib29zdAorQUNfREVGVU4oW19BWF9CT09TVF9CQVNFX1JVTkRFVEVDVF0sWworICAgIF9BWF9CT09TVF9CQVNFX1RPTlVNRVJJQ1ZFUlNJT04oV0FOVF9CT09TVF9WRVJTSU9OLFskMV0pCiAgICAgc3VjY2VlZGVkPW5vCiAKKworICAgIEFDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSkKICAgICBkbmwgT24gNjQtYml0IHN5c3RlbXMgY2hlY2sgZm9yIHN5c3RlbSBsaWJyYXJpZXMgaW4gYm90aCBsaWI2NCBhbmQgbGliLgogICAgIGRubCBUaGUgZm9ybWVyIGlzIHNwZWNpZmllZCBieSBGSFMsIGJ1dCBlLmcuIERlYmlhbiBkb2VzIG5vdCBhZGhlcmUgdG8KICAgICBkbmwgdGhpcyAoYXMgaXQgcmlzZXMgcHJvYmxlbXMgZm9yIGdlbmVyaWMgbXVsdGktYXJjaCBzdXBwb3J0KS4KICAgICBkbmwgVGhlIGxhc3QgZW50cnkgaW4gdGhlIGxpc3QgaXMgY2hvc2VuIGJ5IGRlZmF1bHQgd2hlbiBubyBsaWJyYXJpZXMKICAgICBkbmwgYXJlIGZvdW5kLCBlLmcuIHdoZW4gb25seSBoZWFkZXItb25seSBsaWJyYXJpZXMgYXJlIGluc3RhbGxlZCEKLSAgICBsaWJzdWJkaXJzPSJsaWIiCi0gICAgYXhfYXJjaD1gdW5hbWUgLW1gCi0gICAgY2FzZSAkYXhfYXJjaCBpbgotICAgICAgeDg2XzY0fHBwYzY0fHMzOTB4fHNwYXJjNjR8YWFyY2g2NCkKLSAgICAgICAgbGlic3ViZGlycz0ibGliNjQgbGliIGxpYjY0IgotICAgICAgICA7OwotICAgIGVzYWMKKyAgICBBU19DQVNFKFske2hvc3RfY3B1fV0sCisgICAgICBbeDg2XzY0XSxbbGlic3ViZGlycz0ibGliNjQgbGlieDMyIGxpYiBsaWI2NCJdLAorICAgICAgW3BwYzY0fHBvd2VycGM2NHxzMzkweHxzcGFyYzY0fGFhcmNoNjR8cHBjNjRsZXxwb3dlcnBjNjRsZXxyaXNjdjY0XSxbbGlic3ViZGlycz0ibGliNjQgbGliIGxpYjY0Il0sCisgICAgICBbbGlic3ViZGlycz0ibGliIl0KKyAgICApCiAKICAgICBkbmwgYWxsb3cgZm9yIHJlYWwgbXVsdGktYXJjaCBwYXRocyBlLmcuIC91c3IvbGliL3g4Nl82NC1saW51eC1nbnUuIEdpdmUKICAgICBkbmwgdGhlbSBwcmlvcml0eSBvdmVyIHRoZSBvdGhlciBwYXRocyBzaW5jZSwgaWYgbGlicyBhcmUgZm91bmQgdGhlcmUsIHRoZXkKICAgICBkbmwgYXJlIGFsbW9zdCBhc3N1cmVkbHkgdGhlIG9uZXMgZGVzaXJlZC4KLSAgICBBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pCi0gICAgbGlic3ViZGlycz0ibGliLyR7aG9zdF9jcHV9LSR7aG9zdF9vc30gJGxpYnN1YmRpcnMiCi0KLSAgICBjYXNlICR7aG9zdF9jcHV9IGluCi0gICAgICBpPzg2KQotICAgICAgICBsaWJzdWJkaXJzPSJsaWIvaTM4Ni0ke2hvc3Rfb3N9ICRsaWJzdWJkaXJzIgotICAgICAgICA7OwotICAgIGVzYWMKKyAgICBBU19DQVNFKFske2hvc3RfY3B1fV0sCisgICAgICBbaT84Nl0sW211bHRpYXJjaF9saWJzdWJkaXI9ImxpYi9pMzg2LSR7aG9zdF9vc30iXSwKKyAgICAgIFttdWx0aWFyY2hfbGlic3ViZGlyPSJsaWIvJHtob3N0X2NwdX0tJHtob3N0X29zfSJdCisgICAgKQogCiAgICAgZG5sIGZpcnN0IHdlIGNoZWNrIHRoZSBzeXN0ZW0gbG9jYXRpb24gZm9yIGJvb3N0IGxpYnJhcmllcwogICAgIGRubCB0aGlzIGxvY2F0aW9uIGlzdCBjaG9zZW4gaWYgYm9vc3QgbGlicmFyaWVzIGFyZSBpbnN0YWxsZWQgd2l0aCB0aGUgLS1sYXlvdXQ9c3lzdGVtIG9wdGlvbgogICAgIGRubCBvciBpZiB5b3UgaW5zdGFsbCBib29zdCB3aXRoIFJQTQotICAgIGlmIHRlc3QgIiRhY19ib29zdF9wYXRoIiAhPSAiIjsgdGhlbgotICAgICAgICBCT09TVF9DUFBGTEFHUz0iLUkkYWNfYm9vc3RfcGF0aC9pbmNsdWRlIgotICAgICAgICBmb3IgYWNfYm9vc3RfcGF0aF90bXAgaW4gJGxpYnN1YmRpcnM7IGRvCi0gICAgICAgICAgICAgICAgaWYgdGVzdCAtZCAiJGFjX2Jvb3N0X3BhdGgiLyIkYWNfYm9vc3RfcGF0aF90bXAiIDsgdGhlbgotICAgICAgICAgICAgICAgICAgICAgICAgQk9PU1RfTERGTEFHUz0iLUwkYWNfYm9vc3RfcGF0aC8kYWNfYm9vc3RfcGF0aF90bXAiCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgICAgIGZpCi0gICAgICAgIGRvbmUKLSAgICBlbGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciICE9IHllczsgdGhlbgotICAgICAgICBmb3IgYWNfYm9vc3RfcGF0aF90bXAgaW4gJGx0X3N5c3Jvb3QvdXNyICRsdF9zeXNyb290L3Vzci9sb2NhbCAkbHRfc3lzcm9vdC9vcHQgJGx0X3N5c3Jvb3Qvb3B0L2xvY2FsIDsgZG8KLSAgICAgICAgICAgIGlmIHRlc3QgLWQgIiRhY19ib29zdF9wYXRoX3RtcC9pbmNsdWRlL2Jvb3N0IiAmJiB0ZXN0IC1yICIkYWNfYm9vc3RfcGF0aF90bXAvaW5jbHVkZS9ib29zdCI7IHRoZW4KLSAgICAgICAgICAgICAgICBmb3IgbGlic3ViZGlyIGluICRsaWJzdWJkaXJzIDsgZG8KLSAgICAgICAgICAgICAgICAgICAgaWYgbHMgIiRhY19ib29zdF9wYXRoX3RtcC8kbGlic3ViZGlyL2xpYmJvb3N0XyIqID4vZGV2L251bGwgMj4mMSA7IHRoZW4gYnJlYWs7IGZpCisgICAgQVNfSUYoW3Rlc3QgIngkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aCIgIT0gIngiXSxbCisgICAgICAgIEFDX01TR19DSEVDS0lORyhbZm9yIGJvb3N0bGliID49ICQxICgkV0FOVF9CT09TVF9WRVJTSU9OKSBpbmNsdWRlcyBpbiAiJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGgvaW5jbHVkZSJdKQorICAgICAgICAgQVNfSUYoW3Rlc3QgLWQgIiRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoL2luY2x1ZGUiICYmIHRlc3QgLXIgIiRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoL2luY2x1ZGUiXSxbCisgICAgICAgICAgIEFDX01TR19SRVNVTFQoW3llc10pCisgICAgICAgICAgIEJPT1NUX0NQUEZMQUdTPSItSSRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoL2luY2x1ZGUiCisgICAgICAgICAgIGZvciBfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoX3RtcCBpbiAkbXVsdGlhcmNoX2xpYnN1YmRpciAkbGlic3ViZGlyczsgZG8KKyAgICAgICAgICAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBib29zdGxpYiA+PSAkMSAoJFdBTlRfQk9PU1RfVkVSU0lPTikgbGliIHBhdGggaW4gIiRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoLyRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoX3RtcCJdKQorICAgICAgICAgICAgICAgIEFTX0lGKFt0ZXN0IC1kICIkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aC8kX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aF90bXAiICYmIHRlc3QgLXIgIiRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoLyRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoX3RtcCIgXSxbCisgICAgICAgICAgICAgICAgICAgICAgICBBQ19NU0dfUkVTVUxUKFt5ZXNdKQorICAgICAgICAgICAgICAgICAgICAgICAgQk9PU1RfTERGTEFHUz0iLUwkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aC8kX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aF90bXAiOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgXSwKKyAgICAgIFtBQ19NU0dfUkVTVUxUKFtub10pXSkKKyAgICAgICAgICAgZG9uZV0sWworICAgICAgQUNfTVNHX1JFU1VMVChbbm9dKV0pCisgICAgXSxbCisgICAgICAgIGlmIHRlc3QgWCIkY3Jvc3NfY29tcGlsaW5nIiA9IFh5ZXM7IHRoZW4KKyAgICAgICAgICAgIHNlYXJjaF9saWJzdWJkaXJzPSRtdWx0aWFyY2hfbGlic3ViZGlyCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNlYXJjaF9saWJzdWJkaXJzPSIkbXVsdGlhcmNoX2xpYnN1YmRpciAkbGlic3ViZGlycyIKKyAgICAgICAgZmkKKyAgICAgICAgZm9yIF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGhfdG1wIGluIC91c3IgL3Vzci9sb2NhbCAvb3B0IC9vcHQvbG9jYWwgOyBkbworICAgICAgICAgICAgaWYgdGVzdCAtZCAiJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGhfdG1wL2luY2x1ZGUvYm9vc3QiICYmIHRlc3QgLXIgIiRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoX3RtcC9pbmNsdWRlL2Jvb3N0IiA7IHRoZW4KKyAgICAgICAgICAgICAgICBmb3IgbGlic3ViZGlyIGluICRzZWFyY2hfbGlic3ViZGlycyA7IGRvCisgICAgICAgICAgICAgICAgICAgIGlmIGxzICIkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aF90bXAvJGxpYnN1YmRpci9saWJib29zdF8iKiA+L2Rldi9udWxsIDI+JjEgOyB0aGVuIGJyZWFrOyBmaQogICAgICAgICAgICAgICAgIGRvbmUKLSAgICAgICAgICAgICAgICBCT09TVF9MREZMQUdTPSItTCRhY19ib29zdF9wYXRoX3RtcC8kbGlic3ViZGlyIgotICAgICAgICAgICAgICAgIEJPT1NUX0NQUEZMQUdTPSItSSRhY19ib29zdF9wYXRoX3RtcC9pbmNsdWRlIgorICAgICAgICAgICAgICAgIEJPT1NUX0xERkxBR1M9Ii1MJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGhfdG1wLyRsaWJzdWJkaXIiCisgICAgICAgICAgICAgICAgQk9PU1RfQ1BQRkxBR1M9Ii1JJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGhfdG1wL2luY2x1ZGUiCiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBmaQogICAgICAgICBkb25lCi0gICAgZmkKKyAgICBdKQogCiAgICAgZG5sIG92ZXJ3cml0ZSBsZCBmbGFncyBpZiB3ZSBoYXZlIHJlcXVpcmVkIHNwZWNpYWwgZGlyZWN0b3J5IHdpdGgKICAgICBkbmwgLS13aXRoLWJvb3N0LWxpYmRpciBwYXJhbWV0ZXIKLSAgICBpZiB0ZXN0ICIkYWNfYm9vc3RfbGliX3BhdGgiICE9ICIiOyB0aGVuCi0gICAgICAgQk9PU1RfTERGTEFHUz0iLUwkYWNfYm9vc3RfbGliX3BhdGgiCi0gICAgZmkKKyAgICBBU19JRihbdGVzdCAieCRfQVhfQk9PU1RfQkFTRV9ib29zdF9saWJfcGF0aCIgIT0gIngiXSwKKyAgICAgICAgICBbQk9PU1RfTERGTEFHUz0iLUwkX0FYX0JPT1NUX0JBU0VfYm9vc3RfbGliX3BhdGgiXSkKIAorICAgIEFDX01TR19DSEVDS0lORyhbZm9yIGJvb3N0bGliID49ICQxICgkV0FOVF9CT09TVF9WRVJTSU9OKV0pCiAgICAgQ1BQRkxBR1NfU0FWRUQ9IiRDUFBGTEFHUyIKICAgICBDUFBGTEFHUz0iJENQUEZMQUdTICRCT09TVF9DUFBGTEFHUyIKICAgICBleHBvcnQgQ1BQRkxBR1MKQEAgLTE0OSwxNSArMTc3LDcgQEAKIAogICAgIEFDX1JFUVVJUkUoW0FDX1BST0dfQ1hYXSkKICAgICBBQ19MQU5HX1BVU0goQysrKQotICAgICAgICBBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbCi0gICAgQCU6QGluY2x1ZGUgPGJvb3N0L3ZlcnNpb24uaHBwPgotICAgIF1dLCBbWwotICAgICNpZiBCT09TVF9WRVJTSU9OID49ICRXQU5UX0JPT1NUX1ZFUlNJT04KLSAgICAvLyBFdmVyeXRoaW5nIGlzIG9rYXkKLSAgICAjZWxzZQotICAgICMgIGVycm9yIEJvb3N0IHZlcnNpb24gaXMgdG9vIG9sZAotICAgICNlbmRpZgotICAgIF1dKV0sWworICAgICAgICBBQ19DT01QSUxFX0lGRUxTRShbX0FYX0JPT1NUX0JBU0VfUFJPR1JBTSgkV0FOVF9CT09TVF9WRVJTSU9OKV0sWwogICAgICAgICBBQ19NU0dfUkVTVUxUKHllcykKICAgICBzdWNjZWVkZWQ9eWVzCiAgICAgZm91bmRfc3lzdGVtPXllcwpAQCAtMTY5LDMwICsxODksNTAgQEAKIAogICAgIGRubCBpZiB3ZSBmb3VuZCBubyBib29zdCB3aXRoIHN5c3RlbSBsYXlvdXQgd2Ugc2VhcmNoIGZvciBib29zdCBsaWJyYXJpZXMKICAgICBkbmwgYnVpbHQgYW5kIGluc3RhbGxlZCB3aXRob3V0IHRoZSAtLWxheW91dD1zeXN0ZW0gb3B0aW9uIG9yIGZvciBhIHN0YWdlZChub3QgaW5zdGFsbGVkKSB2ZXJzaW9uCi0gICAgaWYgdGVzdCAieCRzdWNjZWVkZWQiICE9ICJ4eWVzIjsgdGhlbgorICAgIGlmIHRlc3QgIngkc3VjY2VlZGVkIiAhPSAieHllcyIgOyB0aGVuCisgICAgICAgIENQUEZMQUdTPSIkQ1BQRkxBR1NfU0FWRUQiCisgICAgICAgIExERkxBR1M9IiRMREZMQUdTX1NBVkVEIgorICAgICAgICBCT09TVF9DUFBGTEFHUz0KKyAgICAgICAgaWYgdGVzdCAteiAiJF9BWF9CT09TVF9CQVNFX2Jvb3N0X2xpYl9wYXRoIiA7IHRoZW4KKyAgICAgICAgICAgIEJPT1NUX0xERkxBR1M9CisgICAgICAgIGZpCiAgICAgICAgIF92ZXJzaW9uPTAKLSAgICAgICAgaWYgdGVzdCAiJGFjX2Jvb3N0X3BhdGgiICE9ICIiOyB0aGVuCi0gICAgICAgICAgICBpZiB0ZXN0IC1kICIkYWNfYm9vc3RfcGF0aCIgJiYgdGVzdCAtciAiJGFjX2Jvb3N0X3BhdGgiOyB0aGVuCi0gICAgICAgICAgICAgICAgZm9yIGkgaW4gYGxzIC1kICRhY19ib29zdF9wYXRoL2luY2x1ZGUvYm9vc3QtKiAyPi9kZXYvbnVsbGA7IGRvCi0gICAgICAgICAgICAgICAgICAgIF92ZXJzaW9uX3RtcD1gZWNobyAkaSB8IHNlZCAicyMkYWNfYm9vc3RfcGF0aCMjIiB8IHNlZCAncy9cL2luY2x1ZGVcL2Jvb3N0LS8vJyB8IHNlZCAncy9fLy4vJ2AKKyAgICAgICAgaWYgdGVzdCAtbiAiJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGgiIDsgdGhlbgorICAgICAgICAgICAgaWYgdGVzdCAtZCAiJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGgiICYmIHRlc3QgLXIgIiRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoIjsgdGhlbgorICAgICAgICAgICAgICAgIGZvciBpIGluIGBscyAtZCAkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aC9pbmNsdWRlL2Jvb3N0LSogMj4vZGV2L251bGxgOyBkbworICAgICAgICAgICAgICAgICAgICBfdmVyc2lvbl90bXA9YGVjaG8gJGkgfCBzZWQgInMjJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGgjIyIgfCBzZWQgJ3MvXC9pbmNsdWRlXC9ib29zdC0vLycgfCBzZWQgJ3MvXy8uLydgCiAgICAgICAgICAgICAgICAgICAgIFZfQ0hFQ0s9YGV4cHIgJF92ZXJzaW9uX3RtcCBcPiAkX3ZlcnNpb25gCi0gICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgIiRWX0NIRUNLIiA9ICIxIiA7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAieCRWX0NIRUNLIiA9ICJ4MSIgOyB0aGVuCiAgICAgICAgICAgICAgICAgICAgICAgICBfdmVyc2lvbj0kX3ZlcnNpb25fdG1wCiAgICAgICAgICAgICAgICAgICAgIGZpCiAgICAgICAgICAgICAgICAgICAgIFZFUlNJT05fVU5ERVJTQ09SRT1gZWNobyAkX3ZlcnNpb24gfCBzZWQgJ3MvXC4vXy8nYAotICAgICAgICAgICAgICAgICAgICBCT09TVF9DUFBGTEFHUz0iLUkkYWNfYm9vc3RfcGF0aC9pbmNsdWRlL2Jvb3N0LSRWRVJTSU9OX1VOREVSU0NPUkUiCisgICAgICAgICAgICAgICAgICAgIEJPT1NUX0NQUEZMQUdTPSItSSRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoL2luY2x1ZGUvYm9vc3QtJFZFUlNJT05fVU5ERVJTQ09SRSIKICAgICAgICAgICAgICAgICBkb25lCisgICAgICAgICAgICAgICAgZG5sIGlmIG5vdGhpbmcgZm91bmQgc2VhcmNoIGZvciBsYXlvdXQgdXNlZCBpbiBXaW5kb3dzIGRpc3RyaWJ1dGlvbnMKKyAgICAgICAgICAgICAgICBpZiB0ZXN0IC16ICIkQk9PU1RfQ1BQRkxBR1MiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgLWQgIiRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoL2Jvb3N0IiAmJiB0ZXN0IC1yICIkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aC9ib29zdCI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgIEJPT1NUX0NQUEZMQUdTPSItSSRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoIgorICAgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgZG5sIGlmIHdlIGZvdW5kIHNvbWV0aGluZyBhbmQgQk9PU1RfTERGTEFHUyB3YXMgdW5zZXQgYmVmb3JlCisgICAgICAgICAgICAgICAgZG5sIChiZWNhdXNlICIkX0FYX0JPT1NUX0JBU0VfYm9vc3RfbGliX3BhdGgiID0gIiIpLCBzZXQgaXQgaGVyZS4KKyAgICAgICAgICAgICAgICBpZiB0ZXN0IC1uICIkQk9PU1RfQ1BQRkxBR1MiICYmIHRlc3QgLXogIiRCT09TVF9MREZMQUdTIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICBmb3IgbGlic3ViZGlyIGluICRsaWJzdWJkaXJzIDsgZG8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGxzICIkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aC8kbGlic3ViZGlyL2xpYmJvb3N0XyIqID4vZGV2L251bGwgMj4mMSA7IHRoZW4gYnJlYWs7IGZpCisgICAgICAgICAgICAgICAgICAgIGRvbmUKKyAgICAgICAgICAgICAgICAgICAgQk9PU1RfTERGTEFHUz0iLUwkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aC8kbGlic3ViZGlyIgorICAgICAgICAgICAgICAgIGZpCiAgICAgICAgICAgICBmaQogICAgICAgICBlbHNlCi0gICAgICAgICAgICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiAhPSB5ZXM7IHRoZW4KLSAgICAgICAgICAgICAgICBmb3IgYWNfYm9vc3RfcGF0aCBpbiAkbHRfc3lzcm9vdC91c3IgJGx0X3N5c3Jvb3QvdXNyL2xvY2FsICRsdF9zeXNyb290L29wdCAkbHRfc3lzcm9vdC9vcHQvbG9jYWwgOyBkbwotICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0IC1kICIkYWNfYm9vc3RfcGF0aCIgJiYgdGVzdCAtciAiJGFjX2Jvb3N0X3BhdGgiOyB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgaSBpbiBgbHMgLWQgJGFjX2Jvb3N0X3BhdGgvaW5jbHVkZS9ib29zdC0qIDI+L2Rldi9udWxsYDsgZG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdmVyc2lvbl90bXA9YGVjaG8gJGkgfCBzZWQgInMjJGFjX2Jvb3N0X3BhdGgjIyIgfCBzZWQgJ3MvXC9pbmNsdWRlXC9ib29zdC0vLycgfCBzZWQgJ3MvXy8uLydgCisgICAgICAgICAgICBpZiB0ZXN0ICJ4JGNyb3NzX2NvbXBpbGluZyIgIT0gInh5ZXMiIDsgdGhlbgorICAgICAgICAgICAgICAgIGZvciBfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoIGluIC91c3IgL3Vzci9sb2NhbCAvb3B0IC9vcHQvbG9jYWwgOyBkbworICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0IC1kICIkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aCIgJiYgdGVzdCAtciAiJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGgiIDsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGkgaW4gYGxzIC1kICRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoL2luY2x1ZGUvYm9vc3QtKiAyPi9kZXYvbnVsbGA7IGRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZlcnNpb25fdG1wPWBlY2hvICRpIHwgc2VkICJzIyRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoIyMiIHwgc2VkICdzL1wvaW5jbHVkZVwvYm9vc3QtLy8nIHwgc2VkICdzL18vLi8nYAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZfQ0hFQ0s9YGV4cHIgJF92ZXJzaW9uX3RtcCBcPiAkX3ZlcnNpb25gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAiJFZfQ0hFQ0siID0gIjEiIDsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgIngkVl9DSEVDSyIgPSAieDEiIDsgdGhlbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdmVyc2lvbj0kX3ZlcnNpb25fdG1wCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RfcGF0aD0kYWNfYm9vc3RfcGF0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZXN0X3BhdGg9JF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaQogICAgICAgICAgICAgICAgICAgICAgICAgZG9uZQogICAgICAgICAgICAgICAgICAgICBmaQpAQCAtMjAwLDcgKzI0MCw3IEBACiAKICAgICAgICAgICAgICAgICBWRVJTSU9OX1VOREVSU0NPUkU9YGVjaG8gJF92ZXJzaW9uIHwgc2VkICdzL1wuL18vJ2AKICAgICAgICAgICAgICAgICBCT09TVF9DUFBGTEFHUz0iLUkkYmVzdF9wYXRoL2luY2x1ZGUvYm9vc3QtJFZFUlNJT05fVU5ERVJTQ09SRSIKLSAgICAgICAgICAgICAgICBpZiB0ZXN0ICIkYWNfYm9vc3RfbGliX3BhdGgiID0gIiI7IHRoZW4KKyAgICAgICAgICAgICAgICBpZiB0ZXN0IC16ICIkX0FYX0JPT1NUX0JBU0VfYm9vc3RfbGliX3BhdGgiIDsgdGhlbgogICAgICAgICAgICAgICAgICAgICBmb3IgbGlic3ViZGlyIGluICRsaWJzdWJkaXJzIDsgZG8KICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGxzICIkYmVzdF9wYXRoLyRsaWJzdWJkaXIvbGliYm9vc3RfIiogPi9kZXYvbnVsbCAyPiYxIDsgdGhlbiBicmVhazsgZmkKICAgICAgICAgICAgICAgICAgICAgZG9uZQpAQCAtMjA4LDcgKzI0OCw3IEBACiAgICAgICAgICAgICAgICAgZmkKICAgICAgICAgICAgIGZpCiAKLSAgICAgICAgICAgIGlmIHRlc3QgIngkQk9PU1RfUk9PVCIgIT0gIngiOyB0aGVuCisgICAgICAgICAgICBpZiB0ZXN0IC1uICIkQk9PU1RfUk9PVCIgOyB0aGVuCiAgICAgICAgICAgICAgICAgZm9yIGxpYnN1YmRpciBpbiAkbGlic3ViZGlycyA7IGRvCiAgICAgICAgICAgICAgICAgICAgIGlmIGxzICIkQk9PU1RfUk9PVC9zdGFnZS8kbGlic3ViZGlyL2xpYmJvb3N0XyIqID4vZGV2L251bGwgMj4mMSA7IHRoZW4gYnJlYWs7IGZpCiAgICAgICAgICAgICAgICAgZG9uZQpAQCAtMjE3LDcgKzI1Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgIHN0YWdlX3ZlcnNpb249YGVjaG8gJHZlcnNpb25fZGlyIHwgc2VkICdzL2Jvb3N0Xy8vJyB8IHNlZCAncy9fLy4vZydgCiAgICAgICAgICAgICAgICAgICAgICAgICBzdGFnZV92ZXJzaW9uX3Nob3J0ZW49YGV4cHIgJHN0YWdlX3ZlcnNpb24gOiAnXChbWzAtOV1dKlwuW1swLTldXSpcKSdgCiAgICAgICAgICAgICAgICAgICAgIFZfQ0hFQ0s9YGV4cHIgJHN0YWdlX3ZlcnNpb25fc2hvcnRlbiBcPlw9ICRfdmVyc2lvbmAKLSAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAiJFZfQ0hFQ0siID0gIjEiIC1hICIkYWNfYm9vc3RfbGliX3BhdGgiID0gIiIgOyB0aGVuCisgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgIngkVl9DSEVDSyIgPSAieDEiICYmIHRlc3QgLXogIiRfQVhfQk9PU1RfQkFTRV9ib29zdF9saWJfcGF0aCIgOyB0aGVuCiAgICAgICAgICAgICAgICAgICAgICAgICBBQ19NU0dfTk9USUNFKFdlIHdpbGwgdXNlIGEgc3RhZ2VkIGJvb3N0IGxpYnJhcnkgZnJvbSAkQk9PU1RfUk9PVCkKICAgICAgICAgICAgICAgICAgICAgICAgIEJPT1NUX0NQUEZMQUdTPSItSSRCT09TVF9ST09UIgogICAgICAgICAgICAgICAgICAgICAgICAgQk9PU1RfTERGTEFHUz0iLUwkQk9PU1RfUk9PVC9zdGFnZS8kbGlic3ViZGlyIgpAQCAtMjMyLDE1ICsyNzIsNyBAQAogICAgICAgICBleHBvcnQgTERGTEFHUwogCiAgICAgICAgIEFDX0xBTkdfUFVTSChDKyspCi0gICAgICAgICAgICBBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbCi0gICAgICAgIEAlOkBpbmNsdWRlIDxib29zdC92ZXJzaW9uLmhwcD4KLSAgICAgICAgXV0sIFtbCi0gICAgICAgICNpZiBCT09TVF9WRVJTSU9OID49ICRXQU5UX0JPT1NUX1ZFUlNJT04KLSAgICAgICAgLy8gRXZlcnl0aGluZyBpcyBva2F5Ci0gICAgICAgICNlbHNlCi0gICAgICAgICMgIGVycm9yIEJvb3N0IHZlcnNpb24gaXMgdG9vIG9sZAotICAgICAgICAjZW5kaWYKLSAgICAgICAgXV0pXSxbCisgICAgICAgICAgICBBQ19DT01QSUxFX0lGRUxTRShbX0FYX0JPT1NUX0JBU0VfUFJPR1JBTSgkV0FOVF9CT09TVF9WRVJTSU9OKV0sWwogICAgICAgICAgICAgQUNfTVNHX1JFU1VMVCh5ZXMpCiAgICAgICAgIHN1Y2NlZWRlZD15ZXMKICAgICAgICAgZm91bmRfc3lzdGVtPXllcwpAQCAtMjQ5LDE3ICsyODEsMTUgQEAKICAgICAgICAgQUNfTEFOR19QT1AoW0MrK10pCiAgICAgZmkKIAotICAgIGlmIHRlc3QgIiRzdWNjZWVkZWQiICE9ICJ5ZXMiIDsgdGhlbgotICAgICAgICBpZiB0ZXN0ICIkX3ZlcnNpb24iID0gIjAiIDsgdGhlbgotICAgICAgICAgICAgQUNfTVNHX05PVElDRShbW1dlIGNvdWxkIG5vdCBkZXRlY3QgdGhlIGJvb3N0IGxpYnJhcmllcyAodmVyc2lvbiAkYm9vc3RfbGliX3ZlcnNpb25fcmVxX3Nob3J0ZW4gb3IgaGlnaGVyKS4gSWYgeW91IGhhdmUgYSBzdGFnZWQgYm9vc3QgbGlicmFyeSAoc3RpbGwgbm90IGluc3RhbGxlZCkgcGxlYXNlIHNwZWNpZnkgXCRCT09TVF9ST09UIGluIHlvdXIgZW52aXJvbm1lbnQgYW5kIGRvIG5vdCBnaXZlIGEgUEFUSCB0byAtLXdpdGgtYm9vc3Qgb3B0aW9uLiAgSWYgeW91IGFyZSBzdXJlIHlvdSBoYXZlIGJvb3N0IGluc3RhbGxlZCwgdGhlbiBjaGVjayB5b3VyIHZlcnNpb24gbnVtYmVyIGxvb2tpbmcgaW4gPGJvb3N0L3ZlcnNpb24uaHBwPi4gU2VlIGh0dHA6Ly9yYW5kc3ByaW5nZXIuZGUvYm9vc3QgZm9yIG1vcmUgZG9jdW1lbnRhdGlvbi5dXSkKKyAgICBpZiB0ZXN0ICJ4JHN1Y2NlZWRlZCIgIT0gInh5ZXMiIDsgdGhlbgorICAgICAgICBpZiB0ZXN0ICJ4JF92ZXJzaW9uIiA9ICJ4MCIgOyB0aGVuCisgICAgICAgICAgICBBQ19NU0dfTk9USUNFKFtbV2UgY291bGQgbm90IGRldGVjdCB0aGUgYm9vc3QgbGlicmFyaWVzICh2ZXJzaW9uICQxIG9yIGhpZ2hlcikuIElmIHlvdSBoYXZlIGEgc3RhZ2VkIGJvb3N0IGxpYnJhcnkgKHN0aWxsIG5vdCBpbnN0YWxsZWQpIHBsZWFzZSBzcGVjaWZ5IFwkQk9PU1RfUk9PVCBpbiB5b3VyIGVudmlyb25tZW50IGFuZCBkbyBub3QgZ2l2ZSBhIFBBVEggdG8gLS13aXRoLWJvb3N0IG9wdGlvbi4gIElmIHlvdSBhcmUgc3VyZSB5b3UgaGF2ZSBib29zdCBpbnN0YWxsZWQsIHRoZW4gY2hlY2sgeW91ciB2ZXJzaW9uIG51bWJlciBsb29raW5nIGluIDxib29zdC92ZXJzaW9uLmhwcD4uIFNlZSBodHRwOi8vcmFuZHNwcmluZ2VyLmRlL2Jvb3N0IGZvciBtb3JlIGRvY3VtZW50YXRpb24uXV0pCiAgICAgICAgIGVsc2UKICAgICAgICAgICAgIEFDX01TR19OT1RJQ0UoW1lvdXIgYm9vc3QgbGlicmFyaWVzIHNlZW1zIHRvIG9sZCAodmVyc2lvbiAkX3ZlcnNpb24pLl0pCiAgICAgICAgIGZpCiAgICAgICAgICMgZXhlY3V0ZSBBQ1RJT04tSUYtTk9ULUZPVU5EIChpZiBwcmVzZW50KToKICAgICAgICAgaWZlbHNlKFskM10sICwgOiwgWyQzXSkKICAgICBlbHNlCi0gICAgICAgIEFDX1NVQlNUKEJPT1NUX0NQUEZMQUdTKQotICAgICAgICBBQ19TVUJTVChCT09TVF9MREZMQUdTKQogICAgICAgICBBQ19ERUZJTkUoSEFWRV9CT09TVCwsW2RlZmluZSBpZiB0aGUgQm9vc3QgbGlicmFyeSBpcyBhdmFpbGFibGVdKQogICAgICAgICAjIGV4ZWN1dGUgQUNUSU9OLUlGLUZPVU5EIChpZiBwcmVzZW50KToKICAgICAgICAgaWZlbHNlKFskMl0sICwgOiwgWyQyXSkKQEAgLTI2Nyw2ICsyOTcsNSBAQAogCiAgICAgQ1BQRkxBR1M9IiRDUFBGTEFHU19TQVZFRCIKICAgICBMREZMQUdTPSIkTERGTEFHU19TQVZFRCIKLWZpCiAKIF0pCmRpZmYgLS1naXQgYS9hY2xvY2FsL2F4X2NoZWNrX29wZW5zc2wubTQgYi9hY2xvY2FsL2F4X2NoZWNrX29wZW5zc2wubTQKaW5kZXggYTg3YzVhNi4uMjhlNDhjYiAxMDA2NDQKLS0tIGEvYWNsb2NhbC9heF9jaGVja19vcGVuc3NsLm00CisrKyBiL2FjbG9jYWwvYXhfY2hlY2tfb3BlbnNzbC5tNApAQCAtMSw1ICsxLDUgQEAKICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICAgICBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvYXV0b2NvbmYtYXJjaGl2ZS9heF9jaGVja19vcGVuc3NsLmh0bWwKKyMgICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvYXV0b2NvbmYtYXJjaGl2ZS9heF9jaGVja19vcGVuc3NsLmh0bWwKICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAjCiAjIFNZTk9QU0lTCkBAIC0zMiw3ICszMiw3IEBACiAjICAgYW5kIHRoaXMgbm90aWNlIGFyZSBwcmVzZXJ2ZWQuIFRoaXMgZmlsZSBpcyBvZmZlcmVkIGFzLWlzLCB3aXRob3V0IGFueQogIyAgIHdhcnJhbnR5LgogCi0jc2VyaWFsIDgKKyNzZXJpYWwgMTAKIAogQVVfQUxJQVMoW0NIRUNLX1NTTF0sIFtBWF9DSEVDS19PUEVOU1NMXSkKIEFDX0RFRlVOKFtBWF9DSEVDS19PUEVOU1NMXSwgWwpAQCAtNTEsNyArNTEsNyBAQAogICAgICAgICBdLCBbCiAgICAgICAgICAgICAjIGlmIHBrZy1jb25maWcgaXMgaW5zdGFsbGVkIGFuZCBvcGVuc3NsIGhhcyBpbnN0YWxsZWQgYSAucGMgZmlsZSwKICAgICAgICAgICAgICMgdGhlbiB1c2UgdGhhdCBpbmZvcm1hdGlvbiBhbmQgZG9uJ3Qgc2VhcmNoIHNzbGRpcnMKLSAgICAgICAgICAgIEFDX1BBVEhfUFJPRyhbUEtHX0NPTkZJR10sIFtwa2ctY29uZmlnXSkKKyAgICAgICAgICAgIEFDX0NIRUNLX1RPT0woW1BLR19DT05GSUddLCBbcGtnLWNvbmZpZ10pCiAgICAgICAgICAgICBpZiB0ZXN0IHgiJFBLR19DT05GSUciICE9IHgiIjsgdGhlbgogICAgICAgICAgICAgICAgIE9QRU5TU0xfTERGTEFHUz1gJFBLR19DT05GSUcgb3BlbnNzbCAtLWxpYnMtb25seS1MIDI+L2Rldi9udWxsYAogICAgICAgICAgICAgICAgIGlmIHRlc3QgJD8gPSAwOyB0aGVuCmRpZmYgLS1naXQgYS9hY2xvY2FsL2F4X2NvbXBhcmVfdmVyc2lvbi5tNCBiL2FjbG9jYWwvYXhfY29tcGFyZV92ZXJzaW9uLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljOGUyMDgKLS0tIC9kZXYvbnVsbAorKysgYi9hY2xvY2FsL2F4X2NvbXBhcmVfdmVyc2lvbi5tNApAQCAtMCwwICsxLDE3NyBAQAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9hdXRvY29uZi1hcmNoaXZlL2F4X2NvbXBhcmVfdmVyc2lvbi5odG1sCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBTWU5PUFNJUworIworIyAgIEFYX0NPTVBBUkVfVkVSU0lPTihWRVJTSU9OX0EsIE9QLCBWRVJTSU9OX0IsIFtBQ1RJT04tSUYtVFJVRV0sIFtBQ1RJT04tSUYtRkFMU0VdKQorIworIyBERVNDUklQVElPTgorIworIyAgIFRoaXMgbWFjcm8gY29tcGFyZXMgdHdvIHZlcnNpb24gc3RyaW5ncy4gRHVlIHRvIHRoZSB2YXJpb3VzIG51bWJlciBvZgorIyAgIG1pbm9yLXZlcnNpb24gbnVtYmVycyB0aGF0IGNhbiBleGlzdCwgYW5kIHRoZSBmYWN0IHRoYXQgc3RyaW5nCisjICAgY29tcGFyaXNvbnMgYXJlIG5vdCBjb21wYXRpYmxlIHdpdGggbnVtZXJpYyBjb21wYXJpc29ucywgdGhpcyBpcyBub3QKKyMgICBuZWNlc3NhcmlseSB0cml2aWFsIHRvIGRvIGluIGEgYXV0b2NvbmYgc2NyaXB0LiBUaGlzIG1hY3JvIG1ha2VzIGRvaW5nCisjICAgdGhlc2UgY29tcGFyaXNvbnMgZWFzeS4KKyMKKyMgICBUaGUgc2l4IGJhc2ljIGNvbXBhcmlzb25zIGFyZSBhdmFpbGFibGUsIGFzIHdlbGwgYXMgY2hlY2tpbmcgZXF1YWxpdHkKKyMgICBsaW1pdGVkIHRvIGEgY2VydGFpbiBudW1iZXIgb2YgbWlub3ItdmVyc2lvbiBsZXZlbHMuCisjCisjICAgVGhlIG9wZXJhdG9yIE9QIGRldGVybWluZXMgd2hhdCB0eXBlIG9mIGNvbXBhcmlzb24gdG8gZG8sIGFuZCBjYW4gYmUgb25lCisjICAgb2Y6CisjCisjICAgIGVxICAtIGVxdWFsICh0ZXN0IEEgPT0gQikKKyMgICAgbmUgIC0gbm90IGVxdWFsICh0ZXN0IEEgIT0gQikKKyMgICAgbGUgIC0gbGVzcyB0aGFuIG9yIGVxdWFsICh0ZXN0IEEgPD0gQikKKyMgICAgZ2UgIC0gZ3JlYXRlciB0aGFuIG9yIGVxdWFsICh0ZXN0IEEgPj0gQikKKyMgICAgbHQgIC0gbGVzcyB0aGFuICh0ZXN0IEEgPCBCKQorIyAgICBndCAgLSBncmVhdGVyIHRoYW4gKHRlc3QgQSA+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+IGlubGluZSB2b2lkIGY8PihpbnQpCisgICAge30KKworICAgIHRlbXBsYXRlPD4gaW50IGc8PihpbnQpCisgICAgeworICAgICAgcmV0dXJuIDU7CisgICAgfQorCisgIH0KKworfSAgLy8gbmFtZXNwYWNlIGN4eDE3CisKKyNlbmRpZiAgLy8gX19jcGx1c3BsdXMgPCAyMDE3MDNMCisKK11dKQpkaWZmIC0tZ2l0IGEvYWNsb2NhbC9heF9jeHhfY29tcGlsZV9zdGRjeHhfMTEubTQgYi9hY2xvY2FsL2F4X2N4eF9jb21waWxlX3N0ZGN4eF8xMS5tNAppbmRleCBhNGM5MTg5Li4xNzMzZmQ4IDEwMDY0NAotLS0gYS9hY2xvY2FsL2F4X2N4eF9jb21waWxlX3N0ZGN4eF8xMS5tNAorKysgYi9hY2xvY2FsL2F4X2N4eF9jb21waWxlX3N0ZGN4eF8xMS5tNApAQCAtMSwxMzQgKzEsMzkgQEAKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2F1dG9jb25mLWFyY2hpdmUvYXhfY3h4X2NvbXBpbGVfc3RkY3h4XzExLmh0bWwKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9hdXRvY29uZi1hcmNoaXZlL2F4X2N4eF9jb21waWxlX3N0ZGN4eF8xMS5odG1sCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAjCiAjIFNZTk9QU0lTCiAjCi0jICAgQVhfQ1hYX0NPTVBJTEVfU1REQ1hYXzExKFtleHR8bm9leHRdLFttYW5kYXRvcnl8b3B0aW9uYWxdKQorIyAgIEFYX0NYWF9DT01QSUxFX1NURENYWF8xMShbZXh0fG5vZXh0XSwgW21hbmRhdG9yeXxvcHRpb25hbF0pCiAjCiAjIERFU0NSSVBUSU9OCiAjCiAjICAgQ2hlY2sgZm9yIGJhc2VsaW5lIGxhbmd1YWdlIGNvdmVyYWdlIGluIHRoZSBjb21waWxlciBmb3IgdGhlIEMrKzExCi0jICAgc3RhbmRhcmQ7IGlmIG5lY2Vzc2FyeSwgYWRkIHN3aXRjaGVzIHRvIENYWEZMQUdTIHRvIGVuYWJsZSBzdXBwb3J0LgorIyAgIHN0YW5kYXJkOyBpZiBuZWNlc3NhcnksIGFkZCBzd2l0Y2hlcyB0byBDWFggYW5kIENYWENQUCB0byBlbmFibGUKKyMgICBzdXBwb3J0LgogIwotIyAgIFRoZSBmaXJzdCBhcmd1bWVudCwgaWYgc3BlY2lmaWVkLCBpbmRpY2F0ZXMgd2hldGhlciB5b3UgaW5zaXN0IG9uIGFuCi0jICAgZXh0ZW5kZWQgbW9kZSAoZS5nLiAtc3RkPWdudSsrMTEpIG9yIGEgc3RyaWN0IGNvbmZvcm1hbmNlIG1vZGUgKGUuZy4KLSMgICAtc3RkPWMrKzExKS4gIElmIG5laXRoZXIgaXMgc3BlY2lmaWVkLCB5b3UgZ2V0IHdoYXRldmVyIHdvcmtzLCB3aXRoCi0jICAgcHJlZmVyZW5jZSBmb3IgYW4gZXh0ZW5kZWQgbW9kZS4KLSMKLSMgICBUaGUgc2Vjb25kIGFyZ3VtZW50LCBpZiBzcGVjaWZpZWQgJ21hbmRhdG9yeScgb3IgaWYgbGVmdCB1bnNwZWNpZmllZCwKLSMgICBpbmRpY2F0ZXMgdGhhdCBiYXNlbGluZSBDKysxMSBzdXBwb3J0IGlzIHJlcXVpcmVkIGFuZCB0aGF0IHRoZSBtYWNybwotIyAgIHNob3VsZCBlcnJvciBvdXQgaWYgbm8gbW9kZSB3aXRoIHRoYXQgc3VwcG9ydCBpcyBmb3VuZC4gIElmIHNwZWNpZmllZAotIyAgICdvcHRpb25hbCcsIHRoZW4gY29uZmlndXJhdGlvbiBwcm9jZWVkcyByZWdhcmRsZXNzLCBhZnRlciBkZWZpbmluZwotIyAgIEhBVkVfQ1hYMTEgaWYgYW5kIG9ubHkgaWYgYSBzdXBwb3J0aW5nIG1vZGUgaXMgZm91bmQuCisjICAgVGhpcyBtYWNybyBpcyBhIGNvbnZlbmllbmNlIGFsaWFzIGZvciBjYWxsaW5nIHRoZSBBWF9DWFhfQ09NUElMRV9TVERDWFgKKyMgICBtYWNybyB3aXRoIHRoZSB2ZXJzaW9uIHNldCB0byBDKysxMS4gIFRoZSB0d28gb3B0aW9uYWwgYXJndW1lbnRzIGFyZQorIyAgIGZvcndhcmRlZCBsaXRlcmFsbHkgYXMgdGhlIHNlY29uZCBhbmQgdGhpcmQgYXJndW1lbnQgcmVzcGVjdGl2ZWx5LgorIyAgIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZSBBWF9DWFhfQ09NUElMRV9TVERDWFggbWFjcm8gZm9yCisjICAgbW9yZSBpbmZvcm1hdGlvbi4gIElmIHlvdSB3YW50IHRvIHVzZSB0aGlzIG1hY3JvLCB5b3UgYWxzbyBuZWVkIHRvCisjICAgZG93bmxvYWQgdGhlIGF4X2N4eF9jb21waWxlX3N0ZGN4eC5tNCBmaWxlLgogIwogIyBMSUNFTlNFCiAjCiAjICAgQ29weXJpZ2h0IChjKSAyMDA4IEJlbmphbWluIEtvc25payA8YmtvekByZWRoYXQuY29tPgogIyAgIENvcHlyaWdodCAoYykgMjAxMiBaYWNrIFdlaW5iZXJnIDx6YWNrd0BwYW5peC5jb20+CiAjICAgQ29weXJpZ2h0IChjKSAyMDEzIFJveSBTdG9nbmVyIDxyb3lzdGduckBpY2VzLnV0ZXhhcy5lZHU+CisjICAgQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE1IEdvb2dsZSBJbmMuOyBjb250cmlidXRlZCBieSBBbGV4ZXkgU29rb2xvdiA8c29rb2xvdkBnb29nbGUuY29tPgorIyAgIENvcHlyaWdodCAoYykgMjAxNSBQYXVsIE5vcm1hbiA8cGVub3JtYW5AbWFjLmNvbT4KKyMgICBDb3B5cmlnaHQgKGMpIDIwMTUgTW9yaXR6IEtsYW1tbGVyIDxtb3JpdHpAa2xhbW1sZXIuZXU+CiAjCiAjICAgQ29weWluZyBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoaXMgZmlsZSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlCiAjICAgcGVybWl0dGVkIGluIGFueSBtZWRpdW0gd2l0aG91dCByb3lhbHR5IHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlCiAjICAgYW5kIHRoaXMgbm90aWNlIGFyZSBwcmVzZXJ2ZWQuIFRoaXMgZmlsZSBpcyBvZmZlcmVkIGFzLWlzLCB3aXRob3V0IGFueQogIyAgIHdhcnJhbnR5LgogCi0jc2VyaWFsIDMKKyNzZXJpYWwgMTgKIAotbTRfZGVmaW5lKFtfQVhfQ1hYX0NPTVBJTEVfU1REQ1hYXzExX3Rlc3Rib2R5XSwgWwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgICBzdHJ1Y3QgY2hlY2sKLSAgICB7Ci0gICAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihpbnQpIDw9IHNpemVvZihUKSwgIm5vdCBiaWcgZW5vdWdoIik7Ci0gICAgfTsKLQotICAgIHR5cGVkZWYgY2hlY2s8Y2hlY2s8Ym9vbD4+IHJpZ2h0X2FuZ2xlX2JyYWNrZXRzOwotCi0gICAgaW50IGE7Ci0gICAgZGVjbHR5cGUoYSkgYjsKLQotICAgIHR5cGVkZWYgY2hlY2s8aW50PiBjaGVja190eXBlOwotICAgIGNoZWNrX3R5cGUgYzsKLSAgICBjaGVja190eXBlJiYgY3IgPSBzdGF0aWNfY2FzdDxjaGVja190eXBlJiY+KGMpOwotCi0gICAgYXV0byBkID0gYTsKLV0pCi0KLUFDX0RFRlVOKFtBWF9DWFhfQ09NUElMRV9TVERDWFhfMTFdLCBbZG5sCi0gIG00X2lmKFskMV0sIFtdLCBbXSwKLSAgICAgICAgWyQxXSwgW2V4dF0sIFtdLAotICAgICAgICBbJDFdLCBbbm9leHRdLCBbXSwKLSAgICAgICAgW200X2ZhdGFsKFtpbnZhbGlkIGFyZ3VtZW50IGAkMScgdG8gQVhfQ1hYX0NPTVBJTEVfU1REQ1hYXzExXSldKWRubAotICBtNF9pZihbJDJdLCBbXSwgW2F4X2N4eF9jb21waWxlX2N4eDExX3JlcXVpcmVkPXRydWVdLAotICAgICAgICBbJDJdLCBbbWFuZGF0b3J5XSwgW2F4X2N4eF9jb21waWxlX2N4eDExX3JlcXVpcmVkPXRydWVdLAotICAgICAgICBbJDJdLCBbb3B0aW9uYWxdLCBbYXhfY3h4X2NvbXBpbGVfY3h4MTFfcmVxdWlyZWQ9ZmFsc2VdLAotICAgICAgICBbbTRfZmF0YWwoW2ludmFsaWQgc2Vjb25kIGFyZ3VtZW50IGAkMicgdG8gQVhfQ1hYX0NPTVBJTEVfU1REQ1hYXzExXSldKWRubAotICBBQ19MQU5HX1BVU0goW0MrK10pZG5sCi0gIGFjX3N1Y2Nlc3M9bm8KLSAgQUNfQ0FDSEVfQ0hFQ0sod2hldGhlciAkQ1hYIHN1cHBvcnRzIEMrKzExIGZlYXR1cmVzIGJ5IGRlZmF1bHQsCi0gIGF4X2N2X2N4eF9jb21waWxlX2N4eDExLAotICBbQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfU09VUkNFKFtfQVhfQ1hYX0NPTVBJTEVfU1REQ1hYXzExX3Rlc3Rib2R5XSldLAotICAgIFtheF9jdl9jeHhfY29tcGlsZV9jeHgxMT15ZXNdLAotICAgIFtheF9jdl9jeHhfY29tcGlsZV9jeHgxMT1ub10pXSkKLSAgaWYgdGVzdCB4JGF4X2N2X2N4eF9jb21waWxlX2N4eDExID0geHllczsgdGhlbgotICAgIGFjX3N1Y2Nlc3M9eWVzCi0gIGZpCi0KLSAgbTRfaWYoWyQxXSwgW25vZXh0XSwgW10sIFtkbmwKLSAgaWYgdGVzdCB4JGFjX3N1Y2Nlc3MgPSB4bm87IHRoZW4KLSAgICBmb3Igc3dpdGNoIGluIC1zdGQ9Z251KysxMTsgZG8KLSAgICAgIGNhY2hldmFyPUFTX1RSX1NIKFtheF9jdl9jeHhfY29tcGlsZV9jeHgxMV8kc3dpdGNoXSkKLSAgICAgIEFDX0NBQ0hFX0NIRUNLKHdoZXRoZXIgJENYWCBzdXBwb3J0cyBDKysxMSBmZWF0dXJlcyB3aXRoICRzd2l0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAkY2FjaGV2YXIsCi0gICAgICAgIFthY19zYXZlX0NYWEZMQUdTPSIkQ1hYRkxBR1MiCi0gICAgICAgICBDWFhGTEFHUz0iJENYWEZMQUdTICRzd2l0Y2giCi0gICAgICAgICBBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19TT1VSQ0UoW19BWF9DWFhfQ09NUElMRV9TVERDWFhfMTFfdGVzdGJvZHldKV0sCi0gICAgICAgICAgW2V2YWwgJGNhY2hldmFyPXllc10sCi0gICAgICAgICAgW2V2YWwgJGNhY2hldmFyPW5vXSkKLSAgICAgICAgIENYWEZMQUdTPSIkYWNfc2F2ZV9DWFhGTEFHUyJdKQotICAgICAgaWYgZXZhbCB0ZXN0IHhcJCRjYWNoZXZhciA9IHh5ZXM7IHRoZW4KLSAgICAgICAgQ1hYRkxBR1M9IiRDWFhGTEFHUyAkc3dpdGNoIgotICAgICAgICBhY19zdWNjZXNzPXllcwotICAgICAgICBicmVhawotICAgICAgZmkKLSAgICBkb25lCi0gIGZpXSkKLQotICBtNF9pZihbJDFdLCBbZXh0XSwgW10sIFtkbmwKLSAgaWYgdGVzdCB4JGFjX3N1Y2Nlc3MgPSB4bm87IHRoZW4KLSAgICBmb3Igc3dpdGNoIGluIC1zdGQ9YysrMTE7IGRvCi0gICAgICBjYWNoZXZhcj1BU19UUl9TSChbYXhfY3ZfY3h4X2NvbXBpbGVfY3h4MTFfJHN3aXRjaF0pCi0gICAgICBBQ19DQUNIRV9DSEVDSyh3aGV0aGVyICRDWFggc3VwcG9ydHMgQysrMTEgZmVhdHVyZXMgd2l0aCAkc3dpdGNoLAotICAgICAgICAgICAgICAgICAgICAgJGNhY2hldmFyLAotICAgICAgICBbYWNfc2F2ZV9DWFhGTEFHUz0iJENYWEZMQUdTIgotICAgICAgICAgQ1hYRkxBR1M9IiRDWFhGTEFHUyAkc3dpdGNoIgotICAgICAgICAgQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfU09VUkNFKFtfQVhfQ1hYX0NPTVBJTEVfU1REQ1hYXzExX3Rlc3Rib2R5XSldLAotICAgICAgICAgIFtldmFsICRjYWNoZXZhcj15ZXNdLAotICAgICAgICAgIFtldmFsICRjYWNoZXZhcj1ub10pCi0gICAgICAgICBDWFhGTEFHUz0iJGFjX3NhdmVfQ1hYRkxBR1MiXSkKLSAgICAgIGlmIGV2YWwgdGVzdCB4XCQkY2FjaGV2YXIgPSB4eWVzOyB0aGVuCi0gICAgICAgIENYWEZMQUdTPSIkQ1hYRkxBR1MgJHN3aXRjaCIKLSAgICAgICAgYWNfc3VjY2Vzcz15ZXMKLSAgICAgICAgYnJlYWsKLSAgICAgIGZpCi0gICAgZG9uZQotICBmaV0pCi0gIEFDX0xBTkdfUE9QKFtDKytdKQotICBpZiB0ZXN0IHgkYXhfY3h4X2NvbXBpbGVfY3h4MTFfcmVxdWlyZWQgPSB4dHJ1ZTsgdGhlbgotICAgIGlmIHRlc3QgeCRhY19zdWNjZXNzID0geG5vOyB0aGVuCi0gICAgICBBQ19NU0dfRVJST1IoWyoqKiBBIGNvbXBpbGVyIHdpdGggc3VwcG9ydCBmb3IgQysrMTEgbGFuZ3VhZ2UgZmVhdHVyZXMgaXMgcmVxdWlyZWQuXSkKLSAgICBmaQotICBlbHNlCi0gICAgaWYgdGVzdCB4JGFjX3N1Y2Nlc3MgPSB4bm87IHRoZW4KLSAgICAgIEhBVkVfQ1hYMTE9MAotICAgICAgQUNfTVNHX05PVElDRShbTm8gY29tcGlsZXIgd2l0aCBDKysxMSBzdXBwb3J0IHdhcyBmb3VuZF0pCi0gICAgZWxzZQotICAgICAgSEFWRV9DWFgxMT0xCi0gICAgICBBQ19ERUZJTkUoSEFWRV9DWFgxMSwxLAotICAgICAgICAgICAgICAgIFtkZWZpbmUgaWYgdGhlIGNvbXBpbGVyIHN1cHBvcnRzIGJhc2ljIEMrKzExIHN5bnRheF0pCi0gICAgZmkKLQotICAgIEFDX1NVQlNUKEhBVkVfQ1hYMTEpCi0gIGZpCi1dKQotCitBWF9SRVFVSVJFX0RFRklORUQoW0FYX0NYWF9DT01QSUxFX1NURENYWF0pCitBQ19ERUZVTihbQVhfQ1hYX0NPTVBJTEVfU1REQ1hYXzExXSwgW0FYX0NYWF9DT01QSUxFX1NURENYWChbMTFdLCBbJDFdLCBbJDJdKV0pCmRpZmYgLS1naXQgYS9hY2xvY2FsL2F4X2phdmFjX2FuZF9qYXZhLm00IGIvYWNsb2NhbC9heF9qYXZhY19hbmRfamF2YS5tNAppbmRleCBmZGI0YmYwLi4wMjAzOTYwIDEwMDY0NAotLS0gYS9hY2xvY2FsL2F4X2phdmFjX2FuZF9qYXZhLm00CisrKyBiL2FjbG9jYWwvYXhfamF2YWNfYW5kX2phdmEubTQKQEAgLTcsNyArNyw3IEBACiBkbmwgamF2YSBjb21tYW5kIHRlc3RlZC4gIE90aGVyd2lzZSwgYSBoYXJkLWNvZGVkIGxpc3Qgd2lsbCBiZSB1c2VkLgogZG5sIFNpbWlsYXJseSBmb3IgIkpBVkFDIi4KIGRubAotZG5sIEFYX0pBVkFDX0FORF9KQVZBIGRvZXMgbm90IGN1cnJlbmx5IHN1cHBvcnQgdGVzdGluZyBmb3IgYSBwYXJ0aWN1bGFyCitkbmwgQVhfSkFWQUNfQU5EX0pBVkEgZG9lcyBub3QgY3VycmVudGx5IHN1cHBvcnQgdGVzdGluZyBmb3IgYSBwYXJ0aWN1bGFyCiBkbmwgSmF2YSB2ZXJzaW9uLCB0ZXN0aW5nIGZvciBvbmx5IG9uZSBvZiAiamF2YSIgYW5kICJqYXZhYyIsIG9yCiBkbmwgY29tcGlsaW5nIG9yIHJ1bm5pbmcgdXNlci1wcm92aWRlZCBKYXZhIGNvZGUuCiBkbmwKQEAgLTU3LDYgKzU3LDEwIEBACiAgICAgICAgICAgICBlY2hvICJSdW5uaW5nIFwiJEpBVkFDIGNvbmZpZ3Rlc3RfYXhfamF2YWNfYW5kX2phdmEuamF2YVwiIiA+JkFTX01FU1NBR0VfTE9HX0ZECiAgICAgICAgICAgICBpZiAkSkFWQUMgY29uZmlndGVzdF9heF9qYXZhY19hbmRfamF2YS5qYXZhID4mQVNfTUVTU0FHRV9MT0dfRkQgMj4mMSA7IHRoZW4KIAorICAgICAgICAgICAgICAjIHByZXZlbnQgJEpBVkEgVk0gaXNzdWVzIHdpdGggVVRGLTggcGF0aCBuYW1lcyAoVEhSSUZULTMyNzEpCisgICAgICAgICAgICAgIG9MQ19BTEw9IiRMQ19BTEwiCisgICAgICAgICAgICAgIExDX0FMTD0iIgorCiAgICAgICAgICAgICAgIElGUz0iLCIKICAgICAgICAgICAgICAgZm9yIEpBVkEgaW4gJEpBVkFfUFJPR1MgOyBkbwogICAgICAgICAgICAgICAgIElGUz0iJG9JRlMiCkBAIC02OSw2ICs3MywxMCBAQAogCiAgICAgICAgICAgICAgIGRvbmUKIAorICAgICAgICAgICAgICAjIHJlc3RvcmUgTENfQUxMCisgICAgICAgICAgICAgIExDX0FMTD0iJG9MQ19BTEwiCisgICAgICAgICAgICAgIG9MQ19BTEw9IiIKKwogICAgICAgICAgICAgZmkKIAogICAgICAgICAgIGRvbmUKQEAgLTExMCw3ICsxMTgsNyBAQAogQUNfREVGVU4oW0FYX0NIRUNLX0FOVF9WRVJTSU9OXSwKICAgICAgICAgIFsKICAgICAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoZm9yIGFudCB2ZXJzaW9uID4gJDIpCi0gICAgICAgICAgQU5UX1ZBTElEPWBleHByICQoJDEgLXZlcnNpb24gMj4vZGV2L251bGwgfCBzZWQgLW4gJ3MvLip2ZXJzaW9uIFwoQDw6QDAtOVwuQDo+QCpcKS4qL1wxL3AnKSBcPj0gJDJgCisgICAgICAgICAgQU5UX1ZBTElEPWBleHByICJ4JChwcmludGYgIiQyXG4kKCQxIC12ZXJzaW9uIDI+L2Rldi9udWxsIHwgc2VkIC1uICdzLy4qdmVyc2lvbiBcKEA8OkAwLTlcLkA6PkAqXCkuKi9cMS9wJykiIHwgc29ydCAtdCAnLicgLWsgMSwxIC1rIDIsMiAtayAzLDMgLWcgfCBzZWQgLW4gMXApIiA9ICJ4JDIiYAogICAgICAgICAgIGlmIHRlc3QgIngkQU5UX1ZBTElEIiA9ICJ4MSIgOyB0aGVuCiAgICAgICAgICAgICBBQ19NU0dfUkVTVUxUKHllcykKICAgICAgICAgICBlbHNlCmRpZmYgLS1naXQgYS9hY2xvY2FsL2F4X2xpYl9ldmVudC5tNCBiL2FjbG9jYWwvYXhfbGliX2V2ZW50Lm00CmluZGV4IGNmNmM0YzIuLmQ0ZGNkYzkgMTAwNjQ0Ci0tLSBhL2FjbG9jYWwvYXhfbGliX2V2ZW50Lm00CisrKyBiL2FjbG9jYWwvYXhfbGliX2V2ZW50Lm00CkBAIC03NSw3ICs3NSw3IEBACiAgICAgICAgICAgQUNfTEFOR19QVVNIKFtDXSkKICAgICAgICAgICBkbmwgVGhpcyBjYW4gYmUgY2hhbmdlZCB0byBBQ19MSU5LX0lGRUxTRSBpZiB5b3UgYXJlIGNyb3NzLWNvbXBpbGluZywKICAgICAgICAgICBkbmwgYnV0IHRoZW4gdGhlIHZlcnNpb24gY2Fubm90IGJlIGNoZWNrZWQuCi0gICAgICAgICAgQUNfUlVOX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbCisgICAgICAgICAgQUNfTElOS19JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWwogICAgICAgICAgICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICAgICAgICAgICAjaW5jbHVkZSA8ZXZlbnQuaD4KICAgICAgICAgICBdXSwgW1sKZGlmZiAtLWdpdCBhL2FjbG9jYWwvYXhfbGliX3psaWIubTQgYi9hY2xvY2FsL2F4X2xpYl96bGliLm00CmluZGV4IDhjMTBhYjQuLmJkYjllMTEgMTAwNjQ0Ci0tLSBhL2FjbG9jYWwvYXhfbGliX3psaWIubTQKKysrIGIvYWNsb2NhbC9heF9saWJfemxpYi5tNApAQCAtNzMsNyArNzMsNyBAQAogICAgICAgICAgICMgICAoZGVmaW5lZCBpbiB0aGUgbGlicmFyeSkuCiAgICAgICAgICAgQUNfTEFOR19QVVNIKFtDXSkKICAgICAgICAgICBkbmwgVGhpcyBjYW4gYmUgY2hhbmdlZCB0byBBQ19MSU5LX0lGRUxTRSBpZiB5b3UgYXJlIGNyb3NzLWNvbXBpbGluZy4KLSAgICAgICAgICBBQ19SVU5fSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1sKKyAgICAgICAgICBBQ19MSU5LX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbCiAgICAgICAgICAgI2luY2x1ZGUgPHpsaWIuaD4KICAgICAgICAgICAjaWYgWkxJQl9WRVJOVU0gPj0gMHgkV0FOVF9aTElCX1ZFUlNJT04KICAgICAgICAgICAjZWxzZQpkaWZmIC0tZ2l0IGEvYWNsb2NhbC9heF9sdWEubTQgYi9hY2xvY2FsL2F4X2x1YS5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTIwMTY3Ci0tLSAvZGV2L251bGwKKysrIGIvYWNsb2NhbC9heF9sdWEubTQKQEAgLTAsMCArMSw2NjQgQEAKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjICAgICAgICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvYXV0b2NvbmYtYXJjaGl2ZS9heF9sdWEuaHRtbAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgU1lOT1BTSVMKKyMKKyMgICBBWF9QUk9HX0xVQVsoW01JTklNVU0tVkVSU0lPTl0sIFtUT08tQklHLVZFUlNJT05dLCBbQUNUSU9OLUlGLUZPVU5EXSwgW0FDVElPTi1JRi1OT1QtRk9VTkRdKV0KKyMgICBBWF9MVUFfSEVBREVSU1soW0FDVElPTi1JRi1GT1VORF0sIFtBQ1RJT04tSUYtTk9ULUZPVU5EXSldCisjICAgQVhfTFVBX0xJQlNbKFtBQ1RJT04tSUYtRk9VTkRdLCBbQUNUSU9OLUlGLU5PVC1GT1VORF0pXQorIyAgIEFYX0xVQV9SRUFETElORVsoW0FDVElPTi1JRi1GT1VORF0sIFtBQ1RJT04tSUYtTk9ULUZPVU5EXSldCisjCisjIERFU0NSSVBUSU9OCisjCisjICAgRGV0ZWN0IGEgTHVhIGludGVycHJldGVyLCBvcHRpb25hbGx5IHNwZWNpZnlpbmcgYSBtaW5pbXVtIGFuZCBtYXhpbXVtCisjICAgdmVyc2lvbiBudW1iZXIuIFNldCB1cCBpbXBvcnRhbnQgTHVhIHBhdGhzLCBzdWNoIGFzIHRoZSBkaXJlY3RvcmllcyBpbgorIyAgIHdoaWNoIHRvIGluc3RhbGwgc2NyaXB0cyBhbmQgbW9kdWxlcyAoc2hhcmVkIGxpYnJhcmllcykuCisjCisjICAgQWxzbyBkZXRlY3QgTHVhIGhlYWRlcnMgYW5kIGxpYnJhcmllcy4gVGhlIEx1YSB2ZXJzaW9uIGNvbnRhaW5lZCBpbiB0aGUKKyMgICBoZWFkZXIgaXMgY2hlY2tlZCB0byBtYXRjaCB0aGUgTHVhIGludGVycHJldGVyIHZlcnNpb24gZXhhY3RseS4gV2hlbgorIyAgIHNlYXJjaGluZyBmb3IgTHVhIGxpYnJhcmllcywgdGhlIHZlcnNpb24gbnVtYmVyIGlzIHVzZWQgYXMgYSBzdWZmaXguCisjICAgVGhpcyBpcyBkb25lIHdpdGggdGhlIGdvYWwgb2Ygc3VwcG9ydGluZyBtdWx0aXBsZSBMdWEgaW5zdGFsbHMgKDUuMSwKKyMgICA1LjIsIGFuZCA1LjMgc2lkZS1ieS1zaWRlKS4KKyMKKyMgICBBIG5vdGUgb24gY29tcGF0aWJpbGl0eSB3aXRoIHByZXZpb3VzIHZlcnNpb25zOiBUaGlzIGZpbGUgaGFzIGJlZW4KKyMgICBtb3N0bHkgcmV3cml0dGVuIGZvciBzZXJpYWwgMTguIE1vc3QgZGV2ZWxvcGVycyBzaG91bGQgYmUgYWJsZSB0byB1c2UKKyMgICB0aGVzZSBtYWNyb3Mgd2l0aG91dCBuZWVkaW5nIHRvIG1vZGlmeSBjb25maWd1cmUuYWMuIENhcmUgaGFzIGJlZW4gdGFrZW4KKyMgICB0byBwcmVzZXJ2ZSBlYWNoIG1hY3JvJ3MgYmVoYXZpb3IsIGJ1dCB0aGVyZSBhcmUgc29tZSBkaWZmZXJlbmNlczoKKyMKKyMgICAxKSBBWF9XSVRIX0xVQSBpcyBkZXByZWNhdGVkOyBpdCBub3cgZXhwYW5kcyB0byB0aGUgZXhhY3Qgc2FtZSB0aGluZyBhcworIyAgIEFYX1BST0dfTFVBIHdpdGggbm8gYXJndW1lbnRzLgorIworIyAgIDIpIEFYX0xVQV9IRUFERVJTIG5vdyBjaGVja3MgdGhhdCB0aGUgdmVyc2lvbiBudW1iZXIgZGVmaW5lZCBpbiBsdWEuaAorIyAgIG1hdGNoZXMgdGhlIGludGVycHJldGVyIHZlcnNpb24uIEFYX0xVQV9IRUFERVJTX1ZFUlNJT04gaXMgdGhlcmVmb3JlCisjICAgdW5uZWNlc3NhcnksIHNvIGl0IGlzIGRlcHJlY2F0ZWQgYW5kIGRvZXMgbm90IGV4cGFuZCB0byBhbnl0aGluZy4KKyMKKyMgICAzKSBUaGUgY29uZmlndXJlIGZsYWcgLS13aXRoLWx1YS1zdWZmaXggbm8gbG9uZ2VyIGV4aXN0czsgdGhlIHVzZXIKKyMgICBzaG91bGQgaW5zdGVhZCBzcGVjaWZ5IHRoZSBMVUEgcHJlY2lvdXMgdmFyaWFibGUgb24gdGhlIGNvbW1hbmQgbGluZS4KKyMgICBTZWUgdGhlIEFYX1BST0dfTFVBIGRlc2NyaXB0aW9uIGZvciBkZXRhaWxzLgorIworIyAgIFBsZWFzZSByZWFkIHRoZSBtYWNybyBkZXNjcmlwdGlvbnMgYmVsb3cgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisjCisjICAgVGhpcyBmaWxlIHdhcyBpbnNwaXJlZCBieSBBbmRyZXcgRGFsa2UncyBhbmQgSmFtZXMgSGVuc3RyaWRnZSdzCisjICAgcHl0aG9uLm00IGFuZCBUb20gUGF5bmUncywgTWF0dGhpZXUgTW95J3MsIGFuZCBSZXViZW4gVGhvbWFzJ3MgYXhfbHVhLm00CisjICAgKHNlcmlhbCAxNykuIEJhc2ljYWxseSwgdGhpcyBmaWxlIGlzIGEgbWFzaC11cCBvZiB0aG9zZSB0d28gZmlsZXMuIEkKKyMgICBsaWtlIHRvIHRoaW5rIGl0IGNvbWJpbmVzIHRoZSBiZXN0IG9mIHRoZSB0d28hCisjCisjICAgQVhfUFJPR19MVUE6IFNlYXJjaCBmb3IgdGhlIEx1YSBpbnRlcnByZXRlciwgYW5kIHNldCB1cCBpbXBvcnRhbnQgTHVhCisjICAgcGF0aHMuIEFkZHMgcHJlY2lvdXMgdmFyaWFibGUgTFVBLCB3aGljaCBtYXkgY29udGFpbiB0aGUgcGF0aCBvZiB0aGUgTHVhCisjICAgaW50ZXJwcmV0ZXIuIElmIExVQSBpcyBibGFuaywgdGhlIHVzZXIncyBwYXRoIGlzIHNlYXJjaGVkIGZvciBhbgorIyAgIHN1aXRhYmxlIGludGVycHJldGVyLgorIworIyAgIElmIE1JTklNVU0tVkVSU0lPTiBpcyBzdXBwbGllZCwgdGhlbiBvbmx5IEx1YSBpbnRlcnByZXRlcnMgd2l0aCBhCisjICAgdmVyc2lvbiBudW1iZXIgZ3JlYXRlciBvciBlcXVhbCB0byBNSU5JTVVNLVZFUlNJT04gd2lsbCBiZSBhY2NlcHRlZC4gSWYKKyMgICBUT08tQklHLVZFUlNJT04gaXMgYWxzbyBzdXBwbGllZCwgdGhlbiBvbmx5IEx1YSBpbnRlcnByZXRlcnMgd2l0aCBhCisjICAgdmVyc2lvbiBudW1iZXIgZ3JlYXRlciBvciBlcXVhbCB0byBNSU5JTVVNLVZFUlNJT04gYW5kIGxlc3MgdGhhbgorIyAgIFRPTy1CSUctVkVSU0lPTiB3aWxsIGJlIGFjY2VwdGVkLgorIworIyAgIFRoZSBMdWEgdmVyc2lvbiBudW1iZXIsIExVQV9WRVJTSU9OLCBpcyBmb3VuZCBmcm9tIHRoZSBpbnRlcnByZXRlciwgYW5kCisjICAgc3Vic3RpdHV0ZWQuIExVQV9QTEFURk9STSBpcyBhbHNvIGZvdW5kLCBidXQgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgKG5vCisjICAgc3RhbmRhcmQgcmVwcmVzZW50YXRpb24pLgorIworIyAgIEZpbmFsbHksIHRoZSBtYWNybyBmaW5kcyBmb3VyIHBhdGhzOgorIworIyAgICAgbHVhZGlyICAgICAgICAgICAgIERpcmVjdG9yeSB0byBpbnN0YWxsIEx1YSBzY3JpcHRzLgorIyAgICAgcGtnbHVhZGlyICAgICAgICAgICRsdWFkaXIvJFBBQ0tBR0UKKyMgICAgIGx1YWV4ZWNkaXIgICAgICAgICBEaXJlY3RvcnkgdG8gaW5zdGFsbCBMdWEgbW9kdWxlcy4KKyMgICAgIHBrZ2x1YWV4ZWNkaXIgICAgICAkbHVhZXhlY2Rpci8kUEFDS0FHRQorIworIyAgIFRoZXNlIHBhdGhzIGFyZSBmb3VuZCBiYXNlZCBvbiAkcHJlZml4LCAkZXhlY19wcmVmaXgsIEx1YSdzCisjICAgcGFja2FnZS5wYXRoLCBhbmQgcGFja2FnZS5jcGF0aC4gVGhlIGZpcnN0IHBhdGggb2YgcGFja2FnZS5wYXRoCisjICAgYmVnaW5uaW5nIHdpdGggJHByZWZpeCBpcyBzZWxlY3RlZCBhcyBsdWFkaXIuIFRoZSBmaXJzdCBwYXRoIG9mCisjICAgcGFja2FnZS5jcGF0aCBiZWdpbm5pbmcgd2l0aCAkZXhlY19wcmVmaXggaXMgdXNlZCBhcyBsdWFleGVjZGlyLiBUaGlzCisjICAgc2hvdWxkIHdvcmsgb24gYWxsIHJlYXNvbmFibGUgTHVhIGluc3RhbGxhdGlvbnMuIElmIGEgcGF0aCBjYW5ub3QgYmUKKyMgICBkZXRlcm1pbmVkLCBhIGRlZmF1bHQgcGF0aCBpcyB1c2VkLiBPZiBjb3Vyc2UsIHRoZSB1c2VyIGNhbiBvdmVycmlkZQorIyAgIHRoZXNlIGxhdGVyIHdoZW4gaW52b2tpbmcgbWFrZS4KKyMKKyMgICAgIGx1YWRpciAgICAgICAgICAgICBEZWZhdWx0OiAkcHJlZml4L3NoYXJlL2x1YS8kTFVBX1ZFUlNJT04KKyMgICAgIGx1YWV4ZWNkaXIgICAgICAgICBEZWZhdWx0OiAkZXhlY19wcmVmaXgvbGliL2x1YS8kTFVBX1ZFUlNJT04KKyMKKyMgICBUaGVzZSBkaXJlY3RvcmllcyBjYW4gYmUgdXNlZCBieSBBdXRvbWFrZSBhcyBpbnN0YWxsIGRlc3RpbmF0aW9ucy4gVGhlCisjICAgdmFyaWFibGUgbmFtZSBtaW51cyAnZGlyJyBuZWVkcyB0byBiZSB1c2VkIGFzIGEgcHJlZml4IHRvIHRoZQorIyAgIGFwcHJvcHJpYXRlIEF1dG9tYWtlIHByaW1hcnksIGUuZy4gbHVhX1NDUklQUyBvciBsdWFleGVjX0xJQlJBUklFUy4KKyMKKyMgICBJZiBhbiBhY2NlcHRhYmxlIEx1YSBpbnRlcnByZXRlciBpcyBmb3VuZCwgdGhlbiBBQ1RJT04tSUYtRk9VTkQgaXMKKyMgICBwZXJmb3JtZWQsIG90aGVyd2lzZSBBQ1RJT04tSUYtTk9ULUZPVU5EIGlzIHByZWZvcm1lZC4gSWYgQUNUSU9OLUlGLU5PVC0KKyMgICBGT1VORCBpcyBibGFuaywgdGhlbiBpdCB3aWxsIGRlZmF1bHQgdG8gcHJpbnRpbmcgYW4gZXJyb3IuIFRvIHByZXZlbnQKKyMgICB0aGUgZGVmYXVsdCBiZWhhdmlvciwgZ2l2ZSAnOicgYXMgYW4gYWN0aW9uLgorIworIyAgIEFYX0xVQV9IRUFERVJTOiBTZWFyY2ggZm9yIEx1YSBoZWFkZXJzLiBSZXF1aXJlcyB0aGF0IEFYX1BST0dfTFVBIGJlCisjICAgZXhwYW5kZWQgYmVmb3JlIHRoaXMgbWFjcm8uIEFkZHMgcHJlY2lvdXMgdmFyaWFibGUgTFVBX0lOQ0xVREUsIHdoaWNoCisjICAgbWF5IGNvbnRhaW4gTHVhIHNwZWNpZmljIGluY2x1ZGUgZmxhZ3MsIGUuZy4gLUkvdXNyL2luY2x1ZGUvbHVhNS4xLiBJZgorIyAgIExVQV9JTkNMVURFIGlzIGJsYW5rLCB0aGVuIHRoaXMgbWFjcm8gd2lsbCBhdHRlbXB0IHRvIGZpbmQgc3VpdGFibGUKKyMgICBmbGFncy4KKyMKKyMgICBMVUFfSU5DTFVERSBjYW4gYmUgdXNlZCBieSBBdXRvbWFrZSB0byBjb21waWxlIEx1YSBtb2R1bGVzIG9yCisjICAgZXhlY3V0YWJsZXMgd2l0aCBlbWJlZGRlZCBpbnRlcnByZXRlcnMuIFRoZSAqX0NQUEZMQUdTIHZhcmlhYmxlcyBzaG91bGQKKyMgICBiZSB1c2VkIGZvciB0aGlzIHB1cnBvc2UsIGUuZy4gbXlwcm9nX0NQUEZMQUdTID0gJChMVUFfSU5DTFVERSkuCisjCisjICAgVGhpcyBtYWNybyBzZWFyY2hlcyBmb3IgdGhlIGhlYWRlciBsdWEuaCAoYW5kIG90aGVycykuIFRoZSBzZWFyY2ggaXMKKyMgICBwZXJmb3JtZWQgd2l0aCBhIGNvbWJpbmF0aW9uIG9mIENQUEZMQUdTLCBDUEFUSCwgZXRjLCBhbmQgTFVBX0lOQ0xVREUuCisjICAgSWYgdGhlIHNlYXJjaCBpcyB1bnN1Y2Nlc3NmdWwsIHRoZW4gc29tZSBjb21tb24gZGlyZWN0b3JpZXMgYXJlIHRyaWVkLgorIyAgIElmIHRoZSBoZWFkZXJzIGFyZSB0aGVuIGZvdW5kLCB0aGVuIExVQV9JTkNMVURFIGlzIHNldCBhY2NvcmRpbmdseS4KKyMKKyMgICBUaGUgcGF0aHMgYXV0b21hdGljYWxseSBzZWFyY2hlZCBhcmU6CisjCisjICAgICAqIC91c3IvaW5jbHVkZS9sdWFYLlkKKyMgICAgICogL3Vzci9pbmNsdWRlL2x1YS9YLlkKKyMgICAgICogL3Vzci9pbmNsdWRlL2x1YVhZCisjICAgICAqIC91c3IvbG9jYWwvaW5jbHVkZS9sdWFYLlkKKyMgICAgICogL3Vzci9sb2NhbC9pbmNsdWRlL2x1YS1YLlkKKyMgICAgICogL3Vzci9sb2NhbC9pbmNsdWRlL2x1YS9YLlkKKyMgICAgICogL3Vzci9sb2NhbC9pbmNsdWRlL2x1YVhZCisjCisjICAgKFdoZXJlIFguWSBpcyB0aGUgTHVhIHZlcnNpb24gbnVtYmVyLCBlLmcuIDUuMS4pCisjCisjICAgVGhlIEx1YSB2ZXJzaW9uIG51bWJlciBmb3VuZCBpbiB0aGUgaGVhZGVycyBpcyBhbHdheXMgY2hlY2tlZCB0byBtYXRjaAorIyAgIHRoZSBMdWEgaW50ZXJwcmV0ZXIncyB2ZXJzaW9uIG51bWJlci4gTHVhIGhlYWRlcnMgd2l0aCBtaXNtYXRjaGVkCisjICAgdmVyc2lvbiBudW1iZXJzIGFyZSBub3QgYWNjZXB0ZWQuCisjCisjICAgSWYgaGVhZGVycyBhcmUgZm91bmQsIHRoZW4gQUNUSU9OLUlGLUZPVU5EIGlzIHBlcmZvcm1lZCwgb3RoZXJ3aXNlCisjICAgQUNUSU9OLUlGLU5PVC1GT1VORCBpcyBwZXJmb3JtZWQuIElmIEFDVElPTi1JRi1OT1QtRk9VTkQgaXMgYmxhbmssIHRoZW4KKyMgICBpdCB3aWxsIGRlZmF1bHQgdG8gcHJpbnRpbmcgYW4gZXJyb3IuIFRvIHByZXZlbnQgdGhlIGRlZmF1bHQgYmVoYXZpb3IsCisjICAgc2V0IHRoZSBhY3Rpb24gdG8gJzonLgorIworIyAgIEFYX0xVQV9MSUJTOiBTZWFyY2ggZm9yIEx1YSBsaWJyYXJpZXMuIFJlcXVpcmVzIHRoYXQgQVhfUFJPR19MVUEgYmUKKyMgICBleHBhbmRlZCBiZWZvcmUgdGhpcyBtYWNyby4gQWRkcyBwcmVjaW91cyB2YXJpYWJsZSBMVUFfTElCLCB3aGljaCBtYXkKKyMgICBjb250YWluIEx1YSBzcGVjaWZpYyBsaW5rZXIgZmxhZ3MsIGUuZy4gLWxsdWE1LjEuIElmIExVQV9MSUIgaXMgYmxhbmssCisjICAgdGhlbiB0aGlzIG1hY3JvIHdpbGwgYXR0ZW1wdCB0byBmaW5kIHN1aXRhYmxlIGZsYWdzLgorIworIyAgIExVQV9MSUIgY2FuIGJlIHVzZWQgYnkgQXV0b21ha2UgdG8gbGluayBMdWEgbW9kdWxlcyBvciBleGVjdXRhYmxlcyB3aXRoCisjICAgZW1iZWRkZWQgaW50ZXJwcmV0ZXJzLiBUaGUgKl9MSUJBREQgYW5kICpfTERBREQgdmFyaWFibGVzIHNob3VsZCBiZSB1c2VkCisjICAgZm9yIHRoaXMgcHVycG9zZSwgZS5nLiBteW1vZF9MSUJBREQgPSAkKExVQV9MSUIpLgorIworIyAgIFRoaXMgbWFjcm8gc2VhcmNoZXMgZm9yIHRoZSBMdWEgbGlicmFyeS4gTW9yZSB0ZWNobmljYWxseSwgaXQgc2VhcmNoZXMKKyMgICBmb3IgYSBsaWJyYXJ5IGNvbnRhaW5pbmcgdGhlIGZ1bmN0aW9uIGx1YV9sb2FkLiBUaGUgc2VhcmNoIGlzIHBlcmZvcm1lZAorIyAgIHdpdGggYSBjb21iaW5hdGlvbiBvZiBMSUJTLCBMSUJSQVJZX1BBVEgsIGFuZCBMVUFfTElCLgorIworIyAgIElmIHRoZSBzZWFyY2ggZGV0ZXJtaW5lcyB0aGF0IHNvbWUgbGlua2VyIGZsYWdzIGFyZSBtaXNzaW5nLCB0aGVuIHRob3NlCisjICAgZmxhZ3Mgd2lsbCBiZSBhZGRlZCB0byBMVUFfTElCLgorIworIyAgIElmIGxpYnJhcmllcyBhcmUgZm91bmQsIHRoZW4gQUNUSU9OLUlGLUZPVU5EIGlzIHBlcmZvcm1lZCwgb3RoZXJ3aXNlCisjICAgQUNUSU9OLUlGLU5PVC1GT1VORCBpcyBwZXJmb3JtZWQuIElmIEFDVElPTi1JRi1OT1QtRk9VTkQgaXMgYmxhbmssIHRoZW4KKyMgICBpdCB3aWxsIGRlZmF1bHQgdG8gcHJpbnRpbmcgYW4gZXJyb3IuIFRvIHByZXZlbnQgdGhlIGRlZmF1bHQgYmVoYXZpb3IsCisjICAgc2V0IHRoZSBhY3Rpb24gdG8gJzonLgorIworIyAgIEFYX0xVQV9SRUFETElORTogU2VhcmNoIGZvciByZWFkbGluZSBoZWFkZXJzIGFuZCBsaWJyYXJpZXMuIFJlcXVpcmVzIHRoZQorIyAgIEFYX0xJQl9SRUFETElORSBtYWNybywgd2hpY2ggaXMgcHJvdmlkZWQgYnkgYXhfbGliX3JlYWRsaW5lLm00IGZyb20gdGhlCisjICAgQXV0b2NvbmYgQXJjaGl2ZS4KKyMKKyMgICBJZiBhIHJlYWRsaW5lIGNvbXBhdGlibGUgbGlicmFyeSBpcyBmb3VuZCwgdGhlbiBBQ1RJT04tSUYtRk9VTkQgaXMKKyMgICBwZXJmb3JtZWQsIG90aGVyd2lzZSBBQ1RJT04tSUYtTk9ULUZPVU5EIGlzIHBlcmZvcm1lZC4KKyMKKyMgTElDRU5TRQorIworIyAgIENvcHlyaWdodCAoYykgMjAxNSBSZXViZW4gVGhvbWFzIDxycnRAc2MzZC5vcmc+CisjICAgQ29weXJpZ2h0IChjKSAyMDE0IFRpbSBQZXJraW5zIDx0cHJrNzdAZ21haWwuY29tPgorIworIyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisjICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisjICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorIyAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorIyAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwKKyMgICBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjICAgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisjCisjICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIHJlc3BlY3RpdmUgQXV0b2NvbmYgTWFjcm8ncyBjb3B5cmlnaHQgb3duZXIKKyMgICBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgdGhlIGNvbmZpZ3VyZQorIyAgIHNjcmlwdHMgdGhhdCBhcmUgdGhlIG91dHB1dCBvZiBBdXRvY29uZiB3aGVuIHByb2Nlc3NpbmcgdGhlIE1hY3JvLiBZb3UKKyMgICBuZWVkIG5vdCBmb2xsb3cgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB3aGVuIHVzaW5nCisjICAgb3IgZGlzdHJpYnV0aW5nIHN1Y2ggc2NyaXB0cywgZXZlbiB0aG91Z2ggcG9ydGlvbnMgb2YgdGhlIHRleHQgb2YgdGhlCisjICAgTWFjcm8gYXBwZWFyIGluIHRoZW0uIFRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBkb2VzIGdvdmVybgorIyAgIGFsbCBvdGhlciB1c2Ugb2YgdGhlIG1hdGVyaWFsIHRoYXQgY29uc3RpdHV0ZXMgdGhlIEF1dG9jb25mIE1hY3JvLgorIworIyAgIFRoaXMgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdQTCBhcHBsaWVzIHRvIHZlcnNpb25zIG9mIHRoZSBBdXRvY29uZgorIyAgIE1hY3JvIHJlbGVhc2VkIGJ5IHRoZSBBdXRvY29uZiBBcmNoaXZlLiBXaGVuIHlvdSBtYWtlIGFuZCBkaXN0cmlidXRlIGEKKyMgICBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSBBdXRvY29uZiBNYWNybywgeW91IG1heSBleHRlbmQgdGhpcyBzcGVjaWFsCisjICAgZXhjZXB0aW9uIHRvIHRoZSBHUEwgdG8gYXBwbHkgdG8geW91ciBtb2RpZmllZCB2ZXJzaW9uIGFzIHdlbGwuCisKKyNzZXJpYWwgNDAKKworZG5sID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK2RubCBBWF9QUk9HX0xVQShbTUlOSU1VTS1WRVJTSU9OXSwgW1RPTy1CSUctVkVSU0lPTl0sCitkbmwgICAgICAgICAgICAgW0FDVElPTi1JRi1GT1VORF0sIFtBQ1RJT04tSUYtTk9ULUZPVU5EXSkKK2RubCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitBQ19ERUZVTihbQVhfUFJPR19MVUFdLAorWworICBkbmwgQ2hlY2sgZm9yIHJlcXVpcmVkIHRvb2xzLgorICBBQ19SRVFVSVJFKFtBQ19QUk9HX0dSRVBdKQorICBBQ19SRVFVSVJFKFtBQ19QUk9HX1NFRF0pCisKKyAgZG5sIE1ha2UgTFVBIGEgcHJlY2lvdXMgdmFyaWFibGUuCisgIEFDX0FSR19WQVIoW0xVQV0sIFtUaGUgTHVhIGludGVycHJldGVyLCBlLmcuIC91c3IvYmluL2x1YTUuMV0pCisKKyAgZG5sIEZpbmQgYSBMdWEgaW50ZXJwcmV0ZXIuCisgIG00X2RlZmluZV9kZWZhdWx0KFtfQVhfTFVBX0lOVEVSUFJFVEVSX0xJU1RdLAorICAgIFtsdWEgbHVhNS4zIGx1YTUzIGx1YTUuMiBsdWE1MiBsdWE1LjEgbHVhNTEgbHVhNTBdKQorCisgIG00X2lmKFskMV0sIFtdLAorICBbIGRubCBObyB2ZXJzaW9uIGNoZWNrIGlzIG5lZWRlZC4gRmluZCBhbnkgTHVhIGludGVycHJldGVyLgorICAgIEFTX0lGKFt0ZXN0ICJ4JExVQSIgPSAneCddLAorICAgICAgW0FDX1BBVEhfUFJPR1MoW0xVQV0sIFtfQVhfTFVBX0lOVEVSUFJFVEVSX0xJU1RdLCBbOl0pXSkKKyAgICBheF9kaXNwbGF5X0xVQT0nbHVhJworCisgICAgQVNfSUYoW3Rlc3QgIngkTFVBIiAhPSAneDonXSwKKyAgICAgIFsgZG5sIEF0IGxlYXN0IGNoZWNrIGlmIHRoaXMgaXMgYSBMdWEgaW50ZXJwcmV0ZXIuCisgICAgICAgIEFDX01TR19DSEVDS0lORyhbaWYgJExVQSBpcyBhIEx1YSBpbnRlcnByZXRlcl0pCisgICAgICAgIF9BWF9MVUFfQ0hLX0lTX0lOVFJQKFskTFVBXSwKKyAgICAgICAgICBbQUNfTVNHX1JFU1VMVChbeWVzXSldLAorICAgICAgICAgIFsgQUNfTVNHX1JFU1VMVChbbm9dKQorICAgICAgICAgICAgQUNfTVNHX0VSUk9SKFtub3QgYSBMdWEgaW50ZXJwcmV0ZXJdKQorICAgICAgICAgIF0pCisgICAgICBdKQorICBdLAorICBbIGRubCBBIHZlcnNpb24gY2hlY2sgaXMgbmVlZGVkLgorICAgIEFTX0lGKFt0ZXN0ICJ4JExVQSIgIT0gJ3gnXSwKKyAgICBbIGRubCBDaGVjayBpZiB0aGlzIGlzIGEgTHVhIGludGVycHJldGVyLgorICAgICAgQUNfTVNHX0NIRUNLSU5HKFtpZiAkTFVBIGlzIGEgTHVhIGludGVycHJldGVyXSkKKyAgICAgIF9BWF9MVUFfQ0hLX0lTX0lOVFJQKFskTFVBXSwKKyAgICAgICAgW0FDX01TR19SRVNVTFQoW3llc10pXSwKKyAgICAgICAgWyBBQ19NU0dfUkVTVUxUKFtub10pCisgICAgICAgICAgQUNfTVNHX0VSUk9SKFtub3QgYSBMdWEgaW50ZXJwcmV0ZXJdKQorICAgICAgICBdKQorICAgICAgZG5sIENoZWNrIHRoZSB2ZXJzaW9uLgorICAgICAgbTRfaWYoWyQyXSwgW10sCisgICAgICAgIFtfYXhfY2hlY2tfdGV4dD0id2hldGhlciAkTFVBIHZlcnNpb24gPj0gJDEiXSwKKyAgICAgICAgW19heF9jaGVja190ZXh0PSJ3aGV0aGVyICRMVUEgdmVyc2lvbiA+PSAkMSwgPCAkMiJdKQorICAgICAgQUNfTVNHX0NIRUNLSU5HKFskX2F4X2NoZWNrX3RleHRdKQorICAgICAgX0FYX0xVQV9DSEtfVkVSKFskTFVBXSwgWyQxXSwgWyQyXSwKKyAgICAgICAgW0FDX01TR19SRVNVTFQoW3llc10pXSwKKyAgICAgICAgWyBBQ19NU0dfUkVTVUxUKFtub10pCisgICAgICAgICAgQUNfTVNHX0VSUk9SKFt2ZXJzaW9uIGlzIG91dCBvZiByYW5nZSBmb3Igc3BlY2lmaWVkIExVQV0pXSkKKyAgICAgIGF4X2Rpc3BsYXlfTFVBPSRMVUEKKyAgICBdLAorICAgIFsgZG5sIFRyeSBlYWNoIGludGVycHJldGVyIHVudGlsIHdlIGZpbmQgb25lIHRoYXQgc2F0aXNmaWVzIFZFUlNJT04uCisgICAgICBtNF9pZihbJDJdLCBbXSwKKyAgICAgICAgW19heF9jaGVja190ZXh0PSJmb3IgYSBMdWEgaW50ZXJwcmV0ZXIgd2l0aCB2ZXJzaW9uID49ICQxIl0sCisgICAgICAgIFtfYXhfY2hlY2tfdGV4dD0iZm9yIGEgTHVhIGludGVycHJldGVyIHdpdGggdmVyc2lvbiA+PSAkMSwgPCAkMiJdKQorICAgICAgQUNfQ0FDSEVfQ0hFQ0soWyRfYXhfY2hlY2tfdGV4dF0sCisgICAgICAgIFtheF9jdl9wYXRobGVzc19MVUFdLAorICAgICAgICBbIGZvciBheF9jdl9wYXRobGVzc19MVUEgaW4gX0FYX0xVQV9JTlRFUlBSRVRFUl9MSVNUIG5vbmU7IGRvCisgICAgICAgICAgICB0ZXN0ICJ4JGF4X2N2X3BhdGhsZXNzX0xVQSIgPSAneG5vbmUnICYmIGJyZWFrCisgICAgICAgICAgICBfQVhfTFVBX0NIS19JU19JTlRSUChbJGF4X2N2X3BhdGhsZXNzX0xVQV0sIFtdLCBbY29udGludWVdKQorICAgICAgICAgICAgX0FYX0xVQV9DSEtfVkVSKFskYXhfY3ZfcGF0aGxlc3NfTFVBXSwgWyQxXSwgWyQyXSwgW2JyZWFrXSkKKyAgICAgICAgICBkb25lCisgICAgICAgIF0pCisgICAgICBkbmwgU2V0ICRMVUEgdG8gdGhlIGFic29sdXRlIHBhdGggb2YgJGF4X2N2X3BhdGhsZXNzX0xVQS4KKyAgICAgIEFTX0lGKFt0ZXN0ICJ4JGF4X2N2X3BhdGhsZXNzX0xVQSIgPSAneG5vbmUnXSwKKyAgICAgICAgW0xVQT0nOiddLAorICAgICAgICBbQUNfUEFUSF9QUk9HKFtMVUFdLCBbJGF4X2N2X3BhdGhsZXNzX0xVQV0pXSkKKyAgICAgIGF4X2Rpc3BsYXlfTFVBPSRheF9jdl9wYXRobGVzc19MVUEKKyAgICBdKQorICBdKQorCisgIEFTX0lGKFt0ZXN0ICJ4JExVQSIgPSAneDonXSwKKyAgWyBkbmwgUnVuIGFueSB1c2VyLXNwZWNpZmllZCBhY3Rpb24sIG9yIGFib3J0LgorICAgIG00X2RlZmF1bHQoWyQ0XSwgW0FDX01TR19FUlJPUihbY2Fubm90IGZpbmQgc3VpdGFibGUgTHVhIGludGVycHJldGVyXSldKQorICBdLAorICBbIGRubCBRdWVyeSBMdWEgZm9yIGl0cyB2ZXJzaW9uIG51bWJlci4KKyAgICBBQ19DQUNIRV9DSEVDSyhbZm9yICRheF9kaXNwbGF5X0xVQSB2ZXJzaW9uXSwKKyAgICAgIFtheF9jdl9sdWFfdmVyc2lvbl0sCisgICAgICBbIGRubCBHZXQgdGhlIGludGVycHJldGVyIHZlcnNpb24gaW4gWC5ZIGZvcm1hdC4gVGhpcyBzaG91bGQgd29yayBmb3IKKyAgICAgICAgZG5sIGludGVycHJldGVycyB2ZXJzaW9uIDUuMCBhbmQgYmV5b25kLgorICAgICAgICBheF9jdl9sdWFfdmVyc2lvbj1bYCRMVUEgLWUgJworICAgICAgICAgIC0tIHJldHVybiBhIHZlcnNpb24gbnVtYmVyIGluIFguWSBmb3JtYXQKKyAgICAgICAgICBsb2NhbCBfLCBfLCB2ZXIgPSBzdHJpbmcuZmluZChfVkVSU0lPTiwgIl5MdWEgKCVkKyUuJWQrKSIpCisgICAgICAgICAgcHJpbnQodmVyKSdgXQorICAgICAgXSkKKyAgICBBU19JRihbdGVzdCAieCRheF9jdl9sdWFfdmVyc2lvbiIgPSAneCddLAorICAgICAgW0FDX01TR19FUlJPUihbaW52YWxpZCBMdWEgdmVyc2lvbiBudW1iZXJdKV0pCisgICAgQUNfU1VCU1QoW0xVQV9WRVJTSU9OXSwgWyRheF9jdl9sdWFfdmVyc2lvbl0pCisgICAgQUNfU1VCU1QoW0xVQV9TSE9SVF9WRVJTSU9OXSwgW2BlY2hvICIkTFVBX1ZFUlNJT04iIHwgJFNFRCAnc3xcLnx8J2BdKQorCisgICAgZG5sIFRoZSBmb2xsb3dpbmcgY2hlY2sgaXMgbm90IHN1cHBvcnRlZDoKKyAgICBkbmwgQXQgdGltZXMgKGxpa2Ugd2hlbiBidWlsZGluZyBzaGFyZWQgbGlicmFyaWVzKSB5b3UgbWF5IHdhbnQgdG8ga25vdworICAgIGRubCB3aGljaCBPUyBwbGF0Zm9ybSBMdWEgdGhpbmtzIHRoaXMgaXMuCisgICAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciAkYXhfZGlzcGxheV9MVUEgcGxhdGZvcm1dLAorICAgICAgW2F4X2N2X2x1YV9wbGF0Zm9ybV0sCisgICAgICBbYXhfY3ZfbHVhX3BsYXRmb3JtPVtgJExVQSAtZSAncHJpbnQoInVua25vd24iKSdgXV0pCisgICAgQUNfU1VCU1QoW0xVQV9QTEFURk9STV0sIFskYXhfY3ZfbHVhX3BsYXRmb3JtXSkKKworICAgIGRubCBVc2UgdGhlIHZhbHVlcyBvZiAkcHJlZml4IGFuZCAkZXhlY19wcmVmaXggZm9yIHRoZSBjb3JyZXNwb25kaW5nCisgICAgZG5sIHZhbHVlcyBvZiBMVUFfUFJFRklYIGFuZCBMVUFfRVhFQ19QUkVGSVguIFRoZXNlIGFyZSBtYWRlIGRpc3RpbmN0CisgICAgZG5sIHZhcmlhYmxlcyBzbyB0aGV5IGNhbiBiZSBvdmVycmlkZGVuIGlmIG5lZWQgYmUuIEhvd2V2ZXIsIHRoZSBnZW5lcmFsCisgICAgZG5sIGNvbnNlbnN1cyBpcyB0aGF0IHlvdSBzaG91bGRuJ3QgbmVlZCB0aGlzIGFiaWxpdHkuCisgICAgQUNfU1VCU1QoW0xVQV9QUkVGSVhdLCBbJyR7cHJlZml4fSddKQorICAgIEFDX1NVQlNUKFtMVUFfRVhFQ19QUkVGSVhdLCBbJyR7ZXhlY19wcmVmaXh9J10pCisKKyAgICBkbmwgTHVhIHByb3ZpZGVzIG5vIHdheSB0byBxdWVyeSB0aGUgc2NyaXB0IGRpcmVjdG9yeSwgYW5kIGluc3RlYWQKKyAgICBkbmwgcHJvdmlkZXMgTFVBX1BBVEguIEhvd2V2ZXIsIHdlIHNob3VsZCBiZSBhYmxlIHRvIG1ha2UgYSBzYWZlIGVkdWNhdGVkCisgICAgZG5sIGd1ZXNzLiBJZiB0aGUgYnVpbHQtaW4gc2VhcmNoIHBhdGggY29udGFpbnMgYSBkaXJlY3Rvcnkgd2hpY2ggaXMKKyAgICBkbmwgcHJlZml4ZWQgYnkgJHByZWZpeCwgdGhlbiB3ZSBjYW4gc3RvcmUgc2NyaXB0cyB0aGVyZS4gVGhlIGZpcnN0CisgICAgZG5sIG1hdGNoaW5nIHBhdGggd2lsbCBiZSB1c2VkLgorICAgIEFDX0NBQ0hFX0NIRUNLKFtmb3IgJGF4X2Rpc3BsYXlfTFVBIHNjcmlwdCBkaXJlY3RvcnldLAorICAgICAgW2F4X2N2X2x1YV9sdWFkaXJdLAorICAgICAgWyBBU19JRihbdGVzdCAieCRwcmVmaXgiID0gJ3hOT05FJ10sCisgICAgICAgICAgW2F4X2x1YV9wcmVmaXg9JGFjX2RlZmF1bHRfcHJlZml4XSwKKyAgICAgICAgICBbYXhfbHVhX3ByZWZpeD0kcHJlZml4XSkKKworICAgICAgICBkbmwgSW5pdGlhbGl6ZSB0byB0aGUgZGVmYXVsdCBwYXRoLgorICAgICAgICBheF9jdl9sdWFfbHVhZGlyPSIkTFVBX1BSRUZJWC9zaGFyZS9sdWEvJExVQV9WRVJTSU9OIgorCisgICAgICAgIGRubCBUcnkgdG8gZmluZCBhIHBhdGggd2l0aCB0aGUgcHJlZml4LgorICAgICAgICBfQVhfTFVBX0ZORF9QUkZYX1BUSChbJExVQV0sIFskYXhfbHVhX3ByZWZpeF0sIFtzY3JpcHRdKQorICAgICAgICBBU19JRihbdGVzdCAieCRheF9sdWFfcHJlZml4ZWRfcGF0aCIgIT0gJ3gnXSwKKyAgICAgICAgWyBkbmwgRml4IHRoZSBwcmVmaXguCisgICAgICAgICAgX2F4X3N0cmlwX3ByZWZpeD1gZWNobyAiJGF4X2x1YV9wcmVmaXgiIHwgJFNFRCAnc3wufC58ZydgCisgICAgICAgICAgYXhfY3ZfbHVhX2x1YWRpcj1gZWNobyAiJGF4X2x1YV9wcmVmaXhlZF9wYXRoIiB8IFwKKyAgICAgICAgICAgICRTRUQgInN8XiRfYXhfc3RyaXBfcHJlZml4fCRMVUFfUFJFRklYfCJgCisgICAgICAgIF0pCisgICAgICBdKQorICAgIEFDX1NVQlNUKFtsdWFkaXJdLCBbJGF4X2N2X2x1YV9sdWFkaXJdKQorICAgIEFDX1NVQlNUKFtwa2dsdWFkaXJdLCBbXCR7bHVhZGlyfS8kUEFDS0FHRV0pCisKKyAgICBkbmwgTHVhIHByb3ZpZGVzIG5vIHdheSB0byBxdWVyeSB0aGUgbW9kdWxlIGRpcmVjdG9yeSwgYW5kIGluc3RlYWQKKyAgICBkbmwgcHJvdmlkZXMgTFVBX1BBVEguIEhvd2V2ZXIsIHdlIHNob3VsZCBiZSBhYmxlIHRvIG1ha2UgYSBzYWZlIGVkdWNhdGVkCisgICAgZG5sIGd1ZXNzLiBJZiB0aGUgYnVpbHQtaW4gc2VhcmNoIHBhdGggY29udGFpbnMgYSBkaXJlY3Rvcnkgd2hpY2ggaXMKKyAgICBkbmwgcHJlZml4ZWQgYnkgJGV4ZWNfcHJlZml4LCB0aGVuIHdlIGNhbiBzdG9yZSBtb2R1bGVzIHRoZXJlLiBUaGUgZmlyc3QKKyAgICBkbmwgbWF0Y2hpbmcgcGF0aCB3aWxsIGJlIHVzZWQuCisgICAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciAkYXhfZGlzcGxheV9MVUEgbW9kdWxlIGRpcmVjdG9yeV0sCisgICAgICBbYXhfY3ZfbHVhX2x1YWV4ZWNkaXJdLAorICAgICAgWyBBU19JRihbdGVzdCAieCRleGVjX3ByZWZpeCIgPSAneE5PTkUnXSwKKyAgICAgICAgICBbYXhfbHVhX2V4ZWNfcHJlZml4PSRheF9sdWFfcHJlZml4XSwKKyAgICAgICAgICBbYXhfbHVhX2V4ZWNfcHJlZml4PSRleGVjX3ByZWZpeF0pCisKKyAgICAgICAgZG5sIEluaXRpYWxpemUgdG8gdGhlIGRlZmF1bHQgcGF0aC4KKyAgICAgICAgYXhfY3ZfbHVhX2x1YWV4ZWNkaXI9IiRMVUFfRVhFQ19QUkVGSVgvbGliL2x1YS8kTFVBX1ZFUlNJT04iCisKKyAgICAgICAgZG5sIFRyeSB0byBmaW5kIGEgcGF0aCB3aXRoIHRoZSBwcmVmaXguCisgICAgICAgIF9BWF9MVUFfRk5EX1BSRlhfUFRIKFskTFVBXSwKKyAgICAgICAgICBbJGF4X2x1YV9leGVjX3ByZWZpeF0sIFttb2R1bGVdKQorICAgICAgICBBU19JRihbdGVzdCAieCRheF9sdWFfcHJlZml4ZWRfcGF0aCIgIT0gJ3gnXSwKKyAgICAgICAgWyBkbmwgRml4IHRoZSBwcmVmaXguCisgICAgICAgICAgX2F4X3N0cmlwX3ByZWZpeD1gZWNobyAiJGF4X2x1YV9leGVjX3ByZWZpeCIgfCAkU0VEICdzfC58LnxnJ2AKKyAgICAgICAgICBheF9jdl9sdWFfbHVhZXhlY2Rpcj1gZWNobyAiJGF4X2x1YV9wcmVmaXhlZF9wYXRoIiB8IFwKKyAgICAgICAgICAgICRTRUQgInN8XiRfYXhfc3RyaXBfcHJlZml4fCRMVUFfRVhFQ19QUkVGSVh8ImAKKyAgICAgICAgXSkKKyAgICAgIF0pCisgICAgQUNfU1VCU1QoW2x1YWV4ZWNkaXJdLCBbJGF4X2N2X2x1YV9sdWFleGVjZGlyXSkKKyAgICBBQ19TVUJTVChbcGtnbHVhZXhlY2Rpcl0sIFtcJHtsdWFleGVjZGlyfS8kUEFDS0FHRV0pCisKKyAgICBkbmwgUnVuIGFueSB1c2VyIHNwZWNpZmllZCBhY3Rpb24uCisgICAgJDMKKyAgXSkKK10pCisKK2RubCBBWF9XSVRIX0xVQSBpcyBub3cgdGhlIHNhbWUgdGhpbmcgYXMgQVhfUFJPR19MVUEuCitBQ19ERUZVTihbQVhfV0lUSF9MVUFdLAorWworICBBQ19NU0dfV0FSTihbWyQwIGlzIGRlcHJlY2F0ZWQsIHBsZWFzZSB1c2UgQVhfUFJPR19MVUEgaW5zdGVhZF1dKQorICBBWF9QUk9HX0xVQQorXSkKKworCitkbmwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorZG5sIF9BWF9MVUFfQ0hLX0lTX0lOVFJQKFBST0csIFtBQ1RJT04tSUYtVFJVRV0sIFtBQ1RJT04tSUYtRkFMU0VdKQorZG5sID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0FDX0RFRlVOKFtfQVhfTFVBX0NIS19JU19JTlRSUF0sCitbCisgIGRubCBBIG1pbmltYWwgTHVhIGZhY3RvcmlhbCB0byBwcm92ZSB0aGlzIGlzIGFuIGludGVycHJldGVyLiBUaGlzIHNob3VsZCB3b3JrCisgIGRubCBmb3IgTHVhIGludGVycHJldGVycyB2ZXJzaW9uIDUuMCBhbmQgYmV5b25kLgorICBfYXhfbHVhX2ZhY3RvcmlhbD1bYCQxIDI+L2Rldi9udWxsIC1lICcKKyAgICAtLSBhIHNpbXBsZSBmYWN0b3JpYWwKKyAgICBmdW5jdGlvbiBmYWN0IChuKQorICAgICAgaWYgbiA9PSAwIHRoZW4KKyAgICAgICAgcmV0dXJuIDEKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIG4gKiBmYWN0KG4tMSkKKyAgICAgIGVuZAorICAgIGVuZAorICAgIHByaW50KCJmYWN0KDUpIGlzICIgLi4gZmFjdCg1KSknYF0KKyAgQVNfSUYoW3Rlc3QgIiRfYXhfbHVhX2ZhY3RvcmlhbCIgPSAnZmFjdCg1KSBpcyAxMjAnXSwKKyAgICBbJDJdLCBbJDNdKQorXSkKKworCitkbmwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorZG5sIF9BWF9MVUFfQ0hLX1ZFUihQUk9HLCBNSU5JTVVNLVZFUlNJT04sIFtUT08tQklHLVZFUlNJT05dLAorZG5sICAgICAgICAgICAgICAgICBbQUNUSU9OLUlGLVRSVUVdLCBbQUNUSU9OLUlGLUZBTFNFXSkKK2RubCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitBQ19ERUZVTihbX0FYX0xVQV9DSEtfVkVSXSwKK1sKKyAgZG5sIENoZWNrIHRoYXQgdGhlIEx1YSB2ZXJzaW9uIGlzIHdpdGhpbiB0aGUgYm91bmRzLiBPbmx5IHRoZSBtYWpvciBhbmQgbWlub3IKKyAgZG5sIHZlcnNpb24gbnVtYmVycyBhcmUgY29uc2lkZXJlZC4gVGhpcyBzaG91bGQgd29yayBmb3IgTHVhIGludGVycHJldGVycworICBkbmwgdmVyc2lvbiA1LjAgYW5kIGJleW9uZC4KKyAgX2F4X2x1YV9nb29kX3ZlcnNpb249W2AkMSAtZSAnCisgICAgLS0gYSBzY3JpcHQgdG8gY29tcGFyZSB2ZXJzaW9ucworICAgIGZ1bmN0aW9uIHZlcnN0cjJudW0odmVyc3RyKQorICAgICAgbG9jYWwgXywgXywgbWFqb3J2ZXIsIG1pbm9ydmVyID0gc3RyaW5nLmZpbmQodmVyc3RyLCAiXiglZCspJS4oJWQrKSIpCisgICAgICBpZiBtYWpvcnZlciBhbmQgbWlub3J2ZXIgdGhlbgorICAgICAgICByZXR1cm4gdG9udW1iZXIobWFqb3J2ZXIpICogMTAwICsgdG9udW1iZXIobWlub3J2ZXIpCisgICAgICBlbmQKKyAgICBlbmQKKyAgICBsb2NhbCBtaW52ZXIgPSB2ZXJzdHIybnVtKCIkMiIpCisgICAgbG9jYWwgXywgXywgdHJpbXZlciA9IHN0cmluZy5maW5kKF9WRVJTSU9OLCAiXkx1YSAoLiopIikKKyAgICBsb2NhbCB2ZXIgPSB2ZXJzdHIybnVtKHRyaW12ZXIpCisgICAgbG9jYWwgbWF4dmVyID0gdmVyc3RyMm51bSgiJDMiKSBvciAxZTkKKyAgICBpZiBtaW52ZXIgPD0gdmVyIGFuZCB2ZXIgPCBtYXh2ZXIgdGhlbgorICAgICAgcHJpbnQoInllcyIpCisgICAgZWxzZQorICAgICAgcHJpbnQoIm5vIikKKyAgICBlbmQnYF0KKyAgICBBU19JRihbdGVzdCAieCRfYXhfbHVhX2dvb2RfdmVyc2lvbiIgPSAieHllcyJdLAorICAgICAgWyQ0XSwgWyQ1XSkKK10pCisKKworZG5sID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK2RubCBfQVhfTFVBX0ZORF9QUkZYX1BUSChQUk9HLCBQUkVGSVgsIFNDUklQVC1PUi1NT0RVTEUtRElSKQorZG5sID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0FDX0RFRlVOKFtfQVhfTFVBX0ZORF9QUkZYX1BUSF0sCitbCisgIGRubCBHZXQgdGhlIHNjcmlwdCBvciBtb2R1bGUgZGlyZWN0b3J5IGJ5IHF1ZXJ5aW5nIHRoZSBMdWEgaW50ZXJwcmV0ZXIsCisgIGRubCBmaWx0ZXJpbmcgb24gdGhlIGdpdmVuIHByZWZpeCwgYW5kIHNlbGVjdGluZyB0aGUgc2hhbGxvd2VzdCBwYXRoLiBJZiBubworICBkbmwgcGF0aCBpcyBmb3VuZCBtYXRjaGluZyB0aGUgcHJlZml4LCB0aGUgcmVzdWx0IHdpbGwgYmUgYW4gZW1wdHkgc3RyaW5nLgorICBkbmwgVGhlIHRoaXJkIGFyZ3VtZW50IGRldGVybWluZXMgdGhlIHR5cGUgb2Ygc2VhcmNoLCBpdCBjYW4gYmUgJ3NjcmlwdCcgb3IKKyAgZG5sICdtb2R1bGUnLiBTdXBwbHlpbmcgJ3NjcmlwdCcgd2lsbCBwZXJmb3JtIHRoZSBzZWFyY2ggd2l0aCBwYWNrYWdlLnBhdGgKKyAgZG5sIGFuZCBMVUFfUEFUSCwgYW5kIHN1cHBseWluZyAnbW9kdWxlJyB3aWxsIHNlYXJjaCB3aXRoIHBhY2thZ2UuY3BhdGggYW5kCisgIGRubCBMVUFfQ1BBVEguIFRoaXMgaXMgZG9uZSBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIEx1YSA1LjAuCisKKyAgYXhfbHVhX3ByZWZpeGVkX3BhdGg9W2AkMSAtZSAnCisgICAgLS0gZ2V0IHRoZSBwYXRoIGJhc2VkIG9uIHNlYXJjaCB0eXBlCisgICAgbG9jYWwgc2VhcmNodHlwZSA9ICIkMyIKKyAgICBsb2NhbCBwYXRocyA9ICIiCisgICAgaWYgc2VhcmNodHlwZSA9PSAic2NyaXB0IiB0aGVuCisgICAgICBwYXRocyA9IChwYWNrYWdlIGFuZCBwYWNrYWdlLnBhdGgpIG9yIExVQV9QQVRICisgICAgZWxzZWlmIHNlYXJjaHR5cGUgPT0gIm1vZHVsZSIgdGhlbgorICAgICAgcGF0aHMgPSAocGFja2FnZSBhbmQgcGFja2FnZS5jcGF0aCkgb3IgTFVBX0NQQVRICisgICAgZW5kCisgICAgLS0gc2VhcmNoIGZvciB0aGUgcHJlZml4CisgICAgbG9jYWwgcHJlZml4ID0gIickMiciCisgICAgbG9jYWwgbWlucGF0aCA9ICIiCisgICAgbG9jYWwgbWluZGVwdGggPSAxZTkKKyAgICBzdHJpbmcuZ3N1YihwYXRocywgIihAPDpAXjtAOj5AKykiLAorICAgICAgZnVuY3Rpb24gKHBhdGgpCisgICAgICAgIHBhdGggPSBzdHJpbmcuZ3N1YihwYXRoLCAiJT8uKiQiLCAiIikKKyAgICAgICAgcGF0aCA9IHN0cmluZy5nc3ViKHBhdGgsICIvQDw6QF4vQDo+QCokIiwgIiIpCisgICAgICAgIGlmIHN0cmluZy5maW5kKHBhdGgsIHByZWZpeCkgdGhlbgorICAgICAgICAgIGxvY2FsIGRlcHRoID0gc3RyaW5nLmxlbihzdHJpbmcuZ3N1YihwYXRoLCAiQDw6QF4vQDo+QCIsICIiKSkKKyAgICAgICAgICBpZiBkZXB0aCA8IG1pbmRlcHRoIHRoZW4KKyAgICAgICAgICAgIG1pbnBhdGggPSBwYXRoCisgICAgICAgICAgICBtaW5kZXB0aCA9IGRlcHRoCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorICAgICAgZW5kKQorICAgIHByaW50KG1pbnBhdGgpJ2BdCitdKQorCisKK2RubCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitkbmwgQVhfTFVBX0hFQURFUlMoW0FDVElPTi1JRi1GT1VORF0sIFtBQ1RJT04tSUYtTk9ULUZPVU5EXSkKK2RubCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitBQ19ERUZVTihbQVhfTFVBX0hFQURFUlNdLAorWworICBkbmwgQ2hlY2sgZm9yIExVQV9WRVJTSU9OLgorICBBQ19NU0dfQ0hFQ0tJTkcoW2lmIExVQV9WRVJTSU9OIGlzIGRlZmluZWRdKQorICBBU19JRihbdGVzdCAieCRMVUFfVkVSU0lPTiIgIT0gJ3gnXSwKKyAgICBbQUNfTVNHX1JFU1VMVChbeWVzXSldLAorICAgIFsgQUNfTVNHX1JFU1VMVChbbm9dKQorICAgICAgQUNfTVNHX0VSUk9SKFtjYW5ub3QgY2hlY2sgTHVhIGhlYWRlcnMgd2l0aG91dCBrbm93aW5nIExVQV9WRVJTSU9OXSkKKyAgICBdKQorCisgIGRubCBNYWtlIExVQV9JTkNMVURFIGEgcHJlY2lvdXMgdmFyaWFibGUuCisgIEFDX0FSR19WQVIoW0xVQV9JTkNMVURFXSwgW1RoZSBMdWEgaW5jbHVkZXMsIGUuZy4gLUkvdXNyL2luY2x1ZGUvbHVhNS4xXSkKKworICBkbmwgU29tZSBkZWZhdWx0IGRpcmVjdG9yaWVzIHRvIHNlYXJjaC4KKyAgTFVBX1NIT1JUX1ZFUlNJT049YGVjaG8gIiRMVUFfVkVSU0lPTiIgfCAkU0VEICdzfFwufHwnYAorICBtNF9kZWZpbmVfZGVmYXVsdChbX0FYX0xVQV9JTkNMVURFX0xJU1RdLAorICAgIFsgL3Vzci9pbmNsdWRlL2x1YSRMVUFfVkVSU0lPTiBcCisgICAgICAvdXNyL2luY2x1ZGUvbHVhLSRMVUFfVkVSU0lPTiBcCisgICAgICAvdXNyL2luY2x1ZGUvbHVhLyRMVUFfVkVSU0lPTiBcCisgICAgICAvdXNyL2luY2x1ZGUvbHVhJExVQV9TSE9SVF9WRVJTSU9OIFwKKyAgICAgIC91c3IvbG9jYWwvaW5jbHVkZS9sdWEkTFVBX1ZFUlNJT04gXAorICAgICAgL3Vzci9sb2NhbC9pbmNsdWRlL2x1YS0kTFVBX1ZFUlNJT04gXAorICAgICAgL3Vzci9sb2NhbC9pbmNsdWRlL2x1YS8kTFVBX1ZFUlNJT04gXAorICAgICAgL3Vzci9sb2NhbC9pbmNsdWRlL2x1YSRMVUFfU0hPUlRfVkVSU0lPTiBcCisgICAgXSkKKworICBkbmwgVHJ5IHRvIGZpbmQgdGhlIGhlYWRlcnMuCisgIF9heF9sdWFfc2F2ZWRfY3BwZmxhZ3M9JENQUEZMQUdTCisgIENQUEZMQUdTPSIkQ1BQRkxBR1MgJExVQV9JTkNMVURFIgorICBBQ19DSEVDS19IRUFERVJTKFtsdWEuaCBsdWFsaWIuaCBsYXV4bGliLmggbHVhY29uZi5oXSkKKyAgQ1BQRkxBR1M9JF9heF9sdWFfc2F2ZWRfY3BwZmxhZ3MKKworICBkbmwgVHJ5IHNvbWUgb3RoZXIgZGlyZWN0b3JpZXMgaWYgTFVBX0lOQ0xVREUgd2FzIG5vdCBzZXQuCisgIEFTX0lGKFt0ZXN0ICJ4JExVQV9JTkNMVURFIiA9ICd4JyAmJgorICAgICAgICAgdGVzdCAieCRhY19jdl9oZWFkZXJfbHVhX2giICE9ICd4eWVzJ10sCisgICAgWyBkbmwgVHJ5IHNvbWUgY29tbW9uIGluY2x1ZGUgcGF0aHMuCisgICAgICBmb3IgX2F4X2luY2x1ZGVfcGF0aCBpbiBfQVhfTFVBX0lOQ0xVREVfTElTVDsgZG8KKyAgICAgICAgdGVzdCAhIC1kICIkX2F4X2luY2x1ZGVfcGF0aCIgJiYgY29udGludWUKKworICAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBMdWEgaGVhZGVycyBpbl0pCisgICAgICAgIEFDX01TR19SRVNVTFQoWyRfYXhfaW5jbHVkZV9wYXRoXSkKKworICAgICAgICBBU19VTlNFVChbYWNfY3ZfaGVhZGVyX2x1YV9oXSkKKyAgICAgICAgQVNfVU5TRVQoW2FjX2N2X2hlYWRlcl9sdWFsaWJfaF0pCisgICAgICAgIEFTX1VOU0VUKFthY19jdl9oZWFkZXJfbGF1eGxpYl9oXSkKKyAgICAgICAgQVNfVU5TRVQoW2FjX2N2X2hlYWRlcl9sdWFjb25mX2hdKQorCisgICAgICAgIF9heF9sdWFfc2F2ZWRfY3BwZmxhZ3M9JENQUEZMQUdTCisgICAgICAgIENQUEZMQUdTPSIkQ1BQRkxBR1MgLUkkX2F4X2luY2x1ZGVfcGF0aCIKKyAgICAgICAgQUNfQ0hFQ0tfSEVBREVSUyhbbHVhLmggbHVhbGliLmggbGF1eGxpYi5oIGx1YWNvbmYuaF0pCisgICAgICAgIENQUEZMQUdTPSRfYXhfbHVhX3NhdmVkX2NwcGZsYWdzCisKKyAgICAgICAgQVNfSUYoW3Rlc3QgIngkYWNfY3ZfaGVhZGVyX2x1YV9oIiA9ICd4eWVzJ10sCisgICAgICAgICAgWyBMVUFfSU5DTFVERT0iLUkkX2F4X2luY2x1ZGVfcGF0aCIKKyAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgXSkKKyAgICAgIGRvbmUKKyAgICBdKQorCisgIEFTX0lGKFt0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9sdWFfaCIgPSAneHllcyddLAorICAgIFsgZG5sIE1ha2UgYSBwcm9ncmFtIHRvIHByaW50IExVQV9WRVJTSU9OIGRlZmluZWQgaW4gdGhlIGhlYWRlci4KKyAgICAgIGRubCBUT0RPIEl0IHdvdWxkIGJlIHJlYWxseSBuaWNlIGlmIHdlIGNvdWxkIGRvIHRoaXMgd2l0aG91dCBjb21waWxpbmcgYQorICAgICAgZG5sIHByb2dyYW0sIHRoZW4gaXQgd291bGQgd29yayB3aGVuIGNyb3NzIGNvbXBpbGluZy4gQnV0IEknbSBub3Qgc3VyZSBob3cKKyAgICAgIGRubCB0byBkbyB0aGlzIHJlbGlhYmx5LiBGb3Igbm93LCBhc3N1bWUgdmVyc2lvbnMgbWF0Y2ggd2hlbiBjcm9zcyBjb21waWxpbmcuCisKKyAgICAgIEFTX0lGKFt0ZXN0ICJ4JGNyb3NzX2NvbXBpbGluZyIgIT0gJ3h5ZXMnXSwKKyAgICAgICAgWyBBQ19DQUNIRV9DSEVDSyhbZm9yIEx1YSBoZWFkZXIgdmVyc2lvbl0sCisgICAgICAgICAgICBbYXhfY3ZfbHVhX2hlYWRlcl92ZXJzaW9uXSwKKyAgICAgICAgICAgIFsgX2F4X2x1YV9zYXZlZF9jcHBmbGFncz0kQ1BQRkxBR1MKKyAgICAgICAgICAgICAgQ1BQRkxBR1M9IiRDUFBGTEFHUyAkTFVBX0lOQ0xVREUiCisgICAgICAgICAgICAgIEFDX1JVTl9JRkVMU0UoCisgICAgICAgICAgICAgICAgWyBBQ19MQU5HX1NPVVJDRShbWworI2luY2x1ZGUgPGx1YS5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKiBhcmd2KQoreworICBpZihhcmdjID4gMSkgcHJpbnRmKCIlcyIsIExVQV9WRVJTSU9OKTsKKyAgZXhpdChFWElUX1NVQ0NFU1MpOworfQorXV0pCisgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgICBbIGF4X2N2X2x1YV9oZWFkZXJfdmVyc2lvbj1gLi9jb25mdGVzdCRFWEVFWFQgcCB8IFwKKyAgICAgICAgICAgICAgICAgICAgJFNFRCAtbiAic3xeTHVhIFwoQDw6QDAtOUA6PkBcezEsXH1cLkA8OkAwLTlAOj5AXHsxLFx9XCkuXHswLFx9fFwxfHAiYAorICAgICAgICAgICAgICAgIF0sCisgICAgICAgICAgICAgICAgW2F4X2N2X2x1YV9oZWFkZXJfdmVyc2lvbj0ndW5rbm93biddKQorICAgICAgICAgICAgICBDUFBGTEFHUz0kX2F4X2x1YV9zYXZlZF9jcHBmbGFncworICAgICAgICAgICAgXSkKKworICAgICAgICAgIGRubCBDb21wYXJlIHRoaXMgdG8gdGhlIHByZXZpb3VzbHkgZm91bmQgTFVBX1ZFUlNJT04uCisgICAgICAgICAgQUNfTVNHX0NIRUNLSU5HKFtpZiBMdWEgaGVhZGVyIHZlcnNpb24gbWF0Y2hlcyAkTFVBX1ZFUlNJT05dKQorICAgICAgICAgIEFTX0lGKFt0ZXN0ICJ4JGF4X2N2X2x1YV9oZWFkZXJfdmVyc2lvbiIgPSAieCRMVUFfVkVSU0lPTiJdLAorICAgICAgICAgICAgWyBBQ19NU0dfUkVTVUxUKFt5ZXNdKQorICAgICAgICAgICAgICBheF9oZWFkZXJfdmVyc2lvbl9tYXRjaD0neWVzJworICAgICAgICAgICAgXSwKKyAgICAgICAgICAgIFsgQUNfTVNHX1JFU1VMVChbbm9dKQorICAgICAgICAgICAgICBheF9oZWFkZXJfdmVyc2lvbl9tYXRjaD0nbm8nCisgICAgICAgICAgICBdKQorICAgICAgICBdLAorICAgICAgICBbIEFDX01TR19XQVJOKFtjcm9zcyBjb21waWxpbmcgc28gYXNzdW1pbmcgaGVhZGVyIHZlcnNpb24gbnVtYmVyIG1hdGNoZXNdKQorICAgICAgICAgIGF4X2hlYWRlcl92ZXJzaW9uX21hdGNoPSd5ZXMnCisgICAgICAgIF0pCisgICAgXSkKKworICBkbmwgV2FzIExVQV9JTkNMVURFIHNwZWNpZmllZD8KKyAgQVNfSUYoW3Rlc3QgIngkYXhfaGVhZGVyX3ZlcnNpb25fbWF0Y2giICE9ICd4eWVzJyAmJgorICAgICAgICAgdGVzdCAieCRMVUFfSU5DTFVERSIgIT0gJ3gnXSwKKyAgICBbQUNfTVNHX0VSUk9SKFtjYW5ub3QgZmluZCBoZWFkZXJzIGZvciBzcGVjaWZpZWQgTFVBX0lOQ0xVREVdKV0pCisKKyAgZG5sIFRlc3QgdGhlIGZpbmFsIHJlc3VsdCBhbmQgcnVuIHVzZXIgY29kZS4KKyAgQVNfSUYoW3Rlc3QgIngkYXhfaGVhZGVyX3ZlcnNpb25fbWF0Y2giID0gJ3h5ZXMnXSwgWyQxXSwKKyAgICBbbTRfZGVmYXVsdChbJDJdLCBbQUNfTVNHX0VSUk9SKFtjYW5ub3QgZmluZCBMdWEgaW5jbHVkZXNdKV0pXSkKK10pCisKK2RubCBBWF9MVUFfSEVBREVSU19WRVJTSU9OIG5vIGxvbmdlciBleGlzdHMsIHVzZSBBWF9MVUFfSEVBREVSUy4KK0FDX0RFRlVOKFtBWF9MVUFfSEVBREVSU19WRVJTSU9OXSwKK1sKKyAgQUNfTVNHX1dBUk4oW1skMCBpcyBkZXByZWNhdGVkLCBwbGVhc2UgdXNlIEFYX0xVQV9IRUFERVJTIGluc3RlYWRdXSkKK10pCisKKworZG5sID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK2RubCBBWF9MVUFfTElCUyhbQUNUSU9OLUlGLUZPVU5EXSwgW0FDVElPTi1JRi1OT1QtRk9VTkRdKQorZG5sID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0FDX0RFRlVOKFtBWF9MVUFfTElCU10sCitbCisgIGRubCBUT0RPIFNob3VsZCB0aGlzIG1hY3JvIGFsc28gY2hlY2sgdmFyaW91cyAtTCBmbGFncz8KKworICBkbmwgQ2hlY2sgZm9yIExVQV9WRVJTSU9OLgorICBBQ19NU0dfQ0hFQ0tJTkcoW2lmIExVQV9WRVJTSU9OIGlzIGRlZmluZWRdKQorICBBU19JRihbdGVzdCAieCRMVUFfVkVSU0lPTiIgIT0gJ3gnXSwKKyAgICBbQUNfTVNHX1JFU1VMVChbeWVzXSldLAorICAgIFsgQUNfTVNHX1JFU1VMVChbbm9dKQorICAgICAgQUNfTVNHX0VSUk9SKFtjYW5ub3QgY2hlY2sgTHVhIGxpYnMgd2l0aG91dCBrbm93aW5nIExVQV9WRVJTSU9OXSkKKyAgICBdKQorCisgIGRubCBNYWtlIExVQV9MSUIgYSBwcmVjaW91cyB2YXJpYWJsZS4KKyAgQUNfQVJHX1ZBUihbTFVBX0xJQl0sIFtUaGUgTHVhIGxpYnJhcnksIGUuZy4gLWxsdWE1LjFdKQorCisgIEFTX0lGKFt0ZXN0ICJ4JExVQV9MSUIiICE9ICd4J10sCisgIFsgZG5sIENoZWNrIHRoYXQgTFVBX0xJQlMgd29ya3MuCisgICAgX2F4X2x1YV9zYXZlZF9saWJzPSRMSUJTCisgICAgTElCUz0iJExJQlMgJExVQV9MSUIiCisgICAgQUNfU0VBUkNIX0xJQlMoW2x1YV9sb2FkXSwgW10sCisgICAgICBbX2F4X2ZvdW5kX2x1YV9saWJzPSd5ZXMnXSwKKyAgICAgIFtfYXhfZm91bmRfbHVhX2xpYnM9J25vJ10pCisgICAgTElCUz0kX2F4X2x1YV9zYXZlZF9saWJzCisKKyAgICBkbmwgQ2hlY2sgdGhlIHJlc3VsdC4KKyAgICBBU19JRihbdGVzdCAieCRfYXhfZm91bmRfbHVhX2xpYnMiICE9ICd4eWVzJ10sCisgICAgICBbQUNfTVNHX0VSUk9SKFtjYW5ub3QgZmluZCBsaWJzIGZvciBzcGVjaWZpZWQgTFVBX0xJQl0pXSkKKyAgXSwKKyAgWyBkbmwgRmlyc3Qgc2VhcmNoIGZvciBleHRyYSBsaWJzLgorICAgIF9heF9sdWFfZXh0cmFfbGlicz0nJworCisgICAgX2F4X2x1YV9zYXZlZF9saWJzPSRMSUJTCisgICAgTElCUz0iJExJQlMgJExVQV9MSUIiCisgICAgQUNfU0VBUkNIX0xJQlMoW2V4cF0sIFttXSkKKyAgICBBQ19TRUFSQ0hfTElCUyhbZGxvcGVuXSwgW2RsXSkKKyAgICBMSUJTPSRfYXhfbHVhX3NhdmVkX2xpYnMKKworICAgIEFTX0lGKFt0ZXN0ICJ4JGFjX2N2X3NlYXJjaF9leHAiICE9ICd4bm8nICYmCisgICAgICAgICAgIHRlc3QgIngkYWNfY3Zfc2VhcmNoX2V4cCIgIT0gJ3hub25lIHJlcXVpcmVkJ10sCisgICAgICBbX2F4X2x1YV9leHRyYV9saWJzPSIkX2F4X2x1YV9leHRyYV9saWJzICRhY19jdl9zZWFyY2hfZXhwIl0pCisKKyAgICBBU19JRihbdGVzdCAieCRhY19jdl9zZWFyY2hfZGxvcGVuIiAhPSAneG5vJyAmJgorICAgICAgICAgICB0ZXN0ICJ4JGFjX2N2X3NlYXJjaF9kbG9wZW4iICE9ICd4bm9uZSByZXF1aXJlZCddLAorICAgICAgW19heF9sdWFfZXh0cmFfbGlicz0iJF9heF9sdWFfZXh0cmFfbGlicyAkYWNfY3Zfc2VhcmNoX2Rsb3BlbiJdKQorCisgICAgZG5sIFRyeSB0byBmaW5kIHRoZSBMdWEgbGlicy4KKyAgICBfYXhfbHVhX3NhdmVkX2xpYnM9JExJQlMKKyAgICBMSUJTPSIkTElCUyAkTFVBX0xJQiIKKyAgICBBQ19TRUFSQ0hfTElCUyhbbHVhX2xvYWRdLAorICAgICAgWyBsdWEkTFVBX1ZFUlNJT04gXAorICAgICAgICBsdWEkTFVBX1NIT1JUX1ZFUlNJT04gXAorICAgICAgICBsdWEtJExVQV9WRVJTSU9OIFwKKyAgICAgICAgbHVhLSRMVUFfU0hPUlRfVkVSU0lPTiBcCisgICAgICAgIGx1YSBcCisgICAgICBdLAorICAgICAgW19heF9mb3VuZF9sdWFfbGlicz0neWVzJ10sCisgICAgICBbX2F4X2ZvdW5kX2x1YV9saWJzPSdubyddLAorICAgICAgWyRfYXhfbHVhX2V4dHJhX2xpYnNdKQorICAgIExJQlM9JF9heF9sdWFfc2F2ZWRfbGlicworCisgICAgQVNfSUYoW3Rlc3QgIngkYWNfY3Zfc2VhcmNoX2x1YV9sb2FkIiAhPSAneG5vJyAmJgorICAgICAgICAgICB0ZXN0ICJ4JGFjX2N2X3NlYXJjaF9sdWFfbG9hZCIgIT0gJ3hub25lIHJlcXVpcmVkJ10sCisgICAgICBbTFVBX0xJQj0iJGFjX2N2X3NlYXJjaF9sdWFfbG9hZCAkX2F4X2x1YV9leHRyYV9saWJzIl0pCisgIF0pCisKKyAgZG5sIFRlc3QgdGhlIHJlc3VsdCBhbmQgcnVuIHVzZXIgY29kZS4KKyAgQVNfSUYoW3Rlc3QgIngkX2F4X2ZvdW5kX2x1YV9saWJzIiA9ICd4eWVzJ10sIFskMV0sCisgICAgW200X2RlZmF1bHQoWyQyXSwgW0FDX01TR19FUlJPUihbY2Fubm90IGZpbmQgTHVhIGxpYnNdKV0pXSkKK10pCisKKworZG5sID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK2RubCBBWF9MVUFfUkVBRExJTkUoW0FDVElPTi1JRi1GT1VORF0sIFtBQ1RJT04tSUYtTk9ULUZPVU5EXSkKK2RubCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitBQ19ERUZVTihbQVhfTFVBX1JFQURMSU5FXSwKK1sKKyAgQVhfTElCX1JFQURMSU5FCisgIEFTX0lGKFt0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9yZWFkbGluZV9yZWFkbGluZV9oIiAhPSAneCcgJiYKKyAgICAgICAgIHRlc3QgIngkYWNfY3ZfaGVhZGVyX3JlYWRsaW5lX2hpc3RvcnlfaCIgIT0gJ3gnXSwKKyAgICBbIExVQV9MSUJTX0NGTEFHUz0iLURMVUFfVVNFX1JFQURMSU5FICRMVUFfTElCU19DRkxBR1MiCisgICAgICAkMQorICAgIF0sCisgICAgWyQyXSkKK10pCmRpZmYgLS1naXQgYS9hY2xvY2FsL2F4X3Byb2dfZG90bmV0Y29yZV92ZXJzaW9uLm00IGIvYWNsb2NhbC9heF9wcm9nX2RvdG5ldGNvcmVfdmVyc2lvbi5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmM3NDk1Ci0tLSAvZGV2L251bGwKKysrIGIvYWNsb2NhbC9heF9wcm9nX2RvdG5ldGNvcmVfdmVyc2lvbi5tNApAQCAtMCwwICsxLDYxIEBACisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvYXV0b2NvbmYtYXJjaGl2ZS9heF9wcm9nX2RvdG5ldGNvcmVfdmVyc2lvbi5odG1sCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgU1lOT1BTSVMKKyMKKyMgICBBWF9QUk9HX0RPVE5FVENPUkVfVkVSU0lPTihbVkVSU0lPTl0sW0FDVElPTi1JRi1UUlVFXSxbQUNUSU9OLUlGLUZBTFNFXSkKKyMKKyMgREVTQ1JJUFRJT04KKyMKKyMgICBNYWtlcyBzdXJlIHRoYXQgLk5FVCBDb3JlIHN1cHBvcnRzIHRoZSB2ZXJzaW9uIGluZGljYXRlZC4gSWYgdHJ1ZSB0aGUKKyMgICBzaGVsbCBjb21tYW5kcyBpbiBBQ1RJT04tSUYtVFJVRSBhcmUgZXhlY3V0ZWQuIElmIG5vdCB0aGUgc2hlbGwgY29tbWFuZHMKKyMgICBpbiBBQ1RJT04tSUYtRkFMU0UgYXJlIHJ1bi4gVGhlICRkb3RuZXRjb3JlX3ZlcnNpb24gdmFyaWFibGUgd2lsbCBiZQorIyAgIGZpbGxlZCB3aXRoIHRoZSBkZXRlY3RlZCB2ZXJzaW9uLgorIworIyAgIFRoaXMgbWFjcm8gdXNlcyB0aGUgJERPVE5FVENPUkUgdmFyaWFibGUgdG8gcGVyZm9ybSB0aGUgY2hlY2suIElmCisjICAgJERPVE5FVENPUkUgaXMgbm90IHNldCBwcmlvciB0byBjYWxsaW5nIHRoaXMgbWFjcm8sIHRoZSBtYWNybyB3aWxsIGZhaWwuCisjCisjICAgRXhhbXBsZToKKyMKKyMgICAgIEFDX1BBVEhfUFJPRyhbRE9UTkVUQ09SRV0sW2RvdG5ldF0pCisjICAgICBBQ19QUk9HX0RPVE5FVENPUkVfVkVSU0lPTihbMS4wLjJdLFsgLi4uIF0sWyAuLi4gXSkKKyMKKyMgICBTZWFyY2hlcyBmb3IgLk5FVCBDb3JlLCB0aGVuIGNoZWNrcyBpZiBhdCBsZWFzdCB2ZXJzaW9uIDEuMC4yIGlzCisjICAgcHJlc2VudC4KKyMKKyMgTElDRU5TRQorIworIyAgIENvcHlyaWdodCAoYykgMjAxNiBKZW5zIEdleWVyIDxqZW5zZ0BhcGFjaGUub3JnPgorIworIyAgIENvcHlpbmcgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGlzIGZpbGUsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZQorIyAgIHBlcm1pdHRlZCBpbiBhbnkgbWVkaXVtIHdpdGhvdXQgcm95YWx0eSBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZQorIyAgIGFuZCB0aGlzIG5vdGljZSBhcmUgcHJlc2VydmVkLiBUaGlzIGZpbGUgaXMgb2ZmZXJlZCBhcy1pcywgd2l0aG91dCBhbnkKKyMgICB3YXJyYW50eS4KKworI3NlcmlhbCAyCisKK0FDX0RFRlVOKFtBWF9QUk9HX0RPVE5FVENPUkVfVkVSU0lPTl0sWworICAgIEFDX1JFUVVJUkUoW0FDX1BST0dfU0VEXSkKKworICAgIEFTX0lGKFt0ZXN0IC1uICIkRE9UTkVUQ09SRSJdLFsKKyAgICAgICAgYXhfZG90bmV0Y29yZV92ZXJzaW9uPSIkMSIKKworICAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciAuTkVUIENvcmUgdmVyc2lvbl0pCisgICAgICAgIGRvdG5ldGNvcmVfdmVyc2lvbj1gJERPVE5FVENPUkUgLS12ZXJzaW9uIDI+JjEgfCAkU0VEIC1lICdzL1woQDw6QDAtOUA6PkAqXC5APDpAMC05QDo+QCpcLkA8OkAwLTlAOj5AKlwpXCguKlwpL1wxLydgCisgICAgICAgIEFDX01TR19SRVNVTFQoJGRvdG5ldGNvcmVfdmVyc2lvbikKKworCSAgICBBQ19TVUJTVChbRE9UTkVUQ09SRV9WRVJTSU9OXSxbJGRvdG5ldGNvcmVfdmVyc2lvbl0pCisKKyAgICAgICAgQVhfQ09NUEFSRV9WRVJTSU9OKFskYXhfZG90bmV0Y29yZV92ZXJzaW9uXSxbbGVdLFskZG90bmV0Y29yZV92ZXJzaW9uXSxbCisJICAgIDoKKyAgICAgICAgICAgICQyCisgICAgICAgIF0sWworCSAgICA6CisgICAgICAgICAgICAkMworICAgICAgICBdKQorICAgIF0sWworICAgICAgICBBQ19NU0dfV0FSTihbY291bGQgbm90IGZpbmQgLk5FVCBDb3JlXSkKKyAgICAgICAgJDMKKyAgICBdKQorXSkKZGlmZiAtLWdpdCBhL2FjbG9jYWwvYXhfcHJvZ19oYXhlX3ZlcnNpb24ubTQgYi9hY2xvY2FsL2F4X3Byb2dfaGF4ZV92ZXJzaW9uLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjYWNjNjcKLS0tIC9kZXYvbnVsbAorKysgYi9hY2xvY2FsL2F4X3Byb2dfaGF4ZV92ZXJzaW9uLm00CkBAIC0wLDAgKzEsNjAgQEAKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9hdXRvY29uZi1hcmNoaXZlL2F4X3Byb2dfaGF4ZV92ZXJzaW9uLmh0bWwKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjIFNZTk9QU0lTCisjCisjICAgQVhfUFJPR19IQVhFX1ZFUlNJT04oW1ZFUlNJT05dLFtBQ1RJT04tSUYtVFJVRV0sW0FDVElPTi1JRi1GQUxTRV0pCisjCisjIERFU0NSSVBUSU9OCisjCisjICAgTWFrZXMgc3VyZSB0aGF0IGhheGUgc3VwcG9ydHMgdGhlIHZlcnNpb24gaW5kaWNhdGVkLiBJZiB0cnVlIHRoZSBzaGVsbAorIyAgIGNvbW1hbmRzIGluIEFDVElPTi1JRi1UUlVFIGFyZSBleGVjdXRlZC4gSWYgbm90IHRoZSBzaGVsbCBjb21tYW5kcyBpbgorIyAgIEFDVElPTi1JRi1GQUxTRSBhcmUgcnVuLiBUaGUgJEhBWEVfVkVSU0lPTiB2YXJpYWJsZSB3aWxsIGJlIGZpbGxlZCB3aXRoCisjICAgdGhlIGRldGVjdGVkIHZlcnNpb24uCisjCisjICAgVGhpcyBtYWNybyB1c2VzIHRoZSAkSEFYRSB2YXJpYWJsZSB0byBwZXJmb3JtIHRoZSBjaGVjay4gSWYgJEhBWEUgaXMgbm90CisjICAgc2V0IHByaW9yIHRvIGNhbGxpbmcgdGhpcyBtYWNybywgdGhlIG1hY3JvIHdpbGwgZmFpbC4KKyMKKyMgICBFeGFtcGxlOgorIworIyAgICAgQUNfUEFUSF9QUk9HKFtIQVhFXSxbaGF4ZV0pCisjICAgICBBQ19QUk9HX0hBWEVfVkVSU0lPTihbMy4xLjNdLFsgLi4uIF0sWyAuLi4gXSkKKyMKKyMgICBTZWFyY2hlcyBmb3IgSGF4ZSwgdGhlbiBjaGVja3MgaWYgYXQgbGVhc3QgdmVyc2lvbiAzLjEuMyBpcyBwcmVzZW50LgorIworIyBMSUNFTlNFCisjCisjICAgQ29weXJpZ2h0IChjKSAyMDE1IEplbnMgR2V5ZXIgPGplbnNnQGFwYWNoZS5vcmc+CisjCisjICAgQ29weWluZyBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoaXMgZmlsZSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlCisjICAgcGVybWl0dGVkIGluIGFueSBtZWRpdW0gd2l0aG91dCByb3lhbHR5IHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlCisjICAgYW5kIHRoaXMgbm90aWNlIGFyZSBwcmVzZXJ2ZWQuIFRoaXMgZmlsZSBpcyBvZmZlcmVkIGFzLWlzLCB3aXRob3V0IGFueQorIyAgIHdhcnJhbnR5LgorCisjc2VyaWFsIDIKKworQUNfREVGVU4oW0FYX1BST0dfSEFYRV9WRVJTSU9OXSxbCisgICAgQUNfUkVRVUlSRShbQUNfUFJPR19TRURdKQorCisgICAgQVNfSUYoW3Rlc3QgLW4gIiRIQVhFIl0sWworICAgICAgICBheF9oYXhlX3ZlcnNpb249IiQxIgorCisgICAgICAgIEFDX01TR19DSEVDS0lORyhbZm9yIGhheGUgdmVyc2lvbl0pCisgICAgICAgIGhheGVfdmVyc2lvbj1gJEhBWEUgLXZlcnNpb24gMj4mMSB8ICRTRUQgLWUgJ3MvXi4qIFwoIEA8OkAwLTlAOj5AKlwuQDw6QDAtOUA6PkAqXC5APDpAMC05QDo+QCpcKSAuKi9cMS8nYAorICAgICAgICBBQ19NU0dfUkVTVUxUKCRoYXhlX3ZlcnNpb24pCisKKwkgICAgQUNfU1VCU1QoW0hBWEVfVkVSU0lPTl0sWyRoYXhlX3ZlcnNpb25dKQorCisgICAgICAgIEFYX0NPTVBBUkVfVkVSU0lPTihbJGF4X2hheGVfdmVyc2lvbl0sW2xlXSxbJGhheGVfdmVyc2lvbl0sWworCSAgICA6CisgICAgICAgICAgICAkMgorICAgICAgICBdLFsKKwkgICAgOgorICAgICAgICAgICAgJDMKKyAgICAgICAgXSkKKyAgICBdLFsKKyAgICAgICAgQUNfTVNHX1dBUk4oW2NvdWxkIG5vdCBmaW5kIEhheGVdKQorICAgICAgICAkMworICAgIF0pCitdKQpkaWZmIC0tZ2l0IGEvYWNsb2NhbC9heF9wcm9nX3BlcmxfbW9kdWxlcy5tNCBiL2FjbG9jYWwvYXhfcHJvZ19wZXJsX21vZHVsZXMubTQKaW5kZXggMTFhMzI2Yy4uNzBiMzIzMCAxMDA2NDQKLS0tIGEvYWNsb2NhbC9heF9wcm9nX3BlcmxfbW9kdWxlcy5tNAorKysgYi9hY2xvY2FsL2F4X3Byb2dfcGVybF9tb2R1bGVzLm00CkBAIC0xLDUgKzEsNSBAQAogIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgICBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvYXV0b2NvbmYtYXJjaGl2ZS9heF9wcm9nX3BlcmxfbW9kdWxlcy5odG1sCisjICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9hdXRvY29uZi1hcmNoaXZlL2F4X3Byb2dfcGVybF9tb2R1bGVzLmh0bWwKICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAjCiAjIFNZTk9QU0lTCkBAIC0zMiw3ICszMiw3IEBACiAjICAgYW5kIHRoaXMgbm90aWNlIGFyZSBwcmVzZXJ2ZWQuIFRoaXMgZmlsZSBpcyBvZmZlcmVkIGFzLWlzLCB3aXRob3V0IGFueQogIyAgIHdhcnJhbnR5LgogCi0jc2VyaWFsIDcKKyNzZXJpYWwgOAogCiBBVV9BTElBUyhbQUNfUFJPR19QRVJMX01PRFVMRVNdLCBbQVhfUFJPR19QRVJMX01PRFVMRVNdKQogQUNfREVGVU4oW0FYX1BST0dfUEVSTF9NT0RVTEVTXSxbZG5sCmRpZmYgLS1naXQgYS9hcHB2ZXlvci55bWwgYi9hcHB2ZXlvci55bWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTAyMTQ3OQotLS0gL2Rldi9udWxsCisrKyBiL2FwcHZleW9yLnltbApAQCAtMCwwICsxLDExMCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMgYnVpbGQgQXBhY2hlIFRocmlmdCBvbiBBcHBWZXlvciAtIGh0dHBzOi8vY2kuYXBwdmV5b3IuY29tCisKK3ZlcnNpb246ICcxLjAuMC57YnVpbGR9JworCitzaGFsbG93X2Nsb25lOiB0cnVlCisKK29zOgorICAtIFZpc3VhbCBTdHVkaW8gMjAxNworCittYXRyaXg6CisgIGFsbG93X2ZhaWx1cmVzOgorICAgICAgLSBQUk9GSUxFOiBDWUdXSU4KKyAgZmFzdF9maW5pc2g6IHRydWUKKworZW52aXJvbm1lbnQ6CisgIG1hdHJpeDoKKyAgIC0gUFJPRklMRTogTVNWQzIwMTcKKyAgICAgUExBVEZPUk06IHg2NAorICAgICBDT05GSUdVUkFUSU9OOiBSZWxlYXNlCisgICAgIEJPT1NUX1ZFUlNJT046IDEuNjUuMQorICAgICBMSUJFVkVOVF9WRVJTSU9OOiAyLjEuOAorICAgICBQWVRIT05fVkVSU0lPTjogMy42CisgICAgIFFUX1ZFUlNJT046IDUuMTAKKyAgICAgWkxJQl9WRVJTSU9OOiAxLjIuMTEKKyAgICAgRElTQUJMRURfVEVTVFM6IFN0cmVzc1Rlc3ROb25CbG9ja2luZworCisgICAtIFBST0ZJTEU6IE1TVkMyMDEzCisgICAgIFBMQVRGT1JNOiB4ODYKKyAgICAgQ09ORklHVVJBVElPTjogUmVsZWFzZQorICAgICBCT09TVF9WRVJTSU9OOiAxLjU4LjAKKyAgICAgTElCRVZFTlRfVkVSU0lPTjogMi4wLjIyCisgICAgIFBZVEhPTl9WRVJTSU9OOiAzLjUKKyAgICAgUVRfVkVSU0lPTjogNS44CisgICAgIFpMSUJfVkVSU0lPTjogMS4yLjgKKyAgICAgRElTQUJMRURfVEVTVFM6IFN0cmVzc1Rlc3ROb25CbG9ja2luZworICAgICBBUFBWRVlPUl9CVUlMRF9XT1JLRVJfSU1BR0U6IFZpc3VhbCBTdHVkaW8gMjAxNQorCisgICAtIFBST0ZJTEU6IE1JTkdXCisgICAgIFBMQVRGT1JNOiB4NjQKKyAgICAgQ09ORklHVVJBVElPTjogUmVsV2l0aERlYkluZm8KKyAgICAgRElTQUJMRURfVEVTVFM6IFN0cmVzc1Rlc3ROb25CbG9ja2luZworCisgICAtIFBST0ZJTEU6IENZR1dJTgorICAgICBQTEFURk9STTogeDg2CisgICAgIENPTkZJR1VSQVRJT046IFJlbFdpdGhEZWJJbmZvCisgICAgIERJU0FCTEVEX1RFU1RTOiAoWmxpYlRlc3R8T3BlblNTTE1hbnVhbEluaXRUZXN0fFROb25ibG9ja2luZ1NlcnZlclRlc3R8U3RyZXNzVGVzdE5vbkJsb2NraW5nKQorCisjICAtIFBST0ZJTEU6IENZR1dJTgorIyAgICBQTEFURk9STTogeDY0CisjICAgIENPTkZJR1VSQVRJT046IFJlbFdpdGhEZWJJbmZvCisjICAgIERJU0FCTEVEX1RFU1RTOiAoWmxpYlRlc3R8T3BlblNTTE1hbnVhbEluaXRUZXN0fFROb25ibG9ja2luZ1NlcnZlclRlc3R8U3RyZXNzVGVzdE5vbkJsb2NraW5nKQorCitpbnN0YWxsOgorICAtIGNkICVBUFBWRVlPUl9CVUlMRF9GT0xERVIlCisgIC0gY2FsbCBidWlsZFxhcHB2ZXlvclwlUFJPRklMRTp+MCw0JS1hcHB2ZXlvci1pbnN0YWxsLmJhdAorICAtIHJlZnJlc2hlbnYKKworYnVpbGRfc2NyaXB0OgorICAtIGNkICVBUFBWRVlPUl9CVUlMRF9GT0xERVIlCisgIC0gY2FsbCBidWlsZFxhcHB2ZXlvclwlUFJPRklMRTp+MCw0JS1hcHB2ZXlvci1idWlsZC5iYXQKKwordGVzdF9zY3JpcHQ6CisgIC0gY2QgJUFQUFZFWU9SX0JVSUxEX0ZPTERFUiUKKyAgLSBjYWxsIGJ1aWxkXGFwcHZleW9yXCVQUk9GSUxFOn4wLDQlLWFwcHZleW9yLXRlc3QuYmF0CisKKworIyBhcnRpZmFjdCBjYXB0dXJlIGRpc2FibGVkIGFzIGl0IG1pZ2h0IGluY3JlYXNlIHNlcnZpY2UgY29zdCBmb3IgbGl0dGxlIGdhaW46CisjCisjIGFydGlmYWN0czoKKyMgIC0gcGF0aDogbG9jYWwtdGhyaWZ0LWluc3QKKyMgICAgbmFtZTogY21ha2UgaW5zdGFsbGVkIGNvbnRlbnQKKyMgICAgdHlwZTogemlwCisjCisjICAtIHBhdGg6IGxvY2FsLXRocmlmdC1idWlsZFxUZXN0aW5nCisjICAgIG5hbWU6IGN0ZXN0IG91dHB1dAorIyAgICB0eXBlOiB6aXAKKworIyBSRFAgc3VwcG9ydDogdXNlIG9uZSBvciB0aGUgb3RoZXIuLi4KKyMKKyMgZW5hYmxlcyBSRFAgZm9yIGVhY2ggYnVpbGQgam9iIHNvIHlvdSBjYW4gaW5zcGVjdCB0aGUgZW52aXJvbm1lbnQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgam9iOgorIyBpbml0OgorIyAgLSBwczogaWV4ICgobmV3LW9iamVjdCBuZXQud2ViY2xpZW50KS5Eb3dubG9hZFN0cmluZygnaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2FwcHZleW9yL2NpL21hc3Rlci9zY3JpcHRzL2VuYWJsZS1yZHAucHMxJykpCisjCisjIGVuYWJsZXMgUkRQIGF0IHRoZSBlbmQgb2YgdGhlIGJ1aWxkIGpvYiBzbyB5b3UgY2FuIGxvZ2luIGFuZCByZS1ydW4KKyMgY29tbWFuZHMgdG8gc2VlIHdoeSBzb21ldGhpbmcgZmFpbGVkLi4uCisjb25fZmluaXNoOgorIyAgLSBwczogJGJsb2NrUmRwID0gJHRydWU7IGlleCAoKG5ldy1vYmplY3QgbmV0LndlYmNsaWVudCkuRG93bmxvYWRTdHJpbmcoJ2h0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9hcHB2ZXlvci9jaS9tYXN0ZXIvc2NyaXB0cy9lbmFibGUtcmRwLnBzMScpKQorIworIyBhbHNvIG5lZWQ6CisjIGVudmlyb25tZW50OgorIyAgIEFQUFZFWU9SX1JEUF9QQVNTV09SRDogdGhyMUZUMjM0NSR4eXpaCmRpZmYgLS1naXQgYS9ib290c3RyYXAuc2ggYi9ib290c3RyYXAuc2gKaW5kZXggMGMyYjg4Ni4uMjQ1MmVlYSAxMDA3NTUKLS0tIGEvYm9vdHN0cmFwLnNoCisrKyBiL2Jvb3RzdHJhcC5zaApAQCAtMzgsOSArMzgsMjQgQEAKICAgZXhpdCAxCiBmaQogCitmb3JtYXRfdmVyc2lvbiAoKSB7CisgICAgcHJpbnRmICIlMDNkJTAzZCUwM2QlMDNkIiAkKGVjaG8gJDEgfCB0ciAnLicgJyAnKTsKK30KKworIyB3ZSByZXF1aXJlIGF1dG9tYWtlIDEuMTMgb3IgbGF0ZXIKKyMgY2hlY2sgbXVzdCBoYXBwZW4gZXh0ZXJuYWxseSBkdWUgdG8gdXNlIG9mIG5ld2VyIG1hY3JvCitBVVRPTUFLRV9WRVJTSU9OPWBhdXRvbWFrZSAtLXZlcnNpb24gfCBncmVwIGF1dG9tYWtlIHwgZWdyZXAgLW8gJyhbMC05XXsxLH1cLikrWzAtOV17MSx9J2AKK2lmICBbICQoZm9ybWF0X3ZlcnNpb24gJEFVVE9NQUtFX1ZFUlNJT04pIC1sdCAkKGZvcm1hdF92ZXJzaW9uIDEuMTMpIF07IHRoZW4KKyAgZWNobyA+JjIgImF1dG9tYWtlIHZlcnNpb24gJEFVVE9NQUtFX1ZFUlNJT04gaXMgdG9vIG9sZCAobmVlZCAxLjEzIG9yIGxhdGVyKSIKKyAgZXhpdCAxCitmaQorCitzZXQgLWUKIGF1dG9zY2FuCiAkTElCVE9PTElaRSAtLWNvcHkgLS1hdXRvbWFrZQogYWNsb2NhbCAtSSAuL2FjbG9jYWwKIGF1dG9oZWFkZXIKK3NlZCAnL3VuZGVmIFZFUlNJT04vZCcgY29uZmlnLmhpbiA+IGNvbmZpZy5oaW4yCittdiBjb25maWcuaGluMiBjb25maWcuaGluCiBhdXRvY29uZgogYXV0b21ha2UgLS1jb3B5IC0tYWRkLW1pc3NpbmcgLS1mb3JlaWduCmRpZmYgLS1naXQgYS9ib3dlci5qc29uIGIvYm93ZXIuanNvbgppbmRleCBlYmU3OWZhLi44NTNiOGNiIDEwMDY0NAotLS0gYS9ib3dlci5qc29uCisrKyBiL2Jvd2VyLmpzb24KQEAgLTEsMTYgKzEsMTUgQEAKIHsKICAgIm5hbWUiOiAidGhyaWZ0IiwKLSAgInZlcnNpb24iOiAiMC45LjIiLAotICAiaG9tZXBhZ2UiOiAiaHR0cHM6Ly9naXQtd2lwLXVzLmFwYWNoZS5vcmcvcmVwb3MvYXNmL3RocmlmdC5naXQiLAorICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICJob21lcGFnZSI6ICJodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC5naXQiLAogICAiYXV0aG9ycyI6IFsKICAgICAiQXBhY2hlIFRocmlmdCA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPiIKICAgXSwKICAgImRlc2NyaXB0aW9uIjogIkFwYWNoZSBUaHJpZnQiLAotICAibWFpbiI6ICJsaWIvanMvdGhyaWZ0LmpzIiwKKyAgIm1haW4iOiAibGliL2pzL3NyYy90aHJpZnQuanMiLAogICAia2V5d29yZHMiOiBbCiAgICAgInRocmlmdCIKICAgXSwKICAgImxpY2Vuc2UiOiAiQXBhY2hlIHYyIiwKLSAgImlnbm9yZSI6IFsKLSAgXQorICAiaWdub3JlIjogW10KIH0KZGlmZiAtLWdpdCBhL2J1aWxkL2FwcHZleW9yL0NZR1ctYXBwdmV5b3ItYnVpbGQuYmF0IGIvYnVpbGQvYXBwdmV5b3IvQ1lHVy1hcHB2ZXlvci1idWlsZC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzIyNjIyMgotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL0NZR1ctYXBwdmV5b3ItYnVpbGQuYmF0CkBAIC0wLDAgKzEsMzYgQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjoKKzo6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzo6Cis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6CisKK0BFQ0hPIE9GRgorU0VUTE9DQUwgRW5hYmxlRGVsYXllZEV4cGFuc2lvbgorCitDRCBidWlsZFxhcHB2ZXlvciAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfYmFubmVyX2J1aWxkLmJhdCAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9zZXRlbnYuYmF0ICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCisKK1NFVCBDTUFLRUFSR1M9XgorICAtRyclR0VORVJBVE9SJScgXgorICAtRENNQUtFX0JVSUxEX1RZUEU9JUNPTkZJR1VSQVRJT04lIF4KKyAgLURDTUFLRV9JTlNUQUxMX1BSRUZJWD0lSU5TVERJUiUgXgorICAtRENNQUtFX0NYWF9FWFRFTlNJT05TPU9OIF4KKyAgLURDTUFLRV9DWFhfRkxBR1M9Ii1EX0dOVV9TT1VSQ0UiIF4KKyAgLURDTUFLRV9DWFhfU1RBTkRBUkQ9MTEgXgorICAtRFdJVEhfUFlUSE9OPU9GRiBeCisgIC1EV0lUSF9TSEFSRURfTElCPU9GRiBeCisgIC1EV0lUSF9TVEFUSUNfTElCPU9OIF4KKyAgLURXSVRIX1NURFRIUkVBRFM9T04KKworQEVDSE8gT04KKyVCQVNIJSAtbGMgIm1rZGlyIC1wICVCVUlMRERJUiUgJiYgY2QgJUJVSUxERElSJSAmJiBjbWFrZS5leGUgJVNSQ0RJUiUgJUNNQUtFQVJHUyUgJiYgY21ha2UgLS1idWlsZCAuIC0tY29uZmlnICVDT05GSUdVUkFUSU9OJSAtLXRhcmdldCBpbnN0YWxsIiB8fCBFWElUIC9CCitARUNITyBPRkYKZGlmZiAtLWdpdCBhL2J1aWxkL2FwcHZleW9yL0NZR1ctYXBwdmV5b3ItaW5zdGFsbC5iYXQgYi9idWlsZC9hcHB2ZXlvci9DWUdXLWFwcHZleW9yLWluc3RhbGwuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ZGI3ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9hcHB2ZXlvci9DWUdXLWFwcHZleW9yLWluc3RhbGwuYmF0CkBAIC0wLDAgKzEsMzQgQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjoKKzo6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzo6Cis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6CisKKzo6Cis6OiBBcHB2ZXlvciBpbnN0YWxsIHNjcmlwdCBmb3IgQ1lHV0lOCis6OiBJbnN0YWxscyB0aGlyZCBwYXJ0eSBwYWNrYWdlcyB3ZSBuZWVkIGZvciBhIGNtYWtlIGJ1aWxkCis6OgorCitARUNITyBPRkYKK1NFVExPQ0FMIEVuYWJsZURlbGF5ZWRFeHBhbnNpb24KKworQ0QgYnVpbGRcYXBwdmV5b3IgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfYmFubmVyX2luc3RhbGwuYmF0ICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCitDQUxMIGNsX3NldGVudi5iYXQgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9zaG93ZW52LmJhdCAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKKworOjoKKzo6IEluc3RhbGwgYXB0LWN5ZyBmb3IgcGFja2FnZSBtYW5hZ2VtZW50Cis6OgorCislQkFTSCUgLWxjICJ3Z2V0IHJhd2dpdC5jb20vdHJhbnNjb2RlLW9wZW4vYXB0LWN5Zy9tYXN0ZXIvYXB0LWN5ZyAmJiBpbnN0YWxsIGFwdC1jeWcgL2JpbiAmJiBybSAtZiBhcHQtY3lnIiB8fCBFWElUIC9CCislQkFTSCUgLWxjICJhcHQtY3lnIHVwZGF0ZSIgfHwgRVhJVCAvQgorJUJBU0glIC1sYyAiYXB0LWN5ZyBpbnN0YWxsIGJpc29uIGNtYWtlIGZsZXggZ2NjLWcrKyBsaWJib29zdC1kZXZlbCBsaWJldmVudC1kZXZlbCBtYWtlIG9wZW5zc2wtZGV2ZWwgemxpYi1kZXZlbCIKZGlmZiAtLWdpdCBhL2J1aWxkL2FwcHZleW9yL0NZR1ctYXBwdmV5b3ItdGVzdC5iYXQgYi9idWlsZC9hcHB2ZXlvci9DWUdXLWFwcHZleW9yLXRlc3QuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2NjdmOWIKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9hcHB2ZXlvci9DWUdXLWFwcHZleW9yLXRlc3QuYmF0CkBAIC0wLDAgKzEsMjEgQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjoKKzo6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzo6Cis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6CisKK0BFQ0hPIE9GRgorU0VUTE9DQUwgRW5hYmxlRGVsYXllZEV4cGFuc2lvbgorQ0QgYnVpbGRcYXBwdmV5b3IgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfYmFubmVyX3Rlc3QuYmF0ICAgICAgICB8fCBFWElUIC9CCitDQUxMIGNsX3NldGVudi5iYXQgICAgICAgICAgICAgfHwgRVhJVCAvQgorCislQkFTSCUgLWxjICJjZCAlQlVJTERESVIlICYmIGN0ZXN0LmV4ZSAtQyAlQ09ORklHVVJBVElPTiUgLS10aW1lb3V0IDMwMCAtVlYgLUUgJyVESVNBQkxFRF9URVNUUyUnIiB8fCBFWElUIC9CCmRpZmYgLS1naXQgYS9idWlsZC9hcHB2ZXlvci9NSU5HLWFwcHZleW9yLWJ1aWxkLmJhdCBiL2J1aWxkL2FwcHZleW9yL01JTkctYXBwdmV5b3ItYnVpbGQuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzN2E5NWEKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9hcHB2ZXlvci9NSU5HLWFwcHZleW9yLWJ1aWxkLmJhdApAQCAtMCwwICsxLDM2IEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6Cis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OgorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OgorCitARUNITyBPRkYKK1NFVExPQ0FMIEVuYWJsZURlbGF5ZWRFeHBhbnNpb24KKworQ0QgYnVpbGRcYXBwdmV5b3IgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCitDQUxMIGNsX2Jhbm5lcl9idWlsZC5iYXQgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfc2V0ZW52LmJhdCAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorCitTRVQgQ01BS0VBUkdTPV4KKyAgLUcnJUdFTkVSQVRPUiUnIF4KKyAgLURDTUFLRV9CVUlMRF9UWVBFPSVDT05GSUdVUkFUSU9OJSBeCisgIC1EQ01BS0VfSU5TVEFMTF9QUkVGSVg9JUlOU1RESVIlIF4KKyAgLURDTUFLRV9NQUtFX1BST0dSQU09L21pbmd3JU5PUk1fUExBVEZPUk0lL2Jpbi9taW5ndzMyLW1ha2UgXgorICAtRENNQUtFX0NfQ09NUElMRVI9L21pbmd3JU5PUk1fUExBVEZPUk0lL2Jpbi9nY2MuZXhlIF4KKyAgLURDTUFLRV9DWFhfQ09NUElMRVI9L21pbmd3JU5PUk1fUExBVEZPUk0lL2Jpbi9nKysuZXhlIF4KKyAgLURPUEVOU1NMX1JPT1RfRElSPS9taW5ndyVOT1JNX1BMQVRGT1JNJSBeCisgIC1EV0lUSF9QWVRIT049T0ZGIF4KKyAgLURXSVRIX1NIQVJFRF9MSUI9T0ZGIF4KKyAgLURXSVRIX1NUQVRJQ19MSUI9T04KKworQEVDSE8gT04KKyVCQVNIJSAtbGMgIm1rZGlyIC1wICVCVUlMRERJUiUgJiYgY2QgJUJVSUxERElSJSAmJiBjbWFrZS5leGUgJVNSQ0RJUiUgJUNNQUtFQVJHUyUgJiYgY21ha2UgLS1idWlsZCAuIC0tY29uZmlnICVDT05GSUdVUkFUSU9OJSAtLXRhcmdldCBpbnN0YWxsIiB8fCBFWElUIC9CCitARUNITyBPRkYKZGlmZiAtLWdpdCBhL2J1aWxkL2FwcHZleW9yL01JTkctYXBwdmV5b3ItaW5zdGFsbC5iYXQgYi9idWlsZC9hcHB2ZXlvci9NSU5HLWFwcHZleW9yLWluc3RhbGwuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwNjliMDUKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9hcHB2ZXlvci9NSU5HLWFwcHZleW9yLWluc3RhbGwuYmF0CkBAIC0wLDAgKzEsNDUgQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjoKKzo6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzo6Cis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6CisKKzo6Cis6OiBBcHB2ZXlvciBpbnN0YWxsIHNjcmlwdCBmb3IgTUlOR1cgb24gTVNZUzIKKzo6IEluc3RhbGxzIHRoaXJkIHBhcnR5IHBhY2thZ2VzIHdlIG5lZWQgZm9yIGEgY21ha2UgYnVpbGQKKzo6CisKK0BFQ0hPIE9GRgorU0VUTE9DQUwgRW5hYmxlRGVsYXllZEV4cGFuc2lvbgorCitDRCBidWlsZFxhcHB2ZXlvciAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9iYW5uZXJfaW5zdGFsbC5iYXQgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfc2V0ZW52LmJhdCAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCitDQUxMIGNsX3Nob3dlbnYuYmF0ICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorCitTRVQgUEFDS0FHRVM9XgorICAtLW5lZWRlZCAtUyBiaXNvbiBmbGV4IG1ha2UgXgorICBtaW5ndy13NjQtJU1JTkdXUExBVCUtYm9vc3QgXgorICBtaW5ndy13NjQtJU1JTkdXUExBVCUtY21ha2UgXgorICBtaW5ndy13NjQtJU1JTkdXUExBVCUtbGliZXZlbnQgXgorICBtaW5ndy13NjQtJU1JTkdXUExBVCUtb3BlbnNzbCBeCisgIG1pbmd3LXc2NC0lTUlOR1dQTEFUJS10b29sY2hhaW4gXgorICBtaW5ndy13NjQtJU1JTkdXUExBVCUtemxpYgorCis6Om1pbmd3LXc2NC0lTUlOR1dQTEFUJS1xdDUgOiBXQVkgdG9vIGxhcmdlICgxR0IgZG93bmxvYWQhKSAtIHRlc3RlZCBpbiBjeWd3aW4gYnVpbGRzIGFueXdheQorCis6OiBSZW1vdmUgb2xkIHBhY2thZ2VzIHRoYXQgbm8gbG9uZ2VyIGV4aXN0IHRvIGF2b2lkIGFuIGVycm9yCislQkFTSCUgLWxjICJwYWNtYW4gLS1ub2NvbmZpcm0gLS1yZW1vdmUgbGliY2F0Z2V0cyBjYXRnZXRzIHx8IHRydWUiIHx8IEVYSVQgL0IKKworOjogVXBncmFkZSB0aGluZ3MKKyVCQVNIJSAtbGMgInBhY21hbiAtLW5vY29uZmlybSAtU3l1ICVJR05PUkUlIiAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorJUJBU0glIC1sYyAicGFjbWFuIC0tbm9jb25maXJtIC1TdSAlSUdOT1JFJSIgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCislQkFTSCUgLWxjICJwYWNtYW4gLS1ub2NvbmZpcm0gJVBBQ0tBR0VTJSIgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idWlsZC9hcHB2ZXlvci9NSU5HLWFwcHZleW9yLXRlc3QuYmF0IGIvYnVpbGQvYXBwdmV5b3IvTUlORy1hcHB2ZXlvci10ZXN0LmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTljMWZmCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvYXBwdmV5b3IvTUlORy1hcHB2ZXlvci10ZXN0LmJhdApAQCAtMCwwICsxLDIyIEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6Cis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OgorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OgorCitARUNITyBPRkYKK1NFVExPQ0FMIEVuYWJsZURlbGF5ZWRFeHBhbnNpb24KKworQ0QgYnVpbGRcYXBwdmV5b3IgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfYmFubmVyX3Rlc3QuYmF0ICAgICAgICB8fCBFWElUIC9CCitDQUxMIGNsX3NldGVudi5iYXQgICAgICAgICAgICAgfHwgRVhJVCAvQgorCislQkFTSCUgLWxjICJjZCAlQlVJTERESVIlICYmIGN0ZXN0LmV4ZSAtQyAlQ09ORklHVVJBVElPTiUgLS10aW1lb3V0IDMwMCAtVlYgLUUgJyVESVNBQkxFRF9URVNUUyUnIiB8fCBFWElUIC9CCmRpZmYgLS1naXQgYS9idWlsZC9hcHB2ZXlvci9NU1ZDLWFwcHZleW9yLWJ1aWxkLmJhdCBiL2J1aWxkL2FwcHZleW9yL01TVkMtYXBwdmV5b3ItYnVpbGQuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0YjkyYTIKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9hcHB2ZXlvci9NU1ZDLWFwcHZleW9yLWJ1aWxkLmJhdApAQCAtMCwwICsxLDQ3IEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6Cis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OgorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OgorCitARUNITyBPRkYKK1NFVExPQ0FMIEVuYWJsZURlbGF5ZWRFeHBhbnNpb24KKworQ0QgYnVpbGRcYXBwdmV5b3IgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCitDQUxMIGNsX2Jhbm5lcl9idWlsZC5iYXQgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfc2V0ZW52LmJhdCAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorTUtESVIgIiVCVUlMRERJUiUiICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCitDRCAiJUJVSUxERElSJSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKKworQEVDSE8gT04KKyAgY21ha2UgIiVTUkNESVIlIiBeCisgICAgLUciJUdFTkVSQVRPUiUiIF4KKwktREJJU09OX0VYRUNVVEFCTEU9QzpcUHJvZ3JhbURhdGFcY2hvY29sYXRleVxsaWJcd2luZmxleGJpc29uM1x0b29sc1x3aW5fYmlzb24uZXhlIF4KKyAgICAtREJPT1NUX1JPT1Q9IiVCT09TVF9ST09UJSIgXgorICAgIC1EQk9PU1RfTElCUkFSWURJUj0iJUJPT1NUX0xJQlJBUllESVIlIiBeCisgICAgLURDTUFLRV9CVUlMRF9UWVBFPSIlQ09ORklHVVJBVElPTiUiIF4KKyAgICAtRENNQUtFX0lOU1RBTExfUFJFRklYPSIlSU5TVERJUiUiIF4KKwktREZMRVhfRVhFQ1VUQUJMRT1DOlxQcm9ncmFtRGF0YVxjaG9jb2xhdGV5XGxpYlx3aW5mbGV4Ymlzb24zXHRvb2xzXHdpbl9mbGV4LmV4ZSBeCisgICAgLURJTlRUWVBFU19ST09UPSIlV0lOM1AlXG1zaW50dHlwZXMiIF4KKyAgICAtRExJQkVWRU5UX1JPT1Q9IiVXSU4zUCVcbGliZXZlbnQtJUxJQkVWRU5UX1ZFUlNJT04lLXN0YWJsZSIgXgorICAgIC1ET1BFTlNTTF9ST09UX0RJUj0iJU9QRU5TU0xfUk9PVCUiIF4KKyAgICAtRE9QRU5TU0xfVVNFX1NUQVRJQ19MSUJTPU9GRiBeCisgICAgLURaTElCX0xJQlJBUlk9IiVXSU4zUCVcemxpYi1pbnN0XGxpYlx6bGliJVpMSUJfTElCX1NVRkZJWCUubGliIiBeCisgICAgLURaTElCX1JPT1Q9IiVXSU4zUCVcemxpYi1pbnN0IiBeCisgICAgLURXSVRIX1BZVEhPTj0lV0lUSF9QWVRIT04lIF4KKyAgICAtRFdJVEhfJVRIUkVBRE1PREVMJVRIUkVBRFM9T04gXgorICAgIC1EV0lUSF9TSEFSRURfTElCPU9GRiBeCisgICAgLURXSVRIX1NUQVRJQ19MSUI9T04gICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0BFQ0hPIE9GRgorCitjbWFrZSAtLWJ1aWxkIC4gXgorICAtLWNvbmZpZyAiJUNPTkZJR1VSQVRJT04lIiBeCisgIC0tdGFyZ2V0IElOU1RBTEwgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKZGlmZiAtLWdpdCBhL2J1aWxkL2FwcHZleW9yL01TVkMtYXBwdmV5b3ItaW5zdGFsbC5iYXQgYi9idWlsZC9hcHB2ZXlvci9NU1ZDLWFwcHZleW9yLWluc3RhbGwuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5NzNkMjkKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9hcHB2ZXlvci9NU1ZDLWFwcHZleW9yLWluc3RhbGwuYmF0CkBAIC0wLDAgKzEsNTkgQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjoKKzo6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzo6Cis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6CisKKzo6Cis6OiBBcHB2ZXlvciBpbnN0YWxsIHNjcmlwdCBmb3IgTVNWQworOjogSW5zdGFsbHMgKG9yIGJ1aWxkcykgdGhpcmQgcGFydHkgcGFja2FnZXMgd2UgbmVlZAorOjoKKworQEVDSE8gT0ZGCitTRVRMT0NBTCBFbmFibGVEZWxheWVkRXhwYW5zaW9uCisKK0NEIGJ1aWxkXGFwcHZleW9yICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfYmFubmVyX2luc3RhbGwuYmF0ICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfc2V0ZW52LmJhdCAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfc2hvd2Vudi5iYXQgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK01LRElSICIlV0lOM1AlIiAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKKworY2hvY28gZmVhdHVyZSBlbmFibGUgLW4gYWxsb3dHbG9iYWxDb25maXJtYXRpb24gfHwgRVhJVCAvQgorCis6OiBUaGluZ3MgdG8gaW5zdGFsbCB3aGVuIE5PVCBydW5uaW5nIGluIGFwcHZleW9yOgorSUYgIiVBUFBWRVlPUl9CVUlMRF9JRCUiID09ICIiICgKKyAgICBjdXAgLXkgY2hvY29sYXRleSAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKKyAgICBjaW5zdCAteSBjdXJsICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKKyAgICBjaW5zdCAteSA3emlwICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKKyAgICBjaW5zdCAteSBweXRob24zICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKKyAgICBjaW5zdCAteSBvcGVuc3NsLmxpZ2h0ICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKKykKKworY2luc3QgLXkgamRrOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorY2luc3QgLXkgd2luZmxleGJpc29uMyAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorCis6OiB6bGliIC0gbm90IGF2YWlsYWJsZSB0aHJvdWdoIGNob2NvbGF0ZXkKK0NEICIlQVBQVkVZT1JfU0NSSVBUUyUiICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK2NhbGwgYnVpbGQtemxpYi5iYXQgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKKworOjogbGliZXZlbnQgLSBub3QgYXZhaWxhYmxlIHRocm91Z2ggY2hvY29sYXRleQorQ0QgIiVBUFBWRVlPUl9TQ1JJUFRTJSIgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorY2FsbCBidWlsZC1saWJldmVudC5iYXQgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorCis6OiBweXRob24gcGFja2FnZXMgKGNvcnJlY3QgcGF0aCB0byBwaXAgc2V0IGluIGNsX3NldGVudi5iYXQpCitwaXAuZXhlIF4KKyAgICBpbnN0YWxsIGJhY2twb3J0cy5zc2xfbWF0Y2hfaG9zdG5hbWUgXgorICAgICAgICAgICAgaXBhZGRyZXNzIF4KKyAgICAgICAgICAgIHNpeCBeCisgICAgICAgICAgICB0b3JuYWRvIF4KKyAgICAgICAgICAgIHR3aXN0ZWQgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKKworY2luc3QgLXkgZ2hjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgpkaWZmIC0tZ2l0IGEvYnVpbGQvYXBwdmV5b3IvTVNWQy1hcHB2ZXlvci10ZXN0LmJhdCBiL2J1aWxkL2FwcHZleW9yL01TVkMtYXBwdmV5b3ItdGVzdC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU5NDU3OQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL01TVkMtYXBwdmV5b3ItdGVzdC5iYXQKQEAgLTAsMCArMSwzMiBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OgorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjoKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjoKKworQEVDSE8gT04KK1NFVExPQ0FMIEVuYWJsZURlbGF5ZWRFeHBhbnNpb24KK0NEIGJ1aWxkXGFwcHZleW9yICAgICAgICAgICAgICB8fCBFWElUIC9CCitDQUxMIGNsX2Jhbm5lcl90ZXN0LmJhdCAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9zZXRlbnYuYmF0ICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NEICIlQlVJTERESVIlIiAgICAgICAgICAgICAgICB8fCBFWElUIC9CCisKK0RJUiBDOlxsaWJyYXJpZXMKK0RJUiBDOlxsaWJyYXJpZXNcYm9vc3RfMV81OV8wCitESVIgQzpcbGlicmFyaWVzXGJvb3N0XzFfNjBfMAorRElSIEM6XGxpYnJhcmllc1xib29zdF8xXzYyXzAKK0RJUiBDOlxsaWJyYXJpZXNcYm9vc3RfMV82M18wCitESVIgQzpcbGlicmFyaWVzXGJvb3N0XzFfNjRfMAorCis6OiBBZGQgZGlyZWN0b3JpZXMgdG8gdGhlIHBhdGggdG8gZmluZCBETExzIG9mIHRoaXJkIHBhcnR5IGxpYnJhcmllcyBzbyB0ZXN0cyBydW4gcHJvcGVybHkhCitTRVQgUEFUSD0lQk9PU1RfTElCUkFSWURJUjovPVwlOyVPUEVOU1NMX1JPT1QlXGJpbjslV0lOM1AlXHpsaWItaW5zdFxiaW47JVBBVEglCisKK2N0ZXN0IC1DICVDT05GSUdVUkFUSU9OJSAtLXRpbWVvdXQgMzAwIC1WViAtRSAiKCVESVNBQkxFRF9URVNUUyUpIiB8fCBFWElUIC9CCmRpZmYgLS1naXQgYS9idWlsZC9hcHB2ZXlvci9NU1lTLWFwcHZleW9yLWJ1aWxkLmJhdCBiL2J1aWxkL2FwcHZleW9yL01TWVMtYXBwdmV5b3ItYnVpbGQuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0MDE3MjkKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9hcHB2ZXlvci9NU1lTLWFwcHZleW9yLWJ1aWxkLmJhdApAQCAtMCwwICsxLDQ4IEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6Cis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OgorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OgorCitARUNITyBPRkYKK1NFVExPQ0FMIEVuYWJsZURlbGF5ZWRFeHBhbnNpb24KKworQ0QgYnVpbGRcYXBwdmV5b3IgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCitDQUxMIGNsX2Jhbm5lcl9idWlsZC5iYXQgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfc2V0ZW52LmJhdCAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorCitTRVQgQkFTSD1DOlxtc3lzNjRcdXNyXGJpblxiYXNoCitTRVQgQ01BS0U9L2MvbXN5czY0L21pbmd3NjQvYmluL2NtYWtlLmV4ZQorCitARUNITyBPTgorU0VUIENNQUtFQVJHUz0tR1wiJUdFTkVSQVRPUiVcIiBeCisgIC1EQm9vc3RfREVCVUc9T04gXgorICAtREJvb3N0X05BTUVTUEFDRT1saWJib29zdCBeCisgIC1EQk9PU1RfSU5DTFVERURJUj0lQk9PU1RfSU5DTFVERURJUiUgXgorICAtREJPT1NUX0xJQlJBUllESVI9JUJPT1NUX0xJQlJBUllESVIlIF4KKyAgLURDTUFLRV9CVUlMRF9UWVBFPSVDT05GSUdVUkFUSU9OJSBeCisgIC1EQ01BS0VfQ19DT01QSUxFUj1nY2MuZXhlIF4KKyAgLURDTUFLRV9DWFhfQ09NUElMRVI9ZysrLmV4ZSBeCisgIC1EQ01BS0VfTUFLRV9QUk9HUkFNPW1ha2UuZXhlIF4KKyAgLURDTUFLRV9JTlNUQUxMX1BSRUZJWD0lSU5TVERJUl9NU1lTJSBeCisgIC1ETElCRVZFTlRfUk9PVD0lTElCRVZFTlRfUk9PVCUgXgorICAtRE9QRU5TU0xfTElCUkFSSUVTPSVPUEVOU1NMX0xJQlJBUklFUyUgXgorICAtRE9QRU5TU0xfUk9PVF9ESVI9JU9QRU5TU0xfUk9PVCUgXgorICAtRE9QRU5TU0xfVVNFX1NUQVRJQ19MSUJTPU9OIF4KKyAgLURXSVRIX0JPT1NUX1NUQVRJQz1PTiBeCisgIC1EV0lUSF9KQVZBPU9GRiBeCisgIC1EV0lUSF9MSUJFVkVOVD1PTiBeCisgIC1EV0lUSF9QWVRIT049JVdJVEhfUFlUSE9OJSBeCisgIC1EV0lUSF9TSEFSRURfTElCPU9GRiBeCisgIC1EV0lUSF9TVEFUSUNfTElCPU9OCisKKyVCQVNIJSAtbGMgIm1rZGlyICVCVUlMRERJUl9NU1lTJSAmJiBjZCAlQlVJTERESVJfTVNZUyUgJiYgJUNNQUtFJSAlU1JDRElSX01TWVMlICVDTUFLRUFSR1MlICYmICVDTUFLRSUgLS1idWlsZCAuIC0tY29uZmlnICVDT05GSUdVUkFUSU9OJSAtLXRhcmdldCBpbnN0YWxsIiB8fCBFWElUIC9CCitARUNITyBPRkYKZGlmZiAtLWdpdCBhL2J1aWxkL2FwcHZleW9yL01TWVMtYXBwdmV5b3ItaW5zdGFsbC5iYXQgYi9idWlsZC9hcHB2ZXlvci9NU1lTLWFwcHZleW9yLWluc3RhbGwuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4MThkZjMKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9hcHB2ZXlvci9NU1lTLWFwcHZleW9yLWluc3RhbGwuYmF0CkBAIC0wLDAgKzEsNDggQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjoKKzo6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzo6Cis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6CisKKzo6Cis6OiBBcHB2ZXlvciBpbnN0YWxsIHNjcmlwdCBmb3IgTVNZUworOjogSW5zdGFsbHMgKG9yIGJ1aWxkcykgdGhpcmQgcGFydHkgcGFja2FnZXMgd2UgbmVlZAorOjoKKworQEVDSE8gT0ZGCitTRVRMT0NBTCBFbmFibGVEZWxheWVkRXhwYW5zaW9uCisKK0NEIGJ1aWxkXGFwcHZleW9yICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCitDQUxMIGNsX2Jhbm5lcl9pbnN0YWxsLmJhdCAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9zZXRlbnYuYmF0ICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfc2hvd2Vudi5iYXQgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCisKKzo6IFdlJ3JlIGdvaW5nIHRvIGtlZXAgYm9vc3QgYXQgYSB2ZXJzaW9uIGNtYWtlIHVuZGVyc3RhbmRzCitTRVQgQk9PU1RQS0c9bWluZ3ctdzY0LXg4Nl82NC1ib29zdC0xLjY0LjAtMy1hbnkucGtnLnRhci54egorU0VUIElHTk9SRT0tLWlnbm9yZSBtaW5ndy13NjQteDg2XzY0LWJvb3N0CisKK1NFVCBQQUNLQUdFUz1eCisgIC0tbmVlZGVkIC1TIGJpc29uIGZsZXggbWFrZSBeCisgIG1pbmd3LXc2NC14ODZfNjQtY21ha2UgXgorICBtaW5ndy13NjQteDg2XzY0LWxpYmV2ZW50IF4KKyAgbWluZ3ctdzY0LXg4Nl82NC1vcGVuc3NsIF4KKyAgbWluZ3ctdzY0LXg4Nl82NC10b29sY2hhaW4gXgorICBtaW5ndy13NjQteDg2XzY0LXpsaWIKKworJUJBU0glIC1sYyAicGFjbWFuIC0tbm9jb25maXJtIC1TeXUgJUlHTk9SRSUiIHx8IEVYSVQgL0IKKyVCQVNIJSAtbGMgInBhY21hbiAtLW5vY29uZmlybSAtU3UgJUlHTk9SRSUiICB8fCBFWElUIC9CCislQkFTSCUgLWxjICJwYWNtYW4gLS1ub2NvbmZpcm0gJVBBQ0tBR0VTJSIgICAgfHwgRVhJVCAvQgorCis6OiBJbnN0YWxsIGEgc2xpZ2h0bHkgb2xkZXIgYm9vc3QgKDEuNjQuMCkgYXMgY21ha2UgMy4xMAorOjogZG9lcyBub3QgaGF2ZSBidWlsdC1pbiBkZXBlbmRlbmNpZXMgZm9yIGJvb3N0IDEuNjYuMCB5ZXQKKzo6IC0tIHRoaXMgY3V0cyBkb3duIG9uIGJ1aWxkIHdhcm5pbmcgb3V0cHV0IC0tCislQkFTSCUgLWxjICJ3Z2V0IGh0dHA6Ly9yZXBvLm1zeXMyLm9yZy9taW5ndy94ODZfNjQvJUJPT1NUUEtHJSAmJiBwYWNtYW4gLS1ub2NvbmZpcm0gLS1uZWVkZWQgLVUgJUJPT1NUUEtHJSAmJiBybSAlQk9PU1RQS0clIiB8fCBFWElUIC9CCisKZGlmZiAtLWdpdCBhL2J1aWxkL2FwcHZleW9yL01TWVMtYXBwdmV5b3ItdGVzdC5iYXQgYi9idWlsZC9hcHB2ZXlvci9NU1lTLWFwcHZleW9yLXRlc3QuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMzdlYzUKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9hcHB2ZXlvci9NU1lTLWFwcHZleW9yLXRlc3QuYmF0CkBAIC0wLDAgKzEsMjYgQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjoKKzo6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzo6Cis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6CisKK0BFQ0hPIE9GRgorU0VUTE9DQUwgRW5hYmxlRGVsYXllZEV4cGFuc2lvbgorCitDRCBidWlsZFxhcHB2ZXlvciAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9iYW5uZXJfdGVzdC5iYXQgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfc2V0ZW52LmJhdCAgICAgICAgICAgICB8fCBFWElUIC9CCitDRCAiJUJVSUxERElSJSIgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorCis6OiByYW5kb21seSBmYWlscyBvbiBtaW5ndzsgc2VlIEppcmEgVEhSSUZULTQxMDYKK1NFVCBESVNBQkxFRF9URVNUUz1jb25jdXJyZW5jeV90ZXN0CisKKyVCQVNIJSAtbGMgImNkICVCVUlMRERJUl9NU1lTJSAmJiBjdGVzdC5leGUgLUMgJUNPTkZJR1VSQVRJT04lIC0tdGltZW91dCAzMDAgLVZWIC1FICcoJURJU0FCTEVEX1RFU1RTJSknIiB8fCBFWElUIC9CCmRpZmYgLS1naXQgYS9idWlsZC9hcHB2ZXlvci9SRUFETUUubWQgYi9idWlsZC9hcHB2ZXlvci9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWEyYWEzMAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL1JFQURNRS5tZApAQCAtMCwwICsxLDM0IEBACis8IS0tLQorTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cit5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCitZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCisjIEFwcHZleW9yIEJ1aWxkCisKK0FwcHZleW9yIGlzIGNhcGFibGUgb2YgYnVpbGRpbmcgTVNWQyAyMDEwIHRocm91Z2ggMjAxNSBhcyB3ZWxsIGFzCitoYXZpbmcgdGhlIGxhdGVzdCBNU1lTMi9NaW5HVyA2NC1iaXQgZW52aXJvbm1lbnQuICBJdCBoYXMgbWFueSB2ZXJzaW9ucworb2YgYm9vc3QgYW5kIHB5dGhvbiBpbnN0YWxsZWQgYXMgd2VsbC4gIFNlZSB3aGF0IGFwcHZleW9yIGhhcworW2luc3RhbGxlZCBvbiBidWlsZCB3b3JrZXJzXShodHRwczovL3d3dy5hcHB2ZXlvci5jb20vZG9jcy9pbnN0YWxsZWQtc29mdHdhcmUvKS4KKworV2UgcnVuIGEgbWF0cml4IGJ1aWxkIG9uIEFwcHZleW9yIGFuZCBidWlsZCB0aGUgZm9sbG93aW5nIGNvbWJpbmF0aW9uczoKKworKiBNaW5HVyB4NjQgKGdjYyA2LjMuMCkKKyogTVNWQyAyMDEwIHg4NiwgYW4gb2xkZXIgYm9vc3QsIGFuIG9sZGVyIHB5dGhvbgorKiBNU1ZDIDIwMTUgeDg2L3g2NCwgdGhlIGxhdGVzdCBib29zdCwgdGhlIGxhdGVzdCBweXRob24KKyogTVNZUzIgeDY0IChnY2MgNi4zLjApIC0gdGhpcyBpcyBhIHdvcmsgaW4gcHJvZ3Jlc3MKKworVGhlIEFwcHZleW9yIHNjcmlwdCB0YWtlcyB0aGUgZmlyc3QgZm91ciBsZXR0ZXJzIGZyb20gdGhlIFBST0ZJTEUgc3BlY2lmaWVkIGluCit0aGUgZW52aXJvbm1lbnQgc3RhbnphIGFuZCBydW5zIHRoZXNlIHNjcmlwdHMgaW4gb3JkZXI6CisKKz8/Pz8tYXBwdmV5b3ItaW5zdGFsbC5iYXQgd2lsbCBpbnN0YWxsIHRoaXJkIHBhcnR5IGxpYnJhcmllcyBhbmQgc2V0IHVwIHRoZSBlbnZpcm9ubWVudAorPz8/Py1hcHB2ZXlvci1idWlsZC5iYXQgd2lsbCBidWlsZCB3aXRoIGNtYWtlCis/Pz8/LWFwcHZleW9yLXRlc3QuYmF0IHdpbGwgcnVuIGN0ZXN0CmRpZmYgLS1naXQgYS9idWlsZC9hcHB2ZXlvci9idWlsZC1saWJldmVudC5iYXQgYi9idWlsZC9hcHB2ZXlvci9idWlsZC1saWJldmVudC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRiNjM1YgotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL2J1aWxkLWxpYmV2ZW50LmJhdApAQCAtMCwwICsxLDM3IEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6Cis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OgorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OgorCitTRVRMT0NBTCBFbmFibGVEZWxheWVkRXhwYW5zaW9uCisKK1NFVCBVUkxGSUxFPWxpYmV2ZW50LSVMSUJFVkVOVF9WRVJTSU9OJS1zdGFibGUudGFyLmd6CitTRVQgVVJMPWh0dHBzOi8vZ2l0aHViLmNvbS9saWJldmVudC9saWJldmVudC9yZWxlYXNlcy9kb3dubG9hZC9yZWxlYXNlLSVMSUJFVkVOVF9WRVJTSU9OJS1zdGFibGUvJVVSTEZJTEUlCisKKzo6IERvd25sb2FkIC0gc3VwcG9ydCBydW5uaW5nIGEgbG9jYWwgYnVpbGQgb3IgYSBidWlsZCBpbiBhcHB2ZXlvcgorQ0QgIiVXSU4zUCUiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0lGICIlQVBQVkVZT1JfQlVJTERfSUQlIiA9PSAiIiAoCisgICAgY3VybCAtTCAtZiAtbyAiJVVSTEZJTEUlIiAiJVVSTCUiCispIEVMU0UgKAorICAgIGFwcHZleW9yIERvd25sb2FkRmlsZSAiJVVSTCUiCispCis3eiB4ICIlVVJMRklMRSUiIC1zbyB8IDd6IHggLXNpIC10dGFyID4gbnVsICAgICAgfHwgRVhJVCAvQgorQ0QgImxpYmV2ZW50LSVMSUJFVkVOVF9WRVJTSU9OJS1zdGFibGUiICAgICAgICAgIHx8IEVYSVQgL0IKK25tYWtlIC1mIE1ha2VmaWxlLm5tYWtlIHN0YXRpY19saWJzICAgICAgICAgICAgICB8fCBFWElUIC9CCisKKzo6IGluIGxpYmV2ZW50IDIuMCB0aGVyZSBpcyBubyBubWFrZSBzdWJkaXJlY3RvcnkgaW4gV0lOMzItQ29kZSwgYnV0IGluIDIuMSB0aGVyZSBpcworbWtkaXIgbGliICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK21vdmUgKi5saWIgbGliXCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCittb3ZlIFdJTjMyLUNvZGVcZXZlbnQyXCogaW5jbHVkZVxldmVudDJcICAgICAgICAgfHwgbW92ZSBXSU4zMi1Db2RlXG5tYWtlXGV2ZW50MlwqIGluY2x1ZGVcZXZlbnQyXCB8fCBFWElUIC9CCittb3ZlICouaCBpbmNsdWRlXCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorCitFTkRMT0NBTApkaWZmIC0tZ2l0IGEvYnVpbGQvYXBwdmV5b3IvYnVpbGQtemxpYi5iYXQgYi9idWlsZC9hcHB2ZXlvci9idWlsZC16bGliLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTk1NzI2Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvYXBwdmV5b3IvYnVpbGQtemxpYi5iYXQKQEAgLTAsMCArMSw1NiBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OgorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjoKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjoKKworU0VUTE9DQUwgRW5hYmxlRGVsYXllZEV4cGFuc2lvbgorCitTRVQgUEFDS0FHRT16bGliLSVaTElCX1ZFUlNJT04lCitTRVQgQlVJTERESVI9JVdJTjNQJVx6bGliLWJ1aWxkCitTRVQgSU5TVERJUj0lV0lOM1AlXHpsaWItaW5zdAorU0VUIFNSQ0RJUj0lV0lOM1AlXCVQQUNLQUdFJQorU0VUIFVSTEZJTEU9JVBBQ0tBR0UlLnRhci5negorCis6OiBUaGlzIGFsbG93cyB1cyB0byB0b2xlcmF0ZSB3aGVuIHRoZSBjdXJyZW50IHZlcnNpb24gaXMgYXJjaGl2ZWQKK1NFVCBVUkw9aHR0cDovL3psaWIubmV0LyVVUkxGSUxFJQorU0VUIEZVUkw9aHR0cDovL3psaWIubmV0L2Zvc3NpbHMvJVVSTEZJTEUlCisKKzo6IERvd25sb2FkIC0gc3VwcG9ydCBydW5uaW5nIGEgbG9jYWwgYnVpbGQgb3IgYSBidWlsZCBpbiBhcHB2ZXlvcgorQ0QgIiVXSU4zUCUiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCitJRiAiJUFQUFZFWU9SX0JVSUxEX0lEJSIgPT0gIiIgKAorICAgIGN1cmwgLUwgLWYgLW8gIiVVUkxGSUxFJSIgIiVVUkwlIgorICAgIElGIEVSUk9STEVWRUwgMSAoCisgICAgICAgIGN1cmwgLUwgLWYgLW8gIiVVUkxGSUxFJSIgIiVGVVJMJSIKKyAgICApCispIEVMU0UgKAorICAgIGFwcHZleW9yIERvd25sb2FkRmlsZSAiJVVSTCUiCisgICAgSUYgRVJST1JMRVZFTCAxICgKKyAgICAgICAgYXBwdmV5b3IgRG93bmxvYWRGaWxlICIlRlVSTCUiICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorICAgICkKKykKKzd6IHggIiVVUkxGSUxFJSIgLXNvIHwgN3ogeCAtc2kgLXR0YXIgPiBudWwgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorCis6OiBHZW5lcmF0ZQorTUtESVIgIiVCVUlMRERJUiUiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCitDRCAiJUJVSUxERElSJSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK2NtYWtlICIlU1JDRElSJSIgXgorICAgICAgLUciTk1ha2UgTWFrZWZpbGVzIiBeCisgICAgICAtRENNQUtFX0lOU1RBTExfUFJFRklYPSIlSU5TVERJUiUiIF4KKyAgICAgIC1EQ01BS0VfQlVJTERfVFlQRT0iJUNPTkZJR1VSQVRJT04lIiAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorCis6OiBCdWlsZAorbm1ha2UgL2ZNYWtlZmlsZSBpbnN0YWxsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCitJRiAiJUNPTkZJR1VSQVRJT04lIiA9PSAiRGVidWciICgKKyAgICBDT1BZICIlQlVJTERESVIlXHpsaWJkLnBkYiIgIiVJTlNURElSJVxiaW5cIiAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorKQorCitFTkRMT0NBTApkaWZmIC0tZ2l0IGEvYnVpbGQvYXBwdmV5b3IvY2xfYmFubmVyX2FwYWNoZV90aHJpZnQuYmF0IGIvYnVpbGQvYXBwdmV5b3IvY2xfYmFubmVyX2FwYWNoZV90aHJpZnQuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4ZjJhMmEKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9hcHB2ZXlvci9jbF9iYW5uZXJfYXBhY2hlX3RocmlmdC5iYXQKQEAgLTAsMCArMSwyNCBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OgorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjoKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjoKKworOjogQSB2aXN1YWwgaW5kaWNhdG9yIGluIGEgbGFyZ2UgbG9nIGhlbHBzIHlvdSBsb2NhdGUgdGhpbmdzIHdoZW4gc2Nhbm5pbmcKKzo6IGh0dHA6Ly93d3cucGF0b3Jqay5jb20vc29mdHdhcmUvdGFhZy8jcD1kaXNwbGF5JmY9U21hbGwlMjBTbGFudCZ0PUFwYWNoZSUyMFRocmlmdAorCitFQ0hPLworRUNITyAgICBfX18gICAgICAgICAgICAgICAgIF9fICAgICAgICAgX19fX19fX18gICAgICAgXyBfX19fXworRUNITyAgIC8gXyB8IF9fXyAgX19fIF9fX19fLyAvICBfX18gICAvXyAgX18vIC8gIF9fX18oXykgXy8gL18KK0VDSE8gIC8gX18gfC8gXyBcLyBfIGAvIF9fLyBfIFwvIC1fKSAgIC8gLyAvIF8gXC8gX18vIC8gXy8gX18vCitFQ0hPIC9fLyB8Xy8gLl9fL1xfLF8vXF9fL18vL18vXF9fLyAgIC9fLyAvXy8vXy9fLyAvXy9fLyBcX18vCitFQ0hPICAgICAgL18vCitFQ0hPLwpkaWZmIC0tZ2l0IGEvYnVpbGQvYXBwdmV5b3IvY2xfYmFubmVyX2J1aWxkLmJhdCBiL2J1aWxkL2FwcHZleW9yL2NsX2Jhbm5lcl9idWlsZC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjAyNzJmMwotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL2NsX2Jhbm5lcl9idWlsZC5iYXQKQEAgLTAsMCArMSwyMyBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OgorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjoKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjoKKworOjogQSB2aXN1YWwgaW5kaWNhdG9yIGluIGEgbGFyZ2UgbG9nIGhlbHBzIHlvdSBsb2NhdGUgdGhpbmdzIHdoZW4gc2Nhbm5pbmcKKzo6IGh0dHA6Ly93d3cucGF0b3Jqay5jb20vc29mdHdhcmUvdGFhZy8jcD1kaXNwbGF5JmY9U21hbGwlMjBTbGFudCZ0PUJ1aWxkCisKK0VDSE8vCitFQ0hPICAgIF9fXyAgICAgICBfIF9fICAgX18KK0VDSE8gICAvIF8gKV9fIF9fKF8pIC9fXy8gLworRUNITyAgLyBfICAvIC8vIC8gLyAvIF8gIC8gICAgIEBAQCBCVUlMRAorRUNITyAvX19fXy9cXyxfL18vXy9cXyxfLworRUNITy8KZGlmZiAtLWdpdCBhL2J1aWxkL2FwcHZleW9yL2NsX2Jhbm5lcl9pbnN0YWxsLmJhdCBiL2J1aWxkL2FwcHZleW9yL2NsX2Jhbm5lcl9pbnN0YWxsLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGUzZGEyCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvYXBwdmV5b3IvY2xfYmFubmVyX2luc3RhbGwuYmF0CkBAIC0wLDAgKzEsMjMgQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjoKKzo6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzo6Cis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6CisKKzo6IEEgdmlzdWFsIGluZGljYXRvciBpbiBhIGxhcmdlIGxvZyBoZWxwcyB5b3UgbG9jYXRlIHRoaW5ncyB3aGVuIHNjYW5uaW5nCis6OiBodHRwOi8vd3d3LnBhdG9yamsuY29tL3NvZnR3YXJlL3RhYWcvI3A9ZGlzcGxheSZmPVNtYWxsJTIwU2xhbnQmdD1JbnN0YWxsCisKK0VDSE8vCitFQ0hPICAgIF9fX18gICAgICAgICBfXyAgICAgICBfX19fCitFQ0hPICAgLyAgXy9fXyAgX19fIC8gL19fX18gXy8gLyAvCitFQ0hPICBfLyAvLyBfIFwoXy1ePC8gX18vIF8gXC8gLyAvICAgICBAQEAgSU5TVEFMTAorRUNITyAvX19fL18vL18vX19fL1xfXy9cXyxfL18vXy8KK0VDSE8vCmRpZmYgLS1naXQgYS9idWlsZC9hcHB2ZXlvci9jbF9iYW5uZXJfdGVzdC5iYXQgYi9idWlsZC9hcHB2ZXlvci9jbF9iYW5uZXJfdGVzdC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRlMmQxMAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL2NsX2Jhbm5lcl90ZXN0LmJhdApAQCAtMCwwICsxLDIzIEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6Cis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OgorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OgorCis6OiBBIHZpc3VhbCBpbmRpY2F0b3IgaW4gYSBsYXJnZSBsb2cgaGVscHMgeW91IGxvY2F0ZSB0aGluZ3Mgd2hlbiBzY2FubmluZworOjogaHR0cDovL3d3dy5wYXRvcmprLmNvbS9zb2Z0d2FyZS90YWFnLyNwPWRpc3BsYXkmZj1TbWFsbCUyMFNsYW50JnQ9VGVzdAorCitFQ0hPLworRUNITyAgX19fX19fICAgICAgICBfXworRUNITyAvXyAgX18vX18gX19fIC8gL18KK0VDSE8gIC8gLyAvIC1fXnxfLV48LyBfXy8gICAgIEBAQCBURVNUCitFQ0hPIC9fLyAgXF9fL19fXy9cX18vCitFQ0hPLwpkaWZmIC0tZ2l0IGEvYnVpbGQvYXBwdmV5b3IvY2xfc2V0Y29tcGlsZXIuYmF0IGIvYnVpbGQvYXBwdmV5b3IvY2xfc2V0Y29tcGlsZXIuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczM2ZmYzUKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9hcHB2ZXlvci9jbF9zZXRjb21waWxlci5iYXQKQEAgLTAsMCArMSw2MyBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OgorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjoKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjoKKworOjoKKzo6IERldGVjdCB0aGUgY29tcGlsZXIgZWRpdGlvbiB3ZSdyZSBidWlsZGluZyBpbi4KKzo6IFNldCB0aGUgQ09NUElMRVIgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gb25lIG9mOgorOjogICBnY2MgICA9IE1pbkdXIC8gTVNZUzIgYW5kIGdjYyB0b29sY2hhaW4KKzo6ICAgdmMxMDAgPSBWaXN1YWwgU3R1ZGlvIDIwMTAKKzo6ICAgdmMxMTAgPSBWaXN1YWwgU3R1ZGlvIDIwMTIKKzo6ICAgdmMxMjAgPSBWaXN1YWwgU3R1ZGlvIDIwMTMKKzo6ICAgdmMxNDAgPSBWaXN1YWwgU3R1ZGlvIDIwMTUKKzo6ICAgdmMxNDEgPSBWaXN1YWwgU3R1ZGlvIDIwMTcKKzo6Cis6OiBIb25vcnMgYW55IGV4aXN0aW5nIENPTVBJTEVSIGVudmlyb25tZW50IHZhcmlhYmxlCis6OiAgIHNldHRpbmcgaW5zdGVhZCBvZiBvdmVyd3JpdGluZyBpdCwgdG8gYWxsb3cgaXQKKzo6ICAgdG8gYmUgZm9yY2VkIGlmIG5lZWRlZC4KKzo6Cis6OiBTZXRzIEVSUk9STEVWRUwgdG8gMCBpZiBDT01QSUxFUiBjYW4gYmUgZGV0ZXJtaW5lZCwKKzo6ICAgICAgICAgICAgICAgICB0byAxIGlmIGl0IGNhbm5vdC4KKzo6CisKK0lGIERFRklORUQgQ09NUElMRVIgKAorICBFQ0hPIFt3YXJuIF0gdXNpbmcgZXhpc3RpbmcgZW52aXJvbm1lbnQgdmFyaWFibGUgQ09NUElMRVIKKyAgRVhJVCAvQiAwCispCisKK0lGIE5PVCAiJVBST0ZJTEU6fjAsNCUiID09ICJNU1ZDIiAoCisgIFNFVCBDT01QSUxFUj1nY2MKKykgRUxTRSAoCisgIENBTEwgOkNIRUNLIDE2CisgIElGICFFUlJPUkxFVkVMISA9PSAwIChTRVQgQ09NUElMRVI9dmMxMDApCisgIENBTEwgOkNIRUNLIDE3CisgIElGICFFUlJPUkxFVkVMISA9PSAwIChTRVQgQ09NUElMRVI9dmMxMTApCisgIENBTEwgOkNIRUNLIDE4CisgIElGICFFUlJPUkxFVkVMISA9PSAwIChTRVQgQ09NUElMRVI9dmMxMjApCisgIENBTEwgOkNIRUNLIDE5LjAKKyAgSUYgIUVSUk9STEVWRUwhID09IDAgKFNFVCBDT01QSUxFUj12YzE0MCkKKyAgQ0FMTCA6Q0hFQ0sgMTkuMQorICBJRiAhRVJST1JMRVZFTCEgPT0gMCAoU0VUIENPTVBJTEVSPXZjMTQxKQorKQorCitJRiBOT1QgREVGSU5FRCBDT01QSUxFUiAoCisgIEVDSE8gW2Vycm9yXSB1bmFibGUgdG8gZGV0ZXJtaW5lIHRoZSBjb21waWxlciBlZGl0aW9uCisgIEVYSVQgL0IgMQorKQorCitFQ0hPIFtpbmZvIF0gZGV0ZWN0ZWQgY29tcGlsZXIgZWRpdGlvbiAgICAlQ09NUElMRVIlCitFWElUIC9CIDAKKworOkNIRUNLCitjbCAvPyAyPiYxIHwgZmluZHN0ciAvQzoiVmVyc2lvbiAlMSUiID4gbnVsCitFWElUIC9CCmRpZmYgLS1naXQgYS9idWlsZC9hcHB2ZXlvci9jbF9zZXRlbnYuYmF0IGIvYnVpbGQvYXBwdmV5b3IvY2xfc2V0ZW52LmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzMzNjZkCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvYXBwdmV5b3IvY2xfc2V0ZW52LmJhdApAQCAtMCwwICsxLDEyMSBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OgorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjoKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjoKKworQEVDSE8gT0ZGCisKK0lGICIlUFJPRklMRSUiID09ICJNU1ZDMjAxMiIgKAorICBDQUxMICJDOlxQcm9ncmFtIEZpbGVzICh4ODYpXE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIDExLjBcVkNcdmN2YXJzYWxsLmJhdCIgJVBMQVRGT1JNJQorKSBFTFNFIElGICIlUFJPRklMRSUiID09ICJNU1ZDMjAxMyIgKAorICBDQUxMICJDOlxQcm9ncmFtIEZpbGVzICh4ODYpXE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIDEyLjBcVkNcdmN2YXJzYWxsLmJhdCIgJVBMQVRGT1JNJQorKSBFTFNFIElGICIlUFJPRklMRSUiID09ICJNU1ZDMjAxNSIgKAorICBDQUxMICJDOlxQcm9ncmFtIEZpbGVzICh4ODYpXE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIDE0LjBcVkNcdmN2YXJzYWxsLmJhdCIgJVBMQVRGT1JNJQorKSBFTFNFIElGICIlUFJPRklMRSUiID09ICJNU1ZDMjAxNyIgKAorICBDQUxMIDpTRVRVUE5FV0VSTVNWQyAgICB8fCBFWElUIC9CCispIEVMU0UgSUYgIiVQUk9GSUxFJSIgPT0gIk1JTkdXIiAoCisgIFJFTSBTdXBwb3J0ZWQsIG5vdGhpbmcgc3BlY2lhbCB0byBkbyBoZXJlLgorKSBFTFNFIElGICIlUFJPRklMRSUiID09ICJDWUdXSU4iICgKKyAgUkVNIFN1cHBvcnRlZCwgbm90aGluZyBzcGVjaWFsIHRvIGRvIGhlcmUuCispIEVMU0UgKAorICBFQ0hPIFVuc3VwcG9ydGVkIFBST0ZJTEU9JVBST0ZJTEUlIG9yIFBMQVRGT1JNPSVQTEFURk9STSUKKyAgRVhJVCAvQiAxCispCisKK0NBTEwgY2xfc2V0Y29tcGlsZXIuYmF0ICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9zZXRnZW5lcmF0b3IuYmF0ICB8fCBFWElUIC9CCisKK1NFVCBBUFBWRVlPUl9TQ1JJUFRTPSVBUFBWRVlPUl9CVUlMRF9GT0xERVIlXGJ1aWxkXGFwcHZleW9yCitTRVQgQlVJTERESVI9JUFQUFZFWU9SX0JVSUxEX0ZPTERFUiVcLi5cYnVpbGRcJVBST0ZJTEUlXCVQTEFURk9STSUKK1NFVCBJTlNURElSPSVBUFBWRVlPUl9CVUlMRF9GT0xERVIlXC4uXGJ1aWxkXCVQUk9GSUxFJVwlUExBVEZPUk0lCitTRVQgU1JDRElSPSVBUFBWRVlPUl9CVUlMRF9GT0xERVIlCisKKzo6IFBMQVRGT1JNIGlzIHg2NCBvciB4ODYKKzo6IE5PUk1fUExBVEZPUk0gaXMgNjQgb3IgMzIKK1NFVCBOT1JNX1BMQVRGT1JNPSVQTEFURk9STTp+LTIsMiUKK0lGICIlTk9STV9QTEFURk9STSUiID09ICI4NiIgKFNFVCBOT1JNX1BMQVRGT1JNPTMyKQorCitJRiAiJVBST0ZJTEU6fjAsNCUiID09ICJNU1ZDIiAoCisKKyAgOjogRmluZEJvb3N0IG5lZWRzIGZvcndhcmQgc2xhc2hlcyBzbyBjbWFrZSBkb2Vzbid0IHNlZSBzb21ldGhpbmcgYXMgYW4gZXNjYXBlZCBjaGFyYWN0ZXIKKyAgU0VUIEJPT1NUX1JPT1Q9QzovTGlicmFyaWVzL2Jvb3N0XyVCT09TVF9WRVJTSU9OOi49XyUKKyAgU0VUIEJPT1NUX0xJQlJBUllESVI9IUJPT1NUX1JPT1QhL2xpYiVOT1JNX1BMQVRGT1JNJS1tc3ZjLSVDT01QSUxFUjp+LTMsMiUuJUNPTVBJTEVSOn4tMSwxJQorICBTRVQgT1BFTlNTTF9ST09UPUM6XE9wZW5TU0wtV2luJU5PUk1fUExBVEZPUk0lCisgIFNFVCBXSU4zUD0lQVBQVkVZT1JfQlVJTERfRk9MREVSJVx0aGlyZHBhcnR5CisKKyAgU0VUIFRIUkVBRE1PREVMPVNURAorCisgIElGICIlUFlUSE9OX1ZFUlNJT04lIiA9PSAiIiAoCisgICAgU0VUIFdJVEhfUFlUSE9OPU9GRgorICApIEVMU0UgKAorICAgIFNFVCBXSVRIX1BZVEhPTj1PTgorICAgIElGIC9pICIlUExBVEZPUk0lIiA9PSAieDY0IiBTRVQgUFRFWFQ9LXg2NAorICAgIFNFVCBQQVRIPUM6XFB5dGhvbiVQWVRIT05fVkVSU0lPTjouPSUhUFRFWFQhXHNjcmlwdHM7QzpcUHl0aG9uJVBZVEhPTl9WRVJTSU9OOi49JSFQVEVYVCE7IVBBVEghCisgICkKKyAgSUYgIiVDT05GSUdVUkFUSU9OJSIgPT0gIkRlYnVnIiAoU0VUIFpMSUJfTElCX1NVRkZJWD1kKQorCisgIElGIE5PVCAiJVFUX1ZFUlNJT04lIiA9PSAiIiAoCisgICAgSUYgL2kgIiVQTEFURk9STSUiID09ICJ4NjQiIFNFVCBRVEVYVD1fNjQKKyAgICBTRVQgUEFUSD1DOlxRdFwlUVRfVkVSU0lPTiVcJVBST0ZJTEUlIVFURVhUIVxiaW47IVBBVEghCisgICkKKworKSBFTFNFIElGICIlUFJPRklMRTp+MCw0JSIgPT0gIk1JTkciICgKKworICA6OiBQTEFURk9STSA9IHg4NiBtZWFucyBNSU5HV1BMQVQgaTY4NgorICA6OiBQTEFURk9STSA9IHg2NCBtZWFucyBNSU5HV1BMQVQgeDg2XzY0CisgIFNFVCBNSU5HV1BMQVQ9eDg2XzY0CisgIElGICIlUExBVEZPUk0lIiA9PSAieDg2IiAoU0VUIE1JTkdXUExBVD1pNjg2KQorCisgIFNFVCBCQVNIPUM6XG1zeXM2NFx1c3JcYmluXGJhc2guZXhlCisgICFCQVNIISAtbGMgInNlZCAtaSAnL2V4cG9ydCBQQVRIPVwvbWluZ3czMlwvYmluL2QnIH4vLmJhc2hfcHJvZmlsZSAmJiBzZWQgLWkgJy9leHBvcnQgUEFUSD1cL21pbmd3NjRcL2Jpbi9kJyB+Ly5iYXNoX3Byb2ZpbGUgJiYgZWNobyAnZXhwb3J0IFBBVEg9L21pbmd3JU5PUk1fUExBVEZPUk0lL2JpbjokUEFUSCcgPj4gfi8uYmFzaF9wcm9maWxlIiB8fCBFWElUIC9CCisKKyAgU0VUIEJVSUxERElSPSVCVUlMRERJUjpcPS8lCisgIFNFVCBCVUlMRERJUj0vYyFCVUlMRERJUjp+MiEKKyAgU0VUIElOU1RESVI9JUlOU1RESVI6XD0vJQorICBTRVQgSU5TVERJUj0vYyFJTlNURElSOn4yIQorICBTRVQgU1JDRElSPSVTUkNESVI6XD0vJQorICBTRVQgU1JDRElSPS9jIVNSQ0RJUjp+MiEKKworKSBFTFNFIElGICIlUFJPRklMRTp+MCw0JSIgPT0gIkNZR1ciICgKKworICBTRVQgQ1lHV0lOUk9PVD1DOlxjeWd3aW4KKyAgSUYgIiVQTEFURk9STSUiID09ICJ4NjQiIChTRVQgQ1lHV0lOUk9PVD0hQ1lHV0lOUk9PVCE2NCkKKworICBTRVQgQkFTSD0hQ1lHV0lOUk9PVCFcYmluXGJhc2guZXhlCisgIFNFVCBTRVRVUD0hQ1lHV0lOUk9PVCFcc2V0dXAteDg2CisgIElGICIlUExBVEZPUk0lIiA9PSAieDY0IiAoU0VUIFNFVFVQPSFTRVRVUCFfNjQpCisgIFNFVCBTRVRVUD0hU0VUVVAhLmV4ZQorCisgIFNFVCBCVUlMRERJUj0lQlVJTERESVI6XD0vJQorICBTRVQgQlVJTERESVI9L2N5Z2RyaXZlL2MhQlVJTERESVI6fjIhCisgIFNFVCBJTlNURElSPSVJTlNURElSOlw9LyUKKyAgU0VUIElOU1RESVJfQ1lHPS9jeWdkcml2ZS9jIUlOU1RESVI6fjIhCisgIFNFVCBTUkNESVI9JVNSQ0RJUjpcPS8lCisgIFNFVCBTUkNESVI9L2N5Z2RyaXZlL2MhU1JDRElSOn4yIQorCispCisKK0dPVE8gOkVPRgorCis6U0VUVVBORVdFUk1TVkMKKyAgRk9SIC9GICJVU0VCQUNLUSBUT0tFTlM9KiIgJSVpIElOIChgY2FsbCAiJVByb2dyYW1GaWxlcyh4ODYpJVxNaWNyb3NvZnQgVmlzdWFsIFN0dWRpb1xJbnN0YWxsZXJcdnN3aGVyZS5leGUiIC12ZXJzaW9uICJbMTUuMCwxNi4wKSIgLXByb3BlcnR5IGluc3RhbGxhdGlvblBhdGhgKSBETyAoCisgICAgSUYgIiVNU1ZDUk9PVCUiID09ICIiIChTRVQgTVNWQ1JPT1Q9JSVpKQorICApCisgIFNFVCBNU1ZDUExBVD14ODYKKyAgSUYgIiVQTEFURk9STSUiID09ICJ4NjQiIChTRVQgTVNWQ1BMQVQ9YW1kNjQpCisKKyAgU0VUIENVUlJFTlRESVI9JUNEJQorICBDQUxMICIhTVNWQ1JPT1QhXENvbW1vbjdcVG9vbHNcVnNEZXZDbWQuYmF0IiAtYXJjaD0hTVNWQ1BMQVQhIHx8IEVYSVQgL0IKKyAgQ0QgJUNVUlJFTlRESVIlCisgIEVYSVQgL0IKKworOkVPRgpkaWZmIC0tZ2l0IGEvYnVpbGQvYXBwdmV5b3IvY2xfc2V0Z2VuZXJhdG9yLmJhdCBiL2J1aWxkL2FwcHZleW9yL2NsX3NldGdlbmVyYXRvci5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWViNmZmMwotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL2NsX3NldGdlbmVyYXRvci5iYXQKQEAgLTAsMCArMSw3OSBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OgorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjoKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjoKKworOjoKKzo6IERldGVjdCB0aGUgY29tcGlsZXIgZWRpdGlvbiB3ZSdyZSBidWlsZGluZyBpbiBhbmQgdGhlbgorOjogc2V0IHRoZSBHRU5FUkFUT1IgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gb25lIG9mOgorOjoKKzo6ICBWaXN1YWwgU3R1ZGlvIDE1IDIwMTcgW2FyY2hdID0gR2VuZXJhdGVzIFZpc3VhbCBTdHVkaW8gMjAxNyBwcm9qZWN0IGZpbGVzLgorOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbCBbYXJjaF0gY2FuIGJlICJXaW42NCIgb3IgIkFSTSIuCis6OiAgVmlzdWFsIFN0dWRpbyAxNCAyMDE1IFthcmNoXSA9IEdlbmVyYXRlcyBWaXN1YWwgU3R1ZGlvIDIwMTUgcHJvamVjdCBmaWxlcy4KKzo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWwgW2FyY2hdIGNhbiBiZSAiV2luNjQiIG9yICJBUk0iLgorOjogIFZpc3VhbCBTdHVkaW8gMTIgMjAxMyBbYXJjaF0gPSBHZW5lcmF0ZXMgVmlzdWFsIFN0dWRpbyAyMDEzIHByb2plY3QgZmlsZXMuCis6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsIFthcmNoXSBjYW4gYmUgIldpbjY0IiBvciAiQVJNIi4KKzo6ICBWaXN1YWwgU3R1ZGlvIDExIDIwMTIgW2FyY2hdID0gR2VuZXJhdGVzIFZpc3VhbCBTdHVkaW8gMjAxMiBwcm9qZWN0IGZpbGVzLgorOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbCBbYXJjaF0gY2FuIGJlICJXaW42NCIgb3IgIkFSTSIuCis6OiAgVmlzdWFsIFN0dWRpbyAxMCAyMDEwIFthcmNoXSA9IEdlbmVyYXRlcyBWaXN1YWwgU3R1ZGlvIDIwMTAgcHJvamVjdCBmaWxlcy4KKzo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWwgW2FyY2hdIGNhbiBiZSAiV2luNjQiIG9yICJJQTY0Ii4KKzo6ICBNaW5HVyBNYWtlZmlsZXMgICAgICAgICAgICAgID0gR2VuZXJhdGVzIG1ha2VmaWxlcyBmb3IgTWluR1cKKzo6ICBNU1lTIE1ha2VmaWxlcyAgICAgICAgICAgICAgID0gR2VuZXJhdGVzIG1ha2VmaWxlcyBmb3IgTVNZUworOjogIFVuaXggTWFrZWZpbGVzICAgICAgICAgICAgICAgPSBHZW5lcmF0ZXMgbWFrZWZpbGVzIGZvciBDWUdXSU4KKzo6Cis6OiBIb25vcnMgYW55IGV4aXN0aW5nIEdFTkVSQVRPUiBlbnZpcm9ubWVudCB2YXJpYWJsZQorOjogICBzZXR0aW5nIGluc3RlYWQgb2Ygb3ZlcndyaXRpbmcgaXQsIHRvIGFsbG93IGl0Cis6OiAgIHRvIGJlIGZvcmNlZCBpZiBuZWVkZWQuCis6OgorOjogU2V0cyBFUlJPUkxFVkVMIHRvIDAgaWYgR0VORVJBVE9SIGNhbiBiZSBkZXRlcm1pbmVkLAorOjogICAgICAgICAgICAgICAgIHRvIDEgaWYgaXQgY2Fubm90LgorOjoKKworSUYgREVGSU5FRCBHRU5FUkFUT1IgKAorICBFQ0hPIFt3YXJuIF0gdXNpbmcgZXhpc3RpbmcgZW52aXJvbm1lbnQgdmFyaWFibGUgR0VORVJBVE9SCisgIEVYSVQgL0IgMAorKQorCisKK0lGICIlUFJPRklMRTp+MCw0JSIgPT0gIk1JTkciICgKKyAgU0VUIEdFTkVSQVRPUj1NaW5HVyBNYWtlZmlsZXMKKworKSBFTFNFIElGICIlUFJPRklMRTp+MCw0JSIgPT0gIkNZR1ciICgKKyAgU0VUIEdFTkVSQVRPUj1Vbml4IE1ha2VmaWxlcworCispIEVMU0UgSUYgIiVQUk9GSUxFOn4wLDQlIiA9PSAiTVNZUyIgKAorICBTRVQgR0VORVJBVE9SPU1TWVMgTWFrZWZpbGVzCispIEVMU0UgKAorICBJRiAvaSAiJVBMQVRGT1JNJSIgPT0gIng2NCIgU0VUIEdFTkFSQ0g9IFdpbjY0CisgIENBTEwgOkNIRUNLIDE2CisgIElGICFFUlJPUkxFVkVMISA9PSAwIFNFVCBHRU5FUkFUT1I9VmlzdWFsIFN0dWRpbyAxMCAyMDEwIUdFTkFSQ0ghCisgIENBTEwgOkNIRUNLIDE3CisgIElGICFFUlJPUkxFVkVMISA9PSAwIFNFVCBHRU5FUkFUT1I9VmlzdWFsIFN0dWRpbyAxMSAyMDEyIUdFTkFSQ0ghCisgIENBTEwgOkNIRUNLIDE4CisgIElGICFFUlJPUkxFVkVMISA9PSAwIFNFVCBHRU5FUkFUT1I9VmlzdWFsIFN0dWRpbyAxMiAyMDEzIUdFTkFSQ0ghCisgIENBTEwgOkNIRUNLIDE5LjAKKyAgSUYgIUVSUk9STEVWRUwhID09IDAgU0VUIEdFTkVSQVRPUj1WaXN1YWwgU3R1ZGlvIDE0IDIwMTUhR0VOQVJDSCEKKyAgQ0FMTCA6Q0hFQ0sgMTkuMQorICBJRiAhRVJST1JMRVZFTCEgPT0gMCBTRVQgR0VORVJBVE9SPVZpc3VhbCBTdHVkaW8gMTUgMjAxNyFHRU5BUkNIIQorKQorCitJRiBOT1QgREVGSU5FRCBHRU5FUkFUT1IgKAorICBFQ0hPIFtlcnJvcl0gdW5hYmxlIHRvIGRldGVybWluZSB0aGUgQ01ha2UgZ2VuZXJhdG9yIHRvIHVzZQorICBFWElUIC9CIDEKKykKKworRUNITyBbaW5mbyBdIHVzaW5nIENNYWtlIGdlbmVyYXRvciAgICAgICAgJUdFTkVSQVRPUiUKK0VYSVQgL0IgMAorCis6Q0hFQ0sKK2NsIC8/IDI+JjEgfCBmaW5kc3RyIC9DOiJWZXJzaW9uICUxJSIgPiBudWwKK0VYSVQgL0IKZGlmZiAtLWdpdCBhL2J1aWxkL2FwcHZleW9yL2NsX3Nob3dlbnYuYmF0IGIvYnVpbGQvYXBwdmV5b3IvY2xfc2hvd2Vudi5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTcwYTQ5MAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL2NsX3Nob3dlbnYuYmF0CkBAIC0wLDAgKzEsNjMgQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjoKKzo6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzo6Cis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6CisKK0VDSE8vCitFQ0hPID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0lGICIlUFJPRklMRTp+MCw0JSIgPT0gIk1TVkMiICgKK0VDSE8gVmVyc2lvbnMKK0VDSE8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRUNITyBib29zdCAgICAgICAgICAgICAgICAgPSAlQk9PU1RfVkVSU0lPTiUKK0VDSE8gbGliZXZlbnQgICAgICAgICAgICAgID0gJUxJQkVWRU5UX1ZFUlNJT04lCitFQ0hPIHB5dGhvbiAgICAgICAgICAgICAgICA9ICVQWVRIT05fVkVSU0lPTiUKK0VDSE8gcXQgICAgICAgICAgICAgICAgICAgID0gJVFUX1ZFUlNJT04lCitFQ0hPIHpsaWIgICAgICAgICAgICAgICAgICA9ICVaTElCX1ZFUlNJT04lCitFQ0hPLworKQorRUNITyBBcHB2ZXlvciBWYXJpYWJsZXMKK0VDSE8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRUNITyBBUFBWRVlPUl9CVUlMRF9GT0xERVIgPSAlQVBQVkVZT1JfQlVJTERfRk9MREVSJQorRUNITyBDT05GSUdVUkFUSU9OICAgICAgICAgPSAlQ09ORklHVVJBVElPTiUKK0VDSE8gUExBVEZPUk0gICAgICAgICAgICAgID0gJVBMQVRGT1JNJQorRUNITyBQUk9GSUxFICAgICAgICAgICAgICAgPSAlUFJPRklMRSUKK0VDSE8vCitFQ0hPIE91ciBWYXJpYWJsZXMKK0VDSE8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRUNITyBBUFBWRVlPUl9TQ1JJUFRTICAgICAgPSAlQVBQVkVZT1JfU0NSSVBUUyUKK0VDSE8gQkFTSCAgICAgICAgICAgICAgICAgID0gJUJBU0glCitFQ0hPIEJPT1NUX1JPT1QgICAgICAgICAgICA9ICVCT09TVF9ST09UJQorRUNITyBCT09TVF9JTkNMVURFRElSICAgICAgPSAlQk9PU1RfSU5DTFVERURJUiUKK0VDSE8gQk9PU1RfTElCUkFSWURJUiAgICAgID0gJUJPT1NUX0xJQlJBUllESVIlCitFQ0hPIEJVSUxERElSICAgICAgICAgICAgICA9ICVCVUlMRERJUiUKK0VDSE8gQ09NUElMRVIgICAgICAgICAgICAgID0gJUNPTVBJTEVSJQorRUNITyBHRU5FUkFUT1IgICAgICAgICAgICAgPSAlR0VORVJBVE9SJQorRUNITyBJTlNURElSICAgICAgICAgICAgICAgPSAlSU5TVERJUiUKK0VDSE8gSkFWQV9IT01FICAgICAgICAgICAgID0gJUpBVkFfSE9NRSUKK0VDSE8gT1BFTlNTTF9ST09UICAgICAgICAgID0gJU9QRU5TU0xfUk9PVCUKK0VDSE8gU0VUVVAgICAgICAgICAgICAgICAgID0gJVNFVFVQJQorRUNITyBTUkNESVIgICAgICAgICAgICAgICAgPSAlU1JDRElSJQorRUNITyBXSU4zUCAgICAgICAgICAgICAgICAgPSAlV0lOM1AlCitFQ0hPIFdJVEhfUFlUSE9OICAgICAgICAgICA9ICVXSVRIX1BZVEhPTiUKK0VDSE8gWkxJQl9TVEFUSUNfU1VGRklYICAgID0gJVpMSUJfU1RBVElDX1NVRkZJWCUKK0lGIE5PVCAiJVBST0ZJTEU6fjAsNCUiID09ICJNU1ZDIiAoCisgIEVDSE8vCisgIEVDSE8gVU5JWHkgUEFUSAorICBFQ0hPIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgJUJBU0glIC1sYyAiZWNobyAkUEFUSCIKKykKK0VDSE8vCitFQ0hPIFdpbmRvd3MgUEFUSAorRUNITyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFQ0hPICVQQVRIJQorRUNITyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitFQ0hPLwpkaWZmIC0tZ2l0IGEvYnVpbGQvYXBwdmV5b3Ivc2ltdWxhdGUtYXBwdmV5b3IuYmF0IGIvYnVpbGQvYXBwdmV5b3Ivc2ltdWxhdGUtYXBwdmV5b3IuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2NzRmNDAKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9hcHB2ZXlvci9zaW11bGF0ZS1hcHB2ZXlvci5iYXQKQEAgLTAsMCArMSwzNSBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OgorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjoKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjoKKworOjoKKzo6IEhlbHBzIGJ1aWxkIHRocmlmdCBieSBwcmV0ZW5kaW5nIHRvIGJlIGFwcHZleW9yCis6OiBVc2FnZToKKzo6ICAgY2QgYnVpbGRcYXBwdmV5b3IKKzo6ICAgc2ltdWxhdGUtYXBwdmV5b3IuYmF0IFtEZWJ1Z3xSZWxlYXNlXSBbeDg2fHg2NF0gW0NZR1dJTnxNSU5HV3xNU1ZDMjAxP10KKzo6CisKK0BFQ0hPIE9GRgorU0VUTE9DQUwgRW5hYmxlRGVsYXllZEV4cGFuc2lvbgorCitTRVQgQVBQVkVZT1JfQlVJTERfRk9MREVSPSV+ZHAwLi5cLi4KK1NFVCBDT05GSUdVUkFUSU9OPSUxCitTRVQgUExBVEZPUk09JTIKK1NFVCBQUk9GSUxFPSUzCisKK0NEICVBUFBWRVlPUl9CVUlMRF9GT0xERVIlCitDQUxMIGJ1aWxkXGFwcHZleW9yXCVQUk9GSUxFOn4wLDQlLWFwcHZleW9yLWluc3RhbGwuYmF0IHx8IEVYSVQgL0IKK0NEICVBUFBWRVlPUl9CVUlMRF9GT0xERVIlCitDQUxMIGJ1aWxkXGFwcHZleW9yXCVQUk9GSUxFOn4wLDQlLWFwcHZleW9yLWJ1aWxkLmJhdCAgIHx8IEVYSVQgL0IKK0NEICVBUFBWRVlPUl9CVUlMRF9GT0xERVIlCitDQUxMIGJ1aWxkXGFwcHZleW9yXCVQUk9GSUxFOn4wLDQlLWFwcHZleW9yLXRlc3QuYmF0CmRpZmYgLS1naXQgYS9idWlsZC9jbWFrZS9DUGFja0NvbmZpZy5jbWFrZSBiL2J1aWxkL2NtYWtlL0NQYWNrQ29uZmlnLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkYzFiNGUKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9jbWFrZS9DUGFja0NvbmZpZy5jbWFrZQpAQCAtMCwwICsxLDY4IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworCisjVE9ETzogU2hvdWxkIHdlIGJ1bmRsZSBzeXN0ZW0gbGlicmFyaWVzIGZvciBETExzPworI2luY2x1ZGUoSW5zdGFsbFJlcXVpcmVkU3lzdGVtTGlicmFyaWVzKQorCisjIEZvciBoZWxwIHRha2UgYSBsb29rIGF0OgorIyBodHRwOi8vd3d3LmNtYWtlLm9yZy9XaWtpL0NNYWtlOkNQYWNrQ29uZmlndXJhdGlvbgorCisjIyMgZ2VuZXJhbCBzZXR0aW5ncworc2V0KENQQUNLX1BBQ0tBR0VfTkFNRSAidGhyaWZ0IikKK3NldChDUEFDS19QQUNLQUdFX1ZFUlNJT04gIiR7UEFDS0FHRV9WRVJTSU9OfSIpCitzZXQoQ1BBQ0tfUEFDS0FHRV9ERVNDUklQVElPTl9TVU1NQVJZICJBcGFjaGUgVGhyaWZ0IikKK3NldChDUEFDS19QQUNLQUdFX0RFU0NSSVBUSU9OX0ZJTEUgIiR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9SRUFETUUubWQiKQorc2V0KENQQUNLX1JFU09VUkNFX0ZJTEVfTElDRU5TRSAiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L0xJQ0VOU0UiKQorc2V0KENQQUNLX1BBQ0tBR0VfVkVORE9SICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpCitzZXQoQ1BBQ0tfUEFDS0FHRV9DT05UQUNUICJkZXZAdGhyaWZ0LmFwYWNoZS5vcmciKQorc2V0KENQQUNLX1BBQ0tBR0VfSU5TVEFMTF9ESVJFQ1RPUlkgIiR7Q1BBQ0tfUEFDS0FHRV9OQU1FfSIpCitzZXQoQ1BBQ0tfU1lTVEVNX05BTUUgIiR7Q01BS0VfU1lTVEVNX05BTUV9IikKKworIyMjIHZlcnNpb25zCitzZXQoQ1BBQ0tfUEFDS0FHRV9WRVJTSU9OX01BSk9SICR7dGhyaWZ0X1ZFUlNJT05fTUFKT1J9KQorc2V0KENQQUNLX1BBQ0tBR0VfVkVSU0lPTl9NSU5PUiAke3RocmlmdF9WRVJTSU9OX01JTk9SfSkKK3NldChDUEFDS19QQUNLQUdFX1ZFUlNJT05fUEFUQ0ggJHt0aHJpZnRfVkVSU0lPTl9QQVRDSH0pCisKKyMjIyBzb3VyY2UgZ2VuZXJhdG9yCitzZXQoQ1BBQ0tfU09VUkNFX0dFTkVSQVRPUiAiVEdaIikKK3NldChDUEFDS19TT1VSQ0VfSUdOT1JFX0ZJTEVTICJ+JDtbLl1zd3AkOy9bLl1zdm4vOy9bLl1naXQvOy5naXRpZ25vcmU7L2J1aWxkLzt0YWdzO2NzY29wZS4qIikKK3NldChDUEFDS19TT1VSQ0VfUEFDS0FHRV9GSUxFX05BTUUgIiR7Q1BBQ0tfUEFDS0FHRV9OQU1FfS0ke0NQQUNLX1BBQ0tBR0VfVkVSU0lPTn0iKQorCisjIyMgemlwIGdlbmVyYXRvcgorc2V0KENQQUNLX0dFTkVSQVRPUiAiWklQIikKK3NldChDUEFDS19QQUNLQUdFX0lOU1RBTExfRElSRUNUT1JZICJ0aHJpZnQiKQorCisKK2lmKENNQUtFX1NZU1RFTV9OQU1FIFNUUkVRVUFMICJXaW5kb3dzIikKKyAgICBzZXQoQ1BBQ0tfR0VORVJBVE9SICJOU0lTIikKKyAgICBzZXQoQ1BBQ0tfTlNJU19IRUxQX0xJTksgImh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZyIpCisgICAgc2V0KENQQUNLX05TSVNfTUVOVV9MSU5LUworICAgICAgICAiaHR0cDovL3RocmlmdC5hcGFjaGUub3JnIiAiQXBhY2hlIFRocmlmdCAtIFdlYiBTaXRlIgorICAgICAgICAiaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQiICJBcGFjaGUgVGhyaWZ0IC0gSXNzdWVzIikKKyAgICBzZXQoQ1BBQ0tfTlNJU19DT05UQUNUICR7Q1BBQ0tfUEFDS0FHRV9DT05UQUNUfSkKKyAgICBzZXQoQ1BBQ0tfTlNJU19NT0RJRllfUEFUSCAiT04iKQorICAgIHNldChDUEFDS19QQUNLQUdFX0lOU1RBTExfRElSRUNUT1JZICIke0NQQUNLX1BBQ0tBR0VfTkFNRX0iKQorZWxzZSgpCisgICAgc2V0KENQQUNLX0dFTkVSQVRPUiAiREVCIiApCisgICAgc2V0KENQQUNLX0RFQklBTl9QQUNLQUdFX01BSU5UQUlORVIgJHtDUEFDS19QQUNLQUdFX0NPTlRBQ1R9KQorZW5kaWYoKQorCisKK2luY2x1ZGUoQ1BhY2spCmRpZmYgLS1naXQgYS9idWlsZC9jbWFrZS9Db25maWd1cmVDaGVja3MuY21ha2UgYi9idWlsZC9jbWFrZS9Db25maWd1cmVDaGVja3MuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU3YmZlMAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2NtYWtlL0NvbmZpZ3VyZUNoZWNrcy5jbWFrZQpAQCAtMCwwICsxLDc5IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworaW5jbHVkZShDaGVja0Z1bmN0aW9uRXhpc3RzKQoraW5jbHVkZShDaGVja0luY2x1ZGVGaWxlKQoraW5jbHVkZShDaGVja0luY2x1ZGVGaWxlcykKK2luY2x1ZGUoQ2hlY2tTeW1ib2xFeGlzdHMpCisKK2lmIChJbnR0eXBlc19GT1VORCkKKyAgIyBUaGlzIGFsbG93cyB0aGUgaW50dHlwZXMuaCBhbmQgc3RkaW50LmggY2hlY2tzIHRvIHN1Y2NlZWQgb24gcGxhdGZvcm1zIHRoYXQKKyAgIyBkbyBub3QgbmF0aXZlbHkgcHJvdmlkZSB0aGVyZS4KKyAgc2V0IChDTUFLRV9SRVFVSVJFRF9JTkNMVURFUyAke0lOVFRZUEVTX0lOQ0xVREVfRElSU30pCitlbmRpZiAoKQorCitjaGVja19pbmNsdWRlX2ZpbGUoYXJwYS9pbmV0LmggSEFWRV9BUlBBX0lORVRfSCkKK2NoZWNrX2luY2x1ZGVfZmlsZShmY250bC5oIEhBVkVfRkNOVExfSCkKK2NoZWNrX2luY2x1ZGVfZmlsZShnZXRvcHQuaCBIQVZFX0dFVE9QVF9IKQorY2hlY2tfaW5jbHVkZV9maWxlKGludHR5cGVzLmggSEFWRV9JTlRUWVBFU19IKQorY2hlY2tfaW5jbHVkZV9maWxlKG5ldGRiLmggSEFWRV9ORVREQl9IKQorY2hlY2tfaW5jbHVkZV9maWxlKG5ldGluZXQvaW4uaCBIQVZFX05FVElORVRfSU5fSCkKK2NoZWNrX2luY2x1ZGVfZmlsZShzaWduYWwuaCBIQVZFX1NJR05BTF9IKQorY2hlY2tfaW5jbHVkZV9maWxlKHN0ZGludC5oIEhBVkVfU1RESU5UX0gpCitjaGVja19pbmNsdWRlX2ZpbGUodW5pc3RkLmggSEFWRV9VTklTVERfSCkKK2NoZWNrX2luY2x1ZGVfZmlsZShwdGhyZWFkLmggSEFWRV9QVEhSRUFEX0gpCitjaGVja19pbmNsdWRlX2ZpbGUoc3lzL2lvY3RsLmggSEFWRV9TWVNfSU9DVExfSCkKK2NoZWNrX2luY2x1ZGVfZmlsZShzeXMvcGFyYW0uaCBIQVZFX1NZU19QQVJBTV9IKQorY2hlY2tfaW5jbHVkZV9maWxlKHN5cy9yZXNvdXJjZS5oIEhBVkVfU1lTX1JFU09VUkNFX0gpCitjaGVja19pbmNsdWRlX2ZpbGUoc3lzL3NvY2tldC5oIEhBVkVfU1lTX1NPQ0tFVF9IKQorY2hlY2tfaW5jbHVkZV9maWxlKHN5cy9zdGF0LmggSEFWRV9TWVNfU1RBVF9IKQorY2hlY2tfaW5jbHVkZV9maWxlKHN5cy90aW1lLmggSEFWRV9TWVNfVElNRV9IKQorY2hlY2tfaW5jbHVkZV9maWxlKHN5cy91bi5oIEhBVkVfU1lTX1VOX0gpCitjaGVja19pbmNsdWRlX2ZpbGUocG9sbC5oIEhBVkVfUE9MTF9IKQorY2hlY2tfaW5jbHVkZV9maWxlKHN5cy9wb2xsLmggSEFWRV9TWVNfUE9MTF9IKQorY2hlY2tfaW5jbHVkZV9maWxlKHN5cy9zZWxlY3QuaCBIQVZFX1NZU19TRUxFQ1RfSCkKK2NoZWNrX2luY2x1ZGVfZmlsZShzY2hlZC5oIEhBVkVfU0NIRURfSCkKK2NoZWNrX2luY2x1ZGVfZmlsZShzdHJpbmcuaCBIQVZFX1NUUklOR19IKQorY2hlY2tfaW5jbHVkZV9maWxlKHN0cmluZ3MuaCBIQVZFX1NUUklOR1NfSCkKKworY2hlY2tfZnVuY3Rpb25fZXhpc3RzKGdldGhvc3RieW5hbWUgSEFWRV9HRVRIT1NUQllOQU1FKQorY2hlY2tfZnVuY3Rpb25fZXhpc3RzKGdldGhvc3RieW5hbWVfciBIQVZFX0dFVEhPU1RCWU5BTUVfUikKK2NoZWNrX2Z1bmN0aW9uX2V4aXN0cyhzdHJlcnJvcl9yIEhBVkVfU1RSRVJST1JfUikKK2NoZWNrX2Z1bmN0aW9uX2V4aXN0cyhzY2hlZF9nZXRfcHJpb3JpdHlfbWF4IEhBVkVfU0NIRURfR0VUX1BSSU9SSVRZX01BWCkKK2NoZWNrX2Z1bmN0aW9uX2V4aXN0cyhzY2hlZF9nZXRfcHJpb3JpdHlfbWluIEhBVkVfU0NIRURfR0VUX1BSSU9SSVRZX01JTikKKworaW5jbHVkZShDaGVja0NTb3VyY2VDb21waWxlcykKK2luY2x1ZGUoQ2hlY2tDWFhTb3VyY2VDb21waWxlcykKKworY2hlY2tfY3h4X3NvdXJjZV9jb21waWxlcygKKyAgIgorICAjaW5jbHVkZSA8c3RyaW5nLmg+CisgIGludCBtYWluKCl7Y2hhciBiO2NoYXIgKmEgPSBzdHJlcnJvcl9yKDAsICZiLCAwKTsgcmV0dXJuKDApO30KKyAgIgorICBTVFJFUlJPUl9SX0NIQVJfUCkKKworCitzZXQoUEFDS0FHRSAke1BBQ0tBR0VfTkFNRX0pCitzZXQoUEFDS0FHRV9TVFJJTkcgIiR7UEFDS0FHRV9OQU1FfSAke1BBQ0tBR0VfVkVSU0lPTn0iKQorc2V0KFZFUlNJT04gJHt0aHJpZnRfVkVSU0lPTn0pCisKKyMgZ2VuZXJhdGUgYSBjb25maWcuaCBmaWxlCitjb25maWd1cmVfZmlsZSgiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2J1aWxkL2NtYWtlL2NvbmZpZy5oLmluIiAiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3RocmlmdC9jb25maWcuaCIpCisKK2luY2x1ZGVfZGlyZWN0b3JpZXMoIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfSIpCmRpZmYgLS1naXQgYS9idWlsZC9jbWFrZS9EZWZpbmVDTWFrZURlZmF1bHRzLmNtYWtlIGIvYnVpbGQvY21ha2UvRGVmaW5lQ01ha2VEZWZhdWx0cy5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzI1NWUwCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvY21ha2UvRGVmaW5lQ01ha2VEZWZhdWx0cy5jbWFrZQpAQCAtMCwwICsxLDkwIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworCisjIEFsd2F5cyBpbmNsdWRlIHNyY2RpciBhbmQgYnVpbGRkaXIgaW4gaW5jbHVkZSBwYXRoCisjIFRoaXMgc2F2ZXMgdHlwaW5nICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfSAke0NNQUtFX0NVUlJFTlRfQklOQVJZfSBpbgorIyBhYm91dCBldmVyeSBzdWJkaXIKKyMgc2luY2UgY21ha2UgMi40LjAKK3NldChDTUFLRV9JTkNMVURFX0NVUlJFTlRfRElSIE9OKQorCisjIFB1dCB0aGUgaW5jbHVkZSBkaXJzIHdoaWNoIGFyZSBpbiB0aGUgc291cmNlIG9yIGJ1aWxkIHRyZWUKKyMgYmVmb3JlIGFsbCBvdGhlciBpbmNsdWRlIGRpcnMsIHNvIHRoZSBoZWFkZXJzIGluIHRoZSBzb3VyY2VzCisjIGFyZSBwcmVmZXJyZWQgb3ZlciB0aGUgYWxyZWFkeSBpbnN0YWxsZWQgb25lcworIyBzaW5jZSBjbWFrZSAyLjQuMQorc2V0KENNQUtFX0lOQ0xVREVfRElSRUNUT1JJRVNfUFJPSkVDVF9CRUZPUkUgT04pCisKKyMgVXNlIGNvbG9yZWQgb3V0cHV0CisjIHNpbmNlIGNtYWtlIDIuNC4wCitzZXQoQ01BS0VfQ09MT1JfTUFLRUZJTEUgT04pCisKKyMgRGVmaW5lIHRoZSBnZW5lcmljIHZlcnNpb24gb2YgdGhlIGxpYnJhcmllcyBoZXJlCitzZXQoR0VORVJJQ19MSUJfVkVSU0lPTiAiMS4wLjAiKQorc2V0KEdFTkVSSUNfTElCX1NPVkVSU0lPTiAiMCIpCisKKyMgU2V0IHRoZSBkZWZhdWx0IGJ1aWxkIHR5cGUgdG8gcmVsZWFzZSB3aXRoIGRlYnVnIGluZm8KK2lmIChOT1QgQ01BS0VfQlVJTERfVFlQRSkKKyAgc2V0KENNQUtFX0JVSUxEX1RZUEUgUmVsV2l0aERlYkluZm8KKyAgICBDQUNIRSBTVFJJTkcKKyAgICAgICJDaG9vc2UgdGhlIHR5cGUgb2YgYnVpbGQsIG9wdGlvbnMgYXJlOiBOb25lIERlYnVnIFJlbGVhc2UgUmVsV2l0aERlYkluZm8gTWluU2l6ZVJlbC4iCisgICkKK2VuZGlmIChOT1QgQ01BS0VfQlVJTERfVFlQRSkKKworIyBDcmVhdGUgdGhlIGNvbXBpbGUgY29tbWFuZCBkYXRhYmFzZSBmb3IgY2xhbmcgYnkgZGVmYXVsdAorc2V0KENNQUtFX0VYUE9SVF9DT01QSUxFX0NPTU1BTkRTIE9OKQorCisjIFB1dCB0aGUgbGlicmFyaWVzIGFuZCBiaW5hcmllcyB0aGF0IGdldCBidWlsdCBpbnRvIGRpcmVjdG9yaWVzIGF0IHRoZQorIyB0b3Agb2YgdGhlIGJ1aWxkIHRyZWUgcmF0aGVyIHRoYW4gaW4gaGFyZC10by1maW5kIGxlYWYKKyMgZGlyZWN0b3JpZXMuIFRoaXMgc2ltcGxpZmllcyBtYW51YWwgdGVzdGluZyBhbmQgdGhlIHVzZSBvZiB0aGUgYnVpbGQKKyMgdHJlZSByYXRoZXIgdGhhbiBpbnN0YWxsZWQgdGhyaWZ0IGxpYnJhcmllcy4KK3NldChDTUFLRV9MSUJSQVJZX09VVFBVVF9ESVJFQ1RPUlkgJHtDTUFLRV9CSU5BUllfRElSfS9saWIpCitzZXQoQ01BS0VfQVJDSElWRV9PVVRQVVRfRElSRUNUT1JZICR7Q01BS0VfQklOQVJZX0RJUn0vbGliKQorc2V0KENNQUtFX1JVTlRJTUVfT1VUUFVUX0RJUkVDVE9SWSAke0NNQUtFX0JJTkFSWV9ESVJ9L2JpbikKKworIworIyAicnBhdGgiIHN1cHBvcnQuCisjIFNlZSBodHRwOi8vd3d3Lml0ay5vcmcvV2lraS9pbmRleC5waHA/dGl0bGU9Q01ha2VfUlBBVEhfaGFuZGxpbmcKKyMKKyMgT24gTWFjT1NYLCBmb3Igc2hhcmVkIGxpYnJhcmllcywgZW5hYmxlIHJwYXRoIHN1cHBvcnQuCitzZXQoQ01BS0VfTUFDT1NYX1JQQVRIIFRSVUUpCisjCisjIE9uIGFueSBPUywgZm9yIGV4ZWN1dGFibGVzLCBhbGxvdyBsaW5raW5nIHdpdGggc2hhcmVkIGxpYnJhcmllcyBpbiBub24tc3lzdGVtCisjIGxvY2F0aW9ucyBhbmQgcnVubmluZyB0aGUgZXhlY3V0YWJsZXMgd2l0aG91dCBMRF9QUkVMT0FEIG9yIHNpbWlsYXIuCisjIFRoaXMgcmVxdWlyZXMgdGhlIGxpYnJhcnkgdG8gYmUgYnVpbHQgd2l0aCBycGF0aCBzdXBwb3J0Lgorc2V0KENNQUtFX0lOU1RBTExfUlBBVEhfVVNFX0xJTktfUEFUSCBUUlVFKQorCisjCisjIEMrKyBMYW5ndWFnZSBMZXZlbCBEZWZhdWx0cyAtIHRoaXMgZGVwZW5kcyBvbiB0aGUgY29tcGlsZXIgY2FwYWJpbGl0aWVzCisjCitpZiAoTk9UIERFRklORUQgQ01BS0VfQ1hYX1NUQU5EQVJEKQorICBzZXQoQ01BS0VfQ1hYX1NUQU5EQVJEIDExKSAjIEMrKzExCisgIG1lc3NhZ2UoU1RBVFVTICJTZXR0aW5nIEMrKzExIGFzIHRoZSBkZWZhdWx0IGxhbmd1YWdlIGxldmVsLiIpCisgIG1lc3NhZ2UoU1RBVFVTICJUbyBzcGVjaWZ5IGEgZGlmZmVyZW50IEMrKyBsYW5ndWFnZSBsZXZlbCwgc2V0IENNQUtFX0NYWF9TVEFOREFSRCIpCitlbmRpZigpCisKK2lmIChDTUFLRV9DWFhfU1RBTkRBUkQgRVFVQUwgOTgpCisgIG1lc3NhZ2UoRkFUQUxfRVJST1IgIm9ubHkgQysrMTEgb3IgYWJvdmUgQysrIHN0YW5kYXJkIGlzIHN1cHBvcnRlZCIpCitlbHNlaWYgKENNQUtFX0NYWF9TVEFOREFSRCBFUVVBTCAxMSkKKyAgIyBzaG91bGQgbm90IGZhbGxiYWNrIHRvIEMrKzk4CisgIHNldChDTUFLRV9DWFhfU1RBTkRBUkRfUkVRVUlSRUQgT04pCitlbmRpZigpCisKK2lmIChOT1QgREVGSU5FRCBDTUFLRV9DWFhfRVhURU5TSU9OUykKKyAgc2V0KENNQUtFX0NYWF9FWFRFTlNJT05TIE9GRikgICAgICAgICMgdXNlIHN0YW5kYXJkcyBjb21wbGlhbnQgbGFuZ3VhZ2UgbGV2ZWwgZm9yIHBvcnRhYmlsaXR5CitlbmRpZigpCmRpZmYgLS1naXQgYS9idWlsZC9jbWFrZS9EZWZpbmVJbnN0YWxsYXRpb25QYXRocy5jbWFrZSBiL2J1aWxkL2NtYWtlL0RlZmluZUluc3RhbGxhdGlvblBhdGhzLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyMmYwZjYKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9jbWFrZS9EZWZpbmVJbnN0YWxsYXRpb25QYXRocy5jbWFrZQpAQCAtMCwwICsxLDI2IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworCisjIERlZmluZSB0aGUgZGVmYXVsdCBpbnN0YWxsIHBhdGhzCitzZXQoQklOX0lOU1RBTExfRElSICJiaW4iIENBQ0hFIFBBVEggIlRoZSBiaW5hcnkgaW5zdGFsbCBkaXIgKGRlZmF1bHQ6IGJpbikiKQorc2V0KExJQl9JTlNUQUxMX0RJUiAibGliJHtMSUJfU1VGRklYfSIgQ0FDSEUgUEFUSCAiVGhlIGxpYnJhcnkgaW5zdGFsbCBkaXIgKGRlZmF1bHQ6IGxpYiR7TElCX1NVRkZJWH0pIikKK3NldChJTkNMVURFX0lOU1RBTExfRElSICJpbmNsdWRlIiBDQUNIRSBQQVRIICJUaGUgbGlicmFyeSBpbnN0YWxsIGRpciAoZGVmYXVsdDogaW5jbHVkZSkiKQorc2V0KENNQUtFX0lOU1RBTExfRElSICJjbWFrZSIgQ0FDSEUgUEFUSCAiVGhlIHN1YmRpcmVjdG9yeSB0byBpbnN0YWxsIGNtYWtlIGNvbmZpZyBmaWxlcyAoZGVmYXVsdDogY21ha2UpIikKK3NldChET0NfSU5TVEFMTF9ESVIgInNoYXJlL2RvYyIgQ0FDSEUgUEFUSCAiVGhlIHN1YmRpcmVjdG9yeSB0byBpbnN0YWxsIGRvY3VtZW50YXRpb24gZmlsZXMgKGRlZmF1bHQ6IHNoYXJlL2RvYykiKQpkaWZmIC0tZ2l0IGEvYnVpbGQvY21ha2UvRGVmaW5lT3B0aW9ucy5jbWFrZSBiL2J1aWxkL2NtYWtlL0RlZmluZU9wdGlvbnMuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFmZjUzYwotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2NtYWtlL0RlZmluZU9wdGlvbnMuY21ha2UKQEAgLTAsMCArMSwyMDQgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisKK2luY2x1ZGUoQ01ha2VEZXBlbmRlbnRPcHRpb24pCisKK3NldChUSFJJRlRfQ09NUElMRVIgIiIgQ0FDSEUgRklMRVBBVEggIkV4dGVybmFsIFRocmlmdCBjb21waWxlciB0byB1c2UgZHVyaW5nIGJ1aWxkIikKKworIyBBZGRpdGlvbmFsIGNvbXBvbmVudHMKK29wdGlvbihCVUlMRF9DT01QSUxFUiAiQnVpbGQgVGhyaWZ0IGNvbXBpbGVyIiBPTikKKworaWYoQlVJTERfQ09NUElMRVIgT1IgRVhJU1RTICR7VEhSSUZUX0NPTVBJTEVSfSkKKyAgICBzZXQoSEFWRV9DT01QSUxFUiBPTikKK2VuZGlmKCkKK0NNQUtFX0RFUEVOREVOVF9PUFRJT04oQlVJTERfVEVTVElORyAiQnVpbGQgd2l0aCB1bml0IHRlc3RzIiBPTiAiSEFWRV9DT01QSUxFUiIgT0ZGKQorQ01BS0VfREVQRU5ERU5UX09QVElPTihCVUlMRF9FWEFNUExFUyAiQnVpbGQgZXhhbXBsZXMiIE9OICJIQVZFX0NPTVBJTEVSIiBPRkYpCitDTUFLRV9ERVBFTkRFTlRfT1BUSU9OKEJVSUxEX1RVVE9SSUFMUyAiQnVpbGQgVGhyaWZ0IHR1dG9yaWFscyIgT04gIkhBVkVfQ09NUElMRVIiIE9GRikKK29wdGlvbihCVUlMRF9MSUJSQVJJRVMgIkJ1aWxkIFRocmlmdCBsaWJyYXJpZXMiIE9OKQorCisjIExpYnJhcmllcyB0byBidWlsZAorCisjIEVhY2ggbGFuZ3VhZ2UgbGlicmFyeSBjYW4gYmUgZW5hYmxlZCBvciBkaXNhYmxlZCB1c2luZyB0aGUgV0lUSF88TEFORz4gZmxhZy4KKyMgQnkgZGVmYXVsdCBDTWFrZSBjaGVja3MgaWYgdGhlIHJlcXVpcmVkIGRlcGVuZGVuY2llcyBmb3IgYSBsYW5ndWFnZSBhcmUgcHJlc2VudAorIyBhbmQgZW5hYmxlcyB0aGUgbGlicmFyeSBpZiBhbGwgYXJlIGZvdW5kLiBUaGlzIG1lYW5zIHRoZSBkZWZhdWx0IGlzIHRvIGJ1aWxkIGFzCisjIG11Y2ggYXMgcG9zc2libGUgYnV0IGxlYXZpbmcgb3V0IGxpYnJhcmllcyBpZiB0aGVpciBkZXBlbmRlbmNpZXMgYXJlIG5vdCBtZXQuCisKK29wdGlvbihXSVRIX0JPT1NUX1NUQVRJQyAiQnVpbGQgd2l0aCBCb29zdCBzdGF0aWMgbGluayBsaWJyYXJ5IiBPRkYpCitzZXQoQm9vc3RfVVNFX1NUQVRJQ19MSUJTICR7V0lUSF9CT09TVF9TVEFUSUN9KQoraWYgKE5PVCBXSVRIX0JPT1NUX1NUQVRJQykKKyAgICBhZGRfZGVmaW5pdGlvbnMoLURCT09TVF9BTExfRFlOX0xJTkspCisgICAgYWRkX2RlZmluaXRpb25zKC1EQk9PU1RfVEVTVF9EWU5fTElOSykKK2VuZGlmKCkKKworIyBDKysKK29wdGlvbihXSVRIX0NQUCAiQnVpbGQgQysrIFRocmlmdCBsaWJyYXJ5IiBPTikKK2lmKFdJVEhfQ1BQKQorICAgIGZpbmRfcGFja2FnZShCb29zdCAxLjUzIFFVSUVUKQorICAgICMgTk9URTogQ3VycmVudGx5IHRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgQysrIHNwZWNpZmljLAorICAgICMgYnV0IGluIGZ1dHVyZSBvdGhlciBsaWJyYXJpZXMgbWlnaHQgcmV1c2UgdGhlbS4KKyAgICAjIFNvIHRoZXkgYXJlIG5vdCBkZXBlbmRlbnQgb24gV0lUSF9DUFAgYnV0IHNldHRpbmcgdGhlbSB3aXRob3V0IFdJVEhfQ1BQIGN1cnJlbnRseQorICAgICMgaGFzIG5vIGVmZmVjdC4KKyAgICBpZihaTElCX0xJQlJBUlkpCisgICAgICAgICMgRmluZFpMSUIuY21ha2UgZG9lcyBub3Qgbm9ybWFsaXplIHBhdGggc28gd2UgbmVlZCB0byBkbyBpdCBvdXJzZWx2ZXMuCisgICAgICAgIGZpbGUoVE9fQ01BS0VfUEFUSCAke1pMSUJfTElCUkFSWX0gWkxJQl9MSUJSQVJZKQorICAgIGVuZGlmKCkKKyAgICBmaW5kX3BhY2thZ2UoWkxJQiBRVUlFVCkKKyAgICBDTUFLRV9ERVBFTkRFTlRfT1BUSU9OKFdJVEhfWkxJQiAiQnVpbGQgd2l0aCBaTElCIHN1cHBvcnQiIE9OCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiWkxJQl9GT1VORCIgT0ZGKQorICAgIGZpbmRfcGFja2FnZShMaWJldmVudCBRVUlFVCkKKyAgICBDTUFLRV9ERVBFTkRFTlRfT1BUSU9OKFdJVEhfTElCRVZFTlQgIkJ1aWxkIHdpdGggbGliZXZlbnQgc3VwcG9ydCIgT04KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJMaWJldmVudF9GT1VORCIgT0ZGKQorICAgIGZpbmRfcGFja2FnZShRdDQgUVVJRVQgQ09NUE9ORU5UUyBRdENvcmUgUXROZXR3b3JrKQorICAgIENNQUtFX0RFUEVOREVOVF9PUFRJT04oV0lUSF9RVDQgIkJ1aWxkIHdpdGggUXQ0IHN1cHBvcnQiIE9OCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiUVQ0X0ZPVU5EIiBPRkYpCisgICAgZmluZF9wYWNrYWdlKFF0NSBRVUlFVCBDT01QT05FTlRTIENvcmUgTmV0d29yaykKKyAgICBDTUFLRV9ERVBFTkRFTlRfT1BUSU9OKFdJVEhfUVQ1ICJCdWlsZCB3aXRoIFF0NSBzdXBwb3J0IiBPTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlF0NV9GT1VORCIgT0ZGKQorICAgIGlmKCR7V0lUSF9RVDR9IEFORCAke1dJVEhfUVQ1fSBBTkQgJHtDTUFLRV9NQUpPUl9WRVJTSU9OfSBMRVNTIDMpCisgICAgICAjIGNtYWtlIDwgMy4wLjAgY2F1c2VzIGNvbmZsaWN0IHdoZW4gYnVpbGRpbmcgYm90aCBRdDQgYW5kIFF0NQorICAgICAgc2V0KFdJVEhfUVQ0IE9GRikKKyAgICBlbmRpZigpCisgICAgZmluZF9wYWNrYWdlKE9wZW5TU0wgUVVJRVQpCisgICAgQ01BS0VfREVQRU5ERU5UX09QVElPTihXSVRIX09QRU5TU0wgIkJ1aWxkIHdpdGggT3BlblNTTCBzdXBwb3J0IiBPTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9QRU5TU0xfRk9VTkQiIE9GRikKKyAgICBvcHRpb24oV0lUSF9TVERUSFJFQURTICJCdWlsZCB3aXRoIEMrKyBzdGQ6OnRocmVhZCBzdXBwb3J0IiBPTikKK2VuZGlmKCkKK0NNQUtFX0RFUEVOREVOVF9PUFRJT04oQlVJTERfQ1BQICJCdWlsZCBDKysgbGlicmFyeSIgT04KKyAgICAgICAgICAgICAgICAgICAgICAgIkJVSUxEX0xJQlJBUklFUztXSVRIX0NQUDtCb29zdF9GT1VORCIgT0ZGKQorQ01BS0VfREVQRU5ERU5UX09QVElPTihXSVRIX1BMVUdJTiAiQnVpbGQgY29tcGlsZXIgcGx1Z2luIHN1cHBvcnQiIE9GRgorICAgICAgICAgICAgICAgICAgICAgICAiQlVJTERfQ09NUElMRVI7QlVJTERfQ1BQIiBPRkYpCisKKyMgQyBHTGliCitvcHRpb24oV0lUSF9DX0dMSUIgIkJ1aWxkIEMgKEdMaWIpIFRocmlmdCBsaWJyYXJ5IiBPTikKK2lmKFdJVEhfQ19HTElCKQorICAgIGZpbmRfcGFja2FnZShHTElCIFFVSUVUIENPTVBPTkVOVFMgZ29iamVjdCkKK2VuZGlmKCkKK0NNQUtFX0RFUEVOREVOVF9PUFRJT04oQlVJTERfQ19HTElCICJCdWlsZCBDIChHTGliKSBsaWJyYXJ5IiBPTgorICAgICAgICAgICAgICAgICAgICAgICAiQlVJTERfTElCUkFSSUVTO1dJVEhfQ19HTElCO0dMSUJfRk9VTkQiIE9GRikKKworaWYoQlVJTERfQ1BQKQorICAgIHNldChib29zdF9jb21wb25lbnRzKQorICAgIGlmKEJVSUxEX1RFU1RJTkcpCisgICAgICAgIGxpc3QoQVBQRU5EIGJvb3N0X2NvbXBvbmVudHMgc3lzdGVtIHRocmVhZCkKKyAgICBlbmRpZigpCisgICAgaWYoQlVJTERfVEVTVElORykKKyAgICAgICAgbGlzdChBUFBFTkQgYm9vc3RfY29tcG9uZW50cyB1bml0X3Rlc3RfZnJhbWV3b3JrIGZpbGVzeXN0ZW0gY2hyb25vIHByb2dyYW1fb3B0aW9ucykKKyAgICBlbmRpZigpCisgICAgaWYoYm9vc3RfY29tcG9uZW50cykKKyAgICAgICAgZmluZF9wYWNrYWdlKEJvb3N0IDEuNTMgUkVRVUlSRUQgQ09NUE9ORU5UUyAke2Jvb3N0X2NvbXBvbmVudHN9KQorICAgIGVuZGlmKCkKK2Vsc2VpZihCVUlMRF9DX0dMSUIgQU5EIEJVSUxEX1RFU1RJTkcpCisgICAgZmluZF9wYWNrYWdlKEJvb3N0IDEuNTMgUkVRVUlSRUQpCitlbmRpZigpCisKKyMgSmF2YQorb3B0aW9uKFdJVEhfSkFWQSAiQnVpbGQgSmF2YSBUaHJpZnQgbGlicmFyeSIgT04pCitpZihBTkRST0lEKQorICAgIGZpbmRfcGFja2FnZShHcmFkbGUgUVVJRVQpCisgICAgQ01BS0VfREVQRU5ERU5UX09QVElPTihCVUlMRF9KQVZBICJCdWlsZCBKYXZhIGxpYnJhcnkiIE9OCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiQlVJTERfTElCUkFSSUVTO1dJVEhfSkFWQTtHUkFETEVfRk9VTkQiIE9GRikKK2Vsc2UoKQorICAgIGZpbmRfcGFja2FnZShHcmFkbGV3IFFVSUVUKQorICAgIGZpbmRfcGFja2FnZShKYXZhIFFVSUVUKQorICAgIENNQUtFX0RFUEVOREVOVF9PUFRJT04oQlVJTERfSkFWQSAiQnVpbGQgSmF2YSBsaWJyYXJ5IiBPTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJVSUxEX0xJQlJBUklFUztXSVRIX0pBVkE7SkFWQV9GT1VORDtHUkFETEVXX0ZPVU5EIiBPRkYpCitlbmRpZigpCisKKyMgUHl0aG9uCitvcHRpb24oV0lUSF9QWVRIT04gIkJ1aWxkIFB5dGhvbiBUaHJpZnQgbGlicmFyeSIgT04pCitmaW5kX3BhY2thZ2UoUHl0aG9uSW50ZXJwIFFVSUVUKSAjIGZvciBQeXRob24gZXhlY3V0YWJsZQorZmluZF9wYWNrYWdlKFB5dGhvbkxpYnMgUVVJRVQpICMgZm9yIFB5dGhvbi5oCitDTUFLRV9ERVBFTkRFTlRfT1BUSU9OKEJVSUxEX1BZVEhPTiAiQnVpbGQgUHl0aG9uIGxpYnJhcnkiIE9OCisgICAgICAgICAgICAgICAgICAgICAgICJCVUlMRF9MSUJSQVJJRVM7V0lUSF9QWVRIT047UFlUSE9OTElCU19GT1VORCIgT0ZGKQorCisjIEhhc2tlbGwKK29wdGlvbihXSVRIX0hBU0tFTEwgIkJ1aWxkIEhhc2tlbGwgVGhyaWZ0IGxpYnJhcnkiIE9OKQorZmluZF9wYWNrYWdlKEdIQyBRVUlFVCkKK2ZpbmRfcGFja2FnZShDYWJhbCBRVUlFVCkKK0NNQUtFX0RFUEVOREVOVF9PUFRJT04oQlVJTERfSEFTS0VMTCAiQnVpbGQgR0hDIGxpYnJhcnkiIE9OCisgICAgICAgICAgICAgICAgICAgICAgICJCVUlMRF9MSUJSQVJJRVM7V0lUSF9IQVNLRUxMO0dIQ19GT1VORDtDQUJBTF9GT1VORCIgT0ZGKQorCisjIENvbW1vbiBsaWJyYXJ5IG9wdGlvbnMKK29wdGlvbihXSVRIX1NIQVJFRF9MSUIgIkJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMiIE9OKQorb3B0aW9uKFdJVEhfU1RBVElDX0xJQiAiQnVpbGQgc3RhdGljIGxpYnJhcmllcyIgT04pCitpZiAoTk9UIFdJVEhfU0hBUkVEX0xJQiBBTkQgTk9UIFdJVEhfU1RBVElDX0xJQikKKyAgICBtZXNzYWdlKEZBVEFMX0VSUk9SICJDYW5ub3QgYnVpbGQgd2l0aCBib3RoIHNoYXJlZCBhbmQgc3RhdGljIG91dHB1dHMgZGlzYWJsZWQhIikKK2VuZGlmKCkKKworI05PVEU6IEMrKyBjb21waWxlciBvcHRpb25zIGFyZSBkZWZpbmVkIGluIHRoZSBsaWIvY3BwL0NNYWtlTGlzdHMudHh0CisKKyMgVmlzdWFsIFN0dWRpbyBvbmx5IG9wdGlvbnMKK2lmKE1TVkMpCitvcHRpb24oV0lUSF9NVCAiQnVpbGQgdXNpbmcgTVQgaW5zdGVhZCBvZiBNRCAoTVNWQyBvbmx5KSIgT0ZGKQorZW5kaWYoTVNWQykKKworbWFjcm8oTUVTU0FHRV9ERVAgZmxhZyBzdW1tYXJ5KQoraWYoTk9UICR7ZmxhZ30pCisgIG1lc3NhZ2UoU1RBVFVTICIgICAtICR7c3VtbWFyeX0iKQorZW5kaWYoKQorZW5kbWFjcm8oTUVTU0FHRV9ERVAgZmxhZyBzdW1tYXJ5KQorCittYWNybyhQUklOVF9DT05GSUdfU1VNTUFSWSkKK21lc3NhZ2UoU1RBVFVTICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIikKK21lc3NhZ2UoU1RBVFVTICJUaHJpZnQgdmVyc2lvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHt0aHJpZnRfVkVSU0lPTn0gKCR7dGhyaWZ0X1ZFUlNJT05fTUFKT1J9LiR7dGhyaWZ0X1ZFUlNJT05fTUlOT1J9LiR7dGhyaWZ0X1ZFUlNJT05fUEFUQ0h9KSIpCittZXNzYWdlKFNUQVRVUyAiVGhyaWZ0IHBhY2thZ2UgdmVyc2lvbjogICAgICAgICAgICAgICAgICAgICAgICR7UEFDS0FHRV9WRVJTSU9OfSIpCittZXNzYWdlKFNUQVRVUyAiQnVpbGQgY29uZmlndXJhdGlvbiBTdW1tYXJ5IikKK21lc3NhZ2UoU1RBVFVTICIgIEJ1aWxkIFRocmlmdCBjb21waWxlcjogICAgICAgICAgICAgICAgICAgICAgJHtCVUlMRF9DT01QSUxFUn0iKQorbWVzc2FnZShTVEFUVVMgIiAgQnVpbGQgY29tcGlsZXIgcGx1Z2luIHN1cHBvcnQ6ICAgICAgICAgICAgICAke1dJVEhfUExVR0lOfSIpCittZXNzYWdlKFNUQVRVUyAiICBCdWlsZCB3aXRoIHVuaXQgdGVzdHM6ICAgICAgICAgICAgICAgICAgICAgICR7QlVJTERfVEVTVElOR30iKQorTUVTU0FHRV9ERVAoSEFWRV9DT01QSUxFUiAiRGlzYWJsZWQgYmVjYXVzZSBCVUlMRF9USFJJRlQ9T0ZGIGFuZCBubyB2YWxpZCBUSFJJRlRfQ09NUElMRVIgaXMgZ2l2ZW4iKQorbWVzc2FnZShTVEFUVVMgIiAgQnVpbGQgZXhhbXBsZXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAke0JVSUxEX0VYQU1QTEVTfSIpCitNRVNTQUdFX0RFUChIQVZFX0NPTVBJTEVSICJEaXNhYmxlZCBiZWNhdXNlIEJVSUxEX1RIUklGVD1PRkYgYW5kIG5vIHZhbGlkIFRIUklGVF9DT01QSUxFUiBpcyBnaXZlbiIpCittZXNzYWdlKFNUQVRVUyAiICBCdWlsZCBUaHJpZnQgbGlicmFyaWVzOiAgICAgICAgICAgICAgICAgICAgICR7QlVJTERfTElCUkFSSUVTfSIpCittZXNzYWdlKFNUQVRVUyAiIExhbmd1YWdlIGxpYnJhcmllczoiKQorbWVzc2FnZShTVEFUVVMgIiAgQnVpbGQgQysrIGxpYnJhcnk6ICAgICAgICAgICAgICAgICAgICAgICAgICAke0JVSUxEX0NQUH0iKQorTUVTU0FHRV9ERVAoV0lUSF9DUFAgIkRpc2FibGVkIGJ5IFdJVEhfQ1BQPU9GRiIpCitNRVNTQUdFX0RFUChCb29zdF9GT1VORCAiQm9vc3QgaGVhZGVycyBtaXNzaW5nIikKK21lc3NhZ2UoU1RBVFVTICIgICAgQysrIExhbmd1YWdlIExldmVsOiAgICAgICAgICAgICAgICAgICAgICAgJHtDWFhfTEFOR1VBR0VfTEVWRUx9IikKK21lc3NhZ2UoU1RBVFVTICIgIEJ1aWxkIEMgKEdMaWIpIGxpYnJhcnk6ICAgICAgICAgICAgICAgICAgICAgJHtCVUlMRF9DX0dMSUJ9IikKK01FU1NBR0VfREVQKFdJVEhfQ19HTElCICJEaXNhYmxlZCBieSBXSVRIX0NfR0xJQj1PRkYiKQorTUVTU0FHRV9ERVAoR0xJQl9GT1VORCAiR0xpYiBtaXNzaW5nIikKK21lc3NhZ2UoU1RBVFVTICIgIEJ1aWxkIEphdmEgbGlicmFyeTogICAgICAgICAgICAgICAgICAgICAgICAgJHtCVUlMRF9KQVZBfSIpCitNRVNTQUdFX0RFUChXSVRIX0pBVkEgIkRpc2FibGVkIGJ5IFdJVEhfSkFWQT1PRkYiKQoraWYoQU5EUk9JRCkKKyAgICBNRVNTQUdFX0RFUChHUkFETEVfRk9VTkQgIkdyYWRsZSBtaXNzaW5nIikKK2Vsc2UoKQorICAgIE1FU1NBR0VfREVQKEpBVkFfRk9VTkQgIkphdmEgUnVudGltZSBtaXNzaW5nIikKKyAgICBNRVNTQUdFX0RFUChHUkFETEVXX0ZPVU5EICJHcmFkbGUgV3JhcHBlciBtaXNzaW5nIikKK2VuZGlmKCkKK21lc3NhZ2UoU1RBVFVTICIgIEJ1aWxkIFB5dGhvbiBsaWJyYXJ5OiAgICAgICAgICAgICAgICAgICAgICAgJHtCVUlMRF9QWVRIT059IikKK01FU1NBR0VfREVQKFdJVEhfUFlUSE9OICJEaXNhYmxlZCBieSBXSVRIX1BZVEhPTj1PRkYiKQorTUVTU0FHRV9ERVAoUFlUSE9OTElCU19GT1VORCAiUHl0aG9uIGxpYnJhcmllcyBtaXNzaW5nIikKK21lc3NhZ2UoU1RBVFVTICIgIEJ1aWxkIEhhc2tlbGwgbGlicmFyeTogICAgICAgICAgICAgICAgICAgICAgJHtCVUlMRF9IQVNLRUxMfSIpCitNRVNTQUdFX0RFUChXSVRIX0hBU0tFTEwgIkRpc2FibGVkIGJ5IFdJVEhfSEFTS0VMTD1PRkYiKQorTUVTU0FHRV9ERVAoR0hDX0ZPVU5EICJHSEMgbWlzc2luZyIpCitNRVNTQUdFX0RFUChDQUJBTF9GT1VORCAiQ2FiYWwgbWlzc2luZyIpCittZXNzYWdlKFNUQVRVUyAiIExpYnJhcnkgZmVhdHVyZXM6IikKK21lc3NhZ2UoU1RBVFVTICIgIEJ1aWxkIHNoYXJlZCBsaWJyYXJpZXM6ICAgICAgICAgICAgICAgICAgICAgJHtXSVRIX1NIQVJFRF9MSUJ9IikKK21lc3NhZ2UoU1RBVFVTICIgIEJ1aWxkIHN0YXRpYyBsaWJyYXJpZXM6ICAgICAgICAgICAgICAgICAgICAgJHtXSVRIX1NUQVRJQ19MSUJ9IikKK21lc3NhZ2UoU1RBVFVTICIgIEJ1aWxkIHdpdGggQm9vc3Qgc3RhdGljIGxpbmsgbGlicmFyeTogICAgICAgJHtXSVRIX0JPT1NUX1NUQVRJQ30iKQorbWVzc2FnZShTVEFUVVMgIiAgQnVpbGQgd2l0aCBDKysgc3RkOjp0aHJlYWQgc3VwcG9ydDogICAgICAgICAke1dJVEhfU1REVEhSRUFEU30iKQorbWVzc2FnZShTVEFUVVMgIiAgQnVpbGQgd2l0aCBsaWJldmVudCBzdXBwb3J0OiAgICAgICAgICAgICAgICAke1dJVEhfTElCRVZFTlR9IikKK21lc3NhZ2UoU1RBVFVTICIgIEJ1aWxkIHdpdGggT3BlblNTTCBzdXBwb3J0OiAgICAgICAgICAgICAgICAgJHtXSVRIX09QRU5TU0x9IikKK21lc3NhZ2UoU1RBVFVTICIgIEJ1aWxkIHdpdGggUXQ0IHN1cHBvcnQ6ICAgICAgICAgICAgICAgICAgICAgJHtXSVRIX1FUNH0iKQorbWVzc2FnZShTVEFUVVMgIiAgQnVpbGQgd2l0aCBRdDUgc3VwcG9ydDogICAgICAgICAgICAgICAgICAgICAke1dJVEhfUVQ1fSIpCittZXNzYWdlKFNUQVRVUyAiICBCdWlsZCB3aXRoIFpMSUIgc3VwcG9ydDogICAgICAgICAgICAgICAgICAgICR7V0lUSF9aTElCfSIpCittZXNzYWdlKFNUQVRVUyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpCitlbmRtYWNybyhQUklOVF9DT05GSUdfU1VNTUFSWSkKZGlmZiAtLWdpdCBhL2J1aWxkL2NtYWtlL0RlZmluZVBsYXRmb3JtU3BlY2lmYy5jbWFrZSBiL2J1aWxkL2NtYWtlL0RlZmluZVBsYXRmb3JtU3BlY2lmYy5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjExMmI2Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvY21ha2UvRGVmaW5lUGxhdGZvcm1TcGVjaWZjLmNtYWtlCkBAIC0wLDAgKzEsMTE4IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIyBVbmNvbW1lbnQgdGhpcyB0byBzaG93IHNvbWUgYmFzaWMgY21ha2UgdmFyaWFibGVzIGFib3V0IHBsYXRmb3JtcworIyBpbmNsdWRlIChOZXdQbGF0Zm9ybURlYnVnKQorCisjIFZpc3VhbCBTdHVkaW8gc3BlY2lmaWMgb3B0aW9ucworaWYoTVNWQykKKyAgICAjRm9yIHZpc3VhbCBzdHVkaW8gdGhlIGxpYnJhcnkgbmFtaW5nIGlzIGFzIGZvbGxvd2luZzoKKyAgICAjIER5bmFtaWMgbGlicmFyaWVzOgorICAgICMgIC0gdGhyaWZ0LmRsbCAgZm9yIHJlbGVhc2UgbGlicmFyeQorICAgICMgIC0gdGhyaWZ0ZC5kbGwgZm9yIGRlYnVnIGxpYnJhcnkKKyAgICAjCisgICAgIyBTdGF0aWMgbGlicmFyaWVzOgorICAgICMgIC0gdGhyaWZ0bWQubGliIGZvciAvTUQgcmVsZWFzZSBidWlsZAorICAgICMgIC0gdGhyaWZ0bXQubGliIGZvciAvTVQgcmVsZWFzZSBidWlsZAorICAgICMKKyAgICAjICAtIHRocmlmdG1kZC5saWIgZm9yIC9NRCBkZWJ1ZyBidWlsZAorICAgICMgIC0gdGhyaWZ0bXRkLmxpYiBmb3IgL01UIGRlYnVnIGJ1aWxkCisgICAgIworICAgICMgdGhlIHNhbWUgaG9sZHMgZm9yIG90aGVyIGxpYnJhcmllcyBsaWtlIGxpYnRocmlmdHogZXRjLgorCisgICAgIyBGb3IgRGVidWcgYnVpbGQgdHlwZXMsIGFwcGVuZCBhICJkIiB0byB0aGUgbGlicmFyeSBuYW1lcy4KKyAgICBzZXQoQ01BS0VfREVCVUdfUE9TVEZJWCAiZCIgQ0FDSEUgU1RSSU5HICJTZXQgZGVidWcgbGlicmFyeSBwb3N0Zml4IiBGT1JDRSkKKyAgICBzZXQoQ01BS0VfUkVMRUFTRV9QT1NURklYICIiIENBQ0hFIFNUUklORyAiU2V0IHJlbGVhc2UgbGlicmFyeSBwb3N0Zml4IiBGT1JDRSkKKyAgICBzZXQoQ01BS0VfUkVMV0lUSERFQklORk9fUE9TVEZJWCAiIiBDQUNIRSBTVFJJTkcgIlNldCByZWxlYXNlIGxpYnJhcnkgcG9zdGZpeCIgRk9SQ0UpCisKKyAgICAjIEJ1aWxkIHVzaW5nIC9NVCBvcHRpb24gaW5zdGVhZCBvZiAvTUQgaWYgdGhlIFdJVEhfTVQgb3B0aW9ucyBpcyBzZXQKKyAgICBpZihXSVRIX01UKQorICAgICAgICBzZXQoQ29tcGlsZXJGbGFncworICAgICAgICAgICAgICAgIENNQUtFX0NYWF9GTEFHUworICAgICAgICAgICAgICAgIENNQUtFX0NYWF9GTEFHU19ERUJVRworICAgICAgICAgICAgICAgIENNQUtFX0NYWF9GTEFHU19SRUxFQVNFCisgICAgICAgICAgICAgICAgQ01BS0VfQ1hYX0ZMQUdTX1JFTFdJVEhERUJJTkZPCisgICAgICAgICAgICAgICAgQ01BS0VfQ19GTEFHUworICAgICAgICAgICAgICAgIENNQUtFX0NfRkxBR1NfREVCVUcKKyAgICAgICAgICAgICAgICBDTUFLRV9DX0ZMQUdTX1JFTEVBU0UKKyAgICAgICAgICAgICAgICBDTUFLRV9DX0ZMQUdTX1JFTFdJVEhERUJJTkZPCisgICAgICAgICAgICAgICAgKQorICAgICAgICBmb3JlYWNoKENvbXBpbGVyRmxhZyAke0NvbXBpbGVyRmxhZ3N9KQorICAgICAgICAgIHN0cmluZyhSRVBMQUNFICIvTUQiICIvTVQiICR7Q29tcGlsZXJGbGFnfSAiJHske0NvbXBpbGVyRmxhZ319IikKKyAgICAgICAgZW5kZm9yZWFjaCgpCisgICAgICAgIHNldChTVEFUSUNfUE9TVEZJWCAibXQiIENBQ0hFIFNUUklORyAiU2V0IHN0YXRpYyBsaWJyYXJ5IHBvc3RmaXgiIEZPUkNFKQorICAgIGVsc2UoV0lUSF9NVCkKKyAgICAgICAgc2V0KFNUQVRJQ19QT1NURklYICJtZCIgQ0FDSEUgU1RSSU5HICJTZXQgc3RhdGljIGxpYnJhcnkgcG9zdGZpeCIgRk9SQ0UpCisgICAgZW5kaWYoV0lUSF9NVCkKKworICAgICMgRGlzYWJsZSBib29zdCBhdXRvIGxpbmtpbmcgcHJhZ21hcyAtIGNtYWtlIGluY2x1ZGVzIHRoZSByaWdodCBmaWxlcworICAgIGFkZF9kZWZpbml0aW9ucygiLURCT09TVF9BTExfTk9fTElCIikKKworICAgICMgV2luZG93cyBidWlsZCBkb2VzIG5vdCBrbm93IGhvdyB0byBtYWtlIGEgc2hhcmVkIGxpYnJhcnkgeWV0CisgICAgIyBhcyB0aGVyZSBhcmUgbm8gX19kZWNsc3BlYyhkbGxleHBvcnQpIG9yIGV4cG9ydHMgZmlsZXMgaW4gdGhlIHByb2plY3QuCisgICAgaWYgKFdJVEhfU0hBUkVEX0xJQikKKyAgICAgIG1lc3NhZ2UgKEZBVEFMX0VSUk9SICJXaW5kb3dzIGJ1aWxkIGRvZXMgbm90IHN1cHBvcnQgc2hhcmVkIGxpYnJhcnkgb3V0cHV0IHlldCwgcGxlYXNlIHNldCAtRFdJVEhfU0hBUkVEX0xJQj1vZmYiKQorICAgIGVuZGlmKCkKKworICAgIGFkZF9kZWZpbml0aW9ucygiL01QIikgIyBwYXJhbGxlbCBidWlsZAorICAgIGFkZF9kZWZpbml0aW9ucygiL1czIikgIyB3YXJuaW5nIGxldmVsIDMKKworICAgICMgVlMyMDEwIGRvZXMgbm90IHByb3ZpZGUgaW50dHlwZXMgd2hpY2ggd2UgbmVlZCBmb3IgIlBSSWQ2NCIgdXNlZCBpbiBtYW55IHBsYWNlcworICAgIGZpbmRfcGFja2FnZShJbnR0eXBlcykKKyAgICBpZiAoSW50dHlwZXNfRk9VTkQpCisgICAgICBpbmNsdWRlX2RpcmVjdG9yaWVzKCR7SU5UVFlQRVNfSU5DTFVERV9ESVJTfSkKKyAgICAgICMgT3BlblNTTCBjb25mbGljdHMgd2l0aCB0aGUgZGVmaW5pdGlvbiBvZiBQUklkNjQgdW5sZXNzIGl0IGlzIGRlZmluZWQgZmlyc3QKKyAgICAgIGFkZF9kZWZpbml0aW9ucygiL0ZJaW50dHlwZXMuaCIpCisgICAgZW5kaWYgKCkKK2Vsc2VpZihVTklYKQorICBmaW5kX3Byb2dyYW0oIE1FTU9SWUNIRUNLX0NPTU1BTkQgdmFsZ3JpbmQgKQorICBzZXQoIE1FTU9SWUNIRUNLX0NPTU1BTkRfT1BUSU9OUyAiLS1nZW4tc3VwcHJlc3Npb25zPWFsbCAtLWxlYWstY2hlY2s9ZnVsbCIgKQorICBzZXQoIE1FTU9SWUNIRUNLX1NVUFBSRVNTSU9OU19GSUxFICIke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC92YWxncmluZC5zdXBwcmVzcyIgKQorZW5kaWYoKQorCithZGRfZGVmaW5pdGlvbnMoIi1EX19TVERDX0ZPUk1BVF9NQUNST1MiKQorYWRkX2RlZmluaXRpb25zKCItRF9fU1REQ19MSU1JVF9NQUNST1MiKQorCisjIFdJVEhfKlRIUkVBRFMgc2VsZWN0cyB3aGljaCB0aHJlYWRpbmcgbGlicmFyeSB0byB1c2UKK2lmKFdJVEhfU1REVEhSRUFEUykKKyAgYWRkX2RlZmluaXRpb25zKCItRFVTRV9TVERfVEhSRUFEPTEiKQorZW5kaWYoKQorCisjIEMrKyBMYW5ndWFnZSBMZXZlbAorc2V0KENYWF9MQU5HVUFHRV9MRVZFTCAiQysrJHtDTUFLRV9DWFhfU1RBTkRBUkR9IikKK2lmIChDTUFLRV9DWFhfU1RBTkRBUkRfUkVRVUlSRUQpCisgIHN0cmluZyhDT05DQVQgQ1hYX0xBTkdVQUdFX0xFVkVMICIke0NYWF9MQU5HVUFHRV9MRVZFTH0gW2NvbXBpbGVyIG11c3Qgc3VwcG9ydCBpdF0iKQorZWxzZSgpCisgIHN0cmluZyhDT05DQVQgQ1hYX0xBTkdVQUdFX0xFVkVMICIke0NYWF9MQU5HVUFHRV9MRVZFTH0gW2ZhbGxiYWNrIHRvIGVhcmxpZXIgaWYgY29tcGlsZXIgZG9lcyBub3Qgc3VwcG9ydCBpdF0iKQorZW5kaWYoKQoraWYgKENNQUtFX0NYWF9FWFRFTlNJT05TKQorICBzdHJpbmcoQ09OQ0FUIENYWF9MQU5HVUFHRV9MRVZFTCAiJHtDWFhfTEFOR1VBR0VfTEVWRUx9IFt3aXRoIGNvbXBpbGVyLXNwZWNpZmljIGV4dGVuc2lvbnNdIikKK2VuZGlmKCkKKworaWYgKENNQUtFX0NYWF9DT01QSUxFUl9JRCBNQVRDSEVTICJDbGFuZyIpCisgIHNldChDTUFLRV9DWFhfRkxBR1MgIiR7Q01BS0VfQ1hYX0ZMQUdTfSAtV25vLWRlcHJlY2F0ZWQtcmVnaXN0ZXIiKQorZW5kaWYoKQorCisjIEJ1aWxkaW5nIFdJVEhfUExVR0lOIHJlcXVpcmVzIGJvb3N0IG1lbW9yeSBvcGVyYXRpb25zLCBmb3Igbm93LCBhbmQgZ2NjID49IDQuOAoraWYgKFdJVEhfUExVR0lOKQorICBpZiAoQ01BS0VfQ1hYX0NPTVBJTEVSX0lEIE1BVENIRVMgIkdOVSIgQU5EIENNQUtFX0NYWF9DT01QSUxFUl9WRVJTSU9OIFZFUlNJT05fTEVTUyAiNC44IikKKyAgICBtZXNzYWdlKFNFTkRfRVJST1IgIlRocmlmdCBjb21waWxlciBwbHVnLWluIHN1cHBvcnQgaXMgbm90IHBvc3NpYmxlIHdpdGggb2xkZXIgZ2NjICggPCA0LjggKSBjb21waWxlciIpCisgIGVuZGlmKCkKK2VuZGlmKCkKKwpkaWZmIC0tZ2l0IGEvYnVpbGQvY21ha2UvRmluZEFudC5jbWFrZSBiL2J1aWxkL2NtYWtlL0ZpbmRBbnQuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGIwMzcxZAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2NtYWtlL0ZpbmRBbnQuY21ha2UKQEAgLTAsMCArMSwzMCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKworIyAgQU5UX0ZPVU5EIC0gc3lzdGVtIGhhcyBBbnQKKyMgIEFudF9FWEVDVVRBQkxFIC0gdGhlIEFudCBleGVjdXRhYmxlCisjCisjIEl0IHdpbGwgc2VhcmNoIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBBTlRfSE9NRSBpZiBpdCBpcyBzZXQKKworaW5jbHVkZShGaW5kUGFja2FnZUhhbmRsZVN0YW5kYXJkQXJncykKKworZmluZF9wcm9ncmFtKEFudF9FWEVDVVRBQkxFIE5BTUVTIGFudCBQQVRIUyAkRU5We0FOVF9IT01FfS9iaW4pCitmaW5kX3BhY2thZ2VfaGFuZGxlX3N0YW5kYXJkX2FyZ3MoQW50IERFRkFVTFRfTVNHIEFudF9FWEVDVVRBQkxFKQorbWFya19hc19hZHZhbmNlZChBbnRfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL2J1aWxkL2NtYWtlL0ZpbmRDYWJhbC5jbWFrZSBiL2J1aWxkL2NtYWtlL0ZpbmRDYWJhbC5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWQzMzdiCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvY21ha2UvRmluZENhYmFsLmNtYWtlCkBAIC0wLDAgKzEsMzAgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisKKyMgIENhYmFsX0ZPVU5EIC0gc3lzdGVtIGhhcyBDYWJhbAorIyAgQ2FiYWwgLSB0aGUgQ2FiYWwgZXhlY3V0YWJsZQorIworIyBJdCB3aWxsIHNlYXJjaCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgQ0FCQUxfSE9NRSBpZiBpdCBpcyBzZXQKKworaW5jbHVkZShGaW5kUGFja2FnZUhhbmRsZVN0YW5kYXJkQXJncykKKworZmluZF9wcm9ncmFtKENBQkFMIE5BTUVTIGNhYmFsIFBBVEhTICRFTlZ7SE9NRX0vLmNhYmFsL2JpbiAkRU5We0NBQkFMX0hPTUV9L2JpbikKK2ZpbmRfcGFja2FnZV9oYW5kbGVfc3RhbmRhcmRfYXJncyhDQUJBTCBERUZBVUxUX01TRyBDQUJBTCkKK21hcmtfYXNfYWR2YW5jZWQoQ0FCQUwpCmRpZmYgLS1naXQgYS9idWlsZC9jbWFrZS9GaW5kR0hDLmNtYWtlIGIvYnVpbGQvY21ha2UvRmluZEdIQy5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODczODQ3Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvY21ha2UvRmluZEdIQy5jbWFrZQpAQCAtMCwwICsxLDM2IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworCisjICBHSENfRk9VTkQgLSBzeXN0ZW0gaGFzIEdIQworIyAgR0hDIC0gdGhlIEdIQyBleGVjdXRhYmxlCisjICBSVU5fSEFTS0VMTF9GT1VORCAtIHN5c3RlbSBoYXMgcnVuaGFza2VsbAorIyAgUlVOX0hBU0tFTEwgLSB0aGUgcnVuaGFza2VsbCBleGVjdXRhYmxlCisjCisjIEl0IHdpbGwgc2VhcmNoIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBHSENfSE9NRSBpZiBpdCBpcyBzZXQKKworaW5jbHVkZShGaW5kUGFja2FnZUhhbmRsZVN0YW5kYXJkQXJncykKKworZmluZF9wcm9ncmFtKEdIQyBOQU1FUyBnaGMgUEFUSFMgJEVOVntHSENfSE9NRX0vYmluKQorZmluZF9wYWNrYWdlX2hhbmRsZV9zdGFuZGFyZF9hcmdzKEdIQyBERUZBVUxUX01TRyBHSEMpCittYXJrX2FzX2FkdmFuY2VkKEdIQykKKworZmluZF9wcm9ncmFtKFJVTl9IQVNLRUxMIE5BTUVTIHJ1bmhhc2tlbGwgUEFUSFMgJEVOVntHSENfSE9NRX0vYmluKQorZmluZF9wYWNrYWdlX2hhbmRsZV9zdGFuZGFyZF9hcmdzKFJVTl9IQVNLRUxMIERFRkFVTFRfTVNHIFJVTl9IQVNLRUxMKQorbWFya19hc19hZHZhbmNlZChSVU5fSEFTS0VMTCkKZGlmZiAtLWdpdCBhL2J1aWxkL2NtYWtlL0ZpbmRHTElCLmNtYWtlIGIvYnVpbGQvY21ha2UvRmluZEdMSUIuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNiZTQzMwotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2NtYWtlL0ZpbmRHTElCLmNtYWtlCkBAIC0wLDAgKzEsMTIyIEBACisjIC0gVHJ5IHRvIGZpbmQgR2xpYiBhbmQgaXRzIGNvbXBvbmVudHMgKGdpbywgZ29iamVjdCBldGMpCisjIE9uY2UgZG9uZSwgdGhpcyB3aWxsIGRlZmluZQorIworIyAgR0xJQl9GT1VORCAtIHN5c3RlbSBoYXMgR2xpYgorIyAgR0xJQl9JTkNMVURFX0RJUlMgLSB0aGUgR2xpYiBpbmNsdWRlIGRpcmVjdG9yaWVzCisjICBHTElCX0xJQlJBUklFUyAtIGxpbmsgdGhlc2UgdG8gdXNlIEdsaWIKKyMKKyMgT3B0aW9uYWxseSwgdGhlIENPTVBPTkVOVFMga2V5d29yZCBjYW4gYmUgcGFzc2VkIHRvIGZpbmRfcGFja2FnZSgpCisjIGFuZCBHbGliIGNvbXBvbmVudHMgY2FuIGJlIGxvb2tlZCBmb3IuICBDdXJyZW50bHksIHRoZSBmb2xsb3dpbmcKKyMgY29tcG9uZW50cyBjYW4gYmUgdXNlZCwgYW5kIHRoZXkgZGVmaW5lIHRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIGlmCisjIGZvdW5kOgorIworIyAgZ2lvOiAgICAgICAgICAgICBHTElCX0dJT19MSUJSQVJJRVMKKyMgIGdvYmplY3Q6ICAgICAgICAgR0xJQl9HT0JKRUNUX0xJQlJBUklFUworIyAgZ21vZHVsZTogICAgICAgICBHTElCX0dNT0RVTEVfTElCUkFSSUVTCisjICBndGhyZWFkOiAgICAgICAgIEdMSUJfR1RIUkVBRF9MSUJSQVJJRVMKKyMKKyMgTm90ZSB0aGF0IHRoZSByZXNwZWN0aXZlIF9JTkNMVURFX0RJUiB2YXJpYWJsZXMgYXJlIG5vdCBzZXQsIHNpbmNlCisjIGFsbCBoZWFkZXJzIGFyZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgR0xJQl9JTkNMVURFX0RJUlMuCisjCisjIENvcHlyaWdodCAoQykgMjAxMiBSYXBoYWVsIEt1Ym8gZGEgQ29zdGEgPHJha3Vjb0B3ZWJraXQub3JnPgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6CisjIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyMgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVIgQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUworIyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorIyBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisjIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIElUUworIyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyMgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorIyBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsKKyMgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisjIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SCisjIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYKKyMgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK2ZpbmRfcGFja2FnZShQa2dDb25maWcpCitwa2dfY2hlY2tfbW9kdWxlcyhQQ19HTElCIFFVSUVUIGdsaWItMi4wKQorCitmaW5kX2xpYnJhcnkoR0xJQl9MSUJSQVJJRVMKKyAgICBOQU1FUyBnbGliLTIuMAorICAgIEhJTlRTICR7UENfR0xJQl9MSUJESVJ9CisgICAgICAgICAgJHtQQ19HTElCX0xJQlJBUllfRElSU30KKykKKworIyBGaWxlcyBpbiBnbGliJ3MgbWFpbiBpbmNsdWRlIHBhdGggbWF5IGluY2x1ZGUgZ2xpYmNvbmZpZy5oLCB3aGljaCwKKyMgZm9yIHNvbWUgb2RkIHJlYXNvbiwgaXMgbm9ybWFsbHkgaW4gJExJQkRJUi9nbGliLTIuMC9pbmNsdWRlLgorZ2V0X2ZpbGVuYW1lX2NvbXBvbmVudChfR0xJQl9MSUJSQVJZX0RJUiAke0dMSUJfTElCUkFSSUVTfSBQQVRIKQorZmluZF9wYXRoKEdMSUJDT05GSUdfSU5DTFVERV9ESVIKKyAgICBOQU1FUyBnbGliY29uZmlnLmgKKyAgICBISU5UUyAke1BDX0xJQkRJUn0gJHtQQ19MSUJSQVJZX0RJUlN9ICR7X0dMSUJfTElCUkFSWV9ESVJ9CisgICAgICAgICAgJHtQQ19HTElCX0lOQ0xVREVESVJ9ICR7UENfR0xJQl9JTkNMVURFX0RJUlN9CisgICAgUEFUSF9TVUZGSVhFUyBnbGliLTIuMC9pbmNsdWRlCispCisKK2ZpbmRfcGF0aChHTElCX0lOQ0xVREVfRElSCisgICAgTkFNRVMgZ2xpYi5oCisgICAgSElOVFMgJHtQQ19HTElCX0lOQ0xVREVESVJ9CisgICAgICAgICAgJHtQQ19HTElCX0lOQ0xVREVfRElSU30KKyAgICBQQVRIX1NVRkZJWEVTIGdsaWItMi4wCispCisKK3NldChHTElCX0lOQ0xVREVfRElSUyAke0dMSUJfSU5DTFVERV9ESVJ9ICR7R0xJQkNPTkZJR19JTkNMVURFX0RJUn0pCisKK2lmKEdMSUJDT05GSUdfSU5DTFVERV9ESVIpCisgICAgIyBWZXJzaW9uIGRldGVjdGlvbgorICAgIGZpbGUoUkVBRCAiJHtHTElCQ09ORklHX0lOQ0xVREVfRElSfS9nbGliY29uZmlnLmgiIEdMSUJDT05GSUdfSF9DT05URU5UUykKKyAgICBzdHJpbmcoUkVHRVggTUFUQ0ggIiNkZWZpbmUgR0xJQl9NQUpPUl9WRVJTSU9OIChbMC05XSspIiBfZHVtbXkgIiR7R0xJQkNPTkZJR19IX0NPTlRFTlRTfSIpCisgICAgc2V0KEdMSUJfVkVSU0lPTl9NQUpPUiAiJHtDTUFLRV9NQVRDSF8xfSIpCisgICAgc3RyaW5nKFJFR0VYIE1BVENIICIjZGVmaW5lIEdMSUJfTUlOT1JfVkVSU0lPTiAoWzAtOV0rKSIgX2R1bW15ICIke0dMSUJDT05GSUdfSF9DT05URU5UU30iKQorICAgIHNldChHTElCX1ZFUlNJT05fTUlOT1IgIiR7Q01BS0VfTUFUQ0hfMX0iKQorICAgIHN0cmluZyhSRUdFWCBNQVRDSCAiI2RlZmluZSBHTElCX01JQ1JPX1ZFUlNJT04gKFswLTldKykiIF9kdW1teSAiJHtHTElCQ09ORklHX0hfQ09OVEVOVFN9IikKKyAgICBzZXQoR0xJQl9WRVJTSU9OX01JQ1JPICIke0NNQUtFX01BVENIXzF9IikKKyAgICBzZXQoR0xJQl9WRVJTSU9OICIke0dMSUJfVkVSU0lPTl9NQUpPUn0uJHtHTElCX1ZFUlNJT05fTUlOT1J9LiR7R0xJQl9WRVJTSU9OX01JQ1JPfSIpCitlbmRpZigpCisKKyMgQWRkaXRpb25hbCBHbGliIGNvbXBvbmVudHMuICBXZSBvbmx5IGxvb2sgZm9yIGxpYnJhcmllcywgYXMgbm90IGFsbCBvZiB0aGVtCisjIGhhdmUgY29ycmVzcG9uZGluZyBoZWFkZXJzIGFuZCBhbGwgaGVhZGVycyBhcmUgaW5zdGFsbGVkIGFsb25nc2lkZSB0aGUgbWFpbgorIyBnbGliIG9uZXMuCitmb3JlYWNoIChfY29tcG9uZW50ICR7R0xJQl9GSU5EX0NPTVBPTkVOVFN9KQorICAgIGlmICgke19jb21wb25lbnR9IFNUUkVRVUFMICJnaW8iKQorICAgICAgICBmaW5kX2xpYnJhcnkoR0xJQl9HSU9fTElCUkFSSUVTIE5BTUVTIGdpby0yLjAgSElOVFMgJHtfR0xJQl9MSUJSQVJZX0RJUn0pCisgICAgICAgIHNldChBRERJVElPTkFMX1JFUVVJUkVEX1ZBUlMgJHtBRERJVElPTkFMX1JFUVVJUkVEX1ZBUlN9IEdMSUJfR0lPX0xJQlJBUklFUykKKyAgICBlbHNlaWYgKCR7X2NvbXBvbmVudH0gU1RSRVFVQUwgImdvYmplY3QiKQorICAgICAgICBmaW5kX2xpYnJhcnkoR0xJQl9HT0JKRUNUX0xJQlJBUklFUyBOQU1FUyBnb2JqZWN0LTIuMCBISU5UUyAke19HTElCX0xJQlJBUllfRElSfSkKKyAgICAgICAgc2V0KEFERElUSU9OQUxfUkVRVUlSRURfVkFSUyAke0FERElUSU9OQUxfUkVRVUlSRURfVkFSU30gR0xJQl9HT0JKRUNUX0xJQlJBUklFUykKKyAgICBlbHNlaWYgKCR7X2NvbXBvbmVudH0gU1RSRVFVQUwgImdtb2R1bGUiKQorICAgICAgICBmaW5kX2xpYnJhcnkoR0xJQl9HTU9EVUxFX0xJQlJBUklFUyBOQU1FUyBnbW9kdWxlLTIuMCBISU5UUyAke19HTElCX0xJQlJBUllfRElSfSkKKyAgICAgICAgc2V0KEFERElUSU9OQUxfUkVRVUlSRURfVkFSUyAke0FERElUSU9OQUxfUkVRVUlSRURfVkFSU30gR0xJQl9HTU9EVUxFX0xJQlJBUklFUykKKyAgICBlbHNlaWYgKCR7X2NvbXBvbmVudH0gU1RSRVFVQUwgImd0aHJlYWQiKQorICAgICAgICBmaW5kX2xpYnJhcnkoR0xJQl9HVEhSRUFEX0xJQlJBUklFUyBOQU1FUyBndGhyZWFkLTIuMCBISU5UUyAke19HTElCX0xJQlJBUllfRElSfSkKKyAgICAgICAgc2V0KEFERElUSU9OQUxfUkVRVUlSRURfVkFSUyAke0FERElUSU9OQUxfUkVRVUlSRURfVkFSU30gR0xJQl9HVEhSRUFEX0xJQlJBUklFUykKKyAgICBlbHNlaWYgKCR7X2NvbXBvbmVudH0gU1RSRVFVQUwgImdpby11bml4IikKKyAgICAgICAgIyBnaW8tdW5peCBpcyBjb21waWxlZCBhcyBwYXJ0IG9mIHRoZSBnaW8gbGlicmFyeSwgYnV0IHRoZSBpbmNsdWRlIHBhdGhzCisgICAgICAgICMgYXJlIHNlcGFyYXRlIGZyb20gdGhlIHNoYXJlZCBnbGliIG9uZXMuIFNpbmNlIHRoaXMgaXMgY3VycmVudGx5IG9ubHkgdXNlZAorICAgICAgICAjIGJ5IFdlYktpdEdUSysgd2UgZG9uJ3QgZ28gdG8gZXh0cmFvcmRpbmFyeSBtZWFzdXJlcyBiZXlvbmQgcGtnLWNvbmZpZy4KKyAgICAgICAgcGtnX2NoZWNrX21vZHVsZXMoR0lPX1VOSVggUVVJRVQgZ2lvLXVuaXgtMi4wKQorICAgIGVuZGlmICgpCitlbmRmb3JlYWNoICgpCisKK2luY2x1ZGUoRmluZFBhY2thZ2VIYW5kbGVTdGFuZGFyZEFyZ3MpCitGSU5EX1BBQ0tBR0VfSEFORExFX1NUQU5EQVJEX0FSR1MoR0xJQiBSRVFVSVJFRF9WQVJTIEdMSUJfSU5DTFVERV9ESVJTIEdMSUJfTElCUkFSSUVTICR7QURESVRJT05BTF9SRVFVSVJFRF9WQVJTfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkVSU0lPTl9WQVIgICBHTElCX1ZFUlNJT04pCisKK21hcmtfYXNfYWR2YW5jZWQoCisgICAgR0xJQkNPTkZJR19JTkNMVURFX0RJUgorICAgIEdMSUJfR0lPX0xJQlJBUklFUworICAgIEdMSUJfR0lPX1VOSVhfTElCUkFSSUVTCisgICAgR0xJQl9HTU9EVUxFX0xJQlJBUklFUworICAgIEdMSUJfR09CSkVDVF9MSUJSQVJJRVMKKyAgICBHTElCX0dUSFJFQURfTElCUkFSSUVTCisgICAgR0xJQl9JTkNMVURFX0RJUgorICAgIEdMSUJfSU5DTFVERV9ESVJTCisgICAgR0xJQl9MSUJSQVJJRVMKKykKZGlmZiAtLWdpdCBhL2J1aWxkL2NtYWtlL0ZpbmRHcmFkbGUuY21ha2UgYi9idWlsZC9jbWFrZS9GaW5kR3JhZGxlLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NDVkNjkKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9jbWFrZS9GaW5kR3JhZGxlLmNtYWtlCkBAIC0wLDAgKzEsMzAgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisKKyMgIEdSQURMRV9GT1VORCAtIHN5c3RlbSBoYXMgR3JhZGxlCisjICBHUkFETEVfRVhFQ1VUQUJMRSAtIHRoZSBHcmFkbGUgZXhlY3V0YWJsZQorIworIyBJdCB3aWxsIHNlYXJjaCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgQU5UX0hPTUUgaWYgaXQgaXMgc2V0CisKK2luY2x1ZGUoRmluZFBhY2thZ2VIYW5kbGVTdGFuZGFyZEFyZ3MpCisKK2ZpbmRfcHJvZ3JhbShHUkFETEVfRVhFQ1VUQUJMRSBOQU1FUyBncmFkbGUgUEFUSFMgJEVOVntHUkFETEVfSE9NRX0vYmluIE5PX0NNQUtFX0ZJTkRfUk9PVF9QQVRIKQorZmluZF9wYWNrYWdlX2hhbmRsZV9zdGFuZGFyZF9hcmdzKEdyYWRsZSBERUZBVUxUX01TRyBHUkFETEVfRVhFQ1VUQUJMRSkKK21hcmtfYXNfYWR2YW5jZWQoR1JBRExFX0VYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS9idWlsZC9jbWFrZS9GaW5kR3JhZGxldy5jbWFrZSBiL2J1aWxkL2NtYWtlL0ZpbmRHcmFkbGV3LmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3YmI5OTgKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9jbWFrZS9GaW5kR3JhZGxldy5jbWFrZQpAQCAtMCwwICsxLDM2IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworCisjICBHUkFETEVXX0ZPVU5EIC0gc3lzdGVtIGhhcyBHcmFkbGV3CisjICBHUkFETEVXX0VYRUNVVEFCTEUgLSB0aGUgR3JhZGxldyBleGVjdXRhYmxlCisjCisjIEl0IHdpbGwgc2VhcmNoIHRoZSBsb2NhdGlvbiBDTUFLRV9TT1VSQ0VfRElSL2xpYi9qYXZhCisKK2luY2x1ZGUoRmluZFBhY2thZ2VIYW5kbGVTdGFuZGFyZEFyZ3MpCisKK2ZpbmRfcHJvZ3JhbShHUkFETEVXX0VYRUNVVEFCTEUgZ3JhZGxldyBQQVRIUyAke0NNQUtFX1NPVVJDRV9ESVJ9L2xpYi9qYXZhIE5PX0RFRkFVTFRfUEFUSCBOT19DTUFLRV9GSU5EX1JPT1RfUEFUSCkKK2ZpbmRfcGFja2FnZV9oYW5kbGVfc3RhbmRhcmRfYXJncyhHcmFkbGV3IERFRkFVTFRfTVNHIEdSQURMRVdfRVhFQ1VUQUJMRSkKK21hcmtfYXNfYWR2YW5jZWQoR1JBRExFV19FWEVDVVRBQkxFKQorCisjIEJ1Z2d5IGZpbmRfcHJvZ3JhbSBjYW5ub3QgZmluZCBncmFkbGV3LmJhdCB3aGVuIGdyYWRsZXcgaXMgYXQgdGhlIHNhbWUgcGF0aAorIyBhbmQgZXZlbiBidWdnaWVyIGN0ZXN0IHdpbGwgbm90IGV4ZWN1dGUgZ3JhZGxldy5iYXQgd2hlbiBncmFkbGV3IGlzIGdpdmVuLgoraWYoQ01BS0VfSE9TVF9XSU4zMikKKyAgICBzdHJpbmcoUkVHRVggUkVQTEFDRSAiKC4rZ3JhZGxldykkIiAiXFwxLmJhdCIgR1JBRExFV19FWEVDVVRBQkxFICR7R1JBRExFV19FWEVDVVRBQkxFfSkKK2VuZGlmKENNQUtFX0hPU1RfV0lOMzIpCmRpZmYgLS1naXQgYS9idWlsZC9jbWFrZS9GaW5kSW50dHlwZXMuY21ha2UgYi9idWlsZC9jbWFrZS9GaW5kSW50dHlwZXMuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY2MWY3OAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2NtYWtlL0ZpbmRJbnR0eXBlcy5jbWFrZQpAQCAtMCwwICsxLDQxIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIyBmaW5kIG1zaW50dHlwZXMgb24gY29tcGlsZXJzIHRoYXQgZG9uJ3QgcHJvdmlkZSBpdCwgZm9yIGV4YW1wbGUKKyMgICBWUzIwMTAKKworIyBVc2FnZTogCisjIFByb3ZpZGUgSU5UVFlQRVNfUk9PVCBpZiB5b3UgbmVlZCBpdAorIyBSZXN1bHQ6IElOVFRZUEVTX0lOQ0xVREVfRElSUywgd2hlcmUgdG8gZmluZCBpbnR0eXBlcy5oCisjIFJlc3VsdDogSW50dHlwZXNfRk9VTkQsIElmIGZhbHNlLCBpbnR0eXBlcy5oIHdhcyBub3QgZm91bmQKKworZmluZF9wYXRoKElOVFRZUEVTX0lOQ0xVREVfRElSUyBpbnR0eXBlcy5oIEhJTlRTICR7SU5UVFlQRVNfUk9PVH0pCitpZiAoSU5UVFlQRVNfSU5DTFVERV9ESVJTKQorICBzZXQoSW50dHlwZXNfRk9VTkQgVFJVRSkKK2Vsc2UgKCkKKyAgc2V0KEludHR5cGVzX0ZPVU5EIEZBTFNFKQorICBpZiAoSW50dHlwZXNfRklORF9SRVFVSVJFRCkKKyAgICBtZXNzYWdlKEZBVEFMX0VSUk9SICJDb3VsZCBOT1QgZmluZCBpbnR0eXBlcy5oIikKKyAgZW5kaWYgKCkKKyAgbWVzc2FnZShTVEFUVVMgImludHR5cGVzLmggTk9UIGZvdW5kIikKK2VuZGlmICgpCisKK21hcmtfYXNfYWR2YW5jZWQoCisgIElOVFRZUEVTX0lOQ0xVREVfRElSUworKQpkaWZmIC0tZ2l0IGEvYnVpbGQvY21ha2UvRmluZExpYmV2ZW50LmNtYWtlIGIvYnVpbGQvY21ha2UvRmluZExpYmV2ZW50LmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjNmEwNzgKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9jbWFrZS9GaW5kTGliZXZlbnQuY21ha2UKQEAgLTAsMCArMSw0NSBAQAorIyBmaW5kIExpYkV2ZW50CisjIGFuIGV2ZW50IG5vdGlmaWNhdGlvbiBsaWJyYXJ5IChodHRwOi8vbGliZXZlbnQub3JnLykKKyMKKyMgVXNhZ2U6IAorIyBMSUJFVkVOVF9JTkNMVURFX0RJUlMsIHdoZXJlIHRvIGZpbmQgTGliRXZlbnQgaGVhZGVycworIyBMSUJFVkVOVF9MSUJSQVJJRVMsIExpYkV2ZW50IGxpYnJhcmllcworIyBMaWJldmVudF9GT1VORCwgSWYgZmFsc2UsIGRvIG5vdCB0cnkgdG8gdXNlIGxpYmV2ZW50CisKK3NldChMSUJFVkVOVF9ST09UIENBQ0hFIFBBVEggIlJvb3QgZGlyZWN0b3J5IG9mIGxpYmV2ZW50IGluc3RhbGxhdGlvbiIpCitzZXQoTGliRXZlbnRfRVhUUkFfUFJFRklYRVMgL3Vzci9sb2NhbCAvb3B0L2xvY2FsICIkRU5We0hPTUV9IiAke0xJQkVWRU5UX1JPT1R9KQorZm9yZWFjaChwcmVmaXggJHtMaWJFdmVudF9FWFRSQV9QUkVGSVhFU30pCisgIGxpc3QoQVBQRU5EIExpYkV2ZW50X0lOQ0xVREVfUEFUSFMgIiR7cHJlZml4fS9pbmNsdWRlIikKKyAgbGlzdChBUFBFTkQgTGliRXZlbnRfTElCUkFSSUVTX1BBVEhTICIke3ByZWZpeH0vbGliIikKK2VuZGZvcmVhY2goKQorCisjIExvb2tpbmcgZm9yICJldmVudC5oIiB3aWxsIGZpbmQgdGhlIFBsYXRmb3JtIFNESyBpbmNsdWRlIGRpciBvbiB3aW5kb3dzCisjIHNvIHdlIGFsc28gbG9vayBmb3IgYSBwZWVyIGhlYWRlciBsaWtlIGV2aHR0cC5oIHRvIGdldCB0aGUgcmlnaHQgcGF0aAorZmluZF9wYXRoKExJQkVWRU5UX0lOQ0xVREVfRElSUyBldmh0dHAuaCBldmVudC5oIFBBVEhTICR7TGliRXZlbnRfSU5DTFVERV9QQVRIU30pCisKKyMgImxpYiIgcHJlZml4IGlzIG5lZWRlZCBvbiBXaW5kb3dzIGluIHNvbWUgY2FzZXMKKyMgbmV3ZXIgdmVyc2lvbnMgb2YgbGliZXZlbnQgdXNlIHRocmVlIGxpYnJhcmllcworZmluZF9saWJyYXJ5KExJQkVWRU5UX0xJQlJBUklFUyBOQU1FUyBldmVudCBldmVudF9jb3JlIGV2ZW50X2V4dHJhIGxpYmV2ZW50IFBBVEhTICR7TGliRXZlbnRfTElCUkFSSUVTX1BBVEhTfSkKKworaWYgKExJQkVWRU5UX0xJQlJBUklFUyBBTkQgTElCRVZFTlRfSU5DTFVERV9ESVJTKQorICBzZXQoTGliZXZlbnRfRk9VTkQgVFJVRSkKKyAgc2V0KExJQkVWRU5UX0xJQlJBUklFUyAke0xJQkVWRU5UX0xJQlJBUklFU30pCitlbHNlICgpCisgIHNldChMaWJldmVudF9GT1VORCBGQUxTRSkKK2VuZGlmICgpCisKK2lmIChMaWJldmVudF9GT1VORCkKKyAgaWYgKE5PVCBMaWJldmVudF9GSU5EX1FVSUVUTFkpCisgICAgbWVzc2FnZShTVEFUVVMgIkZvdW5kIGxpYmV2ZW50OiAke0xJQkVWRU5UX0xJQlJBUklFU30iKQorICBlbmRpZiAoKQorZWxzZSAoKQorICBpZiAoTGliRXZlbnRfRklORF9SRVFVSVJFRCkKKyAgICBtZXNzYWdlKEZBVEFMX0VSUk9SICJDb3VsZCBOT1QgZmluZCBsaWJldmVudC4iKQorICBlbmRpZiAoKQorICBtZXNzYWdlKFNUQVRVUyAibGliZXZlbnQgTk9UIGZvdW5kLiIpCitlbmRpZiAoKQorCittYXJrX2FzX2FkdmFuY2VkKAorICAgIExJQkVWRU5UX0xJQlJBUklFUworICAgIExJQkVWRU5UX0lOQ0xVREVfRElSUworICApCmRpZmYgLS1naXQgYS9idWlsZC9jbWFrZS9OZXdQbGF0Zm9ybURlYnVnLmNtYWtlIGIvYnVpbGQvY21ha2UvTmV3UGxhdGZvcm1EZWJ1Zy5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTRkMzAyCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvY21ha2UvTmV3UGxhdGZvcm1EZWJ1Zy5jbWFrZQpAQCAtMCwwICsxLDQ0IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIworIyBGb3IgZGVidWdnaW5nIG5ldyBwbGF0Zm9ybXMsIGp1c3QgdG8gc2VlIHdoYXQgc29tZSBlbnZpcm9ubWVudCBmbGFncyBhcmUuLi4KKyMKK21hY3JvKFNIT1dGTEFHIGZsYWcpCisgIG1lc3NhZ2UoU1RBVFVTICIke2ZsYWd9ID0gJHske2ZsYWd9fSIpCitlbmRtYWNybyhTSE9XRkxBRykKKworc2V0KE5FV1BMQVRGT1JNREVCVUcgT04pCisKK2lmKE5FV1BMQVRGT1JNREVCVUcpCisgIFNIT1dGTEFHKCJBUFBMRSIpCisgIFNIT1dGTEFHKCJCT1JMQU5EIikKKyAgU0hPV0ZMQUcoIkNNQUtFX0NfQ09NUElMRVJfSUQiKQorICBTSE9XRkxBRygiQ01BS0VfQ1hYX0NPTVBJTEVSX0lEIikKKyAgU0hPV0ZMQUcoIkNNQUtFX0NPTVBJTEVSX0lTX0dOVUNDIikKKyAgU0hPV0ZMQUcoIkNNQUtFX0NPTVBJTEVSX0lTX0dOVUNYWCIpCisgIFNIT1dGTEFHKCJDWUdXSU4iKQorICBTSE9XRkxBRygiTUlOR1ciKQorICBTSE9XRkxBRygiTVNWQyIpCisgIFNIT1dGTEFHKCJNU1ZDX1ZFUlNJT04iKQorICBTSE9XRkxBRygiTVNZUyIpCisgIFNIT1dGTEFHKCJVTklYIikKKyAgU0hPV0ZMQUcoIldBVENPTSIpCisgIFNIT1dGTEFHKCJXSU4zMiIpCitlbmRpZihORVdQTEFURk9STURFQlVHKQpkaWZmIC0tZ2l0IGEvYnVpbGQvY21ha2UvUkVBRE1FLU1TWVMyLm1kIGIvYnVpbGQvY21ha2UvUkVBRE1FLU1TWVMyLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3Y2FkOTIKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9jbWFrZS9SRUFETUUtTVNZUzIubWQKQEAgLTAsMCArMSw2MyBAQAorPCEtLS0KK0xpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworIyBCdWlsZGluZyB0aHJpZnQgb24gV2luZG93cyAoTWluR1c2NC9NU1lTMikKKworVGhyaWZ0IHVzZXMgY21ha2UgdG8gbWFrZSBpdCBlYXNpZXIgdG8gYnVpbGQgdGhlIHByb2plY3Qgb24gbXVsdGlwbGUgcGxhdGZvcm1zLCBob3dldmVyIHRvIGJ1aWxkIGEgZnVsbHkgZnVuY3Rpb25hbCBhbmQgcHJvZHVjdGlvbiByZWFkeSB0aHJpZnQgb24gV2luZG93cyByZXF1aXJlcyBhIG51bWJlciBvZiB0aGlyZCBwYXJ0eSBsaWJyYXJpZXMgdG8gYmUgb2J0YWluZWQuICBPbmNlIHRoaXJkIHBhcnR5IGxpYnJhcmllcyBhcmUgcmVhZHksIHRoZSByaWdodCBjb21iaW5hdGlvbiBvZiBvcHRpb25zIG11c3QgYmUgcGFzc2VkIHRvIGNtYWtlIGluIG9yZGVyIHRvIGdlbmVyYXRlIHRoZSBjb3JyZWN0IGVudmlyb25tZW50LgorCis+IE5vdGU6IGxpYmV2ZW50IGFuZCBsaWJldmVudC1kZXZlbCBkbyBub3Qgd29yayB3aXRoIHRoaXMgdG9vbGNoYWluIGFzIHRoZXkgZG8gbm90IHByb3Blcmx5IGRldGVjdCBtaW5ndzY0IGFuZCBleHBlY3Qgc29tZSBoZWFkZXJzIHRvIGV4aXN0IHRoYXQgZG8gbm90LCBzbyB0aGUgbm9uLWJsb2NraW5nIHNlcnZlciBpcyBub3QgY3VycmVudGx5IGJ1aWx0IGludG8gdGhpcyBzb2x1dGlvbi4KKworIyMgTVNZUzIKKworRG93bmxvYWQgYW5kIGZ1bGx5IHVwZ3JhZGUgbXN5czIgZm9sbG93aW5nIHRoZSBpbnN0cnVjdGlvbnMgYXQ6CisKKyAgICBodHRwczovL21zeXMyLmdpdGh1Yi5pby8KKworSW5zdGFsbCB0aGUgbmVjZXNzYXJ5IHRvb2xjaGFpbiBpdGVtcyBmb3IgQysrOgorCisgICAgJCBwYWNtYW4gLS1uZWVkZWQgLVMgYmlzb24gZmxleCBtYWtlIG1pbmd3LXc2NC14ODZfNjQtb3BlbnNzbCBcCisgICAgICAgICAgICAgICAgbWluZ3ctdzY0LXg4Nl82NC1ib29zdCBtaW5ndy13NjQteDg2XzY0LWNtYWtlIFwKKyAgICAgICAgICAgICAgICBtaW5ndy13NjQteDg2XzY0LXRvb2xjaGFpbiBtaW5ndy13NjQteDg2XzY0LXpsaWIKKworVXBkYXRlIHlvdXIgbXN5czIgYmFzaCBwYXRoIHRvIGluY2x1ZGUgL21pbmd3NjQvYmluIGJ5IGFkZGluZyBhIGxpbmUgdG8geW91ciB+Ly5iYXNoX3Byb2ZpbGVzIHVzaW5nIHRoaXMgY29tbWFuZDoKKworICAgIGVjaG8gImV4cG9ydCBQQVRIPS9taW5ndzY0L2JpbjpcJFBBVEgiID4+IH4vLmJhc2hfcHJvZmlsZQorCitBZnRlciB0aGF0LCBjbG9zZSB5b3VyIHNoZWxsIGFuZCBvcGVuIGEgbmV3IG9uZS4KKworVXNlIGNtYWtlIHRvIGNyZWF0ZSBhIE1pbkdXIG1ha2VmaWxlLCBvdXQgb2YgdHJlZSAoYXNzdW1lcyB5b3UgYXJlIGluIHRoZSB0b3AgbGV2ZWwgb2YgdGhlIHRocmlmdCBzb3VyY2UgdHJlZSk6CisKKyAgICBta2RpciAuLi90aHJpZnQtYnVpbGQKKyAgICBjZCAuLi90aHJpZnQtYnVpbGQKKyAgICBjbWFrZSAtRyJNaW5HVyBNYWtlZmlsZXMiIC1EQ01BS0VfTUFLRV9QUk9HUkFNPS9taW5ndzY0L2Jpbi9taW5ndzMyLW1ha2UgXAorICAgICAgIC1EQ01BS0VfQ19DT01QSUxFUj14ODZfNjQtdzY0LW1pbmd3MzItZ2NjLmV4ZSBcCisgICAgICAgLURDTUFLRV9DWFhfQ09NUElMRVI9eDg2XzY0LXc2NC1taW5ndzMyLWcrKy5leGUgXAorICAgICAgIC1EV0lUSF9MSUJFVkVOVD1PRkYgXAorICAgICAgIC1EV0lUSF9TSEFSRURfTElCPU9GRiAtRFdJVEhfU1RBVElDX0xJQj1PTiBcCisgICAgICAgLURXSVRIX0pBVkE9T0ZGIC1EV0lUSF9QWVRIT049T0ZGIC1EV0lUSF9QRVJMPU9GRiBcCisgICAgICAgLi4vdGhyaWZ0CisKK0J1aWxkIHRocmlmdCAoaW5zaWRlIHRocmlmdC1idWlsZCk6CisKKyAgICBjbWFrZSAtLWJ1aWxkIC4KKworUnVuIHRoZSB0ZXN0cyAoaW5zaWRlIHRocmlmdC1idWlsZCk6CisKKyAgICBjdGVzdAorCis+IElmIHlvdSBydW4gaW50byBpc3N1ZXMsIGNoZWNrIEFwYWNoZSBKaXJhIFRIUklGVC00MDQ2IGZvciBwYXRjaGVzIHJlbGF0aW5nIHRvIE1pbkdXNjQvTVNZUzIgYnVpbGRzLgorCisjIyBUZXN0ZWQgV2l0aAorCittc3lzMiA2NC1iaXQgMjAxNi0xMC0yNiBkaXN0cmlidXRpb24KZGlmZiAtLWdpdCBhL2J1aWxkL2NtYWtlL1JFQURNRS5tZCBiL2J1aWxkL2NtYWtlL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWMxMjhiCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvY21ha2UvUkVBRE1FLm1kCkBAIC0wLDAgKzEsNjAgQEAKKyMgQXBhY2hlIFRocmlmdCAtIENNYWtlIGJ1aWxkCisKKyMjIEdvYWwKK0V4dGVuZCBBcGFjaGUgVGhyaWZ0J3MgKm1ha2UgY3Jvc3MqIGFwcHJvYWNoIHRvIHRoZSBidWlsZCBzeXN0ZW0uCisKK0R1ZSB0byBncm93aW5nIHRoZSBmaWVsZCBvZiBvcGVyYXRpbmcgc3lzdGVtIHN1cHBvcnQsIGEgcHJvcGVyIGV4ZWN1dGFibGUKK2FuZCBsaWJyYXJ5IGRldGVjdGlvbiBtZWNoYW5pc20gcnVubmluZyBvbiBhcyBtdWNoIHBsYXRmb3JtcyBhcyBwb3NzaWJsZQorYmVjb21lcyByZXF1aXJlZC4gVGhlIG90aGVyIGFzcGVjdCB0byBzaW1wbGlmeSB0aGUgcmVsZWFzZSBwcm9jZXNzIGFuZAorcGFja2FnZSBnZW5lcmF0aW9uIHByb2Nlc3MuCisKK0FzIG5pY2Ugc2lkZSBiZW5lZml0IG9mIENNYWtlIGlzIHRoZSBnZW5lcmF0aW9uIG9mIGRldmVsb3BtZW50IGVudmlyb25tZW50CitzcGVjaWZpYyBzb3VsdGlvbiBmaWxlcy4gPT4gTm8gc29sdXRpb24gZmlsZXMgd2l0aGluIHNvdXJjZSB0cmVlLgorCisKKyMjIFVzYWdlCitqdXN0IGRvIHRoaXM6CisKKyAgICBta2RpciBjbWFrZS1idWlsZCAmJiBjZCBjbWFrZS1idWlsZAorICAgIGNtYWtlIC4uCisKK2lmIHlvdSB1c2UgYSBzcGVjaWZpYyB0b29sY2hhaW4gcGFzcyBpdCB0byBjbWFrZSwgdGhlIHNhbWUgZm9yIG9wdGlvbnM6CisKKyAgICBjbWFrZSAtRENNQUtFX1RPT0xDSEFJTl9GSUxFPS4uL2J1aWxkL2NtYWtlL21pbmd3MzItdG9vbGNoYWluLmNtYWtlIC4uCisgICAgY21ha2UgLURDTUFLRV9DX0NPTVBJTEVSPWNsYW5nLTMuNSAtRENNQUtFX0NYWF9DT01QSUxFUj1jbGFuZysrLTMuNSAuLgorICAgIGNtYWtlIC1EVEhSSUZUX0NPTVBJTEVSX0hTPU9GRiAuLgorICAgIGNtYWtlIC1EV0lUSF9aTElCPU9OIC4uCisKK29yIG9uIFdpbmRvd3MKKworICAgIGNtYWtlIC1HICJWaXN1YWwgU3R1ZGlvIDEyIDIwMTMgV2luNjQiIFwKKyAgICAtREJPT1NUX1JPT1Q9QzovM3JkcGFydHkvYm9vc3RfMV81OF8wIFwKKyAgICAtRFpMSUJfUk9PVD1DOi8zcmRwYXJ0eS96bGliMTI4LWRsbCBcCisgICAgLURXSVRIX1NIQVJFRF9MSUI9b2ZmIC4uCisKK2FuZCBvcGVuIHRoZSBkZXZlbG9wbWVudCBlbnZpcm9ubWVudCB5b3UgbGlrZSB3aXRoIHRoZSBzb2x1dGlvbiBvciBkbyB0aGlzOgorCisgICAgbWFrZQorICAgIG1ha2UgY2hlY2sKKyAgICBtYWtlIGNyb3NzCisgICAgbWFrZSBkaXN0CisKK3RvIGdlbmVyYXRlIGFuIGluc3RhbGxlciBhbmQgZGlzdHJpYnV0aW9uIHBhY2thZ2UgZG8gdGhpczoKKworICAgIGNwYWNrCisKKyMjIFRPRE8KKyogZ2l0IGhhc2ggb3IgdGFnIGJhc2VkIHZlcnNpb25pbmcgZGVwZW5kaW5nIG9uIHNvdXJjZSBzdGF0ZQorKiBidWlsZCB0dXRvcmlhbAorKiBidWlsZCB0ZXN0CisqIHdpdGgvd2l0aG91dCBsYW5ndWFnZSBsaWIvPGxhbmc+LworKiBlbmFibGUvZGlzYWJsZQorKiBtYWtlIGNyb3NzCisqIG1ha2UgZGlzdCAoY3JlYXRlIGFuIGFsaWFzIHRvIG1ha2UgcGFja2FnZV9zb3VyY2UpCisqIG1ha2UgZG9jCisqIGNwYWNrIChDKysgYW5kIG1ha2UgZGlzdCBvbmx5ID8pCisgICogdGhyaWZ0LWNvbXBpbGVyCisgICogbGlidGhyaWZ0CisgICogdHV0b3JpYWwKKyAgKiB0ZXN0CisqIG1lcmdlIGludG8gL1JFQURNRS5tZApkaWZmIC0tZ2l0IGEvYnVpbGQvY21ha2UvVGhyaWZ0TWFjcm9zLmNtYWtlIGIvYnVpbGQvY21ha2UvVGhyaWZ0TWFjcm9zLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4MzdmOTQKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9jbWFrZS9UaHJpZnRNYWNyb3MuY21ha2UKQEAgLTAsMCArMSwxMDUgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisKK3NldChDTUFLRV9ERUJVR19QT1NURklYICJkIiBDQUNIRSBTVFJJTkcgIlNldCBkZWJ1ZyBsaWJyYXJ5IHBvc3RmaXgiIEZPUkNFKQorCisKK21hY3JvKEFERF9MSUJSQVJZX1RIUklGVCBuYW1lKQorCitpZihXSVRIX1NIQVJFRF9MSUIpCisgICAgYWRkX2xpYnJhcnkoJHtuYW1lfSBTSEFSRUQgJHtBUkdOfSkKKyAgICBzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoJHtuYW1lfSBQUk9QRVJUSUVTCisgICAgICAgIE9VVFBVVF9OQU1FICR7bmFtZX0KKyAgICAgICAgVkVSU0lPTiAke3RocmlmdF9WRVJTSU9OfQorICAgICAgICBTT1ZFUlNJT04gJHt0aHJpZnRfVkVSU0lPTn0gKQorICAgICNzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoJHtuYW1lfSBQUk9QRVJUSUVTIFBVQkxJQ19IRUFERVIgIiR7dGhyaWZ0Y3BwX0hFQURFUlN9IikKKyAgICBpbnN0YWxsKFRBUkdFVFMgJHtuYW1lfQorICAgICAgICBSVU5USU1FIERFU1RJTkFUSU9OICIke0JJTl9JTlNUQUxMX0RJUn0iCisgICAgICAgIExJQlJBUlkgREVTVElOQVRJT04gIiR7TElCX0lOU1RBTExfRElSfSIKKyAgICAgICAgQVJDSElWRSBERVNUSU5BVElPTiAiJHtMSUJfSU5TVEFMTF9ESVJ9IgorICAgICAgICBQVUJMSUNfSEVBREVSIERFU1RJTkFUSU9OICIke0lOQ0xVREVfSU5TVEFMTF9ESVJ9IikKK2VuZGlmKCkKKworaWYoV0lUSF9TVEFUSUNfTElCKQorICAgIGFkZF9saWJyYXJ5KCR7bmFtZX1fc3RhdGljIFNUQVRJQyAke0FSR059KQorICAgIHNldF90YXJnZXRfcHJvcGVydGllcygke25hbWV9X3N0YXRpYyBQUk9QRVJUSUVTCisgICAgICAgIE9VVFBVVF9OQU1FICR7bmFtZX0ke1NUQVRJQ19QT1NURklYfQorICAgICAgICBWRVJTSU9OICR7dGhyaWZ0X1ZFUlNJT059CisgICAgICAgIFNPVkVSU0lPTiAke3RocmlmdF9WRVJTSU9OfSApCisgICAgaW5zdGFsbChUQVJHRVRTICR7bmFtZX1fc3RhdGljCisgICAgICAgIFJVTlRJTUUgREVTVElOQVRJT04gIiR7QklOX0lOU1RBTExfRElSfSIKKyAgICAgICAgTElCUkFSWSBERVNUSU5BVElPTiAiJHtMSUJfSU5TVEFMTF9ESVJ9IgorICAgICAgICBBUkNISVZFIERFU1RJTkFUSU9OICIke0xJQl9JTlNUQUxMX0RJUn0iCisgICAgICAgIFBVQkxJQ19IRUFERVIgREVTVElOQVRJT04gIiR7SU5DTFVERV9JTlNUQUxMX0RJUn0iKQorZW5kaWYoKQorCitlbmRtYWNybyhBRERfTElCUkFSWV9USFJJRlQpCisKKworbWFjcm8oVEFSR0VUX0lOQ0xVREVfRElSRUNUT1JJRVNfVEhSSUZUIG5hbWUpCisKK2lmKFdJVEhfU0hBUkVEX0xJQikKKyAgICB0YXJnZXRfaW5jbHVkZV9kaXJlY3Rvcmllcygke25hbWV9ICR7QVJHTn0pCitlbmRpZigpCisKK2lmKFdJVEhfU1RBVElDX0xJQikKKyAgICB0YXJnZXRfaW5jbHVkZV9kaXJlY3Rvcmllcygke25hbWV9X3N0YXRpYyAke0FSR059KQorZW5kaWYoKQorCitlbmRtYWNybyhUQVJHRVRfSU5DTFVERV9ESVJFQ1RPUklFU19USFJJRlQpCisKKworbWFjcm8oVEFSR0VUX0xJTktfTElCUkFSSUVTX1RIUklGVCBuYW1lKQorCitpZihXSVRIX1NIQVJFRF9MSUIpCisgICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKCR7bmFtZX0gJHtBUkdOfSkKK2VuZGlmKCkKKworaWYoV0lUSF9TVEFUSUNfTElCKQorICAgIHRhcmdldF9saW5rX2xpYnJhcmllcygke25hbWV9X3N0YXRpYyAke0FSR059KQorZW5kaWYoKQorCitlbmRtYWNybyhUQVJHRVRfTElOS19MSUJSQVJJRVNfVEhSSUZUKQorCisKK21hY3JvKExJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWSB0YXJnZXQgbGlibmFtZSkKKworaWYgKFdJVEhfU0hBUkVEX0xJQikKKyAgICB0YXJnZXRfbGlua19saWJyYXJpZXMoJHt0YXJnZXR9ICR7bGlibmFtZX0pCitlbHNlaWYgKFdJVEhfU1RBVElDX0xJQikKKyAgICB0YXJnZXRfbGlua19saWJyYXJpZXMoJHt0YXJnZXR9ICR7bGlibmFtZX1fc3RhdGljKQorZWxzZSgpCisgICAgbWVzc2FnZShGQVRBTCAiTm90IGxpbmtpbmcgd2l0aCBzaGFyZWQgb3Igc3RhdGljIGxpYnJhcmllcz8iKQorZW5kaWYoKQorCitlbmRtYWNybyhMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkpCisKKworbWFjcm8oVEFSR0VUX0xJTktfTElCUkFSSUVTX1RIUklGVF9BR0FJTlNUX1RIUklGVF9MSUJSQVJZIHRhcmdldCBsaWJuYW1lKQorCitpZihXSVRIX1NIQVJFRF9MSUIpCisgICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKCR7dGFyZ2V0fSAke0FSR059ICR7bGlibmFtZX0pCitlbmRpZigpCisKK2lmKFdJVEhfU1RBVElDX0xJQikKKyAgICB0YXJnZXRfbGlua19saWJyYXJpZXMoJHt0YXJnZXR9X3N0YXRpYyAke0FSR059ICR7bGlibmFtZX1fc3RhdGljKQorZW5kaWYoKQorCitlbmRtYWNybyhUQVJHRVRfTElOS19MSUJSQVJJRVNfVEhSSUZUX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9idWlsZC9jbWFrZS9hbmRyb2lkLXRvb2xjaGFpbi5jbWFrZSBiL2J1aWxkL2NtYWtlL2FuZHJvaWQtdG9vbGNoYWluLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1ZjNkMDAKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9jbWFrZS9hbmRyb2lkLXRvb2xjaGFpbi5jbWFrZQpAQCAtMCwwICsxLDI2IEBACitzZXQoQU5EUk9JRF9OREsgIi9vcHQvYW5kcm9pZC1uZGsiIENBQ0hFKQorc2V0KEFORFJPSURfUExBVEZPUk0gImFuZHJvaWQtMTUiIENBQ0hFKQorc2V0KEFORFJPSURfQVJDSCAiYXJjaC1hcm0iIENBQ0hFKQorc2V0KEFORFJPSURfVE9PTF9BUkNIICJhbmRyb2lkLWFybSIgQ0FDSEUpCitzZXQoQU5EUk9JRF9DUFUgImFybWVhYmktdjdhIiBDQUNIRSkKK3NldChBTkRST0lEX0dDQ19WRVJTSU9OIDQuOSBDQUNIRSkKK3NldChIT1NUX0FSQ0ggbGludXgteDg2XzY0IENBQ0hFKQorCitzZXQoQ01BS0VfU1lTVEVNX05BTUUgQW5kcm9pZCkKK3NldChBTkRST0lEX1NZU1JPT1QgIiR7QU5EUk9JRF9OREt9L3BsYXRmb3Jtcy8ke0FORFJPSURfUExBVEZPUk19LyR7QU5EUk9JRF9BUkNIfSIpCitzZXQoQU5EUk9JRF9UUklQTEVUIGFybS1saW51eC1hbmRyb2lkZWFiaSkKK3NldChBTkRST0lEX1NUTCAiJHtBTkRST0lEX05ES30vc291cmNlcy9jeHgtc3RsL2dudS1saWJzdGQrKy8ke0FORFJPSURfR0NDX1ZFUlNJT059IikKKworc2V0KF9DT01QSUxFUl9ST09UICR7QU5EUk9JRF9OREt9L3ByZWJ1aWx0LyR7QU5EUk9JRF9UUklQTEVUfS0ke0FORFJPSURfR0NDX1ZFUlNJT059L3ByZWJ1aWx0LyR7SE9TVF9BUkNIfSkKK3NldChDTUFLRV9DX0NPTVBJTEVSICR7X0NPTVBJTEVSX1JPT1R9L2Jpbi8ke0FORFJPSURfVFJJUExFVH0tZ2NjKQorc2V0KENNQUtFX0NYQ1hfQ09NUElMRVIgJHtfQ09NUElMRVJfUk9PVH0vYmluLyR7QU5EUk9JRF9UUklQTEVUfS1nKyspCisKK2luY2x1ZGVfZGlyZWN0b3JpZXMoCisgICAgJHtBTkRST0lEX1NUTH0vaW5jbHVkZQorICAgICR7QU5EUk9JRF9TVEx9L2xpYnMvJHtBTkRST0lEX0NQVX0vaW5jbHVkZSkKKworc2V0KENNQUtFX0ZJTkRfUk9PVF9QQVRIICR7QU5EUk9JRF9TWVNST09UfSkKKworc2V0KENNQUtFX0ZJTkRfUk9PVF9QQVRIX01PREVfUFJPR1JBTSBORVZFUikKK3NldChDTUFLRV9GSU5EX1JPT1RfUEFUSF9NT0RFX0xJQlJBUlkgT05MWSkKK3NldChDTUFLRV9GSU5EX1JPT1RfUEFUSF9NT0RFX0lOQ0xVREUgT05MWSkKZGlmZiAtLWdpdCBhL2J1aWxkL2NtYWtlL2NvbmZpZy5oLmluIGIvYnVpbGQvY21ha2UvY29uZmlnLmguaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYwYWU0NgotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2NtYWtlL2NvbmZpZy5oLmluCkBAIC0wLDAgKzEsMTYwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qIGNvbmZpZy5oIGdlbmVyYXRlZCBieSBDTWFrZSBmcm9tIGNvbmZpZy5oLmluICovCisKKyNpZm5kZWYgQ09ORklHX0gKKyNkZWZpbmUgQ09ORklHX0gKKworCisvKiBOYW1lIG9mIHBhY2thZ2UgKi8KKyNjbWFrZWRlZmluZSBQQUNLQUdFICIke1BBQ0tBR0V9IgorCisvKiBEZWZpbmUgdG8gdGhlIGFkZHJlc3Mgd2hlcmUgYnVnIHJlcG9ydHMgZm9yIHRoaXMgcGFja2FnZSBzaG91bGQgYmUgc2VudC4gKi8KKyNjbWFrZWRlZmluZSBQQUNLQUdFX0JVR1JFUE9SVCAiJHtQQUNLQUdFX0JVR1JFUE9SVH0iCisKKy8qIERlZmluZSB0byB0aGUgZnVsbCBuYW1lIG9mIHRoaXMgcGFja2FnZS4gKi8KKyNjbWFrZWRlZmluZSBQQUNLQUdFX05BTUUgIiR7UEFDS0FHRV9OQU1FfSIKKworLyogRGVmaW5lIHRvIHRoZSBvbmUgc3ltYm9sIHNob3J0IG5hbWUgb2YgdGhpcyBwYWNrYWdlLiAqLworI2NtYWtlZGVmaW5lIFBBQ0tBR0VfVEFSTkFNRSAiJHtQQUNLQUdFX1RBUk5BTUV9IgorCisvKiBEZWZpbmUgdG8gdGhlIGhvbWUgcGFnZSBmb3IgdGhpcyBwYWNrYWdlLiAqLworI2NtYWtlZGVmaW5lIFBBQ0tBR0VfVVJMICIke1BBQ0tBR0VfVVJMfSIKKworLyogRGVmaW5lIHRvIHRoZSB2ZXJzaW9uIG9mIHRoaXMgcGFja2FnZS4gKi8KKyNkZWZpbmUgUEFDS0FHRV9WRVJTSU9OICIke1BBQ0tBR0VfVkVSU0lPTn0iCisKKy8qIERlZmluZSB0byB0aGUgZnVsbCBuYW1lIGFuZCB2ZXJzaW9uIG9mIHRoaXMgcGFja2FnZS4gKi8KKyNkZWZpbmUgUEFDS0FHRV9TVFJJTkcgIiR7UEFDS0FHRV9TVFJJTkd9IgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKiogREVGSU5FUyAqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBEZWZpbmUgaWYgdGhlIEFJX0FERFJDT05GSUcgc3ltYm9sIGlzIHVuYXZhaWxhYmxlICovCisjY21ha2VkZWZpbmUgQUlfQUREUkNPTkZJRyAwCisKKy8qIFBvc3NpYmxlIHZhbHVlIGZvciBTSUdORURfUklHSFRfU0hJRlRfSVMgKi8KKy8qIFRPRE86IFRoaXMgaXMganVzdCBzZXQgdG8gMSBmb3IgdGhlIG1vbWVudAorICAgcG9ydCB0aGUgbWFjcm8gYWNsb2NhbC9heF9zaWduZWRfcmlnaHRfc2hpZnQubTQgdG8gQ01ha2UgdG8gbWFrZSB0aGlzIHdvcmsgKi8KKyNkZWZpbmUgQVJJVEhNRVRJQ19SSUdIVF9TSElGVCAxCisKKy8qIEluZGljYXRlcyB0aGUgZWZmZWN0IG9mIHRoZSByaWdodCBzaGlmdCBvcGVyYXRvciBvbiBuZWdhdGl2ZSBzaWduZWQKKyAgIGludGVnZXJzICovCisvKiBUT0RPOiBUaGlzIGlzIGp1c3Qgc2V0IHRvIDEgZm9yIHRoZSBtb21lbnQgKi8KKyNkZWZpbmUgU0lHTkVEX1JJR0hUX1NISUZUX0lTIDEKKworLyogVXNlICouaCBleHRlbnNpb24gZm9yIHBhcnNlciBoZWFkZXIgZmlsZSAqLworLyogVE9ETzogVGhpcyBtaWdodCBub3cgYmUgbmVjZXNzYXJ5IGFueW1vcmUgYXMgaXQgaXMgc2V0IG9ubHkgZm9yIGF1dG9tYWtlIDwgMS4xMQorICAgc2VlOiBhY2xvY2FsL2FjX3Byb2dfYmlzb24ubTQgKi8KKyNjbWFrZWRlZmluZSBCSVNPTl9VU0VfUEFSU0VSX0hfRVhURU5TSU9OIDEKKworLyogcmVwbGFjZXMgUE9TSVggcHRocmVhZCBieSBzdGQ6OnRocmVhZCAqLworI2NtYWtlZGVmaW5lIFVTRV9TVERfVEhSRUFEIDEKKworLyogRGVmaW5lIHRvIDEgaWYgc3RyZXJyb3JfciByZXR1cm5zIGNoYXIgKi4gKi8KKyNjbWFrZWRlZmluZSBTVFJFUlJPUl9SX0NIQVJfUCAxCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqIEhFQURFUiBGSUxFUyAqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGFycGEvaW5ldC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX0FSUEFfSU5FVF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxmY250bC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX0ZDTlRMX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGludHR5cGVzLmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfSU5UVFlQRVNfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bmV0ZGIuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9ORVREQl9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxuZXRpbmV0L2luLmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfTkVUSU5FVF9JTl9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzaWduYWwuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9TSUdOQUxfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RkaW50Lmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfU1RESU5UX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX1VOSVNURF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxwdGhyZWFkLmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfUFRIUkVBRF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvaW9jdGwuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9TWVNfSU9DVExfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3BhcmFtLmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfU1lTX1BBUkFNX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9yZXNvdXJjZS5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX1NZU19SRVNPVVJDRV9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvc29ja2V0Lmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfU1lTX1NPQ0tFVF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvc3RhdC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX1NZU19TVEFUX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy91bi5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX1NZU19VTl9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxwb2xsLmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfUE9MTF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvcG9sbC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX1NZU19QT0xMX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9zZWxlY3QuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9TWVNfU0VMRUNUX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90aW1lLmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfU1lTX1RJTUVfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c2NoZWQuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9TQ0hFRF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmdzLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX1NUUklOR1NfSCAxCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiogRlVOQ1RJT05TICoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXRob3N0YnluYW1lJyBmdW5jdGlvbi4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX0dFVEhPU1RCWU5BTUUgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldGhvc3RieW5hbWVfcicgZnVuY3Rpb24uICovCisjY21ha2VkZWZpbmUgSEFWRV9HRVRIT1NUQllOQU1FX1IgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN0cmVycm9yX3InIGZ1bmN0aW9uLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfU1RSRVJST1JfUiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2NoZWRfZ2V0X3ByaW9yaXR5X21heCcgZnVuY3Rpb24uICovCisjY21ha2VkZWZpbmUgSEFWRV9TQ0hFRF9HRVRfUFJJT1JJVFlfTUFYIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzY2hlZF9nZXRfcHJpb3JpdHlfbWluJyBmdW5jdGlvbi4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX1NDSEVEX0dFVF9QUklPUklUWV9NSU4gMQorCisKKy8qIERlZmluZSB0byAxIGlmIHN0cmVycm9yX3IgcmV0dXJucyBjaGFyICouICovCisjY21ha2VkZWZpbmUgU1RSRVJST1JfUl9DSEFSX1AgMQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2J1aWxkL2NtYWtlL21pbmd3MzItdG9vbGNoYWluLmNtYWtlIGIvYnVpbGQvY21ha2UvbWluZ3czMi10b29sY2hhaW4uY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY0YzBlYgotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2NtYWtlL21pbmd3MzItdG9vbGNoYWluLmNtYWtlCkBAIC0wLDAgKzEsMjQgQEAKKyMgQ01ha2UgbWluZ3czMiBjcm9zcyBjb21waWxlIHRvb2xjaGFpbiBmaWxlCisKKyMgdGhlIG5hbWUgb2YgdGhlIHRhcmdldCBvcGVyYXRpbmcgc3lzdGVtCitTRVQoQ01BS0VfU1lTVEVNX05BTUUgV2luZG93cykKKworIyB3aGljaCBjb21waWxlcnMgdG8gdXNlIGZvciBDIGFuZCBDKysKK1NFVChDTUFLRV9DX0NPTVBJTEVSIGk1ODYtbWluZ3czMm1zdmMtZ2NjKQorU0VUKENNQUtFX0NYWF9DT01QSUxFUiBpNTg2LW1pbmd3MzJtc3ZjLWcrKykKK1NFVChDTUFLRV9SQ19DT01QSUxFUiBpNTg2LW1pbmd3MzJtc3ZjLXdpbmRyZXMpCisKKyMgaGVyZSBpcyB0aGUgdGFyZ2V0IGVudmlyb25tZW50IGxvY2F0ZWQKK1NFVChDTUFLRV9GSU5EX1JPT1RfUEFUSCAvdXNyL2k1ODYtbWluZ3czMm1zdmMpCisKKyMgYWRqdXN0IHRoZSBkZWZhdWx0IGJlaGF2aW91ciBvZiB0aGUgRklORF9YWFgoKSBjb21tYW5kczoKKyMgc2VhcmNoIGhlYWRlcnMgYW5kIGxpYnJhcmllcyBpbiB0aGUgdGFyZ2V0IGVudmlyb25tZW50LCBzZWFyY2gKKyMgcHJvZ3JhbXMgaW4gdGhlIGhvc3QgZW52aXJvbm1lbnQKK3NldChDTUFLRV9GSU5EX1JPT1RfUEFUSF9NT0RFX1BST0dSQU0gTkVWRVIpCitzZXQoQ01BS0VfRklORF9ST09UX1BBVEhfTU9ERV9MSUJSQVJZIE9OTFkpCitzZXQoQ01BS0VfRklORF9ST09UX1BBVEhfTU9ERV9JTkNMVURFIE9OTFkpCisKK3NldChCVUlMRF9TSEFSRURfTElCUyBPRkYpCitTRVQoQ01BS0VfRVhFX0xJTktFUl9GTEFHUyAiLXN0YXRpYyIpCitzZXQoQ01BS0VfQ19GTEFHUyAke0NNQUtFX0NfRkxBR1N9ICItc3RhdGljLWxpYmdjYyIpCitzZXQoQ01BS0VfQ1hYX0ZMQUdTICR7Q01BS0VfQ1hYX0ZMQUdTfSAiLXN0YXRpYy1saWJzdGRjKysiKQpkaWZmIC0tZ2l0IGEvYnVpbGQvZG9ja2VyL1JFQURNRS5tZCBiL2J1aWxkL2RvY2tlci9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY2ZDY5MAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2RvY2tlci9SRUFETUUubWQKQEAgLTAsMCArMSwxOTggQEAKKyMgRG9ja2VyIEludGVncmF0aW9uICMKKworRHVlIHRvIHRoZSBsYXJnZSBudW1iZXIgb2YgbGFuZ3VhZ2VzIHN1cHBvcnRlZCBieSBBcGFjaGUgVGhyaWZ0LAorZG9ja2VyIGNvbnRhaW5lcnMgYXJlIHVzZWQgdG8gYnVpbGQgYW5kIHRlc3QgdGhlIHByb2plY3Qgb24gYQordmFyaWV0eSBvZiBwbGF0Zm9ybXMgdG8gcHJvdmlkZSBtYXhpbXVtIHRlc3QgY292ZXJhZ2UuCisKKyMjIEFwcHZleW9yIEludGVncmF0aW9uICMjCisKK0F0IHRoaXMgdGltZSB0aGUgQXBwdmV5b3Igc2NyaXB0cyBkbyBub3QgdXNlIGRvY2tlciBjb250YWluZXJzLgorT25jZSBNaWNyb3NvZnQgc3VwcG9ydHMgVmlzdWFsIFN0dWRpbyBCdWlsZCBUb29scyBydW5uaW5nIGluc2lkZQorbmFubyBjb250YWluZXJzIChpbnN0ZWFkIG9mIENvcmUsIHdoaWNoIGlzIGh1Z2UpIHRoZW4gd2Ugd2lsbAorY29uc2lkZXIgdXNpbmcgY29udGFpbmVycyBmb3IgdGhlIFdpbmRvd3MgYnVpbGRzIGFzIHdlbGwuCisKKyMjIFRyYXZpcyBDSSBJbnRlZ3JhdGlvbiAjIworCitUaGUgVHJhdmlzIENJIHNjcmlwdHMgdXNlIHRoZSBmb2xsb3dpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFuZAorbG9naWMgdG8gZGV0ZXJtaW5lIHRoZWlyIGJlaGF2aW9yOgorCisjIyMgRW52aXJvbm1lbnQgVmFyaWFibGVzICMjIworCit8IFZhcmlhYmxlIHwgRGVmYXVsdCB8IFVzYWdlIHwKK3wgLS0tLS0tLS0gfCAtLS0tLSB8IC0tLS0tLS0gfAorfCBgRElTVFJPYCB8IGB1YnVudHUtYmlvbmljYCB8IFNldCBieSB2YXJpb3VzIGJ1aWxkIGpvYnMgaW4gYC50cmF2aXMueW1sYCB0byBydW4gYnVpbGRzIGluIGRpZmZlcmVudCBjb250YWluZXJzLiAgTm90IGludGVuZGVkIHRvIGJlIHNldCBleHRlcm5hbGx5LnwKK3wgYERPQ0tFUl9SRVBPYCB8IGB0aHJpZnQvdGhyaWZ0LWJ1aWxkYCB8IFRoZSBuYW1lIG9mIHRoZSBEb2NrZXIgSHViIHJlcG9zaXRvcnkgdG8gb2J0YWluIGFuZCBzdG9yZSBkb2NrZXIgaW1hZ2VzLiB8Cit8IGBET0NLRVJfVVNFUmAgfCBgPG5vbmU+YCB8IFRoZSBEb2NrZXIgSHViIGFjY291bnQgbmFtZSBjb250YWluaW5nIHRoZSByZXBvc2l0b3J5LiB8Cit8IGBET0NLRVJfUEFTU2AgfCBgPG5vbmU+YCB8IFRoZSBEb2NrZXIgSHViIGFjY291bnQgcGFzc3dvcmQgdG8gdXNlIHdoZW4gcHVzaGluZyBuZXcgdGFncy4gfAorCitGb3IgZXhhbXBsZSwgdGhlIGRlZmF1bHQgZG9ja2VyIGltYWdlIHRoYXQgaXMgdXNlZCBpbiBidWlsZHMgaWYgbm8gb3ZlcnJpZGVzIGFyZSBzcGVjaWZpZWQgd291bGQgYmU6IGB0aHJpZnQvdGhyaWZ0LWJ1aWxkOnVidW50dS1iaW9uaWNgCisKKyMjIyBGb3JrcyAjIyMKKworSWYgeW91IGhhdmUgZm9ya2VkIHRoZSBBcGFjaGUgVGhyaWZ0IHJlcG9zaXRvcnkgYW5kIHlvdSB3b3VsZCBsaWtlCit0byB1c2UgeW91ciBvd24gRG9ja2VyIEh1YiBhY2NvdW50IHRvIHN0b3JlIHRocmlmdCBidWlsZCBpbWFnZXMsCit5b3UgY2FuIHVzZSB0aGUgVHJhdmlzIENJIHdlYiBpbnRlcmZhY2UgdG8gc2V0IHRoZSBgRE9DS0VSX1VTRVJgLAorYERPQ0tFUl9QQVNTYCwgYW5kIGBET0NLRVJfUkVQT2AgdmFyaWFibGVzIGluIGEgc2VjdXJlIG1hbm5lci4KK1lvdXIgZm9yayBidWlsZHMgd2lsbCB0aGVuIHB1bGwsIHB1c2gsIGFuZCB0YWcgdGhlIGRvY2tlciBpbWFnZXMKK2luIHlvdXIgYWNjb3VudC4KKworIyMjIExvZ2ljICMjIworCitUaGUgVHJhdmlzIENJIGJ1aWxkIHJ1bnMgaW4gdHdvIHBoYXNlcyAtIGZpcnN0IHRoZSBkb2NrZXIgaW1hZ2VzIGFyZSByZWJ1aWx0Citmb3IgZWFjaCBvZiB0aGUgc3VwcG9ydGVkIGNvbnRhaW5lcnMgaWYgdGhleSBkbyBub3QgbWF0Y2ggdGhlIERvY2tlcmZpbGUgdGhhdAord2FzIHVzZWQgdG8gYnVpbGQgdGhlIG1vc3QgcmVjZW50IHRhZy4gIElmIGEgYERPQ0tFUl9QQVNTYCBlbnZpcm9ubWVudAordmFyaWFibGUgaXMgc3BlY2lmaWVkLCB0aGUgZG9ja2VyIHN0YWdlIGJ1aWxkcyB3aWxsIGF0dGVtcHQgdG8gbG9nIGludG8KK0RvY2tlciBIdWIgYW5kIHB1c2ggdGhlIHJlc3VsdGluZyB0YWdzLgorCisjIyBTdXBwb3J0ZWQgQ29udGFpbmVycyAjIworCitUaGUgVHJhdmlzIENJIChjb250aW51b3VzIGludGVncmF0aW9uKSBidWlsZHMgdXNlIHRoZSBVYnVudHUgQmlvbmljCisoMTguMDQgTFRTKSBhbmQgWGVuaWFsICgxNi4wNCBMVFMpIGltYWdlcyB0byBtYXhpbWl6ZSBsYW5ndWFnZSBsZXZlbAorY292ZXJhZ2UuCisKKyMjIyBVYnVudHUgIyMjCisKKyogYmlvbmljIChzdGFibGUsIGN1cnJlbnQpCisqIGFydGZ1bCAocHJldmlvdXMgc3RhYmxlKQorKiB4ZW5pYWwgKGxlZ2FjeSkKKworIyMgVW5zdXBwb3J0ZWQgQ29udGFpbmVycyAjIworCitUaGVzZSBjb250YWluZXJzIG1heSBiZSBpbiB2YXJpb3VzIHN0YXRlcywgYW5kIG1heSBub3QgYnVpbGQgZXZlcnl0aGluZy4KK1RoZXkgY2FuIGJlIGZvdW5kIGluIHRoZSBgb2xkL2Agc3ViZGlyZWN0b3J5LgorCisjIyMgQ2VudE9TICMjIworKiA3LjMKKyAgKiBtYWtlIGNoZWNrIGluIGxpYi9weSBtYXkgaGFuZyBpbiB0ZXN0X3NzbHNvY2tldCAtIHJvb3QgY2F1c2UgdW5rbm93bgorCisjIyMgRGViaWFuICMjIworCisqIGplc3NpZQorKiBzdHJldGNoCisgICogbWFrZSBjaGVjayBpbiBsaWIvY3BwIGZhaWxzIGR1ZSB0byBodHRwczovL3N2bi5ib29zdC5vcmcvdHJhYzEwL3RpY2tldC8xMjUwNworCisjIyBCdWlsZGluZyBsaWtlIFRyYXZpcyBDSSBkb2VzLCBsb2NhbGx5ICMjCisKK1dlIHJlY29tbWVuZCB5b3UgYnVpbGQgbG9jYWxseSB0aGUgc2FtZSB3YXkgVHJhdmlzIENJIGRvZXMsIHNvIHRoYXQgd2hlbiB5b3UKK3N1Ym1pdCB5b3VyIHB1bGwgcmVxdWVzdCB5b3Ugd2lsbCBydW4gaW50byBmZXdlciBzdXJwcmlzZXMuICBUbyBtYWtlIGl0IGEKK2xpdHRsZSBlYXNpZXIsIHB1dCB0aGUgZm9sbG93aW5nIGludG8geW91ciBgfi8uYmFzaF9hbGlhc2VzYCBmaWxlOgorCisgICAgIyBLaWxsIGFsbCBydW5uaW5nIGNvbnRhaW5lcnMuCisgICAgYWxpYXMgZG9ja2Vya2lsbGFsbD0nZG9ja2VyIGtpbGwgJChkb2NrZXIgcHMgLXEpJworCisgICAgIyBEZWxldGUgYWxsIHN0b3BwZWQgY29udGFpbmVycy4KKyAgICBhbGlhcyBkb2NrZXJjbGVhbmM9J3ByaW50ZiAiXG4+Pj4gRGVsZXRpbmcgc3RvcHBlZCBjb250YWluZXJzXG5cbiIgJiYgZG9ja2VyIHJtICQoZG9ja2VyIHBzIC1hIC1xKScKKworICAgICMgRGVsZXRlIGFsbCB1bnRhZ2dlZCBpbWFnZXMuCisgICAgYWxpYXMgZG9ja2VyY2xlYW5pPSdwcmludGYgIlxuPj4+IERlbGV0aW5nIHVudGFnZ2VkIGltYWdlc1xuXG4iICYmIGRvY2tlciBybWkgJChkb2NrZXIgaW1hZ2VzIC1xIC1mIGRhbmdsaW5nPXRydWUpJworCisgICAgIyBEZWxldGUgYWxsIHN0b3BwZWQgY29udGFpbmVycyBhbmQgdW50YWdnZWQgaW1hZ2VzLgorICAgIGFsaWFzIGRvY2tlcmNsZWFuPSdkb2NrZXJjbGVhbmMgfHwgdHJ1ZSAmJiBkb2NrZXJjbGVhbmknCisKKyAgICAjIEJ1aWxkIGEgdGhyaWZ0IGRvY2tlciBpbWFnZSAocnVuIGZyb20gdG9wIGxldmVsIG9mIGdpdCByZXBvKTogYXJndW1lbnQgIzEgaXMgaW1hZ2UgdHlwZSAodWJ1bnR1LCBjZW50b3MsIGV0YykuCisgICAgZnVuY3Rpb24gZG9ja2VyYnVpbGQKKyAgICB7CisgICAgICBkb2NrZXIgYnVpbGQgLXQgJDEgYnVpbGQvZG9ja2VyLyQxCisgICAgfQorCisgICAgIyBSdW4gYSB0aHJpZnQgZG9ja2VyIGltYWdlOiBhcmd1bWVudCAjMSBpcyBpbWFnZSB0eXBlICh1YnVudHUsIGNlbnRvcywgZXRjKS4KKyAgICBmdW5jdGlvbiBkb2NrZXJydW4KKyAgICB7CisgICAgICBkb2NrZXIgcnVuIC12ICQocHdkKTovdGhyaWZ0L3NyYyAtaXQgJDEgL2Jpbi9iYXNoCisgICAgfQorCitUaGVuLCB0byBwdWxsIGRvd24gdGhlIGN1cnJlbnQgaW1hZ2UgYmVpbmcgdXNlZCB0byBidWlsZCAodGhlIHNhbWUgd2F5CitUcmF2aXMgQ0kgZG9lcyBpdCkgLSBpZiBpdCBpcyBvdXQgb2YgZGF0ZSBpbiBhbnkgd2F5IGl0IHdpbGwgYnVpbGQgYQorbmV3IG9uZSBmb3IgeW91OgorCisgICAgdGhyaWZ0JCBET0NLRVJfUkVQTz10aHJpZnQvdGhyaWZ0LWJ1aWxkIERJU1RSTz11YnVudHUtYmlvbmljIGJ1aWxkL2RvY2tlci9yZWZyZXNoLnNoCisKK1RvIHJ1biBhbGwgdW5pdCB0ZXN0cyAoanVzdCBsaWtlIFRyYXZpcyBDSSBkb2VzKToKKworICAgIHRocmlmdCQgZG9ja2VycnVuIHVidW50dS1iaW9uaWMKKyAgICByb290QDhjYWY1NmIwY2U3YjovdGhyaWZ0L3NyYyMgYnVpbGQvZG9ja2VyL3NjcmlwdHMvYXV0b3Rvb2xzLnNoCisKK1RvIHJ1biB0aGUgY3Jvc3MgdGVzdHMgKGp1c3QgbGlrZSBUcmF2aXMgQ0kgZG9lcyk6CisKKyAgICB0aHJpZnQkIGRvY2tlcnJ1biB1YnVudHUtYmlvbmljCisgICAgcm9vdEA4Y2FmNTZiMGNlN2I6L3RocmlmdC9zcmMjIGJ1aWxkL2RvY2tlci9zY3JpcHRzL2Nyb3NzLXRlc3Quc2gKKworV2hlbiB5b3UgYXJlIGRvbmUsIHlvdSB3YW50IHRvIGNsZWFuIHVwIG9jY2FzaW9uYWxseSBzbyB0aGF0IGRvY2tlciBpc24ndCB1c2luZyBsb3RzIG9mIGV4dHJhIGRpc2sgc3BhY2U6CisKKyAgICB0aHJpZnQkIGRvY2tlcmNsZWFuCisKK1lvdSBuZWVkIHRvIHJ1biB0aGUgZG9ja2VyIGNvbW1hbmRzIGZyb20gdGhlIHJvb3Qgb2YgdGhlIGxvY2FsIGNsb25lIG9mIHRoZQordGhyaWZ0IGdpdCByZXBvc2l0b3J5IGZvciB0aGVtIHRvIHdvcmsuCisKK1doZW4geW91IGFyZSBkb25lIGluIHRoZSByb290IGRvY2tlciBzaGVsbCB5b3UgY2FuIGBleGl0YCB0byBnbyBiYWNrIHRvCit5b3VyIHVzZXIgaG9zdCBzaGVsbC4gIE9uY2UgdGhlIHVuaXQgdGVzdHMgYW5kIGNyb3NzIHRlc3QgcGFzc2VzIGxvY2FsbHksCitzdWJtaXQgdGhlIGNoYW5nZXMsIGFuZCBpZiBkZXNpcmVkIHNxdWFzaCB0aGUgcHVsbCByZXF1ZXN0IHRvIG9uZSBjb21taXQKK3RvIG1ha2UgaXQgZWFzaWVyIHRvIG1lcmdlICh0aGUgY29tbWl0dGVycyBjYW4gc3F1YXNoIGF0IGNvbW1pdCB0aW1lIG5vdwordGhhdCBHaXRIdWIgaXMgdGhlIG1hc3RlciByZXBvc2l0b3J5KS4gIE5vdyB5b3UgYXJlIGJ1aWxkaW5nIGxpa2UgVHJhdmlzIENJIGRvZXMhCisKKyMjIFJhdyBDb21tYW5kcyBmb3IgQnVpbGRpbmcgd2l0aCBEb2NrZXIgIyMKKworSWYgeW91IGRvIG5vdCB3YW50IHRvIHVzZSB0aGUgc2FtZSBzY3JpcHRzIFRyYXZpcyBDSSBkb2VzLCB5b3UgY2FuIGRvIGl0IG1hbnVhbGx5OgorCitCdWlsZCB0aGUgaW1hZ2U6CisKKyAgICB0aHJpZnQkIGRvY2tlciBidWlsZCAtdCB0aHJpZnQgYnVpbGQvZG9ja2VyL3VidW50dS1iaW9uaWMKKworT3BlbiBhIGNvbW1hbmQgcHJvbXB0IGluIHRoZSBpbWFnZToKKworICAgIHRocmlmdCQgZG9ja2VyIHJ1biAtdiAkKHB3ZCk6L3RocmlmdC9zcmMgLWl0IHRocmlmdCAvYmluL2Jhc2gKKworIyMgQ29yZSBUb29sIFZlcnNpb25zIHBlciBEb2NrZXJmaWxlICMjCisKK0xhc3QgdXBkYXRlZDogT2N0b2JlciAxLCAyMDE3CisKK3wgVG9vbCAgICAgIHwgdWJ1bnR1LXhlbmlhbCB8IHVidW50dS1iaW9uaWMgfCBOb3RlcyB8Cit8IDotLS0tLS0tLSB8IDotLS0tLS0tLS0tLS0gfCA6LS0tLS0tLS0tLS0tIHwgOi0tLS0gfAorfCBhbnQgICAgICAgfCAxLjkuNiAgICAgICAgIHwgMS4xMC4zICAgICAgICB8ICAgICAgIHwKK3wgYXV0b2NvbmYgIHwgMi42OSAgICAgICAgICB8IDIuNjkgICAgICAgICAgfCAgICAgICB8Cit8IGF1dG9tYWtlICB8IDEuMTUgICAgICAgICAgfCAxLjE1LjEgICAgICAgIHwgICAgICAgfAorfCBiaXNvbiAgICAgfCAzLjAuNCAgICAgICAgIHwgMy4wLjQgICAgICAgICB8ICAgICAgIHwKK3wgYm9vc3QgICAgIHwgMS41OC4wICAgICAgICB8IDEuNjUuMSAgICAgICAgfCAgICAgICB8Cit8IGNtYWtlICAgICB8IDMuNS4xICAgICAgICAgfCAzLjEwLjIgICAgICAgIHwgICAgICAgfAorfCBjcHBjaGVjayAgfCAxLjcyICAgICAgICAgIHwgMS44MiAgICAgICAgICB8ICAgICAgIHwKK3wgZmxleCAgICAgIHwgMi42LjAgICAgICAgICB8IDIuNi40ICAgICAgICAgfCAgICAgICB8Cit8IGxpYmM2ICAgICB8IDIuMjMgICAgICAgICAgfCAyLjI3ICAgICAgICAgIHwgZ2xpYmMgfAorfCBsaWJldmVudCAgfCAyLjAuMjEgICAgICAgIHwgMi4xLjggICAgICAgICB8ICAgICAgIHwKK3wgbGlic3RkYysrIHwgNS40LjAgICAgICAgICB8IDcuMy4wICAgICAgICAgfCAgICAgICB8Cit8IG1ha2UgICAgICB8IDQuMSAgICAgICAgICAgfCA0LjEgICAgICAgICAgIHwgICAgICAgfAorfCBvcGVuc3NsICAgfCAxLjAuMmcgICAgICAgIHwgMS4xLjBnICAgICAgICB8ICAgICAgIHwKK3wgcXQ1ICAgICAgIHwgNS41LjEgICAgICAgICB8IDUuOS41ICAgICAgICAgfCAgICAgICB8CisKKyMjIENvbXBpbGVyL0xhbmd1YWdlIFZlcnNpb25zIHBlciBEb2NrZXJmaWxlICMjCisKK3wgTGFuZ3VhZ2UgIHwgdWJ1bnR1LXhlbmlhbCB8IHVidW50dS1iaW9uaWMgfCBOb3RlcyB8Cit8IDotLS0tLS0tLSB8IDotLS0tLS0tLS0tLS0gfCA6LS0tLS0tLS0tLS0tIHwgOi0tLS0gfAorfCBhcyBvZiAgICAgfCBNYXIgMDYsIDIwMTggIHwgSmFuIDQsIDIwMTkgICB8ICAgICAgIHwKK3wgYXMzICAgICAgIHwgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgfCBOb3QgaW4gQ0kgfAorfCBDKysgZ2NjICAgfCA1LjQuMCAgICAgICAgIHwgNy4zLjAgICAgICAgICB8ICAgICAgIHwKK3wgQysrIGNsYW5nIHwgMy44ICAgICAgICAgICB8IDYuMCAgICAgICAgICAgfCAgICAgICB8Cit8IEMjIChtb25vKSB8IDQuMi4xLjAgICAgICAgfCA0LjYuMi43ICAgICAgIHwgICAgICAgfAorfCBjX2dsaWIgICAgfCAyLjQ4LjIgICAgICAgIHwgMi41Ni4wICAgICAgICB8ICAgICAgIHwKK3wgY2wgKHNiY2wpIHwgICAgICAgICAgICAgICB8IDEuNC4xNSAgICAgICAgfCAgICAgICB8Cit8IGNvY29hICAgICB8ICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgIHwgTm90IGluIENJIHwKK3wgZCAgICAgICAgIHwgMi4wNzUuMSAgICAgICB8IDIuMDgzLjEgICAgICAgfCAgICAgICB8Cit8IGRhcnQgICAgICB8IDEuMjIuMSAgICAgICAgfCAxLjI0LjMgICAgICAgIHwgICAgICAgfAorfCBkZWxwaGkgICAgfCAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICB8IE5vdCBpbiBDSSB8Cit8IGRvdG5ldCAgICB8IDIuMS40ICAgICAgICAgfCAyLjIuMTAxICAgICAgIHwgICAgICAgfAorfCBlcmxhbmcgICAgfCAxOC4zICAgICAgICAgIHwgMjAuMi4yICAgICAgICB8ICAgICAgIHwKK3wgZ28gICAgICAgIHwgMS43LjYgICAgICAgICB8IDEuMTEuNCAgICAgICAgfCAgICAgICB8Cit8IGhhc2tlbGwgICB8IDcuMTAuMyAgICAgICAgfCA4LjAuMiAgICAgICAgIHwgICAgICAgfAorfCBoYXhlICAgICAgfCAzLjIuMSAgICAgICAgIHwgMy40LjQgICAgICAgICB8IFRIUklGVC00MzUyOiBhdm9pZCAzLjQuMiB8Cit8IGphdmEgICAgICB8IDEuOC4wXzE1MSAgICAgfCAxLjguMF8xOTEgICAgIHwgICAgICAgfAorfCBqcyAgICAgICAgfCAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICB8IFVuc3VyZSBob3cgdG8gbG9vayBmb3IgdmVyc2lvbiBpbmZvPyB8Cit8IGx1YSAgICAgICB8IDUuMi40ICAgICAgICAgfCA1LjIuNCAgICAgICAgIHwgTHVhIDUuMzogc2VlIFRIUklGVC00Mzg2IHwKK3wgbm9kZWpzICAgIHwgNi4xMy4wICAgICAgICB8IDguMTUuMCAgICAgICAgfCAgICAgICB8Cit8IG9jYW1sICAgICB8ICAgICAgICAgICAgICAgfCA0LjA1LjAgICAgICAgIHwgVEhSSUZULTQ1MTc6IG9jYW1sIDQuMDIuMyBvbiB4ZW5pYWwgYXBwZWFycyBicm9rZW4gfAorfCBwZXJsICAgICAgfCA1LjIyLjEgICAgICAgIHwgNS4yNi4xICAgICAgICB8ICAgICAgIHwKK3wgcGhwICAgICAgIHwgNy4wLjIyICAgICAgICB8IDcuMi4xMCAgICAgICAgfCAgICAgICB8Cit8IHB5dGhvbiAgICB8IDIuNy4xMiAgICAgICAgfCAyLjcuMTVyYzEgICAgIHwgICAgICAgfAorfCBweXRob24zICAgfCAzLjUuMiAgICAgICAgIHwgMy42LjcgICAgICAgICB8ICAgICAgIHwKK3wgcnVieSAgICAgIHwgMi4zLjFwMTEyICAgICB8IDIuNS4xcDU3ICAgICAgfCAgICAgICB8Cit8IHJ1c3QgICAgICB8IDEuMTcuMCAgICAgICAgfCAxLjMwLjAgICAgICAgIHwgICAgICAgfAorfCBzbWFsbHRhbGsgfCAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICB8IE5vdCBpbiBDSSB8Cit8IHN3aWZ0ICAgICB8ICAgICAgICAgICAgICAgfCA0LjIuMSAgICAgICAgIHwgICAgICAgfApkaWZmIC0tZ2l0IGEvYnVpbGQvZG9ja2VyL29sZC9WYWdyYW50ZmlsZSBiL2J1aWxkL2RvY2tlci9vbGQvVmFncmFudGZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWVhYzZlNgotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2RvY2tlci9vbGQvVmFncmFudGZpbGUKQEAgLTAsMCArMSw1OSBAQAorIyAtKi0gbW9kZTogcnVieSAtKi0KKyMgdmk6IHNldCBmdD1ydWJ5IDoKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIyBCYXNlIHN5c3RlbSBib290c3RyYXAgc2NyaXB0CiskYm9vdHN0cmFwX3NjcmlwdCA9IDw8X19CT09UU1RSQVBfXworZWNobyAiUHJvdmlzaW9uaW5nIGRlZmF1bHRzIgorCitzdWRvIGFwdC1nZXQgdXBkYXRlIC15CitzdWRvIGFwdC1nZXQgdXBncmFkZSAteQorCisjIEluc3RhbGwgZGVmYXVsdCBwYWNrYWdlcworc3VkbyBhcHQtZ2V0IGluc3RhbGwgLXkgYnVpbGQtZXNzZW50aWFsIGN1cmwgZ2l0CisKKyMgSW5zdGFsbCBsYXRlc3QgRG9ja2VyIHZlcnNpb24KK3N1ZG8gY3VybCAtc1NMIGh0dHBzOi8vZ2V0LmRvY2tlci5pby9ncGcgfCBzdWRvIGFwdC1rZXkgYWRkIC0KK3N1ZG8gZWNobyAiZGViIGh0dHA6Ly9nZXQuZG9ja2VyLmlvL3VidW50dSBkb2NrZXIgbWFpbiIgPiAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9kb2NrZXIubGlzdAorc3VkbyBhcHQtZ2V0IHVwZGF0ZSAteQorc3VkbyBhcHQtZ2V0IGluc3RhbGwgLXkgbGludXgtaW1hZ2UtZXh0cmEtYHVuYW1lIC1yYCBhdWZzLXRvb2xzCitzdWRvIGFwdC1nZXQgaW5zdGFsbCAteSBseGMtZG9ja2VyCisKK2VjaG8gIkZpbmlzaGVkIHByb3Zpc2lvbmluZyBkZWZhdWx0cyIKK19fQk9PVFNUUkFQX18KKworVmFncmFudC5jb25maWd1cmUoIjIiKSBkbyB8Y29uZmlnfAorICBjb25maWcudm0uYm94ID0gInRydXN0eTY0IgorICBjb25maWcudm0uYm94X3VybCA9ICJodHRwczovL2Nsb3VkLWltYWdlcy51YnVudHUuY29tL3ZhZ3JhbnQvdHJ1c3R5L2N1cnJlbnQvdHJ1c3R5LXNlcnZlci1jbG91ZGltZy1hbWQ2NC12YWdyYW50LWRpc2sxLmJveCIKKyAgY29uZmlnLnNzaC5mb3J3YXJkX2FnZW50ID0gdHJ1ZQorCisgIGNvbmZpZy52bS5wcm92aWRlciA6dmlydHVhbGJveCBkbyB8dmJveHwKKyAgICB2Ym94LmN1c3RvbWl6ZSBbIm1vZGlmeXZtIiwgOmlkLCAiLS1tZW1vcnkiLCAiMTAyNCJdCisgICAgdmJveC5jdXN0b21pemUgWyJtb2RpZnl2bSIsIDppZCwgIi0tY3B1cyIsICIyIl0KKyAgZW5kCisKKyAgIyBTZXR1cCB0aGUgZGVmYXVsdCBib290c3RyYXAgc2NyaXB0IGZvciBvdXIgdWJ1bnR1IGJhc2UgYm94IGltYWdlCisgIGNvbmZpZy52bS5wcm92aXNpb24gInNoZWxsIiwgaW5saW5lOiAkYm9vdHN0cmFwX3NjcmlwdAorCisgICMgU2V0dXAgdGhlIGN1c3RvbSBkb2NrZXIgaW1hZ2UgZnJvbSBvdXIgVWJ1bnR1IERvY2tlcmZpbGUKKyAgY29uZmlnLnZtLnByb3Zpc2lvbiAiZG9ja2VyIiBkbyB8ZHwKKyAgICBkLmJ1aWxkX2ltYWdlICIvdmFncmFudC91YnVudHUiLCBhcmdzOiAiLXQgdGhyaWZ0IgorICBlbmQKKworICAjIFNldHVwIHRoZSBjdXN0b20gZG9ja2VyIGltYWdlIGZyb20gb3VyIENlbnRvcyBEb2NrZXJmaWxlCisgICNjb25maWcudm0ucHJvdmlzaW9uICJkb2NrZXIiIGRvIHxkfAorICAjICBkLmJ1aWxkX2ltYWdlICIvdmFncmFudC9jZW50b3MiLCBhcmdzOiAiLXQgdGhyaWZ0LWNlbnRvcyIKKyAgI2VuZAorCitlbmQKZGlmZiAtLWdpdCBhL2J1aWxkL2RvY2tlci9vbGQvY2VudG9zLTcuMy9Eb2NrZXJmaWxlIGIvYnVpbGQvZG9ja2VyL29sZC9jZW50b3MtNy4zL0RvY2tlcmZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk2YmJhYQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2RvY2tlci9vbGQvY2VudG9zLTcuMy9Eb2NrZXJmaWxlCkBAIC0wLDAgKzEsMTk5IEBACisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMgQXBhY2hlIFRocmlmdCBEb2NrZXIgYnVpbGQgZW52aXJvbm1lbnQgZm9yIENlbnRPUworIworIyBLbm93biBtaXNzaW5nIGNsaWVudCBsaWJyYXJpZXM6CisjICAtIGRvdG5ldCAod2lsbCB1cGRhdGUgdG8gMi4wLjAgc2VwYXJhdGVseSkKKyMgIC0gaGF4ZSAobm90IGluIGNlbnRvcykKKworRlJPTSBjZW50b3M6Ny4zLjE2MTEKK01BSU5UQUlORVIgQXBhY2hlIFRocmlmdCA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPgorCitSVU4geXVtIGluc3RhbGwgLXkgZXBlbC1yZWxlYXNlCisKKyMgR2VuZXJhbCBkZXBlbmRlbmNpZXMKK1JVTiB5dW0gaW5zdGFsbCAteSBcCisgICAgICBhdXRvY29uZiBcCisgICAgICBiaXNvbiBcCisgICAgICBiaXNvbi1kZXZlbCBcCisgICAgICBjbGFuZyBcCisgICAgICBjbGFuZy1hbmFseXplciBcCisgICAgICBjbWFrZTMgXAorICAgICAgY3VybCBcCisgICAgICBmbGV4IFwKKyAgICAgIGdjYyBcCisgICAgICBnY2MtYysrIFwKKyAgICAgIGdkYiBcCisgICAgICBnaXQgXAorICAgICAgbGlidG9vbCBcCisgICAgICBtNCBcCisgICAgICBtYWtlIFwKKyAgICAgIHRhciBcCisgICAgICB1bnppcCBcCisgICAgICB2YWxncmluZCBcCisgICAgICB3Z2V0ICYmIFwKKyAgICAgIGxuIC1zIC91c3IvYmluL2NtYWtlMyAvdXNyL2Jpbi9jbWFrZSAmJiBcCisgICAgICBsbiAtcyAvdXNyL2Jpbi9jcGFjazMgL3Vzci9iaW4vY3BhY2sgJiYgXAorICAgICAgbG4gLXMgL3Vzci9iaW4vY3Rlc3QzIC91c3IvYmluL2N0ZXN0CisKKyMgQysrIGRlcGVuZGVuY2llcworUlVOIHl1bSBpbnN0YWxsIC15IFwKKyAgICAgIGJvb3N0LWRldmVsLXN0YXRpYyBcCisgICAgICB6bGliLWRldmVsIFwKKyAgICAgIG9wZW5zc2wtZGV2ZWwgXAorICAgICAgbGliZXZlbnQtZGV2ZWwgJiYgXAorICAgIGNkIC91c3IvbGliNjQgJiYgXAorICAgIGxuIC1zIGxpYmJvb3N0X3RocmVhZC1tdC5hIGxpYmJvb3N0X3RocmVhZC5hCisKKyMgQyMgRGVwZW5kZW5jaWVzCitSVU4geXVtIGluc3RhbGwgLXkgXAorICAgICAgbW9uby1jb3JlIFwKKyAgICAgIG1vbm8tZGV2ZWwgXAorICAgICAgbW9uby13ZWItZGV2ZWwgXAorICAgICAgbW9uby1leHRyYXMKKworIyBEIERlcGVuZGVuY2llcworUlVOIHl1bSBpbnN0YWxsIC15IGh0dHA6Ly9kb3dubG9hZHMuZGxhbmcub3JnL3JlbGVhc2VzLzIueC8yLjA3Ni4wL2RtZC0yLjA3Ni4wLTAuZmVkb3JhLng4Nl82NC5ycG0geGRnLXV0aWxzCitSVU4gY3VybCAtc1NMIGh0dHBzOi8vZ2l0aHViLmNvbS9ELVByb2dyYW1taW5nLURlaW1vcy9vcGVuc3NsL2FyY2hpdmUvbWFzdGVyLnRhci5nenwgdGFyIHh6ICYmIFwKKyAgICBjdXJsIC1zU0wgaHR0cHM6Ly9naXRodWIuY29tL0QtUHJvZ3JhbW1pbmctRGVpbW9zL2xpYmV2ZW50L2FyY2hpdmUvbWFzdGVyLnRhci5nenwgdGFyIHh6ICYmIFwKKyAgICBta2RpciAtcCAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9kZWltb3MgL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvQyAmJiBcCisgICAgbXYgbGliZXZlbnQtbWFzdGVyL2RlaW1vcy8qIG9wZW5zc2wtbWFzdGVyL2RlaW1vcy8qIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L2RlaW1vcy8gJiYgXAorICAgIG12IGxpYmV2ZW50LW1hc3Rlci9DLyogb3BlbnNzbC1tYXN0ZXIvQy8qIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L0MvICYmIFwKKyAgICBybSAtcmYgbGliZXZlbnQtbWFzdGVyIG9wZW5zc2wtbWFzdGVyCisKKyMgRGFydAorUlVOIGNkIC91c3IvbG9jYWwgJiYgXAorICAgIHdnZXQgLXEgaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2RhcnQtYXJjaGl2ZS9jaGFubmVscy9zdGFibGUvcmVsZWFzZS8xLjI0LjIvc2RrL2RhcnRzZGstbGludXgteDY0LXJlbGVhc2UuemlwICYmIFwKKyAgICB1bnppcCAtcSBkYXJ0c2RrLWxpbnV4LXg2NC1yZWxlYXNlLnppcCAmJiBcCisgICAgcm0gZGFydHNkay1saW51eC14NjQtcmVsZWFzZS56aXAKK0VOViBQQVRIIC91c3IvbG9jYWwvZGFydC1zZGsvYmluOiRQQVRICisKKyMgRXJsYW5nIERlcGVuZGVuY2llcworUlVOIGN1cmwgLXNTTCBodHRwOi8vcGFja2FnZXMuZXJsYW5nLXNvbHV0aW9ucy5jb20vcnBtL2NlbnRvcy9lcmxhbmdfc29sdXRpb25zLnJlcG8gLW8gL2V0Yy95dW0ucmVwb3MuZC9lcmxhbmdfc29sdXRpb25zLnJlcG8gJiYgXAorICAgIHl1bSBpbnN0YWxsIC15IFwKKyAgICAgIGVybGFuZy1rZXJuZWwgXAorICAgICAgZXJsYW5nLWVydHMgXAorICAgICAgZXJsYW5nLXN0ZGxpYiBcCisgICAgICBlcmxhbmctZXVuaXQgXAorICAgICAgZXJsYW5nLXJlYmFyIFwKKyAgICAgIGVybGFuZy10b29scworCisjIEdMaWJDIERlcGVuZGVuY2llcworUlVOIHl1bSBpbnN0YWxsIC15IGdsaWIyLWRldmVsCisKKyMgR28gRGVwZW5kZW5jaWVzCitSVU4gY3VybCAtc1NMIGh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9nb2xhbmcvZ28xLjkubGludXgtYW1kNjQudGFyLmd6IHwgdGFyIC1DIC91c3IvbG9jYWwvIC14egorRU5WIFBBVEggL3Vzci9sb2NhbC9nby9iaW46JFBBVEgKKworIyBIYXNrZWxsIERlcGVuZGVuY2llcworUlVOIHl1bSAteSBpbnN0YWxsIGhhc2tlbGwtcGxhdGZvcm0KKworIyBIYXhlIERlcGVuZGVuY2llcworIyBOb3QgaW4gZGViaWFuL3N0cmV0Y2gKKworIyBKYXZhIERlcGVuZGVuY2llcworUlVOIHl1bSBpbnN0YWxsIC15IFwKKyAgICAgIGFudCBcCisgICAgICBqdW5pdCBcCisgICAgICBhbnQtanVuaXQgXAorICAgICAgamF2YS0xLjguMC1vcGVuamRrLWRldmVsCisKKyMgTHVhIERlcGVuZGVuY2llcworIyBMdWEgaW4gZXBlbCBpcyB0b28gb2xkICg1LjEuNCwgbmVlZCA1LjIpIHNvIHdlIGdldCB0aGUgbGF0ZXN0CitSVU4geXVtIGluc3RhbGwgLXkgcmVhZGxpbmUtZGV2ZWwgJiYgXAorICAgIHdnZXQgLXEgaHR0cDovL3d3dy5sdWEub3JnL2Z0cC9sdWEtNS4zLjQudGFyLmd6ICYmIFwKKyAgICB0YXIgeHpmIGx1YS01LjMuNC50YXIuZ3ogJiYgXAorICAgIGNkIGx1YS01LjMuNCAmJiBcCisgICAgc2VkIC1pICdzL0NGTEFHUz0gL0NGTEFHUz0gLWZQSUMgL2cnIHNyYy9NYWtlZmlsZSAmJiBcCisgICAgbWFrZSBsaW51eCAmJiBcCisgICAgbWFrZSBpbnN0YWxsICYmIFwKKyAgICBjZCAuLiAmJiBcCisgICAgcm0gLXJmIGx1YS01KgorCisjIE1pbkdXIERlcGVuZGVuY2llcworUlVOIHl1bSBpbnN0YWxsIC15IFwKKyAgICAgIG1pbmd3MzItYmludXRpbHMgXAorICAgICAgbWluZ3czMi1jcnQgXAorICAgICAgbWluZ3czMi1uc2lzCisKKyMgTm9kZS5qcyBEZXBlbmRlbmNpZXMKKyMgV29yayBhcm91bmQgZXBlbCBpc3N1ZSB3aGVyZSB0aGV5IHJlbW92ZWQgaHR0cC1wYXJzZXIgdGhhdCBub2RlanMgZGVwZW5kcyBvbiEKK1JVTiB5dW0gLXkgaW5zdGFsbCBodHRwczovL29wZW5zb3VyY2UuZW5kYS5ldS9wYWNrYWdlcy9odHRwLXBhcnNlci0yLjcuMS0zLmVsNy54ODZfNjQucnBtCitSVU4geXVtIGluc3RhbGwgLXkgXAorICAgICAgbm9kZWpzIFwKKyAgICAgIG5wbQorCisjIE9jYW1sIERlcGVuZGVuY2llcworUlVOIHl1bSBpbnN0YWxsIC15IFwKKyAgICAgIG9jYW1sIFwKKyAgICAgIG9jYW1sLW9jYW1sZG9jICYmIFwKKyAgICB3Z2V0IC1xIGh0dHBzOi8vcmF3LmdpdGh1Yi5jb20vb2NhbWwvb3BhbS9tYXN0ZXIvc2hlbGwvb3BhbV9pbnN0YWxsZXIuc2ggLU8gLSB8IHNoIC1zIC91c3IvbG9jYWwvYmluICYmIFwKKyAgICBvcGFtIGluaXQgLS15ZXMgJiYgXAorICAgIG9wYW0gaW5zdGFsbCAtLXllcyBvYXNpcyAmJiBcCisgICAgZWNobyAnLiAvcm9vdC8ub3BhbS9vcGFtLWluaXQvaW5pdC5zaCA+IC9kZXYvbnVsbCAyPiAvZGV2L251bGwgfHwgdHJ1ZScgPj4gfi8uYmFzaHJjCisKKyMgUGVybCBEZXBlbmRlbmNpZXMKK1JVTiB5dW0gaW5zdGFsbCAteSBcCisgICAgICBwZXJsIFwKKyAgICAgIHBlcmwtdmVyc2lvbiBcCisgICAgICBwZXJsLUJpdC1WZWN0b3IgXAorICAgICAgcGVybC1DbGFzcy1BY2Nlc3NvciBcCisgICAgICBwZXJsLUV4dFV0aWxzLU1ha2VNYWtlciBcCisgICAgICBwZXJsLVRlc3QtU2ltcGxlIFwKKyAgICAgIHBlcmwtSU8tU29ja2V0LVNTTCBcCisgICAgICBwZXJsLU5ldC1TU0xlYXkgXAorICAgICAgcGVybC1DcnlwdC1TU0xlYXkKKworIyBQSFAgRGVwZW5kZW5jaWVzCitSVU4geXVtIGluc3RhbGwgLXkgXAorICAgICAgcGhwIFwKKyAgICAgIHBocC1kZXZlbCBcCisgICAgICBwaHAtcGVhciBcCisgICAgICByZTJjIFwKKyAgICAgIHBocC1waHB1bml0LVBIUFVuaXQgXAorICAgICAgYnppcDIKKworIyBQeXRob24gRGVwZW5kZW5jaWVzCitSVU4geXVtIGluc3RhbGwgLXkgXAorICAgICAgcHl0aG9uIFwKKyAgICAgIHB5dGhvbi1kZXZlbCBcCisgICAgICBweXRob24tcGlwIFwKKyAgICAgIHB5dGhvbi1zZXR1cHRvb2xzIFwKKyAgICAgIHB5dGhvbjM0IFwKKyAgICAgIHB5dGhvbjM0LWRldmVsIFwKKyAgICAgIHB5dGhvbjM0LXBpcCBcCisgICAgICBweXRob24zNC1zZXR1cHRvb2xzCitSVU4gcGlwMiBpbnN0YWxsIC0tdXBncmFkZSBwaXAKK1JVTiBwaXAyIGluc3RhbGwgLS11cGdyYWRlIGJhY2twb3J0cy5zc2xfbWF0Y2hfaG9zdG5hbWUgaXBhZGRyZXNzIHNldHVwdG9vbHMgc2l4IHRvcm5hZG8gdG9ybmFkby10ZXN0aW5nIHR3aXN0ZWQgdmlydHVhbGVudiB6b3BlLWludGVyZmFjZQorUlVOIHBpcDMgaW5zdGFsbCAtLXVwZ3JhZGUgcGlwCitSVU4gcGlwMyBpbnN0YWxsIC0tdXBncmFkZSBiYWNrcG9ydHMuc3NsX21hdGNoX2hvc3RuYW1lIGlwYWRkcmVzcyBzZXR1cHRvb2xzIHNpeCB0b3JuYWRvIHRvcm5hZG8tdGVzdGluZyB0d2lzdGVkIHZpcnR1YWxlbnYgem9wZS1pbnRlcmZhY2UKKworIyBSdWJ5IERlcGVuZGVuY2llcworUlVOIHl1bSBpbnN0YWxsIC15IFwKKyAgICAgIHJ1YnkgXAorICAgICAgcnVieS1kZXZlbCBcCisgICAgICBydWJ5Z2VtcyAmJiBcCisgICAgZ2VtIGluc3RhbGwgYnVuZGxlciByYWtlCisKKyMgUnVzdAorUlVOIGN1cmwgaHR0cHM6Ly9zaC5ydXN0dXAucnMgLXNTZiB8IHNoIC1zIC0tIC15IC0tZGVmYXVsdC10b29sY2hhaW4gMS4xNy4wCitFTlYgUEFUSCAvcm9vdC8uY2FyZ28vYmluOiRQQVRICisKKyMgQ2xlYW4gdXAKK1JVTiBybSAtcmYgL3RtcC8qICYmIFwKKyAgICB5dW0gY2xlYW4gYWxsCisKK0VOViBUSFJJRlRfUk9PVCAvdGhyaWZ0CitSVU4gbWtkaXIgLXAgJFRIUklGVF9ST09UL3NyYworQ09QWSBEb2NrZXJmaWxlICRUSFJJRlRfUk9PVC8KK1dPUktESVIgJFRIUklGVF9ST09UL3NyYwpkaWZmIC0tZ2l0IGEvYnVpbGQvZG9ja2VyL29sZC9kZWJpYW4tamVzc2llL0RvY2tlcmZpbGUgYi9idWlsZC9kb2NrZXIvb2xkL2RlYmlhbi1qZXNzaWUvRG9ja2VyZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmM3NGZjCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvZG9ja2VyL29sZC9kZWJpYW4tamVzc2llL0RvY2tlcmZpbGUKQEAgLTAsMCArMSwyMDQgQEAKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIyBBcGFjaGUgVGhyaWZ0IERvY2tlciBidWlsZCBlbnZpcm9ubWVudCBmb3IgRGViaWFuCisjCisjIEtub3duIG1pc3NpbmcgY2xpZW50IGxpYnJhcmllczoKKyMgIC0gZG90bmV0Y29yZQorIyAgLSBydXN0CisKK0ZST00gYnVpbGRwYWNrLWRlcHM6amVzc2llLXNjbQorTUFJTlRBSU5FUiBBcGFjaGUgVGhyaWZ0IDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+CisKK0VOViBERUJJQU5fRlJPTlRFTkQgbm9uaW50ZXJhY3RpdmUKKworIyBBZGQgYXB0IHNvdXJjZXMKKyMgamVzc2llLWJhY2twb3J0cyBmb3IgY21ha2UgYW5kIHNvbWUgcnVieSBiaXRzCitSVU4gZWNobyAiZGViIGh0dHA6Ly9mdHAuZGViaWFuLm9yZy9kZWJpYW4gamVzc2llLWJhY2twb3J0cyBtYWluIiA+IC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL2plc3NpZS1iYWNrcG9ydHMubGlzdAorCisjIERhcnQKK1JVTiBjdXJsIGh0dHBzOi8vZGwtc3NsLmdvb2dsZS5jb20vbGludXgvbGludXhfc2lnbmluZ19rZXkucHViIHwgYXB0LWtleSBhZGQgLSAmJiBcCisgICAgY3VybCBodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQuZGFydGxhbmcub3JnL2xpbnV4L2RlYmlhbi9kYXJ0X3N0YWJsZS5saXN0ID4gL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvZGFydF9zdGFibGUubGlzdCAmJiBcCisgICAgc2VkIC1pIC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL2RhcnRfc3RhYmxlLmxpc3QgLWUgJ3MvaHR0cHM6L2h0dHA6L2cnCisKK1JVTiBhcHQtZ2V0IHVwZGF0ZSAmJiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgR2VuZXJhbCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGJpc29uIFwKKyAgICAgIGJ1aWxkLWVzc2VudGlhbCBcCisgICAgICBjbGFuZyBcCisgICAgICBkZWJoZWxwZXIgXAorICAgICAgZmxleCBcCisgICAgICBwa2ctY29uZmlnICYmIFwKKyAgICBhcHQtZ2V0IC10IGplc3NpZS1iYWNrcG9ydHMgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBjbWFrZQorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEMrKyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGxpYmJvb3N0LWRldiBcCisgICAgICBsaWJib29zdC1maWxlc3lzdGVtLWRldiBcCisgICAgICBsaWJib29zdC1wcm9ncmFtLW9wdGlvbnMtZGV2IFwKKyAgICAgIGxpYmJvb3N0LXN5c3RlbS1kZXYgXAorICAgICAgbGliYm9vc3QtdGVzdC1kZXYgXAorICAgICAgbGliYm9vc3QtdGhyZWFkLWRldiBcCisgICAgICBsaWJldmVudC1kZXYgXAorICAgICAgbGlic3NsLWRldiBcCisgICAgICBxdDUtZGVmYXVsdCBcCisgICAgICBxdGJhc2U1LWRldiBcCisgICAgICBxdGJhc2U1LWRldi10b29scworCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEphdmEgZGVwZW5kZW5jaWVzYCBcCisgICAgICBhbnQgXAorICAgICAgYW50LW9wdGlvbmFsIFwKKyAgICAgIG9wZW5qZGstNy1qZGsgXAorICAgICAgbWF2ZW4KKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBQeXRob24gZGVwZW5kZW5jaWVzYCBcCisgICAgICBweXRob24tYWxsIFwKKyAgICAgIHB5dGhvbi1hbGwtZGJnIFwKKyAgICAgIHB5dGhvbi1hbGwtZGV2IFwKKyAgICAgIHB5dGhvbi1waXAgXAorICAgICAgcHl0aG9uLXNldHVwdG9vbHMgXAorICAgICAgcHl0aG9uLXR3aXN0ZWQgXAorICAgICAgcHl0aG9uLXpvcGUuaW50ZXJmYWNlIFwKKyAgICAgIHB5dGhvbjMtYWxsIFwKKyAgICAgIHB5dGhvbjMtYWxsLWRiZyBcCisgICAgICBweXRob24zLWFsbC1kZXYgXAorICAgICAgcHl0aG9uMy1zZXR1cHRvb2xzIFwKKyAgICAgIHB5dGhvbjMtcGlwCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUnVieSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIHJ1YnkgXAorICAgICAgcnVieS1kZXYgXAorYCMgUGVybCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGxpYmJpdC12ZWN0b3ItcGVybCBcCisgICAgICBsaWJjbGFzcy1hY2Nlc3Nvci1jbGFzcy1wZXJsIFwKKyAgICAgIGxpYmNyeXB0LXNzbGVheS1wZXJsIFwKKyAgICAgIGxpYmlvLXNvY2tldC1zc2wtcGVybCBcCisgICAgICBsaWJuZXQtc3NsZWF5LXBlcmwKKworUlVOIGFwdC1nZXQgLXQgamVzc2llLWJhY2twb3J0cyBpbnN0YWxsIC15IHJ1YnktYnVuZGxlcgorUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBQaHAgZGVwZW5kZW5jaWVzYCBcCisgICAgICBwaHA1IFwKKyAgICAgIHBocDUtZGV2IFwKKyAgICAgIHBocDUtY2xpIFwKKyAgICAgIHBocC1wZWFyIFwKKyAgICAgIHJlMmMgXAorICAgICAgcGhwdW5pdCBcCitgIyBHbGliQyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGxpYmdsaWIyLjAtZGV2CisKK1JVTiBhcHQtZ2V0IHVwZGF0ZSAmJiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgRXJsYW5nIGRlcGVuZGVuY2llc2AgXAorICAgICAgZXJsYW5nLWJhc2UgXAorICAgICAgZXJsYW5nLWV1bml0IFwKKyAgICAgIGVybGFuZy1kZXYgXAorICAgICAgZXJsYW5nLXRvb2xzIFwKKyAgICAgIHJlYmFyCisKK1JVTiBhcHQtZ2V0IHVwZGF0ZSAmJiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgSGFza2VsbCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGdoYyBcCisgICAgICBjYWJhbC1pbnN0YWxsIFwKK2AjIEhheGUgZGVwZW5kZW5jaWVzYCBcCisgICAgICBuZWtvIFwKKyAgICAgIG5la28tZGV2IFwKKyAgICAgIGxpYm5la28wCisKK1JVTiBhcHQtZ2V0IHVwZGF0ZSAmJiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgTm9kZS5qcyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIG5vZGVqcyBcCisgICAgICBub2RlanMtZGV2IFwKKyAgICAgIG5vZGVqcy1sZWdhY3kgXAorICAgICAgbnBtCisKK1JVTiBhcHQtZ2V0IHVwZGF0ZSAmJiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgQ1NoYXJwIGRlcGVuZGVuY2llc2AgXAorICAgICAgbGlibW9uby1zeXN0ZW0td2ViMi4wLWNpbCBcCisgICAgICBtb25vLWRldmVsCisKK1JVTiBhcHQtZ2V0IHVwZGF0ZSAmJiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgRCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIHhkZy11dGlscyBcCitgIyBEYXJ0IGRlcGVuZGVuY2llc2AgXAorICAgICAgZGFydCBcCitgIyBMdWEgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsdWE1LjIgXAorICAgICAgbHVhNS4yLWRldiBcCitgIyBNaW5HVyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIG1pbmd3MzIgXAorICAgICAgbWluZ3czMi1iaW51dGlscyBcCitgIyAgICAgIG1pbmd3MzItcnVudGltZWAgXAorICAgICAgbnNpcyBcCitgIyBDbGVhbiB1cGAgXAorICAgICYmIHJtIC1yZiAvdmFyL2NhY2hlL2FwdC8qICYmIFwKKyAgICBybSAtcmYgL3Zhci9saWIvYXB0L2xpc3RzLyogJiYgXAorICAgIHJtIC1yZiAvdG1wLyogJiYgXAorICAgIHJtIC1yZiAvdmFyL3RtcC8qCisKKyMgUnVieQorUlVOIGdlbSBpbnN0YWxsIGJ1bmRsZXIgLS1uby1yaSAtLW5vLXJkb2MKKworIyBQeXRob24gb3B0aW9uYWwgZGVwZW5kZW5jaWVzCitSVU4gcGlwMiBpbnN0YWxsIC1VIGlwYWRkcmVzcyBiYWNrcG9ydHMuc3NsX21hdGNoX2hvc3RuYW1lIHRvcm5hZG8KK1JVTiBwaXAzIGluc3RhbGwgLVUgYmFja3BvcnRzLnNzbF9tYXRjaF9ob3N0bmFtZSB0b3JuYWRvCisKKyMgR28KK1JVTiBjdXJsIC1zU0wgaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2dvbGFuZy9nbzEuNC4zLmxpbnV4LWFtZDY0LnRhci5neiB8IHRhciAtQyAvdXNyL2xvY2FsLyAteHoKK0VOViBQQVRIIC91c3IvbG9jYWwvZ28vYmluOiRQQVRICisKKyMgSGF4ZQorUlVOIG1rZGlyIC1wIC91c3IvbGliL2hheGUgJiYgXAorICAgIHdnZXQgLU8gLSBodHRwczovL2dpdGh1Yi5jb20vSGF4ZUZvdW5kYXRpb24vaGF4ZS9yZWxlYXNlcy9kb3dubG9hZC8zLjIuMS9oYXhlLTMuMi4xLWxpbnV4NjQudGFyLmd6IHwgXAorICAgIHRhciAtQyAvdXNyL2xpYi9oYXhlIC0tc3RyaXAtY29tcG9uZW50cz0xIC14eiAmJiBcCisgICAgbG4gLXMgL3Vzci9saWIvaGF4ZS9oYXhlIC91c3IvYmluL2hheGUgJiYgXAorICAgIGxuIC1zIC91c3IvbGliL2hheGUvaGF4ZWxpYiAvdXNyL2Jpbi9oYXhlbGliICYmIFwKKyAgICBta2RpciAtcCAvdXNyL2xpYi9oYXhlL2xpYiAgJiYgXAorICAgIGNobW9kIC1SIDc3NyAvdXNyL2xpYi9oYXhlL2xpYiAmJiBcCisgICAgaGF4ZWxpYiBzZXR1cCAvdXNyL2xpYi9oYXhlL2xpYiAmJiBcCisgICAgaGF4ZWxpYiBpbnN0YWxsIGh4Y3BwCisKKyMgRAorUlVOIGN1cmwgLXNTTCBodHRwOi8vZG93bmxvYWRzLmRsYW5nLm9yZy9yZWxlYXNlcy8yLngvMi4wNzAuMC9kbWRfMi4wNzAuMC0wX2FtZDY0LmRlYiAtbyAvdG1wL2RtZF8yLjA3MC4wLTBfYW1kNjQuZGViICYmIFwKKyAgICBkcGtnIC1pIC90bXAvZG1kXzIuMDcwLjAtMF9hbWQ2NC5kZWIgJiYgXAorICAgIHJtIC90bXAvZG1kXzIuMDcwLjAtMF9hbWQ2NC5kZWIgJiYgXAorICAgIGN1cmwgLXNTTCBodHRwczovL2dpdGh1Yi5jb20vRC1Qcm9ncmFtbWluZy1EZWltb3Mvb3BlbnNzbC9hcmNoaXZlL21hc3Rlci50YXIuZ3p8IHRhciB4eiAmJiBcCisgICAgY3VybCAtc1NMIGh0dHBzOi8vZ2l0aHViLmNvbS9ELVByb2dyYW1taW5nLURlaW1vcy9saWJldmVudC9hcmNoaXZlL21hc3Rlci50YXIuZ3p8IHRhciB4eiAmJiBcCisgICAgbWtkaXIgLXAgL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvZGVpbW9zIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L0MgJiYgXAorICAgIG12IGxpYmV2ZW50LW1hc3Rlci9kZWltb3MvKiBvcGVuc3NsLW1hc3Rlci9kZWltb3MvKiAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9kZWltb3MvICYmIFwKKyAgICBtdiBsaWJldmVudC1tYXN0ZXIvQy8qIG9wZW5zc2wtbWFzdGVyL0MvKiAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9DLyAmJiBcCisgICAgcm0gLXJmIGxpYmV2ZW50LW1hc3RlciBvcGVuc3NsLW1hc3RlciAmJiBcCisgICAgZWNobyAnZ2NjIC1XbCwtLW5vLWFzLW5lZWRlZCAkKicgPiAvdXNyL2xvY2FsL2Jpbi9nY2MtZG1kICYmIFwKKyAgICBjaG1vZCA3NTUgL3Vzci9sb2NhbC9iaW4vZ2NjLWRtZCAmJiBcCisgICAgZWNobyAnQ0M9L3Vzci9sb2NhbC9iaW4vZ2NjLWRtZCcgPj4gL2V0Yy9kbWQuY29uZgorCisjIERhcnQKK0VOViBQQVRIIC91c3IvbGliL2RhcnQvYmluOiRQQVRICisKKyMgT0NhbWwKK1JVTiBlY2hvICdkZWIgaHR0cDovL3BwYS5sYXVuY2hwYWQubmV0L2F2c20vcHBhL3VidW50dSB0cnVzdHkgbWFpbicgPiAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9hdnNtLW9mZmljaWFsLW9jYW1sLmxpc3QgJiYgXAorICAgIGdwZyAtLWtleXNlcnZlciBrZXlzZXJ2ZXIudWJ1bnR1LmNvbSAtLXJlY3YgNjE3MDdCMDkgJiYgXAorICAgIGdwZyAtLWV4cG9ydCAtLWFybW9yIDYxNzA3QjA5IHwgYXB0LWtleSBhZGQgLSAmJiBcCisgICAgYXB0LWdldCB1cGRhdGUgJiYgXAorICAgIGFwdC1nZXQgaW5zdGFsbCAteSBvY2FtbCBvcGFtICYmIFwKKyAgICBvcGFtIGluaXQgJiYgXAorICAgIG9wYW0gaW5zdGFsbCBvYXNpcworCisjIEZvcmNlIHV0ZjggbG9jYWxlIHRvIHN1Y2Nlc3NmdWxseSBidWlsZCBIYXNrZWxsIHRmLXJhbmRvbQorRU5WIExDX0FMTCBDLlVURi04CisKK0VOViBUSFJJRlRfUk9PVCAvdGhyaWZ0CitSVU4gbWtkaXIgLXAgJFRIUklGVF9ST09UL3NyYworQ09QWSBEb2NrZXJmaWxlICRUSFJJRlRfUk9PVC8KK1dPUktESVIgJFRIUklGVF9ST09UL3NyYwpkaWZmIC0tZ2l0IGEvYnVpbGQvZG9ja2VyL29sZC9kZWJpYW4tc3RyZXRjaC9Eb2NrZXJmaWxlIGIvYnVpbGQvZG9ja2VyL29sZC9kZWJpYW4tc3RyZXRjaC9Eb2NrZXJmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwM2VlY2QKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9kb2NrZXIvb2xkL2RlYmlhbi1zdHJldGNoL0RvY2tlcmZpbGUKQEAgLTAsMCArMSwyMzEgQEAKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIyBBcGFjaGUgVGhyaWZ0IERvY2tlciBidWlsZCBlbnZpcm9ubWVudCBmb3IgRGViaWFuIFN0cmV0Y2gKKyMKKyMgS25vd24gaXNzdWVzOgorIyAtIGQ6IGRlaW1vcyBmb3IgbGliZXZlbnQgYW5kIG9wZW5zc2wgZGlzYWJsZWQgLSBidWlsZCBlcnJvcnMKKyMgLSBkb3RuZXRjb3JlLCBiZWNhdXNlIG5ldGNvcmUgaXMgZm9yIDEuMC4wLXByZXZpZXcgYW5kIDIuMC4wIGlzIG91dAorIyAtIHJ1c3Q6IGNhcmdvIG5vdCBpbiBkZWJpYW4gcmVwbyAtIHBlcmhhcHMgbm90IG5lZWRlZD8KKworRlJPTSBidWlsZHBhY2stZGVwczpzdHJldGNoLXNjbQorTUFJTlRBSU5FUiBBcGFjaGUgVGhyaWZ0IDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+CisKK0VOViBERUJJQU5fRlJPTlRFTkQgbm9uaW50ZXJhY3RpdmUKKworIyMjIEFkZCBhcHQgcmVwb3MKKworUlVOIGFwdC1nZXQgdXBkYXRlICYmIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBhcHQgYXB0LXRyYW5zcG9ydC1odHRwcyBjdXJsIHdnZXQgYXB0LXV0aWxzCisKKyMgRAorUlVOIHdnZXQgaHR0cDovL21hc3Rlci5kbC5zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdC9kLWFwdC9maWxlcy9kLWFwdC5saXN0IC1PIC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL2QtYXB0Lmxpc3QgJiYgXAorICAgIGFwdC1nZXQgdXBkYXRlICYmIGFwdC1nZXQgLXkgLS1hbGxvdy11bmF1dGhlbnRpY2F0ZWQgaW5zdGFsbCAtLXJlaW5zdGFsbCBkLWFwdC1rZXlyaW5nCisKKyMgRGFydAorUlVOIGN1cmwgaHR0cHM6Ly9kbC1zc2wuZ29vZ2xlLmNvbS9saW51eC9saW51eF9zaWduaW5nX2tleS5wdWIgfCBhcHQta2V5IGFkZCAtICYmIFwKKyAgICBjdXJsIGh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC5kYXJ0bGFuZy5vcmcvbGludXgvZGViaWFuL2RhcnRfc3RhYmxlLmxpc3QgPiAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9kYXJ0X3N0YWJsZS5saXN0ICYmIFwKKyAgICBzZWQgLWkgL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvZGFydF9zdGFibGUubGlzdCAtZSAncy9odHRwczovaHR0cDovZycKKworIyBkb3RuZXQgKGNvcmUpIDIuMC4wIC0gcHJvamVjdCBpc24ndCByZWFkeSBmb3IgdGhpcyB5ZXQ6CisjIFJVTiBjdXJsIGh0dHBzOi8vcGFja2FnZXMubWljcm9zb2Z0LmNvbS9rZXlzL21pY3Jvc29mdC5hc2MgfCBncGcgLS1kZWFybW9yID4gL2V0Yy9hcHQvdHJ1c3RlZC5ncGcuZC9taWNyb3NvZnQuZ3BnICYmIFwKKyMgICAgIGVjaG8gImRlYiBbYXJjaD1hbWQ2NF0gaHR0cHM6Ly9wYWNrYWdlcy5taWNyb3NvZnQuY29tL3JlcG9zL21pY3Jvc29mdC11YnVudHUteGVuaWFsLXByb2QgeGVuaWFsIG1haW4iID4gL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvZG90bmV0ZGV2Lmxpc3QKKworIyBub2RlLmpzICh0aGlzIHN0ZXAgcnVucyBhcHQtZ2V0IHVwZGF0ZSBpbnRlcm5hbGx5KQorUlVOIGN1cmwgLXNMIGh0dHBzOi8vZGViLm5vZGVzb3VyY2UuY29tL3NldHVwXzgueCB8IGJhc2gKKworCisjIyMgaW5zdGFsbCBnZW5lcmFsIGRlcGVuZGVuY2llcworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBHZW5lcmFsIGRlcGVuZGVuY2llc2AgXAorICAgICAgYmFzaC1jb21wbGV0aW9uIFwKKyAgICAgIGJpc29uIFwKKyAgICAgIGJ1aWxkLWVzc2VudGlhbCBcCisgICAgICBjbGFuZyBcCisgICAgICBjbWFrZSBcCisgICAgICBkZWJoZWxwZXIgXAorICAgICAgZmxleCBcCisgICAgICBnZGIgXAorICAgICAgbmluamEtYnVpbGQgXAorICAgICAgcGtnLWNvbmZpZyBcCisgICAgICB2YWxncmluZCBcCisgICAgICB2aW0KKworCisjIyMgbGFuZ3VhZ2VzCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgQysrIGRlcGVuZGVuY2llc2AgXAorICAgICAgbGliYm9vc3QtZGV2IFwKKyAgICAgIGxpYmJvb3N0LWZpbGVzeXN0ZW0tZGV2IFwKKyAgICAgIGxpYmJvb3N0LXByb2dyYW0tb3B0aW9ucy1kZXYgXAorICAgICAgbGliYm9vc3Qtc3lzdGVtLWRldiBcCisgICAgICBsaWJib29zdC10ZXN0LWRldiBcCisgICAgICBsaWJib29zdC10aHJlYWQtZGV2IFwKKyAgICAgIGxpYmV2ZW50LWRldiBcCisgICAgICBsaWJzc2wtZGV2IFwKKyAgICAgIHF0NS1kZWZhdWx0IFwKKyAgICAgIHF0YmFzZTUtZGV2IFwKKyAgICAgIHF0YmFzZTUtZGV2LXRvb2xzCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgY3NoYXJwIChtb25vKSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIG1vbm8tZGV2ZWwKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBEIGRlcGVuZGVuY2llc2AgXAorICAgICAgZG1kLWJpbiBcCisgICAgICBsaWJldmVudC1kZXYgXAorICAgICAgbGlic3NsLWRldiBcCisgICAgICB4ZGctdXRpbHMKKyMgbGliZXZlbnQgZGVpbW9zIGRpc2FibGVkIC0gYnVpbGQgZXJyb3JzCisjIFJVTiBta2RpciAtcCAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9kZWltb3MgL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvQyAmJiBcCisjICAgICBjdXJsIC1zU0wgaHR0cHM6Ly9naXRodWIuY29tL0QtUHJvZ3JhbW1pbmctRGVpbW9zL2xpYmV2ZW50L2FyY2hpdmUvbWFzdGVyLnRhci5nenwgdGFyIHh6ICYmIFwKKyMgICAgIG12IGxpYmV2ZW50LW1hc3Rlci9kZWltb3MvKiAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9kZWltb3MvICYmIFwKKyMgICAgIG12IGxpYmV2ZW50LW1hc3Rlci9DLyogL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvQy8gJiYgXAorIyAgICAgcm0gLXJmIGxpYmV2ZW50LW1hc3RlcgorIyBvcGVuc3NsIGRlaW1vcyBkb2Vzbid0IHdvcmsgd2l0aCBvcGVuc3NsLTEuMS4wIC0gZGlzYWJsaW5nIGl0IGZvciBub3c6CisjIFJVTiBjdXJsIC1zU0wgaHR0cHM6Ly9naXRodWIuY29tL0QtUHJvZ3JhbW1pbmctRGVpbW9zL29wZW5zc2wvYXJjaGl2ZS9tYXN0ZXIudGFyLmd6fCB0YXIgeHogJiYgXAorIyAgICAgbXYgb3BlbnNzbC1tYXN0ZXIvZGVpbW9zLyogL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvZGVpbW9zLyAmJiBcCisjICAgICBtdiBvcGVuc3NsLW1hc3Rlci9DLyogL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvQy8gJiYgXAorIyAgICAgcm0gLXJmIG9wZW5zc2wtbWFzdGVyCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgRGFydCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGRhcnQKK0VOViBQQVRIIC91c3IvbGliL2RhcnQvYmluOiRQQVRICisKKyMgcHJvamVjdCBpc24ndCByZWFkeSBmb3IgdGhpcyBxdWl0ZSB5ZXQ6CisjIFJVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorIyBgIyBkb3RuZXQgY29yZSBkZXBlbmRlbmNpZXNgIFwKKyMgICAgICAgZG90bmV0LXNkay0yLjAuMAorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEVybGFuZyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGVybGFuZy1iYXNlIFwKKyAgICAgIGVybGFuZy1ldW5pdCBcCisgICAgICBlcmxhbmctZGV2IFwKKyAgICAgIGVybGFuZy10b29scyBcCisgICAgICByZWJhcgorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEdsaWJDIGRlcGVuZGVuY2llc2AgXAorICAgICAgbGliZ2xpYjIuMC1kZXYKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBnb2xhbmcgKGdvKSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGdvbGFuZy1nbworCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEhhc2tlbGwgZGVwZW5kZW5jaWVzYCBcCisgICAgICBnaGMgXAorICAgICAgY2FiYWwtaW5zdGFsbAorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEhheGUgZGVwZW5kZW5jaWVzYCBcCisgICAgICBoYXhlIFwKKyAgICAgIG5la28gXAorICAgICAgbmVrby1kZXYKK1JVTiBoYXhlbGliIHNldHVwIC0tYWx3YXlzIC91c3Ivc2hhcmUvaGF4ZS9saWIgJiYgXAorICAgIGhheGVsaWIgaW5zdGFsbCAtLWFsd2F5cyBoeGNwcAorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEphdmEgZGVwZW5kZW5jaWVzYCBcCisgICAgICBhbnQgXAorICAgICAgYW50LW9wdGlvbmFsIFwKKyAgICAgIG9wZW5qZGstOC1qZGsgXAorICAgICAgbWF2ZW4KKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBMdWEgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsdWE1LjIgXAorICAgICAgbHVhNS4yLWRldgorIyBodHRwczovL2J1Z3MubGF1bmNocGFkLm5ldC91YnVudHUvK3NvdXJjZS9sdWE1LjMvK2J1Zy8xNzA3MjEyCisjIHNhbWUgZm9yIGRlYmlhbiBzdHJldGNoCisjIGx1YTUuMyBkb2VzIG5vdCBpbnN0YWxsIGFsdGVybmF0aXZlcyBzbyBzdGljayB3aXRoIDUuMiBoZXJlCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgTm9kZS5qcyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIG5vZGVqcworCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIE9DYW1sIGRlcGVuZGVuY2llc2AgXAorICAgICAgb2NhbWwgXAorICAgICAgb3BhbSAmJiBcCisgICAgb3BhbSBpbml0IC0teWVzICYmIFwKKyAgICBvcGFtIGluc3RhbGwgLS15ZXMgb2FzaXMKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBQZXJsIGRlcGVuZGVuY2llc2AgXAorICAgICAgbGliYml0LXZlY3Rvci1wZXJsIFwKKyAgICAgIGxpYmNsYXNzLWFjY2Vzc29yLWNsYXNzLXBlcmwgXAorICAgICAgbGliY3J5cHQtc3NsZWF5LXBlcmwgXAorICAgICAgbGliaW8tc29ja2V0LXNzbC1wZXJsIFwKKyAgICAgIGxpYm5ldC1zc2xlYXktcGVybAorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFBocCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIHBocDcuMCBcCisgICAgICBwaHA3LjAtY2xpIFwKKyAgICAgIHBocDcuMC1kZXYgXAorICAgICAgcGhwLXBlYXIgXAorICAgICAgcmUyYyBcCisgICAgICBwaHB1bml0CisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUHl0aG9uIGRlcGVuZGVuY2llc2AgXAorICAgICAgcHl0aG9uLWFsbCBcCisgICAgICBweXRob24tYWxsLWRiZyBcCisgICAgICBweXRob24tYWxsLWRldiBcCisgICAgICBweXRob24tYmFja3BvcnRzLnNzbC1tYXRjaC1ob3N0bmFtZSBcCisgICAgICBweXRob24taXBhZGRyZXNzIFwKKyAgICAgIHB5dGhvbi1waXAgXAorICAgICAgcHl0aG9uLXNldHVwdG9vbHMgXAorICAgICAgcHl0aG9uLXNpeCBcCisgICAgICBweXRob24tdG9ybmFkbyBcCisgICAgICBweXRob24tdHdpc3RlZCBcCisgICAgICBweXRob24td2hlZWwgXAorICAgICAgcHl0aG9uLXpvcGUuaW50ZXJmYWNlIFwKKyAgICAgIHB5dGhvbjMtYWxsIFwKKyAgICAgIHB5dGhvbjMtYWxsLWRiZyBcCisgICAgICBweXRob24zLWFsbC1kZXYgXAorICAgICAgcHl0aG9uMy1zZXR1cHRvb2xzIFwKKyAgICAgIHB5dGhvbjMtc2l4IFwKKyAgICAgIHB5dGhvbjMtdG9ybmFkbyBcCisgICAgICBweXRob24zLXR3aXN0ZWQgXAorICAgICAgcHl0aG9uMy13aGVlbCBcCisgICAgICBweXRob24zLXpvcGUuaW50ZXJmYWNlICYmIFwKKyAgICBwaXAgaW5zdGFsbCAtLXVwZ3JhZGUgYmFja3BvcnRzLnNzbF9tYXRjaF9ob3N0bmFtZQorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFJ1YnkgZGVwZW5kZW5jaWVzYCBcCisgICAgICBydWJ5IFwKKyAgICAgIHJ1YnktZGV2IFwKKyAgICAgIHJ1YnktYnVuZGxlcgorUlVOIGdlbSBpbnN0YWxsIGJ1bmRsZXIgLS1uby1yaSAtLW5vLXJkb2MKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBSdXN0IGRlcGVuZGVuY2llc2AgXAorICAgICAgcnVzdGMKKworIyBVcGRhdGUgYW55dGhpbmcgZWxzZSBsZWZ0IGhhbmdpbmcKK1JVTiBhcHQtZ2V0IGRpc3QtdXBncmFkZSAteQorCisjIENsZWFuIHVwCitSVU4gcm0gLXJmIC92YXIvY2FjaGUvYXB0LyogJiYgXAorICAgIHJtIC1yZiAvdmFyL2xpYi9hcHQvbGlzdHMvKiAmJiBcCisgICAgcm0gLXJmIC90bXAvKiAmJiBcCisgICAgcm0gLXJmIC92YXIvdG1wLyoKKworRU5WIFRIUklGVF9ST09UIC90aHJpZnQKK1JVTiBta2RpciAtcCAkVEhSSUZUX1JPT1Qvc3JjCitDT1BZIERvY2tlcmZpbGUgJFRIUklGVF9ST09ULworV09SS0RJUiAkVEhSSUZUX1JPT1Qvc3JjCmRpZmYgLS1naXQgYS9idWlsZC9kb2NrZXIvb2xkL3VidW50dS10cnVzdHkvRG9ja2VyZmlsZSBiL2J1aWxkL2RvY2tlci9vbGQvdWJ1bnR1LXRydXN0eS9Eb2NrZXJmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4ZTRkM2IKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9kb2NrZXIvb2xkL3VidW50dS10cnVzdHkvRG9ja2VyZmlsZQpAQCAtMCwwICsxLDI0NCBAQAorIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjCisjIEFwYWNoZSBUaHJpZnQgRG9ja2VyIGJ1aWxkIGVudmlyb25tZW50IGZvciBVYnVudHUgVHJ1c3R5CisjIFVzaW5nIGFsbCBzdG9jayBVYnVudHUgVHJ1c3R5IHBhY2thZ2luZyBleGNlcHQgZm9yOgorIyAtIGQ6IGRvZXMgbm90IGNvbWUgd2l0aCBVYnVudHUgc28gd2UncmUgaW5zdGFsbGluZyAyLjA3MC4wCisjIC0gZGFydDogZG9lcyBub3QgY29tZSB3aXRoIFVidW50dSBzbyB3ZSdyZSBpbnN0YWxsaW5nIDEuMjAuMQorIyAtIGRvdG5ldGNvcmUsIGRpc2FibGVkIGJlY2F1c2UgbmV0Y29yZSBpcyBmb3IgMS4wLjAtcHJldmlldyBhbmQgMi4wLjAgaXMgb3V0CisjIC0gaGF4ZSwgZGlzYWJsZWQgYmVjYXVzZSB0aGUgZGlzdHJvIGNvbWVzIHdpdGggMy4wLjAgYW5kIGl0IGNvcmVzIHdoaWxlIGluc3RhbGxpbmcKKyMgLSBub2RlLmpzLCBkaXNhYmxlZCBiZWNhdXNlIGl0IGlzIGF0IDAuMTAuMCBpbiB0aGUgZGlzdHJvIHdoaWNoIGlzIHRvbyBvbGQgKG5lZWQgNCspCisjIC0gb2NhbWwsIGRpc2FibGVkIGJlY2F1c2UgaXQgZmFpbHMgdG8gaW5zdGFsbCBwcm9wZXJseQorIworCitGUk9NIGJ1aWxkcGFjay1kZXBzOnRydXN0eS1zY20KK01BSU5UQUlORVIgQXBhY2hlIFRocmlmdCA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPgorRU5WIERFQklBTl9GUk9OVEVORCBub25pbnRlcmFjdGl2ZQorCisjIyMgQWRkIGFwdCByZXBvcworCitSVU4gYXB0LWdldCB1cGRhdGUgJiYgXAorICAgIGFwdC1nZXQgZGlzdC11cGdyYWRlIC15ICYmIFwKKyAgICBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorICAgICAgYXB0IFwKKyAgICAgIGFwdC10cmFuc3BvcnQtaHR0cHMgXAorICAgICAgYXB0LXV0aWxzIFwKKyAgICAgIGN1cmwgXAorICAgICAgZGlybW5nciBcCisgICAgICBzb2Z0d2FyZS1wcm9wZXJ0aWVzLWNvbW1vbiBcCisgICAgICB3Z2V0CisKKyMgRAorUlVOIGFwdC1rZXkgYWR2IC0ta2V5c2VydmVyIGtleXNlcnZlci51YnVudHUuY29tIC0tcmVjdi1rZXlzIEVCQ0Y5NzVFNUJBMjRENUUgJiYgXAorICAgICAgICB3Z2V0IGh0dHA6Ly9tYXN0ZXIuZGwuc291cmNlZm9yZ2UubmV0L3Byb2plY3QvZC1hcHQvZmlsZXMvZC1hcHQubGlzdCAtTyAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9kLWFwdC5saXN0ICYmIFwKKyAgICAgICAgd2dldCAtcU8gLSBodHRwczovL2RsYW5nLm9yZy9kLWtleXJpbmcuZ3BnIHwgYXB0LWtleSBhZGQgLQorCisjIERhcnQKK1JVTiBjdXJsIGh0dHBzOi8vZGwtc3NsLmdvb2dsZS5jb20vbGludXgvbGludXhfc2lnbmluZ19rZXkucHViIHwgYXB0LWtleSBhZGQgLSAmJiBcCisgICAgICAgIGN1cmwgaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkLmRhcnRsYW5nLm9yZy9saW51eC9kZWJpYW4vZGFydF9zdGFibGUubGlzdCA+IFwKKyAgICAgICAgICAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9kYXJ0X3N0YWJsZS5saXN0CisKK1JVTiBhcHQtZ2V0IHVwZGF0ZSAmJiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgR2VuZXJhbCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGJhc2gtY29tcGxldGlvbiBcCisgICAgICBiaXNvbiBcCisgICAgICBidWlsZC1lc3NlbnRpYWwgXAorICAgICAgY2xhbmcgXAorICAgICAgY21ha2UgXAorICAgICAgZGViaGVscGVyIFwKKyAgICAgIGZsZXggXAorICAgICAgZ2RiIFwKKyAgICAgIGxsdm0gXAorICAgICAgbmluamEtYnVpbGQgXAorICAgICAgcGtnLWNvbmZpZyBcCisgICAgICB2YWxncmluZCBcCisgICAgICB2aW0KK0VOViBQQVRIIC91c3IvbGliL2xsdm0tMy44L2JpbjokUEFUSAorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEMrKyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGxpYmJvb3N0LWFsbC1kZXYgXAorICAgICAgbGliZXZlbnQtZGV2IFwKKyAgICAgIGxpYnNzbC1kZXYgXAorICAgICAgcXQ1LWRlZmF1bHQgXAorICAgICAgcXRiYXNlNS1kZXYgXAorICAgICAgcXRiYXNlNS1kZXYtdG9vbHMKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBjc2hhcnAgKG1vbm8pIGRlcGVuZGVuY2llc2AgXAorICAgICAgbW9uby1kZXZlbAorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEQgZGVwZW5kZW5jaWVzYCBcCisgICAgICBkbWQtYmluPTIuMDcwLjItMCBcCisgICAgICBsaWJwaG9ib3MyLWRldj0yLjA3MC4yLTAgXAorICAgICAgZHViIFwKKyAgICAgIGRmbXQgXAorICAgICAgZHNjYW5uZXIgXAorICAgICAgeGRnLXV0aWxzCitSVU4gbWtkaXIgLXAgL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvZGVpbW9zIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L0MgJiYgXAorICAgIGN1cmwgLXNTTCBodHRwczovL2dpdGh1Yi5jb20vRC1Qcm9ncmFtbWluZy1EZWltb3MvbGliZXZlbnQvYXJjaGl2ZS9tYXN0ZXIudGFyLmd6fCB0YXIgeHogJiYgXAorICAgIG12IGxpYmV2ZW50LW1hc3Rlci9kZWltb3MvKiAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9kZWltb3MvICYmIFwKKyAgICBtdiBsaWJldmVudC1tYXN0ZXIvQy8qIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L0MvICYmIFwKKyAgICBybSAtcmYgbGliZXZlbnQtbWFzdGVyCitSVU4gY3VybCAtc1NMIGh0dHBzOi8vZ2l0aHViLmNvbS9ELVByb2dyYW1taW5nLURlaW1vcy9vcGVuc3NsL2FyY2hpdmUvbWFzdGVyLnRhci5nenwgdGFyIHh6ICYmIFwKKyAgICBtdiBvcGVuc3NsLW1hc3Rlci9kZWltb3MvKiAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9kZWltb3MvICYmIFwKKyAgICBtdiBvcGVuc3NsLW1hc3Rlci9DLyogL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvQy8gJiYgXAorICAgIHJtIC1yZiBvcGVuc3NsLW1hc3RlcgorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIERhcnQgZGVwZW5kZW5jaWVzYCBcCisgICAgICBkYXJ0PTEuMjAuMS0xCitFTlYgUEFUSCAvdXNyL2xpYi9kYXJ0L2JpbjokUEFUSAorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEVybGFuZyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGVybGFuZy1iYXNlIFwKKyAgICAgIGVybGFuZy1ldW5pdCBcCisgICAgICBlcmxhbmctZGV2IFwKKyAgICAgIGVybGFuZy10b29scyBcCisgICAgICByZWJhcgorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEdsaWJDIGRlcGVuZGVuY2llc2AgXAorICAgICAgbGliZ2xpYjIuMC1kZXYKKworIyBnb2xhbmcKK0VOViBHT0xBTkdfVkVSU0lPTiAxLjcuNgorRU5WIEdPTEFOR19ET1dOTE9BRF9VUkwgaHR0cHM6Ly9nb2xhbmcub3JnL2RsL2dvJEdPTEFOR19WRVJTSU9OLmxpbnV4LWFtZDY0LnRhci5negorRU5WIEdPTEFOR19ET1dOTE9BRF9TSEEyNTYgYWQ1ODA4YmY0MmIwMTRjMjJkZDc2NDY0NThmNjMxMzg1MDAzMDQ5ZGVkMGJiNmFmMmVmYzdmMWY3OWZhMjllYQorUlVOIGN1cmwgLWZzU0wgIiRHT0xBTkdfRE9XTkxPQURfVVJMIiAtbyBnb2xhbmcudGFyLmd6ICYmIFwKKyAgICAgIGVjaG8gIiRHT0xBTkdfRE9XTkxPQURfU0hBMjU2ICBnb2xhbmcudGFyLmd6IiB8IHNoYTI1NnN1bSAtYyAtICYmIFwKKyAgICAgIHRhciAtQyAvdXNyL2xvY2FsIC14emYgZ29sYW5nLnRhci5neiAmJiBcCisgICAgICBsbiAtcyAvdXNyL2xvY2FsL2dvL2Jpbi9nbyAvdXNyL2xvY2FsL2JpbiAmJiBcCisgICAgICBybSBnb2xhbmcudGFyLmd6CisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgSGFza2VsbCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGdoYyBcCisgICAgICBjYWJhbC1pbnN0YWxsCisKKyMgZGlzYWJsZWQgYmVjYXVzZSBpdCBjb3JlcyB3aGlsZSBpbnN0YWxsaW5nCisjIFJVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorIyBgIyBIYXhlIGRlcGVuZGVuY2llc2AgXAorIyAgICAgICBoYXhlIFwKKyMgICAgICAgbmVrbyBcCisjICAgICAgIG5la28tZGV2ICYmIFwKKyMgICAgIGhheGVsaWIgc2V0dXAgL3Vzci9zaGFyZS9oYXhlL2xpYiAmJiBcCisjICAgICBoYXhlbGliIGluc3RhbGwgaHhjcHAgMy4yLjEwMgorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEphdmEgZGVwZW5kZW5jaWVzYCBcCisgICAgICBhbnQgXAorICAgICAgYW50LW9wdGlvbmFsIFwKKyAgICAgIG9wZW5qZGstNy1qZGsgXAorICAgICAgbWF2ZW4KKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBMdWEgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsdWE1LjEgXAorICAgICAgbHVhNS4xLWRldgorCisjIGRpc2FibGVkIGJlY2F1c2UgaXQgaXMgdG9vIG9sZAorIyBSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKKyMgYCMgTm9kZS5qcyBkZXBlbmRlbmNpZXNgIFwKKyMgICAgICAgbm9kZWpzIFwKKyMgICAgICAgbnBtCisKKyMgZGlzYWJsZWQgYmVjYXVzZSBpdCBmYWlscyB0byBpbnN0YWxsIHByb3Blcmx5CisjIFJVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorIyBgIyBPQ2FtbCBkZXBlbmRlbmNpZXNgIFwKKyMgICAgICAgb2NhbWwgXAorIyAgICAgICBvcGFtICYmIFwKKyMgICAgIG9wYW0gaW5pdCAtLXllcyAmJiBcCisjICAgICBvcGFtIGluc3RhbGwgLS15ZXMgb2FzaXMKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBQZXJsIGRlcGVuZGVuY2llc2AgXAorICAgICAgbGliYml0LXZlY3Rvci1wZXJsIFwKKyAgICAgIGxpYmNsYXNzLWFjY2Vzc29yLWNsYXNzLXBlcmwgXAorICAgICAgbGliY3J5cHQtc3NsZWF5LXBlcmwgXAorICAgICAgbGliaW8tc29ja2V0LXNzbC1wZXJsIFwKKyAgICAgIGxpYm5ldC1zc2xlYXktcGVybAorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFBocCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIHBocDUgXAorICAgICAgcGhwNS1jbGkgXAorICAgICAgcGhwNS1kZXYgXAorICAgICAgcGhwLXBlYXIgXAorICAgICAgcmUyYyAmJiBcCisgICAgICB3Z2V0IGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2luc3RhbGxlciAtTyAtIC1xIHwgcGhwIC0tIC0tcXVpZXQgLS1pbnN0YWxsLWRpcj0vdXNyL2xvY2FsL2Jpbi8gLS1maWxlbmFtZT1jb21wb3NlcgorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFB5dGhvbiBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIHB5dGhvbi1hbGwgXAorICAgICAgcHl0aG9uLWFsbC1kYmcgXAorICAgICAgcHl0aG9uLWFsbC1kZXYgXAorICAgICAgcHl0aG9uLXBpcCBcCisgICAgICBweXRob24tc2V0dXB0b29scyBcCisgICAgICBweXRob24tc2l4IFwKKyAgICAgIHB5dGhvbi10d2lzdGVkIFwKKyAgICAgIHB5dGhvbi13aGVlbCBcCisgICAgICBweXRob24tem9wZS5pbnRlcmZhY2UgXAorICAgICAgcHl0aG9uMy1hbGwgXAorICAgICAgcHl0aG9uMy1hbGwtZGJnIFwKKyAgICAgIHB5dGhvbjMtYWxsLWRldiBcCisgICAgICBweXRob24zLXBpcCBcCisgICAgICBweXRob24zLXNldHVwdG9vbHMgXAorICAgICAgcHl0aG9uMy1zaXggXAorICAgICAgcHl0aG9uMy13aGVlbCBcCisgICAgICBweXRob24zLXpvcGUuaW50ZXJmYWNlICYmIFwKKyAgICBwaXAgaW5zdGFsbCAtVSBpcGFkZHJlc3MgYmFja3BvcnRzLnNzbF9tYXRjaF9ob3N0bmFtZSB0b3JuYWRvICYmIFwKKyAgICBwaXAzIGluc3RhbGwgLVUgYmFja3BvcnRzLnNzbF9tYXRjaF9ob3N0bmFtZSB0b3JuYWRvCisjIGluc3RhbGxpbmcgdG9ybmFkbyBieSBwaXAvcGlwMyBpbnN0ZWFkIG9mIGRlYmlhbiBwYWNrYWdlCisjIGlmIHdlIGluc3RhbGwgdGhlIGRlYmlhbiBwYWNrYWdlLCB0aGUgYnVpbGQgZmFpbHMgaW4gcHkyCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUnVieSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIHJ1YnkgXAorICAgICAgcnVieS1kZXYgXAorICAgICAgcnVieS1idW5kbGVyCitSVU4gZ2VtIGluc3RhbGwgYnVuZGxlciAtLW5vLXJpIC0tbm8tcmRvYworCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFJ1c3QgZGVwZW5kZW5jaWVzYCBcCisgICAgICBjYXJnbyBcCisgICAgICBydXN0YworCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFN0YXRpYyBDb2RlIEFuYWx5c2lzIGRlcGVuZGVuY2llc2AgXAorICAgICAgY3BwY2hlY2sgXAorICAgICAgc2xvY2NvdW50ICYmIFwKKyAgICBwaXAgaW5zdGFsbCBmbGFrZTgKKworIyBJbnN0YWxsIEJvdW5jeUNhc3RsZSBwcm92aWRlciB0byBmaXggSmF2YSBidWlsZHMgaXNzdWVzIHdpdGggSkRLIDcKKyMgQnVpbGRzIGFjY2Vzc2luZyByZXBvdGUgcmVwb3NpdG9yaWVzIGZhaWwgYXMgc2VlbiBoZXJlOiBodHRwczovL2dpdGh1Yi5jb20vdHJhdmlzLWNpL3RyYXZpcy1jaS9pc3N1ZXMvODUwMworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBCb3VuY3lDYXN0bGUgSkNFIFByb3ZpZGVyIGRlcGVuZGVuY2llc2AgXAorICAgICAgbGliYmNwcm92LWphdmEgJiYgXAorICAgIGxuIC1zIC91c3Ivc2hhcmUvamF2YS9iY3Byb3YuamFyIC91c3IvbGliL2p2bS9qYXZhLTctb3Blbmpkay1hbWQ2NC9qcmUvbGliL2V4dC9iY3Byb3YuamFyICYmIFwKKyAgICBhd2sgLUYgLiAtdiBPRlM9LiAnQkVHSU57bj0yfS9ec2VjdXJpdHlcLnByb3ZpZGVyLyB7c3BsaXQoJDMsIHBvc0FuZEVxdWFscywgIj0iKTskMz1uKysiPSJwb3NBbmRFcXVhbHNbMl07cHJpbnQ7bmV4dH0gMScgL2V0Yy9qYXZhLTctb3Blbmpkay9zZWN1cml0eS9qYXZhLnNlY3VyaXR5ID4gL3RtcC9qYXZhLnNlY3VyaXR5ICYmIFwKKyAgZWNobyAic2VjdXJpdHkucHJvdmlkZXIuMT1vcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5Cb3VuY3lDYXN0bGVQcm92aWRlciIgPj4gL3RtcC9qYXZhLnNlY3VyaXR5ICYmIFwKKyAgbXYgL3RtcC9qYXZhLnNlY3VyaXR5IC9ldGMvamF2YS03LW9wZW5qZGsvc2VjdXJpdHkvamF2YS5zZWN1cml0eQorCisjIENsZWFuIHVwCitSVU4gcm0gLXJmIC92YXIvY2FjaGUvYXB0LyogJiYgXAorICAgIHJtIC1yZiAvdmFyL2xpYi9hcHQvbGlzdHMvKiAmJiBcCisgICAgcm0gLXJmIC90bXAvKiAmJiBcCisgICAgcm0gLXJmIC92YXIvdG1wLyoKKworRU5WIFRIUklGVF9ST09UIC90aHJpZnQKK1JVTiBta2RpciAtcCAkVEhSSUZUX1JPT1Qvc3JjCitDT1BZIERvY2tlcmZpbGUgJFRIUklGVF9ST09ULworV09SS0RJUiAkVEhSSUZUX1JPT1Qvc3JjCmRpZmYgLS1naXQgYS9idWlsZC9kb2NrZXIvcmVmcmVzaC5zaCBiL2J1aWxkL2RvY2tlci9yZWZyZXNoLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA4Y2JjOTEKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9kb2NrZXIvcmVmcmVzaC5zaApAQCAtMCwwICsxLDgyIEBACisjIS9iaW4vYmFzaAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMKKyMgVGhlIGJ1aWxkIGhhcyB0d28gc3RhZ2VzOiAiZG9ja2VyIiBhbmQgInRlc3QiCisjIFRoZSAiZG9ja2VyIiBzdGFnZSBpcyBtZWFudCB0byByZWJ1aWxkIHRoZSBkb2NrZXIgaW1hZ2VzCisjICAgaWYgbmVlZGVkLiAgSWYgd2UgY2Fubm90IHB1c2ggdGhhdCByZXN1bHQgaG93ZXZlciB0aGVuCisjICAgdGhlcmUgaXMgbm8gcmVhc29uIHRvIGRvIGFueXRoaW5nLgorIyBUaGUgInRlc3QiIHN0YWdlIGlzIGFuIGFjdHVhbCB0ZXN0IGpvYi4gIEV2ZW4gaWYgdGhlIGRvY2tlcgorIyAgIGltYWdlIGRvZXNuJ3QgbWF0Y2ggd2hhdCdzIGluIHRoZSByZXBvLCB3ZSBzdGlsbCBidWlsZAorIyAgIHRoZSBpbWFnZSBzbyB0aGUgYnVpbGQgam9iIGNhbiBydW4gcHJvcGVybHkuCisjCisKK3NldCAtZQorCitTQ1JJUFRfRElSPSIkKGNkICIkKGRpcm5hbWUgIiR7QkFTSF9TT1VSQ0VbMF19IikiICYmIHB3ZCkiCitET0NLRVJfVEFHPSRET0NLRVJfUkVQTzokRElTVFJPCisKK2Z1bmN0aW9uIGRvY2tlcmZpbGVfY2hhbmdlZCB7CisgICMgaW1hZ2UgbWF5IG5vdCBleGlzdCB5ZXQsIHNvIHdlIGhhdmUgdG8gbGV0IGl0IGZhaWwgc2lsZW50bHk6CisgIGRvY2tlciBwdWxsICRET0NLRVJfVEFHIHx8IHRydWUKKyAgZG9ja2VyIHJ1biAkRE9DS0VSX1RBRyBiYXNoIC1jICdjZCAuLiAmJiBzaGE1MTJzdW0gRG9ja2VyZmlsZScgPiAuRG9ja2VyZmlsZS5zaGE1MTIKKyAgc2hhNTEyc3VtIC1jIC5Eb2NrZXJmaWxlLnNoYTUxMgorfQorCisjCisjIElmIHRoaXMgYnVpbGQgaGFzIG5vIERPQ0tFUl9QQVNTIGFuZCBpdCBpcyBpbiB0aGUgZG9ja2VyIHN0YWdlCisjIHRoZW4gdGhlcmUncyBubyByZWFzb24gdG8gZG8gYW55IHByb2Nlc3NpbmcgYmVjYXVzZSB3ZSBjYW5ub3QKKyMgcHVzaCB0aGUgcmVzdWx0IGlmIHRoZSBEb2NrZXJmaWxlIGNoYW5nZWQuICAKKyMKKworaWYgW1sgIiRUUkFWSVNfQlVJTERfU1RBR0UiID09ICJkb2NrZXIiIF1dICYmIFtbIC16ICIkRE9DS0VSX1BBU1MiIF1dOyB0aGVuCisgIGVjaG8gRGV0ZWN0ZWQgZG9ja2VyIHN0YWdlIGJ1aWxkIGFuZCBubyBkZWZpbmVkIERPQ0tFUl9QQVNTLCB0aGlzIGJ1aWxkIGpvYiB3aWxsIGJlIHNraXBwZWQuCisgIGVjaG8gU3Vic2VxdWVudCBqb2JzIGluIHRoZSB0ZXN0IHN0YWdlIG1heSBlYWNoIHJlYnVpbGQgdGhlIGRvY2tlciBpbWFnZS4KKyAgZXhpdCAwCitmaQorCisKK3B1c2hkICR7U0NSSVBUX0RJUn0vJERJU1RSTworaWYgZG9ja2VyZmlsZV9jaGFuZ2VkOyB0aGVuCisgIGVjaG8gRG9ja2VyZmlsZSBoYXMgbm90IGNoYW5nZWQuICBObyBuZWVkIHRvIHJlYnVpbGQuCisgIGV4aXQgMAorZWxzZQorICBlY2hvIERvY2tlcmZpbGUgaGFzIGNoYW5nZWQuCitmaQorcG9wZAorCisjCisjIERvY2tlcmZpbGUgaGFzIGNoYW5nZWQgLSByZWJ1aWxkIGl0IGZvciB0aGUgY3VycmVudCBidWlsZCBqb2IuCisjIElmIGl0IGlzIGEgImRvY2tlciIgc3RhZ2UgYnVpbGQgdGhlbiB3ZSB3YW50IHRvIHB1c2ggaXQgYmFjaworIyB0byB0aGUgRE9DS0VSX1JFUE8uICBJZiBpdCBpcyBhICJ0ZXN0IiBzdGFnZSBidWlsZCB0aGVuIHdlIGRvCisjIG5vdC4gIElmIG5vYm9keSBkZWZpbmVkIGEgRE9DS0VSX1BBU1MgdGhlbiBpdCBkb2Vzbid0IG1hdHRlci4KKyMKKworZWNobyBSZWJ1aWxkaW5nIGRvY2tlciBpbWFnZSAkRElTVFJPCitkb2NrZXIgYnVpbGQgLS10YWcgJERPQ0tFUl9UQUcgYnVpbGQvZG9ja2VyLyRESVNUUk8KKworaWYgW1sgIiRUUkFWSVNfQlVJTERfU1RBR0UiID09ICJkb2NrZXIiIF1dICYmIFtbICEgLXogIiRET0NLRVJfVVNFUiIgXV0gJiYgW1sgISAteiAiJERPQ0tFUl9QQVNTIiBdXTsgdGhlbiAKKyAgZWNobyBQdXNoaW5nIGRvY2tlciBpbWFnZSAkRE9DS0VSX1RBRworICBkb2NrZXIgbG9naW4gLXUgJERPQ0tFUl9VU0VSIC1wICRET0NLRVJfUEFTUworICBkb2NrZXIgcHVzaCAkRE9DS0VSX1RBRworZWxzZQorICBlY2hvIE5vdCBwdXNoaW5nIGRvY2tlciBpbWFnZTogZWl0aGVyIG5vdCBhIGRvY2tlciBzdGFnZSBidWlsZCBqb2IsIG9yIG9uZSBvZiBET0NLRVJfVVNFUiBvciBET0NLRVJfUEFTUyBpcyB1bmRlZmluZWQuCitmaQorCmRpZmYgLS1naXQgYS9idWlsZC9kb2NrZXIvcnVuLnNoIGIvYnVpbGQvZG9ja2VyL3J1bi5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xZmUxOWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvZG9ja2VyL3J1bi5zaApAQCAtMCwwICsxLDMwIEBACisjIS9iaW4vYmFzaAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3NldCAtZQorCitTQ1JJUFRfRElSPSIkKGNkICIkKGRpcm5hbWUgIiR7QkFTSF9TT1VSQ0VbMF19IikiICYmIHB3ZCkiCitET0NLRVJfVEFHPSRET0NLRVJfUkVQTzokRElTVFJPCisKK3ByaW50ZW52IHwgc29ydAorCitkb2NrZXIgcnVuIC0tbmV0PWhvc3QgLWUgQlVJTERfTElCUz0iJEJVSUxEX0xJQlMiICRCVUlMRF9FTlYgLXYgJChwd2QpOi90aHJpZnQvc3JjIFwKKwktaXQgJERPQ0tFUl9UQUcgYnVpbGQvZG9ja2VyL3NjcmlwdHMvJFNDUklQVCAkQlVJTERfQVJHCisKZGlmZiAtLWdpdCBhL2J1aWxkL2RvY2tlci9zY3JpcHRzL2F1dG90b29scy5zaCBiL2J1aWxkL2RvY2tlci9zY3JpcHRzL2F1dG90b29scy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44Mzg4ZjcyCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvZG9ja2VyL3NjcmlwdHMvYXV0b3Rvb2xzLnNoCkBAIC0wLDAgKzEsNiBAQAorIyEvYmluL3NoCitzZXQgLWV2CisKKy4vYm9vdHN0cmFwLnNoCisuL2NvbmZpZ3VyZSAkKgorbWFrZSBjaGVjayAtajMKZGlmZiAtLWdpdCBhL2J1aWxkL2RvY2tlci9zY3JpcHRzL2NtYWtlLnNoIGIvYnVpbGQvZG9ja2VyL3NjcmlwdHMvY21ha2Uuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2NjMzExZQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2RvY2tlci9zY3JpcHRzL2NtYWtlLnNoCkBAIC0wLDAgKzEsMjMgQEAKKyMhL2Jpbi9zaAorc2V0IC1ldgorCitDTUFLRV9GTEFHUz0kKgorTUFLRVBST0c9bWFrZQorCitpZiBuaW5qYSAtLXZlcnNpb24gID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBNQUtFUFJPRz1uaW5qYQorICBDTUFLRV9GTEFHUz0iLUdOaW5qYSAkQ01BS0VfRkxBR1MiCitmaQorCitta2RpciAtcCBjbWFrZV9idWlsZCAmJiBjZCBjbWFrZV9idWlsZAorY21ha2UgJENNQUtFX0ZMQUdTIC4uCitmb3IgTElCIGluICRCVUlMRF9MSUJTOyBkbworICBpZiAhIGdyZXAgIl5CVUlMRF8ke0xJQn06Qk9PTD1PTiQiIENNYWtlQ2FjaGUudHh0IDsgdGhlbgorICAgIGVjaG8gImZhaWxlZCB0byBjb25maWd1cmUgJExJQiIKKyAgICBleGl0IDEKKyAgZmkKK2RvbmUKKyRNQUtFUFJPRyAtajMKK2NwYWNrCitjdGVzdCAtVlYgLUUgIihweXRob25fdGVzdCkiCisjIGRpc2FibGVkIGNtYWtlIHB5dGhvbl90ZXN0IGZvciBub3cgc2luY2UgaXQgZmFpbHMgaW4gdHJhdmlzIHVuZGVyIGNlbnRvcwpkaWZmIC0tZ2l0IGEvYnVpbGQvZG9ja2VyL3NjcmlwdHMvY292c2Nhbi5zaCBiL2J1aWxkL2RvY2tlci9zY3JpcHRzL2NvdnNjYW4uc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2IzZjI4MwotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2RvY2tlci9zY3JpcHRzL2NvdnNjYW4uc2gKQEAgLTAsMCArMSw1MCBAQAorIworIyBDb3Zlcml0eSBTY2FuIFRyYXZpcyBidWlsZCBzY3JpcHQKKyMgVG8gcnVuIHRoaXMgaW50ZXJhY3RpdmVseSwgc2V0IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgeW91cnNlbGYsCisjIGFuZCBydW4gdGhpcyBpbnNpZGUgYSBkb2NrZXIgY29udGFpbmVyLgorIworIyBDb21tYW5kLUxpbmUgQXJndW1lbnRzCisjCisjIC0tc2tpcGRvd25sb2FkICAgdG8gc2tpcCByZS1kb3dubG9hZGluZyB0aGUgQ292ZXJpdHkgU2NhbiBidWlsZCBwYWNrYWdlIChsYXJnZSkKKyMKKyMgRW52aXJvbm1lbnQgVmFyaWFibGVzIChyZXF1aXJlZCkKKyMKKyMgQ09WRVJJVFlfU0NBTl9OT1RJRklDQVRJT05fRU1BSUwgIC0gZW1haWwgYWRkcmVzcyB0byBub3RpZnkKKyMgQ09WRVJJVFlfU0NBTl9UT0tFTiAgICAgICAgICAgICAgIC0gdGhlIENvdmVyaXR5IFNjYW4gdG9rZW4gKHNob3VsZCBiZSBzZWN1cmUpCisjCisjIEVudmlyb25tZW50IFZhcmlhYmxlcyAoZGVmYXVsdGVkKQorIworIyBDT1ZFUklUWV9TQ0FOX0JVSUxEX0NPTU1BTkQgICAgICAgLSBkZWZhdWx0cyB0byAiYnVpbGQvZG9ja2VyL3NjcmlwdHMvYXV0b3Rvb2xzLnNoIgorIyBDT1ZFUklUWV9TQ0FOX0RFU0NSSVBUSU9OICAgICAgICAgLSBkZWZhdWx0cyB0byBUUkFWSVNfQlJBTkNIIG9yICJtYXN0ZXIiIGlmIGVtcHR5CisjIENPVkVSSVRZX1NDQU5fUFJPSkVDVCAgICAgICAgICAgICAtIGRlZmF1bHRzIHRvICJ0aHJpZnQiCisKK3NldCAtZXgKKworQ09WRVJJVFlfU0NBTl9CVUlMRF9DT01NQU5EPSR7Q09WRVJJVFlfU0NBTl9CVUlMRF9DT01NQU5EOi1idWlsZC9kb2NrZXIvc2NyaXB0cy9hdXRvdG9vbHMuc2h9CitDT1ZFUklUWV9TQ0FOX0RFU0NSSVBUSU9OPSR7Q09WRVJJVFlfU0NBTl9ERVNDUklQVElPTjotJHtUUkFWSVNfQlJBTkNIOi1tYXN0ZXJ9fQorQ09WRVJJVFlfU0NBTl9QUk9KRUNUPSR7Q09WRVJJVFlfU0NBTl9QUk9KRUNUOi10aHJpZnR9CisKKyMgZG93bmxvYWQgdGhlIGNvdmVyaXR5IHNjYW4gcGFja2FnZQorCitwdXNoZCAvdG1wCitpZiBbWyAiJDEiICE9ICItLXNraXBkb3dubG9hZCIgXV07IHRoZW4KKyAgcm0gLXJmIGNvdmVyaXR5X3Rvb2wudGd6IGNvdi1hbmFseXNpcyoKKyAgd2dldCBodHRwczovL3NjYW4uY292ZXJpdHkuY29tL2Rvd25sb2FkL2xpbnV4NjQgLS1wb3N0LWRhdGEgInRva2VuPSRDT1ZFUklUWV9TQ0FOX1RPS0VOJnByb2plY3Q9JENPVkVSSVRZX1NDQU5fUFJPSkVDVCIgLU8gY292ZXJpdHlfdG9vbC50Z3oKKyAgdGFyIHh6ZiBjb3Zlcml0eV90b29sLnRnegorZmkKK0NPVkJJTj0kKGVjaG8gJChwd2QpL2Nvdi1hbmFseXNpcyovYmluKQorZXhwb3J0IFBBVEg9JENPVkJJTjokUEFUSAorcG9wZAorCisjIGJ1aWxkIHRoZSBwcm9qZWN0IHdpdGggY292ZXJpdHkgc2NhbgorCitybSAtcmYgY292LWludC8KK2Nvdi1idWlsZCAtLWRpciBjb3YtaW50ICRDT1ZFUklUWV9TQ0FOX0JVSUxEX0NPTU1BTkQKK3RhciBjSmYgY292LWludC50YXIueHogY292LWludC8KK2N1cmwgLS1mb3JtIHRva2VuPSIkQ09WRVJJVFlfU0NBTl9UT0tFTiIgXAorICAgICAtLWZvcm0gZW1haWw9IiRDT1ZFUklUWV9TQ0FOX05PVElGSUNBVElPTl9FTUFJTCIgXAorICAgICAtLWZvcm0gZmlsZT1AY292LWludC50YXIueHogXAorICAgICAtLWZvcm0gdmVyc2lvbj0iJChnaXQgZGVzY3JpYmUgLS10YWdzKSIgXAorICAgICAtLWZvcm0gZGVzY3JpcHRpb249IiRDT1ZFUklUWV9TQ0FOX0RFU0NSSVBUSU9OIiBcCisgICAgIGh0dHBzOi8vc2Nhbi5jb3Zlcml0eS5jb20vYnVpbGRzP3Byb2plY3Q9IiRDT1ZFUklUWV9TQ0FOX1BST0pFQ1QiCisKZGlmZiAtLWdpdCBhL2J1aWxkL2RvY2tlci9zY3JpcHRzL2Nyb3NzLXRlc3Quc2ggYi9idWlsZC9kb2NrZXIvc2NyaXB0cy9jcm9zcy10ZXN0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQzNTgxYTUKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9kb2NrZXIvc2NyaXB0cy9jcm9zcy10ZXN0LnNoCkBAIC0wLDAgKzEsMTYgQEAKKyMhL2Jpbi9zaAorc2V0IC1ldgorCisuL2Jvb3RzdHJhcC5zaAorLi9jb25maWd1cmUgLS1lbmFibGUtdHV0b3JpYWw9bm8KK21ha2UgLWozIHByZWNyb3NzCisKK3NldCArZQorbWFrZSBjcm9zcyQxCisKK1JFVD0kPworaWYgWyAkUkVUIC1uZSAwIF07IHRoZW4KKyAgY2F0IHRlc3QvbG9nL3VuZXhwZWN0ZWRfZmFpbHVyZXMubG9nCitmaQorCitleGl0ICRSRVQKZGlmZiAtLWdpdCBhL2J1aWxkL2RvY2tlci9zY3JpcHRzL2Rwa2cuc2ggYi9idWlsZC9kb2NrZXIvc2NyaXB0cy9kcGtnLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjNiYTBjZDQKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9kb2NrZXIvc2NyaXB0cy9kcGtnLnNoCkBAIC0wLDAgKzEsNSBAQAorIyEvYmluL3NoCitzZXQgLWV2CisKK2Rwa2ctYnVpbGRwYWNrYWdlIC10YyAtdXMgLXVjCitscyAtYWwgLi4KZGlmZiAtLWdpdCBhL2J1aWxkL2RvY2tlci9zY3JpcHRzL21ha2UtZGlzdC5zaCBiL2J1aWxkL2RvY2tlci9zY3JpcHRzL21ha2UtZGlzdC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41YTM2ODFlCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvZG9ja2VyL3NjcmlwdHMvbWFrZS1kaXN0LnNoCkBAIC0wLDAgKzEsOSBAQAorIyEvYmluL3NoCitzZXQgLWV2CisKKy4vYm9vdHN0cmFwLnNoCisuL2NvbmZpZ3VyZSAkKgorbWFrZSBkaXN0Cit0YXIgeHZmIHRocmlmdC0qLnRhci5negorY2QgdGhyaWZ0LSoKKy4vYnVpbGQvZG9ja2VyL3NjcmlwdHMvY21ha2Uuc2gKZGlmZiAtLWdpdCBhL2J1aWxkL2RvY2tlci9zY3JpcHRzL3NjYS5zaCBiL2J1aWxkL2RvY2tlci9zY3JpcHRzL3NjYS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xNmQ1ODI2Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvZG9ja2VyL3NjcmlwdHMvc2NhLnNoCkBAIC0wLDAgKzEsNjYgQEAKKyMhL2Jpbi9iYXNoCitzZXQgLWV2CisKKyMKKyMgR2VuZXJhdGUgdGhyaWZ0IGZpbGVzIHNvIHRoZSBzdGF0aWMgY29kZSBhbmFseXNpcyBpbmNsdWRlcyBhbiBhbmFseXNpcworIyBvZiB0aGUgZmlsZXMgdGhlIHRocmlmdCBjb21waWxlciBzcGl0cyBvdXQuICBJZiBydW5uaW5nIGludGVyYWN0aXZlbHkKKyMgc2V0IHRoZSBOT0JVSUxEIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHNraXAgdGhlIGJvb3QvY29uZmlnL21ha2UgcGhhc2UuCisjCisKK2lmIFtbIC16ICIkTk9CVUlMRCIgXV07IHRoZW4KKyAgLi9ib290c3RyYXAuc2gKKyAgLi9jb25maWd1cmUgLS1lbmFibGUtdHV0b3JpYWw9bm8KKyAgbWFrZSAtajMgcHJlY3Jvc3MKK2ZpCisKKyMKKyMgQy9DKysgc3RhdGljIGNvZGUgYW5hbHlzaXMgd2l0aCBjcHBjaGVjaworIyBhZGQgLS1lcnJvci1leGl0Y29kZT0xIHRvIC0tZW5hYmxlPWFsbCBhcyBzb29uIGFzIGV2ZXJ5dGhpbmcgaXMgZml4ZWQKKyMKKyMgUHl0aG9uIGNvZGUgc3R5bGUgY2hlY2sgd2l0aCBmbGFrZTgKKyMKKyMgc2VhcmNoIGZvciBUT0RPIGV0YyB3aXRoaW4gc291cmNlIHRyZWUKKyMgc29tZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBjb2RlIGJhc2UKKyMgc29tZSBpbmZvIGFib3V0IHRoZSBidWlsZCBtYWNoaW5lCisKKyMgQ29tcGlsZXIgY3BwY2hlY2sgKEFsbCkKK2NwcGNoZWNrIC0tZm9yY2UgLS1xdWlldCAtLWlubGluZS1zdXBwciAtLWVuYWJsZT1hbGwgLWoyIGNvbXBpbGVyL2NwcC9zcmMKKworIyBDKysgY3BwY2hlY2sgKEFsbCkKK2NwcGNoZWNrIC0tZm9yY2UgLS1xdWlldCAtLWlubGluZS1zdXBwciAtLWVuYWJsZT1hbGwgLWoyIGxpYi9jcHAvc3JjIGxpYi9jcHAvdGVzdCB0ZXN0L2NwcCB0dXRvcmlhbC9jcHAKKworIyBDIEdsaWIgY3BwY2hlY2sgKEFsbCkKK2NwcGNoZWNrIC0tZm9yY2UgLS1xdWlldCAtLWlubGluZS1zdXBwciAtLWVuYWJsZT1hbGwgLWoyIGxpYi9jX2dsaWIvc3JjIGxpYi9jX2dsaWIvdGVzdCB0ZXN0L2NfZ2xpYi9zcmMgdHV0b3JpYWwvY19nbGliCisKKyMgU2lsZW50IGVycm9yIGNoZWNrcworIyBTZWUgVEhSSUZULTQzNzEgOiBmbGV4IGdlbmVyYXRlZCBjb2RlIHRyaWdnZXJzICJwb3NzaWJsZSBudWxsIHBvaW50ZXIgZGVyZWZlcmVuY2UiIGluIHl5X2luaXRfYnVmZmVyCitjcHBjaGVjayAtLWZvcmNlIC0tcXVpZXQgLS1pbmxpbmUtc3VwcHIgLS1zdXBwcmVzcz0iKjp0aHJpZnQvdGhyaWZ0bC5jYyIgLS1lcnJvci1leGl0Y29kZT0xIC1qMiBjb21waWxlci9jcHAvc3JjCitjcHBjaGVjayAtLWZvcmNlIC0tcXVpZXQgLS1pbmxpbmUtc3VwcHIgLS1lcnJvci1leGl0Y29kZT0xIC1qMiBsaWIvY3BwL3NyYyBsaWIvY3BwL3Rlc3QgdGVzdC9jcHAgdHV0b3JpYWwvY3BwCitjcHBjaGVjayAtLWZvcmNlIC0tcXVpZXQgLS1pbmxpbmUtc3VwcHIgLS1lcnJvci1leGl0Y29kZT0xIC1qMiBsaWIvY19nbGliL3NyYyBsaWIvY19nbGliL3Rlc3QgdGVzdC9jX2dsaWIvc3JjIHR1dG9yaWFsL2NfZ2xpYgorCisjIFB5dGhvbiBjb2RlIHN0eWxlCitmbGFrZTggLS1pZ25vcmU9VzUwNCxFNTAxIGxpYi9weQorZmxha2U4IC0tZXhjbHVkZT10dXRvcmlhbC9weS9idWlsZCB0dXRvcmlhbC9weQorIyBUSFJJRlQtNDM3MSA6IGdlbmVyYXRlZCBmaWxlcyBhcmUgZXhjbHVkZWQgYmVjYXVzZSB0aGV5IGhhdmVuJ3QgYmVlbiBzY3J1YmJlZCB5ZXQKK2ZsYWtlOCAtLWlnbm9yZT1FNTAxIC0tZXhjbHVkZT0iKi9nZW4tcHkqLyoiLHRlc3QvcHkvYnVpbGQgdGVzdC9weQorZmxha2U4IHRlc3QvcHkudHdpc3RlZAorZmxha2U4IHRlc3QvcHkudG9ybmFkbworZmxha2U4IC0taWdub3JlPUU1MDEgdGVzdC90ZXN0LnB5CitmbGFrZTggLS1pZ25vcmU9RTUwMSxFNzIyIHRlc3QvY3Jvc3NydW5uZXIKK2ZsYWtlOCB0ZXN0L2ZlYXR1cmVzCisKKyMgUEhQIGNvZGUgc3R5bGUKK2NvbXBvc2VyIGluc3RhbGwgLS1xdWlldAorLi92ZW5kb3IvYmluL3BocGNzCisKKyMgVE9ETyBldGMKK2VjaG8gRklYTUVzOiBgZ3JlcCAtciBGSVhNRSAqIHwgd2MgLWxgCitlY2hvICBIQUNLczogYGdyZXAgLXIgSEFDSyAqIHwgd2MgLWxgCitlY2hvICBUT0RPczogYGdyZXAgLXIgVE9ETyAqIHwgd2MgLWxgCisKKyMgTG9DCitzbG9jY291bnQgLgorCisjIFN5c3RlbSBJbmZvCitkcGtnIC1sCit1bmFtZSAtYQpkaWZmIC0tZ2l0IGEvYnVpbGQvZG9ja2VyL3NjcmlwdHMvdWJzYW4uc2ggYi9idWlsZC9kb2NrZXIvc2NyaXB0cy91YnNhbi5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42NTBkYmEwCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvZG9ja2VyL3NjcmlwdHMvdWJzYW4uc2gKQEAgLTAsMCArMSwzMCBAQAorIyEvYmluL3NoCisKK3NldCAtZQorCisjIFdyYXBzIGF1dG90b29scy5zaCwgYnV0IGVhY2ggYmluYXJ5IGNyYXNoZXMgaWYgaXQgZXhoaWJpdHMgdW5kZWZpbmVkIGJlaGF2aW9yLiAKKyMgU2V0IHRoZSB1bmRlZmluZWQgYmVoYXZpb3IgZmxhZ3MuIFRoaXMgY3Jhc2hlcyBvbiBhbGwgdW5kZWZpbmVkIGJlaGF2aW9yIGV4Y2VwdCBmb3IKKyMgdW5kZWZpbmVkIGNhc3RpbmcsIGFrYSAidnB0ciIuCisjIFRPRE86IGZpeCB1bmRlZmluZWQgdnB0ciBiZWhhdmlvciBhbmQgdHVybiB0aGlzIG9wdGlvbiBiYWNrIG9uLgorCitleHBvcnQgQ0ZMQUdTPSItZnNhbml0aXplPXVuZGVmaW5lZCAtZm5vLXNhbml0aXplLXJlY292ZXI9dW5kZWZpbmVkIC1PMCAtZ2dkYjMgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIiCitleHBvcnQgQ1hYRkxBR1M9IiR7Q0ZMQUdTfSIKK2V4cG9ydCBMREZMQUdTPSItbHVic2FuIgorZXhwb3J0IFVCU0FOX09QVElPTlM9cHJpbnRfc3RhY2t0cmFjZT0xCisKKyMKKyMgd29yayBhcm91bmQgaHR0cHM6Ly9zdm4uYm9vc3Qub3JnL3RyYWMxMC90aWNrZXQvMTE2MzIgaWYgcHJlc2VudAorIworCitzZWQgLWkgJ3MvLCBzdHJlYW1fdChyZGJ1ZigpKSAvLCBzdHJlYW1fdChwYmFzZV90eXBlOjptZW1iZXIuZ2V0KCkpL2cnIC91c3IvaW5jbHVkZS9ib29zdC9mb3JtYXQvYWx0X3NzdHJlYW0uaHBwCisKKyMgbGx2bS1zeW1ib2xpemVyIG11c3QgYmUgb24gUEFUSCB0byBnZXQgYSBzdGFjayB0cmFjZSBvbiBlcnJvcgorCitDTEFOR19QQVRIPSIkKG1rdGVtcCAtZCkiCit0cmFwICJybSAtcmYgJHtDTEFOR19QQVRIfSIgRVhJVAorbG4gLXMgIiQod2hlcmVpcyBsbHZtLXN5bWJvbGl6ZXItNC4wICB8IHJldiB8IGN1dCAtZCAnICcgLWYgMSB8IHJldikiIFwKKyAgIiR7Q0xBTkdfUEFUSH0vbGx2bS1zeW1ib2xpemVyIgorZXhwb3J0IFBBVEg9IiR7Q0xBTkdfUEFUSH06JHtQQVRIfSIKK2xsdm0tc3ltYm9saXplciAtdmVyc2lvbgorCitidWlsZC9kb2NrZXIvc2NyaXB0cy9hdXRvdG9vbHMuc2ggJCoKZGlmZiAtLWdpdCBhL2J1aWxkL2RvY2tlci91YnVudHUtYXJ0ZnVsL0RvY2tlcmZpbGUgYi9idWlsZC9kb2NrZXIvdWJ1bnR1LWFydGZ1bC9Eb2NrZXJmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiZTg0ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9kb2NrZXIvdWJ1bnR1LWFydGZ1bC9Eb2NrZXJmaWxlCkBAIC0wLDAgKzEsMjcwIEBACisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMKKyMgQXBhY2hlIFRocmlmdCBEb2NrZXIgYnVpbGQgZW52aXJvbm1lbnQgZm9yIFVidW50dSBBcnRmdWwKKyMgVXNpbmcgYWxsIHN0b2NrIFVidW50dSBBcnRmdWwgcGFja2FnaW5nIGV4Y2VwdCBmb3I6CisjIC0gY3BwOiBzdG9jayBib29zdCAxLjYyIGluIGFydGZ1bCBoYXMgYSBuYXN0eSBidWcgc28gd2UgdXNlIHN0b2NrIGJvb3N0IDEuNjMKKyMgLSBkOiBkbWQgZG9lcyBub3QgY29tZSB3aXRoIFVidW50dQorIyAtIGRhcnQ6IGRvZXMgbm90IGNvbWUgd2l0aCBVYnVudHUuIFBpbm5lZCB0byBsYXN0IDEueCByZWxlYXNlCisjIC0gZG90bmV0OiBkb2VzIG5vdCBjb21lIHdpdGggVWJ1bnR1CisjIC0gaGF4ZTogdmVyc2lvbiAzLjQuMiB0aGF0IGNvbWVzIHdpdGggVWJ1bnR1IGNvcmVzIGluIG91ciBDSSBidWlsZAorIyAtIGdvOiBhcnRmdWwgY29tZXMgd2l0aCAxLjksIHdlIHdhbnQgdGhlIGxhdGVzdCAoc3VwcG9ydGVkKQorIyAtIG5vZGVqczogd2FudCB2OCwgYXJ0ZnVsIGNvbWVzIHdpdGggdjYKKyMKKworRlJPTSBidWlsZHBhY2stZGVwczphcnRmdWwtc2NtCitNQUlOVEFJTkVSIEFwYWNoZSBUaHJpZnQgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4KK0VOViBERUJJQU5fRlJPTlRFTkQgbm9uaW50ZXJhY3RpdmUKKworIyMjIEFkZCBhcHQgcmVwb3MKKworUlVOIGFwdC1nZXQgdXBkYXRlICYmIFwKKyAgICBhcHQtZ2V0IGRpc3QtdXBncmFkZSAteSAmJiBcCisgICAgYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKKyAgICAgIGFwdCBcCisgICAgICBhcHQtdHJhbnNwb3J0LWh0dHBzIFwKKyAgICAgIGFwdC11dGlscyBcCisgICAgICBjdXJsIFwKKyAgICAgIGRpcm1uZ3IgXAorICAgICAgc29mdHdhcmUtcHJvcGVydGllcy1jb21tb24gXAorICAgICAgd2dldAorCisjIGNzaGFycCAobW9ubykgLSBpZiB3ZSBldmVyIHdhbnQgYSBsYXRlciB2ZXJzaW9uCisjIFJVTiBlY2hvICJkZWIgaHR0cDovL2Rvd25sb2FkLm1vbm8tcHJvamVjdC5jb20vcmVwby9kZWJpYW4geGVuaWFsIG1haW4iIHwgdGVlIC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL21vbm8ubGlzdCAmJiBcCisjICAgICBhcHQta2V5IGFkdiAtLWtleXNlcnZlciBrZXlzZXJ2ZXIudWJ1bnR1LmNvbSAtLXJlY3Yta2V5cyBBNkExOUIzOEQzRDgzMUVGCisKKyMgRGFydAorUlVOIGN1cmwgaHR0cHM6Ly9kbC1zc2wuZ29vZ2xlLmNvbS9saW51eC9saW51eF9zaWduaW5nX2tleS5wdWIgfCBhcHQta2V5IGFkZCAtICYmIFwKKyAgICBjdXJsIGh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC5kYXJ0bGFuZy5vcmcvbGludXgvZGViaWFuL2RhcnRfc3RhYmxlLmxpc3QgPiBcCisgICAgICAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9kYXJ0X3N0YWJsZS5saXN0CitFTlYgREFSVF9WRVJTSU9OIDEuMjQuMy0xCisKKyMgZG90bmV0IChuZXRjb3JlKQorUlVOIGN1cmwgaHR0cHM6Ly9wYWNrYWdlcy5taWNyb3NvZnQuY29tL2tleXMvbWljcm9zb2Z0LmFzYyB8IGdwZyAtLWRlYXJtb3IgPiAvZXRjL2FwdC90cnVzdGVkLmdwZy5kL21pY3Jvc29mdC5ncGcgJiYgXAorICAgIGVjaG8gImRlYiBbYXJjaD1hbWQ2NF0gaHR0cHM6Ly9wYWNrYWdlcy5taWNyb3NvZnQuY29tL3JlcG9zL21pY3Jvc29mdC11YnVudHUtYXJ0ZnVsLXByb2QgYXJ0ZnVsIG1haW4iID4gXAorICAgICAgL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvZG90bmV0ZGV2Lmxpc3QKKworIyBoYXhlIChodHRwczovL2hheGUub3JnL2Rvd25sb2FkL2xpbnV4LykKK1JVTiBhZGQtYXB0LXJlcG9zaXRvcnkgcHBhOmhheGUvcmVsZWFzZXMgLXkKKworIyBub2RlLmpzCitSVU4gY3VybCAtc0wgaHR0cHM6Ly9kZWIubm9kZXNvdXJjZS5jb20vZ3Bna2V5L25vZGVzb3VyY2UuZ3BnLmtleSB8IGFwdC1rZXkgYWRkIC0gJiYgXAorICAgIGVjaG8gImRlYiBodHRwczovL2RlYi5ub2Rlc291cmNlLmNvbS9ub2RlXzgueCBhcnRmdWwgbWFpbiIgfCB0ZWUgL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvbm9kZXNvdXJjZS5saXN0CisKKyMjIyBpbnN0YWxsIGdlbmVyYWwgZGVwZW5kZW5jaWVzCitSVU4gYXB0LWdldCB1cGRhdGUgJiYgYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEdlbmVyYWwgZGVwZW5kZW5jaWVzYCBcCisgICAgICBiYXNoLWNvbXBsZXRpb24gXAorICAgICAgYmlzb24gXAorICAgICAgYnVpbGQtZXNzZW50aWFsIFwKKyAgICAgIGNsYW5nIFwKKyAgICAgIGNtYWtlIFwKKyAgICAgIGRlYmhlbHBlciBcCisgICAgICBmbGV4IFwKKyAgICAgIGdkYiBcCisgICAgICBsbHZtIFwKKyAgICAgIG5pbmphLWJ1aWxkIFwKKyAgICAgIHBrZy1jb25maWcgXAorICAgICAgdmFsZ3JpbmQgXAorICAgICAgdmltCitFTlYgUEFUSCAvdXNyL2xpYi9sbHZtLTMuOC9iaW46JFBBVEgKKworIyBib29zdC0xLjYyIGhhcyBhIHRlcnJpYmxlIGJ1ZyBpbiBib29zdDo6dGVzdCwgc2VlIGh0dHBzOi8vc3ZuLmJvb3N0Lm9yZy90cmFjMTAvdGlja2V0LzEyNTA3CitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEMrKyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGxpYmJvb3N0MS42My1hbGwtZGV2IFwKKyAgICAgIGxpYmV2ZW50LWRldiBcCisgICAgICBsaWJzc2wtZGV2IFwKKyAgICAgIHF0NS1kZWZhdWx0IFwKKyAgICAgIHF0YmFzZTUtZGV2IFwKKyAgICAgIHF0YmFzZTUtZGV2LXRvb2xzCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgY3NoYXJwIChtb25vKSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIG1vbm8tZGV2ZWwKKworRU5WIFNCQ0xfVkVSU0lPTiAxLjQuNQorUlVOIFwKK2AjIENvbW1vbiBMaXNwIChzYmNsKSBkZXBlbmRlbmNpZXNgIFwKKyAgICBjdXJsIC0tdmVyc2lvbiAmJiBcCisgICAgY3VybCAtTyAtSiAtTCBodHRwczovL2tlbnQuZGwuc291cmNlZm9yZ2UubmV0L3Byb2plY3Qvc2JjbC9zYmNsLyR7U0JDTF9WRVJTSU9OfS9zYmNsLSR7U0JDTF9WRVJTSU9OfS14ODYtNjQtbGludXgtYmluYXJ5LnRhci5iejIgJiYgXAorICAgIHRhciB4amYgc2JjbC0ke1NCQ0xfVkVSU0lPTn0teDg2LTY0LWxpbnV4LWJpbmFyeS50YXIuYnoyICYmIFwKKyAgICBjZCBzYmNsLSR7U0JDTF9WRVJTSU9OfS14ODYtNjQtbGludXggJiYgXAorICAgIC4vaW5zdGFsbC5zaCAmJiBcCisgICAgc2JjbCAtLXZlcnNpb24gJiYgXAorICAgIHJtIC1yZiBzYmNsKgorCitFTlYgRF9WRVJTSU9OICAgICAyLjA4MC4wCitFTlYgRE1EX0RFQiAgICAgICBkbWRfMi4wODAuMC0wX2FtZDY0LmRlYgorUlVOIFwKK2AjIEQgZGVwZW5kZW5jaWVzYCBcCisgICAgd2dldCAtcSBodHRwOi8vZG93bmxvYWRzLmRsYW5nLm9yZy9yZWxlYXNlcy8yLngvJHtEX1ZFUlNJT059LyR7RE1EX0RFQn0gJiYgXAorICAgIGRwa2cgLS1pbnN0YWxsICR7RE1EX0RFQn0gJiYgXAorICAgIHJtIC1mICR7RE1EX0RFQn0gJiYgXAorICAgIG1rZGlyIC1wIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L2RlaW1vcyAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9DICYmIFwKKyAgICBjdXJsIC1zU0wgaHR0cHM6Ly9naXRodWIuY29tL0QtUHJvZ3JhbW1pbmctRGVpbW9zL2xpYmV2ZW50L2FyY2hpdmUvbWFzdGVyLnRhci5nenwgdGFyIHh6ICYmIFwKKyAgICBtdiBsaWJldmVudC1tYXN0ZXIvZGVpbW9zLyogL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvZGVpbW9zLyAmJiBcCisgICAgbXYgbGliZXZlbnQtbWFzdGVyL0MvKiAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9DLyAmJiBcCisgICAgcm0gLXJmIGxpYmV2ZW50LW1hc3RlciAmJiBcCisgICAgY3VybCAtc1NMIGh0dHBzOi8vZ2l0aHViLmNvbS9ELVByb2dyYW1taW5nLURlaW1vcy9vcGVuc3NsL2FyY2hpdmUvbWFzdGVyLnRhci5nenwgdGFyIHh6ICYmIFwKKyAgICBtdiBvcGVuc3NsLW1hc3Rlci9kZWltb3MvKiAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9kZWltb3MvICYmIFwKKyAgICBtdiBvcGVuc3NsLW1hc3Rlci9DLyogL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvQy8gJiYgXAorICAgIHJtIC1yZiBvcGVuc3NsLW1hc3RlcgorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKKyAgICAgIGAjIERhcnQgZGVwZW5kZW5jaWVzYCBcCisgICAgICBkYXJ0PSREQVJUX1ZFUlNJT04KK0VOViBQQVRIIC91c3IvbGliL2RhcnQvYmluOiRQQVRICisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgZG90bmV0IGNvcmUgZGVwZW5kZW5jaWVzYCBcCisgICAgICBkb3RuZXQtc2RrLTIuMS40CisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgRXJsYW5nIGRlcGVuZGVuY2llc2AgXAorICAgICAgZXJsYW5nLWJhc2UgXAorICAgICAgZXJsYW5nLWV1bml0IFwKKyAgICAgIGVybGFuZy1kZXYgXAorICAgICAgZXJsYW5nLXRvb2xzIFwKKyAgICAgIHJlYmFyCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgR2xpYkMgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsaWJnbGliMi4wLWRldgorCisjIGdvbGFuZworRU5WIEdPTEFOR19WRVJTSU9OIDEuMTAKK0VOViBHT0xBTkdfRE9XTkxPQURfVVJMIGh0dHBzOi8vZ29sYW5nLm9yZy9kbC9nbyRHT0xBTkdfVkVSU0lPTi5saW51eC1hbWQ2NC50YXIuZ3oKK0VOViBHT0xBTkdfRE9XTkxPQURfU0hBMjU2IGI1YTY0MzM1ZjE0OTAyNzdiNTg1ODMyZDFmNmM3ZjhjNmMxMTIwNmNiYTVjZDNmNzcxZGNiODdiOThhZDFhMzMKK1JVTiBjdXJsIC1mc1NMICIkR09MQU5HX0RPV05MT0FEX1VSTCIgLW8gZ29sYW5nLnRhci5neiAmJiBcCisgICAgICBlY2hvICIkR09MQU5HX0RPV05MT0FEX1NIQTI1NiAgZ29sYW5nLnRhci5neiIgfCBzaGEyNTZzdW0gLWMgLSAmJiBcCisgICAgICAgICAgICB0YXIgLUMgL3Vzci9sb2NhbCAteHpmIGdvbGFuZy50YXIuZ3ogJiYgXAorICAgICAgICAgICAgICAgICAgbG4gLXMgL3Vzci9sb2NhbC9nby9iaW4vZ28gL3Vzci9sb2NhbC9iaW4gJiYgXAorICAgICAgICAgICAgICAgICAgICAgICAgcm0gZ29sYW5nLnRhci5negorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEhhc2tlbGwgZGVwZW5kZW5jaWVzYCBcCisgICAgICBnaGMgXAorICAgICAgY2FiYWwtaW5zdGFsbAorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEhheGUgZGVwZW5kZW5jaWVzYCBcCisgICAgICBoYXhlIFwKKyAgICAgIG5la28gXAorICAgICAgbmVrby1kZXYgJiYgXAorICAgIGhheGVsaWIgc2V0dXAgLS1hbHdheXMgL3Vzci9zaGFyZS9oYXhlL2xpYiAmJiBcCisgICAgaGF4ZWxpYiBpbnN0YWxsIC0tYWx3YXlzIGh4Y3BwIDI+JjEgPiAvZGV2L251bGwKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBKYXZhIGRlcGVuZGVuY2llc2AgXAorICAgICAgYW50IFwKKyAgICAgIGFudC1vcHRpb25hbCBcCisgICAgICBvcGVuamRrLTgtamRrIFwKKyAgICAgIG1hdmVuCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgTHVhIGRlcGVuZGVuY2llc2AgXAorICAgICAgbHVhNS4yIFwKKyAgICAgIGx1YTUuMi1kZXYKKyMgaHR0cHM6Ly9idWdzLmxhdW5jaHBhZC5uZXQvdWJ1bnR1Lytzb3VyY2UvbHVhNS4zLytidWcvMTcwNzIxMgorIyBsdWE1LjMgZG9lcyBub3QgaW5zdGFsbCBhbHRlcm5hdGl2ZXMhCisjIG5lZWQgdG8gdXBkYXRlIG91ciBsdWFzb2NrZXQgY29kZSwgbHVhIGRvZXNuJ3QgaGF2ZSBsdWFMX29wZW5saWIgYW55IG1vcmUKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBOb2RlLmpzIGRlcGVuZGVuY2llc2AgXAorICAgICAgbm9kZWpzCisKKyMgVGVzdCBkZXBlbmRlbmNpZXMgZm9yIHJ1bm5pbmcgcHVwcGV0ZWVyCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEpTIGRlcGVuZGVuY2llc2AgXAorICAgICAgbGlieHNzMQorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIE9DYW1sIGRlcGVuZGVuY2llc2AgXAorICAgICAgb2NhbWwgXAorICAgICAgb3BhbSAmJiBcCisgICAgb3BhbSBpbml0IC0teWVzICYmIFwKKyAgICBvcGFtIGluc3RhbGwgLS15ZXMgb2FzaXMKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBQZXJsIGRlcGVuZGVuY2llc2AgXAorICAgICAgbGliYml0LXZlY3Rvci1wZXJsIFwKKyAgICAgIGxpYmNsYXNzLWFjY2Vzc29yLWNsYXNzLXBlcmwgXAorICAgICAgbGliY3J5cHQtc3NsZWF5LXBlcmwgXAorICAgICAgbGliaW8tc29ja2V0LXNzbC1wZXJsIFwKKyAgICAgIGxpYm5ldC1zc2xlYXktcGVybAorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFBocCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIHBocCBcCisgICAgICBwaHAtY2xpIFwKKyAgICAgIHBocC1kZXYgXAorICAgICAgcGhwLXBlYXIgXAorICAgICAgcmUyYyBcCisgICAgICBjb21wb3NlcgorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFB5dGhvbiBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIHB5dGhvbi1hbGwgXAorICAgICAgcHl0aG9uLWFsbC1kYmcgXAorICAgICAgcHl0aG9uLWFsbC1kZXYgXAorICAgICAgcHl0aG9uLWlwYWRkcmVzcyBcCisgICAgICBweXRob24tcGlwIFwKKyAgICAgIHB5dGhvbi1zZXR1cHRvb2xzIFwKKyAgICAgIHB5dGhvbi1zaXggXAorICAgICAgcHl0aG9uLXRvcm5hZG8gXAorICAgICAgcHl0aG9uLXR3aXN0ZWQgXAorICAgICAgcHl0aG9uLXdoZWVsIFwKKyAgICAgIHB5dGhvbi16b3BlLmludGVyZmFjZSAmJiBcCisgICBwaXAgaW5zdGFsbCAtLXVwZ3JhZGUgYmFja3BvcnRzLnNzbF9tYXRjaF9ob3N0bmFtZQorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFB5dGhvbjMgZGVwZW5kZW5jaWVzYCBcCisgICAgICBweXRob24zLWFsbCBcCisgICAgICBweXRob24zLWFsbC1kYmcgXAorICAgICAgcHl0aG9uMy1hbGwtZGV2IFwKKyAgICAgIHB5dGhvbjMtcGlwIFwKKyAgICAgIHB5dGhvbjMtc2V0dXB0b29scyBcCisgICAgICBweXRob24zLXNpeCBcCisgICAgICBweXRob24zLXRvcm5hZG8gXAorICAgICAgcHl0aG9uMy10d2lzdGVkIFwKKyAgICAgIHB5dGhvbjMtd2hlZWwgXAorICAgICAgcHl0aG9uMy16b3BlLmludGVyZmFjZQorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFJ1YnkgZGVwZW5kZW5jaWVzYCBcCisgICAgICBydWJ5IFwKKyAgICAgIHJ1YnktZGV2IFwKKyAgICAgIHJ1YnktYnVuZGxlcgorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFJ1c3QgZGVwZW5kZW5jaWVzYCBcCisgICAgICBjYXJnbyBcCisgICAgICBydXN0YworCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFN0YXRpYyBDb2RlIEFuYWx5c2lzIGRlcGVuZGVuY2llc2AgXAorICAgICAgY3BwY2hlY2sgXAorICAgICAgc2xvY2NvdW50ICYmIFwKKyAgICBwaXAgaW5zdGFsbCBmbGFrZTgKKworIyBDbGVhbiB1cAorUlVOIHJtIC1yZiAvdmFyL2NhY2hlL2FwdC8qICYmIFwKKyAgICBybSAtcmYgL3Zhci9saWIvYXB0L2xpc3RzLyogJiYgXAorICAgIHJtIC1yZiAvdG1wLyogJiYgXAorICAgIHJtIC1yZiAvdmFyL3RtcC8qCisKK0VOViBUSFJJRlRfUk9PVCAvdGhyaWZ0CitSVU4gbWtkaXIgLXAgJFRIUklGVF9ST09UL3NyYworQ09QWSBEb2NrZXJmaWxlICRUSFJJRlRfUk9PVC8KK1dPUktESVIgJFRIUklGVF9ST09UL3NyYwpkaWZmIC0tZ2l0IGEvYnVpbGQvZG9ja2VyL3VidW50dS1iaW9uaWMvRG9ja2VyZmlsZSBiL2J1aWxkL2RvY2tlci91YnVudHUtYmlvbmljL0RvY2tlcmZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNjOTlhOQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2RvY2tlci91YnVudHUtYmlvbmljL0RvY2tlcmZpbGUKQEAgLTAsMCArMSwyNzkgQEAKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIworIyBBcGFjaGUgVGhyaWZ0IERvY2tlciBidWlsZCBlbnZpcm9ubWVudCBmb3IgVWJ1bnR1IEJpb25pYworIyBVc2luZyBhbGwgc3RvY2sgVWJ1bnR1IEJpb25pYyBwYWNrYWdpbmcgZXhjZXB0IGZvcjoKKyMgLSBjbDogd2FudCBsYXRlc3QKKyMgLSBkOiBkbWQgZG9lcyBub3QgY29tZSB3aXRoIFVidW50dQorIyAtIGRhcnQ6IGRvZXMgbm90IGNvbWUgd2l0aCBVYnVudHUuIFBpbm5lZCB0byBsYXN0IDEueCByZWxlYXNlCisjIC0gZG90bmV0OiBkb2VzIG5vdCBjb21lIHdpdGggVWJ1bnR1CisjIC0gZ286IHdhbnQgbGF0ZXN0CisjIC0gbm9kZWpzOiB3YW50IHY4LCBiaW9uaWMgY29tZXMgd2l0aCB2NgorIworCitGUk9NIGJ1aWxkcGFjay1kZXBzOmJpb25pYy1zY20KK01BSU5UQUlORVIgQXBhY2hlIFRocmlmdCA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPgorRU5WIERFQklBTl9GUk9OVEVORCBub25pbnRlcmFjdGl2ZQorCisjIyMgQWRkIGFwdCByZXBvcworCitSVU4gYXB0LWdldCB1cGRhdGUgJiYgXAorICAgIGFwdC1nZXQgZGlzdC11cGdyYWRlIC15ICYmIFwKKyAgICBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorICAgICAgYXB0IFwKKyAgICAgIGFwdC10cmFuc3BvcnQtaHR0cHMgXAorICAgICAgYXB0LXV0aWxzIFwKKyAgICAgIGN1cmwgXAorICAgICAgZGlybW5nciBcCisgICAgICBzb2Z0d2FyZS1wcm9wZXJ0aWVzLWNvbW1vbiBcCisgICAgICB3Z2V0CisKKyMgY3NoYXJwIChtb25vKSAtIGlmIHdlIGV2ZXIgd2FudCBhIGxhdGVyIHZlcnNpb24KKyMgUlVOIGVjaG8gImRlYiBodHRwOi8vZG93bmxvYWQubW9uby1wcm9qZWN0LmNvbS9yZXBvL2RlYmlhbiB4ZW5pYWwgbWFpbiIgfCB0ZWUgL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvbW9uby5saXN0ICYmIFwKKyMgICAgIGFwdC1rZXkgYWR2IC0ta2V5c2VydmVyIGtleXNlcnZlci51YnVudHUuY29tIC0tcmVjdi1rZXlzIEE2QTE5QjM4RDNEODMxRUYKKworIyBEYXJ0CitSVU4gY3VybCBodHRwczovL2RsLXNzbC5nb29nbGUuY29tL2xpbnV4L2xpbnV4X3NpZ25pbmdfa2V5LnB1YiB8IGFwdC1rZXkgYWRkIC0gJiYgXAorICAgIGN1cmwgaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkLmRhcnRsYW5nLm9yZy9saW51eC9kZWJpYW4vZGFydF9zdGFibGUubGlzdCA+IFwKKyAgICAgIC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL2RhcnRfc3RhYmxlLmxpc3QKK0VOViBEQVJUX1ZFUlNJT04gMS4yNC4zLTEKKworIyBkb3RuZXQgKG5ldGNvcmUpCitSVU4gY3VybCBodHRwczovL3BhY2thZ2VzLm1pY3Jvc29mdC5jb20va2V5cy9taWNyb3NvZnQuYXNjIHwgZ3BnIC0tZGVhcm1vciA+IC9ldGMvYXB0L3RydXN0ZWQuZ3BnLmQvbWljcm9zb2Z0LmdwZyAmJiBcCisgICAgd2dldCAtcSAtTyAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9taWNyb3NvZnQtcHJvZC5saXN0IGh0dHBzOi8vcGFja2FnZXMubWljcm9zb2Z0LmNvbS9jb25maWcvdWJ1bnR1LzE4LjA0L3Byb2QubGlzdCAmJiBcCisgICAgY2hvd24gcm9vdDpyb290IC9ldGMvYXB0L3RydXN0ZWQuZ3BnLmQvbWljcm9zb2Z0LmdwZyAmJiBcCisgICAgY2hvd24gcm9vdDpyb290IC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL21pY3Jvc29mdC1wcm9kLmxpc3QKKworIyBub2RlLmpzCitSVU4gY3VybCAtc0wgaHR0cHM6Ly9kZWIubm9kZXNvdXJjZS5jb20vZ3Bna2V5L25vZGVzb3VyY2UuZ3BnLmtleSB8IGFwdC1rZXkgYWRkIC0gJiYgXAorICAgIGVjaG8gImRlYiBodHRwczovL2RlYi5ub2Rlc291cmNlLmNvbS9ub2RlXzgueCBiaW9uaWMgbWFpbiIgfCB0ZWUgL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvbm9kZXNvdXJjZS5saXN0CisKKyMjIyBpbnN0YWxsIGdlbmVyYWwgZGVwZW5kZW5jaWVzCitSVU4gYXB0LWdldCB1cGRhdGUgJiYgYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEdlbmVyYWwgZGVwZW5kZW5jaWVzYCBcCisgICAgICBiYXNoLWNvbXBsZXRpb24gXAorICAgICAgYmlzb24gXAorICAgICAgYnVpbGQtZXNzZW50aWFsIFwKKyAgICAgIGNsYW5nIFwKKyAgICAgIGNtYWtlIFwKKyAgICAgIGRlYmhlbHBlciBcCisgICAgICBmbGV4IFwKKyAgICAgIGdkYiBcCisgICAgICBsbHZtIFwKKyAgICAgIG5pbmphLWJ1aWxkIFwKKyAgICAgIHBrZy1jb25maWcgXAorICAgICAgdmFsZ3JpbmQgXAorICAgICAgdmltCitFTlYgUEFUSCAvdXNyL2xpYi9sbHZtLTYuMC9iaW46JFBBVEgKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBDKysgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsaWJib29zdC1hbGwtZGV2IFwKKyAgICAgIGxpYmV2ZW50LWRldiBcCisgICAgICBsaWJzc2wtZGV2IFwKKyAgICAgIHF0NS1kZWZhdWx0IFwKKyAgICAgIHF0YmFzZTUtZGV2IFwKKyAgICAgIHF0YmFzZTUtZGV2LXRvb2xzCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgY3NoYXJwIChtb25vKSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIG1vbm8tZGV2ZWwKKworRU5WIFNCQ0xfVkVSU0lPTiAxLjQuMTUKK1JVTiBcCitgIyBDb21tb24gTGlzcCAoc2JjbCkgZGVwZW5kZW5jaWVzYCBcCisgICAgY3VybCAtLXZlcnNpb24gJiYgXAorICAgIGN1cmwgLW8gc2JjbC0ke1NCQ0xfVkVSU0lPTn0teDg2LTY0LWxpbnV4LWJpbmFyeS50YXIuYnoyIC1KIC1MIGh0dHBzOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL3NiY2wvZmlsZXMvc2JjbC8ke1NCQ0xfVkVSU0lPTn0vc2JjbC0ke1NCQ0xfVkVSU0lPTn0teDg2LTY0LWxpbnV4LWJpbmFyeS50YXIuYnoyL2Rvd25sb2FkP3VzZV9taXJyb3I9bWFuYWdlZHdheSMgJiYgXAorICAgIHRhciB4amYgc2JjbC0ke1NCQ0xfVkVSU0lPTn0teDg2LTY0LWxpbnV4LWJpbmFyeS50YXIuYnoyICYmIFwKKyAgICBjZCBzYmNsLSR7U0JDTF9WRVJTSU9OfS14ODYtNjQtbGludXggJiYgXAorICAgIC4vaW5zdGFsbC5zaCAmJiBcCisgICAgc2JjbCAtLXZlcnNpb24gJiYgXAorICAgIGNkIC4uICYmIFwKKyAgICBybSAtcmYgc2JjbCoKKworRU5WIERfVkVSU0lPTiAgICAgMi4wODMuMQorRU5WIERNRF9ERUIgICAgICAgZG1kXzIuMDgzLjEtMF9hbWQ2NC5kZWIKK1JVTiBcCitgIyBEIGRlcGVuZGVuY2llc2AgXAorICAgIHdnZXQgLXEgaHR0cDovL2Rvd25sb2Fkcy5kbGFuZy5vcmcvcmVsZWFzZXMvMi54LyR7RF9WRVJTSU9OfS8ke0RNRF9ERUJ9ICYmIFwKKyAgICBkcGtnIC0taW5zdGFsbCAke0RNRF9ERUJ9ICYmIFwKKyAgICBybSAtZiAke0RNRF9ERUJ9ICYmIFwKKyAgICBta2RpciAtcCAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9kZWltb3MgL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvQyAmJiBcCisgICAgZ2l0IGNsb25lIC1iICd2Mi4wLjIrMi4wLjE2JyBodHRwczovL2dpdGh1Yi5jb20vRC1Qcm9ncmFtbWluZy1EZWltb3MvbGliZXZlbnQuZ2l0IGRlaW1vcy1saWJldmVudC0yLjAgJiYgXAorICAgIG12IGRlaW1vcy1saWJldmVudC0yLjAvZGVpbW9zLyogL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvZGVpbW9zLyAmJiBcCisgICAgbXYgZGVpbW9zLWxpYmV2ZW50LTIuMC9DLyogL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvQy8gJiYgXAorICAgIHJtIC1yZiBkZWltb3MtbGliZXZlbnQtMi4wICYmIFwKKyAgICBnaXQgY2xvbmUgLWIgJ3YyLjAuMCsxLjEuMGgnIGh0dHBzOi8vZ2l0aHViLmNvbS9ELVByb2dyYW1taW5nLURlaW1vcy9vcGVuc3NsLmdpdCBkZWltb3Mtb3BlbnNzbC0xLjEuMGggJiYgXAorICAgIG12IGRlaW1vcy1vcGVuc3NsLTEuMS4waC9kZWltb3MvKiAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9kZWltb3MvICYmIFwKKyAgICBtdiBkZWltb3Mtb3BlbnNzbC0xLjEuMGgvQy8qIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L0MvICYmIFwKKyAgICBybSAtcmYgZGVpbW9zLW9wZW5zc2wtMS4xLjBoCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorICAgICAgYCMgRGFydCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGRhcnQ9JERBUlRfVkVSU0lPTgorRU5WIFBBVEggL3Vzci9saWIvZGFydC9iaW46JFBBVEgKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBkb3RuZXQgY29yZSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGRvdG5ldC1zZGstMi4yCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgRXJsYW5nIGRlcGVuZGVuY2llc2AgXAorICAgICAgZXJsYW5nLWJhc2UgXAorICAgICAgZXJsYW5nLWV1bml0IFwKKyAgICAgIGVybGFuZy1kZXYgXAorICAgICAgZXJsYW5nLXRvb2xzIFwKKyAgICAgIHJlYmFyCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgR2xpYkMgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsaWJnbGliMi4wLWRldgorCisjIGdvbGFuZworRU5WIEdPTEFOR19WRVJTSU9OIDEuMTEuNAorRU5WIEdPTEFOR19ET1dOTE9BRF9VUkwgaHR0cHM6Ly9nb2xhbmcub3JnL2RsL2dvJEdPTEFOR19WRVJTSU9OLmxpbnV4LWFtZDY0LnRhci5negorRU5WIEdPTEFOR19ET1dOTE9BRF9TSEEyNTYgZmIyNmMzMGU2YTA0YWQ5MzdiYmM2NTdhMWI1YmJhOTJmODAwOTZhZjFlOGVlNmRhNjQzMGMwNDVhOGRiM2E1YgorUlVOIGN1cmwgLWZzU0wgIiRHT0xBTkdfRE9XTkxPQURfVVJMIiAtbyBnb2xhbmcudGFyLmd6ICYmIFwKKyAgICAgIGVjaG8gIiRHT0xBTkdfRE9XTkxPQURfU0hBMjU2ICBnb2xhbmcudGFyLmd6IiB8IHNoYTI1NnN1bSAtYyAtICYmIFwKKyAgICAgICAgICAgIHRhciAtQyAvdXNyL2xvY2FsIC14emYgZ29sYW5nLnRhci5neiAmJiBcCisgICAgICAgICAgICAgICAgICBsbiAtcyAvdXNyL2xvY2FsL2dvL2Jpbi9nbyAvdXNyL2xvY2FsL2JpbiAmJiBcCisgICAgICAgICAgICAgICAgICAgICAgICBybSBnb2xhbmcudGFyLmd6CisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgSGFza2VsbCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGdoYyBcCisgICAgICBjYWJhbC1pbnN0YWxsCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgSGF4ZSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGhheGUgXAorICAgICAgbmVrbyBcCisgICAgICBuZWtvLWRldiAmJiBcCisgICAgaGF4ZWxpYiBzZXR1cCAtLWFsd2F5cyAvdXNyL3NoYXJlL2hheGUvbGliICYmIFwKKyAgICBoYXhlbGliIGluc3RhbGwgLS1hbHdheXMgaHhjcHAgMj4mMSA+IC9kZXYvbnVsbAorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEphdmEgZGVwZW5kZW5jaWVzYCBcCisgICAgICBhbnQgXAorICAgICAgYW50LW9wdGlvbmFsIFwKKyAgICAgIG9wZW5qZGstOC1qZGsgXAorICAgICAgbWF2ZW4gJiYgXAorICAgIHVwZGF0ZS1hbHRlcm5hdGl2ZXMgLS1zZXQgamF2YSAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQvanJlL2Jpbi9qYXZhCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgTHVhIGRlcGVuZGVuY2llc2AgXAorICAgICAgbHVhNS4yIFwKKyAgICAgIGx1YTUuMi1kZXYKKyMgaHR0cHM6Ly9idWdzLmxhdW5jaHBhZC5uZXQvdWJ1bnR1Lytzb3VyY2UvbHVhNS4zLytidWcvMTcwNzIxMgorIyBsdWE1LjMgZG9lcyBub3QgaW5zdGFsbCBhbHRlcm5hdGl2ZXMhCisjIG5lZWQgdG8gdXBkYXRlIG91ciBsdWFzb2NrZXQgY29kZSwgbHVhIGRvZXNuJ3QgaGF2ZSBsdWFMX29wZW5saWIgYW55IG1vcmUKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBOb2RlLmpzIGRlcGVuZGVuY2llc2AgXAorICAgICAgbm9kZWpzCisKKyMgVGVzdCBkZXBlbmRlbmNpZXMgZm9yIHJ1bm5pbmcgcHVwcGV0ZWVyCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEpTIGRlcGVuZGVuY2llc2AgXAorICAgICAgbGlieHNzMQorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIE9DYW1sIGRlcGVuZGVuY2llc2AgXAorICAgICAgb2NhbWwgXAorICAgICAgb3BhbSAmJiBcCisgICAgb3BhbSBpbml0IC0teWVzICYmIFwKKyAgICBvcGFtIGluc3RhbGwgLS15ZXMgb2FzaXMKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBQZXJsIGRlcGVuZGVuY2llc2AgXAorICAgICAgbGliYml0LXZlY3Rvci1wZXJsIFwKKyAgICAgIGxpYmNsYXNzLWFjY2Vzc29yLWNsYXNzLXBlcmwgXAorICAgICAgbGliY3J5cHQtc3NsZWF5LXBlcmwgXAorICAgICAgbGliaW8tc29ja2V0LXNzbC1wZXJsIFwKKyAgICAgIGxpYm5ldC1zc2xlYXktcGVybAorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFBocCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIHBocCBcCisgICAgICBwaHAtY2xpIFwKKyAgICAgIHBocC1kZXYgXAorICAgICAgcGhwLXBlYXIgXAorICAgICAgcmUyYyBcCisgICAgICBjb21wb3NlcgorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFB5dGhvbiBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIHB5dGhvbi1hbGwgXAorICAgICAgcHl0aG9uLWFsbC1kYmcgXAorICAgICAgcHl0aG9uLWFsbC1kZXYgXAorICAgICAgcHl0aG9uLWlwYWRkcmVzcyBcCisgICAgICBweXRob24tcGlwIFwKKyAgICAgIHB5dGhvbi1zZXR1cHRvb2xzIFwKKyAgICAgIHB5dGhvbi1zaXggXAorICAgICAgcHl0aG9uLXRvcm5hZG8gXAorICAgICAgcHl0aG9uLXR3aXN0ZWQgXAorICAgICAgcHl0aG9uLXdoZWVsIFwKKyAgICAgIHB5dGhvbi16b3BlLmludGVyZmFjZSAmJiBcCisgICBwaXAgaW5zdGFsbCAtLXVwZ3JhZGUgYmFja3BvcnRzLnNzbF9tYXRjaF9ob3N0bmFtZQorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFB5dGhvbjMgZGVwZW5kZW5jaWVzYCBcCisgICAgICBweXRob24zLWFsbCBcCisgICAgICBweXRob24zLWFsbC1kYmcgXAorICAgICAgcHl0aG9uMy1hbGwtZGV2IFwKKyAgICAgIHB5dGhvbjMtcGlwIFwKKyAgICAgIHB5dGhvbjMtc2V0dXB0b29scyBcCisgICAgICBweXRob24zLXNpeCBcCisgICAgICBweXRob24zLXRvcm5hZG8gXAorICAgICAgcHl0aG9uMy10d2lzdGVkIFwKKyAgICAgIHB5dGhvbjMtd2hlZWwgXAorICAgICAgcHl0aG9uMy16b3BlLmludGVyZmFjZQorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFJ1YnkgZGVwZW5kZW5jaWVzYCBcCisgICAgICBydWJ5IFwKKyAgICAgIHJ1YnktZGV2IFwKKyAgICAgIHJ1YnktYnVuZGxlcgorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFJ1c3QgZGVwZW5kZW5jaWVzYCBcCisgICAgICBjYXJnbyBcCisgICAgICBydXN0YworCisjIFN3aWZ0IG9uIExpbnV4IGZvciBjcm9zcyB0ZXN0cworUlVOIGNkIC8gJiYgXAorICAgIHdnZXQgLS1xdWlldCBodHRwczovL3N3aWZ0Lm9yZy9idWlsZHMvc3dpZnQtNC4yLjEtcmVsZWFzZS91YnVudHUxODA0L3N3aWZ0LTQuMi4xLVJFTEVBU0Uvc3dpZnQtNC4yLjEtUkVMRUFTRS11YnVudHUxOC4wNC50YXIuZ3ogJiYgXAorICAgIHRhciB4ZiBzd2lmdC00LjIuMS1SRUxFQVNFLXVidW50dTE4LjA0LnRhci5neiAtLXN0cmlwLWNvbXBvbmVudHM9MSAmJiBcCisgICAgcm0gc3dpZnQtNC4yLjEtUkVMRUFTRS11YnVudHUxOC4wNC50YXIuZ3ogJiYgXAorICAgIHN3aWZ0IC0tdmVyc2lvbgorCisjIGNwcGNoZWNrLTEuODIgaGFzIGEgbmFzdHkgY3BwIHBhcnNlciBidWcsIHNvIHdlJ3JlIHVzaW5nIHNvbWV0aGluZyBuZXdlcgorUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBTdGF0aWMgQ29kZSBBbmFseXNpcyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGNwcGNoZWNrIFwKKyAgICAgIHNsb2Njb3VudCAmJiBcCisgICAgcGlwIGluc3RhbGwgZmxha2U4ICYmIFwKKyAgICB3Z2V0IC1xICJodHRwczovL2xhdW5jaHBhZC5uZXQvdWJ1bnR1Lytzb3VyY2UvY3BwY2hlY2svMS44My0yLytidWlsZC8xNDg3NDcwMy8rZmlsZXMvY3BwY2hlY2tfMS44My0yX2FtZDY0LmRlYiIgJiYgXAorICAgIGRwa2cgLWkgY3BwY2hlY2tfMS44My0yX2FtZDY0LmRlYiAmJiBcCisgICAgcm0gY3BwY2hlY2tfMS44My0yX2FtZDY0LmRlYgorCisjIENsZWFuIHVwCitSVU4gcm0gLXJmIC92YXIvY2FjaGUvYXB0LyogJiYgXAorICAgIHJtIC1yZiAvdmFyL2xpYi9hcHQvbGlzdHMvKiAmJiBcCisgICAgcm0gLXJmIC90bXAvKiAmJiBcCisgICAgcm0gLXJmIC92YXIvdG1wLyoKKworRU5WIFRIUklGVF9ST09UIC90aHJpZnQKK1JVTiBta2RpciAtcCAkVEhSSUZUX1JPT1Qvc3JjCitDT1BZIERvY2tlcmZpbGUgJFRIUklGVF9ST09ULworV09SS0RJUiAkVEhSSUZUX1JPT1Qvc3JjCmRpZmYgLS1naXQgYS9idWlsZC9kb2NrZXIvdWJ1bnR1LXhlbmlhbC9Eb2NrZXJmaWxlIGIvYnVpbGQvZG9ja2VyL3VidW50dS14ZW5pYWwvRG9ja2VyZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzcyYjRkCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvZG9ja2VyL3VidW50dS14ZW5pYWwvRG9ja2VyZmlsZQpAQCAtMCwwICsxLDI3MSBAQAorIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjCisjIEFwYWNoZSBUaHJpZnQgRG9ja2VyIGJ1aWxkIGVudmlyb25tZW50IGZvciBVYnVudHUgWGVuaWFsCisjIFVzaW5nIGFsbCBzdG9jayBVYnVudHUgWGVuaWFsIHBhY2thZ2luZyBleGNlcHQgZm9yOgorIyAtIGQ6IGRvZXMgbm90IGNvbWUgd2l0aCBVYnVudHUgc28gd2UncmUgaW5zdGFsbGluZyAyLjA3NS4xIGZvciBjb3ZlcmFnZQorIyAtIGRhcnQ6IGRvZXMgbm90IGNvbWUgd2l0aCBVYnVudHUgc28gd2UncmUgaW5zdGFsbGluZyAxLjIyLjEgZm9yIGNvdmVyYWdlCisjIC0gZG90bmV0OiBkb2VzIG5vdCBjb21lIHdpdGggVWJ1bnR1CisjIC0gZ286IFhlbmlhbCBjb21lcyB3aXRoIDEuNiwgYnV0IHdlIG5lZWQgMS43IG9yIGxhdGVyCisjIC0gbm9kZWpzOiBYZW5pYWwgY29tZXMgd2l0aCA0LjIuNiB3aGljaCBleGl0cyBMVFMgQXByaWwgMjAxOCwgc28gd2UncmUgaW5zdGFsbGluZyA2LngKKyMgLSBvY2FtbDogY2F1c2VzIHN0YWNrIG92ZXJmbG93IGVycm9yLCBqdXN0IHN0YXJ0ZWQgTWFyY2ggMjAxOCBub3Qgc3VyZSB3aHkKKyMKKworRlJPTSBidWlsZHBhY2stZGVwczp4ZW5pYWwtc2NtCitNQUlOVEFJTkVSIEFwYWNoZSBUaHJpZnQgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4KK0VOViBERUJJQU5fRlJPTlRFTkQgbm9uaW50ZXJhY3RpdmUKKworIyMjIEFkZCBhcHQgcmVwb3MKKworUlVOIGFwdC1nZXQgdXBkYXRlICYmIFwKKyAgICBhcHQtZ2V0IGRpc3QtdXBncmFkZSAteSAmJiBcCisgICAgYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKKyAgICAgIGFwdCBcCisgICAgICBhcHQtdHJhbnNwb3J0LWh0dHBzIFwKKyAgICAgIGFwdC11dGlscyBcCisgICAgICBjdXJsIFwKKyAgICAgIHNvZnR3YXJlLXByb3BlcnRpZXMtY29tbW9uIFwKKyAgICAgIHdnZXQKKworIyBjc2hhcnAgKG1vbm8pCisjIFJVTiBlY2hvICJkZWIgaHR0cDovL2Rvd25sb2FkLm1vbm8tcHJvamVjdC5jb20vcmVwby9kZWJpYW4geGVuaWFsIG1haW4iIHwgdGVlIC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL21vbm8ubGlzdCAmJiBcCisjICAgICBhcHQta2V5IGFkdiAtLWtleXNlcnZlciBrZXlzZXJ2ZXIudWJ1bnR1LmNvbSAtLXJlY3Yta2V5cyBBNkExOUIzOEQzRDgzMUVGCisKKyMgRAorUlVOIGFwdC1rZXkgYWR2IC0ta2V5c2VydmVyIGtleXNlcnZlci51YnVudHUuY29tIC0tcmVjdi1rZXlzIEVCQ0Y5NzVFNUJBMjRENUUgJiYgXAorICAgIHdnZXQgaHR0cDovL21hc3Rlci5kbC5zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdC9kLWFwdC9maWxlcy9kLWFwdC5saXN0IC1PIC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL2QtYXB0Lmxpc3QgJiYgXAorICAgIHdnZXQgLXFPIC0gaHR0cHM6Ly9kbGFuZy5vcmcvZC1rZXlyaW5nLmdwZyB8IGFwdC1rZXkgYWRkIC0KKworIyBEYXJ0CitSVU4gY3VybCBodHRwczovL2RsLXNzbC5nb29nbGUuY29tL2xpbnV4L2xpbnV4X3NpZ25pbmdfa2V5LnB1YiB8IGFwdC1rZXkgYWRkIC0gJiYgXAorICAgIGN1cmwgaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkLmRhcnRsYW5nLm9yZy9saW51eC9kZWJpYW4vZGFydF9zdGFibGUubGlzdCA+IFwKKyAgICAgIC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL2RhcnRfc3RhYmxlLmxpc3QKK0VOViBEQVJUX1ZFUlNJT04gMS4yMi4xLTEKKworIyBkb3RuZXQgKGNvcmUpCitSVU4gY3VybCBodHRwczovL3BhY2thZ2VzLm1pY3Jvc29mdC5jb20va2V5cy9taWNyb3NvZnQuYXNjIHwgZ3BnIC0tZGVhcm1vciA+IC9ldGMvYXB0L3RydXN0ZWQuZ3BnLmQvbWljcm9zb2Z0LmdwZyAmJiBcCisgICAgZWNobyAiZGViIFthcmNoPWFtZDY0XSBodHRwczovL3BhY2thZ2VzLm1pY3Jvc29mdC5jb20vcmVwb3MvbWljcm9zb2Z0LXVidW50dS14ZW5pYWwtcHJvZCB4ZW5pYWwgbWFpbiIgPiBcCisgICAgICAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9kb3RuZXRkZXYubGlzdAorCisjIG5vZGUuanMKK1JVTiBjdXJsIC1zTCBodHRwczovL2RlYi5ub2Rlc291cmNlLmNvbS9ncGdrZXkvbm9kZXNvdXJjZS5ncGcua2V5IHwgYXB0LWtleSBhZGQgLSAmJiBcCisgICAgZWNobyAiZGViIGh0dHBzOi8vZGViLm5vZGVzb3VyY2UuY29tL25vZGVfNi54IHhlbmlhbCBtYWluIiB8IHRlZSAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9ub2Rlc291cmNlLmxpc3QKKworIyMjIGluc3RhbGwgZ2VuZXJhbCBkZXBlbmRlbmNpZXMKK1JVTiBhcHQtZ2V0IHVwZGF0ZSAmJiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgR2VuZXJhbCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGJhc2gtY29tcGxldGlvbiBcCisgICAgICBiaXNvbiBcCisgICAgICBidWlsZC1lc3NlbnRpYWwgXAorICAgICAgY2xhbmcgXAorICAgICAgY21ha2UgXAorICAgICAgZGViaGVscGVyIFwKKyAgICAgIGZsZXggXAorICAgICAgZ2RiIFwKKyAgICAgIGxsdm0gXAorICAgICAgbmluamEtYnVpbGQgXAorICAgICAgcGtnLWNvbmZpZyBcCisgICAgICB2YWxncmluZCBcCisgICAgICB2aW0KK0VOViBQQVRIIC91c3IvbGliL2xsdm0tMy44L2JpbjokUEFUSAorCisjIyMgbGFuZ3VhZ2VzCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgQysrIGRlcGVuZGVuY2llc2AgXAorICAgICAgbGliYm9vc3QtZGV2IFwKKyAgICAgIGxpYmJvb3N0LWZpbGVzeXN0ZW0tZGV2IFwKKyAgICAgIGxpYmJvb3N0LXByb2dyYW0tb3B0aW9ucy1kZXYgXAorICAgICAgbGliYm9vc3Qtc3lzdGVtLWRldiBcCisgICAgICBsaWJib29zdC10ZXN0LWRldiBcCisgICAgICBsaWJib29zdC10aHJlYWQtZGV2IFwKKyAgICAgIGxpYmV2ZW50LWRldiBcCisgICAgICBsaWJzc2wtZGV2IFwKKyAgICAgIHF0NS1kZWZhdWx0IFwKKyAgICAgIHF0YmFzZTUtZGV2IFwKKyAgICAgIHF0YmFzZTUtZGV2LXRvb2xzCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgY3NoYXJwIChtb25vKSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIG1vbm8tZGV2ZWwKKworRU5WIERfVkVSU0lPTiAyLjA3NS4xLTAKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1hbGxvdy11bmF1dGhlbnRpY2F0ZWQgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgRCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGRtZC1iaW49JERfVkVSU0lPTiBcCisgICAgICBsaWJwaG9ib3MyLWRldj0kRF9WRVJTSU9OIFwKKyAgICAgIGR1Yj0xLjYuMC0wIFwKKyAgICAgIGRmbXQgXAorICAgICAgZHNjYW5uZXIgXAorICAgICAgbGliZXZlbnQtZGV2IFwKKyAgICAgIGxpYnNzbC1kZXYgXAorICAgICAgeGRnLXV0aWxzCitSVU4gbWtkaXIgLXAgL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvZGVpbW9zIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L0MgJiYgXAorICAgIGN1cmwgLXNTTCBodHRwczovL2dpdGh1Yi5jb20vRC1Qcm9ncmFtbWluZy1EZWltb3MvbGliZXZlbnQvYXJjaGl2ZS9tYXN0ZXIudGFyLmd6fCB0YXIgeHogJiYgXAorICAgIG12IGxpYmV2ZW50LW1hc3Rlci9kZWltb3MvKiAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9kZWltb3MvICYmIFwKKyAgICBtdiBsaWJldmVudC1tYXN0ZXIvQy8qIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L0MvICYmIFwKKyAgICBybSAtcmYgbGliZXZlbnQtbWFzdGVyCitSVU4gY3VybCAtc1NMIGh0dHBzOi8vZ2l0aHViLmNvbS9ELVByb2dyYW1taW5nLURlaW1vcy9vcGVuc3NsL2FyY2hpdmUvdjEuMS42KzEuMC4xZy50YXIuZ3ogfCB0YXIgeHogJiYgXAorICAgIG12IG9wZW5zc2wtMS4xLjYtMS4wLjFnL2RlaW1vcy8qIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L2RlaW1vcy8gJiYgXAorICAgIG12IG9wZW5zc2wtMS4xLjYtMS4wLjFnL0MvKiAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9DLyAmJiBcCisgICAgcm0gLXJmIG9wZW5zc2wtMS4xLjYtMS4wLjFnCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgRGFydCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGRhcnQ9JERBUlRfVkVSU0lPTgorRU5WIFBBVEggL3Vzci9saWIvZGFydC9iaW46JFBBVEgKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBkb3RuZXQgY29yZSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGRvdG5ldC1zZGstMi4xLjQKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBFcmxhbmcgZGVwZW5kZW5jaWVzYCBcCisgICAgICBlcmxhbmctYmFzZSBcCisgICAgICBlcmxhbmctZXVuaXQgXAorICAgICAgZXJsYW5nLWRldiBcCisgICAgICBlcmxhbmctdG9vbHMgXAorICAgICAgcmViYXIKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBHbGliQyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGxpYmdsaWIyLjAtZGV2CisKKyMgZ29sYW5nCitFTlYgR09MQU5HX1ZFUlNJT04gMS43LjYKK0VOViBHT0xBTkdfRE9XTkxPQURfVVJMIGh0dHBzOi8vZ29sYW5nLm9yZy9kbC9nbyRHT0xBTkdfVkVSU0lPTi5saW51eC1hbWQ2NC50YXIuZ3oKK0VOViBHT0xBTkdfRE9XTkxPQURfU0hBMjU2IGFkNTgwOGJmNDJiMDE0YzIyZGQ3NjQ2NDU4ZjYzMTM4NTAwMzA0OWRlZDBiYjZhZjJlZmM3ZjFmNzlmYTI5ZWEKK1JVTiBjdXJsIC1mc1NMICIkR09MQU5HX0RPV05MT0FEX1VSTCIgLW8gZ29sYW5nLnRhci5neiAmJiBcCisgICAgICBlY2hvICIkR09MQU5HX0RPV05MT0FEX1NIQTI1NiAgZ29sYW5nLnRhci5neiIgfCBzaGEyNTZzdW0gLWMgLSAmJiBcCisgICAgICB0YXIgLUMgL3Vzci9sb2NhbCAteHpmIGdvbGFuZy50YXIuZ3ogJiYgXAorICAgICAgbG4gLXMgL3Vzci9sb2NhbC9nby9iaW4vZ28gL3Vzci9sb2NhbC9iaW4gJiYgXAorICAgICAgcm0gZ29sYW5nLnRhci5negorCisjIGR1ZSB0byBhIGJ1ZyBpbiBjYWJhbCBpbiB4ZW5pYWwgKGNhYmFsLWluc3RhbGwgcGFja2FnZSkgd2UgcHVsbCBpbiBhbm90aGVyOgorUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBIYXNrZWxsIGRlcGVuZGVuY2llc2AgXAorICAgICAgZ2hjICYmIFwKKyAgICBjZCAvdG1wICYmIFwKKyAgICB3Z2V0IC1xIGh0dHBzOi8vd3d3Lmhhc2tlbGwub3JnL2NhYmFsL3JlbGVhc2UvY2FiYWwtaW5zdGFsbC0xLjI0LjAuMi9jYWJhbC1pbnN0YWxsLTEuMjQuMC4yLXg4Nl82NC11bmtub3duLWxpbnV4LnRhci5neiAmJiBcCisgICAgdGFyIHh6ZiBjYWJhbC1pbnN0YWxsLTEuMjQuMC4yLXg4Nl82NC11bmtub3duLWxpbnV4LnRhci5neiAmJiBcCisgICAgZmluZCBkaXN0LW5ld3N0eWxlLyAtdHlwZSBmIC1uYW1lIGNhYmFsIC1leGVjIG12IHt9IC91c3IvYmluIFw7ICYmIFwKKyAgICBybSAtcmYgL3RtcC9jYWJhbCogJiYgXAorICAgIGNhYmFsIC0tdmVyc2lvbgorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEhheGUgZGVwZW5kZW5jaWVzYCBcCisgICAgICBoYXhlIFwKKyAgICAgIG5la28gXAorICAgICAgbmVrby1kZXYgXAorICAgICAgbGlibmVrbzAgJiYgXAorICAgIGhheGVsaWIgc2V0dXAgLS1hbHdheXMgL3Vzci9zaGFyZS9oYXhlL2xpYiAmJiBcCisgICAgaGF4ZWxpYiBpbnN0YWxsIC0tYWx3YXlzIGh4Y3BwIDMuNC42NCAyPiYxID4gL2Rldi9udWxsCisjIG5vdGU6IGh4Y3BwIDMuNC4xODUgKGxhdGVzdCkgbm8gbG9uZ2VyIHNoaXBzIHN0YXRpYyBsaWJyYXJpZXMsIGFuZCBjYXVzZWQgYSBidWlsZCBmYWlsdXJlCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgSmF2YSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGFudCBcCisgICAgICBhbnQtb3B0aW9uYWwgXAorICAgICAgb3Blbmpkay04LWpkayBcCisgICAgICBtYXZlbgorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEx1YSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGx1YTUuMiBcCisgICAgICBsdWE1LjItZGV2CisjIGh0dHBzOi8vYnVncy5sYXVuY2hwYWQubmV0L3VidW50dS8rc291cmNlL2x1YTUuMy8rYnVnLzE3MDcyMTIKKyMgbHVhNS4zIGRvZXMgbm90IGluc3RhbGwgYWx0ZXJuYXRpdmVzIHNvIHN0aWNrIHdpdGggNS4yIGhlcmUKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBOb2RlLmpzIGRlcGVuZGVuY2llc2AgXAorICAgICAgbm9kZWpzCisKKyMgVGVzdCBkZXBlbmRlbmNpZXMgZm9yIHJ1bm5pbmcgcHVwcGV0ZWVyCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEpTIGRlcGVuZGVuY2llc2AgXAorICAgICAgbGlieHNzMSBcCisgICAgICBsaWJhdGstYnJpZGdlMi4wLTAgXAorICAgICAgbGliZ3RrLTMtMAorCisjIFRIUklGVC00NTE3OiBjYXVzZXMgc3RhY2sgb3ZlcmZsb3dzOyB2ZXJzaW9uIHRvbyBvbGQ7IHNraXAgb2NhbWwgaW4geGVuaWFsCisjIFJVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorIyBgIyBPQ2FtbCBkZXBlbmRlbmNpZXNgIFwKKyMgICAgICAgb2NhbWwgXAorIyAgICAgICBvcGFtICYmIFwKKyMgICAgIG9wYW0gaW5pdCAtLXllcyAmJiBcCisjICAgICBvcGFtIGluc3RhbGwgLS15ZXMgb2FzaXMKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBQZXJsIGRlcGVuZGVuY2llc2AgXAorICAgICAgbGliYml0LXZlY3Rvci1wZXJsIFwKKyAgICAgIGxpYmNsYXNzLWFjY2Vzc29yLWNsYXNzLXBlcmwgXAorICAgICAgbGliY3J5cHQtc3NsZWF5LXBlcmwgXAorICAgICAgbGliaW8tc29ja2V0LXNzbC1wZXJsIFwKKyAgICAgIGxpYm5ldC1zc2xlYXktcGVybAorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFBocCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIHBocDcuMCBcCisgICAgICBwaHA3LjAtY2xpIFwKKyAgICAgIHBocDcuMC1kZXYgXAorICAgICAgcGhwLXBlYXIgXAorICAgICAgcmUyYyBcCisgICAgICBjb21wb3NlcgorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFB5dGhvbiBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIHB5dGhvbi1hbGwgXAorICAgICAgcHl0aG9uLWFsbC1kYmcgXAorICAgICAgcHl0aG9uLWFsbC1kZXYgXAorICAgICAgcHl0aG9uLWJhY2twb3J0cy5zc2wtbWF0Y2gtaG9zdG5hbWUgXAorICAgICAgcHl0aG9uLWlwYWRkcmVzcyBcCisgICAgICBweXRob24tcGlwIFwKKyAgICAgIHB5dGhvbi1zZXR1cHRvb2xzIFwKKyAgICAgIHB5dGhvbi1zaXggXAorICAgICAgcHl0aG9uLXRvcm5hZG8gXAorICAgICAgcHl0aG9uLXR3aXN0ZWQgXAorICAgICAgcHl0aG9uLXdoZWVsIFwKKyAgICAgIHB5dGhvbi16b3BlLmludGVyZmFjZSBcCisgICAgICBweXRob24zLWFsbCBcCisgICAgICBweXRob24zLWFsbC1kYmcgXAorICAgICAgcHl0aG9uMy1hbGwtZGV2IFwKKyAgICAgIHB5dGhvbjMtc2V0dXB0b29scyBcCisgICAgICBweXRob24zLXNpeCBcCisgICAgICBweXRob24zLXRvcm5hZG8gXAorICAgICAgcHl0aG9uMy10d2lzdGVkIFwKKyAgICAgIHB5dGhvbjMtd2hlZWwgXAorICAgICAgcHl0aG9uMy16b3BlLmludGVyZmFjZSAmJiBcCisgICAgcGlwIGluc3RhbGwgLS11cGdyYWRlIGJhY2twb3J0cy5zc2xfbWF0Y2hfaG9zdG5hbWUKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBSdWJ5IGRlcGVuZGVuY2llc2AgXAorICAgICAgcnVieSBcCisgICAgICBydWJ5LWRldiBcCisgICAgICBydWJ5LWJ1bmRsZXIKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBSdXN0IGRlcGVuZGVuY2llc2AgXAorICAgICAgY2FyZ28gXAorICAgICAgcnVzdGMKKworIyBDbGVhbiB1cAorUlVOIHJtIC1yZiAvdmFyL2NhY2hlL2FwdC8qICYmIFwKKyAgICBybSAtcmYgL3Zhci9saWIvYXB0L2xpc3RzLyogJiYgXAorICAgIHJtIC1yZiAvdG1wLyogJiYgXAorICAgIHJtIC1yZiAvdmFyL3RtcC8qCisKK0VOViBET1RORVRfQ0xJX1RFTEVNRVRSWV9PUFRPVVQgMQorRU5WIFRIUklGVF9ST09UIC90aHJpZnQKK1JVTiBta2RpciAtcCAkVEhSSUZUX1JPT1Qvc3JjCitDT1BZIERvY2tlcmZpbGUgJFRIUklGVF9ST09ULworV09SS0RJUiAkVEhSSUZUX1JPT1Qvc3JjCmRpZmYgLS1naXQgYS9idWlsZC9maXhjaGFuZ2VzLnNoIGIvYnVpbGQvZml4Y2hhbmdlcy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42YzU3YjU0Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvZml4Y2hhbmdlcy5zaApAQCAtMCwwICsxLDM5IEBACisjIS91c3IvYmluL2VudiBiYXNoCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMKKyMgZml4Y2hhbmdlcyB3aWxsIHRha2UgYSBmaWxlIGFzIGlucHV0IGFuZCBsb29rIGZvciB0ZXh0IG1hdGNoaW5nCisjIHRoZSBwYXR0ZXJuIFtUSFJJRlQtbm5ubl0gKHRoZSBudW1iZXIgb2YgZGlnaXRzIGlzIG5vdCBpbXBvcnRhbnQpCisjIHdoaWNoIGlzIG5vdCBhIG1hcmtkb3duIGxpbmssIGFuZCBjaGFuZ2UgaXQgdG8gYmUgYSBtYXJrZG93biBsaW5rLgorIyBUaGUgdG9vbCB3cml0ZXMgdG8gc3Rkb3V0IHNvIHlvdSBjYW4gcmVkaXJlY3QgaXQgdG8gYSB0ZW1wb3JhcnkKKyMgZmlsZSBhbmQgdGhlbiBjb21wYXJlIGFnYWluc3QgdGhlIG9yaWdpbmFsIGZpbGUgYmVmb3JlIHJlcGxhY2luZworIyBpdC4KKyMKKyMgVGhpcyB0b29sIHdhcyBkZXZlbG9wZWQgYWZ0ZXIgdGhlIDAuMTIuMCByZWxlYXNlIHRvIGFzc2lzdCB3aXRoCisjIGdlbmVyYXRpb24gb2YgQ0hBTkdFUy5tZCBjb250ZW50LgorIworCit3aGlsZSBJRlM9JycgcmVhZCAtciBsaW5lIHx8IFtbIC1uICIkbGluZSIgXV07IGRvCisgICAgaWYgW1sgIiRsaW5lIiA9fiBeKC4qKVxbKFRIUklGVC1bWzpkaWdpdDpdXSspXF1bXlwoXSguKikkIF1dOyB0aGVuCisgICAgICAgIGVjaG8gIiR7QkFTSF9SRU1BVENIWzFdfVske0JBU0hfUkVNQVRDSFsyXX1dKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvJHtCQVNIX1JFTUFUQ0hbMl19KSAke0JBU0hfUkVNQVRDSFszXX0iCisgICAgZWxzZQorICAgICAgICBlY2hvICIkbGluZSIKKyAgICBmaQorZG9uZSA8ICIkMSIKZGlmZiAtLWdpdCBhL2J1aWxkL3ZlcmFsaWduLnNoIGIvYnVpbGQvdmVyYWxpZ24uc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjE3NDRiNAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL3ZlcmFsaWduLnNoCkBAIC0wLDAgKzEsMzEzIEBACisjIS91c3IvYmluL2VudiBiYXNoCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMgCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjIAorIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIworIyBUaGUgdmVyYWxpZ24gc2NyaXB0IHNldHMgdGhlIGFwcHJvcHJpYXRlIHZlcnNpb25zIGluIGFsbCBvZgorIyB0aGUgcGFja2FnZSBjb25maWd1cmF0aW9uIGZpbGVzIGZvciBhbGwgb2YgdGhlIHN1cHBvcnRlZAorIyBsYW5ndWFnZXMuICBJdCBpcyB1c2VkIHRvIHByZXBhcmUgYSByZWxlYXNlIG9yIG1vdmUgbWFzdGVyCisjIGZvcndhcmQgdG8gdGhlIG5leHQgYW50aWNpcGF0ZWQgdmVyc2lvbi4KKyMKKyMgVVNBR0UKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgdXNhZ2U6IHZlcmFsaWduLnNoIDxvbGRWZXJzaW9uPiA8bmV3VmVyc2lvbj4KKyMKKyMgRVhBTVBMRQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAkIC4vdmVyYWxpZ24uc2ggMC4xMi4wIDEuMC4wCisjICQgLi92ZXJhbGlnbi5zaCAxLjAuMCAxLjEuMAorIworIyBJTVBPUlRBTlQgVVNBR0UgTk9URQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBEZWZpbmUgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIERSWVJVTiB0byBoYXZlIHRoZSBzY3JpcHQKKyMgcHJpbnQgb3V0IGFsbCBtYXRjaGVzIHRvIHRoZSBvbGRWZXJzaW9uIGhpbGlnaHRlZCBzbyB0aGF0CisjIHlvdSBjYW4gdmVyaWZ5IGl0IHdpbGwgY2hhbmdlIHRoZSByaWdodCB0aGluZ3MuCisjCisKK2RlY2xhcmUgLUEgRklMRVMKKworIyBUaGVzZSBmaWxlcyByZXF1aXJlIGEgbWFudWFsIHRvdWNoOgorRklMRVNbQ0hBTkdFUy5tZF09bWFudWFsCitGSUxFU1tkZWJpYW4vY2hhbmdlbG9nXT1tYW51YWwKK0ZJTEVTW2RvYXAucmRmXT1tYW51YWwKKworIyBUaGVzZSBmaWxlcyBjYW4gYmUgdXBkYXRlZCBhdXRvbWF0aWNhbGx5OgorRklMRVNbQXBhY2hlVGhyaWZ0Lm51c3BlY109c2ltcGxlUmVwbGFjZQorRklMRVNbVGhyaWZ0LXN3aWZ0My5wb2RzcGVjXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tUaHJpZnQucG9kc3BlY109c2ltcGxlUmVwbGFjZQorRklMRVNbYXBwdmV5b3IueW1sXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tib3dlci5qc29uXT1qc29uUmVwbGFjZQorRklMRVNbYnVpbGQvY21ha2UvRGVmaW5lQ01ha2VEZWZhdWx0cy5jbWFrZV09c2ltcGxlUmVwbGFjZQorRklMRVNbY29uZmlndXJlLmFjXT1jb25maWd1cmVSZXBsYWNlCitGSUxFU1tjb250cmliL3RocmlmdC5zcGVjXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tsaWIvY29jb2Evc3JjL1RocmlmdC5oXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tsaWIvY3NoYXJwL1RocmlmdE1TQnVpbGRUYXNrL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tsaWIvY3NoYXJwL1RocmlmdE1TQnVpbGRUYXNrL1RocmlmdE1TQnVpbGRUYXNrLmNzcHJval09c2ltcGxlUmVwbGFjZQorRklMRVNbbGliL2NzaGFycC9zcmMvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3NdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9jc2hhcnAvc3JjL1RocmlmdC5jc3Byb2pdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvQ2xpZW50L011bHRpcGxleENsaWVudC5jc3Byb2pdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvQ2xpZW50L1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tsaWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L1NlcnZlci9NdWx0aXBsZXhTZXJ2ZXIuY3Nwcm9qXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tsaWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L1NlcnZlci9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jc109c2ltcGxlUmVwbGFjZQorRklMRVNbbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3NdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9kL3NyYy90aHJpZnQvYmFzZS5kXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tsaWIvZGFydC9wdWJzcGVjLnlhbWxdPXB1YnNwZWNSZXBsYWNlCitGSUxFU1tsaWIvZGVscGhpL3NyYy9UaHJpZnQucGFzXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tsaWIvZXJsL3NyYy90aHJpZnQuYXBwLnNyY109c2ltcGxlUmVwbGFjZQorRklMRVNbbGliL2hheGUvaGF4ZWxpYi5qc29uXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tsaWIvaHMvdGhyaWZ0LmNhYmFsXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tsaWIvamF2YS9ncmFkbGUucHJvcGVydGllc109c2ltcGxlUmVwbGFjZQorRklMRVNbbGliL2pzL3BhY2thZ2UuanNvbl09anNvblJlcGxhY2UKK0ZJTEVTW2xpYi9qcy9zcmMvdGhyaWZ0LmpzXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tsaWIvbHVhL1RocmlmdC5sdWFdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9uZXRjb3JlL1RocmlmdC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jc109c2ltcGxlUmVwbGFjZQorRklMRVNbbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvQ2xpZW50L1RIdHRwQ2xpZW50VHJhbnNwb3J0LmNzXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tsaWIvb2NhbWwvX29hc2lzXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tsaWIvcGVybC9saWIvVGhyaWZ0LnBtXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tsaWIvcHkvc2V0dXAucHldPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9yYi90aHJpZnQuZ2Vtc3BlY109c2ltcGxlUmVwbGFjZQorRklMRVNbbGliL3JzL0NhcmdvLnRvbWxdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9zdC9wYWNrYWdlLnhtbF09c2ltcGxlUmVwbGFjZQorRklMRVNbcGFja2FnZS5qc29uXT1qc29uUmVwbGFjZQorRklMRVNbc29uYXItcHJvamVjdC5wcm9wZXJ0aWVzXT1zaW1wbGVSZXBsYWNlCitGSUxFU1t0ZXN0L2NzaGFycC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jc109c2ltcGxlUmVwbGFjZQorRklMRVNbdGVzdC9jc2hhcnAvVGhyaWZ0VGVzdC5jc3Byb2pdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW3Rlc3QvZGFydC90ZXN0X2NsaWVudC9wdWJzcGVjLnlhbWxdPXB1YnNwZWNSZXBsYWNlCitGSUxFU1t0ZXN0L2VybC9zcmMvdGhyaWZ0X3Rlc3QuYXBwLnNyY109c2ltcGxlUmVwbGFjZQorRklMRVNbdHV0b3JpYWwvY3NoYXJwL0NzaGFycENsaWVudC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jc109c2ltcGxlUmVwbGFjZQorRklMRVNbdHV0b3JpYWwvY3NoYXJwL0NzaGFycFNlcnZlci9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jc109c2ltcGxlUmVwbGFjZQorRklMRVNbdHV0b3JpYWwvZGFydC9jbGllbnQvcHVic3BlYy55YW1sXT1wdWJzcGVjUmVwbGFjZQorRklMRVNbdHV0b3JpYWwvZGFydC9jb25zb2xlX2NsaWVudC9wdWJzcGVjLnlhbWxdPXB1YnNwZWNSZXBsYWNlCitGSUxFU1t0dXRvcmlhbC9kYXJ0L3NlcnZlci9wdWJzcGVjLnlhbWxdPXB1YnNwZWNSZXBsYWNlCitGSUxFU1t0dXRvcmlhbC9kZWxwaGkvRGVscGhpQ2xpZW50L0RlbHBoaUNsaWVudC5kcHJval09c2ltcGxlUmVwbGFjZQorRklMRVNbdHV0b3JpYWwvZGVscGhpL0RlbHBoaVNlcnZlci9EZWxwaGlTZXJ2ZXIuZHByb2pdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW3R1dG9yaWFsL2hzL1RocmlmdFR1dG9yaWFsLmNhYmFsXT1zaW1wbGVSZXBsYWNlCitGSUxFU1t0dXRvcmlhbC9vY2FtbC9fb2FzaXNdPXNpbXBsZVJlcGxhY2UKKworaWYgWyAhIC1mICJDSEFOR0VTIiBdOyB0aGVuCisgICAgPiYyIGVjaG8gImVycm9yOiBydW4gdmVyYWxpZ24uc2ggd2hpbGUgaW4gdGhlIHRocmlmdCByb290IGRpcmVjdG9yeSIKKyAgICBleGl0IDEKK2ZpCisKK2lmIFsgJCMgLW5lIDIgXTsgdGhlbgorICAgID4mMiBlY2hvICJ1c2FnZTogdmVyYWxpZ24uc2ggPG9sZFZlcnNpb24+IDxuZXdWZXJzaW9uPiIKKyAgICBleGl0IDEKK2ZpCisKK2pxIC0tdmVyc2lvbiAxPi9kZXYvbnVsbCAyPi9kZXYvbnVsbAoraWYgWyAkPyAtbmUgMCBdOyB0aGVuCisgICAgPiYyIGVjaG8gImVycm9yOiB0aGUgJ2pxJyBwYWNrYWdlIGlzIG5vdCBpbnN0YWxsZWQiCisgICAgZXhpdCAxCitmaQorCisjCisjIHZhbGlkYXRlVmVyc2lvbjogY2hlY2sgdGhhdCBhIHZlcnNpb24gbWF0Y2hlcyB0aGUgbWFqb3IubWlub3IucGF0Y2gKKyMgICBmb3JtYXQgd2hpY2ggaXMgdGhlIGxvd2VzdCBjb21tb24gZGVub21pbmF0b3Igc3VwcG9ydGVkIGJ5IGFsbAorIyAgIHByb2plY3Qgc3lzdGVtcy4KKyMgXHBhcmFtICQxIHRoZSB2ZXJzaW9uCisjIFxyZXR1cm5zIDAgaWYgdGhlIHZlcnNpb24gaXMgY29tcGxpYW50CisjCitmdW5jdGlvbiB2YWxpZGF0ZVZlcnNpb24KK3sKKyAgICBsb2NhbCByZXN1bHQKKyAgICBsb2NhbCB2YWxpZAorICAgIHZhbGlkPSQoZWNobyAiJDEiIHwgc2VkICcvXltbOmRpZ2l0Ol1dXCtcLltbOmRpZ2l0Ol1dXCtcLltbOmRpZ2l0Ol1dXCskLyF7cTIyfScpCisgICAgcmVzdWx0PSQ/CisgICAgaWYgWyAkcmVzdWx0IC1lcSAyMiBdOyB0aGVuCisgICAgICAgID4mMiBlY2hvICJlcnJvcjogdmVyc2lvbiAnJDEnIGRvZXMgbm90IGNvbmZvcm0gdG8gdGhlIHJlcXVpcmVkIG1ham9yLm1pbm9yLnBhdGNoIGZvcm1hdCIKKyAgICAgICAgcmV0dXJuICR7cmVzdWx0fQorICAgIGZpCit9CisKK09MRFZFUlNJT049JDEKK05FV1ZFUlNJT049JDIKK3ZhbGlkYXRlVmVyc2lvbiAiJHtPTERWRVJTSU9OfSIgfHwgZXhpdCAkPwordmFsaWRhdGVWZXJzaW9uICIke05FV1ZFUlNJT059IiB8fCBleGl0ICQ/CisKKyMKKyMgZXNjYXBlVmVyc2lvbjogZXNjYXBlIHRoZSB2ZXJzaW9uIGZvciB1c2UgYXMgYSBzZWQgc2VhcmNoCisjIFxwYXJhbSAkMSB0aGUgdmVyc2lvbiB0byBlc2NhcGUKKyMgXG91dHB1dCB0aGUgZXNjYXBlZCBzdHJpbmcKKyMgXHJldHVybnMgMAorIyBcZXhhbXBsZSBWRVJTRUFSQ0g9JChlc2NhcGVWZXJzaW9uICJbMS4wLjBdIik7IGVjaG8gJFZFUlNFQVJDSDsgPT4gIlxbMVwuMFwuMFxdIgorIworZnVuY3Rpb24gZXNjYXBlVmVyc2lvbgoreworICAgIGVjaG8gIiQoZWNobyAkMSB8IHNlZCAncy9cLi9cXC4vZycgfCBzZWQgJ3MvXFsvXFxcWy9nJyB8IHNlZCAncy9cXS9cXFxdL2cnKSIKK30KKworIyBTZXQgdXAgdmVyYm9zZSBoaWxpZ2h0aW5nIGlmIHJ1bm5pbmcgaW50ZXJhY3RpdmUKK2lmIFsgIiQodHB1dCBjb2xvcnMpIiAtbmUgMCBdOyB0aGVuCisgICAgcmV2ZXJzZT0kKHRwdXQgcmV2KQorICAgIHJlZD0kKHRwdXQgc2V0YWYgMSkKKyAgICBncmVlbj0kKHRwdXQgc2V0YWYgMikKKyAgICB5ZWxsb3c9JCh0cHV0IHNldGFmIDMpCisgICAgbm9ybWFsPSQodHB1dCBzZ3IwKQorZmkKKworZGVjbGFyZSAtQSBNQU5VQUwKKworIworIyBtYW51YWw6IG5vdGUgdGhhdCB1cGRhdGUgb2Ygc2FpZCBmaWxlIGlzIG1hbnVhbAorIyBccGFyYW0gJDEgZmlsZW5hbWUgdG8gZG8gcmVwbGFjZW1lbnRzIG9uCisjIFxyZXR1cm5zIDAKKyMKK2Z1bmN0aW9uIG1hbnVhbAoreworICAgIE1BTlVBTFsiJDEiXT0iIgorICAgIHJldHVybiAwCit9CisKKyMKKyMgY29uZmlndXJlUmVwbGFjZTogcmVwbGFjZSB0aGUgQUNfSU5JVCBmaWVsZCBpbiBjb25maWd1cmUuYWMKKyMgXHBhcmFtICQxIGZpbGVuYW1lIHRvIGRvIHJlcGxhY2VtZW50cyBvbgorIyBccmV0dXJucyAwIG9uIHN1Y2Nlc3MKKyMKKworZnVuY3Rpb24gY29uZmlndXJlUmVwbGFjZQoreworICAgIHJlcGxhY2UgIiQxIiAiW3RocmlmdF0sIFske09MRFZFUlNJT059XSIgIlt0aHJpZnRdLCBbJHtORVdWRVJTSU9OfV0iCit9CisKKyMKKyMganNvblJlcGxhY2U6IHJlcGxhY2UgYSBzcGVjaWZpYyB2ZXJzaW9uIGZpZWxkIGluIGEgSlNPTiBmaWxlCisjICAgbXVzdCBiZSBhIHRvcCBsZXZlbCAidmVyc2lvbiIgZmllbGQgaW4gdGhlIGpzb24gc3RydWN0dXJlCisjIFxwYXJhbSAkMSBmaWxlbmFtZSB0byBkbyByZXBsYWNlbWVudHMgb24KKyMgXHJldHVybnMgMCBvbiBzdWNjZXNzCisjCisKK2Z1bmN0aW9uIGpzb25SZXBsYWNlCit7CisgICAgbG9jYWwgcmVzdWx0CisgICAgbG9jYWwgb3V0cHV0CisgICAgaWYgWyAhIC16ICIkRFJZUlVOIiBdOyB0aGVuCisgICAgICAgIG91dHB1dD0kKGpxIC1lICIudmVyc2lvbiIgIiQxIikKKyAgICBlbHNlCisgICAgICAgIG91dHB1dD0kKGpxIC1lICIudmVyc2lvbiA9IFwiJHtORVdWRVJTSU9OfVwiIiAiJDEiID4gdG1wLiQkLmpzb24gJiYgbXYgdG1wLiQkLmpzb24gIiQxIikKKyAgICBmaQorICAgIHJlc3VsdD0kPworICAgIGlmIFsgJD8gLW5lIDAgXTsgdGhlbgorICAgICAgICBwcmludGYgIiUtNjBzIHwgJTVkIHwgJHtyZWR9RVJST1Ike25vcm1hbH06IHZlcnNpb24gdGFnIG5vdCBmb3VuZCIgIiQxIiAiJGNvdW50IgorICAgICAgICBlY2hvCisgICAgICAgIHJldHVybiAxCisgICAgZWxpZiBbICEgLXogIiREUllSVU4iIF07IHRoZW4KKyAgICAgICAgb3V0cHV0PSR7b3V0cHV0JVwifQorICAgICAgICBvdXRwdXQ9JHtvdXRwdXQjXCJ9CisgICAgICAgIHByaW50ZiAiJS02MHMgfCAlNWQgfCBNQVRDSEVTOiAgIHZlcnNpb246IFwiJHtyZXZlcnNlfSR7Z3JlZW59JHtvdXRwdXR9JHtub3JtYWx9XCIiICIkMSIgMQorICAgICAgICBlY2hvCisgICAgICAgIHJldHVybiAwCisgICAgZmkKKyAgICBwcmludGYgIiUtNjBzIHwgJTVkIHwgJHtncmVlbn1PSyR7bm9ybWFsfSIgIiQxIiAxCisgICAgZWNobworICAgIHJldHVybiAwCit9CisKKyMKKyMgcHVic3BlY1JlcGxhY2U6IHJlcGxhY2UgYSBzcGVjaWZpYyB2ZXJzaW9uIGZpZWxkIGluIGEgWUFNTCBmaWxlCisjICAgbXVzdCBiZSBhIHRvcCBsZXZlbCAidmVyc2lvbiIgZmllbGQgaW4gdGhlIHlhbWwgc3RydWN0dXJlCisjICAgZGlkIG5vdCBmaW5kIGEgcGFja2FnZSB0aGF0IHByZXNlcnZlcyBjb21tZW50cyBzbyB0aGlzIGlzCisjICAgc29tZXdoYXQgYnJhaW4tZGVhZCwgYnV0IGl0IGdldHMgdGhlIGpvYiBkb25lCisjIFxwYXJhbSAkMSBmaWxlbmFtZSB0byBkbyByZXBsYWNlbWVudHMgb24KKyMgXHJldHVybnMgMCBvbiBzdWNjZXNzCisjCisKK2Z1bmN0aW9uIHB1YnNwZWNSZXBsYWNlCit7CisgICAgcmVwbGFjZSAiJDEiICJ2ZXJzaW9uOiAke09MRFZFUlNJT059IiAidmVyc2lvbjogJHtORVdWRVJTSU9OfSIKK30KKworIworIyByZXBsYWNlOiByZXBsYWNlIG9jY3VycmVuY2VzIG9mIG9uZSBzdHJpbmcgd2l0aCBhbm90aGVyCisjICAgICB0aGUgZmlsZSBzcGVjaWZpZWQgbXVzdCBjb250YWluIHRoZSBvbGQgc3RyaW5nIGF0IGxlYXN0IG9uY2UKKyMgICAgIGluIG9yZGVyIHRvIGJlIHN1Y2Nlc3NmdWwuCisjIFxwYXJhbSAkMSBmaWxlbmFtZSB0byBkbyByZXBsYWNlbWVudHMgb24KKyMgXHBhcmFtICQyIHRoZSAib2xkIiBzdHJpbmcgdG8gYmUgcmVwbGFjZWQKKyMgXHBhcmFtICQzIHRoZSAibmV3IiBzdHJpaW5nIHRvIHJlcGxhY2UgaXQgd2l0aAorIyBccmV0dXJucyAwIG9uIHN1Y2Nlc3MKKyMKK2Z1bmN0aW9uIHJlcGxhY2UKK3sKKyAgICBsb2NhbCByZXN1bHQKKyAgICBsb2NhbCBvdXRwdXQKKyAgICBsb2NhbCBvbGRTdHJpbmc9IiQyIgorICAgIGxvY2FsIG5ld1N0cmluZz0iJDMiCisgICAgbG9jYWwgb2xkUmVnZXg9JChlc2NhcGVWZXJzaW9uICIke29sZFN0cmluZ30iKQorICAgIGxvY2FsIGNvdW50PSQoZ3JlcCAtRWMgIiR7b2xkUmVnZXh9IiAiJDEiKQorICAgIGxvY2FsIHZlcmJvc2UKKyAgICBpZiBbICRjb3VudCAtZXEgMCBdOyB0aGVuCisgICAgICAgIHByaW50ZiAiJS02MHMgfCAlNWQgfCAke3JlZH1OT1QgRk9VTkQke25vcm1hbH06ICR7b2xkU3RyaW5nfSIgIiQxIiAwCisgICAgICAgIGVjaG8KKyAgICAgICAgcmV0dXJuIDEKKyAgICBlbGlmIFsgISAteiAiJERSWVJVTiIgXTsgdGhlbgorICAgICAgICBwcmludGYgIiUtNjBzIHwgJTVkIHwgTUFUQ0hFUzoiICIkMSIgIiRjb3VudCIKKyAgICAgICAgZWNobworICAgICAgICB3aGlsZSByZWFkIC1yIGxpbmU7IGRvCisgICAgICAgICAgICBlY2hvICIgPiAkKGVjaG8gIiRsaW5lIiB8IHNlZCAicy8ke29sZFJlZ2V4fS8ke3JldmVyc2V9JHtncmVlbn0ke29sZFN0cmluZ30ke25vcm1hbH0vZyIpIgorICAgICAgICBkb25lIDwgPChncmVwIC1FICIke29sZFJlZ2V4fSIgIiQxIikKKyAgICAgICAgcmV0dXJuIDAKKyAgICBmaQorICAgIG91dHB1dD0kKHNlZCAtaSAicy8ke29sZFJlZ2V4fS8ke25ld1N0cmluZ30vZyIgIiQxIikKKyAgICByZXN1bHQ9JD8KKyAgICBpZiBbICRyZXN1bHQgLW5lIDAgXTsgdGhlbgorICAgICAgICBwcmludGYgIiUtNjBzIHwgJTVkIHwgJHtyZWR9RVJST1Ike25vcm1hbH06ICVzIiAiJDEiICIkY291bnQiICIkb3V0cHV0IgorICAgICAgICBlY2hvCisgICAgICAgIHJldHVybiAxCisgICAgZmkKKyAgICBwcmludGYgIiUtNjBzIHwgJTVkIHwgJHtncmVlbn1PSyR7bm9ybWFsfSIgIiQxIiAiJGNvdW50IgorICAgIGVjaG8KKyAgICByZXR1cm4gMAorfQorCisjCisjIHNpbXBsZVJlcGxhY2U6IHJlcGxhY2Ugb2NjdXJyZW5jZXMgb2YgJHtPTERWRVJTSU9OfSB3aXRoICR7TkVXVkVSU0lPTn0KKyMgICAgIHRoZSBmaWxlIHNwZWNpZmllZCBtdXN0IGNvbnRhaW4gT0xEVkVSU0lPTiBhdCBsZWFzdCBvbmNlCisjICAgICBpbiBvcmRlciB0byBiZSBzdWNjZXNzZnVsLgorIyBccGFyYW0gJDEgZmlsZW5hbWUgdG8gZG8gcmVwbGFjZW1lbnRzIG9uCisjIFxwYXJhbSAkMiB0aGUgIm9sZCIgc3RyaW5nIHRvIGJlIHJlcGxhY2VkCisjIFxwYXJhbSAkMyB0aGUgIm5ldyIgc3RyaWluZyB0byByZXBsYWNlIGl0IHdpdGgKKyMgXHJldHVybnMgMCBvbiBzdWNjZXNzCisjCitmdW5jdGlvbiBzaW1wbGVSZXBsYWNlCit7CisgICAgcmVwbGFjZSAiJDEiICIke09MRFZFUlNJT059IiAiJHtORVdWRVJTSU9OfSIKK30KKworZWNobyAiIgorZWNobyAiQXBhY2hlIFRocmlmdCBWZXJzaW9uIEFsaWdubWVudCBUb29sIgorZWNobyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgorZWNobyAiIgorZWNobyAiUHJldmlvdXMgVmVyc2lvbjogJHtPTERWRVJTSU9OfSIKK2VjaG8gIiAgICAgTmV3IFZlcnNpb246ICR7TkVXVkVSU0lPTn0iCitlY2hvICIiCitlY2hvICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKK2VjaG8gIkZpbGVuYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IENvdW50IHwgU3RhdHVzICAgICAgICAgICAgICAgIgorZWNobyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCisKK2ZvciBmaWxlIGluICQoZWNobyAiJHshRklMRVNbQF19IiB8IHNvcnQpOyBkbworICAgICR7RklMRVNbJGZpbGVdfSAkZmlsZSB8fCBleGl0ICQ/Citkb25lCisKK2VjaG8KK2VjaG8gIkZpbGVzIHRoYXQgbXVzdCBiZSBtb2RpZmllZCBtYW51YWxseToiCitlY2hvCitmb3IgbWFudSBpbiAkKGVjaG8gIiR7IU1BTlVBTFtAXX0iIHwgc29ydCk7IGRvCisgICAgZWNobyAiID4gJHt5ZWxsb3d9JHttYW51fSR7bm9ybWFsfSIKK2RvbmUKKworZXhpdCAwCmRpZmYgLS1naXQgYS9idWlsZC93aW5jcHAvUkVBRE1FLm1kIGIvYnVpbGQvd2luY3BwL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjMxNzgwCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvd2luY3BwL1JFQURNRS5tZApAQCAtMCwwICsxLDIxOSBAQAorPCEtLS0KK0xpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworIyBCdWlsZGluZyB0aHJpZnQgb24gV2luZG93cyAoTmF0aXZlKQorCitUaHJpZnQgdXNlcyBjbWFrZSB0byBtYWtlIGl0IGVhc2llciB0byBidWlsZCB0aGUgcHJvamVjdCBvbiBtdWx0aXBsZSBwbGF0Zm9ybXMsIGhvd2V2ZXIgdG8gYnVpbGQgYSBmdWxseSBmdW5jdGlvbmFsIGFuZCBwcm9kdWN0aW9uIHJlYWR5IHRocmlmdCBvbiBXaW5kb3dzIHJlcXVpcmVzIGEgbnVtYmVyIG9mIHRoaXJkIHBhcnR5IGxpYnJhcmllcyB0byBiZSBvYnRhaW5lZCBvciBidWlsdC4gIE9uY2UgdGhpcmQgcGFydHkgbGlicmFyaWVzIGFyZSByZWFkeSwgdGhlIHJpZ2h0IGNvbWJpbmF0aW9uIG9mIG9wdGlvbnMgbXVzdCBiZSBwYXNzZWQgdG8gY21ha2UgaW4gb3JkZXIgdG8gZ2VuZXJhdGUgdGhlIGNvcnJlY3QgZW52aXJvbm1lbnQuCisKKyMjIFN1bW1hcnkKKworVGhlc2UgaW5zdHJ1Y3Rpb25zIHdpbGwgaGVscCB5b3UgYnVpbGQgdGhyaWZ0IGZvciB3aW5kb3dzIHVzaW5nIFZpc3VhbAorU3R1ZGlvIDIwMTAgb3IgbGF0ZXIuICBUaGUgY29udHJpYnV0ZWQgYmF0Y2ggZmlsZXMgd2lsbCBoZWxwIHlvdSBidWlsZAordGhlIHRoaXJkIHBhcnR5IGxpYnJhcmllcyBuZWVkZWQgZm9yIGNvbXBsZXRlIHRocmlmdCBmdW5jdGlvbmFsaXR5IGFzCit3ZWxsIGFzIHRocmlmdCBpdHNlbGYuCisKK1RoZXNlIGluc3RydWN0aW9ucyBmb2xsb3cgYSBkaXJlY3RvcnkgbGF5b3V0IHRoYXQgbG9va3MgbGlrZSB0aGUgZm9sbG93aW5nOgorCisgICAgd29ya3NwYWNlXAorICAgICAgYnVpbGRcICAgICAgIC0gdGhpcyBpcyB3aGVyZSB0aGUgb3V0LW9mLXRyZWUgdGhyaWZ0IGNtYWtlIGJ1aWxkcyBhcmUgZ2VuZXJhdGVkCisgICAgICBkaXN0XCAgICAgICAgLSB0aGlzIGlzIHdoZXJlIHRoZSB0aHJpZnQgYnVpbGQgcmVzdWx0cyBlbmQgdXAKKyAgICAgIHRoaXJkcGFydHlcICAtIHRoaXMgaXMgd2hlcmUgYWxsIHRoaXJkIHBhcnR5IGJpbmFyaWVzIGFuZCBsaWJyYXJpZXMgbGl2ZQorICAgICAgICBidWlsZFwgICAgICAgLSB0aGlzIGlzIHdoZXJlIGFsbCB0aGlyZCBwYXJ0eSBvdXQtb2YtdHJlZSBidWlsZHMgYXJlIGdlbmVyYXRlZAorICAgICAgICAgICAgICAgICAgICAgICAoZXhjZXB0IGZvciBvcGVuc3NsLCB3aGljaCBvbmx5IGJ1aWxkcyBpbi10cmVlKQorICAgICAgICBkaXN0XCAgICAgICAgLSB0aGlzIGlzIHdoZXJlIGFsbCB0aGlyZCBwYXJ0eSBkaXN0cmlidXRpb25zIGVuZCB1cAorICAgICAgICBzcmNcICAgICAgICAgLSB0aGlzIGlzIHdoZXJlIGFsbCB0aGlyZCBwYXJ0eSBzb3VyY2UgcHJvamVjdHMgbGl2ZQorICAgICAgc2NyaXB0c1wgICAgIC0gYmF0Y2ggZmlsZXMgdXNlZCB0byBzZXQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBidWlsZHMKKyAgICAgIHRocmlmdFwgICAgICAtIHRoaXMgaXMgd2hlcmUgdGhlIHRocmlmdCBzb3VyY2UgcHJvamVjdCBsaXZlcworCitDcmVhdGUgYSAid29ya3NwYWNlIiBkaXJlY3Rvcnkgc29tZXdoZXJlIG9uIHlvdXIgc3lzdGVtIGFuZCB0aGVuIGNvcHkgdGhlIGNvbnRlbnRzIG9mIHRoaXMKK2RpcmVjdG9yeSB0byB0aGVyZSwgdGhlbiBjbG9uZSBvciB1bnBhY2sgdGhyaWZ0IGludG8gYHdvcmtzcGFjZVx0aHJpZnRgLgorCisjIyBUaGlyZCBQYXJ0eSBMaWJyYXJpZXMKKworQmF0Y2ggc2NyaXB0cyBhcmUgcHJvdmlkZWQgdG8gYnVpbGQgc29tZSB0aGlyZCBwYXJ0eSBsaWJyYXJpZXMuICBZb3UgbXVzdCBkb3dubG9hZCB0aGVtIGFuZCBwbGFjZSB0aGVtIGludG8gdGhlIGRpcmVjdG9yeSBub3RlZCBmb3IgZWFjaC4gIFlvdSBjYW4gdXNlIGRpZmZlcmVudCB2ZXJzaW9ucyBpZiB5b3UgcHJlZmVyOyB0aGVzZSBpbnN0cnVjdGlvbnMgd2VyZSBtYWRlIHdpdGggdGhlIHZlcnNpb25zIGxpc3RlZC4gIAorCis+IFRJUDogVG8gbW9kaWZ5IHRoZSB2ZXJzaW9ucyB1c2VkIGluIHRoZSBiYXRjaCBzY3JpcHRzLCBsb29rIGluIHNjcmlwdHNcdHB2ZXJzaW9ucy5iYXQuCisKK0J1aWxkIHRoZW0gaW4gdGhlIG9yZGVyIGxpc3RlZCB0byBzYXRpc2Z5IHRoZWlyIGRlcGVuZGVuY2llcy4KKworIyMjIHdpbmZsZXhiaXNvbgorCisgICAgICAgIHNvdXJjZTogd2ViIHNpdGUKKyAgICAgIGxvY2F0aW9uOiBodHRwczovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy93aW5mbGV4Ymlzb24vZmlsZXMvd2luX2ZsZXhfYmlzb24tbGF0ZXN0LnppcC9kb3dubG9hZAorICAgICAgIHZlcnNpb246ICJsYXRlc3QiCisgICAgIGRpcmVjdG9yeTogd29ya3NwYWNlXHRoaXJkcGFydHlcZGlzdFx3aW5mbGV4Ymlzb24KKworVGhpcyBwYWNrYWdlIGlzIHJlcXVpcmVkIHRvIGJ1aWxkIHRoZSBjb21waWxlci4gIFRoaXMgdGhpcmQgcGFydHkgcGFja2FnZSBkb2VzIG5vdCBuZWVkIHRvIGJlIGJ1aWx0IGFzIGl0IGlzIGEgYmluYXJ5IGRpc3RyaWJ1dGlvbiBvZiB0aGUgImJpc29uIiBhbmQgImZsZXgiIHRvb2xzIG5vcm1hbGx5IGZvdW5kIG9uIFVuaXggYm94ZXMuCisKKz4gVElQOiBJZiB5b3UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBidWlsZGluZyB0aGUgY29tcGlsZXIsIHlvdSBjYW4gc2tpcCB0aGUgcmVtYWluaW5nIHRoaXJkIHBhcnR5IGxpYnJhcmllcy4KKworIyMjIHpsaWIKKworICAgICAgICBzb3VyY2U6IHdlYiBzaXRlCisgICAgICBsb2NhdGlvbjogaHR0cDovL3psaWIubmV0LworICAgICAgIHZlcnNpb246IDEuMi45CisgICAgIGRpcmVjdG9yeTogd29ya3NwYWNlXHRoaXJkcGFydHlcc3JjXHpsaWItMS4yLjkKKworVG8gYnVpbGQsIG9wZW4gdGhlIGFwcHJvcHJpYXRlIFZpc3VhbCBTdHVkaW8gY29tbWFuZCBwcm9tcHQgYW5kIHRoZW4gcnVuIAordGhlIGJ1aWxkLXpsaWIuYmF0IHNjcmlwdCBpbiB0aGlyZHBhcnR5XHNyYy4KKyAKKyMjIyBvcGVuc3NsCisKKyAgICAgICAgc291cmNlOiB3ZWIgc2l0ZQorICAgICAgbG9jYXRpb246IGh0dHBzOi8vd3d3Lm9wZW5zc2wub3JnLworICAgICAgIHZlcnNpb246IDEuMS4wYworICAgICBkaXJlY3Rvcnk6IHdvcmtzcGFjZVx0aGlyZHBhcnR5XHNyY1xvcGVuc3NsLTEuMS4wYworICAgIGRlcGVuZHMtb246IHpsaWIKKworSWYgeW91IGFyZSB1c2luZyBvcGVuc3NsLTEuMS4wIG9yIGxhdGVyLCB0aGV5IGNoYW5nZWQgc3RhdGljIGJ1aWxkcyB0byB1c2UgTWljcm9zb2Z0IFN0YXRpYyBSVEwgZm9yIHJlbGVhc2UgYnVpbGRzLiAgemxpYiBieSBkZWZhdWx0IHVzZXMgYSBkeW5hbWljIHJ1bnRpbWUsIGFzIGRvZXMgbGliZXZlbnQuICBFZGl0IHRoZSBmaWxlIENvbmZpZ3VyYXRpb25zLzEwLW1haW4uY29uZiBhbmQgcmVwbGFjZSB0aGUgc2VjdGlvbiBjb250ZW50cyBmb3IgIlZDLW5vQ0UtY29tbW9uIiB3aXRoIHdoYXQgYXBwZWFycyBiZWxvdyB0byBtYWtlIG9wZW5zc2wgYnVpbGQgd2l0aCBkeW5hbWljIHJ1bnRpbWUgaW5zdGVhZDoKKworICAgICJWQy1ub0NFLWNvbW1vbiIgPT4geworICAgICAgICBpbmhlcml0X2Zyb20gICAgID0+IFsgIlZDLWNvbW1vbiIgXSwKKyAgICAgICAgdGVtcGxhdGUgICAgICAgICA9PiAxLAorICAgICAgICBjZmxhZ3MgICAgICAgICAgID0+IGFkZChwaWNrZXIoZGVmYXVsdCA9PiAiLURVTklDT0RFIC1EX1VOSUNPREUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWcgICA9PiAiL01EZCAvT2QgLURERUJVRyAtRF9ERUJVRyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxlYXNlID0+ICIvTUQgL08yIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKSwKKyAgICAgICAgYmluX2NmbGFncyAgICAgICA9PiBhZGQocGlja2VyKGRlYnVnICAgPT4gIi9NRGQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsZWFzZSA9PiAiL01EIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSksCisgICAgICAgIGJpbl9sZmxhZ3MgICAgICAgPT4gYWRkKCIvc3Vic3lzdGVtOmNvbnNvbGUgL29wdDpyZWYiKSwKKyAgICAgICAgZXhfbGlicyAgICAgICAgICA9PiBhZGQoc3ViIHsKKyAgICAgICAgICAgIG15IEBleF9saWJzID0gKCk7CisgICAgICAgICAgICBwdXNoIEBleF9saWJzLCAnd3MyXzMyLmxpYicgdW5sZXNzICRkaXNhYmxlZHtzb2NrfTsKKyAgICAgICAgICAgIHB1c2ggQGV4X2xpYnMsICdnZGkzMi5saWIgYWR2YXBpMzIubGliIGNyeXB0MzIubGliIHVzZXIzMi5saWInOworICAgICAgICAgICAgcmV0dXJuIGpvaW4oIiAiLCBAZXhfbGlicyk7CisgICAgICAgIH0pLAorICAgIH0sCisKK1RvIGJ1aWxkLCBvcGVuIHRoZSBhcHByb3ByaWF0ZSBWaXN1YWwgU3R1ZGlvIGNvbW1hbmQgcHJvbXB0IGFuZCB0aGVuIHJ1biAKK3RoZSBidWlsZC1vcGVuc3NsLmJhdCBzY3JpcHQgaW4gdGhpcmRwYXJ0eVxzcmMuCisKKyMjIyBsaWJldmVudAorCisgICAgICAgIHNvdXJjZTogZ2l0CisgICAgICBsb2NhdGlvbjogaHR0cHM6Ly9naXRodWIuY29tL25tYXRoZXdzb24vTGliZXZlbnQuZ2l0CisgICAgICAgICAgIHVzZTogY29tbWl0IDM4MjFjY2ExYTYzN2Y0ZGE0MDk5YzkzNDNlNzMyNmRhMDBmNjk4MWMgb3IgbGF0ZXIKKyAgICAgICAgICBkYXRlOiBGcmkgRGVjIDIzIDE2OjE5OjM1IDIwMTYgKzA4MDAgb3IgbGF0ZXIKKyAgICAgICB2ZXJzaW9uOiBjb3JyZXNwb25kcyB0byAyLjEuN3JjICsgcGF0Y2hlcworICAgICBkaXJlY3Rvcnk6IHdvcmtzcGFjZVx0aGlyZHBhcnR5XHNyY1xsaWJldmVudC0yLjEuN3JjMgorICAgIGRlcGVuZHMtb246IG9wZW5zc2wsIHpsaWIKKworVG8gYnVpbGQsIG9wZW4gdGhlIGFwcHJvcHJpYXRlIFZpc3VhbCBTdHVkaW8gY29tbWFuZCBwcm9tcHQgYW5kIHRoZW4gcnVuIAordGhlIGJ1aWxkLWxpYmV2ZW50LmJhdCBzY3JpcHQgaW4gdGhpcmRwYXJ0eVxzcmMuCisKKyMjIyBtc2ludHR5cGVzCisKKyAgICAgICAgc291cmNlOiB3ZWIgc2l0ZQorICAgICAgbG9jYXRpb246IGh0dHBzOi8vY29kZS5nb29nbGUuY29tL2FyY2hpdmUvcC9tc2ludHR5cGVzL2Rvd25sb2FkcworICAgICAgIHZlcnNpb246IDI2CisgICAgIGRpcmVjdG9yeTogd29ya3NwYWNlXHRoaXJkcGFydHlcZGlzdFxtc2ludHR5cGVzCisKKz4gVElQOiBUaGlzIGlzIG9ubHkgbmVjZXNzYXJ5IGZvciBWaXN1YWwgU3R1ZGlvIDIwMTAsIHdoaWNoIGRpZCBub3QgaW5jbHVkZSBhbiA8aW50dHlwZXMuaD4gaGVhZGVyLgorCitUaGlzIHRoaXJkIHBhcnR5IHBhY2thZ2UgZG9lcyBub3QgbmVlZCB0byBiZSBidWlsdCBhcyBpdCBpcyBhIGRpc3RyaWJ1dGlvbiBvZiBoZWFkZXIgZmlsZXMuCisKKyMjIyBib29zdAorCisgICAgICAgIHNvdXJjZTogd2ViIHNpdGUKKyAgICAgIGxvY2F0aW9uOiBodHRwOi8vYm9vc3QudGVla3M5OS5jb20vCisgICAgICAgdmVyc2lvbjogMV82Ml8wCisgICAgIGRpcmVjdG9yeTogd29ya3NwYWNlXHRoaXJkcGFydHlcZGlzdFxib29zdF8xXzYyXzAKKworVGhlIHByZS1idWlsdCBiaW5hcnkgdmVyc2lvbnMgb2YgYm9vc3QgY29tZSBpbiBzZWxmLXVucGFja2luZyBleGVjdXRhYmxlcy4gIFJ1biBlYWNoIG9mIHRoZSBvbmVzIHlvdSBhcmUgaW50ZXJlc3RlZCBpbiBhbmQgcG9pbnQgdGhlbSBhdCB0aGUgc2FtZSB0aGlyZHBhcnR5IGRpc3QgZGlyZWN0b3J5LgorCisjIyBCdWlsZGluZyBhIFByb2R1Y3Rpb24gdGhyaWZ0IENvbXBpbGVyCisKKyMjIyBQcmVyZXF1aXNpdGVzCisKKyogQ01ha2UtMi44LjEyLjIgb3IgbGF0ZXIKKyogVmlzdWFsIFN0dWRpbyAyMDEwIG9yIGxhdGVyCisqIHRocmlmdCBzb3VyY2UgcGxhY2VkIGludG8gd29ya3NwYWNlXHRocmlmdAorKiB3aW5mbGV4Ymlzb24gcGxhY2VkIGludG8gd29ya3NwYWNlXHRoaXJkcGFydHlcZGlzdAorCisjIyMgSW5zdHJ1Y3Rpb25zCisKK0J5IGZvbGxvd2luZyB0aGVzZSBpbnN0cnVjdGlvbnMgeW91IHdpbGwgZW5kIHVwIHdpdGggYSByZWxlYXNlIG1vZGUgdGhyaWZ0IGNvbXBpbGVyIHRoYXQgaXMgc3VpdGFibGUgZm9yIGRpc3RyaWJ1dGlvbiBhcyBpdCBoYXMgbm8gZXh0ZXJuYWwgZGVwZW5kZW5jaWVzLiAgCisKKzEuIE9wZW4gdGhlIGFwcHJvcHJpYXRlIFZpc3VhbCBTdHVkaW8gQ29tbWFuZCBQcm9tcHQuCisyLiBgY2Qgd29ya3NwYWNlYAorMy4gYGJ1aWxkLXRocmlmdC1jb21waWxlci5iYXRgCisKK1RoZSBiYXRjaCBmaWxlIHVzZXMgQ01ha2UgdG8gZ2VuZXJhdGUgYW4gb3V0LW9mLXRyZWUgYnVpbGQgZGlyZWN0b3J5IGluIGB3b3Jrc3BhY2VcYnVpbGRgIGFuZCB0aGVuIGJ1aWxkcyB0aGUgY29tcGlsZXIuICBUaGUgcmVzdWx0aW5nIGB0aHJpZnQuZXhlYCBwcm9ncmFtIGlzIHBsYWNlZCBpbnRvIGB3b3Jrc3BhY2VcZGlzdGAgaW4gYSBwYXRoIHRoYXQgZGVwZW5kcyBvbiB5b3VyIGNvbXBpbGVyIHZlcnNpb24gYW5kIHBsYXRmb3JtLiAgRm9yIGV4YW1wbGUsIGlmIHlvdSB1c2UgYSBWaXN1YWwgU3R1ZGlvIDIwMTAgeDY0IENvbW1hbmQgUHJvbXB0LCB0aGUgY29tcGlsZXIgd2lsbCBiZSBwbGFjZWQgaW50byBgd29ya3NwYWNlXGRpc3RcdGhyaWZ0LWNvbXBpbGVyLWRldlx2YzEwMFx4NjRcUmVsZWFzZVx0aHJpZnQuZXhlYAorCisjIyMjIERldGFpbHMKKworVGhpcyBzZWN0aW9uIGlzIGZvciB0aG9zZSB3aG8gYXJlIGN1cmlvdXMgYWJvdXQgdGhlIENNYWtlIG9wdGlvbnMgdXNlZCBpbiB0aGUgYnVpbGQgcHJvY2Vzcy4KKworQ01ha2UgdGFrZXMgdGhlIHNvdXJjZSB0cmVlIGFzIHRoZSBmaXJzdCBhcmd1bWVudCBhbmQgdXNlcyB0aGUgcmVtYWluaW5nIGFyZ3VtZW50cyBmb3IgY29uZmlndXJhdGlvbi4gIFRoZSBiYXRjaCBmaWxlIGBidWlsZC10aHJpZnQtY29tcGlsZXJgIGVzc2VudGlhbGx5IHBlcmZvcm1zIHRoZSBmb2xsb3dpbmcgY29tbWFuZHM6CisKKyAgICBDOlw+IENEIHdvcmtzcGFjZVxidWlsZAorICAgIEM6XHdvcmtzcGFjZVxidWlsZD4gIkM6XFByb2dyYW0gRmlsZXNcQ01ha2VcYmluXGNtYWtlLmV4ZSIgLi5cdGhyaWZ0IAorICAgICAgICAgICAgICAgICAgICAgICAgICAtREJJU09OX0VYRUNVVEFCTEU9Li5cdGhpcmRwYXJ0eVxkaXN0XHdpbmZsZXhiaXNvblx3aW5fYmlzb24uZXhlCisgICAgICAgICAgICAgICAgICAgICAgICAgIC1EQ01BS0VfQlVJTERfVFlQRT1SZWxlYXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgIC1ERkxFWF9FWEVDVVRBQkxFPS4uXHRoaXJkcGFydHlcZGlzdFx3aW5mbGV4Ymlzb25cd2luX2ZsZXguZXhlCisgICAgICAgICAgICAgICAgICAgICAgICAgIC1EV0lUSF9NVD1PTgorICAgICAgICAgICAgICAgICAgICAgICAgICAtRFdJVEhfU0hBUkVEX0xJQj1PRkYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLUciTk1ha2UgTWFrZWZpbGVzIgorICAgIEM6XHdvcmtzcGFjZVxidWlsZD4gTk1BS0UgL0ZNYWtlZmlsZSB0aHJpZnQtY29tcGlsZXIKKworV0lUSF9NVCBjb250cm9scyB0aGUgZHluYW1pYyBvciBzdGF0aWMgcnVudGltZSBsaWJyYXJ5IHNlbGVjdGlvbi4gIFRvIGJ1aWxkIGEgcHJvZHVjdGlvbiBjb21waWxlciwgdGhlIHRocmlmdCBwcm9qZWN0IHJlY29tbWVuZHMgdXNpbmcgdGhlIHN0YXRpYyBydW50aW1lIGxpYnJhcnkgdG8gbWFrZSB0aGUgZXhlY3V0YWJsZSBwb3J0YWJsZS4gIFRoZSBiYXRjaCBmaWxlIHNldHMgdGhpcy4KKworWW91IGNhbiBidWlsZCBhIFZpc3VhbCBTdHVkaW8gcHJvamVjdCBmaWxlIGJ5IGZvbGxvd2luZyB0aGUgZXhhbXBsZSBidXQgc3Vic3RpdHV0aW5nIGEgZGlmZmVyZW50IGdlbmVyYXRvciBmb3IgdGhlICItRyIgb3B0aW9uLiAgUnVuIGBjbWFrZS5leGUgLS1oZWxwYCBmb3IgYSBsaXN0IG9mIGdlbmVyYXRvcnMuICBUeXBpY2FsbHksIHRoaXMgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgb24gV2luZG93cyAob21pdCAiV2luNjQiIHRvIGJ1aWxkIDMyLWJpdCBpbnN0ZWFkKToKKworKiAiVmlzdWFsIFN0dWRpbyAxMCAyMDEwIFdpbjY0IgorKiAiVmlzdWFsIFN0dWRpbyAxMSAyMDEyIFdpbjY0IgorKiAiVmlzdWFsIFN0dWRpbyAxMiAyMDEzIFdpbjY0IgorKiAiVmlzdWFsIFN0dWRpbyAxNCAyMDE1IFdpbjY0IgorKiAiVmlzdWFsIFN0dWRpbyAxNSAyMDE3IFdpbjY0IgorCitGb3IgZXhhbXBsZSB5b3UgY2FuIGJ1aWxkIHVzaW5nIGEgVmlzdWFsIFN0dWRpbyBzb2x1dGlvbiBmaWxlIG9uIHRoZSBjb21tYW5kIGxpbmUgYnkgZG9pbmc6CisKKyAgICBDOlw+IENEIHdvcmtzcGFjZVxidWlsZAorICAgIEM6XHdvcmtzcGFjZVxidWlsZD4gIkM6XFByb2dyYW0gRmlsZXNcQ01ha2VcYmluXGNtYWtlLmV4ZSIgLi5cdGhyaWZ0IAorICAgICAgICAgICAgICAgICAgICAgICAgICAtREJJU09OX0VYRUNVVEFCTEU9Li5cdGhpcmRwYXJ0eVxkaXN0XHdpbmZsZXhiaXNvblx3aW5fYmlzb24uZXhlCisgICAgICAgICAgICAgICAgICAgICAgICAgIC1EQ01BS0VfQlVJTERfVFlQRT1SZWxlYXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgIC1ERkxFWF9FWEVDVVRBQkxFPS4uXHRoaXJkcGFydHlcZGlzdFx3aW5mbGV4Ymlzb25cd2luX2ZsZXguZXhlCisgICAgICAgICAgICAgICAgICAgICAgICAgIC1EV0lUSF9NVD1PTgorICAgICAgICAgICAgICAgICAgICAgICAgICAtRFdJVEhfU0hBUkVEX0xJQj1PRkYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLUciVmlzdWFsIFN0dWRpbyAxNCAyMDE1IFdpbjY0IgorICAgIEM6XHdvcmtzcGFjZVxidWlsZD4gTVNCVUlMRCAiQXBhY2hlIFRocmlmdC5zbG4iIC9wOkNvbmZpZ3VyYXRpb249UmVsZWFzZSAvcDpQbGF0Zm9ybT14NjQgL3Q6dGhyaWZ0LWNvbXBpbGVyCisKK1lvdSBjYW4gYWxzbyBkb3VibGUtY2xpY2sgb24gdGhlIHNvbHV0aW9uIGZpbGUgdG8gYnJpbmcgaXQgdXAgaW4gVmlzdWFsIFN0dWRpbyBhbmQgYnVpbGQgb3IgZGVidWcgaW50ZXJhY3RpdmVseSBmcm9tIHRoZXJlLgorCisjIyBCdWlsZGluZyB0aGUgdGhyaWZ0IEMrKyBSdW4tVGltZSBMaWJyYXJ5CisKK1RoZXNlIGluc3RydWN0aW9ucyBhcmUgc2ltaWxhciB0byB0aGUgY29tcGlsZXIgYnVpbGQgaG93ZXZlciB0aGVyZSBhcmUgYWRkaXRpb25hbCBkZXBlbmRlbmNpZXMgb24gdGhpcmQgcGFydHkgbGlicmFyaWVzIHRvIGJ1aWxkIGEgZmVhdHVyZS1jb21wbGV0ZSBydW50aW1lLiAgVGhlIHJlc3VsdGluZyBzdGF0aWMgbGluayBsaWJyYXJ5IGZvciB0aHJpZnQgdXNlcyBhIGR5bmFtaWMgTWljcm9zb2Z0IHJ1bnRpbWUuCisKKzEuIE9wZW4gdGhlIGRlc2lyZWQgVmlzdWFsIFN0dWRpbyBDb21tYW5kIFByb21wdC4KKzIuIGBjZCB3b3Jrc3BhY2VgCiszLiBgYnVpbGQtdGhyaWZ0LmJhdGAKKworVGhyaWZ0IGRlcGVuZHMgb24gYm9vc3QsIGxpYmV2ZW50LCBvcGVuc3NsLCBhbmQgemxpYiBpbiBvcmRlciB0byBidWlsZCB3aXRoIGFsbCBzZXJ2ZXIgYW5kIHRyYW5zcG9ydCB0eXBlcy4gIFRvIHVzZSBsYXRlciB2ZXJzaW9ucyBvZiBib29zdCBsaWtlIDEuNjIgeW91IHdpbGwgbmVlZCBhIHJlY2VudCB2ZXJzaW9uIG9mIGNtYWtlIChhdCBsZWFzdCAzLjcpLgorCitUaGUgYnVpbGQtdGhyaWZ0IHNjcmlwdCBoYXMgb3B0aW9ucyB0byBidWlsZCBkZWJ1ZyBvciByZWxlYXNlIGFuZCB0byBvcHRpb25hbGx5IGRpc2FibGUgYW55IG9mIHRoZSBnZW5lcmF0aW9uIChjbWFrZSksIGJ1aWxkLCBvciB0ZXN0IHBoYXNlcy4gIEJ5IGRlZmF1bHQsIHRoZSBiYXRjaCBmaWxlIHdpbGwgZ2VuZXJhdGUgYW4gb3V0LW9mLXRyZWUgYnVpbGQgZGlyZWN0b3J5IGluc2lkZSBgd29ya3NwYWNlXGJ1aWxkYCwgdGhlbiBwZXJmb3JtIGEgcmVsZWFzZSBidWlsZCwgdGhlbiBydW4gdGhlIHVuaXQgdGVzdHMuICBUaGUgYmF0Y2ggZmlsZSBhY2NlcHRzIHNvbWUgb3B0aW9uIGZsYWdzIHRvIGNvbnRyb2wgaXRzIGJlaGF2aW9yOgorCisgICAgOjogRmxhZ3MgeW91IGNhbiB1c2UgdG8gY2hhbmdlIHRoaXMgYmVoYXZpb3I6CisgICAgOjoKKyAgICA6OiAgIC9ERUJVRyAgICAgICAgICAgIC0gaWYgYnVpbGRpbmcsIHBlcmZvcm0gYSBkZWJ1ZyBidWlsZCBpbnN0ZWFkCisgICAgOjogICAvTk9HRU5FUkFURSAgICAgICAtIHNraXAgY21ha2UgZ2VuZXJhdGlvbiAtIHVzZWZ1bCBpZiB5b3UKKyAgICA6OiAgICAgICAgICAgICAgICAgICAgICAgaGF2ZSBhbHJlYWR5IGdlbmVyYXRlZCBhIHNvbHV0aW9uIGFuZCBqdXN0CisgICAgOjogICAgICAgICAgICAgICAgICAgICAgIHdhbnQgdG8gYnVpbGQKKyAgICA6OiAgIC9OT0JVSUxEICAgICAgICAgIC0gc2tpcCBjbWFrZSBidWlsZCAtIHVzZWZ1bCBpZiB5b3UganVzdAorICAgIDo6ICAgICAgICAgICAgICAgICAgICAgICB3YW50IHRvIGdlbmVyYXRlIGEgc29sdXRpb24KKyAgICA6OiAgIC9OT1RFU1QgICAgICAgICAgIC0gc2tpcCBjdGVzdCBleGVjdXRpb24KKworRm9yIGV4YW1wbGUgaWYgeW91IHdhbnQgdG8gZ2VuZXJhdGUgdGhlIGNtYWtlIGVudmlyb25tZW50IHdpdGhvdXQgYnVpbGRpbmcgb3IgcnVubmluZyB0ZXN0czoKKworICAgIEM6XHdvcmtzcGFjZT4gYnVpbGQtdGhyaWZ0LmJhdCAvTk9CVUlMRCAvTk9URVNUCmRpZmYgLS1naXQgYS9idWlsZC93aW5jcHAvYnVpbGQtdGhyaWZ0LWNvbXBpbGVyLmJhdCBiL2J1aWxkL3dpbmNwcC9idWlsZC10aHJpZnQtY29tcGlsZXIuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2YjQyYTgKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC93aW5jcHAvYnVpbGQtdGhyaWZ0LWNvbXBpbGVyLmJhdApAQCAtMCwwICsxLDc5IEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6IAorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjogCis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6IAorCis6OgorOjogUHJvZHVjZXMgYSBwcm9kdWN0aW9uIHRocmlmdCBjb21waWxlciBzdWl0YWJsZSBmb3IgcmVkaXN0cmlidXRpb24uCis6OiBUaGUgY29tcGlsZXIgaXMgbGlua2VkIHRvIHJ1bnRpbWUgc3RhdGljYWxseSBmb3IgbWF4aW11bSBwb3J0YWJpbGl0eS4KKzo6IEFzc3VtZXMgdGhlIHRoaXJkcGFydHkgZmlsZXMgZm9yICJ3aW5mbGV4Ymlzb24iIGhhdmUgYmVlbiBwbGFjZWQKKzo6IGFjY29yZGluZyB0byB0aGUgUkVBRE1FLm1kIGluc3RydWN0aW9ucy4KKzo6Cis6OiBPcGVuIGEgVmlzdWFsIFN0dWRpbyBDb21tYW5kIFByb21wdCBvZiB5b3VyIGNob29zaW5nIGFuZCB0aGVuCis6OiBydW4gdGhpcyBzY3JpcHQuICAKKworQEVDSE8gT0ZGCitTRVRMT0NBTCBFbmFibGVEZWxheWVkRXhwYW5zaW9uCisKK0lGIE5PVCBERUZJTkVEIFBBQ0tBR0VfTkFNRSAgICBTRVQgUEFDS0FHRV9OQU1FPXRocmlmdAorSUYgTk9UIERFRklORUQgUEFDS0FHRV9WRVJTSU9OIFNFVCBQQUNLQUdFX1ZFUlNJT049ZGV2CitJRiBOT1QgREVGSU5FRCBTT1VSQ0VfRElSICAgICAgU0VUIFNPVVJDRURJUj0lfmRwMCVQQUNLQUdFX05BTUUlCitJRiBOT1QgREVGSU5FRCBXSU4zUF9ST09UICAgICAgU0VUIFdJTjNQX1JPT1Q9JX5kcDB0aGlyZHBhcnR5CisKKzo6IFNldCBDT01QSUxFUiB0byAodmMxMDAgLSB2YzE0MCkgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IGVudmlyb25tZW50CitDQUxMIHNjcmlwdHNcY2xfc2V0Y29tcGlsZXIuYmF0IHx8IEVYSVQgL0IKKworOjogU2V0IEFSQ0ggdG8gZWl0aGVyIHdpbjMyIG9yIHg2NCBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQKK0NBTEwgc2NyaXB0c1xjbF9zZXRhcmNoLmJhdCB8fCBFWElUIC9CCisKKzo6IFNldCBHRU5FUkFUT1IgZm9yIENNYWtlIGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCBlbnZpcm9ubWVudAorQ0FMTCBzY3JpcHRzXGNsX3NldGdlbmVyYXRvci5iYXQgfHwgRVhJVCAvQgorCitJRiBOT1QgREVGSU5FRCBCVUlMRFRZUEUgKAorICBTRVQgQlVJTERUWVBFPVJlbGVhc2UKKykKKworICBTRVQgQlVJTERESVI9JX5kcDBidWlsZFwlUEFDS0FHRV9OQU1FJS1jb21waWxlclwlUEFDS0FHRV9WRVJTSU9OJVwlQ09NUElMRVIlXAorICBTRVQgT1VURElSPSV+ZHAwZGlzdFwlUEFDS0FHRV9OQU1FJS1jb21waWxlci0lUEFDS0FHRV9WRVJTSU9OJVwlQ09NUElMRVIlXCVBUkNIJVwlQlVJTERUWVBFJVwKKyAgU0VUIEJPT1NUX0xJQkRJUj1saWIlQVJDSDp+LTIsMiUtbXN2Yy0lQ09NUElMRVI6fi0zLDIlLjAKKyAgSUYgIiVCVUlMRFRZUEUlIiA9PSAiRGVidWciIChTRVQgWkxJQl9TVEFUSUNfU1VGRklYPWQpCisKKyAgRUNITy8KKyAgRUNITyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEVDSE8gICAgIENvbmZpZ3VyYXRpb246ICVQQUNLQUdFX05BTUUlICVQQUNLQUdFX1ZFUlNJT04lICVDT01QSUxFUiU6JUFSQ0glOiVCVUlMRFRZUEUlICIlR0VORVJBVE9SJSIKK0lGIERFRklORUQgQ09NUElMRVJPTkxZICgKKyAgRUNITyAgICAgICAgICAgICAgICAgICAgQ09NUElMRVIgT05MWQorKQorICBFQ0hPICAgQnVpbGQgRGlyZWN0b3J5OiAlQlVJTERESVIlCisgIEVDSE8gSW5zdGFsbCBEaXJlY3Rvcnk6ICVPVVRESVIlCisgIEVDSE8gIFNvdXJjZSBEaXJlY3Rvcnk6ICVTT1VSQ0VESVIlCisgIEVDSE8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBFQ0hPLworCisgIE1LRElSICIlQlVJTERESVIlIgorICBDRCAiJUJVSUxERElSJSIgfHwgRVhJVCAvQgorCisgIENNQUtFLkVYRSAlfmRwMHRocmlmdCBeCisgICAgLUciJUdFTkVSQVRPUiUiIF4KKyAgICAtREJJU09OX0VYRUNVVEFCTEU9JVdJTjNQX1JPT1QlXGRpc3Rcd2luZmxleGJpc29uXHdpbl9iaXNvbi5leGUgXgorICAgIC1EQ01BS0VfQlVJTERfVFlQRT0lQlVJTERUWVBFJSBeCisgICAgLURGTEVYX0VYRUNVVEFCTEU9JVdJTjNQX1JPT1QlXGRpc3Rcd2luZmxleGJpc29uXHdpbl9mbGV4LmV4ZSBeCisgICAgLURXSVRIX01UPU9OIF4KKyAgICAtRFdJVEhfU0hBUkVEX0xJQj1PRkYgfHwgRVhJVCAvQgorCisgIENEICVCVUlMRERJUiUKKworICBDTUFLRS5FWEUgLS1idWlsZCAuIC0tY29uZmlnICVCVUlMRFRZUEUlIC0tdGFyZ2V0IHRocmlmdC1jb21waWxlciB8fCBFWElUIC9CCisgIFhDT1BZIC9GIC9ZICVCVUlMRERJUiVcYmluXCVCVUlMRFRZUEUlXHRocmlmdC5leGUgJU9VVERJUiUKKworRU5ETE9DQUwKK0VYSVQgL0IKZGlmZiAtLWdpdCBhL2J1aWxkL3dpbmNwcC9idWlsZC10aHJpZnQuYmF0IGIvYnVpbGQvd2luY3BwL2J1aWxkLXRocmlmdC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg2N2FjZgotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL3dpbmNwcC9idWlsZC10aHJpZnQuYmF0CkBAIC0wLDAgKzEsMTYzIEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6IAorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjogCis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6IAorCis6OgorOjogR2VuZXJhdGVzIGEgVmlzdWFsIFN0dWRpbyBzb2x1dGlvbiBmb3IgdGhyaWZ0IGFuZCB0aGVuIGJ1aWxkcyBpdC4KKzo6IEFzc3VtZXMgdGhpcmQgcGFydHkgbGlicmFyaWVzIGhhdmUgYmVlbiBidWlsdCBvciBwbGFjZWQgYWxyZWFkeS4KKzo6Cis6OiBPcGVuIGEgVmlzdWFsIFN0dWRpbyBDb21tYW5kIFByb21wdCBvZiB5b3VyIGNob29zaW5nIGFuZCB0aGVuCis6OiBydW4gdGhpcyBzY3JpcHQuICAKKzo6Cis6OiBOb3JtYWxseSB0aGUgc2NyaXB0IHdpbGwgcnVuIGNtYWtlIHRvIGdlbmVyYXRlIGEgc29sdXRpb24sIHRoZW4KKzo6IHBlcmZvcm0gYSBidWlsZCwgdGhlbiBydW4gdGVzdHMgb24gdGhlIGNvbXBsZXRlIHRocmlmdCBsaWJyYXJ5Cis6OiBpbiByZWxlYXNlIG1vZGUuCis6OgorOjogRmxhZ3MgeW91IGNhbiB1c2UgdG8gY2hhbmdlIHRoaXMgYmVoYXZpb3I6Cis6OgorOjogICAvREVCVUcgICAgICAgICAgICAtIGRlYnVnIGluc3RlYWQgb2YgcmVsZWFzZQorOjogICAvSURFICAgICAgICAgICAgICAtIGxhdW5jaCBWaXN1YWwgU3R1ZGlvIHdpdGggYSBwYXRoIHNldAorOjogICAgICAgICAgICAgICAgICAgICAgIHVwIGNvcnJlY3RseSB0byBydW4gdGVzdHMgaW5zdGVhZCBvZgorOjogICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1pbmcgYW55IG90aGVyIGFjdGlvbnMsIGkuZS4KKzo6ICAgICAgICAgICAgICAgICAgICAgICBpbXBsaWVzIHNldHRpbmcgdGhlIG5leHQgdGhyZWUgZmxhZ3MKKzo6ICAgL05PR0VORVJBVEUgICAgICAgLSBza2lwIGNtYWtlIGdlbmVyYXRpb24gLSB1c2VmdWwgaWYgeW91Cis6OiAgICAgICAgICAgICAgICAgICAgICAgaGF2ZSBhbHJlYWR5IGdlbmVyYXRlZCBhIHNvbHV0aW9uIGFuZCBqdXN0Cis6OiAgICAgICAgICAgICAgICAgICAgICAgd2FudCB0byBidWlsZAorOjogICAvTk9CVUlMRCAgICAgICAgICAtIHNraXAgY21ha2UgYnVpbGQgLSB1c2VmdWwgaWYgeW91IGp1c3QKKzo6ICAgICAgICAgICAgICAgICAgICAgICB3YW50IHRvIGdlbmVyYXRlIGEgc29sdXRpb24KKzo6ICAgL05PVEVTVCAgICAgICAgICAgLSBza2lwIGN0ZXN0IGV4ZWN1dGlvbgorOjoKKworQEVDSE8gT0ZGCitTRVRMT0NBTCBFbmFibGVEZWxheWVkRXhwYW5zaW9uCisKKzo6IFNldHMgdmFyaWFibGVzIGZvciB0aGlyZCBwYXJ0eSB2ZXJzaW9ucyB1c2VkIGluIGJ1aWxkCitDQUxMIHNjcmlwdHNcdHB2ZXJzaW9ucy5iYXQgfHwgRVhJVCAvQgorCitJRiBOT1QgREVGSU5FRCBQQUNLQUdFX05BTUUgICAgU0VUIFBBQ0tBR0VfTkFNRT10aHJpZnQKK0lGIE5PVCBERUZJTkVEIFBBQ0tBR0VfVkVSU0lPTiBTRVQgUEFDS0FHRV9WRVJTSU9OPWRldgorSUYgTk9UIERFRklORUQgU09VUkNFX0RJUiAgICAgIFNFVCBTT1VSQ0VESVI9JX5kcDAlUEFDS0FHRV9OQU1FJQorSUYgTk9UIERFRklORUQgV0lOM1BfUk9PVCAgICAgIFNFVCBXSU4zUF9ST09UPSV+ZHAwdGhpcmRwYXJ0eQorCis6OiBTZXQgQ09NUElMRVIgdG8gKHZjMTAwIC0gdmMxNDApIGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCBlbnZpcm9ubWVudAorQ0FMTCBzY3JpcHRzXGNsX3NldGNvbXBpbGVyLmJhdCB8fCBFWElUIC9CCisKKzo6IFNldCBBUkNIIHRvIGVpdGhlciB3aW4zMiBvciB4NjQgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IGVudmlyb25tZW50CitDQUxMIHNjcmlwdHNcY2xfc2V0YXJjaC5iYXQgfHwgRVhJVCAvQgorCis6OiBTZXQgR0VORVJBVE9SIGZvciBDTWFrZSBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQKK0NBTEwgc2NyaXB0c1xjbF9zZXRnZW5lcmF0b3IuYmF0IHx8IEVYSVQgL0IKKworOjogRGVmYXVsdHMKKworSUYgTk9UIERFRklORUQgQlVJTERUWVBFIFNFVCBCVUlMRFRZUEU9UmVsZWFzZQorU0VUIE9QVF9JREU9MAorU0VUIE9QVF9CVUlMRD0xCitTRVQgT1BUX0dFTkVSQVRFPTEKK1NFVCBPUFRfVEVTVD0xCisKKzo6IEFwcGx5IEZsYWdzCisKK0lGIC9JICIlMSIgPT0gIi9ERUJVRyIgICAgICAgIFNFVCBCVUlMRFRZUEU9RGVidWcKK0lGIC9JICIlMiIgPT0gIi9ERUJVRyIgICAgICAgIFNFVCBCVUlMRFRZUEU9RGVidWcKK0lGIC9JICIlMyIgPT0gIi9ERUJVRyIgICAgICAgIFNFVCBCVUlMRFRZUEU9RGVidWcKK0lGIC9JICIlMSIgPT0gIi9JREUiICAgICAgICAgIFNFVCBPUFRfSURFPTEKK0lGIC9JICIlMiIgPT0gIi9JREUiICAgICAgICAgIFNFVCBPUFRfSURFPTEKK0lGIC9JICIlMyIgPT0gIi9JREUiICAgICAgICAgIFNFVCBPUFRfSURFPTEKK0lGIC9JICIlMSIgPT0gIi9OT0JVSUxEIiAgICAgIFNFVCBPUFRfQlVJTEQ9MAorSUYgL0kgIiUyIiA9PSAiL05PQlVJTEQiICAgICAgU0VUIE9QVF9CVUlMRD0wCitJRiAvSSAiJTMiID09ICIvTk9CVUlMRCIgICAgICBTRVQgT1BUX0JVSUxEPTAKK0lGIC9JICIlMSIgPT0gIi9OT0dFTkVSQVRFIiAgIFNFVCBPUFRfR0VORVJBVEU9MAorSUYgL0kgIiUyIiA9PSAiL05PR0VORVJBVEUiICAgU0VUIE9QVF9HRU5FUkFURT0wCitJRiAvSSAiJTMiID09ICIvTk9HRU5FUkFURSIgICBTRVQgT1BUX0dFTkVSQVRFPTAKK0lGIC9JICIlMSIgPT0gIi9OT1RFU1QiICAgICAgIFNFVCBPUFRfVEVTVD0wCitJRiAvSSAiJTIiID09ICIvTk9URVNUIiAgICAgICBTRVQgT1BUX1RFU1Q9MAorSUYgL0kgIiUzIiA9PSAiL05PVEVTVCIgICAgICAgU0VUIE9QVF9URVNUPTAKKworSUYgJU9QVF9JREUlID09IDEgKAorICBTRVQgT1BUX0dFTkVSQVRFPTAKKyAgU0VUIE9QVF9CVUlMRD0wCisgIFNFVCBPUFRfVEVTVD0wCispCisKKyAgU0VUIEJVSUxERElSPSV+ZHAwYnVpbGRcJVBBQ0tBR0VfTkFNRSVcJVBBQ0tBR0VfVkVSU0lPTiVcJUNPTVBJTEVSJVwlQVJDSCVcCisgIFNFVCBPVVRESVI9JX5kcDBkaXN0XCVQQUNLQUdFX05BTUUlLSVQQUNLQUdFX1ZFUlNJT04lXCVDT01QSUxFUiVcJUFSQ0glXCVCVUlMRFRZUEUlXAorICBTRVQgQk9PU1RfTElCRElSPWxpYiVBUkNIOn4tMiwyJS1tc3ZjLSVDT01QSUxFUjp+LTMsMiUuMAorICBJRiAiJUJVSUxEVFlQRSUiID09ICJEZWJ1ZyIgKFNFVCBaTElCX1NUQVRJQ19TVUZGSVg9ZCkKKworICBFQ0hPLworICBFQ0hPID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRUNITyAgICAgQ29uZmlndXJhdGlvbjogJVBBQ0tBR0VfTkFNRSUgJVBBQ0tBR0VfVkVSU0lPTiUgJUNPTVBJTEVSJTolQVJDSCU6JUJVSUxEVFlQRSUgIiVHRU5FUkFUT1IlIgorSUYgREVGSU5FRCBDT01QSUxFUk9OTFkgKAorICBFQ0hPICAgICAgICAgICAgICAgICAgICBDT01QSUxFUiBPTkxZCispCisgIEVDSE8gICBCdWlsZCBEaXJlY3Rvcnk6ICVCVUlMRERJUiUKKyAgRUNITyBJbnN0YWxsIERpcmVjdG9yeTogJU9VVERJUiUKKyAgRUNITyAgU291cmNlIERpcmVjdG9yeTogJVNPVVJDRURJUiUKKyAgRUNITyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEVDSE8vCisKK0lGICVPUFRfSURFJSA9PSAxICgKKworICBDQUxMIDpTRVRSVU5QQVRIIHx8IEVYSVQgL0IKKyAgQ0FMTCBERVZFTlYgIiFCVUlMRERJUiFBcGFjaGUgVGhyaWZ0LnNsbiIgfHwgRVhJVCAvQgorICBFWElUIC9CCisgIAorKQorCisgIE1LRElSICIlQlVJTERESVIlIgorICBDRCAiJUJVSUxERElSJSIgfHwgRVhJVCAvQgorCitJRiAlT1BUX0dFTkVSQVRFJSA9PSAxICgKKworICBDTUFLRS5FWEUgJX5kcDB0aHJpZnQgXgorICAgIC1HIiVHRU5FUkFUT1IlIiBeCisgICAgLURCSVNPTl9FWEVDVVRBQkxFPSVXSU4zUF9ST09UJVxkaXN0XHdpbmZsZXhiaXNvblx3aW5fYmlzb24uZXhlIF4KKyAgICAtREJPT1NUX1JPT1Q9JVdJTjNQX1JPT1QlXGRpc3RcYm9vc3RfJVRQX0JPT1NUX1ZFUlNJT04lIF4KKyAgICAtREJPT1NUX0xJQlJBUllESVI9JVdJTjNQX1JPT1QlXGRpc3RcYm9vc3RfJVRQX0JPT1NUX1ZFUlNJT04lXCVCT09TVF9MSUJESVIlIF4KKyAgICAtRENNQUtFX0lOU1RBTExfUFJFRklYPSVPVVRESVIlIF4KKyAgICAtRENNQUtFX0JVSUxEX1RZUEU9JUJVSUxEVFlQRSUgXgorICAgIC1ERkxFWF9FWEVDVVRBQkxFPSVXSU4zUF9ST09UJVxkaXN0XHdpbmZsZXhiaXNvblx3aW5fZmxleC5leGUgXgorICAgIC1ESU5UVFlQRVNfUk9PVD0lV0lOM1BfUk9PVCVcZGlzdFxtc2ludHR5cGVzIF4KKyAgICAtRExJQkVWRU5UX1JPT1Q9JVdJTjNQX1JPT1QlXGRpc3RcbGliZXZlbnQtJVRQX0xJQkVWRU5UX1ZFUlNJT04lXCVDT01QSUxFUiVcJUFSQ0glXCVCVUlMRFRZUEUlIF4KKyAgICAtRE9QRU5TU0xfUk9PVF9ESVI9JVdJTjNQX1JPT1QlXGRpc3Rcb3BlbnNzbC0lVFBfT1BFTlNTTF9WRVJTSU9OJVwlQ09NUElMRVIlXCVBUkNIJVwlQlVJTERUWVBFJVxkeW5hbWljIF4KKyAgICAtRE9QRU5TU0xfVVNFX1NUQVRJQ19MSUJTPU9GRiBeCisgICAgLURaTElCX0xJQlJBUlk9JVdJTjNQX1JPT1QlXGRpc3RcemxpYi0lVFBfWkxJQl9WRVJTSU9OJVwlQ09NUElMRVIlXCVBUkNIJVxsaWJcemxpYiVaTElCX0xJQl9TVUZGSVglLmxpYiBeCisgICAgLURaTElCX1JPT1Q9JVdJTjNQX1JPT1QlXGRpc3RcemxpYi0lVFBfWkxJQl9WRVJTSU9OJVwlQ09NUElMRVIlXCVBUkNIJSBeCisgICAgLURXSVRIX1NIQVJFRF9MSUI9T0ZGIF4KKyAgICAtRFdJVEhfU1RBVElDX0xJQj1PTiB8fCBFWElUIC9CCisKKykKKworSUYgJU9QVF9CVUlMRCUgPT0gMSAoCisKKyAgQ0QgJUJVSUxERElSJQorICBDTUFLRS5FWEUgLS1idWlsZCAuIC0tY29uZmlnICVCVUlMRFRZUEUlIC0tdGFyZ2V0IElOU1RBTEwgfHwgRVhJVCAvQgorCispCisKK0lGICVPUFRfVEVTVCUgPT0gMSAoCisKKyAgQ0FMTCA6U0VUUlVOUEFUSCB8fCBFWElUIC9CCisgIENNQUtFLkVYRSAtLWJ1aWxkIC4gLS1jb25maWcgJUJVSUxEVFlQRSUgLS10YXJnZXQgUlVOX1RFU1RTIHx8IEVYSVQgL0IKKyAgCispCisKKzpTRVRSVU5QQVRICisgIFNFVCBQQVRIPSFQQVRIITslV0lOM1BfUk9PVCVcZGlzdFxib29zdF8lVFBfQk9PU1RfVkVSU0lPTiVcJUJPT1NUX0xJQkRJUiUKKyAgU0VUIFBBVEg9IVBBVEghOyVXSU4zUF9ST09UJVxkaXN0XG9wZW5zc2wtJVRQX09QRU5TU0xfVkVSU0lPTiVcJUNPTVBJTEVSJVwlQVJDSCVcJUJVSUxEVFlQRSVcZHluYW1pY1xiaW4KKyAgU0VUIFBBVEg9IVBBVEghOyVXSU4zUF9ST09UJVxkaXN0XHpsaWItJVRQX1pMSUJfVkVSU0lPTiVcJUNPTVBJTEVSJVwlQVJDSCVcYmluCisgIEVYSVQgL0IKKworRU5ETE9DQUwKK0VYSVQgL0IKZGlmZiAtLWdpdCBhL2J1aWxkL3dpbmNwcC9zY3JpcHRzL2NsX3NldGFyY2guYmF0IGIvYnVpbGQvd2luY3BwL3NjcmlwdHMvY2xfc2V0YXJjaC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU3MGExZQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL3dpbmNwcC9zY3JpcHRzL2NsX3NldGFyY2guYmF0CkBAIC0wLDAgKzEsNDcgQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjogCis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OiAKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjogCisKKzo6Cis6OiBEZXRlY3QgdGhlIGFyY2hpdGVjdHVyZSB3ZSdyZSBidWlsZGluZyBmb3IuCis6OiBTZXQgdGhlIEFSQ0ggZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gb25lIG9mOgorOjogICB3aW4zMgorOjogICB4NjQKKzo6Cis6OiBIb25vcnMgYW55IGV4aXN0aW5nIEFSQ0ggZW52aXJvbm1lbnQgdmFyaWFibGUKKzo6ICAgc2V0dGluZyBpbnN0ZWFkIG9mIG92ZXJ3cml0aW5nIGl0LCB0byBhbGxvdyBpdAorOjogICB0byBiZSBmb3JjZWQgaWYgbmVlZGVkLgorOjoKKzo6IFNldHMgRVJST1JMRVZFTCB0byAwIGlmIEFSQ0ggY2FuIGJlIGRldGVybWluZWQsCis6OiAgICAgICAgICAgICAgICAgdG8gMSBpZiBpdCBjYW5ub3QuCis6OgorCitJRiBERUZJTkVEIEFSQ0ggKAorICBFQ0hPIFt3YXJuIF0gdXNpbmcgZXhpc3RpbmcgZW52aXJvbm1lbnQgdmFyaWFibGUgQVJDSAorICBFWElUIC9CIDAKKykKKworQ0FMTCA6Q0hFQ0sgeDY0CitJRiAlRVJST1JMRVZFTCUgPT0gMCAoU0VUIEFSQ0g9eDY0KSBFTFNFIChTRVQgQVJDSD13aW4zMikKKworSUYgTk9UIERFRklORUQgQVJDSCAoCisgIEVDSE8gW2Vycm9yXSB1bmFibGUgdG8gZGV0ZXJtaW5lIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlCisgIEVYSVQgL0IgMQorKQorCitFQ0hPIFtpbmZvIF0gZGV0ZWN0ZWQgdGFyZ2V0IGFyY2hpdGVjdHVyZSAlQVJDSCUKK0VYSVQgL0IgMAorCis6Q0hFQ0sKK2NsIC8/IDI+JjEgfCBmaW5kc3RyIC9DOiIgZm9yICUxJSIgPiBudWwKK0VYSVQgL0IgJUVSUk9STEVWRUwlCmRpZmYgLS1naXQgYS9idWlsZC93aW5jcHAvc2NyaXB0cy9jbF9zZXRjb21waWxlci5iYXQgYi9idWlsZC93aW5jcHAvc2NyaXB0cy9jbF9zZXRjb21waWxlci5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQwNWQ3NgotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL3dpbmNwcC9zY3JpcHRzL2NsX3NldGNvbXBpbGVyLmJhdApAQCAtMCwwICsxLDU4IEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6IAorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjogCis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6IAorCis6OgorOjogRGV0ZWN0IHRoZSBjb21waWxlciBlZGl0aW9uIHdlJ3JlIGJ1aWxkaW5nIGluLgorOjogU2V0IHRoZSBDT01QSUxFUiBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBvbmUgb2Y6Cis6OiAgIHZjMTAwID0gVmlzdWFsIFN0dWRpbyAyMDEwCis6OiAgIHZjMTEwID0gVmlzdWFsIFN0dWRpbyAyMDEyCis6OiAgIHZjMTIwID0gVmlzdWFsIFN0dWRpbyAyMDEzCis6OiAgIHZjMTQwID0gVmlzdWFsIFN0dWRpbyAyMDE1Cis6OiAgIHZjMTUwID0gVmlzdWFsIFN0dWRpbyAyMDE3Cis6OgorOjogSG9ub3JzIGFueSBleGlzdGluZyBDT01QSUxFUiBlbnZpcm9ubWVudCB2YXJpYWJsZQorOjogICBzZXR0aW5nIGluc3RlYWQgb2Ygb3ZlcndyaXRpbmcgaXQsIHRvIGFsbG93IGl0Cis6OiAgIHRvIGJlIGZvcmNlZCBpZiBuZWVkZWQuCis6OgorOjogU2V0cyBFUlJPUkxFVkVMIHRvIDAgaWYgQ09NUElMRVIgY2FuIGJlIGRldGVybWluZWQsCis6OiAgICAgICAgICAgICAgICAgdG8gMSBpZiBpdCBjYW5ub3QuCis6OgorCitJRiBERUZJTkVEIENPTVBJTEVSICgKKyAgRUNITyBbd2FybiBdIHVzaW5nIGV4aXN0aW5nIGVudmlyb25tZW50IHZhcmlhYmxlIENPTVBJTEVSCisgIEVYSVQgL0IgMAorKQorCitDQUxMIDpDSEVDSyAxNgorSUYgJUVSUk9STEVWRUwlID09IDAgKElGIE5PVCBERUZJTkVEIENPTVBJTEVSIFNFVCBDT01QSUxFUj12YzEwMCkKK0NBTEwgOkNIRUNLIDE3CitJRiAlRVJST1JMRVZFTCUgPT0gMCAoSUYgTk9UIERFRklORUQgQ09NUElMRVIgU0VUIENPTVBJTEVSPXZjMTEwKQorQ0FMTCA6Q0hFQ0sgMTgKK0lGICVFUlJPUkxFVkVMJSA9PSAwIChJRiBOT1QgREVGSU5FRCBDT01QSUxFUiBTRVQgQ09NUElMRVI9dmMxMjApCitDQUxMIDpDSEVDSyAxOS4wMAorSUYgJUVSUk9STEVWRUwlID09IDAgKElGIE5PVCBERUZJTkVEIENPTVBJTEVSIFNFVCBDT01QSUxFUj12YzE0MCkKK0NBTEwgOkNIRUNLIDE5LjEwCitJRiAlRVJST1JMRVZFTCUgPT0gMCAoSUYgTk9UIERFRklORUQgQ09NUElMRVIgU0VUIENPTVBJTEVSPXZjMTUwKQorCitJRiBOT1QgREVGSU5FRCBDT01QSUxFUiAoCisgIEVDSE8gW2Vycm9yXSB1bmFibGUgdG8gZGV0ZXJtaW5lIHRoZSBjb21waWxlciBlZGl0aW9uCisgIEVYSVQgL0IgMQorKQorCitFQ0hPIFtpbmZvIF0gZGV0ZWN0ZWQgY29tcGlsZXIgZWRpdGlvbiAgICAlQ09NUElMRVIlCitFWElUIC9CIDAKKworOkNIRUNLCitjbCAvPyAyPiYxIHwgZmluZHN0ciAvQzoiVmVyc2lvbiAlMSUuIiA+IG51bAorRVhJVCAvQiAlRVJST1JMRVZFTCUKZGlmZiAtLWdpdCBhL2J1aWxkL3dpbmNwcC9zY3JpcHRzL2NsX3NldGdlbmVyYXRvci5iYXQgYi9idWlsZC93aW5jcHAvc2NyaXB0cy9jbF9zZXRnZW5lcmF0b3IuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhZTI3NDIKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC93aW5jcHAvc2NyaXB0cy9jbF9zZXRnZW5lcmF0b3IuYmF0CkBAIC0wLDAgKzEsNjkgQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjogCis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OiAKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjogCisKKzo6Cis6OiBEZXRlY3QgdGhlIGNvbXBpbGVyIGVkaXRpb24gd2UncmUgYnVpbGRpbmcgaW4gYW5kIHRoZW4gCis6OiBzZXQgdGhlIEdFTkVSQVRPUiBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBvbmUgb2Y6Cis6OgorOjogIFZpc3VhbCBTdHVkaW8gMTUgMjAxNyBbYXJjaF0gPSBHZW5lcmF0ZXMgVmlzdWFsIFN0dWRpbyAyMDE3IHByb2plY3QgZmlsZXMuCis6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsIFthcmNoXSBjYW4gYmUgIldpbjY0IiBvciAiQVJNIi4KKzo6ICBWaXN1YWwgU3R1ZGlvIDE0IDIwMTUgW2FyY2hdID0gR2VuZXJhdGVzIFZpc3VhbCBTdHVkaW8gMjAxNSBwcm9qZWN0IGZpbGVzLgorOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbCBbYXJjaF0gY2FuIGJlICJXaW42NCIgb3IgIkFSTSIuCis6OiAgVmlzdWFsIFN0dWRpbyAxMiAyMDEzIFthcmNoXSA9IEdlbmVyYXRlcyBWaXN1YWwgU3R1ZGlvIDIwMTMgcHJvamVjdCBmaWxlcy4KKzo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWwgW2FyY2hdIGNhbiBiZSAiV2luNjQiIG9yICJBUk0iLgorOjogIFZpc3VhbCBTdHVkaW8gMTEgMjAxMiBbYXJjaF0gPSBHZW5lcmF0ZXMgVmlzdWFsIFN0dWRpbyAyMDEyIHByb2plY3QgZmlsZXMuCis6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsIFthcmNoXSBjYW4gYmUgIldpbjY0IiBvciAiQVJNIi4KKzo6ICBWaXN1YWwgU3R1ZGlvIDEwIDIwMTAgW2FyY2hdID0gR2VuZXJhdGVzIFZpc3VhbCBTdHVkaW8gMjAxMCBwcm9qZWN0IGZpbGVzLgorOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbCBbYXJjaF0gY2FuIGJlICJXaW42NCIgb3IgIklBNjQiLgorOjoKKzo6IEhvbm9ycyBhbnkgZXhpc3RpbmcgR0VORVJBVE9SIGVudmlyb25tZW50IHZhcmlhYmxlCis6OiAgIHNldHRpbmcgaW5zdGVhZCBvZiBvdmVyd3JpdGluZyBpdCwgdG8gYWxsb3cgaXQKKzo6ICAgdG8gYmUgZm9yY2VkIGlmIG5lZWRlZC4KKzo6Cis6OiBTZXRzIEVSUk9STEVWRUwgdG8gMCBpZiBHRU5FUkFUT1IgY2FuIGJlIGRldGVybWluZWQsCis6OiAgICAgICAgICAgICAgICAgdG8gMSBpZiBpdCBjYW5ub3QuCis6OgorOjogUmVxdWlyZXMgY2xfc2V0YXJjaC5iYXQgdG8gaGF2ZSBiZWVuIGV4ZWN1dGVkIG9yIHRoZSBBUkNIIGVudmlyb25tZW50Cis6OiB2YXJpYWJsZSB0byBiZSBzZXQuCis6OgorCitJRiAiJUFSQ0glIiA9PSAieDY0IiAoU0VUIEdFTkFSQ0g9IFdpbjY0KQorCitJRiBERUZJTkVEIEdFTkVSQVRPUiAoCisgIEVDSE8gW3dhcm4gXSB1c2luZyBleGlzdGluZyBlbnZpcm9ubWVudCB2YXJpYWJsZSBHRU5FUkFUT1IKKyAgRVhJVCAvQiAwCispCisKK0NBTEwgOkNIRUNLIDE2CitJRiAlRVJST1JMRVZFTCUgPT0gMCAoSUYgTk9UIERFRklORUQgR0VORVJBVE9SIFNFVCBHRU5FUkFUT1I9VmlzdWFsIFN0dWRpbyAxMCAyMDEwJUdFTkFSQ0glKQorQ0FMTCA6Q0hFQ0sgMTcKK0lGICVFUlJPUkxFVkVMJSA9PSAwIChJRiBOT1QgREVGSU5FRCBHRU5FUkFUT1IgU0VUIEdFTkVSQVRPUj1WaXN1YWwgU3R1ZGlvIDExIDIwMTIlR0VOQVJDSCUpCitDQUxMIDpDSEVDSyAxOAorSUYgJUVSUk9STEVWRUwlID09IDAgKElGIE5PVCBERUZJTkVEIEdFTkVSQVRPUiBTRVQgR0VORVJBVE9SPVZpc3VhbCBTdHVkaW8gMTIgMjAxMyVHRU5BUkNIJSkKK0NBTEwgOkNIRUNLIDE5LjAwCitJRiAlRVJST1JMRVZFTCUgPT0gMCAoSUYgTk9UIERFRklORUQgR0VORVJBVE9SIFNFVCBHRU5FUkFUT1I9VmlzdWFsIFN0dWRpbyAxNCAyMDE1JUdFTkFSQ0glKQorQ0FMTCA6Q0hFQ0sgMTkuMTAKK0lGICVFUlJPUkxFVkVMJSA9PSAwIChJRiBOT1QgREVGSU5FRCBHRU5FUkFUT1IgU0VUIEdFTkVSQVRPUj1WaXN1YWwgU3R1ZGlvIDE1IDIwMTclR0VOQVJDSCUpCisKK0lGIE5PVCBERUZJTkVEIEdFTkVSQVRPUiAoCisgIEVDSE8gW2Vycm9yXSB1bmFibGUgdG8gZGV0ZXJtaW5lIHRoZSBDTWFrZSBnZW5lcmF0b3IgdG8gdXNlCisgIEVYSVQgL0IgMQorKQorCitFQ0hPIFtpbmZvIF0gdXNpbmcgQ01ha2UgZ2VuZXJhdG9yICAgICAgICAlR0VORVJBVE9SJQorRVhJVCAvQiAwCisKKzpDSEVDSworY2wgLz8gMj4mMSB8IGZpbmRzdHIgL0M6IlZlcnNpb24gJTElLiIgPiBudWwKK0VYSVQgL0IgJUVSUk9STEVWRUwlCmRpZmYgLS1naXQgYS9idWlsZC93aW5jcHAvc2NyaXB0cy90cHZlcnNpb25zLmJhdCBiL2J1aWxkL3dpbmNwcC9zY3JpcHRzL3RwdmVyc2lvbnMuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4MGM4NjgKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC93aW5jcHAvc2NyaXB0cy90cHZlcnNpb25zLmJhdApAQCAtMCwwICsxLDI0IEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6IAorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjogCis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6IAorCis6OgorOjogU2V0IHRoZSB2ZXJzaW9ucyBvZiB0aGlyZCBwYXJ0eSBsaWJyYXJpZXMgdG8gdXNlLgorOjoKKworSUYgTk9UIERFRklORUQgVFBfQk9PU1RfVkVSU0lPTiAgICBTRVQgVFBfQk9PU1RfVkVSU0lPTj0xXzYyXzAKK0lGIE5PVCBERUZJTkVEIFRQX0xJQkVWRU5UX1ZFUlNJT04gU0VUIFRQX0xJQkVWRU5UX1ZFUlNJT049Mi4xLjdyYzIKK0lGIE5PVCBERUZJTkVEIFRQX09QRU5TU0xfVkVSU0lPTiAgU0VUIFRQX09QRU5TU0xfVkVSU0lPTj0xLjEuMGMKK0lGIE5PVCBERUZJTkVEIFRQX1pMSUJfVkVSU0lPTiAgICAgU0VUIFRQX1pMSUJfVkVSU0lPTj0xLjIuOQorCitFWElUIC9CIDAKZGlmZiAtLWdpdCBhL2J1aWxkL3dpbmNwcC90aGlyZHBhcnR5L3NyYy9idWlsZC1saWJldmVudC5iYXQgYi9idWlsZC93aW5jcHAvdGhpcmRwYXJ0eS9zcmMvYnVpbGQtbGliZXZlbnQuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhZjUwNWMKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC93aW5jcHAvdGhpcmRwYXJ0eS9zcmMvYnVpbGQtbGliZXZlbnQuYmF0CkBAIC0wLDAgKzEsODYgQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjogCis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OiAKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjogCisKKzo6Cis6OiBCdWlsZCBzY3JpcHQgZm9yIGxpYmV2ZW50IG9uIHdpbmRvd3MKKzo6IFVzZSBsaWJldmVudCBtYXN0ZXIgZnJvbSBnaXRodWIgd2hpY2ggaGFzIGNtYWtlIGludGVncmF0aW9uCis6OiBVc2VzIHRoZSBlbnZpcm9ubWVudCBzZXQgdXAgYnkgYSBWaXN1YWwgU3R1ZGlvIENvbW1hbmQgUHJvbXB0IHNob3J0Y3V0Cis6OiB0byB0YXJnZXQgYSBzcGVjaWZpYyBhcmNoaXRlY3R1cmUgYW5kIGNvbXBpbGVyCis6OgorOjogQ3JlYXRlcyBhIHN0YXRpYyBsaW5rIGxpYnJhcnkuCis6OiBMaW5rcyBhZ2FpbnN0IE9wZW5TU0wgYW5kIHpsaWIgc3RhdGljYWxseS4KKzo6CisKK0BFQ0hPIE9GRgorU0VUTE9DQUwgRW5hYmxlRGVsYXllZEV4cGFuc2lvbgorCis6OiBTZXRzIHZhcmlhYmxlcyBmb3IgdGhpcmQgcGFydHkgdmVyc2lvbnMgdXNlZCBpbiBidWlsZAorQ0FMTCAuLlwuLlxzY3JpcHRzXHRwdmVyc2lvbnMuYmF0IHx8IEVYSVQgL0IKKworOjogdXNlICJidWlsZC1saWJldmVudC5iYXQgL3llcyIgdG8gc2tpcCB0aGUgcXVlc3Rpb24gcGFydAorSUYgL0kgIiUxIiA9PSAiL1lFUyIgICAgICAgICAgIFNFVCBOT0FTSz0xCisKKzo6IFNldCBDT01QSUxFUiB0byAodmMxMDAgLSB2YzE0MCkgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IGVudmlyb25tZW50CitDQUxMIC4uXC4uXHNjcmlwdHNcY2xfc2V0Y29tcGlsZXIuYmF0IHx8IEVYSVQgL0IKKworOjogU2V0IEFSQ0ggdG8gZWl0aGVyIHdpbjMyIG9yIHg2NCBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQKK0NBTEwgLi5cLi5cc2NyaXB0c1xjbF9zZXRhcmNoLmJhdCB8fCBFWElUIC9CCisKK0lGIE5PVCBERUZJTkVEIEdFTkVSQVRPUiAgICAgICBTRVQgR0VORVJBVE9SPU5NYWtlIE1ha2VmaWxlcworSUYgTk9UIERFRklORUQgUEFDS0FHRV9OQU1FICAgIFNFVCBQQUNLQUdFX05BTUU9bGliZXZlbnQKK0lGIE5PVCBERUZJTkVEIFBBQ0tBR0VfVkVSU0lPTiBTRVQgUEFDS0FHRV9WRVJTSU9OPSVUUF9MSUJFVkVOVF9WRVJTSU9OJQorSUYgTk9UIERFRklORUQgU09VUkNFRElSICAgICAgIFNFVCBTT1VSQ0VESVI9JX5kcDAlUEFDS0FHRV9OQU1FJS0lUEFDS0FHRV9WRVJTSU9OJQorSUYgTk9UIERFRklORUQgV0lOM1BfUk9PVCAgICAgIFNFVCBXSU4zUF9ST09UPSV+ZHAwLi4KKworRk9SICUlWCBJTiAoCisgIERlYnVnIAorICBSZWxlYXNlCispIERPICgKKyAgU0VUIEJVSUxEVFlQRT0lJVgKKyAgU0VUIEJVSUxERElSPSVXSU4zUF9ST09UJVxidWlsZFwlUEFDS0FHRV9OQU1FJVwlUEFDS0FHRV9WRVJTSU9OJVwlQ09NUElMRVIlXCVBUkNIJVwhQlVJTERUWVBFIQorICBTRVQgT1VURElSPSVXSU4zUF9ST09UJVxkaXN0XCVQQUNLQUdFX05BTUUlLSVQQUNLQUdFX1ZFUlNJT04lXCVDT01QSUxFUiVcJUFSQ0glXCFCVUlMRFRZUEUhCisKKyAgSUYgIiFCVUlMRFRZUEUhIiA9PSAiRGVidWciIChTRVQgWkxJQl9MSUJfU1VGRklYPWQpCisKKyAgU0VUIENNQUtFX0RFRlM9XgorICAgLURFVkVOVF9fRElTQUJMRV9TQU1QTEVTPU9OIF4KKyAgIC1ERVZFTlRfX0RJU0FCTEVfVEVTVFM9T04gXgorICAgLURPUEVOU1NMX1VTRV9TVEFUSUNfTElCUz1PRkYgXgorICAgLURPUEVOU1NMX1JPT1RfRElSPSVXSU4zUF9ST09UJVxkaXN0XG9wZW5zc2wtJVRQX09QRU5TU0xfVkVSU0lPTiVcJUNPTVBJTEVSJVwlQVJDSCVcIUJVSUxEVFlQRSFcZHluYW1pYyBeCisgICAtRFpMSUJfTElCUkFSWT0lV0lOM1BfUk9PVCVcZGlzdFx6bGliLSVUUF9aTElCX1ZFUlNJT04lXCVDT01QSUxFUiVcJUFSQ0glXGxpYlx6bGliIVpMSUJfTElCX1NVRkZJWCEubGliIF4KKyAgIC1EWkxJQl9ST09UPSVXSU4zUF9ST09UJVxkaXN0XHpsaWItJVRQX1pMSUJfVkVSU0lPTiVcJUNPTVBJTEVSJVwlQVJDSCUKKworICBFQ0hPLworICBFQ0hPID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRUNITyAgICAgICAgICBCdWlsZGluZzogJVBBQ0tBR0VfTkFNRSUgdiVQQUNLQUdFX1ZFUlNJT04lICVDT01QSUxFUiU6JUFSQ0glOiFCVUlMRFRZUEUhICIlR0VORVJBVE9SJSIKKyAgRUNITyBDTWFrZSBEZWZpbml0aW9uczogIUNNQUtFX0RFRlMhCisgIEVDSE8gICBCdWlsZCBEaXJlY3Rvcnk6ICFCVUlMRERJUiEKKyAgRUNITyBJbnN0YWxsIERpcmVjdG9yeTogIU9VVERJUiEKKyAgRUNITyAgU291cmNlIERpcmVjdG9yeTogJVNPVVJDRURJUiUKKyAgRUNITyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEVDSE8vCisKKyAgSUYgTk9UIERFRklORUQgTk9BU0sgKAorICAgIENIT0lDRSAvTSAiRG8geW91IHdhbnQgdG8gYnVpbGQgdGhpcyBjb25maWd1cmF0aW9uPyAiIC9jIFlOCisgICAgSUYgIUVSUk9STEVWRUwhIE5FUSAxIChFWElUIC9CICFFUlJPUkxFVkVMISkKKyAgKQorICAKKyAgTUtESVIgIiFCVUlMRERJUiEiCisgIENEICIhQlVJTERESVIhIiB8fCBFWElUIC9CCisKKyAgQ01BS0UuRVhFIC1HIiVHRU5FUkFUT1IlIiAtRENNQUtFX0lOU1RBTExfUFJFRklYPSFPVVRESVIhIC1EQ01BS0VfQlVJTERfVFlQRT0hQlVJTERUWVBFISAhQ01BS0VfREVGUyEgIiVTT1VSQ0VESVIlIiB8fCBFWElUIC9CCisgIE5NQUtFIC9mTWFrZWZpbGUgaW5zdGFsbCB8fCBFWElUIC9CCispCisKK0VORExPQ0FMCmRpZmYgLS1naXQgYS9idWlsZC93aW5jcHAvdGhpcmRwYXJ0eS9zcmMvYnVpbGQtb3BlbnNzbC5iYXQgYi9idWlsZC93aW5jcHAvdGhpcmRwYXJ0eS9zcmMvYnVpbGQtb3BlbnNzbC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2YyNzBmMAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL3dpbmNwcC90aGlyZHBhcnR5L3NyYy9idWlsZC1vcGVuc3NsLmJhdApAQCAtMCwwICsxLDEwNiBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OiAKKzo6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzo6IAorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OiAKKworOjoKKzo6IEJ1aWxkIHNjcmlwdCBmb3Igb3BlbnNzbCBvbiB3aW5kb3dzCis6OiBvcGVuc3NsIHVzZXMgYW4gaW4tdHJlZSBidWlsZCBzbyB5b3UgaGF2ZSB0byBjbGVhbiBiZXR3ZWVuIGVhY2ggb25lCis6OgorOjogVXNlcyB0aGUgZW52aXJvbm1lbnQgc2V0IHVwIGJ5IGEgVmlzdWFsIFN0dWRpbyBDb21tYW5kIFByb21wdCBzaG9ydGN1dAorOjogdG8gdGFyZ2V0IGEgc3BlY2lmaWMgYXJjaGl0ZWN0dXJlIGFuZCBjb21waWxlcgorOjoKKzo6IElmIHlvdSB1c2UgTGF2YXNvZnQgQWQtQXdhcmUsIGRpc2FibGUgaXQgZm9yIHRoaXMgYnVpbGQuICBJdCBibG9ja3MgdGhlIGNyZWF0aW9uCis6OiBvZiBhbnkgZmlsZSBuYW1lZCAiY2xpZW50aGVsbG90ZXN0LmV4ZSIgZm9yIHdoYXRldmVyIHJlYXNvbiwgd2hpY2ggYnJlYWtzIHRoZSBidWlsZC4KKzo6CisKK0BFQ0hPIE9GRgorU0VUTE9DQUwgRW5hYmxlRGVsYXllZEV4cGFuc2lvbgorCis6OiBTZXRzIHZhcmlhYmxlcyBmb3IgdGhpcmQgcGFydHkgdmVyc2lvbnMgdXNlZCBpbiBidWlsZAorQ0FMTCAuLlwuLlxzY3JpcHRzXHRwdmVyc2lvbnMuYmF0IHx8IEVYSVQgL0IKKworOjogdXNlICJidWlsZC1vcGVuc3NsLmJhdCAveWVzIiB0byBza2lwIHRoZSBxdWVzdGlvbiBwYXJ0CitJRiAvSSAiJTEiID09ICIvWUVTIiAgICAgICAgICAgU0VUIE5PQVNLPTEKKworSUYgTk9UIERFRklORUQgUEFDS0FHRV9OQU1FICAgIFNFVCBQQUNLQUdFX05BTUU9b3BlbnNzbAorSUYgTk9UIERFRklORUQgUEFDS0FHRV9WRVJTSU9OIFNFVCBQQUNLQUdFX1ZFUlNJT049JVRQX09QRU5TU0xfVkVSU0lPTiUKK0lGIE5PVCBERUZJTkVEIFNPVVJDRURJUiAgICAgICBTRVQgU09VUkNFRElSPSV+ZHAwJVBBQ0tBR0VfTkFNRSUtJVBBQ0tBR0VfVkVSU0lPTiUKK0lGIE5PVCBERUZJTkVEIFdJTjNQX1JPT1QgICAgICBTRVQgV0lOM1BfUk9PVD0lfmRwMC4uCisKKzo6IFNldCBDT01QSUxFUiB0byAodmMxMDAgLSB2YzE0MCkgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IGVudmlyb25tZW50CitDQUxMIC4uXC4uXHNjcmlwdHNcY2xfc2V0Y29tcGlsZXIuYmF0IHx8IEVYSVQgL0IKKworOjogU2V0IEFSQ0ggdG8gZWl0aGVyIHdpbjMyIG9yIHg2NCBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQKK0NBTEwgLi5cLi5cc2NyaXB0c1xjbF9zZXRhcmNoLmJhdCB8fCBFWElUIC9CCisKK0lGICIlQVJDSCUiID09ICJ4NjQiICgKKyAgU0VUIFRPRE89ZGVidWctVkMtV0lONjRBIFZDLVdJTjY0QQorKSBFTFNFICgKKyAgU0VUIFRPRE89ZGVidWctVkMtV0lOMzIgVkMtV0lOMzIKKykKKworRk9SICUlWCBJTiAoICFUT0RPISApIERPICgKKyAgU0VUIEJVSUxEVFlQRT0lJVgKKyAgRk9SICUlWSBJTiAoCisgICAgbnQKKyAgICBudGRsbAorICApIERPICgKKyAgICBTRVQgTElCVFlQRT0lJVkKKworICAgIElGICIhQlVJTERUWVBFOn4wLDYhIiA9PSAiZGVidWctIiAoCisgICAgICBTRVQgT1VUQlVJTERUWVBFPWRlYnVnCisgICAgICBTRVQgWkxJQkxJQlNVRkZJWD1kCisgICAgKSBFTFNFICgKKyAgICAgIFNFVCBPVVRCVUlMRFRZUEU9cmVsZWFzZQorICAgICAgU0VUIFpMSUJMSUJTVUZGSVg9CisgICAgKQorCisgICAgSUYgIiFMSUJUWVBFISIgPT0gIm50ZGxsIiAoCisgICAgICBTRVQgQlVJTERfT1BUSU9OUz1zaGFyZWQKKyAgICAgIFNFVCBPVVRMSUJUWVBFPWR5bmFtaWMKKyAgICAgIFNFVCBaTElCTElCPXpsaWIhWkxJQkxJQlNVRkZJWCEKKyAgICAgIFNFVCBaTElCT1BUPXpsaWItZHluYW1pYworICAgICkgRUxTRSAoCisgICAgICBTRVQgQlVJTERfT1BUSU9OUz1uby1zaGFyZWQKKyAgICAgIFNFVCBPVVRMSUJUWVBFPXN0YXRpYworICAgICAgU0VUIFpMSUJMSUI9emxpYnN0YXRpYyFaTElCTElCU1VGRklYIS5saWIKKyAgICAgIFNFVCBaTElCT1BUPXpsaWIKKyAgICApCisKKyAgICBTRVQgTElCPSV+ZHAwLi5cZGlzdFx6bGliLSVUUF9aTElCX1ZFUlNJT04lXCFDT01QSUxFUiFcIUFSQ0ghXGxpYjshTElCIQorICAgIFNFVCBCVUlMRF9PUFRJT05TPSFCVUlMRF9PUFRJT05TISBuby1hc20gbm8tdW5pdC10ZXN0ICFaTElCT1BUISAtLW9wZW5zc2xkaXI9c3NsIC0td2l0aC16bGliLWluY2x1ZGU9JX5kcDAuLlxkaXN0XHpsaWItJVRQX1pMSUJfVkVSU0lPTiVcIUNPTVBJTEVSIVwhQVJDSCFcaW5jbHVkZSAtLXdpdGgtemxpYi1saWI9IVpMSUJMSUIhCisgICAgU0VUIE9VVERJUj0lV0lOM1BfUk9PVCVcZGlzdFwlUEFDS0FHRV9OQU1FJS0lUEFDS0FHRV9WRVJTSU9OJVwlQ09NUElMRVIlXCVBUkNIJVwhT1VUQlVJTERUWVBFIVwhT1VUTElCVFlQRSEKKworICAgIEVDSE8vCisgICAgRUNITyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRUNITyAgICAgICAgICBCdWlsZGluZzogJVBBQ0tBR0VfTkFNRSUgJVBBQ0tBR0VfVkVSU0lPTiUgJUNPTVBJTEVSJTolQVJDSCU6IU9VVEJVSUxEVFlQRSE6IU9VVExJQlRZUEUhIFshQlVJTERUWVBFIV0KKyAgICBFQ0hPIENvbmZpZ3VyZSBPcHRpb25zOiAhQlVJTERfT1BUSU9OUyEKKyAgICBFQ0hPIEluc3RhbGwgRGlyZWN0b3J5OiAhT1VURElSIQorICAgIEVDSE8gIFNvdXJjZSBEaXJlY3Rvcnk6ICVTT1VSQ0VESVIlCisgICAgRUNITyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRUNITy8KKworICAgIElGIE5PVCBERUZJTkVEIE5PQVNLICgKKyAgICAgIENIT0lDRSAvTSAiRG8geW91IHdhbnQgdG8gYnVpbGQgdGhpcyBjb25maWd1cmF0aW9uPyAiIC9jIFlOCisgICAgICBJRiAhRVJST1JMRVZFTCEgTkVRIDEgKEVYSVQgL0IgIUVSUk9STEVWRUwhKQorICAgICkKKworICAgIENEICVTT1VSQ0VESVIlIHx8IEVYSVQgL0IKKyAgICBwZXJsIENvbmZpZ3VyZSAhQlVJTERUWVBFISAtLXByZWZpeD0iIU9VVERJUiEiICFCVUlMRF9PUFRJT05TISB8fCBFWElUIC9CCisgICAgTk1BS0UgL0ZNYWtlZmlsZSBpbnN0YWxsX3N3IHx8IEVYSVQgL0IKKyAgICBOTUFLRSAvRk1ha2VmaWxlIGNsZWFuIHx8IEVYSVQgL0IKKyAgKQorKQorCitFTkRMT0NBTAorRVhJVCAvQgpkaWZmIC0tZ2l0IGEvYnVpbGQvd2luY3BwL3RoaXJkcGFydHkvc3JjL2J1aWxkLXpsaWIuYmF0IGIvYnVpbGQvd2luY3BwL3RoaXJkcGFydHkvc3JjL2J1aWxkLXpsaWIuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MjcyMzAKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC93aW5jcHAvdGhpcmRwYXJ0eS9zcmMvYnVpbGQtemxpYi5iYXQKQEAgLTAsMCArMSw3NSBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OiAKKzo6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzo6IAorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OiAKKworOjoKKzo6IEJ1aWxkIHNjcmlwdCBmb3IgemxpYiBvbiB3aW5kb3dzLgorOjogVXNlcyB0aGUgZW52aXJvbm1lbnQgc2V0IHVwIGJ5IGEgVmlzdWFsIFN0dWRpbyBDb21tYW5kIFByb21wdCBzaG9ydGN1dAorOjogdG8gdGFyZ2V0IGEgc3BlY2lmaWMgYXJjaGl0ZWN0dXJlIGFuZCBjb21waWxlci4KKzo6CisKK0BFQ0hPIE9GRgorU0VUTE9DQUwgRW5hYmxlRGVsYXllZEV4cGFuc2lvbgorCis6OiBTZXRzIHZhcmlhYmxlcyBmb3IgdGhpcmQgcGFydHkgdmVyc2lvbnMgdXNlZCBpbiBidWlsZAorQ0FMTCAuLlwuLlxzY3JpcHRzXHRwdmVyc2lvbnMuYmF0IHx8IEVYSVQgL0IKKworOjogdXNlICJidWlsZC16bGliLmJhdCAveWVzIiB0byBza2lwIHRoZSBxdWVzdGlvbiBwYXJ0CitJRiAvSSAiJTEiID09ICIvWUVTIiAgICAgICAgICAgU0VUIE5PQVNLPTEKKworSUYgTk9UIERFRklORUQgR0VORVJBVE9SICAgICAgIFNFVCBHRU5FUkFUT1I9Tk1ha2UgTWFrZWZpbGVzCitJRiBOT1QgREVGSU5FRCBQQUNLQUdFX05BTUUgICAgU0VUIFBBQ0tBR0VfTkFNRT16bGliCitJRiBOT1QgREVGSU5FRCBQQUNLQUdFX1ZFUlNJT04gU0VUIFBBQ0tBR0VfVkVSU0lPTj0lVFBfWkxJQl9WRVJTSU9OJQorSUYgTk9UIERFRklORUQgU09VUkNFX0RJUiAgICAgIFNFVCBTT1VSQ0VESVI9JX5kcDAlUEFDS0FHRV9OQU1FJS0lUEFDS0FHRV9WRVJTSU9OJQorSUYgTk9UIERFRklORUQgV0lOM1BfUk9PVCAgICAgIFNFVCBXSU4zUF9ST09UPSV+ZHAwLi4KKworOjogU2V0IENPTVBJTEVSIHRvICh2YzEwMCAtIHZjMTQwKSBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQKK0NBTEwgLi5cLi5cc2NyaXB0c1xjbF9zZXRjb21waWxlci5iYXQgfHwgRVhJVCAvQgorCis6OiBTZXQgQVJDSCB0byBlaXRoZXIgd2luMzIgb3IgeDY0IGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCBlbnZpcm9ubWVudAorQ0FMTCAuLlwuLlxzY3JpcHRzXGNsX3NldGFyY2guYmF0IHx8IEVYSVQgL0IKKworRk9SICUlWCBJTiAoCisgIERlYnVnIAorICBSZWxlYXNlCispIERPICgKKyAgU0VUIEJVSUxEVFlQRT0lJVgKKyAgU0VUIEJVSUxERElSPSVXSU4zUF9ST09UJVxidWlsZFwlUEFDS0FHRV9OQU1FJVwlUEFDS0FHRV9WRVJTSU9OJVwlQ09NUElMRVIlXCVBUkNIJVwhQlVJTERUWVBFIQorICBTRVQgT1VURElSPSVXSU4zUF9ST09UJVxkaXN0XCVQQUNLQUdFX05BTUUlLSVQQUNLQUdFX1ZFUlNJT04lXCVDT01QSUxFUiVcJUFSQ0glCisKKyAgRUNITy8KKyAgRUNITyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEVDSE8gICAgICAgICAgQnVpbGRpbmc6ICVQQUNLQUdFX05BTUUlIHYlUEFDS0FHRV9WRVJTSU9OJSAlQ09NUElMRVIlOiVBUkNIJTohQlVJTERUWVBFISAiJUdFTkVSQVRPUiUiCisgIEVDSE8gICBCdWlsZCBEaXJlY3Rvcnk6ICFCVUlMRERJUiEKKyAgRUNITyBJbnN0YWxsIERpcmVjdG9yeTogIU9VVERJUiEKKyAgRUNITyAgU291cmNlIERpcmVjdG9yeTogJVNPVVJDRURJUiUKKyAgRUNITyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEVDSE8vCisKKyAgSUYgTk9UIERFRklORUQgTk9BU0sgKAorICAgIENIT0lDRSAvTSAiRG8geW91IHdhbnQgdG8gYnVpbGQgdGhpcyBjb25maWd1cmF0aW9uPyAiIC9jIFlOCisgICAgSUYgIUVSUk9STEVWRUwhIE5FUSAxIChFWElUIC9CICFFUlJPUkxFVkVMISkKKyAgKQorCisgIE1LRElSICIhQlVJTERESVIhIgorICBDRCAiIUJVSUxERElSISIgfHwgRVhJVCAvQgorCisgIENNQUtFLkVYRSAtRyIlR0VORVJBVE9SJSIgLURDTUFLRV9JTlNUQUxMX1BSRUZJWD0hT1VURElSISAtRENNQUtFX0JVSUxEX1RZUEU9IUJVSUxEVFlQRSEgIiVTT1VSQ0VESVIlIiB8fCBFWElUIC9CCisgIE5NQUtFIC9mTWFrZWZpbGUgaW5zdGFsbCB8fCBFWElUIC9CCisKKyAgSUYgIiFCVUlMRFRZUEUhIiA9PSAiRGVidWciICgKKyAgICBDT1BZICIhQlVJTERESVIhXHpsaWJkLnBkYiIgIiFPVVRESVIhXGJpblwiIHx8IEVYSVQgL0IKKyAgKQorKQorCitFTkRMT0NBTApkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL0NNYWtlTGlzdHMudHh0IGIvY29tcGlsZXIvY3BwL0NNYWtlTGlzdHMudHh0CmluZGV4IDYwNmJmY2QuLjBkZjc5MGUgMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL2NwcC9DTWFrZUxpc3RzLnR4dAorKysgYi9jb21waWxlci9jcHAvQ01ha2VMaXN0cy50eHQKQEAgLTE2LDEwMiArMTYsNjQgQEAKICMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKK2NtYWtlX21pbmltdW1fcmVxdWlyZWQoVkVSU0lPTiAyLjguMTIpCiAKLQotY21ha2VfbWluaW11bV9yZXF1aXJlZChWRVJTSU9OIDIuOCkKLQotcHJvamVjdCh0aHJpZnQtY29tcGlsZXIpCi0KLSMgUmVhZCB0aGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBmcm9tIHRoZSBBdXRvY29uZiBmaWxlCi1maWxlIChTVFJJTkdTICIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vLi4vLi4vY29uZmlndXJlLmFjIiBDT05GSUdVUkVfQUMgUkVHRVggIkFDX0lOSVRcXCguKlxcKSIgKQotCi0jIFRoZSBmb2xsb3dpbmcgdmFyaWFibGUgaXMgdXNlZCBpbiB0aGUgdmVyc2lvbi5oLmluIGZpbGUKLXN0cmluZyhSRUdFWCBSRVBMQUNFICJBQ19JTklUXFwoXFxbLipcXF0sIFxcWyhbMC05XStcXC5bMC05XStcXC5bMC05XSsoLWRldik/KVxcXVxcKSIgIlxcMSIgUEFDS0FHRV9WRVJTSU9OICR7Q09ORklHVVJFX0FDfSkKLW1lc3NhZ2UoU1RBVFVTICJUaHJpZnQgcGFja2FnZSB2ZXJzaW9uOiAke1BBQ0tBR0VfVkVSU0lPTn0iKQotCi0jIFRoZXNlIGFyZSBpbnRlcm5hbCB0byBDTWFrZQotc3RyaW5nKFJFR0VYIFJFUExBQ0UgIihbMC05XStcXC5bMC05XStcXC5bMC05XSspKC1kZXYpPyIgIlxcMSIgdGhyaWZ0X1ZFUlNJT04gJHtQQUNLQUdFX1ZFUlNJT059KQotc3RyaW5nKFJFR0VYIFJFUExBQ0UgIihbMC05XSspXFwuWzAtOV0rXFwuWzAtOV0rIiAiXFwxIiB0aHJpZnRfVkVSU0lPTl9NQUpPUiAke3RocmlmdF9WRVJTSU9OfSkKLXN0cmluZyhSRUdFWCBSRVBMQUNFICJbMC05XStcXC4oWzAtOV0pK1xcLlswLTldKyIgIlxcMSIgdGhyaWZ0X1ZFUlNJT05fTUlOT1IgJHt0aHJpZnRfVkVSU0lPTn0pCi1zdHJpbmcoUkVHRVggUkVQTEFDRSAiWzAtOV0rXFwuWzAtOV0rXFwuKFswLTldKykiICJcXDEiIHRocmlmdF9WRVJTSU9OX1BBVENIICR7dGhyaWZ0X1ZFUlNJT059KQotbWVzc2FnZShTVEFUVVMgIlRocmlmdCB2ZXJzaW9uOiAke3RocmlmdF9WRVJTSU9OfSAoJHt0aHJpZnRfVkVSU0lPTl9NQUpPUn0uJHt0aHJpZnRfVkVSU0lPTl9NSU5PUn0uJHt0aHJpZnRfVkVSU0lPTl9QQVRDSH0pIikKLQotIyBXaW5kb3dzIGhhcyBhIGRpZmZlcmVudCBoZWFkZXIKK2NvbmZpZ3VyZV9maWxlKCR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9zcmMvdGhyaWZ0L3ZlcnNpb24uaC5pbiAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdGhyaWZ0L3ZlcnNpb24uaCkKIGlmKE1TVkMpCi0gICAgc2V0KEZMRVhfRkxBR1MgIi0td2luY29tcGF0IikgIyBEb24ndCB1c2UgdW5pc3RkLmggb24gd2luZG93cwotICAgIGNvbmZpZ3VyZV9maWxlKCR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9zcmMvd2luZG93cy92ZXJzaW9uLmguaW4gJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3ZlcnNpb24uaCkKLWVsc2UoKQotICAgIHNldChGTEVYX0ZMQUdTICIgIikKLSAgICBjb25maWd1cmVfZmlsZSgke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vdmVyc2lvbi5oLmluICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS92ZXJzaW9uLmgpCisgICAgIyBUaGUgd2luZmxleGJpc29uIGdlbmVyYXRvciBvdXRwdXRzIHNvbWUgbWFjcm9zIHRoYXQgY29uZmxpY3Qgd2l0aCB0aGUgVmlzdWFsIFN0dWRpbyAyMDEwIGNvcHkgb2Ygc3RkaW50LmgKKyAgICAjIFRoaXMgbWlnaHQgYmUgZml4ZWQgaW4gbGF0ZXIgdmVyc2lvbnMgb2YgVmlzdWFsIFN0dWRpbywgYnV0IGFuIGVhc3kgc29sdXRpb24gaXMgdG8gaW5jbHVkZSBzdGRpbnQuaCBmaXJzdAorICAgIGlmKEhBVkVfU1RESU5UX0gpCisgICAgICAgIGFkZF9kZWZpbml0aW9ucygtRF9fU1REQ19GT1JNQVRfTUFDUk9TKQorICAgICAgICBhZGRfZGVmaW5pdGlvbnMoLURfX1NURENfTElNSVRfTUFDUk9TKQorICAgICAgICBhZGRfZGVmaW5pdGlvbnMoL0ZJInN0ZGludC5oIikKKyAgICBlbmRpZihIQVZFX1NURElOVF9IKQogZW5kaWYoKQogCiBmaW5kX3BhY2thZ2UoRkxFWCBSRVFVSVJFRCkKIGZpbmRfcGFja2FnZShCSVNPTiBSRVFVSVJFRCkKIAorIyBjcmVhdGUgZGlyZWN0b3J5IGZvciB0aHJpZnR5IGFuZCB0aHJpZnRsCitmaWxlKE1BS0VfRElSRUNUT1JZICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnQvKQorCiAjIENyZWF0ZSBmbGV4IGFuZCBiaXNvbiBmaWxlcyBhbmQgYnVpbGQgdGhlIGxpYiBwYXJzZSBzdGF0aWMgbGlicmFyeQotQklTT05fVEFSR0VUKHRocmlmdHkgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3NyYy90aHJpZnR5Lnl5ICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnR5LmNjKQotRkxFWF9UQVJHRVQodGhyaWZ0bCAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vc3JjL3RocmlmdGwubGwgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3RocmlmdGwuY2MgQ09NUElMRV9GTEFHUyAke0ZMRVhfRkxBR1N9KQorQklTT05fVEFSR0VUKHRocmlmdHkgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3NyYy90aHJpZnQvdGhyaWZ0eS55eSAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdGhyaWZ0L3RocmlmdHkuY2MpCitGTEVYX1RBUkdFVCh0aHJpZnRsICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9zcmMvdGhyaWZ0L3RocmlmdGwubGwgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3RocmlmdC90aHJpZnRsLmNjKQogQUREX0ZMRVhfQklTT05fREVQRU5ERU5DWSh0aHJpZnRsIHRocmlmdHkpCiAKLSMgSEFDSzogV29yayBhcm91bmQgdGhlIGZhY3QgdGhhdCBiaXNvbiBjcmF0ZXMgYSAuaGggZmlsZSBidXQgd2UgbmVlZCBhIC5oIGZpbGUKLWFkZF9jdXN0b21fY29tbWFuZChPVVRQVVQgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3RocmlmdHkuaAotICAgICAgICAgICAgICAgICAgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSBjb3B5ICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnR5LmhoICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnR5LmgKLSAgICAgICAgICAgICAgICAgICBERVBFTkRTICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnR5LmhoCi0gICAgICAgICAgICAgICAgICAgKQotCi1zZXQobGlicGFyc2VfU09VUkNFUwotICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnR5LmNjCi0gICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3RocmlmdGwuY2MKLSAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdGhyaWZ0eS5oCitzZXQocGFyc2VfU09VUkNFUworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnQvdGhyaWZ0eS5jYworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnQvdGhyaWZ0bC5jYworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnQvdGhyaWZ0eS5oaAogKQogCi1hZGRfbGlicmFyeShsaWJwYXJzZSBTVEFUSUMgJHtsaWJwYXJzZV9TT1VSQ0VTfSkKK2FkZF9saWJyYXJ5KHBhcnNlIFNUQVRJQyAke3BhcnNlX1NPVVJDRVN9KQogCiAjIENyZWF0ZSB0aGUgdGhyaWZ0IGNvbXBpbGVyCi1zZXQoIHRocmlmdF9TT1VSQ0VTIAotICAgIHNyYy9tYWluLmNjCi0gICAgc3JjL21kNS5jCi0gICAgc3JjL2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmNjCi0gICAgc3JjL2dlbmVyYXRlL3RfZ2VuZXJhdG9yX3JlZ2lzdHJ5LmgKLSAgICBzcmMvZ2xvYmFscy5oCi0gICAgc3JjL21haW4uaAotICAgIHNyYy9wbGF0Zm9ybS5oCi0gICAgc3JjL21kNS5oCi0gICAgc3JjL3BhcnNlL3RfZG9jLmgKLSAgICBzcmMvcGFyc2UvdF90eXBlLmgKLSAgICBzcmMvcGFyc2UvdF9iYXNlX3R5cGUuaAotICAgIHNyYy9wYXJzZS90X2VudW0uaAotICAgIHNyYy9wYXJzZS90X2VudW1fdmFsdWUuaAotICAgIHNyYy9wYXJzZS90X3R5cGVkZWYuaAotICAgIHNyYy9wYXJzZS90X3R5cGVkZWYuY2MKLSAgICBzcmMvcGFyc2UvdF9jb250YWluZXIuaAotICAgIHNyYy9wYXJzZS90X2xpc3QuaAotICAgIHNyYy9wYXJzZS90X3NldC5oCi0gICAgc3JjL3BhcnNlL3RfbWFwLmgKLSAgICBzcmMvcGFyc2UvdF9zdHJ1Y3QuaAotICAgIHNyYy9wYXJzZS90X2ZpZWxkLmgKLSAgICBzcmMvcGFyc2UvdF9zZXJ2aWNlLmgKLSAgICBzcmMvcGFyc2UvdF9mdW5jdGlvbi5oCi0gICAgc3JjL3BhcnNlL3RfcHJvZ3JhbS5oCi0gICAgc3JjL3BhcnNlL3Rfc2NvcGUuaAotICAgIHNyYy9wYXJzZS90X2NvbnN0LmgKLSAgICBzcmMvcGFyc2UvdF9jb25zdF92YWx1ZS5oCi0gICAgc3JjL3BhcnNlL3BhcnNlLmNjCi0gICAgc3JjL2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmgKLSAgICBzcmMvZ2VuZXJhdGUvdF9vb3BfZ2VuZXJhdG9yLmgKLSAgICBzcmMvZ2VuZXJhdGUvdF9odG1sX2dlbmVyYXRvci5oCi0gICAgc3JjL3dpbmRvd3MvY29uZmlnLmgKLSAgICB2ZXJzaW9uLmgKK3NldChjb21waWxlcl9jb3JlCisgICAgc3JjL3RocmlmdC9jb21tb24uY2MKKyAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmNjCisgICAgc3JjL3RocmlmdC9wYXJzZS90X3R5cGVkZWYuY2MKKyAgICBzcmMvdGhyaWZ0L3BhcnNlL3BhcnNlLmNjCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3RocmlmdC92ZXJzaW9uLmgKKykKKworc2V0KHRocmlmdC1jb21waWxlcl9TT1VSQ0VTCisgICAgc3JjL3RocmlmdC9tYWluLmNjCisgICAgc3JjL3RocmlmdC9hdWRpdC90X2F1ZGl0LmNwcAorKQorCitzZXQodGhyaWZ0X2NvbXBpbGVyX0xBTkdTCiApCiAKICMgVGhpcyBtYWNybyBhZGRzIGFuIG9wdGlvbiBUSFJJRlRfQ09NUElMRVJfJHtOQU1FfQogIyB0aGF0IGFsbG93cyBlbmFibGluZyBvciBkaXNhYmxpbmcgY2VydGFpbiBsYW5ndWFnZXMKIG1hY3JvKFRIUklGVF9BRERfQ09NUElMRVIgbmFtZSBkZXNjcmlwdGlvbiBpbml0aWFsKQogICAgIHN0cmluZyhUT1VQUEVSICJUSFJJRlRfQ09NUElMRVJfJHtuYW1lfSIgZW5hYmxlcikKLSAgICBzZXQoc3JjICJzcmMvZ2VuZXJhdGUvdF8ke25hbWV9X2dlbmVyYXRvci5jYyIpCisgICAgc2V0KHNyYyAic3JjL3RocmlmdC9nZW5lcmF0ZS90XyR7bmFtZX1fZ2VuZXJhdG9yLmNjIikKICAgICBvcHRpb24oJHtlbmFibGVyfSAke2Rlc2NyaXB0aW9ufSAke2luaXRpYWx9KQogICAgIGlmKCR7ZW5hYmxlcn0pCi0gICAgICAgIGxpc3QoQVBQRU5EIHRocmlmdF9TT1VSQ0VTICR7c3JjfSkKKyAgICAgICAgbGlzdChBUFBFTkQgdGhyaWZ0LWNvbXBpbGVyX1NPVVJDRVMgJHtzcmN9KQorICAgICAgICBsaXN0KEFQUEVORCB0aHJpZnRfY29tcGlsZXJfTEFOR1MgJHtuYW1lfSkKICAgICBlbmRpZigpCiBlbmRtYWNybygpCiAKQEAgLTEyMCwxMyArODIsMTcgQEAKIFRIUklGVF9BRERfQ09NUElMRVIoY3BwICAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBDKysiIE9OKQogVEhSSUZUX0FERF9DT01QSUxFUihqYXZhICAgICJFbmFibGUgY29tcGlsZXIgZm9yIEphdmEiICAgT04pCiBUSFJJRlRfQUREX0NPTVBJTEVSKGFzMyAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgQWN0aW9uU2NyaXB0IDMiIE9OKQorVEhSSUZUX0FERF9DT01QSUxFUihkYXJ0ICAgICJFbmFibGUgY29tcGlsZXIgZm9yIERhcnQiIE9OKQorVEhSSUZUX0FERF9DT01QSUxFUihoYXhlICAgICJFbmFibGUgY29tcGlsZXIgZm9yIEhheGUiIE9OKQogVEhSSUZUX0FERF9DT01QSUxFUihjc2hhcnAgICJFbmFibGUgY29tcGlsZXIgZm9yIEMjIiBPTikKK1RIUklGVF9BRERfQ09NUElMRVIobmV0Y29yZSAiRW5hYmxlIGNvbXBpbGVyIGZvciAuTkVUIENvcmUiIE9OKQogVEhSSUZUX0FERF9DT01QSUxFUihweSAgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIFB5dGhvbiAyLjAiIE9OKQogVEhSSUZUX0FERF9DT01QSUxFUihyYiAgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIFJ1YnkiIE9OKQogVEhSSUZUX0FERF9DT01QSUxFUihwZXJsICAgICJFbmFibGUgY29tcGlsZXIgZm9yIFBlcmwiIE9OKQogVEhSSUZUX0FERF9DT01QSUxFUihwaHAgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIFBIUCIgT04pCiBUSFJJRlRfQUREX0NPTVBJTEVSKGVybCAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgRXJsYW5nIiBPTikKIFRIUklGVF9BRERfQ09NUElMRVIoY29jb2EgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBDb2NvYSBPYmplY3RpdmUtQyIgT04pCitUSFJJRlRfQUREX0NPTVBJTEVSKHN3aWZ0ICAgIkVuYWJsZSBjb21waWxlciBmb3IgQ29jb2EgU3dpZnQiIE9OKQogVEhSSUZUX0FERF9DT01QSUxFUihzdCAgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIFNtYWxsdGFsayIgT04pCiBUSFJJRlRfQUREX0NPTVBJTEVSKG9jYW1sICAgIkVuYWJsZSBjb21waWxlciBmb3IgT0NhbWwiIE9OKQogVEhSSUZUX0FERF9DT01QSUxFUihocyAgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIEhhc2tlbGwiIE9OKQpAQCAtMTM5LDQ5ICsxMDUsMTE3IEBACiBUSFJJRlRfQUREX0NPTVBJTEVSKGdvICAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgR28iIE9OKQogVEhSSUZUX0FERF9DT01QSUxFUihkICAgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIEQiIE9OKQogVEhSSUZUX0FERF9DT01QSUxFUihsdWEgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIEx1YSIgT04pCitUSFJJRlRfQUREX0NPTVBJTEVSKGd2ICAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgR3JhcGhWaXoiIE9OKQorVEhSSUZUX0FERF9DT01QSUxFUihycyAgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIFJ1c3QiIE9OKQorVEhSSUZUX0FERF9DT01QSUxFUih4bWwgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIFhNTCIgT04pCiAKICMgVGhyaWZ0IGlzIGxvb2tpbmcgZm9yIGluY2x1ZGUgZmlsZXMgaW4gdGhlIHNyYyBkaXJlY3RvcnkKICMgd2UgYWxzbyBhZGQgdGhlIGN1cnJlbnQgYmluYXJ5IGRpcmVjdG9yeSBmb3IgZ2VuZXJhdGVkIGZpbGVzCiBpbmNsdWRlX2RpcmVjdG9yaWVzKCR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfSBzcmMpCiAKLWFkZF9leGVjdXRhYmxlKHRocmlmdCAke3RocmlmdF9TT1VSQ0VTfSkKLQotdGFyZ2V0X2xpbmtfbGlicmFyaWVzKHRocmlmdCBsaWJwYXJzZSkKLQotaW5zdGFsbChUQVJHRVRTIHRocmlmdCBERVNUSU5BVElPTiBiaW4pCi0KLSMgbWluZ3czMiBkb2VzIG5vdCBzdXBwb3J0IGMrKzB4IGZlYXR1cmVzCi1pZihOT1QgQ01BS0VfU1lTVEVNX05BTUUgU1RSRVFVQUwgIldpbmRvd3MiKQotICBzZXQoQ01BS0VfQ1hYX0ZMQUdTICIke0NNQUtFX0NYWF9GTEFHU30gLXN0ZD1jKysweCIpCitpZihOT1QgREVGSU5FRCBXSVRIX1BMVUdJTiBPUiBOT1QgJHtXSVRIX1BMVUdJTn0pCisgICAgbGlzdChBUFBFTkQgdGhyaWZ0LWNvbXBpbGVyX1NPVVJDRVMgJHtjb21waWxlcl9jb3JlfSkKIGVuZGlmKCkKIAotaWYoQ01BS0VfQ09NUElMRVJfSVNfR05VQ0MgT1IgQ01BS0VfQ09NUElMRVJfSVNfR05VQ1hYKQotICBzZXQoQ01BS0VfQ1hYX0ZMQUdTICIke0NNQUtFX0NYWF9GTEFHU30gLVdhbGwgLVdleHRyYSAtcGVkYW50aWMiKQorYWRkX2V4ZWN1dGFibGUodGhyaWZ0LWNvbXBpbGVyICR7dGhyaWZ0LWNvbXBpbGVyX1NPVVJDRVN9KQorCitpZigke1dJVEhfUExVR0lOfSkKKyAgICBhZGRfZXhlY3V0YWJsZSh0aHJpZnQtYm9vdHN0cmFwICR7Y29tcGlsZXJfY29yZX0KKyAgICAgICAgc3JjL3RocmlmdC9tYWluLmNjCisgICAgICAgIHNyYy90aHJpZnQvYXVkaXQvdF9hdWRpdC5jcHAKKyAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X2NwcF9nZW5lcmF0b3IuY2MKKyAgICApCisgICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKHRocmlmdC1ib290c3RyYXAgcGFyc2UpCisKKyAgICBzZXQoUExVR0lOX0dFTl9TT1VSQ0VTCisgICAgICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnQvcGx1Z2luL3BsdWdpbl90eXBlcy5oCisgICAgICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnQvcGx1Z2luL3BsdWdpbl90eXBlcy5jcHAKKyAgICAgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3RocmlmdC9wbHVnaW4vcGx1Z2luX2NvbnN0YW50cy5oCisgICAgICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnQvcGx1Z2luL3BsdWdpbl9jb25zdGFudHMuY3BwCisgICAgKQorCisgICAgZmlsZShNQUtFX0RJUkVDVE9SWSAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdGhyaWZ0L3BsdWdpbikKKyAgICBhZGRfY3VzdG9tX2NvbW1hbmQoT1VUUFVUICR7UExVR0lOX0dFTl9TT1VSQ0VTfQorICAgICAgICBERVBFTkRTIHRocmlmdC1ib290c3RyYXAgc3JjL3RocmlmdC9wbHVnaW4vcGx1Z2luLnRocmlmdAorICAgICAgICBDT01NQU5EIHRocmlmdC1ib290c3RyYXAgLWdlbiBjcHAKKyAgICAgICAgLW91dCAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdGhyaWZ0L3BsdWdpbgorICAgICAgICAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vc3JjL3RocmlmdC9wbHVnaW4vcGx1Z2luLnRocmlmdAorICAgICkKKworICAgIGluY2x1ZGVfZGlyZWN0b3JpZXMoLi4vLi4vbGliL2NwcC9zcmMpCisKKyAgICBpbmNsdWRlKFRocmlmdE1hY3JvcykKKyAgICBBRERfTElCUkFSWV9USFJJRlQodGhyaWZ0YworICAgICAgICAke2NvbXBpbGVyX2NvcmV9CisgICAgICAgICR7UExVR0lOX0dFTl9TT1VSQ0VTfQorICAgICAgICBzcmMvdGhyaWZ0L2xvZ2dpbmcuY2MKKyAgICAgICAgc3JjL3RocmlmdC9wbHVnaW4vcGx1Z2luX291dHB1dC5jYworICAgICAgICBzcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW4uY2MKKyAgICApCisgICAgVEFSR0VUX0lOQ0xVREVfRElSRUNUT1JJRVNfVEhSSUZUKHRocmlmdGMgUFVCTElDICR7Qm9vc3RfSU5DTFVERV9ESVJTfSkKKyAgICBUQVJHRVRfTElOS19MSUJSQVJJRVNfVEhSSUZUX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkodGhyaWZ0YyB0aHJpZnQgUFVCTElDKQorICAgIHRhcmdldF9jb21waWxlX2RlZmluaXRpb25zKHRocmlmdC1jb21waWxlciBQVUJMSUMgVEhSSUZUX0VOQUJMRV9QTFVHSU4pCisgICAgTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKHRocmlmdC1jb21waWxlciB0aHJpZnRjKQogZW5kaWYoKQogCitzZXRfdGFyZ2V0X3Byb3BlcnRpZXModGhyaWZ0LWNvbXBpbGVyIFBST1BFUlRJRVMgUlVOVElNRV9PVVRQVVRfRElSRUNUT1JZIGJpbi8pCitzZXRfdGFyZ2V0X3Byb3BlcnRpZXModGhyaWZ0LWNvbXBpbGVyIFBST1BFUlRJRVMgT1VUUFVUX05BTUUgdGhyaWZ0KQogCi0jIGNyZWF0ZSBhIERpc3RyaWJ1dGlvbiBQYWNrYWdlIGZvciB0aGUgQXBhY2hlIFRocmlmdCBDb21waWxlcgotc2V0KENQQUNLX1BBQ0tBR0VfTkFNRSAiQXBhY2hlIFRocmlmdCIpCi1zZXQoQ1BBQ0tfUEFDS0FHRV9ERVNDUklQVElPTl9TVU1NQVJZICJBcGFjaGUgVGhyaWZ0IENvbXBpbGVyIikKLXNldChDUEFDS19QQUNLQUdFX1ZFTkRPUiAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iICkKLXNldChDUEFDS19QQUNLQUdFX0NPTlRBQ1QgImRldkB0aHJpZnQuYXBhY2hlLm9yZyIpCi1zZXQoQ1BBQ0tfUEFDS0FHRV9WRVJTSU9OICR7dGhyaWZ0X1ZFUlNJT059KQotc2V0KENQQUNLX1BBQ0tBR0VfVkVSU0lPTl9NQUpPUiAke3RocmlmdF9WRVJTSU9OX01BSk9SfSApCi1zZXQoQ1BBQ0tfUEFDS0FHRV9WRVJTSU9OX01JTk9SICR7dGhyaWZ0X1ZFUlNJT05fTUlOT1J9ICkKLXNldChDUEFDS19QQUNLQUdFX1ZFUlNJT05fUEFUQ0ggJHt0aHJpZnRfVkVSU0lPTl9QQVRDSH0gKQotc2V0KENQQUNLX1JFU09VUkNFX0ZJTEVfTElDRU5TRSAiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9Ly4uLy4uL0xJQ0VOU0UiKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKHRocmlmdC1jb21waWxlciBwYXJzZSkKIAotaWYoQ01BS0VfU1lTVEVNX05BTUUgU1RSRVFVQUwgIldpbmRvd3MiKQotICAgIHNldChDUEFDS19HRU5FUkFUT1IgIk5TSVMiKQotICAgIHNldChDUEFDS19OU0lTX0hFTFBfTElOSyAiaHR0cDovL3RocmlmdC5hcGFjaGUub3JnIikKLSAgICBzZXQoQ1BBQ0tfTlNJU19NRU5VX0xJTktTCi0gICAgICAgICJodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmciICJBcGFjaGUgVGhyaWZ0IC0gV2ViIFNpdGUiCi0gICAgICAgICJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVCIgIkFwYWNoZSBUaHJpZnQgLSBJc3N1ZXMiKQotICAgIHNldChDUEFDS19OU0lTX0NPTlRBQ1QgJHtDUEFDS19QQUNLQUdFX0NPTlRBQ1R9KQotICAgIHNldChDUEFDS19OU0lTX01PRElGWV9QQVRIICJPTiIpCi0gICAgc2V0KENQQUNLX1BBQ0tBR0VfSU5TVEFMTF9ESVJFQ1RPUlkgJHtDUEFDS19QQUNLQUdFX05BTUV9KQotZWxzZSgpCi0gICAgc2V0KENQQUNLX0dFTkVSQVRPUiAiREVCIiApCi0gICAgc2V0KENQQUNLX0RFQklBTl9QQUNLQUdFX01BSU5UQUlORVIgJHtDUEFDS19QQUNLQUdFX0NPTlRBQ1R9KQoraW5zdGFsbChUQVJHRVRTIHRocmlmdC1jb21waWxlciBERVNUSU5BVElPTiBiaW4pCisKK2lmKCR7V0lUSF9QTFVHSU59KQorICAjIEluc3RhbGwgdGhlIGhlYWRlcnMKKyAgaW5zdGFsbChGSUxFUworICAgICAgInNyYy90aHJpZnQvY29tbW9uLmgiCisgICAgICAic3JjL3RocmlmdC9nbG9iYWxzLmgiCisgICAgICAic3JjL3RocmlmdC9sb2dnaW5nLmgiCisgICAgICAic3JjL3RocmlmdC9tYWluLmgiCisgICAgICAic3JjL3RocmlmdC9wbGF0Zm9ybS5oIgorICAgICAgIiR7Q01BS0VfQklOQVJZX0RJUn0vY29tcGlsZXIvY3BwL3RocmlmdC92ZXJzaW9uLmgiCisgICAgICBERVNUSU5BVElPTiAiJHtJTkNMVURFX0lOU1RBTExfRElSfS90aHJpZnQiKQorICBpbnN0YWxsKEZJTEVTCisgICAgICAic3JjL3RocmlmdC9hdWRpdC90X2F1ZGl0LmgiCisgICAgICBERVNUSU5BVElPTiAiJHtJTkNMVURFX0lOU1RBTExfRElSfS90aHJpZnQvYXVkaXQiKQorICBpbnN0YWxsKEZJTEVTCisgICAgICAic3JjL3RocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvci5oIgorICAgICAgInNyYy90aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3JfcmVnaXN0cnkuaCIKKyAgICAgICJzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfaHRtbF9nZW5lcmF0b3IuaCIKKyAgICAgICJzcmMvdGhyaWZ0L2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oIgorICAgICAgREVTVElOQVRJT04gIiR7SU5DTFVERV9JTlNUQUxMX0RJUn0vdGhyaWZ0L2dlbmVyYXRlIikKKyAgaW5zdGFsbChGSUxFUworICAgICAgInNyYy90aHJpZnQvcGFyc2UvdF9iYXNlX3R5cGUuaCIKKyAgICAgICJzcmMvdGhyaWZ0L3BhcnNlL3RfY29uc3QuaCIKKyAgICAgICJzcmMvdGhyaWZ0L3BhcnNlL3RfY29uc3RfdmFsdWUuaCIKKyAgICAgICJzcmMvdGhyaWZ0L3BhcnNlL3RfY29udGFpbmVyLmgiCisgICAgICAic3JjL3RocmlmdC9wYXJzZS90X2RvYy5oIgorICAgICAgInNyYy90aHJpZnQvcGFyc2UvdF9lbnVtLmgiCisgICAgICAic3JjL3RocmlmdC9wYXJzZS90X2VudW1fdmFsdWUuaCIKKyAgICAgICJzcmMvdGhyaWZ0L3BhcnNlL3RfZmllbGQuaCIKKyAgICAgICJzcmMvdGhyaWZ0L3BhcnNlL3RfZnVuY3Rpb24uaCIKKyAgICAgICJzcmMvdGhyaWZ0L3BhcnNlL3RfbGlzdC5oIgorICAgICAgInNyYy90aHJpZnQvcGFyc2UvdF9tYXAuaCIKKyAgICAgICJzcmMvdGhyaWZ0L3BhcnNlL3RfcHJvZ3JhbS5oIgorICAgICAgInNyYy90aHJpZnQvcGFyc2UvdF9zY29wZS5oIgorICAgICAgInNyYy90aHJpZnQvcGFyc2UvdF9zZXJ2aWNlLmgiCisgICAgICAic3JjL3RocmlmdC9wYXJzZS90X3NldC5oIgorICAgICAgInNyYy90aHJpZnQvcGFyc2UvdF9zdHJ1Y3QuaCIKKyAgICAgICJzcmMvdGhyaWZ0L3BhcnNlL3RfdHlwZWRlZi5oIgorICAgICAgInNyYy90aHJpZnQvcGFyc2UvdF90eXBlLmgiCisgICAgICBERVNUSU5BVElPTiAiJHtJTkNMVURFX0lOU1RBTExfRElSfS90aHJpZnQvcGFyc2UiKQorICBpbnN0YWxsKEZJTEVTCisgICAgICAic3JjL3RocmlmdC9wbHVnaW4vcGx1Z2luLmgiCisgICAgICAic3JjL3RocmlmdC9wbHVnaW4vcGx1Z2luX291dHB1dC5oIgorICAgICAgInNyYy90aHJpZnQvcGx1Z2luL3R5cGVfdXRpbC5oIgorICAgICAgREVTVElOQVRJT04gIiR7SU5DTFVERV9JTlNUQUxMX0RJUn0vdGhyaWZ0L3BsdWdpbiIpCitpZihNU1ZDKQorICBpbnN0YWxsKEZJTEVTCisgICAgICAic3JjL3RocmlmdC93aW5kb3dzL2NvbmZpZy5oIgorICAgICAgREVTVElOQVRJT04gIiR7SU5DTFVERV9JTlNUQUxMX0RJUn0vdGhyaWZ0L3dpbmRvd3MiKQogZW5kaWYoKQotaW5jbHVkZShDUGFjaykKK2VuZGlmKCkKKworaWYoQlVJTERfVEVTVElORykKKyAgICBhZGRfc3ViZGlyZWN0b3J5KHRlc3QpCitlbmRpZigpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvTWFrZWZpbGUuYW0gYi9jb21waWxlci9jcHAvTWFrZWZpbGUuYW0KaW5kZXggZWUyOGQwYy4uMGI4ZWYyZSAxMDA2NDQKLS0tIGEvY29tcGlsZXIvY3BwL01ha2VmaWxlLmFtCisrKyBiL2NvbXBpbGVyL2NwcC9NYWtlZmlsZS5hbQpAQCAtMjEsODYgKzIxLDE3MCBAQAogIyBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgogIyBkZXRhaWxzLgogCi1BTV9ZRkxBR1MgPSAtZAotTElCUyA9Ci1CVUlMVF9TT1VSQ0VTID0gdGhyaWZ0eS5jYworQVVUT01BS0VfT1BUSU9OUyA9IHN1YmRpci1vYmplY3RzCisKKyMgTm90ZSBvbiB3aHkgd2UgaGF2ZSBzcmMvdGhyaWZ0IGFuZCBzcmMvdGhyaWZ0L3BsdWdpbiBkaXJlY3RvcmllczoKKyMgU2luY2UgQXV0b21ha2Ugc3VwcG9ydHMgb25seSBvbmUgc2V0IG9mIEJVSUxUX1NPVVJDRVMgcGVyIGZpbGUgYW5kIGRvZXMgbm90IGFsbG93CisjIFNVQkRJUlMgYnVpbHQgYmVmb3JlIEJVSUxUX1NPVVJDRVMsIHdlIGVuZCB1cCBzZXBhcmF0ZSBNYWtlZmlsZS5hbSBmb3IgZWFjaCBzb3VyY2UKKyMgY29kZSBnZW5lcmF0aW9uLCBpLmUuIGxleC15YWNjIGFuZCBUaHJpZnQsIHRvIGFjaGlldmUgc3RhYmxlIHBhcmFsbGVsIG1ha2UuCisKK1NVQkRJUlMgPSBzcmMgc3JjL3RocmlmdC9wbHVnaW4gLgoraWYgV0lUSF9URVNUUworU1VCRElSUyArPSB0ZXN0CitlbmRpZgogCiBiaW5fUFJPR1JBTVMgPSB0aHJpZnQKIAotbm9pbnN0X0xJQlJBUklFUyA9IGxpYnBhcnNlLmEKLQogdGhyaWZ0X09CSkRJUiA9IG9iagogCi10aHJpZnRfU09VUkNFUyA9IHNyYy9tYWluLmNjIFwKLSAgICAgICAgICAgICAgICAgc3JjL21kNS5jIFwKLSAgICAgICAgICAgICAgICAgc3JjL2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmNjIFwKLSAgICAgICAgICAgICAgICAgc3JjL2dlbmVyYXRlL3RfZ2VuZXJhdG9yX3JlZ2lzdHJ5LmggXAotICAgICAgICAgICAgICAgICBzcmMvZ2xvYmFscy5oIFwKLSAgICAgICAgICAgICAgICAgc3JjL21haW4uaCBcCi0gICAgICAgICAgICAgICAgIHNyYy9wbGF0Zm9ybS5oIFwKLSAgICAgICAgICAgICAgICAgc3JjL2xvZ2dpbmcuaCBcCi0gICAgICAgICAgICAgICAgIHNyYy9tZDUuaCBcCi0gICAgICAgICAgICAgICAgIHNyYy9wYXJzZS90X2RvYy5oIFwKLSAgICAgICAgICAgICAgICAgc3JjL3BhcnNlL3RfdHlwZS5oIFwKLSAgICAgICAgICAgICAgICAgc3JjL3BhcnNlL3RfYmFzZV90eXBlLmggXAotICAgICAgICAgICAgICAgICBzcmMvcGFyc2UvdF9lbnVtLmggXAotICAgICAgICAgICAgICAgICBzcmMvcGFyc2UvdF9lbnVtX3ZhbHVlLmggXAotICAgICAgICAgICAgICAgICBzcmMvcGFyc2UvdF90eXBlZGVmLmggXAotICAgICAgICAgICAgICAgICBzcmMvcGFyc2UvdF90eXBlZGVmLmNjIFwKLSAgICAgICAgICAgICAgICAgc3JjL3BhcnNlL3RfY29udGFpbmVyLmggXAotICAgICAgICAgICAgICAgICBzcmMvcGFyc2UvdF9saXN0LmggXAotICAgICAgICAgICAgICAgICBzcmMvcGFyc2UvdF9zZXQuaCBcCi0gICAgICAgICAgICAgICAgIHNyYy9wYXJzZS90X21hcC5oIFwKLSAgICAgICAgICAgICAgICAgc3JjL3BhcnNlL3Rfc3RydWN0LmggXAotICAgICAgICAgICAgICAgICBzcmMvcGFyc2UvdF9maWVsZC5oIFwKLSAgICAgICAgICAgICAgICAgc3JjL3BhcnNlL3Rfc2VydmljZS5oIFwKLSAgICAgICAgICAgICAgICAgc3JjL3BhcnNlL3RfZnVuY3Rpb24uaCBcCi0gICAgICAgICAgICAgICAgIHNyYy9wYXJzZS90X3Byb2dyYW0uaCBcCi0gICAgICAgICAgICAgICAgIHNyYy9wYXJzZS90X3Njb3BlLmggXAotICAgICAgICAgICAgICAgICBzcmMvcGFyc2UvdF9jb25zdC5oIFwKLSAgICAgICAgICAgICAgICAgc3JjL3BhcnNlL3RfY29uc3RfdmFsdWUuaCBcCi0gICAgICAgICAgICAgICAgIHNyYy9wYXJzZS9wYXJzZS5jYyBcCi0gICAgICAgICAgICAgICAgIHNyYy9nZW5lcmF0ZS90X2dlbmVyYXRvci5oIFwKLSAgICAgICAgICAgICAgICAgc3JjL2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oIFwKLSAgICAgICAgICAgICAgICAgc3JjL2dlbmVyYXRlL3RfaHRtbF9nZW5lcmF0b3IuaCBcCi0gICAgICAgICAgICAgICAgIHNyYy93aW5kb3dzL2NvbmZpZy5oIFwKLSAgICAgICAgICAgICAgICAgc3JjL3dpbmRvd3MvdmVyc2lvbi5oCitwbHVnaW5fZ2VuID0gc3JjL3RocmlmdC9wbHVnaW4vcGx1Z2luX3R5cGVzLmggXAorICAgICAgICAgICAgIHNyYy90aHJpZnQvcGx1Z2luL3BsdWdpbl90eXBlcy5jcHAgXAorICAgICAgICAgICAgIHNyYy90aHJpZnQvcGx1Z2luL3BsdWdpbl9jb25zdGFudHMuaCBcCisgICAgICAgICAgICAgc3JjL3RocmlmdC9wbHVnaW4vcGx1Z2luX2NvbnN0YW50cy5jcHAKKworY29tcGlsZXJfY29yZSA9ICBzcmMvdGhyaWZ0L2NvbW1vbi5oIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jb21tb24uY2MgXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvcl9yZWdpc3RyeS5oIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nbG9iYWxzLmggXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BsYXRmb3JtLmggXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2xvZ2dpbmcuaCBcCisgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvdF9kb2MuaCBcCisgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvdF90eXBlLmggXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3RfYmFzZV90eXBlLmggXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3RfZW51bS5oIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X2VudW1fdmFsdWUuaCBcCisgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvdF90eXBlZGVmLmggXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3RfdHlwZWRlZi5jYyBcCisgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvdF9jb250YWluZXIuaCBcCisgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvdF9saXN0LmggXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3Rfc2V0LmggXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3RfbWFwLmggXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3Rfc3RydWN0LmggXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3RfZmllbGQuaCBcCisgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvdF9zZXJ2aWNlLmggXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3RfZnVuY3Rpb24uaCBcCisgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvdF9wcm9ncmFtLmggXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3Rfc2NvcGUuaCBcCisgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvdF9jb25zdC5oIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X2NvbnN0X3ZhbHVlLmggXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3BhcnNlLmNjIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvci5oIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaCBcCisgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9odG1sX2dlbmVyYXRvci5oIAorCit0aHJpZnRfU09VUkNFUyA9IHNyYy90aHJpZnQvbWFpbi5oIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9tYWluLmNjIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9hdWRpdC90X2F1ZGl0LmNwcCBcCisgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvYXVkaXQvdF9hdWRpdC5oCiAKICMgU3BlY2lmaWMgY2xpZW50IGdlbmVyYXRvciBzb3VyY2UKLXRocmlmdF9TT1VSQ0VTICs9IHNyYy9nZW5lcmF0ZS90X2NfZ2xpYl9nZW5lcmF0b3IuY2MgXAotICAgICAgICAgICAgICAgICAgc3JjL2dlbmVyYXRlL3RfY3BwX2dlbmVyYXRvci5jYyBcCi0gICAgICAgICAgICAgICAgICBzcmMvZ2VuZXJhdGUvdF9qYXZhX2dlbmVyYXRvci5jYyBcCi0gICAgICAgICAgICAgICAgICBzcmMvZ2VuZXJhdGUvdF9qc29uX2dlbmVyYXRvci5jYyBcCi0gICAgICAgICAgICAgICAgICBzcmMvZ2VuZXJhdGUvdF9hczNfZ2VuZXJhdG9yLmNjIFwKLSAgICAgICAgICAgICAgICAgIHNyYy9nZW5lcmF0ZS90X2NzaGFycF9nZW5lcmF0b3IuY2MgXAotICAgICAgICAgICAgICAgICAgc3JjL2dlbmVyYXRlL3RfcHlfZ2VuZXJhdG9yLmNjIFwKLSAgICAgICAgICAgICAgICAgIHNyYy9nZW5lcmF0ZS90X3JiX2dlbmVyYXRvci5jYyBcCi0gICAgICAgICAgICAgICAgICBzcmMvZ2VuZXJhdGUvdF9wZXJsX2dlbmVyYXRvci5jYyBcCi0gICAgICAgICAgICAgICAgICBzcmMvZ2VuZXJhdGUvdF9waHBfZ2VuZXJhdG9yLmNjIFwKLSAgICAgICAgICAgICAgICAgIHNyYy9nZW5lcmF0ZS90X2VybF9nZW5lcmF0b3IuY2MgXAotICAgICAgICAgICAgICAgICAgc3JjL2dlbmVyYXRlL3RfY29jb2FfZ2VuZXJhdG9yLmNjIFwKLSAgICAgICAgICAgICAgICAgIHNyYy9nZW5lcmF0ZS90X3N0X2dlbmVyYXRvci5jYyBcCi0gICAgICAgICAgICAgICAgICBzcmMvZ2VuZXJhdGUvdF9vY2FtbF9nZW5lcmF0b3IuY2MgXAotICAgICAgICAgICAgICAgICAgc3JjL2dlbmVyYXRlL3RfaHNfZ2VuZXJhdG9yLmNjIFwKLSAgICAgICAgICAgICAgICAgIHNyYy9nZW5lcmF0ZS90X3hzZF9nZW5lcmF0b3IuY2MgXAotICAgICAgICAgICAgICAgICAgc3JjL2dlbmVyYXRlL3RfaHRtbF9nZW5lcmF0b3IuY2MgXAotICAgICAgICAgICAgICAgICAgc3JjL2dlbmVyYXRlL3RfanNfZ2VuZXJhdG9yLmNjIFwKLSAgICAgICAgICAgICAgICAgIHNyYy9nZW5lcmF0ZS90X2phdmFtZV9nZW5lcmF0b3IuY2MgXAotICAgICAgICAgICAgICAgICAgc3JjL2dlbmVyYXRlL3RfZGVscGhpX2dlbmVyYXRvci5jYyBcCi0gICAgICAgICAgICAgICAgICBzcmMvZ2VuZXJhdGUvdF9nb19nZW5lcmF0b3IuY2MgXAotICAgICAgICAgICAgICAgICAgc3JjL2dlbmVyYXRlL3RfZ3ZfZ2VuZXJhdG9yLmNjIFwKLSAgICAgICAgICAgICAgICAgIHNyYy9nZW5lcmF0ZS90X2RfZ2VuZXJhdG9yLmNjIFwKLSAgICAgICAgICAgICAgICAgIHNyYy9nZW5lcmF0ZS90X2x1YV9nZW5lcmF0b3IuY2MKK3RocmlmdF9TT1VSQ0VTICs9IHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9jX2dsaWJfZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9jcHBfZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9qYXZhX2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfanNvbl9nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X2FzM19nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X2RhcnRfZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9oYXhlX2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfY3NoYXJwX2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfbmV0Y29yZV9nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X25ldGNvcmVfZ2VuZXJhdG9yLmggXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X3B5X2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfcmJfZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9wZXJsX2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfcGhwX2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZXJsX2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfY29jb2FfZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9zd2lmdF9nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X3N0X2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3Rfb2NhbWxfZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9oc19nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X3hzZF9nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X3htbF9nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X2h0bWxfZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9qc19nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X2phdmFtZV9nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X2RlbHBoaV9nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X2dvX2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZ3ZfZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9kX2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfbHVhX2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfcnNfZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9jbF9nZW5lcmF0b3IuY2MKIAogdGhyaWZ0X0NQUEZMQUdTID0gLUkkKHNyY2Rpcikvc3JjCi10aHJpZnRfQ1hYRkxBR1MgPSAtV2FsbCAtV2V4dHJhIC1wZWRhbnRpYwotdGhyaWZ0X0xEQUREID0gQExFWExJQkAgbGlicGFyc2UuYQordGhyaWZ0X0NYWEZMQUdTID0gLVdhbGwgLVdleHRyYSAtcGVkYW50aWMgLVdlcnJvcgordGhyaWZ0X0xEQUREID0gQExFWExJQkAgc3JjL3RocmlmdC9saWJwYXJzZS5hCiAKLWxpYnBhcnNlX2FfQ1BQRkxBR1MgPSAtSSQoc3JjZGlyKS9zcmMKLWxpYnBhcnNlX2FfQ1hYRkxBR1MgPSAtV2FsbCAtV25vLXNpZ24tY29tcGFyZSAtV25vLXVudXNlZAoraWYgIVdJVEhfUExVR0lOCit0aHJpZnRfU09VUkNFUyArPSAkKGNvbXBpbGVyX2NvcmUpCitlbHNlCiAKLWxpYnBhcnNlX2FfU09VUkNFUyA9IHNyYy90aHJpZnR5Lnl5IFwKLSAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnRsLmxsCitsaWJfTFRMSUJSQVJJRVMgPSBsaWJ0aHJpZnRjLmxhCisKK3RocmlmdF9DUFBGTEFHUyArPSAtRFRIUklGVF9FTkFCTEVfUExVR0lOPTEKK3RocmlmdF9MREFERCArPSBsaWJ0aHJpZnRjLmxhCisKK25vZGlzdF9saWJ0aHJpZnRjX2xhX1NPVVJDRVMgPSAkKHBsdWdpbl9nZW4pCitsaWJ0aHJpZnRjX2xhX1NPVVJDRVMgPSAkKGNvbXBpbGVyX2NvcmUpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGx1Z2luL3R5cGVfdXRpbC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGx1Z2luL3BsdWdpbi5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGx1Z2luL3BsdWdpbi5jYyBcCisgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW5fb3V0cHV0LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wbHVnaW4vcGx1Z2luX291dHB1dC5jYyBcCisgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW4udGhyaWZ0IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvbG9nZ2luZy5jYworCisKK2xpYnRocmlmdGNfbGFfQ1BQRkxBR1MgPSAtSSQoc3JjZGlyKS9zcmMgLUlzcmMgLUkkKHRvcF9idWlsZGRpcikvbGliL2NwcC9zcmMgLURUSFJJRlRfRU5BQkxFX1BMVUdJTj0xCitsaWJ0aHJpZnRjX2xhX0NYWEZMQUdTID0gLVdhbGwgLVdleHRyYSAtcGVkYW50aWMKK2xpYnRocmlmdGNfbGFfTElCQUREID0gJCh0b3BfYnVpbGRkaXIpL2xpYi9jcHAvbGlidGhyaWZ0LmxhCisKK2luY2x1ZGVfdGhyaWZ0ZGlyID0gJChpbmNsdWRlZGlyKS90aHJpZnQKK2luY2x1ZGVfdGhyaWZ0X0hFQURFUlMgPSBzcmMvdGhyaWZ0L2NvbW1vbi5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dsb2JhbHMuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9sb2dnaW5nLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvbWFpbi5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BsYXRmb3JtLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdmVyc2lvbi5oCisKK2luY2x1ZGVfYXVkaXRkaXIgPSAkKGluY2x1ZGVfdGhyaWZ0ZGlyKS93aW5kb3dzCitpbmNsdWRlX2F1ZGl0X0hFQURFUlMgPSBzcmMvdGhyaWZ0L2F1ZGl0L3RfYXVkaXQuaAorCitpbmNsdWRlX2dlbmVyYXRlZGlyID0gJChpbmNsdWRlX3RocmlmdGRpcikvZ2VuZXJhdGUKK2luY2x1ZGVfZ2VuZXJhdGVfSEVBREVSUyA9IHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yX3JlZ2lzdHJ5LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfaHRtbF9nZW5lcmF0b3IuaCAKKworaW5jbHVkZV9wYXJzZWRpciA9ICQoaW5jbHVkZV90aHJpZnRkaXIpL3BhcnNlCitpbmNsdWRlX3BhcnNlX0hFQURFUlMgPSBzcmMvdGhyaWZ0L3BhcnNlL3Rfc2VydmljZS5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvdF9wcm9ncmFtLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X2ZpZWxkLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X3Njb3BlLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X3R5cGVkZWYuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3Rfc2V0LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X2NvbnN0X3ZhbHVlLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X2VudW1fdmFsdWUuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3RfY29uc3QuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3RfbGlzdC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvdF9tYXAuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3RfY29udGFpbmVyLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X2Jhc2VfdHlwZS5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvdF9lbnVtLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X2Z1bmN0aW9uLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X3R5cGUuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3RfZG9jLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X3N0cnVjdC5oCisKK2luY2x1ZGVfcGx1Z2luZGlyID0gJChpbmNsdWRlX3RocmlmdGRpcikvcGx1Z2luCitpbmNsdWRlX3BsdWdpbl9IRUFERVJTID0gc3JjL3RocmlmdC9wbHVnaW4vcGx1Z2luLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGx1Z2luL3R5cGVfdXRpbC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW5fb3V0cHV0LmgKKworaW5jbHVkZV93aW5kb3dzZGlyID0gJChpbmNsdWRlX3RocmlmdGRpcikvd2luZG93cworaW5jbHVkZV93aW5kb3dzX0hFQURFUlMgPSBzcmMvdGhyaWZ0L3dpbmRvd3MvY29uZmlnLmgKK2VuZGlmCiAKIFdJTkRPV1NfRElTVCA9IFwKICAgICAgICAgICAgICBjb21waWxlci5zbG4gXApAQCAtMTA4LDExICsxOTIsMTYgQEAKICAgICAgICAgICAgICBjb21waWxlci52Y3hwcm9qLmZpbHRlcnMKIAogRVhUUkFfRElTVCA9IFwKKyAgICAgICAgICAgICBjb2Rpbmdfc3RhbmRhcmRzLm1kIFwKICAgICAgICAgICAgICBSRUFETUUubWQgXAogICAgICAgICAgICAgIENNYWtlTGlzdHMudHh0IFwKKyAgICAgICAgICAgICB0ZXN0IFwKICAgICAgICAgICAgICAkKFdJTkRPV1NfRElTVCkKIAogY2xlYW4tbG9jYWw6Ci0JJChSTSkgdGhyaWZ0bC5jYyB0aHJpZnR5LmNjIHRocmlmdHkuaCB0aHJpZnR5LmhoIHZlcnNpb24uaCB3aW5kb3dzL3ZlcnNpb24uaAorCSQoUk0pIHZlcnNpb24uaCAkKHBsdWdpbl9nZW4pCiAKLXNyYy9tYWluLmNjOiB2ZXJzaW9uLmgKK3NyYy90aHJpZnQvbWFpbi5jYzogc3JjL3RocmlmdC92ZXJzaW9uLmgKKworc3R5bGUtbG9jYWw6CisgICQoQ1BQU1RZTEVfQ01EKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL1JFQURNRS5tZCBiL2NvbXBpbGVyL2NwcC9SRUFETUUubWQKaW5kZXggMGU4NTNmYi4uMzJlYWM5ZiAxMDA2NDQKLS0tIGEvY29tcGlsZXIvY3BwL1JFQURNRS5tZAorKysgYi9jb21waWxlci9jcHAvUkVBRE1FLm1kCkBAIC0xLDgxICsxLDE3NSBAQAotIyBCdWlsZCBjb21waWxlciB1c2luZyBDTWFrZQorIyBCdWlsZCBUaHJpZnQgSURMIGNvbXBpbGVyIHVzaW5nIENNYWtlCiAKLVVzZSB0aGUgZm9sbG93aW5nIHN0ZXBzIHRvIGJ1aWxkIHVzaW5nIGNtYWtlOgorPCEtLSBUT0MgLS0+CiAKLSAgICBta2RpciBidWlsZAotICAgIGNkIGJ1aWxkCi0gICAgY21ha2UgLi4KLSAgICBtYWtlCistIFtCdWlsZCBUaHJpZnQgSURMIGNvbXBpbGVyIHVzaW5nIENNYWtlXSgjYnVpbGQtdGhyaWZ0LWlkbC1jb21waWxlci11c2luZy1jbWFrZSkKKyAgICAtIFtCdWlsZCBvbiBVbml4LWxpa2UgU3lzdGVtXSgjYnVpbGQtb24tdW5peC1saWtlLXN5c3RlbSkKKyAgICAgICAgLSBbUHJlcmVxdWlzaXRlc10oI3ByZXJlcXVpc2l0ZXMpCisgICAgICAgIC0gW0J1aWxkIHVzaW5nIENNYWtlXSgjYnVpbGQtdXNpbmctY21ha2UpCisgICAgICAgICAgICAtIFtCdWlsZCB3aXRoIEVjbGlwc2UgSURFXSgjYnVpbGQtd2l0aC1lY2xpcHNlLWlkZSkKKyAgICAgICAgICAgIC0gW0J1aWxkIHdpdGggWENvZGUgSURFIGluIE1hY09TXSgjYnVpbGQtd2l0aC14Y29kZS1pZGUtaW4tbWFjb3MpCisgICAgICAgICAgICAtIFtVc2FnZSBvZiBvdGhlciBJREVzXSgjdXNhZ2Utb2Ytb3RoZXItaWRlcykKKyAgICAtIFtCdWlsZCBvbiBXaW5kb3dzXSgjYnVpbGQtb24td2luZG93cykKKyAgICAgICAgLSBbUHJlcmVxdWlzaXRlc10oI3ByZXJlcXVpc2l0ZXMtMSkKKyAgICAgICAgLSBbQnVpbGQgdXNpbmcgR2l0IEJhc2hdKCNidWlsZC11c2luZy1naXQtYmFzaCkKKyAgICAgICAgLSBbVXNpbmcgVmlzdWFsIFN0dWRpbyBhbmQgV2luIGZsZXgtYmlzb25dKCN1c2luZy12aXN1YWwtc3R1ZGlvLWFuZC13aW4tZmxleC1iaXNvbikKKyAgICAgICAgLSBbQ3Jvc3MgY29tcGlsZSB1c2luZyBtaW5ndzMyIGFuZCBnZW5lcmF0ZSBhIFdpbmRvd3MgSW5zdGFsbGVyIHdpdGggQ1BhY2tdKCNjcm9zcy1jb21waWxlLXVzaW5nLW1pbmd3MzItYW5kLWdlbmVyYXRlLWEtd2luZG93cy1pbnN0YWxsZXItd2l0aC1jcGFjaykKKy0gW090aGVyIGNhc2VzXSgjb3RoZXItY2FzZXMpCisgICAgLSBbQnVpbGRpbmcgdGhlIFRocmlmdCBJREwgY29tcGlsZXIgaW4gV2luZG93cyB3aXRob3V0IENNYWtlXSgjYnVpbGRpbmctdGhlLXRocmlmdC1pZGwtY29tcGlsZXItaW4td2luZG93cy13aXRob3V0LWNtYWtlKQorLSBbVW5pdCB0ZXN0cyBmb3IgY29tcGlsZXJdKCN1bml0LXRlc3RzLWZvci1jb21waWxlcikKKyAgICAtIFtVc2luZyBib29zdCB0ZXN0XSgjdXNpbmctYm9vc3QtdGVzdCkKKyAgICAtIFtVc2luZyBDYXRjaCBDKysgdGVzdCBsaWJyYXJ5XSgjdXNpbmctY2F0Y2gtYy10ZXN0LWxpYnJhcnkpCistIFtIYXZlIGEgSGFwcHkgZnJlZSB0aW1lIGFuZCBob2xpZGF5c10oI2hhdmUtYS1oYXBweS1mcmVlLXRpbWUtYW5kLWhvbGlkYXlzKQogCis8IS0tIC9UT0MgLS0+CiAKLSMjIyBDcmVhdGUgYW4gZWNsaXBzZSBwcm9qZWN0CisjIyBCdWlsZCBvbiBVbml4LWxpa2UgU3lzdGVtCiAKLSAgICBta2RpciBidWlsZF9lYyAmJiBjZCBidWlsZF9lYwotICAgIGNtYWtlIC1HICJFY2xpcHNlIENEVDQgLSBVbml4IE1ha2VmaWxlcyIgLi4KLSAgICBtYWtlCisjIyMgUHJlcmVxdWlzaXRlcworLSBJbnN0YWxsIENNYWtlCistIEluc3RhbGwgZmxleCBhbmQgYmlzb24KIAotTm93IG9wZW4gdGhlIGZvbGRlciBidWlsZF9lYyB1c2luZyBlY2xpcHNlLgorIyMjIEJ1aWxkIHVzaW5nIENNYWtlCiAKKy0gR28gdG8gKip0aHJpZnRcY29tcGlsZXJcY3BwKioKKy0gVXNlIHRoZSBmb2xsb3dpbmcgc3RlcHMgdG8gYnVpbGQgdXNpbmcgY21ha2U6CisKK2BgYAorbWtkaXIgY21ha2UtYnVpbGQgJiYgY2QgY21ha2UtYnVpbGQKK2NtYWtlIC4uCittYWtlCitgYGAKKworIyMjIyBCdWlsZCB3aXRoIEVjbGlwc2UgSURFCisKKy0gR28gdG8gKip0aHJpZnRcY29tcGlsZXJcY3BwKioKKy0gVXNlIHRoZSBmb2xsb3dpbmcgc3RlcHMgdG8gYnVpbGQgdXNpbmcgY21ha2U6CisKK2BgYAorbWtkaXIgY21ha2UtZWMgJiYgY2QgY21ha2UtZWMKK2NtYWtlIC1HICJFY2xpcHNlIENEVDQgLSBVbml4IE1ha2VmaWxlcyIgLi4KK21ha2UKK2BgYAorCitOb3cgb3BlbiB0aGUgZm9sZGVyIGNtYWtlLWVjIHVzaW5nIGVjbGlwc2UuCisKKyMjIyMgQnVpbGQgd2l0aCBYQ29kZSBJREUgaW4gTWFjT1MKKworLSBJbnN0YWxsL3VwZGF0ZSBmbGV4LCBiaXNvbiBhbmQgY21ha2Ugd2l0aCBicmV3CisKK2BgYAorYnJldyBpbnN0YWxsIGNtYWtlCiticmV3IGluc3RhbGwgYmlzb24KK2BgYAorCistIEdvIHRvICoqdGhyaWZ0XGNvbXBpbGVyXGNwcCoqCistIFJ1biBjb21tYW5kcyBpbiBjb21tYW5kIGxpbmU6CisKK2BgYAorbWtkaXIgY21ha2UtYnVpbGQgJiYgY2QgY21ha2UtYnVpbGQKK2NtYWtlIC1HICJYY29kZSIgLURXSVRIX1BMVUdJTj1PRkYgLi4KK2NtYWtlIC0tYnVpbGQgLgorYGBgCisKKyMjIyMgVXNhZ2Ugb2Ygb3RoZXIgSURFcworCitQbGVhc2UgY2hlY2sgbGlzdCBvZiBzdXBwb3J0ZWQgSURFIAorCitgYGAKK2NtYWtlIC0taGVscAorYGBgCisKKyMjIEJ1aWxkIG9uIFdpbmRvd3MKKworIyMjIFByZXJlcXVpc2l0ZXMKKy0gSW5zdGFsbCBDTWFrZSAtIGh0dHBzOi8vY21ha2Uub3JnL2Rvd25sb2FkLworLSBJbiBjYXNlIGlmIHlvdSB3YW50IHRvIGJ1aWxkIHdpdGhvdXQgR2l0IEJhc2ggLSBpbnN0YWxsIHdpbmZsZXhiaXNvbiAtIGh0dHBzOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL3dpbmZsZXhiaXNvbi8KKy0gSW4gY2FzZSBpZiB5b3Ugd2FudCB0byBidWlsZCB3aXRoIFZpc3VhbCBTdHVkaW8gLSBpbnN0YWxsIFZpc3VhbCBTdHVkaW8gCisgIC0gQmV0dGVyIHRvIHVzZSB0aGUgbGF0ZXN0IHN0YWJsZSBWaXN1YWwgU3R1ZGlvIENvbW11bml0eSBFZGl0aW9uIC0gaHR0cHM6Ly93d3cudmlzdWFsc3R1ZGlvLmNvbS92cy93aGF0c25ldy8gKGVuc3VyZSB0aGF0IHlvdSBpbnN0YWxsZWQgd29ya2xvYWQgIkRlc2t0b3AgRGV2ZWxvcG1lbnQgd2l0aCBDKysiIGZvciBWUzIwMTcpIC0gTWljcm9zb2Z0IGFkZGVkIHNvbWUgc3VwcG9ydCBmb3IgQ01ha2UgYW5kIGltcHJvdmluZyBpdCBpbiBWaXN1YWwgU3R1ZGlvCisKKyMjIyBCdWlsZCB1c2luZyBHaXQgQmFzaAorCitHaXQgQmFzaCBwcm92aWRlcyBmbGV4IGFuZCBiaXNvbgorCistIEdvIHRvICoqdGhyaWZ0XGNvbXBpbGVyXGNwcCoqCistIFVzZSB0aGUgZm9sbG93aW5nIHN0ZXBzIHRvIGJ1aWxkIHVzaW5nIGNtYWtlOgorCitgYGAKK21rZGlyIGNtYWtlLXZzICYmIGNkIGNtYWtlLXZzCitjbWFrZSAtRFdJVEhfU0hBUkVEX0xJQj1vZmYgLi4KK2NtYWtlIC0tYnVpbGQgLgorYGBgCisKKyMjIyBVc2luZyBWaXN1YWwgU3R1ZGlvIGFuZCBXaW4gZmxleC1iaXNvbgorCistIEdlbmVyYXRlIGEgVmlzdWFsIFN0dWRpbyBwcm9qZWN0IGZvciB2ZXJzaW9uIG9mIFZpc3VhbCBTdHVkaW8gd2hpY2ggeW91IGhhdmUgKCoqY21ha2UgLS1oZWxwKiogY2FuIHNob3cgbGlzdCBvZiBzdXBwb3J0YWJsZSBWUyB2ZXJzaW9ucyk6CistIFJ1biBjb21tYW5kcyBpbiBjb21tYW5kIGxpbmU6CitgYGAKK21rZGlyIGNtYWtlLXZzCitjZCBjbWFrZS12cworY21ha2UgLUcgIlZpc3VhbCBTdHVkaW8gMTUgMjAxNyIgLURXSVRIX1BMVUdJTj1PRkYgLi4KK2BgYAorLSBOb3cgb3BlbiB0aGUgZm9sZGVyIGNtYWtlLXZzIHVzaW5nIFZpc3VhbCBTdHVkaW8uCiAKICMjIyBDcm9zcyBjb21waWxlIHVzaW5nIG1pbmd3MzIgYW5kIGdlbmVyYXRlIGEgV2luZG93cyBJbnN0YWxsZXIgd2l0aCBDUGFjawogCi0gICAgbWtkaXIgYnVpbGRfbWluZ3czMiAmJiBjZCBidWlsZF9taW5ndzMyCi0gICAgY21ha2UgLURDTUFLRV9UT09MQ0hBSU5fRklMRT0uLi8uLi8uLi9jb250cmliL21pbmd3MzItdG9vbGNoYWluLmNtYWtlIC4uCi0gICAgY3BhY2sKK2BgYAorbWtkaXIgY21ha2UtbWluZ3czMiAmJiBjZCBjbWFrZS1taW5ndzMyCitjbWFrZSAtRENNQUtFX1RPT0xDSEFJTl9GSUxFPS4uL2J1aWxkL2NtYWtlL21pbmd3MzItdG9vbGNoYWluLmNtYWtlIC1EQlVJTERfQ09NUElMRVI9T04gLURCVUlMRF9MSUJSQVJJRVM9T0ZGIC1EQlVJTERfVEVTVElORz1PRkYgLURCVUlMRF9FWEFNUExFUz1PRkYgLi4KK2NwYWNrCitgYGAKIAotIyMgQnVpbGQgb24gd2luZG93cworIyBPdGhlciBjYXNlcwogCi1JbiBvcmRlciB0byBidWlsZCBvbiB3aW5kb3dzIGEgZmV3IGFkZGl0aW9uYWwgc3RlcHMgYXJlIG5lY2Vzc2FyeToKKyMjIEJ1aWxkaW5nIHRoZSBUaHJpZnQgSURMIGNvbXBpbGVyIGluIFdpbmRvd3Mgd2l0aG91dCBDTWFrZQogCi0xLiBEb3dubG9hZCB3aW5mbGV4Ymlzb24gZnJvbSBodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL3dpbmZsZXhiaXNvbi8KLTIuIEV4dHJhY3QgdGhlIHdpbmZsZXggYmlzb24gZmlsZXMgdG8gZm9yIGUuZy4gQzpcd2luZmxleGJpc29uCi0zLiBNYWtlIHRoZSBDTWFrZSB2YXJpYWJsZXMgcG9pbnQgdG8gdGhlIGNvcnJlY3QgYmluYXJpZXMuCi0gICogRkxFWF9FWEVDVVRCQUxFID0gQzovd2luYnVpbGQvd2luX2ZsZXguZXhlCi0gICogQklTT05fRVhFQ1VUQkFMRSA9IEM6L3dpbmJ1aWxkL3dpbl9iaXNvbi5leGUKK0lmIHlvdSBkb24ndCB3YW50IHRvIHVzZSBDTWFrZSB5b3UgY2FuIHVzZSB0aGUgYWxyZWFkeSBhdmFpbGFibGUgVmlzdWFsIFN0dWRpbyAyMDEwIHNvbHV0aW9uLgogCitUaGUgVmlzdWFsIFN0dWRpbyBwcm9qZWN0IGNvbnRhaW5zIHByZS1idWlsZCBjb21tYW5kcyB0byBnZW5lcmF0ZSB0aGUgdGhyaWZ0bC5jYywgdGhyaWZ0eS5jYyBhbmQgdGhyaWZ0eS5oaCBmaWxlcyB3aGljaCBhcmUgbmVjZXNzYXJ5IHRvIGJ1aWxkIHRoZSBjb21waWxlci4gCiAKLSMjIyBDcmVhdGUgYSBWaXN1YWwgU3R1ZGlvIHByb2plY3QKK1RoZXNlIGRlcGVuZCBvbiBiaXNvbiwgZmxleCBhbmQgdGhlaXIgZGVwZW5kZW5jaWVzIHRvIHdvcmsgcHJvcGVybHkuCiAKLSAgICBta2RpciBidWlsZF92cyAmJiBjZCBidWlsZF92cwotICAgIGNtYWtlIC1HICJWaXN1YWwgU3R1ZGlvIDEyIiAuLgorRG93bmxvYWQgZmxleCAmIGJpc29uIGFzIGRlc2NyaWJlZCBhYm92ZS4gCiAKLU5vdyBvcGVuIHRoZSBmb2xkZXIgYnVpbGRfdnMgdXNpbmcgVmlzdWFsIFN0dWRpbyAyMDEzLgorUGxhY2UgdGhlc2UgYmluYXJpZXMgc29tZXdoZXJlIGluIHRoZSBwYXRoIGFuZCByZW5hbWUgd2luX2ZsZXguZXhlIGFuZCB3aW5fYmlzb24uZXhlIHRvIGZsZXguZXhlIGFuZCBiaXNvbi5leGUgcmVzcGVjdGl2ZWx5LgogCitJZiB0aGlzIGRvZXNuJ3Qgd29yayBvbiBhIHN5c3RlbSwgdHJ5IHRoZXNlIG1hbnVhbCBwcmUtYnVpbGQgc3RlcHMuCiAKLQotCi0jIEJ1aWxkaW5nIHRoZSBUaHJpZnQgSURMIGNvbXBpbGVyIGluIFdpbmRvd3MKLQotSWYgeW91IGRvbid0IHdhbnQgdG8gdXNlIENNYWtlIHlvdSBjYW4gdXNlIHRoZSBhbHJlYWR5IGF2YWlsYWJsZSBWaXN1YWwgU3R1ZGlvCi0yMDEwIHNvbHV0aW9uLgotVGhlIFZpc3VhbCBTdHVkaW8gcHJvamVjdCBjb250YWlucyBwcmUtYnVpbGQgY29tbWFuZHMgdG8gZ2VuZXJhdGUgdGhlCi10aHJpZnRsLmNjLCB0aHJpZnR5LmNjIGFuZCB0aHJpZnR5LmhoIGZpbGVzIHdoaWNoIGFyZSBuZWNlc3NhcnkgdG8gYnVpbGQKLXRoZSBjb21waWxlci4gVGhlc2UgZGVwZW5kIG9uIGJpc29uLCBmbGV4IGFuZCB0aGVpciBkZXBlbmRlbmNpZXMgdG8KLXdvcmsgcHJvcGVybHkuIElmIHRoaXMgZG9lc24ndCB3b3JrIG9uIGEgc3lzdGVtLCB0cnkgdGhlc2UgbWFudWFsCi1wcmUtYnVpbGQgc3RlcHMuCi0KLU9wZW4gY29tcGlsZXIuc2xuIGFuZCByZW1vdmUgdGhlIFByZS1idWlsZCBjb21tYW5kcyB1bmRlciB0aGUgcHJvamVjdCdzCi0gUHJvcGVydGllcyAtPiBCdWlsZCBFdmVudHMgLT4gUHJlLUJ1aWxkIEV2ZW50cy4KLQotRG93bmxvYWQgZmxleCAmIGJpc29uIGZyb20gaHR0cDovL2phaXNhbnRvbnlrLndvcmRwcmVzcy5jb20vMjAwOC8wMy8xNi9sZXgtYW5kLXlhY2NiaXNvbi1pbi13aW5kb3dzLwotRG93bmxvYWQgYmlzb24uc2ltcGxlIGluIGFkZGl0aW9uIHRvIGJpc29uLmV4ZSAuIFRoaXMgYnVpbGQgb2YgYmlzb24gaXMgZWFzaWVyIHRvIHVzZQotdGhhbiB0aGUgb25lIG9uIHNvdXJjZWZvcmdlIHdoaWNoIGhhcyBhIG15cmlhZCBvZiBkZXBlbmRlbmNpZXMuCi1QbGFjZSB0aGVzZSBiaW5hcmllcyBzb21ld2hlcmUgaW4gdGhlIHBhdGguCitPcGVuIGNvbXBpbGVyLnNsbiBhbmQgcmVtb3ZlIHRoZSBQcmUtYnVpbGQgY29tbWFuZHMgdW5kZXIgdGhlIHByb2plY3QnczogUHJvcGVydGllcyAtPiBCdWlsZCBFdmVudHMgLT4gUHJlLUJ1aWxkIEV2ZW50cy4KIAogRnJvbSBhIGNvbW1hbmQgcHJvbXB0OgotPiBjZCB0aHJpZnQvY29tcGlsZXIvY3BwCi0+IGZsZXggLW9zcmNcdGhyaWZ0bC5jYyBzcmNcdGhyaWZ0bC5sbAorYGBgCitjZCB0aHJpZnQvY29tcGlsZXIvY3BwCitmbGV4IC1vIHNyY1x0aHJpZnRcdGhyaWZ0bC5jYyBzcmNcdGhyaWZ0XHRocmlmdGwubGwKK2BgYAogSW4gdGhlIGdlbmVyYXRlZCB0aHJpZnRsLmNjLCBjb21tZW50IG91dCAjaW5jbHVkZSA8dW5pc3RkLmg+CiAKIFBsYWNlIGEgY29weSBvZiBiaXNvbi5zaW1wbGUgaW4gdGhyaWZ0L2NvbXBpbGVyL2NwcAotPiBiaXNvbiAteSAtbyAic3JjL3RocmlmdHkuY2MiIC0tZGVmaW5lcyBzcmMvdGhyaWZ0eS55eQotPiBtb3ZlIHNyY1x0aHJpZnR5LmNjLmhoICBzcmNcdGhyaWZ0eS5oaAorYGBgCitiaXNvbiAteSAtbyAic3JjL3RocmlmdC90aHJpZnR5LmNjIiAtLWRlZmluZXMgc3JjL3RocmlmdC90aHJpZnR5Lnl5Cittb3ZlIHNyY1x0aHJpZnRcdGhyaWZ0eS5jYy5oaCAgc3JjXHRocmlmdFx0aHJpZnR5LmhoCitgYGAKIAogQmlzb24gbWlnaHQgZ2VuZXJhdGUgdGhlIHlhY2MgaGVhZGVyIGZpbGUgInRocmlmdHkuY2MuaCIgd2l0aCBqdXN0IG9uZSBoICIuaCIgZXh0ZW5zaW9uOyBpbiB0aGlzIGNhc2UgeW91J2xsIGhhdmUgdG8gcmVuYW1lIHRvICJ0aHJpZnR5LmgiLgogCi0+IG1vdmUgc3JjXHdpbmRvd3NcdmVyc2lvbi5oLmluIHNyY1x3aW5kb3dzXHZlcnNpb24uaAorYGBgCittb3ZlIHNyY1x0aHJpZnRcdmVyc2lvbi5oLmluIHNyY1x0aHJpZnRcdmVyc2lvbi5oCitgYGAKIAogRG93bmxvYWQgaW50dHlwZXMuaCBmcm9tIHRoZSBpbnRlcndlYnMgYW5kIHBsYWNlIGl0IGluIGFuIGluY2x1ZGUgcGF0aAogbG9jYXRpb24gKGUuZy4gdGhyaWZ0L2NvbXBpbGVyL2NwcC9zcmMpLgogCiBCdWlsZCB0aGUgY29tcGlsZXIgaW4gVmlzdWFsIFN0dWRpby4KKworIyBVbml0IHRlc3RzIGZvciBjb21waWxlcgorCisjIyBVc2luZyBib29zdCB0ZXN0CistIHBscyBjaGVjayAqKnRlc3QqKiBmb2xkZXIKKworIyMgVXNpbmcgQ2F0Y2ggQysrIHRlc3QgbGlicmFyeQorCitBZGRlZCBnZW5lcmljIHdheSB0byBjb3ZlciBjb2RlIGJ5IHRlc3RzIGZvciBtYW55IGxhbmd1YWdlcyAoeW91IGp1c3QgbmVlZCB0byBtYWtlIGEgY29ycmVjdCBoZWFkZXIgZmlsZSBmb3IgZ2VuZXJhdG9yIGZvciB5b3VyIGxhbmd1YWdlIC0gZXhhbXBsZSBpbiAqKm5ldGNvcmUqKiBpbXBsZW1lbnRhdGlvbikKKworLSBwbHMgY2hlY2sgKip0ZXN0cyoqIGZvbGRlcgorCisjIEhhdmUgYSBIYXBweSBmcmVlIHRpbWUgYW5kIGhvbGlkYXlzIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9jb2Rpbmdfc3RhbmRhcmRzLm1kIGIvY29tcGlsZXIvY3BwL2NvZGluZ19zdGFuZGFyZHMubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWEwODk0NgotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9jb2Rpbmdfc3RhbmRhcmRzLm1kCkBAIC0wLDAgKzEsNCBAQAorIyMgQ29tcGlsZXIgQ29kaW5nIFN0YW5kYXJkcworCisgKiBXaGVuIG1ha2luZyBzbWFsbCBjaGFuZ2UgLyBidWdmaXggLSBmb2xsb3cgc3R5bGUgYXMgc2VlbiBpbiBuZWFyYnkgY29kZS4KKyAqIFdoZW4gbWFraW5nIG1ham9yIHJlZmFjdG9yIGFuZCAvIG9yIGFkZGluZyBuZXcgZmVhdHVyZSAtIGZvbGxvdyBzdHlsZSBmb3IgQysrIGxpYnJhcnkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvY29tcGlsZXIudmN4cHJvaiBiL2NvbXBpbGVyL2NwcC9jb21waWxlci52Y3hwcm9qCmluZGV4IDFmMGJlZTMuLjA2MjhiNTQgMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL2NwcC9jb21waWxlci52Y3hwcm9qCisrKyBiL2NvbXBpbGVyL2NwcC9jb21waWxlci52Y3hwcm9qCkBAIC0xOSw3MCArMTksODAgQEAKICAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPgogICA8L0l0ZW1Hcm91cD4KICAgPEl0ZW1Hcm91cD4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X2dlbmVyYXRvci5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfZ2VuZXJhdG9yX3JlZ2lzdHJ5LmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9vb3BfZ2VuZXJhdG9yLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9odG1sX2dlbmVyYXRvci5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXGdsb2JhbHMuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1xtYWluLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcbWQ1LmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNccGFyc2VcdF9iYXNlX3R5cGUuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1xwYXJzZVx0X2NvbnN0LmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNccGFyc2VcdF9jb25zdF92YWx1ZS5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHBhcnNlXHRfY29udGFpbmVyLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNccGFyc2VcdF9kb2MuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1xwYXJzZVx0X2VudW0uaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1xwYXJzZVx0X2VudW1fdmFsdWUuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1xwYXJzZVx0X2ZpZWxkLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNccGFyc2VcdF9mdW5jdGlvbi5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHBhcnNlXHRfbGlzdC5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHBhcnNlXHRfbWFwLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNccGFyc2VcdF9wcm9ncmFtLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNccGFyc2VcdF9zY29wZS5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHBhcnNlXHRfc2VydmljZS5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHBhcnNlXHRfc2V0LmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNccGFyc2VcdF9zdHJ1Y3QuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1xwYXJzZVx0X3R5cGUuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1xwYXJzZVx0X3R5cGVkZWYuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1xwbGF0Zm9ybS5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdHkuaGgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcd2luZG93c1xjb25maWcuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x3aW5kb3dzXHZlcnNpb24uaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcYXVkaXRcdF9hdWRpdC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxjb21tb24uaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9nZW5lcmF0b3IuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9nZW5lcmF0b3JfcmVnaXN0cnkuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9vb3BfZ2VuZXJhdG9yLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfaHRtbF9nZW5lcmF0b3IuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2xvYmFscy5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxtYWluLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHBhcnNlXHRfYmFzZV90eXBlLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHBhcnNlXHRfY29uc3QuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccGFyc2VcdF9jb25zdF92YWx1ZS5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwYXJzZVx0X2NvbnRhaW5lci5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwYXJzZVx0X2RvYy5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwYXJzZVx0X2VudW0uaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccGFyc2VcdF9lbnVtX3ZhbHVlLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHBhcnNlXHRfZmllbGQuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccGFyc2VcdF9mdW5jdGlvbi5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwYXJzZVx0X2xpc3QuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccGFyc2VcdF9tYXAuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccGFyc2VcdF9wcm9ncmFtLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHBhcnNlXHRfc2NvcGUuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccGFyc2VcdF9zZXJ2aWNlLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHBhcnNlXHRfc2V0LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHBhcnNlXHRfc3RydWN0LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHBhcnNlXHRfdHlwZS5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwYXJzZVx0X3R5cGVkZWYuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccGxhdGZvcm0uaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcdGhyaWZ0eS5oaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcd2luZG93c1xjb25maWcuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcdmVyc2lvbi5oIiAvPgogICA8L0l0ZW1Hcm91cD4KICAgPEl0ZW1Hcm91cD4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X2FzM19nZW5lcmF0b3IuY2MiIC8+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9jb2NvYV9nZW5lcmF0b3IuY2MiIC8+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9jcHBfZ2VuZXJhdG9yLmNjIiAvPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfY3NoYXJwX2dlbmVyYXRvci5jYyIgLz4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X2NfZ2xpYl9nZW5lcmF0b3IuY2MiIC8+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9kX2dlbmVyYXRvci5jYyIgLz4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X2RlbHBoaV9nZW5lcmF0b3IuY2MiIC8+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9lcmxfZ2VuZXJhdG9yLmNjIiAvPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfZ2VuZXJhdG9yLmNjIiAvPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfZ29fZ2VuZXJhdG9yLmNjIiAvPgotCTxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfZ3ZfZ2VuZXJhdG9yLmNjIiAvPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfaHNfZ2VuZXJhdG9yLmNjIiAvPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfaHRtbF9nZW5lcmF0b3IuY2MiIC8+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9qYXZhbWVfZ2VuZXJhdG9yLmNjIiAvPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfamF2YV9nZW5lcmF0b3IuY2MiIC8+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9qc19nZW5lcmF0b3IuY2MiIC8+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9vY2FtbF9nZW5lcmF0b3IuY2MiIC8+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9wZXJsX2dlbmVyYXRvci5jYyIgLz4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X3BocF9nZW5lcmF0b3IuY2MiIC8+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9weV9nZW5lcmF0b3IuY2MiIC8+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9yYl9nZW5lcmF0b3IuY2MiIC8+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9zdF9nZW5lcmF0b3IuY2MiIC8+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF94c2RfZ2VuZXJhdG9yLmNjIiAvPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXG1haW4uY2MiIC8+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcbWQ1LmMiIC8+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNccGFyc2VccGFyc2UuY2MiIC8+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNccGFyc2VcdF90eXBlZGVmLmNjIiAvPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdGwuY2MiIC8+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0eS5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcYXVkaXRcdF9hdWRpdC5jcHAiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGNvbW1vbi5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9hczNfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X2NvY29hX2dlbmVyYXRvci5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9jcHBfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X2NzaGFycF9nZW5lcmF0b3IuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfbmV0Y29yZV9nZW5lcmF0b3IuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfY19nbGliX2dlbmVyYXRvci5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9kX2dlbmVyYXRvci5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9kYXJ0X2dlbmVyYXRvci5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9kZWxwaGlfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X2VybF9nZW5lcmF0b3IuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X2dvX2dlbmVyYXRvci5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9ndl9nZW5lcmF0b3IuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfaGF4ZV9nZW5lcmF0b3IuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfaHNfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X2h0bWxfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X2phdmFtZV9nZW5lcmF0b3IuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfamF2YV9nZW5lcmF0b3IuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfanNfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X2pzb25fZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X2x1YV9nZW5lcmF0b3IuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfb2NhbWxfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X3BlcmxfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X3BocF9nZW5lcmF0b3IuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfcHlfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X3JiX2dlbmVyYXRvci5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9yc19nZW5lcmF0b3IuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfc3RfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X3N3aWZ0X2dlbmVyYXRvci5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF94bWxfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X3hzZF9nZW5lcmF0b3IuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XG1haW4uY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHBhcnNlXHBhcnNlLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwYXJzZVx0X3R5cGVkZWYuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRocmlmdGwuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRocmlmdHkuY2MiIC8+CiAgIDwvSXRlbUdyb3VwPgogICA8SXRlbUdyb3VwPgotICAgIDxOb25lIEluY2x1ZGU9InNyY1x0aHJpZnRsLmxsIiAvPgotICAgIDxOb25lIEluY2x1ZGU9InNyY1x0aHJpZnR5Lnl5IiAvPgorICAgIDxOb25lIEluY2x1ZGU9InNyY1x0aHJpZnRcdGhyaWZ0bC5sbCIgLz4KKyAgICA8Tm9uZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRocmlmdHkueXkiIC8+CiAgIDwvSXRlbUdyb3VwPgogICA8UHJvcGVydHlHcm91cCBMYWJlbD0iR2xvYmFscyI+CiAgICAgPFByb2plY3RHdWlkPns4OTk3NUExQS1GNzk5LTQ1NTYtOThCOC02NEUzMEFCMzlBOTB9PC9Qcm9qZWN0R3VpZD4KQEAgLTE1OSw3ICsxNjksNyBAQAogICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4KICAgICAgIDxPcHRpbWl6YXRpb24+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4KICAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5XSU4zMjtNSU5HVztZWV9OT19VTklTVERfSDtfREVCVUc7X0NPTlNPTEU7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgICAgPEZvcmNlZEluY2x1ZGVGaWxlcz5jb25maWcuaDwvRm9yY2VkSW5jbHVkZUZpbGVzPgorICAgICAgPEZvcmNlZEluY2x1ZGVGaWxlcz50aHJpZnRcd2luZG93c1xjb25maWcuaDwvRm9yY2VkSW5jbHVkZUZpbGVzPgogICAgICAgPENvbXBpbGVBcz5Db21waWxlQXNDcHA8L0NvbXBpbGVBcz4KICAgICA8L0NsQ29tcGlsZT4KICAgICA8TGluaz4KQEAgLTE2Nyw4ICsxNzcsNyBAQAogICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+CiAgICAgPC9MaW5rPgogICAgIDxQcmVCdWlsZEV2ZW50PgotICAgICAgPENvbW1hbmQ+ZmxleCAtbyAic3JjXFx0aHJpZnRsLmNjIiBzcmMvdGhyaWZ0bC5sbAotYmlzb24gLXkgLW8gInNyY1x0aHJpZnR5LmNjIiAtLWRlZmluZXM9InNyYy90aHJpZnR5LmhoIiBzcmMvdGhyaWZ0eS55eTwvQ29tbWFuZD4KKyAgICAgIDxDb21tYW5kPmZsZXggLW8gInNyY1xcdGhyaWZ0XFx0aHJpZnRsLmNjIiBzcmMvdGhyaWZ0L3RocmlmdGwubGwgJmFtcDsmYW1wOyBiaXNvbiAteSAtbyAic3JjXFx0aHJpZnRcXHRocmlmdHkuY2MiIC0tZGVmaW5lcz0ic3JjXFx0aHJpZnRcXHRocmlmdHkuaGgiIHNyYy90aHJpZnQvdGhyaWZ0eS55eTwvQ29tbWFuZD4KICAgICA8L1ByZUJ1aWxkRXZlbnQ+CiAgIDwvSXRlbURlZmluaXRpb25Hcm91cD4KICAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj4KQEAgLTE3OCw3ICsxODcsNyBAQAogICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4KICAgICAgIDxPcHRpbWl6YXRpb24+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4KICAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5XSU4zMjtNSU5HVztZWV9OT19VTklTVERfSDtfREVCVUc7X0NPTlNPTEU7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgICAgPEZvcmNlZEluY2x1ZGVGaWxlcz5jb25maWcuaDwvRm9yY2VkSW5jbHVkZUZpbGVzPgorICAgICAgPEZvcmNlZEluY2x1ZGVGaWxlcz50aHJpZnRcd2luZG93c1xjb25maWcuaDwvRm9yY2VkSW5jbHVkZUZpbGVzPgogICAgICAgPENvbXBpbGVBcz5Db21waWxlQXNDcHA8L0NvbXBpbGVBcz4KICAgICA8L0NsQ29tcGlsZT4KICAgICA8TGluaz4KQEAgLTE4Niw4ICsxOTUsNyBAQAogICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+CiAgICAgPC9MaW5rPgogICAgIDxQcmVCdWlsZEV2ZW50PgotICAgICAgPENvbW1hbmQ+ZmxleCAtbyAic3JjXHRocmlmdGwuY2MiIHNyYy90aHJpZnRsLmxsCi1iaXNvbiAteSAtbyAic3JjXHRocmlmdHkuY2MiIC0tZGVmaW5lcz0ic3JjL3RocmlmdHkuaGgiIHNyYy90aHJpZnR5Lnl5PC9Db21tYW5kPgorICAgICAgPENvbW1hbmQ+ZmxleCAtbyAic3JjXFx0aHJpZnRcXHRocmlmdGwuY2MiIHNyYy90aHJpZnQvdGhyaWZ0bC5sbCAmYW1wOyZhbXA7IGJpc29uIC15IC1vICJzcmNcXHRocmlmdFxcdGhyaWZ0eS5jYyIgLS1kZWZpbmVzPSJzcmNcXHRocmlmdFxcdGhyaWZ0eS5oaCIgc3JjL3RocmlmdC90aHJpZnR5Lnl5PC9Db21tYW5kPgogICAgIDwvUHJlQnVpbGRFdmVudD4KICAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPgogICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4KQEAgLTE5OSw4ICsyMDcsOSBAQAogICAgICAgPEZ1bmN0aW9uTGV2ZWxMaW5raW5nPnRydWU8L0Z1bmN0aW9uTGV2ZWxMaW5raW5nPgogICAgICAgPEludHJpbnNpY0Z1bmN0aW9ucz50cnVlPC9JbnRyaW5zaWNGdW5jdGlvbnM+CiAgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7TUlOR1c7WVlfTk9fVU5JU1REX0g7TkRFQlVHO19DT05TT0xFOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KLSAgICAgIDxGb3JjZWRJbmNsdWRlRmlsZXM+Y29uZmlnLmg8L0ZvcmNlZEluY2x1ZGVGaWxlcz4KKyAgICAgIDxGb3JjZWRJbmNsdWRlRmlsZXM+dGhyaWZ0XHdpbmRvd3NcY29uZmlnLmg8L0ZvcmNlZEluY2x1ZGVGaWxlcz4KICAgICAgIDxDb21waWxlQXM+Q29tcGlsZUFzQ3BwPC9Db21waWxlQXM+CisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZDwvUnVudGltZUxpYnJhcnk+CiAgICAgPC9DbENvbXBpbGU+CiAgICAgPExpbms+CiAgICAgICA8U3ViU3lzdGVtPkNvbnNvbGU8L1N1YlN5c3RlbT4KQEAgLTIwOSw4ICsyMTgsNyBAQAogICAgICAgPE9wdGltaXplUmVmZXJlbmNlcz50cnVlPC9PcHRpbWl6ZVJlZmVyZW5jZXM+CiAgICAgPC9MaW5rPgogICAgIDxQcmVCdWlsZEV2ZW50PgotICAgICAgPENvbW1hbmQ+ZmxleCAtbyAic3JjXHRocmlmdGwuY2MiIHNyYy90aHJpZnRsLmxsCi1iaXNvbiAteSAtbyAic3JjXHRocmlmdHkuY2MiIC0tZGVmaW5lcz0ic3JjL3RocmlmdHkuaGgiIHNyYy90aHJpZnR5Lnl5PC9Db21tYW5kPgorICAgICAgPENvbW1hbmQ+ZmxleCAtbyAic3JjXFx0aHJpZnRcXHRocmlmdGwuY2MiIHNyYy90aHJpZnQvdGhyaWZ0bC5sbCAmYW1wOyZhbXA7IGJpc29uIC15IC1vICJzcmNcXHRocmlmdFxcdGhyaWZ0eS5jYyIgLS1kZWZpbmVzPSJzcmNcXHRocmlmdFxcdGhyaWZ0eS5oaCIgc3JjL3RocmlmdC90aHJpZnR5Lnl5PC9Db21tYW5kPgogICAgIDwvUHJlQnVpbGRFdmVudD4KICAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPgogICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+CkBAIC0yMjIsOCArMjMwLDkgQEAKICAgICAgIDxGdW5jdGlvbkxldmVsTGlua2luZz50cnVlPC9GdW5jdGlvbkxldmVsTGlua2luZz4KICAgICAgIDxJbnRyaW5zaWNGdW5jdGlvbnM+dHJ1ZTwvSW50cmluc2ljRnVuY3Rpb25zPgogICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPldJTjMyO01JTkdXO1lZX05PX1VOSVNURF9IO05ERUJVRztfQ09OU09MRTslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+Ci0gICAgICA8Rm9yY2VkSW5jbHVkZUZpbGVzPmNvbmZpZy5oPC9Gb3JjZWRJbmNsdWRlRmlsZXM+CisgICAgICA8Rm9yY2VkSW5jbHVkZUZpbGVzPnRocmlmdFx3aW5kb3dzXGNvbmZpZy5oPC9Gb3JjZWRJbmNsdWRlRmlsZXM+CiAgICAgICA8Q29tcGlsZUFzPkNvbXBpbGVBc0NwcDwvQ29tcGlsZUFzPgorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWQ8L1J1bnRpbWVMaWJyYXJ5PgogICAgIDwvQ2xDb21waWxlPgogICAgIDxMaW5rPgogICAgICAgPFN1YlN5c3RlbT5Db25zb2xlPC9TdWJTeXN0ZW0+CkBAIC0yMzIsOCArMjQxLDcgQEAKICAgICAgIDxPcHRpbWl6ZVJlZmVyZW5jZXM+dHJ1ZTwvT3B0aW1pemVSZWZlcmVuY2VzPgogICAgIDwvTGluaz4KICAgICA8UHJlQnVpbGRFdmVudD4KLSAgICAgIDxDb21tYW5kPmZsZXggLW8gInNyY1x0aHJpZnRsLmNjIiBzcmMvdGhyaWZ0bC5sbAotYmlzb24gLXkgLW8gInNyY1x0aHJpZnR5LmNjIiAtLWRlZmluZXM9InNyYy90aHJpZnR5LmhoIiBzcmMvdGhyaWZ0eS55eTwvQ29tbWFuZD4KKyAgICAgIDxDb21tYW5kPmZsZXggLW8gInNyY1xcdGhyaWZ0XFx0aHJpZnRsLmNjIiBzcmMvdGhyaWZ0L3RocmlmdGwubGwgJmFtcDsmYW1wOyBiaXNvbiAteSAtbyAic3JjXFx0aHJpZnRcXHRocmlmdHkuY2MiIC0tZGVmaW5lcz0ic3JjXFx0aHJpZnRcXHRocmlmdHkuaGgiIHNyYy90aHJpZnQvdGhyaWZ0eS55eTwvQ29tbWFuZD4KICAgICA8L1ByZUJ1aWxkRXZlbnQ+CiAgIDwvSXRlbURlZmluaXRpb25Hcm91cD4KICAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpXE1pY3Jvc29mdC5DcHAudGFyZ2V0cyIgLz4KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9jb21waWxlci52Y3hwcm9qLmZpbHRlcnMgYi9jb21waWxlci9jcHAvY29tcGlsZXIudmN4cHJvai5maWx0ZXJzCmluZGV4IGIzMTkxOGUuLmI5Njg2NWIgMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL2NwcC9jb21waWxlci52Y3hwcm9qLmZpbHRlcnMKKysrIGIvY29tcGlsZXIvY3BwL2NvbXBpbGVyLnZjeHByb2ouZmlsdGVycwpAQCAtMSw2ICsxLDcgQEAKIO+7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+CiA8UHJvamVjdCBUb29sc1ZlcnNpb249IjQuMCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+CiAgIDxJdGVtR3JvdXA+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcYXVkaXRcdF9hdWRpdC5oIiAvPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfZ2VuZXJhdG9yLmgiPgogICAgICAgPEZpbHRlcj5nZW5lcmF0ZTwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgpAQCAtMTUsNyArMTYsNiBAQAogICAgIDwvQ2xJbmNsdWRlPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXGdsb2JhbHMuaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1xtYWluLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcbWQ1LmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNccGFyc2VcdF9iYXNlX3R5cGUuaCI+CiAgICAgICA8RmlsdGVyPnBhcnNlPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+CkBAIC05MSw2ICs5MSw3IEBACiAgICAgPC9GaWx0ZXI+CiAgIDwvSXRlbUdyb3VwPgogICA8SXRlbUdyb3VwPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGF1ZGl0XHRfYXVkaXQuY3BwIi8+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9hczNfZ2VuZXJhdG9yLmNjIj4KICAgICAgIDxGaWx0ZXI+Z2VuZXJhdGU8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KQEAgLTEwOSw2ICsxMTAsOSBAQAogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfZF9nZW5lcmF0b3IuY2MiPgogICAgICAgPEZpbHRlcj5nZW5lcmF0ZTwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfZGFydF9nZW5lcmF0b3IuY2MiPgorICAgICAgPEZpbHRlcj5nZW5lcmF0ZTwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfZGVscGhpX2dlbmVyYXRvci5jYyI+CiAgICAgICA8RmlsdGVyPmdlbmVyYXRlPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+CkBAIC0xMjQsNiArMTI4LDkgQEAKICAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X2d2X2dlbmVyYXRvci5jYyI+CiAgICAgICA8RmlsdGVyPmdlbmVyYXRlPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9oYXhlX2dlbmVyYXRvci5jYyI+CisgICAgICA8RmlsdGVyPmdlbmVyYXRlPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9oc19nZW5lcmF0b3IuY2MiPgogICAgICAgPEZpbHRlcj5nZW5lcmF0ZTwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgpAQCAtMTU0LDE0ICsxNjEsMjIgQEAKICAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X3JiX2dlbmVyYXRvci5jYyI+CiAgICAgICA8RmlsdGVyPmdlbmVyYXRlPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9yc19nZW5lcmF0b3IuY2MiPgorICAgICAgPEZpbHRlcj5nZW5lcmF0ZTwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfc3RfZ2VuZXJhdG9yLmNjIj4KICAgICAgIDxGaWx0ZXI+Z2VuZXJhdGU8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X3N3aWZ0X2dlbmVyYXRvci5jYyI+CisgICAgICA8RmlsdGVyPmdlbmVyYXRlPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF94c2RfZ2VuZXJhdG9yLmNjIj4KICAgICAgIDxGaWx0ZXI+Z2VuZXJhdGU8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X3htbF9nZW5lcmF0b3IuY2MiPgorICAgICAgPEZpbHRlcj5nZW5lcmF0ZTwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXG1haW4uY2MiIC8+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcbWQ1LmMiIC8+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNccGFyc2VccGFyc2UuY2MiPgogICAgICAgPEZpbHRlcj5wYXJzZTwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgpAQCAtMTcwLDkgKzE4NSwxNSBAQAogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHBhcnNlXHRfdHlwZWRlZi5jYyI+CiAgICAgICA8RmlsdGVyPnBhcnNlPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9qc29uX2dlbmVyYXRvci5jYyI+CisgICAgICA8RmlsdGVyPmdlbmVyYXRlPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9sdWFfZ2VuZXJhdG9yLmNjIj4KKyAgICAgIDxGaWx0ZXI+Z2VuZXJhdGU8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KICAgPC9JdGVtR3JvdXA+CiAgIDxJdGVtR3JvdXA+CiAgICAgPE5vbmUgSW5jbHVkZT0ic3JjXHRocmlmdGwubGwiIC8+CiAgICAgPE5vbmUgSW5jbHVkZT0ic3JjXHRocmlmdHkueXkiIC8+CiAgIDwvSXRlbUdyb3VwPgotPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKzwvUHJvamVjdD4KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvTWFrZWZpbGUuYW0gYi9jb21waWxlci9jcHAvc3JjL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjMmM1Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsODcgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIworIyBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgorIyBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgorIyBkZXRhaWxzLgorCitBVVRPTUFLRV9PUFRJT05TID0gc3ViZGlyLW9iamVjdHMKKworQU1fWUZMQUdTID0gLWQKKworQlVJTFRfU09VUkNFUyA9IHRocmlmdC90aHJpZnR5LmNjCisKK25vaW5zdF9MSUJSQVJJRVMgPSB0aHJpZnQvbGlicGFyc2UuYQorCit0aHJpZnRfbGlicGFyc2VfYV9DUFBGTEFHUyA9IC1JJChzcmNkaXIpCit0aHJpZnRfbGlicGFyc2VfYV9DWFhGTEFHUyA9IC1XYWxsIC1Xbm8tc2lnbi1jb21wYXJlIC1Xbm8tdW51c2VkCisKK3RocmlmdF9saWJwYXJzZV9hX1NPVVJDRVMgPSB0aHJpZnQvdGhyaWZ0eS55eSBcCisgICAgICAgICAgICAgICAgICAgICB0aHJpZnQvdGhyaWZ0bC5sbAorCitjbGVhbi1sb2NhbDoKKwkkKFJNKSB0aHJpZnQvdGhyaWZ0bC5jYyB0aHJpZnQvdGhyaWZ0eS5jYyB0aHJpZnQvdGhyaWZ0eS5oIHRocmlmdC90aHJpZnR5LmhoCisKK2lmIFdJVEhfUExVR0lOCitub2luc3RfUFJPR1JBTVMgPSB0aHJpZnQvdGhyaWZ0LWJvb3RzdHJhcAorCit0aHJpZnRfdGhyaWZ0X2Jvb3RzdHJhcF9TT1VSQ0VTID0gXAorICAgICAgICAgICAgICAgICB0aHJpZnQvY29tbW9uLmggXAorICAgICAgICAgICAgICAgICB0aHJpZnQvY29tbW9uLmNjIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L2F1ZGl0L3RfYXVkaXQuaCBcCisgICAgICAgICAgICAgICAgIHRocmlmdC9hdWRpdC90X2F1ZGl0LmNwcCBcCisgICAgICAgICAgICAgICAgIHRocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgIHRocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvcl9yZWdpc3RyeS5oIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L2dsb2JhbHMuaCBcCisgICAgICAgICAgICAgICAgIHRocmlmdC9wbGF0Zm9ybS5oIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L2xvZ2dpbmcuaCBcCisgICAgICAgICAgICAgICAgIHRocmlmdC9wYXJzZS90X2RvYy5oIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L3BhcnNlL3RfdHlwZS5oIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L3BhcnNlL3RfYmFzZV90eXBlLmggXAorICAgICAgICAgICAgICAgICB0aHJpZnQvcGFyc2UvdF9lbnVtLmggXAorICAgICAgICAgICAgICAgICB0aHJpZnQvcGFyc2UvdF9lbnVtX3ZhbHVlLmggXAorICAgICAgICAgICAgICAgICB0aHJpZnQvcGFyc2UvdF90eXBlZGVmLmggXAorICAgICAgICAgICAgICAgICB0aHJpZnQvcGFyc2UvdF90eXBlZGVmLmNjIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L3BhcnNlL3RfY29udGFpbmVyLmggXAorICAgICAgICAgICAgICAgICB0aHJpZnQvcGFyc2UvdF9saXN0LmggXAorICAgICAgICAgICAgICAgICB0aHJpZnQvcGFyc2UvdF9zZXQuaCBcCisgICAgICAgICAgICAgICAgIHRocmlmdC9wYXJzZS90X21hcC5oIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L3BhcnNlL3Rfc3RydWN0LmggXAorICAgICAgICAgICAgICAgICB0aHJpZnQvcGFyc2UvdF9maWVsZC5oIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L3BhcnNlL3Rfc2VydmljZS5oIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L3BhcnNlL3RfZnVuY3Rpb24uaCBcCisgICAgICAgICAgICAgICAgIHRocmlmdC9wYXJzZS90X3Byb2dyYW0uaCBcCisgICAgICAgICAgICAgICAgIHRocmlmdC9wYXJzZS90X3Njb3BlLmggXAorICAgICAgICAgICAgICAgICB0aHJpZnQvcGFyc2UvdF9jb25zdC5oIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L3BhcnNlL3RfY29uc3RfdmFsdWUuaCBcCisgICAgICAgICAgICAgICAgIHRocmlmdC9wYXJzZS9wYXJzZS5jYyBcCisgICAgICAgICAgICAgICAgIHRocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvci5oIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L2dlbmVyYXRlL3RfaHRtbF9nZW5lcmF0b3IuaCBcCisgICAgICAgICAgICAgICAgIHRocmlmdC93aW5kb3dzL2NvbmZpZy5oIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L3ZlcnNpb24uaCBcCisgICAgICAgICAgICAgICAgIHRocmlmdC9nZW5lcmF0ZS90X2NwcF9nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICB0aHJpZnQvbWFpbi5oIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L21haW4uY2MKKworbWFpbi5jYzogdmVyc2lvbi5oCisKK3RocmlmdF90aHJpZnRfYm9vdHN0cmFwX0NYWEZMQUdTID0gLVdhbGwgLVdleHRyYSAtcGVkYW50aWMKK3RocmlmdF90aHJpZnRfYm9vdHN0cmFwX0xEQUREID0gQExFWExJQkAgdGhyaWZ0L2xpYnBhcnNlLmEKK2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfYXMzX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9hczNfZ2VuZXJhdG9yLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODRhYjBkLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9hczNfZ2VuZXJhdG9yLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjcyOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpbmNsdWRlIDxjY3R5cGU+Ci0KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KLQotI2luY2x1ZGUgInBsYXRmb3JtLmgiCi0jaW5jbHVkZSAidF9vb3BfZ2VuZXJhdG9yLmgiCi0KLXVzaW5nIHN0ZDo6bWFwOwotdXNpbmcgc3RkOjpvZnN0cmVhbTsKLXVzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKLXVzaW5nIHN0ZDo6c3RyaW5nOwotdXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07Ci11c2luZyBzdGQ6OnZlY3RvcjsKLQotc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsID0gIlxuIjsgIC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKLQotLyoqCi0gKiBBUzMgY29kZSBnZW5lcmF0b3IuCi0gKgotICovCi1jbGFzcyB0X2FzM19nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKLSBwdWJsaWM6Ci0gIHRfYXMzX2dlbmVyYXRvcigKLSAgICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSwKLSAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAotICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCi0gICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkKLSAgewotICAgICh2b2lkKSBvcHRpb25fc3RyaW5nOwotICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7Ci0gICAgCi0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoImJpbmRhYmxlIik7Ci0gICAgYmluZGFibGVfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotICAgIAotICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLWFzMyI7Ci0gIH0KLQotICAvKioKLSAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcwotICAgKi8KLQotICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7Ci0gIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyk7Ci0KLSAgLyoqCi0gICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmICh0X3R5cGVkZWYqICB0dHlwZWRlZik7Ci0gIHZvaWQgZ2VuZXJhdGVfZW51bSAgICAodF9lbnVtKiAgICAgdGVudW0pOwotICB2b2lkIGdlbmVyYXRlX3N0cnVjdCAgKHRfc3RydWN0KiAgIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiAgIHR4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZSAodF9zZXJ2aWNlKiAgdHNlcnZpY2UpOwotCi0gIHZvaWQgcHJpbnRfY29uc3RfdmFsdWUoc3RkOjpvZnN0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlLCBib29sIGluX3N0YXRpYywgYm9vbCBkZWZ2YWw9ZmFsc2UpOwotICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUob2ZzdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFNlcnZpY2UtbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9hczNfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9hczNfc3RydWN0X2RlZmluaXRpb24oc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc194Y2VwdGlvbj1mYWxzZSwgYm9vbCBpbl9jbGFzcz1mYWxzZSwgYm9vbCBpc19yZXN1bHQ9ZmFsc2UpOwotICAvL3JlbW92ZWQgLS0gZXF1YWxpdHksY29tcGFyZV90bwotICB2b2lkIGdlbmVyYXRlX2FzM19zdHJ1Y3RfcmVhZGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2FzM192YWxpZGF0b3Ioc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfYXMzX3N0cnVjdF9yZXN1bHRfd3JpdGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2FzM19zdHJ1Y3Rfd3JpdGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2FzM19zdHJ1Y3RfdG9zdHJpbmcoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBiaW5kYWJsZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfYXMzX21ldGFfZGF0YV9tYXAoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlKTsKLSAgc3RkOjpzdHJpbmcgZ2V0X2FzM190eXBlX3N0cmluZyh0X3R5cGUqIHR5cGUpOwotICB2b2lkIGdlbmVyYXRlX3JlZmxlY3Rpb25fc2V0dGVycyhzdGQ6Om9zdHJpbmdzdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlLCBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lLCBzdGQ6OnN0cmluZyBjYXBfbmFtZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfcmVmbGVjdGlvbl9nZXR0ZXJzKHN0ZDo6b3N0cmluZ3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUsIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUsIHN0ZDo6c3RyaW5nIGNhcF9uYW1lKTsKLSAgdm9pZCBnZW5lcmF0ZV9nZW5lcmljX2ZpZWxkX2dldHRlcnNfc2V0dGVycyhzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9nZW5lcmljX2lzc2V0X21ldGhvZChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9hczNfYmVhbl9ib2lsZXJwbGF0ZShzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGJpbmRhYmxlKTsKLQotICB2b2lkIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLSAgc3RkOjpzdHJpbmcgZ2V0X2NhcF9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpOwotICBzdGQ6OnN0cmluZyBnZW5lcmF0ZV9pc3NldF9jaGVjayh0X2ZpZWxkKiBmaWVsZCk7Ci0gIHN0ZDo6c3RyaW5nIGdlbmVyYXRlX2lzc2V0X2NoZWNrKHN0ZDo6c3RyaW5nIGZpZWxkKTsKLSAgdm9pZCBnZW5lcmF0ZV9pc3NldF9zZXQob2ZzdHJlYW0mIG91dCwgdF9maWVsZCogZmllbGQpOwotICAvL3JlbW92ZWQgc3RkOjpzdHJpbmcgaXNzZXRfZmllbGRfaWQodF9maWVsZCogZmllbGQpOwotICAKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzICAgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50ICAgICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlciAgICAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbiAgKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0gIAotICAvKioKLSAgICogU2VyaWFsaXphdGlvbiBjb25zdHJ1Y3RzCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQgICAgICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiAgICB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0ICAgICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogICB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lciAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiAgICAgdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogICAgICB0c2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50ICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqICAgICAgdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogICAgIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZCAgICAgICAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogICAgdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3QgICAgICAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqICAgdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyICAgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogICAgIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudCAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqICAgICAgdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGl0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBtYXApOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50ICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogICAgICB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlcik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50ICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogICAgIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlcik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9hczNfZG9jICAgICAgICAgICAgICAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9kb2MqICAgICB0ZG9jKTsKLQotICB2b2lkIGdlbmVyYXRlX2FzM19kb2MgICAgICAgICAgICAgICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZG9jKTsKLQotICAvKioKLSAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKLSAgICovCi0KLSAgc3RkOjpzdHJpbmcgYXMzX3BhY2thZ2UoKTsKLSAgc3RkOjpzdHJpbmcgYXMzX3R5cGVfaW1wb3J0cygpOwotICBzdGQ6OnN0cmluZyBhczNfdGhyaWZ0X2ltcG9ydHMoKTsKLSAgc3RkOjpzdHJpbmcgYXMzX3RocmlmdF9nZW5faW1wb3J0cyh0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nJiBpbXBvcnRzKTsgCi0gIHN0ZDo6c3RyaW5nIGFzM190aHJpZnRfZ2VuX2ltcG9ydHModF9zZXJ2aWNlKiB0c2VydmljZSk7IAotICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBpbl9jb250YWluZXI9ZmFsc2UsIGJvb2wgaW5faW5pdD1mYWxzZSk7Ci0gIHN0ZDo6c3RyaW5nIGJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlKiB0YmFzZSwgYm9vbCBpbl9jb250YWluZXI9ZmFsc2UpOwotICBzdGQ6OnN0cmluZyBkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0PWZhbHNlKTsKLSAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLSAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHN0ZDo6c3RyaW5nIHR5cGVfdG9fZW51bSh0X3R5cGUqIHR0eXBlKTsKLSAgc3RkOjpzdHJpbmcgZ2V0X2VudW1fY2xhc3NfbmFtZSh0X3R5cGUqIHR5cGUpOwotCi0gIGJvb2wgdHlwZV9jYW5fYmVfbnVsbCh0X3R5cGUqIHR0eXBlKSB7Ci0gICAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKLQotICAgIHJldHVybgotICAgICAgdHR5cGUtPmlzX2NvbnRhaW5lcigpIHx8Ci0gICAgICB0dHlwZS0+aXNfc3RydWN0KCkgfHwKLSAgICAgIHR0eXBlLT5pc194Y2VwdGlvbigpIHx8Ci0gICAgICB0dHlwZS0+aXNfc3RyaW5nKCk7Ci0gIH0KLQotICBzdGQ6OnN0cmluZyBjb25zdGFudF9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpOwotCi0gcHJpdmF0ZToKLQotICAvKioKLSAgICogRmlsZSBzdHJlYW1zCi0gICAqLwotCi0gIHN0ZDo6c3RyaW5nIHBhY2thZ2VfbmFtZV87Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9zZXJ2aWNlXzsKLSAgc3RkOjpzdHJpbmcgcGFja2FnZV9kaXJfOwotICAKLSAgYm9vbCBiaW5kYWJsZV87IAotfTsKLQotCi0vKioKLSAqIFByZXBhcmVzIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0Ci0gKiBzdHJlYW1zLgotICoKLSAqIEBwYXJhbSB0cHJvZ3JhbSBUaGUgcHJvZ3JhbSB0byBnZW5lcmF0ZQotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQotICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOwotICBwYWNrYWdlX25hbWVfID0gcHJvZ3JhbV8tPmdldF9uYW1lc3BhY2UoImFzMyIpOwotCi0gIHN0cmluZyBkaXIgPSBwYWNrYWdlX25hbWVfOwotICBzdHJpbmcgc3ViZGlyID0gZ2V0X291dF9kaXIoKTsKLSAgc3RyaW5nOjpzaXplX3R5cGUgbG9jOwotICB3aGlsZSAoKGxvYyA9IGRpci5maW5kKCIuIikpICE9IHN0cmluZzo6bnBvcykgewotICAgIHN1YmRpciA9IHN1YmRpciArICIvIiArIGRpci5zdWJzdHIoMCwgbG9jKTsKLSAgICBNS0RJUihzdWJkaXIuY19zdHIoKSk7Ci0gICAgZGlyID0gZGlyLnN1YnN0cihsb2MrMSk7Ci0gIH0KLSAgaWYgKGRpci5zaXplKCkgPiAwKSB7Ci0gICAgc3ViZGlyID0gc3ViZGlyICsgIi8iICsgZGlyOwotICAgIE1LRElSKHN1YmRpci5jX3N0cigpKTsKLSAgfQotCi0gIHBhY2thZ2VfZGlyXyA9IHN1YmRpcjsKLX0KLQotLyoqCi0gKiBQYWNrYWdlcyB0aGUgZ2VuZXJhdGVkIGZpbGUKLSAqCi0gKiBAcmV0dXJuIFN0cmluZyBvZiB0aGUgcGFja2FnZSwgaS5lLiAicGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdGRlbW87IgotICovCi1zdHJpbmcgdF9hczNfZ2VuZXJhdG9yOjphczNfcGFja2FnZSgpIHsKLSAgaWYgKCFwYWNrYWdlX25hbWVfLmVtcHR5KCkpIHsKLSAgICByZXR1cm4gc3RyaW5nKCJwYWNrYWdlICIpICsgcGFja2FnZV9uYW1lXyArICIgIjsKLSAgfQotICByZXR1cm4gInBhY2thZ2UgIjsKLX0KLQotLyoqCi0gKiBQcmludHMgc3RhbmRhcmQgYXMzIGltcG9ydHMKLSAqCi0gKiBAcmV0dXJuIExpc3Qgb2YgaW1wb3J0cyBmb3IgQXMzIHR5cGVzIHRoYXQgYXJlIHVzZWQgaW4gaGVyZQotICovCi1zdHJpbmcgdF9hczNfZ2VuZXJhdG9yOjphczNfdHlwZV9pbXBvcnRzKCkgewotICByZXR1cm4KLSAgICBzdHJpbmcoKSArCi0gICAgImltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5TZXQ7XG4iICsKLSAgICAiaW1wb3J0IGZsYXNoLnV0aWxzLkJ5dGVBcnJheTtcbiIgKwotICAgICJpbXBvcnQgZmxhc2gudXRpbHMuRGljdGlvbmFyeTtcblxuIjsKLX0KLQotLyoqCi0gKiBQcmludHMgc3RhbmRhcmQgYXMzIGltcG9ydHMKLSAqCi0gKiBAcmV0dXJuIExpc3Qgb2YgaW1wb3J0cyBuZWNlc3NhcnkgZm9yIHRocmlmdAotICovCi1zdHJpbmcgdF9hczNfZ2VuZXJhdG9yOjphczNfdGhyaWZ0X2ltcG9ydHMoKSB7Ci0gIHJldHVybgotICAgIHN0cmluZygpICsKLSAgICAiaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0Lio7XG4iICsKLSAgICAiaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS4qO1xuIiArCi0gICAgImltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC4qO1xuXG4iOwotfQotCi0vKioKLSAqIFByaW50cyBpbXBvcnRzIG5lZWRlZCBmb3IgYSBnaXZlbiB0eXBlCi0gKgotICogQHJldHVybiBMaXN0IG9mIGltcG9ydHMgbmVjZXNzYXJ5IGZvciBhIGdpdmVuIHRfc3RydWN0Ci0gKi8KLXN0cmluZyB0X2FzM19nZW5lcmF0b3I6OmFzM190aHJpZnRfZ2VuX2ltcG9ydHModF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyYgaW1wb3J0cykgewotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0KLSAgLy9Gb3IgZWFjaCB0eXBlIGNoZWNrIGlmIGl0IGlzIGZyb20gYSBkaWZmZXJuZXQgbmFtZXNwYWNlCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSAoKm1faXRlciktPmdldF90eXBlKCktPmdldF9wcm9ncmFtKCk7Ci0gICAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7Ci0gICAgICBzdHJpbmcgcGFja2FnZSA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2UoImFzMyIpOwotICAgICAgaWYgKCFwYWNrYWdlLmVtcHR5KCkpIHsKLSAgICAgICAgaWYgKGltcG9ydHMuZmluZChwYWNrYWdlICsgIi4iICsgKCptX2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpKSA9PSBzdHJpbmc6Om5wb3MpIHsKLSAgICAgICAgICBpbXBvcnRzLmFwcGVuZCgiaW1wb3J0ICIgKyBwYWNrYWdlICsgIi4iICsgKCptX2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpICsgIjtcbiIpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiBpbXBvcnRzOyAgCi19Ci0KLQotLyoqCi0gKiBQcmludHMgaW1wb3J0cyBuZWVkZWQgZm9yIGEgZ2l2ZW4gdHlwZQotICoKLSAqIEByZXR1cm4gTGlzdCBvZiBpbXBvcnRzIG5lY2Vzc2FyeSBmb3IgYSBnaXZlbiB0X3NlcnZpY2UKLSAqLwotc3RyaW5nIHRfYXMzX2dlbmVyYXRvcjo6YXMzX3RocmlmdF9nZW5faW1wb3J0cyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBpbXBvcnRzOwotICBjb25zdCB2ZWN0b3I8dF9mdW5jdGlvbio+JiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgLy9Gb3IgZWFjaCB0eXBlIGNoZWNrIGlmIGl0IGlzIGZyb20gYSBkaWZmZXJuZXQgbmFtZXNwYWNlCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5nZXRfcHJvZ3JhbSgpOwotICAgIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgewotICAgICAgc3RyaW5nIHBhY2thZ2UgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJhczMiKTsKLSAgICAgIGlmICghcGFja2FnZS5lbXB0eSgpKSB7Ci0gICAgICAgIGlmIChpbXBvcnRzLmZpbmQocGFja2FnZSArICIuIiArICgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+Z2V0X25hbWUoKSkgPT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgICAgICAgaW1wb3J0cy5hcHBlbmQoImltcG9ydCAiICsgcGFja2FnZSArICIuIiArICgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+Z2V0X25hbWUoKSArICI7XG4iKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIGFzM190aHJpZnRfZ2VuX2ltcG9ydHMoKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpLCBpbXBvcnRzKTsgICAgICAKLSAgICBhczNfdGhyaWZ0X2dlbl9pbXBvcnRzKCgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpLCBpbXBvcnRzKTsgICAgICAKLQotICB9Ci0gCi0gIHJldHVybiBpbXBvcnRzOwotCi19Ci0KLS8qKgotICogTm90aGluZyBpbiBBczMKLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHt9Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgdHlwZWRlZi4gVGhpcyBpcyBub3QgZG9uZSBpbiBBczMsIHNpbmNlIGl0IGRvZXMKLSAqIG5vdCBzdXBwb3J0IGFyYml0cmFyeSBuYW1lIHJlcGxhY2VtZW50cywgYW5kIGl0J2QgYmUgYSB3YWNreSB3YXN0ZQotICogb2Ygb3ZlcmhlYWQgdG8gbWFrZSB3cmFwcGVyIGNsYXNzZXMuCi0gKgotICogQHBhcmFtIHR0eXBlZGVmIFRoZSB0eXBlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgewotICAodm9pZCkgdHR5cGVkZWY7Ci19Ci0KLS8qKgotICogRW51bXMgYXJlIGEgY2xhc3Mgd2l0aCBhIHNldCBvZiBzdGF0aWMgY29uc3RhbnRzLgotICoKLSAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgewotICAvLyBNYWtlIG91dHB1dCBmaWxlCi0gIHN0cmluZyBmX2VudW1fbmFtZSA9IHBhY2thZ2VfZGlyXysiLyIrKHRlbnVtLT5nZXRfbmFtZSgpKSsiLmFzIjsKLSAgb2ZzdHJlYW0gZl9lbnVtOwotICBmX2VudW0ub3BlbihmX2VudW1fbmFtZS5jX3N0cigpKTsKLQotICAvLyBDb21tZW50IGFuZCBwYWNrYWdlIGl0Ci0gIGZfZW51bSA8PAotICAgIGF1dG9nZW5fY29tbWVudCgpIDw8Ci0gICAgYXMzX3BhY2thZ2UoKSA8PCBlbmRsOwotICAKLSAgc2NvcGVfdXAoZl9lbnVtKTsKLSAgLy8gQWRkIGFzMyBpbXBvcnRzCi0gIGZfZW51bSA8PCBzdHJpbmcoKSArCi0gICJpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuU2V0OyIgPDwgZW5kbCA8PAotICAiaW1wb3J0IGZsYXNoLnV0aWxzLkRpY3Rpb25hcnk7IiA8PCBlbmRsOwotICAKLSAgaW5kZW50KGZfZW51bSkgPDwKLSAgICAicHVibGljIGNsYXNzICIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIiAiOwotICBzY29wZV91cChmX2VudW0pOwotCi0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOwotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOwotICAgIGluZGVudChmX2VudW0pIDw8Ci0gICAgICAicHVibGljIHN0YXRpYyBjb25zdCAiIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PAotICAgICAgIjppbnQgPSAiIDw8IHZhbHVlIDw8ICI7IiA8PCBlbmRsOwotICB9Ci0gIAotICAvLyBDcmVhdGUgYSBzdGF0aWMgU2V0IHdpdGggYWxsIHZhbGlkIHZhbHVlcyBmb3IgdGhpcyBlbnVtCi0gIGZfZW51bSA8PCBlbmRsOwotICAKLSAgaW5kZW50KGZfZW51bSkgPDwgInB1YmxpYyBzdGF0aWMgY29uc3QgVkFMSURfVkFMVUVTOlNldCA9IG5ldyBTZXQoIjsKLSAgaW5kZW50X3VwKCk7Ci0gIGJvb2wgZmlyc3RWYWx1ZSA9IHRydWU7Ci0gIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgLy8gcG9wdWxhdGUgc2V0Ci0gICAgZl9lbnVtIDw8IChmaXJzdFZhbHVlID8gIiIgOiAiLCAiKSA8PCAoKmNfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgZmlyc3RWYWx1ZSA9IGZhbHNlOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGZfZW51bSA8PCAiKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50KGZfZW51bSkgPDwgInB1YmxpYyBzdGF0aWMgY29uc3QgVkFMVUVTX1RPX05BTUVTOkRpY3Rpb25hcnkgPSBuZXcgRGljdGlvbmFyeSgpOyIgPDwgZW5kbDsKLQotICBzY29wZV91cChmX2VudW0pOwotICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgewotICAgIGluZGVudChmX2VudW0pIDw8ICJWQUxVRVNfVE9fTkFNRVNbIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIl0gPSBcIiIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIjsiIDw8IGVuZGw7Ci0gIH0KLSAgZl9lbnVtIDw8IGVuZGw7Ci0gIAotICBzY29wZV9kb3duKGZfZW51bSk7Ci0KLSAgc2NvcGVfZG93bihmX2VudW0pOyAvLyBlbmQgY2xhc3MKLSAgCi0gIHNjb3BlX2Rvd24oZl9lbnVtKTsgLy8gZW5kIHBhY2thZ2UKLSAgCi0gIGZfZW51bS5jbG9zZSgpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIGNsYXNzIHRoYXQgaG9sZHMgYWxsIHRoZSBjb25zdGFudHMuCi0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykgewotICBpZiAoY29uc3RzLmVtcHR5KCkpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IHBhY2thZ2VfZGlyXysgIi8iICsgcHJvZ3JhbV9uYW1lXyArICAiQ29uc3RhbnRzLmFzIjsKLSAgb2ZzdHJlYW0gZl9jb25zdHM7Ci0gIGZfY29uc3RzLm9wZW4oZl9jb25zdHNfbmFtZS5jX3N0cigpKTsKLQotICAvLyBQcmludCBoZWFkZXIKLSAgZl9jb25zdHMgPDwKLSAgICBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBhczNfcGFja2FnZSgpOwotICAKLSAgc2NvcGVfdXAoZl9jb25zdHMpOwotICBmX2NvbnN0cyA8PCBlbmRsOwotICAKLSAgZl9jb25zdHMgPDwgYXMzX3R5cGVfaW1wb3J0cygpOwotCi0gCi0gIAotICBpbmRlbnQoZl9jb25zdHMpIDw8Ci0gICAgInB1YmxpYyBjbGFzcyAiIDw8IHByb2dyYW1fbmFtZV8gPDwgIkNvbnN0YW50cyB7IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIHZlY3Rvcjx0X2NvbnN0Kj46Oml0ZXJhdG9yIGNfaXRlcjsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBwcmludF9jb25zdF92YWx1ZShmX2NvbnN0cywKLSAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF9uYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCksCi0gICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChmX2NvbnN0cykgPDwKLSAgICAifSIgPDwgZW5kbDsKLSAgc2NvcGVfZG93bihmX2NvbnN0cyk7Ci0gIGZfY29uc3RzLmNsb3NlKCk7Ci19Ci0KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpwcmludF9jb25zdF92YWx1ZShzdGQ6Om9mc3RyZWFtJiBvdXQsIHN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlLCBib29sIGluX3N0YXRpYywgYm9vbCBkZWZ2YWwpIHsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0gIAotICBpbmRlbnQob3V0KTsKLSAgaWYgKCFkZWZ2YWwpIHsKLSAgICBvdXQgPDwKLSAgICAoaW5fc3RhdGljID8gInZhciAiIDogInB1YmxpYyBzdGF0aWMgY29uc3QgIik7Ci0gIH0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgc3RyaW5nIHYyID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgdHlwZSwgdmFsdWUpOwotICAgIG91dCA8PCBuYW1lOwotICAgIGlmICghZGVmdmFsKSB7Ci0gICAgICBvdXQgPDwgIjoiIDw8IHR5cGVfbmFtZSh0eXBlKTsKLSAgICB9Ci0gICAgb3V0IDw8ICIgPSAiIDw8IHYyIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgb3V0IDw8IG5hbWU7Ci0gICAgaWYoIWRlZnZhbCkgewotICAgICAgb3V0IDw8ICI6IiA8PCB0eXBlX25hbWUodHlwZSk7Ci0gICAgfQotICAgIG91dCA8PCAiID0gIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBvdXQgPDwgbmFtZSA8PCAiOiIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8ICIoKTsiIDw8IGVuZGw7Ci0gICAgaWYgKCFpbl9zdGF0aWMpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAibmV3IGZ1bmN0aW9uKCk6dm9pZCB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgfQotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOwotICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKLSAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7Ci0gICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7Ci0gICAgICB9Ci0gICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiLiI7Ci0gICAgICBvdXQgPDwgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpIDw8ICIgPSAiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaWYgKCFpbl9zdGF0aWMpIHsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSgpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICBvdXQgPDwgbmFtZTsKLSAgICBpZighZGVmdmFsKXsKLSAgICAgIG91dCA8PCAiOiIgPDwgdHlwZV9uYW1lKHR5cGUpOwotICAgIH0KLSAgICBvdXQgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKLSAgICBpZiAoIWluX3N0YXRpYykgewotICAgICAgaW5kZW50KG91dCkgPDwgInsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJuZXcgZnVuY3Rpb24oKTp2b2lkIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICB9Ci0gICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKLSAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOwotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHN0cmluZyBrZXkgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBrdHlwZSwgdl9pdGVyLT5maXJzdCk7Ci0gICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgdnR5cGUsIHZfaXRlci0+c2Vjb25kKTsKLSAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIlsiIDw8IGtleSA8PCAiXSA9ICIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLSAgICBpZiAoIWluX3N0YXRpYykgewotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9KCk7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0KLSAgICBvdXQgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKLSAgICBvdXQgPDwgbmFtZTsKLSAgICBpZighZGVmdmFsKSB7Ci0gICAgICBvdXQgPDwgIjoiIDw8IHR5cGVfbmFtZSh0eXBlKTsKLSAgICB9Ci0gICAgb3V0IDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8ICIoKTsiIDw8IGVuZGw7Ci0gICAgaWYgKCFpbl9zdGF0aWMpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAibmV3IGZ1bmN0aW9uKCk6dm9pZCB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgfQotICAgIHRfdHlwZSogZXR5cGU7Ci0gICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB9IGVsc2UgewotICAgICAgZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIH0KLSAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKLSAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBldHlwZSwgKnZfaXRlcik7Ci0gICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIuIiA8PCAodHlwZS0+aXNfbGlzdCgpID8gInB1c2giIDogImFkZCIpIDw8ICIoIiA8PCB2YWwgPDwgIik7IiA8PCBlbmRsOwotICAgIH0KLSAgICBpZiAoIWluX3N0YXRpYykgewotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9KCk7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0KLSAgICBvdXQgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIHR5cGUgIiArIHR5cGUtPmdldF9uYW1lKCk7Ci0gIH0KLX0KLQotc3RyaW5nIHRfYXMzX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKG9mc3RyZWFtJiBvdXQsIHN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7Ci0gICh2b2lkKSBuYW1lOwotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIHJlbmRlcjsKLSAgCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICAgIHJlbmRlciA8PCAnIicgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgICByZW5kZXIgPDwgKCh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDApID8gInRydWUiIDogImZhbHNlIik7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgICByZW5kZXIgPDwgIihieXRlKSIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICAgIHJlbmRlciA8PCAiKHNob3J0KSIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICJMIjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKLSAgICAgICAgICAgIHJlbmRlciA8PCAiKGRvdWJsZSkiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgfSBlbHNlIHsKLSAgICBzdHJpbmcgdCA9IHRtcCgidG1wIik7Ci0gICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LCB0LCB0eXBlLCB2YWx1ZSwgdHJ1ZSk7Ci0gICAgcmVuZGVyIDw8IHQ7Ci0gIH0KLSAgCi0gIHJldHVybiByZW5kZXIuc3RyKCk7Ci19Ci0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZGF0YSB0eXBlLiBUaGlzIGlzIGEgY2xhc3MKLSAqIHdpdGggZGF0YSBtZW1iZXJzLCByZWFkKCksIHdyaXRlKCksIGFuZCBhbiBpbm5lciBJc3NldCBjbGFzcy4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICBnZW5lcmF0ZV9hczNfc3RydWN0KHRzdHJ1Y3QsIGZhbHNlKTsKLX0KLQotLyoqCi0gKiBFeGNlcHRpb25zIGFyZSBzdHJ1Y3RzLCBidXQgdGhleSBpbmhlcml0IGZyb20gRXhjZXB0aW9uCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7Ci0gIGdlbmVyYXRlX2FzM19zdHJ1Y3QodHhjZXB0aW9uLCB0cnVlKTsKLX0KLQotCi0vKioKLSAqIEFzMyBzdHJ1Y3QgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2FzM19zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGZpbGUKLSAgc3RyaW5nIGZfc3RydWN0X25hbWUgPSBwYWNrYWdlX2Rpcl8rIi8iKyh0c3RydWN0LT5nZXRfbmFtZSgpKSsiLmFzIjsKLSAgb2ZzdHJlYW0gZl9zdHJ1Y3Q7Ci0gIGZfc3RydWN0Lm9wZW4oZl9zdHJ1Y3RfbmFtZS5jX3N0cigpKTsKLQotICBmX3N0cnVjdCA8PAotICAgIGF1dG9nZW5fY29tbWVudCgpIDw8Ci0gIGFzM19wYWNrYWdlKCk7Ci0gIAotICBzY29wZV91cChmX3N0cnVjdCk7Ci0gIGZfc3RydWN0IDw8IGVuZGw7Ci0gIAotICBzdHJpbmcgaW1wb3J0czsKLQotICBmX3N0cnVjdCA8PAotICAgIGFzM190eXBlX2ltcG9ydHMoKSA8PAotICAgIGFzM190aHJpZnRfaW1wb3J0cygpIDw8IAotICAgIGFzM190aHJpZnRfZ2VuX2ltcG9ydHModHN0cnVjdCwgaW1wb3J0cykgPDwgZW5kbDsKLSAgCi0gIGlmIChiaW5kYWJsZV8gJiYgISBpc19leGNlcHRpb24pIHsKLSAgICBmX3N0cnVjdCA8PCAiaW1wb3J0IGZsYXNoLmV2ZW50cy5FdmVudDsiIDw8IGVuZGwgPDwKLSAgICAiaW1wb3J0IGZsYXNoLmV2ZW50cy5FdmVudERpc3BhdGNoZXI7IiA8PCBlbmRsIDw8Ci0gICAgImltcG9ydCBteC5ldmVudHMuUHJvcGVydHlDaGFuZ2VFdmVudDsiIDw8IGVuZGw7Ci0gIH0KLSAgCi0gIGdlbmVyYXRlX2FzM19zdHJ1Y3RfZGVmaW5pdGlvbihmX3N0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2V4Y2VwdGlvbik7Ci0gIAotICBzY29wZV9kb3duKGZfc3RydWN0KTsgLy8gZW5kIG9mIHBhY2thZ2UKLSAgZl9zdHJ1Y3QuY2xvc2UoKTsKLX0KLQotLyoqCi0gKiBBczMgc3RydWN0IGRlZmluaXRpb24uIFRoaXMgaGFzIHZhcmlvdXMgcGFyYW1ldGVycywgYXMgaXQgY291bGQgYmUKLSAqIGdlbmVyYXRlZCBzdGFuZGFsb25lIG9yIGluc2lkZSBhbm90aGVyIGNsYXNzIGFzIGEgaGVscGVyLiBJZiBpdAotICogaXMgYSBoZWxwZXIgdGhhbiBpdCBpcyBhIHN0YXRpYyBjbGFzcy4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCAgICAgIFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICogQHBhcmFtIGlzX2V4Y2VwdGlvbiBJcyB0aGlzIGFuIGV4Y2VwdGlvbj8KLSAqIEBwYXJhbSBpbl9jbGFzcyAgICAgSWYgaW5zaWRlIGEgY2xhc3MsIG5lZWRzIHRvIGJlIHN0YXRpYyBjbGFzcwotICogQHBhcmFtIGlzX3Jlc3VsdCAgICBJZiB0aGlzIGlzIGEgcmVzdWx0IGl0IG5lZWRzIGEgZGlmZmVyZW50IHdyaXRlcgotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfYXMzX3N0cnVjdF9kZWZpbml0aW9uKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCkgewotICBnZW5lcmF0ZV9hczNfZG9jKG91dCwgdHN0cnVjdCk7Ci0KLSAgYm9vbCBpc19maW5hbCA9ICh0c3RydWN0LT5hbm5vdGF0aW9uc18uZmluZCgiZmluYWwiKSAhPSB0c3RydWN0LT5hbm5vdGF0aW9uc18uZW5kKCkpOwotICBib29sIGJpbmRhYmxlID0gISBpc19leGNlcHRpb24gJiYgISBpbl9jbGFzcyAmJiBiaW5kYWJsZV87Ci0KLSAgaW5kZW50KG91dCkgPDwgKGluX2NsYXNzID8gIiIgOiAicHVibGljICIpIDw8IChpc19maW5hbCA/ICJmaW5hbCAiIDogIiIpIDw8Ci0gICAgICJjbGFzcyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiAiOwotCi0gIGlmIChpc19leGNlcHRpb24pIHsKLSAgICBvdXQgPDwgImV4dGVuZHMgRXJyb3IgIjsKLSAgfQotICBlbHNlIGlmIChiaW5kYWJsZSkgewotICAgIG91dCA8PCAiZXh0ZW5kcyBFdmVudERpc3BhdGNoZXIgIjsKLSAgfQotICBvdXQgPDwgImltcGxlbWVudHMgVEJhc2UgIjsKLQotICBzY29wZV91cChvdXQpOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgInByaXZhdGUgc3RhdGljIGNvbnN0IFNUUlVDVF9ERVNDOlRTdHJ1Y3QgPSBuZXcgVFN0cnVjdChcIiIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiXCIpOyIgPDwgZW5kbDsKLQotICAvLyBNZW1iZXJzIGFyZSBwdWJsaWMgZm9yIC1hczMsIHByaXZhdGUgZm9yIC1hczNiZWFuCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0KLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAicHJpdmF0ZSBzdGF0aWMgY29uc3QgIiA8PCBjb25zdGFudF9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwKLSAgICAgICJfRklFTERfREVTQzpURmllbGQgPSBuZXcgVEZpZWxkKFwiIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiLCAiIDw8Ci0gICAgICB0eXBlX3RvX2VudW0oKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICAoKm1faXRlciktPmdldF9rZXkoKSA8PCAiKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBvdXQgPDwgZW5kbDsKLQotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgZ2VuZXJhdGVfYXMzX2RvYyhvdXQsICptX2l0ZXIpOwotICAgIGluZGVudChvdXQpIDw8ICJwcml2YXRlIHZhciBfIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgKyAiOiIgKyB0eXBlX25hbWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiOyIgPDwgZW5kbDsKLQotICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgc3RhdGljIGNvbnN0ICIgPDwgdXBjYXNlX3N0cmluZygoKm1faXRlciktPmdldF9uYW1lKCkpIDw8ICI6aW50ID0gIiA8PCAoKm1faXRlciktPmdldF9rZXkoKSA8PCAiOyIgPDwgZW5kbDsKLSAgfQotICAKLSAgb3V0IDw8IGVuZGw7Ci0gIAotICAvLyBJbm5lciBJc3NldCBjbGFzcwotICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7Ci0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgICBpZiAoIXR5cGVfY2FuX2JlX251bGwoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSl7Ci0gICAgICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgICAgICJwcml2YXRlIHZhciBfX2lzc2V0XyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI6Qm9vbGVhbiA9IGZhbHNlOyIgPDwgIGVuZGw7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgfQotICAKLSAgb3V0IDw8IGVuZGw7Ci0gIAotICBnZW5lcmF0ZV9hczNfbWV0YV9kYXRhX21hcChvdXQsIHRzdHJ1Y3QpOwotICAKLSAgLy8gU3RhdGljIGluaXRpYWxpemVyIHRvIHBvcHVsYXRlIGdsb2JhbCBjbGFzcyB0byBzdHJ1Y3QgbWV0YWRhdGEgbWFwCi0gIGluZGVudChvdXQpIDw8ICJ7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgIkZpZWxkTWV0YURhdGEuYWRkU3RydWN0TWV0YURhdGFNYXAoIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIiwgbWV0YURhdGFNYXApOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAvLyBEZWZhdWx0IGNvbnN0cnVjdG9yCi0gIGluZGVudChvdXQpIDw8Ci0gICJwdWJsaWMgZnVuY3Rpb24gIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIGlmICgoKm1faXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLl8iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCAoKm1faXRlciktPmdldF92YWx1ZSgpLT5nZXRfaW50ZWdlcigpIDw8ICI7IiA8PAotICAgICAgZW5kbDsKLSAgICB9Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgCi0gIGdlbmVyYXRlX2FzM19iZWFuX2JvaWxlcnBsYXRlKG91dCwgdHN0cnVjdCwgYmluZGFibGUpOwotICBnZW5lcmF0ZV9nZW5lcmljX2ZpZWxkX2dldHRlcnNfc2V0dGVycyhvdXQsIHRzdHJ1Y3QpOwotICBnZW5lcmF0ZV9nZW5lcmljX2lzc2V0X21ldGhvZChvdXQsIHRzdHJ1Y3QpOwotCi0gIGdlbmVyYXRlX2FzM19zdHJ1Y3RfcmVhZGVyKG91dCwgdHN0cnVjdCk7Ci0gIGlmIChpc19yZXN1bHQpIHsKLSAgICBnZW5lcmF0ZV9hczNfc3RydWN0X3Jlc3VsdF93cml0ZXIob3V0LCB0c3RydWN0KTsKLSAgfSBlbHNlIHsKLSAgICBnZW5lcmF0ZV9hczNfc3RydWN0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOwotICB9Ci0gIGdlbmVyYXRlX2FzM19zdHJ1Y3RfdG9zdHJpbmcob3V0LCB0c3RydWN0LCBiaW5kYWJsZSk7Ci0gIGdlbmVyYXRlX2FzM192YWxpZGF0b3Iob3V0LCB0c3RydWN0KTsKLSAgc2NvcGVfZG93bihvdXQpOwotICBvdXQgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbiB0byByZWFkIGFsbCB0aGUgZmllbGRzIG9mIHRoZSBzdHJ1Y3QuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9hczNfc3RydWN0X3JlYWRlcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgInB1YmxpYyBmdW5jdGlvbiByZWFkKGlwcm90OlRQcm90b2NvbCk6dm9pZCB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgLy8gRGVjbGFyZSBzdGFjayB0bXAgdmFyaWFibGVzIGFuZCByZWFkIHN0cnVjdCBoZWFkZXIKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgInZhciBmaWVsZDpURmllbGQ7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImlwcm90LnJlYWRTdHJ1Y3RCZWdpbigpOyIgPDwgZW5kbDsKLQotICAvLyBMb29wIG92ZXIgcmVhZGluZyBpbiBmaWVsZHMKLSAgaW5kZW50KG91dCkgPDwKLSAgICAid2hpbGUgKHRydWUpIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0KLSAgICAvLyBSZWFkIGJlZ2lubmluZyBmaWVsZCBtYXJrZXIKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImZpZWxkID0gaXByb3QucmVhZEZpZWxkQmVnaW4oKTsiIDw8IGVuZGw7Ci0KLSAgICAvLyBDaGVjayBmb3IgZmllbGQgU1RPUCBtYXJrZXIgYW5kIGJyZWFrCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5TVE9QKSB7ICIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImJyZWFrOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAifSIgPDwgZW5kbDsKLQotICAgIC8vIFN3aXRjaCBzdGF0ZW1lbnQgb24gdGhlIGZpZWxkIHdlIGFyZSByZWFkaW5nCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJzd2l0Y2ggKGZpZWxkLmlkKSIgPDwgZW5kbDsKLQotICAgICAgc2NvcGVfdXAob3V0KTsKLQotICAgICAgLy8gR2VuZXJhdGUgZGVzZXJpYWxpemF0aW9uIGNvZGUgZm9yIGtub3duIGNhc2VzCi0gICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAgICJjYXNlICIgPDwgdXBjYXNlX3N0cmluZygoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICI6IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgICAiaWYgKGZpZWxkLnR5cGUgPT0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfdXAoKTsKLQotICAgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJ0aGlzLiIpOwotICAgICAgICBnZW5lcmF0ZV9pc3NldF9zZXQob3V0LCAqZl9pdGVyKTsKLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIn0gZWxzZSB7ICIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIFRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgfQotCi0gICAgICAvLyBJbiB0aGUgZGVmYXVsdCBjYXNlIHdlIHNraXAgdGhlIGZpZWxkCi0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIFRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIGJyZWFrOyIgPDwgZW5kbDsKLQotICAgICAgc2NvcGVfZG93bihvdXQpOwotCi0gICAgLy8gUmVhZCBmaWVsZCBlbmQgbWFya2VyCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJpcHJvdC5yZWFkRmllbGRFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgICBzY29wZV9kb3duKG91dCk7Ci0KLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJpcHJvdC5yZWFkU3RydWN0RW5kKCk7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgCi0gICAgLy8gaW4gbm9uLWJlYW5zIHN0eWxlLCBjaGVjayBmb3IgcmVxdWlyZWQgZmllbGRzIG9mIHByaW1pdGl2ZSB0eXBlCi0gICAgLy8gKHdoaWNoIGNhbiBiZSBjaGVja2VkIGhlcmUgYnV0IG5vdCBpbiB0aGUgZ2VuZXJhbCB2YWxpZGF0ZSBtZXRob2QpCi0gICAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIi8vIGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMgb2YgcHJpbWl0aXZlIHR5cGUsIHdoaWNoIGNhbid0IGJlIGNoZWNrZWQgaW4gdGhlIHZhbGlkYXRlIG1ldGhvZCIgPDwgZW5kbDsKLSAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQgJiYgIXR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSkgewotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKCFfX2lzc2V0XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICB0aHJvdyBuZXcgVFByb3RvY29sRXJyb3IoVFByb3RvY29sRXJyb3IuVU5LTk9XTiwgXCJSZXF1aXJlZCBmaWVsZCAnIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIicgd2FzIG5vdCBmb3VuZCBpbiBzZXJpYWxpemVkIGRhdGEhIFN0cnVjdDogXCIgKyB0b1N0cmluZygpKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBwZXJmb3JtcyB2YXJpb3VzIGNoZWNrcyAoZS5nLiBjaGVjayB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHNldCkKLSAgICBpbmRlbnQob3V0KSA8PCAidmFsaWRhdGUoKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotfQotCi0vLyBnZW5lcmF0ZXMgYXMzIG1ldGhvZCB0byBwZXJmb3JtIHZhcmlvdXMgY2hlY2tzCi0vLyAoZS5nLiBjaGVjayB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHNldCkKLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9hczNfdmFsaWRhdG9yKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCl7Ci0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuY3Rpb24gdmFsaWRhdGUoKTp2b2lkIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOyAgCi0gIAotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIAotICBvdXQgPDwgaW5kZW50KCkgPDwgIi8vIGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMiIDw8IGVuZGw7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKLSAgICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkpIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID09IG51bGwpIHsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBUUHJvdG9jb2xFcnJvcihUUHJvdG9jb2xFcnJvci5VTktOT1dOLCBcIlJlcXVpcmVkIGZpZWxkICciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJyB3YXMgbm90IHByZXNlbnQhIFN0cnVjdDogXCIgKyB0b1N0cmluZygpKTsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgIi8vIGFsYXMsIHdlIGNhbm5vdCBjaGVjayAnIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIicgYmVjYXVzZSBpdCdzIGEgcHJpbWl0aXZlIGFuZCB5b3UgY2hvc2UgdGhlIG5vbi1iZWFucyBnZW5lcmF0b3IuIiA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgLy8gY2hlY2sgdGhhdCBmaWVsZHMgb2YgdHlwZSBlbnVtIGhhdmUgdmFsaWQgdmFsdWVzCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAiLy8gY2hlY2sgdGhhdCBmaWVsZHMgb2YgdHlwZSBlbnVtIGhhdmUgdmFsaWQgdmFsdWVzIiA8PCBlbmRsOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfZmllbGQqIGZpZWxkID0gKCpmX2l0ZXIpOwotICAgIHRfdHlwZSogdHlwZSA9IGZpZWxkLT5nZXRfdHlwZSgpOwotICAgIC8vIGlmIGZpZWxkIGlzIGFuIGVudW0sIGNoZWNrIHRoYXQgaXRzIHZhbHVlIGlzIHZhbGlkCi0gICAgaWYgKHR5cGUtPmlzX2VudW0oKSl7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQpIDw8ICIgJiYgISIgPDwgZ2V0X2VudW1fY2xhc3NfbmFtZSh0eXBlKSA8PCAiLlZBTElEX1ZBTFVFUy5jb250YWlucygiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIpKXsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ0aHJvdyBuZXcgVFByb3RvY29sRXJyb3IoVFByb3RvY29sRXJyb3IuVU5LTk9XTiwgXCJUaGUgZmllbGQgJyIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIicgaGFzIGJlZW4gYXNzaWduZWQgdGhlIGludmFsaWQgdmFsdWUgXCIgKyAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9IAotICB9ICAKLSAgCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gd3JpdGUgYWxsIHRoZSBmaWVsZHMgb2YgdGhlIHN0cnVjdAotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfYXMzX3N0cnVjdF93cml0ZXIob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJwdWJsaWMgZnVuY3Rpb24gd3JpdGUob3Byb3Q6VFByb3RvY29sKTp2b2lkIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICAvLyBwZXJmb3JtcyB2YXJpb3VzIGNoZWNrcyAoZS5nLiBjaGVjayB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHNldCkKLSAgaW5kZW50KG91dCkgPDwgInZhbGlkYXRlKCk7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlU3RydWN0QmVnaW4oU1RSVUNUX0RFU0MpOyIgPDwgZW5kbDsKLQotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGJvb2wgbnVsbF9hbGxvd2VkID0gdHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpOwotICAgIGlmIChudWxsX2FsbG93ZWQpIHsKLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKHRoaXMuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiAhPSBudWxsKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgfQotCi0gICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlRmllbGRCZWdpbigiIDw8IGNvbnN0YW50X25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiX0ZJRUxEX0RFU0MpOyIgPDwgZW5kbDsKLQotICAgIC8vIFdyaXRlIGZpZWxkIGNvbnRlbnRzCi0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMuIik7Ci0KLSAgICAvLyBXcml0ZSBmaWVsZCBjbG9zZXIKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm9wcm90LndyaXRlRmllbGRFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgICBpZiAobnVsbF9hbGxvd2VkKSB7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0gIC8vIFdyaXRlIHRoZSBzdHJ1Y3QgbWFwCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdC53cml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdC53cml0ZVN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gd3JpdGUgYWxsIHRoZSBmaWVsZHMgb2YgdGhlIHN0cnVjdCwKLSAqIHdoaWNoIGlzIGEgZnVuY3Rpb24gcmVzdWx0LiBUaGVzZSBmaWVsZHMgYXJlIG9ubHkgd3JpdHRlbgotICogaWYgdGhleSBhcmUgc2V0IGluIHRoZSBJc3NldCBhcnJheSwgYW5kIG9ubHkgb25lIG9mIHRoZW0KLSAqIGNhbiBiZSBzZXQgYXQgYSB0aW1lLgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfYXMzX3N0cnVjdF9yZXN1bHRfd3JpdGVyKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgInB1YmxpYyBmdW5jdGlvbiB3cml0ZShvcHJvdDpUUHJvdG9jb2wpOnZvaWQgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZVN0cnVjdEJlZ2luKFNUUlVDVF9ERVNDKTsiIDw8IGVuZGw7Ci0KLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgb3V0IDw8Ci0gICAgICAgIGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlmICI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dCA8PCAiIGVsc2UgaWYgIjsKLSAgICB9Ci0KLSAgICBvdXQgPDwgIih0aGlzLiIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKmZfaXRlcikgPDwgIikgeyIgPDwgZW5kbDsKLQotICAgIGluZGVudF91cCgpOwotICAgIAotICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUZpZWxkQmVnaW4oIiA8PCBjb25zdGFudF9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIl9GSUVMRF9ERVNDKTsiIDw8IGVuZGw7Ci0KLSAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJ0aGlzLiIpOwotCi0gICAgLy8gV3JpdGUgZmllbGQgY2xvc2VyCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvcHJvdC53cml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOwotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSI7Ci0gIH0KLSAgLy8gV3JpdGUgdGhlIHN0cnVjdCBtYXAKLSAgb3V0IDw8Ci0gICAgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdC53cml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdC53cml0ZVN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yZWZsZWN0aW9uX2dldHRlcnMob3N0cmluZ3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUsIHN0cmluZyBmaWVsZF9uYW1lLCBzdHJpbmcgY2FwX25hbWUpIHsKLSAgKHZvaWQpIHR5cGU7Ci0gICh2b2lkKSBjYXBfbmFtZTsKLSAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCB1cGNhc2Vfc3RyaW5nKGZpZWxkX25hbWUpIDw8ICI6IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgInJldHVybiB0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLX0KLQotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3JlZmxlY3Rpb25fc2V0dGVycyhvc3RyaW5nc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSwgc3RyaW5nIGZpZWxkX25hbWUsIHN0cmluZyBjYXBfbmFtZSkgewotICAodm9pZCkgdHlwZTsKLSAgKHZvaWQpIGNhcF9uYW1lOwotICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IHVwY2FzZV9zdHJpbmcoZmllbGRfbmFtZSkgPDwgIjoiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAiaWYgKHZhbHVlID09IG51bGwpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHVuc2V0IiA8PCBnZXRfY2FwX25hbWUoZmllbGRfbmFtZSkgPDwgIigpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICB0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID0gdmFsdWU7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgImJyZWFrOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci19Ci0KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nZW5lcmljX2ZpZWxkX2dldHRlcnNfc2V0dGVycyhzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0KLSAgc3RkOjpvc3RyaW5nc3RyZWFtIGdldHRlcl9zdHJlYW07Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBzZXR0ZXJfc3RyZWFtOwotCi0gIC8vIGJ1aWxkIHVwIHRoZSBib2RpZXMgb2YgYm90aCB0aGUgZ2V0dGVyIGFuZCBzZXR0ZXIgYXQgb25jZQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9maWVsZCogZmllbGQgPSAqZl9pdGVyOwotICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUoZmllbGQtPmdldF90eXBlKCkpOwotICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSBmaWVsZC0+Z2V0X25hbWUoKTsKLSAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSA9IGdldF9jYXBfbmFtZShmaWVsZF9uYW1lKTsKLQotICAgIGluZGVudF91cCgpOwotICAgIGdlbmVyYXRlX3JlZmxlY3Rpb25fc2V0dGVycyhzZXR0ZXJfc3RyZWFtLCB0eXBlLCBmaWVsZF9uYW1lLCBjYXBfbmFtZSk7Ci0gICAgZ2VuZXJhdGVfcmVmbGVjdGlvbl9nZXR0ZXJzKGdldHRlcl9zdHJlYW0sIHR5cGUsIGZpZWxkX25hbWUsIGNhcF9uYW1lKTsKLSAgICBpbmRlbnRfZG93bigpOwotICB9Ci0KLQotICAvLyBjcmVhdGUgdGhlIHNldHRlcgotICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIHNldEZpZWxkVmFsdWUoZmllbGRJRDppbnQsIHZhbHVlOiopOnZvaWQgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmllbGRJRCkgeyIgPDwgZW5kbDsKLQotICBvdXQgPDwgc2V0dGVyX3N0cmVhbS5zdHIoKTsKLQotICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKFwiRmllbGQgXCIgKyBmaWVsZElEICsgXCIgZG9lc24ndCBleGlzdCFcIik7IiA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgLy8gY3JlYXRlIHRoZSBnZXR0ZXIKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jdGlvbiBnZXRGaWVsZFZhbHVlKGZpZWxkSUQ6aW50KToqIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKGZpZWxkSUQpIHsiIDw8IGVuZGw7Ci0KLSAgb3V0IDw8IGdldHRlcl9zdHJlYW0uc3RyKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcihcIkZpZWxkIFwiICsgZmllbGRJRCArIFwiIGRvZXNuJ3QgZXhpc3QhXCIpOyIgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotCi0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8vIENyZWF0ZXMgYSBnZW5lcmljIGlzU2V0IG1ldGhvZCB0aGF0IHRha2VzIHRoZSBmaWVsZCBudW1iZXIgYXMgYXJndW1lbnQKLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nZW5lcmljX2lzc2V0X21ldGhvZChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KXsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIC8vIGNyZWF0ZSB0aGUgaXNTZXQgbWV0aG9kCi0gIGluZGVudChvdXQpIDw8ICIvLyBSZXR1cm5zIHRydWUgaWYgZmllbGQgY29ycmVzcG9uZGluZyB0byBmaWVsZElEIGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSB2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZSIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jdGlvbiBpc1NldChmaWVsZElEOmludCk6Qm9vbGVhbiB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmllbGRJRCkgeyIgPDwgZW5kbDsKLQotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfZmllbGQqIGZpZWxkID0gKmZfaXRlcjsKLSAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IHVwY2FzZV9zdHJpbmcoZmllbGQtPmdldF9uYW1lKCkpIDw8ICI6IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjayhmaWVsZCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfQotCi0gIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoXCJGaWVsZCBcIiArIGZpZWxkSUQgKyBcIiBkb2Vzbid0IGV4aXN0IVwiKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXQgb2YgQXMzIEJlYW4gYm9pbGVycGxhdGUgZnVuY3Rpb25zIChzZXR0ZXJzLCBnZXR0ZXJzLCBldGMuKQotICogZm9yIHRoZSBnaXZlbiBzdHJ1Y3QuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9hczNfYmVhbl9ib2lsZXJwbGF0ZShvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgYmluZGFibGUpIHsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfZmllbGQqIGZpZWxkID0gKmZfaXRlcjsKLSAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKGZpZWxkLT5nZXRfdHlwZSgpKTsKLSAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lID0gZmllbGQtPmdldF9uYW1lKCk7Ci0gICAgc3RkOjpzdHJpbmcgY2FwX25hbWUgPSBnZXRfY2FwX25hbWUoZmllbGRfbmFtZSk7Ci0gICAgICAgIAotICAgIC8vIFNpbXBsZSBnZXR0ZXIKLSAgICBnZW5lcmF0ZV9hczNfZG9jKG91dCwgZmllbGQpOwotICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuY3Rpb24gZ2V0ICIgPDwgZmllbGRfbmFtZSA8PCAiKCk6IiA8PAotICAgICAgdHlwZV9uYW1lKHR5cGUpIDw8ICIgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRoaXMuXyIgPDwgZmllbGRfbmFtZSA8PCAiOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgCi0gICAgLy8gU2ltcGxlIHNldHRlcgotICAgIGdlbmVyYXRlX2FzM19kb2Mob3V0LCBmaWVsZCk7Ci0gICAgc3RkOjpzdHJpbmcgcHJvcE5hbWUgPSB0bXAoInRocmlmdFByb3BlcnR5Q2hhbmdlIik7Ci0gICAgaWYgKGJpbmRhYmxlKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiW0JpbmRhYmxlKGV2ZW50PVwiIiA8PCBwcm9wTmFtZSA8PCAiXCIpXSIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jdGlvbiBzZXQgIiA8PCBmaWVsZF9uYW1lIDw8ICIoIiA8PCBmaWVsZF9uYW1lCi0gICAgICA8PCAiOiIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIpOnZvaWQgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAidGhpcy5fIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSAiIDw8IGZpZWxkX25hbWUgPDwgIjsiIDw8Ci0gICAgZW5kbDsKLSAgICBnZW5lcmF0ZV9pc3NldF9zZXQob3V0LCBmaWVsZCk7Ci0gICAgCi0gICAgaWYgKGJpbmRhYmxlKSB7Ci0gICAgICAvLyBXZSBoYXZlIHRvIHVzZSBhIGN1c3RvbSBldmVudCByYXRoZXIgdGhhbiB0aGUgZGVmYXVsdCwgYmVjYXVzZSBpZiB5b3UgdXNlIHRoZSBkZWZhdWx0LAotICAgICAgLy8gdGhlIHNldHRlciBvbmx5IGdldHMgY2FsbGVkIGlmIHRoZSB2YWx1ZSBoYXMgY2hhbmdlZCAtIHRoaXMgbWVhbnMgY2FsbGluZyBmb28uc2V0SW50VmFsdWUoMCkKLSAgICAgIC8vIHdpbGwgbm90IGNhdXNlIGZvby5pc0ludFZhbHVlU2V0KCkgdG8gcmV0dXJuIHRydWUgc2luY2UgdGhlIHZhbHVlIG9mIGZvby5faW50VmFsdWUgd2Fzbid0IGNoYW5nZWQKLSAgICAgIC8vIHNvIHRoZSBzZXR0ZXIgd2FzIG5ldmVyIGNhbGxlZC4KLSAgICAgIGluZGVudChvdXQpIDw8ICJkaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcIiIgPDwgcHJvcE5hbWUgPDwgIlwiKSk7IiA8PCBlbmRsOwotICAgICAgCi0gICAgICAvLyBIb3dldmVyLCBpZiB5b3UganVzdCB1c2UgYSBjdXN0b20gZXZlbnQsIHRoZW4gY29sbGVjdGlvbnMgd29uJ3QgYmUgYWJsZSB0byBkZXRlY3Qgd2hlbiBlbGVtZW50cwotICAgICAgLy8gaW4gdGhlIGNvbGxlY3Rpb25zIGhhdmUgY2hhbmdlZCBzaW5jZSB0aGV5IGxpc3RlZCBmb3IgUHJvcGVydHlDaGFuZ2VFdmVudHMuICBTbywgd2UgZGlzcGF0Y2ggYm90aC4KLSAgICAgIGluZGVudChvdXQpIDw8ICJkaXNwYXRjaEV2ZW50KG5ldyBQcm9wZXJ0eUNoYW5nZUV2ZW50KFByb3BlcnR5Q2hhbmdlRXZlbnQuUFJPUEVSVFlfQ0hBTkdFKSk7IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgCi0gICAgLy8gVW5zZXR0ZXIKLSAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIHVuc2V0IiA8PCBjYXBfbmFtZSA8PCAiKCk6dm9pZCB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKHR5cGUpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9IG51bGw7IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy5fX2lzc2V0XyIgPDwgZmllbGRfbmFtZSA8PCAiID0gZmFsc2U7IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgCi0gICAgLy8gaXNTZXQgbWV0aG9kCi0gICAgaW5kZW50KG91dCkgPDwgIi8vIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCAiIDw8IGZpZWxkX25hbWUgPDwgIiBpcyBzZXQgKGhhcyBiZWVuIGFzc2lnbmVkIGEgdmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jdGlvbiBpcyIgPDwgZ2V0X2NhcF9uYW1lKCJzZXQiKSA8PCBjYXBfbmFtZSA8PCAiKCk6Qm9vbGVhbiB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKHR5cGUpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgIT0gbnVsbDsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdGhpcy5fX2lzc2V0XyIgPDwgZmllbGRfbmFtZSA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgdG9TdHJpbmcoKSBtZXRob2QgZm9yIHRoZSBnaXZlbiBzdHJ1Y3QKLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2FzM19zdHJ1Y3RfdG9zdHJpbmcob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgYmluZGFibGUpIHsKLSAgLy8gSWYgaXQncyBiaW5kYWJsZSwgaXQgZXh0ZW5kcyBFdmVudERpc3BhdGNoZXIgc28gdG9TdHJpbmcgaXMgYW4gb3ZlcnJpZGUuCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljICIgPDwgKGJpbmRhYmxlID8gIm92ZXJyaWRlICIgOiAiIikgPDwgImZ1bmN0aW9uIHRvU3RyaW5nKCk6U3RyaW5nIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJ2YXIgcmV0OlN0cmluZyA9IG5ldyBTdHJpbmcoXCIiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIihcIik7IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgInZhciBmaXJzdDpCb29sZWFuID0gdHJ1ZTsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGJvb2wgY291bGRfYmVfdW5zZXQgPSAoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMOwotICAgIGlmKGNvdWxkX2JlX3Vuc2V0KSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKmZfaXRlcikgPDwgIikgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgIH0KLQotICAgIHRfZmllbGQqIGZpZWxkID0gKCpmX2l0ZXIpOwotCi0gICAgaWYgKCFmaXJzdCkgewotICAgICAgaW5kZW50KG91dCkgPDwgImlmICghZmlyc3QpIHJldCArPSAgXCIsIFwiOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50KG91dCkgPDwgInJldCArPSBcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI6XCI7IiA8PCBlbmRsOwotICAgIGJvb2wgY2FuX2JlX251bGwgPSB0eXBlX2Nhbl9iZV9udWxsKGZpZWxkLT5nZXRfdHlwZSgpKTsKLSAgICBpZiAoY2FuX2JlX251bGwpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJpZiAodGhpcy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID09IG51bGwpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICByZXQgKz0gXCJudWxsXCI7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgfQotICAgIAotICAgIGlmIChmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfYmFzZV90eXBlKCkgJiYgKCh0X2Jhc2VfdHlwZSopKGZpZWxkLT5nZXRfdHlwZSgpKSktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICByZXQgKz0gXCJCSU5BUllcIjsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIGlmKGZpZWxkLT5nZXRfdHlwZSgpLT5pc19lbnVtKCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ2YXIgIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiX25hbWU6U3RyaW5nID0gIiA8PCBnZXRfZW51bV9jbGFzc19uYW1lKGZpZWxkLT5nZXRfdHlwZSgpKSA8PCAiLlZBTFVFU19UT19OQU1FU1t0aGlzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJdOyI8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICJfbmFtZSAhPSBudWxsKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIiAgcmV0ICs9ICIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIl9uYW1lOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgIHJldCArPSBcIiAoXCI7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAicmV0ICs9IHRoaXMuIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiX25hbWUgIT0gbnVsbCkgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgIHJldCArPSBcIilcIjsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwgInJldCArPSB0aGlzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLSAgICAKLSAgICBpZiAoY2FuX2JlX251bGwpIHsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50KG91dCkgPDwgImZpcnN0ID0gZmFsc2U7IiA8PCBlbmRsOwotCi0gICAgaWYoY291bGRfYmVfdW5zZXQpIHsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0gICAgZmlyc3QgPSBmYWxzZTsKLSAgfQotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAicmV0ICs9IFwiKVwiOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJyZXR1cm4gcmV0OyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RhdGljIG1hcCB3aXRoIG1ldGEgZGF0YSB0byBzdG9yZSBpbmZvcm1hdGlvbiBzdWNoIGFzIGZpZWxkSUQgdG8KLSAqIGZpZWxkTmFtZSBtYXBwaW5nCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9hczNfbWV0YV9kYXRhX21hcChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIC8vIFN0YXRpYyBNYXAgd2l0aCBmaWVsZElEIC0+IEZpZWxkTWV0YURhdGEgbWFwcGluZ3MKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBzdGF0aWMgY29uc3QgbWV0YURhdGFNYXA6RGljdGlvbmFyeSA9IG5ldyBEaWN0aW9uYXJ5KCk7IiA8PCBlbmRsOwotCi0gIGlmIChmaWVsZHMuc2l6ZSgpID4gMCkgewotICAgIC8vIFBvcHVsYXRlIG1hcAotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgIHRfZmllbGQqIGZpZWxkID0gKmZfaXRlcjsKLSAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSBmaWVsZC0+Z2V0X25hbWUoKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJtZXRhRGF0YU1hcFsiIDw8IHVwY2FzZV9zdHJpbmcoZmllbGRfbmFtZSkgPDwgIl0gPSBuZXcgRmllbGRNZXRhRGF0YShcIiIgPDwgZmllbGRfbmFtZSA8PCAiXCIsICI7Ci0KLSAgICAgIC8vIFNldCBmaWVsZCByZXF1aXJlbWVudCB0eXBlIChyZXF1aXJlZCwgb3B0aW9uYWwsIGV0Yy4pCi0gICAgICBpZiAoZmllbGQtPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7Ci0gICAgICAgIG91dCA8PCAiVEZpZWxkUmVxdWlyZW1lbnRUeXBlLlJFUVVJUkVELCAiOwotICAgICAgfSBlbHNlIGlmIChmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKLSAgICAgICAgb3V0IDw8ICJURmllbGRSZXF1aXJlbWVudFR5cGUuT1BUSU9OQUwsICI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgIlRGaWVsZFJlcXVpcmVtZW50VHlwZS5ERUZBVUxULCAiOwotICAgICAgfQotCi0gICAgICAvLyBDcmVhdGUgdmFsdWUgbWV0YSBkYXRhICAgIAotICAgICAgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKG91dCwgZmllbGQtPmdldF90eXBlKCkpOwotICAgICAgb3V0ICA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgfQotfQotCi0vKiogCi0gKiBSZXR1cm5zIGEgc3RyaW5nIHdpdGggdGhlIGFzMyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gdGhyaWZ0IHR5cGUKLSAqIChlLmcuIGZvciB0aGUgdHlwZSBzdHJ1Y3QgaXQgcmV0dXJucyAiVFR5cGUuU1RSVUNUIikKLSAqLwotc3RkOjpzdHJpbmcgdF9hczNfZ2VuZXJhdG9yOjpnZXRfYXMzX3R5cGVfc3RyaW5nKHRfdHlwZSogdHlwZSkgewotICBpZiAodHlwZS0+aXNfbGlzdCgpKXsKLSAgICByZXR1cm4gIlRUeXBlLkxJU1QiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZS5NQVAiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZS5TRVQiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLlNUUlVDVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZS5JMzIiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3R5cGVkZWYoKSkgewotICAgIHJldHVybiBnZXRfYXMzX3R5cGVfc3RyaW5nKCgodF90eXBlZGVmKil0eXBlKS0+Z2V0X3R5cGUoKSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICBzd2l0Y2ggKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQgICA6IHJldHVybiAgICAgICJUVHlwZS5WT0lEIjsgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORyA6IHJldHVybiAgICAiVFR5cGUuU1RSSU5HIjsgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0wgICA6IHJldHVybiAgICAgICJUVHlwZS5CT09MIjsgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEUgICA6IHJldHVybiAgICAgICJUVHlwZS5CWVRFIjsgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNiAgICA6IHJldHVybiAgICAgICAiVFR5cGUuSTE2IjsgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMiAgICA6IHJldHVybiAgICAgICAiVFR5cGUuSTMyIjsgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NCAgICA6IHJldHVybiAgICAgICAiVFR5cGUuSTY0IjsgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRSA6IHJldHVybiAgICAiVFR5cGUuRE9VQkxFIjsgYnJlYWs7Ci0gICAgICBkZWZhdWx0IDogdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCJVbmtub3duIHRocmlmdCB0eXBlIFwiIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiXCIgcGFzc2VkIHRvIHRfYXMzX2dlbmVyYXRvcjo6Z2V0X2FzM190eXBlX3N0cmluZyEiKTsgYnJlYWs7IC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiEKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCJVbmtub3duIHRocmlmdCB0eXBlIFwiIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiXCIgcGFzc2VkIHRvIHRfYXMzX2dlbmVyYXRvcjo6Z2V0X2FzM190eXBlX3N0cmluZyEiKTsgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIQotICB9Ci19Ci0KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUpewotICBvdXQgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudF91cCgpOwotICBpZiAodHlwZS0+aXNfc3RydWN0KCkpewotICAgIGluZGVudChvdXQpIDw8ICJuZXcgU3RydWN0TWV0YURhdGEoVFR5cGUuU1RSVUNULCAiIDw8IHR5cGVfbmFtZSh0eXBlKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSl7Ci0gICAgaWYgKHR5cGUtPmlzX2xpc3QoKSl7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAibmV3IExpc3RNZXRhRGF0YShUVHlwZS5MSVNULCAiOwotICAgICAgdF90eXBlKiBlbGVtX3R5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsgICAgCi0gICAgICBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEob3V0LCBlbGVtX3R5cGUpOyAgIAotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpewotICAgICAgaW5kZW50KG91dCkgPDwgIm5ldyBTZXRNZXRhRGF0YShUVHlwZS5TRVQsICI7Ci0gICAgICB0X3R5cGUqIGVsZW1fdHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOyAgICAKLSAgICAgIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShvdXQsIGVsZW1fdHlwZSk7IAotICAgIH0gZWxzZXsgLy8gbWFwCi0gICAgICBpbmRlbnQob3V0KSA8PCAibmV3IE1hcE1ldGFEYXRhKFRUeXBlLk1BUCwgIjsKLSAgICAgIHRfdHlwZSoga2V5X3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgICB0X3R5cGUqIHZhbF90eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOwotICAgICAgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKG91dCwga2V5X3R5cGUpOwotICAgICAgb3V0IDw8ICIsICI7Ci0gICAgICBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEob3V0LCB2YWxfdHlwZSk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIGluZGVudChvdXQpIDw8ICJuZXcgRmllbGRWYWx1ZU1ldGFEYXRhKCIgPDwgZ2V0X2FzM190eXBlX3N0cmluZyh0eXBlKTsKLSAgfQotICBvdXQgPDwgIikiOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnRfZG93bigpOwotfQotCi0KLS8qKgotICogR2VuZXJhdGVzIGEgdGhyaWZ0IHNlcnZpY2UuIEluIEMrKywgdGhpcyBjb21wcmlzZXMgYW4gZW50aXJlbHkgc2VwYXJhdGUKLSAqIGhlYWRlciBhbmQgc291cmNlIGZpbGUuIFRoZSBoZWFkZXIgZmlsZSBkZWZpbmVzIHRoZSBtZXRob2RzIGFuZCBpbmNsdWRlcwotICogdGhlIGRhdGEgdHlwZXMgZGVmaW5lZCBpbiB0aGUgbWFpbiBoZWFkZXIgZmlsZSwgYW5kIHRoZSBpbXBsZW1lbnRhdGlvbgotICogZmlsZSBjb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIGJhc2ljIHByaW50ZXIgYW5kIGRlZmF1bHQgaW50ZXJmYWNlcy4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIC8vIE1ha2UgaW50ZXJmYWNlIGZpbGUKLSAgc3RyaW5nIGZfc2VydmljZV9uYW1lID0gcGFja2FnZV9kaXJfKyIvIitzZXJ2aWNlX25hbWVfKyIuYXMiOwotICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGF1dG9nZW5fY29tbWVudCgpIDw8IGFzM19wYWNrYWdlKCk7Ci0gIAotICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgCi0gIGZfc2VydmljZV8gPDwgZW5kbCA8PAotICAgIGFzM190eXBlX2ltcG9ydHMoKSA8PAotICAgIGFzM190aHJpZnRfaW1wb3J0cygpIDw8Ci0gICAgYXMzX3RocmlmdF9nZW5faW1wb3J0cyh0c2VydmljZSk7Ci0KLSAgaWYodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIHRfdHlwZSogcGFyZW50ID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7Ci0gICAgc3RyaW5nIHBhcmVudF9uYW1lc3BhY2UgPSBwYXJlbnQtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lc3BhY2UoImFzMyIpOwotICAgIGlmKCFwYXJlbnRfbmFtZXNwYWNlLmVtcHR5KCkgJiYgcGFyZW50X25hbWVzcGFjZSAhPSBwYWNrYWdlX25hbWVfKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8ICJpbXBvcnQgIiA8PCB0eXBlX25hbWUocGFyZW50KSA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UpOwotCi0gIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gIGZfc2VydmljZV8uY2xvc2UoKTsKLSAgCi0gIC8vIE5vdyBtYWtlIHRoZSBpbXBsZW1lbnRhdGlvbi9jbGllbnQgZmlsZQotICBmX3NlcnZpY2VfbmFtZSA9IHBhY2thZ2VfZGlyXysiLyIrc2VydmljZV9uYW1lXysiSW1wbC5hcyI7Ci0gIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKLSAgCi0gIGZfc2VydmljZV8gPDwKLSAgYXV0b2dlbl9jb21tZW50KCkgPDwgYXMzX3BhY2thZ2UoKTsKLSAgCi0gIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICAKLSAgZl9zZXJ2aWNlXyA8PCBlbmRsIDw8Ci0gIGFzM190eXBlX2ltcG9ydHMoKSA8PAotICBhczNfdGhyaWZ0X2ltcG9ydHMoKSA8PAotICBhczNfdGhyaWZ0X2dlbl9pbXBvcnRzKHRzZXJ2aWNlKTsKLQotCi0gIGlmKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICB0X3R5cGUqIHBhcmVudCA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOwotICAgIHN0cmluZyBwYXJlbnRfbmFtZXNwYWNlID0gcGFyZW50LT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZXNwYWNlKCJhczMiKTsKLSAgICBpZighcGFyZW50X25hbWVzcGFjZS5lbXB0eSgpICYmIHBhcmVudF9uYW1lc3BhY2UgIT0gcGFja2FnZV9uYW1lXykgewotICAgICAgZl9zZXJ2aWNlXyA8PCAiaW1wb3J0ICIgPDwgdHlwZV9uYW1lKHBhcmVudCkgPDwgIkltcGw7IiA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0c2VydmljZSk7Ci0gIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gIAotICBmX3NlcnZpY2VfIDw8IGFzM190eXBlX2ltcG9ydHMoKTsKLSAgZl9zZXJ2aWNlXyA8PCBhczNfdGhyaWZ0X2ltcG9ydHMoKTsKLSAgZl9zZXJ2aWNlXyA8PCBhczNfdGhyaWZ0X2dlbl9pbXBvcnRzKHRzZXJ2aWNlKTsKLSAgaWYoIXBhY2thZ2VfbmFtZV8uZW1wdHkoKSkgewotICAgIGZfc2VydmljZV8gPDwgImltcG9ydCAiIDw8IHBhY2thZ2VfbmFtZV8gPDwgIi4qOyIgPDwgZW5kbDsKLSAgfQotICAKLSAgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRzZXJ2aWNlKTsKLSAgCi0gIGZfc2VydmljZV8uY2xvc2UoKTsKLSAgCi0gIC8vIE5vdyBtYWtlIHRoZSBwcm9jZXNzb3Ivc2VydmVyIGZpbGUKLSAgZl9zZXJ2aWNlX25hbWUgPSBwYWNrYWdlX2Rpcl8rIi8iK3NlcnZpY2VfbmFtZV8rIlByb2Nlc3Nvci5hcyI7Ci0gIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKLSAgCi0gIGZfc2VydmljZV8gPDwKLSAgYXV0b2dlbl9jb21tZW50KCkgPDwgYXMzX3BhY2thZ2UoKTsKLSAgCi0gIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICAKLSAgZl9zZXJ2aWNlXyA8PCBlbmRsIDw8Ci0gIGFzM190eXBlX2ltcG9ydHMoKSA8PAotICBhczNfdGhyaWZ0X2ltcG9ydHMoKSA8PAotICBhczNfdGhyaWZ0X2dlbl9pbXBvcnRzKHRzZXJ2aWNlKSA8PCBlbmRsOwotICAKLSAgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodHNlcnZpY2UpOwotICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICAKLSAgZl9zZXJ2aWNlXyA8PCBhczNfdHlwZV9pbXBvcnRzKCk7Ci0gIGZfc2VydmljZV8gPDwgYXMzX3RocmlmdF9pbXBvcnRzKCk7Ci0gIGZfc2VydmljZV8gPDwgYXMzX3RocmlmdF9nZW5faW1wb3J0cyh0c2VydmljZSkgPDxlbmRsOwotICBpZighcGFja2FnZV9uYW1lXy5lbXB0eSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCAiaW1wb3J0ICIgPDwgcGFja2FnZV9uYW1lXyA8PCAiLio7IiA8PCBlbmRsOwotICB9Ci0gIAotICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOwotICAKLSAgZl9zZXJ2aWNlXy5jbG9zZSgpOwotICAgIAotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgaW50ZXJmYWNlIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCi0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBleHRlbmRzX2lmYWNlID0gIiI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kc19pZmFjZSA9ICIgZXh0ZW5kcyAiICsgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCk7Ci0gIH0KLQotICBnZW5lcmF0ZV9hczNfZG9jKGZfc2VydmljZV8sIHRzZXJ2aWNlKTsKLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicHVibGljIGludGVyZmFjZSAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgZXh0ZW5kc19pZmFjZSA8PAotICAgICIgeyIgPDwgZW5kbCA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgZ2VuZXJhdGVfYXMzX2RvYyhmX3NlcnZpY2VfLCAqZl9pdGVyKTsKLSAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIi8vZnVuY3Rpb24gb25FcnJvcihFcnJvcik6dm9pZDsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiLy9mdW5jdGlvbiBvblN1Y2Nlc3MoKTp2b2lkOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIi8vZnVuY3Rpb24gb25FcnJvcihFcnJvcik6dm9pZDsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiLy9mdW5jdGlvbiBvblN1Y2Nlc3MoIiA8PCB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpKSA8PCAiKTp2b2lkOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCAiOyIgPDwKLSAgICAgIGVuZGwgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBzdHJ1Y3RzIGZvciBhbGwgdGhlIHNlcnZpY2UgYXJncyBhbmQgcmV0dXJuIHR5cGVzCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlCi0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSkgewotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X3N0cnVjdCogdHMgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgZ2VuZXJhdGVfYXMzX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sIHRzLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycygqZl9pdGVyKTsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfY2xpZW50ID0gIiI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpOwotICAgIGV4dGVuZHNfY2xpZW50ID0gIiBleHRlbmRzICIgKyBleHRlbmRzICsgIkltcGwiOwotICB9Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgInB1YmxpYyBjbGFzcyAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkltcGwiIDw8IGV4dGVuZHNfY2xpZW50IDw8ICIgaW1wbGVtZW50cyAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIiB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAicHVibGljIGZ1bmN0aW9uICIgPDwgc2VydmljZV9uYW1lXyA8PCAiSW1wbCIgPDwgIihpcHJvdDpUUHJvdG9jb2wsIG9wcm90OlRQcm90b2NvbD1udWxsKSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaXByb3RfID0gaXByb3Q7IiA8PCBlbmRsOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChvcHJvdCA9PSBudWxsKSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90XyA9IGlwcm90OyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90XyA9IG9wcm90OyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iOwotICB9IGVsc2UgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJzdXBlcihpcHJvdCwgb3Byb3QpOyIgPDwgZW5kbDsKLSAgfQotICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgdmFyIGlwcm90XzpUUHJvdG9jb2w7IiAgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgInByb3RlY3RlZCB2YXIgb3Byb3RfOlRQcm90b2NvbDsiICA8PCBlbmRsIDw8Ci0gICAgICBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicHJvdGVjdGVkIHZhciBzZXFpZF86aW50OyIgPDwgZW5kbCA8PAotICAgICAgZW5kbDsKLQotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgInB1YmxpYyBmdW5jdGlvbiBnZXRJbnB1dFByb3RvY29sKCk6VFByb3RvY29sIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgInJldHVybiB0aGlzLmlwcm90XzsiIDw8IGVuZGw7Ci0gICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICJwdWJsaWMgZnVuY3Rpb24gZ2V0T3V0cHV0UHJvdG9jb2woKTpUUHJvdG9jb2wiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAicmV0dXJuIHRoaXMub3Byb3RfOyIgPDwgZW5kbDsKLSAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICB9Ci0KLSAgLy8gR2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0KLSAgICAvLyBPcGVuIGZ1bmN0aW9uCi0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIvL2Z1bmN0aW9uIG9uRXJyb3IoRXJyb3IpOnZvaWQ7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIi8vZnVuY3Rpb24gb25TdWNjZXNzKCk6dm9pZDsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIvL2Z1bmN0aW9uIG9uRXJyb3IoRXJyb3IpOnZvaWQ7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIi8vZnVuY3Rpb24gb25TdWNjZXNzKCIgPDwgdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSkgPDwgIik6dm9pZDsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCBlbmRsOwotICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOwotCi0KLSAgICAvLyBHZXQgdGhlIHN0cnVjdCBvZiBmdW5jdGlvbiBjYWxsIHBhcmFtcwotICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotICAgIAotICAgIHN0cmluZyBhcmdzbmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfYXJncyI7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLQotICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVxdWVzdAotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJvcHJvdF8ud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKFwiIiA8PCBmdW5uYW1lIDw8ICJcIiwgIiA8PAotICAgICAgKCgqZl9pdGVyKS0+aXNfb25ld2F5KCkgPyAiVE1lc3NhZ2VUeXBlLk9ORVdBWSIgOiAiVE1lc3NhZ2VUeXBlLkNBTEwiKSA8PAotICAgICAgIiwgc2VxaWRfKSk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAidmFyIGFyZ3M6IiA8PCBhcmdzbmFtZSA8PCAiID0gbmV3ICIgPDwgYXJnc25hbWUgPDwgIigpOyIgPDwgZW5kbDsKLQotICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJhcmdzLiIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgImFyZ3Mud3JpdGUob3Byb3RfKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAib3Byb3RfLndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKLSAgICAKLSAgICBpZiAoKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAib3Byb3RfLmdldFRyYW5zcG9ydCgpLmZsdXNoKCk7IiA8PCBlbmRsOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90Xy5nZXRUcmFuc3BvcnQoKS5mbHVzaChmdW5jdGlvbihlcnJvcjpFcnJvcik6dm9pZCB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0cnkgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgc3RyaW5nIHJlc3VsdG5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiAoZXJyb3IgIT0gbnVsbCkgeyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBpZiAob25FcnJvciAhPSBudWxsKSBvbkVycm9yKGVycm9yKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAidmFyIG1zZzpUTWVzc2FnZSA9IGlwcm90Xy5yZWFkTWVzc2FnZUJlZ2luKCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiAobXNnLnR5cGUgPT0gVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTikgeyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICB2YXIgeDpUQXBwbGljYXRpb25FcnJvciA9IFRBcHBsaWNhdGlvbkVycm9yLnJlYWQoaXByb3RfKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgaXByb3RfLnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIGlmIChvbkVycm9yICE9IG51bGwpIG9uRXJyb3IoeCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybjsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInZhciByZXN1bHQgOiIgPDwgcmVzdWx0bmFtZSA8PCAiID0gbmV3ICIgPDwgcmVzdWx0bmFtZSA8PCAiKCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJyZXN1bHQucmVhZChpcHJvdF8pOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaXByb3RfLnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOwotCi0gICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KLSAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAocmVzdWx0LiIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soInN1Y2Nlc3MiKSA8PCAiKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgaWYgKG9uU3VjY2VzcyAhPSBudWxsKSBvblN1Y2Nlc3MocmVzdWx0LnN1Y2Nlc3MpOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybjsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7Ci0gICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAocmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIT0gbnVsbCkgeyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIGlmIChvbkVycm9yICE9IG51bGwpIG9uRXJyb3IocmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybjsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgLy8gSWYgeW91IGdldCBoZXJlIGl0J3MgYW4gZXhjZXB0aW9uLCB1bmxlc3MgYSB2b2lkIGZ1bmN0aW9uCi0gICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAob25TdWNjZXNzICE9IG51bGwpIG9uU3VjY2VzcygpOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJyZXR1cm47IiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgCi0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKG9uRXJyb3IgIT0gbnVsbCkgb25FcnJvcihuZXcgVEFwcGxpY2F0aW9uRXJyb3IoVEFwcGxpY2F0aW9uRXJyb3IuTUlTU0lOR19SRVNVTFQsIFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiBmYWlsZWQ6IHVua25vd24gcmVzdWx0XCIpKTsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSBjYXRjaCAoZTpURXJyb3IpIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgaWYgKG9uRXJyb3IgIT0gbnVsbCkgb25FcnJvcihlKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICAKLSAgICAgIAotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgIn0pOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgLy8gQ2xvc2UgZnVuY3Rpb24KLSAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJ9IiA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2Ugc2VydmVyIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgLy8gR2VuZXJhdGUgdGhlIGRpc3BhdGNoIG1ldGhvZHMKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+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+Z2V0X25hbWVzcGFjZSgiYXMzIik7Ci0gICAgaWYgKCFwYWNrYWdlLmVtcHR5KCkpIHsKLSAgICAgIHJldHVybiBwYWNrYWdlICsgIi4iICsgdHR5cGUtPmdldF9uYW1lKCk7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIHR0eXBlLT5nZXRfbmFtZSgpOwotfQotCi0vKioKLSAqIFJldHVybnMgdGhlIEFTMyB0eXBlIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHRocmlmdCB0eXBlLgotICoKLSAqIEBwYXJhbSB0YmFzZSBUaGUgYmFzZSB0eXBlCi0gKiBAcGFyYW0gY29udGFpbmVyIElzIGl0IGdvaW5nIGluIGEgQXMzIGNvbnRhaW5lcj8KLSAqLwotc3RyaW5nIHRfYXMzX2dlbmVyYXRvcjo6YmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGUqIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9jb250YWluZXIpIHsKLSAgKHZvaWQpIGluX2NvbnRhaW5lcjsKLSAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9IHR5cGUtPmdldF9iYXNlKCk7Ci0KLSAgc3dpdGNoICh0YmFzZSkgewotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgcmV0dXJuICJ2b2lkIjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7Ci0gICAgICByZXR1cm4gIkJ5dGVBcnJheSI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiAiU3RyaW5nIjsKLSAgICB9Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICByZXR1cm4gIkJvb2xlYW4iOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICByZXR1cm4gImludCI7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgIHRocm93ICJpNjQgaXMgbm90IHlldCBzdXBwb3J0ZWQgaW4gYXMzIjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgcmV0dXJuICJOdW1iZXIiOwotICBkZWZhdWx0OgotICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gQXMzIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgfQotfQotCi0vKioKLSAqIERlY2xhcmVzIGEgZmllbGQsIHdoaWNoIG1heSBpbmNsdWRlIGluaXRpYWxpemF0aW9uIGFzIG5lY2Vzc2FyeS4KLSAqCi0gKiBAcGFyYW0gdHR5cGUgVGhlIHR5cGUKLSAqLwotc3RyaW5nIHRfYXMzX2dlbmVyYXRvcjo6ZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdCkgewotICAvLyBUT0RPKG1jc2xlZSk6IGRvIHdlIGV2ZXIgbmVlZCB0byBpbml0aWFsaXplIHRoZSBmaWVsZD8KLSAgc3RyaW5nIHJlc3VsdCA9ICJ2YXIgIiArIHRmaWVsZC0+Z2V0X25hbWUoKSArICI6IiArIHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCkpOwotICBpZiAoaW5pdCkgewotICAgIHRfdHlwZSogdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0gICAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiB0ZmllbGQtPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKLSAgICAgIG9mc3RyZWFtIGR1bW15OwotICAgICAgcmVzdWx0ICs9ICIgPSAiICsgcmVuZGVyX2NvbnN0X3ZhbHVlKGR1bW15LCB0ZmllbGQtPmdldF9uYW1lKCksIHR0eXBlLCB0ZmllbGQtPmdldF92YWx1ZSgpKTsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIHJlc3VsdCArPSAiID0gbnVsbCI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICByZXN1bHQgKz0gIiA9IGZhbHNlIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgIHJlc3VsdCArPSAiID0gMCI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIHJlc3VsdCArPSAiID0gKGRvdWJsZSkwIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICByZXN1bHQgKz0gIiA9IDAiOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgICByZXN1bHQgKz0gIiA9IG5ldyAiICsgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSkgKyAiKCkiOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXN1bHQgKz0gIiA9IG5ldyAiICsgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSkgKyAiKCkiOzsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdCArICI7IjsKLX0KLQotLyoqCi0gKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd0eXBlIG5hbWUoYXJncyknCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCi0gKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCi0gKi8KLXN0cmluZyB0X2FzM19nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgc3RkOjpzdHJpbmcgYXJndW1lbnRzID0gYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpOwotICBpZiAoISB0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgaWYgKGFyZ3VtZW50cyAhPSAiIikgewotICAgICAgYXJndW1lbnRzICs9ICIsICI7Ci0gICAgfQotICAgIGFyZ3VtZW50cyArPSAib25FcnJvcjpGdW5jdGlvbiwgb25TdWNjZXNzOkZ1bmN0aW9uIjsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIHJlc3VsdCA9ICJmdW5jdGlvbiAiICsgCi0gICAgcHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIigiICsgYXJndW1lbnRzICsgIik6dm9pZCI7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhIGNvbW1hIHNlcGFyYXRlZCBmaWVsZCBsaXN0LCB3aXRoIHR5cGUgbmFtZXMKLSAqLwotc3RyaW5nIHRfYXMzX2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlc3VsdCArPSAiLCAiOwotICAgIH0KLSAgICByZXN1bHQgKz0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIjoiICsgdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhIEMrKyBlbnVtIHN0cmluZyBmb3IgdGhlIGdpdmVuIHR5cGUuCi0gKi8KLXN0cmluZyB0X2FzM19nZW5lcmF0b3I6OnR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpIHsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICByZXR1cm4gIlRUeXBlLlNUUklORyI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuICJUVHlwZS5CT09MIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICByZXR1cm4gIlRUeXBlLkJZVEUiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgcmV0dXJuICJUVHlwZS5JMTYiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgcmV0dXJuICJUVHlwZS5JMzIiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmV0dXJuICJUVHlwZS5JNjQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuICJUVHlwZS5ET1VCTEUiOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLkkzMiI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiAiVFR5cGUuU1RSVUNUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHJldHVybiAiVFR5cGUuTUFQIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHJldHVybiAiVFR5cGUuU0VUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLkxJU1QiOwotICB9Ci0KLSAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotfQotCi0vKioKLSAqIEFwcGxpZXMgdGhlIGNvcnJlY3Qgc3R5bGUgdG8gYSBzdHJpbmcgYmFzZWQgb24gdGhlIHZhbHVlIG9mIG5vY2FtZWxfc3R5bGVfCi0gKi8KLXN0ZDo6c3RyaW5nIHRfYXMzX2dlbmVyYXRvcjo6Z2V0X2NhcF9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpewotICBuYW1lWzBdID0gdG91cHBlcihuYW1lWzBdKTsKLSAgcmV0dXJuIG5hbWU7Ci19Ci0KLXN0cmluZyB0X2FzM19nZW5lcmF0b3I6OmNvbnN0YW50X25hbWUoc3RyaW5nIG5hbWUpIHsKLSAgc3RyaW5nIGNvbnN0YW50X25hbWU7Ci0KLSAgYm9vbCBpc19maXJzdCA9IHRydWU7Ci0gIGJvb2wgd2FzX3ByZXZpb3VzX2NoYXJfdXBwZXIgPSBmYWxzZTsKLSAgZm9yIChzdHJpbmc6Oml0ZXJhdG9yIGl0ZXIgPSBuYW1lLmJlZ2luKCk7IGl0ZXIgIT0gbmFtZS5lbmQoKTsgKytpdGVyKSB7Ci0gICAgc3RyaW5nOjp2YWx1ZV90eXBlIGNoYXJhY3RlciA9ICgqaXRlcik7Ci0KLSAgICBib29sIGlzX3VwcGVyID0gaXN1cHBlcihjaGFyYWN0ZXIpOwotCi0gICAgaWYgKGlzX3VwcGVyICYmICFpc19maXJzdCAmJiAhd2FzX3ByZXZpb3VzX2NoYXJfdXBwZXIpIHsKLSAgICAgIGNvbnN0YW50X25hbWUgKz0gJ18nOwotICAgIH0KLSAgICBjb25zdGFudF9uYW1lICs9IHRvdXBwZXIoY2hhcmFjdGVyKTsKLQotICAgIGlzX2ZpcnN0ID0gZmFsc2U7Ci0gICAgd2FzX3ByZXZpb3VzX2NoYXJfdXBwZXIgPSBpc191cHBlcjsKLSAgfQotCi0gIHJldHVybiBjb25zdGFudF9uYW1lOwotfQotCi0vKioKLSAqIEVtaXRzIGEgQXMzRG9jIGNvbW1lbnQgaWYgdGhlIHByb3ZpZGVkIG9iamVjdCBoYXMgYSBkb2MgaW4gVGhyaWZ0Ci0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9hczNfZG9jKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZG9jKiB0ZG9jKSB7Ci0gIGlmICh0ZG9jLT5oYXNfZG9jKCkpIHsKLSAgICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvdXQsCi0gICAgICAiLyoqXG4iLAotICAgICAgIiAqICIsIHRkb2MtPmdldF9kb2MoKSwKLSAgICAgICIgKi9cbiIpOwotICB9Ci19Ci0KLS8qKgotICogRW1pdHMgYSBBczNEb2MgY29tbWVudCBpZiB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gb2JqZWN0IGhhcyBhIGRvYyBpbiBUaHJpZnQKLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2FzM19kb2Mob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gIGlmICh0ZnVuY3Rpb24tPmhhc19kb2MoKSkgewotICAgIHN0cmluZ3N0cmVhbSBzczsKLSAgICBzcyA8PCB0ZnVuY3Rpb24tPmdldF9kb2MoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgcF9pdGVyOwotICAgIGZvciAocF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IHBfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrcF9pdGVyKSB7Ci0gICAgICB0X2ZpZWxkKiBwID0gKnBfaXRlcjsKLSAgICAgIHNzIDw8ICJcbkBwYXJhbSAiIDw8IHAtPmdldF9uYW1lKCk7Ci0gICAgICBpZiAocC0+aGFzX2RvYygpKSB7Ci0gICAgICAgIHNzIDw8ICIgIiA8PCBwLT5nZXRfZG9jKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KG91dCwKLSAgICAgICIvKipcbiIsCi0gICAgICAiICogIiwgc3Muc3RyKCksCi0gICAgICAiICovXG4iKTsKLSAgfQotfQotCi1zdGQ6OnN0cmluZyB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2lzc2V0X2NoZWNrKHRfZmllbGQqIGZpZWxkKSB7Ci0gIHJldHVybiBnZW5lcmF0ZV9pc3NldF9jaGVjayhmaWVsZC0+Z2V0X25hbWUoKSk7Ci19Ci0KLXN0ZDo6c3RyaW5nIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaXNzZXRfY2hlY2soc3RkOjpzdHJpbmcgZmllbGRfbmFtZSkgewotICByZXR1cm4gImlzIiArIGdldF9jYXBfbmFtZSgic2V0IikgKyBnZXRfY2FwX25hbWUoZmllbGRfbmFtZSkgKyAiKCkiOwotfQotCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaXNzZXRfc2V0KG9mc3RyZWFtJiBvdXQsIHRfZmllbGQqIGZpZWxkKSB7Ci0gIGlmICghdHlwZV9jYW5fYmVfbnVsbChmaWVsZC0+Z2V0X3R5cGUoKSkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAidGhpcy5fX2lzc2V0XyIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiA9IHRydWU7IiA8PCBlbmRsOwotICB9Ci19Ci0KLXN0ZDo6c3RyaW5nIHRfYXMzX2dlbmVyYXRvcjo6Z2V0X2VudW1fY2xhc3NfbmFtZSh0X3R5cGUqIHR5cGUpIHsKLSAgc3RyaW5nIHBhY2thZ2UgPSAiIjsKLSAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHlwZS0+Z2V0X3Byb2dyYW0oKTsKLSAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7Ci0gICAgcGFja2FnZSA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2UoImFzMyIpICsgIi4iOwotICB9Ci0gIHJldHVybiBwYWNrYWdlICsgdHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUihhczMsICJBUzMiLAotIiAgICBiaW5kYWJsZTogICAgICAgICAgQWRkIFtiaW5kYWJsZV0gbWV0YWRhdGEgdG8gYWxsIHRoZSBzdHJ1Y3QgY2xhc3Nlcy5cbiIKLSkKLQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2NfZ2xpYl9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfY19nbGliX2dlbmVyYXRvci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE0MzE3MS4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfY19nbGliX2dlbmVyYXRvci5jYworKysgL2Rldi9udWxsCkBAIC0xLDUwMjcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgotICogUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKLSAqIGRldGFpbHMuCi0gKi8KLQotI2luY2x1ZGUgPGZzdHJlYW0+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLSNpbmNsdWRlICJwbGF0Zm9ybS5oIgotI2luY2x1ZGUgInRfb29wX2dlbmVyYXRvci5oIgotCi11c2luZyBzdGQ6Om1hcDsKLXVzaW5nIHN0ZDo6b2ZzdHJlYW07Ci11c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Ci11c2luZyBzdGQ6OnN0cmluZzsKLXVzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwotdXNpbmcgc3RkOjp2ZWN0b3I7Ci0KLXN0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7ICAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCi0KLS8qIGZvcndhcmQgZGVjbGFyYXRpb25zICovCi1zdHJpbmcgaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKHN0cmluZyBuYW1lKTsKLXN0cmluZyB1bmRlcnNjb3Jlc190b19pbml0aWFsX2NhcHMoc3RyaW5nIG5hbWUpOwotc3RyaW5nIHRvX3VwcGVyX2Nhc2Uoc3RyaW5nIG5hbWUpOwotc3RyaW5nIHRvX2xvd2VyX2Nhc2Uoc3RyaW5nIG5hbWUpOwotCi0vKioKLSAqIEMgY29kZSBnZW5lcmF0b3IsIHVzaW5nIGdsaWIgZm9yIEMgdHlwaW5nLgotICovCi1jbGFzcyB0X2NfZ2xpYl9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKLSBwdWJsaWM6Ci0KLSAgLyogY29uc3RydWN0b3IgKi8KLSAgdF9jX2dsaWJfZ2VuZXJhdG9yKHRfcHJvZ3JhbSAqcHJvZ3JhbSwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hcDxzdHJpbmcsIHN0cmluZz4gJnBhcnNlZF9vcHRpb25zLAotICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nICZvcHRpb25fc3RyaW5nKSA6IHRfb29wX2dlbmVyYXRvcihwcm9ncmFtKQotICB7Ci0gICAgKHZvaWQpIHBhcnNlZF9vcHRpb25zOwotICAgICh2b2lkKSBvcHRpb25fc3RyaW5nOwotICAgIC8qIHNldCB0aGUgb3V0cHV0IGRpcmVjdG9yeSAqLwotICAgIHRoaXMtPm91dF9kaXJfYmFzZV8gPSAiZ2VuLWNfZ2xpYiI7Ci0KLSAgICAvKiBzZXQgdGhlIG5hbWVzcGFjZSAqLwotICAgIHRoaXMtPm5zcGFjZSA9IHByb2dyYW1fLT5nZXRfbmFtZXNwYWNlKCJjX2dsaWIiKTsKLQotICAgIGlmICh0aGlzLT5uc3BhY2UuZW1wdHkoKSkgewotICAgICAgdGhpcy0+bnNwYWNlID0gIiI7Ci0gICAgICB0aGlzLT5uc3BhY2VfdSA9ICIiOwotICAgICAgdGhpcy0+bnNwYWNlX3VjID0gIiI7Ci0gICAgICB0aGlzLT5uc3BhY2VfbGMgPSAiIjsKLSAgICB9IGVsc2UgewotICAgICAgLyogcmVwbGFjZSBkb3RzIHdpdGggdW5kZXJzY29yZXMgKi8KLSAgICAgIGNoYXIgKnRtcCA9IHN0cmR1cCh0aGlzLT5uc3BhY2UuY19zdHIoKSk7Ci0gICAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IHN0cmxlbih0bXApOyBpKyspIHsKLSAgICAgICAgaWYgKHRtcFtpXSA9PSAnLicpIHsKLSAgICAgICAgICB0bXBbaV0gPSAnXyc7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHRoaXMtPm5zcGFjZSA9IHN0cmluZyh0bXAsIHN0cmxlbih0bXApKTsKLSAgICAgIGZyZWUodG1wKTsKLQotICAgICAgLyogY2xlYW4gdXAgdGhlIG5hbWVzcGFjZSBmb3IgQy4KLSAgICAgICAqIEFuIGlucHV0IG9mICduYW1lc3BhY2UgZm9vJyBzaG91bGQgcmVzdWx0IGluOgotICAgICAgICogIC0gbnNwYWNlID0gZm9vICAgICAgIC0gZm9yIHRocmlmdCBvYmplY3RzIGFuZCB0eXBlZGVmcwotICAgICAgICogIC0gbnNwYWNlX3UgPSBGb28gICAgIC0gZm9yIGludGVybmFsIEdPYmplY3QgcHJlZml4ZXMKLSAgICAgICAqICAtIG5zcGFjZV91YyA9IEZPT18gICAtIGZvciBtYWNybyBwcmVmaXhlcwotICAgICAgICogIC0gbnNwYWNlX2xjID0gZm9vXyAgIC0gZm9yIGZpbGVuYW1lIGFuZCBtZXRob2QgcHJlZml4ZXMKLSAgICAgICAqIFRoZSB1bmRlcnNjb3JlcyBhcmUgdGhlcmUgc2luY2UgdWMgYW5kIGxjIHN0cmluZ3MgYXJlIHVzZWQgYXMgZmlsZSBhbmQKLSAgICAgICAqIHZhcmlhYmxlIHByZWZpeGVzLgotICAgICAgICovCi0gICAgICB0aGlzLT5uc3BhY2VfdSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3Jlcyh0aGlzLT5uc3BhY2UpOwotICAgICAgdGhpcy0+bnNwYWNlX3VjID0gdG9fdXBwZXJfY2FzZSh0aGlzLT5uc3BhY2VfdSkgKyAiXyI7Ci0gICAgICB0aGlzLT5uc3BhY2VfbGMgPSB0b19sb3dlcl9jYXNlKHRoaXMtPm5zcGFjZV91KSArICJfIjsKLSAgICB9Ci0gIH0KLQotICAvKiBpbml0aWFsaXphdGlvbiBhbmQgZGVzdHJ1Y3Rpb24gKi8KLSAgdm9pZCBpbml0X2dlbmVyYXRvcigpOwotICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOwotCi0gIC8qIGdlbmVyYXRpb24gZnVuY3Rpb25zICovCi0gIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYgKnR0eXBlZGVmKTsKLSAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSAqdGVudW0pOwotICB2b2lkIGdlbmVyYXRlX2NvbnN0cyh2ZWN0b3I8dF9jb25zdCAqPiBjb25zdHMpOwotICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCAqdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UgKnRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCAqdHN0cnVjdCk7Ci0KLSBwcml2YXRlOgotCi0gIC8qIGZpbGUgc3RyZWFtcyAqLwotICBvZnN0cmVhbSBmX3R5cGVzXzsKLSAgb2ZzdHJlYW0gZl90eXBlc19pbXBsXzsKLSAgb2ZzdHJlYW0gZl9oZWFkZXJfOwotICBvZnN0cmVhbSBmX3NlcnZpY2VfOwotCi0gIC8qIG5hbWVzcGFjZSB2YXJpYWJsZXMgKi8KLSAgc3RyaW5nIG5zcGFjZTsKLSAgc3RyaW5nIG5zcGFjZV91OwotICBzdHJpbmcgbnNwYWNlX3VjOwotICBzdHJpbmcgbnNwYWNlX2xjOwotCi0gIC8qIGhlbHBlciBmdW5jdGlvbnMgKi8KLSAgYm9vbCBpc19jb21wbGV4X3R5cGUodF90eXBlICp0dHlwZSk7Ci0gIHN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBpbl90eXBlZGVmPWZhbHNlLCBib29sIGlzX2NvbnN0PWZhbHNlKTsKLSAgc3RyaW5nIHByb3BlcnR5X3R5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLCBib29sIGluX3R5cGVkZWY9ZmFsc2UsIGJvb2wgaXNfY29uc3Q9ZmFsc2UpOwotICBzdHJpbmcgYmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGUgKnR5cGUpOwotICBzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSAqdHlwZSk7Ci0gIHN0cmluZyBjb25zdGFudF9saXRlcmFsKHRfdHlwZSAqdHlwZSwgdF9jb25zdF92YWx1ZSAqdmFsdWUpOwotICBzdHJpbmcgY29uc3RhbnRfdmFsdWUoc3RyaW5nIG5hbWUsIHRfdHlwZSAqdHlwZSwgdF9jb25zdF92YWx1ZSAqdmFsdWUpOwotICBzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24gKnRmdW5jdGlvbik7Ci0gIHN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0ICp0c3RydWN0KTsKLSAgc3RyaW5nIHhjZXB0aW9uX2xpc3QodF9zdHJ1Y3QgKnRzdHJ1Y3QpOwotICBzdHJpbmcgZGVjbGFyZV9maWVsZCh0X2ZpZWxkICp0ZmllbGQsIGJvb2wgaW5pdD1mYWxzZSwgYm9vbCBwb2ludGVyPWZhbHNlLCBib29sIGNvbnN0YW50PWZhbHNlLCBib29sIHJlZmVyZW5jZT1mYWxzZSk7Ci0gIHZvaWQgZGVjbGFyZV9sb2NhbF92YXJpYWJsZShvZnN0cmVhbSAmb3V0LCB0X3R5cGUgKnR0eXBlLCBzdHJpbmcgJmJhc2VfbmFtZSk7Ci0KLSAgLyogZ2VuZXJhdGlvbiBmdW5jdGlvbnMgKi8KLSAgdm9pZCBnZW5lcmF0ZV9jb25zdF9pbml0aWFsaXplcihzdHJpbmcgbmFtZSwgdF90eXBlICp0eXBlLCB0X2NvbnN0X3ZhbHVlICp2YWx1ZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSAqdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSAqdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGFuZGxlcih0X3NlcnZpY2UgKnRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3Nvcih0X3NlcnZpY2UgKnRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UgKnRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9vYmplY3QodF9zdHJ1Y3QgKnRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3N0cnVjdF93cml0ZXIob2ZzdHJlYW0gJm91dCwgdF9zdHJ1Y3QgKnRzdHJ1Y3QsIHN0cmluZyB0aGlzX25hbWUsIHN0cmluZyB0aGlzX2dldD0iIiwgYm9vbCBpc19mdW5jdGlvbj10cnVlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3RfcmVhZGVyKG9mc3RyZWFtICZvdXQsIHRfc3RydWN0ICp0c3RydWN0LCBzdHJpbmcgdGhpc19uYW1lLCBzdHJpbmcgdGhpc19nZXQ9IiIsIGJvb2wgaXNfZnVuY3Rpb249dHJ1ZSk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob2ZzdHJlYW0gJm91dCwgdF9maWVsZCAqdGZpZWxkLCBzdHJpbmcgcHJlZml4LCBzdHJpbmcgc3VmZml4LCBpbnQgZXJyb3JfcmV0KTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtICZvdXQsIHRfc3RydWN0ICp0c3RydWN0LCBzdHJpbmcgcHJlZml4LCBpbnQgZXJyb3JfcmV0KTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtICZvdXQsIHRfdHlwZSAqdHR5cGUsIHN0cmluZyBwcmVmaXgsIGludCBlcnJvcl9yZXQpOwotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSAmb3V0LCB0X21hcCAqdG1hcCwgc3RyaW5nIGtleSwgc3RyaW5nIHZhbHVlLCBpbnQgZXJyb3JfcmV0KTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0gJm91dCwgdF9zZXQgKnRzZXQsIHN0cmluZyBlbGVtZW50LCBpbnQgZXJyb3JfcmV0KTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtICZvdXQsIHRfbGlzdCAqdGxpc3QsIHN0cmluZyBsaXN0LCBzdHJpbmcgaW5kZXgsIGludCBlcnJvcl9yZXQpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob2ZzdHJlYW0gJm91dCwgdF9maWVsZCAqdGZpZWxkLCBzdHJpbmcgcHJlZml4LCBzdHJpbmcgc3VmZml4LCBpbnQgZXJyb3JfcmV0LCBib29sIGFsbG9jYXRlPXRydWUpOwotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSAmb3V0LCB0X3N0cnVjdCAqdHN0cnVjdCwgc3RyaW5nIHByZWZpeCwgaW50IGVycm9yX3JldCwgYm9vbCBhbGxvY2F0ZT10cnVlKTsKLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0gJm91dCwgdF90eXBlICp0dHlwZSwgc3RyaW5nIHByZWZpeCwgaW50IGVycm9yX3JldCk7Ci0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob2ZzdHJlYW0gJm91dCwgdF9tYXAgKnRtYXAsIHN0cmluZyBwcmVmaXgsIGludCBlcnJvcl9yZXQpOwotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG9mc3RyZWFtICZvdXQsIHRfc2V0ICp0c2V0LCBzdHJpbmcgcHJlZml4LCBpbnQgZXJyb3JfcmV0KTsKLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0gJm91dCwgdF9saXN0ICp0bGlzdCwgc3RyaW5nIHByZWZpeCwgc3RyaW5nIGluZGV4LCBpbnQgZXJyb3JfcmV0KTsKLQotICBzdHJpbmcgZ2VuZXJhdGVfbmV3X2hhc2hfZnJvbV90eXBlKHRfdHlwZSAqIGtleSwgdF90eXBlICogdmFsdWUpOwotICBzdHJpbmcgZ2VuZXJhdGVfbmV3X2FycmF5X2Zyb21fdHlwZSh0X3R5cGUgKiB0dHlwZSk7IAotCi0gIHN0cmluZyBnZW5lcmF0ZV9mcmVlX2Z1bmNfZnJvbV90eXBlKHRfdHlwZSAqIHR0eXBlKTsKLSAgc3RyaW5nIGdlbmVyYXRlX2hhc2hfZnVuY19mcm9tX3R5cGUodF90eXBlICogdHR5cGUpOwotICBzdHJpbmcgZ2VuZXJhdGVfY21wX2Z1bmNfZnJvbV90eXBlKHRfdHlwZSAqIHR0eXBlKTsKLX07Ci0KLS8qKgotICogUHJlcGFyZSBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlCi0gKiBvdXRwdXQgc3RyZWFtcy4KLSAqLwotdm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgewotICAvKiBjcmVhdGUgb3V0cHV0IGRpcmVjdG9yeSAqLwotICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOwotCi0gIHN0cmluZyBwcm9ncmFtX25hbWVfdSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3Jlcyhwcm9ncmFtX25hbWVfKTsKLSAgc3RyaW5nIHByb2dyYW1fbmFtZV91YyA9IHRvX3VwcGVyX2Nhc2UocHJvZ3JhbV9uYW1lX3UpOwotICBzdHJpbmcgcHJvZ3JhbV9uYW1lX2xjID0gdG9fbG93ZXJfY2FzZShwcm9ncmFtX25hbWVfdSk7Ci0KLSAgLyogY3JlYXRlIG91dHB1dCBmaWxlcyAqLwotICBzdHJpbmcgZl90eXBlc19uYW1lID0gZ2V0X291dF9kaXIoKSArIHRoaXMtPm5zcGFjZV9sYwotICAgICAgICAgICAgICAgICAgICAgICAgKyBwcm9ncmFtX25hbWVfbGMgKyAiX3R5cGVzLmgiOwotICBmX3R5cGVzXy5vcGVuKGZfdHlwZXNfbmFtZS5jX3N0cigpKTsKLSAgc3RyaW5nIGZfdHlwZXNfaW1wbF9uYW1lID0gZ2V0X291dF9kaXIoKSArIHRoaXMtPm5zcGFjZV9sYwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHByb2dyYW1fbmFtZV9sYyArICJfdHlwZXMuYyI7Ci0gIGZfdHlwZXNfaW1wbF8ub3BlbihmX3R5cGVzX2ltcGxfbmFtZS5jX3N0cigpKTsKLQotICAvKiBhZGQgdGhyaWZ0IGJvaWxlcnBsYXRlIGhlYWRlcnMgKi8KLSAgZl90eXBlc18gPDwgYXV0b2dlbl9jb21tZW50KCk7Ci0gIGZfdHlwZXNfaW1wbF8gPDwgYXV0b2dlbl9jb21tZW50KCk7Ci0KLSAgLyogaW5jbHVkZSBpbmNsdXNpb24gZ3VhcmQgKi8KLSAgZl90eXBlc18gPDwgCi0gICAgIiNpZm5kZWYgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgcHJvZ3JhbV9uYW1lX3VjIDw8ICJfVFlQRVNfSCIgPDwgZW5kbCA8PAotICAgICIjZGVmaW5lICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHByb2dyYW1fbmFtZV91YyA8PCAiX1RZUEVTX0giIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIC8qIGluY2x1ZGUgYmFzZSB0eXBlcyAqLwotICBmX3R5cGVzXyA8PAotICAgICIvKiBiYXNlIGluY2x1ZGVzICovIiA8PCBlbmRsIDw8Ci0gICAgIiNpbmNsdWRlIDxnbGliLW9iamVjdC5oPiIgPDwgZW5kbCA8PAotICAgICIjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnRfc3RydWN0Lmg+IiA8PCBlbmRsIDw8Ci0gICAgIiNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5oPiIgPDwgZW5kbDsKLQotICAvKiBpbmNsdWRlIG90aGVyIHRocmlmdCBpbmNsdWRlcyAqLwotICBjb25zdCB2ZWN0b3I8dF9wcm9ncmFtICo+ICZpbmNsdWRlcyA9IHByb2dyYW1fLT5nZXRfaW5jbHVkZXMoKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmNsdWRlcy5zaXplKCk7ICsraSkgewotICAgIGZfdHlwZXNfIDw8Ci0gICAgICAiLyogb3RoZXIgdGhyaWZ0IGluY2x1ZGVzICovIiA8PCBlbmRsIDw8Ci0gICAgICAiI2luY2x1ZGUgXCIiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoaW5jbHVkZXNbaV0tPmdldF9uYW1lKCkpIDw8Ci0gICAgICAgICAgIl90eXBlcy5oXCIiIDw8IGVuZGw7Ci0gIH0KLSAgZl90eXBlc18gPDwgZW5kbDsKLQotICAvKiBpbmNsdWRlIGN1c3RvbSBoZWFkZXJzICovCi0gIGNvbnN0IHZlY3RvcjxzdHJpbmc+ICZjX2luY2x1ZGVzID0gcHJvZ3JhbV8tPmdldF9jX2luY2x1ZGVzKCk7Ci0gIGZfdHlwZXNfIDw8ICIvKiBjdXN0b20gdGhyaWZ0IGluY2x1ZGVzICovIiA8PCBlbmRsOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNfaW5jbHVkZXMuc2l6ZSgpOyArK2kpIHsKLSAgICBpZiAoY19pbmNsdWRlc1tpXVswXSA9PSAnPCcpIHsKLSAgICAgIGZfdHlwZXNfIDw8Ci0gICAgICAgICIjaW5jbHVkZSAiIDw8IGNfaW5jbHVkZXNbaV0gPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgZl90eXBlc18gPDwKLSAgICAgICAgIiNpbmNsdWRlIFwiIiA8PCBjX2luY2x1ZGVzW2ldIDw8ICJcIiIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLSAgZl90eXBlc18gPDwgZW5kbDsKLQotICAvKiBpbmNsdWRlIG1hdGguaCAoZm9yICJJTkZJTklUWSIpIGluIHRoZSBpbXBsZW1lbnRhdGlvbiBmaWxlLCBpbiBjYXNlIHdlCi0gICAgIGVuY291bnRlciBhIHN0cnVjdCB3aXRoIGEgbWVtYmVyIG9mIHR5cGUgZG91YmxlICovCi0gIGZfdHlwZXNfaW1wbF8gPDwKLSAgICBlbmRsIDw8Ci0gICAgIiNpbmNsdWRlIDxtYXRoLmg+IiA8PCBlbmRsOwotCi0gIC8vIGluY2x1ZGUgdGhlIHR5cGVzIGZpbGUKLSAgZl90eXBlc19pbXBsXyA8PAotICAgIGVuZGwgPDwKLSAgICAiI2luY2x1ZGUgXCIiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBwcm9ncmFtX25hbWVfdSA8PCAKLSAgICAgICAgIl90eXBlcy5oXCIiIDw8IGVuZGwgPDwKLSAgICAiI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0Lmg+IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICBmX3R5cGVzXyA8PAotICAgICIvKiBiZWdpbiB0eXBlcyAqLyIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqICBGaW5pc2ggdXAgZ2VuZXJhdGlvbiBhbmQgY2xvc2UgYWxsIGZpbGUgc3RyZWFtcy4KLSAqLwotdm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKLSAgc3RyaW5nIHByb2dyYW1fbmFtZV91YyA9IHRvX3VwcGVyX2Nhc2UgCi0gICAgKGluaXRpYWxfY2Fwc190b191bmRlcnNjb3Jlcyhwcm9ncmFtX25hbWVfKSk7Ci0KLSAgLyogZW5kIHRoZSBoZWFkZXIgaW5jbHVzaW9uIGd1YXJkICovCi0gIGZfdHlwZXNfIDw8Ci0gICAgIiNlbmRpZiAvKiAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBwcm9ncmFtX25hbWVfdWMgPDwgIl9UWVBFU19IICovIiA8PCBlbmRsOwotCi0gIC8qIGNsb3NlIG91dHB1dCBmaWxlICovCi0gIGZfdHlwZXNfLmNsb3NlKCk7Ci0gIGZfdHlwZXNfaW1wbF8uY2xvc2UoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBUaHJpZnQgdHlwZWRlZiBpbiBDIGNvZGUuICBGb3IgZXhhbXBsZToKLSAqIAotICogVGhyaWZ0OiAKLSAqIHR5cGVkZWYgbWFwPGkzMixpMzI+IFNvbWVNYXAKLSAqIAotICogQzogCi0gKiB0eXBlZGVmIEdIYXNoVGFibGUgKiBUaHJpZnRTb21lTWFwOwotICovCi12b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7Ci0gIGZfdHlwZXNfIDw8Ci0gICAgaW5kZW50KCkgPDwgInR5cGVkZWYgIiA8PCB0eXBlX25hbWUodHR5cGVkZWYtPmdldF90eXBlKCksIHRydWUpIDw8Ci0gICAgICAgICIgIiA8PCB0aGlzLT5uc3BhY2UgPDwgdHR5cGVkZWYtPmdldF9zeW1ib2xpYygpIDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLX0gCi0KLS8qKgotICogR2VuZXJhdGVzIGEgQyBlbnVtZXJhdGlvbi4gIEZvciBleGFtcGxlOgotICoKLSAqIFRocmlmdDoKLSAqIGVudW0gTXlFbnVtIHsKLSAqICAgT05FID0gMSwKLSAqICAgVFdPCi0gKiB9Ci0gKgotICogQzoKLSAqIGVudW0gX1RocmlmdE15RW51bSB7Ci0gKiAgIFRIUklGVF9NWV9FTlVNX09ORSA9IDEsCi0gKiAgIFRIUklGVF9NWV9FTlVNX1RXTwotICogfTsKLSAqIHR5cGVkZWYgZW51bSBfVGhyaWZ0TXlFbnVtIFRocmlmdE15RW51bTsKLSAqLwotdm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtICp0ZW51bSkgewotICBzdHJpbmcgbmFtZSA9IHRlbnVtLT5nZXRfbmFtZSgpOwotICBzdHJpbmcgbmFtZV91YyA9IHRvX3VwcGVyX2Nhc2UoaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKG5hbWUpKTsKLQotICBmX3R5cGVzXyA8PAotICAgIGluZGVudCgpIDw8ICJlbnVtIF8iIDw8IHRoaXMtPm5zcGFjZSA8PCBuYW1lIDw8ICIgeyIgPDwgZW5kbDsKLQotICBpbmRlbnRfdXAoKTsKLQotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlICo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7Ci0gIHZlY3Rvcjx0X2VudW1fdmFsdWUgKj46Oml0ZXJhdG9yIGNfaXRlcjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0KLSAgLyogb3V0cHV0IGVhY2ggb2YgdGhlIGVudW1lcmF0aW9uIGVsZW1lbnRzICovCi0gIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICBmX3R5cGVzXyA8PCAiLCIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBmX3R5cGVzXyA8PAotICAgICAgaW5kZW50KCkgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IG5hbWVfdWMgPDwgIl8iIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICBmX3R5cGVzXyA8PAotICAgICAgIiA9ICIgPDwgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGZfdHlwZXNfIDw8Ci0gICAgZW5kbCA8PAotICAgICJ9OyIgPDwgZW5kbCA8PAotICAgICJ0eXBlZGVmIGVudW0gXyIgPDwgdGhpcy0+bnNwYWNlIDw8IG5hbWUgPDwgIiAiIDw8IHRoaXMtPm5zcGFjZSA8PCBuYW1lIDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICBmX3R5cGVzXyA8PCAiLyogcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBjb25zdGFudCAqLyIgPDwgZW5kbDsKLSAgZl90eXBlc18gPDwgImNvbnN0IGNoYXIgKiIgPDwgZW5kbDsKLSAgZl90eXBlc18gPDwgInRvU3RyaW5nXyI8PG5hbWU8PCIoaW50IHZhbHVlKTsgIjw8ZW5kbDw8ZW5kbDs7Ci0gIGZfdHlwZXNfaW1wbF8gPDwgIi8qIHJldHVybiB0aGUgbmFtZSBvZiB0aGUgY29uc3RhbnQgKi8iIDw8IGVuZGw7Ci0gIGZfdHlwZXNfaW1wbF8gPDwgImNvbnN0IGNoYXIgKiIgPDwgZW5kbDsKLSAgZl90eXBlc19pbXBsXyA8PCAidG9TdHJpbmdfIjw8bmFtZTw8IihpbnQgdmFsdWUpICI8PGVuZGw7Ci0gIGZfdHlwZXNfaW1wbF8gPDwgInsiIDw8IGVuZGw7Ci0gIGZfdHlwZXNfaW1wbF8gPDwgIiAgc3RhdGljIF9fdGhyZWFkIGNoYXIgYnVmWzE2XSA9IHswfTsiIDw8IGVuZGw7Ci0gIGZfdHlwZXNfaW1wbF8gPDwgIiAgc3dpdGNoKHZhbHVlKSB7IiA8PCBlbmRsOwotICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgewotICAgIGZfdHlwZXNfaW1wbF8gPDwgIiAgY2FzZSAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBuYW1lX3VjIDw8ICJfIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkKLSAgICAgICAgPDwgIjoiIDw8ICJyZXR1cm4gXCIiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBuYW1lX3VjIDw8ICJfIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkKLSAgICAgICAgPDwgIlwiOyI8PGVuZGw7Ci0gIH0KLSAgZl90eXBlc19pbXBsXyA8PCAiICBkZWZhdWx0OiBnX3NucHJpbnRmKGJ1ZiwgMTYsIFwiJWRcIiwgdmFsdWUpOyByZXR1cm4gYnVmOyIgPDwgZW5kbDsKLSAgZl90eXBlc19pbXBsXyA8PCAiICB9IiA8PCBlbmRsOwotICBmX3R5cGVzX2ltcGxfIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIFRocmlmdCBjb25zdGFudHMgaW4gQyBjb2RlLgotICovCi12b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3RzICh2ZWN0b3I8dF9jb25zdCAqPiBjb25zdHMpIHsKLSAgZl90eXBlc18gPDwgIi8qIGNvbnN0YW50cyAqLyIgPDwgZW5kbDsKLSAgZl90eXBlc19pbXBsXyA8PCAiLyogY29uc3RhbnRzICovIiA8PCBlbmRsOwotCi0gIHZlY3Rvcjx0X2NvbnN0ICo+OjppdGVyYXRvciBjX2l0ZXI7Ci0gIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgc3RyaW5nIG5hbWUgPSAoKmNfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgc3RyaW5nIG5hbWVfdWMgPSB0b191cHBlcl9jYXNlKG5hbWUpOwotICAgIHN0cmluZyBuYW1lX2xjID0gdG9fbG93ZXJfY2FzZShuYW1lKTsKLSAgICB0X3R5cGUgKnR5cGUgPSAoKmNfaXRlciktPmdldF90eXBlKCk7Ci0gICAgdF9jb25zdF92YWx1ZSAqdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOwotCi0gICAgZl90eXBlc18gPDwKLSAgICAgIGluZGVudCgpIDw8ICIjZGVmaW5lICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IG5hbWVfdWMgPDwgIiAiIDw8Ci0gICAgICAgICAgY29uc3RhbnRfdmFsdWUgKG5hbWVfbGMsIHR5cGUsIHZhbHVlKSA8PCBlbmRsOwotCi0gICAgZ2VuZXJhdGVfY29uc3RfaW5pdGlhbGl6ZXIgKG5hbWVfbGMsIHR5cGUsIHZhbHVlKTsKLSAgfQotCi0gIGZfdHlwZXNfIDw8IGVuZGw7Ci0gIGZfdHlwZXNfaW1wbF8gPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZSBUaHJpZnQgc3RydWN0cyBpbiBDIGNvZGUsIGFzIEdPYmplY3RzLiAgRXhhbXBsZToKLSAqCi0gKiBUaHJpZnQ6Ci0gKiBzdHJ1Y3QgQm9uawotICogewotICogICAxOiBzdHJpbmcgbWVzc2FnZSwKLSAqICAgMjogaTMyIHR5cGUKLSAqIH0KLSAqCi0gKiBDIEdPYmplY3QgaW5zdGFuY2UgaGVhZGVyOgotICogc3RydWN0IF9UaHJpZnRCb25rCi0gKiB7Ci0gKiAgIEdPYmplY3QgcGFyZW50OwotICoKLSAqICAgZ2NoYXIgKiBtZXNzYWdlOwotICogICBnaW50MzIgdHlwZTsKLSAqIH07Ci0gKiB0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0Qm9uayBUaHJpZnRCb25rCi0gKiAvLyAuLi4gYWRkaXRpb25hbCBHT2JqZWN0IGJvaWxlcnBsYXRlIC4uLgotICovCi12b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0ICh0X3N0cnVjdCAqdHN0cnVjdCkgewotICBmX3R5cGVzXyA8PCAiLyogc3RydWN0ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiICovIiA8PCBlbmRsOwotICBnZW5lcmF0ZV9vYmplY3QodHN0cnVjdCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGUgQyBjb2RlIHRvIHJlcHJlc2VudCBUaHJpZnQgc2VydmljZXMuICBDcmVhdGVzIGEgbmV3IEdPYmplY3QKLSAqIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGFjY2VzcyB0aGUgc2VydmljZS4KLSAqLwotdm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UgKHRfc2VydmljZSAqdHNlcnZpY2UpIHsKLSAgc3RyaW5nIHN2Y25hbWVfdSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3Jlcyh0c2VydmljZS0+Z2V0X25hbWUoKSk7Ci0gIHN0cmluZyBzdmNuYW1lX3VjID0gdGhpcy0+bnNwYWNlX3VjICsgdG9fdXBwZXJfY2FzZShzdmNuYW1lX3UpOwotICBzdHJpbmcgZmlsZW5hbWUgPSB0aGlzLT5uc3BhY2VfbGMgKyB0b19sb3dlcl9jYXNlKHN2Y25hbWVfdSk7Ci0KLSAgLy8gbWFrZSBvdXRwdXQgZmlsZXMKLSAgc3RyaW5nIGZfaGVhZGVyX25hbWUgPSBnZXRfb3V0X2RpcigpICsgZmlsZW5hbWUgKyAiLmgiOwotICBmX2hlYWRlcl8ub3BlbihmX2hlYWRlcl9uYW1lLmNfc3RyKCkpOwotCi0gIHN0cmluZyBwcm9ncmFtX25hbWVfdSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3Jlcyhwcm9ncmFtX25hbWVfKTsKLSAgc3RyaW5nIHByb2dyYW1fbmFtZV9sYyA9IHRvX2xvd2VyX2Nhc2UocHJvZ3JhbV9uYW1lX3UpOwotCi0gIC8vIGFkZCBoZWFkZXIgZmlsZSBib2lsZXJwbGF0ZQotICBmX2hlYWRlcl8gPDwKLSAgICBhdXRvZ2VuX2NvbW1lbnQoKTsKLQotICAvLyBhZGQgYW4gaW5jbHVzaW9uIGd1YXJkCi0gIGZfaGVhZGVyXyA8PAotICAgICIjaWZuZGVmICIgPDwgc3ZjbmFtZV91YyA8PCAiX0giIDw8IGVuZGwgPDwKLSAgICAiI2RlZmluZSAiIDw8IHN2Y25hbWVfdWMgPDwgIl9IIiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICAvLyBhZGQgc3RhbmRhcmQgaW5jbHVkZXMKLSAgZl9oZWFkZXJfIDw8Ci0gICAgIiNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfZGlzcGF0Y2hfcHJvY2Vzc29yLmg+IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLSAgZl9oZWFkZXJfIDw8Ci0gICAgIiNpbmNsdWRlIFwiIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgcHJvZ3JhbV9uYW1lX2xjIDw8ICJfdHlwZXMuaFwiIiA8PCBlbmRsOwotCi0gIC8vIGlmIHdlIGFyZSBpbmhlcml0aW5nIGZyb20gYW5vdGhlciBzZXJ2aWNlLCBpbmNsdWRlIGl0cyBoZWFkZXIKLSAgdF9zZXJ2aWNlICpleHRlbmRzX3NlcnZpY2UgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKLSAgaWYgKGV4dGVuZHNfc2VydmljZSAhPSBOVUxMKSB7Ci0gICAgZl9oZWFkZXJfIDw8Ci0gICAgICAiI2luY2x1ZGUgXCIiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCB0b19sb3dlcl9jYXNlKGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhleHRlbmRzX3NlcnZpY2UtPmdldF9uYW1lKCkpKSA8PCAiLmhcIiIgPDwgZW5kbDsKLSAgfQotICBmX2hlYWRlcl8gPDwgZW5kbDsKLQotICAvLyBjcmVhdGUgdGhlIHNlcnZpY2UgaW1wbGVtZW50YXRpb24KLSAgc3RyaW5nIGZfc2VydmljZV9uYW1lID0gZ2V0X291dF9kaXIoKSArIGZpbGVuYW1lICsgIi5jIjsKLSAgZl9zZXJ2aWNlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOwotCi0gIC8vIGFkZCB0aGUgYm9pbGVycGxhY2UgaGVhZGVyCi0gIGZfc2VydmljZV8gPDwKLSAgICBhdXRvZ2VuX2NvbW1lbnQoKTsKLQotICAvLyBpbmNsdWRlIHRoZSBoZWFkZXJzCi0gIGZfc2VydmljZV8gPDwKLSAgICAiI2luY2x1ZGUgPHN0cmluZy5oPiIgPDwgZW5kbCA8PAotICAgICIjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnQuaD4iIDw8IGVuZGwgPDwKLSAgICAiI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbi5oPiIgPDwgZW5kbCA8PAotICAgICIjaW5jbHVkZSBcIiIgPDwgZmlsZW5hbWUgPDwgIi5oXCIiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIC8vIGdlbmVyYXRlIHRoZSBzZXJ2aWNlLWhlbHBlciBjbGFzc2VzCi0gIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyAodHNlcnZpY2UpOwotCi0gIC8vIGdlbmVyYXRlIHRoZSBjbGllbnQgb2JqZWN0cwotICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCAodHNlcnZpY2UpOwotCi0gIC8vIGdlbmVyYXRlIHRoZSBzZXJ2ZXIgb2JqZWN0cwotICBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlciAodHNlcnZpY2UpOwotCi0gIC8vIGVuZCB0aGUgaGVhZGVyIGluY2x1c2lvbiBndWFyZAotICBmX2hlYWRlcl8gPDwKLSAgICAiI2VuZGlmIC8qICIgPDwgc3ZjbmFtZV91YyA8PCAiX0ggKi8iIDw8IGVuZGw7Ci0KLSAgLy8gY2xvc2UgdGhlIGZpbGVzCi0gIGZfc2VydmljZV8uY2xvc2UoKTsKLSAgZl9oZWFkZXJfLmNsb3NlKCk7Ci19Ci0KLS8qKgotICoKLSAqLwotdm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uICh0X3N0cnVjdCAqdHN0cnVjdCkgewotICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7Ci0gIHN0cmluZyBuYW1lX3UgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMobmFtZSk7Ci0gIHN0cmluZyBuYW1lX2xjID0gdG9fbG93ZXJfY2FzZShuYW1lX3UpOwotICBzdHJpbmcgbmFtZV91YyA9IHRvX3VwcGVyX2Nhc2UobmFtZV91KTsKLQotICBnZW5lcmF0ZV9vYmplY3QodHN0cnVjdCk7Ci0KLSAgZl90eXBlc18gPDwgIi8qIGV4Y2VwdGlvbiAqLyIgPDwgZW5kbCA8PAotICAgICJ0eXBlZGVmIGVudW0iIDw8IGVuZGwgPDwKLSAgICAieyIgPDwgZW5kbCA8PAotICAgICIgICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IG5hbWVfdWMgPDwgIl9FUlJPUl9DT0RFLCIgPDwgZW5kbCA8PAotICAgICJ9ICIgPDwgdGhpcy0+bnNwYWNlIDw8IG5hbWUgPDwgIkVycm9yOyIgPDwgZW5kbCA8PAotICAgIGVuZGwgPDwKLSAgICAiR1F1YXJrICIgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IG5hbWVfbGMgPDwgIl9lcnJvcl9xdWFyayAodm9pZCk7IiA8PCBlbmRsIDw8Ci0gICAgIiNkZWZpbmUgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgbmFtZV91YyA8PCAiX0VSUk9SICgiIDw8Ci0gICAgICB0aGlzLT5uc3BhY2VfbGMgPDwgbmFtZV9sYyA8PCAiX2Vycm9yX3F1YXJrKCkpIiA8PCBlbmRsIDw8Ci0gICAgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgZl90eXBlc19pbXBsXyA8PAotICAgICIvKiBkZWZpbmUgdGhlIEdFcnJvciBkb21haW4gZm9yIGV4Y2VwdGlvbnMgKi8iIDw8IGVuZGwgPDwKLSAgICAiI2RlZmluZSAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBuYW1lX3VjIDw8ICJfRVJST1JfRE9NQUlOIFwiIiA8PAotICAgICAgICB0aGlzLT5uc3BhY2VfbGMgPDwgbmFtZV9sYyA8PCAiX2Vycm9yX3F1YXJrXCIiIDw8IGVuZGwgPDwKLSAgICAiR1F1YXJrIiA8PCBlbmRsIDw8Ci0gICAgdGhpcy0+bnNwYWNlX2xjIDw8IG5hbWVfbGMgPDwgIl9lcnJvcl9xdWFyayAodm9pZCkiIDw8IGVuZGwgPDwKLSAgICAieyIgPDwgZW5kbCA8PAotICAgICIgIHJldHVybiBnX3F1YXJrX2Zyb21fc3RhdGljX3N0cmluZyAoIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgbmFtZV91YyA8PAotICAgICAgICAiX0VSUk9SX0RPTUFJTik7IiA8PCBlbmRsIDw8Ci0gICAgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioKLSAqIEhFTFBFUiBGVU5DVElPTlMgKgotICoqKioqKioqKioqKioqKioqKioqLwotCi0vKioKLSAqIFJldHVybnMgdHJ1ZSBpZiB0dHlwZSBpcyBub3QgYSBwcmltaXRpdmUuCi0gKi8KLWJvb2wgdF9jX2dsaWJfZ2VuZXJhdG9yOjppc19jb21wbGV4X3R5cGUodF90eXBlICp0dHlwZSkgewotICB0dHlwZSA9IGdldF90cnVlX3R5cGUgKHR0eXBlKTsKLQotICByZXR1cm4gdHR5cGUtPmlzX2NvbnRhaW5lcigpCi0gICAgICAgICB8fCB0dHlwZS0+aXNfc3RydWN0KCkKLSAgICAgICAgIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpOwotfQotCi0KLS8qKgotICogTWFwcyBhIFRocmlmdCB0X3R5cGUgdG8gYSBDIHR5cGUuCi0gKi8KLXN0cmluZyB0X2NfZ2xpYl9nZW5lcmF0b3I6OnR5cGVfbmFtZSAodF90eXBlKiB0dHlwZSwgYm9vbCBpbl90eXBlZGVmLCBib29sIGlzX2NvbnN0KSB7Ci0gICh2b2lkKSBpbl90eXBlZGVmOwotICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgc3RyaW5nIGJuYW1lID0gYmFzZV90eXBlX25hbWUgKCh0X2Jhc2VfdHlwZSAqKSB0dHlwZSk7Ci0KLSAgICBpZiAoaXNfY29uc3QpIHsKLSAgICAgIHJldHVybiAiY29uc3QgIiArIGJuYW1lOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gYm5hbWU7Ci0gICAgfQotICB9Ci0KLSAgaWYgKHR0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgIHN0cmluZyBjbmFtZTsKLQotICAgIHRfY29udGFpbmVyICp0Y29udGFpbmVyID0gKHRfY29udGFpbmVyICopIHR0eXBlOwotICAgIGlmICh0Y29udGFpbmVyLT5oYXNfY3BwX25hbWUoKSkgewotICAgICAgY25hbWUgPSB0Y29udGFpbmVyLT5nZXRfY3BwX25hbWUoKTsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgICAgY25hbWUgPSAiR0hhc2hUYWJsZSAqIjsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgICAgLy8gc2luY2UgYSBzZXQgcmVxdWlyZXMgdW5pcXVlIGVsZW1lbnRzLCB1c2UgYSBHSGFzaFRhYmxlLCBhbmQKLSAgICAgIC8vIHBvcHVsYXRlIHRoZSBrZXlzIGFuZCB2YWx1ZXMgd2l0aCB0aGUgc2FtZSBkYXRhLCB1c2luZyBrZXlzIGZvcgotICAgICAgLy8gdGhlIGFjdHVhbCB3cml0ZXMgYW5kIHJlYWRzLgotICAgICAgLy8gVE9ETzogZGlzY3VzcyB3aGV0aGVyIG9yIG5vdCB0byBpbXBsZW1lbnQgVFNldCwgVEhhc2hTZXQgb3IgR0hhc2hTZXQKLSAgICAgIGNuYW1lID0gIkdIYXNoVGFibGUgKiI7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICAvLyBUT0RPOiBpbnZlc3RpZ2F0ZSBvdGhlciBpbXBsZW1lbnRhdGlvbnMgYmVzaWRlcyBHUHRyQXJyYXkKLSAgICAgIGNuYW1lID0gIkdQdHJBcnJheSAqIjsKLSAgICAgIHRfdHlwZSAqZXR5cGUgPSAoKHRfbGlzdCAqKSB0dHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICAgIGlmIChldHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUgKikgZXR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3QgZGV0ZXJtaW5lIGFycmF5IHR5cGUiOwotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgICAgICBjbmFtZSA9ICJHQXJyYXkgKiI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGFycmF5IGluZm8gZm9yIHR5cGUiOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGlzX2NvbnN0KSB7Ci0gICAgICByZXR1cm4gImNvbnN0ICIgKyBjbmFtZTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIGNuYW1lOwotICAgIH0KLSAgfQotCi0gIC8vIGNoZWNrIGZvciBhIG5hbWVzcGFjZQotICBzdHJpbmcgcG5hbWUgPSB0aGlzLT5uc3BhY2UgKyB0dHlwZS0+Z2V0X25hbWUoKTsKLQotICBpZiAoaXNfY29tcGxleF90eXBlICh0dHlwZSkpIHsKLSAgICBwbmFtZSArPSAiICoiOwotICB9Ci0KLSAgaWYgKGlzX2NvbnN0KSB7Ci0gICAgcmV0dXJuICJjb25zdCAiICsgcG5hbWU7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIHBuYW1lOwotICB9Ci19Ci0KLS8qKgotICogTWFwcyBhIFRocmlmdCBwcmltaXRpdmUgdG8gdGhlIHR5cGUgbmVlZGVkIHRvIGhvbGQgaXRzIHZhbHVlIHdoZW4gdXNlZCBhcyBhbgotICogb2JqZWN0IHByb3BlcnR5LgotICoKLSAqIFRoaXMgbWV0aG9kIGlzIG5lZWRlZCBiZWNhdXNlIGFsbCBpbnRlZ2VyIHByb3BlcnRpZXMgb2Ygd2lkdGggbGVzcyB0aGFuIDY0Ci0gKiBiaXRzIG1hcCB0byB0aGUgc2FtZSB0eXBlLCBnaW50LCBhcyBvcHBvc2VkIHRvIHRoZWlyIHdpZHRoLXNwZWNpZmljIHR5cGUKLSAqIChnaW50OCwgZ2ludDE2IG9yIGdpbnQzMikuCi0gKi8KLXN0cmluZyB0X2NfZ2xpYl9nZW5lcmF0b3I6OnByb3BlcnR5X3R5cGVfbmFtZSAodF90eXBlKiB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl90eXBlZGVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2NvbnN0KSB7Ci0gIHN0cmluZyByZXN1bHQ7Ci0KLSAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHN3aXRjaCAoKCh0X2Jhc2VfdHlwZSAqKSB0dHlwZSktPmdldF9iYXNlKCkpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgIGlmIChpc19jb25zdCkgewotICAgICAgICAgIHJlc3VsdCA9ICJjb25zdCBnaW50IjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICByZXN1bHQgPSAiZ2ludCI7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJlc3VsdCA9IHR5cGVfbmFtZSh0dHlwZSwgaW5fdHlwZWRlZiwgaXNfY29uc3QpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICByZXN1bHQgPSB0eXBlX25hbWUodHR5cGUsIGluX3R5cGVkZWYsIGlzX2NvbnN0KTsKLSAgfQotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogTWFwcyBhIFRocmlmdCBwcmltaXRpdmUgdG8gYSBDIHByaW1pdGl2ZS4KLSAqLwotc3RyaW5nIHRfY19nbGliX2dlbmVyYXRvcjo6YmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGUgKnR5cGUpIHsKLSAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9IHR5cGUtPmdldF9iYXNlKCk7Ci0KLSAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgIHJldHVybiAidm9pZCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgICAgcmV0dXJuICJHQnl0ZUFycmF5ICoiOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuICJnY2hhciAqIjsKLSAgICAgIH0KLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICByZXR1cm4gImdib29sZWFuIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICByZXR1cm4gImdpbnQ4IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIHJldHVybiAiZ2ludDE2IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIHJldHVybiAiZ2ludDMyIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJldHVybiAiZ2ludDY0IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIHJldHVybiAiZ2RvdWJsZSI7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gQyBiYXNlIHR5cGUgbmFtZSBmb3IgYmFzZSB0eXBlICIKLSAgICAgICAgICAgICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lICh0YmFzZSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBSZXR1cm5zIGEgbWVtYmVyIG9mIHRoZSBUaHJpZnRUeXBlIEMgZW51bWVyYXRpb24gaW4gdGhyaWZ0X3Byb3RvY29sLmgKLSAqIGZvciBhIFRocmlmdCB0eXBlLgotICovCi1zdHJpbmcgdF9jX2dsaWJfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0gKHRfdHlwZSAqdHlwZSkgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSAodHlwZSk7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUgKikgdHlwZSktPmdldF9iYXNlKCk7Ci0KLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICByZXR1cm4gIlRfU1RSSU5HIjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgcmV0dXJuICJUX0JPT0wiOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICByZXR1cm4gIlRfQllURSI7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgcmV0dXJuICJUX0kxNiI7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgcmV0dXJuICJUX0kzMiI7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgcmV0dXJuICJUX0k2NCI7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgcmV0dXJuICJUX0RPVUJMRSI7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAiVF9JMzIiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpKSB7Ci0gICAgcmV0dXJuICJUX1NUUlVDVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiAiVF9TVFJVQ1QiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgcmV0dXJuICJUX01BUCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gIlRfU0VUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICByZXR1cm4gIlRfTElTVCI7Ci0gIH0KLQotICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Ci19Ci0KLQotLyoqCi0gKiBSZXR1cm5zIGEgVGhyaWZ0IGNvbnN0YW50IGZvcm1hdHRlZCBhcyBhIGxpdGVyYWwgZm9yIGluY2x1c2lvbiBpbiBDIGNvZGUuCi0gKi8KLXN0cmluZyB0X2NfZ2xpYl9nZW5lcmF0b3I6OmNvbnN0YW50X2xpdGVyYWwodF90eXBlICp0eXBlLCB0X2NvbnN0X3ZhbHVlICp2YWx1ZSkgewotICBvc3RyaW5nc3RyZWFtIHJlbmRlcjsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAvKiBwcmltaXRpdmVzICovCi0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUgKikgdHlwZSktPmdldF9iYXNlKCk7Ci0KLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgcmVuZGVyIDw8ICJcIiIgKyB2YWx1ZS0+Z2V0X3N0cmluZygpICsgIlwiIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIHJlbmRlciA8PCAoKHZhbHVlLT5nZXRfaW50ZWdlcigpICE9IDApID8gIlRSVUUiIDogIkZBTFNFIik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIKLSAgICAgICAgICAgICAgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUgKHRiYXNlKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgdF9jb25zdF92YWx1ZTo6dF9jb25zdF92YWx1ZV90eXBlIHZhbHVlX3R5cGUgPSB2YWx1ZS0+Z2V0X3R5cGUoKTsKLQotICAgIHN3aXRjaCAodmFsdWVfdHlwZSkgewotICAgICAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9JREVOVElGSUVSOgotICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9MSVNUOgotICAgICAgICByZW5kZXIgPDwgInsgIjsKLSAgICAgICAgewotICAgICAgICAgIHRfdHlwZSAqZWxlbV90eXBlID0gKCh0X2xpc3QgKikgdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICAgICAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSAqPiAmbGlzdCA9IHZhbHVlLT5nZXRfbGlzdCgpOwotICAgICAgICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlICo+Ojpjb25zdF9pdGVyYXRvciBsaXN0X2l0ZXI7Ci0KLSAgICAgICAgICBpZiAobGlzdC5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBsaXN0X2l0ZXIgPSBsaXN0LmJlZ2luKCk7Ci0gICAgICAgICAgICByZW5kZXIgPDwgY29uc3RhbnRfbGl0ZXJhbChlbGVtX3R5cGUsICpsaXN0X2l0ZXIpOwotCi0gICAgICAgICAgICB3aGlsZSAoKytsaXN0X2l0ZXIgIT0gbGlzdC5lbmQoKSkgewotICAgICAgICAgICAgICByZW5kZXIgPDwgIiwgIiA8PCBjb25zdGFudF9saXRlcmFsKGVsZW1fdHlwZSwgKmxpc3RfaXRlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJlbmRlciA8PCAiIH0iOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfTUFQOgotICAgICAgZGVmYXVsdDoKLSAgICAgICAgcmVuZGVyIDw8ICJOVUxMIC8qIG5vdCBzdXBwb3J0ZWQgKi8iOwotICAgIH0KLSAgfQotCi0gIHJldHVybiByZW5kZXIuc3RyKCk7Ci19Ci0KLS8qKgotICogUmV0dXJucyBDIGNvZGUgdGhhdCByZXByZXNlbnRzIGEgVGhyaWZ0IGNvbnN0YW50LgotICovCi1zdHJpbmcgdF9jX2dsaWJfZ2VuZXJhdG9yOjpjb25zdGFudF92YWx1ZShzdHJpbmcgbmFtZSwgdF90eXBlICp0eXBlLCB0X2NvbnN0X3ZhbHVlICp2YWx1ZSkgewotICBvc3RyaW5nc3RyZWFtIHJlbmRlcjsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAvKiBwcmltaXRpdmVzICovCi0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUgKikgdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIHJlbmRlciA8PCAiZ19zdHJkdXAgKFwiIiArIHZhbHVlLT5nZXRfc3RyaW5nKCkgKyAiXCIpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIHJlbmRlciA8PCAoKHZhbHVlLT5nZXRfaW50ZWdlcigpICE9IDApID8gMSA6IDApOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgewotICAgICAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIKLSAgICAgICAgICAgICAgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUgKHRiYXNlKTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmVuZGVyIDw8ICIoIiA8PCB0eXBlX25hbWUgKHR5cGUpIDw8ICIpIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpIHx8IHR5cGUtPmlzX2xpc3QoKQotICAgICAgICAgICAgIHx8IHR5cGUtPmlzX3NldCgpIHx8IHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgcmVuZGVyIDw8ICIoIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwKLSAgICAgIHRvX2xvd2VyX2Nhc2UobmFtZSkgPDwgIl9jb25zdGFudCgpKSI7Ci0gIH0gZWxzZSB7Ci0gICAgcmVuZGVyIDw8ICJOVUxMIC8qIG5vdCBzdXBwb3J0ZWQgKi8iOwotICB9Ci0KLSAgcmV0dXJuIHJlbmRlci5zdHIoKTsKLX0KLQotLyoqCi0gKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd0eXBlIG5hbWUoYXJncyknCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCi0gKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCi0gKi8KLXN0cmluZyB0X2NfZ2xpYl9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgdF90eXBlKiB0dHlwZSA9IHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKTsKLSAgdF9zdHJ1Y3QqIGFyZ2xpc3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7Ci0gIHRfc3RydWN0KiB4bGlzdCA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICBzdHJpbmcgZm5hbWUgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXModGZ1bmN0aW9uLT5nZXRfbmFtZSgpKTsKLQotICBib29sIGhhc19yZXR1cm4gPSAhdHR5cGUtPmlzX3ZvaWQoKTsKLSAgYm9vbCBoYXNfYXJncyA9IGFyZ2xpc3QtPmdldF9tZW1iZXJzKCkuc2l6ZSgpID09IDA7Ci0gIGJvb2wgaGFzX3hjZXB0aW9ucyA9IHhsaXN0LT5nZXRfbWVtYmVycygpLnNpemUoKSA9PSAwOwotICByZXR1cm4KLSAgICAiZ2Jvb2xlYW4gIiArIHRoaXMtPm5zcGFjZV9sYyArIGZuYW1lICsgIiAoIiArIHRoaXMtPm5zcGFjZQotICAgICsgc2VydmljZV9uYW1lXyArICJJZiAqIGlmYWNlIgotICAgICsgKGhhc19yZXR1cm4gPyAiLCAiICsgdHlwZV9uYW1lKHR0eXBlKSArICIqIF9yZXR1cm4iIDogIiIpCi0gICAgKyAoaGFzX2FyZ3MgPyAiIiA6ICgiLCAiICsgYXJndW1lbnRfbGlzdCAoYXJnbGlzdCkpKSAKLSAgICArIChoYXNfeGNlcHRpb25zID8gIiIgOiAoIiwgIiArIHhjZXB0aW9uX2xpc3QgKHhsaXN0KSkpCi0gICAgKyAiLCBHRXJyb3IgKiogZXJyb3IpIjsKLX0KLQotLyoqCi0gKiBSZW5kZXJzIGEgZmllbGQgbGlzdAotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICogQHJldHVybiBDb21tYSBzZXBlYXJhdGVkIGxpc3Qgb2YgYWxsIGZpZWxkIG5hbWVzIGluIHRoYXQgc3RydWN0Ci0gKi8KLXN0cmluZyB0X2NfZ2xpYl9nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QgKHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIHN0cmluZyByZXN1bHQgPSAiIjsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgcmVzdWx0ICs9ICIsICI7Ci0gICAgfQotICAgIHJlc3VsdCArPSB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgdHJ1ZSkgKyAiICIgKwotICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBSZW5kZXJzIG11dGFibGUgZXhjZXB0aW9uIGxpc3RzCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKiBAcmV0dXJuIENvbW1hIHNlcGVhcmF0ZWQgbGlzdCBvZiBhbGwgZmllbGQgbmFtZXMgaW4gdGhhdCBzdHJ1Y3QKLSAqLwotc3RyaW5nIHRfY19nbGliX2dlbmVyYXRvcjo6eGNlcHRpb25fbGlzdCAodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgc3RyaW5nIHJlc3VsdCA9ICIiOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXN1bHQgKz0gIiwgIjsKLSAgICB9Ci0gICAgcmVzdWx0ICs9IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF90eXBlKCksIGZhbHNlLCBmYWxzZSkgKyAiKiAiICsKLSAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLQotLyoqCi0gKiBEZWNsYXJlcyBhIGZpZWxkLCBpbmNsdWRpbmcgYW55IG5lY2Vzc2FyeSBpbml0aWFsaXphdGlvbi4KLSAqLwotc3RyaW5nIHRfY19nbGliX2dlbmVyYXRvcjo6ZGVjbGFyZV9maWVsZCh0X2ZpZWxkICp0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwb2ludGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNvbnN0YW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlZmVyZW5jZSkgewotICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0gIGlmIChjb25zdGFudCkgewotICAgIHJlc3VsdCArPSAiY29uc3QgIjsKLSAgfQotICByZXN1bHQgKz0gdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0gIGlmIChwb2ludGVyKSB7Ci0gICAgcmVzdWx0ICs9ICIqIjsKLSAgfQotICBpZiAocmVmZXJlbmNlKSB7Ci0gICAgcmVzdWx0ICs9ICIqIjsKLSAgfQotICByZXN1bHQgKz0gIiAiICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICBpZiAoaW5pdCkgewotICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLQotICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUgKikgdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgICAgcmVzdWx0ICs9ICIgPSAwIjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgICAgcmVzdWx0ICs9ICIgPSAoZ2RvdWJsZSkgMCI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICAgIHJlc3VsdCArPSAiID0gTlVMTCI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBDIGludGlhbGl6ZXIgZm9yIGJhc2UgdHlwZSAiCi0gICAgICAgICAgICAgICAgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUgKHRiYXNlKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgcmVzdWx0ICs9ICIgPSAoIiArIHR5cGVfbmFtZSAodHlwZSkgKyAiKSAwIjsKLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgICByZXN1bHQgKz0gIiA9IE5VTEwiOwotICAgIH0KLSAgfQotCi0gIGlmICghcmVmZXJlbmNlKSB7Ci0gICAgcmVzdWx0ICs9ICI7IjsKLSAgfQotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIEMgY29kZSB0aGF0IGluaXRpYWxpemVzIGNvbXBsZXggY29uc3RhbnRzLgotICovCi12b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3RfaW5pdGlhbGl6ZXIoc3RyaW5nIG5hbWUsIHRfdHlwZSAqdHlwZSwgdF9jb25zdF92YWx1ZSAqdmFsdWUpIHsKLSAgc3RyaW5nIG5hbWVfdSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhuYW1lKTsKLSAgc3RyaW5nIG5hbWVfbGMgPSB0b19sb3dlcl9jYXNlKG5hbWVfdSk7Ci0gIHN0cmluZyB0eXBlX3UgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXModHlwZS0+Z2V0X25hbWUoKSk7Ci0gIHN0cmluZyB0eXBlX3VjID0gdG9fdXBwZXJfY2FzZSh0eXBlX3UpOwotCi0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQgKj4gJmZpZWxkcyA9ICgodF9zdHJ1Y3QgKikgdHlwZSktPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQgKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSAqLCB0X2NvbnN0X3ZhbHVlICo+ICZ2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlICosIHRfY29uc3RfdmFsdWUgKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBvc3RyaW5nc3RyZWFtIGluaXRpYWxpemVyczsKLQotICAgIC8vIGluaXRpYWxpemUgYW55IGNvbnN0YW50cyB0aGF0IG1heSBiZSByZWZlcmVuY2VkIGJ5IHRoaXMgaW5pdGlhbGl6ZXIKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgdF90eXBlICpmaWVsZF90eXBlID0gTlVMTDsKLSAgICAgIHN0cmluZyBmaWVsZF9uYW1lID0gIiI7Ci0KLSAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7Ci0gICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKLSAgICAgICAgICBmaWVsZF9uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7Ci0gICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIKLSAgICAgICAgICAgICAgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7Ci0gICAgICB9Ci0gICAgICBmaWVsZF9uYW1lID0gdG1wIChmaWVsZF9uYW1lKTsKLQotICAgICAgZ2VuZXJhdGVfY29uc3RfaW5pdGlhbGl6ZXIgKG5hbWUgKyAiX2NvbnN0YW50XyIgKyBmaWVsZF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKLSAgICAgIGluaXRpYWxpemVycyA8PAotICAgICAgICAiICAgIGNvbnN0YW50LT4iIDw8IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSA8PCAiID0gIiA8PAotICAgICAgICBjb25zdGFudF92YWx1ZSAobmFtZSArICJfY29uc3RhbnRfIiArIGZpZWxkX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCkgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICAgICAgIiAgICBjb25zdGFudC0+X19pc3NldF8iIDw8IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSA8PAotICAgICAgICAiID0gVFJVRTsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgLy8gaW1wbGVtZW50IHRoZSBpbml0aWFsaXplcgotICAgIGZfdHlwZXNfaW1wbF8gPDwKLSAgICAgICJzdGF0aWMgIiA8PCB0aGlzLT5uc3BhY2UgPDwgdHlwZS0+Z2V0X25hbWUoKSA8PCAiICoiIDw8IGVuZGwgPDwKLSAgICAgIHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX2xjIDw8ICJfY29uc3RhbnQgKHZvaWQpIiA8PCBlbmRsIDw8Ci0gICAgICAieyIgPDwgZW5kbCA8PAotICAgICAgIiAgc3RhdGljICIgPDwgdGhpcy0+bnNwYWNlIDw8IHR5cGUtPmdldF9uYW1lKCkgPDwKLSAgICAgICAgICAiICpjb25zdGFudCA9IE5VTEw7IiA8PCBlbmRsIDw8Ci0gICAgICAiICBpZiAoY29uc3RhbnQgPT0gTlVMTCkiIDw8IGVuZGwgPDwKLSAgICAgICIgIHsiIDw8IGVuZGwgPDwKLSAgICAgICIgICAgY29uc3RhbnQgPSBnX29iamVjdF9uZXcgKCIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIgPDwKLSAgICAgICAgICB0eXBlX3VjIDw8ICIsIE5VTEwpOyIgPDwgZW5kbCA8PAotICAgICAgaW5pdGlhbGl6ZXJzLnN0cigpIDw8IGVuZGwgPDwKLSAgICAgICIgIH0iIDw8IGVuZGwgPDwKLSAgICAgICIgIHJldHVybiBjb25zdGFudDsiIDw8IGVuZGwgPDwKLSAgICAgICJ9IiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHN0cmluZyBsaXN0X3R5cGUgPSAiR1B0ckFycmF5ICoiOwotICAgIC8vIFRPRE86IFRoaXMgaW5pdGlhbGl6YXRpb24gc2hvdWxkIGNvbnRhaW4gYSBmcmVlIGZ1bmN0aW9uIGZvciBjb250YWluZXIKLSAgICBzdHJpbmcgbGlzdF9pbml0aWFsaXplciA9ICJnX3B0cl9hcnJheV9uZXcoKTsiOwotICAgIHN0cmluZyBsaXN0X2FwcGVuZGVyID0gImdfcHRyX2FycmF5X2FkZCI7Ci0gICAgYm9vbCBsaXN0X3ZhcmlhYmxlID0gZmFsc2U7Ci0KLSAgICB0X3R5cGUqIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7Ci0gICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIG9zdHJpbmdzdHJlYW0gaW5pdGlhbGl6ZXJzOwotCi0gICAgbGlzdF9pbml0aWFsaXplciA9IGdlbmVyYXRlX25ld19hcnJheV9mcm9tX3R5cGUgKGV0eXBlKTsKLSAgICBpZiAoZXR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSAqKSBldHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBkZXRlcm1pbmUgYXJyYXkgdHlwZSI7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgICBsaXN0X3R5cGUgPSAiR0FycmF5ICoiOwotICAgICAgICAgIGxpc3RfYXBwZW5kZXIgPSAiZ19hcnJheV9hcHBlbmRfdmFsIjsKLSAgICAgICAgICBsaXN0X3ZhcmlhYmxlID0gdHJ1ZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBhcnJheSBpbmZvIGZvciB0eXBlIjsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgc3RyaW5nIGZuYW1lID0gdG1wIChuYW1lKTsKLQotICAgICAgZ2VuZXJhdGVfY29uc3RfaW5pdGlhbGl6ZXIgKGZuYW1lLCBldHlwZSwgKCp2X2l0ZXIpKTsKLSAgICAgIGlmIChsaXN0X3ZhcmlhYmxlKSB7Ci0gICAgICAgIGluaXRpYWxpemVycyA8PAotICAgICAgICAgICIgICAgIiA8PCB0eXBlX25hbWUgKGV0eXBlKSA8PCAiICIgPDwgZm5hbWUgPDwgIiA9ICIgPDwKLSAgICAgICAgICAgIGNvbnN0YW50X3ZhbHVlIChmbmFtZSwgKHRfdHlwZSAqKSBldHlwZSwgKCp2X2l0ZXIpKSA8PCAiOyIgPDwKLSAgICAgICAgICAgICAgICBlbmRsIDw8Ci0gICAgICAgICAgIiAgICAiIDw8IGxpc3RfYXBwZW5kZXIgPDwgIihjb25zdGFudCwgIiA8PCBmbmFtZSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpbml0aWFsaXplcnMgPDwKLSAgICAgICAgICAiICAgICIgPDwgbGlzdF9hcHBlbmRlciA8PCAiKGNvbnN0YW50LCAiIDw8Ci0gICAgICAgICAgY29uc3RhbnRfdmFsdWUgKGZuYW1lLCAodF90eXBlICopIGV0eXBlLCAoKnZfaXRlcikpIDw8ICIpOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBmX3R5cGVzX2ltcGxfIDw8Ci0gICAgICAic3RhdGljICIgPDwgbGlzdF90eXBlIDw8IGVuZGwgPDwKLSAgICAgIHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX2xjIDw8ICJfY29uc3RhbnQgKHZvaWQpIiA8PCBlbmRsIDw8Ci0gICAgICAieyIgPDwgZW5kbCA8PAotICAgICAgIiAgc3RhdGljICIgPDwgbGlzdF90eXBlIDw8ICIgY29uc3RhbnQgPSBOVUxMOyIgPDwgZW5kbCA8PAotICAgICAgIiAgaWYgKGNvbnN0YW50ID09IE5VTEwpIiA8PCBlbmRsIDw8Ci0gICAgICAiICB7IiA8PCBlbmRsIDw8Ci0gICAgICAiICAgIGNvbnN0YW50ID0gIiA8PCBsaXN0X2luaXRpYWxpemVyIDw8IGVuZGwgPDwKLSAgICAgIGluaXRpYWxpemVycy5zdHIoKSA8PCBlbmRsIDw8Ci0gICAgICAiICB9IiA8PCBlbmRsIDw8Ci0gICAgICAiICByZXR1cm4gY29uc3RhbnQ7IiA8PCBlbmRsIDw8Ci0gICAgICAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICB0X3R5cGUgKmV0eXBlID0gKCh0X3NldCAqKSB0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlICo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKLSAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgb3N0cmluZ3N0cmVhbSBpbml0aWFsaXplcnM7Ci0KLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgc3RyaW5nIGZuYW1lID0gdG1wIChuYW1lKTsKLSAgICAgIGdlbmVyYXRlX2NvbnN0X2luaXRpYWxpemVyIChmbmFtZSwgZXR5cGUsICgqdl9pdGVyKSk7Ci0gICAgICBpbml0aWFsaXplcnMgPDwKLSAgICAgICAgIiAgICAiIDw8IHR5cGVfbmFtZSAoZXR5cGUpIDw8ICIgIiA8PCBmbmFtZSA8PCAiID0gIiA8PAotICAgICAgICAgIGNvbnN0YW50X3ZhbHVlIChmbmFtZSwgKHRfdHlwZSAqKSBldHlwZSwgKCp2X2l0ZXIpKSA8PCAiOyIgPDwgZW5kbCA8PAotICAgICAgICAiICAgIGdfaGFzaF90YWJsZV9pbnNlcnQgKGNvbnN0YW50LCAmIiA8PCBmbmFtZSA8PCAiLCAmIiA8PCBmbmFtZSA8PAotICAgICAgICAiKTsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgZl90eXBlc19pbXBsXyA8PAotICAgICAgInN0YXRpYyBHSGFzaFRhYmxlICoiIDw8IGVuZGwgPDwKLSAgICAgIHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX2xjIDw8ICJfY29uc3RhbnQgKHZvaWQpIiA8PCBlbmRsIDw8Ci0gICAgICAieyIgPDwgZW5kbCA8PAotICAgICAgIiAgc3RhdGljIEdIYXNoVGFibGUgKmNvbnN0YW50ID0gTlVMTDsiIDw8IGVuZGwgPDwKLSAgICAgICIgIGlmIChjb25zdGFudCA9PSBOVUxMKSIgPDwgZW5kbCA8PAotICAgICAgIiAgeyIgPDwgZW5kbCA8PAotICAgICAgLy8gVE9ETzogVGhpcyBpbml0aWFsaXphdGlvbiBzaG91bGQgY29udGFpbiBhIGZyZWUgZnVuY3Rpb24gZm9yIGVsZW1lbnRzCi0gICAgICAiICAgIGNvbnN0YW50ID0gZ19oYXNoX3RhYmxlX25ldyAoTlVMTCwgTlVMTCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbml0aWFsaXplcnMuc3RyKCkgPDwgZW5kbCA8PAotICAgICAgIiAgfSIgPDwgZW5kbCA8PAotICAgICAgIiAgcmV0dXJuIGNvbnN0YW50OyIgPDwgZW5kbCA8PAotICAgICAgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsOyAKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHRfdHlwZSAqa3R5cGUgPSAoKHRfbWFwICopIHR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKLSAgICB0X3R5cGUgKnZ0eXBlID0gKCh0X21hcCAqKSB0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUgKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOwotICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBvc3RyaW5nc3RyZWFtIGluaXRpYWxpemVyczsKLQotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBzdHJpbmcgZm5hbWUgPSB0bXAgKG5hbWUpOwotICAgICAgc3RyaW5nIGtuYW1lID0gZm5hbWUgKyAia2V5IjsKLSAgICAgIHN0cmluZyB2bmFtZSA9IGZuYW1lICsgInZhbCI7Ci0gICAgICBnZW5lcmF0ZV9jb25zdF9pbml0aWFsaXplciAoa25hbWUsIGt0eXBlLCAoKnZfaXRlcikpOwotICAgICAgZ2VuZXJhdGVfY29uc3RfaW5pdGlhbGl6ZXIgKHZuYW1lLCB2dHlwZSwgKCp2X2l0ZXIpKTsKLQotICAgICAgaW5pdGlhbGl6ZXJzIDw8Ci0gICAgICAgICIgICAgIiA8PCB0eXBlX25hbWUgKGt0eXBlKSA8PCAiICIgPDwga25hbWUgPDwgIiA9ICIgPDwKLSAgICAgICAgICBjb25zdGFudF92YWx1ZSAoa25hbWUsICh0X3R5cGUgKikga3R5cGUsICgqdl9pdGVyKSkgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICAgICAgIiAgICAiIDw8IHR5cGVfbmFtZSAodnR5cGUpIDw8ICIgIiA8PCB2bmFtZSA8PCAiID0gIiA8PAotICAgICAgICAgIGNvbnN0YW50X3ZhbHVlICh2bmFtZSwgKHRfdHlwZSAqKSB2dHlwZSwgKCp2X2l0ZXIpKSA8PCAiOyIgPDwgZW5kbCA8PAotICAgICAgICAiICAgIGdfaGFzaF90YWJsZV9pbnNlcnQgKGNvbnN0YW50LCAmIiA8PCBmbmFtZSA8PCAiLCAmIiA8PCBmbmFtZSA8PAotICAgICAgICAiKTsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgZl90eXBlc19pbXBsXyA8PAotICAgICAgInN0YXRpYyBHSGFzaFRhYmxlICoiIDw8IGVuZGwgPDwKLSAgICAgIHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX2xjIDw8ICJfY29uc3RhbnQgKHZvaWQpIiA8PCBlbmRsIDw8Ci0gICAgICAieyIgPDwgZW5kbCA8PAotICAgICAgIiAgc3RhdGljIEdIYXNoVGFibGUgKmNvbnN0YW50ID0gTlVMTDsiIDw8IGVuZGwgPDwKLSAgICAgICIgIGlmIChjb25zdGFudCA9PSBOVUxMKSIgPDwgZW5kbCA8PAotICAgICAgIiAgeyIgPDwgZW5kbCA8PAotICAgICAgLy8gVE9ETzogVGhpcyBpbml0aWFsaXphdGlvbiBzaG91bGQgY29udGFpbiBhIGZyZWUgZnVuY3Rpb24gZm9yIGVsZW1lbnRzCi0gICAgICAiICAgIGNvbnN0YW50ID0gZ19oYXNoX3RhYmxlX25ldyAoTlVMTCwgTlVMTCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbml0aWFsaXplcnMuc3RyKCkgPDwgZW5kbCA8PAotICAgICAgIiAgfSIgPDwgZW5kbCA8PAotICAgICAgIiAgcmV0dXJuIGNvbnN0YW50OyIgPDwgZW5kbCA8PAotICAgICAgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGhlbHBlciBjbGFzc2VzIGZvciBhIHNlcnZpY2UsIGNvbnNpc3Rpbmcgb2YgYSBUaHJpZnRTdHJ1Y3Qgc3ViY2xhc3MKLSAqIGZvciB0aGUgYXJndW1lbnRzIHRvIGFuZCB0aGUgcmVzdWx0IGZyb20gZWFjaCBtZXRob2QuCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGZvciB3aGljaCB0byBnZW5lcmF0ZSBoZWxwZXIgY2xhc3NlcwotICovCi12b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSAqdHNlcnZpY2UpIHsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmdW5jdGlvbl9pdGVyOwotCi0gIC8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgc2VydmljZSdzIG1ldGhvZHMKLSAgZm9yIChmdW5jdGlvbl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7Ci0gICAgICAgZnVuY3Rpb25faXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7Ci0gICAgICAgKytmdW5jdGlvbl9pdGVyKSB7Ci0gICAgc3RyaW5nIGZ1bmN0aW9uX25hbWUgPSAoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIHRfc3RydWN0ICphcmdfbGlzdCA9ICgqZnVuY3Rpb25faXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgc3RyaW5nIGFyZ19saXN0X25hbWVfb3JpZyA9IGFyZ19saXN0LT5nZXRfbmFtZSgpOwotCi0gICAgLy8gR2VuZXJhdGUgdGhlIGFyZ3VtZW50cyBjbGFzcwotICAgIGFyZ19saXN0LT5zZXRfbmFtZSh0c2VydmljZS0+Z2V0X25hbWUoKSArCi0gICAgICAgICAgICAgICAgICAgICAgIHVuZGVyc2NvcmVzX3RvX2luaXRpYWxfY2FwcyhmdW5jdGlvbl9uYW1lKSArCi0gICAgICAgICAgICAgICAgICAgICAgICJBcmdzIik7Ci0gICAgZ2VuZXJhdGVfc3RydWN0KGFyZ19saXN0KTsKLQotICAgIGFyZ19saXN0LT5zZXRfbmFtZShhcmdfbGlzdF9uYW1lX29yaWcpOwotCi0gICAgLy8gR2VuZXJhdGUgdGhlIHJlc3VsdCBjbGFzcwotICAgIGlmICghKCpmdW5jdGlvbl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywKLSAgICAgICAgICAgICAgICAgICAgICB0c2VydmljZS0+Z2V0X25hbWUoKSArCi0gICAgICAgICAgICAgICAgICAgICAgdW5kZXJzY29yZXNfdG9faW5pdGlhbF9jYXBzKGZ1bmN0aW9uX25hbWUpICsKLSAgICAgICAgICAgICAgICAgICAgICAiUmVzdWx0Iik7Ci0gICAgICB0X2ZpZWxkIHN1Y2Nlc3MoKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKLSAgICAgIHN1Y2Nlc3Muc2V0X3JlcSh0X2ZpZWxkOjpUX09QVElPTkFMKTsKLSAgICAgIGlmICghKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOwotICAgICAgfQotCi0gICAgICB0X3N0cnVjdCogeHMgPSAoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7Ci0gICAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZpZWxkX2l0ZXI7Ci0gICAgICBmb3IgKGZpZWxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsKLSAgICAgICAgICAgZmllbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7Ci0gICAgICAgICAgICsrZmllbGRfaXRlcikgewotICAgICAgICAoKmZpZWxkX2l0ZXIpLT5zZXRfcmVxKHRfZmllbGQ6OlRfT1BUSU9OQUwpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCpmaWVsZF9pdGVyKTsKLSAgICAgIH0KLQotICAgICAgZ2VuZXJhdGVfc3RydWN0KCZyZXN1bHQpOwotICAgIH0KLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBDIGNvZGUgdGhhdCByZXByZXNlbnRzIGEgVGhyaWZ0IHNlcnZpY2UgY2xpZW50LgotICovCi12b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlICp0c2VydmljZSkgewotICAvKiBnZXQgc29tZSBDIGZyaWVuZGx5IHNlcnZpY2UgbmFtZXMgKi8KLSAgc3RyaW5nIHNlcnZpY2VfbmFtZV9sYyA9IHRvX2xvd2VyX2Nhc2UoaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKHNlcnZpY2VfbmFtZV8pKTsKLSAgc3RyaW5nIHNlcnZpY2VfbmFtZV91YyA9IHRvX3VwcGVyX2Nhc2Uoc2VydmljZV9uYW1lX2xjKTsKLQotICBzdHJpbmcgcGFyZW50X3NlcnZpY2VfbmFtZTsKLSAgc3RyaW5nIHBhcmVudF9zZXJ2aWNlX25hbWVfbGM7Ci0gIHN0cmluZyBwYXJlbnRfc2VydmljZV9uYW1lX3VjOwotCi0gIHN0cmluZyBwYXJlbnRfY2xhc3NfbmFtZSA9ICJHT2JqZWN0IjsKLSAgc3RyaW5nIHBhcmVudF90eXBlX25hbWUgPSAiR19UWVBFX09CSkVDVCI7Ci0KLSAgLy8gVGhlIHNlcnZpY2UgdGhpcyBzZXJ2aWNlIGV4dGVuZHMsIG9yIE5VTEwgaWYgaXQgZXh0ZW5kcyBubwotICAvLyBzZXJ2aWNlCi0gIHRfc2VydmljZSAqZXh0ZW5kc19zZXJ2aWNlID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7Ci0gIGlmIChleHRlbmRzX3NlcnZpY2UpIHsKLSAgICAvLyBUaGUgbmFtZSBvZiB0aGUgcGFyZW50IHNlcnZpY2UKLSAgICBwYXJlbnRfc2VydmljZV9uYW1lID0gZXh0ZW5kc19zZXJ2aWNlLT5nZXRfbmFtZSgpOwotICAgIHBhcmVudF9zZXJ2aWNlX25hbWVfbGMgPQotICAgICAgdG9fbG93ZXJfY2FzZShpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMocGFyZW50X3NlcnZpY2VfbmFtZSkpOwotICAgIHBhcmVudF9zZXJ2aWNlX25hbWVfdWMgPSB0b191cHBlcl9jYXNlKHBhcmVudF9zZXJ2aWNlX25hbWVfbGMpOwotCi0gICAgLy8gVGhlIG5hbWVzIG9mIHRoZSBjbGllbnQgY2xhc3MnIHBhcmVudCBjbGFzcyBhbmQgdHlwZQotICAgIHBhcmVudF9jbGFzc19uYW1lID0gdGhpcy0+bnNwYWNlICsgcGFyZW50X3NlcnZpY2VfbmFtZSArICJDbGllbnQiOwotICAgIHBhcmVudF90eXBlX25hbWUgPQotICAgICAgdGhpcy0+bnNwYWNlX3VjICsgIlRZUEVfIiArIHBhcmVudF9zZXJ2aWNlX25hbWVfdWMgKyAiX0NMSUVOVCI7Ci0gIH0KLQotICAvLyBUaGUgYmFzZSBzZXJ2aWNlICh0aGUgdG9wbW9zdCBpbiB0aGUgImV4dGVuZHMiIGhpZXJhcmNoeSksIG9uCi0gIC8vIHdob3NlIGNsaWVudCBjbGFzcyB0aGUgImlucHV0X3Byb3RvY29sIiBhbmQgIm91dHB1dF9wcm90b2NvbCIKLSAgLy8gcHJvcGVydGllcyBhcmUgZGVmaW5lZAotICB0X3NlcnZpY2UgKmJhc2Vfc2VydmljZSA9IHRzZXJ2aWNlOwotICB3aGlsZSAoYmFzZV9zZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKSB7Ci0gICAgYmFzZV9zZXJ2aWNlID0gYmFzZV9zZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOwotICB9Ci0KLSAgc3RyaW5nIGJhc2Vfc2VydmljZV9uYW1lID0gYmFzZV9zZXJ2aWNlLT5nZXRfbmFtZSgpOwotICBzdHJpbmcgYmFzZV9zZXJ2aWNlX25hbWVfbGMgPQotICAgIHRvX2xvd2VyX2Nhc2UoaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKGJhc2Vfc2VydmljZV9uYW1lKSk7Ci0gIHN0cmluZyBiYXNlX3NlcnZpY2VfbmFtZV91YyA9IHRvX3VwcGVyX2Nhc2UoYmFzZV9zZXJ2aWNlX25hbWVfbGMpOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBjbGllbnQgaW50ZXJmYWNlIGR1bW15IG9iamVjdCBpbiB0aGUgaGVhZGVyLgotICBmX2hlYWRlcl8gPDwKLSAgICAiLyogIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICIgc2VydmljZSBpbnRlcmZhY2UgKi8iIDw8IGVuZGwgPDwKLSAgICAidHlwZWRlZiBzdHJ1Y3QgXyIgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmICIgPDwKLSAgICAgICAgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmOyAiIDw8Ci0gICAgICAgICIgLyogZHVtbXkgb2JqZWN0ICovIiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgY2xpZW50IGludGVyZmFjZSBvYmplY3QgaW4gdGhlIGhlYWRlci4KLSAgZl9oZWFkZXJfIDw8Ci0gICAgInN0cnVjdCBfIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiSWZJbnRlcmZhY2UiIDw8IGVuZGwgPDwKLSAgICAieyIgPDwgZW5kbCA8PAotICAgICIgIEdUeXBlSW50ZXJmYWNlIHBhcmVudDsiIDw8IGVuZGwgPDwKLSAgZW5kbDsKLQotICAvKiB3cml0ZSBvdXQgdGhlIGZ1bmN0aW9ucyBmb3IgdGhpcyBpbnRlcmZhY2UgKi8KLSAgaW5kZW50X3VwKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIC8qIG1ha2UgdGhlIGZ1bmN0aW9uIG5hbWUgQyBmcmllbmRseSAqLwotICAgIHN0cmluZyBmdW5uYW1lID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSk7Ci0gICAgdF90eXBlICp0dHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKTsKLSAgICB0X3N0cnVjdCAqYXJnbGlzdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLSAgICB0X3N0cnVjdCAqeGxpc3QgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKLSAgICBib29sIGhhc19yZXR1cm4gPSAhdHR5cGUtPmlzX3ZvaWQoKTsKLSAgICBib29sIGhhc19hcmdzID0gYXJnbGlzdC0+Z2V0X21lbWJlcnMoKS5zaXplKCkgPT0gMDsKLSAgICBib29sIGhhc194Y2VwdGlvbnMgPSB4bGlzdC0+Z2V0X21lbWJlcnMoKS5zaXplKCkgPT0gMDsKLQotICAgIHN0cmluZyBwYXJhbXMgPSAiKCIgKyB0aGlzLT5uc3BhY2UgKyBzZXJ2aWNlX25hbWVfICsgIklmICppZmFjZSIKLSAgICAgICAgICAgICAgICAgICAgKyAoaGFzX3JldHVybiA/ICIsICIgKyB0eXBlX25hbWUgKHR0eXBlKSArICIqIF9yZXR1cm4iIDogIiIpCi0gICAgICAgICAgICAgICAgICAgICsgKGhhc19hcmdzID8gIiIgOiAoIiwgIiArIGFyZ3VtZW50X2xpc3QgKGFyZ2xpc3QpKSkKLSAgICAgICAgICAgICAgICAgICAgKyAoaGFzX3hjZXB0aW9ucyA/ICIiIDogKCIsICIgKyB4Y2VwdGlvbl9saXN0ICh4bGlzdCkpKQotICAgICAgICAgICAgICAgICAgICArICIsIEdFcnJvciAqKmVycm9yKSI7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgIGluZGVudChmX2hlYWRlcl8pIDw8ICJnYm9vbGVhbiAoKiIgPDwgZnVubmFtZSA8PCAiKSAiIDw8IHBhcmFtcyA8PCAiOyIgPDwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kbDsKLSAgfQotICBpbmRlbnRfZG93bigpOwotCi0gIGZfaGVhZGVyXyA8PAotICAgICJ9OyIgPDwgZW5kbCA8PAotICAgICJ0eXBlZGVmIHN0cnVjdCBfIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiSWZJbnRlcmZhY2UgIiA8PAotICAgICAgICB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiSWZJbnRlcmZhY2U7IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICAvLyBnZW5lcmF0ZSBhbGwgdGhlIGludGVyZmFjZSBib2lsZXJwbGF0ZQotICBmX2hlYWRlcl8gPDwKLSAgICAiR1R5cGUgIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjIDw8Ci0gICAgICAgICJfaWZfZ2V0X3R5cGUgKHZvaWQpOyIgPDwgZW5kbCA8PAotICAgICIjZGVmaW5lICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSUYgIiA8PAotICAgICAgICAiKCIgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IHNlcnZpY2VfbmFtZV9sYyA8PCAiX2lmX2dldF90eXBlKCkpIiA8PAotICAgICAgICBlbmRsIDw8Ci0gICAgIiNkZWZpbmUgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSUYob2JqKSAiIDw8Ci0gICAgICAgICIoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCAiIDw8Ci0gICAgICAgIHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0lGLCAiIDw8Ci0gICAgICAgIHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZikpIiA8PCBlbmRsIDw8Ci0gICAgIiNkZWZpbmUgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIklTXyIgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSUYob2JqKSAiIDw8Ci0gICAgICAgICIoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCAiIDw8Ci0gICAgICAgIHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0lGKSkiIDw8IGVuZGwgPDwKLSAgICAiI2RlZmluZSAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBzZXJ2aWNlX25hbWVfdWMgPDwKLSAgICAgICAgIl9JRl9HRVRfSU5URVJGQUNFKGluc3QpIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0lOVEVSRkFDRSAoKGluc3QpLCAiIDw8Ci0gICAgICAgIHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0lGLCAiIDw8Ci0gICAgICAgIHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZkludGVyZmFjZSkpIiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICAvLyB3cml0ZSBvdXQgYWxsIHRoZSBpbnRlcmZhY2UgZnVuY3Rpb24gcHJvdG90eXBlcwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIC8qIG1ha2UgdGhlIGZ1bmN0aW9uIG5hbWUgQyBmcmllbmRseSAqLwotICAgIHN0cmluZyBmdW5uYW1lID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSk7Ci0gICAgdF90eXBlICp0dHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKTsKLSAgICB0X3N0cnVjdCAqYXJnbGlzdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLSAgICB0X3N0cnVjdCAqeGxpc3QgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKLSAgICBib29sIGhhc19yZXR1cm4gPSAhdHR5cGUtPmlzX3ZvaWQoKTsKLSAgICBib29sIGhhc19hcmdzID0gYXJnbGlzdC0+Z2V0X21lbWJlcnMoKS5zaXplKCkgPT0gMDsKLSAgICBib29sIGhhc194Y2VwdGlvbnMgPSB4bGlzdC0+Z2V0X21lbWJlcnMoKS5zaXplKCkgPT0gMDsKLQotICAgIHN0cmluZyBwYXJhbXMgPSAiKCIgKyB0aGlzLT5uc3BhY2UgKyBzZXJ2aWNlX25hbWVfICsgIklmICppZmFjZSIKLSAgICAgICAgICAgICAgICAgICAgKyAoaGFzX3JldHVybiA/ICIsICIgKyB0eXBlX25hbWUgKHR0eXBlKSArICIqIF9yZXR1cm4iIDogIiIpCi0gICAgICAgICAgICAgICAgICAgICsgKGhhc19hcmdzID8gIiIgOiAoIiwgIiArIGFyZ3VtZW50X2xpc3QgKGFyZ2xpc3QpKSkKLSAgICAgICAgICAgICAgICAgICAgKyAoaGFzX3hjZXB0aW9ucyA/ICIiIDogKCIsICIgKyB4Y2VwdGlvbl9saXN0ICh4bGlzdCkpKQotICAgICAgICAgICAgICAgICAgICArICIsIEdFcnJvciAqKmVycm9yKSI7Ci0KLSAgICBmX2hlYWRlcl8gPDwgImdib29sZWFuICIgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IHNlcnZpY2VfbmFtZV9sYyA8PAotICAgICAgICAgICAgICAgICAiX2lmXyIgPDwgZnVubmFtZSA8PCAiICIgPDwgcGFyYW1zIDw8ICI7IiA8PCBlbmRsOwotICB9Ci0gIGZfaGVhZGVyXyA8PCBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBjbGllbnQgb2JqZWN0IGluc3RhbmNlIGRlZmluaXRpb24gaW4gdGhlIGhlYWRlci4KLSAgZl9oZWFkZXJfIDw8Ci0gICAgIi8qICIgPDwgc2VydmljZV9uYW1lXyA8PCAiIHNlcnZpY2UgY2xpZW50ICovIiA8PCBlbmRsIDw8Ci0gICAgInN0cnVjdCBfIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50IiA8PCBlbmRsIDw8Ci0gICAgInsiIDw8IGVuZGwgPDwKLSAgICAiICAiIDw8IHBhcmVudF9jbGFzc19uYW1lIDw8ICIgcGFyZW50OyIgPDwgZW5kbDsKLSAgaWYgKCFleHRlbmRzX3NlcnZpY2UpIHsKLSAgICAvLyBEZWZpbmUgImlucHV0X3Byb3RvY29sIiBhbmQgIm91dHB1dF9wcm90b2NvbCIgcHJvcGVydGllcyBvbmx5Ci0gICAgLy8gZm9yIGJhc2Ugc2VydmljZXM7IGNoaWxkIHNlcnZpY2UtY2xpZW50IGNsYXNzZXMgd2lsbCBpbmhlcml0Ci0gICAgLy8gdGhlc2UKLSAgICBmX2hlYWRlcl8gPDwKLSAgICAgIGVuZGwgPDwKLSAgICAgICIgIFRocmlmdFByb3RvY29sICppbnB1dF9wcm90b2NvbDsiIDw8IGVuZGwgPDwKLSAgICAgICIgIFRocmlmdFByb3RvY29sICpvdXRwdXRfcHJvdG9jb2w7IiA8PCBlbmRsOwotICB9Ci0gIGZfaGVhZGVyXyA8PAotICAgICJ9OyIgPDwgZW5kbCA8PAotICAgICJ0eXBlZGVmIHN0cnVjdCBfIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50ICIgPDwKLSAgICAgIHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJDbGllbnQ7IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgY2xhc3MgZGVmaW5pdGlvbiBpbiB0aGUgaGVhZGVyLgotICBmX2hlYWRlcl8gPDwKLSAgICAic3RydWN0IF8iIDw8IHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJDbGllbnRDbGFzcyIgPDwgZW5kbCA8PAotICAgICJ7IiA8PCBlbmRsIDw8Ci0gICAgIiAgIiA8PCBwYXJlbnRfY2xhc3NfbmFtZSA8PCAiQ2xhc3MgcGFyZW50OyIgPDwgZW5kbCA8PAotICAgICJ9OyIgPDwgZW5kbCA8PAotICAgICJ0eXBlZGVmIHN0cnVjdCBfIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50Q2xhc3MgIiA8PAotICAgICAgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudENsYXNzOyIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgLy8gQ3JlYXRlIGFsbCB0aGUgR09iamVjdCBib2lsZXJwbGF0ZQotICBmX2hlYWRlcl8gPDwKLSAgICAiR1R5cGUgIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjIDw8IAotICAgICAgICAiX2NsaWVudF9nZXRfdHlwZSAodm9pZCk7IiA8PCBlbmRsIDw8Ci0gICAgIiNkZWZpbmUgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIiA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9DTElFTlQgIiA8PAotICAgICAgICAiKCIgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IHNlcnZpY2VfbmFtZV9sYyA8PCAiX2NsaWVudF9nZXRfdHlwZSgpKSIgPDwKLSAgICAgICAgZW5kbCA8PAotICAgICIjZGVmaW5lICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0NMSUVOVChvYmopICIgPDwKLSAgICAgICAgIihHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksICIgPDwgCi0gICAgICAgIHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0NMSUVOVCwgIiA8PCAKLSAgICAgICAgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudCkpIiA8PCBlbmRsIDw8Ci0gICAgIiNkZWZpbmUgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfQ0xJRU5UX0NMQVNTKGMpICIgPDwgCi0gICAgICAgICIoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgIiA8PCAKLSAgICAgICAgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfQ0xJRU5ULCAiIDw8IAotICAgICAgICB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50Q2xhc3MpKSIgPDwgZW5kbCA8PAotICAgICIjZGVmaW5lICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0lTX0NMSUVOVChvYmopICIgPDwKLSAgICAgICAgIihHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksICIgPDwgCi0gICAgICAgIHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0NMSUVOVCkpIiA8PCBlbmRsIDw8IAotICAgICIjZGVmaW5lICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHNlcnZpY2VfbmFtZV91YyA8PAotICAgICAgICAiX0lTX0NMSUVOVF9DTEFTUyhjKSAiIDw8ICIoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgIiA8PCAKLSAgICAgICAgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfQ0xJRU5UKSkiIDw8IGVuZGwgPDwKLSAgICAiI2RlZmluZSAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBzZXJ2aWNlX25hbWVfdWMgPDwKLSAgICAgICAgIl9DTElFTlRfR0VUX0NMQVNTKG9iaikgIiA8PCAiKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCAiIDw8IAotICAgICAgICB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIiA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9DTElFTlQsICIgPDwKLSAgICAgICAgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudENsYXNzKSkiIDw8IGVuZGwgPDwgCi0gICAgZW5kbDsKLQotICAvKiB3cml0ZSBvdXQgdGhlIGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAvKiBtYWtlIHRoZSBmdW5jdGlvbiBuYW1lIEMgZnJpZW5kbHkgKi8KLSAgICBzdHJpbmcgZnVubmFtZSA9IHRvX2xvd2VyX2Nhc2UoaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkpOwotCi0gICAgdF9mdW5jdGlvbiBzZXJ2aWNlX2Z1bmN0aW9uICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlX25hbWVfbGMgKyBzdHJpbmcgKCJfY2xpZW50XyIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGZ1bm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF9hcmdsaXN0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKSk7Ci0gICAgaW5kZW50KGZfaGVhZGVyXykgPDwgZnVuY3Rpb25fc2lnbmF0dXJlICgmc2VydmljZV9mdW5jdGlvbikgPDwgIjsiIDw8IGVuZGw7Ci0KLSAgICB0X2Z1bmN0aW9uIHNlbmRfZnVuY3Rpb24gKGdfdHlwZV92b2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZV9uYW1lX2xjICsgc3RyaW5nICgiX2NsaWVudF9zZW5kXyIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGZ1bm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF9hcmdsaXN0KCkpOwotICAgIGluZGVudChmX2hlYWRlcl8pIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSAoJnNlbmRfZnVuY3Rpb24pIDw8ICI7IiA8PCBlbmRsOwotCi0gICAgLy8gaW1wbGVtZW50IHJlY3YgaWYgbm90IGEgb25ld2F5IHNlcnZpY2UKLSAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIHRfc3RydWN0IG5vYXJncyAocHJvZ3JhbV8pOwotICAgICAgdF9mdW5jdGlvbiByZWN2X2Z1bmN0aW9uICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VfbmFtZV9sYyArIHN0cmluZyAoIl9jbGllbnRfcmVjdl8iKSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBmdW5uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbm9hcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKSk7Ci0gICAgICBpbmRlbnQoZl9oZWFkZXJfKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUgKCZyZWN2X2Z1bmN0aW9uKSA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICAvKiB3cml0ZSBvdXQgdGhlIGdldC9zZXQgZnVuY3Rpb24gcHJvdG90eXBlcyAqLwotICBmX2hlYWRlcl8gPDwgInZvaWQgIiArIHNlcnZpY2VfbmFtZV9sYyArICJfY2xpZW50X3NldF9wcm9wZXJ0eSAoR09iamVjdCAqb2JqZWN0LCBndWludCBwcm9wZXJ0eV9pZCwgY29uc3QgR1ZhbHVlICp2YWx1ZSwgR1BhcmFtU3BlYyAqcHNwZWMpOyIgPDwgZW5kbDsKLSAgZl9oZWFkZXJfIDw8ICJ2b2lkICIgKyBzZXJ2aWNlX25hbWVfbGMgKyAiX2NsaWVudF9nZXRfcHJvcGVydHkgKEdPYmplY3QgKm9iamVjdCwgZ3VpbnQgcHJvcGVydHlfaWQsIEdWYWx1ZSAqdmFsdWUsIEdQYXJhbVNwZWMgKnBzcGVjKTsiIDw8IGVuZGw7Ci0KLSAgZl9oZWFkZXJfIDw8IGVuZGw7Ci0gIC8vIGVuZCBvZiBoZWFkZXIgY29kZQotCi0gIC8vIEdlbmVyYXRlIGludGVyZmFjZSBtZXRob2QgaW1wbGVtZW50YXRpb25zCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgLyogbWFrZSB0aGUgZnVuY3Rpb24gbmFtZSBDIGZyaWVuZGx5ICovCi0gICAgc3RyaW5nIGZ1bm5hbWUgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLSAgICB0X3R5cGUgKnR0eXBlID0gKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpOwotICAgIHRfc3RydWN0ICphcmdsaXN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotICAgIHRfc3RydWN0ICp4bGlzdCA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOwotICAgIGJvb2wgaGFzX3JldHVybiA9ICF0dHlwZS0+aXNfdm9pZCgpOwotICAgIGJvb2wgaGFzX2FyZ3MgPSBhcmdsaXN0LT5nZXRfbWVtYmVycygpLnNpemUoKSA9PSAwOwotICAgIGJvb2wgaGFzX3hjZXB0aW9ucyA9IHhsaXN0LT5nZXRfbWVtYmVycygpLnNpemUoKSA9PSAwOwotCi0gICAgc3RyaW5nIHBhcmFtcyA9ICIoIiArIHRoaXMtPm5zcGFjZSArIHNlcnZpY2VfbmFtZV8gKyAiSWYgKmlmYWNlIgotICAgICAgICAgICAgICAgICAgICArIChoYXNfcmV0dXJuID8gIiwgIiArIHR5cGVfbmFtZSAodHR5cGUpICsgIiogX3JldHVybiIgOiAiIikKLSAgICAgICAgICAgICAgICAgICAgKyAoaGFzX2FyZ3MgPyAiIiA6ICgiLCAiICsgYXJndW1lbnRfbGlzdCAoYXJnbGlzdCkpKQotICAgICAgICAgICAgICAgICAgICArIChoYXNfeGNlcHRpb25zID8gIiIgOiAoIiwgIiArIHhjZXB0aW9uX2xpc3QgKHhsaXN0KSkpCi0gICAgICAgICAgICAgICAgICAgICsgIiwgR0Vycm9yICoqZXJyb3IpIjsKLQotICAgIHN0cmluZyBwYXJhbXNfd2l0aG91dF90eXBlID0gc3RyaW5nKCJpZmFjZSwgIikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKGhhc19yZXR1cm4gPyAiX3JldHVybiwgIiA6ICIiKTsKLQotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkICo+JiBmaWVsZHMgPSBhcmdsaXN0LT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkICo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXJfZmllbGQ7Ci0gICAgZm9yIChmX2l0ZXJfZmllbGQgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyX2ZpZWxkICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXJfZmllbGQpIHsKLSAgICAgIHBhcmFtc193aXRob3V0X3R5cGUgKz0gKCpmX2l0ZXJfZmllbGQpLT5nZXRfbmFtZSgpOyAKLSAgICAgIHBhcmFtc193aXRob3V0X3R5cGUgKz0gIiwgIjsKLSAgICB9Ci0KLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCAqPiYgeGNlcHRpb25zID0geGxpc3QtPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQgKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLSAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgcGFyYW1zX3dpdGhvdXRfdHlwZSArPSAoKnhfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgICBwYXJhbXNfd2l0aG91dF90eXBlICs9ICIsICI7Ci0gICAgfQotCi0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgImdib29sZWFuIiA8PCBlbmRsIDw8Ci0gICAgICB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjIDw8ICJfaWZfIiA8PCBmdW5uYW1lIDw8ICIgIiA8PAotICAgICAgICAgIHBhcmFtcyA8PCBlbmRsIDw8Ci0gICAgICAieyIgPDwgZW5kbCA8PCAKLSAgICAgICIgIHJldHVybiAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBzZXJ2aWNlX25hbWVfdWMgPDwKLSAgICAgICAgICAiX0lGX0dFVF9JTlRFUkZBQ0UgKGlmYWNlKS0+IiA8PCBmdW5uYW1lIDw8ICIgKCIgPDwKLSAgICAgICAgICBwYXJhbXNfd2l0aG91dF90eXBlIDw8ICJlcnJvcik7IiA8PCBlbmRsIDw8Ci0gICAgICAifSIgPDwgZW5kbCA8PAotICAgICAgZW5kbDsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIGludGVyZmFjZSBib2lsZXJwbGF0ZQotICBmX3NlcnZpY2VfIDw8Ci0gICAgIkdUeXBlIiA8PCBlbmRsIDw8Ci0gICAgdGhpcy0+bnNwYWNlX2xjIDw8IHNlcnZpY2VfbmFtZV9sYyA8PCAiX2lmX2dldF90eXBlICh2b2lkKSIgPDwgZW5kbCA8PAotICAgICJ7IiA8PCBlbmRsIDw8Ci0gICAgIiAgc3RhdGljIEdUeXBlIHR5cGUgPSAwOyIgPDwgZW5kbCA8PAotICAgICIgIGlmICh0eXBlID09IDApIiA8PCBlbmRsIDw8Ci0gICAgIiAgeyIgPDwgZW5kbCA8PAotICAgICIgICAgc3RhdGljIGNvbnN0IEdUeXBlSW5mbyB0eXBlX2luZm8gPSIgPDwgZW5kbCA8PAotICAgICIgICAgeyIgPDwgZW5kbCA8PAotICAgICIgICAgICBzaXplb2YgKCIgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmSW50ZXJmYWNlKSwiIDw8Ci0gICAgICAgIGVuZGwgPDwKLSAgICAiICAgICAgTlVMTCwgIC8qIGJhc2VfaW5pdCAqLyIgPDwgZW5kbCA8PAotICAgICIgICAgICBOVUxMLCAgLyogYmFzZV9maW5hbGl6ZSAqLyIgPDwgZW5kbCA8PAotICAgICIgICAgICBOVUxMLCAgLyogY2xhc3NfaW5pdCAqLyIgPDwgZW5kbCA8PAotICAgICIgICAgICBOVUxMLCAgLyogY2xhc3NfZmluYWxpemUgKi8iIDw8IGVuZGwgPDwKLSAgICAiICAgICAgTlVMTCwgIC8qIGNsYXNzX2RhdGEgKi8iIDw8IGVuZGwgPDwKLSAgICAiICAgICAgMCwgICAgIC8qIGluc3RhbmNlX3NpemUgKi8iIDw8IGVuZGwgPDwKLSAgICAiICAgICAgMCwgICAgIC8qIG5fcHJlYWxsb2NzICovIiA8PCBlbmRsIDw8Ci0gICAgIiAgICAgIE5VTEwsICAvKiBpbnN0YW5jZV9pbml0ICovIiA8PCBlbmRsIDw8Ci0gICAgIiAgICAgIE5VTEwgICAvKiB2YWx1ZV90YWJsZSAqLyIgPDwgZW5kbCA8PAotICAgICIgICAgfTsiIDw8IGVuZGwgPDwKLSAgICAiICAgIHR5cGUgPSBnX3R5cGVfcmVnaXN0ZXJfc3RhdGljIChHX1RZUEVfSU5URVJGQUNFLCIgPDwgZW5kbCA8PAotICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PAotICAgICAgICAiSWZcIiwiIDw8IGVuZGwgPDwKLSAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHlwZV9pbmZvLCAwKTsiIDw8IGVuZGwgPDwKLSAgICAiICB9IiA8PCBlbmRsIDw8Ci0gICAgIiAgcmV0dXJuIHR5cGU7IiA8PCBlbmRsIDw8Ci0gICAgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIGNsaWVudCBib2lsZXJwbGF0ZQotICBmX3NlcnZpY2VfIDw8Ci0gICAgInN0YXRpYyB2b2lkICIgPDwgZW5kbCA8PAotICAgIHRoaXMtPm5zcGFjZV9sYyA8PCBzZXJ2aWNlX25hbWVfbGMgPDwKLSAgICAgICAgIl9pZl9pbnRlcmZhY2VfaW5pdCAoIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PAotICAgICAgICAiSWZJbnRlcmZhY2UgKmlmYWNlKTsiIDw8IGVuZGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgIkdfREVGSU5FX1RZUEVfV0lUSF9DT0RFICgiIDw8IHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8Ci0gICAgICAiQ2xpZW50LCAiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBzZXJ2aWNlX25hbWVfbGMgPDwgIl9jbGllbnQsIiA8PCBlbmRsIDw8Ci0gICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAiIDw8IHBhcmVudF90eXBlX25hbWUgPDwgIiwgIiA8PCBlbmRsIDw8Ci0gICAgIiAgICAgICAgICAgICAgICAgICAgICAgICBHX0lNUExFTUVOVF9JTlRFUkZBQ0UgKCIgPDwKLSAgICAgICAgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSUYsIiA8PCBlbmRsIDw8Ci0gICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgPDwKLSAgICAgICAgdGhpcy0+bnNwYWNlX2xjIDw8IHNlcnZpY2VfbmFtZV9sYyA8PCAiX2lmX2ludGVyZmFjZV9pbml0KSk7IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSBwcm9wZXJ0eS1yZWxhdGVkIGNvZGUgb25seSBmb3IgYmFzZSBzZXJ2aWNlcy0tLWNoaWxkCi0gIC8vIHNlcnZpY2UtY2xpZW50IGNsYXNzZXMgaGF2ZSBvbmx5IHByb3BlcnRpZXMgaW5oZXJpdGVkIGZyb20gdGhlaXIKLSAgLy8gcGFyZW50IGNsYXNzCi0gIGlmICghZXh0ZW5kc19zZXJ2aWNlKSB7Ci0gICAgLy8gR2VuZXJhdGUgY2xpZW50IHByb3BlcnRpZXMKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAiZW51bSBfIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50UHJvcGVydGllcyIgPDwgZW5kbCA8PAotICAgICAgInsiIDw8IGVuZGwgPDwKLSAgICAgICIgIFBST1BfMCwiIDw8IGVuZGwgPDwKLSAgICAgICIgIFBST1BfIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgc2VydmljZV9uYW1lX3VjIDw8Ci0gICAgICAgICAgIl9DTElFTlRfSU5QVVRfUFJPVE9DT0wsIiA8PAotICAgICAgICAgIGVuZGwgPDwKLSAgICAgICIgIFBST1BfIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgc2VydmljZV9uYW1lX3VjIDw8Ci0gICAgICAgICAgIl9DTElFTlRfT1VUUFVUX1BST1RPQ09MIiA8PAotICAgICAgICAgIGVuZGwgPDwKLSAgICAgICJ9OyIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgICAvLyBnZW5lcmF0ZSBwcm9wZXJ0eSBzZXR0ZXIKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAidm9pZCIgPDwgZW5kbCA8PAotICAgICAgdGhpcy0+bnNwYWNlX2xjIDw8IHNlcnZpY2VfbmFtZV9sYyA8PCAiX2NsaWVudF9zZXRfcHJvcGVydHkgKCIgPDwKLSAgICAgICAgICAiR09iamVjdCAqb2JqZWN0LCBndWludCBwcm9wZXJ0eV9pZCwgY29uc3QgR1ZhbHVlICp2YWx1ZSwgIiA8PAotICAgICAgICAgICJHUGFyYW1TcGVjICpwc3BlYykiIDw8IGVuZGwgPDwKLSAgICAgICJ7IiA8PCBlbmRsIDw8Ci0gICAgICAiICAiIDw8IHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJDbGllbnQgKmNsaWVudCA9ICIgPDwKLSAgICAgICAgICB0aGlzLT5uc3BhY2VfdWMgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfQ0xJRU5UIChvYmplY3QpOyIgPDwgZW5kbCA8PAotICAgICAgZW5kbCA8PAotICAgICAgIiAgVEhSSUZUX1VOVVNFRF9WQVIgKHBzcGVjKTsiIDw8IGVuZGwgPDwKLSAgICAgIGVuZGwgPDwKLSAgICAgICIgIHN3aXRjaCAocHJvcGVydHlfaWQpIiA8PCBlbmRsIDw8Ci0gICAgICAiICB7IiA8PCBlbmRsIDw8Ci0gICAgICAiICAgIGNhc2UgUFJPUF8iIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBzZXJ2aWNlX25hbWVfdWMgPDwKLSAgICAgICAgICAiX0NMSUVOVF9JTlBVVF9QUk9UT0NPTDoiIDw8IGVuZGwgPDwKLSAgICAgICIgICAgICBjbGllbnQtPmlucHV0X3Byb3RvY29sID0gZ192YWx1ZV9nZXRfb2JqZWN0ICh2YWx1ZSk7IiA8PCBlbmRsIDw8Ci0gICAgICAiICAgICAgYnJlYWs7IiA8PCBlbmRsIDw8Ci0gICAgICAiICAgIGNhc2UgUFJPUF8iIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBzZXJ2aWNlX25hbWVfdWMgPDwKLSAgICAgICAgICAiX0NMSUVOVF9PVVRQVVRfUFJPVE9DT0w6IiA8PCBlbmRsIDw8Ci0gICAgICAiICAgICAgY2xpZW50LT5vdXRwdXRfcHJvdG9jb2wgPSBnX3ZhbHVlX2dldF9vYmplY3QgKHZhbHVlKTsiIDw8IGVuZGwgPDwKLSAgICAgICIgICAgICBicmVhazsiIDw8IGVuZGwgPDwKLSAgICAgICIgIH0iIDw8IGVuZGwgPDwKLSAgICAgICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICAgIC8vIGdlbmVyYXRlIHByb3BlcnR5IGdldHRlcgotICAgIGZfc2VydmljZV8gPDwKLSAgICAgICJ2b2lkIiA8PCBlbmRsIDw8Ci0gICAgICB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjIDw8ICJfY2xpZW50X2dldF9wcm9wZXJ0eSAoIiA8PAotICAgICAgICAgICJHT2JqZWN0ICpvYmplY3QsIGd1aW50IHByb3BlcnR5X2lkLCBHVmFsdWUgKnZhbHVlLCAiIDw8Ci0gICAgICAgICAgIkdQYXJhbVNwZWMgKnBzcGVjKSIgPDwgZW5kbCA8PAotICAgICAgInsiIDw8IGVuZGwgPDwKLSAgICAgICIgICIgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudCAqY2xpZW50ID0gIiA8PAotICAgICAgICAgIHRoaXMtPm5zcGFjZV91YyA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9DTElFTlQgKG9iamVjdCk7IiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsIDw8Ci0gICAgICAiICBUSFJJRlRfVU5VU0VEX1ZBUiAocHNwZWMpOyIgPDwgZW5kbCA8PAotICAgICAgZW5kbCA8PAotICAgICAgIiAgc3dpdGNoIChwcm9wZXJ0eV9pZCkiIDw8IGVuZGwgPDwKLSAgICAgICIgIHsiIDw8IGVuZGwgPDwKLSAgICAgICIgICAgY2FzZSBQUk9QXyIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHNlcnZpY2VfbmFtZV91YyA8PAotICAgICAgICAgICJfQ0xJRU5UX0lOUFVUX1BST1RPQ09MOiIgPDwgZW5kbCA8PAotICAgICAgIiAgICAgIGdfdmFsdWVfc2V0X29iamVjdCAodmFsdWUsIGNsaWVudC0+aW5wdXRfcHJvdG9jb2wpOyIgPDwgZW5kbCA8PAotICAgICAgIiAgICAgIGJyZWFrOyIgPDwgZW5kbCA8PAotICAgICAgIiAgICBjYXNlIFBST1BfIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgc2VydmljZV9uYW1lX3VjIDw8Ci0gICAgICAgICAgIl9DTElFTlRfT1VUUFVUX1BST1RPQ09MOiIgPDwgZW5kbCA8PAotICAgICAgIiAgICAgIGdfdmFsdWVfc2V0X29iamVjdCAodmFsdWUsIGNsaWVudC0+b3V0cHV0X3Byb3RvY29sKTsiIDw8IGVuZGwgPDwKLSAgICAgICIgICAgICBicmVhazsiIDw8IGVuZGwgPDwKLSAgICAgICIgIH0iIDw8IGVuZGwgPDwKLSAgICAgICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgc3RyaW5nIG5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgc3RyaW5nIGZ1bm5hbWUgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMobmFtZSk7Ci0KLSAgICAvLyBHZXQgdGhlIHN0cnVjdCBvZiBmdW5jdGlvbiBjYWxsIHBhcmFtcyBhbmQgZXhjZXB0aW9ucwotICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotCi0gICAgLy8gRnVuY3Rpb24gZm9yIHNlbmRpbmcKLSAgICB0X2Z1bmN0aW9uIHNlbmRfZnVuY3Rpb24gKGdfdHlwZV92b2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZV9uYW1lX2xjICsgc3RyaW5nICgiX2NsaWVudF9zZW5kXyIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGZ1bm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF9hcmdsaXN0KCkpOwotCi0gICAgLy8gT3BlbiB0aGUgc2VuZCBmdW5jdGlvbgotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgZnVuY3Rpb25fc2lnbmF0dXJlICgmc2VuZF9mdW5jdGlvbikgPDwgZW5kbDsKLSAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKLQotICAgIHN0cmluZyByZXFUeXBlID0gKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSA/ICJUX09ORVdBWSIgOiAiVF9DQUxMIjsKLQotICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVxdWVzdAotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJnaW50MzIgY3NlcWlkID0gMDsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJUaHJpZnRQcm90b2NvbCAqIHByb3RvY29sID0gIiA8PCAKLSAgICAgICAgdGhpcy0+bnNwYWNlX3VjIDw8IGJhc2Vfc2VydmljZV9uYW1lX3VjIDw8Ci0gICAgICAgICJfQ0xJRU5UIChpZmFjZSktPm91dHB1dF9wcm90b2NvbDsiIDw8IGVuZGwgPDwKLSAgICAgIGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJpZiAodGhyaWZ0X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCBcIiIKLSAgICAgICAgICAgICAgIDw8IG5hbWUgPDwgIlwiLCAiIDw8IHJlcVR5cGUgPDwgIiwgY3NlcWlkLCBlcnJvcikgPCAwKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIEZBTFNFOyIgPDwgZW5kbCA8PAotICAgICAgZW5kbDsKLQotICAgIGdlbmVyYXRlX3N0cnVjdF93cml0ZXIgKGZfc2VydmljZV8sIGFyZ19zdHJ1Y3QsICIiLCAiIiwgZmFsc2UpOwotCi0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwKLSAgICAgICAgImlmICh0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9lbmQgKHByb3RvY29sLCBlcnJvcikgPCAwKSIgPDwKLSAgICAgICAgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwKLSAgICAgICAgIiAgcmV0dXJuIEZBTFNFOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwKLSAgICAgICAgImlmICghdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAocHJvdG9jb2wtPnRyYW5zcG9ydCwgZXJyb3IpKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwKLSAgICAgICAgIiAgcmV0dXJuIEZBTFNFOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwKLSAgICAgICAgImlmICghdGhyaWZ0X3RyYW5zcG9ydF93cml0ZV9lbmQgKHByb3RvY29sLT50cmFuc3BvcnQsIGVycm9yKSkiIDw8Ci0gICAgICAgIGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8Ci0gICAgICAgICIgIHJldHVybiBGQUxTRTsiIDw8IGVuZGwgPDwKLSAgICAgIGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8IAotICAgICAgICAicmV0dXJuIFRSVUU7IiA8PCBlbmRsOwotCi0gICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgICAvLyBHZW5lcmF0ZSByZWN2IGZ1bmN0aW9uIG9ubHkgaWYgbm90IGFuIGFzeW5jIGZ1bmN0aW9uCi0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICB0X3N0cnVjdCBub2FyZ3MgKHByb2dyYW1fKTsKLSAgICAgIHRfZnVuY3Rpb24gcmVjdl9mdW5jdGlvbiAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlX25hbWVfbGMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzdHJpbmcgKCJfY2xpZW50X3JlY3ZfIikgKyBmdW5uYW1lLCAmbm9hcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKSk7Ci0gICAgICAvLyBPcGVuIGZ1bmN0aW9uCi0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICAgZnVuY3Rpb25fc2lnbmF0dXJlICgmcmVjdl9mdW5jdGlvbikgPDwgZW5kbDsKLSAgICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOwotCi0gICAgICBmX3NlcnZpY2VfIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImdpbnQzMiByc2VxaWQ7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJnY2hhciAqIGZuYW1lID0gTlVMTDsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIlRocmlmdE1lc3NhZ2VUeXBlIG10eXBlOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiVGhyaWZ0UHJvdG9jb2wgKiBwcm90b2NvbCA9ICIgPDwgCi0gICAgICAgICAgICAgICAgICAgICAgdGhpcy0+bnNwYWNlX3VjIDw8IGJhc2Vfc2VydmljZV9uYW1lX3VjIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgIl9DTElFTlQgKGlmYWNlKS0+aW5wdXRfcHJvdG9jb2w7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlmICh0aHJpZnRfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luICIgPDwgCi0gICAgICAgICAgICAgICAgICAgICAgIihwcm90b2NvbCwgJmZuYW1lLCAmbXR5cGUsICZyc2VxaWQsIGVycm9yKSA8IDApIiA8PAotICAgICAgICAgICAgICAgICAgICAgIGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgaWYgKGZuYW1lKSBnX2ZyZWUgKGZuYW1lKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIEZBTFNFOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgICBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiAobXR5cGUgPT0gVF9FWENFUFRJT04pIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgaWYgKGZuYW1lKSBnX2ZyZWUgKGZuYW1lKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgVGhyaWZ0QXBwbGljYXRpb25FeGNlcHRpb24gKnhjZXB0aW9uID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9BUFBMSUNBVElPTl9FWENFUFRJT04sIE5VTEwpOyIgPDwgZW5kbCA8PAotCi0gICAgICAgIGluZGVudCgpIDw8ICIgIHRocmlmdF9zdHJ1Y3RfcmVhZCAoVEhSSUZUX1NUUlVDVCAoeGNlcHRpb24pLCBwcm90b2NvbCwgTlVMTCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIHRocmlmdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfZW5kIChwcm90b2NvbCwgTlVMTCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIHRocmlmdF90cmFuc3BvcnRfcmVhZF9lbmQgKHByb3RvY29sLT50cmFuc3BvcnQsIE5VTEwpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1IsIHhjZXB0aW9uLT50eXBlLCBcImFwcGxpY2F0aW9uIGVycm9yOiAlc1wiLCB4Y2VwdGlvbi0+bWVzc2FnZSk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIGdfb2JqZWN0X3VucmVmICh4Y2VwdGlvbik7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiBGQUxTRTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIn0gZWxzZSBpZiAobXR5cGUgIT0gVF9SRVBMWSkgeyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBpZiAoZm5hbWUpIGdfZnJlZSAoZm5hbWUpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICB0aHJpZnRfcHJvdG9jb2xfc2tpcCAocHJvdG9jb2wsIFRfU1RSVUNULCBOVUxMKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgdGhyaWZ0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9lbmQgKHByb3RvY29sLCBOVUxMKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2VuZCAocHJvdG9jb2wtPnRyYW5zcG9ydCwgTlVMTCk7IiA8PCBlbmRsIDw8IAotICAgICAgICBpbmRlbnQoKSA8PCAiICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1IsIFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1JfSU5WQUxJRF9NRVNTQUdFX1RZUEUsIFwiaW52YWxpZCBtZXNzYWdlIHR5cGUgJWQsIGV4cGVjdGVkIFRfUkVQTFlcIiwgbXR5cGUpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gRkFMU0U7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ9IGVsc2UgaWYgKHN0cm5jbXAgKGZuYW1lLCBcIiIgPDwgbmFtZSA8PCAiXCIsICIgPDwgbmFtZS5sZW5ndGgoKSA8PCAiKSAhPSAwKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIHRocmlmdF9wcm90b2NvbF9za2lwIChwcm90b2NvbCwgVF9TVFJVQ1QsIE5VTEwpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICB0aHJpZnRfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2VuZCAocHJvdG9jb2wsIGVycm9yKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2VuZCAocHJvdG9jb2wtPnRyYW5zcG9ydCwgZXJyb3IpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1IsIFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1JfV1JPTkdfTUVUSE9EX05BTUUsIFwid3JvbmcgbWV0aG9kIG5hbWUgJXMsIGV4cGVjdGVkICIgPDwgbmFtZSA8PCAiXCIsIGZuYW1lKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgaWYgKGZuYW1lKSBnX2ZyZWUgKGZuYW1lKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIEZBTFNFOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKGZuYW1lKSBnX2ZyZWUgKGZuYW1lKTsiIDw8IGVuZGwgPDwgCi0gICAgICAgIGVuZGw7Ci0KLSAgICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOwotICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLQotICAgICAgewotICAgICAgICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sIHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIl8iICsgCi0gICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOwotICAgICAgICB0X2ZpZWxkIHN1Y2Nlc3MoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLCAiKl9yZXR1cm4iLCAwKTsKLSAgICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gYWRkIHJlYWRlcnMgZm9yIGV4Y2VwdGlvbnMsIGRlcmVmZXJlbmNpbmcgdGhlIHBvaW50ZXIuCi0gICAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7IHhfaXRlcisrKSB7Ci0gICAgICAgICAgdF9maWVsZCAqeGNlcHRpb24gPSBuZXcgdF9maWVsZCgoKnhfaXRlciktPmdldF90eXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKiIgKyAoKnhfaXRlciktPmdldF9uYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKnhfaXRlciktPmdldF9rZXkoKSk7Ci0gICAgICAgICAgcmVzdWx0LmFwcGVuZCAoeGNlcHRpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgZ2VuZXJhdGVfc3RydWN0X3JlYWRlciAoZl9zZXJ2aWNlXywgJnJlc3VsdCwgIiIsICIiLCBmYWxzZSk7Ci0gICAgICB9Ci0KLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlmICh0aHJpZnRfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2VuZCAocHJvdG9jb2wsIGVycm9yKSA8IDApIiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiBGQUxTRTsiIDw8IGVuZGwgPDwKLSAgICAgICAgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKCF0aHJpZnRfdHJhbnNwb3J0X3JlYWRfZW5kIChwcm90b2NvbC0+dHJhbnNwb3J0LCBlcnJvcikpIiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiBGQUxTRTsiIDw8IGVuZGwgPDwKLSAgICAgICAgZW5kbDsKLQotICAgICAgLy8gY29weSBvdmVyIGFueSB0aHJvdyBleGNlcHRpb25zIGFuZCByZXR1cm4gZmFpbHVyZQotICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgeF9pdGVyKyspIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCAKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKCoiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9IE5VTEwpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgInsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICAgIGdfc2V0X2Vycm9yIChlcnJvciwgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwKLSAgICAgICAgICAgICAgdG9fdXBwZXJfY2FzZShpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKnhfaXRlciktPmdldF90eXBlKCktPmdldF9uYW1lKCkpKSA8PAotICAgICAgICAgICAgICAiX0VSUk9SLCAiIDw8Ci0gICAgICAgICAgICAgIHRoaXMtPm5zcGFjZV91YyA8PAotICAgICAgICAgICAgICB0b191cHBlcl9jYXNlKGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqeF9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X25hbWUoKSkpIDw8Ci0gICAgICAgICAgICAgICJfRVJST1JfQ09ERSwgXCIiIDw8ICgqeF9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X25hbWUoKSA8PCAKLSAgICAgICAgICAgICAgIlwiKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICAgIHJldHVybiBGQUxTRTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIC8vIENsb3NlIGZ1bmN0aW9uCi0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybiBUUlVFOyIgPDwgZW5kbDsKLSAgICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgLy8gT3BlbiBmdW5jdGlvbgotICAgIHRfZnVuY3Rpb24gc2VydmljZV9mdW5jdGlvbigoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlX25hbWVfbGMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc3RyaW5nICgiX2NsaWVudF8iKSArIGZ1bm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF9hcmdsaXN0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKSk7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICBmdW5jdGlvbl9zaWduYXR1cmUgKCZzZXJ2aWNlX2Z1bmN0aW9uKSA8PCBlbmRsOwotICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOwotCi0gICAgLy8gd3JhcCBlYWNoIGZ1bmN0aW9uCi0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgImlmICghIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjIDw8Ci0gICAgICAgICAgICAgICAgICAgIl9jbGllbnRfc2VuZF8iIDw8IGZ1bm5hbWUgPDwKLSAgICAgICIgKGlmYWNlIjsKLQotICAgIC8vIERlY2xhcmUgdGhlIGZ1bmN0aW9uIGFyZ3VtZW50cwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkICo+ICZmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkICo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8ICIsIGVycm9yKSkiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiBGQUxTRTsiIDw8IGVuZGw7Ci0KLSAgICAvLyBpZiBub3Qgb25ld2F5LCBpbXBsZW1lbnQgcmVjdgotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgc3RyaW5nIHJldCA9ICgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpID8gIiIgOiAiX3JldHVybiwgIjsKLQotICAgICAgY29uc3QgdmVjdG9yPHRfZmllbGQgKj4mIHhjZXB0aW9ucyA9Ci0gICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCktPmdldF9tZW1iZXJzKCk7Ci0gICAgICB2ZWN0b3I8dF9maWVsZCAqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgICAgcmV0ICs9ICgqeF9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICAgICAgcmV0ICs9ICIsICI7Ci0gICAgICB9Ci0KLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlmICghIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjIDw8Ci0gICAgICAgICAgIl9jbGllbnRfcmVjdl8iIDw8IGZ1bm5hbWUgPDwKLSAgICAgICAgICAiIChpZmFjZSwgIiA8PCByZXQgPDwgImVycm9yKSkiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIEZBTFNFOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICAvLyByZXR1cm4gVFJVRSB3aGljaCBtZWFucyBhbGwgZnVuY3Rpb25zIHdlcmUgY2FsbGVkIE9LCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gVFJVRTsiIDw8IGVuZGw7Ci0gICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBjcmVhdGUgdGhlIGludGVyZmFjZSBpbml0aWFsaXplcgotICBmX3NlcnZpY2VfIDw8Ci0gICAgInN0YXRpYyB2b2lkIiA8PCBlbmRsIDw8Ci0gICAgdGhpcy0+bnNwYWNlX2xjIDw8IHNlcnZpY2VfbmFtZV9sYyA8PCAiX2lmX2ludGVyZmFjZV9pbml0ICgiIDw8Ci0gICAgICAgIHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZkludGVyZmFjZSAqaWZhY2UpIiA8PCBlbmRsIDw8Ci0gICAgInsiIDw8IGVuZGw7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgLyogbWFrZSB0aGUgZnVuY3Rpb24gbmFtZSBDIGZyaWVuZGx5ICovCi0gICAgc3RyaW5nIGZ1bm5hbWUgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLQotICAgIGZfc2VydmljZV8gPDwKLSAgICAgICIgIGlmYWNlLT4iIDw8IGZ1bm5hbWUgPDwgIiA9ICIgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IHNlcnZpY2VfbmFtZV9sYyA8PAotICAgICAgICAiX2NsaWVudF8iIDw8IGZ1bm5hbWUgPDwgIjsiIDw8IGVuZGw7Ci0gIH0KLSAgZl9zZXJ2aWNlXyA8PAotICAgICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICAvLyBjcmVhdGUgdGhlIGNsaWVudCBpbnN0YW5jZSBpbml0aWFsaXplcgotICBmX3NlcnZpY2VfIDw8Ci0gICAgInN0YXRpYyB2b2lkIiA8PCBlbmRsIDw8Ci0gICAgdGhpcy0+bnNwYWNlX2xjIDw8IHNlcnZpY2VfbmFtZV9sYyA8PCAiX2NsaWVudF9pbml0ICgiIDw8Ci0gICAgICAgIHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJDbGllbnQgKmNsaWVudCkiIDw8IGVuZGwgPDwKLSAgICAieyIgPDwgZW5kbDsKLSAgaWYoIWV4dGVuZHNfc2VydmljZSkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgICIgIGNsaWVudC0+aW5wdXRfcHJvdG9jb2wgPSBOVUxMOyIgPDwgZW5kbCA8PAotICAgICAgIiAgY2xpZW50LT5vdXRwdXRfcHJvdG9jb2wgPSBOVUxMOyIgPDwgZW5kbDsKLSAgfQotICBmX3NlcnZpY2VfIDw8Ci0gICAgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIC8vIGNyZWF0ZSB0aGUgY2xpZW50IGNsYXNzIGluaXRpYWxpemVyCi0gIGZfc2VydmljZV8gPDwKLSAgICAic3RhdGljIHZvaWQiIDw8IGVuZGwgPDwKLSAgICB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjIDw8ICJfY2xpZW50X2NsYXNzX2luaXQgKCIgPDwKLSAgICAgICAgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudENsYXNzICpjbHMpIiA8PCBlbmRsIDw8Ci0gICAgInsiIDw8IGVuZGw7Ci0gIGlmICghZXh0ZW5kc19zZXJ2aWNlKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgIiAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGNscyk7IiA8PCBlbmRsIDw8Ci0gICAgICAiICBHUGFyYW1TcGVjICpwYXJhbV9zcGVjOyIgPDwgZW5kbCA8PAotICAgICAgZW5kbCA8PAotICAgICAgIiAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwKLSAgICAgICAgICBzZXJ2aWNlX25hbWVfbGMgPDwgIl9jbGllbnRfc2V0X3Byb3BlcnR5OyIgPDwgZW5kbCA8PAotICAgICAgIiAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwKLSAgICAgICAgICBzZXJ2aWNlX25hbWVfbGMgPDwgIl9jbGllbnRfZ2V0X3Byb3BlcnR5OyIgPDwgZW5kbCA8PAotICAgICAgZW5kbCA8PAotICAgICAgIiAgcGFyYW1fc3BlYyA9IGdfcGFyYW1fc3BlY19vYmplY3QgKFwiaW5wdXRfcHJvdG9jb2xcIiwiIDw8IGVuZGwgPDwKLSAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImlucHV0IHByb3RvY29sIChjb25zdHJ1Y3QpXCIsIiA8PAotICAgICAgICAgIGVuZGwgPDwKLSAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlNldCB0aGUgY2xpZW50IGlucHV0IHByb3RvY29sXCIsIiA8PAotICAgICAgICAgIGVuZGwgPDwKLSAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSFJJRlRfVFlQRV9QUk9UT0NPTCwiIDw8IGVuZGwgPDwKLSAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSk7IiA8PCBlbmRsIDw8Ci0gICAgICAiICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCIgPDwgZW5kbCA8PAotICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPUF8iIDw8IHRoaXMtPm5zcGFjZV91YyA8PAotICAgICAgICAgIHNlcnZpY2VfbmFtZV91YyA8PCAiX0NMSUVOVF9JTlBVVF9QUk9UT0NPTCwgcGFyYW1fc3BlYyk7IiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsIDw8Ci0gICAgICAiICBwYXJhbV9zcGVjID0gZ19wYXJhbV9zcGVjX29iamVjdCAoXCJvdXRwdXRfcHJvdG9jb2xcIiwiIDw8IGVuZGwgPDwKLSAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm91dHB1dCBwcm90b2NvbCAoY29uc3RydWN0KVwiLCIgPDwKLSAgICAgICAgICBlbmRsIDw8Ci0gICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJTZXQgdGhlIGNsaWVudCBvdXRwdXQgcHJvdG9jb2xcIiwiIDw8Ci0gICAgICAgICAgZW5kbCA8PAotICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIUklGVF9UWVBFX1BST1RPQ09MLCIgPDwgZW5kbCA8PAotICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFKTsiIDw8IGVuZGwgPDwKLSAgICAgICIgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIiA8PCBlbmRsIDw8Ci0gICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9QXyIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8Ci0gICAgICAgIHNlcnZpY2VfbmFtZV91YyA8PCAiX0NMSUVOVF9PVVRQVVRfUFJPVE9DT0wsIHBhcmFtX3NwZWMpOyIgPDwgZW5kbDsKLSAgfQotICBmX3NlcnZpY2VfIDw8Ci0gICAgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBDIGNvZGUgdGhhdCByZXByZXNlbnRzIGEgVGhyaWZ0IHNlcnZpY2UgaGFuZGxlci4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZm9yIHdoaWNoIHRvIGdlbmVyYXRlIGEgaGFuZGxlci4KLSAqLwotdm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGFuZGxlcih0X3NlcnZpY2UgKnRzZXJ2aWNlKSB7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZnVuY3Rpb25faXRlcjsKLQotICBzdHJpbmcgc2VydmljZV9uYW1lX2xjID0KLSAgICB0b19sb3dlcl9jYXNlKGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhzZXJ2aWNlX25hbWVfKSk7Ci0gIHN0cmluZyBzZXJ2aWNlX25hbWVfdWMgPSB0b191cHBlcl9jYXNlKHNlcnZpY2VfbmFtZV9sYyk7Ci0KLSAgc3RyaW5nIGNsYXNzX25hbWUgPSB0aGlzLT5uc3BhY2UgKyBzZXJ2aWNlX25hbWVfICsgIkhhbmRsZXIiOwotICBzdHJpbmcgY2xhc3NfbmFtZV9sYyA9Ci0gICAgdG9fbG93ZXJfY2FzZShpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoY2xhc3NfbmFtZSkpOwotICBzdHJpbmcgY2xhc3NfbmFtZV91YyA9IHRvX3VwcGVyX2Nhc2UoY2xhc3NfbmFtZV9sYyk7Ci0KLSAgc3RyaW5nIHBhcmVudF9jbGFzc19uYW1lOwotICBzdHJpbmcgcGFyZW50X3R5cGVfbmFtZTsKLQotICBzdHJpbmcgYXJnc19pbmRlbnQ7Ci0KLSAgLy8gVGhlIHNlcnZpY2UgdGhpcyBzZXJ2aWNlIGV4dGVuZHMsIG9yIE5VTEwgaWYgaXQgZXh0ZW5kcyBubyBzZXJ2aWNlCi0gIHRfc2VydmljZSAqZXh0ZW5kc19zZXJ2aWNlID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7Ci0KLSAgLy8gRGV0ZXJtaW5lIHRoZSBuYW1lIG9mIG91ciBwYXJlbnQgc2VydmljZSAoaWYgYW55KSBhbmQgdGhlIGhhbmRsZXIgY2xhc3MnCi0gIC8vIHBhcmVudCBjbGFzcyBuYW1lIGFuZCB0eXBlCi0gIGlmIChleHRlbmRzX3NlcnZpY2UpIHsKLSAgICBzdHJpbmcgcGFyZW50X3NlcnZpY2VfbmFtZSA9IGV4dGVuZHNfc2VydmljZS0+Z2V0X25hbWUoKTsKLSAgICBzdHJpbmcgcGFyZW50X3NlcnZpY2VfbmFtZV9sYyA9Ci0gICAgICB0b19sb3dlcl9jYXNlKGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhwYXJlbnRfc2VydmljZV9uYW1lKSk7Ci0gICAgc3RyaW5nIHBhcmVudF9zZXJ2aWNlX25hbWVfdWMgPSB0b191cHBlcl9jYXNlKHBhcmVudF9zZXJ2aWNlX25hbWVfbGMpOwotCi0gICAgcGFyZW50X2NsYXNzX25hbWUgPQotICAgICAgdGhpcy0+bnNwYWNlICsgcGFyZW50X3NlcnZpY2VfbmFtZSArICJIYW5kbGVyIjsKLSAgICBwYXJlbnRfdHlwZV9uYW1lID0KLSAgICAgIHRoaXMtPm5zcGFjZV91YyArICJUWVBFXyIgKyBwYXJlbnRfc2VydmljZV9uYW1lX3VjICsgIl9IQU5ETEVSIjsKLSAgfQotICBlbHNlIHsKLSAgICBwYXJlbnRfY2xhc3NfbmFtZSA9ICJHT2JqZWN0IjsKLSAgICBwYXJlbnRfdHlwZV9uYW1lID0gIkdfVFlQRV9PQkpFQ1QiOwotICB9Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGhhbmRsZXIgY2xhc3MnIGRlZmluaXRpb24gaW4gdGhlIGhlYWRlciBmaWxlCi0KLSAgLy8gR2VuZXJhdGUgdGhlIGhhbmRsZXIgaW5zdGFuY2UgZGVmaW5pdGlvbgotICBmX2hlYWRlcl8gPDwKLSAgICAiLyogIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICIgaGFuZGxlciAoYWJzdHJhY3QgYmFzZSBjbGFzcykgKi8iIDw8IGVuZGwgPDwKLSAgICAic3RydWN0IF8iIDw8IGNsYXNzX25hbWUgPDwgZW5kbCA8PAotICAgICJ7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZl9oZWFkZXJfIDw8Ci0gICAgaW5kZW50KCkgPDwgcGFyZW50X2NsYXNzX25hbWUgPDwgIiBwYXJlbnQ7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBmX2hlYWRlcl8gPDwKLSAgICAifTsiIDw8IGVuZGwgPDwKLSAgICAidHlwZWRlZiBzdHJ1Y3QgXyIgPDwgY2xhc3NfbmFtZSA8PCAiICIgPDwgY2xhc3NfbmFtZSA8PCAiOyIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGhhbmRsZXIgY2xhc3MgZGVmaW5pdGlvbiwgaW5jbHVkaW5nIGl0cyBjbGFzcyBtZW1iZXJzCi0gIC8vIChtZXRob2RzKQotICBmX2hlYWRlcl8gPDwKLSAgICAic3RydWN0IF8iIDw8IGNsYXNzX25hbWUgPDwgIkNsYXNzIiA8PCBlbmRsIDw8Ci0gICAgInsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBmX2hlYWRlcl8gPDwKLSAgICBpbmRlbnQoKSA8PCBwYXJlbnRfY2xhc3NfbmFtZSA8PCAiQ2xhc3MgcGFyZW50OyIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgZm9yIChmdW5jdGlvbl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7Ci0gICAgICAgZnVuY3Rpb25faXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7Ci0gICAgICAgKytmdW5jdGlvbl9pdGVyKSB7Ci0gICAgc3RyaW5nIG1ldGhvZF9uYW1lID0KLSAgICAgIGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcygoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLSAgICB0X3R5cGUgKnJldHVybl90eXBlID0gKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKTsKLSAgICB0X3N0cnVjdCAqYXJnX2xpc3QgPSAoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotICAgIHRfc3RydWN0ICp4X2xpc3QgPSAoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7Ci0gICAgYm9vbCBoYXNfcmV0dXJuID0gIXJldHVybl90eXBlLT5pc192b2lkKCk7Ci0gICAgYm9vbCBoYXNfYXJncyA9IGFyZ19saXN0LT5nZXRfbWVtYmVycygpLnNpemUoKSA9PSAwOwotICAgIGJvb2wgaGFzX3hjZXB0aW9ucyA9IHhfbGlzdC0+Z2V0X21lbWJlcnMoKS5zaXplKCkgPT0gMDsKLQotICAgIHN0cmluZyBwYXJhbXMgPSAiKCIgKyB0aGlzLT5uc3BhY2UgKyBzZXJ2aWNlX25hbWVfICsgIklmICppZmFjZSIKLSAgICAgICsgKGhhc19yZXR1cm4gPyAiLCAiICsgdHlwZV9uYW1lIChyZXR1cm5fdHlwZSkgKyAiKiBfcmV0dXJuIiA6ICIiKQotICAgICAgKyAoaGFzX2FyZ3MgPyAiIiA6ICgiLCAiICsgYXJndW1lbnRfbGlzdCAoYXJnX2xpc3QpKSkKLSAgICAgICsgKGhhc194Y2VwdGlvbnMgPyAiIiA6ICgiLCAiICsgeGNlcHRpb25fbGlzdCAoeF9saXN0KSkpCi0gICAgICArICIsIEdFcnJvciAqKmVycm9yKSI7Ci0KLSAgICBpbmRlbnQoZl9oZWFkZXJfKSA8PCAiZ2Jvb2xlYW4gKCoiIDw8IG1ldGhvZF9uYW1lIDw8ICIpICIgPDwgcGFyYW1zIDw8ICI7IiA8PAotICAgICAgZW5kbDsKLSAgfQotICBpbmRlbnRfZG93bigpOwotCi0gIGZfaGVhZGVyXyA8PAotICAgICJ9OyIgPDwgZW5kbCA8PAotICAgICJ0eXBlZGVmIHN0cnVjdCBfIiA8PCBjbGFzc19uYW1lIDw8ICJDbGFzcyAiIDw8IGNsYXNzX25hbWUgPDwgIkNsYXNzOyIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIHJlbWFpbmluZyBoZWFkZXIgYm9pbGVycGxhdGUKLSAgZl9oZWFkZXJfIDw8Ci0gICAgIkdUeXBlICIgPDwgY2xhc3NfbmFtZV9sYyA8PCAiX2dldF90eXBlICh2b2lkKTsiIDw8IGVuZGwgPDwKLSAgICAiI2RlZmluZSAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0hBTkRMRVIgIiA8PAotICAgICAgICAiKCIgPDwgY2xhc3NfbmFtZV9sYyA8PCAiX2dldF90eXBlKCkpIiA8PCBlbmRsIDw8Ci0gICAgIiNkZWZpbmUgIiA8PCBjbGFzc19uYW1lX3VjIDw8ICIob2JqKSAiIDw8Ci0gICAgICAgICIoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCAiIDw8Ci0gICAgICAgIHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0hBTkRMRVIsICIgPDwKLSAgICAgICAgY2xhc3NfbmFtZSA8PCAiKSkiIDw8IGVuZGwgPDwKLSAgICAiI2RlZmluZSAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiSVNfIiA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9IQU5ETEVSKG9iaikgIiA8PAotICAgICAgICAiKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgIiA8PAotICAgICAgICB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIiA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9IQU5ETEVSKSkiIDw8IGVuZGwgPDwKLSAgICAiI2RlZmluZSAiIDw8IGNsYXNzX25hbWVfdWMgPDwgIl9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgIiA8PAotICAgICAgICB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIiA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9IQU5ETEVSLCAiIDw8Ci0gICAgICAgIGNsYXNzX25hbWUgPDwgIkNsYXNzKSkiIDw8IGVuZGwgPDwKLSAgICAiI2RlZmluZSAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiSVNfIiA8PCBzZXJ2aWNlX25hbWVfdWMgPDwKLSAgICAgICAgIl9IQU5ETEVSX0NMQVNTKGMpICIgPDwgIihHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCAiIDw8Ci0gICAgICAgIHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0hBTkRMRVIpKSIgPDwgZW5kbCA8PAotICAgICIjZGVmaW5lICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHNlcnZpY2VfbmFtZV91YyA8PAotICAgICAgICAiX0hBTkRMRVJfR0VUX0NMQVNTKG9iaikgIiA8PCAiKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCAiIDw8Ci0gICAgICAgIHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0hBTkRMRVIsICIgPDwKLSAgICAgICAgY2xhc3NfbmFtZSA8PCAiQ2xhc3MpKSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGhhbmRsZXIgY2xhc3MnIG1ldGhvZCBkZWZpbml0aW9ucwotICBmb3IgKGZ1bmN0aW9uX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsKLSAgICAgICBmdW5jdGlvbl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsKLSAgICAgICArK2Z1bmN0aW9uX2l0ZXIpIHsKLSAgICBzdHJpbmcgbWV0aG9kX25hbWUgPQotICAgICAgaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKCgqZnVuY3Rpb25faXRlciktPmdldF9uYW1lKCkpOwotICAgIHRfdHlwZSAqcmV0dXJuX3R5cGUgPSAoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpOwotICAgIHRfc3RydWN0ICphcmdfbGlzdCA9ICgqZnVuY3Rpb25faXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgdF9zdHJ1Y3QgKnhfbGlzdCA9ICgqZnVuY3Rpb25faXRlciktPmdldF94Y2VwdGlvbnMoKTsKLSAgICBib29sIGhhc19yZXR1cm4gPSAhcmV0dXJuX3R5cGUtPmlzX3ZvaWQoKTsKLSAgICBib29sIGhhc19hcmdzID0gYXJnX2xpc3QtPmdldF9tZW1iZXJzKCkuc2l6ZSgpID09IDA7Ci0gICAgYm9vbCBoYXNfeGNlcHRpb25zID0geF9saXN0LT5nZXRfbWVtYmVycygpLnNpemUoKSA9PSAwOwotCi0gICAgc3RyaW5nIHBhcmFtcyA9ICIoIiArIHRoaXMtPm5zcGFjZSArIHNlcnZpY2VfbmFtZV8gKyAiSWYgKmlmYWNlIgotICAgICAgKyAoaGFzX3JldHVybiA/ICIsICIgKyB0eXBlX25hbWUgKHJldHVybl90eXBlKSArICIqIF9yZXR1cm4iIDogIiIpCi0gICAgICArIChoYXNfYXJncyA/ICIiIDogKCIsICIgKyBhcmd1bWVudF9saXN0IChhcmdfbGlzdCkpKQotICAgICAgKyAoaGFzX3hjZXB0aW9ucyA/ICIiIDogKCIsICIgKyB4Y2VwdGlvbl9saXN0ICh4X2xpc3QpKSkKLSAgICAgICsgIiwgR0Vycm9yICoqZXJyb3IpIjsKLQotICAgIGZfaGVhZGVyXyA8PCAiZ2Jvb2xlYW4gIiA8PCBjbGFzc19uYW1lX2xjIDw8ICJfIiA8PCBtZXRob2RfbmFtZSA8PCAiICIgPDwKLSAgICAgIHBhcmFtcyA8PCAiOyIgPDwgZW5kbDsKLSAgfQotICBmX2hlYWRlcl8gPDwgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgaGFuZGxlcidzIGltcGxlbWVudGF0aW9uIGluIHRoZSBpbXBsZW1lbnRhdGlvbiBmaWxlCi0KLSAgLy8gR2VuZXJhdGUgdGhlIGltcGxlbWVudGF0aW9uIGJvaWxlcnBsYXRlCi0gIGZfc2VydmljZV8gPDwKLSAgICAic3RhdGljIHZvaWQiIDw8IGVuZGwgPDwKLSAgICBjbGFzc19uYW1lX2xjIDw8ICJfIiA8PCBzZXJ2aWNlX25hbWVfbGMgPDwgIl9pZl9pbnRlcmZhY2VfaW5pdCAoIiA8PAotICAgIHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZkludGVyZmFjZSAqaWZhY2UpOyIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgYXJnc19pbmRlbnQgPSBzdHJpbmcgKDI1LCAnICcpOwotICBmX3NlcnZpY2VfIDw8Ci0gICAgIkdfREVGSU5FX1RZUEVfV0lUSF9DT0RFICgiIDw8IGNsYXNzX25hbWUgPDwgIiwgIiA8PCBlbmRsIDw8Ci0gICAgYXJnc19pbmRlbnQgPDwgY2xhc3NfbmFtZV9sYyA8PCAiLCIgPDwgZW5kbCA8PAotICAgIGFyZ3NfaW5kZW50IDw8IHBhcmVudF90eXBlX25hbWUgPDwgIiwiIDw8IGVuZGwgPDwKLSAgICBhcmdzX2luZGVudCA8PCAiR19JTVBMRU1FTlRfSU5URVJGQUNFICgiIDw8Ci0gICAgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSUYsIiA8PCBlbmRsOwotICBhcmdzX2luZGVudCArPSBzdHJpbmcgKDIzLCAnICcpOwotICBmX3NlcnZpY2VfIDw8Ci0gICAgYXJnc19pbmRlbnQgPDwgY2xhc3NfbmFtZV9sYyA8PCAiXyIgPDwgc2VydmljZV9uYW1lX2xjIDw8Ci0gICAgIl9pZl9pbnRlcmZhY2VfaW5pdCkpOyIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGhhbmRsZXIgbWV0aG9kIGltcGxlbWVudGF0aW9ucwotICBmb3IgKGZ1bmN0aW9uX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsKLSAgICAgICBmdW5jdGlvbl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsKLSAgICAgICArK2Z1bmN0aW9uX2l0ZXIpIHsKLSAgICBzdHJpbmcgZnVuY3Rpb25fbmFtZSA9ICgqZnVuY3Rpb25faXRlciktPmdldF9uYW1lKCk7Ci0gICAgc3RyaW5nIG1ldGhvZF9uYW1lID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKGZ1bmN0aW9uX25hbWUpOwotICAgIHRfdHlwZSAqcmV0dXJuX3R5cGUgPSAoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpOwotICAgIHRfc3RydWN0ICphcmdfbGlzdCA9ICgqZnVuY3Rpb25faXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgdF9zdHJ1Y3QgKnhfbGlzdCA9ICgqZnVuY3Rpb25faXRlciktPmdldF94Y2VwdGlvbnMoKTsKLQotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGFyZ3MgPSBhcmdfbGlzdC0+Z2V0X21lbWJlcnMoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4X2xpc3QtPmdldF9tZW1iZXJzKCk7Ci0KLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmaWVsZF9pdGVyOwotCi0gICAgdF9mdW5jdGlvbgotICAgICAgaW1wbGVtZW50aW5nX2Z1bmN0aW9uIChyZXR1cm5fdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZV9uYW1lX2xjICsgIl9oYW5kbGVyXyIgKyBtZXRob2RfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnX2xpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhfbGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpmdW5jdGlvbl9pdGVyKS0+aXNfb25ld2F5KCkpOwotCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICBmdW5jdGlvbl9zaWduYXR1cmUgKCZpbXBsZW1lbnRpbmdfZnVuY3Rpb24pIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgImdfcmV0dXJuX2lmX2ZhaWwgKCIgPDwKLSAgICAgIHRoaXMtPm5zcGFjZV91YyA8PCAiSVNfIiA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9IQU5ETEVSIChpZmFjZSkpOyIgPDwgZW5kbCA8PAotICAgICAgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgY2xhc3NfbmFtZV91YyA8PCAiX0dFVF9DTEFTUyAoaWZhY2UpIiA8PCAiLT4iIDw8IG1ldGhvZF9uYW1lIDw8Ci0gICAgICAiIChpZmFjZSwgIjsKLQotICAgIGlmKCFyZXR1cm5fdHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8ICJfcmV0dXJuLCAiOwotICAgIH0KLSAgICBmb3IgKGZpZWxkX2l0ZXIgPSBhcmdzLmJlZ2luKCk7Ci0gICAgICAgICBmaWVsZF9pdGVyICE9IGFyZ3MuZW5kKCk7Ci0gICAgICAgICArK2ZpZWxkX2l0ZXIpIHsKLSAgICAgIGZfc2VydmljZV8gPDwgKCpmaWVsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiLCAiOwotICAgIH0KLSAgICBmb3IgKGZpZWxkX2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsKLSAgICAgICAgIGZpZWxkX2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOwotICAgICAgICAgKytmaWVsZF9pdGVyKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8ICgqZmllbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIiwgIjsKLSAgICB9Ci0gICAgZl9zZXJ2aWNlXyA8PCAiZXJyb3IpOyIgPDwgZW5kbDsKLSAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIHRoZSBoYW5kbGVyIGludGVyZmFjZSBpbml0aWFsaXplcgotICBmX3NlcnZpY2VfIDw8Ci0gICAgInN0YXRpYyB2b2lkIiA8PCBlbmRsIDw8Ci0gICAgY2xhc3NfbmFtZV9sYyA8PCAiXyIgPDwgc2VydmljZV9uYW1lX2xjIDw8ICJfaWZfaW50ZXJmYWNlX2luaXQgKCIgPDwKLSAgICB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiSWZJbnRlcmZhY2UgKmlmYWNlKSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gIGZvciAoZnVuY3Rpb25faXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOwotICAgICAgIGZ1bmN0aW9uX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOwotICAgICAgICsrZnVuY3Rpb25faXRlcikgewotICAgIHN0cmluZyBtZXRob2RfbmFtZSA9Ci0gICAgICBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X25hbWUoKSk7Ci0KLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWZhY2UtPiIgPDwgbWV0aG9kX25hbWUgPDwgIiA9ICIgPDwKLSAgICAgIGNsYXNzX25hbWVfbGMgPDwgIl8iIDw8IG1ldGhvZF9uYW1lIDw8ICI7IiA8PCBlbmRsOwotICB9Ci0gIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgaGFuZGxlciBpbnN0YW5jZSBpbml0aWFsaXplcgotICBmX3NlcnZpY2VfIDw8Ci0gICAgInN0YXRpYyB2b2lkIiA8PCBlbmRsIDw8Ci0gICAgY2xhc3NfbmFtZV9sYyA8PCAiX2luaXQgKCIgPDwgY2xhc3NfbmFtZSA8PCAiICpzZWxmKSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAiVEhSSUZUX1VOVVNFRF9WQVIgKHNlbGYpOyIgPDwgZW5kbDsKLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBoYW5kbGVyIGNsYXNzIGluaXRpYWxpemVyCi0gIGZfc2VydmljZV8gPDwKLSAgICAic3RhdGljIHZvaWQiIDw8IGVuZGwgPDwKLSAgICBjbGFzc19uYW1lX2xjIDw8ICJfY2xhc3NfaW5pdCAoIiA8PCBjbGFzc19uYW1lIDw8ICJDbGFzcyAqY2xzKSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gIGZvciAoZnVuY3Rpb25faXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOwotICAgICAgIGZ1bmN0aW9uX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOwotICAgICAgICsrZnVuY3Rpb25faXRlcikgewotICAgIHN0cmluZyBmdW5jdGlvbl9uYW1lID0gKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICBzdHJpbmcgbWV0aG9kX25hbWUgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoZnVuY3Rpb25fbmFtZSk7Ci0KLSAgICAvLyBBbGwgbWV0aG9kcyBhcmUgcHVyZSB2aXJ0dWFsIGFuZCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzZXMKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiY2xzLT4iIDw8IG1ldGhvZF9uYW1lIDw8ICIgPSBOVUxMOyIgPDwgZW5kbDsKLSAgfQotICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIEMgY29kZSB0aGF0IHJlcHJlc2VudHMgYSBUaHJpZnQgc2VydmljZSBwcm9jZXNzb3IuCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGZvciB3aGljaCB0byBnZW5lcmF0ZSBhIHByb2Nlc3NvcgotICovCi12b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3IodF9zZXJ2aWNlICp0c2VydmljZSkgewotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZ1bmN0aW9uX2l0ZXI7Ci0KLSAgc3RyaW5nIHNlcnZpY2VfbmFtZV9sYyA9Ci0gICAgdG9fbG93ZXJfY2FzZShpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoc2VydmljZV9uYW1lXykpOwotICBzdHJpbmcgc2VydmljZV9uYW1lX3VjID0gdG9fdXBwZXJfY2FzZShzZXJ2aWNlX25hbWVfbGMpOwotCi0gIHN0cmluZyBjbGFzc19uYW1lID0gdGhpcy0+bnNwYWNlICsgc2VydmljZV9uYW1lXyArICJQcm9jZXNzb3IiOwotICBzdHJpbmcgY2xhc3NfbmFtZV9sYyA9Ci0gICAgdG9fbG93ZXJfY2FzZShpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoY2xhc3NfbmFtZSkpOwotICBzdHJpbmcgY2xhc3NfbmFtZV91YyA9IHRvX3VwcGVyX2Nhc2UoY2xhc3NfbmFtZV9sYyk7Ci0KLSAgc3RyaW5nIHBhcmVudF9jbGFzc19uYW1lOwotICBzdHJpbmcgcGFyZW50X3R5cGVfbmFtZTsKLQotICBzdHJpbmcgaGFuZGxlcl9jbGFzc19uYW1lID0KLSAgICB0aGlzLT5uc3BhY2UgKyBzZXJ2aWNlX25hbWVfICsgIkhhbmRsZXIiOwotICBzdHJpbmcgaGFuZGxlcl9jbGFzc19uYW1lX2xjID0KLSAgICBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoaGFuZGxlcl9jbGFzc19uYW1lKTsKLQotICBzdHJpbmcgZnVuY3Rpb25fbmFtZTsKLSAgc3RyaW5nIGFyZ3NfaW5kZW50OwotCi0gIC8vIFRoZSBzZXJ2aWNlIHRoaXMgc2VydmljZSBleHRlbmRzLCBvciBOVUxMIGlmIGl0IGV4dGVuZHMgbm8gc2VydmljZQotICB0X3NlcnZpY2UgKmV4dGVuZHNfc2VydmljZSA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOwotCi0gIC8vIERldGVybWluZSB0aGUgbmFtZSBvZiBvdXIgcGFyZW50IHNlcnZpY2UgKGlmIGFueSkgYW5kIHRoZQotICAvLyBwcm9jZXNzb3IgY2xhc3MnIHBhcmVudCBjbGFzcyBuYW1lIGFuZCB0eXBlCi0gIGlmIChleHRlbmRzX3NlcnZpY2UpIHsKLSAgICBzdHJpbmcgcGFyZW50X3NlcnZpY2VfbmFtZSA9IGV4dGVuZHNfc2VydmljZS0+Z2V0X25hbWUoKTsKLSAgICBzdHJpbmcgcGFyZW50X3NlcnZpY2VfbmFtZV9sYyA9Ci0gICAgICB0b19sb3dlcl9jYXNlKGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhwYXJlbnRfc2VydmljZV9uYW1lKSk7Ci0gICAgc3RyaW5nIHBhcmVudF9zZXJ2aWNlX25hbWVfdWMgPSB0b191cHBlcl9jYXNlKHBhcmVudF9zZXJ2aWNlX25hbWVfbGMpOwotCi0gICAgcGFyZW50X2NsYXNzX25hbWUgPQotICAgICAgdGhpcy0+bnNwYWNlICsgcGFyZW50X3NlcnZpY2VfbmFtZSArICJQcm9jZXNzb3IiOwotICAgIHBhcmVudF90eXBlX25hbWUgPQotICAgICAgdGhpcy0+bnNwYWNlX3VjICsgIlRZUEVfIiArIHBhcmVudF9zZXJ2aWNlX25hbWVfdWMgKyAiX1BST0NFU1NPUiI7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgcGFyZW50X2NsYXNzX25hbWUgPSAiVGhyaWZ0RGlzcGF0Y2hQcm9jZXNzb3IiOwotICAgIHBhcmVudF90eXBlX25hbWUgPSAiVEhSSUZUX1RZUEVfRElTUEFUQ0hfUFJPQ0VTU09SIjsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzb3IgY2xhc3MnIGRlZmluaXRpb24gaW4gdGhlIGhlYWRlciBmaWxlCi0KLSAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3NvciBpbnN0YW5jZSBkZWZpbml0aW9uCi0gIGZfaGVhZGVyXyA8PAotICAgICIvKiAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIiBwcm9jZXNzb3IgKi8iIDw8IGVuZGwgPDwKLSAgICAic3RydWN0IF8iIDw8IGNsYXNzX25hbWUgPDwgZW5kbCA8PAotICAgICJ7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZl9oZWFkZXJfIDw8Ci0gICAgaW5kZW50KCkgPDwgcGFyZW50X2NsYXNzX25hbWUgPDwgIiBwYXJlbnQ7IiA8PCBlbmRsIDw8Ci0gICAgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIvKiBwcm90ZWN0ZWQgKi8iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCB0aGlzLT5uc3BhY2UgKyBzZXJ2aWNlX25hbWVfICsgIkhhbmRsZXIgKmhhbmRsZXI7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIkdIYXNoVGFibGUgKnByb2Nlc3NfbWFwOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9oZWFkZXJfIDw8Ci0gICAgIn07IiA8PCBlbmRsIDw8Ci0gICAgInR5cGVkZWYgc3RydWN0IF8iIDw8IGNsYXNzX25hbWUgPDwgIiAiIDw8IGNsYXNzX25hbWUgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzb3IgY2xhc3MgZGVmaW5pdGlvbgotICBmX2hlYWRlcl8gPDwKLSAgICAic3RydWN0IF8iIDw8IGNsYXNzX25hbWUgPDwgIkNsYXNzIiA8PCBlbmRsIDw8Ci0gICAgInsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBmX2hlYWRlcl8gPDwKLSAgICBpbmRlbnQoKSA8PCBwYXJlbnRfY2xhc3NfbmFtZSA8PCAiQ2xhc3MgcGFyZW50OyIgPDwgZW5kbCA8PAotICAgIGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiLyogcHJvdGVjdGVkICovIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwKLSAgICAiZ2Jvb2xlYW4gKCpkaXNwYXRjaF9jYWxsKSAoVGhyaWZ0RGlzcGF0Y2hQcm9jZXNzb3IgKnByb2Nlc3NvciwiIDw8IGVuZGw7Ci0gIGFyZ3NfaW5kZW50ID0gaW5kZW50KCkgKyBzdHJpbmcoMjcsICcgJyk7Ci0gIGZfaGVhZGVyXyA8PAotICAgIGFyZ3NfaW5kZW50IDw8ICJUaHJpZnRQcm90b2NvbCAqaW4sIiA8PCBlbmRsIDw8Ci0gICAgYXJnc19pbmRlbnQgPDwgIlRocmlmdFByb3RvY29sICpvdXQsIiA8PCBlbmRsIDw8Ci0gICAgYXJnc19pbmRlbnQgPDwgImdjaGFyICpmbmFtZSwiIDw8IGVuZGwgPDwKLSAgICBhcmdzX2luZGVudCA8PCAiZ2ludDMyIHNlcWlkLCIgPDwgZW5kbCA8PAotICAgIGFyZ3NfaW5kZW50IDw8ICJHRXJyb3IgKiplcnJvcik7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBmX2hlYWRlcl8gPDwKLSAgICAifTsiIDw8IGVuZGwgPDwKLSAgICAidHlwZWRlZiBzdHJ1Y3QgXyIgPDwgY2xhc3NfbmFtZSA8PCAiQ2xhc3MgIiA8PCBjbGFzc19uYW1lIDw8ICJDbGFzczsiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIHRoZSByZW1haW5pbmcgaGVhZGVyIGJvaWxlcnBsYXRlCi0gIGZfaGVhZGVyXyA8PAotICAgICJHVHlwZSAiIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9nZXRfdHlwZSAodm9pZCk7IiA8PCBlbmRsIDw8Ci0gICAgIiNkZWZpbmUgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIiA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9QUk9DRVNTT1IgIiA8PAotICAgICAgICAiKCIgPDwgY2xhc3NfbmFtZV9sYyA8PCAiX2dldF90eXBlKCkpIiA8PCBlbmRsIDw8Ci0gICAgIiNkZWZpbmUgIiA8PCBjbGFzc19uYW1lX3VjIDw8ICIob2JqKSAiIDw8Ci0gICAgICAgICIoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCAiIDw8Ci0gICAgICAgIHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX1BST0NFU1NPUiwgIiA8PAotICAgICAgICBjbGFzc19uYW1lIDw8ICIpKSIgPDwgZW5kbCA8PAotICAgICIjZGVmaW5lICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJJU18iIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX1BST0NFU1NPUihvYmopICIgPDwKLSAgICAgICAgIihHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksICIgPDwKLSAgICAgICAgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfUFJPQ0VTU09SKSkiIDw8IGVuZGwgPDwKLSAgICAiI2RlZmluZSAiIDw8IGNsYXNzX25hbWVfdWMgPDwgIl9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgIiA8PAotICAgICAgICB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIiA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9QUk9DRVNTT1IsICIgPDwKLSAgICAgICAgY2xhc3NfbmFtZSA8PCAiQ2xhc3MpKSIgPDwgZW5kbCA8PAotICAgICIjZGVmaW5lICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJJU18iIDw8IHNlcnZpY2VfbmFtZV91YyA8PAotICAgICAgICAiX1BST0NFU1NPUl9DTEFTUyhjKSAiIDw8ICIoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgIiA8PAotICAgICAgICB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIiA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9QUk9DRVNTT1IpKSIgPDwgZW5kbCA8PAotICAgICIjZGVmaW5lICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHNlcnZpY2VfbmFtZV91YyA8PAotICAgICAgICAiX1BST0NFU1NPUl9HRVRfQ0xBU1Mob2JqKSAiIDw8ICIoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksICIgPDwKLSAgICAgICAgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfUFJPQ0VTU09SLCAiIDw8Ci0gICAgICAgIGNsYXNzX25hbWUgPDwgIkNsYXNzKSkiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzb3IncyBpbXBsZW1lbnRhdGlvbiBpbiB0aGUgaW1wbGVtZW50YXRpb24gZmlsZQotCi0gIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzb3IncyBwcm9wZXJ0aWVzIGVudW0KLSAgZl9zZXJ2aWNlXyA8PAotICAgICJlbnVtIF8iIDw8IGNsYXNzX25hbWUgPDwgIlByb3BlcnRpZXMiIDw8IGVuZGwgPDwKLSAgICAieyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAiUFJPUF8iIDw8IGNsYXNzX25hbWVfdWMgPDwgIl8wLCIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJQUk9QXyIgPDwgY2xhc3NfbmFtZV91YyA8PCAiX0hBTkRMRVIiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwKLSAgICAifTsiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBpbXBsZW1lbnRhdGlvbiBib2lsZXJwbGF0ZQotICBhcmdzX2luZGVudCA9IHN0cmluZygxNSwgJyAnKTsKLSAgZl9zZXJ2aWNlXyA8PAotICAgICJHX0RFRklORV9UWVBFICgiIDw8IGNsYXNzX25hbWUgPDwgIiwiIDw8IGVuZGwgPDwKLSAgICBhcmdzX2luZGVudCA8PCBjbGFzc19uYW1lX2xjIDw8ICIsIiA8PCBlbmRsIDw8Ci0gICAgYXJnc19pbmRlbnQgPDwgcGFyZW50X3R5cGVfbmFtZSA8PCAiKTsiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzb3IncyBwcm9jZXNzaW5nLWZ1bmN0aW9uIHR5cGUKLSAgZnVuY3Rpb25fbmFtZSA9IGNsYXNzX25hbWUgKyAiUHJvY2Vzc0Z1bmN0aW9uIjsKLSAgYXJnc19pbmRlbnQgPSBzdHJpbmcoZnVuY3Rpb25fbmFtZS5sZW5ndGgoKSArIDIzLCAnICcpOwotICBmX3NlcnZpY2VfIDw8Ci0gICAgInR5cGVkZWYgZ2Jvb2xlYW4gKCogIiA8PCBmdW5jdGlvbl9uYW1lIDw8ICIpICgiIDw8Ci0gICAgY2xhc3NfbmFtZSA8PCAiICosICIgPDwgZW5kbCA8PAotICAgIGFyZ3NfaW5kZW50IDw8ICJnaW50MzIsIiA8PCBlbmRsIDw8Ci0gICAgYXJnc19pbmRlbnQgPDwgIlRocmlmdFByb3RvY29sICosIiA8PCBlbmRsIDw8Ci0gICAgYXJnc19pbmRlbnQgPDwgIlRocmlmdFByb3RvY29sICosIiA8PCBlbmRsIDw8Ci0gICAgYXJnc19pbmRlbnQgPDwgIkdFcnJvciAqKik7IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2Vzc29yJ3MgcHJvY2Vzc2luZyBmdW5jdGlvbnMKLSAgZm9yIChmdW5jdGlvbl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7Ci0gICAgICAgZnVuY3Rpb25faXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7Ci0gICAgICAgKytmdW5jdGlvbl9pdGVyKSB7Ci0gICAgc3RyaW5nIHNlcnZpY2VfZnVuY3Rpb25fbmFtZSA9ICgqZnVuY3Rpb25faXRlciktPmdldF9uYW1lKCk7Ci0gICAgc3RyaW5nIHNlcnZpY2VfZnVuY3Rpb25fbmFtZV9pYyA9Ci0gICAgICB1bmRlcnNjb3Jlc190b19pbml0aWFsX2NhcHMoc2VydmljZV9mdW5jdGlvbl9uYW1lKTsKLSAgICBzdHJpbmcgc2VydmljZV9mdW5jdGlvbl9uYW1lX2xjID0KLSAgICAgIGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhzZXJ2aWNlX2Z1bmN0aW9uX25hbWUpOwotICAgIHN0cmluZyBzZXJ2aWNlX2Z1bmN0aW9uX25hbWVfdWMgPQotICAgICAgdG9fdXBwZXJfY2FzZShzZXJ2aWNlX2Z1bmN0aW9uX25hbWVfbGMpOwotCi0gICAgdF90eXBlICpyZXR1cm5fdHlwZSA9ICgqZnVuY3Rpb25faXRlciktPmdldF9yZXR1cm50eXBlKCk7Ci0gICAgYm9vbCBoYXNfcmV0dXJuX3ZhbHVlID0gIXJldHVybl90eXBlLT5pc192b2lkKCk7Ci0KLSAgICB0X3N0cnVjdCAqYXJnX2xpc3QgPSAoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGFyZ3MgPSBhcmdfbGlzdC0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBhcmdfaXRlcjsKLQotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9Ci0gICAgICAoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCktPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeGNlcHRpb25faXRlcjsKLQotICAgIHN0cmluZyBhcmdzX2NsYXNzX25hbWUgPQotICAgICAgdGhpcy0+bnNwYWNlICsgc2VydmljZV9uYW1lXyArIHNlcnZpY2VfZnVuY3Rpb25fbmFtZV9pYyArICJBcmdzIjsKLSAgICBzdHJpbmcgYXJnc19jbGFzc190eXBlID0KLSAgICAgIHRoaXMtPm5zcGFjZV91YyArICJUWVBFXyIgKyBzZXJ2aWNlX25hbWVfdWMgKyAiXyIgKwotICAgICAgc2VydmljZV9mdW5jdGlvbl9uYW1lX3VjICsgIl9BUkdTIjsKLQotICAgIHN0cmluZyByZXN1bHRfY2xhc3NfbmFtZSA9Ci0gICAgICB0aGlzLT5uc3BhY2UgKyBzZXJ2aWNlX25hbWVfICsgc2VydmljZV9mdW5jdGlvbl9uYW1lX2ljICsgIlJlc3VsdCI7Ci0gICAgc3RyaW5nIHJlc3VsdF9jbGFzc190eXBlID0KLSAgICAgIHRoaXMtPm5zcGFjZV91YyArICJUWVBFXyIgKyBzZXJ2aWNlX25hbWVfdWMgKyAiXyIgKwotICAgICAgc2VydmljZV9mdW5jdGlvbl9uYW1lX3VjICsgIl9SRVNVTFQiOwotCi0gICAgc3RyaW5nIGhhbmRsZXJfZnVuY3Rpb25fbmFtZSA9Ci0gICAgICBoYW5kbGVyX2NsYXNzX25hbWVfbGMgKyAiXyIgKyBzZXJ2aWNlX2Z1bmN0aW9uX25hbWVfbGM7Ci0KLSAgICBmdW5jdGlvbl9uYW1lID0KLSAgICAgIGNsYXNzX25hbWVfbGMgKwotICAgICAgIl9wcm9jZXNzXyIgKwotICAgICAgaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKHNlcnZpY2VfZnVuY3Rpb25fbmFtZSk7Ci0KLSAgICBhcmdzX2luZGVudCA9IHN0cmluZyhmdW5jdGlvbl9uYW1lLmxlbmd0aCgpICsgMiwgJyAnKTsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAic3RhdGljIGdib29sZWFuIiA8PCBlbmRsIDw8Ci0gICAgICBmdW5jdGlvbl9uYW1lIDw8ICIgKCIgPDwgY2xhc3NfbmFtZSA8PCAiICpzZWxmLCIgPDwgZW5kbCA8PAotICAgICAgYXJnc19pbmRlbnQgPDwgImdpbnQzMiBzZXF1ZW5jZV9pZCwiIDw8IGVuZGwgPDwKLSAgICAgIGFyZ3NfaW5kZW50IDw8ICJUaHJpZnRQcm90b2NvbCAqaW5wdXRfcHJvdG9jb2wsIiA8PCBlbmRsIDw8Ci0gICAgICBhcmdzX2luZGVudCA8PCAiVGhyaWZ0UHJvdG9jb2wgKm91dHB1dF9wcm90b2NvbCwiIDw8IGVuZGwgPDwKLSAgICAgIGFyZ3NfaW5kZW50IDw8ICJHRXJyb3IgKiplcnJvcikiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgImdib29sZWFuIHJlc3VsdCA9IFRSVUU7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiVGhyaWZ0VHJhbnNwb3J0ICogdHJhbnNwb3J0OyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgYXJnc19jbGFzc19uYW1lICsgIiAqIGFyZ3MgPSIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiZ19vYmplY3RfbmV3ICgiIDw8IGFyZ3NfY2xhc3NfdHlwZSA8PCAiLCBOVUxMKTsiIDw8IGVuZGwgPDwKLSAgICAgIGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpZiAoKCpmdW5jdGlvbl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIlRIUklGVF9VTlVTRURfVkFSIChzZXF1ZW5jZV9pZCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJUSFJJRlRfVU5VU0VEX1ZBUiAob3V0cHV0X3Byb3RvY29sKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgZW5kbDsKLSAgICB9Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgImdfb2JqZWN0X2dldCAoaW5wdXRfcHJvdG9jb2wsIFwidHJhbnNwb3J0XCIsICIgPDwKLSAgICAgICImdHJhbnNwb3J0LCBOVUxMKTsiIDw8IGVuZGwgPDwKLSAgICAgIGVuZGw7Ci0KLSAgICAvLyBSZWFkIHRoZSBtZXRob2QncyBhcmd1bWVudHMgZnJvbSB0aGUgY2FsbGVyCi0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgImlmICgodGhyaWZ0X3N0cnVjdF9yZWFkIChUSFJJRlRfU1RSVUNUIChhcmdzKSwgIiA8PAotICAgICAgImlucHV0X3Byb3RvY29sLCBlcnJvcikgIT0gLTEpICYmIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICAgICh0aHJpZnRfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2VuZCAoaW5wdXRfcHJvdG9jb2wsICIgPDwKLSAgICAgICJlcnJvcikgIT0gLTEpICYmIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICAgICh0aHJpZnRfdHJhbnNwb3J0X3JlYWRfZW5kICh0cmFuc3BvcnQsIGVycm9yKSAhPSBGQUxTRSkpIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOwotCi0gICAgZm9yIChhcmdfaXRlciA9IGFyZ3MuYmVnaW4oKTsgYXJnX2l0ZXIgIT0gYXJncy5lbmQoKTsgKythcmdfaXRlcikgewotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCBwcm9wZXJ0eV90eXBlX25hbWUoKCphcmdfaXRlciktPmdldF90eXBlKCkpIDw8ICIgIiA8PAotICAgICAgICAoKmFyZ19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgZm9yICh4Y2VwdGlvbl9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7Ci0gICAgICAgICB4Y2VwdGlvbl9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsKLSAgICAgICAgICsreGNlcHRpb25faXRlcikgewotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCB0eXBlX25hbWUoKCp4Y2VwdGlvbl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiAiIDw8Ci0gICAgICAgIGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcygoKnhjZXB0aW9uX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PAotICAgICAgICAiID0gTlVMTDsiIDw8Ci0gICAgICAgIGVuZGw7Ci0gICAgfQotICAgIGlmIChoYXNfcmV0dXJuX3ZhbHVlKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8IHByb3BlcnR5X3R5cGVfbmFtZShyZXR1cm5fdHlwZSkgPDwgIiByZXR1cm5fdmFsdWU7IiA8PCBlbmRsOwotICAgIH0KLSAgICBpZiAoISgqZnVuY3Rpb25faXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8IHJlc3VsdF9jbGFzc19uYW1lIDw8ICIgKiByZXN1bHRfc3RydWN0OyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gICAgaWYgKGFyZ3Muc2l6ZSgpID4gMCkgewotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiZ19vYmplY3RfZ2V0IChhcmdzLCIgPDwgZW5kbDsKLSAgICAgIGFyZ3NfaW5kZW50ID0gaW5kZW50KCkgKyBzdHJpbmcoMTQsICcgJyk7Ci0gICAgICBmb3IgKGFyZ19pdGVyID0gYXJncy5iZWdpbigpOyBhcmdfaXRlciAhPSBhcmdzLmVuZCgpOyArK2FyZ19pdGVyKSB7Ci0gICAgICAgIHN0cmluZyBhcmdfbmFtZSA9ICgqYXJnX2l0ZXIpLT5nZXRfbmFtZSgpOwotCi0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBhcmdzX2luZGVudCA8PCAiXCIiIDw8IGFyZ19uYW1lIDw8ICJcIiwgJiIgPDwgYXJnX25hbWUgPDwgIiwiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGFyZ3NfaW5kZW50IDw8ICJOVUxMKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgZW5kbDsKLSAgICB9Ci0KLSAgICBpZiAoISgqZnVuY3Rpb25faXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImdfb2JqZWN0X2dldCAob3V0cHV0X3Byb3RvY29sLCBcInRyYW5zcG9ydFwiLCAiIDw8Ci0gICAgICAgICImdHJhbnNwb3J0LCBOVUxMKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAicmVzdWx0X3N0cnVjdCA9IGdfb2JqZWN0X25ldyAoIiA8PCByZXN1bHRfY2xhc3NfdHlwZSA8PAotICAgICAgICAiLCBOVUxMKTsiIDw8IGVuZGw7Ci0gICAgICBpZiAoaGFzX3JldHVybl92YWx1ZSkgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImdfb2JqZWN0X2dldCAocmVzdWx0X3N0cnVjdCwgIgotICAgICAgICAgICJcInN1Y2Nlc3NcIiwgJnJldHVybl92YWx1ZSwgTlVMTCk7IiA8PCBlbmRsOwotICAgICAgfQotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBlbmRsOwotICAgIH0KLQotICAgIC8vIFBhc3MgdGhlIGFyZ3VtZW50cyB0byB0aGUgY29ycmVzcG9uZGluZyBtZXRob2QgaW4gdGhlIGhhbmRsZXIKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWYgKCIgPDwgaGFuZGxlcl9mdW5jdGlvbl9uYW1lIDw8ICIgKCIgPDwKLSAgICAgIHRoaXMtPm5zcGFjZV91YyA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9JRiAoc2VsZi0+aGFuZGxlciksIiA8PCBlbmRsOwotICAgIGFyZ3NfaW5kZW50ID0gaW5kZW50KCkgKyBzdHJpbmcoaGFuZGxlcl9mdW5jdGlvbl9uYW1lLmxlbmd0aCgpICsgNiwgJyAnKTsKLSAgICBpZiAoaGFzX3JldHVybl92YWx1ZSkgewotICAgICAgc3RyaW5nIHJldHVybl90eXBlX25hbWUgPSB0eXBlX25hbWUocmV0dXJuX3R5cGUpOwotCi0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGFyZ3NfaW5kZW50OwotCi0gICAgICAvLyBDYXN0IHJldHVybl92YWx1ZSBpZiBpdCB3YXMgZGVjbGFyZWQgYXMgYSB0eXBlIG90aGVyIHRoYW4gdGhlIHJldHVybgotICAgICAgLy8gdmFsdWUncyBhY3R1YWwgdHlwZS0tLXRoaXMgaXMgdHJ1ZSBmb3IgaW50ZWdlciB2YWx1ZXMgMzIgYml0cyBvciBmZXdlcgotICAgICAgLy8gaW4gd2lkdGgsIGZvciB3aGljaCBHTGliIHJlcXVpcmVzIGEgcGxhaW4gZ2ludCB0eXBlIGJlIHVzZWQgd2hlbgotICAgICAgLy8gc3RvcmluZyBvciByZXRyaWV2aW5nIGFzIGFuIG9iamVjdCBwcm9wZXJ0eQotICAgICAgaWYgKHJldHVybl90eXBlX25hbWUgIT0gcHJvcGVydHlfdHlwZV9uYW1lKHJldHVybl90eXBlKSkgewotICAgICAgICBpZiAocmV0dXJuX3R5cGVfbmFtZVtyZXR1cm5fdHlwZV9uYW1lLmxlbmd0aCgpIC0gMV0gIT0gJyonKSB7Ci0gICAgICAgICAgcmV0dXJuX3R5cGVfbmFtZSArPSAnICc7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuX3R5cGVfbmFtZSArPSAnKic7Ci0KLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgICIoIiA8PCByZXR1cm5fdHlwZV9uYW1lIDw8ICIpIjsKLSAgICAgIH0KLQotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAiJnJldHVybl92YWx1ZSwiIDw8IGVuZGw7Ci0gICAgfQotICAgIGZvciAoYXJnX2l0ZXIgPSBhcmdzLmJlZ2luKCk7IGFyZ19pdGVyICE9IGFyZ3MuZW5kKCk7ICsrYXJnX2l0ZXIpIHsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgYXJnc19pbmRlbnQgPDwgKCphcmdfaXRlciktPmdldF9uYW1lKCkgPDwgIiwiIDw8IGVuZGw7Ci0gICAgfQotICAgIGZvciAoeGNlcHRpb25faXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOwotICAgICAgICAgeGNlcHRpb25faXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7Ci0gICAgICAgICArK3hjZXB0aW9uX2l0ZXIpIHsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgYXJnc19pbmRlbnQgPDwgIiYiIDw8Ci0gICAgICAgIGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcygoKnhjZXB0aW9uX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiLCIgPDwgZW5kbDsKLSAgICB9Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgYXJnc19pbmRlbnQgPDwgImVycm9yKSA9PSBUUlVFKSIgPDwgZW5kbDsKLSAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKLQotICAgIC8vIFRoZSBoYW5kbGVyIHJlcG9ydGVkIHN1Y2Nlc3M7IHJldHVybiB0aGUgcmVzdWx0LCBpZiBhbnksIHRvIHRoZSBjYWxsZXIKLSAgICBpZiAoISgqZnVuY3Rpb25faXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBpZiAoaGFzX3JldHVybl92YWx1ZSkgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImdfb2JqZWN0X3NldCAocmVzdWx0X3N0cnVjdCwgXCJzdWNjZXNzXCIsIHJldHVybl92YWx1ZSwgIiA8PAotICAgICAgICAgICJOVUxMKTsiIDw8IGVuZGw7Ci0KLSAgICAgICAgLy8gRGVhbGxvY2F0ZSAob3IgdW5yZWYpIHJldHVybl92YWx1ZQotICAgICAgICByZXR1cm5fdHlwZSA9IGdldF90cnVlX3R5cGUocmV0dXJuX3R5cGUpOwotICAgICAgICBpZiAocmV0dXJuX3R5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICAgICAgdF9iYXNlX3R5cGUgKmJhc2VfdHlwZSA9ICgodF9iYXNlX3R5cGUgKikgcmV0dXJuX3R5cGUpOwotCi0gICAgICAgICAgaWYgKGJhc2VfdHlwZS0+Z2V0X2Jhc2UoKSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkcpIHsKLSAgICAgICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgImlmIChyZXR1cm5fdmFsdWUgIT0gTlVMTCkiIDw8IGVuZGw7Ci0gICAgICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgICAgICAgIGlmIChiYXNlX3R5cGUtPmlzX2JpbmFyeSgpKSB7Ci0gICAgICAgICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiZ19ieXRlX2FycmF5X3VucmVmIChyZXR1cm5fdmFsdWUpOyIgPDwgZW5kbDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICJnX2ZyZWUgKHJldHVybl92YWx1ZSk7IiA8PCBlbmRsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAocmV0dXJuX3R5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgImlmIChyZXR1cm5fdmFsdWUgIT0gTlVMTCkiIDw8IGVuZGw7Ci0gICAgICAgICAgaW5kZW50X3VwKCk7Ci0KLSAgICAgICAgICBpZiAocmV0dXJuX3R5cGUtPmlzX2xpc3QoKSkgewotICAgICAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiZ19hcnJheV91bnJlZiAocmV0dXJuX3ZhbHVlKTsiIDw8IGVuZGw7Ci0gICAgICAgICAgfSBlbHNlIGlmIChyZXR1cm5fdHlwZS0+aXNfbWFwKCkgfHwgcmV0dXJuX3R5cGUtPmlzX3NldCgpKSB7Ci0gICAgICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICJnX2hhc2hfdGFibGVfdW5yZWYgKHJldHVybl92YWx1ZSk7IiA8PCBlbmRsOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAocmV0dXJuX3R5cGUtPmlzX3N0cnVjdCgpKSB7Ci0gICAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgImlmIChyZXR1cm5fdmFsdWUgIT0gTlVMTCkiIDw8IGVuZGw7Ci0gICAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgImdfb2JqZWN0X3VucmVmIChyZXR1cm5fdmFsdWUpOyIgPDwgZW5kbDsKLSAgICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICB9Ci0KLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGVuZGw7Ci0gICAgICB9Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJyZXN1bHQgPSIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiKCh0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbiAob3V0cHV0X3Byb3RvY29sLCIgPDwgZW5kbDsKLSAgICAgIGFyZ3NfaW5kZW50ID0gaW5kZW50KCkgKyBzdHJpbmcoMzksICcgJyk7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGFyZ3NfaW5kZW50IDw8ICJcIiIgPDwgc2VydmljZV9mdW5jdGlvbl9uYW1lIDw8ICJcIiwiIDw8IGVuZGwgPDwKLSAgICAgICAgYXJnc19pbmRlbnQgPDwgIlRfUkVQTFksIiA8PCBlbmRsIDw8Ci0gICAgICAgIGFyZ3NfaW5kZW50IDw8ICJzZXF1ZW5jZV9pZCwiIDw8IGVuZGwgPDwKLSAgICAgICAgYXJnc19pbmRlbnQgPDwgImVycm9yKSAhPSAtMSkgJiYiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAodGhyaWZ0X3N0cnVjdF93cml0ZSAoVEhSSUZUX1NUUlVDVCAocmVzdWx0X3N0cnVjdCksIiA8PCBlbmRsOwotICAgICAgYXJnc19pbmRlbnQgPSBpbmRlbnQoKSArIHN0cmluZygyMywgJyAnKTsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgYXJnc19pbmRlbnQgPDwgIm91dHB1dF9wcm90b2NvbCwiIDw8IGVuZGwgPDwKLSAgICAgICAgYXJnc19pbmRlbnQgPDwgImVycm9yKSAhPSAtMSkpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgfQotICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgImVsc2UiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0KLSAgICAvLyBUaGUgaGFuZGxlciByZXBvcnRlZCBmYWlsdXJlOyBjaGVjayB0byBzZWUgaWYgYW4gYXBwbGljYXRpb24tZGVmaW5lZAotICAgIC8vIGV4Y2VwdGlvbiB3YXMgcmFpc2VkIGFuZCBpZiBzbywgcmV0dXJuIGl0IHRvIHRoZSBjYWxsZXIKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOwotICAgIGlmICh4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgewotICAgICAgZm9yICh4Y2VwdGlvbl9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7Ci0gICAgICAgICAgIHhjZXB0aW9uX2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOwotICAgICAgICAgICArK3hjZXB0aW9uX2l0ZXIpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgICJpZiAoIiA8PCBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoKCp4Y2VwdGlvbl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwKLSAgICAgICAgICAiICE9IE5VTEwpIiA8PCBlbmRsOwotICAgICAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJnX29iamVjdF9zZXQgKHJlc3VsdF9zdHJ1Y3QsIiA8PCBlbmRsOwotICAgICAgICBhcmdzX2luZGVudCA9IGluZGVudCgpICsgc3RyaW5nKDE0LCAnICcpOwotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgYXJnc19pbmRlbnQgPDwgIlwiIiA8PCAoKnhjZXB0aW9uX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIiwgIiA8PAotICAgICAgICAgICgqeGNlcHRpb25faXRlciktPmdldF9uYW1lKCkgPDwgIiwiIDw8IGVuZGwgPDwKLSAgICAgICAgICBhcmdzX2luZGVudCA8PCAiTlVMTCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgZW5kbDsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJyZXN1bHQgPSIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiKCh0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbiAob3V0cHV0X3Byb3RvY29sLCIgPDwgZW5kbDsKLSAgICAgICAgYXJnc19pbmRlbnQgPSBpbmRlbnQoKSArIHN0cmluZygzOSwgJyAnKTsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGFyZ3NfaW5kZW50IDw8ICJcIiIgPDwgc2VydmljZV9mdW5jdGlvbl9uYW1lIDw8ICJcIiwiIDw8IGVuZGwgPDwKLSAgICAgICAgICBhcmdzX2luZGVudCA8PCAiVF9SRVBMWSwiIDw8IGVuZGwgPDwKLSAgICAgICAgICBhcmdzX2luZGVudCA8PCAic2VxdWVuY2VfaWQsIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgYXJnc19pbmRlbnQgPDwgImVycm9yKSAhPSAtMSkgJiYiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICh0aHJpZnRfc3RydWN0X3dyaXRlIChUSFJJRlRfU1RSVUNUIChyZXN1bHRfc3RydWN0KSwiIDw8IGVuZGw7Ci0gICAgICAgIGFyZ3NfaW5kZW50ID0gaW5kZW50KCkgKyBzdHJpbmcoMjMsICcgJyk7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBhcmdzX2luZGVudCA8PCAib3V0cHV0X3Byb3RvY29sLCIgPDwgZW5kbCA8PAotICAgICAgICAgIGFyZ3NfaW5kZW50IDw8ICJlcnJvcikgIT0gLTEpKTsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiZWxzZSIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOwotICAgIH0KLQotICAgIC8vIElmIHRoZSBoYW5kbGVyIHJlcG9ydGVkIGZhaWx1cmUgYnV0IHJhaXNlZCBubyBhcHBsaWNhdGlvbi1kZWZpbmVkCi0gICAgLy8gZXhjZXB0aW9uLCByZXR1cm4gYSBUaHJpZnQgYXBwbGljYXRpb24gZXhjZXB0aW9uIHdpdGggdGhlIGluZm9ybWF0aW9uCi0gICAgLy8gcmV0dXJuZWQgdmlhIEdMaWIncyBvd24gZXJyb3ItcmVwb3J0aW5nIG1lY2hhbmlzbQotICAgIGZfc2VydmljZV8gPDwKLSAgICAgICJpZiAoKmVycm9yID09IE5VTEwpIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJnX3dhcm5pbmcgKFwiIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICIuIiA8PAotICAgICAgKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGltcGxlbWVudGF0aW9uIHJldHVybmVkIEZBTFNFIFwiIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCBzdHJpbmcgKDExLCAnICcpIDw8ICJcImJ1dCBkaWQgbm90IHNldCBhbiBlcnJvclwiKTsiIDw8IGVuZGwgPDwKLSAgICAgIGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiVGhyaWZ0QXBwbGljYXRpb25FeGNlcHRpb24gKnhjZXB0aW9uID0iIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgImdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQVBQTElDQVRJT05fRVhDRVBUSU9OLCIgPDwgZW5kbDsKLSAgICBhcmdzX2luZGVudCA9IGluZGVudCgpICsgc3RyaW5nKDE0LCAnICcpOwotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGFyZ3NfaW5kZW50IDw8ICJcInR5cGVcIiwgICAgKmVycm9yICE9IE5VTEwgPyAoKmVycm9yKS0+Y29kZSA6IiA8PCBlbmRsIDw8Ci0gICAgICBhcmdzX2luZGVudCA8PCBzdHJpbmcoMTEsICcgJykgPDwgIlRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1JfVU5LTk9XTiwiIDw8IGVuZGwgPDwKLSAgICAgIGFyZ3NfaW5kZW50IDw8ICJcIm1lc3NhZ2VcIiwgKmVycm9yICE9IE5VTEwgPyAoKmVycm9yKS0+bWVzc2FnZSA6IE5VTEwsIiA8PCBlbmRsIDw8Ci0gICAgICBhcmdzX2luZGVudCA8PCAiTlVMTCk7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgImdfY2xlYXJfZXJyb3IgKGVycm9yKTsiIDw8IGVuZGwgPDwKLSAgICAgIGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJyZXN1bHQgPSIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiKCh0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbiAob3V0cHV0X3Byb3RvY29sLCIgPDwgZW5kbDsKLSAgICBhcmdzX2luZGVudCA9IGluZGVudCgpICsgc3RyaW5nKDM5LCAnICcpOwotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGFyZ3NfaW5kZW50IDw8ICJcIiIgPDwgc2VydmljZV9mdW5jdGlvbl9uYW1lIDw8ICJcIiwiIDw8IGVuZGwgPDwKLSAgICAgIGFyZ3NfaW5kZW50IDw8ICJUX0VYQ0VQVElPTiwiIDw8IGVuZGwgPDwKLSAgICAgIGFyZ3NfaW5kZW50IDw8ICJzZXF1ZW5jZV9pZCwiIDw8IGVuZGwgPDwKLSAgICAgIGFyZ3NfaW5kZW50IDw8ICJlcnJvcikgIT0gLTEpICYmIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICh0aHJpZnRfc3RydWN0X3dyaXRlIChUSFJJRlRfU1RSVUNUICh4Y2VwdGlvbiksIiA8PCBlbmRsOwotICAgIGFyZ3NfaW5kZW50ID0gaW5kZW50KCkgKyBzdHJpbmcoMjMsICcgJyk7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgYXJnc19pbmRlbnQgPDwgIm91dHB1dF9wcm90b2NvbCwiIDw8IGVuZGwgPDwKLSAgICAgIGFyZ3NfaW5kZW50IDw8ICJlcnJvcikgIT0gLTEpKTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiZ19vYmplY3RfdW5yZWYgKHhjZXB0aW9uKTsiIDw8IGVuZGw7Ci0KLSAgICBpZiAoeGNlcHRpb25zLnNpemUoKSA+IDApIHsKLSAgICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gICAgfQotICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gICAgLy8gRGVsbG9jYXRlIG9yIHVucmVmIHJldHJpZXZlZCBhcmd1bWVudCB2YWx1ZXMgYXMgbmVjZXNzYXJ5Ci0gICAgZm9yIChhcmdfaXRlciA9IGFyZ3MuYmVnaW4oKTsgYXJnX2l0ZXIgIT0gYXJncy5lbmQoKTsgKythcmdfaXRlcikgewotICAgICAgc3RyaW5nIGFyZ19uYW1lID0gKCphcmdfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgICB0X3R5cGUgKmFyZ190eXBlID0gZ2V0X3RydWVfdHlwZSgoKmFyZ19pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0KLSAgICAgIGlmIChhcmdfdHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgICAgdF9iYXNlX3R5cGUgKmJhc2VfdHlwZSA9ICgodF9iYXNlX3R5cGUgKikgYXJnX3R5cGUpOwotCi0gICAgICAgIGlmIChiYXNlX3R5cGUtPmdldF9iYXNlKCkgPT0gdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HKSB7Ci0gICAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgImlmICgiIDw8IGFyZ19uYW1lIDw8ICIgIT0gTlVMTCkiIDw8IGVuZGw7Ci0gICAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgICAgaWYgKGJhc2VfdHlwZS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgImdfYnl0ZV9hcnJheV91bnJlZiAoIiA8PCBhcmdfbmFtZSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgImdfZnJlZSAoIiA8PCBhcmdfbmFtZSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgICAgICAgfQotICAgICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSBpZiAoYXJnX3R5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKCIgPDwgYXJnX25hbWUgPDwgIiAhPSBOVUxMKSIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0KLSAgICAgICAgaWYgKGFyZ190eXBlLT5pc19saXN0KCkpIHsKLSAgICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiZ19hcnJheV91bnJlZiAoIiA8PCBhcmdfbmFtZSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgICAgIH0gZWxzZSBpZiAoYXJnX3R5cGUtPmlzX21hcCgpIHx8IGFyZ190eXBlLT5pc19zZXQoKSkgewotICAgICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICJnX2hhc2hfdGFibGVfdW5yZWYgKCIgPDwgYXJnX25hbWUgPDwgIik7IiA8PCBlbmRsOwotICAgICAgICB9Ci0KLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIH0gZWxzZSBpZiAoYXJnX3R5cGUtPmlzX3N0cnVjdCgpKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKCIgPDwgYXJnX25hbWUgPDwgIiAhPSBOVUxMKSIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiZ19vYmplY3RfdW5yZWYgKCIgPDwgYXJnX25hbWUgPDwgIik7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgfQotICAgIH0KLQotICAgIGlmKCEoKmZ1bmN0aW9uX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiZ19vYmplY3RfdW5yZWYgKHJlc3VsdF9zdHJ1Y3QpOyIgPDwgZW5kbCA8PAotICAgICAgICBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiAocmVzdWx0ID09IFRSVUUpIiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJyZXN1bHQgPSIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiKCh0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9lbmQgIiA8PAotICAgICAgICAiKG91dHB1dF9wcm90b2NvbCwgZXJyb3IpICE9IC0xKSAmJiIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICh0aHJpZnRfdHJhbnNwb3J0X3dyaXRlX2VuZCAodHJhbnNwb3J0LCBlcnJvcikgIiA8PAotICAgICAgICAiIT0gRkFMU0UpICYmIiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgKHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgZXJyb3IpICIgPDwKLSAgICAgICAgIiE9IEZBTFNFKSk7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgfQotICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgImVsc2UiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInJlc3VsdCA9IEZBTFNFOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotCi0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImdfb2JqZWN0X3VucmVmICh0cmFuc3BvcnQpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImdfb2JqZWN0X3VucmVmIChhcmdzKTsiIDw8IGVuZGwgPDwKLSAgICAgIGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJyZXR1cm4gcmVzdWx0OyIgPDwgZW5kbDsKLSAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotCi0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotICB9Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3NvcidzIGRpc3BhdGNoX2NhbGwgaW1wbGVtZW50YXRpb24KLSAgZnVuY3Rpb25fbmFtZSA9IGNsYXNzX25hbWVfbGMgKyAiX2Rpc3BhdGNoX2NhbGwiOwotICBhcmdzX2luZGVudCA9IGluZGVudCgpICsgc3RyaW5nKGZ1bmN0aW9uX25hbWUubGVuZ3RoKCkgKyAyLCAnICcpOwotICBmX3NlcnZpY2VfIDw8Ci0gICAgInN0YXRpYyBnYm9vbGVhbiIgPDwgZW5kbCA8PAotICAgIGZ1bmN0aW9uX25hbWUgPDwgIiAoVGhyaWZ0RGlzcGF0Y2hQcm9jZXNzb3IgKmRpc3BhdGNoX3Byb2Nlc3NvciwiIDw8IGVuZGwgPDwKLSAgICBhcmdzX2luZGVudCA8PCAiVGhyaWZ0UHJvdG9jb2wgKmlucHV0X3Byb3RvY29sLCIgPDwgZW5kbCA8PAotICAgIGFyZ3NfaW5kZW50IDw8ICJUaHJpZnRQcm90b2NvbCAqb3V0cHV0X3Byb3RvY29sLCIgPDwgZW5kbCA8PAotICAgIGFyZ3NfaW5kZW50IDw8ICJnY2hhciAqbWV0aG9kX25hbWUsIiA8PCBlbmRsIDw8Ci0gICAgYXJnc19pbmRlbnQgPDwgImdpbnQzMiBzZXF1ZW5jZV9pZCwiIDw8IGVuZGwgPDwKLSAgICBhcmdzX2luZGVudCA8PCAiR0Vycm9yICoqZXJyb3IpIiA8PCBlbmRsOwotICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8IGNsYXNzX25hbWUgPDwgIlByb2Nlc3NGdW5jdGlvbiBwcm9jZXNzX2Z1bmN0aW9uOyAiIDw8IGVuZGw7Ci0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAiZ2Jvb2xlYW4gZGlzcGF0Y2hfcmVzdWx0ID0gRkFMU0U7IiA8PCBlbmRsIDw8Ci0gICAgZW5kbCA8PAotICAgIGluZGVudCgpIDw8IGNsYXNzX25hbWUgPDwgIiAqc2VsZiA9ICIgPDwKLSAgICBjbGFzc19uYW1lX3VjIDw8ICIgKGRpc3BhdGNoX3Byb2Nlc3Nvcik7IiA8PCBlbmRsOwotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgcGFyZW50X2NsYXNzX25hbWUgPDwgIkNsYXNzICIKLSAgICAiKnBhcmVudF9jbGFzcyA9IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJnX3R5cGVfY2xhc3NfcGVla19wYXJlbnQgKCIgPDwgY2xhc3NfbmFtZV91YyA8PAotICAgICJfR0VUX0NMQVNTIChzZWxmKSk7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8Ci0gICAgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJwcm9jZXNzX2Z1bmN0aW9uID0gZ19oYXNoX3RhYmxlX2xvb2t1cCAoIiA8PAotICAgICJzZWxmLT5wcm9jZXNzX21hcCwgbWV0aG9kX25hbWUpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJpZiAocHJvY2Vzc19mdW5jdGlvbiAhPSBOVUxMKSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gIGFyZ3NfaW5kZW50ID0gaW5kZW50KCkgKyBzdHJpbmcoMzksICcgJyk7Ci0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAiZGlzcGF0Y2hfcmVzdWx0ID0gKCpwcm9jZXNzX2Z1bmN0aW9uKSAoc2VsZiwiIDw8IGVuZGwgPDwKLSAgICBhcmdzX2luZGVudCA8PCAic2VxdWVuY2VfaWQsIiA8PCBlbmRsIDw8Ci0gICAgYXJnc19pbmRlbnQgPDwgImlucHV0X3Byb3RvY29sLCIgPDwgZW5kbCA8PAotICAgIGFyZ3NfaW5kZW50IDw8ICJvdXRwdXRfcHJvdG9jb2wsIiA8PCBlbmRsIDw8Ci0gICAgYXJnc19pbmRlbnQgPDwgImVycm9yKTsiIDw8IGVuZGw7Ci0gIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAiZWxzZSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0KLSAgLy8gTWV0aG9kIG5hbWUgbm90IHJlY29nbml6ZWQ7IGNoYWluIHVwIHRvIG91ciBwYXJlbnQgcHJvY2Vzc29yLS0tbm90ZSB0aGUKLSAgLy8gdG9wLW1vc3QgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QsIGluIFRocmlmdERpc3BhdGNoUHJvY2Vzc29yIGl0c2VsZiwKLSAgLy8gd2lsbCByZXR1cm4gYW4gYXBwbGljYXRpb24gZXhjZXB0aW9uIHRvIHRoZSBjYWxsZXIgaWYgbm8gY2xhc3MgaW4gdGhlCi0gIC8vIGhpZXJhcmNoeSByZWNvZ25pemVzIHRoZSBtZXRob2QgbmFtZQotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgImRpc3BhdGNoX3Jlc3VsdCA9IHBhcmVudF9jbGFzcy0+ZGlzcGF0Y2hfY2FsbCAiCi0gICAgIihkaXNwYXRjaF9wcm9jZXNzb3IsIiA8PCBlbmRsOwotICBhcmdzX2luZGVudCA9IGluZGVudCgpICsgc3RyaW5nKDQ3LCAnICcpOwotICBmX3NlcnZpY2VfIDw8Ci0gICAgYXJnc19pbmRlbnQgPDwgImlucHV0X3Byb3RvY29sLCIgPDwgZW5kbCA8PAotICAgIGFyZ3NfaW5kZW50IDw8ICJvdXRwdXRfcHJvdG9jb2wsIiA8PCBlbmRsIDw8Ci0gICAgYXJnc19pbmRlbnQgPDwgIm1ldGhvZF9uYW1lLCIgPDwgZW5kbCA8PAotICAgIGFyZ3NfaW5kZW50IDw8ICJzZXF1ZW5jZV9pZCwiIDw8IGVuZGwgPDwKLSAgICBhcmdzX2luZGVudCA8PCAiZXJyb3IpOyIgPDwgZW5kbDsKLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgZl9zZXJ2aWNlXyA8PAotICAgIGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAicmV0dXJuIGRpc3BhdGNoX3Jlc3VsdDsiIDw8IGVuZGw7Ci0gIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2Vzc29yJ3MgcHJvcGVydHkgc2V0dGVyCi0gIGZ1bmN0aW9uX25hbWUgPSBjbGFzc19uYW1lX2xjICsgIl9zZXRfcHJvcGVydHkiOwotICBhcmdzX2luZGVudCA9IHN0cmluZyhmdW5jdGlvbl9uYW1lLmxlbmd0aCgpICsgMiwgJyAnKTsKLSAgZl9zZXJ2aWNlXyA8PAotICAgICJzdGF0aWMgdm9pZCIgPDwgZW5kbCA8PAotICAgIGZ1bmN0aW9uX25hbWUgPDwgIiAoR09iamVjdCAqb2JqZWN0LCIgPDwgZW5kbCA8PAotICAgIGFyZ3NfaW5kZW50IDw8ICJndWludCBwcm9wZXJ0eV9pZCwiIDw8IGVuZGwgPDwKLSAgICBhcmdzX2luZGVudCA8PCAiY29uc3QgR1ZhbHVlICp2YWx1ZSwiIDw8IGVuZGwgPDwKLSAgICBhcmdzX2luZGVudCA8PCAiR1BhcmFtU3BlYyAqcHNwZWMpIiA8PCBlbmRsOwotICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8IGNsYXNzX25hbWUgPDwgIiAqc2VsZiA9ICIgPDwKLSAgICBjbGFzc19uYW1lX3VjIDw8ICIgKG9iamVjdCk7IiA8PCBlbmRsIDw8Ci0gICAgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJzd2l0Y2ggKHByb3BlcnR5X2lkKSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAiY2FzZSBQUk9QXyIgPDwgY2xhc3NfbmFtZV91YyA8PCAiX0hBTkRMRVI6IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJpZiAoc2VsZi0+aGFuZGxlciAhPSBOVUxMKSIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAiZ19vYmplY3RfdW5yZWYgKHNlbGYtPmhhbmRsZXIpOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJzZWxmLT5oYW5kbGVyID0gZ192YWx1ZV9nZXRfb2JqZWN0ICh2YWx1ZSk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImdfb2JqZWN0X3JlZiAoc2VsZi0+aGFuZGxlcik7IiA8PCBlbmRsOwotICBpZiAoZXh0ZW5kc19zZXJ2aWNlKSB7Ci0gICAgLy8gQ2hhaW4gdXAgdG8gc2V0IHRoZSBoYW5kbGVyIGluIGV2ZXJ5IHN1cGVyY2xhc3MgYXMgd2VsbAotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJHX09CSkVDVF9DTEFTUyAoIiA8PCBjbGFzc19uYW1lX2xjIDw8ICJfcGFyZW50X2NsYXNzKS0+IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJzZXRfcHJvcGVydHkgKG9iamVjdCwgcHJvcGVydHlfaWQsIHZhbHVlLCBwc3BlYyk7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwKLSAgICAiR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BlcnR5X2lkLCBwc3BlYyk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIHByb2Nlc3NvcidzIHByb3BlcnR5IGdldHRlcgotICBmdW5jdGlvbl9uYW1lID0gY2xhc3NfbmFtZV9sYyArICJfZ2V0X3Byb3BlcnR5IjsKLSAgYXJnc19pbmRlbnQgPSBzdHJpbmcoZnVuY3Rpb25fbmFtZS5sZW5ndGgoKSArIDIsICcgJyk7Ci0gIGZfc2VydmljZV8gPDwKLSAgICAic3RhdGljIHZvaWQiIDw8IGVuZGwgPDwKLSAgICBmdW5jdGlvbl9uYW1lIDw8ICIgKEdPYmplY3QgKm9iamVjdCwiIDw8IGVuZGwgPDwKLSAgICBhcmdzX2luZGVudCA8PCAiZ3VpbnQgcHJvcGVydHlfaWQsIiA8PCBlbmRsIDw8Ci0gICAgYXJnc19pbmRlbnQgPDwgIkdWYWx1ZSAqdmFsdWUsIiA8PCBlbmRsIDw8Ci0gICAgYXJnc19pbmRlbnQgPDwgIkdQYXJhbVNwZWMgKnBzcGVjKSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCBjbGFzc19uYW1lIDw8ICIgKnNlbGYgPSAiIDw8Ci0gICAgY2xhc3NfbmFtZV91YyA8PCAiIChvYmplY3QpOyIgPDwgZW5kbCA8PAotICAgIGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAic3dpdGNoIChwcm9wZXJ0eV9pZCkiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgImNhc2UgUFJPUF8iIDw8IGNsYXNzX25hbWVfdWMgPDwgIl9IQU5ETEVSOiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAiZ192YWx1ZV9zZXRfb2JqZWN0ICh2YWx1ZSwgc2VsZi0+aGFuZGxlcik7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PAotICAgICJHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcGVydHlfaWQsIHBzcGVjKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgLy8gR2VuZXJhdG9yIHRoZSBwcm9jZXNzb3IncyBkaXNwb3NlIGZ1bmN0aW9uCi0gIGZfc2VydmljZV8gPDwKLSAgICAic3RhdGljIHZvaWQiIDw8IGVuZGwgPDwKLSAgICBjbGFzc19uYW1lX2xjIDw8ICJfZGlzcG9zZSAoR09iamVjdCAqZ29iamVjdCkiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgY2xhc3NfbmFtZSA8PCAiICpzZWxmID0gIiA8PCBjbGFzc19uYW1lX3VjIDw8ICIgKGdvYmplY3QpOyIgPDwgZW5kbCA8PAotICAgIGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiaWYgKHNlbGYtPmhhbmRsZXIgIT0gTlVMTCkiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgImdfb2JqZWN0X3VucmVmIChzZWxmLT5oYW5kbGVyKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAic2VsZi0+aGFuZGxlciA9IE5VTEw7IiA8PCBlbmRsOwotICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICBmX3NlcnZpY2VfIDw8Ci0gICAgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJHX09CSkVDVF9DTEFTUyAoIiA8PCBjbGFzc19uYW1lX2xjIDw8ICJfcGFyZW50X2NsYXNzKSIKLSAgICAiLT5kaXNwb3NlIChnb2JqZWN0KTsiIDw8IGVuZGw7Ci0gIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSBwcm9jZXNzb3IgZmluYWxpemUgZnVuY3Rpb24KLSAgZl9zZXJ2aWNlXyA8PAotICAgICJzdGF0aWMgdm9pZCIgPDwgZW5kbCA8PAotICAgIGNsYXNzX25hbWVfbGMgPDwgIl9maW5hbGl6ZSAoR09iamVjdCAqZ29iamVjdCkiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIlByb2Nlc3NvciAqc2VsZiA9ICIgPDwKLSAgICB0aGlzLT5uc3BhY2VfdWMgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfUFJPQ0VTU09SIChnb2JqZWN0KTsiIDw8IGVuZGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImdfaGFzaF90YWJsZV9kZXN0cm95IChzZWxmLT5wcm9jZXNzX21hcCk7IiA8PCBlbmRsIDw8Ci0gICAgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJHX09CSkVDVF9DTEFTUyAoIiA8PCBjbGFzc19uYW1lX2xjIDw8ICJfcGFyZW50X2NsYXNzKSIKLSAgICAiLT5maW5hbGl6ZSAoZ29iamVjdCk7IiA8PCBlbmRsOwotICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgcHJvY2Vzc29yIGluc3RhbmNlIGluaXRpYWxpemVyCi0gIGZfc2VydmljZV8gPDwKLSAgICAic3RhdGljIHZvaWQiIDw8IGVuZGwgPDwKLSAgICBjbGFzc19uYW1lX2xjIDw8ICJfaW5pdCAoIiA8PCBjbGFzc19uYW1lIDw8ICIgKnNlbGYpIiA8PCBlbmRsOwotICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJzZWxmLT5oYW5kbGVyID0gTlVMTDsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAic2VsZi0+cHJvY2Vzc19tYXAgPSAiCi0gICAgImdfaGFzaF90YWJsZV9uZXcgKGdfc3RyX2hhc2gsIGdfc3RyX2VxdWFsKTsiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotICBhcmdzX2luZGVudCA9IHN0cmluZygyMSwgJyAnKTsKLSAgZm9yIChmdW5jdGlvbl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7Ci0gICAgICAgZnVuY3Rpb25faXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7Ci0gICAgICAgKytmdW5jdGlvbl9pdGVyKSB7Ci0gICAgc3RyaW5nIHNlcnZpY2VfZnVuY3Rpb25fbmFtZSA9ICgqZnVuY3Rpb25faXRlciktPmdldF9uYW1lKCk7Ci0gICAgc3RyaW5nIHByb2Nlc3NfZnVuY3Rpb25fbmFtZSA9Ci0gICAgICBjbGFzc19uYW1lX2xjICsKLSAgICAgICJfcHJvY2Vzc18iICsKLSAgICAgIGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhzZXJ2aWNlX2Z1bmN0aW9uX25hbWUpOwotCi0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgImdfaGFzaF90YWJsZV9pbnNlcnQgKHNlbGYtPnByb2Nlc3NfbWFwLCIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgKyBhcmdzX2luZGVudCArICJcIiIgPDwgc2VydmljZV9mdW5jdGlvbl9uYW1lIDw8ICJcIiwgIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSArIGFyZ3NfaW5kZW50ICsgcHJvY2Vzc19mdW5jdGlvbl9uYW1lIDw8ICIpOyIgPDwgZW5kbDsKLSAgfQotICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICBmX3NlcnZpY2VfIDw8Ci0gICAgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSBwcm9jZXNzb3IgY2xhc3MgaW5pdGlhbGl6ZXIKLSAgZl9zZXJ2aWNlXyA8PAotICAgICJzdGF0aWMgdm9pZCIgPDwgZW5kbCA8PAotICAgIGNsYXNzX25hbWVfbGMgPDwgIl9jbGFzc19pbml0ICgiIDw8IGNsYXNzX25hbWUgPDwgIkNsYXNzICpjbHMpIiA8PCBlbmRsOwotICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoY2xzKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiVGhyaWZ0RGlzcGF0Y2hQcm9jZXNzb3JDbGFzcyAqZGlzcGF0Y2hfcHJvY2Vzc29yX2NsYXNzID0iIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgIlRIUklGVF9ESVNQQVRDSF9QUk9DRVNTT1JfQ0xBU1MgKGNscyk7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgIkdQYXJhbVNwZWMgKnBhcmFtX3NwZWM7IiA8PCBlbmRsIDw8Ci0gICAgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJnb2JqZWN0X2NsYXNzLT5kaXNwb3NlID0gIiA8PAotICAgIGNsYXNzX25hbWVfbGMgPDwgIl9kaXNwb3NlOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9ICIgPDwKLSAgICBjbGFzc19uYW1lX2xjIDw8ICJfZmluYWxpemU7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9ICIgPDwKLSAgICBjbGFzc19uYW1lX2xjIDw8ICJfc2V0X3Byb3BlcnR5OyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSAiIDw8Ci0gICAgY2xhc3NfbmFtZV9sYyA8PCAiX2dldF9wcm9wZXJ0eTsiIDw8IGVuZGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImRpc3BhdGNoX3Byb2Nlc3Nvcl9jbGFzcy0+ZGlzcGF0Y2hfY2FsbCA9ICIgPDwKLSAgICBjbGFzc19uYW1lX2xjIDw8ICJfZGlzcGF0Y2hfY2FsbDsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiY2xzLT5kaXNwYXRjaF9jYWxsID0gIiA8PAotICAgIGNsYXNzX25hbWVfbGMgPDwgIl9kaXNwYXRjaF9jYWxsOyIgPDwgZW5kbCA8PAotICAgIGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAicGFyYW1fc3BlYyA9IGdfcGFyYW1fc3BlY19vYmplY3QgKFwiaGFuZGxlclwiLCIgPDwgZW5kbDsKLSAgYXJnc19pbmRlbnQgPSBpbmRlbnQoKSArIHN0cmluZygzNCwgJyAnKTsKLSAgZl9zZXJ2aWNlXyA8PAotICAgIGFyZ3NfaW5kZW50IDw8ICJcIlNlcnZpY2UgaGFuZGxlciBpbXBsZW1lbnRhdGlvblwiLCIgPDwgZW5kbCA8PAotICAgIGFyZ3NfaW5kZW50IDw8ICJcIlRoZSBzZXJ2aWNlIGhhbmRsZXIgaW1wbGVtZW50YXRpb24gXCIiIDw8IGVuZGwgPDwKLSAgICBhcmdzX2luZGVudCA8PCAiXCJ0byB3aGljaCBtZXRob2QgY2FsbHMgYXJlIGRpc3BhdGNoZWQuXCIsIiA8PCBlbmRsIDw8Ci0gICAgYXJnc19pbmRlbnQgPDwgdGhpcy0+bnNwYWNlX3VjICsgIlRZUEVfIiArIHNlcnZpY2VfbmFtZV91YyArICJfSEFORExFUiwiIDw8IGVuZGwgPDwKLSAgICBhcmdzX2luZGVudCA8PCAiR19QQVJBTV9SRUFEV1JJVEUpOyIgPDwgZW5kbDsKLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCIgPDwgZW5kbDsKLSAgYXJnc19pbmRlbnQgPSBpbmRlbnQoKSArIHN0cmluZyAoMzMsICcgJyk7Ci0gIGZfc2VydmljZV8gPDwKLSAgICBhcmdzX2luZGVudCA8PCAiUFJPUF8iIDw8IGNsYXNzX25hbWVfdWMgPDwgIl9IQU5ETEVSLCIgPDwgZW5kbCA8PAotICAgIGFyZ3NfaW5kZW50IDw8ICJwYXJhbV9zcGVjKTsiIDw8IGVuZGw7Ci0gIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIEMgY29kZSB0aGF0IHJlcHJlc2VudHMgYSBUaHJpZnQgc2VydmljZSBzZXJ2ZXIuCi0gKi8KLXZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlciAodF9zZXJ2aWNlICp0c2VydmljZSkgewotICAodm9pZCkgdHNlcnZpY2U7Ci0gIC8vIEdlbmVyYXRlIHRoZSBzZXJ2aWNlJ3MgaGFuZGxlciBjbGFzcwotICBnZW5lcmF0ZV9zZXJ2aWNlX2hhbmRsZXIgKHRzZXJ2aWNlKTsKLQotICAvLyBHZW5lcmF0ZSB0aGUgc2VydmljZSdzIHByb2Nlc3NvciBjbGFzcwotICBnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3NvciAodHNlcnZpY2UpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBDIGNvZGUgdG8gcmVwcmVzZW50IGEgVEhyaWZ0IHN0cnVjdHVyZSBhcyBhIEdPYmplY3QuCi0gKi8KLXZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9vYmplY3QodF9zdHJ1Y3QgKnRzdHJ1Y3QpIHsKLSAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOwotICBzdHJpbmcgbmFtZV91ID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKG5hbWUpOwotICBzdHJpbmcgbmFtZV91YyA9IHRvX3VwcGVyX2Nhc2UobmFtZV91KTsKLQotICBzdHJpbmcgY2xhc3NfbmFtZSA9IHRoaXMtPm5zcGFjZSArIG5hbWU7Ci0gIHN0cmluZyBjbGFzc19uYW1lX2xjID0gdG9fbG93ZXJfY2FzZShpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoY2xhc3NfbmFtZSkpOwotICBzdHJpbmcgY2xhc3NfbmFtZV91YyA9IHRvX3VwcGVyX2Nhc2UoY2xhc3NfbmFtZV9sYyk7Ci0KLSAgc3RyaW5nIGZ1bmN0aW9uX25hbWU7Ci0gIHN0cmluZyBhcmdzX2luZGVudDsKLQotICAvLyB3cml0ZSB0aGUgaW5zdGFuY2UgZGVmaW5pdGlvbgotICBmX3R5cGVzXyA8PAotICAgICJzdHJ1Y3QgXyIgPDwgdGhpcy0+bnNwYWNlIDw8IG5hbWUgPDwgZW5kbCA8PAotICAgICJ7ICIgPDwgZW5kbCA8PAotICAgICIgIFRocmlmdFN0cnVjdCBwYXJlbnQ7ICIgPDwgZW5kbCA8PAotICAgIGVuZGwgPDwKLSAgICAiICAvKiBwdWJsaWMgKi8iIDw8IGVuZGw7Ci0KLSAgLy8gZm9yIGVhY2ggZmllbGQsIGFkZCBhIG1lbWJlciB2YXJpYWJsZQotICB2ZWN0b3I8dF9maWVsZCAqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCAqPiAmbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICB0X3R5cGUgKnQgPSBnZXRfdHJ1ZV90eXBlICgoKm1faXRlciktPmdldF90eXBlKCkpOwotICAgIGZfdHlwZXNfIDw8Ci0gICAgICAiICAiIDw8IHR5cGVfbmFtZSAodCkgPDwgIiAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKLSAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgewotICAgICAgZl90eXBlc18gPDwKLSAgICAgICAgIiAgZ2Jvb2xlYW4gX19pc3NldF8iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICAvLyBjbG9zZSB0aGUgc3RydWN0dXJlIGRlZmluaXRpb24gYW5kIGNyZWF0ZSBhIHR5cGVkZWYKLSAgZl90eXBlc18gPDwKLSAgICAifTsiIDw8IGVuZGwgPDwKLSAgICAidHlwZWRlZiBzdHJ1Y3QgXyIgPDwgdGhpcy0+bnNwYWNlIDw8IG5hbWUgPDwgIiAiIDw8IAotICAgICAgICB0aGlzLT5uc3BhY2UgPDwgbmFtZSA8PCAiOyIgPDwgZW5kbCA8PAotICAgICAgZW5kbDsKLQotICAvLyB3cml0ZSB0aGUgY2xhc3MgZGVmaW5pdGlvbgotICBmX3R5cGVzXyA8PAotICAgICJzdHJ1Y3QgXyIgPDwgdGhpcy0+bnNwYWNlIDw8IG5hbWUgPDwgIkNsYXNzIiA8PCBlbmRsIDw8Ci0gICAgInsiIDw8IGVuZGwgPDwKLSAgICAiICBUaHJpZnRTdHJ1Y3RDbGFzcyBwYXJlbnQ7IiA8PCBlbmRsIDw8Ci0gICAgIn07IiA8PCBlbmRsIDw8Ci0gICAgInR5cGVkZWYgc3RydWN0IF8iIDw8IHRoaXMtPm5zcGFjZSA8PCBuYW1lIDw8ICJDbGFzcyAiIDw8IHRoaXMtPm5zcGFjZSA8PCBuYW1lIDw8ICJDbGFzczsiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIC8vIHdyaXRlIHRoZSBzdGFuZGFyZCBHT2JqZWN0IGJvaWxlcnBsYXRlCi0gIGZfdHlwZXNfIDw8Ci0gICAgIkdUeXBlICIgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IG5hbWVfdSA8PCAiX2dldF90eXBlICh2b2lkKTsiIDw8IGVuZGwgPDwKLSAgICAiI2RlZmluZSAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iIDw8IG5hbWVfdWMgPDwgIiAoIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgbmFtZV91IDw8ICJfZ2V0X3R5cGUoKSkiIDw8IGVuZGwgPDwKLSAgICAiI2RlZmluZSAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBuYW1lX3VjIDw8ICIob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iIDw8IG5hbWVfdWMgPDwgIiwgIiA8PCB0aGlzLT5uc3BhY2UgPDwgbmFtZSA8PCAiKSkiIDw8IGVuZGwgPDwKLSAgICAiI2RlZmluZSAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBuYW1lX3VjIDw8ICJfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJfVFlQRV8iIDw8IG5hbWVfdWMgPDwgIiwgIiA8PCB0aGlzLT5uc3BhY2UgPDwgbmFtZSA8PCAiQ2xhc3MpKSIgPDwgZW5kbCA8PAotICAgICIjZGVmaW5lICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJJU18iIDw8IG5hbWVfdWMgPDwgIihvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIgPDwgbmFtZV91YyA8PCAiKSkiIDw8IGVuZGwgPDwKLSAgICAiI2RlZmluZSAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiSVNfIiA8PCBuYW1lX3VjIDw8ICJfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIgPDwgbmFtZV91YyA8PCAiKSkiIDw8IGVuZGwgPDwKLSAgICAiI2RlZmluZSAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBuYW1lX3VjIDw8ICJfR0VUX0NMQVNTKG9iaikgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iIDw8IG5hbWVfdWMgPDwgIiwgIiA8PCB0aGlzLT5uc3BhY2UgPDwgbmFtZSA8PCAiQ2xhc3MpKSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgLy8gc3RhcnQgd3JpdGluZyB0aGUgb2JqZWN0IGltcGxlbWVudGF0aW9uIC5jIGZpbGUKLQotICAvLyBnZW5lcmF0ZSBwcm9wZXJ0aWVzIGVudW0KLSAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgewotICAgIGZfdHlwZXNfaW1wbF8gPDwKLSAgICAgICJlbnVtIF8iIDw8IGNsYXNzX25hbWUgPDwgIlByb3BlcnRpZXMiIDw8IGVuZGwgPDwKLSAgICAgICJ7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGZfdHlwZXNfaW1wbF8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJQUk9QXyIgPDwgY2xhc3NfbmFtZV91YyA8PCAiXzAiOwotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIHN0cmluZyBtZW1iZXJfbmFtZV91YyA9Ci0gICAgICAgIHRvX3VwcGVyX2Nhc2UodG9fbG93ZXJfY2FzZQotICAgICAgICAgICAgICAgICAgICAgIChpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSkpOwotCi0gICAgICBmX3R5cGVzX2ltcGxfIDw8ICIsIiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJQUk9QXyIgPDwgY2xhc3NfbmFtZV91YyA8PCAiXyIgPDwgbWVtYmVyX25hbWVfdWM7Ci0gICAgfQotICAgIGZfdHlwZXNfaW1wbF8gPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGZfdHlwZXNfaW1wbF8gPDwKLSAgICAgICJ9OyIgPDwgZW5kbCA8PAotICAgICAgZW5kbDsKLSAgfQotCi0gIC8vIGdlbmVyYXRlIHN0cnVjdCBJL08gbWV0aG9kcwotICBzdHJpbmcgdGhpc19nZXQgPSB0aGlzLT5uc3BhY2UgKyBuYW1lICsgIiAqIHRoaXNfb2JqZWN0ID0gIiAKLSAgICAgICAgICAgICAgICAgICAgKyB0aGlzLT5uc3BhY2VfdWMgKyBuYW1lX3VjICsgIihvYmplY3QpOyI7Ci0gIGdlbmVyYXRlX3N0cnVjdF9yZWFkZXIgKGZfdHlwZXNfaW1wbF8sIHRzdHJ1Y3QsICJ0aGlzX29iamVjdC0+IiwgdGhpc19nZXQpOwotICBnZW5lcmF0ZV9zdHJ1Y3Rfd3JpdGVyIChmX3R5cGVzX2ltcGxfLCB0c3RydWN0LCAidGhpc19vYmplY3QtPiIsIHRoaXNfZ2V0KTsKLQotICAvLyBnZW5lcmF0ZSBwcm9wZXJ0eSBzZXR0ZXIgYW5kIGdldHRlcgotICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7Ci0gICAgLy8gZ2VuZXJhdGUgcHJvcGVydHkgc2V0dGVyCi0gICAgZnVuY3Rpb25fbmFtZSA9IGNsYXNzX25hbWVfbGMgKyAiX3NldF9wcm9wZXJ0eSI7Ci0gICAgYXJnc19pbmRlbnQgPSBzdHJpbmcoZnVuY3Rpb25fbmFtZS5sZW5ndGgoKSArIDIsICcgJyk7Ci0gICAgZl90eXBlc19pbXBsXyA8PAotICAgICAgInN0YXRpYyB2b2lkIiA8PCBlbmRsIDw8Ci0gICAgICBmdW5jdGlvbl9uYW1lIDw8ICIgKEdPYmplY3QgKm9iamVjdCwiIDw8IGVuZGwgPDwKLSAgICAgIGFyZ3NfaW5kZW50IDw8ICJndWludCBwcm9wZXJ0eV9pZCwiIDw8IGVuZGwgPDwKLSAgICAgIGFyZ3NfaW5kZW50IDw8ICJjb25zdCBHVmFsdWUgKnZhbHVlLCIgPDwgZW5kbCA8PAotICAgICAgYXJnc19pbmRlbnQgPDwgIkdQYXJhbVNwZWMgKnBzcGVjKSIgPDwgZW5kbDsKLSAgICBzY29wZV91cChmX3R5cGVzX2ltcGxfKTsKLSAgICBmX3R5cGVzX2ltcGxfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCBjbGFzc19uYW1lIDw8ICIgKnNlbGYgPSAiIDw8Ci0gICAgICBjbGFzc19uYW1lX3VjIDw8ICIgKG9iamVjdCk7IiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAic3dpdGNoIChwcm9wZXJ0eV9pZCkiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAoZl90eXBlc19pbXBsXyk7Ci0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgdF9maWVsZCAqbWVtYmVyID0gKCptX2l0ZXIpOwotICAgICAgc3RyaW5nIG1lbWJlcl9uYW1lID0gbWVtYmVyLT5nZXRfbmFtZSgpOwotICAgICAgc3RyaW5nIG1lbWJlcl9uYW1lX3VjID0KLSAgICAgICAgdG9fdXBwZXJfY2FzZSh0b19sb3dlcl9jYXNlKGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhtZW1iZXJfbmFtZSkpKTsKLSAgICAgIHRfdHlwZSAqbWVtYmVyX3R5cGUgPSBnZXRfdHJ1ZV90eXBlKG1lbWJlci0+Z2V0X3R5cGUoKSk7Ci0KLSAgICAgIHN0cmluZyBwcm9wZXJ0eV9pZGVudGlmaWVyID0KLSAgICAgICAgIlBST1BfIiArIGNsYXNzX25hbWVfdWMgKyAiXyIgKyBtZW1iZXJfbmFtZV91YzsKLQotICAgICAgZl90eXBlc19pbXBsXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiY2FzZSAiIDw8IHByb3BlcnR5X2lkZW50aWZpZXIgKyAiOiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotCi0gICAgICBpZiAobWVtYmVyX3R5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICAgIHRfYmFzZV90eXBlICpiYXNlX3R5cGUgPSAoKHRfYmFzZV90eXBlICopIG1lbWJlcl90eXBlKTsKLSAgICAgICAgc3RyaW5nIGFzc2lnbl9mdW5jdGlvbl9uYW1lOwotCi0gICAgICAgIGlmIChiYXNlX3R5cGUtPmdldF9iYXNlKCkgPT0gdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HKSB7Ci0gICAgICAgICAgc3RyaW5nIHJlbGVhc2VfZnVuY3Rpb25fbmFtZTsKLQotICAgICAgICAgIGZfdHlwZXNfaW1wbF8gPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAoc2VsZi0+IiA8PCBtZW1iZXJfbmFtZSA8PCAiICE9IE5VTEwpIiA8PCBlbmRsOwotICAgICAgICAgIGluZGVudF91cCgpOwotCi0gICAgICAgICAgaWYgKGJhc2VfdHlwZS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgICAgICAgIHJlbGVhc2VfZnVuY3Rpb25fbmFtZSA9ICJnX2J5dGVfYXJyYXlfdW5yZWYiOwotICAgICAgICAgICAgYXNzaWduX2Z1bmN0aW9uX25hbWUgPSAiZ192YWx1ZV9kdXBfYm94ZWQiOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZWxlYXNlX2Z1bmN0aW9uX25hbWUgPSAiZ19mcmVlIjsKLSAgICAgICAgICAgIGFzc2lnbl9mdW5jdGlvbl9uYW1lID0gImdfdmFsdWVfZHVwX3N0cmluZyI7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgZl90eXBlc19pbXBsXyA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgcmVsZWFzZV9mdW5jdGlvbl9uYW1lIDw8Ci0gICAgICAgICAgICAiIChzZWxmLT4iIDw8IG1lbWJlcl9uYW1lIDw8ICIpOyIgPDwgZW5kbDsKLSAgICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHN3aXRjaCAoYmFzZV90eXBlLT5nZXRfYmFzZSgpKSB7Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICAgICAgYXNzaWduX2Z1bmN0aW9uX25hbWUgPSAiZ192YWx1ZV9nZXRfYm9vbGVhbiI7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgICAgIGFzc2lnbl9mdW5jdGlvbl9uYW1lID0gImdfdmFsdWVfZ2V0X2ludCI7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICAgICAgYXNzaWduX2Z1bmN0aW9uX25hbWUgPSAiZ192YWx1ZV9nZXRfaW50NjQiOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRSA6Ci0gICAgICAgICAgICBhc3NpZ25fZnVuY3Rpb25fbmFtZSA9ICJnX3ZhbHVlX2dldF9kb3VibGUiOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiAiCi0gICAgICAgICAgICAgICJ1bnJlY29nbml6ZWQgYmFzZSB0eXBlIFwiIiArIGJhc2VfdHlwZS0+Z2V0X25hbWUoKSArICJcIiAiCi0gICAgICAgICAgICAgICJmb3Igc3RydWN0IG1lbWJlciBcIiIgKyBtZW1iZXJfbmFtZSArICJcIiI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmX3R5cGVzX2ltcGxfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgInNlbGYtPiIgPDwgbWVtYmVyX25hbWUgPDwKLSAgICAgICAgICAiID0gIiA8PCBhc3NpZ25fZnVuY3Rpb25fbmFtZSA8PCAiICh2YWx1ZSk7IiA8PCBlbmRsOwotICAgICAgfSBlbHNlIGlmIChtZW1iZXJfdHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICAgIGZfdHlwZXNfaW1wbF8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAic2VsZi0+IiA8PCBtZW1iZXJfbmFtZSA8PAotICAgICAgICAgICIgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgaWYgKG1lbWJlcl90eXBlLT5pc19jb250YWluZXIoKSkgewotICAgICAgICBzdHJpbmcgcmVsZWFzZV9mdW5jdGlvbl9uYW1lOwotICAgICAgICBzdHJpbmcgYXNzaWduX2Z1bmN0aW9uX25hbWU7Ci0KLSAgICAgICAgaWYgKG1lbWJlcl90eXBlLT5pc19saXN0KCkpIHsKLSAgICAgICAgICB0X3R5cGUgKmVsZW1fdHlwZSA9ICgodF9saXN0ICopIG1lbWJlcl90eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotCi0gICAgICAgICAgLy8gTGlzdHMgb2YgYmFzZSB0eXBlcyBvdGhlciB0aGFuIHN0cmluZ3MgYXJlIHJlcHJlc2VudGVkIGFzIEdBcnJheXM7Ci0gICAgICAgICAgLy8gYWxsIG90aGVycyBhcyBHUHRyQXJyYXlzCi0gICAgICAgICAgaWYgKGVsZW1fdHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgIWVsZW1fdHlwZS0+aXNfc3RyaW5nKCkpIHsKLSAgICAgICAgICAgIHJlbGVhc2VfZnVuY3Rpb25fbmFtZSA9ICJnX2FycmF5X3VucmVmIjsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVsZWFzZV9mdW5jdGlvbl9uYW1lID0gImdfcHRyX2FycmF5X3VucmVmIjsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBhc3NpZ25fZnVuY3Rpb25fbmFtZSA9ICJnX3ZhbHVlX2R1cF9ib3hlZCI7Ci0gICAgICAgIH0gZWxzZSBpZiAobWVtYmVyX3R5cGUtPmlzX3NldCgpIHx8IG1lbWJlcl90eXBlLT5pc19tYXAoKSkgewotICAgICAgICAgIHJlbGVhc2VfZnVuY3Rpb25fbmFtZSA9ICJnX2hhc2hfdGFibGVfdW5yZWYiOwotICAgICAgICAgIGFzc2lnbl9mdW5jdGlvbl9uYW1lID0gImdfdmFsdWVfZHVwX2JveGVkIjsKLSAgICAgICAgfQotCi0gICAgICAgIGZfdHlwZXNfaW1wbF8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKHNlbGYtPiIgPDwgbWVtYmVyX25hbWUgPDwgIiAhPSBOVUxMKSIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgIGZfdHlwZXNfaW1wbF8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCByZWxlYXNlX2Z1bmN0aW9uX25hbWUgPDwgIiAoc2VsZi0+IiA8PCBtZW1iZXJfbmFtZSA8PAotICAgICAgICAgICIpOyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgICAgZl90eXBlc19pbXBsXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJzZWxmLT4iIDw8IG1lbWJlcl9uYW1lIDw8ICIgPSAiIDw8Ci0gICAgICAgICAgYXNzaWduX2Z1bmN0aW9uX25hbWUgPDwgIiAodmFsdWUpOyIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSBpZiAobWVtYmVyX3R5cGUtPmlzX3N0cnVjdCgpIHx8IG1lbWJlcl90eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgICAgIGZfdHlwZXNfaW1wbF8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKHNlbGYtPiIgPDwgbWVtYmVyX25hbWUgPDwgIiAhPSBOVUxMKSIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgIGZfdHlwZXNfaW1wbF8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiZ19vYmplY3RfdW5yZWYgKHNlbGYtPiIgPDwgbWVtYmVyX25hbWUgPDwKLSAgICAgICAgICAiKTsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICAgIGZfdHlwZXNfaW1wbF8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAic2VsZi0+IiA8PCBtZW1iZXJfbmFtZSA8PAotICAgICAgICAgICIgPSBnX3ZhbHVlX2R1cF9vYmplY3QgKHZhbHVlKTsiIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChtZW1iZXItPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7Ci0gICAgICAgIGZfdHlwZXNfaW1wbF8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAic2VsZi0+X19pc3NldF8iIDw8IG1lbWJlcl9uYW1lIDw8ICIgPSBUUlVFOyIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgZl90eXBlc19pbXBsXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgIH0KLSAgICBmX3R5cGVzX2ltcGxfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZl90eXBlc19pbXBsXyA8PAotICAgICAgaW5kZW50KCkgPDwKLSAgICAgICJHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcGVydHlfaWQsIHBzcGVjKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBzY29wZV9kb3duKGZfdHlwZXNfaW1wbF8pOwotICAgIHNjb3BlX2Rvd24oZl90eXBlc19pbXBsXyk7Ci0gICAgZl90eXBlc19pbXBsXyA8PCBlbmRsOwotCi0gICAgLy8gZ2VuZXJhdGUgcHJvcGVydHkgZ2V0dGVyCi0gICAgZnVuY3Rpb25fbmFtZSA9IGNsYXNzX25hbWVfbGMgKyAiX2dldF9wcm9wZXJ0eSI7Ci0gICAgYXJnc19pbmRlbnQgPSBzdHJpbmcoZnVuY3Rpb25fbmFtZS5sZW5ndGgoKSArIDIsICcgJyk7Ci0gICAgZl90eXBlc19pbXBsXyA8PAotICAgICAgInN0YXRpYyB2b2lkIiA8PCBlbmRsIDw8Ci0gICAgICBmdW5jdGlvbl9uYW1lIDw8ICIgKEdPYmplY3QgKm9iamVjdCwiIDw8IGVuZGwgPDwKLSAgICAgIGFyZ3NfaW5kZW50IDw8ICJndWludCBwcm9wZXJ0eV9pZCwiIDw8IGVuZGwgPDwKLSAgICAgIGFyZ3NfaW5kZW50IDw8ICJHVmFsdWUgKnZhbHVlLCIgPDwgZW5kbCA8PAotICAgICAgYXJnc19pbmRlbnQgPDwgIkdQYXJhbVNwZWMgKnBzcGVjKSIgPDwgZW5kbDsKLSAgICBzY29wZV91cChmX3R5cGVzX2ltcGxfKTsKLSAgICBmX3R5cGVzX2ltcGxfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCBjbGFzc19uYW1lIDw8ICIgKnNlbGYgPSAiIDw8Ci0gICAgICBjbGFzc19uYW1lX3VjIDw8ICIgKG9iamVjdCk7IiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAic3dpdGNoIChwcm9wZXJ0eV9pZCkiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAoZl90eXBlc19pbXBsXyk7Ci0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgdF9maWVsZCAqbWVtYmVyID0gKCptX2l0ZXIpOwotICAgICAgc3RyaW5nIG1lbWJlcl9uYW1lID0gKCptX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICAgc3RyaW5nIG1lbWJlcl9uYW1lX3VjID0KLSAgICAgICAgdG9fdXBwZXJfY2FzZSh0b19sb3dlcl9jYXNlKGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhtZW1iZXJfbmFtZSkpKTsKLSAgICAgIHRfdHlwZSAqbWVtYmVyX3R5cGUgPSBnZXRfdHJ1ZV90eXBlKG1lbWJlci0+Z2V0X3R5cGUoKSk7Ci0KLSAgICAgIHN0cmluZyBwcm9wZXJ0eV9pZGVudGlmaWVyID0KLSAgICAgICAgIlBST1BfIiArIGNsYXNzX25hbWVfdWMgKyAiXyIgKyBtZW1iZXJfbmFtZV91YzsKLQotICAgICAgc3RyaW5nIHNldHRlcl9mdW5jdGlvbl9uYW1lOwotCi0gICAgICBpZiAobWVtYmVyX3R5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICAgIHRfYmFzZV90eXBlICpiYXNlX3R5cGUgPSAoKHRfYmFzZV90eXBlICopIG1lbWJlcl90eXBlKTsKLQotICAgICAgICBzd2l0Y2ggKGJhc2VfdHlwZS0+Z2V0X2Jhc2UoKSkgewotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgICAgc2V0dGVyX2Z1bmN0aW9uX25hbWUgPSAiZ192YWx1ZV9zZXRfYm9vbGVhbiI7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgICAgc2V0dGVyX2Z1bmN0aW9uX25hbWUgPSAiZ192YWx1ZV9zZXRfaW50IjsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgICBzZXR0ZXJfZnVuY3Rpb25fbmFtZSA9ICJnX3ZhbHVlX3NldF9pbnQ2NCI7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEUgOgotICAgICAgICAgIHNldHRlcl9mdW5jdGlvbl9uYW1lID0gImdfdmFsdWVfc2V0X2RvdWJsZSI7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgICAgaWYgKGJhc2VfdHlwZS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgICAgICAgIHNldHRlcl9mdW5jdGlvbl9uYW1lID0gImdfdmFsdWVfc2V0X2JveGVkIjsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2V0dGVyX2Z1bmN0aW9uX25hbWUgPSAiZ192YWx1ZV9zZXRfc3RyaW5nIjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6ICIKLSAgICAgICAgICAgICJ1bnJlY29nbml6ZWQgYmFzZSB0eXBlIFwiIiArIGJhc2VfdHlwZS0+Z2V0X25hbWUoKSArICJcIiAiCi0gICAgICAgICAgICAiZm9yIHN0cnVjdCBtZW1iZXIgXCIiICsgbWVtYmVyX25hbWUgKyAiXCIiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYgKG1lbWJlcl90eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgICAgc2V0dGVyX2Z1bmN0aW9uX25hbWUgPSAiZ192YWx1ZV9zZXRfaW50IjsKLSAgICAgIH0gZWxzZSBpZiAobWVtYmVyX3R5cGUtPmlzX3N0cnVjdCgpIHx8IG1lbWJlcl90eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgICAgIHNldHRlcl9mdW5jdGlvbl9uYW1lID0gImdfdmFsdWVfc2V0X29iamVjdCI7Ci0gICAgICB9IGVsc2UgaWYgKG1lbWJlcl90eXBlLT5pc19jb250YWluZXIoKSkgewotICAgICAgICBzZXR0ZXJfZnVuY3Rpb25fbmFtZSA9ICJnX3ZhbHVlX3NldF9ib3hlZCI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6ICIKLSAgICAgICAgICAidW5yZWNvZ25pemVkIHR5cGUgZm9yIHN0cnVjdCBtZW1iZXIgXCIiICsgbWVtYmVyX25hbWUgKyAiXCIiOwotICAgICAgfQotCi0gICAgICBmX3R5cGVzX2ltcGxfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJjYXNlICIgPDwgcHJvcGVydHlfaWRlbnRpZmllciArICI6IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBmX3R5cGVzX2ltcGxfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8IHNldHRlcl9mdW5jdGlvbl9uYW1lIDw8ICIgKHZhbHVlLCBzZWxmLT4iIDw8Ci0gICAgICAgIG1lbWJlcl9uYW1lIDw8ICIpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgIH0KLSAgICBmX3R5cGVzX2ltcGxfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZl90eXBlc19pbXBsXyA8PAotICAgICAgaW5kZW50KCkgPDwKLSAgICAgICJHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcGVydHlfaWQsIHBzcGVjKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBzY29wZV9kb3duKGZfdHlwZXNfaW1wbF8pOwotICAgIHNjb3BlX2Rvd24oZl90eXBlc19pbXBsXyk7Ci0gICAgZl90eXBlc19pbXBsXyA8PCBlbmRsOwotICB9Ci0KLSAgLy8gZ2VuZXJhdGUgdGhlIGluc3RhbmNlIGluaXQgZnVuY3Rpb24KLQotICBmX3R5cGVzX2ltcGxfIDw8Ci0gICAgInN0YXRpYyB2b2lkICIgPDwgZW5kbCA8PAotICAgIHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX3UgPDwgIl9pbnN0YW5jZV9pbml0ICgiIDw8IHRoaXMtPm5zcGFjZSA8PCBuYW1lIDw8ICIgKiBvYmplY3QpIiA8PCBlbmRsIDw8Ci0gICAgInsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIC8vIGdlbmVyYXRlIGRlZmF1bHQtdmFsdWUgc3RydWN0dXJlcyBmb3IgY29udGFpbmVyLXR5cGUgbWVtYmVycwotICBib29sIGNvbnN0YW50X2RlY2xhcmF0aW9uX291dHB1dCA9IGZhbHNlOwotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgdF9maWVsZCAqbWVtYmVyID0gKm1faXRlcjsKLSAgICB0X2NvbnN0X3ZhbHVlICptZW1iZXJfdmFsdWUgPSBtZW1iZXItPmdldF92YWx1ZSgpOwotCi0gICAgaWYgKG1lbWJlcl92YWx1ZSAhPSBOVUxMKSB7Ci0gICAgICBzdHJpbmcgbWVtYmVyX25hbWUgPSBtZW1iZXItPmdldF9uYW1lKCk7Ci0gICAgICB0X3R5cGUqIG1lbWJlcl90eXBlID0gZ2V0X3RydWVfdHlwZSAobWVtYmVyLT5nZXRfdHlwZSgpKTsKLQotICAgICAgaWYgKG1lbWJlcl90eXBlLT5pc19saXN0KCkpIHsKLSAgICAgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUgKj4gJmxpc3QgPSBtZW1iZXJfdmFsdWUtPmdldF9saXN0KCk7Ci0gICAgICAgIHRfdHlwZSAqZWxlbV90eXBlID0gKCh0X2xpc3QgKikgbWVtYmVyX3R5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0KLSAgICAgICAgLy8gR2VuZXJhdGUgYW4gYXJyYXkgd2l0aCB0aGUgbGlzdCBsaXRlcmFsCi0gICAgICAgIGluZGVudChmX3R5cGVzX2ltcGxfKSA8PAotICAgICAgICAgICJzdGF0aWMgIiA8PCB0eXBlX25hbWUoZWxlbV90eXBlLCBmYWxzZSwgdHJ1ZSkgPDwKLSAgICAgICAgICAiIF9fZGVmYXVsdF8iIDw8IG1lbWJlcl9uYW1lIDw8ICJbIiA8PCBsaXN0LnNpemUoKSA8PCAiXSA9ICIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgIGZfdHlwZXNfaW1wbF8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCBjb25zdGFudF9saXRlcmFsIChtZW1iZXJfdHlwZSwgbWVtYmVyX3ZhbHVlKSA8PCAiOyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLQotICAgICAgICBjb25zdGFudF9kZWNsYXJhdGlvbl9vdXRwdXQgPSB0cnVlOwotICAgICAgfQotCi0gICAgICAvLyBUT0RPOiBIYW5kbGUgY29udGFpbmVyIHR5cGVzIG90aGVyIHRoYW4gbGlzdAotICAgIH0KLSAgfQotICBpZiAoY29uc3RhbnRfZGVjbGFyYXRpb25fb3V0cHV0KSB7Ci0gICAgZl90eXBlc19pbXBsXyA8PCBlbmRsOwotICB9Ci0KLSAgLy8gc2F0aXNmeSBjb21waWxlcnMgd2l0aCAtV2FsbCB0dXJuZWQgb24KLSAgaW5kZW50KGZfdHlwZXNfaW1wbF8pIDw8ICIvKiBzYXRpc2Z5IC1XYWxsICovIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiVEhSSUZUX1VOVVNFRF9WQVIgKG9iamVjdCk7IiA8PCBlbmRsOwotCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlICgoKm1faXRlciktPmdldF90eXBlKCkpOwotICAgIGlmICh0LT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgc3RyaW5nIGR2YWwgPSAiID0gIjsKLSAgICAgIGlmICh0LT5pc19lbnVtKCkpIHsKLSAgICAgICAgZHZhbCArPSAiKCIgKyB0eXBlX25hbWUgKHQpICsgIikiOwotICAgICAgfQotICAgICAgdF9jb25zdF92YWx1ZSogY3YgPSAoKm1faXRlciktPmdldF92YWx1ZSgpOwotICAgICAgaWYgKGN2ICE9IE5VTEwpIHsKLSAgICAgICAgZHZhbCArPSBjb25zdGFudF92YWx1ZSAoIiIsIHQsIGN2KTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGR2YWwgKz0gdC0+aXNfc3RyaW5nKCkgPyAiTlVMTCIgOiAiMCI7Ci0gICAgICB9Ci0gICAgICBpbmRlbnQoZl90eXBlc19pbXBsXykgPDwgIm9iamVjdC0+IiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgZHZhbCA8PCAiOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgaWYgKHQtPmlzX3N0cnVjdCgpKSB7Ci0gICAgICBzdHJpbmcgbmFtZSA9ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICAgIHN0cmluZyB0eXBlX25hbWVfdWMgPSB0b191cHBlcl9jYXNlCi0gICAgICAgIChpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoKCptX2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpKSk7Ci0gICAgICBpbmRlbnQoZl90eXBlc19pbXBsXykgPDwgIm9iamVjdC0+IiA8PCBuYW1lIDw8ICIgPSBnX29iamVjdF9uZXcgKCIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIgPDwgdHlwZV9uYW1lX3VjIDw8ICIsIE5VTEwpOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgaWYgKHQtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICAgIHN0cmluZyBuYW1lID0gKCptX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICAgaW5kZW50KGZfdHlwZXNfaW1wbF8pIDw8ICJvYmplY3QtPiIgPDwgbmFtZSA8PCAiID0gTlVMTDsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIGlmICh0LT5pc19jb250YWluZXIoKSkgewotICAgICAgc3RyaW5nIG5hbWUgPSAoKm1faXRlciktPmdldF9uYW1lKCk7Ci0gICAgICBzdHJpbmcgaW5pdF9mdW5jdGlvbjsKLQotICAgICAgaWYgKHQtPmlzX21hcCgpKSB7Ci0gICAgICAgIHRfdHlwZSAqa2V5ID0gKCh0X21hcCAqKSB0KS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgICAgIHRfdHlwZSAqdmFsdWUgPSAoKHRfbWFwICopIHQpLT5nZXRfdmFsX3R5cGUoKTsKLSAgICAgICAgaW5pdF9mdW5jdGlvbiA9IGdlbmVyYXRlX25ld19oYXNoX2Zyb21fdHlwZSAoa2V5LCB2YWx1ZSk7Ci0gICAgICB9IGVsc2UgaWYgKHQtPmlzX3NldCgpKSB7Ci0gICAgICAgIHRfdHlwZSAqZXR5cGUgPSAoKHRfc2V0ICopIHQpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgICAgIGluaXRfZnVuY3Rpb24gPSBnZW5lcmF0ZV9uZXdfaGFzaF9mcm9tX3R5cGUgKGV0eXBlLCBOVUxMKTsKLSAgICAgIH0gZWxzZSBpZiAodC0+aXNfbGlzdCgpKSB7Ci0gICAgICAgIHRfdHlwZSAqZXR5cGUgPSAoKHRfbGlzdCAqKSB0KS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgICAgICBpbml0X2Z1bmN0aW9uID0gZ2VuZXJhdGVfbmV3X2FycmF5X2Zyb21fdHlwZSAoZXR5cGUpOwotICAgICAgfQotCi0gICAgICBpbmRlbnQoZl90eXBlc19pbXBsXykgPDwgIm9iamVjdC0+IiA8PCBuYW1lIDw8ICIgPSAiIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdF9mdW5jdGlvbiA8PCBlbmRsOwotCi0gICAgICAvLyBQcmUtcG9wdWxhdGUgdGhlIGNvbnRhaW5lciB3aXRoIHRoZSBzcGVjaWZpZWQgZGVmYXVsdCB2YWx1ZXMsIGlmIGFueQotICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkpIHsKLSAgICAgICAgdF9jb25zdF92YWx1ZSAqbWVtYmVyX3ZhbHVlID0gKCptX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLQotICAgICAgICBpZiAodC0+aXNfbGlzdCgpKSB7Ci0gICAgICAgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUgKj4gJmxpc3QgPSBtZW1iZXJfdmFsdWUtPmdldF9saXN0KCk7Ci0KLSAgICAgICAgICBpbmRlbnQoZl90eXBlc19pbXBsXykgPDwKLSAgICAgICAgICAgICJnX2FycmF5X2FwcGVuZF92YWxzIChvYmplY3QtPiIgPDwgbmFtZSA8PAotICAgICAgICAgICAgIiwgJl9fZGVmYXVsdF8iIDw8IG5hbWUgPDwKLSAgICAgICAgICAgICIsICIgPDwgbGlzdC5zaXplKCkgPDwgIik7IiA8PCBlbmRsOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVE9ETzogSGFuZGxlIGNvbnRhaW5lciB0eXBlcyBvdGhlciB0aGFuIGxpc3QKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBpZiBub3QgcmVxdWlyZWQsIGluaXRpYWxpemUgdGhlIF9faXNzZXQgdmFyaWFibGUgKi8KLSAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgewotICAgICAgaW5kZW50KGZfdHlwZXNfaW1wbF8pIDw8ICJvYmplY3QtPl9faXNzZXRfIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9IEZBTFNFOyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBmX3R5cGVzX2ltcGxfIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gIGVuZGw7Ci0KLSAgLyogY3JlYXRlIHRoZSBkZXN0cnVjdG9yICovCi0gIGZfdHlwZXNfaW1wbF8gPDwKLSAgICAic3RhdGljIHZvaWQgIiA8PCBlbmRsIDw8Ci0gICAgdGhpcy0+bnNwYWNlX2xjIDw8IG5hbWVfdSA8PCAiX2ZpbmFsaXplIChHT2JqZWN0ICpvYmplY3QpIiA8PCBlbmRsIDw8Ci0gICAgInsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGZfdHlwZXNfaW1wbF8gPDwKLSAgICBpbmRlbnQoKSA8PAotICAgIHRoaXMtPm5zcGFjZSA8PCBuYW1lIDw8ICIgKnRvYmplY3QgPSAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PAotICAgIG5hbWVfdWMgPDwgIiAob2JqZWN0KTsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBmX3R5cGVzX2ltcGxfIDw8Ci0gICAgaW5kZW50KCkgPDwgIi8qIHNhdGlzZnkgLVdhbGwgaW4gY2FzZSB3ZSBkb24ndCB1c2UgdG9iamVjdCAqLyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJUSFJJRlRfVU5VU0VEX1ZBUiAodG9iamVjdCk7IiA8PCBlbmRsOwotCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlICgoKm1faXRlciktPmdldF90eXBlKCkpOwotICAgIGlmICh0LT5pc19jb250YWluZXIoKSkgeyAKLSAgICAgIHN0cmluZyBuYW1lID0gKCptX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICAgaWYgKHQtPmlzX21hcCgpIHx8IHQtPmlzX3NldCgpKSB7Ci0gICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgImlmICh0b2JqZWN0LT4iIDw8IG5hbWUgPDwgIiAhPSBOVUxMKSIgPDwgZW5kbDsKLSAgICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgIGZfdHlwZXNfaW1wbF8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImdfaGFzaF90YWJsZV9kZXN0cm95ICh0b2JqZWN0LT4iIDw8IG5hbWUgPDwgIik7IiA8PCBlbmRsOwotICAgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJ0b2JqZWN0LT4iIDw8IG5hbWUgPDwgIiA9IE5VTEw7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgfSBlbHNlIGlmICh0LT5pc19saXN0KCkpIHsKLSAgICAgICAgdF90eXBlICpldHlwZSA9ICgodF9saXN0ICopIHQpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgICAgIHN0cmluZyBkZXN0cnVjdG9yX2Z1bmN0aW9uID0gImdfcHRyX2FycmF5X3VucmVmIjsKLQotICAgICAgICBpZiAoZXR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUgKikgZXR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3QgZGV0ZXJtaW5lIGFycmF5IHR5cGUiOwotICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjogICAgICAgICAgIAotICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgICAgICAgZGVzdHJ1Y3Rvcl9mdW5jdGlvbiA9ICJnX2FycmF5X3VucmVmIjsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGFycmF5IGluZm8gZm9yIHR5cGUiOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgImlmICh0b2JqZWN0LT4iIDw8IG5hbWUgPDwgIiAhPSBOVUxMKSIgPDwgZW5kbDsKLSAgICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgIGZfdHlwZXNfaW1wbF8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCBkZXN0cnVjdG9yX2Z1bmN0aW9uIDw8ICIgKHRvYmplY3QtPiIgPDwgbmFtZSA8PAotICAgICAgICAgICAgICAgICAgICAgICAiKTsiIDw8IGVuZGw7Ci0gICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgInRvYmplY3QtPiIgPDwgbmFtZSA8PCAiID0gTlVMTDsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh0LT5pc19zdHJ1Y3QoKSB8fCB0LT5pc194Y2VwdGlvbigpKSB7Ci0gICAgICBzdHJpbmcgbmFtZSA9ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICAgIC8vIFRPRE86IGdfY2xlYXJfb2JqZWN0IG5lZWRzIGdsaWIgPj0gMi4yOAotICAgICAgLy8gZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiZ19jbGVhcl9vYmplY3QgKCYodG9iamVjdC0+IiA8PCBuYW1lIDw8ICIpKTsiIDw8IGVuZGw7Ci0gICAgICAvLyBkb2VzIGdfb2JqZWN0X3VucmVmIHRoZSB0cmljaz8KLSAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgImlmICh0b2JqZWN0LT4iIDw8IG5hbWUgPDwgIiAhPSBOVUxMKSIgPDwgZW5kbDsKLSAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGZfdHlwZXNfaW1wbF8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJnX29iamVjdF91bnJlZih0b2JqZWN0LT4iIDw8IG5hbWUgPDwgIik7IiA8PCBlbmRsOwotICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAidG9iamVjdC0+IiA8PCBuYW1lIDw8ICIgPSBOVUxMOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0gZWxzZSBpZiAodC0+aXNfc3RyaW5nKCkpIHsKLSAgICAgIHN0cmluZyBuYW1lID0gKCptX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiaWYgKHRvYmplY3QtPiIgPDwgbmFtZSA8PCAiICE9IE5VTEwpIiA8PCBlbmRsOwotICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgZl90eXBlc19pbXBsXyA8PAotICAgICAgaW5kZW50KCkgPDwgZ2VuZXJhdGVfZnJlZV9mdW5jX2Zyb21fdHlwZSh0KSA8PCAiKHRvYmplY3QtPiIgPDwgbmFtZSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJ0b2JqZWN0LT4iIDw8IG5hbWUgPDwgIiA9IE5VTEw7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl90eXBlc19pbXBsXyA8PAotICAgICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICAvLyBnZW5lcmF0ZSB0aGUgY2xhc3MgaW5pdCBmdW5jdGlvbgotCi0gIGZfdHlwZXNfaW1wbF8gPDwKLSAgICAic3RhdGljIHZvaWQiIDw8IGVuZGwgPDwKLSAgICBjbGFzc19uYW1lX2xjIDw8ICJfY2xhc3NfaW5pdCAoIiA8PCBjbGFzc19uYW1lIDw8ICJDbGFzcyAqIGNscykiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKGZfdHlwZXNfaW1wbF8pOwotCi0gIGZfdHlwZXNfaW1wbF8gPDwgICAKLSAgICBpbmRlbnQoKSA8PCAiR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGNscyk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIlRocmlmdFN0cnVjdENsYXNzICpzdHJ1Y3RfY2xhc3MgPSAiICA8PAotICAgICJUSFJJRlRfU1RSVUNUX0NMQVNTIChjbHMpOyIgPDwgZW5kbCA8PAotICAgIGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAic3RydWN0X2NsYXNzLT5yZWFkID0gIiA8PCBjbGFzc19uYW1lX2xjIDw8ICJfcmVhZDsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAic3RydWN0X2NsYXNzLT53cml0ZSA9ICIgPDwgY2xhc3NfbmFtZV9sYyA8PCAiX3dyaXRlOyIgPDwgZW5kbCA8PAotICAgIGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSAiIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9maW5hbGl6ZTsiIDw8IGVuZGw7Ci0gIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKLSAgICBmX3R5cGVzX2ltcGxfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gIiA8PAotICAgICAgY2xhc3NfbmFtZV9sYyA8PCAiX2dldF9wcm9wZXJ0eTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSAiIDw8Ci0gICAgICBjbGFzc19uYW1lX2xjIDw8ICJfc2V0X3Byb3BlcnR5OyIgPDwgZW5kbDsKLQotICAgIC8vIGluc3RhbGwgYSBwcm9wZXJ0eSBmb3IgZWFjaCBtZW1iZXIKLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICB0X2ZpZWxkICptZW1iZXIgPSAoKm1faXRlcik7Ci0gICAgICBzdHJpbmcgbWVtYmVyX25hbWUgPSBtZW1iZXItPmdldF9uYW1lKCk7Ci0gICAgICBzdHJpbmcgbWVtYmVyX25hbWVfdWMgPQotICAgICAgICB0b191cHBlcl9jYXNlKHRvX2xvd2VyX2Nhc2UoaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKG1lbWJlcl9uYW1lKSkpOwotICAgICAgdF90eXBlICptZW1iZXJfdHlwZSA9IGdldF90cnVlX3R5cGUobWVtYmVyLT5nZXRfdHlwZSgpKTsKLSAgICAgIHRfY29uc3RfdmFsdWUgKm1lbWJlcl92YWx1ZSA9IG1lbWJlci0+Z2V0X3ZhbHVlKCk7Ci0KLSAgICAgIHN0cmluZyBwcm9wZXJ0eV9pZGVudGlmaWVyID0KLSAgICAgICAgIlBST1BfIiArIGNsYXNzX25hbWVfdWMgKyAiXyIgKyBtZW1iZXJfbmFtZV91YzsKLQotICAgICAgZl90eXBlc19pbXBsXyA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBhcmdzX2luZGVudCA9IGluZGVudCgpICsgJyAnOwotICAgICAgZl90eXBlc19pbXBsXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiKGdvYmplY3RfY2xhc3MsIiA8PCBlbmRsIDw8Ci0gICAgICAgIGFyZ3NfaW5kZW50IDw8IHByb3BlcnR5X2lkZW50aWZpZXIgPDwgIiwiIDw8IGVuZGwgPDwKLSAgICAgICAgYXJnc19pbmRlbnQ7Ci0KLSAgICAgIGlmIChtZW1iZXJfdHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSBiYXNlX3R5cGUgPQotICAgICAgICAgICgodF9iYXNlX3R5cGUgKikgbWVtYmVyX3R5cGUpLT5nZXRfYmFzZSgpOwotCi0gICAgICAgIGlmIChiYXNlX3R5cGUgPT0gdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HKSB7Ci0gICAgICAgICAgaWYgKCgodF9iYXNlX3R5cGUgKikgbWVtYmVyX3R5cGUpLT5pc19iaW5hcnkoKSkgewotICAgICAgICAgICAgYXJnc19pbmRlbnQgKz0gc3RyaW5nKDIwLCAnICcpOwotICAgICAgICAgICAgZl90eXBlc19pbXBsXyA8PAotICAgICAgICAgICAgICAiZ19wYXJhbV9zcGVjX2JveGVkIChcIiIgPDwgbWVtYmVyX25hbWUgPDwgIlwiLCIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICBhcmdzX2luZGVudCA8PCAiTlVMTCwiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgYXJnc19pbmRlbnQgPDwgIk5VTEwsIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgIGFyZ3NfaW5kZW50IDw8ICJHX1RZUEVfQllURV9BUlJBWSwiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgYXJnc19pbmRlbnQgPDwgIkdfUEFSQU1fUkVBRFdSSVRFKSk7IiA8PCBlbmRsOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhcmdzX2luZGVudCArPSBzdHJpbmcoMjEsICcgJyk7Ci0gICAgICAgICAgICBmX3R5cGVzX2ltcGxfIDw8Ci0gICAgICAgICAgICAgICJnX3BhcmFtX3NwZWNfc3RyaW5nIChcIiIgPDwgbWVtYmVyX25hbWUgPDwgIlwiLCIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICBhcmdzX2luZGVudCA8PCAiTlVMTCwiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgYXJnc19pbmRlbnQgPDwgIk5VTEwsIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgIGFyZ3NfaW5kZW50IDw8Ci0gICAgICAgICAgICAgICgobWVtYmVyX3ZhbHVlICE9IE5VTEwpID8KLSAgICAgICAgICAgICAgICJcIiIgKyBtZW1iZXJfdmFsdWUtPmdldF9zdHJpbmcoKSArICJcIiIgOgotICAgICAgICAgICAgICAgIk5VTEwiKSA8PAotICAgICAgICAgICAgICAiLCIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICBhcmdzX2luZGVudCA8PCAiR19QQVJBTV9SRUFEV1JJVEUpKTsiIDw8IGVuZGw7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGJhc2VfdHlwZSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MKSB7Ci0gICAgICAgICAgYXJnc19pbmRlbnQgKz0gc3RyaW5nKDIyLCAnICcpOwotICAgICAgICAgIGZfdHlwZXNfaW1wbF8gPDwKLSAgICAgICAgICAgICJnX3BhcmFtX3NwZWNfYm9vbGVhbiAoXCIiIDw8IG1lbWJlcl9uYW1lIDw8ICJcIiwiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgIGFyZ3NfaW5kZW50IDw8ICJOVUxMLCIgPDwgZW5kbCA8PAotICAgICAgICAgICAgYXJnc19pbmRlbnQgPDwgIk5VTEwsIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICBhcmdzX2luZGVudCA8PAotICAgICAgICAgICAgKCgobWVtYmVyX3ZhbHVlICE9IE5VTEwpICYmCi0gICAgICAgICAgICAgIChtZW1iZXJfdmFsdWUtPmdldF9pbnRlZ2VyKCkgIT0gMCkpID8gIlRSVUUiIDogIkZBTFNFIikgPDwKLSAgICAgICAgICAgICIsIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICBhcmdzX2luZGVudCA8PCAiR19QQVJBTV9SRUFEV1JJVEUpKTsiIDw8IGVuZGw7Ci0gICAgICAgIH0gZWxzZSBpZiAoKGJhc2VfdHlwZSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFKSB8fAotICAgICAgICAgICAgICAgICAgIChiYXNlX3R5cGUgPT0gdF9iYXNlX3R5cGU6OlRZUEVfSTE2KSB8fAotICAgICAgICAgICAgICAgICAgIChiYXNlX3R5cGUgPT0gdF9iYXNlX3R5cGU6OlRZUEVfSTMyKSB8fAotICAgICAgICAgICAgICAgICAgIChiYXNlX3R5cGUgPT0gdF9iYXNlX3R5cGU6OlRZUEVfSTY0KSB8fAotICAgICAgICAgICAgICAgICAgIChiYXNlX3R5cGUgPT0gdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFKSkgewotICAgICAgICAgIHN0cmluZyBwYXJhbV9zcGVjX2Z1bmN0aW9uX25hbWUgPSAiZ19wYXJhbV9zcGVjX2ludCI7Ci0gICAgICAgICAgc3RyaW5nIG1pbl92YWx1ZTsKLSAgICAgICAgICBzdHJpbmcgbWF4X3ZhbHVlOwotICAgICAgICAgIG9zdHJpbmdzdHJlYW0gZGVmYXVsdF92YWx1ZTsKLQotICAgICAgICAgIHN3aXRjaCAoYmFzZV90eXBlKSB7Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICAgICAgbWluX3ZhbHVlID0gIkdfTUlOSU5UOCI7Ci0gICAgICAgICAgICBtYXhfdmFsdWUgPSAiR19NQVhJTlQ4IjsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgICAgICBtaW5fdmFsdWUgPSAiR19NSU5JTlQxNiI7Ci0gICAgICAgICAgICBtYXhfdmFsdWUgPSAiR19NQVhJTlQxNiI7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICAgICAgbWluX3ZhbHVlID0gIkdfTUlOSU5UMzIiOwotICAgICAgICAgICAgbWF4X3ZhbHVlID0gIkdfTUFYSU5UMzIiOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgICAgIHBhcmFtX3NwZWNfZnVuY3Rpb25fbmFtZSA9ICJnX3BhcmFtX3NwZWNfaW50NjQiOwotICAgICAgICAgICAgbWluX3ZhbHVlID0gIkdfTUlOSU5UNjQiOwotICAgICAgICAgICAgbWF4X3ZhbHVlID0gIkdfTUFYSU5UNjQiOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgICAgIHBhcmFtX3NwZWNfZnVuY3Rpb25fbmFtZSA9ICJnX3BhcmFtX3NwZWNfZG91YmxlIjsKLSAgICAgICAgICAgIG1pbl92YWx1ZSA9ICItSU5GSU5JVFkiOwotICAgICAgICAgICAgbWF4X3ZhbHVlID0gIklORklOSVRZIjsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogIgotICAgICAgICAgICAgICAidW5yZWNvZ25pemVkIGJhc2UgdHlwZSBcIiIgKyBtZW1iZXJfdHlwZS0+Z2V0X25hbWUoKSArICJcIiAiCi0gICAgICAgICAgICAgICJmb3Igc3RydWN0IG1lbWJlciBcIiIgKyBtZW1iZXJfbmFtZSArICJcIiI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBpZiAobWVtYmVyX3ZhbHVlICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGRlZmF1bHRfdmFsdWUgPDwKLSAgICAgICAgICAgICAgKGJhc2VfdHlwZSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEUgPwotICAgICAgICAgICAgICAgbWVtYmVyX3ZhbHVlLT5nZXRfZG91YmxlKCkgOgotICAgICAgICAgICAgICAgbWVtYmVyX3ZhbHVlLT5nZXRfaW50ZWdlcigpKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZGVmYXVsdF92YWx1ZSA8PCAiMCI7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgYXJnc19pbmRlbnQgKz0gc3RyaW5nKHBhcmFtX3NwZWNfZnVuY3Rpb25fbmFtZS5sZW5ndGgoKSArIDIsICcgJyk7Ci0gICAgICAgICAgZl90eXBlc19pbXBsXyA8PAotICAgICAgICAgICAgcGFyYW1fc3BlY19mdW5jdGlvbl9uYW1lIDw8ICIgKFwiIiA8PCBtZW1iZXJfbmFtZSA8PCAiXCIsIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICBhcmdzX2luZGVudCA8PCAiTlVMTCwiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgIGFyZ3NfaW5kZW50IDw8ICJOVUxMLCIgPDwgZW5kbCA8PAotICAgICAgICAgICAgYXJnc19pbmRlbnQgPDwgbWluX3ZhbHVlIDw8ICIsIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICBhcmdzX2luZGVudCA8PCBtYXhfdmFsdWUgPDwgIiwiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgIGFyZ3NfaW5kZW50IDw8IGRlZmF1bHRfdmFsdWUuc3RyKCkgPDwgIiwiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgIGFyZ3NfaW5kZW50IDw8ICJHX1BBUkFNX1JFQURXUklURSkpOyIgPDwgZW5kbDsKLSAgICAgICAgfQotCi0gICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICB9IGVsc2UgaWYgKG1lbWJlcl90eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgICAgdF9lbnVtX3ZhbHVlICplbnVtX21pbl92YWx1ZSA9Ci0gICAgICAgICAgKCh0X2VudW0gKikgbWVtYmVyX3R5cGUpLT5nZXRfbWluX3ZhbHVlKCk7Ci0gICAgICAgIHRfZW51bV92YWx1ZSAqZW51bV9tYXhfdmFsdWUgPQotICAgICAgICAgICgodF9lbnVtICopIG1lbWJlcl90eXBlKS0+Z2V0X21heF92YWx1ZSgpOwotICAgICAgICBpbnQgbWluX3ZhbHVlID0KLSAgICAgICAgICAoZW51bV9taW5fdmFsdWUgIT0gTlVMTCkgPyBlbnVtX21pbl92YWx1ZS0+Z2V0X3ZhbHVlKCkgOiAwOwotICAgICAgICBpbnQgbWF4X3ZhbHVlID0KLSAgICAgICAgICAoZW51bV9tYXhfdmFsdWUgIT0gTlVMTCkgPyBlbnVtX21heF92YWx1ZS0+Z2V0X3ZhbHVlKCkgOiAwOwotCi0gICAgICAgIGFyZ3NfaW5kZW50ICs9IHN0cmluZygxOCwgJyAnKTsKLSAgICAgICAgZl90eXBlc19pbXBsXyA8PAotICAgICAgICAgICJnX3BhcmFtX3NwZWNfaW50IChcIiIgPDwgbWVtYmVyX25hbWUgPDwgIlwiLCIgPDwgZW5kbCA8PAotICAgICAgICAgIGFyZ3NfaW5kZW50IDw8ICJOVUxMLCIgPDwgZW5kbCA8PAotICAgICAgICAgIGFyZ3NfaW5kZW50IDw8ICJOVUxMLCIgPDwgZW5kbCA8PAotICAgICAgICAgIGFyZ3NfaW5kZW50IDw8IG1pbl92YWx1ZSA8PCAiLCIgPDwgZW5kbCA8PAotICAgICAgICAgIGFyZ3NfaW5kZW50IDw8IG1heF92YWx1ZSA8PCAiLCIgPDwgZW5kbCA8PAotICAgICAgICAgIGFyZ3NfaW5kZW50IDw8IG1pbl92YWx1ZSA8PCAiLCIgPDwgZW5kbCA8PAotICAgICAgICAgIGFyZ3NfaW5kZW50IDw8ICJHX1BBUkFNX1JFQURXUklURSkpOyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIH0gZWxzZSBpZiAobWVtYmVyX3R5cGUtPmlzX3N0cnVjdCgpIHx8IG1lbWJlcl90eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgICAgIHN0cmluZyBwYXJhbV90eXBlID0KLSAgICAgICAgICB0aGlzLT5uc3BhY2VfdWMgKwotICAgICAgICAgICJUWVBFXyIgKwotICAgICAgICAgIHRvX3VwcGVyX2Nhc2UoaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKG1lbWJlcl90eXBlLT5nZXRfbmFtZSgpKSk7Ci0KLSAgICAgICAgYXJnc19pbmRlbnQgKz0gc3RyaW5nKDIwLCAnICcpOwotICAgICAgICBmX3R5cGVzX2ltcGxfIDw8Ci0gICAgICAgICAgImdfcGFyYW1fc3BlY19vYmplY3QgKFwiIiA8PCBtZW1iZXJfbmFtZSA8PCAiXCIsIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgYXJnc19pbmRlbnQgPDwgIk5VTEwsIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgYXJnc19pbmRlbnQgPDwgIk5VTEwsIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgYXJnc19pbmRlbnQgPDwgcGFyYW1fdHlwZSA8PCAiLCIgPDwgZW5kbCA8PAotICAgICAgICAgIGFyZ3NfaW5kZW50IDw8ICJHX1BBUkFNX1JFQURXUklURSkpOyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIH0gZWxzZSBpZiAobWVtYmVyX3R5cGUtPmlzX2xpc3QoKSkgewotICAgICAgICB0X3R5cGUgKmVsZW1fdHlwZSA9ICgodF9saXN0ICopIG1lbWJlcl90eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgICAgICBzdHJpbmcgcGFyYW1fdHlwZTsKLQotICAgICAgICBpZiAoZWxlbV90eXBlLT5pc19iYXNlX3R5cGUoKSAmJiAhZWxlbV90eXBlLT5pc19zdHJpbmcoKSkgewotICAgICAgICAgIHBhcmFtX3R5cGUgPSAiR19UWVBFX0FSUkFZIjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBwYXJhbV90eXBlID0gIkdfVFlQRV9QVFJfQVJSQVkiOwotICAgICAgICB9Ci0KLSAgICAgICAgYXJnc19pbmRlbnQgKz0gc3RyaW5nKDIwLCAnICcpOwotICAgICAgICBmX3R5cGVzX2ltcGxfIDw8Ci0gICAgICAgICAgImdfcGFyYW1fc3BlY19ib3hlZCAoXCIiIDw8IG1lbWJlcl9uYW1lIDw8ICJcIiwiIDw8IGVuZGwgPDwKLSAgICAgICAgICBhcmdzX2luZGVudCA8PCAiTlVMTCwiIDw8IGVuZGwgPDwKLSAgICAgICAgICBhcmdzX2luZGVudCA8PCAiTlVMTCwiIDw8IGVuZGwgPDwKLSAgICAgICAgICBhcmdzX2luZGVudCA8PCBwYXJhbV90eXBlIDw8ICIsIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgYXJnc19pbmRlbnQgPDwgIkdfUEFSQU1fUkVBRFdSSVRFKSk7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgfSBlbHNlIGlmIChtZW1iZXJfdHlwZS0+aXNfc2V0KCkgfHwgbWVtYmVyX3R5cGUtPmlzX21hcCgpKSB7Ci0gICAgICAgIGFyZ3NfaW5kZW50ICs9IHN0cmluZygyMCwgJyAnKTsKLSAgICAgICAgZl90eXBlc19pbXBsXyA8PAotICAgICAgICAgICJnX3BhcmFtX3NwZWNfYm94ZWQgKFwiIiA8PCBtZW1iZXJfbmFtZSA8PCAiXCIsIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgYXJnc19pbmRlbnQgPDwgIk5VTEwsIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgYXJnc19pbmRlbnQgPDwgIk5VTEwsIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgYXJnc19pbmRlbnQgPDwgIkdfVFlQRV9IQVNIX1RBQkxFLCIgPDwgZW5kbCA8PAotICAgICAgICAgIGFyZ3NfaW5kZW50IDw8ICJHX1BBUkFNX1JFQURXUklURSkpOyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgc2NvcGVfZG93bihmX3R5cGVzX2ltcGxfKTsKLSAgZl90eXBlc19pbXBsXyA8PCBlbmRsOwotCi0gIGZfdHlwZXNfaW1wbF8gPDwKLSAgICAiR1R5cGUiIDw8IGVuZGwgPDwKLSAgICB0aGlzLT5uc3BhY2VfbGMgPDwgbmFtZV91IDw8ICJfZ2V0X3R5cGUgKHZvaWQpIiA8PCBlbmRsIDw8Ci0gICAgInsiIDw8IGVuZGwgPDwKLSAgICAiICBzdGF0aWMgR1R5cGUgdHlwZSA9IDA7IiA8PCBlbmRsIDw8Ci0gICAgZW5kbCA8PAotICAgICIgIGlmICh0eXBlID09IDApICIgPDwgZW5kbCA8PAotICAgICIgIHsiIDw8IGVuZGwgPDwKLSAgICAiICAgIHN0YXRpYyBjb25zdCBHVHlwZUluZm8gdHlwZV9pbmZvID0gIiA8PCBlbmRsIDw8Ci0gICAgIiAgICB7IiA8PCBlbmRsIDw8Ci0gICAgIiAgICAgIHNpemVvZiAoIiA8PCB0aGlzLT5uc3BhY2UgPDwgbmFtZSA8PCAiQ2xhc3MpLCIgPDwgZW5kbCA8PAotICAgICIgICAgICBOVUxMLCAvKiBiYXNlX2luaXQgKi8iIDw8IGVuZGwgPDwKLSAgICAiICAgICAgTlVMTCwgLyogYmFzZV9maW5hbGl6ZSAqLyIgPDwgZW5kbCA8PAotICAgICIgICAgICAoR0NsYXNzSW5pdEZ1bmMpICIgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IG5hbWVfdSA8PCAiX2NsYXNzX2luaXQsIiA8PCBlbmRsIDw8Ci0gICAgIiAgICAgIE5VTEwsIC8qIGNsYXNzX2ZpbmFsaXplICovIiA8PCBlbmRsIDw8Ci0gICAgIiAgICAgIE5VTEwsIC8qIGNsYXNzX2RhdGEgKi8iIDw8IGVuZGwgPDwKLSAgICAiICAgICAgc2l6ZW9mICgiIDw8IHRoaXMtPm5zcGFjZSA8PCBuYW1lIDw8ICIpLCIgPDwgZW5kbCA8PAotICAgICIgICAgICAwLCAvKiBuX3ByZWFsbG9jcyAqLyIgPDwgZW5kbCA8PAotICAgICIgICAgICAoR0luc3RhbmNlSW5pdEZ1bmMpICIgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IG5hbWVfdSA8PCAiX2luc3RhbmNlX2luaXQsIiA8PCBlbmRsIDw8Ci0gICAgIiAgICAgIE5VTEwsIC8qIHZhbHVlX3RhYmxlICovIiA8PCBlbmRsIDw8Ci0gICAgIiAgICB9OyIgPDwgZW5kbCA8PAotICAgIGVuZGwgPDwKLSAgICAiICAgIHR5cGUgPSBnX3R5cGVfcmVnaXN0ZXJfc3RhdGljIChUSFJJRlRfVFlQRV9TVFJVQ1QsICIgPDwgZW5kbCA8PAotICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiIiA8PCB0aGlzLT5uc3BhY2UgPDwgbmFtZSA8PCAiVHlwZVwiLCIgPDwgZW5kbCA8PAotICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0eXBlX2luZm8sIDApOyIgPDwgZW5kbCA8PAotICAgICIgIH0iIDw8IGVuZGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgIiAgcmV0dXJuIHR5cGU7IiA8PCBlbmRsIDw8Ci0gICAgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBmdW5jdGlvbnMgdG8gd3JpdGUgVGhyaWZ0IHN0cnVjdHVyZXMgdG8gYSBzdHJlYW0uCi0gKi8KLXZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3Rfd3JpdGVyIChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0ICp0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB0aGlzX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHRoaXNfZ2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZnVuY3Rpb24pIHsKLSAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOwotICBzdHJpbmcgbmFtZV91ID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKG5hbWUpOwotICBzdHJpbmcgbmFtZV91YyA9IHRvX3VwcGVyX2Nhc2UobmFtZV91KTsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCAqPiAmZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yIDx0X2ZpZWxkICo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGludCBlcnJvcl9yZXQgPSAwOwotCi0gIGlmIChpc19mdW5jdGlvbikgewotICAgIGVycm9yX3JldCA9IC0xOwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAic3RhdGljIGdpbnQzMiIgPDwgZW5kbCA8PAotICAgICAgdGhpcy0+bnNwYWNlX2xjIDw8IG5hbWVfdSA8PAotICAgICAgIl93cml0ZSAoVGhyaWZ0U3RydWN0ICpvYmplY3QsIFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpIiA8PCBlbmRsOwotICB9Ci0gIGluZGVudChvdXQpIDw8ICJ7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAiZ2ludDMyIHJldDsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiZ2ludDMyIHhmZXIgPSAwOyIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgdGhpc19nZXQgPDwgZW5kbDsKLSAgLy8gc2F0aXNmeSAtV2FsbCBpbiB0aGUgY2FzZSBvZiBhbiBlbXB0eSBzdHJ1Y3QKLSAgaWYgKCF0aGlzX2dldC5lbXB0eSgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIlRIUklGVF9VTlVTRURfVkFSICh0aGlzX29iamVjdCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9iZWdpbiAocHJvdG9jb2wsIFwiIiA8PCBuYW1lIDw8ICJcIiwgZXJyb3IpKSA8IDApIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbDsKLQotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKHRoaXNfb2JqZWN0LT5fX2lzc2V0XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPT0gVFJVRSkgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgIH0gCi0KLSAgICBvdXQgPDwKLSAgICAgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgIiA8PAotICAgICAiXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIsICIgPDwKLSAgICAgdHlwZV90b19lbnVtICgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIiwgZXJyb3IpKSA8IDApIiA8PCBlbmRsIDw8Ci0gICAgIGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbCA8PAotICAgICBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsOwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZCAob3V0LCAqZl9pdGVyLCB0aGlzX25hbWUsICIiLCBlcnJvcl9yZXQpOwotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2VuZCAocHJvdG9jb2wsIGVycm9yKSkgPCAwKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsOwotCi0gICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICAvLyB3cml0ZSB0aGUgc3RydWN0IG1hcAotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfZmllbGRfc3RvcCAocHJvdG9jb2wsIGVycm9yKSkgPCAwKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfc3RydWN0X2VuZCAocHJvdG9jb2wsIGVycm9yKSkgPCAwKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIGlmIChpc19mdW5jdGlvbikgewotICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4geGZlcjsiIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PAotICAgICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgY29kZSB0byByZWFkIFRocmlmdCBzdHJ1Y3R1cmVzIGZyb20gYSBzdHJlYW0uCi0gKi8KLXZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3RfcmVhZGVyKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCAqdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB0aGlzX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdGhpc19nZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2Z1bmN0aW9uKSB7Ci0gIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKLSAgc3RyaW5nIG5hbWVfdSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhuYW1lKTsKLSAgc3RyaW5nIG5hbWVfdWMgPSB0b191cHBlcl9jYXNlKG5hbWVfdSk7Ci0gIGludCBlcnJvcl9yZXQgPSAwOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCAqPiAmZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yIDx0X2ZpZWxkICo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgaWYgKGlzX2Z1bmN0aW9uKSB7Ci0gICAgZXJyb3JfcmV0ID0gLTE7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICIvKiByZWFkcyBhICIgPDwgbmFtZV91IDw8ICIgb2JqZWN0ICovIiA8PCBlbmRsIDw8Ci0gICAgICAic3RhdGljIGdpbnQzMiIgPDwgZW5kbCA8PAotICAgICAgdGhpcy0+bnNwYWNlX2xjIDw8IG5hbWVfdSA8PAotICAgICAgICAgICJfcmVhZCAoVGhyaWZ0U3RydWN0ICpvYmplY3QsIFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpIiA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50KG91dCkgPDwgInsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIC8vIGRlY2xhcmUgc3RhY2sgdGVtcCB2YXJpYWJsZXMKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgImdpbnQzMiByZXQ7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImdpbnQzMiB4ZmVyID0gMDsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiZ2NoYXIgKm5hbWUgPSBOVUxMOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJUaHJpZnRUeXBlIGZ0eXBlOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJnaW50MTYgZmlkOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJndWludDMyIGxlbiA9IDA7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImdwb2ludGVyIGRhdGEgPSBOVUxMOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8IHRoaXNfZ2V0IDw8IGVuZGw7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgewotICAgICAgaW5kZW50KG91dCkgPDwgImdib29sZWFuIGlzc2V0XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSBGQUxTRTsiIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgb3V0IDw8IGVuZGw7Ci0KLSAgLy8gc2F0aXNmeSAtV2FsbCBpbiBjYXNlIHdlIGRvbid0IHVzZSBzb21lIHZhcmlhYmxlcwotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAiLyogc2F0aXNmeSAtV2FsbCBpbiBjYXNlIHRoZXNlIGFyZW4ndCB1c2VkICovIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIlRIUklGVF9VTlVTRURfVkFSIChsZW4pOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJUSFJJRlRfVU5VU0VEX1ZBUiAoZGF0YSk7IiA8PCBlbmRsOwotCi0gIGlmICghdGhpc19nZXQuZW1wdHkoKSkgewotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiVEhSSUZUX1VOVVNFRF9WQVIgKHRoaXNfb2JqZWN0KTsiIDw8IGVuZGw7Ci0gIH0KLSAgb3V0IDw8IGVuZGw7Ci0KLSAgLy8gcmVhZCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJ1Y3R1cmUgbWFya2VyCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICIvKiByZWFkIHRoZSBzdHJ1Y3QgYmVnaW4gbWFya2VyICovIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfc3RydWN0X2JlZ2luIChwcm90b2NvbCwgJm5hbWUsIGVycm9yKSkgPCAwKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgaWYgKG5hbWUpIGdfZnJlZSAobmFtZSk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImlmIChuYW1lKSBnX2ZyZWUgKG5hbWUpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJuYW1lID0gTlVMTDsiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIC8vIHJlYWQgdGhlIHN0cnVjdCBmaWVsZHMKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgIi8qIHJlYWQgdGhlIHN0cnVjdCBmaWVsZHMgKi8iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAid2hpbGUgKDEpIiA8PCBlbmRsOwotICBzY29wZV91cChvdXQpOwotCi0gIC8vIHJlYWQgYmVnaW5uaW5nIGZpZWxkIG1hcmtlcgotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAiLyogcmVhZCB0aGUgYmVnaW5uaW5nIG9mIGEgZmllbGQgKi8iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZuYW1lLCAmZnR5cGUsICZmaWQsIGVycm9yKSkgPCAwKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgaWYgKG5hbWUpIGdfZnJlZSAobmFtZSk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImlmIChuYW1lKSBnX2ZyZWUgKG5hbWUpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJuYW1lID0gTlVMTDsiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIC8vIGNoZWNrIGZvciBmaWVsZCBTVE9QIG1hcmtlcgotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAiLyogYnJlYWsgaWYgd2UgZ2V0IGEgU1RPUCBmaWVsZCAqLyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJpZiAoZnR5cGUgPT0gVF9TVE9QKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgYnJlYWs7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIC8vIHN3aXRjaCBkZXBlbmRpbmcgb24gdGhlIGZpZWxkIHR5cGUKLSAgaW5kZW50KG91dCkgPDwKLSAgICAic3dpdGNoIChmaWQpIiA8PCBlbmRsOwotCi0gIC8vIHN0YXJ0IHN3aXRjaAotICBzY29wZV91cChvdXQpOwotCi0gIC8vIGdlbmVyYXRlIGRlc2VyaWFsaXphdGlvbiBjb2RlIGZvciBrbm93biB0eXBlcwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiY2FzZSAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICI6IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiaWYgKGZ0eXBlID09ICIgPDwgdHlwZV90b19lbnVtICgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIpIiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAieyIgPDwgZW5kbDsKLQotCi0gICAgaW5kZW50X3VwKCk7Ci0gICAgLy8gZ2VuZXJhdGUgZGVzZXJpYWxpemUgZmllbGQKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZCAob3V0LCAqZl9pdGVyLCB0aGlzX25hbWUsICIiLCBlcnJvcl9yZXQsIGZhbHNlKTsKLSAgICBpbmRlbnRfZG93bigpOwotCi0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAifSBlbHNlIHsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3NraXAgKHByb3RvY29sLCBmdHlwZSwgZXJyb3IpKSA8IDApIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICAgIHJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgeGZlciArPSByZXQ7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICB9Ci0KLSAgLy8gY3JlYXRlIHRoZSBkZWZhdWx0IGNhc2UKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfc2tpcCAocHJvdG9jb2wsIGZ0eXBlLCBlcnJvcikpIDwgMCkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICAgIHJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIHhmZXIgKz0gcmV0OyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIGJyZWFrOyIgPDwgZW5kbDsKLQotICAvLyBlbmQgc3dpdGNoCi0gIHNjb3BlX2Rvd24ob3V0KTsKLQotICAvLyByZWFkIGZpZWxkIGVuZCBtYXJrZXIKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfZmllbGRfZW5kIChwcm90b2NvbCwgZXJyb3IpKSA8IDApIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbDsKLQotICAvLyBlbmQgd2hpbGUgbG9vcAotICBzY29wZV9kb3duKG91dCk7Ci0gIG91dCA8PCBlbmRsOwotCi0gIC8vIHJlYWQgdGhlIGVuZCBvZiB0aGUgc3RydWN0dXJlCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX3N0cnVjdF9lbmQgKHByb3RvY29sLCBlcnJvcikpIDwgMCkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICAvLyBpZiBhIHJlcXVpcmVkIGZpZWxkIGlzIG1pc3NpbmcsIHRocm93IGFuIGVycm9yCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKCFpc3NldF8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9QUk9UT0NPTF9FUlJPUiwiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgIFRIUklGVF9QUk9UT0NPTF9FUlJPUl9JTlZBTElEX0RBVEEsIiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgICAgICAgICAgICAgICBcIm1pc3NpbmcgZmllbGRcIik7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiAtMTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgICAgZW5kbDsKLSAgICB9Ci0gIH0KLQotICBpZiAoaXNfZnVuY3Rpb24pIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgInJldHVybiB4ZmVyOyIgPDwgZW5kbDsKLSAgfQotCi0gIC8vIGVuZCB0aGUgZnVuY3Rpb24vc3RydWN0dXJlCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8Ci0gICAgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotfQotCi12b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQgKnRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHN1ZmZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yX3JldCkgewotICB0X3R5cGUgKnR5cGUgPSBnZXRfdHJ1ZV90eXBlICh0ZmllbGQtPmdldF90eXBlKCkpOwotICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSArIHN1ZmZpeDsKLQotICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgbmFtZTsKLSAgfQotCi0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdCAob3V0LCAodF9zdHJ1Y3QgKikgdHlwZSwgbmFtZSwgZXJyb3JfcmV0KTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIgKG91dCwgdHlwZSwgbmFtZSwgZXJyb3JfcmV0KTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlXyI7Ci0KLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlICopIHR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIKLSAgICAgICAgICAgICAgICArIG5hbWU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgICBvdXQgPDwgImJvb2wgKHByb3RvY29sLCAiIDw8IG5hbWU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgICBvdXQgPDwgImJ5dGUgKHByb3RvY29sLCAiIDw8IG5hbWU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICAgIG91dCA8PCAiaTE2IChwcm90b2NvbCwgIiA8PCBuYW1lOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgICBvdXQgPDwgImkzMiAocHJvdG9jb2wsICIgPDwgbmFtZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgICAgb3V0IDw8ICJpNjQgKHByb3RvY29sLCAiIDw8IG5hbWU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICAgIG91dCA8PCAiZG91YmxlIChwcm90b2NvbCwgIiA8PCBuYW1lOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgICBpZiAoKCh0X2Jhc2VfdHlwZSAqKSB0eXBlKS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgICAgICAgIG91dCA8PCAiYmluYXJ5IChwcm90b2NvbCwgKChHQnl0ZUFycmF5ICopICIgPDwgbmFtZSA8PAotICAgICAgICAgICAgICAgICAgICIpLT5kYXRhLCAoKEdCeXRlQXJyYXkgKikgIiA8PCBuYW1lIDw8Ci0gICAgICAgICAgICAgICAgICAgIiktPmxlbiI7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG91dCA8PCAic3RyaW5nIChwcm90b2NvbCwgIiA8PCBuYW1lOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEMgd3JpdGVyIGZvciBiYXNlIHR5cGUgIgotICAgICAgICAgICAgICAgICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lICh0YmFzZSkgKyBuYW1lOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICBvdXQgPDwgImkzMiAocHJvdG9jb2wsIChnaW50MzIpICIgPDwgbmFtZTsKLSAgICB9Ci0gICAgb3V0IDw8ICIsIGVycm9yKSkgPCAwKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIHByaW50ZiAoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCi0gICAgICAgICAgICBuYW1lLmNfc3RyKCksIHR5cGVfbmFtZSAodHlwZSkuY19zdHIoKSk7Ci0gIH0KLX0KLQotdm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0ICp0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJvcl9yZXQpIHsKLSAgKHZvaWQpIHRzdHJ1Y3Q7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9zdHJ1Y3Rfd3JpdGUgKFRIUklGVF9TVFJVQ1QgKCIgPDwgcHJlZml4IDw8ICIpLCBwcm90b2NvbCwgZXJyb3IpKSA8IDApIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLXZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUgKnR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJvcl9yZXQpIHsKLSAgc2NvcGVfdXAob3V0KTsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgc3RyaW5nIGxlbmd0aCA9ICJnX2hhc2hfdGFibGVfc2l6ZSAoKEdIYXNoVGFibGUgKikgIiArIHByZWZpeCArICIpIjsKLSAgICB0X3R5cGUgKnRrZXkgPSAoKHRfbWFwICopIHR0eXBlKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgdF90eXBlICp0dmFsID0gKCh0X21hcCAqKSB0dHlwZSktPmdldF92YWxfdHlwZSgpOwotICAgIHN0cmluZyB0a2V5X25hbWUgPSB0eXBlX25hbWUgKHRrZXkpOwotICAgIHN0cmluZyB0dmFsX25hbWUgPSB0eXBlX25hbWUgKHR2YWwpOwotICAgIHN0cmluZyB0a2V5X3B0cjsKLSAgICBzdHJpbmcgdHZhbF9wdHI7Ci0gICAgc3RyaW5nIGtleW5hbWUgPSB0bXAoImtleSIpOwotICAgIHN0cmluZyB2YWxuYW1lID0gdG1wKCJ2YWwiKTsKLQotICAgIC8qCi0gICAgICogU29tZSB1Z2xpbmVzcyBoZXJlLiAgVG8gbWF4aW1pemUgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIHdlCi0gICAgICogYXZvaWQgdXNpbmcgR0hhc2hUYWJsZUl0ZXIgYW5kIGluc3RlYWQgZ2V0IGEgR0xpc3Qgb2YgYWxsIGtleXMsCi0gICAgICogdGhlbiBjb3B5IGl0IGludG8gYSBhcnJheSBvbiB0aGUgc3RhY2ssIGFuZCBmcmVlIGl0LgotICAgICAqIFRoaXMgaXMgYmVjYXVzZSB3ZSBtYXkgZXhpdCBlYXJseSBiZWZvcmUgd2UgZ2V0IGEgY2hhbmNlIHRvIGZyZWUgdGhlCi0gICAgICogR0xpc3QuCi0gICAgICovCi0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWFwX2JlZ2luIChwcm90b2NvbCwgIiA8PAotICAgICAgICAgICAgICAgICAgIHR5cGVfdG9fZW51bSAodGtleSkgPDwgIiwgIiA8PCB0eXBlX3RvX2VudW0gKHR2YWwpIDw8Ci0gICAgICAgICAgICAgICAgICAgIiwgKGdpbnQzMikgIiA8PCBsZW5ndGggPDwgIiwgZXJyb3IpKSA8IDApIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGwgPDwKLSAgICAgIGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJHTGlzdCAqa2V5X2xpc3QgPSBOVUxMLCAqaXRlciA9IE5VTEw7IiA8PCBlbmRsOwotICAgIGRlY2xhcmVfbG9jYWxfdmFyaWFibGUob3V0LCB0a2V5LCBrZXluYW1lKTsKLSAgICBkZWNsYXJlX2xvY2FsX3ZhcmlhYmxlKG91dCwgdHZhbCwgdmFsbmFtZSk7Ci0KLSAgICAvKiBJZiBlaXRoZXIgdGhlIGtleSBvciB2YWx1ZSB0eXBlIGlzIGEgdHlwZWRlZiwgZmluZCBpdHMgdW5kZXJseWluZyB0eXBlIHNvCi0gICAgICAgd2UgY2FuIGNvcnJlY3RseSBkZXRlcm1pbmUgaG93IHRvIGdlbmVyYXRlIGEgcG9pbnRlciB0byBpdCAqLwotICAgIHRrZXkgPSBnZXRfdHJ1ZV90eXBlKHRrZXkpOwotICAgIHR2YWwgPSBnZXRfdHJ1ZV90eXBlKHR2YWwpOwotCi0gICAgdGtleV9wdHIgPSB0a2V5LT5pc19zdHJpbmcoKSB8fCAhdGtleS0+aXNfYmFzZV90eXBlKCkgPyAiIiA6ICIqIjsKLSAgICB0dmFsX3B0ciA9IHR2YWwtPmlzX3N0cmluZygpIHx8ICF0dmFsLT5pc19iYXNlX3R5cGUoKSA/ICIiIDogIioiOwotCi0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiZ19oYXNoX3RhYmxlX2ZvcmVhY2ggKChHSGFzaFRhYmxlICopICIgPDwgcHJlZml4IDw8IAotICAgICAgICAgICAgICAgICAgICIsIHRocmlmdF9oYXNoX3RhYmxlX2dldF9rZXlzLCAma2V5X2xpc3QpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgdGtleV9uYW1lIDw8IHRrZXlfcHRyIDw8Ci0gICAgICAgICAgICAgICAgICAgIiBrZXlzW2dfbGlzdF9sZW5ndGggKGtleV9saXN0KV07IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaW50IGk9MCwga2V5X2NvdW50ID0gZ19saXN0X2xlbmd0aCAoa2V5X2xpc3QpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwKLSAgICAgICAgImZvciAoaXRlciA9IGdfbGlzdF9maXJzdCAoa2V5X2xpc3QpOyBpdGVyOyBpdGVyID0gaXRlci0+bmV4dCkiIDw8Ci0gICAgICAgIGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICBrZXlzW2krK10gPSAoIiA8PCB0a2V5X25hbWUgPDwgdGtleV9wdHIgPDwKLSAgICAgICAgICAgICAgICAgICAiKSBpdGVyLT5kYXRhOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJnX2xpc3RfZnJlZSAoa2V5X2xpc3QpOyIgPDwgZW5kbCA8PAotICAgICAgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImZvciAoaSA9IDA7IGkgPCBrZXlfY291bnQ7ICsraSkiIDw8IGVuZGw7Ci0KLSAgICBzY29wZV91cChvdXQpOwotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwga2V5bmFtZSA8PCAiID0ga2V5c1tpXTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8IHZhbG5hbWUgPDwgIiA9ICgiIDw8IHR2YWxfbmFtZSA8PCB0dmFsX3B0ciA8PAotICAgICAgICAgICAgICAgICAgICIpIGdfaGFzaF90YWJsZV9sb29rdXAgKCgoR0hhc2hUYWJsZSAqKSAiIDw8IHByZWZpeCA8PAotICAgICAgICAgICAgICAgICAgICIpLCAoZ3BvaW50ZXIpICIgPDwga2V5bmFtZSA8PCAiKTsiIDw8IGVuZGwgPDwKLSAgICAgIGVuZGw7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50IChvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodF9tYXAgKikgdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0a2V5X3B0ciArICIgIiArIGtleW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dmFsX3B0ciArICIgIiArIHZhbG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9yZXQpOwotICAgIHNjb3BlX2Rvd24ob3V0KTsKLQotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX21hcF9lbmQgKHByb3RvY29sLCBlcnJvcikpIDwgMCkiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBzdHJpbmcgbGVuZ3RoID0gImdfaGFzaF90YWJsZV9zaXplICgoR0hhc2hUYWJsZSAqKSAiICsgcHJlZml4ICsgIikiOwotICAgIHRfdHlwZSAqdGVsZW0gPSAoKHRfc2V0ICopIHR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIHN0cmluZyB0ZWxlbV9uYW1lID0gdHlwZV9uYW1lICh0ZWxlbSk7Ci0gICAgc3RyaW5nIHRlbGVtX3B0ciA9IHRlbGVtLT5pc19zdHJpbmcoKSB8fCAhdGVsZW0tPmlzX2Jhc2VfdHlwZSgpID8gIiIgOiAiKiI7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfc2V0X2JlZ2luIChwcm90b2NvbCwgIiA8PAotICAgICAgICAgICAgICAgICAgIHR5cGVfdG9fZW51bSAodGVsZW0pIDw8ICIsIChnaW50MzIpICIgPDwgbGVuZ3RoIDw8Ci0gICAgICAgICAgICAgICAgICAgIiwgZXJyb3IpKSA8IDApIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJHTGlzdCAqa2V5X2xpc3QgPSBOVUxMLCAqaXRlciA9IE5VTEw7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCB0ZWxlbV9uYW1lIDw8IHRlbGVtX3B0ciA8PCAiIGVsZW07IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiZ3BvaW50ZXIgdmFsdWU7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiVEhSSUZUX1VOVVNFRF9WQVIgKHZhbHVlKTsiIDw8IGVuZGwgPDwKLSAgICAgIGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJnX2hhc2hfdGFibGVfZm9yZWFjaCAoKEdIYXNoVGFibGUgKikgIiA8PCBwcmVmaXggPDwKLSAgICAgICAgICAgICAgICAgICAiLCB0aHJpZnRfaGFzaF90YWJsZV9nZXRfa2V5cywgJmtleV9saXN0KTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8IHRlbGVtX25hbWUgPDwgdGVsZW1fcHRyIDw8ICIga2V5c1tnX2xpc3RfbGVuZ3RoIChrZXlfbGlzdCldOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImludCBpPTAsIGtleV9jb3VudCA9IGdfbGlzdF9sZW5ndGggKGtleV9saXN0KTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJmb3IgKGl0ZXIgPSBnX2xpc3RfZmlyc3QgKGtleV9saXN0KTsgaXRlcjsgaXRlciA9IGl0ZXItPm5leHQpIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAga2V5c1tpKytdID0gKCIgPDwgdGVsZW1fbmFtZSA8PCB0ZWxlbV9wdHIgPDwgIikgaXRlci0+ZGF0YTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiZ19saXN0X2ZyZWUgKGtleV9saXN0KTsiIDw8IGVuZGwgPDwKLSAgICAgIGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJmb3IgKGk9MDsgaTxrZXlfY291bnQ7ICsraSkiIDw8IGVuZGw7Ci0KLSAgICBzY29wZV91cChvdXQpOwotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgImVsZW0gPSBrZXlzW2ldOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgInZhbHVlID0gKGdwb2ludGVyKSBnX2hhc2hfdGFibGVfbG9va3VwICgoKEdIYXNoVGFibGUgKikgIiA8PAotICAgICAgICAgICAgICAgICAgIHByZWZpeCA8PCAiKSwgKGdwb2ludGVyKSBlbGVtKTsiIDw8IGVuZGwgPDwKLSAgICAgIGVuZGw7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50IChvdXQsICh0X3NldCAqKSB0dHlwZSwgdGVsZW1fcHRyICsgImVsZW0iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfcmV0KTsKLSAgICBzY29wZV9kb3duKG91dCk7Ci0KLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9zZXRfZW5kIChwcm90b2NvbCwgZXJyb3IpKSA8IDApIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHN0cmluZyBsZW5ndGggPSBwcmVmaXggKyAiLT5sZW4iOwotICAgIHN0cmluZyBpID0gdG1wKCJpIik7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbGlzdF9iZWdpbiAocHJvdG9jb2wsICIgPDwKLSAgICAgICAgICAgICAgICAgICB0eXBlX3RvX2VudW0gKCgodF9saXN0ICopIHR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PAotICAgICAgICAgICAgICAgICAgICIsIChnaW50MzIpICIgPDwgbGVuZ3RoIDw8ICIsIGVycm9yKSkgPCAwKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiZ3VpbnQgIiA8PCBpIDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiZm9yICgiPDwgaSA8PCAiPTA7ICIgPDwgaSA8PCAiPCIgPDwgbGVuZ3RoIDw8ICI7ICIgPDwgaSA8PAotICAgICAgICAgICAgICAgICAgICAgICAgICIrKykiIDw8IGVuZGw7Ci0KLSAgICBzY29wZV91cChvdXQpOwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQgKG91dCwgKHRfbGlzdCAqKSB0dHlwZSwgcHJlZml4LCBpLCBlcnJvcl9yZXQpOwotICAgIHNjb3BlX2Rvd24ob3V0KTsKLQotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2xpc3RfZW5kIChwcm90b2NvbCwgZXJyb3IpKSA8IDApIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGw7Ci0gIH0KLQotICBzY29wZV9kb3duKG91dCk7Ci19Ci0KLXZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAgKnRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yX3JldCkgewotICB0X2ZpZWxkIGtmaWVsZCAodG1hcC0+Z2V0X2tleV90eXBlKCksIGtleSk7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZCAob3V0LCAma2ZpZWxkLCAiIiwgIiIsIGVycm9yX3JldCk7Ci0KLSAgdF9maWVsZCB2ZmllbGQgKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2YWx1ZSk7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZCAob3V0LCAmdmZpZWxkLCAiIiwgIiIsIGVycm9yX3JldCk7Ci19Ci0KLXZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQgKnRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBlbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3JfcmV0KSB7Ci0gIHRfZmllbGQgZWZpZWxkICh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGVsZW1lbnQpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQgKG91dCwgJmVmaWVsZCwgIiIsICIiLCBlcnJvcl9yZXQpOwotfQotCi12b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0ICp0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yX3JldCkgewotICB0X3R5cGUgKnR0eXBlID0gdGxpc3QtPmdldF9lbGVtX3R5cGUoKTsKLQotICAvLyBjYXN0IHRvIG5vbi1jb25zdAotICBzdHJpbmcgY2FzdCA9ICIiOwotICBzdHJpbmcgbmFtZSA9ICJnX3B0cl9hcnJheV9pbmRleCAoKEdQdHJBcnJheSAqKSAiICsgbGlzdCArICIsICIKLSAgICAgICAgICAgICAgICArIGluZGV4ICsgIikiOwotCi0gIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSAqKSB0dHlwZSktPmdldF9iYXNlKCk7IAotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3QgZGV0ZXJtaW5lIGFycmF5IHR5cGUiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgbmFtZSA9ICJnX2FycmF5X2luZGV4ICgiICsgbGlzdCArICIsIGdib29sZWFuLCAiICsgaW5kZXggKyAiKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICBuYW1lID0gImdfYXJyYXlfaW5kZXggKCIgKyBsaXN0ICsgIiwgZ2ludDgsICIgKyBpbmRleCArICIpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgbmFtZSA9ICJnX2FycmF5X2luZGV4ICgiICsgbGlzdCArICIsIGdpbnQxNiwgIiArIGluZGV4ICsgIikiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICBuYW1lID0gImdfYXJyYXlfaW5kZXggKCIgKyBsaXN0ICsgIiwgZ2ludDMyLCAiICsgaW5kZXggKyAiKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgIG5hbWUgPSAiZ19hcnJheV9pbmRleCAoIiArIGxpc3QgKyAiLCBnaW50NjQsICIgKyBpbmRleCArICIpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgbmFtZSA9ICJnX2FycmF5X2luZGV4ICgiICsgbGlzdCArICIsIGdkb3VibGUsICIgKyBpbmRleCArICIpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgY2FzdCA9ICIoZ2NoYXIqKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBhcnJheSBpbmZvIGZvciB0eXBlIjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpIHx8IHR0eXBlLT5pc19zZXQoKSkgewotICAgIGNhc3QgPSAiKEdIYXNoVGFibGUqKSI7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHRfdHlwZSAqYmFzZSA9ICgodF9saXN0ICopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgaWYgKGJhc2UtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICBzd2l0Y2ggKCgodF9iYXNlX3R5cGUgKikgYmFzZSktPmdldF9iYXNlKCkpIHsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IGRldGVybWluZSBhcnJheSB0eXBlIjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICAgIGNhc3QgPSAiKEdBcnJheSopIjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgICAgY2FzdCA9ICIoR1B0ckFycmF5KikiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHRocm93ICJDb21waWxlciBlcnJvcjogbm8gYXJyYXkgaW5mbyBmb3IgdHlwZSI7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGNhc3QgPSAiKEdQdHJBcnJheSopIjsKLSAgICB9Ci0gIH0KLQotICB0X2ZpZWxkIGVmaWVsZCAodHR5cGUsICIoIiArIGNhc3QgKyBuYW1lICsgIikiKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkIChvdXQsICZlZmllbGQsICIiLCAiIiwgZXJyb3JfcmV0KTsKLX0KLQotLyogZGVzZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuICovCi12b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkICp0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgc3VmZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJvcl9yZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhbGxvY2F0ZSkgewotICB0X3R5cGUgKnR5cGUgPSBnZXRfdHJ1ZV90eXBlICh0ZmllbGQtPmdldF90eXBlKCkpOwotCi0gIGlmICh0eXBlLT5pc192b2lkKCkpIHsKLSAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIERFU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArCi0gICAgICBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gIH0KLQotICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSArIHN1ZmZpeDsKLQotICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdCAob3V0LCAodF9zdHJ1Y3QgKikgdHlwZSwgbmFtZSwgZXJyb3JfcmV0LCBhbGxvY2F0ZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIgKG91dCwgdHlwZSwgbmFtZSwgZXJyb3JfcmV0KTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlICopIHR5cGUpLT5nZXRfYmFzZSgpOwotICAgIGlmICh0YmFzZSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkcpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBuYW1lIDw8ICIgIT0gTlVMTCkiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJnX2ZyZWUoIiA8PCBuYW1lIDw8ICIpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCBuYW1lIDw8ICIgPSBOVUxMOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50KG91dCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfIjsKLQotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICBpZiAoKCh0X2Jhc2VfdHlwZSAqKSB0eXBlKS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgICAgICBvdXQgPDwgImJpbmFyeSAocHJvdG9jb2wsICZkYXRhLCAmbGVuIjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBvdXQgPDwgInN0cmluZyAocHJvdG9jb2wsICYiIDw8IG5hbWU7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIG91dCA8PCAiYm9vbCAocHJvdG9jb2wsICYiIDw8IG5hbWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICBvdXQgPDwgImJ5dGUgKHByb3RvY29sLCAmIiA8PCBuYW1lOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICBvdXQgPDwgImkxNiAocHJvdG9jb2wsICYiIDw8IG5hbWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgIG91dCA8PCAiaTMyIChwcm90b2NvbCwgJiIgPDwgbmFtZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgb3V0IDw8ICJpNjQgKHByb3RvY29sLCAmIiA8PCBuYW1lOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICBvdXQgPDwgImRvdWJsZSAocHJvdG9jb2wsICYiIDw8IG5hbWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBDIHJlYWRlciBmb3IgYmFzZSB0eXBlICIKLSAgICAgICAgICArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSAodGJhc2UpICsgbmFtZTsKLSAgICB9Ci0gICAgb3V0IDw8ICIsIGVycm9yKSkgPCAwKSIgPDwgZW5kbDsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgIGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGw7Ci0KLSAgICAvLyBsb2FkIHRoZSBieXRlIGFycmF5IHdpdGggdGhlIGRhdGEKLSAgICBpZiAodGJhc2UgPT0gdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HCi0gICAgICAgICYmICgodF9iYXNlX3R5cGUgKikgdHlwZSktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIgPSBnX2J5dGVfYXJyYXlfbmV3KCk7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgImdfYnl0ZV9hcnJheV9hcHBlbmQgKCIgPDwgbmFtZSA8PCAiLCAoZ3VpbnQ4ICopIGRhdGEsIChndWludCkgbGVuKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiZ19mcmVlIChkYXRhKTsiIDw8IGVuZGw7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHN0cmluZyB0ID0gdG1wICgiZWNhc3QiKTsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJnaW50MzIgIiA8PCB0IDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9pMzIgKHByb3RvY29sLCAmIiA8PCB0IDw8ICIsIGVycm9yKSkgPCAwKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCBuYW1lIDw8ICIgPSAoIiA8PCB0eXBlX25hbWUgKHR5cGUpIDw8ICIpIiA8PCB0IDw8ICI7IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIHByaW50ZiAoIkRPIE5PVCBLTk9XIEhPVyBUTyBERVNFUklBTElaRSBGSUVMRCAnJXMnIFRZUEUgJyVzJ1xuIiwKLSAgICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLCB0eXBlX25hbWUgKHR5cGUpLmNfc3RyKCkpOwotICB9Ci0KLSAgLy8gaWYgdGhlIHR5cGUgaXMgbm90IHJlcXVpcmVkIGFuZCB0aGlzIGlzIGEgdGhyaWZ0IHN0cnVjdCAobm8gcHJlZml4KSwKLSAgLy8gc2V0IHRoZSBpc3NldCB2YXJpYWJsZS4gIGlmIHRoZSB0eXBlIGlzIHJlcXVpcmVkLCB0aGVuIHNldCB0aGUKLSAgLy8gbG9jYWwgdmFyaWFibGUgaW5kaWNhdGluZyB0aGUgdmFsdWUgd2FzIHNldCwgc28gdGhhdCB3ZSBjYW4gZG8gICAgLy8gdmFsaWRhdGlvbiBsYXRlci4KLSAgaWYgKHRmaWVsZC0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQgJiYgcHJlZml4ICE9ICIiKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICJfX2lzc2V0XyIgPDwgdGZpZWxkLT5nZXRfbmFtZSgpIDw8IHN1ZmZpeCA8PCAiID0gVFJVRTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCAmJiBwcmVmaXggIT0gIiIpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiaXNzZXRfIiA8PCB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIiA9IFRSVUU7IiA8PCBlbmRsOwotICB9Ci19Ci0KLXZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QgKnRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJvcl9yZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYWxsb2NhdGUpIHsKLSAgc3RyaW5nIG5hbWVfdWMgPSB0b191cHBlcl9jYXNlKGluaXRpYWxfY2Fwc190b191bmRlcnNjb3Jlcyh0c3RydWN0LT5nZXRfbmFtZSgpKSk7Ci0gIGlmICh0c3RydWN0LT5pc194Y2VwdGlvbigpKSB7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiLyogVGhpcyBzdHJ1Y3QgaXMgYW4gZXhjZXB0aW9uICovIiA8PCBlbmRsOwotICAgIGFsbG9jYXRlID0gdHJ1ZTsKLSAgfQotCi0gIGlmIChhbGxvY2F0ZSkgewotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgImlmICggIiA8PCBwcmVmaXggPDwgIiAhPSBOVUxMKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiZ19vYmplY3RfdW5yZWYgKCIgPDwgcHJlZml4IDw8ICIpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gZ19vYmplY3RfbmV3ICgiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iIDw8IG5hbWVfdWMgPDwgIiwgTlVMTCk7IiA8PCBlbmRsOwotICB9Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9zdHJ1Y3RfcmVhZCAoVEhSSUZUX1NUUlVDVCAoIiA8PCBwcmVmaXggPDwgIiksIHByb3RvY29sLCBlcnJvcikpIDwgMCkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGlmIChhbGxvY2F0ZSkgewotICAgIGluZGVudChvdXQpIDw8ICJnX29iamVjdF91bnJlZiAoIiA8PCBwcmVmaXggPDwgIik7IiA8PCBlbmRsOwotICAgIGlmICh0c3RydWN0LT5pc194Y2VwdGlvbigpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiA9IE5VTEw7IiA8PCBlbmRsOwotICAgIH0KLSAgfQotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAicmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIgKG9mc3RyZWFtICZvdXQsIHRfdHlwZSAqdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsIGludCBlcnJvcl9yZXQpIHsKLSAgc2NvcGVfdXAob3V0KTsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiZ3VpbnQzMiBzaXplOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIlRocmlmdFR5cGUga2V5X3R5cGU7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiVGhyaWZ0VHlwZSB2YWx1ZV90eXBlOyIgPDwgZW5kbCA8PAotICAgICAgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIi8qIHJlYWQgdGhlIG1hcCBiZWdpbiBtYXJrZXIgKi8iIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX21hcF9iZWdpbiAocHJvdG9jb2wsICZrZXlfdHlwZSwgJnZhbHVlX3R5cGUsICZzaXplLCBlcnJvcikpIDwgMCkiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbCA8PAotICAgICAgZW5kbDsKLQotICAgIC8vIGl0ZXJhdGUgb3ZlciBtYXAgZWxlbWVudHMKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICIvKiBpdGVyYXRlIHRocm91Z2ggZWFjaCBvZiB0aGUgbWFwJ3MgZmllbGRzICovIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiZ3VpbnQzMiBpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQgKG91dCwgKHRfbWFwICopIHR0eXBlLCBwcmVmaXgsIGVycm9yX3JldCk7Ci0gICAgc2NvcGVfZG93bihvdXQpOwotICAgIG91dCA8PCBlbmRsOwotICAKLSAgICAvLyByZWFkIG1hcCBlbmQKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICIvKiByZWFkIHRoZSBtYXAgZW5kIG1hcmtlciAqLyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfbWFwX2VuZCAocHJvdG9jb2wsIGVycm9yKSkgPCAwKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgImd1aW50MzIgc2l6ZTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJUaHJpZnRUeXBlIGVsZW1lbnRfdHlwZTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX3NldF9iZWdpbiAocHJvdG9jb2wsICZlbGVtZW50X3R5cGUsICZzaXplLCBlcnJvcikpIDwgMCkiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbCA8PAotICAgICAgZW5kbDsKLQotICAgIC8vIGl0ZXJhdGUgb3ZlciB0aGUgZWxlbWVudHMKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICIvKiBpdGVyYXRlIHRocm91Z2ggdGhlIHNldCBlbGVtZW50cyAqLyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImd1aW50MzIgaTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgKytpKSIgPDwgZW5kbDsKLQotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQgKG91dCwgKHRfc2V0ICopIHR0eXBlLCBwcmVmaXgsIGVycm9yX3JldCk7Ci0gICAgc2NvcGVfZG93bihvdXQpOwotCi0gICAgLy8gcmVhZCBzZXQgZW5kCi0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9zZXRfZW5kIChwcm90b2NvbCwgZXJyb3IpKSA8IDApIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGwgPDwKLSAgICAgIGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgImd1aW50MzIgc2l6ZTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJUaHJpZnRUeXBlIGVsZW1lbnRfdHlwZTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2xpc3RfYmVnaW4gKHByb3RvY29sLCAmZWxlbWVudF90eXBlLCAmc2l6ZSwgZXJyb3IpKSA8IDApIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGwgPDwKLSAgICAgIGVuZGw7Ci0KLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICIvKiBpdGVyYXRlIHRocm91Z2ggbGlzdCBlbGVtZW50cyAqLyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImd1aW50MzIgaTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSIgPDwgZW5kbDsKLQotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50IChvdXQsICh0X2xpc3QgKikgdHR5cGUsIHByZWZpeCwgImkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfcmV0KTsKLSAgICBzY29wZV9kb3duKG91dCk7Ci0KLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2xpc3RfZW5kIChwcm90b2NvbCwgZXJyb3IpKSA8IDApIiA8PCBlbmRsIDw8IAotICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsOwotICB9Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotfQotCi12b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6ZGVjbGFyZV9sb2NhbF92YXJpYWJsZShvZnN0cmVhbSAmb3V0LCB0X3R5cGUgKnR0eXBlLCBzdHJpbmcgJm5hbWUpIHsKLSAgc3RyaW5nIHRuYW1lID0gdHlwZV9uYW1lICh0dHlwZSk7Ci0KLSAgLyogSWYgdGhlIGdpdmVuIHR5cGUgaXMgYSB0eXBlZGVmLCBmaW5kIGl0cyB1bmRlcmx5aW5nIHR5cGUgc28gd2UKLSAgICAgY2FuIGNvcnJlY3RseSBkZXRlcm1pbmUgaG93IHRvIGdlbmVyYXRlIGEgcG9pbnRlciB0byBpdCAqLwotICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOwotCi0gIHN0cmluZyBwdHIgPSB0dHlwZS0+aXNfc3RyaW5nKCkgfHwgIXR0eXBlLT5pc19iYXNlX3R5cGUoKSA/ICIiIDogIioiOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICB0X21hcCAqdG1hcCA9ICh0X21hcCAqKXR0eXBlOwotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgdG5hbWUgPDwgcHRyIDw8ICIgIiA8PCBuYW1lIDw8ICIgPSAiIDw8Ci0gICAgICBnZW5lcmF0ZV9uZXdfaGFzaF9mcm9tX3R5cGUodG1hcC0+Z2V0X2tleV90eXBlKCksIHRtYXAtPmdldF92YWxfdHlwZSgpKSA8PAotICAgICAgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgdG5hbWUgPDwgcHRyIDw8ICIgIiA8PCBuYW1lIDw8ICI7IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIG91dCA8PAotICAgIGluZGVudCgpIDw8IHRuYW1lIDw8IHB0ciA8PCAiICIgPDwgbmFtZSA8PCAocHRyICE9ICIiID8gIiA9IGdfbmV3ICgiICsgdG5hbWUgKyAiLCAxKSIgOiAiID0gTlVMTCIpIDw8ICI7IiA8PCBlbmRsOwotICB9Ci19Ci0KLQotdm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAgKnRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3JfcmV0KSB7Ci0gIHRfdHlwZSAqdGtleSA9IHRtYXAtPmdldF9rZXlfdHlwZSgpOwotICB0X3R5cGUgKnR2YWwgPSB0bWFwLT5nZXRfdmFsX3R5cGUoKTsKLSAgc3RyaW5nIGtleW5hbWUgPSB0bXAoImtleSIpOwotICBzdHJpbmcgdmFsbmFtZSA9IHRtcCgidmFsIik7Ci0KLSAgZGVjbGFyZV9sb2NhbF92YXJpYWJsZShvdXQsIHRrZXksIGtleW5hbWUpOwotICBkZWNsYXJlX2xvY2FsX3ZhcmlhYmxlKG91dCwgdHZhbCwgdmFsbmFtZSk7Ci0KLSAgLyogSWYgZWl0aGVyIHRoZSBrZXkgb3IgdmFsdWUgdHlwZSBpcyBhIHR5cGVkZWYsIGZpbmQgaXRzIHVuZGVybHlpbmcKLSAgICAgdHlwZSBzbyB3ZSBjYW4gY29ycmVjdGx5IGRldGVybWluZSBob3cgdG8gZ2VuZXJhdGUgYSBwb2ludGVyIHRvCi0gICAgIGl0ICovCi0gIHRrZXkgPSBnZXRfdHJ1ZV90eXBlKHRrZXkpOwotICB0dmFsID0gZ2V0X3RydWVfdHlwZSh0dmFsKTsKLQotICBzdHJpbmcgdGtleV9wdHIgPSB0a2V5LT5pc19zdHJpbmcoKSB8fCAhdGtleS0+aXNfYmFzZV90eXBlKCkgPyAiIiA6ICIqIjsKLSAgc3RyaW5nIHR2YWxfcHRyID0gdHZhbC0+aXNfc3RyaW5nKCkgfHwgIXR2YWwtPmlzX2Jhc2VfdHlwZSgpID8gIiIgOiAiKiI7Ci0KLSAgLy8gZGVzZXJpYWxpemUgdGhlIGZpZWxkcyBvZiB0aGUgbWFwIGVsZW1lbnQKLSAgdF9maWVsZCBma2V5ICh0a2V5LCB0a2V5X3B0ciArIGtleW5hbWUpOwotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZCAob3V0LCAmZmtleSwgIiIsICIiLCBlcnJvcl9yZXQpOwotICB0X2ZpZWxkIGZ2YWwgKHR2YWwsIHR2YWxfcHRyICsgdmFsbmFtZSk7Ci0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkIChvdXQsICZmdmFsLCAiIiwgIiIsIGVycm9yX3JldCk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAiZ19oYXNoX3RhYmxlX2luc2VydCAoKEdIYXNoVGFibGUgKikiIDw8IHByZWZpeCA8PCAiLCAoZ3BvaW50ZXIpICIgPDwga2V5bmFtZSA8PCAiLCAoZ3BvaW50ZXIpICIgPDwgdmFsbmFtZSA8PCAiKTsiIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0ICp0c2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yX3JldCkgewotICB0X3R5cGUgKnRlbGVtID0gdHNldC0+Z2V0X2VsZW1fdHlwZSgpOwotICBzdHJpbmcgZWxlbSA9IHRtcCAoIl9lbGVtIik7Ci0gIHN0cmluZyB0ZWxlbV9wdHIgPSB0ZWxlbS0+aXNfc3RyaW5nKCkgfHwgIXRlbGVtLT5pc19iYXNlX3R5cGUoKSA/ICIiIDogIioiOwotCi0gIGRlY2xhcmVfbG9jYWxfdmFyaWFibGUob3V0LCB0ZWxlbSwgZWxlbSk7Ci0KLSAgdF9maWVsZCBmZWxlbSAodGVsZW0sIHRlbGVtX3B0ciArIGVsZW0pOwotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZCAob3V0LCAmZmVsZW0sICIiLCAiIiwgZXJyb3JfcmV0KTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICJnX2hhc2hfdGFibGVfaW5zZXJ0ICgoR0hhc2hUYWJsZSAqKSAiIDw8IHByZWZpeCA8PCAiLCAoZ3BvaW50ZXIpICIgPDwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW0gPDwgIiwgKGdwb2ludGVyKSAxKTsiIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0ICp0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3JfcmV0KSB7Ci0gICh2b2lkKSBpbmRleDsKLSAgdF90eXBlICp0dHlwZSA9IHRsaXN0LT5nZXRfZWxlbV90eXBlKCk7Ci0gIHN0cmluZyBlbGVtID0gdG1wICgiX2VsZW0iKTsKLSAgc3RyaW5nIHRlbGVtX3B0ciA9IHR0eXBlLT5pc19zdHJpbmcoKSB8fCAhdHR5cGUtPmlzX2Jhc2VfdHlwZSgpID8gIiIgOiAiKiI7Ci0KLSAgZGVjbGFyZV9sb2NhbF92YXJpYWJsZShvdXQsIHR0eXBlLCBlbGVtKTsKLQotICB0X2ZpZWxkIGZlbGVtICh0dHlwZSwgdGVsZW1fcHRyICsgZWxlbSk7Ci0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkIChvdXQsICZmZWxlbSwgIiIsICIiLCBlcnJvcl9yZXQpOwotCi0gIGluZGVudChvdXQpOwotCi0gIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSAqKSB0dHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBkZXRlcm1pbmUgYXJyYXkgdHlwZSI7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgb3V0IDw8ICJnX3B0cl9hcnJheV9hZGQgKCIgPDwgcHJlZml4IDw8ICIsICIgPDwgZWxlbSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICBvdXQgPDwgImdfYXJyYXlfYXBwZW5kX3ZhbHMgKCIgPDwgcHJlZml4IDw8ICIsICIgPDwgZWxlbSA8PCAiLCAxKTsiIDw8IGVuZGw7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gYXJyYXkgaW5mbyBmb3IgdHlwZSI7Ci0gICAgfQotICB9Ci0gIG91dCA8PCAiZ19wdHJfYXJyYXlfYWRkICgiIDw8IHByZWZpeCA8PCAiLCAiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOwotfQotCi1zdHJpbmcgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9mcmVlX2Z1bmNfZnJvbV90eXBlICh0X3R5cGUgKiB0dHlwZSkgewotICBpZiAodHR5cGUgPT0gTlVMTCkKLSAgICByZXR1cm4gIk5VTEwiOwotCi0gIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSAqKSB0dHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBkZXRlcm1pbmUgaGFzaCB0eXBlIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgcmV0dXJuICJnX2ZyZWUiOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIGlmICgoKHRfYmFzZV90eXBlICopIHR0eXBlKS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgICAgICAgIHJldHVybiAidGhyaWZ0X3N0cmluZ19mcmVlIjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gImdfZnJlZSI7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGhhc2ggdGFibGUgaW5mbyBmb3IgdHlwZSI7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gIk5VTEwiOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSB8fCB0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gIihHRGVzdHJveU5vdGlmeSkgZ19oYXNoX3RhYmxlX2Rlc3Ryb3kiOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zdHJ1Y3QoKSkgewotICAgIHJldHVybiAiZ19vYmplY3RfdW5yZWYiOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICB0X3R5cGUgKmV0eXBlID0gKCh0X2xpc3QgKikgdHR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgaWYgKGV0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUgKikgZXR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3QgZGV0ZXJtaW5lIGFycmF5IHR5cGUiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgICAgcmV0dXJuICIoR0Rlc3Ryb3lOb3RpZnkpIGdfYXJyYXlfdW5yZWYiOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgICByZXR1cm4gIihHRGVzdHJveU5vdGlmeSkgZ19wdHJfYXJyYXlfdW5yZWYiOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gYXJyYXkgaW5mbyBmb3IgdHlwZSI7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmIChldHlwZS0+aXNfY29udGFpbmVyKCkgfHwgZXR5cGUtPmlzX3N0cnVjdCgpKSB7Ci0gICAgICByZXR1cm4gIihHRGVzdHJveU5vdGlmeSkgZ19wdHJfYXJyYXlfdW5yZWYiOzsKLSAgICB9IGVsc2UgaWYgKGV0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIHJldHVybiAiKEdEZXN0cm95Tm90aWZ5KSBnX2FycmF5X3VucmVmIjsKLSAgICB9Ci0gICAgcHJpbnRmKCJUeXBlIG5vdCBleHBlY3RlZCBpbnNpZGUgdGhlIGFycmF5OiAlc1xuIiwgZXR5cGUtPmdldF9uYW1lKCkuY19zdHIoKSk7Ci0gICAgdGhyb3cgIlR5cGUgbm90IGV4cGVjdGVkIGluc2lkZSBhcnJheSIgOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc190eXBlZGVmKCkpIHsKLSAgICByZXR1cm4gZ2VuZXJhdGVfZnJlZV9mdW5jX2Zyb21fdHlwZSgoKHRfdHlwZWRlZiAqKSB0dHlwZSktPmdldF90eXBlKCkpOwotICB9Ci0gIHByaW50ZigiVHlwZSBub3QgZXhwZWN0ZWQ6ICVzXG4iLCB0dHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKLSAgdGhyb3cgIlR5cGUgbm90IGV4cGVjdGVkIjsKLX0KLQotc3RyaW5nIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaGFzaF9mdW5jX2Zyb21fdHlwZSAodF90eXBlICogdHR5cGUpIHsKLSAgaWYgKHR0eXBlID09IE5VTEwpCi0gICAgcmV0dXJuICJOVUxMIjsKLQotICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUgKikgdHR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3QgZGV0ZXJtaW5lIGhhc2ggdHlwZSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgcmV0dXJuICJnX2ludF9oYXNoIjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICByZXR1cm4gImdfaW50NjRfaGFzaCI7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgcmV0dXJuICJnX2RvdWJsZV9oYXNoIjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICByZXR1cm4gImdfc3RyX2hhc2giOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBoYXNoIHRhYmxlIGluZm8gZm9yIHR5cGUiOwotICAgIH0KLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJnX2RpcmVjdF9oYXNoIjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfY29udGFpbmVyKCkgfHwgdHR5cGUtPmlzX3N0cnVjdCgpKSB7Ci0gICAgcmV0dXJuICJnX2RpcmVjdF9oYXNoIjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfdHlwZWRlZigpKSB7Ci0gICAgcmV0dXJuIGdlbmVyYXRlX2hhc2hfZnVuY19mcm9tX3R5cGUoKCh0X3R5cGVkZWYgKikgdHR5cGUpLT5nZXRfdHlwZSgpKTsKLSAgfQotICBwcmludGYoIlR5cGUgbm90IGV4cGVjdGVkOiAlc1xuIiwgdHR5cGUtPmdldF9uYW1lKCkuY19zdHIoKSk7Ci0gIHRocm93ICJUeXBlIG5vdCBleHBlY3RlZCI7Ci19Ci0KLXN0cmluZyB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX2NtcF9mdW5jX2Zyb21fdHlwZSAodF90eXBlICogdHR5cGUpIHsKLSAgaWYgKHR0eXBlID09IE5VTEwpCi0gICAgcmV0dXJuICJOVUxMIjsKLQotICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUgKikgdHR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3QgZGV0ZXJtaW5lIGhhc2ggdHlwZSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgcmV0dXJuICJnX2ludF9lcXVhbCI7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgcmV0dXJuICJnX2ludDY0X2VxdWFsIjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICByZXR1cm4gImdfZG91YmxlX2VxdWFsIjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICByZXR1cm4gImdfc3RyX2VxdWFsIjsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gaGFzaCB0YWJsZSBpbmZvIGZvciB0eXBlIjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAiZ19kaXJlY3RfZXF1YWwiOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19jb250YWluZXIoKSB8fCB0dHlwZS0+aXNfc3RydWN0KCkpIHsKLSAgICByZXR1cm4gImdfZGlyZWN0X2VxdWFsIjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfdHlwZWRlZigpKSB7Ci0gICAgcmV0dXJuIGdlbmVyYXRlX2NtcF9mdW5jX2Zyb21fdHlwZSgoKHRfdHlwZWRlZiAqKSB0dHlwZSktPmdldF90eXBlKCkpOwotICB9Ci0gIHByaW50ZigiVHlwZSBub3QgZXhwZWN0ZWQ6ICVzXG4iLCB0dHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKLSAgdGhyb3cgIlR5cGUgbm90IGV4cGVjdGVkIjsKLX0KLQotc3RyaW5nIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbmV3X2hhc2hfZnJvbV90eXBlICh0X3R5cGUgKiBrZXksIHRfdHlwZSAqdmFsdWUpIHsKLSAgc3RyaW5nIGhhc2hfZnVuYyA9IGdlbmVyYXRlX2hhc2hfZnVuY19mcm9tX3R5cGUoa2V5KTsKLSAgc3RyaW5nIGNtcF9mdW5jID0gZ2VuZXJhdGVfY21wX2Z1bmNfZnJvbV90eXBlKGtleSk7Ci0gIHN0cmluZyBrZXlfZnJlZV9mdW5jID0gZ2VuZXJhdGVfZnJlZV9mdW5jX2Zyb21fdHlwZShrZXkpOwotICBzdHJpbmcgdmFsdWVfZnJlZV9mdW5jID0gZ2VuZXJhdGVfZnJlZV9mdW5jX2Zyb21fdHlwZSh2YWx1ZSk7Ci0KLSAgcmV0dXJuICJnX2hhc2hfdGFibGVfbmV3X2Z1bGwgKCIgKyBoYXNoX2Z1bmMgKyAiLCAiICsgY21wX2Z1bmMgKyAiLCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleV9mcmVlX2Z1bmMgKyAiLCAiICsgdmFsdWVfZnJlZV9mdW5jICsgIik7IjsKLX0KLQotc3RyaW5nIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbmV3X2FycmF5X2Zyb21fdHlwZSh0X3R5cGUgKiB0dHlwZSkgewotICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUgKikgdHR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3QgZGV0ZXJtaW5lIGFycmF5IHR5cGUiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgcmV0dXJuICJnX2FycmF5X25ldyAoMCwgMSwgc2l6ZW9mIChnYm9vbGVhbikpOyI7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgIHJldHVybiAiZ19hcnJheV9uZXcgKDAsIDEsIHNpemVvZiAoZ2ludDgpKTsiOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgIHJldHVybiAiZ19hcnJheV9uZXcgKDAsIDEsIHNpemVvZiAoZ2ludDE2KSk7IjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICByZXR1cm4gImdfYXJyYXlfbmV3ICgwLCAxLCBzaXplb2YgKGdpbnQzMikpOyI7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgcmV0dXJuICJnX2FycmF5X25ldyAoMCwgMSwgc2l6ZW9mIChnaW50NjQpKTsiOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIHJldHVybiAiZ19hcnJheV9uZXcgKDAsIDEsIHNpemVvZiAoZ2RvdWJsZSkpOyI7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgcmV0dXJuICJnX3B0cl9hcnJheV9uZXdfd2l0aF9mcmVlX2Z1bmMgKGdfZnJlZSk7IjsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gYXJyYXkgaW5mbyBmb3IgdHlwZSI7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gImdfYXJyYXlfbmV3ICgwLCAxLCBzaXplb2YgKGdpbnQzMikpOyI7Ci0gIH0gZWxzZSB7Ci0gICAgc3RyaW5nIGZyZWVfZnVuYyA9IGdlbmVyYXRlX2ZyZWVfZnVuY19mcm9tX3R5cGUodHR5cGUpOwotICAgIHJldHVybiAiZ19wdHJfYXJyYXlfbmV3X3dpdGhfZnJlZV9mdW5jICgiICsgZnJlZV9mdW5jICsgIik7IjsKLSAgfQotCi0gIHJldHVybiAiZ19wdHJfYXJyYXlfbmV3KCk7IjsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBVVElMSVRZIEZVTkNUSU9OUyAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioKLSAqIFVwcGVyIGNhc2UgYSBzdHJpbmcuICBXcmFwcyBib29zdCdzIHN0cmluZyB1dGlsaXR5LgotICovCi1zdHJpbmcgdG9fdXBwZXJfY2FzZShzdHJpbmcgbmFtZSkgewotICBzdHJpbmcgcyAobmFtZSk7Ci0gIHN0ZDo6dHJhbnNmb3JtIChzLmJlZ2luKCksIHMuZW5kKCksIHMuYmVnaW4oKSwgOjp0b3VwcGVyKTsKLSAgcmV0dXJuIHM7Ci0vLyAgcmV0dXJuIGJvb3N0Ojp0b191cHBlcl9jb3B5IChuYW1lKTsKLX0KLQotLyoqCi0gKiBMb3dlciBjYXNlIGEgc3RyaW5nLiAgV3JhcHMgYm9vc3QncyBzdHJpbmcgdXRpbGl0eS4KLSAqLwotc3RyaW5nIHRvX2xvd2VyX2Nhc2Uoc3RyaW5nIG5hbWUpIHsKLSAgc3RyaW5nIHMgKG5hbWUpOwotICBzdGQ6OnRyYW5zZm9ybSAocy5iZWdpbigpLCBzLmVuZCgpLCBzLmJlZ2luKCksIDo6dG9sb3dlcik7Ci0gIHJldHVybiBzOwotLy8gIHJldHVybiBib29zdDo6dG9fbG93ZXJfY29weSAobmFtZSk7Ci19Ci0KLS8qKgotICogTWFrZXMgYSBzdHJpbmcgZnJpZW5kbHkgdG8gQyBjb2RlIHN0YW5kYXJkcyBieSBsb3dlcmNhc2luZyBhbmQgYWRkaW5nCi0gKiB1bmRlcnNjb3Jlcywgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIuICBGb3IgZXhhbXBsZToKLSAqCi0gKiBJbnB1dDogIlpvbWdDYW1lbENhc2UiCi0gKiBPdXRwdXQ6ICJ6b21nX2NhbWVsX2Nhc2UiCi0gKi8KLXN0cmluZyBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoc3RyaW5nIG5hbWUpIHsKLSAgc3RyaW5nIHJldDsKLSAgY29uc3QgY2hhciAqdG1wID0gbmFtZS5jX3N0cigpOwotICBpbnQgcG9zID0gMDsKLQotICAvKiB0aGUgZmlyc3QgY2hhcmFjdGVyIGlzbid0IHVuZGVyc2NvcmVkIGlmIHVwcGVyY2FzZSwganVzdCBsb3dlcmNhc2VkICovCi0gIHJldCArPSB0b2xvd2VyICh0bXBbcG9zXSk7Ci0gIHBvcysrOwotICBmb3IgKHVuc2lnbmVkIGludCBpID0gcG9zOyBpIDwgbmFtZS5sZW5ndGgoKTsgaSsrKSB7Ci0gICAgY2hhciBsYyA9IHRvbG93ZXIgKHRtcFtpXSk7IAotICAgIGlmIChsYyAhPSB0bXBbaV0pIHsKLSAgICAgIHJldCArPSAnXyc7Ci0gICAgfQotICAgIHJldCArPSBsYzsKLSAgfQotCi0gIHJldHVybiByZXQ7Ci19Ci0KLS8qKgotICogUGVyZm9ybXMgdGhlIHJldmVyc2Ugb3BlcmF0aW9uIG9mIGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlczogVGhlIGZpcnN0Ci0gKiBjaGFyYWN0ZXIgb2YgdGhlIHN0cmluZyBpcyBtYWRlIHVwcGVyY2FzZSwgYWxvbmcgd2l0aCBlYWNoIGNoYXJhY3RlciB0aGF0Ci0gKiBmb2xsb3dzIGFuIHVuZGVyc2NvcmUgKHdoaWNoIGlzIHJlbW92ZWQpLiBVc2VmdWwgZm9yIGNvbnZlcnRpbmcgVGhyaWZ0Ci0gKiBzZXJ2aWNlLW1ldGhvZCBuYW1lcyBpbnRvIEdPYmplY3Qtc3R5bGUgY2xhc3MgbmFtZXMuCi0gKgotICogSW5wdXQ6ICJ6b21nX2NhbWVsX2Nhc2UiCi0gKiBPdXRwdXQ6ICJab21nQ2FtZWxDYXNlIgotICovCi1zdHJpbmcgdW5kZXJzY29yZXNfdG9faW5pdGlhbF9jYXBzKHN0cmluZyBuYW1lKSB7Ci0gIHN0cmluZyByZXQ7Ci0gIGNvbnN0IGNoYXIgKnRtcCA9IG5hbWUuY19zdHIoKTsKLSAgYm9vbCB1cHBlcmNhc2VfbmV4dCA9IHRydWU7Ci0KLSAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBuYW1lLmxlbmd0aCgpOyBpKyspIHsKLSAgICBjaGFyIGMgPSB0bXBbaV07Ci0gICAgaWYgKGMgPT0gJ18nKSB7Ci0gICAgICB1cHBlcmNhc2VfbmV4dCA9IHRydWU7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgaWYgKHVwcGVyY2FzZV9uZXh0KSB7Ci0gICAgICAgIHJldCArPSB0b3VwcGVyIChjKTsKLSAgICAgICAgdXBwZXJjYXNlX25leHQgPSBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICByZXQgKz0gYzsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICByZXR1cm4gcmV0OwotfQotCi0vKiByZWdpc3RlciB0aGlzIGdlbmVyYXRvciB3aXRoIHRoZSBtYWluIHByb2dyYW0gKi8KLVRIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoY19nbGliLCAiQywgdXNpbmcgR0xpYiIsICIiKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2NvY29hX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9jb2NvYV9nZW5lcmF0b3IuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3NjVmN2QuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2NvY29hX2dlbmVyYXRvci5jYworKysgL2Rldi9udWxsCkBAIC0xLDI3MjggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPGZzdHJlYW0+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgInRfb29wX2dlbmVyYXRvci5oIgotI2luY2x1ZGUgInBsYXRmb3JtLmgiCi0KLXVzaW5nIHN0ZDo6bWFwOwotdXNpbmcgc3RkOjpvZnN0cmVhbTsKLXVzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKLXVzaW5nIHN0ZDo6c3RyaW5nOwotdXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07Ci11c2luZyBzdGQ6OnZlY3RvcjsKLQotc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsID0gIlxuIjsgIC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKLQotLyoqCi0gKiBPYmplY3RpdmUtQyBjb2RlIGdlbmVyYXRvci4KLSAqCi0gKiBtb3N0bHkgY29weS9wYXN0aW5nL3R3ZWFraW5nIGZyb20gbWNzbGVlJ3Mgd29yay4KLSAqLwotY2xhc3MgdF9jb2NvYV9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKLSBwdWJsaWM6Ci0gIHRfY29jb2FfZ2VuZXJhdG9yKAotICAgICAgdF9wcm9ncmFtKiBwcm9ncmFtLAotICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKLSAgICA6IHRfb29wX2dlbmVyYXRvcihwcm9ncmFtKQotICB7Ci0gICAgKHZvaWQpIG9wdGlvbl9zdHJpbmc7Ci0gICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKLSAgICAKLSAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgibG9nX3VuZXhwZWN0ZWQiKTsKLSAgICBsb2dfdW5leHBlY3RlZF8gPSAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7ICAgIAotICAgIAotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJ2YWxpZGF0ZV9yZXF1aXJlZCIpOwotICAgIHZhbGlkYXRlX3JlcXVpcmVkXyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsgICAgCi0gICAgCi0gICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tY29jb2EiOwotICB9Ci0KLSAgLyoqCi0gICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKLSAgICovCi0KLSAgdm9pZCBpbml0X2dlbmVyYXRvcigpOwotICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOwotCi0gIHZvaWQgZ2VuZXJhdGVfY29uc3RzKHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpOwotCi0gIC8qKgotICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZiAodF90eXBlZGVmKiAgdHR5cGVkZWYpOwotICB2b2lkIGdlbmVyYXRlX2VudW0gICAgKHRfZW51bSogICAgIHRlbnVtKTsKLSAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QgICh0X3N0cnVjdCogICB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogICB0eGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UgKHRfc2VydmljZSogIHRzZXJ2aWNlKTsKLQotICB2b2lkIHByaW50X2NvbnN0X3ZhbHVlKHN0ZDo6b2ZzdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwgYm9vbCBkZWZ2YWw9ZmFsc2UsIGJvb2wgaXNfcHJvcGVydHk9ZmFsc2UpOwotICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUob2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwgYm9vbCBjb250YWluZXJpemVfaXQ9ZmFsc2UpOwotCi0gIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2ludGVyZmFjZShzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX3hjZXB0aW9uPWZhbHNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW1wbGVtZW50YXRpb24oc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc194Y2VwdGlvbj1mYWxzZSwgYm9vbCBpc19yZXN1bHQ9ZmFsc2UpOwotICB2b2lkIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbml0aWFsaXplcl9zaWduYXR1cmUoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbml0X3dpdGhfY29kZXJfbWV0aG9kKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9lbmNvZGVfd2l0aF9jb2Rlcl9tZXRob2Qob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2ZpZWxkX2FjY2Vzc29yX2RlY2xhcmF0aW9ucyhzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfZmllbGRfYWNjZXNzb3JfaW1wbGVtZW50YXRpb25zKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9yZWFkZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X3Jlc3VsdF93cml0ZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X3dyaXRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfdmFsaWRhdG9yKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9kZXNjcmlwdGlvbihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLQotICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9yZXN1bHRfaGVscGVyX3N0cnVjdF90eXBlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0gIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX2FyZ3NfaGVscGVyX3N0cnVjdF90eXBlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotCi0gIC8qKgotICAgKiBTZXJ2aWNlLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9wcm90b2NvbCAoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9pbnRlcmZhY2UgKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfaW1wbGVtZW50YXRpb24gKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9zZXJ2ZXJfaW50ZXJmYWNlIChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX2NvY29hX3NlcnZpY2Vfc2VydmVyX2ltcGxlbWVudGF0aW9uIChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfaGVscGVycyAgICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCAgICAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIgICAgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24gICh0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotCi0gIC8qKgotICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZCAgICAgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqICAgIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkTmFtZSk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3QgICAgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiAgIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqICAgICB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudCAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiAgICAgIHRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogICAgICB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudCAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiAgICAgdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkICAgICAgICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiAgICB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdCAgICAgICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogICB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZmllbGROYW1lPSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIgICAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiAgICAgdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50ICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogICAgICB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG1hcCk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiAgICAgIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiAgICAgdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGxpc3ROYW1lKTsKLQotICAvKioKLSAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKLSAgICovCi0KLSAgc3RkOjpzdHJpbmcgY29jb2FfcHJlZml4KCk7Ci0gIHN0ZDo6c3RyaW5nIGNvY29hX2ltcG9ydHMoKTsKLSAgc3RkOjpzdHJpbmcgY29jb2FfdGhyaWZ0X2ltcG9ydHMoKTsKLSAgc3RkOjpzdHJpbmcgdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsIGJvb2wgY2xhc3NfcmVmPWZhbHNlKTsKLSAgc3RkOjpzdHJpbmcgYmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGUqIHRiYXNlKTsKLSAgc3RkOjpzdHJpbmcgZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQpOwotICBzdGQ6OnN0cmluZyBkZWNsYXJlX3Byb3BlcnR5KHRfZmllbGQqIHRmaWVsZCk7Ci0gIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KTsKLSAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOwotICBzdGQ6OnN0cmluZyBmb3JtYXRfc3RyaW5nX2Zvcl90eXBlKHRfdHlwZSogdHlwZSk7Ci0gIHN0ZDo6c3RyaW5nIGNhbGxfZmllbGRfc2V0dGVyKHRfZmllbGQqIHRmaWVsZCwgc3RkOjpzdHJpbmcgZmllbGROYW1lKTsKLSAgc3RkOjpzdHJpbmcgY29udGFpbmVyaXplKHRfdHlwZSAqIHR0eXBlLCBzdGQ6OnN0cmluZyBmaWVsZE5hbWUpOwotICBzdGQ6OnN0cmluZyBkZWNvbnRhaW5lcml6ZSh0X2ZpZWxkICogdGZpZWxkLCBzdGQ6OnN0cmluZyBmaWVsZE5hbWUpOwotCi0gIGJvb2wgdHlwZV9jYW5fYmVfbnVsbCh0X3R5cGUqIHR0eXBlKSB7Ci0gICAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKLQotICAgIHJldHVybgotICAgICAgdHR5cGUtPmlzX2NvbnRhaW5lcigpIHx8Ci0gICAgICB0dHlwZS0+aXNfc3RydWN0KCkgfHwKLSAgICAgIHR0eXBlLT5pc194Y2VwdGlvbigpIHx8Ci0gICAgICB0dHlwZS0+aXNfc3RyaW5nKCk7Ci0gIH0KLQotIHByaXZhdGU6Ci0KLSAgc3RkOjpzdHJpbmcgY29jb2FfcHJlZml4XzsKLSAgc3RkOjpzdHJpbmcgY29uc3RhbnRzX2RlY2xhcmF0aW9uc187Ci0KLSAgLyoqCi0gICAqIEZpbGUgc3RyZWFtcwotICAgKi8KLQotICBzdGQ6Om9mc3RyZWFtIGZfaGVhZGVyXzsKLSAgc3RkOjpvZnN0cmVhbSBmX2ltcGxfOwotCi0gIGJvb2wgbG9nX3VuZXhwZWN0ZWRfOwotICBib29sIHZhbGlkYXRlX3JlcXVpcmVkXzsKLX07Ci0KLQotLyoqCi0gKiBQcmVwYXJlcyBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAotICogc3RyZWFtcy4KLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQotICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOwotICBjb2NvYV9wcmVmaXhfID0gcHJvZ3JhbV8tPmdldF9uYW1lc3BhY2UoImNvY29hIik7Ci0KLSAgLy8gd2UgaGF2ZSBhIC5oIGhlYWRlciBmaWxlLi4uCi0gIHN0cmluZyBmX2hlYWRlcl9uYW1lID0gcHJvZ3JhbV9uYW1lXysiLmgiOwotICBzdHJpbmcgZl9oZWFkZXJfZnVsbG5hbWUgPSBnZXRfb3V0X2RpcigpK2ZfaGVhZGVyX25hbWU7Ci0gIGZfaGVhZGVyXy5vcGVuKGZfaGVhZGVyX2Z1bGxuYW1lLmNfc3RyKCkpOwotCi0gIGZfaGVhZGVyXyA8PAotICAgIGF1dG9nZW5fY29tbWVudCgpIDw8Ci0gICAgZW5kbDsKLQotICBmX2hlYWRlcl8gPDwKLSAgICBjb2NvYV9pbXBvcnRzKCkgPDwKLSAgICBjb2NvYV90aHJpZnRfaW1wb3J0cygpOwotCi0gIC8vIC4uLmFuZCBhIC5tIGltcGxlbWVudGF0aW9uIGZpbGUKLSAgc3RyaW5nIGZfaW1wbF9uYW1lID0gZ2V0X291dF9kaXIoKStwcm9ncmFtX25hbWVfKyIubSI7Ci0gIGZfaW1wbF8ub3BlbihmX2ltcGxfbmFtZS5jX3N0cigpKTsKLQotICBmX2ltcGxfIDw8Ci0gICAgYXV0b2dlbl9jb21tZW50KCkgPDwKLSAgICBlbmRsOwotCi0gIGZfaW1wbF8gPDwKLSAgICBjb2NvYV9pbXBvcnRzKCkgPDwKLSAgICBjb2NvYV90aHJpZnRfaW1wb3J0cygpIDw8Ci0gICAgIiNpbXBvcnQgXCIiIDw8IGZfaGVhZGVyX25hbWUgPDwgIlwiIiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotfQotCi0vKioKLSAqIFByaW50cyBzdGFuZGFyZCBDb2NvYSBpbXBvcnRzCi0gKgotICogQHJldHVybiBMaXN0IG9mIGltcG9ydHMgZm9yIENvY29hIGxpYnJhcmllcwotICovCi1zdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OmNvY29hX2ltcG9ydHMoKSB7Ci0gIHJldHVybgotICAgIHN0cmluZygpICsKLSAgICAiI2ltcG9ydCA8Rm91bmRhdGlvbi9Gb3VuZGF0aW9uLmg+XG4iICsKLSAgICAiXG4iOwotfQotCi0vKioKLSAqIFByaW50cyB0aHJpZnQgcnVudGltZSBpbXBvcnRzCi0gKgotICogQHJldHVybiBMaXN0IG9mIGltcG9ydHMgbmVjZXNzYXJ5IGZvciB0aHJpZnQgcnVudGltZQotICovCi1zdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OmNvY29hX3RocmlmdF9pbXBvcnRzKCkgewotICBzdHJpbmcgcmVzdWx0ID0gc3RyaW5nKCkgKwotICAgICIjaW1wb3J0IFwiVFByb3RvY29sLmhcIlxuIiArCi0gICAgIiNpbXBvcnQgXCJUQXBwbGljYXRpb25FeGNlcHRpb24uaFwiXG4iICsKLSAgICAiI2ltcG9ydCBcIlRQcm90b2NvbEV4Y2VwdGlvbi5oXCJcbiIgKwotICAgICIjaW1wb3J0IFwiVFByb3RvY29sVXRpbC5oXCJcbiIgKwotICAgICIjaW1wb3J0IFwiVFByb2Nlc3Nvci5oXCJcbiIgKwotICAgICIjaW1wb3J0IFwiVE9iamVjdGl2ZS1DLmhcIlxuIiArCi0gICAgIiNpbXBvcnQgXCJUQmFzZS5oXCJcbiIgKwotICAgICJcbiI7Ci0KLSAgLy8gSW5jbHVkZSBvdGhlciBUaHJpZnQgaW5jbHVkZXMKLSAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+JiBpbmNsdWRlcyA9IHByb2dyYW1fLT5nZXRfaW5jbHVkZXMoKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmNsdWRlcy5zaXplKCk7ICsraSkgewotICAgIHJlc3VsdCArPSAiI2ltcG9ydCBcIiIgKyBpbmNsdWRlc1tpXS0+Z2V0X25hbWUoKSArICIuaFwiIiArICJcbiI7Ci0gIH0KLSAgcmVzdWx0ICs9ICJcbiI7Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotCi0vKioKLSAqIEZpbmlzaCB1cCBnZW5lcmF0aW9uLgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKQotewotICAvLyBzdGljayBvdXIgY29uc3RhbnRzIGRlY2xhcmF0aW9ucyBhdCB0aGUgZW5kIG9mIHRoZSBoZWFkZXIgZmlsZQotICAvLyBzaW5jZSB0aGV5IHJlZmVyIHRvIHRoaW5ncyB3ZSBhcmUgZGVmaW5pbmcuCi0gIGZfaGVhZGVyXyA8PCBjb25zdGFudHNfZGVjbGFyYXRpb25zXyA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIFRoaXMgaXMganVzdCBhIHNpbXBsZSAxLWxpbmVyIGluIG9iamVjdGl2ZS1jCi0gKgotICogQHBhcmFtIHR0eXBlZGVmIFRoZSB0eXBlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7Ci0gIGZfaGVhZGVyXyA8PAotICAgIGluZGVudCgpIDw8ICJ0eXBlZGVmICIgPDwgdHlwZV9uYW1lKHR0eXBlZGVmLT5nZXRfdHlwZSgpKSA8PCAiICIgPDwgY29jb2FfcHJlZml4XyA8PCB0dHlwZWRlZi0+Z2V0X3N5bWJvbGljKCkgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBjb2RlIGZvciBhbiBlbnVtZXJhdGVkIHR5cGUuIEluIE9iamVjdGl2ZS1DLCB0aGlzIGlzCi0gKiBlc3NlbnRpYWxseSB0aGUgc2FtZSBhcyB0aGUgdGhyaWZ0IGRlZmluaXRpb24gaXRzZWxmLCB1c2luZyB0aGUKLSAqIGVudW0ga2V5d29yZCBpbiBPYmplY3RpdmUtQy4gIEZvciBuYW1lc3BhY2UgcHVycG9zZXMsIHRoZSBuYW1lIG9mCi0gKiB0aGUgZW51bSBwbHVzIGFuIHVuZGVyc2NvcmUgaXMgcHJlZml4ZWQgb250byBlYWNoIGVsZW1lbnQuCi0gKgotICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKLSAgZl9oZWFkZXJfIDw8Ci0gICAgaW5kZW50KCkgPDwgImVudW0gIiA8PCBjb2NvYV9wcmVmaXhfIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICIgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7Ci0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZfaGVhZGVyXyA8PAotICAgICAgICAiLCIgPDwgZW5kbDsKLSAgICB9Ci0gICAgZl9oZWFkZXJfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiXyIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIGZfaGVhZGVyXyA8PAotICAgICAgIiA9ICIgPDwgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGZfaGVhZGVyXyA8PAotICAgIGVuZGwgPDwKLSAgICAifTsiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIGNsYXNzIHRoYXQgaG9sZHMgYWxsIHRoZSBjb25zdGFudHMuICBQcmltaXRpdmUgdmFsdWVzCi0gKiBjb3VsZCBoYXZlIGJlZW4gcGxhY2VkIG91dHNpZGUgdGhpcyBjbGFzcywgYnV0IEkganVzdCBwdXQKLSAqIGV2ZXJ5dGhpbmcgaW4gZm9yIGNvbnNpc3RlbmN5LgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykgewotICBzdGQ6Om9zdHJpbmdzdHJlYW0gY29uc3RfaW50ZXJmYWNlOwotICBzdHJpbmcgY29uc3RhbnRzX2NsYXNzX25hbWUgPSBjb2NvYV9wcmVmaXhfICsgcHJvZ3JhbV9uYW1lXyArICJDb25zdGFudHMiOwotCi0gIGNvbnN0X2ludGVyZmFjZSA8PCAiQGludGVyZmFjZSAiIDw8IGNvbnN0YW50c19jbGFzc19uYW1lIDw8ICIgOiBOU09iamVjdCAiOwotICBzY29wZV91cChjb25zdF9pbnRlcmZhY2UpOwotICBzY29wZV9kb3duKGNvbnN0X2ludGVyZmFjZSk7Ci0KLSAgLy8gZ2V0dGVyIG1ldGhvZCBmb3IgZWFjaCBjb25zdGFudCBkZWZpbmVkLgotICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7Ci0gIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgc3RyaW5nIG5hbWUgPSAoKmNfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgdF90eXBlKiB0eXBlID0gKCpjX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgIGNvbnN0X2ludGVyZmFjZSA8PAotICAgICAgIisgKCIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIpICIgPDwgbmFtZSA8PCAiOyIgPDwgZW5kbDsKLSAgfQotCi0gIGNvbnN0X2ludGVyZmFjZSA8PCAiQGVuZCI7Ci0KLSAgLy8gdGhpcyBnZXRzIHNwaXQgaW50byB0aGUgaGVhZGVyIGZpbGUgaW4gOjpjbG9zZV9nZW5lcmF0b3IKLSAgY29uc3RhbnRzX2RlY2xhcmF0aW9uc18gPSBjb25zdF9pbnRlcmZhY2Uuc3RyKCk7Ci0KLSAgLy8gc3RhdGljIHZhcmlhYmxlcyBpbiB0aGUgLm0gaG9sZCBhbGwgY29uc3RhbnQgdmFsdWVzCi0gIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgc3RyaW5nIG5hbWUgPSAoKmNfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgdF90eXBlKiB0eXBlID0gKCpjX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgIGZfaW1wbF8gPDwKLSAgICAgICJzdGF0aWMgIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiAiIDw8IGNvY29hX3ByZWZpeF8gPDwgbmFtZTsKLSAgICBpZiAoIXR5cGUtPmlzX2NvbnRhaW5lcigpICYmICF0eXBlLT5pc19zdHJ1Y3QoKSkgewotICAgICAgZl9pbXBsXyA8PCAiID0gIiA8PCByZW5kZXJfY29uc3RfdmFsdWUoZl9pbXBsXywgdHlwZSwgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSk7Ci0gICAgfQotICAgIGZfaW1wbF8gPDwgIjsiIDw8IGVuZGw7Ci0gIH0KLSAgZl9pbXBsXyA8PCBlbmRsOwotCi0gIGZfaW1wbF8gPDwgIkBpbXBsZW1lbnRhdGlvbiAiIDw8IGNvbnN0YW50c19jbGFzc19uYW1lIDw8IGVuZGw7Ci0KLSAgLy8gaW5pdGlhbGl6ZSBjb21wbGV4IGNvbnN0YW50cyB3aGVuIHRoZSBjbGFzcyBpcyBsb2FkZWQKLSAgZl9pbXBsXyA8PCAiKyAodm9pZCkgaW5pdGlhbGl6ZSAiOwotICBzY29wZV91cChmX2ltcGxfKTsKLQotICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgewotICAgIGlmICgoKmNfaXRlciktPmdldF90eXBlKCktPmlzX2NvbnRhaW5lcigpIHx8Ci0gICAgICAgICgqY19pdGVyKS0+Z2V0X3R5cGUoKS0+aXNfc3RydWN0KCkpIHsKLSAgICAgIHByaW50X2NvbnN0X3ZhbHVlKGZfaW1wbF8sIAotICAgICAgICAgICBjb2NvYV9wcmVmaXhfKygqY19pdGVyKS0+Z2V0X25hbWUoKSwKLSAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdHlwZSgpLAotICAgICAgICAgICAoKmNfaXRlciktPmdldF92YWx1ZSgpLAotICAgICAgICAgICBmYWxzZSwgZmFsc2UpOwotICAgICAgZl9pbXBsXyA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLSAgc2NvcGVfZG93bihmX2ltcGxfKTsKLQotICAvLyBnZXR0ZXIgbWV0aG9kIGZvciBlYWNoIGNvbnN0YW50Ci0gIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgc3RyaW5nIG5hbWUgPSAoKmNfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgdF90eXBlKiB0eXBlID0gKCpjX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgIGZfaW1wbF8gPDwKLSAgICAgICIrICgiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiKSAiIDw8IG5hbWU7Ci0gICAgc2NvcGVfdXAoZl9pbXBsXyk7Ci0gICAgaW5kZW50KGZfaW1wbF8pIDw8ICJyZXR1cm4gIiA8PCBjb2NvYV9wcmVmaXhfIDw8IG5hbWUgPDwgIjsiIDw8IGVuZGw7Ci0gICAgc2NvcGVfZG93bihmX2ltcGxfKTsKLSAgfQotCi0gIGZfaW1wbF8gPDwgIkBlbmQiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuIFRoaXMgaXMgYSBjbGFzcwotICogd2l0aCBwcm90ZWN0ZWQgZGF0YSBtZW1iZXJzLCByZWFkKCksIHdyaXRlKCksIGFuZCBnZXR0ZXJzIGFuZCBzZXR0ZXJzLgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2ludGVyZmFjZShmX2hlYWRlcl8sIHRzdHJ1Y3QsIGZhbHNlKTsKLSAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2ltcGxlbWVudGF0aW9uKGZfaW1wbF8sIHRzdHJ1Y3QsIGZhbHNlKTsKLX0KLQotLyoqCi0gKiBFeGNlcHRpb25zIGFyZSBzdHJ1Y3RzLCBidXQgdGhleSBpbmhlcml0IGZyb20gTlNFeGNlcHRpb24KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgewotICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW50ZXJmYWNlKGZfaGVhZGVyXywgdHhjZXB0aW9uLCB0cnVlKTsKLSAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2ltcGxlbWVudGF0aW9uKGZfaW1wbF8sIHR4Y2VwdGlvbiwgdHJ1ZSk7Ci19Ci0KLQotLyoqCi0gKiBHZW5lcmF0ZSB0aGUgaW50ZXJmYWNlIGZvciBhIHN0cnVjdAotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW50ZXJmYWNlKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7Ci0gIG91dCA8PCAiQGludGVyZmFjZSAiIDw8IGNvY29hX3ByZWZpeF8gPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIDogIjsKLQotICBpZiAoaXNfZXhjZXB0aW9uKSB7Ci0gICAgb3V0IDw8ICJOU0V4Y2VwdGlvbiAiOwotICB9IGVsc2UgewotICAgIG91dCA8PCAiTlNPYmplY3QgIjsKLSAgfQotICBvdXQgPDwgIjxUQmFzZSwgTlNDb2Rpbmc+ICI7Ci0KLSAgc2NvcGVfdXAob3V0KTsKLQotICAvLyBtZW1iZXJzIGFyZSBwcm90ZWN0ZWQuICB0aGlzIGlzIHJlZHVuZGFudCwgYnV0IGV4cGxpY2l0LgotICAvLyAgZl9oZWFkZXJfIDw8IGVuZGwgPDwgIkBwcm90ZWN0ZWQ6IiA8PCBlbmRsOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotCi0gIC8vIG1lbWJlciB2YXJpYWxiZXMKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8IGRlY2xhcmVfZmllbGQoKm1faXRlcikgPDwgZW5kbDsKLSAgfQotCi0gIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKLSAgICBvdXQgPDwgZW5kbDsKLSAgICAvLyBpc3NldCBmaWVsZHMKLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAiQk9PTCBfXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJfaXNzZXQ7IiA8PCAgZW5kbDsKLSAgICB9Ci0gIH0KLQotICBzY29wZV9kb3duKG91dCk7Ci0gIG91dCA8PCBlbmRsOwotCi0gIC8vIHByb3BlcnRpZXMKLSAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgewotICAgIG91dCA8PCAiI2lmIFRBUkdFVF9PU19JUEhPTkUgfHwgKE1BQ19PU19YX1ZFUlNJT05fTUFYX0FMTE9XRUQgPj0gTUFDX09TX1hfVkVSU0lPTl8xMF81KSIgPDwgZW5kbDsKLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgZGVjbGFyZV9wcm9wZXJ0eSgqbV9pdGVyKSA8PCBlbmRsOwotICAgIH0KLSAgICBvdXQgPDwgIiNlbmRpZiIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci0KLSAgLy8gZGVmYXVsdCBpbml0aWFsaXplcgotICBvdXQgPDwgaW5kZW50KCkgPDwgIi0gKGlkKSBpbml0OyIgPDwgZW5kbDsKLQotICAvLyBpbml0aWFsaXplciBmb3IgYWxsIGZpZWxkcwotICBpZiAoIW1lbWJlcnMuZW1wdHkoKSkgewotICAgIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbml0aWFsaXplcl9zaWduYXR1cmUob3V0LCB0c3RydWN0KTsKLSAgICBvdXQgPDwgIjsiIDw8IGVuZGw7Ci0gIH0KLSAgb3V0IDw8IGVuZGw7Ci0KLSAgLy8gcmVhZCBhbmQgd3JpdGUKLSAgb3V0IDw8ICItICh2b2lkKSByZWFkOiAoaWQgPFRQcm90b2NvbD4pIGluUHJvdG9jb2w7IiA8PCBlbmRsOwotICBvdXQgPDwgIi0gKHZvaWQpIHdyaXRlOiAoaWQgPFRQcm90b2NvbD4pIG91dFByb3RvY29sOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGVuZGw7Ci0KLSAgLy8gdmFsaWRhdG9yCi0gIG91dCA8PCAiLSAodm9pZCkgdmFsaWRhdGU7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgLy8gZ2V0dGVycyBhbmQgc2V0dGVycwotICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfZmllbGRfYWNjZXNzb3JfZGVjbGFyYXRpb25zKG91dCwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKLQotICBvdXQgPDwgIkBlbmQiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotCi0vKioKLSAqIEdlbmVyYXRlIHNpZ25hdHVyZSBmb3IgaW5pdGlhbGl6ZXIgb2Ygc3RydWN0IHdpdGggYSBwYXJhbWV0ZXIgZm9yCi0gKiBlYWNoIGZpZWxkLgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW5pdGlhbGl6ZXJfc2lnbmF0dXJlKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotICBpbmRlbnQob3V0KSA8PCAiLSAoaWQpIGluaXRXaXRoIjsKLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyApIHsKLSAgICBpZiAobV9pdGVyID09IG1lbWJlcnMuYmVnaW4oKSkgewotICAgICAgb3V0IDw8IGNhcGl0YWxpemUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLSAgICB9IGVsc2UgewotICAgICAgb3V0IDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICB9Ci0gICAgb3V0IDw8ICI6ICgiIDw8IHR5cGVfbmFtZSgoKm1faXRlciktPmdldF90eXBlKCkpIDw8ICIpICIgPDwKLSAgICAgICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICArK21faXRlcjsKLSAgICBpZiAobV9pdGVyICE9IG1lbWJlcnMuZW5kKCkpIHsKLSAgICAgIG91dCA8PCAiICI7Ci0gICAgfQotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGUgZ2V0dGVyIGFuZCBzZXR0ZXIgZGVjbGFyYXRpb25zIGZvciBhbGwgZmllbGRzLCBwbHVzIGFuCi0gKiBJc1NldCBnZXR0ZXIuCi0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3N0cnVjdF9maWVsZF9hY2Nlc3Nvcl9kZWNsYXJhdGlvbnMob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7Ci0gICh2b2lkKSBpc19leGNlcHRpb247Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiNpZiAhX19oYXNfZmVhdHVyZShvYmpjX2FyYykiIDw8IGVuZGw7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICItICgiIDw8IHR5cGVfbmFtZSgoKm1faXRlciktPmdldF90eXBlKCkpIDw8ICIpICIgPDwgZGVjYXBpdGFsaXplKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICItICh2b2lkKSBzZXQiIDw8IGNhcGl0YWxpemUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PAotICAgICAgIjogKCIgPDwgdHlwZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIikgIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICIjZW5kaWYiIDw8IGVuZGw7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICItIChCT09MKSAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiSXNTZXQ7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLX0KLQotCi0vKioKLSAqIEdlbmVyYXRlIHRoZSBpbml0V2l0aENvZGVyIG1ldGhvZCBmb3IgdGhpcyBzdHJ1Y3Qgc28gaXQncyBjb21wYXRpYmxlIHdpdGgKLSAqIHRoZSBOU0NvZGluZyBwcm90b2NvbAotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW5pdF93aXRoX2NvZGVyX21ldGhvZChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgCi17Ci0gIGluZGVudChvdXQpIDw8ICItIChpZCkgaW5pdFdpdGhDb2RlcjogKE5TQ29kZXIgKikgZGVjb2RlciIgPDwgZW5kbDsKLSAgc2NvcGVfdXAob3V0KTsKLSAgaWYgKGlzX2V4Y2VwdGlvbikgewotICAgIC8vIE5TRXhjZXB0aW9ucyBjb25mb3JtIHRvIE5TQ29kaW5nLCBzbyB3ZSBjYW4gY2FsbCBzdXBlcgotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAic2VsZiA9IFtzdXBlciBpbml0V2l0aENvZGVyOiBkZWNvZGVyXTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJzZWxmID0gW3N1cGVyIGluaXRdOyIgPDwgZW5kbDsKLSAgfQotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0KLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChbZGVjb2RlciBjb250YWluc1ZhbHVlRm9yS2V5OiBAXCIiPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8IlwiXSkiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAob3V0KTsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIl9fIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICI7Ci0gICAgaWYgKHR5cGVfY2FuX2JlX251bGwodCkpIAotICAgIHsKLSAgICAgIG91dCA8PCAiW1tkZWNvZGVyIGRlY29kZU9iamVjdEZvcktleTogQFwiIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiXSByZXRhaW5fc3R1Yl07IiA8PCBlbmRsOwotICAgIH0KLSAgICBlbHNlIGlmICh0LT5pc19lbnVtKCkpIAotICAgIHsKLSAgICAgIG91dCA8PCAiW2RlY29kZXIgZGVjb2RlSW50Rm9yS2V5OiBAXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdOyIgPDwgZW5kbDsgICAgICAKLSAgICB9Ci0gICAgZWxzZSAKLSAgICB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSAqKSB0KS0+Z2V0X2Jhc2UoKTsKLSAgICAgIHN3aXRjaCAodGJhc2UpCi0gICAgICB7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgICBvdXQgPDwgIltkZWNvZGVyIGRlY29kZUJvb2xGb3JLZXk6IEBcIiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIl07IiA8PCBlbmRsOyAgICAgIAotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgICAgb3V0IDw8ICJbZGVjb2RlciBkZWNvZGVJbnRGb3JLZXk6IEBcIiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIl07IiA8PCBlbmRsOyAgICAgIAotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgICBvdXQgPDwgIltkZWNvZGVyIGRlY29kZUludEZvcktleTogQFwiIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiXTsiIDw8IGVuZGw7ICAgICAgCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICAgIG91dCA8PCAiW2RlY29kZXIgZGVjb2RlSW50MzJGb3JLZXk6IEBcIiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIl07IiA8PCBlbmRsOyAgICAgIAotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgICBvdXQgPDwgIltkZWNvZGVyIGRlY29kZUludDY0Rm9yS2V5OiBAXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdOyIgPDwgZW5kbDsgICAgICAKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgICAgb3V0IDw8ICJbZGVjb2RlciBkZWNvZGVEb3VibGVGb3JLZXk6IEBcIiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIl07IiA8PCBlbmRsOyAgICAgIAotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OiAgICAKLSAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGRvbid0IGtub3cgaG93IHRvIGRlY29kZSB0aHJpZnQgdHlwZTogIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiX18iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiX2lzc2V0ID0gWUVTOyIgPDwgZW5kbDsKLSAgICBzY29wZV9kb3duKG91dCk7Ci0gIH0KLSAgCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHNlbGY7IiA8PCBlbmRsOwotICBzY29wZV9kb3duKG91dCk7Ci0gIG91dCA8PCBlbmRsOwotfQotCi0KLS8qKgotICogR2VuZXJhdGUgdGhlIGVuY29kZVdpdGhDb2RlciBtZXRob2QgZm9yIHRoaXMgc3RydWN0IHNvIGl0J3MgY29tcGF0aWJsZSB3aXRoCi0gKiB0aGUgTlNDb2RpbmcgcHJvdG9jb2wKLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc3RydWN0X2VuY29kZV93aXRoX2NvZGVyX21ldGhvZChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pIAotewotICBpbmRlbnQob3V0KSA8PCAiLSAodm9pZCkgZW5jb2RlV2l0aENvZGVyOiAoTlNDb2RlciAqKSBlbmNvZGVyIiA8PCBlbmRsOwotICBzY29wZV91cChvdXQpOwotICBpZiAoaXNfZXhjZXB0aW9uKSB7Ci0gICAgLy8gTlNFeGNlcHRpb25zIGNvbmZvcm0gdG8gTlNDb2RpbmcsIHNvIHdlIGNhbiBjYWxsIHN1cGVyCi0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJbc3VwZXIgZW5jb2RlV2l0aENvZGVyOiBlbmNvZGVyXTsiIDw8IGVuZGw7Ci0gIH0KLSAgCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0gIAotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKF9fIjw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCJfaXNzZXQpIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgLy9vdXQgPDwgaW5kZW50KCkgPDwgIl9fIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICI7Ci0gICAgaWYgKHR5cGVfY2FuX2JlX251bGwodCkpIAotICAgIHsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW2VuY29kZXIgZW5jb2RlT2JqZWN0OiBfXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZm9yS2V5OiBAXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgZWxzZSBpZiAodC0+aXNfZW51bSgpKSAKLSAgICB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltlbmNvZGVyIGVuY29kZUludDogX18iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZvcktleTogQFwiIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiXTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGVsc2UgCi0gICAgewotICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUgKikgdCktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKQotICAgICAgewotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJbZW5jb2RlciBlbmNvZGVCb29sOiBfXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZm9yS2V5OiBAXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdOyIgPDwgZW5kbDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW2VuY29kZXIgZW5jb2RlSW50OiBfXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZm9yS2V5OiBAXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdOyIgPDwgZW5kbDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJbZW5jb2RlciBlbmNvZGVJbnQ6IF9fIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiBmb3JLZXk6IEBcIiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIl07IiA8PCBlbmRsOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltlbmNvZGVyIGVuY29kZUludDMyOiBfXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZm9yS2V5OiBAXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdOyIgPDwgZW5kbDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJbZW5jb2RlciBlbmNvZGVJbnQ2NDogX18iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZvcktleTogQFwiIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiXTsiIDw8IGVuZGw7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW2VuY29kZXIgZW5jb2RlRG91YmxlOiBfXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZm9yS2V5OiBAXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdOyIgPDwgZW5kbDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDogICAgCi0gICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBkb24ndCBrbm93IGhvdyB0byBlbmNvZGUgdGhyaWZ0IHR5cGU6ICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgICAgfQotICAgIH0KLSAgICBzY29wZV9kb3duKG91dCk7Ci0gIH0KLSAgCi0gIHNjb3BlX2Rvd24ob3V0KTsKLSAgb3V0IDw8IGVuZGw7Ci19Ci0KLQotLyoqCi0gKiBHZW5lcmF0ZSBzdHJ1Y3QgaW1wbGVtZW50YXRpb24uCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgICAgICBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqIEBwYXJhbSBpc19leGNlcHRpb24gSXMgdGhpcyBhbiBleGNlcHRpb24/Ci0gKiBAcGFyYW0gaXNfcmVzdWx0ICAgIElmIHRoaXMgaXMgYSByZXN1bHQgaXQgbmVlZHMgYSBkaWZmZXJlbnQgd3JpdGVyCi0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbXBsZW1lbnRhdGlvbihvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0KSB7Ci0gIGluZGVudChvdXQpIDw8Ci0gICAgIkBpbXBsZW1lbnRhdGlvbiAiIDw8IGNvY29hX3ByZWZpeF8gPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLQotICAvLyBleGNlcHRpb25zIG5lZWQgdG8gY2FsbCB0aGUgZGVzaWduYXRlZCBpbml0aWFsaXplciBvbiBOU0V4Y2VwdGlvbgotICBpZiAoaXNfZXhjZXB0aW9uKSB7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICItIChpZCkgaW5pdCIgPDwgZW5kbDsKLSAgICBzY29wZV91cChvdXQpOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIFtzdXBlciBpbml0V2l0aE5hbWU6IEBcIiIgPDwgY29jb2FfcHJlZml4XyA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8Ci0gICAgICAgICJcIiByZWFzb246IEBcInVua25vd25cIiB1c2VySW5mbzogbmlsXTsiIDw8IGVuZGw7Ci0gICAgc2NvcGVfZG93bihvdXQpOwotICAgIG91dCA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIC8vIHN0cnVjdAotCi0gICAgLy8gZGVmYXVsdCBpbml0aWFsaXplcgotICAgIC8vIHNldHVwIGluc3RhbmNlIHZhcmlhYmxlcyB3aXRoIGRlZmF1bHQgdmFsdWVzCi0gICAgaW5kZW50KG91dCkgPDwgIi0gKGlkKSBpbml0IiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgaW5kZW50KG91dCkgPDwgInNlbGYgPSBbc3VwZXIgaW5pdF07IiA8PCBlbmRsOwotICAgIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKLSAgICAgIG91dCA8PCAiI2lmIFRBUkdFVF9PU19JUEhPTkUgfHwgKE1BQ19PU19YX1ZFUlNJT05fTUFYX0FMTE9XRUQgPj0gTUFDX09TX1hfVkVSU0lPTl8xMF81KSIgPDwgZW5kbDsKLSAgICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOwotICAgICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7Ci0gICAgICAgICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LCAic2VsZi4iKygqbV9pdGVyKS0+Z2V0X25hbWUoKSwgdCwgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSwgZmFsc2UsIHRydWUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBvdXQgPDwgIiNlbmRpZiIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50KG91dCkgPDwgInJldHVybiBzZWxmOyIgPDwgZW5kbDsKLSAgICBzY29wZV9kb3duKG91dCk7Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0KLQotICAvLyBpbml0aWFsaXplciB3aXRoIGFsbCBmaWVsZHMgYXMgcGFyYW1zCi0gIGlmICghbWVtYmVycy5lbXB0eSgpKSB7Ci0gICAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2luaXRpYWxpemVyX3NpZ25hdHVyZShvdXQsIHRzdHJ1Y3QpOwotICAgIG91dCA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgaWYgKGlzX2V4Y2VwdGlvbikgewotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJzZWxmID0gW3NlbGYgaW5pdF07IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInNlbGYgPSBbc3VwZXIgaW5pdF07IiA8PCBlbmRsOwotICAgIH0KLQotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiX18iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIjsKLSAgICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKHQpKSB7Ci0gICAgICAgIG91dCA8PCAiWyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgcmV0YWluX3N0dWJdOyIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIl9fIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIl9pc3NldCA9IFlFUzsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gc2VsZjsiIDw8IGVuZGw7Ci0gICAgc2NvcGVfZG93bihvdXQpOwotICAgIG91dCA8PCBlbmRsOwotICB9Ci0gIAotICAvLyBpbml0V2l0aENvZGVyIGZvciBOU0NvZGluZwotICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW5pdF93aXRoX2NvZGVyX21ldGhvZChvdXQsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7Ci0gIC8vIGVuY29kZVdpdGhDb2RlciBmb3IgTlNDb2RpbmcKLSAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2VuY29kZV93aXRoX2NvZGVyX21ldGhvZChvdXQsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7ICAKLQotICAvLyBkZWFsbG9jCi0gIGlmICghbWVtYmVycy5lbXB0eSgpKSB7Ci0gICAgb3V0IDw8ICItICh2b2lkKSBkZWFsbG9jIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0KLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0KSkgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAiW19fIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiByZWxlYXNlX3N0dWJdOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltzdXBlciBkZWFsbG9jX3N0dWJdOyIgPDwgZW5kbDsKLSAgICBzY29wZV9kb3duKG91dCk7Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0KLQotICAvLyB0aGUgcmVzdCBvZiB0aGUgbWV0aG9kcwotICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfZmllbGRfYWNjZXNzb3JfaW1wbGVtZW50YXRpb25zKG91dCwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKLSAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QpOwotICBpZiAoaXNfcmVzdWx0KSB7Ci0gICAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X3Jlc3VsdF93cml0ZXIob3V0LCB0c3RydWN0KTsKLSAgfSBlbHNlIHsKLSAgICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCk7Ci0gIH0KLSAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X3ZhbGlkYXRvcihvdXQsIHRzdHJ1Y3QpOwotICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfZGVzY3JpcHRpb24ob3V0LCB0c3RydWN0KTsKLQotICBvdXQgPDwgIkBlbmQiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIGZ1bmN0aW9uIHRvIHJlYWQgYWxsIHRoZSBmaWVsZHMgb2YgdGhlIHN0cnVjdC4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc3RydWN0X3JlYWRlcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgewotICBvdXQgPDwKLSAgICAiLSAodm9pZCkgcmVhZDogKGlkIDxUUHJvdG9jb2w+KSBpblByb3RvY29sIiA8PCBlbmRsOwotICBzY29wZV91cChvdXQpOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICAvLyBEZWNsYXJlIHN0YWNrIHRtcCB2YXJpYWJsZXMKLSAgaW5kZW50KG91dCkgPDwgIk5TU3RyaW5nICogZmllbGROYW1lOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgImludCBmaWVsZFR5cGU7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiaW50IGZpZWxkSUQ7IiA8PCBlbmRsOwotICBvdXQgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAiW2luUHJvdG9jb2wgcmVhZFN0cnVjdEJlZ2luUmV0dXJuaW5nTmFtZTogTlVMTF07IiA8PCBlbmRsOwotCi0gIC8vIExvb3Agb3ZlciByZWFkaW5nIGluIGZpZWxkcwotICBpbmRlbnQob3V0KSA8PAotICAgICJ3aGlsZSAodHJ1ZSkiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAob3V0KTsKLQotICAgIC8vIFJlYWQgYmVnaW5uaW5nIGZpZWxkIG1hcmtlcgotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiW2luUHJvdG9jb2wgcmVhZEZpZWxkQmVnaW5SZXR1cm5pbmdOYW1lOiAmZmllbGROYW1lIHR5cGU6ICZmaWVsZFR5cGUgZmllbGRJRDogJmZpZWxkSURdOyIgPDwgZW5kbDsKLQotICAgIC8vIENoZWNrIGZvciBmaWVsZCBTVE9QIG1hcmtlciBhbmQgYnJlYWsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImlmIChmaWVsZFR5cGUgPT0gVFR5cGVfU1RPUCkgeyAiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJicmVhazsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIn0iIDw8IGVuZGw7Ci0KLSAgICAvLyBTd2l0Y2ggc3RhdGVtZW50IG9uIHRoZSBmaWVsZCB3ZSBhcmUgcmVhZGluZwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAic3dpdGNoIChmaWVsZElEKSIgPDwgZW5kbDsKLQotICAgICAgc2NvcGVfdXAob3V0KTsKLQotICAgICAgLy8gR2VuZXJhdGUgZGVzZXJpYWxpemF0aW9uIGNvZGUgZm9yIGtub3duIGNhc2VzCi0gICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAgICJjYXNlICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjoiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF91cCgpOwotICAgICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAgICJpZiAoZmllbGRUeXBlID09ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIikgeyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0KLSAgICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAiZmllbGRWYWx1ZSIpOwotICAgICAgICBpbmRlbnQob3V0KSA8PCBjYWxsX2ZpZWxkX3NldHRlcigqZl9pdGVyLCAiZmllbGRWYWx1ZSIpIDw8IGVuZGw7Ci0gICAgICAgIC8vIGlmIHRoaXMgaXMgYW4gYWxsb2NhdGVkIGZpZWxkLCByZWxlYXNlIGl0IHNpbmNlIHRoZSBzdHJ1Y3QKLSAgICAgICAgLy8gaXMgbm93IHJldGFpbmluZyBpdAotICAgICAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpKSB7Ci0gICAgICAgICAgLy8gZGVzZXJpYWxpemVkIHN0cmluZ3MgYXJlIGF1dG9yZWxlYXNlLCBzbyBkb24ndCByZWxlYXNlIHRoZW0KLSAgICAgICAgICBpZiAoIShnZXRfdHJ1ZV90eXBlKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSktPmlzX3N0cmluZygpKSkgewotICAgICAgICAgICAgaW5kZW50KG91dCkgPDwgIltmaWVsZFZhbHVlIHJlbGVhc2Vfc3R1Yl07IiA8PCBlbmRsOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsgIiA8PCBlbmRsOwotICAgICAgICBpZiAobG9nX3VuZXhwZWN0ZWRfKSB7Ci0gICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIE5TTG9nKEBcIiVzOiBmaWVsZCBJRCAlaSBoYXMgdW5leHBlY3RlZCB0eXBlICVpLiAgU2tpcHBpbmcuXCIsIF9fUFJFVFRZX0ZVTkNUSU9OX18sIGZpZWxkSUQsIGZpZWxkVHlwZSk7IiA8PCBlbmRsOwotICAgICAgICB9Ci0gICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBbVFByb3RvY29sVXRpbCBza2lwVHlwZTogZmllbGRUeXBlIG9uUHJvdG9jb2w6IGluUHJvdG9jb2xdOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIH0KLQotICAgICAgLy8gSW4gdGhlIGRlZmF1bHQgY2FzZSB3ZSBza2lwIHRoZSBmaWVsZAotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKLSAgICAgIGlmIChsb2dfdW5leHBlY3RlZF8pIHsKLSAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIE5TTG9nKEBcIiVzOiB1bmV4cGVjdGVkIGZpZWxkIElEICVpIHdpdGggdHlwZSAlaS4gIFNraXBwaW5nLlwiLCBfX1BSRVRUWV9GVU5DVElPTl9fLCBmaWVsZElELCBmaWVsZFR5cGUpOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBbVFByb3RvY29sVXRpbCBza2lwVHlwZTogZmllbGRUeXBlIG9uUHJvdG9jb2w6IGluUHJvdG9jb2xdOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBicmVhazsiIDw8IGVuZGw7Ci0KLSAgICAgIHNjb3BlX2Rvd24ob3V0KTsKLQotICAgIC8vIFJlYWQgZmllbGQgZW5kIG1hcmtlcgotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiW2luUHJvdG9jb2wgcmVhZEZpZWxkRW5kXTsiIDw8IGVuZGw7Ci0KLSAgICBzY29wZV9kb3duKG91dCk7Ci0KLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJbaW5Qcm90b2NvbCByZWFkU3RydWN0RW5kXTsiIDw8IGVuZGw7Ci0KLSAgICAvLyBwZXJmb3JtcyB2YXJpb3VzIGNoZWNrcyAoZS5nLiBjaGVjayB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHNldCkKLSAgICBpZiAodmFsaWRhdGVfcmVxdWlyZWRfKSB7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIltzZWxmIHZhbGlkYXRlXTsiIDw8IGVuZGw7Ci0gICAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbiB0byB3cml0ZSBhbGwgdGhlIGZpZWxkcyBvZiB0aGUgc3RydWN0Ci0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3N0cnVjdF93cml0ZXIob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgIi0gKHZvaWQpIHdyaXRlOiAoaWQgPFRQcm90b2NvbD4pIG91dFByb3RvY29sIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJbb3V0UHJvdG9jb2wgd3JpdGVTdHJ1Y3RCZWdpbldpdGhOYW1lOiBAXCIiIDw8IG5hbWUgPDwgIlwiXTsiIDw8IGVuZGw7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJpZiAoX18iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiX2lzc2V0KSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGJvb2wgbnVsbF9hbGxvd2VkID0gdHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpOwotICAgIGlmIChudWxsX2FsbG93ZWQpIHsKLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKF9fIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiAhPSBuaWwpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICB9Ci0KLSAgICBpbmRlbnQob3V0KSA8PCAiW291dFByb3RvY29sIHdyaXRlRmllbGRCZWdpbldpdGhOYW1lOiBAXCIiIDw8Ci0gICAgICAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiIHR5cGU6ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwKLSAgICAgICIgZmllbGRJRDogIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiXTsiIDw8IGVuZGw7Ci0KLSAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJfXyIrKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLQotICAgIC8vIFdyaXRlIGZpZWxkIGNsb3NlcgotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiW291dFByb3RvY29sIHdyaXRlRmllbGRFbmRdOyIgPDwgZW5kbDsKLQotICAgIGlmIChudWxsX2FsbG93ZWQpIHsKLSAgICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgICB9Ci0gICAgc2NvcGVfZG93bihvdXQpOwotICB9Ci0gIC8vIFdyaXRlIHRoZSBzdHJ1Y3QgbWFwCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJbb3V0UHJvdG9jb2wgd3JpdGVGaWVsZFN0b3BdOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJbb3V0UHJvdG9jb2wgd3JpdGVTdHJ1Y3RFbmRdOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gd3JpdGUgYWxsIHRoZSBmaWVsZHMgb2YgdGhlIHN0cnVjdCwgd2hpY2gKLSAqIGlzIGEgZnVuY3Rpb24gcmVzdWx0LiBUaGVzZSBmaWVsZHMgYXJlIG9ubHkgd3JpdHRlbiBpZiB0aGV5IGFyZQotICogc2V0LCBhbmQgb25seSBvbmUgb2YgdGhlbSBjYW4gYmUgc2V0IGF0IGEgdGltZS4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc3RydWN0X3Jlc3VsdF93cml0ZXIob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICItICh2b2lkKSB3cml0ZTogKGlkIDxUUHJvdG9jb2w+KSBvdXRQcm90b2NvbCB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAiW291dFByb3RvY29sIHdyaXRlU3RydWN0QmVnaW5XaXRoTmFtZTogQFwiIiA8PCBuYW1lIDw8ICJcIl07IiA8PCBlbmRsOwotCi0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIG91dCA8PAotICAgICAgICBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiAiOwotICAgIH0gZWxzZSB7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgIiBlbHNlIGlmICI7Ci0gICAgfQotCi0gICAgb3V0IDw8Ci0gICAgICAiKF9fIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIl9pc3NldCkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIGJvb2wgbnVsbF9hbGxvd2VkID0gdHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpOwotICAgIGlmIChudWxsX2FsbG93ZWQpIHsKLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKF9fIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiAhPSBuaWwpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICB9Ci0KLSAgICBpbmRlbnQob3V0KSA8PCAiW291dFByb3RvY29sIHdyaXRlRmllbGRCZWdpbldpdGhOYW1lOiBAXCIiIDw8Ci0gICAgICAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiIHR5cGU6ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwKLSAgICAgICIgZmllbGRJRDogIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiXTsiIDw8IGVuZGw7Ci0KLSAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJfXyIrKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLQotICAgIC8vIFdyaXRlIGZpZWxkIGNsb3NlcgotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiW291dFByb3RvY29sIHdyaXRlRmllbGRFbmRdOyIgPDwgZW5kbDsKLQotICAgIGlmIChudWxsX2FsbG93ZWQpIHsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IjsKLSAgfQotICAvLyBXcml0ZSB0aGUgc3RydWN0IG1hcAotICBvdXQgPDwKLSAgICBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIltvdXRQcm90b2NvbCB3cml0ZUZpZWxkU3RvcF07IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIltvdXRQcm90b2NvbCB3cml0ZVN0cnVjdEVuZF07IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbiB0byBwZXJmb3JtIHZhcmlvdXMgY2hlY2tzCi0gKiAoZS5nLiBjaGVjayB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHNldCkKLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc3RydWN0X3ZhbGlkYXRvcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgewotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAiLSAodm9pZCkgdmFsaWRhdGUgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICAgIAotICBvdXQgPDwgaW5kZW50KCkgPDwgIi8vIGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMiIDw8IGVuZGw7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9maWVsZCogZmllbGQgPSAoKmZfaXRlcik7Ci0gICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKCFfXyIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIl9pc3NldCkgeyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBAdGhyb3cgW1RQcm90b2NvbEV4Y2VwdGlvbiBleGNlcHRpb25XaXRoTmFtZTogQFwiVFByb3RvY29sRXhjZXB0aW9uXCIiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uOiBAXCJSZXF1aXJlZCBmaWVsZCAnIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIicgaXMgbm90IHNldC5cIl07IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZSBwcm9wZXJ0eSBhY2Nlc3NvciBtZXRob2RzIGZvciBhbGwgZmllbGRzIGluIHRoZSBzdHJ1Y3QuCi0gKiBnZXR0ZXIsIHNldHRlciwgaXNzZXQgZ2V0dGVyLgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfZmllbGRfYWNjZXNzb3JfaW1wbGVtZW50YXRpb25zKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgewotICAodm9pZCkgaXNfZXhjZXB0aW9uOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9maWVsZCogZmllbGQgPSAqZl9pdGVyOwotICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUoZmllbGQtPmdldF90eXBlKCkpOwotICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSBmaWVsZC0+Z2V0X25hbWUoKTsKLSAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSA9IGZpZWxkX25hbWU7Ci0gICAgY2FwX25hbWVbMF0gPSB0b3VwcGVyKGNhcF9uYW1lWzBdKTsKLQotICAgIC8vIFNpbXBsZSBnZXR0ZXIKLSAgICBpbmRlbnQob3V0KSA8PCAiLSAoIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIikgIjsKLSAgICBvdXQgPDwgZmllbGRfbmFtZSA8PCAiIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaWYgKCF0eXBlX2Nhbl9iZV9udWxsKHR5cGUpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIF9fIiA8PCBmaWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIFtbX18iIDw8IGZpZWxkX25hbWUgPDwgIiByZXRhaW5fc3R1Yl0gYXV0b3JlbGVhc2Vfc3R1Yl07IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICAvLyBTaW1wbGUgc2V0dGVyCi0gICAgaW5kZW50KG91dCkgPDwgIi0gKHZvaWQpIHNldCIgPDwgY2FwX25hbWUgPDwgIjogKCIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8Ci0gICAgICAiKSAiIDw8IGZpZWxkX25hbWUgPDwgIiB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGlmICghdHlwZV9jYW5fYmVfbnVsbCh0eXBlKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIl9fIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSAiIDw8IGZpZWxkX25hbWUgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJbIiA8PCBmaWVsZF9uYW1lIDw8ICIgcmV0YWluX3N0dWJdOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJbX18iIDw8IGZpZWxkX25hbWUgPDwgIiByZWxlYXNlX3N0dWJdOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJfXyIgPDwgZmllbGRfbmFtZSA8PCAiID0gIiA8PCBmaWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnQob3V0KSA8PCAiX18iIDw8IGZpZWxkX25hbWUgPDwgIl9pc3NldCA9IFlFUzsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gICAgLy8gSXNTZXQKLSAgICBpbmRlbnQob3V0KSA8PCAiLSAoQk9PTCkgIiA8PCBmaWVsZF9uYW1lIDw8ICJJc1NldCB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gX18iIDw8IGZpZWxkX25hbWUgPDwgIl9pc3NldDsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gICAgLy8gVW5zZXR0ZXIgLSBkbyB3ZSBuZWVkIHRoaXM/Ci0gICAgaW5kZW50KG91dCkgPDwgIi0gKHZvaWQpIHVuc2V0IiA8PCBjYXBfbmFtZSA8PCAiIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaWYgKHR5cGVfY2FuX2JlX251bGwodHlwZSkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJbX18iIDw8IGZpZWxkX25hbWUgPDwgIiByZWxlYXNlX3N0dWJdOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJfXyIgPDwgZmllbGRfbmFtZSA8PCAiID0gbmlsOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50KG91dCkgPDwgIl9fIiA8PCBmaWVsZF9uYW1lIDw8ICJfaXNzZXQgPSBOTzsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgZGVzY3JpcHRpb24gbWV0aG9kIGZvciB0aGUgZ2l2ZW4gc3RydWN0Ci0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3N0cnVjdF9kZXNjcmlwdGlvbihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICItIChOU1N0cmluZyAqKSBkZXNjcmlwdGlvbiB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAiTlNNdXRhYmxlU3RyaW5nICogbXMgPSBbTlNNdXRhYmxlU3RyaW5nIHN0cmluZ1dpdGhTdHJpbmc6IEBcIiIgPDwKLSAgICBjb2NvYV9wcmVmaXhfIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIihcIl07IiA8PCBlbmRsOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgaW5kZW50KG91dCkgPDwgIlttcyBhcHBlbmRTdHJpbmc6IEBcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI6XCJdOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwgIlttcyBhcHBlbmRTdHJpbmc6IEBcIiwiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOlwiXTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIHRfdHlwZSogdHR5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIlttcyBhcHBlbmRGb3JtYXQ6IEBcIiIgPDwgZm9ybWF0X3N0cmluZ19mb3JfdHlwZSh0dHlwZSkgPDwgIlwiLCBfXyIgPDwKLSAgICAgICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXTsiIDw8IGVuZGw7Ci0gIH0KLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgIlttcyBhcHBlbmRTdHJpbmc6IEBcIilcIl07IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInJldHVybiBbTlNTdHJpbmcgc3RyaW5nV2l0aFN0cmluZzogbXNdOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0aHJpZnQgc2VydmljZS4gIEluIE9iamVjdGl2ZS1DIHRoaXMgY29uc2lzdHMgb2YgYQotICogcHJvdG9jb2wgZGVmaW5pdGlvbiwgYSBjbGllbnQgaW50ZXJmYWNlIGFuZCBhIGNsaWVudCBpbXBsZW1lbnRhdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9wcm90b2NvbChmX2hlYWRlcl8sIHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfaW50ZXJmYWNlKGZfaGVhZGVyXywgdHNlcnZpY2UpOwotICBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX3NlcnZlcl9pbnRlcmZhY2UoZl9oZWFkZXJfLCB0c2VydmljZSk7Ci0gIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7Ci0gIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X2ltcGxlbWVudGF0aW9uKGZfaW1wbF8sIHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9zZXJ2ZXJfaW1wbGVtZW50YXRpb24oZl9pbXBsXywgdHNlcnZpY2UpOwotfQotCi0KLS8qKgotICogR2VuZXJhdGVzIHN0cnVjdHMgZm9yIGFsbCB0aGUgc2VydmljZSByZXR1cm4gdHlwZXMKLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UKLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9zdHJ1Y3QqIHRzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotICAgIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbnRlcmZhY2UoZl9pbXBsXywgdHMsIGZhbHNlKTsKLSAgICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW1wbGVtZW50YXRpb24oZl9pbXBsXywgdHMsIGZhbHNlLCBmYWxzZSk7ICAKLSAgICBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKCpmX2l0ZXIpOwotICB9Ci19Ci0KLXN0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6ZnVuY3Rpb25fcmVzdWx0X2hlbHBlcl9zdHJ1Y3RfdHlwZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICByZXR1cm4gY2FwaXRhbGl6ZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpOwotICB9IGVsc2UgewotICAgIHJldHVybiBjYXBpdGFsaXplKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgKyAiX3Jlc3VsdCI7Ci0gIH0KLX0KLQotCi1zdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OmZ1bmN0aW9uX2FyZ3NfaGVscGVyX3N0cnVjdF90eXBlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICByZXR1cm4gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKLX0KLQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBhbmQgaGVscGVycyBmb3IgYSBmdW5jdGlvbi4KLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIGNyZWF0ZSBhIHJlc3VsdCBzdHJ1Y3Qgd2l0aCBhIHN1Y2Nlc3MgZmllbGQgb2YgdGhlIHJldHVybiB0eXBlLAotICAvLyBhbmQgYSBmaWVsZCBmb3IgZWFjaCB0eXBlIG9mIGV4Y2VwdGlvbiB0aHJvd24KLSAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCBmdW5jdGlvbl9yZXN1bHRfaGVscGVyX3N0cnVjdF90eXBlKHRmdW5jdGlvbikpOwotICB0X2ZpZWxkIHN1Y2Nlc3ModGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOwotICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7Ci0gIH0KLQotICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICByZXN1bHQuYXBwZW5kKCpmX2l0ZXIpOwotICB9Ci0KLSAgLy8gZ2VuZXJhdGUgdGhlIHJlc3VsdCBzdHJ1Y3QKLSAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2ludGVyZmFjZShmX2ltcGxfLCAmcmVzdWx0LCBmYWxzZSk7Ci0gIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbXBsZW1lbnRhdGlvbihmX2ltcGxfLCAmcmVzdWx0LCBmYWxzZSwgdHJ1ZSk7ICAKLX0KLQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgcHJvdG9jb2wgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBwcm90b2NvbCBkZWZpbml0aW9uIGZvcgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX3Byb3RvY29sKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgb3V0IDw8ICJAcHJvdG9jb2wgIiA8PCBjb2NvYV9wcmVmaXhfIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICIgPE5TT2JqZWN0PiIgPDwgZW5kbDsKLQotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBvdXQgPDwgIi0gIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgIjsiIDw8Ci0gICAgICAiICAvLyB0aHJvd3MgIjsKLSAgICB0X3N0cnVjdCogeHMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKLSAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLSAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgb3V0IDw8IHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCkpICsgIiwgIjsKLSAgICB9Ci0gICAgb3V0IDw8ICJURXhjZXB0aW9uIiA8PCBlbmRsOwotICB9Ci0gIG91dCA8PCAiQGVuZCIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgaW50ZXJmYWNlIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgY2xpZW50IGludGVyZmFjZSBkZWZpbml0aW9uIGZvcgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9pbnRlcmZhY2Uob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIG91dCA8PCAiQGludGVyZmFjZSAiIDw8IGNvY29hX3ByZWZpeF8gPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIkNsaWVudCA6IE5TT2JqZWN0IDwiIDw8Ci0gICAgY29jb2FfcHJlZml4XyA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiPiAiOwotCi0gIHNjb3BlX3VwKG91dCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiaWQgPFRQcm90b2NvbD4gaW5Qcm90b2NvbDsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiaWQgPFRQcm90b2NvbD4gb3V0UHJvdG9jb2w7IiA8PCBlbmRsOwotICBzY29wZV9kb3duKG91dCk7Ci0KLSAgb3V0IDw8ICItIChpZCkgaW5pdFdpdGhQcm90b2NvbDogKGlkIDxUUHJvdG9jb2w+KSBwcm90b2NvbDsiIDw8IGVuZGw7Ci0gIG91dCA8PCAiLSAoaWQpIGluaXRXaXRoSW5Qcm90b2NvbDogKGlkIDxUUHJvdG9jb2w+KSBpblByb3RvY29sIG91dFByb3RvY29sOiAoaWQgPFRQcm90b2NvbD4pIG91dFByb3RvY29sOyIgPDwgZW5kbDsKLSAgb3V0IDw8ICJAZW5kIiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIHNlcnZlciBpbnRlcmZhY2UgZGVmaW5pdGlvbi4gSW4gb3RoZXIgd29yZHMsIHRoZSBUUHJvY2VzcyBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlCi0gKiBzZXJ2aWNlIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgY2xpZW50IGludGVyZmFjZSBkZWZpbml0aW9uIGZvcgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX3NlcnZlcl9pbnRlcmZhY2Uob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIG91dCA8PCAiQGludGVyZmFjZSAiIDw8IGNvY29hX3ByZWZpeF8gPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIlByb2Nlc3NvciA6IE5TT2JqZWN0IDxUUHJvY2Vzc29yPiAiOwotICAKLSAgc2NvcGVfdXAob3V0KTsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJpZCA8IiA8PCBjb2NvYV9wcmVmaXhfIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8Ij4gbVNlcnZpY2U7IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIk5TRGljdGlvbmFyeSAqIG1NZXRob2RNYXA7IiA8PCBlbmRsOwotICBzY29wZV9kb3duKG91dCk7Ci0gIAotICBvdXQgPDwgIi0gKGlkKSBpbml0V2l0aCIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIjogKGlkIDwiIDw8IGNvY29hX3ByZWZpeF8gPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIj4pIHNlcnZpY2U7IiA8PCBlbmRsOwotICBvdXQgPDwgIi0gKGlkPCI8PGNvY29hX3ByZWZpeF8gPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIj4pIHNlcnZpY2U7IiA8PCBlbmRsOwotCi0gIG91dCA8PCAiQGVuZCIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgaW1wbGVtZW50YXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGFuIGltcGxlbWVudGF0aW9uIGZvcgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9pbXBsZW1lbnRhdGlvbihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBvdXQgPDwgIkBpbXBsZW1lbnRhdGlvbiAiIDw8IGNvY29hX3ByZWZpeF8gPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIkNsaWVudCIgPDwgZW5kbDsKLQotICAvLyBpbml0aWFsaXplcnMKLSAgb3V0IDw8ICItIChpZCkgaW5pdFdpdGhQcm90b2NvbDogKGlkIDxUUHJvdG9jb2w+KSBwcm90b2NvbCIgPDwgZW5kbDsKLSAgc2NvcGVfdXAob3V0KTsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gW3NlbGYgaW5pdFdpdGhJblByb3RvY29sOiBwcm90b2NvbCBvdXRQcm90b2NvbDogcHJvdG9jb2xdOyIgPDwgZW5kbDsKLSAgc2NvcGVfZG93bihvdXQpOwotICBvdXQgPDwgZW5kbDsKLQotICBvdXQgPDwgIi0gKGlkKSBpbml0V2l0aEluUHJvdG9jb2w6IChpZCA8VFByb3RvY29sPikgYW5JblByb3RvY29sIG91dFByb3RvY29sOiAoaWQgPFRQcm90b2NvbD4pIGFuT3V0UHJvdG9jb2wiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKG91dCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAic2VsZiA9IFtzdXBlciBpbml0XTsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiaW5Qcm90b2NvbCA9IFthbkluUHJvdG9jb2wgcmV0YWluX3N0dWJdOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJvdXRQcm90b2NvbCA9IFthbk91dFByb3RvY29sIHJldGFpbl9zdHViXTsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHNlbGY7IiA8PCBlbmRsOwotICBzY29wZV9kb3duKG91dCk7Ci0gIG91dCA8PCBlbmRsOwotCi0gIC8vIGRlYWxsb2MKLSAgb3V0IDw8ICItICh2b2lkKSBkZWFsbG9jIiA8PCBlbmRsOwotICBzY29wZV91cChvdXQpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIltpblByb3RvY29sIHJlbGVhc2Vfc3R1Yl07IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIltvdXRQcm90b2NvbCByZWxlYXNlX3N0dWJdOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJbc3VwZXIgZGVhbGxvY19zdHViXTsiIDw8IGVuZGw7Ci0gIHNjb3BlX2Rvd24ob3V0KTsKLSAgb3V0IDw8IGVuZGw7Ci0KLSAgLy8gZ2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0KLSAgICB0X2Z1bmN0aW9uIHNlbmRfZnVuY3Rpb24oZ190eXBlX3ZvaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygic2VuZF8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpKTsKLQotICAgIHN0cmluZyBhcmdzbmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfYXJncyI7Ci0KLSAgICAvLyBPcGVuIGZ1bmN0aW9uCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICItICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZzZW5kX2Z1bmN0aW9uKSA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0KLSAgICAvLyBTZXJpYWxpemUgdGhlIHJlcXVlc3QKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJbb3V0UHJvdG9jb2wgd3JpdGVNZXNzYWdlQmVnaW5XaXRoTmFtZTogQFwiIiA8PCBmdW5uYW1lIDw8ICJcIiIgPDwKLSAgICAgICgoKmZfaXRlciktPmlzX29uZXdheSgpID8gIiB0eXBlOiBUTWVzc2FnZVR5cGVfT05FV0FZIiA6ICIgdHlwZTogVE1lc3NhZ2VUeXBlX0NBTEwiKSA8PAotICAgICAgIiBzZXF1ZW5jZUlEOiAwXTsiIDw8IGVuZGw7Ci0KLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJbb3V0UHJvdG9jb2wgd3JpdGVTdHJ1Y3RCZWdpbldpdGhOYW1lOiBAXCIiIDw8IGFyZ3NuYW1lIDw8ICJcIl07IiA8PCBlbmRsOwotCi0gICAgLy8gd3JpdGUgb3V0IGZ1bmN0aW9uIHBhcmFtZXRlcnMKLSAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOwotICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICBzdHJpbmcgZmllbGROYW1lID0gKCpmbGRfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCgoKmZsZF9pdGVyKS0+Z2V0X3R5cGUoKSkpIHsKLSAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIiA8PCBmaWVsZE5hbWUgPDwgIiAhPSBuaWwpIjsKLSAgICAgICAgc2NvcGVfdXAob3V0KTsKLSAgICAgIH0KLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiW291dFByb3RvY29sIHdyaXRlRmllbGRCZWdpbldpdGhOYW1lOiBAXCIiIDw8IGZpZWxkTmFtZSA8PCAiXCIiCi0gICAgICAgICIgdHlwZTogIiA8PCB0eXBlX3RvX2VudW0oKCpmbGRfaXRlciktPmdldF90eXBlKCkpIDw8Ci0gICAgICAgICIgZmllbGRJRDogIiA8PCAoKmZsZF9pdGVyKS0+Z2V0X2tleSgpIDw8ICJdOyIgPDwgZW5kbDsKLQotICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZsZF9pdGVyLCBmaWVsZE5hbWUpOwotCi0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIltvdXRQcm90b2NvbCB3cml0ZUZpZWxkRW5kXTsiIDw8IGVuZGw7Ci0KLSAgICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKCgqZmxkX2l0ZXIpLT5nZXRfdHlwZSgpKSkgewotICAgICAgICBzY29wZV9kb3duKG91dCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiW291dFByb3RvY29sIHdyaXRlRmllbGRTdG9wXTsiIDw8IGVuZGw7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiW291dFByb3RvY29sIHdyaXRlU3RydWN0RW5kXTsiIDw8IGVuZGw7Ci0KLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJbb3V0UHJvdG9jb2wgd3JpdGVNZXNzYWdlRW5kXTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJbW291dFByb3RvY29sIHRyYW5zcG9ydF0gZmx1c2hdOyIgPDwgZW5kbDsKLQotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgICBvdXQgPDwgZW5kbDsKLQotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgdF9zdHJ1Y3Qgbm9hcmdzKHByb2dyYW1fKTsKLSAgICAgIHRfZnVuY3Rpb24gcmVjdl9mdW5jdGlvbigoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJyZWN2XyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZub2FyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCkpOwotICAgICAgLy8gT3BlbiBmdW5jdGlvbgotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgIi0gIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnJlY3ZfZnVuY3Rpb24pIDw8IGVuZGw7Ci0gICAgICBzY29wZV91cChvdXQpOwotCi0gICAgICAvLyBUT0RPKG1jc2xlZSk6IE1lc3NhZ2UgdmFsaWRhdGlvbiBoZXJlLCB3YXMgdGhlIHNlcWlkIGV0YyBvaz8KLQotICAgICAgLy8gY2hlY2sgZm9yIGFuIGV4Y2VwdGlvbgotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpbnQgbXNnVHlwZSA9IDA7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJbaW5Qcm90b2NvbCByZWFkTWVzc2FnZUJlZ2luUmV0dXJuaW5nTmFtZTogbmlsIHR5cGU6ICZtc2dUeXBlIHNlcXVlbmNlSUQ6IE5VTExdOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKG1zZ1R5cGUgPT0gVE1lc3NhZ2VUeXBlX0VYQ0VQVElPTikgeyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBUQXBwbGljYXRpb25FeGNlcHRpb24gKiB4ID0gW1RBcHBsaWNhdGlvbkV4Y2VwdGlvbiByZWFkOiBpblByb3RvY29sXTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgW2luUHJvdG9jb2wgcmVhZE1lc3NhZ2VFbmRdOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBAdGhyb3cgeDsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgICAgIC8vIEZJWE1FIC0gY291bGQgb3B0aW1pemUgaGVyZSB0byByZWR1Y2UgY3JlYXRpb24gb2YgdGVtcG9yYXJ5IG9iamVjdHMuCi0gICAgICBzdHJpbmcgcmVzdWx0bmFtZSA9IGZ1bmN0aW9uX3Jlc3VsdF9oZWxwZXJfc3RydWN0X3R5cGUoKmZfaXRlcik7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgY29jb2FfcHJlZml4XyA8PCByZXN1bHRuYW1lIDw8ICIgKiByZXN1bHQgPSBbW1siIDw8IGNvY29hX3ByZWZpeF8gPDwKLSAgICAgICAgcmVzdWx0bmFtZSA8PCAiIGFsbG9jXSBpbml0XSBhdXRvcmVsZWFzZV9zdHViXTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiW3Jlc3VsdCByZWFkOiBpblByb3RvY29sXTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiW2luUHJvdG9jb2wgcmVhZE1lc3NhZ2VFbmRdOyIgPDwgZW5kbDsKLQotICAgICAgLy8gQ2FyZWZ1bCwgb25seSByZXR1cm4gX3Jlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCi0gICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIG91dCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAoW3Jlc3VsdCBzdWNjZXNzSXNTZXRdKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIFtyZXN1bHQgc3VjY2Vzc107IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOwotICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLSAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgICAgIG91dCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAoW3Jlc3VsdCAiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiSXNTZXRdKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgQHRocm93IFtyZXN1bHQgIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIl07IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIC8vIElmIHlvdSBnZXQgaGVyZSBpdCdzIGFuIGV4Y2VwdGlvbiwgdW5sZXNzIGEgdm9pZCBmdW5jdGlvbgotICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICAgInJldHVybjsiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiQHRocm93IFtUQXBwbGljYXRpb25FeGNlcHRpb24gZXhjZXB0aW9uV2l0aFR5cGU6IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbl9NSVNTSU5HX1JFU1VMVCIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbjogQFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiBmYWlsZWQ6IHVua25vd24gcmVzdWx0XCJdOyIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgLy8gQ2xvc2UgZnVuY3Rpb24KLSAgICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgICAgIG91dCA8PCBlbmRsOwotICAgIH0KLQotICAgIC8vIE9wZW4gZnVuY3Rpb24KLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIi0gIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgZW5kbDsKLSAgICBzY29wZV91cChvdXQpOwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiW3NlbGYgc2VuZF8iIDw8IGZ1bm5hbWU7Ci0KLSAgICAvLyBEZWNsYXJlIHRoZSBmdW5jdGlvbiBhcmd1bWVudHMKLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgc3RyaW5nIGZpZWxkTmFtZSA9ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICAgb3V0IDw8ICIgIjsKLSAgICAgIGlmIChmaXJzdCkgewotICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICBvdXQgPDwgIjogIiA8PCBmaWVsZE5hbWU7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgZmllbGROYW1lIDw8ICI6ICIgPDwgZmllbGROYW1lOwotICAgICAgfQotICAgIH0KLSAgICBvdXQgPDwgIl07IiA8PCBlbmRsOwotCi0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCk7Ci0gICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIG91dCA8PCAicmV0dXJuICI7Ci0gICAgICB9Ci0gICAgICBvdXQgPDwKLSAgICAgICAgIltzZWxmIHJlY3ZfIiA8PCBmdW5uYW1lIDw8ICJdOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgc2NvcGVfZG93bihvdXQpOwotICAgIG91dCA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLQotICBvdXQgPDwgIkBlbmQiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2Ugc2VydmVyIGltcGxlbWVudGF0aW9uLiAgSW4gb3RoZXIgd29yZHMgdGhlIGFjdHVhbCBUUHJvY2Vzc29yIGltcGxlbWVudGF0aW9uCi0gKiBmb3IgdGhlIHNlcnZpY2UuCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGFuIGltcGxlbWVudGF0aW9uIGZvcgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX3NlcnZlcl9pbXBsZW1lbnRhdGlvbihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBvdXQgPDwgIkBpbXBsZW1lbnRhdGlvbiAiIDw8IGNvY29hX3ByZWZpeF8gPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIlByb2Nlc3NvciIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIAotICAvLyBpbml0aWFsaXplcgotICBvdXQgPDwgZW5kbDsKLSAgb3V0IDw8ICItIChpZCkgaW5pdFdpdGgiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICI6IChpZCA8IiA8PCBjb2NvYV9wcmVmaXhfIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICI+KSBzZXJ2aWNlIiA8PCBlbmRsOwotICBzY29wZV91cChvdXQpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgInNlbGYgPSBbc3VwZXIgaW5pdF07IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghc2VsZikgeyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBuaWw7IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAibVNlcnZpY2UgPSBbc2VydmljZSByZXRhaW5fc3R1Yl07IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIm1NZXRob2RNYXAgPSBbW05TTXV0YWJsZURpY3Rpb25hcnkgZGljdGlvbmFyeV0gcmV0YWluX3N0dWJdOyIgPDwgZW5kbDsKLSAgCi0gIC8vIGdlbmVyYXRlIG1ldGhvZCBtYXAgZm9yIHJvdXRpbmcgaW5jb21pbmcgY2FsbHMKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgc2NvcGVfdXAob3V0KTsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIlNFTCBzID0gQHNlbGVjdG9yKHByb2Nlc3NfIiA8PCBmdW5uYW1lIDw8ICJfd2l0aFNlcXVlbmNlSUQ6aW5Qcm90b2NvbDpvdXRQcm90b2NvbDopOyIgPDwgZW5kbDsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIk5TTWV0aG9kU2lnbmF0dXJlICogc2lnID0gW3NlbGYgbWV0aG9kU2lnbmF0dXJlRm9yU2VsZWN0b3I6IHNdOyIgPDwgZW5kbDsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIk5TSW52b2NhdGlvbiAqIGludm9jYXRpb24gPSBbTlNJbnZvY2F0aW9uIGludm9jYXRpb25XaXRoTWV0aG9kU2lnbmF0dXJlOiBzaWddOyIgPDwgZW5kbDsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltpbnZvY2F0aW9uIHNldFNlbGVjdG9yOiBzXTsiIDw8IGVuZGw7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJbaW52b2NhdGlvbiByZXRhaW5Bcmd1bWVudHNdOyIgPDwgZW5kbDsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIlttTWV0aG9kTWFwIHNldFZhbHVlOiBpbnZvY2F0aW9uIGZvcktleTogQFwiIiA8PCBmdW5uYW1lIDw8ICJcIl07IiA8PCBlbmRsOwotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgfQotICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBzZWxmOyIgPDwgZW5kbDsKLSAgc2NvcGVfZG93bihvdXQpOwotICAKLSAgLy8gaW1wbGVtZW50YXRpb24gb2YgdGhlICdzZXJ2aWNlJyBtZXRob2Qgd2hpY2ggcmV0dXJucyB0aGUgc2VydmljZSBhc3NvY2lhdGVkIHdpdGggdGhpcwotICAvLyBwcm9jZXNzb3IKLSAgb3V0IDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiLSAoaWQ8Ijw8Y29jb2FfcHJlZml4XyA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiPikgc2VydmljZSIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIFtbbVNlcnZpY2UgcmV0YWluX3N0dWJdIGF1dG9yZWxlYXNlX3N0dWJdOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAKLSAgLy8gaW1wbGVtZW50YXRpb24gb2YgdGhlIFRQcm9jZXNzIG1ldGhvZCwgd2hpY2ggZGlzcGF0Y2hlcyB0aGUgaW5jb21pbmcgY2FsbCB1c2luZyB0aGUgbWV0aG9kIG1hcAotICBvdXQgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICItIChCT09MKSBwcm9jZXNzT25JbnB1dFByb3RvY29sOiAoaWQgPFRQcm90b2NvbD4pIGluUHJvdG9jb2wiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgICAgICAgICAgICAgICBvdXRwdXRQcm90b2NvbDogKGlkIDxUUHJvdG9jb2w+KSBvdXRQcm90b2NvbCIgPDxlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICBOU1N0cmluZyAqIG1lc3NhZ2VOYW1lOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgIGludCBtZXNzYWdlVHlwZTsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICBpbnQgc2VxSUQ7IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgW2luUHJvdG9jb2wgcmVhZE1lc3NhZ2VCZWdpblJldHVybmluZ05hbWU6ICZtZXNzYWdlTmFtZSIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAmbWVzc2FnZVR5cGUiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VJRDogJnNlcUlEXTsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICBOU0ludm9jYXRpb24gKiBpbnZvY2F0aW9uID0gW21NZXRob2RNYXAgdmFsdWVGb3JLZXk6IG1lc3NhZ2VOYW1lXTsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICBpZiAoaW52b2NhdGlvbiA9PSBuaWwpIHsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgIFtUUHJvdG9jb2xVdGlsIHNraXBUeXBlOiBUVHlwZV9TVFJVQ1Qgb25Qcm90b2NvbDogaW5Qcm90b2NvbF07IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICBbaW5Qcm90b2NvbCByZWFkTWVzc2FnZUVuZF07IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICBUQXBwbGljYXRpb25FeGNlcHRpb24gKiB4ID0gW1RBcHBsaWNhdGlvbkV4Y2VwdGlvbiBleGNlcHRpb25XaXRoVHlwZTogVEFwcGxpY2F0aW9uRXhjZXB0aW9uX1VOS05PV05fTUVUSE9EIHJlYXNvbjogW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6IEBcIkludmFsaWQgbWV0aG9kIG5hbWU6ICclQCdcIiwgbWVzc2FnZU5hbWVdXTsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgIFtvdXRQcm90b2NvbCB3cml0ZU1lc3NhZ2VCZWdpbldpdGhOYW1lOiBtZXNzYWdlTmFtZSIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFRNZXNzYWdlVHlwZV9FWENFUFRJT04iIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZUlEOiBzZXFJRF07IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICBbeCB3cml0ZTogb3V0UHJvdG9jb2xdOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgW291dFByb3RvY29sIHdyaXRlTWVzc2FnZUVuZF07IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICBbW291dFByb3RvY29sIHRyYW5zcG9ydF0gZmx1c2hdOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgcmV0dXJuIFlFUzsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgLy8gTlNJbnZvY2F0aW9uIGRvZXMgbm90IGNvbmZvcm0gdG8gTlNDb3B5aW5nIHByb3RvY29sIiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgTlNJbnZvY2F0aW9uICogaSA9IFtOU0ludm9jYXRpb24gaW52b2NhdGlvbldpdGhNZXRob2RTaWduYXR1cmU6IFtpbnZvY2F0aW9uIG1ldGhvZFNpZ25hdHVyZV1dOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgIFtpIHNldFNlbGVjdG9yOiBbaW52b2NhdGlvbiBzZWxlY3Rvcl1dOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgIFtpIHNldEFyZ3VtZW50OiAmc2VxSUQgYXRJbmRleDogMl07IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgW2kgc2V0QXJndW1lbnQ6ICZpblByb3RvY29sIGF0SW5kZXg6IDNdOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgIFtpIHNldEFyZ3VtZW50OiAmb3V0UHJvdG9jb2wgYXRJbmRleDogNF07IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgW2kgc2V0VGFyZ2V0OiBzZWxmXTsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICBbaSBpbnZva2VdOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBZRVM7IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gIAotICAvLyBnZW5lcmF0ZSBhIHByb2Nlc3NfWFhYWCBtZXRob2QgZm9yIGVhY2ggc2VydmljZSBmdW5jdGlvbiwgd2hpY2ggcmVhZHMgYXJncywgY2FsbHMgdGhlIHNlcnZpY2UsIGFuZCB3cml0ZXMgcmVzdWx0cwotICBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIG91dCA8PCBlbmRsOwotICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiLSAodm9pZCkgcHJvY2Vzc18iIDw8IGZ1bm5hbWUgPDwgIl93aXRoU2VxdWVuY2VJRDogKGludDMyX3QpIHNlcUlEIGluUHJvdG9jb2w6IChpZDxUUHJvdG9jb2w+KSBpblByb3RvY29sIG91dFByb3RvY29sOiAoaWQ8VFByb3RvY29sPikgb3V0UHJvdG9jb2wiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAob3V0KTsKLSAgICBzdHJpbmcgYXJnc3R5cGUgPSBjb2NvYV9wcmVmaXhfICsgZnVuY3Rpb25fYXJnc19oZWxwZXJfc3RydWN0X3R5cGUoKmZfaXRlcik7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8IGFyZ3N0eXBlIDw8ICIgKiBhcmdzID0gW1siIDw8IGFyZ3N0eXBlIDw8ICIgYWxsb2NdIGluaXRdOyIgPDwgZW5kbDsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIlthcmdzIHJlYWQ6IGluUHJvdG9jb2xdOyIgPDwgZW5kbDsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltpblByb3RvY29sIHJlYWRNZXNzYWdlRW5kXTsiIDw8IGVuZGw7Ci0gICAgCi0gICAgLy8gcHJlcGFyZSB0aGUgcmVzdWx0IGlmIG5vdCBvbmV3YXkKLSAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgICAgc3RyaW5nIHJlc3VsdHR5cGUgPSBjb2NvYV9wcmVmaXhfICsgZnVuY3Rpb25fcmVzdWx0X2hlbHBlcl9zdHJ1Y3RfdHlwZSgqZl9pdGVyKTsKLSAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8IHJlc3VsdHR5cGUgPDwgIiAqIHJlc3VsdCA9IFtbIiA8PCByZXN1bHR0eXBlIDw8ICIgYWxsb2NdIGluaXRdOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICAvLyBtYWtlIHRoZSBjYWxsIHRvIHRoZSBhY3R1YWwgc2VydmljZSBvYmplY3QKLSAgICBvdXQgPDwgaW5kZW50KCk7Ci0gICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgb3V0IDw8ICJbcmVzdWx0IHNldFN1Y2Nlc3M6ICI7Ci0gICAgfQotICAgIG91dCA8PCAiW21TZXJ2aWNlICIgPDwgZnVubmFtZTsKLSAgICAvLyBzdXBwbHlpbmcgYXJndW1lbnRzCi0gICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgc3RyaW5nIGZpZWxkTmFtZSA9ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgIG91dCA8PCAiOiBbYXJncyAiIDw8IGZpZWxkTmFtZSA8PCAiXSI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgIiAiIDw8IGZpZWxkTmFtZSA8PCAiOiBbYXJncyAiIDw8IGZpZWxkTmFtZSA8PCAiXSI7Ci0gICAgICB9Ci0gICAgfQotICAgIG91dCA8PCAiXSI7Ci0gICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgb3V0IDw8ICJdIjsKLSAgICB9Ci0gICAgb3V0IDw8ICI7IiA8PCBlbmRsOwotICAgIAotICAgIC8vIHdyaXRlIG91dCB0aGUgcmVzdWx0IGlmIG5vdCBvbmV3YXkKLSAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJbb3V0UHJvdG9jb2wgd3JpdGVNZXNzYWdlQmVnaW5XaXRoTmFtZTogQFwiIiA8PCBmdW5uYW1lIDw8ICJcIiIgPDwgZW5kbDsKLSAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogVE1lc3NhZ2VUeXBlX1JFUExZIiA8PCBlbmRsOwotICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZUlEOiBzZXFJRF07IiA8PCBlbmRsOwotICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltyZXN1bHQgd3JpdGU6IG91dFByb3RvY29sXTsiIDw8IGVuZGw7Ci0gICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW291dFByb3RvY29sIHdyaXRlTWVzc2FnZUVuZF07IiA8PCBlbmRsOwotICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltbb3V0UHJvdG9jb2wgdHJhbnNwb3J0XSBmbHVzaF07IiA8PCBlbmRsOwotICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltyZXN1bHQgcmVsZWFzZV9zdHViXTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW2FyZ3MgcmVsZWFzZV9zdHViXTsiIDw8IGVuZGw7Ci0gICAgCi0gICAgc2NvcGVfZG93bihvdXQpOwotICB9Ci0gIAotICAvLyBkZWFsbG9jCi0gIG91dCA8PCBlbmRsOwotICBvdXQgPDwgIi0gKHZvaWQpIGRlYWxsb2MiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKG91dCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiW21TZXJ2aWNlIHJlbGVhc2Vfc3R1Yl07IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIlttTWV0aG9kTWFwIHJlbGVhc2Vfc3R1Yl07IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIltzdXBlciBkZWFsbG9jX3N0dWJdOyIgPDwgZW5kbDsKLSAgc2NvcGVfZG93bihvdXQpOwotICBvdXQgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotCi0gIG91dCA8PCAiQGVuZCIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0KLS8qKgotICogRGVzZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCi0gKgotICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQKLSAqIEBwYXJhbSBmaWVsZE5hbWUgVGhlIHZhcmlhYmxlIG5hbWUgZm9yIHRoaXMgZmllbGQKLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmaWVsZE5hbWUpIHsKLSAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOwotCi0gIGlmICh0eXBlLT5pc192b2lkKCkpIHsKLSAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIERFU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArCi0gICAgICB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gIH0KLQotICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0X3N0cnVjdCopdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGROYW1lKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIGZpZWxkTmFtZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgIHR5cGVfbmFtZSh0eXBlKSA8PCAiICIgPDwgZmllbGROYW1lIDw8ICIgPSBbaW5Qcm90b2NvbCAiOwotCi0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsKLSAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIGlmICgoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgICAgICBvdXQgPDwgInJlYWRCaW5hcnldOyI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgb3V0IDw8ICJyZWFkU3RyaW5nXTsiOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICBvdXQgPDwgInJlYWRCb29sXTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgb3V0IDw8ICJyZWFkQnl0ZV07IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgb3V0IDw8ICJyZWFkSTE2XTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICBvdXQgPDwgInJlYWRJMzJdOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgIG91dCA8PCAicmVhZEk2NF07IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgb3V0IDw8ICJyZWFkRG91YmxlXTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gT2JqZWN0aXZlLUMgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICBvdXQgPDwgInJlYWRJMzJdOyI7Ci0gICAgfQotICAgIG91dCA8PAotICAgICAgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBERVNFUklBTElaRSBGSUVMRCAnJXMnIFRZUEUgJyVzJ1xuIiwKLSAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksIHR5cGVfbmFtZSh0eXBlKS5jX3N0cigpKTsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhbiB1bnNlcmlhbGl6ZXIgZm9yIGEgc3RydWN0LCBhbGxvY2F0ZXMgdGhlIHN0cnVjdCBhbmQgaW52b2tlcyByZWFkOgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZmllbGROYW1lKSB7Ci0gIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCBmaWVsZE5hbWUgPDwgIiA9IFtbIiA8PAotICAgIHR5cGVfbmFtZSh0c3RydWN0LCB0cnVlKSA8PCAiIGFsbG9jXSBpbml0XTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJbIiA8PCBmaWVsZE5hbWUgPDwgIiByZWFkOiBpblByb3RvY29sXTsiIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogRGVzZXJpYWxpemVzIGEgY29udGFpbmVyIGJ5IHJlYWRpbmcgaXRzIHNpemUgYW5kIHRoZW4gaXRlcmF0aW5nCi0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZpZWxkTmFtZSkgewotICBzdHJpbmcgc2l6ZSA9IHRtcCgiX3NpemUiKTsKLSAgaW5kZW50KG91dCkgPDwgImludCAiIDw8IHNpemUgPDwgIjsiIDw8IGVuZGw7Ci0KLSAgLy8gRGVjbGFyZSB2YXJpYWJsZXMsIHJlYWQgaGVhZGVyCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KQotICAgICAgPDwgIltpblByb3RvY29sIHJlYWRNYXBCZWdpblJldHVybmluZ0tleVR5cGU6IE5VTEwgdmFsdWVUeXBlOiBOVUxMIHNpemU6ICYiIDw8Ci0gICAgICBzaXplIDw8ICJdOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiTlNNdXRhYmxlRGljdGlvbmFyeSAqICIgPDwgZmllbGROYW1lIDw8Ci0gICAgICAiID0gW1tOU011dGFibGVEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aENhcGFjaXR5OiAiIDw8IHNpemUgPDwgIl07IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpCi0gICAgICA8PCAiW2luUHJvdG9jb2wgcmVhZFNldEJlZ2luUmV0dXJuaW5nRWxlbWVudFR5cGU6IE5VTEwgc2l6ZTogJiIgPDwgc2l6ZSA8PCAiXTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIk5TTXV0YWJsZVNldCAqICIgPDwgZmllbGROYW1lIDw8Ci0gICAgICAiID0gW1tOU011dGFibGVTZXQgYWxsb2NdIGluaXRXaXRoQ2FwYWNpdHk6ICIgPDwgc2l6ZSA8PCAiXTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpCi0gICAgICA8PCAiW2luUHJvdG9jb2wgcmVhZExpc3RCZWdpblJldHVybmluZ0VsZW1lbnRUeXBlOiBOVUxMIHNpemU6ICYiIDw8IHNpemUgPDwgIl07IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJOU011dGFibGVBcnJheSAqICIgPDwgZmllbGROYW1lIDw8Ci0gICAgICAiID0gW1tOU011dGFibGVBcnJheSBhbGxvY10gaW5pdFdpdGhDYXBhY2l0eTogIiA8PCBzaXplIDw8ICJdOyIgPDwgZW5kbDsKLSAgfQotICAvLyBGSVhNRSAtIHRoZSBjb2RlIGFib3ZlIGRvZXMgbm90IHZlcmlmeSB0aGF0IHRoZSBlbGVtZW50IHR5cGVzIG9mCi0gIC8vIHRoZSBjb250YWluZXJzIGJlaW5nIHJlYWQgbWF0Y2ggdGhlIGVsZW1lbnQgdHlwZXMgb2YgdGhlCi0gIC8vIGNvbnRhaW5lcnMgd2UgYXJlIHJlYWRpbmcgaW50by4gIERvZXMgdGhhdCBtYXR0ZXI/Ci0KLSAgLy8gRm9yIGxvb3AgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cwotICBzdHJpbmcgaSA9IHRtcCgiX2kiKTsKLSAgaW5kZW50KG91dCkgPDwgImludCAiIDw8IGkgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiZm9yICgiIDw8IGkgPDwgIiA9IDA7ICIgPDwKLSAgICBpIDw8ICIgPCAiIDw8IHNpemUgPDwgIjsgIiA8PAotICAgICIrKyIgPDwgaSA8PCAiKSIgPDwgZW5kbDsKLQotICAgIHNjb3BlX3VwKG91dCk7Ci0KLSAgICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIGZpZWxkTmFtZSk7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgZmllbGROYW1lKTsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBmaWVsZE5hbWUpOwotICAgIH0KLQotICAgIHNjb3BlX2Rvd24ob3V0KTsKLQotICAvLyBSZWFkIGNvbnRhaW5lciBlbmQKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJbaW5Qcm90b2NvbCByZWFkTWFwRW5kXTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIltpblByb3RvY29sIHJlYWRTZXRFbmRdOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIltpblByb3RvY29sIHJlYWRMaXN0RW5kXTsiIDw8IGVuZGw7Ci0gIH0KLQotfQotCi0KLS8qKgotICogVGFrZSBhIHZhcmlhYmxlIG9mIGEgZ2l2ZW4gdHlwZSBhbmQgd3JhcCBpdCBpbiBjb2RlIHRvIG1ha2UgaXQKLSAqIHN1aXRhYmxlIGZvciBwdXR0aW5nIGludG8gYSBjb250YWluZXIsIGlmIG5lY2Vzc2FyeS4gIEJhc2ljYWxseSwKLSAqIHdyYXAgc2NhbGVyIHByaW1pdGl2ZXMgaW4gTlNOdW1iZXIgb2JqZWN0cy4KLSAqLwotc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjpjb250YWluZXJpemUodF90eXBlICogdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZmllbGROYW1lKQotewotICAvLyBGSVhNRSAtIG9wdGltaXplIGhlcmUgdG8gYXZvaWQgYXV0b3JlbGVhc2UgcG9vbD8KLSAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKLSAgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gIltOU051bWJlciBudW1iZXJXaXRoSW50OiAiICsgZmllbGROYW1lICsgIl0iOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgIHRocm93ICJjYW4ndCBjb250YWluZXJpemUgdm9pZCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuICJbTlNOdW1iZXIgbnVtYmVyV2l0aEJvb2w6ICIgKyBmaWVsZE5hbWUgKyAiXSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgcmV0dXJuICJbTlNOdW1iZXIgbnVtYmVyV2l0aFVuc2lnbmVkQ2hhcjogIiArIGZpZWxkTmFtZSArICJdIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIHJldHVybiAiW05TTnVtYmVyIG51bWJlcldpdGhTaG9ydDogIiArIGZpZWxkTmFtZSArICJdIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIHJldHVybiAiW05TTnVtYmVyIG51bWJlcldpdGhMb25nOiAiICsgZmllbGROYW1lICsgIl0iOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmV0dXJuICJbTlNOdW1iZXIgbnVtYmVyV2l0aExvbmdMb25nOiAiICsgZmllbGROYW1lICsgIl0iOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuICJbTlNOdW1iZXIgbnVtYmVyV2l0aERvdWJsZTogIiArIGZpZWxkTmFtZSArICJdIjsKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgLy8gZG8gbm90aGluZwotICByZXR1cm4gZmllbGROYW1lOwotfQotCi0KLS8qKgotICogR2VuZXJhdGVzIGNvZGUgdG8gZGVzZXJpYWxpemUgYSBtYXAgZWxlbWVudAotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZmllbGROYW1lKSB7Ci0gIHN0cmluZyBrZXkgPSB0bXAoIl9rZXkiKTsKLSAgc3RyaW5nIHZhbCA9IHRtcCgiX3ZhbCIpOwotICB0X3R5cGUqIGtleVR5cGUgPSB0bWFwLT5nZXRfa2V5X3R5cGUoKTsKLSAgdF90eXBlKiB2YWxUeXBlID0gdG1hcC0+Z2V0X3ZhbF90eXBlKCk7Ci0gIHRfZmllbGQgZmtleShrZXlUeXBlLCBrZXkpOwotICB0X2ZpZWxkIGZ2YWwodmFsVHlwZSwgdmFsKTsKLQotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZma2V5LCBrZXkpOwotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmdmFsLCB2YWwpOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgIlsiIDw8IGZpZWxkTmFtZSA8PCAiIHNldE9iamVjdDogIiA8PCBjb250YWluZXJpemUodmFsVHlwZSwgdmFsKSA8PAotICAgICIgZm9yS2V5OiAiIDw8IGNvbnRhaW5lcml6ZShrZXlUeXBlLCBrZXkpIDw8ICJdOyIgPDwgZW5kbDsKLQotICBpZiAodHlwZV9jYW5fYmVfbnVsbChrZXlUeXBlKSkgewotICAgIGlmICghKGdldF90cnVlX3R5cGUoa2V5VHlwZSktPmlzX3N0cmluZygpKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIlsiIDw8IGNvbnRhaW5lcml6ZShrZXlUeXBlLCBrZXkpIDw8ICIgcmVsZWFzZV9zdHViXTsiIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgaWYgKHR5cGVfY2FuX2JlX251bGwodmFsVHlwZSkpIHsKLSAgICBpZiAoIShnZXRfdHJ1ZV90eXBlKHZhbFR5cGUpLT5pc19zdHJpbmcoKSkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJbIiA8PCBjb250YWluZXJpemUodmFsVHlwZSwgdmFsKSA8PCAiIHJlbGVhc2Vfc3R1Yl07IiA8PCBlbmRsOwotICAgIH0KLSAgfQotfQotCi0vKioKLSAqIERlc2VyaWFsaXplcyBhIHNldCBlbGVtZW50Ci0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmaWVsZE5hbWUpIHsKLSAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7Ci0gIHRfdHlwZSogdHlwZSA9IHRzZXQtPmdldF9lbGVtX3R5cGUoKTsKLSAgdF9maWVsZCBmZWxlbSh0eXBlLCBlbGVtKTsKLQotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSwgZWxlbSk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAiWyIgPDwgZmllbGROYW1lIDw8ICIgYWRkT2JqZWN0OiAiIDw8IGNvbnRhaW5lcml6ZSh0eXBlLCBlbGVtKSA8PCAiXTsiIDw8IGVuZGw7Ci0KLSAgaWYgKHR5cGVfY2FuX2JlX251bGwodHlwZSkpIHsKLSAgICAvLyBkZXNlcmlhbGl6ZWQgc3RyaW5ncyBhcmUgYXV0b3JlbGVhc2UsIHNvIGRvbid0IHJlbGVhc2UgdGhlbQotICAgIGlmICghKGdldF90cnVlX3R5cGUodHlwZSktPmlzX3N0cmluZygpKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIlsiIDw8IGNvbnRhaW5lcml6ZSh0eXBlLCBlbGVtKSA8PCAiIHJlbGVhc2Vfc3R1Yl07IiA8PCBlbmRsOwotICAgIH0KLSAgfQotfQotCi0vKioKLSAqIERlc2VyaWFsaXplcyBhIGxpc3QgZWxlbWVudAotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmaWVsZE5hbWUpIHsKLSAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7Ci0gIHRfdHlwZSogdHlwZSA9IHRsaXN0LT5nZXRfZWxlbV90eXBlKCk7Ci0gIHRfZmllbGQgZmVsZW0odHlwZSwgZWxlbSk7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0sIGVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgIlsiIDw8IGZpZWxkTmFtZSA8PCAiIGFkZE9iamVjdDogIiA8PCBjb250YWluZXJpemUodHlwZSwgZWxlbSkgPDwgIl07IiA8PCBlbmRsOwotCi0gIGlmICh0eXBlX2Nhbl9iZV9udWxsKHR5cGUpKSB7Ci0gICAgaWYgKCEoZ2V0X3RydWVfdHlwZSh0eXBlKS0+aXNfc3RyaW5nKCkpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiWyIgPDwgY29udGFpbmVyaXplKHR5cGUsIGVsZW0pIDw8ICIgcmVsZWFzZV9zdHViXTsiIDw8IGVuZGw7Ci0gICAgfQotICB9Ci19Ci0KLQotLyoqCi0gKiBTZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCi0gKgotICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQgdG8gc2VyaWFsaXplCi0gKiBAcGFyYW0gZmllbGROYW1lIE5hbWUgdG8gb2YgdGhlIHZhcmlhYmxlIGhvbGRpbmcgdGhlIGZpZWxkCi0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZmllbGROYW1lKSB7Ci0gIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLQotICAvLyBEbyBub3RoaW5nIGZvciB2b2lkIHR5cGVzCi0gIGlmICh0eXBlLT5pc192b2lkKCkpIHsKLSAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIFNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKwotICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0X3N0cnVjdCopdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkTmFtZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZE5hbWUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiW291dFByb3RvY29sICI7Ci0KLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgdGhyb3cKLSAgICAgICAgICAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIGZpZWxkTmFtZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgaWYgKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSkgewotICAgICAgICAgIG91dCA8PCAid3JpdGVCaW5hcnk6ICIgPDwgZmllbGROYW1lIDw8ICJdOyI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgb3V0IDw8ICJ3cml0ZVN0cmluZzogIiA8PCBmaWVsZE5hbWUgPDwgIl07IjsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUJvb2w6ICIgPDwgZmllbGROYW1lIDw8ICJdOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICBvdXQgPDwgIndyaXRlQnl0ZTogIiA8PCBmaWVsZE5hbWUgPDwgIl07IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUkxNjogIiA8PCBmaWVsZE5hbWUgPDwgIl07IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUkzMjogIiA8PCBmaWVsZE5hbWUgPDwgIl07IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUk2NDogIiA8PCBmaWVsZE5hbWUgPDwgIl07IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgb3V0IDw8ICJ3cml0ZURvdWJsZTogIiA8PCBmaWVsZE5hbWUgPDwgIl07IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIE9iamVjdGl2ZS1DIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgb3V0IDw8ICJ3cml0ZUkzMjogIiA8PCBmaWVsZE5hbWUgPDwgIl07IjsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gU0VSSUFMSVpFIEZJRUxEICclcycgVFlQRSAnJXMnXG4iLAotICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKLSAgICAgICAgICAgdHlwZV9uYW1lKHR5cGUpLmNfc3RyKCkpOwotICB9Ci19Ci0KLS8qKgotICogU2VyaWFsaXplIGEgc3RydWN0LgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgdG8gc2VyaWFsaXplCi0gKiBAcGFyYW0gZmllbGROYW1lIE5hbWUgb2YgdmFyaWFibGUgaG9sZGluZyBzdHJ1Y3QKLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZpZWxkTmFtZSkgewotICAodm9pZCkgdHN0cnVjdDsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgIlsiIDw8IGZpZWxkTmFtZSA8PCAiIHdyaXRlOiBvdXRQcm90b2NvbF07IiA8PCBlbmRsOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgYSBjb250YWluZXIgYnkgd3JpdGluZyBpdHMgc2l6ZSB0aGVuIHRoZSBlbGVtZW50cy4KLSAqCi0gKiBAcGFyYW0gdHR5cGUgIFRoZSB0eXBlIG9mIGNvbnRhaW5lcgotICogQHBhcmFtIGZpZWxkTmFtZSBOYW1lIG9mIHZhcmlhYmxlIGhvbGRpbmcgY29udGFpbmVyCi0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZpZWxkTmFtZSkgewotICBzY29wZV91cChvdXQpOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIltvdXRQcm90b2NvbCB3cml0ZU1hcEJlZ2luV2l0aEtleVR5cGU6ICIgPDwKLSAgICAgIHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKSA8PCAiIHZhbHVlVHlwZTogIiA8PAotICAgICAgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpIDw8ICIgc2l6ZTogWyIgPDwKLSAgICAgIGZpZWxkTmFtZSA8PCAiIGNvdW50XV07IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiW291dFByb3RvY29sIHdyaXRlU2V0QmVnaW5XaXRoRWxlbWVudFR5cGU6ICIgPDwKLSAgICAgIHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiBzaXplOiBbIiA8PAotICAgICAgZmllbGROYW1lIDw8ICIgY291bnRdXTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiW291dFByb3RvY29sIHdyaXRlTGlzdEJlZ2luV2l0aEVsZW1lbnRUeXBlOiAiIDw8Ci0gICAgICB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiIHNpemU6IFsiIDw8Ci0gICAgICBmaWVsZE5hbWUgPDwgIiBjb3VudF1dOyIgPDwgZW5kbDsKLSAgfQotCi0gIHN0cmluZyBpdGVyID0gdG1wKCJfaXRlciIpOwotICBzdHJpbmcga2V5OwotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAga2V5ID0gdG1wKCJrZXkiKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiTlNFbnVtZXJhdG9yICogIiA8PCBpdGVyIDw8ICIgPSBbIiA8PCBmaWVsZE5hbWUgPDwgIiBrZXlFbnVtZXJhdG9yXTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgImlkICIgPDwga2V5IDw8ICI7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJ3aGlsZSAoKCIgPDwga2V5IDw8ICIgPSBbIiA8PCBpdGVyIDw8ICIgbmV4dE9iamVjdF0pKSIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBrZXkgPSB0bXAoIm9iaiIpOwotICAgIGluZGVudChvdXQpIDw8ICJOU0VudW1lcmF0b3IgKiAiIDw8IGl0ZXIgPDwgIiA9IFsiIDw8IGZpZWxkTmFtZSA8PCAiIG9iamVjdEVudW1lcmF0b3JdOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiaWQgIiA8PCBrZXkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIndoaWxlICgoIiA8PCBrZXkgPDwgIiA9IFsiIDw8IGl0ZXIgPDwgIiBuZXh0T2JqZWN0XSkpIiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBrZXkgPSB0bXAoImlkeCIpOwotICAgIGluZGVudChvdXQpIDw8ICJpbnQgIiA8PCBrZXkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJmb3IgKCIgPDwga2V5IDw8ICIgPSAwOyAiIDw8IGtleSA8PCAiIDwgWyIgPDwgZmllbGROYW1lIDw8ICIgY291bnRdOyAiIDw8IGtleSA8PCAiKyspIiA8PCBlbmRsOwotICB9Ci0KLSAgICBzY29wZV91cChvdXQpOwotCi0gICAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwga2V5LCBmaWVsZE5hbWUpOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBrZXkpOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBrZXksIGZpZWxkTmFtZSk7Ci0gICAgfQotCi0gICAgc2NvcGVfZG93bihvdXQpOwotCi0gICAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgIltvdXRQcm90b2NvbCB3cml0ZU1hcEVuZF07IiA8PCBlbmRsOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAiW291dFByb3RvY29sIHdyaXRlU2V0RW5kXTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAiW291dFByb3RvY29sIHdyaXRlTGlzdEVuZF07IiA8PCBlbmRsOwotICAgIH0KLQotICBzY29wZV9kb3duKG91dCk7Ci19Ci0KLS8qKgotICogR2l2ZW4gYSBmaWVsZCB2YXJpYWJsZSBuYW1lLCB3cmFwIGl0IGluIGNvZGUgdGhhdCBjb252ZXJ0cyBpdCB0byBhCi0gKiBwcmltaXRpdmUgdHlwZSwgaWYgbmVjZXNzYXJ5LgotICovCi1zdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OmRlY29udGFpbmVyaXplKHRfZmllbGQgKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmaWVsZE5hbWUpCi17Ci0gIHRfdHlwZSAqIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOwotICBpZiAodHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAiWyIgKyBmaWVsZE5hbWUgKyAiIGludFZhbHVlXSI7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgdGhyb3cgImNhbid0IGRlY29udGFpbmVyaXplIHZvaWQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIHJldHVybiAiWyIgKyBmaWVsZE5hbWUgKyAiIGJvb2xWYWx1ZV0iOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIHJldHVybiAiWyIgKyBmaWVsZE5hbWUgKyAiIHVuc2lnbmVkQ2hhclZhbHVlXSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICByZXR1cm4gIlsiICsgZmllbGROYW1lICsgIiBzaG9ydFZhbHVlXSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICByZXR1cm4gIlsiICsgZmllbGROYW1lICsgIiBsb25nVmFsdWVdIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJldHVybiAiWyIgKyBmaWVsZE5hbWUgKyAiIGxvbmdMb25nVmFsdWVdIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIHJldHVybiAiWyIgKyBmaWVsZE5hbWUgKyAiIGRvdWJsZVZhbHVlXSI7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi0gIC8vIGRvIG5vdGhpbmcKLSAgcmV0dXJuIGZpZWxkTmFtZTsKLX0KLQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBtYXAuCi0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG1hcE5hbWUpIHsKLSAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksIGtleSk7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZrZmllbGQsIGRlY29udGFpbmVyaXplKCZrZmllbGQsIGtleSkpOwotICB0X2ZpZWxkIHZmaWVsZCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgIlsiICsgbWFwTmFtZSArICIgb2JqZWN0Rm9yS2V5OiAiICsga2V5ICsgIl0iKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJnZmaWVsZCwgZGVjb250YWluZXJpemUoJnZmaWVsZCwgdmZpZWxkLmdldF9uYW1lKCkpKTsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgc2V0LgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZWxlbWVudE5hbWUpIHsKLSAgdF9maWVsZCBlZmllbGQodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtZW50TmFtZSk7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsIGRlY29udGFpbmVyaXplKCZlZmllbGQsIGVsZW1lbnROYW1lKSk7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIGxpc3QuCi0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbGlzdE5hbWUpIHsKLSAgdF9maWVsZCBlZmllbGQodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgIlsiICsgbGlzdE5hbWUgKyAiIG9iamVjdEF0SW5kZXg6ICIgKyBpbmRleCArICJdIik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsIGRlY29udGFpbmVyaXplKCZlZmllbGQsIGVmaWVsZC5nZXRfbmFtZSgpKSk7Ci19Ci0KLQotLyoqCi0gKiBSZXR1cm5zIGFuIE9iamVjdGl2ZS1DIG5hbWUKLSAqCi0gKiBAcGFyYW0gdHR5cGUgVGhlIHR5cGUKLSAqIEBwYXJhbSBjbGFzc19yZWYgRG8gd2Ugd2FudCBhIENsYXNzIHJlZmVyZW5jZSBpc3RlYWQgb2YgYSB0eXBlIHJlZmVyZW5jZT8KLSAqIEByZXR1cm4gSmF2YSB0eXBlIG5hbWUsIGkuZS4gSGFzaE1hcDxLZXksVmFsdWU+Ci0gKi8KLXN0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6dHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsIGJvb2wgY2xhc3NfcmVmKSB7Ci0gIGlmICh0dHlwZS0+aXNfdHlwZWRlZigpKSB7Ci0gICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHR5cGUtPmdldF9wcm9ncmFtKCk7Ci0gICAgcmV0dXJuIHByb2dyYW0gPyAocHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiY29jb2EiKSArIHR0eXBlLT5nZXRfbmFtZSgpKSA6IHR0eXBlLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgc3RyaW5nIHJlc3VsdDsKLSAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHJldHVybiBiYXNlX3R5cGVfbmFtZSgodF9iYXNlX3R5cGUqKXR0eXBlKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJpbnQiOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIHJlc3VsdCA9ICJOU011dGFibGVEaWN0aW9uYXJ5IjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXN1bHQgPSAiTlNNdXRhYmxlU2V0IjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgcmVzdWx0ID0gIk5TTXV0YWJsZUFycmF5IjsKLSAgfSBlbHNlIHsKLSAgICAvLyBDaGVjayBmb3IgcHJlZml4Ci0gICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHR5cGUtPmdldF9wcm9ncmFtKCk7Ci0gICAgaWYgKHByb2dyYW0gIT0gTlVMTCkgewotICAgICAgcmVzdWx0ID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiY29jb2EiKSArIHR0eXBlLT5nZXRfbmFtZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXN1bHQgPSB0dHlwZS0+Z2V0X25hbWUoKTsKLSAgICB9Ci0gIH0KLQotICBpZiAoIWNsYXNzX3JlZikgewotICAgIHJlc3VsdCArPSAiICoiOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogUmV0dXJucyB0aGUgT2JqZWN0aXZlLUMgdHlwZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSB0aHJpZnQgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdGJhc2UgVGhlIGJhc2UgdHlwZQotICovCi1zdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OmJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlKiB0eXBlKSB7Ci0gIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSB0eXBlLT5nZXRfYmFzZSgpOwotCi0gIHN3aXRjaCAodGJhc2UpIHsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgIHJldHVybiAidm9pZCI7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgewotICAgICAgcmV0dXJuICJOU0RhdGEgKiI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiAiTlNTdHJpbmcgKiI7Ci0gICAgfQotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgcmV0dXJuICJCT09MIjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgIHJldHVybiAidWludDhfdCI7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgIHJldHVybiJpbnQxNl90IjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgcmV0dXJuICJpbnQzMl90IjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgcmV0dXJuImludDY0X3QiOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICByZXR1cm4gImRvdWJsZSI7Ci0gIGRlZmF1bHQ6Ci0gICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBPYmplY3RpdmUtQyBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBQcmludHMgdGhlIHZhbHVlIG9mIGEgY29uc3RhbnQgd2l0aCB0aGUgZ2l2ZW4gdHlwZS4gTm90ZSB0aGF0IHR5cGUgY2hlY2tpbmcKLSAqIGlzIE5PVCBwZXJmb3JtZWQgaW4gdGhpcyBmdW5jdGlvbiBhcyBpdCBpcyBhbHdheXMgcnVuIGJlZm9yZWhhbmQgdXNpbmcgdGhlCi0gKiB2YWxpZGF0ZV90eXBlcyBtZXRob2QgaW4gbWFpbi5jYwotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpwcmludF9jb25zdF92YWx1ZShzdGQ6Om9mc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUsIGJvb2wgZGVmdmFsLCBib29sIGlzX3Byb3BlcnR5KSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotCi0gIGluZGVudChvdXQpOwotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICBzdHJpbmcgdjIgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCB0eXBlLCB2YWx1ZSk7Ci0gICAgaWYgKGRlZnZhbCkKLSAgICAgIG91dCA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiAiOwotICAgIG91dCA8PCBuYW1lIDw8ICIgPSAiIDw8IHYyIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgaWYgKGRlZnZhbCkKLSAgICAgIG91dCA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiAiOwotICAgIG91dCA8PCBuYW1lIDw8ICIgPSAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIHR5cGUsIHZhbHVlKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBpZiAoZGVmdmFsKQotICAgICAgb3V0IDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiICI7Ci0gICAgaWYgKGRlZnZhbCB8fCBpc19wcm9wZXJ0eSkKLSAgICAgIG91dCA8PCBuYW1lIDw8ICIgPSBbW1siIDw8IHR5cGVfbmFtZSh0eXBlLCB0cnVlKSA8PCAiIGFsbG9jXSBpbml0XSBhdXRvcmVsZWFzZV9zdHViXTsiIDw8IGVuZGw7Ci0gICAgZWxzZQotICAgICAgb3V0IDw8IG5hbWUgPDwgIiA9IFtbIiA8PCB0eXBlX25hbWUodHlwZSwgdHJ1ZSkgPDwgIiBhbGxvY10gaW5pdF07IiA8PCBlbmRsOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOwotICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKLSAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7Ci0gICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7Ci0gICAgICB9Ci0gICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotICAgICAgc3RkOjpzdHJpbmcgY2FwX25hbWUgPSBjYXBpdGFsaXplKHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiWyIgPDwgbmFtZSA8PCAiIHNldCIgPDwgY2FwX25hbWUgPDwgIjoiIDw8IHZhbCA8PCAiXTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKLSAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOwotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgaWYgKGRlZnZhbCkKLSAgICAgIG91dCA8PCAiTlNNdXRhYmxlRGljdGlvbmFyeSAqIjsKLSAgICBpZiAoZGVmdmFsIHx8IGlzX3Byb3BlcnR5KQotICAgICAgb3V0IDw8IG5hbWUgPDwgIiA9IFtbW05TTXV0YWJsZURpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoQ2FwYWNpdHk6IiA8PCB2YWwuc2l6ZSgpIDw8ICJdIGF1dG9yZWxlYXNlX3N0dWJdOyAiIDw8IGVuZGw7Ci0gICAgZWxzZQotICAgICAgb3V0IDw8IG5hbWUgPDwgIiA9IFtbTlNNdXRhYmxlRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhDYXBhY2l0eToiIDw8IHZhbC5zaXplKCkgPDwgIl07ICIgPDwgZW5kbDsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgc3RyaW5nIGtleSA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIGt0eXBlLCB2X2l0ZXItPmZpcnN0LCB0cnVlKTsKLSAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCB2dHlwZSwgdl9pdGVyLT5zZWNvbmQsIHRydWUpOwotICAgICAgaW5kZW50KG91dCkgPDwgIlsiIDw8IG5hbWUgPDwgIiBzZXRPYmplY3Q6IiA8PCB2YWwgPDwgIiBmb3JLZXk6IiA8PCBrZXkgPDwgIl07IiA8PCBlbmRsOwotICAgIH0KLSAgICBvdXQgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICB0X3R5cGUqIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7Ci0gICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGlmIChkZWZ2YWwpCi0gICAgICBvdXQgPDwgIk5TTXV0YWJsZUFycmF5ICoiOwotICAgIGlmIChkZWZ2YWwgfHwgaXNfcHJvcGVydHkpCi0gICAgICBvdXQgPDwgbmFtZSA8PCAiID0gW1tbTlNNdXRhYmxlQXJyYXkgYWxsb2NdIGluaXRXaXRoQ2FwYWNpdHk6IiA8PCB2YWwuc2l6ZSgpIDw8Il0gYXV0b3JlbGVhc2Vfc3R1Yl07IiA8PCBlbmRsOwotICAgIGVsc2UKLSAgICAgIG91dCA8PCBuYW1lIDw8ICIgPSBbW05TTXV0YWJsZUFycmF5IGFsbG9jXSBpbml0V2l0aENhcGFjaXR5OiIgPDwgdmFsLnNpemUoKSA8PCJdOyIgPDwgZW5kbDsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIGV0eXBlLCAqdl9pdGVyLCB0cnVlKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJbIiA8PCBuYW1lIDw8ICIgYWRkT2JqZWN0OiIgPDwgdmFsIDw8ICJdOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICB0X3R5cGUqIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKLSAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgaWYgKGRlZnZhbCkKLSAgICAgIG91dCA8PCAiTlNNdXRhYmxlU2V0ICoiOwotICAgIGlmIChkZWZ2YWwgfHwgaXNfcHJvcGVydHkpCi0gICAgICBvdXQgPDwgbmFtZSA8PCAiID0gW1tbTlNNdXRhYmxlU2V0IGFsbG9jXSBpbml0V2l0aENhcGFjaXR5OiIgPDwgdmFsLnNpemUoKSA8PCAiXSBhdXRvcmVsZWFzZV9zdHViXTsiIDw8IGVuZGw7Ci0gICAgZWxzZQotICAgICAgb3V0IDw8IG5hbWUgPDwgIiA9IFtbTlNNdXRhYmxlU2V0IGFsbG9jXSBpbml0V2l0aENhcGFjaXR5OiIgPDwgdmFsLnNpemUoKSA8PCAiXTsiIDw8IGVuZGw7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBldHlwZSwgKnZfaXRlciwgdHJ1ZSk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiWyIgPDwgbmFtZSA8PCAiIGFkZE9iamVjdDoiIDw8IHZhbCA8PCAiXTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgdHlwZSAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLSAgfQotfQotCi1zdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZShvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlLCBib29sIGNvbnRhaW5lcml6ZV9pdCkgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIHJlbmRlcjsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgLy8gV2UgbXVzdCBoYW5kbGUgYmluYXJ5IGNvbnN0YW50IGJ1dCB0aGUgc3ludGF4IG9mIElETCBkZWZpbmVzIAotICAgICAgLy8gbm90aGluZyBhYm91dCBiaW5hcnkgY29uc3RhbnQuCi0gICAgICAvLyAgIGlmICgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSkKLSAgICAgIC8vICAgICAgLy8gYmluYXJ5IGNvZGUKLSAgICAgIHJlbmRlciA8PCAiQFwiIiA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICciJzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIHJlbmRlciA8PCAoKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCkgPyAiWUVTIiA6ICJOTyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgewotICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICB9IGVsc2UgewotICAgIHN0cmluZyB0ID0gdG1wKCJ0bXAiKTsKLSAgICBwcmludF9jb25zdF92YWx1ZShvdXQsIHQsIHR5cGUsIHZhbHVlLCB0cnVlLCBmYWxzZSk7Ci0gICAgcmVuZGVyIDw8IHQ7Ci0gIH0KLQotICBpZiAoY29udGFpbmVyaXplX2l0KSB7Ci0gICAgcmV0dXJuIGNvbnRhaW5lcml6ZSh0eXBlLCByZW5kZXIuc3RyKCkpOwotICB9Ci0gIHJldHVybiByZW5kZXIuc3RyKCk7Ci19Ci0KLSNpZiAwCi0vKioKLU9SSUdJTkFMCi0gKiBTcGl0IG91dCBjb2RlIHRoYXQgZXZhbHVhdGVzIHRvIHRoZSBzcGVjaWZpZWQgY29uc3RhbnQgdmFsdWUuCi0gKi8KLXN0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKHN0cmluZyBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNvbnRhaW5lcml6ZV9pdCkgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIHJlbmRlcjsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgcmVuZGVyIDw8ICJAXCIiIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmVuZGVyIDw8ICgodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwKSA/ICJZRVMiIDogIk5PIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7Ci0gICAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGlmICh2YWwuc2l6ZSgpID4gMCkKLSAgICAgIHJlbmRlciA8PCAiW1siIDw8IHR5cGVfbmFtZSh0eXBlLCB0cnVlKSA8PCAiIGFsbG9jXSBpbml0V2l0aCI7Ci0gICAgZWxzZQotICAgICAgcmVuZGVyIDw8ICJbWyIgPDwgdHlwZV9uYW1lKHR5cGUsIHRydWUpIDw8ICIgYWxsb2NdIGluaXQiOwotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICAvLyBGSVhNRSBUaGUgZ2VuZXJhdGVkIGNvZGUgZG9lcyBub3QgbWF0Y2ggd2l0aCBpbml0V2l0aFhYWCAKLSAgICAgIC8vICAgICAgIGluaXRpYWxpemVyIGFuZCBjYXVzZXMgY29tcGlsZSBlcnJvci4KLSAgICAgIC8vICAgICAgIFRyeTogdGVzdC9EZWJ1Z1Byb3RvVGVzdC50aHJpZnQgYW5kIHRlc3QvU21hbGxUZXN0LnRocmlmdAotICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKLSAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7Ci0gICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgewotICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOwotICAgICAgfQotICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIHJlbmRlciA8PCBjYXBpdGFsaXplKHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSk7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZW5kZXIgPDwgIiAiIDw8IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKLSAgICAgIH0KLSAgICAgIHJlbmRlciA8PCAiOiAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZShuYW1lLCBmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgfQotICAgIHJlbmRlciA8PCAiXSI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZW5kZXIgPDwgIltbTlNEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aE9iamVjdHNBbmRLZXlzOiAiOwotICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBzdHJpbmcga2V5ID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG5hbWUsIGt0eXBlLCB2X2l0ZXItPmZpcnN0LCB0cnVlKTsKLSAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUobmFtZSwgdnR5cGUsIHZfaXRlci0+c2Vjb25kLCB0cnVlKTsKLSAgICAgIGlmIChmaXJzdCkgewotICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmVuZGVyIDw8ICIsICI7Ci0gICAgICB9Ci0gICAgICByZW5kZXIgPDwgdmFsIDw8ICIsICIgPDwga2V5OwotICAgIH0KLSAgICBpZiAoZmlyc3QpCi0gICAgICByZW5kZXIgPDwgIiBuaWxdIjsKLSAgICBlbHNlCi0gICAgICByZW5kZXIgPDwgIiwgbmlsXSI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgcmVuZGVyIDw8ICJbW05TQXJyYXkgYWxsb2NdIGluaXRXaXRoT2JqZWN0czogIjsKLSAgICB0X3R5cGUgKiBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOwotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZW5kZXIgPDwgIiwgIjsKLSAgICAgIH0KLSAgICAgIHJlbmRlciA8PCByZW5kZXJfY29uc3RfdmFsdWUobmFtZSwgZXR5cGUsICp2X2l0ZXIsIHRydWUpOwotICAgIH0KLSAgICBpZiAoZmlyc3QpCi0gICAgICByZW5kZXIgPDwgIiBuaWxdIjsKLSAgICBlbHNlCi0gICAgICByZW5kZXIgPDwgIiwgbmlsXSI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZW5kZXIgPDwgIltbTlNTZXQgYWxsb2NdIGluaXRXaXRoT2JqZWN0czogIjsKLSAgICB0X3R5cGUgKiBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7Ci0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlbmRlciA8PCAiLCAiOwotICAgICAgfQotICAgICAgcmVuZGVyIDw8IHJlbmRlcl9jb25zdF92YWx1ZShuYW1lLCBldHlwZSwgKnZfaXRlciwgdHJ1ZSk7Ci0gICAgfQotICAgIGlmIChmaXJzdCkKLSAgICAgIHJlbmRlciA8PCAiIG5pbF0iOwotICAgIGVsc2UKLSAgICAgIHJlbmRlciA8PCAiLCBuaWxdIjsKLSAgfSBlbHNlIHsKLSAgICB0aHJvdyAiZG9uJ3Qga25vdyBob3cgdG8gcmVuZGVyIGNvbnN0YW50IGZvciB0eXBlOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIGlmIChjb250YWluZXJpemVfaXQpIHsKLSAgICByZXR1cm4gY29udGFpbmVyaXplKHR5cGUsIHJlbmRlci5zdHIoKSk7Ci0gIH0KLQotICByZXR1cm4gcmVuZGVyLnN0cigpOwotfQotI2VuZGlmCi0KLS8qKgotICogRGVjbGFyZXMgYSBmaWVsZC4KLSAqCi0gKiBAcGFyYW0gdHR5cGUgVGhlIHR5cGUKLSAqLwotc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjpkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCkgewotICByZXR1cm4gdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSkgKyAiIF9fIiArIHRmaWVsZC0+Z2V0X25hbWUoKSArICI7IjsKLX0KLQotLyoqCi0gKiBEZWNsYXJlcyBhbiBPYmplY3RpdmUtQyAyLjAgcHJvcGVydHkuCi0gKgotICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQgdG8gZGVjbGFyZSBhIHByb3BlcnR5IGZvcgotICovCi1zdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OmRlY2xhcmVfcHJvcGVydHkodF9maWVsZCogdGZpZWxkKSB7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSByZW5kZXI7Ci0gIHJlbmRlciA8PCAiQHByb3BlcnR5IChub25hdG9taWMsICI7Ci0KLSAgaWYgKHR5cGVfY2FuX2JlX251bGwodGZpZWxkLT5nZXRfdHlwZSgpKSkKLSAgICByZW5kZXIgPDwgInJldGFpbiwgIjsKLSAgCi0gIHJlbmRlciA8PCAiZ2V0dGVyPSIgPDwgZGVjYXBpdGFsaXplKHRmaWVsZC0+Z2V0X25hbWUoKSkgPDwKLSAgICAiLCBzZXR0ZXI9c2V0IiA8PCBjYXBpdGFsaXplKHRmaWVsZC0+Z2V0X25hbWUoKSkgKyAiOikgIiA8PAotICAgIHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCkpIDw8ICIgIiA8PCB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIjsiOwotCi0gIHJldHVybiByZW5kZXIuc3RyKCk7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZQotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgotICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgotICovCi1zdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgdF90eXBlKiB0dHlwZSA9IHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKTsKLSAgc3RkOjpzdHJpbmcgcmVzdWx0ID0KLSAgICAiKCIgKyB0eXBlX25hbWUodHR5cGUpICsgIikgIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotCi0vKioKLSAqIFJlbmRlcnMgYSBjb2xvbiBzZXBhcmF0ZWQgbGlzdCBvZiB0eXBlcyBhbmQgbmFtZXMsIHN1aXRhYmxlIGZvciBhbgotICogb2JqZWN0aXZlLWMgcGFyYW1ldGVyIGxpc3QKLSAqLwotc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIHN0cmluZyByZXN1bHQgPSAiIjsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHN0cmluZyBhcmdQcmVmaXggPSAiIjsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGFyZ1ByZWZpeCA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICAgIHJlc3VsdCArPSAiICI7Ci0gICAgfQotICAgIHJlc3VsdCArPSBhcmdQcmVmaXggKyAiOiAoIiArIHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF90eXBlKCkpICsgIikgIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi0KLS8qKgotICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYW4gT2JqZWN0aXZlLUMgZW51bSBzdHJpbmcgZm9yIHRoZSBnaXZlbiB0eXBlLgotICovCi1zdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OnR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpIHsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICByZXR1cm4gIlRUeXBlX1NUUklORyI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuICJUVHlwZV9CT09MIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICByZXR1cm4gIlRUeXBlX0JZVEUiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgcmV0dXJuICJUVHlwZV9JMTYiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgcmV0dXJuICJUVHlwZV9JMzIiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmV0dXJuICJUVHlwZV9JNjQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuICJUVHlwZV9ET1VCTEUiOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlX0kzMiI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiAiVFR5cGVfU1RSVUNUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHJldHVybiAiVFR5cGVfTUFQIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHJldHVybiAiVFR5cGVfU0VUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICByZXR1cm4gIlRUeXBlX0xJU1QiOwotICB9Ci0KLSAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotfQotCi0KLS8qKgotICogUmV0dXJucyBhIGZvcm1hdCBzdHJpbmcgc3BlY2lmaWVyIGZvciB0aGUgc3VwcGxpZWQgcGFyc2UgdHlwZS4KLSAqLwotc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjpmb3JtYXRfc3RyaW5nX2Zvcl90eXBlKHRfdHlwZSogdHlwZSkgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIHJldHVybiAiXFxcIiVAXFxcIiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuICIlaSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgcmV0dXJuICIlaSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICByZXR1cm4gIiVoaSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICByZXR1cm4gIiVpIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJldHVybiAiJXFpIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIHJldHVybiAiJWYiOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gIiVpIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgcmV0dXJuICIlQCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gIiVAIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHJldHVybiAiJUAiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHJldHVybiAiJUAiOwotICB9Ci0KLSAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiBmb3JtYXRfc3RyaW5nX2Zvcl90eXBlOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZSBhIGNhbGwgdG8gYSBmaWVsZCdzIHNldHRlci4KLSAqCi0gKiBAcGFyYW0gdGZpZWxkIEZpZWxkIHRoZSBzZXR0ZXIgaXMgYmVpbmcgY2FsbGVkIG9uCi0gKiBAcGFyYW0gZmllbGROYW1lIE5hbWUgb2YgdmFyaWFibGUgdG8gcGFzcyB0byBzZXR0ZXIKLSAqLwotCi1zdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OmNhbGxfZmllbGRfc2V0dGVyKHRfZmllbGQqIHRmaWVsZCwgc3RyaW5nIGZpZWxkTmFtZSkgewotICByZXR1cm4gIltzZWxmIHNldCIgKyBjYXBpdGFsaXplKHRmaWVsZC0+Z2V0X25hbWUoKSkgKyAiOiAiICsgZmllbGROYW1lICsgIl07IjsKLX0KLQotCi1USFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKGNvY29hLCAiQ29jb2EiLAotIiAgICBsb2dfdW5leHBlY3RlZDogIExvZyBldmVyeSB0aW1lIGFuIHVuZXhwZWN0ZWQgZmllbGQgSUQgb3IgdHlwZSBpcyBlbmNvdW50ZXJlZC5cbiIKLSIgICAgdmFsaWRhdGVfcmVxdWlyZWQ6XG4iCi0iICAgICAgICAgICAgICAgICAgICAgVGhyb3dzIGV4Y2VwdGlvbiBpZiBhbnkgcmVxdWlyZWQgZmllbGQgaXMgbm90IHNldC5cbiIKLSkKLQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2NwcF9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfY3BwX2dlbmVyYXRvci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJmZTllMi4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfY3BwX2dlbmVyYXRvci5jYworKysgL2Rldi9udWxsCkBAIC0xLDQ5ODMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgotICogUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKLSAqIGRldGFpbHMuCi0gKi8KLQotI2luY2x1ZGUgPGNhc3NlcnQ+Ci0KLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0KLSNpbmNsdWRlICJwbGF0Zm9ybS5oIgotI2luY2x1ZGUgInRfb29wX2dlbmVyYXRvci5oIgotCi11c2luZyBzdGQ6Om1hcDsKLXVzaW5nIHN0ZDo6b2ZzdHJlYW07Ci11c2luZyBzdGQ6Om9zdHJlYW07Ci11c2luZyBzdGQ6OnN0cmluZzsKLXVzaW5nIHN0ZDo6dmVjdG9yOwotCi1zdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAgLy8gYXZvaWQgb3N0cmVhbSA8PCBzdGQ6OmVuZGwgZmx1c2hlcwotCi0vKioKLSAqIEMrKyBjb2RlIGdlbmVyYXRvci4gVGhpcyBpcyBsZWdpdGltYWN5IGluY2FybmF0ZS4KLSAqCi0gKi8KLWNsYXNzIHRfY3BwX2dlbmVyYXRvciA6IHB1YmxpYyB0X29vcF9nZW5lcmF0b3IgewotIHB1YmxpYzoKLSAgdF9jcHBfZ2VuZXJhdG9yKAotICAgICAgdF9wcm9ncmFtKiBwcm9ncmFtLAotICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKLSAgICA6IHRfb29wX2dlbmVyYXRvcihwcm9ncmFtKQotICB7Ci0gICAgKHZvaWQpIG9wdGlvbl9zdHJpbmc7Ci0gICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJwdXJlX2VudW1zIik7Ci0gICAgZ2VuX3B1cmVfZW51bXNfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotCi0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoImRlbnNlIik7Ci0gICAgZ2VuX2RlbnNlXyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJpbmNsdWRlX3ByZWZpeCIpOwotICAgIHVzZV9pbmNsdWRlX3ByZWZpeF8gPSAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7Ci0KLSAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgiY29iX3N0eWxlIik7Ci0gICAgZ2VuX2NvYl9zdHlsZV8gPSAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7Ci0KLSAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgibm9fY2xpZW50X2NvbXBsZXRpb24iKTsKLSAgICBnZW5fbm9fY2xpZW50X2NvbXBsZXRpb25fID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotCi0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoIm5vX2RlZmF1bHRfb3BlcmF0b3JzIik7Ci0gICAgZ2VuX25vX2RlZmF1bHRfb3BlcmF0b3JzXyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJ0ZW1wbGF0ZXMiKTsKLSAgICBnZW5fdGVtcGxhdGVzXyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLQotICAgIGdlbl90ZW1wbGF0ZXNfb25seV8gPQotICAgICAgKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkgJiYgaXRlci0+c2Vjb25kID09ICJvbmx5Iik7Ci0KLSAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1jcHAiOwotICB9Ci0KLSAgLyoqCi0gICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKLSAgICovCi0KLSAgdm9pZCBpbml0X2dlbmVyYXRvcigpOwotICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOwotCi0gIHZvaWQgZ2VuZXJhdGVfY29uc3RzKHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpOwotCi0gIC8qKgotICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKLSAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pOwotICB2b2lkIGdlbmVyYXRlX2ZvcndhcmRfZGVjbGFyYXRpb24odF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICAgIGdlbmVyYXRlX2NwcF9zdHJ1Y3QodHN0cnVjdCwgZmFsc2UpOwotICB9Ci0gIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgewotICAgIGdlbmVyYXRlX2NwcF9zdHJ1Y3QodHhjZXB0aW9uLCB0cnVlKTsKLSAgfQotICB2b2lkIGdlbmVyYXRlX2NwcF9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0KLSAgdm9pZCBwcmludF9jb25zdF92YWx1ZShzdGQ6Om9mc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOwotICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUoc3RkOjpvZnN0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKLQotICB2b2lkIGdlbmVyYXRlX3N0cnVjdF9kZWNsYXJhdGlvbiAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb249ZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcG9pbnRlcnM9ZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVhZD10cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHdyaXRlPXRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3dhcD1mYWxzZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3RydWN0X2RlZmluaXRpb24gICAoc3RkOjpvZnN0cmVhbSYgb3V0LCBzdGQ6Om9mc3RyZWFtJiBmb3JjZV9jcHBfb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBzZXR0ZXJzPXRydWUpOwotICB2b2lkIGdlbmVyYXRlX2NvcHlfY29uc3RydWN0b3IgICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfYXNzaWdubWVudF9vcGVyYXRvciAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3N0cnVjdF9maW5nZXJwcmludCAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2RlZmluaXRpb24pOwotICB2b2lkIGdlbmVyYXRlX3N0cnVjdF9yZWFkZXIgICAgICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIHBvaW50ZXJzPWZhbHNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3Rfd3JpdGVyICAgICAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBwb2ludGVycz1mYWxzZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3RydWN0X3Jlc3VsdF93cml0ZXIgKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgcG9pbnRlcnM9ZmFsc2UpOwotICB2b2lkIGdlbmVyYXRlX3N0cnVjdF9zd2FwICAgICAgICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3Rfb3N0cmVhbV9vcGVyYXRvcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLQotICAvKioKLSAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlICh0X3NlcnZpY2UqIHRzZXJ2aWNlLCBzdHJpbmcgc3R5bGUpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlX2ZhY3RvcnkgKHRfc2VydmljZSogdHNlcnZpY2UsIHN0cmluZyBzdHlsZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9udWxsICAgICAgKHRfc2VydmljZSogdHNlcnZpY2UsIHN0cmluZyBzdHlsZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9tdWx0aWZhY2UgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyAgICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCAgICAodF9zZXJ2aWNlKiB0c2VydmljZSwgc3RyaW5nIHN0eWxlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3NvciAodF9zZXJ2aWNlKiB0c2VydmljZSwgc3RyaW5nIHN0eWxlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3NrZWxldG9uICAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbiAgKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHN0eWxlLCBib29sIHNwZWNpYWxpemVkPWZhbHNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzICAodF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2FzeW5jX3NrZWxldG9uICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLQotICAvKioKLSAgICogU2VyaWFsaXphdGlvbiBjb25zdHJ1Y3RzCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQgICAgICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiAgICB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBzdWZmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0ICAgICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogICB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwb2ludGVyPWZhbHNlKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lciAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiAgICAgdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogICAgICB0c2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50ICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqICAgICAgdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogICAgIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwdXNoX2JhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpbmRleCk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQgICAgICAgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqICAgIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHN1ZmZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0ICAgICAgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiAgIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHBvaW50ZXI9ZmFsc2UpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lciAgICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqICAgICB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiAgICAgIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudCAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqICAgICAgdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGl0ZXIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudCAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqICAgICB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGl0ZXIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZnVuY3Rpb25fY2FsbCAgICAgICAgICAgIChvc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdGFyZ2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGFyZ19wcmVmaXgpOwotICAvKgotICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucwotICAgKi8KLQotICBzdGQ6OnN0cmluZyBuYW1lc3BhY2VfcHJlZml4KHN0ZDo6c3RyaW5nIG5zKTsKLSAgc3RkOjpzdHJpbmcgbmFtZXNwYWNlX29wZW4oc3RkOjpzdHJpbmcgbnMpOwotICBzdGQ6OnN0cmluZyBuYW1lc3BhY2VfY2xvc2Uoc3RkOjpzdHJpbmcgbnMpOwotICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBpbl90eXBlZGVmPWZhbHNlLCBib29sIGFyZz1mYWxzZSk7Ci0gIHN0ZDo6c3RyaW5nIGJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UpOwotICBzdGQ6OnN0cmluZyBkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0PWZhbHNlLCBib29sIHBvaW50ZXI9ZmFsc2UsIGJvb2wgY29uc3RhbnQ9ZmFsc2UsIGJvb2wgcmVmZXJlbmNlPWZhbHNlKTsKLSAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RkOjpzdHJpbmcgc3R5bGUsIHN0ZDo6c3RyaW5nIHByZWZpeD0iIiwgYm9vbCBuYW1lX3BhcmFtcz10cnVlKTsKLSAgc3RkOjpzdHJpbmcgY29iX2Z1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0ZDo6c3RyaW5nIHByZWZpeD0iIiwgYm9vbCBuYW1lX3BhcmFtcz10cnVlKTsKLSAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBuYW1lX3BhcmFtcz10cnVlLCBib29sIHN0YXJ0X2NvbW1hPWZhbHNlKTsKLSAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOwotICBzdGQ6OnN0cmluZyBsb2NhbF9yZWZsZWN0aW9uX25hbWUoY29uc3QgY2hhciosIHRfdHlwZSogdHR5cGUsIGJvb2wgZXh0ZXJuYWw9ZmFsc2UpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZW51bV9jb25zdGFudF9saXN0KHN0ZDo6b2ZzdHJlYW0mIGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZlY3Rvcjx0X2VudW1fdmFsdWUqPiYgY29uc3RhbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHN1ZmZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsdWRlX3ZhbHVlcyk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3Rfb3N0cmVhbV9vcGVyYXRvcl9kZWNsKHN0ZDo6b2ZzdHJlYW0mIGYsIHRfc3RydWN0KiB0c3RydWN0KTsKLQotICAvLyBUaGVzZSBoYW5kbGVzIGNoZWNraW5nIGdlbl9kZW5zZV8gYW5kIGNoZWNraW5nIGZvciBkdXBsaWNhdGVzLgotICB2b2lkIGdlbmVyYXRlX2xvY2FsX3JlZmxlY3Rpb24oc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBib29sIGlzX2RlZmluaXRpb24pOwotICB2b2lkIGdlbmVyYXRlX2xvY2FsX3JlZmxlY3Rpb25fcG9pbnRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUpOwotCi0gIGJvb2wgaXNfcmVmZXJlbmNlKHRfZmllbGQqIHRmaWVsZCkgewotICAgIHJldHVybiB0ZmllbGQtPmdldF9yZWZlcmVuY2UoKTsKLSAgfQotCi0gIGJvb2wgaXNfY29tcGxleF90eXBlKHRfdHlwZSogdHR5cGUpIHsKLSAgICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOwotCi0gICAgcmV0dXJuCi0gICAgICB0dHlwZS0+aXNfY29udGFpbmVyKCkgfHwKLSAgICAgIHR0eXBlLT5pc19zdHJ1Y3QoKSB8fAotICAgICAgdHR5cGUtPmlzX3hjZXB0aW9uKCkgfHwKLSAgICAgICh0dHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgKCgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkcpKTsKLSAgfQotCi0gIHZvaWQgc2V0X3VzZV9pbmNsdWRlX3ByZWZpeChib29sIHVzZV9pbmNsdWRlX3ByZWZpeCkgewotICAgIHVzZV9pbmNsdWRlX3ByZWZpeF8gPSB1c2VfaW5jbHVkZV9wcmVmaXg7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBpbmNsdWRlIHByZWZpeCB0byB1c2UgZm9yIGEgZmlsZSBnZW5lcmF0ZWQgYnkgcHJvZ3JhbSwgb3IgdGhlCi0gICAqIGVtcHR5IHN0cmluZyBpZiBubyBpbmNsdWRlIHByZWZpeCBzaG91bGQgYmUgdXNlZC4KLSAgICovCi0gIHN0ZDo6c3RyaW5nIGdldF9pbmNsdWRlX3ByZWZpeChjb25zdCB0X3Byb2dyYW0mIHByb2dyYW0pIGNvbnN0OwotCi0gIC8qKgotICAgKiBUcnVlIGlmIHdlIHNob3VsZCBnZW5lcmF0ZSBwdXJlIGVudW1zIGZvciBUaHJpZnQgZW51bXMsIGluc3RlYWQgb2Ygd3JhcHBlciBjbGFzc2VzLgotICAgKi8KLSAgYm9vbCBnZW5fcHVyZV9lbnVtc187Ci0KLSAgLyoqCi0gICAqIFRydWUgaWYgd2Ugc2hvdWxkIGdlbmVyYXRlIGxvY2FsIHJlZmxlY3Rpb24gbWV0YWRhdGEgZm9yIFREZW5zZVByb3RvY29sLgotICAgKi8KLSAgYm9vbCBnZW5fZGVuc2VfOwotCi0gIC8qKgotICAgKiBUcnVlIGlmIHdlIHNob3VsZCBnZW5lcmF0ZSB0ZW1wbGF0aXplZCByZWFkZXIvd3JpdGVyIG1ldGhvZHMuCi0gICAqLwotICBib29sIGdlbl90ZW1wbGF0ZXNfOwotCi0gIC8qKgotICAgKiBUcnVlIGlmZiB3ZSBzaG91bGQgZ2VuZXJhdGUgcHJvY2VzcyBmdW5jdGlvbiBwb2ludGVycyBmb3Igb25seSB0ZW1wbGF0aXplZAotICAgKiByZWFkZXIvd3JpdGVyIG1ldGhvZHMuCi0gICAqLwotICBib29sIGdlbl90ZW1wbGF0ZXNfb25seV87Ci0KLSAgLyoqCi0gICAqIFRydWUgaWZmIHdlIHNob3VsZCB1c2UgYSBwYXRoIHByZWZpeCBpbiBvdXIgI2luY2x1ZGUgc3RhdGVtZW50cyBmb3Igb3RoZXIKLSAgICogdGhyaWZ0LWdlbmVyYXRlZCBoZWFkZXIgZmlsZXMuCi0gICAqLwotICBib29sIHVzZV9pbmNsdWRlX3ByZWZpeF87Ci0KLSAgLyoqCi0gICAqIFRydWUgaWYgd2Ugc2hvdWxkIGdlbmVyYXRlICJDb250aW51YXRpb24gT0JqZWN0Ii1zdHlsZSBjbGFzc2VzIGFzIHdlbGwuCi0gICAqLwotICBib29sIGdlbl9jb2Jfc3R5bGVfOwotCi0gIC8qKgotICAgKiBUcnVlIGlmIHdlIHNob3VsZCBvbWl0IGNhbGxzIHRvIGNvbXBsZXRpb25fXygpIGluIENvYkNsaWVudCBjbGFzcy4KLSAgICovCi0gIGJvb2wgZ2VuX25vX2NsaWVudF9jb21wbGV0aW9uXzsKLQotICAvKioKLSAgICogVHJ1ZSBpZiB3ZSBzaG91bGQgb21pdCBnZW5lcmF0aW5nIHRoZSBkZWZhdWx0IG9wZWFydG9ycyA9PSwgIT0gYW5kIDwuCi0gICAqLwotICBib29sIGdlbl9ub19kZWZhdWx0X29wZXJhdG9yc187Ci0KLSAgLyoqCi0gICAqIFN0cmluZ3MgZm9yIG5hbWVzcGFjZSwgY29tcHV0ZWQgb25jZSB1cCBmcm9udCB0aGVuIHVzZWQgZGlyZWN0bHkKLSAgICovCi0KLSAgc3RkOjpzdHJpbmcgbnNfb3Blbl87Ci0gIHN0ZDo6c3RyaW5nIG5zX2Nsb3NlXzsKLQotICAvKioKLSAgICogRmlsZSBzdHJlYW1zLCBzdG9yZWQgaGVyZSB0byBhdm9pZCBwYXNzaW5nIHRoZW0gYXMgcGFyYW1ldGVycyB0byBldmVyeQotICAgKiBmdW5jdGlvbi4KLSAgICovCi0KLSAgc3RkOjpvZnN0cmVhbSBmX3R5cGVzXzsKLSAgc3RkOjpvZnN0cmVhbSBmX3R5cGVzX2ltcGxfOwotICBzdGQ6Om9mc3RyZWFtIGZfdHlwZXNfdGNjXzsKLSAgc3RkOjpvZnN0cmVhbSBmX2hlYWRlcl87Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9zZXJ2aWNlXzsKLSAgc3RkOjpvZnN0cmVhbSBmX3NlcnZpY2VfdGNjXzsKLQotICAvKioKLSAgICogV2hlbiBnZW5lcmF0aW5nIGxvY2FsIHJlZmxlY3Rpb25zLCBtYWtlIHN1cmUgd2UgZG9uJ3QgZ2VuZXJhdGUgZHVwbGljYXRlcy4KLSAgICovCi0gIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiByZWZsZWN0ZWRfZmluZ2VycHJpbnRzXzsKLQotICAvLyBUaGUgUHJvY2Vzc29yR2VuZXJhdG9yIGlzIHVzZWQgdG8gZ2VuZXJhdGUgcGFydHMgb2YgdGhlIGNvZGUsCi0gIC8vIHNvIGl0IG5lZWRzIGFjY2VzcyB0byBtYW55IG9mIG91ciBwcm90ZWN0ZWQgbWVtYmVycyBhbmQgbWV0aG9kcy4KLSAgLy8KLSAgLy8gVE9ETzogVGhlIGNvZGUgcmVhbGx5IHNob3VsZCBiZSBjbGVhbmVkIHVwIHNvIHRoYXQgaGVscGVyIG1ldGhvZHMgZm9yCi0gIC8vIHdyaXRpbmcgdG8gdGhlIG91dHB1dCBmaWxlcyBhcmUgc2VwYXJhdGUgZnJvbSB0aGUgZ2VuZXJhdG9yIGNsYXNzZXMKLSAgLy8gdGhlbXNlbHZlcy4KLSAgZnJpZW5kIGNsYXNzIFByb2Nlc3NvckdlbmVyYXRvcjsKLX07Ci0KLS8qKgotICogUHJlcGFyZXMgZm9yIGZpbGUgZ2VuZXJhdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBuZWNlc3NhcnkgZmlsZSBvdXRwdXQKLSAqIHN0cmVhbXMuCi0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKLSAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5Ci0gIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7Ci0KLSAgLy8gTWFrZSBvdXRwdXQgZmlsZQotICBzdHJpbmcgZl90eXBlc19uYW1lID0gZ2V0X291dF9kaXIoKStwcm9ncmFtX25hbWVfKyJfdHlwZXMuaCI7Ci0gIGZfdHlwZXNfLm9wZW4oZl90eXBlc19uYW1lLmNfc3RyKCkpOwotCi0gIHN0cmluZyBmX3R5cGVzX2ltcGxfbmFtZSA9IGdldF9vdXRfZGlyKCkrcHJvZ3JhbV9uYW1lXysiX3R5cGVzLmNwcCI7Ci0gIGZfdHlwZXNfaW1wbF8ub3BlbihmX3R5cGVzX2ltcGxfbmFtZS5jX3N0cigpKTsKLQotICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKLSAgICAvLyBJZiB3ZSBkb24ndCBvcGVuIHRoZSBzdHJlYW0sIGl0IGFwcGVhcnMgdG8ganVzdCBkaXNjYXJkIGRhdGEsCi0gICAgLy8gd2hpY2ggaXMgZmluZS4KLSAgICBzdHJpbmcgZl90eXBlc190Y2NfbmFtZSA9IGdldF9vdXRfZGlyKCkrcHJvZ3JhbV9uYW1lXysiX3R5cGVzLnRjYyI7Ci0gICAgZl90eXBlc190Y2NfLm9wZW4oZl90eXBlc190Y2NfbmFtZS5jX3N0cigpKTsKLSAgfQotCi0gIC8vIFByaW50IGhlYWRlcgotICBmX3R5cGVzXyA8PAotICAgIGF1dG9nZW5fY29tbWVudCgpOwotICBmX3R5cGVzX2ltcGxfIDw8Ci0gICAgYXV0b2dlbl9jb21tZW50KCk7Ci0gIGZfdHlwZXNfdGNjXyA8PAotICAgIGF1dG9nZW5fY29tbWVudCgpOwotCi0gIC8vIFN0YXJ0IGlmbmRlZgotICBmX3R5cGVzXyA8PAotICAgICIjaWZuZGVmICIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiX1RZUEVTX0giIDw8IGVuZGwgPDwKLSAgICAiI2RlZmluZSAiIDw8IHByb2dyYW1fbmFtZV8gPDwgIl9UWVBFU19IIiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLSAgZl90eXBlc190Y2NfIDw8Ci0gICAgIiNpZm5kZWYgIiA8PCBwcm9ncmFtX25hbWVfIDw8ICJfVFlQRVNfVENDIiA8PCBlbmRsIDw8Ci0gICAgIiNkZWZpbmUgIiA8PCBwcm9ncmFtX25hbWVfIDw8ICJfVFlQRVNfVENDIiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICAvLyBJbmNsdWRlIGJhc2UgdHlwZXMKLSAgZl90eXBlc18gPDwKLSAgICAiI2luY2x1ZGUgPGlvc2Z3ZD4iIDw8IGVuZGwgPDwgZW5kbCA8PAotICAgICIjaW5jbHVkZSA8dGhyaWZ0L1RocmlmdC5oPiIgPDwgZW5kbCA8PAotICAgICIjaW5jbHVkZSA8dGhyaWZ0L1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5oPiIgPDwgZW5kbCA8PAotICAgICIjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbC5oPiIgPDwgZW5kbCA8PAotICAgICIjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0Lmg+IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLSAgLy8gSW5jbHVkZSBDKyt4eCBjb21wYXRpYmlsaXR5IGhlYWRlcgotICBmX3R5cGVzXyA8PCAiI2luY2x1ZGUgPHRocmlmdC9jeHhmdW5jdGlvbmFsLmg+IiA8PCBlbmRsOwotCi0gIC8vIEluY2x1ZGUgb3RoZXIgVGhyaWZ0IGluY2x1ZGVzCi0gIGNvbnN0IHZlY3Rvcjx0X3Byb2dyYW0qPiYgaW5jbHVkZXMgPSBwcm9ncmFtXy0+Z2V0X2luY2x1ZGVzKCk7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5jbHVkZXMuc2l6ZSgpOyArK2kpIHsKLSAgICBmX3R5cGVzXyA8PAotICAgICAgIiNpbmNsdWRlIFwiIiA8PCBnZXRfaW5jbHVkZV9wcmVmaXgoKihpbmNsdWRlc1tpXSkpIDw8Ci0gICAgICBpbmNsdWRlc1tpXS0+Z2V0X25hbWUoKSA8PCAiX3R5cGVzLmhcIiIgPDwgZW5kbDsKLQotICAgIC8vIFhYWChzaW1wa2lucyk6IElmIGdlbl90ZW1wbGF0ZXNfIGlzIGVuYWJsZWQsIHdlIGN1cnJlbnRseSBhc3N1bWUgYWxsCi0gICAgLy8gaW5jbHVkZWQgZmlsZXMgd2VyZSBhbHNvIGdlbmVyYXRlZCB3aXRoIHRlbXBsYXRlcyBlbmFibGVkLgotICAgIGZfdHlwZXNfdGNjXyA8PAotICAgICAgIiNpbmNsdWRlIFwiIiA8PCBnZXRfaW5jbHVkZV9wcmVmaXgoKihpbmNsdWRlc1tpXSkpIDw8Ci0gICAgICBpbmNsdWRlc1tpXS0+Z2V0X25hbWUoKSA8PCAiX3R5cGVzLnRjY1wiIiA8PCBlbmRsOwotICB9Ci0gIGZfdHlwZXNfIDw8IGVuZGw7Ci0KLSAgLy8gSW5jbHVkZSBjdXN0b20gaGVhZGVycwotICBjb25zdCB2ZWN0b3I8c3RyaW5nPiYgY3BwX2luY2x1ZGVzID0gcHJvZ3JhbV8tPmdldF9jcHBfaW5jbHVkZXMoKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjcHBfaW5jbHVkZXMuc2l6ZSgpOyArK2kpIHsKLSAgICBpZiAoY3BwX2luY2x1ZGVzW2ldWzBdID09ICc8JykgewotICAgICAgZl90eXBlc18gPDwKLSAgICAgICAgIiNpbmNsdWRlICIgPDwgY3BwX2luY2x1ZGVzW2ldIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZfdHlwZXNfIDw8Ci0gICAgICAgICIjaW5jbHVkZSBcIiIgPDwgY3BwX2luY2x1ZGVzW2ldIDw8ICJcIiIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLSAgZl90eXBlc18gPDwKLSAgICBlbmRsOwotCi0gIC8vIEluY2x1ZGUgdGhlIHR5cGVzIGZpbGUKLSAgZl90eXBlc19pbXBsXyA8PAotICAgICIjaW5jbHVkZSBcIiIgPDwgZ2V0X2luY2x1ZGVfcHJlZml4KCpnZXRfcHJvZ3JhbSgpKSA8PCBwcm9ncmFtX25hbWVfIDw8Ci0gICAgIl90eXBlcy5oXCIiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotICBmX3R5cGVzX3RjY18gPDwKLSAgICAiI2luY2x1ZGUgXCIiIDw8IGdldF9pbmNsdWRlX3ByZWZpeCgqZ2V0X3Byb2dyYW0oKSkgPDwgcHJvZ3JhbV9uYW1lXyA8PAotICAgICJfdHlwZXMuaFwiIiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICAvLyBJZiB3ZSBhcmUgZ2VuZXJhdGluZyBsb2NhbCByZWZsZWN0aW9uIG1ldGFkYXRhLCB3ZSBuZWVkIHRvIGluY2x1ZGUKLSAgLy8gdGhlIGRlZmluaXRpb24gb2YgVHlwZVNwZWMuCi0gIGlmIChnZW5fZGVuc2VfKSB7Ci0gICAgZl90eXBlc19pbXBsXyA8PAotICAgICAgIiNpbmNsdWRlIDx0aHJpZnQvVFJlZmxlY3Rpb25Mb2NhbC5oPiIgPDwgZW5kbCA8PAotICAgICAgZW5kbDsKLSAgfQotCi0gIC8vIFRoZSBzd2FwKCkgY29kZSBuZWVkcyA8YWxnb3JpdGhtPiBmb3Igc3RkOjpzd2FwKCkKLSAgZl90eXBlc19pbXBsXyA8PCAiI2luY2x1ZGUgPGFsZ29yaXRobT4iIDw8IGVuZGw7Ci0gIC8vIGZvciBvcGVyYXRvcjw8Ci0gIGZfdHlwZXNfaW1wbF8gPDwgIiNpbmNsdWRlIDxvc3RyZWFtPiIgPDwgZW5kbCA8PCBlbmRsOwotICBmX3R5cGVzX2ltcGxfIDw8ICIjaW5jbHVkZSA8dGhyaWZ0L1RUb1N0cmluZy5oPiIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIC8vIE9wZW4gbmFtZXNwYWNlCi0gIG5zX29wZW5fID0gbmFtZXNwYWNlX29wZW4ocHJvZ3JhbV8tPmdldF9uYW1lc3BhY2UoImNwcCIpKTsKLSAgbnNfY2xvc2VfID0gbmFtZXNwYWNlX2Nsb3NlKHByb2dyYW1fLT5nZXRfbmFtZXNwYWNlKCJjcHAiKSk7Ci0KLSAgZl90eXBlc18gPDwKLSAgICBuc19vcGVuXyA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICBmX3R5cGVzX2ltcGxfIDw8Ci0gICAgbnNfb3Blbl8gPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgZl90eXBlc190Y2NfIDw8Ci0gICAgbnNfb3Blbl8gPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLS8qKgotICogQ2xvc2VzIHRoZSBvdXRwdXQgZmlsZXMuCi0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7Ci0gIC8vIENsb3NlIG5hbWVzcGFjZQotICBmX3R5cGVzXyA8PAotICAgIG5zX2Nsb3NlXyA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLSAgZl90eXBlc19pbXBsXyA8PAotICAgIG5zX2Nsb3NlXyA8PCBlbmRsOwotICBmX3R5cGVzX3RjY18gPDwKLSAgICBuc19jbG9zZV8gPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgLy8gSW5jbHVkZSB0aGUgdHlwZXMudGNjIGZpbGUgZnJvbSB0aGUgdHlwZXMgaGVhZGVyIGZpbGUsCi0gIC8vIHNvIGNsaWVudHMgZG9uJ3QgaGF2ZSB0byBleHBsaWNpdGx5IGluY2x1ZGUgdGhlIHRjYyBmaWxlLgotICAvLyBUT0RPKHNpbXBraW5zKTogTWFrZSB0aGlzIGEgc2VwYXJhdGUgb3B0aW9uLgotICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKLSAgICBmX3R5cGVzXyA8PAotICAgICAgIiNpbmNsdWRlIFwiIiA8PCBnZXRfaW5jbHVkZV9wcmVmaXgoKmdldF9wcm9ncmFtKCkpIDw8IHByb2dyYW1fbmFtZV8gPDwKLSAgICAgICJfdHlwZXMudGNjXCIiIDw8IGVuZGwgPDwKLSAgICAgIGVuZGw7Ci0gIH0KLQotICAvLyBDbG9zZSBpZm5kZWYKLSAgZl90eXBlc18gPDwKLSAgICAiI2VuZGlmIiA8PCBlbmRsOwotICBmX3R5cGVzX3RjY18gPDwKLSAgICAiI2VuZGlmIiA8PCBlbmRsOwotCi0gIC8vIENsb3NlIG91dHB1dCBmaWxlCi0gIGZfdHlwZXNfLmNsb3NlKCk7Ci0gIGZfdHlwZXNfaW1wbF8uY2xvc2UoKTsKLSAgZl90eXBlc190Y2NfLmNsb3NlKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgdHlwZWRlZi4gVGhpcyBpcyBqdXN0IGEgc2ltcGxlIDEtbGluZXIgaW4gQysrCi0gKgotICogQHBhcmFtIHR0eXBlZGVmIFRoZSB0eXBlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgewotICBmX3R5cGVzXyA8PAotICAgIGluZGVudCgpIDw8ICJ0eXBlZGVmICIgPDwgdHlwZV9uYW1lKHR0eXBlZGVmLT5nZXRfdHlwZSgpLCB0cnVlKSA8PCAiICIgPDwgdHR5cGVkZWYtPmdldF9zeW1ib2xpYygpIDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLX0KLQotCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bV9jb25zdGFudF9saXN0KHN0ZDo6b2ZzdHJlYW0mIGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZlY3Rvcjx0X2VudW1fdmFsdWUqPiYgY29uc3RhbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHN1ZmZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsdWRlX3ZhbHVlcykgewotICBmIDw8ICIgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciBjX2l0ZXI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgZiA8PCAiLCIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50KGYpCi0gICAgICA8PCBwcmVmaXggPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8IHN1ZmZpeDsKLSAgICBpZiAoaW5jbHVkZV92YWx1ZXMpIHsKLSAgICAgIGYgPDwgIiA9ICIgPDwgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgICB9Ci0gIH0KLQotICBmIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChmKSA8PCAifTsiIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGNvZGUgZm9yIGFuIGVudW1lcmF0ZWQgdHlwZS4gSW4gQysrLCB0aGlzIGlzIGVzc2VudGlhbGx5IHRoZSBzYW1lCi0gKiBhcyB0aGUgdGhyaWZ0IGRlZmluaXRpb24gaXRzZWxmLCB1c2luZyB0aGUgZW51bSBrZXl3b3JkIGluIEMrKy4KLSAqCi0gKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCi0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7Ci0KLSAgc3RkOjpzdHJpbmcgZW51bV9uYW1lID0gdGVudW0tPmdldF9uYW1lKCk7Ci0gIGlmICghZ2VuX3B1cmVfZW51bXNfKSB7Ci0gICAgZW51bV9uYW1lID0gInR5cGUiOwotICAgIGZfdHlwZXNfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAic3RydWN0ICIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIiB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICB9Ci0gIGZfdHlwZXNfIDw8Ci0gICAgaW5kZW50KCkgPDwgImVudW0gIiA8PCBlbnVtX25hbWU7Ci0KLSAgZ2VuZXJhdGVfZW51bV9jb25zdGFudF9saXN0KGZfdHlwZXNfLCBjb25zdGFudHMsICIiLCAiIiwgdHJ1ZSk7Ci0KLSAgaWYgKCFnZW5fcHVyZV9lbnVtc18pIHsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGZfdHlwZXNfIDw8ICJ9OyIgPDwgZW5kbDsKLSAgfQotCi0gIGZfdHlwZXNfIDw8IGVuZGw7Ci0KLSAgLyoqCi0gICAgIEdlbmVyYXRlIGEgY2hhcmFjdGVyIGFycmF5IG9mIGVudW0gbmFtZXMgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy4KLSAgKi8KLSAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiI7Ci0gIGlmICghZ2VuX3B1cmVfZW51bXNfKSB7Ci0gICAgcHJlZml4ID0gdGVudW0tPmdldF9uYW1lKCkgKyAiOjoiOwotICB9Ci0KLSAgZl90eXBlc19pbXBsXyA8PAotICAgIGluZGVudCgpIDw8ICJpbnQgX2siIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICJWYWx1ZXNbXSA9IjsKLSAgZ2VuZXJhdGVfZW51bV9jb25zdGFudF9saXN0KGZfdHlwZXNfaW1wbF8sIGNvbnN0YW50cywgcHJlZml4LmNfc3RyKCksICIiLCBmYWxzZSk7Ci0KLSAgZl90eXBlc19pbXBsXyA8PAotICAgIGluZGVudCgpIDw8ICJjb25zdCBjaGFyKiBfayIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIk5hbWVzW10gPSI7Ci0gIGdlbmVyYXRlX2VudW1fY29uc3RhbnRfbGlzdChmX3R5cGVzX2ltcGxfLCBjb25zdGFudHMsICJcIiIsICJcIiIsIGZhbHNlKTsKLQotICBmX3R5cGVzXyA8PAotICAgIGluZGVudCgpIDw8ICJleHRlcm4gY29uc3Qgc3RkOjptYXA8aW50LCBjb25zdCBjaGFyKj4gXyIgPDwKLSAgICB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiX1ZBTFVFU19UT19OQU1FUzsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBmX3R5cGVzX2ltcGxfIDw8Ci0gICAgaW5kZW50KCkgPDwgImNvbnN0IHN0ZDo6bWFwPGludCwgY29uc3QgY2hhcio+IF8iIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8Ci0gICAgIl9WQUxVRVNfVE9fTkFNRVMoOjphcGFjaGU6OnRocmlmdDo6VEVudW1JdGVyYXRvcigiIDw8IGNvbnN0YW50cy5zaXplKCkgPDwKLSAgICAiLCBfayIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIlZhbHVlcyIgPDwKLSAgICAiLCBfayIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIk5hbWVzKSwgIiA8PAotICAgICI6OmFwYWNoZTo6dGhyaWZ0OjpURW51bUl0ZXJhdG9yKC0xLCBOVUxMLCBOVUxMKSk7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfbG9jYWxfcmVmbGVjdGlvbihmX3R5cGVzXywgdGVudW0sIGZhbHNlKTsKLSAgZ2VuZXJhdGVfbG9jYWxfcmVmbGVjdGlvbihmX3R5cGVzX2ltcGxfLCB0ZW51bSwgdHJ1ZSk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgY2xhc3MgdGhhdCBob2xkcyBhbGwgdGhlIGNvbnN0YW50cy4KLSAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0cyhzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKSB7Ci0gIHN0cmluZyBmX2NvbnN0c19uYW1lID0gZ2V0X291dF9kaXIoKStwcm9ncmFtX25hbWVfKyJfY29uc3RhbnRzLmgiOwotICBvZnN0cmVhbSBmX2NvbnN0czsKLSAgZl9jb25zdHMub3BlbihmX2NvbnN0c19uYW1lLmNfc3RyKCkpOwotCi0gIHN0cmluZyBmX2NvbnN0c19pbXBsX25hbWUgPSBnZXRfb3V0X2RpcigpK3Byb2dyYW1fbmFtZV8rIl9jb25zdGFudHMuY3BwIjsKLSAgb2ZzdHJlYW0gZl9jb25zdHNfaW1wbDsKLSAgZl9jb25zdHNfaW1wbC5vcGVuKGZfY29uc3RzX2ltcGxfbmFtZS5jX3N0cigpKTsKLQotICAvLyBQcmludCBoZWFkZXIKLSAgZl9jb25zdHMgPDwKLSAgICBhdXRvZ2VuX2NvbW1lbnQoKTsKLSAgZl9jb25zdHNfaW1wbCA8PAotICAgIGF1dG9nZW5fY29tbWVudCgpOwotCi0gIC8vIFN0YXJ0IGlmbmRlZgotICBmX2NvbnN0cyA8PAotICAgICIjaWZuZGVmICIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiX0NPTlNUQU5UU19IIiA8PCBlbmRsIDw8Ci0gICAgIiNkZWZpbmUgIiA8PCBwcm9ncmFtX25hbWVfIDw8ICJfQ09OU1RBTlRTX0giIDw8IGVuZGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgIiNpbmNsdWRlIFwiIiA8PCBnZXRfaW5jbHVkZV9wcmVmaXgoKmdldF9wcm9ncmFtKCkpIDw8IHByb2dyYW1fbmFtZV8gPDwKLSAgICAiX3R5cGVzLmhcIiIgPDwgZW5kbCA8PAotICAgIGVuZGwgPDwKLSAgICBuc19vcGVuXyA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICBmX2NvbnN0c19pbXBsIDw8Ci0gICAgIiNpbmNsdWRlIFwiIiA8PCBnZXRfaW5jbHVkZV9wcmVmaXgoKmdldF9wcm9ncmFtKCkpIDw8IHByb2dyYW1fbmFtZV8gPDwKLSAgICAiX2NvbnN0YW50cy5oXCIiIDw8IGVuZGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgbnNfb3Blbl8gPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgZl9jb25zdHMgPDwKLSAgICAiY2xhc3MgIiA8PCBwcm9ncmFtX25hbWVfIDw8ICJDb25zdGFudHMgeyIgPDwgZW5kbCA8PAotICAgICIgcHVibGljOiIgPDwgZW5kbCA8PAotICAgICIgICIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiQ29uc3RhbnRzKCk7IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIHZlY3Rvcjx0X2NvbnN0Kj46Oml0ZXJhdG9yIGNfaXRlcjsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBzdHJpbmcgbmFtZSA9ICgqY19pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICB0X3R5cGUqIHR5cGUgPSAoKmNfaXRlciktPmdldF90eXBlKCk7Ci0gICAgZl9jb25zdHMgPDwKLSAgICAgIGluZGVudCgpIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiICIgPDwgbmFtZSA8PCAiOyIgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfZG93bigpOwotICBmX2NvbnN0cyA8PAotICAgICJ9OyIgPDwgZW5kbDsKLQotICBmX2NvbnN0c19pbXBsIDw8Ci0gICAgImNvbnN0ICIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiQ29uc3RhbnRzIGdfIiA8PCBwcm9ncmFtX25hbWVfIDw8ICJfY29uc3RhbnRzOyIgPDwgZW5kbCA8PAotICAgIGVuZGwgPDwKLSAgICBwcm9ncmFtX25hbWVfIDw8ICJDb25zdGFudHM6OiIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiQ29uc3RhbnRzKCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgcHJpbnRfY29uc3RfdmFsdWUoZl9jb25zdHNfaW1wbCwKLSAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF9uYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCkpOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChmX2NvbnN0c19pbXBsKSA8PAotICAgICJ9IiA8PCBlbmRsOwotCi0gIGZfY29uc3RzIDw8Ci0gICAgZW5kbCA8PAotICAgICJleHRlcm4gY29uc3QgIiA8PCBwcm9ncmFtX25hbWVfIDw8ICJDb25zdGFudHMgZ18iIDw8IHByb2dyYW1fbmFtZV8gPDwgIl9jb25zdGFudHM7IiA8PCBlbmRsIDw8Ci0gICAgZW5kbCA8PAotICAgIG5zX2Nsb3NlXyA8PCBlbmRsIDw8Ci0gICAgZW5kbCA8PAotICAgICIjZW5kaWYiIDw8IGVuZGw7Ci0gIGZfY29uc3RzLmNsb3NlKCk7Ci0KLSAgZl9jb25zdHNfaW1wbCA8PAotICAgIGVuZGwgPDwKLSAgICBuc19jbG9zZV8gPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLS8qKgotICogUHJpbnRzIHRoZSB2YWx1ZSBvZiBhIGNvbnN0YW50IHdpdGggdGhlIGdpdmVuIHR5cGUuIE5vdGUgdGhhdCB0eXBlIGNoZWNraW5nCi0gKiBpcyBOT1QgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24gYXMgaXQgaXMgYWx3YXlzIHJ1biBiZWZvcmVoYW5kIHVzaW5nIHRoZQotICogdmFsaWRhdGVfdHlwZXMgbWV0aG9kIGluIG1haW4uY2MKLSAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OnByaW50X2NvbnN0X3ZhbHVlKG9mc3RyZWFtJiBvdXQsIHN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICBzdHJpbmcgdjIgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCB0eXBlLCB2YWx1ZSk7Ci0gICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiID0gIiA8PCB2MiA8PCAiOyIgPDwgZW5kbCA8PAotICAgICAgZW5kbDsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIgPSAoIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIikiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBib29sIGlzX25vbnJlcXVpcmVkX2ZpZWxkID0gZmFsc2U7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7Ci0gICAgICBpc19ub25yZXF1aXJlZF9maWVsZCA9IGZhbHNlOwotICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKLSAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgICAgICAgIGlzX25vbnJlcXVpcmVkX2ZpZWxkID0gKCpmX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRDsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgewotICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOwotICAgICAgfQotICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKLSAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIi4iIDw8IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSA8PCAiID0gIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICBpZihpc19ub25yZXF1aXJlZF9maWVsZCkgewotICAgICAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIi5fX2lzc2V0LiIgPDwgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpIDw8ICIgPSB0cnVlOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOwotICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgc3RyaW5nIGtleSA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGt0eXBlLCB2X2l0ZXItPmZpcnN0KTsKLSAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCB2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiLmluc2VydChzdGQ6Om1ha2VfcGFpcigiIDw8IGtleSA8PCAiLCAiIDw8IHZhbCA8PCAiKSk7IiA8PCBlbmRsOwotICAgIH0KLSAgICBvdXQgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICB0X3R5cGUqIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7Ci0gICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgZXR5cGUsICp2X2l0ZXIpOwotICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiLnB1c2hfYmFjaygiIDw8IHZhbCA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgdF90eXBlKiBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7Ci0gICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgZXR5cGUsICp2X2l0ZXIpOwotICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiLmluc2VydCgiIDw8IHZhbCA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gcHJpbnRfY29uc3RfdmFsdWU6ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotICB9Ci19Ci0KLS8qKgotICoKLSAqLwotc3RyaW5nIHRfY3BwX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKG9mc3RyZWFtJiBvdXQsIHN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7Ci0gICh2b2lkKSBuYW1lOwotICBzdGQ6Om9zdHJpbmdzdHJlYW0gcmVuZGVyOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICByZW5kZXIgPDwgJyInIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmVuZGVyIDw8ICgodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIkxMIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKLSAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJlbmRlciA8PCAiKCIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIpIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgfSBlbHNlIHsKLSAgICBzdHJpbmcgdCA9IHRtcCgidG1wIik7Ci0gICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgIiA8PCB0IDw8ICI7IiA8PCBlbmRsOwotICAgIHByaW50X2NvbnN0X3ZhbHVlKG91dCwgdCwgdHlwZSwgdmFsdWUpOwotICAgIHJlbmRlciA8PCB0OwotICB9Ci0KLSAgcmV0dXJuIHJlbmRlci5zdHIoKTsKLX0KLQotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2ZvcndhcmRfZGVjbGFyYXRpb24odF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgLy8gRm9yd2FyZCBkZWNsYXJlIHN0cnVjdCBkZWYKLSAgZl90eXBlc18gPDwKLSAgICBpbmRlbnQoKSA8PCAiY2xhc3MgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZGF0YSB0eXBlLiBUaGlzIGlzIGEgY2xhc3MKLSAqIHdpdGggZGF0YSBtZW1iZXJzIGFuZCBhIHJlYWQvd3JpdGUoKSBmdW5jdGlvbiwgcGx1cyBhIG1pcnJvcmluZyBpc3NldAotICogaW5uZXIgY2xhc3MuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jcHBfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbikgewotICBnZW5lcmF0ZV9zdHJ1Y3RfZGVjbGFyYXRpb24oZl90eXBlc18sIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIHRydWUsIHRydWUsIHRydWUpOwotICBnZW5lcmF0ZV9zdHJ1Y3RfZGVmaW5pdGlvbihmX3R5cGVzX2ltcGxfLCBmX3R5cGVzX2ltcGxfLCB0c3RydWN0KTsKLSAgZ2VuZXJhdGVfc3RydWN0X2ZpbmdlcnByaW50KGZfdHlwZXNfaW1wbF8sIHRzdHJ1Y3QsIHRydWUpOwotICBnZW5lcmF0ZV9sb2NhbF9yZWZsZWN0aW9uKGZfdHlwZXNfLCB0c3RydWN0LCBmYWxzZSk7Ci0gIGdlbmVyYXRlX2xvY2FsX3JlZmxlY3Rpb24oZl90eXBlc19pbXBsXywgdHN0cnVjdCwgdHJ1ZSk7Ci0gIGdlbmVyYXRlX2xvY2FsX3JlZmxlY3Rpb25fcG9pbnRlcihmX3R5cGVzX2ltcGxfLCB0c3RydWN0KTsKLQotICBzdGQ6Om9mc3RyZWFtJiBvdXQgPSAoZ2VuX3RlbXBsYXRlc18gPyBmX3R5cGVzX3RjY18gOiBmX3R5cGVzX2ltcGxfKTsKLSAgZ2VuZXJhdGVfc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QpOwotICBnZW5lcmF0ZV9zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCk7Ci0gIGdlbmVyYXRlX3N0cnVjdF9zd2FwKGZfdHlwZXNfaW1wbF8sIHRzdHJ1Y3QpOwotICBnZW5lcmF0ZV9jb3B5X2NvbnN0cnVjdG9yKGZfdHlwZXNfaW1wbF8sIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7Ci0gIGdlbmVyYXRlX2Fzc2lnbm1lbnRfb3BlcmF0b3IoZl90eXBlc19pbXBsXywgdHN0cnVjdCk7Ci0gIGdlbmVyYXRlX3N0cnVjdF9vc3RyZWFtX29wZXJhdG9yKGZfdHlwZXNfaW1wbF8sIHRzdHJ1Y3QpOwotfQotCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29weV9jb25zdHJ1Y3RvcigKLSAgb2ZzdHJlYW0mIG91dCwKLSAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gIGJvb2wgaXNfZXhjZXB0aW9uKSB7Ci0gIHN0ZDo6c3RyaW5nIHRtcF9uYW1lID0gdG1wKCJvdGhlciIpOwotCi0gIGluZGVudChvdXQpIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIjo6IiA8PAotICAgIHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIihjb25zdCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwKLSAgICAiJiAiIDw8IHRtcF9uYW1lIDw8ICIpICI7Ci0gIGlmIChpc19leGNlcHRpb24pCi0gICAgb3V0IDw8ICI6IFRFeGNlcHRpb24oKSAiOwotICBvdXQgPDwgInsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotCi0gIC8vIGVsaW1pbmF0ZSBjb21waWxlciB1bnVzZWQgd2FybmluZwotICBpZiAobWVtYmVycy5lbXB0eSgpKQotICAgIGluZGVudChvdXQpIDw8ICIodm9pZCkgIiA8PCB0bXBfbmFtZSA8PCAiOyIgPDwgZW5kbDsKLQotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGJvb2wgaGFzX25vbnJlcXVpcmVkX2ZpZWxkcyA9IGZhbHNlOwotICBmb3IgKGZfaXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgZl9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpCi0gICAgICBoYXNfbm9ucmVxdWlyZWRfZmllbGRzID0gdHJ1ZTsKLSAgICBpbmRlbnQob3V0KSA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgdG1wX25hbWUgPDwgIi4iIDw8Ci0gICAgICAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gIH0KLQotICBpZiAoaGFzX25vbnJlcXVpcmVkX2ZpZWxkcykKLSAgICBpbmRlbnQob3V0KSA8PCAiX19pc3NldCA9ICIgPDwgdG1wX25hbWUgPDwgIi5fX2lzc2V0OyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Fzc2lnbm1lbnRfb3BlcmF0b3IoCi0gIG9mc3RyZWFtJiBvdXQsCi0gIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIHN0ZDo6c3RyaW5nIHRtcF9uYW1lID0gdG1wKCJvdGhlciIpOwotCi0gIGluZGVudChvdXQpIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiYgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICI6OiIKLSAgICAib3BlcmF0b3I9KGNvbnN0ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PAotICAgICImICIgPDwgdG1wX25hbWUgPDwgIikgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0KLSAgLy8gZWxpbWluYXRlIGNvbXBpbGVyIHVudXNlZCB3YXJuaW5nCi0gIGlmIChtZW1iZXJzLmVtcHR5KCkpCi0gICAgaW5kZW50KG91dCkgPDwgIih2b2lkKSAiIDw8IHRtcF9uYW1lIDw8ICI7IiA8PCBlbmRsOwotCi0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgYm9vbCBoYXNfbm9ucmVxdWlyZWRfZmllbGRzID0gZmFsc2U7Ci0gIGZvciAoZl9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBmX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCkKLSAgICAgIGhhc19ub25yZXF1aXJlZF9maWVsZHMgPSB0cnVlOwotICAgIGluZGVudChvdXQpIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCB0bXBfbmFtZSA8PCAiLiIgPDwKLSAgICAgICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKLSAgfQotICBpZiAoaGFzX25vbnJlcXVpcmVkX2ZpZWxkcykKLSAgICBpbmRlbnQob3V0KSA8PCAiX19pc3NldCA9ICIgPDwgdG1wX25hbWUgPDwgIi5fX2lzc2V0OyIgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAicmV0dXJuICp0aGlzOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogV3JpdGVzIHRoZSBzdHJ1Y3QgZGVjbGFyYXRpb24gaW50byB0aGUgaGVhZGVyIGZpbGUKLSAqCi0gKiBAcGFyYW0gb3V0IE91dHB1dCBzdHJlYW0KLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QKLSAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdF9kZWNsYXJhdGlvbihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcG9pbnRlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZWFkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgd3JpdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzd2FwKSB7Ci0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIGlmIChpc19leGNlcHRpb24pIHsKLSAgICBleHRlbmRzID0gIiA6IHB1YmxpYyA6OmFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uIjsKLSAgfQotCi0gIC8vIEdldCBtZW1iZXJzCi0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0KLSAgLy8gV3JpdGUgdGhlIGlzc2V0IHN0cnVjdHVyZSBkZWNsYXJhdGlvbiBvdXRzaWRlIHRoZSBjbGFzcy4gVGhpcyBtYWtlcwotICAvLyB0aGUgZ2VuZXJhdGVkIGNvZGUgYW1lbmFibGUgdG8gcHJvY2Vzc2luZyBieSBTV0lHLgotICAvLyBXZSBvbmx5IGRlY2xhcmUgdGhlIHN0cnVjdCBpZiBpdCBnZXRzIHVzZWQgaW4gdGhlIGNsYXNzLgotCi0gIC8vIElzc2V0IHN0cnVjdCBoYXMgYm9vbGVhbiBmaWVsZHMsIGJ1dCBvbmx5IGZvciBub24tcmVxdWlyZWQgZmllbGRzLgotICBib29sIGhhc19ub25yZXF1aXJlZF9maWVsZHMgPSBmYWxzZTsKLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKQotICAgICAgaGFzX25vbnJlcXVpcmVkX2ZpZWxkcyA9IHRydWU7Ci0gIH0KLQotICBpZiAoaGFzX25vbnJlcXVpcmVkX2ZpZWxkcyAmJiAoIXBvaW50ZXJzIHx8IHJlYWQpKSB7Ci0KLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ0eXBlZGVmIHN0cnVjdCBfIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICJfX2lzc2V0IHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIl8iIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIl9faXNzZXQoKSAiOwotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgc3RyaW5nIGlzU2V0ID0gKCgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgPyAidHJ1ZSIgOiAiZmFsc2UiOwotICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgIG91dCA8PAotICAgICAgICAgICI6ICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoIiA8PCBpc1NldCA8PCAiKSI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwKLSAgICAgICAgICAiLCAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCIgPDwgaXNTZXQgPDwgIikiOwotICAgICAgfQotICAgIH0KLSAgICBvdXQgPDwgIiB7fSIgPDwgZW5kbDsKLQotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICAgImJvb2wgIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA6MTsiIDw8IGVuZGw7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICJ9IF8iIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIl9faXNzZXQ7IiA8PCBlbmRsOwotICAgIH0KLQotICBvdXQgPDwgZW5kbDsKLQotICAvLyBPcGVuIHN0cnVjdCBkZWYKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgImNsYXNzICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCBleHRlbmRzIDw8ICIgeyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgcHVibGljOiIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIC8vIFB1dCB0aGUgZmluZ2VycHJpbnQgdXAgdG9wIGZvciBhbGwgdG8gc2VlLgotICBnZW5lcmF0ZV9zdHJ1Y3RfZmluZ2VycHJpbnQob3V0LCB0c3RydWN0LCBmYWxzZSk7Ci0KLSAgaWYgKCFwb2ludGVycykgewotICAgIC8vIENvcHkgY29uc3RydWN0b3IKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKGNvbnN0ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiJik7IiA8PCBlbmRsOwotCi0gICAgLy8gQXNzaWdubWVudCBPcGVyYXRvcgotICAgIGluZGVudChvdXQpIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiYgb3BlcmF0b3I9KGNvbnN0ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiJik7IiA8PCBlbmRsOwotCi0gICAgLy8gRGVmYXVsdCBjb25zdHJ1Y3RvcgotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoKSI7Ci0KLQotICAgIGJvb2wgaW5pdF9jdG9yID0gZmFsc2U7Ci0KLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgICBpZiAodC0+aXNfYmFzZV90eXBlKCkgfHwgdC0+aXNfZW51bSgpIHx8IGlzX3JlZmVyZW5jZSgqbV9pdGVyKSkgewotICAgICAgICBzdHJpbmcgZHZhbDsKLSAgICAgICAgaWYgKHQtPmlzX2VudW0oKSkgewotICAgICAgICAgIGR2YWwgKz0gIigiICsgdHlwZV9uYW1lKHQpICsgIikiOwotICAgICAgICB9Ci0gICAgICAgIGR2YWwgKz0gKHQtPmlzX3N0cmluZygpIHx8IGlzX3JlZmVyZW5jZSgqbV9pdGVyKSkgPyAiIiA6ICIwIjsKLSAgICAgICAgdF9jb25zdF92YWx1ZSogY3YgPSAoKm1faXRlciktPmdldF92YWx1ZSgpOwotICAgICAgICBpZiAoY3YgIT0gTlVMTCkgewotICAgICAgICAgIGR2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCAoKm1faXRlciktPmdldF9uYW1lKCksIHQsIGN2KTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIWluaXRfY3RvcikgewotICAgICAgICAgIGluaXRfY3RvciA9IHRydWU7Ci0gICAgICAgICAgb3V0IDw8ICIgOiAiOwotICAgICAgICAgIG91dCA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIigiIDw8IGR2YWwgPDwgIikiOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIG91dCA8PCAiLCAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCIgPDwgZHZhbCA8PCAiKSI7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgb3V0IDw8ICIgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICAvLyBUT0RPKGRyZWlzcyk6IFdoZW4gZXZlcnl0aGluZyBlbHNlIGluIFRocmlmdCBpcyBwZXJmZWN0LAotICAgIC8vIGRvIG1vcmUgb2YgdGhlc2UgaW4gdGhlIGluaXRpYWxpemVyIGxpc3QuCi0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOwotCi0gICAgICBpZiAoIXQtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICAgIHRfY29uc3RfdmFsdWUqIGN2ID0gKCptX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgICAgICAgaWYgKGN2ICE9IE5VTEwpIHsKLSAgICAgICAgICBwcmludF9jb25zdF92YWx1ZShvdXQsICgqbV9pdGVyKS0+Z2V0X25hbWUoKSwgdCwgY3YpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgfQotCi0gIGlmICh0c3RydWN0LT5hbm5vdGF0aW9uc18uZmluZCgiZmluYWwiKSA9PSB0c3RydWN0LT5hbm5vdGF0aW9uc18uZW5kKCkpIHsKLSAgICBvdXQgPDwKLSAgICAgIGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ2aXJ0dWFsIH4iIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIigpIHRocm93KCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgLy8gUG9pbnRlciB0byB0aGlzIHN0cnVjdHVyZSdzIHJlZmxlY3Rpb24gbG9jYWwgdHlwZXNwZWMuCi0gIGlmIChnZW5fZGVuc2VfKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJzdGF0aWMgOjphcGFjaGU6OnRocmlmdDo6cmVmbGVjdGlvbjo6bG9jYWw6OlR5cGVTcGVjKiBsb2NhbF9yZWZsZWN0aW9uOyIgPDwKLSAgICAgIGVuZGwgPDwgZW5kbDsKLSAgfQotCi0gIC8vIERlY2xhcmUgYWxsIGZpZWxkcwotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgIGRlY2xhcmVfZmllbGQoKm1faXRlciwgZmFsc2UsIChwb2ludGVycyAmJiAhKCptX2l0ZXIpLT5nZXRfdHlwZSgpLT5pc194Y2VwdGlvbigpKSwgIXJlYWQpIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBBZGQgdGhlIF9faXNzZXQgZGF0YSBtZW1iZXIgaWYgd2UgbmVlZCBpdCwgdXNpbmcgdGhlIGRlZmluaXRpb24gZnJvbSBhYm92ZQotICBpZiAoaGFzX25vbnJlcXVpcmVkX2ZpZWxkcyAmJiAoIXBvaW50ZXJzIHx8IHJlYWQpKSB7Ci0gICAgb3V0IDw8Ci0gICAgICBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiXyIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiX19pc3NldCBfX2lzc2V0OyIgPDwgZW5kbDsKLSAgfQotCi0gIC8vIENyZWF0ZSBhIHNldHRlciBmdW5jdGlvbiBmb3IgZWFjaCBmaWVsZAotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgaWYgKHBvaW50ZXJzKSB7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgaWYgKGlzX3JlZmVyZW5jZSgoKm1faXRlcikpKSB7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAidm9pZCBfX3NldF8iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PAotICAgICAgICAiKGJvb3N0OjpzaGFyZWRfcHRyPCIgPDwgdHlwZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlKSA8PCAiPiI7Ci0gICAgICBvdXQgPDwgIiB2YWwpOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgb3V0IDw8Ci0gICAgICAgIGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInZvaWQgX19zZXRfIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwKLSAgICAgICAgIigiIDw8IHR5cGVfbmFtZSgoKm1faXRlciktPmdldF90eXBlKCksIGZhbHNlLCB0cnVlKTsKLSAgICAgIG91dCA8PCAiIHZhbCk7IiA8PCBlbmRsOwotICAgIH0KLSAgfQotICBvdXQgPDwgZW5kbDsKLQotICBpZiAoIXBvaW50ZXJzKSB7Ci0gICAgLy8gU2hvdWxkIHdlIGdlbmVyYXRlIGRlZmF1bHQgb3BlcmF0b3JzPwotICAgIGlmICghZ2VuX25vX2RlZmF1bHRfb3BlcmF0b3JzXykgewotICAgICAgLy8gR2VuZXJhdGUgYW4gZXF1YWxpdHkgdGVzdGluZyBvcGVyYXRvci4gIE1ha2UgaXQgaW5saW5lIHNpbmNlIHRoZSBjb21waWxlcgotICAgICAgLy8gd2lsbCBkbyBhIGJldHRlciBqb2IgdGhhbiB3ZSB3b3VsZCB3aGVuIGRlY2lkaW5nIHdoZXRoZXIgdG8gaW5saW5lIGl0LgotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJib29sIG9wZXJhdG9yID09IChjb25zdCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiAmICIgPDwKLSAgICAgICAgKG1lbWJlcnMuc2l6ZSgpID4gMCA/ICJyaHMiIDogIi8qIHJocyAqLyIpIDw8ICIpIGNvbnN0IiA8PCBlbmRsOwotICAgICAgc2NvcGVfdXAob3V0KTsKLSAgICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgICAgLy8gTW9zdCBleGlzdGluZyBUaHJpZnQgY29kZSBkb2VzIG5vdCB1c2UgaXNzZXQgb3Igb3B0aW9uYWwvcmVxdWlyZWQsCi0gICAgICAgIC8vIHNvIHdlIHRyZWF0ICJkZWZhdWx0IiBmaWVsZHMgYXMgcmVxdWlyZWQuCi0gICAgICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX09QVElPTkFMKSB7Ci0gICAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKCEoIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgIDw8ICIgPT0gcmhzLiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpKSIgPDwgZW5kbCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGZhbHNlOyIgPDwgZW5kbDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBvdXQgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAoX19pc3NldC4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKQotICAgICAgICAgICAgICAgICAgICAgPDwgIiAhPSByaHMuX19pc3NldC4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSIgPDwgZW5kbCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGZhbHNlOyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgImVsc2UgaWYgKF9faXNzZXQuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiAmJiAhKCIKLSAgICAgICAgICAgICAgICAgICAgIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID09IHJocy4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKQotICAgICAgICAgICAgICAgICAgICAgPDwgIikpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gZmFsc2U7IiA8PCBlbmRsOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRydWU7IiA8PCBlbmRsOwotICAgICAgc2NvcGVfZG93bihvdXQpOwotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJib29sIG9wZXJhdG9yICE9IChjb25zdCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiAmcmhzKSBjb25zdCB7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiAhKCp0aGlzID09IHJocyk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICAgIC8vIEdlbmVyYXRlIHRoZSBkZWNsYXJhdGlvbiBvZiBhIGxlc3MtdGhhbiBvcGVyYXRvci4gIFRoaXMgbXVzdCBiZQotICAgICAgLy8gaW1wbGVtZW50ZWQgYnkgdGhlIGFwcGxpY2F0aW9uIGRldmVsb3BlciBpZiB0aGV5IHdpc2ggdG8gdXNlIGl0LiAgKFRoZXkKLSAgICAgIC8vIHdpbGwgZ2V0IGEgbGluayBlcnJvciBpZiB0aGV5IHRyeSB0byB1c2UgaXQgd2l0aG91dCBhbiBpbXBsZW1lbnRhdGlvbi4pCi0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImJvb2wgb3BlcmF0b3IgPCAoY29uc3QgIgotICAgICAgICAgICAgICAgICA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgJiApIGNvbnN0OyIgPDwgZW5kbCA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIGlmIChyZWFkKSB7Ci0gICAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInRlbXBsYXRlIDxjbGFzcyBQcm90b2NvbF8+IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ1aW50MzJfdCByZWFkKFByb3RvY29sXyogaXByb3QpOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ1aW50MzJfdCByZWFkKCIgPDwKLSAgICAgICAgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIGlwcm90KTsiIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0gIGlmICh3cml0ZSkgewotICAgIGlmIChnZW5fdGVtcGxhdGVzXykgewotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ0ZW1wbGF0ZSA8Y2xhc3MgUHJvdG9jb2xfPiIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAidWludDMyX3Qgd3JpdGUoUHJvdG9jb2xfKiBvcHJvdCkgY29uc3Q7IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInVpbnQzMl90IHdyaXRlKCIgPDwKLSAgICAgICAgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIG9wcm90KSBjb25zdDsiIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0gIG91dCA8PCBlbmRsOwotCi0gIC8vIG9zdHJlYW0gb3BlcmF0b3I8PAotICBvdXQgPDwgaW5kZW50KCkgPDwgImZyaWVuZCAiOwotICBnZW5lcmF0ZV9zdHJ1Y3Rfb3N0cmVhbV9vcGVyYXRvcl9kZWNsKG91dCwgdHN0cnVjdCk7Ci0gIG91dCA8PCAiOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PAotICAgICJ9OyIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgaWYgKHN3YXApIHsKLSAgICAvLyBHZW5lcmF0ZSBhIG5hbWVzcGFjZS1zY29wZSBzd2FwKCkgZnVuY3Rpb24KLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ2b2lkIHN3YXAoIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgJmEsICIgPDwKLSAgICAgIHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiAmYik7IiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsOwotICB9Ci19Ci0KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3RfZGVmaW5pdGlvbihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mc3RyZWFtJiBmb3JjZV9jcHBfb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc2V0dGVycykgewotICAvLyBHZXQgbWVtYmVycwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotCi0KLSAgLy8gRGVzdHJ1Y3RvcgotICBpZiAodHN0cnVjdC0+YW5ub3RhdGlvbnNfLmZpbmQoImZpbmFsIikgPT0gdHN0cnVjdC0+YW5ub3RhdGlvbnNfLmVuZCgpKSB7Ci0gICAgZm9yY2VfY3BwX291dCA8PAotICAgICAgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiOjp+IiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoKSB0aHJvdygpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGZvcmNlX2NwcF9vdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotCi0gIC8vIENyZWF0ZSBhIHNldHRlciBmdW5jdGlvbiBmb3IgZWFjaCBmaWVsZAotICBpZiAoc2V0dGVycykgewotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIGlmIChpc19yZWZlcmVuY2UoKCptX2l0ZXIpKSkgewotICAgICAgICBzdGQ6OnN0cmluZyB0eXBlID0gdHlwZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgICAgIG91dCA8PAotICAgICAgICAgIGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAidm9pZCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIjo6X19zZXRfIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwKLSAgICAgICAgICAiKGJvb3N0OjpzaGFyZWRfcHRyPCIgPDwgdHlwZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlKSA8PCAiPiI7Ci0gICAgICAgIG91dCA8PCAiIHZhbCkgeyIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PAotICAgICAgICAgIGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAidm9pZCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIjo6X19zZXRfIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwKLSAgICAgICAgICAiKCIgPDwgdHlwZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIHRydWUpOwotICAgICAgICBvdXQgPDwgIiB2YWwpIHsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGhpcy0+IiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9IHZhbDsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotCi0gICAgICAvLyBhc3N1bWUgYWxsIGZpZWxkcyBhcmUgcmVxdWlyZWQgZXhjZXB0IG9wdGlvbmFsIGZpZWxkcy4KLSAgICAgIC8vIGZvciBvcHRpb25hbCBmaWVsZHMgY2hhbmdlIF9faXNzZXQubmFtZSB0byB0cnVlCi0gICAgICBib29sIGlzX29wdGlvbmFsID0gKCptX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTDsKLSAgICAgIGlmIChpc19vcHRpb25hbCkgewotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJfX2lzc2V0LiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSB0cnVlOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKTw8ICJ9IiA8PCBlbmRsOwotICAgIH0KLSAgfQotICBvdXQgPDwgZW5kbDsKLX0KLS8qKgotICogV3JpdGVzIHRoZSBmaW5nZXJwcmludCBvZiBhIHN0cnVjdCB0byBlaXRoZXIgdGhlIGhlYWRlciBvciBpbXBsZW1lbnRhdGlvbi4KLSAqCi0gKiBAcGFyYW0gb3V0IE91dHB1dCBzdHJlYW0KLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QKLSAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdF9maW5nZXJwcmludChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19kZWZpbml0aW9uKSB7Ci0gIHN0cmluZyBzdGF0LCBuc3BhY2UsIGNvbW1lbnQ7Ci0gIGlmIChpc19kZWZpbml0aW9uKSB7Ci0gICAgc3RhdCA9ICIiOwotICAgIG5zcGFjZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCkgKyAiOjoiOwotICAgIGNvbW1lbnQgPSAiICI7Ci0gIH0gZWxzZSB7Ci0gICAgc3RhdCA9ICJzdGF0aWMgIjsKLSAgICBuc3BhY2UgPSAiIjsKLSAgICBjb21tZW50ID0gIjsgLy8gIjsKLSAgfQotCi0gIGlmICghIHRzdHJ1Y3QtPmhhc19maW5nZXJwcmludCgpKSB7Ci0gICAgdHN0cnVjdC0+Z2VuZXJhdGVfZmluZ2VycHJpbnQoKTsgIC8vIGxhenkgZmluZ2VycHJpbnQgZ2VuZXJhdGlvbgotICB9Ci0gIGlmICh0c3RydWN0LT5oYXNfZmluZ2VycHJpbnQoKSkgewotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgc3RhdCA8PCAiY29uc3QgY2hhciogIiA8PCBuc3BhY2UKLSAgICAgICAgPDwgImFzY2lpX2ZpbmdlcnByaW50IiA8PCBjb21tZW50IDw8ICI9IFwiIiA8PAotICAgICAgICB0c3RydWN0LT5nZXRfYXNjaWlfZmluZ2VycHJpbnQoKSA8PCAiXCI7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCBzdGF0IDw8ICJjb25zdCB1aW50OF90ICIgPDwgbnNwYWNlIDw8Ci0gICAgICAgICJiaW5hcnlfZmluZ2VycHJpbnRbIiA8PCB0X3R5cGU6OmZpbmdlcnByaW50X2xlbiA8PCAiXSIgPDwgY29tbWVudCA8PCAiPSB7IjsKLSAgICBjb25zdCBjaGFyKiBjb21tYSA9ICIiOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdF90eXBlOjpmaW5nZXJwcmludF9sZW47IGkrKykgewotICAgICAgb3V0IDw8IGNvbW1hIDw8ICIweCIgPDwgdF9zdHJ1Y3Q6OmJ5dGVfdG9faGV4KHRzdHJ1Y3QtPmdldF9iaW5hcnlfZmluZ2VycHJpbnQoKVtpXSk7Ci0gICAgICBjb21tYSA9ICIsIjsKLSAgICB9Ci0gICAgb3V0IDw8ICJ9OyIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci19Ci0KLS8qKgotICogV3JpdGVzIHRoZSBsb2NhbCByZWZsZWN0aW9uIG9mIGEgdHlwZSAoZWl0aGVyIGRlY2xhcmF0aW9uIG9yIGRlZmluaXRpb24pLgotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbG9jYWxfcmVmbGVjdGlvbihzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19kZWZpbml0aW9uKSB7Ci0gIGlmICghZ2VuX2RlbnNlXykgewotICAgIHJldHVybjsKLSAgfQotICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOwotICBzdHJpbmcga2V5ID0gdHR5cGUtPmdldF9hc2NpaV9maW5nZXJwcmludCgpICsgKGlzX2RlZmluaXRpb24gPyAiLWRlZm4iIDogIi1kZWNsIik7Ci0gIGFzc2VydCh0dHlwZS0+aGFzX2ZpbmdlcnByaW50KCkpOyAgLy8gdGVzdCBBRlRFUiBnZXQgZHVlIHRvIGxhenkgZmluZ2VycHJpbnQgZ2VuZXJhdGlvbgotCi0gIC8vIE5vdGUgdGhhdCB3ZSBoYXZlIGdlbmVyYXRlZCB0aGlzIGZpbmdlcnByaW50LiAgSWYgd2UgYWxyZWFkeSBkaWQsIGJhaWwgb3V0LgotICBpZiAoIXJlZmxlY3RlZF9maW5nZXJwcmludHNfLmluc2VydChrZXkpLnNlY29uZCkgewotICAgIHJldHVybjsKLSAgfQotICAvLyBMZXQgZWFjaCBwcm9ncmFtIGhhbmRsZSBpdHMgb3duIHN0cnVjdHVyZXMuCi0gIGlmICh0dHlwZS0+Z2V0X3Byb2dyYW0oKSAhPSBOVUxMICYmIHR0eXBlLT5nZXRfcHJvZ3JhbSgpICE9IHByb2dyYW1fKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gRG8gZGVwZW5kZW5jaWVzLgotICBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGdlbmVyYXRlX2xvY2FsX3JlZmxlY3Rpb24ob3V0LCAoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCksIGlzX2RlZmluaXRpb24pOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGdlbmVyYXRlX2xvY2FsX3JlZmxlY3Rpb24ob3V0LCAoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSwgaXNfZGVmaW5pdGlvbik7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgZ2VuZXJhdGVfbG9jYWxfcmVmbGVjdGlvbihvdXQsICgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCksIGlzX2RlZmluaXRpb24pOwotICAgIGdlbmVyYXRlX2xvY2FsX3JlZmxlY3Rpb24ob3V0LCAoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpLCBpc19kZWZpbml0aW9uKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICAvLyBIYWNreSBoYWNreS4gIEZvciBlZmZpY2llbmN5IGFuZCBjb252ZW5pZW5jZSwgd2UgbmVlZCBhIGR1bW15ICJUX1NUT1AiCi0gICAgLy8gdHlwZSBhdCB0aGUgZW5kIG9mIG91ciB0eXBlc3BlYyBhcnJheS4gIFVuZm9ydHVuYXRlbHksIHRoZXJlIGlzIG5vCi0gICAgLy8gVF9TVE9QIHR5cGUsIHNvIHdlIHVzZSB0aGUgZ2xvYmFsIHZvaWQgdHlwZSwgYW5kIHNwZWNpYWwgY2FzZSBpdCB3aGVuCi0gICAgLy8gZ2VuZXJhdGluZyBpdHMgdHlwZXNwZWMuCi0KLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gKCh0X3N0cnVjdCopdHR5cGUpLT5nZXRfc29ydGVkX21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgZ2VuZXJhdGVfbG9jYWxfcmVmbGVjdGlvbihvdXQsICgqKm1faXRlcikuZ2V0X3R5cGUoKSwgaXNfZGVmaW5pdGlvbik7Ci0gICAgfQotICAgIGdlbmVyYXRlX2xvY2FsX3JlZmxlY3Rpb24ob3V0LCBnX3R5cGVfdm9pZCwgaXNfZGVmaW5pdGlvbik7Ci0KLSAgICAvLyBGb3IgZGVmaW5pdGlvbnMgb2Ygc3RydWN0dXJlcywgZG8gdGhlIGFycmF5cyBvZiBtZXRhcyBhbmQgZmllbGQgc3BlY3MgYWxzby4KLSAgICBpZiAoaXNfZGVmaW5pdGlvbikgewotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICI6OmFwYWNoZTo6dGhyaWZ0OjpyZWZsZWN0aW9uOjpsb2NhbDo6RmllbGRNZXRhIiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8IGxvY2FsX3JlZmxlY3Rpb25fbmFtZSgibWV0YXMiLCB0dHlwZSkgPDwiW10gPSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJ7ICIgPDwgKCptX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIiwgIiA8PAotICAgICAgICAgICgoKCptX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTCkgPyAidHJ1ZSIgOiAiZmFsc2UiKSA8PAotICAgICAgICAgICIgfSwiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgICAvLyBaZXJvIGZvciB0aGUgVF9TVE9QIG1hcmtlci4KLSAgICAgIGluZGVudChvdXQpIDw8ICJ7IDAsIGZhbHNlIH0iIDw8IGVuZGwgPDwgIn07IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLQotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICI6OmFwYWNoZTo6dGhyaWZ0OjpyZWZsZWN0aW9uOjpsb2NhbDo6VHlwZVNwZWMqIiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8IGxvY2FsX3JlZmxlY3Rpb25fbmFtZSgic3BlY3MiLCB0dHlwZSkgPDwiW10gPSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICImIiA8PAotICAgICAgICAgIGxvY2FsX3JlZmxlY3Rpb25fbmFtZSgidHlwZXNwZWMiLCAoKm1faXRlciktPmdldF90eXBlKCksIHRydWUpIDw8ICIsIiA8PCBlbmRsOwotICAgICAgfQotICAgICAgaW5kZW50KG91dCkgPDwgIiYiIDw8Ci0gICAgICAgIGxvY2FsX3JlZmxlY3Rpb25fbmFtZSgidHlwZXNwZWMiLCBnX3R5cGVfdm9pZCkgPDwgIiwiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn07IiA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICIvLyAiIDw8IHR0eXBlLT5nZXRfZmluZ2VycHJpbnRfbWF0ZXJpYWwoKSA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgKGlzX2RlZmluaXRpb24gPyAiIiA6ICJleHRlcm4gIikgPDwKLSAgICAgICI6OmFwYWNoZTo6dGhyaWZ0OjpyZWZsZWN0aW9uOjpsb2NhbDo6VHlwZVNwZWMiIDw8IGVuZGwgPDwKLSAgICAgIGxvY2FsX3JlZmxlY3Rpb25fbmFtZSgidHlwZXNwZWMiLCB0dHlwZSkgPDwKLSAgICAgIChpc19kZWZpbml0aW9uID8gIigiIDogIjsiKSA8PCBlbmRsOwotCi0gIGlmICghaXNfZGVmaW5pdGlvbikgewotICAgIG91dCA8PCBlbmRsOwotICAgIHJldHVybjsKLSAgfQotCi0gIGluZGVudF91cCgpOwotCi0gIGlmICh0dHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1NUT1AiOwotICB9IGVsc2UgewotICAgIGluZGVudChvdXQpIDw8IHR5cGVfdG9fZW51bSh0dHlwZSk7Ci0gIH0KLQotICBpZiAodHR5cGUtPmlzX3N0cnVjdCgpKSB7Ci0gICAgb3V0IDw8ICIsIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCB0eXBlX25hbWUodHR5cGUpIDw8ICI6OmJpbmFyeV9maW5nZXJwcmludCwiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8IGxvY2FsX3JlZmxlY3Rpb25fbmFtZSgibWV0YXMiLCB0dHlwZSkgPDwgIiwiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8IGxvY2FsX3JlZmxlY3Rpb25fbmFtZSgic3BlY3MiLCB0dHlwZSk7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIG91dCA8PCAiLCIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiYiIDw8IGxvY2FsX3JlZmxlY3Rpb25fbmFtZSgidHlwZXNwZWMiLCAoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCksIHRydWUpIDw8ICIsIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiTlVMTCI7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgb3V0IDw8ICIsIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiJiIgPDwgbG9jYWxfcmVmbGVjdGlvbl9uYW1lKCJ0eXBlc3BlYyIsICgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpLCB0cnVlKSA8PCAiLCIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIk5VTEwiOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIG91dCA8PCAiLCIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiYiIDw8IGxvY2FsX3JlZmxlY3Rpb25fbmFtZSgidHlwZXNwZWMiLCAoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpLCB0cnVlKSA8PCAiLCIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiYiIDw8IGxvY2FsX3JlZmxlY3Rpb25fbmFtZSgidHlwZXNwZWMiLCAoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpLCB0cnVlKTsKLSAgfQotCi0gIG91dCA8PCAiKTsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotfQotCi0vKioKLSAqIFdyaXRlcyB0aGUgc3RydWN0dXJlJ3Mgc3RhdGljIHBvaW50ZXIgdG8gaXRzIGxvY2FsIHJlZmxlY3Rpb24gdHlwZXNwZWMKLSAqIGludG8gdGhlIGltcGxlbWVudGF0aW9uIGZpbGUuCi0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9sb2NhbF9yZWZsZWN0aW9uX3BvaW50ZXIoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlKSB7Ci0gIGlmICghZ2VuX2RlbnNlXykgewotICAgIHJldHVybjsKLSAgfQotICBpbmRlbnQob3V0KSA8PAotICAgICI6OmFwYWNoZTo6dGhyaWZ0OjpyZWZsZWN0aW9uOjpsb2NhbDo6VHlwZVNwZWMqICIgPDwKLSAgICAgIHR0eXBlLT5nZXRfbmFtZSgpIDw8ICI6OmxvY2FsX3JlZmxlY3Rpb24gPSAiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICAmIiA8PCBsb2NhbF9yZWZsZWN0aW9uX25hbWUoInR5cGVzcGVjIiwgdHR5cGUpIDw8ICI7IiA8PAotICAgIGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBNYWtlcyBhIGhlbHBlciBmdW5jdGlvbiB0byBnZW4gYSBzdHJ1Y3QgcmVhZGVyLgotICoKLSAqIEBwYXJhbSBvdXQgU3RyZWFtIHRvIHdyaXRlIHRvCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0Ci0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3RfcmVhZGVyKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcG9pbnRlcnMpIHsKLSAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAidGVtcGxhdGUgPGNsYXNzIFByb3RvY29sXz4iIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ1aW50MzJfdCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwKLSAgICAgICI6OnJlYWQoUHJvdG9jb2xfKiBpcHJvdCkgeyIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgInVpbnQzMl90ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PAotICAgICAgIjo6cmVhZCg6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBpcHJvdCkgeyIgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfdXAoKTsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgLy8gRGVjbGFyZSBzdGFjayB0bXAgdmFyaWFibGVzCi0gIG91dCA8PAotICAgIGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAidWludDMyX3QgeGZlciA9IDA7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInN0ZDo6c3RyaW5nIGZuYW1lOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFR5cGUgZnR5cGU7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImludDE2X3QgZmlkOyIgPDwgZW5kbCA8PAotICAgIGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAieGZlciArPSBpcHJvdC0+cmVhZFN0cnVjdEJlZ2luKGZuYW1lKTsiIDw8IGVuZGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInVzaW5nIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xFeGNlcHRpb247IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICAvLyBSZXF1aXJlZCB2YXJpYWJsZXMgYXJlbid0IGluIF9faXNzZXQsIHNvIHdlIG5lZWQgdG1wIHZhcnMgdG8gY2hlY2sgdGhlbS4KLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkKLSAgICAgIGluZGVudChvdXQpIDw8ICJib29sIGlzc2V0XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSBmYWxzZTsiIDw8IGVuZGw7Ci0gIH0KLSAgb3V0IDw8IGVuZGw7Ci0KLQotICAvLyBMb29wIG92ZXIgcmVhZGluZyBpbiBmaWVsZHMKLSAgaW5kZW50KG91dCkgPDwKLSAgICAid2hpbGUgKHRydWUpIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0KLSAgICAvLyBSZWFkIGJlZ2lubmluZyBmaWVsZCBtYXJrZXIKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgInhmZXIgKz0gaXByb3QtPnJlYWRGaWVsZEJlZ2luKGZuYW1lLCBmdHlwZSwgZmlkKTsiIDw8IGVuZGw7Ci0KLSAgICAvLyBDaGVjayBmb3IgZmllbGQgU1RPUCBtYXJrZXIKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJpZiAoZnR5cGUgPT0gOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfU1RPUCkgeyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgYnJlYWs7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLQotICAgIGlmKGZpZWxkcy5lbXB0eSgpKSB7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInhmZXIgKz0gaXByb3QtPnNraXAoZnR5cGUpOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAvLyBTd2l0Y2ggc3RhdGVtZW50IG9uIHRoZSBmaWVsZCB3ZSBhcmUgcmVhZGluZwotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgInN3aXRjaCAoZmlkKSIgPDwgZW5kbDsKLQotICAgICAgICBzY29wZV91cChvdXQpOwotCi0gICAgICAgIC8vIEdlbmVyYXRlIGRlc2VyaWFsaXphdGlvbiBjb2RlIGZvciBrbm93biBjYXNlcwotICAgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICAgICAiY2FzZSAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICI6IiA8PCBlbmRsOwotICAgICAgICAgIGluZGVudF91cCgpOwotICAgICAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICAgICAiaWYgKGZ0eXBlID09ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIikgeyIgPDwgZW5kbDsKLSAgICAgICAgICBpbmRlbnRfdXAoKTsKLQotICAgICAgICAgIGNvbnN0IGNoYXIgKmlzc2V0X3ByZWZpeCA9Ci0gICAgICAgICAgICAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgPyAidGhpcy0+X19pc3NldC4iIDogImlzc2V0XyI7Ci0KLSNpZiAwCi0gICAgICAgICAgLy8gVGhpcyBjb2RlIHRocm93cyBhbiBleGNlcHRpb24gaWYgdGhlIHNhbWUgZmllbGQgaXMgZW5jb3VudGVyZWQgdHdpY2UuCi0gICAgICAgICAgLy8gV2UndmUgZGVjaWRlZCB0byBsZWF2ZSBpdCBvdXQgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuCi0gICAgICAgICAgLy8gVE9ETyhkcmVpc3MpOiBHZW5lcmF0ZSB0aGlzIGNvZGUgYW5kICJpZiIgaXQgb3V0IHRvIG1ha2UgaXQgZWFzaWVyCi0gICAgICAgICAgLy8gZm9yIHBlb3BsZSByZWNvbXBpbGluZyB0aHJpZnQgdG8gaW5jbHVkZSBpdC4KLSAgICAgICAgICBvdXQgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAoIiA8PCBpc3NldF9wcmVmaXggPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEpOyIgPDwgZW5kbDsKLSNlbmRpZgotCi0gICAgICAgICAgaWYgKHBvaW50ZXJzICYmICEoKmZfaXRlciktPmdldF90eXBlKCktPmlzX3hjZXB0aW9uKCkpIHsKLSAgICAgICAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgIigqKHRoaXMtPiIsICIpKSIpOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJ0aGlzLT4iKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCBpc3NldF9wcmVmaXggPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSB0cnVlOyIgPDwgZW5kbDsKLSAgICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICAgIG91dCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiICB4ZmVyICs9IGlwcm90LT5za2lwKGZ0eXBlKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgIC8vIFRPRE8oZHJlaXNzKTogTWFrZSB0aGlzIGFuIG9wdGlvbiB3aGVuIHRocmlmdCBzdHJ1Y3RzCi0gICAgICAgICAgICAvLyBoYXZlIGEgY29tbW9uIGJhc2UgY2xhc3MuCi0gICAgICAgICAgICAvLyBpbmRlbnQoKSA8PCAiICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEpOyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7Ci0gICAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIH0KLQotICAgICAgLy8gSW4gdGhlIGRlZmF1bHQgY2FzZSB3ZSBza2lwIHRoZSBmaWVsZAotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICB4ZmVyICs9IGlwcm90LT5za2lwKGZ0eXBlKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgYnJlYWs7IiA8PCBlbmRsOwotCi0gICAgICBzY29wZV9kb3duKG91dCk7Ci0gICAgfSAvLyFmaWVsZHMuZW1wdHkoKQotICAgIC8vIFJlYWQgZmllbGQgZW5kIG1hcmtlcgotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAieGZlciArPSBpcHJvdC0+cmVhZEZpZWxkRW5kKCk7IiA8PCBlbmRsOwotCi0gICAgc2NvcGVfZG93bihvdXQpOwotCi0gIG91dCA8PAotICAgIGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAieGZlciArPSBpcHJvdC0+cmVhZFN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKLQotICAvLyBUaHJvdyBpZiBhbnkgcmVxdWlyZWQgZmllbGRzIGFyZSBtaXNzaW5nLgotICAvLyBXZSBkbyB0aGlzIGFmdGVyIHJlYWRpbmcgdGhlIHN0cnVjdCBlbmQgc28gdGhhdAotICAvLyB0aGVyZSBtaWdodCBwb3NzaWJseSBiZSBhIGNoYW5jZSBvZiBjb250aW51aW5nLgotICBvdXQgPDwgZW5kbDsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkKLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKCFpc3NldF8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAnKScgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEpOyIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudChvdXQpIDw8ICJyZXR1cm4geGZlcjsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwKLSAgICAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyB0aGUgd3JpdGUgZnVuY3Rpb24uCi0gKgotICogQHBhcmFtIG91dCBTdHJlYW0gdG8gd3JpdGUgdG8KLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QKLSAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdF93cml0ZXIob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwb2ludGVycykgewotICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAidGVtcGxhdGUgPGNsYXNzIFByb3RvY29sXz4iIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ1aW50MzJfdCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwKLSAgICAgICI6OndyaXRlKFByb3RvY29sXyogb3Byb3QpIGNvbnN0IHsiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJ1aW50MzJfdCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwKLSAgICAgICI6OndyaXRlKDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIG9wcm90KSBjb25zdCB7IiA8PCBlbmRsOwotICB9Ci0gIGluZGVudF91cCgpOwotCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJ1aW50MzJfdCB4ZmVyID0gMDsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgIm9wcm90LT5pbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwKLSAgICAieGZlciArPSBvcHJvdC0+d3JpdGVTdHJ1Y3RCZWdpbihcIiIgPDwgbmFtZSA8PCAiXCIpOyIgPDwgZW5kbDsKLQotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGJvb2wgY2hlY2tfaWZfc2V0ID0gKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfdHlwZSgpLT5pc194Y2VwdGlvbigpOwotICAgIGlmIChjaGVja19pZl9zZXQpIHsKLSAgICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpZiAodGhpcy0+X19pc3NldC4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dCA8PCBlbmRsOwotICAgIH0KLQotICAgIC8vIFdyaXRlIGZpZWxkIGhlYWRlcgotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgInhmZXIgKz0gb3Byb3QtPndyaXRlRmllbGRCZWdpbigiIDw8Ci0gICAgICAiXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIsICIgPDwKLSAgICAgIHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICIpOyIgPDwgZW5kbDsKLSAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cwotICAgIGlmIChwb2ludGVycyAmJiAhKCpmX2l0ZXIpLT5nZXRfdHlwZSgpLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAiKCoodGhpcy0+IiwgIikpIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJ0aGlzLT4iKTsKLSAgICB9Ci0gICAgLy8gV3JpdGUgZmllbGQgY2xvc2VyCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJ4ZmVyICs9IG9wcm90LT53cml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOwotICAgIGlmIChjaGVja19pZl9zZXQpIHsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAnfSc7Ci0gICAgfQotICB9Ci0KLSAgb3V0IDw8IGVuZGw7Ci0KLSAgLy8gV3JpdGUgdGhlIHN0cnVjdCBtYXAKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgInhmZXIgKz0gb3Byb3QtPndyaXRlRmllbGRTdG9wKCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInhmZXIgKz0gb3Byb3QtPndyaXRlU3RydWN0RW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIm9wcm90LT5kZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJyZXR1cm4geGZlcjsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwKLSAgICAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLS8qKgotICogU3RydWN0IHdyaXRlciBmb3IgcmVzdWx0IG9mIGEgZnVuY3Rpb24sIHdoaWNoIGNhbiBoYXZlIG9ubHkgb25lIG9mIGl0cwotICogZmllbGRzIHNldCBhbmQgZG9lcyBhIGNvbmRpdGlvbmFsIGlmIGVsc2UgbG9vayB1cCBpbnRvIHRoZSBfX2lzc2V0IGZpZWxkCi0gKiBvZiB0aGUgc3RydWN0LgotICoKLSAqIEBwYXJhbSBvdXQgT3V0cHV0IHN0cmVhbQotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHJlc3VsdCBzdHJ1Y3QKLSAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdF9yZXN1bHRfd3JpdGVyKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwb2ludGVycykgewotICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAidGVtcGxhdGUgPGNsYXNzIFByb3RvY29sXz4iIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ1aW50MzJfdCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwKLSAgICAgICI6OndyaXRlKFByb3RvY29sXyogb3Byb3QpIGNvbnN0IHsiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJ1aW50MzJfdCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwKLSAgICAgICI6OndyaXRlKDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIG9wcm90KSBjb25zdCB7IiA8PCBlbmRsOwotICB9Ci0gIGluZGVudF91cCgpOwotCi0gIG91dCA8PAotICAgIGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAidWludDMyX3QgeGZlciA9IDA7IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICJ4ZmVyICs9IG9wcm90LT53cml0ZVN0cnVjdEJlZ2luKFwiIiA8PCBuYW1lIDw8ICJcIik7IiA8PCBlbmRsOwotCi0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIG91dCA8PAotICAgICAgICBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiAiOwotICAgIH0gZWxzZSB7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgIiBlbHNlIGlmICI7Ci0gICAgfQotCi0gICAgb3V0IDw8ICIodGhpcy0+X19pc3NldC4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSB7IiA8PCBlbmRsOwotCi0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICAvLyBXcml0ZSBmaWVsZCBoZWFkZXIKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ4ZmVyICs9IG9wcm90LT53cml0ZUZpZWxkQmVnaW4oIiA8PAotICAgICAgIlwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiLCAiIDw8Ci0gICAgICB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKLSAgICBpZiAocG9pbnRlcnMpIHsKLSAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICIoKih0aGlzLT4iLCAiKSkiKTsKLSAgICB9IGVsc2UgewotICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMtPiIpOwotICAgIH0KLSAgICAvLyBXcml0ZSBmaWVsZCBjbG9zZXIKLSAgICBpbmRlbnQob3V0KSA8PCAieGZlciArPSBvcHJvdC0+d3JpdGVGaWVsZEVuZCgpOyIgPDwgZW5kbDsKLQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iOwotICB9Ci0KLSAgLy8gV3JpdGUgdGhlIHN0cnVjdCBtYXAKLSAgb3V0IDw8Ci0gICAgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ4ZmVyICs9IG9wcm90LT53cml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ4ZmVyICs9IG9wcm90LT53cml0ZVN0cnVjdEVuZCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJyZXR1cm4geGZlcjsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwKLSAgICAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIHRoZSBzd2FwIGZ1bmN0aW9uLgotICoKLSAqIEBwYXJhbSBvdXQgU3RyZWFtIHRvIHdyaXRlIHRvCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0Ci0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3Rfc3dhcChvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAidm9pZCBzd2FwKCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiICZhLCAiIDw8Ci0gICAgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiICZiKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICAvLyBMZXQgYXJndW1lbnQtZGVwZW5kZW50IG5hbWUgbG9va3VwIGZpbmQgdGhlIGNvcnJlY3Qgc3dhcCgpIGZ1bmN0aW9uIHRvCi0gIC8vIHVzZSBiYXNlZCBvbiB0aGUgYXJndW1lbnQgdHlwZXMuICBJZiBub25lIGlzIGZvdW5kIGluIHRoZSBhcmd1bWVudHMnCi0gIC8vIG5hbWVzcGFjZXMsIGZhbGwgYmFjayB0byA6OnN0ZDo6c3dhcCgpLgotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAidXNpbmcgOjpzdGQ6OnN3YXA7IiA8PCBlbmRsOwotCi0gIGJvb2wgaGFzX25vbnJlcXVpcmVkX2ZpZWxkcyA9IGZhbHNlOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICBmb3IgKHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOwotICAgICAgIGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7Ci0gICAgICAgKytmX2l0ZXIpIHsKLSAgICB0X2ZpZWxkICp0ZmllbGQgPSAqZl9pdGVyOwotCi0gICAgaWYgKHRmaWVsZC0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKLSAgICAgIGhhc19ub25yZXF1aXJlZF9maWVsZHMgPSB0cnVlOwotICAgIH0KLQotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgInN3YXAoYS4iIDw8IHRmaWVsZC0+Z2V0X25hbWUoKSA8PAotICAgICAgIiwgYi4iIDw8IHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBpZiAoaGFzX25vbnJlcXVpcmVkX2ZpZWxkcykgewotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgInN3YXAoYS5fX2lzc2V0LCBiLl9faXNzZXQpOyIgPDwgZW5kbDsKLSAgfQotCi0gIC8vIGhhbmRsZSBlbXB0eSBzdHJ1Y3RzCi0gIGlmIChmaWVsZHMuc2l6ZSgpID09IDApIHsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICIodm9pZCkgYTsiIDw8IGVuZGw7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiKHZvaWQpIGI7IiA8PCBlbmRsOwotICB9Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotICBvdXQgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdF9vc3RyZWFtX29wZXJhdG9yX2RlY2woc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgb3V0IDw8ICJzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvdXQsIGNvbnN0ICIKLSAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiYgb2JqKSI7Ci19Ci0KLW5hbWVzcGFjZSBzdHJ1Y3Rfb3N0cmVhbV9vcGVyYXRvcl9nZW5lcmF0b3IKLXsKLXZvaWQgZ2VuZXJhdGVfcmVxdWlyZWRfZmllbGRfdmFsdWUoc3RkOjpvZnN0cmVhbSYgb3V0LCBjb25zdCB0X2ZpZWxkKiBmaWVsZCkKLXsKLSAgb3V0IDw8ICIgPDwgdG9fc3RyaW5nKG9iai4iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIpIjsKLX0KLQotdm9pZCBnZW5lcmF0ZV9vcHRpb25hbF9maWVsZF92YWx1ZShzdGQ6Om9mc3RyZWFtJiBvdXQsIGNvbnN0IHRfZmllbGQqIGZpZWxkKQotewotICBvdXQgPDwgIjsgKG9iai5fX2lzc2V0LiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiA/IChvdXQiOwotICBnZW5lcmF0ZV9yZXF1aXJlZF9maWVsZF92YWx1ZShvdXQsIGZpZWxkKTsKLSAgb3V0IDw8ICIpIDogKG91dCA8PCBcIjxudWxsPlwiKSkiOwotfQotCi12b2lkIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlKHN0ZDo6b2ZzdHJlYW0mIG91dCwgY29uc3QgdF9maWVsZCogZmllbGQpCi17Ci0gIGlmIChmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwpCi0gICAgZ2VuZXJhdGVfb3B0aW9uYWxfZmllbGRfdmFsdWUob3V0LCBmaWVsZCk7Ci0gIGVsc2UKLSAgICBnZW5lcmF0ZV9yZXF1aXJlZF9maWVsZF92YWx1ZShvdXQsIGZpZWxkKTsKLX0KLQotdm9pZCBnZW5lcmF0ZV9maWVsZF9uYW1lKHN0ZDo6b2ZzdHJlYW0mIG91dCwgY29uc3QgdF9maWVsZCogZmllbGQpCi17Ci0gIG91dCA8PCAiXCIiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICI9XCIiOwotfQotCi12b2lkIGdlbmVyYXRlX2ZpZWxkKHN0ZDo6b2ZzdHJlYW0mIG91dCwgY29uc3QgdF9maWVsZCogZmllbGQpCi17Ci0gIGdlbmVyYXRlX2ZpZWxkX25hbWUob3V0LCBmaWVsZCk7Ci0gIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlKG91dCwgZmllbGQpOwotfQotCi12b2lkIGdlbmVyYXRlX2ZpZWxkcyhzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgaW5kZW50KQotewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBiZWcgPSBmaWVsZHMuYmVnaW4oKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZW5kID0gZmllbGRzLmVuZCgpOwotCi0gIGZvciAodmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBiZWc7IGl0ICE9IGVuZDsgKytpdCkgewotICAgIG91dCA8PCBpbmRlbnQgPDwgIm91dCA8PCAiOwotCi0gICAgaWYgKGl0ICE9IGJlZykgewotICAgICAgb3V0IDw8ICJcIiwgXCIgPDwgIjsKLSAgICB9Ci0KLSAgICBnZW5lcmF0ZV9maWVsZChvdXQsICppdCk7Ci0gICAgb3V0IDw8ICI7IiA8PCBlbmRsOwotICB9Ci19Ci0KLQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBvcGVyYXRvcjw8Ci0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3Rfb3N0cmVhbV9vcGVyYXRvcihzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgb3V0IDw8IGluZGVudCgpOwotICBnZW5lcmF0ZV9zdHJ1Y3Rfb3N0cmVhbV9vcGVyYXRvcl9kZWNsKG91dCwgdHN0cnVjdCk7Ci0gIG91dCA8PCAiIHsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X3VwKCk7Ci0KLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgInVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0b19zdHJpbmc7IiA8PCBlbmRsOwotCi0gIC8vIGVsaW1pbmF0ZSBjb21waWxlciB1bnVzZWQgd2FybmluZwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICBpZiAoZmllbGRzLmVtcHR5KCkpCi0gICAgb3V0IDw8IGluZGVudCgpIDw8ICIodm9pZCkgb2JqOyIgPDwgZW5kbDsKLQotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAib3V0IDw8IFwiIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoXCI7IiA8PCBlbmRsOwotCi0gIHN0cnVjdF9vc3RyZWFtX29wZXJhdG9yX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZmllbGRzKG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSk7Ci0KLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgIm91dCA8PCBcIilcIjsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAicmV0dXJuIG91dDsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgb3V0IDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0aHJpZnQgc2VydmljZS4gSW4gQysrLCB0aGlzIGNvbXByaXNlcyBhbiBlbnRpcmVseSBzZXBhcmF0ZQotICogaGVhZGVyIGFuZCBzb3VyY2UgZmlsZS4gVGhlIGhlYWRlciBmaWxlIGRlZmluZXMgdGhlIG1ldGhvZHMgYW5kIGluY2x1ZGVzCi0gKiB0aGUgZGF0YSB0eXBlcyBkZWZpbmVkIGluIHRoZSBtYWluIGhlYWRlciBmaWxlLCBhbmQgdGhlIGltcGxlbWVudGF0aW9uCi0gKiBmaWxlIGNvbnRhaW5zIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgYmFzaWMgcHJpbnRlciBhbmQgZGVmYXVsdCBpbnRlcmZhY2VzLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIHN2Y25hbWUgPSB0c2VydmljZS0+Z2V0X25hbWUoKTsKLQotICAvLyBNYWtlIG91dHB1dCBmaWxlcwotICBzdHJpbmcgZl9oZWFkZXJfbmFtZSA9IGdldF9vdXRfZGlyKCkrc3ZjbmFtZSsiLmgiOwotICBmX2hlYWRlcl8ub3BlbihmX2hlYWRlcl9uYW1lLmNfc3RyKCkpOwotCi0gIC8vIFByaW50IGhlYWRlciBmaWxlIGluY2x1ZGVzCi0gIGZfaGVhZGVyXyA8PAotICAgIGF1dG9nZW5fY29tbWVudCgpOwotICBmX2hlYWRlcl8gPDwKLSAgICAiI2lmbmRlZiAiIDw8IHN2Y25hbWUgPDwgIl9IIiA8PCBlbmRsIDw8Ci0gICAgIiNkZWZpbmUgIiA8PCBzdmNuYW1lIDw8ICJfSCIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0gIGlmIChnZW5fY29iX3N0eWxlXykgewotICAgIGZfaGVhZGVyXyA8PAotICAgICAgIiNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+IiA8PCBlbmRsIDw8IC8vIFRNZW1vcnlCdWZmZXIKLSAgICAgICIjaW5jbHVkZSA8dGhyaWZ0L2N4eGZ1bmN0aW9uYWwuaD4iIDw8IGVuZGwgPDwKLSAgICAgICJuYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBhc3luYyB7IiA8PCBlbmRsIDw8Ci0gICAgICAiY2xhc3MgVEFzeW5jQ2hhbm5lbDsiIDw8IGVuZGwgPDwKLSAgICAgICJ9fX0iIDw8IGVuZGw7Ci0gIH0KLSAgZl9oZWFkZXJfIDw8Ci0gICAgIiNpbmNsdWRlIDx0aHJpZnQvVERpc3BhdGNoUHJvY2Vzc29yLmg+IiA8PCBlbmRsOwotICBpZiAoZ2VuX2NvYl9zdHlsZV8pIHsKLSAgICBmX2hlYWRlcl8gPDwKLSAgICAgICIjaW5jbHVkZSA8dGhyaWZ0L2FzeW5jL1RBc3luY0Rpc3BhdGNoUHJvY2Vzc29yLmg+IiA8PCBlbmRsOwotICB9Ci0gIGZfaGVhZGVyXyA8PAotICAgICIjaW5jbHVkZSBcIiIgPDwgZ2V0X2luY2x1ZGVfcHJlZml4KCpnZXRfcHJvZ3JhbSgpKSA8PCBwcm9ncmFtX25hbWVfIDw8Ci0gICAgIl90eXBlcy5oXCIiIDw8IGVuZGw7Ci0KLSAgdF9zZXJ2aWNlKiBleHRlbmRzX3NlcnZpY2UgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKLSAgaWYgKGV4dGVuZHNfc2VydmljZSAhPSBOVUxMKSB7Ci0gICAgZl9oZWFkZXJfIDw8Ci0gICAgICAiI2luY2x1ZGUgXCIiIDw8IGdldF9pbmNsdWRlX3ByZWZpeCgqKGV4dGVuZHNfc2VydmljZS0+Z2V0X3Byb2dyYW0oKSkpIDw8Ci0gICAgICBleHRlbmRzX3NlcnZpY2UtPmdldF9uYW1lKCkgPDwgIi5oXCIiIDw8IGVuZGw7Ci0gIH0KLQotICBmX2hlYWRlcl8gPDwKLSAgICBlbmRsIDw8Ci0gICAgbnNfb3Blbl8gPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgLy8gU2VydmljZSBpbXBsZW1lbnRhdGlvbiBmaWxlIGluY2x1ZGVzCi0gIHN0cmluZyBmX3NlcnZpY2VfbmFtZSA9IGdldF9vdXRfZGlyKCkrc3ZjbmFtZSsiLmNwcCI7Ci0gIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKLSAgZl9zZXJ2aWNlXyA8PAotICAgIGF1dG9nZW5fY29tbWVudCgpOwotICBmX3NlcnZpY2VfIDw8Ci0gICAgIiNpbmNsdWRlIFwiIiA8PCBnZXRfaW5jbHVkZV9wcmVmaXgoKmdldF9wcm9ncmFtKCkpIDw8IHN2Y25hbWUgPDwgIi5oXCIiIDw8IGVuZGw7Ci0gIGlmIChnZW5fY29iX3N0eWxlXykgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgICIjaW5jbHVkZSBcInRocmlmdC9hc3luYy9UQXN5bmNDaGFubmVsLmhcIiIgPDwgZW5kbDsKLSAgfQotICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAiI2luY2x1ZGUgXCIiIDw8IGdldF9pbmNsdWRlX3ByZWZpeCgqZ2V0X3Byb2dyYW0oKSkgPDwgc3ZjbmFtZSA8PAotICAgICAgIi50Y2NcIiIgPDwgZW5kbDsKLQotICAgIHN0cmluZyBmX3NlcnZpY2VfdGNjX25hbWUgPSBnZXRfb3V0X2RpcigpK3N2Y25hbWUrIi50Y2MiOwotICAgIGZfc2VydmljZV90Y2NfLm9wZW4oZl9zZXJ2aWNlX3RjY19uYW1lLmNfc3RyKCkpOwotICAgIGZfc2VydmljZV90Y2NfIDw8Ci0gICAgICBhdXRvZ2VuX2NvbW1lbnQoKTsKLSAgICBmX3NlcnZpY2VfdGNjXyA8PAotICAgICAgIiNpbmNsdWRlIFwiIiA8PCBnZXRfaW5jbHVkZV9wcmVmaXgoKmdldF9wcm9ncmFtKCkpIDw8IHN2Y25hbWUgPDwKLSAgICAgICIuaFwiIiA8PCBlbmRsOwotCi0gICAgZl9zZXJ2aWNlX3RjY18gPDwKLSAgICAgICIjaWZuZGVmICIgPDwgc3ZjbmFtZSA8PCAiX1RDQyIgPDwgZW5kbCA8PAotICAgICAgIiNkZWZpbmUgIiA8PCBzdmNuYW1lIDw8ICJfVENDIiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsOwotCi0gICAgaWYgKGdlbl9jb2Jfc3R5bGVfKSB7Ci0gICAgICBmX3NlcnZpY2VfdGNjXyA8PAotICAgICAgICAiI2luY2x1ZGUgXCJ0aHJpZnQvYXN5bmMvVEFzeW5jQ2hhbm5lbC5oXCIiIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGVuZGwgPDwgbnNfb3Blbl8gPDwgZW5kbCA8PCBlbmRsOwotICBmX3NlcnZpY2VfdGNjXyA8PAotICAgIGVuZGwgPDwgbnNfb3Blbl8gPDwgZW5kbCA8PCBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIGFsbCB0aGUgY29tcG9uZW50cwotICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSwgIiIpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZV9mYWN0b3J5KHRzZXJ2aWNlLCAiIik7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfbnVsbCh0c2VydmljZSwgIiIpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0c2VydmljZSwgIiIpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3Nvcih0c2VydmljZSwgIiIpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX211bHRpZmFjZSh0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2Vfc2tlbGV0b24odHNlcnZpY2UpOwotCi0gIC8vIEdlbmVyYXRlIGFsbCB0aGUgY29iIGNvbXBvbmVudHMKLSAgaWYgKGdlbl9jb2Jfc3R5bGVfKSB7Ci0gICAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UsICJDb2JDbCIpOwotICAgIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlLCAiQ29iU3YiKTsKLSAgICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZV9mYWN0b3J5KHRzZXJ2aWNlLCAiQ29iU3YiKTsKLSAgICBnZW5lcmF0ZV9zZXJ2aWNlX251bGwodHNlcnZpY2UsICJDb2JTdiIpOwotICAgIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlLCAiQ29iIik7Ci0gICAgZ2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3IodHNlcnZpY2UsICJDb2IiKTsKLSAgICBnZW5lcmF0ZV9zZXJ2aWNlX2FzeW5jX3NrZWxldG9uKHRzZXJ2aWNlKTsKLSAgfQotCi0gIC8vIENsb3NlIHRoZSBuYW1lc3BhY2UKLSAgZl9zZXJ2aWNlXyA8PAotICAgIG5zX2Nsb3NlXyA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLSAgZl9zZXJ2aWNlX3RjY18gPDwKLSAgICBuc19jbG9zZV8gPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0gIGZfaGVhZGVyXyA8PAotICAgIG5zX2Nsb3NlXyA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICAvLyBUT0RPKHNpbXBraW5zKTogTWFrZSB0aGlzIGEgc2VwYXJhdGUgb3B0aW9uCi0gIGlmIChnZW5fdGVtcGxhdGVzXykgewotICAgIGZfaGVhZGVyXyA8PAotICAgICAgIiNpbmNsdWRlIFwiIiA8PCBnZXRfaW5jbHVkZV9wcmVmaXgoKmdldF9wcm9ncmFtKCkpIDw8IHN2Y25hbWUgPDwKLSAgICAgICIudGNjXCIiIDw8IGVuZGwgPDwKLSAgICAgICIjaW5jbHVkZSBcIiIgPDwgZ2V0X2luY2x1ZGVfcHJlZml4KCpnZXRfcHJvZ3JhbSgpKSA8PCBwcm9ncmFtX25hbWVfIDw8Ci0gICAgICAiX3R5cGVzLnRjY1wiIiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsOwotICB9Ci0KLSAgZl9oZWFkZXJfIDw8Ci0gICAgIiNlbmRpZiIgPDwgZW5kbDsKLSAgZl9zZXJ2aWNlX3RjY18gPDwKLSAgICAiI2VuZGlmIiA8PCBlbmRsOwotCi0gIC8vIENsb3NlIHRoZSBmaWxlcwotICBmX3NlcnZpY2VfdGNjXy5jbG9zZSgpOwotICBmX3NlcnZpY2VfLmNsb3NlKCk7Ci0gIGZfaGVhZGVyXy5jbG9zZSgpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBoZWxwZXIgZnVuY3Rpb25zIGZvciBhIHNlcnZpY2UuIEJhc2ljYWxseSwgdGhpcyBnZW5lcmF0ZXMgdHlwZXMKLSAqIGZvciBhbGwgdGhlIGFyZ3VtZW50cyBhbmQgcmVzdWx0cyB0byBmdW5jdGlvbnMuCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCi0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSkgewotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgc3RkOjpvZnN0cmVhbSYgb3V0ID0gKGdlbl90ZW1wbGF0ZXNfID8gZl9zZXJ2aWNlX3RjY18gOiBmX3NlcnZpY2VfKTsKLQotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLSAgICBzdHJpbmcgbmFtZV9vcmlnID0gdHMtPmdldF9uYW1lKCk7Ci0KLSAgICAvLyBUT0RPKGRyZWlzcyk6IFdoeSBpcyB0aGlzIHN0dWZmIG5vdCBpbiBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzPwotICAgIHRzLT5zZXRfbmFtZSh0c2VydmljZS0+Z2V0X25hbWUoKSArICJfIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfYXJncyIpOwotICAgIGdlbmVyYXRlX3N0cnVjdF9kZWNsYXJhdGlvbihmX2hlYWRlcl8sIHRzLCBmYWxzZSk7Ci0gICAgZ2VuZXJhdGVfc3RydWN0X2RlZmluaXRpb24ob3V0LCBmX3NlcnZpY2VfLCB0cywgZmFsc2UpOwotICAgIGdlbmVyYXRlX3N0cnVjdF9yZWFkZXIob3V0LCB0cyk7Ci0gICAgZ2VuZXJhdGVfc3RydWN0X3dyaXRlcihvdXQsIHRzKTsKLSAgICB0cy0+c2V0X25hbWUodHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiXyIgKyAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3BhcmdzIik7Ci0gICAgZ2VuZXJhdGVfc3RydWN0X2RlY2xhcmF0aW9uKGZfaGVhZGVyXywgdHMsIGZhbHNlLCB0cnVlLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgZ2VuZXJhdGVfc3RydWN0X2RlZmluaXRpb24ob3V0LCBmX3NlcnZpY2VfLCB0cywgZmFsc2UpOwotICAgIGdlbmVyYXRlX3N0cnVjdF93cml0ZXIob3V0LCB0cywgdHJ1ZSk7Ci0gICAgdHMtPnNldF9uYW1lKG5hbWVfb3JpZyk7Ci0KLSAgICBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRzZXJ2aWNlLCAqZl9pdGVyKTsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgaW50ZXJmYWNlIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCi0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlLCBzdHJpbmcgc3R5bGUpIHsKLQotICBzdHJpbmcgc2VydmljZV9pZl9uYW1lID0gc2VydmljZV9uYW1lXyArIHN0eWxlICsgIklmIjsKLSAgaWYgKHN0eWxlID09ICJDb2JDbCIpIHsKLSAgICAvLyBGb3J3YXJkIGRlY2xhcmUgdGhlIGNsaWVudC4KLSAgICBzdHJpbmcgY2xpZW50X25hbWUgPSBzZXJ2aWNlX25hbWVfICsgIkNvYkNsaWVudCI7Ci0gICAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7Ci0gICAgICBjbGllbnRfbmFtZSArPSAiVCI7Ci0gICAgICBzZXJ2aWNlX2lmX25hbWUgKz0gIlQiOwotICAgICAgaW5kZW50KGZfaGVhZGVyXykgPDwKLSAgICAgICAgInRlbXBsYXRlIDxjbGFzcyBQcm90b2NvbF8+IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnQoZl9oZWFkZXJfKSA8PCAiY2xhc3MgIiA8PCBjbGllbnRfbmFtZSA8PCAiOyIgPDwKLSAgICAgIGVuZGwgPDwgZW5kbDsKLSAgfQotCi0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9ICIgOiB2aXJ0dWFsIHB1YmxpYyAiICsgdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKSArCi0gICAgICBzdHlsZSArICJJZiI7Ci0gICAgaWYgKHN0eWxlID09ICJDb2JDbCIgJiYgZ2VuX3RlbXBsYXRlc18pIHsKLSAgICAgIC8vIFRPRE8oc2ltcGtpbnMpOiBJZiBnZW5fdGVtcGxhdGVzXyBpcyBlbmFibGVkLCB3ZSBjdXJyZW50bHkgYXNzdW1lIGFsbAotICAgICAgLy8gcGFyZW50IHNlcnZpY2VzIHdlcmUgYWxzbyBnZW5lcmF0ZWQgd2l0aCB0ZW1wbGF0ZXMgZW5hYmxlZC4KLSAgICAgIGV4dGVuZHMgKz0gIlQ8UHJvdG9jb2xfPiI7Ci0gICAgfQotICB9Ci0KLSAgaWYgKHN0eWxlID09ICJDb2JDbCIgJiYgZ2VuX3RlbXBsYXRlc18pIHsKLSAgICBmX2hlYWRlcl8gPDwgInRlbXBsYXRlIDxjbGFzcyBQcm90b2NvbF8+IiA8PCBlbmRsOwotICB9Ci0gIGZfaGVhZGVyXyA8PAotICAgICJjbGFzcyAiIDw8IHNlcnZpY2VfaWZfbmFtZSA8PCBleHRlbmRzIDw8ICIgeyIgPDwgZW5kbCA8PAotICAgICIgcHVibGljOiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZfaGVhZGVyXyA8PAotICAgIGluZGVudCgpIDw8ICJ2aXJ0dWFsIH4iIDw8IHNlcnZpY2VfaWZfbmFtZSA8PCAiKCkge30iIDw8IGVuZGw7Ci0KLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKCgqZl9pdGVyKS0+aGFzX2RvYygpKSBmX2hlYWRlcl8gPDwgZW5kbDsKLSAgICBnZW5lcmF0ZV9qYXZhX2RvYyhmX2hlYWRlcl8sICpmX2l0ZXIpOwotICAgIGZfaGVhZGVyXyA8PAotICAgICAgaW5kZW50KCkgPDwgInZpcnR1YWwgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlciwgc3R5bGUpIDw8ICIgPSAwOyIgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfZG93bigpOwotICBmX2hlYWRlcl8gPDwKLSAgICAifTsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpZiAoc3R5bGUgPT0gIkNvYkNsIiAmJiBnZW5fdGVtcGxhdGVzXykgewotICAgIC8vIGdlbmVyYXRlIGEgYmFja3dhcmRzLWNvbXBhdGlibGUgdHlwZWRlZiBmb3IgY2xpZW50cyB0aGF0IGRvIG5vdAotICAgIC8vIGtub3cgYWJvdXQgdGhlIG5ldyB0ZW1wbGF0ZS1zdHlsZSBjb2RlCi0gICAgZl9oZWFkZXJfIDw8Ci0gICAgICAidHlwZWRlZiAiIDw8IHNlcnZpY2VfaWZfbmFtZSA8PAotICAgICAgIjwgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gIiA8PAotICAgICAgc2VydmljZV9uYW1lXyA8PCBzdHlsZSA8PCAiSWY7IiA8PAotICAgICAgZW5kbCA8PCBlbmRsOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBpbnRlcmZhY2UgZmFjdG9yeS4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYW4gaW50ZXJmYWNlIGZhY3RvcnkgZm9yLgotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2VfZmFjdG9yeSh0X3NlcnZpY2UqIHRzZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHN0eWxlKSB7Ci0gIHN0cmluZyBzZXJ2aWNlX2lmX25hbWUgPSBzZXJ2aWNlX25hbWVfICsgc3R5bGUgKyAiSWYiOwotCi0gIC8vIEZpZ3VyZSBvdXQgdGhlIG5hbWUgb2YgdGhlIHVwcGVyLW1vc3QgcGFyZW50IGNsYXNzLgotICAvLyBHZXR0aW5nIGV2ZXJ5dGhpbmcgdG8gd29yayBvdXQgcHJvcGVybHkgd2l0aCBpbmhlcml0YW5jZSBpcyBhbm5veWluZy4KLSAgLy8gSGVyZSdzIHdoYXQgd2UncmUgZG9pbmcgZm9yIG5vdzoKLSAgLy8KLSAgLy8gLSBBbGwgaGFuZGxlcnMgaW1wbGVtZW50IGdldEhhbmRsZXIoKSwgYnV0IHN1YmNsYXNzZXMgdXNlIGNvdmFyaWFudCByZXR1cm4KLSAgLy8gICB0eXBlcyB0byByZXR1cm4gdGhlaXIgc3BlY2lmaWMgc2VydmljZSBpbnRlcmZhY2UgY2xhc3MgdHlwZS4gIFdlIGhhdmUgdG8KLSAgLy8gICB1c2UgcmF3IHBvaW50ZXJzIGJlY2F1c2Ugb2YgdGhpczsgc2hhcmVkX3B0cjw+IGNhbid0IGJlIHVzZWQgZm9yCi0gIC8vICAgY292YXJpYW50IHJldHVybiB0eXBlcy4KLSAgLy8KLSAgLy8gLSBTaW5jZSB3ZSdyZSBub3QgdXNpbmcgc2hhcmVkX3B0cjw+LCB3ZSBhbHNvIHByb3ZpZGUgYSByZWxlYXNlSGFuZGxlcigpCi0gIC8vICAgZnVuY3Rpb24gdGhhdCBtdXN0IGJlIGNhbGxlZCB0byByZWxlYXNlIGEgcG9pbnRlciB0byBhIGhhbmRsZXIgb2J0YWluZWQKLSAgLy8gICB2aWEgZ2V0SGFuZGxlcigpLgotICAvLwotICAvLyAgIHJlbGVhc2VIYW5kbGVyKCkgYWx3YXlzIGFjY2VwdHMgYSBwb2ludGVyIHRvIHRoZSB1cHBlci1tb3N0IHBhcmVudCBjbGFzcwotICAvLyAgIHR5cGUuICBUaGlzIGlzIG5lY2Vzc2FyeSBzaW5jZSB0aGUgcGFyZW50IHZlcnNpb25zIG9mIHJlbGVhc2VIYW5kbGVyKCkKLSAgLy8gICBtYXkgYWNjZXB0IGFueSBvZiB0aGUgcGFyZW50IHR5cGVzLCBub3QganVzdCB0aGUgbW9zdCBzcGVjaWZpYyBzdWJjbGFzcwotICAvLyAgIHR5cGUuICBJbXBsZW1lbnRhdGlvbnMgY2FuIHVzZSBkeW5hbWljX2Nhc3QgdG8gY2FzdCB0aGUgcG9pbnRlciB0byB0aGUKLSAgLy8gICBzdWJjbGFzcyB0eXBlIGlmIGRlc2lyZWQuCi0gIHRfc2VydmljZSogYmFzZV9zZXJ2aWNlID0gdHNlcnZpY2U7Ci0gIHdoaWxlIChiYXNlX3NlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGJhc2Vfc2VydmljZSA9IGJhc2Vfc2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKLSAgfQotICBzdHJpbmcgYmFzZV9pZl9uYW1lID0gdHlwZV9uYW1lKGJhc2Vfc2VydmljZSkgKyBzdHlsZSArICJJZiI7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGFic3RyYWN0IGZhY3RvcnkgY2xhc3MKLSAgc3RyaW5nIGZhY3RvcnlfbmFtZSA9IHNlcnZpY2VfaWZfbmFtZSArICJGYWN0b3J5IjsKLSAgc3RyaW5nIGV4dGVuZHM7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9ICIgOiB2aXJ0dWFsIHB1YmxpYyAiICsgdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKSArCi0gICAgICBzdHlsZSArICJJZkZhY3RvcnkiOwotICB9Ci0KLSAgZl9oZWFkZXJfIDw8Ci0gICAgImNsYXNzICIgPDwgZmFjdG9yeV9uYW1lIDw8IGV4dGVuZHMgPDwgIiB7IiA8PCBlbmRsIDw8Ci0gICAgIiBwdWJsaWM6IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZl9oZWFkZXJfIDw8Ci0gICAgaW5kZW50KCkgPDwgInR5cGVkZWYgIiA8PCBzZXJ2aWNlX2lmX25hbWUgPDwgIiBIYW5kbGVyOyIgPDwgZW5kbCA8PAotICAgIGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAidmlydHVhbCB+IiA8PCBmYWN0b3J5X25hbWUgPDwgIigpIHt9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ2aXJ0dWFsICIgPDwgc2VydmljZV9pZl9uYW1lIDw8ICIqIGdldEhhbmRsZXIoIiA8PAotICAgICAgImNvbnN0IDo6YXBhY2hlOjp0aHJpZnQ6OlRDb25uZWN0aW9uSW5mbyYgY29ubkluZm8pID0gMDsiIDw8Ci0gICAgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ2aXJ0dWFsIHZvaWQgcmVsZWFzZUhhbmRsZXIoIiA8PCBiYXNlX2lmX25hbWUgPDwKLSAgICAiKiAvKiBoYW5kbGVyICovKSA9IDA7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGZfaGVhZGVyXyA8PAotICAgICJ9OyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBzaW5nbGV0b24gZmFjdG9yeSBjbGFzcwotICBzdHJpbmcgc2luZ2xldG9uX2ZhY3RvcnlfbmFtZSA9IHNlcnZpY2VfaWZfbmFtZSArICJTaW5nbGV0b25GYWN0b3J5IjsKLSAgZl9oZWFkZXJfIDw8Ci0gICAgImNsYXNzICIgPDwgc2luZ2xldG9uX2ZhY3RvcnlfbmFtZSA8PAotICAgICIgOiB2aXJ0dWFsIHB1YmxpYyAiIDw8IGZhY3RvcnlfbmFtZSA8PCAiIHsiIDw8IGVuZGwgPDwKLSAgICAiIHB1YmxpYzoiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBmX2hlYWRlcl8gPDwKLSAgICBpbmRlbnQoKSA8PCBzaW5nbGV0b25fZmFjdG9yeV9uYW1lIDw8ICIoY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8IiA8PAotICAgIHNlcnZpY2VfaWZfbmFtZSA8PCAiPiYgaWZhY2UpIDogaWZhY2VfKGlmYWNlKSB7fSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ2aXJ0dWFsIH4iIDw8IHNpbmdsZXRvbl9mYWN0b3J5X25hbWUgPDwgIigpIHt9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ2aXJ0dWFsICIgPDwgc2VydmljZV9pZl9uYW1lIDw8ICIqIGdldEhhbmRsZXIoIiA8PAotICAgICAgImNvbnN0IDo6YXBhY2hlOjp0aHJpZnQ6OlRDb25uZWN0aW9uSW5mbyYpIHsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gaWZhY2VfLmdldCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInZpcnR1YWwgdm9pZCByZWxlYXNlSGFuZGxlcigiIDw8IGJhc2VfaWZfbmFtZSA8PAotICAgICIqIC8qIGhhbmRsZXIgKi8pIHt9IiA8PCBlbmRsOwotCi0gIGZfaGVhZGVyXyA8PAotICAgIGVuZGwgPDwKLSAgICAiIHByb3RlY3RlZDoiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiYm9vc3Q6OnNoYXJlZF9wdHI8IiA8PCBzZXJ2aWNlX2lmX25hbWUgPDwgIj4gaWZhY2VfOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBmX2hlYWRlcl8gPDwKLSAgICAifTsiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBudWxsIGltcGxlbWVudGF0aW9uIG9mIHRoZSBzZXJ2aWNlLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9udWxsKHRfc2VydmljZSogdHNlcnZpY2UsIHN0cmluZyBzdHlsZSkgewotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGV4dGVuZHMgPSAiICwgdmlydHVhbCBwdWJsaWMgIiArIHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSkgKyBzdHlsZSArICJOdWxsIjsKLSAgfQotICBmX2hlYWRlcl8gPDwKLSAgICAiY2xhc3MgIiA8PCBzZXJ2aWNlX25hbWVfIDw8IHN0eWxlIDw8ICJOdWxsIDogdmlydHVhbCBwdWJsaWMgIiA8PCBzZXJ2aWNlX25hbWVfIDw8IHN0eWxlIDw8ICJJZiIgPDwgZXh0ZW5kcyA8PCAiIHsiIDw8IGVuZGwgPDwKLSAgICAiIHB1YmxpYzoiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBmX2hlYWRlcl8gPDwKLSAgICBpbmRlbnQoKSA8PCAidmlydHVhbCB+IiA8PCBzZXJ2aWNlX25hbWVfIDw8IHN0eWxlIDw8ICJOdWxsKCkge30iIDw8IGVuZGw7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGZfaGVhZGVyXyA8PAotICAgICAgaW5kZW50KCkgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIsIHN0eWxlLCAiIiwgZmFsc2UpIDw8ICIgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIHRfdHlwZSogcmV0dXJudHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKTsKLSAgICB0X2ZpZWxkIHJldHVybmZpZWxkKHJldHVybnR5cGUsICJfcmV0dXJuIik7Ci0KLSAgICBpZiAoc3R5bGUgPT0gIiIpIHsKLSAgICAgIGlmIChyZXR1cm50eXBlLT5pc192b2lkKCkgfHwgaXNfY29tcGxleF90eXBlKHJldHVybnR5cGUpKSB7Ci0gICAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfaGVhZGVyXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8IGRlY2xhcmVfZmllbGQoJnJldHVybmZpZWxkLCB0cnVlKSA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgInJldHVybiBfcmV0dXJuOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHN0eWxlID09ICJDb2JTdiIpIHsKLSAgICAgIGlmIChyZXR1cm50eXBlLT5pc192b2lkKCkpIHsKLSAgICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gY29iKCk7IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICB0X2ZpZWxkIHJldHVybmZpZWxkKHJldHVybnR5cGUsICJfcmV0dXJuIik7Ci0gICAgICBmX2hlYWRlcl8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgZGVjbGFyZV9maWVsZCgmcmV0dXJuZmllbGQsIHRydWUpIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInJldHVybiBjb2IoX3JldHVybik7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIH0gZWxzZSB7Ci0gICAgICB0aHJvdyAiVU5LTk9XTiBTVFlMRSI7Ci0gICAgfQotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBmX2hlYWRlcl8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGZfaGVhZGVyXyA8PAotICAgICJ9OyIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZnVuY3Rpb25fY2FsbChvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RyaW5nIHRhcmdldCwgc3RyaW5nIGlmYWNlLCBzdHJpbmcgYXJnX3ByZWZpeCkgewotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgdF90eXBlKiByZXRfdHlwZSA9IGdldF90cnVlX3R5cGUodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKTsKLSAgb3V0IDw8IGluZGVudCgpOwotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXJldF90eXBlLT5pc192b2lkKCkpIHsKLSAgICBpZiAoaXNfY29tcGxleF90eXBlKHJldF90eXBlKSkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIG91dCA8PCBpZmFjZSA8PCAiLT4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCIgPDwgdGFyZ2V0OwotICAgIH0gZWxzZSB7Ci0gICAgICBvdXQgPDwgdGFyZ2V0IDw8ICIgPSAiIDw8IGlmYWNlIDw8ICItPiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIjsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgb3V0IDw8IGlmYWNlIDw8ICItPiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIjsKLSAgfQotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgb3V0IDw8ICIsICI7Ci0gICAgfQotICAgIG91dCA8PCBhcmdfcHJlZml4IDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgfQotICBvdXQgPDwgIik7IiA8PCBlbmRsOwotfQotCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9hc3luY19za2VsZXRvbih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBzdmNuYW1lID0gdHNlcnZpY2UtPmdldF9uYW1lKCk7Ci0KLSAgLy8gU2VydmljZSBpbXBsZW1lbnRhdGlvbiBmaWxlIGluY2x1ZGVzCi0gIHN0cmluZyBmX3NrZWxldG9uX25hbWUgPSBnZXRfb3V0X2RpcigpK3N2Y25hbWUrIl9hc3luY19zZXJ2ZXIuc2tlbGV0b24uY3BwIjsKLQotICBzdHJpbmcgbnMgPSBuYW1lc3BhY2VfcHJlZml4KHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZXNwYWNlKCJjcHAiKSk7Ci0KLSAgb2ZzdHJlYW0gZl9za2VsZXRvbjsKLSAgZl9za2VsZXRvbi5vcGVuKGZfc2tlbGV0b25fbmFtZS5jX3N0cigpKTsKLSAgZl9za2VsZXRvbiA8PAotICAgICIvLyBUaGlzIGF1dG9nZW5lcmF0ZWQgc2tlbGV0b24gZmlsZSBpbGx1c3RyYXRlcyBvbmUgd2F5IHRvIGFkYXB0IGEgc3luY2hyb25vdXMiIDw8IGVuZGwgPDwKLSAgICAiLy8gaW50ZXJmYWNlIGludG8gYW4gYXN5bmNocm9ub3VzIGludGVyZmFjZS4gWW91IHNob3VsZCBjb3B5IGl0IHRvIGFub3RoZXIiIDw8IGVuZGwgPDwKLSAgICAiLy8gZmlsZW5hbWUgdG8gYXZvaWQgb3ZlcndyaXRpbmcgaXQgYW5kIHJld3JpdGUgYXMgYXN5bmNocm9ub3VzIGFueSBmdW5jdGlvbnMiIDw8IGVuZGwgPDwKLSAgICAiLy8gdGhhdCB3b3VsZCBvdGhlcndpc2UgaW50cm9kdWNlIHVud2FudGVkIGxhdGVuY3kuIiA8PCBlbmRsIDw8Ci0gICAgZW5kbCA8PAotICAgICIjaW5jbHVkZSBcIiIgPDwgZ2V0X2luY2x1ZGVfcHJlZml4KCpnZXRfcHJvZ3JhbSgpKSA8PCBzdmNuYW1lIDw8ICIuaFwiIiA8PCBlbmRsIDw8Ci0gICAgIiNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+IiA8PCBlbmRsIDw8Ci0gICAgZW5kbCA8PAotICAgICJ1c2luZyBuYW1lc3BhY2UgOjphcGFjaGU6OnRocmlmdDsiIDw8IGVuZGwgPDwKLSAgICAidXNpbmcgbmFtZXNwYWNlIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOyIgPDwgZW5kbCA8PAotICAgICJ1c2luZyBuYW1lc3BhY2UgOjphcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OyIgPDwgZW5kbCA8PAotICAgICJ1c2luZyBuYW1lc3BhY2UgOjphcGFjaGU6OnRocmlmdDo6YXN5bmM7IiA8PCBlbmRsIDw8Ci0gICAgZW5kbCA8PAotICAgICJ1c2luZyBib29zdDo6c2hhcmVkX3B0cjsiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIC8vIHRoZSBmb2xsb3dpbmcgY29kZSB3b3VsZCBub3QgY29tcGlsZToKLSAgLy8gdXNpbmcgbmFtZXNwYWNlIDsKLSAgLy8gdXNpbmcgbmFtZXNwYWNlIDo6OwotICBpZiAoICghbnMuZW1wdHkoKSkgJiYgKG5zLmNvbXBhcmUoIiA6OiIpICE9IDApKSB7Ci0gICAgZl9za2VsZXRvbiA8PAotICAgICAgInVzaW5nIG5hbWVzcGFjZSAiIDw8IHN0cmluZyhucywgMCwgbnMuc2l6ZSgpLTIpIDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsOwotICB9Ci0KLSAgZl9za2VsZXRvbiA8PAotICAgICJjbGFzcyAiIDw8IHN2Y25hbWUgPDwgIkFzeW5jSGFuZGxlciA6ICIgPDwKLSAgICAicHVibGljICIgPDwgc3ZjbmFtZSA8PCAiQ29iU3ZJZiB7IiA8PCBlbmRsIDw8Ci0gICAgIiBwdWJsaWM6IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZl9za2VsZXRvbiA8PAotICAgIGluZGVudCgpIDw8IHN2Y25hbWUgPDwgIkFzeW5jSGFuZGxlcigpIHsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBzeW5jSGFuZGxlcl8gPSBzdGQ6OmF1dG9fcHRyPCIgPDwgc3ZjbmFtZSA8PAotICAgICAgICAgICAgICAgICJIYW5kbGVyPihuZXcgIiA8PCBzdmNuYW1lIDw8ICJIYW5kbGVyKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICAvLyBZb3VyIGluaXRpYWxpemF0aW9uIGdvZXMgaGVyZSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICBmX3NrZWxldG9uIDw8Ci0gICAgaW5kZW50KCkgPDwgInZpcnR1YWwgfiIgPDwgc2VydmljZV9uYW1lXyA8PCAiQXN5bmNIYW5kbGVyKCk7IiA8PCBlbmRsOwotCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGZfc2tlbGV0b24gPDwKLSAgICAgIGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCAiQ29iU3YiLCAiIiwgdHJ1ZSkgPDwgIiB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotCi0gICAgdF90eXBlKiByZXR1cm50eXBlID0gKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpOwotICAgIHRfZmllbGQgcmV0dXJuZmllbGQocmV0dXJudHlwZSwgIl9yZXR1cm4iKTsKLQotICAgIHN0cmluZyB0YXJnZXQgPSByZXR1cm50eXBlLT5pc192b2lkKCkgPyAiIiA6ICJfcmV0dXJuIjsKLSAgICBpZiAoIXJldHVybnR5cGUtPmlzX3ZvaWQoKSkgewotICAgICAgZl9za2VsZXRvbiA8PAotICAgICAgICBpbmRlbnQoKSA8PCBkZWNsYXJlX2ZpZWxkKCZyZXR1cm5maWVsZCwgdHJ1ZSkgPDwgZW5kbDsKLSAgICB9Ci0gICAgZ2VuZXJhdGVfZnVuY3Rpb25fY2FsbChmX3NrZWxldG9uLCAqZl9pdGVyLCB0YXJnZXQsICJzeW5jSGFuZGxlcl8iLCAiIik7Ci0gICAgZl9za2VsZXRvbiA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGNvYigiIDw8IHRhcmdldCA8PCAiKTsiIDw8IGVuZGw7Ci0KLSAgICBzY29wZV9kb3duKGZfc2tlbGV0b24pOwotICB9Ci0gIGZfc2tlbGV0b24gPDwgZW5kbCA8PAotICAgICIgcHJvdGVjdGVkOiIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJzdGQ6OmF1dG9fcHRyPCIgPDwgc3ZjbmFtZSA8PCAiSGFuZGxlcj4gc3luY0hhbmRsZXJfOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9za2VsZXRvbiA8PAotICAgICJ9OyIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIG11bHRpZmFjZSwgd2hpY2ggaXMgYSBzaW5nbGUgc2VydmVyIHRoYXQganVzdCB0YWtlcyBhIHNldAotICogb2Ygb2JqZWN0cyBpbXBsZW1lbnRpbmcgdGhlIGludGVyZmFjZSBhbmQgY2FsbHMgdGhlbSBhbGwsIHJldHVybmluZyB0aGUKLSAqIHZhbHVlIG9mIHRoZSBsYXN0IG9uZSB0byBiZSBjYWxsZWQuCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgbXVsdGlzZXJ2ZXIgZm9yLgotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9tdWx0aWZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICAvLyBHZW5lcmF0ZSB0aGUgZGlzcGF0Y2ggbWV0aG9kcwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLQotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19tdWx0aWZhY2UgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBleHRlbmRzX211bHRpZmFjZSA9ICIsIHB1YmxpYyAiICsgZXh0ZW5kcyArICJNdWx0aWZhY2UiOwotICB9Ci0KLSAgc3RyaW5nIGxpc3RfdHlwZSA9IHN0cmluZygic3RkOjp2ZWN0b3I8Ym9vc3Q6OnNoYXJlZF9wdHI8IikgKyBzZXJ2aWNlX25hbWVfICsgIklmPiA+IjsKLQotICAvLyBHZW5lcmF0ZSB0aGUgaGVhZGVyIHBvcnRpb24KLSAgZl9oZWFkZXJfIDw8Ci0gICAgImNsYXNzICIgPDwgc2VydmljZV9uYW1lXyA8PCAiTXVsdGlmYWNlIDogIiA8PAotICAgICJ2aXJ0dWFsIHB1YmxpYyAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmIiA8PAotICAgIGV4dGVuZHNfbXVsdGlmYWNlIDw8ICIgeyIgPDwgZW5kbCA8PAotICAgICIgcHVibGljOiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZfaGVhZGVyXyA8PAotICAgIGluZGVudCgpIDw8IHNlcnZpY2VfbmFtZV8gPDwgIk11bHRpZmFjZSgiIDw8IGxpc3RfdHlwZSA8PCAiJiBpZmFjZXMpIDogaWZhY2VzXyhpZmFjZXMpIHsiIDw8IGVuZGw7Ci0gIGlmICghZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgZl9oZWFkZXJfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICBzdGQ6OnZlY3Rvcjxib29zdDo6c2hhcmVkX3B0cjwiICsgc2VydmljZV9uYW1lXyArICJJZj4gPjo6aXRlcmF0b3IgaXRlcjsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIGZvciAoaXRlciA9IGlmYWNlcy5iZWdpbigpOyBpdGVyICE9IGlmYWNlcy5lbmQoKTsgKytpdGVyKSB7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICAgICIgPDwgZXh0ZW5kcyA8PCAiTXVsdGlmYWNlOjphZGQoKml0ZXIpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgfSIgPDwgZW5kbDsKLSAgfQotICBmX2hlYWRlcl8gPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ2aXJ0dWFsIH4iIDw8IHNlcnZpY2VfbmFtZV8gPDwgIk11bHRpZmFjZSgpIHt9IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotCi0gIC8vIFByb3RlY3RlZCBkYXRhIG1lbWJlcnMKLSAgZl9oZWFkZXJfIDw8Ci0gICAgIiBwcm90ZWN0ZWQ6IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZl9oZWFkZXJfIDw8Ci0gICAgaW5kZW50KCkgPDwgbGlzdF90eXBlIDw8ICIgaWZhY2VzXzsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJNdWx0aWZhY2UoKSB7fSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ2b2lkIGFkZChib29zdDo6c2hhcmVkX3B0cjwiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmPiBpZmFjZSkgeyIgPDwgZW5kbDsKLSAgaWYgKCFleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBmX2hlYWRlcl8gPDwKLSAgICAgIGluZGVudCgpIDw8ICIgICIgPDwgZXh0ZW5kcyA8PCAiTXVsdGlmYWNlOjphZGQoaWZhY2UpOyIgPDwgZW5kbDsKLSAgfQotICBmX2hlYWRlcl8gPDwKLSAgICBpbmRlbnQoKSA8PCAiICBpZmFjZXNfLnB1c2hfYmFjayhpZmFjZSk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgZl9oZWFkZXJfIDw8Ci0gICAgaW5kZW50KCkgPDwgIiBwdWJsaWM6IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfc3RydWN0KiBhcmdsaXN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGFyZ3MgPSBhcmdsaXN0LT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGFfaXRlcjsKLQotICAgIHN0cmluZyBjYWxsID0gc3RyaW5nKCJpZmFjZXNfW2ldLT4iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICIoIjsKLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBpZiAoaXNfY29tcGxleF90eXBlKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSkpIHsKLSAgICAgIGNhbGwgKz0gIl9yZXR1cm4iOwotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9Ci0gICAgZm9yIChhX2l0ZXIgPSBhcmdzLmJlZ2luKCk7IGFfaXRlciAhPSBhcmdzLmVuZCgpOyArK2FfaXRlcikgewotICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBjYWxsICs9ICIsICI7Ci0gICAgICB9Ci0gICAgICBjYWxsICs9ICgqYV9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICB9Ci0gICAgY2FsbCArPSAiKSI7Ci0KLSAgICBmX2hlYWRlcl8gPDwKLSAgICAgIGluZGVudCgpIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCAiIikgPDwgIiB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGZfaGVhZGVyXyA8PAotICAgICAgaW5kZW50KCkgPDwgInNpemVfdCBzeiA9IGlmYWNlc18uc2l6ZSgpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgInNpemVfdCBpID0gMDsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJmb3IgKDsgaSA8IChzeiAtIDEpOyArK2kpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZl9oZWFkZXJfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCBjYWxsIDw8ICI7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgZl9oZWFkZXJfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLQotICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgIGlmIChpc19jb21wbGV4X3R5cGUoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpKSkgewotICAgICAgICBmX2hlYWRlcl8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCBjYWxsIDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX2hlYWRlcl8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAicmV0dXJuICIgPDwgY2FsbCA8PCAiOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgZl9oZWFkZXJfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8IGNhbGwgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBmX2hlYWRlcl8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsOwotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9oZWFkZXJfIDw8Ci0gICAgaW5kZW50KCkgPDwgIn07IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGNsaWVudCBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCi0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlLCBzdHJpbmcgc3R5bGUpIHsKLSAgc3RyaW5nIGlmc3R5bGU7Ci0gIGlmIChzdHlsZSA9PSAiQ29iIikgewotICAgIGlmc3R5bGUgPSAiQ29iQ2wiOwotICB9Ci0KLSAgc3RkOjpvZnN0cmVhbSYgb3V0ID0gKGdlbl90ZW1wbGF0ZXNfID8gZl9zZXJ2aWNlX3RjY18gOiBmX3NlcnZpY2VfKTsKLSAgc3RyaW5nIHRlbXBsYXRlX2hlYWRlciwgdGVtcGxhdGVfc3VmZml4LCBzaG9ydF9zdWZmaXgsIHByb3RvY29sX3R5cGUsIF90aGlzOwotICBzdHJpbmcgY29uc3QgcHJvdF9mYWN0b3J5X3R5cGUgPQotICAgICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeSI7Ci0gIGlmIChnZW5fdGVtcGxhdGVzXykgewotICAgIHRlbXBsYXRlX2hlYWRlciA9ICJ0ZW1wbGF0ZSA8Y2xhc3MgUHJvdG9jb2xfPlxuIjsKLSAgICBzaG9ydF9zdWZmaXggPSAiVCI7Ci0gICAgdGVtcGxhdGVfc3VmZml4ID0gIlQ8UHJvdG9jb2xfPiI7Ci0gICAgcHJvdG9jb2xfdHlwZSA9ICJQcm90b2NvbF8iOwotICAgIF90aGlzID0gInRoaXMtPiI7Ci0gIH0gZWxzZSB7Ci0gICAgcHJvdG9jb2xfdHlwZSA9ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sIjsKLSAgfQotICBzdHJpbmcgcHJvdF9wdHIgPSAiYm9vc3Q6OnNoYXJlZF9wdHI8ICIgKyBwcm90b2NvbF90eXBlICsgIj4iOwotICBzdHJpbmcgY2xpZW50X3N1ZmZpeCA9ICJDbGllbnQiICsgdGVtcGxhdGVfc3VmZml4OwotICBzdHJpbmcgaWZfc3VmZml4ID0gIklmIjsKLSAgaWYgKHN0eWxlID09ICJDb2IiKSB7Ci0gICAgaWZfc3VmZml4ICs9IHRlbXBsYXRlX3N1ZmZpeDsKLSAgfQotCi0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIHN0cmluZyBleHRlbmRzX2NsaWVudCA9ICIiOwotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIC8vIFRPRE8oc2ltcGtpbnMpOiBJZiBnZW5fdGVtcGxhdGVzXyBpcyBlbmFibGVkLCB3ZSBjdXJyZW50bHkgYXNzdW1lIGFsbAotICAgIC8vIHBhcmVudCBzZXJ2aWNlcyB3ZXJlIGFsc28gZ2VuZXJhdGVkIHdpdGggdGVtcGxhdGVzIGVuYWJsZWQuCi0gICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7Ci0gICAgZXh0ZW5kc19jbGllbnQgPSAiLCBwdWJsaWMgIiArIGV4dGVuZHMgKyBzdHlsZSArIGNsaWVudF9zdWZmaXg7Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSB0aGUgaGVhZGVyIHBvcnRpb24KLSAgZl9oZWFkZXJfIDw8Ci0gICAgdGVtcGxhdGVfaGVhZGVyIDw8Ci0gICAgImNsYXNzICIgPDwgc2VydmljZV9uYW1lXyA8PCBzdHlsZSA8PCAiQ2xpZW50IiA8PCBzaG9ydF9zdWZmaXggPDwgIiA6ICIgPDwKLSAgICAidmlydHVhbCBwdWJsaWMgIiA8PCBzZXJ2aWNlX25hbWVfIDw8IGlmc3R5bGUgPDwgaWZfc3VmZml4IDw8Ci0gICAgZXh0ZW5kc19jbGllbnQgPDwgIiB7IiA8PCBlbmRsIDw8Ci0gICAgIiBwdWJsaWM6IiA8PCBlbmRsOwotCi0gIGluZGVudF91cCgpOwotICBpZiAoc3R5bGUgIT0gIkNvYiIpIHsKLSAgICBmX2hlYWRlcl8gPDwKLSAgICAgIGluZGVudCgpIDw8IHNlcnZpY2VfbmFtZV8gPDwgc3R5bGUgPDwgIkNsaWVudCIgPDwgc2hvcnRfc3VmZml4IDw8Ci0gICAgICAiKCIgPDwgcHJvdF9wdHIgPDwgIiBwcm90KSAiOwotCi0gICAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgewotICAgICAgZl9oZWFkZXJfIDw8ICAieyIgPDwgZW5kbDsKLSAgICAgIGZfaGVhZGVyXyA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgc2V0UHJvdG9jb2wiIDw8IHNob3J0X3N1ZmZpeCA8PCAiKHByb3QpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgZl9oZWFkZXJfIDw8ICAiOiIgPDwgZW5kbDsKLSAgICAgIGZfaGVhZGVyXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICAiIDw8IGV4dGVuZHMgPDwgc3R5bGUgPDwgY2xpZW50X3N1ZmZpeCA8PAotICAgICAgICAiKHByb3QsIHByb3QpIHt9IiA8PCBlbmRsOwotICAgIH0KLQotICAgIGZfaGVhZGVyXyA8PAotICAgICAgaW5kZW50KCkgPDwgc2VydmljZV9uYW1lXyA8PCBzdHlsZSA8PCAiQ2xpZW50IiA8PCBzaG9ydF9zdWZmaXggPDwKLSAgICAgICIoIiA8PCBwcm90X3B0ciA8PCAiIGlwcm90LCAiIDw8IHByb3RfcHRyIDw8ICIgb3Byb3QpICI7Ci0gICAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgewotICAgICAgZl9oZWFkZXJfIDw8ICAieyIgPDwgZW5kbDsKLSAgICAgIGZfaGVhZGVyXyA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgc2V0UHJvdG9jb2wiIDw8IHNob3J0X3N1ZmZpeCA8PCAiKGlwcm90LG9wcm90KTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZfaGVhZGVyXyA8PCAiOiIgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgIiA8PCBleHRlbmRzIDw8IHN0eWxlIDw8IGNsaWVudF9zdWZmaXggPDwKLSAgICAgICAgIihpcHJvdCwgb3Byb3QpIHt9IiA8PCBlbmRsOwotICAgIH0KLQotICAgIC8vIGNyZWF0ZSB0aGUgc2V0UHJvdG9jb2wgbWV0aG9kcwotICAgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKLSAgICAgIGZfaGVhZGVyXyA8PCAiIHByaXZhdGU6Ijw8ZW5kbDsKLSAgICAgIC8vIDE6IG9uZSBwYXJhbWV0ZXIKLSAgICAgIGZfaGVhZGVyXyA8PAotICAgICAgaW5kZW50KCkgPDwgInZvaWQgc2V0UHJvdG9jb2wiIDw8IHNob3J0X3N1ZmZpeCA8PCAiKCIKLSAgICAgICAgPDwgcHJvdF9wdHIgPDwgIiBwcm90KSB7IiA8PGVuZGw7Ci0gICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgInNldFByb3RvY29sIiA8PCBzaG9ydF9zdWZmaXggPDwgIihwcm90LHByb3QpOyI8PGVuZGw7Ci0gICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgIn0iPDxlbmRsOwotICAgICAgLy8gMjogdHdvIHBhcmFtZXRlcgotICAgICAgZl9oZWFkZXJfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAidm9pZCBzZXRQcm90b2NvbCIgPDwgc2hvcnRfc3VmZml4IDw8Ci0gICAgICAiKCIgPDwgcHJvdF9wdHIgPDwgIiBpcHJvdCwgIiA8PCBwcm90X3B0ciA8PCAiIG9wcm90KSB7Ijw8ZW5kbDsKLQotICAgICAgZl9oZWFkZXJfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICBwaXByb3RfPWlwcm90OyI8PGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHBvcHJvdF89b3Byb3Q7Ijw8ZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgaXByb3RfID0gaXByb3QuZ2V0KCk7Ijw8ZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgb3Byb3RfID0gb3Byb3QuZ2V0KCk7Ijw8ZW5kbDsKLQotICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJ9Ijw8ZW5kbDsKLSAgICAgIGZfaGVhZGVyXyA8PCAiIHB1YmxpYzoiPDxlbmRsOwotICAgIH0KLQotCi0gICAgLy8gR2VuZXJhdGUgZ2V0dGVycyBmb3IgdGhlIHByb3RvY29scy4KLSAgICAvLyBOb3RlIHRoYXQgdGhlc2UgYXJlIG5vdCBjdXJyZW50bHkgdGVtcGxhdGVkIGZvciBzaW1wbGljaXR5LgotICAgIC8vIFRPRE8oc2ltcGtpbnMpOiBzaG91bGQgdGhleSBiZSB0ZW1wbGF0ZWQ/Ci0gICAgZl9oZWFkZXJfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiYm9vc3Q6OnNoYXJlZF9wdHI8IDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IGdldElucHV0UHJvdG9jb2woKSB7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBfdGhpcyA8PCAicGlwcm90XzsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotCi0gICAgZl9oZWFkZXJfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiYm9vc3Q6OnNoYXJlZF9wdHI8IDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IGdldE91dHB1dFByb3RvY29sKCkgeyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgX3RoaXMgPDwgInBvcHJvdF87IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLQotICB9IGVsc2UgLyogaWYgKHN0eWxlID09ICJDb2IiKSAqLyB7Ci0gICAgZl9oZWFkZXJfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCBzZXJ2aWNlX25hbWVfIDw8IHN0eWxlIDw8ICJDbGllbnQiIDw8IHNob3J0X3N1ZmZpeCA8PCAiKCIgPDwKLSAgICAgICJib29zdDo6c2hhcmVkX3B0cjwgOjphcGFjaGU6OnRocmlmdDo6YXN5bmM6OlRBc3luY0NoYW5uZWw+IGNoYW5uZWwsICIgPDwKLSAgICAgICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeSogcHJvdG9jb2xGYWN0b3J5KSA6IiA8PAotICAgICAgZW5kbDsKLSAgICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgICBmX2hlYWRlcl8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgY2hhbm5lbF8oY2hhbm5lbCksIiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIGl0cmFuc18obmV3IDo6YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlcigpKSwiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgb3RyYW5zXyhuZXcgOjphcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyKCkpLCIgPDwgZW5kbDsKLSAgICAgIGlmIChnZW5fdGVtcGxhdGVzXykgewotICAgICAgICAvLyBUUHJvdG9jb2xGYWN0b3J5IGNsYXNzZXMgcmV0dXJuIGdlbmVyaWMgVFByb3RvY29sIHBvaW50ZXJzLgotICAgICAgICAvLyBXZSBoYXZlIHRvIGR5bmFtaWMgY2FzdCB0byB0aGUgUHJvdG9jb2xfIHR5cGUgd2UgYXJlIGV4cGVjdGluZy4KLSAgICAgICAgZl9oZWFkZXJfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgcGlwcm90Xyhib29zdDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8UHJvdG9jb2xfPigiIDw8Ci0gICAgICAgICAgInByb3RvY29sRmFjdG9yeS0+Z2V0UHJvdG9jb2woaXRyYW5zXykpKSwiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICBwb3Byb3RfKGJvb3N0OjpkeW5hbWljX3BvaW50ZXJfY2FzdDxQcm90b2NvbF8+KCIgPDwKLSAgICAgICAgICAicHJvdG9jb2xGYWN0b3J5LT5nZXRQcm90b2NvbChvdHJhbnNfKSkpIHsiIDw8IGVuZGw7Ci0gICAgICAgIC8vIFRocm93IGEgVEV4Y2VwdGlvbiBpZiBlaXRoZXIgZHluYW1pYyBjYXN0IGZhaWxlZC4KLSAgICAgICAgZl9oZWFkZXJfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgaWYgKCFwaXByb3RfIHx8ICFwb3Byb3RfKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgICB0aHJvdyA6OmFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uKFwiIiA8PAotICAgICAgICAgICJUUHJvdG9jb2xGYWN0b3J5IHJldHVybmVkIHVuZXhwZWN0ZWQgcHJvdG9jb2wgdHlwZSBpbiAiIDw8Ci0gICAgICAgICAgc2VydmljZV9uYW1lXyA8PCBzdHlsZSA8PCAiQ2xpZW50IiA8PCBzaG9ydF9zdWZmaXggPDwKLSAgICAgICAgICAiIGNvbnN0cnVjdG9yXCIpOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX2hlYWRlcl8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICBwaXByb3RfKHByb3RvY29sRmFjdG9yeS0+Z2V0UHJvdG9jb2woaXRyYW5zXykpLCIgPDwKLSAgICAgICAgICBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgcG9wcm90Xyhwcm90b2NvbEZhY3RvcnktPmdldFByb3RvY29sKG90cmFuc18pKSB7IiA8PAotICAgICAgICAgIGVuZGw7Ci0gICAgICB9Ci0gICAgICBmX2hlYWRlcl8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgaXByb3RfID0gcGlwcm90Xy5nZXQoKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgb3Byb3RfID0gcG9wcm90Xy5nZXQoKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZfaGVhZGVyXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICAiIDw8IGV4dGVuZHMgPDwgc3R5bGUgPDwgY2xpZW50X3N1ZmZpeCA8PAotICAgICAgICAiKGNoYW5uZWwsIHByb3RvY29sRmFjdG9yeSkge30iIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgaWYgKHN0eWxlID09ICJDb2IiKSB7Ci0gICAgZl9oZWFkZXJfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiYm9vc3Q6OnNoYXJlZF9wdHI8IDo6YXBhY2hlOjp0aHJpZnQ6OmFzeW5jOjpUQXN5bmNDaGFubmVsPiBnZXRDaGFubmVsKCkgeyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgX3RoaXMgPDwgImNoYW5uZWxfOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgaWYgKCFnZW5fbm9fY2xpZW50X2NvbXBsZXRpb25fKSB7Ci0gICAgICBmX2hlYWRlcl8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInZpcnR1YWwgdm9pZCBjb21wbGV0ZWRfXyhib29sIC8qIHN1Y2Nlc3MgKi8pIHt9IiA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGluZGVudChmX2hlYWRlcl8pIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCBpZnN0eWxlKSA8PCAiOyIgPDwgZW5kbDsKLSAgICAvLyBUT0RPKGRyZWlzcyk6IFVzZSBwcml2YXRlIGluaGVyaXRhbmNlIHRvIGF2b2lkIGdlbmVyYXRpbmcgdGhpc2UgaW4gY29iLXN0eWxlLgotICAgIHRfZnVuY3Rpb24gc2VuZF9mdW5jdGlvbihnX3R5cGVfdm9pZCwKLSAgICAgICAgc3RyaW5nKCJzZW5kXyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAotICAgICAgICAoKmZfaXRlciktPmdldF9hcmdsaXN0KCkpOwotICAgIGluZGVudChmX2hlYWRlcl8pIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmc2VuZF9mdW5jdGlvbiwgIiIpIDw8ICI7IiA8PCBlbmRsOwotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgdF9zdHJ1Y3Qgbm9hcmdzKHByb2dyYW1fKTsKLSAgICAgIHRfZnVuY3Rpb24gcmVjdl9mdW5jdGlvbigoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCi0gICAgICAgICAgc3RyaW5nKCJyZWN2XyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAotICAgICAgICAgICZub2FyZ3MpOwotICAgICAgaW5kZW50KGZfaGVhZGVyXykgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZyZWN2X2Z1bmN0aW9uLCAiIikgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgewotICAgIGZfaGVhZGVyXyA8PAotICAgICAgIiBwcm90ZWN0ZWQ6IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotCi0gICAgaWYgKHN0eWxlID09ICJDb2IiKSB7Ci0gICAgICBmX2hlYWRlcl8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImJvb3N0OjpzaGFyZWRfcHRyPCA6OmFwYWNoZTo6dGhyaWZ0Ojphc3luYzo6VEFzeW5jQ2hhbm5lbD4gY2hhbm5lbF87IiAgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiYm9vc3Q6OnNoYXJlZF9wdHI8IDo6YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlcj4gaXRyYW5zXzsiICA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJib29zdDo6c2hhcmVkX3B0cjwgOjphcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyPiBvdHJhbnNfOyIgIDw8IGVuZGw7Ci0gICAgfQotICAgIGZfaGVhZGVyXyA8PAotICAgICAgaW5kZW50KCkgPDwgcHJvdF9wdHIgPDwgIiBwaXByb3RfOyIgIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8IHByb3RfcHRyIDw8ICIgcG9wcm90XzsiICA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCBwcm90b2NvbF90eXBlIDw8ICIqIGlwcm90XzsiICA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCBwcm90b2NvbF90eXBlIDw8ICIqIG9wcm90XzsiICA8PCBlbmRsOwotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgfQotCi0gIGZfaGVhZGVyXyA8PAotICAgICJ9OyIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7Ci0gICAgLy8gT3V0cHV0IGEgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgdHlwZWRlZiB1c2luZwotICAgIC8vIFRQcm90b2NvbCBhcyB0aGUgdGVtcGxhdGUgcGFyYW1ldGVyLgotICAgIGZfaGVhZGVyXyA8PAotICAgICAgInR5cGVkZWYgIiA8PCBzZXJ2aWNlX25hbWVfIDw8IHN0eWxlIDw8Ci0gICAgICAiQ2xpZW50VDwgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gIiA8PAotICAgICAgc2VydmljZV9uYW1lXyA8PCBzdHlsZSA8PCAiQ2xpZW50OyIgPDwgZW5kbCA8PAotICAgICAgZW5kbDsKLSAgfQotCi0gIHN0cmluZyBzY29wZSA9IHNlcnZpY2VfbmFtZV8gKyBzdHlsZSArIGNsaWVudF9zdWZmaXggKyAiOjoiOwotCi0gIC8vIEdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0KLSAgICAvLyBPcGVuIGZ1bmN0aW9uCi0gICAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCB0ZW1wbGF0ZV9oZWFkZXI7Ci0gICAgfQotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlciwgaWZzdHlsZSwgc2NvcGUpIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAob3V0KTsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgInNlbmRfIiA8PCBmdW5uYW1lIDw8ICIoIjsKLQotICAgIC8vIEdldCB0aGUgc3RydWN0IG9mIGZ1bmN0aW9uIGNhbGwgcGFyYW1zCi0gICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0KLSAgICAvLyBEZWNsYXJlIHRoZSBmdW5jdGlvbiBhcmd1bWVudHMKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOwotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PCAiLCAiOwotICAgICAgfQotICAgICAgb3V0IDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIH0KLSAgICBvdXQgPDwgIik7IiA8PCBlbmRsOwotCi0gICAgaWYgKHN0eWxlICE9ICJDb2IiKSB7Ci0gICAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgICAgb3V0IDw8IGluZGVudCgpOwotICAgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgICAgaWYgKGlzX2NvbXBsZXhfdHlwZSgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCkpKSB7Ci0gICAgICAgICAgICBvdXQgPDwgInJlY3ZfIiA8PCBmdW5uYW1lIDw8ICIoX3JldHVybik7IiA8PCBlbmRsOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBvdXQgPDwgInJldHVybiByZWN2XyIgPDwgZnVubmFtZSA8PCAiKCk7IiA8PCBlbmRsOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBvdXQgPDwKLSAgICAgICAgICAgICJyZWN2XyIgPDwgZnVubmFtZSA8PCAiKCk7IiA8PCBlbmRsOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCBfdGhpcyA8PCAiY2hhbm5lbF8tPnNlbmRBbmRSZWN2TWVzc2FnZSgiIDw8Ci0gICAgICAgICAgInRjeHg6OmJpbmQoY29iLCB0aGlzKSwgIiA8PCBfdGhpcyA8PCAib3RyYW5zXy5nZXQoKSwgIiA8PAotICAgICAgICAgIF90aGlzIDw8ICJpdHJhbnNfLmdldCgpKTsiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgX3RoaXMgPDwgImNoYW5uZWxfLT5zZW5kTWVzc2FnZSgiIDw8Ci0gICAgICAgICAgInRjeHg6OmJpbmQoY29iLCB0aGlzKSwgIiA8PCBfdGhpcyA8PCAib3RyYW5zXy5nZXQoKSk7IiA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLSAgICBzY29wZV9kb3duKG91dCk7Ci0gICAgb3V0IDw8IGVuZGw7Ci0KLSAgICAvL2lmIChzdHlsZSAhPSAiQ29iIikgLy8gVE9ETyhkcmVpc3MpOiBMaWJpZnkgdGhlIGNsaWVudCBhbmQgZG9uJ3QgZ2VuZXJhdGUgdGhpcyBmb3IgY29iLXN0eWxlCi0gICAgaWYgKHRydWUpIHsKLSAgICAgIC8vIEZ1bmN0aW9uIGZvciBzZW5kaW5nCi0gICAgICB0X2Z1bmN0aW9uIHNlbmRfZnVuY3Rpb24oZ190eXBlX3ZvaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJzZW5kXyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKSk7Ci0KLSAgICAgIC8vIE9wZW4gdGhlIHNlbmQgZnVuY3Rpb24KLSAgICAgIGlmIChnZW5fdGVtcGxhdGVzXykgewotICAgICAgICBpbmRlbnQob3V0KSA8PCB0ZW1wbGF0ZV9oZWFkZXI7Ci0gICAgICB9Ci0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICBmdW5jdGlvbl9zaWduYXR1cmUoJnNlbmRfZnVuY3Rpb24sICIiLCBzY29wZSkgPDwgZW5kbDsKLSAgICAgIHNjb3BlX3VwKG91dCk7Ci0KLSAgICAgIC8vIEZ1bmN0aW9uIGFyZ3VtZW50cyBhbmQgcmVzdWx0cwotICAgICAgc3RyaW5nIGFyZ3NuYW1lID0gdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiXyIgKyAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3BhcmdzIjsKLSAgICAgIHN0cmluZyByZXN1bHRuYW1lID0gdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiXyIgKyAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3ByZXN1bHQiOwotCi0gICAgICAvLyBTZXJpYWxpemUgdGhlIHJlcXVlc3QKLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaW50MzJfdCBjc2VxaWQgPSAwOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCBfdGhpcyA8PCAib3Byb3RfLT53cml0ZU1lc3NhZ2VCZWdpbihcIiIgPDwKLSAgICAgICAgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8Ci0gICAgICAgICJcIiwgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OiIgPDwKLSAgICAgICAgKCgqZl9pdGVyKS0+aXNfb25ld2F5KCkgPyAiVF9PTkVXQVkiIDogIlRfQ0FMTCIpIDw8Ci0gICAgICAgICIsIGNzZXFpZCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgYXJnc25hbWUgPDwgIiBhcmdzOyIgPDwgZW5kbDsKLQotICAgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImFyZ3MuIiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gJiIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiYXJncy53cml0ZSgiIDw8IF90aGlzIDw8ICJvcHJvdF8pOyIgPDwgZW5kbCA8PAotICAgICAgICBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8IF90aGlzIDw8ICJvcHJvdF8tPndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCBfdGhpcyA8PCAib3Byb3RfLT5nZXRUcmFuc3BvcnQoKS0+d3JpdGVFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgX3RoaXMgPDwgIm9wcm90Xy0+Z2V0VHJhbnNwb3J0KCktPmZsdXNoKCk7IiA8PCBlbmRsOwotCi0gICAgICBzY29wZV9kb3duKG91dCk7Ci0gICAgICBvdXQgPDwgZW5kbDsKLQotICAgICAgLy8gR2VuZXJhdGUgcmVjdiBmdW5jdGlvbiBvbmx5IGlmIG5vdCBhbiBvbmV3YXkgZnVuY3Rpb24KLSAgICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgICB0X3N0cnVjdCBub2FyZ3MocHJvZ3JhbV8pOwotICAgICAgICB0X2Z1bmN0aW9uIHJlY3ZfZnVuY3Rpb24oKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJyZWN2XyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5vYXJncyk7Ci0gICAgICAgIC8vIE9wZW4gdGhlIHJlY3YgZnVuY3Rpb24KLSAgICAgICAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7Ci0gICAgICAgICAgaW5kZW50KG91dCkgPDwgdGVtcGxhdGVfaGVhZGVyOwotICAgICAgICB9Ci0gICAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICAgZnVuY3Rpb25fc2lnbmF0dXJlKCZyZWN2X2Z1bmN0aW9uLCAiIiwgc2NvcGUpIDw8IGVuZGw7Ci0gICAgICAgIHNjb3BlX3VwKG91dCk7Ci0KLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJpbnQzMl90IHJzZXFpZCA9IDA7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgInN0ZDo6c3RyaW5nIGZuYW1lOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VE1lc3NhZ2VUeXBlIG10eXBlOyIgPDwgZW5kbDsKLSAgICAgICAgaWYgKHN0eWxlID09ICJDb2IiICYmICFnZW5fbm9fY2xpZW50X2NvbXBsZXRpb25fKSB7Ci0gICAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiYm9vbCBjb21wbGV0ZWQgPSBmYWxzZTsiIDw8IGVuZGwgPDwgZW5kbCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgInRyeSB7IjsKLSAgICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgICAgfQotICAgICAgICBvdXQgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8IF90aGlzIDw8ICJpcHJvdF8tPnJlYWRNZXNzYWdlQmVnaW4oZm5hbWUsIG10eXBlLCByc2VxaWQpOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAobXR5cGUgPT0gOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfRVhDRVBUSU9OKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgOjphcGFjaGU6OnRocmlmdDo6VEFwcGxpY2F0aW9uRXhjZXB0aW9uIHg7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgeC5yZWFkKCIgPDwgX3RoaXMgPDwgImlwcm90Xyk7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgIiA8PCBfdGhpcyA8PCAiaXByb3RfLT5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgICIgPDwgX3RoaXMgPDwgImlwcm90Xy0+Z2V0VHJhbnNwb3J0KCktPnJlYWRFbmQoKTsiIDw8Ci0gICAgICAgICAgZW5kbDsKLSAgICAgICAgaWYgKHN0eWxlID09ICJDb2IiICYmICFnZW5fbm9fY2xpZW50X2NvbXBsZXRpb25fKSB7Ci0gICAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiICBjb21wbGV0ZWQgPSB0cnVlOyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgY29tcGxldGVkX18odHJ1ZSk7IiA8PCBlbmRsOwotICAgICAgICB9Ci0gICAgICAgIG91dCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIHRocm93IHg7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKG10eXBlICE9IDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1JFUExZKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgIiA8PCBfdGhpcyA8PCAiaXByb3RfLT5za2lwKCIgPDwKLSAgICAgICAgICAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfU1RSVUNUKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICAiIDw8IF90aGlzIDw8ICJpcHJvdF8tPnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgIiA8PCBfdGhpcyA8PCAiaXByb3RfLT5nZXRUcmFuc3BvcnQoKS0+cmVhZEVuZCgpOyIgPDwKLSAgICAgICAgICBlbmRsOwotICAgICAgICBpZiAoc3R5bGUgPT0gIkNvYiIgJiYgIWdlbl9ub19jbGllbnRfY29tcGxldGlvbl8pIHsKLSAgICAgICAgICBvdXQgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIGNvbXBsZXRlZCA9IHRydWU7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiICBjb21wbGV0ZWRfXyhmYWxzZSk7IiA8PCBlbmRsOwotICAgICAgICB9Ci0gICAgICAgIG91dCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImlmIChmbmFtZS5jb21wYXJlKFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiKSAhPSAwKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgIiA8PCBfdGhpcyA8PCAiaXByb3RfLT5za2lwKCIgPDwKLSAgICAgICAgICAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfU1RSVUNUKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICAiIDw8IF90aGlzIDw8ICJpcHJvdF8tPnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgIiA8PCBfdGhpcyA8PCAiaXByb3RfLT5nZXRUcmFuc3BvcnQoKS0+cmVhZEVuZCgpOyIgPDwKLSAgICAgICAgICBlbmRsOwotICAgICAgICBpZiAoc3R5bGUgPT0gIkNvYiIgJiYgIWdlbl9ub19jbGllbnRfY29tcGxldGlvbl8pIHsKLSAgICAgICAgICBvdXQgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIGNvbXBsZXRlZCA9IHRydWU7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiICBjb21wbGV0ZWRfXyhmYWxzZSk7IiA8PCBlbmRsOwotICAgICAgICB9Ci0gICAgICAgIG91dCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotCi0gICAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkgJiYKLSAgICAgICAgICAgICFpc19jb21wbGV4X3R5cGUoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpKSkgewotICAgICAgICAgIHRfZmllbGQgcmV0dXJuZmllbGQoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLCAiX3JldHVybiIpOwotICAgICAgICAgIG91dCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgZGVjbGFyZV9maWVsZCgmcmV0dXJuZmllbGQpIDw8IGVuZGw7Ci0gICAgICAgIH0KLQotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCByZXN1bHRuYW1lIDw8ICIgcmVzdWx0OyIgPDwgZW5kbDsKLQotICAgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAicmVzdWx0LnN1Y2Nlc3MgPSAmX3JldHVybjsiIDw8IGVuZGw7Ci0gICAgICAgIH0KLQotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAicmVzdWx0LnJlYWQoIiA8PCBfdGhpcyA8PCAiaXByb3RfKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCBfdGhpcyA8PCAiaXByb3RfLT5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8IF90aGlzIDw8ICJpcHJvdF8tPmdldFRyYW5zcG9ydCgpLT5yZWFkRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgZW5kbDsKLQotICAgICAgICAvLyBDYXJlZnVsLCBvbmx5IGxvb2sgZm9yIF9yZXN1bHQgaWYgbm90IGEgdm9pZCBmdW5jdGlvbgotICAgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgICAgaWYgKGlzX2NvbXBsZXhfdHlwZSgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCkpKSB7Ci0gICAgICAgICAgICBvdXQgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgImlmIChyZXN1bHQuX19pc3NldC5zdWNjZXNzKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIC8vIF9yZXR1cm4gcG9pbnRlciBoYXMgbm93IGJlZW4gZmlsbGVkIiA8PCBlbmRsOwotICAgICAgICAgICAgaWYgKHN0eWxlID09ICJDb2IiICYmICFnZW5fbm9fY2xpZW50X2NvbXBsZXRpb25fKSB7Ci0gICAgICAgICAgICAgIG91dCA8PAotICAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIGNvbXBsZXRlZCA9IHRydWU7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgY29tcGxldGVkX18odHJ1ZSk7IiA8PCBlbmRsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybjsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG91dCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKHJlc3VsdC5fX2lzc2V0LnN1Y2Nlc3MpIHsiIDw8IGVuZGw7Ci0gICAgICAgICAgICBpZiAoc3R5bGUgPT0gIkNvYiIgJiYgIWdlbl9ub19jbGllbnRfY29tcGxldGlvbl8pIHsKLSAgICAgICAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgY29tcGxldGVkID0gdHJ1ZTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICBjb21wbGV0ZWRfXyh0cnVlKTsiIDw8IGVuZGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvdXQgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIF9yZXR1cm47IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOwotICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICAgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0gICAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKHJlc3VsdC5fX2lzc2V0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgICAgICAgaWYgKHN0eWxlID09ICJDb2IiICYmICFnZW5fbm9fY2xpZW50X2NvbXBsZXRpb25fKSB7Ci0gICAgICAgICAgICBvdXQgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgY29tcGxldGVkID0gdHJ1ZTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgY29tcGxldGVkX18odHJ1ZSk7IiA8PCBlbmRsOwotICAgICAgICAgIH0KLSAgICAgICAgICBvdXQgIDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiICB0aHJvdyByZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gV2Ugb25seSBnZXQgaGVyZSBpZiB3ZSBhcmUgYSB2b2lkIGZ1bmN0aW9uCi0gICAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICAgIGlmIChzdHlsZSA9PSAiQ29iIiAmJiAhZ2VuX25vX2NsaWVudF9jb21wbGV0aW9uXykgewotICAgICAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICJjb21wbGV0ZWQgPSB0cnVlOyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiY29tcGxldGVkX18odHJ1ZSk7IiA8PCBlbmRsOwotICAgICAgICAgIH0KLSAgICAgICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAgICAgInJldHVybjsiIDw8IGVuZGw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaWYgKHN0eWxlID09ICJDb2IiICYmICFnZW5fbm9fY2xpZW50X2NvbXBsZXRpb25fKSB7Ci0gICAgICAgICAgICBvdXQgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgImNvbXBsZXRlZCA9IHRydWU7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICJjb21wbGV0ZWRfXyh0cnVlKTsiIDw8IGVuZGw7Ci0gICAgICAgICAgfQotICAgICAgICAgIG91dCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgInRocm93IDo6YXBhY2hlOjp0aHJpZnQ6OlRBcHBsaWNhdGlvbkV4Y2VwdGlvbig6OmFwYWNoZTo6dGhyaWZ0OjpUQXBwbGljYXRpb25FeGNlcHRpb246Ok1JU1NJTkdfUkVTVUxULCBcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZmFpbGVkOiB1bmtub3duIHJlc3VsdFwiKTsiIDw8IGVuZGw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHN0eWxlID09ICJDb2IiICYmICFnZW5fbm9fY2xpZW50X2NvbXBsZXRpb25fKSB7Ci0gICAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgICAgICBvdXQgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICJ9IGNhdGNoICguLi4pIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIGlmICghY29tcGxldGVkKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiICAgIGNvbXBsZXRlZF9fKGZhbHNlKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGwgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIHRocm93OyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gQ2xvc2UgZnVuY3Rpb24KLSAgICAgICAgc2NvcGVfZG93bihvdXQpOwotICAgICAgICBvdXQgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotY2xhc3MgUHJvY2Vzc29yR2VuZXJhdG9yIHsKLSBwdWJsaWM6Ci0gIFByb2Nlc3NvckdlbmVyYXRvcih0X2NwcF9nZW5lcmF0b3IqIGdlbmVyYXRvciwgdF9zZXJ2aWNlKiBzZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBzdHlsZSk7Ci0KLSAgdm9pZCBydW4oKSB7Ci0gICAgZ2VuZXJhdGVfY2xhc3NfZGVmaW5pdGlvbigpOwotCi0gICAgLy8gR2VuZXJhdGUgdGhlIGRpc3BhdGNoQ2FsbCgpIGZ1bmN0aW9uCi0gICAgZ2VuZXJhdGVfZGlzcGF0Y2hfY2FsbChmYWxzZSk7Ci0gICAgaWYgKGdlbmVyYXRvcl8tPmdlbl90ZW1wbGF0ZXNfKSB7Ci0gICAgICBnZW5lcmF0ZV9kaXNwYXRjaF9jYWxsKHRydWUpOwotICAgIH0KLQotICAgIC8vIEdlbmVyYXRlIGFsbCBvZiB0aGUgcHJvY2VzcyBzdWJmdW5jdGlvbnMKLSAgICBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9ucygpOwotCi0gICAgZ2VuZXJhdGVfZmFjdG9yeSgpOwotICB9Ci0KLSAgdm9pZCBnZW5lcmF0ZV9jbGFzc19kZWZpbml0aW9uKCk7Ci0gIHZvaWQgZ2VuZXJhdGVfZGlzcGF0Y2hfY2FsbChib29sIHRlbXBsYXRlX3Byb3RvY29sKTsKLSAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9ucygpOwotICB2b2lkIGdlbmVyYXRlX2ZhY3RvcnkoKTsKLQotIHByb3RlY3RlZDoKLSAgc3RkOjpzdHJpbmcgdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsIGJvb2wgaW5fdHlwZWRlZj1mYWxzZSwgYm9vbCBhcmc9ZmFsc2UpIHsKLSAgICByZXR1cm4gZ2VuZXJhdG9yXy0+dHlwZV9uYW1lKHR0eXBlLCBpbl90eXBlZGVmLCBhcmcpOwotICB9Ci0KLSAgc3RkOjpzdHJpbmcgaW5kZW50KCkgewotICAgIHJldHVybiBnZW5lcmF0b3JfLT5pbmRlbnQoKTsKLSAgfQotICBzdGQ6Om9zdHJlYW0mIGluZGVudChzdGQ6Om9zdHJlYW0gJm9zKSB7Ci0gICAgcmV0dXJuIGdlbmVyYXRvcl8tPmluZGVudChvcyk7Ci0gIH0KLQotICB2b2lkIGluZGVudF91cCgpIHsKLSAgICBnZW5lcmF0b3JfLT5pbmRlbnRfdXAoKTsKLSAgfQotICB2b2lkIGluZGVudF9kb3duKCkgewotICAgIGdlbmVyYXRvcl8tPmluZGVudF9kb3duKCk7Ci0gIH0KLQotICB0X2NwcF9nZW5lcmF0b3IqIGdlbmVyYXRvcl87Ci0gIHRfc2VydmljZSogc2VydmljZV87Ci0gIHN0ZDo6b2ZzdHJlYW0mIGZfaGVhZGVyXzsKLSAgc3RkOjpvZnN0cmVhbSYgZl9vdXRfOwotICBzdHJpbmcgc2VydmljZV9uYW1lXzsKLSAgc3RyaW5nIHN0eWxlXzsKLSAgc3RyaW5nIHBzdHlsZV87Ci0gIHN0cmluZyBjbGFzc19uYW1lXzsKLSAgc3RyaW5nIGlmX25hbWVfOwotICBzdHJpbmcgZmFjdG9yeV9jbGFzc19uYW1lXzsKLSAgc3RyaW5nIGZpbmlzaF9jb2JfOwotICBzdHJpbmcgZmluaXNoX2NvYl9kZWNsXzsKLSAgc3RyaW5nIHJldF90eXBlXzsKLSAgc3RyaW5nIGNhbGxfY29udGV4dF87Ci0gIHN0cmluZyBjb2JfYXJnXzsKLSAgc3RyaW5nIGNhbGxfY29udGV4dF9hcmdfOwotICBzdHJpbmcgY2FsbF9jb250ZXh0X2RlY2xfOwotICBzdHJpbmcgdGVtcGxhdGVfaGVhZGVyXzsKLSAgc3RyaW5nIHRlbXBsYXRlX3N1ZmZpeF87Ci0gIHN0cmluZyB0eXBlbmFtZV9zdHJfOwotICBzdHJpbmcgY2xhc3Nfc3VmZml4XzsKLSAgc3RyaW5nIGV4dGVuZHNfOwotfTsKLQotUHJvY2Vzc29yR2VuZXJhdG9yOjpQcm9jZXNzb3JHZW5lcmF0b3IodF9jcHBfZ2VuZXJhdG9yKiBnZW5lcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NlcnZpY2UqIHNlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHN0eWxlKQotICA6IGdlbmVyYXRvcl8oZ2VuZXJhdG9yKSwKLSAgICBzZXJ2aWNlXyhzZXJ2aWNlKSwKLSAgICBmX2hlYWRlcl8oZ2VuZXJhdG9yLT5mX2hlYWRlcl8pLAotICAgIGZfb3V0XyhnZW5lcmF0b3ItPmdlbl90ZW1wbGF0ZXNfID8KLSAgICAgICAgICAgZ2VuZXJhdG9yLT5mX3NlcnZpY2VfdGNjXyA6IGdlbmVyYXRvci0+Zl9zZXJ2aWNlXyksCi0gICAgc2VydmljZV9uYW1lXyhnZW5lcmF0b3ItPnNlcnZpY2VfbmFtZV8pLAotICAgIHN0eWxlXyhzdHlsZSkgewotICBpZiAoc3R5bGVfID09ICJDb2IiKSB7Ci0gICAgcHN0eWxlXyA9ICJBc3luYyI7Ci0gICAgY2xhc3NfbmFtZV8gPSBzZXJ2aWNlX25hbWVfICsgcHN0eWxlXyArICJQcm9jZXNzb3IiOwotICAgIGlmX25hbWVfID0gc2VydmljZV9uYW1lXyArICJDb2JTdklmIjsKLQotICAgIGZpbmlzaF9jb2JfID0gInRjeHg6OmZ1bmN0aW9uPHZvaWQoYm9vbCBvayk+IGNvYiwgIjsKLSAgICBmaW5pc2hfY29iX2RlY2xfID0gInRjeHg6OmZ1bmN0aW9uPHZvaWQoYm9vbCBvayk+LCAiOwotICAgIGNvYl9hcmdfID0gImNvYiwgIjsKLSAgICByZXRfdHlwZV8gPSAidm9pZCAiOwotICB9IGVsc2UgewotICAgIGNsYXNzX25hbWVfID0gc2VydmljZV9uYW1lXyArICJQcm9jZXNzb3IiOwotICAgIGlmX25hbWVfID0gc2VydmljZV9uYW1lXyArICJJZiI7Ci0KLSAgICByZXRfdHlwZV8gPSAiYm9vbCAiOwotICAgIC8vIFRPRE8oZWRoYWxsKSBjYWxsQ29udGV4dCBzaG91bGQgZXZlbnR1YWxseSBiZSBhZGRlZCB0byBUQXN5bmNQcm9jZXNzb3IKLSAgICBjYWxsX2NvbnRleHRfID0gIiwgdm9pZCogY2FsbENvbnRleHQiOwotICAgIGNhbGxfY29udGV4dF9hcmdfID0gIiwgY2FsbENvbnRleHQiOwotICAgIGNhbGxfY29udGV4dF9kZWNsXyA9ICIsIHZvaWQqIjsKLSAgfQotCi0gIGZhY3RvcnlfY2xhc3NfbmFtZV8gPSBjbGFzc19uYW1lXyArICJGYWN0b3J5IjsKLQotICBpZiAoZ2VuZXJhdG9yLT5nZW5fdGVtcGxhdGVzXykgewotICAgIHRlbXBsYXRlX2hlYWRlcl8gPSAidGVtcGxhdGUgPGNsYXNzIFByb3RvY29sXz5cbiI7Ci0gICAgdGVtcGxhdGVfc3VmZml4XyA9ICI8UHJvdG9jb2xfPiI7Ci0gICAgdHlwZW5hbWVfc3RyXyA9ICJ0eXBlbmFtZSAiOwotICAgIGNsYXNzX25hbWVfICs9ICJUIjsKLSAgICBmYWN0b3J5X2NsYXNzX25hbWVfICs9ICJUIjsKLSAgfQotCi0gIGlmIChzZXJ2aWNlXy0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kc18gPSB0eXBlX25hbWUoc2VydmljZV8tPmdldF9leHRlbmRzKCkpICsgcHN0eWxlXyArICJQcm9jZXNzb3IiOwotICAgIGlmIChnZW5lcmF0b3JfLT5nZW5fdGVtcGxhdGVzXykgewotICAgICAgLy8gVE9ETyhzaW1wa2lucyk6IElmIGdlbl90ZW1wbGF0ZXNfIGlzIGVuYWJsZWQsIHdlIGN1cnJlbnRseSBhc3N1bWUgYWxsCi0gICAgICAvLyBwYXJlbnQgc2VydmljZXMgd2VyZSBhbHNvIGdlbmVyYXRlZCB3aXRoIHRlbXBsYXRlcyBlbmFibGVkLgotICAgICAgZXh0ZW5kc18gKz0gIlQ8UHJvdG9jb2xfPiI7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgUHJvY2Vzc29yR2VuZXJhdG9yOjpnZW5lcmF0ZV9jbGFzc19kZWZpbml0aW9uKCkgewotICAvLyBHZW5lcmF0ZSB0aGUgZGlzcGF0Y2ggbWV0aG9kcwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHNlcnZpY2VfLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLQotICBzdHJpbmcgcGFyZW50X2NsYXNzOwotICBpZiAoc2VydmljZV8tPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIHBhcmVudF9jbGFzcyA9IGV4dGVuZHNfOwotICB9IGVsc2UgewotICAgIGlmIChzdHlsZV8gPT0gIkNvYiIpIHsKLSAgICAgIHBhcmVudF9jbGFzcyA9ICI6OmFwYWNoZTo6dGhyaWZ0Ojphc3luYzo6VEFzeW5jRGlzcGF0Y2hQcm9jZXNzb3IiOwotICAgIH0gZWxzZSB7Ci0gICAgICBwYXJlbnRfY2xhc3MgPSAiOjphcGFjaGU6OnRocmlmdDo6VERpc3BhdGNoUHJvY2Vzc29yIjsKLSAgICB9Ci0KLSAgICBpZiAoZ2VuZXJhdG9yXy0+Z2VuX3RlbXBsYXRlc18pIHsKLSAgICAgIHBhcmVudF9jbGFzcyArPSAiVDxQcm90b2NvbF8+IjsKLSAgICB9Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSB0aGUgaGVhZGVyIHBvcnRpb24KLSAgZl9oZWFkZXJfIDw8Ci0gICAgdGVtcGxhdGVfaGVhZGVyXyA8PAotICAgICJjbGFzcyAiIDw8IGNsYXNzX25hbWVfIDw8ICIgOiBwdWJsaWMgIiA8PCBwYXJlbnRfY2xhc3MgPDwgIiB7IiA8PCBlbmRsOwotCi0gIC8vIFByb3RlY3RlZCBkYXRhIG1lbWJlcnMKLSAgZl9oZWFkZXJfIDw8Ci0gICAgIiBwcm90ZWN0ZWQ6IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZl9oZWFkZXJfIDw8Ci0gICAgaW5kZW50KCkgPDwgImJvb3N0OjpzaGFyZWRfcHRyPCIgPDwgaWZfbmFtZV8gPDwgIj4gaWZhY2VfOyIgPDwgZW5kbDsKLSAgZl9oZWFkZXJfIDw8Ci0gICAgaW5kZW50KCkgPDwgInZpcnR1YWwgIiA8PCByZXRfdHlwZV8gPDwgImRpc3BhdGNoQ2FsbCgiIDw8IGZpbmlzaF9jb2JfIDw8Ci0gICAgICAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCogaXByb3QsICIgPDwKLSAgICAgICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBvcHJvdCwgIiA8PAotICAgICAgImNvbnN0IHN0ZDo6c3RyaW5nJiBmbmFtZSwgaW50MzJfdCBzZXFpZCIgPDwgY2FsbF9jb250ZXh0XyA8PCAiKTsiIDw8Ci0gICAgICBlbmRsOwotICBpZiAoZ2VuZXJhdG9yXy0+Z2VuX3RlbXBsYXRlc18pIHsKLSAgICBmX2hlYWRlcl8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJ2aXJ0dWFsICIgPDwgcmV0X3R5cGVfIDw8ICJkaXNwYXRjaENhbGxUZW1wbGF0ZWQoIiA8PAotICAgICAgICBmaW5pc2hfY29iXyA8PCAiUHJvdG9jb2xfKiBpcHJvdCwgUHJvdG9jb2xfKiBvcHJvdCwgIiA8PAotICAgICAgICAiY29uc3Qgc3RkOjpzdHJpbmcmIGZuYW1lLCBpbnQzMl90IHNlcWlkIiA8PCBjYWxsX2NvbnRleHRfIDw8ICIpOyIgPDwKLSAgICAgICAgZW5kbDsKLSAgfQotICBpbmRlbnRfZG93bigpOwotCi0gIC8vIFByb2Nlc3MgZnVuY3Rpb24gZGVjbGFyYXRpb25zCi0gIGZfaGVhZGVyXyA8PAotICAgICIgcHJpdmF0ZToiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIC8vIERlY2xhcmUgcHJvY2Vzc01hcF8KLSAgZl9oZWFkZXJfIDw8Ci0gICAgaW5kZW50KCkgPDwgInR5cGVkZWYgIHZvaWQgKCIgPDwgY2xhc3NfbmFtZV8gPDwgIjo6KiIgPDwKLSAgICAgICJQcm9jZXNzRnVuY3Rpb24pKCIgPDwgZmluaXNoX2NvYl9kZWNsXyA8PCAiaW50MzJfdCwgIiA8PAotICAgICAgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqLCAiIDw8Ci0gICAgICAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCoiIDw8IGNhbGxfY29udGV4dF9kZWNsXyA8PCAiKTsiIDw8Ci0gICAgICBlbmRsOwotICBpZiAoZ2VuZXJhdG9yXy0+Z2VuX3RlbXBsYXRlc18pIHsKLSAgICBmX2hlYWRlcl8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJ0eXBlZGVmIHZvaWQgKCIgPDwgY2xhc3NfbmFtZV8gPDwgIjo6KiIgPDwKLSAgICAgICAgIlNwZWNpYWxpemVkUHJvY2Vzc0Z1bmN0aW9uKSgiIDw8IGZpbmlzaF9jb2JfZGVjbF8gPDwgImludDMyX3QsICIgPDwKLSAgICAgICAgIlByb3RvY29sXyosIFByb3RvY29sXyoiIDw8IGNhbGxfY29udGV4dF9kZWNsXyA8PCAiKTsiIDw8Ci0gICAgICAgIGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJzdHJ1Y3QgUHJvY2Vzc0Z1bmN0aW9ucyB7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICBQcm9jZXNzRnVuY3Rpb24gZ2VuZXJpYzsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIFNwZWNpYWxpemVkUHJvY2Vzc0Z1bmN0aW9uIHNwZWNpYWxpemVkOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgUHJvY2Vzc0Z1bmN0aW9ucyhQcm9jZXNzRnVuY3Rpb24gZywgIiA8PAotICAgICAgICAiU3BlY2lhbGl6ZWRQcm9jZXNzRnVuY3Rpb24gcykgOiIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgICBnZW5lcmljKGcpLCIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgICBzcGVjaWFsaXplZChzKSB7fSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgUHJvY2Vzc0Z1bmN0aW9ucygpIDogZ2VuZXJpYyhOVUxMKSwgc3BlY2lhbGl6ZWQoTlVMTCkgIiA8PAotICAgICAgICAie30iIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ9OyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgInR5cGVkZWYgc3RkOjptYXA8c3RkOjpzdHJpbmcsIFByb2Nlc3NGdW5jdGlvbnM+ICIgPDwKLSAgICAgICAgIlByb2Nlc3NNYXA7IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGZfaGVhZGVyXyA8PAotICAgICAgaW5kZW50KCkgPDwgInR5cGVkZWYgc3RkOjptYXA8c3RkOjpzdHJpbmcsIFByb2Nlc3NGdW5jdGlvbj4gIiA8PAotICAgICAgICAiUHJvY2Vzc01hcDsiIDw8IGVuZGw7Ci0gIH0KLSAgZl9oZWFkZXJfIDw8Ci0gICAgaW5kZW50KCkgPDwgIlByb2Nlc3NNYXAgcHJvY2Vzc01hcF87IiA8PCBlbmRsOwotCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaW5kZW50KGZfaGVhZGVyXykgPDwKLSAgICAgICJ2b2lkIHByb2Nlc3NfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIigiIDw8IGZpbmlzaF9jb2JfIDw8ICJpbnQzMl90IHNlcWlkLCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBpcHJvdCwgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCogb3Byb3QiIDw8IGNhbGxfY29udGV4dF8gPDwgIik7IiA8PCBlbmRsOwotICAgIGlmIChnZW5lcmF0b3JfLT5nZW5fdGVtcGxhdGVzXykgewotICAgICAgaW5kZW50KGZfaGVhZGVyXykgPDwKLSAgICAgICAgInZvaWQgcHJvY2Vzc18iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCIgPDwgZmluaXNoX2NvYl8gPDwKLSAgICAgICAgImludDMyX3Qgc2VxaWQsIFByb3RvY29sXyogaXByb3QsIFByb3RvY29sXyogb3Byb3QiIDw8Ci0gICAgICAgIGNhbGxfY29udGV4dF8gPDwgIik7IiA8PCBlbmRsOwotICAgIH0KLSAgICBpZiAoc3R5bGVfID09ICJDb2IiKSB7Ci0gICAgICAvLyBYWFggRmFjdG9yIHRoaXMgb3V0LCBldmVuIGlmIGl0IGlzIGEgcGFpbi4KLSAgICAgIHN0cmluZyByZXRfYXJnID0gKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpCi0gICAgICAgICAgICAgICAgICAgICAgICA/ICIiCi0gICAgICAgICAgICAgICAgICAgICAgICA6ICIsIGNvbnN0ICIgKyB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpKSArICImIF9yZXR1cm4iKTsKLSAgICAgIGZfaGVhZGVyXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAidm9pZCByZXR1cm5fIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwKLSAgICAgICAgIih0Y3h4OjpmdW5jdGlvbjx2b2lkKGJvb2wgb2spPiBjb2IsIGludDMyX3Qgc2VxaWQsICIgPDwKLSAgICAgICAgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIG9wcm90LCAiIDw8Ci0gICAgICAgICJ2b2lkKiBjdHgiIDw8IHJldF9hcmcgPDwgIik7IiA8PCBlbmRsOwotICAgICAgaWYgKGdlbmVyYXRvcl8tPmdlbl90ZW1wbGF0ZXNfKSB7Ci0gICAgICAgIGZfaGVhZGVyXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ2b2lkIHJldHVybl8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PAotICAgICAgICAgICIodGN4eDo6ZnVuY3Rpb248dm9pZChib29sIG9rKT4gY29iLCBpbnQzMl90IHNlcWlkLCAiIDw8Ci0gICAgICAgICAgIlByb3RvY29sXyogb3Byb3QsIHZvaWQqIGN0eCIgPDwgcmV0X2FyZyA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgICAvLyBYWFggRG9uJ3QgZGVjbGFyZSB0aHJvdyBpZiBpdCBkb2Vzbid0IGV4aXN0Ci0gICAgICBmX2hlYWRlcl8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInZvaWQgdGhyb3dfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwKLSAgICAgICAgIih0Y3h4OjpmdW5jdGlvbjx2b2lkKGJvb2wgb2spPiBjb2IsIGludDMyX3Qgc2VxaWQsICIgPDwKLSAgICAgICAgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIG9wcm90LCB2b2lkKiBjdHgsICIgPDwKLSAgICAgICAgIjo6YXBhY2hlOjp0aHJpZnQ6OlREZWxheWVkRXhjZXB0aW9uKiBfdGhyb3cpOyIgPDwgZW5kbDsKLSAgICAgIGlmIChnZW5lcmF0b3JfLT5nZW5fdGVtcGxhdGVzXykgewotICAgICAgICBmX2hlYWRlcl8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAidm9pZCB0aHJvd18iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PAotICAgICAgICAgICIodGN4eDo6ZnVuY3Rpb248dm9pZChib29sIG9rKT4gY29iLCBpbnQzMl90IHNlcWlkLCAiIDw8Ci0gICAgICAgICAgIlByb3RvY29sXyogb3Byb3QsIHZvaWQqIGN0eCwgIiA8PAotICAgICAgICAgICI6OmFwYWNoZTo6dGhyaWZ0OjpURGVsYXllZEV4Y2VwdGlvbiogX3Rocm93KTsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZl9oZWFkZXJfIDw8Ci0gICAgIiBwdWJsaWM6IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgY2xhc3NfbmFtZV8gPDwKLSAgICAiKGJvb3N0OjpzaGFyZWRfcHRyPCIgPDwgaWZfbmFtZV8gPDwgIj4gaWZhY2UpIDoiIDw8IGVuZGw7Ci0gIGlmICghZXh0ZW5kc18uZW1wdHkoKSkgewotICAgIGZfaGVhZGVyXyA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgIiA8PCBleHRlbmRzXyA8PCAiKGlmYWNlKSwiIDw8IGVuZGw7Ci0gIH0KLSAgZl9oZWFkZXJfIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgaWZhY2VfKGlmYWNlKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGZfaGVhZGVyXyA8PAotICAgICAgaW5kZW50KCkgPDwgInByb2Nlc3NNYXBfW1wiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiXSA9ICI7Ci0gICAgaWYgKGdlbmVyYXRvcl8tPmdlbl90ZW1wbGF0ZXNfKSB7Ci0gICAgICBmX2hlYWRlcl8gPDwgIlByb2Nlc3NGdW5jdGlvbnMoIiA8PCBlbmRsOwotICAgICAgaWYgKGdlbmVyYXRvcl8tPmdlbl90ZW1wbGF0ZXNfb25seV8pIHsKLSAgICAgICAgaW5kZW50KGZfaGVhZGVyXykgPDwgIiAgTlVMTCwiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpbmRlbnQoZl9oZWFkZXJfKSA8PCAiICAmIiA8PCBjbGFzc19uYW1lXyA8PCAiOjpwcm9jZXNzXyIgPDwKLSAgICAgICAgICAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiwiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgICBpbmRlbnQoZl9oZWFkZXJfKSA8PCAiICAmIiA8PCBjbGFzc19uYW1lXyA8PCAiOjpwcm9jZXNzXyIgPDwKLSAgICAgICAgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIjsKLSAgICB9IGVsc2UgewotICAgICAgZl9oZWFkZXJfIDw8ICImIiA8PCBjbGFzc19uYW1lXyA8PCAiOjpwcm9jZXNzXyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIH0KLSAgICBmX2hlYWRlcl8gPDwKLSAgICAgICI7IiA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9oZWFkZXJfIDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInZpcnR1YWwgfiIgPDwgY2xhc3NfbmFtZV8gPDwgIigpIHt9IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBmX2hlYWRlcl8gPDwKLSAgICAifTsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpZiAoZ2VuZXJhdG9yXy0+Z2VuX3RlbXBsYXRlc18pIHsKLSAgICAvLyBHZW5lcmF0ZSBhIGJhY2t3YXJkcyBjb21wYXRpYmxlIHR5cGVkZWYsIGZvciBjYWxsZXJzIHdobyBkb24ndCBrbm93Ci0gICAgLy8gYWJvdXQgdGhlIG5ldyB0ZW1wbGF0ZS1zdHlsZSBjb2RlLgotICAgIC8vCi0gICAgLy8gV2UgY2FuJ3QgdXNlIFRQcm90b2NvbCBhcyB0aGUgdGVtcGxhdGUgcGFyYW1ldGVyLCBzaW5jZSBQcm9jZXNzb3JUCi0gICAgLy8gcHJvdmlkZXMgb3ZlcmxvYWRlZCB2ZXJzaW9ucyBvZiBtb3N0IG1ldGhvZHMsIG9uZSBvZiB3aGljaCBhY2NlcHRzCi0gICAgLy8gVFByb3RvY29sIHBvaW50ZXJzLCBhbmQgb25lIHdoaWNoIGFjY2VwdHMgUHJvdG9jb2xfIHBvaW50ZXJzLiAgVGhpcwotICAgIC8vIHJlc3VsdHMgaW4gYSBjb21waWxlIGVycm9yIGlmIGluc3RhbnRpYXRlZCB3aXRoIFByb3RvY29sXyA9PSBUUHJvdG9jb2wuCi0gICAgLy8gVGhlcmVmb3JlLCB3ZSBkZWZpbmUgVER1bW15UHJvdG9jb2wgc29sZWx5IHNvIHdlIGNhbiB1c2UgaXQgYXMgdGhlCi0gICAgLy8gdGVtcGxhdGUgcGFyYW1ldGVyIGhlcmUuCi0gICAgZl9oZWFkZXJfIDw8Ci0gICAgICAidHlwZWRlZiAiIDw8IGNsYXNzX25hbWVfIDw8Ci0gICAgICAiPCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VER1bW15UHJvdG9jb2wgPiAiIDw8Ci0gICAgICBzZXJ2aWNlX25hbWVfIDw8IHBzdHlsZV8gPDwgIlByb2Nlc3NvcjsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotfQotCi12b2lkIFByb2Nlc3NvckdlbmVyYXRvcjo6Z2VuZXJhdGVfZGlzcGF0Y2hfY2FsbChib29sIHRlbXBsYXRlX3Byb3RvY29sKSB7Ci0gIHN0cmluZyBwcm90b2NvbCA9ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sIjsKLSAgc3RyaW5nIGZ1bmN0aW9uX3N1ZmZpeDsKLSAgaWYgKHRlbXBsYXRlX3Byb3RvY29sKSB7Ci0gICAgcHJvdG9jb2wgPSAiUHJvdG9jb2xfIjsKLSAgICAvLyBXZSBjYWxsIHRoZSBnZW5lcmljIHZlcnNpb24gZGlzcGF0Y2hDYWxsKCksIGFuZCB0aGUgc3BlY2lhbGl6ZWQKLSAgICAvLyB2ZXJzaW9uIGRpc3BhdGNoQ2FsbFRlbXBsYXRlZCgpLiAgV2UgY2FuJ3QgY2FsbCB0aGVtIGJvdGgKLSAgICAvLyBkaXNwYXRjaENhbGwoKSwgc2luY2UgdGhpcyB3aWxsIGNhdXNlIHRoZSBjb21waWxlciB0byBpc3N1ZSBhIHdhcm5pbmcgaWYKLSAgICAvLyBhIHNlcnZpY2UgdGhhdCBkb2Vzbid0IHVzZSB0ZW1wbGF0ZXMgaW5oZXJpdHMgZnJvbSBhIHNlcnZpY2UgdGhhdCBkb2VzCi0gICAgLy8gdXNlIHRlbXBsYXRlczogdGhlIGNvbXBpbGVyIGNvbXBsYWlucyB0aGF0IHRoZSBzdWJjbGFzcyBvbmx5IGltcGxlbWVudHMKLSAgICAvLyB0aGUgZ2VuZXJpYyB2ZXJzaW9uIG9mIGRpc3BhdGNoQ2FsbCgpLCBhbmQgaGlkZXMgdGhlIHRlbXBsYXRlZCB2ZXJzaW9uLgotICAgIC8vIFVzaW5nIGRpZmZlcmVudCBuYW1lcyBmb3IgdGhlIHR3byBmdW5jdGlvbnMgcHJldmVudHMgdGhpcy4KLSAgICBmdW5jdGlvbl9zdWZmaXggPSAiVGVtcGxhdGVkIjsKLSAgfQotCi0gIGZfb3V0XyA8PAotICAgIHRlbXBsYXRlX2hlYWRlcl8gPDwKLSAgICByZXRfdHlwZV8gPDwgY2xhc3NfbmFtZV8gPDwKLSAgICB0ZW1wbGF0ZV9zdWZmaXhfIDw8ICI6OmRpc3BhdGNoQ2FsbCIgPDwgZnVuY3Rpb25fc3VmZml4IDw8ICIoIiA8PAotICAgIGZpbmlzaF9jb2JfIDw8IHByb3RvY29sIDw8ICIqIGlwcm90LCAiIDw8IHByb3RvY29sIDw8ICIqIG9wcm90LCAiIDw8Ci0gICAgImNvbnN0IHN0ZDo6c3RyaW5nJiBmbmFtZSwgaW50MzJfdCBzZXFpZCIgPDwgY2FsbF9jb250ZXh0XyA8PCAiKSB7IiA8PAotICAgIGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIC8vIEhPVDogbWVtYmVyIGZ1bmN0aW9uIHBvaW50ZXIgbWFwCi0gIGZfb3V0XyA8PAotICAgIGluZGVudCgpIDw8IHR5cGVuYW1lX3N0cl8gPDwgIlByb2Nlc3NNYXA6Oml0ZXJhdG9yIHBmbjsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAicGZuID0gcHJvY2Vzc01hcF8uZmluZChmbmFtZSk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImlmIChwZm4gPT0gcHJvY2Vzc01hcF8uZW5kKCkpIHsiIDw8IGVuZGw7Ci0gIGlmIChleHRlbmRzXy5lbXB0eSgpKSB7Ci0gICAgZl9vdXRfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICBpcHJvdC0+c2tpcCg6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9TVFJVQ1QpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgaXByb3QtPnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICBpcHJvdC0+Z2V0VHJhbnNwb3J0KCktPnJlYWRFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIDo6YXBhY2hlOjp0aHJpZnQ6OlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB4KDo6YXBhY2hlOjp0aHJpZnQ6OlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6VU5LTk9XTl9NRVRIT0QsIFwiSW52YWxpZCBtZXRob2QgbmFtZTogJ1wiK2ZuYW1lK1wiJ1wiKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIG9wcm90LT53cml0ZU1lc3NhZ2VCZWdpbihmbmFtZSwgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfRVhDRVBUSU9OLCBzZXFpZCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICB4LndyaXRlKG9wcm90KTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIG9wcm90LT53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIG9wcm90LT5nZXRUcmFuc3BvcnQoKS0+d3JpdGVFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIG9wcm90LT5nZXRUcmFuc3BvcnQoKS0+Zmx1c2goKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8IChzdHlsZV8gPT0gIkNvYiIgPyAiICByZXR1cm4gY29iKHRydWUpOyIgOiAiICByZXR1cm4gdHJ1ZTsiKSA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGZfb3V0XyA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIKLSAgICAgICAgICAgICAgIDw8IGV4dGVuZHNfIDw8ICI6OmRpc3BhdGNoQ2FsbCgiCi0gICAgICAgICAgICAgICA8PCAoc3R5bGVfID09ICJDb2IiID8gImNvYiwgIiA6ICIiKQotICAgICAgICAgICAgICAgPDwgImlwcm90LCBvcHJvdCwgZm5hbWUsIHNlcWlkIiA8PCBjYWxsX2NvbnRleHRfYXJnXyA8PCAiKTsiIDw8IGVuZGw7Ci0gIH0KLSAgZl9vdXRfIDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gIGlmICh0ZW1wbGF0ZV9wcm90b2NvbCkgewotICAgIGZfb3V0XyA8PAotICAgICAgaW5kZW50KCkgPDwgIih0aGlzLT4qKHBmbi0+c2Vjb25kLnNwZWNpYWxpemVkKSkiOwotICB9IGVsc2UgewotICAgIGlmIChnZW5lcmF0b3JfLT5nZW5fdGVtcGxhdGVzX29ubHlfKSB7Ci0gICAgICAvLyBUT0RPOiBUaGlzIGlzIGEgbnVsbCBwb2ludGVyLCBzbyBub3RoaW5nIGdvb2Qgd2lsbCBjb21lIGZyb20gY2FsbGluZwotICAgICAgLy8gaXQuICBUaHJvdyBhbiBleGNlcHRpb24gaW5zdGVhZC4KLSAgICAgIGZfb3V0XyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiKHRoaXMtPioocGZuLT5zZWNvbmQuZ2VuZXJpYykpIjsKLSAgICB9IGVsc2UgaWYgKGdlbmVyYXRvcl8tPmdlbl90ZW1wbGF0ZXNfKSB7Ci0gICAgICBmX291dF8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIih0aGlzLT4qKHBmbi0+c2Vjb25kLmdlbmVyaWMpKSI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZfb3V0XyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiKHRoaXMtPioocGZuLT5zZWNvbmQpKSI7Ci0gICAgfQotICB9Ci0gIGZfb3V0XyA8PCAiKCIgPDwgY29iX2FyZ18gPDwgInNlcWlkLCBpcHJvdCwgb3Byb3QiIDw8Ci0gICAgY2FsbF9jb250ZXh0X2FyZ18gPDwgIik7IiA8PCBlbmRsOwotCi0gIC8vIFRPRE8oZHJlaXNzKTogcmV0dXJuIHBmbiByZXQ/Ci0gIGlmIChzdHlsZV8gPT0gIkNvYiIpIHsKLSAgICBmX291dF8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJyZXR1cm47IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGZfb3V0XyA8PAotICAgICAgaW5kZW50KCkgPDwgInJldHVybiB0cnVlOyIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGZfb3V0XyA8PAotICAgICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLX0KLQotdm9pZCBQcm9jZXNzb3JHZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb25zKCkgewotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHNlcnZpY2VfLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZ2VuZXJhdG9yXy0+Z2VuX3RlbXBsYXRlc18pIHsKLSAgICAgIGdlbmVyYXRvcl8tPmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24oc2VydmljZV8sICpmX2l0ZXIsIHN0eWxlXywgZmFsc2UpOwotICAgICAgZ2VuZXJhdG9yXy0+Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbihzZXJ2aWNlXywgKmZfaXRlciwgc3R5bGVfLCB0cnVlKTsKLSAgICB9IGVsc2UgewotICAgICAgZ2VuZXJhdG9yXy0+Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbihzZXJ2aWNlXywgKmZfaXRlciwgc3R5bGVfLCBmYWxzZSk7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgUHJvY2Vzc29yR2VuZXJhdG9yOjpnZW5lcmF0ZV9mYWN0b3J5KCkgewotICBzdHJpbmcgaWZfZmFjdG9yeV9uYW1lID0gaWZfbmFtZV8gKyAiRmFjdG9yeSI7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGZhY3RvcnkgY2xhc3MgZGVmaW5pdGlvbgotICBmX2hlYWRlcl8gPDwKLSAgICB0ZW1wbGF0ZV9oZWFkZXJfIDw8Ci0gICAgImNsYXNzICIgPDwgZmFjdG9yeV9jbGFzc19uYW1lXyA8PAotICAgICAgIiA6IHB1YmxpYyA6OmFwYWNoZTo6dGhyaWZ0OjoiIDw8Ci0gICAgICAgIChzdHlsZV8gPT0gIkNvYiIgPyAiYXN5bmM6OlRBc3luY1Byb2Nlc3NvckZhY3RvcnkiIDogICJUUHJvY2Vzc29yRmFjdG9yeSIpIDw8Ci0gICAgICAgICIgeyIgPDwgZW5kbCA8PAotICAgICIgcHVibGljOiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgZl9oZWFkZXJfIDw8Ci0gICAgaW5kZW50KCkgPDwgZmFjdG9yeV9jbGFzc19uYW1lXyA8PCAiKGNvbnN0IDo6Ym9vc3Q6OnNoYXJlZF9wdHI8ICIgPDwKLSAgICAgIGlmX2ZhY3RvcnlfbmFtZSA8PCAiID4mIGhhbmRsZXJGYWN0b3J5KSA6IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgICBoYW5kbGVyRmFjdG9yeV8oaGFuZGxlckZhY3RvcnkpIHt9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICI6OmJvb3N0OjpzaGFyZWRfcHRyPCA6OmFwYWNoZTo6dGhyaWZ0OjoiIDw8Ci0gICAgICAoc3R5bGVfID09ICJDb2IiID8gImFzeW5jOjpUQXN5bmNQcm9jZXNzb3IiIDogICJUUHJvY2Vzc29yIikgPDwgIiA+ICIgPDwKLSAgICAgICJnZXRQcm9jZXNzb3IoY29uc3QgOjphcGFjaGU6OnRocmlmdDo6VENvbm5lY3Rpb25JbmZvJiBjb25uSW5mbyk7IiA8PAotICAgICAgZW5kbDsKLQotICBmX2hlYWRlcl8gPDwKLSAgICBlbmRsIDw8Ci0gICAgIiBwcm90ZWN0ZWQ6IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIjo6Ym9vc3Q6OnNoYXJlZF9wdHI8ICIgPDwgaWZfZmFjdG9yeV9uYW1lIDw8Ci0gICAgICAiID4gaGFuZGxlckZhY3RvcnlfOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBmX2hlYWRlcl8gPDwKLSAgICAifTsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICAvLyBJZiB3ZSBhcmUgZ2VuZXJhdGluZyB0ZW1wbGF0ZXMsIG91dHB1dCBhIHR5cGVkZWYgZm9yIHRoZSBwbGFpbgotICAvLyBmYWN0b3J5IG5hbWUuCi0gIGlmIChnZW5lcmF0b3JfLT5nZW5fdGVtcGxhdGVzXykgewotICAgIGZfaGVhZGVyXyA8PAotICAgICAgInR5cGVkZWYgIiA8PCBmYWN0b3J5X2NsYXNzX25hbWVfIDw8Ci0gICAgICAiPCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VER1bW15UHJvdG9jb2wgPiAiIDw8Ci0gICAgICBzZXJ2aWNlX25hbWVfIDw8IHBzdHlsZV8gPDwgIlByb2Nlc3NvckZhY3Rvcnk7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSB0aGUgZ2V0UHJvY2Vzc29yKCkgbWV0aG9kCi0gIGZfb3V0XyA8PAotICAgIHRlbXBsYXRlX2hlYWRlcl8gPDwKLSAgICBpbmRlbnQoKSA8PCAiOjpib29zdDo6c2hhcmVkX3B0cjwgOjphcGFjaGU6OnRocmlmdDo6IiA8PAotICAgICAgKHN0eWxlXyA9PSAiQ29iIiA/ICJhc3luYzo6VEFzeW5jUHJvY2Vzc29yIiA6ICAiVFByb2Nlc3NvciIpIDw8ICIgPiAiIDw8Ci0gICAgICBmYWN0b3J5X2NsYXNzX25hbWVfIDw8IHRlbXBsYXRlX3N1ZmZpeF8gPDwgIjo6Z2V0UHJvY2Vzc29yKCIgPDwKLSAgICAgICJjb25zdCA6OmFwYWNoZTo6dGhyaWZ0OjpUQ29ubmVjdGlvbkluZm8mIGNvbm5JbmZvKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBmX291dF8gPDwKLSAgICBpbmRlbnQoKSA8PCAiOjphcGFjaGU6OnRocmlmdDo6UmVsZWFzZUhhbmRsZXI8ICIgPDwgaWZfZmFjdG9yeV9uYW1lIDw8Ci0gICAgICAiID4gY2xlYW51cChoYW5kbGVyRmFjdG9yeV8pOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICI6OmJvb3N0OjpzaGFyZWRfcHRyPCAiIDw8IGlmX25hbWVfIDw8ICIgPiBoYW5kbGVyKCIgPDwKLSAgICAgICJoYW5kbGVyRmFjdG9yeV8tPmdldEhhbmRsZXIoY29ubkluZm8pLCBjbGVhbnVwKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiOjpib29zdDo6c2hhcmVkX3B0cjwgOjphcGFjaGU6OnRocmlmdDo6IiA8PAotICAgICAgKHN0eWxlXyA9PSAiQ29iIiA/ICJhc3luYzo6VEFzeW5jUHJvY2Vzc29yIiA6ICAiVFByb2Nlc3NvciIpIDw8ICIgPiAiIDw8Ci0gICAgICAicHJvY2Vzc29yKG5ldyAiIDw8IGNsYXNzX25hbWVfIDw8IHRlbXBsYXRlX3N1ZmZpeF8gPDwKLSAgICAgICIoaGFuZGxlcikpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJyZXR1cm4gcHJvY2Vzc29yOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBmX291dF8gPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIHByb2Nlc3NvciBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHByb2Nlc3NvciBmb3IuCi0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3Nvcih0X3NlcnZpY2UqIHRzZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBzdHlsZSkgewotICBQcm9jZXNzb3JHZW5lcmF0b3IgZ2VuZXJhdG9yKHRoaXMsIHRzZXJ2aWNlLCBzdHlsZSk7Ci0gIGdlbmVyYXRvci5ydW4oKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgYW5kIGhlbHBlcnMgZm9yIGEgZnVuY3Rpb24uCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24KLSAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIHJldHVybjsKLSAgfQotCi0gIHN0ZDo6b2ZzdHJlYW0mIG91dCA9IChnZW5fdGVtcGxhdGVzXyA/IGZfc2VydmljZV90Y2NfIDogZl9zZXJ2aWNlXyk7Ci0KLSAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCB0c2VydmljZS0+Z2V0X25hbWUoKSArICJfIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7Ci0gIHRfZmllbGQgc3VjY2Vzcyh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksICJzdWNjZXNzIiwgMCk7Ci0gIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKLSAgfQotCi0gIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHJlc3VsdC5hcHBlbmQoKmZfaXRlcik7Ci0gIH0KLQotICBnZW5lcmF0ZV9zdHJ1Y3RfZGVjbGFyYXRpb24oZl9oZWFkZXJfLCAmcmVzdWx0LCBmYWxzZSk7Ci0gIGdlbmVyYXRlX3N0cnVjdF9kZWZpbml0aW9uKG91dCwgZl9zZXJ2aWNlXywgJnJlc3VsdCwgZmFsc2UpOwotICBnZW5lcmF0ZV9zdHJ1Y3RfcmVhZGVyKG91dCwgJnJlc3VsdCk7Ci0gIGdlbmVyYXRlX3N0cnVjdF9yZXN1bHRfd3JpdGVyKG91dCwgJnJlc3VsdCk7Ci0KLSAgcmVzdWx0LnNldF9uYW1lKHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIl8iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9wcmVzdWx0Iik7Ci0gIGdlbmVyYXRlX3N0cnVjdF9kZWNsYXJhdGlvbihmX2hlYWRlcl8sICZyZXN1bHQsIGZhbHNlLCB0cnVlLCB0cnVlLCBnZW5fY29iX3N0eWxlXyk7Ci0gIGdlbmVyYXRlX3N0cnVjdF9kZWZpbml0aW9uKG91dCwgZl9zZXJ2aWNlXywgJnJlc3VsdCwgZmFsc2UpOwotICBnZW5lcmF0ZV9zdHJ1Y3RfcmVhZGVyKG91dCwgJnJlc3VsdCwgdHJ1ZSk7Ci0gIGlmIChnZW5fY29iX3N0eWxlXykgewotICAgIGdlbmVyYXRlX3N0cnVjdF93cml0ZXIob3V0LCAmcmVzdWx0LCB0cnVlKTsKLSAgfQotCi19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgcHJvY2VzcyBmdW5jdGlvbiBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHdyaXRlIGEgZGlzcGF0Y2hlciBmb3IKLSAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBzdHlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3BlY2lhbGl6ZWQpIHsKLSAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0gIHN0cmluZyBzZXJ2aWNlX2Z1bmNfbmFtZSA9ICJcIiIgKyB0c2VydmljZS0+Z2V0X25hbWUoKSArICIuIiArCi0gICAgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIlwiIjsKLQotICBzdGQ6Om9mc3RyZWFtJiBvdXQgPSAoZ2VuX3RlbXBsYXRlc18gPyBmX3NlcnZpY2VfdGNjXyA6IGZfc2VydmljZV8pOwotCi0gIHN0cmluZyBwcm90X3R5cGUgPQotICAgIChzcGVjaWFsaXplZCA/ICJQcm90b2NvbF8iIDogIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wiKTsKLSAgc3RyaW5nIGNsYXNzX3N1ZmZpeDsKLSAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7Ci0gICAgY2xhc3Nfc3VmZml4ID0gIlQ8UHJvdG9jb2xfPiI7Ci0gIH0KLQotICAvLyBJIHRyaWVkIHRvIGRvIHRoaXMgYXMgb25lIGZ1bmN0aW9uLiAgSSByZWFsbHkgZGlkLiAgQnV0IGl0IHdhcyB0b28gaGFyZC4KLSAgaWYgKHN0eWxlICE9ICJDb2IiKSB7Ci0gICAgLy8gT3BlbiBmdW5jdGlvbgotICAgIGlmIChnZW5fdGVtcGxhdGVzXykgewotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ0ZW1wbGF0ZSA8Y2xhc3MgUHJvdG9jb2xfPiIgPDwgZW5kbDsKLSAgICB9Ci0gICAgY29uc3QgYm9vbCB1bm5hbWVkX29wcm90X3NlcWlkID0gdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJgotICAgICAgIShnZW5fdGVtcGxhdGVzXyAmJiAhc3BlY2lhbGl6ZWQpOwotICAgIG91dCA8PAotICAgICAgInZvaWQgIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiUHJvY2Vzc29yIiA8PCBjbGFzc19zdWZmaXggPDwgIjo6IiA8PAotICAgICAgInByb2Nlc3NfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiIDw8Ci0gICAgICAiaW50MzJfdCIgPDwgKHVubmFtZWRfb3Byb3Rfc2VxaWQgPyAiLCAiIDogIiBzZXFpZCwgIikgPDwKLSAgICAgIHByb3RfdHlwZSA8PCAiKiBpcHJvdCwgIiA8PAotICAgICAgcHJvdF90eXBlIDw8ICIqIiA8PCAodW5uYW1lZF9vcHJvdF9zZXFpZCA/ICIsICIgOiAiIG9wcm90LCAiKSA8PAotICAgICAgInZvaWQqIGNhbGxDb250ZXh0KSIgPDwgZW5kbDsKLSAgICBzY29wZV91cChvdXQpOwotCi0gICAgc3RyaW5nIGFyZ3NuYW1lID0gdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiXyIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKwotICAgICAgIl9hcmdzIjsKLSAgICBzdHJpbmcgcmVzdWx0bmFtZSA9IHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIl8iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsKLSAgICAgICJfcmVzdWx0IjsKLQotICAgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF1bm5hbWVkX29wcm90X3NlcWlkKSB7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIih2b2lkKSBzZXFpZDsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIih2b2lkKSBvcHJvdDsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAidm9pZCogY3R4ID0gTlVMTDsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJpZiAodGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSAhPSBOVUxMKSB7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICBjdHggPSB0aGlzLT5ldmVudEhhbmRsZXJfLT5nZXRDb250ZXh0KCIgPDwKLSAgICAgICAgc2VydmljZV9mdW5jX25hbWUgPDwgIiwgY2FsbENvbnRleHQpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICI6OmFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yQ29udGV4dEZyZWVyIGZyZWVyKCIgPDwKLSAgICAgICAgInRoaXMtPmV2ZW50SGFuZGxlcl8uZ2V0KCksIGN0eCwgIiA8PCBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiKTsiIDw8Ci0gICAgICAgIGVuZGwgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImlmICh0aGlzLT5ldmVudEhhbmRsZXJfLmdldCgpICE9IE5VTEwpIHsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHRoaXMtPmV2ZW50SGFuZGxlcl8tPnByZVJlYWQoY3R4LCAiIDw8Ci0gICAgICAgIHNlcnZpY2VfZnVuY19uYW1lIDw8ICIpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgYXJnc25hbWUgPDwgIiBhcmdzOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImFyZ3MucmVhZChpcHJvdCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaXByb3QtPnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAidWludDMyX3QgYnl0ZXMgPSBpcHJvdC0+Z2V0VHJhbnNwb3J0KCktPnJlYWRFbmQoKTsiIDw8Ci0gICAgICAgIGVuZGwgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImlmICh0aGlzLT5ldmVudEhhbmRsZXJfLmdldCgpICE9IE5VTEwpIHsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHRoaXMtPmV2ZW50SGFuZGxlcl8tPnBvc3RSZWFkKGN0eCwgIiA8PAotICAgICAgICBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiLCBieXRlcyk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgZW5kbDsKLQotICAgIC8vIERlY2xhcmUgcmVzdWx0Ci0gICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgcmVzdWx0bmFtZSA8PCAiIHJlc3VsdDsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgLy8gVHJ5IGJsb2NrIGZvciBmdW5jdGlvbnMgd2l0aCBleGNlcHRpb25zCi0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAidHJ5IHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICAvLyBHZW5lcmF0ZSB0aGUgZnVuY3Rpb24gY2FsbAotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIG91dCA8PCBpbmRlbnQoKTsKLSAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICBpZiAoaXNfY29tcGxleF90eXBlKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSkpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgb3V0IDw8ICJpZmFjZV8tPiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIocmVzdWx0LnN1Y2Nlc3MiOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0IDw8ICJyZXN1bHQuc3VjY2VzcyA9IGlmYWNlXy0+IiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgImlmYWNlXy0+IiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiOwotICAgIH0KLSAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgIiwgIjsKLSAgICAgIH0KLSAgICAgIG91dCA8PCAiYXJncy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICB9Ci0gICAgb3V0IDw8ICIpOyIgPDwgZW5kbDsKLQotICAgIC8vIFNldCBpc3NldCBvbiBzdWNjZXNzIGZpZWxkCi0gICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJyZXN1bHQuX19pc3NldC5zdWNjZXNzID0gdHJ1ZTsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iOwotCi0gICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgICBvdXQgPDwgIiBjYXRjaCAoIiA8PCB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiICYiIDw8Ci0gICAgICAgICAgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgICAgICAgIGluZGVudF91cCgpOwotICAgICAgICAgIG91dCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgInJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PAotICAgICAgICAgICAgICAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICJyZXN1bHQuX19pc3NldC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PAotICAgICAgICAgICAgICAiID0gdHJ1ZTsiIDw8IGVuZGw7Ci0gICAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIG91dCA8PCAifSI7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICAgICBvdXQgPDwgIiBjYXRjaCAoY29uc3Qgc3RkOjpleGNlcHRpb24mIGUpIHsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgICBvdXQgPDwgIiBjYXRjaCAoY29uc3Qgc3RkOjpleGNlcHRpb24mKSB7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIGluZGVudF91cCgpOwotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgImlmICh0aGlzLT5ldmVudEhhbmRsZXJfLmdldCgpICE9IE5VTEwpIHsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHRoaXMtPmV2ZW50SGFuZGxlcl8tPmhhbmRsZXJFcnJvcihjdHgsICIgPDwKLSAgICAgICAgc2VydmljZV9mdW5jX25hbWUgPDwgIik7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLQotICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgICAgb3V0IDw8Ci0gICAgICAgIGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB4KGUud2hhdCgpKTsiIDw8Ci0gICAgICAgICAgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAib3Byb3QtPndyaXRlTWVzc2FnZUJlZ2luKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwKLSAgICAgICAgICAiXCIsIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0VYQ0VQVElPTiwgc2VxaWQpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAieC53cml0ZShvcHJvdCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJvcHJvdC0+d3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJvcHJvdC0+Z2V0VHJhbnNwb3J0KCktPndyaXRlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJvcHJvdC0+Z2V0VHJhbnNwb3J0KCktPmZsdXNoKCk7IiA8PCBlbmRsOwotICAgIH0KLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIC8vIFNob3J0Y3V0IG91dCBoZXJlIGZvciBvbmV3YXkgZnVuY3Rpb25zCi0gICAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKHRoaXMtPmV2ZW50SGFuZGxlcl8uZ2V0KCkgIT0gTlVMTCkgeyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICB0aGlzLT5ldmVudEhhbmRsZXJfLT5hc3luY0NvbXBsZXRlKGN0eCwgIiA8PAotICAgICAgICAgIHNlcnZpY2VfZnVuY19uYW1lIDw8ICIpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJyZXR1cm47IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIG91dCA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgICBlbmRsOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVzdWx0IGludG8gYSBzdHJ1Y3QKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJpZiAodGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSAhPSBOVUxMKSB7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICB0aGlzLT5ldmVudEhhbmRsZXJfLT5wcmVXcml0ZShjdHgsICIgPDwKLSAgICAgICAgc2VydmljZV9mdW5jX25hbWUgPDwgIik7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAib3Byb3QtPndyaXRlTWVzc2FnZUJlZ2luKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwKLSAgICAgICAgIlwiLCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9SRVBMWSwgc2VxaWQpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgInJlc3VsdC53cml0ZShvcHJvdCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAib3Byb3QtPndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImJ5dGVzID0gb3Byb3QtPmdldFRyYW5zcG9ydCgpLT53cml0ZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIm9wcm90LT5nZXRUcmFuc3BvcnQoKS0+Zmx1c2goKTsiIDw8IGVuZGwgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImlmICh0aGlzLT5ldmVudEhhbmRsZXJfLmdldCgpICE9IE5VTEwpIHsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHRoaXMtPmV2ZW50SGFuZGxlcl8tPnBvc3RXcml0ZShjdHgsICIgPDwKLSAgICAgICAgc2VydmljZV9mdW5jX25hbWUgPDwgIiwgYnl0ZXMpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgICAvLyBDbG9zZSBmdW5jdGlvbgotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgICBvdXQgPDwgZW5kbDsKLSAgfQotCi0gIC8vIENvYiBzdHlsZS4KLSAgZWxzZSB7Ci0gICAgLy8gUHJvY2Vzc29yIGVudHJ5IHBvaW50LgotICAgIC8vIFRPRE8oZWRoYWxsKSB1cGRhdGUgZm9yIGNhbGxDb250ZXh0IHdoZW4gVEV2ZW50U2VydmVyIGlzIHJlYWR5Ci0gICAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInRlbXBsYXRlIDxjbGFzcyBQcm90b2NvbF8+IiA8PCBlbmRsOwotICAgIH0KLSAgICBvdXQgPDwKLSAgICAgICJ2b2lkICIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIkFzeW5jUHJvY2Vzc29yIiA8PCBjbGFzc19zdWZmaXggPDwKLSAgICAgICI6OnByb2Nlc3NfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwKLSAgICAgICIodGN4eDo6ZnVuY3Rpb248dm9pZChib29sIG9rKT4gY29iLCBpbnQzMl90IHNlcWlkLCAiIDw8Ci0gICAgICBwcm90X3R5cGUgPDwgIiogaXByb3QsICIgPDwgcHJvdF90eXBlIDw8ICIqIG9wcm90KSIgPDwgZW5kbDsKLSAgICBzY29wZV91cChvdXQpOwotCi0gICAgLy8gVE9ETyhzaW1wa2lucyk6IHdlIGNvdWxkIHRyeSB0byBjb25zb2xkYXRlIHRoaXMKLSAgICAvLyB3aXRoIHRoZSBub24tY29iIGNvZGUgYWJvdmUKLSAgICBpZiAoZ2VuX3RlbXBsYXRlc18gJiYgIXNwZWNpYWxpemVkKSB7Ci0gICAgICAvLyBJZiB0aGVzZSBhcmUgaW5zdGFuY2VzIG9mIFByb3RvY29sXywgaW5zdGVhZCBvZiBhbnkgb2xkIFRQcm90b2NvbCwKLSAgICAgIC8vIHVzZSB0aGUgc3BlY2lhbGl6ZWQgcHJvY2VzcyBmdW5jdGlvbiBpbnN0ZWFkLgotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJQcm90b2NvbF8qIF9pcHJvdCA9IGR5bmFtaWNfY2FzdDxQcm90b2NvbF8qPihpcHJvdCk7IiA8PAotICAgICAgICBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJQcm90b2NvbF8qIF9vcHJvdCA9IGR5bmFtaWNfY2FzdDxQcm90b2NvbF8qPihvcHJvdCk7IiA8PAotICAgICAgICBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiAoX2lwcm90ICYmIF9vcHJvdCkgeyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gcHJvY2Vzc18iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PAotICAgICAgICAiKGNvYiwgc2VxaWQsIF9pcHJvdCwgX29wcm90KTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIlRfR0VORVJJQ19QUk9UT0NPTCh0aGlzLCBpcHJvdCwgX2lwcm90KTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIlRfR0VORVJJQ19QUk9UT0NPTCh0aGlzLCBvcHJvdCwgX29wcm90KTsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIodm9pZCkgc2VxaWQ7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIodm9pZCkgb3Byb3Q7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiXyIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwKLSAgICAgICAgIl9hcmdzIGFyZ3M7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAidm9pZCogY3R4ID0gTlVMTDsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJpZiAodGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSAhPSBOVUxMKSB7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICBjdHggPSB0aGlzLT5ldmVudEhhbmRsZXJfLT5nZXRDb250ZXh0KCIgPDwKLSAgICAgICAgc2VydmljZV9mdW5jX25hbWUgPDwgIiwgTlVMTCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3JDb250ZXh0RnJlZXIgZnJlZXIoIiA8PAotICAgICAgICAidGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSwgY3R4LCAiIDw8IHNlcnZpY2VfZnVuY19uYW1lIDw8ICIpOyIgPDwKLSAgICAgICAgZW5kbCA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAidHJ5IHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWYgKHRoaXMtPmV2ZW50SGFuZGxlcl8uZ2V0KCkgIT0gTlVMTCkgeyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgdGhpcy0+ZXZlbnRIYW5kbGVyXy0+cHJlUmVhZChjdHgsICIgPDwKLSAgICAgICAgc2VydmljZV9mdW5jX25hbWUgPDwgIik7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImFyZ3MucmVhZChpcHJvdCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaXByb3QtPnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAidWludDMyX3QgYnl0ZXMgPSBpcHJvdC0+Z2V0VHJhbnNwb3J0KCktPnJlYWRFbmQoKTsiIDw8Ci0gICAgICAgIGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJpZiAodGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSAhPSBOVUxMKSB7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICB0aGlzLT5ldmVudEhhbmRsZXJfLT5wb3N0UmVhZChjdHgsICIgPDwKLSAgICAgICAgc2VydmljZV9mdW5jX25hbWUgPDwgIiwgYnl0ZXMpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgc2NvcGVfZG93bihvdXQpOwotCi0gICAgLy8gVE9ETyhkcmVpc3MpOiBIYW5kbGUgVEV4Y2VwdGlvbnM/ICBFeHBvc2UgdG8gc2VydmVyPwotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgImNhdGNoIChjb25zdCBzdGQ6OmV4Y2VwdGlvbiYpIHsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIGlmICh0aGlzLT5ldmVudEhhbmRsZXJfLmdldCgpICE9IE5VTEwpIHsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgICAgdGhpcy0+ZXZlbnRIYW5kbGVyXy0+aGFuZGxlckVycm9yKGN0eCwgIiA8PAotICAgICAgICBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiBjb2IoZmFsc2UpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiAodGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSAhPSBOVUxMKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIHRoaXMtPmV2ZW50SGFuZGxlcl8tPmFzeW5jQ29tcGxldGUoY3R4LCAiIDw8Ci0gICAgICAgICAgc2VydmljZV9mdW5jX25hbWUgPDwgIik7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0KLSAgICAvLyBUT0RPKGRyZWlzcyk6IEZpZ3VyZSBvdXQgYSBzdHJhdGVneSBmb3IgZXhjZXB0aW9ucyBpbiBhc3luYyBoYW5kbGVycy4KLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJmcmVlci51bnJlZ2lzdGVyKCk7IiA8PCBlbmRsOwotICAgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgICAvLyBObyByZXR1cm4uICBKdXN0IGhhbmQgb2ZmIG91ciBjb2IuCi0gICAgICAvLyBUT0RPKGRyZWlzcyk6IENhbGwgdGhlIGNvYiBpbW1lZGlhdGVseT8KLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaWZhY2VfLT4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCIgPDwKLSAgICAgICAgInRjeHg6OmJpbmQoY29iLCB0cnVlKSIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOyBpbmRlbnRfdXAoKTsKLSAgICB9IGVsc2UgewotICAgICAgc3RyaW5nIHJldF9hcmcsIHJldF9wbGFjZWhvbGRlcjsKLSAgICAgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgcmV0X2FyZyA9ICIsIGNvbnN0ICIgKyB0eXBlX25hbWUodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKSArCi0gICAgICAgICAgIiYgX3JldHVybiI7Ci0gICAgICAgIHJldF9wbGFjZWhvbGRlciA9ICIsIHRjeHg6OnBsYWNlaG9sZGVyczo6XzEiOwotICAgICAgfQotCi0gICAgICAvLyBXaGVuIGdlbl90ZW1wbGF0ZXNfIGlzIHRydWUsIHRoZSByZXR1cm5fIGFuZCB0aHJvd18gZnVuY3Rpb25zIGFyZQotICAgICAgLy8gb3ZlcmxvYWRlZC4gIFdlIGhhdmUgdG8gZGVjbGFyZSBwb2ludGVycyB0byB0aGVtIHNvIHRoYXQgdGhlIGNvbXBpbGVyCi0gICAgICAvLyBjYW4gcmVzb2x2ZSB0aGUgY29ycmVjdCBvdmVybG9hZGVkIHZlcnNpb24uCi0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInZvaWQgKCIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIkFzeW5jUHJvY2Vzc29yIiA8PAotICAgICAgICBjbGFzc19zdWZmaXggPDwgIjo6KnJldHVybl9mbikodGN4eDo6ZnVuY3Rpb248dm9pZChib29sIG9rKT4gIiA8PAotICAgICAgICAiY29iLCBpbnQzMl90IHNlcWlkLCAiIDw8IHByb3RfdHlwZSA8PCAiKiBvcHJvdCwgdm9pZCogY3R4IiA8PAotICAgICAgICByZXRfYXJnIDw8ICIpID0iIDw8IGVuZGw7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgJiIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIkFzeW5jUHJvY2Vzc29yIiA8PAotICAgICAgICBjbGFzc19zdWZmaXggPDwgIjo6cmV0dXJuXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOwotICAgICAgaWYgKCF4Y2VwdGlvbnMuZW1wdHkoKSkgewotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAidm9pZCAoIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiQXN5bmNQcm9jZXNzb3IiIDw8Ci0gICAgICAgICAgY2xhc3Nfc3VmZml4IDw8ICI6Oip0aHJvd19mbikodGN4eDo6ZnVuY3Rpb248dm9pZChib29sIG9rKT4gIiA8PAotICAgICAgICAgICJjb2IsIGludDMyX3Qgc2VxaWQsICIgPDwgcHJvdF90eXBlIDw8ICIqIG9wcm90LCB2b2lkKiBjdHgsICIgPDwKLSAgICAgICAgICAiOjphcGFjaGU6OnRocmlmdDo6VERlbGF5ZWRFeGNlcHRpb24qIF90aHJvdykgPSIgPDwgZW5kbDsKLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgJiIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIkFzeW5jUHJvY2Vzc29yIiA8PAotICAgICAgICAgIGNsYXNzX3N1ZmZpeCA8PCAiOjp0aHJvd18iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZmFjZV8tPiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7IGluZGVudF91cCgpOwotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ0Y3h4OjpiaW5kKHJldHVybl9mbiwgdGhpcywgY29iLCBzZXFpZCwgb3Byb3QsIGN0eCIgPDwKLSAgICAgICAgcmV0X3BsYWNlaG9sZGVyIDw8ICIpIjsKLSAgICAgIGlmICgheGNlcHRpb25zLmVtcHR5KCkpIHsKLSAgICAgICAgb3V0Ci0gICAgICAgICAgPDwgJywnIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAidGN4eDo6YmluZCh0aHJvd19mbiwgdGhpcywgY29iLCBzZXFpZCwgb3Byb3QsICIgPDwKLSAgICAgICAgICAiY3R4LCB0Y3h4OjpwbGFjZWhvbGRlcnM6Ol8xKSI7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gWFhYIFdoaXRlc3BhY2UgY2xlYW51cC4KLSAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgb3V0Ci0gICAgICAgICAgICAgICAgIDw8ICcsJyA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJhcmdzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIH0KLSAgICBvdXQgPDwgIik7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7IGluZGVudF9kb3duKCk7Ci0gICAgc2NvcGVfZG93bihvdXQpOwotICAgIG91dCA8PCBlbmRsOwotCi0gICAgLy8gTm9ybWFsIHJldHVybi4KLSAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICAgIHN0cmluZyByZXRfYXJnX2RlY2wsIHJldF9hcmdfbmFtZTsKLSAgICAgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgcmV0X2FyZ19kZWNsID0gIiwgY29uc3QgIiArIHR5cGVfbmFtZSh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpICsKLSAgICAgICAgICAiJiBfcmV0dXJuIjsKLSAgICAgICAgcmV0X2FyZ19uYW1lID0gIiwgX3JldHVybiI7Ci0gICAgICB9Ci0gICAgICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgInRlbXBsYXRlIDxjbGFzcyBQcm90b2NvbF8+IiA8PCBlbmRsOwotICAgICAgfQotICAgICAgb3V0IDw8Ci0gICAgICAgICJ2b2lkICIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIkFzeW5jUHJvY2Vzc29yIiA8PCBjbGFzc19zdWZmaXggPDwKLSAgICAgICAgIjo6cmV0dXJuXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8Ci0gICAgICAgICIodGN4eDo6ZnVuY3Rpb248dm9pZChib29sIG9rKT4gY29iLCBpbnQzMl90IHNlcWlkLCAiIDw8Ci0gICAgICAgIHByb3RfdHlwZSA8PCAiKiBvcHJvdCwgdm9pZCogY3R4IiA8PCByZXRfYXJnX2RlY2wgPDwgJyknIDw8IGVuZGw7Ci0gICAgICBzY29wZV91cChvdXQpOwotCi0gICAgICBpZiAoZ2VuX3RlbXBsYXRlc18gJiYgIXNwZWNpYWxpemVkKSB7Ci0gICAgICAgIC8vIElmIG9wcm90IGlzIGEgUHJvdG9jb2xfIGluc3RhbmNlLAotICAgICAgICAvLyB1c2UgdGhlIHNwZWNpYWxpemVkIHJldHVybiBmdW5jdGlvbiBpbnN0ZWFkLgotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiUHJvdG9jb2xfKiBfb3Byb3QgPSBkeW5hbWljX2Nhc3Q8UHJvdG9jb2xfKj4ob3Byb3QpOyIgPDwKLSAgICAgICAgICBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImlmIChfb3Byb3QpIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gcmV0dXJuXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8Ci0gICAgICAgICAgIihjb2IsIHNlcWlkLCBfb3Byb3QsIGN0eCIgPDwgcmV0X2FyZ19uYW1lIDw8ICIpOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIlRfR0VORVJJQ19QUk9UT0NPTCh0aGlzLCBvcHJvdCwgX29wcm90KTsiIDw8Ci0gICAgICAgICAgZW5kbCA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIl8iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PAotICAgICAgICAgICJfcHJlc3VsdCByZXN1bHQ7IiA8PCBlbmRsOwotICAgICAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICAvLyBUaGUgY29uc3RfY2FzdCBoZXJlIGlzIHVuZm9ydHVuYXRlLCBidXQgaXQgd291bGQgYmUgYSBwYWluIHRvIGF2b2lkLAotICAgICAgICAvLyBhbmQgd2Ugb25seSBkbyBhIHdyaXRlIHdpdGggdGhpcyBzdHJ1Y3QsIHdoaWNoIGlzIGNvbnN0LXNhZmUuCi0gICAgICAgIG91dCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJyZXN1bHQuc3VjY2VzcyA9IGNvbnN0X2Nhc3Q8IiA8PAotICAgICAgICAgICAgdHlwZV9uYW1lKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSkgPDwgIio+KCZfcmV0dXJuKTsiIDw8Ci0gICAgICAgICAgICBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgInJlc3VsdC5fX2lzc2V0LnN1Y2Nlc3MgPSB0cnVlOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVzdWx0IGludG8gYSBzdHJ1Y3QKLSAgICAgIG91dCA8PAotICAgICAgICBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiAodGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSAhPSBOVUxMKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIGN0eCA9IHRoaXMtPmV2ZW50SGFuZGxlcl8tPmdldENvbnRleHQoIiA8PAotICAgICAgICAgIHNlcnZpY2VfZnVuY19uYW1lIDw8ICIsIE5VTEwpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiOjphcGFjaGU6OnRocmlmdDo6VFByb2Nlc3NvckNvbnRleHRGcmVlciBmcmVlcigiIDw8Ci0gICAgICAgICAgInRoaXMtPmV2ZW50SGFuZGxlcl8uZ2V0KCksIGN0eCwgIiA8PCBzZXJ2aWNlX2Z1bmNfbmFtZSA8PAotICAgICAgICAgICIpOyIgPDwgZW5kbCA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiAodGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSAhPSBOVUxMKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIHRoaXMtPmV2ZW50SGFuZGxlcl8tPnByZVdyaXRlKGN0eCwgIiA8PAotICAgICAgICAgIHNlcnZpY2VfZnVuY19uYW1lIDw8ICIpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJvcHJvdC0+d3JpdGVNZXNzYWdlQmVnaW4oXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PAotICAgICAgICAgICJcIiwgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfUkVQTFksIHNlcWlkKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInJlc3VsdC53cml0ZShvcHJvdCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJvcHJvdC0+d3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ1aW50MzJfdCBieXRlcyA9IG9wcm90LT5nZXRUcmFuc3BvcnQoKS0+d3JpdGVFbmQoKTsiIDw8Ci0gICAgICAgICAgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAib3Byb3QtPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKHRoaXMtPmV2ZW50SGFuZGxlcl8uZ2V0KCkgIT0gTlVMTCkgeyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICB0aGlzLT5ldmVudEhhbmRsZXJfLT5wb3N0V3JpdGUoY3R4LCAiIDw8Ci0gICAgICAgICAgc2VydmljZV9mdW5jX25hbWUgPDwgIiwgYnl0ZXMpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAicmV0dXJuIGNvYih0cnVlKTsiIDw8IGVuZGw7Ci0gICAgICBzY29wZV9kb3duKG91dCk7Ci0gICAgICBvdXQgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICAvLyBFeGNlcHRpb24gcmV0dXJuLgotICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAheGNlcHRpb25zLmVtcHR5KCkpIHsKLSAgICAgIGlmIChnZW5fdGVtcGxhdGVzXykgewotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAidGVtcGxhdGUgPGNsYXNzIFByb3RvY29sXz4iIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgICBvdXQgPDwKLSAgICAgICAgInZvaWQgIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiQXN5bmNQcm9jZXNzb3IiIDw8IGNsYXNzX3N1ZmZpeCA8PAotICAgICAgICAiOjp0aHJvd18iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PAotICAgICAgICAiKHRjeHg6OmZ1bmN0aW9uPHZvaWQoYm9vbCBvayk+IGNvYiwgaW50MzJfdCBzZXFpZCwgIiA8PAotICAgICAgICBwcm90X3R5cGUgPDwgIiogb3Byb3QsIHZvaWQqIGN0eCwgIiA8PAotICAgICAgICAiOjphcGFjaGU6OnRocmlmdDo6VERlbGF5ZWRFeGNlcHRpb24qIF90aHJvdykiIDw8IGVuZGw7Ci0gICAgICBzY29wZV91cChvdXQpOwotCi0gICAgICBpZiAoZ2VuX3RlbXBsYXRlc18gJiYgIXNwZWNpYWxpemVkKSB7Ci0gICAgICAgIC8vIElmIG9wcm90IGlzIGEgUHJvdG9jb2xfIGluc3RhbmNlLAotICAgICAgICAvLyB1c2UgdGhlIHNwZWNpYWxpemVkIHRocm93IGZ1bmN0aW9uIGluc3RlYWQuCi0gICAgICAgIG91dCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJQcm90b2NvbF8qIF9vcHJvdCA9IGR5bmFtaWNfY2FzdDxQcm90b2NvbF8qPihvcHJvdCk7IiA8PAotICAgICAgICAgIGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKF9vcHJvdCkgeyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiB0aHJvd18iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PAotICAgICAgICAgICIoY29iLCBzZXFpZCwgX29wcm90LCBjdHgsIF90aHJvdyk7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiVF9HRU5FUklDX1BST1RPQ09MKHRoaXMsIG9wcm90LCBfb3Byb3QpOyIgPDwKLSAgICAgICAgICBlbmRsIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIC8vIEdldCB0aGUgZXZlbnQgaGFuZGxlciBjb250ZXh0Ci0gICAgICBvdXQgPDwKLSAgICAgICAgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKHRoaXMtPmV2ZW50SGFuZGxlcl8uZ2V0KCkgIT0gTlVMTCkgeyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBjdHggPSB0aGlzLT5ldmVudEhhbmRsZXJfLT5nZXRDb250ZXh0KCIgPDwKLSAgICAgICAgICBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiLCBOVUxMKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3JDb250ZXh0RnJlZXIgZnJlZXIoIiA8PAotICAgICAgICAgICJ0aGlzLT5ldmVudEhhbmRsZXJfLmdldCgpLCBjdHgsICIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIik7IiA8PAotICAgICAgICAgIGVuZGwgPDwgZW5kbDsKLQotICAgICAgLy8gVGhyb3cgdGhlIFREZWxheWVkRXhjZXB0aW9uLCBhbmQgY2F0Y2ggdGhlIHJlc3VsdAotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICJfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwKLSAgICAgICAgICAiX3Jlc3VsdCByZXN1bHQ7IiA8PCBlbmRsIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInRyeSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIl90aHJvdy0+dGhyb3dfaXQoKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInJldHVybiBjb2IoZmFsc2UpOyIgPDwgZW5kbDsgIC8vIElzIHRoaXMgcG9zc2libGU/ICBUQkQuCi0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICd9JzsKLSAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgICAgIG91dCA8PCAiICBjYXRjaCAoIiA8PCB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiICYiIDw8Ci0gICAgICAgICAgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF91cCgpOwotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAicmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8Ci0gICAgICAgICAgICAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAicmVzdWx0Ll9faXNzZXQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwKLSAgICAgICAgICAgICIgPSB0cnVlOyIgPDwgZW5kbDsKLSAgICAgICAgc2NvcGVfZG93bihvdXQpOwotICAgICAgfQotCi0gICAgICAvLyBIYW5kbGUgdGhlIGNhc2Ugd2hlcmUgYW4gdW5kZWNsYXJlZCBleGNlcHRpb24gaXMgdGhyb3duCi0gICAgICBvdXQgPDwgIiBjYXRjaCAoc3RkOjpleGNlcHRpb24mIGUpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKHRoaXMtPmV2ZW50SGFuZGxlcl8uZ2V0KCkgIT0gTlVMTCkgeyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICB0aGlzLT5ldmVudEhhbmRsZXJfLT5oYW5kbGVyRXJyb3IoY3R4LCAiIDw8Ci0gICAgICAgICAgc2VydmljZV9mdW5jX25hbWUgPDwgIik7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICAgIGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB4KGUud2hhdCgpKTsiIDw8Ci0gICAgICAgICAgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAib3Byb3QtPndyaXRlTWVzc2FnZUJlZ2luKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwKLSAgICAgICAgICAiXCIsIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0VYQ0VQVElPTiwgc2VxaWQpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAieC53cml0ZShvcHJvdCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJvcHJvdC0+d3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJvcHJvdC0+Z2V0VHJhbnNwb3J0KCktPndyaXRlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJvcHJvdC0+Z2V0VHJhbnNwb3J0KCktPmZsdXNoKCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIC8vIFdlIHBhc3MgdHJ1ZSB0byB0aGUgY29iIGhlcmUsIHNpbmNlIHdlIGRpZCBzdWNjZXNzZnVsbHkgd3JpdGUgYQotICAgICAgICAvLyByZXNwb25zZSwgZXZlbiB0aG91Z2ggaXQgaXMgYW4gZXhjZXB0aW9uIHJlc3BvbnNlLgotICAgICAgICAvLyBJdCBsb29rcyBsaWtlIHRoZSBhcmd1bWVudCBpcyBjdXJyZW50bHkgaWdub3JlZCwgYW55d2F5LgotICAgICAgICBpbmRlbnQoKSA8PCAicmV0dXJuIGNvYih0cnVlKTsiIDw8IGVuZGw7Ci0gICAgICBzY29wZV9kb3duKG91dCk7Ci0KLSAgICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVzdWx0IGludG8gYSBzdHJ1Y3QKLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKHRoaXMtPmV2ZW50SGFuZGxlcl8uZ2V0KCkgIT0gTlVMTCkgeyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICB0aGlzLT5ldmVudEhhbmRsZXJfLT5wcmVXcml0ZShjdHgsICIgPDwKLSAgICAgICAgICBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAib3Byb3QtPndyaXRlTWVzc2FnZUJlZ2luKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwKLSAgICAgICAgICAiXCIsIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1JFUExZLCBzZXFpZCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJyZXN1bHQud3JpdGUob3Byb3QpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAib3Byb3QtPndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAidWludDMyX3QgYnl0ZXMgPSBvcHJvdC0+Z2V0VHJhbnNwb3J0KCktPndyaXRlRW5kKCk7IiA8PAotICAgICAgICAgIGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIm9wcm90LT5nZXRUcmFuc3BvcnQoKS0+Zmx1c2goKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlmICh0aGlzLT5ldmVudEhhbmRsZXJfLmdldCgpICE9IE5VTEwpIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgdGhpcy0+ZXZlbnRIYW5kbGVyXy0+cG9zdFdyaXRlKGN0eCwgIiA8PAotICAgICAgICAgIHNlcnZpY2VfZnVuY19uYW1lIDw8ICIsIGJ5dGVzKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInJldHVybiBjb2IodHJ1ZSk7IiA8PCBlbmRsOwotICAgICAgc2NvcGVfZG93bihvdXQpOwotICAgICAgb3V0IDw8IGVuZGw7Ci0gICAgfSAvLyBmb3IgZWFjaCBmdW5jdGlvbgotICB9IC8vIGNvYiBzdHlsZQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNrZWxldG9uIGZpbGUgb2YgYSBzZXJ2ZXIKLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9za2VsZXRvbih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBzdmNuYW1lID0gdHNlcnZpY2UtPmdldF9uYW1lKCk7Ci0KLSAgLy8gU2VydmljZSBpbXBsZW1lbnRhdGlvbiBmaWxlIGluY2x1ZGVzCi0gIHN0cmluZyBmX3NrZWxldG9uX25hbWUgPSBnZXRfb3V0X2RpcigpK3N2Y25hbWUrIl9zZXJ2ZXIuc2tlbGV0b24uY3BwIjsKLQotICBzdHJpbmcgbnMgPSBuYW1lc3BhY2VfcHJlZml4KHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZXNwYWNlKCJjcHAiKSk7Ci0KLSAgb2ZzdHJlYW0gZl9za2VsZXRvbjsKLSAgZl9za2VsZXRvbi5vcGVuKGZfc2tlbGV0b25fbmFtZS5jX3N0cigpKTsKLSAgZl9za2VsZXRvbiA8PAotICAgICIvLyBUaGlzIGF1dG9nZW5lcmF0ZWQgc2tlbGV0b24gZmlsZSBpbGx1c3RyYXRlcyBob3cgdG8gYnVpbGQgYSBzZXJ2ZXIuIiA8PCBlbmRsIDw8Ci0gICAgIi8vIFlvdSBzaG91bGQgY29weSBpdCB0byBhbm90aGVyIGZpbGVuYW1lIHRvIGF2b2lkIG92ZXJ3cml0aW5nIGl0LiIgPDwgZW5kbCA8PAotICAgIGVuZGwgPDwKLSAgICAiI2luY2x1ZGUgXCIiIDw8IGdldF9pbmNsdWRlX3ByZWZpeCgqZ2V0X3Byb2dyYW0oKSkgPDwgc3ZjbmFtZSA8PCAiLmhcIiIgPDwgZW5kbCA8PAotICAgICIjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPiIgPDwgZW5kbCA8PAotICAgICIjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UU2ltcGxlU2VydmVyLmg+IiA8PCBlbmRsIDw8Ci0gICAgIiNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuaD4iIDw8IGVuZGwgPDwKLSAgICAiI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4iIDw8IGVuZGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgInVzaW5nIG5hbWVzcGFjZSA6OmFwYWNoZTo6dGhyaWZ0OyIgPDwgZW5kbCA8PAotICAgICJ1c2luZyBuYW1lc3BhY2UgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w7IiA8PCBlbmRsIDw8Ci0gICAgInVzaW5nIG5hbWVzcGFjZSA6OmFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7IiA8PCBlbmRsIDw8Ci0gICAgInVzaW5nIG5hbWVzcGFjZSA6OmFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXI7IiA8PCBlbmRsIDw8Ci0gICAgZW5kbCA8PAotICAgICJ1c2luZyBib29zdDo6c2hhcmVkX3B0cjsiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIC8vIHRoZSBmb2xsb3dpbmcgY29kZSB3b3VsZCBub3QgY29tcGlsZToKLSAgLy8gdXNpbmcgbmFtZXNwYWNlIDsKLSAgLy8gdXNpbmcgbmFtZXNwYWNlIDo6OwotICBpZiAoICghbnMuZW1wdHkoKSkgJiYgKG5zLmNvbXBhcmUoIiA6OiIpICE9IDApKSB7Ci0gICAgZl9za2VsZXRvbiA8PAotICAgICAgInVzaW5nIG5hbWVzcGFjZSAiIDw8IHN0cmluZyhucywgMCwgbnMuc2l6ZSgpLTIpIDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsOwotICB9Ci0KLSAgZl9za2VsZXRvbiA8PAotICAgICJjbGFzcyAiIDw8IHN2Y25hbWUgPDwgIkhhbmRsZXIgOiB2aXJ0dWFsIHB1YmxpYyAiIDw8IHN2Y25hbWUgPDwgIklmIHsiIDw8IGVuZGwgPDwKLSAgICAiIHB1YmxpYzoiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBmX3NrZWxldG9uIDw8Ci0gICAgaW5kZW50KCkgPDwgc3ZjbmFtZSA8PCAiSGFuZGxlcigpIHsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICAvLyBZb3VyIGluaXRpYWxpemF0aW9uIGdvZXMgaGVyZSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9qYXZhX2RvYyhmX3NrZWxldG9uLCAqZl9pdGVyKTsKLSAgICBmX3NrZWxldG9uIDw8Ci0gICAgICBpbmRlbnQoKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlciwgIiIpIDw8ICIgeyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgLy8gWW91ciBpbXBsZW1lbnRhdGlvbiBnb2VzIGhlcmUiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHByaW50ZihcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcXG5cIik7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgZW5kbDsKLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2tlbGV0b24gPDwKLSAgICAifTsiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIGZfc2tlbGV0b24gPDwKLSAgICBpbmRlbnQoKSA8PCAiaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZl9za2VsZXRvbiA8PAotICAgIGluZGVudCgpIDw8ICJpbnQgcG9ydCA9IDkwOTA7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInNoYXJlZF9wdHI8IiA8PCBzdmNuYW1lIDw8ICJIYW5kbGVyPiBoYW5kbGVyKG5ldyAiIDw8IHN2Y25hbWUgPDwgIkhhbmRsZXIoKSk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yKG5ldyAiIDw8IHN2Y25hbWUgPDwgIlByb2Nlc3NvcihoYW5kbGVyKSk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4gc2VydmVyVHJhbnNwb3J0KG5ldyBUU2VydmVyU29ja2V0KHBvcnQpKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAic2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gdHJhbnNwb3J0RmFjdG9yeShuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSgpKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAic2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnkobmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSk7IiA8PCBlbmRsIDw8Ci0gICAgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJUU2ltcGxlU2VydmVyIHNlcnZlcihwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAic2VydmVyLnNlcnZlKCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInJldHVybiAwOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9za2VsZXRvbiA8PAotICAgICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICAvLyBDbG9zZSB0aGUgZmlsZXMKLSAgZl9za2VsZXRvbi5jbG9zZSgpOwotfQotCi0vKioKLSAqIERlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgc3VmZml4KSB7Ci0gIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLQotICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKwotICAgICAgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkgKyBzdWZmaXg7Ci0KLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIG5hbWUsIGlzX3JlZmVyZW5jZSh0ZmllbGQpKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIG5hbWUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJ4ZmVyICs9IGlwcm90LT4iOwotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICBpZiAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICAgIG91dCA8PCAicmVhZEJpbmFyeSgiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICBvdXQgPDwgInJlYWRTdHJpbmcoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICBvdXQgPDwgInJlYWRCb29sKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgb3V0IDw8ICJyZWFkQnl0ZSgiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgb3V0IDw8ICJyZWFkSTE2KCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICBvdXQgPDwgInJlYWRJMzIoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIG91dCA8PCAicmVhZEk2NCgiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgb3V0IDw8ICJyZWFkRG91YmxlKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gQysrIHJlYWRlciBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpICsgbmFtZTsKLSAgICB9Ci0gICAgb3V0IDw8Ci0gICAgICBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHN0cmluZyB0ID0gdG1wKCJlY2FzdCIpOwotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgImludDMyX3QgIiA8PCB0IDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAieGZlciArPSBpcHJvdC0+cmVhZEkzMigiIDw8IHQgPDwgIik7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCBuYW1lIDw8ICIgPSAoIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIikiIDw8IHQgPDwgIjsiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gREVTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCi0gICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLCB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYW4gdW5zZXJpYWxpemVyIGZvciBhIHZhcmlhYmxlLiBUaGlzIG1ha2VzIHR3byBrZXkgYXNzdW1wdGlvbnMsCi0gKiBmaXJzdCB0aGF0IHRoZXJlIGlzIGEgY29uc3QgY2hhciogdmFyaWFibGUgbmFtZWQgZGF0YSB0aGF0IHBvaW50cyB0byB0aGUKLSAqIGJ1ZmZlciBmb3IgZGVzZXJpYWxpemF0aW9uLCBhbmQgdGhhdCB0aGVyZSBpcyBhIHZhcmlhYmxlIHByb3RvY29sIHdoaWNoCi0gKiBpcyBhIHJlZmVyZW5jZSB0byBhIFRQcm90b2NvbCBzZXJpYWxpemF0aW9uIG9iamVjdC4KLSAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwb2ludGVyKSB7Ci0gIGlmIChwb2ludGVyKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImlmICghIiA8PCBwcmVmaXggPDwgIikgeyAiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgIiA8PCBwcmVmaXggPDwgIiA9IGJvb3N0OjpzaGFyZWRfcHRyPCIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICI+KG5ldyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJ4ZmVyICs9ICIgPDwgcHJlZml4IDw8ICItPnJlYWQoaXByb3QpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiYm9vbCB3YXNTZXQgPSBmYWxzZTsiIDw8IGVuZGw7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICAgIGZvciAoZl9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBmX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKytmX2l0ZXIpIHsKLQotICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IHByZWZpeCA8PCAiLT5fX2lzc2V0LiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIHsgd2FzU2V0ID0gdHJ1ZTsgfSIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50KG91dCkgPDwgImlmICghd2FzU2V0KSB7ICIgPDwgcHJlZml4IDw8ICIucmVzZXQoKTsgfSIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgInhmZXIgKz0gIiA8PCBwcmVmaXggPDwgIi5yZWFkKGlwcm90KTsiIDw8IGVuZGw7Ci0gIH0KLX0KLQotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgc3RyaW5nIHNpemUgPSB0bXAoIl9zaXplIik7Ci0gIHN0cmluZyBrdHlwZSA9IHRtcCgiX2t0eXBlIik7Ci0gIHN0cmluZyB2dHlwZSA9IHRtcCgiX3Z0eXBlIik7Ci0gIHN0cmluZyBldHlwZSA9IHRtcCgiX2V0eXBlIik7Ci0KLSAgdF9jb250YWluZXIqIHRjb250YWluZXIgPSAodF9jb250YWluZXIqKXR0eXBlOwotICBib29sIHVzZV9wdXNoID0gdGNvbnRhaW5lci0+aGFzX2NwcF9uYW1lKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICBwcmVmaXggPDwgIi5jbGVhcigpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ1aW50MzJfdCAiIDw8IHNpemUgPDwgIjsiIDw8IGVuZGw7Ci0KLSAgLy8gRGVjbGFyZSB2YXJpYWJsZXMsIHJlYWQgaGVhZGVyCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFR5cGUgIiA8PCBrdHlwZSA8PCAiOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUVHlwZSAiIDw8IHZ0eXBlIDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAieGZlciArPSBpcHJvdC0+cmVhZE1hcEJlZ2luKCIgPDwKLSAgICAgICAgICAgICAgICAgICBrdHlwZSA8PCAiLCAiIDw8IHZ0eXBlIDw8ICIsICIgPDwgc2l6ZSA8PCAiKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRUeXBlICIgPDwgZXR5cGUgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ4ZmVyICs9IGlwcm90LT5yZWFkU2V0QmVnaW4oIiA8PAotICAgICAgICAgICAgICAgICAgIGV0eXBlIDw8ICIsICIgPDwgc2l6ZSA8PCAiKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUVHlwZSAiIDw8IGV0eXBlIDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAieGZlciArPSBpcHJvdC0+cmVhZExpc3RCZWdpbigiIDw8Ci0gICAgICBldHlwZSA8PCAiLCAiIDw8IHNpemUgPDwgIik7IiA8PCBlbmRsOwotICAgIGlmICghdXNlX3B1c2gpIHsKLSAgICAgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLnJlc2l6ZSgiIDw8IHNpemUgPDwgIik7IiA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0KLSAgLy8gRm9yIGxvb3AgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cwotICBzdHJpbmcgaSA9IHRtcCgiX2kiKTsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgInVpbnQzMl90ICIgPDwgaSA8PCAiOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJmb3IgKCIgPDwgaSA8PCAiID0gMDsgIiA8PCBpIDw8ICIgPCAiIDw8IHNpemUgPDwgIjsgKysiIDw8IGkgPDwgIikiIDw8IGVuZGw7Ci0KLSAgICBzY29wZV91cChvdXQpOwotCi0gICAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBwcmVmaXgpOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIHByZWZpeCk7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgcHJlZml4LCB1c2VfcHVzaCwgaSk7Ci0gICAgfQotCi0gICAgc2NvcGVfZG93bihvdXQpOwotCi0gIC8vIFJlYWQgY29udGFpbmVyIGVuZAotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgInhmZXIgKz0gaXByb3QtPnJlYWRNYXBFbmQoKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgInhmZXIgKz0gaXByb3QtPnJlYWRTZXRFbmQoKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJ4ZmVyICs9IGlwcm90LT5yZWFkTGlzdEVuZCgpOyIgPDwgZW5kbDsKLSAgfQotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLX0KLQotCi0vKioKLSAqIEdlbmVyYXRlcyBjb2RlIHRvIGRlc2VyaWFsaXplIGEgbWFwCi0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgc3RyaW5nIGtleSA9IHRtcCgiX2tleSIpOwotICBzdHJpbmcgdmFsID0gdG1wKCJfdmFsIik7Ci0gIHRfZmllbGQgZmtleSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KTsKLSAgdF9maWVsZCBmdmFsKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2YWwpOwotCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8IGRlY2xhcmVfZmllbGQoJmZrZXkpIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmtleSk7Ci0gIGluZGVudChvdXQpIDw8Ci0gICAgZGVjbGFyZV9maWVsZCgmZnZhbCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgdHJ1ZSkgPDwgIiA9ICIgPDwKLSAgICBwcmVmaXggPDwgIlsiIDw8IGtleSA8PCAiXTsiIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnZhbCk7Ci19Ci0KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0c2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7Ci0gIHRfZmllbGQgZmVsZW0odHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgIGRlY2xhcmVfZmllbGQoJmZlbGVtKSA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgIHByZWZpeCA8PCAiLmluc2VydCgiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOwotfQotCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdXNlX3B1c2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpbmRleCkgewotICBpZiAodXNlX3B1c2gpIHsKLSAgICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKLSAgICB0X2ZpZWxkIGZlbGVtKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOwotICAgIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZlbGVtKSA8PCBlbmRsOwotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKLSAgICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi5wdXNoX2JhY2soIiA8PCBlbGVtIDw8ICIpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICB0X2ZpZWxkIGZlbGVtKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIHByZWZpeCArICJbIiArIGluZGV4ICsgIl0iKTsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7Ci0gIH0KLX0KLQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCB0byBzZXJpYWxpemUKLSAqIEBwYXJhbSBwcmVmaXggTmFtZSB0byBwcmVwZW5kIHRvIGZpZWxkIG5hbWUKLSAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBzdWZmaXgpIHsKLSAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOwotCi0gIHN0cmluZyBuYW1lID0gcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpICsgc3VmZml4OwotCi0gIC8vIERvIG5vdGhpbmcgZm9yIHZvaWQgdHlwZXMKLSAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgewotICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIG5hbWU7Ci0gIH0KLQotCi0KLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0X3N0cnVjdCopdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19yZWZlcmVuY2UodGZpZWxkKSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbmFtZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7Ci0KLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgInhmZXIgKz0gb3Byb3QtPiI7Ci0KLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgdGhyb3cKLSAgICAgICAgICAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIGlmICgoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgICAgICBvdXQgPDwgIndyaXRlQmluYXJ5KCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgIG91dCA8PCAid3JpdGVTdHJpbmcoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIG91dCA8PCAid3JpdGVCb29sKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUJ5dGUoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgIG91dCA8PCAid3JpdGVJMTYoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgIG91dCA8PCAid3JpdGVJMzIoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgIG91dCA8PCAid3JpdGVJNjQoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIG91dCA8PCAid3JpdGVEb3VibGUoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBDKysgd3JpdGVyIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSkgKyBuYW1lOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICBvdXQgPDwgIndyaXRlSTMyKChpbnQzMl90KSIgPDwgbmFtZSA8PCAiKTsiOwotICAgIH0KLSAgICBvdXQgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCi0gICAgICAgICAgIG5hbWUuY19zdHIoKSwKLSAgICAgICAgICAgdHlwZV9uYW1lKHR5cGUpLmNfc3RyKCkpOwotICB9Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyBhbGwgdGhlIG1lbWJlcnMgb2YgYSBzdHJ1Y3QuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCB0byBzZXJpYWxpemUKLSAqIEBwYXJhbSBwcmVmaXggIFN0cmluZyBwcmVmaXggdG8gYXR0YWNoIHRvIGFsbCBmaWVsZHMKLSAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcG9pbnRlcikgewotICBpZiAocG9pbnRlcikgewotICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBwcmVmaXggPDwgIikgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICB4ZmVyICs9ICIgPDwgcHJlZml4IDw8ICItPndyaXRlKG9wcm90KTsgIiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpICA8PCAifSBlbHNlIHsiIDw8ICJvcHJvdC0+d3JpdGVTdHJ1Y3RCZWdpbihcIiIgPDwKLSAgICAgIHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIlwiKTsgIiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgIG9wcm90LT53cml0ZVN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICBvcHJvdC0+d3JpdGVGaWVsZFN0b3AoKTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJ4ZmVyICs9ICIgPDwgcHJlZml4IDw8ICIud3JpdGUob3Byb3QpOyIgPDwgZW5kbDsKLSAgfQotfQotCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgc2NvcGVfdXAob3V0KTsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJ4ZmVyICs9IG9wcm90LT53cml0ZU1hcEJlZ2luKCIgPDwKLSAgICAgIHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgInN0YXRpY19jYXN0PHVpbnQzMl90PigiIDw8IHByZWZpeCA8PCAiLnNpemUoKSkpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgInhmZXIgKz0gb3Byb3QtPndyaXRlU2V0QmVnaW4oIiA8PAotICAgICAgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICAic3RhdGljX2Nhc3Q8dWludDMyX3Q+KCIgPDwgcHJlZml4IDw8ICIuc2l6ZSgpKSk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgInhmZXIgKz0gb3Byb3QtPndyaXRlTGlzdEJlZ2luKCIgPDwKLSAgICAgIHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgICJzdGF0aWNfY2FzdDx1aW50MzJfdD4oIiA8PCBwcmVmaXggPDwgIi5zaXplKCkpKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBzdHJpbmcgaXRlciA9IHRtcCgiX2l0ZXIiKTsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgdHlwZV9uYW1lKHR0eXBlKSA8PCAiOjpjb25zdF9pdGVyYXRvciAiIDw8IGl0ZXIgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiZm9yICgiIDw8IGl0ZXIgPDwgIiA9ICIgPDwgcHJlZml4ICA8PCAiLmJlZ2luKCk7ICIgPDwgaXRlciA8PCAiICE9ICIgPDwgcHJlZml4IDw8ICIuZW5kKCk7ICsrIiA8PCBpdGVyIDw8ICIpIiA8PCBlbmRsOwotICBzY29wZV91cChvdXQpOwotICAgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIGl0ZXIpOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBpdGVyKTsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgaXRlcik7Ci0gICAgfQotICBzY29wZV9kb3duKG91dCk7Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAieGZlciArPSBvcHJvdC0+d3JpdGVNYXBFbmQoKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJ4ZmVyICs9IG9wcm90LT53cml0ZVNldEVuZCgpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJ4ZmVyICs9IG9wcm90LT53cml0ZUxpc3RFbmQoKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBzY29wZV9kb3duKG91dCk7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIG1hcC4KLSAqCi0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyKSB7Ci0gIHRfZmllbGQga2ZpZWxkKHRtYXAtPmdldF9rZXlfdHlwZSgpLCBpdGVyICsgIi0+Zmlyc3QiKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmtmaWVsZCwgIiIpOwotCi0gIHRfZmllbGQgdmZpZWxkKHRtYXAtPmdldF92YWxfdHlwZSgpLCBpdGVyICsgIi0+c2Vjb25kIik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZ2ZmllbGQsICIiKTsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgc2V0LgotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0c2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlcikgewotICB0X2ZpZWxkIGVmaWVsZCh0c2V0LT5nZXRfZWxlbV90eXBlKCksICIoKiIgKyBpdGVyICsgIikiKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIpOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBsaXN0LgotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyKSB7Ci0gIHRfZmllbGQgZWZpZWxkKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksICIoKiIgKyBpdGVyICsgIikiKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIpOwotfQotCi0vKioKLSAqIE1ha2VzIGEgOjogcHJlZml4IGZvciBhIG5hbWVzcGFjZQotICoKLSAqIEBwYXJhbSBucyBUaGUgbmFtZXNwYWNlLCB3LyBwZXJpb2RzIGluIGl0Ci0gKiBAcmV0dXJuIE5hbWVzcGFjZXMKLSAqLwotc3RyaW5nIHRfY3BwX2dlbmVyYXRvcjo6bmFtZXNwYWNlX3ByZWZpeChzdHJpbmcgbnMpIHsKLSAgLy8gQWx3YXlzIHN0YXJ0IHdpdGggIjo6IiwgdG8gYXZvaWQgcG9zc2libGUgbmFtZSBjb2xsaXNpb25zIHdpdGgKLSAgLy8gb3RoZXIgbmFtZXMgaW4gb25lIG9mIHRoZSBjdXJyZW50IG5hbWVzcGFjZXMuCi0gIC8vCi0gIC8vIFdlIGFsc28gbmVlZCBhIGxlYWRpbmcgc3BhY2UsIGluIGNhc2UgdGhlIG5hbWUgaXMgdXNlZCBpbnNpZGUgb2YgYQotICAvLyB0ZW1wbGF0ZSBwYXJhbWV0ZXIuICAiTXlUZW1wbGF0ZTw6OmZvbzo6QmFyPiIgaXMgbm90IHZhbGlkIEMrKywKLSAgLy8gc2luY2UgIjw6IiBpcyBhbiBhbHRlcm5hdGl2ZSB0b2tlbiBmb3IgIlsiLgotICBzdHJpbmcgcmVzdWx0ID0gIiA6OiI7Ci0KLSAgaWYgKG5zLnNpemUoKSA9PSAwKSB7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotICBzdHJpbmc6OnNpemVfdHlwZSBsb2M7Ci0gIHdoaWxlICgobG9jID0gbnMuZmluZCgiLiIpKSAhPSBzdHJpbmc6Om5wb3MpIHsKLSAgICByZXN1bHQgKz0gbnMuc3Vic3RyKDAsIGxvYyk7Ci0gICAgcmVzdWx0ICs9ICI6OiI7Ci0gICAgbnMgPSBucy5zdWJzdHIobG9jKzEpOwotICB9Ci0gIGlmIChucy5zaXplKCkgPiAwKSB7Ci0gICAgcmVzdWx0ICs9IG5zICsgIjo6IjsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioKLSAqIE9wZW5zIG5hbWVzcGFjZS4KLSAqCi0gKiBAcGFyYW0gbnMgVGhlIG5hbWVzcGFjZSwgdy8gcGVyaW9kcyBpbiBpdAotICogQHJldHVybiBOYW1lc3BhY2VzCi0gKi8KLXN0cmluZyB0X2NwcF9nZW5lcmF0b3I6Om5hbWVzcGFjZV9vcGVuKHN0cmluZyBucykgewotICBpZiAobnMuc2l6ZSgpID09IDApIHsKLSAgICByZXR1cm4gIiI7Ci0gIH0KLSAgc3RyaW5nIHJlc3VsdCA9ICIiOwotICBzdHJpbmcgc2VwYXJhdG9yID0gIiI7Ci0gIHN0cmluZzo6c2l6ZV90eXBlIGxvYzsKLSAgd2hpbGUgKChsb2MgPSBucy5maW5kKCIuIikpICE9IHN0cmluZzo6bnBvcykgewotICAgIHJlc3VsdCArPSBzZXBhcmF0b3I7Ci0gICAgcmVzdWx0ICs9ICJuYW1lc3BhY2UgIjsKLSAgICByZXN1bHQgKz0gbnMuc3Vic3RyKDAsIGxvYyk7Ci0gICAgcmVzdWx0ICs9ICIgeyI7Ci0gICAgc2VwYXJhdG9yID0gIiAiOwotICAgIG5zID0gbnMuc3Vic3RyKGxvYysxKTsKLSAgfQotICBpZiAobnMuc2l6ZSgpID4gMCkgewotICAgIHJlc3VsdCArPSBzZXBhcmF0b3IgKyAibmFtZXNwYWNlICIgKyBucyArICIgeyI7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBDbG9zZXMgbmFtZXNwYWNlLgotICoKLSAqIEBwYXJhbSBucyBUaGUgbmFtZXNwYWNlLCB3LyBwZXJpb2RzIGluIGl0Ci0gKiBAcmV0dXJuIE5hbWVzcGFjZXMKLSAqLwotc3RyaW5nIHRfY3BwX2dlbmVyYXRvcjo6bmFtZXNwYWNlX2Nsb3NlKHN0cmluZyBucykgewotICBpZiAobnMuc2l6ZSgpID09IDApIHsKLSAgICByZXR1cm4gIiI7Ci0gIH0KLSAgc3RyaW5nIHJlc3VsdCA9ICJ9IjsKLSAgc3RyaW5nOjpzaXplX3R5cGUgbG9jOwotICB3aGlsZSAoKGxvYyA9IG5zLmZpbmQoIi4iKSkgIT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgcmVzdWx0ICs9ICJ9IjsKLSAgICBucyA9IG5zLnN1YnN0cihsb2MrMSk7Ci0gIH0KLSAgcmVzdWx0ICs9ICIgLy8gbmFtZXNwYWNlIjsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIGEgQysrIHR5cGUgbmFtZQotICoKLSAqIEBwYXJhbSB0dHlwZSBUaGUgdHlwZQotICogQHJldHVybiBTdHJpbmcgb2YgdGhlIHR5cGUgbmFtZSwgaS5lLiBzdGQ6OnNldDx0eXBlPgotICovCi1zdHJpbmcgdF9jcHBfZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBpbl90eXBlZGVmLCBib29sIGFyZykgewotICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgc3RyaW5nIGJuYW1lID0gYmFzZV90eXBlX25hbWUoKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpKTsKLSAgICBzdGQ6Om1hcDxzdHJpbmcsIHN0cmluZz46Oml0ZXJhdG9yIGl0ID0gdHR5cGUtPmFubm90YXRpb25zXy5maW5kKCJjcHAudHlwZSIpOwotICAgIGlmIChpdCAhPSB0dHlwZS0+YW5ub3RhdGlvbnNfLmVuZCgpKSB7Ci0gICAgICBibmFtZSA9IGl0LT5zZWNvbmQ7Ci0gICAgfQotCi0gICAgaWYgKCFhcmcpIHsKLSAgICAgIHJldHVybiBibmFtZTsKLSAgICB9Ci0KLSAgICBpZiAoKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpID09IHRfYmFzZV90eXBlOjpUWVBFX1NUUklORykgewotICAgICAgcmV0dXJuICJjb25zdCAiICsgYm5hbWUgKyAiJiI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiAiY29uc3QgIiArIGJuYW1lOwotICAgIH0KLSAgfQotCi0gIC8vIENoZWNrIGZvciBhIGN1c3RvbSBvdmVybG9hZGVkIEMrKyBuYW1lCi0gIGlmICh0dHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBzdHJpbmcgY25hbWU7Ci0KLSAgICB0X2NvbnRhaW5lciogdGNvbnRhaW5lciA9ICh0X2NvbnRhaW5lciopIHR0eXBlOwotICAgIGlmICh0Y29udGFpbmVyLT5oYXNfY3BwX25hbWUoKSkgewotICAgICAgY25hbWUgPSB0Y29udGFpbmVyLT5nZXRfY3BwX25hbWUoKTsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgICAgdF9tYXAqIHRtYXAgPSAodF9tYXAqKSB0dHlwZTsKLSAgICAgIGNuYW1lID0gInN0ZDo6bWFwPCIgKwotICAgICAgICB0eXBlX25hbWUodG1hcC0+Z2V0X2tleV90eXBlKCksIGluX3R5cGVkZWYpICsgIiwgIiArCi0gICAgICAgIHR5cGVfbmFtZSh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgaW5fdHlwZWRlZikgKyAiPiAiOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgICB0X3NldCogdHNldCA9ICh0X3NldCopIHR0eXBlOwotICAgICAgY25hbWUgPSAic3RkOjpzZXQ8IiArIHR5cGVfbmFtZSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGluX3R5cGVkZWYpICsgIj4gIjsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIHRfbGlzdCogdGxpc3QgPSAodF9saXN0KikgdHR5cGU7Ci0gICAgICBjbmFtZSA9ICJzdGQ6OnZlY3RvcjwiICsgdHlwZV9uYW1lKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGluX3R5cGVkZWYpICsgIj4gIjsKLSAgICB9Ci0KLSAgICBpZiAoYXJnKSB7Ci0gICAgICByZXR1cm4gImNvbnN0ICIgKyBjbmFtZSArICImIjsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIGNuYW1lOwotICAgIH0KLSAgfQotCi0gIHN0cmluZyBjbGFzc19wcmVmaXg7Ci0gIGlmIChpbl90eXBlZGVmICYmICh0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkpKSB7Ci0gICAgY2xhc3NfcHJlZml4ID0gImNsYXNzICI7Ci0gIH0KLQotICAvLyBDaGVjayBpZiBpdCBuZWVkcyB0byBiZSBuYW1lc3BhY2VkCi0gIHN0cmluZyBwbmFtZTsKLSAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHR5cGUtPmdldF9wcm9ncmFtKCk7Ci0gIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgewotICAgIHBuYW1lID0KLSAgICAgIGNsYXNzX3ByZWZpeCArCi0gICAgICBuYW1lc3BhY2VfcHJlZml4KHByb2dyYW0tPmdldF9uYW1lc3BhY2UoImNwcCIpKSArCi0gICAgICB0dHlwZS0+Z2V0X25hbWUoKTsKLSAgfSBlbHNlIHsKLSAgICBwbmFtZSA9IGNsYXNzX3ByZWZpeCArIHR0eXBlLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgaWYgKHR0eXBlLT5pc19lbnVtKCkgJiYgIWdlbl9wdXJlX2VudW1zXykgewotICAgIHBuYW1lICs9ICI6OnR5cGUiOwotICB9Ci0KLSAgaWYgKGFyZykgewotICAgIGlmIChpc19jb21wbGV4X3R5cGUodHR5cGUpKSB7Ci0gICAgICByZXR1cm4gImNvbnN0ICIgKyBwbmFtZSArICImIjsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuICJjb25zdCAiICsgcG5hbWU7Ci0gICAgfQotICB9IGVsc2UgewotICAgIHJldHVybiBwbmFtZTsKLSAgfQotfQotCi0vKioKLSAqIFJldHVybnMgdGhlIEMrKyB0eXBlIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHRocmlmdCB0eXBlLgotICoKLSAqIEBwYXJhbSB0YmFzZSBUaGUgYmFzZSB0eXBlCi0gKiBAcmV0dXJuIEV4cGxpY2l0IEMrKyB0eXBlLCBpLmUuICJpbnQzMl90IgotICovCi1zdHJpbmcgdF9jcHBfZ2VuZXJhdG9yOjpiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlKSB7Ci0gIHN3aXRjaCAodGJhc2UpIHsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgIHJldHVybiAidm9pZCI7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgIHJldHVybiAic3RkOjpzdHJpbmciOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgcmV0dXJuICJib29sIjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgIHJldHVybiAiaW50OF90IjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgcmV0dXJuICJpbnQxNl90IjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgcmV0dXJuICJpbnQzMl90IjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgcmV0dXJuICJpbnQ2NF90IjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgcmV0dXJuICJkb3VibGUiOwotICBkZWZhdWx0OgotICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gQysrIGJhc2UgdHlwZSBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBEZWNsYXJlcyBhIGZpZWxkLCB3aGljaCBtYXkgaW5jbHVkZSBpbml0aWFsaXphdGlvbiBhcyBuZWNlc3NhcnkuCi0gKgotICogQHBhcmFtIHR0eXBlIFRoZSB0eXBlCi0gKiBAcmV0dXJuIEZpZWxkIGRlY2xhcmF0aW9uLCBpLmUuIGludCB4ID0gMDsKLSAqLwotc3RyaW5nIHRfY3BwX2dlbmVyYXRvcjo6ZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdCwgYm9vbCBwb2ludGVyLCBib29sIGNvbnN0YW50LCBib29sIHJlZmVyZW5jZSkgewotICAvLyBUT0RPKG1jc2xlZSk6IGRvIHdlIGV2ZXIgbmVlZCB0byBpbml0aWFsaXplIHRoZSBmaWVsZD8KLSAgc3RyaW5nIHJlc3VsdCA9ICIiOwotICBpZiAoY29uc3RhbnQpIHsKLSAgICByZXN1bHQgKz0gImNvbnN0ICI7Ci0gIH0KLSAgcmVzdWx0ICs9IHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCkpOwotICBpZiAoaXNfcmVmZXJlbmNlKHRmaWVsZCkpIHsKLSAgICByZXN1bHQgPSAiYm9vc3Q6OnNoYXJlZF9wdHI8IiArIHJlc3VsdCArICI+IjsKLSAgfQotICBpZiAocG9pbnRlcikgewotICAgIHJlc3VsdCArPSAiKiI7Ci0gIH0KLSAgaWYgKHJlZmVyZW5jZSkgewotICAgIHJlc3VsdCArPSAiJiI7Ci0gIH0KLSAgcmVzdWx0ICs9ICIgIiArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLSAgaWYgKGluaXQpIHsKLSAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0KLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgcmVzdWx0ICs9ICIgPSBmYWxzZSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICByZXN1bHQgKz0gIiA9IDAiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICByZXN1bHQgKz0gIiA9IChkb3VibGUpMCI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBDKysgaW5pdGlhbGl6ZXIgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgcmVzdWx0ICs9ICIgPSAoIiArIHR5cGVfbmFtZSh0eXBlKSArICIpMCI7Ci0gICAgfQotICB9Ci0gIGlmICghcmVmZXJlbmNlKSB7Ci0gICAgcmVzdWx0ICs9ICI7IjsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioKLSAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGZvcm0gJ3R5cGUgbmFtZShhcmdzKScKLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KLSAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KLSAqLwotc3RyaW5nIHRfY3BwX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgc3R5bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG5hbWVfcGFyYW1zKSB7Ci0gIHRfdHlwZSogdHR5cGUgPSB0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCk7Ci0gIHRfc3RydWN0KiBhcmdsaXN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOwotICBib29sIGhhc194Y2VwdGlvbnMgPSAhdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCktPmdldF9tZW1iZXJzKCkuZW1wdHkoKTsKLQotICBpZiAoc3R5bGUgPT0gIiIpIHsKLSAgICBpZiAoaXNfY29tcGxleF90eXBlKHR0eXBlKSkgewotICAgICAgcmV0dXJuCi0gICAgICAgICJ2b2lkICIgKyBwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKwotICAgICAgICAiKCIgKyB0eXBlX25hbWUodHR5cGUpICsgKG5hbWVfcGFyYW1zID8gIiYgX3JldHVybiIgOiAiJiAvKiBfcmV0dXJuICovIikgKwotICAgICAgICBhcmd1bWVudF9saXN0KGFyZ2xpc3QsIG5hbWVfcGFyYW1zLCB0cnVlKSArICIpIjsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuCi0gICAgICAgIHR5cGVfbmFtZSh0dHlwZSkgKyAiICIgKyBwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKwotICAgICAgICAiKCIgKyBhcmd1bWVudF9saXN0KGFyZ2xpc3QsIG5hbWVfcGFyYW1zKSArICIpIjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAoc3R5bGUuc3Vic3RyKDAsMykgPT0gIkNvYiIpIHsKLSAgICBzdHJpbmcgY29iX3R5cGU7Ci0gICAgc3RyaW5nIGV4bl9jb2I7Ci0gICAgaWYgKHN0eWxlID09ICJDb2JDbCIpIHsKLSAgICAgIGNvYl90eXBlID0gIigiICsgc2VydmljZV9uYW1lXyArICJDb2JDbGllbnQiOwotICAgICAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7Ci0gICAgICAgIGNvYl90eXBlICs9ICJUPFByb3RvY29sXz4iOwotICAgICAgfQotICAgICAgY29iX3R5cGUgKz0gIiogY2xpZW50KSI7Ci0gICAgfSBlbHNlIGlmIChzdHlsZSA9PSJDb2JTdiIpIHsKLSAgICAgIGNvYl90eXBlID0gKHR0eXBlLT5pc192b2lkKCkKLSAgICAgICAgICAgICAgICAgID8gIigpIgotICAgICAgICAgICAgICAgICAgOiAoIigiICsgdHlwZV9uYW1lKHR0eXBlKSArICIgY29uc3QmIF9yZXR1cm4pIikpOwotICAgICAgaWYgKGhhc194Y2VwdGlvbnMpIHsKLSAgICAgICAgZXhuX2NvYiA9ICIsIHRjeHg6OmZ1bmN0aW9uPHZvaWQoOjphcGFjaGU6OnRocmlmdDo6VERlbGF5ZWRFeGNlcHRpb24qIF90aHJvdyk+IC8qIGV4bl9jb2IgKi8iOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICB0aHJvdyAiVU5LTk9XTiBTVFlMRSI7Ci0gICAgfQotCi0gICAgcmV0dXJuCi0gICAgICAidm9pZCAiICsgcHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsKLSAgICAgICIodGN4eDo6ZnVuY3Rpb248dm9pZCIgKyBjb2JfdHlwZSArICI+IGNvYiIgKyBleG5fY29iICsKLSAgICAgIGFyZ3VtZW50X2xpc3QoYXJnbGlzdCwgbmFtZV9wYXJhbXMsIHRydWUpICsgIikiOwotICB9IGVsc2UgewotICAgIHRocm93ICJVTktOT1dOIFNUWUxFIjsKLSAgfQotfQotCi0vKioKLSAqIFJlbmRlcnMgYSBmaWVsZCBsaXN0Ci0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKiBAcmV0dXJuIENvbW1hIHNlcGVhcmF0ZWQgbGlzdCBvZiBhbGwgZmllbGQgbmFtZXMgaW4gdGhhdCBzdHJ1Y3QKLSAqLwotc3RyaW5nIHRfY3BwX2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBuYW1lX3BhcmFtcywgYm9vbCBzdGFydF9jb21tYSkgewotICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBib29sIGZpcnN0ID0gIXN0YXJ0X2NvbW1hOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgcmVzdWx0ICs9ICIsICI7Ci0gICAgfQotICAgIHJlc3VsdCArPSB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgdHJ1ZSkgKyAiICIgKwotICAgICAgKG5hbWVfcGFyYW1zID8gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDogIi8qICIgKyAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiICovIik7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhIEMrKyBlbnVtIHN0cmluZyBmb3IgdGhlIGdpdmVuIHR5cGUuCi0gKgotICogQHBhcmFtIHR5cGUgVGhyaWZ0IFR5cGUKLSAqIEByZXR1cm4gU3RyaW5nIG9mIEMrKyBjb2RlIHRvIGRlZmluaXRpb24gb2YgdGhhdCB0eXBlIGNvbnN0YW50Ci0gKi8KLXN0cmluZyB0X2NwcF9nZW5lcmF0b3I6OnR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpIHsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICByZXR1cm4gIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1NUUklORyI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9CT09MIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICByZXR1cm4gIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0JZVEUiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgcmV0dXJuICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9JMTYiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgcmV0dXJuICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9JMzIiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmV0dXJuICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9JNjQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9ET1VCTEUiOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0kzMiI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkpIHsKLSAgICByZXR1cm4gIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1NUUlVDVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfU1RSVUNUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHJldHVybiAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfTUFQIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHJldHVybiAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfU0VUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICByZXR1cm4gIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0xJU1QiOwotICB9Ci0KLSAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotfQotCi0vKioKLSAqIFJldHVybnMgdGhlIHN5bWJvbCBuYW1lIG9mIHRoZSBsb2NhbCByZWZsZWN0aW9uIG9mIGEgdHlwZS4KLSAqLwotc3RyaW5nIHRfY3BwX2dlbmVyYXRvcjo6bG9jYWxfcmVmbGVjdGlvbl9uYW1lKGNvbnN0IGNoYXIqIHByZWZpeCwgdF90eXBlKiB0dHlwZSwgYm9vbCBleHRlcm5hbCkgewotICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOwotCi0gIC8vIFdlIGhhdmUgdG8gdXNlIHRoZSBwcm9ncmFtIG5hbWUgYXMgcGFydCBvZiB0aGUgaWRlbnRpZmllciBiZWNhdXNlCi0gIC8vIGlmIHR3byB0aHJpZnQgInByb2dyYW1zIiBhcmUgY29tcGlsZWQgaW50byBvbmUgYWN0dWFsIHByb2dyYW0KLSAgLy8geW91IHdvdWxkIGdldCBhIHN5bWJvbCBjb2xsaXNpb24gaWYgdGhleSBib3RoIGRlZmluZWQgbGlzdDxpMzI+LgotICAvLyB0cmxvID0gVGhyaWZ0IFJlZmxlY3Rpb24gTE9jYWwuCi0gIHN0cmluZyBwcm9nOwotICBzdHJpbmcgbmFtZTsKLSAgc3RyaW5nIG5zcGFjZTsKLQotICAvLyBUT0RPKGRyZWlzcyk6IFdvdWxkIGl0IGJlIGJldHRlciB0byBwcmVnZW5lcmF0ZSB0aGUgYmFzZSB0eXBlcwotICAvLyAgICAgICAgICAgICAgIGFuZCBwdXQgdGhlbSBpbiBUaHJpZnQue2gsY3BwfSA/Ci0KLSAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHByb2cgPSBwcm9ncmFtXy0+Z2V0X25hbWUoKTsKLSAgICBuYW1lID0gdHR5cGUtPmdldF9hc2NpaV9maW5nZXJwcmludCgpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBhc3NlcnQodHR5cGUtPmdldF9wcm9ncmFtKCkgIT0gTlVMTCk7Ci0gICAgcHJvZyA9IHR0eXBlLT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZSgpOwotICAgIG5hbWUgPSB0dHlwZS0+Z2V0X2FzY2lpX2ZpbmdlcnByaW50KCk7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgcHJvZyA9IHByb2dyYW1fLT5nZXRfbmFtZSgpOwotICAgIG5hbWUgPSB0dHlwZS0+Z2V0X2FzY2lpX2ZpbmdlcnByaW50KCk7Ci0gIH0gZWxzZSB7Ci0gICAgYXNzZXJ0KHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKSk7Ci0gICAgYXNzZXJ0KHR0eXBlLT5nZXRfcHJvZ3JhbSgpICE9IE5VTEwpOwotICAgIHByb2cgPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWUoKTsKLSAgICBuYW1lID0gdHR5cGUtPmdldF9hc2NpaV9maW5nZXJwcmludCgpOwotICB9Ci0KLSAgaWYgKGV4dGVybmFsICYmCi0gICAgICB0dHlwZS0+Z2V0X3Byb2dyYW0oKSAhPSBOVUxMICYmCi0gICAgICB0dHlwZS0+Z2V0X3Byb2dyYW0oKSAhPSBwcm9ncmFtXykgewotICAgIG5zcGFjZSA9IG5hbWVzcGFjZV9wcmVmaXgodHR5cGUtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lc3BhY2UoImNwcCIpKTsKLSAgfQotCi0gIHJldHVybiBuc3BhY2UgKyAidHJsb18iICsgcHJlZml4ICsgIl8iICsgcHJvZyArICJfIiArIG5hbWU7Ci19Ci0KLXN0cmluZyB0X2NwcF9nZW5lcmF0b3I6OmdldF9pbmNsdWRlX3ByZWZpeChjb25zdCB0X3Byb2dyYW0mIHByb2dyYW0pIGNvbnN0IHsKLSAgc3RyaW5nIGluY2x1ZGVfcHJlZml4ID0gcHJvZ3JhbS5nZXRfaW5jbHVkZV9wcmVmaXgoKTsKLSAgaWYgKCF1c2VfaW5jbHVkZV9wcmVmaXhfIHx8Ci0gICAgICAoaW5jbHVkZV9wcmVmaXguc2l6ZSgpID4gMCAmJiBpbmNsdWRlX3ByZWZpeFswXSA9PSAnLycpKSB7Ci0gICAgLy8gaWYgZmxhZyBpcyB0dXJuZWQgb2ZmIG9yIHRoaXMgaXMgYWJzb2x1dGUgcGF0aCwgcmV0dXJuIGVtcHR5IHByZWZpeAotICAgIHJldHVybiAiIjsKLSAgfQotCi0gIHN0cmluZzo6c2l6ZV90eXBlIGxhc3Rfc2xhc2ggPSBzdHJpbmc6Om5wb3M7Ci0gIGlmICgobGFzdF9zbGFzaCA9IGluY2x1ZGVfcHJlZml4LnJmaW5kKCIvIikpICE9IHN0cmluZzo6bnBvcykgewotICAgIHJldHVybiBpbmNsdWRlX3ByZWZpeC5zdWJzdHIoMCwgbGFzdF9zbGFzaCkgKwotICAgICAgKGdldF9wcm9ncmFtKCktPmlzX291dF9wYXRoX2Fic29sdXRlKCkgPyAiLyIgOiAiLyIgKyBvdXRfZGlyX2Jhc2VfICsgIi8iKTsKLQotICB9Ci0KLSAgcmV0dXJuICIiOwotfQotCi0KLVRIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoY3BwLCAiQysrIiwKLSIgICAgY29iX3N0eWxlOiAgICAgICBHZW5lcmF0ZSBcIkNvbnRpbnVhdGlvbiBPQmplY3RcIi1zdHlsZSBjbGFzc2VzLlxuIgotIiAgICBub19jbGllbnRfY29tcGxldGlvbjpcbiIKLSIgICAgICAgICAgICAgICAgICAgICBPbWl0IGNhbGxzIHRvIGNvbXBsZXRpb25fXygpIGluIENvYkNsaWVudCBjbGFzcy5cbiIKLSIgICAgbm9fZGVmYXVsdF9vcGVyYXRvcnM6XG4iCi0iICAgICAgICAgICAgICAgICAgICAgT21pdHMgZ2VuZXJhdGlvbiBvZiBkZWZhdWx0IG9wZXJhdG9ycyA9PSwgIT0gYW5kIDxcbiIKLSIgICAgdGVtcGxhdGVzOiAgICAgICBHZW5lcmF0ZSB0ZW1wbGF0aXplZCByZWFkZXIvd3JpdGVyIG1ldGhvZHMuXG4iCi0iICAgIHB1cmVfZW51bXM6ICAgICAgR2VuZXJhdGUgcHVyZSBlbnVtcyBpbnN0ZWFkIG9mIHdyYXBwZXIgY2xhc3Nlcy5cbiIKLSIgICAgZGVuc2U6ICAgICAgICAgICBHZW5lcmF0ZSB0eXBlIHNwZWNpZmljYXRpb25zIGZvciB0aGUgZGVuc2UgcHJvdG9jb2wuXG4iCi0iICAgIGluY2x1ZGVfcHJlZml4OiAgVXNlIGZ1bGwgaW5jbHVkZSBwYXRocyBpbiBnZW5lcmF0ZWQgZmlsZXMuXG4iCi0pCi0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9jc2hhcnBfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2NzaGFycF9nZW5lcmF0b3IuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkNjZjZWYuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2NzaGFycF9nZW5lcmF0b3IuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyODcyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KLSAqIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCi0gKiBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlIDxjYXNzZXJ0PgotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPGZzdHJlYW0+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8dmVjdG9yPgotI2luY2x1ZGUgPGNjdHlwZT4KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLQotI2luY2x1ZGUgInBsYXRmb3JtLmgiCi0jaW5jbHVkZSAidF9vb3BfZ2VuZXJhdG9yLmgiCi0KLXVzaW5nIHN0ZDo6bWFwOwotdXNpbmcgc3RkOjpvZnN0cmVhbTsKLXVzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKLXVzaW5nIHN0ZDo6c3RyaW5nOwotdXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07Ci11c2luZyBzdGQ6OnZlY3RvcjsKLQotc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsID0gIlxuIjsgIC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKLQotY2xhc3MgdF9jc2hhcnBfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvcgotewotICBwdWJsaWM6Ci0gICAgdF9jc2hhcnBfZ2VuZXJhdG9yKAotICAgICAgICB0X3Byb2dyYW0qIHByb2dyYW0sCi0gICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAotICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKLSAgICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pCi0gICAgewotICAgICAgKHZvaWQpIG9wdGlvbl9zdHJpbmc7Ci0KLSAgICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7Ci0KLSAgICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJhc3luYyIpOwotICAgICAgYXN5bmNfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotICAgICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoImFzeW5jY3RwIik7Ci0gICAgICBhc3luY19jdHBfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotICAgICAgaWYgKGFzeW5jXyAmJiBhc3luY19jdHBfKSB7Ci0gICAgICAgIHRocm93ICJhcmd1bWVudCBlcnJvcjogQ2Fubm90IHNwZWNpZnkgYm90aCBhc3luYyBhbmQgYXN5bmNjdHA7IHRoZXkgYXJlIGluY29tcGF0aWJsZS4iOwotICAgICAgfQotCi0gICAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgibnVsbGFibGUiKTsKLSAgICAgIG51bGxhYmxlXyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLQotICAgICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoImhhc2hjb2RlIik7Ci0gICAgICBoYXNoY29kZV8gPSAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7Ci0KLSAgICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJ1bmlvbiIpOwotICAgICAgdW5pb25fID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotCi0gICAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgic2VyaWFsIik7Ci0gICAgICBzZXJpYWxpemVfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotICAgICAgaWYgKHNlcmlhbGl6ZV8pIHsKLSAgICAgICAgd2NmX25hbWVzcGFjZV8gPSBpdGVyLT5zZWNvbmQ7ICAvLyBzaW5jZSB0aGVyZSBjYW4gYmUgb25seSBvbmUgbmFtZXNwYWNlCi0gICAgICB9Ci0gICAgICAKLSAgICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJ3Y2YiKTsKLSAgICAgIHdjZl8gPSAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7Ci0gICAgICBpZiAod2NmXykgewotICAgICAgICB3Y2ZfbmFtZXNwYWNlXyA9IGl0ZXItPnNlY29uZDsKLSAgICAgIH0KLQotICAgICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tY3NoYXJwIjsKLSAgICB9Ci0gICAgdm9pZCBpbml0X2dlbmVyYXRvcigpOwotICAgIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7Ci0KLSAgICB2b2lkIGdlbmVyYXRlX2NvbnN0cyhzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKTsKLQotICAgIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZiAodF90eXBlZGVmKiB0dHlwZWRlZik7Ci0gICAgdm9pZCBnZW5lcmF0ZV9lbnVtICh0X2VudW0qIHRlbnVtKTsKLSAgICB2b2lkIGdlbmVyYXRlX3N0cnVjdCAodF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICAgIHZvaWQgZ2VuZXJhdGVfdW5pb24gKHRfc3RydWN0KiB0dW5pb24pOwotICAgIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24gKHRfc3RydWN0KiB0eGNlcHRpb24pOwotICAgIHZvaWQgZ2VuZXJhdGVfc2VydmljZSAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gICAgdm9pZCBnZW5lcmF0ZV9wcm9wZXJ0eShvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaXNQdWJsaWMsIGJvb2wgZ2VuZXJhdGVJc3NldCk7Ci0gICAgdm9pZCBnZW5lcmF0ZV9jc2hhcnBfcHJvcGVydHkob2ZzdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBib29sIGlzUHVibGljLCBib29sIGluY2x1ZGVJc3NldD10cnVlLCBzdGQ6OnN0cmluZyBmaWVsZFByZWZpeCA9ICIiKTsKLSAgICBib29sIHByaW50X2NvbnN0X3ZhbHVlIChzdGQ6Om9mc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUsIGJvb2wgaW5fc3RhdGljLCBib29sIGRlZnZhbD1mYWxzZSwgYm9vbCBuZWVkdHlwZT1mYWxzZSk7Ci0gICAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKHN0ZDo6b2ZzdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7Ci0gICAgdm9pZCBwcmludF9jb25zdF9jb25zdHJ1Y3RvcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpOwotICAgIHZvaWQgcHJpbnRfY29uc3RfZGVmX3ZhbHVlKHN0ZDo6b2ZzdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7Ci0KLSAgICB2b2lkIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKLSAgICB2b2lkIGdlbmVyYXRlX2NzaGFycF91bmlvbih0X3N0cnVjdCogdHVuaW9uKTsKLSAgICB2b2lkIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfZGVmaW5pdGlvbihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX3hjZXB0aW9uPWZhbHNlLCBib29sIGluX2NsYXNzPWZhbHNlLCBib29sIGlzX3Jlc3VsdD1mYWxzZSk7Ci0gICAgdm9pZCBnZW5lcmF0ZV9jc2hhcnBfdW5pb25fZGVmaW5pdGlvbihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0dW5pb24pOwotICAgIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX3VuaW9uX2NsYXNzKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHR1bmlvbiwgdF9maWVsZCogdGZpZWxkKTsKLSAgICB2b2lkIGdlbmVyYXRlX2NzaGFycF93Y2ZmYXVsdChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgICB2b2lkIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfcmVhZGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICAgIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9yZXN1bHRfd3JpdGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICAgIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF93cml0ZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gICAgdm9pZCBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X3Rvc3RyaW5nKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICAgIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9lcXVhbHMoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gICAgdm9pZCBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X2hhc2hjb2RlKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICAgIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX3VuaW9uX3JlYWRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0dW5pb24pOwotCi0gICAgdm9pZCBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0gICAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gICAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnMgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICAgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICAgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICAgIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbiAodF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogZnVuY3Rpb24pOwotCi0gICAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZCAoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIHByZWZpeD0iIiwgYm9vbCBpc19wcm9wZXJ0eWxlc3M9ZmFsc2UpOwotICAgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0IChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotICAgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyIChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0gICAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudCAoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLSAgICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50IChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotICAgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50IChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfbGlzdCogbGlzdCwgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLSAgICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZCAoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIHByZWZpeD0iIiwgYm9vbCBpc19lbGVtZW50PWZhbHNlLCBib29sIGlzX3Byb3BlcnR5bGVzcz1mYWxzZSk7Ci0gICAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0IChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotICAgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lciAoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotICAgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50IChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdGQ6OnN0cmluZyBpdGVyLCBzdGQ6OnN0cmluZyBtYXApOwotICAgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50IChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc2V0KiB0bWFwLCBzdGQ6OnN0cmluZyBpdGVyKTsKLSAgICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQgKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RkOjpzdHJpbmcgaXRlcik7Ci0KLSAgICB2b2lkIGdlbmVyYXRlX2NzaGFycF9kb2MgKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9maWVsZCogICAgZmllbGQpOwotICAgIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX2RvYyAoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X2RvYyogICAgICB0ZG9jKTsKLSAgICB2b2lkIGdlbmVyYXRlX2NzaGFycF9kb2MgKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogdGRvYyk7Ci0gICAgdm9pZCBnZW5lcmF0ZV9jc2hhcnBfZG9jc3RyaW5nX2NvbW1lbnQgKHN0ZDo6b2ZzdHJlYW0gJm91dCwgc3RyaW5nIGNvbnRlbnRzKTsKLQotICAgIHZvaWQgc3RhcnRfY3NoYXJwX25hbWVzcGFjZSAoc3RkOjpvZnN0cmVhbSYgb3V0KTsKLSAgICB2b2lkIGVuZF9jc2hhcnBfbmFtZXNwYWNlIChzdGQ6Om9mc3RyZWFtJiBvdXQpOwotCi0gICAgc3RkOjpzdHJpbmcgY3NoYXJwX3R5cGVfdXNpbmdzKCk7Ci0gICAgc3RkOjpzdHJpbmcgY3NoYXJwX3RocmlmdF91c2luZ3MoKTsKLQotICAgIHN0ZDo6c3RyaW5nIHR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLCBib29sIGluX2NvdW50YWluZXI9ZmFsc2UsIGJvb2wgaW5faW5pdD1mYWxzZSwgYm9vbCBpbl9wYXJhbT1mYWxzZSwgYm9vbCBpc19yZXF1aXJlZD1mYWxzZSk7Ci0gICAgc3RkOjpzdHJpbmcgYmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGUqIHRiYXNlLCBib29sIGluX2NvbnRhaW5lcj1mYWxzZSwgYm9vbCBpbl9wYXJhbT1mYWxzZSwgYm9vbCBpc19yZXF1aXJlZD1mYWxzZSk7Ci0gICAgc3RkOjpzdHJpbmcgZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdD1mYWxzZSwgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLSAgICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmVfYXN5bmNfYmVnaW4odF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0gICAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlX2FzeW5jX2VuZCh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLSAgICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmVfYXN5bmModF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0gICAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLSAgICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KTsKLSAgICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7Ci0gICAgc3RkOjpzdHJpbmcgcHJvcF9uYW1lKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBzdXBwcmVzc19tYXBwaW5nID0gZmFsc2UpOwotICAgIHN0ZDo6c3RyaW5nIGdldF9lbnVtX2NsYXNzX25hbWUodF90eXBlKiB0eXBlKTsKLSAgICAKLSAgICBib29sIGZpZWxkX2hhc19kZWZhdWx0KHRfZmllbGQqIHRmaWVsZCkgewotICAgICAgcmV0dXJuIHRmaWVsZC0+Z2V0X3ZhbHVlKCkgIT0gTlVMTDsKLSAgICB9Ci0KLSAgICBib29sIGZpZWxkX2lzX3JlcXVpcmVkKHRfZmllbGQqIHRmaWVsZCkgewotICAgICAgcmV0dXJuIHRmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQ7Ci0gICAgfQotCi0gICAgYm9vbCB0eXBlX2Nhbl9iZV9udWxsKHRfdHlwZSogdHR5cGUpIHsKLSAgICAgIHdoaWxlICh0dHlwZS0+aXNfdHlwZWRlZigpKSB7Ci0gICAgICAgIHR0eXBlID0gKCh0X3R5cGVkZWYqKXR0eXBlKS0+Z2V0X3R5cGUoKTsKLSAgICAgIH0KLQotICAgICAgcmV0dXJuIHR0eXBlLT5pc19jb250YWluZXIoKSB8fAotICAgICAgICB0dHlwZS0+aXNfc3RydWN0KCkgfHwKLSAgICAgICAgdHR5cGUtPmlzX3hjZXB0aW9uKCkgfHwKLSAgICAgICAgdHR5cGUtPmlzX3N0cmluZygpOwotICAgIH0KLQotICBwcml2YXRlOgotICAgIHN0ZDo6c3RyaW5nIG5hbWVzcGFjZV9uYW1lXzsKLSAgICBzdGQ6Om9mc3RyZWFtIGZfc2VydmljZV87Ci0gICAgc3RkOjpzdHJpbmcgbmFtZXNwYWNlX2Rpcl87Ci0gICAgYm9vbCBhc3luY187Ci0gICAgYm9vbCBhc3luY19jdHBfOwotICAgIGJvb2wgbnVsbGFibGVfOwotICAgIGJvb2wgdW5pb25fOwotICAgIGJvb2wgaGFzaGNvZGVfOwotICAgIGJvb2wgc2VyaWFsaXplXzsKLSAgICBib29sIHdjZl87Ci0gICAgc3RkOjpzdHJpbmcgd2NmX25hbWVzcGFjZV87Ci0KLSAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBjc2hhcnBfa2V5d29yZHM7Ci0KLSAgICB2b2lkKiBtZW1iZXJfbWFwcGluZ19zY29wZTsKLSAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IG1lbWJlcl9uYW1lX21hcHBpbmc7Ci0KLSAgICB2b2lkIGluaXRfa2V5d29yZHMoKTsKLSAgICBzdGQ6OnN0cmluZyBub3JtYWxpemVfbmFtZSggc3RkOjpzdHJpbmcgbmFtZSk7Ci0gICAgc3RkOjpzdHJpbmcgbWFrZV92YWxpZF9jc2hhcnBfaWRlbnRpZmllciggc3RkOjpzdHJpbmcgY29uc3QgJiBmcm9tTmFtZSk7Ci0gICAgdm9pZCBwcmVwYXJlX21lbWJlcl9uYW1lX21hcHBpbmcoIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgICB2b2lkIHByZXBhcmVfbWVtYmVyX25hbWVfbWFwcGluZyggdm9pZCogc2NvcGUsIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMsIGNvbnN0IHN0cmluZyAmIHN0cnVjdG5hbWUpOwotICAgIHZvaWQgY2xlYW51cF9tZW1iZXJfbmFtZV9tYXBwaW5nKCB2b2lkKiBzY29wZSk7Ci0gICAgc3RyaW5nIGdldF9tYXBwZWRfbWVtYmVyX25hbWUoIHN0cmluZyBvbGRuYW1lKTsKLX07Ci0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgewotICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOwotICBuYW1lc3BhY2VfbmFtZV8gPSBwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgiY3NoYXJwIik7Ci0KLSAgc3RyaW5nIGRpciA9IG5hbWVzcGFjZV9uYW1lXzsKLSAgc3RyaW5nIHN1YmRpciA9IGdldF9vdXRfZGlyKCkuY19zdHIoKTsKLSAgc3RyaW5nOjpzaXplX3R5cGUgbG9jOwotCi0gIHdoaWxlICgobG9jID0gZGlyLmZpbmQoIi4iKSkgIT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgc3ViZGlyID0gc3ViZGlyICsgIi8iICsgZGlyLnN1YnN0cigwLCBsb2MpOwotICAgIE1LRElSKHN1YmRpci5jX3N0cigpKTsKLSAgICBkaXIgPSBkaXIuc3Vic3RyKGxvYyArIDEpOwotICB9Ci0gIGlmIChkaXIuc2l6ZSgpID4gMCkgewotICAgIHN1YmRpciA9IHN1YmRpciArICIvIiArIGRpcjsKLSAgICBNS0RJUihzdWJkaXIuY19zdHIoKSk7Ci0gIH0KLQotICBuYW1lc3BhY2VfZGlyXyA9IHN1YmRpcjsKLSAgaW5pdF9rZXl3b3JkcygpOwotICBtZW1iZXJfbWFwcGluZ19zY29wZSA9IE5VTEw7Ci0gIAotICBwdmVyYm9zZSgiQyMgb3B0aW9uczpcbiIpOwotICBwdmVyYm9zZSgiLSBhc3luYyAuLi4uLi4gJXNcbiIsIChhc3luY18gPyAiT04iIDogIm9mZiIpKTsKLSAgcHZlcmJvc2UoIi0gYXN5bmNfY3RwIC4uICVzXG4iLCAoYXN5bmNfY3RwXyA/ICJPTiIgOiAib2ZmIikpOwotICBwdmVyYm9zZSgiLSBudWxsYWJsZSAuLi4gJXNcbiIsIChudWxsYWJsZV8gPyAiT04iIDogIm9mZiIpKTsKLSAgcHZlcmJvc2UoIi0gdW5pb24gLi4uLi4uICVzXG4iLCAodW5pb25fID8gIk9OIiA6ICJvZmYiKSk7Ci0gIHB2ZXJib3NlKCItIGhhc2hjb2RlIC4uLiAlc1xuIiwgKGhhc2hjb2RlXyA/ICJPTiIgOiAib2ZmIikpOwotICBwdmVyYm9zZSgiLSBzZXJpYWxpemUgLi4gJXNcbiIsIChzZXJpYWxpemVfID8gIk9OIiA6ICJvZmYiKSk7Ci0gIHB2ZXJib3NlKCItIHdjZiAuLi4uLi4uLiAlc1xuIiwgKHdjZl8gPyAiT04iIDogIm9mZiIpKTsKLX0KLQotc3RkOjpzdHJpbmcgdF9jc2hhcnBfZ2VuZXJhdG9yOjpub3JtYWxpemVfbmFtZSggc3RkOjpzdHJpbmcgbmFtZSkgewotICBzdHJpbmcgdG1wKCBuYW1lICk7Ci0gIHN0ZDo6dHJhbnNmb3JtKHRtcC5iZWdpbigpLCB0bXAuZW5kKCksIHRtcC5iZWdpbigpLCBzdGF0aWNfY2FzdDxpbnQgKCopKGludCk+KHN0ZDo6dG9sb3dlcikpOwotCi0gIC8vIHVuLWNvbmZsaWN0IGtleXdvcmRzIGJ5IHByZWZpeGluZyB3aXRoICJAIgotICBpZiAoIGNzaGFycF9rZXl3b3Jkcy5maW5kKHRtcCkgIT0gY3NoYXJwX2tleXdvcmRzLmVuZCgpKSB7Ci0gICAgcmV0dXJuICJAIiArIG5hbWU7Ci0gIH0KLQotICAvLyBubyBjaGFuZ2VzIG5lY2Vzc2FyeQotICByZXR1cm4gbmFtZTsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmluaXRfa2V5d29yZHMoKSB7Ci0gIGNzaGFycF9rZXl3b3Jkcy5jbGVhcigpOwotICAKLSAgLy8gQyMga2V5d29yZHMKLSAgY3NoYXJwX2tleXdvcmRzWyJhYnN0cmFjdCJdID0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJhcyJdPSAxOwotICBjc2hhcnBfa2V5d29yZHNbImJhc2UiXT0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJib29sIl09IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1siYnJlYWsiXT0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJieXRlIl09IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1siY2FzZSJdPSAxOwotICBjc2hhcnBfa2V5d29yZHNbImNhdGNoIl09IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1siY2hhciJdPSAxOwotICBjc2hhcnBfa2V5d29yZHNbImNoZWNrZWQiXT0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJjbGFzcyJdPSAxOwotICBjc2hhcnBfa2V5d29yZHNbImNvbnN0Il09IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1siY29udGludWUiXT0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJkZWNpbWFsIl09IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1siZGVmYXVsdCJdPSAxOwotICBjc2hhcnBfa2V5d29yZHNbImRlbGVnYXRlIl09IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1siZG8iXT0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJkb3VibGUiXT0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJlbHNlIl09IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1siZW51bSJdPSAxOwotICBjc2hhcnBfa2V5d29yZHNbImV2ZW50Il09IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1siZXhwbGljaXQiXT0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJleHRlcm4iXT0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJmYWxzZSJdPSAxOwotICBjc2hhcnBfa2V5d29yZHNbImZpbmFsbHkiXT0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJmaXhlZCJdPSAxOwotICBjc2hhcnBfa2V5d29yZHNbImZsb2F0Il09IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1siZm9yIl09IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1siZm9yZWFjaCJdPSAxOwotICBjc2hhcnBfa2V5d29yZHNbImdvdG8iXT0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJpZiJdPSAxOwotICBjc2hhcnBfa2V5d29yZHNbImltcGxpY2l0Il09IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1siaW4iXT0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJpbnQiXT0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJpbnRlcmZhY2UiXT0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJpbnRlcm5hbCJdPSAxOwotICBjc2hhcnBfa2V5d29yZHNbImlzIl09IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1sibG9jayJdPSAxOwotICBjc2hhcnBfa2V5d29yZHNbImxvbmciXT0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJuYW1lc3BhY2UiXT0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJuZXciXT0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJudWxsIl09IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1sib2JqZWN0Il09IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1sib3BlcmF0b3IiXT0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJvdXQiXT0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJvdmVycmlkZSJdPSAxOwotICBjc2hhcnBfa2V5d29yZHNbInBhcmFtcyJdPSAxOwotICBjc2hhcnBfa2V5d29yZHNbInByaXZhdGUiXT0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJwcm90ZWN0ZWQiXT0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJwdWJsaWMiXT0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJyZWFkb25seSJdPSAxOwotICBjc2hhcnBfa2V5d29yZHNbInJlZiJdPSAxOwotICBjc2hhcnBfa2V5d29yZHNbInJldHVybiJdPSAxOwotICBjc2hhcnBfa2V5d29yZHNbInNieXRlIl09IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1sic2VhbGVkIl09IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1sic2hvcnQiXT0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJzaXplb2YiXT0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJzdGFja2FsbG9jIl09IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1sic3RhdGljIl09IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1sic3RyaW5nIl09IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1sic3RydWN0Il09IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1sic3dpdGNoIl09IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1sidGhpcyJdPSAxOwotICBjc2hhcnBfa2V5d29yZHNbInRocm93Il09IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1sidHJ1ZSJdPSAxOwotICBjc2hhcnBfa2V5d29yZHNbInRyeSJdPSAxOwotICBjc2hhcnBfa2V5d29yZHNbInR5cGVvZiJdPSAxOwotICBjc2hhcnBfa2V5d29yZHNbInVpbnQiXT0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJ1bG9uZyJdPSAxOwotICBjc2hhcnBfa2V5d29yZHNbInVuY2hlY2tlZCJdPSAxOwotICBjc2hhcnBfa2V5d29yZHNbInVuc2FmZSJdPSAxOwotICBjc2hhcnBfa2V5d29yZHNbInVzaG9ydCJdPSAxOwotICBjc2hhcnBfa2V5d29yZHNbInVzaW5nIl09IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1sidmlydHVhbCJdPSAxOwotICBjc2hhcnBfa2V5d29yZHNbInZvaWQiXT0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJ2b2xhdGlsZSJdPSAxOwotICBjc2hhcnBfa2V5d29yZHNbIndoaWxlIl09IDE7Ci0KLSAgLy8gQyMgY29udGV4dHVhbCBrZXl3b3JkcwotICBjc2hhcnBfa2V5d29yZHNbImFkZCJdPSAxOwotICBjc2hhcnBfa2V5d29yZHNbImFsaWFzIl09IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1siYXNjZW5kaW5nIl09IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1siYXN5bmMiXT0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJhd2FpdCJdPSAxOwotICBjc2hhcnBfa2V5d29yZHNbImRlc2NlbmRpbmciXT0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJkeW5hbWljIl09IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1siZnJvbSJdPSAxOwotICBjc2hhcnBfa2V5d29yZHNbImdldCJdPSAxOwotICBjc2hhcnBfa2V5d29yZHNbImdsb2JhbCJdPSAxOwotICBjc2hhcnBfa2V5d29yZHNbImdyb3VwIl09IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1siaW50byJdPSAxOwotICBjc2hhcnBfa2V5d29yZHNbImpvaW4iXT0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJsZXQiXT0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJvcmRlcmJ5Il09IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1sicGFydGlhbCJdPSAxOwotICBjc2hhcnBfa2V5d29yZHNbInJlbW92ZSJdPSAxOwotICBjc2hhcnBfa2V5d29yZHNbInNlbGVjdCJdPSAxOwotICBjc2hhcnBfa2V5d29yZHNbInNldCJdPSAxOwotICBjc2hhcnBfa2V5d29yZHNbInZhbHVlIl09IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1sidmFyIl09IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1sid2hlcmUiXT0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJ5aWVsZCJdPSAxOwotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6c3RhcnRfY3NoYXJwX25hbWVzcGFjZShvZnN0cmVhbSYgb3V0KSB7Ci0gIGlmICghbmFtZXNwYWNlX25hbWVfLmVtcHR5KCkpIHsKLSAgICBvdXQgPDwKLSAgICAgICJuYW1lc3BhY2UgIiA8PCBuYW1lc3BhY2VfbmFtZV8gPDwgIlxuIjsKLSAgICBzY29wZV91cChvdXQpOwotICB9Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjplbmRfY3NoYXJwX25hbWVzcGFjZShvZnN0cmVhbSYgb3V0KSB7Ci0gIGlmICghbmFtZXNwYWNlX25hbWVfLmVtcHR5KCkpIHsKLSAgICBzY29wZV9kb3duKG91dCk7Ci0gIH0KLX0KLQotc3RyaW5nIHRfY3NoYXJwX2dlbmVyYXRvcjo6Y3NoYXJwX3R5cGVfdXNpbmdzKCkgewotICByZXR1cm4gc3RyaW5nKCkgKwotICAgICJ1c2luZyBTeXN0ZW07XG4iICsKLSAgICAidXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zO1xuIiArCi0gICAgInVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljO1xuIiArCi0gICAgInVzaW5nIFN5c3RlbS5UZXh0O1xuIiArCi0gICAgInVzaW5nIFN5c3RlbS5JTztcbiIgKwotICAgICgoYXN5bmNffHxhc3luY19jdHBfKSA/ICJ1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzO1xuIiA6ICIiKSArCi0gICAgInVzaW5nIFRocmlmdDtcbiIgKwotICAgICJ1c2luZyBUaHJpZnQuQ29sbGVjdGlvbnM7XG4iICsKLSAgICAoKHNlcmlhbGl6ZV98fHdjZl8pID8gIiNpZiAhU0lMVkVSTElHSFRcbiIgOiAiIikgKwotICAgICgoc2VyaWFsaXplX3x8d2NmXykgPyAidXNpbmcgU3lzdGVtLlhtbC5TZXJpYWxpemF0aW9uO1xuIiA6ICIiKSArCi0gICAgKChzZXJpYWxpemVffHx3Y2ZfKSA/ICIjZW5kaWZcbiIgOiAiIikgKwotICAgICh3Y2ZfID8gIi8vdXNpbmcgU3lzdGVtLlNlcnZpY2VNb2RlbDtcbiIgOiAiIikgKwotICAgICJ1c2luZyBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uO1xuIjsKLX0KLQotc3RyaW5nIHRfY3NoYXJwX2dlbmVyYXRvcjo6Y3NoYXJwX3RocmlmdF91c2luZ3MoKSB7Ci0gIHJldHVybiBzdHJpbmcoKSArCi0gICAgInVzaW5nIFRocmlmdC5Qcm90b2NvbDtcbiIgKwotICAgICJ1c2luZyBUaHJpZnQuVHJhbnNwb3J0O1xuIjsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsgfQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgewotICAodm9pZCkgdHR5cGVkZWY7Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKLSAgc3RyaW5nIGZfZW51bV9uYW1lID0gbmFtZXNwYWNlX2Rpcl8rIi8iICsgKHRlbnVtLT5nZXRfbmFtZSgpKSsiLmNzIjsKLSAgb2ZzdHJlYW0gZl9lbnVtOwotICBmX2VudW0ub3BlbihmX2VudW1fbmFtZS5jX3N0cigpKTsKLQotICBmX2VudW0gPDwKLSAgICBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsOwotCi0gIHN0YXJ0X2NzaGFycF9uYW1lc3BhY2UoZl9lbnVtKTsKLQotICBnZW5lcmF0ZV9jc2hhcnBfZG9jKGZfZW51bSwgdGVudW0pOwotCi0gIGluZGVudChmX2VudW0pIDw8Ci0gICAgInB1YmxpYyBlbnVtICIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIlxuIjsKLSAgc2NvcGVfdXAoZl9lbnVtKTsKLQotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7Ci0gIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgICAgIGdlbmVyYXRlX2NzaGFycF9kb2MoZl9lbnVtLCAqY19pdGVyKTsKLQotICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0gICAgaW5kZW50KGZfZW51bSkgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8IHZhbHVlIDw8ICIsIiA8PCBlbmRsOwotICB9Ci0KLSAgc2NvcGVfZG93bihmX2VudW0pOwotCi0gIGVuZF9jc2hhcnBfbmFtZXNwYWNlKGZfZW51bSk7Ci0KLSAgZl9lbnVtLmNsb3NlKCk7Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykgewotICBpZiAoY29uc3RzLmVtcHR5KCkpewotICAgIHJldHVybjsKLSAgfQotICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IG5hbWVzcGFjZV9kaXJfICsgJy8nICsgcHJvZ3JhbV9uYW1lXyArICAiLkNvbnN0YW50cy5jcyI7Ci0gIG9mc3RyZWFtIGZfY29uc3RzOwotICBmX2NvbnN0cy5vcGVuKGZfY29uc3RzX25hbWUuY19zdHIoKSk7Ci0KLSAgZl9jb25zdHMgPDwKLSAgICBhdXRvZ2VuX2NvbW1lbnQoKSA8PAotICAgIGNzaGFycF90eXBlX3VzaW5ncygpIDw8IGVuZGw7Ci0KLSAgc3RhcnRfY3NoYXJwX25hbWVzcGFjZShmX2NvbnN0cyk7Ci0KLSAgaW5kZW50KGZfY29uc3RzKSA8PAotICAgICJwdWJsaWMgc3RhdGljIGNsYXNzICIgPDwgbWFrZV92YWxpZF9jc2hhcnBfaWRlbnRpZmllcihwcm9ncmFtX25hbWVfKSA8PCAiQ29uc3RhbnRzIiA8PCBlbmRsOwotICBzY29wZV91cChmX2NvbnN0cyk7Ci0KLSAgdmVjdG9yPHRfY29uc3QqPjo6aXRlcmF0b3IgY19pdGVyOwotICBib29sIG5lZWRfc3RhdGljX2NvbnN0cnVjdG9yID0gZmFsc2U7Ci0gIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgZ2VuZXJhdGVfY3NoYXJwX2RvYyhmX2NvbnN0cywgKCpjX2l0ZXIpKTsKLSAgICBpZiAocHJpbnRfY29uc3RfdmFsdWUoZl9jb25zdHMsICgqY19pdGVyKS0+Z2V0X25hbWUoKSwgKCpjX2l0ZXIpLT5nZXRfdHlwZSgpLCAoKmNfaXRlciktPmdldF92YWx1ZSgpLCBmYWxzZSkpIHsKLSAgICAgIG5lZWRfc3RhdGljX2NvbnN0cnVjdG9yID0gdHJ1ZTsKLSAgICB9Ci0gIH0KLQotICBpZiAobmVlZF9zdGF0aWNfY29uc3RydWN0b3IpIHsKLSAgICBwcmludF9jb25zdF9jb25zdHJ1Y3RvcihmX2NvbnN0cywgY29uc3RzKTsKLSAgfQotCi0gIHNjb3BlX2Rvd24oZl9jb25zdHMpOwotICBlbmRfY3NoYXJwX25hbWVzcGFjZShmX2NvbnN0cyk7Ci0gIGZfY29uc3RzLmNsb3NlKCk7Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpwcmludF9jb25zdF9kZWZfdmFsdWUoc3RkOjpvZnN0cmVhbSYgb3V0LCBzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkKLXsKLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgdF9maWVsZCogZmllbGQgPSBOVUxMOwotICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKLSAgICAgICAgICBmaWVsZCA9ICgqZl9pdGVyKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGZpZWxkID09IE5VTEwpIHsKLSAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKLSAgICAgIH0KLSAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IGZpZWxkLT5nZXRfdHlwZSgpOwotICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKLSAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIi4iIDw8IHByb3BfbmFtZShmaWVsZCkgPDwgIiA9ICIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBzdHJpbmcga2V5ID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwga3R5cGUsIHZfaXRlci0+Zmlyc3QpOwotICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIHZ0eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICJbIiA8PCBrZXkgPDwgIl0iIDw8ICIgPSAiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgdF90eXBlKiBldHlwZTsKLSAgICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgfQotCi0gICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7Ci0gICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgZXR5cGUsICp2X2l0ZXIpOwotICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiLkFkZCgiIDw8IHZhbCA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpwcmludF9jb25zdF9jb25zdHJ1Y3RvcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpIHsKLSAgaW5kZW50KG91dCkgPDwgInN0YXRpYyAiIDw8IG1ha2VfdmFsaWRfY3NoYXJwX2lkZW50aWZpZXIocHJvZ3JhbV9uYW1lXykuY19zdHIoKSA8PCAiQ29uc3RhbnRzKCkiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKG91dCk7Ci0gIHZlY3Rvcjx0X2NvbnN0Kj46Oml0ZXJhdG9yIGNfaXRlcjsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBzdHJpbmcgbmFtZSA9ICgqY19pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICB0X3R5cGUqIHR5cGUgPSAoKmNfaXRlciktPmdldF90eXBlKCk7Ci0gICAgdF9jb25zdF92YWx1ZSogdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOwotCi0gICAgcHJpbnRfY29uc3RfZGVmX3ZhbHVlKG91dCwgbmFtZSwgdHlwZSwgdmFsdWUpOwotICB9Ci0gIHNjb3BlX2Rvd24ob3V0KTsKLX0KLQotCi0vL2l0IHNlZW1zIGxpa2UgYWxsIHRoYXQgbWV0aG9kcyB0aGF0IGNhbGwgdGhpcyBhcmUgdXNpbmcgaW5fc3RhdGljIHRvIGJlIHRoZSBvcHBvc2l0ZSBvZiB3aGF0IGl0IHdvdWxkIGltcGx5Ci1ib29sIHRfY3NoYXJwX2dlbmVyYXRvcjo6cHJpbnRfY29uc3RfdmFsdWUoc3RkOjpvZnN0cmVhbSYgb3V0LCBzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwgYm9vbCBpbl9zdGF0aWMsIGJvb2wgZGVmdmFsLCBib29sIG5lZWR0eXBlKSB7Ci0gIGluZGVudChvdXQpOwotICBib29sIG5lZWRfc3RhdGljX2NvbnN0cnVjdGlvbiA9ICFpbl9zdGF0aWM7Ci0gIHdoaWxlICh0eXBlLT5pc190eXBlZGVmKCkpIHsKLSAgICB0eXBlID0gKCh0X3R5cGVkZWYqKXR5cGUpLT5nZXRfdHlwZSgpOwotICB9Ci0KLSAgaWYgKCFkZWZ2YWwgfHwgbmVlZHR5cGUpIHsKLSAgICBvdXQgPDwKLSAgICAgIChpbl9zdGF0aWMgPyAiIiA6IHR5cGUtPmlzX2Jhc2VfdHlwZSgpID8gInB1YmxpYyBjb25zdCAiIDogInB1YmxpYyBzdGF0aWMgIikgPDwKLSAgICAgIHR5cGVfbmFtZSh0eXBlKSA8PCAiICI7Ci0gIH0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgc3RyaW5nIHYyID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgdHlwZSwgdmFsdWUpOwotICAgIG91dCA8PCBuYW1lIDw8ICIgPSAiIDw8IHYyIDw8ICI7IiA8PCBlbmRsOwotICAgIG5lZWRfc3RhdGljX2NvbnN0cnVjdGlvbiA9IGZhbHNlOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIG91dCA8PCBuYW1lIDw8ICIgPSAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIi4iIDw8IHZhbHVlLT5nZXRfaWRlbnRpZmllcl9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgbmVlZF9zdGF0aWNfY29uc3RydWN0aW9uID0gZmFsc2U7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIG91dCA8PCBuYW1lIDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIigpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIG91dCA8PCBuYW1lIDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSwgdHJ1ZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKLSAgICBvdXQgPDwgbmFtZSA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIoKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBpZiAoZGVmdmFsICYmICF0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiAhdHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcHJpbnRfY29uc3RfZGVmX3ZhbHVlKG91dCwgbmFtZSwgdHlwZSwgdmFsdWUpOwotICB9Ci0KLSAgcmV0dXJuIG5lZWRfc3RhdGljX2NvbnN0cnVjdGlvbjsKLX0KLQotc3RkOjpzdHJpbmcgdF9jc2hhcnBfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUob2ZzdHJlYW0mIG91dCwgc3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKLSAgKHZvaWQpIG5hbWU7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSByZW5kZXI7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICByZW5kZXIgPDwgJyInIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgcmVuZGVyIDw8ICgodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgewotICAgICAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZW5kZXIgPDwgdHlwZS0+Z2V0X25hbWUoKSA8PCAiLiIgPDwgdmFsdWUtPmdldF9pZGVudGlmaWVyX25hbWUoKTsKLSAgfSBlbHNlIHsKLSAgICBzdHJpbmcgdCA9IHRtcCgidG1wIik7Ci0gICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LCB0LCB0eXBlLCB2YWx1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgcmVuZGVyIDw8IHQ7Ci0gIH0KLQotICByZXR1cm4gcmVuZGVyLnN0cigpOwotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGlmICh1bmlvbl8gJiYgdHN0cnVjdC0+aXNfdW5pb24oKSkgewotICAgIGdlbmVyYXRlX2NzaGFycF91bmlvbih0c3RydWN0KTsKLSAgfSBlbHNlIHsKLSAgICBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0KHRzdHJ1Y3QsIGZhbHNlKTsKLSAgfQotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgewotICBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0KHR4Y2VwdGlvbiwgdHJ1ZSk7Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jc2hhcnBfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbikgewotICBzdHJpbmcgZl9zdHJ1Y3RfbmFtZSA9IG5hbWVzcGFjZV9kaXJfICsgIi8iICsgKHRzdHJ1Y3QtPmdldF9uYW1lKCkpICsgIi5jcyI7Ci0gIG9mc3RyZWFtIGZfc3RydWN0OwotCi0gIGZfc3RydWN0Lm9wZW4oZl9zdHJ1Y3RfbmFtZS5jX3N0cigpKTsKLQotICBmX3N0cnVjdCA8PAotICAgIGF1dG9nZW5fY29tbWVudCgpIDw8Ci0gICAgY3NoYXJwX3R5cGVfdXNpbmdzKCkgPDwKLSAgICBjc2hhcnBfdGhyaWZ0X3VzaW5ncygpIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9kZWZpbml0aW9uKGZfc3RydWN0LCB0c3RydWN0LCBpc19leGNlcHRpb24pOwotCi0gIGZfc3RydWN0LmNsb3NlKCk7Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X2RlZmluaXRpb24ob2ZzdHJlYW0gJm91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uLCBib29sIGluX2NsYXNzLCBib29sIGlzX3Jlc3VsdCkgewotCi0gIGlmICghaW5fY2xhc3MpIHsKLSAgICBzdGFydF9jc2hhcnBfbmFtZXNwYWNlKG91dCk7Ci0gIH0KLQotICBvdXQgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9jc2hhcnBfZG9jKG91dCwgdHN0cnVjdCk7Ci0gIHByZXBhcmVfbWVtYmVyX25hbWVfbWFwcGluZyggdHN0cnVjdCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgIiNpZiAhU0lMVkVSTElHSFQiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJbU2VyaWFsaXphYmxlXSIgPDwgZW5kbDsgCi0gIGluZGVudChvdXQpIDw8ICIjZW5kaWYiIDw8IGVuZGw7Ci0gIGlmICgoc2VyaWFsaXplX3x8d2NmXykgJiYhaXNfZXhjZXB0aW9uKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIltEYXRhQ29udHJhY3QoTmFtZXNwYWNlPVwiIiA8PCB3Y2ZfbmFtZXNwYWNlXyA8PCAiXCIpXSIgPDwgZW5kbDsgLy8gZG8gbm90IG1ha2UgZXhjZXB0aW9uIGNsYXNzZXMgZGlyZWN0bHkgV0NGIHNlcmlhbGl6YWJsZSwgd2UgcHJvdmlkZSBhIHNlcGVyYXRlICJmYXVsdCIgZm9yIHRoYXQKLSAgfQotICBib29sIGlzX2ZpbmFsID0gKHRzdHJ1Y3QtPmFubm90YXRpb25zXy5maW5kKCJmaW5hbCIpICE9IHRzdHJ1Y3QtPmFubm90YXRpb25zXy5lbmQoKSk7Ci0gCi0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCAoaXNfZmluYWwgPyAic2VhbGVkICIgOiAiIikgPDwgInBhcnRpYWwgY2xhc3MgIiA8PCBub3JtYWxpemVfbmFtZSh0c3RydWN0LT5nZXRfbmFtZSgpKSA8PCAiIDogIjsKLQotICBpZiAoaXNfZXhjZXB0aW9uKSB7Ci0gICAgb3V0IDw8ICJURXhjZXB0aW9uLCAiOwotICB9Ci0gIG91dCA8PCAiVEJhc2UiOwotCi0gIG91dCA8PCBlbmRsOwotCi0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLQotICAvL21ha2UgcHJpdmF0ZSBtZW1iZXJzIHdpdGggcHVibGljIFByb3BlcnRpZXMKLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIC8vIGlmIHRoZSBmaWVsZCBpcyByZXF1aWVkLCB0aGVuIHdlIHVzZSBhdXRvLXByb3BlcnRpZXMKLSAgICBpZiAoIWZpZWxkX2lzX3JlcXVpcmVkKCgqbV9pdGVyKSkgJiYgKCFudWxsYWJsZV8gfHwgZmllbGRfaGFzX2RlZmF1bHQoKCptX2l0ZXIpKSkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJwcml2YXRlICIgPDwgZGVjbGFyZV9maWVsZCgqbV9pdGVyLCBmYWxzZSwgIl8iKSA8PCBlbmRsOwotICAgIH0KLSAgfQotICBvdXQgPDwgZW5kbDsKLQotICBib29sIGhhc19ub25fcmVxdWlyZWRfZmllbGRzID0gZmFsc2U7Ci0gIGJvb2wgaGFzX25vbl9yZXF1aXJlZF9kZWZhdWx0X3ZhbHVlX2ZpZWxkcyA9IGZhbHNlOwotICBib29sIGhhc19yZXF1aXJlZF9maWVsZHMgPSBmYWxzZTsKLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIGdlbmVyYXRlX2NzaGFycF9kb2Mob3V0LCAqbV9pdGVyKTsKLSAgICBnZW5lcmF0ZV9wcm9wZXJ0eShvdXQsICptX2l0ZXIsIHRydWUsIHRydWUpOwotICAgIGJvb2wgaXNfcmVxdWlyZWQgPSBmaWVsZF9pc19yZXF1aXJlZCgoKm1faXRlcikpOwotICAgIGJvb2wgaGFzX2RlZmF1bHQgPSBmaWVsZF9oYXNfZGVmYXVsdCgoKm1faXRlcikpOwotICAgIGlmIChpc19yZXF1aXJlZCkgewotICAgICAgaGFzX3JlcXVpcmVkX2ZpZWxkcyA9IHRydWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmIChoYXNfZGVmYXVsdCkgewotICAgICAgICBoYXNfbm9uX3JlcXVpcmVkX2RlZmF1bHRfdmFsdWVfZmllbGRzID0gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGhhc19ub25fcmVxdWlyZWRfZmllbGRzID0gdHJ1ZTsKLSAgICB9Ci0gIH0KLQotICBib29sIGdlbmVyYXRlX2lzc2V0ID0KLSAgICAobnVsbGFibGVfICYmIGhhc19ub25fcmVxdWlyZWRfZGVmYXVsdF92YWx1ZV9maWVsZHMpCi0gICAgfHwgKCFudWxsYWJsZV8gJiYgaGFzX25vbl9yZXF1aXJlZF9maWVsZHMpOwotICBpZiAoZ2VuZXJhdGVfaXNzZXQpIHsKLSAgICBvdXQgPDwKLSAgICAgIGVuZGw7Ci0gICAgaWYoc2VyaWFsaXplX3x8d2NmXykgewotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJbWG1sSWdub3JlXSAvLyBYbWxTZXJpYWxpemVyIiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJbRGF0YU1lbWJlcihPcmRlciA9IDEpXSAgLy8gWG1sT2JqZWN0U2VyaWFsaXplciwgRGF0YUNvbnRyYWN0SnNvblNlcmlhbGl6ZXIsIGV0Yy4iIDw8IGVuZGw7Ci0gICAgfQotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgInB1YmxpYyBJc3NldCBfX2lzc2V0OyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiNpZiAhU0lMVkVSTElHSFQiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJbU2VyaWFsaXphYmxlXSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiNlbmRpZiIgPDwgZW5kbDsKLSAgICBpZiAoc2VyaWFsaXplX3x8d2NmXykgewotICAgICAgaW5kZW50KG91dCkgPDwgIltEYXRhQ29udHJhY3RdIiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIHN0cnVjdCBJc3NldCB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIGJvb2wgaXNfcmVxdWlyZWQgPSBmaWVsZF9pc19yZXF1aXJlZCgoKm1faXRlcikpOwotICAgICAgYm9vbCBoYXNfZGVmYXVsdCA9IGZpZWxkX2hhc19kZWZhdWx0KCgqbV9pdGVyKSk7Ci0gICAgICAvLyBpZiBpdCBpcyByZXF1aXJlZCwgZG9uJ3QgbmVlZCBJc3NldCBmb3IgdGhhdCB2YXJpYWJsZQotICAgICAgLy8gaWYgaXQgaXMgbm90IHJlcXVpcmVkLCBpZiBpdCBoYXMgYSBkZWZhdWx0IHZhbHVlLCB3ZSBuZWVkIHRvIGdlbmVyYXRlIElzc2V0Ci0gICAgICAvLyBpZiB3ZSBhcmUgbm90IG51bGxhYmxlLCB0aGVuIHdlIGdlbmVyYXRlIElzc2V0Ci0gICAgICBpZiAoIWlzX3JlcXVpcmVkICYmICghbnVsbGFibGVfIHx8IGhhc19kZWZhdWx0KSkgewotICAgICAgICBpZihzZXJpYWxpemVffHx3Y2ZfKSB7Ci0gICAgICAgICAgaW5kZW50KG91dCkgPDwgIltEYXRhTWVtYmVyXSIgPDwgZW5kbDsKLSAgICAgICAgfSAKLSAgICAgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBib29sICIgPDwgbm9ybWFsaXplX25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICBpZihnZW5lcmF0ZV9pc3NldCAmJiAoc2VyaWFsaXplX3x8d2NmXykpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICIjcmVnaW9uIFhtbFNlcmlhbGl6ZXIgc3VwcG9ydCIgPDwgZW5kbCA8PCBlbmRsOwotIAotICAgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgICBib29sIGlzX3JlcXVpcmVkID0gZmllbGRfaXNfcmVxdWlyZWQoKCptX2l0ZXIpKTsKLSAgICAgICAgYm9vbCBoYXNfZGVmYXVsdCA9IGZpZWxkX2hhc19kZWZhdWx0KCgqbV9pdGVyKSk7Ci0gICAgICAgIC8vIGlmIGl0IGlzIHJlcXVpcmVkLCBkb24ndCBuZWVkIElzc2V0IGZvciB0aGF0IHZhcmlhYmxlCi0gICAgICAgIC8vIGlmIGl0IGlzIG5vdCByZXF1aXJlZCwgaWYgaXQgaGFzIGEgZGVmYXVsdCB2YWx1ZSwgd2UgbmVlZCB0byBnZW5lcmF0ZSBJc3NldAotICAgICAgICAvLyBpZiB3ZSBhcmUgbm90IG51bGxhYmxlLCB0aGVuIHdlIGdlbmVyYXRlIElzc2V0Ci0gICAgICAgIGlmICghaXNfcmVxdWlyZWQgJiYgKCFudWxsYWJsZV8gfHwgaGFzX2RlZmF1bHQpKSB7Ci0gICAgICAgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBib29sIFNob3VsZFNlcmlhbGl6ZSIgPDwgcHJvcF9uYW1lKCgqbV9pdGVyKSkgPDwgIigpIiA8PCBlbmRsOwotICAgICAgICAgIGluZGVudChvdXQpIDw8ICJ7IiA8PCBlbmRsOwotICAgICAgICAgIGluZGVudF91cCgpOwotICAgICAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gX19pc3NldC4iIDw8IG5vcm1hbGl6ZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGluZGVudChvdXQpIDw8ICIjZW5kcmVnaW9uIFhtbFNlcmlhbGl6ZXIgc3VwcG9ydCIgPDwgZW5kbCA8PCBlbmRsOwotICAgIH0KLSAgfQotICAKLSAgLy8gV2UgYWx3YXlzIHdhbnQgYSBkZWZhdWx0LCBubyBhcmd1bWVudCBjb25zdHJ1Y3RvciBmb3IgUmVhZGluZwotICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgbm9ybWFsaXplX25hbWUodHN0cnVjdC0+Z2V0X25hbWUoKSkgPDwgIigpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICB0X3R5cGUqIHQgPSAoKm1faXRlciktPmdldF90eXBlKCk7Ci0gICAgd2hpbGUgKHQtPmlzX3R5cGVkZWYoKSkgewotICAgICAgdCA9ICgodF90eXBlZGVmKil0KS0+Z2V0X3R5cGUoKTsKLSAgICB9Ci0gICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgewotICAgICAgaWYgKGZpZWxkX2lzX3JlcXVpcmVkKCgqbV9pdGVyKSkpIHsKLSAgICAgICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LCAidGhpcy4iICsgcHJvcF9uYW1lKCptX2l0ZXIpLCB0LCAoKm1faXRlciktPmdldF92YWx1ZSgpLCB0cnVlLCB0cnVlKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHByaW50X2NvbnN0X3ZhbHVlKG91dCwgInRoaXMuXyIgKyAoKm1faXRlciktPmdldF9uYW1lKCksIHQsICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCksIHRydWUsIHRydWUpOwotICAgICAgICAvLyBPcHRpb25hbHMgd2l0aCBkZWZhdWx0cyBhcmUgbWFya2VkIHNldAotICAgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy5fX2lzc2V0LiIgPDwgbm9ybWFsaXplX25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiID0gdHJ1ZTsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIAotICBpZiAoaGFzX3JlcXVpcmVkX2ZpZWxkcykgewotICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoIjsKLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICBpZiAoZmllbGRfaXNfcmVxdWlyZWQoKCptX2l0ZXIpKSkgewotICAgICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIG91dCA8PCAiLCAiOwotICAgICAgICB9Ci0gICAgICAgIG91dCA8PCB0eXBlX25hbWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICAgfQotICAgIH0KLSAgICBvdXQgPDwgIikgOiB0aGlzKCkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIGlmIChmaWVsZF9pc19yZXF1aXJlZCgoKm1faXRlcikpKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgcHJvcF9uYW1lKCgqbV9pdGVyKSkgPDwgIiA9ICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotICAKLSAgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9yZWFkZXIob3V0LCB0c3RydWN0KTsKLSAgaWYgKGlzX3Jlc3VsdCkgewotICAgIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOwotICB9IGVsc2UgewotICAgIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCk7Ci0gIH0KLSAgaWYgKGhhc2hjb2RlXykgewotICAgIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfZXF1YWxzKG91dCwgdHN0cnVjdCk7Ci0gICAgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9oYXNoY29kZShvdXQsIHRzdHJ1Y3QpOwotICB9Ci0gIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfdG9zdHJpbmcob3V0LCB0c3RydWN0KTsKLSAgc2NvcGVfZG93bihvdXQpOwotICBvdXQgPDwgZW5kbDsKLQotICAvLyBnZW5lcmF0ZSBhIGNvcnJlc3BvbmRpbmcgV0NGIGZhdWx0IHRvIHdyYXAgdGhlIGV4Y2VwdGlvbgotICBpZigoc2VyaWFsaXplX3x8d2NmXykgJiYgaXNfZXhjZXB0aW9uKSB7Ci0gICAgZ2VuZXJhdGVfY3NoYXJwX3djZmZhdWx0KG91dCwgdHN0cnVjdCk7Ci0gIH0KLQotICBjbGVhbnVwX21lbWJlcl9uYW1lX21hcHBpbmcoIHRzdHJ1Y3QpOwotICBpZiAoIWluX2NsYXNzKSB7Ci0gICAgZW5kX2NzaGFycF9uYW1lc3BhY2Uob3V0KTsKLSAgfQotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX3djZmZhdWx0KG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIG91dCA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiI2lmICFTSUxWRVJMSUdIVCIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIltTZXJpYWxpemFibGVdIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiI2VuZGlmIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiW0RhdGFDb250cmFjdF0iIDw8IGVuZGw7Ci0gIGJvb2wgaXNfZmluYWwgPSAodHN0cnVjdC0+YW5ub3RhdGlvbnNfLmZpbmQoImZpbmFsIikgIT0gdHN0cnVjdC0+YW5ub3RhdGlvbnNfLmVuZCgpKTsKLQotICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgKGlzX2ZpbmFsID8gInNlYWxlZCAiIDogIiIpIDw8ICJwYXJ0aWFsIGNsYXNzICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiRmF1bHQiIDw8IGVuZGw7Ci0KLSAgc2NvcGVfdXAob3V0KTsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIC8vIG1ha2UgcHJpdmF0ZSBtZW1iZXJzIHdpdGggcHVibGljIFByb3BlcnRpZXMKLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgInByaXZhdGUgIiA8PCBkZWNsYXJlX2ZpZWxkKCptX2l0ZXIsIGZhbHNlLCAiXyIpIDw8IGVuZGw7Ci0gIH0KLSAgb3V0IDw8IGVuZGw7Ci0KLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIGdlbmVyYXRlX3Byb3BlcnR5KG91dCwgKm1faXRlciwgdHJ1ZSwgZmFsc2UpOwotICB9Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotICBvdXQgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfcmVhZGVyKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGluZGVudChvdXQpIDw8Ci0gICAgInB1YmxpYyB2b2lkIFJlYWQgKFRQcm90b2NvbCBpcHJvdCkiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIC8vIFJlcXVpcmVkIHZhcmlhYmxlcyBhcmVuJ3QgaW4gX19pc3NldCwgc28gd2UgbmVlZCB0bXAgdmFycyB0byBjaGVjayB0aGVtCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpZWxkX2lzX3JlcXVpcmVkKCgqZl9pdGVyKSkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJib29sIGlzc2V0XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSBmYWxzZTsiIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAiVEZpZWxkIGZpZWxkOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJpcHJvdC5SZWFkU3RydWN0QmVnaW4oKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAid2hpbGUgKHRydWUpIiA8PCBlbmRsOwotICBzY29wZV91cChvdXQpOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgImZpZWxkID0gaXByb3QuUmVhZEZpZWxkQmVnaW4oKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAiaWYgKGZpZWxkLlR5cGUgPT0gVFR5cGUuU3RvcCkgeyAiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PAotICAgICJicmVhazsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8Ci0gICAgIn0iIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAic3dpdGNoIChmaWVsZC5JRCkiIDw8IGVuZGw7Ci0KLSAgc2NvcGVfdXAob3V0KTsKLQotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGJvb2wgaXNfcmVxdWlyZWQgPSBmaWVsZF9pc19yZXF1aXJlZCgoKmZfaXRlcikpOwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiY2FzZSAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICI6IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiaWYgKGZpZWxkLlR5cGUgPT0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotCi0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyKTsKLSAgICBpZiAoaXNfcmVxdWlyZWQpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJpc3NldF8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gdHJ1ZTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIAotICAgIGluZGVudF9kb3duKCk7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAifSBlbHNlIHsgIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICBUUHJvdG9jb2xVdGlsLlNraXAoaXByb3QsIGZpZWxkLlR5cGUpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfQotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgImRlZmF1bHQ6ICIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJUUHJvdG9jb2xVdGlsLlNraXAoaXByb3QsIGZpZWxkLlR5cGUpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLQotICBzY29wZV9kb3duKG91dCk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAiaXByb3QuUmVhZEZpZWxkRW5kKCk7IiA8PCBlbmRsOwotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICJpcHJvdC5SZWFkU3RydWN0RW5kKCk7IiA8PCBlbmRsOwotCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpZWxkX2lzX3JlcXVpcmVkKCgqZl9pdGVyKSkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIWlzc2V0XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAidGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgIH0KLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX3N0cnVjdF93cml0ZXIob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgInB1YmxpYyB2b2lkIFdyaXRlKFRQcm90b2NvbCBvcHJvdCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgIlRTdHJ1Y3Qgc3RydWMgPSBuZXcgVFN0cnVjdChcIiIgPDwgbmFtZSA8PCAiXCIpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwKLSAgICAib3Byb3QuV3JpdGVTdHJ1Y3RCZWdpbihzdHJ1Yyk7IiA8PCBlbmRsOwotCi0gIGlmIChmaWVsZHMuc2l6ZSgpID4gMCkgewotICAgIGluZGVudChvdXQpIDw8ICJURmllbGQgZmllbGQgPSBuZXcgVEZpZWxkKCk7IiA8PCBlbmRsOwotICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICBib29sIGlzX3JlcXVpcmVkID0gZmllbGRfaXNfcmVxdWlyZWQoKCpmX2l0ZXIpKTsKLSAgICAgIGJvb2wgaGFzX2RlZmF1bHQgPSBmaWVsZF9oYXNfZGVmYXVsdCgoKmZfaXRlcikpOwotICAgICAgaWYgKG51bGxhYmxlXyAmJiAhaGFzX2RlZmF1bHQgJiYgIWlzX3JlcXVpcmVkKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKSA8PCAiICE9IG51bGwpIHsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF91cCgpOwotICAgICAgfSBlbHNlIGlmICghaXNfcmVxdWlyZWQpIHsKLSAgICAgICAgYm9vbCBudWxsX2FsbG93ZWQgPSB0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgICAgIGlmIChudWxsX2FsbG93ZWQpIHsKLSAgICAgICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAgICAgImlmICgiIDw8IHByb3BfbmFtZSgoKmZfaXRlcikpIDw8ICIgIT0gbnVsbCAmJiBfX2lzc2V0LiIgPDwgbm9ybWFsaXplX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgICAgICAgIGluZGVudF91cCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICAgICAiaWYgKF9faXNzZXQuIiA8PCBub3JtYWxpemVfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGluZGVudChvdXQpIDw8ICJmaWVsZC5OYW1lID0gXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCI7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgImZpZWxkLlR5cGUgPSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICI7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgImZpZWxkLklEID0gIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oZmllbGQpOyIgPDwgZW5kbDsKLQotICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlcik7Ci0KLSAgICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC5Xcml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOwotICAgICAgaWYgKCFpc19yZXF1aXJlZCkgewotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBpbmRlbnQob3V0KSA8PCAib3Byb3QuV3JpdGVGaWVsZFN0b3AoKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJvcHJvdC5Xcml0ZVN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotCi0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X3Jlc3VsdF93cml0ZXIob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgaW5kZW50KG91dCkgPDwKLSAgICAicHVibGljIHZvaWQgV3JpdGUoVFByb3RvY29sIG9wcm90KSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAiVFN0cnVjdCBzdHJ1YyA9IG5ldyBUU3RydWN0KFwiIiA8PCBuYW1lIDw8ICJcIik7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PAotICAgICJvcHJvdC5Xcml0ZVN0cnVjdEJlZ2luKHN0cnVjKTsiIDw8IGVuZGw7Ci0KLSAgaWYgKGZpZWxkcy5zaXplKCkgPiAwKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIlRGaWVsZCBmaWVsZCA9IG5ldyBURmllbGQoKTsiIDw8IGVuZGw7Ci0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgIGlmIChmaXJzdCkgewotICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaWYgIjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PCAiIGVsc2UgaWYgIjsKLSAgICAgIH0KLSAgICAgIAotICAgICAgaWYgKG51bGxhYmxlXykgewotICAgICAgICBvdXQgPDwgIih0aGlzLiIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIiAhPSBudWxsKSB7IiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0IDw8ICIodGhpcy5fX2lzc2V0LiIgPDwgbm9ybWFsaXplX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgICAgfQotICAgICAgaW5kZW50X3VwKCk7Ci0KLSAgICAgIGJvb2wgbnVsbF9hbGxvd2VkID0gIW51bGxhYmxlXyAmJiB0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgICBpZiAobnVsbF9hbGxvd2VkKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICAgImlmICgiIDw8IHByb3BfbmFtZSgqZl9pdGVyKSA8PCAiICE9IG51bGwpIHsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF91cCgpOwotICAgICAgfQotCi0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAiZmllbGQuTmFtZSA9IFwiIiA8PCBwcm9wX25hbWUoKmZfaXRlcikgPDwgIlwiOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICJmaWVsZC5UeXBlID0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICJmaWVsZC5JRCA9ICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAib3Byb3QuV3JpdGVGaWVsZEJlZ2luKGZpZWxkKTsiIDw8IGVuZGw7Ci0KLSAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIpOwotCi0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAib3Byb3QuV3JpdGVGaWVsZEVuZCgpOyIgPDwgZW5kbDsKLQotICAgICAgaWYgKG51bGxfYWxsb3dlZCkgewotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IjsKLSAgICB9Ci0gIH0KLQotICBvdXQgPDwKLSAgICBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIm9wcm90LldyaXRlRmllbGRTdG9wKCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIm9wcm90LldyaXRlU3RydWN0RW5kKCk7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX3N0cnVjdF90b3N0cmluZyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBpbmRlbnQob3V0KSA8PAotICAgICJwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAiU3RyaW5nQnVpbGRlciBfX3NiID0gbmV3IFN0cmluZ0J1aWxkZXIoXCIiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIihcIik7IiA8PCBlbmRsOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBib29sIHVzZUZpcnN0RmxhZyA9IGZhbHNlOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmKCAhIGZpZWxkX2lzX3JlcXVpcmVkKCgqZl9pdGVyKSkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJib29sIF9fZmlyc3QgPSB0cnVlOyIgPDwgZW5kbDsKLSAgICAgIHVzZUZpcnN0RmxhZyA9IHRydWU7Ci0gICAgfQotICAgIGJyZWFrOwotICB9Ci0KLSAgYm9vbCBoYWRfcmVxdWlyZWQgPSBmYWxzZTsgIC8vIHNldCB0byB0cnVlIGFmdGVyIGZpcnN0IHJlcXVpcmVkIGZpZWxkIGhhcyBiZWVuIHByb2Nlc3NlZAotCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgYm9vbCBpc19yZXF1aXJlZCA9IGZpZWxkX2lzX3JlcXVpcmVkKCgqZl9pdGVyKSk7Ci0gICAgYm9vbCBoYXNfZGVmYXVsdCA9IGZpZWxkX2hhc19kZWZhdWx0KCgqZl9pdGVyKSk7Ci0gICAgaWYgKG51bGxhYmxlXyAmJiAhaGFzX2RlZmF1bHQgJiYgIWlzX3JlcXVpcmVkKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIiAhPSBudWxsKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgfSBlbHNlIGlmICghaXNfcmVxdWlyZWQpIHsKLSAgICAgIGJvb2wgbnVsbF9hbGxvd2VkID0gdHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpOwotICAgICAgaWYgKG51bGxfYWxsb3dlZCkgewotICAgICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAgICJpZiAoIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKSA8PCAiICE9IG51bGwgJiYgX19pc3NldC4iIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIikgeyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAgICJpZiAoX19pc3NldC4iIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIikgeyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYoIHVzZUZpcnN0RmxhZyAmJiAoISBoYWRfcmVxdWlyZWQpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiaWYoIV9fZmlyc3QpIHsgX19zYi5BcHBlbmQoXCIsIFwiKTsgfSIgPDwgZW5kbDsKLSAgICAgIGlmKCAhIGlzX3JlcXVpcmVkKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJfX2ZpcnN0ID0gZmFsc2U7IiA8PCBlbmRsOwotICAgICAgfQotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgIl9fc2IuQXBwZW5kKFwiIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKSA8PCAiOiBcIik7IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAiX19zYi5BcHBlbmQoXCIsICIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIjogXCIpOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgICAgIAotICAgICAgICAgIAotICAgIHRfdHlwZSogdHR5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7Ci0gICAgaWYgKHR0eXBlLT5pc194Y2VwdGlvbigpIHx8IHR0eXBlLT5pc19zdHJ1Y3QoKSkgewotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgIl9fc2IuQXBwZW5kKCIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIj09IG51bGwgPyBcIjxudWxsPlwiIDogIjw8IHByb3BfbmFtZSgoKmZfaXRlcikpICA8PCAiLlRvU3RyaW5nKCkpOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgIl9fc2IuQXBwZW5kKCIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgIDw8ICIpOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgICAgIAotICAgIGlmICghaXNfcmVxdWlyZWQpIHsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgaGFkX3JlcXVpcmVkID0gdHJ1ZTsgIC8vIG5vdyBfX2ZpcnN0IG11c3QgYmUgZmFsc2UsIHNvIHdlIGRvbid0IG5lZWQgdG8gY2hlY2sgaXQgYW55bW9yZQotICAgIH0KLSAgfQotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgIl9fc2IuQXBwZW5kKFwiKVwiKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8Ci0gICAgInJldHVybiBfX3NiLlRvU3RyaW5nKCk7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF91bmlvbih0X3N0cnVjdCogdHVuaW9uKSB7Ci0gIHN0cmluZyBmX3VuaW9uX25hbWUgPSBuYW1lc3BhY2VfZGlyXyArICIvIiArICh0dW5pb24tPmdldF9uYW1lKCkpICsgIi5jcyI7Ci0gIG9mc3RyZWFtIGZfdW5pb247Ci0KLSAgZl91bmlvbi5vcGVuKGZfdW5pb25fbmFtZS5jX3N0cigpKTsKLQotICBmX3VuaW9uIDw8Ci0gICAgYXV0b2dlbl9jb21tZW50KCkgPDwKLSAgICBjc2hhcnBfdHlwZV91c2luZ3MoKSA8PAotICAgIGNzaGFycF90aHJpZnRfdXNpbmdzKCkgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9jc2hhcnBfdW5pb25fZGVmaW5pdGlvbihmX3VuaW9uLCB0dW5pb24pOwotCi0gIGZfdW5pb24uY2xvc2UoKTsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF91bmlvbl9kZWZpbml0aW9uKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHR1bmlvbikgewotICAvLyBMZXQncyBkZWZpbmUgdGhlIGNsYXNzIGZpcnN0Ci0gIHN0YXJ0X2NzaGFycF9uYW1lc3BhY2Uob3V0KTsKLQotICBpbmRlbnQob3V0KSA8PCAicHVibGljIGFic3RyYWN0IHBhcnRpYWwgY2xhc3MgIiA8PCB0dW5pb24tPmdldF9uYW1lKCkgPDwgIiA6IFRBYnN0cmFjdEJhc2UgeyIgPDwgZW5kbDsKLQotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQob3V0KSA8PCAicHVibGljIGFic3RyYWN0IHZvaWQgV3JpdGUoVFByb3RvY29sIHByb3RvY29sKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgcmVhZG9ubHkgYm9vbCBJc3NldDsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgYWJzdHJhY3Qgb2JqZWN0IERhdGEgeyBnZXQ7IH0iIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgInByb3RlY3RlZCAiIDw8IHR1bmlvbi0+Z2V0X25hbWUoKSA8PCAiKGJvb2wgaXNzZXQpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAiSXNzZXQgPSBpc3NldDsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBjbGFzcyBfX191bmRlZmluZWQgOiAiIDw8IHR1bmlvbi0+Z2V0X25hbWUoKSA8PCAiIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgb3ZlcnJpZGUgb2JqZWN0IERhdGEgeyBnZXQgeyByZXR1cm4gbnVsbDsgfSB9IiA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgX19fdW5kZWZpbmVkKCkgOiBiYXNlKGZhbHNlKSB7fSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZShUUHJvdG9jb2wgcHJvdG9jb2wpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAidGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbiggVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwgXCJDYW5ub3QgcGVyc2lzdCBhbiB1bmlvbiB0eXBlIHdoaWNoIGlzIG5vdCBzZXQuXCIpOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHR1bmlvbi0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgZ2VuZXJhdGVfY3NoYXJwX3VuaW9uX2NsYXNzKG91dCwgdHVuaW9uLCAoKmZfaXRlcikpOwotICB9Ci0KLSAgZ2VuZXJhdGVfY3NoYXJwX3VuaW9uX3JlYWRlcihvdXQsIHR1bmlvbik7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBlbmRfY3NoYXJwX25hbWVzcGFjZShvdXQpOwotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX3VuaW9uX2NsYXNzKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHR1bmlvbiwgdF9maWVsZCogdGZpZWxkKSB7Ci0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgY2xhc3MgIiA8PCB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIiA6ICIgPDwgdHVuaW9uLT5nZXRfbmFtZSgpIDw8ICIgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJwcml2YXRlICIgPDwgdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSkgPDwgIiBfZGF0YTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgb3ZlcnJpZGUgb2JqZWN0IERhdGEgeyBnZXQgeyByZXR1cm4gX2RhdGE7IH0gfSIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiKCIgPDwgdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSkgPDwgIiBkYXRhKSA6IGJhc2UodHJ1ZSkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ0aGlzLl9kYXRhID0gZGF0YTsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGUoVFByb3RvY29sIG9wcm90KSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgIlRTdHJ1Y3Qgc3RydWMgPSBuZXcgVFN0cnVjdChcIiIgPDwgdHVuaW9uLT5nZXRfbmFtZSgpIDw8ICJcIik7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAib3Byb3QuV3JpdGVTdHJ1Y3RCZWdpbihzdHJ1Yyk7IiA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJURmllbGQgZmllbGQgPSBuZXcgVEZpZWxkKCk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiZmllbGQuTmFtZSA9IFwiIiA8PCB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIlwiOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgImZpZWxkLlR5cGUgPSAiIDw8IHR5cGVfdG9fZW51bSh0ZmllbGQtPmdldF90eXBlKCkpIDw8ICI7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiZmllbGQuSUQgPSAiIDw8IHRmaWVsZC0+Z2V0X2tleSgpIDw8ICI7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAib3Byb3QuV3JpdGVGaWVsZEJlZ2luKGZpZWxkKTsiIDw8IGVuZGw7Ci0gIAotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCB0ZmllbGQsICJfZGF0YSIsIHRydWUsIHRydWUpOwotCi0gIGluZGVudChvdXQpIDw8ICJvcHJvdC5Xcml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAib3Byb3QuV3JpdGVGaWVsZFN0b3AoKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJvcHJvdC5Xcml0ZVN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9lcXVhbHMob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBvdmVycmlkZSBib29sIEVxdWFscyhvYmplY3QgdGhhdCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIAotICBpbmRlbnQob3V0KSA8PCAidmFyIG90aGVyID0gdGhhdCBhcyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgImlmIChvdGhlciA9PSBudWxsKSByZXR1cm4gZmFsc2U7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiaWYgKFJlZmVyZW5jZUVxdWFscyh0aGlzLCBvdGhlcikpIHJldHVybiB0cnVlOyIgPDwgZW5kbDsKLSAgCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgCi0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICAKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuICI7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICB9IGVsc2UgewotICAgICAgb3V0IDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiJiYgIjsKLSAgICB9Ci0gICAgaWYgKCFmaWVsZF9pc19yZXF1aXJlZCgoKmZfaXRlcikpICYmICEobnVsbGFibGVfICYmICFmaWVsZF9oYXNfZGVmYXVsdCgoKmZfaXRlcikpKSkgewotICAgICAgb3V0IDw8ICIoKF9faXNzZXQuIiA8PCBub3JtYWxpemVfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIAotICAgICAgICAgIDw8ICIgPT0gb3RoZXIuX19pc3NldC4iIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgCi0gICAgICAgICAgPDwgIikgJiYgKCghX19pc3NldC4iIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIikgfHwgKCI7Ci0gICAgfQotICAgIHRfdHlwZSogdHR5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7Ci0gICAgaWYgKHR0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgICAgb3V0IDw8ICJUQ29sbGVjdGlvbnMuRXF1YWxzKCI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dCA8PCAiU3lzdGVtLk9iamVjdC5FcXVhbHMoIjsKLSAgICB9Ci0gICAgb3V0IDw8IHByb3BfbmFtZSgoKmZfaXRlcikpIDw8ICIsIG90aGVyLiIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIikiOwotICAgIGlmICghZmllbGRfaXNfcmVxdWlyZWQoKCpmX2l0ZXIpKSAmJiAhKG51bGxhYmxlXyAmJiAhZmllbGRfaGFzX2RlZmF1bHQoKCpmX2l0ZXIpKSkpIHsKLSAgICAgIG91dCA8PCAiKSkpIjsKLSAgICB9Ci0gIH0KLSAgaWYgKGZpcnN0KSB7Ci0gICAgaW5kZW50KG91dCkgPDwgInJldHVybiB0cnVlOyIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBvdXQgPDwgIjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfQotICAKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfaGFzaGNvZGUob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBvdmVycmlkZSBpbnQgR2V0SGFzaENvZGUoKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgCi0gIGluZGVudChvdXQpIDw8ICJpbnQgaGFzaGNvZGUgPSAwOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInVuY2hlY2tlZCB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF90eXBlKiB0dHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiaGFzaGNvZGUgPSAoaGFzaGNvZGUgKiAzOTcpIF4gIjsKLSAgICBpZiAoZmllbGRfaXNfcmVxdWlyZWQoKCpmX2l0ZXIpKSkgewotICAgIG91dCA8PCAiKCI7Ci0gICAgfSBlbHNlIGlmICggbnVsbGFibGVfKSB7Ci0gICAgICBvdXQgPDwgIigiIDw8IHByb3BfbmFtZSgoKmZfaXRlcikpIDw8ICIgPT0gbnVsbCA/IDAgOiAiOwotICAgIH1lbHNlIHsKLSAgICAgIG91dCA8PCAiKCFfX2lzc2V0LiIgPDwgbm9ybWFsaXplX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiID8gMCA6ICI7Ci0gICAgfQotICAgIGlmICh0dHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICAgICAgICAgIG91dCA8PCAiKFRDb2xsZWN0aW9ucy5HZXRIYXNoQ29kZSgiCi0gICAgICAgICAgICAgICAgICAgIDw8IHByb3BfbmFtZSgoKmZfaXRlcikpCi0gICAgICAgICAgICAgICAgICAgIDw8ICIpKSI7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBvdXQgPDwgIigiCi0gICAgICAgICAgICAgICAgICAgICAgICA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKQotICAgICAgICAgICAgICAgICAgICAgICAgPDwgIi5HZXRIYXNoQ29kZSgpKSI7Ci0gICAgfQotICAgIG91dCA8PCAiKTsiIDw8IGVuZGw7Ci0gIH0KLSAgCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIGhhc2hjb2RlOyIgPDwgZW5kbDsKLSAgCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGZfc2VydmljZV9uYW1lID0gbmFtZXNwYWNlX2Rpcl8gKyAiLyIgKyBzZXJ2aWNlX25hbWVfICsgIi5jcyI7Ci0gIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgYXV0b2dlbl9jb21tZW50KCkgPDwKLSAgICBjc2hhcnBfdHlwZV91c2luZ3MoKSA8PAotICAgIGNzaGFycF90aHJpZnRfdXNpbmdzKCkgPDwgZW5kbDsKLQotICBzdGFydF9jc2hhcnBfbmFtZXNwYWNlKGZfc2VydmljZV8pOwotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJwdWJsaWMgcGFydGlhbCBjbGFzcyAiIDw8IG5vcm1hbGl6ZV9uYW1lKHNlcnZpY2VfbmFtZV8pIDw8ICIgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRzZXJ2aWNlKTsKLQotICBpbmRlbnRfZG93bigpOwotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJ9IiA8PCBlbmRsOwotICBlbmRfY3NoYXJwX25hbWVzcGFjZShmX3NlcnZpY2VfKTsKLSAgZl9zZXJ2aWNlXy5jbG9zZSgpOwotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19pZmFjZSA9ICIiOwotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOwotICAgIGV4dGVuZHNfaWZhY2UgPSAiIDogIiArIGV4dGVuZHMgKyAiLklmYWNlIjsKLSAgfQotCi0gIGdlbmVyYXRlX2NzaGFycF9kb2MoZl9zZXJ2aWNlXywgdHNlcnZpY2UpOwotCi0gIGlmICh3Y2ZfKSB7Ci0gICAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAgICAgICAgICAgIltTZXJ2aWNlQ29udHJhY3QoTmFtZXNwYWNlPVwiIiA8PCB3Y2ZfbmFtZXNwYWNlXyA8PCAiXCIpXSIgPDwgZW5kbDsKLSAgfQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAicHVibGljIGludGVyZmFjZSBJZmFjZSIgPDwgZXh0ZW5kc19pZmFjZSA8PCAiIHsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X3VwKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikKLSAgewotICAgICAgICBnZW5lcmF0ZV9jc2hhcnBfZG9jKGZfc2VydmljZV8sICpmX2l0ZXIpOwotCi0gICAgICAgIC8vIGlmIHdlJ3JlIHVzaW5nIFdDRiwgYWRkIHRoZSBjb3JyZXNwb25kaW5nIGF0dHJpYnV0ZXMKLSAgICAgICAgaWYgKHdjZl8pIHsKLSAgICAgICAgICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICAgICAgICAgICAgICAgICAgICJbT3BlcmF0aW9uQ29udHJhY3RdIiA8PCBlbmRsOwotCi0gICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKS0+Z2V0X21lbWJlcnMoKTsKLSAgICAgICAgICAgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0gICAgICAgICAgICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgICAgICAgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiW0ZhdWx0Q29udHJhY3QodHlwZW9mKCIgKyB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UpICsgIkZhdWx0KSldIiA8PCBlbmRsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgIjsiIDw8IGVuZGw7Ci0gICAgaWYoIWFzeW5jXykgewotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIjaWYgU0lMVkVSTElHSFQiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgZnVuY3Rpb25fc2lnbmF0dXJlX2FzeW5jX2JlZ2luKCpmX2l0ZXIsICJCZWdpbl8iKSA8PCAiOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgIGZ1bmN0aW9uX3NpZ25hdHVyZV9hc3luY19lbmQoKmZfaXRlciwgIkVuZF8iKSA8PCAiOyIgPDwgZW5kbDsgIAotICAgIGlmKGFzeW5jX3x8YXN5bmNfY3RwXykgewotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAgIGZ1bmN0aW9uX3NpZ25hdHVyZV9hc3luYygqZl9pdGVyKSA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaWYgKCFhc3luY18pIHsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiI2VuZGlmIiA8PCBlbmRsOwotICAgIH0KLSAgfQotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9zdHJ1Y3QqIHRzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotICAgIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCB0cywgZmFsc2UsIHRydWUpOwotICAgIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnMoKmZfaXRlcik7Ci0gIH0KLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfY2xpZW50ID0gIiI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7Ci0gICAgZXh0ZW5kc19jbGllbnQgPSBleHRlbmRzICsgIi5DbGllbnQsICI7Ci0gIH0gZWxzZSB7Ci0gICAgZXh0ZW5kc19jbGllbnQgPSAiSURpc3Bvc2FibGUsICI7Ci0gIH0KLQotICBnZW5lcmF0ZV9jc2hhcnBfZG9jKGZfc2VydmljZV8sIHRzZXJ2aWNlKTsKLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAicHVibGljIGNsYXNzIENsaWVudCA6ICIgPDwgZXh0ZW5kc19jbGllbnQgPDwgIklmYWNlIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAicHVibGljIENsaWVudChUUHJvdG9jb2wgcHJvdCkgOiB0aGlzKHByb3QsIHByb3QpIiA8PCBlbmRsOwotICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJwdWJsaWMgQ2xpZW50KFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KSI7Ci0gIGlmICghZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCAiIDogYmFzZShpcHJvdCwgb3Byb3QpIjsKLSAgfQotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaXByb3RfID0gaXByb3Q7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAib3Byb3RfID0gb3Byb3Q7IiA8PCBlbmRsOwotICB9Ci0gIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0KLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicHJvdGVjdGVkIFRQcm90b2NvbCBpcHJvdF87IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicHJvdGVjdGVkIFRQcm90b2NvbCBvcHJvdF87IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicHJvdGVjdGVkIGludCBzZXFpZF87IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgVFByb3RvY29sIElucHV0UHJvdG9jb2wiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJnZXQgeyByZXR1cm4gaXByb3RfOyB9IiA8PCBlbmRsOwotICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0KLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgVFByb3RvY29sIE91dHB1dFByb3RvY29sIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZ2V0IHsgcmV0dXJuIG9wcm90XzsgfSIgPDwgZW5kbDsKLSAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICAgIGZfc2VydmljZV8gPDwgZW5kbCA8PCBlbmRsOwotICAgIAotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiI3JlZ2lvbiBcIiBJRGlzcG9zYWJsZSBTdXBwb3J0IFwiIiA8PCBlbmRsOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJpdmF0ZSBib29sIF9Jc0Rpc3Bvc2VkOyIgPDwgZW5kbCA8PCBlbmRsOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiLy8gSURpc3Bvc2FibGUiIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgdm9pZCBEaXNwb3NlKCkiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJEaXNwb3NlKHRydWUpOyIgPDwgZW5kbDsKLSAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwcm90ZWN0ZWQgdmlydHVhbCB2b2lkIERpc3Bvc2UoYm9vbCBkaXNwb3NpbmcpIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaWYgKCFfSXNEaXNwb3NlZCkiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpZiAoZGlzcG9zaW5nKSIgPDwgZW5kbDsKLSAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImlmIChpcHJvdF8gIT0gbnVsbCkiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIoKElEaXNwb3NhYmxlKWlwcm90XykuRGlzcG9zZSgpOyIgPDwgZW5kbDsKLSAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaWYgKG9wcm90XyAhPSBudWxsKSIgPDwgZW5kbDsKLSAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIigoSURpc3Bvc2FibGUpb3Byb3RfKS5EaXNwb3NlKCk7IiA8PCBlbmRsOwotICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiX0lzRGlzcG9zZWQgPSB0cnVlOyIgPDwgZW5kbDsKLSAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiI2VuZHJlZ2lvbiIgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGVuZGw7Ci0gICAgCi0gICAgaWYgKCFhc3luY18pIHsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiI2lmIFNJTFZFUkxJR0hUIiA8PCBlbmRsOwotICAgIH0KLSAgICAvLyBCZWdpbl8KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICJwdWJsaWMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmVfYXN5bmNfYmVnaW4oKmZfaXRlciwgIkJlZ2luXyIpIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAicmV0dXJuICIgPDwgInNlbmRfIiA8PCBmdW5uYW1lIDw8ICIoY2FsbGJhY2ssIHN0YXRlIjsKLQotICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotICAgIHByZXBhcmVfbWVtYmVyX25hbWVfbWFwcGluZyggYXJnX3N0cnVjdCk7IAotCi0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOwotICAgICAgZl9zZXJ2aWNlXyA8PCBub3JtYWxpemVfbmFtZSgoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSk7Ci0gICAgfQotICAgIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOwotICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotICAgICAgICAKLSAgICAvLyBFbmQKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICJwdWJsaWMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmVfYXN5bmNfZW5kKCpmX2l0ZXIsICJFbmRfIikgPDwgZW5kbDsKLSAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICJvcHJvdF8uVHJhbnNwb3J0LkVuZEZsdXNoKGFzeW5jUmVzdWx0KTsiIDw8IGVuZGw7Ci0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOwotICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBmX3NlcnZpY2VfIDw8ICJyZXR1cm4gIjsKLSAgICAgIH0KLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgInJlY3ZfIiA8PCBmdW5uYW1lIDw8ICIoKTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gICAgLy8gYXN5bmMKLSAgICBib29sIGZpcnN0OwotICAgIGlmKCBhc3luY198fGFzeW5jX2N0cF8pIHsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgICAicHVibGljIGFzeW5jICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlX2FzeW5jKCpmX2l0ZXIsICIiKSA8PCBlbmRsOwotICAgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gICAgICAKLSAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAgICAgdHlwZV9uYW1lKCAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCkpIDw8ICIgcmV0dmFsOyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAgICAgInJldHZhbCA9ICI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXyk7Ci0gICAgICB9Ci0gICAgICBpZiAoYXN5bmNfKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgImF3YWl0IFRhc2suUnVuKCgpID0+IiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCAiYXdhaXQgVGFza0V4LlJ1bigoKSA9PiIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICAgICAgaW5kZW50KGZfc2VydmljZV8pOwotICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgInJldHVybiAiOwotICAgICAgfQotICAgICAgZl9zZXJ2aWNlXyA8PCAKLSAgICAgICAgZnVubmFtZSA8PCAiKCI7Ci0gICAgICAgICAgZmlyc3QgPSB0cnVlOwotICAgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKLSAgICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7Ci0gICAgICAgIH0KLSAgICAgICAgZl9zZXJ2aWNlXyA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICAgIH0KLSAgICAgIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAKLSAgICAgICAgIn0pOyIgPDwgZW5kbDsKLSAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IAotICAgICAgICAgICJyZXR1cm4gcmV0dmFsOyIgIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgICAgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLSAgICB9Ci0gICAgCi0gICAgaWYgKCFhc3luY18pIHsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiI2VuZGlmIiA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgLy8gIk5vcm1hbCIgU3luY2hyb25vdXMgaW52b2tlCi0gICAgZ2VuZXJhdGVfY3NoYXJwX2RvYyhmX3NlcnZpY2VfLCAqZl9pdGVyKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICJwdWJsaWMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgZW5kbDsKLSAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKLQotICAgIGlmICghYXN5bmNfKSB7Ci0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiNpZiAhU0lMVkVSTElHSFQiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICAgInNlbmRfIiA8PCBmdW5uYW1lIDw8ICIoIjsKLQotICAgICAgZmlyc3QgPSB0cnVlOwotICAgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKLSAgICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7Ci0gICAgICAgIH0KLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBub3JtYWxpemVfbmFtZSgoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSk7Ci0gICAgICB9Ci0gICAgICBmX3NlcnZpY2VfIDw8ICIpOyIgPDwgZW5kbDsKLQotICAgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7Ci0gICAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgICBmX3NlcnZpY2VfIDw8ICJyZXR1cm4gIjsKLSAgICAgICAgfQotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgInJlY3ZfIiA8PCBmdW5uYW1lIDw8ICIoKTsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiI2Vsc2UiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgLy8gU2lsdmVybGlnaHQgc3luY2hyb25vdXMgaW52b2tlCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ2YXIgYXN5bmNSZXN1bHQgPSBCZWdpbl8iIDw8IGZ1bm5hbWUgPDwgIihudWxsLCBudWxsIjsKLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLSAgICB9Ci0gICAgZl9zZXJ2aWNlXyA8PCAiKTsiIDw8IGVuZGw7Ci0KLSAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7Ci0gICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgInJldHVybiAiOwotICAgICAgfQotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAiRW5kXyIgPDwgZnVubmFtZSA8PCAiKGFzeW5jUmVzdWx0KTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAgIGlmICghYXN5bmNfKSB7Ci0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiNlbmRpZiIgPDwgZW5kbDsKLSAgICB9Ci0gICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLQotICAgIC8vIFNlbmQKLSAgICB0X2Z1bmN0aW9uIHNlbmRfZnVuY3Rpb24oZ190eXBlX3ZvaWQsCi0gICAgICAgIHN0cmluZygic2VuZF8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKLSAgICAgICAgKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpKTsKLQotICAgIHN0cmluZyBhcmdzbmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfYXJncyI7Ci0KLSAgICBpZiAoIWFzeW5jXykgewotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIjaWYgU0lMVkVSTElHSFQiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlX2FzeW5jX2JlZ2luKCZzZW5kX2Z1bmN0aW9uKSA8PCBlbmRsOwotICAgIGlmICghYXN5bmNfKSB7Ci0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiNlbHNlIiA8PCBlbmRsOwotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnNlbmRfZnVuY3Rpb24pIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiNlbmRpZiIgPDwgZW5kbDsKLSAgICB9Ci0gICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0KLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAib3Byb3RfLldyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShcIiIgPDwgZnVubmFtZSA8PCAiXCIsICIgPDwKLSAgICAgICgoKmZfaXRlciktPmlzX29uZXdheSgpID8gIlRNZXNzYWdlVHlwZS5PbmV3YXkiIDogIlRNZXNzYWdlVHlwZS5DYWxsIikgPDwKLSAgICAgICIsIHNlcWlkXykpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgYXJnc25hbWUgPDwgIiBhcmdzID0gbmV3ICIgPDwgYXJnc25hbWUgPDwgIigpOyIgPDwgZW5kbDsKLQotICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJhcmdzLiIgPDwgcHJvcF9uYW1lKCpmbGRfaXRlcikgPDwgIiA9ICIgPDwgbm9ybWFsaXplX25hbWUoKCpmbGRfaXRlciktPmdldF9uYW1lKCkpIDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJhcmdzLldyaXRlKG9wcm90Xyk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAib3Byb3RfLldyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDs7Ci0gICAgCi0gICAgaWYgKCFhc3luY18pIHsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiI2lmIFNJTFZFUkxJR0hUIiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybiBvcHJvdF8uVHJhbnNwb3J0LkJlZ2luRmx1c2goY2FsbGJhY2ssIHN0YXRlKTsiIDw8IGVuZGw7Ci0gICAgaWYgKCFhc3luY18pIHsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiI2Vsc2UiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIm9wcm90Xy5UcmFuc3BvcnQuRmx1c2goKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiNlbmRpZiIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBjbGVhbnVwX21lbWJlcl9uYW1lX21hcHBpbmcoIGFyZ19zdHJ1Y3QpOyAKLSAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgc3RyaW5nIHJlc3VsdG5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7Ci0KLSAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7Ci0gICAgICB0X2Z1bmN0aW9uIHJlY3ZfZnVuY3Rpb24oKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLAotICAgICAgICAgIHN0cmluZygicmVjdl8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKLSAgICAgICAgICAmbm9hcmdzLAotICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpKTsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgICAicHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZyZWN2X2Z1bmN0aW9uKSA8PCBlbmRsOwotICAgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gICAgICBwcmVwYXJlX21lbWJlcl9uYW1lX21hcHBpbmcoICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpKTsgCi0KLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIlRNZXNzYWdlIG1zZyA9IGlwcm90Xy5SZWFkTWVzc2FnZUJlZ2luKCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiAobXNnLlR5cGUgPT0gVE1lc3NhZ2VUeXBlLkV4Y2VwdGlvbikgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHggPSBUQXBwbGljYXRpb25FeGNlcHRpb24uUmVhZChpcHJvdF8pOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaXByb3RfLlJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ0aHJvdyB4OyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8IHJlc3VsdG5hbWUgPDwgIiByZXN1bHQgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIoKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInJlc3VsdC5SZWFkKGlwcm90Xyk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpcHJvdF8uUmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgaWYgKG51bGxhYmxlXykgewotICAgICAgICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSkpIHsKLSAgICAgICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgImlmIChyZXN1bHQuU3VjY2VzcyAhPSBudWxsKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiByZXN1bHQuU3VjY2VzczsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgImlmIChyZXN1bHQuU3VjY2Vzcy5IYXNWYWx1ZSkgeyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gcmVzdWx0LlN1Y2Nlc3MuVmFsdWU7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKHJlc3VsdC5fX2lzc2V0LnN1Y2Nlc3MpIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiByZXN1bHQuU3VjY2VzczsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIHRfc3RydWN0ICp4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOwotCi0gICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgICAgaWYgKG51bGxhYmxlXykgewotICAgICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAocmVzdWx0LiIgPDwgcHJvcF9uYW1lKCp4X2l0ZXIpIDw8ICIgIT0gbnVsbCkgeyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgdGhyb3cgcmVzdWx0LiIgPDwgcHJvcF9uYW1lKCp4X2l0ZXIpIDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKHJlc3VsdC5fX2lzc2V0LiIgPDwgbm9ybWFsaXplX25hbWUoKCp4X2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiICB0aHJvdyByZXN1bHQuIiA8PCBwcm9wX25hbWUoKnhfaXRlcikgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICAgICAicmV0dXJuOyIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAidGhyb3cgbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5NaXNzaW5nUmVzdWx0LCBcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZmFpbGVkOiB1bmtub3duIHJlc3VsdFwiKTsiIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIGNsZWFudXBfbWVtYmVyX25hbWVfbWFwcGluZyggKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCkpOyAKLSAgICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgIn0iIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotCi0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIHN0cmluZyBleHRlbmRzX3Byb2Nlc3NvciA9ICIiOwotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOwotICAgIGV4dGVuZHNfcHJvY2Vzc29yID0gZXh0ZW5kcyArICIuUHJvY2Vzc29yLCAiOwotICB9Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgInB1YmxpYyBjbGFzcyBQcm9jZXNzb3IgOiAiIDw8IGV4dGVuZHNfcHJvY2Vzc29yIDw8ICJUUHJvY2Vzc29yIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJwdWJsaWMgUHJvY2Vzc29yKElmYWNlIGlmYWNlKSIgOwotICBpZiAoIWV4dGVuZHMuZW1wdHkoKSkgewotICAgIGZfc2VydmljZV8gPDwgIiA6IGJhc2UoaWZhY2UpIjsKLSAgfQotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgImlmYWNlXyA9IGlmYWNlOyIgPDwgZW5kbDsKLQotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJwcm9jZXNzTWFwX1tcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIl0gPSAiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiX1Byb2Nlc3M7IiA8PCBlbmRsOwotICB9Ci0KLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicHJvdGVjdGVkIGRlbGVnYXRlIHZvaWQgUHJvY2Vzc0Z1bmN0aW9uKGludCBzZXFpZCwgVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QpOyIgPDwgZW5kbDsKLSAgfQotCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAicHJpdmF0ZSBJZmFjZSBpZmFjZV87IiA8PCBlbmRsOwotCi0gIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicHJvdGVjdGVkIERpY3Rpb25hcnk8c3RyaW5nLCBQcm9jZXNzRnVuY3Rpb24+IHByb2Nlc3NNYXBfID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBQcm9jZXNzRnVuY3Rpb24+KCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICJwdWJsaWMgYm9vbCBQcm9jZXNzKFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KSIgPDwgZW5kbDsKLSAgfQotICBlbHNlCi0gIHsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICJwdWJsaWMgbmV3IGJvb2wgUHJvY2VzcyhUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCkiIDw8IGVuZGw7Ci0gIH0KLSAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0KLSAgZl9zZXJ2aWNlXyA8PCAgaW5kZW50KCkgPDwgInRyeSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJUTWVzc2FnZSBtc2cgPSBpcHJvdC5SZWFkTWVzc2FnZUJlZ2luKCk7IiA8PCBlbmRsOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAiUHJvY2Vzc0Z1bmN0aW9uIGZuOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJwcm9jZXNzTWFwXy5UcnlHZXRWYWx1ZShtc2cuTmFtZSwgb3V0IGZuKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiaWYgKGZuID09IG51bGwpIHsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBUUHJvdG9jb2xVdGlsLlNraXAoaXByb3QsIFRUeXBlLlN0cnVjdCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgaXByb3QuUmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBUQXBwbGljYXRpb25FeGNlcHRpb24geCA9IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24gKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLlVua25vd25NZXRob2QsIFwiSW52YWxpZCBtZXRob2QgbmFtZTogJ1wiICsgbXNnLk5hbWUgKyBcIidcIik7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgb3Byb3QuV3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKG1zZy5OYW1lLCBUTWVzc2FnZVR5cGUuRXhjZXB0aW9uLCBtc2cuU2VxSUQpKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICB4LldyaXRlKG9wcm90KTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBvcHJvdC5Xcml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBvcHJvdC5UcmFuc3BvcnQuRmx1c2goKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gdHJ1ZTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJmbihtc2cuU2VxSUQsIGlwcm90LCBvcHJvdCk7IiA8PCBlbmRsOwotCi0gIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJjYXRjaCAoSU9FeGNlcHRpb24pIiA8PCBlbmRsOwotICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJyZXR1cm4gZmFsc2U7IiA8PCBlbmRsOwotICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAicmV0dXJuIHRydWU7IiA8PCBlbmRsOwotCi0gIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikKLSAgewotICAgIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odHNlcnZpY2UsICpmX2l0ZXIpOwotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOwotICB0X2ZpZWxkIHN1Y2Nlc3ModGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOwotICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7Ci0gIH0KLQotICB0X3N0cnVjdCAqeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICByZXN1bHQuYXBwZW5kKCpmX2l0ZXIpOwotICB9Ci0KLSAgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sICZyZXN1bHQsIGZhbHNlLCB0cnVlLCB0cnVlKTsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gICh2b2lkKSB0c2VydmljZTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgInB1YmxpYyB2b2lkICIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJfUHJvY2VzcyhpbnQgc2VxaWQsIFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0KLSAgc3RyaW5nIGFyZ3NuYW1lID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKLSAgc3RyaW5nIHJlc3VsdG5hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8IGFyZ3NuYW1lIDw8ICIgYXJncyA9IG5ldyAiIDw8IGFyZ3NuYW1lIDw8ICIoKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiYXJncy5SZWFkKGlwcm90KTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiaXByb3QuUmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLQotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCByZXN1bHRuYW1lIDw8ICIgcmVzdWx0ID0gbmV3ICIgPDwgcmVzdWx0bmFtZSA8PCAiKCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInRyeSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICB9Ci0KLSAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGZfc2VydmljZV8gPDwgaW5kZW50KCk7Ci0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8ICJyZXN1bHQuU3VjY2VzcyA9ICI7Ci0gIH0KLSAgZl9zZXJ2aWNlXyA8PAotICAgICJpZmFjZV8uIiA8PCBub3JtYWxpemVfbmFtZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpIDw8ICIoIjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIHByZXBhcmVfbWVtYmVyX25hbWVfbWFwcGluZyhhcmdfc3RydWN0KTsgCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8ICIsICI7Ci0gICAgfQotICAgIGZfc2VydmljZV8gPDwgImFyZ3MuIiA8PCBwcm9wX25hbWUoKmZfaXRlcik7Ci0gICAgaWYgKG51bGxhYmxlXyAmJiAhdHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8ICIuVmFsdWUiOwotICAgIH0KLSAgfQotICBjbGVhbnVwX21lbWJlcl9uYW1lX21hcHBpbmcoYXJnX3N0cnVjdCk7IAotICBmX3NlcnZpY2VfIDw8ICIpOyIgPDwgZW5kbDsKLQotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgeGNlcHRpb25zLnNpemUoKSA+IDApIHsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iOwotICAgIHByZXBhcmVfbWVtYmVyX25hbWVfbWFwcGluZyggeHMpOyAKLSAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgZl9zZXJ2aWNlXyA8PCAiIGNhdGNoICgiIDw8IHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCksIGZhbHNlLCBmYWxzZSkgPDwgIiAiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgICAgIGluZGVudF91cCgpOwotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgInJlc3VsdC4iIDw8IHByb3BfbmFtZSgqeF9pdGVyKSA8PCAiID0gIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCAifSI7Ci0gICAgICB9Ci0gICAgfQotICAgIGNsZWFudXBfbWVtYmVyX25hbWVfbWFwcGluZyggeHMpOyAKLSAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0gIH0KLQotICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJyZXR1cm47IiA8PCBlbmRsOwotICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0KLSAgICByZXR1cm47Ci0gIH0KLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgIm9wcm90LldyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJcIiwgVE1lc3NhZ2VUeXBlLlJlcGx5LCBzZXFpZCkpOyAiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAicmVzdWx0LldyaXRlKG9wcm90KTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAib3Byb3QuV3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIm9wcm90LlRyYW5zcG9ydC5GbHVzaCgpOyIgPDwgZW5kbDsKLQotICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotCi0gIGZfc2VydmljZV8gPDwgZW5kbDsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF91bmlvbl9yZWFkZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHVuaW9uKSB7Ci0gIC8vIFRoYW5rcyB0byBUSFJJRlQtMTc2OCwgd2UgZG9uJ3QgbmVlZCB0byBjaGVjayBmb3IgcmVxdWlyZWQgZmllbGRzIGluIHRoZSB1bmlvbgotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0dW5pb24tPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBpbmRlbnQob3V0KSA8PCAicHVibGljIHN0YXRpYyAiIDw8IHR1bmlvbi0+Z2V0X25hbWUoKSA8PCAiIFJlYWQoVFByb3RvY29sIGlwcm90KSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAob3V0KTsKLSAgaW5kZW50KG91dCkgPDwgdHVuaW9uLT5nZXRfbmFtZSgpIDw8ICIgcmV0dmFsOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgImlwcm90LlJlYWRTdHJ1Y3RCZWdpbigpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIlRGaWVsZCBmaWVsZCA9IGlwcm90LlJlYWRGaWVsZEJlZ2luKCk7IiA8PCBlbmRsOwotICAvLyB3ZSBjYW5ub3QgaGF2ZSB0aGUgZmlyc3QgZmllbGQgYmUgYSBzdG9wIC0tIHdlIG11c3QgaGF2ZSBhIHNpbmdsZSBmaWVsZCBkZWZpbmVkCi0gIGluZGVudChvdXQpIDw8ICJpZiAoZmllbGQuVHlwZSA9PSBUVHlwZS5TdG9wKSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAob3V0KTsKLSAgaW5kZW50KG91dCkgPDwgImlwcm90LlJlYWRGaWVsZEVuZCgpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInJldHZhbCA9IG5ldyBfX191bmRlZmluZWQoKTsiIDw8IGVuZGw7Ci0gIHNjb3BlX2Rvd24ob3V0KTsKLSAgaW5kZW50KG91dCkgPDwgImVsc2UiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKG91dCk7Ci0gIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKGZpZWxkLklEKSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAob3V0KTsKLQotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiY2FzZSAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICI6IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8ICJpZiAoZmllbGQuVHlwZSA9PSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiIHRlbXA7IiA8PCBlbmRsOwotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKCpmX2l0ZXIpLCAidGVtcCIsIHRydWUpOwotICAgIGluZGVudChvdXQpIDw8ICJyZXR2YWwgPSBuZXcgIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIih0ZW1wKTsiIDw8IGVuZGw7Ci0gICAgCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ9IGVsc2UgeyAiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIFRQcm90b2NvbFV0aWwuU2tpcChpcHJvdCwgZmllbGQuVHlwZSk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICByZXR2YWwgPSBuZXcgX19fdW5kZWZpbmVkKCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICB9Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAiZGVmYXVsdDogIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgIlRQcm90b2NvbFV0aWwuU2tpcChpcHJvdCwgZmllbGQuVHlwZSk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInJldHZhbCA9IG5ldyBfX191bmRlZmluZWQoKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJicmVhazsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotCi0gIGluZGVudChvdXQpIDw8ICJpcHJvdC5SZWFkRmllbGRFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgImlmIChpcHJvdC5SZWFkRmllbGRCZWdpbigpLlR5cGUgIT0gVFR5cGUuU3RvcCkiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKG91dCk7Ci0gIGluZGVudChvdXQpIDw8ICJ0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEpOyIgPDwgZW5kbDsKLSAgc2NvcGVfZG93bihvdXQpOwotCi0gIC8vIGVuZCBvZiBlbHNlIGZvciBUU3RvcAotICBzY29wZV9kb3duKG91dCk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAiaXByb3QuUmVhZFN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHJldHZhbDsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLQotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob2ZzdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdHJpbmcgcHJlZml4LCBib29sIGlzX3Byb3BlcnR5bGVzcykgewotICB0X3R5cGUqIHR5cGUgPSB0ZmllbGQtPmdldF90eXBlKCk7Ci0gIHdoaWxlKHR5cGUtPmlzX3R5cGVkZWYoKSkgewotICAgIHR5cGUgPSAoKHRfdHlwZWRlZiopdHlwZSktPmdldF90eXBlKCk7Ci0gIH0KLQotICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gIH0KLQotICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIChpc19wcm9wZXJ0eWxlc3MgPyAiIiA6IHByb3BfbmFtZSh0ZmllbGQpKTsKLQotICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbmFtZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgbmFtZSA8PCAiID0gIjsKLQotICAgIGlmICh0eXBlLT5pc19lbnVtKCkpCi0gICAgewotICAgICAgb3V0IDw8ICIoIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8ICIpIjsKLSAgICB9Ci0KLSAgICBvdXQgPDwgImlwcm90LiI7Ci0KLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgICAgaWYgKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSkgewotICAgICAgICAgICAgIG91dCA8PCAiUmVhZEJpbmFyeSgpOyI7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG91dCA8PCAiUmVhZFN0cmluZygpOyI7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgICAgb3V0IDw8ICJSZWFkQm9vbCgpOyI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgICBvdXQgPDwgIlJlYWRCeXRlKCk7IjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgICAgb3V0IDw8ICJSZWFkSTE2KCk7IjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgICAgb3V0IDw8ICJSZWFkSTMyKCk7IjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgICAgb3V0IDw8ICJSZWFkSTY0KCk7IjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgICAgb3V0IDw8ICJSZWFkRG91YmxlKCk7IjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEMjIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgb3V0IDw8ICJSZWFkSTMyKCk7IjsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gREVTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLCB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7Ci0gIH0KLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCkgewotICBpZiAodW5pb25fICYmIHRzdHJ1Y3QtPmlzX3VuaW9uKCkpIHsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIgPSAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiLlJlYWQoaXByb3QpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIoKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8IHByZWZpeCA8PCAiLlJlYWQoaXByb3QpOyIgPDwgZW5kbDsKLSAgfQotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgpIHsKLSAgc2NvcGVfdXAob3V0KTsKLQotICBzdHJpbmcgb2JqOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBvYmogPSB0bXAoIl9tYXAiKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBvYmogPSB0bXAoIl9zZXQiKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgb2JqID0gdG1wKCJfbGlzdCIpOwotICB9Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICBwcmVmaXggPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpIDw8ICIoKTsiIDw8ZW5kbDsKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgIlRNYXAgIiA8PCBvYmogPDwgIiA9IGlwcm90LlJlYWRNYXBCZWdpbigpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJUU2V0ICIgPDwgb2JqIDw8ICIgPSBpcHJvdC5SZWFkU2V0QmVnaW4oKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgIlRMaXN0ICIgPDwgb2JqIDw8ICIgPSBpcHJvdC5SZWFkTGlzdEJlZ2luKCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgc3RyaW5nIGkgPSB0bXAoIl9pIik7Ci0gIGluZGVudChvdXQpIDw8Ci0gICAgImZvciggaW50ICIgPDwgaSA8PCAiID0gMDsgIiA8PCBpIDw8ICIgPCAiIDw8IG9iaiA8PCAiLkNvdW50IiA8PCAiOyAiIDw8ICIrKyIgPDwgaSA8PCAiKSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAob3V0KTsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBwcmVmaXgpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgcHJlZml4KTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIHByZWZpeCk7Ci0gIH0KLQotICBzY29wZV9kb3duKG91dCk7Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5SZWFkTWFwRW5kKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5SZWFkU2V0RW5kKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QuUmVhZExpc3RFbmQoKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBzY29wZV9kb3duKG91dCk7Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcga2V5ID0gdG1wKCJfa2V5Iik7Ci0gIHN0cmluZyB2YWwgPSB0bXAoIl92YWwiKTsKLQotICB0X2ZpZWxkIGZrZXkodG1hcC0+Z2V0X2tleV90eXBlKCksIGtleSk7Ci0gIHRfZmllbGQgZnZhbCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdmFsKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgIGRlY2xhcmVfZmllbGQoJmZrZXkpIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8Ci0gICAgZGVjbGFyZV9maWVsZCgmZnZhbCkgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZma2V5KTsKLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnZhbCk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICBwcmVmaXggPDwgIlsiIDw8IGtleSA8PCAiXSA9ICIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOwotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBwcmVmaXgpIHsKLSAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7Ci0gIHRfZmllbGQgZmVsZW0odHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgIGRlY2xhcmVfZmllbGQoJmZlbGVtKSA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgIHByZWZpeCA8PCAiLkFkZCgiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOwotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0cmluZyBwcmVmaXgpIHsKLSAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7Ci0gIHRfZmllbGQgZmVsZW0odGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICBkZWNsYXJlX2ZpZWxkKCZmZWxlbSkgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICBwcmVmaXggPDwgIi5BZGQoIiA8PCBlbGVtIDw8ICIpOyIgPDwgZW5kbDsKLX0KLQotIHZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob2ZzdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdHJpbmcgcHJlZml4LCBib29sIGlzX2VsZW1lbnQsIGJvb2wgaXNfcHJvcGVydHlsZXNzKSB7Ci0gIHRfdHlwZSogdHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKLSAgd2hpbGUgKHR5cGUtPmlzX3R5cGVkZWYoKSkgewotICAgIHR5cGUgPSAoKHRfdHlwZWRlZiopdHlwZSktPmdldF90eXBlKCk7Ci0gIH0KLQotICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIChpc19wcm9wZXJ0eWxlc3MgPyAiIiA6IHByb3BfbmFtZSh0ZmllbGQpKTsKLSAgCi0gIGlmICh0eXBlLT5pc192b2lkKCkpIHsKLSAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIFNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBuYW1lOwotICB9Ci0KLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBuYW1lKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm9wcm90LiI7Ci0gICAgCi0gICAgc3RyaW5nIG51bGxhYmxlX25hbWUgPSBudWxsYWJsZV8gJiYgIWlzX2VsZW1lbnQgJiYgIWZpZWxkX2lzX3JlcXVpcmVkKHRmaWVsZCkKLSAgICAgID8gbmFtZSArICIuVmFsdWUiCi0gICAgICA6IG5hbWU7Ci0KLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgIHN3aXRjaCh0YmFzZSkgewotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgICBpZiAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICAgICAgICBvdXQgPDwgIldyaXRlQmluYXJ5KCI7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG91dCA8PCAiV3JpdGVTdHJpbmcoIjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgb3V0IDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICAgIG91dCA8PCAiV3JpdGVCb29sKCIgPDwgbnVsbGFibGVfbmFtZSA8PCAiKTsiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgICAgb3V0IDw8ICJXcml0ZUJ5dGUoIiA8PCBudWxsYWJsZV9uYW1lIDw8ICIpOyI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICAgIG91dCA8PCAiV3JpdGVJMTYoIiA8PCBudWxsYWJsZV9uYW1lIDw8ICIpOyI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICAgIG91dCA8PCAiV3JpdGVJMzIoIiA8PCBudWxsYWJsZV9uYW1lIDw8ICIpOyI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICAgIG91dCA8PCAiV3JpdGVJNjQoIiA8PCBudWxsYWJsZV9uYW1lIDw8ICIpOyI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICAgIG91dCA8PCAiV3JpdGVEb3VibGUoIiA8PCBudWxsYWJsZV9uYW1lIDw8ICIpOyI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBDIyBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIG91dCA8PCAiV3JpdGVJMzIoKGludCkiIDw8IG51bGxhYmxlX25hbWUgPDwgIik7IjsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gU0VSSUFMSVpFICclcyVzJyBUWVBFICclcydcbiIsCi0gICAgICAgIHByZWZpeC5jX3N0cigpLAotICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKLSAgICAgICAgdHlwZV9uYW1lKHR5cGUpLmNfc3RyKCkpOwotICB9Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4KSB7Ci0gICh2b2lkKSB0c3RydWN0OwotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIi5Xcml0ZShvcHJvdCk7IiA8PCBlbmRsOwotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4KSB7Ci0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3Byb3QuV3JpdGVNYXBCZWdpbihuZXcgVE1hcCgiIDw8Ci0gICAgICB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgIHByZWZpeCA8PCAiLkNvdW50KSk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3Byb3QuV3JpdGVTZXRCZWdpbihuZXcgVFNldCgiIDw8Ci0gICAgICB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgIHByZWZpeCA8PCAiLkNvdW50KSk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm9wcm90LldyaXRlTGlzdEJlZ2luKG5ldyBUTGlzdCgiIDw8Ci0gICAgICB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICBwcmVmaXggPDwgIi5Db3VudCkpOyIgPDwgZW5kbDsKLSAgfQotCi0gIHN0cmluZyBpdGVyID0gdG1wKCJfaXRlciIpOwotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJmb3JlYWNoICgiIDw8Ci0gICAgICB0eXBlX25hbWUoKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgPDwgIiAiIDw8IGl0ZXIgPDwKLSAgICAgICIgaW4gIiA8PAotICAgICAgcHJlZml4IDw8ICIuS2V5cykiOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiZm9yZWFjaCAoIiA8PAotICAgICAgdHlwZV9uYW1lKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiICIgPDwgaXRlciA8PAotICAgICAgIiBpbiAiIDw8Ci0gICAgICBwcmVmaXggPDwgIikiOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImZvcmVhY2ggKCIgPDwKLSAgICAgIHR5cGVfbmFtZSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIgIiA8PCBpdGVyIDw8Ci0gICAgICAiIGluICIgPDwKLSAgICAgIHByZWZpeCA8PCAiKSI7Ci0gIH0KLQotICBvdXQgPDwgZW5kbDsKLSAgc2NvcGVfdXAob3V0KTsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgaXRlciwgcHJlZml4KTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBpdGVyKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBpdGVyKTsKLSAgfQotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIm9wcm90LldyaXRlTWFwRW5kKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC5Xcml0ZVNldEVuZCgpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIm9wcm90LldyaXRlTGlzdEVuZCgpOyIgPDwgZW5kbDsKLSAgfQotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RyaW5nIGl0ZXIsIHN0cmluZyBtYXApIHsKLSAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksIGl0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAma2ZpZWxkLCAiIiwgdHJ1ZSk7Ci0gIHRfZmllbGQgdmZpZWxkKHRtYXAtPmdldF92YWxfdHlwZSgpLCBtYXAgKyAiWyIgKyBpdGVyICsgIl0iKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJnZmaWVsZCwgIiIsIHRydWUpOwotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgaXRlcikgewotICB0X2ZpZWxkIGVmaWVsZCh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIiwgdHJ1ZSk7Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0cmluZyBpdGVyKSB7Ci0gIHRfZmllbGQgZWZpZWxkKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIiwgdHJ1ZSk7Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9wZXJ0eShvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaXNQdWJsaWMsIGJvb2wgZ2VuZXJhdGVJc3NldCkgewotICAgIGdlbmVyYXRlX2NzaGFycF9wcm9wZXJ0eShvdXQsIHRmaWVsZCwgaXNQdWJsaWMsIGdlbmVyYXRlSXNzZXQsICJfIik7Ci19Ci12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX3Byb3BlcnR5KG9mc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpc1B1YmxpYywgYm9vbCBnZW5lcmF0ZUlzc2V0LCBzdGQ6OnN0cmluZyBmaWVsZFByZWZpeCkgewotICAgIGlmKChzZXJpYWxpemVffHx3Y2ZfKSAmJiBpc1B1YmxpYykgewotICAgICAgaW5kZW50KG91dCkgPDwgIltEYXRhTWVtYmVyKE9yZGVyID0gMCldIiA8PCBlbmRsOwotICAgIH0KLSAgICBib29sIGhhc19kZWZhdWx0ID0gZmllbGRfaGFzX2RlZmF1bHQodGZpZWxkKTsKLSAgICBib29sIGlzX3JlcXVpcmVkID0gZmllbGRfaXNfcmVxdWlyZWQodGZpZWxkKTsKLSAgICBpZiAoKG51bGxhYmxlXyAmJiAhaGFzX2RlZmF1bHQpIHx8IChpc19yZXF1aXJlZCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8IChpc1B1YmxpYyA/ICJwdWJsaWMgIiA6ICJwcml2YXRlICIpIDw8IHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCksIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgaXNfcmVxdWlyZWQpCi0gICAgICAgICAgICAgICAgICA8PCAiICIgPDwgcHJvcF9uYW1lKHRmaWVsZCkgPDwgIiB7IGdldDsgc2V0OyB9IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAoaXNQdWJsaWMgPyAicHVibGljICIgOiAicHJpdmF0ZSAiKSA8PCB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UsIHRydWUpCi0gICAgICAgICAgICAgICAgICA8PCAiICIgPDwgcHJvcF9uYW1lKHRmaWVsZCkgPDwgZW5kbDsKLSAgICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiZ2V0IiA8PCBlbmRsOwotICAgICAgc2NvcGVfdXAob3V0KTsKLSAgICAgIGJvb2wgdXNlX251bGxhYmxlID0gZmFsc2U7Ci0gICAgICBpZiAobnVsbGFibGVfKSB7Ci0gICAgICAgIHRfdHlwZSogdHR5cGUgPSB0ZmllbGQtPmdldF90eXBlKCk7Ci0gICAgICAgIHdoaWxlICh0dHlwZS0+aXNfdHlwZWRlZigpKSB7Ci0gICAgICAgICAgdHR5cGUgPSAoKHRfdHlwZWRlZiopdHR5cGUpLT5nZXRfdHlwZSgpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgICAgICB1c2VfbnVsbGFibGUgPSAoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCkgIT0gdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuICIgPDwgZmllbGRQcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICBzY29wZV9kb3duKG91dCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAic2V0IiA8PCBlbmRsOwotICAgICAgc2NvcGVfdXAob3V0KTsKLSAgICAgIGlmICh1c2VfbnVsbGFibGUpIHsKLSAgICAgICAgaWYgKGdlbmVyYXRlSXNzZXQpIHsKLSAgICAgICAgICBpbmRlbnQob3V0KSA8PCAiX19pc3NldC4iIDw8IG5vcm1hbGl6ZV9uYW1lKHRmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIiA9IHZhbHVlLkhhc1ZhbHVlOyIgPDwgZW5kbDsKLSAgICAgICAgfQotICAgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKHZhbHVlLkhhc1ZhbHVlKSB0aGlzLiIgPDwgZmllbGRQcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIiA9IHZhbHVlLlZhbHVlOyIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChnZW5lcmF0ZUlzc2V0KSB7Ci0gICAgICAgICAgaW5kZW50KG91dCkgPDwgIl9faXNzZXQuIiA8PCBub3JtYWxpemVfbmFtZSh0ZmllbGQtPmdldF9uYW1lKCkpIDw8ICIgPSB0cnVlOyIgPDwgZW5kbDsKLSAgICAgICAgfQotICAgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkUHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgPSB2YWx1ZTsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgICBzY29wZV9kb3duKG91dCk7Ci0gICAgICBzY29wZV9kb3duKG91dCk7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotfQotCi1zdGQ6OnN0cmluZyB0X2NzaGFycF9nZW5lcmF0b3I6Om1ha2VfdmFsaWRfY3NoYXJwX2lkZW50aWZpZXIoIHN0ZDo6c3RyaW5nIGNvbnN0ICYgZnJvbU5hbWUpIHsKLSAgICBzdGQ6OnN0cmluZyBzdHIgPSBmcm9tTmFtZTsKLSAgICBpZiggc3RyLmVtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIHN0cjsKLSAgICB9Ci0KLSAgICAvLyB0ZXN0cyByZWx5IG9uIHRoaXMKLSAgICBhc3NlcnQoICgnQScgPCAnWicpICYmICgnYScgPCAneicpICYmICgnMCcgPCAnOScpKTsKLSAgICAKLSAgICAvLyBpZiB0aGUgZmlyc3QgbGV0dGVyIGlzIGEgbnVtYmVyLCB3ZSBhZGQgYW4gYWRkaXRpb25hbCB1bmRlcnNjb3JlIGluIGZyb250IG9mIGl0Ci0gICAgY2hhciBjID0gc3RyLmF0KDApOwotICAgIGlmKCAoJzAnIDw9IGMpICYmIChjIDw9ICc5JykpIHsKLSAgICAgICAgc3RyID0gIl8iICsgc3RyOwotICAgIH0KLQotICAgIC8vIGZvbGxvd2luZyBjaGFyczogbGV0dGVyLCBudW1iZXIgb3IgdW5kZXJzY29yZQotICAgIGZvciggc2l6ZV90IGkgPSAwOyAgaSA8IHN0ci5zaXplKCk7ICArK2kpIHsKLSAgICAgICAgYyA9IHN0ci5hdChpKTsgICAgICAgIAotICAgICAgICBpZiggKCgnQScgPiBjKSB8fCAoYyA+ICdaJykpICYmIAotICAgICAgICAgICAgKCgnYScgPiBjKSB8fCAoYyA+ICd6JykpICYmIAotICAgICAgICAgICAgKCgnMCcgPiBjKSB8fCAoYyA+ICc5JykpICYmIAotICAgICAgICAgICAgKCdfJyAhPSBjKSApIHsKLSAgICAgICAgICAgIHN0ci5yZXBsYWNlKCBpLCAxLCAiXyIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHN0cjsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmNsZWFudXBfbWVtYmVyX25hbWVfbWFwcGluZyggdm9pZCogc2NvcGUpIHsKLSAgaWYoIG1lbWJlcl9tYXBwaW5nX3Njb3BlICE9IHNjb3BlKSB7Ci0gICAgaWYoIG1lbWJlcl9tYXBwaW5nX3Njb3BlID09IE5VTEwpIHsKLSAgICAgIHRocm93ICJpbnRlcm5hbCBlcnJvcjogY2xlYW51cF9tZW1iZXJfbmFtZV9tYXBwaW5nKCkgbm90IGFjdGl2ZSI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRocm93ICJpbnRlcm5hbCBlcnJvcjogY2xlYW51cF9tZW1iZXJfbmFtZV9tYXBwaW5nKCkgY2FsbGVkIGZvciB3cm9uZyBzdHJ1Y3QiOwotICAgIH0KLSAgfQotCi0gIG1lbWJlcl9tYXBwaW5nX3Njb3BlID0gTlVMTDsKLSAgbWVtYmVyX25hbWVfbWFwcGluZy5jbGVhcigpOwotfQotCi1zdHJpbmcgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZXRfbWFwcGVkX21lbWJlcl9uYW1lKCBzdHJpbmcgbmFtZSkgewotICBtYXA8c3RyaW5nLHN0cmluZz46Oml0ZXJhdG9yIGl0ZXIgPSBtZW1iZXJfbmFtZV9tYXBwaW5nLmZpbmQoIG5hbWUpOwotICBpZiggbWVtYmVyX25hbWVfbWFwcGluZy5lbmQoKSAhPSBpdGVyKSB7Ci0gICAgcmV0dXJuIGl0ZXItPnNlY29uZDsKLSAgfQotICBwdmVyYm9zZSgibm8gbWFwcGluZyBmb3IgbWVtYmVyICVzXG4iLCBuYW1lLmNfc3RyKCkpOwotICByZXR1cm4gbmFtZTsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OnByZXBhcmVfbWVtYmVyX25hbWVfbWFwcGluZyggdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgcHJlcGFyZV9tZW1iZXJfbmFtZV9tYXBwaW5nKCB0c3RydWN0LCB0c3RydWN0LT5nZXRfbWVtYmVycygpLCB0c3RydWN0LT5nZXRfbmFtZSgpKTsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OnByZXBhcmVfbWVtYmVyX25hbWVfbWFwcGluZyggdm9pZCogc2NvcGUsIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMsIGNvbnN0IHN0cmluZyAmIHN0cnVjdG5hbWUpIHsKLSAgaWYoIG1lbWJlcl9tYXBwaW5nX3Njb3BlICE9IE5VTEwpIHsKLSAgICBpZiggbWVtYmVyX21hcHBpbmdfc2NvcGUgIT0gc2NvcGUpIHsKLSAgICAgIHRocm93ICJpbnRlcm5hbCBlcnJvcjogcHJlcGFyZV9tZW1iZXJfbmFtZV9tYXBwaW5nKCkgYWxyZWFkeSBhY3RpdmUgZm9yIGRpZmZlcmVudCBzdHJ1Y3QiOwotICAgIH0gZWxzZSB7Ci0gICAgICB0aHJvdyAiaW50ZXJuYWwgZXJyb3I6IHByZXBhcmVfbWVtYmVyX25hbWVfbWFwcGluZygpIGFscmVhZHkgYWN0aXZlIGZvciB0aGlzIHN0cnVjdCI7Ci0gICAgfQotICB9Ci0KLSAgbWVtYmVyX21hcHBpbmdfc2NvcGUgPSBzY29wZTsKLSAgbWVtYmVyX25hbWVfbWFwcGluZy5jbGVhcigpOwotICAKLSAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IHVzZWRfbWVtYmVyX25hbWVzOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBpdGVyOwotICAKLSAgLy8gY3VycmVudCBDIyBnZW5lcmF0b3IgcG9saWN5OiAKLSAgLy8gLSBwcm9wIG5hbWVzIGFyZSBhbHdheXMgcmVuZGVyZWQgd2l0aCBhbiBVcHBlcmNhc2UgZmlyc3QgbGV0dGVyCi0gIC8vIC0gc3RydWN0IG5hbWVzIGFyZSB1c2VkIGFzIGdpdmVuCi0gIAotICBmb3IgKGl0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IGl0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKytpdGVyKSB7Ci0gICAgc3RyaW5nIG9sZG5hbWUgPSAoKml0ZXIpLT5nZXRfbmFtZSgpOwotICAgIHN0cmluZyBuZXduYW1lID0gcHJvcF9uYW1lKCppdGVyLCB0cnVlKTsKLSAgICB3aGlsZSggdHJ1ZSkgewotICAgICAgLy8gbmFtZSBjb25mbGljdHMgd2l0aCBzdHJ1Y3QgKENTMDU0MiBlcnJvcikKLSAgICAgIGlmKCBzdHJ1Y3RuYW1lLmNvbXBhcmUoIG5ld25hbWUpID09IDApIHsKLSAgICAgICAgcHZlcmJvc2UoInN0cnVjdCAlczogbWVtYmVyICVzIGNvbmZsaWN0cyB3aXRoIHN0cnVjdCAocHJldmVudGluZyBDUzA1NDIpXG4iLCBzdHJ1Y3RuYW1lLmNfc3RyKCksIG5ld25hbWUuY19zdHIoKSk7Ci0gICAgICAgIG5ld25hbWUgKz0gJ18nOyAgICAgIAotICAgICAgfQotCi0gICAgICAvLyBuZXcgbmFtZSBjb25mbGljdHMgd2l0aCBhbm90aGVyIG1lbWJlcgotICAgICAgaWYoIHVzZWRfbWVtYmVyX25hbWVzLmZpbmQobmV3bmFtZSkgIT0gdXNlZF9tZW1iZXJfbmFtZXMuZW5kKCkpIHsKLSAgICAgICAgcHZlcmJvc2UoInN0cnVjdCAlczogbWVtYmVyICVzIGNvbmZsaWN0cyB3aXRoIGFub3RoZXIgbWVtYmVyXG4iLCBzdHJ1Y3RuYW1lLmNfc3RyKCksIG5ld25hbWUuY19zdHIoKSk7Ci0gICAgICAgIG5ld25hbWUgKz0gJ18nOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgLy8gYWRkIGFsd2F5cywgdGhpcyBoZWxwcyB1cyB0byBkZXRlY3QgZWRnZSBjYXNlcyBsaWtlIAotICAgICAgLy8gZGlmZmVyZW50IHNwZWxsaW5ncyAoImZvbyIgYW5kICJGb28iKSB3aXRoaW4gdGhlIHNhbWUgc3RydWN0Ci0gICAgICBwdmVyYm9zZSgic3RydWN0ICVzOiBtZW1iZXIgbWFwcGluZyAlcyA9PiAlc1xuIiwgc3RydWN0bmFtZS5jX3N0cigpLCBvbGRuYW1lLmNfc3RyKCksIG5ld25hbWUuY19zdHIoKSk7Ci0gICAgICBtZW1iZXJfbmFtZV9tYXBwaW5nW29sZG5hbWVdID0gbmV3bmFtZTsKLSAgICAgIHVzZWRfbWVtYmVyX25hbWVzLmluc2VydChuZXduYW1lKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotfQotCi1zdGQ6OnN0cmluZyB0X2NzaGFycF9nZW5lcmF0b3I6OnByb3BfbmFtZSh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgc3VwcHJlc3NfbWFwcGluZykgewotICAgIHN0cmluZyBuYW1lICh0ZmllbGQtPmdldF9uYW1lKCkpOwotICAgIGlmKCBzdXBwcmVzc19tYXBwaW5nKSB7Ci0gICAgICBuYW1lWzBdID0gdG91cHBlcihuYW1lWzBdKTsKLSAgICB9IGVsc2UgewotICAgICAgbmFtZSA9IGdldF9tYXBwZWRfbWVtYmVyX25hbWUoIG5hbWUpOwotICAgIH0KLSAgICByZXR1cm4gbmFtZTsKLX0KLQotc3RyaW5nIHRfY3NoYXJwX2dlbmVyYXRvcjo6dHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsIGJvb2wgaW5fY29udGFpbmVyLCBib29sIGluX2luaXQsIGJvb2wgaW5fcGFyYW0sIGJvb2wgaXNfcmVxdWlyZWQpIHsKLSAgKHZvaWQpIGluX2luaXQ7Ci0gIHdoaWxlICh0dHlwZS0+aXNfdHlwZWRlZigpKSB7Ci0gICAgdHR5cGUgPSAoKHRfdHlwZWRlZiopdHR5cGUpLT5nZXRfdHlwZSgpOwotICB9Ci0KLSAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHJldHVybiBiYXNlX3R5cGVfbmFtZSgodF9iYXNlX3R5cGUqKXR0eXBlLCBpbl9jb250YWluZXIsIGluX3BhcmFtLCBpc19yZXF1aXJlZCk7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgdF9tYXAgKnRtYXAgPSAodF9tYXAqKSB0dHlwZTsKLSAgICByZXR1cm4gIkRpY3Rpb25hcnk8IiArIHR5cGVfbmFtZSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwgdHJ1ZSkgKwotICAgICAgIiwgIiArIHR5cGVfbmFtZSh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdHJ1ZSkgKyAiPiI7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgdF9zZXQqIHRzZXQgPSAodF9zZXQqKSB0dHlwZTsKLSAgICByZXR1cm4gIlRIYXNoU2V0PCIgKyB0eXBlX25hbWUodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCB0cnVlKSArICI+IjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgdF9saXN0KiB0bGlzdCA9ICh0X2xpc3QqKSB0dHlwZTsKLSAgICByZXR1cm4gIkxpc3Q8IiArIHR5cGVfbmFtZSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCB0cnVlKSArICI+IjsKLSAgfQotCi0gIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR0eXBlLT5nZXRfcHJvZ3JhbSgpOwotICBzdHJpbmcgcG9zdGZpeCA9ICghaXNfcmVxdWlyZWQgJiYgbnVsbGFibGVfICYmIGluX3BhcmFtICYmIHR0eXBlLT5pc19lbnVtKCkpID8gIj8iIDogIiI7Ci0gIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgewotICAgIHN0cmluZyBucyA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2UoImNzaGFycCIpOwotICAgIGlmICghbnMuZW1wdHkoKSkgewotICAgICAgcmV0dXJuIG5zICsgIi4iICsgbm9ybWFsaXplX25hbWUodHR5cGUtPmdldF9uYW1lKCkpICsgcG9zdGZpeDsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gbm9ybWFsaXplX25hbWUodHR5cGUtPmdldF9uYW1lKCkpICsgcG9zdGZpeDsKLX0KLQotc3RyaW5nIHRfY3NoYXJwX2dlbmVyYXRvcjo6YmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGUqIHRiYXNlLCBib29sIGluX2NvbnRhaW5lciwgYm9vbCBpbl9wYXJhbSwgYm9vbCBpc19yZXF1aXJlZCkgewotICAodm9pZCkgaW5fY29udGFpbmVyOwotICBzdHJpbmcgcG9zdGZpeCA9ICghaXNfcmVxdWlyZWQgJiYgbnVsbGFibGVfICYmIGluX3BhcmFtKSA/ICI/IiA6ICIiOwotICBzd2l0Y2ggKHRiYXNlLT5nZXRfYmFzZSgpKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgcmV0dXJuICJ2b2lkIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIGlmICh0YmFzZS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgICAgcmV0dXJuICJieXRlW10iOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuICJzdHJpbmciOwotICAgICAgfQotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIHJldHVybiAiYm9vbCIgKyBwb3N0Zml4OwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIHJldHVybiAic2J5dGUiICsgcG9zdGZpeDsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIHJldHVybiAic2hvcnQiICsgcG9zdGZpeDsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIHJldHVybiAiaW50IiArIHBvc3RmaXg7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZXR1cm4gImxvbmciICsgcG9zdGZpeDsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIHJldHVybiAiZG91YmxlIiArIHBvc3RmaXg7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gQyMgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UtPmdldF9iYXNlKCkpOwotICB9Ci19Ci0KLXN0cmluZyB0X2NzaGFycF9nZW5lcmF0b3I6OmRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluaXQsIHN0ZDo6c3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcgcmVzdWx0ID0gdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSkgKyAiICIgKyBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gIGlmIChpbml0KSB7Ci0gICAgdF90eXBlKiB0dHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKLSAgICB3aGlsZSAodHR5cGUtPmlzX3R5cGVkZWYoKSkgewotICAgICAgdHR5cGUgPSAoKHRfdHlwZWRlZiopdHR5cGUpLT5nZXRfdHlwZSgpOwotICAgIH0KLSAgICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmIGZpZWxkX2hhc19kZWZhdWx0KHRmaWVsZCkpIHsKLSAgICAgIG9mc3RyZWFtIGR1bW15OwotICAgICAgcmVzdWx0ICs9ICIgPSAiICsgcmVuZGVyX2NvbnN0X3ZhbHVlKGR1bW15LCB0ZmllbGQtPmdldF9uYW1lKCksIHR0eXBlLCB0ZmllbGQtPmdldF92YWx1ZSgpKTsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgICAgcmVzdWx0ICs9ICIgPSBudWxsIjsKLSAgICAgICAgICBicmVhazsgCi0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgICByZXN1bHQgKz0gIiA9IGZhbHNlIjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICAgIHJlc3VsdCArPSAiID0gMCI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICAgIHJlc3VsdCArPSAiID0gKGRvdWJsZSkwIjsKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIHJlc3VsdCArPSAiID0gKCIgKyB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlKSArICIpMCI7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICAgIHJlc3VsdCArPSAiID0gbmV3ICIgKyB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlKSArICIoKSI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlc3VsdCArPSAiID0gbmV3ICIgKyB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlKSArICIoKSI7Ci0gICAgfQotICB9Ci0gIHJldHVybiByZXN1bHQgKyAiOyI7Ci19Ci0KLXN0cmluZyB0X2NzaGFycF9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0cmluZyBwcmVmaXgpIHsKLSAgdF90eXBlKiB0dHlwZSA9IHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKTsKLSAgcmV0dXJuIHR5cGVfbmFtZSh0dHlwZSkgKyAiICIgKyBub3JtYWxpemVfbmFtZShwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkpICsgIigiICsgYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpICsgIikiOwotfQotCi1zdHJpbmcgdF9jc2hhcnBfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmVfYXN5bmNfYmVnaW4odF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdHJpbmcgcHJlZml4KSB7Ci0gIHN0cmluZyBjb21tYSA9ICh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCkuc2l6ZSgpID4gMCA/ICIsICIgOiAiIik7Ci0gIHJldHVybiAiSUFzeW5jUmVzdWx0ICIgKyBub3JtYWxpemVfbmFtZShwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkpICsgIihBc3luY0NhbGxiYWNrIGNhbGxiYWNrLCBvYmplY3Qgc3RhdGUiICsgY29tbWEgKyBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSkgKyAiKSI7Ci19Ci0KLXN0cmluZyB0X2NzaGFycF9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZV9hc3luY19lbmQodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdHJpbmcgcHJlZml4KSB7Ci0gIHRfdHlwZSogdHR5cGUgPSB0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCk7Ci0gIHJldHVybiB0eXBlX25hbWUodHR5cGUpICsgIiAiICsgbm9ybWFsaXplX25hbWUocHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSArICIoSUFzeW5jUmVzdWx0IGFzeW5jUmVzdWx0KSI7Ci19Ci0KLXN0cmluZyB0X2NzaGFycF9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZV9hc3luYyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0cmluZyBwcmVmaXgpIHsKLSAgdF90eXBlKiB0dHlwZSA9IHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKTsKLSAgc3RyaW5nIHRhc2sgPSAiVGFzayI7Ci0gIGlmKCAhIHR0eXBlLT5pc192b2lkKCkpCi0gICAgdGFzayArPSAiPCIgKyB0eXBlX25hbWUodHR5cGUpICsgIj4iOwotICByZXR1cm4gdGFzayArICIgIiArIG5vcm1hbGl6ZV9uYW1lKHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgKyAiQXN5bmMoIiArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKSArICIpIjsKLX0KLQotCi1zdHJpbmcgdF9jc2hhcnBfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIHN0cmluZyByZXN1bHQgPSAiIjsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlc3VsdCArPSAiLCAiOwotICAgIH0KLSAgICByZXN1bHQgKz0gdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgKyAiICIgKyBub3JtYWxpemVfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0cmluZyB0X2NzaGFycF9nZW5lcmF0b3I6OnR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpIHsKLSAgd2hpbGUgKHR5cGUtPmlzX3R5cGVkZWYoKSkgewotICAgIHR5cGUgPSAoKHRfdHlwZWRlZiopdHlwZSktPmdldF90eXBlKCk7Ci0gIH0KLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgcmV0dXJuICJUVHlwZS5TdHJpbmciOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICByZXR1cm4gIlRUeXBlLkJvb2wiOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICByZXR1cm4gIlRUeXBlLkJ5dGUiOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgIHJldHVybiAiVFR5cGUuSTE2IjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICByZXR1cm4gIlRUeXBlLkkzMiI7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgcmV0dXJuICJUVHlwZS5JNjQiOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIHJldHVybiAiVFR5cGUuRG91YmxlIjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZS5JMzIiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLlN0cnVjdCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLk1hcCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLlNldCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZS5MaXN0IjsKLSAgfQotCi0gIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF9kb2NzdHJpbmdfY29tbWVudChvZnN0cmVhbSAmb3V0LCBzdHJpbmcgY29udGVudHMpIHsKLSAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLy8vIDxzdW1tYXJ5PlxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8vLyAiLCBjb250ZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8vLyA8L3N1bW1hcnk+XG4iKTsKLQotCi19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jc2hhcnBfZG9jKG9mc3RyZWFtICZvdXQsIHRfZmllbGQqIGZpZWxkKSB7Ci0gIGlmIChmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfZW51bSgpKSB7Ci0gICAgc3RyaW5nIGNvbWJpbmVkX21lc3NhZ2UgPSBmaWVsZC0+Z2V0X2RvYygpICsgIlxuPHNlZWFsc28gY3JlZj1cIiIgKyBnZXRfZW51bV9jbGFzc19uYW1lKGZpZWxkLT5nZXRfdHlwZSgpKSArICJcIi8+IjsKLSAgICBnZW5lcmF0ZV9jc2hhcnBfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCBjb21iaW5lZF9tZXNzYWdlKTsKLSAgfSBlbHNlIHsKLSAgICBnZW5lcmF0ZV9jc2hhcnBfZG9jKG91dCwgKHRfZG9jKilmaWVsZCk7Ci0gIH0KLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF9kb2Mob2ZzdHJlYW0gJm91dCwgdF9kb2MqIHRkb2MpIHsKLSAgaWYgKHRkb2MtPmhhc19kb2MoKSkgewotICAgIGdlbmVyYXRlX2NzaGFycF9kb2NzdHJpbmdfY29tbWVudChvdXQsIHRkb2MtPmdldF9kb2MoKSk7Ci0gIH0KLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF9kb2Mob2ZzdHJlYW0gJm91dCwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gIGlmICh0ZnVuY3Rpb24tPmhhc19kb2MoKSkgewotICAgICAgICBzdHJpbmdzdHJlYW0gcHM7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHBfaXRlcjsKLSAgICBmb3IgKHBfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBwX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK3BfaXRlcikgewotICAgICAgdF9maWVsZCogcCA9ICpwX2l0ZXI7Ci0gICAgICBwcyA8PCAiXG48cGFyYW0gbmFtZT1cIiIgPDwgcC0+Z2V0X25hbWUoKSA8PCAiXCI+IjsKLSAgICAgIGlmIChwLT5oYXNfZG9jKCkpIHsKLSAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBzdHIgPSBwLT5nZXRfZG9jKCk7Ci0gICAgICAgICAgICAgICAgc3RyLmVyYXNlKHN0ZDo6cmVtb3ZlKHN0ci5iZWdpbigpLCBzdHIuZW5kKCksICdcbicpLCBzdHIuZW5kKCkpOyAvLyByZW1vdmUgdGhlIG5ld2xpbmVzIHRoYXQgYXBwZWFyIGZyb20gdGhlIHBhcnNlcgotICAgICAgICAgICAgICAgIHBzIDw8IHN0cjsKLSAgICAgIH0KLSAgICAgICAgICBwcyA8PCAiPC9wYXJhbT4iOwotICAgIH0KLSAgICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8vLyAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPHN1bW1hcnk+XG4iICsgdGZ1bmN0aW9uLT5nZXRfZG9jKCkgKyAiPC9zdW1tYXJ5PiIgKyBwcy5zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIik7Ci0gIH0KLX0KLQotc3RkOjpzdHJpbmcgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZXRfZW51bV9jbGFzc19uYW1lKHRfdHlwZSogdHlwZSkgewotICBzdHJpbmcgcGFja2FnZSA9ICIiOwotICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0eXBlLT5nZXRfcHJvZ3JhbSgpOwotICBpZiAocHJvZ3JhbSAhPSBOVUxMICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pIHsKLSAgICBwYWNrYWdlID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiY3NoYXJwIikgKyAiLiI7Ci0gIH0KLSAgcmV0dXJuIHBhY2thZ2UgKyB0eXBlLT5nZXRfbmFtZSgpOwotfQotCi1USFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKGNzaGFycCwgIkMjIiwKLSIgICAgYXN5bmM6ICAgICAgICAgICBBZGRzIEFzeW5jIHN1cHBvcnQgdXNpbmcgVGFzay5SdW4uXG4iCi0iICAgIGFzeW5jY3RwOiAgICAgICAgQWRkcyBBc3luYyBDVFAgc3VwcG9ydCB1c2luZyBUYXNrRXguUnVuLlxuIgotIiAgICB3Y2Y6ICAgICAgICAgICAgIEFkZHMgYmluZGluZ3MgZm9yIFdDRiB0byBnZW5lcmF0ZWQgY2xhc3Nlcy5cbiIKLSIgICAgc2VyaWFsOiAgICAgICAgICBBZGQgc2VyaWFsaXphdGlvbiBzdXBwb3J0IHRvIGdlbmVyYXRlZCBjbGFzc2VzLlxuIgotIiAgICBudWxsYWJsZTogICAgICAgIFVzZSBudWxsYWJsZSB0eXBlcyBmb3IgcHJvcGVydGllcy5cbiIKLSIgICAgaGFzaGNvZGU6ICAgICAgICBHZW5lcmF0ZSBhIGhhc2hjb2RlIGFuZCBlcXVhbHMgaW1wbGVtZW50YXRpb24gZm9yIGNsYXNzZXMuXG4iCi0iICAgIHVuaW9uOiAgICAgICAgICAgVXNlIG5ldyB1bmlvbiB0eXBpbmcsIHdoaWNoIGluY2x1ZGVzIGEgc3RhdGljIHJlYWQgZnVuY3Rpb24gZm9yIHVuaW9uIHR5cGVzLlxuIgotKQotCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfZF9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfZF9nZW5lcmF0b3IuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyM2FhMWYuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2RfZ2VuZXJhdG9yLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNzgzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KLSAqIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCi0gKiBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlIDxjYXNzZXJ0PgotCi0jaW5jbHVkZSA8ZnN0cmVhbT4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDxzZXQ+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLQotI2luY2x1ZGUgInBsYXRmb3JtLmgiCi0jaW5jbHVkZSAidF9vb3BfZ2VuZXJhdG9yLmgiCi0KLXVzaW5nIHN0ZDo6bWFwOwotdXNpbmcgc3RkOjpvZnN0cmVhbTsKLXVzaW5nIHN0ZDo6b3N0cmVhbTsKLXVzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKLXVzaW5nIHN0ZDo6c2V0OwotdXNpbmcgc3RkOjpzdHJpbmc7Ci11c2luZyBzdGQ6OnZlY3RvcjsKLQotc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsID0gIlxuIjsgIC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKLQotLyoqCi0gKiBEIGNvZGUgZ2VuZXJhdG9yLgotICoKLSAqIGdlbmVyYXRlXyooKSBmdW5jdGlvbnMgYXJlIGNhbGxlZCBieSB0aGUgYmFzZSBjbGFzcyB0byBlbWl0IGNvZGUgZm9yIHRoZQotICogZ2l2ZW4gZW50aXR5LCBwcmludF8qKCkgZnVuY3Rpb25zIHdyaXRlIGEgcGllY2Ugb2YgY29kZSB0byB0aGUgcGFzc2VkCi0gKiBzdHJlYW0sIGFuZCByZW5kZXJfKigpIHJldHVybiBhIHN0cmluZyBjb250YWluaW5nIHRoZSBEIHJlcHJlc2VudGF0aW9uIG9mCi0gKiB0aGUgcGFzc2VkIGVudGl0eS4KLSAqLwotY2xhc3MgdF9kX2dlbmVyYXRvciA6IHB1YmxpYyB0X29vcF9nZW5lcmF0b3IgewotIHB1YmxpYzoKLSAgdF9kX2dlbmVyYXRvcigKLSAgICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSwKLSAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0cmluZywgc3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCi0gICAgICBjb25zdCBzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCi0gICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkKLSAgewotICAgICh2b2lkKSBwYXJzZWRfb3B0aW9uczsKLSAgICAodm9pZCkgb3B0aW9uX3N0cmluZzsKLSAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1kIjsKLSAgfQotCi0gcHJvdGVjdGVkOgotICB2aXJ0dWFsIHZvaWQgaW5pdF9nZW5lcmF0b3IoKSB7Ci0gICAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5Ci0gICAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKLQotICAgIHN0cmluZyBkaXIgPSBwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgiZCIpOwotICAgIHN0cmluZyBzdWJkaXIgPSBnZXRfb3V0X2RpcigpOwotICAgIHN0cmluZzo6c2l6ZV90eXBlIGxvYzsKLSAgICB3aGlsZSAoKGxvYyA9IGRpci5maW5kKCIuIikpICE9IHN0cmluZzo6bnBvcykgewotICAgICAgc3ViZGlyID0gc3ViZGlyICsgIi8iICsgZGlyLnN1YnN0cigwLCBsb2MpOwotICAgICAgTUtESVIoc3ViZGlyLmNfc3RyKCkpOwotICAgICAgZGlyID0gZGlyLnN1YnN0cihsb2MrMSk7Ci0gICAgfQotICAgIGlmICghZGlyLmVtcHR5KCkpIHsKLSAgICAgIHN1YmRpciA9IHN1YmRpciArICIvIiArIGRpcjsKLSAgICAgIE1LRElSKHN1YmRpci5jX3N0cigpKTsKLSAgICB9Ci0KLSAgICBwYWNrYWdlX2Rpcl8gPSBzdWJkaXIgKyAiLyI7Ci0KLSAgICAvLyBNYWtlIG91dHB1dCBmaWxlCi0gICAgc3RyaW5nIGZfdHlwZXNfbmFtZSA9IHBhY2thZ2VfZGlyXyArIHByb2dyYW1fbmFtZV8gKyAiX3R5cGVzLmQiOwotICAgIGZfdHlwZXNfLm9wZW4oZl90eXBlc19uYW1lLmNfc3RyKCkpOwotCi0gICAgLy8gUHJpbnQgaGVhZGVyCi0gICAgZl90eXBlc18gPDwKLSAgICAgIGF1dG9nZW5fY29tbWVudCgpIDw8Ci0gICAgICAibW9kdWxlICIgPDwgcmVuZGVyX3BhY2thZ2UoKnByb2dyYW1fKSA8PCBwcm9ncmFtX25hbWVfIDw8ICJfdHlwZXM7IiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsOwotCi0gICAgcHJpbnRfZGVmYXVsdF9pbXBvcnRzKGZfdHlwZXNfKTsKLQotICAgIC8vIEluY2x1ZGUgdHlwZSBtb2R1bGVzIGZyb20gb3RoZXIgaW1wb3J0ZWQgcHJvZ3JhbXMuCi0gICAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+JiBpbmNsdWRlcyA9IHByb2dyYW1fLT5nZXRfaW5jbHVkZXMoKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluY2x1ZGVzLnNpemUoKTsgKytpKSB7Ci0gICAgICBmX3R5cGVzXyA8PAotICAgICAgICAiaW1wb3J0ICIgPDwgcmVuZGVyX3BhY2thZ2UoKihpbmNsdWRlc1tpXSkpIDw8Ci0gICAgICAgIGluY2x1ZGVzW2ldLT5nZXRfbmFtZSgpIDw8ICJfdHlwZXM7IiA8PCBlbmRsOwotICAgIH0KLSAgICBpZiAoIWluY2x1ZGVzLmVtcHR5KCkpIGZfdHlwZXNfIDw8IGVuZGw7Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCkgewotICAgIC8vIENsb3NlIG91dHB1dCBmaWxlCi0gICAgZl90eXBlc18uY2xvc2UoKTsKLSAgfQotCi0gIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykgewotICAgIGlmICghY29uc3RzLmVtcHR5KCkpIHsKLSAgICAgIHN0cmluZyBmX2NvbnN0c19uYW1lID0gcGFja2FnZV9kaXJfK3Byb2dyYW1fbmFtZV8rIl9jb25zdGFudHMuZCI7Ci0gICAgICBvZnN0cmVhbSBmX2NvbnN0czsKLSAgICAgIGZfY29uc3RzLm9wZW4oZl9jb25zdHNfbmFtZS5jX3N0cigpKTsKLQotICAgICAgZl9jb25zdHMgPDwKLSAgICAgICAgYXV0b2dlbl9jb21tZW50KCkgPDwKLSAgICAgICAgIm1vZHVsZSAiIDw8IHJlbmRlcl9wYWNrYWdlKCpwcm9ncmFtXykgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiX2NvbnN0YW50czsiIDw8IGVuZGwKLSAgICAgICAgPDwgZW5kbDsKLQotICAgICAgcHJpbnRfZGVmYXVsdF9pbXBvcnRzKGZfY29uc3RzKTsKLQotICAgICAgZl9jb25zdHMgPDwKLSAgICAgICAgImltcG9ydCAiIDw8IHJlbmRlcl9wYWNrYWdlKCpnZXRfcHJvZ3JhbSgpKSA8PCBwcm9ncmFtX25hbWVfIDw8ICJfdHlwZXM7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGVuZGw7Ci0KLSAgICAgIHZlY3Rvcjx0X2NvbnN0Kj46Oml0ZXJhdG9yIGNfaXRlcjsKLSAgICAgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgICAgIHN0cmluZyBuYW1lID0gKCpjX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICAgICB0X3R5cGUqIHR5cGUgPSAoKmNfaXRlciktPmdldF90eXBlKCk7Ci0gICAgICAgIGluZGVudChmX2NvbnN0cykgPDwgImltbXV0YWJsZSgiIDw8IHJlbmRlcl90eXBlX25hbWUodHlwZSkgPDwgIikgIiA8PAotICAgICAgICAgIG5hbWUgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIGZfY29uc3RzIDw8Ci0gICAgICAgIGVuZGwgPDwKLSAgICAgICAgInN0YXRpYyB0aGlzKCkgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotCi0gICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICAgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgICAgIGlmIChmaXJzdCkgewotICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZl9jb25zdHMgPDwgZW5kbDsKLSAgICAgICAgfQotICAgICAgICB0X3R5cGUqIHR5cGUgPSAoKmNfaXRlciktPmdldF90eXBlKCk7Ci0gICAgICAgIGluZGVudChmX2NvbnN0cykgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiOwotICAgICAgICBpZiAoIWlzX2ltbXV0YWJsZV90eXBlKHR5cGUpKSB7Ci0gICAgICAgICAgZl9jb25zdHMgPDwgImNhc3QoaW1tdXRhYmxlKCIgPDwgcmVuZGVyX3R5cGVfbmFtZSh0eXBlKSA8PCAiKSkgIjsKLSAgICAgICAgfQotICAgICAgICBmX2NvbnN0cyA8PAotICAgICAgICAgIHJlbmRlcl9jb25zdF92YWx1ZSh0eXBlLCAoKmNfaXRlciktPmdldF92YWx1ZSgpKSA8PCAiOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQoZl9jb25zdHMpIDw8Ci0gICAgICAgICJ9IiA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKLSAgICBmX3R5cGVzXyA8PAotICAgICAgaW5kZW50KCkgPDwgImFsaWFzICIgPDwgcmVuZGVyX3R5cGVfbmFtZSh0dHlwZWRlZi0+Z2V0X3R5cGUoKSkgPDwgIiAiIDw8Ci0gICAgICB0dHlwZWRlZi0+Z2V0X3N5bWJvbGljKCkgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotCi0gIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKLSAgICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKLQotICAgIHN0cmluZyBlbnVtX25hbWUgPSB0ZW51bS0+Z2V0X25hbWUoKTsKLSAgICBmX3R5cGVzXyA8PAotICAgICAgaW5kZW50KCkgPDwgImVudW0gIiA8PCBlbnVtX25hbWUgPDwgIiB7IiA8PCBlbmRsOwotCi0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIGNfaXRlcjsKLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgewotICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3R5cGVzXyA8PCAiLCIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIGluZGVudChmX3R5cGVzXykgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICAgZl90eXBlc18gPDwgIiA9ICIgPDwgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgICB9Ci0KLSAgICBmX3R5cGVzXyA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KGZfdHlwZXNfKSA8PCAifSIgPDwgZW5kbDsKLQotICAgIGZfdHlwZXNfIDw8IGVuZGw7Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gICAgcHJpbnRfc3RydWN0X2RlZmluaXRpb24oZl90eXBlc18sIHRzdHJ1Y3QsIGZhbHNlKTsKLSAgfQotCi0gIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7Ci0gICAgcHJpbnRfc3RydWN0X2RlZmluaXRpb24oZl90eXBlc18sIHR4Y2VwdGlvbiwgdHJ1ZSk7Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gICAgc3RyaW5nIHN2Y19uYW1lID0gdHNlcnZpY2UtPmdldF9uYW1lKCk7Ci0KLSAgICAvLyBTZXJ2aWNlIGltcGxlbWVudGF0aW9uIGZpbGUgaW5jbHVkZXMKLSAgICBzdHJpbmcgZl9zZXJ2aWNlbmFtZSA9IHBhY2thZ2VfZGlyXyArIHN2Y19uYW1lICsgIi5kIjsKLSAgICBzdGQ6Om9mc3RyZWFtIGZfc2VydmljZTsKLSAgICBmX3NlcnZpY2Uub3BlbihmX3NlcnZpY2VuYW1lLmNfc3RyKCkpOwotICAgIGZfc2VydmljZSA8PAotICAgICAgYXV0b2dlbl9jb21tZW50KCkgPDwKLSAgICAgICJtb2R1bGUgIiA8PCByZW5kZXJfcGFja2FnZSgqcHJvZ3JhbV8pIDw8IHN2Y19uYW1lIDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsOwotCi0gICAgcHJpbnRfZGVmYXVsdF9pbXBvcnRzKGZfc2VydmljZSk7Ci0KLSAgICBmX3NlcnZpY2UgPDwgImltcG9ydCAiIDw8IHJlbmRlcl9wYWNrYWdlKCpnZXRfcHJvZ3JhbSgpKSA8PCBwcm9ncmFtX25hbWVfIDw8Ci0gICAgICAiX3R5cGVzOyIgPDwgZW5kbDsKLQotICAgIHRfc2VydmljZSogZXh0ZW5kc19zZXJ2aWNlID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7Ci0gICAgaWYgKGV4dGVuZHNfc2VydmljZSAhPSBOVUxMKSB7Ci0gICAgICBmX3NlcnZpY2UgPDwKLSAgICAgICAgImltcG9ydCAiIDw8IHJlbmRlcl9wYWNrYWdlKCooZXh0ZW5kc19zZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSkgPDwKLSAgICAgICAgZXh0ZW5kc19zZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIGZfc2VydmljZSA8PCBlbmRsOwotCi0gICAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgICAgZXh0ZW5kcyA9ICIgOiAiICsgcmVuZGVyX3R5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7Ci0gICAgfQotCi0gICAgZl9zZXJ2aWNlIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaW50ZXJmYWNlICIgPDwgc3ZjX25hbWUgPDwgZXh0ZW5kcyA8PCAiIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICAvLyBDb2xsZWN0IGFsbCB0aGUgZXhjZXB0aW9uIHR5cGVzIHNlcnZpY2UgbWV0aG9kcyBjYW4gdGhyb3cgc28gd2UgY2FuCi0gICAgLy8gZW1pdCB0aGUgbmVjZXNzYXJ5IGFsaWFzZXMgbGF0ZXIuCi0gICAgc2V0PHRfdHlwZSo+IGV4Y2VwdGlvbl90eXBlczsKLQotICAgIC8vIFByaW50IHRoZSBtZXRob2Qgc2lnbmF0dXJlcy4KLSAgICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gICAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZm5faXRlcjsKLSAgICBmb3IgKGZuX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZm5faXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZm5faXRlcikgewotICAgICAgZl9zZXJ2aWNlIDw8IGluZGVudCgpOwotICAgICAgcHJpbnRfZnVuY3Rpb25fc2lnbmF0dXJlKGZfc2VydmljZSwgKmZuX2l0ZXIpOwotICAgICAgZl9zZXJ2aWNlIDw8ICI7IiA8PCBlbmRsOwotCi0gICAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBleGNlcHRpb25zID0gKCpmbl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpLT5nZXRfbWVtYmVycygpOwotICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZXhfaXRlcjsKLSAgICAgIGZvciAoZXhfaXRlciA9IGV4Y2VwdGlvbnMuYmVnaW4oKTsgZXhfaXRlciAhPSBleGNlcHRpb25zLmVuZCgpOyArK2V4X2l0ZXIpIHsKLSAgICAgICAgZXhjZXB0aW9uX3R5cGVzLmluc2VydCgoKmV4X2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBBbGlhcyB0aGUgZXhjZXB0aW9uIHR5cGVzIGludG8gdGhlIGN1cnJlbnQgc2NvcGUuCi0gICAgaWYgKCFleGNlcHRpb25fdHlwZXMuZW1wdHkoKSkgZl9zZXJ2aWNlIDw8IGVuZGw7Ci0gICAgc2V0PHRfdHlwZSo+Ojpjb25zdF9pdGVyYXRvciBldF9pdGVyOwotICAgIGZvciAoZXRfaXRlciA9IGV4Y2VwdGlvbl90eXBlcy5iZWdpbigpOyBldF9pdGVyICE9IGV4Y2VwdGlvbl90eXBlcy5lbmQoKTsgKytldF9pdGVyKSB7Ci0gICAgICBpbmRlbnQoZl9zZXJ2aWNlKSA8PCAiYWxpYXMgIiA8PCByZW5kZXJfcGFja2FnZSgqKCpldF9pdGVyKS0+Z2V0X3Byb2dyYW0oKSkgPDwKLSAgICAgICAgKCpldF9pdGVyKS0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWUoKSA8PCAiX3R5cGVzIiA8PCAiLiIgPDwKLSAgICAgICAgKCpldF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICIgPDwgKCpldF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICAvLyBXcml0ZSB0aGUgbWV0aG9kIG1ldGFkYXRhLgotICAgIG9zdHJpbmdzdHJlYW0gbWV0YTsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKGZuX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZm5faXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZm5faXRlcikgewotICAgICAgaWYgKCgqZm5faXRlciktPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCkuZW1wdHkoKSAmJgotICAgICAgICAoKmZuX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCktPmdldF9tZW1iZXJzKCkuZW1wdHkoKSAmJgotICAgICAgICAhKCpmbl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChmaXJzdCkgewotICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgbWV0YSA8PCAiLCI7Ci0gICAgICB9Ci0KLSAgICAgIG1ldGEgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiVE1ldGhvZE1ldGEoYCIgPDwgKCpmbl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiYCwgIiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBpbmRlbnQobWV0YSkgPDwgIlsiOwotCi0gICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4gJnBhcmFtcyA9ICgqZm5faXRlciktPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7Ci0gICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBwX2l0ZXI7Ci0gICAgICBmb3IgKHBfaXRlciA9IHBhcmFtcy5iZWdpbigpOyBwX2l0ZXIgIT0gcGFyYW1zLmVuZCgpOyArK3BfaXRlcikgewotICAgICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIG1ldGEgPDwgIiwgIjsKLSAgICAgICAgfQotCi0gICAgICAgIG1ldGEgPDwgIlRQYXJhbU1ldGEoYCIgPDwgKCpwX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJgLCAiIDw8ICgqcF9pdGVyKS0+Z2V0X2tleSgpOwotCi0gICAgICAgIHRfY29uc3RfdmFsdWUqIGN2ID0gKCpwX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgICAgICAgaWYgKGN2ICE9IE5VTEwpIHsKLSAgICAgICAgICBtZXRhIDw8ICIsIHF7IiA8PCByZW5kZXJfY29uc3RfdmFsdWUoKCpwX2l0ZXIpLT5nZXRfdHlwZSgpLCBjdikgPDwgIn0iOwotICAgICAgICB9Ci0gICAgICAgIG1ldGEgPDwgIikiOwotICAgICAgfQotCi0gICAgICBtZXRhIDw8ICJdIjsKLQotICAgICAgaWYgKCEoKmZuX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCktPmdldF9tZW1iZXJzKCkuZW1wdHkoKSB8fAotICAgICAgICAoKmZuX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgICBtZXRhIDw8ICIsIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIlsiOwotCi0gICAgICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgICAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBleGNlcHRpb25zID0KLSAgICAgICAgICAoKmZuX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCktPmdldF9tZW1iZXJzKCk7Ci0gICAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGV4X2l0ZXI7Ci0gICAgICAgIGZvciAoZXhfaXRlciA9IGV4Y2VwdGlvbnMuYmVnaW4oKTsgZXhfaXRlciAhPSBleGNlcHRpb25zLmVuZCgpOyArK2V4X2l0ZXIpIHsKLSAgICAgICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1ldGEgPDwgIiwgIjsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBtZXRhIDw8ICJURXhjZXB0aW9uTWV0YShgIiA8PCAoKmV4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8Ci0gICAgICAgICAgICAiYCwgIiA8PCAoKmV4X2l0ZXIpLT5nZXRfa2V5KCkgPDwgIiwgYCIgPDwKLSAgICAgICAgICAgICgqZXhfaXRlciktPmdldF90eXBlKCktPmdldF9uYW1lKCkgPDwgImApIjsKLSAgICAgICAgfQotCi0gICAgICAgIG1ldGEgPDwgIl0iOwotICAgICAgfQotCi0gICAgICBpZiAoKCpmbl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgICAgbWV0YSA8PCAiLCIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJUTWV0aG9kVHlwZS5PTkVXQVkiOwotICAgICAgfQotCi0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgbWV0YSA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIpIjsKLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLQotICAgIHN0cmluZyBtZXRhX3N0cihtZXRhLnN0cigpKTsKLSAgICBpZiAoIW1ldGFfc3RyLmVtcHR5KCkpIHsKLSAgICAgIGZfc2VydmljZSA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJlbnVtIG1ldGhvZE1ldGEgPSBbIiA8PCBtZXRhX3N0ciA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJdOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChmX3NlcnZpY2UpIDw8ICJ9IiA8PCBlbmRsOwotCi0KLSAgICAvLyBTZXJ2ZXIgc2tlbGV0b24gZ2VuZXJhdGlvbi4KLSAgICBzdHJpbmcgZl9za2VsZXRvbm5hbWUgPSBwYWNrYWdlX2Rpcl8gKyBzdmNfbmFtZSArICJfc2VydmVyLnNrZWxldG9uLmQiOwotICAgIHN0ZDo6b2ZzdHJlYW0gZl9za2VsZXRvbjsKLSAgICBmX3NrZWxldG9uLm9wZW4oZl9za2VsZXRvbm5hbWUuY19zdHIoKSk7Ci0gICAgcHJpbnRfc2VydmVyX3NrZWxldG9uKGZfc2tlbGV0b24sIHRzZXJ2aWNlKTsKLSAgICBmX3NrZWxldG9uLmNsb3NlKCk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gICAgLyoqCi0gICAgICogV3JpdGVzIGEgc2VydmVyIHNrZWxldG9uIGZvciB0aGUgcGFzc2VkIHNlcnZpY2UgdG8gb3V0LgotICAgICAqLwotICAgIHZvaWQgcHJpbnRfc2VydmVyX3NrZWxldG9uKG9zdHJlYW0gJm91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSkgewotICAgICAgc3RyaW5nIHN2Y19uYW1lID0gdHNlcnZpY2UtPmdldF9uYW1lKCk7Ci0KLSAgICAgIG91dCA8PAotICAgICAgICAiLyoiIDw8IGVuZGwgPDwKLSAgICAgICAgIiAqIFRoaXMgYXV0by1nZW5lcmF0ZWQgc2tlbGV0b24gZmlsZSBpbGx1c3RyYXRlcyBob3cgdG8gYnVpbGQgYSBzZXJ2ZXIuIElmIHlvdSIgPDwgZW5kbCA8PAotICAgICAgICAiICogaW50ZW5kIHRvIGN1c3RvbWl6ZSBpdCwgeW91IHNob3VsZCBlZGl0IGEgY29weSB3aXRoIGFub3RoZXIgZmlsZSBuYW1lIHRvICIgPDwgZW5kbCA8PAotICAgICAgICAiICogYXZvaWQgb3ZlcndyaXRpbmcgaXQgd2hlbiBydW5uaW5nIHRoZSBnZW5lcmF0b3IgYWdhaW4uIiA8PCBlbmRsIDw8Ci0gICAgICAgICIgKi8iIDw8IGVuZGwgPDwKLSAgICAgICAgIm1vZHVsZSAiIDw8IHJlbmRlcl9wYWNrYWdlKCp0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgPDwgc3ZjX25hbWUgPDwgIl9zZXJ2ZXI7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGVuZGwgPDwKLSAgICAgICAgImltcG9ydCBzdGQuc3RkaW87IiA8PCBlbmRsIDw8Ci0gICAgICAgICJpbXBvcnQgdGhyaWZ0LmNvZGVnZW4ucHJvY2Vzc29yOyIgPDwgZW5kbCA8PAotICAgICAgICAiaW1wb3J0IHRocmlmdC5wcm90b2NvbC5iaW5hcnk7IiA8PCBlbmRsIDw8Ci0gICAgICAgICJpbXBvcnQgdGhyaWZ0LnNlcnZlci5zaW1wbGU7IiA8PCBlbmRsIDw8Ci0gICAgICAgICJpbXBvcnQgdGhyaWZ0LnNlcnZlci50cmFuc3BvcnQuc29ja2V0OyIgPDwgZW5kbCA8PAotICAgICAgICAiaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuYnVmZmVyZWQ7IiA8PCBlbmRsIDw8Ci0gICAgICAgICJpbXBvcnQgdGhyaWZ0LnV0aWwuaGFzaHNldDsiIDw8IGVuZGwgPDwKLSAgICAgICAgZW5kbCA8PAotICAgICAgICAiaW1wb3J0ICIgPDwgcmVuZGVyX3BhY2thZ2UoKnRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSA8PCBzdmNfbmFtZSA8PCAiOyIgPDwgZW5kbCA8PAotICAgICAgICAiaW1wb3J0ICIgPDwgcmVuZGVyX3BhY2thZ2UoKmdldF9wcm9ncmFtKCkpIDw8IHByb2dyYW1fbmFtZV8gPDwgIl90eXBlczsiIDw8IGVuZGwgPDwKLSAgICAgICAgZW5kbCA8PAotICAgICAgICBlbmRsIDw8Ci0gICAgICAgICJjbGFzcyAiIDw8IHN2Y19uYW1lIDw8ICJIYW5kbGVyIDogIiA8PCBzdmNfbmFtZSA8PCAiIHsiIDw8IGVuZGw7Ci0KLSAgICAgIGluZGVudF91cCgpOwotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ0aGlzKCkgeyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICAvLyBZb3VyIGluaXRpYWxpemF0aW9uIGdvZXMgaGVyZS4iIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgICAgZW5kbDsKLQotICAgICAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICAgICAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotICAgICAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgICAgb3V0IDw8IGluZGVudCgpOwotICAgICAgICBwcmludF9mdW5jdGlvbl9zaWduYXR1cmUob3V0LCAqZl9pdGVyKTsKLSAgICAgICAgb3V0IDw8ICIgeyIgPDwgZW5kbDsKLQotICAgICAgICBpbmRlbnRfdXAoKTsKLQotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiLy8gWW91ciBpbXBsZW1lbnRhdGlvbiBnb2VzIGhlcmUuIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIndyaXRlbG4oXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGNhbGxlZFwiKTsiIDw8IGVuZGw7Ci0KLSAgICAgICAgdF9iYXNlX3R5cGUqIHJ0ID0gKHRfYmFzZV90eXBlKikoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCk7Ci0gICAgICAgIGlmIChydC0+Z2V0X2Jhc2UoKSAhPSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEKSB7Ci0gICAgICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiB0eXBlb2YocmV0dXJuKS5pbml0OyIgPDwgZW5kbDsKLSAgICAgICAgfQotCi0gICAgICAgIGluZGVudF9kb3duKCk7Ci0KLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgICAgICBlbmRsOwotICAgICAgfQotCi0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgb3V0IDw8Ci0gICAgICAgICJ9IiA8PCBlbmRsIDw8Ci0gICAgICAgIGVuZGw7Ci0KLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAidm9pZCBtYWluKCkgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJhdXRvIHByb3RvY29sRmFjdG9yeSA9IG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5ISgpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiYXV0byBwcm9jZXNzb3IgPSBuZXcgVFNlcnZpY2VQcm9jZXNzb3IhIiA8PCBzdmNfbmFtZSA8PCAiKG5ldyAiIDw8IHN2Y19uYW1lIDw8ICJIYW5kbGVyKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImF1dG8gc2VydmVyVHJhbnNwb3J0ID0gbmV3IFRTZXJ2ZXJTb2NrZXQoOTA5MCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJhdXRvIHRyYW5zcG9ydEZhY3RvcnkgPSBuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeTsiIDw8IGVuZGwgPDwKLQotICAgICAgICBpbmRlbnQoKSA8PCAiYXV0byBzZXJ2ZXIgPSBuZXcgVFNpbXBsZVNlcnZlcigiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgcHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJzZXJ2ZXIuc2VydmUoKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgb3V0IDw8Ci0gICAgICAgICJ9IiA8PCBlbmRsOwotICAgIH0KLQotICAvKioKLSAgICogV3JpdGVzIHRoZSBkZWZpbml0aW9uIG9mIGEgc3RydWN0IG9yIGFuIGV4Y2VwdGlvbiB0eXBlIHRvIG91dC4KLSAgICovCi0gIHZvaWQgcHJpbnRfc3RydWN0X2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pIHsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLQotICAgIGlmIChpc19leGNlcHRpb24pIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJjbGFzcyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiA6IFRFeGNlcHRpb24geyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwgInN0cnVjdCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiB7IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIC8vIERlY2xhcmUgYWxsIGZpZWxkcy4KLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgaW5kZW50KG91dCkgPDwgcmVuZGVyX3R5cGVfbmFtZSgoKm1faXRlciktPmdldF90eXBlKCkpIDw8ICIgIiA8PAotICAgICAgICAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgaWYgKCFtZW1iZXJzLmVtcHR5KCkpIGluZGVudChvdXQpIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIm1peGluIFRTdHJ1Y3RIZWxwZXJzISgiOwotCi0gICAgaWYgKCFtZW1iZXJzLmVtcHR5KCkpIHsKLSAgICAgIC8vIElmIHRoZXJlIGFyZSBhbnkgZmllbGRzLCBjb25zdHJ1Y3QgdGhlIFRGaWVsZE1ldGEgYXJyYXkgdG8gcGFzcyB0bwotICAgICAgLy8gVFN0cnVjdEhlbHBlcnMuIFdlIGNhbid0IGp1c3QgcGFzcyBhbiBlbXB0eSBhcnJheSBpZiBub3QgYmVjYXVzZSBbXQotICAgICAgLy8gZG9lc24ndCBwYXNzIHRoZSBURmllbGRNZXRhW10gY29uc3RyYWludC4KLSAgICAgIG91dCA8PCAiWyI7Ci0gICAgICBpbmRlbnRfdXAoKTsKLQotICAgICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0gICAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICAgIGlmIChmaXJzdCkgewotICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgb3V0IDw8ICIsIjsKLSAgICAgICAgfQotICAgICAgICBvdXQgPDwgZW5kbDsKLQotICAgICAgICBpbmRlbnQob3V0KSA8PCAiVEZpZWxkTWV0YShgIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgImAsICIgPDwKLSAgICAgICAgICAoKm1faXRlciktPmdldF9rZXkoKTsKLQotICAgICAgICB0X2NvbnN0X3ZhbHVlKiBjdiA9ICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0gICAgICAgIHRfZmllbGQ6OmVfcmVxIHJlcSA9ICgqbV9pdGVyKS0+Z2V0X3JlcSgpOwotICAgICAgICBvdXQgPDwgIiwgIiA8PCByZW5kZXJfcmVxKHJlcSk7Ci0gICAgICAgIGlmIChjdiAhPSBOVUxMKSB7Ci0gICAgICAgICAgb3V0IDw8ICIsIHF7IiA8PCByZW5kZXJfY29uc3RfdmFsdWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpLCBjdikgPDwgIn0iOwotICAgICAgICB9Ci0gICAgICAgIG91dCA8PCAiKSI7Ci0gICAgICB9Ci0KLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiXSI7Ci0gICAgfQotCi0gICAgb3V0IDw8ICIpOyIgPDwgZW5kbDsKLQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJ9IiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsOwotICB9Ci0KLSAgLyoqCi0gICAqIFByaW50cyB0aGUgRCBmdW5jdGlvbiBzaWduYXR1cmUgKGluY2x1ZGluZyByZXR1cm4gdHlwZSkgZm9yIHRoZSBnaXZlbgotICAgKiBtZXRob2QuCi0gICAqLwotICB2b2lkIHByaW50X2Z1bmN0aW9uX3NpZ25hdHVyZShvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIGZuKSB7Ci0gICAgb3V0IDw8IHJlbmRlcl90eXBlX25hbWUoZm4tPmdldF9yZXR1cm50eXBlKCkpIDw8Ci0gICAgICAiICIgPDwgZm4tPmdldF9uYW1lKCkgPDwgIigiOwotCi0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gZm4tPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PCAiLCAiOwotICAgICAgfQotICAgICAgb3V0IDw8IHJlbmRlcl90eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpLCB0cnVlKSA8PCAiICIgPDwKLSAgICAgICAgICAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgfQotCi0gICAgb3V0IDw8ICIpIjsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBEIHJlcHJlc2VudGF0aW9uIG9mIHZhbHVlLiBUaGUgcmVzdWx0IGlzIGd1YXJhbnRlZWQgdG8gYmUgYQotICAgKiBzaW5nbGUgZXhwcmVzc2lvbjsgZm9yIGNvbXBsZXggdHlwZXMsIGltbWVkaWF0ZWx5IGNhbGxlZCBkZWxlZ2F0ZQotICAgKiBsaXRlcmFscyBhcmUgdXNlZCB0byBhY2hpZXZlIHRoaXMuCi0gICAqLwotICBzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKLSAgICAvLyBSZXNvbHZlIGFueSB0eXBlZGVmcy4KLSAgICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLQotICAgIG9zdHJpbmdzdHJlYW0gb3V0OwotICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIG91dCA8PCAnIicgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICBvdXQgPDwgKCh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDApID8gInRydWUiIDogImZhbHNlIik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgIG91dCA8PCAiY2FzdCgiIDw8IHJlbmRlcl90eXBlX25hbWUodHlwZSkgPDwgIikiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiTCI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7Ci0gICAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgIkNvbXBpbGVyIGVycm9yOiBObyBjb25zdCBvZiBiYXNlIHR5cGUgIiArCi0gICAgICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgb3V0IDw8ICJjYXN0KCIgPDwgcmVuZGVyX3R5cGVfbmFtZSh0eXBlKSA8PCAiKSIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dCA8PCAieyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotCi0gICAgICBpbmRlbnQob3V0KSA8PCByZW5kZXJfdHlwZV9uYW1lKHR5cGUpIDw8ICIgdjsiIDw8IGVuZGw7Ci0gICAgICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAidiA9ICIgPDwgKHR5cGUtPmlzX3hjZXB0aW9uKCkgPyAibmV3ICIgOiAiIikgPDwKLSAgICAgICAgICByZW5kZXJfdHlwZV9uYW1lKHR5cGUpIDw8ICIoKTsiIDw8IGVuZGw7Ci0KLSAgICAgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7Ci0gICAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgICAgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKLSAgICAgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKLSAgICAgICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgewotICAgICAgICAgICAgdGhyb3cgIlR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArCi0gICAgICAgICAgICAgIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgICAgICAgaW5kZW50KG91dCkgPDwgInYuc2V0IWAiIDw8IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSA8PAotICAgICAgICAgICAgImAoIiA8PCB2YWwgPDwgIik7IiA8PCBlbmRsOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0gICAgICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgICAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgICAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgICAgIHN0cmluZyBrZXkgPSByZW5kZXJfY29uc3RfdmFsdWUoa3R5cGUsIHZfaXRlci0+Zmlyc3QpOwotICAgICAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUodnR5cGUsIHZfaXRlci0+c2Vjb25kKTsKLSAgICAgICAgICBpbmRlbnQob3V0KSA8PCAidlsiOwotICAgICAgICAgIGlmICghaXNfaW1tdXRhYmxlX3R5cGUoa3R5cGUpKSB7Ci0gICAgICAgICAgICBvdXQgPDwgImNhc3QoaW1tdXRhYmxlKCIgPDwgcmVuZGVyX3R5cGVfbmFtZShrdHlwZSkgPDwgIikpIjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgb3V0IDw8IGtleSA8PCAiXSA9ICIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgICB0X3R5cGUqIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOwotICAgICAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShldHlwZSwgKnZfaXRlcik7Ci0gICAgICAgICAgaW5kZW50KG91dCkgPDwgInYgfj0gIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgICAgdF90eXBlKiBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOwotICAgICAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShldHlwZSwgKnZfaXRlcik7Ci0gICAgICAgICAgaW5kZW50KG91dCkgPDwgInYgfj0gIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHRocm93ICJDb21waWxlciBlcnJvcjogSW52YWxpZCB0eXBlIGluIHJlbmRlcl9jb25zdF92YWx1ZTogIiArCi0gICAgICAgICAgdHlwZS0+Z2V0X25hbWUoKTsKLSAgICAgIH0KLSAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdjsiIDw8IGVuZGw7Ci0KLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSgpIjsKLSAgICB9Ci0KLSAgICByZXR1cm4gb3V0LnN0cigpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIEQgcGFja2FnZSB0byB3aGljaCBtb2R1bGVzIGZvciBwcm9ncmFtIGFyZSB3cml0dGVuICh3aXRoIGEKLSAgICogdHJhaWxpbmcgZG90LCBpZiBub3QgZW1wdHkpLgotICAgKi8KLSAgc3RyaW5nIHJlbmRlcl9wYWNrYWdlKGNvbnN0IHRfcHJvZ3JhbSYgcHJvZ3JhbSkgY29uc3QgewotICAgIHN0cmluZyBwYWNrYWdlID0gcHJvZ3JhbS5nZXRfbmFtZXNwYWNlKCJkIik7Ci0gICAgaWYgKHBhY2thZ2Uuc2l6ZSgpID09IDApIHJldHVybiAiIjsKLSAgICByZXR1cm4gcGFja2FnZSArICIuIjsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBEIHJlcGVzZW50YXRpb24gb2YgdHR5cGUuCi0gICAqCi0gICAqIElmIGlzQXJnIGlzIHRydWUsIGEgY29uc3QgcmVmZXJlbmNlIHRvIHRoZSB0eXBlIHdpbGwgYmUgcmV0dXJuZWQgZm9yCi0gICAqIHN0cnVjdHMuCi0gICAqLwotICBzdHJpbmcgcmVuZGVyX3R5cGVfbmFtZShjb25zdCB0X3R5cGUqIHR0eXBlLCBib29sIGlzQXJnID0gZmFsc2UpIGNvbnN0IHsKLSAgICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICByZXR1cm4gInZvaWQiOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIHJldHVybiAic3RyaW5nIjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgcmV0dXJuICJib29sIjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgcmV0dXJuICJieXRlIjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICByZXR1cm4gInNob3J0IjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICByZXR1cm4gImludCI7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgcmV0dXJuICJsb25nIjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICByZXR1cm4gImRvdWJsZSI7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyAiQ29tcGlsZXIgZXJyb3I6IE5vIEQgdHlwZSBuYW1lIGZvciBiYXNlIHR5cGUgIiArCi0gICAgICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAodHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgICB0X2NvbnRhaW5lciogdGNvbnRhaW5lciA9ICh0X2NvbnRhaW5lciopIHR0eXBlOwotICAgICAgaWYgKHRjb250YWluZXItPmhhc19jcHBfbmFtZSgpKSB7Ci0gICAgICAgIHJldHVybiB0Y29udGFpbmVyLT5nZXRfY3BwX25hbWUoKTsKLSAgICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgICAgIHRfbWFwKiB0bWFwID0gKHRfbWFwKikgdHR5cGU7Ci0gICAgICAgIHRfdHlwZSoga3R5cGUgPSB0bWFwLT5nZXRfa2V5X3R5cGUoKTsKLQotICAgICAgICBzdHJpbmcgbmFtZSA9IHJlbmRlcl90eXBlX25hbWUodG1hcC0+Z2V0X3ZhbF90eXBlKCkpICsgIlsiOwotICAgICAgICBpZiAoIWlzX2ltbXV0YWJsZV90eXBlKGt0eXBlKSkgewotICAgICAgICAgIG5hbWUgKz0gImltbXV0YWJsZSgiOwotICAgICAgICB9Ci0gICAgICAgIG5hbWUgKz0gcmVuZGVyX3R5cGVfbmFtZShrdHlwZSk7Ci0gICAgICAgIGlmICghaXNfaW1tdXRhYmxlX3R5cGUoa3R5cGUpKSB7Ci0gICAgICAgICAgbmFtZSArPSAiKSI7Ci0gICAgICAgIH0KLSAgICAgICAgbmFtZSArPSAiXSI7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgICAgdF9zZXQqIHRzZXQgPSAodF9zZXQqKSB0dHlwZTsKLSAgICAgICAgcmV0dXJuICJIYXNoU2V0ISgiICsgcmVuZGVyX3R5cGVfbmFtZSh0c2V0LT5nZXRfZWxlbV90eXBlKCkpICsgIikiOwotICAgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICAgIHRfbGlzdCogdGxpc3QgPSAodF9saXN0KikgdHR5cGU7Ci0gICAgICAgIHJldHVybiByZW5kZXJfdHlwZV9uYW1lKHRsaXN0LT5nZXRfZWxlbV90eXBlKCkpICsgIltdIjsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAodHR5cGUtPmlzX3N0cnVjdCgpICYmIGlzQXJnKSB7Ci0gICAgICByZXR1cm4gInJlZiBjb25zdCgiICsgdHR5cGUtPmdldF9uYW1lKCkgKyAiKSI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiB0dHlwZS0+Z2V0X25hbWUoKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgRCBUUmVxIGVudW0gbWVtYmVyIGNvcnJlc3BvbmRpbmcgdG8gcmVxLgotICAgKi8KLSAgc3RyaW5nIHJlbmRlcl9yZXEodF9maWVsZDo6ZV9yZXEgcmVxKSBjb25zdCB7Ci0gICAgc3dpdGNoIChyZXEpIHsKLSAgICBjYXNlIHRfZmllbGQ6OlRfT1BUX0lOX1JFUV9PVVQ6Ci0gICAgICByZXR1cm4gIlRSZXEuT1BUX0lOX1JFUV9PVVQiOwotICAgIGNhc2UgdF9maWVsZDo6VF9PUFRJT05BTDoKLSAgICAgIHJldHVybiAiVFJlcS5PUFRJT05BTCI7Ci0gICAgY2FzZSB0X2ZpZWxkOjpUX1JFUVVJUkVEOgotICAgICAgcmV0dXJuICJUUmVxLlJFUVVJUkVEIjsKLSAgICBkZWZhdWx0OgotICAgICAgewotICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKLSAgICAgICAgc3MgPDwgIkNvbXBpbGVyIGVycm9yOiBJbnZhbGlkIHJlcXVpcmVtZW50IGxldmVsICIgPDwgcmVxOwotICAgICAgICB0aHJvdyBzcy5zdHIoKTsKLSAgICAgIH0KLSAgICAKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogV3JpdGVzIHRoZSBkZWZhdWx0IGxpc3Qgb2YgaW1wb3J0cyAod2hpY2ggYXJlIHdyaXR0ZW4gdG8gZXZlcnkgZ2VuZXJhdGVkCi0gICAqIG1vZHVsZSkgdG8gZi4KLSAgICovCi0gIHZvaWQgcHJpbnRfZGVmYXVsdF9pbXBvcnRzKG9zdHJlYW0mIG91dCkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiaW1wb3J0IHRocmlmdC5iYXNlOyIgPDwgZW5kbCA8PAotICAgICAgImltcG9ydCB0aHJpZnQuY29kZWdlbi5iYXNlOyIgPDwgZW5kbCA8PAotICAgICAgImltcG9ydCB0aHJpZnQudXRpbC5oYXNoc2V0OyIgPDwgZW5kbCA8PAotICAgICAgZW5kbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHdoZXRoZXIgdHlwZSBpcyDCu2ludHJpbnNpY2FsbHkgaW1tdXRhYmxlwqssIGluIHRoZSBzZW5zZSB0aGF0Ci0gICAqIGEgdmFsdWUgb2YgdGhhdCB0eXBlIGlzIGltcGxpY2l0bHkgY2FzdGFibGUgdG8gaW1tdXRhYmxlKHR5cGUpLCBhbmQgaXQgaXMKLSAgICogYWxsb3dlZCBmb3IgQUEga2V5cyB3aXRob3V0IGFuIGltbXV0YWJsZSgpIHF1YWxpZmllci4KLSAgICovCi0gIGJvb2wgaXNfaW1tdXRhYmxlX3R5cGUodF90eXBlKiB0eXBlKSBjb25zdCB7Ci0gICAgdF90eXBlKiB0dHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0gICAgcmV0dXJuIHR0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0dHlwZS0+aXNfZW51bSgpOwotICB9Ci0KLSAgLyoKLSAgICogRmlsZSBzdHJlYW1zLCBzdG9yZWQgaGVyZSB0byBhdm9pZCBwYXNzaW5nIHRoZW0gYXMgcGFyYW1ldGVycyB0byBldmVyeQotICAgKiBmdW5jdGlvbi4KLSAgICovCi0gIG9mc3RyZWFtIGZfdHlwZXNfOwotICBvZnN0cmVhbSBmX2hlYWRlcl87Ci0KLSAgc3RyaW5nIHBhY2thZ2VfZGlyXzsKLX07Ci0KLVRIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoZCwgIkQiLCAiIikKLQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2RlbHBoaV9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfZGVscGhpX2dlbmVyYXRvci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzViOGRhOS4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfZGVscGhpX2dlbmVyYXRvci5jYworKysgL2Rldi9udWxsCkBAIC0xLDM0OTIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgotICogUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKLSAqIGRldGFpbHMuCi0gKi8KLQotI2luY2x1ZGUgPGNhc3NlcnQ+Ci0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8ZnN0cmVhbT4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSA8bGlzdD4KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlIDxjY3R5cGU+Ci0KLSNpbmNsdWRlICJwbGF0Zm9ybS5oIgotI2luY2x1ZGUgInRfb29wX2dlbmVyYXRvci5oIgotCi11c2luZyBzdGQ6Om1hcDsKLXVzaW5nIHN0ZDo6b2ZzdHJlYW07Ci11c2luZyBzdGQ6Om9zdHJlYW07Ci11c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Ci11c2luZyBzdGQ6OnN0cmluZzsKLXVzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwotdXNpbmcgc3RkOjp2ZWN0b3I7Ci0KLXN0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7ICAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCi0KLWNsYXNzIHRfZGVscGhpX2dlbmVyYXRvciA6IHB1YmxpYyB0X29vcF9nZW5lcmF0b3IKLXsKLSAgcHVibGljOgotICAgIHRfZGVscGhpX2dlbmVyYXRvcigKLSAgICAgICAgdF9wcm9ncmFtKiBwcm9ncmFtLAotICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKLSAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCi0gICAgICA6IHRfb29wX2dlbmVyYXRvcihwcm9ncmFtKQotICAgIHsKLSAgICAgICh2b2lkKSBvcHRpb25fc3RyaW5nOwotICAgICAgaW5kZW50X2ltcGxfID0gMDsKLSAgICAgIGhhc19mb3J3YXJkID0gZmFsc2U7Ci0gICAgICBoYXNfZW51bSA9IGZhbHNlOwotICAgICAgaGFzX2NvbnN0ID0gZmFsc2U7Ci0gICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOwotCi0gICAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgiYW5zaXN0cl9iaW5hcnkiKTsKLSAgICAgIGFuc2lzdHJfYmluYXJ5XyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLSAgICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJyZWdpc3Rlcl90eXBlcyIpOwotICAgICAgcmVnaXN0ZXJfdHlwZXNfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotICAgICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoImNvbnN0cHJlZml4Iik7Ci0gICAgICBjb25zdHByZWZpeF8gPSAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7Ci0gICAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgiZXZlbnRzIik7Ci0gICAgICBldmVudHNfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotICAgICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoInhtbGRvYyIpOwotICAgICAgeG1sZG9jXyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLSAgICAgIAotCi0gICAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1kZWxwaGkiOwotICAgICAgZXNjYXBlXy5jbGVhcigpOwotICAgICAgZXNjYXBlX1snXCcnXSA9ICInJyI7Ci0gICAgfQotCi0KLSAgICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7Ci0gICAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKLQotICAgIHZvaWQgZ2VuZXJhdGVfY29uc3RzKHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpOwotCi0gICAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmICh0X3R5cGVkZWYqIHR0eXBlZGVmKTsKLSAgICB2b2lkIGdlbmVyYXRlX2VudW0gKHRfZW51bSogdGVudW0pOwotICAgIHZvaWQgZ2VuZXJhdGVfZm9yd2FyZF9kZWNsYXJhdGlvbih0X3N0cnVjdCogdHN0cnVjdCk7Ci0gICAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QgKHRfc3RydWN0KiB0c3RydWN0KTsKLSAgICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uICh0X3N0cnVjdCogdHhjZXB0aW9uKTsKLSAgICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICAgIHZvaWQgZ2VuZXJhdGVfcHJvcGVydHkob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaXNQdWJsaWMsICBib29sIGlzX3hjZXB0aW9uKTsKLSAgICB2b2lkIGdlbmVyYXRlX3Byb3BlcnR5X3dyaXRlcl8ob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaXNQdWJsaWMpOwotCi0gICAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfcHJvcGVydHkob3N0cmVhbSYgb3V0LCBib29sIHN0cnVjdF9pc19leGNlcHRpb24sIHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpc1B1YmxpYywgc3RkOjpzdHJpbmcgZmllbGRQcmVmaXggPSAiIik7Ci0gICAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfaXNzZXRfcmVhZGVyX2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaXNfeGNlcHRpb24pOwotICAgIHZvaWQgZ2VuZXJhdGVfZGVscGhpX3Byb3BlcnR5X3JlYWRlcl9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBib29sIGlzX3hjZXB0aW9uX2NsYXNzKTsKLSAgICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9wcm9wZXJ0eV93cml0ZXJfZGVmaW5pdGlvbihvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpc194Y2VwdGlvbl9jbGFzcyk7Ci0gICAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfcHJvcGVydHlfcmVhZGVyX2ltcGwob3N0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBjbHNfcHJlZml4LCBzdGQ6OnN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfZmllbGQqIHRmaWVsZCwgc3RkOjpzdHJpbmcgZmllbGRQcmVmaXgsIGJvb2wgaXNfeGNlcHRpb25fY2xhc3MpOwotICAgIHZvaWQgZ2VuZXJhdGVfZGVscGhpX3Byb3BlcnR5X3dyaXRlcl9pbXBsKG9zdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgY2xzX3ByZWZpeCwgc3RkOjpzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2ZpZWxkKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIGZpZWxkUHJlZml4LCBib29sIGlzX3hjZXB0aW9uX2NsYXNzLCBib29sIGlzX3VuaW9uLCBib29sIGlzX3hjZXB0aW9uX2ZhY3RvcnksIHN0ZDo6c3RyaW5nIHhjZXB0aW9uX2ZhY3Ryb3lfbmFtZSk7Ci0gICAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfY2xlYXJfdW5pb25fdmFsdWUob3N0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBjbHNfcHJlZml4LCBzdGQ6OnN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfZmllbGQqIHRmaWVsZCwgc3RkOjpzdHJpbmcgZmllbGRQcmVmaXgsIGJvb2wgaXNfeGNlcHRpb25fY2xhc3MsIGJvb2wgaXNfdW5pb24sIGJvb2wgaXNfeGNlcHRpb25fZmFjdG9yeSwgc3RkOjpzdHJpbmcgeGNlcHRpb25fZmFjdHJveV9uYW1lKTsKLSAgICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9pc3NldF9yZWFkZXJfaW1wbChvc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIGNsc19wcmVmaXgsIHN0ZDo6c3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9maWVsZCogdGZpZWxkLCBzdGQ6OnN0cmluZyBmaWVsZFByZWZpeCwgYm9vbCBpc194Y2VwdGlvbik7Ci0gICAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X3dyaXRlcl9pbXBsKG9zdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgY2xzX3ByZWZpeCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKLSAgICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfcmVzdWx0X3dyaXRlcl9pbXBsKG9zdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgY2xzX3ByZWZpeCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKLQotICAgIHZvaWQgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF90b3N0cmluZ19pbXBsKG9zdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgY2xzX3ByZWZpeCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uLCBib29sIGlzX3hfZmFjdG9yeSk7Ci0KLSAgICB2b2lkIGFkZF9kZWxwaGlfdXNlc19saXN0KCBzdHJpbmcgdW5pdG5hbWUpOwotCi0gICAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X3JlYWRlcl9pbXBsKG9zdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgY2xzX3ByZWZpeCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKLSAgICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9jcmVhdGVfZXhjZXB0aW9uX2ltcGwob3N0cmVhbSYgb3V0LCBzdHJpbmcgY2xzX3ByZWZpeCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKLQotICAgIGJvb2wgY29uc3RfbmVlZHNfdmFyKHRfdHlwZSogdHlwZSk7Ci0gICAgdm9pZCBwcmludF9jb25zdF9wcm9wKHN0ZDo6b3N0cmVhbSYgb3V0LCBzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7Ci0gICAgdm9pZCBwcmludF9wcml2YXRlX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LCBzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7Ci0gICAgdm9pZCBwcmludF9jb25zdF92YWx1ZSAoIHN0ZDo6b3N0cmVhbSYgdmFycywgc3RkOjpvc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOwotICAgIHZvaWQgaW5pdGlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIHZhcnMsIHN0ZDo6b3N0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKLSAgICB2b2lkIGZpbmFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlLCBzdGQ6OnN0cmluZyBjbHNfbm0gPSAiIik7Ci0gICAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKCBzdGQ6Om9zdHJlYW0mIGxvY2FsX3ZhcnMsIHN0ZDo6b3N0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKLSAgICB2b2lkIHByaW50X2NvbnN0X2RlZl92YWx1ZSggc3RkOjpvc3RyZWFtJiB2YXJzLCBzdGQ6Om9zdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwgc3RkOjpzdHJpbmcgY2xzX25tID0gIiIpOwotICAgIHN0ZDo6c3RyaW5nIG1ha2VfY29uc3RhbnRzX2NsYXNzbmFtZSgpOwotCi0gICAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7Ci0gICAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X2ltcGwoIG9zdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgY2xzX3ByZWZpeCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uLCBib29sIGlzX3Jlc3VsdCA9IGZhbHNlLCBib29sIGlzX3hfZmFjdG9yeSA9IGZhbHNlKTsKLSAgICB2b2lkIHByaW50X2RlbHBoaV9zdHJ1Y3RfdHlwZV9mYWN0b3J5X2Z1bmMoICBvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfdHlwZV9mYWN0b3J5KCAgb3N0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBjbHNfcHJlZml4LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24sIGJvb2wgaXNfcmVzdWx0ID0gZmFsc2UsIGJvb2wgaXNfeF9mYWN0b3J5ID0gZmFsc2UpOwotICAgIHZvaWQgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF90eXBlX2ZhY3RvcnlfcmVnaXN0cmF0aW9uKCAgb3N0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBjbHNfcHJlZml4LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24sIGJvb2wgaXNfcmVzdWx0ID0gZmFsc2UsIGJvb2wgaXNfeF9mYWN0b3J5ID0gZmFsc2UpOwotICAgIHZvaWQgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF9kZWZpbml0aW9uKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc194Y2VwdGlvbj1mYWxzZSwgYm9vbCBpbl9jbGFzcz1mYWxzZSwgYm9vbCBpc19yZXN1bHQ9ZmFsc2UsIGJvb2wgaXNfeF9mYWN0b3J5ID0gZmFsc2UpOwotICAgIHZvaWQgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF9yZWFkZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICAgIHZvaWQgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF93cml0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfdG9zdHJpbmcoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLQotICAgIHZvaWQgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotICAgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICAgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50ICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgICB2b2lkIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24gKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIGZ1bmN0aW9uKTsKLQotICAgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQgKHN0ZDo6b3N0cmVhbSYgb3V0LCBib29sIGlzX3hjZXB0aW9uLCB0X2ZpZWxkKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIHByZWZpeCwgc3RkOjpvc3RyZWFtJiBsb2NhbF92YXJzKTsKLSAgICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdCAoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBuYW1lLCBzdGQ6OnN0cmluZyBwcmVmaXgpOwotICAgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwgYm9vbCBpc194Y2VwdGlvbiwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIG5hbWUsIHN0ZDo6b3N0cmVhbSYgbG9jYWxfdmFycyk7Ci0KLSAgICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50IChzdGQ6Om9zdHJlYW0mIG91dCwgYm9vbCBpc194Y2VwdGlvbiwgdF9zZXQqIHRzZXQsIHN0ZDo6c3RyaW5nIHByZWZpeCwgc3RkOjpvc3RyZWFtJiBsb2NhbF92YXJzKTsKLSAgICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50IChzdGQ6Om9zdHJlYW0mIG91dCwgYm9vbCBpc194Y2VwdGlvbiwgdF9tYXAqIHRtYXAsIHN0ZDo6c3RyaW5nIHByZWZpeCwgc3RkOjpvc3RyZWFtJiBsb2NhbF92YXJzKTsKLSAgICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudCAoc3RkOjpvc3RyZWFtJiBvdXQsIGJvb2wgaXNfeGNlcHRpb24sIHRfbGlzdCogbGlzdCwgc3RkOjpzdHJpbmcgcHJlZml4LCBzdGQ6Om9zdHJlYW0mIGxvY2FsX3ZhcnMpOwotCi0gICAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQgKHN0ZDo6b3N0cmVhbSYgb3V0LCBib29sIGlzX3hjZXB0aW9uLCB0X2ZpZWxkKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIHByZWZpeCwgc3RkOjpvc3RyZWFtJiBsb2NhbF92YXJzKTsKLSAgICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3QgKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4LCBzdGQ6Om9zdHJlYW0mIGxvY2FsX3ZhcnMpOwotICAgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lciAoc3RkOjpvc3RyZWFtJiBvdXQsIGJvb2wgaXNfeGNlcHRpb24sIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCwgc3RkOjpvc3RyZWFtJiBsb2NhbF92YXJzKTsKLSAgICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudCAoc3RkOjpvc3RyZWFtJiBvdXQsIGJvb2wgaXNfeGNlcHRpb24sIHRfbWFwKiB0bWFwLCBzdGQ6OnN0cmluZyBpdGVyLCBzdGQ6OnN0cmluZyBtYXAsIHN0ZDo6b3N0cmVhbSYgbG9jYWxfdmFycyk7Ci0gICAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQgKHN0ZDo6b3N0cmVhbSYgb3V0LCBib29sIGlzX3hjZXB0aW9uLCB0X3NldCogdG1hcCwgc3RkOjpzdHJpbmcgaXRlciwgc3RkOjpvc3RyZWFtJiBsb2NhbF92YXJzKTsKLSAgICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQgKHN0ZDo6b3N0cmVhbSYgb3V0LCBib29sIGlzX3hjZXB0aW9uLCB0X2xpc3QqIHRsaXN0LCBzdGQ6OnN0cmluZyBpdGVyLCBzdGQ6Om9zdHJlYW0mIGxvY2FsX3ZhcnMpOwotCi0gICAgdm9pZCBkZWxwaGlfdHlwZV91c2luZ3Moc3RkOjpvc3RyZWFtJiBvdXQpOwotICAgIHN0ZDo6c3RyaW5nIGRlbHBoaV90aHJpZnRfdXNpbmdzKCk7Ci0KLSAgICBzdGQ6OnN0cmluZyB0eXBlX25hbWUoIHRfdHlwZSogdHR5cGUsIGJvb2wgYl9jbHM9ZmFsc2UsIGJvb2wgYl9ub19wb3N0Zml4PWZhbHNlLCBib29sIGJfZXhjZXB0aW9uX2ZhY3Rvcnk9ZmFsc2UsIGJvb2wgYl9mdWxsX2V4Y2VwdGlvbl9mYWN0b3J5ID0gZmFsc2UpOwotICAgIHN0ZDo6c3RyaW5nIG5vcm1hbGl6ZV9jbHNubShzdGQ6OnN0cmluZyBuYW1lLCBzdGQ6OnN0cmluZyBwcmVmaXgsIGJvb2wgYl9ub19jaGVja19rZXl3b3JkID0gZmFsc2UpOwotICAgIHN0ZDo6c3RyaW5nIG1ha2VfdmFsaWRfZGVscGhpX2lkZW50aWZpZXIoIHN0ZDo6c3RyaW5nIGNvbnN0ICYgZnJvbU5hbWUpOwotICAgIHN0ZDo6c3RyaW5nIGlucHV0X2FyZ19wcmVmaXgoIHRfdHlwZSogdHR5cGUpOwotICAKLSAgICBzdGQ6OnN0cmluZyBiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZSogdGJhc2UpOwotICAgIHN0ZDo6c3RyaW5nIGRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluaXQ9ZmFsc2UsIHN0ZDo6c3RyaW5nIHByZWZpeD0iIiwgYm9vbCBpc194Y2VwdGlvbl9jbGFzcyA9IGZhbHNlKTsKLSAgICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBmdWxsX2Nscz0iIiwgYm9vbCBpc194Y2VwdGlvbiA9IGZhbHNlKTsgIAotICAgIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICAgIHN0ZDo6c3RyaW5nIGNvbnN0cnVjdG9yX2FyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIGN1cnJlbnRfaW5kZW50KTsKLSAgICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7Ci0gICAgc3RkOjpzdHJpbmcgcHJvcF9uYW1lKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpc194Y2VwdGlvbiA9IGZhbHNlKTsKLSAgICBzdGQ6OnN0cmluZyBwcm9wX25hbWUoc3RkOjpzdHJpbmcgbmFtZSwgYm9vbCBpc194Y2VwdGlvbiA9IGZhbHNlKTsKLSAgICBzdGQ6OnN0cmluZyBjb25zdHJ1Y3Rvcl9wYXJhbV9uYW1lKHN0cmluZyBuYW1lKTsKLQotICAgIHZvaWQgd3JpdGVfZW51bShzdGQ6OnN0cmluZyBsaW5lKTsKLSAgICB2b2lkIHdyaXRlX2ZvcndhcmRfZGVjcihzdGQ6OnN0cmluZyBsaW5lKTsKLSAgICB2b2lkIHdyaXRlX2NvbnN0KHN0ZDo6c3RyaW5nIGxpbmUpOwotICAgIHZvaWQgd3JpdGVfc3RydWN0KHN0ZDo6c3RyaW5nIGxpbmUpOwotICAgIHZvaWQgd3JpdGVfc2VydmljZShzdGQ6OnN0cmluZyBsaW5lKTsKLQotICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgYXV0b2dlbl9jb21tZW50KCkgewotICAgICAgcmV0dXJuCi0gICAgICAgIHN0ZDo6c3RyaW5nKCIoKipcbiIpICsKLSAgICAgICAgIiAqIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgiICsgVEhSSUZUX1ZFUlNJT04gKyAiKVxuIiArCi0gICAgICAgICIgKlxuIiArCi0gICAgICAgICIgKiBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HXG4iICsKLSAgICAgICAgIiAqKVxuIjsKLSAgICB9Ci0KLSAgICBzdHJpbmcgcmVwbGFjZV9hbGwoIHN0cmluZyBjb250ZW50cywgc3RyaW5nIHNlYXJjaCwgc3RyaW5nIHJlcGxhY2UpOwotICAgIHN0cmluZyB4bWxfZW5jb2RlKCBzdHJpbmcgY29udGVudHMpOwotICAgIHN0cmluZyB4bWxkb2NfZW5jb2RlKCBzdHJpbmcgY29udGVudHMpOwotICAgIHN0cmluZyB4bWxhdHRyaWJfZW5jb2RlKCBzdHJpbmcgY29udGVudHMpOwotICAgIHZvaWQgZ2VuZXJhdGVfZGVscGhpX2RvYyAoc3RkOjpvc3RyZWFtJiBvdXQsIHRfZmllbGQqICAgIGZpZWxkKTsKLSAgICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9kb2MgKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2RvYyogICAgICB0ZG9jKTsKLSAgICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9kb2MgKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZG9jKTsKLSAgICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9kb2NzdHJpbmdfY29tbWVudCAoc3RkOjpvc3RyZWFtICZvdXQsIHN0cmluZyBjb250ZW50cyk7Ci0KLSAgICBib29sIHR5cGVfY2FuX2JlX251bGwodF90eXBlKiB0dHlwZSkgewotICAgICAgd2hpbGUgKHR0eXBlLT5pc190eXBlZGVmKCkpIHsKLSAgICAgICAgdHR5cGUgPSAoKHRfdHlwZWRlZiopdHR5cGUpLT5nZXRfdHlwZSgpOwotICAgICAgfQotCi0gICAgICByZXR1cm4gdHR5cGUtPmlzX2NvbnRhaW5lcigpIHx8Ci0gICAgICAgIHR0eXBlLT5pc19zdHJ1Y3QoKSB8fAotICAgICAgICB0dHlwZS0+aXNfeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgcHJpdmF0ZToKLSAgICBzdGQ6OnN0cmluZyBuYW1lc3BhY2VfbmFtZV87Ci0gICAgc3RkOjpvc3RyaW5nc3RyZWFtIHNfZm9yd2FyZF9kZWNyOwotICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzX2VudW07Ci0gICAgc3RkOjpvc3RyaW5nc3RyZWFtIHNfY29uc3Q7Ci0gICAgc3RkOjpvc3RyaW5nc3RyZWFtIHNfc3RydWN0OwotICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzX3NlcnZpY2U7Ci0gICAgc3RkOjpvc3RyaW5nc3RyZWFtIHNfY29uc3RfaW1wbDsKLSAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gc19zdHJ1Y3RfaW1wbDsKLSAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gc19zZXJ2aWNlX2ltcGw7Ci0gICAgc3RkOjpvc3RyaW5nc3RyZWFtIHNfdHlwZV9mYWN0b3J5X3JlZ2lzdHJhdGlvbjsKLSAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gc190eXBlX2ZhY3RvcnlfZnVuY3M7Ci0gICAgYm9vbCBoYXNfZm9yd2FyZDsKLSAgICBib29sIGhhc19lbnVtOwotICAgIGJvb2wgaGFzX2NvbnN0OwotICAgIHN0ZDo6c3RyaW5nIG5hbWVzcGFjZV9kaXJfOwotICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IGRlbHBoaV9rZXl3b3JkczsKLSAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kOwotICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uOwotICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IHR5cGVzX2tub3duOwotICAgIHN0ZDo6bGlzdDx0X3R5cGVkZWYqPiB0eXBlZGVmc19wZW5kaW5nOwotICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiB1c2VzX2xpc3Q7Ci0gICAgdm9pZCBjcmVhdGVfa2V5d29yZHMoKTsKLSAgICBib29sIGZpbmRfa2V5d29yZCggc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4mIGtleXdvcmRfbWFwLCBzdGQ6OnN0cmluZyBuYW1lKTsKLSAgICBzdGQ6OnN0cmluZyBub3JtYWxpemVfbmFtZSggc3RkOjpzdHJpbmcgbmFtZSwgYm9vbCBiX21ldGhvZCA9IGZhbHNlLCBib29sIGJfZXhjZXB0aW9uX21ldGhvZCA9IGZhbHNlKTsKLSAgICBzdGQ6OnN0cmluZyBlbXB0eV92YWx1ZSh0X3R5cGUqIHR5cGUpOwotICAgIGJvb2wgaXNfZnVsbHlfZGVmaW5lZF90eXBlKCB0X3R5cGUqIHR0eXBlKTsKLSAgICB2b2lkIGFkZF9kZWZpbmVkX3R5cGUoIHRfdHlwZSogdHR5cGUpOwotICAgIHZvaWQgaW5pdF9rbm93bl90eXBlc19saXN0KCk7Ci0gICAgYm9vbCBpc192b2lkKCB0X3R5cGUqIHR5cGUgKTsKLSAgICBpbnQgaW5kZW50X2ltcGxfOwotICAgIGJvb2wgYW5zaXN0cl9iaW5hcnlfOwotICAgIGJvb2wgcmVnaXN0ZXJfdHlwZXNfOwotICAgIGJvb2wgY29uc3RwcmVmaXhfOwotICAgIGJvb2wgZXZlbnRzXzsKLSAgICBib29sIHhtbGRvY187Ci0gICAgdm9pZCBpbmRlbnRfdXBfaW1wbCgpewotICAgICAgKytpbmRlbnRfaW1wbF87Ci0gICAgfTsKLSAgICB2b2lkIGluZGVudF9kb3duX2ltcGwoKSB7Ci0gICAgICAtLWluZGVudF9pbXBsXzsKLSAgICB9OwotICAgIHN0ZDo6c3RyaW5nIGluZGVudF9pbXBsKCkgewotICAgICAgc3RkOjpzdHJpbmcgaW5kID0gIiI7Ci0gICAgICBpbnQgaTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBpbmRlbnRfaW1wbF87ICsraSkgewotICAgICAgICBpbmQgKz0gIiAgIjsKLSAgICAgIH0KLSAgICAgIHJldHVybiBpbmQ7Ci0gICAgfTsKLSAgICBzdGQ6Om9zdHJlYW0mIGluZGVudF9pbXBsKHN0ZDo6b3N0cmVhbSAmb3MpIHsKLSAgICAgIHJldHVybiBvcyA8PCBpbmRlbnRfaW1wbCgpOwotICAgIH07Ci19OwotCi1zdHJpbmcgdF9kZWxwaGlfZ2VuZXJhdG9yOjpyZXBsYWNlX2FsbCggc3RyaW5nIGNvbnRlbnRzLCBzdHJpbmcgc2VhcmNoLCBzdHJpbmcgcmVwbCkgewotICBzdHJpbmcgc3RyKCBjb250ZW50cyk7Ci0gIAotICBzaXplX3Qgc2xlbiA9IHNlYXJjaC5sZW5ndGgoKTsKLSAgc2l6ZV90IHJsZW4gPSByZXBsLmxlbmd0aCgpOwotICBzaXplX3QgaW5jciA9IChybGVuID4gMCkgPyBybGVuIDogMTsKLQotICBpZiggc2xlbiA+IDApIHsKLSAgICBzaXplX3QgZm91bmQgPSBzdHIuZmluZChzZWFyY2gpOwotICAgIHdoaWxlKCAoZm91bmQgIT0gc3RyaW5nOjpucG9zKSAmJiAoZm91bmQgPCBzdHIubGVuZ3RoKCkpKSB7Ci0gICAgICBzdHIucmVwbGFjZSggZm91bmQsIHNsZW4sIHJlcGwpOwotICAgICAgZm91bmQgPSBzdHIuZmluZChzZWFyY2gsIGZvdW5kK2luY3IpOwotICAgIH0KLSAgfQotICAKLSAgcmV0dXJuIHN0cjsKLX0KLQotLy8gWE1MIGVuY29kaW5nIAotc3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6eG1sX2VuY29kZSggc3RyaW5nIGNvbnRlbnRzKSB7Ci0gIHN0cmluZyBzdHIoIGNvbnRlbnRzKTsKLSAgCi0gIC8vIGVzY2FwZSB0aGUgZXNjYXBlCi0gIHN0ciA9IHJlcGxhY2VfYWxsKCBzdHIsICImIiwgIiZhbXA7Iik7Ci0gIAotICAvLyBvdGhlciBzdGFuZGFyZCBYTUwgZW50aXRpZXMKLSAgc3RyID0gcmVwbGFjZV9hbGwoIHN0ciwgIjwiLCAiJmx0OyIpOwotICBzdHIgPSByZXBsYWNlX2FsbCggc3RyLCAiPiIsICImZ3Q7Iik7Ci0gIAotICByZXR1cm4gc3RyOwotfQotCi0vLyBYTUwgYXR0cmlidXRlIGVuY29kaW5nIAotc3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6eG1sYXR0cmliX2VuY29kZSggc3RyaW5nIGNvbnRlbnRzKSB7Ci0gIHN0cmluZyBzdHIoIHhtbF9lbmNvZGUoIGNvbnRlbnRzKSk7Ci0gIAotICAvLyBvdXIgYXR0cmlicyBhcmUgZW5jbG9zZWQgaW4gIgotICBzdHIgPSByZXBsYWNlX2FsbCggc3RyLCAiXCIiLCAiXFxcIiIpOwotICAKLSAgcmV0dXJuIHN0cjsKLX0KLQotLy8gWE1MIGVuY29kaW5nIGZvciBkb2MgY29tbWVudHMKLXN0cmluZyB0X2RlbHBoaV9nZW5lcmF0b3I6OnhtbGRvY19lbmNvZGUoIHN0cmluZyBjb250ZW50cykgewotICBzdHJpbmcgc3RyKCB4bWxfZW5jb2RlKCBjb250ZW50cykpOwotICAKLSAgLy8gWE1MRG9jIHNwZWNpZmljOiBjb252ZXJ0IGxpbmVicmVha3MgaW50byA8cGFyYT5ncmFwaHM8L3BhcmE+Ci0gIHN0ciA9IHJlcGxhY2VfYWxsKCBzdHIsICJcclxuIiwgIlxyIik7Ci0gIHN0ciA9IHJlcGxhY2VfYWxsKCBzdHIsICJcbiIsICAgIlxyIik7Ci0gIHN0ciA9IHJlcGxhY2VfYWxsKCBzdHIsICJcciIsICAgIjwvcGFyYT5cbjxwYXJhPiIpOwotICAKLSAgcmV0dXJuIHN0cjsKLX0KLQotdm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlbHBoaV9kb2NzdHJpbmdfY29tbWVudChvc3RyZWFtICZvdXQsIHN0cmluZyBjb250ZW50cykgewotICBpZiggeG1sZG9jXykgewotICAgIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAieyRSRUdJT04gJ1hNTERvYyd9Ly8vIDxzdW1tYXJ5PlxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLy8vICIsICI8cGFyYT4iICsgY29udGVudHMgKyAiPC9wYXJhPiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8vLyA8L3N1bW1hcnk+XG57JEVORFJFR0lPTn1cbiIpOwotICB9Ci19Ci0KLXZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWxwaGlfZG9jKG9zdHJlYW0gJm91dCwgdF9maWVsZCogZmllbGQpIHsKLSAgaWYoIHhtbGRvY18pIHsKLSAgICBpZiAoZmllbGQtPmdldF90eXBlKCktPmlzX2VudW0oKSkgewotICAgICAgc3RyaW5nIGNvbWJpbmVkX21lc3NhZ2UgPSB4bWxkb2NfZW5jb2RlKCBmaWVsZC0+Z2V0X2RvYygpKSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlxuPHNlZWFsc28gY3JlZj1cIiIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHhtbGRvY19lbmNvZGUoIHR5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJcIi8+IjsKLSAgICAgIGdlbmVyYXRlX2RlbHBoaV9kb2NzdHJpbmdfY29tbWVudChvdXQsIGNvbWJpbmVkX21lc3NhZ2UpOwotICAgIH0gZWxzZSB7Ci0gICAgICBnZW5lcmF0ZV9kZWxwaGlfZG9jKG91dCwgKHRfZG9jKilmaWVsZCk7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWxwaGlfZG9jKG9zdHJlYW0gJm91dCwgdF9kb2MqIHRkb2MpIHsKLSAgaWYgKHRkb2MtPmhhc19kb2MoKSAmJiB4bWxkb2NfKSB7Ci0gICAgZ2VuZXJhdGVfZGVscGhpX2RvY3N0cmluZ19jb21tZW50KG91dCwgeG1sZG9jX2VuY29kZSggdGRvYy0+Z2V0X2RvYygpKSk7Ci0gIH0KLX0KLQotdm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlbHBoaV9kb2Mob3N0cmVhbSAmb3V0LCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgaWYgKHRmdW5jdGlvbi0+aGFzX2RvYygpICYmIHhtbGRvY18pIHsKLSAgICBzdHJpbmdzdHJlYW0gcHM7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHBfaXRlcjsKLSAgICBmb3IgKHBfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBwX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK3BfaXRlcikgewotICAgICAgdF9maWVsZCogcCA9ICpwX2l0ZXI7Ci0gICAgICBwcyA8PCAiXG48cGFyYW0gbmFtZT1cIiIgPDwgeG1sYXR0cmliX2VuY29kZSggcC0+Z2V0X25hbWUoKSkgPDwgIlwiPiI7Ci0gICAgICBpZiAocC0+aGFzX2RvYygpKSB7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIHN0ciA9IHAtPmdldF9kb2MoKTsKLSAgICAgICAgc3RyLmVyYXNlKHN0ZDo6cmVtb3ZlKHN0ci5iZWdpbigpLCBzdHIuZW5kKCksICdcbicpLCBzdHIuZW5kKCkpOyAvLyByZW1vdmUgdGhlIG5ld2xpbmVzIHRoYXQgYXBwZWFyIGZyb20gdGhlIHBhcnNlcgotICAgICAgICBwcyA8PCB4bWxkb2NfZW5jb2RlKHN0cik7Ci0gICAgICB9Ci0gICAgICBwcyA8PCAiPC9wYXJhbT4iOwotICAgIH0KLSAgICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInskUkVHSU9OICdYTUxEb2MnfSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8vLyAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8c3VtbWFyeT48cGFyYT4iICsgeG1sZG9jX2VuY29kZSh0ZnVuY3Rpb24tPmdldF9kb2MoKSkgKyAiPC9wYXJhPjwvc3VtbWFyeT4iICsgcHMuc3RyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInskRU5EUkVHSU9OfVxuIik7Ci0gIH0KLX0KLQotYm9vbCB0X2RlbHBoaV9nZW5lcmF0b3I6OmZpbmRfa2V5d29yZCggc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4mIGtleXdvcmRfbWFwLCBzdGQ6OnN0cmluZyBuYW1lKSB7Ci0gIGludCBsZW4gPSBuYW1lLmxlbmd0aCgpOwotCi0gIGlmICggbGVuIDw9IDAgKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaW50IG5sYXN0ID0gbmFtZS5maW5kX2xhc3Rfb2YoJ18nKTsKLQotICBpZiAoIG5sYXN0ID49IDEpIHsKLSAgICBpZiAobmxhc3QgPT0gKGxlbiAtIDEpKSB7Ci0gICAgICBzdHJpbmcgbmV3X25hbWUoIG5hbWUsIDAsIG5sYXN0KTsKLSAgICAgIHJldHVybiBmaW5kX2tleXdvcmQoIGtleXdvcmRfbWFwLCBuZXdfbmFtZSk7Ci0gICAgfQotICB9Ci0gIHJldHVybiAoa2V5d29yZF9tYXBbbmFtZV0gPT0gMSk7Ci19Ci0KLXN0ZDo6c3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6bm9ybWFsaXplX25hbWUoIHN0ZDo6c3RyaW5nIG5hbWUsIGJvb2wgYl9tZXRob2QsIGJvb2wgYl9leGNlcHRpb25fbWV0aG9kKSB7Ci0gIHN0cmluZyB0bXAoIG5hbWUgKTsKLSAgc3RkOjp0cmFuc2Zvcm0odG1wLmJlZ2luKCksIHRtcC5lbmQoKSwgdG1wLmJlZ2luKCksIHN0YXRpY19jYXN0PGludCAoKikoaW50KT4oc3RkOjp0b2xvd2VyKSk7Ci0KLSAgYm9vbCBiX2ZvdW5kID0gZmFsc2U7Ci0KLSAgaWYgKCBmaW5kX2tleXdvcmQoIGRlbHBoaV9rZXl3b3JkcywgdG1wKSApIHsKLSAgICBiX2ZvdW5kID0gdHJ1ZTsKLSAgfSBlbHNlIGlmICggYl9tZXRob2QgJiYgZmluZF9rZXl3b3JkKCBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kLCB0bXApKSB7Ci0gICAgYl9mb3VuZCA9IHRydWU7Ci0gIH0gZWxzZSBpZiAoIGJfZXhjZXB0aW9uX21ldGhvZCAmJiBmaW5kX2tleXdvcmQoIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uLCB0bXApKSB7Ci0gICAgYl9mb3VuZCA9IHRydWU7Ci0gIH0KLQotICBpZiAoYl9mb3VuZCkgewotICAgIHJldHVybiBuYW1lICsgIl8iOwotICB9IGVsc2UgewotICAgIHJldHVybiBuYW1lOwotICB9Ci19Ci0KLXZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpjcmVhdGVfa2V5d29yZHMoKSB7Ci0gIGRlbHBoaV9rZXl3b3Jkc1siYW5kIl0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbImVuZCJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJpbnRlcmZhY2UiXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1sicmFpc2UiXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1sidXNlcyJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJhcnJheSJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJleGNlcHQiXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1siaXMiXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1sicmVjb3JkIl0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbInZhciJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJhcyJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJleHBvcnRzIl0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbImxhYmVsIl0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbInJlcGVhdCJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJ3aGlsZSJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJhc20iXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1siZmlsZSJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJsaWJyYXJ5Il0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbInJlc291cmNlc3RyaW5nIl0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbIndpdGgiXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1siYmVnaW4iXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1siZmluYWxpemF0aW9uIl0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbIm1vZCJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJzZXQiXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1sieG9yIl0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbImNhc2UiXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1siZmluYWxseSJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJuaWwiXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1sic2hsIl0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbImNsYXNzIl0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbImZvciJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJub3QiXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1sic2hyIl0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbImNvbnN0Il0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbImZ1bmN0aW9uIl0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbIm9iamVjdCJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJzdHJpbmciXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1siY29uc3RydWN0b3IiXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1siZ290byJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJvZiJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJ0aGVuIl0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbImRlc3RydWN0b3IiXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1siaWYiXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1sib3IiXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1sidGhyZWFkdmFyIl0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbImRpc3BpbnRlcmZhY2UiXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1siaW1wbGVtZW50YXRpb24iXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1sib3V0Il0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbInRvIl0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbImRpdiJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJpbiJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJwYWNrZWQiXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1sidHJ5Il0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbImRvIl0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbImluaGVyaXRlZCJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJwcm9jZWR1cmUiXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1sidHlwZSJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJkb3dudG8iXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1siaW5pdGlhbGl6YXRpb24iXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1sicHJvZ3JhbSJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJ1bml0Il0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbImVsc2UiXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1siaW5saW5lIl0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbInByb3BlcnR5Il0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbInVudGlsIl0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbInByaXZhdGUiXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1sicHJvdGVjdGVkIl0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbInB1YmxpYyJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJwdWJsaXNoZWQiXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1siYXV0b21hdGVkIl0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbImF0Il0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbIm9uIl0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbInJlc3VsdCJdID0gMTsKLQotICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJjcmVhdGUiXSA9IDE7Ci0gIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImZyZWUiXSA9IDE7Ci0gIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImluaXRpbnN0YW5jZSJdID0gMTsKLSAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiY2xlYW51cGluc3RhbmNlIl0gPSAxOwotICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJjbGFzc3R5cGUiXSA9IDE7Ci0gIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImNsYXNzbmFtZSJdID0gMTsKLSAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiY2xhc3NuYW1laXMiXSA9IDE7Ci0gIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImNsYXNzcGFyZW50Il0gPSAxOwotICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJjbGFzc2luZm8iXSA9IDE7Ci0gIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImluc3RhbmNlc2l6ZSJdID0gMTsKLSAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiaW5oZXJpdHNmcm9tIl0gPSAxOwotICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJtZXRob2RhZGRyZXNzIl0gPSAxOwotICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJtZXRob2RhZGRyZXNzIl0gPSAxOwotICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJtZXRob2RuYW1lIl0gPSAxOwotICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJmaWVsZGFkZHJlc3MiXSA9IDE7Ci0gIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImZpZWxkYWRkcmVzcyJdID0gMTsKLSAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiZ2V0aW50ZXJmYWNlIl0gPSAxOwotICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJnZXRpbnRlcmZhY2VlbnRyeSJdID0gMTsKLSAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiZ2V0aW50ZXJmYWNldGFibGUiXSA9IDE7Ci0gIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbInVuaXRuYW1lIl0gPSAxOwotICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJlcXVhbHMiXSA9IDE7Ci0gIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImdldGhhc2hjb2RlIl0gPSAxOwotICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJ0b3N0cmluZyJdID0gMTsKLSAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsic2FmZWNhbGxleGNlcHRpb24iXSA9IDE7Ci0gIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImFmdGVyY29uc3RydWN0aW9uIl0gPSAxOwotICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJiZWZvcmVkZXN0cnVjdGlvbiJdID0gMTsKLSAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiZGlzcGF0Y2giXSA9IDE7Ci0gIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImRlZmF1bHRoYW5kbGVyIl0gPSAxOwotICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJuZXdpbnN0YW5jZSJdID0gMTsKLSAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiZnJlZWluc3RhbmNlIl0gPSAxOwotICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJkZXN0cm95Il0gPSAxOwotICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJyZWFkIl0gPSAxOwotICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJ3cml0ZSJdID0gMTsKLQotICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvblsic2V0aW5uZXJleGNlcHRpb24iXSA9IDE7Ci0gIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJzZXRzdGFja2luZm8iXSA9IDE7Ci0gIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJnZXRzdGFja3RyYWNlIl0gPSAxOwotICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvblsicmFpc2luZ2V4Y2VwdGlvbiJdID0gMTsKLSAgZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb25bImNyZWF0ZWZtdCJdID0gMTsKLSAgZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb25bImNyZWF0ZXJlcyJdID0gMTsKLSAgZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb25bImNyZWF0ZXJlc2ZtdCJdID0gMTsKLSAgZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb25bImNyZWF0ZWhlbHAiXSA9IDE7Ci0gIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJjcmVhdGVmbXRoZWxwIl0gPSAxOwotICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvblsiY3JlYXRlcmVzaGVscCJdID0gMTsKLSAgZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb25bImNyZWF0ZXJlc2ZtdGhlbHAiXSA9IDE7Ci0gIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJnZXRiYXNlZXhjZXB0aW9uIl0gPSAxOwotICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvblsiYmFzZWV4Y2VwdGlvbiJdID0gMTsKLSAgZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb25bImhlbHBjb250ZXh0Il0gPSAxOwotICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvblsiaW5uZXJleGNlcHRpb24iXSA9IDE7Ci0gIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJtZXNzYWdlIl0gPSAxOwotICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvblsic3RhY2t0cmFjZSJdID0gMTsKLSAgZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb25bInN0YWNraW5mbyJdID0gMTsKLSAgZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb25bImdldGV4Y2VwdGlvbnN0YWNraW5mb3Byb2MiXSA9IDE7Ci0gIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJnZXRzdGFja2luZm9zdHJpbmdwcm9jIl0gPSAxOwotICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvblsiY2xlYW51cHN0YWNraW5mb3Byb2MiXSA9IDE7Ci0gIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJyYWlzZW91dGVyZXhjZXB0aW9uIl0gPSAxOwotICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvblsidGhyb3dvdXRlcmV4Y2VwdGlvbiJdID0gMTsKLX0KLQotdm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmFkZF9kZWxwaGlfdXNlc19saXN0KCBzdHJpbmcgdW5pdG5hbWUpewotICB2ZWN0b3I8c3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBzX2l0ZXI7Ci0gIGJvb2wgZm91bmQgPSBmYWxzZTsKLSAgZm9yIChzX2l0ZXIgPSB1c2VzX2xpc3QuYmVnaW4oKTsgc19pdGVyICE9IHVzZXNfbGlzdC5lbmQoKTsgKytzX2l0ZXIpIHsKLSAgICBpZiAoKCpzX2l0ZXIpID09IHVuaXRuYW1lICkgewotICAgICAgZm91bmQgPSB0cnVlOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIGlmICghIGZvdW5kKSB7Ci0gICAgdXNlc19saXN0LnB1c2hfYmFjayggdW5pdG5hbWUgKTsKLSAgfQotfQotCi12b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7Ci0gIGluZGVudF9pbXBsXyA9IDA7Ci0gIG5hbWVzcGFjZV9uYW1lXyA9IHByb2dyYW1fLT5nZXRfbmFtZXNwYWNlKCJkZWxwaGkiKTsKLSAgaGFzX2ZvcndhcmQgPSBmYWxzZTsKLSAgaGFzX2VudW0gPSBmYWxzZTsKLSAgaGFzX2NvbnN0ID0gZmFsc2U7Ci0gIGNyZWF0ZV9rZXl3b3JkcygpOwotICBhZGRfZGVscGhpX3VzZXNfbGlzdCgiQ2xhc3NlcyIpOwotICBhZGRfZGVscGhpX3VzZXNfbGlzdCgiU3lzVXRpbHMiKTsKLSAgYWRkX2RlbHBoaV91c2VzX2xpc3QoIkdlbmVyaWNzLkNvbGxlY3Rpb25zIik7Ci0gIGFkZF9kZWxwaGlfdXNlc19saXN0KCJUaHJpZnQiKTsKLSAgYWRkX2RlbHBoaV91c2VzX2xpc3QoIlRocmlmdC5VdGlscyIpOwotICBhZGRfZGVscGhpX3VzZXNfbGlzdCgiVGhyaWZ0LkNvbGxlY3Rpb25zIik7Ci0gIGFkZF9kZWxwaGlfdXNlc19saXN0KCJUaHJpZnQuUHJvdG9jb2wiKTsKLSAgYWRkX2RlbHBoaV91c2VzX2xpc3QoIlRocmlmdC5UcmFuc3BvcnQiKTsKLQotICBpZiAocmVnaXN0ZXJfdHlwZXNfKQotICB7Ci0gICAgYWRkX2RlbHBoaV91c2VzX2xpc3QoIlRocmlmdC5UeXBlUmVnaXN0cnkiKTsKLSAgfQotCi0gIGluaXRfa25vd25fdHlwZXNfbGlzdCgpOwotICAKLSAgc3RyaW5nIHVuaXRuYW1lLCBuc25hbWU7Ci0gIGNvbnN0IHZlY3Rvcjx0X3Byb2dyYW0qPiYgaW5jbHVkZXMgPSBwcm9ncmFtXy0+Z2V0X2luY2x1ZGVzKCk7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5jbHVkZXMuc2l6ZSgpOyArK2kpIHsKLSAgICB1bml0bmFtZSA9IGluY2x1ZGVzW2ldLT5nZXRfbmFtZSgpOwotICAgIG5zbmFtZSA9IGluY2x1ZGVzW2ldLT5nZXRfbmFtZXNwYWNlKCJkZWxwaGkiKTsKLSAgICBpZiAoICIiICE9IG5zbmFtZSkgewotICAgICAgdW5pdG5hbWUgPSBuc25hbWU7Ci0gICAgfQotICAgIGFkZF9kZWxwaGlfdXNlc19saXN0KHVuaXRuYW1lKTsKLSAgfQotCi0KLSAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKLX0KLQotdm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsgCi0gIHN0ZDo6c3RyaW5nIHVuaXRuYW1lID0gcHJvZ3JhbV9uYW1lXzsKLSAgaWYoICIiICE9IG5hbWVzcGFjZV9uYW1lXykgewotICAgIHVuaXRuYW1lID0gbmFtZXNwYWNlX25hbWVfOwotICB9Ci0KLSAgZm9yICggaW50IGkgPSAwOyBpIDwgKGludCl1bml0bmFtZS5zaXplKCk7IGkrKykgewotICAgIGlmICggdW5pdG5hbWVbaV0gPT0gJyAnICkgewotICAgICAgdW5pdG5hbWUucmVwbGFjZSggaSwgMSwgIl8iICk7Ci0gICAgfQotICB9Ci0KLSAgc3RkOjpzdHJpbmcgZl9uYW1lID0gZ2V0X291dF9kaXIoKSArICIvIiArIHVuaXRuYW1lICsgIi5wYXMiOwotICBzdGQ6Om9mc3RyZWFtIGZfYWxsOwotCi0gIGZfYWxsLm9wZW4oIGZfbmFtZS5jX3N0cigpICk7Ci0KLSAgZl9hbGwgPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbDsKLSAgZ2VuZXJhdGVfZGVscGhpX2RvYyhmX2FsbCwgcHJvZ3JhbV8pOwotICBmX2FsbCA8PCAidW5pdCAiIDw8IHVuaXRuYW1lIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIGZfYWxsIDw8ICJpbnRlcmZhY2UiIDw8IGVuZGwgPDwgZW5kbDsKLSAgZl9hbGwgIDw8ICJ1c2VzIiAgPDwgZW5kbDsKLQotICBpbmRlbnRfdXAoKTsKLQotICB2ZWN0b3I8c3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBzX2l0ZXI7Ci0gIGZvciAoc19pdGVyID0gdXNlc19saXN0LmJlZ2luKCk7IHNfaXRlciAhPSB1c2VzX2xpc3QuZW5kKCk7ICsrc19pdGVyKSB7Ci0gICAgaWYgKHNfaXRlciAhPSB1c2VzX2xpc3QuYmVnaW4oKSkgewotICAgICAgZl9hbGwgPDwgIiwiOwotICAgICAgZl9hbGwgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50KGZfYWxsKSA8PCAqc19pdGVyOwotICB9Ci0KLSAgZl9hbGwgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotCi0gIHN0cmluZyB0bXBfdW5pdCggdW5pdG5hbWUgKTsKLSAgZm9yICggaW50IGkgPSAwOyBpIDwgKGludCl0bXBfdW5pdC5zaXplKCk7IGkrKykgewotICAgIGlmICggdG1wX3VuaXRbaV0gPT0gJy4nICkgewotICAgICAgdG1wX3VuaXQucmVwbGFjZSggaSwgMSwgIl8iICk7Ci0gICAgfQotICB9Ci0KLSAgZl9hbGwgIDw8ICJjb25zdCIgIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQoZl9hbGwpICA8PCAiYyIgPDwgdG1wX3VuaXQgPDwgIl9PcHRpb25fQW5zaVN0cl9CaW5hcnkgPSAiIDw8ICggYW5zaXN0cl9iaW5hcnlfID8gIlRydWUiIDogIkZhbHNlIikgPDwgIjsiIDw8IGVuZGw7Ci0gIGluZGVudChmX2FsbCkgIDw8ICJjIiA8PCB0bXBfdW5pdCA8PCAiX09wdGlvbl9SZWdpc3Rlcl9UeXBlcyA9ICIgPDwgKCByZWdpc3Rlcl90eXBlc18gPyAiVHJ1ZSIgOiAiRmFsc2UiKSA8PCAiOyIgPDwgZW5kbDsKLSAgaW5kZW50KGZfYWxsKSAgPDwgImMiIDw8IHRtcF91bml0IDw8ICJfT3B0aW9uX0NvbnN0UHJlZml4ICAgID0gIiA8PCAoIGNvbnN0cHJlZml4XyAgICA/ICJUcnVlIiA6ICJGYWxzZSIpIDw8ICI7IiA8PCBlbmRsOwotICBpbmRlbnQoZl9hbGwpICA8PCAiYyIgPDwgdG1wX3VuaXQgPDwgIl9PcHRpb25fRXZlbnRzICAgICAgICAgPSAiIDw8ICggZXZlbnRzXyAgICAgICAgID8gIlRydWUiIDogIkZhbHNlIikgPDwgIjsiIDw8IGVuZGw7Ci0gIGluZGVudChmX2FsbCkgIDw8ICJjIiA8PCB0bXBfdW5pdCA8PCAiX09wdGlvbl9YbWxEb2MgICAgICAgICA9ICIgPDwgKCB4bWxkb2NfICAgICAgICAgPyAiVHJ1ZSIgOiAiRmFsc2UiKSA8PCAiOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLQotICBmX2FsbCAgPDwgZW5kbDsKLSAgZl9hbGwgIDw8ICJ0eXBlIiAgPDwgZW5kbDsKLSAgaWYoaGFzX2ZvcndhcmQpIHsKLSAgICBmX2FsbCAgPDwgc19mb3J3YXJkX2RlY3Iuc3RyKCkgPDwgZW5kbDsKLSAgfQotICBpZiAoaGFzX2VudW0pIHsKLSAgICBpbmRlbnQoZl9hbGwpIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfYWxsKSA8PCAieyRTQ09QRURFTlVNUyBPTn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgICBmX2FsbCAgPDwgc19lbnVtLnN0cigpOwotICAgIGluZGVudChmX2FsbCkgPDwgInskU0NPUEVERU5VTVMgT0ZGfSIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci0gIGZfYWxsICA8PCBzX3N0cnVjdC5zdHIoKTsKLSAgZl9hbGwgIDw8IHNfc2VydmljZS5zdHIoKTsKLSAgZl9hbGwgIDw8IHNfY29uc3Quc3RyKCk7Ci0gIGZfYWxsICA8PCAiaW1wbGVtZW50YXRpb24iICA8PCBlbmRsIDw8IGVuZGw7Ci0gIGZfYWxsICA8PCBzX3N0cnVjdF9pbXBsLnN0cigpOwotICBmX2FsbCAgPDwgc19zZXJ2aWNlX2ltcGwuc3RyKCk7Ci0gIGZfYWxsICA8PCBzX2NvbnN0X2ltcGwuc3RyKCk7Ci0gIAotICAKLSAgaWYgKHJlZ2lzdGVyX3R5cGVzXykKLSAgewotICAgIGZfYWxsICA8PCBlbmRsOwotICAgIGZfYWxsICA8PCAiLy8gVHlwZSBmYWN0b3J5IG1ldGhvZHMgYW5kIHJlZ2lzdHJhdGlvbiIgPDwgZW5kbDsKLSAgICBmX2FsbCAgPDwgc190eXBlX2ZhY3RvcnlfZnVuY3Muc3RyKCk7Ci0gICAgZl9hbGwgPDwgInByb2NlZHVyZSBSZWdpc3RlclR5cGVGYWN0b3JpZXM7IiA8PCBlbmRsOwotICAgIGZfYWxsIDw8ICJiZWdpbiIgPDwgZW5kbDsKLSAgICBmX2FsbCA8PCBzX3R5cGVfZmFjdG9yeV9yZWdpc3RyYXRpb24uc3RyKCk7ICAgICAgCi0gICAgZl9hbGwgPDwgImVuZDsiIDw8IGVuZGw7Ci0gIH0KLSAgZl9hbGwgIDw8IGVuZGw7Ci0KLSAgc3RyaW5nIGNvbnN0YW50c19jbGFzcyA9IG1ha2VfY29uc3RhbnRzX2NsYXNzbmFtZSgpOwotCi0gIGZfYWxsICA8PCAiaW5pdGlhbGl6YXRpb24iIDw8IGVuZGw7Ci0gIGlmICggaGFzX2NvbnN0ICkgeyAgICAKLSAgICBmX2FsbCAgPDwgInskSUYgQ29tcGlsZXJWZXJzaW9uIDwgMjEuMH0gIC8vIEQyMDEwIiA8PCBlbmRsOwotICAgIGZfYWxsICA8PCAiICAiIDw8IGNvbnN0YW50c19jbGFzcy5jX3N0cigpIDw8ICJfSW5pdGlhbGl6ZTsiIDw8IGVuZGw7Ci0gICAgZl9hbGwgIDw8ICJ7JElGRU5EfSIgPDwgZW5kbDsKLSAgfQotICBpZiAocmVnaXN0ZXJfdHlwZXNfKSB7Ci0gICAgZl9hbGwgPDwgIiAgUmVnaXN0ZXJUeXBlRmFjdG9yaWVzOyIgPDwgZW5kbDsKLSAgfQotICBmX2FsbCAgPDwgZW5kbDsKLQotICBmX2FsbCAgPDwgImZpbmFsaXphdGlvbiIgPDwgZW5kbDsKLSAgaWYgKCBoYXNfY29uc3QgKSB7ICAgIAotICAgIGZfYWxsICA8PCAieyRJRiBDb21waWxlclZlcnNpb24gPCAyMS4wfSAgLy8gRDIwMTAiIDw8IGVuZGw7Ci0gICAgZl9hbGwgIDw8ICIgICIgPDwgY29uc3RhbnRzX2NsYXNzLmNfc3RyKCkgPDwgIl9GaW5hbGl6ZTsiIDw8IGVuZGw7Ci0gICAgZl9hbGwgIDw8ICJ7JElGRU5EfSIgPDwgZW5kbDsKLSAgfQotICBmX2FsbCAgPDwgZW5kbCA8PCBlbmRsOwotICAKLSAgZl9hbGwgIDw8ICJlbmQuIiA8PCBlbmRsOwotICBmX2FsbC5jbG9zZSgpOwotICAKLSAgaWYoICEgdHlwZWRlZnNfcGVuZGluZy5lbXB0eSgpKSB7Ci0gICAgcHdhcm5pbmcoMCwgIiVkIHR5cGVkZWZzIHdpdGggdW5yZXNvbHZlZCB0eXBlIHJlZmVyZW5jZXMgbGVmdDpcbiIsIHR5cGVkZWZzX3BlbmRpbmcuc2l6ZSgpKTsKLSAgICBmb3IoIHN0ZDo6bGlzdDx0X3R5cGVkZWYqPjo6aXRlcmF0b3IgaXRlciA9IHR5cGVkZWZzX3BlbmRpbmcuYmVnaW4oKTsgIHR5cGVkZWZzX3BlbmRpbmcuZW5kKCkgIT0gaXRlcjsgICsraXRlcikgewotICAgICAgcHdhcm5pbmcoMCwgIi0gJXNcbiIsICgqaXRlciktPmdldF9zeW1ib2xpYygpLmNfc3RyKCkpOwotICAgIH0KLSAgfQotfQotCi12b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6ZGVscGhpX3R5cGVfdXNpbmdzKCBvc3RyZWFtJiBvdXQpIHsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJDbGFzc2VzLCBTeXNVdGlscywgR2VuZXJpY3MuQ29sbGVjdGlvbnMsIFRocmlmdC5Db2xsZWN0aW9ucywgVGhyaWZ0LlByb3RvY29sLCIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIlRocmlmdC5UcmFuc3BvcnQ7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci19Ci0KLXZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9mb3J3YXJkX2RlY2xhcmF0aW9uKHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIC8vIEZvcndhcmQgZGVjbGFyZSBzdHJ1Y3QgZGVmCi0gIGhhc19mb3J3YXJkID0gdHJ1ZTsKLSAgcHZlcmJvc2UoImZvcndhcmQgZGVjbGFyYXRpb24gb2YgJXNcbiIsIHR5cGVfbmFtZSh0c3RydWN0KS5jX3N0cigpKTsKLSAgCi0gIHN0cmluZyB3aGF0ID0gdHN0cnVjdC0+aXNfeGNlcHRpb24oKSA/ICJjbGFzcyIgOiAiaW50ZXJmYWNlIjsKLQotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KHNfZm9yd2FyZF9kZWNyKSA8PCAKLSAgICB0eXBlX25hbWUodHN0cnVjdCx0c3RydWN0LT5pc194Y2VwdGlvbigpLHRydWUpIDw8ICIgPSAiIDw8IHdoYXQgPDwgIjsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIAotICBhZGRfZGVmaW5lZF90eXBlKHRzdHJ1Y3QpOwotfQotCi12b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7Ci0gIHRfdHlwZSogdHlwZSA9IHR0eXBlZGVmLT5nZXRfdHlwZSgpOwotCi0gIC8vIHdyaXRlIG5vdyBvciBzYXZlIGZvciBsYXRlcj8gIAotICBpZiggISBpc19mdWxseV9kZWZpbmVkX3R5cGUoIHR5cGUpKSB7Ci0gICAgcHZlcmJvc2UoInR5cGVkZWYgJXM6IHVucmVzb2x2ZWQgZGVwZW5kZW5jaWVzIGZvdW5kXG4iLCB0eXBlX25hbWUodHR5cGVkZWYpLmNfc3RyKCkpOwotICAgIHR5cGVkZWZzX3BlbmRpbmcucHVzaF9iYWNrKCB0dHlwZWRlZik7IAotICAgIHJldHVybjsKLSAgfQotCi0gIGluZGVudF91cCgpOwotICBnZW5lcmF0ZV9kZWxwaGlfZG9jKHNfc3RydWN0LCB0dHlwZWRlZik7Ci0gIGluZGVudChzX3N0cnVjdCkgPDwgCi0gICAgdHlwZV9uYW1lKHR0eXBlZGVmKSA8PCAiID0gIjsKLQotICAvLyBjb21tZW50ZWQgb3V0OiB0aGUgYmVuZWZpdCBpcyBub3QgYmlnIGVub3VnaCB0byByaXNrIGJyZWFraW5nIGV4aXN0aW5nIGNvZGUKLSAgLy9ib29sIGNvbnRhaW5lciA9IHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19tYXAoKSB8fCB0eXBlLT5pc19zZXQoKTsKLSAgLy9pZiggISBjb250YWluZXIpCi0gIC8vICBzX3N0cnVjdCA8PCAidHlwZSAiOyAgLy90aGUgInR5cGUgQSA9IHR5cGUgQiIgc3ludGF4IGxlYWRzIHRvIEUyNTc0IHdpdGggZ2VuZXJpY3MKLQotICBzX3N0cnVjdCA8PCB0eXBlX25hbWUodHR5cGVkZWYtPmdldF90eXBlKCkpIDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgCi0gIGFkZF9kZWZpbmVkX3R5cGUoIHR0eXBlZGVmKTsKLX0KLQotYm9vbCB0X2RlbHBoaV9nZW5lcmF0b3I6OmlzX2Z1bGx5X2RlZmluZWRfdHlwZSggdF90eXBlKiB0dHlwZSkgewotICBpZiggKE5VTEwgIT0gdHR5cGUtPmdldF9wcm9ncmFtKCkpICYmICh0dHlwZS0+Z2V0X3Byb2dyYW0oKSAhPSBwcm9ncmFtXykpIHsKLSAgICB0X3Njb3BlKiBzY29wZSA9IHR0eXBlLT5nZXRfcHJvZ3JhbSgpLT5zY29wZSgpOwotICAgIGlmKCBOVUxMICE9IHNjb3BlLT5nZXRfdHlwZSggdHR5cGUtPmdldF9uYW1lKCkpKSB7Ci0gICAgICAvL3ByaW50ZigidHlwZSAlcyBmb3VuZCBpbiBpbmNsdWRlZCBzY29wZSAlc1xuIiwgdHR5cGUtPmdldF9uYW1lKCkuY19zdHIoKSwgdHR5cGUtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lKCkuY19zdHIoKSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIH0KLQotICBpZiAodHR5cGUtPmlzX3R5cGVkZWYoKSkgewotICAgIHJldHVybiAoMSA9PSB0eXBlc19rbm93blsgdHlwZV9uYW1lKHR0eXBlKV0pOwotICB9Ci0gIAotICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgcmV0dXJuICgxID09IHR5cGVzX2tub3duWyBiYXNlX3R5cGVfbmFtZSgodF9iYXNlX3R5cGUqKXR0eXBlKV0pOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gdHJ1ZTsgIC8vIGVudW1zIGFyZSB3cml0dGVuIGZpcnN0LCBiZWZvcmUgYWxsIG90aGVyIHR5cGVzCi0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgdF9tYXAgKnRtYXAgPSAodF9tYXAqKSB0dHlwZTsKLSAgICByZXR1cm4gaXNfZnVsbHlfZGVmaW5lZF90eXBlKCB0bWFwLT5nZXRfa2V5X3R5cGUoKSkgJiYKLSAgICAgICAgICAgaXNfZnVsbHlfZGVmaW5lZF90eXBlKCB0bWFwLT5nZXRfdmFsX3R5cGUoKSk7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgdF9zZXQqIHRzZXQgPSAodF9zZXQqKSB0dHlwZTsKLSAgICByZXR1cm4gaXNfZnVsbHlfZGVmaW5lZF90eXBlKCB0c2V0LT5nZXRfZWxlbV90eXBlKCkpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICB0X2xpc3QqIHRsaXN0ID0gKHRfbGlzdCopIHR0eXBlOwotICAgIHJldHVybiBpc19mdWxseV9kZWZpbmVkX3R5cGUoIHRsaXN0LT5nZXRfZWxlbV90eXBlKCkpOwotICB9Ci0KLSAgcmV0dXJuICgxID09IHR5cGVzX2tub3duWyB0eXBlX25hbWUodHR5cGUpXSk7Ci19Ci0KLXZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjphZGRfZGVmaW5lZF90eXBlKCB0X3R5cGUqIHR0eXBlKSB7Ci0gIC8vIG1hcmsgYXMga25vd24gdHlwZQotICB0eXBlc19rbm93blsgdHlwZV9uYW1lKHR0eXBlKV0gPSAxOwotICAKLSAgLy8gY2hlY2sgYWxsIHBlbmRpbmcgdHlwZWRlZnMKLSAgc3RkOjpsaXN0PHRfdHlwZWRlZio+OjppdGVyYXRvciAgaXRlcjsKLSAgYm9vbCBtb3JlID0gdHJ1ZTsKLSAgd2hpbGUoIG1vcmUgJiYgKCEgdHlwZWRlZnNfcGVuZGluZy5lbXB0eSgpKSkKLSAgewotICAgIG1vcmUgPSBmYWxzZTsKLSAgICAKLSAgICBmb3IoIGl0ZXIgPSB0eXBlZGVmc19wZW5kaW5nLmJlZ2luKCk7IHR5cGVkZWZzX3BlbmRpbmcuZW5kKCkgIT0gaXRlcjsgKytpdGVyKQotICAgIHsKLSAgICAgIHRfdHlwZWRlZiogdHR5cGVkZWYgPSAoKml0ZXIpOwotICAgICAgaWYoIGlzX2Z1bGx5X2RlZmluZWRfdHlwZSggdHR5cGVkZWYtPmdldF90eXBlKCkpKQotICAgICAgeyAgICAgIAotICAgICAgICBwdmVyYm9zZSgidHlwZWRlZiAlczogYWxsIHBlbmRpbmcgcmVmZXJlbmNlcyBhcmUgbm93IHJlc29sdmVkXG4iLCB0eXBlX25hbWUodHR5cGVkZWYpLmNfc3RyKCkpOwotICAgICAgICB0eXBlZGVmc19wZW5kaW5nLmVyYXNlKCBpdGVyKTsKLSAgICAgICAgZ2VuZXJhdGVfdHlwZWRlZiggdHR5cGVkZWYpOwotICAgICAgICBtb3JlID0gdHJ1ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjppbml0X2tub3duX3R5cGVzX2xpc3QoKSB7Ci0gIC8vIGtub3duIGJhc2UgdHlwZXMKLSAgdHlwZXNfa25vd25bIHR5cGVfbmFtZSggZ190eXBlX3N0cmluZyldID0gMTsKLSAgdHlwZXNfa25vd25bIHR5cGVfbmFtZSggZ190eXBlX2JpbmFyeSldID0gMTsKLSAgdHlwZXNfa25vd25bIHR5cGVfbmFtZSggZ190eXBlX2Jvb2wpXSA9IDE7Ci0gIHR5cGVzX2tub3duWyB0eXBlX25hbWUoIGdfdHlwZV9ieXRlKV0gPSAxOwotICB0eXBlc19rbm93blsgdHlwZV9uYW1lKCBnX3R5cGVfaTE2KV0gPSAxOwotICB0eXBlc19rbm93blsgdHlwZV9uYW1lKCBnX3R5cGVfaTMyKV0gPSAxOwotICB0eXBlc19rbm93blsgdHlwZV9uYW1lKCBnX3R5cGVfaTY0KV0gPSAxOwotICB0eXBlc19rbm93blsgdHlwZV9uYW1lKCBnX3R5cGVfZG91YmxlKV0gPSAxOwotfQotCi12b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7Ci0gIGhhc19lbnVtID0gdHJ1ZTsKLSAgaW5kZW50X3VwKCk7Ci0gIGdlbmVyYXRlX2RlbHBoaV9kb2MoIHNfZW51bSwgdGVudW0pOwotICBpbmRlbnQoc19lbnVtKSA8PAotICAgIHR5cGVfbmFtZSh0ZW51bSx0cnVlLHRydWUpIDw8ICIgPSAiIDw8ICAiKCIgIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKLSAgaWYgKGNvbnN0YW50cy5lbXB0eSgpKSB7Ci0gICAgaW5kZW50KHNfZW51bSkgPDwgImR1bW15ID0gMCAgLy8gZW1wdHkgZW51bXMgYXJlIG5vdCBhbGxvd2VkIjsKLSAgfSBlbHNlIHsKLSAgICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKLSAgICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgewotICAgICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgICAgIGlmIChjX2l0ZXIgIT0gY29uc3RhbnRzLmJlZ2luKCkpIHsKLSAgICAgICAgc19lbnVtIDw8ICIsIjsKLSAgICAgICAgc19lbnVtIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgICBnZW5lcmF0ZV9kZWxwaGlfZG9jKHNfZW51bSwgKmNfaXRlcik7Ci0gICAgICBpbmRlbnQoc19lbnVtKSA8PCBub3JtYWxpemVfbmFtZSgoKmNfaXRlciktPmdldF9uYW1lKCkpIDw8ICIgPSAiIDw8IHZhbHVlOwotICAgIH0KLSAgfQotICBzX2VudW0gPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KHNfZW51bSkgPDwgIik7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci19Ci0KLQotc3RkOjpzdHJpbmcgdF9kZWxwaGlfZ2VuZXJhdG9yOjptYWtlX3ZhbGlkX2RlbHBoaV9pZGVudGlmaWVyKCBzdGQ6OnN0cmluZyBjb25zdCAmIGZyb21OYW1lKSB7Ci0gICAgc3RkOjpzdHJpbmcgc3RyID0gZnJvbU5hbWU7Ci0gICAgaWYoIHN0ci5lbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBzdHI7Ci0gICAgfQotCi0gICAgLy8gdGVzdHMgcmVseSBvbiB0aGlzCi0gICAgYXNzZXJ0KCAoJ0EnIDwgJ1onKSAmJiAoJ2EnIDwgJ3onKSAmJiAoJzAnIDwgJzknKSk7Ci0gICAgCi0gICAgLy8gaWYgdGhlIGZpcnN0IGxldHRlciBpcyBhIG51bWJlciwgd2UgYWRkIGFuIGFkZGl0aW9uYWwgdW5kZXJzY29yZSBpbiBmcm9udCBvZiBpdAotICAgIGNoYXIgYyA9IHN0ci5hdCgwKTsKLSAgICBpZiggKCcwJyA8PSBjKSAmJiAoYyA8PSAnOScpKSB7Ci0gICAgICAgIHN0ciA9ICJfIiArIHN0cjsKLSAgICB9Ci0KLSAgICAvLyBmb2xsb3dpbmcgY2hhcnM6IGxldHRlciwgbnVtYmVyIG9yIHVuZGVyc2NvcmUKLSAgICBmb3IoIHNpemVfdCBpID0gMDsgIGkgPCBzdHIuc2l6ZSgpOyAgKytpKSB7Ci0gICAgICAgIGMgPSBzdHIuYXQoaSk7ICAgICAgICAKLSAgICAgICAgaWYoICgoJ0EnID4gYykgfHwgKGMgPiAnWicpKSAmJiAKLSAgICAgICAgICAgICgoJ2EnID4gYykgfHwgKGMgPiAneicpKSAmJiAKLSAgICAgICAgICAgICgoJzAnID4gYykgfHwgKGMgPiAnOScpKSAmJiAKLSAgICAgICAgICAgICgnXycgIT0gYykgKSB7Ci0gICAgICAgICAgICBzdHIucmVwbGFjZSggaSwgMSwgIl8iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBzdHI7Ci19Ci0KLQotc3RkOjpzdHJpbmcgdF9kZWxwaGlfZ2VuZXJhdG9yOjptYWtlX2NvbnN0YW50c19jbGFzc25hbWUoKSB7Ci0gIGlmKCBjb25zdHByZWZpeF8pIHsKLSAgICByZXR1cm4gbWFrZV92YWxpZF9kZWxwaGlfaWRlbnRpZmllciggIlQiICsgcHJvZ3JhbV9uYW1lXyArICJDb25zdGFudHMiKTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gIlRDb25zdGFudHMiOyAgLy8gY29tcGF0aWJpbGl0eSAKLSAgfQotfQotCi0KLXZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykgewotICBpZiAoY29uc3RzLmVtcHR5KCkpewotICAgIHJldHVybjsKLSAgfQotCi0gIGhhc19jb25zdCA9IHRydWU7Ci0gIHN0cmluZyBjb25zdGFudHNfY2xhc3MgPSBtYWtlX2NvbnN0YW50c19jbGFzc25hbWUoKTsKLQotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KHNfY29uc3QpIDw8Ci0gICAgY29uc3RhbnRzX2NsYXNzLmNfc3RyKCkgPDwgIiA9IGNsYXNzIiA8PCBlbmRsOwotICBpbmRlbnQoc19jb25zdCkgPDwgInByaXZhdGUiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7Ci0gIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgaWYoIGNvbnN0X25lZWRzX3ZhcigoKmNfaXRlciktPmdldF90eXBlKCkpKSB7Ci0gICAgICBwcmludF9wcml2YXRlX2ZpZWxkKHNfY29uc3QsIG5vcm1hbGl6ZV9uYW1lKCgqY19pdGVyKS0+Z2V0X25hbWUoKSksCi0gICAgICAgICgqY19pdGVyKS0+Z2V0X3R5cGUoKSwgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSk7Ci0gICAgfQotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChzX2NvbnN0KSA8PCAicHVibGljIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9kZWxwaGlfZG9jKHNfY29uc3QsICpjX2l0ZXIpOwotICAgIHByaW50X2NvbnN0X3Byb3Aoc19jb25zdCwgbm9ybWFsaXplX25hbWUoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKSwgCi0gICAgICAoKmNfaXRlciktPmdldF90eXBlKCksICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCkpOwotICB9Ci0gIGluZGVudChzX2NvbnN0KSA8PCAieyRJRiBDb21waWxlclZlcnNpb24gPj0gMjEuMH0iIDw8IGVuZGw7Ci0gIGluZGVudChzX2NvbnN0KSA8PCAiY2xhc3MgY29uc3RydWN0b3IgQ3JlYXRlOyIgPDwgZW5kbDsKLSAgaW5kZW50KHNfY29uc3QpIDw8ICJjbGFzcyBkZXN0cnVjdG9yIERlc3Ryb3k7IiA8PCBlbmRsOwotICBpbmRlbnQoc19jb25zdCkgPDwgInskSUZFTkR9IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQoc19jb25zdCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLQotICBzdGQ6Om9zdHJpbmdzdHJlYW0gIHZhcnMsIGNvZGU7Ci0KLSAgaW5kZW50X3VwX2ltcGwoKTsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBpbml0aWFsaXplX2ZpZWxkKHZhcnMsIGNvZGUsICJGIiArIHByb3BfbmFtZSggKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKSwKLSAgICAgICgqY19pdGVyKS0+Z2V0X3R5cGUoKSwgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSk7Ci0gIH0KLSAgaW5kZW50X2Rvd25faW1wbCgpOwotCi0gIGluZGVudF9pbXBsKHNfY29uc3RfaW1wbCkgPDwgInskSUYgQ29tcGlsZXJWZXJzaW9uID49IDIxLjB9IiA8PCBlbmRsOwotICBpbmRlbnRfaW1wbChzX2NvbnN0X2ltcGwpIDw8ICJjbGFzcyBjb25zdHJ1Y3RvciAiIDw8IGNvbnN0YW50c19jbGFzcy5jX3N0cigpIDw8ICIuQ3JlYXRlOyIgPDwgZW5kbDsKLQotICBpZiAoICEgdmFycy5zdHIoKS5lbXB0eSgpICkgewotICAgIGluZGVudF9pbXBsKHNfY29uc3RfaW1wbCkgPDwgInZhciIgPDwgZW5kbDsKLSAgICBzX2NvbnN0X2ltcGwgPDwgdmFycy5zdHIoKTsKLSAgfQotICBpbmRlbnRfaW1wbChzX2NvbnN0X2ltcGwpIDw8ICJiZWdpbiIgPDwgZW5kbDsKLSAgaWYgKCAhIGNvZGUuc3RyKCkuZW1wdHkoKSApIHsKLSAgICBzX2NvbnN0X2ltcGwgPDwgY29kZS5zdHIoKTsKLSAgfQotICBpbmRlbnRfaW1wbChzX2NvbnN0X2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIGluZGVudF9pbXBsKHNfY29uc3RfaW1wbCkgPDwgImNsYXNzIGRlc3RydWN0b3IgIiA8PCBjb25zdGFudHNfY2xhc3MuY19zdHIoKSA8PCAiLkRlc3Ryb3k7IiA8PCBlbmRsOwotICBpbmRlbnRfaW1wbChzX2NvbnN0X2ltcGwpIDw8ICJiZWdpbiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwX2ltcGwoKTsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBpZiggY29uc3RfbmVlZHNfdmFyKCgqY19pdGVyKS0+Z2V0X3R5cGUoKSkpIHsKLSAgICAgIGZpbmFsaXplX2ZpZWxkKHNfY29uc3RfaW1wbCwgbm9ybWFsaXplX25hbWUoICgqY19pdGVyKS0+Z2V0X25hbWUoKSksCi0gICAgICAgICgqY19pdGVyKS0+Z2V0X3R5cGUoKSwgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSk7Ci0gICAgfQotICB9Ci0gIGluZGVudF9pbXBsKHNfY29uc3RfaW1wbCkgPDwgImluaGVyaXRlZDsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duX2ltcGwoKTsKLSAgaW5kZW50X2ltcGwoc19jb25zdF9pbXBsKSA8PCAiZW5kOyIgPDwgZW5kbDsKLSAgaW5kZW50X2ltcGwoc19jb25zdF9pbXBsKSA8PCAieyRFTFNFfSIgPDwgZW5kbDsKLQotICB2YXJzLnN0cigiIik7Ci0gIGNvZGUuc3RyKCIiKTsKLQotICBpbmRlbnRfdXBfaW1wbCgpOwotICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgewotICAgIGlmKCBjb25zdF9uZWVkc192YXIoKCpjX2l0ZXIpLT5nZXRfdHlwZSgpKSkgewotICAgICAgaW5pdGlhbGl6ZV9maWVsZCggdmFycywgY29kZSwgY29uc3RhbnRzX2NsYXNzICsgIi5GIiArIHByb3BfbmFtZSggKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKSwKLSAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdHlwZSgpLCAoKmNfaXRlciktPmdldF92YWx1ZSgpKTsKLSAgICB9Ci0gIH0KLSAgaW5kZW50X2Rvd25faW1wbCgpOwotCi0gIGluZGVudF9pbXBsKHNfY29uc3RfaW1wbCkgPDwgInByb2NlZHVyZSAiIDw8IGNvbnN0YW50c19jbGFzcy5jX3N0cigpIDw8ICJfSW5pdGlhbGl6ZTsiIDw8IGVuZGw7Ci0gIGlmICggISB2YXJzLnN0cigpLmVtcHR5KCkgKSB7Ci0gICAgaW5kZW50X2ltcGwoc19jb25zdF9pbXBsKSA8PCAidmFyIiA8PCBlbmRsOwotICAgIHNfY29uc3RfaW1wbCA8PCB2YXJzLnN0cigpOwotICB9Ci0gIGluZGVudF9pbXBsKHNfY29uc3RfaW1wbCkgPDwgImJlZ2luIiA8PCBlbmRsOwotICBpZiAoICEgY29kZS5zdHIoKS5lbXB0eSgpICkgewotICAgIHNfY29uc3RfaW1wbCA8PCBjb2RlLnN0cigpOwotICB9Ci0gIGluZGVudF9pbXBsKHNfY29uc3RfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnRfaW1wbChzX2NvbnN0X2ltcGwpIDw8ICJwcm9jZWR1cmUgIiA8PCBjb25zdGFudHNfY2xhc3MuY19zdHIoKSA8PCAiX0ZpbmFsaXplOyIgPDwgZW5kbDsKLSAgaW5kZW50X2ltcGwoc19jb25zdF9pbXBsKSA8PCAiYmVnaW4iIDw8IGVuZGw7Ci0gIGluZGVudF91cF9pbXBsKCk7Ci0gIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgZmluYWxpemVfZmllbGQoc19jb25zdF9pbXBsLCBub3JtYWxpemVfbmFtZSggKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKSwKLSAgICAgICgqY19pdGVyKS0+Z2V0X3R5cGUoKSwgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSwgY29uc3RhbnRzX2NsYXNzKTsKLSAgfQotICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0gIGluZGVudF9pbXBsKHNfY29uc3RfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGw7Ci0gIGluZGVudF9pbXBsKHNfY29uc3RfaW1wbCkgPDwgInskSUZFTkR9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpwcmludF9jb25zdF9kZWZfdmFsdWUoc3RkOjpvc3RyZWFtJiB2YXJzLCBzdGQ6Om9zdHJlYW0mIG91dCwgc3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUsIHN0cmluZyBjbHNfbm0pCi17Ci0KLSAgc3RyaW5nIGNsc19wcmVmaXg7Ci0KLSAgaWYgKGNsc19ubSA9PSAiIikgewotICAgIGNsc19wcmVmaXggPSAiIjsKLSAgfSBlbHNlIHsKLSAgICBjbHNfcHJlZml4ID0gY2xzX25tICsgIi4iOwotICB9Ci0KLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKLSAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7Ci0gICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgewotICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOwotICAgICAgfQotICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZSggdmFycywgb3V0LCBuYW1lLCBmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgICBpbmRlbnRfaW1wbChvdXQpIDw8IGNsc19wcmVmaXggPDwgbm9ybWFsaXplX25hbWUobmFtZSkgPDwgIi4iIDw8IHByb3BfbmFtZSggdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpLCB0eXBlLT5pc194Y2VwdGlvbigpKSA8PCAiIDo9ICIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBzdHJpbmcga2V5ID0gcmVuZGVyX2NvbnN0X3ZhbHVlKCB2YXJzLCBvdXQsIG5hbWUsIGt0eXBlLCB2X2l0ZXItPmZpcnN0KTsKLSAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUoIHZhcnMsIG91dCwgbmFtZSwgdnR5cGUsIHZfaXRlci0+c2Vjb25kKTsKLSAgICAgIGluZGVudF9pbXBsKG91dCkgPDwgY2xzX3ByZWZpeCA8PCBub3JtYWxpemVfbmFtZShuYW1lKSA8PCAiWyIgPDwga2V5IDw8ICJdIiA8PCAiIDo9ICIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKLSAgICB0X3R5cGUqIGV0eXBlOwotICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB9Ci0KLSAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKLSAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUoIHZhcnMsIG91dCwgbmFtZSwgZXR5cGUsICp2X2l0ZXIpOwotICAgICAgaW5kZW50X2ltcGwob3V0KSA8PCBjbHNfcHJlZml4IDw8IG5vcm1hbGl6ZV9uYW1lKG5hbWUpIDw8ICIuQWRkKCIgPDwgdmFsIDw8ICIpOyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OnByaW50X3ByaXZhdGVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsIHN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7Ci0gICh2b2lkKSB2YWx1ZTsKLSAgaW5kZW50KG91dCkgPDwgImNsYXNzIHZhciBGIiA8PCBuYW1lIDw8ICI6ICIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICI7IiA8PCBlbmRsOwotfQotCi0KLWJvb2wgdF9kZWxwaGlfZ2VuZXJhdG9yOjpjb25zdF9uZWVkc192YXIodF90eXBlKiB0eXBlKSB7Ci0gIHRfdHlwZSogdHJ1ZXR5cGUgPSB0eXBlOwotICB3aGlsZSAodHJ1ZXR5cGUtPmlzX3R5cGVkZWYoKSkgewotICAgIHRydWV0eXBlID0gKCh0X3R5cGVkZWYqKXRydWV0eXBlKS0+Z2V0X3R5cGUoKTsKLSAgfQotICByZXR1cm4gKCEgdHJ1ZXR5cGUtPmlzX2Jhc2VfdHlwZSgpKTsKLX0KLQotCi12b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6cHJpbnRfY29uc3RfcHJvcChzdGQ6Om9zdHJlYW0mIG91dCwgc3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKLSAgKHZvaWQpIHZhbHVlOwotICBpZiAoY29uc3RfbmVlZHNfdmFyKHR5cGUpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImNsYXNzIHByb3BlcnR5ICIgPDwgbmFtZSA8PCAiOiAiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiIHJlYWQgRiIgPDwgbmFtZSA8PCAiOyIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gdmFyczsgLy8gZHVtbXkKLSAgICBzdHJpbmcgdjIgPSByZW5kZXJfY29uc3RfdmFsdWUoIHZhcnMsIG91dCwgbmFtZSwgdHlwZSwgdmFsdWUpOwotICAgIGluZGVudChvdXQpIDw8ICJjb25zdCAiIDw8IG5hbWUgPDwgIiA9ICIgPDwgdjIgPDwgIjsiIDw8IGVuZGw7Ci0gIH0KLX0KLQotdm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OnByaW50X2NvbnN0X3ZhbHVlKCBzdGQ6Om9zdHJlYW0mIHZhcnMsIHN0ZDo6b3N0cmVhbSYgb3V0LCBzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgewotICB0X3R5cGUqIHRydWV0eXBlID0gdHlwZTsKLSAgd2hpbGUgKHRydWV0eXBlLT5pc190eXBlZGVmKCkpIHsKLSAgICB0cnVldHlwZSA9ICgodF90eXBlZGVmKil0cnVldHlwZSktPmdldF90eXBlKCk7Ci0gIH0KLQotICBpZiAodHJ1ZXR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgLy8gYWxyZWFkeSBkb25lCi0gICAgLy9zdHJpbmcgdjIgPSByZW5kZXJfY29uc3RfdmFsdWUoIHZhcnMsIG91dCwgbmFtZSwgdHlwZSwgdmFsdWUpOwotICAgIC8vaW5kZW50X2ltcGwob3V0KSA8PCBuYW1lIDw8ICIgOj0gIiA8PCB2MiA8PCAiOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0cnVldHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgaW5kZW50X2ltcGwob3V0KSA8PCBuYW1lIDw8ICIgOj0gIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIi4iIDw8IHZhbHVlLT5nZXRfaWRlbnRpZmllcl9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgc3RyaW5nIHR5cG5hbWU7Ci0gICAgdHlwbmFtZSA9IHR5cGVfbmFtZSggdHJ1ZXR5cGUsIHRydWUsIGZhbHNlLCB0eXBlLT5pc194Y2VwdGlvbigpLCB0eXBlLT5pc194Y2VwdGlvbigpKTsKLSAgICBpbmRlbnRfaW1wbChvdXQpIDw8IG5hbWUgPDwgIiA6PSAiIDw8IHR5cG5hbWUgPDwgIi5DcmVhdGU7IiA8PCBlbmRsOwotICAgIHByaW50X2NvbnN0X2RlZl92YWx1ZSggdmFycywgb3V0LCBuYW1lLCB0cnVldHlwZSwgdmFsdWUpOwotICB9Ci19Ci0KLXZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjppbml0aWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgdmFycywgc3RkOjpvc3RyZWFtJiBvdXQsIHN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7Ci0gIHByaW50X2NvbnN0X3ZhbHVlKCB2YXJzLCBvdXQsIG5hbWUsIHR5cGUsIHZhbHVlICk7Ci19Ci0KLXZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpmaW5hbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwgc3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUgLCBzdHJpbmcgY2xzX25tKSB7Ci0gICh2b2lkKSBvdXQ7Ci0gICh2b2lkKSBuYW1lOwotICAodm9pZCkgdHlwZTsKLSAgKHZvaWQpIHZhbHVlOwotICAodm9pZCkgY2xzX25tOwotfQotCi1zdHJpbmcgdF9kZWxwaGlfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUob3N0cmVhbSYgdmFycywgb3N0cmVhbSYgb3V0LCBzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgewotICAodm9pZCkgbmFtZTsKLQotICB0X3R5cGUqIHRydWV0eXBlID0gdHlwZTsKLSAgd2hpbGUgKHRydWV0eXBlLT5pc190eXBlZGVmKCkpIHsKLSAgICB0cnVldHlwZSA9ICgodF90eXBlZGVmKil0cnVldHlwZSktPmdldF90eXBlKCk7Ci0gIH0KLQotICBzdGQ6Om9zdHJpbmdzdHJlYW0gcmVuZGVyOwotCi0gIGlmICh0cnVldHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHJ1ZXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICByZW5kZXIgPDwgIiciIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgIiciOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgcmVuZGVyIDw8ICgodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwKSA/ICJUcnVlIiA6ICJGYWxzZSIpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgcmVuZGVyIDw8ICJTaG9ydEludCggIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgIHJlbmRlciA8PCAiU21hbGxJbnQoICIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIikiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICByZW5kZXIgPDwgIkxvbmdJbnQoICIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIikiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICByZW5kZXIgPDwgIkludDY0KCAiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICIpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKLSAgICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIi4wIjsgIC8vIG1ha2UgaXQgYSBkb3VibGUgY29uc3RhbnQgYnkgYWRkaW5nICIuMCIKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgfQotICB9IGVsc2UgaWYgKHRydWV0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZW5kZXIgPDwgdHlwZV9uYW1lKCB0eXBlLCBmYWxzZSkgPDwgIi4iIDw8IHZhbHVlLT5nZXRfaWRlbnRpZmllcl9uYW1lKCk7Ci0gIH0gZWxzZSB7Ci0gICAgc3RyaW5nIHQgPSB0bXAoInRtcCIpOwotICAgIHZhcnMgPDwgICIgICIgPDwgdCA8PCAiIDogIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgcHJpbnRfY29uc3RfdmFsdWUoIHZhcnMsIG91dCwgdCwgdHlwZSwgdmFsdWUpOwotICAgIHJlbmRlciA8PCB0OwotICB9Ci0KLSAgcmV0dXJuIHJlbmRlci5zdHIoKTsKLX0KLQotdm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0KHRzdHJ1Y3QsIGZhbHNlKTsKLX0KLQotdm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKLSAgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdCh0eGNlcHRpb24sIHRydWUpOwotfQotCi12b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVscGhpX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pIHsKLSAgaW5kZW50X3VwKCk7Ci0gIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfZGVmaW5pdGlvbihzX3N0cnVjdCwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKLSAgaW5kZW50X2Rvd24oKTsKLSAgCi0gIGFkZF9kZWZpbmVkX3R5cGUoIHRzdHJ1Y3QpOwotCi0gIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfaW1wbChzX3N0cnVjdF9pbXBsLCAiIiwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKLSAgaWYgKHJlZ2lzdGVyX3R5cGVzXykgewotICAgIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfdHlwZV9mYWN0b3J5KHNfdHlwZV9mYWN0b3J5X2Z1bmNzLCAiIiwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKLSAgICBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X3R5cGVfZmFjdG9yeV9yZWdpc3RyYXRpb24oc190eXBlX2ZhY3RvcnlfcmVnaXN0cmF0aW9uLCAiIiwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKLSAgfQotfQotCi12b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVscGhpX3N0cnVjdF9pbXBsKCBvc3RyZWFtJiBvdXQsIHN0cmluZyBjbHNfcHJlZml4LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24sIGJvb2wgaXNfcmVzdWx0LCBib29sIGlzX3hfZmFjdG9yeSkgewotCi0gIGlmIChpc19leGNlcHRpb24gJiYgICghIGlzX3hfZmFjdG9yeSkpIHsKLSAgICBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X2ltcGwoIG91dCwgIGNsc19wcmVmaXgsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbiwgaXNfcmVzdWx0LCB0cnVlKTsKLSAgfQotCi0gIHN0cmluZyBjbHNfbm07Ci0KLSAgc3RyaW5nIGV4Y2VwdGlvbl9mYWN0b3J5X25hbWU7Ci0KLSAgaWYgKGlzX2V4Y2VwdGlvbikgewotICAgIGV4Y2VwdGlvbl9mYWN0b3J5X25hbWUgPSBub3JtYWxpemVfY2xzbm0oIHRzdHJ1Y3QtPmdldF9uYW1lKCksICIiLCB0cnVlICkgKyAiRmFjdG9yeSI7Ci0gIH0KLQotICBpZiAoaXNfZXhjZXB0aW9uKSB7Ci0gICAgY2xzX25tID0gdHlwZV9uYW1lKHRzdHJ1Y3QsdHJ1ZSwoISBpc194X2ZhY3RvcnkpLGlzX3hfZmFjdG9yeSx0cnVlKTsKLSAgfQotICBlbHNlIHsKLSAgICBjbHNfbm0gPSB0eXBlX25hbWUodHN0cnVjdCx0cnVlLGZhbHNlKTsKLSAgfQotCi0gIHN0ZDo6b3N0cmluZ3N0cmVhbSB2YXJzLCBjb2RlOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0KLSAgaW5kZW50X3VwX2ltcGwoKTsKLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIHRfdHlwZSogdCA9ICgqbV9pdGVyKS0+Z2V0X3R5cGUoKTsKLSAgICB3aGlsZSAodC0+aXNfdHlwZWRlZigpKSB7Ci0gICAgICB0ID0gKCh0X3R5cGVkZWYqKXQpLT5nZXRfdHlwZSgpOwotICAgIH0KLSAgICBpZiAoKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7Ci0gICAgICBpbml0aWFsaXplX2ZpZWxkKCB2YXJzLCBjb2RlLCAiRiIgKyBwcm9wX25hbWUoICgqbV9pdGVyKS0+Z2V0X25hbWUoKSwgaXNfZXhjZXB0aW9uKSwgdCwgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSk7Ci0gICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgewotICAgICAgICBpbmRlbnRfaW1wbChjb2RlKSA8PCAiRl9faXNzZXRfIiA8PCBwcm9wX25hbWUoKCptX2l0ZXIpLCBpc19leGNlcHRpb24pIDw8ICIgOj0gVHJ1ZTsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIGluZGVudF9kb3duX2ltcGwoKTsKLQotICBpbmRlbnRfaW1wbChvdXQpIDw8ICJjb25zdHJ1Y3RvciAiIDw8IGNsc19wcmVmaXggPDwgY2xzX25tIDw8ICAiLiIgPDwgIkNyZWF0ZTsiIDw8IGVuZGw7Ci0KLSAgaWYgKCAhIHZhcnMuc3RyKCkuZW1wdHkoKSkgewotICAgIG91dCA8PCAidmFyIiA8PCBlbmRsOwotICAgIG91dCA8PCB2YXJzLnN0cigpOwotICB9Ci0KLSAgaW5kZW50X2ltcGwob3V0KSA8PCAiYmVnaW4iIDw8IGVuZGw7Ci0gIGluZGVudF91cF9pbXBsKCk7Ci0gIGlmIChpc19leGNlcHRpb24gJiYgKCEgaXNfeF9mYWN0b3J5KSkgewotICAgIGluZGVudF9pbXBsKG91dCkgPDwgImluaGVyaXRlZCBDcmVhdGUoJycpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJGIiA8PCBleGNlcHRpb25fZmFjdG9yeV9uYW1lIDw8ICIgOj0gVCIgPDwgZXhjZXB0aW9uX2ZhY3RvcnlfbmFtZSA8PCAiSW1wbC5DcmVhdGU7IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGluZGVudF9pbXBsKG91dCkgPDwgImluaGVyaXRlZDsiIDw8IGVuZGw7Ci0gIH0KLQotICBpZiAoICEgY29kZS5zdHIoKS5lbXB0eSgpKSB7Ci0gICAgb3V0IDw8IGNvZGUuc3RyKCk7Ci0gIH0KLQotICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0gIGluZGVudF9pbXBsKG91dCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpZiAoKG1lbWJlcnMuc2l6ZSgpID4gMCkgJiYgaXNfZXhjZXB0aW9uICYmICghaXNfeF9mYWN0b3J5KSkgewotICAgIGluZGVudF9pbXBsKG91dCkgPDwgImNvbnN0cnVjdG9yICIgPDwgY2xzX3ByZWZpeCA8PCBjbHNfbm0gPDwgICIuIiA8PCAiQ3JlYXRlKCIgPDwgY29uc3RydWN0b3JfYXJndW1lbnRfbGlzdCggdHN0cnVjdCwgaW5kZW50X2ltcGwoKSkgPDwgIik7IiA8PCBlbmRsOwotICAgIGluZGVudF9pbXBsKG91dCkgPDwgImJlZ2luIiA8PCBlbmRsOwotICAgIGluZGVudF91cF9pbXBsKCk7Ci0gICAgaW5kZW50X2ltcGwob3V0KSA8PCAiQ3JlYXRlOyIgPDwgZW5kbDsKLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICBzdHJpbmcgcHJvcG5hbWUgPSBwcm9wX25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpLCBpc19leGNlcHRpb24pOwotICAgICAgc3RyaW5nIHBhcmFtX25hbWUgPSBjb25zdHJ1Y3Rvcl9wYXJhbV9uYW1lKCAoKm1faXRlciktPmdldF9uYW1lKCkpOwotICAgICAgaW5kZW50X2ltcGwob3V0KSA8PCBwcm9wbmFtZSA8PCAiIDo9ICIgPDwgcGFyYW1fbmFtZSA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50X2ltcGwob3V0KSA8PCAiVXBkYXRlTWVzc2FnZVByb3BlcnR5OyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0gICAgaW5kZW50X2ltcGwob3V0KSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50X2ltcGwob3V0KSA8PCAiZGVzdHJ1Y3RvciAiICA8PCBjbHNfcHJlZml4IDw8IGNsc19ubSA8PCAgIi4iIDw8ICJEZXN0cm95OyIgPDwgZW5kbDsKLSAgaW5kZW50X2ltcGwob3V0KSA8PCAiYmVnaW4iIDw8IGVuZGw7Ci0gIGluZGVudF91cF9pbXBsKCk7Ci0KLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIHRfdHlwZSogdCA9ICgqbV9pdGVyKS0+Z2V0X3R5cGUoKTsKLSAgICB3aGlsZSAodC0+aXNfdHlwZWRlZigpKSB7Ci0gICAgICB0ID0gKCh0X3R5cGVkZWYqKXQpLT5nZXRfdHlwZSgpOwotICAgIH0KLSAgICBmaW5hbGl6ZV9maWVsZCggb3V0LCBwcm9wX25hbWUoKm1faXRlciwgaXNfZXhjZXB0aW9uKSwgdCwgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSk7Ci0gIH0KLQotICBpbmRlbnRfaW1wbChvdXQpIDw8ICJpbmhlcml0ZWQ7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0gIGluZGVudF9pbXBsKG91dCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpZiAoIHRzdHJ1Y3QtPmlzX3VuaW9uKCkgKSB7Ci0gICAgaW5kZW50X2ltcGwob3V0KSA8PCAicHJvY2VkdXJlICIgIDw8IGNsc19wcmVmaXggPDwgY2xzX25tIDw8ICAiLiIgPDwgIkNsZWFyVW5pb25WYWx1ZXM7IiA8PCBlbmRsOwotICAgIGluZGVudF9pbXBsKG91dCkgPDwgImJlZ2luIiA8PCBlbmRsOwotICAgIGluZGVudF91cF9pbXBsKCk7Ci0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgdF90eXBlKiB0ID0gKCptX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgICAgd2hpbGUgKHQtPmlzX3R5cGVkZWYoKSkgewotICAgICAgICB0ID0gKCh0X3R5cGVkZWYqKXQpLT5nZXRfdHlwZSgpOwotICAgICAgfQotCi0gICAgICBnZW5lcmF0ZV9kZWxwaGlfY2xlYXJfdW5pb25fdmFsdWUoIG91dCwgY2xzX3ByZWZpeCwgY2xzX25tLCB0LCAqbV9pdGVyLCAiRiIsIGlzX2V4Y2VwdGlvbiwgdHN0cnVjdC0+aXNfdW5pb24oKSwgaXNfeF9mYWN0b3J5LCBleGNlcHRpb25fZmFjdG9yeV9uYW1lKTsKLSAgICB9Ci0gICAgaW5kZW50X2Rvd25faW1wbCgpOwotICAgIGluZGVudF9pbXBsKG91dCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICB0X3R5cGUqIHQgPSAoKm1faXRlciktPmdldF90eXBlKCk7Ci0gICAgd2hpbGUgKHQtPmlzX3R5cGVkZWYoKSkgewotICAgICAgdCA9ICgodF90eXBlZGVmKil0KS0+Z2V0X3R5cGUoKTsKLSAgICB9Ci0gICAgZ2VuZXJhdGVfZGVscGhpX3Byb3BlcnR5X3JlYWRlcl9pbXBsKCBvdXQsIGNsc19wcmVmaXgsIGNsc19ubSwgdCwgKm1faXRlciwgIkYiLCBpc19leGNlcHRpb24pOwotICAgIGdlbmVyYXRlX2RlbHBoaV9wcm9wZXJ0eV93cml0ZXJfaW1wbCggb3V0LCBjbHNfcHJlZml4LCBjbHNfbm0sIHQsICptX2l0ZXIsICJGIiwgaXNfZXhjZXB0aW9uLCB0c3RydWN0LT5pc191bmlvbigpLCBpc194X2ZhY3RvcnksIGV4Y2VwdGlvbl9mYWN0b3J5X25hbWUpOwotICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7Ci0gICAgICBnZW5lcmF0ZV9kZWxwaGlfaXNzZXRfcmVhZGVyX2ltcGwoIG91dCwgY2xzX3ByZWZpeCwgY2xzX25tLCB0LCAqbV9pdGVyLCAiRiIsIGlzX2V4Y2VwdGlvbik7Ci0gICAgfQotICB9Ci0KLSAgaWYgKCghIGlzX2V4Y2VwdGlvbikgfHwgaXNfeF9mYWN0b3J5KSB7Ci0gICAgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF9yZWFkZXJfaW1wbCggb3V0LCBjbHNfcHJlZml4LCB0c3RydWN0LCBpc19leGNlcHRpb24pOwotICAgIGlmICggaXNfcmVzdWx0ICkgewotICAgICAgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF9yZXN1bHRfd3JpdGVyX2ltcGwoIG91dCwgY2xzX3ByZWZpeCwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKLSAgICB9IGVsc2UgewotICAgICAgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF93cml0ZXJfaW1wbCggb3V0LCBjbHNfcHJlZml4LCB0c3RydWN0LCBpc19leGNlcHRpb24pOwotICAgIH0KLSAgfQotICBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X3Rvc3RyaW5nX2ltcGwoIG91dCwgY2xzX3ByZWZpeCwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uLCBpc194X2ZhY3RvcnkpOwotCi0gIGlmIChpc19leGNlcHRpb24gJiYgaXNfeF9mYWN0b3J5KSB7Ci0gICAgZ2VuZXJhdGVfZGVscGhpX2NyZWF0ZV9leGNlcHRpb25faW1wbCggb3V0LCBjbHNfcHJlZml4LCB0c3RydWN0LCBpc19leGNlcHRpb24pOwotICB9Ci19Ci0KLXZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpwcmludF9kZWxwaGlfc3RydWN0X3R5cGVfZmFjdG9yeV9mdW5jKCAgb3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBzdHJpbmcgc3RydWN0X2ludGZfbmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0KTsKLSAgb3V0IDw8ICJDcmVhdGVfIjsKLSAgb3V0IDw8IHN0cnVjdF9pbnRmX25hbWU7Ci0gIG91dCA8PCAiX0ltcGwiOwotfQotCi0KLXZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X3R5cGVfZmFjdG9yeSggb3N0cmVhbSYgb3V0LCBzdHJpbmcgY2xzX3ByZWZpeCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uLCBib29sIGlzX3Jlc3VsdCwgYm9vbCBpc194X2ZhY3RvcnkpIHsKLSAgKHZvaWQpIGNsc19wcmVmaXg7Ci0gIGlmIChpc19leGNlcHRpb24pCi0gICAgcmV0dXJuOwotICBpZiAoaXNfcmVzdWx0KQotICAgIHJldHVybjsKLSAgaWYgKGlzX3hfZmFjdG9yeSkKLSAgICByZXR1cm47Ci0KLSAgc3RyaW5nIHN0cnVjdF9pbnRmX25hbWUgPSB0eXBlX25hbWUodHN0cnVjdCk7Ci0gIHN0cmluZyBjbHNfbm0gPSB0eXBlX25hbWUodHN0cnVjdCx0cnVlLGZhbHNlKTsKLQotICBvdXQgPDwgImZ1bmN0aW9uICI7Ci0gIHByaW50X2RlbHBoaV9zdHJ1Y3RfdHlwZV9mYWN0b3J5X2Z1bmMob3V0LCB0c3RydWN0KTsKLSAgb3V0IDw8ICI6ICI7Ci0gIG91dCA8PCBzdHJ1Y3RfaW50Zl9uYW1lOwotICBvdXQgPDwgIjsiIDw8IGVuZGw7Ci0gIG91dCA8PCAiYmVnaW4iIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAiUmVzdWx0IDo9ICIgPDwgY2xzX25tIDw8ICIuQ3JlYXRlOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgb3V0IDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X3R5cGVfZmFjdG9yeV9yZWdpc3RyYXRpb24oIG9zdHJlYW0mIG91dCwgc3RyaW5nIGNsc19wcmVmaXgsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbiwgYm9vbCBpc19yZXN1bHQsIGJvb2wgaXNfeF9mYWN0b3J5KSB7Ci0gICh2b2lkKSBjbHNfcHJlZml4OwotICBpZiAoaXNfZXhjZXB0aW9uKQotICAgIHJldHVybjsKLSAgaWYgKGlzX3Jlc3VsdCkKLSAgICByZXR1cm47Ci0gIGlmIChpc194X2ZhY3RvcnkpCi0gICAgcmV0dXJuOwotCi0gIHN0cmluZyBzdHJ1Y3RfaW50Zl9uYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QpOwotCi0gIGluZGVudChvdXQpIDw8ICIgIFR5cGVSZWdpc3RyeS5SZWdpc3RlclR5cGVGYWN0b3J5PCIgPDwgc3RydWN0X2ludGZfbmFtZSA8PCAiPigiOwotICBwcmludF9kZWxwaGlfc3RydWN0X3R5cGVfZmFjdG9yeV9mdW5jKG91dCwgdHN0cnVjdCk7Ci0gIG91dCA8PCAiKTsiOwotICBvdXQgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfZGVmaW5pdGlvbihvc3RyZWFtICZvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbiwgYm9vbCBpbl9jbGFzcywgYm9vbCBpc19yZXN1bHQsIGJvb2wgaXNfeF9mYWN0b3J5KSB7Ci0gIGJvb2wgaXNfZmluYWwgPSAodHN0cnVjdC0+YW5ub3RhdGlvbnNfLmZpbmQoImZpbmFsIikgIT0gdHN0cnVjdC0+YW5ub3RhdGlvbnNfLmVuZCgpKTsKLSAgc3RyaW5nIHN0cnVjdF9pbnRmX25hbWU7Ci0gIHN0cmluZyBzdHJ1Y3RfbmFtZTsKLSAgc3RyaW5nIGlzc2V0X25hbWU7IAotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIHN0cmluZyBleGNlcHRpb25fZmFjdG9yeV9uYW1lID0gbm9ybWFsaXplX2Nsc25tKCB0c3RydWN0LT5nZXRfbmFtZSgpLCAiIiwgdHJ1ZSApICsgIkZhY3RvcnkiOwotCi0gIGlmIChpc19leGNlcHRpb24pIHsKLSAgICBzdHJ1Y3RfaW50Zl9uYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QsZmFsc2UsZmFsc2UsdHJ1ZSk7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgc3RydWN0X2ludGZfbmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0KTsKLSAgfQotCi0KLSAgaWYgKGlzX2V4Y2VwdGlvbikgewotICAgIHN0cnVjdF9uYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QsIHRydWUsICghIGlzX3hfZmFjdG9yeSksIGlzX3hfZmFjdG9yeSk7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgc3RydWN0X25hbWUgPSB0eXBlX25hbWUodHN0cnVjdCx0cnVlKTsKLSAgfQotCi0gIGlmICgoISBpc19leGNlcHRpb24pIHx8IGlzX3hfZmFjdG9yeSkgewotCi0gICAgZ2VuZXJhdGVfZGVscGhpX2RvYyhvdXQsIHRzdHJ1Y3QpOwotICAgIGluZGVudChvdXQpIDw8IHN0cnVjdF9pbnRmX25hbWUgPDwgIiA9IGludGVyZmFjZShJQmFzZSkiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICBnZW5lcmF0ZV9kZWxwaGlfcHJvcGVydHlfcmVhZGVyX2RlZmluaXRpb24oIG91dCwgKm1faXRlciwgaXNfZXhjZXB0aW9uKTsKLSAgICAgIGdlbmVyYXRlX2RlbHBoaV9wcm9wZXJ0eV93cml0ZXJfZGVmaW5pdGlvbiggb3V0LCAqbV9pdGVyLCBpc19leGNlcHRpb24pOwotICAgIH0KLQotICAgIGlmIChpc194X2ZhY3RvcnkpIHsKLSAgICAgIG91dCA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIi8vIENyZWF0ZSBFeGNlcHRpb24gT2JqZWN0IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgImZ1bmN0aW9uIENyZWF0ZUV4Y2VwdGlvbjogIiA8PCB0eXBlX25hbWUodHN0cnVjdCx0cnVlLHRydWUpIDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKLSAgICAgIG91dCA8PCBlbmRsOwotICAgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgICBnZW5lcmF0ZV9wcm9wZXJ0eShvdXQsICptX2l0ZXIsIHRydWUsIGlzX2V4Y2VwdGlvbik7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgewotICAgICAgb3V0IDw8IGVuZGw7Ci0gICAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7Ci0gICAgICAgICAgZ2VuZXJhdGVfZGVscGhpX2lzc2V0X3JlYWRlcl9kZWZpbml0aW9uKCBvdXQsICptX2l0ZXIsIGlzX2V4Y2VwdGlvbik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7Ci0gICAgICBvdXQgPDwgZW5kbDsKLSAgICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKLSAgICAgICAgICBpc3NldF9uYW1lID0gIl9faXNzZXRfIiArIHByb3BfbmFtZSgqbV9pdGVyLCBpc19leGNlcHRpb24pOwotICAgICAgICAgIGluZGVudChvdXQpIDw8ICJwcm9wZXJ0eSAiIDw8IGlzc2V0X25hbWUgPDwgIjogQm9vbGVhbiByZWFkIEdldCIgPDwgaXNzZXRfbmFtZSA8PCAiOyIgPDwgZW5kbDsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotCi0gIGdlbmVyYXRlX2RlbHBoaV9kb2Mob3V0LCB0c3RydWN0KTsKLSAgaW5kZW50KG91dCkgPDwgc3RydWN0X25hbWUgPDwgIiA9ICI7Ci0gIGlmIChpc19maW5hbCkgewotICAgIG91dCA8PCAic2VhbGVkICI7Ci0gIH0KLSAgb3V0IDw8ICJjbGFzcygiOwotICBpZiAoIGlzX2V4Y2VwdGlvbiAmJiAoISBpc194X2ZhY3RvcnkpKSB7Ci0gICAgb3V0IDw8ICJURXhjZXB0aW9uIjsKLSAgfSBlbHNlIHsKLSAgICBvdXQgPDwgIlRJbnRlcmZhY2VkT2JqZWN0LCBJQmFzZSwgIiA8PCBzdHJ1Y3RfaW50Zl9uYW1lOwotICB9Ci0gIG91dCA8PCAiKSIgPDwgZW5kbDsKLQotICBpZiAoaXNfZXhjZXB0aW9uICYmICghIGlzX3hfZmFjdG9yeSkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8ICJ0eXBlIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfZGVmaW5pdGlvbiggb3V0LCB0c3RydWN0LCBpc19leGNlcHRpb24sIGluX2NsYXNzLCBpc19yZXN1bHQsIHRydWUpOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfQotCi0gIGluZGVudChvdXQpIDw8ICJwcml2YXRlIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpZiAoaXNfZXhjZXB0aW9uICYmICghIGlzX3hfZmFjdG9yeSkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiRiIgPDwgZXhjZXB0aW9uX2ZhY3RvcnlfbmFtZSA8PCAiIDoiIDw8IHN0cnVjdF9pbnRmX25hbWUgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCptX2l0ZXIsIGZhbHNlLCAiRiIsIGlzX2V4Y2VwdGlvbikgPDwgZW5kbDsKLSAgfQotCi0gIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKLSAgICBpbmRlbnQob3V0KSA8PCBlbmRsOwotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7Ci0gICAgICAgIGlzc2V0X25hbWUgPSAiRl9faXNzZXRfIiArIHByb3BfbmFtZSgqbV9pdGVyLCBpc19leGNlcHRpb24pOwotICAgICAgICBpbmRlbnQob3V0KSA8PCBpc3NldF9uYW1lIDw8ICI6IEJvb2xlYW47IiA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGluZGVudChvdXQpIDw8IGVuZGw7Ci0KLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIGdlbmVyYXRlX2RlbHBoaV9wcm9wZXJ0eV9yZWFkZXJfZGVmaW5pdGlvbiggb3V0LCAqbV9pdGVyLCBpc19leGNlcHRpb24pOwotICAgIGdlbmVyYXRlX2RlbHBoaV9wcm9wZXJ0eV93cml0ZXJfZGVmaW5pdGlvbiggb3V0LCAqbV9pdGVyLCBpc19leGNlcHRpb24pOwotICB9Ci0KLSAgaWYgKHRzdHJ1Y3QtPmlzX3VuaW9uKCkpIHsKLSAgICBvdXQgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiLy8gQ2xlYXIgdmFsdWVzKGZvciB1bmlvbidzIHByb3BlcnR5IHNldHRlcikiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgInByb2NlZHVyZSBDbGVhclVuaW9uVmFsdWVzOyIgPDwgZW5kbDsKLSAgfQotCi0gIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKLSAgICBvdXQgPDwgZW5kbDsKLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgewotICAgICAgICBpc3NldF9uYW1lID0gIl9faXNzZXRfIiArIHByb3BfbmFtZSgqbV9pdGVyLCBpc19leGNlcHRpb24pOwotICAgICAgICBpbmRlbnQob3V0KSA8PCAiZnVuY3Rpb24gR2V0IiA8PCBpc3NldF9uYW1lIDw8ICI6IEJvb2xlYW47IiA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaWYgKChtZW1iZXJzLnNpemUoKSA+IDApICYmIGlzX2V4Y2VwdGlvbiAmJiAoISBpc194X2ZhY3RvcnkpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImNvbnN0cnVjdG9yIENyZWF0ZTsgb3ZlcmxvYWQ7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJjb25zdHJ1Y3RvciBDcmVhdGUoIiA8PCBjb25zdHJ1Y3Rvcl9hcmd1bWVudF9saXN0KCB0c3RydWN0LCBpbmRlbnQoKSkgPDwgIik7IG92ZXJsb2FkOyIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiY29uc3RydWN0b3IgQ3JlYXRlOyIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudChvdXQpIDw8ICJkZXN0cnVjdG9yIERlc3Ryb3k7IG92ZXJyaWRlOyIgPDwgZW5kbDsKLQotICBvdXQgIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJmdW5jdGlvbiBUb1N0cmluZzogc3RyaW5nOyBvdmVycmlkZTsiIDw8IGVuZGw7Ci0KLSAgaWYgKGlzX2V4Y2VwdGlvbiAmJiAoISBpc194X2ZhY3RvcnkpKSB7Ci0gICAgb3V0ICA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIvLyBFeGNlcHRpb24gRmFjdG9yeSIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAicHJvcGVydHkgIiA8PCBleGNlcHRpb25fZmFjdG9yeV9uYW1lIDw8ICI6ICIgPDwgc3RydWN0X2ludGZfbmFtZSA8PCAiIHJlYWQgRiIgPDwgZXhjZXB0aW9uX2ZhY3RvcnlfbmFtZSA8PCAiIHdyaXRlIEYiIDw8IGV4Y2VwdGlvbl9mYWN0b3J5X25hbWUgPDwgIjsiIDw8IGVuZGw7Ci0gIH0KLQotICBpZiAoKCEgaXNfZXhjZXB0aW9uKSB8fCBpc194X2ZhY3RvcnkpIHsKLSAgICBvdXQgIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIi8vIElCYXNlIiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJwcm9jZWR1cmUgUmVhZCggY29uc3QgaXByb3Q6IElQcm90b2NvbCk7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IG9wcm90OiBJUHJvdG9jb2wpOyIgPDwgZW5kbDsKLSAgfQotCi0gIGlmIChpc19leGNlcHRpb24gJiYgaXNfeF9mYWN0b3J5KSB7Ci0gICAgb3V0ICA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIvLyBDcmVhdGUgRXhjZXB0aW9uIE9iamVjdCIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiZnVuY3Rpb24gQ3JlYXRlRXhjZXB0aW9uOiAiIDw8IHR5cGVfbmFtZSh0c3RydWN0LHRydWUsdHJ1ZSkgPDwgIjsiIDw8IGVuZGw7Ci0gIH0KLQotICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7Ci0gICAgb3V0IDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIi8vIFByb3BlcnRpZXMiIDw8IGVuZGw7Ci0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgZ2VuZXJhdGVfcHJvcGVydHkob3V0LCAqbV9pdGVyLCB0cnVlLCBpc19leGNlcHRpb24pOwotICAgIH0KLSAgfQotCi0gIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKLSAgICBvdXQgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiLy8gaXNzZXQiIDw8IGVuZGw7Ci0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKLSAgICAgICAgaXNzZXRfbmFtZSA9ICJfX2lzc2V0XyIgKyBwcm9wX25hbWUoKm1faXRlciwgaXNfZXhjZXB0aW9uKTsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgInByb3BlcnR5ICIgPDwgaXNzZXRfbmFtZSA8PCAiOiBCb29sZWFuIHJlYWQgR2V0IiA8PCBpc3NldF9uYW1lIDw8ICI7IiA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgaW5kZW50X3VwKCk7Ci0gIGdlbmVyYXRlX2RlbHBoaV9kb2Moc19zZXJ2aWNlLCB0c2VydmljZSk7Ci0gIGluZGVudChzX3NlcnZpY2UpIDw8IG5vcm1hbGl6ZV9jbHNubShzZXJ2aWNlX25hbWVfLCAiVCIpIDw8ICIgPSBjbGFzcyIgPDwgZW5kbDsKLSAgaW5kZW50KHNfc2VydmljZSkgPDwgInB1YmxpYyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChzX3NlcnZpY2UpIDw8ICJ0eXBlIiA8PCBlbmRsOwotICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAiZW5kOyIgPDwgZW5kbDsKLSAgaW5kZW50KHNfc2VydmljZSkgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLX0KLQotdm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfaWZhY2UgPSAiIjsKLQotICBpbmRlbnRfdXAoKTsKLQotICBnZW5lcmF0ZV9kZWxwaGlfZG9jKHNfc2VydmljZSwgdHNlcnZpY2UpOwotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCksIHRydWUsIHRydWUpOwotICAgIGV4dGVuZHNfaWZhY2UgPSBleHRlbmRzICsgIi5JZmFjZSI7Ci0gICAgZ2VuZXJhdGVfZGVscGhpX2RvYyhzX3NlcnZpY2UsIHRzZXJ2aWNlKTsKLSAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PAotICAgICAgIklmYWNlID0gaW50ZXJmYWNlKCIgPDwgZXh0ZW5kc19pZmFjZSA8PCAiKSIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PAotICAgICAgIklmYWNlID0gaW50ZXJmYWNlIiA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50X3VwKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikKLSAgewotICAgIGdlbmVyYXRlX2RlbHBoaV9kb2Moc19zZXJ2aWNlLCAqZl9pdGVyKTsKLSAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PAotICAgICAgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KHNfc2VydmljZSkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotfQotCi12b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X3N0cnVjdCogdHMgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF9kZWZpbml0aW9uKHNfc2VydmljZSwgdHMsIGZhbHNlLCB0cnVlKTsKLSAgICBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X2ltcGwoc19zZXJ2aWNlX2ltcGwsIG5vcm1hbGl6ZV9jbHNubSggc2VydmljZV9uYW1lXywgIlQiKSArICIuIiwgdHMsIGZhbHNlKTsKLSAgICBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKCpmX2l0ZXIpOwotICB9Ci19Ci0KLXZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIGluZGVudF91cCgpOwotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19jbGllbnQgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBleHRlbmRzX2NsaWVudCA9IGV4dGVuZHMgKyAiLkNsaWVudCwgIjsKLSAgfQotCi0gIGdlbmVyYXRlX2RlbHBoaV9kb2Moc19zZXJ2aWNlLCB0c2VydmljZSk7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgZXh0ZW5kc19jbGllbnQgPSBleHRlbmRzICsgIi5UQ2xpZW50IjsKLSAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PAotICAgICAgIlRDbGllbnQgPSBjbGFzcygiIDw8IGV4dGVuZHNfY2xpZW50IDw8ICIsIElmYWNlKSIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PAotICAgICAgIlRDbGllbnQgPSBjbGFzcyggVEludGVyZmFjZWRPYmplY3QsIElmYWNlKSIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudChzX3NlcnZpY2UpIDw8ICJwdWJsaWMiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChzX3NlcnZpY2UpIDw8ICJjb25zdHJ1Y3RvciBDcmVhdGUoIHByb3Q6IElQcm90b2NvbCk7IG92ZXJsb2FkOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgICJjb25zdHJ1Y3RvciAiIDw8IG5vcm1hbGl6ZV9jbHNubSggc2VydmljZV9uYW1lXywgIlQiKSA8PCAiLlRDbGllbnQuQ3JlYXRlKCBwcm90OiBJUHJvdG9jb2wpOyIgPDwgZW5kbDsKLSAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICAiYmVnaW4iIDw8IGVuZGw7Ci0gIGluZGVudF91cF9pbXBsKCk7Ci0gIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiQ3JlYXRlKCBwcm90LCBwcm90ICk7IiA8PCBlbmRsOyAgICAKLSAgaW5kZW50X2Rvd25faW1wbCgpOwotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50KHNfc2VydmljZSkgPDwgImNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgaXByb3Q6IElQcm90b2NvbDsgY29uc3Qgb3Byb3Q6IElQcm90b2NvbCk7IG92ZXJsb2FkOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIAotICAgICJjb25zdHJ1Y3RvciAiIDw8IG5vcm1hbGl6ZV9jbHNubSggc2VydmljZV9uYW1lXywgIlQiKSA8PCAKLSAgICAiLlRDbGllbnQuQ3JlYXRlKCBjb25zdCBpcHJvdDogSVByb3RvY29sOyBjb25zdCBvcHJvdDogSVByb3RvY29sKTsiIDw8IGVuZGw7Ci0gIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAgImJlZ2luIiA8PCBlbmRsOwotICBpbmRlbnRfdXBfaW1wbCgpOwotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImluaGVyaXRlZCBDcmVhdGU7IiA8PCBlbmRsOyAgICAKLSAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJpcHJvdF8gOj0gaXByb3Q7IiA8PCBlbmRsOyAgICAKLSAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJvcHJvdF8gOj0gb3Byb3Q7IiA8PCBlbmRsOyAgICAKLSAgaW5kZW50X2Rvd25faW1wbCgpOwotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLQotICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgaW5kZW50KHNfc2VydmljZSkgPDwgInByb3RlY3RlZCIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAiaXByb3RfOiBJUHJvdG9jb2w7IiA8PCBlbmRsOwotICAgIGluZGVudChzX3NlcnZpY2UpIDw8ICJvcHJvdF86IElQcm90b2NvbDsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KHNfc2VydmljZSkgPDwgInNlcWlkXzogSW50ZWdlcjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLQotICAgIGluZGVudChzX3NlcnZpY2UpIDw8ICJwdWJsaWMiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KHNfc2VydmljZSkgPDwgInByb3BlcnR5IElucHV0UHJvdG9jb2w6IElQcm90b2NvbCByZWFkIGlwcm90XzsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KHNfc2VydmljZSkgPDwgInByb3BlcnR5IE91dHB1dFByb3RvY29sOiBJUHJvdG9jb2wgcmVhZCBvcHJvdF87IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0KLQotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAicHJvdGVjdGVkIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KHNfc2VydmljZSkgPDwgIi8vIElmYWNlIiA8PCBlbmRsOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIGdlbmVyYXRlX2RlbHBoaV9kb2Moc19zZXJ2aWNlLCAqZl9pdGVyKTsKLSAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfZG93bigpOwotCi0gIGluZGVudChzX3NlcnZpY2UpIDw8ICJwdWJsaWMiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIHN0cmluZyBmdWxsX2NscyA9IG5vcm1hbGl6ZV9jbHNubShzZXJ2aWNlX25hbWVfLCJUIikgKyAiLlRDbGllbnQiOwotCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0KLSAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIsIGZ1bGxfY2xzKSA8PCBlbmRsOwotICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiYmVnaW4iIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwX2ltcGwoKTsKLSAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInNlbmRfIiA8PCBmdW5uYW1lIDw8ICIoIjsKLQotICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotCi0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzX3NlcnZpY2VfaW1wbCA8PCAiLCAiOwotICAgICAgfQotICAgICAgc19zZXJ2aWNlX2ltcGwgPDwgbm9ybWFsaXplX25hbWUoICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLSAgICB9Ci0gICAgc19zZXJ2aWNlX2ltcGwgPDwgIik7IiA8PCBlbmRsOwotCi0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBzX3NlcnZpY2VfaW1wbCA8PCBpbmRlbnRfaW1wbCgpOwotICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBzX3NlcnZpY2VfaW1wbCA8PCAiUmVzdWx0IDo9ICI7Ci0gICAgICB9Ci0gICAgICBzX3NlcnZpY2VfaW1wbCA8PAotICAgICAgICAicmVjdl8iIDw8IGZ1bm5hbWUgPDwgIigpOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0gICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICB0X2Z1bmN0aW9uIHNlbmRfZnVuY3Rpb24oZ190eXBlX3ZvaWQsCi0gICAgICAgIHN0cmluZygic2VuZF8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKLSAgICAgICAgKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpKTsKLQotICAgIHN0cmluZyBhcmdzbmFtZSA9ICAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX2FyZ3MiOwotICAgIHN0cmluZyBhcmdzX2Nsc25tID0gbm9ybWFsaXplX2Nsc25tKCBhcmdzbmFtZSwgIlQiKTsKLSAgICBzdHJpbmcgYXJnc19pbnRmbm09IG5vcm1hbGl6ZV9jbHNubSggYXJnc25hbWUsICJJIik7Ci0KLSAgICBzdHJpbmcgYXJnc3ZhciA9IHRtcCgiX2FyZ3MiKTsKLSAgICBzdHJpbmcgbXNndmFyICA9IHRtcCgiX21zZyIpOwotCi0gICAgaW5kZW50KHNfc2VydmljZSkgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZzZW5kX2Z1bmN0aW9uKSA8PCBlbmRsOwotICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnNlbmRfZnVuY3Rpb24sIGZ1bGxfY2xzKSA8PCBlbmRsOwotICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAidmFyIiA8PCBlbmRsOwotICAgIGluZGVudF91cF9pbXBsKCk7Ci0gICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8IGFyZ3N2YXIgPDwgIiA6ICIgPDwgYXJnc19pbnRmbm0gPDwgIjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8IG1zZ3ZhciA8PCAiIDogVGhyaWZ0LlByb3RvY29sLklNZXNzYWdlOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0gICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJiZWdpbiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXBfaW1wbCgpOwotCi0gICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8Ci0gICAgICAic2VxaWRfIDo9IHNlcWlkXyArIDE7IiA8PCBlbmRsOwotICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PAotICAgICAgbXNndmFyIDw8ICIgOj0gVGhyaWZ0LlByb3RvY29sLlRNZXNzYWdlSW1wbC5DcmVhdGUoJyIgPDwgZnVubmFtZSA8PCAiJywgIiA8PAotICAgICAgKCgqZl9pdGVyKS0+aXNfb25ld2F5KCkgPyAiVE1lc3NhZ2VUeXBlLk9uZXdheSIgOiAiVE1lc3NhZ2VUeXBlLkNhbGwiKSA8PAotICAgICAgIiwgc2VxaWRfKTsiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwKLSAgICAgICJvcHJvdF8uV3JpdGVNZXNzYWdlQmVnaW4oICIgPDwgbXNndmFyIDw8ICIgKTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8Ci0gICAgICBhcmdzdmFyIDw8ICIgOj0gIiA8PCBhcmdzX2Nsc25tIDw8ICJJbXBsLkNyZWF0ZSgpOyIgPDwgZW5kbDsKLQotICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwKLSAgICAgICAgYXJnc3ZhciA8PCAiLiIgPDwgcHJvcF9uYW1lKCpmbGRfaXRlcikgPDwgIiA6PSAiIDw8IG5vcm1hbGl6ZV9uYW1lKCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCBhcmdzdmFyIDw8ICIuV3JpdGUob3Byb3RfKTsiIDw8IGVuZGw7Ci0gICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKLSAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PAotICAgICAgICBhcmdzdmFyIDw8ICIuIiA8PCBwcm9wX25hbWUoKmZsZF9pdGVyKSA8PCAiIDo9ICIgPDwgZW1wdHlfdmFsdWUoKCpmbGRfaXRlciktPmdldF90eXBlKCkpIDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAib3Byb3RfLldyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIm9wcm90Xy5UcmFuc3BvcnQuRmx1c2goKTsiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0gICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIHN0cmluZyBvcmdfcmVzdWx0bmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcmVzdWx0IiA7Ci0gICAgICBzdHJpbmcgcmVzdWx0X2Nsc25tID0gbm9ybWFsaXplX2Nsc25tKCBvcmdfcmVzdWx0bmFtZSwgIlQiKTsKLSAgICAgIHN0cmluZyByZXN1bHRfaW50Zm5tID0gbm9ybWFsaXplX2Nsc25tKCBvcmdfcmVzdWx0bmFtZSwgIkkiKTsKLQotICAgICAgdF9zdHJ1Y3Qgbm9hcmdzKHByb2dyYW1fKTsKLSAgICAgIHRfZnVuY3Rpb24gcmVjdl9mdW5jdGlvbigoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCi0gICAgICAgICAgc3RyaW5nKCJyZWN2XyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAotICAgICAgICAgICZub2FyZ3MsCi0gICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCkpOwotCi0gICAgICB0X3N0cnVjdCAqeHMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKLSAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7Ci0KLSAgICAgIHN0cmluZyBleGNlcHR2YXIgPSB0bXAoIl9leCIpOwotICAgICAgc3RyaW5nIGFwcGV4dmFyID0gdG1wKCJfYXgiKTsKLSAgICAgIHN0cmluZyByZXR2YXIgPSB0bXAoIl9yZXQiKTsKLQotICAgICAgaW5kZW50KHNfc2VydmljZSkgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZyZWN2X2Z1bmN0aW9uKSA8PCBlbmRsOwotICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmcmVjdl9mdW5jdGlvbiwgZnVsbF9jbHMpIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInZhciIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cF9pbXBsKCk7Ci0gICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgbXNndmFyIDw8ICIgOiBUaHJpZnQuUHJvdG9jb2wuSU1lc3NhZ2U7IiA8PCBlbmRsOwotICAgICAgaWYgKCB4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgewotICAgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgZXhjZXB0dmFyIDw8ICIgOiBFeGNlcHRpb247IiA8PCBlbmRsOwotICAgICAgfQotICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8IGFwcGV4dmFyIDw8ICIgOiBUQXBwbGljYXRpb25FeGNlcHRpb247IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8IHJldHZhciA8PCAiIDogIiA8PCByZXN1bHRfaW50Zm5tIDw8ICI7IiA8PCBlbmRsOwotCi0gICAgICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0gICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImJlZ2luIiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwX2ltcGwoKTsKLSAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCBtc2d2YXIgPDwgIiA6PSBpcHJvdF8uUmVhZE1lc3NhZ2VCZWdpbigpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiaWYgKCIgPDwgbXNndmFyIDw8ICIuVHlwZV8gPSBUTWVzc2FnZVR5cGUuRXhjZXB0aW9uKSB0aGVuIiA8PCBlbmRsOwotICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJiZWdpbiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cF9pbXBsKCk7Ci0gICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgYXBwZXh2YXIgPDwgIiA6PSBUQXBwbGljYXRpb25FeGNlcHRpb24uUmVhZChpcHJvdF8pOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiaXByb3RfLlJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJyYWlzZSAiIDw8IGFwcGV4dmFyIDw8ICI7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd25faW1wbCgpOwotICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsOwotCi0gICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgcmV0dmFyIDw8ICIgOj0gIiA8PCByZXN1bHRfY2xzbm0gPDwgIkltcGwuQ3JlYXRlKCk7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8IHJldHZhciA8PCAiLlJlYWQoaXByb3RfKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImlwcm90Xy5SZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKLQotICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImlmICgiIDw8IHJldHZhciA8PCAiLl9faXNzZXRfc3VjY2VzcykgdGhlbiIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJiZWdpbiIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X3VwX2ltcGwoKTsKLSAgICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJSZXN1bHQgOj0gIiA8PCByZXR2YXIgPDwgIi5TdWNjZXNzOyIgPDwgZW5kbDsKLSAgICAgICAgdF90eXBlICp0eXBlID0gKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpOwotICAgICAgICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSB8fCB0eXBlLT5pc19tYXAoKSB8fCB0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgcmV0dmFyIDw8ICIuU3VjY2VzcyA6PSBuaWw7IiA8PCBlbmRsOwotICAgICAgICB9Ci0gICAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiRXhpdDsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF9kb3duX2ltcGwoKTsKLSAgICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0gICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImlmICgiIDw8IHJldHZhciA8PCAiLl9faXNzZXRfIiA8PCBwcm9wX25hbWUoKnhfaXRlcikgPDwgIikgdGhlbiIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJiZWdpbiIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X3VwX2ltcGwoKTsKLSAgICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8IGV4Y2VwdHZhciA8PCAiIDo9ICIgPDwgcmV0dmFyIDw8ICIuIiA8PCBwcm9wX25hbWUoKnhfaXRlcikgPDwgIi5DcmVhdGVFeGNlcHRpb247IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInJhaXNlICIgPDwgZXhjZXB0dmFyIDw8ICI7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0gICAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZW5kOyIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgCi0gICAgICAgICAgInJhaXNlIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5DcmVhdGUoVEFwcGxpY2F0aW9uRXhjZXB0aW9uLlRFeGNlcHRpb25UeXBlLk1pc3NpbmdSZXN1bHQsICciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZhaWxlZDogdW5rbm93biByZXN1bHQnKTsiIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIGluZGVudF9kb3duX2ltcGwoKTsKLSAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChzX3NlcnZpY2UpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotCi0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIHN0cmluZyBleHRlbmRzX3Byb2Nlc3NvciA9ICIiOwotCi0gIHN0cmluZyBmdWxsX2NscyA9IG5vcm1hbGl6ZV9jbHNubSggc2VydmljZV9uYW1lXywgIlQiKSArICIuVFByb2Nlc3NvckltcGwiOwotCi0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgZXh0ZW5kc19wcm9jZXNzb3IgPSBleHRlbmRzICsgIi5UUHJvY2Vzc29ySW1wbCI7Ci0gICAgaW5kZW50KHNfc2VydmljZSkgPDwKLSAgICAgICJUUHJvY2Vzc29ySW1wbCA9IGNsYXNzKCIgPDwgZXh0ZW5kc19wcm9jZXNzb3IgPDwgIiwgSVByb2Nlc3NvcikiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgaW5kZW50KHNfc2VydmljZSkgPDwKLSAgICAgICJUUHJvY2Vzc29ySW1wbCA9IGNsYXNzKCBUSW50ZXJmYWNlZE9iamVjdCwgSVByb2Nlc3NvcikiIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAicHVibGljIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KHNfc2VydmljZSkgPDwgImNvbnN0cnVjdG9yIENyZWF0ZSggaWZhY2VfOiBJZmFjZSApOyIgPDwgZW5kbDsKLSAgaW5kZW50KHNfc2VydmljZSkgPDwgImRlc3RydWN0b3IgRGVzdHJveTsgb3ZlcnJpZGU7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotCi0gIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiY29uc3RydWN0b3IgIiA8PCBmdWxsX2NscyA8PCAiLkNyZWF0ZSggaWZhY2VfOiBJZmFjZSApOyIgPDwgZW5kbDsKLSAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJiZWdpbiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwX2ltcGwoKTsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpCi0gIHsKLSAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImluaGVyaXRlZCBDcmVhdGUoIGlmYWNlXyk7IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiaW5oZXJpdGVkIENyZWF0ZTsiIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJTZWxmLmlmYWNlXyA6PSBpZmFjZV87IiA8PCBlbmRsOwotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkKLSAgewotICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiQVNTRVJUKCBwcm9jZXNzTWFwXyA8PiBuaWwpOyAgLy8gaW5oZXJpdGVkIiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAicHJvY2Vzc01hcF8gOj0gVFRocmlmdERpY3Rpb25hcnlJbXBsPHN0cmluZywgVFByb2Nlc3NGdW5jdGlvbj4uQ3JlYXRlOyIgPDwgZW5kbDsKLSAgfQotCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8IAotICAgICAgInByb2Nlc3NNYXBfLkFkZE9yU2V0VmFsdWUoICciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJywgIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIl9Qcm9jZXNzKTsiIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50X2Rvd25faW1wbCgpOwotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImRlc3RydWN0b3IgIiA8PCBmdWxsX2NscyA8PCAiLkRlc3Ryb3k7IiA8PCBlbmRsOwotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImJlZ2luIiA8PCBlbmRsOwotICBpbmRlbnRfdXBfaW1wbCgpOwotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImluaGVyaXRlZDsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duX2ltcGwoKTsKLSAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50KHNfc2VydmljZSkgPDwgInByaXZhdGUiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAiaWZhY2VfOiBJZmFjZTsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpID09IE5VTEwpCi0gIHsKLSAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAicHJvdGVjdGVkIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChzX3NlcnZpY2UpIDw8ICJ0eXBlIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChzX3NlcnZpY2UpIDw8ICJUUHJvY2Vzc0Z1bmN0aW9uID0gcmVmZXJlbmNlIHRvIHByb2NlZHVyZSggc2VxaWQ6IEludGVnZXI7IGNvbnN0IGlwcm90OiBJUHJvdG9jb2w7IGNvbnN0IG9wcm90OiBJUHJvdG9jb2wiICA8PAotICAgICAgKGV2ZW50c18gPyAiOyBjb25zdCBldmVudHMgOiBJUmVxdWVzdEV2ZW50cyIgOiAiIikgPDwKLSAgICAgICIpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KHNfc2VydmljZSkgPDwgInByb3RlY3RlZCIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAicHJvY2Vzc01hcF86IElUaHJpZnREaWN0aW9uYXJ5PHN0cmluZywgVFByb2Nlc3NGdW5jdGlvbj47IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0KLQotICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAicHVibGljIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgewotICAgIGluZGVudChzX3NlcnZpY2UpIDw8ICJmdW5jdGlvbiBQcm9jZXNzKCBjb25zdCBpcHJvdDogSVByb3RvY29sOyBjb25zdCBvcHJvdDogSVByb3RvY29sOyBjb25zdCBldmVudHMgOiBJUHJvY2Vzc29yRXZlbnRzKTogQm9vbGVhbjsiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgaW5kZW50KHNfc2VydmljZSkgPDwgImZ1bmN0aW9uIFByb2Nlc3MoIGNvbnN0IGlwcm90OiBJUHJvdG9jb2w7IGNvbnN0IG9wcm90OiBJUHJvdG9jb2w7IGNvbnN0IGV2ZW50cyA6IElQcm9jZXNzb3JFdmVudHMpOiBCb29sZWFuOyByZWludHJvZHVjZTsiIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImZ1bmN0aW9uICIgPDwgZnVsbF9jbHMgPDwgIi5Qcm9jZXNzKCBjb25zdCBpcHJvdDogSVByb3RvY29sOyBjb25zdCBvcHJvdDogSVByb3RvY29sOyBjb25zdCBldmVudHMgOiBJUHJvY2Vzc29yRXZlbnRzKTogQm9vbGVhbjsiIDw8IGVuZGw7OwotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInZhciIgPDwgZW5kbDsKLSAgaW5kZW50X3VwX2ltcGwoKTsKLSAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJtc2cgOiBUaHJpZnQuUHJvdG9jb2wuSU1lc3NhZ2U7IiA8PCBlbmRsOwotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImZuIDogVFByb2Nlc3NGdW5jdGlvbjsiIDw8IGVuZGw7Ci0gIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAieCA6IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjsiIDw8IGVuZGw7Ci0gIGlmKCBldmVudHNfKSB7Ci0gICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJjb250ZXh0IDogSVJlcXVlc3RFdmVudHM7IiA8PCBlbmRsOwotICB9Ci0gIGluZGVudF9kb3duX2ltcGwoKTsKLSAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJiZWdpbiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwX2ltcGwoKTsKLSAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJ0cnkiIDw8IGVuZGw7Ci0gIGluZGVudF91cF9pbXBsKCk7Ci0gIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAibXNnIDo9IGlwcm90LlJlYWRNZXNzYWdlQmVnaW4oKTsiIDw8IGVuZGw7Ci0gIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZm4gOj0gbmlsOyIgPDwgZW5kbDsKLSAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJpZiBub3QgcHJvY2Vzc01hcF8uVHJ5R2V0VmFsdWUobXNnLk5hbWUsIGZuKSIgPDwgZW5kbDsKLSAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJvciBub3QgQXNzaWduZWQoZm4pIHRoZW4iIDw8IGVuZGw7Ci0gIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiYmVnaW4iIDw8IGVuZGw7Ci0gIGluZGVudF91cF9pbXBsKCk7Ci0gIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiVFByb3RvY29sVXRpbC5Ta2lwKGlwcm90LCBUVHlwZS5TdHJ1Y3QpOyIgPDwgZW5kbDsKLSAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJpcHJvdC5SZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKLSAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJ4IDo9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5DcmVhdGUoVEFwcGxpY2F0aW9uRXhjZXB0aW9uLlRFeGNlcHRpb25UeXBlLlVua25vd25NZXRob2QsICdJbnZhbGlkIG1ldGhvZCBuYW1lOiAnJycgKyBtc2cuTmFtZSArICcnJycpOyIgPDwgZW5kbDsKLSAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJtc2cgOj0gVGhyaWZ0LlByb3RvY29sLlRNZXNzYWdlSW1wbC5DcmVhdGUobXNnLk5hbWUsIFRNZXNzYWdlVHlwZS5FeGNlcHRpb24sIG1zZy5TZXFJRCk7IiA8PCBlbmRsOwotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIm9wcm90LldyaXRlTWVzc2FnZUJlZ2luKCBtc2cpOyIgPDwgZW5kbDsKLSAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJ4LldyaXRlKG9wcm90KTsiIDw8IGVuZGw7Ci0gIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAib3Byb3QuV3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOwotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIm9wcm90LlRyYW5zcG9ydC5GbHVzaCgpOyIgPDwgZW5kbDsKLSAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJSZXN1bHQgOj0gVHJ1ZTsiIDw8IGVuZGw7Ci0gIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiRXhpdDsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duX2ltcGwoKTsKLSAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsOwotICBpZiggZXZlbnRzXykgewotICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiaWYgZXZlbnRzIDw+IG5pbCIgPDwgZW5kbDsKLSAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInRoZW4gY29udGV4dCA6PSBldmVudHMuQ3JlYXRlUmVxdWVzdENvbnRleHQobXNnLk5hbWUpIiA8PCBlbmRsOwotICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZWxzZSBjb250ZXh0IDo9IG5pbDsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJ0cnkiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwX2ltcGwoKTsKLSAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImZuKG1zZy5TZXFJRCwgaXByb3QsIG9wcm90LCBjb250ZXh0KTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd25faW1wbCgpOwotICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZmluYWxseSIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXBfaW1wbCgpOwotICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiaWYgY29udGV4dCA8PiBuaWwgdGhlbiBiZWdpbiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXBfaW1wbCgpOwotICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiY29udGV4dC5DbGVhbnVwQ29udGV4dDsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJjb250ZXh0IDo9IG5pbDsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd25faW1wbCgpOwotICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZW5kOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0gICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZm4obXNnLlNlcUlELCBpcHJvdCwgb3Byb3QpOyIgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0gIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZXhjZXB0IiA8PCBlbmRsOwotICBpbmRlbnRfdXBfaW1wbCgpOwotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIlJlc3VsdCA6PSBGYWxzZTsiIDw8IGVuZGw7Ci0gIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiRXhpdDsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duX2ltcGwoKTsKLSAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsOwotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIlJlc3VsdCA6PSBUcnVlOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd25faW1wbCgpOwotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikKLSAgewotICAgIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odHNlcnZpY2UsICpmX2l0ZXIpOwotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KHNfc2VydmljZSkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKLQotfQotCi12b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7Ci0gIHRfZmllbGQgc3VjY2Vzcyh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksICJTdWNjZXNzIiwgMCk7Ci0gIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKLSAgfQotCi0gIHRfc3RydWN0ICp4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHJlc3VsdC5hcHBlbmQoKmZfaXRlcik7Ci0gIH0KLQotICBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X2RlZmluaXRpb24oc19zZXJ2aWNlLCAmcmVzdWx0LCBmYWxzZSwgdHJ1ZSwgdHJ1ZSk7Ci0gIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfaW1wbChzX3NlcnZpY2VfaW1wbCwgbm9ybWFsaXplX2Nsc25tKCBzZXJ2aWNlX25hbWVfLCAiVCIpICsgIi4iLCAmcmVzdWx0LCBmYWxzZSk7Ci19Ci0KLXZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICAodm9pZCkgdHNlcnZpY2U7Ci0gIHN0cmluZyBmdW5jbmFtZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKTsKLSAgc3RyaW5nIGZ1bGxfY2xzID0gbm9ybWFsaXplX2Nsc25tKCBzZXJ2aWNlX25hbWVfLCAiVCIpICsgIi5UUHJvY2Vzc29ySW1wbCI7Ci0KLSAgc3RyaW5nIG9yZ19hcmdzbmFtZSAgPSBmdW5jbmFtZSArICJfYXJncyI7Ci0gIHN0cmluZyBhcmdzX2Nsc25tID0gbm9ybWFsaXplX2Nsc25tKG9yZ19hcmdzbmFtZSwgIlQiKTsKLSAgc3RyaW5nIGFyZ3NfaW50Zm5tID0gbm9ybWFsaXplX2Nsc25tKG9yZ19hcmdzbmFtZSwgIkkiKTsKLQotICBzdHJpbmcgb3JnX3Jlc3VsdG5hbWUgPSBmdW5jbmFtZSArICJfcmVzdWx0IjsKLSAgc3RyaW5nIHJlc3VsdF9jbHNubSA9IG5vcm1hbGl6ZV9jbHNubShvcmdfcmVzdWx0bmFtZSwgIlQiKTsKLSAgc3RyaW5nIHJlc3VsdF9pbnRmbm0gPSBub3JtYWxpemVfY2xzbm0ob3JnX3Jlc3VsdG5hbWUsICJJIik7Ci0KLSAgaW5kZW50KHNfc2VydmljZSkgPDwKLSAgICAicHJvY2VkdXJlICIgPDwgZnVuY25hbWUgPDwgIl9Qcm9jZXNzKCBzZXFpZDogSW50ZWdlcjsgY29uc3QgaXByb3Q6IElQcm90b2NvbDsgY29uc3Qgb3Byb3Q6IElQcm90b2NvbCIgPDwKLSAgICAoZXZlbnRzXyA/ICI7IGNvbnN0IGV2ZW50cyA6IElSZXF1ZXN0RXZlbnRzIiA6ICIiKSA8PCAKLSAgICAiKTsiIDw8IGVuZGw7Ci0KLSAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIi8vIG9uZSB3YXkgcHJvY2Vzc29yIiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiLy8gYm90aCB3YXkgcHJvY2Vzc29yIiA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8Ci0gICAgInByb2NlZHVyZSAiIDw8IGZ1bGxfY2xzIDw8ICIuIiA8PCBmdW5jbmFtZSA8PCAiX1Byb2Nlc3MoIHNlcWlkOiBJbnRlZ2VyOyBjb25zdCBpcHJvdDogSVByb3RvY29sOyBjb25zdCBvcHJvdDogSVByb3RvY29sIiA8PAotICAgIChldmVudHNfID8gIjsgY29uc3QgZXZlbnRzIDogSVJlcXVlc3RFdmVudHMiIDogIiIpIDw8IAotICAgICIpOyIgPDwgZW5kbDsKLSAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJ2YXIiIDw8IGVuZGw7Ci0gIGluZGVudF91cF9pbXBsKCk7Ci0gIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiYXJnczogIiA8PCBhcmdzX2ludGZubSA8PCAiOyIgPDwgZW5kbDsKLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJtc2c6IFRocmlmdC5Qcm90b2NvbC5JTWVzc2FnZTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJyZXQ6ICIgPDwgcmVzdWx0X2ludGZubSA8PCAiOyIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudF9kb3duX2ltcGwoKTsKLSAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJiZWdpbiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwX2ltcGwoKTsKLSAgCi0gIGlmKCBldmVudHNfKSB7Ci0gICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJpZiBldmVudHMgPD4gbmlsIHRoZW4gZXZlbnRzLlByZVJlYWQ7IiA8PCBlbmRsOwotICB9Ci0gIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiYXJncyA6PSAiIDw8IGFyZ3NfY2xzbm0gPDwgIkltcGwuQ3JlYXRlOyIgPDwgZW5kbDsKLSAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJhcmdzLlJlYWQoaXByb3QpOyIgPDwgZW5kbDsKLSAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJpcHJvdC5SZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKLSAgaWYoIGV2ZW50c18pIHsKLSAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImlmIGV2ZW50cyA8PiBuaWwgdGhlbiBldmVudHMuUG9zdFJlYWQ7IiA8PCBlbmRsOwotICB9Ci0KLSAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLQotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInJldCA6PSAiIDw8IHJlc3VsdF9jbHNubSA8PCAiSW1wbC5DcmVhdGU7IiA8PCBlbmRsOwotICB9Ci0KLSAgaWYgKGV2ZW50c18gfHwgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmIHhjZXB0aW9ucy5zaXplKCkgPiAwKSkgewotICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAidHJ5IiA8PCBlbmRsOwotICAgIGluZGVudF91cF9pbXBsKCk7Ci0gIH0KLQotICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgc19zZXJ2aWNlX2ltcGwgPDwgaW5kZW50X2ltcGwoKTsKLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgIHNfc2VydmljZV9pbXBsIDw8ICJyZXQuU3VjY2VzcyA6PSAiOwotICB9Ci0gIHNfc2VydmljZV9pbXBsIDw8ICAiaWZhY2VfLiIgPDwgbm9ybWFsaXplX25hbWUoIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSwgdHJ1ZSkgPDwgIigiOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHNfc2VydmljZV9pbXBsIDw8ICIsICI7Ci0gICAgfQotICAgIHNfc2VydmljZV9pbXBsIDw8ICJhcmdzLiIgPDwgcHJvcF9uYW1lKCpmX2l0ZXIpOwotICB9Ci0gIHNfc2VydmljZV9pbXBsIDw8ICIpOyIgPDwgZW5kbDsKLQotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PAotICAgICAgImFyZ3MuIiA8PCBwcm9wX25hbWUoKmZfaXRlcikgPDwgIiA6PSAiIDw8IGVtcHR5X3ZhbHVlKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIjsiIDw8IGVuZGw7Ci0gIH0KLQotICBpZiAoZXZlbnRzXyB8fCAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgeGNlcHRpb25zLnNpemUoKSA+IDApKSB7Ci0gICAgaW5kZW50X2Rvd25faW1wbCgpOwotICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZXhjZXB0IiA8PCBlbmRsOwotICAgIGluZGVudF91cF9pbXBsKCk7Ci0gICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAib24gRTogIiA8PCB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLHRydWUsdHJ1ZSkgPDwgIiBkbyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiYmVnaW4iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXBfaW1wbCgpOwotICAgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgICAgIHN0cmluZyBmYWN0b3J5X25hbWUgPSBub3JtYWxpemVfY2xzbm0oKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpLCIiLHRydWUpICsgIkZhY3RvcnkiOwotICAgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgCi0gICAgICAgICAgInJldC4iIDw8IHByb3BfbmFtZSgqeF9pdGVyKSA8PCAiIDo9IEUuIiA8PCBmYWN0b3J5X25hbWUgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0gICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGlmKCBldmVudHNfKSB7Ci0gICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIm9uIEU6IEV4Y2VwdGlvbiBkbyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiYmVnaW4iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXBfaW1wbCgpOwotICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJpZiBldmVudHMgPD4gbmlsIHRoZW4gZXZlbnRzLlVuaGFuZGxlZEVycm9yKEUpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAicmFpc2U7IC8vIGxldCBpdCBidWJibGUgdXAiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0gICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudF9kb3duX2ltcGwoKTsKLSAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGw7Ci0gIH0KLQotICBpZiAoISB0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgaWYgKGV2ZW50c18pIHsKLSAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiaWYgZXZlbnRzIDw+IG5pbCB0aGVuIGV2ZW50cy5QcmVXcml0ZTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAibXNnIDo9IFRocmlmdC5Qcm90b2NvbC5UTWVzc2FnZUltcGwuQ3JlYXRlKCciIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiJywgVE1lc3NhZ2VUeXBlLlJlcGx5LCBzZXFpZCk7ICIgPDwgZW5kbDsKLSAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIm9wcm90LldyaXRlTWVzc2FnZUJlZ2luKCBtc2cpOyAiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJyZXQuV3JpdGUob3Byb3QpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIm9wcm90LldyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIm9wcm90LlRyYW5zcG9ydC5GbHVzaCgpOyIgPDwgZW5kbDsKLSAgICBpZiAoZXZlbnRzXykgewotICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJpZiBldmVudHMgPD4gbmlsIHRoZW4gZXZlbnRzLlBvc3RXcml0ZTsiIDw8IGVuZGw7Ci0gICAgfQotICB9IGVsc2UgaWYgKGV2ZW50c18pIHsKLSAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImlmIGV2ZW50cyA8PiBuaWwgdGhlbiBldmVudHMuT25ld2F5Q29tcGxldGU7IiA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50X2Rvd25faW1wbCgpOwotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwgYm9vbCBpc194Y2VwdGlvbiwgdF9maWVsZCogdGZpZWxkLCBzdHJpbmcgcHJlZml4LCBvc3RyZWFtJiBsb2NhbF92YXJzKSB7Ci0gIHRfdHlwZSogdHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKLSAgd2hpbGUodHlwZS0+aXNfdHlwZWRlZigpKSB7Ci0gICAgdHlwZSA9ICgodF90eXBlZGVmKil0eXBlKS0+Z2V0X3R5cGUoKTsKLSAgfQotCi0gIGlmICh0eXBlLT5pc192b2lkKCkpIHsKLSAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIERFU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIHN0cmluZyBuYW1lID0gcHJlZml4ICsgcHJvcF9uYW1lKHRmaWVsZCxpc194Y2VwdGlvbik7Ci0KLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIG5hbWUsICIiKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIGlzX3hjZXB0aW9uLCB0eXBlLCBuYW1lLCBsb2NhbF92YXJzKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBpbmRlbnRfaW1wbChvdXQpIDw8Ci0gICAgICBuYW1lIDw8ICIgOj0gIjsKLQotICAgIGlmICh0eXBlLT5pc19lbnVtKCkpCi0gICAgewotICAgICAgb3V0IDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSkgPDwgIigiOwotICAgIH0KLQotICAgIG91dCA8PCAiaXByb3QuIjsKLQotICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgICBpZiAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICAgICAgICAgaWYgKGFuc2lzdHJfYmluYXJ5XykgewotICAgICAgICAgICAgICAgb3V0IDw8ICJSZWFkQW5zaVN0cmluZygpOyI7Ci0gICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgIG91dCA8PCAiUmVhZEJpbmFyeSgpOyI7Ci0gICAgICAgICAgICAgfQotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBvdXQgPDwgIlJlYWRTdHJpbmcoKTsiOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICAgIG91dCA8PCAiUmVhZEJvb2woKTsiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgICAgb3V0IDw8ICJSZWFkQnl0ZSgpOyI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICAgIG91dCA8PCAiUmVhZEkxNigpOyI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICAgIG91dCA8PCAiUmVhZEkzMigpOyI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICAgIG91dCA8PCAiUmVhZEk2NCgpOyI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICAgIG91dCA8PCAiUmVhZERvdWJsZSgpOyI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBEZWxwaGkgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICBvdXQgPDwgIlJlYWRJMzIoKSI7Ci0gICAgICBvdXQgPDwgIik7IjsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gREVTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLCB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7Ci0gIH0KLX0KLQotdm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgbmFtZSwgc3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcgdHlwX25hbWU7Ci0KLSAgaWYgKHRzdHJ1Y3QtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICB0eXBfbmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0LHRydWUsZmFsc2UsdHJ1ZSx0cnVlKTsKLSAgfSBlbHNlIHsKLSAgICB0eXBfbmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0LHRydWUsZmFsc2UpOwotICB9Ci0KLSAgaW5kZW50X2ltcGwob3V0KSA8PCBwcmVmaXggPDwgbmFtZSA8PCAiIDo9ICIgPDwgdHlwX25hbWUgPDwgIi5DcmVhdGU7IiA8PCBlbmRsOwotICBpbmRlbnRfaW1wbChvdXQpIDw8IHByZWZpeCA8PCBuYW1lIDw8ICIuUmVhZChpcHJvdCk7IiA8PCBlbmRsOwotfQotCi12b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwgYm9vbCBpc194Y2VwdGlvbiwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIG5hbWUsIHN0ZDo6b3N0cmVhbSYgbG9jYWxfdmFycykgewotCi0gIHN0cmluZyBvYmo7Ci0gIHN0cmluZyBjb3VudGVyOwotICBzdHJpbmcgbG9jYWxfdmFyOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBvYmogPSB0bXAoIl9tYXAiKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBvYmogPSB0bXAoIl9zZXQiKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgb2JqID0gdG1wKCJfbGlzdCIpOwotICB9Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGxvY2FsX3ZhciA9IG9iaiArICI6IElNYXA7IjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBsb2NhbF92YXIgPSBvYmogKyAiOiBJU2V0OyI7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGxvY2FsX3ZhciA9IG9iaiArICI6IElMaXN0OyI7Ci0gIH0KLSAgbG9jYWxfdmFycyA8PCAiICAiIDw8IGxvY2FsX3ZhciA8PCBlbmRsOwotICBjb3VudGVyID0gdG1wKCJfaSIpOwotICBsb2NhbF92YXIgPSBjb3VudGVyICsgIjogSW50ZWdlcjsiOwotICBsb2NhbF92YXJzIDw8ICIgICIgPDwgbG9jYWxfdmFyIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2ltcGwob3V0KSA8PCBuYW1lIDw8ICIgOj0gIiA8PCB0eXBlX25hbWUodHR5cGUsIHRydWUpIDw8ICIuQ3JlYXRlOyIgPDwgZW5kbDsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50X2ltcGwob3V0KSA8PCBvYmogPDwgIiA6PSBpcHJvdC5SZWFkTWFwQmVnaW4oKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50X2ltcGwob3V0KSA8PCBvYmogPDwgIiA6PSBpcHJvdC5SZWFkU2V0QmVnaW4oKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudF9pbXBsKG91dCkgPDwgb2JqIDw8ICIgOj0gaXByb3QuUmVhZExpc3RCZWdpbigpOyIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudF9pbXBsKG91dCkgPDwgCi0gICAgImZvciAiIDw8IGNvdW50ZXIgPDwgIiA6PSAwIHRvICIgPDwgb2JqIDw8ICIuQ291bnQgLSAxIGRvIiA8PCBlbmRsOwotICBpbmRlbnRfaW1wbChvdXQpIDw8ICAiYmVnaW4iIDw8IGVuZGw7Ci0gIGluZGVudF91cF9pbXBsKCk7Ci0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsIGlzX3hjZXB0aW9uLCAodF9tYXAqKXR0eXBlLCBuYW1lLCBsb2NhbF92YXJzKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsIGlzX3hjZXB0aW9uLCAodF9zZXQqKXR0eXBlLCBuYW1lLCBsb2NhbF92YXJzKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgaXNfeGNlcHRpb24sICh0X2xpc3QqKXR0eXBlLCBuYW1lLCBsb2NhbF92YXJzKTsKLSAgfQotICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0gIGluZGVudF9pbXBsKG91dCkgPDwgImVuZDsiIDw8IGVuZGw7Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudF9pbXBsKG91dCkgPDwgImlwcm90LlJlYWRNYXBFbmQoKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50X2ltcGwob3V0KSA8PCAiaXByb3QuUmVhZFNldEVuZCgpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50X2ltcGwob3V0KSA8PCAiaXByb3QuUmVhZExpc3RFbmQoKTsiIDw8IGVuZGw7Ci0gIH0KLX0KLQotdm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwgYm9vbCBpc194Y2VwdGlvbiwgdF9tYXAqIHRtYXAsIHN0cmluZyBwcmVmaXgsIG9zdHJlYW0mIGxvY2FsX3ZhcnMpIHsKLQotICBzdHJpbmcga2V5ID0gdG1wKCJfa2V5Iik7Ci0gIHN0cmluZyB2YWwgPSB0bXAoIl92YWwiKTsKLSAgc3RyaW5nIGxvY2FsX3ZhcjsKLQotICB0X2ZpZWxkIGZrZXkodG1hcC0+Z2V0X2tleV90eXBlKCksIGtleSk7Ci0gIHRfZmllbGQgZnZhbCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdmFsKTsKLQotICBsb2NhbF92YXJzIDw8ICIgICIgPDwgZGVjbGFyZV9maWVsZCgmZmtleSkgPDwgZW5kbDsKLSAgbG9jYWxfdmFycyA8PCAiICAiIDw8IGRlY2xhcmVfZmllbGQoJmZ2YWwpIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCBpc194Y2VwdGlvbiwgJmZrZXksICIiLCBsb2NhbF92YXJzKTsKLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCBpc194Y2VwdGlvbiwgJmZ2YWwsICIiLCBsb2NhbF92YXJzKTsKLQotICBpbmRlbnRfaW1wbChvdXQpIDw8Ci0gICAgcHJlZml4IDw8ICIuQWRkT3JTZXRWYWx1ZSggIiA8PCBrZXkgPDwgIiwgIiA8PCB2YWwgPDwgIik7IiA8PCBlbmRsOwotCi19Ci0KLXZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsIGJvb2wgaXNfeGNlcHRpb24sIHRfc2V0KiB0c2V0LCBzdHJpbmcgcHJlZml4LCBvc3RyZWFtJiBsb2NhbF92YXJzKSB7Ci0gIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOwotICB0X2ZpZWxkIGZlbGVtKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7Ci0gIGxvY2FsX3ZhcnMgPDwgIiAgIiA8PCBkZWNsYXJlX2ZpZWxkKCZmZWxlbSkgPDwgZW5kbDsKLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCBpc194Y2VwdGlvbiwgJmZlbGVtLCAiIiwgbG9jYWxfdmFycyk7Ci0gIGluZGVudF9pbXBsKG91dCkgPDwKLSAgICBwcmVmaXggPDwgIi5BZGQoIiA8PCBlbGVtIDw8ICIpOyIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsIGJvb2wgaXNfeGNlcHRpb24sIHRfbGlzdCogdGxpc3QsIHN0cmluZyBwcmVmaXgsIG9zdHJlYW0mIGxvY2FsX3ZhcnMpIHsKLSAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7Ci0gIHRfZmllbGQgZmVsZW0odGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7Ci0gIGxvY2FsX3ZhcnMgPDwgIiAgIiA8PCBkZWNsYXJlX2ZpZWxkKCZmZWxlbSkgPDwgZW5kbDsKLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCBpc194Y2VwdGlvbiwgJmZlbGVtLCAiIiwgbG9jYWxfdmFycyk7Ci0gIGluZGVudF9pbXBsKG91dCkgPDwKLSAgICBwcmVmaXggPDwgIi5BZGQoIiA8PCBlbGVtIDw8ICIpOyIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsIGJvb2wgaXNfeGNlcHRpb24sIHRfZmllbGQqIHRmaWVsZCwgc3RyaW5nIHByZWZpeCwgb3N0cmVhbSYgbG9jYWxfdmFycykgewotICAodm9pZCkgbG9jYWxfdmFyczsKLQotICB0X3R5cGUqIHR5cGUgPSB0ZmllbGQtPmdldF90eXBlKCk7Ci0gIHdoaWxlICh0eXBlLT5pc190eXBlZGVmKCkpIHsKLSAgICB0eXBlID0gKCh0X3R5cGVkZWYqKXR5cGUpLT5nZXRfdHlwZSgpOwotICB9Ci0KLSAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyBwcm9wX25hbWUodGZpZWxkLCBpc194Y2VwdGlvbik7Ci0gIAotICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgbmFtZTsKLSAgfQotCi0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbmFtZSwgbG9jYWxfdmFycyk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG91dCwgaXNfeGNlcHRpb24sIHR5cGUsIG5hbWUsIGxvY2FsX3ZhcnMpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgewotICAgIAotICAgIGluZGVudF9pbXBsKG91dCkgPDwKLSAgICAgICJvcHJvdC4iOwotCi0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0KLSAgICAgIHN3aXRjaCh0YmFzZSkgewotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgICBpZiAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICAgICAgICBpZiAoYW5zaXN0cl9iaW5hcnlfKSB7Ci0gICAgICAgICAgICAgIG91dCA8PCAiV3JpdGVBbnNpU3RyaW5nKCI7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBvdXQgPDwgIldyaXRlQmluYXJ5KCI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG91dCA8PCAiV3JpdGVTdHJpbmcoIjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgb3V0IDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICAgIG91dCA8PCAiV3JpdGVCb29sKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgICAgb3V0IDw8ICJXcml0ZUJ5dGUoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICAgIG91dCA8PCAiV3JpdGVJMTYoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICAgIG91dCA8PCAiV3JpdGVJMzIoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICAgIG91dCA8PCAiV3JpdGVJNjQoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICAgIG91dCA8PCAiV3JpdGVEb3VibGUoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBEZWxwaGkgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICBvdXQgPDwgIldyaXRlSTMyKEludGVnZXIoIiA8PCBuYW1lIDw8ICIpKTsiOwotICAgIH0KLSAgICBvdXQgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgJyVzJXMnIFRZUEUgJyVzJ1xuIiwKLSAgICAgICAgcHJlZml4LmNfc3RyKCksCi0gICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAotICAgICAgICB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7Ci0gIH0KLX0KLQotdm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCwgb3N0cmVhbSYgbG9jYWxfdmFycykgewotICAodm9pZCkgbG9jYWxfdmFyczsKLSAgKHZvaWQpIHRzdHJ1Y3Q7Ci0gIG91dCA8PAotICAgIGluZGVudF9pbXBsKCkgPDwgcHJlZml4IDw8ICIuV3JpdGUob3Byb3QpOyIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LCBib29sIGlzX3hjZXB0aW9uLCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4LCBvc3RyZWFtJiBsb2NhbF92YXJzKSB7Ci0gIHN0cmluZyBvYmo7Ci0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBvYmogPSB0bXAoIm1hcCIpOwotICAgIGxvY2FsX3ZhcnMgPDwgIiAgIiA8PCBvYmogPDwgIiA6IElNYXA7IiA8PCBlbmRsOwotICAgIGluZGVudF9pbXBsKG91dCkgPDwgb2JqIDw8ICIgOj0gVE1hcEltcGwuQ3JlYXRlKCAiIDw8Ci0gICAgICB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgIHByZWZpeCA8PCAiLkNvdW50KTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2ltcGwob3V0KSA8PCAib3Byb3QuV3JpdGVNYXBCZWdpbiggIiA8PCBvYmogPDwgIik7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIG9iaiA9IHRtcCgic2V0XyIpOwotICAgIGxvY2FsX3ZhcnMgPDwgIiAgIiA8PCBvYmogPDwgIiA6IElTZXQ7IiA8PCBlbmRsOwotICAgIGluZGVudF9pbXBsKG91dCkgPDwgb2JqIDw8ICIgOj0gVFNldEltcGwuQ3JlYXRlKCIgIDw8IAotICAgICAgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICBwcmVmaXggPDwgIi5Db3VudCk7IiA8PCBlbmRsOwotICAgIGluZGVudF9pbXBsKG91dCkgPDwKLSAgICAgICJvcHJvdC5Xcml0ZVNldEJlZ2luKCAiIDw8IG9iaiA8PCAiKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIG9iaiA9IHRtcCgibGlzdF8iKTsKLSAgICBsb2NhbF92YXJzIDw8ICIgICIgPDwgb2JqIDw8ICIgOiBJTGlzdDsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2ltcGwob3V0KSA8PCBvYmogPDwgIiA6PSBUTGlzdEltcGwuQ3JlYXRlKCIgIDw8IAotICAgICAgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgcHJlZml4IDw8ICIuQ291bnQpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfaW1wbChvdXQpIDw8Ci0gICAgICAib3Byb3QuV3JpdGVMaXN0QmVnaW4oICIgPDwgb2JqIDw8ICIpOyIgPDwgZW5kbDsKLSAgfQotCi0gIHN0cmluZyBpdGVyID0gdG1wKCJfaXRlciIpOwotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgbG9jYWxfdmFycyA8PCAiICAiIDw8IGl0ZXIgPDwgIjogIiA8PCB0eXBlX25hbWUoKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2ltcGwob3V0KSA8PCAiZm9yICIgPDwgaXRlciA8PCAiIGluICIgPDwgcHJlZml4IDw8ICIuS2V5cyBkbyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJiZWdpbiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXBfaW1wbCgpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGxvY2FsX3ZhcnMgPDwgIiAgIiA8PCBpdGVyIDw8ICI6ICIgPDwgdHlwZV9uYW1lKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJmb3IgIiA8PCBpdGVyIDw8ICIgaW4gIiA8PCBwcmVmaXggPDwgIiBkbyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJiZWdpbiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXBfaW1wbCgpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBsb2NhbF92YXJzIDw8ICIgICIgPDwgaXRlciA8PCAiOiAiIDw8IHR5cGVfbmFtZSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICI7IiA8PCBlbmRsOwotICAgIGluZGVudF9pbXBsKG91dCkgPDwgImZvciAiIDw8IGl0ZXIgPDwgIiBpbiAiIDw8IHByZWZpeCA8PCAiIGRvIiA8PCBlbmRsOwotICAgIGluZGVudF9pbXBsKG91dCkgPDwgImJlZ2luIiA8PCBlbmRsOwotICAgIGluZGVudF91cF9pbXBsKCk7Ci0gIH0KLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgaXNfeGNlcHRpb24sICh0X21hcCopdHR5cGUsIGl0ZXIsIHByZWZpeCwgbG9jYWxfdmFycyk7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgaXNfeGNlcHRpb24sICh0X3NldCopdHR5cGUsIGl0ZXIsIGxvY2FsX3ZhcnMpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgaXNfeGNlcHRpb24sICh0X2xpc3QqKXR0eXBlLCBpdGVyLCBsb2NhbF92YXJzKTsKLSAgfQotCi0gIGluZGVudF9kb3duX2ltcGwoKTsKLSAgaW5kZW50X2ltcGwob3V0KSA8PCAiZW5kOyIgPDwgZW5kbDsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50X2ltcGwob3V0KSA8PCAib3Byb3QuV3JpdGVNYXBFbmQoKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50X2ltcGwob3V0KSA8PCAib3Byb3QuV3JpdGVTZXRFbmQoKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudF9pbXBsKG91dCkgPDwgIm9wcm90LldyaXRlTGlzdEVuZCgpOyIgPDwgZW5kbDsKLSAgfQotfQotCi12b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwgYm9vbCBpc194Y2VwdGlvbiwgdF9tYXAqIHRtYXAsIHN0cmluZyBpdGVyLCBzdHJpbmcgbWFwLCBvc3RyZWFtJiBsb2NhbF92YXJzKSB7Ci0gIHRfZmllbGQga2ZpZWxkKHRtYXAtPmdldF9rZXlfdHlwZSgpLCBpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgaXNfeGNlcHRpb24sICZrZmllbGQsICIiLCBsb2NhbF92YXJzKTsKLSAgdF9maWVsZCB2ZmllbGQodG1hcC0+Z2V0X3ZhbF90eXBlKCksIG1hcCArICJbIiArIGl0ZXIgKyAiXSIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCBpc194Y2VwdGlvbiwgJnZmaWVsZCwgIiIsIGxvY2FsX3ZhcnMpOwotfQotCi12b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwgYm9vbCBpc194Y2VwdGlvbiwgdF9zZXQqIHRzZXQsIHN0cmluZyBpdGVyLCBvc3RyZWFtJiBsb2NhbF92YXJzKSB7Ci0gIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsIGlzX3hjZXB0aW9uLCAmZWZpZWxkLCAiIiwgbG9jYWxfdmFycyk7Ci19Ci0KLXZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwgYm9vbCBpc194Y2VwdGlvbiwgdF9saXN0KiB0bGlzdCwgc3RyaW5nIGl0ZXIsIG9zdHJlYW0mIGxvY2FsX3ZhcnMpIHsKLSAgdF9maWVsZCBlZmllbGQodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsIGlzX3hjZXB0aW9uLCAmZWZpZWxkLCAiIiwgbG9jYWxfdmFycyk7Ci19Ci0KLXZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9wZXJ0eShvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpc1B1YmxpYywgYm9vbCBpc194Y2VwdGlvbikgewotICBnZW5lcmF0ZV9kZWxwaGlfcHJvcGVydHkob3V0LCBpc194Y2VwdGlvbiwgdGZpZWxkLCBpc1B1YmxpYywgIkdldCIpOwotfQotCi12b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVscGhpX3Byb3BlcnR5KG9zdHJlYW0mIG91dCwgYm9vbCBzdHJ1Y3RfaXNfeGNlcHRpb24sIHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpc1B1YmxpYywgc3RkOjpzdHJpbmcgZmllbGRQcmVmaXgpIHsKLSAgKHZvaWQpIGlzUHVibGljOwotCi0gIHRfdHlwZSogZnR5cGUgPSB0ZmllbGQtPmdldF90eXBlKCk7Ci0gIGJvb2wgaXNfeGNlcHRpb24gPSBmdHlwZS0+aXNfeGNlcHRpb24oKTsKLSAgZ2VuZXJhdGVfZGVscGhpX2RvYyhvdXQsdGZpZWxkKTsKLSAgaW5kZW50KG91dCkgPDwgInByb3BlcnR5ICIgPDwgcHJvcF9uYW1lKHRmaWVsZCwgc3RydWN0X2lzX3hjZXB0aW9uKSA8PCAiOiAiIDw8IHR5cGVfbmFtZShmdHlwZSwgZmFsc2UsIHRydWUsIGlzX3hjZXB0aW9uLCB0cnVlKSA8PCAiIHJlYWQgIiA8PCBmaWVsZFByZWZpeCArIHByb3BfbmFtZSh0ZmllbGQsIHN0cnVjdF9pc194Y2VwdGlvbikKLSAgICA8PCAiIHdyaXRlIFNldCIgPDwgcHJvcF9uYW1lKHRmaWVsZCwgc3RydWN0X2lzX3hjZXB0aW9uKSA8PCAiOyIgPDwgZW5kbDsKLX0KLQotc3RkOjpzdHJpbmcgdF9kZWxwaGlfZ2VuZXJhdG9yOjpwcm9wX25hbWUodF9maWVsZCogdGZpZWxkLCBib29sIGlzX3hjZXB0aW9uKSB7Ci0gIHJldHVybiAgcHJvcF9uYW1lKHRmaWVsZC0+Z2V0X25hbWUoKSwgaXNfeGNlcHRpb24pOwotfQotCi1zdGQ6OnN0cmluZyB0X2RlbHBoaV9nZW5lcmF0b3I6OnByb3BfbmFtZShzdHJpbmcgbmFtZSwgYm9vbCBpc194Y2VwdGlvbikgewotICBzdHJpbmcgcmV0ID0gbmFtZTsKLSAgcmV0WzBdID0gdG91cHBlcihyZXRbMF0pOwotICByZXR1cm4gbm9ybWFsaXplX25hbWUoIHJldCwgdHJ1ZSwgaXNfeGNlcHRpb24pOwotfQotCi1zdGQ6OnN0cmluZyB0X2RlbHBoaV9nZW5lcmF0b3I6OmNvbnN0cnVjdG9yX3BhcmFtX25hbWUoc3RyaW5nIG5hbWUpIHsKLSAgc3RyaW5nIHJldCA9IG5hbWU7Ci0gIHJldFswXSA9IHRvdXBwZXIocmV0WzBdKTsKLSAgcmV0ID0gIkEiICsgcmV0OwotICByZXR1cm4gbm9ybWFsaXplX25hbWUoIHJldCwgZmFsc2UsIGZhbHNlKTsKLX0KLQotc3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6bm9ybWFsaXplX2Nsc25tKHN0cmluZyBjbHNubSwgc3RyaW5nIHByZWZpeCwgYm9vbCBiX25vX2NoZWNrX2tleXdvcmQpIHsKLSAgaWYgKGNsc25tLnNpemUoKSA+IDApIHsKLSAgICBjbHNubVswXSA9IHRvdXBwZXIoY2xzbm1bMF0pOwotICB9Ci0gIGlmIChiX25vX2NoZWNrX2tleXdvcmQpIHsKLSAgICByZXR1cm4gcHJlZml4ICsgY2xzbm07Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIG5vcm1hbGl6ZV9uYW1lKCBwcmVmaXggKyBjbHNubSk7Ci0gIH0KLX0KLQotc3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6dHlwZV9uYW1lKCB0X3R5cGUqIHR0eXBlLCBib29sIGJfY2xzLCBib29sIGJfbm9fcG9zdGZpeCwgYm9vbCBiX2V4Y2VwdGlvbl9mYWN0b3J5LCBib29sIGJfZnVsbF9leGNlcHRpb25fZmFjdG9yeSkgewotCi0gIGlmICh0dHlwZS0+aXNfdHlwZWRlZigpKSB7ICAgIAotICAgIHRfdHlwZWRlZiogdGRlZiA9ICh0X3R5cGVkZWYqKXR0eXBlOwotICAgIGlmKCB0ZGVmLT5pc19mb3J3YXJkX3R5cGVkZWYoKSkgeyAgLy8gZm9yd2FyZCB0eXBlcyBhY2NvcmRpbmcgdG8gVEhSSUZULTI0MjEgCi0gICAgICBpZiggdGRlZi0+Z2V0X3R5cGUoKSAhPSBOVUxMKSAgewotICAgICAgICByZXR1cm4gdHlwZV9uYW1lKCB0ZGVmLT5nZXRfdHlwZSgpLCBiX2NscywgYl9ub19wb3N0Zml4LCBiX2V4Y2VwdGlvbl9mYWN0b3J5LCBiX2Z1bGxfZXhjZXB0aW9uX2ZhY3RvcnkpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgdGhyb3cgInVucmVzb2x2ZWQgZm9yd2FyZCBkZWNsYXJhdGlvbjogIiArIHRkZWYtPmdldF9zeW1ib2xpYygpOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gbm9ybWFsaXplX25hbWUoICJUIit0ZGVmLT5nZXRfc3ltYm9saWMoKSk7Ci0gICAgfQotICB9Ci0gIAotICBzdHJpbmcgdHlwX25tOwotCi0gIHN0cmluZyBzX2ZhY3Rvcnk7Ci0KLSAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHJldHVybiBiYXNlX3R5cGVfbmFtZSgodF9iYXNlX3R5cGUqKXR0eXBlKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgYl9jbHMgPSB0cnVlOwotICAgIGJfbm9fcG9zdGZpeCA9IHRydWU7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgdF9tYXAgKnRtYXAgPSAodF9tYXAqKSB0dHlwZTsKLSAgICBpZiAoYl9jbHMpIHsKLSAgICAgIHR5cF9ubSA9ICJUVGhyaWZ0RGljdGlvbmFyeUltcGwiOwotICAgIH0gZWxzZSB7Ci0gICAgICB0eXBfbm0gPSAiSVRocmlmdERpY3Rpb25hcnkiOwotICAgIH0KLSAgICByZXR1cm4gdHlwX25tICsgIjwiICsgdHlwZV9uYW1lKHRtYXAtPmdldF9rZXlfdHlwZSgpKSArCi0gICAgICAiLCAiICsgdHlwZV9uYW1lKHRtYXAtPmdldF92YWxfdHlwZSgpKSArICI+IjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICB0X3NldCogdHNldCA9ICh0X3NldCopIHR0eXBlOwotICAgIGlmIChiX2NscykgewotICAgICAgdHlwX25tID0gIlRIYXNoU2V0SW1wbCI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHR5cF9ubSA9ICJJSGFzaFNldCI7Ci0gICAgfQotICAgIHJldHVybiB0eXBfbm0gKyAiPCIgKyB0eXBlX25hbWUodHNldC0+Z2V0X2VsZW1fdHlwZSgpKSArICI+IjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgdF9saXN0KiB0bGlzdCA9ICh0X2xpc3QqKSB0dHlwZTsKLSAgICBpZiAoYl9jbHMpIHsKLSAgICAgIHR5cF9ubSA9ICJUVGhyaWZ0TGlzdEltcGwiOwotICAgIH0gZWxzZSB7Ci0gICAgICB0eXBfbm0gPSAiSVRocmlmdExpc3QiOwotICAgIH0KLSAgICByZXR1cm4gdHlwX25tICsgIjwiICsgdHlwZV9uYW1lKHRsaXN0LT5nZXRfZWxlbV90eXBlKCkpICsgIj4iOwotICB9Ci0KLSAgc3RyaW5nIHR5cGVfcHJlZml4OwotCi0gIGlmIChiX2NscykgewotICAgIHR5cGVfcHJlZml4ID0gIlQiOwotICB9IGVsc2UgewotICAgIHR5cGVfcHJlZml4ID0gIkkiOwotICB9Ci0KLSAgc3RyaW5nIG5tID0gbm9ybWFsaXplX2Nsc25tKCB0dHlwZS0+Z2V0X25hbWUoKSwgdHlwZV9wcmVmaXgpOwotCi0gIGlmIChiX2V4Y2VwdGlvbl9mYWN0b3J5KSB7Ci0gICAgbm0gPSBubSArICJGYWN0b3J5IjsKLSAgfQotCi0gIGlmIChiX2NscykgewotICAgIGlmICghIGJfbm9fcG9zdGZpeCkgewotICAgICAgbm0gPSBubSArICJJbXBsIjsKLSAgICB9Ci0gIH0KLQotICBpZiAoIGJfZXhjZXB0aW9uX2ZhY3RvcnkgJiYgYl9mdWxsX2V4Y2VwdGlvbl9mYWN0b3J5KSB7Ci0gICAgcmV0dXJuIHR5cGVfbmFtZSggdHR5cGUsIHRydWUsIHRydWUsIGZhbHNlLCBmYWxzZSApICsgIi4iICsgbm07Ci0gIH0KLQotICByZXR1cm4gbm07Ci19Ci0KLS8vIHJldHVybnMgImNvbnN0ICIgZm9yIHNvbWUgYXJndW1lbnQgdHlwZXMKLXN0cmluZyB0X2RlbHBoaV9nZW5lcmF0b3I6OmlucHV0X2FyZ19wcmVmaXgoIHRfdHlwZSogdHR5cGUpIHsKLQotICAvLyBiYXNlIHR5cGVzCi0gIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICBzd2l0Y2ggKCgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKSkgewotICAKLSAgICAgIC8vIHRoZXNlIHNob3VsZCBiZSBjb25zdCdlZCBmb3Igb3B0aW1hbCBwZXJmb3JtYW1jZQotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6ICAvLyByZWZjb3VudGVkIHBvaW50ZXIKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OiAgIC8vIGxhcmdlciB0aGFuIDMyIGJpdAotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6ICAgLy8gbGFyZ2VyIHRoYW4gMzIgYml0Ci0gICAgICAgIHJldHVybiAiY29uc3QgIjsKLSAgCi0gICAgICAvLyBhbGwgb3RoZXJzIGRvbid0IG5lZWQgdG8gYmUKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIHJldHVybiAiIjsKLSAgICAgIAotICAgICAgLy8gd2UgYmV0dGVyIGFsd2F5cyByZXBvcnQgYW55IHVua25vd24gdHlwZXMKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gaW5wdXRfYXJnX3ByZWZpeCgpIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSgoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCkpOwotICAgIH0KLSAgCi0gIC8vIGVudW1zCi0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAiIjsgICAvLyB1c3VhbGx5IDw9IDMyIGJpdAotICAKLSAgLy8gY29udGFpbmVycwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIHJldHVybiAiY29uc3QgIjsgIC8vIHJlZmNvdW50ZWQgcG9pbnRlcgotCi0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgcmV0dXJuICJjb25zdCAiOyAgLy8gcmVmY291bnRlZCBwb2ludGVyCi0KLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgcmV0dXJuICJjb25zdCAiOyAgLy8gcmVmY291bnRlZCBwb2ludGVyCi0KLSAgfQotICAKLSAgLy8gYW55IG90aGVyIHR5cGUsIGVpdGhlciBUU29tZXRoaW5nIG9yIElTb21ldGhpbmcKLSAgcmV0dXJuICJjb25zdCAiOyAgLy8gcG9zc2libHkgcmVmY291bnRlZCBwb2ludGVyCi19Ci0KLXN0cmluZyB0X2RlbHBoaV9nZW5lcmF0b3I6OmJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlKiB0YmFzZSkgewotICBzd2l0Y2ggKHRiYXNlLT5nZXRfYmFzZSgpKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgLy8gbm8gInZvaWQiIGluIERlbHBoaSBsYW5ndWFnZQotICAgICAgcmV0dXJuICIiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgaWYgKHRiYXNlLT5pc19iaW5hcnkoKSkgewotICAgICAgICBpZiAoIGFuc2lzdHJfYmluYXJ5XykgewotICAgICAgICAgIHJldHVybiAiQW5zaVN0cmluZyI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgcmV0dXJuICJUQnl0ZXMiOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gInN0cmluZyI7Ci0gICAgICB9Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuICJCb29sZWFuIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICByZXR1cm4gIlNob3J0SW50IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIHJldHVybiAiU21hbGxJbnQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgcmV0dXJuICJJbnRlZ2VyIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJldHVybiAiSW50NjQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuICJEb3VibGUiOwotICAgIGRlZmF1bHQ6Ci0gICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIERlbHBoaSBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZS0+Z2V0X2Jhc2UoKSk7Ci0gIH0KLX0KLQotc3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6ZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdCwgc3RkOjpzdHJpbmcgcHJlZml4LCBib29sIGlzX3hjZXB0aW9uX2NsYXNzKSB7Ci0gICh2b2lkKSBpbml0OwotCi0gIHRfdHlwZSAqIGZ0eXBlID0gdGZpZWxkLT5nZXRfdHlwZSgpOwotICBib29sIGlzX3hjZXB0aW9uID0gZnR5cGUtPmlzX3hjZXB0aW9uKCk7Ci0KLSAgc3RyaW5nIHJlc3VsdCA9IHByZWZpeCArIHByb3BfbmFtZSh0ZmllbGQsIGlzX3hjZXB0aW9uX2NsYXNzKSArICI6ICIgKyB0eXBlX25hbWUoZnR5cGUsZmFsc2UsdHJ1ZSxpc194Y2VwdGlvbix0cnVlKSArICI7IjsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RkOjpzdHJpbmcgZnVsbF9jbHMsIGJvb2wgaXNfeGNlcHRpb24pIHsKLSAgdF90eXBlKiB0dHlwZSA9IHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKTsKLSAgc3RyaW5nIHByZWZpeDsKLSAgaWYgKGZ1bGxfY2xzID09ICIiKSB7Ci0gICAgcHJlZml4ID0gIiI7Ci0gIH0gZWxzZSB7Ci0gICAgcHJlZml4ID0gZnVsbF9jbHMgKyAiLiI7Ci0gIH0KLSAgaWYgKGlzX3ZvaWQodHR5cGUpKSB7Ci0gICAgcmV0dXJuICJwcm9jZWR1cmUgIiArIHByZWZpeCArIG5vcm1hbGl6ZV9uYW1lKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSwgdHJ1ZSwgaXNfeGNlcHRpb24pICArICIoIiArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKSArICIpOyI7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuICJmdW5jdGlvbiAiICsgcHJlZml4ICsgbm9ybWFsaXplX25hbWUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpLCB0cnVlLCBpc194Y2VwdGlvbikgICsgIigiICsgYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpICsgIik6ICIgKyB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlLCBpc194Y2VwdGlvbiwgdHJ1ZSkgKyAiOyI7Ci0gIH0KLX0KLQotc3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIHRfdHlwZSogdHQ7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlc3VsdCArPSAiOyAiOwotICAgIH0KLQotICAgIHR0ID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOwotICByZXN1bHQgKz0gaW5wdXRfYXJnX3ByZWZpeCh0dCk7ICAvLyBjb25zdD8KLSAgcmVzdWx0ICs9IG5vcm1hbGl6ZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgKyAiOiAiICsgdHlwZV9uYW1lKCB0dCwgZmFsc2UsIHRydWUsIHR0LT5pc194Y2VwdGlvbigpLCB0cnVlKTsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi1zdHJpbmcgdF9kZWxwaGlfZ2VuZXJhdG9yOjpjb25zdHJ1Y3Rvcl9hcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgY3VycmVudF9pbmRlbnQpIHsKLSAgb3N0cmluZ3N0cmVhbSByZXN1bHQ7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIHRfdHlwZSogdHQ7Ci0gIHN0cmluZyBsaW5lID0gIiI7Ci0gIHN0cmluZyBuZXdsaW5lX2luZGVudCA9IGN1cnJlbnRfaW5kZW50ICsgIiAgIjsKLQotICBib29sIGZpcnN0bGluZSA9IHRydWU7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGxpbmUgKz0gIjsiOwotICAgIH0KLQotICAgIGlmIChsaW5lLnNpemUoKSA+IDgwKSB7Ci0gICAgICBpZiAoIGZpcnN0bGluZSApIHsKLSAgICAgICAgcmVzdWx0IDw8IGVuZGwgPDwgbmV3bGluZV9pbmRlbnQ7Ci0gICAgICAgIGZpcnN0bGluZSA9IGZhbHNlOwotICAgICAgfQotICAgICAgcmVzdWx0IDw8IGxpbmUgPDwgZW5kbDsKLSAgICAgIGxpbmUgPSBuZXdsaW5lX2luZGVudDsKLSAgICB9IGVsc2UgaWYgKCBsaW5lLnNpemUoKSA+IDApIHsKLSAgICAgIGxpbmUgKz0gIiAiOwotICAgIH0KLQotICAgIHR0ID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgIGxpbmUgKz0gaW5wdXRfYXJnX3ByZWZpeCh0dCk7ICAvLyBjb25zdD8KLSAgICBsaW5lICs9IGNvbnN0cnVjdG9yX3BhcmFtX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSArICI6ICIgKyB0eXBlX25hbWUoIHR0LCBmYWxzZSwgdHJ1ZSwgdHQtPmlzX3hjZXB0aW9uKCksIHRydWUpOwotICB9Ci0KLSAgaWYgKCBsaW5lLnNpemUoKSA+IDApIHsKLSAgICByZXN1bHQgPDwgbGluZTsKLSAgfQotCi0gIHN0cmluZyByZXN1bHRfc3RyOwotCi0gIGlmIChmaXJzdGxpbmUpIHsKLSAgICByZXN1bHRfc3RyID0gIiAiICsgcmVzdWx0LnN0cigpOwotICB9IGVsc2UgewotICAgIHJlc3VsdF9zdHIgPSByZXN1bHQuc3RyKCk7Ci0gIH0KLQotICByZXR1cm4gcmVzdWx0X3N0cjsKLX0KLQotc3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgewotICB3aGlsZSAodHlwZS0+aXNfdHlwZWRlZigpKSB7Ci0gICAgdHlwZSA9ICgodF90eXBlZGVmKil0eXBlKS0+Z2V0X3R5cGUoKTsKLSAgfQotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICByZXR1cm4gIlRUeXBlLlN0cmluZ18iOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICByZXR1cm4gIlRUeXBlLkJvb2xfIjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgcmV0dXJuICJUVHlwZS5CeXRlXyI7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgcmV0dXJuICJUVHlwZS5JMTYiOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgIHJldHVybiAiVFR5cGUuSTMyIjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICByZXR1cm4gIlRUeXBlLkk2NCI7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgcmV0dXJuICJUVHlwZS5Eb3VibGVfIjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZS5JMzIiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLlN0cnVjdCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLk1hcCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLlNldF8iOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHJldHVybiAiVFR5cGUuTGlzdCI7Ci0gIH0KLQotICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Ci19Ci0KLXN0cmluZyB0X2RlbHBoaV9nZW5lcmF0b3I6OmVtcHR5X3ZhbHVlKHRfdHlwZSogdHlwZSkgewotICB3aGlsZSAodHlwZS0+aXNfdHlwZWRlZigpKSB7Ci0gICAgdHlwZSA9ICgodF90eXBlZGVmKil0eXBlKS0+Z2V0X3R5cGUoKTsKLSAgfQotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIHJldHVybiAiMCI7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgaWYgKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSkgewotICAgICAgICAgIGlmIChhbnNpc3RyX2JpbmFyeV8pIHsKLSAgICAgICAgICAgIHJldHVybiAiJyciOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gIm5pbCI7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHJldHVybiAiJyciOwotICAgICAgICB9Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIHJldHVybiAiRmFsc2UiOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICByZXR1cm4gIjAiOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIHJldHVybiAiMC4wIjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJUIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiKDApIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgcmV0dXJuICJuaWwiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgcmV0dXJuICJuaWwiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgcmV0dXJuICJuaWwiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHJldHVybiAibmlsIjsKLSAgfQotCi0gIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotdm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlbHBoaV9wcm9wZXJ0eV93cml0ZXJfZGVmaW5pdGlvbihvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpc194Y2VwdGlvbl9jbGFzcykgewotICB0X3R5cGUgKiBmdHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKLSAgYm9vbCBpc194Y2VwdGlvbiA9IGZ0eXBlLT5pc194Y2VwdGlvbigpOwotCi0gIGluZGVudChvdXQpIDw8ICJwcm9jZWR1cmUgU2V0IiA8PCBwcm9wX25hbWUodGZpZWxkLCBpc194Y2VwdGlvbl9jbGFzcykgPDwgIiggY29uc3QgVmFsdWU6ICIgPDwgdHlwZV9uYW1lKGZ0eXBlLGZhbHNlLHRydWUsaXNfeGNlcHRpb24sdHJ1ZSkgPDwgIik7IiA8PCBlbmRsOwotfQotCi12b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVscGhpX3Byb3BlcnR5X3JlYWRlcl9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBib29sIGlzX3hjZXB0aW9uX2NsYXNzKSB7Ci0gIHRfdHlwZSAqIGZ0eXBlID0gdGZpZWxkLT5nZXRfdHlwZSgpOwotICBib29sIGlzX3hjZXB0aW9uID0gZnR5cGUtPmlzX3hjZXB0aW9uKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgImZ1bmN0aW9uIEdldCIgPDwgcHJvcF9uYW1lKHRmaWVsZCwgaXNfeGNlcHRpb25fY2xhc3MpIDw8ICI6ICIgPDwgdHlwZV9uYW1lKGZ0eXBlLGZhbHNlLHRydWUsaXNfeGNlcHRpb24sdHJ1ZSkgPDwgIjsiIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWxwaGlfaXNzZXRfcmVhZGVyX2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaXNfeGNlcHRpb24pIHsKLSAgaW5kZW50KG91dCkgPDwgImZ1bmN0aW9uIEdldF9faXNzZXRfIiA8PCBwcm9wX25hbWUoIHRmaWVsZCwgaXNfeGNlcHRpb24pIDw8ICI6IEJvb2xlYW47IiA8PCBlbmRsOwotfQotCi12b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVscGhpX2NsZWFyX3VuaW9uX3ZhbHVlKG9zdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgY2xzX3ByZWZpeCwgc3RkOjpzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2ZpZWxkKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIGZpZWxkUHJlZml4LCBib29sIGlzX3hjZXB0aW9uX2NsYXNzLCBib29sIGlzX3VuaW9uLCBib29sIGlzX3hjZXB0aW9uX2ZhY3RvcnksIHN0ZDo6c3RyaW5nIHhjZXB0aW9uX2ZhY3RvcnlfbmFtZSkgewotICAodm9pZCkgY2xzX3ByZWZpeDsKLSAgKHZvaWQpIG5hbWU7Ci0gICh2b2lkKSB0eXBlOwotICAodm9pZCkgaXNfdW5pb247Ci0gICh2b2lkKSBpc194Y2VwdGlvbl9mYWN0b3J5OwotICAodm9pZCkgeGNlcHRpb25fZmFjdG9yeV9uYW1lOwotCi0gIHRfdHlwZSAqIGZ0eXBlID0gdGZpZWxkLT5nZXRfdHlwZSgpOwotICBib29sIGlzX3hjZXB0aW9uID0gZnR5cGUtPmlzX3hjZXB0aW9uKCk7Ci0KLSAgaW5kZW50X2ltcGwob3V0KSA8PCAiaWYgRl9faXNzZXRfIiA8PCBwcm9wX25hbWUodGZpZWxkLCBpc194Y2VwdGlvbl9jbGFzcykgPDwgIiB0aGVuIGJlZ2luIiA8PCBlbmRsOwotICBpbmRlbnRfdXBfaW1wbCgpOwotICBpbmRlbnRfaW1wbChvdXQpIDw8ICJGX19pc3NldF8iIDw8IHByb3BfbmFtZSh0ZmllbGQsIGlzX3hjZXB0aW9uX2NsYXNzKSA8PCAiIDo9IEZhbHNlOyIgPDwgZW5kbDsKLSAgaW5kZW50X2ltcGwob3V0KSA8PCBmaWVsZFByZWZpeCA8PCBwcm9wX25hbWUodGZpZWxkLCBpc194Y2VwdGlvbl9jbGFzcykgPDwgIiA6PSAiIDw8ICJEZWZhdWx0KCAiIDw8IHR5cGVfbmFtZShmdHlwZSxmYWxzZSx0cnVlLGlzX3hjZXB0aW9uLHRydWUpIDw8ICIpOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd25faW1wbCgpOwotICBpbmRlbnRfaW1wbChvdXQpIDw8ICJlbmQ7IiA8PCBlbmRsOwotfQotCi12b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVscGhpX3Byb3BlcnR5X3dyaXRlcl9pbXBsKG9zdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgY2xzX3ByZWZpeCwgc3RkOjpzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2ZpZWxkKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIGZpZWxkUHJlZml4LCBib29sIGlzX3hjZXB0aW9uX2NsYXNzLCBib29sIGlzX3VuaW9uLCBib29sIGlzX3hjZXB0aW9uX2ZhY3RvcnksIHN0ZDo6c3RyaW5nIHhjZXB0aW9uX2ZhY3Ryb3lfbmFtZSkgewotICAodm9pZCkgdHlwZTsKLQotICB0X3R5cGUgKiBmdHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKLSAgYm9vbCBpc194Y2VwdGlvbiA9IGZ0eXBlLT5pc194Y2VwdGlvbigpOwotCi0gIGluZGVudF9pbXBsKG91dCkgPDwgInByb2NlZHVyZSAiIDw8IGNsc19wcmVmaXggPDwgbmFtZSA8PCAiLiIgPDwgIlNldCIgPDwgcHJvcF9uYW1lKHRmaWVsZCwgaXNfeGNlcHRpb25fY2xhc3MpIDw8ICIoIGNvbnN0IFZhbHVlOiAiIDw8IHR5cGVfbmFtZShmdHlwZSxmYWxzZSx0cnVlLGlzX3hjZXB0aW9uLHRydWUpIDw8ICIpOyIgPDwgZW5kbDsKLSAgaW5kZW50X2ltcGwob3V0KSA8PCAiYmVnaW4iIDw8IGVuZGw7Ci0gIGluZGVudF91cF9pbXBsKCk7Ci0gIGlmICggaXNfdW5pb24gKSB7Ci0gICAgaW5kZW50X2ltcGwob3V0KSA8PCAiQ2xlYXJVbmlvblZhbHVlczsiIDw8IGVuZGw7Ci0gIH0KLSAgaWYgKHRmaWVsZC0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKLSAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJGX19pc3NldF8iIDw8IHByb3BfbmFtZSh0ZmllbGQsIGlzX3hjZXB0aW9uX2NsYXNzKSA8PCAiIDo9IFRydWU7IiA8PCBlbmRsOwotICB9Ci0gIGluZGVudF9pbXBsKG91dCkgPDwgZmllbGRQcmVmaXggPDwgcHJvcF9uYW1lKHRmaWVsZCwgaXNfeGNlcHRpb25fY2xhc3MpIDw8ICIgOj0gVmFsdWU7IiA8PCBlbmRsOwotCi0gIGlmIChpc194Y2VwdGlvbl9jbGFzcyAmJiAoISBpc194Y2VwdGlvbl9mYWN0b3J5KSApIHsKLSAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJGIiA8PCB4Y2VwdGlvbl9mYWN0cm95X25hbWUgPDwgIi4iIDw8IHByb3BfbmFtZSh0ZmllbGQsIGlzX3hjZXB0aW9uX2NsYXNzKSA8PCAiIDo9IFZhbHVlOyIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudF9kb3duX2ltcGwoKTsKLSAgaW5kZW50X2ltcGwob3V0KSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi12b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVscGhpX3Byb3BlcnR5X3JlYWRlcl9pbXBsKG9zdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgY2xzX3ByZWZpeCwgc3RkOjpzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2ZpZWxkKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIGZpZWxkUHJlZml4LCBib29sIGlzX3hjZXB0aW9uX2NsYXNzKSB7Ci0gICh2b2lkKSB0eXBlOwotCi0gIHRfdHlwZSAqIGZ0eXBlID0gdGZpZWxkLT5nZXRfdHlwZSgpOwotICBib29sIGlzX3hjZXB0aW9uID0gZnR5cGUtPmlzX3hjZXB0aW9uKCk7Ci0KLSAgaW5kZW50X2ltcGwob3V0KSA8PCAiZnVuY3Rpb24gIiA8PCBjbHNfcHJlZml4IDw8IG5hbWUgPDwgIi4iIDw8ICJHZXQiIDw8IHByb3BfbmFtZSggdGZpZWxkLCBpc194Y2VwdGlvbl9jbGFzcykgPDwgIjogIiA8PCB0eXBlX25hbWUoZnR5cGUsZmFsc2UsdHJ1ZSxpc194Y2VwdGlvbix0cnVlKSA8PCAiOyIgPDwgZW5kbDsKLSAgaW5kZW50X2ltcGwob3V0KSA8PCAiYmVnaW4iIDw8IGVuZGw7Ci0gIGluZGVudF91cF9pbXBsKCk7Ci0gIGluZGVudF9pbXBsKG91dCkgPDwgIlJlc3VsdCA6PSAiIDw8IGZpZWxkUHJlZml4IDw8IHByb3BfbmFtZSh0ZmllbGQsIGlzX3hjZXB0aW9uX2NsYXNzKSA8PCAiOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd25faW1wbCgpOwotICBpbmRlbnRfaW1wbChvdXQpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWxwaGlfaXNzZXRfcmVhZGVyX2ltcGwob3N0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBjbHNfcHJlZml4LCBzdGQ6OnN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfZmllbGQqIHRmaWVsZCwgc3RkOjpzdHJpbmcgZmllbGRQcmVmaXgsIGJvb2wgaXNfeGNlcHRpb24pIHsKLSAgKHZvaWQpIHR5cGU7Ci0KLSAgc3RyaW5nIGlzc2V0X25hbWUgPSAiX19pc3NldF8iICsgcHJvcF9uYW1lKCB0ZmllbGQsIGlzX3hjZXB0aW9uKTsKLSAgaW5kZW50X2ltcGwob3V0KSA8PCAiZnVuY3Rpb24gIiA8PCBjbHNfcHJlZml4IDw8IG5hbWUgPDwgIi4iIDw8ICJHZXQiIDw8IGlzc2V0X25hbWUgPDwgIjogQm9vbGVhbjsiIDw8IGVuZGw7Ci0gIGluZGVudF9pbXBsKG91dCkgPDwgImJlZ2luIiA8PCBlbmRsOwotICBpbmRlbnRfdXBfaW1wbCgpOwotICBpbmRlbnRfaW1wbChvdXQpIDw8ICJSZXN1bHQgOj0gIiA8PCBmaWVsZFByZWZpeCA8PCBpc3NldF9uYW1lIDw8ICI7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0gIGluZGVudF9pbXBsKG91dCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlbHBoaV9jcmVhdGVfZXhjZXB0aW9uX2ltcGwob3N0cmVhbSYgb3V0LCBzdHJpbmcgY2xzX3ByZWZpeCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKSB7Ci0gICh2b2lkKSBjbHNfcHJlZml4OwotCi0gIHN0cmluZyBleGNlcHRpb25fY2xzX25tID0gdHlwZV9uYW1lKHRzdHJ1Y3QsdHJ1ZSx0cnVlKTsKLSAgc3RyaW5nIGNsc19ubSA9IHR5cGVfbmFtZSh0c3RydWN0LHRydWUsZmFsc2UsaXNfZXhjZXB0aW9uLGlzX2V4Y2VwdGlvbik7Ci0KLSAgaW5kZW50X2ltcGwob3V0KSA8PCAiZnVuY3Rpb24gIiA8PCBjbHNfbm0gPDwgIi5DcmVhdGVFeGNlcHRpb246ICIgPDwgZXhjZXB0aW9uX2Nsc19ubSA8PCAiOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfaW1wbChvdXQpIDw8ICJiZWdpbiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwX2ltcGwoKTsKLQotCi0gIGluZGVudF9pbXBsKG91dCkgPDwgIlJlc3VsdCA6PSAiIDw8IGV4Y2VwdGlvbl9jbHNfbm0gPDwgIi5DcmVhdGU7IiA8PCBlbmRsOwotICBzdHJpbmcgZmFjdG9yeV9uYW1lID0gbm9ybWFsaXplX2Nsc25tKHRzdHJ1Y3QtPmdldF9uYW1lKCksIiIsdHJ1ZSkgKyAiRmFjdG9yeSI7Ci0gIGluZGVudF9pbXBsKG91dCkgPDwgIlJlc3VsdC4iIDw8IGZhY3RvcnlfbmFtZSA8PCAiIDo9IFNlbGY7IiA8PCBlbmRsOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBzdHJpbmcgcHJvcG5hbWU7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBwcm9wbmFtZSA9IHByb3BfbmFtZSgqZl9pdGVyLCBpc19leGNlcHRpb24pOwotICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7Ci0gICAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJpZiBfX2lzc2V0XyIgPDwgcHJvcG5hbWUgPDwgIiB0aGVuIiA8PCBlbmRsOwotICAgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiYmVnaW4iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXBfaW1wbCgpOwotICAgIH0KLSAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJSZXN1bHQuIiA8PCBwcm9wbmFtZSA8PCAgIiA6PSAiIDw8IHByb3BuYW1lIDw8ICI7IiA8PCBlbmRsOwotICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7Ci0gICAgICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0gICAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJlbmQ7IiA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIGluZGVudF9pbXBsKG91dCkgPDwgIlJlc3VsdC5VcGRhdGVNZXNzYWdlUHJvcGVydHk7IiA8PCBlbmRsOwotIAotICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0gIGluZGVudF9pbXBsKG91dCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfcmVhZGVyX2ltcGwob3N0cmVhbSYgb3V0LCBzdHJpbmcgY2xzX3ByZWZpeCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKSB7Ci0KLSAgb3N0cmluZ3N0cmVhbSBsb2NhbF92YXJzOwotICBvc3RyaW5nc3RyZWFtIGNvZGVfYmxvY2s7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0KLSAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImJlZ2luIiA8PCBlbmRsOwotICBpbmRlbnRfdXBfaW1wbCgpOwotCi0gIC8vIGxvY2FsIGJvb2xzIGZvciByZXF1aXJlZCBmaWVsZHMKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgewotICAgICAgaW5kZW50X2ltcGwobG9jYWxfdmFycykgPDwgCi0gICAgICAgICJfcmVxX2lzc2V0XyIgPDwgcHJvcF9uYW1lKCpmX2l0ZXIsIGlzX2V4Y2VwdGlvbikgPDwgIiA6IEJvb2xlYW47IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgCi0gICAgICAgICJfcmVxX2lzc2V0XyIgPDwgcHJvcF9uYW1lKCpmX2l0ZXIsIGlzX2V4Y2VwdGlvbikgPDwgIiA6PSBGQUxTRTsiIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0gIAotICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAic3RydWMgOj0gaXByb3QuUmVhZFN0cnVjdEJlZ2luOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAidHJ5IiA8PCBlbmRsOwotICBpbmRlbnRfdXBfaW1wbCgpOwotCi0gIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJ3aGlsZSAodHJ1ZSkgZG8iIDw8IGVuZGw7Ci0gIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJiZWdpbiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwX2ltcGwoKTsKLQotICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiZmllbGRfIDo9IGlwcm90LlJlYWRGaWVsZEJlZ2luKCk7IiA8PCBlbmRsOwotCi0gIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJpZiAoZmllbGRfLlR5cGVfID0gVFR5cGUuU3RvcCkgdGhlbiIgPDwgZW5kbDsKLSAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImJlZ2luIiA8PCBlbmRsOwotICBpbmRlbnRfdXBfaW1wbCgpOwotICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiQnJlYWs7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0gIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJlbmQ7IiA8PCBlbmRsOwotCi0KLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLQotICAgIGlmIChmaXJzdCkgewotICAgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImNhc2UgZmllbGRfLklEIG9mIiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwX2ltcGwoKTsKLSAgICB9Ci0KLSAgICBmaXJzdCA9IGZhbHNlOwotICAgIGlmIChmX2l0ZXIgIT0gZmllbGRzLmJlZ2luKCkpIHsKLSAgICAgIGNvZGVfYmxvY2sgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICI6IGJlZ2luIiA8PCBlbmRsOwotICAgIGluZGVudF91cF9pbXBsKCk7Ci0gICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImlmIChmaWVsZF8uVHlwZV8gPSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIpIHRoZW4iIDw8IGVuZGw7Ci0gICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImJlZ2luIiA8PCBlbmRsOwotICAgIGluZGVudF91cF9pbXBsKCk7Ci0KLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChjb2RlX2Jsb2NrLCBpc19leGNlcHRpb24sICAqZl9pdGVyLCAiIiwgbG9jYWxfdmFycyk7Ci0KLSAgICAvLyByZXF1aXJlZCBmaWVsZD8KLSAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgewotICAgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgCi0gICAgICAgICJfcmVxX2lzc2V0XyIgPDwgcHJvcF9uYW1lKCpmX2l0ZXIsIGlzX2V4Y2VwdGlvbikgPDwgIiA6PSBUUlVFOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0KLSAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiZW5kIGVsc2UiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImJlZ2luIiA8PCBlbmRsOwotICAgIGluZGVudF91cF9pbXBsKCk7Ci0gICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgIlRQcm90b2NvbFV0aWwuU2tpcChpcHJvdCwgZmllbGRfLlR5cGVfKTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd25faW1wbCgpOwotICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJlbmQ7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duX2ltcGwoKTsKLSAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiZW5kIjsKLQotICB9Ci0KLSAgaWYgKCEgZmlyc3QpIHsKLSAgICBjb2RlX2Jsb2NrIDw8IGVuZGw7Ci0gICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImVsc2UgYmVnaW4iIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwX2ltcGwoKTsKLSAgfQotCi0gIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJUUHJvdG9jb2xVdGlsLlNraXAoaXByb3QsIGZpZWxkXy5UeXBlXyk7IiA8PCBlbmRsOwotCi0gIGlmICghIGZpcnN0KSB7Ci0gICAgaW5kZW50X2Rvd25faW1wbCgpOwotICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJlbmQ7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duX2ltcGwoKTsKLSAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiZW5kOyIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJpcHJvdC5SZWFkRmllbGRFbmQ7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duX2ltcGwoKTsKLQotICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiZW5kOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd25faW1wbCgpOwotCi0gIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJmaW5hbGx5IiA8PCBlbmRsOwotICBpbmRlbnRfdXBfaW1wbCgpOwotICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiaXByb3QuUmVhZFN0cnVjdEVuZDsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duX2ltcGwoKTsKLSAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImVuZDsiIDw8IGVuZGw7Ci0KLSAgLy8gYWxsIHJlcXVpcmVkIGZpZWxkcyBoYXZlIGJlZW4gcmVhZD8gIAotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7Ci0gICAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAKLSAgICAgICAgImlmIG5vdCBfcmVxX2lzc2V0XyIgPDwgcHJvcF9uYW1lKCpmX2l0ZXIsIGlzX2V4Y2VwdGlvbikgPDwgZW5kbDsKLSAgICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8IAotICAgICAgICAidGhlbiByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24uQ3JlYXRlKCBUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLCAnIiA8PCAKLSAgICAgICAgcHJvcF9uYW1lKCpmX2l0ZXIsIGlzX2V4Y2VwdGlvbikgPDwgIicpOyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLSAgCi0gIGluZGVudF9kb3duX2ltcGwoKTsKLSAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBzdHJpbmcgY2xzX25tOwotCi0gIGNsc19ubSA9IHR5cGVfbmFtZSh0c3RydWN0LHRydWUsZmFsc2UsaXNfZXhjZXB0aW9uLGlzX2V4Y2VwdGlvbik7Ci0KLSAgaW5kZW50X2ltcGwob3V0KSA8PCAicHJvY2VkdXJlICIgPDwgY2xzX3ByZWZpeCA8PCBjbHNfbm0gPDwgIi5SZWFkKCBjb25zdCBpcHJvdDogSVByb3RvY29sKTsiIDw8IGVuZGw7Ci0gIGluZGVudF9pbXBsKG91dCkgPDwgInZhciIgPDwgZW5kbDsKLSAgaW5kZW50X3VwX2ltcGwoKTsKLSAgaW5kZW50X2ltcGwob3V0KSA8PCAiZmllbGRfIDogSUZpZWxkOyIgPDwgZW5kbDsKLSAgaW5kZW50X2ltcGwob3V0KSA8PCAic3RydWMgOiBJU3RydWN0OyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd25faW1wbCgpOwotICBvdXQgPDwgbG9jYWxfdmFycy5zdHIoKSA8PCBlbmRsOwotICBvdXQgPDwgY29kZV9ibG9jay5zdHIoKTsKLX0KLQotdm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfcmVzdWx0X3dyaXRlcl9pbXBsKG9zdHJlYW0mIG91dCwgc3RyaW5nIGNsc19wcmVmaXgsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbikgewotCi0gIG9zdHJpbmdzdHJlYW0gbG9jYWxfdmFyczsKLSAgb3N0cmluZ3N0cmVhbSBjb2RlX2Jsb2NrOwotCi0gIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotCi0gIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJiZWdpbiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwX2ltcGwoKTsKLQotICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAic3RydWMgOj0gVFN0cnVjdEltcGwuQ3JlYXRlKCciIDw8IG5hbWUgPDwgIicpOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAib3Byb3QuV3JpdGVTdHJ1Y3RCZWdpbihzdHJ1Yyk7IiA8PCBlbmRsOwotCi0gIGlmIChmaWVsZHMuc2l6ZSgpID4gMCkgewotICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJmaWVsZF8gOj0gVEZpZWxkSW1wbC5DcmVhdGU7IiA8PCBlbmRsOwotICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiaWYgKF9faXNzZXRfIiA8PCBwcm9wX25hbWUoKmZfaXRlcixpc19leGNlcHRpb24pIDw8ICIpIHRoZW4iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiYmVnaW4iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXBfaW1wbCgpOwotICAgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwKLSAgICAgICAgImZpZWxkXy5OYW1lIDo9ICciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJzsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PAotICAgICAgICAiZmllbGRfLlR5cGVfICA6PSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICI7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwKLSAgICAgICAgImZpZWxkXy5JRCA6PSAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICI7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwKLSAgICAgICAgIm9wcm90LldyaXRlRmllbGRCZWdpbihmaWVsZF8pOyIgPDwgZW5kbDsKLSAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChjb2RlX2Jsb2NrLCBpc19leGNlcHRpb24sICpmX2l0ZXIsICIiLCBsb2NhbF92YXJzKTsKLSAgICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJvcHJvdC5Xcml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd25faW1wbCgpOwotICAgIH0KLSAgfQotCi0KLSAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgIm9wcm90LldyaXRlRmllbGRTdG9wKCk7IiA8PCBlbmRsOwotICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAib3Byb3QuV3JpdGVTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd25faW1wbCgpOwotICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIHN0cmluZyBjbHNfbm07Ci0KLSAgY2xzX25tID0gdHlwZV9uYW1lKHRzdHJ1Y3QsdHJ1ZSxmYWxzZSxpc19leGNlcHRpb24saXNfZXhjZXB0aW9uKTsKLQotICBpbmRlbnRfaW1wbChvdXQpIDw8ICJwcm9jZWR1cmUgIiA8PCBjbHNfcHJlZml4IDw8IGNsc19ubSA8PCAiLldyaXRlKCBjb25zdCBvcHJvdDogSVByb3RvY29sKTsiIDw8IGVuZGw7Ci0gIGluZGVudF9pbXBsKG91dCkgPDwgInZhciIgPDwgZW5kbDsKLSAgaW5kZW50X3VwX2ltcGwoKTsKLSAgaW5kZW50X2ltcGwob3V0KSA8PCAic3RydWMgOiBJU3RydWN0OyIgPDwgZW5kbDsKLQotICBpZiAoZmllbGRzLnNpemUoKSA+IDApIHsKLSAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJmaWVsZF8gOiBJRmllbGQ7IiA8PCBlbmRsOwotICB9Ci0KLSAgb3V0IDw8IGxvY2FsX3ZhcnMuc3RyKCk7Ci0gIGluZGVudF9kb3duX2ltcGwoKTsKLSAgb3V0IDw8IGNvZGVfYmxvY2suc3RyKCk7Ci0KLX0KLQotdm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3Rfd3JpdGVyX2ltcGwob3N0cmVhbSYgb3V0LCBzdHJpbmcgY2xzX3ByZWZpeCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKSB7Ci0KLSAgb3N0cmluZ3N0cmVhbSBsb2NhbF92YXJzOwotICBvc3RyaW5nc3RyZWFtIGNvZGVfYmxvY2s7Ci0KLSAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0KLSAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImJlZ2luIiA8PCBlbmRsOwotICBpbmRlbnRfdXBfaW1wbCgpOwotCi0gIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJzdHJ1YyA6PSBUU3RydWN0SW1wbC5DcmVhdGUoJyIgPDwgbmFtZSA8PCAiJyk7IiA8PCBlbmRsOwotCi0gIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJvcHJvdC5Xcml0ZVN0cnVjdEJlZ2luKHN0cnVjKTsiIDw8IGVuZGw7Ci0KLSAgaWYgKGZpZWxkcy5zaXplKCkgPiAwKSB7Ci0gICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImZpZWxkXyA6PSBURmllbGRJbXBsLkNyZWF0ZTsiIDw8IGVuZGw7Ci0gIH0KLQotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGJvb2wgbnVsbF9hbGxvd2VkID0gdHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpOwotICAgIGJvb2wgaXNfb3B0aW9uYWwgID0gKCgqZl9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpOwotICAgIGlmIChudWxsX2FsbG93ZWQpIHsKLSAgICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8Ci0gICAgICAgICJpZiAoIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpLCBpc19leGNlcHRpb24pIDw8ICIgPD4gbmlsKSI7Ci0gICAgICBpZiAoaXNfb3B0aW9uYWwpIHsKLSAgICAgICAgY29kZV9ibG9jayA8PCAKLSAgICAgICAgICAiIGFuZCBfX2lzc2V0XyIgPDwgcHJvcF9uYW1lKCpmX2l0ZXIsaXNfZXhjZXB0aW9uKTsKLSAgICAgIH0KLSAgICAgIGNvZGVfYmxvY2sgPDwgCi0gICAgICAgICIgdGhlbiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJiZWdpbiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cF9pbXBsKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmIChpc19vcHRpb25hbCkgewotICAgICAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiaWYgKF9faXNzZXRfIiA8PCBwcm9wX25hbWUoKmZfaXRlcixpc19leGNlcHRpb24pIDw8ICIpIHRoZW4iIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJiZWdpbiIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X3VwX2ltcGwoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICIvLyByZXF1aXJlZCBmaWVsZCIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0gICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwKLSAgICAgICJmaWVsZF8uTmFtZSA6PSAnIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIic7IiA8PCBlbmRsOwotICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8Ci0gICAgICAiZmllbGRfLlR5cGVfICA6PSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICI7IiA8PCBlbmRsOwotICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8Ci0gICAgICAiZmllbGRfLklEIDo9ICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwKLSAgICAgICJvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oZmllbGRfKTsiIDw8IGVuZGw7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKGNvZGVfYmxvY2ssIGlzX2V4Y2VwdGlvbiwgKmZfaXRlciwgIiIsIGxvY2FsX3ZhcnMpOwotICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJvcHJvdC5Xcml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOwotICAgIGlmIChudWxsX2FsbG93ZWQgfHwgaXNfb3B0aW9uYWwpIHsKLSAgICAgIGluZGVudF9kb3duX2ltcGwoKTsKLSAgICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJlbmQ7IiA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJvcHJvdC5Xcml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbDsKLSAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgIm9wcm90LldyaXRlU3RydWN0RW5kKCk7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duX2ltcGwoKTsKLSAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBzdHJpbmcgY2xzX25tOwotCi0gIGNsc19ubSA9IHR5cGVfbmFtZSh0c3RydWN0LHRydWUsZmFsc2UsaXNfZXhjZXB0aW9uLGlzX2V4Y2VwdGlvbik7Ci0KLSAgaW5kZW50X2ltcGwob3V0KSA8PCAicHJvY2VkdXJlICIgPDwgY2xzX3ByZWZpeCA8PCBjbHNfbm0gPDwgIi5Xcml0ZSggY29uc3Qgb3Byb3Q6IElQcm90b2NvbCk7IiA8PCBlbmRsOwotICBpbmRlbnRfaW1wbChvdXQpIDw8ICJ2YXIiIDw8IGVuZGw7Ci0gIGluZGVudF91cF9pbXBsKCk7Ci0gIGluZGVudF9pbXBsKG91dCkgPDwgInN0cnVjIDogSVN0cnVjdDsiIDw8IGVuZGw7Ci0gIGlmIChmaWVsZHMuc2l6ZSgpID4gMCkgewotICAgIGluZGVudF9pbXBsKG91dCkgPDwgImZpZWxkXyA6IElGaWVsZDsiIDw8IGVuZGw7Ci0gIH0KLSAgb3V0IDw8IGxvY2FsX3ZhcnMuc3RyKCk7Ci0gIGluZGVudF9kb3duX2ltcGwoKTsKLSAgb3V0IDw8IGNvZGVfYmxvY2suc3RyKCk7Ci0KLX0KLQotdm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfdG9zdHJpbmdfaW1wbChvc3RyZWFtJiBvdXQsIHN0cmluZyBjbHNfcHJlZml4LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24sIGJvb2wgaXNfeF9mYWN0b3J5KSB7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIHN0cmluZyBjbHNfbm07Ci0KLSAgaWYgKGlzX2V4Y2VwdGlvbikgewotICAgIGNsc19ubSA9IHR5cGVfbmFtZSh0c3RydWN0LHRydWUsKCEgaXNfeF9mYWN0b3J5KSxpc194X2ZhY3RvcnksdHJ1ZSk7Ci0gIH0gZWxzZSB7Ci0gICAgY2xzX25tID0gdHlwZV9uYW1lKHRzdHJ1Y3QsdHJ1ZSxmYWxzZSk7Ci0gIH0KLQotICBzdHJpbmcgdG1wX3NiID0gdG1wKCJfc2IiKTsKLSAgc3RyaW5nIHRtcF9maXJzdCA9IHRtcCgiX2ZpcnN0Iik7Ci0gIGJvb2wgdXNlRmlyc3RGbGFnID0gZmFsc2U7Ci0KLSAgaW5kZW50X2ltcGwob3V0KSA8PCAiZnVuY3Rpb24gIiA8PCBjbHNfcHJlZml4IDw8IGNsc19ubSA8PCAiLlRvU3RyaW5nOiBzdHJpbmc7IiA8PCBlbmRsOwotICBpbmRlbnRfaW1wbChvdXQpIDw8ICJ2YXIiIDw8IGVuZGw7Ci0gIGluZGVudF91cF9pbXBsKCk7Ci0gIGluZGVudF9pbXBsKG91dCkgPDwgdG1wX3NiIDw8ICIgOiBUVGhyaWZ0U3RyaW5nQnVpbGRlcjsiIDw8IGVuZGw7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgYm9vbCBpc19vcHRpb25hbCAgPSAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCk7Ci0gICAgaWYoIGlzX29wdGlvbmFsKSB7Ci0gICAgICBpbmRlbnRfaW1wbChvdXQpIDw8IHRtcF9maXJzdCA8PCAiIDogQm9vbGVhbjsiIDw8IGVuZGw7Ci0gICAgICB1c2VGaXJzdEZsYWcgPSB0cnVlOwotICAgIH0KLSAgICBicmVhazsKLSAgfQotICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0gIGluZGVudF9pbXBsKG91dCkgPDwgImJlZ2luIiA8PCBlbmRsOwotICBpbmRlbnRfdXBfaW1wbCgpOwotCi0gIGluZGVudF9pbXBsKG91dCkgPDwgdG1wX3NiIDw8ICIgOj0gVFRocmlmdFN0cmluZ0J1aWxkZXIuQ3JlYXRlKCcoJyk7IiA8PCBlbmRsOwotICBpbmRlbnRfaW1wbChvdXQpIDw8ICJ0cnkiIDw8IGVuZGw7Ci0gIGluZGVudF91cF9pbXBsKCk7Ci0KLSAgaWYoIHVzZUZpcnN0RmxhZykgewotICAgIGluZGVudF9pbXBsKG91dCkgPDwgdG1wX2ZpcnN0IDw8ICIgOj0gVFJVRTsiIDw8IGVuZGw7Ci0gIH0KLSAgCi0gIGJvb2wgaGFkX3JlcXVpcmVkID0gZmFsc2U7ICAvLyBzZXQgdG8gdHJ1ZSBhZnRlciBmaXJzdCByZXF1aXJlZCBmaWVsZCBoYXMgYmVlbiBwcm9jZXNzZWQKLSAgCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgYm9vbCBudWxsX2FsbG93ZWQgPSB0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgYm9vbCBpc19vcHRpb25hbCAgPSAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCk7Ci0gICAgaWYgKG51bGxfYWxsb3dlZCkgewotICAgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiaWYgKCIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSwgaXNfZXhjZXB0aW9uKSA8PCAiIDw+IG5pbCkiOwotICAgICAgaWYgKGlzX29wdGlvbmFsKSB7Ci0gICAgICAgIG91dCA8PCAiIGFuZCBfX2lzc2V0XyIgPDwgcHJvcF9uYW1lKCpmX2l0ZXIsaXNfZXhjZXB0aW9uKTsKLSAgICAgIH0KLSAgICAgIG91dCA8PCAiIHRoZW4gYmVnaW4iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXBfaW1wbCgpOwotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAoaXNfb3B0aW9uYWwpIHsKLSAgICAgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiaWYgKF9faXNzZXRfIiA8PCBwcm9wX25hbWUoKmZfaXRlcixpc19leGNlcHRpb24pIDw8ICIpIHRoZW4gYmVnaW4iIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF91cF9pbXBsKCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYoIHVzZUZpcnN0RmxhZyAmJiAoISBoYWRfcmVxdWlyZWQpKSB7Ci0gICAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJpZiBub3QgIiA8PCB0bXBfZmlyc3QgPDwgIiB0aGVuICIgPDwgdG1wX3NiIDw8ICIuQXBwZW5kKCcsJyk7IiA8PCBlbmRsOwotICAgICAgaWYgKGlzX29wdGlvbmFsKSB7Ci0gICAgICAgIGluZGVudF9pbXBsKG91dCkgPDwgdG1wX2ZpcnN0IDw8ICIgOj0gRkFMU0U7IiA8PCBlbmRsOwotICAgICAgfQotICAgICAgaW5kZW50X2ltcGwob3V0KSA8PAotICAgICAgICB0bXBfc2IgPDwgIi5BcHBlbmQoJyIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSwgaXNfZXhjZXB0aW9uKSA8PCAiOiAnKTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudF9pbXBsKG91dCkgPDwKLSAgICAgICAgdG1wX3NiIDw8ICIuQXBwZW5kKCcsICIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSwgaXNfZXhjZXB0aW9uKSA8PCAiOiAnKTsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgdF90eXBlKiB0dHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKLSAgICB3aGlsZSAodHR5cGUtPmlzX3R5cGVkZWYoKSkgewotICAgICAgdHR5cGUgPSAoKHRfdHlwZWRlZiopdHR5cGUpLT5nZXRfdHlwZSgpOwotICAgIH0KLQotICAgIGlmICh0dHlwZS0+aXNfeGNlcHRpb24oKSB8fCB0dHlwZS0+aXNfc3RydWN0KCkpIHsKLSAgICAgIGluZGVudF9pbXBsKG91dCkgPDwKLSAgICAgICAgImlmICgiIDw8IHByb3BfbmFtZSgoKmZfaXRlciksIGlzX2V4Y2VwdGlvbikgPDwgIiA9IG5pbCkgdGhlbiAiIDw8IHRtcF9zYiA8PCAgIi5BcHBlbmQoJzxudWxsPicpIGVsc2UgIiA8PCB0bXBfc2IgPDwgICIuQXBwZW5kKCI8PCBwcm9wX25hbWUoKCpmX2l0ZXIpLCBpc19leGNlcHRpb24pICA8PCAiLlRvU3RyaW5nKCkpOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIGluZGVudF9pbXBsKG91dCkgPDwKLSAgICAgICAgdG1wX3NiIDw8ICIuQXBwZW5kKEludGVnZXIoIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpLCBpc19leGNlcHRpb24pIDw8ICIpKTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudF9pbXBsKG91dCkgPDwKLSAgICAgICAgdG1wX3NiIDw8ICIuQXBwZW5kKCIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSwgaXNfZXhjZXB0aW9uKSAgPDwgIik7IiA8PCBlbmRsOwotICAgIH0KLSAgICAKLSAgICBpZiAobnVsbF9hbGxvd2VkIHx8IGlzX29wdGlvbmFsKSB7Ci0gICAgICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0gICAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJlbmQ7IiA8PCBlbmRsOwotICAgIH0gCi0gICAgCi0gICAgaWYgKCFpc19vcHRpb25hbCkgewotICAgICAgaGFkX3JlcXVpcmVkID0gdHJ1ZTsgIC8vIG5vdyBfX2ZpcnN0IG11c3QgYmUgZmFsc2UsIHNvIHdlIGRvbid0IG5lZWQgdG8gY2hlY2sgaXQgYW55bW9yZQotICAgIH0KLSAgfQotCi0gIGluZGVudF9pbXBsKG91dCkgPDwKLSAgICB0bXBfc2IgPDwgIi5BcHBlbmQoJyknKTsiIDw8IGVuZGw7Ci0gIGluZGVudF9pbXBsKG91dCkgPDwKLSAgICAiUmVzdWx0IDo9ICIgPDwgdG1wX3NiIDw8ICAiLlRvU3RyaW5nOyIgPDwgZW5kbDsKLSAgaWYoIHVzZUZpcnN0RmxhZykgewotICAgIGluZGVudF9pbXBsKG91dCkgPDwKLSAgICAgICJpZiAiIDw8IHRtcF9maXJzdCA8PCAgIiB0aGVuIHtwcmV2ZW50IHdhcm5pbmd9OyIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudF9kb3duX2ltcGwoKTsKLSAgaW5kZW50X2ltcGwob3V0KSA8PCAiZmluYWxseSIgPDwgZW5kbDsKLSAgaW5kZW50X3VwX2ltcGwoKTsKLSAgaW5kZW50X2ltcGwob3V0KSA8PCB0bXBfc2IgPDwgIi5GcmVlOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd25faW1wbCgpOwotICBpbmRlbnRfaW1wbChvdXQpIDw8ICJlbmQ7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duX2ltcGwoKTsKLSAgaW5kZW50X2ltcGwob3V0KSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi1ib29sIHRfZGVscGhpX2dlbmVyYXRvcjo6aXNfdm9pZCggdF90eXBlKiB0eXBlICkgewotICB3aGlsZSAodHlwZS0+aXNfdHlwZWRlZigpKSB7Ci0gICAgdHlwZSA9ICgodF90eXBlZGVmKil0eXBlKS0+Z2V0X3R5cGUoKTsKLSAgfQotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBpZiAodGJhc2UgPT0gdF9iYXNlX3R5cGU6OlRZUEVfVk9JRCkgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUihkZWxwaGksICJkZWxwaGkiLCAKLSIgICAgYW5zaXN0cl9iaW5hcnk6ICBVc2UgQW5zaVN0cmluZyBmb3IgYmluYXJ5IGRhdGF0eXBlIChkZWZhdWx0IGlzIFRCeXRlcykuXG4iIAotIiAgICByZWdpc3Rlcl90eXBlczogIEVuYWJsZSBUeXBlUmVnaXN0cnksIGFsbG93cyBmb3IgY3JlYXRpb24gb2Ygc3RydWN0LCB1bmlvblxuIiAKLSIgICAgICAgICAgICAgICAgICAgICBhbmQgY29udGFpbmVyIGluc3RhbmNlcyBieSBpbnRlcmZhY2Ugb3IgVHlwZUluZm8oKVxuIgotIiAgICBjb25zdHByZWZpeDogICAgIE5hbWUgVENvbnN0YW50cyBjbGFzc2VzIGFmdGVyIElETCB0byByZWR1Y2UgYW1iaWd1aXRpZXNcbiIKLSIgICAgZXZlbnRzOiAgICAgICAgICBFbmFibGUgYW5kIHVzZSBwcm9jZXNzaW5nIGV2ZW50cyBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUuXG4iCi0iICAgIHhtbGRvYzogICAgICAgICAgRW5hYmxlIFhNTERvYyBjb21tZW50cyBmb3IgSGVscCBJbnNpZ2h0IGV0Yy5cbiIpCi0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9lcmxfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2VybF9nZW5lcmF0b3IuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3MzVhZDEuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2VybF9nZW5lcmF0b3IuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMDU5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlICJ0X2dlbmVyYXRvci5oIgotI2luY2x1ZGUgInBsYXRmb3JtLmgiCi0jaW5jbHVkZSAidmVyc2lvbi5oIgotCi11c2luZyBzdGQ6Om1hcDsKLXVzaW5nIHN0ZDo6b2ZzdHJlYW07Ci11c2luZyBzdGQ6Om9zdHJlYW07Ci11c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Ci11c2luZyBzdGQ6OnN0cmluZzsKLXVzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwotdXNpbmcgc3RkOjp2ZWN0b3I7Ci0KLXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBlbmRsID0gIlxuIjsgIC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKLQotLyoqCi0gKiBFcmxhbmcgY29kZSBnZW5lcmF0b3IuCi0gKgotICovCi1jbGFzcyB0X2VybF9nZW5lcmF0b3IgOiBwdWJsaWMgdF9nZW5lcmF0b3IgewotIHB1YmxpYzoKLSAgdF9lcmxfZ2VuZXJhdG9yKAotICAgICAgdF9wcm9ncmFtKiBwcm9ncmFtLAotICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKLSAgICA6IHRfZ2VuZXJhdG9yKHByb2dyYW0pCi0gIHsKLSAgICAodm9pZCkgcGFyc2VkX29wdGlvbnM7Ci0gICAgKHZvaWQpIG9wdGlvbl9zdHJpbmc7Ci0gICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tZXJsIjsKLQotICAgIGxlZ2FjeV9uYW1lc18gPSAocGFyc2VkX29wdGlvbnMuZmluZCgibGVnYWN5bmFtZXMiKSAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7Ci0gIH0KLQotICAvKioKLSAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcwotICAgKi8KLQotICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7Ci0gIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7Ci0KLSAgLyoqCi0gICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmICAodF90eXBlZGVmKiAgdHR5cGVkZWYpOwotICB2b2lkIGdlbmVyYXRlX2VudW0gICAgICh0X2VudW0qICAgICB0ZW51bSk7Ci0gIHZvaWQgZ2VuZXJhdGVfY29uc3QgICAgKHRfY29uc3QqICAgIHRjb25zdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3RydWN0ICAgKHRfc3RydWN0KiAgIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uICh0X3N0cnVjdCogICB0eGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UgICh0X3NlcnZpY2UqICB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfbWVtYmVyX3R5cGUoc3RkOjpvc3RyZWFtICYgb3V0LCB0X3R5cGUqIHR5cGUpOwotICB2b2lkIGdlbmVyYXRlX21lbWJlcl92YWx1ZShzdGQ6Om9zdHJlYW0gJiBvdXQsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOwotCi0gIHN0ZDo6c3RyaW5nIHJlbmRlcl9tZW1iZXJfdHlwZSh0X2ZpZWxkICogZmllbGQpOwotICBzdGQ6OnN0cmluZyByZW5kZXJfbWVtYmVyX3ZhbHVlKHRfZmllbGQgKiBmaWVsZCk7Ci0gIHN0ZDo6c3RyaW5nIHJlbmRlcl9tZW1iZXJfcmVxdWlyZWRuZXNzKHRfZmllbGQgKiBmaWVsZCk7Ci0KLS8vICBzdGQ6OnN0cmluZyByZW5kZXJfZGVmYXVsdF92YWx1ZSh0X3R5cGUqIHR5cGUpOwotICBzdGQ6OnN0cmluZyByZW5kZXJfZGVmYXVsdF92YWx1ZSh0X2ZpZWxkICogZmllbGQpOwotICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7Ci0gIHN0ZDo6c3RyaW5nIHJlbmRlcl90eXBlX3Rlcm0odF90eXBlKiB0dHlwZSwgYm9vbCBleHBhbmRfc3RydWN0cywgYm9vbCBleHRlbmRlZF9pbmZvID0gZmFsc2UpOwotCi0gIC8qKgotICAgKiBTdHJ1Y3QgZ2VuZXJhdGlvbiBjb2RlCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfZXJsX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX2VybF9zdHJ1Y3RfZGVmaW5pdGlvbihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2VybF9zdHJ1Y3RfbWVtYmVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2ZpZWxkICogdG1lbWJlcik7Ci0gIHZvaWQgZ2VuZXJhdGVfZXJsX3N0cnVjdF9pbmZvKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfZXJsX2V4dGVuZGVkX3N0cnVjdF9pbmZvKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfZXJsX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLQotICAvKioKLSAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyAgICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfZnVuY3Rpb25faW5mbyAgICAgKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0KLSAgLyoqCi0gICAqIEhlbHBlciByZW5kZXJpbmcgZnVuY3Rpb25zCi0gICAqLwotCi0gIHN0ZDo6c3RyaW5nIGVybF9hdXRvZ2VuX2NvbW1lbnQoKTsKLSAgc3RkOjpzdHJpbmcgZXJsX2ltcG9ydHMoKTsKLSAgc3RkOjpzdHJpbmcgcmVuZGVyX2luY2x1ZGVzKCk7Ci0gIHN0ZDo6c3RyaW5nIHR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlKTsKLQotICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7Ci0gIHN0ZDo6c3RyaW5nIHR5cGVfbW9kdWxlKHRfdHlwZSogdHR5cGUpOwotCi0gIHN0ZDo6c3RyaW5nIG1ha2Vfc2FmZV9mb3JfbW9kdWxlX25hbWUoc3RkOjpzdHJpbmcgaW4pIHsKLSAgICBpZihsZWdhY3lfbmFtZXNfKSB7Ci0gICAgICByZXR1cm4gZGVjYXBpdGFsaXplKGluKTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIHVuZGVyc2NvcmUoaW4pOwotICAgIH0KLSAgfQotCi0gIHN0ZDo6c3RyaW5nIGF0b21pZnkoc3RkOjpzdHJpbmcgaW4pIHsKLSAgICBpZihsZWdhY3lfbmFtZXNfKSB7Ci0gICAgICByZXR1cm4gIiciICsgZGVjYXBpdGFsaXplKGluKSArICInIjsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuICInIiArIGluICsgIiciOwotICAgIH0KLSAgfQotCi0gIHN0ZDo6c3RyaW5nIGNvbnN0aWZ5KHN0ZDo6c3RyaW5nIGluKSB7Ci0gICAgaWYobGVnYWN5X25hbWVzXykgewotICAgICAgcmV0dXJuIGNhcGl0YWxpemUoaW4pOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gdXBwZXJjYXNlKGluKTsKLSAgICB9Ci0gIH0KLQotICBzdGF0aWMgc3RkOjpzdHJpbmcgY29tbWVudChzdHJpbmcgaW4pOwotCi0gcHJpdmF0ZToKLQotICBib29sIGhhc19kZWZhdWx0X3ZhbHVlKHRfZmllbGQgKik7Ci0KLSAgLyogaWYgdHJ1ZSByZXRhaW4gcHJlIDAuOS4yIG5hbWluZyBzY2hlbWUgZm9yIGZ1bmN0aW9ucywgYXRvbXMgYW5kIGNvbnN0cyAqLwotICBib29sIGxlZ2FjeV9uYW1lc187Ci0KLSAgLyoqCi0gICAqIGFkZCBmdW5jdGlvbiB0byBleHBvcnQgbGlzdAotICAgKi8KLQotICB2b2lkIGV4cG9ydF9mdW5jdGlvbih0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0gIHZvaWQgZXhwb3J0X3N0cmluZyhzdGQ6OnN0cmluZyBuYW1lLCBpbnQgbnVtKTsKLQotICB2b2lkIGV4cG9ydF90eXBlc19mdW5jdGlvbih0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0gIHZvaWQgZXhwb3J0X3R5cGVzX3N0cmluZyhzdGQ6OnN0cmluZyBuYW1lLCBpbnQgbnVtKTsKLQotICAvKioKLSAgICogd3JpdGUgb3V0IGhlYWRlcnMgYW5kIGZvb3RlcnMgZm9yIGhybCBmaWxlcwotICAgKi8KLQotICB2b2lkIGhybF9oZWFkZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIG5hbWUpOwotICB2b2lkIGhybF9mb290ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIG5hbWUpOwotCi0gIC8qKgotICAgKiBzdHVmZiB0byBzcGl0IG91dCBhdCB0aGUgdG9wIG9mIGdlbmVyYXRlZCBmaWxlcwotICAgKi8KLQotICBib29sIGV4cG9ydF9saW5lc19maXJzdF87Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBleHBvcnRfbGluZXNfOwotCi0gIGJvb2wgZXhwb3J0X3R5cGVzX2xpbmVzX2ZpcnN0XzsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIGV4cG9ydF90eXBlc19saW5lc187Ci0KLSAgLyoqCi0gICAqIEZpbGUgc3RyZWFtcwotICAgKi8KLQotICBzdGQ6Om9zdHJpbmdzdHJlYW0gZl9pbmZvXzsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIGZfaW5mb19leHRfOwotCi0gIHN0ZDo6b2ZzdHJlYW0gZl90eXBlc19maWxlXzsKLSAgc3RkOjpvZnN0cmVhbSBmX3R5cGVzX2hybF9maWxlXzsKLQotICBzdGQ6Om9mc3RyZWFtIGZfY29uc3RzXzsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIGZfc2VydmljZV87Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9zZXJ2aWNlX2ZpbGVfOwotICBzdGQ6Om9mc3RyZWFtIGZfc2VydmljZV9ocmxfOwotCi19OwotCi0KLS8qKgotICogVUkgZm9yIGZpbGUgZ2VuZXJhdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBuZWNlc3NhcnkgZmlsZSBvdXRwdXQKLSAqIHN0cmVhbXMuCi0gKgotICogQHBhcmFtIHRwcm9ncmFtIFRoZSBwcm9ncmFtIHRvIGdlbmVyYXRlCi0gKi8KLXZvaWQgdF9lcmxfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKLSAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5Ci0gIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7Ci0KLSAgLy8gc2V0dXAgZXhwb3J0IGxpbmVzCi0gIGV4cG9ydF9saW5lc19maXJzdF8gPSB0cnVlOwotICBleHBvcnRfdHlwZXNfbGluZXNfZmlyc3RfID0gdHJ1ZTsKLQotICAvLyB0eXBlcyBmaWxlcwotICBzdHJpbmcgZl90eXBlc19uYW1lID0gZ2V0X291dF9kaXIoKSArIG1ha2Vfc2FmZV9mb3JfbW9kdWxlX25hbWUocHJvZ3JhbV9uYW1lXykgKyAiX3R5cGVzLmVybCI7Ci0gIHN0cmluZyBmX3R5cGVzX2hybF9uYW1lID0gZ2V0X291dF9kaXIoKSArIG1ha2Vfc2FmZV9mb3JfbW9kdWxlX25hbWUocHJvZ3JhbV9uYW1lXykgKyAiX3R5cGVzLmhybCI7Ci0KLSAgZl90eXBlc19maWxlXy5vcGVuKGZfdHlwZXNfbmFtZS5jX3N0cigpKTsKLSAgZl90eXBlc19ocmxfZmlsZV8ub3BlbihmX3R5cGVzX2hybF9uYW1lLmNfc3RyKCkpOwotCi0gIGhybF9oZWFkZXIoZl90eXBlc19ocmxfZmlsZV8sIG1ha2Vfc2FmZV9mb3JfbW9kdWxlX25hbWUocHJvZ3JhbV9uYW1lXykgKyAiX3R5cGVzIik7Ci0KLSAgZl90eXBlc19maWxlXyA8PAotICAgIGVybF9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsIDw8Ci0gICAgIi1tb2R1bGUoIiA8PCBtYWtlX3NhZmVfZm9yX21vZHVsZV9uYW1lKHByb2dyYW1fbmFtZV8pIDw8ICJfdHlwZXMpLiIgPDwgZW5kbCA8PAotICAgIGVybF9pbXBvcnRzKCkgPDwgZW5kbDsKLQotICBmX3R5cGVzX2ZpbGVfIDw8Ci0gICAgIi1pbmNsdWRlKFwiIiA8PCBtYWtlX3NhZmVfZm9yX21vZHVsZV9uYW1lKHByb2dyYW1fbmFtZV8pIDw8ICJfdHlwZXMuaHJsXCIpLiIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgZl90eXBlc19ocmxfZmlsZV8gPDwgcmVuZGVyX2luY2x1ZGVzKCkgPDwgZW5kbDsKLQotICAvLyBjb25zdHMgZmlsZQotICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBtYWtlX3NhZmVfZm9yX21vZHVsZV9uYW1lKHByb2dyYW1fbmFtZV8pICsgIl9jb25zdGFudHMuaHJsIjsKLSAgZl9jb25zdHNfLm9wZW4oZl9jb25zdHNfbmFtZS5jX3N0cigpKTsKLQotICBmX2NvbnN0c18gPDwKLSAgICBlcmxfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbCA8PAotICAgIGVybF9pbXBvcnRzKCkgPDwgZW5kbCA8PAotICAgICItaW5jbHVkZShcIiIgPDwgbWFrZV9zYWZlX2Zvcl9tb2R1bGVfbmFtZShwcm9ncmFtX25hbWVfKSA8PCAiX3R5cGVzLmhybFwiKS4iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotfQotCi0vKioKLSAqIEJvaWxlcnBsYXRlIGF0IGJlZ2lubmluZyBhbmQgZW5kIG9mIGhlYWRlciBmaWxlcwotICovCi12b2lkIHRfZXJsX2dlbmVyYXRvcjo6aHJsX2hlYWRlcihvc3RyZWFtJiBvdXQsIHN0cmluZyBuYW1lKSB7Ci0gIG91dCA8PCAiLWlmbmRlZihfIiA8PCBuYW1lIDw8ICJfaW5jbHVkZWQpLiIgPDwgZW5kbCA8PAotICAgICItZGVmaW5lKF8iIDw8IG5hbWUgPDwgIl9pbmNsdWRlZCwgeWVhaCkuIiA8PCBlbmRsOwotfQotCi12b2lkIHRfZXJsX2dlbmVyYXRvcjo6aHJsX2Zvb3Rlcihvc3RyZWFtJiBvdXQsIHN0cmluZyBuYW1lKSB7Ci0gICh2b2lkKSBuYW1lOwotICBvdXQgPDwgIi1lbmRpZi4iIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhbGwgdGhlIGltcG9ydHMgbmVjZXNzYXJ5IGZvciBpbmNsdWRpbmcgYW5vdGhlciBUaHJpZnQgcHJvZ3JhbQotICovCi1zdHJpbmcgdF9lcmxfZ2VuZXJhdG9yOjpyZW5kZXJfaW5jbHVkZXMoKSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X3Byb2dyYW0qPiYgaW5jbHVkZXMgPSBwcm9ncmFtXy0+Z2V0X2luY2x1ZGVzKCk7Ci0gIHN0cmluZyByZXN1bHQgPSAiIjsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmNsdWRlcy5zaXplKCk7ICsraSkgewotICAgIHJlc3VsdCArPSAiLWluY2x1ZGUoXCIiICsgbWFrZV9zYWZlX2Zvcl9tb2R1bGVfbmFtZShpbmNsdWRlc1tpXS0+Z2V0X25hbWUoKSkgKyAiX3R5cGVzLmhybFwiKS5cbiI7Ci0gIH0KLSAgaWYgKGluY2x1ZGVzLnNpemUoKSA+IDApIHsKLSAgICByZXN1bHQgKz0gIlxuIjsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioKLSAqIEF1dG9nZW4nZCBjb21tZW50Ci0gKi8KLXN0cmluZyB0X2VybF9nZW5lcmF0b3I6OmVybF9hdXRvZ2VuX2NvbW1lbnQoKSB7Ci0gIHJldHVybgotICAgIHN0ZDo6c3RyaW5nKCIlJVxuIikgKwotICAgICIlJSBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoIiArIFRIUklGVF9WRVJTSU9OICsgIilcbiIgKwotICAgICIlJVxuIiArCi0gICAgIiUlIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkdcbiIgKwotICAgICIlJVxuIjsKLX0KLQotLyoqCi0gKiBDb21tZW50IG91dCB0ZXh0Ci0gKi8KLQotc3RyaW5nIHRfZXJsX2dlbmVyYXRvcjo6Y29tbWVudChzdHJpbmcgaW4pCi17Ci0gIHNpemVfdCBwb3MgPSAwOwotICBpbi5pbnNlcnQocG9zLCAiJSUgIik7Ci0gIHdoaWxlICggKHBvcyA9IGluLmZpbmRfZmlyc3Rfb2YoJ1xuJywgcG9zKSkgIT0gc3RyaW5nOjpucG9zICkKLSAgewotICAgIGluLmluc2VydCgrK3BvcywgIiUlICIpOwotICB9Ci0gIHJldHVybiBpbjsKLX0KLQotLyoqCi0gKiBQcmludHMgc3RhbmRhcmQgdGhyaWZ0IGltcG9ydHMKLSAqLwotc3RyaW5nIHRfZXJsX2dlbmVyYXRvcjo6ZXJsX2ltcG9ydHMoKSB7Ci0gIHJldHVybiAiIjsKLX0KLQotLyoqCi0gKiBDbG9zZXMgdGhlIHR5cGUgZmlsZXMKLSAqLwotdm9pZCB0X2VybF9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKLQotICBleHBvcnRfdHlwZXNfc3RyaW5nKCJzdHJ1Y3RfaW5mbyIsIDEpOwotICBleHBvcnRfdHlwZXNfc3RyaW5nKCJzdHJ1Y3RfaW5mb19leHQiLCAxKTsKLSAgZl90eXBlc19maWxlXyA8PCAiLWV4cG9ydChbIiA8PCBleHBvcnRfdHlwZXNfbGluZXNfLnN0cigpIDw8ICJdKS4iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBmX3R5cGVzX2ZpbGVfIDw8IGZfaW5mb18uc3RyKCk7Ci0gIGZfdHlwZXNfZmlsZV8gPDwgInN0cnVjdF9pbmZvKF8pIC0+IGVybGFuZzplcnJvcihmdW5jdGlvbl9jbGF1c2UpLiIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGZfdHlwZXNfZmlsZV8gPDwgZl9pbmZvX2V4dF8uc3RyKCk7Ci0gIGZfdHlwZXNfZmlsZV8gPDwgInN0cnVjdF9pbmZvX2V4dChfKSAtPiBlcmxhbmc6ZXJyb3IoZnVuY3Rpb25fY2xhdXNlKS4iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBocmxfZm9vdGVyKGZfdHlwZXNfaHJsX2ZpbGVfLCBzdHJpbmcoIkJPR1VTIikpOwotCi0gIGZfdHlwZXNfZmlsZV8uY2xvc2UoKTsKLSAgZl90eXBlc19ocmxfZmlsZV8uY2xvc2UoKTsKLSAgZl9jb25zdHNfLmNsb3NlKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgdHlwZWRlZi4gbm8gb3AKLSAqCi0gKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgotICovCi12b2lkIHRfZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7Ci0gICh2b2lkKSB0dHlwZWRlZjsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgY29kZSBmb3IgYW4gZW51bWVyYXRlZCB0eXBlLiBEb25lIHVzaW5nIGEgY2xhc3MgdG8gc2NvcGUKLSAqIHRoZSB2YWx1ZXMuCi0gKgotICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgotICovCi12b2lkIHRfZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7Ci0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOwotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKLQotICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgewotICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0gICAgc3RyaW5nIG5hbWUgPSAoKmNfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgaW5kZW50KGZfdHlwZXNfaHJsX2ZpbGVfKSA8PAotICAgICAgIi1kZWZpbmUoIiA8PAotICAgICAgY29uc3RpZnkobWFrZV9zYWZlX2Zvcl9tb2R1bGVfbmFtZShwcm9ncmFtX25hbWVfKSkgPDwKLSAgICAgICJfIiA8PCBjb25zdGlmeSh0ZW51bS0+Z2V0X25hbWUoKSkgPDwKLSAgICAgICJfIiA8PCBjb25zdGlmeShuYW1lKSA8PAotICAgICAgIiwgIiA8PCB2YWx1ZSA8PCAiKS4iIDw8Ci0gICAgZW5kbDsKLSAgfQotCi0gIGZfdHlwZXNfaHJsX2ZpbGVfIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGUgYSBjb25zdGFudCB2YWx1ZQotICovCi12b2lkIHRfZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KSB7Ci0gIHRfdHlwZSogdHlwZSA9IHRjb25zdC0+Z2V0X3R5cGUoKTsKLSAgc3RyaW5nIG5hbWUgPSB0Y29uc3QtPmdldF9uYW1lKCk7Ci0gIHRfY29uc3RfdmFsdWUqIHZhbHVlID0gdGNvbnN0LT5nZXRfdmFsdWUoKTsKLQotICBmX2NvbnN0c18gPDwKLSAgICAiLWRlZmluZSgiIDw8IGNvbnN0aWZ5KG1ha2Vfc2FmZV9mb3JfbW9kdWxlX25hbWUocHJvZ3JhbV9uYW1lXykpIDw8Ci0gICAgIl8iIDw8IGNvbnN0aWZ5KG5hbWUpIDw8Ci0gICAgIiwgIiA8PCByZW5kZXJfY29uc3RfdmFsdWUodHlwZSwgdmFsdWUpIDw8Ci0gICAgIikuIiA8PCBlbmRsIDw8Ci0gIGVuZGw7Ci19Ci0KLS8qKgotICogUHJpbnRzIHRoZSB2YWx1ZSBvZiBhIGNvbnN0YW50IHdpdGggdGhlIGdpdmVuIHR5cGUuIE5vdGUgdGhhdCB0eXBlIGNoZWNraW5nCi0gKiBpcyBOT1QgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24gYXMgaXQgaXMgYWx3YXlzIHJ1biBiZWZvcmVoYW5kIHVzaW5nIHRoZQotICogdmFsaWRhdGVfdHlwZXMgbWV0aG9kIGluIG1haW4uY2MKLSAqLwotc3RyaW5nIHRfZXJsX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIG91dCA8PCAnIicgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICBvdXQgPDwgKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgewotICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgb3V0IDw8ICIjIiA8PCBhdG9taWZ5KHR5cGUtPmdldF9uYW1lKCkpIDw8ICJ7IjsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLQotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOwotICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKLSAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7Ci0gICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChmaXJzdCkgewotICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0IDw8ICIsIjsKLSAgICAgIH0KLSAgICAgIG91dCA8PCB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7Ci0gICAgICBvdXQgPDwgIiA9ICI7Ci0gICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSI7Ci0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLQotICAgIG91dCA8PCAiZGljdDpmcm9tX2xpc3QoWyI7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIGksIGVuZCA9IHZhbHVlLT5nZXRfbWFwKCkuZW5kKCk7Ci0gICAgZm9yIChpID0gdmFsdWUtPmdldF9tYXAoKS5iZWdpbigpOyBpICE9IGVuZDspIHsKLSAgICAgIG91dCA8PCAieyIKLSAgICAgICAgICA8PCByZW5kZXJfY29uc3RfdmFsdWUoa3R5cGUsIGktPmZpcnN0KSAgPDwgIiwiCi0gICAgICAgICAgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHZ0eXBlLCBpLT5zZWNvbmQpIDw8ICJ9IjsKLSAgICAgIGlmICggKytpICE9IGVuZCApIHsKLSAgICAgICAgb3V0IDw8ICIsIjsKLSAgICAgIH0KLSAgICB9Ci0gICAgb3V0IDw8ICJdKSI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICB0X3R5cGUqIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICBvdXQgPDwgInNldHM6ZnJvbV9saXN0KFsiOwotICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIGksIGVuZCA9IHZhbHVlLT5nZXRfbGlzdCgpLmVuZCgpOwotICAgIGZvciggaSA9IHZhbHVlLT5nZXRfbGlzdCgpLmJlZ2luKCk7IGkgIT0gZW5kOyApIHsKLSAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZXR5cGUsICppKSA7Ci0gICAgICBpZiAoICsraSAhPSBlbmQgKSB7Ci0gICAgICAgIG91dCA8PCAiLCI7Ci0gICAgICB9Ci0gICAgfQotICAgIG91dCA8PCAiXSkiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHRfdHlwZSogZXR5cGU7Ci0gICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICBvdXQgPDwgIlsiOwotCi0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7Ci0gICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3Q9ZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgIiwiOwotICAgICAgfQotICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShldHlwZSwgKnZfaXRlcik7Ci0gICAgfQotICAgIG91dCA8PCAiXSI7Ci0gIH0gZWxzZSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBDT05TVEFOVCBGT1IgVFlQRTogIiArIHR5cGUtPmdldF9uYW1lKCk7Ci0gIH0KLSAgcmV0dXJuIG91dC5zdHIoKTsKLX0KLQotCi1zdHJpbmcgdF9lcmxfZ2VuZXJhdG9yOjpyZW5kZXJfZGVmYXVsdF92YWx1ZSh0X2ZpZWxkKiBmaWVsZCkgewotICB0X3R5cGUgKnR5cGUgPSBmaWVsZC0+Z2V0X3R5cGUoKTsKLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gIiMiICsgYXRvbWlmeSh0eXBlLT5nZXRfbmFtZSgpKSArICJ7fSI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gImRpY3Q6bmV3KCkiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgcmV0dXJuICJzZXRzOm5ldygpIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICByZXR1cm4gIltdIjsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gInVuZGVmaW5lZCI7Ci0gIH0KLX0KLQotc3RyaW5nIHRfZXJsX2dlbmVyYXRvcjo6cmVuZGVyX21lbWJlcl90eXBlKHRfZmllbGQgKiBmaWVsZCkgewotICB0X3R5cGUgKiB0eXBlID0gZ2V0X3RydWVfdHlwZShmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICByZXR1cm4gInN0cmluZygpIHwgYmluYXJ5KCkiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIHJldHVybiAiYm9vbGVhbigpIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZXR1cm4gImludGVnZXIoKSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICByZXR1cm4gImZsb2F0KCkiOwotICAgIGRlZmF1bHQ6Ci0gICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IHVuc3VwcG9ydGVkIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJpbnRlZ2VyKCkiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gYXRvbWlmeSh0eXBlLT5nZXRfbmFtZSgpKSArICIoKSI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gImRpY3QoKSI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gInNldCgpIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICByZXR1cm4gImxpc3QoKSI7Ci0gIH0gZWxzZSB7Ci0gICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiB1bnN1cHBvcnRlZCB0eXBlICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotICB9Ci19Ci0KLXN0cmluZyB0X2VybF9nZW5lcmF0b3I6OnJlbmRlcl9tZW1iZXJfcmVxdWlyZWRuZXNzKHRfZmllbGQgKiBmaWVsZCkgewotICAgIHN3aXRjaChmaWVsZC0+Z2V0X3JlcSgpKSB7Ci0gICAgICAgIGNhc2UgdF9maWVsZDo6VF9SRVFVSVJFRDogICAgICAgcmV0dXJuICJyZXF1aXJlZCI7Ci0gICAgICAgIGNhc2UgdF9maWVsZDo6VF9PUFRJT05BTDogICAgICAgcmV0dXJuICJvcHRpb25hbCI7Ci0gICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJ1bmRlZmluZWQiOwotICAgIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QKLSAqLwotdm9pZCB0X2VybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICBnZW5lcmF0ZV9lcmxfc3RydWN0KHRzdHJ1Y3QsIGZhbHNlKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZXhjZXB0aW9uLiBCYXNpY2FsbHkgdGhlIHNhbWUKLSAqIGFzIGEgc3RydWN0IGJ1dCBleHRlbmRzIHRoZSBFeGNlcHRpb24gY2xhc3MuCi0gKgotICogQHBhcmFtIHR4Y2VwdGlvbiBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2VybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKLSAgZ2VuZXJhdGVfZXJsX3N0cnVjdCh0eGNlcHRpb24sIHRydWUpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdAotICovCi12b2lkIHRfZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZXJsX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pIHsKLSAgKHZvaWQpIGlzX2V4Y2VwdGlvbjsKLSAgZ2VuZXJhdGVfZXJsX3N0cnVjdF9kZWZpbml0aW9uKGZfdHlwZXNfaHJsX2ZpbGVfLCB0c3RydWN0KTsKLSAgZ2VuZXJhdGVfZXJsX3N0cnVjdF9pbmZvKGZfaW5mb18sIHRzdHJ1Y3QpOwotICBnZW5lcmF0ZV9lcmxfZXh0ZW5kZWRfc3RydWN0X2luZm8oZl9pbmZvX2V4dF8sIHRzdHJ1Y3QpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lcmxfc3RydWN0X2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkKLXsKLSAgaW5kZW50KG91dCkgPDwgIiUlIHN0cnVjdCAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgc3RkOjpzdHJpbmdzdHJlYW0gYnVmOwotICBidWYgPDwgaW5kZW50KCkgPDwgIi1yZWNvcmQoIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIiwgeyI7Ci0gIHN0cmluZyBmaWVsZF9pbmRlbnQoYnVmLnN0cigpLnNpemUoKSwgJyAnKTsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgZm9yICh2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOykgewotICAgIGdlbmVyYXRlX2VybF9zdHJ1Y3RfbWVtYmVyKGJ1ZiwgKm1faXRlcik7Ci0gICAgaWYgKCArK21faXRlciAhPSBtZW1iZXJzLmVuZCgpICkgewotICAgICAgYnVmIDw8ICIsIiA8PCBlbmRsIDw8IGZpZWxkX2luZGVudDsKLSAgICB9Ci0gIH0KLSAgYnVmIDw8ICJ9KS4iOwotCi0gIG91dCA8PCBidWYuc3RyKCkgPDwgZW5kbDsKLSAgb3V0IDw8Ci0gICAgIi10eXBlICIgKyB0eXBlX25hbWUodHN0cnVjdCkgPDwgIigpIDo6ICMiICsgdHlwZV9uYW1lKHRzdHJ1Y3QpICsgInt9LiIKLSAgICAgIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgdGhlIHJlY29yZCBmaWVsZCBkZWZpbml0aW9uCi0gKi8KLQotdm9pZCB0X2VybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VybF9zdHJ1Y3RfbWVtYmVyKG9zdHJlYW0gJiBvdXQsIHRfZmllbGQgKiB0bWVtYmVyKQotewotICBvdXQgPDwgYXRvbWlmeSh0bWVtYmVyLT5nZXRfbmFtZSgpKTsKLSAgaWYgKGhhc19kZWZhdWx0X3ZhbHVlKHRtZW1iZXIpKQotICAgIG91dCA8PCAiID0gIiAgPDwgcmVuZGVyX21lbWJlcl92YWx1ZSh0bWVtYmVyKTsKLSAgb3V0IDw8ICIgOjogIiA8PCByZW5kZXJfbWVtYmVyX3R5cGUodG1lbWJlcik7Ci19Ci0KLWJvb2wgdF9lcmxfZ2VuZXJhdG9yOjpoYXNfZGVmYXVsdF92YWx1ZSh0X2ZpZWxkICogZmllbGQpIHsKLSAgdF90eXBlICp0eXBlID0gZmllbGQtPmdldF90eXBlKCk7Ci0gIGlmICghZmllbGQtPmdldF92YWx1ZSgpKSB7Ci0gICAgaWYgKCBmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKLSAgICAgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpIHx8IHR5cGUtPmlzX21hcCgpIHx8Ci0gICAgICAgICAgdHlwZS0+aXNfc2V0KCkgfHwgdHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9IGVsc2UgewotICAgIHJldHVybiB0cnVlOwotICB9Ci19Ci0KLXN0cmluZyB0X2VybF9nZW5lcmF0b3I6OnJlbmRlcl9tZW1iZXJfdmFsdWUodF9maWVsZCAqIGZpZWxkKSB7Ci0gIGlmICghZmllbGQtPmdldF92YWx1ZSgpKSB7Ci0gICAgcmV0dXJuIHJlbmRlcl9kZWZhdWx0X3ZhbHVlKGZpZWxkKTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gcmVuZGVyX2NvbnN0X3ZhbHVlKGZpZWxkLT5nZXRfdHlwZSgpLCBmaWVsZC0+Z2V0X3ZhbHVlKCkpOwotICB9Ci19Ci0KLQotCi0vKioKLSAqIEdlbmVyYXRlcyB0aGUgcmVhZCBtZXRob2QgZm9yIGEgc3RydWN0Ci0gKi8KLXZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lcmxfc3RydWN0X2luZm8ob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBpbmRlbnQob3V0KSA8PCAic3RydWN0X2luZm8oIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIikgLT4iIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgcmVuZGVyX3R5cGVfdGVybSh0c3RydWN0LCB0cnVlKSA8PCAiOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgb3V0IDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lcmxfZXh0ZW5kZWRfc3RydWN0X2luZm8ob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBpbmRlbnQob3V0KSA8PCAic3RydWN0X2luZm9fZXh0KCIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIpIC0+IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgb3V0IDw8IGluZGVudCgpIDw8IHJlbmRlcl90eXBlX3Rlcm0odHN0cnVjdCwgdHJ1ZSwgdHJ1ZSkgPDwgIjsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHRocmlmdCBzZXJ2aWNlLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc2VydmljZV9uYW1lXyA9IG1ha2Vfc2FmZV9mb3JfbW9kdWxlX25hbWUoc2VydmljZV9uYW1lXyk7Ci0KLSAgc3RyaW5nIGZfc2VydmljZV9ocmxfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBzZXJ2aWNlX25hbWVfICsgIl90aHJpZnQuaHJsIjsKLSAgc3RyaW5nIGZfc2VydmljZV9uYW1lID0gZ2V0X291dF9kaXIoKSArIHNlcnZpY2VfbmFtZV8gKyAiX3RocmlmdC5lcmwiOwotICBmX3NlcnZpY2VfZmlsZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKLSAgZl9zZXJ2aWNlX2hybF8ub3BlbihmX3NlcnZpY2VfaHJsX25hbWUuY19zdHIoKSk7Ci0KLSAgLy8gUmVzZXQgc2VydmljZSB0ZXh0IGFnZ3JlZ2F0aW5nIHN0cmVhbSBzdHJlYW1zCi0gIGZfc2VydmljZV8uc3RyKCIiKTsKLSAgZXhwb3J0X2xpbmVzXy5zdHIoIiIpOwotICBleHBvcnRfbGluZXNfZmlyc3RfID0gdHJ1ZTsKLQotICBocmxfaGVhZGVyKGZfc2VydmljZV9ocmxfLCBzZXJ2aWNlX25hbWVfKTsKLQotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGZfc2VydmljZV9ocmxfIDw8ICItaW5jbHVkZShcIiIgPDwKLSAgICAgIG1ha2Vfc2FmZV9mb3JfbW9kdWxlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkpIDw8ICJfdGhyaWZ0LmhybFwiKS4gJSBpbmhlcml0ICIgPDwgZW5kbDsKLSAgfQotCi0gIGZfc2VydmljZV9ocmxfIDw8Ci0gICAgIi1pbmNsdWRlKFwiIiA8PCBtYWtlX3NhZmVfZm9yX21vZHVsZV9uYW1lKHByb2dyYW1fbmFtZV8pIDw8ICJfdHlwZXMuaHJsXCIpLiIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIHRocmVlIG1haW4gcGFydHMgb2YgdGhlIHNlcnZpY2UgKHdlbGwsIHR3byBmb3Igbm93IGluIFBIUCkKLSAgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRzZXJ2aWNlKTsgLy8gY3Bpcm86IE5ldyBFcmxhbmcgT3JkZXIKLQotICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSk7Ci0KLSAgLy8gaW5kZW50X2Rvd24oKTsKLQotICBmX3NlcnZpY2VfZmlsZV8gPDwKLSAgICBlcmxfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbCA8PAotICAgICItbW9kdWxlKCIgPDwgc2VydmljZV9uYW1lXyA8PCAiX3RocmlmdCkuIiA8PCBlbmRsIDw8Ci0gICAgIi1iZWhhdmlvdXIodGhyaWZ0X3NlcnZpY2UpLiIgPDwgZW5kbCA8PCBlbmRsIDw8Ci0gICAgZXJsX2ltcG9ydHMoKSA8PCBlbmRsOwotCi0gIGZfc2VydmljZV9maWxlXyA8PCAiLWluY2x1ZGUoXCIiIDw8IG1ha2Vfc2FmZV9mb3JfbW9kdWxlX25hbWUodHNlcnZpY2UtPmdldF9uYW1lKCkpIDw8ICJfdGhyaWZ0LmhybFwiKS4iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBmX3NlcnZpY2VfZmlsZV8gPDwgIi1leHBvcnQoWyIgPDwgZXhwb3J0X2xpbmVzXy5zdHIoKSA8PCAiXSkuIiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgZl9zZXJ2aWNlX2ZpbGVfIDw8IGZfc2VydmljZV8uc3RyKCk7Ci0KLSAgaHJsX2Zvb3RlcihmX3NlcnZpY2VfaHJsXywgZl9zZXJ2aWNlX25hbWUpOwotCi0gIC8vIENsb3NlIHNlcnZpY2UgZmlsZQotICBmX3NlcnZpY2VfZmlsZV8uY2xvc2UoKTsKLSAgZl9zZXJ2aWNlX2hybF8uY2xvc2UoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgaGVscGVyIGZ1bmN0aW9ucyBmb3IgYSBzZXJ2aWNlLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgotICovCi12b2lkIHRfZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0KLSAgLy8gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAvLyAgIiUgSEVMUEVSIEZVTkNUSU9OUyBBTkQgU1RSVUNUVVJFUyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGV4cG9ydF9zdHJpbmcoInN0cnVjdF9pbmZvIiwgMSk7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9lcmxfZnVuY3Rpb25faGVscGVycygqZl9pdGVyKTsKLSAgfQotICBmX3NlcnZpY2VfICAgIDw8ICJzdHJ1Y3RfaW5mbyhfKSAtPiBlcmxhbmc6ZXJyb3IoZnVuY3Rpb25fY2xhdXNlKS4iIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGFuZCBoZWxwZXJzIGZvciBhIGZ1bmN0aW9uLgotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uCi0gKi8KLXZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lcmxfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgKHZvaWQpIHRmdW5jdGlvbjsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGludGVyZmFjZSBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgotICovCi12b2lkIHRfZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotCi0gIGV4cG9ydF9zdHJpbmcoImZ1bmN0aW9uX2luZm8iLCAyKTsKLQotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgZl9zZXJ2aWNlXyA8PCAiJSUlIGludGVyZmFjZSIgPDwgZW5kbDsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiJSAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCBlbmRsOwotCi0gICAgZ2VuZXJhdGVfZnVuY3Rpb25faW5mbyh0c2VydmljZSwgKmZfaXRlcik7Ci0gIH0KLQotICAvLyBJbmhlcml0YW5jZSAtIHBhc3MgdW5rbm93biBmdW5jdGlvbnMgdG8gYmFzZSBjbGFzcwotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJmdW5jdGlvbl9pbmZvKEZ1bmN0aW9uLCBJbmZvVHlwZSkgLT4iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBtYWtlX3NhZmVfZm9yX21vZHVsZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJfdGhyaWZ0OmZ1bmN0aW9uX2luZm8oRnVuY3Rpb24sIEluZm9UeXBlKS4iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICB9IGVsc2UgewotICAgICAgLy8gcmV0dXJuIGZ1bmN0aW9uX2NsYXVzZSBlcnJvciBmb3Igbm9uLWV4aXN0ZW50IGZ1bmN0aW9ucwotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJmdW5jdGlvbl9pbmZvKF9GdW5jLCBfSW5mbykgLT4gZXJsYW5nOmVycm9yKGZ1bmN0aW9uX2NsYXVzZSkuIgotICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbl9pbmZvKEZ1bmN0aW9uTmFtZSwgcGFyYW1zX3R5cGUpIGFuZAotICogZnVuY3Rpb25faW5mbyhGdW5jdGlvbk5hbWUsIHJlcGx5X3R5cGUpCi0gKi8KLXZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9mdW5jdGlvbl9pbmZvKHRfc2VydmljZSogdHNlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgKHZvaWQpIHRzZXJ2aWNlOwotICBzdHJpbmcgbmFtZV9hdG9tID0gYXRvbWlmeSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpOwotCi0gIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKLQotICAvLyBmdW5jdGlvbl9pbmZvKEZ1bmN0aW9uLCBwYXJhbXNfdHlwZSk6Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJmdW5jdGlvbl9pbmZvKCIgPDwgbmFtZV9hdG9tIDw8ICIsIHBhcmFtc190eXBlKSAtPiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8IHJlbmRlcl90eXBlX3Rlcm0oYXJnX3N0cnVjdCwgdHJ1ZSkgPDwgIjsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLQotICAvLyBmdW5jdGlvbl9pbmZvKEZ1bmN0aW9uLCByZXBseV90eXBlKToKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgImZ1bmN0aW9uX2luZm8oIiA8PCBuYW1lX2F0b20gPDwgIiwgcmVwbHlfdHlwZSkgLT4iIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAgIHJlbmRlcl90eXBlX3Rlcm0odGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCBmYWxzZSkgPDwgIjsiIDw8IGVuZGw7Ci0gIGVsc2UgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJvbmV3YXlfdm9pZDsiIDw8IGVuZGw7Ci0gIGVsc2UKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIntzdHJ1Y3QsIFtdfSIgPDwgIjsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgLy8gZnVuY3Rpb25faW5mbyhGdW5jdGlvbiwgZXhjZXB0aW9ucyk6Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJmdW5jdGlvbl9pbmZvKCIgPDwgbmFtZV9hdG9tIDw8ICIsIGV4Y2VwdGlvbnMpIC0+IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8IHJlbmRlcl90eXBlX3Rlcm0oeHMsIHRydWUpIDw8ICI7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotfQotCi0vKioKLSAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGZvcm0gJ3R5cGUgbmFtZShhcmdzKScKLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KLSAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KLSAqLwotc3RyaW5nIHRfZXJsX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHJldHVybgotICAgIHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArCi0gICAgIihUaGlzIiArICBjYXBpdGFsaXplKGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKSkgKyAiKSI7Ci19Ci0KLS8qKgotICogQWRkIGEgZnVuY3Rpb24gdG8gdGhlIGV4cG9ydHMgbGlzdAotICovCi12b2lkIHRfZXJsX2dlbmVyYXRvcjo6ZXhwb3J0X3N0cmluZyhzdHJpbmcgbmFtZSwgaW50IG51bSkgewotICBpZiAoZXhwb3J0X2xpbmVzX2ZpcnN0XykgewotICAgIGV4cG9ydF9saW5lc19maXJzdF8gPSBmYWxzZTsKLSAgfSBlbHNlIHsKLSAgICBleHBvcnRfbGluZXNfIDw8ICIsICI7Ci0gIH0KLSAgZXhwb3J0X2xpbmVzXyA8PCBuYW1lIDw8ICIvIiA8PCBudW07Ci19Ci0KLXZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpleHBvcnRfdHlwZXNfZnVuY3Rpb24odF9mdW5jdGlvbiogdGZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0KLSAgZXhwb3J0X3R5cGVzX3N0cmluZyhwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgMSAvLyBUaGlzCi0gICAgICAgICAgICAgICAgICAgICAgKyAoKHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSktPmdldF9tZW1iZXJzKCkpLnNpemUoKQotICAgICAgICAgICAgICAgICAgICAgICk7Ci19Ci0KLXZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpleHBvcnRfdHlwZXNfc3RyaW5nKHN0cmluZyBuYW1lLCBpbnQgbnVtKSB7Ci0gIGlmIChleHBvcnRfdHlwZXNfbGluZXNfZmlyc3RfKSB7Ci0gICAgZXhwb3J0X3R5cGVzX2xpbmVzX2ZpcnN0XyA9IGZhbHNlOwotICB9IGVsc2UgewotICAgIGV4cG9ydF90eXBlc19saW5lc18gPDwgIiwgIjsKLSAgfQotICBleHBvcnRfdHlwZXNfbGluZXNfIDw8IG5hbWUgPDwgIi8iIDw8IG51bTsKLX0KLQotdm9pZCB0X2VybF9nZW5lcmF0b3I6OmV4cG9ydF9mdW5jdGlvbih0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLQotICBleHBvcnRfc3RyaW5nKHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSwKLSAgICAgICAgICAgICAgICAxIC8vIFRoaXMKLSAgICAgICAgICAgICAgICArICgodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKS0+Z2V0X21lbWJlcnMoKSkuc2l6ZSgpCi0gICAgICAgICAgICAgICAgKTsKLX0KLQotCi0vKioKLSAqIFJlbmRlcnMgYSBmaWVsZCBsaXN0Ci0gKi8KLXN0cmluZyB0X2VybF9nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgc3RyaW5nIHJlc3VsdCA9ICIiOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgcmVzdWx0ICs9ICIsICI7IC8vIGluaXRpYWwgY29tbWEgdG8gY29tcGVuc2F0ZSBmb3IgaW5pdGlhbCBUaGlzCi0gICAgfSBlbHNlIHsKLSAgICAgIHJlc3VsdCArPSAiLCAiOwotICAgIH0KLSAgICByZXN1bHQgKz0gY2FwaXRhbGl6ZSgoKmZfaXRlciktPmdldF9uYW1lKCkpOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0cmluZyB0X2VybF9nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlKSB7Ci0gIHN0cmluZyBwcmVmaXggPSAiIjsKLSAgc3RyaW5nIG5hbWUgPSB0dHlwZS0+Z2V0X25hbWUoKTsKLQotICBpZiAodHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpIHx8IHR0eXBlLT5pc19zZXJ2aWNlKCkpIHsKLSAgICBuYW1lID0gdHR5cGUtPmdldF9uYW1lKCk7Ci0gIH0KLQotICByZXR1cm4gYXRvbWlmeShwcmVmaXggKyBuYW1lKTsKLX0KLQotLyoqCi0gKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhIEVybGFuZyAidHlwZSIgKG1hY3JvIGZvciBpbnQgY29uc3RhbnRzKQotICovCi1zdHJpbmcgdF9lcmxfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgcmV0dXJuICI/dFR5cGVfU1RSSU5HIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICByZXR1cm4gIj90VHlwZV9CT09MIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICByZXR1cm4gIj90VHlwZV9CWVRFIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIHJldHVybiAiP3RUeXBlX0kxNiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICByZXR1cm4gIj90VHlwZV9JMzIiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmV0dXJuICI/dFR5cGVfSTY0IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIHJldHVybiAiP3RUeXBlX0RPVUJMRSI7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAiP3RUeXBlX0kzMiI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiAiP3RUeXBlX1NUUlVDVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gIj90VHlwZV9NQVAiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgcmV0dXJuICI/dFR5cGVfU0VUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICByZXR1cm4gIj90VHlwZV9MSVNUIjsKLSAgfQotCi0gIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotCi0vKioKLSAqIEdlbmVyYXRlIGFuIEVybGFuZyB0ZXJtIHdoaWNoIHJlcHJlc2VudHMgYSB0aHJpZnQgdHlwZQotICovCi1zdGQ6OnN0cmluZyB0X2VybF9nZW5lcmF0b3I6OnJlbmRlcl90eXBlX3Rlcm0odF90eXBlKiB0eXBlLCBib29sIGV4cGFuZF9zdHJ1Y3RzLCBib29sIGV4dGVuZGVkX2luZm8pIHsKLSAgICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIHJldHVybiAic3RyaW5nIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICByZXR1cm4gImJvb2wiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIHJldHVybiAiYnl0ZSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICByZXR1cm4gImkxNiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICByZXR1cm4gImkzMiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZXR1cm4gImk2NCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICByZXR1cm4gImRvdWJsZSI7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAiaTMyIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgaWYgKGV4cGFuZF9zdHJ1Y3RzKSB7Ci0KLSAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIGJ1ZjsKLSAgICAgIGJ1ZiA8PCAie3N0cnVjdCwgWyI7Ci0gICAgICBzdHJpbmcgZmllbGRfaW5kZW50KGJ1Zi5zdHIoKS5zaXplKCksICcgJyk7Ci0KLSAgICAgIHRfc3RydWN0OjptZW1iZXJzX3R5cGUgY29uc3QmIGZpZWxkcyA9IHN0YXRpY19jYXN0PHRfc3RydWN0Kj4odHlwZSktPmdldF9tZW1iZXJzKCk7Ci0gICAgICB0X3N0cnVjdDo6bWVtYmVyc190eXBlOjpjb25zdF9pdGVyYXRvciBpLCBlbmQgPSBmaWVsZHMuZW5kKCk7Ci0gICAgICBmb3IoIGkgPSBmaWVsZHMuYmVnaW4oKTsgaSAhPSBlbmQ7ICkKLSAgICAgIHsKLSAgICAgICAgdF9zdHJ1Y3Q6Om1lbWJlcnNfdHlwZTo6dmFsdWVfdHlwZSBtZW1iZXIgPSAqaTsKLSAgICAgICAgaW50MzJfdCBrZXkgID0gbWVtYmVyLT5nZXRfa2V5KCk7Ci0gICAgICAgIHN0cmluZyAgdHlwZSA9IHJlbmRlcl90eXBlX3Rlcm0obWVtYmVyLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UpOyAvLyByZWN1cnNpdmUgY2FsbAotCi0gICAgICAgIGlmICggIWV4dGVuZGVkX2luZm8gKSB7Ci0gICAgICAgICAgLy8gQ29udmVydCB0byBmb3JtYXQ6IHtzdHJ1Y3QsIFt7RmlkLCBUeXBlfXwuLi5dfQotICAgICAgICAgIGJ1ZiA8PCAieyIgPDwga2V5IDw8ICIsICIgIDw8IHR5cGUgPDwgIn0iOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIC8vIENvbnZlcnQgdG8gZm9ybWF0OiB7c3RydWN0LCBbe0ZpZCwgUmVxLCBUeXBlLCBOYW1lLCBEZWZ9fC4uLl19Ci0gICAgICAgICAgc3RyaW5nICBuYW1lICAgICAgICAgPSBtZW1iZXItPmdldF9uYW1lKCk7Ci0gICAgICAgICAgc3RyaW5nICB2YWx1ZSAgICAgICAgPSByZW5kZXJfbWVtYmVyX3ZhbHVlKG1lbWJlcik7Ci0gICAgICAgICAgc3RyaW5nICByZXF1aXJlZG5lc3MgPSByZW5kZXJfbWVtYmVyX3JlcXVpcmVkbmVzcyhtZW1iZXIpOwotICAgICAgICAgIGJ1ZiA8PAotICAgICAgICAgICAgInsiIDw8IGtleSA8PAotICAgICAgICAgICAgIiwgIiAgPDwgcmVxdWlyZWRuZXNzIDw8Ci0gICAgICAgICAgICAiLCAiICA8PCB0eXBlIDw8Ci0gICAgICAgICAgICAiLCAiIDw8IGF0b21pZnkobmFtZSkgPDwKLSAgICAgICAgICAgICIsICIgIDw8IHZhbHVlIDw8Ci0gICAgICAgICAgIn0iOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCArK2kgIT0gZW5kICkgewotICAgICAgICAgIGJ1ZiA8PCAiLCIgPDwgZW5kbCA8PCBmaWVsZF9pbmRlbnQ7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgYnVmIDw8ICJdfSIgPDwgZW5kbDsKLSAgICAgIHJldHVybiBidWYuc3RyKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiAie3N0cnVjdCwgeyIgKyBhdG9taWZ5KHR5cGVfbW9kdWxlKHR5cGUpKSArICIsICIgKyB0eXBlX25hbWUodHlwZSkgKyAifX0iOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIC8vIHttYXAsIEtleVR5cGUsIFZhbFR5cGV9Ci0gICAgdF90eXBlICprZXlfdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKLSAgICB0X3R5cGUgKnZhbF90eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOwotCi0gICAgcmV0dXJuICJ7bWFwLCAiICsgcmVuZGVyX3R5cGVfdGVybShrZXlfdHlwZSwgZmFsc2UpICsgIiwgIiArCi0gICAgICByZW5kZXJfdHlwZV90ZXJtKHZhbF90eXBlLCBmYWxzZSkgKyAifSI7Ci0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHRfdHlwZSAqZWxlbV90eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLQotICAgIHJldHVybiAie3NldCwgIiArIHJlbmRlcl90eXBlX3Rlcm0oZWxlbV90eXBlLCBmYWxzZSkgKyAifSI7Ci0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICB0X3R5cGUgKmVsZW1fdHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotCi0gICAgcmV0dXJuICJ7bGlzdCwgIiArIHJlbmRlcl90eXBlX3Rlcm0oZWxlbV90eXBlLCBmYWxzZSkgKyAifSI7Ci0gIH0KLQotICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Ci19Ci0KLXN0ZDo6c3RyaW5nIHRfZXJsX2dlbmVyYXRvcjo6dHlwZV9tb2R1bGUodF90eXBlKiB0dHlwZSkgewotICByZXR1cm4gbWFrZV9zYWZlX2Zvcl9tb2R1bGVfbmFtZSh0dHlwZS0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWUoKSkgKyAiX3R5cGVzIjsKLX0KLQotVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUihlcmwsICJFcmxhbmciLAotIiAgICBsZWdhY3luYW1lczogT3V0cHV0IGZpbGVzIHJldGFpbiBuYW1pbmcgY29udmVudGlvbnMgb2YgVGhyaWZ0IDAuOS4xIGFuZCBlYXJsaWVyLlxuIgotKQotCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2dlbmVyYXRvci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA0YzY1YS4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgInRfZ2VuZXJhdG9yLmgiCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotCi0vKioKLSAqIFRvcCBsZXZlbCBwcm9ncmFtIGdlbmVyYXRpb24gZnVuY3Rpb24uIENhbGxzIHRoZSBnZW5lcmF0b3Igc3ViY2xhc3MgbWV0aG9kcwotICogZm9yIHByZXBhcmluZyBmaWxlIHN0cmVhbXMgZXRjLiB0aGVuIGl0ZXJhdGVzIG92ZXIgYWxsIHRoZSBwYXJ0cyBvZiB0aGUKLSAqIHByb2dyYW0gdG8gcGVyZm9ybSB0aGUgY29ycmVjdCBhY3Rpb25zLgotICoKLSAqIEBwYXJhbSBwcm9ncmFtIFRoZSB0aHJpZnQgcHJvZ3JhbSB0byBjb21waWxlIGludG8gQysrIHNvdXJjZQotICovCi12b2lkIHRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9ncmFtKCkgewotICAvLyBJbml0aWFsaXplIHRoZSBnZW5lcmF0b3IKLSAgaW5pdF9nZW5lcmF0b3IoKTsKLQotICAvLyBHZW5lcmF0ZSBlbnVtcwotICB2ZWN0b3I8dF9lbnVtKj4gZW51bXMgPSBwcm9ncmFtXy0+Z2V0X2VudW1zKCk7Ci0gIHZlY3Rvcjx0X2VudW0qPjo6aXRlcmF0b3IgZW5faXRlcjsKLSAgZm9yIChlbl9pdGVyID0gZW51bXMuYmVnaW4oKTsgZW5faXRlciAhPSBlbnVtcy5lbmQoKTsgKytlbl9pdGVyKSB7Ci0gICAgZ2VuZXJhdGVfZW51bSgqZW5faXRlcik7Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSB0eXBlZGVmcwotICB2ZWN0b3I8dF90eXBlZGVmKj4gdHlwZWRlZnMgPSBwcm9ncmFtXy0+Z2V0X3R5cGVkZWZzKCk7Ci0gIHZlY3Rvcjx0X3R5cGVkZWYqPjo6aXRlcmF0b3IgdGRfaXRlcjsKLSAgZm9yICh0ZF9pdGVyID0gdHlwZWRlZnMuYmVnaW4oKTsgdGRfaXRlciAhPSB0eXBlZGVmcy5lbmQoKTsgKyt0ZF9pdGVyKSB7Ci0gICAgZ2VuZXJhdGVfdHlwZWRlZigqdGRfaXRlcik7Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSBzdHJ1Y3RzLCBleGNlcHRpb25zLCBhbmQgdW5pb25zIGluIGRlY2xhcmVkIG9yZGVyCi0gIHZlY3Rvcjx0X3N0cnVjdCo+IG9iamVjdHMgPSBwcm9ncmFtXy0+Z2V0X29iamVjdHMoKTsKLQotICB2ZWN0b3I8dF9zdHJ1Y3QqPjo6aXRlcmF0b3Igb19pdGVyOwotICBmb3IgKG9faXRlciA9IG9iamVjdHMuYmVnaW4oKTsgb19pdGVyICE9IG9iamVjdHMuZW5kKCk7ICsrb19pdGVyKSB7Ci0gICAgZ2VuZXJhdGVfZm9yd2FyZF9kZWNsYXJhdGlvbigqb19pdGVyKTsKLSAgfQotICBmb3IgKG9faXRlciA9IG9iamVjdHMuYmVnaW4oKTsgb19pdGVyICE9IG9iamVjdHMuZW5kKCk7ICsrb19pdGVyKSB7Ci0gICAgaWYgKCgqb19pdGVyKS0+aXNfeGNlcHRpb24oKSkgewotICAgICAgZ2VuZXJhdGVfeGNlcHRpb24oKm9faXRlcik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGdlbmVyYXRlX3N0cnVjdCgqb19pdGVyKTsKLSAgICB9Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSBjb25zdGFudHMKLSAgdmVjdG9yPHRfY29uc3QqPiBjb25zdHMgPSBwcm9ncmFtXy0+Z2V0X2NvbnN0cygpOwotICBnZW5lcmF0ZV9jb25zdHMoY29uc3RzKTsKLQotICAvLyBHZW5lcmF0ZSBzZXJ2aWNlcwotICB2ZWN0b3I8dF9zZXJ2aWNlKj4gc2VydmljZXMgPSBwcm9ncmFtXy0+Z2V0X3NlcnZpY2VzKCk7Ci0gIHZlY3Rvcjx0X3NlcnZpY2UqPjo6aXRlcmF0b3Igc3ZfaXRlcjsKLSAgZm9yIChzdl9pdGVyID0gc2VydmljZXMuYmVnaW4oKTsgc3ZfaXRlciAhPSBzZXJ2aWNlcy5lbmQoKTsgKytzdl9pdGVyKSB7Ci0gICAgc2VydmljZV9uYW1lXyA9IGdldF9zZXJ2aWNlX25hbWUoKnN2X2l0ZXIpOwotICAgIGdlbmVyYXRlX3NlcnZpY2UoKnN2X2l0ZXIpOwotICB9Ci0KLSAgLy8gQ2xvc2UgdGhlIGdlbmVyYXRvcgotICBjbG9zZV9nZW5lcmF0b3IoKTsKLX0KLQotc3RyaW5nIHRfZ2VuZXJhdG9yOjplc2NhcGVfc3RyaW5nKGNvbnN0IHN0cmluZyAmaW4pIGNvbnN0IHsKLSAgc3RyaW5nIHJlc3VsdCA9ICIiOwotICBmb3IgKHN0cmluZzo6Y29uc3RfaXRlcmF0b3IgaXQgPSBpbi5iZWdpbigpOyBpdCA8IGluLmVuZCgpOyBpdCsrKSB7Ci0gICAgc3RkOjptYXA8Y2hhciwgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciByZXMgPSBlc2NhcGVfLmZpbmQoKml0KTsKLSAgICBpZiAocmVzICE9IGVzY2FwZV8uZW5kKCkpIHsKLSAgICAgIHJlc3VsdC5hcHBlbmQocmVzLT5zZWNvbmQpOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXN1bHQucHVzaF9iYWNrKCppdCk7Ci0gICAgfQotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXZvaWQgdF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0cyh2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykgewotICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7Ci0gIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgZ2VuZXJhdGVfY29uc3QoKmNfaXRlcik7Ci0gIH0KLX0KLQotdm9pZCB0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3N0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBjb21tZW50X3N0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBsaW5lX3ByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgY29udGVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGNvbW1lbnRfZW5kKSB7Ci0gIGlmIChjb21tZW50X3N0YXJ0ICE9ICIiKSBpbmRlbnQob3V0KSA8PCBjb21tZW50X3N0YXJ0OwotICBzdHJpbmdzdHJlYW0gZG9jcyhjb250ZW50cywgaW9zX2Jhc2U6OmluKTsKLSAgd2hpbGUgKCAhIChkb2NzLmVvZigpIHx8IGRvY3MuZmFpbCgpKSkgewotICAgIGNoYXIgbGluZVsxMDI0XTsKLSAgICBkb2NzLmdldGxpbmUobGluZSwgMTAyNCk7Ci0KLSAgICAvLyBKdXN0IHBybnQgYSBuZXdsaW5lIHdoZW4gdGhlIGxpbmUgJiBwcmVmaXggYXJlIGVtcHR5LgotICAgIGlmIChzdHJsZW4obGluZSkgPT0gMCAmJiBsaW5lX3ByZWZpeCA9PSAiIiAmJiAhZG9jcy5lb2YoKSkgewotICAgICAgICBvdXQgPDwgc3RkOjplbmRsOwotICAgIH0gZWxzZSBpZiAoc3RybGVuKGxpbmUpID4gMCB8fCAhZG9jcy5lb2YoKSkgeyAgLy8gc2tpcCB0aGUgZW1wdHkgbGFzdCBsaW5lCi0gICAgICBpbmRlbnQob3V0KSA8PCBsaW5lX3ByZWZpeCA8PCBsaW5lIDw8IHN0ZDo6ZW5kbDsKLSAgICB9Ci0gIH0KLSAgaWYgKGNvbW1lbnRfZW5kICE9ICIiKSBpbmRlbnQob3V0KSA8PCBjb21tZW50X2VuZDsKLX0KLQotCi12b2lkIHRfZ2VuZXJhdG9yX3JlZ2lzdHJ5OjpyZWdpc3Rlcl9nZW5lcmF0b3IodF9nZW5lcmF0b3JfZmFjdG9yeSogZmFjdG9yeSkgewotICBnZW5fbWFwX3QmIHRoZV9tYXAgPSBnZXRfZ2VuZXJhdG9yX21hcCgpOwotICBpZiAodGhlX21hcC5maW5kKGZhY3RvcnktPmdldF9zaG9ydF9uYW1lKCkpICE9IHRoZV9tYXAuZW5kKCkpIHsKLSAgICBmYWlsdXJlKCJEdXBsaWNhdGUgZ2VuZXJhdG9ycyBmb3IgbGFuZ3VhZ2UgXCIlc1wiIVxuIiwgZmFjdG9yeS0+Z2V0X3Nob3J0X25hbWUoKS5jX3N0cigpKTsKLSAgfQotICB0aGVfbWFwW2ZhY3RvcnktPmdldF9zaG9ydF9uYW1lKCldID0gZmFjdG9yeTsKLX0KLQotdF9nZW5lcmF0b3IqIHRfZ2VuZXJhdG9yX3JlZ2lzdHJ5OjpnZXRfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG9wdGlvbnMpIHsKLSAgc3RyaW5nOjpzaXplX3R5cGUgY29sb24gPSBvcHRpb25zLmZpbmQoJzonKTsKLSAgc3RyaW5nIGxhbmd1YWdlID0gb3B0aW9ucy5zdWJzdHIoMCwgY29sb24pOwotCi0gIG1hcDxzdHJpbmcsIHN0cmluZz4gcGFyc2VkX29wdGlvbnM7Ci0gIGlmIChjb2xvbiAhPSBzdHJpbmc6Om5wb3MpIHsKLSAgICBzdHJpbmc6OnNpemVfdHlwZSBwb3MgPSBjb2xvbisxOwotICAgIHdoaWxlIChwb3MgIT0gc3RyaW5nOjpucG9zICYmIHBvcyA8IG9wdGlvbnMuc2l6ZSgpKSB7Ci0gICAgICBzdHJpbmc6OnNpemVfdHlwZSBuZXh0X3BvcyA9IG9wdGlvbnMuZmluZCgnLCcsIHBvcyk7Ci0gICAgICBzdHJpbmcgb3B0aW9uID0gb3B0aW9ucy5zdWJzdHIocG9zLCBuZXh0X3Bvcy1wb3MpOwotICAgICAgcG9zID0gKChuZXh0X3BvcyA9PSBzdHJpbmc6Om5wb3MpID8gbmV4dF9wb3MgOiBuZXh0X3BvcysxKTsKLQotICAgICAgc3RyaW5nOjpzaXplX3R5cGUgc2VwYXJhdG9yID0gb3B0aW9uLmZpbmQoJz0nKTsKLSAgICAgIHN0cmluZyBrZXksIHZhbHVlOwotICAgICAgaWYgKHNlcGFyYXRvciA9PSBzdHJpbmc6Om5wb3MpIHsKLSAgICAgICAga2V5ID0gb3B0aW9uOwotICAgICAgICB2YWx1ZSA9ICIiOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAga2V5ID0gb3B0aW9uLnN1YnN0cigwLCBzZXBhcmF0b3IpOwotICAgICAgICB2YWx1ZSA9IG9wdGlvbi5zdWJzdHIoc2VwYXJhdG9yKzEpOwotICAgICAgfQotCi0gICAgICBwYXJzZWRfb3B0aW9uc1trZXldID0gdmFsdWU7Ci0gICAgfQotICB9Ci0KLSAgZ2VuX21hcF90JiB0aGVfbWFwID0gZ2V0X2dlbmVyYXRvcl9tYXAoKTsKLSAgZ2VuX21hcF90OjppdGVyYXRvciBpdGVyID0gdGhlX21hcC5maW5kKGxhbmd1YWdlKTsKLQotICBpZiAoaXRlciA9PSB0aGVfbWFwLmVuZCgpKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICByZXR1cm4gaXRlci0+c2Vjb25kLT5nZXRfZ2VuZXJhdG9yKHByb2dyYW0sIHBhcnNlZF9vcHRpb25zLCBvcHRpb25zKTsKLX0KLQotdF9nZW5lcmF0b3JfcmVnaXN0cnk6Omdlbl9tYXBfdCYgdF9nZW5lcmF0b3JfcmVnaXN0cnk6OmdldF9nZW5lcmF0b3JfbWFwKCkgewotICAvLyBodHRwOi8vd3d3LnBhcmFzaGlmdC5jb20vYysrLWZhcS1saXRlL2N0b3JzLmh0bWwjZmFxLTEwLjEyCi0gIHN0YXRpYyBnZW5fbWFwX3QqIHRoZV9tYXAgPSBuZXcgZ2VuX21hcF90KCk7Ci0gIHJldHVybiAqdGhlX21hcDsKLX0KLQotdF9nZW5lcmF0b3JfZmFjdG9yeTo6dF9nZW5lcmF0b3JfZmFjdG9yeSgKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgc2hvcnRfbmFtZSwKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgbG9uZ19uYW1lLAotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkb2N1bWVudGF0aW9uKQotICA6IHNob3J0X25hbWVfKHNob3J0X25hbWUpCi0gICwgbG9uZ19uYW1lXyhsb25nX25hbWUpCi0gICwgZG9jdW1lbnRhdGlvbl8oZG9jdW1lbnRhdGlvbikKLXsKLSAgdF9nZW5lcmF0b3JfcmVnaXN0cnk6OnJlZ2lzdGVyX2dlbmVyYXRvcih0aGlzKTsKLX0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuaCBiL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRkODhkOS4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMDAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFRfR0VORVJBVE9SX0gKLSNkZWZpbmUgVF9HRU5FUkFUT1JfSAotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPGZzdHJlYW0+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlICJwYXJzZS90X3Byb2dyYW0uaCIKLSNpbmNsdWRlICJnbG9iYWxzLmgiCi0jaW5jbHVkZSAidF9nZW5lcmF0b3JfcmVnaXN0cnkuaCIKLQotLyoqCi0gKiBCYXNlIGNsYXNzIGZvciBhIHRocmlmdCBjb2RlIGdlbmVyYXRvci4gVGhpcyBjbGFzcyBkZWZpbmVzIHRoZSBiYXNpYwotICogcm91dGluZXMgZm9yIGNvZGUgZ2VuZXJhdGlvbiBhbmQgY29udGFpbnMgdGhlIHRvcCBsZXZlbCBtZXRob2QgdGhhdAotICogZGlzcGF0Y2hlcyBjb2RlIGdlbmVyYXRpb24gYWNyb3NzIHZhcmlvdXMgY29tcG9uZW50cy4KLSAqCi0gKi8KLWNsYXNzIHRfZ2VuZXJhdG9yIHsKLSBwdWJsaWM6Ci0gIHRfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSkgewotICAgIHRtcF8gPSAwOwotICAgIGluZGVudF8gPSAwOwotICAgIHByb2dyYW1fID0gcHJvZ3JhbTsKLSAgICBwcm9ncmFtX25hbWVfID0gZ2V0X3Byb2dyYW1fbmFtZShwcm9ncmFtKTsKLSAgICBlc2NhcGVfWydcbiddID0gIlxcbiI7Ci0gICAgZXNjYXBlX1snXHInXSA9ICJcXHIiOwotICAgIGVzY2FwZV9bJ1x0J10gPSAiXFx0IjsKLSAgICBlc2NhcGVfWyciJ10gID0gIlxcXCIiOwotICAgIGVzY2FwZV9bJ1xcJ10gPSAiXFxcXCI7Ci0gIH0KLQotICB2aXJ0dWFsIH50X2dlbmVyYXRvcigpIHt9Ci0KLSAgLyoqCi0gICAqIEZyYW1ld29yayBnZW5lcmF0b3IgbWV0aG9kIHRoYXQgaXRlcmF0ZXMgb3ZlciBhbGwgdGhlIHBhcnRzIG9mIGEgcHJvZ3JhbQotICAgKiBhbmQgcGVyZm9ybXMgZ2VuZXJhbCBhY3Rpb25zLiBUaGlzIGlzIGltcGxlbWVudGVkIGJ5IHRoZSBiYXNlIGNsYXNzIGFuZAotICAgKiBzaG91bGQgbm90IG5vcm1hbGx5IGJlIG92ZXJ3cml0dGVuIGluIHRoZSBzdWJjbGFzc2VzLgotICAgKi8KLSAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX3Byb2dyYW0oKTsKLQotICBjb25zdCB0X3Byb2dyYW0qIGdldF9wcm9ncmFtKCkgY29uc3QgeyByZXR1cm4gcHJvZ3JhbV87IH0KLQotICB2b2lkIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBjb21tZW50X3N0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBsaW5lX3ByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgY29udGVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGNvbW1lbnRfZW5kKTsKLQotICAvKioKLSAgICogY2hlY2sgd2hldGhlciBzdWItbmFtZXNwYWNlIGRlY2xhcmFjdGlvbiBpcyB1c2VkIGJ5IGdlbmVyYXRvci4KLSAgICogZS5nLiBhbGxvdwotICAgKiBuYW1lc3BhY2UgcHkudHdpc3RlZCBiYXIKLSAgICogdG8gc3BlY2lmeSBuYW1lc3BhY2UgdG8gdXNlIHdoZW4gLWdlbiBweTp0d2lzdGVkIGlzIHNwZWNpZmllZC4KLSAgICogV2lsbCBiZSBjYWxsZWQgd2l0aCBzdWJuYW1lc3BhY2UsIGkuZS4gaXNfdmFsaWRfbmFtZXNwYWNlKCJ0d2lzdGVkIikKLSAgICogd2lsbCBiZSBjYWxsZWQgZm9yIHRoZSBhYm92ZSBleGFtcGxlLgotICAgKi8KLSAgc3RhdGljIGJvb2wgaXNfdmFsaWRfbmFtZXNwYWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdWJfbmFtZXNwYWNlKSB7Ci0gICAgKHZvaWQpIHN1Yl9uYW1lc3BhY2U7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLyoqCi0gICAqIEVzY2FwZSBzdHJpbmcgdG8gdXNlIG9uZSBpbiBnZW5lcmF0ZWQgc291cmNlcy4KLSAgICovCi0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgZXNjYXBlX3N0cmluZyhjb25zdCBzdGQ6OnN0cmluZyAmaW4pIGNvbnN0OwotCi0gIHN0ZDo6c3RyaW5nIGdldF9lc2NhcGVkX3N0cmluZyh0X2NvbnN0X3ZhbHVlKiBjb25zdHZhbCkgewotICAgIHJldHVybiBlc2NhcGVfc3RyaW5nKGNvbnN0dmFsLT5nZXRfc3RyaW5nKCkpOwotICB9Ci0KLSBwcm90ZWN0ZWQ6Ci0KLSAgLyoqCi0gICAqIE9wdGlvbmFsIG1ldGhvZHMgdGhhdCBtYXkgYmUgaW1sZW1lbnRlZCBieSBzdWJjbGFzc2VzIHRvIHRha2UgbmVjZXNzYXJ5Ci0gICAqIHN0ZXBzIGF0IHRoZSBiZWdpbm5pbmcgb3IgZW5kIG9mIGNvZGUgZ2VuZXJhdGlvbi4KLSAgICovCi0KLSAgdmlydHVhbCB2b2lkIGluaXRfZ2VuZXJhdG9yKCkge30KLSAgdmlydHVhbCB2b2lkIGNsb3NlX2dlbmVyYXRvcigpIHt9Ci0KLSAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX2NvbnN0cyhzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKTsKLQotICAvKioKLSAgICogUHVyZSB2aXJ0dWFsIG1ldGhvZHMgaW1wbGVtZW50ZWQgYnkgdGhlIGdlbmVyYXRvciBzdWJjbGFzc2VzLgotICAgKi8KLQotICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZiAgKHRfdHlwZWRlZiogIHR0eXBlZGVmKSAgPSAwOwotICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfZW51bSAgICAgKHRfZW51bSogICAgIHRlbnVtKSAgICAgPSAwOwotICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfY29uc3QgICAgKHRfY29uc3QqICAgIHRjb25zdCkgewotICAgICh2b2lkKSB0Y29uc3Q7Ci0gIH0KLSAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX3N0cnVjdCAgICh0X3N0cnVjdCogICB0c3RydWN0KSAgID0gMDsKLSAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX3NlcnZpY2UgICh0X3NlcnZpY2UqICB0c2VydmljZSkgID0gMDsKLSAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX2ZvcndhcmRfZGVjbGFyYXRpb24gKHRfc3RydWN0Kikge30KLSAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uICh0X3N0cnVjdCogICB0eGNlcHRpb24pIHsKLSAgICAvLyBCeSBkZWZhdWx0IGV4Y2VwdGlvbnMgYXJlIHRoZSBzYW1lIGFzIHN0cnVjdHMKLSAgICBnZW5lcmF0ZV9zdHJ1Y3QodHhjZXB0aW9uKTsKLSAgfQotCi0gIC8qKgotICAgKiBNZXRob2QgdG8gZ2V0IHRoZSBwcm9ncmFtIG5hbWUsIG1heSBiZSBvdmVycmlkZGVuCi0gICAqLwotICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldF9wcm9ncmFtX25hbWUodF9wcm9ncmFtKiB0cHJvZ3JhbSkgewotICAgIHJldHVybiB0cHJvZ3JhbS0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIC8qKgotICAgKiBNZXRob2QgdG8gZ2V0IHRoZSBzZXJ2aWNlIG5hbWUsIG1heSBiZSBvdmVycmlkZGVuCi0gICAqLwotICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldF9zZXJ2aWNlX25hbWUodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICAgIHJldHVybiB0c2VydmljZS0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGN1cnJlbnQgb3V0cHV0IGRpcmVjdG9yeQotICAgKi8KLSAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXRfb3V0X2RpcigpIGNvbnN0IHsKLSAgICBpZiAocHJvZ3JhbV8tPmlzX291dF9wYXRoX2Fic29sdXRlKCkpIHsKLSAgICAgIHJldHVybiBwcm9ncmFtXy0+Z2V0X291dF9wYXRoKCkgKyAiLyI7Ci0gICAgfQotCi0gICAgcmV0dXJuIHByb2dyYW1fLT5nZXRfb3V0X3BhdGgoKSArIG91dF9kaXJfYmFzZV8gKyAiLyI7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIHVuaXF1ZSB0ZW1wb3JhcnkgdmFyaWFibGUgbmFtZSwgd2hpY2ggaXMganVzdCAibmFtZSIgd2l0aCBhCi0gICAqIG51bWJlciBhcHBlbmRlZCB0byBpdCAoaS5lLiBuYW1lMzUpCi0gICAqLwotICBzdGQ6OnN0cmluZyB0bXAoc3RkOjpzdHJpbmcgbmFtZSkgewotICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7Ci0gICAgb3V0IDw8IG5hbWUgPDwgdG1wXysrOwotICAgIHJldHVybiBvdXQuc3RyKCk7Ci0gIH0KLQotICAvKioKLSAgICogSW5kZW50YXRpb24gbGV2ZWwgbW9kaWZpZXJzCi0gICAqLwotCi0gIHZvaWQgaW5kZW50X3VwKCl7Ci0gICAgKytpbmRlbnRfOwotICB9Ci0KLSAgdm9pZCBpbmRlbnRfZG93bigpIHsKLSAgICAtLWluZGVudF87Ci0gIH0KLQotICAvKioKLSAgICogSW5kZW50YXRpb24gcHJpbnQgZnVuY3Rpb24KLSAgICovCi0gIHN0ZDo6c3RyaW5nIGluZGVudCgpIHsKLSAgICBzdGQ6OnN0cmluZyBpbmQgPSAiIjsKLSAgICBpbnQgaTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgaW5kZW50XzsgKytpKSB7Ci0gICAgICBpbmQgKz0gIiAgIjsKLSAgICB9Ci0gICAgcmV0dXJuIGluZDsKLSAgfQotCi0gIC8qKgotICAgKiBJbmRlbnRhdGlvbiB1dGlsaXR5IHdyYXBwZXIKLSAgICovCi0gIHN0ZDo6b3N0cmVhbSYgaW5kZW50KHN0ZDo6b3N0cmVhbSAmb3MpIHsKLSAgICByZXR1cm4gb3MgPDwgaW5kZW50KCk7Ci0gIH0KLQotICAvKioKLSAgICogQ2FwaXRhbGl6YXRpb24gaGVscGVycwotICAgKi8KLSAgc3RkOjpzdHJpbmcgY2FwaXRhbGl6ZShzdGQ6OnN0cmluZyBpbikgewotICAgIGluWzBdID0gdG91cHBlcihpblswXSk7Ci0gICAgcmV0dXJuIGluOwotICB9Ci0gIHN0ZDo6c3RyaW5nIGRlY2FwaXRhbGl6ZShzdGQ6OnN0cmluZyBpbikgewotICAgIGluWzBdID0gdG9sb3dlcihpblswXSk7Ci0gICAgcmV0dXJuIGluOwotICB9Ci0gIHN0YXRpYyBzdGQ6OnN0cmluZyBsb3dlcmNhc2Uoc3RkOjpzdHJpbmcgaW4pIHsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluLnNpemUoKTsgKytpKSB7Ci0gICAgICBpbltpXSA9IHRvbG93ZXIoaW5baV0pOwotICAgIH0KLSAgICByZXR1cm4gaW47Ci0gIH0KLSAgc3RhdGljIHN0ZDo6c3RyaW5nIHVwcGVyY2FzZShzdGQ6OnN0cmluZyBpbikgewotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW4uc2l6ZSgpOyArK2kpIHsKLSAgICAgIGluW2ldID0gdG91cHBlcihpbltpXSk7Ci0gICAgfQotICAgIHJldHVybiBpbjsKLSAgfQotICAvKioKLSAgICogVHJhbnNmb3JtcyBhIGNhbWVsIGNhc2Ugc3RyaW5nIHRvIGFuIGVxdWl2YWxlbnQgb25lIHNlcGFyYXRlZCBieSB1bmRlcnNjb3JlcwotICAgKiBlLmcuIGFNdWx0aVdvcmQgLT4gYV9tdWx0aV93b3JkCi0gICAqICAgICAgc29tZU5hbWUgICAtPiBzb21lX25hbWUKLSAgICogICAgICBDYW1lbENhc2UgIC0+IGNhbWVsX2Nhc2UKLSAgICogICAgICBuYW1lICAgICAgIC0+IG5hbWUKLSAgICogICAgICBOYW1lICAgICAgIC0+IG5hbWUKLSAgICovCi0gIHN0ZDo6c3RyaW5nIHVuZGVyc2NvcmUoc3RkOjpzdHJpbmcgaW4pIHsKLSAgICBpblswXSA9IHRvbG93ZXIoaW5bMF0pOwotICAgIGZvciAoc2l6ZV90IGkgPSAxOyBpIDwgaW4uc2l6ZSgpOyArK2kpIHsKLSAgICAgIGlmIChpc3VwcGVyKGluW2ldKSkgewotICAgICAgICBpbltpXSA9IHRvbG93ZXIoaW5baV0pOwotICAgICAgICBpbi5pbnNlcnQoaSwgIl8iKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGluOwotICB9Ci0gIC8qKgotICAgICogVHJhbnNmb3JtcyBhIHN0cmluZyB3aXRoIHdvcmRzIHNlcGFyYXRlZCBieSB1bmRlcnNjb3JlcyB0byBhIGNhbWVsIGNhc2UgZXF1aXZhbGVudAotICAgICogZS5nLiBhX211bHRpX3dvcmQgLT4gYU11bHRpV29yZAotICAgICogICAgICBzb21lX25hbWUgICAgLT4gIHNvbWVOYW1lCi0gICAgKiAgICAgIG5hbWUgICAgICAgICAtPiAgbmFtZQotICAgICovCi0gIHN0ZDo6c3RyaW5nIGNhbWVsY2FzZShzdGQ6OnN0cmluZyBpbikgewotICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7Ci0gICAgYm9vbCB1bmRlcnNjb3JlID0gZmFsc2U7Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluLnNpemUoKTsgaSsrKSB7Ci0gICAgICBpZiAoaW5baV0gPT0gJ18nKSB7Ci0gICAgICAgIHVuZGVyc2NvcmUgPSB0cnVlOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIGlmICh1bmRlcnNjb3JlKSB7Ci0gICAgICAgIG91dCA8PCAoY2hhcikgdG91cHBlcihpbltpXSk7Ci0gICAgICAgIHVuZGVyc2NvcmUgPSBmYWxzZTsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBvdXQgPDwgaW5baV07Ci0gICAgfQotCi0gICAgcmV0dXJuIG91dC5zdHIoKTsKLSAgfQotCi0gcHVibGljOgotICAvKioKLSAgICogR2V0IHRoZSB0cnVlIHR5cGUgYmVoaW5kIGEgc2VyaWVzIG9mIHR5cGVkZWZzLgotICAgKi8KLSAgc3RhdGljIHRfdHlwZSogZ2V0X3RydWVfdHlwZSh0X3R5cGUqIHR5cGUpIHsKLSAgICByZXR1cm4gdHlwZS0+Z2V0X3RydWVfdHlwZSgpOwotICB9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIC8qKgotICAgKiBUaGUgcHJvZ3JhbSBiZWluZyBnZW5lcmF0ZWQKLSAgICovCi0gIHRfcHJvZ3JhbSogcHJvZ3JhbV87Ci0KLSAgLyoqCi0gICAqIFF1aWNrIGFjY2Vzc29yIGZvciBmb3JtYXR0ZWQgcHJvZ3JhbSBuYW1lIHRoYXQgaXMgY3VycmVudGx5IGJlaW5nCi0gICAqIGdlbmVyYXRlZC4KLSAgICovCi0gIHN0ZDo6c3RyaW5nIHByb2dyYW1fbmFtZV87Ci0KLSAgLyoqCi0gICAqIFF1aWNrIGFjY2Vzc29yIGZvciBmb3JtYXR0ZWQgc2VydmljZSBuYW1lIHRoYXQgaXMgY3VycmVudGx5IGJlaW5nCi0gICAqIGdlbmVyYXRlZC4KLSAgICovCi0gIHN0ZDo6c3RyaW5nIHNlcnZpY2VfbmFtZV87Ci0KLSAgLyoqCi0gICAqIE91dHB1dCB0eXBlLXNwZWNpZmMgZGlyZWN0b3J5IG5hbWUgKCJnZW4tKiIpCi0gICAqLwotICBzdGQ6OnN0cmluZyBvdXRfZGlyX2Jhc2VfOwotCi0gIC8qKgotICAgKiBNYXAgb2YgY2hhcmFjdGVycyB0byBlc2NhcGUgaW4gc3RyaW5nIGxpdGVyYWxzLgotICAgKi8KLSAgc3RkOjptYXA8Y2hhciwgc3RkOjpzdHJpbmc+IGVzY2FwZV87Ci0KLSBwcml2YXRlOgotICAvKioKLSAgICogQ3VycmVudCBjb2RlIGluZGVudGF0aW9uIGxldmVsCi0gICAqLwotICBpbnQgaW5kZW50XzsKLQotICAvKioKLSAgICogVGVtcG9yYXJ5IHZhcmlhYmxlIGNvdW50ZXIsIGZvciBtYWtpbmcgdW5pcXVlIHZhcmlhYmxlIG5hbWVzCi0gICAqLwotICBpbnQgdG1wXzsKLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2dlbmVyYXRvcl9yZWdpc3RyeS5oIGIvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2dlbmVyYXRvcl9yZWdpc3RyeS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDEwZTk0Li4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9nZW5lcmF0b3JfcmVnaXN0cnkuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgVF9HRU5FUkFUT1JfUkVHSVNUUllfSAotI2RlZmluZSBUX0dFTkVSQVRPUl9SRUdJU1RSWV9ICi0KLWNsYXNzIHRfZ2VuZXJhdG9yOwotCi0vKioKLSAqIEEgZmFjdG9yeSBmb3IgcHJvZHVjaW5nIGdlbmVyYXRvciBjbGFzc2VzIG9mIGEgcGFydGljdWxhciBsYW5ndWFnZS4KLSAqCi0gKiBUaGlzIGNsYXNzIGlzIGFsc28gcmVzcG9uc2libGUgZm9yOgotICogIC0gUmVnaXN0ZXJpbmcgaXRzZWxmIHdpdGggdGhlIGdlbmVyYXRvciByZWdpc3RyeS4KLSAqICAtIFByb3ZpZGluZyBkb2N1bWVudGF0aW9uIGZvciB0aGUgZ2VuZXJhdG9ycyBpdCBwcm9kdWNlcy4KLSAqLwotY2xhc3MgdF9nZW5lcmF0b3JfZmFjdG9yeSB7Ci0gcHVibGljOgotICB0X2dlbmVyYXRvcl9mYWN0b3J5KGNvbnN0IHN0ZDo6c3RyaW5nJiBzaG9ydF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBsb25nX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGRvY3VtZW50YXRpb24pOwotCi0gIHZpcnR1YWwgfnRfZ2VuZXJhdG9yX2ZhY3RvcnkoKSB7fQotCi0gIHZpcnR1YWwgdF9nZW5lcmF0b3IqIGdldF9nZW5lcmF0b3IoCi0gICAgICAvLyBUaGUgcHJvZ3JhbSB0byBnZW5lcmF0ZS4KLSAgICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSwKLSAgICAgIC8vIE5vdGU6IHBhcnNlZF9vcHRpb25zIHdpbGwgbm90IGV4aXN0IGJleW9uZCB0aGUgY2FsbCB0byBnZXRfZ2VuZXJhdG9yLgotICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCi0gICAgICAvLyBOb3RlOiBvcHRpb25fc3RyaW5nIG1pZ2h0IG5vdCBleGlzdCBiZXlvbmQgdGhlIGNhbGwgdG8gZ2V0X2dlbmVyYXRvci4KLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQotICAgID0gMDsKLQotICB2aXJ0dWFsIGJvb2wgaXNfdmFsaWRfbmFtZXNwYWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdWJfbmFtZXNwYWNlKSA9IDA7Ci0KLSAgc3RkOjpzdHJpbmcgZ2V0X3Nob3J0X25hbWUoKSB7IHJldHVybiBzaG9ydF9uYW1lXzsgfQotICBzdGQ6OnN0cmluZyBnZXRfbG9uZ19uYW1lKCkgeyByZXR1cm4gbG9uZ19uYW1lXzsgfQotICBzdGQ6OnN0cmluZyBnZXRfZG9jdW1lbnRhdGlvbigpIHsgcmV0dXJuIGRvY3VtZW50YXRpb25fOyB9Ci0KLSBwcml2YXRlOgotICBzdGQ6OnN0cmluZyBzaG9ydF9uYW1lXzsKLSAgc3RkOjpzdHJpbmcgbG9uZ19uYW1lXzsKLSAgc3RkOjpzdHJpbmcgZG9jdW1lbnRhdGlvbl87Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgZ2VuZXJhdG9yPgotY2xhc3MgdF9nZW5lcmF0b3JfZmFjdG9yeV9pbXBsIDogcHVibGljIHRfZ2VuZXJhdG9yX2ZhY3RvcnkgewotIHB1YmxpYzoKLSAgdF9nZW5lcmF0b3JfZmFjdG9yeV9pbXBsKGNvbnN0IHN0ZDo6c3RyaW5nJiBzaG9ydF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGxvbmdfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkb2N1bWVudGF0aW9uKQotICAgIDogdF9nZW5lcmF0b3JfZmFjdG9yeShzaG9ydF9uYW1lLCBsb25nX25hbWUsIGRvY3VtZW50YXRpb24pCi0gIHt9Ci0KLSAgdmlydHVhbCB0X2dlbmVyYXRvciogZ2V0X2dlbmVyYXRvcigKLSAgICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSwKLSAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAotICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpIHsKLSAgICByZXR1cm4gbmV3IGdlbmVyYXRvcihwcm9ncmFtLCBwYXJzZWRfb3B0aW9ucywgb3B0aW9uX3N0cmluZyk7Ci0gIH0KLQotICB2aXJ0dWFsIGJvb2wgaXNfdmFsaWRfbmFtZXNwYWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdWJfbmFtZXNwYWNlKSB7Ci0gICAgcmV0dXJuIGdlbmVyYXRvcjo6aXNfdmFsaWRfbmFtZXNwYWNlKHN1Yl9uYW1lc3BhY2UpOwotICB9Ci19OwotCi1jbGFzcyB0X2dlbmVyYXRvcl9yZWdpc3RyeSB7Ci0gcHVibGljOgotICBzdGF0aWMgdm9pZCByZWdpc3Rlcl9nZW5lcmF0b3IodF9nZW5lcmF0b3JfZmFjdG9yeSogZmFjdG9yeSk7Ci0KLSAgc3RhdGljIHRfZ2VuZXJhdG9yKiBnZXRfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25zKTsKLQotICB0eXBlZGVmIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCB0X2dlbmVyYXRvcl9mYWN0b3J5Kj4gZ2VuX21hcF90OwotICBzdGF0aWMgZ2VuX21hcF90JiBnZXRfZ2VuZXJhdG9yX21hcCgpOwotCi0gcHJpdmF0ZToKLSAgdF9nZW5lcmF0b3JfcmVnaXN0cnkoKTsKLSAgdF9nZW5lcmF0b3JfcmVnaXN0cnkoY29uc3QgdF9nZW5lcmF0b3JfcmVnaXN0cnkmKTsKLX07Ci0KLSNkZWZpbmUgVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUihsYW5ndWFnZSwgbG9uZ19uYW1lLCBkb2MpICAgICAgICBcCi0gIGNsYXNzIHRfIyNsYW5ndWFnZSMjX2dlbmVyYXRvcl9mYWN0b3J5X2ltcGwgICAgICAgICAgICAgICAgICAgICAgXAotICAgIDogcHVibGljIHRfZ2VuZXJhdG9yX2ZhY3RvcnlfaW1wbDx0XyMjbGFuZ3VhZ2UjI19nZW5lcmF0b3I+ICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICBwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHRfIyNsYW5ndWFnZSMjX2dlbmVyYXRvcl9mYWN0b3J5X2ltcGwoKSAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIDogdF9nZW5lcmF0b3JfZmFjdG9yeV9pbXBsPHRfIyNsYW5ndWFnZSMjX2dlbmVyYXRvcj4oICAgICAgICBcCi0gICAgICAgICAgI2xhbmd1YWdlLCBsb25nX25hbWUsIGRvYykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHt9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHN0YXRpYyB0XyMjbGFuZ3VhZ2UjI19nZW5lcmF0b3JfZmFjdG9yeV9pbXBsIF9yZWdpc3RlcmVyOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9nb19nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfZ29fZ2VuZXJhdG9yLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzQ1ZTQwLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9nb19nZW5lcmF0b3IuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzNTQ5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLSAqIFRoaXMgZmlsZSBpcyBwcm9ncmFtbWF0aWNhbGx5IHNhbml0aXplZCBmb3Igc3R5bGU6Ci0gKiBhc3R5bGUgLS1zdHlsZT0xdGJzIC1mIC1wIC1IIC1qIC1VIHRfZ29fZ2VuZXJhdG9yLmNjCi0gKgotICogVGhlIG91dHB1dCBvZiBhc3R5bGUgc2hvdWxkIG5vdCBiZSB0YWtlbiB1bnF1ZXN0aW9uaW5nbHksIGJ1dCBpdCBpcyBhIGdvb2QKLSAqIGd1aWRlIGZvciBlbnN1cmluZyB1bmlmb3JtaXR5IGFuZCByZWFkYWJpbGl0eS4KLSAqLwotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPGZzdHJlYW0+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlICJ0X2dlbmVyYXRvci5oIgotI2luY2x1ZGUgInBsYXRmb3JtLmgiCi0jaW5jbHVkZSAidmVyc2lvbi5oIgotCi11c2luZyBzdGQ6Om1hcDsKLXVzaW5nIHN0ZDo6b2ZzdHJlYW07Ci11c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Ci11c2luZyBzdGQ6OnN0cmluZzsKLXVzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwotdXNpbmcgc3RkOjp2ZWN0b3I7Ci0KLXN0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7ICAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCi0KLS8qKgotICogQSBoZWxwZXIgZm9yIGF1dG9tYXRpY2FsbHkgZm9ybWF0dGluZyB0aGUgZW1pdHRlZCBHbyBjb2RlIGZyb20gdGhlIFRocmlmdAotICogSURMIHBlciB0aGUgR28gc3R5bGUgZ3VpZGUuCi0gKgotICogUmV0dXJuczoKLSAqICAtIHRydWUsIGlmIHRoZSBmb3JtYXR0aW5nIHByb2Nlc3Mgc3VjY2VlZGVkLgotICogIC0gZmFsc2UsIGlmIHRoZSBmb3JtYXR0aW5nIHByb2Nlc3MgZmFpbGVkLCB3aGljaCBtZWFucyB0aGUgYmFzaWMgb3V0cHV0IHdhcwotICogICAgICAgICAgIHN0aWxsIGdlbmVyYXRlZC4KLSAqLwotYm9vbCBmb3JtYXRfZ29fb3V0cHV0KGNvbnN0IHN0cmluZyAmZmlsZV9wYXRoKTsKLQotY29uc3Qgc3RyaW5nIGRlZmF1bHRfdGhyaWZ0X2ltcG9ydCA9ICJnaXQuYXBhY2hlLm9yZy90aHJpZnQuZ2l0L2xpYi9nby90aHJpZnQiOwotc3RhdGljIHN0ZDo6c3RyaW5nIHBhY2thZ2VfZmxhZzsKLQotLyoqCi0gKiBHbyBjb2RlIGdlbmVyYXRvci4KLSAqLwotY2xhc3MgdF9nb19nZW5lcmF0b3IgOiBwdWJsaWMgdF9nZW5lcmF0b3IKLXsKLXB1YmxpYzoKLSAgICB0X2dvX2dlbmVyYXRvcigKLSAgICAgICAgdF9wcm9ncmFtKiBwcm9ncmFtLAotICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKLSAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCi0gICAgICAgIDogdF9nZW5lcmF0b3IocHJvZ3JhbSkgewotICAgIAkodm9pZCkgb3B0aW9uX3N0cmluZzsKLSAgICAJc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKLSAgICAgICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tZ28iOwotICAgICAgICBnZW5fdGhyaWZ0X2ltcG9ydF8gPSBkZWZhdWx0X3RocmlmdF9pbXBvcnQ7Ci0KLSAgICAgICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoInBhY2thZ2VfcHJlZml4Iik7Ci0KLSAgICAgICAgaWYgKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpIHsKLSAgICAgICAgICAgIGdlbl9wYWNrYWdlX3ByZWZpeF8gPSAoaXRlci0+c2Vjb25kKTsKLSAgICAgICAgfQotCi0gICAgICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJ0aHJpZnRfaW1wb3J0Iik7Ci0KLSAgICAgICAgaWYgKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpIHsKLSAgICAgICAgICAgIGdlbl90aHJpZnRfaW1wb3J0XyA9IChpdGVyLT5zZWNvbmQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoInBhY2thZ2UiKTsKLQotICAgICAgICBpZiAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSkgewotICAgICAgICAJcGFja2FnZV9mbGFnID0gKGl0ZXItPnNlY29uZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCi0gICAgICovCi0KLSAgICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7Ci0gICAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKLQotICAgIC8qKgotICAgICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICAgKi8KLQotICAgIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqICB0dHlwZWRlZik7Ci0gICAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogICAgIHRlbnVtKTsKLSAgICB2b2lkIGdlbmVyYXRlX2NvbnN0KHRfY29uc3QqICAgIHRjb25zdCk7Ci0gICAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqICAgdHN0cnVjdCk7Ci0gICAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogICB0eGNlcHRpb24pOwotICAgIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqICB0c2VydmljZSk7Ci0KLSAgICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwgY29uc3Qgc3RyaW5nJiBuYW1lKTsKLQotICAgIC8qKgotICAgICAqIFN0cnVjdCBnZW5lcmF0aW9uIGNvZGUKLSAgICAgKi8KLQotICAgIHZvaWQgZ2VuZXJhdGVfZ29fc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7Ci0gICAgdm9pZCBnZW5lcmF0ZV9nb19zdHJ1Y3RfZGVmaW5pdGlvbihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX3hjZXB0aW9uID0gZmFsc2UsIGJvb2wgaXNfcmVzdWx0ID0gZmFsc2UsIGJvb2wgaXNfYXJncyA9IGZhbHNlKTsKLSAgICB2b2lkIGdlbmVyYXRlX2dvX3N0cnVjdF9pbml0aWFsaXplcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2FyZ3Nfb3JfcmVzdWx0ID0gZmFsc2UpOwotICAgIHZvaWQgZ2VuZXJhdGVfaXNzZXRfaGVscGVycyhzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBjb25zdCBzdHJpbmcmIHRzdHJ1Y3RfbmFtZSwgYm9vbCBpc19yZXN1bHQgPSBmYWxzZSk7Ci0gICAgdm9pZCBnZW5lcmF0ZV9nb19zdHJ1Y3RfcmVhZGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGNvbnN0IHN0cmluZyYgdHN0cnVjdF9uYW1lLCBib29sIGlzX3Jlc3VsdCA9IGZhbHNlKTsKLSAgICB2b2lkIGdlbmVyYXRlX2dvX3N0cnVjdF93cml0ZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgY29uc3Qgc3RyaW5nJiB0c3RydWN0X25hbWUsIGJvb2wgaXNfcmVzdWx0ID0gZmFsc2UpOwotICAgIHZvaWQgZ2VuZXJhdGVfZ29fZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotICAgIHZvaWQgZ2V0X3B1YmxpY2l6ZWRfbmFtZV9hbmRfZGVmX3ZhbHVlKHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcqIE9VVF9wdWJfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiogT1VUX2RlZl92YWx1ZSkgY29uc3Q7Ci0KLSAgICAvKioKLSAgICAgKiBTZXJ2aWNlLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCi0gICAgICovCi0KLSAgICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqICB0c2VydmljZSk7Ci0gICAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpOwotICAgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9yZW1vdGUodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gICAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLQotICAgIC8qKgotICAgICAqIFNlcmlhbGl6YXRpb24gY29uc3RydWN0cwotICAgICAqLwotCi0gICAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiAgICB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICAgICAgICBkZWNsYXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2xhc3MgPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY29lcmNlRGF0YSA9IGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmtleSA9IGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9jb250YWluZXIgPSBmYWxzZSk7Ci0KLSAgICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqICAgdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICAgICAgICBpc19wb2ludGVyX2ZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgICAgICAgIGRlY2xhcmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotCi0gICAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogICAgICAgdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgICBwb2ludGVyX2ZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgICAgICAgICAgZGVjbGFyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAgIHByZWZpeCA9ICIiKTsKLQotICAgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqICAgICAgdHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgICAgICAgIGRlY2xhcmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0KLSAgICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiAgICAgIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICAgICAgICBkZWNsYXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotCi0gICAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogICAgIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgICAgICAgIGRlY2xhcmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotCi0gICAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqICAgIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlua2V5ID0gZmFsc2UpOwotCi0gICAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqICAgdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotCi0gICAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiAgICAgICB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgICBwb2ludGVyX2ZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAgIHByZWZpeCA9ICIiKTsKLQotICAgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogICAgICB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGtpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHZpdGVyKTsKLQotICAgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogICAgICB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGl0ZXIpOwotCi0gICAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiAgICAgdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGl0ZXIpOwotCi0gICAgdm9pZCBnZW5lcmF0ZV9nb19kb2NzdHJpbmcoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KTsKLQotICAgIHZvaWQgZ2VuZXJhdGVfZ29fZG9jc3RyaW5nKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotCi0gICAgdm9pZCBnZW5lcmF0ZV9nb19kb2NzdHJpbmcoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZG9jKiAgICB0ZG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHN1YmhlYWRlcik7Ci0KLSAgICB2b2lkIGdlbmVyYXRlX2dvX2RvY3N0cmluZyhzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9kb2MqIHRkb2MpOwotCi0gICAgLyoqCi0gICAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKLSAgICAgKi8KLQotICAgIHN0ZDo6c3RyaW5nIGdvX2F1dG9nZW5fY29tbWVudCgpOwotICAgIHN0ZDo6c3RyaW5nIGdvX3BhY2thZ2UoKTsKLSAgICBzdGQ6OnN0cmluZyBnb19pbXBvcnRzX2JlZ2luKCk7Ci0gICAgc3RkOjpzdHJpbmcgZ29faW1wb3J0c19lbmQoKTsKLSAgICBzdGQ6OnN0cmluZyByZW5kZXJfaW5jbHVkZXMoKTsKLSAgICBzdGQ6OnN0cmluZyByZW5kZXJfaW1wb3J0X3Byb3RlY3Rpb24oKTsKLSAgICBzdGQ6OnN0cmluZyByZW5kZXJfZmFzdGJpbmFyeV9pbmNsdWRlcygpOwotICAgIHN0ZDo6c3RyaW5nIGRlY2xhcmVfYXJndW1lbnQodF9maWVsZCogdGZpZWxkKTsKLSAgICBzdGQ6OnN0cmluZyByZW5kZXJfZmllbGRfaW5pdGlhbF92YWx1ZSh0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgb3B0aW9uYWxfZmllbGQpOwotICAgIHN0ZDo6c3RyaW5nIHR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlKTsKLSAgICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0gICAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlX2lmKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsIGJvb2wgYWRkRXJyb3IgPSBmYWxzZSk7Ci0gICAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCk7Ci0gICAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOwotICAgIHN0ZDo6c3RyaW5nIHR5cGVfdG9fZ29fdHlwZSh0X3R5cGUqIHR0eXBlLCBib29sIGlzX2NvbnRhaW5lcl92YWx1ZSA9IGZhbHNlKTsKLSAgICBzdGQ6OnN0cmluZyB0eXBlX3RvX2dvX3R5cGVfd2l0aF9vcHQodF90eXBlKiB0dHlwZSwgYm9vbCBvcHRpb25hbF9maWVsZCwgYm9vbCBpc19jb250YWluZXJfdmFsdWUgPSBmYWxzZSk7Ci0gICAgc3RkOjpzdHJpbmcgdHlwZV90b19nb19rZXlfdHlwZSh0X3R5cGUqIHR0eXBlKTsKLSAgICBzdGQ6OnN0cmluZyB0eXBlX3RvX3NwZWNfYXJncyh0X3R5cGUqIHR0eXBlKTsKLQotICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBnZXRfcmVhbF9nb19tb2R1bGUoY29uc3QgdF9wcm9ncmFtKiBwcm9ncmFtKSB7Ci0KLSAgICAJaWYgKCFwYWNrYWdlX2ZsYWcuZW1wdHkoKSkgewotICAgICAgICAgICAgcmV0dXJuIHBhY2thZ2VfZmxhZzsKLSAgICAgICAgfQotICAgICAgICBzdGQ6OnN0cmluZyByZWFsX21vZHVsZSA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2UoImdvIik7Ci0gICAgICAgIGlmICghcmVhbF9tb2R1bGUuZW1wdHkoKSkgewotICAgICAgICAJcmV0dXJuIHJlYWxfbW9kdWxlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGxvd2VyY2FzZShwcm9ncmFtLT5nZXRfbmFtZSgpKTsKLSAgICB9Ci0KLXByaXZhdGU6Ci0KLSAgICBzdGQ6OnN0cmluZyBnZW5fcGFja2FnZV9wcmVmaXhfOwotICAgIHN0ZDo6c3RyaW5nIGdlbl90aHJpZnRfaW1wb3J0XzsKLQotICAgIC8qKgotICAgICAqIEZpbGUgc3RyZWFtcwotICAgICAqLwotCi0gICAgc3RkOjpvZnN0cmVhbSBmX3R5cGVzXzsKLSAgICBzdGQ6OnN0cmluZyBmX3R5cGVzX25hbWVfOwotICAgIHN0ZDo6b2ZzdHJlYW0gZl9jb25zdHNfOwotICAgIHN0ZDo6c3RyaW5nIGZfY29uc3RzX25hbWVfOwotICAgIHN0ZDo6c3RyaW5nc3RyZWFtIGZfY29uc3RfdmFsdWVzXzsKLSAgICBzdGQ6Om9mc3RyZWFtIGZfc2VydmljZV87Ci0KLSAgICBzdGQ6OnN0cmluZyBwYWNrYWdlX25hbWVfOwotICAgIHN0ZDo6c3RyaW5nIHBhY2thZ2VfZGlyXzsKLQotICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBwdWJsaWNpemUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlLCBib29sIGlzX2FyZ3Nfb3JfcmVzdWx0ID0gZmFsc2UpOwotICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBuZXdfcHJlZml4KGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSk7Ci0gICAgc3RhdGljIHN0ZDo6c3RyaW5nIHByaXZhdGl6ZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpOwotICAgIHN0YXRpYyBzdGQ6OnN0cmluZyB2YXJpYWJsZV9uYW1lX3RvX2dvX25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKTsKLSAgICBzdGF0aWMgYm9vbCBpc19wb2ludGVyX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbl9jb250YWluZXIgPSBmYWxzZSk7Ci0gICAgc3RhdGljIGJvb2wgb21pdF9pbml0aWFsaXphdGlvbih0X2ZpZWxkKiB0ZmllbGQpOwotfTsKLQotLy9yZXR1cm5zIHRydWUgaWYgZmllbGQgaW5pdGlhbGl6YXRpb24gY2FuIGJlIG9taXR0ZWQgc2luY2UgaXQgaGFzIGNvcnJlc3BvbmRpbmcgZ28gdHlwZSB6ZXJvIHZhbHVlCi0vL29yIGRlZmF1bHQgdmFsdWUgaXMgbm90IHNldAotYm9vbCB0X2dvX2dlbmVyYXRvcjo6b21pdF9pbml0aWFsaXphdGlvbih0X2ZpZWxkKiB0ZmllbGQpIHsKLQl0X2NvbnN0X3ZhbHVlKiB2YWx1ZSA9IHRmaWVsZC0+Z2V0X3ZhbHVlKCk7Ci0JaWYgKCF2YWx1ZSkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JdF90eXBlKiB0eXBlID0gdGZpZWxkLT5nZXRfdHlwZSgpLT5nZXRfdHJ1ZV90eXBlKCk7Ci0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLQotICAgICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgICAgIHRocm93ICIiOwotCi0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICAgICAgaWYgKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSkgewotICAgICAgICAgICAgCS8vW11ieXRlIGFyZSBhbHdheXMgaW5saW5lCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy9zdHJpbmdzIGFyZSBwb2ludGVycyBpZiBoYXMgbm8gZGVmYXVsdAotICAgICAgICAgICAgcmV0dXJuIHZhbHVlLT5nZXRfc3RyaW5nKCkuZW1wdHkoKTsKLQotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgICAgIHJldHVybiB2YWx1ZS0+Z2V0X2ludGVnZXIoKT09MDsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgewotICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS0+Z2V0X2ludGVnZXIoKT09MDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLT5nZXRfZG91YmxlKCk9PTAuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCXJldHVybiBmYWxzZTsKLX0KLQotLy9SZXR1cm5zIHRydWUgaWYgdGhlIHR5cGUgbmVlZCBhIHJlZmVyZW5jZSBpZiB1c2VkIGFzIG9wdGlvbmFsIHdpdGhvdXQgZGVmYXVsdAotc3RhdGljIGJvb2wgdHlwZV9uZWVkX3JlZmVyZW5jZSh0X3R5cGUqIHR5cGUpIHsKLQl0eXBlID0gdHlwZS0+Z2V0X3RydWVfdHlwZSgpOwotCWlmKCB0eXBlLT5pc19tYXAoKQotCSB8fCB0eXBlLT5pc19zZXQoKQotCSB8fCB0eXBlLT5pc19saXN0KCkKLQkgfHwgdHlwZS0+aXNfc3RydWN0KCkKLQkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKQotCSB8fCAodHlwZS0+aXNfc3RyaW5nKCkgJiYgKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpICkpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQlyZXR1cm4gdHJ1ZTsKLX0KLQotLy9yZXR1cm5zIGZhbHNlIGlmIGZpZWxkIGNvdWxkIG5vdCB1c2UgY29tcGFyaXNvbiB0byBkZWZhdWx0IHZhbHVlIGFzICFJc1NldCoKLWJvb2wgdF9nb19nZW5lcmF0b3I6OmlzX3BvaW50ZXJfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluX2NvbnRhaW5lcl92YWx1ZSkgewotCSh2b2lkKSBpbl9jb250YWluZXJfdmFsdWU7Ci0JaWYgKHRmaWVsZC0+YW5ub3RhdGlvbnNfLmNvdW50KCJjcHAucmVmIikhPTApIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCXRfdHlwZSogdHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKS0+Z2V0X3RydWVfdHlwZSgpOwotCS8vU3RydWN0cyBpbiBjb250YWluZXJzIGFyZSBwb2ludGVycwotCWlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQlpZiAoISh0ZmllbGQtPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMKSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JYm9vbCBoYXNfZGVmYXVsdCA9IHRmaWVsZC0+Z2V0X3ZhbHVlKCk7Ci0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLQotICAgICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgICAgIHRocm93ICIiOwotCi0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICAgICAgaWYgKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSkgewotICAgICAgICAgICAgCS8vW11ieXRlIGFyZSBhbHdheXMgaW5saW5lCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy9zdHJpbmdzIGFyZSBwb2ludGVycyBpZiBoYXMgbm8gZGVmYXVsdAotICAgICAgICAgICAgcmV0dXJuICFoYXNfZGVmYXVsdDsKLQotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgICAgICByZXR1cm4gIWhhc19kZWZhdWx0OwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgICAgcmV0dXJuICFoYXNfZGVmYXVsdDsKLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICAJcmV0dXJuIHRydWU7Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIAlyZXR1cm4gaGFzX2RlZmF1bHQ7Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIAlyZXR1cm4gaGFzX2RlZmF1bHQ7Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLQkJcmV0dXJuIGhhc19kZWZhdWx0OwotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfdHlwZWRlZigpKSB7Ci0JCXJldHVybiBoYXNfZGVmYXVsdDsKLSAgICB9Ci0KLSAgICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZ29fdHlwZTogIiArIHR5cGUtPmdldF9uYW1lKCk7Ci19Ci0KLXN0ZDo6c3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjpwdWJsaWNpemUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlLCBib29sIGlzX2FyZ3Nfb3JfcmVzdWx0KQotewotICAgIGlmICh2YWx1ZS5zaXplKCkgPD0gMCkgewotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgc3RkOjpzdHJpbmcgdmFsdWUyKHZhbHVlKSwgcHJlZml4OwotCi0gICAgc3RyaW5nOjpzaXplX3R5cGUgZG90X3BvcyA9IHZhbHVlLnJmaW5kKCcuJyk7Ci0gICAgaWYgKGRvdF9wb3MgIT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgICBwcmVmaXggPSB2YWx1ZS5zdWJzdHIoMCwgZG90X3BvcyArIDEpICsgcHJlZml4OwotICAgICAgdmFsdWUyID0gdmFsdWUuc3Vic3RyKGRvdF9wb3MgKyAxKTsKLSAgICB9Ci0KLSAgICBpZiAoIWlzdXBwZXIodmFsdWUyWzBdKSkgewotICAgICAgICB2YWx1ZTJbMF0gPSB0b3VwcGVyKHZhbHVlMlswXSk7Ci0gICAgfQotCi0gICAgLy8gYXMgbG9uZyBhcyB3ZSBhcmUgY2hhbmdpbmcgdGhpbmdzLCBsZXQncyBjaGFuZ2UgXyBmb2xsb3dlZCBieSBsb3dlcmNhc2UgdG8gY2FwaXRhbAotICAgIGZvciAoc3RyaW5nOjpzaXplX3R5cGUgaSA9IDE7IGkgPCB2YWx1ZTIuc2l6ZSgpIC0gMTsgKytpKSB7Ci0gICAgICAgIGlmICh2YWx1ZTJbaV0gPT0gJ18nICYmIGlzbG93ZXIodmFsdWUyW2kgKyAxXSkpIHsKLSAgICAgICAgICAgIHZhbHVlMi5yZXBsYWNlKGksIDIsIDEsIHRvdXBwZXIodmFsdWUyW2kgKyAxXSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gZmluYWwgbGVuZ3RoIGJlZm9yZSBmdXJ0aGVyIGNoZWNrcywgdGhlIHN0cmluZyBtYXkgYmVjb21lIGxvbmdlcgotICAgIHNpemVfdCBsZW5fYmVmb3JlID0gdmFsdWUyLmxlbmd0aCgpOwotCi0gICAgLy8gSURMIGlkZW50aWZpZXJzIG1heSBzdGFydCB3aXRoICJOZXciIHdoaWNoIGludGVyZmVyZXMgd2l0aCB0aGUgQ1RPUiBwYXR0ZXJuCi0gICAgLy8gQWRkaW5nIGFuIGV4dHJhIHVuZGVyc2NvcmUgdG8gYWxsIHRob3NlIGlkZW50aWZpZXJzIHNvbHZlcyB0aGlzCi0gICAgaWYoIChsZW5fYmVmb3JlID49IDMpICYmICh2YWx1ZTIuc3Vic3RyKDAsMykgPT0gIk5ldyIpKSB7Ci0gICAgICAgIHZhbHVlMiArPSAnXyc7Ci0gICAgfQotCi0gICAgLy8gSURMIGlkZW50aWZpZXJzIG1heSBlbmQgd2l0aCAiQXJncyIvIlJlc3VsdCIgd2hpY2ggaW50ZXJmZXJlcyB3aXRoIHRoZSBpbXBsaWNpdCBzZXJ2aWNlIGZ1bmN0aW9uIHN0cnVjdHMKLSAgICAvLyBBZGRpbmcgYW5vdGhlciBleHRyYSB1bmRlcnNjb3JlIHRvIGFsbCB0aG9zZSBpZGVudGlmaWVycyBzb2x2ZXMgdGhpcwotICAgIC8vIFN1cHByZXNzIHRoaXMgY2hlY2sgZm9yIHRoZSBhY3R1YWwgaGVscGVyIHN0cnVjdCBuYW1lcwotICAgIGlmKCFpc19hcmdzX29yX3Jlc3VsdCkgewotICAgICAgICBib29sIGVuZHNfd2l0aF9hcmdzID0gKGxlbl9iZWZvcmUgPj0gNCkgJiYgKHZhbHVlMi5zdWJzdHIobGVuX2JlZm9yZS00LDQpID09ICJBcmdzIik7Ci0gICAgICAgIGJvb2wgZW5kc193aXRoX3JzbHQgPSAobGVuX2JlZm9yZSA+PSA2KSAmJiAodmFsdWUyLnN1YnN0cihsZW5fYmVmb3JlLTYsNikgPT0gIlJlc3VsdCIpOwotICAgICAgICBpZiggZW5kc193aXRoX2FyZ3MgfHwgZW5kc193aXRoX3JzbHQpIHsKLSAgICAgICAgICAgIHZhbHVlMiArPSAnXyc7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gcHJlZml4ICsgdmFsdWUyOwotfQotCi1zdGQ6OnN0cmluZyB0X2dvX2dlbmVyYXRvcjo6bmV3X3ByZWZpeChjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpCi17Ci0gICAgaWYgKHZhbHVlLnNpemUoKSA8PSAwKSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgICBzdHJpbmc6OnNpemVfdHlwZSBkb3RfcG9zID0gdmFsdWUucmZpbmQoJy4nKTsKLSAgICBpZiAoZG90X3BvcyAhPSBzdHJpbmc6Om5wb3MpIHsKLSAgICAgIHJldHVybiB2YWx1ZS5zdWJzdHIoMCwgZG90X3BvcyArIDEpICsgIk5ldyIgKyBwdWJsaWNpemUodmFsdWUuc3Vic3RyKGRvdF9wb3MgKyAxKSk7Ci0gICAgfQotICAgIHJldHVybiAiTmV3IiArIHB1YmxpY2l6ZSh2YWx1ZSk7Ci19Ci0KLXN0ZDo6c3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjpwcml2YXRpemUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKQotewotICAgIGlmICh2YWx1ZS5zaXplKCkgPD0gMCkgewotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgc3RkOjpzdHJpbmcgdmFsdWUyKHZhbHVlKTsKLQotICAgIGlmICghaXNsb3dlcih2YWx1ZTJbMF0pKSB7Ci0gICAgICAgIHZhbHVlMlswXSA9IHRvbG93ZXIodmFsdWUyWzBdKTsKLSAgICB9Ci0KLSAgICAvLyBhcyBsb25nIGFzIHdlIGFyZSBjaGFuZ2luZyB0aGluZ3MsIGxldCdzIGNoYW5nZSBfIGZvbGxvd2VkIGJ5IGxvd2VyY2FzZSB0byBjYXBpdGFsCi0gICAgZm9yIChzdHJpbmc6OnNpemVfdHlwZSBpID0gMTsgaSA8IHZhbHVlMi5zaXplKCkgLSAxOyArK2kpIHsKLSAgICAgICAgaWYgKHZhbHVlMltpXSA9PSAnXycgJiYgaXNhbHBoYSh2YWx1ZTJbaSArIDFdKSkgewotICAgICAgICAgICAgdmFsdWUyLnJlcGxhY2UoaSwgMiwgMSwgdG91cHBlcih2YWx1ZTJbaSArIDFdKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gdmFsdWUyOwotfQotCi1zdGQ6OnN0cmluZyB0X2dvX2dlbmVyYXRvcjo6dmFyaWFibGVfbmFtZV90b19nb19uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkKLXsKLSAgICBpZiAodmFsdWUuc2l6ZSgpIDw9IDApIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIHN0ZDo6c3RyaW5nIHZhbHVlMih2YWx1ZSk7Ci0gICAgc3RkOjp0cmFuc2Zvcm0odmFsdWUyLmJlZ2luKCksIHZhbHVlMi5lbmQoKSwgdmFsdWUyLmJlZ2luKCksIDo6dG9sb3dlcik7Ci0KLSAgICBzd2l0Y2ggKHZhbHVlWzBdKSB7Ci0gICAgY2FzZSAnYic6Ci0gICAgY2FzZSAnQic6Ci0gICAgICAgIGlmICh2YWx1ZTIgIT0gImJyZWFrIikgewotICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgICAgICB9Ci0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdjJzoKLSAgICBjYXNlICdDJzoKLSAgICAgICAgaWYgKHZhbHVlMiAhPSAiY2FzZSIgJiYgdmFsdWUyICE9ICJjaGFuIiAmJiB2YWx1ZTIgIT0gImNvbnN0IiAmJiB2YWx1ZTIgIT0gImNvbnRpbnVlIikgewotICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgICAgICB9Ci0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoKLSAgICBjYXNlICdEJzoKLSAgICAgICAgaWYgKHZhbHVlMiAhPSAiZGVmYXVsdCIgJiYgdmFsdWUyICE9ICJkZWZlciIpIHsKLSAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZSc6Ci0gICAgY2FzZSAnRSc6Ci0gICAgICAgIGlmICh2YWx1ZTIgIT0gImVsc2UiICYmIHZhbHVlMiAhPSAiZXJyb3IiKSB7Ci0gICAgICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgICAgIH0KLQotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgJ2YnOgotICAgIGNhc2UgJ0YnOgotICAgICAgICBpZiAodmFsdWUyICE9ICJmYWxsdGhyb3VnaCIgJiYgdmFsdWUyICE9ICJmb3IiICYmIHZhbHVlMiAhPSAiZnVuYyIpIHsKLSAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZyc6Ci0gICAgY2FzZSAnRyc6Ci0gICAgICAgIGlmICh2YWx1ZTIgIT0gImdvIiAmJiB2YWx1ZTIgIT0gImdvdG8iKSB7Ci0gICAgICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgICAgIH0KLQotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgJ2knOgotICAgIGNhc2UgJ0knOgotICAgICAgICBpZiAodmFsdWUyICE9ICJpZiIgJiYgdmFsdWUyICE9ICJpbXBvcnQiICYmIHZhbHVlMiAhPSAiaW50ZXJmYWNlIikgewotICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgICAgICB9Ci0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdtJzoKLSAgICBjYXNlICdNJzoKLSAgICAgICAgaWYgKHZhbHVlMiAhPSAibWFwIikgewotICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgICAgICB9Ci0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdwJzoKLSAgICBjYXNlICdQJzoKLSAgICAgICAgaWYgKHZhbHVlMiAhPSAicGFja2FnZSIpIHsKLSAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAncic6Ci0gICAgY2FzZSAnUic6Ci0gICAgICAgIGlmICh2YWx1ZTIgIT0gInJhbmdlIiAmJiB2YWx1ZTIgIT0gInJldHVybiIpIHsKLSAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAncyc6Ci0gICAgY2FzZSAnUyc6Ci0gICAgICAgIGlmICh2YWx1ZTIgIT0gInNlbGVjdCIgJiYgdmFsdWUyICE9ICJzdHJ1Y3QiICYmIHZhbHVlMiAhPSAic3dpdGNoIikgewotICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgICAgICB9Ci0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd0JzoKLSAgICBjYXNlICdUJzoKLSAgICAgICAgaWYgKHZhbHVlMiAhPSAidHlwZSIpIHsKLSAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAndic6Ci0gICAgY2FzZSAnVic6Ci0gICAgICAgIGlmICh2YWx1ZTIgIT0gInZhciIpIHsKLSAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIHJldHVybiB2YWx1ZTIgKyAiX2ExIjsKLX0KLQotCi0vKioKLSAqIFByZXBhcmVzIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0Ci0gKiBzdHJlYW1zLgotICoKLSAqIEBwYXJhbSB0cHJvZ3JhbSBUaGUgcHJvZ3JhbSB0byBnZW5lcmF0ZQotICovCi12b2lkIHRfZ29fZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpCi17Ci0gICAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5Ci0gICAgc3RyaW5nIG1vZHVsZSA9IGdldF9yZWFsX2dvX21vZHVsZShwcm9ncmFtXyk7Ci0gICAgc3RyaW5nIHRhcmdldCA9IG1vZHVsZTsKLSAgICBwYWNrYWdlX2Rpcl8gPSBnZXRfb3V0X2RpcigpOwotCi0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgLy8gVE9ETzogRG8gYmV0dGVyIGVycm9yIGNoZWNraW5nIGhlcmUuCi0gICAgICAgIE1LRElSKHBhY2thZ2VfZGlyXy5jX3N0cigpKTsKLQotICAgICAgICBpZiAobW9kdWxlLmVtcHR5KCkpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgc3RyaW5nOjpzaXplX3R5cGUgcG9zID0gbW9kdWxlLmZpbmQoJy4nKTsKLQotICAgICAgICBpZiAocG9zID09IHN0cmluZzo6bnBvcykgewotICAgICAgICAgICAgcGFja2FnZV9kaXJfICs9ICIvIjsKLSAgICAgICAgICAgIHBhY2thZ2VfZGlyXyArPSBtb2R1bGU7Ci0gICAgICAgICAgICBwYWNrYWdlX25hbWVfID0gbW9kdWxlOwotICAgICAgICAgICAgbW9kdWxlLmNsZWFyKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwYWNrYWdlX2Rpcl8gKz0gIi8iOwotICAgICAgICAgICAgcGFja2FnZV9kaXJfICs9IG1vZHVsZS5zdWJzdHIoMCwgcG9zKTsKLSAgICAgICAgICAgIG1vZHVsZS5lcmFzZSgwLCBwb3MgKyAxKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0cmluZzo6c2l6ZV90eXBlIGxvYzsKLQotICAgIHdoaWxlICgobG9jID0gdGFyZ2V0LmZpbmQoIi4iKSkgIT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgICAgIHRhcmdldC5yZXBsYWNlKGxvYywgMSwgMSwgJy8nKTsKLSAgICB9Ci0KLSAgICAvLyBNYWtlIG91dHB1dCBmaWxlcwotICAgIGZfdHlwZXNfbmFtZV8gPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyAidHR5cGVzLmdvIjsKLSAgICBmX3R5cGVzXy5vcGVuKGZfdHlwZXNfbmFtZV8uY19zdHIoKSk7Ci0KLSAgICBmX2NvbnN0c19uYW1lXyA9IHBhY2thZ2VfZGlyXyArICIvIiArICJjb25zdGFudHMuZ28iOwotICAgIGZfY29uc3RzXy5vcGVuKGZfY29uc3RzX25hbWVfLmNfc3RyKCkpOwotCi0gICAgdmVjdG9yPHRfc2VydmljZSo+IHNlcnZpY2VzID0gcHJvZ3JhbV8tPmdldF9zZXJ2aWNlcygpOwotICAgIHZlY3Rvcjx0X3NlcnZpY2UqPjo6aXRlcmF0b3Igc3ZfaXRlcjsKLQotICAgIGZvciAoc3ZfaXRlciA9IHNlcnZpY2VzLmJlZ2luKCk7IHN2X2l0ZXIgIT0gc2VydmljZXMuZW5kKCk7ICsrc3ZfaXRlcikgewotICAgICAgICBzdHJpbmcgc2VydmljZV9kaXIgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyB1bmRlcnNjb3JlKCgqc3ZfaXRlciktPmdldF9uYW1lKCkpICsgIi1yZW1vdGUiOwotICAgICAgICBNS0RJUihzZXJ2aWNlX2Rpci5jX3N0cigpKTsKLSAgICB9Ci0KLSAgICAvLyBQcmludCBoZWFkZXIKLSAgICBmX3R5cGVzXyA8PAotICAgICAgICAgICAgIGdvX2F1dG9nZW5fY29tbWVudCgpIDw8Ci0gICAgICAgICAgICAgZ29fcGFja2FnZSgpIDw8Ci0gICAgICAgICAgICAgcmVuZGVyX2luY2x1ZGVzKCkgPDwKLSAgICAgICAgICAgICByZW5kZXJfaW1wb3J0X3Byb3RlY3Rpb24oKTsKLQotICAgIGZfY29uc3RzXyA8PAotICAgICAgICAgICAgICBnb19hdXRvZ2VuX2NvbW1lbnQoKSA8PAotICAgICAgICAgICAgICBnb19wYWNrYWdlKCkgPDwKLSAgICAgICAgICAgICAgcmVuZGVyX2luY2x1ZGVzKCk7Ci0KLSAgICBmX2NvbnN0X3ZhbHVlc18gPDwgZW5kbCA8PCAiZnVuYyBpbml0KCkgeyIgPDwgZW5kbDsKLQotfQotCi0vKioKLSAqIFJlbmRlcnMgYWxsIHRoZSBpbXBvcnRzIG5lY2Vzc2FyeSBmb3IgaW5jbHVkaW5nIGFub3RoZXIgVGhyaWZ0IHByb2dyYW0KLSAqLwotc3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjpyZW5kZXJfaW5jbHVkZXMoKQotewotICAgIGNvbnN0IHZlY3Rvcjx0X3Byb2dyYW0qPiYgaW5jbHVkZXMgPSBwcm9ncmFtXy0+Z2V0X2luY2x1ZGVzKCk7Ci0gICAgc3RyaW5nIHJlc3VsdCA9ICIiOwotICAgIHN0cmluZyB1bnVzZWRfcHJvdCA9ICIiOwotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmNsdWRlcy5zaXplKCk7ICsraSkgewotICAgICAgICBzdHJpbmcgZ29fbW9kdWxlID0gZ2V0X3JlYWxfZ29fbW9kdWxlKGluY2x1ZGVzW2ldKTsKLSAgICAgICAgc2l6ZV90IGZvdW5kID0gMDsKLSAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBnb19tb2R1bGUuc2l6ZSgpOyBqKyspIHsKLSAgICAgICAgICAgIC8vIEltcG9ydCBzdGF0ZW1lbnQgdXNlcyBzbGFzaGVzICgnLycpIGluIG5hbWVzcGFjZQotICAgICAgICAgICAgaWYgKGdvX21vZHVsZVtqXSA9PSAnLicpIHsKLSAgICAgICAgICAgICAgICBnb19tb2R1bGVbal0gPSAnLyc7Ci0gICAgICAgICAgICAgICAgZm91bmQgPSBqICsgMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJlc3VsdCArPSAiXHRcIiIgKyBnZW5fcGFja2FnZV9wcmVmaXhfICsgZ29fbW9kdWxlICsgIlwiXG4iOwotICAgICAgICB1bnVzZWRfcHJvdCArPSAidmFyIF8gPSAiICsgZ29fbW9kdWxlLnN1YnN0cihmb3VuZCkgKyAiLkdvVW51c2VkUHJvdGVjdGlvbl9fXG4iOwotICAgIH0KLQotICAgIGlmIChpbmNsdWRlcy5zaXplKCkgPiAwKSB7Ci0gICAgICAgIHJlc3VsdCArPSAiXG4iOwotICAgIH0KLQotICAgIHJldHVybiBnb19pbXBvcnRzX2JlZ2luKCkgKyByZXN1bHQgKyBnb19pbXBvcnRzX2VuZCgpICsgdW51c2VkX3Byb3Q7Ci19Ci0KLXN0cmluZyB0X2dvX2dlbmVyYXRvcjo6cmVuZGVyX2ltcG9ydF9wcm90ZWN0aW9uKCkgewotICByZXR1cm4gc3RyaW5nKCJ2YXIgR29VbnVzZWRQcm90ZWN0aW9uX18gaW50O1xuXG4iKTsKLX0KLQotLyoqCi0gKiBSZW5kZXJzIGFsbCB0aGUgaW1wb3J0cyBuZWNlc3NhcnkgdG8gdXNlIHRoZSBhY2NlbGVyYXRlZCBUQmluYXJ5UHJvdG9jb2wKLSAqLwotc3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjpyZW5kZXJfZmFzdGJpbmFyeV9pbmNsdWRlcygpCi17Ci0gICAgcmV0dXJuICIiOwotfQotCi0vKioKLSAqIEF1dG9nZW4nZCBjb21tZW50Ci0gKi8KLXN0cmluZyB0X2dvX2dlbmVyYXRvcjo6Z29fYXV0b2dlbl9jb21tZW50KCkKLXsKLSAgICByZXR1cm4KLSAgICAgICAgc3RkOjpzdHJpbmcoKSArCi0gICAgICAgICIvLyBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoIiArIFRIUklGVF9WRVJTSU9OICsgIilcbiIKLSAgICAgICAgIi8vIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkdcblxuIjsKLX0KLQotLyoqCi0gKiBQcmludHMgc3RhbmRhcmQgdGhyaWZ0IHBhY2thZ2UKLSAqLwotc3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjpnb19wYWNrYWdlKCkKLXsKLSAgICByZXR1cm4gc3RyaW5nKCJwYWNrYWdlICIpICsgcGFja2FnZV9uYW1lXyArICJcblxuIjsKLX0KLQotLyoqCi0gKiBSZW5kZXIgdGhlIGJlZ2lubmluZyBvZiB0aGUgaW1wb3J0IHN0YXRlbWVudAotICovCi1zdHJpbmcgdF9nb19nZW5lcmF0b3I6OmdvX2ltcG9ydHNfYmVnaW4oKQotewotICAgIHJldHVybgotICAgICAgICBzdHJpbmcoImltcG9ydCAoXG4iCi0gICAgICAgICAgICAgICAgIlx0XCJieXRlc1wiXG4iCi0gICAgICAgICAgICAgICAgIlx0XCJmbXRcIlxuIgotICAgICAgICAgICAgICAgIlx0XCIiICsgZ2VuX3RocmlmdF9pbXBvcnRfICsgIlwiXG4iKTsKLX0KLQotLyoqCi0gKiBFbmQgdGhlIGltcG9ydCBzdGF0ZW1lbnQsIGluY2x1ZGUgdW5kc2NvcmUtYXNzaWdubWVudHMKLSAqCi0gKiBUaGVzZSAiXyA9IiBwcmV2ZW50IHRoZSBnbyBjb21waWxlciBjb21wbGFpbmluZyBhYm91dCB1c2VkIGltcG9ydHMuCi0gKiBUaGlzIHdpbGwgaGF2ZSB0byBkbyBpbiBsaWV1IG9mIG1vcmUgaW50ZWxsaWdlbnQgaW1wb3J0IHN0YXRlbWVudCBjb25zdHJ1Y3Rpb24KLSAqLwotc3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjpnb19pbXBvcnRzX2VuZCgpCi17Ci0gICAgcmV0dXJuCi0gICAgICAgIHN0cmluZygKLSAgICAgICAgICAgICIpXG5cbiIKLSAgICAgICAgICAgICIvLyAobmVlZGVkIHRvIGVuc3VyZSBzYWZldHkgYmVjYXVzZSBvZiBuYWl2ZSBpbXBvcnQgbGlzdCBjb25zdHJ1Y3Rpb24uKVxuIgotICAgICAgICAgICAgInZhciBfID0gdGhyaWZ0LlpFUk9cbiIKLSAgICAgICAgICAgICJ2YXIgXyA9IGZtdC5QcmludGZcbiIKLSAgICAgICAgCSJ2YXIgXyA9IGJ5dGVzLkVxdWFsXG5cbiIpOwotfQotCi0vKioKLSAqIENsb3NlcyB0aGUgdHlwZSBmaWxlcwotICovCi12b2lkIHRfZ29fZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKQotewotICAgIGZfY29uc3RfdmFsdWVzXyA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICAgIGZfY29uc3RzXyA8PCBmX2NvbnN0X3ZhbHVlc18uc3RyKCk7Ci0KLSAgICAvLyBDbG9zZSB0eXBlcyBhbmQgY29uc3RhbnRzIGZpbGVzCi0gICAgZl9jb25zdHNfLmNsb3NlKCk7Ci0gICAgZl90eXBlc18uY2xvc2UoKTsKLSAgICBmb3JtYXRfZ29fb3V0cHV0KGZfdHlwZXNfbmFtZV8pOwotICAgIGZvcm1hdF9nb19vdXRwdXQoZl9jb25zdHNfbmFtZV8pOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuCi0gKgotICogQHBhcmFtIHR0eXBlZGVmIFRoZSB0eXBlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKQotewotICAgIGdlbmVyYXRlX2dvX2RvY3N0cmluZyhmX3R5cGVzXywgdHR5cGVkZWYpOwotICAgIHN0cmluZyBuZXdfdHlwZV9uYW1lKHB1YmxpY2l6ZSh0dHlwZWRlZi0+Z2V0X3N5bWJvbGljKCkpKTsKLSAgICBzdHJpbmcgYmFzZV90eXBlKHR5cGVfdG9fZ29fdHlwZSh0dHlwZWRlZi0+Z2V0X3R5cGUoKSkpOwotCi0gICAgaWYgKGJhc2VfdHlwZSA9PSBuZXdfdHlwZV9uYW1lKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBmX3R5cGVzXyA8PAotICAgICAgICAgICAgICJ0eXBlICIgPDwgbmV3X3R5cGVfbmFtZSA8PCAiICIgPDwgYmFzZV90eXBlIDw8IGVuZGwgPDwgZW5kbDsKLSAgICAvLyBHZW5lcmF0ZSBhIGNvbnZlbmllbmNlIGZ1bmN0aW9uIHRoYXQgY29udmVydHMgYW4gaW5zdGFuY2Ugb2YgYSB0eXBlCi0gICAgLy8gKHdoaWNoIG1heSBiZSBhIGNvbnN0YW50KSBpbnRvIGEgcG9pbnRlciB0byBhbiBpbnN0YW5jZSBvZiBhIHR5cGUuCi0gICAgZl90eXBlc18gPDwKLSAgICAgICAgICAgICAiZnVuYyAiIDw8IG5ld190eXBlX25hbWUgPDwgIlB0cih2ICIgPDwgbmV3X3R5cGVfbmFtZSA8PCAgIikgKiIgPDwgbmV3X3R5cGVfbmFtZSA8PAotICAgICAgICAgICAgICIgeyByZXR1cm4gJnYgfSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBjb2RlIGZvciBhbiBlbnVtZXJhdGVkIHR5cGUuIERvbmUgdXNpbmcgYSBjbGFzcyB0byBzY29wZQotICogdGhlIHZhbHVlcy4KLSAqCi0gKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCi0gKi8KLXZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkKLXsKLSAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gdG9fc3RyaW5nX21hcHBpbmcsIGZyb21fc3RyaW5nX21hcHBpbmc7Ci0gICAgc3RkOjpzdHJpbmcgdGVudW1fbmFtZShwdWJsaWNpemUodGVudW0tPmdldF9uYW1lKCkpKTsKLSAgICBnZW5lcmF0ZV9nb19kb2NzdHJpbmcoZl90eXBlc18sIHRlbnVtKTsKLSAgICBmX3R5cGVzXyA8PAotICAgICAgICAgICAgICJ0eXBlICIgPDwgdGVudW1fbmFtZSA8PCAiIGludDY0IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgImNvbnN0ICgiIDw8IGVuZGw7Ci0gICAgdG9fc3RyaW5nX21hcHBpbmcgPDwKLSAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiZnVuYyAocCAiIDw8IHRlbnVtX25hbWUgPDwgIikgU3RyaW5nKCkgc3RyaW5nIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICBzd2l0Y2ggcCB7IiA8PCBlbmRsOwotICAgIGZyb21fc3RyaW5nX21hcHBpbmcgPDwKLSAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICJmdW5jICIgPDwgdGVudW1fbmFtZSA8PCAiRnJvbVN0cmluZyhzIHN0cmluZykgKCIgPDwgdGVudW1fbmFtZSA8PCAiLCBlcnJvcikgeyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgc3dpdGNoIHMgeyIgPDwgZW5kbDsKLSAgICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKLSAgICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKLSAgICBpbnQgdmFsdWUgPSAtMTsKLQotICAgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgICB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0KLSAgICAgICAgc3RyaW5nIGl0ZXJfc3RkX25hbWUoZXNjYXBlX3N0cmluZygoKmNfaXRlciktPmdldF9uYW1lKCkpKTsKLSAgICAgICAgc3RyaW5nIGl0ZXJfbmFtZSgoKmNfaXRlciktPmdldF9uYW1lKCkpOwotICAgICAgICBmX3R5cGVzXyA8PAotICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICAiIDw8IHRlbnVtX25hbWUgPDwgIl8iIDw8IGl0ZXJfbmFtZSA8PCAnICcgPDwgdGVudW1fbmFtZSA8PCAiID0gIiA8PCB2YWx1ZSA8PCBlbmRsOwotICAgICAgICAvLyBEaWN0aW9uYXJpZXMgdG8vZnJvbSBzdHJpbmcgbmFtZXMgb2YgZW51bXMKLSAgICAgICAgdG9fc3RyaW5nX21hcHBpbmcgPDwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgY2FzZSAiIDw8IHRlbnVtX25hbWUgPDwgIl8iIDw8IGl0ZXJfbmFtZSA8PCAiOiByZXR1cm4gXCIiIDw8IHRlbnVtX25hbWUgPDwgIl8iIDw8IGl0ZXJfc3RkX25hbWUgPDwgIlwiIiA8PCBlbmRsOwotCi0gICAgICAgIGlmIChpdGVyX3N0ZF9uYW1lICE9IGVzY2FwZV9zdHJpbmcoaXRlcl9uYW1lKSkgewotICAgICAgICAgICAgZnJvbV9zdHJpbmdfbWFwcGluZyA8PAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICBjYXNlIFwiIiA8PCB0ZW51bV9uYW1lIDw8ICJfIiA8PCBpdGVyX3N0ZF9uYW1lIDw8ICJcIiwgXCIiIDw8IGVzY2FwZV9zdHJpbmcoaXRlcl9uYW1lKSA8PCAiXCI6IHJldHVybiAiIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbnVtX25hbWUgPDwgIl8iIDw8IGl0ZXJfbmFtZSA8PCAiLCBuaWwgIiA8PCBlbmRsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZnJvbV9zdHJpbmdfbWFwcGluZyA8PAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICBjYXNlIFwiIiA8PCB0ZW51bV9uYW1lIDw8ICJfIiA8PCBpdGVyX3N0ZF9uYW1lIDw8ICJcIjogcmV0dXJuICIgPDwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVudW1fbmFtZSA8PCAiXyIgPDwgaXRlcl9uYW1lIDw8ICIsIG5pbCAiICA8PCBlbmRsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdG9fc3RyaW5nX21hcHBpbmcgPDwKLSAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIFwiPFVOU0VUPlwiIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgZnJvbV9zdHJpbmdfbWFwcGluZyA8PAotICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgfSIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgdGVudW1fbmFtZSA8PCAiKDApLCIgPDwKLSAgICAgICAgICAgICAgICAgICAgICAgICIgZm10LkVycm9yZihcIm5vdCBhIHZhbGlkICIgPDwgdGVudW1fbmFtZSA8PCAiIHN0cmluZ1wiKSIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgICBmX3R5cGVzXyA8PCAiKSIgPDwgZW5kbCA8PCBlbmRsCi0gICAgICAgICAgICAgPDwgdG9fc3RyaW5nX21hcHBpbmcuc3RyKCkgPDwgZW5kbAotICAgICAgICAgICAgIDw8IGZyb21fc3RyaW5nX21hcHBpbmcuc3RyKCkgPDwgZW5kbCA8PCBlbmRsOwotCi0gICAgLy8gR2VuZXJhdGUgYSBjb252ZW5pZW5jZSBmdW5jdGlvbiB0aGF0IGNvbnZlcnRzIGFuIGluc3RhbmNlIG9mIGFuIGVudW0KLSAgICAvLyAod2hpY2ggbWF5IGJlIGEgY29uc3RhbnQpIGludG8gYSBwb2ludGVyIHRvIGFuIGluc3RhbmNlIG9mIHRoYXQgZW51bQotICAgIC8vIHR5cGUuCi0gICAgZl90eXBlc18gPDwKLSAgICAgICAgICAgICAiZnVuYyAiIDw8IHRlbnVtX25hbWUgPDwgIlB0cih2ICIgPDwgdGVudW1fbmFtZSA8PCAgIikgKiIgPDwgdGVudW1fbmFtZSA8PAotICAgICAgICAgICAgICIgeyByZXR1cm4gJnYgfSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0KLS8qKgotICogR2VuZXJhdGUgYSBjb25zdGFudCB2YWx1ZQotICovCi12b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpCi17Ci0gICAgdF90eXBlKiB0eXBlID0gdGNvbnN0LT5nZXRfdHlwZSgpOwotICAgIHN0cmluZyBuYW1lID0gcHVibGljaXplKHRjb25zdC0+Z2V0X25hbWUoKSk7Ci0gICAgdF9jb25zdF92YWx1ZSogdmFsdWUgPSB0Y29uc3QtPmdldF92YWx1ZSgpOwotCi0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgICBpbmRlbnQoZl9jb25zdHNfKSA8PCAiY29uc3QgIiA8PCBuYW1lIDw8ICIgPSAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0eXBlLCB2YWx1ZSwgbmFtZSkgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgICBmX2NvbnN0X3ZhbHVlc18gPDwKLSAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudCgpIDw8IG5hbWUgPDwgIiA9ICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHR5cGUsIHZhbHVlLCBuYW1lKSA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICAgICAgZl9jb25zdHNfIDw8Ci0gICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAidmFyICIgPDwgbmFtZSA8PCAiICIgPDwgdHlwZV90b19nb190eXBlKHR5cGUpIDw8IGVuZGw7Ci0gICAgfQotfQotCi0vKioKLSAqIFByaW50cyB0aGUgdmFsdWUgb2YgYSBjb25zdGFudCB3aXRoIHRoZSBnaXZlbiB0eXBlLiBOb3RlIHRoYXQgdHlwZSBjaGVja2luZwotICogaXMgTk9UIHBlcmZvcm1lZCBpbiB0aGlzIGZ1bmN0aW9uIGFzIGl0IGlzIGFsd2F5cyBydW4gYmVmb3JlaGFuZCB1c2luZyB0aGUKLSAqIHZhbGlkYXRlX3R5cGVzIG1ldGhvZCBpbiBtYWluLmNjCi0gKi8KLXN0cmluZyB0X2dvX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUsIGNvbnN0IHN0cmluZyYgbmFtZSkKLXsKLSAgICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLSAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OwotCi0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLQotICAgICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICAgICAgaWYgKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSkgewotICAgICAgICAgICAgICAgIG91dCA8PCAiW11ieXRlKFwiIiA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICJcIikiOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBvdXQgPDwgJyInIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgICAgICBvdXQgPDwgKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgewotICAgICAgICAgICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgICAgICBvdXQgPDwKLSAgICAgICAgICAgICImIiA8PCBwdWJsaWNpemUodHlwZV9uYW1lKHR5cGUpKSA8PCAieyI7Ci0gICAgICAgIGluZGVudF91cCgpOwotICAgICAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKLSAgICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICAgICAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICAgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLQotICAgICAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKLQotICAgICAgICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgICAgICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgewotICAgICAgICAgICAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChmaWVsZF90eXBlLT5pc19iYXNlX3R5cGUoKSB8fCBmaWVsZF90eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgICAgICAgICAgICBvdXQgPDwgZW5kbCA8PAotICAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCBwdWJsaWNpemUodl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSA8PCAiOiAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZShmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCwgbmFtZSkgPDwgIiwiOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzdHJpbmcgayh0bXAoImsiKSk7Ci0gICAgICAgICAgICAgICAgc3RyaW5nIHYodG1wKCJ2IikpOwotICAgICAgICAgICAgICAgIG91dCA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgICAgICAgIGluZGVudCgpIDw8IHYgPDwgIiA6PSAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZShmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCwgdikgPDwgZW5kbCA8PAotICAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCBuYW1lIDw8ICIuIiA8PCBwdWJsaWNpemUodl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSA8PCAiID0gIiA8PCB2OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgb3V0IDw8ICJ9IjsKLQotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICAgICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKLSAgICAgICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLSAgICAgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgICAgIG91dCA8PAotICAgICAgICAgICAgIm1hcFsiIDw8IHR5cGVfdG9fZ29fdHlwZShrdHlwZSkgPDwgIl0iIDw8IHR5cGVfdG9fZ29fdHlwZSh2dHlwZSwgdHJ1ZSkgPDwgInsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF91cCgpOwotICAgICAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotCi0gICAgICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICAgICAgICBvdXQgPDwKLSAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCByZW5kZXJfY29uc3RfdmFsdWUoa3R5cGUsIHZfaXRlci0+Zmlyc3QsIG5hbWUpIDw8ICI6ICIgPDwKLSAgICAgICAgICAgICAgICByZW5kZXJfY29uc3RfdmFsdWUodnR5cGUsIHZfaXRlci0+c2Vjb25kLCBuYW1lKSA8PCAiLCIgPDwgZW5kbDsKLSAgICAgICAgfQotCi0gICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICAgIG91dCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgIn0iOwotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICAgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7Ci0gICAgICAgIG91dCA8PAotICAgICAgICAgICAgIltdIiA8PCB0eXBlX3RvX2dvX3R5cGUoZXR5cGUpIDw8ICJ7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotCi0gICAgICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICAgICAgICBvdXQgPDwKLSAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCByZW5kZXJfY29uc3RfdmFsdWUoZXR5cGUsICp2X2l0ZXIsIG5hbWUpIDw8ICIsICI7Ci0gICAgICAgIH0KLQotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICBvdXQgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICJ9IjsKLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgICAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgICAibWFwWyIgPDwgdHlwZV90b19nb19rZXlfdHlwZShldHlwZSkgPDwgIl1ib29seyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLQotICAgICAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGV0eXBlLCAqdl9pdGVyLCBuYW1lKSA8PCAiOiB0cnVlLCIgPDwgZW5kbDsKLQotICAgICAgICB9Ci0KLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAifSI7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBDT05TVEFOVCBGT1IgVFlQRTogIiArIHR5cGUtPmdldF9uYW1lKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIG91dC5zdHIoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBnbyBzdHJ1Y3QKLSAqLwotdm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KQotewotICAgIGdlbmVyYXRlX2dvX3N0cnVjdCh0c3RydWN0LCBmYWxzZSk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGV4Y2VwdGlvbi4gQmFzaWNhbGx5IHRoZSBzYW1lCi0gKiBhcyBhIHN0cnVjdCBidXQgZXh0ZW5kcyB0aGUgRXhjZXB0aW9uIGNsYXNzLgotICoKLSAqIEBwYXJhbSB0eGNlcHRpb24gVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pCi17Ci0gICAgZ2VuZXJhdGVfZ29fc3RydWN0KHR4Y2VwdGlvbiwgdHJ1ZSk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgZ28gc3RydWN0Ci0gKi8KLXZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2dvX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikKLXsKLSAgICBnZW5lcmF0ZV9nb19zdHJ1Y3RfZGVmaW5pdGlvbihmX3R5cGVzXywgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKLX0KLQotdm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2V0X3B1YmxpY2l6ZWRfbmFtZV9hbmRfZGVmX3ZhbHVlKHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcqIE9VVF9wdWJfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiogT1VUX2RlZl92YWx1ZSkgY29uc3QgewotICAgIGNvbnN0IHN0cmluZyBiYXNlX2ZpZWxkX25hbWUgPSB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gICAgY29uc3Qgc3RyaW5nIGVzY2FwZWRfZmllbGRfbmFtZSA9IGVzY2FwZV9zdHJpbmcoYmFzZV9maWVsZF9uYW1lKTsKLSAgICBjb25zdCBzdHJpbmcgZ29fc2FmZV9uYW1lID0gdmFyaWFibGVfbmFtZV90b19nb19uYW1lKGVzY2FwZWRfZmllbGRfbmFtZSk7Ci0gICAgKk9VVF9wdWJfbmFtZSA9IHB1YmxpY2l6ZShnb19zYWZlX25hbWUpOwotICAgICpPVVRfZGVmX3ZhbHVlID0gdGZpZWxkLT5nZXRfdmFsdWUoKTsKLX0KLQotdm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ29fc3RydWN0X2luaXRpYWxpemVyKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICBib29sIGlzX2FyZ3Nfb3JfcmVzdWx0KQotewotICAgIG91dCA8PCBwdWJsaWNpemUodHlwZV9uYW1lKHRzdHJ1Y3QpLCBpc19hcmdzX29yX3Jlc3VsdCkgPDwgInsiOwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICAgIGZvciAodmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgICAgYm9vbCBwb2ludGVyX2ZpZWxkID0gaXNfcG9pbnRlcl9maWVsZCgqbV9pdGVyKTsKLSAgICAgICAgc3RyaW5nIHB1YmxpY2l6ZWRfbmFtZTsKLSAgICAgICAgdF9jb25zdF92YWx1ZSogZGVmX3ZhbHVlOwotICAgICAgICBnZXRfcHVibGljaXplZF9uYW1lX2FuZF9kZWZfdmFsdWUoKm1faXRlciwgJnB1YmxpY2l6ZWRfbmFtZSwgJmRlZl92YWx1ZSk7Ci0gICAgICAgIGlmICghcG9pbnRlcl9maWVsZCAmJiBkZWZfdmFsdWUgIT0gTlVMTCAmJiAhb21pdF9pbml0aWFsaXphdGlvbigqbV9pdGVyKSkgewotICAgICAgICAgICAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgcHVibGljaXplZF9uYW1lIDw8ICI6ICIgPDwgcmVuZGVyX2ZpZWxkX2luaXRpYWxfdmFsdWUoKm1faXRlciwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpLCBwb2ludGVyX2ZpZWxkKSA8PCAiLCIgPDwgZW5kbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIG91dCA8PCAifSIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZGF0YSB0eXBlLgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nb19zdHJ1Y3RfZGVmaW5pdGlvbihvZnN0cmVhbSYgb3V0LAotICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgYm9vbCBpc19leGNlcHRpb24sCi0gICAgICAgIGJvb2wgaXNfcmVzdWx0LAotICAgICAgICBib29sIGlzX2FyZ3MpCi17Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgc29ydGVkX21lbWJlcnMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0KLSAgICBzdGQ6OnN0cmluZyB0c3RydWN0X25hbWUocHVibGljaXplKHRzdHJ1Y3QtPmdldF9uYW1lKCksIGlzX2FyZ3N8fGlzX3Jlc3VsdCkpOwotICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAidHlwZSAiIDw8IHRzdHJ1Y3RfbmFtZSA8PCAiIHN0cnVjdCB7IiA8PCBlbmRsOwotICAgIC8qCi0gICAgICAgSGVyZSB3ZSBnZW5lcmF0ZSB0aGUgc3RydWN0dXJlIHNwZWNpZmljYXRpb24gZm9yIHRoZSBmYXN0YmluYXJ5IGNvZGVjLgotICAgICAgIFRoZXNlIHNwZWNpZmljYXRpb25zIGhhdmUgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmU6Ci0gICAgICAgdGhyaWZ0X3NwZWMgLT4gdHVwbGUgb2YgaXRlbV9zcGVjCi0gICAgICAgaXRlbV9zcGVjIC0+IG5pbCB8ICh0YWcsIHR5cGVfZW51bSwgbmFtZSwgc3BlY19hcmdzLCBkZWZhdWx0KQotICAgICAgIHRhZyAtPiBpbnRlZ2VyCi0gICAgICAgdHlwZV9lbnVtIC0+IFRUeXBlLkkzMiB8IFRUeXBlLlNUUklORyB8IFRUeXBlLlNUUlVDVCB8IC4uLgotICAgICAgIG5hbWUgLT4gc3RyaW5nX2xpdGVyYWwKLSAgICAgICBkZWZhdWx0IC0+IG5pbCAgIyBIYW5kbGVkIGJ5IF9faW5pdF9fCi0gICAgICAgc3BlY19hcmdzIC0+IG5pbCAgIyBGb3Igc2ltcGxlIHR5cGVzCi0gICAgICAgICAgICAgICAgICB8ICh0eXBlX2VudW0sIHNwZWNfYXJncykgICMgVmFsdWUgdHlwZSBmb3IgbGlzdC9zZXQKLSAgICAgICAgICAgICAgICAgIHwgKHR5cGVfZW51bSwgc3BlY19hcmdzLCB0eXBlX2VudW0sIHNwZWNfYXJncykKLSAgICAgICAgICAgICAgICAgICAgIyBLZXkgYW5kIHZhbHVlIGZvciBtYXAKLSAgICAgICAgICAgICAgICAgIHwgKGNsYXNzX25hbWUsIHNwZWNfYXJnc19wdHIpICMgRm9yIHN0cnVjdC9leGNlcHRpb24KLSAgICAgICBjbGFzc19uYW1lIC0+IGlkZW50aWZpZXIgICMgQmFzaWNhbGx5IGEgcG9pbnRlciB0byB0aGUgY2xhc3MKLSAgICAgICBzcGVjX2FyZ3NfcHRyIC0+IGV4cHJlc3Npb24gICMganVzdCBjbGFzc19uYW1lLnNwZWNfYXJncwotCi0gICAgICAgVE9ETyhkcmVpc3MpOiBDb25zaWRlciBtYWtpbmcgdGhpcyB3b3JrIGZvciBzdHJ1Y3RzIHdpdGggbmVnYXRpdmUgdGFncy4KLSAgICAqLwotICAgIC8vIFRPRE8oZHJlaXNzKTogTG9vayBpbnRvIGdlbmVyYXRpbmcgYW4gZW1wdHkgdHVwbGUgaW5zdGVhZCBvZiBuaWwKLSAgICAvLyBmb3Igc3RydWN0dXJlcyB3aXRoIG5vIG1lbWJlcnMuCi0gICAgLy8gVE9ETyhkcmVpc3MpOiBUZXN0IGVuY29kaW5nIG9mIHN0cnVjdHMgd2hlcmUgc29tZSBpbm5lciBzdHJ1Y3RzCi0gICAgLy8gZG9uJ3QgaGF2ZSB0aHJpZnRfc3BlYy4KLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIGlmIChzb3J0ZWRfbWVtYmVycy5lbXB0eSgpIHx8IChzb3J0ZWRfbWVtYmVyc1swXS0+Z2V0X2tleSgpID49IDApKSB7Ci0gICAgICAgIGludCBzb3J0ZWRfa2V5c19wb3MgPSAwOwotCi0gICAgICAgIGZvciAobV9pdGVyID0gc29ydGVkX21lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IHNvcnRlZF9tZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgICAgICAgaWYoIHNvcnRlZF9rZXlzX3BvcyAhPSAoKm1faXRlciktPmdldF9rZXkoKSkgewotICAgICAgICAgICAgICAgIGludCBmaXJzdF91bnVzZWQgPSBzdGQ6Om1heCgxLHNvcnRlZF9rZXlzX3BvcysrKTsKLSAgICAgICAgICAgICAgICB3aGlsZSggc29ydGVkX2tleXNfcG9zICE9ICgqbV9pdGVyKS0+Z2V0X2tleSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICsrc29ydGVkX2tleXNfcG9zOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpbnQgbGFzdF91bnVzZWQgPSBzb3J0ZWRfa2V5c19wb3MgLSAxOwotICAgICAgICAgICAgICAgIGlmIChmaXJzdF91bnVzZWQgPCBsYXN0X3VudXNlZCkgewotICAgICAgICAgICAgICAgICAgICBpbmRlbnQob3V0KSA8PCAiLy8gdW51c2VkIGZpZWxkcyAjICIgPDwgZmlyc3RfdW51c2VkIDw8ICIgdG8gIjw8IGxhc3RfdW51c2VkIDw8IGVuZGw7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmaXJzdF91bnVzZWQgPT0gbGFzdF91bnVzZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgaW5kZW50KG91dCkgPDwgIi8vIHVudXNlZCBmaWVsZCAjICIgPDwgZmlyc3RfdW51c2VkIDw8IGVuZGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0X3R5cGUqIGZpZWxkVHlwZSA9ICgqbV9pdGVyKS0+Z2V0X3R5cGUoKTsKLSAgICAgICAgICAgIHN0cmluZyBnb1R5cGUgPSB0eXBlX3RvX2dvX3R5cGVfd2l0aF9vcHQoZmllbGRUeXBlLCBpc19wb2ludGVyX2ZpZWxkKCptX2l0ZXIpKTsKLSAgICAgICAgICAgIHN0cmluZyBnb3RhZygianNvbjpcIiIgKyBlc2NhcGVfc3RyaW5nKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgKyAiXCIiKTsKLSAgICAgICAgICAgIHN0ZDo6bWFwPHN0cmluZywgc3RyaW5nPjo6aXRlcmF0b3IgaXQgPSAoKm1faXRlciktPmFubm90YXRpb25zXy5maW5kKCJnby50YWciKTsKLSAgICAgICAgICAgIGlmIChpdCAhPSAoKm1faXRlciktPmFubm90YXRpb25zXy5lbmQoKSkgewotICAgICAgICAgICAgCWdvdGFnID0gaXQtPnNlY29uZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGluZGVudChvdXQpIDw8IHB1YmxpY2l6ZSh2YXJpYWJsZV9uYW1lX3RvX2dvX25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSkgPDwgIiAiCi0gICAgICAgICAgICAgICAgICAgICAgICA8PCBnb1R5cGUgPDwgIiBgdGhyaWZ0OlwiIgotICAgICAgICAgICAgICAgICAgICAgICAgPDwgZXNjYXBlX3N0cmluZygoKm1faXRlciktPmdldF9uYW1lKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCIgPDwgc29ydGVkX2tleXNfcG9zOwotCi0gICAgICAgICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgewotICAgICAgICAgICAgICAgIG91dCA8PCAiLHJlcXVpcmVkIjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgb3V0IDw8ICJcIiAiIDw8Z290YWcgPDwiYCIgPDwgZW5kbDsKLSAgICAgICAgICAgIHNvcnRlZF9rZXlzX3BvcyArKzsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgICAgICAgIC8vIFRoaXMgZmlsbHMgaW4gZGVmYXVsdCB2YWx1ZXMsIGFzIG9wcG9zZWQgdG8gbnVsbHMKLSAgICAgICAgICAgIG91dCA8PAotICAgICAgICAgICAgICAgIGluZGVudCgpIDw8IHB1YmxpY2l6ZSgoKm1faXRlciktPmdldF9uYW1lKCkpIDw8ICIgIiA8PAotICAgICAgICAgICAgICAgIHR5cGVfdG9fZ29fdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpIDw8IGVuZGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJmdW5jIE5ldyIgPDwgdHN0cnVjdF9uYW1lIDw8ICIoKSAqIiA8PCB0c3RydWN0X25hbWUgPDwgIiB7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiAmIjsKLSAgICBnZW5lcmF0ZV9nb19zdHJ1Y3RfaW5pdGlhbGl6ZXIob3V0LCB0c3RydWN0LCBpc19yZXN1bHQgfHwgaXNfYXJncyk7Ci0Jb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgLy8gRGVmYXVsdCB2YWx1ZXMgZm9yIG9wdGlvbmFsIGZpZWxkcwotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgICAgc3RyaW5nIHB1YmxpY2l6ZWRfbmFtZTsKLSAgICAgICAgdF9jb25zdF92YWx1ZSogZGVmX3ZhbHVlOwotICAgICAgICBnZXRfcHVibGljaXplZF9uYW1lX2FuZF9kZWZfdmFsdWUoKm1faXRlciwgJnB1YmxpY2l6ZWRfbmFtZSwgJmRlZl92YWx1ZSk7Ci0gICAgICAgIHRfdHlwZSogZmllbGRUeXBlID0gKCptX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgICAgICBzdHJpbmcgZ29UeXBlID0gdHlwZV90b19nb190eXBlX3dpdGhfb3B0KGZpZWxkVHlwZSwgZmFsc2UpOwotICAgICAgICBzdHJpbmcgZGVmX3Zhcl9uYW1lID0gdHN0cnVjdF9uYW1lICsgIl8iICsgcHVibGljaXplZF9uYW1lICsgIl9ERUZBVUxUIjsKLSAgICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwgfHwgaXNfcG9pbnRlcl9maWVsZCgqbV9pdGVyKSkgewotICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YXIgIiA8PCBkZWZfdmFyX25hbWUgPDwiICI8PGdvVHlwZSA7Ci0gICAgICAgICAgICBpZiAoZGVmX3ZhbHVlICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBvdXQgPDwgIiA9ICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGZpZWxkVHlwZSwgZGVmX3ZhbHVlLCAoKm1faXRlciktPmdldF9uYW1lKCkpIDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG91dCA8PGVuZGw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlzX3BvaW50ZXJfZmllbGQoKm1faXRlcikpIHsKLSAgICAgICAgICAgIHN0cmluZyBnb09wdFR5cGUgPSB0eXBlX3RvX2dvX3R5cGVfd2l0aF9vcHQoZmllbGRUeXBlLCB0cnVlKTsKLSAgICAgICAgICAgIHN0cmluZyBtYXliZXBvaW50ZXIgPSBnb09wdFR5cGUhPWdvVHlwZT8iKiI6IiI7Ci0gICAgICAgICAgICBvdXQgPDxpbmRlbnQoKSA8PCAiZnVuYyAocCAqIiA8PCB0c3RydWN0X25hbWUgPDwgIikgR2V0IiA8PCBwdWJsaWNpemVkX25hbWUgPDwgIigpICI8PCBnb1R5cGU8PCIgeyIgPDwgZW5kbAotICAgICAgICAgICAgICAgIDw8aW5kZW50KCkgPDwgIiAgaWYgIXAuSXNTZXQiIDw8cHVibGljaXplZF9uYW1lIDw8IigpIHsiIDw8ZW5kbAotICAgICAgICAgICAgICAgIDw8aW5kZW50KCkgPDwgIiAgICByZXR1cm4gIiA8PGRlZl92YXJfbmFtZSA8PGVuZGwKLSAgICAgICAgICAgICAgICA8PGluZGVudCgpIDw8ICIgIH0iIDw8ZW5kbAotICAgICAgICAgICAgICAgIDw8aW5kZW50KCkgPDwgInJldHVybiAiPDxtYXliZXBvaW50ZXIgPDwicC4iIDw8cHVibGljaXplZF9uYW1lIDw8ZW5kbAotICAgICAgICAgICAgICAgIDw8aW5kZW50KCkgPDwgIn0iIDw8ZW5kbDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG91dCA8PGVuZGwKLSAgICAgICAgICAgIAk8PGluZGVudCgpIDw8ICJmdW5jIChwICoiIDw8IHRzdHJ1Y3RfbmFtZSA8PCAiKSBHZXQiIDw8IHB1YmxpY2l6ZWRfbmFtZSA8PCAiKCkgIjw8IGdvVHlwZTw8IiB7IiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgPDxpbmRlbnQoKSA8PCAicmV0dXJuIHAuIiA8PHB1YmxpY2l6ZWRfbmFtZSA8PGVuZGwKLSAgICAgICAgICAgICAgICA8PGluZGVudCgpIDw8ICJ9IiA8PGVuZGw7Ci0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGdlbmVyYXRlX2lzc2V0X2hlbHBlcnMob3V0LCB0c3RydWN0LCB0c3RydWN0X25hbWUsIGlzX3Jlc3VsdCk7Ci0gICAgZ2VuZXJhdGVfZ29fc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QsIHRzdHJ1Y3RfbmFtZSwgaXNfcmVzdWx0KTsKLSAgICBnZW5lcmF0ZV9nb19zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCwgdHN0cnVjdF9uYW1lLCBpc19yZXN1bHQpOwotCi0gICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJmdW5jIChwICoiIDw8IHRzdHJ1Y3RfbmFtZSA8PCAiKSBTdHJpbmcoKSBzdHJpbmcgeyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBpZiBwID09IG5pbCB7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgICAgcmV0dXJuIFwiPG5pbD5cIiIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiBmbXQuU3ByaW50ZihcIiIgPDwgZXNjYXBlX3N0cmluZyh0c3RydWN0X25hbWUpIDw8ICIoJSt2KVwiLCAqcCkiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIGlmKGlzX2V4Y2VwdGlvbikgewotICAgICAgICBvdXQgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICJmdW5jIChwICoiIDw8IHRzdHJ1Y3RfbmFtZSA8PCAiKSBFcnJvcigpIHN0cmluZyB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gcC5TdHJpbmcoKSIgPDwgZW5kbCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIHRoZSBJc1NldCBoZWxwZXIgbWV0aG9kcyBmb3IgYSBzdHJ1Y3QKLSAqLwotdm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaXNzZXRfaGVscGVycyhvZnN0cmVhbSYgb3V0LAotICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgY29uc3Qgc3RyaW5nJiB0c3RydWN0X25hbWUsCi0gICAgICAgIGJvb2wgaXNfcmVzdWx0KQotewotICAgICh2b2lkKSBpc19yZXN1bHQ7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gICAgY29uc3Qgc3RyaW5nIGVzY2FwZWRfdHN0cnVjdF9uYW1lKGVzY2FwZV9zdHJpbmcodHN0cnVjdC0+Z2V0X25hbWUoKSkpOwotCi0gICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgICAgY29uc3Qgc3RyaW5nIGZpZWxkX25hbWUocHVibGljaXplKHZhcmlhYmxlX25hbWVfdG9fZ29fbmFtZShlc2NhcGVfc3RyaW5nKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkpKSk7Ci0gICAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMIHx8IGlzX3BvaW50ZXJfZmllbGQoKmZfaXRlcikpIHsKLSAgICAgICAgICAgIG91dCA8PAotICAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICJmdW5jIChwICoiIDw8IHRzdHJ1Y3RfbmFtZSA8PCAiKSBJc1NldCIgPDwgZmllbGRfbmFtZSA8PCAiKCkgYm9vbCB7IiA8PCBlbmRsOwotICAgICAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgIAl0X3R5cGUqIHR0eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfdHJ1ZV90eXBlKCk7Ci0gICAgICAgIAlib29sIGlzX2J5dGVzbGljZSA9IHR0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiAoKHRfYmFzZV90eXBlKil0dHlwZSktPmlzX2JpbmFyeSgpIDsKLSAgICAgICAgCWJvb2wgY29tcGFyZV90b19uaWxfb25seSA9IHR0eXBlLT5pc19zZXQoKQotICAgICAgICAJCQl8fCB0dHlwZS0+aXNfbGlzdCgpCi0gICAgICAgIAkJCXx8IHR0eXBlLT5pc19tYXAoKQotICAgICAgICAJCQl8fCAoaXNfYnl0ZXNsaWNlICYmICEoKmZfaXRlciktPmdldF92YWx1ZSgpKTsKLSAgICAgICAgICAgIGlmIChpc19wb2ludGVyX2ZpZWxkKCpmX2l0ZXIpIHx8IGNvbXBhcmVfdG9fbmlsX29ubHkpIHsKLQkJCQlvdXQgPDwKLQkJCQkJaW5kZW50KCkgPDwgInJldHVybiBwLiIgPDwgZmllbGRfbmFtZSA8PCAiICE9IG5pbCIgPDwgZW5kbDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc3RyaW5nIGRlZl92YXJfbmFtZSA9IHRzdHJ1Y3RfbmFtZSArICJfIiArIGZpZWxkX25hbWUgKyAiX0RFRkFVTFQiOwotICAgICAgICAgICAgICAgIGlmIChpc19ieXRlc2xpY2UpIHsKLSAgICAJCQkJb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gIWJ5dGVzLkVxdWFsKHAuIiA8PCBmaWVsZF9uYW1lIDw8ICIsICI8PGRlZl92YXJfbmFtZSAgPDwgIikiIDw8IGVuZGw7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAJCQkJb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gcC4iIDw8IGZpZWxkX25hbWUgPDwgIiAhPSAiPDxkZWZfdmFyX25hbWUgIDw8IGVuZGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgICAgICAgIG91dCA8PAotICAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIHRoZSByZWFkIG1ldGhvZCBmb3IgYSBzdHJ1Y3QKLSAqLwotdm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ29fc3RydWN0X3JlYWRlcihvZnN0cmVhbSYgb3V0LAotICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgY29uc3Qgc3RyaW5nJiB0c3RydWN0X25hbWUsCi0gICAgICAgIGJvb2wgaXNfcmVzdWx0KQotewotCSh2b2lkKSBpc19yZXN1bHQ7Ci0JY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gICAgc3RyaW5nIGVzY2FwZWRfdHN0cnVjdF9uYW1lKGVzY2FwZV9zdHJpbmcodHN0cnVjdC0+Z2V0X25hbWUoKSkpOwotICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiZnVuYyAocCAqIiA8PCB0c3RydWN0X25hbWUgPDwgIikgUmVhZChpcHJvdCB0aHJpZnQuVFByb3RvY29sKSBlcnJvciB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaWYgXywgZXJyIDo9IGlwcm90LlJlYWRTdHJ1Y3RCZWdpbigpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGZtdC5FcnJvcmYoXCIlVCByZWFkIGVycm9yOiAlc1wiLCBwLCBlcnIpIiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgIC8vIExvb3Agb3ZlciByZWFkaW5nIGluIGZpZWxkcwotICAgIGluZGVudChvdXQpIDw8ICJmb3IgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICAvLyBSZWFkIGJlZ2lubmluZyBmaWVsZCBtYXJrZXIKLSAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIl8sIGZpZWxkVHlwZUlkLCBmaWVsZElkLCBlcnIgOj0gaXByb3QuUmVhZEZpZWxkQmVnaW4oKSIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaWYgZXJyICE9IG5pbCB7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiBmbXQuRXJyb3JmKFwiJVQgZmllbGQgJWQgcmVhZCBlcnJvcjogJXNcIiwgcCwgZmllbGRJZCwgZXJyKSIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAvLyBDaGVjayBmb3IgZmllbGQgU1RPUCBtYXJrZXIgYW5kIGJyZWFrCi0gICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiBmaWVsZFR5cGVJZCA9PSB0aHJpZnQuU1RPUCB7IGJyZWFrOyB9IiA8PCBlbmRsOwotCi0gICAgc3RyaW5nIHRocmlmdEZpZWxkVHlwZUlkOwotICAgIC8vIEdlbmVyYXRlIGRlc2VyaWFsaXphdGlvbiBjb2RlIGZvciBrbm93biBjYXNlcwotICAgIGludDMyX3QgZmllbGRfaWQgPSAtMTsKLQotICAgIC8vIFN3aXRjaCBzdGF0ZW1lbnQgb24gdGhlIGZpZWxkIHdlIGFyZSByZWFkaW5nLCBmYWxzZSBpZiBubyBmaWVsZHMgcHJlc2VudAotICAgIGJvb2wgaGF2ZV9zd2l0Y2ggPSAhZmllbGRzLmVtcHR5KCk7Ci0gICAgaWYoIGhhdmVfc3dpdGNoKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggZmllbGRJZCB7IiA8PCBlbmRsOwotICAgIH0KLSAgICAKLSAgICAvLyBBbGwgdGhlIGZpZWxkcyB3ZSBrbm93Ci0gICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgICAgZmllbGRfaWQgPSAoKmZfaXRlciktPmdldF9rZXkoKTsKLQotICAgICAgICAvLyBpZiBuZWdhdGl2ZSBpZCwgZW5zdXJlIHdlIGdlbmVyYXRlIGEgdmFsaWQgbWV0aG9kIG5hbWUKLSAgICAgICAgc3RyaW5nIGZpZWxkX21ldGhvZF9wcmVmaXgoIlJlYWRGaWVsZCIpOwotCi0gICAgICAgIGlmIChmaWVsZF9pZCA8IDApIHsKLSAgICAgICAgICAgIGZpZWxkX21ldGhvZF9wcmVmaXggKz0gIl8iOwotICAgICAgICAgICAgZmllbGRfaWQgKj0gLTE7Ci0gICAgICAgIH0KLQotICAgICAgICBvdXQgPDwgCi0gICAgICAgICAgICBpbmRlbnQoKSA8PCJjYXNlICIgPDwgZmllbGRfaWQgPDwgIjoiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF91cCgpOwotICAgICAgICB0aHJpZnRGaWVsZFR5cGVJZCA9IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpOwotCi0gICAgICAgIGlmICh0aHJpZnRGaWVsZFR5cGVJZCA9PSAidGhyaWZ0LkJJTkFSWSIpIHsKLSAgICAgICAgICAgIHRocmlmdEZpZWxkVHlwZUlkID0gInRocmlmdC5TVFJJTkciOwotICAgICAgICB9Ci0KLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgZXJyIDo9IHAuIiA8PCBmaWVsZF9tZXRob2RfcHJlZml4IDw8IGZpZWxkX2lkIDw8ICIoaXByb3QpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiBlcnIiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgIH0KLQotICAgIC8vIEJlZ2luIHN3aXRjaCBkZWZhdWx0IGNhc2UgCi0gICAgaWYoIGhhdmVfc3dpdGNoKSB7Ci0gICAgICAgIG91dCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOwotICAgICAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgfQotICAgICAgICAgICAgCi0gICAgLy8gU2tpcCB1bmtub3duIGZpZWxkcyBpbiBlaXRoZXIgY2FzZQotICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaWYgZXJyIDo9IGlwcm90LlNraXAoZmllbGRUeXBlSWQpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGVyciIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLQotICAgIC8vIEVuZCBzd2l0Y2ggZGVmYXVsdCBjYXNlCi0gICAgaWYoIGhhdmVfc3dpdGNoKSB7Ci0gICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICAgIG91dCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgLy8gUmVhZCBmaWVsZCBlbmQgbWFya2VyCi0gICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiBlcnIgOj0gaXByb3QuUmVhZEZpZWxkRW5kKCk7IGVyciAhPSBuaWwgeyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gZXJyIiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiBlcnIgOj0gaXByb3QuUmVhZFN0cnVjdEVuZCgpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGZtdC5FcnJvcmYoXCIlVCByZWFkIHN0cnVjdCBlbmQgZXJyb3I6ICVzXCIsIHAsIGVycikiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInJldHVybiBuaWwiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICAgIHN0cmluZyBmaWVsZF90eXBlX25hbWUocHVibGljaXplKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X25hbWUoKSkpOwotICAgICAgICBzdHJpbmcgZmllbGRfbmFtZShwdWJsaWNpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSk7Ci0gICAgICAgIHN0cmluZyBmaWVsZF9tZXRob2RfcHJlZml4KCJSZWFkRmllbGQiKTsKLSAgICAgICAgaW50MzJfdCBmaWVsZF9pZCA9ICgqZl9pdGVyKS0+Z2V0X2tleSgpOwotCi0gICAgICAgIGlmIChmaWVsZF9pZCA8IDApIHsKLSAgICAgICAgICAgIGZpZWxkX21ldGhvZF9wcmVmaXggKz0gIl8iOwotICAgICAgICAgICAgZmllbGRfaWQgKj0gLTE7Ci0gICAgICAgIH0KLQotICAgICAgICBvdXQgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICJmdW5jIChwICoiIDw8IHRzdHJ1Y3RfbmFtZSA8PCAiKSAgIiA8PCBmaWVsZF9tZXRob2RfcHJlZml4IDw8IGZpZWxkX2lkIDw8ICIoaXByb3QgdGhyaWZ0LlRQcm90b2NvbCkgZXJyb3IgeyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgZmFsc2UsICJwLiIpOwotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICBvdXQgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiBuaWwiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgfQotfQotCi12b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nb19zdHJ1Y3Rfd3JpdGVyKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICBjb25zdCBzdHJpbmcmIHRzdHJ1Y3RfbmFtZSwKLSAgICAgICAgYm9vbCBpc19yZXN1bHQpCi17Ci0JKHZvaWQpIGlzX3Jlc3VsdDsKLQlzdHJpbmcgbmFtZSh0c3RydWN0LT5nZXRfbmFtZSgpKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgICAgICAgICAiZnVuYyAocCAqIiA8PCB0c3RydWN0X25hbWUgPDwgIikgV3JpdGUob3Byb3QgdGhyaWZ0LlRQcm90b2NvbCkgZXJyb3IgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlmIGVyciA6PSBvcHJvdC5Xcml0ZVN0cnVjdEJlZ2luKFwiIiA8PCBuYW1lIDw8ICJcIik7IGVyciAhPSBuaWwgeyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gZm10LkVycm9yZihcIiVUIHdyaXRlIHN0cnVjdCBiZWdpbiBlcnJvcjogJXNcIiwgcCwgZXJyKSB9IiA8PCBlbmRsOwotCi0gICAgc3RyaW5nIGZpZWxkX25hbWU7Ci0gICAgc3RyaW5nIGVzY2FwZV9maWVsZF9uYW1lOwotICAgIC8vdF9jb25zdF92YWx1ZSogZmllbGRfZGVmYXVsdF92YWx1ZTsKLSAgICB0X2ZpZWxkOjplX3JlcSBmaWVsZF9yZXF1aXJlZDsKLSAgICBpbnQzMl90IGZpZWxkX2lkID0gLTE7Ci0KLSAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgICBzdHJpbmcgZmllbGRfbWV0aG9kX3ByZWZpeCgid3JpdGVGaWVsZCIpOwotICAgICAgICBmaWVsZF9uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICAgICBlc2NhcGVfZmllbGRfbmFtZSA9IGVzY2FwZV9zdHJpbmcoZmllbGRfbmFtZSk7Ci0gICAgICAgIGZpZWxkX2lkID0gKCpmX2l0ZXIpLT5nZXRfa2V5KCk7Ci0KLSAgICAgICAgaWYgKGZpZWxkX2lkIDwgMCkgewotICAgICAgICAgICAgZmllbGRfbWV0aG9kX3ByZWZpeCArPSAiXyI7Ci0gICAgICAgICAgICBmaWVsZF9pZCAqPSAtMTsKLSAgICAgICAgfQotCi0gICAgICAgIG91dCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgImlmIGVyciA6PSBwLiIgPDwgZmllbGRfbWV0aG9kX3ByZWZpeCA8PCBmaWVsZF9pZCA8PCAiKG9wcm90KTsgZXJyICE9IG5pbCB7IHJldHVybiBlcnIgfSIgPDwgZW5kbDsKLQotICAgIH0KLQotICAgIC8vIFdyaXRlIHRoZSBzdHJ1Y3QgbWFwCi0gICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiBlcnIgOj0gb3Byb3QuV3JpdGVGaWVsZFN0b3AoKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiBmbXQuRXJyb3JmKFwid3JpdGUgZmllbGQgc3RvcCBlcnJvcjogJXNcIiwgZXJyKSB9IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiBlcnIgOj0gb3Byb3QuV3JpdGVTdHJ1Y3RFbmQoKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiBmbXQuRXJyb3JmKFwid3JpdGUgc3RydWN0IHN0b3AgZXJyb3I6ICVzXCIsIGVycikgfSIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAicmV0dXJuIG5pbCIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgICAgc3RyaW5nIGZpZWxkX21ldGhvZF9wcmVmaXgoIndyaXRlRmllbGQiKTsKLSAgICAgICAgZmllbGRfaWQgPSAoKmZfaXRlciktPmdldF9rZXkoKTsKLSAgICAgICAgZmllbGRfbmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICAgICAgZXNjYXBlX2ZpZWxkX25hbWUgPSBlc2NhcGVfc3RyaW5nKGZpZWxkX25hbWUpOwotICAgICAgICAvL2ZpZWxkX2RlZmF1bHRfdmFsdWUgPSAoKmZfaXRlciktPmdldF92YWx1ZSgpOwotICAgICAgICBmaWVsZF9yZXF1aXJlZCA9ICgqZl9pdGVyKS0+Z2V0X3JlcSgpOwotCi0gICAgICAgIGlmIChmaWVsZF9pZCA8IDApIHsKLSAgICAgICAgICAgIGZpZWxkX21ldGhvZF9wcmVmaXggKz0gIl8iOwotICAgICAgICAgICAgZmllbGRfaWQgKj0gLTE7Ci0gICAgICAgIH0KLQotICAgICAgICBvdXQgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICJmdW5jIChwICoiIDw8IHRzdHJ1Y3RfbmFtZSA8PCAiKSAiIDw8IGZpZWxkX21ldGhvZF9wcmVmaXggPDwgZmllbGRfaWQgPDwgIihvcHJvdCB0aHJpZnQuVFByb3RvY29sKSAoZXJyIGVycm9yKSB7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfdXAoKTsKLQotICAgICAgICBpZiAoZmllbGRfcmVxdWlyZWQgPT0gdF9maWVsZDo6VF9PUFRJT05BTCkgewotICAgICAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgImlmIHAuSXNTZXQiIDw8IHB1YmxpY2l6ZSh2YXJpYWJsZV9uYW1lX3RvX2dvX25hbWUoZmllbGRfbmFtZSkpIDw8ICIoKSB7IiA8PCBlbmRsOwotICAgICAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBvdXQgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICJpZiBlcnIgOj0gb3Byb3QuV3JpdGVGaWVsZEJlZ2luKFwiIiA8PAotICAgICAgICAgICAgZXNjYXBlX2ZpZWxkX25hbWUgPDwgIlwiLCAiIDw8Ci0gICAgICAgICAgICB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICAgICAgICBmaWVsZF9pZCA8PCAiKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gZm10LkVycm9yZihcIiVUIHdyaXRlIGZpZWxkIGJlZ2luIGVycm9yICIgPDwgZmllbGRfaWQgPDwgIjoiIDw8IGVzY2FwZV9maWVsZF9uYW1lIDw8ICI6ICVzXCIsIHAsIGVycik7IH0iIDw8IGVuZGw7Ci0KLSAgICAgICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKLSAgICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInAuIik7Ci0KLQotICAgICAgICAvLyBXcml0ZSBmaWVsZCBjbG9zZXIKLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgZXJyIDo9IG9wcm90LldyaXRlRmllbGRFbmQoKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gZm10LkVycm9yZihcIiVUIHdyaXRlIGZpZWxkIGVuZCBlcnJvciAiIDw8IGZpZWxkX2lkIDw8ICI6IiA8PCBlc2NhcGVfZmllbGRfbmFtZSA8PCAiOiAlc1wiLCBwLCBlcnIpOyB9IiA8PCBlbmRsOwotCi0gICAgICAgIGlmIChmaWVsZF9yZXF1aXJlZCA9PSB0X2ZpZWxkOjpUX09QVElPTkFMKSB7Ci0gICAgICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICAgIH0KLQotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICBvdXQgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiBlcnIiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHRocmlmdCBzZXJ2aWNlLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkKLXsKLQlzdHJpbmcgdGVzdF9zdWZmaXgoIl90ZXN0Iik7Ci0Jc3RyaW5nIGZpbGVuYW1lID0gbG93ZXJjYXNlKHNlcnZpY2VfbmFtZV8pOwotCXN0cmluZyBmX3NlcnZpY2VfbmFtZTsKLQkKLQlzaXplX3QgZm5hbWVfbGVuID0gZmlsZW5hbWUubGVuZ3RoKCk7Ci0Jc2l6ZV90IHN1ZmZpeF9sZW4gPSB0ZXN0X3N1ZmZpeC5sZW5ndGgoKTsKLQkKLQlpZiAoKGZuYW1lX2xlbiA+PSBzdWZmaXhfbGVuKSAmJiAoZmlsZW5hbWUuY29tcGFyZShmbmFtZV9sZW4tc3VmZml4X2xlbiwgc3VmZml4X2xlbiwgdGVzdF9zdWZmaXgpID09IDApKSB7Ci0JCWZfc2VydmljZV9uYW1lID0gcGFja2FnZV9kaXJfICsgIi8iICsgZmlsZW5hbWUgKyAiXy5nbyI7Ci0JfSBlbHNlIHsKLQkJZl9zZXJ2aWNlX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyBmaWxlbmFtZSArICIuZ28iOwotCX0KLSAgICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgICAgICAgZ29fYXV0b2dlbl9jb21tZW50KCkgPDwKLSAgICAgICAgICAgICAgIGdvX3BhY2thZ2UoKSA8PAotICAgICAgICAgICAgICAgcmVuZGVyX2luY2x1ZGVzKCk7Ci0KLSAgICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSk7Ci0gICAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UpOwotICAgIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRzZXJ2aWNlKTsKLSAgICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOwotICAgIGdlbmVyYXRlX3NlcnZpY2VfcmVtb3RlKHRzZXJ2aWNlKTsKLSAgICAvLyBDbG9zZSBzZXJ2aWNlIGZpbGUKLSAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0gICAgZl9zZXJ2aWNlXy5jbG9zZSgpOwotICAgIGZvcm1hdF9nb19vdXRwdXQoZl9zZXJ2aWNlX25hbWUpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBoZWxwZXIgZnVuY3Rpb25zIGZvciBhIHNlcnZpY2UuCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCi0gKi8KLXZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKQotewotICAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgICAgICAgIi8vIEhFTFBFUiBGVU5DVElPTlMgQU5EIFNUUlVDVFVSRVMiIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLSAgICAgICAgZ2VuZXJhdGVfZ29fc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgdHMsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgICAgIGdlbmVyYXRlX2dvX2Z1bmN0aW9uX2hlbHBlcnMoKmZfaXRlcik7Ci0gICAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBhbmQgaGVscGVycyBmb3IgYSBmdW5jdGlvbi4KLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbgotICovCi12b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nb19mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikKLXsKLSAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICAgICAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOwotICAgICAgICB0X2ZpZWxkIHN1Y2Nlc3ModGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOwotICAgICAgICBzdWNjZXNzLnNldF9yZXEodF9maWVsZDo6VF9PUFRJT05BTCk7Ci0KLSAgICAgICAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7Ci0gICAgICAgIH0KLQotICAgICAgICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgICAgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gICAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICAgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgICAJdF9maWVsZCogZiA9ICpmX2l0ZXI7Ci0gICAgICAgIAlmLT5zZXRfcmVxKHRfZmllbGQ6OlRfT1BUSU9OQUwpOwotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChmKTsKLSAgICAgICAgfQotCi0gICAgICAgIGdlbmVyYXRlX2dvX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sICZyZXN1bHQsIGZhbHNlLCB0cnVlKTsKLSAgICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBpbnRlcmZhY2UgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKLSAqLwotdm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkKLXsKLSAgICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICAgIHN0cmluZyBleHRlbmRzX2lmID0gIiI7Ci0gICAgc3RyaW5nIHNlcnZpY2VOYW1lKHB1YmxpY2l6ZSh0c2VydmljZS0+Z2V0X25hbWUoKSkpOwotICAgIHN0cmluZyBpbnRlcmZhY2VOYW1lID0gc2VydmljZU5hbWU7Ci0KLSAgICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgICAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICAgICAgc2l6ZV90IGluZGV4ID0gZXh0ZW5kcy5yZmluZCgiLiIpOwotCi0gICAgICAgIGlmIChpbmRleCAhPSBzdHJpbmc6Om5wb3MpIHsKLSAgICAgICAgICAgIGV4dGVuZHNfaWYgPSAiXG4iICsgaW5kZW50KCkgKyAiICAiICsgZXh0ZW5kcy5zdWJzdHIoMCwgaW5kZXggKyAxKSArIHB1YmxpY2l6ZShleHRlbmRzLnN1YnN0cihpbmRleCArIDEpKSArICJcbiI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBleHRlbmRzX2lmID0gIlxuIiArIGluZGVudCgpICsgcHVibGljaXplKGV4dGVuZHMpICsgIlxuIjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICJ0eXBlICIgPDwgaW50ZXJmYWNlTmFtZSA8PCAiIGludGVyZmFjZSB7IiA8PCBleHRlbmRzX2lmOwotICAgIGluZGVudF91cCgpOwotICAgIGdlbmVyYXRlX2dvX2RvY3N0cmluZyhmX3NlcnZpY2VfLCB0c2VydmljZSk7Ci0gICAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotCi0gICAgaWYgKCFmdW5jdGlvbnMuZW1wdHkoKSkgewotICAgICAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0gICAgICAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLQotICAgICAgICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgICAgICAgZ2VuZXJhdGVfZ29fZG9jc3RyaW5nKGZfc2VydmljZV8sICgqZl9pdGVyKSk7Ci0gICAgICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgIGluZGVudCgpIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZV9pZigqZl9pdGVyLCAiIiwgdHJ1ZSkgPDwgZW5kbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGNsaWVudCBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCi0gKi8KLXZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpCi17Ci0gICAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgICBzdHJpbmcgZXh0ZW5kc19maWVsZCA9ICIiOwotICAgIHN0cmluZyBleHRlbmRzX2NsaWVudCA9ICIiOwotICAgIHN0cmluZyBleHRlbmRzX2NsaWVudF9uZXcgPSAiIjsKLSAgICBzdHJpbmcgc2VydmljZU5hbWUocHVibGljaXplKHRzZXJ2aWNlLT5nZXRfbmFtZSgpKSk7Ci0KLSAgICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgICAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICAgICAgc2l6ZV90IGluZGV4ID0gZXh0ZW5kcy5yZmluZCgiLiIpOwotCi0gICAgICAgIGlmIChpbmRleCAhPSBzdHJpbmc6Om5wb3MpIHsKLSAgICAgICAgICAgIGV4dGVuZHNfY2xpZW50ID0gZXh0ZW5kcy5zdWJzdHIoMCwgaW5kZXggKyAxKSArIHB1YmxpY2l6ZShleHRlbmRzLnN1YnN0cihpbmRleCArIDEpKSArICJDbGllbnQiOwotICAgICAgICAgICAgZXh0ZW5kc19jbGllbnRfbmV3ID0gZXh0ZW5kcy5zdWJzdHIoMCwgaW5kZXggKyAxKSArICJOZXciICsgcHVibGljaXplKGV4dGVuZHMuc3Vic3RyKGluZGV4ICsgMSkpICsgIkNsaWVudCI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBleHRlbmRzX2NsaWVudCA9IHB1YmxpY2l6ZShleHRlbmRzKSArICJDbGllbnQiOwotICAgICAgICAgICAgZXh0ZW5kc19jbGllbnRfbmV3ID0gIk5ldyIgKyBleHRlbmRzX2NsaWVudDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGV4dGVuZHNfZmllbGQgPSBleHRlbmRzX2NsaWVudC5zdWJzdHIoZXh0ZW5kc19jbGllbnQuZmluZCgiLiIpICsgMSk7Ci0KLSAgICBnZW5lcmF0ZV9nb19kb2NzdHJpbmcoZl9zZXJ2aWNlXywgdHNlcnZpY2UpOwotICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICJ0eXBlICIgPDwgc2VydmljZU5hbWUgPDwgIkNsaWVudCBzdHJ1Y3QgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIGlmICghZXh0ZW5kc19jbGllbnQuZW1wdHkoKSkgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIioiIDw8IGV4dGVuZHNfY2xpZW50IDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICJUcmFuc3BvcnQgdGhyaWZ0LlRUcmFuc3BvcnQiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiUHJvdG9jb2xGYWN0b3J5IHRocmlmdC5UUHJvdG9jb2xGYWN0b3J5IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIklucHV0UHJvdG9jb2wgdGhyaWZ0LlRQcm90b2NvbCIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICJPdXRwdXRQcm90b2NvbCB0aHJpZnQuVFByb3RvY29sIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIlNlcUlkIGludDMyIiA8PCBlbmRsIC8qPDwKLSAgICAgIGluZGVudCgpIDw8ICJyZXFzIG1hcFtpbnQzMl1EZWZlcnJlZCIgPDwgZW5kbCovOwotICAgIH0KLQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgICAvLyBDb25zdHJ1Y3RvciBmdW5jdGlvbgotICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICJmdW5jIE5ldyIgPDwgc2VydmljZU5hbWUgPDwgIkNsaWVudEZhY3RvcnkodCB0aHJpZnQuVFRyYW5zcG9ydCwgZiB0aHJpZnQuVFByb3RvY29sRmFjdG9yeSkgKiIgPDwgc2VydmljZU5hbWUgPDwgIkNsaWVudCB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICJyZXR1cm4gJiIgPDwgc2VydmljZU5hbWUgPDwgIkNsaWVudCI7Ci0KLSAgICBpZiAoIWV4dGVuZHMuZW1wdHkoKSkgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgICAgICAgICAgInsiIDw8IGV4dGVuZHNfZmllbGQgPDwgIjogIiA8PCBleHRlbmRzX2NsaWVudF9uZXcgPDwgIkZhY3RvcnkodCwgZil9IjsKLSAgICB9IGVsc2UgewotICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCAie1RyYW5zcG9ydDogdCwiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiUHJvdG9jb2xGYWN0b3J5OiBmLCIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICJJbnB1dFByb3RvY29sOiBmLkdldFByb3RvY29sKHQpLCIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICJPdXRwdXRQcm90b2NvbDogZi5HZXRQcm90b2NvbCh0KSwiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiU2VxSWQ6IDAsIiA8PCBlbmRsIC8qPDwKLSAgICAgIGluZGVudCgpIDw8ICJSZXFzOiBtYWtlKG1hcFtpbnQzMl1EZWZlcnJlZCkiIDw8IGVuZGwqLzsKLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0KLQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgICAvLyBDb25zdHJ1Y3RvciBmdW5jdGlvbgotICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICJmdW5jIE5ldyIgPDwgc2VydmljZU5hbWUgPDwgIkNsaWVudFByb3RvY29sKHQgdGhyaWZ0LlRUcmFuc3BvcnQsIGlwcm90IHRocmlmdC5UUHJvdG9jb2wsIG9wcm90IHRocmlmdC5UUHJvdG9jb2wpICoiIDw8IHNlcnZpY2VOYW1lIDw8ICJDbGllbnQgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAicmV0dXJuICYiIDw8IHNlcnZpY2VOYW1lIDw8ICJDbGllbnQiOwotCi0gICAgaWYgKCFleHRlbmRzLmVtcHR5KCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgICAgICAgICAgICJ7IiA8PCBleHRlbmRzX2ZpZWxkIDw8ICI6ICIgPDwgZXh0ZW5kc19jbGllbnRfbmV3IDw8ICJQcm90b2NvbCh0LCBpcHJvdCwgb3Byb3QpfSIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCAie1RyYW5zcG9ydDogdCwiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiUHJvdG9jb2xGYWN0b3J5OiBuaWwsIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIklucHV0UHJvdG9jb2w6IGlwcm90LCIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICJPdXRwdXRQcm90b2NvbDogb3Byb3QsIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIlNlcUlkOiAwLCIgPDwgZW5kbCAvKjw8Ci0gICAgICBpbmRlbnQoKSA8PCAiUmVxczogbWFrZShtYXBbaW50MzJdaW50ZXJmYWNle30pIiA8PCBlbmRsKi87Ci0gICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgLy8gR2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKLSAgICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gICAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gICAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gICAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOwotICAgICAgICBzdHJpbmcgZnVubmFtZSA9IHB1YmxpY2l6ZSgoKmZfaXRlciktPmdldF9uYW1lKCkpOwotICAgICAgICAvLyBPcGVuIGZ1bmN0aW9uCi0gICAgICAgIGdlbmVyYXRlX2dvX2RvY3N0cmluZyhmX3NlcnZpY2VfLCAoKmZfaXRlcikpOwotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgImZ1bmMgKHAgKiIgPDwgc2VydmljZU5hbWUgPDwgIkNsaWVudCkgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmVfaWYoKmZfaXRlciwgIiIsIHRydWUpIDw8ICIgeyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgIC8qCi0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAicC5TZXFJZCArPSAxIiA8PCBlbmRsOwotICAgICAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiZCA6PSBkZWZlci5EZWZlcnJlZCgpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAicC5SZXFzW3AuU2VxSWRdID0gZCIgPDwgZW5kbDsKLSAgICAgICAgfQotICAgICAgICAqLwotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgImlmIGVyciA9IHAuc2VuZCIgPDwgZnVubmFtZSA8PCAiKCI7Ci0gICAgICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotCi0gICAgICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICAgICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZfc2VydmljZV8gPDwgdmFyaWFibGVfbmFtZV90b19nb19uYW1lKCgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZfc2VydmljZV8gPDwgIik7IGVyciAhPSBuaWwgeyByZXR1cm4gfSIgPDwgZW5kbDsKLQotICAgICAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgInJldHVybiBwLnJlY3YiIDw8IGZ1bm5hbWUgPDwgIigpIiA8PCBlbmRsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAicmV0dXJuIiA8PCBlbmRsOwotICAgICAgICB9Ci0KLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiZnVuYyAocCAqIiA8PCBzZXJ2aWNlTmFtZSA8PCAiQ2xpZW50KSBzZW5kIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgIihlcnIgZXJyb3IpIHsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF91cCgpOwotICAgICAgICBzdGQ6OnN0cmluZyBhcmdzbmFtZSA9IHB1YmxpY2l6ZSgoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX2FyZ3MiLHRydWUpOwotICAgICAgICAvLyBTZXJpYWxpemUgdGhlIHJlcXVlc3QgaGVhZGVyCi0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAib3Byb3QgOj0gcC5PdXRwdXRQcm90b2NvbCIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICJpZiBvcHJvdCA9PSBuaWwgeyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIG9wcm90ID0gcC5Qcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wocC5UcmFuc3BvcnQpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgcC5PdXRwdXRQcm90b2NvbCA9IG9wcm90IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAicC5TZXFJZCsrIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgImlmIGVyciA9IG9wcm90LldyaXRlTWVzc2FnZUJlZ2luKFwiIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIsICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAoKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSA/ICJ0aHJpZnQuT05FV0FZIiA6ICJ0aHJpZnQuQ0FMTCIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiwgcC5TZXFJZCk7IGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAicmV0dXJuIiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiYXJncyA6PSAiIDw8IGFyZ3NuYW1lIDw8ICJ7IiA8PCBlbmRsOwotCi0gICAgICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgIGluZGVudCgpIDw8IHB1YmxpY2l6ZSh2YXJpYWJsZV9uYW1lX3RvX2dvX25hbWUoKCpmbGRfaXRlciktPmdldF9uYW1lKCkpKSA8PCAiIDogIiA8PCB2YXJpYWJsZV9uYW1lX3RvX2dvX25hbWUoKCpmbGRfaXRlciktPmdldF9uYW1lKCkpIDw8ICIsIjw8IGVuZGw7Ci0gICAgICAgIH0KLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotCi0gICAgICAgIC8vIFdyaXRlIHRvIHRoZSBzdHJlYW0KLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICJpZiBlcnIgPSBhcmdzLldyaXRlKG9wcm90KTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICJyZXR1cm4iIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICJpZiBlcnIgPSBvcHJvdC5Xcml0ZU1lc3NhZ2VFbmQoKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICJyZXR1cm4iIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICJyZXR1cm4gb3Byb3QuRmx1c2goKSIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICAgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICAgICAgICBzdGQ6OnN0cmluZyByZXN1bHRuYW1lID0gcHVibGljaXplKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iix0cnVlKTsKLSAgICAgICAgICAgIC8vIE9wZW4gZnVuY3Rpb24KLSAgICAgICAgICAgIGZfc2VydmljZV8gPDwgZW5kbCA8PAotICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiZnVuYyAocCAqIiA8PCBzZXJ2aWNlTmFtZSA8PCAiQ2xpZW50KSByZWN2IiA8PCBwdWJsaWNpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PAotICAgICAgICAgICAgICAgICAgICAgICAiKCkgKCI7Ci0KLSAgICAgICAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUgIiA8PCB0eXBlX3RvX2dvX3R5cGUoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpKSA8PCAiLCAiOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgICJlcnIgZXJyb3IpIHsiIDw8IGVuZGw7Ci0gICAgICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgICAgICAgIC8vIFRPRE8obWNzbGVlKTogVmFsaWRhdGUgbWVzc2FnZSByZXBseSBoZXJlLCBzZXEgaWRzIGV0Yy4KLSAgICAgICAgICAgIHN0cmluZyBlcnJvcih0bXAoImVycm9yIikpOwotICAgICAgICAgICAgc3RyaW5nIGVycm9yMih0bXAoImVycm9yIikpOwotICAgICAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiaXByb3QgOj0gcC5JbnB1dFByb3RvY29sIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICJpZiBpcHJvdCA9PSBuaWwgeyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICBpcHJvdCA9IHAuUHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHAuVHJhbnNwb3J0KSIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICBwLklucHV0UHJvdG9jb2wgPSBpcHJvdCIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiXywgbVR5cGVJZCwgc2VxSWQsIGVyciA6PSBpcHJvdC5SZWFkTWVzc2FnZUJlZ2luKCkiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgImlmIGVyciAhPSBuaWwgeyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4iIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgImlmIG1UeXBlSWQgPT0gdGhyaWZ0LkVYQ0VQVElPTiB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgICIgPDwgZXJyb3IgPDwgIiA6PSB0aHJpZnQuTmV3VEFwcGxpY2F0aW9uRXhjZXB0aW9uKHRocmlmdC5VTktOT1dOX0FQUExJQ0FUSU9OX0VYQ0VQVElPTiwgXCJVbmtub3duIEV4Y2VwdGlvblwiKSIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICB2YXIgIiA8PCBlcnJvcjIgPDwgIiBlcnJvciIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICAiIDw8IGVycm9yMiA8PCAiLCBlcnIgPSAiIDw8IGVycm9yIDw8ICIuUmVhZChpcHJvdCkiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgaWYgZXJyICE9IG5pbCB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgICAgcmV0dXJuIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgaWYgZXJyID0gaXByb3QuUmVhZE1lc3NhZ2VFbmQoKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgICAgcmV0dXJuIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgZXJyID0gIiA8PCBlcnJvcjIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4iIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgImlmIHAuU2VxSWQgIT0gc2VxSWQgeyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICBlcnIgPSB0aHJpZnQuTmV3VEFwcGxpY2F0aW9uRXhjZXB0aW9uKHRocmlmdC5CQURfU0VRVUVOQ0VfSUQsIFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiBmYWlsZWQ6IG91dCBvZiBzZXF1ZW5jZSByZXNwb25zZVwiKSIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4iIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgInJlc3VsdCA6PSAiIDw8IHJlc3VsdG5hbWUgPDwgInt9IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICJpZiBlcnIgPSByZXN1bHQuUmVhZChpcHJvdCk7IGVyciAhPSBuaWwgeyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4iIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgImlmIGVyciA9IGlwcm90LlJlYWRNZXNzYWdlRW5kKCk7IGVyciAhPSBuaWwgeyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4iIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgICAgICAgICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOwotICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgICAgICAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLQotICAgICAgICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyB2YXJuYW1lID0gdmFyaWFibGVfbmFtZV90b19nb19uYW1lKCgqeF9pdGVyKS0+Z2V0X25hbWUoKSk7Ci0gICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgcHVibmFtZSA9IHB1YmxpY2l6ZSh2YXJuYW1lKTsKLQotICAgICAgICAgICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICJpZiByZXN1bHQuIiA8PCBwdWJuYW1lIDw8ICIgIT0gbmlsIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICJlcnIgPSByZXN1bHQuIiA8PCBwdWJuYW1lIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICJyZXR1cm4gIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAifSI7Ci0KLSAgICAgICAgICAgICAgICBpZiAoKHhfaXRlciArIDEpICE9IHhjZXB0aW9ucy5lbmQoKSkgewotICAgICAgICAgICAgICAgICAgICBmX3NlcnZpY2VfIDw8ICIgZWxzZSAiOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIENhcmVmdWwsIG9ubHkgcmV0dXJuIF9yZXN1bHQgaWYgbm90IGEgdm9pZCBmdW5jdGlvbgotICAgICAgICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICAgICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICJ2YWx1ZSA9IHJlc3VsdC5HZXRTdWNjZXNzKCkiIDw8IGVuZGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgInJldHVybiIgPDwgZW5kbDsKLSAgICAgICAgICAgIC8vIENsb3NlIGZ1bmN0aW9uCi0gICAgICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy9pbmRlbnRfZG93bigpOwotICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICAgICAgIGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgY29tbWFuZCBsaW5lIHRvb2wgZm9yIG1ha2luZyByZW1vdGUgcmVxdWVzdHMKLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSByZW1vdGUgZm9yLgotICovCi12b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3JlbW90ZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKQotewotICAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgICB0X3NlcnZpY2UqIHBhcmVudCA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOwotCi0gICAgLy8gY29sbGVjdCBpbmhlcml0ZWQgZnVuY3Rpb25zCi0gICAgd2hpbGUgKHBhcmVudCAhPSBOVUxMKSB7Ci0gICAgICAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gcF9mdW5jdGlvbnMgPSBwYXJlbnQtPmdldF9mdW5jdGlvbnMoKTsKLSAgICAgICAgZnVuY3Rpb25zLmluc2VydChmdW5jdGlvbnMuZW5kKCksIHBfZnVuY3Rpb25zLmJlZ2luKCksIHBfZnVuY3Rpb25zLmVuZCgpKTsKLSAgICAgICAgcGFyZW50ID0gcGFyZW50LT5nZXRfZXh0ZW5kcygpOwotICAgIH0KLQotICAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgICBzdHJpbmcgZl9yZW1vdGVfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArIHVuZGVyc2NvcmUoc2VydmljZV9uYW1lXykgKyAiLXJlbW90ZS8iICsgdW5kZXJzY29yZShzZXJ2aWNlX25hbWVfKSArICItcmVtb3RlLmdvIjsKLSAgICBvZnN0cmVhbSBmX3JlbW90ZTsKLSAgICBmX3JlbW90ZS5vcGVuKGZfcmVtb3RlX25hbWUuY19zdHIoKSk7Ci0gICAgc3RyaW5nIHNlcnZpY2VfbW9kdWxlID0gZ2V0X3JlYWxfZ29fbW9kdWxlKHByb2dyYW1fKTsKLSAgICBzdHJpbmc6OnNpemVfdHlwZSBsb2M7Ci0KLSAgICB3aGlsZSAoKGxvYyA9IHNlcnZpY2VfbW9kdWxlLmZpbmQoIi4iKSkgIT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgICAgIHNlcnZpY2VfbW9kdWxlLnJlcGxhY2UobG9jLCAxLCAxLCAnLycpOwotICAgIH0KLQotICAgIGZfcmVtb3RlIDw8Ci0gICAgICAgICAgICAgZ29fYXV0b2dlbl9jb21tZW50KCkgPDwKLSAgICAgICAgICAgICBpbmRlbnQoKSA8PCAicGFja2FnZSBtYWluIiA8PCBlbmRsIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiaW1wb3J0ICgiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICAgICAgICBcImZsYWdcIiIgPDwgZW5kbCA8PAotICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgICAgICAgIFwiZm10XCIiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICAgICAgICBcIm1hdGhcIiIgPDwgZW5kbCA8PAotICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgICAgICAgIFwibmV0XCIiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICAgICAgICBcIm5ldC91cmxcIiIgPDwgZW5kbCA8PAotICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgICAgICAgIFwib3NcIiIgPDwgZW5kbCA8PAotICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgICAgICAgIFwic3RyY29udlwiIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgICAgICAgXCJzdHJpbmdzXCIiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICAgICAgICBcIiIgKyBnZW5fdGhyaWZ0X2ltcG9ydF8gKyAiXCIiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICAgICAgICBcIiIgPDwgc2VydmljZV9tb2R1bGUgPDwgIlwiIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgaW5kZW50KCkgPDwgIikiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICBpbmRlbnQoKSA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgaW5kZW50KCkgPDwgImZ1bmMgVXNhZ2UoKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgZm10LkZwcmludGxuKG9zLlN0ZGVyciwgXCJVc2FnZSBvZiBcIiwgb3MuQXJnc1swXSwgXCIgWy1oIGhvc3Q6cG9ydF0gWy11IHVybF0gWy1mW3JhbWVkXV0gZnVuY3Rpb24gW2FyZzEgW2FyZzIuLi5dXTpcIikiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICBmbGFnLlByaW50RGVmYXVsdHMoKSIgPDwgZW5kbCA8PAotICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIGZtdC5GcHJpbnRsbihvcy5TdGRlcnIsIFwiXFxuRnVuY3Rpb25zOlwiKSIgPDwgZW5kbDsKLQotICAgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICAgIGZfcmVtb3RlIDw8Ci0gICAgICAgICAgICAgICAgICIgIGZtdC5GcHJpbnRsbihvcy5TdGRlcnIsIFwiICAiIDw8ICgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+Z2V0X25hbWUoKSA8PCAiICIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoIjsKLSAgICAgICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgYXJncyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gICAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGFfaXRlcjsKLSAgICAgICAgaW50IG51bV9hcmdzID0gYXJncy5zaXplKCk7Ci0gICAgICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtX2FyZ3M7ICsraSkgewotICAgICAgICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZl9yZW1vdGUgPDwgIiwgIjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZl9yZW1vdGUgPDwKLSAgICAgICAgICAgICAgICAgICAgIGFyZ3NbaV0tPmdldF90eXBlKCktPmdldF9uYW1lKCkgPDwgIiAiIDw8IGFyZ3NbaV0tPmdldF9uYW1lKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBmX3JlbW90ZSA8PCAiKVwiKSIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBmX3JlbW90ZSA8PAotICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIGZtdC5GcHJpbnRsbihvcy5TdGRlcnIpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgb3MuRXhpdCgwKSIgPDwgZW5kbCA8PAotICAgICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgaW5kZW50KCkgPDwgZW5kbCA8PAotICAgICAgICAgICAgIGluZGVudCgpIDw8ICJmdW5jIG1haW4oKSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGZfcmVtb3RlIDw8Ci0gICAgICAgICAgICAgaW5kZW50KCkgPDwgImZsYWcuVXNhZ2UgPSBVc2FnZSIgPDwgZW5kbCA8PAotICAgICAgICAgICAgIGluZGVudCgpIDw8ICJ2YXIgaG9zdCBzdHJpbmciIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICBpbmRlbnQoKSA8PCAidmFyIHBvcnQgaW50IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgaW5kZW50KCkgPDwgInZhciBwcm90b2NvbCBzdHJpbmciIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICBpbmRlbnQoKSA8PCAidmFyIHVybFN0cmluZyBzdHJpbmciIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICBpbmRlbnQoKSA8PCAidmFyIGZyYW1lZCBib29sIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgaW5kZW50KCkgPDwgInZhciB1c2VIdHRwIGJvb2wiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICBpbmRlbnQoKSA8PCAidmFyIHBhcnNlZFVybCB1cmwuVVJMIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgaW5kZW50KCkgPDwgInZhciB0cmFucyB0aHJpZnQuVFRyYW5zcG9ydCIgPDwgZW5kbCA8PAotICAgICAgICAgICAgIGluZGVudCgpIDw8ICJfID0gc3RyY29udi5BdG9pIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgaW5kZW50KCkgPDwgIl8gPSBtYXRoLkFicyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgIGluZGVudCgpIDw8ICJmbGFnLlVzYWdlID0gVXNhZ2UiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiZmxhZy5TdHJpbmdWYXIoJmhvc3QsIFwiaFwiLCBcImxvY2FsaG9zdFwiLCBcIlNwZWNpZnkgaG9zdCBhbmQgcG9ydFwiKSIgPDwgZW5kbCA8PAotICAgICAgICAgICAgIGluZGVudCgpIDw8ICJmbGFnLkludFZhcigmcG9ydCwgXCJwXCIsIDkwOTAsIFwiU3BlY2lmeSBwb3J0XCIpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgaW5kZW50KCkgPDwgImZsYWcuU3RyaW5nVmFyKCZwcm90b2NvbCwgXCJQXCIsIFwiYmluYXJ5XCIsIFwiU3BlY2lmeSB0aGUgcHJvdG9jb2wgKGJpbmFyeSwgY29tcGFjdCwgc2ltcGxlanNvbiwganNvbilcIikiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiZmxhZy5TdHJpbmdWYXIoJnVybFN0cmluZywgXCJ1XCIsIFwiXCIsIFwiU3BlY2lmeSB0aGUgdXJsXCIpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgaW5kZW50KCkgPDwgImZsYWcuQm9vbFZhcigmZnJhbWVkLCBcImZyYW1lZFwiLCBmYWxzZSwgXCJVc2UgZnJhbWVkIHRyYW5zcG9ydFwiKSIgPDwgZW5kbCA8PAotICAgICAgICAgICAgIGluZGVudCgpIDw8ICJmbGFnLkJvb2xWYXIoJnVzZUh0dHAsIFwiaHR0cFwiLCBmYWxzZSwgXCJVc2UgaHR0cFwiKSIgPDwgZW5kbCA8PAotICAgICAgICAgICAgIGluZGVudCgpIDw8ICJmbGFnLlBhcnNlKCkiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICBpbmRlbnQoKSA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgaW5kZW50KCkgPDwgImlmIGxlbih1cmxTdHJpbmcpID4gMCB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgcGFyc2VkVXJsLCBlcnIgOj0gdXJsLlBhcnNlKHVybFN0cmluZykiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICBpZiBlcnIgIT0gbmlsIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICAgIGZtdC5GcHJpbnRsbihvcy5TdGRlcnIsIFwiRXJyb3IgcGFyc2luZyBVUkw6IFwiLCBlcnIpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgICBmbGFnLlVzYWdlKCkiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgaG9zdCA9IHBhcnNlZFVybC5Ib3N0IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgdXNlSHR0cCA9IGxlbihwYXJzZWRVcmwuU2NoZW1lKSA8PSAwIHx8IHBhcnNlZFVybC5TY2hlbWUgPT0gXCJodHRwXCIiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICBpbmRlbnQoKSA8PCAifSBlbHNlIGlmIHVzZUh0dHAgeyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIF8sIGVyciA6PSB1cmwuUGFyc2UoZm10LlNwcmludChcImh0dHA6Ly9cIiwgaG9zdCwgXCI6XCIsIHBvcnQpKSIgPDwgZW5kbCA8PAotICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIGlmIGVyciAhPSBuaWwgeyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgICAgZm10LkZwcmludGxuKG9zLlN0ZGVyciwgXCJFcnJvciBwYXJzaW5nIFVSTDogXCIsIGVycikiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICAgIGZsYWcuVXNhZ2UoKSIgPDwgZW5kbCA8PAotICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgICAgICAgIGluZGVudCgpIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiY21kIDo9IGZsYWcuQXJnKDApIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgaW5kZW50KCkgPDwgInZhciBlcnIgZXJyb3IiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgdXNlSHR0cCB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgdHJhbnMsIGVyciA9IHRocmlmdC5OZXdUSHR0cENsaWVudChwYXJzZWRVcmwuU3RyaW5nKCkpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgaW5kZW50KCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgcG9ydFN0ciA6PSBmbXQuU3ByaW50KHBvcnQpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgaWYgc3RyaW5ncy5Db250YWlucyhob3N0LCBcIjpcIikgeyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgICAgICAgICBob3N0LCBwb3J0U3RyLCBlcnIgPSBuZXQuU3BsaXRIb3N0UG9ydChob3N0KSIgPDwgZW5kbCA8PAotICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgICAgICAgICBpZiBlcnIgIT0gbmlsIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICAgICAgICAgICAgICAgICBmbXQuRnByaW50bG4ob3MuU3RkZXJyLCBcImVycm9yIHdpdGggaG9zdDpcIiwgZXJyKSIgPDwgZW5kbCA8PAotICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgICAgICAgICAgICAgICAgIG9zLkV4aXQoMSkiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICAgICAgICAgfSIgPDwgZW5kbCA8PAotICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICB0cmFucywgZXJyID0gdGhyaWZ0Lk5ld1RTb2NrZXQobmV0LkpvaW5Ib3N0UG9ydChob3N0LCBwb3J0U3RyKSkiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICBpZiBlcnIgIT0gbmlsIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICAgIGZtdC5GcHJpbnRsbihvcy5TdGRlcnIsIFwiZXJyb3IgcmVzb2x2aW5nIGFkZHJlc3M6XCIsIGVycikiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICAgIG9zLkV4aXQoMSkiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgaWYgZnJhbWVkIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICAgIHRyYW5zID0gdGhyaWZ0Lk5ld1RGcmFtZWRUcmFuc3BvcnQodHJhbnMpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgfSIgPDwgZW5kbCA8PAotICAgICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgaW5kZW50KCkgPDwgImlmIGVyciAhPSBuaWwgeyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIGZtdC5GcHJpbnRsbihvcy5TdGRlcnIsIFwiRXJyb3IgY3JlYXRpbmcgdHJhbnNwb3J0XCIsIGVycikiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICBvcy5FeGl0KDEpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiZGVmZXIgdHJhbnMuQ2xvc2UoKSIgPDwgZW5kbCA8PAotICAgICAgICAgICAgIGluZGVudCgpIDw8ICJ2YXIgcHJvdG9jb2xGYWN0b3J5IHRocmlmdC5UUHJvdG9jb2xGYWN0b3J5IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgaW5kZW50KCkgPDwgInN3aXRjaCBwcm90b2NvbCB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgaW5kZW50KCkgPDwgImNhc2UgXCJjb21wYWN0XCI6IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgcHJvdG9jb2xGYWN0b3J5ID0gdGhyaWZ0Lk5ld1RDb21wYWN0UHJvdG9jb2xGYWN0b3J5KCkiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICBicmVhayIgPDwgZW5kbCA8PAotICAgICAgICAgICAgIGluZGVudCgpIDw8ICJjYXNlIFwic2ltcGxlanNvblwiOiIgPDwgZW5kbCA8PAotICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIHByb3RvY29sRmFjdG9yeSA9IHRocmlmdC5OZXdUU2ltcGxlSlNPTlByb3RvY29sRmFjdG9yeSgpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgYnJlYWsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiY2FzZSBcImpzb25cIjoiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICBwcm90b2NvbEZhY3RvcnkgPSB0aHJpZnQuTmV3VEpTT05Qcm90b2NvbEZhY3RvcnkoKSIgPDwgZW5kbCA8PAotICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIGJyZWFrIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgaW5kZW50KCkgPDwgImNhc2UgXCJiaW5hcnlcIiwgXCJcIjoiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICBwcm90b2NvbEZhY3RvcnkgPSB0aHJpZnQuTmV3VEJpbmFyeVByb3RvY29sRmFjdG9yeURlZmF1bHQoKSIgPDwgZW5kbCA8PAotICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIGJyZWFrIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgaW5kZW50KCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgZm10LkZwcmludGxuKG9zLlN0ZGVyciwgXCJJbnZhbGlkIHByb3RvY29sIHNwZWNpZmllZDogXCIsIHByb3RvY29sKSIgPDwgZW5kbCA8PAotICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIFVzYWdlKCkiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICBvcy5FeGl0KDEpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiY2xpZW50IDo9ICIgPDwgcGFja2FnZV9uYW1lXyA8PCAiLk5ldyIgPDwgcHVibGljaXplKHNlcnZpY2VfbmFtZV8pIDw8ICJDbGllbnRGYWN0b3J5KHRyYW5zLCBwcm90b2NvbEZhY3RvcnkpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgaW5kZW50KCkgPDwgImlmIGVyciA6PSB0cmFucy5PcGVuKCk7IGVyciAhPSBuaWwgeyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIGZtdC5GcHJpbnRsbihvcy5TdGRlcnIsIFwiRXJyb3Igb3BlbmluZyBzb2NrZXQgdG8gXCIsIGhvc3QsIFwiOlwiLCBwb3J0LCBcIiBcIiwgZXJyKSIgPDwgZW5kbCA8PAotICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIG9zLkV4aXQoMSkiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgICAgICAgIGluZGVudCgpIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICBpbmRlbnQoKSA8PCAic3dpdGNoIGNtZCB7IiA8PCBlbmRsOwotCi0gICAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgYXJncyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gICAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGFfaXRlcjsKLSAgICAgICAgaW50IG51bV9hcmdzID0gYXJncy5zaXplKCk7Ci0gICAgICAgIHN0cmluZyBmdW5jTmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpOwotICAgICAgICBzdHJpbmcgcHViTmFtZShwdWJsaWNpemUoZnVuY05hbWUpKTsKLSAgICAgICAgc3RyaW5nIGFyZ3VtZW50c05hbWUocHVibGljaXplKGZ1bmNOYW1lKyJfYXJncyIsdHJ1ZSkpOwotICAgICAgICBmX3JlbW90ZSA8PAotICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiY2FzZSBcIiIgPDwgZXNjYXBlX3N0cmluZyhmdW5jTmFtZSkgPDwgIlwiOiIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgIGZfcmVtb3RlIDw8Ci0gICAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICJpZiBmbGFnLk5BcmcoKSAtIDEgIT0gIiA8PCBudW1fYXJncyA8PCAiIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgZm10LkZwcmludGxuKG9zLlN0ZGVyciwgXCIiIDw8IGVzY2FwZV9zdHJpbmcocHViTmFtZSkgPDwgIiByZXF1aXJlcyAiIDw8IG51bV9hcmdzIDw8ICIgYXJnc1wiKSIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICBmbGFnLlVzYWdlKCkiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fYXJnczsgKytpKSB7Ci0gICAgICAgICAgICBpbnQgZmxhZ0FyZyA9IGkgKyAxOwotICAgICAgICAgICAgdF90eXBlKiB0aGVfdHlwZShhcmdzW2ldLT5nZXRfdHlwZSgpKTsKLSAgICAgICAgICAgIHRfdHlwZSogdGhlX3R5cGUyKGdldF90cnVlX3R5cGUodGhlX3R5cGUpKTsKLQotICAgICAgICAgICAgaWYgKHRoZV90eXBlMi0+aXNfZW51bSgpKSB7Ci0gICAgICAgICAgICAgICAgZl9yZW1vdGUgPDwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAidG1wIiA8PCBpIDw8ICIsIGVyciA6PSAoc3RyY29udi5BdG9pKGZsYWcuQXJnKCIgPDwgZmxhZ0FyZyA8PCAiKSkpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgImlmIGVyciAhPSBuaWwgeyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIFVzYWdlKCkiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiIHJldHVybiIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgImFyZ3ZhbHVlIiA8PCBpIDw8ICIgOj0gIiA8PCBwYWNrYWdlX25hbWVfIDw8ICIuIiA8PCBwdWJsaWNpemUodGhlX3R5cGUtPmdldF9uYW1lKCkpIDw8ICIodG1wIiA8PCBpIDw8ICIpIiA8PCBlbmRsOwotICAgICAgICAgICAgfSBlbHNlIGlmICh0aGVfdHlwZTItPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICAgICAgICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSBlID0gKCh0X2Jhc2VfdHlwZSopdGhlX3R5cGUyKS0+Z2V0X2Jhc2UoKTsKLSAgICAgICAgICAgICAgICBzdHJpbmcgZXJyKHRtcCgiZXJyIikpOwotCi0gICAgICAgICAgICAgICAgc3dpdGNoIChlKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICAgICAgICAgICAgICBpZiAoKCh0X2Jhc2VfdHlwZSopdGhlX3R5cGUyKS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZfcmVtb3RlIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiYXJndmFsdWUiIDw8IGkgPDwgIiA6PSBbXWJ5dGUoZmxhZy5BcmcoIiA8PCBmbGFnQXJnIDw8ICIpKSIgPDwgZW5kbDsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZfcmVtb3RlIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiYXJndmFsdWUiIDw8IGkgPDwgIiA6PSBmbGFnLkFyZygiIDw8IGZsYWdBcmcgPDwgIikiIDw8IGVuZGw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgICAgICAgICAgICAgIGZfcmVtb3RlIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICJhcmd2YWx1ZSIgPDwgaSA8PCAiIDo9IGZsYWcuQXJnKCIgPDwgZmxhZ0FyZyA8PCAiKSA9PSBcInRydWVcIiIgPDwgZW5kbDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgICAgICAgICAgICAgIGZfcmVtb3RlIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICJ0bXAiIDw8IGkgPDwgIiwgIiA8PCBlcnIgPDwgIiA6PSAoc3RyY29udi5BdG9pKGZsYWcuQXJnKCIgPDwgZmxhZ0FyZyA8PCAiKSkpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAiIDw8IGVyciA8PCAiICE9IG5pbCB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIFVzYWdlKCkiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICJhcmd2YWx1ZSIgPDwgaSA8PCAiIDo9IGJ5dGUodG1wIiA8PCBpIDw8ICIpIiA8PCBlbmRsOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICAgICAgICAgICAgICBmX3JlbW90ZSA8PAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAidG1wIiA8PCBpIDw8ICIsICIgPDwgZXJyIDw8ICIgOj0gKHN0cmNvbnYuQXRvaShmbGFnLkFyZygiIDw8IGZsYWdBcmcgPDwgIikpKSIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgIiA8PCBlcnIgPDwgIiAhPSBuaWwgeyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICBVc2FnZSgpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiYXJndmFsdWUiIDw8IGkgPDwgIiA6PSBieXRlKHRtcCIgPDwgaSA8PCAiKSIgPDwgZW5kbDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgICAgICAgICAgICAgZl9yZW1vdGUgPDwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgInRtcCIgPDwgaSA8PCAiLCAiIDw8IGVyciA8PCAiIDo9IChzdHJjb252LkF0b2koZmxhZy5BcmcoIiA8PCBmbGFnQXJnIDw8ICIpKSkiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgImlmICIgPDwgZXJyIDw8ICIgIT0gbmlsIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgVXNhZ2UoKSIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4iIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgImFyZ3ZhbHVlIiA8PCBpIDw8ICIgOj0gaW50MzIodG1wIiA8PCBpIDw8ICIpIiA8PCBlbmRsOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICAgICAgICAgICAgICBmX3JlbW90ZSA8PAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiYXJndmFsdWUiIDw8IGkgPDwgIiwgIiA8PCBlcnIgPDwgIiA6PSAoc3RyY29udi5QYXJzZUludChmbGFnLkFyZygiIDw8IGZsYWdBcmcgPDwgIiksIDEwLCA2NCkpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAiIDw8IGVyciA8PCAiICE9IG5pbCB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIFVzYWdlKCkiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICAgICAgICAgICAgICBmX3JlbW90ZSA8PAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiYXJndmFsdWUiIDw8IGkgPDwgIiwgIiA8PCBlcnIgPDwgIiA6PSAoc3RyY29udi5QYXJzZUZsb2F0KGZsYWcuQXJnKCIgPDwgZmxhZ0FyZyA8PCAiKSwgNjQpKSIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgIiA8PCBlcnIgPDwgIiAhPSBuaWwgeyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICBVc2FnZSgpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICB0aHJvdyAoIkludmFsaWQgYmFzZSB0eXBlIGluIGdlbmVyYXRlX3NlcnZpY2VfcmVtb3RlIik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy9mX3JlbW90ZSA8PCBwdWJsaWNpemUoYXJnc1tpXS0+Z2V0X25hbWUoKSkgPDwgIihzdHJjb252LkF0b2koZmxhZy5BcmcoIiA8PCBmbGFnQXJnIDw8ICIpKSkiOwotICAgICAgICAgICAgfSBlbHNlIGlmICh0aGVfdHlwZTItPmlzX3N0cnVjdCgpKSB7Ci0gICAgICAgICAgICAgICAgc3RyaW5nIGFyZyh0bXAoImFyZyIpKTsKLSAgICAgICAgICAgICAgICBzdHJpbmcgbWJUcmFucyh0bXAoIm1iVHJhbnMiKSk7Ci0gICAgICAgICAgICAgICAgc3RyaW5nIGVycjEodG1wKCJlcnIiKSk7Ci0gICAgICAgICAgICAgICAgc3RyaW5nIGZhY3RvcnkodG1wKCJmYWN0b3J5IikpOwotICAgICAgICAgICAgICAgIHN0cmluZyBqc1Byb3QodG1wKCJqc1Byb3QiKSk7Ci0gICAgICAgICAgICAgICAgc3RyaW5nIGVycjIodG1wKCJlcnIiKSk7Ci0gICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgdHN0cnVjdF9uYW1lKHB1YmxpY2l6ZSh0aGVfdHlwZS0+Z2V0X25hbWUoKSkpOwotICAgICAgICAgICAgICAgIGZfcmVtb3RlIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgYXJnIDw8ICIgOj0gZmxhZy5BcmcoIiA8PCBmbGFnQXJnIDw8ICIpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgbWJUcmFucyA8PCAiIDo9IHRocmlmdC5OZXdUTWVtb3J5QnVmZmVyTGVuKGxlbigiIDw8IGFyZyA8PCAiKSkiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiZGVmZXIgIiA8PCBtYlRyYW5zIDw8ICIuQ2xvc2UoKSIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICJfLCAiIDw8IGVycjEgPDwgIiA6PSAiIDw8IG1iVHJhbnMgPDwgIi5Xcml0ZVN0cmluZygiIDw8IGFyZyA8PCAiKSIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAiIDw8IGVycjEgPDwgIiAhPSBuaWwgeyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIFVzYWdlKCkiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4iIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudCgpICA8PCBmYWN0b3J5IDw8ICIgOj0gdGhyaWZ0Lk5ld1RTaW1wbGVKU09OUHJvdG9jb2xGYWN0b3J5KCkiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCBqc1Byb3QgPDwgIiA6PSAiIDw8IGZhY3RvcnkgPDwgIi5HZXRQcm90b2NvbCgiIDw8IG1iVHJhbnMgPDwgIikiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiYXJndmFsdWUiIDw8IGkgPDwgIiA6PSAiIDw8IHBhY2thZ2VfbmFtZV8gPDwgIi5OZXciIDw8IHRzdHJ1Y3RfbmFtZSA8PCAiKCkiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCBlcnIyIDw8ICIgOj0gYXJndmFsdWUiIDw8IGkgPDwgIi5SZWFkKCIgPDwganNQcm90IDw8ICIpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgImlmICIgPDwgZXJyMiA8PCAiICE9IG5pbCB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgVXNhZ2UoKSIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgICAgICAgfSBlbHNlIGlmICh0aGVfdHlwZTItPmlzX2NvbnRhaW5lcigpIHx8IHRoZV90eXBlMi0+aXNfeGNlcHRpb24oKSkgewotICAgICAgICAgICAgICAgIHN0cmluZyBhcmcodG1wKCJhcmciKSk7Ci0gICAgICAgICAgICAgICAgc3RyaW5nIG1iVHJhbnModG1wKCJtYlRyYW5zIikpOwotICAgICAgICAgICAgICAgIHN0cmluZyBlcnIxKHRtcCgiZXJyIikpOwotICAgICAgICAgICAgICAgIHN0cmluZyBmYWN0b3J5KHRtcCgiZmFjdG9yeSIpKTsKLSAgICAgICAgICAgICAgICBzdHJpbmcganNQcm90KHRtcCgianNQcm90IikpOwotICAgICAgICAgICAgICAgIHN0cmluZyBlcnIyKHRtcCgiZXJyIikpOwotICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGFyZ05hbWUocHVibGljaXplKGFyZ3NbaV0tPmdldF9uYW1lKCkpKTsKLSAgICAgICAgICAgICAgICBmX3JlbW90ZSA8PAotICAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudCgpIDw8IGFyZyA8PCAiIDo9IGZsYWcuQXJnKCIgPDwgZmxhZ0FyZyA8PCAiKSIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudCgpIDw8IG1iVHJhbnMgPDwgIiA6PSB0aHJpZnQuTmV3VE1lbW9yeUJ1ZmZlckxlbihsZW4oIiA8PCBhcmcgPDwgIikpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgImRlZmVyICIgPDwgbWJUcmFucyA8PCAiLkNsb3NlKCkiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiXywgIiA8PCBlcnIxIDw8ICIgOj0gIiA8PCBtYlRyYW5zIDw8ICIuV3JpdGVTdHJpbmcoIiA8PCBhcmcgPDwgIikiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgIiA8PCBlcnIxIDw8ICIgIT0gbmlsIHsgIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgVXNhZ2UoKSIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgZmFjdG9yeSA8PCAiIDo9IHRocmlmdC5OZXdUU2ltcGxlSlNPTlByb3RvY29sRmFjdG9yeSgpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwganNQcm90IDw8ICIgOj0gIiA8PCBmYWN0b3J5IDw8ICIuR2V0UHJvdG9jb2woIiA8PCBtYlRyYW5zIDw8ICIpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgImNvbnRhaW5lclN0cnVjdCIgPDwgaSA8PCAiIDo9ICIgPDwgcGFja2FnZV9uYW1lXyA8PCAiLk5ldyIgPDwgYXJndW1lbnRzTmFtZSA8PCAiKCkiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCBlcnIyIDw8ICIgOj0gY29udGFpbmVyU3RydWN0IiA8PCBpIDw8ICIuUmVhZEZpZWxkIiA8PCAoaSArIDEpIDw8ICIoIiA8PCBqc1Byb3QgPDwgIikiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgIiA8PCBlcnIyIDw8ICIgIT0gbmlsIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICBVc2FnZSgpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiYXJndmFsdWUiIDw8IGkgPDwgIiA6PSBjb250YWluZXJTdHJ1Y3QiIDw8IGkgPDwgIi4iIDw8IGFyZ05hbWUgPDwgZW5kbDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgKCJJbnZhbGlkIGFyZ3VtZW50IHR5cGUgaW4gZ2VuZXJhdGVfc2VydmljZV9yZW1vdGUiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHRoZV90eXBlLT5pc190eXBlZGVmKCkpIHsKLSAgICAgICAgICAgICAgICBmX3JlbW90ZSA8PAotICAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICJ2YWx1ZSIgPDwgaSA8PCAiIDo9ICIgPDwgcGFja2FnZV9uYW1lXyA8PCAiLiIgPDwgcHVibGljaXplKHRoZV90eXBlLT5nZXRfbmFtZSgpKSA8PCAiKGFyZ3ZhbHVlIiA8PCBpIDw8ICIpIiA8PCBlbmRsOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmX3JlbW90ZSA8PAotICAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICJ2YWx1ZSIgPDwgaSA8PCAiIDo9IGFyZ3ZhbHVlIiA8PCBpIDw8IGVuZGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmX3JlbW90ZSA8PAotICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiZm10LlByaW50KGNsaWVudC4iIDw8IHB1Yk5hbWUgPDwgIigiOwotICAgICAgICBib29sIGFyZ0ZpcnN0ID0gdHJ1ZTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bV9hcmdzOyArK2kpIHsKLSAgICAgICAgICAgIGlmIChhcmdGaXJzdCkgewotICAgICAgICAgICAgICAgIGFyZ0ZpcnN0ID0gZmFsc2U7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZfcmVtb3RlIDw8ICIsICI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChhcmdzW2ldLT5nZXRfdHlwZSgpLT5pc19lbnVtKCkpIHsKLSAgICAgICAgICAgICAgICBmX3JlbW90ZSA8PCAidmFsdWUiIDw8IGk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0tPmdldF90eXBlKCktPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICAgICAgICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSBlID0gKCh0X2Jhc2VfdHlwZSopKGFyZ3NbaV0tPmdldF90eXBlKCkpKS0+Z2V0X2Jhc2UoKTsKLQotICAgICAgICAgICAgICAgIHN3aXRjaCAoZSkgewotICAgICAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICAgICAgICAgICAgICBmX3JlbW90ZSA8PCAidmFsdWUiIDw8IGk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgKCJJbnZhbGlkIGJhc2UgdHlwZSBpbiBnZW5lcmF0ZV9zZXJ2aWNlX3JlbW90ZSIpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vZl9yZW1vdGUgPDwgcHVibGljaXplKGFyZ3NbaV0tPmdldF9uYW1lKCkpIDw8ICIoc3RyY29udi5BdG9pKGZsYWcuQXJnKCIgPDwgZmxhZ0FyZyA8PCAiKSkpIjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZl9yZW1vdGUgPDwgInZhbHVlIiA8PCBpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZl9yZW1vdGUgPDwKLSAgICAgICAgICAgICAgICAgIikpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICJmbXQuUHJpbnQoXCJcXG5cIikiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgImJyZWFrIiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgIH0KLQotICAgIGZfcmVtb3RlIDw8Ci0gICAgICAgICAgICAgaW5kZW50KCkgPDwgImNhc2UgXCJcIjoiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICBVc2FnZSgpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgYnJlYWsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiZGVmYXVsdDoiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICBmbXQuRnByaW50bG4ob3MuU3RkZXJyLCBcIkludmFsaWQgZnVuY3Rpb24gXCIsIGNtZCkiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGZfcmVtb3RlIDw8Ci0gICAgICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgLy8gQ2xvc2Ugc2VydmljZSBmaWxlCi0gICAgZl9yZW1vdGUuY2xvc2UoKTsKLSAgICBmb3JtYXRfZ29fb3V0cHV0KGZfcmVtb3RlX25hbWUpOwotI2lmbmRlZiBfTVNDX1ZFUgotICAgIC8vIE1ha2UgZmlsZSBleGVjdXRhYmxlLCBsb3ZlIHRoYXQgYml0d2lzZSBPUiBhY3Rpb24KLSAgICBjaG1vZChmX3JlbW90ZV9uYW1lLmNfc3RyKCksCi0gICAgICAgICAgU19JUlVTUgotICAgICAgICAgIHwgU19JV1VTUgotICAgICAgICAgIHwgU19JWFVTUgotI2lmbmRlZiBfV0lOMzIKLSAgICAgICAgICB8IFNfSVJHUlAKLSAgICAgICAgICB8IFNfSVhHUlAKLSAgICAgICAgICB8IFNfSVJPVEgKLSAgICAgICAgICB8IFNfSVhPVEgKLSNlbmRpZgotICAgICAgICAgKTsKLSNlbmRpZgotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2Ugc2VydmVyIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KLSAqLwotdm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSkKLXsKLSAgICAvLyBHZW5lcmF0ZSB0aGUgZGlzcGF0Y2ggbWV0aG9kcwotICAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0gICAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgICBzdHJpbmcgZXh0ZW5kc19wcm9jZXNzb3IgPSAiIjsKLSAgICBzdHJpbmcgZXh0ZW5kc19wcm9jZXNzb3JfbmV3ID0gIiI7Ci0gICAgc3RyaW5nIHNlcnZpY2VOYW1lKHB1YmxpY2l6ZSh0c2VydmljZS0+Z2V0X25hbWUoKSkpOwotCi0gICAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICAgICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7Ci0gICAgICAgIHNpemVfdCBpbmRleCA9IGV4dGVuZHMucmZpbmQoIi4iKTsKLQotICAgICAgICBpZiAoaW5kZXggIT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgICAgICAgICBleHRlbmRzX3Byb2Nlc3NvciA9IGV4dGVuZHMuc3Vic3RyKDAsIGluZGV4ICsgMSkgKyBwdWJsaWNpemUoZXh0ZW5kcy5zdWJzdHIoaW5kZXggKyAxKSkgKyAiUHJvY2Vzc29yIjsKLSAgICAgICAgICAgIGV4dGVuZHNfcHJvY2Vzc29yX25ldyA9IGV4dGVuZHMuc3Vic3RyKDAsIGluZGV4ICsgMSkgKyAiTmV3IiArIHB1YmxpY2l6ZShleHRlbmRzLnN1YnN0cihpbmRleCArIDEpKSArICJQcm9jZXNzb3IiOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZXh0ZW5kc19wcm9jZXNzb3IgPSBwdWJsaWNpemUoZXh0ZW5kcykgKyAiUHJvY2Vzc29yIjsKLSAgICAgICAgICAgIGV4dGVuZHNfcHJvY2Vzc29yX25ldyA9ICJOZXciICsgZXh0ZW5kc19wcm9jZXNzb3I7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdHJpbmcgcFNlcnZpY2VOYW1lKHByaXZhdGl6ZShzZXJ2aWNlTmFtZSkpOwotICAgIC8vIEdlbmVyYXRlIHRoZSBoZWFkZXIgcG9ydGlvbgotICAgIHN0cmluZyBzZWxmKHRtcCgic2VsZiIpKTsKLQotICAgIGlmIChleHRlbmRzX3Byb2Nlc3Nvci5lbXB0eSgpKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAidHlwZSAiIDw8IHNlcnZpY2VOYW1lIDw8ICJQcm9jZXNzb3Igc3RydWN0IHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICBwcm9jZXNzb3JNYXAgbWFwW3N0cmluZ110aHJpZnQuVFByb2Nlc3NvckZ1bmN0aW9uIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgaGFuZGxlciAiIDw8IHNlcnZpY2VOYW1lIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgImZ1bmMgKHAgKiIgPDwgc2VydmljZU5hbWUgPDwgIlByb2Nlc3NvcikgQWRkVG9Qcm9jZXNzb3JNYXAoa2V5IHN0cmluZywgcHJvY2Vzc29yIHRocmlmdC5UUHJvY2Vzc29yRnVuY3Rpb24pIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICBwLnByb2Nlc3Nvck1hcFtrZXldID0gcHJvY2Vzc29yIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbCA8PAotICAgICAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICJmdW5jIChwICoiIDw8IHNlcnZpY2VOYW1lIDw8ICJQcm9jZXNzb3IpIEdldFByb2Nlc3NvckZ1bmN0aW9uKGtleSBzdHJpbmcpIChwcm9jZXNzb3IgdGhyaWZ0LlRQcm9jZXNzb3JGdW5jdGlvbiwgb2sgYm9vbCkgeyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIHByb2Nlc3Nvciwgb2sgPSBwLnByb2Nlc3Nvck1hcFtrZXldIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHByb2Nlc3Nvciwgb2siIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgImZ1bmMgKHAgKiIgPDwgc2VydmljZU5hbWUgPDwgIlByb2Nlc3NvcikgUHJvY2Vzc29yTWFwKCkgbWFwW3N0cmluZ110aHJpZnQuVFByb2Nlc3NvckZ1bmN0aW9uIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gcC5wcm9jZXNzb3JNYXAiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgImZ1bmMgTmV3IiA8PCBzZXJ2aWNlTmFtZSA8PCAiUHJvY2Vzc29yKGhhbmRsZXIgIiA8PCBzZXJ2aWNlTmFtZSA8PCAiKSAqIiA8PCBzZXJ2aWNlTmFtZSA8PCAiUHJvY2Vzc29yIHsiIDw8IGVuZGwgPDwgZW5kbCA8PAotICAgICAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgICIgPDwgc2VsZiA8PCAiIDo9ICYiIDw8IHNlcnZpY2VOYW1lIDw8ICJQcm9jZXNzb3J7aGFuZGxlcjpoYW5kbGVyLCBwcm9jZXNzb3JNYXA6bWFrZShtYXBbc3RyaW5nXXRocmlmdC5UUHJvY2Vzc29yRnVuY3Rpb24pfSIgPDwgZW5kbDsKLQotICAgICAgICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgICAgICAgc3RyaW5nIGVzY2FwZWRGdW5jTmFtZShlc2NhcGVfc3RyaW5nKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkpOwotICAgICAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICAiIDw8IHNlbGYgPDwgIi5wcm9jZXNzb3JNYXBbXCIiIDw8IGVzY2FwZWRGdW5jTmFtZSA8PCAiXCJdID0gJiIgPDwgcFNlcnZpY2VOYW1lIDw8ICJQcm9jZXNzb3IiIDw8IHB1YmxpY2l6ZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICJ7aGFuZGxlcjpoYW5kbGVyfSIgPDwgZW5kbDsKLSAgICAgICAgfQotCi0gICAgICAgIHN0cmluZyB4KHRtcCgieCIpKTsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICJyZXR1cm4gIiA8PCBzZWxmIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgImZ1bmMgKHAgKiIgPDwgc2VydmljZU5hbWUgPDwgIlByb2Nlc3NvcikgUHJvY2VzcyhpcHJvdCwgb3Byb3QgdGhyaWZ0LlRQcm90b2NvbCkgKHN1Y2Nlc3MgYm9vbCwgZXJyIHRocmlmdC5URXhjZXB0aW9uKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgbmFtZSwgXywgc2VxSWQsIGVyciA6PSBpcHJvdC5SZWFkTWVzc2FnZUJlZ2luKCkiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICBpZiBlcnIgIT0gbmlsIHsgcmV0dXJuIGZhbHNlLCBlcnIgfSIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIGlmIHByb2Nlc3Nvciwgb2sgOj0gcC5HZXRQcm9jZXNzb3JGdW5jdGlvbihuYW1lKTsgb2sgeyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgICAgcmV0dXJuIHByb2Nlc3Nvci5Qcm9jZXNzKHNlcUlkLCBpcHJvdCwgb3Byb3QpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgfSIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIGlwcm90LlNraXAodGhyaWZ0LlNUUlVDVCkiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICBpcHJvdC5SZWFkTWVzc2FnZUVuZCgpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgIiA8PCB4IDw8ICIgOj0gdGhyaWZ0Lk5ld1RBcHBsaWNhdGlvbkV4Y2VwdGlvbih0aHJpZnQuVU5LTk9XTl9NRVRIT0QsIFwiVW5rbm93biBmdW5jdGlvbiBcIiArIG5hbWUpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgb3Byb3QuV3JpdGVNZXNzYWdlQmVnaW4obmFtZSwgdGhyaWZ0LkVYQ0VQVElPTiwgc2VxSWQpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgIiA8PCB4IDw8ICIuV3JpdGUob3Byb3QpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgb3Byb3QuV3JpdGVNZXNzYWdlRW5kKCkiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICBvcHJvdC5GbHVzaCgpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGZhbHNlLCAiIDw8IHggPDwgZW5kbCA8PAotICAgICAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICIiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAidHlwZSAiIDw8IHNlcnZpY2VOYW1lIDw8ICJQcm9jZXNzb3Igc3RydWN0IHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICAqIiA8PCBleHRlbmRzX3Byb2Nlc3NvciA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbCA8PAotICAgICAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICJmdW5jIE5ldyIgPDwgc2VydmljZU5hbWUgPDwgIlByb2Nlc3NvcihoYW5kbGVyICIgPDwgc2VydmljZU5hbWUgPDwgIikgKiIgPDwgc2VydmljZU5hbWUgPDwgIlByb2Nlc3NvciB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgIiA8PCBzZWxmIDw8ICIgOj0gJiIgPDwgc2VydmljZU5hbWUgPDwgIlByb2Nlc3NvcnsiIDw8IGV4dGVuZHNfcHJvY2Vzc29yX25ldyA8PCAiKGhhbmRsZXIpfSIgPDwgZW5kbDsKLQotICAgICAgICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgICAgICAgc3RyaW5nIGVzY2FwZWRGdW5jTmFtZShlc2NhcGVfc3RyaW5nKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkpOwotICAgICAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICAiIDw8IHNlbGYgPDwgIi5BZGRUb1Byb2Nlc3Nvck1hcChcIiIgPDwgZXNjYXBlZEZ1bmNOYW1lIDw8ICJcIiwgJiIgPDwgcFNlcnZpY2VOYW1lIDw8ICJQcm9jZXNzb3IiIDw8IHB1YmxpY2l6ZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICJ7aGFuZGxlcjpoYW5kbGVyfSkiIDw8IGVuZGw7Ci0gICAgICAgIH0KLQotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgc2VsZiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2VzcyBzdWJmdW5jdGlvbnMKLSAgICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgICBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRzZXJ2aWNlLCAqZl9pdGVyKTsKLSAgICB9Ci0KLSAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgcHJvY2VzcyBmdW5jdGlvbiBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHdyaXRlIGEgZGlzcGF0Y2hlciBmb3IKLSAqLwotdm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLAotICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pCi17Ci0gICAgLy8gT3BlbiBmdW5jdGlvbgotICAgIHN0cmluZyBwcm9jZXNzb3JOYW1lID0gcHJpdmF0aXplKHRzZXJ2aWNlLT5nZXRfbmFtZSgpKSArICJQcm9jZXNzb3IiICsgcHVibGljaXplKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSk7Ci0gICAgc3RyaW5nIGFyZ3NuYW1lID0gcHVibGljaXplKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfYXJncyIsdHJ1ZSk7Ci0gICAgc3RyaW5nIHJlc3VsdG5hbWUgPSBwdWJsaWNpemUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiLHRydWUpOwotICAgIC8vdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7Ci0gICAgLy9jb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAidHlwZSAiIDw8IHByb2Nlc3Nvck5hbWUgPDwgIiBzdHJ1Y3QgeyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgaGFuZGxlciAiIDw8IHB1YmxpY2l6ZSh0c2VydmljZS0+Z2V0X25hbWUoKSkgPDwgZW5kbCA8PAotICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbCA8PAotICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgImZ1bmMgKHAgKiIgPDwgcHJvY2Vzc29yTmFtZSA8PCAiKSBQcm9jZXNzKHNlcUlkIGludDMyLCBpcHJvdCwgb3Byb3QgdGhyaWZ0LlRQcm90b2NvbCkgKHN1Y2Nlc3MgYm9vbCwgZXJyIHRocmlmdC5URXhjZXB0aW9uKSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICJhcmdzIDo9ICIgPDwgYXJnc25hbWUgPDwgInt9IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgZXJyID0gYXJncy5SZWFkKGlwcm90KTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICBpcHJvdC5SZWFkTWVzc2FnZUVuZCgpIiA8PCBlbmRsOwotICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgeCA6PSB0aHJpZnQuTmV3VEFwcGxpY2F0aW9uRXhjZXB0aW9uKHRocmlmdC5QUk9UT0NPTF9FUlJPUiwgZXJyLkVycm9yKCkpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgb3Byb3QuV3JpdGVNZXNzYWdlQmVnaW4oXCIiIDw8IGVzY2FwZV9zdHJpbmcodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSA8PCAiXCIsIHRocmlmdC5FWENFUFRJT04sIHNlcUlkKSIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIHguV3JpdGUob3Byb3QpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgb3Byb3QuV3JpdGVNZXNzYWdlRW5kKCkiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICBvcHJvdC5GbHVzaCgpIiA8PCBlbmRsOwotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gZmFsc2UsIGVyciIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbCA8PAotICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgImlwcm90LlJlYWRNZXNzYWdlRW5kKCkiIDw8IGVuZGw7Ci0KLSAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICJyZXN1bHQgOj0gIiA8PCByZXN1bHRuYW1lIDw8ICJ7fSIgPDwgZW5kbDsKLSAgICB9Ci0gICAgYm9vbCBuZWVkX3JlZmVyZW5jZSA9IHR5cGVfbmVlZF9yZWZlcmVuY2UodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKTsKLSAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgInZhciByZXR2YWwgIiA8PHR5cGVfdG9fZ29fdHlwZSh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpIDw8ZW5kbDsKLSAgICB9Ci0KLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAidmFyIGVycjIgZXJyb3IiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAiOwotCi0gICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgICAgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgICAgIGZfc2VydmljZV8gPDwgInJldHZhbCwgIjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIEdlbmVyYXRlIHRoZSBmdW5jdGlvbiBjYWxsCi0gICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7Ci0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgICAgICAiZXJyMiA9IHAuaGFuZGxlci4iIDw8IHB1YmxpY2l6ZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpIDw8ICIoIjsKLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLQotICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICAgIGlmIChmaXJzdCkgewotICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKLSAgICAgICAgfQotCi0gICAgICAgIGZfc2VydmljZV8gPDwgImFyZ3MuIiA8PCBwdWJsaWNpemUodmFyaWFibGVfbmFtZV90b19nb19uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkpOwotICAgIH0KLQotICAgIGZfc2VydmljZV8gPDwgIik7IGVycjIgIT0gbmlsIHsiIDw8IGVuZGw7Ci0gICAgCi0gICAgdF9zdHJ1Y3QqIGV4Y2VwdGlvbnMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiB4X2ZpZWxkcyA9IGV4Y2VwdGlvbnMtPmdldF9tZW1iZXJzKCk7Ci0gICAgaWYoICEgeF9maWVsZHMuZW1wdHkoKSkgewotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJzd2l0Y2ggdiA6PSBlcnIyLih0eXBlKSB7IiA8PCBlbmRsOwotCi0gICAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhmX2l0ZXI7Ci0KLSAgICAgICAgZm9yICh4Zl9pdGVyID0geF9maWVsZHMuYmVnaW4oKTsgeGZfaXRlciAhPSB4X2ZpZWxkcy5lbmQoKTsgKyt4Zl9pdGVyKSB7Ci0gICAgICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICBjYXNlICIgPDwgdHlwZV90b19nb190eXBlKCgoKnhmX2l0ZXIpLT5nZXRfdHlwZSgpKSkgPDwgIjoiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICJyZXN1bHQuIiA8PCBwdWJsaWNpemUodmFyaWFibGVfbmFtZV90b19nb19uYW1lKCgqeGZfaXRlciktPmdldF9uYW1lKCkpKSA8PCAiID0gdiIgPDwgZW5kbDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIGRlZmF1bHQ6IiA8PCBlbmRsOwotICAgIH0KLQotICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgeCA6PSB0aHJpZnQuTmV3VEFwcGxpY2F0aW9uRXhjZXB0aW9uKHRocmlmdC5JTlRFUk5BTF9FUlJPUiwgXCJJbnRlcm5hbCBlcnJvciBwcm9jZXNzaW5nICIgPDwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXNjYXBlX3N0cmluZyh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpIDw8ICI6IFwiICsgZXJyMi5FcnJvcigpKSIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIG9wcm90LldyaXRlTWVzc2FnZUJlZ2luKFwiIiA8PCBlc2NhcGVfc3RyaW5nKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgPDwgIlwiLCB0aHJpZnQuRVhDRVBUSU9OLCBzZXFJZCkiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICB4LldyaXRlKG9wcm90KSIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIG9wcm90LldyaXRlTWVzc2FnZUVuZCgpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgb3Byb3QuRmx1c2goKSIgPDwgZW5kbCA7Ci0gICAgfQotCi0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRydWUsIGVycjIiIDw8IGVuZGwgOwotCi0gICAgaWYoICEgeF9maWVsZHMuZW1wdHkoKSkgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIn0iOyAgLy8gY2xvc2VzIGVycjIgIT0gbmlsCi0KLSAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICAgICAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICAgICAgZl9zZXJ2aWNlXyA8PCAiIGVsc2UgeyIgPDwgZW5kbDsgLy8gbWFrZSBzdXJlIHdlIHNldCBTdWNjZXNzIHJldHZhbCBvbmx5IG9uIHN1Y2Nlc3MKLSAgICAgICAgICAgIGluZGVudF91cCgpOwotICAgICAgICAgICAgZl9zZXJ2aWNlXyA8PCAKLSAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAicmVzdWx0LlN1Y2Nlc3MgPSAiOwotICAgICAgICAgICAgaWYobmVlZF9yZWZlcmVuY2UpIHsKLSAgICAgICAgICAgICAgICBmX3NlcnZpY2VfIDw8ICImIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZfc2VydmljZV8gPDwgCi0gICAgICAgICAgICAgICAgInJldHZhbCIgPDwgZW5kbDsKLSAgICAgICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICAgICAgICBmX3NlcnZpY2VfIDw8ICJ9IiAgPDwgZW5kbDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLSAgICAgICAgfQotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgImlmIGVycjIgPSBvcHJvdC5Xcml0ZU1lc3NhZ2VCZWdpbihcIiIgPDwgZXNjYXBlX3N0cmluZyh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpIDw8IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiwgdGhyaWZ0LlJFUExZLCBzZXFJZCk7IGVycjIgIT0gbmlsIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICBlcnIgPSBlcnIyIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgZXJyMiA9IHJlc3VsdC5Xcml0ZShvcHJvdCk7IGVyciA9PSBuaWwgJiYgZXJyMiAhPSBuaWwgeyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIGVyciA9IGVycjIiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICJpZiBlcnIyID0gb3Byb3QuV3JpdGVNZXNzYWdlRW5kKCk7IGVyciA9PSBuaWwgJiYgZXJyMiAhPSBuaWwgeyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIGVyciA9IGVycjIiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICJpZiBlcnIyID0gb3Byb3QuRmx1c2goKTsgZXJyID09IG5pbCAmJiBlcnIyICE9IG5pbCB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgZXJyID0gZXJyMiIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgImlmIGVyciAhPSBuaWwgeyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgInJldHVybiB0cnVlLCBlcnIiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICJyZXR1cm4gdHJ1ZSwgbmlsIiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogRGVzZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCi0gKi8KLXZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtICZvdXQsCi0gICAgICAgIHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgYm9vbCBkZWNsYXJlLAotICAgICAgICBzdHJpbmcgcHJlZml4LAotICAgICAgICBib29sIGluY2xhc3MsCi0gICAgICAgIGJvb2wgY29lcmNlRGF0YSwKLSAgICAgICAgYm9vbCBpbmtleSwKLSAgICAgICAgYm9vbCBpbl9jb250YWluZXJfdmFsdWUpCi17Ci0gICAgKHZvaWQpIGluY2xhc3M7Ci0gICAgKHZvaWQpIGNvZXJjZURhdGE7Ci0JdF90eXBlKiBvcmlnX3R5cGUgPSB0ZmllbGQtPmdldF90eXBlKCk7Ci0gICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZShvcmlnX3R5cGUpOwotICAgIHN0cmluZyBuYW1lKHByZWZpeCArIHB1YmxpY2l6ZSh2YXJpYWJsZV9uYW1lX3RvX2dvX25hbWUodGZpZWxkLT5nZXRfbmFtZSgpKSkpOwotCi0gICAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgewotICAgICAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIERFU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIG5hbWU7Ci0gICAgfQotCi0gICAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0X3N0cnVjdCopdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX3BvaW50ZXJfZmllbGQodGZpZWxkLCBpbl9jb250YWluZXJfdmFsdWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjbGFyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpOwotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX3BvaW50ZXJfZmllbGQodGZpZWxkKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2xhcmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgewotCi0gICAgICAgIGlmIChkZWNsYXJlKSB7Ci0gICAgICAgICAgICBzdHJpbmcgdHlwZV9uYW1lID0gaW5rZXkgPyB0eXBlX3RvX2dvX2tleV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSkgOgotICAgICAgICAgICAgICAgIHR5cGVfdG9fZ29fdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOwotICAgICAgICAgICAgb3V0IDw8ICJ2YXIgIiA8PCB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIiAiIDw8IHR5cGVfbmFtZSA8PCBlbmRsOwotICAgICAgICB9Ci0KLSAgICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgICAgICAgICAgICAgImlmIHYsIGVyciA6PSBpcHJvdC4iOwotCi0gICAgICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotCi0gICAgICAgICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKwotICAgICAgICAgICAgICAgIG5hbWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICAgICAgICAgIGlmICgoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkgJiYgIWlua2V5KSB7Ci0gICAgICAgICAgICAgICAgICAgIG91dCA8PCAiUmVhZEJpbmFyeSgpIjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBvdXQgPDwgIlJlYWRTdHJpbmcoKSI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgICAgICAgICBvdXQgPDwgIlJlYWRCb29sKCkiOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgICAgICAgICAgb3V0IDw8ICJSZWFkQnl0ZSgpIjsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgICAgICAgICAgb3V0IDw8ICJSZWFkSTE2KCkiOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgICAgICAgICBvdXQgPDwgIlJlYWRJMzIoKSI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICAgICAgICAgIG91dCA8PCAiUmVhZEk2NCgpIjsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgICAgICAgICAgb3V0IDw8ICJSZWFkRG91YmxlKCkiOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gR28gbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgICAgICAgb3V0IDw8ICJSZWFkSTMyKCkiOwotICAgICAgICB9Ci0KLSAgICAgICAgb3V0IDw8ICI7IGVyciAhPSBuaWwgeyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgInJldHVybiBmbXQuRXJyb3JmKFwiZXJyb3IgcmVhZGluZyBmaWVsZCAiIDw8Ci0gICAgICAgICAgICB0ZmllbGQtPmdldF9rZXkoKSAgPDwgIjogJXNcIiwgZXJyKSIgPDwgZW5kbDsKLQotICAgICAgICBvdXQgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOwotICAgICAgICBzdHJpbmcgd3JhcDsKLQotICAgICAgICBpZiAodHlwZS0+aXNfZW51bSgpIHx8IG9yaWdfdHlwZS0+aXNfdHlwZWRlZigpKSB7Ci0gICAgICAgICAgICB3cmFwID0gcHVibGljaXplKHR5cGVfbmFtZShvcmlnX3R5cGUpKTsKLSAgICAgICAgfSBlbHNlIGlmICgoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFKSB7Ci0gICAgICAgICAgICB3cmFwID0gImludDgiOwotICAgICAgICB9Ci0KLSAgICAgICAgc3RyaW5nIG1heWJlX2FkZHJlc3MgPSAoaXNfcG9pbnRlcl9maWVsZCh0ZmllbGQpID8gIiYiIDogIiIpOwotICAgICAgICBpZiAod3JhcCA9PSAiIikgewotICAgICAgICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiID0gIiA8PCBtYXliZV9hZGRyZXNzIDw8ICJ2IiA8PCBlbmRsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW5kZW50KG91dCkgPDwgInRlbXAgOj0gIiA8PCB3cmFwIDw8ICIodikiIDw8IGVuZGw7Ci0gICAgICAgICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIgPSAiIDw8IG1heWJlX2FkZHJlc3MgPDwgInRlbXAiIDw8IGVuZGw7Ci0gICAgICAgIH0KLQotICAgICAgICBvdXQgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZCAnIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiJyBmb3IgZmllbGQgJyIgKyB0ZmllbGQtPmdldF9uYW1lKCkgKyAiJyI7Ci0gICAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhbiB1bnNlcmlhbGl6ZXIgZm9yIGEgc3RydWN0LCBjYWxsaW5nIHJlYWQoKQotICovCi12b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgIGJvb2wgcG9pbnRlcl9maWVsZCwKLSAgICAgICAgYm9vbCBkZWNsYXJlLAotICAgICAgICBzdHJpbmcgcHJlZml4KQotewotICAgIHN0cmluZyBlcShkZWNsYXJlID8gIiA6PSAiIDogIiA9ICIpOwotCi0gICAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCBlcSA8PChwb2ludGVyX2ZpZWxkPyImIjoiIik7Ci0gICAgZ2VuZXJhdGVfZ29fc3RydWN0X2luaXRpYWxpemVyKG91dCwgdHN0cnVjdCk7Ci0gICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiBlcnIgOj0gIiA8PCBwcmVmaXggPDwgIi5SZWFkKGlwcm90KTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiBmbXQuRXJyb3JmKFwiJVQgZXJyb3IgcmVhZGluZyBzdHJ1Y3Q6ICVzXCIsICIgPDwgcHJlZml4IDw8ICIsIGVycikiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplIGEgY29udGFpbmVyIGJ5IHdyaXRpbmcgb3V0IHRoZSBoZWFkZXIgZm9sbG93ZWQgYnkKLSAqIGRhdGEgYW5kIHRoZW4gYSBmb290ZXIuCi0gKi8KLXZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSAmb3V0LAotICAgICAgICB0X3R5cGUqIG9yaWdfdHlwZSwKLSAgICAgICAgYm9vbCBwb2ludGVyX2ZpZWxkLAotICAgICAgICBib29sIGRlY2xhcmUsCi0gICAgICAgIHN0cmluZyBwcmVmaXgpCi17Ci0gICAgdF90eXBlKiB0dHlwZSA9IGdldF90cnVlX3R5cGUob3JpZ190eXBlKTsKLSAgICBzdHJpbmcgZXEoIiA9ICIpOwotCi0gICAgaWYgKGRlY2xhcmUpIHsKLSAgICAgICAgZXEgPSAiIDo9ICI7Ci0gICAgfQotCi0gICAgLy8gRGVjbGFyZSB2YXJpYWJsZXMsIHJlYWQgaGVhZGVyCi0gICAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgICAgICBvdXQgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICJfLCBfLCBzaXplLCBlcnIgOj0gaXByb3QuUmVhZE1hcEJlZ2luKCkiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICJpZiBlcnIgIT0gbmlsIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiBmbXQuRXJyb3JmKFwiZXJyb3IgcmVhZGluZyBtYXAgYmVnaW46ICVzXCIsIGVycikiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAidE1hcCA6PSBtYWtlKCIgPDwgdHlwZV90b19nb190eXBlKG9yaWdfdHlwZSkgPDwgIiwgc2l6ZSkiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8IHByZWZpeCA8PCBlcSA8PCAiICIgPDwgKHBvaW50ZXJfZmllbGQgPyAiJiIgOiAiIikgPDwgInRNYXAiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgICAgdF9zZXQqIHQgPSAodF9zZXQqKXR0eXBlOwotICAgICAgICBvdXQgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICJfLCBzaXplLCBlcnIgOj0gaXByb3QuUmVhZFNldEJlZ2luKCkiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICJpZiBlcnIgIT0gbmlsIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiBmbXQuRXJyb3JmKFwiZXJyb3IgcmVhZGluZyBzZXQgYmVnaW46ICVzXCIsIGVycikiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAidFNldCA6PSBtYWtlKG1hcFsiIDw8IHR5cGVfdG9fZ29fa2V5X3R5cGUodC0+Z2V0X2VsZW1fdHlwZSgpLT5nZXRfdHJ1ZV90eXBlKCkpIDw8ICJdYm9vbCwgc2l6ZSkiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8IHByZWZpeCA8PCBlcSA8PCAiICIgPDwgKHBvaW50ZXJfZmllbGQgPyAiJiIgOiAiIikgPDwgInRTZXQiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICAgIG91dCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgIl8sIHNpemUsIGVyciA6PSBpcHJvdC5SZWFkTGlzdEJlZ2luKCkiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICJpZiBlcnIgIT0gbmlsIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiBmbXQuRXJyb3JmKFwiZXJyb3IgcmVhZGluZyBsaXN0IGJlZ2luOiAlc1wiLCBlcnIpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgInRTbGljZSA6PSBtYWtlKCIgPDwgdHlwZV90b19nb190eXBlKG9yaWdfdHlwZSkgPDwgIiwgMCwgc2l6ZSkiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8IHByZWZpeCA8PCBlcSA8PCAiICIgPDwgKHBvaW50ZXJfZmllbGQgPyAiJiIgOiAiIikgPDwgInRTbGljZSIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lciAnIiArIHR0eXBlLT5nZXRfbmFtZSgpICsgIicgZm9yIHByZWZpeCAnIiArIHByZWZpeCArICInIjsKLSAgICB9Ci0KLSAgICAvLyBGb3IgbG9vcCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzCi0gICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJmb3IgaSA6PSAwOyBpIDwgc2l6ZTsgaSArKyB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotCi0gICAgaWYgKHBvaW50ZXJfZmllbGQpIHsKLSAgICAgICAgcHJlZml4ID0gIigqIiArIHByZWZpeCArICIpIjsKLSAgICB9Ci0gICAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIGRlY2xhcmUsIHByZWZpeCk7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBkZWNsYXJlLCBwcmVmaXgpOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgZGVjbGFyZSwgcHJlZml4KTsKLSAgICB9Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLQotICAgIC8vIFJlYWQgY29udGFpbmVyIGVuZAotICAgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgZXJyIDo9IGlwcm90LlJlYWRNYXBFbmQoKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gZm10LkVycm9yZihcImVycm9yIHJlYWRpbmcgbWFwIGVuZDogJXNcIiwgZXJyKSIgPDwgZW5kbCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgZXJyIDo9IGlwcm90LlJlYWRTZXRFbmQoKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gZm10LkVycm9yZihcImVycm9yIHJlYWRpbmcgc2V0IGVuZDogJXNcIiwgZXJyKSIgPDwgZW5kbCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICAgIG91dCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgImlmIGVyciA6PSBpcHJvdC5SZWFkTGlzdEVuZCgpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiBmbXQuRXJyb3JmKFwiZXJyb3IgcmVhZGluZyBsaXN0IGVuZDogJXNcIiwgZXJyKSIgPDwgZW5kbCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotfQotCi0KLS8qKgotICogR2VuZXJhdGVzIGNvZGUgdG8gZGVzZXJpYWxpemUgYSBtYXAKLSAqLwotdm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgdF9tYXAqIHRtYXAsCi0gICAgICAgIGJvb2wgICBkZWNsYXJlLAotICAgICAgICBzdHJpbmcgcHJlZml4KQotewotICAgICh2b2lkKSBkZWNsYXJlOwotICAgIHN0cmluZyBrZXkgPSB0bXAoIl9rZXkiKTsKLSAgICBzdHJpbmcgdmFsID0gdG1wKCJfdmFsIik7Ci0gICAgdF9maWVsZCBma2V5KHRtYXAtPmdldF9rZXlfdHlwZSgpLCBrZXkpOwotICAgIHRfZmllbGQgZnZhbCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdmFsKTsKLSAgICBma2V5LnNldF9yZXEodF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVCk7Ci0gICAgZnZhbC5zZXRfcmVxKHRfZmllbGQ6OlRfT1BUX0lOX1JFUV9PVVQpOwotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZrZXksIHRydWUsICIiLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZ2YWwsIHRydWUsICIiLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAgICAgICAgIHByZWZpeCA8PCAiWyIgPDwga2V5IDw8ICJdID0gIiA8PCB2YWwgPDwgZW5kbDsKLQotfQotCi0vKioKLSAqIFdyaXRlIGEgc2V0IGVsZW1lbnQKLSAqLwotdm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgdF9zZXQqIHRzZXQsCi0gICAgICAgIGJvb2wgICBkZWNsYXJlLAotICAgICAgICBzdHJpbmcgcHJlZml4KQotewotICAgICh2b2lkKSBkZWNsYXJlOwotICAgIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOwotICAgIHRfZmllbGQgZmVsZW0odHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKLSAgICBmZWxlbS5zZXRfcmVxKHRfZmllbGQ6OlRfT1BUX0lOX1JFUV9PVVQpOwotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtLCB0cnVlLCAiIik7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgICAgICAgICBwcmVmaXggPDwgIlsiIDw8IGVsZW0gPDwgIl0gPSB0cnVlIiA8PCBlbmRsOwotfQotCi0vKioKLSAqIFdyaXRlIGEgbGlzdCBlbGVtZW50Ci0gKi8KLXZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvZnN0cmVhbSAmb3V0LAotICAgICAgICB0X2xpc3QqIHRsaXN0LAotICAgICAgICBib29sICAgZGVjbGFyZSwKLSAgICAgICAgc3RyaW5nIHByZWZpeCkKLXsKLSAgICAodm9pZCkgZGVjbGFyZTsKLSAgICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKLSAgICB0X2ZpZWxkIGZlbGVtKCgodF9saXN0Kil0bGlzdCktPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7Ci0gICAgZmVsZW0uc2V0X3JlcSh0X2ZpZWxkOjpUX09QVF9JTl9SRVFfT1VUKTsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSwgdHJ1ZSwgIiIsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICAgICAgICAgcHJlZml4IDw8ICIgPSBhcHBlbmQoIiA8PCBwcmVmaXggPDwgIiwgIiA8PCBlbGVtIDw8ICIpIiA8PCBlbmRsOwotfQotCi0KLS8qKgotICogU2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgotICoKLSAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkIHRvIHNlcmlhbGl6ZQotICogQHBhcmFtIHByZWZpeCBOYW1lIHRvIHByZXBlbmQgdG8gZmllbGQgbmFtZQotICovCi12b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICBzdHJpbmcgcHJlZml4LAotICAgICAgICBib29sIGlua2V5KQotewotICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLSAgICBzdHJpbmcgbmFtZShwcmVmaXggKyBwdWJsaWNpemUodmFyaWFibGVfbmFtZV90b19nb19uYW1lKHRmaWVsZC0+Z2V0X25hbWUoKSkpKTsKLQotICAgIC8vIERvIG5vdGhpbmcgZm9yIHZvaWQgdHlwZXMKLSAgICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IGdlbmVyYXRlIHNlcmlhbGl6ZSBmb3Igdm9pZCB0eXBlOiAiICsgbmFtZTsKLSAgICB9Ci0KLSAgICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodF9zdHJ1Y3QqKXR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX3BvaW50ZXJfZmllbGQodGZpZWxkKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAgICAgICAgICAgICAiaWYgZXJyIDo9IG9wcm90LiI7Ci0KLSAgICAgICAgaWYgKGlzX3BvaW50ZXJfZmllbGQodGZpZWxkKSkgewotICAgICAgICAgICAgbmFtZSA9ICIqIiArIG5hbWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgICAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLQotICAgICAgICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICAgICAgICAgIHRocm93Ci0gICAgICAgICAgICAgICAgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgICAgICAgICBpZiAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpICYmICFpbmtleSkgewotICAgICAgICAgICAgICAgICAgICBvdXQgPDwgIldyaXRlQmluYXJ5KCIgPDwgbmFtZSA8PCAiKSI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgb3V0IDw8ICJXcml0ZVN0cmluZyhzdHJpbmcoIiA8PCBuYW1lIDw8ICIpKSI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgICAgICAgICBvdXQgPDwgIldyaXRlQm9vbChib29sKCIgPDwgbmFtZSA8PCAiKSkiOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgICAgICAgICAgb3V0IDw8ICJXcml0ZUJ5dGUoYnl0ZSgiIDw8IG5hbWUgPDwgIikpIjsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgICAgICAgICAgb3V0IDw8ICJXcml0ZUkxNihpbnQxNigiIDw8IG5hbWUgPDwgIikpIjsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgICAgICAgICAgb3V0IDw8ICJXcml0ZUkzMihpbnQzMigiIDw8IG5hbWUgPDwgIikpIjsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgICAgICAgICAgb3V0IDw8ICJXcml0ZUk2NChpbnQ2NCgiIDw8IG5hbWUgPDwgIikpIjsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgICAgICAgICAgb3V0IDw8ICJXcml0ZURvdWJsZShmbG9hdDY0KCIgPDwgbmFtZSA8PCAiKSkiOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gR28gbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgICAgICAgb3V0IDw8ICJXcml0ZUkzMihpbnQzMigiIDw8IG5hbWUgPDwgIikpIjsKLSAgICAgICAgfQotCi0gICAgICAgIG91dCA8PCAiOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGwKLSAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gZm10LkVycm9yZihcIiVULiIgPDwgZXNjYXBlX3N0cmluZyh0ZmllbGQtPmdldF9uYW1lKCkpCi0gICAgICAgICAgICA8PCAiICgiIDw8IHRmaWVsZC0+Z2V0X2tleSgpIDw8ICIpIGZpZWxkIHdyaXRlIGVycm9yOiAlc1wiLCBwLCBlcnIpIH0iIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBJbnZhbGlkIHR5cGUgaW4gZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkICciICsgdHlwZS0+Z2V0X25hbWUoKSArICInIGZvciBmaWVsZCAnIiArIG5hbWUgKyAiJyI7Ci0gICAgfQotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgYWxsIHRoZSBtZW1iZXJzIG9mIGEgc3RydWN0LgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgdG8gc2VyaWFsaXplCi0gKiBAcGFyYW0gcHJlZml4ICBTdHJpbmcgcHJlZml4IHRvIGF0dGFjaCB0byBhbGwgZmllbGRzCi0gKi8KLXZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgIHN0cmluZyBwcmVmaXgpCi17Ci0gICAgKHZvaWQpIHRzdHJ1Y3Q7Ci0gICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiBlcnIgOj0gIiA8PCBwcmVmaXggPDwgIi5Xcml0ZShvcHJvdCk7IGVyciAhPSBuaWwgeyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gZm10LkVycm9yZihcIiVUIGVycm9yIHdyaXRpbmcgc3RydWN0OiAlc1wiLCAiIDw8IHByZWZpeCA8PCAiLCBlcnIpIiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotfQotCi12b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtICZvdXQsCi0gICAgICAgIHRfdHlwZSogdHR5cGUsCi0gICAgICAgIGJvb2wgcG9pbnRlcl9maWVsZCwKLSAgICAgICAgc3RyaW5nIHByZWZpeCkKLXsKLSAgICBpZiAocG9pbnRlcl9maWVsZCkgewotICAgICAgICBwcmVmaXggPSAiKiIgKyBwcmVmaXg7Ci0gICAgfQotICAgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgZXJyIDo9IG9wcm90LldyaXRlTWFwQmVnaW4oIiA8PAotICAgICAgICAgICAgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgICAgICAgIHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICAgICAgICAibGVuKCIgPDwgcHJlZml4IDw8ICIpKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gZm10LkVycm9yZihcImVycm9yIHdyaXRpbmcgbWFwIGJlZ2luOiAlc1wiLCBlcnIpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgICAgICBvdXQgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICJpZiBlcnIgOj0gb3Byb3QuV3JpdGVTZXRCZWdpbigiIDw8Ci0gICAgICAgICAgICB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgICAgICAgICJsZW4oIiA8PCBwcmVmaXggPDwgIikpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiBmbXQuRXJyb3JmKFwiZXJyb3Igd3JpdGluZyBzZXQgYmVnaW46ICVzXCIsIGVycikiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgICBvdXQgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICJpZiBlcnIgOj0gb3Byb3QuV3JpdGVMaXN0QmVnaW4oIiA8PAotICAgICAgICAgICAgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgICAgICAgImxlbigiIDw8IHByZWZpeCA8PCAiKSk7IGVyciAhPSBuaWwgeyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGZtdC5FcnJvcmYoXCJlcnJvciB3cml0aW5nIGxpc3QgYmVnaW46ICVzXCIsIGVycikiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogSW52YWxpZCB0eXBlIGluIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIgJyIgKyB0dHlwZS0+Z2V0X25hbWUoKSArICInIGZvciBwcmVmaXggJyIgKyBwcmVmaXggKyAiJyI7Ci0gICAgfQotCi0gICAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgICAgICB0X21hcCogdG1hcCA9ICh0X21hcCopdHR5cGU7Ci0gICAgICAgIG91dCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgImZvciBrLCB2IDo9IHJhbmdlICIgPDwgcHJlZml4IDw8ICIgeyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsIHRtYXAsICJrIiwgInYiKTsKLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgICAgdF9zZXQqIHRzZXQgPSAodF9zZXQqKXR0eXBlOwotICAgICAgICBvdXQgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICJmb3IgdiwgXyA6PSByYW5nZSAiIDw8IHByZWZpeCA8PCAiIHsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF91cCgpOwotICAgICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCB0c2V0LCAidiIpOwotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgICAgdF9saXN0KiB0bGlzdCA9ICh0X2xpc3QqKXR0eXBlOwotICAgICAgICBvdXQgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICJmb3IgXywgdiA6PSByYW5nZSAiIDw8IHByZWZpeCA8PCAiIHsiIDw8IGVuZGw7Ci0KLSAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCB0bGlzdCwgInYiKTsKLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgICAgICBvdXQgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICJpZiBlcnIgOj0gb3Byb3QuV3JpdGVNYXBFbmQoKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gZm10LkVycm9yZihcImVycm9yIHdyaXRpbmcgbWFwIGVuZDogJXNcIiwgZXJyKSIgPDwgZW5kbCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgZXJyIDo9IG9wcm90LldyaXRlU2V0RW5kKCk7IGVyciAhPSBuaWwgeyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGZtdC5FcnJvcmYoXCJlcnJvciB3cml0aW5nIHNldCBlbmQ6ICVzXCIsIGVycikiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgICBvdXQgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICJpZiBlcnIgOj0gb3Byb3QuV3JpdGVMaXN0RW5kKCk7IGVyciAhPSBuaWwgeyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGZtdC5FcnJvcmYoXCJlcnJvciB3cml0aW5nIGxpc3QgZW5kOiAlc1wiLCBlcnIpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIG1hcC4KLSAqCi0gKi8KLXZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSAmb3V0LAotICAgICAgICB0X21hcCogdG1hcCwKLSAgICAgICAgc3RyaW5nIGtpdGVyLAotICAgICAgICBzdHJpbmcgdml0ZXIpCi17Ci0gICAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksICIiKTsKLSAgICB0X2ZpZWxkIHZmaWVsZCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgIiIpOwotICAgIGtmaWVsZC5zZXRfcmVxKHRfZmllbGQ6OlRfT1BUX0lOX1JFUV9PVVQpOwotICAgIHZmaWVsZC5zZXRfcmVxKHRfZmllbGQ6OlRfT1BUX0lOX1JFUV9PVVQpOwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZrZmllbGQsIGtpdGVyLCB0cnVlKTsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmdmZpZWxkLCB2aXRlcik7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIHNldC4KLSAqLwotdm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9mc3RyZWFtICZvdXQsCi0gICAgICAgIHRfc2V0KiB0c2V0LAotICAgICAgICBzdHJpbmcgcHJlZml4KQotewotICAgIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgIiIpOwotICAgIGVmaWVsZC5zZXRfcmVxKHRfZmllbGQ6OlRfT1BUX0lOX1JFUV9PVVQpOwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsIHByZWZpeCk7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIGxpc3QuCi0gKi8KLXZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgdF9saXN0KiB0bGlzdCwKLSAgICAgICAgc3RyaW5nIHByZWZpeCkKLXsKLSAgICB0X2ZpZWxkIGVmaWVsZCh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCAiIik7Ci0gICAgZWZpZWxkLnNldF9yZXEodF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVCk7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgcHJlZml4KTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgdGhlIGRvY3N0cmluZyBmb3IgYSBnaXZlbiBzdHJ1Y3QuCi0gKi8KLXZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2dvX2RvY3N0cmluZyhvZnN0cmVhbSYgb3V0LAotICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkKLXsKLSAgICBnZW5lcmF0ZV9nb19kb2NzdHJpbmcob3V0LCB0c3RydWN0LCB0c3RydWN0LCAiQXR0cmlidXRlcyIpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyB0aGUgZG9jc3RyaW5nIGZvciBhIGdpdmVuIGZ1bmN0aW9uLgotICovCi12b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nb19kb2NzdHJpbmcob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKQotewotICAgIGdlbmVyYXRlX2dvX2RvY3N0cmluZyhvdXQsIHRmdW5jdGlvbiwgdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLCAiUGFyYW1ldGVycyIpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyB0aGUgZG9jc3RyaW5nIGZvciBhIHN0cnVjdCBvciBmdW5jdGlvbi4KLSAqLwotdm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ29fZG9jc3RyaW5nKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgIHRfZG9jKiAgICB0ZG9jLAotICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgY29uc3QgY2hhciogc3ViaGVhZGVyKQotewotICAgIGJvb2wgaGFzX2RvYyA9IGZhbHNlOwotICAgIHN0cmluZ3N0cmVhbSBzczsKLQotICAgIGlmICh0ZG9jLT5oYXNfZG9jKCkpIHsKLSAgICAgICAgaGFzX2RvYyA9IHRydWU7Ci0gICAgICAgIHNzIDw8IHRkb2MtPmdldF9kb2MoKTsKLSAgICB9Ci0KLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotCi0gICAgaWYgKGZpZWxkcy5zaXplKCkgPiAwKSB7Ci0gICAgICAgIGlmIChoYXNfZG9jKSB7Ci0gICAgICAgICAgICBzcyA8PCBlbmRsOwotICAgICAgICB9Ci0KLSAgICAgICAgaGFzX2RvYyA9IHRydWU7Ci0gICAgICAgIHNzIDw8IHN1YmhlYWRlciA8PCAiOlxuIjsKLSAgICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgcF9pdGVyOwotCi0gICAgICAgIGZvciAocF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IHBfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrcF9pdGVyKSB7Ci0gICAgICAgICAgICB0X2ZpZWxkKiBwID0gKnBfaXRlcjsKLSAgICAgICAgICAgIHNzIDw8ICIgLSAiIDw8IHB1YmxpY2l6ZSh2YXJpYWJsZV9uYW1lX3RvX2dvX25hbWUocC0+Z2V0X25hbWUoKSkpOwotCi0gICAgICAgICAgICBpZiAocC0+aGFzX2RvYygpKSB7Ci0gICAgICAgICAgICAgICAgc3MgPDwgIjogIiA8PCBwLT5nZXRfZG9jKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNzIDw8IGVuZGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoaGFzX2RvYykgewotICAgICAgICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLy8gIiwgc3Muc3RyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiKTsKLSAgICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIHRoZSBkb2NzdHJpbmcgZm9yIGEgZ2VuZXJpYyBvYmplY3QuCi0gKi8KLXZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2dvX2RvY3N0cmluZyhvZnN0cmVhbSYgb3V0LAotICAgICAgICB0X2RvYyogdGRvYykKLXsKLSAgICBpZiAodGRvYy0+aGFzX2RvYygpKSB7Ci0gICAgICAgIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvLyIsIHRkb2MtPmdldF9kb2MoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIpOwotICAgIH0KLX0KLQotLyoqCi0gKiBEZWNsYXJlcyBhbiBhcmd1bWVudCwgd2hpY2ggbWF5IGluY2x1ZGUgaW5pdGlhbGl6YXRpb24gYXMgbmVjZXNzYXJ5LgotICoKLSAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkCi0gKi8KLXN0cmluZyB0X2dvX2dlbmVyYXRvcjo6ZGVjbGFyZV9hcmd1bWVudCh0X2ZpZWxkKiB0ZmllbGQpCi17Ci0gICAgc3RkOjpvc3RyaW5nc3RyZWFtIHJlc3VsdDsKLSAgICByZXN1bHQgPDwgcHVibGljaXplKHRmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIj0iOwotCi0gICAgaWYgKHRmaWVsZC0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgewotICAgICAgICByZXN1bHQgPDwgInRocmlmdF9zcGVjWyIgPDwKLSAgICAgICAgICAgICAgIHRmaWVsZC0+Z2V0X2tleSgpIDw8ICJdWzRdIjsKLSAgICB9IGVsc2UgewotICAgICAgICByZXN1bHQgPDwgIm5pbCI7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdC5zdHIoKTsKLX0KLQotLyoqCi0gKiBSZW5kZXJzIGEgc3RydWN0IGZpZWxkIGluaXRpYWwgdmFsdWUuCi0gKgotICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQsIHdoaWNoIG11c3QgaGF2ZSBgdGZpZWxkLT5nZXRfdmFsdWUoKSAhPSBOVUxMYAotICovCi1zdHJpbmcgdF9nb19nZW5lcmF0b3I6OnJlbmRlcl9maWVsZF9pbml0aWFsX3ZhbHVlKHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG9wdGlvbmFsX2ZpZWxkKQotewotICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLQotICAgIGlmIChvcHRpb25hbF9maWVsZCkgewotICAgICAgICAvLyBUaGUgY2FsbGVyIHdpbGwgbWFrZSBhIHNlY29uZCBwYXNzIGZvciBvcHRpb25hbCBmaWVsZHMsCi0gICAgICAgIC8vIGFzc2lnbmluZyB0aGUgcmVzdWx0IG9mIHJlbmRlcl9jb25zdF92YWx1ZSB0byAiKmZpZWxkX25hbWUiLiBJdAotICAgICAgICAvLyBpcyBtYWRkZW5pbmcgdGhhdCBHbyBzeW50YXggZG9lcyBub3QgYWxsb3cgZm9yIGEgdHlwZS1hZ25vc3RpYwotICAgICAgICAvLyB3YXkgdG8gaW5pdGlhbGl6ZSBhIHBvaW50ZXIgdG8gYSBjb25zdCB2YWx1ZSwgYnV0IHNvIGl0IGdvZXMuCi0gICAgICAgIC8vIFRoZSBhbHRlcm5hdGl2ZSB3b3VsZCBiZSB0byB3cml0ZSB0eXBlIHNwZWNpZmljIGZ1bmN0aW9ucyB0aGF0Ci0gICAgICAgIC8vIGNvbnZlcnQgZnJvbSBjb25zdCB2YWx1ZXMgdG8gcG9pbnRlciB0eXBlcywgYnV0IGdpdmVuIHRoZSBsYWNrCi0gICAgICAgIC8vIG9mIG92ZXJsb2FkaW5nIGl0IHdvdWxkIGJlIG1lc3N5LgotICAgICAgICByZXR1cm4gIm5ldygiICsgdHlwZV90b19nb190eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSkgKyAiKSI7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIHJlbmRlcl9jb25zdF92YWx1ZSh0eXBlLCB0ZmllbGQtPmdldF92YWx1ZSgpLCBuYW1lKTsKLSAgICB9Ci19Ci0KLS8qKgotICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAndHlwZSBuYW1lKGFyZ3MpJwotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgotICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgotICovCi1zdHJpbmcgdF9nb19nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCi0gICAgICAgIHN0cmluZyBwcmVmaXgpCi17Ci0gICAgLy8gVE9ETyhtY3NsZWUpOiBOaXRwaWNreSwgbm8gJywnIGlmIGFyZ3VtZW50X2xpc3QgaXMgZW1wdHkKLSAgICByZXR1cm4KLSAgICAgICAgcHVibGljaXplKHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgKwotICAgICAgICAiKCIgKyBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSkgKyAiKSI7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhbiBpbnRlcmZhY2UgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd0eXBlIG5hbWUoYXJncyknCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCi0gKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCi0gKi8KLXN0cmluZyB0X2dvX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlX2lmKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKLSAgICAgICAgc3RyaW5nIHByZWZpeCwKLSAgICAgICAgYm9vbCBhZGRFcnJvcikKLXsKLSAgICAvLyBUT0RPKG1jc2xlZSk6IE5pdHBpY2t5LCBubyAnLCcgaWYgYXJndW1lbnRfbGlzdCBpcyBlbXB0eQotICAgIHN0cmluZyBzaWduYXR1cmUgPSBwdWJsaWNpemUocHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSArICIoIjsKLSAgICBzaWduYXR1cmUgKz0gYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpICsgIikgKCI7Ci0gICAgdF90eXBlKiByZXQgPSB0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCk7Ci0gICAgdF9zdHJ1Y3QqIGV4Y2VwdGlvbnMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgICBzdHJpbmcgZXJycyA9IGFyZ3VtZW50X2xpc3QoZXhjZXB0aW9ucyk7Ci0KLSAgICBpZiAoIXJldC0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIHNpZ25hdHVyZSArPSAiciAiICsgdHlwZV90b19nb190eXBlKHJldCk7Ci0KLSAgICAgICAgaWYgKGFkZEVycm9yIHx8IGVycnMuc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgIHNpZ25hdHVyZSArPSAiLCAiOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGFkZEVycm9yKSB7Ci0gICAgICAgIHNpZ25hdHVyZSArPSAiZXJyIGVycm9yIjsKLSAgICB9Ci0KLSAgICBzaWduYXR1cmUgKz0gIikiOwotICAgIHJldHVybiBzaWduYXR1cmU7Ci19Ci0KLQotLyoqCi0gKiBSZW5kZXJzIGEgZmllbGQgbGlzdAotICovCi1zdHJpbmcgdF9nb19nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpCi17Ci0gICAgc3RyaW5nIHJlc3VsdCA9ICIiOwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotCi0gICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVzdWx0ICs9ICIsICI7Ci0gICAgICAgIH0KLQotICAgICAgICByZXN1bHQgKz0gdmFyaWFibGVfbmFtZV90b19nb19uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgKyAiICIgKyB0eXBlX3RvX2dvX3R5cGUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1zdHJpbmcgdF9nb19nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlKQotewotICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR0eXBlLT5nZXRfcHJvZ3JhbSgpOwotCi0gICAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7Ci0gICAgICAgIHN0cmluZyBtb2R1bGUoZ2V0X3JlYWxfZ29fbW9kdWxlKHByb2dyYW0pKTsKLSAgICAgICAgLy8gZm9yIG5hbWVzcGFjZWQgaW5jbHVkZXMsIG9ubHkga2VlcCBwYXJ0IGFmdGVyIGRvdC4KLSAgICAgICAgc2l6ZV90IGRvdCA9IG1vZHVsZS5yZmluZCgnLicpOwotICAgICAgICBpZiAoZG90ICE9IHN0cmluZzo6bnBvcykgewotICAgICAgICAgICAgbW9kdWxlID0gbW9kdWxlLnN1YnN0cihkb3QgKyAxKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbW9kdWxlICsgIi4iICsgdHR5cGUtPmdldF9uYW1lKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHR0eXBlLT5nZXRfbmFtZSgpOwotfQotCi0vKioKLSAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgZ28gdHlvZQotICovCi1zdHJpbmcgdF9nb19nZW5lcmF0b3I6OnR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpCi17Ci0gICAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0KLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotCi0gICAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOwotCi0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICAgICAgLyogdGhpcyBpcyB3cm9uZywgYmluYXJ5IGlzIHN0aWxsIGEgc3RyaW5nIHR5cGUgaW50ZXJuYWxseQotICAgICAgICAgICAgaWYgKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiAidGhyaWZ0LkJJTkFSWSI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAqLwotICAgICAgICAgICAgcmV0dXJuICJ0aHJpZnQuU1RSSU5HIjsKLQotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgICAgICByZXR1cm4gInRocmlmdC5CT09MIjsKLQotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgICAgICByZXR1cm4gInRocmlmdC5CWVRFIjsKLQotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgICAgIHJldHVybiAidGhyaWZ0LkkxNiI7Ci0KLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgICAgICByZXR1cm4gInRocmlmdC5JMzIiOwotCi0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICAgICAgcmV0dXJuICJ0aHJpZnQuSTY0IjsKLQotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgICAgIHJldHVybiAidGhyaWZ0LkRPVUJMRSI7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgICByZXR1cm4gInRocmlmdC5JMzIiOwotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgICAgICByZXR1cm4gInRocmlmdC5TVFJVQ1QiOwotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICAgICAgcmV0dXJuICJ0aHJpZnQuTUFQIjsKLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgICAgIHJldHVybiAidGhyaWZ0LlNFVCI7Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgICAgcmV0dXJuICJ0aHJpZnQuTElTVCI7Ci0gICAgfQotCi0gICAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotfQotCi0KLS8qKgotICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBnbyBtYXAgdHlwZSwgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24gaWYgaXQgd2lsbAotICogbm90IHByb2R1Y2UgYSB2YWxpZCBnbyBtYXAgdHlwZS4KLSAqLwotc3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjp0eXBlX3RvX2dvX2tleV90eXBlKHRfdHlwZSogdHlwZSkKLXsKLSAgICB0X3R5cGUqIHJlc29sdmVkX3R5cGUgPSB0eXBlOwotCi0gICAgd2hpbGUgKHJlc29sdmVkX3R5cGUtPmlzX3R5cGVkZWYoKSkgewotICAgICAgICByZXNvbHZlZF90eXBlID0gKCh0X3R5cGVkZWYqKXJlc29sdmVkX3R5cGUpLT5nZXRfdHlwZSgpLT5nZXRfdHJ1ZV90eXBlKCk7Ci0gICAgfQotCi0gICAgaWYgKHJlc29sdmVkX3R5cGUtPmlzX21hcCgpIHx8IHJlc29sdmVkX3R5cGUtPmlzX2xpc3QoKSB8fCByZXNvbHZlZF90eXBlLT5pc19zZXQoKSkgewotICAgICAgICB0aHJvdyAiQ2Fubm90IHByb2R1Y2UgYSB2YWxpZCB0eXBlIGZvciBhIEdvIG1hcCBrZXk6ICIgICsgdHlwZV90b19nb190eXBlKHR5cGUpICsgIiAtIGFib3J0aW5nLiI7Ci0gICAgfQotCi0gICAgaWYgKHJlc29sdmVkX3R5cGUtPmlzX3N0cmluZygpICYmCi0gICAgICAgICgodF9iYXNlX3R5cGUqKSByZXNvbHZlZF90eXBlKS0+aXNfYmluYXJ5KCkpCi0gICAgICAgIHJldHVybiAic3RyaW5nIjsKLQotICAgIHJldHVybiB0eXBlX3RvX2dvX3R5cGUodHlwZSwgdHJ1ZSk7Ci19Ci0KLS8qKgotICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBnbyB0eXBlCi0gKi8KLXN0cmluZyB0X2dvX2dlbmVyYXRvcjo6dHlwZV90b19nb190eXBlKHRfdHlwZSogdHlwZSwgYm9vbCBpc19jb250YWluZXJfdmFsdWUpIHsKLSAgICByZXR1cm4gdHlwZV90b19nb190eXBlX3dpdGhfb3B0KHR5cGUsIGZhbHNlLCBpc19jb250YWluZXJfdmFsdWUpOwotfQotCi0vKioKLSAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgZ28gdHlwZSwgdGFraW5nIGludG8gYWNjb3VudCB3aGV0aGVyIHRoZSBmaWVsZAotICogYXNzb2NpYXRlZCB3aXRoIHRoZSB0eXBlIGlzIFRfT1BUSU9OQUwuCi0gKi8KLXN0cmluZyB0X2dvX2dlbmVyYXRvcjo6dHlwZV90b19nb190eXBlX3dpdGhfb3B0KHRfdHlwZSogdHlwZSwgYm9vbCBvcHRpb25hbF9maWVsZCwgYm9vbCBpc19jb250YWluZXJfdmFsdWUpCi17Ci0JKHZvaWQpIGlzX2NvbnRhaW5lcl92YWx1ZTsKLQlzdHJpbmcgbWF5YmVfcG9pbnRlcihvcHRpb25hbF9maWVsZCA/ICIqIiA6ICIiKTsKLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotCi0gICAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICAgICAgdGhyb3cgIiI7Ci0KLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgICAgICBpZiAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1heWJlX3BvaW50ZXIgKyAiW11ieXRlIjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG1heWJlX3BvaW50ZXIgKyAic3RyaW5nIjsKLQotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgICAgICByZXR1cm4gbWF5YmVfcG9pbnRlciArICJib29sIjsKLQotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgICAgICByZXR1cm4gbWF5YmVfcG9pbnRlciArICJpbnQ4IjsKLQotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgICAgIHJldHVybiBtYXliZV9wb2ludGVyICsgImludDE2IjsKLQotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgICAgIHJldHVybiBtYXliZV9wb2ludGVyICsgImludDMyIjsKLQotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgICAgIHJldHVybiBtYXliZV9wb2ludGVyICsgImludDY0IjsKLQotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgICAgIHJldHVybiBtYXliZV9wb2ludGVyICsgImZsb2F0NjQiOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgICAgcmV0dXJuIG1heWJlX3BvaW50ZXIgKyBwdWJsaWNpemUodHlwZV9uYW1lKHR5cGUpKTsKLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICAgICAgcmV0dXJuICIqIiArIHB1YmxpY2l6ZSh0eXBlX25hbWUodHlwZSkpOwotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICAgICAgdF9tYXAqIHQgPSAodF9tYXAqKXR5cGU7Ci0gICAgICAgIHN0cmluZyBrZXlUeXBlID0gdHlwZV90b19nb19rZXlfdHlwZSh0LT5nZXRfa2V5X3R5cGUoKSk7Ci0gICAgICAgIHN0cmluZyB2YWx1ZVR5cGUgPSB0eXBlX3RvX2dvX3R5cGUodC0+Z2V0X3ZhbF90eXBlKCksIHRydWUpOwotICAgICAgICByZXR1cm4gbWF5YmVfcG9pbnRlciArIHN0cmluZygibWFwWyIpICsga2V5VHlwZSArICJdIiArIHZhbHVlVHlwZTsKLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgICAgIHRfc2V0KiB0ID0gKHRfc2V0Kil0eXBlOwotICAgICAgICBzdHJpbmcgZWxlbVR5cGUgPSB0eXBlX3RvX2dvX2tleV90eXBlKHQtPmdldF9lbGVtX3R5cGUoKS0+Z2V0X3RydWVfdHlwZSgpKTsKLSAgICAgICAgcmV0dXJuIG1heWJlX3BvaW50ZXIgKyBzdHJpbmcoIm1hcFsiKSArIGVsZW1UeXBlICsgc3RyaW5nKCJdYm9vbCIpOwotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICAgIHRfbGlzdCogdCA9ICh0X2xpc3QqKXR5cGU7Ci0gICAgICAgIHN0cmluZyBlbGVtVHlwZSA9IHR5cGVfdG9fZ29fdHlwZSh0LT5nZXRfZWxlbV90eXBlKCktPmdldF90cnVlX3R5cGUoKSwgdHJ1ZSk7Ci0gICAgICAgIHJldHVybiBtYXliZV9wb2ludGVyICsgc3RyaW5nKCJbXSIpICsgZWxlbVR5cGU7Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc190eXBlZGVmKCkpIHsKLSAgICAgICAgcmV0dXJuIG1heWJlX3BvaW50ZXIgKyBwdWJsaWNpemUodHlwZV9uYW1lKHR5cGUpKTsKLSAgICB9Ci0KLSAgICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZ29fdHlwZTogIiArIHR5cGUtPmdldF9uYW1lKCk7Ci19Ci0KLS8qKiBTZWUgdGhlIGNvbW1lbnQgaW5zaWRlIGdlbmVyYXRlX2dvX3N0cnVjdF9kZWZpbml0aW9uIGZvciB3aGF0IHRoaXMgaXMuICovCi1zdHJpbmcgdF9nb19nZW5lcmF0b3I6OnR5cGVfdG9fc3BlY19hcmdzKHRfdHlwZSogdHR5cGUpCi17Ci0gICAgd2hpbGUgKHR0eXBlLT5pc190eXBlZGVmKCkpIHsKLSAgICAgICAgdHR5cGUgPSAoKHRfdHlwZWRlZiopdHR5cGUpLT5nZXRfdHlwZSgpOwotICAgIH0KLQotICAgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgICByZXR1cm4gIm5pbCI7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICAgICAgcmV0dXJuICIoIiArIHR5cGVfbmFtZSh0dHlwZSkgKyAiLCAiICsgdHlwZV9uYW1lKHR0eXBlKSArICIudGhyaWZ0X3NwZWMpIjsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgICAgICByZXR1cm4gIigiICsKLSAgICAgICAgICAgICAgIHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKSArICIsIiArCi0gICAgICAgICAgICAgICB0eXBlX3RvX3NwZWNfYXJncygoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKSArICIsIiArCi0gICAgICAgICAgICAgICB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgKyAiLCIgKwotICAgICAgICAgICAgICAgdHlwZV90b19zcGVjX2FyZ3MoKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgKwotICAgICAgICAgICAgICAgIikiOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgICAgIHJldHVybiAiKCIgKwotICAgICAgICAgICAgICAgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSArICIsIiArCi0gICAgICAgICAgICAgICB0eXBlX3RvX3NwZWNfYXJncygoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgKwotICAgICAgICAgICAgICAgIikiOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgICByZXR1cm4gIigiICsKLSAgICAgICAgICAgICAgIHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpICsgIiwiICsKLSAgICAgICAgICAgICAgIHR5cGVfdG9fc3BlY19hcmdzKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgKwotICAgICAgICAgICAgICAgIikiOwotICAgIH0KLQotICAgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19zcGVjX2FyZ3M6ICIgKyB0dHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotYm9vbCBmb3JtYXRfZ29fb3V0cHV0KGNvbnN0IHN0cmluZyAmZmlsZV9wYXRoKQotewotICAgIGNvbnN0IHN0cmluZyBjb21tYW5kID0gImdvZm10IC13ICIgKyBmaWxlX3BhdGg7Ci0KLSAgICBpZiAoc3lzdGVtKGNvbW1hbmQuY19zdHIoKSkgPT0gMCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBmcHJpbnRmKHN0ZGVyciwgIldBUk5JTkcgLSBSdW5uaW5nICclcycgZmFpbGVkLlxuIiwgY29tbWFuZC5jX3N0cigpKTsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLQotVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUihnbywgIkdvIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBwYWNrYWdlX3ByZWZpeD0gUGFja2FnZSBwcmVmaXggZm9yIGdlbmVyYXRlZCBmaWxlcy5cbiIgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIHRocmlmdF9pbXBvcnQ9ICBPdmVycmlkZSB0aHJpZnQgcGFja2FnZSBpbXBvcnQgcGF0aCAoZGVmYXVsdDoiICsgZGVmYXVsdF90aHJpZnRfaW1wb3J0ICsgIilcbiIgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIHBhY2thZ2U9ICBQYWNrYWdlIG5hbWUgKGRlZmF1bHQ6IGluZmVycmVkIGZyb20gdGhyaWZ0IGZpbGUgbmFtZSlcbiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfZ3ZfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2d2X2dlbmVyYXRvci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZjOWQzOC4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfZ3ZfZ2VuZXJhdG9yLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzQ1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8bGlzdD4KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlICJ0X2dlbmVyYXRvci5oIgotI2luY2x1ZGUgInBsYXRmb3JtLmgiCi0KLXVzaW5nIHN0ZDo6bWFwOwotdXNpbmcgc3RkOjpvZnN0cmVhbTsKLXVzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKLXVzaW5nIHN0ZDo6cGFpcjsKLXVzaW5nIHN0ZDo6c3RyaW5nOwotdXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07Ci11c2luZyBzdGQ6OnZlY3RvcjsKLQotc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsID0gIlxuIjsgIC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKLQotLyoqCi0gKiBHcmFwaHZpeiBjb2RlIGdlbmVyYXRvcgotICovCi1jbGFzcyB0X2d2X2dlbmVyYXRvciA6IHB1YmxpYyB0X2dlbmVyYXRvciB7Ci0gIHB1YmxpYzoKLSAgICB0X2d2X2dlbmVyYXRvcigKLSAgICAgICAgdF9wcm9ncmFtKiBwcm9ncmFtLAotICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKLSAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCi0gICAgICA6IHRfZ2VuZXJhdG9yKHByb2dyYW0pCi0gICAgewotICAgICAgKHZvaWQpIHBhcnNlZF9vcHRpb25zOwotICAgICAgKHZvaWQpIG9wdGlvbl9zdHJpbmc7Ci0gICAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1ndiI7Ci0KLSAgICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7Ci0gICAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgiZXhjZXB0aW9ucyIpOwotICAgICAgZXhjZXB0aW9uX2Fycm93cyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbml0IGFuZCBlbmQgb2YgZ2VuZXJhdG9yCi0gICAgICovCi0gICAgdm9pZCBpbml0X2dlbmVyYXRvcigpOwotICAgIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7Ci0KLSAgICAvKioKLSAgICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCi0gICAgICovCi0gICAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmICh0X3R5cGVkZWYqICB0dHlwZWRlZik7Ci0gICAgdm9pZCBnZW5lcmF0ZV9lbnVtICAgICh0X2VudW0qICAgICB0ZW51bSk7Ci0gICAgdm9pZCBnZW5lcmF0ZV9jb25zdCAgICh0X2NvbnN0KiAgICB0Y29uc3QpOwotICAgIHZvaWQgZ2VuZXJhdGVfc3RydWN0ICAodF9zdHJ1Y3QqICAgdHN0cnVjdCk7Ci0gICAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlICh0X3NlcnZpY2UqICB0c2VydmljZSk7Ci0KLSAgcHJvdGVjdGVkOgotICAgIC8qKgotICAgICAqIEhlbHBlcnMKLSAgICAgKi8KLSAgICB2b2lkIHByaW50X3R5cGUodF90eXBlKiB0dHlwZSwgc3RyaW5nIHN0cnVjdF9maWVsZF9yZWYpOwotICAgIHZvaWQgcHJpbnRfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB0dmFsdWUpOwotCi0gIHByaXZhdGU6Ci0gICAgc3RkOjpvZnN0cmVhbSBmX291dF87Ci0gICAgc3RkOjpsaXN0PHN0cmluZz4gZWRnZXM7Ci0gICAgYm9vbCBleGNlcHRpb25fYXJyb3dzOwotfTsKLQotLyoqCi0gKiBJbml0IGdlbmVyYXRvcjoKLSAqIC0gQWRkcyBzb21lIGVzY2FwaW5nIGZvciB0aGUgR3JhcGh2aXogZG9tYWluLgotICogLSBDcmVhdGUgb3V0cHV0IGRpcmVjdG9yeSBhbmQgb3BlbiBmaWxlIGZvciB3cml0dGluZy4KLSAqIC0gV3JpdGUgdGhlIGZpbGUgaGVhZGVyLgotICovCi12b2lkIHRfZ3ZfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKLSAgZXNjYXBlX1sneyddICA9ICJcXHsiOwotICBlc2NhcGVfWyd9J10gID0gIlxcfSI7Ci0KLSAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5Ci0gIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7Ci0gIHN0cmluZyBmbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBwcm9ncmFtXy0+Z2V0X25hbWUoKSArICIuZ3YiOwotICBmX291dF8ub3BlbihmbmFtZS5jX3N0cigpKTsKLSAgZl9vdXRfIDw8ICJkaWdyYXBoIFwiIiAgPDwgZXNjYXBlX3N0cmluZyhwcm9ncmFtX25hbWVfKSA8PCAiXCIgeyIgPDwgZW5kbDsKLSAgZl9vdXRfIDw8ICJub2RlIFtzdHlsZT1maWxsZWQsIHNoYXBlPXJlY29yZF07IiA8PCBlbmRsOwotICBmX291dF8gPDwgImVkZ2UgW2Fycm93c2l6ZT0wLjVdOyIgPDwgZW5kbDsKLSAgZl9vdXRfIDw8ICJyYW5rZGlyPUxSIiA8PCBlbmRsOwotfQotCi0vKioKLSAqIENsb3NlcyBnZW5lcmF0b3I6Ci0gKiAtIFByaW50IGFjY3VtdWxhdGVkIG5vZGVzIGNvbm5lY3Rpb25zLgotICogLSBQcmludCBmb290bm90ZS4KLSAqIC0gQ2xvc2VzIGZpbGUuCi0gKi8KLXZvaWQgdF9ndl9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKLSAgLy8gUHJpbnQgZWRnZXMKLSAgc3RkOjpsaXN0PHN0cmluZz46Oml0ZXJhdG9yIGl0ZXIgPSBlZGdlcy5iZWdpbigpOwotICBmb3IgKCA7IGl0ZXIgIT0gZWRnZXMuZW5kKCk7IGl0ZXIrKykgewotICAgIGZfb3V0XyA8PCAoKml0ZXIpIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBQcmludCBncmFwaCBlbmQgfSBhbmQgY2xvc2UgZmlsZQotZl9vdXRfIDw8ICJ9IiA8PCBlbmRsOwotZl9vdXRfLmNsb3NlKCk7Ci19Ci0KLXZvaWQgdF9ndl9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYgKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKLSAgc3RyaW5nIG5hbWUgPSB0dHlwZWRlZi0+Z2V0X25hbWUoKTsKLSAgZl9vdXRfIDw8ICJub2RlIFtmaWxsY29sb3I9YXp1cmVdOyIgPDwgZW5kbDsKLSAgZl9vdXRfIDw8IG5hbWUgPDwgIiBbbGFiZWw9XCIiOwotCi0gIGZfb3V0XyA8PCBlc2NhcGVfc3RyaW5nKG5hbWUpOwotICBmX291dF8gPDwgIiA6OiAiOwotICBwcmludF90eXBlKHR0eXBlZGVmLT5nZXRfdHlwZSgpLCBuYW1lKTsKLQotICBmX291dF8gPDwgIlwiXTsiIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9ndl9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0gKHRfZW51bSogdGVudW0pIHsKLSAgc3RyaW5nIG5hbWUgPSB0ZW51bS0+Z2V0X25hbWUoKTsKLSAgZl9vdXRfIDw8ICJub2RlIFtmaWxsY29sb3I9d2hpdGVdOyIgPDwgZW5kbDsKLSAgZl9vdXRfIDw8IG5hbWUgPDwgIiBbbGFiZWw9XCJlbnVtICIgPDwgZXNjYXBlX3N0cmluZyhuYW1lKTsKLQotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gdmFsdWVzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciB2YWxfaXRlcjsKLSAgZm9yICh2YWxfaXRlciA9IHZhbHVlcy5iZWdpbigpOyB2YWxfaXRlciAhPSB2YWx1ZXMuZW5kKCk7ICsrdmFsX2l0ZXIpIHsKLSAgICBmX291dF8gPDwgJ3wnIDw8ICgqdmFsX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIGZfb3V0XyA8PCAiID0gIjsKLSAgICBmX291dF8gPDwgKCp2YWxfaXRlciktPmdldF92YWx1ZSgpOwotICB9Ci0KLSAgZl9vdXRfIDw8ICJcIl07IiA8PCBlbmRsOwotfQotCi12b2lkIHRfZ3ZfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdCAodF9jb25zdCogdGNvbnN0KSB7Ci0gIHN0cmluZyBuYW1lID0gdGNvbnN0LT5nZXRfbmFtZSgpOwotCi0gIGZfb3V0XyA8PCAibm9kZSBbZmlsbGNvbG9yPWFsaWNlYmx1ZV07IiA8PCBlbmRsOwotICBmX291dF8gPDwgImNvbnN0XyIgPDwgbmFtZSA8PCAiIFtsYWJlbD1cIiI7Ci0KLSAgZl9vdXRfIDw8IGVzY2FwZV9zdHJpbmcobmFtZSk7Ci0gIGZfb3V0XyA8PCAiID0gIjsKLSAgcHJpbnRfY29uc3RfdmFsdWUoIHRjb25zdC0+Z2V0X3R5cGUoKSwgdGNvbnN0LT5nZXRfdmFsdWUoKSk7Ci0gIGZfb3V0XyA8PCAiIDo6ICI7Ci0gIHByaW50X3R5cGUodGNvbnN0LT5nZXRfdHlwZSgpLCAiY29uc3RfIiArIG5hbWUpOwotCi0gIGZfb3V0XyA8PCAiXCJdOyIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2d2X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0ICAodF9zdHJ1Y3QqICAgdHN0cnVjdCkgewotICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7Ci0KLSAgaWYgKHRzdHJ1Y3QtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBmX291dF8gPDwgIm5vZGUgW2ZpbGxjb2xvcj1saWdodHBpbmtdOyIgPDwgZW5kbDsKLSAgICBmX291dF8gPDwgbmFtZSA8PCAiIFtsYWJlbD1cIiI7Ci0gICAgZl9vdXRfIDw8ICJleGNlcHRpb24gIiA8PCBlc2NhcGVfc3RyaW5nKG5hbWUpOwotICB9IGVsc2UgaWYgKHRzdHJ1Y3QtPmlzX3VuaW9uKCkpIHsKLSAgICBmX291dF8gPDwgIm5vZGUgW2ZpbGxjb2xvcj1saWdodGN5YW5dOyIgPDwgZW5kbDsKLSAgICBmX291dF8gPDwgbmFtZSA8PCAiIFtsYWJlbD1cIiI7Ci0gICAgZl9vdXRfIDw8ICJ1bmlvbiAiIDw8IGVzY2FwZV9zdHJpbmcobmFtZSk7Ci0gIH0gZWxzZSB7Ci0gICAgZl9vdXRfIDw8ICJub2RlIFtmaWxsY29sb3I9YmVpZ2VdOyIgPDwgZW5kbDsKLSAgICBmX291dF8gPDwgbmFtZSA8PCAiIFtsYWJlbD1cIiI7Ci0gICAgZl9vdXRfIDw8ICJzdHJ1Y3QgIiA8PCBlc2NhcGVfc3RyaW5nKG5hbWUpOwotICB9Ci0KLSAgdmVjdG9yPHRfZmllbGQqPiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6aXRlcmF0b3IgbWVtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7Ci0gIGZvciAoIDsgbWVtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgbWVtX2l0ZXIrKykgewotICAgIHN0cmluZyBmaWVsZF9uYW1lID0gKCptZW1faXRlciktPmdldF9uYW1lKCk7Ci0KLSAgICAvLyBwcmludCBwb3J0IChhbmNob3IgcmVmZXJlbmNlKQotICAgIGZfb3V0XyA8PCAifDxmaWVsZF8iIDw8IGZpZWxkX25hbWUgPDwgJz4nOwotCi0gICAgLy8gZmllbGQgbmFtZSA6OiBmaWVsZCB0eXBlCi0gICAgZl9vdXRfIDw8ICgqbWVtX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIGZfb3V0XyA8PCAiIDo6ICI7Ci0gICAgcHJpbnRfdHlwZSgoKm1lbV9pdGVyKS0+Z2V0X3R5cGUoKSwKLSAgICAgICAgbmFtZSArICI6ZmllbGRfIiArIGZpZWxkX25hbWUpOwotICB9Ci0KLSAgZl9vdXRfIDw8ICJcIl07IiA8PCBlbmRsOwotfQotCi12b2lkIHRfZ3ZfZ2VuZXJhdG9yOjpwcmludF90eXBlKHRfdHlwZSogdHR5cGUsIHN0cmluZyBzdHJ1Y3RfZmllbGRfcmVmKSB7Ci0gIGlmICh0dHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgZl9vdXRfIDw8ICJsaXN0XFw8IjsKLSAgICAgIHByaW50X3R5cGUoKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpLCBzdHJ1Y3RfZmllbGRfcmVmKTsKLSAgICAgIGZfb3V0XyA8PCAiXFw+IjsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgICAgZl9vdXRfIDw8ICJzZXRcXDwiOwotICAgICAgcHJpbnRfdHlwZSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSwgc3RydWN0X2ZpZWxkX3JlZik7Ci0gICAgICBmX291dF8gPDwgIlxcPiI7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICAgIGZfb3V0XyA8PCAibWFwXFw8IjsKLSAgICAgIHByaW50X3R5cGUoKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSwgc3RydWN0X2ZpZWxkX3JlZik7Ci0gICAgICBmX291dF8gPDwgIiwgIjsKLSAgICAgIHByaW50X3R5cGUoKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSwgc3RydWN0X2ZpZWxkX3JlZik7Ci0gICAgICBmX291dF8gPDwgIlxcPiI7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIGZfb3V0XyA8PCAoKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5pc19iaW5hcnkoKSA/ICJiaW5hcnkiIDogdHR5cGUtPmdldF9uYW1lKCkpOwotICB9IGVsc2UgewotICAgIGZfb3V0XyA8PCB0dHlwZS0+Z2V0X25hbWUoKTsKLSAgICBlZGdlcy5wdXNoX2JhY2soc3RydWN0X2ZpZWxkX3JlZiArICIgLT4gIiArIHR0eXBlLT5nZXRfbmFtZSgpKTsKLSAgfQotfQotCi0vKioKLSAqIFByaW50cyBvdXQgYW4gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwcm92aWRlZCBjb25zdGFudCB2YWx1ZQotICovCi12b2lkIHRfZ3ZfZ2VuZXJhdG9yOjpwcmludF9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHR2YWx1ZSkgewotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgc3dpdGNoICh0dmFsdWUtPmdldF90eXBlKCkpIHsKLSAgICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVI6Ci0gICAgICBmX291dF8gPDwgdHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9ET1VCTEU6Ci0gICAgICBmX291dF8gPDwgdHZhbHVlLT5nZXRfZG91YmxlKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX1NUUklORzoKLSAgICAgIGZfb3V0XyA8PCAiXFxcIiIgPDwgIGdldF9lc2NhcGVkX3N0cmluZyh0dmFsdWUpIDw8ICJcXFwiIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfTUFQOgotICAgICAgewotICAgICAgICBmX291dF8gPDwgIlxceyAiOwotICAgICAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiBtYXBfZWxlbXMgPSB0dmFsdWUtPmdldF9tYXAoKTsKLSAgICAgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46Oml0ZXJhdG9yIG1hcF9pdGVyOwotICAgICAgICBmb3IgKG1hcF9pdGVyID0gbWFwX2VsZW1zLmJlZ2luKCk7IG1hcF9pdGVyICE9IG1hcF9lbGVtcy5lbmQoKTsgbWFwX2l0ZXIrKykgewotICAgICAgICAgIGlmICghZmlyc3QpIHsKLSAgICAgICAgICAgIGZfb3V0XyA8PCAiLCAiOwotICAgICAgICAgIH0KLSAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICAgIHByaW50X2NvbnN0X3ZhbHVlKCAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCksIG1hcF9pdGVyLT5maXJzdCk7Ci0gICAgICAgICAgZl9vdXRfIDw8ICIgPSAiOwotICAgICAgICAgIHByaW50X2NvbnN0X3ZhbHVlKCAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCksIG1hcF9pdGVyLT5zZWNvbmQpOwotICAgICAgICB9Ci0gICAgICAgIGZfb3V0XyA8PCAiIFxcfSI7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX0xJU1Q6Ci0gICAgICB7Ci0gICAgICAgIGZfb3V0XyA8PCAiXFx7ICI7Ci0gICAgICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4gbGlzdF9lbGVtcyA9IHR2YWx1ZS0+Z2V0X2xpc3QoKTs7Ci0gICAgICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46Oml0ZXJhdG9yIGxpc3RfaXRlcjsKLSAgICAgICAgZm9yIChsaXN0X2l0ZXIgPSBsaXN0X2VsZW1zLmJlZ2luKCk7IGxpc3RfaXRlciAhPSBsaXN0X2VsZW1zLmVuZCgpOyBsaXN0X2l0ZXIrKykgewotICAgICAgICAgIGlmICghZmlyc3QpIHsKLSAgICAgICAgICAgIGZfb3V0XyA8PCAiLCAiOwotICAgICAgICAgIH0KLSAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgICAgICAgIHByaW50X2NvbnN0X3ZhbHVlKCAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKSwgKmxpc3RfaXRlcik7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHByaW50X2NvbnN0X3ZhbHVlKCAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpLCAqbGlzdF9pdGVyKTsKLSAgICAgICAgICB9IAotICAgICAgICB9Ci0gICAgICAgIGZfb3V0XyA8PCAiIFxcfSI7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX0lERU5USUZJRVI6Ci0gICAgICBmX291dF8gPDwgZXNjYXBlX3N0cmluZyh0eXBlLT5nZXRfbmFtZSgpKSA8PCAiLiIgPDwgZXNjYXBlX3N0cmluZyh0dmFsdWUtPmdldF9pZGVudGlmaWVyX25hbWUoKSk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgZl9vdXRfIDw8ICJVTktOT1dOIjsKLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLXZvaWQgdF9ndl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UgKHRfc2VydmljZSogIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBzZXJ2aWNlX25hbWUgPSBnZXRfc2VydmljZV9uYW1lKHRzZXJ2aWNlKTsKLSAgZl9vdXRfIDw8ICJzdWJncmFwaCBjbHVzdGVyXyIgPDwgc2VydmljZV9uYW1lIDw8ICIgeyIgPDwgZW5kbDsKLSAgZl9vdXRfIDw8ICJub2RlIFtmaWxsY29sb3I9YmlzcXVlXTsiIDw8IGVuZGw7Ci0gIGZfb3V0XyA8PCAic3R5bGU9ZGFzaGVkOyIgPDwgZW5kbDsKLSAgZl9vdXRfIDw8ICJsYWJlbCA9IFwiIiA8PCBlc2NhcGVfc3RyaW5nKHNlcnZpY2VfbmFtZSkgPDwgIiBzZXJ2aWNlXCI7IiA8PCBlbmRsOwotCi0gIC8vIFRPRE86IHNlcnZpY2UgZXh0ZW5kcwotCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZm5faXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOwotICBmb3IgKCA7IGZuX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyBmbl9pdGVyKyspIHsKLSAgICBzdHJpbmcgZm5fbmFtZSA9ICgqZm5faXRlciktPmdldF9uYW1lKCk7Ci0KLSAgICBmX291dF8gPDwgImZ1bmN0aW9uXyIgPDwgZm5fbmFtZTsKLSAgICBmX291dF8gPDwgIltsYWJlbD1cIjxyZXR1cm5fdHlwZT5mdW5jdGlvbiAiIDw8IGVzY2FwZV9zdHJpbmcoZm5fbmFtZSk7Ci0gICAgZl9vdXRfIDw8ICIgOjogIjsKLSAgICBwcmludF90eXBlKCgqZm5faXRlciktPmdldF9yZXR1cm50eXBlKCksICJmdW5jdGlvbl8iICsgZm5fbmFtZSArICI6cmV0dXJuX3R5cGUiKTsKLQotICAgIHZlY3Rvcjx0X2ZpZWxkKj4gYXJncyA9ICgqZm5faXRlciktPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6aXRlcmF0b3IgYXJnX2l0ZXIgPSBhcmdzLmJlZ2luKCk7Ci0gICAgZm9yICggOyBhcmdfaXRlciAhPSBhcmdzLmVuZCgpOyBhcmdfaXRlcisrKSB7Ci0gICAgICBmX291dF8gPDwgInw8cGFyYW1fIiA8PCAoKmFyZ19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiPiI7Ci0gICAgICBmX291dF8gPDwgKCphcmdfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgICBpZiAoKCphcmdfaXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKLSAgICAgICAgZl9vdXRfIDw8ICIgPSAiOwotICAgICAgICBwcmludF9jb25zdF92YWx1ZSgoKmFyZ19pdGVyKS0+Z2V0X3R5cGUoKSwgKCphcmdfaXRlciktPmdldF92YWx1ZSgpKTsKLSAgICAgIH0KLSAgICAgIGZfb3V0XyA8PCAiIDo6ICI7Ci0gICAgICBwcmludF90eXBlKCgqYXJnX2l0ZXIpLT5nZXRfdHlwZSgpLAotICAgICAgICAgICJmdW5jdGlvbl8iICsgZm5fbmFtZSArICI6cGFyYW1fIiArICgqYXJnX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLQotICAgIH0KLSAgICAvLyBlbmQgb2Ygbm9kZQotICAgIGZfb3V0XyA8PCAiXCJdOyIgPDwgZW5kbDsKLQotICAgIC8vIEV4Y2VwdGlvbiBlZGdlcwotICAgIGlmIChleGNlcHRpb25fYXJyb3dzKSB7Ci0gICAgICB2ZWN0b3I8dF9maWVsZCo+IGV4Y2VwdHMgPSAoKmZuX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCktPmdldF9tZW1iZXJzKCk7Ci0gICAgICB2ZWN0b3I8dF9maWVsZCo+OjppdGVyYXRvciBleF9pdGVyID0gZXhjZXB0cy5iZWdpbigpOwotICAgICAgZm9yICggOyBleF9pdGVyICE9IGV4Y2VwdHMuZW5kKCk7IGV4X2l0ZXIrKykgewotICAgICAgICBlZGdlcy5wdXNoX2JhY2soImZ1bmN0aW9uXyIgKyBmbl9uYW1lICsgIiAtPiAiICsKLSAgICAgICAgICAgICgqZXhfaXRlciktPmdldF90eXBlKCktPmdldF9uYW1lKCkgKyAiIFtjb2xvcj1yZWRdIik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZl9vdXRfIDw8ICIgfSIgPDwgZW5kbDsKLX0KLQotVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUihndiwgIkdyYXBodml6IiwKLSAgICAiICAgIGV4Y2VwdGlvbnM6ICAgICAgV2hldGhlciB0byBkcmF3IGFycm93cyBmcm9tIGZ1bmN0aW9ucyB0byBleGNlcHRpb24uXG4iCi0gICAgKQotCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfaHNfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2hzX2dlbmVyYXRvci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTljNzY5YS4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfaHNfZ2VuZXJhdG9yLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTc2MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8ZnN0cmVhbT4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0KLSNpbmNsdWRlICJ0X29vcF9nZW5lcmF0b3IuaCIKLQotI2luY2x1ZGUgInBsYXRmb3JtLmgiCi0jaW5jbHVkZSAidmVyc2lvbi5oIgotCi11c2luZyBzdGQ6Om1hcDsKLXVzaW5nIHN0ZDo6b2ZzdHJlYW07Ci11c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Ci11c2luZyBzdGQ6OnN0cmluZzsKLXVzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwotdXNpbmcgc3RkOjp2ZWN0b3I7Ci0KLXN0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7ICAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCi0KLS8qKgotICogSGFza2VsbCBjb2RlIGdlbmVyYXRvci4KLSAqCi0gKi8KLWNsYXNzIHRfaHNfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7Ci0gcHVibGljOgotICB0X2hzX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCi0gICAgICAgICAgICAgICAgIGNvbnN0IG1hcDxzdHJpbmcsIHN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAotICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCi0gICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkKLSAgewotICAgICh2b2lkKSBwYXJzZWRfb3B0aW9uczsKLSAgICAodm9pZCkgb3B0aW9uX3N0cmluZzsKLSAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1ocyI7Ci0gIH0KLQotICAvKioKLSAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcwotICAgKi8KLQotICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7Ci0gIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7Ci0KLSAgLyoqCi0gICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0gIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZiAgKHRfdHlwZWRlZiogIHR0eXBlZGVmKTsKLSAgdm9pZCBnZW5lcmF0ZV9lbnVtICAgICAodF9lbnVtKiAgICAgdGVudW0pOwotICB2b2lkIGdlbmVyYXRlX2NvbnN0ICAgICh0X2NvbnN0KiAgICB0Y29uc3QpOwotICB2b2lkIGdlbmVyYXRlX3N0cnVjdCAgICh0X3N0cnVjdCogICB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbiAodF9zdHJ1Y3QqICAgdHhjZXB0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlICAodF9zZXJ2aWNlKiAgdHNlcnZpY2UpOwotCi0gIHN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFN0cnVjdCBnZW5lcmF0aW9uIGNvZGUKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9oc19zdHJ1Y3QgICAgICAgICAgICAodF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKTsKLQotICB2b2lkIGdlbmVyYXRlX2hzX3N0cnVjdF9kZWZpbml0aW9uIChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiA9IGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhlbHBlciA9IGZhbHNlKTsKLQotICB2b2lkIGdlbmVyYXRlX2hzX3N0cnVjdF9yZWFkZXIgICAgIChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9oc19zdHJ1Y3Rfd3JpdGVyICAgICAob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotCi0gIHZvaWQgZ2VuZXJhdGVfaHNfc3RydWN0X2FyYml0cmFyeSAgKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KTsKLQotICB2b2lkIGdlbmVyYXRlX2hzX2Z1bmN0aW9uX2hlbHBlcnMgICh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotCi0gIHZvaWQgZ2VuZXJhdGVfaHNfdHlwZW1hcCAgICAgICAgICAgKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KTsKLQotICB2b2lkIGdlbmVyYXRlX2hzX2RlZmF1bHQgICAgICAgICAgIChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCk7Ci0KLQotICAvKioKLSAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyAgICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQgICAgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyICAgICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uICAodF9zZXJ2aWNlKiB0c2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLQotICAvKioKLSAgICogU2VyaWFsaXphdGlvbiBjb25zdHJ1Y3RzCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQgICAgICAgIChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3QgICAgICAgKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lID0gIiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyICAgIChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBhcmcgPSAiIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudCAgKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdHNldCk7Ci0KLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudCAob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4ID0gIiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfdHlwZSAgICAgICAgICAob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGFyZyA9ICIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV90eXBlICAgICAgICAgICAob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lID0gIiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdCAgICAgICAgIChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4ID0gIiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lciAgICAgIChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXggPSAiIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQgICAgKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBraXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB2aXRlcik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQgICAgKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQgICAob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlcik7Ci0KLSAgLyoqCi0gICAqIEhlbHBlciByZW5kZXJpbmcgZnVuY3Rpb25zCi0gICAqLwotCi0gIHN0cmluZyBoc19hdXRvZ2VuX2NvbW1lbnQoKTsKLSAgc3RyaW5nIGhzX2xhbmd1YWdlX3ByYWdtYSgpOwotICBzdHJpbmcgaHNfaW1wb3J0cygpOwotCi0gIHN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICBzdHJpbmcgZnVuY3Rpb25fcHJlZml4ID0gIiIpOwotCi0gIHN0cmluZyBmaWVsZF9uYW1lKHN0cmluZyB0bmFtZSwgc3RyaW5nIGZuYW1lKTsKLQotICBzdHJpbmcgZnVuY3Rpb25fdHlwZSh0X2Z1bmN0aW9uKiB0ZnVuYywKLSAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBvcHRpb25zID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW8gPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBtZXRob2QgPSBmYWxzZSk7Ci0KLSAgc3RyaW5nIHR5cGVfdG9fZW51bSh0X3R5cGUqIHR0eXBlKTsKLQotICBzdHJpbmcgdHlwZV90b19kZWZhdWx0KHRfdHlwZSogdHR5cGUpOwotCi0gIHN0cmluZyByZW5kZXJfaHNfdHlwZSh0X3R5cGUqIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBib29sIG5lZWRzX3BhcmVucyk7Ci0KLSAgc3RyaW5nIHR5cGVfdG9fY29uc3RydWN0b3IodF90eXBlKiB0dHlwZSk7Ci0KLSAgc3RyaW5nIHJlbmRlcl9oc190eXBlX2Zvcl9mdW5jdGlvbl9uYW1lKHRfdHlwZSAqdHlwZSk7Ci0KLSBwcml2YXRlOgotCi0gIG9mc3RyZWFtIGZfdHlwZXNfOwotICBvZnN0cmVhbSBmX2NvbnN0c187Ci0gIG9mc3RyZWFtIGZfc2VydmljZV87Ci0gIG9mc3RyZWFtIGZfaWZhY2VfOwotICBvZnN0cmVhbSBmX2NsaWVudF87Ci19OwotCi0vKioKLSAqIFByZXBhcmVzIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0Ci0gKiBzdHJlYW1zLgotICoKLSAqIEBwYXJhbSB0cHJvZ3JhbSBUaGUgcHJvZ3JhbSB0byBnZW5lcmF0ZQotICovCi12b2lkIHRfaHNfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKLSAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5Ci0gIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7Ci0KLSAgLy8gTWFrZSBvdXRwdXQgZmlsZQotICBzdHJpbmcgcG5hbWUgPSBjYXBpdGFsaXplKHByb2dyYW1fbmFtZV8pOwotICBzdHJpbmcgZl90eXBlc19uYW1lID0gZ2V0X291dF9kaXIoKSArIHBuYW1lICsgIl9UeXBlcy5ocyI7Ci0gIGZfdHlwZXNfLm9wZW4oZl90eXBlc19uYW1lLmNfc3RyKCkpOwotCi0gIHN0cmluZyBmX2NvbnN0c19uYW1lID0gZ2V0X291dF9kaXIoKSArIHBuYW1lICsgIl9Db25zdHMuaHMiOwotICBmX2NvbnN0c18ub3BlbihmX2NvbnN0c19uYW1lLmNfc3RyKCkpOwotCi0gIC8vIFByaW50IGhlYWRlcgotICBmX3R5cGVzXyA8PCBoc19sYW5ndWFnZV9wcmFnbWEoKSA8PCBlbmRsOwotICBmX3R5cGVzXyA8PCBoc19hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsOwotICBmX3R5cGVzXyA8PCAibW9kdWxlICIgPDwgcG5hbWUgPDwgIl9UeXBlcyB3aGVyZSIgPDwgZW5kbDsKLSAgZl90eXBlc18gPDwgaHNfaW1wb3J0cygpIDw8IGVuZGw7Ci0KLSAgZl9jb25zdHNfIDw8IGhzX2xhbmd1YWdlX3ByYWdtYSgpIDw8IGVuZGw7Ci0gIGZfY29uc3RzXyA8PCBoc19hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsOwotICBmX2NvbnN0c18gPDwgIm1vZHVsZSAiIDw8IHBuYW1lIDw8ICJfQ29uc3RzIHdoZXJlIiA8PCBlbmRsOwotICBmX2NvbnN0c18gPDwgaHNfaW1wb3J0cygpIDw8IGVuZGw7Ci0gIGZfY29uc3RzXyA8PCAiaW1wb3J0ICIgPDwgcG5hbWUgPDwgIl9UeXBlcyIgPDwgZW5kbDsKLX0KLQotc3RyaW5nIHRfaHNfZ2VuZXJhdG9yOjpoc19sYW5ndWFnZV9wcmFnbWEoKSB7Ci0gIHJldHVybiBzdHJpbmcoInstIyBMQU5HVUFHRSBEZXJpdmVEYXRhVHlwZWFibGUgIy19XG4iCi0gICAgICAgICAgICAgICAgInstIyBMQU5HVUFHRSBPdmVybG9hZGVkU3RyaW5ncyAjLX1cbiIKLSAgICAgICAgICAgICAgICAiey0jIE9QVElPTlNfR0hDIC1mbm8td2Fybi1taXNzaW5nLWZpZWxkcyAjLX1cbiIKLSAgICAgICAgICAgICAgICAiey0jIE9QVElPTlNfR0hDIC1mbm8td2Fybi1taXNzaW5nLXNpZ25hdHVyZXMgIy19XG4iCi0gICAgICAgICAgICAgICAgInstIyBPUFRJT05TX0dIQyAtZm5vLXdhcm4tbmFtZS1zaGFkb3dpbmcgIy19XG4iCi0gICAgICAgICAgICAgICAgInstIyBPUFRJT05TX0dIQyAtZm5vLXdhcm4tdW51c2VkLWltcG9ydHMgIy19XG4iCi0gICAgICAgICAgICAgICAgInstIyBPUFRJT05TX0dIQyAtZm5vLXdhcm4tdW51c2VkLW1hdGNoZXMgIy19XG4iKTsKLX0KLQotLyoqCi0gKiBBdXRvZ2VuJ2QgY29tbWVudAotICovCi1zdHJpbmcgdF9oc19nZW5lcmF0b3I6OmhzX2F1dG9nZW5fY29tbWVudCgpIHsKLSAgcmV0dXJuIHN0cmluZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpICsKLSAgICAgICAgICAgICAgICAiLS0gQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKCIgKyBUSFJJRlRfVkVSU0lPTiArICIpICAgICAgICAgICAgICAgICAgICAgIC0tXG4iICsKLSAgICAgICAgICAgICAgICAiLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS1cbiIgKwotICAgICAgICAgICAgICAgICItLSBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lORyAtLVxuIiArCi0gICAgICAgICAgICAgICAgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iOwotfQotCi0vKioKLSAqIFByaW50cyBzdGFuZGFyZCB0aHJpZnQgaW1wb3J0cwotICovCi1zdHJpbmcgdF9oc19nZW5lcmF0b3I6OmhzX2ltcG9ydHMoKSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X3Byb2dyYW0qPiYgaW5jbHVkZXMgPSBwcm9ncmFtXy0+Z2V0X2luY2x1ZGVzKCk7Ci0gIHN0cmluZyByZXN1bHQgPSBzdHJpbmcoCi0gICAgICAiaW1wb3J0IFByZWx1ZGUgKCgkKSwgKC4pLCAoPj49KSwgKD09KSwgKCsrKSlcbiIKLSAgICAgICJpbXBvcnQgcXVhbGlmaWVkIFByZWx1ZGUgYXMgUFxuIgotICAgICAgImltcG9ydCBxdWFsaWZpZWQgQ29udHJvbC5FeGNlcHRpb24gYXMgWFxuIgotICAgICAgImltcG9ydCBxdWFsaWZpZWQgQ29udHJvbC5Nb25hZCBhcyBNICggbGlmdE0sIGFwLCB3aGVuIClcbiIKLSAgICAgICJpbXBvcnQgRGF0YS5GdW5jdG9yICggKDwkPikgKVxuIgotICAgICAgImltcG9ydCBxdWFsaWZpZWQgRGF0YS5CeXRlU3RyaW5nLkxhenkgYXMgTEJTXG4iIAotICAgICAgImltcG9ydCBxdWFsaWZpZWQgRGF0YS5IYXNoYWJsZSBhcyBIXG4iCi0gICAgICAiaW1wb3J0IHF1YWxpZmllZCBEYXRhLkludCBhcyBJXG4iCi0gICAgICAiaW1wb3J0IHF1YWxpZmllZCBEYXRhLk1heWJlIGFzIE0gKGNhdE1heWJlcylcbiIKLSAgICAgICJpbXBvcnQgcXVhbGlmaWVkIERhdGEuVGV4dC5MYXp5LkVuY29kaW5nIGFzIEUgKCBkZWNvZGVVdGY4LCBlbmNvZGVVdGY4IClcbiIKLSAgICAgICJpbXBvcnQgcXVhbGlmaWVkIERhdGEuVGV4dC5MYXp5IGFzIExUXG4iCi0gICAgICAiaW1wb3J0IHF1YWxpZmllZCBEYXRhLlR5cGVhYmxlIGFzIFRZICggVHlwZWFibGUgKVxuIgotICAgICAgImltcG9ydCBxdWFsaWZpZWQgRGF0YS5IYXNoTWFwLlN0cmljdCBhcyBNYXBcbiIKLSAgICAgICJpbXBvcnQgcXVhbGlmaWVkIERhdGEuSGFzaFNldCBhcyBTZXRcbiIKLSAgICAgICJpbXBvcnQgcXVhbGlmaWVkIERhdGEuVmVjdG9yIGFzIFZlY3RvclxuIgotICAgICAgImltcG9ydCBxdWFsaWZpZWQgVGVzdC5RdWlja0NoZWNrLkFyYml0cmFyeSBhcyBRQyAoIEFyYml0cmFyeSguLikgKVxuIgotICAgICAgImltcG9ydCBxdWFsaWZpZWQgVGVzdC5RdWlja0NoZWNrIGFzIFFDICggZWxlbWVudHMgKVxuIgotICAgICAgIlxuIgotICAgICAgImltcG9ydCBxdWFsaWZpZWQgVGhyaWZ0IGFzIFRcbiIKLSAgICAgICJpbXBvcnQgcXVhbGlmaWVkIFRocmlmdC5UeXBlcyBhcyBUXG4iCi0gICAgICAiaW1wb3J0IHF1YWxpZmllZCBUaHJpZnQuQXJiaXRyYXJpZXMgYXMgVFxuIgotICAgICAgIlxuIik7Ci0KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmNsdWRlcy5zaXplKCk7ICsraSkKLSAgICByZXN1bHQgKz0gImltcG9ydCBxdWFsaWZpZWQgIiArIGNhcGl0YWxpemUoaW5jbHVkZXNbaV0tPmdldF9uYW1lKCkpICsgIl9UeXBlc1xuIjsKLQotICBpZiAoaW5jbHVkZXMuc2l6ZSgpID4gMCkKLSAgICByZXN1bHQgKz0gIlxuIjsKLQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioKLSAqIENsb3NlcyB0aGUgdHlwZSBmaWxlcwotICovCi12b2lkIHRfaHNfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7Ci0gIC8vIENsb3NlIHR5cGVzIGZpbGUKLSAgZl90eXBlc18uY2xvc2UoKTsKLSAgZl9jb25zdHNfLmNsb3NlKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgdHlwZWRlZi4gRXouCi0gKgotICogQHBhcmFtIHR0eXBlZGVmIFRoZSB0eXBlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7Ci0gIHN0cmluZyB0bmFtZSA9IGNhcGl0YWxpemUodHR5cGVkZWYtPmdldF9zeW1ib2xpYygpKTsKLSAgc3RyaW5nIHRkZWYgPSByZW5kZXJfaHNfdHlwZSh0dHlwZWRlZi0+Z2V0X3R5cGUoKSwgZmFsc2UpOwotICBpbmRlbnQoZl90eXBlc18pIDw8ICJ0eXBlICIgPDwgdG5hbWUgPDwgIiA9ICIgPDwgdGRlZiA8PCBlbmRsOwotICBmX3R5cGVzXyA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBjb2RlIGZvciBhbiBlbnVtZXJhdGVkIHR5cGUuCi0gKiB0aGUgdmFsdWVzLgotICoKLSAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KLSAqLwotdm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7Ci0gIGluZGVudChmX3R5cGVzXykgPDwgImRhdGEgIiA8PCBjYXBpdGFsaXplKHRlbnVtLT5nZXRfbmFtZSgpKSA8PCAiID0gIjsKLSAgaW5kZW50X3VwKCk7Ci0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOwotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKLQotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBzdHJpbmcgbmFtZSA9IGNhcGl0YWxpemUoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLSAgICBmX3R5cGVzXyA8PCAoZmlyc3QgPyAiIiA6ICJ8Iik7Ci0gICAgZl90eXBlc18gPDwgbmFtZTsKLSAgICBmaXJzdCA9IGZhbHNlOwotICB9Ci0gIGluZGVudChmX3R5cGVzXykgPDwgImRlcml2aW5nIChQLlNob3csUC5FcSwgVFkuVHlwZWFibGUsIFAuT3JkLCBQLkJvdW5kZWQpIiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotCi0gIHN0cmluZyBlbmFtZSA9IGNhcGl0YWxpemUodGVudW0tPmdldF9uYW1lKCkpOwotCi0gIGluZGVudChmX3R5cGVzXykgPDwgImluc3RhbmNlIFAuRW51bSAiIDw8IGVuYW1lIDw8ICIgd2hlcmUiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQoZl90eXBlc18pIDw8ICJmcm9tRW51bSB0ID0gY2FzZSB0IG9mIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOwotICAgIHN0cmluZyBuYW1lID0gY2FwaXRhbGl6ZSgoKmNfaXRlciktPmdldF9uYW1lKCkpOwotICAgIGluZGVudChmX3R5cGVzXykgPDwgbmFtZSA8PCAiIC0+ICIgPDwgdmFsdWUgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQoZl90eXBlc18pIDw8ICJ0b0VudW0gdCA9IGNhc2UgdCBvZiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZvcihjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOwotICAgIHN0cmluZyBuYW1lID0gY2FwaXRhbGl6ZSgoKmNfaXRlciktPmdldF9uYW1lKCkpOwotICAgIGluZGVudChmX3R5cGVzXykgPDwgdmFsdWUgPDwgIiAtPiAiIDw8IG5hbWUgPDwgZW5kbDsKLSAgfQotICBpbmRlbnQoZl90eXBlc18pIDw8ICJfIC0+IFgudGhyb3cgVC5UaHJpZnRFeGNlcHRpb24iIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgaW5kZW50KGZfdHlwZXNfKSA8PCAiaW5zdGFuY2UgSC5IYXNoYWJsZSAiIDw8IGVuYW1lIDw8ICIgd2hlcmUiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQoZl90eXBlc18pIDw8ICJoYXNoV2l0aFNhbHQgc2FsdCA9IEguaGFzaFdpdGhTYWx0IHNhbHQgUC4uIFAuZnJvbUVudW0iIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgaW5kZW50KGZfdHlwZXNfKSA8PCAiaW5zdGFuY2UgUUMuQXJiaXRyYXJ5ICIgPDwgZW5hbWUgPDwgIiB3aGVyZSIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChmX3R5cGVzXykgPDwgImFyYml0cmFyeSA9IFFDLmVsZW1lbnRzIChQLmVudW1Gcm9tVG8gUC5taW5Cb3VuZCBQLm1heEJvdW5kKSIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZSBhIGNvbnN0YW50IHZhbHVlCi0gKi8KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCkgewotICB0X3R5cGUqIHR5cGUgPSB0Y29uc3QtPmdldF90eXBlKCk7Ci0gIHN0cmluZyBuYW1lID0gZGVjYXBpdGFsaXplKHRjb25zdC0+Z2V0X25hbWUoKSk7Ci0KLSAgdF9jb25zdF92YWx1ZSogdmFsdWUgPSB0Y29uc3QtPmdldF92YWx1ZSgpOwotCi0gIGluZGVudChmX2NvbnN0c18pIDw8IG5hbWUgPDwgIiA6OiAiIDw8IHJlbmRlcl9oc190eXBlKHR5cGUsIGZhbHNlKSA8PCBlbmRsOwotICBpbmRlbnQoZl9jb25zdHNfKSA8PCBuYW1lIDw8ICIgPSAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0eXBlLCB2YWx1ZSkgPDwgZW5kbDsKLSAgZl9jb25zdHNfIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogUHJpbnRzIHRoZSB2YWx1ZSBvZiBhIGNvbnN0YW50IHdpdGggdGhlIGdpdmVuIHR5cGUuIE5vdGUgdGhhdCB0eXBlIGNoZWNraW5nCi0gKiBpcyBOT1QgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24gYXMgaXQgaXMgYWx3YXlzIHJ1biBiZWZvcmVoYW5kIHVzaW5nIHRoZQotICogdmFsaWRhdGVfdHlwZXMgbWV0aG9kIGluIG1haW4uY2MKLSAqLwotc3RyaW5nIHRfaHNfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgewotICBpZiAodmFsdWUgPT0gTlVMTCkKLSAgICByZXR1cm4gdHlwZV90b19kZWZhdWx0KHR5cGUpOwotCi0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotICBvc3RyaW5nc3RyZWFtIG91dDsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotCi0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICBvdXQgPDwgJyInIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICBvdXQgPDwgKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCA/ICJQLlRydWUiIDogIlAuRmFsc2UiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7Ci0gICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgfQotCi0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgdF9lbnVtKiB0ZW51bSA9ICh0X2VudW0qKXR5cGU7Ci0gICAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7Ci0gICAgZm9yICh2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOwotICAgICAgICAgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsKLSAgICAgICAgICsrY19pdGVyKSB7Ci0gICAgICBpbnQgdmFsID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgICAgIGlmICh2YWwgPT0gdmFsdWUtPmdldF9pbnRlZ2VyKCkpIHsKLSAgICAgICAgdF9wcm9ncmFtKiBwcm9nID0gdHlwZS0+Z2V0X3Byb2dyYW0oKTsKLSAgICAgICAgaWYgKHByb2cgIT0gTlVMTCAmJiBwcm9nICE9IHByb2dyYW1fKQotICAgICAgICAgIG91dCA8PCBjYXBpdGFsaXplKHByb2ctPmdldF9uYW1lKCkpIDw8ICJfVHlwZXMuIjsKLSAgICAgICAgb3V0IDw8IGNhcGl0YWxpemUoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotCi0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHN0cmluZyBjbmFtZSA9IHR5cGVfbmFtZSh0eXBlKTsKLSAgICBvdXQgPDwgImRlZmF1bHRfIiA8PCBjbmFtZSA8PCAieyI7Ci0KLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLQotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGZvciAobWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlciA9IHZhbC5iZWdpbigpOwotICAgICAgICAgdl9pdGVyICE9IHZhbC5lbmQoKTsKLSAgICAgICAgICsrdl9pdGVyKSB7Ci0gICAgICB0X2ZpZWxkKiBmaWVsZCA9IE5VTEw7Ci0KLSAgICAgIGZvciAodmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7Ci0gICAgICAgICAgIGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7Ci0gICAgICAgICAgICsrZl9pdGVyKQotICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkKLSAgICAgICAgICBmaWVsZCA9ICgqZl9pdGVyKTsKLQotICAgICAgaWYgKGZpZWxkID09IE5VTEwpCi0gICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgY25hbWUgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOwotCi0gICAgICBzdHJpbmcgZm5hbWUgPSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7Ci0gICAgICBzdHJpbmcgY29uc3RfdmFsdWUgPSByZW5kZXJfY29uc3RfdmFsdWUoZmllbGQtPmdldF90eXBlKCksIHZfaXRlci0+c2Vjb25kKTsKLQotICAgICAgb3V0IDw8IChmaXJzdCA/ICIiIDogIiwgIik7Ci0gICAgICBvdXQgPDwgZmllbGRfbmFtZShjbmFtZSwgZm5hbWUpIDw8ICIgPSAiOwotICAgICAgaWYgKGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTCB8fAotICAgICAgICAgKCh0X3R5cGUqKWZpZWxkLT5nZXRfdHlwZSgpKS0+aXNfeGNlcHRpb24oKSkgewotICAgICAgICBvdXQgPDwgIlAuSnVzdCAiOwotICAgICAgfQotICAgICAgb3V0IDw8IGNvbnN0X3ZhbHVlOwotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICBvdXQgPDwgIn0iOwotCi0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOwotICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0KLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotCi0gICAgb3V0IDw8ICIoTWFwLmZyb21MaXN0IFsiOwotCi0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHN0cmluZyBrZXkgPSByZW5kZXJfY29uc3RfdmFsdWUoa3R5cGUsIHZfaXRlci0+Zmlyc3QpOwotICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZSh2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotICAgICAgb3V0IDw8IChmaXJzdCA/ICIiIDogIiwiKTsKLSAgICAgIG91dCA8PCAiKCIgPDwga2V5IDw8ICIsIiA8PCB2YWwgPDwgIikiOwotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9Ci0gICAgb3V0IDw8ICJdKSI7Ci0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKLSAgICB0X3R5cGUqIGV0eXBlID0gdHlwZS0+aXNfbGlzdCgpCi0gICAgICAgID8gKCh0X2xpc3QqKSB0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpCi0gICAgICAgIDogKCh0X3NldCopIHR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0KLSAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKLSAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0KLSAgICBpZiAodHlwZS0+aXNfc2V0KCkpCi0gICAgICBvdXQgPDwgIihTZXQuZnJvbUxpc3QgWyI7Ci0gICAgZWxzZQotICAgICAgb3V0IDw8ICIoVmVjdG9yLmZyb21MaXN0IFsiOwotCi0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIG91dCA8PCAoZmlyc3QgPyAiIiA6ICIsIik7Ci0gICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGV0eXBlLCAqdl9pdGVyKTsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfQotCi0gICAgb3V0IDw8ICJdKSI7Ci0KLSAgfSBlbHNlIHsKLSAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIENPTlNUQU5UIEZPUiBUWVBFOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIHJldHVybiBvdXQuc3RyKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgInN0cnVjdCIKLSAqLwotdm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGdlbmVyYXRlX2hzX3N0cnVjdCh0c3RydWN0LCBmYWxzZSk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGV4Y2VwdGlvbi4gQmFzaWNhbGx5IHRoZSBzYW1lCi0gKiBhcyBhIHN0cnVjdCwgYnV0IGFsc28gaGFzIGFuIGV4Y2VwdGlvbiBkZWNsYXJhdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHhjZXB0aW9uIFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7Ci0gIGdlbmVyYXRlX2hzX3N0cnVjdCh0eGNlcHRpb24sIHRydWUpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIEhhc2tlbGwgc3RydWN0Ci0gKi8KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX2hzX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgewotICBnZW5lcmF0ZV9oc19zdHJ1Y3RfZGVmaW5pdGlvbihmX3R5cGVzXyx0c3RydWN0LCBpc19leGNlcHRpb24sZmFsc2UpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX2hzX3N0cnVjdF9kZWZpbml0aW9uKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoZWxwZXIpIHsKLSAgKHZvaWQpIGhlbHBlcjsKLSAgc3RyaW5nIHRuYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QpOwotICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotCi0gIGluZGVudChvdXQpIDw8ICJkYXRhICIgPDwgdG5hbWUgPDwgIiA9ICIgPDwgdG5hbWU7Ci0gIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsKLSAgICAgICAgIG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOwotICAgICAgICAgKyttX2l0ZXIpIHsKLSAgICAgIGlmIChmaXJzdCkgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAieyAiOwotICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgIiwgIjsKLSAgICAgIH0KLSAgICAgIHN0cmluZyBtbmFtZSA9ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICAgIG91dCA8PCBmaWVsZF9uYW1lKHRuYW1lLCBtbmFtZSkgPDwgIiA6OiAiOwotICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwgfHwKLSAgICAgICAgICgodF90eXBlKikoKm1faXRlciktPmdldF90eXBlKCkpLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgICAgIG91dCA8PCAiUC5NYXliZSAiOwotICAgICAgfQotICAgICAgb3V0IDw8IHJlbmRlcl9oc190eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSwgdHJ1ZSkgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0KLQotICBvdXQgPDwgIiBkZXJpdmluZyAoUC5TaG93LFAuRXEsVFkuVHlwZWFibGUpIiA8PCBlbmRsOwotCi0gIGlmIChpc19leGNlcHRpb24pCi0gICAgb3V0IDw8ICJpbnN0YW5jZSBYLkV4Y2VwdGlvbiAiIDw8IHRuYW1lIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgImluc3RhbmNlIEguSGFzaGFibGUgIiA8PCB0bmFtZSA8PCAiIHdoZXJlIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgImhhc2hXaXRoU2FsdCBzYWx0IHJlY29yZCA9IHNhbHQiOwotICBmb3IgKHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgc3RyaW5nIG1uYW1lID0gKCptX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIGluZGVudChvdXQpIDw8ICIgYEguaGFzaFdpdGhTYWx0YCAiIDw8IGZpZWxkX25hbWUodG5hbWUsIG1uYW1lKSA8PCAiIHJlY29yZCI7Ci0gIH0KLSAgaW5kZW50KG91dCkgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLQotICBnZW5lcmF0ZV9oc19zdHJ1Y3RfYXJiaXRyYXJ5KG91dCwgdHN0cnVjdCk7Ci0gIGdlbmVyYXRlX2hzX3N0cnVjdF93cml0ZXIob3V0LCB0c3RydWN0KTsKLSAgZ2VuZXJhdGVfaHNfc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QpOwotICBnZW5lcmF0ZV9oc190eXBlbWFwKG91dCwgdHN0cnVjdCk7Ci0gIGdlbmVyYXRlX2hzX2RlZmF1bHQob3V0LCB0c3RydWN0KTsKLX0KLQotdm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaHNfc3RydWN0X2FyYml0cmFyeShvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBzdHJpbmcgdG5hbWUgPSB0eXBlX25hbWUodHN0cnVjdCk7Ci0gIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLQotICBpbmRlbnQob3V0KSA8PCAiaW5zdGFuY2UgUUMuQXJiaXRyYXJ5ICIgPDwgdG5hbWUgPDwgIiB3aGVyZSAiPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiYXJiaXRyYXJ5ID0gTS5saWZ0TSAiIDw8IHRuYW1lOwotICAgIGluZGVudF91cCgpOyBpbmRlbnRfdXAoKTsgaW5kZW50X3VwKCk7IGluZGVudF91cCgpOwotICAgIGJvb2wgZmlyc3Q9dHJ1ZTsKLSAgICBmb3IgKHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsKLSAgICAgICAgIG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOwotICAgICAgICAgKyttX2l0ZXIpIHsKLSAgICAgIGlmKGZpcnN0KSB7Ci0gICAgICAgIGZpcnN0PWZhbHNlOwotICAgICAgICBvdXQgPDwgIiAiOwotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJgTS5hcGAiOwotICAgICAgfQotICAgICAgb3V0IDw8ICIoIjsKLSAgICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMIHx8Ci0gICAgICAgICAoKHRfdHlwZSopKCptX2l0ZXIpLT5nZXRfdHlwZSgpKS0+aXNfeGNlcHRpb24oKSkgewotICAgICAgICBvdXQgPDwgIk0ubGlmdE0gUC5KdXN0ICI7Ci0gICAgICB9Ci0gICAgICBvdXQgPDwgIlFDLmFyYml0cmFyeSkiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudF9kb3duKCk7IGluZGVudF9kb3duKCk7IGluZGVudF9kb3duKCk7IGluZGVudF9kb3duKCk7Ci0KLSAgICAvLyBTaHJpbmsKLSAgICBpbmRlbnQob3V0KSA8PCAic2hyaW5rIG9iaiB8IG9iaiA9PSBkZWZhdWx0XyIgPDwgdG5hbWUgPDwgIiA9IFtdIiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgICAgICAgICAgIHwgUC5vdGhlcndpc2UgPSBNLmNhdE1heWJlcyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBmaXJzdCA9IHRydWU7Ci0gICAgZm9yICh2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7Ci0gICAgICAgICBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsKLSAgICAgICAgICsrbV9pdGVyKSB7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgIlsgIjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICIsICI7Ci0gICAgICB9Ci0gICAgICBzdHJpbmcgZm5hbWUgPSBmaWVsZF9uYW1lKHRuYW1lLCAoKm1faXRlciktPmdldF9uYW1lKCkpOwotICAgICAgb3V0IDw8ICJpZiBvYmogPT0gZGVmYXVsdF8iIDw8IHRuYW1lOwotICAgICAgb3V0IDw8ICJ7IiA8PCBmbmFtZSA8PCAiID0gIiA8PCBmbmFtZSA8PCAiIG9ian0gIjsKLSAgICAgIG91dCA8PCAidGhlbiBQLk5vdGhpbmcgIjsKLSAgICAgIG91dCA8PCAiZWxzZSBQLkp1c3QgJCBkZWZhdWx0XyIgPDwgdG5hbWU7Ci0gICAgICBvdXQgPDwgInsiIDw8IGZuYW1lIDw8ICIgPSAiIDw8IGZuYW1lIDw8ICIgb2JqfSIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50KG91dCkgPDwgIl0iIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfSBlbHNlIHsgLyogMCA9PSBtZW1iZXJzLnNpemUoKSAqLwotICAgICBpbmRlbnQob3V0KSA8PCAiYXJiaXRyYXJ5ID0gUUMuZWxlbWVudHMgWyIgPDx0bmFtZTw8ICJdIiA8PCBlbmRsOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIHRoZSByZWFkIG1ldGhvZCBmb3IgYSBzdHJ1Y3QKLSAqLwotdm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaHNfc3RydWN0X3JlYWRlcihvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgc3RyaW5nIHNuYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QpOwotICBzdHJpbmcgaWQgPSB0bXAoIl9pZCIpOwotICBzdHJpbmcgdmFsID0gdG1wKCJfdmFsIik7Ci0KLSAgaW5kZW50KG91dCkgPDwgInRvXyIgPDwgc25hbWUgPDwgIiA6OiBULlRocmlmdFZhbCAtPiAiIDw8IHNuYW1lIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ0b18iIDw8IHNuYW1lIDw8ICIgKFQuVFN0cnVjdCBmaWVsZHMpID0gIiA8PCBzbmFtZSA8PCAieyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0KLSAgLy8gR2VuZXJhdGUgZGVzZXJpYWxpemF0aW9uIGNvZGUgZm9yIGtub3duIGNhc2VzCi0gIGZvciAodmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7Ci0gICAgICAgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsKLSAgICAgICArK2ZfaXRlcikgewotICAgIGludDMyX3Qga2V5ID0gKCpmX2l0ZXIpLT5nZXRfa2V5KCk7Ci0gICAgc3RyaW5nIGV0eXBlID0gdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgc3RyaW5nIGZuYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotCi0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICBvdXQgPDwgIiwiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgLy8gRmlsbCBpbiBGaWVsZAotICAgIGluZGVudChvdXQpIDw8IGZpZWxkX25hbWUoc25hbWUsIGZuYW1lKSA8PCAiID0gIjsKLQotICAgIG91dCA8PCAiUC5tYXliZSAoIjsKLSAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgewotICAgICAgb3V0IDw8ICJQLmVycm9yIFwiTWlzc2luZyByZXF1aXJlZCBmaWVsZDogIiA8PCBmbmFtZSA8PCAiXCIiOwotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAoKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwgfHwKLSAgICAgICAgICgodF90eXBlKikoKmZfaXRlciktPmdldF90eXBlKCkpLT5pc194Y2VwdGlvbigpKSAmJgotICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfdmFsdWUoKSA9PSBOVUxMKSB7Ci0gICAgICAgIG91dCA8PCAiUC5Ob3RoaW5nIjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PCBmaWVsZF9uYW1lKHNuYW1lLCBmbmFtZSkgPDwgIiBkZWZhdWx0XyIgPDwgc25hbWU7Ci0gICAgICB9Ci0gICAgfQotICAgIG91dCA8PCAiKSAiOwotCi0gICAgb3V0IDw8ICIoXFwoXywiIDw8IHZhbCA8PCAiKSAtPiAiOwotICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMIHx8Ci0gICAgICAgKCh0X3R5cGUqKSgqZl9pdGVyKS0+Z2V0X3R5cGUoKSktPmlzX3hjZXB0aW9uKCkpCi0gICAgICBvdXQgPDwgIlAuSnVzdCAiOwotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgdmFsKTsKLSAgICBvdXQgPDwgIikiOwotICAgIG91dCA8PCAiIChNYXAubG9va3VwICgiIDw8IGtleSA8PCAiKSBmaWVsZHMpIjsKLQotICB9Ci0KLSAgb3V0IDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotCi0gIC8vIHJlYWQKLSAgc3RyaW5nIHRtYXAgPSB0eXBlX25hbWUodHN0cnVjdCwgInR5cGVtYXBfIik7Ci0gIGluZGVudChvdXQpIDw8ICJ0b18iIDw8IHNuYW1lIDw8ICIgXyA9IFAuZXJyb3IgXCJub3QgYSBzdHJ1Y3RcIiIgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAicmVhZF8iIDw8IHNuYW1lIDw8Ci0gICAgIiA6OiAoVC5UcmFuc3BvcnQgdCwgVC5Qcm90b2NvbCBwKSA9PiBwIHQgLT4gUC5JTyAiIDw8IHNuYW1lIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJyZWFkXyIgPDwgc25hbWUgPDwgIiBpcHJvdCA9IHRvXyIgPDwgc25hbWU7Ci0gIG91dCA8PCAiIDwkPiBULnJlYWRWYWwgaXByb3QgKFQuVF9TVFJVQ1QgIiA8PCB0bWFwIDw8ICIpIiA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJkZWNvZGVfIiA8PCBzbmFtZSA8PAotICAgICIgOjogKFQuUHJvdG9jb2wgcCwgVC5UcmFuc3BvcnQgdCkgPT4gcCB0IC0+IExCUy5CeXRlU3RyaW5nIC0+ICIgPDwgc25hbWUgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgImRlY29kZV8iIDw8IHNuYW1lIDw8ICIgaXByb3QgYnMgPSB0b18iIDw8IHNuYW1lIDw8ICIgJCAiOwotICBvdXQgPDwgIlQuZGVzZXJpYWxpemVWYWwgaXByb3QgKFQuVF9TVFJVQ1QgIiA8PCB0bWFwIDw8ICIpIGJzIiA8PCBlbmRsOwotfQotCi12b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9oc19zdHJ1Y3Rfd3JpdGVyKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIHN0cmluZyBuYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBzdHJpbmcgc3RyID0gdG1wKCJfc3RyIik7Ci0gIHN0cmluZyBmID0gdG1wKCJfZiIpOwotICBzdHJpbmcgdiA9IHRtcCgiX3YiKTsKLQotICBpbmRlbnQob3V0KSA8PCAiZnJvbV8iIDw8IG5hbWUgPDwgIiA6OiAiIDw8IG5hbWUgPDwgIiAtPiBULlRocmlmdFZhbCIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgImZyb21fIiA8PCBuYW1lIDw8ICIgcmVjb3JkID0gVC5UU3RydWN0ICQgTWFwLmZyb21MaXN0ICI7Ci0gIGluZGVudF91cCgpOwotCi0gIC8vIEdldCBFeGNlcHRpb25zCi0gIGJvb2wgaGFzRXhuID0gZmFsc2U7Ci0gIGZvciAodmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7Ci0gICAgICAgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsKLSAgICAgICArK2ZfaXRlcikgewotICAgIGlmICgoKHRfdHlwZSopKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKS0+aXNfeGNlcHRpb24oKSkgewotICAgICAgaGFzRXhuID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi0gIGJvb2wgaXNmaXJzdCA9IHRydWU7Ci0gIGlmIChoYXNFeG4pIHsKLSAgICBvdXQgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiKGxldCBleG5zID0gTS5jYXRNYXliZXMgIjsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBmb3IgKHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOwotICAgICAgICAgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsKLSAgICAgICAgICsrZl9pdGVyKSB7Ci0gICAgICBpZiAoKCh0X3R5cGUqKSgqZl9pdGVyKS0+Z2V0X3R5cGUoKSktPmlzX3hjZXB0aW9uKCkpIHsKLSAgICAgICAgaWYgKGlzZmlyc3QpIHsKLSAgICAgICAgICBvdXQgPDwgIlsgIjsKLSAgICAgICAgICBpc2ZpcnN0ID0gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgb3V0IDw8ICIsICI7Ci0gICAgICAgIH0KLSAgICAgICAgc3RyaW5nIG1uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICAgICBpbnQzMl90IGtleSA9ICgqZl9pdGVyKS0+Z2V0X2tleSgpOwotICAgICAgICAgb3V0IDw8ICIoXFwiIDw8IHYgPDwgIiAtPiAoIiA8PCBrZXkgPDwgIiwgKFwiIiA8PCBtbmFtZSA8PCAiXCIsIjsKLSAgICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3R5cGUob3V0LCAoKmZfaXRlciktPmdldF90eXBlKCksIHYpOwotICAgICAgICBvdXQgPDwgIikpKSA8JD4gIiA8PCBmaWVsZF9uYW1lKG5hbWUsIG1uYW1lKSA8PCAiIHJlY29yZCI7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmICghaXNmaXJzdCkgewotICAgICAgb3V0IDw8ICJdIiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJpbiBpZiBQLm5vdCAoUC5udWxsIGV4bnMpIHRoZW4gZXhucyBlbHNlICI7Ci0gICAgaW5kZW50X3VwKCk7Ci0gIH0gZWxzZSB7Ci0gICAgb3V0IDw8ICIkICI7Ci0gIH0KLQotICBvdXQgPDwgIk0uY2F0TWF5YmVzIiA8PCBlbmRsOwotICAvLyBHZXQgdGhlIFJlc3QKLSAgaXNmaXJzdCA9IHRydWU7Ci0gIGZvciAodmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7Ci0gICAgICAgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsKLSAgICAgICArK2ZfaXRlcikgewotICAgIC8vIFdyaXRlIGZpZWxkIGhlYWRlcgotICAgIGlmIChpc2ZpcnN0KSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiWyAiOwotICAgICAgaXNmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiLCAiOwotICAgIH0KLSAgICBzdHJpbmcgbW5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgaW50MzJfdCBrZXkgPSAoKmZfaXRlciktPmdldF9rZXkoKTsKLSAgICBvdXQgPDwgIihcXCI7Ci0gICAgb3V0IDw8IHYgPDwgIiAtPiAiOwotICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX09QVElPTkFMICYmCi0gICAgICAgISgodF90eXBlKikoKmZfaXRlciktPmdldF90eXBlKCkpLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgICBvdXQgPDwgIlAuSnVzdCAiOwotICAgIH0KLSAgICBvdXQgPDwgIigiIDw8IGtleSA8PCAiLCAoXCIiIDw8IG1uYW1lIDw8ICJcIiwiOwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV90eXBlKG91dCwgKCpmX2l0ZXIpLT5nZXRfdHlwZSgpLCB2KTsKLSAgICBvdXQgPDwgIikpKSAiOwotICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX09QVElPTkFMICYmCi0gICAgICAgISgodF90eXBlKikoKmZfaXRlciktPmdldF90eXBlKCkpLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgICBvdXQgPDwgIiQiOwotICAgIH0gZWxzZSB7Ci0gICAgICBvdXQgPDwgIjwkPiI7Ci0gICAgfQotICAgIG91dCA8PCAiICIgPDwgZmllbGRfbmFtZShuYW1lLCBtbmFtZSkgPDwgIiByZWNvcmQiIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBXcml0ZSB0aGUgc3RydWN0IG1hcAotICBpZiAoaXNmaXJzdCkgewotICAgIGluZGVudChvdXQpIDw8ICJbXSIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiXSIgPDwgZW5kbDsKLSAgfQotICBpZiAoaGFzRXhuKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIikiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfQotICBpbmRlbnRfZG93bigpOwotCi0gIC8vIHdyaXRlCi0gIGluZGVudChvdXQpIDw8ICJ3cml0ZV8iIDw8IG5hbWUgPDwgIiA6OiAoVC5Qcm90b2NvbCBwLCBULlRyYW5zcG9ydCB0KSA9PiBwIHQgLT4gIgotICAgICAgICAgICAgICA8PCBuYW1lIDw8ICIgLT4gUC5JTyAoKSIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIndyaXRlXyIgPDwgbmFtZSA8PCAiIG9wcm90IHJlY29yZCA9IFQud3JpdGVWYWwgb3Byb3QgJCBmcm9tXyI7Ci0gIG91dCA8PCBuYW1lIDw8ICIgcmVjb3JkIiA8PCBlbmRsOwotCi0gIC8vIGVuY29kZQotICBpbmRlbnQob3V0KSA8PCAiZW5jb2RlXyIgPDwgbmFtZSA8PCAiIDo6IChULlByb3RvY29sIHAsIFQuVHJhbnNwb3J0IHQpID0+IHAgdCAtPiAiCi0gICAgICAgICAgICAgIDw8IG5hbWUgPDwgIiAtPiBMQlMuQnl0ZVN0cmluZyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgImVuY29kZV8iIDw8IG5hbWUgPDwgIiBvcHJvdCByZWNvcmQgPSBULnNlcmlhbGl6ZVZhbCBvcHJvdCAkICI7Ci0gIG91dCA8PCAiZnJvbV8iIDw8IG5hbWUgPDwgIiByZWNvcmQiIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgdGhyaWZ0IHNlcnZpY2UuCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBmX3NlcnZpY2VfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBjYXBpdGFsaXplKHNlcnZpY2VfbmFtZV8pICsgIi5ocyI7Ci0gIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKLQotICBmX3NlcnZpY2VfIDw8IGhzX2xhbmd1YWdlX3ByYWdtYSgpIDw8IGVuZGw7Ci0gIGZfc2VydmljZV8gPDwgaHNfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbDsKLSAgZl9zZXJ2aWNlXyA8PCAibW9kdWxlICIgPDwgY2FwaXRhbGl6ZShzZXJ2aWNlX25hbWVfKSA8PCAiIHdoZXJlIiA8PCBlbmRsOwotICBmX3NlcnZpY2VfIDw8IGhzX2ltcG9ydHMoKSA8PCBlbmRsOwotCi0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSkgewotICAgIGZfc2VydmljZV8gPDwgImltcG9ydCBxdWFsaWZpZWQgIiA8PCBjYXBpdGFsaXplKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpKSA8PCBlbmRsOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PCAiaW1wb3J0ICIgPDwgY2FwaXRhbGl6ZShwcm9ncmFtX25hbWVfKSA8PCAiX1R5cGVzIiA8PCBlbmRsOwotICBmX3NlcnZpY2VfIDw8ICJpbXBvcnQgcXVhbGlmaWVkICIgPDwgY2FwaXRhbGl6ZShzZXJ2aWNlX25hbWVfKSA8PCAiX0lmYWNlIGFzIElmYWNlIiA8PCBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIHRoZSB0aHJlZSBtYWluIHBhcnRzIG9mIHRoZSBzZXJ2aWNlCi0gIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0c2VydmljZSk7Ci0KLSAgLy8gQ2xvc2Ugc2VydmljZSBmaWxlCi0gIGZfc2VydmljZV8uY2xvc2UoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgaGVscGVyIGZ1bmN0aW9ucyBmb3IgYSBzZXJ2aWNlLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgotICovCi12b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSkgewotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIi0tIEhFTFBFUiBGVU5DVElPTlMgQU5EIFNUUlVDVFVSRVMgLS0iIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCBlbmRsOwotCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9zdHJ1Y3QqIHRzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotICAgIGdlbmVyYXRlX2hzX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sdHMsIGZhbHNlKTsKLSAgICBnZW5lcmF0ZV9oc19mdW5jdGlvbl9oZWxwZXJzKCpmX2l0ZXIpOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGFuZCBoZWxwZXJzIGZvciBhIGZ1bmN0aW9uLgotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uCi0gKi8KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX2hzX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgZmllbGRfbmFtZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCksICJyZXN1bHQiKSk7Ci0gIHRfZmllbGQgc3VjY2Vzcyh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksICJzdWNjZXNzIiwgMCk7Ci0KLSAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkKLSAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKLQotICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7Ci0KLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikKLSAgICByZXN1bHQuYXBwZW5kKCpmX2l0ZXIpOwotCi0gIGdlbmVyYXRlX2hzX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sJnJlc3VsdCwgZmFsc2UpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlIHRoZSBtYXAgZnJvbSBmaWVsZCBuYW1lcyB0byAodHlwZSwgaWQpCi0gKiBAcGFyYW0gdHN0cnVjdCB0aGUgU3RydWN0Ci0gKi8KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX2hzX3R5cGVtYXAob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgc3RyaW5nIG5hbWUgPSB0eXBlX25hbWUodHN0cnVjdCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgaW5kZW50KG91dCkgPDwgInR5cGVtYXBfIiA8PCBuYW1lIDw8ICIgOjogVC5UeXBlTWFwIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAidHlwZW1hcF8iIDw8IG5hbWUgPDwgIiA9IE1hcC5mcm9tTGlzdCBbIjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAodmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7Ci0gICAgICAgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsKLSAgICAgICArK2ZfaXRlcikgewotICAgIHN0cmluZyBtbmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICBpZiAoIWZpcnN0KSB7Ci0gICAgICBvdXQgPDwgIiwiOwotICAgIH0KLQotICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICBpbnQzMl90IGtleSA9ICgqZl9pdGVyKS0+Z2V0X2tleSgpOwotICAgIG91dCA8PCAiKCIgPDwga2V5IDw8ICIsKFwiIiA8PCBtbmFtZSA8PCAiXCIsIiA8PCB0eXBlX3RvX2VudW0odHlwZSkgPDwgIikpIjsKLSAgICBmaXJzdCA9IGZhbHNlOwotICB9Ci0gIG91dCA8PCAiXSIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBnZW5lcmF0ZSB0aGUgc3RydWN0IHdpdGggZGVmYXVsdCB2YWx1ZXMgZmlsbGVkIGluCi0gKiBAcGFyYW0gdHN0cnVjdCB0aGUgU3RydWN0Ci0gKi8KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX2hzX2RlZmF1bHQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgc3RyaW5nIG5hbWUgPSB0eXBlX25hbWUodHN0cnVjdCk7Ci0gIHN0cmluZyBmbmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0LCAiZGVmYXVsdF8iKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgZm5hbWUgPDwgIiA6OiAiIDw8IG5hbWUgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgZm5hbWUgPDwgIiA9ICIgPDwgbmFtZSA8PCAieyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOwotICAgICAgIGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7Ci0gICAgICAgKytmX2l0ZXIpIHsKLSAgICBzdHJpbmcgbW5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICBvdXQgPDwgIiwiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSgoKmZfaXRlciktPmdldF90eXBlKCkpOwotICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlID0gKCpmX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgICBpbmRlbnQob3V0KSA8PCBmaWVsZF9uYW1lKG5hbWUsIG1uYW1lKSA8PCAiID0gIjsKLSAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTCB8fAotICAgICAgICgodF90eXBlKikoKmZfaXRlciktPmdldF90eXBlKCkpLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgICBpZiAodmFsdWUgPT0gTlVMTCkgewotICAgICAgICBvdXQgPDwgIlAuTm90aGluZyI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgIlAuSnVzdCAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0eXBlLCB2YWx1ZSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUodHlwZSwgdmFsdWUpOwotICAgIH0KLSAgfQotICBvdXQgPDwgIn0iIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBpbnRlcmZhY2UgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKLSAqLwotdm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZl9pZmFjZV9uYW1lID0gZ2V0X291dF9kaXIoKSArIGNhcGl0YWxpemUoc2VydmljZV9uYW1lXykgKyAiX0lmYWNlLmhzIjsKLSAgZl9pZmFjZV8ub3BlbihmX2lmYWNlX25hbWUuY19zdHIoKSk7Ci0KLSAgZl9pZmFjZV8gPDwgaHNfbGFuZ3VhZ2VfcHJhZ21hKCkgPDwgZW5kbDsKLSAgZl9pZmFjZV8gPDwgaHNfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbDsKLQotICBmX2lmYWNlXyA8PCAibW9kdWxlICIgPDwgY2FwaXRhbGl6ZShzZXJ2aWNlX25hbWVfKSA8PCAiX0lmYWNlIHdoZXJlIiA8PCBlbmRsOwotCi0gIGZfaWZhY2VfIDw8IGhzX2ltcG9ydHMoKSA8PCBlbmRsOwotICBmX2lmYWNlXyA8PCAiaW1wb3J0ICIgPDwgY2FwaXRhbGl6ZShwcm9ncmFtX25hbWVfKSA8PCAiX1R5cGVzIiA8PCBlbmRsOwotICBmX2lmYWNlXyA8PCBlbmRsOwotCi0gIHN0cmluZyBzbmFtZSA9IGNhcGl0YWxpemUoc2VydmljZV9uYW1lXyk7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgc3RyaW5nIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOwotCi0gICAgaW5kZW50KGZfaWZhY2VfKSA8PCAiaW1wb3J0ICIgPDwgZXh0ZW5kcyA8PCAiX0lmYWNlIiA8PCBlbmRsOwotICAgIGluZGVudChmX2lmYWNlXykgPDwgImNsYXNzICIgPDwgZXh0ZW5kcyA8PCAiX0lmYWNlIGEgPT4gIiA8PCBzbmFtZSA8PCAiX0lmYWNlIGEgd2hlcmUiIDw8IGVuZGw7Ci0KLSAgfSBlbHNlIHsKLSAgICBpbmRlbnQoZl9pZmFjZV8pIDw8ICJjbGFzcyAiIDw8IHNuYW1lIDw8ICJfSWZhY2UgYSB3aGVyZSIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudF91cCgpOwotCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHN0cmluZyBmdCA9IGZ1bmN0aW9uX3R5cGUoKmZfaXRlciwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgaW5kZW50KGZfaWZhY2VfKSA8PCBkZWNhcGl0YWxpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiIDo6IGEgLT4gIiA8PCBmdCAgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGZfaWZhY2VfLmNsb3NlKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgZGVmaW5pdGlvbi4gTm90ZSB0aGF0IGluIEhhc2tlbGwsIHRoZSBjbGllbnQgZG9lc24ndCBpbXBsZW1lbnQgaWZhY2UuIFRoaXMgaXMgYmVjYXVzZQotICogVGhlIGNsaWVudCBkb2VzIG5vdCAoYW5kIHNob3VsZCBub3QgaGF2ZSB0bykgZGVhbCB3aXRoIGFyZ3VtZW50cyBiZWluZyBOb3RoaW5nLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCi0gKi8KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGZfY2xpZW50X25hbWUgPSBnZXRfb3V0X2RpcigpICsgY2FwaXRhbGl6ZShzZXJ2aWNlX25hbWVfKSArICJfQ2xpZW50LmhzIjsKLSAgZl9jbGllbnRfLm9wZW4oZl9jbGllbnRfbmFtZS5jX3N0cigpKTsKLSAgZl9jbGllbnRfIDw8IGhzX2xhbmd1YWdlX3ByYWdtYSgpIDw8IGVuZGw7Ci0gIGZfY2xpZW50XyA8PCBoc19hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsOwotCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIHN0cmluZyBleHBvcnRzID0gIiI7Ci0KLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgZXhwb3J0cyArPSAoZmlyc3QgPyAiIiA6ICIsIik7Ci0gICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgZXhwb3J0cyArPSBkZWNhcGl0YWxpemUoZnVubmFtZSk7Ci0gICAgZmlyc3QgPSBmYWxzZTsKLSAgfQotCi0gIHN0cmluZyBzbmFtZSA9IGNhcGl0YWxpemUoc2VydmljZV9uYW1lXyk7Ci0gIGluZGVudChmX2NsaWVudF8pIDw8ICJtb2R1bGUgIiA8PCBzbmFtZSA8PCAiX0NsaWVudCgiIDw8IGV4cG9ydHMgPDwgIikgd2hlcmUiIDw8IGVuZGw7Ci0KLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAiaW1wb3J0ICIgPDwgZXh0ZW5kcyA8PCAiX0NsaWVudCIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudChmX2NsaWVudF8pIDw8ICJpbXBvcnQgcXVhbGlmaWVkIERhdGEuSU9SZWYgYXMgUiIgPDwgZW5kbDsKLSAgaW5kZW50KGZfY2xpZW50XykgPDwgaHNfaW1wb3J0cygpIDw8IGVuZGw7Ci0gIGluZGVudChmX2NsaWVudF8pIDw8ICJpbXBvcnQgIiA8PCBjYXBpdGFsaXplKHByb2dyYW1fbmFtZV8pIDw8ICJfVHlwZXMiIDw8IGVuZGw7Ci0gIGluZGVudChmX2NsaWVudF8pIDw8ICJpbXBvcnQgIiA8PCBjYXBpdGFsaXplKHNlcnZpY2VfbmFtZV8pIDw8IGVuZGw7Ci0KLSAgLy8gREFUUyBSSVRFIEEgR0xPQkFMIFZBUgotICBpbmRlbnQoZl9jbGllbnRfKSA8PCAic2VxaWQgPSBSLm5ld0lPUmVmIDAiIDw8IGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOwotICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotCi0gICAgc3RyaW5nIGZhcmdzID0gIiI7Ci0gICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpCi0gICAgICBmYXJncyArPSAiIGFyZ18iICsgKCpmbGRfaXRlciktPmdldF9uYW1lKCk7Ci0KLSAgICAvLyBPcGVuIGZ1bmN0aW9uCi0gICAgaW5kZW50KGZfY2xpZW50XykgPDwgZGVjYXBpdGFsaXplKGZ1bm5hbWUpIDw8ICIgKGlwLG9wKSIgPDwgIGZhcmdzIDw8ICIgPSBkbyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAgInNlbmRfIiA8PCBmdW5uYW1lIDw8ICIgb3AiIDw8IGZhcmdzOwotCi0gICAgZl9jbGllbnRfIDw8IGVuZGw7Ci0KLSAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpCi0gICAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAicmVjdl8iIDw8IGZ1bm5hbWUgPDwgIiBpcCIgPDwgZW5kbDsKLQotCi0gICAgaW5kZW50X2Rvd24oKTsKLQotICAgIGluZGVudChmX2NsaWVudF8pIDw8ICJzZW5kXyIgPDwgZnVubmFtZSA8PCAiIG9wIiA8PCBmYXJncyA8PCAiID0gZG8iIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAic2VxIDwtIHNlcWlkIiA8PCBlbmRsOwotICAgIGluZGVudChmX2NsaWVudF8pIDw8ICJzZXFuIDwtIFIucmVhZElPUmVmIHNlcSIgPDwgZW5kbDsKLSAgICBzdHJpbmcgYXJnc25hbWUgPSBjYXBpdGFsaXplKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfYXJncyIpOwotCi0gICAgLy8gU2VyaWFsaXplIHRoZSByZXF1ZXN0IGhlYWRlcgotICAgIHN0cmluZyBmbmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICBzdHJpbmcgbXNnVHlwZSA9ICgqZl9pdGVyKS0+aXNfb25ld2F5KCkgPyAiVC5NX09ORVdBWSIgOiAiVC5NX0NBTEwiOwotICAgIGluZGVudChmX2NsaWVudF8pIDw8ICJULndyaXRlTWVzc2FnZUJlZ2luIG9wIChcIiIgPDwgZm5hbWUgPDwgIlwiLCAiIDw8IG1zZ1R5cGUgPDwgIiwgc2VxbikiIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfY2xpZW50XykgPDwgIndyaXRlXyIgPDwgYXJnc25hbWUgPDwgIiBvcCAoIiA8PCBhcmdzbmFtZSA8PCAieyI7Ci0KLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7Ci0gICAgICAgICBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7Ci0gICAgICAgICArK2ZsZF9pdGVyKSB7Ci0gICAgICBzdHJpbmcgZmllbGRuYW1lID0gKCpmbGRfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgICBmX2NsaWVudF8gPDwgKGZpcnN0ID8gIiIgOiAiLCIpOwotICAgICAgZl9jbGllbnRfIDw8IGZpZWxkX25hbWUoYXJnc25hbWUsIGZpZWxkbmFtZSkgPDwgIj0iOwotICAgICAgaWYgKCgqZmxkX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTCB8fAotICAgICAgICAgKCh0X3R5cGUqKSgqZmxkX2l0ZXIpLT5nZXRfdHlwZSgpKS0+aXNfeGNlcHRpb24oKSkKLSAgICAgICAgZl9jbGllbnRfIDw8ICJQLkp1c3QgIjsKLSAgICAgIGZfY2xpZW50XyA8PCAiYXJnXyIgPDwgZmllbGRuYW1lOwotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9Ci0gICAgZl9jbGllbnRfIDw8ICJ9KSIgPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAiVC53cml0ZU1lc3NhZ2VFbmQgb3AiIDw8IGVuZGw7Ci0gICAgCi0gICAgLy8gV3JpdGUgdG8gdGhlIHN0cmVhbQotICAgIGluZGVudChmX2NsaWVudF8pIDw8ICJULnRGbHVzaCAoVC5nZXRUcmFuc3BvcnQgb3ApIiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0KLSAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIHN0cmluZyByZXN1bHRuYW1lID0gY2FwaXRhbGl6ZSgoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOwotICAgICAgdF9zdHJ1Y3Qgbm9hcmdzKHByb2dyYW1fKTsKLQotICAgICAgc3RyaW5nIGZ1bm5hbWUgPSBzdHJpbmcoInJlY3ZfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgICB0X2Z1bmN0aW9uIHJlY3ZfZnVuY3Rpb24oKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLCBmdW5uYW1lLCAmbm9hcmdzKTsKLQotCi0gICAgICAvLyBPcGVuIGZ1bmN0aW9uCi0gICAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCBmdW5uYW1lIDw8ICIgaXAgPSBkbyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotCi0gICAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAiKGZuYW1lLCBtdHlwZSwgcnNlcWlkKSA8LSBULnJlYWRNZXNzYWdlQmVnaW4gaXAiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAiTS53aGVuIChtdHlwZSA9PSBULk1fRVhDRVBUSU9OKSAkIGRvIHsgZXhuIDwtIFQucmVhZEFwcEV4biBpcCA7IFQucmVhZE1lc3NhZ2VFbmQgaXAgOyBYLnRocm93IGV4biB9IiA8PCBlbmRsOwotCi0gICAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAicmVzIDwtIHJlYWRfIiA8PCByZXN1bHRuYW1lIDw8ICIgaXAiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAiVC5yZWFkTWVzc2FnZUVuZCBpcCIgPDwgZW5kbDsKLQotICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7Ci0gICAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLQotICAgICAgZm9yICh2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsKLSAgICAgICAgICAgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsKLSAgICAgICAgICAgKyt4X2l0ZXIpIHsKLSAgICAgICAgaW5kZW50KGZfY2xpZW50XykgPDwgIlAubWF5YmUgKFAucmV0dXJuICgpKSBYLnRocm93ICgiCi0gICAgICAgICAgPDwgZmllbGRfbmFtZShyZXN1bHRuYW1lLCAoKnhfaXRlciktPmdldF9uYW1lKCkpCi0gICAgICAgICAgPDwgIiByZXMpIiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKQotICAgICAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAiUC5yZXR1cm4gJCAiIDw8IGZpZWxkX25hbWUocmVzdWx0bmFtZSwgInN1Y2Nlc3MiKSA8PCAiIHJlcyIgPDwgZW5kbDsKLSAgICAgIGVsc2UKLSAgICAgICAgaW5kZW50KGZfY2xpZW50XykgPDwgIlAucmV0dXJuICgpIiA8PCBlbmRsOwotIAotICAgICAgLy8gQ2xvc2UgZnVuY3Rpb24KLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgfQotICB9Ci0KLSAgZl9jbGllbnRfLmNsb3NlKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgotICovCi12b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIC8vIEdlbmVyYXRlIHRoZSBkaXNwYXRjaCBtZXRob2RzCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzIHN1YmZ1bmN0aW9ucwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikKLSAgICBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRzZXJ2aWNlLCAqZl9pdGVyKTsKLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInByb2NfIGhhbmRsZXIgKGlwcm90LG9wcm90KSAobmFtZSx0eXAsc2VxaWQpID0gY2FzZSBuYW1lIG9mIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHN0cmluZyBmbmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlwiIiA8PCBmbmFtZSA8PCAiXCIgLT4gcHJvY2Vzc18iIDw8IGRlY2FwaXRhbGl6ZShmbmFtZSkgPDwgIiAoc2VxaWQsaXByb3Qsb3Byb3QsaGFuZGxlcikiIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIl8gLT4gIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBmX3NlcnZpY2VfIDw8IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSkgPDwgIi5wcm9jXyBoYW5kbGVyIChpcHJvdCxvcHJvdCkgKG5hbWUsdHlwLHNlcWlkKSIgPDwgZW5kbDsKLQotICB9IGVsc2UgewotICAgIGZfc2VydmljZV8gPDwgImRvIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiXyA8LSBULnJlYWRWYWwgaXByb3QgKFQuVF9TVFJVQ1QgTWFwLmVtcHR5KSIgPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlQud3JpdGVNZXNzYWdlQmVnaW4gb3Byb3QgKG5hbWUsVC5NX0VYQ0VQVElPTixzZXFpZCkiIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJULndyaXRlQXBwRXhuIG9wcm90IChULkFwcEV4biBULkFFX1VOS05PV05fTUVUSE9EIChcIlVua25vd24gZnVuY3Rpb24gXCIgKysgTFQudW5wYWNrIG5hbWUpKSIgPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlQud3JpdGVNZXNzYWdlRW5kIG9wcm90IiA8PCBlbmRsOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiVC50Rmx1c2ggKFQuZ2V0VHJhbnNwb3J0IG9wcm90KSIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLQotICAvLyBHZW5lcmF0ZSB0aGUgc2VydmVyIGltcGxlbWVudGF0aW9uCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJvY2VzcyBoYW5kbGVyIChpcHJvdCwgb3Byb3QpID0gZG8iIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAiKG5hbWUsIHR5cCwgc2VxaWQpIDwtIFQucmVhZE1lc3NhZ2VCZWdpbiBpcHJvdCIgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwcm9jXyBoYW5kbGVyIChpcHJvdCxvcHJvdCkgKG5hbWUsdHlwLHNlcWlkKSIgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJULnJlYWRNZXNzYWdlRW5kIGlwcm90IiA8PCBlbmRsOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlAucmV0dXJuIFAuVHJ1ZSIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLX0KLQotYm9vbCBoYXNOb0FyZ3VtZW50cyh0X2Z1bmN0aW9uKiBmdW5jKSB7Ci0gICAgcmV0dXJuIChmdW5jLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpLmVtcHR5KCkpOwotfQotCi1zdHJpbmcgdF9oc19nZW5lcmF0b3I6OnJlbmRlcl9oc190eXBlX2Zvcl9mdW5jdGlvbl9uYW1lKHRfdHlwZSogdHlwZSkgewotICAgIHN0cmluZyB0eXBlX3N0ciA9IHJlbmRlcl9oc190eXBlKHR5cGUsIGZhbHNlKTsKLSAgICBpbnQgZm91bmQgPSAtMTsKLQotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIGZvdW5kID0gdHlwZV9zdHIuZmluZF9maXJzdF9vZigiW10uICIsIGZvdW5kICsgMSk7Ci0gICAgICAgIGlmIChzdHJpbmc6Om5wb3MgPT0gc2l6ZV90KGZvdW5kKSkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodHlwZV9zdHJbZm91bmRdID09ICcuJykKLSAgICAgICAgICAgIHR5cGVfc3RyW2ZvdW5kXSA9ICdfJzsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgdHlwZV9zdHJbZm91bmRdID0gJ1onOwotICAgIH0KLSAgICByZXR1cm4gdHlwZV9zdHI7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgcHJvY2VzcyBmdW5jdGlvbiBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHdyaXRlIGEgZGlzcGF0Y2hlciBmb3IKLSAqLwotdm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgKHZvaWQpIHRzZXJ2aWNlOwotICAvLyBPcGVuIGZ1bmN0aW9uCi0gIHN0cmluZyBmdW5uYW1lID0gZGVjYXBpdGFsaXplKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSk7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJvY2Vzc18iIDw8IGZ1bm5hbWUgPDwgIiAoc2VxaWQsIGlwcm90LCBvcHJvdCwgaGFuZGxlcikgPSBkbyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgc3RyaW5nIGFyZ3NuYW1lID0gY2FwaXRhbGl6ZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpICsgIl9hcmdzIjsKLSAgc3RyaW5nIHJlc3VsdG5hbWUgPSBjYXBpdGFsaXplKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgKyAiX3Jlc3VsdCI7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGZ1bmN0aW9uIGNhbGwKLSAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImFyZ3MgPC0gcmVhZF8iIDw8IGFyZ3NuYW1lIDw8ICIgaXByb3QiIDw8IGVuZGw7Ci0KLSAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0KLSAgc2l6ZV90IG4gPSB4Y2VwdGlvbnMuc2l6ZSgpICsgMTsKLSAgLy8gVHJ5IGJsb2NrIGZvciBhIGZ1bmN0aW9uIHdpdGggZXhjZXB0aW9ucwotICBpZiAobiA+IDApIHsKLSAgICBmb3Ioc2l6ZV90IGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIihYLmNhdGNoIiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgfQotICB9Ci0KLSAgaWYgKG4gPiAwKSB7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIoZG8iIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gIH0KLSAgaW5kZW50KGZfc2VydmljZV8pOwotCi0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpCi0gICAgZl9zZXJ2aWNlXyA8PCAidmFsIDwtICI7Ci0KLSAgZl9zZXJ2aWNlXyA8PCAiSWZhY2UuIiA8PCBkZWNhcGl0YWxpemUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSA8PCAiIGhhbmRsZXIiOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikKLSAgICBmX3NlcnZpY2VfIDw8ICIgKCIgPDwKLSAgICAgIGZpZWxkX25hbWUoYXJnc25hbWUsICgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiBhcmdzKSI7Ci0KLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImxldCByZXMgPSBkZWZhdWx0XyIgPDwgcmVzdWx0bmFtZSA8PCAieyIgPDwKLSAgICAgIGZpZWxkX25hbWUocmVzdWx0bmFtZSwgInN1Y2Nlc3MiKSA8PCAiID0gdmFsfSI7Ci0KLSAgfSBlbHNlIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImxldCByZXMgPSBkZWZhdWx0XyIgPDwgcmVzdWx0bmFtZTsKLSAgfQotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgLy8gU2hvcnRjdXQgb3V0IGhlcmUgZm9yIG9uZXdheSBmdW5jdGlvbnMKLSAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlAucmV0dXJuICgpIjsKLSAgfSBlbHNlIHsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlQud3JpdGVNZXNzYWdlQmVnaW4gb3Byb3QgKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIlwiLCBULk1fUkVQTFksIHNlcWlkKSIgPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIndyaXRlXyIgPDwgcmVzdWx0bmFtZSA8PCAiIG9wcm90IHJlcyIgPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlQud3JpdGVNZXNzYWdlRW5kIG9wcm90IiA8PCBlbmRsOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiVC50Rmx1c2ggKFQuZ2V0VHJhbnNwb3J0IG9wcm90KSI7Ci0gIH0KLSAgaWYgKG4gPiAwKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCAiKSI7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfQotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgaWYgKG4gPiAwKSB7Ci0gICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiKFxcZSAgLT4gZG8iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLQotICAgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAibGV0IHJlcyA9IGRlZmF1bHRfIiA8PCByZXN1bHRuYW1lIDw8ICJ7IgotICAgICAgICAgIDw8IGZpZWxkX25hbWUocmVzdWx0bmFtZSwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiID0gUC5KdXN0IGV9IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlQud3JpdGVNZXNzYWdlQmVnaW4gb3Byb3QgKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIlwiLCBULk1fUkVQTFksIHNlcWlkKSIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50KGZfc2VydmljZV8gKSA8PCAid3JpdGVfIiA8PCByZXN1bHRuYW1lIDw8ICIgb3Byb3QgcmVzIiA8PCBlbmRsOwotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlQud3JpdGVNZXNzYWdlRW5kIG9wcm90IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXyApIDw8ICJULnRGbHVzaCAoVC5nZXRUcmFuc3BvcnQgb3Byb3QpIjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiUC5yZXR1cm4gKCkiOwotICAgICAgfQotCi0gICAgICBmX3NlcnZpY2VfIDw8ICIpKSIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgIH0KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIigoXFxfIC0+IGRvIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotCi0gICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlQud3JpdGVNZXNzYWdlQmVnaW4gb3Byb3QgKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIlwiLCBULk1fRVhDRVBUSU9OLCBzZXFpZCkiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXyApIDw8ICJULndyaXRlQXBwRXhuIG9wcm90IChULkFwcEV4biBULkFFX1VOS05PV04gXCJcIikiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlQud3JpdGVNZXNzYWdlRW5kIG9wcm90IiA8PCBlbmRsOwotICAgICAgaW5kZW50KGZfc2VydmljZV8gKSA8PCAiVC50Rmx1c2ggKFQuZ2V0VHJhbnNwb3J0IG9wcm90KSI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiUC5yZXR1cm4gKCkiOwotICAgIH0KLQotICAgIGZfc2VydmljZV8gPDwgIikgOjogWC5Tb21lRXhjZXB0aW9uIC0+IFAuSU8gKCkpKSIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgICAKLSAgfQotICAvLyBDbG9zZSBmdW5jdGlvbgotICBpbmRlbnRfZG93bigpOwotCi19Ci0KLS8qKgotICogRGVzZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCi0gKi8KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gICh2b2lkKSBwcmVmaXg7Ci0gIHRfdHlwZSogdHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfdHlwZShvdXQsdHlwZSwgcHJlZml4KTsKLX0KLQotLyoqCi0gKiBEZXNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KLSAqLwotdm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfdHlwZShvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBhcmcpIHsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0gIHN0cmluZyB2YWwgPSB0bXAoIl92YWwiKTsKLSAgb3V0IDw8ICIoY2FzZSAiIDw8IGFyZyA8PCAiIG9mIHsiIDw8IHR5cGVfdG9fY29uc3RydWN0b3IodHlwZSkgPDwgIiAiIDw8IHZhbCA8PCAiIC0+ICI7Ci0KLSAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkKLSAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIERFU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRSI7Ci0KLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIHZhbCk7Ci0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIHZhbCk7Ci0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBpZiAodGJhc2UgPT0gdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HICYmICEoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgIG91dCA8PCAiRS5kZWNvZGVVdGY4ICI7Ci0gICAgfQotICAgIG91dCA8PCB2YWw7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgb3V0IDw8ICJQLnRvRW51bSAkIFAuZnJvbUludGVncmFsICIgPDwgdmFsOwotCi0gIH0gZWxzZSB7Ci0gICAgdGhyb3cgIkRPIE5PVCBLTk9XIEhPVyBUTyBERVNFUklBTElaRSBUWVBFICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotICB9Ci0gIG91dCA8PCAiOyBfIC0+IFAuZXJyb3IgXCJ3cm9uZyB0eXBlXCJ9KSI7Ci19Ci0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYW4gdW5zZXJpYWxpemVyIGZvciBhIHN0cnVjdCwgY2FsbGluZyByZWFkKCkKLSAqLwotdm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUpIHsKLQotICBvdXQgPDwgIigiIDw8IHR5cGVfbmFtZSh0c3RydWN0LCAidG9fIikgPDwgIiAoVC5UU3RydWN0ICIgPDwgbmFtZSA8PCAiKSkiOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZSBhIGNvbnRhaW5lciBieSB3cml0aW5nIG91dCB0aGUgaGVhZGVyIGZvbGxvd2VkIGJ5Ci0gKiBkYXRhIGFuZCB0aGVuIGEgZm9vdGVyLgotICovCi12b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBhcmcpIHsKLQotICBzdHJpbmcgdmFsID0gdG1wKCJfdiIpOwotICAvLyBEZWNsYXJlIHZhcmlhYmxlcywgcmVhZCBoZWFkZXIKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIHN0cmluZyBrZXkgPSB0bXAoIl9rIik7Ci0gICAgb3V0IDw8ICIoTWFwLmZyb21MaXN0ICQgUC5tYXAgKFxcKCIgPDwga2V5IDw8ICIsIiA8PCB2YWwgPDwgIikgLT4gKCI7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfdHlwZShvdXQsKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSxrZXkpOwotCi0gICAgb3V0IDw8ICIsIjsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV90eXBlKG91dCwoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpLHZhbCk7Ci0KLSAgICBvdXQgPDwgIikpICIgPDwgYXJnIDw8ICIpIjsKLQotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIG91dCA8PCAiKFNldC5mcm9tTGlzdCAkIFAubWFwIChcXCIgPDwgdmFsIDw8ICIgLT4gIjsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV90eXBlKG91dCwoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpLHZhbCk7Ci0gICAgb3V0IDw8ICIpICIgPDwgYXJnIDw8ICIpIjsKLQotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBvdXQgPDwgIihWZWN0b3IuZnJvbUxpc3QgJCBQLm1hcCAoXFwiIDw8IHZhbCA8PCAiIC0+ICI7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfdHlwZShvdXQsKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSx2YWwpOwotICAgIG91dCA8PCAiKSAiIDw8IGFyZyA8PCAiKSI7Ci0gIH0KLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCi0gKgotICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQgdG8gc2VyaWFsaXplCi0gKiBAcGFyYW0gcHJlZml4IE5hbWUgdG8gcHJlcGVuZCB0byBmaWVsZCBuYW1lCi0gKi8KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV90eXBlKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lKSB7Ci0KLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0gIC8vIERvIG5vdGhpbmcgZm9yIHZvaWQgdHlwZXMKLSAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkKLSAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIFNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEUiOwotCi0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbmFtZSk7Ci0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lKTsKLQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgewotICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgb3V0IDw8IHR5cGVfdG9fY29uc3RydWN0b3IodHlwZSkgPDwgIiAiOwotICAgICAgaWYgKHRiYXNlID09IHRfYmFzZV90eXBlOjpUWVBFX1NUUklORyAmJiAhKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICAgIG91dCA8PCAiJCBFLmVuY29kZVV0ZjggIjsKLSAgICAgIH0KLSAgICAgIG91dCA8PCBuYW1lOwotCi0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIHN0cmluZyBlbmFtZSA9IGNhcGl0YWxpemUodHlwZS0+Z2V0X25hbWUoKSk7Ci0gICAgICBvdXQgPDwgIlQuVEkzMiAkIFAuZnJvbUludGVncmFsICQgUC5mcm9tRW51bSAiIDw8IG5hbWU7Ci0gICAgfQotCi0gIH0gZWxzZSB7Ci0gICAgdGhyb3cgIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgRklFTEQgT0YgVFlQRSAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLSAgfQotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgYWxsIHRoZSBtZW1iZXJzIG9mIGEgc3RydWN0LgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgdG8gc2VyaWFsaXplCi0gKiBAcGFyYW0gcHJlZml4ICBTdHJpbmcgcHJlZml4IHRvIGF0dGFjaCB0byBhbGwgZmllbGRzCi0gKi8KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgb3V0IDw8IHR5cGVfbmFtZSh0c3RydWN0LCAiZnJvbV8iKSA8PCAiICIgPDwgcHJlZml4OwotfQotCi12b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgc3RyaW5nIGsgPSB0bXAoIl9rIik7Ci0gIHN0cmluZyB2ID0gdG1wKCJfdiIpOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKLSAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLSAgICBvdXQgPDwgIlQuVE1hcCAiIDw8IHR5cGVfdG9fZW51bShrdHlwZSkgPDwgIiAiIDw8IHR5cGVfdG9fZW51bSh2dHlwZSk7Ci0gICAgb3V0IDw8ICIgJCBQLm1hcCAoXFwoIiA8PCBrIDw8ICIsIiA8PCB2IDw8ICIpIC0+ICgiOwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV90eXBlKG91dCwga3R5cGUsIGspOwotICAgIG91dCA8PCAiLCAiOwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV90eXBlKG91dCwgdnR5cGUsIHYpOwotICAgIG91dCA8PCAiKSkgJCBNYXAudG9MaXN0ICIgPDwgcHJlZml4OwotCi0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgb3V0IDw8ICJULlRTZXQgIiA8PCB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKTsKLSAgICBvdXQgPDwiICQgUC5tYXAgKFxcIiA8PCB2IDw8ICIgLT4gIjsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfdHlwZShvdXQsICgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSwgdik7Ci0gICAgb3V0IDw8ICIpICQgU2V0LnRvTGlzdCAiIDw8IHByZWZpeDsKLQotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBvdXQgPDwgIlQuVExpc3QgIiA8PCB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKTsKLSAgICBvdXQgPDwiICQgUC5tYXAgKFxcIiA8PCB2IDw8ICIgLT4gIjsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfdHlwZShvdXQsICgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSwgdik7Ci0gICAgb3V0IDw8ICIpICQgVmVjdG9yLnRvTGlzdCAiIDw8IHByZWZpeDsKLSAgfQotCi19Ci0KLXN0cmluZyB0X2hzX2dlbmVyYXRvcjo6ZnVuY3Rpb25fdHlwZSh0X2Z1bmN0aW9uKiB0ZnVuYywgYm9vbCBvcHRpb25zLCBib29sIGlvLCBib29sIG1ldGhvZCkgewotICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdGZ1bmMtPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7Ci0gIGZvciAodmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7Ci0gICAgICAgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsKLSAgICAgICArK2ZfaXRlcikgewotICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMIHx8Ci0gICAgICAgKCh0X3R5cGUqKSgqZl9pdGVyKS0+Z2V0X3R5cGUoKSktPmlzX3hjZXB0aW9uKCkpCi0gICAgICByZXN1bHQgKz0gIlAuTWF5YmUgIjsKLSAgICByZXN1bHQgKz0gcmVuZGVyX2hzX3R5cGUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpLCBvcHRpb25zKTsKLSAgICByZXN1bHQgKz0gIiAtPiAiOwotICB9Ci0KLSAgaWYgKGZpZWxkcy5lbXB0eSgpICYmICFtZXRob2QpCi0gICAgcmVzdWx0ICs9ICIoKSAtPiAiOwotCi0gIGlmIChpbykKLSAgICByZXN1bHQgKz0gIlAuSU8gIjsKLQotICByZXN1bHQgKz0gcmVuZGVyX2hzX3R5cGUodGZ1bmMtPmdldF9yZXR1cm50eXBlKCksIGlvKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotCi1zdHJpbmcgdF9oc19nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLCBzdHJpbmcgZnVuY3Rpb25fcHJlZml4KSB7Ci0gIHN0cmluZyBwcmVmaXggPSAiIjsKLSAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHR5cGUtPmdldF9wcm9ncmFtKCk7Ci0KLSAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKQotICAgIGlmICghdHR5cGUtPmlzX3NlcnZpY2UoKSkKLSAgICAgIHByZWZpeCA9IGNhcGl0YWxpemUocHJvZ3JhbS0+Z2V0X25hbWUoKSkgKyAiX1R5cGVzLiI7Ci0KLSAgcmV0dXJuIHByZWZpeCArIGZ1bmN0aW9uX3ByZWZpeCArIGNhcGl0YWxpemUodHR5cGUtPmdldF9uYW1lKCkpOwotfQotCi1zdHJpbmcgdF9oc19nZW5lcmF0b3I6OmZpZWxkX25hbWUoc3RyaW5nIHRuYW1lLCBzdHJpbmcgZm5hbWUpIHsKLSAgcmV0dXJuIGRlY2FwaXRhbGl6ZSh0bmFtZSkgKyAiXyIgKyBmbmFtZTsKLX0KLQotLyoqCi0gKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhIFByb3RvY29sLnRfdHlwZSBlbnVtCi0gKi8KLXN0cmluZyB0X2hzX2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDogICByZXR1cm4gIlQuVF9WT0lEIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzogcmV0dXJuICJULlRfU1RSSU5HIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6ICAgcmV0dXJuICJULlRfQk9PTCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOiAgIHJldHVybiAiVC5UX0JZVEUiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OiAgICByZXR1cm4gIlQuVF9JMTYiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOiAgICByZXR1cm4gIlQuVF9JMzIiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OiAgICByZXR1cm4gIlQuVF9JNjQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOiByZXR1cm4gIlQuVF9ET1VCTEUiOwotICAgIH0KLQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAiVC5UX0kzMiI7Ci0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgcmV0dXJuICIoVC5UX1NUUlVDVCAiICsgdHlwZV9uYW1lKCh0X3N0cnVjdCopdHlwZSwgInR5cGVtYXBfIikgKyAiKSI7Ci0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHN0cmluZyBrdHlwZSA9IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCkpOwotICAgIHN0cmluZyB2dHlwZSA9IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpOwotICAgIHJldHVybiAiKFQuVF9NQVAgIiArIGt0eXBlICsgIiAiICsgdnR5cGUgKyAiKSI7Ci0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHJldHVybiAiKFQuVF9TRVQgIiArIHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKSkgKyAiKSI7Ci0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICByZXR1cm4gIihULlRfTElTVCAiICsgdHlwZV90b19lbnVtKCgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSArICIpIjsKLSAgfQotCi0gIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotLyoqCi0gKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhIGRlZmF1bHQgdmFsdWUKLSAqLwotc3RyaW5nIHRfaHNfZ2VuZXJhdG9yOjp0eXBlX3RvX2RlZmF1bHQodF90eXBlKiB0eXBlKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOiAgIHJldHVybiAiUC5lcnJvciBcIk5vIGRlZmF1bHQgdmFsdWUgZm9yIHR5cGUgVF9WT0lEXCIiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOiByZXR1cm4gIlwiXCIiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDogICByZXR1cm4gIlAuRmFsc2UiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURTogICByZXR1cm4gIjAiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OiAgICByZXR1cm4gIjAiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOiAgICByZXR1cm4gIjAiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OiAgICByZXR1cm4gIjAiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOiByZXR1cm4gIjAiOwotICAgIH0KLQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAiKFAudG9FbnVtIDApIjsKLQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gdHlwZV9uYW1lKCh0X3N0cnVjdCopdHlwZSwgImRlZmF1bHRfIik7Ci0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHJldHVybiAiTWFwLmVtcHR5IjsKLQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgcmV0dXJuICJTZXQuZW1wdHkiOwotCi0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgcmV0dXJuICJWZWN0b3IuZW1wdHkiOwotICB9Ci0KLSAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2RlZmF1bHQ6ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotfQotCi0KLS8qKgotICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYW4gaGFza2VsbCB0eXBlCi0gKi8KLXN0cmluZyB0X2hzX2dlbmVyYXRvcjo6cmVuZGVyX2hzX3R5cGUodF90eXBlKiB0eXBlLCBib29sIG5lZWRzX3BhcmVucykgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLSAgc3RyaW5nIHR5cGVfcmVwcjsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDogICByZXR1cm4gIigpIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzogcmV0dXJuICgoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkgPyAiTEJTLkJ5dGVTdHJpbmciIDogIkxULlRleHQiKTsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6ICAgcmV0dXJuICJQLkJvb2wiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURTogICByZXR1cm4gIkkuSW50OCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6ICAgIHJldHVybiAiSS5JbnQxNiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6ICAgIHJldHVybiAiSS5JbnQzMiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6ICAgIHJldHVybiAiSS5JbnQ2NCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6IHJldHVybiAiUC5Eb3VibGUiOwotICAgIH0KLQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiB0eXBlX25hbWUoKHRfZW51bSopdHlwZSk7Ci0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgcmV0dXJuIHR5cGVfbmFtZSgodF9zdHJ1Y3QqKXR5cGUpOwotCi0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOwotICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0gICAgdHlwZV9yZXByID0gIk1hcC5IYXNoTWFwICIgKyByZW5kZXJfaHNfdHlwZShrdHlwZSwgdHJ1ZSkgKyAiICIgKyByZW5kZXJfaHNfdHlwZSh2dHlwZSwgdHJ1ZSk7Ci0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIHR5cGVfcmVwciA9ICJTZXQuSGFzaFNldCAiICsgcmVuZGVyX2hzX3R5cGUoZXR5cGUsIHRydWUpIDsKLQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB0eXBlX3JlcHIgPSAiVmVjdG9yLlZlY3RvciAiICsgcmVuZGVyX2hzX3R5cGUoZXR5cGUsIHRydWUpOwotCi0gIH0gZWxzZSB7Ci0gICAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgcmV0dXJuIG5lZWRzX3BhcmVucyA/ICIoIiArIHR5cGVfcmVwciArICIpIiA6IHR5cGVfcmVwcjsKLX0KLQotLyoqCi0gKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhIGhhc2tlbGwgY29uc3RydWN0b3IKLSAqLwotc3RyaW5nIHRfaHNfZ2VuZXJhdG9yOjp0eXBlX3RvX2NvbnN0cnVjdG9yKHRfdHlwZSogdHlwZSkgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDogICB0aHJvdyAiaW52YWxpZCB0eXBlOiBUX1ZPSUQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOiByZXR1cm4gIlQuVFN0cmluZyI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOiAgIHJldHVybiAiVC5UQm9vbCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOiAgIHJldHVybiAiVC5UQnl0ZSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6ICAgIHJldHVybiAiVC5USTE2IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjogICAgcmV0dXJuICJULlRJMzIiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OiAgICByZXR1cm4gIlQuVEk2NCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6IHJldHVybiAiVC5URG91YmxlIjsKLSAgICB9Ci0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gIlQuVEkzMiI7Ci0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgcmV0dXJuICJULlRTdHJ1Y3QiOwotCi0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gIlQuVE1hcCBfIF8iOwotCi0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gIlQuVFNldCBfIjsKLQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHJldHVybiAiVC5UTGlzdCBfIjsKLSAgfQotICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Ci19Ci0KLQotVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUihocywgIkhhc2tlbGwiLCAiIikKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9odG1sX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9odG1sX2dlbmVyYXRvci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYzMjcyMS4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfaHRtbF9nZW5lcmF0b3IuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMDgyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpbmNsdWRlIDxtYXA+Ci0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSAidF9nZW5lcmF0b3IuaCIKLSNpbmNsdWRlICJ0X2h0bWxfZ2VuZXJhdG9yLmgiCi0jaW5jbHVkZSAicGxhdGZvcm0uaCIKLQotdXNpbmcgc3RkOjptYXA7Ci11c2luZyBzdGQ6Om9mc3RyZWFtOwotdXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwotdXNpbmcgc3RkOjpwYWlyOwotdXNpbmcgc3RkOjpzdHJpbmc7Ci11c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKLXVzaW5nIHN0ZDo6dmVjdG9yOwotCi1zdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAgLy8gYXZvaWQgb3N0cmVhbSA8PCBzdGQ6OmVuZGwgZmx1c2hlcwotCi1lbnVtIGlucHV0X3R5cGUgeyBJTlBVVF9VTktOT1dOLCBJTlBVVF9VVEY4LCBJTlBVVF9QTEFJTiB9OwotCi0vKioKLSAqIEhUTUwgY29kZSBnZW5lcmF0b3IKLSAqCi0gKiBtb3N0bHkgY29weS9wYXN0aW5nL3R3ZWFraW5nIGZyb20gbWNzbGVlJ3Mgd29yay4KLSAqLwotY2xhc3MgdF9odG1sX2dlbmVyYXRvciA6IHB1YmxpYyB0X2dlbmVyYXRvciB7Ci0gcHVibGljOgotICB0X2h0bWxfZ2VuZXJhdG9yKAotICAgICAgdF9wcm9ncmFtKiBwcm9ncmFtLAotICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKLSAgICA6IHRfZ2VuZXJhdG9yKHByb2dyYW0pCi0gIHsKLSAgICAodm9pZCkgcGFyc2VkX29wdGlvbnM7Ci0gICAgKHZvaWQpIG9wdGlvbl9zdHJpbmc7ICAKLSAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1odG1sIjsKLSAgICBpbnB1dF90eXBlXyA9IElOUFVUX1VOS05PV047Ci0gICAgCi0gICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKLSAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgic3RhbmRhbG9uZSIpOwotICAgIHN0YW5kYWxvbmVfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotICAgIAotICAgIGVzY2FwZV8uY2xlYXIoKTsKLSAgICBlc2NhcGVfWycmJ10gID0gIiZhbXA7IjsKLSAgICBlc2NhcGVfWyc8J10gID0gIiZsdDsiOwotICAgIGVzY2FwZV9bJz4nXSAgPSAiJmd0OyI7Ci0gICAgZXNjYXBlX1snIiddICA9ICImcXVvdDsiOwotICAgIGVzY2FwZV9bJ1wnJ10gPSAiJmFwb3M7IjsKLQotICAgIGluaXRfYWxsb3dlZF9fbWFya3VwKCk7Ci0gIH0KLQotICB2b2lkIGdlbmVyYXRlX3Byb2dyYW0oKTsKLSAgdm9pZCBnZW5lcmF0ZV9wcm9ncmFtX3RvYygpOwotICB2b2lkIGdlbmVyYXRlX3Byb2dyYW1fdG9jX3Jvdyh0X3Byb2dyYW0qIHRwcm9nKTsKLSAgdm9pZCBnZW5lcmF0ZV9wcm9ncmFtX3RvY19yb3dzKHRfcHJvZ3JhbSogdHByb2csCi0gICAgICAgICBzdGQ6OnZlY3Rvcjx0X3Byb2dyYW0qPiYgZmluaXNoZWQpOwotICB2b2lkIGdlbmVyYXRlX2luZGV4KCk7Ci0gIHN0ZDo6c3RyaW5nIGVzY2FwZV9odG1sKHN0ZDo6c3RyaW5nIGNvbnN0ICYgc3RyKTsKLSAgc3RkOjpzdHJpbmcgZXNjYXBlX2h0bWxfdGFncyhzdGQ6OnN0cmluZyBjb25zdCAmIHN0cik7Ci0gIHZvaWQgZ2VuZXJhdGVfY3NzKCk7Ci0gIHZvaWQgZ2VuZXJhdGVfY3NzX2NvbnRlbnQoc3RkOjpvZnN0cmVhbSAmIGZfdGFyZ2V0KTsKLSAgdm9pZCBnZW5lcmF0ZV9zdHlsZV90YWcoKTsKLSAgc3RkOjpzdHJpbmcgbWFrZV9maWxlX2xpbmsoIHN0ZDo6c3RyaW5nIG5hbWUpOwotICBib29sIGlzX3V0Zjhfc2VxdWVuY2Uoc3RkOjpzdHJpbmcgY29uc3QgJiBzdHIsIHNpemVfdCBmaXJzdHBvcyk7Ci0gIHZvaWQgZGV0ZWN0X2lucHV0X2VuY29kaW5nKHN0ZDo6c3RyaW5nIGNvbnN0ICYgc3RyLCBzaXplX3QgZmlyc3Rwb3MpOwotICB2b2lkIGluaXRfYWxsb3dlZF9fbWFya3VwKCk7Ci0gIAotICAvKioKLSAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYgKHRfdHlwZWRlZiogIHR0eXBlZGVmKTsKLSAgdm9pZCBnZW5lcmF0ZV9lbnVtICAgICh0X2VudW0qICAgICB0ZW51bSk7Ci0gIHZvaWQgZ2VuZXJhdGVfY29uc3QgICAodF9jb25zdCogICAgdGNvbnN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QgICh0X3N0cnVjdCogICB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlICh0X3NlcnZpY2UqICB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqICAgdHhjZXB0aW9uKTsKLQotICB2b2lkIHByaW50X2RvYyAgICAgICAgKHRfZG9jKiB0ZG9jKTsKLSAgaW50ICBwcmludF90eXBlICAgICAgICh0X3R5cGUqIHR0eXBlKTsKLSAgdm9pZCBwcmludF9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHR2YWx1ZSk7Ci0gIHZvaWQgcHJpbnRfZm5fYXJnc19kb2ModF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLQotIHByaXZhdGU6Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9vdXRfOwotICBzdGQ6OnN0cmluZyAgY3VycmVudF9maWxlXzsKLSAgaW5wdXRfdHlwZSBpbnB1dF90eXBlXzsKLSAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gYWxsb3dlZF9tYXJrdXA7IAotICBib29sIHN0YW5kYWxvbmVfOyAKLX07Ci0KLQotLyoqCi0gKiBFbWl0cyB0aGUgVGFibGUgb2YgQ29udGVudHMgbGlua3MgYXQgdGhlIHRvcCBvZiB0aGUgbW9kdWxlJ3MgcGFnZQotICovCi12b2lkIHRfaHRtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2dyYW1fdG9jKCkgewotICBmX291dF8gPDwgIjx0YWJsZSBjbGFzcz1cInRhYmxlLWJvcmRlcmVkIHRhYmxlLXN0cmlwZWQgdGFibGUtY29uZGVuc2VkXCI+PHRoZWFkPjx0aD5Nb2R1bGU8L3RoPjx0aD5TZXJ2aWNlczwvdGg+IgotICAgPDwgIjx0aD5EYXRhIHR5cGVzPC90aD48dGg+Q29uc3RhbnRzPC90aD48L3RoZWFkPiIgPDwgZW5kbDsKLSAgZ2VuZXJhdGVfcHJvZ3JhbV90b2Nfcm93KHByb2dyYW1fKTsKLSAgZl9vdXRfIDw8ICI8L3RhYmxlPiIgPDwgZW5kbDsKLX0KLQotCi0vKioKLSAqIFJlY3Vyc2VzIHRocm91Z2ggZnJvbSB0aGUgcHJvdmlkZWQgcHJvZ3JhbSBhbmQgZ2VuZXJhdGVzIGEgVG9DIHJvdwotICogZm9yIGVhY2ggZGlzY292ZXJlZCBwcm9ncmFtIGV4YWN0bHkgb25jZSBieSBtYWludGFpbmluZyB0aGUgbGlzdCBvZgotICogY29tcGxldGVkIHJvd3MgaW4gJ2ZpbmlzaGVkJwotICovCi12b2lkIHRfaHRtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2dyYW1fdG9jX3Jvd3ModF9wcm9ncmFtKiB0cHJvZywKLSAgICAgICAgIHN0ZDo6dmVjdG9yPHRfcHJvZ3JhbSo+JiBmaW5pc2hlZCkgewotICBmb3IgKHZlY3Rvcjx0X3Byb2dyYW0qPjo6aXRlcmF0b3IgaXRlciA9IGZpbmlzaGVkLmJlZ2luKCk7Ci0gICAgICAgaXRlciAhPSBmaW5pc2hlZC5lbmQoKTsgaXRlcisrKSB7Ci0gICAgaWYgKHRwcm9nLT5nZXRfcGF0aCgpID09ICgqaXRlciktPmdldF9wYXRoKCkpIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIH0KLSAgZmluaXNoZWQucHVzaF9iYWNrKHRwcm9nKTsKLSAgZ2VuZXJhdGVfcHJvZ3JhbV90b2Nfcm93KHRwcm9nKTsKLSAgdmVjdG9yPHRfcHJvZ3JhbSo+IGluY2x1ZGVzID0gdHByb2ctPmdldF9pbmNsdWRlcygpOwotICBmb3IgKHZlY3Rvcjx0X3Byb2dyYW0qPjo6aXRlcmF0b3IgaXRlciA9IGluY2x1ZGVzLmJlZ2luKCk7Ci0gICAgICAgaXRlciAhPSBpbmNsdWRlcy5lbmQoKTsgaXRlcisrKSB7Ci0gICAgZ2VuZXJhdGVfcHJvZ3JhbV90b2Nfcm93cygqaXRlciwgZmluaXNoZWQpOwotICB9Ci19Ci0KLS8qKgotICogRW1pdHMgdGhlIFRhYmxlIG9mIENvbnRlbnRzIGxpbmtzIGF0IHRoZSB0b3Agb2YgdGhlIG1vZHVsZSdzIHBhZ2UKLSAqLwotdm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9ncmFtX3RvY19yb3codF9wcm9ncmFtKiB0cHJvZykgewotICBzdHJpbmcgZm5hbWUgPSB0cHJvZy0+Z2V0X25hbWUoKSArICIuaHRtbCI7Ci0gIGZfb3V0XyA8PCAiPHRyPiIgPDwgZW5kbCA8PCAiPHRkPiIgPDwgdHByb2ctPmdldF9uYW1lKCkgPDwgIjwvdGQ+PHRkPiI7Ci0gIGlmICghdHByb2ctPmdldF9zZXJ2aWNlcygpLmVtcHR5KCkpIHsKLSAgICB2ZWN0b3I8dF9zZXJ2aWNlKj4gc2VydmljZXMgPSB0cHJvZy0+Z2V0X3NlcnZpY2VzKCk7Ci0gICAgdmVjdG9yPHRfc2VydmljZSo+OjppdGVyYXRvciBzdl9pdGVyOwotICAgIGZvciAoc3ZfaXRlciA9IHNlcnZpY2VzLmJlZ2luKCk7IHN2X2l0ZXIgIT0gc2VydmljZXMuZW5kKCk7ICsrc3ZfaXRlcikgewotICAgICAgc3RyaW5nIG5hbWUgPSBnZXRfc2VydmljZV9uYW1lKCpzdl9pdGVyKTsKLSAgICAgIGZfb3V0XyA8PCAiPGEgaHJlZj1cIiIgPDwgbWFrZV9maWxlX2xpbmsoZm5hbWUpIDw8ICIjU3ZjXyIgPDwgbmFtZSA8PCAiXCI+IiA8PCBuYW1lCi0gICAgICAgIDw8ICI8L2E+PGJyLz4iIDw8IGVuZGw7Ci0gICAgICBmX291dF8gPDwgIjx1bD4iIDw8IGVuZGw7Ci0gICAgICBtYXA8c3RyaW5nLHN0cmluZz4gZm5faHRtbDsKLSAgICAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gKCpzdl9pdGVyKS0+Z2V0X2Z1bmN0aW9ucygpOwotICAgICAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZm5faXRlcjsKLSAgICAgIGZvciAoZm5faXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmbl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmbl9pdGVyKSB7Ci0gICAgICAgIHN0cmluZyBmbl9uYW1lID0gKCpmbl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICAgICAgc3RyaW5nIGh0bWwgPSAiPGxpPjxhIGhyZWY9XCIiICsgbWFrZV9maWxlX2xpbmsoZm5hbWUpICsgIiNGbl8iICsgbmFtZSArICJfIiArCi0gICAgICAgICAgZm5fbmFtZSArICJcIj4iICsgZm5fbmFtZSArICI8L2E+PC9saT4iOwotICAgICAgICBmbl9odG1sLmluc2VydChwYWlyPHN0cmluZyxzdHJpbmc+KGZuX25hbWUsIGh0bWwpKTsKLSAgICAgIH0KLSAgICAgIGZvciAobWFwPHN0cmluZyxzdHJpbmc+OjppdGVyYXRvciBodG1sX2l0ZXIgPSBmbl9odG1sLmJlZ2luKCk7Ci0gICAgICAgIGh0bWxfaXRlciAhPSBmbl9odG1sLmVuZCgpOyBodG1sX2l0ZXIrKykgewotICAgICAgICBmX291dF8gPDwgaHRtbF9pdGVyLT5zZWNvbmQgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIGZfb3V0XyA8PCAiPC91bD4iIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0gIGZfb3V0XyA8PCAiPC90ZD4iIDw8IGVuZGwgPDwgIjx0ZD4iOwotICBtYXA8c3RyaW5nLHN0cmluZz4gZGF0YV90eXBlczsKLSAgaWYgKCF0cHJvZy0+Z2V0X2VudW1zKCkuZW1wdHkoKSkgewotICAgIHZlY3Rvcjx0X2VudW0qPiBlbnVtcyA9IHRwcm9nLT5nZXRfZW51bXMoKTsKLSAgICB2ZWN0b3I8dF9lbnVtKj46Oml0ZXJhdG9yIGVuX2l0ZXI7Ci0gICAgZm9yIChlbl9pdGVyID0gZW51bXMuYmVnaW4oKTsgZW5faXRlciAhPSBlbnVtcy5lbmQoKTsgKytlbl9pdGVyKSB7Ci0gICAgICBzdHJpbmcgbmFtZSA9ICgqZW5faXRlciktPmdldF9uYW1lKCk7Ci0gICAgICAvLyBmX291dF8gPDwgIjxhIGhyZWY9XCIiIDw8IG1ha2VfZmlsZV9saW5rKGZuYW1lKSA8PCAiI0VudW1fIiA8PCBuYW1lIDw8ICJcIj4iIDw8IG5hbWUKLSAgICAgIC8vIDw8ICAiPC9hPjxici8+IiA8PCBlbmRsOwotICAgICAgc3RyaW5nIGh0bWwgPSAiPGEgaHJlZj1cIiIgKyBtYWtlX2ZpbGVfbGluayhmbmFtZSkgKyAiI0VudW1fIiArIG5hbWUgKyAiXCI+IiArIG5hbWUgKwotICAgICAgICAiPC9hPiI7Ci0gICAgICBkYXRhX3R5cGVzLmluc2VydChwYWlyPHN0cmluZyxzdHJpbmc+KG5hbWUsIGh0bWwpKTsKLSAgICB9Ci0gIH0KLSAgaWYgKCF0cHJvZy0+Z2V0X3R5cGVkZWZzKCkuZW1wdHkoKSkgewotICAgIHZlY3Rvcjx0X3R5cGVkZWYqPiB0eXBlZGVmcyA9IHRwcm9nLT5nZXRfdHlwZWRlZnMoKTsKLSAgICB2ZWN0b3I8dF90eXBlZGVmKj46Oml0ZXJhdG9yIHRkX2l0ZXI7Ci0gICAgZm9yICh0ZF9pdGVyID0gdHlwZWRlZnMuYmVnaW4oKTsgdGRfaXRlciAhPSB0eXBlZGVmcy5lbmQoKTsgKyt0ZF9pdGVyKSB7Ci0gICAgICBzdHJpbmcgbmFtZSA9ICgqdGRfaXRlciktPmdldF9zeW1ib2xpYygpOwotICAgICAgLy8gZl9vdXRfIDw8ICI8YSBocmVmPVwiIiA8PCBtYWtlX2ZpbGVfbGluayhmbmFtZSkgPDwgIiNUeXBlZGVmXyIgPDwgbmFtZSA8PCAiXCI+IiA8PCBuYW1lCi0gICAgICAvLyA8PCAiPC9hPjxici8+IiA8PCBlbmRsOwotICAgICAgc3RyaW5nIGh0bWwgPSAiPGEgaHJlZj1cIiIgKyBtYWtlX2ZpbGVfbGluayhmbmFtZSkgKyAiI1R5cGVkZWZfIiArIG5hbWUgKyAiXCI+IiArIG5hbWUgKwotICAgICAgICAiPC9hPiI7Ci0gICAgICBkYXRhX3R5cGVzLmluc2VydChwYWlyPHN0cmluZyxzdHJpbmc+KG5hbWUsIGh0bWwpKTsKLSAgICB9Ci0gIH0KLSAgaWYgKCF0cHJvZy0+Z2V0X29iamVjdHMoKS5lbXB0eSgpKSB7Ci0gICAgdmVjdG9yPHRfc3RydWN0Kj4gb2JqZWN0cyA9IHRwcm9nLT5nZXRfb2JqZWN0cygpOwotICAgIHZlY3Rvcjx0X3N0cnVjdCo+OjppdGVyYXRvciBvX2l0ZXI7Ci0gICAgZm9yIChvX2l0ZXIgPSBvYmplY3RzLmJlZ2luKCk7IG9faXRlciAhPSBvYmplY3RzLmVuZCgpOyArK29faXRlcikgewotICAgICAgc3RyaW5nIG5hbWUgPSAoKm9faXRlciktPmdldF9uYW1lKCk7Ci0gICAgICAvL2Zfb3V0XyA8PCAiPGEgaHJlZj1cIiIgPDwgbWFrZV9maWxlX2xpbmsoZm5hbWUpIDw8ICIjU3RydWN0XyIgPDwgbmFtZSA8PCAiXCI+IiA8PCBuYW1lCi0gICAgICAvLzw8ICI8L2E+PGJyLz4iIDw8IGVuZGw7Ci0gICAgICBzdHJpbmcgaHRtbCA9ICI8YSBocmVmPVwiIiArIG1ha2VfZmlsZV9saW5rKGZuYW1lKSArICIjU3RydWN0XyIgKyBuYW1lICsgIlwiPiIgKyBuYW1lICsKLSAgICAgICAgIjwvYT4iOwotICAgICAgZGF0YV90eXBlcy5pbnNlcnQocGFpcjxzdHJpbmcsc3RyaW5nPihuYW1lLCBodG1sKSk7Ci0gICAgfQotICB9Ci0gIGZvciAobWFwPHN0cmluZyxzdHJpbmc+OjppdGVyYXRvciBkdF9pdGVyID0gZGF0YV90eXBlcy5iZWdpbigpOwotICAgICAgIGR0X2l0ZXIgIT0gZGF0YV90eXBlcy5lbmQoKTsgZHRfaXRlcisrKSB7Ci0gICAgZl9vdXRfIDw8IGR0X2l0ZXItPnNlY29uZCA8PCAiPGJyLz4iIDw8IGVuZGw7Ci0gIH0KLSAgZl9vdXRfIDw8ICI8L3RkPiIgPDwgZW5kbCA8PCAiPHRkPiI7Ci0gIGlmICghdHByb2ctPmdldF9jb25zdHMoKS5lbXB0eSgpKSB7Ci0gICAgbWFwPHN0cmluZyxzdHJpbmc+IGNvbnN0X2h0bWw7Ci0gICAgdmVjdG9yPHRfY29uc3QqPiBjb25zdHMgPSB0cHJvZy0+Z2V0X2NvbnN0cygpOwotICAgIHZlY3Rvcjx0X2NvbnN0Kj46Oml0ZXJhdG9yIGNvbl9pdGVyOwotICAgIGZvciAoY29uX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY29uX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2Nvbl9pdGVyKSB7Ci0gICAgICBzdHJpbmcgbmFtZSA9ICgqY29uX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICAgc3RyaW5nIGh0bWwgPSI8Y29kZT48YSBocmVmPVwiIiArIG1ha2VfZmlsZV9saW5rKGZuYW1lKSArICIjQ29uc3RfIiArIG5hbWUgKwotICAgICAgICAiXCI+IiArIG5hbWUgKyAiPC9hPjwvY29kZT4iOwotICAgICAgY29uc3RfaHRtbC5pbnNlcnQocGFpcjxzdHJpbmcsc3RyaW5nPihuYW1lLCBodG1sKSk7Ci0gICAgfQotICAgIGZvciAobWFwPHN0cmluZyxzdHJpbmc+OjppdGVyYXRvciBjb25faXRlciA9IGNvbnN0X2h0bWwuYmVnaW4oKTsKLSAgIGNvbl9pdGVyICE9IGNvbnN0X2h0bWwuZW5kKCk7IGNvbl9pdGVyKyspIHsKLSAgICAgIGZfb3V0XyA8PCBjb25faXRlci0+c2Vjb25kIDw8ICI8YnIvPiIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLSAgZl9vdXRfIDw8ICI8L2NvZGU+PC90ZD4iIDw8IGVuZGwgPDwgIjwvdHI+IjsKLX0KLQotLyoqCi0gKiBQcmVwYXJlcyBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAotICogc3RyZWFtLgotICovCi12b2lkIHRfaHRtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2dyYW0oKSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQotICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOwotICBjdXJyZW50X2ZpbGVfID0gIHByb2dyYW1fLT5nZXRfbmFtZSgpICsgIi5odG1sIjsKLSAgc3RyaW5nIGZuYW1lID0gZ2V0X291dF9kaXIoKSArIGN1cnJlbnRfZmlsZV87Ci0gIGZfb3V0Xy5vcGVuKGZuYW1lLmNfc3RyKCkpOwotICBmX291dF8gPDwgIjwhRE9DVFlQRSBodG1sIFBVQkxJQyBcIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOXCIiIDw8IGVuZGw7Ci0gIGZfb3V0XyA8PCAiICAgIFwiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZFwiPiIgPDwgZW5kbDsKLSAgZl9vdXRfIDw8ICI8aHRtbCB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWxcIj4iIDw8IGVuZGw7Ci0gIGZfb3V0XyA8PCAiPGhlYWQ+IiA8PCBlbmRsOwotICBmX291dF8gPDwgIjxtZXRhIGh0dHAtZXF1aXY9XCJDb250ZW50LVR5cGVcIiBjb250ZW50PVwidGV4dC9odG1sO2NoYXJzZXQ9dXRmLThcIiAvPiIgPDwgZW5kbDsKLSAgZ2VuZXJhdGVfc3R5bGVfdGFnKCk7Ci0gIGZfb3V0XyA8PCAiPHRpdGxlPlRocmlmdCBtb2R1bGU6ICIgPDwgcHJvZ3JhbV8tPmdldF9uYW1lKCkKLSAgIDw8ICI8L3RpdGxlPjwvaGVhZD48Ym9keT4iIDw8IGVuZGwKLSAgIDw8ICI8ZGl2IGNsYXNzPVwiY29udGFpbmVyLWZsdWlkXCI+IiA8PCBlbmRsCi0gICA8PCAiPGgxPlRocmlmdCBtb2R1bGU6ICIKLSAgIDw8IHByb2dyYW1fLT5nZXRfbmFtZSgpIDw8ICI8L2gxPiIgPDwgZW5kbDsKLQotICBwcmludF9kb2MocHJvZ3JhbV8pOwotCi0gIGdlbmVyYXRlX3Byb2dyYW1fdG9jKCk7Ci0KLSAgaWYgKCFwcm9ncmFtXy0+Z2V0X2NvbnN0cygpLmVtcHR5KCkpIHsKLSAgICBmX291dF8gPDwgIjxoci8+PGgyIGlkPVwiQ29uc3RhbnRzXCI+Q29uc3RhbnRzPC9oMj4iIDw8IGVuZGw7Ci0gICAgdmVjdG9yPHRfY29uc3QqPiBjb25zdHMgPSBwcm9ncmFtXy0+Z2V0X2NvbnN0cygpOwotICAgIGZfb3V0XyA8PCAiPHRhYmxlIGNsYXNzPVwidGFibGUtYm9yZGVyZWQgdGFibGUtc3RyaXBlZCB0YWJsZS1jb25kZW5zZWRcIj4iOwotICAgIGZfb3V0XyA8PCAiPHRoZWFkPjx0aD5Db25zdGFudDwvdGg+PHRoPlR5cGU8L3RoPjx0aD5WYWx1ZTwvdGg+PC90aGVhZD4iIDw8IGVuZGw7Ci0gICAgZ2VuZXJhdGVfY29uc3RzKGNvbnN0cyk7Ci0gICAgZl9vdXRfIDw8ICI8L3RhYmxlPiI7Ci0gIH0KLQotICBpZiAoIXByb2dyYW1fLT5nZXRfZW51bXMoKS5lbXB0eSgpKSB7Ci0gICAgZl9vdXRfIDw8ICI8aHIvPjxoMiBpZD1cIkVudW1lcmF0aW9uc1wiPkVudW1lcmF0aW9uczwvaDI+IiA8PCBlbmRsOwotICAgIC8vIEdlbmVyYXRlIGVudW1zCi0gICAgdmVjdG9yPHRfZW51bSo+IGVudW1zID0gcHJvZ3JhbV8tPmdldF9lbnVtcygpOwotICAgIHZlY3Rvcjx0X2VudW0qPjo6aXRlcmF0b3IgZW5faXRlcjsKLSAgICBmb3IgKGVuX2l0ZXIgPSBlbnVtcy5iZWdpbigpOyBlbl9pdGVyICE9IGVudW1zLmVuZCgpOyArK2VuX2l0ZXIpIHsKLSAgICAgIGdlbmVyYXRlX2VudW0oKmVuX2l0ZXIpOwotICAgIH0KLSAgfQotCi0gIGlmICghcHJvZ3JhbV8tPmdldF90eXBlZGVmcygpLmVtcHR5KCkpIHsKLSAgICBmX291dF8gPDwgIjxoci8+PGgyIGlkPVwiVHlwZWRlZnNcIj5UeXBlIGRlY2xhcmF0aW9uczwvaDI+IiA8PCBlbmRsOwotICAgIC8vIEdlbmVyYXRlIHR5cGVkZWZzCi0gICAgdmVjdG9yPHRfdHlwZWRlZio+IHR5cGVkZWZzID0gcHJvZ3JhbV8tPmdldF90eXBlZGVmcygpOwotICAgIHZlY3Rvcjx0X3R5cGVkZWYqPjo6aXRlcmF0b3IgdGRfaXRlcjsKLSAgICBmb3IgKHRkX2l0ZXIgPSB0eXBlZGVmcy5iZWdpbigpOyB0ZF9pdGVyICE9IHR5cGVkZWZzLmVuZCgpOyArK3RkX2l0ZXIpIHsKLSAgICAgIGdlbmVyYXRlX3R5cGVkZWYoKnRkX2l0ZXIpOwotICAgIH0KLSAgfQotCi0gIGlmICghcHJvZ3JhbV8tPmdldF9vYmplY3RzKCkuZW1wdHkoKSkgewotICAgIGZfb3V0XyA8PCAiPGhyLz48aDIgaWQ9XCJTdHJ1Y3RzXCI+RGF0YSBzdHJ1Y3R1cmVzPC9oMj4iIDw8IGVuZGw7Ci0gICAgLy8gR2VuZXJhdGUgc3RydWN0cyBhbmQgZXhjZXB0aW9ucyBpbiBkZWNsYXJlZCBvcmRlcgotICAgIHZlY3Rvcjx0X3N0cnVjdCo+IG9iamVjdHMgPSBwcm9ncmFtXy0+Z2V0X29iamVjdHMoKTsKLSAgICB2ZWN0b3I8dF9zdHJ1Y3QqPjo6aXRlcmF0b3Igb19pdGVyOwotICAgIGZvciAob19pdGVyID0gb2JqZWN0cy5iZWdpbigpOyBvX2l0ZXIgIT0gb2JqZWN0cy5lbmQoKTsgKytvX2l0ZXIpIHsKLSAgICAgIGlmICgoKm9faXRlciktPmlzX3hjZXB0aW9uKCkpIHsKLSAgICAgICAgZ2VuZXJhdGVfeGNlcHRpb24oKm9faXRlcik7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBnZW5lcmF0ZV9zdHJ1Y3QoKm9faXRlcik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgaWYgKCFwcm9ncmFtXy0+Z2V0X3NlcnZpY2VzKCkuZW1wdHkoKSkgewotICAgIGZfb3V0XyA8PCAiPGhyLz48aDIgaWQ9XCJTZXJ2aWNlc1wiPlNlcnZpY2VzPC9oMj4iIDw8IGVuZGw7Ci0gICAgLy8gR2VuZXJhdGUgc2VydmljZXMKLSAgICB2ZWN0b3I8dF9zZXJ2aWNlKj4gc2VydmljZXMgPSBwcm9ncmFtXy0+Z2V0X3NlcnZpY2VzKCk7Ci0gICAgdmVjdG9yPHRfc2VydmljZSo+OjppdGVyYXRvciBzdl9pdGVyOwotICAgIGZvciAoc3ZfaXRlciA9IHNlcnZpY2VzLmJlZ2luKCk7IHN2X2l0ZXIgIT0gc2VydmljZXMuZW5kKCk7ICsrc3ZfaXRlcikgewotICAgICAgc2VydmljZV9uYW1lXyA9IGdldF9zZXJ2aWNlX25hbWUoKnN2X2l0ZXIpOwotICAgICAgZ2VuZXJhdGVfc2VydmljZSgqc3ZfaXRlcik7Ci0gICAgfQotICB9Ci0KLSAgZl9vdXRfIDw8ICI8L2Rpdj48L2JvZHk+PC9odG1sPiIgPDwgZW5kbDsKLSAgZl9vdXRfLmNsb3NlKCk7Ci0gIAotICBnZW5lcmF0ZV9pbmRleCgpOwotICBnZW5lcmF0ZV9jc3MoKTsKLX0KLQotCi0vKioKLSAqIEVtaXRzIHRoZSBpbmRleC5odG1sIGZpbGUgZm9yIHRoZSByZWN1cnNpdmUgc2V0IG9mIFRocmlmdCBwcm9ncmFtcwotICovCi12b2lkIHRfaHRtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX2luZGV4KCkgewotICBjdXJyZW50X2ZpbGVfID0gImluZGV4Lmh0bWwiOwotICBzdHJpbmcgaW5kZXhfZm5hbWUgPSBnZXRfb3V0X2RpcigpICsgY3VycmVudF9maWxlXzsKLSAgZl9vdXRfLm9wZW4oaW5kZXhfZm5hbWUuY19zdHIoKSk7Ci0gIGZfb3V0XyA8PCAiPGh0bWw+PGhlYWQ+IiA8PCBlbmRsOwotICBnZW5lcmF0ZV9zdHlsZV90YWcoKTsKLSAgZl9vdXRfIDw8ICI8dGl0bGU+QWxsIFRocmlmdCBkZWNsYXJhdGlvbnM8L3RpdGxlPjwvaGVhZD48Ym9keT4iCi0gICA8PCBlbmRsIDw8ICI8ZGl2IGNsYXNzPVwiY29udGFpbmVyLWZsdWlkXCI+IgotICAgPDwgZW5kbCA8PCAiPGgxPkFsbCBUaHJpZnQgZGVjbGFyYXRpb25zPC9oMT4iIDw8IGVuZGw7Ci0gIGZfb3V0XyA8PCAiPHRhYmxlIGNsYXNzPVwidGFibGUtYm9yZGVyZWQgdGFibGUtc3RyaXBlZCB0YWJsZS1jb25kZW5zZWRcIj48dGhlYWQ+PHRoPk1vZHVsZTwvdGg+PHRoPlNlcnZpY2VzPC90aD48dGg+RGF0YSB0eXBlczwvdGg+IgotICAgPDwgIjx0aD5Db25zdGFudHM8L3RoPjwvdGhlYWQ+IiA8PCBlbmRsOwotICB2ZWN0b3I8dF9wcm9ncmFtKj4gcHJvZ3JhbXM7Ci0gIGdlbmVyYXRlX3Byb2dyYW1fdG9jX3Jvd3MocHJvZ3JhbV8sIHByb2dyYW1zKTsKLSAgZl9vdXRfIDw8ICI8L3RhYmxlPiIgPDwgZW5kbDsKLSAgZl9vdXRfIDw8ICI8L2Rpdj48L2JvZHk+PC9odG1sPiIgPDwgZW5kbDsKLSAgZl9vdXRfLmNsb3NlKCk7Ci19Ci0KLXZvaWQgdF9odG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NzKCkgewotICBpZiggISBzdGFuZGFsb25lXykgewotICAgIGN1cnJlbnRfZmlsZV8gPSAic3R5bGUuY3NzIjsKLSAgICBzdHJpbmcgY3NzX2ZuYW1lID0gZ2V0X291dF9kaXIoKSArIGN1cnJlbnRfZmlsZV87Ci0gICAgZl9vdXRfLm9wZW4oY3NzX2ZuYW1lLmNfc3RyKCkpOwotICAgIGdlbmVyYXRlX2Nzc19jb250ZW50KCBmX291dF8pOwotICAgIGZfb3V0Xy5jbG9zZSgpOwotICB9Ci19Ci0KLQotdm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jc3NfY29udGVudChzdGQ6Om9mc3RyZWFtICYgZl90YXJnZXQpIHsKLSAgZl90YXJnZXQgPDwgQk9PVFNUUkFQX0NTUygpIDw8IGVuZGw7Ci0gIGZfdGFyZ2V0IDw8ICIvKiBBdXRvLWdlbmVyYXRlZCBDU1MgZm9yIGdlbmVyYXRlZCBUaHJpZnQgZG9jcyAqLyIgPDwgZW5kbDsKLSAgZl90YXJnZXQgPDwgImgzLCBoNCB7IG1hcmdpbi1ib3R0b206IDZweDsgfSIgPDwgZW5kbDsKLSAgZl90YXJnZXQgPDwgImRpdi5kZWZpbml0aW9uIHsgYm9yZGVyOiAxcHggc29saWQgI0NDQzsgbWFyZ2luLWJvdHRvbTogMTBweDsgcGFkZGluZzogMTBweDsgfSIgPDwgZW5kbDsKLSAgZl90YXJnZXQgPDwgImRpdi5leHRlbmRzIHsgbWFyZ2luOiAtMC41ZW0gMCAxZW0gNWVtIH0iIDw8IGVuZGw7Ci0gIGZfdGFyZ2V0IDw8ICJ0ZCB7IHZlcnRpY2FsLWFsaWduOiB0b3A7IH0iIDw8IGVuZGw7Ci0gIGZfdGFyZ2V0IDw8ICJ0YWJsZSB7IGVtcHR5LWNlbGxzOiBzaG93OyB9IiA8PCBlbmRsOwotICBmX3RhcmdldCA8PCAiY29kZSB7IGxpbmUtaGVpZ2h0OiAyMHB4OyB9IiA8PCBlbmRsOwotICBmX3RhcmdldCA8PCAiLnRhYmxlLWJvcmRlcmVkIHRoLCAudGFibGUtYm9yZGVyZWQgdGQgeyBib3JkZXItYm90dG9tOiAxcHggc29saWQgI0RERERERDsgfSIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgdGhlIENTUyB0YWcuIAotICogRGVwZW5kaW5nIG9uICJzdGFuZGFsb25lIiwgZWl0aGVyIGEgQ1NTIGZpbGUgbGluayAoZGVmYXVsdCksIG9yIHRoZSBlbnRpcmUgQ1NTIGlzIGVtYmVkZGVkIGlubGluZS4KLSAqLwotdm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHlsZV90YWcoKSB7Ci0gIGlmKCAhIHN0YW5kYWxvbmVfKSB7Ci0gICAgZl9vdXRfIDw8ICI8bGluayBocmVmPVwic3R5bGUuY3NzXCIgcmVsPVwic3R5bGVzaGVldFwiIHR5cGU9XCJ0ZXh0L2Nzc1wiLz4iIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgZl9vdXRfIDw8ICI8c3R5bGUgdHlwZT1cInRleHQvY3NzXCIvPjwhLS0iIDw8IGVuZGw7Ci0gICAgZ2VuZXJhdGVfY3NzX2NvbnRlbnQoIGZfb3V0Xyk7Ci0gICAgZl9vdXRfIDw8ICItLT48L3N0eWxlPiIgPDwgZW5kbDsKLSAgfSAKLX0KLQotLyoqCi0gKiBSZXR1cm5zIHRoZSB0YXJnZXQgZmlsZSBmb3IgYSA8YSBocmVmPiBsaW5rIAotICogVGhlIHJldHVybmVkIHN0cmluZyBpcyBlbXB0eSwgd2hlbmV2ZXIgZmlsZW5hbWUgcmVmZXJzIHRvIHRoZSBjdXJyZW50IGZpbGUuCi0gKi8KLXN0ZDo6c3RyaW5nIHRfaHRtbF9nZW5lcmF0b3I6Om1ha2VfZmlsZV9saW5rKCBzdGQ6OnN0cmluZyBmaWxlbmFtZSkgewotICByZXR1cm4gKGN1cnJlbnRfZmlsZV8uY29tcGFyZShmaWxlbmFtZSkgIT0gMCkgID8gIGZpbGVuYW1lICA6ICAiIjsKLX0KLQotLyoqCi0gKiBJZiB0aGUgcHJvdmlkZWQgZG9jdW1lbnRhYmxlIG9iamVjdCBoYXMgZG9jdW1lbnRhdGlvbiBhdHRhY2hlZCwgdGhpcwotICogd2lsbCBlbWl0IGl0IHRvIHRoZSBvdXRwdXQgc3RyZWFtIGluIEhUTUwgZm9ybWF0LgotICovCi12b2lkIHRfaHRtbF9nZW5lcmF0b3I6OnByaW50X2RvYyh0X2RvYyogdGRvYykgewotICBpZiAodGRvYy0+aGFzX2RvYygpKSB7Ci0gICAgZl9vdXRfIDw8IGVzY2FwZV9odG1sKHRkb2MtPmdldF9kb2MoKSkgPDwgIjxici8+IjsKLSAgfQotfQotCi1ib29sIHRfaHRtbF9nZW5lcmF0b3I6OmlzX3V0Zjhfc2VxdWVuY2Uoc3RkOjpzdHJpbmcgY29uc3QgJiBzdHIsIHNpemVfdCBmaXJzdHBvcykgewotICAvLyBsZWFkaW5nIGNoYXIgZGV0ZXJtaW5lcyB0aGUgbGVuZ3RoIG9mIHRoZSBzZXF1ZW5jZQotICB1bnNpZ25lZCBjaGFyIGMgPSBzdHIuYXQoZmlyc3Rwb3MpOwotICBpbnQgY291bnQgPSAwOwotICBpZiggICAgICAgIChjICYgMHhFMCkgPT0gMHhDMCkgewotICAgIGNvdW50ID0gMTsKLSAgfSBlbHNlIGlmKCAoYyAmIDB4RjApID09IDB4RTApIHsKLSAgICBjb3VudCA9IDI7Ci0gIH0gZWxzZSBpZiggKGMgJiAweEY4KSA9PSAweEYwKSB7Ci0gICAgY291bnQgPSAzOwotICB9IGVsc2UgaWYoIChjICYgMHhGQykgPT0gMHhGOCkgewotICAgIGNvdW50ID0gNDsKLSAgfSBlbHNlIGlmKCAoYyAmIDB4RkUpID09IDB4RkMpIHsKLSAgICBjb3VudCA9IDU7Ci0gIH0gZWxzZSB7Ci0gICAgLy9wZGVidWcoIlVURi04IHRlc3Q6IGNoYXIgJyVjJyAoJWQpIGlzIG5vdCBhIHZhbGlkIFVURi04IGxlYWRpbmcgYnl0ZSIsIGMsIGludChjKSk7Ci0gICAgcmV0dXJuIGZhbHNlOyAgLy8gbm8gVVRGLTgKLSAgfQotCi0gIC8vIGZvbGxvd2luZyBjaGFycwotICBzaXplX3QgcG9zID0gZmlyc3Rwb3MgKyAxOwotICB3aGlsZSggKHBvcyA8IHN0ci5sZW5ndGgoKSkgJiYgKDAgPCBjb3VudCkpCi0gIHsKLSAgICBjID0gc3RyLmF0KHBvcyk7Ci0gICAgaWYoIChjICYgMHhDMCkgIT0gIDB4ODApIHsKLSAgICAgIC8vcGRlYnVnKCJVVEYtOCB0ZXN0OiBjaGFyICclYycgKCVkKSBpcyBub3QgYSB2YWxpZCBVVEYtOCBmb2xsb3dpbmcgYnl0ZSIsIGMsIGludChjKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7ICAvLyBubyBVVEYtOAotICAgIH0gICAgCi0gICAgLS1jb3VudDsKLSAgICArK3BvczsKLSAgfQotICAKLSAgLy8gdHJ1ZSBpZiB0aGUgc2VxdWVuY2UgaXMgY29tcGxldGUKLSAgcmV0dXJuICgwID09IGNvdW50KTsKLX0KLQotdm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpkZXRlY3RfaW5wdXRfZW5jb2Rpbmcoc3RkOjpzdHJpbmcgY29uc3QgJiBzdHIsIHNpemVfdCBmaXJzdHBvcykgewotICBpZiggaXNfdXRmOF9zZXF1ZW5jZShzdHIsZmlyc3Rwb3MpKQotICB7Ci0gICAgcGRlYnVnKCAiSW5wdXQgc2VlbXMgdG8gYmUgYWxyZWFkeSBVVEYtOCBlbmNvZGVkIik7Ci0gICAgaW5wdXRfdHlwZV8gPSBJTlBVVF9VVEY4OwotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIGZhbGxiYWNrIAotICBwd2FybmluZyggMSwgIklucHV0IGlzIG5vdCBVVEYtOCwgdHJlYXRpbmcgYXMgcGxhaW4gQU5TSSIpOwotICBpbnB1dF90eXBlXyA9IElOUFVUX1BMQUlOOwotfQotCi12b2lkIHRfaHRtbF9nZW5lcmF0b3I6OmluaXRfYWxsb3dlZF9fbWFya3VwKCkgewotICBhbGxvd2VkX21hcmt1cC5jbGVhcigpOwotICAvLyBzdGFuZGFsb25lIHRhZ3MKLSAgYWxsb3dlZF9tYXJrdXBbImJyIl0gPSAxOwotICBhbGxvd2VkX21hcmt1cFsiYnIvIl0gPSAxOwotICBhbGxvd2VkX21hcmt1cFsiaW1nIl0gPSAxOwotICAvLyBwYWlyZWQgdGFncwotICBhbGxvd2VkX21hcmt1cFsiYiJdID0gMTsKLSAgYWxsb3dlZF9tYXJrdXBbIi9iIl0gPSAxOwotICBhbGxvd2VkX21hcmt1cFsidSJdID0gMTsKLSAgYWxsb3dlZF9tYXJrdXBbIi91Il0gPSAxOwotICBhbGxvd2VkX21hcmt1cFsiaSJdID0gMTsKLSAgYWxsb3dlZF9tYXJrdXBbIi9pIl0gPSAxOwotICBhbGxvd2VkX21hcmt1cFsicyJdID0gMTsKLSAgYWxsb3dlZF9tYXJrdXBbIi9zIl0gPSAxOwotICBhbGxvd2VkX21hcmt1cFsiYmlnIl0gPSAxOwotICBhbGxvd2VkX21hcmt1cFsiL2JpZyJdID0gMTsKLSAgYWxsb3dlZF9tYXJrdXBbInNtYWxsIl0gPSAxOwotICBhbGxvd2VkX21hcmt1cFsiL3NtYWxsIl0gPSAxOwotICBhbGxvd2VkX21hcmt1cFsic3VwIl0gPSAxOwotICBhbGxvd2VkX21hcmt1cFsiL3N1cCJdID0gMTsKLSAgYWxsb3dlZF9tYXJrdXBbInN1YiJdID0gMTsKLSAgYWxsb3dlZF9tYXJrdXBbIi9zdWIiXSA9IDE7Ci0gIGFsbG93ZWRfbWFya3VwWyJwcmUiXSA9IDE7Ci0gIGFsbG93ZWRfbWFya3VwWyIvcHJlIl0gPSAxOwotICBhbGxvd2VkX21hcmt1cFsidHQiXSA9IDE7Ci0gIGFsbG93ZWRfbWFya3VwWyIvdHQiXSA9IDE7Ci0gIGFsbG93ZWRfbWFya3VwWyJ1bCJdID0gMTsKLSAgYWxsb3dlZF9tYXJrdXBbIi91bCJdID0gMTsKLSAgYWxsb3dlZF9tYXJrdXBbIm9sIl0gPSAxOwotICBhbGxvd2VkX21hcmt1cFsiL29sIl0gPSAxOwotICBhbGxvd2VkX21hcmt1cFsibGkiXSA9IDE7Ci0gIGFsbG93ZWRfbWFya3VwWyIvbGkiXSA9IDE7Ci0gIGFsbG93ZWRfbWFya3VwWyJhIl0gPSAxOwotICBhbGxvd2VkX21hcmt1cFsiL2EiXSA9IDE7Ci0gIGFsbG93ZWRfbWFya3VwWyJwIl0gPSAxOwotICBhbGxvd2VkX21hcmt1cFsiL3AiXSA9IDE7Ci0gIGFsbG93ZWRfbWFya3VwWyJjb2RlIl0gPSAxOwotICBhbGxvd2VkX21hcmt1cFsiL2NvZGUiXSA9IDE7Ci0gIGFsbG93ZWRfbWFya3VwWyJkbCJdID0gMTsKLSAgYWxsb3dlZF9tYXJrdXBbIi9kbCJdID0gMTsKLSAgYWxsb3dlZF9tYXJrdXBbImR0Il0gPSAxOwotICBhbGxvd2VkX21hcmt1cFsiL2R0Il0gPSAxOwotICBhbGxvd2VkX21hcmt1cFsiZGQiXSA9IDE7Ci0gIGFsbG93ZWRfbWFya3VwWyIvZGQiXSA9IDE7Ci0gIGFsbG93ZWRfbWFya3VwWyJoMSJdID0gMTsKLSAgYWxsb3dlZF9tYXJrdXBbIi9oMSJdID0gMTsKLSAgYWxsb3dlZF9tYXJrdXBbImgyIl0gPSAxOwotICBhbGxvd2VkX21hcmt1cFsiL2gyIl0gPSAxOwotICBhbGxvd2VkX21hcmt1cFsiaDMiXSA9IDE7Ci0gIGFsbG93ZWRfbWFya3VwWyIvaDMiXSA9IDE7Ci0gIGFsbG93ZWRfbWFya3VwWyJoNCJdID0gMTsKLSAgYWxsb3dlZF9tYXJrdXBbIi9oNCJdID0gMTsKLSAgYWxsb3dlZF9tYXJrdXBbImg1Il0gPSAxOwotICBhbGxvd2VkX21hcmt1cFsiL2g1Il0gPSAxOwotICBhbGxvd2VkX21hcmt1cFsiaDYiXSA9IDE7Ci0gIGFsbG93ZWRfbWFya3VwWyIvaDYiXSA9IDE7Ci19Ci0gIAotc3RkOjpzdHJpbmcgdF9odG1sX2dlbmVyYXRvcjo6ZXNjYXBlX2h0bWxfdGFncyhzdGQ6OnN0cmluZyBjb25zdCAmIHN0cikgewotICBzdGQ6Om9zdHJpbmdzdHJlYW0gcmVzdWx0OwotCi0gIHVuc2lnbmVkIGNoYXIgYyA9ICc/JzsKLSAgc2l6ZV90IGxhc3Rwb3M7Ci0gIHNpemVfdCBmaXJzdHBvcyA9IDA7Ci0gIHdoaWxlKCBmaXJzdHBvcyA8IHN0ci5sZW5ndGgoKSkgewotCi0gICAgLy8gbG9vayBmb3Igbm9uLUFTQ0lJIGNoYXIgIAotICAgIGxhc3Rwb3MgPSBmaXJzdHBvczsgICAgCi0gICAgd2hpbGUoIGxhc3Rwb3MgPCBzdHIubGVuZ3RoKCkpIHsKLSAgICAgIGMgPSBzdHIuYXQobGFzdHBvcyk7Ci0gICAgICBpZiggKCc8JyA9PSBjKSB8fCAoJz4nID09IGMpKSB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgKytsYXN0cG9zOwotICAgIH0KLSAgICAKLSAgICAvLyBjb3B5IHdoYXQgd2UgZ290IHNvIGZhciAgICAKLSAgICBpZiggbGFzdHBvcyA+IGZpcnN0cG9zKSB7Ci0gICAgICByZXN1bHQgPDwgc3RyLnN1YnN0ciggZmlyc3Rwb3MsIGxhc3Rwb3MtZmlyc3Rwb3MpOwotICAgICAgZmlyc3Rwb3MgPSBsYXN0cG9zOwotICAgIH0KLSAgICAKLSAgICAvLyByZWFjaGVkIHRoZSBlbmQ/Ci0gICAgaWYoIGZpcnN0cG9zID49IHN0ci5sZW5ndGgoKSkgewotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgLy8gdGFnIGVuZCB3aXRob3V0IGNvcnJlc3BvbmRpbmcgYmVnaW4KLSAgICArK2ZpcnN0cG9zOwotICAgIGlmKCAnPicgPT0gYykgewotICAgICAgcmVzdWx0IDw8ICImZ3Q7IjsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLQotICAgIC8vIGV4dHJhY3QgdGhlIHRhZwotICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSB0YWdzdHJlYW07Ci0gICAgd2hpbGUoIGZpcnN0cG9zIDwgc3RyLmxlbmd0aCgpKSB7Ci0gICAgICBjID0gc3RyLmF0KGZpcnN0cG9zKTsKLSAgICAgICsrZmlyc3Rwb3M7Ci0gICAgICBpZignPCc9PWMpIHsKLSAgICAgICAgdGFnc3RyZWFtIDw8ICImbHQ7IjsgLy8gbmVzdGVkIGJlZ2luPwotICAgICAgfSBlbHNlIGlmKCc+Jz09YykgewotICAgICAgICBicmVhazsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHRhZ3N0cmVhbSA8PCBjOyAgLy8gbm90IHZlcnkgZWZmaWNpZW50LCBidXQgdGFncyBzaG91bGQgYmUgcXVpdGUgc2hvcnQKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyB3ZSBhbGxvdyBmb3Igc2V2ZXJhbCBtYXJrdXAgaW4gZG9jc3RyaW5ncywgYWxsIGVsc2Ugd2lsbCBiZWNvbWUgZXNjYXBlZAotICAgIHN0cmluZyB0YWdfY29udGVudCA9IHRhZ3N0cmVhbS5zdHIoKTsKLSAgICBzdHJpbmcgdGFnX2tleSA9IHRhZ19jb250ZW50OwotICAgIHNpemVfdCBmaXJzdF93aGl0ZSA9IHRhZ19rZXkuZmluZF9maXJzdF9vZigiIFx0XGZcdlxuXHIiKTsKLSAgICBpZiggZmlyc3Rfd2hpdGUgIT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgICB0YWdfa2V5LmVyYXNlKGZpcnN0X3doaXRlKTsKLSAgICB9Ci0gICAgZm9yIChzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIGk9MDsgaTx0YWdfa2V5Lmxlbmd0aCgpOyArK2kpIHsKLSAgICAgIHRhZ19rZXlbaV0gPSB0b2xvd2VyKHRhZ19rZXlbaV0pOwotICAgIH0KLSAgICBpZiggYWxsb3dlZF9tYXJrdXAuZmluZCh0YWdfa2V5KSAhPSBhbGxvd2VkX21hcmt1cC5lbmQoKSkgewotICAgICAgcmVzdWx0IDw8ICI8IiA8PCB0YWdfY29udGVudCA8PCAiPiI7IAotICAgIH0gZWxzZSB7Ci0gICAgICByZXN1bHQgPDwgIiZsdDsiIDw8IHRhZ3N0cmVhbS5zdHIoKSA8PCAiJmd0OyI7IAotICAgICAgcHZlcmJvc2UoImlsbGVnYWwgbWFya3VwIDwlcz4gaW4gZG9jLWNvbW1lbnRcbiIsIHRhZ19rZXkuY19zdHIoKSk7Ci0gICAgfQotICB9Ci0gIAotICByZXR1cm4gcmVzdWx0LnN0cigpOwotfQotCi1zdGQ6OnN0cmluZyB0X2h0bWxfZ2VuZXJhdG9yOjplc2NhcGVfaHRtbChzdGQ6OnN0cmluZyBjb25zdCAmIHN0cikgewotICAvLyB0aGUgZ2VuZXJhdGVkIEhUTUwgaGVhZGVyIHNheXMgaXQgaXMgVVRGLTggZW5jb2RlZAotICAvLyBpZiBVVEYtOCBpbnB1dCBoYXMgYmVlbiBkZXRlY3RlZCBiZWZvcmUsIHdlIGRvbid0IG5lZWQgdG8gY2hhbmdlIGFueXRoaW5nCi0gIGlmKCBpbnB1dF90eXBlXyA9PSBJTlBVVF9VVEY4KSB7Ci0gICAgcmV0dXJuIGVzY2FwZV9odG1sX3RhZ3Moc3RyKTsKLSAgfQotICAKLSAgLy8gY29udmVydCB1bnNhZmUgY2hhcnMgdG8gdGhlaXIgJiM8bnVtPjsgZXF1aXZhbGVudAotICBzdGQ6Om9zdHJpbmdzdHJlYW0gcmVzdWx0OwotICB1bnNpZ25lZCBjaGFyIGMgPSAnPyc7Ci0gIHVuc2lnbmVkIGludCBpYyA9IDA7Ci0gIHNpemVfdCBsYXN0cG9zOwotICBzaXplX3QgZmlyc3Rwb3MgPSAwOwotICB3aGlsZSggZmlyc3Rwb3MgPCBzdHIubGVuZ3RoKCkpIHsKLQotICAgIC8vIGxvb2sgZm9yIG5vbi1BU0NJSSBjaGFyICAKLSAgICBsYXN0cG9zID0gZmlyc3Rwb3M7ICAgIAotICAgIHdoaWxlKCBsYXN0cG9zIDwgc3RyLmxlbmd0aCgpKSB7Ci0gICAgICBjID0gc3RyLmF0KGxhc3Rwb3MpOwotICAgICAgaWMgPSBjOwotICAgICAgaWYoICgzMiA+IGljKSB8fCAoMTI3IDwgaWMpKSB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgKytsYXN0cG9zOwotICAgIH0KLSAgICAKLSAgICAvLyBjb3B5IHdoYXQgd2UgZ290IHNvIGZhciAgICAKLSAgICBpZiggbGFzdHBvcyA+IGZpcnN0cG9zKSB7Ci0gICAgICByZXN1bHQgPDwgc3RyLnN1YnN0ciggZmlyc3Rwb3MsIGxhc3Rwb3MtZmlyc3Rwb3MpOwotICAgICAgZmlyc3Rwb3MgPSBsYXN0cG9zOwotICAgIH0KLQotICAgIC8vIHJlYWNoZWQgdGhlIGVuZD8KLSAgICBpZiggZmlyc3Rwb3MgPj0gc3RyLmxlbmd0aCgpKSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvLyBzb21lIGNvbnRyb2wgY29kZT8KLSAgICBpZihpYyA8PSAzMSkKLSAgICB7Ci0gICAgICBzd2l0Y2goIGMpCi0gICAgICB7Ci0gICAgICAgIGNhc2UgJ1xyJyA6ICAKLSAgICAgICAgY2FzZSAnXG4nIDogIAotICAgICAgICBjYXNlICdcdCcgOgotICAgICAgICAgIHJlc3VsdCA8PCBjOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OiAvLyBzaWxlbnRseSBjb25zdW1lIGFsbCBvdGhlciBjdHJsIGNoYXJzCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICArK2ZpcnN0cG9zOwotICAgICAgY29udGludWU7ICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgLy8gcmVhY2hlZCB0aGUgZW5kPwotICAgIGlmKCBmaXJzdHBvcyA+PSBzdHIubGVuZ3RoKCkpIHsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIC8vIHRyeSB0byBkZXRlY3QgaW5wdXQgZW5jb2RpbmcKLSAgICBpZiggaW5wdXRfdHlwZV8gPT0gSU5QVVRfVU5LTk9XTikgewotICAgICAgZGV0ZWN0X2lucHV0X2VuY29kaW5nKHN0cixmaXJzdHBvcyk7Ci0gICAgICBpZiggaW5wdXRfdHlwZV8gPT0gSU5QVVRfVVRGOCkgewotICAgICAgICBsYXN0cG9zID0gc3RyLmxlbmd0aCgpOwotICAgICAgICByZXN1bHQgPDwgc3RyLnN1YnN0ciggZmlyc3Rwb3MsIGxhc3Rwb3MtZmlyc3Rwb3MpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLy8gY29udmVydCB0aGUgY2hhcmFjdGVyIHRvIHNvbWV0aGluZyB1c2VmdWwgYmFzZWQgb24gdGhlIGRldGVjdGVkIGVuY29kaW5nCi0gICAgc3dpdGNoKCBpbnB1dF90eXBlXykgewotICAgICAgY2FzZSBJTlBVVF9QTEFJTjogCi0gICAgICAgIHJlc3VsdCA8PCAiJiMiIDw8IGljIDw8ICI7IjsgIAotICAgICAgICArK2ZpcnN0cG9zOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93ICJVbmV4cGVjdGVkIG9yIHVucmVjb2duaXplZCBpbnB1dCBlbmNvZGluZyI7Ci0gICAgfQotICB9Ci0gIAotICByZXR1cm4gZXNjYXBlX2h0bWxfdGFncyhyZXN1bHQuc3RyKCkpOwotfQotCi0vKioKLSAqIFByaW50cyBvdXQgdGhlIHByb3ZpZGVkIHR5cGUgaW4gSFRNTAotICovCi1pbnQgdF9odG1sX2dlbmVyYXRvcjo6cHJpbnRfdHlwZSh0X3R5cGUqIHR0eXBlKSB7Ci0gIGludCBsZW4gPSAwOwotICBmX291dF8gPDwgIjxjb2RlPiI7Ci0gIGlmICh0dHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgZl9vdXRfIDw8ICJsaXN0Jmx0OyI7Ci0gICAgICBsZW4gPSA2ICsgcHJpbnRfdHlwZSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpOwotICAgICAgZl9vdXRfIDw8ICImZ3Q7IjsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgICAgZl9vdXRfIDw8ICJzZXQmbHQ7IjsKLSAgICAgIGxlbiA9IDUgKyBwcmludF90eXBlKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKTsKLSAgICAgIGZfb3V0XyA8PCAiJmd0OyI7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICAgIGZfb3V0XyA8PCAibWFwJmx0OyI7Ci0gICAgICBsZW4gPSA1ICsgcHJpbnRfdHlwZSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKTsKLSAgICAgIGZfb3V0XyA8PCAiLCAiOwotICAgICAgbGVuICs9IHByaW50X3R5cGUoKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSk7Ci0gICAgICBmX291dF8gPDwgIiZndDsiOwotICAgIH0KLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICBmX291dF8gPDwgKCgodF9iYXNlX3R5cGUqKXR0eXBlKS0+aXNfYmluYXJ5KCkgPyAiYmluYXJ5IiA6IHR0eXBlLT5nZXRfbmFtZSgpKTsKLSAgICBsZW4gPSB0dHlwZS0+Z2V0X25hbWUoKS5zaXplKCk7Ci0gIH0gZWxzZSB7Ci0gICAgc3RyaW5nIHByb2dfbmFtZSA9IHR0eXBlLT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZSgpOwotICAgIHN0cmluZyB0eXBlX25hbWUgPSB0dHlwZS0+Z2V0X25hbWUoKTsKLSAgICBmX291dF8gPDwgIjxhIGhyZWY9XCIiIDw8IHByb2dfbmFtZSA8PCAiLmh0bWwjIjsKLSAgICBpZiAodHR5cGUtPmlzX3R5cGVkZWYoKSkgewotICAgICAgZl9vdXRfIDw8ICJUeXBlZGVmXyI7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICAgIGZfb3V0XyA8PCAiU3RydWN0XyI7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICBmX291dF8gPDwgIkVudW1fIjsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXJ2aWNlKCkpIHsKLSAgICAgIGZfb3V0XyA8PCAiU3ZjXyI7Ci0gICAgfQotICAgIGZfb3V0XyA8PCB0eXBlX25hbWUgPDwgIlwiPiI7Ci0gICAgbGVuID0gdHlwZV9uYW1lLnNpemUoKTsKLSAgICBpZiAodHR5cGUtPmdldF9wcm9ncmFtKCkgIT0gcHJvZ3JhbV8pIHsKLSAgICAgIGZfb3V0XyA8PCBwcm9nX25hbWUgPDwgIi4iOwotICAgICAgbGVuICs9IHByb2dfbmFtZS5zaXplKCkgKyAxOwotICAgIH0KLSAgICBmX291dF8gPDwgdHlwZV9uYW1lIDw8ICI8L2E+IjsKLSAgfQotICBmX291dF8gPDwgIjwvY29kZT4iOwotICByZXR1cm4gbGVuOwotfQotCi0vKioKLSAqIFByaW50cyBvdXQgYW4gSFRNTCByZXByZXNlbnRhdGlvbiBvZiB0aGUgcHJvdmlkZWQgY29uc3RhbnQgdmFsdWUKLSAqLwotdm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpwcmludF9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHR2YWx1ZSkgewotCi0gIC8vIGlmIHR2YWx1ZSBpcyBhbiBpbmRlbnRpZmllciwgdGhlIGNvbnN0YW50IGNvbnRlbnQgaXMgYWxyZWFkeSBzaG93biBlbHNld2hlcmUKLSAgaWYgKHR2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JREVOVElGSUVSKSB7Ci0gICAgc3RyaW5nIGZuYW1lID0gcHJvZ3JhbV8tPmdldF9uYW1lKCkgKyAiLmh0bWwiOwotICAgIHN0cmluZyBuYW1lID0gZXNjYXBlX2h0bWwoIHR2YWx1ZS0+Z2V0X2lkZW50aWZpZXIoKSk7Ci0gICAgZl9vdXRfIDw8ICI8Y29kZT48YSBocmVmPVwiIiArIG1ha2VfZmlsZV9saW5rKGZuYW1lKSArICIjQ29uc3RfIiArIG5hbWUgKyJcIj4iICsgbmFtZSArICI8L2E+PC9jb2RlPiI7Ci0gICAgcmV0dXJuOwotICB9Ci0gIAotICB0X3R5cGUqIHRydWV0eXBlID0gdHlwZTsKLSAgd2hpbGUgKHRydWV0eXBlLT5pc190eXBlZGVmKCkpIHsKLSAgICB0cnVldHlwZSA9ICgodF90eXBlZGVmKil0cnVldHlwZSktPmdldF90eXBlKCk7Ci0gIH0KLSAgCi0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBpZiAodHJ1ZXR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXRydWV0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgZl9vdXRfIDw8ICciJyA8PCBlc2NhcGVfaHRtbCggZ2V0X2VzY2FwZWRfc3RyaW5nKHR2YWx1ZSkpIDw8ICciJzsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIGZfb3V0XyA8PCAoKHR2YWx1ZS0+Z2V0X2ludGVnZXIoKSAhPSAwKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgZl9vdXRfIDw8IHR2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgZl9vdXRfIDw8IHR2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgZl9vdXRfIDw8IHR2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgZl9vdXRfIDw8IHR2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgaWYgKHR2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7Ci0gICAgICAgICAgZl9vdXRfIDw8IHR2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBmX291dF8gPDwgdHZhbHVlLT5nZXRfZG91YmxlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICAgIGZfb3V0XyA8PCAiVU5LTk9XTiBCQVNFIFRZUEUiOwotICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgfSBlbHNlIGlmICh0cnVldHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgZl9vdXRfIDw8IGVzY2FwZV9odG1sKHRydWV0eXBlLT5nZXRfbmFtZSgpKSA8PCAiLiIgPDwgZXNjYXBlX2h0bWwodHZhbHVlLT5nZXRfaWRlbnRpZmllcl9uYW1lKCkpOwotICB9IGVsc2UgaWYgKHRydWV0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0cnVldHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGZfb3V0XyA8PCAieyAiOwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXRydWV0eXBlKS0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHR2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7Ci0gICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgewotICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKLSAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0cnVldHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7Ci0gICAgICB9Ci0gICAgICBpZiAoIWZpcnN0KSB7Ci0gICAgICAgIGZfb3V0XyA8PCAiLCAiOwotICAgICAgfQotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIGZfb3V0XyA8PCBlc2NhcGVfaHRtbCggdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSA8PCAiID0gIjsKLSAgICAgIHByaW50X2NvbnN0X3ZhbHVlKCBmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgfQotICAgIGZfb3V0XyA8PCAiIH0iOwotICB9IGVsc2UgaWYgKHRydWV0eXBlLT5pc19tYXAoKSkgewotICAgIGZfb3V0XyA8PCAieyAiOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+IG1hcF9lbGVtcyA9IHR2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+OjppdGVyYXRvciBtYXBfaXRlcjsKLSAgICBmb3IgKG1hcF9pdGVyID0gbWFwX2VsZW1zLmJlZ2luKCk7IG1hcF9pdGVyICE9IG1hcF9lbGVtcy5lbmQoKTsgbWFwX2l0ZXIrKykgewotICAgICAgaWYgKCFmaXJzdCkgewotICAgICAgICBmX291dF8gPDwgIiwgIjsKLSAgICAgIH0KLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICBwcmludF9jb25zdF92YWx1ZSggKCh0X21hcCopdHJ1ZXR5cGUpLT5nZXRfa2V5X3R5cGUoKSwgbWFwX2l0ZXItPmZpcnN0KTsKLSAgICAgIGZfb3V0XyA8PCAiID0gIjsKLSAgICAgIHByaW50X2NvbnN0X3ZhbHVlKCAoKHRfbWFwKil0cnVldHlwZSktPmdldF92YWxfdHlwZSgpLCBtYXBfaXRlci0+c2Vjb25kKTsKLSAgICB9Ci0gICAgZl9vdXRfIDw8ICIgfSI7Ci0gIH0gZWxzZSBpZiAodHJ1ZXR5cGUtPmlzX2xpc3QoKSkgewotICAgIGZfb3V0XyA8PCAieyAiOwotICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4gbGlzdF9lbGVtcyA9IHR2YWx1ZS0+Z2V0X2xpc3QoKTs7Ci0gICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6aXRlcmF0b3IgbGlzdF9pdGVyOwotICAgIGZvciAobGlzdF9pdGVyID0gbGlzdF9lbGVtcy5iZWdpbigpOyBsaXN0X2l0ZXIgIT0gbGlzdF9lbGVtcy5lbmQoKTsgbGlzdF9pdGVyKyspIHsKLSAgICAgIGlmICghZmlyc3QpIHsKLSAgICAgICAgZl9vdXRfIDw8ICIsICI7Ci0gICAgICB9Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgcHJpbnRfY29uc3RfdmFsdWUoICgodF9saXN0Kil0cnVldHlwZSktPmdldF9lbGVtX3R5cGUoKSwgKmxpc3RfaXRlcik7Ci0gICAgfQotICAgIGZfb3V0XyA8PCAiIH0iOwotICB9IGVsc2UgaWYgKHRydWV0eXBlLT5pc19zZXQoKSkgewotICAgIGZfb3V0XyA8PCAieyAiOwotICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4gbGlzdF9lbGVtcyA9IHR2YWx1ZS0+Z2V0X2xpc3QoKTs7Ci0gICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6aXRlcmF0b3IgbGlzdF9pdGVyOwotICAgIGZvciAobGlzdF9pdGVyID0gbGlzdF9lbGVtcy5iZWdpbigpOyBsaXN0X2l0ZXIgIT0gbGlzdF9lbGVtcy5lbmQoKTsgbGlzdF9pdGVyKyspIHsKLSAgICAgIGlmICghZmlyc3QpIHsKLSAgICAgICAgZl9vdXRfIDw8ICIsICI7Ci0gICAgICB9Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgcHJpbnRfY29uc3RfdmFsdWUoICgodF9zZXQqKXRydWV0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpLCAqbGlzdF9pdGVyKTsKLSAgICB9Ci0gICAgZl9vdXRfIDw8ICIgfSI7Ci0gIH0gZWxzZSB7Ci0gICAgZl9vdXRfIDw8ICJVTktOT1dOIFRZUEUiOwotICB9Ci19Ci0KLS8qKgotICogUHJpbnRzIG91dCBkb2N1bWVudGF0aW9uIGZvciBhcmd1bWVudHMvZXhjZXB0aW9ucyBvZiBhIGZ1bmN0aW9uLCBpZiBhbnkgZG9jdW1lbnRhdGlvbiBoYXMgYmVlbiBzdXBwbGllZC4KLSAqLwotdm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpwcmludF9mbl9hcmdzX2RvYyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgYm9vbCBoYXNfZG9jcyA9IGZhbHNlOwotICB2ZWN0b3I8dF9maWVsZCo+IGFyZ3MgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46Oml0ZXJhdG9yIGFyZ19pdGVyID0gYXJncy5iZWdpbigpOwotICBpZiAoYXJnX2l0ZXIgIT0gYXJncy5lbmQoKSkgewotICAgIGZvciAoIDsgYXJnX2l0ZXIgIT0gYXJncy5lbmQoKTsgYXJnX2l0ZXIrKykgewotICAgICAgaWYgKCgqYXJnX2l0ZXIpLT5oYXNfZG9jKCkgJiYgISgqYXJnX2l0ZXIpLT5nZXRfZG9jKCkuZW1wdHkoKSkKLSAgICAgICAgaGFzX2RvY3MgPSB0cnVlOwotICAgIH0KLSAgICBpZiAoaGFzX2RvY3MpIHsKLSAgICAgIGFyZ19pdGVyID0gYXJncy5iZWdpbigpOwotICAgICAgZl9vdXRfIDw8ICI8YnIvPjxoNCBpZD1cIlBhcmFtZXRlcnNfIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKLSAgICAgICAgPDwgIlwiPlBhcmFtZXRlcnM8L2g0PiIgPDwgZW5kbDsKLSAgICAgIGZfb3V0XyA8PCAiPHRhYmxlIGNsYXNzPVwidGFibGUtYm9yZGVyZWQgdGFibGUtc3RyaXBlZCB0YWJsZS1jb25kZW5zZWRcIj4iOwotICAgICAgZl9vdXRfIDw8ICI8dGhlYWQ+PHRoPk5hbWU8L3RoPjx0aD5EZXNjcmlwdGlvbjwvdGg+PC90aGVhZD4iOwotICAgICAgZm9yICggOyBhcmdfaXRlciAhPSBhcmdzLmVuZCgpOyBhcmdfaXRlcisrKSB7Ci0gICAgICAgIGZfb3V0XyA8PCAiPHRyPjx0ZD4iIDw8ICgqYXJnX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICAgICBmX291dF8gPDwgIjwvdGQ+PHRkPiI7Ci0gICAgICAgIGZfb3V0XyA8PCBlc2NhcGVfaHRtbCggKCphcmdfaXRlciktPmdldF9kb2MoKSk7Ci0gICAgICAgIGZfb3V0XyA8PCAiPC90ZD48L3RyPiIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIGZfb3V0XyA8PCAiPC90YWJsZT4iOwotICAgIH0KLSAgfQotCi0gIGhhc19kb2NzID0gZmFsc2U7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj4gZXhjZXB0cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+OjppdGVyYXRvciBleF9pdGVyID0gZXhjZXB0cy5iZWdpbigpOwotICBpZiAoZXhfaXRlciAhPSBleGNlcHRzLmVuZCgpKSB7Ci0gICAgZm9yICggOyBleF9pdGVyICE9IGV4Y2VwdHMuZW5kKCk7IGV4X2l0ZXIrKykgewotICAgICAgaWYgKCgqZXhfaXRlciktPmhhc19kb2MoKSAmJiAhKCpleF9pdGVyKS0+Z2V0X2RvYygpLmVtcHR5KCkpCi0gICAgICAgIGhhc19kb2NzID0gdHJ1ZTsKLSAgICB9Ci0gICAgaWYgKGhhc19kb2NzKSB7Ci0gICAgICBleF9pdGVyID0gZXhjZXB0cy5iZWdpbigpOwotICAgICAgZl9vdXRfIDw8ICI8YnIvPjxoNCBpZD1cIkV4Y2VwdGlvbnNfIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKLSAgICAgICAgPDwgIlwiPkV4Y2VwdGlvbnM8L2g0PiIgPDwgZW5kbDsKLSAgICAgIGZfb3V0XyA8PCAiPHRhYmxlIGNsYXNzPVwidGFibGUtYm9yZGVyZWQgdGFibGUtc3RyaXBlZCB0YWJsZS1jb25kZW5zZWRcIj4iOwotICAgICAgZl9vdXRfIDw8ICI8dGhlYWQ+PHRoPlR5cGU8L3RoPjx0aD5EZXNjcmlwdGlvbjwvdGg+PC90aGVhZD4iOwotICAgICAgZm9yICggOyBleF9pdGVyICE9IGV4Y2VwdHMuZW5kKCk7IGV4X2l0ZXIrKykgewotICAgICAgICBmX291dF8gPDwgIjx0cj48dGQ+IiA8PCAoKmV4X2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpOwotICAgICAgICBmX291dF8gPDwgIjwvdGQ+PHRkPiI7Ci0gICAgICAgIGZfb3V0XyA8PCBlc2NhcGVfaHRtbCggKCpleF9pdGVyKS0+Z2V0X2RvYygpKTsKLSAgICAgICAgZl9vdXRfIDw8ICI8L3RkPjwvdHI+IiA8PCBlbmRsOwotICAgICAgfQotICAgICAgZl9vdXRfIDw8ICI8L3RhYmxlPiI7Ci0gICAgfQotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgdHlwZWRlZi4KLSAqCi0gKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgotICovCi12b2lkIHRfaHRtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgewotICBzdHJpbmcgbmFtZSA9IHR0eXBlZGVmLT5nZXRfbmFtZSgpOwotICBmX291dF8gPDwgIjxkaXYgY2xhc3M9XCJkZWZpbml0aW9uXCI+IjsKLSAgZl9vdXRfIDw8ICI8aDMgaWQ9XCJUeXBlZGVmXyIgPDwgbmFtZSA8PCAiXCI+VHlwZWRlZjogIiA8PCBuYW1lCi0gICA8PCAiPC9oMz4iIDw8IGVuZGw7Ci0gIGZfb3V0XyA8PCAiPHA+PHN0cm9uZz5CYXNlIHR5cGU6PC9zdHJvbmc+Jm5ic3A7IjsKLSAgcHJpbnRfdHlwZSh0dHlwZWRlZi0+Z2V0X3R5cGUoKSk7Ci0gIGZfb3V0XyA8PCAiPC9wPiIgPDwgZW5kbDsKLSAgcHJpbnRfZG9jKHR0eXBlZGVmKTsKLSAgZl9vdXRfIDw8ICI8L2Rpdj4iIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGNvZGUgZm9yIGFuIGVudW1lcmF0ZWQgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCi0gKi8KLXZvaWQgdF9odG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7Ci0gIHN0cmluZyBuYW1lID0gdGVudW0tPmdldF9uYW1lKCk7Ci0gIGZfb3V0XyA8PCAiPGRpdiBjbGFzcz1cImRlZmluaXRpb25cIj4iOwotICBmX291dF8gPDwgIjxoMyBpZD1cIkVudW1fIiA8PCBuYW1lIDw8ICJcIj5FbnVtZXJhdGlvbjogIiA8PCBuYW1lCi0gICA8PCAiPC9oMz4iIDw8IGVuZGw7Ci0gIHByaW50X2RvYyh0ZW51bSk7Ci0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiB2YWx1ZXMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOwotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIHZhbF9pdGVyOwotICBmX291dF8gPDwgIjxici8+PHRhYmxlIGNsYXNzPVwidGFibGUtYm9yZGVyZWQgdGFibGUtc3RyaXBlZCB0YWJsZS1jb25kZW5zZWRcIj4iIDw8IGVuZGw7Ci0gIGZvciAodmFsX2l0ZXIgPSB2YWx1ZXMuYmVnaW4oKTsgdmFsX2l0ZXIgIT0gdmFsdWVzLmVuZCgpOyArK3ZhbF9pdGVyKSB7Ci0gICAgZl9vdXRfIDw8ICI8dHI+PHRkPjxjb2RlPiI7Ci0gICAgZl9vdXRfIDw8ICgqdmFsX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIGZfb3V0XyA8PCAiPC9jb2RlPjwvdGQ+PHRkPjxjb2RlPiI7Ci0gICAgZl9vdXRfIDw8ICgqdmFsX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgICBmX291dF8gPDwgIjwvY29kZT48L3RkPjx0ZD4iIDw8IGVuZGw7Ci0gICAgcHJpbnRfZG9jKCgqdmFsX2l0ZXIpKTsKLSAgICBmX291dF8gPDwgIjwvdGQ+PC90cj4iIDw8IGVuZGw7Ci0gIH0KLSAgZl9vdXRfIDw8ICI8L3RhYmxlPjwvZGl2PiIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBjb25zdGFudCB2YWx1ZQotICovCi12b2lkIHRfaHRtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCkgewotICBzdHJpbmcgbmFtZSA9IHRjb25zdC0+Z2V0X25hbWUoKTsKLSAgZl9vdXRfIDw8ICI8dHIgaWQ9XCJDb25zdF8iIDw8IG5hbWUgPDwgIlwiPjx0ZD48Y29kZT4iIDw8IG5hbWUKLSAgIDw8ICI8L2NvZGU+PC90ZD48dGQ+IjsKLSAgcHJpbnRfdHlwZSh0Y29uc3QtPmdldF90eXBlKCkpOwotICBmX291dF8gPDwgIjwvdGQ+PHRkPjxjb2RlPiI7Ci0gIHByaW50X2NvbnN0X3ZhbHVlKHRjb25zdC0+Z2V0X3R5cGUoKSwgdGNvbnN0LT5nZXRfdmFsdWUoKSk7Ci0gIGZfb3V0XyA8PCAiPC9jb2RlPjwvdGQ+PC90cj4iOwotICBpZiAodGNvbnN0LT5oYXNfZG9jKCkpIHsKLSAgICBmX291dF8gPDwgIjx0cj48dGQgY29sc3Bhbj1cIjNcIj48YmxvY2txdW90ZT4iOwotICAgIHByaW50X2RvYyh0Y29uc3QpOwotICAgIGZfb3V0XyA8PCAiPC9ibG9ja3F1b3RlPjwvdGQ+PC90cj4iOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGRhdGEgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOwotICBmX291dF8gPDwgIjxkaXYgY2xhc3M9XCJkZWZpbml0aW9uXCI+IjsKLSAgZl9vdXRfIDw8ICI8aDMgaWQ9XCJTdHJ1Y3RfIiA8PCBuYW1lIDw8ICJcIj4iOwotICBpZiAodHN0cnVjdC0+aXNfeGNlcHRpb24oKSkgewotICAgIGZfb3V0XyA8PCAiRXhjZXB0aW9uOiAiOwotICB9IGVsc2UgaWYgKHRzdHJ1Y3QtPmlzX3VuaW9uKCkpIHsKLSAgICBmX291dF8gPDwgIlVuaW9uOiAiOwotICB9IGVsc2UgewotICAgIGZfb3V0XyA8PCAiU3RydWN0OiAiOwotICB9Ci0gIGZfb3V0XyA8PCBuYW1lIDw8ICI8L2gzPiIgPDwgZW5kbDsKLSAgdmVjdG9yPHRfZmllbGQqPiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6aXRlcmF0b3IgbWVtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7Ci0gIGZfb3V0XyA8PCAiPHRhYmxlIGNsYXNzPVwidGFibGUtYm9yZGVyZWQgdGFibGUtc3RyaXBlZCB0YWJsZS1jb25kZW5zZWRcIj4iOwotICBmX291dF8gPDwgIjx0aGVhZD48dGg+S2V5PC90aD48dGg+RmllbGQ8L3RoPjx0aD5UeXBlPC90aD48dGg+RGVzY3JpcHRpb248L3RoPjx0aD5SZXF1aXJlZG5lc3M8L3RoPjx0aD5EZWZhdWx0IHZhbHVlPC90aD48L3RoZWFkPiIKLSAgICA8PCBlbmRsOwotICBmb3IgKCA7IG1lbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7IG1lbV9pdGVyKyspIHsKLSAgICBmX291dF8gPDwgIjx0cj48dGQ+IiA8PCAoKm1lbV9pdGVyKS0+Z2V0X2tleSgpIDw8ICI8L3RkPjx0ZD4iOwotICAgIGZfb3V0XyA8PCAoKm1lbV9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICBmX291dF8gPDwgIjwvdGQ+PHRkPiI7Ci0gICAgcHJpbnRfdHlwZSgoKm1lbV9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgZl9vdXRfIDw8ICI8L3RkPjx0ZD4iOwotICAgIGZfb3V0XyA8PCBlc2NhcGVfaHRtbCggKCptZW1faXRlciktPmdldF9kb2MoKSk7Ci0gICAgZl9vdXRfIDw8ICI8L3RkPjx0ZD4iOwotICAgIGlmICgoKm1lbV9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKLSAgICAgIGZfb3V0XyA8PCAib3B0aW9uYWwiOwotICAgIH0gZWxzZSBpZiAoKCptZW1faXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7Ci0gICAgICBmX291dF8gPDwgInJlcXVpcmVkIjsKLSAgICB9IGVsc2UgewotICAgICAgZl9vdXRfIDw8ICJkZWZhdWx0IjsKLSAgICB9Ci0gICAgZl9vdXRfIDw8ICI8L3RkPjx0ZD4iOwotICAgIHRfY29uc3RfdmFsdWUqIGRlZmF1bHRfdmFsID0gKCptZW1faXRlciktPmdldF92YWx1ZSgpOwotICAgIGlmIChkZWZhdWx0X3ZhbCAhPSBOVUxMKSB7Ci0gICAgICBmX291dF8gPDwgIjxjb2RlPiI7Ci0gICAgICBwcmludF9jb25zdF92YWx1ZSgoKm1lbV9pdGVyKS0+Z2V0X3R5cGUoKSwgZGVmYXVsdF92YWwpOwotICAgICAgZl9vdXRfIDw8ICI8L2NvZGU+IjsKLSAgICB9Ci0gICAgZl9vdXRfIDw8ICI8L3RkPjwvdHI+IiA8PCBlbmRsOwotICB9Ci0gIGZfb3V0XyA8PCAiPC90YWJsZT48YnIvPiI7Ci0gIHByaW50X2RvYyh0c3RydWN0KTsKLSAgZl9vdXRfIDw8ICI8L2Rpdj4iOwotfQotCi0vKioKLSAqIEV4Y2VwdGlvbnMgYXJlIHNwZWNpYWwgc3RydWN0cwotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfaHRtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKLSAgZ2VuZXJhdGVfc3RydWN0KHR4Y2VwdGlvbik7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIHRoZSBIVE1MIGJsb2NrIGZvciBhIFRocmlmdCBzZXJ2aWNlLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9odG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIGZfb3V0XyA8PCAiPGgzIGlkPVwiU3ZjXyIgPDwgc2VydmljZV9uYW1lXyA8PCAiXCI+U2VydmljZTogIgotICAgIDw8IHNlcnZpY2VfbmFtZV8gPDwgIjwvaDM+IiA8PCBlbmRsOwotCi0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSkgewotICAgIGZfb3V0XyA8PCAiPGRpdiBjbGFzcz1cImV4dGVuZHNcIj48ZW0+ZXh0ZW5kczwvZW0+ICI7Ci0gICAgcHJpbnRfdHlwZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7Ci0gICAgZl9vdXRfIDw8ICI8L2Rpdj5cbiI7Ci0gIH0KLSAgcHJpbnRfZG9jKHRzZXJ2aWNlKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmbl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7Ci0gIGZvciAoIDsgZm5faXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7IGZuX2l0ZXIrKykgewotICAgIHN0cmluZyBmbl9uYW1lID0gKCpmbl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICBmX291dF8gPDwgIjxkaXYgY2xhc3M9XCJkZWZpbml0aW9uXCI+IjsKLSAgICBmX291dF8gPDwgIjxoNCBpZD1cIkZuXyIgPDwgc2VydmljZV9uYW1lXyA8PCAiXyIgPDwgZm5fbmFtZQotICAgICAgPDwgIlwiPkZ1bmN0aW9uOiAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIi4iIDw8IGZuX25hbWUKLSAgICAgIDw8ICI8L2g0PiIgPDwgZW5kbDsKLSAgICBmX291dF8gPDwgIjxwcmU+IjsKLSAgICBpbnQgb2Zmc2V0ID0gcHJpbnRfdHlwZSgoKmZuX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpKTsKLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBmX291dF8gPDwgIiAiIDw8IGZuX25hbWUgPDwgIigiOwotICAgIG9mZnNldCArPSBmbl9uYW1lLnNpemUoKSArIDI7Ci0gICAgdmVjdG9yPHRfZmllbGQqPiBhcmdzID0gKCpmbl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+OjppdGVyYXRvciBhcmdfaXRlciA9IGFyZ3MuYmVnaW4oKTsKLSAgICBmb3IgKCA7IGFyZ19pdGVyICE9IGFyZ3MuZW5kKCk7IGFyZ19pdGVyKyspIHsKLSAgICAgIGlmICghZmlyc3QpIHsKLSAgICAgICAgZl9vdXRfIDw8ICIsIiA8PCBlbmRsOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG9mZnNldDsgKytpKSB7Ci0gICAgICAgICAgZl9vdXRfIDw8ICIgIjsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIHByaW50X3R5cGUoKCphcmdfaXRlciktPmdldF90eXBlKCkpOwotICAgICAgZl9vdXRfIDw8ICIgIiA8PCAoKmFyZ19pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICAgIGlmICgoKmFyZ19pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgewotICAgICAgICBmX291dF8gPDwgIiA9ICI7Ci0gICAgICAgIHByaW50X2NvbnN0X3ZhbHVlKCgqYXJnX2l0ZXIpLT5nZXRfdHlwZSgpLCAoKmFyZ19pdGVyKS0+Z2V0X3ZhbHVlKCkpOwotICAgICAgfQotICAgIH0KLSAgICBmX291dF8gPDwgIikiIDw8IGVuZGw7Ci0gICAgZmlyc3QgPSB0cnVlOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj4gZXhjZXB0cyA9ICgqZm5faXRlciktPmdldF94Y2VwdGlvbnMoKS0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+OjppdGVyYXRvciBleF9pdGVyID0gZXhjZXB0cy5iZWdpbigpOwotICAgIGlmIChleF9pdGVyICE9IGV4Y2VwdHMuZW5kKCkpIHsKLSAgICAgIGZfb3V0XyA8PCAiICAgIHRocm93cyAiOwotICAgICAgZm9yICggOyBleF9pdGVyICE9IGV4Y2VwdHMuZW5kKCk7IGV4X2l0ZXIrKykgewotICAgICAgICBpZiAoIWZpcnN0KSB7Ci0gICAgICAgICAgZl9vdXRfIDw8ICIsICI7Ci0gICAgICAgIH0KLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgcHJpbnRfdHlwZSgoKmV4X2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICAgIH0KLSAgICAgIGZfb3V0XyA8PCBlbmRsOwotICAgIH0KLSAgICBmX291dF8gPDwgIjwvcHJlPiI7Ci0gICAgcHJpbnRfZG9jKCpmbl9pdGVyKTsKLSAgICBwcmludF9mbl9hcmdzX2RvYygqZm5faXRlcik7Ci0gICAgZl9vdXRfIDw8ICI8L2Rpdj4iOwotICB9Ci19Ci0KLVRIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoaHRtbCwgIkhUTUwiLAotIiAgICBzdGFuZGFsb25lOiAgICAgIFNlbGYtY29udGFpbmVkIG1vZGUsIGluY2x1ZGVzIGFsbCBDU1MgaW4gdGhlIEhUTUwgZmlsZXMuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdGVzIG5vIHN0eWxlLmNzcyBmaWxlLCBidXQgSFRNTCBmaWxlcyB3aWxsIGJlIGxhcmdlci5cbiIKLSkKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9odG1sX2dlbmVyYXRvci5oIGIvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2h0bWxfZ2VuZXJhdG9yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0MGVkZDMuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2h0bWxfZ2VuZXJhdG9yLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotI2RlZmluZSBCT09UU1RSQVBfQ1NTKCkgIi8qIVxuIlwKLSIgKiBCb290c3RyYXAgdjIuMC4zXG4iXAotIiAqXG4iXAotIiAqIENvcHlyaWdodCAyMDEyIFR3aXR0ZXIsIEluY1xuIlwKLSIgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UgdjIuMFxuIlwKLSIgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiJcCi0iICpcbiJcCi0iICogRGVzaWduZWQgYW5kIGJ1aWx0IHdpdGggYWxsIHRoZSBsb3ZlIGluIHRoZSB3b3JsZCBAdHdpdHRlciBieSBAbWRvIGFuZCBAZmF0LlxuIlwKLSIgKi9cbiJcCi0iLmNsZWFyZml4eyp6b29tOjE7fS5jbGVhcmZpeDpiZWZvcmUsLmNsZWFyZml4OmFmdGVye2Rpc3BsYXk6dGFibGU7Y29udGVudDpcIlwiO31cbiJcCi0iLmNsZWFyZml4OmFmdGVye2NsZWFyOmJvdGg7fVxuIlwKLSIuaGlkZS10ZXh0e2ZvbnQ6MC8wIGE7Y29sb3I6dHJhbnNwYXJlbnQ7dGV4dC1zaGFkb3c6bm9uZTtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O2JvcmRlcjowO31cbiJcCi0iLmlucHV0LWJsb2NrLWxldmVse2Rpc3BsYXk6YmxvY2s7d2lkdGg6MTAwJTttaW4taGVpZ2h0OjI4cHg7LXdlYmtpdC1ib3gtc2l6aW5nOmJvcmRlci1ib3g7LW1vei1ib3gtc2l6aW5nOmJvcmRlci1ib3g7LW1zLWJveC1zaXppbmc6Ym9yZGVyLWJveDtib3gtc2l6aW5nOmJvcmRlci1ib3g7fVxuIlwKLSJhcnRpY2xlLGFzaWRlLGRldGFpbHMsZmlnY2FwdGlvbixmaWd1cmUsZm9vdGVyLGhlYWRlcixoZ3JvdXAsbmF2LHNlY3Rpb257ZGlzcGxheTpibG9jazt9XG4iXAotImF1ZGlvLGNhbnZhcyx2aWRlb3tkaXNwbGF5OmlubGluZS1ibG9jazsqZGlzcGxheTppbmxpbmU7Knpvb206MTt9XG4iXAotImF1ZGlvOm5vdChbY29udHJvbHNdKXtkaXNwbGF5Om5vbmU7fVxuIlwKLSJodG1se2ZvbnQtc2l6ZToxMDAlOy13ZWJraXQtdGV4dC1zaXplLWFkanVzdDoxMDAlOy1tcy10ZXh0LXNpemUtYWRqdXN0OjEwMCU7fVxuIlwKLSJhOmZvY3Vze291dGxpbmU6dGhpbiBkb3R0ZWQgIzMzMztvdXRsaW5lOjVweCBhdXRvIC13ZWJraXQtZm9jdXMtcmluZy1jb2xvcjtvdXRsaW5lLW9mZnNldDotMnB4O31cbiJcCi0iYTpob3ZlcixhOmFjdGl2ZXtvdXRsaW5lOjA7fVxuIlwKLSJzdWIsc3Vwe3Bvc2l0aW9uOnJlbGF0aXZlO2ZvbnQtc2l6ZTo3NSU7bGluZS1oZWlnaHQ6MDt2ZXJ0aWNhbC1hbGlnbjpiYXNlbGluZTt9XG4iXAotInN1cHt0b3A6LTAuNWVtO31cbiJcCi0ic3Vie2JvdHRvbTotMC4yNWVtO31cbiJcCi0iaW1ne21heC13aWR0aDoxMDAlO3ZlcnRpY2FsLWFsaWduOm1pZGRsZTtib3JkZXI6MDstbXMtaW50ZXJwb2xhdGlvbi1tb2RlOmJpY3ViaWM7fVxuIlwKLSJidXR0b24saW5wdXQsc2VsZWN0LHRleHRhcmVhe21hcmdpbjowO2ZvbnQtc2l6ZToxMDAlO3ZlcnRpY2FsLWFsaWduOm1pZGRsZTt9XG4iXAotImJ1dHRvbixpbnB1dHsqb3ZlcmZsb3c6dmlzaWJsZTtsaW5lLWhlaWdodDpub3JtYWw7fVxuIlwKLSJidXR0b246Oi1tb3otZm9jdXMtaW5uZXIsaW5wdXQ6Oi1tb3otZm9jdXMtaW5uZXJ7cGFkZGluZzowO2JvcmRlcjowO31cbiJcCi0iYnV0dG9uLGlucHV0W3R5cGU9XCJidXR0b25cIl0saW5wdXRbdHlwZT1cInJlc2V0XCJdLGlucHV0W3R5cGU9XCJzdWJtaXRcIl17Y3Vyc29yOnBvaW50ZXI7LXdlYmtpdC1hcHBlYXJhbmNlOmJ1dHRvbjt9XG4iXAotImlucHV0W3R5cGU9XCJzZWFyY2hcIl17LXdlYmtpdC1ib3gtc2l6aW5nOmNvbnRlbnQtYm94Oy1tb3otYm94LXNpemluZzpjb250ZW50LWJveDtib3gtc2l6aW5nOmNvbnRlbnQtYm94Oy13ZWJraXQtYXBwZWFyYW5jZTp0ZXh0ZmllbGQ7fVxuIlwKLSJpbnB1dFt0eXBlPVwic2VhcmNoXCJdOjotd2Via2l0LXNlYXJjaC1kZWNvcmF0aW9uLGlucHV0W3R5cGU9XCJzZWFyY2hcIl06Oi13ZWJraXQtc2VhcmNoLWNhbmNlbC1idXR0b257LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7fVxuIlwKLSJ0ZXh0YXJlYXtvdmVyZmxvdzphdXRvO3ZlcnRpY2FsLWFsaWduOnRvcDt9XG4iXAotImJvZHl7bWFyZ2luOjA7Zm9udC1mYW1pbHk6XCJIZWx2ZXRpY2EgTmV1ZVwiLEhlbHZldGljYSxBcmlhbCxzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxM3B4O2xpbmUtaGVpZ2h0OjE4cHg7Y29sb3I6IzMzMzMzMztiYWNrZ3JvdW5kLWNvbG9yOiNmZmZmZmY7fVxuIlwKLSJhe2NvbG9yOiMwMDg4Y2M7dGV4dC1kZWNvcmF0aW9uOm5vbmU7fVxuIlwKLSJhOmhvdmVye2NvbG9yOiMwMDU1ODA7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTt9XG4iXAotIi5yb3d7bWFyZ2luLWxlZnQ6LTIwcHg7Knpvb206MTt9LnJvdzpiZWZvcmUsLnJvdzphZnRlcntkaXNwbGF5OnRhYmxlO2NvbnRlbnQ6XCJcIjt9XG4iXAotIi5yb3c6YWZ0ZXJ7Y2xlYXI6Ym90aDt9XG4iXAotIltjbGFzcyo9XCJzcGFuXCJde2Zsb2F0OmxlZnQ7bWFyZ2luLWxlZnQ6MjBweDt9XG4iXAotIi5jb250YWluZXIsLm5hdmJhci1maXhlZC10b3AgLmNvbnRhaW5lciwubmF2YmFyLWZpeGVkLWJvdHRvbSAuY29udGFpbmVye3dpZHRoOjk0MHB4O31cbiJcCi0iLnNwYW4xMnt3aWR0aDo5NDBweDt9XG4iXAotIi5zcGFuMTF7d2lkdGg6ODYwcHg7fVxuIlwKLSIuc3BhbjEwe3dpZHRoOjc4MHB4O31cbiJcCi0iLnNwYW45e3dpZHRoOjcwMHB4O31cbiJcCi0iLnNwYW44e3dpZHRoOjYyMHB4O31cbiJcCi0iLnNwYW43e3dpZHRoOjU0MHB4O31cbiJcCi0iLnNwYW42e3dpZHRoOjQ2MHB4O31cbiJcCi0iLnNwYW41e3dpZHRoOjM4MHB4O31cbiJcCi0iLnNwYW40e3dpZHRoOjMwMHB4O31cbiJcCi0iLnNwYW4ze3dpZHRoOjIyMHB4O31cbiJcCi0iLnNwYW4ye3dpZHRoOjE0MHB4O31cbiJcCi0iLnNwYW4xe3dpZHRoOjYwcHg7fVxuIlwKLSIub2Zmc2V0MTJ7bWFyZ2luLWxlZnQ6OTgwcHg7fVxuIlwKLSIub2Zmc2V0MTF7bWFyZ2luLWxlZnQ6OTAwcHg7fVxuIlwKLSIub2Zmc2V0MTB7bWFyZ2luLWxlZnQ6ODIwcHg7fVxuIlwKLSIub2Zmc2V0OXttYXJnaW4tbGVmdDo3NDBweDt9XG4iXAotIi5vZmZzZXQ4e21hcmdpbi1sZWZ0OjY2MHB4O31cbiJcCi0iLm9mZnNldDd7bWFyZ2luLWxlZnQ6NTgwcHg7fVxuIlwKLSIub2Zmc2V0NnttYXJnaW4tbGVmdDo1MDBweDt9XG4iXAotIi5vZmZzZXQ1e21hcmdpbi1sZWZ0OjQyMHB4O31cbiJcCi0iLm9mZnNldDR7bWFyZ2luLWxlZnQ6MzQwcHg7fVxuIlwKLSIub2Zmc2V0M3ttYXJnaW4tbGVmdDoyNjBweDt9XG4iXAotIi5vZmZzZXQye21hcmdpbi1sZWZ0OjE4MHB4O31cbiJcCi0iLm9mZnNldDF7bWFyZ2luLWxlZnQ6MTAwcHg7fVxuIlwKLSIucm93LWZsdWlke3dpZHRoOjEwMCU7Knpvb206MTt9LnJvdy1mbHVpZDpiZWZvcmUsLnJvdy1mbHVpZDphZnRlcntkaXNwbGF5OnRhYmxlO2NvbnRlbnQ6XCJcIjt9XG4iXAotIi5yb3ctZmx1aWQ6YWZ0ZXJ7Y2xlYXI6Ym90aDt9XG4iXAotIi5yb3ctZmx1aWQgW2NsYXNzKj1cInNwYW5cIl17ZGlzcGxheTpibG9jazt3aWR0aDoxMDAlO21pbi1oZWlnaHQ6MjhweDstd2Via2l0LWJveC1zaXppbmc6Ym9yZGVyLWJveDstbW96LWJveC1zaXppbmc6Ym9yZGVyLWJveDstbXMtYm94LXNpemluZzpib3JkZXItYm94O2JveC1zaXppbmc6Ym9yZGVyLWJveDtmbG9hdDpsZWZ0O21hcmdpbi1sZWZ0OjIuMTI3NjU5NTc0JTsqbWFyZ2luLWxlZnQ6Mi4wNzQ0NjgwODQ2MzgyOTc3JTt9XG4iXAotIi5yb3ctZmx1aWQgW2NsYXNzKj1cInNwYW5cIl06Zmlyc3QtY2hpbGR7bWFyZ2luLWxlZnQ6MDt9XG4iXAotIi5yb3ctZmx1aWQgLnNwYW4xMnt3aWR0aDo5OS45OTk5OTk5ODk5OTk5OSU7KndpZHRoOjk5Ljk0NjgwODUwMDYzODI4JTt9XG4iXAotIi5yb3ctZmx1aWQgLnNwYW4xMXt3aWR0aDo5MS40ODkzNjE2OTMlOyp3aWR0aDo5MS40MzYxNzAyMDM2MzgzJTt9XG4iXAotIi5yb3ctZmx1aWQgLnNwYW4xMHt3aWR0aDo4Mi45Nzg3MjMzOTU5OTk5OSU7KndpZHRoOjgyLjkyNTUzMTkwNjYzODI4JTt9XG4iXAotIi5yb3ctZmx1aWQgLnNwYW45e3dpZHRoOjc0LjQ2ODA4NTA5OSU7KndpZHRoOjc0LjQxNDg5MzYwOTYzODMlO31cbiJcCi0iLnJvdy1mbHVpZCAuc3Bhbjh7d2lkdGg6NjUuOTU3NDQ2ODAxOTk5OTklOyp3aWR0aDo2NS45MDQyNTUzMTI2MzgyOCU7fVxuIlwKLSIucm93LWZsdWlkIC5zcGFuN3t3aWR0aDo1Ny40NDY4MDg1MDUlOyp3aWR0aDo1Ny4zOTM2MTcwMTU2MzgzJTt9XG4iXAotIi5yb3ctZmx1aWQgLnNwYW42e3dpZHRoOjQ4LjkzNjE3MDIwNzk5OTk5JTsqd2lkdGg6NDguODgyOTc4NzE4NjM4MjklO31cbiJcCi0iLnJvdy1mbHVpZCAuc3BhbjV7d2lkdGg6NDAuNDI1NTMxOTExJTsqd2lkdGg6NDAuMzcyMzQwNDIxNjM4MyU7fVxuIlwKLSIucm93LWZsdWlkIC5zcGFuNHt3aWR0aDozMS45MTQ4OTM2MTQlOyp3aWR0aDozMS44NjE3MDIxMjQ2MzgzJTt9XG4iXAotIi5yb3ctZmx1aWQgLnNwYW4ze3dpZHRoOjIzLjQwNDI1NTMxNyU7KndpZHRoOjIzLjM1MTA2MzgyNzYzODMlO31cbiJcCi0iLnJvdy1mbHVpZCAuc3BhbjJ7d2lkdGg6MTQuODkzNjE3MDIlOyp3aWR0aDoxNC44NDA0MjU1MzA2MzgzJTt9XG4iXAotIi5yb3ctZmx1aWQgLnNwYW4xe3dpZHRoOjYuMzgyOTc4NzIzJTsqd2lkdGg6Ni4zMjk3ODcyMzM2MzgyOTglO31cbiJcCi0iLmNvbnRhaW5lcnttYXJnaW4tcmlnaHQ6YXV0bzttYXJnaW4tbGVmdDphdXRvOyp6b29tOjE7fS5jb250YWluZXI6YmVmb3JlLC5jb250YWluZXI6YWZ0ZXJ7ZGlzcGxheTp0YWJsZTtjb250ZW50OlwiXCI7fVxuIlwKLSIuY29udGFpbmVyOmFmdGVye2NsZWFyOmJvdGg7fVxuIlwKLSIuY29udGFpbmVyLWZsdWlke3BhZGRpbmctcmlnaHQ6MjBweDtwYWRkaW5nLWxlZnQ6MjBweDsqem9vbToxO30uY29udGFpbmVyLWZsdWlkOmJlZm9yZSwuY29udGFpbmVyLWZsdWlkOmFmdGVye2Rpc3BsYXk6dGFibGU7Y29udGVudDpcIlwiO31cbiJcCi0iLmNvbnRhaW5lci1mbHVpZDphZnRlcntjbGVhcjpib3RoO31cbiJcCi0icHttYXJnaW46MCAwIDlweDtmb250LWZhbWlseTpcIkhlbHZldGljYSBOZXVlXCIsSGVsdmV0aWNhLEFyaWFsLHNhbnMtc2VyaWY7Zm9udC1zaXplOjEzcHg7bGluZS1oZWlnaHQ6MThweDt9cCBzbWFsbHtmb250LXNpemU6MTFweDtjb2xvcjojOTk5OTk5O31cbiJcCi0iLmxlYWR7bWFyZ2luLWJvdHRvbToxOHB4O2ZvbnQtc2l6ZToyMHB4O2ZvbnQtd2VpZ2h0OjIwMDtsaW5lLWhlaWdodDoyN3B4O31cbiJcCi0iaDEsaDIsaDMsaDQsaDUsaDZ7bWFyZ2luOjA7Zm9udC1mYW1pbHk6aW5oZXJpdDtmb250LXdlaWdodDpib2xkO2NvbG9yOmluaGVyaXQ7dGV4dC1yZW5kZXJpbmc6b3B0aW1pemVsZWdpYmlsaXR5O31oMSBzbWFsbCxoMiBzbWFsbCxoMyBzbWFsbCxoNCBzbWFsbCxoNSBzbWFsbCxoNiBzbWFsbHtmb250LXdlaWdodDpub3JtYWw7Y29sb3I6Izk5OTk5OTt9XG4iXAotImgxe2ZvbnQtc2l6ZTozMHB4O2xpbmUtaGVpZ2h0OjM2cHg7fWgxIHNtYWxse2ZvbnQtc2l6ZToxOHB4O31cbiJcCi0iaDJ7Zm9udC1zaXplOjI0cHg7bGluZS1oZWlnaHQ6MzZweDt9aDIgc21hbGx7Zm9udC1zaXplOjE4cHg7fVxuIlwKLSJoM3tmb250LXNpemU6MThweDtsaW5lLWhlaWdodDoyN3B4O31oMyBzbWFsbHtmb250LXNpemU6MTRweDt9XG4iXAotImg0LGg1LGg2e2xpbmUtaGVpZ2h0OjE4cHg7fVxuIlwKLSJoNHtmb250LXNpemU6MTRweDt9aDQgc21hbGx7Zm9udC1zaXplOjEycHg7fVxuIlwKLSJoNXtmb250LXNpemU6MTJweDt9XG4iXAotImg2e2ZvbnQtc2l6ZToxMXB4O2NvbG9yOiM5OTk5OTk7dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlO31cbiJcCi0iLnBhZ2UtaGVhZGVye3BhZGRpbmctYm90dG9tOjE3cHg7bWFyZ2luOjE4cHggMDtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZWVlZWVlO31cbiJcCi0iLnBhZ2UtaGVhZGVyIGgxe2xpbmUtaGVpZ2h0OjE7fVxuIlwKLSJ1bCxvbHtwYWRkaW5nOjA7bWFyZ2luOjAgMCA5cHggMjVweDt9XG4iXAotInVsIHVsLHVsIG9sLG9sIG9sLG9sIHVse21hcmdpbi1ib3R0b206MDt9XG4iXAotInVse2xpc3Qtc3R5bGU6ZGlzYzt9XG4iXAotIm9se2xpc3Qtc3R5bGU6ZGVjaW1hbDt9XG4iXAotImxpe2xpbmUtaGVpZ2h0OjE4cHg7fVxuIlwKLSJ1bC51bnN0eWxlZCxvbC51bnN0eWxlZHttYXJnaW4tbGVmdDowO2xpc3Qtc3R5bGU6bm9uZTt9XG4iXAotImRse21hcmdpbi1ib3R0b206MThweDt9XG4iXAotImR0LGRke2xpbmUtaGVpZ2h0OjE4cHg7fVxuIlwKLSJkdHtmb250LXdlaWdodDpib2xkO2xpbmUtaGVpZ2h0OjE3cHg7fVxuIlwKLSJkZHttYXJnaW4tbGVmdDo5cHg7fVxuIlwKLSIuZGwtaG9yaXpvbnRhbCBkdHtmbG9hdDpsZWZ0O3dpZHRoOjEyMHB4O2NsZWFyOmxlZnQ7dGV4dC1hbGlnbjpyaWdodDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpczt3aGl0ZS1zcGFjZTpub3dyYXA7fVxuIlwKLSIuZGwtaG9yaXpvbnRhbCBkZHttYXJnaW4tbGVmdDoxMzBweDt9XG4iXAotImhye21hcmdpbjoxOHB4IDA7Ym9yZGVyOjA7Ym9yZGVyLXRvcDoxcHggc29saWQgI2VlZWVlZTtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZmZmZmZmO31cbiJcCi0ic3Ryb25ne2ZvbnQtd2VpZ2h0OmJvbGQ7fVxuIlwKLSJlbXtmb250LXN0eWxlOml0YWxpYzt9XG4iXAotIi5tdXRlZHtjb2xvcjojOTk5OTk5O31cbiJcCi0iYWJiclt0aXRsZV17Y3Vyc29yOmhlbHA7Ym9yZGVyLWJvdHRvbToxcHggZG90dGVkICNkZGQ7fVxuIlwKLSJhYmJyLmluaXRpYWxpc217Zm9udC1zaXplOjkwJTt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7fVxuIlwKLSJibG9ja3F1b3Rle3BhZGRpbmc6MCAwIDAgMTVweDttYXJnaW46MCAwIDE4cHg7Ym9yZGVyLWxlZnQ6NXB4IHNvbGlkICNlZWVlZWU7fWJsb2NrcXVvdGUgcHttYXJnaW4tYm90dG9tOjA7Zm9udC1zaXplOjE2cHg7Zm9udC13ZWlnaHQ6MzAwO2xpbmUtaGVpZ2h0OjIyLjVweDt9XG4iXAotImJsb2NrcXVvdGUgc21hbGx7ZGlzcGxheTpibG9jaztsaW5lLWhlaWdodDoxOHB4O2NvbG9yOiM5OTk5OTk7fWJsb2NrcXVvdGUgc21hbGw6YmVmb3Jle2NvbnRlbnQ6J1xcMjAxNCBcXDAwQTAnO31cbiJcCi0iYmxvY2txdW90ZS5wdWxsLXJpZ2h0e2Zsb2F0OnJpZ2h0O3BhZGRpbmctcmlnaHQ6MTVweDtwYWRkaW5nLWxlZnQ6MDtib3JkZXItcmlnaHQ6NXB4IHNvbGlkICNlZWVlZWU7Ym9yZGVyLWxlZnQ6MDt9YmxvY2txdW90ZS5wdWxsLXJpZ2h0IHAsYmxvY2txdW90ZS5wdWxsLXJpZ2h0IHNtYWxse3RleHQtYWxpZ246cmlnaHQ7fVxuIlwKLSJxOmJlZm9yZSxxOmFmdGVyLGJsb2NrcXVvdGU6YmVmb3JlLGJsb2NrcXVvdGU6YWZ0ZXJ7Y29udGVudDpcIlwiO31cbiJcCi0iYWRkcmVzc3tkaXNwbGF5OmJsb2NrO21hcmdpbi1ib3R0b206MThweDtmb250LXN0eWxlOm5vcm1hbDtsaW5lLWhlaWdodDoxOHB4O31cbiJcCi0ic21hbGx7Zm9udC1zaXplOjEwMCU7fVxuIlwKLSJjaXRle2ZvbnQtc3R5bGU6bm9ybWFsO31cbiJcCi0iY29kZSxwcmV7cGFkZGluZzowIDNweCAycHg7Zm9udC1mYW1pbHk6TWVubG8sTW9uYWNvLENvbnNvbGFzLFwiQ291cmllciBOZXdcIixtb25vc3BhY2U7Zm9udC1zaXplOjEycHg7Y29sb3I6IzMzMzMzMzstd2Via2l0LWJvcmRlci1yYWRpdXM6M3B4Oy1tb3otYm9yZGVyLXJhZGl1czozcHg7Ym9yZGVyLXJhZGl1czozcHg7fVxuIlwKLSJjb2Rle3BhZGRpbmc6MnB4IDRweDtjb2xvcjojZDE0O2JhY2tncm91bmQtY29sb3I6I2Y3ZjdmOTtib3JkZXI6MXB4IHNvbGlkICNlMWUxZTg7fVxuIlwKLSJwcmV7ZGlzcGxheTpibG9jaztwYWRkaW5nOjguNXB4O21hcmdpbjowIDAgOXB4O2ZvbnQtc2l6ZToxMi4wMjVweDtsaW5lLWhlaWdodDoxOHB4O3dvcmQtYnJlYWs6YnJlYWstYWxsO3dvcmQtd3JhcDpicmVhay13b3JkO3doaXRlLXNwYWNlOnByZTt3aGl0ZS1zcGFjZTpwcmUtd3JhcDtiYWNrZ3JvdW5kLWNvbG9yOiNmNWY1ZjU7Ym9yZGVyOjFweCBzb2xpZCAjY2NjO2JvcmRlcjoxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjE1KTstd2Via2l0LWJvcmRlci1yYWRpdXM6NHB4Oy1tb3otYm9yZGVyLXJhZGl1czo0cHg7Ym9yZGVyLXJhZGl1czo0cHg7fXByZS5wcmV0dHlwcmludHttYXJnaW4tYm90dG9tOjE4cHg7fVxuIlwKLSJwcmUgY29kZXtwYWRkaW5nOjA7Y29sb3I6aW5oZXJpdDtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O2JvcmRlcjowO31cbiJcCi0iLnByZS1zY3JvbGxhYmxle21heC1oZWlnaHQ6MzQwcHg7b3ZlcmZsb3cteTpzY3JvbGw7fVxuIlwKLSIubGFiZWwsLmJhZGdle2ZvbnQtc2l6ZToxMC45OThweDtmb250LXdlaWdodDpib2xkO2xpbmUtaGVpZ2h0OjE0cHg7Y29sb3I6I2ZmZmZmZjt2ZXJ0aWNhbC1hbGlnbjpiYXNlbGluZTt3aGl0ZS1zcGFjZTpub3dyYXA7dGV4dC1zaGFkb3c6MCAtMXB4IDAgcmdiYSgwLCAwLCAwLCAwLjI1KTtiYWNrZ3JvdW5kLWNvbG9yOiM5OTk5OTk7fVxuIlwKLSIubGFiZWx7cGFkZGluZzoxcHggNHB4IDJweDstd2Via2l0LWJvcmRlci1yYWRpdXM6M3B4Oy1tb3otYm9yZGVyLXJhZGl1czozcHg7Ym9yZGVyLXJhZGl1czozcHg7fVxuIlwKLSIuYmFkZ2V7cGFkZGluZzoxcHggOXB4IDJweDstd2Via2l0LWJvcmRlci1yYWRpdXM6OXB4Oy1tb3otYm9yZGVyLXJhZGl1czo5cHg7Ym9yZGVyLXJhZGl1czo5cHg7fVxuIlwKLSJhLmxhYmVsOmhvdmVyLGEuYmFkZ2U6aG92ZXJ7Y29sb3I6I2ZmZmZmZjt0ZXh0LWRlY29yYXRpb246bm9uZTtjdXJzb3I6cG9pbnRlcjt9XG4iXAotIi5sYWJlbC1pbXBvcnRhbnQsLmJhZGdlLWltcG9ydGFudHtiYWNrZ3JvdW5kLWNvbG9yOiNiOTRhNDg7fVxuIlwKLSIubGFiZWwtaW1wb3J0YW50W2hyZWZdLC5iYWRnZS1pbXBvcnRhbnRbaHJlZl17YmFja2dyb3VuZC1jb2xvcjojOTUzYjM5O31cbiJcCi0iLmxhYmVsLXdhcm5pbmcsLmJhZGdlLXdhcm5pbmd7YmFja2dyb3VuZC1jb2xvcjojZjg5NDA2O31cbiJcCi0iLmxhYmVsLXdhcm5pbmdbaHJlZl0sLmJhZGdlLXdhcm5pbmdbaHJlZl17YmFja2dyb3VuZC1jb2xvcjojYzY3NjA1O31cbiJcCi0iLmxhYmVsLXN1Y2Nlc3MsLmJhZGdlLXN1Y2Nlc3N7YmFja2dyb3VuZC1jb2xvcjojNDY4ODQ3O31cbiJcCi0iLmxhYmVsLXN1Y2Nlc3NbaHJlZl0sLmJhZGdlLXN1Y2Nlc3NbaHJlZl17YmFja2dyb3VuZC1jb2xvcjojMzU2NjM1O31cbiJcCi0iLmxhYmVsLWluZm8sLmJhZGdlLWluZm97YmFja2dyb3VuZC1jb2xvcjojM2E4N2FkO31cbiJcCi0iLmxhYmVsLWluZm9baHJlZl0sLmJhZGdlLWluZm9baHJlZl17YmFja2dyb3VuZC1jb2xvcjojMmQ2OTg3O31cbiJcCi0iLmxhYmVsLWludmVyc2UsLmJhZGdlLWludmVyc2V7YmFja2dyb3VuZC1jb2xvcjojMzMzMzMzO31cbiJcCi0iLmxhYmVsLWludmVyc2VbaHJlZl0sLmJhZGdlLWludmVyc2VbaHJlZl17YmFja2dyb3VuZC1jb2xvcjojMWExYTFhO31cbiJcCi0idGFibGV7bWF4LXdpZHRoOjEwMCU7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDtib3JkZXItY29sbGFwc2U6Y29sbGFwc2U7Ym9yZGVyLXNwYWNpbmc6MDt9XG4iXAotIi50YWJsZXt3aWR0aDoxMDAlO21hcmdpbi1ib3R0b206MThweDt9LnRhYmxlIHRoLC50YWJsZSB0ZHtwYWRkaW5nOjhweDtsaW5lLWhlaWdodDoxOHB4O3RleHQtYWxpZ246bGVmdDt2ZXJ0aWNhbC1hbGlnbjp0b3A7Ym9yZGVyLXRvcDoxcHggc29saWQgI2RkZGRkZDt9XG4iXAotIi50YWJsZSB0aHtmb250LXdlaWdodDpib2xkO31cbiJcCi0iLnRhYmxlIHRoZWFkIHRoe3ZlcnRpY2FsLWFsaWduOmJvdHRvbTt9XG4iXAotIi50YWJsZSBjYXB0aW9uK3RoZWFkIHRyOmZpcnN0LWNoaWxkIHRoLC50YWJsZSBjYXB0aW9uK3RoZWFkIHRyOmZpcnN0LWNoaWxkIHRkLC50YWJsZSBjb2xncm91cCt0aGVhZCB0cjpmaXJzdC1jaGlsZCB0aCwudGFibGUgY29sZ3JvdXArdGhlYWQgdHI6Zmlyc3QtY2hpbGQgdGQsLnRhYmxlIHRoZWFkOmZpcnN0LWNoaWxkIHRyOmZpcnN0LWNoaWxkIHRoLC50YWJsZSB0aGVhZDpmaXJzdC1jaGlsZCB0cjpmaXJzdC1jaGlsZCB0ZHtib3JkZXItdG9wOjA7fVxuIlwKLSIudGFibGUgdGJvZHkrdGJvZHl7Ym9yZGVyLXRvcDoycHggc29saWQgI2RkZGRkZDt9XG4iXAotIi50YWJsZS1jb25kZW5zZWQgdGgsLnRhYmxlLWNvbmRlbnNlZCB0ZHtwYWRkaW5nOjRweCA1cHg7fVxuIlwKLSIudGFibGUtYm9yZGVyZWR7Ym9yZGVyOjFweCBzb2xpZCAjZGRkZGRkO2JvcmRlci1jb2xsYXBzZTpzZXBhcmF0ZTsqYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlZDtib3JkZXItbGVmdDowOy13ZWJraXQtYm9yZGVyLXJhZGl1czo0cHg7LW1vei1ib3JkZXItcmFkaXVzOjRweDtib3JkZXItcmFkaXVzOjRweDt9LnRhYmxlLWJvcmRlcmVkIHRoLC50YWJsZS1ib3JkZXJlZCB0ZHtib3JkZXItbGVmdDoxcHggc29saWQgI2RkZGRkZDt9XG4iXAotIi50YWJsZS1ib3JkZXJlZCBjYXB0aW9uK3RoZWFkIHRyOmZpcnN0LWNoaWxkIHRoLC50YWJsZS1ib3JkZXJlZCBjYXB0aW9uK3Rib2R5IHRyOmZpcnN0LWNoaWxkIHRoLC50YWJsZS1ib3JkZXJlZCBjYXB0aW9uK3Rib2R5IHRyOmZpcnN0LWNoaWxkIHRkLC50YWJsZS1ib3JkZXJlZCBjb2xncm91cCt0aGVhZCB0cjpmaXJzdC1jaGlsZCB0aCwudGFibGUtYm9yZGVyZWQgY29sZ3JvdXArdGJvZHkgdHI6Zmlyc3QtY2hpbGQgdGgsLnRhYmxlLWJvcmRlcmVkIGNvbGdyb3VwK3Rib2R5IHRyOmZpcnN0LWNoaWxkIHRkLC50YWJsZS1ib3JkZXJlZCB0aGVhZDpmaXJzdC1jaGlsZCB0cjpmaXJzdC1jaGlsZCB0aCwudGFibGUtYm9yZGVyZWQgdGJvZHk6Zmlyc3QtY2hpbGQgdHI6Zmlyc3QtY2hpbGQgdGgsLnRhYmxlLWJvcmRlcmVkIHRib2R5OmZpcnN0LWNoaWxkIHRyOmZpcnN0LWNoaWxkIHRke2JvcmRlci10b3A6MDt9XG4iXAotIi50YWJsZS1ib3JkZXJlZCB0aGVhZDpmaXJzdC1jaGlsZCB0cjpmaXJzdC1jaGlsZCB0aDpmaXJzdC1jaGlsZCwudGFibGUtYm9yZGVyZWQgdGJvZHk6Zmlyc3QtY2hpbGQgdHI6Zmlyc3QtY2hpbGQgdGQ6Zmlyc3QtY2hpbGR7LXdlYmtpdC1ib3JkZXItdG9wLWxlZnQtcmFkaXVzOjRweDtib3JkZXItdG9wLWxlZnQtcmFkaXVzOjRweDstbW96LWJvcmRlci1yYWRpdXMtdG9wbGVmdDo0cHg7fVxuIlwKLSIudGFibGUtYm9yZGVyZWQgdGhlYWQ6Zmlyc3QtY2hpbGQgdHI6Zmlyc3QtY2hpbGQgdGg6bGFzdC1jaGlsZCwudGFibGUtYm9yZGVyZWQgdGJvZHk6Zmlyc3QtY2hpbGQgdHI6Zmlyc3QtY2hpbGQgdGQ6bGFzdC1jaGlsZHstd2Via2l0LWJvcmRlci10b3AtcmlnaHQtcmFkaXVzOjRweDtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czo0cHg7LW1vei1ib3JkZXItcmFkaXVzLXRvcHJpZ2h0OjRweDt9XG4iXAotIi50YWJsZS1ib3JkZXJlZCB0aGVhZDpsYXN0LWNoaWxkIHRyOmxhc3QtY2hpbGQgdGg6Zmlyc3QtY2hpbGQsLnRhYmxlLWJvcmRlcmVkIHRib2R5Omxhc3QtY2hpbGQgdHI6bGFzdC1jaGlsZCB0ZDpmaXJzdC1jaGlsZHstd2Via2l0LWJvcmRlci1yYWRpdXM6MCAwIDAgNHB4Oy1tb3otYm9yZGVyLXJhZGl1czowIDAgMCA0cHg7Ym9yZGVyLXJhZGl1czowIDAgMCA0cHg7LXdlYmtpdC1ib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOjRweDtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOjRweDstbW96LWJvcmRlci1yYWRpdXMtYm90dG9tbGVmdDo0cHg7fVxuIlwKLSIudGFibGUtYm9yZGVyZWQgdGhlYWQ6bGFzdC1jaGlsZCB0cjpsYXN0LWNoaWxkIHRoOmxhc3QtY2hpbGQsLnRhYmxlLWJvcmRlcmVkIHRib2R5Omxhc3QtY2hpbGQgdHI6bGFzdC1jaGlsZCB0ZDpsYXN0LWNoaWxkey13ZWJraXQtYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6NHB4O2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOjRweDstbW96LWJvcmRlci1yYWRpdXMtYm90dG9tcmlnaHQ6NHB4O31cbiJcCi0iLnRhYmxlLXN0cmlwZWQgdGJvZHkgdHI6bnRoLWNoaWxkKG9kZCkgdGQsLnRhYmxlLXN0cmlwZWQgdGJvZHkgdHI6bnRoLWNoaWxkKG9kZCkgdGh7YmFja2dyb3VuZC1jb2xvcjojZjlmOWY5O31cbiJcCi0iLnRhYmxlIHRib2R5IHRyOmhvdmVyIHRkLC50YWJsZSB0Ym9keSB0cjpob3ZlciB0aHtiYWNrZ3JvdW5kLWNvbG9yOiNmNWY1ZjU7fVxuIlwKLSJ0YWJsZSAuc3BhbjF7ZmxvYXQ6bm9uZTt3aWR0aDo0NHB4O21hcmdpbi1sZWZ0OjA7fVxuIlwKLSJ0YWJsZSAuc3BhbjJ7ZmxvYXQ6bm9uZTt3aWR0aDoxMjRweDttYXJnaW4tbGVmdDowO31cbiJcCi0idGFibGUgLnNwYW4ze2Zsb2F0Om5vbmU7d2lkdGg6MjA0cHg7bWFyZ2luLWxlZnQ6MDt9XG4iXAotInRhYmxlIC5zcGFuNHtmbG9hdDpub25lO3dpZHRoOjI4NHB4O21hcmdpbi1sZWZ0OjA7fVxuIlwKLSJ0YWJsZSAuc3BhbjV7ZmxvYXQ6bm9uZTt3aWR0aDozNjRweDttYXJnaW4tbGVmdDowO31cbiJcCi0idGFibGUgLnNwYW42e2Zsb2F0Om5vbmU7d2lkdGg6NDQ0cHg7bWFyZ2luLWxlZnQ6MDt9XG4iXAotInRhYmxlIC5zcGFuN3tmbG9hdDpub25lO3dpZHRoOjUyNHB4O21hcmdpbi1sZWZ0OjA7fVxuIlwKLSJ0YWJsZSAuc3Bhbjh7ZmxvYXQ6bm9uZTt3aWR0aDo2MDRweDttYXJnaW4tbGVmdDowO31cbiJcCi0idGFibGUgLnNwYW45e2Zsb2F0Om5vbmU7d2lkdGg6Njg0cHg7bWFyZ2luLWxlZnQ6MDt9XG4iXAotInRhYmxlIC5zcGFuMTB7ZmxvYXQ6bm9uZTt3aWR0aDo3NjRweDttYXJnaW4tbGVmdDowO31cbiJcCi0idGFibGUgLnNwYW4xMXtmbG9hdDpub25lO3dpZHRoOjg0NHB4O21hcmdpbi1sZWZ0OjA7fVxuIlwKLSJ0YWJsZSAuc3BhbjEye2Zsb2F0Om5vbmU7d2lkdGg6OTI0cHg7bWFyZ2luLWxlZnQ6MDt9XG4iXAotInRhYmxlIC5zcGFuMTN7ZmxvYXQ6bm9uZTt3aWR0aDoxMDA0cHg7bWFyZ2luLWxlZnQ6MDt9XG4iXAotInRhYmxlIC5zcGFuMTR7ZmxvYXQ6bm9uZTt3aWR0aDoxMDg0cHg7bWFyZ2luLWxlZnQ6MDt9XG4iXAotInRhYmxlIC5zcGFuMTV7ZmxvYXQ6bm9uZTt3aWR0aDoxMTY0cHg7bWFyZ2luLWxlZnQ6MDt9XG4iXAotInRhYmxlIC5zcGFuMTZ7ZmxvYXQ6bm9uZTt3aWR0aDoxMjQ0cHg7bWFyZ2luLWxlZnQ6MDt9XG4iXAotInRhYmxlIC5zcGFuMTd7ZmxvYXQ6bm9uZTt3aWR0aDoxMzI0cHg7bWFyZ2luLWxlZnQ6MDt9XG4iXAotInRhYmxlIC5zcGFuMTh7ZmxvYXQ6bm9uZTt3aWR0aDoxNDA0cHg7bWFyZ2luLWxlZnQ6MDt9XG4iXAotInRhYmxlIC5zcGFuMTl7ZmxvYXQ6bm9uZTt3aWR0aDoxNDg0cHg7bWFyZ2luLWxlZnQ6MDt9XG4iXAotInRhYmxlIC5zcGFuMjB7ZmxvYXQ6bm9uZTt3aWR0aDoxNTY0cHg7bWFyZ2luLWxlZnQ6MDt9XG4iXAotInRhYmxlIC5zcGFuMjF7ZmxvYXQ6bm9uZTt3aWR0aDoxNjQ0cHg7bWFyZ2luLWxlZnQ6MDt9XG4iXAotInRhYmxlIC5zcGFuMjJ7ZmxvYXQ6bm9uZTt3aWR0aDoxNzI0cHg7bWFyZ2luLWxlZnQ6MDt9XG4iXAotInRhYmxlIC5zcGFuMjN7ZmxvYXQ6bm9uZTt3aWR0aDoxODA0cHg7bWFyZ2luLWxlZnQ6MDt9XG4iXAotInRhYmxlIC5zcGFuMjR7ZmxvYXQ6bm9uZTt3aWR0aDoxODg0cHg7bWFyZ2luLWxlZnQ6MDt9IgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2phdmFfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2phdmFfZ2VuZXJhdG9yLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWI0NzU0Li4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9qYXZhX2dlbmVyYXRvci5jYworKysgL2Rldi9udWxsCkBAIC0xLDQ4MjMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8Y2Fzc2VydD4KLSNpbmNsdWRlIDxjdGltZT4KLQotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPGZzdHJlYW0+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8dmVjdG9yPgotI2luY2x1ZGUgPGNjdHlwZT4KLQotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3RkZXhjZXB0PgotCi0jaW5jbHVkZSAicGxhdGZvcm0uaCIKLSNpbmNsdWRlICJ0X29vcF9nZW5lcmF0b3IuaCIKLQotdXNpbmcgc3RkOjptYXA7Ci11c2luZyBzdGQ6Om9mc3RyZWFtOwotdXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwotdXNpbmcgc3RkOjpzdHJpbmc7Ci11c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKLXVzaW5nIHN0ZDo6dmVjdG9yOwotCi1zdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAgLy8gYXZvaWQgb3N0cmVhbSA8PCBzdGQ6OmVuZGwgZmx1c2hlcwotCi0vKioKLSAqIEphdmEgY29kZSBnZW5lcmF0b3IuCi0gKgotICovCi1jbGFzcyB0X2phdmFfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7Ci1wdWJsaWM6Ci0gIHRfamF2YV9nZW5lcmF0b3IoCi0gICAgICAgICAgICAgICAgICAgdF9wcm9ncmFtKiBwcm9ncmFtLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQotICA6IHRfb29wX2dlbmVyYXRvcihwcm9ncmFtKQotICB7Ci0gICAgKHZvaWQpIG9wdGlvbl9zdHJpbmc7Ci0gICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJiZWFucyIpOwotICAgIGJlYW5fc3R5bGVfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotCi0JaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoImFuZHJvaWQiKTsKLSAgICBhbmRyb2lkX3N0eWxlXyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJwcml2YXRlLW1lbWJlcnMiKTsKLSAgICBwcml2YXRlX21lbWJlcnNfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotCi0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoIm5vY2FtZWwiKTsKLSAgICBub2NhbWVsX3N0eWxlXyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJmdWxsY2FtZWwiKTsKLSAgICBmdWxsY2FtZWxfc3R5bGVfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotCi0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoImFuZHJvaWRfbGVnYWN5Iik7Ci0gICAgYW5kcm9pZF9sZWdhY3lfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotCi0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoInNvcnRlZF9jb250YWluZXJzIik7Ci0gICAgc29ydGVkX2NvbnRhaW5lcnNfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotCi0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoImphdmE1Iik7Ci0gICAgamF2YTVfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotICAgIGlmIChqYXZhNV8pIHsKLSAgICAgIGFuZHJvaWRfbGVnYWN5XyA9IHRydWU7Ci0gICAgfQotCi0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoInJldXNlLW9iamVjdHMiKTsKLSAgICByZXVzZV9vYmplY3RzXyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLQotICAgIG91dF9kaXJfYmFzZV8gPSAoYmVhbl9zdHlsZV8gPyAiZ2VuLWphdmFiZWFuIiA6ICJnZW4tamF2YSIpOwotICB9Ci0KLSAgLyoqCi0gICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKLSAgICovCi0KLSAgdm9pZCBpbml0X2dlbmVyYXRvcigpOwotICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOwotCi0gIHZvaWQgZ2VuZXJhdGVfY29uc3RzKHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpOwotCi0gIC8qKgotICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZiAodF90eXBlZGVmKiAgdHR5cGVkZWYpOwotICB2b2lkIGdlbmVyYXRlX2VudW0gICAgKHRfZW51bSogICAgIHRlbnVtKTsKLSAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QgICh0X3N0cnVjdCogICB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV91bmlvbiAgICh0X3N0cnVjdCogICB0dW5pb24pOwotICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiAgIHR4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZSAodF9zZXJ2aWNlKiAgdHNlcnZpY2UpOwotCi0gIHZvaWQgcHJpbnRfY29uc3RfdmFsdWUoc3RkOjpvZnN0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlLCBib29sIGluX3N0YXRpYywgYm9vbCBkZWZ2YWw9ZmFsc2UpOwotICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKLQotICAvKioKLSAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9kZWZpbml0aW9uKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfeGNlcHRpb249ZmFsc2UsIGJvb2wgaW5fY2xhc3M9ZmFsc2UsIGJvb2wgaXNfcmVzdWx0PWZhbHNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9wYXJjZWxhYmxlKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X2VxdWFsaXR5KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X2NvbXBhcmVfdG8oc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfcmVhZGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfdmFsaWRhdG9yKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X3Jlc3VsdF93cml0ZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3Rfd3JpdGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X3Rvc3RyaW5nKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X2NsZWFyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X3dyaXRlX29iamVjdChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9yZWFkX29iamVjdChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9qYXZhX21ldGFfZGF0YV9tYXAoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlKTsKLSAgc3RkOjpzdHJpbmcgZ2V0X2phdmFfdHlwZV9zdHJpbmcodF90eXBlKiB0eXBlKTsKLSAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9maWVsZF9ieV9pZChvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfcmVmbGVjdGlvbl9zZXR0ZXJzKHN0ZDo6b3N0cmluZ3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUsIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUsIHN0ZDo6c3RyaW5nIGNhcF9uYW1lKTsKLSAgdm9pZCBnZW5lcmF0ZV9yZWZsZWN0aW9uX2dldHRlcnMoc3RkOjpvc3RyaW5nc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSwgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSwgc3RkOjpzdHJpbmcgY2FwX25hbWUpOwotICB2b2lkIGdlbmVyYXRlX2dlbmVyaWNfZmllbGRfZ2V0dGVyc19zZXR0ZXJzKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2dlbmVyaWNfaXNzZXRfbWV0aG9kKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfYmVhbl9ib2lsZXJwbGF0ZShzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLQotICB2b2lkIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLSAgc3RkOjpzdHJpbmcgYXNfY2FtZWxfY2FzZShzdGQ6OnN0cmluZyBuYW1lLCBib29sIHVjZmlyc3Q9dHJ1ZSk7Ci0gIHN0ZDo6c3RyaW5nIGdldF9ycGNfbWV0aG9kX25hbWUoc3RkOjpzdHJpbmcgbmFtZSk7Ci0gIHN0ZDo6c3RyaW5nIGdldF9jYXBfbmFtZShzdGQ6OnN0cmluZyBuYW1lKTsKLSAgc3RkOjpzdHJpbmcgZ2VuZXJhdGVfaXNzZXRfY2hlY2sodF9maWVsZCogZmllbGQpOwotICBzdGQ6OnN0cmluZyBnZW5lcmF0ZV9pc3NldF9jaGVjayhzdGQ6OnN0cmluZyBmaWVsZCk7Ci0gIHZvaWQgZ2VuZXJhdGVfaXNzZXRfc2V0KG9mc3RyZWFtJiBvdXQsIHRfZmllbGQqIGZpZWxkLCBzdGQ6OnN0cmluZyBwcmVmaXgpOwotICBzdGQ6OnN0cmluZyBpc3NldF9maWVsZF9pZCh0X2ZpZWxkKiBmaWVsZCk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9hc3luY19pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzICAgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50ICAgICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2FzeW5jX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlciAgICAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9hc3luY19zZXJ2ZXIgICAgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24gICh0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfYXN5bmNfZnVuY3Rpb24gICh0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotCi0KLSAgdm9pZCBnZW5lcmF0ZV9qYXZhX3VuaW9uKHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV91bmlvbl9jb25zdHJ1Y3RvcihvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfdW5pb25fZ2V0dGVyc19hbmRfc2V0dGVycyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfdW5pb25faXNfc2V0X21ldGhvZHMob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3VuaW9uX2Fic3RyYWN0X21ldGhvZHMob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2NoZWNrX3R5cGUob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3N0YW5kYXJkX3NjaGVtZV9yZWFkX3ZhbHVlKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9zdGFuZGFyZF9zY2hlbWVfd3JpdGVfdmFsdWUob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3R1cGxlX3NjaGVtZV9yZWFkX3ZhbHVlKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV90dXBsZV9zY2hlbWVfd3JpdGVfdmFsdWUob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2dldF9maWVsZF9kZXNjKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9nZXRfc3RydWN0X2Rlc2Mob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2dldF9maWVsZF9uYW1lKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLQotICB2b2lkIGdlbmVyYXRlX3VuaW9uX2NvbXBhcmlzb25zKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV91bmlvbl9oYXNoY29kZShvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zY2hlbWVfbWFwKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9zdGFuZGFyZF93cml0ZXIob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfcmVzdWx0KTsKLSAgdm9pZCBnZW5lcmF0ZV9zdGFuZGFyZF9yZWFkZXIob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X3N0YW5kYXJkX3NjaGVtZShvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19yZXN1bHQpOwotCi0gIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfdHVwbGVfc2NoZW1lKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF90dXBsZV9yZWFkZXIob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X3R1cGxlX3dyaXRlcihvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9qYXZheF9nZW5lcmF0ZWRfYW5ub3RhdGlvbihvZnN0cmVhbSYgb3V0KTsKLSAgLyoqCi0gICAqIFNlcmlhbGl6YXRpb24gY29uc3RydWN0cwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkICAgICAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogICAgdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNfbWV0YWRhdGEgPSB0cnVlKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdCAgICAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqICAgdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogICAgIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNfbWV0YWRhdGEgPSB0cnVlKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50ICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqICAgICAgdHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG9iaj0iIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzX21ldGFkYXRhID0gdHJ1ZSk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudCAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiAgICAgIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBvYmo9IiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc19tZXRhZGF0YSA9IHRydWUpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50IChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqICAgICB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG9iaj0iIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzX21ldGFkYXRhID0gdHJ1ZSk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQgICAgICAgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqICAgIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzX21ldGFkYXRhID0gdHJ1ZSk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0ICAgICAgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiAgIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lciAgICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqICAgICB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzX21ldGFkYXRhID0gdHJ1ZSk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiAgICAgIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNfbWV0YWRhdGEgPSB0cnVlKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudCAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqICAgICAgdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGl0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc19tZXRhZGF0YSA9IHRydWUpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudCAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqICAgICB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGl0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc19tZXRhZGF0YSA9IHRydWUpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVlcF9jb3B5X2NvbnRhaW5lcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIHNvdXJjZV9uYW1lX3AxLCBzdGQ6OnN0cmluZyBzb3VyY2VfbmFtZV9wMiwgc3RkOjpzdHJpbmcgcmVzdWx0X25hbWUsIHRfdHlwZSogdHlwZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfZGVlcF9jb3B5X25vbl9jb250YWluZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBzb3VyY2VfbmFtZSwgc3RkOjpzdHJpbmcgZGVzdF9uYW1lLCB0X3R5cGUqIHR5cGUpOwotCi0gIGVudW0gaXNzZXRfdHlwZSB7IElTU0VUX05PTkUsIElTU0VUX1BSSU1JVElWRSwgSVNTRVRfQklUU0VUIH07Ci0gIGlzc2V0X3R5cGUgbmVlZHNfaXNzZXQodF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nICpvdXRQcmltaXRpdmVUeXBlID0gTlVMTCk7Ci0KLSAgLyoqCi0gICAqIEhlbHBlciByZW5kZXJpbmcgZnVuY3Rpb25zCi0gICAqLwotCi0gIHN0ZDo6c3RyaW5nIGphdmFfcGFja2FnZSgpOwotICBzdGQ6OnN0cmluZyBqYXZhX3R5cGVfaW1wb3J0cygpOwotICBzdGQ6OnN0cmluZyBqYXZhX3N1cHByZXNzaW9ucygpOwotICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBpbl9jb250YWluZXI9ZmFsc2UsIGJvb2wgaW5faW5pdD1mYWxzZSwgYm9vbCBza2lwX2dlbmVyaWM9ZmFsc2UsIGJvb2wgZm9yY2VfbmFtZXNwYWNlID0gZmFsc2UpOwotICBzdGQ6OnN0cmluZyBiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZSogdGJhc2UsIGJvb2wgaW5fY29udGFpbmVyPWZhbHNlKTsKLSAgc3RkOjpzdHJpbmcgZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdD1mYWxzZSwgYm9vbCBjb21tZW50PWZhbHNlKTsKLSAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLSAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlX2FzeW5jKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgYm9vbCB1c2VfYmFzZV9tZXRob2QgPSBmYWxzZSwgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLSAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpbmNsdWRlX3R5cGVzID0gdHJ1ZSk7Ci0gIHN0ZDo6c3RyaW5nIGFzeW5jX2Z1bmN0aW9uX2NhbGxfYXJnbGlzdCh0X2Z1bmN0aW9uKiB0ZnVuYywgYm9vbCB1c2VfYmFzZV9tZXRob2QgPSB0cnVlLCBib29sIGluY2x1ZGVfdHlwZXMgPSB0cnVlKTsKLSAgc3RkOjpzdHJpbmcgYXN5bmNfYXJndW1lbnRfbGlzdCh0X2Z1bmN0aW9uKiB0ZnVuY3QsIHRfc3RydWN0KiB0c3RydWN0LCB0X3R5cGUqIHR0eXBlLCBib29sIGluY2x1ZGVfdHlwZXM9ZmFsc2UpOwotICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3RydWN0X2Rlc2Mob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2ZpZWxkX2Rlc2NzKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9maWVsZF9uYW1lX2NvbnN0YW50cyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0KLSAgc3RkOjpzdHJpbmcgbWFrZV92YWxpZF9qYXZhX2ZpbGVuYW1lKCBzdGQ6OnN0cmluZyBjb25zdCAmIGZyb21OYW1lKTsKLSAgc3RkOjpzdHJpbmcgbWFrZV92YWxpZF9qYXZhX2lkZW50aWZpZXIoIHN0ZDo6c3RyaW5nIGNvbnN0ICYgZnJvbU5hbWUpOwotICAKLSAgYm9vbCB0eXBlX2Nhbl9iZV9udWxsKHRfdHlwZSogdHR5cGUpIHsKLSAgICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOwotCi0gICAgcmV0dXJuCi0gICAgICB0dHlwZS0+aXNfY29udGFpbmVyKCkgfHwKLSAgICAgIHR0eXBlLT5pc19zdHJ1Y3QoKSB8fAotICAgICAgdHR5cGUtPmlzX3hjZXB0aW9uKCkgfHwKLSAgICAgIHR0eXBlLT5pc19zdHJpbmcoKSB8fAotICAgICAgdHR5cGUtPmlzX2VudW0oKTsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIGNvbnN0YW50X25hbWUoc3RkOjpzdHJpbmcgbmFtZSk7Ci0KLSBwcml2YXRlOgotCi0gIC8qKgotICAgKiBGaWxlIHN0cmVhbXMKLSAgICovCi0KLSAgc3RkOjpzdHJpbmcgcGFja2FnZV9uYW1lXzsKLSAgc3RkOjpvZnN0cmVhbSBmX3NlcnZpY2VfOwotICBzdGQ6OnN0cmluZyBwYWNrYWdlX2Rpcl87Ci0KLSAgYm9vbCBiZWFuX3N0eWxlXzsKLSAgYm9vbCBhbmRyb2lkX3N0eWxlXzsKLSAgYm9vbCBwcml2YXRlX21lbWJlcnNfOwotICBib29sIG5vY2FtZWxfc3R5bGVfOwotICBib29sIGZ1bGxjYW1lbF9zdHlsZV87Ci0gIGJvb2wgYW5kcm9pZF9sZWdhY3lfOwotICBib29sIGphdmE1XzsKLSAgYm9vbCBzb3J0ZWRfY29udGFpbmVyc187Ci0gIGJvb2wgcmV1c2Vfb2JqZWN0c187Ci19OwotCi0KLS8qKgotICogUHJlcGFyZXMgZm9yIGZpbGUgZ2VuZXJhdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBuZWNlc3NhcnkgZmlsZSBvdXRwdXQKLSAqIHN0cmVhbXMuCi0gKgotICogQHBhcmFtIHRwcm9ncmFtIFRoZSBwcm9ncmFtIHRvIGdlbmVyYXRlCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQotICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOwotICBwYWNrYWdlX25hbWVfID0gcHJvZ3JhbV8tPmdldF9uYW1lc3BhY2UoImphdmEiKTsKLQotICBzdHJpbmcgZGlyID0gcGFja2FnZV9uYW1lXzsKLSAgc3RyaW5nIHN1YmRpciA9IGdldF9vdXRfZGlyKCk7Ci0gIHN0cmluZzo6c2l6ZV90eXBlIGxvYzsKLSAgd2hpbGUgKChsb2MgPSBkaXIuZmluZCgiLiIpKSAhPSBzdHJpbmc6Om5wb3MpIHsKLSAgICBzdWJkaXIgPSBzdWJkaXIgKyAiLyIgKyBkaXIuc3Vic3RyKDAsIGxvYyk7Ci0gICAgTUtESVIoc3ViZGlyLmNfc3RyKCkpOwotICAgIGRpciA9IGRpci5zdWJzdHIobG9jKzEpOwotICB9Ci0gIGlmIChkaXIuc2l6ZSgpID4gMCkgewotICAgIHN1YmRpciA9IHN1YmRpciArICIvIiArIGRpcjsKLSAgICBNS0RJUihzdWJkaXIuY19zdHIoKSk7Ci0gIH0KLQotICBwYWNrYWdlX2Rpcl8gPSBzdWJkaXI7Ci19Ci0KLS8qKgotICogUGFja2FnZXMgdGhlIGdlbmVyYXRlZCBmaWxlCi0gKgotICogQHJldHVybiBTdHJpbmcgb2YgdGhlIHBhY2thZ2UsIGkuZS4gInBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnRkZW1vOyIKLSAqLwotc3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OmphdmFfcGFja2FnZSgpIHsKLSAgaWYgKCFwYWNrYWdlX25hbWVfLmVtcHR5KCkpIHsKLSAgICByZXR1cm4gc3RyaW5nKCJwYWNrYWdlICIpICsgcGFja2FnZV9uYW1lXyArICI7XG5cbiI7Ci0gIH0KLSAgcmV0dXJuICIiOwotfQotCi0vKioKLSAqIFByaW50cyBzdGFuZGFyZCBqYXZhIGltcG9ydHMKLSAqCi0gKiBAcmV0dXJuIExpc3Qgb2YgaW1wb3J0cyBmb3IgSmF2YSB0eXBlcyB0aGF0IGFyZSB1c2VkIGluIGhlcmUKLSAqLwotc3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OmphdmFfdHlwZV9pbXBvcnRzKCkgewotICBzdHJpbmcgaGFzaF9idWlsZGVyOwotICBzdHJpbmcgdHJlZV9zZXRfYW5kX21hcDsKLSAgaWYgKHNvcnRlZF9jb250YWluZXJzXykgewotICAgIHRyZWVfc2V0X2FuZF9tYXAgPSBzdHJpbmcoKSArIAotICAgICAgImltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDtcbiIgKwotICAgICAgImltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDtcbiI7Ci0gIH0KLQotICByZXR1cm4KLSAgICBzdHJpbmcoKSArCi0gICAgaGFzaF9idWlsZGVyICsKLSAgICAiaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZS5JU2NoZW1lO1xuIiArCi0gICAgImltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zY2hlbWUuU2NoZW1lRmFjdG9yeTtcbiIgKwotICAgICJpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2NoZW1lLlN0YW5kYXJkU2NoZW1lO1xuXG4iICsKLSAgICAiaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZS5UdXBsZVNjaGVtZTtcbiIgKwotICAgICJpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR1cGxlUHJvdG9jb2w7XG4iICsKLSAgICAiaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbEV4Y2VwdGlvbjtcbiIgKwotICAgICJpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuRW5jb2RpbmdVdGlscztcbiIgKwotICAgICJpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjtcbiIgKwotICAgICJpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuQXN5bmNNZXRob2RDYWxsYmFjaztcbiIrCi0gICAgImltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXIuQWJzdHJhY3ROb25ibG9ja2luZ1NlcnZlci4qO1xuIisKLSAgICAiaW1wb3J0IGphdmEudXRpbC5MaXN0O1xuIiArCi0gICAgImltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0O1xuIiArCi0gICAgImltcG9ydCBqYXZhLnV0aWwuTWFwO1xuIiArCi0gICAgImltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDtcbiIgKwotICAgICJpbXBvcnQgamF2YS51dGlsLkVudW1NYXA7XG4iICsKLSAgICAiaW1wb3J0IGphdmEudXRpbC5TZXQ7XG4iICsKLSAgICAiaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0O1xuIiArCi0gICAgImltcG9ydCBqYXZhLnV0aWwuRW51bVNldDtcbiIgKwotICAgIHRyZWVfc2V0X2FuZF9tYXAgKyAKLSAgICAiaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9ucztcbiIgKwotICAgICJpbXBvcnQgamF2YS51dGlsLkJpdFNldDtcbiIgKwotICAgICJpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjtcbiIKLSAgICAiaW1wb3J0IGphdmEudXRpbC5BcnJheXM7XG4iICsKLSAgICAiaW1wb3J0IGphdmF4LmFubm90YXRpb24uR2VuZXJhdGVkO1xuIiArCi0gICAgImltcG9ydCBvcmcuc2xmNGouTG9nZ2VyO1xuIiArCi0gICAgImltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTtcblxuIjsKLX0KLQotc3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OmphdmFfc3VwcHJlc3Npb25zKCkgewotICByZXR1cm4gIkBTdXBwcmVzc1dhcm5pbmdzKHtcImNhc3RcIiwgXCJyYXd0eXBlc1wiLCBcInNlcmlhbFwiLCBcInVuY2hlY2tlZFwifSlcbiI7Ci19Ci0KLS8qKgotICogTm90aGluZyBpbiBKYXZhCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkge30KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0eXBlZGVmLiBUaGlzIGlzIG5vdCBkb25lIGluIEphdmEsIHNpbmNlIGl0IGRvZXMKLSAqIG5vdCBzdXBwb3J0IGFyYml0cmFyeSBuYW1lIHJlcGxhY2VtZW50cywgYW5kIGl0J2QgYmUgYSB3YWNreSB3YXN0ZQotICogb2Ygb3ZlcmhlYWQgdG8gbWFrZSB3cmFwcGVyIGNsYXNzZXMuCi0gKgotICogQHBhcmFtIHR0eXBlZGVmIFRoZSB0eXBlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKLSAgKHZvaWQpIHR0eXBlZGVmOwotfQotCi0vKioKLSAqIEVudW1zIGFyZSBhIGNsYXNzIHdpdGggYSBzZXQgb2Ygc3RhdGljIGNvbnN0YW50cy4KLSAqCi0gKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGZpbGUKLSAgc3RyaW5nIGZfZW51bV9uYW1lID0gcGFja2FnZV9kaXJfKyIvIittYWtlX3ZhbGlkX2phdmFfZmlsZW5hbWUodGVudW0tPmdldF9uYW1lKCkpKyIuamF2YSI7Ci0gIG9mc3RyZWFtIGZfZW51bTsKLSAgZl9lbnVtLm9wZW4oZl9lbnVtX25hbWUuY19zdHIoKSk7Ci0KLSAgLy8gQ29tbWVudCBhbmQgcGFja2FnZSBpdAotICBmX2VudW0gPDwKLSAgICBhdXRvZ2VuX2NvbW1lbnQoKSA8PAotICAgIGphdmFfcGFja2FnZSgpIDw8IGVuZGw7Ci0KLSAgLy8gQWRkIGphdmEgaW1wb3J0cwotICBmX2VudW0gPDwgc3RyaW5nKCkgKwotICAgICJpbXBvcnQgamF2YS51dGlsLk1hcDtcbiIgKyAKLSAgICAiaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwO1xuIiArCi0gICAgImltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URW51bTsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9qYXZhX2RvYyhmX2VudW0sIHRlbnVtKTsKLSAgaW5kZW50KGZfZW51bSkgPDwKLSAgICAicHVibGljIGVudW0gIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiIGltcGxlbWVudHMgb3JnLmFwYWNoZS50aHJpZnQuVEVudW0gIjsKLSAgc2NvcGVfdXAoZl9lbnVtKTsKLQotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgewotICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0KLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZfZW51bSA8PCAiLCIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBnZW5lcmF0ZV9qYXZhX2RvYyhmX2VudW0sICpjX2l0ZXIpOwotICAgIGluZGVudChmX2VudW0pIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCIgPDwgdmFsdWUgPDwgIikiOwotICB9Ci0gIGZfZW51bSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIC8vIEZpZWxkIGZvciB0aHJpZnRDb2RlCi0gIGluZGVudChmX2VudW0pIDw8ICJwcml2YXRlIGZpbmFsIGludCB2YWx1ZTsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQoZl9lbnVtKSA8PCAicHJpdmF0ZSAiIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICIoaW50IHZhbHVlKSB7IiA8PCBlbmRsOwotICBpbmRlbnQoZl9lbnVtKSA8PCAiICB0aGlzLnZhbHVlID0gdmFsdWU7IiA8PGVuZGw7Ci0gIGluZGVudChmX2VudW0pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50KGZfZW51bSkgPDwgIi8qKiIgPDwgZW5kbDsKLSAgaW5kZW50KGZfZW51bSkgPDwgIiAqIEdldCB0aGUgaW50ZWdlciB2YWx1ZSBvZiB0aGlzIGVudW0gdmFsdWUsIGFzIGRlZmluZWQgaW4gdGhlIFRocmlmdCBJREwuIiA8PCBlbmRsOwotICBpbmRlbnQoZl9lbnVtKSA8PCAiICovIiA8PCBlbmRsOwotICBpbmRlbnQoZl9lbnVtKSA8PCAicHVibGljIGludCBnZXRWYWx1ZSgpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChmX2VudW0pIDw8ICIgIHJldHVybiB2YWx1ZTsiIDw8ZW5kbDsKLSAgaW5kZW50KGZfZW51bSkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQoZl9lbnVtKSA8PCAiLyoqIiA8PCBlbmRsOwotICBpbmRlbnQoZl9lbnVtKSA8PCAiICogRmluZCBhIHRoZSBlbnVtIHR5cGUgYnkgaXRzIGludGVnZXIgdmFsdWUsIGFzIGRlZmluZWQgaW4gdGhlIFRocmlmdCBJREwuIiA8PCBlbmRsOwotICBpbmRlbnQoZl9lbnVtKSA8PCAiICogQHJldHVybiBudWxsIGlmIHRoZSB2YWx1ZSBpcyBub3QgZm91bmQuIiA8PCBlbmRsOwotICBpbmRlbnQoZl9lbnVtKSA8PCAiICovIiA8PCBlbmRsOwotICBpbmRlbnQoZl9lbnVtKSA8PCAicHVibGljIHN0YXRpYyAiKyB0ZW51bS0+Z2V0X25hbWUoKSArICIgZmluZEJ5VmFsdWUoaW50IHZhbHVlKSB7ICIgPDwgZW5kbDsKLQotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQoZl9lbnVtKSA8PCAic3dpdGNoICh2YWx1ZSkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOwotICAgIGluZGVudChmX2VudW0pIDw8ICJjYXNlICIgPDwgdmFsdWUgPDwgIjoiIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfZW51bSkgPDwgIiAgcmV0dXJuICIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50KGZfZW51bSkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOwotICBpbmRlbnQoZl9lbnVtKSA8PCAiICByZXR1cm4gbnVsbDsiIDw8IGVuZGw7ICAKLQotICBpbmRlbnRfZG93bigpOwotCi0gIGluZGVudChmX2VudW0pIDw8ICJ9IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0KLSAgaW5kZW50KGZfZW51bSkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgc2NvcGVfZG93bihmX2VudW0pOwotCi0gIGZfZW51bS5jbG9zZSgpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIGNsYXNzIHRoYXQgaG9sZHMgYWxsIHRoZSBjb25zdGFudHMuCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3RzKHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpIHsKLSAgaWYgKGNvbnN0cy5lbXB0eSgpKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgc3RyaW5nIGZfY29uc3RzX25hbWUgPSBwYWNrYWdlX2Rpcl8rICcvJyArIG1ha2VfdmFsaWRfamF2YV9maWxlbmFtZShwcm9ncmFtX25hbWVfKSArICJDb25zdGFudHMuamF2YSI7Ci0gIG9mc3RyZWFtIGZfY29uc3RzOwotICBmX2NvbnN0cy5vcGVuKGZfY29uc3RzX25hbWUuY19zdHIoKSk7Ci0KLSAgLy8gUHJpbnQgaGVhZGVyCi0gIGZfY29uc3RzIDw8Ci0gICAgYXV0b2dlbl9jb21tZW50KCkgPDwKLSAgICBqYXZhX3BhY2thZ2UoKSA8PAotICAgIGphdmFfdHlwZV9pbXBvcnRzKCkgPDwKLSAgICBqYXZhX3N1cHByZXNzaW9ucygpOwotCi0gIGZfY29uc3RzIDw8Ci0gICAgInB1YmxpYyBjbGFzcyAiIDw8IG1ha2VfdmFsaWRfamF2YV9pZGVudGlmaWVyKHByb2dyYW1fbmFtZV8pIDw8ICJDb25zdGFudHMgeyIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0gIGluZGVudF91cCgpOwotICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7Ci0gIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgZ2VuZXJhdGVfamF2YV9kb2MoZl9jb25zdHMsICgqY19pdGVyKSk7Ci0gICAgcHJpbnRfY29uc3RfdmFsdWUoZl9jb25zdHMsCi0gICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3R5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF92YWx1ZSgpLAotICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKLSAgfQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQoZl9jb25zdHMpIDw8ICJ9IiA8PCBlbmRsOwotICBmX2NvbnN0cy5jbG9zZSgpOwotfQotCi0KLS8qKgotICogUHJpbnRzIHRoZSB2YWx1ZSBvZiBhIGNvbnN0YW50IHdpdGggdGhlIGdpdmVuIHR5cGUuIE5vdGUgdGhhdCB0eXBlIGNoZWNraW5nCi0gKiBpcyBOT1QgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24gYXMgaXQgaXMgYWx3YXlzIHJ1biBiZWZvcmVoYW5kIHVzaW5nIHRoZQotICogdmFsaWRhdGVfdHlwZXMgbWV0aG9kIGluIG1haW4uY2MKLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpwcmludF9jb25zdF92YWx1ZShzdGQ6Om9mc3RyZWFtJiBvdXQsIHN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlLCBib29sIGluX3N0YXRpYywgYm9vbCBkZWZ2YWwpIHsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0KLSAgaW5kZW50KG91dCk7Ci0gIGlmICghZGVmdmFsKSB7Ci0gICAgb3V0IDw8Ci0gICAgICAoaW5fc3RhdGljID8gIiIgOiAicHVibGljIHN0YXRpYyBmaW5hbCAiKSA8PAotICAgICAgdHlwZV9uYW1lKHR5cGUpIDw8ICIgIjsKLSAgfQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICBzdHJpbmcgdjIgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCB0eXBlLCB2YWx1ZSk7Ci0gICAgb3V0IDw8IG5hbWUgPDwgIiA9ICIgPDwgdjIgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBvdXQgPDwgbmFtZSA8PCAiID0gIiA8PCByZW5kZXJfY29uc3RfdmFsdWUob3V0LCB0eXBlLCB2YWx1ZSkgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgb3V0IDw8IG5hbWUgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKLSAgICBpZiAoIWluX3N0YXRpYykgewotICAgICAgaW5kZW50KG91dCkgPDwgInN0YXRpYyB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgfQotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOwotICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKLSAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7Ci0gICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7Ci0gICAgICB9Ci0gICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiLiI7Ci0gICAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSA9IGdldF9jYXBfbmFtZSh2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpOwotICAgICAgb3V0IDw8ICJzZXQiIDw8IGNhcF9uYW1lIDw8ICIoIiA8PCB2YWwgPDwgIik7IiA8PCBlbmRsOwotICAgIH0KLSAgICBpZiAoIWluX3N0YXRpYykgewotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0KLSAgICBvdXQgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIG91dCA8PCBuYW1lIDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8ICIoKTsiIDw8IGVuZGw7Ci0gICAgaWYgKCFpbl9zdGF0aWMpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJzdGF0aWMgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgIH0KLSAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOwotICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgc3RyaW5nIGtleSA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIGt0eXBlLCB2X2l0ZXItPmZpcnN0KTsKLSAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCB2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiLnB1dCgiIDw8IGtleSA8PCAiLCAiIDw8IHZhbCA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGlmICghaW5fc3RhdGljKSB7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkgewotICAgIG91dCA8PCBuYW1lIDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8ICIoKTsiIDw8IGVuZGw7Ci0gICAgaWYgKCFpbl9zdGF0aWMpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJzdGF0aWMgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgIH0KLSAgICB0X3R5cGUqIGV0eXBlOwotICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB9Ci0gICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7Ci0gICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgZXR5cGUsICp2X2l0ZXIpOwotICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiLmFkZCgiIDw8IHZhbCA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGlmICghaW5fc3RhdGljKSB7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgdHlwZSAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLSAgfQotfQotCi1zdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKG9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSByZW5kZXI7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICByZW5kZXIgPDwgJyInIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgcmVuZGVyIDw8ICgodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgcmVuZGVyIDw8ICIoYnl0ZSkiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICByZW5kZXIgPDwgIihzaG9ydCkiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiTCI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7Ci0gICAgICAgICAgcmVuZGVyIDw8ICIoZG91YmxlKSIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmVuZGVyIDw8IHR5cGUtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lc3BhY2UoImphdmEiKSA8PCAiLiIgPDwgdmFsdWUtPmdldF9pZGVudGlmaWVyX3dpdGhfcGFyZW50KCk7Ci0gIH0gZWxzZSB7Ci0gICAgc3RyaW5nIHQgPSB0bXAoInRtcCIpOwotICAgIHByaW50X2NvbnN0X3ZhbHVlKG91dCwgdCwgdHlwZSwgdmFsdWUsIHRydWUpOwotICAgIHJlbmRlciA8PCB0OwotICB9Ci0KLSAgcmV0dXJuIHJlbmRlci5zdHIoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZGF0YSB0eXBlLiBUaGlzIHdpbGwgYmUgYSBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZSAKLSAqIGltcGxlbWVudG9yLgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICBpZiAodHN0cnVjdC0+aXNfdW5pb24oKSkgewotICAgIGdlbmVyYXRlX2phdmFfdW5pb24odHN0cnVjdCk7Ci0gIH0gZWxzZSB7Ci0gICAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3QodHN0cnVjdCwgZmFsc2UpOwotICB9Ci19Ci0KLS8qKgotICogRXhjZXB0aW9ucyBhcmUgc3RydWN0cywgYnV0IHRoZXkgaW5oZXJpdCBmcm9tIEV4Y2VwdGlvbgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKLSAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3QodHhjZXB0aW9uLCB0cnVlKTsKLX0KLQotCi0vKioKLSAqIEphdmEgc3RydWN0IGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGZpbGUKLSAgc3RyaW5nIGZfc3RydWN0X25hbWUgPSBwYWNrYWdlX2Rpcl8rIi8iK21ha2VfdmFsaWRfamF2YV9maWxlbmFtZSh0c3RydWN0LT5nZXRfbmFtZSgpKSsiLmphdmEiOwotICBvZnN0cmVhbSBmX3N0cnVjdDsKLSAgZl9zdHJ1Y3Qub3BlbihmX3N0cnVjdF9uYW1lLmNfc3RyKCkpOwotCi0gIGZfc3RydWN0IDw8Ci0gICAgYXV0b2dlbl9jb21tZW50KCkgPDwKLSAgICBqYXZhX3BhY2thZ2UoKSA8PAotICAgIGphdmFfdHlwZV9pbXBvcnRzKCkgPDwKLSAgICBqYXZhX3N1cHByZXNzaW9ucygpOwotCi0gIGdlbmVyYXRlX2phdmFfc3RydWN0X2RlZmluaXRpb24oZl9zdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19leGNlcHRpb24pOwotICBmX3N0cnVjdC5jbG9zZSgpOwotfQotCi0vKioKLSAqIEphdmEgdW5pb24gZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3VuaW9uKHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGZpbGUKLSAgc3RyaW5nIGZfc3RydWN0X25hbWUgPSBwYWNrYWdlX2Rpcl8rIi8iK21ha2VfdmFsaWRfamF2YV9maWxlbmFtZSh0c3RydWN0LT5nZXRfbmFtZSgpKSsiLmphdmEiOwotICBvZnN0cmVhbSBmX3N0cnVjdDsKLSAgZl9zdHJ1Y3Qub3BlbihmX3N0cnVjdF9uYW1lLmNfc3RyKCkpOwotCi0gIGZfc3RydWN0IDw8Ci0gICAgYXV0b2dlbl9jb21tZW50KCkgPDwKLSAgICBqYXZhX3BhY2thZ2UoKSA8PAotICAgIGphdmFfdHlwZV9pbXBvcnRzKCkgPDwKLSAgICBqYXZhX3N1cHByZXNzaW9ucygpOwotCi0gIGdlbmVyYXRlX2phdmFfZG9jKGZfc3RydWN0LCB0c3RydWN0KTsKLQotICBib29sIGlzX2ZpbmFsID0gKHRzdHJ1Y3QtPmFubm90YXRpb25zXy5maW5kKCJmaW5hbCIpICE9IHRzdHJ1Y3QtPmFubm90YXRpb25zXy5lbmQoKSk7Ci0KLSAgaW5kZW50KGZfc3RydWN0KSA8PAotICAgICJwdWJsaWMgIiA8PCAoaXNfZmluYWwgPyAiZmluYWwgIiA6ICIiKSA8PCAiY2xhc3MgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpCi0gICAgPDwgIiBleHRlbmRzIG9yZy5hcGFjaGUudGhyaWZ0LlRVbmlvbjwiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiwgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIuX0ZpZWxkcz4gIjsKLQotICBzY29wZV91cChmX3N0cnVjdCk7Ci0KLSAgZ2VuZXJhdGVfc3RydWN0X2Rlc2MoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOwotICBnZW5lcmF0ZV9maWVsZF9kZXNjcyhmX3N0cnVjdCwgdHN0cnVjdCk7Ci0KLSAgZl9zdHJ1Y3QgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9maWVsZF9uYW1lX2NvbnN0YW50cyhmX3N0cnVjdCwgdHN0cnVjdCk7Ci0KLSAgZl9zdHJ1Y3QgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9qYXZhX21ldGFfZGF0YV9tYXAoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOwotCi0gIGdlbmVyYXRlX3VuaW9uX2NvbnN0cnVjdG9yKGZfc3RydWN0LCB0c3RydWN0KTsKLQotICBmX3N0cnVjdCA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX3VuaW9uX2Fic3RyYWN0X21ldGhvZHMoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOwotCi0gIGZfc3RydWN0IDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfZmllbGRfYnlfaWQoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOwotCi0gIGZfc3RydWN0IDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfdW5pb25fZ2V0dGVyc19hbmRfc2V0dGVycyhmX3N0cnVjdCwgdHN0cnVjdCk7Ci0KLSAgZl9zdHJ1Y3QgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV91bmlvbl9pc19zZXRfbWV0aG9kcyhmX3N0cnVjdCwgdHN0cnVjdCk7Ci0KLSAgZl9zdHJ1Y3QgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV91bmlvbl9jb21wYXJpc29ucyhmX3N0cnVjdCwgdHN0cnVjdCk7Ci0KLSAgZl9zdHJ1Y3QgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV91bmlvbl9oYXNoY29kZShmX3N0cnVjdCwgdHN0cnVjdCk7Ci0KLSAgZl9zdHJ1Y3QgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF93cml0ZV9vYmplY3QoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOwotCi0gIGZfc3RydWN0IDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfcmVhZF9vYmplY3QoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOwotCi0gIGZfc3RydWN0IDw8IGVuZGw7Ci0KLSAgc2NvcGVfZG93bihmX3N0cnVjdCk7Ci0KLSAgZl9zdHJ1Y3QuY2xvc2UoKTsKLX0KLQotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV91bmlvbl9jb25zdHJ1Y3RvcihvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIigpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBib29sIGRlZmF1bHRfdmFsdWUgPSBmYWxzZTsKLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICBpZiAoKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAic3VwZXIoX0ZpZWxkcy4iIDw8IGNvbnN0YW50X25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiLCAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIHR5cGUsICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkpIDw8ICIpOyIgPDwgZW5kbDsKLSAgICAgIGRlZmF1bHRfdmFsdWUgPSB0cnVlOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIGlmIChkZWZhdWx0X3ZhbHVlID09IGZhbHNlKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgInN1cGVyKCk7IiA8PCBlbmRsOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiKF9GaWVsZHMgc2V0RmllbGQsIE9iamVjdCB2YWx1ZSkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgc3VwZXIoc2V0RmllbGQsIHZhbHVlKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiKCIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIgb3RoZXIpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHN1cGVyKG90aGVyKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgZGVlcENvcHkoKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gbmV3ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKHRoaXMpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAvLyBnZW5lcmF0ZSAiY29uc3RydWN0b3JzIiBmb3IgZWFjaCBmaWVsZAotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgdF90eXBlKiB0eXBlID0gKCptX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgc3RhdGljICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIgIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIigiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiIHZhbHVlKSB7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIgeCA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiKCk7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgIHguc2V0IiA8PCBnZXRfY2FwX25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKHZhbHVlKTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIHg7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIHN0YXRpYyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoYnl0ZVtdIHZhbHVlKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIiAgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIiB4ID0gbmV3ICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIoKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICB4LnNldCIgPDwgZ2V0X2NhcF9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIihCeXRlQnVmZmVyLndyYXAoQXJyYXlzLmNvcHlPZih2YWx1ZSwgdmFsdWUubGVuZ3RoKSkpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiB4OyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdW5pb25fZ2V0dGVyc19hbmRfc2V0dGVycyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICBvdXQgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqbV9pdGVyKTsKLSAgICB0X3R5cGUqIHR5cGUgPSBmaWVsZC0+Z2V0X3R5cGUoKTsKLSAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSA9IGdldF9jYXBfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSk7Ci0KLSAgICBnZW5lcmF0ZV9qYXZhX2RvYyhvdXQsIGZpZWxkKTsKLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGJ5dGVbXSBnZXQiIDw8IGNhcF9uYW1lIDw8ICIoKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIiAgc2V0IiA8PCBjYXBfbmFtZSA8PCAiKG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLnJpZ2h0U2l6ZShidWZmZXIiIDw8IGdldF9jYXBfbmFtZSgiZm9yIikgPDwgY2FwX25hbWUgPDwgIigpKSk7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIiAgQnl0ZUJ1ZmZlciBiID0gYnVmZmVyIiA8PCBnZXRfY2FwX25hbWUoImZvciIpIDw8IGNhcF9uYW1lIDw8ICIoKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gYiA9PSBudWxsID8gbnVsbCA6IGIuYXJyYXkoKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICAgICAgb3V0IDw8IGVuZGw7Ci0KLSAgICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgQnl0ZUJ1ZmZlciBidWZmZXIiIDw8IGdldF9jYXBfbmFtZSgiZm9yIikgPDwgZ2V0X2NhcF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiKCkgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgIGlmIChnZXRTZXRGaWVsZCgpID09IF9GaWVsZHMuIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIiAgICByZXR1cm4gb3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIuY29weUJpbmFyeSgoQnl0ZUJ1ZmZlcilnZXRGaWVsZFZhbHVlKCkpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgIH0gZWxzZSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIiAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihcIkNhbm5vdCBnZXQgZmllbGQgJyIgPDwgZmllbGQtPmdldF9uYW1lKCkKLSAgICAgICAgPDwgIicgYmVjYXVzZSB1bmlvbiBpcyBjdXJyZW50bHkgc2V0IHRvIFwiICsgZ2V0RmllbGREZXNjKGdldFNldEZpZWxkKCkpLm5hbWUpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgIH0iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHR5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSkgPDwgIiBnZXQiIDw8IGdldF9jYXBfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIigpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICBpZiAoZ2V0U2V0RmllbGQoKSA9PSBfRmllbGRzLiIgPDwgY29uc3RhbnRfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIikgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgICAgcmV0dXJuICgiIDw8IHR5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSwgdHJ1ZSkgPDwgIilnZXRGaWVsZFZhbHVlKCk7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIiAgfSBlbHNlIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKFwiQ2Fubm90IGdldCBmaWVsZCAnIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSAKLSAgICAgICAgPDwgIicgYmVjYXVzZSB1bmlvbiBpcyBjdXJyZW50bHkgc2V0IHRvIFwiICsgZ2V0RmllbGREZXNjKGdldFNldEZpZWxkKCkpLm5hbWUpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgIH0iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBvdXQgPDwgZW5kbDsKLQotICAgIGdlbmVyYXRlX2phdmFfZG9jKG91dCwgZmllbGQpOwotICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiAoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCBzZXQiIDw8IGdldF9jYXBfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIihieXRlW10gdmFsdWUpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICBzZXQiIDw8IGdldF9jYXBfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIihCeXRlQnVmZmVyLndyYXAoQXJyYXlzLmNvcHlPZih2YWx1ZSwgdmFsdWUubGVuZ3RoKSkpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotCi0gICAgICBvdXQgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyB2b2lkIHNldCIgPDwgZ2V0X2NhcF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiKCIgPDwgdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpKSA8PCAiIHZhbHVlKSB7IiA8PCBlbmRsOwotICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKGZpZWxkLT5nZXRfdHlwZSgpKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIiAgaWYgKHZhbHVlID09IG51bGwpIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgc2V0RmllbGRfID0gX0ZpZWxkcy4iIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICI7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgIHZhbHVlXyA9IHZhbHVlOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgfQotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3VuaW9uX2lzX3NldF9tZXRob2RzKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0KLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dCA8PCBlbmRsOwotICAgIH0KLQotICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSAoKm1faXRlciktPmdldF9uYW1lKCk7Ci0KLSAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGJvb2xlYW4gaXMiIDw8IGdldF9jYXBfbmFtZSgic2V0IikgPDwgZ2V0X2NhcF9uYW1lKGZpZWxkX25hbWUpIDw8ICIoKSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gc2V0RmllbGRfID09IF9GaWVsZHMuIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkX25hbWUpIDw8ICI7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3VuaW9uX2Fic3RyYWN0X21ldGhvZHMob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgZ2VuZXJhdGVfY2hlY2tfdHlwZShvdXQsIHRzdHJ1Y3QpOwotICBvdXQgPDwgZW5kbDsKLSAgZ2VuZXJhdGVfc3RhbmRhcmRfc2NoZW1lX3JlYWRfdmFsdWUob3V0LCB0c3RydWN0KTsKLSAgb3V0IDw8IGVuZGw7Ci0gIGdlbmVyYXRlX3N0YW5kYXJkX3NjaGVtZV93cml0ZV92YWx1ZShvdXQsIHRzdHJ1Y3QpOwotICBvdXQgPDwgZW5kbDsKLSAgZ2VuZXJhdGVfdHVwbGVfc2NoZW1lX3JlYWRfdmFsdWUob3V0LCB0c3RydWN0KTsKLSAgb3V0IDw8IGVuZGw7Ci0gIGdlbmVyYXRlX3R1cGxlX3NjaGVtZV93cml0ZV92YWx1ZShvdXQsIHRzdHJ1Y3QpOwotICBvdXQgPDwgZW5kbDsKLSAgZ2VuZXJhdGVfZ2V0X2ZpZWxkX2Rlc2Mob3V0LCB0c3RydWN0KTsKLSAgb3V0IDw8IGVuZGw7Ci0gIGdlbmVyYXRlX2dldF9zdHJ1Y3RfZGVzYyhvdXQsIHRzdHJ1Y3QpOwotICBvdXQgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInByb3RlY3RlZCBfRmllbGRzIGVudW1Gb3JJZChzaG9ydCBpZCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIF9GaWVsZHMuZmluZEJ5VGhyaWZ0SWRPclRocm93KGlkKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NoZWNrX3R5cGUob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgaW5kZW50KG91dCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInByb3RlY3RlZCB2b2lkIGNoZWNrVHlwZShfRmllbGRzIHNldEZpZWxkLCBPYmplY3QgdmFsdWUpIHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24geyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoc2V0RmllbGQpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0KLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIHRfZmllbGQqIGZpZWxkID0gKCptX2l0ZXIpOwotCi0gICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiOiIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICBpZiAodmFsdWUgaW5zdGFuY2VvZiAiIDw8IHR5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSwgdHJ1ZSwgZmFsc2UsIHRydWUpIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgICBicmVhazsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgfSIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICB0aHJvdyBuZXcgQ2xhc3NDYXN0RXhjZXB0aW9uKFwiV2FzIGV4cGVjdGluZyB2YWx1ZSBvZiB0eXBlICIgCi0gICAgICA8PCB0eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCksIHRydWUsIGZhbHNlKSA8PCAiIGZvciBmaWVsZCAnIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSAKLSAgICAgIDw8ICInLCBidXQgZ290IFwiICsgdmFsdWUuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpOyIgPDwgZW5kbDsKLSAgICAvLyBkbyB0aGUgcmVhbCBjaGVjayBoZXJlCi0gIH0KLQotICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oXCJVbmtub3duIGZpZWxkIGlkIFwiICsgc2V0RmllbGQpOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdGFuZGFyZF9zY2hlbWVfcmVhZF92YWx1ZShvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBpbmRlbnQob3V0KSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicHJvdGVjdGVkIE9iamVjdCBzdGFuZGFyZFNjaGVtZVJlYWRWYWx1ZShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgaXByb3QsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCBmaWVsZCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geyIgPDwgZW5kbDsKLQotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQob3V0KSA8PCAiX0ZpZWxkcyBzZXRGaWVsZCA9IF9GaWVsZHMuZmluZEJ5VGhyaWZ0SWQoZmllbGQuaWQpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgImlmIChzZXRGaWVsZCAhPSBudWxsKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoc2V0RmllbGQpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0KLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIHRfZmllbGQqIGZpZWxkID0gKCptX2l0ZXIpOwotCi0gICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiOiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiaWYgKGZpZWxkLnR5cGUgPT0gIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiX0ZJRUxEX0RFU0MudHlwZSkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCksIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCBmaWVsZCwgIiIpOwotICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gbnVsbDsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfQotCi0gIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihcInNldEZpZWxkIHdhc24ndCBudWxsLCBidXQgZGlkbid0IG1hdGNoIGFueSBvZiB0aGUgY2FzZSBzdGF0ZW1lbnRzIVwiKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsgIAotICBpbmRlbnQob3V0KSA8PCAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJyZXR1cm4gbnVsbDsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0YW5kYXJkX3NjaGVtZV93cml0ZV92YWx1ZShvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBpbmRlbnQob3V0KSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicHJvdGVjdGVkIHZvaWQgc3RhbmRhcmRTY2hlbWVXcml0ZVZhbHVlKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBvcHJvdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geyIgPDwgZW5kbDsKLQotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChzZXRGaWVsZF8pIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0KLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIHRfZmllbGQqIGZpZWxkID0gKCptX2l0ZXIpOwotCi0gICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiOiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCksIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgZmllbGQtPmdldF9uYW1lKCkgCi0gICAgICA8PCAiID0gKCIgPDwgIHR5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSwgdHJ1ZSwgZmFsc2UpIDw8ICIpdmFsdWVfOyIgPDwgZW5kbDsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCBmaWVsZCwgIiIpOwotICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm47IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0KLQotICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oXCJDYW5ub3Qgd3JpdGUgdW5pb24gd2l0aCB1bmtub3duIGZpZWxkIFwiICsgc2V0RmllbGRfKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLQotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90dXBsZV9zY2hlbWVfcmVhZF92YWx1ZShvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBpbmRlbnQob3V0KSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicHJvdGVjdGVkIE9iamVjdCB0dXBsZVNjaGVtZVJlYWRWYWx1ZShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgaXByb3QsIHNob3J0IGZpZWxkSUQpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsiIDw8IGVuZGw7Ci0gIAotICBpbmRlbnRfdXAoKTsKLSAgCi0gIGluZGVudChvdXQpIDw8ICJfRmllbGRzIHNldEZpZWxkID0gX0ZpZWxkcy5maW5kQnlUaHJpZnRJZChmaWVsZElEKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJpZiAoc2V0RmllbGQgIT0gbnVsbCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKHNldEZpZWxkKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0gIAotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgdF9maWVsZCogZmllbGQgPSAoKm1faXRlcik7Ci0gICAgCi0gICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiOiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCksIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCBmaWVsZCwgIiIpOwotICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICB9Ci0gIAotICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oXCJzZXRGaWVsZCB3YXNuJ3QgbnVsbCwgYnV0IGRpZG4ndCBtYXRjaCBhbnkgb2YgdGhlIGNhc2Ugc3RhdGVtZW50cyFcIik7IiA8PCBlbmRsOwotICAKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gIAotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAidGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihcIkNvdWxkbid0IGZpbmQgYSBmaWVsZCB3aXRoIGZpZWxkIGlkIFwiICsgZmllbGRJRCk7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHVwbGVfc2NoZW1lX3dyaXRlX3ZhbHVlKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGluZGVudChvdXQpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJwcm90ZWN0ZWQgdm9pZCB0dXBsZVNjaGVtZVdyaXRlVmFsdWUob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIG9wcm90KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOwotICAKLSAgaW5kZW50X3VwKCk7Ci0gIAotICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChzZXRGaWVsZF8pIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICAKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLSAgCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqbV9pdGVyKTsKLSAgICAKLSAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICI6IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSAKLSAgICA8PCAiID0gKCIgPDwgIHR5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSwgdHJ1ZSwgZmFsc2UpIDw8ICIpdmFsdWVfOyIgPDwgZW5kbDsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCBmaWVsZCwgIiIpOwotICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm47IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0KLSAgCi0gIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihcIkNhbm5vdCB3cml0ZSB1bmlvbiB3aXRoIHVua25vd24gZmllbGQgXCIgKyBzZXRGaWVsZF8pOyIgPDwgZW5kbDsKLSAgCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAKLSAgaW5kZW50X2Rvd24oKTsKLSAgCi0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2dldF9maWVsZF9kZXNjKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGluZGVudChvdXQpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJwcm90ZWN0ZWQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkIGdldEZpZWxkRGVzYyhfRmllbGRzIHNldEZpZWxkKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKHNldEZpZWxkKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgdF9maWVsZCogZmllbGQgPSAoKm1faXRlcik7Ci0gICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiOiIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiX0ZJRUxEX0RFU0M7IiA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFwiVW5rbm93biBmaWVsZCBpZCBcIiArIHNldEZpZWxkKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ2V0X3N0cnVjdF9kZXNjKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gICh2b2lkKSB0c3RydWN0OwotICBpbmRlbnQob3V0KSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicHJvdGVjdGVkIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTdHJ1Y3QgZ2V0U3RydWN0RGVzYygpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBTVFJVQ1RfREVTQzsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3VuaW9uX2NvbXBhcmlzb25zKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIC8vIGVxdWFsaXR5Ci0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG90aGVyKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICBpZiAob3RoZXIgaW5zdGFuY2VvZiAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIikgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgICByZXR1cm4gZXF1YWxzKCgiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIilvdGhlcik7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICB9IGVsc2UgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgICByZXR1cm4gZmFsc2U7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICB9IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICBvdXQgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAicHVibGljIGJvb2xlYW4gZXF1YWxzKCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIG90aGVyKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gb3RoZXIgIT0gbnVsbCAmJiBnZXRTZXRGaWVsZCgpID09IG90aGVyLmdldFNldEZpZWxkKCkgJiYgZ2V0RmllbGRWYWx1ZSgpLmVxdWFscyhvdGhlci5nZXRGaWVsZFZhbHVlKCkpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gIG91dCA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgaW50IGNvbXBhcmVUbygiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiIG90aGVyKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICBpbnQgbGFzdENvbXBhcmlzb24gPSBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5jb21wYXJlVG8oZ2V0U2V0RmllbGQoKSwgb3RoZXIuZ2V0U2V0RmllbGQoKSk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICBpZiAobGFzdENvbXBhcmlzb24gPT0gMCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgICByZXR1cm4gb3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIuY29tcGFyZVRvKGdldEZpZWxkVmFsdWUoKSwgb3RoZXIuZ2V0RmllbGRWYWx1ZSgpKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIH0iIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICBvdXQgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV91bmlvbl9oYXNoY29kZShvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICAodm9pZCkgdHN0cnVjdDsKLSAgaW5kZW50KG91dCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBpbnQgaGFzaENvZGUoKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICBMaXN0PE9iamVjdD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgbGlzdC5hZGQodGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICBvcmcuYXBhY2hlLnRocmlmdC5URmllbGRJZEVudW0gc2V0RmllbGQgPSBnZXRTZXRGaWVsZCgpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgaWYgKHNldEZpZWxkICE9IG51bGwpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgICAgbGlzdC5hZGQoc2V0RmllbGQuZ2V0VGhyaWZ0RmllbGRJZCgpKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgICAgT2JqZWN0IHZhbHVlID0gZ2V0RmllbGRWYWx1ZSgpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBvcmcuYXBhY2hlLnRocmlmdC5URW51bSkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgICAgIGxpc3QuYWRkKCgob3JnLmFwYWNoZS50aHJpZnQuVEVudW0pZ2V0RmllbGRWYWx1ZSgpKS5nZXRWYWx1ZSgpKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgICAgfSBlbHNlIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgICAgICBsaXN0LmFkZCh2YWx1ZSk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICAgIH0iIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIH0iIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBsaXN0Lmhhc2hDb2RlKCk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSI7Ci19Ci0KLS8qKgotICogSmF2YSBzdHJ1Y3QgZGVmaW5pdGlvbi4gVGhpcyBoYXMgdmFyaW91cyBwYXJhbWV0ZXJzLCBhcyBpdCBjb3VsZCBiZQotICogZ2VuZXJhdGVkIHN0YW5kYWxvbmUgb3IgaW5zaWRlIGFub3RoZXIgY2xhc3MgYXMgYSBoZWxwZXIuIElmIGl0Ci0gKiBpcyBhIGhlbHBlciB0aGFuIGl0IGlzIGEgc3RhdGljIGNsYXNzLgotICoKLSAqIEBwYXJhbSB0c3RydWN0ICAgICAgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKiBAcGFyYW0gaXNfZXhjZXB0aW9uIElzIHRoaXMgYW4gZXhjZXB0aW9uPwotICogQHBhcmFtIGluX2NsYXNzICAgICBJZiBpbnNpZGUgYSBjbGFzcywgbmVlZHMgdG8gYmUgc3RhdGljIGNsYXNzCi0gKiBAcGFyYW0gaXNfcmVzdWx0ICAgIElmIHRoaXMgaXMgYSByZXN1bHQgaXQgbmVlZHMgYSBkaWZmZXJlbnQgd3JpdGVyCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfZGVmaW5pdGlvbihvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQpIHsKLSAgZ2VuZXJhdGVfamF2YV9kb2Mob3V0LCB0c3RydWN0KTsKLQotICBib29sIGlzX2ZpbmFsID0gKHRzdHJ1Y3QtPmFubm90YXRpb25zXy5maW5kKCJmaW5hbCIpICE9IHRzdHJ1Y3QtPmFubm90YXRpb25zXy5lbmQoKSk7Ci0KLSAgaWYgKCFpbl9jbGFzcykgewotICAgIGdlbmVyYXRlX2phdmF4X2dlbmVyYXRlZF9hbm5vdGF0aW9uKG91dCk7Ci0gIH0KLQotICBpbmRlbnQob3V0KSA8PAotICAgICJwdWJsaWMgIiA8PCAoaXNfZmluYWwgPyAiZmluYWwgIiA6ICIiKSA8PAotICAgIChpbl9jbGFzcyA/ICJzdGF0aWMgIiA6ICIiKSA8PCAiY2xhc3MgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgIjsKLQotICBpZiAoaXNfZXhjZXB0aW9uKSB7Ci0gICAgb3V0IDw8ICJleHRlbmRzIFRFeGNlcHRpb24gIjsKLSAgfQotICBvdXQgPDwgImltcGxlbWVudHMgb3JnLmFwYWNoZS50aHJpZnQuVEJhc2U8IiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIsICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiLl9GaWVsZHM+LCBqYXZhLmlvLlNlcmlhbGl6YWJsZSwgQ2xvbmVhYmxlLCBDb21wYXJhYmxlPCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiPiI7Ci0KLSAgaWYgKGFuZHJvaWRfc3R5bGVfKSB7Ci0gICAgb3V0IDw8ICIsIGFuZHJvaWQub3MuUGFyY2VsYWJsZSI7Ci0gIH0KLQotICBvdXQgPDwgIiAiOwotCi0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgZ2VuZXJhdGVfc3RydWN0X2Rlc2Mob3V0LCB0c3RydWN0KTsKLQotICAvLyBNZW1iZXJzIGFyZSBwdWJsaWMgZm9yIC1qYXZhLCBwcml2YXRlIGZvciAtamF2YWJlYW4KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLQotICBvdXQgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9maWVsZF9kZXNjcyhvdXQsIHRzdHJ1Y3QpOwotCi0gIG91dCA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX3NjaGVtZV9tYXAob3V0LCB0c3RydWN0KTsKLQotICBvdXQgPDwgZW5kbDsKLQotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgaWYgKGJlYW5fc3R5bGVfIHx8IHByaXZhdGVfbWVtYmVyc18pIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJwcml2YXRlICI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGdlbmVyYXRlX2phdmFfZG9jKG91dCwgKm1faXRlcik7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljICI7Ci0gICAgfQotICAgIG91dCA8PCBkZWNsYXJlX2ZpZWxkKCptX2l0ZXIsIGZhbHNlLCB0cnVlKSA8PCBlbmRsOwotICB9Ci0KLSAgb3V0IDw8IGVuZGw7Ci0KLSAgaWYoYW5kcm9pZF9zdHlsZV8pIHsKLSAgICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9wYXJjZWxhYmxlKG91dCwgdHN0cnVjdCk7Ci0gIH0KLQotICBnZW5lcmF0ZV9maWVsZF9uYW1lX2NvbnN0YW50cyhvdXQsIHRzdHJ1Y3QpOwotCi0gIC8vIGlzc2V0IGRhdGEKLSAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgewotICAgIG91dCA8PCBlbmRsOwotCi0gICAgaW5kZW50KG91dCkgPDwgIi8vIGlzc2V0IGlkIGFzc2lnbm1lbnRzIiA8PCBlbmRsOwotCi0gICAgaW50IGkgPSAwOwotICAgIGludCBvcHRpb25hbHMgPSAwOwotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMKSB7Ci0gICAgICAgIG9wdGlvbmFscysrOwotICAgICAgfQotICAgICAgaWYgKCF0eXBlX2Nhbl9iZV9udWxsKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkpIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgc3RhdGljIGZpbmFsIGludCAiIDw8IGlzc2V0X2ZpZWxkX2lkKCptX2l0ZXIpCi0gICAgICAgICAgPDwgIiA9ICIgPDwgaSA8PCAiOyIgPDwgIGVuZGw7Ci0gICAgICAgIGkrKzsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGQ6OnN0cmluZyBwcmltaXRpdmVUeXBlOwotICAgIHN3aXRjaChuZWVkc19pc3NldCh0c3RydWN0LCAmcHJpbWl0aXZlVHlwZSkpIHsKLSAgICBjYXNlIElTU0VUX05PTkU6Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElTU0VUX1BSSU1JVElWRToKLSAgICAgIGluZGVudChvdXQpIDw8ICJwcml2YXRlICIgPDwgcHJpbWl0aXZlVHlwZSA8PCAiIF9faXNzZXRfYml0ZmllbGQgPSAwOyIgPDwgZW5kbDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSVNTRVRfQklUU0VUOgotICAgICAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgQml0U2V0IF9faXNzZXRfYml0X3ZlY3RvciA9IG5ldyBCaXRTZXQoIiA8PCBpIDw8ICIpOyIgPDwgZW5kbDsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGlmIChvcHRpb25hbHMgPiAwKSB7Ci0gICAgICBzdGQ6OnN0cmluZyBvdXRwdXRfc3RyaW5nID0gInByaXZhdGUgc3RhdGljIGZpbmFsIF9GaWVsZHMgb3B0aW9uYWxzW10gPSB7IjsKLSAgICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKLSAgICAgICAgICBvdXRwdXRfc3RyaW5nID0gb3V0cHV0X3N0cmluZyArICJfRmllbGRzLiIgKyBjb25zdGFudF9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgKyAiLCI7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGluZGVudChvdXQpIDw8IG91dHB1dF9zdHJpbmcuc3Vic3RyKDAsIG91dHB1dF9zdHJpbmcubGVuZ3RoKCkgLSAxKSA8PCAgIn07IiA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIGdlbmVyYXRlX2phdmFfbWV0YV9kYXRhX21hcChvdXQsIHRzdHJ1Y3QpOwotCi0gIGJvb2wgYWxsX29wdGlvbmFsX21lbWJlcnMgPSB0cnVlOwotCi0gIC8vIERlZmF1bHQgY29uc3RydWN0b3IKLSAgaW5kZW50KG91dCkgPDwKLSAgICAicHVibGljICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgewotICAgICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LCAidGhpcy4iICsgKCptX2l0ZXIpLT5nZXRfbmFtZSgpLCB0LCAoKm1faXRlciktPmdldF92YWx1ZSgpLCB0cnVlLCB0cnVlKTsKLSAgICB9Ci0gICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKLSAgICAgIGFsbF9vcHRpb25hbF9tZW1iZXJzID0gZmFsc2U7Ci0gICAgfQotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaWYgKCFtZW1iZXJzLmVtcHR5KCkgJiYgIWFsbF9vcHRpb25hbF9tZW1iZXJzKSB7Ci0gICAgLy8gRnVsbCBjb25zdHJ1Y3RvciBmb3IgYWxsIGZpZWxkcwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAicHVibGljICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKCIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9PUFRJT05BTCkgewotICAgICAgICBpZiAoIWZpcnN0KSB7Ci0gICAgICAgICAgb3V0IDw8ICIsIiA8PCBlbmRsOwotICAgICAgICB9Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZSgoKm1faXRlciktPmdldF90eXBlKCkpIDw8ICIgIiA8PAotICAgICAgICAgICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgb3V0IDw8ICIpIiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgInsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgInRoaXMoKTsiIDw8IGVuZGw7Ci0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKLSAgICAgICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOwotICAgICAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkKLSAgICAgICAgICAgIDw8ICIgPSBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5jb3B5QmluYXJ5KCIKLSAgICAgICAgICAgIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIKLSAgICAgICAgICAgIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKLSAgICAgICAgfQotICAgICAgICBnZW5lcmF0ZV9pc3NldF9zZXQob3V0LCAoKm1faXRlciksICIiKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBjb3B5IGNvbnN0cnVjdG9yCi0gIGluZGVudChvdXQpIDw8ICIvKioiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgKiBQZXJmb3JtcyBhIGRlZXAgY29weSBvbiA8aT5vdGhlcjwvaT4uIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICovIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIG90aGVyKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBzd2l0Y2gobmVlZHNfaXNzZXQodHN0cnVjdCkpIHsKLSAgY2FzZSBJU1NFVF9OT05FOgotICAgIGJyZWFrOwotICBjYXNlIElTU0VUX1BSSU1JVElWRToKLSAgICBpbmRlbnQob3V0KSA8PCAiX19pc3NldF9iaXRmaWVsZCA9IG90aGVyLl9faXNzZXRfYml0ZmllbGQ7IiA8PCBlbmRsOwotICAgIGJyZWFrOwotICBjYXNlIElTU0VUX0JJVFNFVDoKLSAgICBpbmRlbnQob3V0KSA8PCAiX19pc3NldF9iaXRfdmVjdG9yLmNsZWFyKCk7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJfX2lzc2V0X2JpdF92ZWN0b3Iub3Iob3RoZXIuX19pc3NldF9iaXRfdmVjdG9yKTsiIDw8IGVuZGw7ICAgIAotICAgIGJyZWFrOwotICB9Ci0KLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIHRfZmllbGQqIGZpZWxkID0gKCptX2l0ZXIpOwotICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSBmaWVsZC0+Z2V0X25hbWUoKTsKLSAgICB0X3R5cGUqIHR5cGUgPSBmaWVsZC0+Z2V0X3R5cGUoKTsKLSAgICBib29sIGNhbl9iZV9udWxsID0gdHlwZV9jYW5fYmVfbnVsbCh0eXBlKTsKLQotICAgIGlmIChjYW5fYmVfbnVsbCkgewotICAgICAgaW5kZW50KG91dCkgPDwgImlmIChvdGhlci4iIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKGZpZWxkKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgfQotCi0gICAgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfY29udGFpbmVyKG91dCwgIm90aGVyIiwgZmllbGRfbmFtZSwgIl9fdGhpc19fIiArIGZpZWxkX25hbWUsIHR5cGUpOwotICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSBfX3RoaXNfXyIgPDwgZmllbGRfbmFtZSA8PCAiOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSAiOwotICAgICAgZ2VuZXJhdGVfZGVlcF9jb3B5X25vbl9jb250YWluZXIob3V0LCAib3RoZXIuIiArIGZpZWxkX25hbWUsIGZpZWxkX25hbWUsIHR5cGUpOwotICAgICAgb3V0IDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIGlmIChjYW5fYmVfbnVsbCkgewotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgLy8gY2xvbmUgbWV0aG9kLCBzbyB0aGF0IHlvdSBjYW4gZGVlcCBjb3B5IGFuIG9iamVjdCB3aGVuIHlvdSBkb24ndCBrbm93IGl0cyBjbGFzcy4KLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiBkZWVwQ29weSgpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBuZXcgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIodGhpcyk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0KLQotICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9jbGVhcihvdXQsIHRzdHJ1Y3QpOwotCi0gIGdlbmVyYXRlX2phdmFfYmVhbl9ib2lsZXJwbGF0ZShvdXQsIHRzdHJ1Y3QpOwotICBnZW5lcmF0ZV9nZW5lcmljX2ZpZWxkX2dldHRlcnNfc2V0dGVycyhvdXQsIHRzdHJ1Y3QpOwotICBnZW5lcmF0ZV9nZW5lcmljX2lzc2V0X21ldGhvZChvdXQsIHRzdHJ1Y3QpOwotCi0gIGdlbmVyYXRlX2phdmFfc3RydWN0X2VxdWFsaXR5KG91dCwgdHN0cnVjdCk7Ci0gIGdlbmVyYXRlX2phdmFfc3RydWN0X2NvbXBhcmVfdG8ob3V0LCB0c3RydWN0KTsKLSAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfZmllbGRfYnlfaWQob3V0LCB0c3RydWN0KTsKLQotICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9yZWFkZXIob3V0LCB0c3RydWN0KTsKLSAgaWYgKGlzX3Jlc3VsdCkgewotICAgIGdlbmVyYXRlX2phdmFfc3RydWN0X3Jlc3VsdF93cml0ZXIob3V0LCB0c3RydWN0KTsKLSAgfSBlbHNlIHsKLSAgICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF93cml0ZXIob3V0LCB0c3RydWN0KTsKLSAgfQotICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF90b3N0cmluZyhvdXQsIHRzdHJ1Y3QpOwotICBnZW5lcmF0ZV9qYXZhX3ZhbGlkYXRvcihvdXQsIHRzdHJ1Y3QpOwotCi0gIGdlbmVyYXRlX2phdmFfc3RydWN0X3dyaXRlX29iamVjdChvdXQsIHRzdHJ1Y3QpOwotICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9yZWFkX29iamVjdChvdXQsIHRzdHJ1Y3QpOwotCi0gIGdlbmVyYXRlX2phdmFfc3RydWN0X3N0YW5kYXJkX3NjaGVtZShvdXQsIHRzdHJ1Y3QsIGlzX3Jlc3VsdCk7Ci0gIGdlbmVyYXRlX2phdmFfc3RydWN0X3R1cGxlX3NjaGVtZShvdXQsIHRzdHJ1Y3QpOwotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLSAgb3V0IDw8IGVuZGw7Ci19Ci0KLS8qKgotICogZ2VuZXJhdGVzIHBhcmNlbGFibGUgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfcGFyY2VsYWJsZShvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgewotICBzdHJpbmcgdG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0KLSAgb3V0IDw8IGluZGVudCgpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGwgPDwKLQkJICBpbmRlbnQoKSA8PCAicHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCBvdXQsIGludCBmbGFncykgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIHN0cmluZyBiaXRzZXRQcmltaXRpdmVUeXBlID0gIiI7Ci0gIHN3aXRjaChuZWVkc19pc3NldCh0c3RydWN0LCAmYml0c2V0UHJpbWl0aXZlVHlwZSkpIHsKLSAgY2FzZSBJU1NFVF9OT05FOgotCSAgYnJlYWs7Ci0gIGNhc2UgSVNTRVRfUFJJTUlUSVZFOgotCSAgaW5kZW50KG91dCkgPDwgIi8vcHJpbWl0aXZlIGJpdGZpZWxkIG9mIHR5cGU6ICIgPDwgYml0c2V0UHJpbWl0aXZlVHlwZSA8PCBlbmRsOwotCSAgaWYoYml0c2V0UHJpbWl0aXZlVHlwZT09ImJ5dGUiKSB7Ci0JCSAgaW5kZW50KG91dCkgPDwgIm91dC53cml0ZUJ5dGUoX19pc3NldF9iaXRmaWVsZCk7IiA8PCBlbmRsOwotCSAgfSBlbHNlIGlmKGJpdHNldFByaW1pdGl2ZVR5cGU9PSJzaG9ydCIpIHsKLQkJICBpbmRlbnQob3V0KSA8PCAib3V0LndyaXRlSW50KG5ldyBTaG9ydChfX2lzc2V0X2JpdGZpZWxkKS5pbnRWYWx1ZSgpKTsiIDw8IGVuZGw7Ci0JICB9IGVsc2UgaWYoYml0c2V0UHJpbWl0aXZlVHlwZT09ImludCIpIHsKLQkJICBpbmRlbnQob3V0KSA8PCAib3V0LndyaXRlSW50KF9faXNzZXRfYml0ZmllbGQpOyIgPDwgZW5kbDsKLQkgIH0gZWxzZSBpZihiaXRzZXRQcmltaXRpdmVUeXBlPT0ibG9uZyIpIHsKLQkJICBpbmRlbnQob3V0KSA8PCAib3V0LndyaXRlTG9uZyhfX2lzc2V0X2JpdGZpZWxkKTsiIDw8IGVuZGw7Ci0JICB9Ci0JICBvdXQgPDwgZW5kbDsKLQkgIGJyZWFrOwotICBjYXNlIElTU0VUX0JJVFNFVDoKLQkgIGluZGVudChvdXQpIDw8ICIvL0JpdFNldCIgPDwgZW5kbDsKLQkgIGluZGVudChvdXQpIDw8ICJvdXQud3JpdGVTZXJpYWxpemFibGUoX19pc3NldF9iaXRfdmVjdG9yKTsiIDw8IGVuZGw7Ci0JICBvdXQgPDwgZW5kbDsKLQkgIGJyZWFrOwotICB9Ci0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLQkgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLQkgIHN0cmluZyBuYW1lID0gKCptX2l0ZXIpLT5nZXRfbmFtZSgpOwotCi0JICBpZih0LT5pc19zdHJ1Y3QoKSkgewotCQkgIGluZGVudChvdXQpIDw8ICJvdXQud3JpdGVQYXJjZWxhYmxlKCIgPDwgbmFtZSA8PCAiLCBmbGFncyk7IiA8PCBlbmRsOwotCSAgfSBlbHNlIGlmKHR5cGVfbmFtZSh0KT09ImZsb2F0IikgewotCQkgIGluZGVudChvdXQpIDw8ICJvdXQud3JpdGVGbG9hdCgiIDw8IG5hbWUgPDwgIik7IiA8PCBlbmRsOwotCSAgfSBlbHNlIGlmKHQtPmlzX2VudW0oKSkgewotCQkgIGluZGVudChvdXQpIDw8ICJvdXQud3JpdGVJbnQoIiA8PCBuYW1lIDw8ICIuZ2V0VmFsdWUoKSk7IiA8PCBlbmRsOwotCSAgfSBlbHNlIGlmKHQtPmlzX2xpc3QoKSkgewotCQkgIGlmKCgodF9saXN0Kil0KS0+Z2V0X2VsZW1fdHlwZSgpLT5nZXRfdHJ1ZV90eXBlKCktPmlzX3N0cnVjdCgpKSB7Ci0JCQkgIGluZGVudChvdXQpIDw8ICJvdXQud3JpdGVUeXBlZExpc3QoIiA8PCBuYW1lIDw8ICIpOyIgPDwgZW5kbDsKLQkJICB9ZWxzZSB7Ci0JCQkgIGluZGVudChvdXQpIDw8ICJvdXQud3JpdGVMaXN0KCIgPDwgbmFtZSA8PCAiKTsiIDw8IGVuZGw7Ci0JCSAgfQotCSAgfSBlbHNlIGlmKHQtPmlzX21hcCgpKSB7Ci0JCSAgaW5kZW50KG91dCkgPDwgIm91dC53cml0ZU1hcCgiIDw8IG5hbWUgPDwgIik7IiA8PCBlbmRsOwotCSAgfSBlbHNlIGlmKHQtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0JCSAgaWYgKCgodF9iYXNlX3R5cGUqKXQpLT5pc19iaW5hcnkoKSkgewotCQkJICBpbmRlbnQob3V0KSA8PCAib3V0LndyaXRlSW50KCIgPDwgbmFtZSA8PCAiIT1udWxsID8gMSA6IDApOyIgPDwgZW5kbDsKLQkJCSAgaW5kZW50KG91dCkgPDwgImlmKCIgPDwgbmFtZSA8PCAiICE9IG51bGwpIHsgIiA8PCBlbmRsOwotCQkJICBpbmRlbnRfdXAoKTsKLQkJCSAgaW5kZW50KG91dCkgPDwgIm91dC53cml0ZUJ5dGVBcnJheSgiIDw8IG5hbWUgPDwgIi5hcnJheSgpLCAiCi0JCQkJCSAgPDwgbmFtZSA8PCAiLnBvc2l0aW9uKCkgKyAiIDw8IG5hbWUgPDwgIi5hcnJheU9mZnNldCgpLCAiCi0JCQkJCSAgPDwgbmFtZSA8PCAiLmxpbWl0KCkgLSAiIDw8IG5hbWUgPDwgIi5wb3NpdGlvbigpICk7IiA8PCBlbmRsOwotCQkJICBzY29wZV9kb3duKG91dCk7Ci0JCSAgfSBlbHNlIHsKLQkJCSAgc3dpdGNoKCgodF9iYXNlX3R5cGUqKXQpLT5nZXRfYmFzZSgpKSB7Ci0JCQkgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotCQkJCSAgaW5kZW50KG91dCkgPDwgIm91dC53cml0ZUludChuZXcgU2hvcnQoIiA8PCBuYW1lIDw8ICIpLmludFZhbHVlKCkpOyIgPDwgZW5kbDsKLQkJCQkgIGJyZWFrOwotCQkJICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLQkJCQkgIGluZGVudChvdXQpIDw8ICJvdXQud3JpdGVJbnQoIiA8PCBuYW1lIDw8ICIpOyIgPDwgZW5kbDsKLQkJCQkgIGJyZWFrOwotCQkJICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLQkJCQkgIGluZGVudChvdXQpIDw8ICJvdXQud3JpdGVMb25nKCIgPDwgbmFtZSA8PCAiKTsiIDw8IGVuZGw7Ci0JCQkJICBicmVhazsKLQkJCSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotCQkJCSAgaW5kZW50KG91dCkgPDwgIm91dC53cml0ZUludCgiIDw8IG5hbWUgPDwgIiA/IDEgOiAwKTsiIDw8IGVuZGw7Ci0JCQkJICBicmVhazsKLQkJCSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotCQkJCSAgaW5kZW50KG91dCkgPDwgIm91dC53cml0ZUJ5dGUoIiA8PCBuYW1lIDw8ICIpOyIgPDwgZW5kbDsKLQkJCQkgIGJyZWFrOwotCQkJICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLQkJCQkgIGluZGVudChvdXQpIDw8ICJvdXQud3JpdGVEb3VibGUoIiA8PCBuYW1lIDw8ICIpOyIgPDwgZW5kbDsKLQkJCQkgIGJyZWFrOwotCQkJICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLQkJCQkgIGluZGVudChvdXQpIDw8ICJvdXQud3JpdGVTdHJpbmcoIiA8PCBuYW1lIDw8ICIpOyIgPDwgZW5kbDsKLQkJCQkgIGJyZWFrOwotCQkJICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0JCQkJICBicmVhazsKLQkJCSAgfQotCQkgIH0KLQkgIH0KLSAgfQotICBzY29wZV9kb3duKG91dCk7Ci0gIG91dCA8PCBlbmRsOwotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgInB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAicmV0dXJuIDA7IiA8PCBlbmRsOwotICBzY29wZV9kb3duKG91dCk7Ci0gIG91dCA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0bmFtZSA8PCAiKGFuZHJvaWQub3MuUGFyY2VsIGluKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgLy9yZWFkIGluIHRoZSByZXF1aXJlZCBiaXRmaWVsZAotICBzd2l0Y2gobmVlZHNfaXNzZXQodHN0cnVjdCwgJmJpdHNldFByaW1pdGl2ZVR5cGUpKSB7Ci0gIGNhc2UgSVNTRVRfTk9ORToKLQkgIGJyZWFrOwotICBjYXNlIElTU0VUX1BSSU1JVElWRToKLQkgIGluZGVudChvdXQpIDw8ICIvL3ByaW1pdGl2ZSBiaXRmaWVsZCBvZiB0eXBlOiAiIDw8IGJpdHNldFByaW1pdGl2ZVR5cGUgPDwgZW5kbDsKLQkgIGlmKGJpdHNldFByaW1pdGl2ZVR5cGU9PSJieXRlIikgewotCQkgIGluZGVudChvdXQpIDw8ICJfX2lzc2V0X2JpdGZpZWxkID0gaW4ucmVhZEJ5dGUoKTsiIDw8IGVuZGw7Ci0JICB9IGVsc2UgaWYoYml0c2V0UHJpbWl0aXZlVHlwZT09InNob3J0IikgewotCQkgIGluZGVudChvdXQpIDw8ICJfX2lzc2V0X2JpdGZpZWxkID0gKHNob3J0KSBpbi5yZWFkSW50KCk7IiA8PCBlbmRsOwotCSAgfSBlbHNlIGlmKGJpdHNldFByaW1pdGl2ZVR5cGU9PSJpbnQiKSB7Ci0JCSAgaW5kZW50KG91dCkgPDwgIl9faXNzZXRfYml0ZmllbGQgPSBpbi5yZWFkSW50KCk7IiA8PCBlbmRsOwotCSAgfSBlbHNlIGlmKGJpdHNldFByaW1pdGl2ZVR5cGU9PSJsb25nIikgewotCQkgIGluZGVudChvdXQpIDw8ICJfX2lzc2V0X2JpdGZpZWxkID0gaW4ucmVhZExvbmcoKTsiIDw8IGVuZGw7Ci0JICB9Ci0JICBvdXQgPDwgZW5kbDsKLQkgIGJyZWFrOwotICBjYXNlIElTU0VUX0JJVFNFVDoKLQkgIGluZGVudChvdXQpIDw8ICIvL0JpdFNldCIgPDwgZW5kbDsKLQkgIGluZGVudChvdXQpIDw8ICJfX2lzc2V0X2JpdF92ZWN0b3IgPSAoQml0U2V0KSBpbi5yZWFkU2VyaWFsaXphYmxlKCk7IiA8PCBlbmRsOwotCSAgb3V0IDw8IGVuZGw7Ci0JICBicmVhazsKLSAgfQotICAvL3JlYWQgYWxsIHRoZSBmaWVsZHMKLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotCSAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOwotCSAgc3RyaW5nIG5hbWUgPSAoKm1faXRlciktPmdldF9uYW1lKCk7Ci0JICBzdHJpbmcgcHJlZml4ID0gInRoaXMuIiArIG5hbWU7Ci0KLQkgIGlmKHQtPmlzX3N0cnVjdCgpKSB7Ci0JCSAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICI9IGluLnJlYWRQYXJjZWxhYmxlKCIgPDwgdG5hbWUgPDwgIi5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKTsiIDw8IGVuZGw7Ci0JICB9IGVsc2UgaWYodC0+aXNfZW51bSgpKSB7Ci0JCSAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIgPSAiIDw8IHR5cGVfbmFtZSh0KSA8PCAiLmZpbmRCeVZhbHVlKGluLnJlYWRJbnQoKSk7IiA8PCBlbmRsOwotCSAgfSBlbHNlIGlmKHQtPmlzX2xpc3QoKSkgewotCQkgIHRfbGlzdCogbGlzdCA9ICh0X2xpc3QqKXQ7Ci0JCSAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodCwgZmFsc2UsIHRydWUpIDw8ICIoKTsiIDw8IGVuZGw7Ci0JCSAgaWYobGlzdC0+Z2V0X2VsZW1fdHlwZSgpLT5nZXRfdHJ1ZV90eXBlKCktPmlzX3N0cnVjdCgpKSB7Ci0JCQkgIGluZGVudChvdXQpIDw8ICJpbi5yZWFkVHlwZWRMaXN0KCIgPDwgcHJlZml4IDw8ICIsICIgPDwgdHlwZV9uYW1lKGxpc3QtPmdldF9lbGVtX3R5cGUoKSkgPDwgIi5DUkVBVE9SKTsiIDw8IGVuZGw7Ci0JCSAgfSBlbHNlIHsKLQkJCSAgaW5kZW50KG91dCkgPDwgImluLnJlYWRMaXN0KCIgPDwgcHJlZml4IDw8ICIsICIgPDwgdG5hbWUgPDwgIi5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKTsiIDw8IGVuZGw7Ci0JCSAgfQotCSAgfSBlbHNlIGlmKHQtPmlzX21hcCgpKSB7Ci0JCSAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodCwgZmFsc2UsIHRydWUpIDw8ICIoKTsiIDw8IGVuZGw7Ci0JCSAgaW5kZW50KG91dCkgPDwgIiBpbi5yZWFkTWFwKCIgPDwgcHJlZml4IDw8ICIsICIgPDwgdG5hbWUgPDwgIi5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKTsiIDw8IGVuZGw7Ci0JICB9IGVsc2UgaWYodHlwZV9uYW1lKHQpPT0iZmxvYXQiKSB7Ci0JCSAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIgPSBpbi5yZWFkRmxvYXQoKTsiIDw8IGVuZGw7Ci0JICB9IGVsc2UgaWYodC0+aXNfYmFzZV90eXBlKCkpIHsKLQkJICB0X2Jhc2VfdHlwZSogYnQgPSAodF9iYXNlX3R5cGUqKXQ7Ci0JCSAgaWYgKGJ0LT5pc19iaW5hcnkoKSkgewotCQkJICBpbmRlbnQob3V0KSA8PCAiaWYoaW4ucmVhZEludCgpPT0xKSB7IiA8PCBlbmRsOwotCQkJICBpbmRlbnRfdXAoKTsKLQkJCSAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIgPSBCeXRlQnVmZmVyLndyYXAoaW4uY3JlYXRlQnl0ZUFycmF5KCkpOyIgPDwgZW5kbDsKLQkJCSAgc2NvcGVfZG93bihvdXQpOwotCQkgIH0gZWxzZSB7Ci0JCQkgIHN3aXRjaChidC0+Z2V0X2Jhc2UoKSkgewotCQkJICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLQkJCQkgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiID0gKHNob3J0KSBpbi5yZWFkSW50KCk7IiA8PCBlbmRsOwotCQkJCSAgYnJlYWs7Ci0JCQkgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotCQkJCSAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIgPSBpbi5yZWFkSW50KCk7IiA8PCBlbmRsOwotCQkJCSAgYnJlYWs7Ci0JCQkgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotCQkJCSAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIgPSBpbi5yZWFkTG9uZygpOyIgPDwgZW5kbDsKLQkJCQkgIGJyZWFrOwotCQkJICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0JCQkJICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiA9IChpbi5yZWFkSW50KCk9PTEpOyIgPDwgZW5kbDsKLQkJCQkgIGJyZWFrOwotCQkJICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0JCQkJICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiA9IGluLnJlYWRCeXRlKCk7IiA8PCBlbmRsOwotCQkJCSAgYnJlYWs7Ci0JCQkgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotCQkJCSAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIgPSBpbi5yZWFkRG91YmxlKCk7IiA8PCBlbmRsOwotCQkJCSAgYnJlYWs7Ci0JCQkgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotCQkJCSAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICI9IGluLnJlYWRTdHJpbmcoKTsiIDw8IGVuZGw7Ci0JCQkJICBicmVhazsKLQkJCSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotCQkJCSAgYnJlYWs7Ci0JCQkgIH0KLQkJICB9Ci0JICB9Ci0gIH0KLQotICBzY29wZV9kb3duKG91dCk7Ci0gIG91dCA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQub3MuUGFyY2VsYWJsZS5DcmVhdG9yPCIgPDwgdG5hbWUgPDwgIj4gQ1JFQVRPUiA9IG5ldyBhbmRyb2lkLm9zLlBhcmNlbGFibGUuQ3JlYXRvcjwiIDw8IHRuYW1lIDw8ICI+KCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJwdWJsaWMgIiA8PCB0bmFtZSA8PCAiW10gbmV3QXJyYXkoaW50IHNpemUpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIG5ldyAiIDw8IHRuYW1lIDw8ICJbc2l6ZV07IiA8PCBlbmRsOwotICBzY29wZV9kb3duKG91dCk7Ci0gIG91dCA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInB1YmxpYyAiIDw8IHRuYW1lIDw8ICIgY3JlYXRlRnJvbVBhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCBpbikgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJyZXR1cm4gbmV3ICIgPDwgdG5hbWUgPDwgIihpbik7IiA8PCBlbmRsOwotICBzY29wZV9kb3duKG91dCk7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn07IiA8PCBlbmRsOwotICBvdXQgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgZXF1YWxzIG1ldGhvZHMgYW5kIGEgaGFzaENvZGUgbWV0aG9kIGZvciBhIHN0cnVjdHVyZS4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF9lcXVhbGl0eShvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgewotICBvdXQgPDwgaW5kZW50KCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IHRoYXQpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAiaWYgKHRoYXQgPT0gbnVsbCkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gZmFsc2U7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImlmICh0aGF0IGluc3RhbmNlb2YgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIpIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRoaXMuZXF1YWxzKCgiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIil0aGF0KTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAicmV0dXJuIGZhbHNlOyIgPDwgZW5kbDsKLSAgc2NvcGVfZG93bihvdXQpOwotICBvdXQgPDwgZW5kbDsKLQotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAicHVibGljIGJvb2xlYW4gZXF1YWxzKCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIHRoYXQpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAiaWYgKHRoYXQgPT0gbnVsbCkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gZmFsc2U7IiA8PCBlbmRsOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBvdXQgPDwgZW5kbDsKLQotICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICAvLyBNb3N0IGV4aXN0aW5nIFRocmlmdCBjb2RlIGRvZXMgbm90IHVzZSBpc3NldCBvciBvcHRpb25hbC9yZXF1aXJlZCwKLSAgICAvLyBzbyB3ZSB0cmVhdCAiZGVmYXVsdCIgZmllbGRzIGFzIHJlcXVpcmVkLgotICAgIGJvb2wgaXNfb3B0aW9uYWwgPSAoKm1faXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMOwotICAgIGJvb2wgY2FuX2JlX251bGwgPSB0eXBlX2Nhbl9iZV9udWxsKHQpOwotICAgIHN0cmluZyBuYW1lID0gKCptX2l0ZXIpLT5nZXRfbmFtZSgpOwotCi0gICAgc3RyaW5nIHRoaXNfcHJlc2VudCA9ICJ0cnVlIjsKLSAgICBzdHJpbmcgdGhhdF9wcmVzZW50ID0gInRydWUiOwotICAgIHN0cmluZyB1bmVxdWFsOwotCi0gICAgaWYgKGlzX29wdGlvbmFsIHx8IGNhbl9iZV9udWxsKSB7Ci0gICAgICB0aGlzX3ByZXNlbnQgKz0gIiAmJiB0aGlzLiIgKyBnZW5lcmF0ZV9pc3NldF9jaGVjaygqbV9pdGVyKTsKLSAgICAgIHRoYXRfcHJlc2VudCArPSAiICYmIHRoYXQuIiArIGdlbmVyYXRlX2lzc2V0X2NoZWNrKCptX2l0ZXIpOwotICAgIH0KLQotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgImJvb2xlYW4gdGhpc19wcmVzZW50XyIgPDwgbmFtZSA8PCAiID0gIgotICAgICAgPDwgdGhpc19wcmVzZW50IDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiYm9vbGVhbiB0aGF0X3ByZXNlbnRfIiA8PCBuYW1lIDw8ICIgPSAiCi0gICAgICA8PCB0aGF0X3ByZXNlbnQgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJpZiAoIiA8PCAidGhpc19wcmVzZW50XyIgPDwgbmFtZQotICAgICAgPDwgIiB8fCB0aGF0X3ByZXNlbnRfIiA8PCBuYW1lIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWYgKCEoIiA8PCAidGhpc19wcmVzZW50XyIgPDwgbmFtZQotICAgICAgPDwgIiAmJiB0aGF0X3ByZXNlbnRfIiA8PCBuYW1lIDw8ICIpKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGZhbHNlOyIgPDwgZW5kbDsKLQotICAgIGlmICh0LT5pc19iYXNlX3R5cGUoKSAmJiAoKHRfYmFzZV90eXBlKil0KS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgIHVuZXF1YWwgPSAiIXRoaXMuIiArIG5hbWUgKyAiLmVxdWFscyh0aGF0LiIgKyBuYW1lICsgIikiOwotICAgIH0gZWxzZSBpZiAoY2FuX2JlX251bGwpIHsKLSAgICAgIHVuZXF1YWwgPSAiIXRoaXMuIiArIG5hbWUgKyAiLmVxdWFscyh0aGF0LiIgKyBuYW1lICsgIikiOwotICAgIH0gZWxzZSB7Ci0gICAgICB1bmVxdWFsID0gInRoaXMuIiArIG5hbWUgKyAiICE9IHRoYXQuIiArIG5hbWU7Ci0gICAgfQotCi0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWYgKCIgPDwgdW5lcXVhbCA8PCAiKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGZhbHNlOyIgPDwgZW5kbDsKLQotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgfQotICBvdXQgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInJldHVybiB0cnVlOyIgPDwgZW5kbDsKLSAgc2NvcGVfZG93bihvdXQpOwotICBvdXQgPDwgZW5kbDsKLQotICBvdXQgPDwgaW5kZW50KCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJwdWJsaWMgaW50IGhhc2hDb2RlKCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJMaXN0PE9iamVjdD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOyIgPDwgZW5kbDsKLQotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgb3V0IDw8IGVuZGw7Ci0KLSAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgYm9vbCBpc19vcHRpb25hbCA9ICgqbV9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUw7Ci0gICAgYm9vbCBjYW5fYmVfbnVsbCA9IHR5cGVfY2FuX2JlX251bGwodCk7Ci0gICAgc3RyaW5nIG5hbWUgPSAoKm1faXRlciktPmdldF9uYW1lKCk7Ci0KLSAgICBzdHJpbmcgcHJlc2VudCA9ICJ0cnVlIjsKLQotICAgIGlmIChpc19vcHRpb25hbCB8fCBjYW5fYmVfbnVsbCkgewotICAgICAgcHJlc2VudCArPSAiICYmICgiICsgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKm1faXRlcikgKyAiKSI7Ci0gICAgfQotCi0gICAgaW5kZW50KG91dCkgPDwgImJvb2xlYW4gcHJlc2VudF8iIDw8IG5hbWUgPDwgIiA9ICIgPDwgcHJlc2VudCA8PCAiOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAibGlzdC5hZGQocHJlc2VudF8iIDw8IG5hbWUgPDwgIik7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJpZiAocHJlc2VudF8iIDw8IG5hbWUgPDwgIikiIDw8IGVuZGw7Ci0gICAgaWYgKHQtPmlzX2VudW0oKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIiAgbGlzdC5hZGQoIiA8PCBuYW1lIDw8ICIuZ2V0VmFsdWUoKSk7IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICBsaXN0LmFkZCgiIDw8IG5hbWUgPDwgIik7IiA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIG91dCA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIGxpc3QuaGFzaENvZGUoKTsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfY29tcGFyZV90byhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBpbmRlbnQob3V0KSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicHVibGljIGludCBjb21wYXJlVG8oIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIiBvdGhlcikgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgImlmICghZ2V0Q2xhc3MoKS5lcXVhbHMob3RoZXIuZ2V0Q2xhc3MoKSkpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKS5jb21wYXJlVG8ob3RoZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gIG91dCA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJpbnQgbGFzdENvbXBhcmlzb24gPSAwOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGVuZGw7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIHRfZmllbGQqIGZpZWxkID0gKm1faXRlcjsKLSAgICBpbmRlbnQob3V0KSA8PCAibGFzdENvbXBhcmlzb24gPSBCb29sZWFuLnZhbHVlT2YoIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjayhmaWVsZCkgPDwgIikuY29tcGFyZVRvKG90aGVyLiIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQpIDw8ICIpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIGxhc3RDb21wYXJpc29uOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjayhmaWVsZCkgPDwgIikgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICBsYXN0Q29tcGFyaXNvbiA9IG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLmNvbXBhcmVUbyh0aGlzLiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiwgb3RoZXIuIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgICByZXR1cm4gbGFzdENvbXBhcmlzb247IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgIH0iIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIDA7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gcmVhZCBhbGwgdGhlIGZpZWxkcyBvZiB0aGUgc3RydWN0LgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X3JlYWRlcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgKHZvaWQpIHRzdHJ1Y3Q7Ci0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCByZWFkKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBpcHJvdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJzY2hlbWVzLmdldChpcHJvdC5nZXRTY2hlbWUoKSkuZ2V0U2NoZW1lKCkucmVhZChpcHJvdCwgdGhpcyk7IiA8PCBlbmRsOyAKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgZW5kbDsKLX0KLQotLy8gZ2VuZXJhdGVzIGphdmEgbWV0aG9kIHRvIHBlcmZvcm0gdmFyaW91cyBjaGVja3MKLS8vIChlLmcuIGNoZWNrIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgc2V0KQotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3ZhbGlkYXRvcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCl7Ci0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCB2YWxpZGF0ZSgpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBvdXQgPDwgaW5kZW50KCkgPDwgIi8vIGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMiIDw8IGVuZGw7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKLSAgICAgIGlmIChiZWFuX3N0eWxlXykgewotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKCEiIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKCpmX2l0ZXIpIDw8ICIpIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICB0aHJvdyBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sRXhjZXB0aW9uKFwiUmVxdWlyZWQgZmllbGQgJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInIGlzIHVuc2V0ISBTdHJ1Y3Q6XCIgKyB0b1N0cmluZygpKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICAgICAgfSBlbHNlewotICAgICAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpKSB7Ci0gICAgICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID09IG51bGwpIHsiIDw8IGVuZGw7Ci0gICAgICAgICAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbEV4Y2VwdGlvbihcIlJlcXVpcmVkIGZpZWxkICciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJyB3YXMgbm90IHByZXNlbnQhIFN0cnVjdDogXCIgKyB0b1N0cmluZygpKTsiIDw8IGVuZGw7Ci0gICAgICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaW5kZW50KG91dCkgPDwgIi8vIGFsYXMsIHdlIGNhbm5vdCBjaGVjayAnIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIicgYmVjYXVzZSBpdCdzIGEgcHJpbWl0aXZlIGFuZCB5b3UgY2hvc2UgdGhlIG5vbi1iZWFucyBnZW5lcmF0b3IuIiA8PCBlbmRsOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgb3V0IDw8IGluZGVudCgpIDw8ICIvLyBjaGVjayBmb3Igc3ViLXN0cnVjdCB2YWxpZGl0eSIgPDwgZW5kbDsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X3R5cGUqIHR5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7Ci0gICAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpICYmICEgKCh0X3N0cnVjdCopdHlwZSktPmlzX3VuaW9uKCkpIHsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIT0gbnVsbCkgeyIgPDwgZW5kbDsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICAiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiLnZhbGlkYXRlKCk7IiA8PCBlbmRsOwotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gd3JpdGUgYWxsIHRoZSBmaWVsZHMgb2YgdGhlIHN0cnVjdAotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X3dyaXRlcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgKHZvaWQpIHRzdHJ1Y3Q7Ci0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCB3cml0ZShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgb3Byb3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAic2NoZW1lcy5nZXQob3Byb3QuZ2V0U2NoZW1lKCkpLmdldFNjaGVtZSgpLndyaXRlKG9wcm90LCB0aGlzKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbiB0byB3cml0ZSBhbGwgdGhlIGZpZWxkcyBvZiB0aGUgc3RydWN0LAotICogd2hpY2ggaXMgYSBmdW5jdGlvbiByZXN1bHQuIFRoZXNlIGZpZWxkcyBhcmUgb25seSB3cml0dGVuCi0gKiBpZiB0aGV5IGFyZSBzZXQgaW4gdGhlIElzc2V0IGFycmF5LCBhbmQgb25seSBvbmUgb2YgdGhlbQotICogY2FuIGJlIHNldCBhdCBhIHRpbWUuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gICh2b2lkKSB0c3RydWN0OwotICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZvaWQgd3JpdGUob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIG9wcm90KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgInNjaGVtZXMuZ2V0KG9wcm90LmdldFNjaGVtZSgpKS5nZXRTY2hlbWUoKS53cml0ZShvcHJvdCwgdGhpcyk7IiA8PCBlbmRsOwotICAKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIiAgfSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X2ZpZWxkX2J5X2lkKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gICh2b2lkKSB0c3RydWN0OwotICBpbmRlbnQob3V0KSA8PCAicHVibGljIF9GaWVsZHMgZmllbGRGb3JJZChpbnQgZmllbGRJZCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIF9GaWVsZHMuZmluZEJ5VGhyaWZ0SWQoZmllbGRJZCk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3JlZmxlY3Rpb25fZ2V0dGVycyhvc3RyaW5nc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSwgc3RyaW5nIGZpZWxkX25hbWUsIHN0cmluZyBjYXBfbmFtZSkgewotICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IGNvbnN0YW50X25hbWUoZmllbGRfbmFtZSkgPDwgIjoiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiAhdHlwZS0+aXNfc3RyaW5nKCkpIHsKLSAgICB0X2Jhc2VfdHlwZSogYmFzZV90eXBlID0gKHRfYmFzZV90eXBlKil0eXBlOwotCi0gICAgaW5kZW50KG91dCkgPDwgInJldHVybiAiIDw8IHR5cGVfbmFtZSh0eXBlLCB0cnVlLCBmYWxzZSkgPDwgIi52YWx1ZU9mKCIgPDwgKGJhc2VfdHlwZS0+aXNfYm9vbCgpID8gImlzIiA6ICJnZXQiKSA8PCBjYXBfbmFtZSA8PCAiKCkpOyIgPDwgZW5kbCA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gZ2V0IiA8PCBjYXBfbmFtZSA8PCAiKCk7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3JlZmxlY3Rpb25fc2V0dGVycyhvc3RyaW5nc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSwgc3RyaW5nIGZpZWxkX25hbWUsIHN0cmluZyBjYXBfbmFtZSkgewotICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IGNvbnN0YW50X25hbWUoZmllbGRfbmFtZSkgPDwgIjoiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAiaWYgKHZhbHVlID09IG51bGwpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHVuc2V0IiA8PCBnZXRfY2FwX25hbWUoZmllbGRfbmFtZSkgPDwgIigpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICBzZXQiIDw8IGNhcF9uYW1lIDw8ICIoKCIgPDwgdHlwZV9uYW1lKHR5cGUsIHRydWUsIGZhbHNlKSA8PCAiKXZhbHVlKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiYnJlYWs7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLX0KLQotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nZW5lcmljX2ZpZWxkX2dldHRlcnNfc2V0dGVycyhzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBnZXR0ZXJfc3RyZWFtOwotICBzdGQ6Om9zdHJpbmdzdHJlYW0gc2V0dGVyX3N0cmVhbTsKLQotICAvLyBidWlsZCB1cCB0aGUgYm9kaWVzIG9mIGJvdGggdGhlIGdldHRlciBhbmQgc2V0dGVyIGF0IG9uY2UKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfZmllbGQqIGZpZWxkID0gKmZfaXRlcjsKLSAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKGZpZWxkLT5nZXRfdHlwZSgpKTsKLSAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lID0gZmllbGQtPmdldF9uYW1lKCk7Ci0gICAgc3RkOjpzdHJpbmcgY2FwX25hbWUgPSBnZXRfY2FwX25hbWUoZmllbGRfbmFtZSk7Ci0KLSAgICBpbmRlbnRfdXAoKTsKLSAgICBnZW5lcmF0ZV9yZWZsZWN0aW9uX3NldHRlcnMoc2V0dGVyX3N0cmVhbSwgdHlwZSwgZmllbGRfbmFtZSwgY2FwX25hbWUpOwotICAgIGdlbmVyYXRlX3JlZmxlY3Rpb25fZ2V0dGVycyhnZXR0ZXJfc3RyZWFtLCB0eXBlLCBmaWVsZF9uYW1lLCBjYXBfbmFtZSk7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfQotCi0KLSAgLy8gY3JlYXRlIHRoZSBzZXR0ZXIKLQotICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZvaWQgc2V0RmllbGRWYWx1ZShfRmllbGRzIGZpZWxkLCBPYmplY3QgdmFsdWUpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHN3aXRjaCAoZmllbGQpIHsiIDw8IGVuZGw7Ci0gIG91dCA8PCBzZXR0ZXJfc3RyZWFtLnN0cigpOwotICBpbmRlbnQob3V0KSA8PCAiICB9IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIC8vIGNyZWF0ZSB0aGUgZ2V0dGVyCi0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgT2JqZWN0IGdldEZpZWxkVmFsdWUoX0ZpZWxkcyBmaWVsZCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKGZpZWxkKSB7IiA8PCBlbmRsOwotICBvdXQgPDwgZ2V0dGVyX3N0cmVhbS5zdHIoKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vLyBDcmVhdGVzIGEgZ2VuZXJpYyBpc1NldCBtZXRob2QgdGhhdCB0YWtlcyB0aGUgZmllbGQgbnVtYmVyIGFzIGFyZ3VtZW50Ci12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2dlbmVyaWNfaXNzZXRfbWV0aG9kKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgLy8gY3JlYXRlIHRoZSBpc1NldCBtZXRob2QKLSAgaW5kZW50KG91dCkgPDwgIi8qKiBSZXR1cm5zIHRydWUgaWYgZmllbGQgY29ycmVzcG9uZGluZyB0byBmaWVsZElEIGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSB2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZSAqLyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBib29sZWFuIGlzU2V0KF9GaWVsZHMgZmllbGQpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAiaWYgKGZpZWxkID09IG51bGwpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmllbGQpIHsiIDw8IGVuZGw7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X2ZpZWxkKiBmaWVsZCA9ICpmX2l0ZXI7Ci0gICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiOiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuICIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQpIDw8ICI7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0KLQotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2V0IG9mIEphdmEgQmVhbiBib2lsZXJwbGF0ZSBmdW5jdGlvbnMgKHNldHRlcnMsIGdldHRlcnMsIGV0Yy4pCi0gKiBmb3IgdGhlIGdpdmVuIHN0cnVjdC4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX2JlYW5fYm9pbGVycGxhdGUob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGlzc2V0X3R5cGUgaXNzZXRUeXBlID0gbmVlZHNfaXNzZXQodHN0cnVjdCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X2ZpZWxkKiBmaWVsZCA9ICpmX2l0ZXI7Ci0gICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZShmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0gICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9IGZpZWxkLT5nZXRfbmFtZSgpOwotICAgIHN0ZDo6c3RyaW5nIGNhcF9uYW1lID0gZ2V0X2NhcF9uYW1lKGZpZWxkX25hbWUpOwotCi0gICAgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgICAvLyBNZXRob2QgdG8gcmV0dXJuIHRoZSBzaXplIG9mIHRoZSBjb2xsZWN0aW9uCi0gICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGludCBnZXQiIDw8IGNhcF9uYW1lOwotICAgICAgb3V0IDw8IGdldF9jYXBfbmFtZSgic2l6ZSgpIHsiKSA8PCBlbmRsOwotCi0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gKHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPT0gbnVsbCkgPyAwIDogIiA8PAotICAgICAgICAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIi5zaXplKCk7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgaWYgKHR5cGUtPmlzX3NldCgpIHx8IHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgdF90eXBlKiBlbGVtZW50X3R5cGU7Ci0gICAgICBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgICAgZWxlbWVudF90eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGVsZW1lbnRfdHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgICAgfQotCi0gICAgICAvLyBJdGVyYXRvciBnZXR0ZXIgZm9yIHNldHMgYW5kIGxpc3RzCi0gICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGphdmEudXRpbC5JdGVyYXRvcjwiIDw8Ci0gICAgICAgIHR5cGVfbmFtZShlbGVtZW50X3R5cGUsIHRydWUsIGZhbHNlKSA8PCAgIj4gZ2V0IiA8PCBjYXBfbmFtZTsKLSAgICAgIG91dCA8PCBnZXRfY2FwX25hbWUoIml0ZXJhdG9yKCkgeyIpIDw8IGVuZGw7Ci0KLSAgICAgIGluZGVudF91cCgpOwotICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiAodGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9PSBudWxsKSA/IG51bGwgOiAiIDw8Ci0gICAgICAgICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiLml0ZXJhdG9yKCk7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICAgIC8vIEFkZCB0byBzZXQgb3IgbGlzdCwgY3JlYXRlIGlmIHRoZSBzZXQvbGlzdCBpcyBudWxsCi0gICAgICBpbmRlbnQob3V0KTsKLSAgICAgIG91dCA8PCAicHVibGljIHZvaWQgYWRkIiA8PCBnZXRfY2FwX25hbWUoInRvIik7Ci0gICAgICBvdXQgPDwgY2FwX25hbWUgPDwgIigiIDw8IHR5cGVfbmFtZShlbGVtZW50X3R5cGUpIDw8ICIgZWxlbSkgeyIgPDwgZW5kbDsKLQotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPT0gbnVsbCkgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8Ci0gICAgICAgICIoKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIi5hZGQoZWxlbSk7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgICAgLy8gUHV0IHRvIG1hcAotICAgICAgdF90eXBlKiBrZXlfdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKLSAgICAgIHRfdHlwZSogdmFsX3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0KLSAgICAgIGluZGVudChvdXQpOwotICAgICAgb3V0IDw8ICJwdWJsaWMgdm9pZCBwdXQiIDw8IGdldF9jYXBfbmFtZSgidG8iKTsKLSAgICAgIG91dCA8PCBjYXBfbmFtZSA8PCAiKCIgPDwgdHlwZV9uYW1lKGtleV90eXBlKSA8PCAiIGtleSwgIgotICAgICAgICA8PCB0eXBlX25hbWUodmFsX3R5cGUpIDw8ICIgdmFsKSB7IiA8PCBlbmRsOwotCi0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJpZiAodGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9PSBudWxsKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9IG5ldyAiIDw8Ci0gICAgICAgIHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiLnB1dChrZXksIHZhbCk7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgLy8gU2ltcGxlIGdldHRlcgotICAgIGdlbmVyYXRlX2phdmFfZG9jKG91dCwgZmllbGQpOwotICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiAoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgYnl0ZVtdIGdldCIgPDwgY2FwX25hbWUgPDwgIigpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICBzZXQiIDw8IGNhcF9uYW1lIDw8ICIob3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIucmlnaHRTaXplKCIgPDwgZmllbGRfbmFtZSA8PCAiKSk7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuICIgPDwgZmllbGRfbmFtZSA8PCAiID09IG51bGwgPyBudWxsIDogIiA8PCBmaWVsZF9uYW1lIDw8ICIuYXJyYXkoKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIEJ5dGVCdWZmZXIgYnVmZmVyIiA8PCBnZXRfY2FwX25hbWUoImZvciIpIDw8IGNhcF9uYW1lIDw8ICIoKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLmNvcHlCaW5hcnkoIiA8PCBmaWVsZF9uYW1lIDw8ICIpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0eXBlX25hbWUodHlwZSk7Ci0gICAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgJiYKLSAgICAgICAgICAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MKSB7Ci0gICAgICAgIG91dCA8PCAiIGlzIjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PCAiIGdldCI7Ci0gICAgICB9Ci0gICAgICBvdXQgPDwgY2FwX25hbWUgPDwgIigpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICAvLyBTaW1wbGUgc2V0dGVyCi0gICAgZ2VuZXJhdGVfamF2YV9kb2Mob3V0LCBmaWVsZCk7Ci0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmICgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiOwotICAgICAgaWYgKGJlYW5fc3R5bGVfKSB7Ci0gICAgICAgIG91dCA8PCAidm9pZCI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpOwotICAgICAgfQotICAgICAgb3V0IDw8ICIgc2V0IiA8PCBjYXBfbmFtZSA8PCAiKGJ5dGVbXSAiIDw8IGZpZWxkX25hbWUgPDwgIikgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgIHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSAiCi0gICAgICAgIDw8IGZpZWxkX25hbWUgPDwgIiA9PSBudWxsID8gKEJ5dGVCdWZmZXIpbnVsbCIKLSAgICAgICAgPDwgIiA6IEJ5dGVCdWZmZXIud3JhcChBcnJheXMuY29weU9mKCIKLSAgICAgICAgPDwgZmllbGRfbmFtZSA8PCAiLCAiIDw8IGZpZWxkX25hbWUgPDwgIi5sZW5ndGgpKTsiIDw8IGVuZGw7Ci0gICAgICBpZiAoIWJlYW5fc3R5bGVfKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiB0aGlzOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIjsKLSAgICBpZiAoYmVhbl9zdHlsZV8pIHsKLSAgICAgIG91dCA8PCAidm9pZCI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dCA8PCB0eXBlX25hbWUodHN0cnVjdCk7Ci0gICAgfQotICAgIG91dCA8PCAiIHNldCIgPDwgY2FwX25hbWUgPDwgIigiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiICIgPDwgZmllbGRfbmFtZSA8PCAiKSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID0gIjsKLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICBvdXQgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLmNvcHlCaW5hcnkoIiA8PCBmaWVsZF9uYW1lIDw8ICIpIjsKLSAgICB9IGVsc2UgewotICAgICAgb3V0IDw8IGZpZWxkX25hbWU7Ci0gICAgfQotICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKLSAgICBnZW5lcmF0ZV9pc3NldF9zZXQob3V0LCBmaWVsZCwgIiIpOwotICAgIGlmICghYmVhbl9zdHlsZV8pIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdGhpczsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gICAgLy8gVW5zZXR0ZXIKLSAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZvaWQgdW5zZXQiIDw8IGNhcF9uYW1lIDw8ICIoKSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKHR5cGUpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9IG51bGw7IiA8PCBlbmRsOwotICAgIH0gZWxzZSBpZihpc3NldFR5cGUgPT0gSVNTRVRfUFJJTUlUSVZFKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiX19pc3NldF9iaXRmaWVsZCA9IEVuY29kaW5nVXRpbHMuY2xlYXJCaXQoX19pc3NldF9iaXRmaWVsZCwgIiA8PCBpc3NldF9maWVsZF9pZChmaWVsZCkgPDwgIik7IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiX19pc3NldF9iaXRfdmVjdG9yLmNsZWFyKCIgPDwgaXNzZXRfZmllbGRfaWQoZmllbGQpIDw8ICIpOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gICAgLy8gaXNTZXQgbWV0aG9kCi0gICAgaW5kZW50KG91dCkgPDwgIi8qKiBSZXR1cm5zIHRydWUgaWYgZmllbGQgIiA8PCBmaWVsZF9uYW1lIDw8ICIgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlICovIiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgYm9vbGVhbiBpcyIgPDwgZ2V0X2NhcF9uYW1lKCJzZXQiKSA8PCBjYXBfbmFtZSA8PCAiKCkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0eXBlKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiB0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiICE9IG51bGw7IiA8PCBlbmRsOwotICAgIH0gZWxzZSBpZihpc3NldFR5cGUgPT0gSVNTRVRfUFJJTUlUSVZFKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIEVuY29kaW5nVXRpbHMudGVzdEJpdChfX2lzc2V0X2JpdGZpZWxkLCAiIDw8IGlzc2V0X2ZpZWxkX2lkKGZpZWxkKSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gX19pc3NldF9iaXRfdmVjdG9yLmdldCgiIDw8IGlzc2V0X2ZpZWxkX2lkKGZpZWxkKSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCBzZXQiIDw8IGNhcF9uYW1lIDw8IGdldF9jYXBfbmFtZSgiaXNTZXQiKSA8PCAiKGJvb2xlYW4gdmFsdWUpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaWYgKHR5cGVfY2FuX2JlX251bGwodHlwZSkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIXZhbHVlKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIiAgdGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9IG51bGw7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfSBlbHNlIGlmKGlzc2V0VHlwZSA9PSBJU1NFVF9QUklNSVRJVkUpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJfX2lzc2V0X2JpdGZpZWxkID0gRW5jb2RpbmdVdGlscy5zZXRCaXQoX19pc3NldF9iaXRmaWVsZCwgIiA8PCBpc3NldF9maWVsZF9pZChmaWVsZCkgPDwgIiwgdmFsdWUpOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwgIl9faXNzZXRfYml0X3ZlY3Rvci5zZXQoIiA8PCBpc3NldF9maWVsZF9pZChmaWVsZCkgPDwgIiwgdmFsdWUpOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOyAKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHRvU3RyaW5nKCkgbWV0aG9kIGZvciB0aGUgZ2l2ZW4gc3RydWN0Ci0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfdG9zdHJpbmcob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAicHVibGljIFN0cmluZyB0b1N0cmluZygpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoXCIiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIihcIik7IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgImJvb2xlYW4gZmlyc3QgPSB0cnVlOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgYm9vbCBjb3VsZF9iZV91bnNldCA9ICgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUw7Ci0gICAgaWYoY291bGRfYmVfdW5zZXQpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygqZl9pdGVyKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgfQotCi0gICAgdF9maWVsZCogZmllbGQgPSAoKmZfaXRlcik7Ci0KLSAgICBpZiAoIWZpcnN0KSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCFmaXJzdCkgc2IuYXBwZW5kKFwiLCBcIik7IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnQob3V0KSA8PCAic2IuYXBwZW5kKFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIjpcIik7IiA8PCBlbmRsOwotICAgIGJvb2wgY2FuX2JlX251bGwgPSB0eXBlX2Nhbl9iZV9udWxsKGZpZWxkLT5nZXRfdHlwZSgpKTsKLSAgICBpZiAoY2FuX2JlX251bGwpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJpZiAodGhpcy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID09IG51bGwpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICBzYi5hcHBlbmQoXCJudWxsXCIpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgIH0KLQotICAgIGlmIChmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfYmFzZV90eXBlKCkgJiYgKCh0X2Jhc2VfdHlwZSopKGZpZWxkLT5nZXRfdHlwZSgpKSktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAib3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIudG9TdHJpbmcodGhpcy4iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIsIHNiKTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJzYi5hcHBlbmQodGhpcy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgaWYgKGNhbl9iZV9udWxsKSB7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudChvdXQpIDw8ICJmaXJzdCA9IGZhbHNlOyIgPDwgZW5kbDsKLQotICAgIGlmKGNvdWxkX2JlX3Vuc2V0KSB7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICAgIGZpcnN0ID0gZmFsc2U7Ci0gIH0KLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgInNiLmFwcGVuZChcIilcIik7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInJldHVybiBzYi50b1N0cmluZygpOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0YXRpYyBtYXAgd2l0aCBtZXRhIGRhdGEgdG8gc3RvcmUgaW5mb3JtYXRpb24gc3VjaCBhcyBmaWVsZElEIHRvCi0gKiBmaWVsZE5hbWUgbWFwcGluZwotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfbWV0YV9kYXRhX21hcChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIC8vIFN0YXRpYyBNYXAgd2l0aCBmaWVsZElEIC0+IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhIG1hcHBpbmdzCi0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgc3RhdGljIGZpbmFsIE1hcDxfRmllbGRzLCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YT4gbWV0YURhdGFNYXA7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAic3RhdGljIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChvdXQpIDw8ICJNYXA8X0ZpZWxkcywgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGE+IHRtcE1hcCA9IG5ldyBFbnVtTWFwPF9GaWVsZHMsIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhPihfRmllbGRzLmNsYXNzKTsiIDw8IGVuZGw7Ci0KLSAgLy8gUG9wdWxhdGUgbWFwCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9maWVsZCogZmllbGQgPSAqZl9pdGVyOwotICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSBmaWVsZC0+Z2V0X25hbWUoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAidG1wTWFwLnB1dChfRmllbGRzLiIgPDwgY29uc3RhbnRfbmFtZShmaWVsZF9uYW1lKSA8PCAiLCBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGEoXCIiIDw8IGZpZWxkX25hbWUgPDwgIlwiLCAiOwotCi0gICAgLy8gU2V0IGZpZWxkIHJlcXVpcmVtZW50IHR5cGUgKHJlcXVpcmVkLCBvcHRpb25hbCwgZXRjLikKLSAgICBpZiAoZmllbGQtPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7Ci0gICAgICBvdXQgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LlRGaWVsZFJlcXVpcmVtZW50VHlwZS5SRVFVSVJFRCwgIjsKLSAgICB9IGVsc2UgaWYgKGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTCkgewotICAgICAgb3V0IDw8ICJvcmcuYXBhY2hlLnRocmlmdC5URmllbGRSZXF1aXJlbWVudFR5cGUuT1BUSU9OQUwsICI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dCA8PCAib3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkUmVxdWlyZW1lbnRUeXBlLkRFRkFVTFQsICI7Ci0gICAgfQotCi0gICAgLy8gQ3JlYXRlIHZhbHVlIG1ldGEgZGF0YQotICAgIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShvdXQsIGZpZWxkLT5nZXRfdHlwZSgpKTsKLSAgICBvdXQgIDw8ICIpKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnQob3V0KSA8PCAibWV0YURhdGFNYXAgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAodG1wTWFwKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgIm9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhLmFkZFN0cnVjdE1ldGFEYXRhTWFwKCIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIuY2xhc3MsIG1ldGFEYXRhTWFwKTsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKiAKLSAqIFJldHVybnMgYSBzdHJpbmcgd2l0aCB0aGUgamF2YSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gdGhyaWZ0IHR5cGUKLSAqIChlLmcuIGZvciB0aGUgdHlwZSBzdHJ1Y3QgaXQgcmV0dXJucyAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSVUNUIikKLSAqLwotc3RkOjpzdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6Z2V0X2phdmFfdHlwZV9zdHJpbmcodF90eXBlKiB0eXBlKSB7Ci0gIGlmICh0eXBlLT5pc19saXN0KCkpewotICAgIHJldHVybiAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuTElTVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLk1BUCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNFVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSVUNUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkVOVU0iOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3R5cGVkZWYoKSkgewotICAgIHJldHVybiBnZXRfamF2YV90eXBlX3N0cmluZygoKHRfdHlwZWRlZiopdHlwZSktPmdldF90eXBlKCkpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgc3dpdGNoICgoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEICAgOiByZXR1cm4gICAgICAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuVk9JRCI7IGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkcgOiByZXR1cm4gICAgIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORyI7IGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MICAgOiByZXR1cm4gICAgICAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuQk9PTCI7IGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFICAgOiByZXR1cm4gICAgICAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuQllURSI7IGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTYgICAgOiByZXR1cm4gICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkkxNiI7IGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzIgICAgOiByZXR1cm4gICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkkzMiI7IGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQgICAgOiByZXR1cm4gICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkk2NCI7IGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEUgOiByZXR1cm4gICAgIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkRPVUJMRSI7IGJyZWFrOwotICAgICAgZGVmYXVsdCA6Ci0gICAgICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcigiVW5rbm93biB0aHJpZnQgdHlwZSBcIiIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIlwiIHBhc3NlZCB0byB0X2phdmFfZ2VuZXJhdG9yOjpnZXRfamF2YV90eXBlX3N0cmluZyEiKTsKLSAgICAgICAgcmV0dXJuICJVbmtub3duIHRocmlmdCB0eXBlIFwiIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiXCIgcGFzc2VkIHRvIHRfamF2YV9nZW5lcmF0b3I6OmdldF9qYXZhX3R5cGVfc3RyaW5nISI7Ci0gICAgICAgIGJyZWFrOyAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4hCi0gICAgfQotICB9IGVsc2UgewotICAgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCJVbmtub3duIHRocmlmdCB0eXBlIFwiIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiXCIgcGFzc2VkIHRvIHRfamF2YV9nZW5lcmF0b3I6OmdldF9qYXZhX3R5cGVfc3RyaW5nISIpOwotICAgICAgcmV0dXJuICJVbmtub3duIHRocmlmdCB0eXBlIFwiIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiXCIgcGFzc2VkIHRvIHRfamF2YV9nZW5lcmF0b3I6OmdldF9qYXZhX3R5cGVfc3RyaW5nISI7Ci0gICAgICAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4hCi0gIH0KLX0KLQotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUpewotICBvdXQgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudF91cCgpOwotICBpZiAodHlwZS0+aXNfc3RydWN0KCkpewotICAgIGluZGVudChvdXQpIDw8ICJuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLlN0cnVjdE1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUlVDVCwgIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIi5jbGFzcyI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpewotICAgIGlmICh0eXBlLT5pc19saXN0KCkpewotICAgICAgaW5kZW50KG91dCkgPDwgIm5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuTGlzdE1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkxJU1QsICI7Ci0gICAgICB0X3R5cGUqIGVsZW1fdHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOyAgICAKLSAgICAgIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShvdXQsIGVsZW1fdHlwZSk7ICAgCi0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSl7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAibmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5TZXRNZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TRVQsICI7Ci0gICAgICB0X3R5cGUqIGVsZW1fdHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOyAgICAKLSAgICAgIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShvdXQsIGVsZW1fdHlwZSk7IAotICAgIH0gZWxzZXsgLy8gbWFwCi0gICAgICBpbmRlbnQob3V0KSA8PCAibmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5NYXBNZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5NQVAsICI7Ci0gICAgICB0X3R5cGUqIGtleV90eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOwotICAgICAgdF90eXBlKiB2YWxfdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLSAgICAgIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShvdXQsIGtleV90eXBlKTsKLSAgICAgIG91dCA8PCAiLCAiOwotICAgICAgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKG91dCwgdmFsX3R5cGUpOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAibmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5FbnVtTWV0YURhdGEob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuRU5VTSwgIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIi5jbGFzcyI7Ci0gIH0gZWxzZSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIm5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRWYWx1ZU1ldGFEYXRhKCIgPDwgZ2V0X2phdmFfdHlwZV9zdHJpbmcodHlwZSk7Ci0gICAgaWYgKHR5cGUtPmlzX3R5cGVkZWYoKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIiwgXCIiIDw8ICgodF90eXBlZGVmKil0eXBlKS0+Z2V0X3N5bWJvbGljKCkgPDwgIlwiIjsKLSAgICB9IGVsc2UgaWYgKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIiwgdHJ1ZSI7Ci0gICAgfQotICB9Ci0gIG91dCA8PCAiKSI7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudF9kb3duKCk7Ci19Ci0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0aHJpZnQgc2VydmljZS4gSW4gQysrLCB0aGlzIGNvbXByaXNlcyBhbiBlbnRpcmVseSBzZXBhcmF0ZQotICogaGVhZGVyIGFuZCBzb3VyY2UgZmlsZS4gVGhlIGhlYWRlciBmaWxlIGRlZmluZXMgdGhlIG1ldGhvZHMgYW5kIGluY2x1ZGVzCi0gKiB0aGUgZGF0YSB0eXBlcyBkZWZpbmVkIGluIHRoZSBtYWluIGhlYWRlciBmaWxlLCBhbmQgdGhlIGltcGxlbWVudGF0aW9uCi0gKiBmaWxlIGNvbnRhaW5zIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgYmFzaWMgcHJpbnRlciBhbmQgZGVmYXVsdCBpbnRlcmZhY2VzLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGZpbGUKLSAgc3RyaW5nIGZfc2VydmljZV9uYW1lID0gcGFja2FnZV9kaXJfKyIvIittYWtlX3ZhbGlkX2phdmFfZmlsZW5hbWUoc2VydmljZV9uYW1lXykrIi5qYXZhIjsKLSAgZl9zZXJ2aWNlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICBhdXRvZ2VuX2NvbW1lbnQoKSA8PAotICAgIGphdmFfcGFja2FnZSgpIDw8Ci0gICAgamF2YV90eXBlX2ltcG9ydHMoKSA8PAotICAgIGphdmFfc3VwcHJlc3Npb25zKCk7Ci0KLSAgZ2VuZXJhdGVfamF2YXhfZ2VuZXJhdGVkX2Fubm90YXRpb24oZl9zZXJ2aWNlXyk7Ci0gIGZfc2VydmljZV8gPDwgInB1YmxpYyBjbGFzcyAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIiB7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIC8vIEdlbmVyYXRlIHRoZSB0aHJlZSBtYWluIHBhcnRzIG9mIHRoZSBzZXJ2aWNlCi0gIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9hc3luY19pbnRlcmZhY2UodHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfYXN5bmNfY2xpZW50KHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX2FzeW5jX3NlcnZlcih0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXyA8PAotICAgICJ9IiA8PCBlbmRsOwotICBmX3NlcnZpY2VfLmNsb3NlKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBpbnRlcmZhY2UgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIHN0cmluZyBleHRlbmRzX2lmYWNlID0gIiI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7Ci0gICAgZXh0ZW5kc19pZmFjZSA9ICIgZXh0ZW5kcyAiICsgZXh0ZW5kcyArICIuSWZhY2UiOwotICB9Ci0KLSAgZ2VuZXJhdGVfamF2YV9kb2MoZl9zZXJ2aWNlXywgdHNlcnZpY2UpOwotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgaW50ZXJmYWNlIElmYWNlIiA8PCBleHRlbmRzX2lmYWNlIDw8Ci0gICAgIiB7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9qYXZhX2RvYyhmX3NlcnZpY2VfLCAqZl9pdGVyKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2FzeW5jX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIHN0cmluZyBleHRlbmRzX2lmYWNlID0gIiI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7Ci0gICAgZXh0ZW5kc19pZmFjZSA9ICIgZXh0ZW5kcyAiICsgZXh0ZW5kcyArICIgLkFzeW5jSWZhY2UiOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicHVibGljIGludGVyZmFjZSBBc3luY0lmYWNlIiA8PCBleHRlbmRzX2lmYWNlIDw8ICIgeyIgPDwgZW5kbCA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmVfYXN5bmMoKmZfaXRlciwgdHJ1ZSkgPDwgIiB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgc3RydWN0cyBmb3IgYWxsIHRoZSBzZXJ2aWNlIGFyZ3MgYW5kIHJldHVybiB0eXBlcwotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZQotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLSAgICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sIHRzLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycygqZl9pdGVyKTsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIHN0cmluZyBleHRlbmRzX2NsaWVudCA9ICIiOwotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgPT0gTlVMTCkgewotICAgIGV4dGVuZHNfY2xpZW50ID0gIm9yZy5hcGFjaGUudGhyaWZ0LlRTZXJ2aWNlQ2xpZW50IjsKLSAgfSBlbHNlIHsKLSAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBleHRlbmRzX2NsaWVudCA9IGV4dGVuZHMgKyAiLkNsaWVudCI7Ci0gIH0KLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAicHVibGljIHN0YXRpYyBjbGFzcyBDbGllbnQgZXh0ZW5kcyAiIDw8IGV4dGVuZHNfY2xpZW50IDw8ICIgaW1wbGVtZW50cyBJZmFjZSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeSBpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LlRTZXJ2aWNlQ2xpZW50RmFjdG9yeTxDbGllbnQ+IHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBGYWN0b3J5KCkge30iIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIENsaWVudCBnZXRDbGllbnQob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIHByb3QpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybiBuZXcgQ2xpZW50KHByb3QpOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBDbGllbnQgZ2V0Q2xpZW50KG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBpcHJvdCwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIG9wcm90KSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gbmV3IENsaWVudChpcHJvdCwgb3Byb3QpOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBDbGllbnQob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIHByb3QpIiA8PCBlbmRsOwotICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJzdXBlcihwcm90LCBwcm90KTsiIDw8IGVuZGw7Ci0gIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAicHVibGljIENsaWVudChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgaXByb3QsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBvcHJvdCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIHN1cGVyKGlwcm90LCBvcHJvdCk7IiA8PCBlbmRsOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSBjbGllbnQgbWV0aG9kIGltcGxlbWVudGF0aW9ucwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICBzdHJpbmcgc2VwID0gIl8iOwotICAgIHN0cmluZyBqYXZhbmFtZSA9IGZ1bm5hbWU7Ci0gICAgaWYgKGZ1bGxjYW1lbF9zdHlsZV8pIHsKLSAgICAgICAgc2VwID0gIiI7Ci0gICAgICAgIGphdmFuYW1lID0gYXNfY2FtZWxfY2FzZShmdW5uYW1lKTsKLSAgICB9Ci0KLSAgICAvLyBPcGVuIGZ1bmN0aW9uCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgZW5kbDsKLSAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInNlbmQiIDw8IHNlcCA8PCBqYXZhbmFtZSA8PCAiKCI7Ci0KLSAgICAvLyBHZXQgdGhlIHN0cnVjdCBvZiBmdW5jdGlvbiBjYWxsIHBhcmFtcwotICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotCi0gICAgLy8gRGVjbGFyZSB0aGUgZnVuY3Rpb24gYXJndW1lbnRzCi0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7Ci0gICAgICB9Ci0gICAgICBmX3NlcnZpY2VfIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8ICIpOyIgPDwgZW5kbDsKLQotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKLSAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCAicmV0dXJuICI7Ci0gICAgICB9Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICJyZWN2IiA8PCBzZXAgPDwgamF2YW5hbWUgPDwgIigpOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgICB0X2Z1bmN0aW9uIHNlbmRfZnVuY3Rpb24oZ190eXBlX3ZvaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygic2VuZCIpICsgc2VwICsgamF2YW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKSk7Ci0KLSAgICBzdHJpbmcgYXJnc25hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX2FyZ3MiOwotCi0gICAgLy8gT3BlbiBmdW5jdGlvbgotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmc2VuZF9mdW5jdGlvbikgPDwgZW5kbDsKLSAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKLQotICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVxdWVzdAotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBhcmdzbmFtZSA8PCAiIGFyZ3MgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiKCk7IiA8PCBlbmRsOwotCi0gICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiYXJncy5zZXQiIDw8IGdldF9jYXBfbmFtZSgoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIigiIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInNlbmRCYXNlKFwiIiA8PCBmdW5uYW1lIDw8ICJcIiwgYXJncyk7IiA8PCBlbmRsOwotCi0gICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIHN0cmluZyByZXN1bHRuYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOwotCi0gICAgICB0X3N0cnVjdCBub2FyZ3MocHJvZ3JhbV8pOwotICAgICAgdF9mdW5jdGlvbiByZWN2X2Z1bmN0aW9uKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInJlY3YiKSArIHNlcCArIGphdmFuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZub2FyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCkpOwotICAgICAgLy8gT3BlbiBmdW5jdGlvbgotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAgICJwdWJsaWMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnJlY3ZfZnVuY3Rpb24pIDw8IGVuZGw7Ci0gICAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKLQotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCByZXN1bHRuYW1lIDw8ICIgcmVzdWx0ID0gbmV3ICIgPDwgcmVzdWx0bmFtZSA8PCAiKCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJyZWNlaXZlQmFzZShyZXN1bHQsIFwiIiA8PCBmdW5uYW1lIDw8ICJcIik7IiA8PCBlbmRsOwotCi0gICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KLSAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAocmVzdWx0LiIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soInN1Y2Nlc3MiKSA8PCAiKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHJlc3VsdC5zdWNjZXNzOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICB0X3N0cnVjdCogeHMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKLSAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0gICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImlmIChyZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiAhPSBudWxsKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgdGhyb3cgcmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIC8vIElmIHlvdSBnZXQgaGVyZSBpdCdzIGFuIGV4Y2VwdGlvbiwgdW5sZXNzIGEgdm9pZCBmdW5jdGlvbgotICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAidGhyb3cgbmV3IG9yZy5hcGFjaGUudGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbihvcmcuYXBhY2hlLnRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24uTUlTU0lOR19SRVNVTFQsIFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiBmYWlsZWQ6IHVua25vd24gcmVzdWx0XCIpOyIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgLy8gQ2xvc2UgZnVuY3Rpb24KLSAgICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOwotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfYXN5bmNfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGV4dGVuZHMgPSAib3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuVEFzeW5jQ2xpZW50IjsKLSAgc3RyaW5nIGV4dGVuZHNfY2xpZW50ID0gIiI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSkgKyAiLkFzeW5jQ2xpZW50IjsKLSAgfQotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJwdWJsaWMgc3RhdGljIGNsYXNzIEFzeW5jQ2xpZW50IGV4dGVuZHMgIiA8PCBleHRlbmRzIDw8ICIgaW1wbGVtZW50cyBBc3luY0lmYWNlIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIC8vIEZhY3RvcnkgbWV0aG9kCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5IGltcGxlbWVudHMgb3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuVEFzeW5jQ2xpZW50RmFjdG9yeTxBc3luY0NsaWVudD4geyIgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIHByaXZhdGUgb3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuVEFzeW5jQ2xpZW50TWFuYWdlciBjbGllbnRNYW5hZ2VyOyIgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIHByaXZhdGUgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3Rvcnk7IiA8PCBlbmRsOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgcHVibGljIEZhY3Rvcnkob3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuVEFzeW5jQ2xpZW50TWFuYWdlciBjbGllbnRNYW5hZ2VyLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeSkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgICAgdGhpcy5jbGllbnRNYW5hZ2VyID0gY2xpZW50TWFuYWdlcjsiIDw8IGVuZGw7IAotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgICB0aGlzLnByb3RvY29sRmFjdG9yeSA9IHByb3RvY29sRmFjdG9yeTsiIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICB9IiA8PCBlbmRsOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgcHVibGljIEFzeW5jQ2xpZW50IGdldEFzeW5jQ2xpZW50KG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UTm9uYmxvY2tpbmdUcmFuc3BvcnQgdHJhbnNwb3J0KSB7IiA8PCBlbmRsOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgICByZXR1cm4gbmV3IEFzeW5jQ2xpZW50KHByb3RvY29sRmFjdG9yeSwgY2xpZW50TWFuYWdlciwgdHJhbnNwb3J0KTsiIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICB9IiA8PCBlbmRsOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBBc3luY0NsaWVudChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeSwgb3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuVEFzeW5jQ2xpZW50TWFuYWdlciBjbGllbnRNYW5hZ2VyLCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVE5vbmJsb2NraW5nVHJhbnNwb3J0IHRyYW5zcG9ydCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIHN1cGVyKHByb3RvY29sRmFjdG9yeSwgY2xpZW50TWFuYWdlciwgdHJhbnNwb3J0KTsiIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIHN0cmluZyBzZXAgPSAiXyI7Ci0gICAgc3RyaW5nIGphdmFuYW1lID0gZnVubmFtZTsKLSAgICBpZiAoZnVsbGNhbWVsX3N0eWxlXykgewotICAgICAgICBzZXAgPSAiIjsKLSAgICAgICAgamF2YW5hbWUgPSBhc19jYW1lbF9jYXNlKGphdmFuYW1lKTsKLSAgICB9Ci0gICAgdF90eXBlKiByZXRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKTsKLSAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLSAgICBzdHJpbmcgZnVuY2xhc3NuYW1lID0gZnVubmFtZSArICJfY2FsbCI7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOwotICAgIHN0cmluZyBhcmdzX25hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX2FyZ3MiOwotICAgIHN0cmluZyByZXN1bHRfbmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKLQotICAgIC8vIE1haW4gbWV0aG9kIGJvZHkgICAKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZV9hc3luYygqZl9pdGVyLCBmYWxzZSkgPDwgIiB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICBjaGVja1JlYWR5KCk7IiA8PCBlbmRsOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICAiIDw8IGZ1bmNsYXNzbmFtZSA8PCAiIG1ldGhvZF9jYWxsID0gbmV3ICIgKyBmdW5jbGFzc25hbWUgKyAiKCIgPDwgYXN5bmNfYXJndW1lbnRfbGlzdCgqZl9pdGVyLCBhcmdfc3RydWN0LCByZXRfdHlwZSkgPDwgIiwgdGhpcywgX19fcHJvdG9jb2xGYWN0b3J5LCBfX190cmFuc3BvcnQpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgdGhpcy5fX19jdXJyZW50TWV0aG9kID0gbWV0aG9kX2NhbGw7IiA8PCBlbmRsOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICBfX19tYW5hZ2VyLmNhbGwobWV0aG9kX2NhbGwpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgICAvLyBUQXN5bmNNZXRob2Qgb2JqZWN0IGZvciB0aGlzIGZ1bmN0aW9uIGNhbGwKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBzdGF0aWMgY2xhc3MgIiArIGZ1bmNsYXNzbmFtZSArICIgZXh0ZW5kcyBvcmcuYXBhY2hlLnRocmlmdC5hc3luYy5UQXN5bmNNZXRob2RDYWxsIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICAvLyBNZW1iZXIgdmFyaWFibGVzCi0gICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJpdmF0ZSAiICsgdHlwZV9uYW1lKCgqZmxkX2l0ZXIpLT5nZXRfdHlwZSgpKSArICIgIiArICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpICsgIjsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgLy8gTk9URSBzaW5jZSB3ZSB1c2UgYSBuZXcgQ2xpZW50IGluc3RhbmNlIHRvIGRlc2VyaWFsaXplLCBsZXQncyBrZWVwIHNlcWlkIHRvIDAgZm9yIG5vdwotICAgIC8vIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJpdmF0ZSBpbnQgc2VxaWQ7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICAvLyBDb25zdHJ1Y3RvcgotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgKyBmdW5jbGFzc25hbWUgKyAiKCIgKyBhc3luY19hcmd1bWVudF9saXN0KCpmX2l0ZXIsIGFyZ19zdHJ1Y3QsIHJldF90eXBlLCB0cnVlKSA8PCAiLCBvcmcuYXBhY2hlLnRocmlmdC5hc3luYy5UQXN5bmNDbGllbnQgY2xpZW50LCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeSwgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlROb25ibG9ja2luZ1RyYW5zcG9ydCB0cmFuc3BvcnQpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIHN1cGVyKGNsaWVudCwgcHJvdG9jb2xGYWN0b3J5LCB0cmFuc3BvcnQsIHJlc3VsdEhhbmRsZXIsICIgPDwgKCgqZl9pdGVyKS0+aXNfb25ld2F5KCkgPyAidHJ1ZSIgOiAiZmFsc2UiKSA8PCAiKTsiIDw8IGVuZGw7Ci0KLSAgICAvLyBBc3NpZ24gbWVtYmVyIHZhcmlhYmxlcwotICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgdGhpcy4iICsgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgKyAiID0gIiArICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpICsgIjsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyB2b2lkIHdyaXRlX2FyZ3Mob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIHByb3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICAvLyBTZXJpYWxpemUgcmVxdWVzdAotICAgIC8vIE5PVEUgd2UgYXJlIGxlYXZpbmcgc2VxaWQgYXMgMCwgZm9yIG5vdyAoc2VlIGFib3ZlKQotICAgIGZfc2VydmljZV8gPDwgCi0gICAgICBpbmRlbnQoKSA8PCAicHJvdC53cml0ZU1lc3NhZ2VCZWdpbihuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1lc3NhZ2UoXCIiIDw8Ci0gICAgICBmdW5uYW1lIDw8ICJcIiwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuIiA8PAotICAgICAgKCgqZl9pdGVyKS0+aXNfb25ld2F5KCkgPyAiVE1lc3NhZ2VUeXBlLk9ORVdBWSIgOiAiVE1lc3NhZ2VUeXBlLkNBTEwiKSA8PAotICAgICAgIiwgMCkpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgYXJnc19uYW1lIDw8ICIgYXJncyA9IG5ldyAiIDw8IGFyZ3NfbmFtZSA8PCAiKCk7IiA8PCBlbmRsOwotCi0gICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImFyZ3Muc2V0IiA8PCBnZXRfY2FwX25hbWUoKCpmbGRfaXRlciktPmdldF9uYW1lKCkpIDw8ICIoIiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgZl9zZXJ2aWNlXyA8PCAKLSAgICAgIGluZGVudCgpIDw8ICJhcmdzLndyaXRlKHByb3QpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgInByb3Qud3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOwotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIC8vIFJldHVybiBtZXRob2QgIAotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgKyB0eXBlX25hbWUocmV0X3R5cGUpICsgIiBnZXRSZXN1bHQoKSB0aHJvd3MgIjsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0gICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgIGZfc2VydmljZV8gPDwgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlKSArICIsICI7Ci0gICAgfQotICAgIGZfc2VydmljZV8gPDwgIm9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geyIgPDwgZW5kbDsKLQotICAgIGluZGVudF91cCgpOwotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJpZiAoZ2V0U3RhdGUoKSAhPSBvcmcuYXBhY2hlLnRocmlmdC5hc3luYy5UQXN5bmNNZXRob2RDYWxsLlN0YXRlLlJFU1BPTlNFX1JFQUQpIHsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oXCJNZXRob2QgY2FsbCBub3QgZmluaXNoZWQhXCIpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVE1lbW9yeUlucHV0VHJhbnNwb3J0IG1lbW9yeVRyYW5zcG9ydCA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVE1lbW9yeUlucHV0VHJhbnNwb3J0KGdldEZyYW1lQnVmZmVyKCkuYXJyYXkoKSk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIHByb3QgPSBjbGllbnQuZ2V0UHJvdG9jb2xGYWN0b3J5KCkuZ2V0UHJvdG9jb2wobWVtb3J5VHJhbnNwb3J0KTsiIDw8IGVuZGw7Ci0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXyk7Ci0gICAgICBpZiAoIXJldF90eXBlLT5pc192b2lkKCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCAicmV0dXJuICI7IAotICAgICAgfQotICAgICAgZl9zZXJ2aWNlXyA8PCAiKG5ldyBDbGllbnQocHJvdCkpLnJlY3YiICsgc2VwICsgamF2YW5hbWUgKyAiKCk7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIC8vIENsb3NlIGZ1bmN0aW9uCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgICAvLyBDbG9zZSBjbGFzcwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBDbG9zZSBBc3luY0NsaWVudAotICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgLy8gR2VuZXJhdGUgdGhlIGRpc3BhdGNoIG1ldGhvZHMKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0KLSAgLy8gRXh0ZW5kcyBzdHVmZgotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19wcm9jZXNzb3IgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpID09IE5VTEwpIHsKLSAgICBleHRlbmRzX3Byb2Nlc3NvciA9ICJvcmcuYXBhY2hlLnRocmlmdC5UQmFzZVByb2Nlc3NvcjxJPiI7Ci0gIH0gZWxzZSB7Ci0gICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7Ci0gICAgZXh0ZW5kc19wcm9jZXNzb3IgPSBleHRlbmRzICsgIi5Qcm9jZXNzb3I8ST4iOwotICB9Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGhlYWRlciBwb3J0aW9uCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJwdWJsaWMgc3RhdGljIGNsYXNzIFByb2Nlc3NvcjxJIGV4dGVuZHMgSWZhY2U+IGV4dGVuZHMgIiA8PCBleHRlbmRzX3Byb2Nlc3NvciA8PCAiIGltcGxlbWVudHMgb3JnLmFwYWNoZS50aHJpZnQuVFByb2Nlc3NvciB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihQcm9jZXNzb3IuY2xhc3MuZ2V0TmFtZSgpKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgUHJvY2Vzc29yKEkgaWZhY2UpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICBzdXBlcihpZmFjZSwgZ2V0UHJvY2Vzc01hcChuZXcgSGFzaE1hcDxTdHJpbmcsIG9yZy5hcGFjaGUudGhyaWZ0LlByb2Nlc3NGdW5jdGlvbjxJLCA/IGV4dGVuZHMgb3JnLmFwYWNoZS50aHJpZnQuVEJhc2U+PigpKSk7IiA8PCBlbmRsOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInByb3RlY3RlZCBQcm9jZXNzb3IoSSBpZmFjZSwgTWFwPFN0cmluZywgIG9yZy5hcGFjaGUudGhyaWZ0LlByb2Nlc3NGdW5jdGlvbjxJLCA/IGV4dGVuZHMgIG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlPj4gcHJvY2Vzc01hcCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIHN1cGVyKGlmYWNlLCBnZXRQcm9jZXNzTWFwKHByb2Nlc3NNYXApKTsiIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJpdmF0ZSBzdGF0aWMgPEkgZXh0ZW5kcyBJZmFjZT4gTWFwPFN0cmluZywgIG9yZy5hcGFjaGUudGhyaWZ0LlByb2Nlc3NGdW5jdGlvbjxJLCA/IGV4dGVuZHMgIG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlPj4gZ2V0UHJvY2Vzc01hcChNYXA8U3RyaW5nLCAgb3JnLmFwYWNoZS50aHJpZnQuUHJvY2Vzc0Z1bmN0aW9uPEksID8gZXh0ZW5kcyAgb3JnLmFwYWNoZS50aHJpZnQuVEJhc2U+PiBwcm9jZXNzTWFwKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInByb2Nlc3NNYXAucHV0KFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiLCBuZXcgIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIigpKTsiIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gcHJvY2Vzc01hcDsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzIHN1YmZ1bmN0aW9ucwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odHNlcnZpY2UsICpmX2l0ZXIpOwotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfYXN5bmNfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgLy8gR2VuZXJhdGUgdGhlIGRpc3BhdGNoIG1ldGhvZHMKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0KLSAgLy8gRXh0ZW5kcyBzdHVmZgotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19wcm9jZXNzb3IgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpID09IE5VTEwpIHsKLSAgICBleHRlbmRzX3Byb2Nlc3NvciA9ICJvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUFzeW5jUHJvY2Vzc29yPEk+IjsKLSAgfSBlbHNlIHsKLSAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBleHRlbmRzX3Byb2Nlc3NvciA9IGV4dGVuZHMgKyAiLkFzeW5jUHJvY2Vzc29yPEk+IjsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIHRoZSBoZWFkZXIgcG9ydGlvbgotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAicHVibGljIHN0YXRpYyBjbGFzcyBBc3luY1Byb2Nlc3NvcjxJIGV4dGVuZHMgQXN5bmNJZmFjZT4gZXh0ZW5kcyAiIDw8IGV4dGVuZHNfcHJvY2Vzc29yIDw8ICIgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQXN5bmNQcm9jZXNzb3IuY2xhc3MuZ2V0TmFtZSgpKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgQXN5bmNQcm9jZXNzb3IoSSBpZmFjZSkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIHN1cGVyKGlmYWNlLCBnZXRQcm9jZXNzTWFwKG5ldyBIYXNoTWFwPFN0cmluZywgb3JnLmFwYWNoZS50aHJpZnQuQXN5bmNQcm9jZXNzRnVuY3Rpb248SSwgPyBleHRlbmRzIG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlLCA/Pj4oKSkpOyIgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwcm90ZWN0ZWQgQXN5bmNQcm9jZXNzb3IoSSBpZmFjZSwgTWFwPFN0cmluZywgIG9yZy5hcGFjaGUudGhyaWZ0LkFzeW5jUHJvY2Vzc0Z1bmN0aW9uPEksID8gZXh0ZW5kcyAgb3JnLmFwYWNoZS50aHJpZnQuVEJhc2UsID8+PiBwcm9jZXNzTWFwKSB7IiA8PCBlbmRsOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgc3VwZXIoaWZhY2UsIGdldFByb2Nlc3NNYXAocHJvY2Vzc01hcCkpOyIgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInByaXZhdGUgc3RhdGljIDxJIGV4dGVuZHMgQXN5bmNJZmFjZT4gTWFwPFN0cmluZywgIG9yZy5hcGFjaGUudGhyaWZ0LkFzeW5jUHJvY2Vzc0Z1bmN0aW9uPEksID8gZXh0ZW5kcyAgb3JnLmFwYWNoZS50aHJpZnQuVEJhc2UsPz4+IGdldFByb2Nlc3NNYXAoTWFwPFN0cmluZywgIG9yZy5hcGFjaGUudGhyaWZ0LkFzeW5jUHJvY2Vzc0Z1bmN0aW9uPEksID8gZXh0ZW5kcyAgb3JnLmFwYWNoZS50aHJpZnQuVEJhc2UsID8+PiBwcm9jZXNzTWFwKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInByb2Nlc3NNYXAucHV0KFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiLCBuZXcgIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIigpKTsiIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gcHJvY2Vzc01hcDsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzIHN1YmZ1bmN0aW9ucwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGdlbmVyYXRlX3Byb2Nlc3NfYXN5bmNfZnVuY3Rpb24odHNlcnZpY2UsICpmX2l0ZXIpOwotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgYW5kIGhlbHBlcnMgZm9yIGEgZnVuY3Rpb24uCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24KLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIHJldHVybjsKLSAgfQotCi0gIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKLSAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKLSAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOwotICB9Ci0KLSAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgcmVzdWx0LmFwcGVuZCgqZl9pdGVyKTsKLSAgfQotCi0gIGdlbmVyYXRlX2phdmFfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgJnJlc3VsdCwgZmFsc2UsIHRydWUsIHRydWUpOwotfQotCi0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBwcm9jZXNzIGZ1bmN0aW9uIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24gdG8gd3JpdGUgYSBkaXNwYXRjaGVyIGZvcgotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfYXN5bmNfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgc3RyaW5nIGFyZ3NuYW1lID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKLQotICBzdHJpbmcgcmVzdWx0bmFtZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKLSAgICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgICAgcmVzdWx0bmFtZSA9ICJvcmcuYXBhY2hlLnRocmlmdC5UQmFzZSI7Ci0gICAgfQotCi0gIHN0cmluZyByZXN1bHR0eXBlID0gdHlwZV9uYW1lKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSx0cnVlKTsKLQotCi0gICh2b2lkKSB0c2VydmljZTsKLSAgLy8gT3BlbiBjbGFzcwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAicHVibGljIHN0YXRpYyBjbGFzcyAiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiPEkgZXh0ZW5kcyBBc3luY0lmYWNlPiBleHRlbmRzIG9yZy5hcGFjaGUudGhyaWZ0LkFzeW5jUHJvY2Vzc0Z1bmN0aW9uPEksICIgPDwgYXJnc25hbWUgPDwgIiwgIjw8cmVzdWx0dHlwZTw8Ij4geyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICBzdXBlcihcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJcIik7IiA8PCBlbmRsOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IGFyZ3NuYW1lIDw8ICIgZ2V0RW1wdHlBcmdzSW5zdGFuY2UoKSB7IiA8PCBlbmRsOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgcmV0dXJuIG5ldyAiIDw8IGFyZ3NuYW1lIDw8ICIoKTsiIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIEFzeW5jTWV0aG9kQ2FsbGJhY2s8Ijw8cmVzdWx0dHlwZTw8Ij4gZ2V0UmVzdWx0SGFuZGxlcihmaW5hbCBBc3luY0ZyYW1lQnVmZmVyIGZiLCBmaW5hbCBpbnQgc2VxaWQpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LkFzeW5jUHJvY2Vzc0Z1bmN0aW9uIGZjYWxsID0gdGhpczsiPDxlbmRsOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybiBuZXcgQXN5bmNNZXRob2RDYWxsYmFjazwiPDxyZXN1bHR0eXBlPDwiPigpIHsgIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgdm9pZCBvbkNvbXBsZXRlKCIgPDwgcmVzdWx0dHlwZSA8PCIgbykgeyIgPDwgZW5kbDsKLQotICBpbmRlbnRfdXAoKTsKLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8cmVzdWx0bmFtZTw8IiByZXN1bHQgPSBuZXcgIjw8cmVzdWx0bmFtZTw8IigpOyI8PGVuZGw7Ci0KLSAgICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJlc3VsdC5zdWNjZXNzID0gbzsiPDxlbmRsOwotICAgICAgLy8gU2V0IGlzc2V0IG9uIHN1Y2Nlc3MgZmllbGQKLSAgICAgIGlmICghdHlwZV9jYW5fYmVfbnVsbCh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpKSB7Ci0gICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmVzdWx0LnNldCIgPDwgZ2V0X2NhcF9uYW1lKCJzdWNjZXNzIikgPDwgZ2V0X2NhcF9uYW1lKCJpc1NldCIpIDw8ICIodHJ1ZSk7IiA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLQotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidHJ5IHsiPDxlbmRsOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICBmY2FsbC5zZW5kUmVzcG9uc2UoZmIscmVzdWx0LCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWVzc2FnZVR5cGUuUkVQTFksc2VxaWQpOyI8PGVuZGw7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIHJldHVybjsiPDxlbmRsOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsiPDxlbmRsOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICBMT0dHRVIuZXJyb3IoXCJFeGNlcHRpb24gd3JpdGluZyB0byBpbnRlcm5hbCBmcmFtZSBidWZmZXJcIiwgZSk7Ijw8ZW5kbDsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iPDxlbmRsOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZmIuY2xvc2UoKTsiPDxlbmRsOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDxlbmRsOwotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIHZvaWQgb25FcnJvcihFeGNlcHRpb24gZSkgeyI8PGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0KLQotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ImJ5dGUgbXNnVHlwZSA9IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNZXNzYWdlVHlwZS5SRVBMWTsiPDxlbmRsOwotICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwib3JnLmFwYWNoZS50aHJpZnQuVEJhc2UgbXNnOyI8PGVuZGw7Ci0gICAgIGluZGVudChmX3NlcnZpY2VfKSA8PHJlc3VsdG5hbWU8PCIgcmVzdWx0ID0gbmV3ICI8PHJlc3VsdG5hbWU8PCIoKTsiPDxlbmRsOwotCi0gICAgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0gICAgIGlmICh4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgewotICAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgICAgICBpZiAoeF9pdGVyICE9IHhjZXB0aW9ucy5iZWdpbigpKSBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImVsc2UgIjsKLSAgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaWYgKGUgaW5zdGFuY2VvZiAiIDw8IHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCksIGZhbHNlLCBmYWxzZSk8PCIpIHsiIDw8IGVuZGw7Ci0gICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgaW5kZW50KCkgPDwgInJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gKCIgPDwgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlKSA8PCAiKSBlOyIgPDwgZW5kbDsKLSAgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LnNldCIgPDwgZ2V0X2NhcF9uYW1lKCgqeF9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgZ2V0X2NhcF9uYW1lKCJpc1NldCIpIDw8ICIodHJ1ZSk7IiA8PCBlbmRsOwotICAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGluZGVudCgpIDw8ICJtc2cgPSByZXN1bHQ7Ijw8ZW5kbDsKLQotICAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9Ijw8ZW5kbDsKLSAgICAgICB9Ci0gICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgZWxzZSAiPDxlbmRsOwotICAgICB9Ci0KLSAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ7Ijw8ZW5kbDsKLSAgICAgaW5kZW50X3VwKCk7Ci0gICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAibXNnVHlwZSA9IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNZXNzYWdlVHlwZS5FWENFUFRJT047Ijw8ZW5kbDsKLSAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJtc2cgPSAob3JnLmFwYWNoZS50aHJpZnQuVEJhc2UpbmV3IG9yZy5hcGFjaGUudGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbihvcmcuYXBhY2hlLnRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24uSU5URVJOQUxfRVJST1IsIGUuZ2V0TWVzc2FnZSgpKTsiPDxlbmRsOwotICAgICBpbmRlbnRfZG93bigpOwotICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iPDxlbmRsOwotCi0KLSAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ0cnkgeyI8PGVuZGw7Ci0gICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICBmY2FsbC5zZW5kUmVzcG9uc2UoZmIsbXNnLG1zZ1R5cGUsc2VxaWQpOyI8PGVuZGw7Ci0gICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICByZXR1cm47Ijw8ZW5kbDsKLSAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsiPDxlbmRsOwotICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgTE9HR0VSLmVycm9yKFwiRXhjZXB0aW9uIHdyaXRpbmcgdG8gaW50ZXJuYWwgZnJhbWUgYnVmZmVyXCIsIGV4KTsiPDxlbmRsOwotICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iPDxlbmRsOwotICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImZiLmNsb3NlKCk7Ijw8ZW5kbDsKLSAgfQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8ZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9OyIgPDxlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInByb3RlY3RlZCBib29sZWFuIGlzT25ld2F5KCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIHJldHVybiAiIDw8ICgodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSk/InRydWUiOiJmYWxzZSIpIDw8ICI7IiA8PCBlbmRsOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyB2b2lkIHN0YXJ0KEkgaWZhY2UsICIgPDwgYXJnc25hbWUgPDwgIiBhcmdzLCBvcmcuYXBhY2hlLnRocmlmdC5hc3luYy5Bc3luY01ldGhvZENhbGxiYWNrPCI8PHJlc3VsdHR5cGU8PCI+IHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBmdW5jdGlvbiBjYWxsCi0gIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOwotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKLQotICBmX3NlcnZpY2VfIDw8ICJpZmFjZS4iIDw8IGdldF9ycGNfbWV0aG9kX25hbWUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSA8PCAiKCI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOwotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8ICJhcmdzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICB9Ci0gIGlmICghZmlyc3QpCi0gICAgICBmX3NlcnZpY2VfIDw8ICIsIjsKLSAgZl9zZXJ2aWNlXyA8PCAicmVzdWx0SGFuZGxlciI7Ci0gIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOwotCi0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IjsKLQotICAvLyBDbG9zZSBmdW5jdGlvbgotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgLy8gQ2xvc2UgY2xhc3MKLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHByb2Nlc3MgZnVuY3Rpb24gZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byB3cml0ZSBhIGRpc3BhdGNoZXIgZm9yCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICBzdHJpbmcgYXJnc25hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX2FyZ3MiOwotICBzdHJpbmcgcmVzdWx0bmFtZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKLSAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICByZXN1bHRuYW1lID0gIm9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlIjsKLSAgfQotCi0gICh2b2lkKSB0c2VydmljZTsKLSAgLy8gT3BlbiBjbGFzcwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAicHVibGljIHN0YXRpYyBjbGFzcyAiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiPEkgZXh0ZW5kcyBJZmFjZT4gZXh0ZW5kcyBvcmcuYXBhY2hlLnRocmlmdC5Qcm9jZXNzRnVuY3Rpb248SSwgIiA8PCBhcmdzbmFtZSA8PCAiPiB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIHN1cGVyKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIlwiKTsiIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgPDwgYXJnc25hbWUgPDwgIiBnZXRFbXB0eUFyZ3NJbnN0YW5jZSgpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICByZXR1cm4gbmV3ICIgPDwgYXJnc25hbWUgPDwgIigpOyIgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwcm90ZWN0ZWQgYm9vbGVhbiBpc09uZXdheSgpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICByZXR1cm4gIiA8PCAoKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpPyJ0cnVlIjoiZmFsc2UiKSA8PCAiOyIgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgIiA8PCByZXN1bHRuYW1lIDw8ICIgZ2V0UmVzdWx0KEkgaWZhY2UsICIgPDwgYXJnc25hbWUgPDwgIiBhcmdzKSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8IHJlc3VsdG5hbWUgPDwgIiByZXN1bHQgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIoKTsiIDw8IGVuZGw7Ci0gIH0KLQotICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotCi0gIC8vIFRyeSBibG9jayBmb3IgYSBmdW5jdGlvbiB3aXRoIGV4Y2VwdGlvbnMKLSAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidHJ5IHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSB0aGUgZnVuY3Rpb24gY2FsbAotICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZfc2VydmljZV8gPDwgaW5kZW50KCk7Ci0KLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgIGZfc2VydmljZV8gPDwgInJlc3VsdC5zdWNjZXNzID0gIjsKLSAgfQotICBmX3NlcnZpY2VfIDw8ICJpZmFjZS4iIDw8IGdldF9ycGNfbWV0aG9kX25hbWUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSA8PCAiKCI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOwotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8ICJhcmdzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICB9Ci0gIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOwotCi0gIC8vIFNldCBpc3NldCBvbiBzdWNjZXNzIGZpZWxkCi0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkgJiYgIXR5cGVfY2FuX2JlX251bGwodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKSkgewotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmVzdWx0LnNldCIgPDwgZ2V0X2NhcF9uYW1lKCJzdWNjZXNzIikgPDwgZ2V0X2NhcF9uYW1lKCJpc1NldCIpIDw8ICIodHJ1ZSk7IiA8PCBlbmRsOwotICB9Ci0KLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmIHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IjsKLSAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgZl9zZXJ2aWNlXyA8PCAiIGNhdGNoICgiIDw8IHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCksIGZhbHNlLCBmYWxzZSkgPDwgIiAiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgICAgIGluZGVudF91cCgpOwotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgInJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCAifSI7Ci0gICAgICB9Ci0gICAgfQotICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLSAgfQotCi0gIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gbnVsbDsiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gcmVzdWx0OyIgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iOwotCi0gIC8vIENsb3NlIGZ1bmN0aW9uCi0gIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAvLyBDbG9zZSBjbGFzcwotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLQotLyoqCi0gKiBEZXNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZAotICogQHBhcmFtIHByZWZpeCBUaGUgdmFyaWFibGUgbmFtZSBvciBjb250YWluZXIgZm9yIHRoaXMgZmllbGQKLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsIGJvb2wgaGFzX21ldGFkYXRhKSB7Ci0gIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLQotICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gIH0KLQotICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLQotICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0X3N0cnVjdCopdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lLCBoYXNfbWV0YWRhdGEpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiID0gaXByb3QuIjsKLQotCi0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICBpZiAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICAgICAgb3V0IDw8ICJyZWFkQmluYXJ5KCk7IjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBvdXQgPDwgInJlYWRTdHJpbmcoKTsiOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICBvdXQgPDwgInJlYWRCb29sKCk7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgIG91dCA8PCAicmVhZEJ5dGUoKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICBvdXQgPDwgInJlYWRJMTYoKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICBvdXQgPDwgInJlYWRJMzIoKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICBvdXQgPDwgInJlYWRJNjQoKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICBvdXQgPDwgInJlYWREb3VibGUoKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gSmF2YSBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIiA9ICIgPDwgdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCB0cnVlKSArICIuZmluZEJ5VmFsdWUoaXByb3QucmVhZEkzMigpKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gREVTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCi0gICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLCB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYW4gdW5zZXJpYWxpemVyIGZvciBhIHN0cnVjdCwgaW52b2tlcyByZWFkKCkKLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotCi0gICAgaWYgKHJldXNlX29iamVjdHNfKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgcHJlZml4IDw8ICIgPT0gbnVsbCkgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgIH0KLSAgICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiKCk7IiA8PCBlbmRsOwotICAgIGlmIChyZXVzZV9vYmplY3RzXykgewotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi5yZWFkKGlwcm90KTsiIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogRGVzZXJpYWxpemVzIGEgY29udGFpbmVyIGJ5IHJlYWRpbmcgaXRzIHNpemUgYW5kIHRoZW4gaXRlcmF0aW5nCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwgYm9vbCBoYXNfbWV0YWRhdGEpIHsKLQotICBzY29wZV91cChvdXQpOwotCi0gIHN0cmluZyBvYmo7Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIG9iaiA9IHRtcCgiX21hcCIpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIG9iaiA9IHRtcCgiX3NldCIpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBvYmogPSB0bXAoIl9saXN0Iik7Ci0gIH0KLQotICBpZiAoaGFzX21ldGFkYXRhKSB7Ci0gICAgLy8gRGVjbGFyZSB2YXJpYWJsZXMsIHJlYWQgaGVhZGVyCi0gICAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAgIiA8PCBvYmogPDwgIiA9IGlwcm90LnJlYWRNYXBCZWdpbigpOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTZXQgIiA8PCBvYmogPDwgIiA9IGlwcm90LnJlYWRTZXRCZWdpbigpOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTGlzdCAiIDw8IG9iaiA8PCAiID0gaXByb3QucmVhZExpc3RCZWdpbigpOyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgLy8gRGVjbGFyZSB2YXJpYWJsZXMsIHJlYWQgaGVhZGVyCi0gICAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAgIiA8PCBvYmogPDwgIiA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwKCIgPDwgCi0gICAgICB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgPDwgIiwgIiA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwgIiA8PCAiaXByb3QucmVhZEkzMigpKTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU2V0ICIgPDwgb2JqIDw8ICIgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFNldCgiIDw8IAotICAgICAgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCBpcHJvdC5yZWFkSTMyKCkpOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTGlzdCAiIDw8IG9iaiA8PCAiID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRMaXN0KCIgPDwgCi0gICAgICB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsIGlwcm90LnJlYWRJMzIoKSk7IiA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIGlmIChyZXVzZV9vYmplY3RzXykgewotICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBwcmVmaXggPDwgIiA9PSBudWxsKSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICB9Ci0KLSAgb3V0IDw8IAotICAgICAgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlKTsgCi0KLSAgLy8gc2l6ZSB0aGUgY29sbGVjdGlvbiBjb3JyZWN0bHkKLSAgaWYgKHNvcnRlZF9jb250YWluZXJzXyAmJiAodHR5cGUtPmlzX21hcCgpIHx8IHR0eXBlLT5pc19zZXQoKSkpIHsKLSAgICAvLyBUcmVlU2V0IGFuZCBUcmVlTWFwIGRvbid0IGhhdmUgYW55IGNvbnN0cnVjdG9yIHdoaWNoIHRha2VzIGEgY2FwYWN0aXR5IGFzIGFuIGFyZ3VtZW50Ci0gICAgb3V0IDw8ICIoKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgb3V0IDw8ICIoIgotICAgICAgPDwgKHR0eXBlLT5pc19saXN0KCkgPyAiIiA6ICIyKiIgKQotICAgICAgPDwgb2JqIDw8ICIuc2l6ZSIKLSAgICAgIDw8ICIpOyIgPDwgZW5kbDsKLSAgfQotCi0gIGlmIChyZXVzZV9vYmplY3RzXykgewotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gIH0KLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBwcmVmaXgsIG9iaiwgaGFzX21ldGFkYXRhKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIHByZWZpeCwgb2JqLCBoYXNfbWV0YWRhdGEpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgcHJlZml4LCBvYmosIGhhc19tZXRhZGF0YSk7Ci0gIH0KLQotICBzY29wZV9kb3duKG91dCk7Ci0KLSAgaWYgKGhhc19tZXRhZGF0YSkgewotICAgIC8vIFJlYWQgY29udGFpbmVyIGVuZAotICAgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkTWFwRW5kKCk7IiA8PCBlbmRsOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZFNldEVuZCgpOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkTGlzdEVuZCgpOyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLSAgc2NvcGVfZG93bihvdXQpOwotfQotCi0KLS8qKgotICogR2VuZXJhdGVzIGNvZGUgdG8gZGVzZXJpYWxpemUgYSBtYXAKLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBvYmosIGJvb2wgaGFzX21ldGFkYXRhKSB7Ci0gIHN0cmluZyBrZXkgPSB0bXAoIl9rZXkiKTsKLSAgc3RyaW5nIHZhbCA9IHRtcCgiX3ZhbCIpOwotICB0X2ZpZWxkIGZrZXkodG1hcC0+Z2V0X2tleV90eXBlKCksIGtleSk7Ci0gIHRfZmllbGQgZnZhbCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdmFsKTsKLQotICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZma2V5LCByZXVzZV9vYmplY3RzXywgZmFsc2UpIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZ2YWwsIHJldXNlX29iamVjdHNfLCBmYWxzZSkgPDwgZW5kbDsKLQotICAvLyBGb3IgbG9vcCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzCi0gICAgIHN0cmluZyBpID0gdG1wKCJfaSIpOwotICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICJmb3IgKGludCAiIDw8IGkgPDwgIiA9IDA7ICIgPDwKLSAgICAgICAgICBpIDw8ICIgPCAiIDw8IG9iaiA8PCAiLnNpemUiIDw8ICI7ICIgPDwKLSAgICAgICAgICAiKysiIDw8IGkgPDwgIikiIDw8IGVuZGw7Ci0gIAotICBzY29wZV91cChvdXQpOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZrZXksICIiLCBoYXNfbWV0YWRhdGEpOwotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmdmFsLCAiIiwgaGFzX21ldGFkYXRhKTsKLQotICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi5wdXQoIiA8PCBrZXkgPDwgIiwgIiA8PCB2YWwgPDwgIik7IiA8PCBlbmRsOwotfQotCi0vKioKLSAqIERlc2VyaWFsaXplcyBhIHNldCBlbGVtZW50Ci0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgb2JqLCBib29sIGhhc19tZXRhZGF0YSkgewotICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKLSAgdF9maWVsZCBmZWxlbSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZlbGVtLCByZXVzZV9vYmplY3RzXywgZmFsc2UpIDw8IGVuZGw7Ci0KLSAgLy8gRm9yIGxvb3AgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cwotICAgICBzdHJpbmcgaSA9IHRtcCgiX2kiKTsKLSAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAiZm9yIChpbnQgIiA8PCBpIDw8ICIgPSAwOyAiIDw8Ci0gICAgICAgICAgaSA8PCAiIDwgIiA8PCBvYmogPDwgIi5zaXplIiA8PCAiOyAiIDw8Ci0gICAgICAgICAgIisrIiA8PCBpIDw8ICIpIiA8PCBlbmRsOwotICBzY29wZV91cChvdXQpOwotICAKLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0sICIiLCBoYXNfbWV0YWRhdGEpOwotCi0gIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLmFkZCgiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOwotCi19Ci0KLS8qKgotICogRGVzZXJpYWxpemVzIGEgbGlzdCBlbGVtZW50Ci0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgb2JqLCBib29sIGhhc19tZXRhZGF0YSkgewotICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKLSAgdF9maWVsZCBmZWxlbSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZmZWxlbSwgcmV1c2Vfb2JqZWN0c18sIGZhbHNlKSA8PCBlbmRsOwotCi0gIC8vIEZvciBsb29wIGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMKLSAgICAgc3RyaW5nIGkgPSB0bXAoIl9pIik7Ci0gICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgImZvciAoaW50ICIgPDwgaSA8PCAiID0gMDsgIiA8PAotICAgICAgICAgIGkgPDwgIiA8ICIgPDwgb2JqIDw8ICIuc2l6ZSIgPDwgIjsgIiA8PAotICAgICAgICAgICIrKyIgPDwgaSA8PCAiKSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAob3V0KTsKLSAKLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0sICIiLCBoYXNfbWV0YWRhdGEpOwotCi0gIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLmFkZCgiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCB0byBzZXJpYWxpemUKLSAqIEBwYXJhbSBwcmVmaXggTmFtZSB0byBwcmVwZW5kIHRvIGZpZWxkIG5hbWUKLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsIGJvb2wgaGFzX21ldGFkYXRhKSB7Ci0gIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLQotICAvLyBEbyBub3RoaW5nIGZvciB2b2lkIHR5cGVzCi0gIGlmICh0eXBlLT5pc192b2lkKCkpIHsKLSAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIFNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gIH0KLQotICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRfc3RydWN0Kil0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSwgaGFzX21ldGFkYXRhKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpewotICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUkzMigiIDw8IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiLmdldFZhbHVlKCkpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHN0cmluZyBuYW1lID0gcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC4iOwotCi0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7ICAKLSAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgICAgaWYgKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSkgewotICAgICAgICAgICAgb3V0IDw8ICJ3cml0ZUJpbmFyeSgiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgb3V0IDw8ICJ3cml0ZVN0cmluZygiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgICBvdXQgPDwgIndyaXRlQm9vbCgiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICAgIG91dCA8PCAid3JpdGVCeXRlKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgICBvdXQgPDwgIndyaXRlSTE2KCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgICBvdXQgPDwgIndyaXRlSTMyKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgICBvdXQgPDwgIndyaXRlSTY0KCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgICBvdXQgPDwgIndyaXRlRG91YmxlKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gSmF2YSBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIG91dCA8PCAid3JpdGVJMzIoc3RydWN0LiIgPDwgbmFtZSA8PCAiKTsiOwotICAgIH0KLSAgICBvdXQgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgRklFTEQgJyVzJXMnIFRZUEUgJyVzJ1xuIiwKLSAgICAgICAgICAgcHJlZml4LmNfc3RyKCksCi0gICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAotICAgICAgICAgICB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIGFsbCB0aGUgbWVtYmVycyBvZiBhIHN0cnVjdC4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IHRvIHNlcmlhbGl6ZQotICogQHBhcmFtIHByZWZpeCAgU3RyaW5nIHByZWZpeCB0byBhdHRhY2ggdG8gYWxsIGZpZWxkcwotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gICh2b2lkKSB0c3RydWN0OwotICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIud3JpdGUob3Byb3QpOyIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIGEgY29udGFpbmVyIGJ5IHdyaXRpbmcgaXRzIHNpemUgdGhlbiB0aGUgZWxlbWVudHMuCi0gKgotICogQHBhcmFtIHR0eXBlICBUaGUgdHlwZSBvZiBjb250YWluZXIKLSAqIEBwYXJhbSBwcmVmaXggU3RyaW5nIHByZWZpeCBmb3IgZmllbGRzCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwgYm9vbCBoYXNfbWV0YWRhdGEpIHsKLSAgc2NvcGVfdXAob3V0KTsKLQotICBpZiAoaGFzX21ldGFkYXRhKSB7Ci0gICAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgIm9wcm90LndyaXRlTWFwQmVnaW4obmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAoIiA8PAotICAgICAgICB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgICB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgICBwcmVmaXggPDwgIi5zaXplKCkpKTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICJvcHJvdC53cml0ZVNldEJlZ2luKG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU2V0KCIgPDwKLSAgICAgICAgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICAgIHByZWZpeCA8PCAiLnNpemUoKSkpOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICJvcHJvdC53cml0ZUxpc3RCZWdpbihuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVExpc3QoIiA8PAotICAgICAgICB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICAgIHByZWZpeCA8PCAiLnNpemUoKSkpOyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlSTMyKCIgPDwgcHJlZml4IDw8ICIuc2l6ZSgpKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBzdHJpbmcgaXRlciA9IHRtcCgiX2l0ZXIiKTsKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiZm9yIChNYXAuRW50cnk8IiA8PAotICAgICAgdHlwZV9uYW1lKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCksIHRydWUsIGZhbHNlKSA8PCAiLCAiIDw8Ci0gICAgICB0eXBlX25hbWUoKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSwgdHJ1ZSwgZmFsc2UpIDw8ICI+ICIgPDwgaXRlciA8PAotICAgICAgIiA6ICIgPDwKLSAgICAgIHByZWZpeCA8PCAiLmVudHJ5U2V0KCkpIjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImZvciAoIiA8PAotICAgICAgdHlwZV9uYW1lKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiICIgPDwgaXRlciA8PAotICAgICAgIiA6ICIgPDwKLSAgICAgIHByZWZpeCA8PCAiKSI7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiZm9yICgiIDw8Ci0gICAgICB0eXBlX25hbWUoKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiICIgPDwgaXRlciA8PAotICAgICAgIiA6ICIgPDwKLSAgICAgIHByZWZpeCA8PCAiKSI7Ci0gIH0KLQotICBvdXQgPDwgZW5kbDsKLSAgc2NvcGVfdXAob3V0KTsKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIGl0ZXIsIHByZWZpeCwgaGFzX21ldGFkYXRhKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBpdGVyLCBoYXNfbWV0YWRhdGEpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIGl0ZXIsIGhhc19tZXRhZGF0YSk7Ci0gIH0KLSAgc2NvcGVfZG93bihvdXQpOwotCi0gIGlmIChoYXNfbWV0YWRhdGEpIHsKLSAgICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVNYXBFbmQoKTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZVNldEVuZCgpOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUxpc3RFbmQoKTsiIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBtYXAuCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG1hcCwgYm9vbCBoYXNfbWV0YWRhdGEpIHsKLSAgKHZvaWQpIG1hcDsKLSAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksIGl0ZXIgKyAiLmdldEtleSgpIik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZrZmllbGQsICIiLCBoYXNfbWV0YWRhdGEpOwotICB0X2ZpZWxkIHZmaWVsZCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgaXRlciArICIuZ2V0VmFsdWUoKSIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmdmZpZWxkLCAiIiwgaGFzX21ldGFkYXRhKTsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgc2V0LgotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzX21ldGFkYXRhKSB7Ci0gIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiLCBoYXNfbWV0YWRhdGEpOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBsaXN0LgotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzX21ldGFkYXRhKSB7Ci0gIHRfZmllbGQgZWZpZWxkKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIiwgaGFzX21ldGFkYXRhKTsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIGEgSmF2YSB0eXBlIG5hbWUKLSAqCi0gKiBAcGFyYW0gdHR5cGUgVGhlIHR5cGUKLSAqIEBwYXJhbSBjb250YWluZXIgSXMgdGhlIHR5cGUgZ29pbmcgaW5zaWRlIGEgY29udGFpbmVyPwotICogQHJldHVybiBKYXZhIHR5cGUgbmFtZSwgaS5lLiBIYXNoTWFwPEtleSxWYWx1ZT4KLSAqLwotc3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLCBib29sIGluX2NvbnRhaW5lciwgYm9vbCBpbl9pbml0LCBib29sIHNraXBfZ2VuZXJpYywgYm9vbCBmb3JjZV9uYW1lc3BhY2UpIHsKLSAgLy8gSW4gSmF2YSB0eXBlZGVmcyBhcmUganVzdCByZXNvbHZlZCB0byB0aGVpciByZWFsIHR5cGUKLSAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKLSAgc3RyaW5nIHByZWZpeDsKLQotICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgcmV0dXJuIGJhc2VfdHlwZV9uYW1lKCh0X2Jhc2VfdHlwZSopdHR5cGUsIGluX2NvbnRhaW5lcik7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgdF9tYXAqIHRtYXAgPSAodF9tYXAqKSB0dHlwZTsKLSAgICBpZiAoaW5faW5pdCkgewotICAgICAgaWYgKHNvcnRlZF9jb250YWluZXJzXykgewotICAgICAgICBwcmVmaXggPSAiVHJlZU1hcCI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBwcmVmaXggPSAiSGFzaE1hcCI7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIHByZWZpeCA9ICJNYXAiOwotICAgIH0KLSAgICByZXR1cm4gcHJlZml4ICsgKHNraXBfZ2VuZXJpYyA/ICIiIDogIjwiICsKLSAgICAgICAgICAgICAgICAgICAgIHR5cGVfbmFtZSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwgdHJ1ZSkgKyAiLCIgKwotICAgICAgICAgICAgICAgICAgICAgdHlwZV9uYW1lKHRtYXAtPmdldF92YWxfdHlwZSgpLCB0cnVlKSArICI+Iik7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgdF9zZXQqIHRzZXQgPSAodF9zZXQqKSB0dHlwZTsKLSAgICBpZiAoaW5faW5pdCkgewotICAgICAgaWYgKHNvcnRlZF9jb250YWluZXJzXykgewotICAgICAgICBwcmVmaXggPSAiVHJlZVNldCI7Ci0gICAgICB9IGVsc2UgeyAKLSAgICAgICAgcHJlZml4ID0gIkhhc2hTZXQiOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBwcmVmaXggPSAiU2V0IjsKLSAgICB9Ci0gICAgcmV0dXJuIHByZWZpeCArIChza2lwX2dlbmVyaWMgPyAiIiA6ICI8IiArIHR5cGVfbmFtZSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIHRydWUpICsgIj4iKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgdF9saXN0KiB0bGlzdCA9ICh0X2xpc3QqKSB0dHlwZTsKLSAgICBpZiAoaW5faW5pdCkgewotICAgICAgcHJlZml4ID0gIkFycmF5TGlzdCI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHByZWZpeCA9ICJMaXN0IjsKLSAgICB9Ci0gICAgcmV0dXJuIHByZWZpeCArIChza2lwX2dlbmVyaWMgPyAiIiA6ICI8IiArIHR5cGVfbmFtZSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCB0cnVlKSArICI+Iik7Ci0gIH0KLQotICAvLyBDaGVjayBmb3IgbmFtZXNwYWNpbmcKLSAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHR5cGUtPmdldF9wcm9ncmFtKCk7Ci0gIGlmICgocHJvZ3JhbSAhPSBOVUxMKSAmJiAoKHByb2dyYW0gIT0gcHJvZ3JhbV8pIHx8IGZvcmNlX25hbWVzcGFjZSkpIHsKLSAgICBzdHJpbmcgcGFja2FnZSA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2UoImphdmEiKTsKLSAgICBpZiAoIXBhY2thZ2UuZW1wdHkoKSkgewotICAgICAgcmV0dXJuIHBhY2thZ2UgKyAiLiIgKyB0dHlwZS0+Z2V0X25hbWUoKTsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gdHR5cGUtPmdldF9uYW1lKCk7Ci19Ci0KLS8qKgotICogUmV0dXJucyB0aGUgSmF2YSB0eXBlIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHRocmlmdCB0eXBlLgotICoKLSAqIEBwYXJhbSB0YmFzZSBUaGUgYmFzZSB0eXBlCi0gKiBAcGFyYW0gY29udGFpbmVyIElzIGl0IGdvaW5nIGluIGEgSmF2YSBjb250YWluZXI/Ci0gKi8KLXN0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjpiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZSogdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2NvbnRhaW5lcikgewotICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gdHlwZS0+Z2V0X2Jhc2UoKTsKLQotICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgcmV0dXJuIChpbl9jb250YWluZXIgPyAiVm9pZCIgOiAidm9pZCIpOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7Ci0gICAgICAgIHJldHVybiAiQnl0ZUJ1ZmZlciI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gIlN0cmluZyI7Ci0gICAgICB9Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuIChpbl9jb250YWluZXIgPyAiQm9vbGVhbiIgOiAiYm9vbGVhbiIpOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIHJldHVybiAoaW5fY29udGFpbmVyID8gIkJ5dGUiIDogImJ5dGUiKTsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIHJldHVybiAoaW5fY29udGFpbmVyID8gIlNob3J0IiA6ICJzaG9ydCIpOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgcmV0dXJuIChpbl9jb250YWluZXIgPyAiSW50ZWdlciIgOiAiaW50Iik7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZXR1cm4gKGluX2NvbnRhaW5lciA/ICJMb25nIiA6ICJsb25nIik7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICByZXR1cm4gKGluX2NvbnRhaW5lciA/ICJEb3VibGUiIDogImRvdWJsZSIpOwotICAgIGRlZmF1bHQ6Ci0gICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEphdmEgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICB9Ci19Ci0KLS8qKgotICogRGVjbGFyZXMgYSBmaWVsZCwgd2hpY2ggbWF5IGluY2x1ZGUgaW5pdGlhbGl6YXRpb24gYXMgbmVjZXNzYXJ5LgotICoKLSAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkCi0gKiBAcGFyYW0gaW5pdCBXaGV0aGVyIHRvIGluaXRpYWxpemUgdGhlIGZpZWxkCi0gKi8KLXN0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjpkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0LCBib29sIGNvbW1lbnQpIHsKLSAgLy8gVE9ETyhtY3NsZWUpOiBkbyB3ZSBldmVyIG5lZWQgdG8gaW5pdGlhbGl6ZSB0aGUgZmllbGQ/Ci0gIHN0cmluZyByZXN1bHQgPSB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpKSArICIgIiArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLSAgaWYgKGluaXQpIHsKLSAgICB0X3R5cGUqIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOwotICAgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgdGZpZWxkLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7Ci0gICAgICBvZnN0cmVhbSBkdW1teTsKLSAgICAgIHJlc3VsdCArPSAiID0gIiArIHJlbmRlcl9jb25zdF92YWx1ZShkdW1teSwgdHR5cGUsIHRmaWVsZC0+Z2V0X3ZhbHVlKCkpOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgICByZXN1bHQgKz0gIiA9IG51bGwiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgICAgcmVzdWx0ICs9ICIgPSBmYWxzZSI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgICByZXN1bHQgKz0gIiA9IDAiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgICByZXN1bHQgKz0gIiA9IChkb3VibGUpMCI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICByZXN1bHQgKz0gIiA9IDAiOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgICByZXN1bHQgKz0gIiA9IG5ldyAiICsgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSkgKyAiKCkiOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXN1bHQgKz0gIiA9IG5ldyAiICsgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSkgKyAiKCkiOzsKLSAgICB9Ci0gIH0KLSAgcmVzdWx0ICs9ICI7IjsKLSAgaWYgKGNvbW1lbnQpIHsKLSAgICByZXN1bHQgKz0gIiAvLyAiOwotICAgIGlmICh0ZmllbGQtPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMKSB7Ci0gICAgICByZXN1bHQgKz0gIm9wdGlvbmFsIjsKLSAgICB9IGVsc2UgewotICAgICAgcmVzdWx0ICs9ICJyZXF1aXJlZCI7Ci0gICAgfQotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAndHlwZSBuYW1lKGFyZ3MpJwotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgotICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgotICovCi1zdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICB0X3R5cGUqIHR0eXBlID0gdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpOwotICBzdGQ6OnN0cmluZyBmbl9uYW1lID0gZ2V0X3JwY19tZXRob2RfbmFtZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpOwotICBzdGQ6OnN0cmluZyByZXN1bHQgPQotICAgIHR5cGVfbmFtZSh0dHlwZSkgKyAiICIgKyBwcmVmaXggKyBmbl9uYW1lICsgIigiICsgYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpICsgIikgdGhyb3dzICI7Ci0gIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0gIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgcmVzdWx0ICs9IHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCksIGZhbHNlLCBmYWxzZSkgKyAiLCAiOwotICB9Ci0gIHJlc3VsdCArPSAib3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiI7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAndm9pZCBuYW1lKGFyZ3MsIHJlc3VsdEhhbmRsZXIpJwotICoKLSAqIEBwYXJhbXMgdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KLSAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KLSAqLwotc3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZV9hc3luYyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIGJvb2wgdXNlX2Jhc2VfbWV0aG9kLCBzdHJpbmcgcHJlZml4KSB7Ci0gIHN0ZDo6c3RyaW5nIGFyZ2xpc3QgPSBhc3luY19mdW5jdGlvbl9jYWxsX2FyZ2xpc3QodGZ1bmN0aW9uLCB1c2VfYmFzZV9tZXRob2QsIHRydWUpOwotCi0gIHN0ZDo6c3RyaW5nIHJldF90eXBlID0gIiI7Ci0gIGlmICh1c2VfYmFzZV9tZXRob2QpIHsKLSAgICByZXRfdHlwZSArPSAiQXN5bmNDbGllbnQuIjsKLSAgfQotICByZXRfdHlwZSArPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX2NhbGwiOwotCi0gIHN0ZDo6c3RyaW5nIGZuX25hbWUgPSBnZXRfcnBjX21ldGhvZF9uYW1lKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSk7Ci0KLSAgc3RkOjpzdHJpbmcgcmVzdWx0ID0gcHJlZml4ICsgInZvaWQgIiArIGZuX25hbWUgKyAiKCIgKyBhcmdsaXN0ICsgIikiOwotICByZXR1cm4gcmVzdWx0OwotfQotCi1zdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6YXN5bmNfZnVuY3Rpb25fY2FsbF9hcmdsaXN0KHRfZnVuY3Rpb24qIHRmdW5jLCBib29sIHVzZV9iYXNlX21ldGhvZCwgYm9vbCBpbmNsdWRlX3R5cGVzKSB7Ci0gICh2b2lkKSB1c2VfYmFzZV9tZXRob2Q7Ci0gIHN0ZDo6c3RyaW5nIGFyZ2xpc3QgPSAiIjsKLSAgaWYgKHRmdW5jLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpLnNpemUoKSA+IDApIHsKLSAgICBhcmdsaXN0ID0gYXJndW1lbnRfbGlzdCh0ZnVuYy0+Z2V0X2FyZ2xpc3QoKSwgaW5jbHVkZV90eXBlcykgKyAiLCAiOwotICB9Ci0KLSAgaWYgKGluY2x1ZGVfdHlwZXMpIHsKLSAgICBhcmdsaXN0ICs9ICJvcmcuYXBhY2hlLnRocmlmdC5hc3luYy5Bc3luY01ldGhvZENhbGxiYWNrICI7Ci0gIH0KLSAgYXJnbGlzdCArPSAicmVzdWx0SGFuZGxlciI7Ci0KLSAgcmV0dXJuIGFyZ2xpc3Q7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhIGNvbW1hIHNlcGFyYXRlZCBmaWVsZCBsaXN0LCB3aXRoIHR5cGUgbmFtZXMKLSAqLwotc3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaW5jbHVkZV90eXBlcykgewotICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlc3VsdCArPSAiLCAiOwotICAgIH0KLSAgICBpZiAoaW5jbHVkZV90eXBlcykgewotICAgICAgcmVzdWx0ICs9IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF90eXBlKCkpICsgIiAiOwotICAgIH0KLSAgICByZXN1bHQgKz0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjphc3luY19hcmd1bWVudF9saXN0KHRfZnVuY3Rpb24qIHRmdW5jdCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHRfdHlwZSogdHR5cGUsIGJvb2wgaW5jbHVkZV90eXBlcykgewotICAodm9pZCkgdGZ1bmN0OwotICAodm9pZCkgdHR5cGU7Ci0gIHN0cmluZyByZXN1bHQgPSAiIjsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlc3VsdCArPSAiLCAiOwotICAgIH0KLSAgICBpZiAoaW5jbHVkZV90eXBlcykgewotICAgICAgcmVzdWx0ICs9IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF90eXBlKCkpICsgIiAiOwotICAgIH0KLSAgICByZXN1bHQgKz0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICB9Ci0gIGlmICghZmlyc3QpIHsKLSAgICByZXN1bHQgKz0gIiwgIjsKLSAgfQotICBpZiAoaW5jbHVkZV90eXBlcykgewotICAgIHJlc3VsdCArPSAib3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuQXN5bmNNZXRob2RDYWxsYmFjayAiOwotICB9Ci0gIHJlc3VsdCArPSAicmVzdWx0SGFuZGxlciI7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBKYXZhIGVudW0gc3RyaW5nIGZvciB0aGUgZ2l2ZW4gdHlwZS4KLSAqLwotc3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OnR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpIHsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIHJldHVybiAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HIjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5CT09MIjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5CWVRFIjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkkxNiI7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5JMzIiOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgIHJldHVybiAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTY0IjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkRPVUJMRSI7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTMyIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5NQVAiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TRVQiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHJldHVybiAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuTElTVCI7Ci0gIH0KLQotICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Ci19Ci0KLS8qKgotICogVGFrZXMgYSBuYW1lIGFuZCBwcm9kdWVzIGEgdmFsaWQgSmF2YSBzb3VyY2UgZmlsZSBuYW1lIGZyb20gaXQKLSAqCi0gKiBAcGFyYW0gZnJvbU5hbWUgVGhlIG5hbWUgd2hpY2ggc2hhbGwgYmVjb21lIGEgdmFsaWQgSmF2YSBzb3VyY2UgZmlsZSBuYW1lCi0gKiBAcmV0dXJuIFRoZSBwcm9kdWNlZCBpZGVudGlmaWVyCi0gKi8KLXN0ZDo6c3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6Om1ha2VfdmFsaWRfamF2YV9maWxlbmFtZSggc3RkOjpzdHJpbmcgY29uc3QgJiBmcm9tTmFtZSkgewotICAgIC8vIGlmIGFueSBmdXJ0aGVyIHJ1bGVzIGFwcGx5IHRvIHNvdXJjZSBmaWxlIG5hbWVzIGluIEphdmEsIG1vZGlmeSBhcyBuZWNlc3NhcnkKLSAgICByZXR1cm4gbWFrZV92YWxpZF9qYXZhX2lkZW50aWZpZXIoZnJvbU5hbWUpOwotfQotCi0vKioKLSAqIFRha2VzIGEgbmFtZSBhbmQgcHJvZHVlcyBhIHZhbGlkIEphdmEgaWRlbnRpZmllciBmcm9tIGl0Ci0gKgotICogQHBhcmFtIGZyb21OYW1lIFRoZSBuYW1lIHdoaWNoIHNoYWxsIGJlY29tZSBhIHZhbGlkIEphdmEgaWRlbnRpZmllcgotICogQHJldHVybiBUaGUgcHJvZHVjZWQgaWRlbnRpZmllcgotICovCi1zdGQ6OnN0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjptYWtlX3ZhbGlkX2phdmFfaWRlbnRpZmllciggc3RkOjpzdHJpbmcgY29uc3QgJiBmcm9tTmFtZSkgewotICAgIHN0ZDo6c3RyaW5nIHN0ciA9IGZyb21OYW1lOwotICAgIGlmKCBzdHIuZW1wdHkoKSkgewotICAgICAgICByZXR1cm4gc3RyOwotICAgIH0KLQotICAgIC8vIHRlc3RzIHJlbHkgb24gdGhpcwotICAgIGFzc2VydCggKCdBJyA8ICdaJykgJiYgKCdhJyA8ICd6JykgJiYgKCcwJyA8ICc5JykpOwotICAgIAotICAgIC8vIGlmIHRoZSBmaXJzdCBsZXR0ZXIgaXMgYSBudW1iZXIsIHdlIGFkZCBhbiBhZGRpdGlvbmFsIHVuZGVyc2NvcmUgaW4gZnJvbnQgb2YgaXQKLSAgICBjaGFyIGMgPSBzdHIuYXQoMCk7Ci0gICAgaWYoICgnMCcgPD0gYykgJiYgKGMgPD0gJzknKSkgewotICAgICAgICBzdHIgPSAiXyIgKyBzdHI7Ci0gICAgfQotCi0gICAgLy8gZm9sbG93aW5nIGNoYXJzOiBsZXR0ZXIsIG51bWJlciBvciB1bmRlcnNjb3JlCi0gICAgZm9yKCBzaXplX3QgaSA9IDA7ICBpIDwgc3RyLnNpemUoKTsgICsraSkgewotICAgICAgICBjID0gc3RyLmF0KGkpOyAgICAgICAgCi0gICAgICAgIGlmKCAoKCdBJyA+IGMpIHx8IChjID4gJ1onKSkgJiYgCi0gICAgICAgICAgICAoKCdhJyA+IGMpIHx8IChjID4gJ3onKSkgJiYgCi0gICAgICAgICAgICAoKCcwJyA+IGMpIHx8IChjID4gJzknKSkgJiYgCi0gICAgICAgICAgICAoJ18nICE9IGMpICkgewotICAgICAgICAgICAgc3RyLnJlcGxhY2UoIGksIDEsICJfIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gc3RyOwotfQotCi0KLXN0ZDo6c3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OmFzX2NhbWVsX2Nhc2Uoc3RkOjpzdHJpbmcgbmFtZSwgYm9vbCB1Y2ZpcnN0KSB7Ci0gIHN0ZDo6c3RyaW5nIG5ld19uYW1lOwotICBzaXplX3QgaSA9IDA7Ci0gIGZvciAoaSA9IDA7IGkgPCBuYW1lLnNpemUoKTsgaSsrKSB7Ci0gICAgaWYgKG5hbWVbaV0gIT0gJ18nKSBicmVhazsKLSAgfQotICBpZiAodWNmaXJzdCkgewotICAgIG5ld19uYW1lICs9IHRvdXBwZXIobmFtZVtpKytdKTsKLSAgfQotICBlbHNlIHsKLSAgICBuZXdfbmFtZSArPSB0b2xvd2VyKG5hbWVbaSsrXSk7Ci0gIH0KLSAgZm9yICg7IGkgPCBuYW1lLnNpemUoKTsgaSsrKSB7Ci0gICAgaWYgKG5hbWVbaV0gPT0gJ18nKSB7Ci0gICAgICBpZiAoaSA8IG5hbWUuc2l6ZSgpLTEpIHsKLSAgICAgICAgaSsrOwotICAgICAgICBuZXdfbmFtZSArPSB0b3VwcGVyKG5hbWVbaV0pOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIG5ld19uYW1lICs9IG5hbWVbaV07Ci0gICAgfQotICB9Ci0gIHJldHVybiBuZXdfbmFtZTsKLX0KLQotc3RkOjpzdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6Z2V0X3JwY19tZXRob2RfbmFtZShzdGQ6OnN0cmluZyBuYW1lKSB7Ci0gIGlmIChmdWxsY2FtZWxfc3R5bGVfKSB7Ci0gICAgcmV0dXJuIGFzX2NhbWVsX2Nhc2UobmFtZSwgZmFsc2UpOwotICB9IGVsc2UgewotICAgIHJldHVybiBuYW1lOwotICB9Ci19Ci0KLS8qKgotICogQXBwbGllcyB0aGUgY29ycmVjdCBzdHlsZSB0byBhIHN0cmluZyBiYXNlZCBvbiB0aGUgdmFsdWUgb2Ygbm9jYW1lbF9zdHlsZV8KLSAqIGFuZC9vciBmdWxsY2FtZWxfc3R5bGVfCi0gKi8KLXN0ZDo6c3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OmdldF9jYXBfbmFtZShzdGQ6OnN0cmluZyBuYW1lKXsKLSAgaWYgKG5vY2FtZWxfc3R5bGVfKSB7Ci0gICAgcmV0dXJuICJfIiArIG5hbWU7Ci0gIH0gZWxzZSBpZiAoZnVsbGNhbWVsX3N0eWxlXykgewotICAgIHJldHVybiBhc19jYW1lbF9jYXNlKG5hbWUpOwotICB9IGVsc2UgewotICAgIG5hbWVbMF0gPSB0b3VwcGVyKG5hbWVbMF0pOwotICAgIHJldHVybiBuYW1lOwotICB9Ci19Ci0KLXN0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjpjb25zdGFudF9uYW1lKHN0cmluZyBuYW1lKSB7Ci0gIHN0cmluZyBjb25zdGFudF9uYW1lOwotCi0gIGJvb2wgaXNfZmlyc3QgPSB0cnVlOwotICBib29sIHdhc19wcmV2aW91c19jaGFyX3VwcGVyID0gZmFsc2U7Ci0gIGZvciAoc3RyaW5nOjppdGVyYXRvciBpdGVyID0gbmFtZS5iZWdpbigpOyBpdGVyICE9IG5hbWUuZW5kKCk7ICsraXRlcikgewotICAgIHN0cmluZzo6dmFsdWVfdHlwZSBjaGFyYWN0ZXIgPSAoKml0ZXIpOwotCi0gICAgYm9vbCBpc191cHBlciA9IGlzdXBwZXIoY2hhcmFjdGVyKTsKLQotICAgIGlmIChpc191cHBlciAmJiAhaXNfZmlyc3QgJiYgIXdhc19wcmV2aW91c19jaGFyX3VwcGVyKSB7Ci0gICAgICBjb25zdGFudF9uYW1lICs9ICdfJzsKLSAgICB9Ci0gICAgY29uc3RhbnRfbmFtZSArPSB0b3VwcGVyKGNoYXJhY3Rlcik7Ci0KLSAgICBpc19maXJzdCA9IGZhbHNlOwotICAgIHdhc19wcmV2aW91c19jaGFyX3VwcGVyID0gaXNfdXBwZXI7Ci0gIH0KLQotICByZXR1cm4gY29uc3RhbnRfbmFtZTsKLX0KLQotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWVwX2NvcHlfY29udGFpbmVyKG9mc3RyZWFtICZvdXQsIHN0ZDo6c3RyaW5nIHNvdXJjZV9uYW1lX3AxLCBzdGQ6OnN0cmluZyBzb3VyY2VfbmFtZV9wMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyByZXN1bHRfbmFtZSwgdF90eXBlKiB0eXBlKSB7Ci0KLSAgdF9jb250YWluZXIqIGNvbnRhaW5lciA9ICh0X2NvbnRhaW5lciopdHlwZTsKLSAgc3RkOjpzdHJpbmcgc291cmNlX25hbWU7Ci0gIGlmIChzb3VyY2VfbmFtZV9wMiA9PSAiIikKLSAgICBzb3VyY2VfbmFtZSA9IHNvdXJjZV9uYW1lX3AxOwotICBlbHNlCi0gICAgc291cmNlX25hbWUgPSBzb3VyY2VfbmFtZV9wMSArICIuIiArIHNvdXJjZV9uYW1lX3AyOwotICAKLSAgYm9vbCBjb3B5X2NvbnN0cnVjdF9jb250YWluZXI7Ci0gIGlmIChjb250YWluZXItPmlzX21hcCgpKSB7Ci0gICAgdF9tYXAgKnRtYXAgPSAodF9tYXAgKiljb250YWluZXI7Ci0gICAgY29weV9jb25zdHJ1Y3RfY29udGFpbmVyID0gdG1hcC0+Z2V0X2tleV90eXBlKCktPmlzX2Jhc2VfdHlwZSgpICYmIHRtYXAtPmdldF92YWxfdHlwZSgpLT5pc19iYXNlX3R5cGUoKTsKLSAgfSBlbHNlIHsKLSAgICB0X3R5cGUqIGVsZW1fdHlwZSA9IGNvbnRhaW5lci0+aXNfbGlzdCgpID8gKCh0X2xpc3QgKikgY29udGFpbmVyKS0+Z2V0X2VsZW1fdHlwZSgpIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh0X3NldCAqKSBjb250YWluZXIpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgY29weV9jb25zdHJ1Y3RfY29udGFpbmVyID0gZWxlbV90eXBlLT5pc19iYXNlX3R5cGUoKTsKLSAgfQotCi0gIGlmIChjb3B5X2NvbnN0cnVjdF9jb250YWluZXIpIHsKLSAgICAvLyBkZWVwIGNvcHkgb2YgYmFzZSB0eXBlcyBjYW4gYmUgZG9uZSBtdWNoIG1vcmUgZWZmaWNpZW50bHkgdGhhbiBpdGVyYXRpbmcgb3ZlciBhbGwgdGhlIGVsZW1lbnRzIG1hbnVhbGx5Ci0gICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKHR5cGUsIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgcmVzdWx0X25hbWUgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZShjb250YWluZXIsIGZhbHNlLCB0cnVlKSA8PCAiKCIgPDwgc291cmNlX25hbWUgPDwgIik7IiA8PCBlbmRsOwotICAgIHJldHVybjsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIGNhcGFjaXR5OwotICBpZiAoIShzb3J0ZWRfY29udGFpbmVyc18gJiYgKGNvbnRhaW5lci0+aXNfbWFwKCkgfHwgY29udGFpbmVyLT5pc19zZXQoKSkpKSB7Ci0gICAgLy8gdW5zb3J0ZWQgY29udGFpbmVycyBhY2NlcHQgYSBjYXBhY2l0eSB2YWx1ZQotICAgIGNhcGFjaXR5ID0gc291cmNlX25hbWUgKyAiLnNpemUoKSI7Ci0gIH0KLSAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKHR5cGUsIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgcmVzdWx0X25hbWUgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZShjb250YWluZXIsIGZhbHNlLCB0cnVlKSA8PCAiKCIgPDwgY2FwYWNpdHkgPDwgIik7IiA8PCBlbmRsOwotCi0gIHN0ZDo6c3RyaW5nIGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSA9IHNvdXJjZV9uYW1lX3AxICsgIl9lbGVtZW50IjsKLSAgc3RkOjpzdHJpbmcgcmVzdWx0X2VsZW1lbnRfbmFtZSA9IHJlc3VsdF9uYW1lICsgIl9jb3B5IjsKLQotICBpZihjb250YWluZXItPmlzX21hcCgpKSB7Ci0gICAgdF90eXBlKiBrZXlfdHlwZSA9ICgodF9tYXAqKWNvbnRhaW5lciktPmdldF9rZXlfdHlwZSgpOwotICAgIHRfdHlwZSogdmFsX3R5cGUgPSAoKHRfbWFwKiljb250YWluZXIpLT5nZXRfdmFsX3R5cGUoKTsKLQotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiZm9yIChNYXAuRW50cnk8IiA8PCB0eXBlX25hbWUoa2V5X3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiLCAiIDw8IHR5cGVfbmFtZSh2YWxfdHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICI+ICIgPDwgaXRlcmF0b3JfZWxlbWVudF9uYW1lIDw8ICIgOiAiIDw8IHNvdXJjZV9uYW1lIDw8ICIuZW50cnlTZXQoKSkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIG91dCA8PCBlbmRsOwotCi0gICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKGtleV90eXBlLCB0cnVlLCBmYWxzZSkgPDwgIiAiIDw8IGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSA8PCAiX2tleSA9ICIgPDwgaXRlcmF0b3JfZWxlbWVudF9uYW1lIDw8ICIuZ2V0S2V5KCk7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZSh2YWxfdHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCBpdGVyYXRvcl9lbGVtZW50X25hbWUgPDwgIl92YWx1ZSA9ICIgPDwgaXRlcmF0b3JfZWxlbWVudF9uYW1lIDw8ICIuZ2V0VmFsdWUoKTsiIDw8IGVuZGw7Ci0KLSAgICBvdXQgPDwgZW5kbDsKLQotICAgIGlmIChrZXlfdHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICAgIGdlbmVyYXRlX2RlZXBfY29weV9jb250YWluZXIob3V0LCBpdGVyYXRvcl9lbGVtZW50X25hbWUgKyAiX2tleSIsICIiLCByZXN1bHRfZWxlbWVudF9uYW1lICsgIl9rZXkiLCBrZXlfdHlwZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZShrZXlfdHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCByZXN1bHRfZWxlbWVudF9uYW1lIDw8ICJfa2V5ID0gIjsKLSAgICAgIGdlbmVyYXRlX2RlZXBfY29weV9ub25fY29udGFpbmVyKG91dCwgaXRlcmF0b3JfZWxlbWVudF9uYW1lICsgIl9rZXkiLCByZXN1bHRfZWxlbWVudF9uYW1lICsgIl9rZXkiLCBrZXlfdHlwZSk7Ci0gICAgICBvdXQgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgb3V0IDw8IGVuZGw7Ci0KLSAgICBpZiAodmFsX3R5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfY29udGFpbmVyKG91dCwgaXRlcmF0b3JfZWxlbWVudF9uYW1lICsgIl92YWx1ZSIsICIiLCByZXN1bHRfZWxlbWVudF9uYW1lICsgIl92YWx1ZSIsIHZhbF90eXBlKTsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKHZhbF90eXBlLCB0cnVlLCBmYWxzZSkgPDwgIiAiIDw8IHJlc3VsdF9lbGVtZW50X25hbWUgPDwgIl92YWx1ZSA9ICI7Ci0gICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfbm9uX2NvbnRhaW5lcihvdXQsIGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSArICJfdmFsdWUiLCByZXN1bHRfZWxlbWVudF9uYW1lICsgIl92YWx1ZSIsIHZhbF90eXBlKTsKLSAgICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBvdXQgPDwgZW5kbDsKLQotICAgIGluZGVudChvdXQpIDw8IHJlc3VsdF9uYW1lIDw8ICIucHV0KCIgPDwgcmVzdWx0X2VsZW1lbnRfbmFtZSA8PCAiX2tleSwgIiA8PCByZXN1bHRfZWxlbWVudF9uYW1lIDw8ICJfdmFsdWUpOyIgPDwgZW5kbDsKLQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgfSBlbHNlIHsKLSAgICB0X3R5cGUqIGVsZW1fdHlwZTsKLQotICAgIGlmIChjb250YWluZXItPmlzX3NldCgpKSB7Ci0gICAgICBlbGVtX3R5cGUgPSAoKHRfc2V0Kiljb250YWluZXIpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGVsZW1fdHlwZSA9ICgodF9saXN0Kiljb250YWluZXIpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgfQotCi0gICAgaW5kZW50KG91dCkKLSAgICAgIDw8ICJmb3IgKCIgPDwgdHlwZV9uYW1lKGVsZW1fdHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCBpdGVyYXRvcl9lbGVtZW50X25hbWUgPDwgIiA6ICIgPDwgc291cmNlX25hbWUgPDwgIikgeyIgPDwgZW5kbDsKLQotICAgIGluZGVudF91cCgpOwotCi0gICAgaWYgKGVsZW1fdHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICAgIC8vIHJlY3Vyc2l2ZSBkZWVwIGNvcHkKLSAgICAgIGdlbmVyYXRlX2RlZXBfY29weV9jb250YWluZXIob3V0LCBpdGVyYXRvcl9lbGVtZW50X25hbWUsICIiLCByZXN1bHRfZWxlbWVudF9uYW1lLCBlbGVtX3R5cGUpOwotICAgICAgaW5kZW50KG91dCkgPDwgcmVzdWx0X25hbWUgPDwgIi5hZGQoIiA8PCByZXN1bHRfZWxlbWVudF9uYW1lIDw8ICIpOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgLy8gaXRlcmF0aXZlIGNvcHkKLSAgICAgIGlmKCgodF9iYXNlX3R5cGUqKWVsZW1fdHlwZSktPmlzX2JpbmFyeSgpKXsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgIkJ5dGVCdWZmZXIgdGVtcF9iaW5hcnlfZWxlbWVudCA9ICI7Ci0gICAgICAgIGdlbmVyYXRlX2RlZXBfY29weV9ub25fY29udGFpbmVyKG91dCwgaXRlcmF0b3JfZWxlbWVudF9uYW1lLCAidGVtcF9iaW5hcnlfZWxlbWVudCIsIGVsZW1fdHlwZSk7Ci0gICAgICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgcmVzdWx0X25hbWUgPDwgIi5hZGQodGVtcF9iaW5hcnlfZWxlbWVudCk7IiA8PCBlbmRsOwotICAgICAgfSBlbHNlewotICAgICAgICBpbmRlbnQob3V0KSA8PCByZXN1bHRfbmFtZSA8PCAiLmFkZCgiOwotICAgICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfbm9uX2NvbnRhaW5lcihvdXQsIGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSwgcmVzdWx0X25hbWUsIGVsZW1fdHlwZSk7Ci0gICAgICAgIG91dCA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaW5kZW50X2Rvd24oKTsKLQotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotCi0gIH0KLX0KLQotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWVwX2NvcHlfbm9uX2NvbnRhaW5lcihvZnN0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBzb3VyY2VfbmFtZSwgc3RkOjpzdHJpbmcgZGVzdF9uYW1lLCB0X3R5cGUqIHR5cGUpIHsKLSAgKHZvaWQpIGRlc3RfbmFtZTsKLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSB8fCB0eXBlLT5pc190eXBlZGVmKCkpIHsKLSAgICBpZiAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICBvdXQgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLmNvcHlCaW5hcnkoIiA8PCBzb3VyY2VfbmFtZSA8PCAiKSI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIGV2ZXJ5dGhpbmcgZWxzZSBjYW4gYmUgY29waWVkIGRpcmVjdGx5Ci0gICAgICBvdXQgPDwgc291cmNlX25hbWU7Ci0gICAgfQotICB9IGVsc2UgewotICAgIG91dCA8PCAibmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIHRydWUsIHRydWUpIDw8ICIoIiA8PCBzb3VyY2VfbmFtZSA8PCAiKSI7Ci0gIH0KLX0KLQotc3RkOjpzdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaXNzZXRfY2hlY2sodF9maWVsZCogZmllbGQpIHsKLSAgcmV0dXJuIGdlbmVyYXRlX2lzc2V0X2NoZWNrKGZpZWxkLT5nZXRfbmFtZSgpKTsKLX0KLQotc3RkOjpzdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6aXNzZXRfZmllbGRfaWQodF9maWVsZCogZmllbGQpIHsKLSAgcmV0dXJuICJfXyIgKyB1cGNhc2Vfc3RyaW5nKGZpZWxkLT5nZXRfbmFtZSgpICsgIl9pc3NldF9pZCIpOwotfQotCi1zdGQ6OnN0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9pc3NldF9jaGVjayhzdGQ6OnN0cmluZyBmaWVsZF9uYW1lKSB7Ci0gIHJldHVybiAiaXMiICsgZ2V0X2NhcF9uYW1lKCJzZXQiKSArIGdldF9jYXBfbmFtZShmaWVsZF9uYW1lKSArICIoKSI7Ci19Ci0KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaXNzZXRfc2V0KG9mc3RyZWFtJiBvdXQsIHRfZmllbGQqIGZpZWxkLCBzdHJpbmcgcHJlZml4KSB7Ci0gIGlmICghdHlwZV9jYW5fYmVfbnVsbChmaWVsZC0+Z2V0X3R5cGUoKSkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgInNldCIgPDwgZ2V0X2NhcF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCBnZXRfY2FwX25hbWUoImlzU2V0IikgPDwgIih0cnVlKTsiIDw8IGVuZGw7Ci0gIH0KLX0KLQotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3RfZGVzYyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBpbmRlbnQob3V0KSA8PAotICAicHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFN0cnVjdCBTVFJVQ1RfREVTQyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU3RydWN0KFwiIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICJcIik7IiA8PCBlbmRsOwotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2ZpZWxkX2Rlc2NzKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0KLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAicHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkICIgPDwgY29uc3RhbnRfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpIDw8Ci0gICAgICAiX0ZJRUxEX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkKFwiIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiLCAiIDw8Ci0gICAgICB0eXBlX3RvX2VudW0oKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICAiKHNob3J0KSIgPDwgKCptX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIik7IiA8PCBlbmRsOwotICB9Ci19Ci0KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2NoZW1lX21hcChvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPENsYXNzPD8gZXh0ZW5kcyBJU2NoZW1lPiwgU2NoZW1lRmFjdG9yeT4gc2NoZW1lcyA9IG5ldyBIYXNoTWFwPENsYXNzPD8gZXh0ZW5kcyBJU2NoZW1lPiwgU2NoZW1lRmFjdG9yeT4oKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJzdGF0aWMgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgc2NoZW1lcy5wdXQoU3RhbmRhcmRTY2hlbWUuY2xhc3MsIG5ldyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIlN0YW5kYXJkU2NoZW1lRmFjdG9yeSgpKTsiIDw8IGVuZGw7ICAKLSAgaW5kZW50KG91dCkgPDwgIiAgc2NoZW1lcy5wdXQoVHVwbGVTY2hlbWUuY2xhc3MsIG5ldyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIlR1cGxlU2NoZW1lRmFjdG9yeSgpKTsiIDw8IGVuZGw7ICAKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZmllbGRfbmFtZV9jb25zdGFudHMob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgaW5kZW50KG91dCkgPDwgIi8qKiBUaGUgc2V0IG9mIGZpZWxkcyB0aGlzIHN0cnVjdCBjb250YWlucywgYWxvbmcgd2l0aCBjb252ZW5pZW5jZSBtZXRob2RzIGZvciBmaW5kaW5nIGFuZCBtYW5pcHVsYXRpbmcgdGhlbS4gKi8iIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZW51bSBfRmllbGRzIGltcGxlbWVudHMgb3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkSWRFbnVtIHsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X3VwKCk7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgaWYgKCFmaXJzdCkgewotICAgICAgb3V0IDw8ICIsIiA8PCBlbmRsOwotICAgIH0KLSAgICBmaXJzdCA9IGZhbHNlOwotICAgIGdlbmVyYXRlX2phdmFfZG9jKG91dCwgKm1faXRlcik7Ci0gICAgaW5kZW50KG91dCkgPDwgY29uc3RhbnRfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpIDw8ICIoKHNob3J0KSIgPDwgKCptX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIiwgXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIpIjsKLSAgfQotCi0gIG91dCA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBfRmllbGRzPiBieU5hbWUgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIF9GaWVsZHM+KCk7IiA8PCBlbmRsOwotICBvdXQgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAic3RhdGljIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIGZvciAoX0ZpZWxkcyBmaWVsZCA6IEVudW1TZXQuYWxsT2YoX0ZpZWxkcy5jbGFzcykpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgICAgYnlOYW1lLnB1dChmaWVsZC5nZXRGaWVsZE5hbWUoKSwgZmllbGQpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgfSIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAiLyoqIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICogRmluZCB0aGUgX0ZpZWxkcyBjb25zdGFudCB0aGF0IG1hdGNoZXMgZmllbGRJZCwgb3IgbnVsbCBpZiBpdHMgbm90IGZvdW5kLiIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAqLyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBzdGF0aWMgX0ZpZWxkcyBmaW5kQnlUaHJpZnRJZChpbnQgZmllbGRJZCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJzd2l0Y2goZmllbGRJZCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgKCptX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjogLy8gIiA8PCBjb25zdGFudF9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gIiA8PCBjb25zdGFudF9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIjsiIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBudWxsOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICIvKioiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgKiBGaW5kIHRoZSBfRmllbGRzIGNvbnN0YW50IHRoYXQgbWF0Y2hlcyBmaWVsZElkLCB0aHJvd2luZyBhbiBleGNlcHRpb24iIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgKiBpZiBpdCBpcyBub3QgZm91bmQuIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICovIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicHVibGljIHN0YXRpYyBfRmllbGRzIGZpbmRCeVRocmlmdElkT3JUaHJvdyhpbnQgZmllbGRJZCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgX0ZpZWxkcyBmaWVsZHMgPSBmaW5kQnlUaHJpZnRJZChmaWVsZElkKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIGlmIChmaWVsZHMgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihcIkZpZWxkIFwiICsgZmllbGRJZCArIFwiIGRvZXNuJ3QgZXhpc3QhXCIpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIGZpZWxkczsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgIi8qKiIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAqIEZpbmQgdGhlIF9GaWVsZHMgY29uc3RhbnQgdGhhdCBtYXRjaGVzIG5hbWUsIG9yIG51bGwgaWYgaXRzIG5vdCBmb3VuZC4iIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgKi8iIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgc3RhdGljIF9GaWVsZHMgZmluZEJ5TmFtZShTdHJpbmcgbmFtZSkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIGJ5TmFtZS5nZXQobmFtZSk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJwcml2YXRlIGZpbmFsIHNob3J0IF90aHJpZnRJZDsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJwcml2YXRlIGZpbmFsIFN0cmluZyBfZmllbGROYW1lOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJfRmllbGRzKHNob3J0IHRocmlmdElkLCBTdHJpbmcgZmllbGROYW1lKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICBfdGhyaWZ0SWQgPSB0aHJpZnRJZDsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIF9maWVsZE5hbWUgPSBmaWVsZE5hbWU7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgc2hvcnQgZ2V0VGhyaWZ0RmllbGRJZCgpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBfdGhyaWZ0SWQ7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgU3RyaW5nIGdldEZpZWxkTmFtZSgpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBfZmllbGROYW1lOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLQotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLX0KLQotdF9qYXZhX2dlbmVyYXRvcjo6aXNzZXRfdHlwZSB0X2phdmFfZ2VuZXJhdG9yOjpuZWVkc19pc3NldCh0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgKm91dFByaW1pdGl2ZVR5cGUpIHsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLQotICBpbnQgY291bnQgPSAwOwotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgaWYgKCF0eXBlX2Nhbl9iZV9udWxsKGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSkpIHsKLSAgICAgIGNvdW50Kys7Ci0gICAgfQotICB9Ci0gIGlmKGNvdW50ID09IDApIHsKLSAgICByZXR1cm4gSVNTRVRfTk9ORTsKLSAgfSBlbHNlIGlmKGNvdW50IDw9IDY0KSB7Ci0gICAgaWYob3V0UHJpbWl0aXZlVHlwZSAhPSBOVUxMKSB7Ci0gICAgICBpZihjb3VudCA8PSA4KQotICAgICAgICAqb3V0UHJpbWl0aXZlVHlwZSA9ICJieXRlIjsKLSAgICAgIGVsc2UgaWYoY291bnQgPD0gMTYpCi0gICAgICAgICpvdXRQcmltaXRpdmVUeXBlID0gInNob3J0IjsKLSAgICAgIGVsc2UgaWYoY291bnQgPD0gMzIpCi0gICAgICAgICpvdXRQcmltaXRpdmVUeXBlID0gImludCI7Ci0gICAgICBlbHNlIGlmKGNvdW50IDw9IDY0KQotICAgICAgICAqb3V0UHJpbWl0aXZlVHlwZSA9ICJsb25nIjsKLSAgICB9Ci0gICAgcmV0dXJuIElTU0VUX1BSSU1JVElWRTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gSVNTRVRfQklUU0VUOwotICB9Ci19Ci0KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfY2xlYXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBpZiAoIWphdmE1XykgewotICAgIGluZGVudChvdXQpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyB2b2lkIGNsZWFyKCkgeyIgPDwgZW5kbDsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIGluZGVudF91cCgpOwotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgdF9maWVsZCogZmllbGQgPSAqbV9pdGVyOwotICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoZmllbGQtPmdldF90eXBlKCkpOwotCi0gICAgaWYgKGZpZWxkLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7Ci0gICAgICBwcmludF9jb25zdF92YWx1ZShvdXQsICJ0aGlzLiIgKyBmaWVsZC0+Z2V0X25hbWUoKSwgdCwgZmllbGQtPmdldF92YWx1ZSgpLCB0cnVlLCB0cnVlKTsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLQotICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKHQpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgPSBudWxsOyIgPDwgZW5kbDsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLQotICAgIC8vIG11c3QgYmUgYSBiYXNlIHR5cGUKLSAgICAvLyBtZWFucyBpdCBhbHNvIG5lZWRzIHRvIGJlIGV4cGxpY2l0bHkgdW5zZXQKLSAgICBpbmRlbnQob3V0KSA8PCAic2V0IiA8PCBnZXRfY2FwX25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8IGdldF9jYXBfbmFtZSgiaXNTZXQiKSA8PCAiKGZhbHNlKTsiIDw8IGVuZGw7Ci0gICAgdF9iYXNlX3R5cGUqIGJhc2VfdHlwZSA9ICh0X2Jhc2VfdHlwZSopIHQ7Ci0KLSAgICBzd2l0Y2ggKGJhc2VfdHlwZS0+Z2V0X2Jhc2UoKSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgPSAwOyIgPDwgZW5kbDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiID0gMC4wOyIgPDwgZW5kbDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiA9IGZhbHNlOyIgPDwgZW5kbDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyAidW5zdXBwb3J0ZWQgdHlwZTogIiArIGJhc2VfdHlwZS0+Z2V0X25hbWUoKSArICIgZm9yIGZpZWxkICIgKyBmaWVsZC0+Z2V0X25hbWUoKTsKLSAgICB9Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLQotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vLyBnZW5lcmF0ZXMgamF2YSBtZXRob2QgdG8gc2VyaWFsaXplIChpbiB0aGUgSmF2YSBzZW5zZSkgdGhlIG9iamVjdAotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF93cml0ZV9vYmplY3Qob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgKHZvaWQpIHRzdHJ1Y3Q7Ci0gIGluZGVudChvdXQpIDw8ICJwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICB0cnkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgICB3cml0ZShuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbChuZXcgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRJT1N0cmVhbVRyYW5zcG9ydChvdXQpKSk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICB9IGNhdGNoIChvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHRlKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICAgIHRocm93IG5ldyBqYXZhLmlvLklPRXhjZXB0aW9uKHRlIiA8PCAoYW5kcm9pZF9sZWdhY3lfPyAiLmdldE1lc3NhZ2UoKSIgOiAiIikgPDwgIik7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICB9IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vLyBnZW5lcmF0ZXMgamF2YSBtZXRob2QgdG8gc2VyaWFsaXplIChpbiB0aGUgSmF2YSBzZW5zZSkgdGhlIG9iamVjdAotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF9yZWFkX29iamVjdChvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSBpbikgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24geyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgdHJ5IHsiIDw8IGVuZGw7Ci0gIGlmICghdHN0cnVjdC0+aXNfdW5pb24oKSkgewotICAgIHN3aXRjaChuZWVkc19pc3NldCh0c3RydWN0KSkgewotICAgICAgY2FzZSBJU1NFVF9OT05FOgotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgSVNTRVRfUFJJTUlUSVZFOgotICAgICAgICBpbmRlbnQob3V0KSA8PCAiICAgIC8vIGl0IGRvZXNuJ3Qgc2VlbSBsaWtlIHlvdSBzaG91bGQgaGF2ZSB0byBkbyB0aGlzLCBidXQgamF2YSBzZXJpYWxpemF0aW9uIGlzIHdhY2t5LCBhbmQgZG9lc24ndCBjYWxsIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yLiIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgIiAgICBfX2lzc2V0X2JpdGZpZWxkID0gMDsiIDw8IGVuZGw7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBJU1NFVF9CSVRTRVQ6Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICIgICAgLy8gaXQgZG9lc24ndCBzZWVtIGxpa2UgeW91IHNob3VsZCBoYXZlIHRvIGRvIHRoaXMsIGJ1dCBqYXZhIHNlcmlhbGl6YXRpb24gaXMgd2Fja3ksIGFuZCBkb2Vzbid0IGNhbGwgdGhlIGRlZmF1bHQgY29uc3RydWN0b3IuIiA8PCBlbmRsOwotICAgICAgICBpbmRlbnQob3V0KSA8PCAiICAgIF9faXNzZXRfYml0X3ZlY3RvciA9IG5ldyBCaXRTZXQoMSk7IiA8PCBlbmRsOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0KLSAgaW5kZW50KG91dCkgPDwgIiAgICByZWFkKG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UQ29tcGFjdFByb3RvY29sKG5ldyBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVElPU3RyZWFtVHJhbnNwb3J0KGluKSkpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgfSBjYXRjaCAob3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB0ZSkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgICB0aHJvdyBuZXcgamF2YS5pby5JT0V4Y2VwdGlvbih0ZSIgPDwgKGFuZHJvaWRfbGVnYWN5Xz8gIi5nZXRNZXNzYWdlKCkiIDogIiIpIDw8ICIpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgfSIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdGFuZGFyZF9yZWFkZXIob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgInB1YmxpYyB2b2lkIHJlYWQob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIGlwcm90LCAiIDw8ICB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgc3RydWN0KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgLy8gRGVjbGFyZSBzdGFjayB0bXAgdmFyaWFibGVzIGFuZCByZWFkIHN0cnVjdCBoZWFkZXIKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCBzY2hlbWVGaWVsZDsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiaXByb3QucmVhZFN0cnVjdEJlZ2luKCk7IiA8PCBlbmRsOwotCi0gIC8vIExvb3Agb3ZlciByZWFkaW5nIGluIGZpZWxkcwotICBpbmRlbnQob3V0KSA8PCAid2hpbGUgKHRydWUpIiA8PCBlbmRsOwotICBzY29wZV91cChvdXQpOwotCi0gIC8vIFJlYWQgYmVnaW5uaW5nIGZpZWxkIG1hcmtlcgotICBpbmRlbnQob3V0KSA8PCAic2NoZW1lRmllbGQgPSBpcHJvdC5yZWFkRmllbGRCZWdpbigpOyIgPDwgZW5kbDsKLQotICAvLyBDaGVjayBmb3IgZmllbGQgU1RPUCBtYXJrZXIgYW5kIGJyZWFrCi0gIGluZGVudChvdXQpIDw8ICJpZiAoc2NoZW1lRmllbGQudHlwZSA9PSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVE9QKSB7ICIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJicmVhazsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotCi0gIC8vIFN3aXRjaCBzdGF0ZW1lbnQgb24gdGhlIGZpZWxkIHdlIGFyZSByZWFkaW5nCi0gIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKHNjaGVtZUZpZWxkLmlkKSB7IiA8PCBlbmRsOwotCi0gIGluZGVudF91cCgpOwotCi0gIC8vIEdlbmVyYXRlIGRlc2VyaWFsaXphdGlvbiBjb2RlIGZvciBrbm93biBjYXNlcwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiY2FzZSAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICI6IC8vICIgPDwgY29uc3RhbnRfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJpZiAoc2NoZW1lRmllbGQudHlwZSA9PSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJzdHJ1Y3QuIiwgdHJ1ZSk7Ci0gICAgaW5kZW50KG91dCkgPDwgInN0cnVjdC4iIDw8ICJzZXQiIDw8IGdldF9jYXBfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8IGdldF9jYXBfbmFtZSgiaXNTZXQiKSA8PCAiKHRydWUpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgIn0gZWxzZSB7ICIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBzY2hlbWVGaWVsZC50eXBlKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0KLQotICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgc2NoZW1lRmllbGQudHlwZSk7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotCi0gIC8vIFJlYWQgZmllbGQgZW5kIG1hcmtlcgotICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZEZpZWxkRW5kKCk7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJpcHJvdC5yZWFkU3RydWN0RW5kKCk7IiA8PCBlbmRsOwotCi0gIC8vIGluIG5vbi1iZWFucyBzdHlsZSwgY2hlY2sgZm9yIHJlcXVpcmVkIGZpZWxkcyBvZiBwcmltaXRpdmUgdHlwZQotICAvLyAod2hpY2ggY2FuIGJlIGNoZWNrZWQgaGVyZSBidXQgbm90IGluIHRoZSBnZW5lcmFsIHZhbGlkYXRlIG1ldGhvZCkKLSAgaWYgKCFiZWFuX3N0eWxlXyl7Ci0gICAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIi8vIGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMgb2YgcHJpbWl0aXZlIHR5cGUsIHdoaWNoIGNhbid0IGJlIGNoZWNrZWQgaW4gdGhlIHZhbGlkYXRlIG1ldGhvZCIgPDwgZW5kbDsKLSAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQgJiYgIXR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSkgewotICAgICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlmICghc3RydWN0LiIgIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKCpmX2l0ZXIpIDw8ICIpIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgdGhyb3cgbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbEV4Y2VwdGlvbihcIlJlcXVpcmVkIGZpZWxkICciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJyB3YXMgbm90IGZvdW5kIGluIHNlcmlhbGl6ZWQgZGF0YSEgU3RydWN0OiBcIiArIHRvU3RyaW5nKCkpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvLyBwZXJmb3JtcyB2YXJpb3VzIGNoZWNrcyAoZS5nLiBjaGVjayB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHNldCkKLSAgaW5kZW50KG91dCkgPDwgInN0cnVjdC52YWxpZGF0ZSgpOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RhbmRhcmRfd3JpdGVyKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX3Jlc3VsdCkgewotICBpbmRlbnRfdXAoKTsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgInB1YmxpYyB2b2lkIHdyaXRlKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBvcHJvdCwgIiA8PCAKLSAgICB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgc3RydWN0KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICAvLyBwZXJmb3JtcyB2YXJpb3VzIGNoZWNrcyAoZS5nLiBjaGVjayB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHNldCkKLSAgaW5kZW50KG91dCkgPDwgInN0cnVjdC52YWxpZGF0ZSgpOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZVN0cnVjdEJlZ2luKFNUUlVDVF9ERVNDKTsiIDw8IGVuZGw7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBib29sIG51bGxfYWxsb3dlZCA9IHR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICBpZiAobnVsbF9hbGxvd2VkKSB7Ci0gICAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJpZiAoc3RydWN0LiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIT0gbnVsbCkgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgIH0KLSAgICBib29sIG9wdGlvbmFsID0gKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHx8IChpc19yZXN1bHQgJiYgIW51bGxfYWxsb3dlZCk7Ci0gICAgaWYgKG9wdGlvbmFsKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgInN0cnVjdC4iIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKCgqZl9pdGVyKSkgPDwgIikgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgIH0KLQotICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUZpZWxkQmVnaW4oIiA8PCBjb25zdGFudF9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIl9GSUVMRF9ERVNDKTsiIDw8IGVuZGw7Ci0KLSAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJzdHJ1Y3QuIiwgdHJ1ZSk7Ci0KLSAgICAvLyBXcml0ZSBmaWVsZCBjbG9zZXIKLSAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVGaWVsZEVuZCgpOyIgPDwgZW5kbDsKLQotICAgIGlmIChvcHRpb25hbCkgewotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0KLSAgICBpZiAobnVsbF9hbGxvd2VkKSB7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0gIC8vIFdyaXRlIHRoZSBzdHJ1Y3QgbWFwCi0gIG91dCA8PCAKLSAgICBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVGaWVsZFN0b3AoKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci19Ci0KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3Rfc3RhbmRhcmRfc2NoZW1lKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX3Jlc3VsdCl7Ci0gIGluZGVudChvdXQpIDw8ICJwcml2YXRlIHN0YXRpYyBjbGFzcyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIlN0YW5kYXJkU2NoZW1lRmFjdG9yeSBpbXBsZW1lbnRzIFNjaGVtZUZhY3RvcnkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICJTdGFuZGFyZFNjaGVtZSBnZXRTY2hlbWUoKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgInJldHVybiBuZXcgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICJTdGFuZGFyZFNjaGVtZSgpOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgb3V0IDw8IGluZGVudCgpIDw8ICJwcml2YXRlIHN0YXRpYyBjbGFzcyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIlN0YW5kYXJkU2NoZW1lIGV4dGVuZHMgU3RhbmRhcmRTY2hlbWU8IiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICI+IHsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGdlbmVyYXRlX3N0YW5kYXJkX3JlYWRlcihvdXQsIHRzdHJ1Y3QpOwotICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwgZW5kbDsKLSAgZ2VuZXJhdGVfc3RhbmRhcmRfd3JpdGVyKG91dCwgdHN0cnVjdCwgaXNfcmVzdWx0KTsKLQotICBvdXQgPDwKLSAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgZW5kbDsKLX0KLQotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF90dXBsZV9yZWFkZXIob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgaW5kZW50KG91dCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyB2b2lkIHJlYWQob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIHByb3QsICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIHN0cnVjdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJUVHVwbGVQcm90b2NvbCBpcHJvdCA9IChUVHVwbGVQcm90b2NvbCkgcHJvdDsiIDw8IGVuZGw7Ci0gIGludCBvcHRpb25hbF9jb3VudCA9IDA7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTCB8fCAoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVF9JTl9SRVFfT1VUKSB7Ci0gICAgICBvcHRpb25hbF9jb3VudCsrOwotICAgIH0KLSAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgewotICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAoKmZfaXRlciksICJzdHJ1Y3QuIiwgZmFsc2UpOwotICAgICAgaW5kZW50KG91dCkgPDwgInN0cnVjdC5zZXQiIDw8IGdldF9jYXBfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8IGdldF9jYXBfbmFtZSgiaXNTZXQiKSA8PCAiKHRydWUpOyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLSAgaWYgKG9wdGlvbmFsX2NvdW50ID4gMCkgewotICAgIGluZGVudChvdXQpIDw8ICJCaXRTZXQgaW5jb21pbmcgPSBpcHJvdC5yZWFkQml0U2V0KCIgPDwgb3B0aW9uYWxfY291bnQgPDwgIik7IiA8PCBlbmRsOwotICAgIGludCBpID0gMDsKLSAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwgfHwgKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVCkgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKGluY29taW5nLmdldCgiIDw8IGkgPDwgIikpIHsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF91cCgpOwotICAgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICgqZl9pdGVyKSwgInN0cnVjdC4iLCBmYWxzZSk7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJzdHJ1Y3Quc2V0IiA8PCBnZXRfY2FwX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCBnZXRfY2FwX25hbWUoImlzU2V0IikgPDwgIih0cnVlKTsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgICBpKys7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOyAgCi19Ci0KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfdHVwbGVfd3JpdGVyKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGluZGVudChvdXQpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCB3cml0ZShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgcHJvdCwgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgc3RydWN0KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgIlRUdXBsZVByb3RvY29sIG9wcm90ID0gKFRUdXBsZVByb3RvY29sKSBwcm90OyIgPDwgZW5kbDsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGJvb2wgaGFzX29wdGlvbmFsID0gZmFsc2U7Ci0gIGludCBvcHRpb25hbF9jb3VudCA9IDA7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwgfHwgKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVCkgewotICAgICAgb3B0aW9uYWxfY291bnQrKzsKLSAgICAgIGhhc19vcHRpb25hbCA9IHRydWU7Ci0gICAgfQotICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7Ci0gICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAoKmZfaXRlciksICJzdHJ1Y3QuIiwgZmFsc2UpOwotICAgIH0KLSAgfQotICBpZiAoaGFzX29wdGlvbmFsKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIkJpdFNldCBvcHRpb25hbHMgPSBuZXcgQml0U2V0KCk7IiA8PCBlbmRsOwotICAgIGludCBpID0gMDsKLSAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwgfHwgKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVCkgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKHN0cnVjdC4iIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKCgqZl9pdGVyKSkgPDwgIikgeyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJvcHRpb25hbHMuc2V0KCIgPDwgaSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgICBpKys7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlQml0U2V0KG9wdGlvbmFscywgIiA8PCBvcHRpb25hbF9jb3VudCA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgaW50IGogPSAwOwotICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTCB8fCAoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVF9JTl9SRVFfT1VUKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoc3RydWN0LiIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKmZfaXRlcikgPDwgIikgeyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICgqZl9pdGVyKSwgInN0cnVjdC4iLCBmYWxzZSk7Ci0gICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgICBqKys7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X3R1cGxlX3NjaGVtZShvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCl7Ci0gIGluZGVudChvdXQpIDw8ICJwcml2YXRlIHN0YXRpYyBjbGFzcyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIlR1cGxlU2NoZW1lRmFjdG9yeSBpbXBsZW1lbnRzIFNjaGVtZUZhY3RvcnkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICJUdXBsZVNjaGVtZSBnZXRTY2hlbWUoKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgInJldHVybiBuZXcgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICJUdXBsZVNjaGVtZSgpOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAicHJpdmF0ZSBzdGF0aWMgY2xhc3MgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICJUdXBsZVNjaGVtZSBleHRlbmRzIFR1cGxlU2NoZW1lPCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiPiB7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF90dXBsZV93cml0ZXIob3V0LCB0c3RydWN0KTsKLSAgb3V0IDw8IGVuZGw7Ci0gIGdlbmVyYXRlX2phdmFfc3RydWN0X3R1cGxlX3JlYWRlcihvdXQsIHRzdHJ1Y3QpOwotICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZheF9nZW5lcmF0ZWRfYW5ub3RhdGlvbihvZnN0cmVhbSYgb3V0KXsKLSAgdGltZV90IHNlY29uZHMgPSB0aW1lKE5VTEwpOwotICBzdHJ1Y3QgdG0gKm5vdyA9IGxvY2FsdGltZSgmc2Vjb25kcyk7Ci0gIGluZGVudChvdXQpIDw8ICJAR2VuZXJhdGVkKHZhbHVlID0gXCIiIDw8IGF1dG9nZW5fc3VtbWFyeSgpCi0gICAgICAgICAgICAgIDw8ICJcIiwgZGF0ZSA9IFwiIiA8PCAobm93LT50bV95ZWFyICsgMTkwMCkKLSAgICAgICAgICAgICAgPDwgIi0iIDw8IChub3ctPnRtX21vbiArIDEpIDw8ICItIiA8PCBub3ctPnRtX21kYXkKLSAgICAgICAgICAgICAgPDwgIlwiKSIgPDwgZW5kbDsKLX0KLQotVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUihqYXZhLCAiSmF2YSIsCi0iICAgIGJlYW5zOiAgICAgICAgICAgTWVtYmVycyB3aWxsIGJlIHByaXZhdGUsIGFuZCBzZXR0ZXIgbWV0aG9kcyB3aWxsIHJldHVybiB2b2lkLlxuIgotIiAgICBwcml2YXRlLW1lbWJlcnM6IE1lbWJlcnMgd2lsbCBiZSBwcml2YXRlLCBidXQgc2V0dGVyIG1ldGhvZHMgd2lsbCByZXR1cm4gJ3RoaXMnIGxpa2UgdXN1YWwuXG4iCi0iICAgIG5vY2FtZWw6ICAgICAgICAgRG8gbm90IHVzZSBDYW1lbENhc2UgZmllbGQgYWNjZXNzb3JzIHdpdGggYmVhbnMuXG4iCi0iICAgIGZ1bGxjYW1lbDogICAgICAgQ29udmVydCB1bmRlcnNjb3JlZF9hY2Nlc3Nvcl9vcl9zZXJ2aWNlX25hbWVzIHRvIGNhbWVsQ2FzZS5cbiIKLSIgICAgYW5kcm9pZDogICAgICAgICBHZW5lcmF0ZWQgc3RydWN0dXJlcyBhcmUgUGFyY2VsYWJsZS5cbiIKLSIgICAgYW5kcm9pZF9sZWdhY3k6ICBEbyBub3QgdXNlIGphdmEuaW8uSU9FeGNlcHRpb24odGhyb3dhYmxlKSAoYXZhaWxhYmxlIGZvciBBbmRyb2lkIDIuMyBhbmQgYWJvdmUpLlxuIgotIiAgICBqYXZhNTogICAgICAgICAgIEdlbmVyYXRlIEphdmEgMS41IGNvbXBsaWFudCBjb2RlIChpbmNsdWRlcyBhbmRyb2lkX2xlZ2FjeSBmbGFnKS5cbiIKLSIgICAgcmV1c2Utb2JqZWN0czogICBEYXRhIG9iamVjdHMgd2lsbCBub3QgYmUgYWxsb2NhdGVkLCBidXQgZXhpc3RpbmcgaW5zdGFuY2VzIHdpbGwgYmUgdXNlZCAocmVhZCBhbmQgd3JpdGUpLlxuIgotIiAgICBzb3J0ZWRfY29udGFpbmVyczpcbiIKLSIgICAgICAgICAgICAgICAgICAgICBVc2UgVHJlZVNldC9UcmVlTWFwIGluc3RlYWQgb2YgSGFzaFNldC9IYXNoTWFwIGFzIGEgaW1wbGVtZW50YXRpb24gb2Ygc2V0L21hcC5cbiIKLSkKLQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2phdmFtZV9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfamF2YW1lX2dlbmVyYXRvci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI4NTcxZS4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfamF2YW1lX2dlbmVyYXRvci5jYworKysgL2Rldi9udWxsCkBAIC0xLDMzOTUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8ZnN0cmVhbT4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSA8Y2N0eXBlPgotCi0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzdGRleGNlcHQ+Ci0KLSNpbmNsdWRlICJwbGF0Zm9ybS5oIgotI2luY2x1ZGUgInRfb29wX2dlbmVyYXRvci5oIgotCi11c2luZyBzdGQ6Om1hcDsKLXVzaW5nIHN0ZDo6b2ZzdHJlYW07Ci11c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Ci11c2luZyBzdGQ6OnN0cmluZzsKLXVzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwotdXNpbmcgc3RkOjp2ZWN0b3I7Ci0KLXN0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7ICAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCi0KLS8qKgotICogSmF2YSBjb2RlIGdlbmVyYXRvci4KLSAqCi0gKi8KLWNsYXNzIHRfamF2YW1lX2dlbmVyYXRvciA6IHB1YmxpYyB0X29vcF9nZW5lcmF0b3IgewotIHB1YmxpYzoKLSAgdF9qYXZhbWVfZ2VuZXJhdG9yKAotICAgICAgdF9wcm9ncmFtKiBwcm9ncmFtLAotICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKLSAgICA6IHRfb29wX2dlbmVyYXRvcihwcm9ncmFtKQotICB7Ci0gICAgKHZvaWQpIHBhcnNlZF9vcHRpb25zOwotICAgICh2b2lkKSBvcHRpb25fc3RyaW5nOwotICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7Ci0gICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tamF2YW1lIjsKLSAgfQotCi0gIC8qKgotICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCi0gICAqLwotCi0gIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKLSAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKLQotICB2b2lkIGdlbmVyYXRlX2NvbnN0cyhzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKTsKLQotICAvKioKLSAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYgKHRfdHlwZWRlZiogIHR0eXBlZGVmKTsKLSAgdm9pZCBnZW5lcmF0ZV9lbnVtICAgICh0X2VudW0qICAgICB0ZW51bSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3RydWN0ICAodF9zdHJ1Y3QqICAgdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfdW5pb24gICAodF9zdHJ1Y3QqICAgdHVuaW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogICB0eGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UgKHRfc2VydmljZSogIHRzZXJ2aWNlKTsKLQotICB2b2lkIHByaW50X2NvbnN0X3ZhbHVlKHN0ZDo6b2ZzdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwgYm9vbCBpbl9zdGF0aWMsIGJvb2wgZGVmdmFsPWZhbHNlKTsKLSAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKHN0ZDo6b2ZzdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFNlcnZpY2UtbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOwotCi0gIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfZGVmaW5pdGlvbihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX3hjZXB0aW9uPWZhbHNlLCBib29sIGluX2NsYXNzPWZhbHNlLCBib29sIGlzX3Jlc3VsdD1mYWxzZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfZXF1YWxpdHkoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfY29tcGFyZV90byhzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9yZWFkZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfamF2YV92YWxpZGF0b3Ioc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF93cml0ZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfdG9zdHJpbmcoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfY2xlYXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlKTsKLSAgc3RkOjpzdHJpbmcgZ2V0X2phdmFfdHlwZV9zdHJpbmcodF90eXBlKiB0eXBlKTsKLSAgdm9pZCBnZW5lcmF0ZV9yZWZsZWN0aW9uX3NldHRlcnMoc3RkOjpvc3RyaW5nc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSwgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSwgc3RkOjpzdHJpbmcgY2FwX25hbWUpOwotICB2b2lkIGdlbmVyYXRlX3JlZmxlY3Rpb25fZ2V0dGVycyhzdGQ6Om9zdHJpbmdzdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlLCBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lLCBzdGQ6OnN0cmluZyBjYXBfbmFtZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfZ2VuZXJpY19maWVsZF9nZXR0ZXJzX3NldHRlcnMoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfamF2YV9iZWFuX2JvaWxlcnBsYXRlKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotICBzdGQ6OnN0cmluZyBnZXRfY2FwX25hbWUoc3RkOjpzdHJpbmcgbmFtZSk7Ci0gIHN0ZDo6c3RyaW5nIGdlbmVyYXRlX2lzc2V0X2NoZWNrKHRfZmllbGQqIGZpZWxkKTsKLSAgc3RkOjpzdHJpbmcgZ2VuZXJhdGVfaXNzZXRfY2hlY2soc3RkOjpzdHJpbmcgZmllbGQpOwotICB2b2lkIGdlbmVyYXRlX2lzc2V0X3NldChvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiBmaWVsZCk7Ci0gIHN0ZDo6c3RyaW5nIGlzc2V0X2ZpZWxkX2lkKHRfZmllbGQqIGZpZWxkKTsKLQotICB2b2lkIGdlbmVyYXRlX3ByaW1pdGl2ZV9zZXJ2aWNlX2ludGVyZmFjZSAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyAgICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCAgICAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIgICAgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24gICh0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotCi0gIHZvaWQgZ2VuZXJhdGVfamF2YV91bmlvbih0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfdW5pb25fY29uc3RydWN0b3Iob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3VuaW9uX2dldHRlcnNfYW5kX3NldHRlcnMob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3VuaW9uX2Fic3RyYWN0X21ldGhvZHMob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2NoZWNrX3R5cGUob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3JlYWRfdmFsdWUob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3dyaXRlX3ZhbHVlKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9nZXRfZmllbGRfZGVzYyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfZ2V0X3N0cnVjdF9kZXNjKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9nZXRfZmllbGRfbmFtZShvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV91bmlvbl9jb21wYXJpc29ucyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfdW5pb25faGFzaGNvZGUob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotCi0gIC8qKgotICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZCAgICAgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqICAgIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3QgICAgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiAgIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqICAgICB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudCAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiAgICAgIHRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogICAgICB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudCAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiAgICAgdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkICAgICAgICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiAgICB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdCAgICAgICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogICB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIgICAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiAgICAgdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50ICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogICAgICB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG1hcCk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiAgICAgIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiAgICAgdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyKTsKLQotICB2b2lkIGdlbmVyYXRlX2phdmFfZG9jICAgICAgICAgICAgICAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogICAgZmllbGQpOwotCi0gIHZvaWQgZ2VuZXJhdGVfamF2YV9kb2MgICAgICAgICAgICAgICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2RvYyogICAgICB0ZG9jKTsKLQotICB2b2lkIGdlbmVyYXRlX2phdmFfZG9jICAgICAgICAgICAgICAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGRvYyk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9qYXZhX2RvY3N0cmluZ19jb21tZW50ICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjb250ZW50cyk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZWVwX2NvcHlfY29udGFpbmVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgc291cmNlX25hbWVfcDEsIHN0ZDo6c3RyaW5nIHNvdXJjZV9uYW1lX3AyLCBzdGQ6OnN0cmluZyByZXN1bHRfbmFtZSwgdF90eXBlKiB0eXBlKTsKLSAgdm9pZCBnZW5lcmF0ZV9kZWVwX2NvcHlfbm9uX2NvbnRhaW5lcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIHNvdXJjZV9uYW1lLCBzdGQ6OnN0cmluZyBkZXN0X25hbWUsIHRfdHlwZSogdHlwZSk7Ci0KLSAgYm9vbCBoYXNfYml0X3ZlY3Rvcih0X3N0cnVjdCogdHN0cnVjdCk7Ci0KLSAgLyoqCi0gICAqIEhlbHBlciByZW5kZXJpbmcgZnVuY3Rpb25zCi0gICAqLwotCi0gIHN0ZDo6c3RyaW5nIGphdmFfcGFja2FnZSgpOwotICBzdGQ6OnN0cmluZyBqYXZhX3R5cGVfaW1wb3J0cygpOwotICBzdGQ6OnN0cmluZyBqYXZhX3RocmlmdF9pbXBvcnRzKCk7Ci0gIHN0ZDo6c3RyaW5nIHR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLCBib29sIGluX2NvbnRhaW5lcj1mYWxzZSwgYm9vbCBpbl9pbml0PWZhbHNlLCBib29sIHNraXBfZ2VuZXJpYz1mYWxzZSk7Ci0gIHN0ZDo6c3RyaW5nIGJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlKiB0YmFzZSwgYm9vbCBpbl9jb250YWluZXI9ZmFsc2UpOwotICBzdGQ6OnN0cmluZyBkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0PWZhbHNlKTsKLSAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLSAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpbmNsdWRlX3R5cGVzID0gdHJ1ZSk7Ci0gIHN0ZDo6c3RyaW5nIHR5cGVfdG9fZW51bSh0X3R5cGUqIHR0eXBlKTsKLSAgc3RkOjpzdHJpbmcgZ2V0X2VudW1fY2xhc3NfbmFtZSh0X3R5cGUqIHR5cGUpOwotICB2b2lkIGdlbmVyYXRlX3N0cnVjdF9kZXNjKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9maWVsZF9kZXNjcyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHN0ZDo6c3RyaW5nIGJveF90eXBlKHRfdHlwZSogdHlwZSwgc3RyaW5nIHZhbHVlKTsKLQotICBib29sIHR5cGVfY2FuX2JlX251bGwodF90eXBlKiB0dHlwZSkgewotICAgIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7Ci0KLSAgICByZXR1cm4KLSAgICAgIHR0eXBlLT5pc19jb250YWluZXIoKSB8fAotICAgICAgdHR5cGUtPmlzX3N0cnVjdCgpIHx8Ci0gICAgICB0dHlwZS0+aXNfeGNlcHRpb24oKSB8fAotICAgICAgdHR5cGUtPmlzX3N0cmluZygpIHx8Ci0gICAgICB0dHlwZS0+aXNfZW51bSgpOwotICB9Ci0KLSAgc3RkOjpzdHJpbmcgY29uc3RhbnRfbmFtZShzdGQ6OnN0cmluZyBuYW1lKTsKLQotIHByaXZhdGU6Ci0KLSAgLyoqCi0gICAqIEZpbGUgc3RyZWFtcwotICAgKi8KLQotICBzdGQ6OnN0cmluZyBwYWNrYWdlX25hbWVfOwotICBzdGQ6Om9mc3RyZWFtIGZfc2VydmljZV87Ci0gIHN0ZDo6c3RyaW5nIHBhY2thZ2VfZGlyXzsKLQotfTsKLQotCi0vKioKLSAqIFByZXBhcmVzIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0Ci0gKiBzdHJlYW1zLgotICoKLSAqIEBwYXJhbSB0cHJvZ3JhbSBUaGUgcHJvZ3JhbSB0byBnZW5lcmF0ZQotICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQotICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOwotICBwYWNrYWdlX25hbWVfID0gcHJvZ3JhbV8tPmdldF9uYW1lc3BhY2UoImphdmEiKTsKLQotICBzdHJpbmcgZGlyID0gcGFja2FnZV9uYW1lXzsKLSAgc3RyaW5nIHN1YmRpciA9IGdldF9vdXRfZGlyKCk7Ci0gIHN0cmluZzo6c2l6ZV90eXBlIGxvYzsKLSAgd2hpbGUgKChsb2MgPSBkaXIuZmluZCgiLiIpKSAhPSBzdHJpbmc6Om5wb3MpIHsKLSAgICBzdWJkaXIgPSBzdWJkaXIgKyAiLyIgKyBkaXIuc3Vic3RyKDAsIGxvYyk7Ci0gICAgTUtESVIoc3ViZGlyLmNfc3RyKCkpOwotICAgIGRpciA9IGRpci5zdWJzdHIobG9jKzEpOwotICB9Ci0gIGlmIChkaXIuc2l6ZSgpID4gMCkgewotICAgIHN1YmRpciA9IHN1YmRpciArICIvIiArIGRpcjsKLSAgICBNS0RJUihzdWJkaXIuY19zdHIoKSk7Ci0gIH0KLQotICBwYWNrYWdlX2Rpcl8gPSBzdWJkaXI7Ci19Ci0KLS8qKgotICogUGFja2FnZXMgdGhlIGdlbmVyYXRlZCBmaWxlCi0gKgotICogQHJldHVybiBTdHJpbmcgb2YgdGhlIHBhY2thZ2UsIGkuZS4gInBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnRkZW1vOyIKLSAqLwotc3RyaW5nIHRfamF2YW1lX2dlbmVyYXRvcjo6amF2YV9wYWNrYWdlKCkgewotICBpZiAoIXBhY2thZ2VfbmFtZV8uZW1wdHkoKSkgewotICAgIHJldHVybiBzdHJpbmcoInBhY2thZ2UgIikgKyBwYWNrYWdlX25hbWVfICsgIjtcblxuIjsKLSAgfQotICByZXR1cm4gIiI7Ci19Ci0KLS8qKgotICogUHJpbnRzIHN0YW5kYXJkIGphdmEgaW1wb3J0cwotICoKLSAqIEByZXR1cm4gTGlzdCBvZiBpbXBvcnRzIGZvciBKYXZhIHR5cGVzIHRoYXQgYXJlIHVzZWQgaW4gaGVyZQotICovCi1zdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjpqYXZhX3R5cGVfaW1wb3J0cygpIHsKLSAgcmV0dXJuCi0gICAgc3RyaW5nKCkgKwotICAgICJpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTtcbiIgKwotICAgICJpbXBvcnQgamF2YS51dGlsLlZlY3RvcjtcbiIgKwotICAgICJpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uO1xuXG4iOwotfQotCi0vKioKLSAqIFByaW50cyBzdGFuZGFyZCBqYXZhIGltcG9ydHMKLSAqCi0gKiBAcmV0dXJuIExpc3Qgb2YgaW1wb3J0cyBuZWNlc3NhcnkgZm9yIHRocmlmdAotICovCi1zdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjpqYXZhX3RocmlmdF9pbXBvcnRzKCkgewotICByZXR1cm4KLSAgICBzdHJpbmcoKSArCi0gICAgImltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC4qO1xuIiArCi0gICAgImltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuKjtcbiIgKwotICAgICJpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0Lio7XG4iICsKLSAgICAiaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLio7XG5cbiI7Ci19Ci0KLS8qKgotICogTm90aGluZyBpbiBKYXZhCi0gKi8KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7fQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIFRoaXMgaXMgbm90IGRvbmUgaW4gSmF2YSwgc2luY2UgaXQgZG9lcwotICogbm90IHN1cHBvcnQgYXJiaXRyYXJ5IG5hbWUgcmVwbGFjZW1lbnRzLCBhbmQgaXQnZCBiZSBhIHdhY2t5IHdhc3RlCi0gKiBvZiBvdmVyaGVhZCB0byBtYWtlIHdyYXBwZXIgY2xhc3Nlcy4KLSAqCi0gKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgotICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7Ci0gICh2b2lkKSB0dHlwZWRlZjsKLX0KLQotLyoqCi0gKiBFbnVtcyBhcmUgYSBjbGFzcyB3aXRoIGEgc2V0IG9mIHN0YXRpYyBjb25zdGFudHMuCi0gKgotICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgotICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGZpbGUKLSAgc3RyaW5nIGZfZW51bV9uYW1lID0gcGFja2FnZV9kaXJfKyIvIisodGVudW0tPmdldF9uYW1lKCkpKyIuamF2YSI7Ci0gIG9mc3RyZWFtIGZfZW51bTsKLSAgZl9lbnVtLm9wZW4oZl9lbnVtX25hbWUuY19zdHIoKSk7Ci0KLSAgLy8gQ29tbWVudCBhbmQgcGFja2FnZSBpdAotICBmX2VudW0gPDwKLSAgICBhdXRvZ2VuX2NvbW1lbnQoKSA8PAotICAgIGphdmFfcGFja2FnZSgpOwotCi0gIGdlbmVyYXRlX2phdmFfZG9jKGZfZW51bSwgdGVudW0pOwotICBpbmRlbnQoZl9lbnVtKSA8PAotICAgICJwdWJsaWMgY2xhc3MgIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiIGltcGxlbWVudHMgb3JnLmFwYWNoZS50aHJpZnQuVEVudW0gIjsKLSAgc2NvcGVfdXAoZl9lbnVtKTsKLSAgZl9lbnVtIDw8IGVuZGw7Ci0KLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7Ci0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOwotICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgewotICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0gICAgZ2VuZXJhdGVfamF2YV9kb2MoZl9lbnVtLCAqY19pdGVyKTsKLSAgICBpbmRlbnQoZl9lbnVtKSA8PCAicHVibGljIHN0YXRpYyBmaW5hbCAiIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8Ci0gICAgICAiICIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSBuZXcgIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PAotICAgICAgIigiIDw8IHZhbHVlIDw8ICIpOyIgPDwgZW5kbDsKLSAgfQotICBmX2VudW0gPDwgZW5kbDsKLQotICAvLyBGaWVsZCBmb3IgdGhyaWZ0Q29kZQotICBpbmRlbnQoZl9lbnVtKSA8PCAicHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50KGZfZW51bSkgPDwgInByaXZhdGUgIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiKGludCB2YWx1ZSkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KGZfZW51bSkgPDwgIiAgdGhpcy52YWx1ZSA9IHZhbHVlOyIgPDxlbmRsOwotICBpbmRlbnQoZl9lbnVtKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudChmX2VudW0pIDw8ICIvKioiIDw8IGVuZGw7Ci0gIGluZGVudChmX2VudW0pIDw8ICIgKiBHZXQgdGhlIGludGVnZXIgdmFsdWUgb2YgdGhpcyBlbnVtIHZhbHVlLCBhcyBkZWZpbmVkIGluIHRoZSBUaHJpZnQgSURMLiIgPDwgZW5kbDsKLSAgaW5kZW50KGZfZW51bSkgPDwgIiAqLyIgPDwgZW5kbDsKLSAgaW5kZW50KGZfZW51bSkgPDwgInB1YmxpYyBpbnQgZ2V0VmFsdWUoKSB7IiA8PCBlbmRsOwotICBpbmRlbnQoZl9lbnVtKSA8PCAiICByZXR1cm4gdmFsdWU7IiA8PGVuZGw7Ci0gIGluZGVudChmX2VudW0pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50KGZfZW51bSkgPDwgIi8qKiIgPDwgZW5kbDsKLSAgaW5kZW50KGZfZW51bSkgPDwgIiAqIEZpbmQgYSB0aGUgZW51bSB0eXBlIGJ5IGl0cyBpbnRlZ2VyIHZhbHVlLCBhcyBkZWZpbmVkIGluIHRoZSBUaHJpZnQgSURMLiIgPDwgZW5kbDsKLSAgaW5kZW50KGZfZW51bSkgPDwgIiAqIEByZXR1cm4gbnVsbCBpZiB0aGUgdmFsdWUgaXMgbm90IGZvdW5kLiIgPDwgZW5kbDsKLSAgaW5kZW50KGZfZW51bSkgPDwgIiAqLyIgPDwgZW5kbDsKLSAgaW5kZW50KGZfZW51bSkgPDwgInB1YmxpYyBzdGF0aWMgIisgdGVudW0tPmdldF9uYW1lKCkgKyAiIGZpbmRCeVZhbHVlKGludCB2YWx1ZSkgeyAiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KGZfZW51bSkgPDwgInN3aXRjaCAodmFsdWUpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgICBpbmRlbnQoZl9lbnVtKSA8PCAiY2FzZSAiIDw8IHZhbHVlIDw8ICI6IiA8PCBlbmRsOwotICAgIGluZGVudChmX2VudW0pIDw8ICIgIHJldHVybiAiIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKLSAgfQotICAKLSAgaW5kZW50KGZfZW51bSkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOwotICBpbmRlbnQoZl9lbnVtKSA8PCAiICByZXR1cm4gbnVsbDsiIDw8IGVuZGw7ICAKLQotICBpbmRlbnRfZG93bigpOwotCi0gIGluZGVudChmX2VudW0pIDw8ICJ9IiA8PCBlbmRsOwotICAKLSAgaW5kZW50X2Rvd24oKTsKLQotICBpbmRlbnQoZl9lbnVtKSA8PCAifSIgPDwgZW5kbDsKLQotICBzY29wZV9kb3duKGZfZW51bSk7Ci0KLSAgZl9lbnVtLmNsb3NlKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgY2xhc3MgdGhhdCBob2xkcyBhbGwgdGhlIGNvbnN0YW50cy4KLSAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0cyhzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKSB7Ci0gIGlmIChjb25zdHMuZW1wdHkoKSkgewotICAgIHJldHVybjsKLSAgfQotCi0gIHN0cmluZyBmX2NvbnN0c19uYW1lID0gcGFja2FnZV9kaXJfKyAiLyIgKyBwcm9ncmFtX25hbWVfICsgICJDb25zdGFudHMuamF2YSI7Ci0gIG9mc3RyZWFtIGZfY29uc3RzOwotICBmX2NvbnN0cy5vcGVuKGZfY29uc3RzX25hbWUuY19zdHIoKSk7Ci0KLSAgLy8gUHJpbnQgaGVhZGVyCi0gIGZfY29uc3RzIDw8Ci0gICAgYXV0b2dlbl9jb21tZW50KCkgPDwKLSAgICBqYXZhX3BhY2thZ2UoKSA8PAotICAgIGphdmFfdHlwZV9pbXBvcnRzKCk7Ci0KLSAgZl9jb25zdHMgPDwKLSAgICAicHVibGljIGNsYXNzICIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiQ29uc3RhbnRzIHsiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgdmVjdG9yPHRfY29uc3QqPjo6aXRlcmF0b3IgY19pdGVyOwotICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgewotICAgIHByaW50X2NvbnN0X3ZhbHVlKGZfY29uc3RzLAotICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+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+Z2V0X25hbWUoKSA8PCAiIGRlZXBDb3B5KCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIG5ldyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIih0aGlzKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfY2xlYXIob3V0LCB0c3RydWN0KTsKLQotICBnZW5lcmF0ZV9qYXZhX2JlYW5fYm9pbGVycGxhdGUob3V0LCB0c3RydWN0KTsKLSAgZ2VuZXJhdGVfZ2VuZXJpY19maWVsZF9nZXR0ZXJzX3NldHRlcnMob3V0LCB0c3RydWN0KTsKLQotICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9lcXVhbGl0eShvdXQsIHRzdHJ1Y3QpOwotICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9jb21wYXJlX3RvKG91dCwgdHN0cnVjdCk7Ci0KLSAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfcmVhZGVyKG91dCwgdHN0cnVjdCk7Ci0gIGlmIChpc19yZXN1bHQpIHsKLSAgICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9yZXN1bHRfd3JpdGVyKG91dCwgdHN0cnVjdCk7Ci0gIH0gZWxzZSB7Ci0gICAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCk7Ci0gIH0KLSAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfdG9zdHJpbmcob3V0LCB0c3RydWN0KTsKLSAgZ2VuZXJhdGVfamF2YV92YWxpZGF0b3Iob3V0LCB0c3RydWN0KTsKLSAgc2NvcGVfZG93bihvdXQpOwotICBvdXQgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgZXF1YWxzIG1ldGhvZHMgYW5kIGEgaGFzaENvZGUgbWV0aG9kIGZvciBhIHN0cnVjdHVyZS4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X2VxdWFsaXR5KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCB0aGF0KSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgImlmICh0aGF0ID09IG51bGwpIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGZhbHNlOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJpZiAodGhhdCBpbnN0YW5jZW9mICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIHJldHVybiB0aGlzLmVxdWFscygoIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIpdGhhdCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInJldHVybiBmYWxzZTsiIDw8IGVuZGw7Ci0gIHNjb3BlX2Rvd24ob3V0KTsKLSAgb3V0IDw8IGVuZGw7Ci0KLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgInB1YmxpYyBib29sZWFuIGVxdWFscygiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiB0aGF0KSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgImlmICh0aGF0ID09IG51bGwpIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGZhbHNlOyIgPDwgZW5kbDsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgb3V0IDw8IGVuZGw7Ci0KLSAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgLy8gTW9zdCBleGlzdGluZyBUaHJpZnQgY29kZSBkb2VzIG5vdCB1c2UgaXNzZXQgb3Igb3B0aW9uYWwvcmVxdWlyZWQsCi0gICAgLy8gc28gd2UgdHJlYXQgImRlZmF1bHQiIGZpZWxkcyBhcyByZXF1aXJlZC4KLSAgICBib29sIGlzX29wdGlvbmFsID0gKCptX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTDsKLSAgICBib29sIGNhbl9iZV9udWxsID0gdHlwZV9jYW5fYmVfbnVsbCh0KTsKLSAgICBzdHJpbmcgbmFtZSA9ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKLQotICAgIHN0cmluZyB0aGlzX3ByZXNlbnQgPSAidHJ1ZSI7Ci0gICAgc3RyaW5nIHRoYXRfcHJlc2VudCA9ICJ0cnVlIjsKLSAgICBzdHJpbmcgdW5lcXVhbDsKLQotICAgIGlmIChpc19vcHRpb25hbCB8fCBjYW5fYmVfbnVsbCkgewotICAgICAgdGhpc19wcmVzZW50ICs9ICIgJiYgdGhpcy4iICsgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKm1faXRlcik7Ci0gICAgICB0aGF0X3ByZXNlbnQgKz0gIiAmJiB0aGF0LiIgKyBnZW5lcmF0ZV9pc3NldF9jaGVjaygqbV9pdGVyKTsKLSAgICB9Ci0KLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJib29sZWFuIHRoaXNfcHJlc2VudF8iIDw8IG5hbWUgPDwgIiA9ICIKLSAgICAgICAgICAgICAgIDw8IHRoaXNfcHJlc2VudCA8PCAiOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImJvb2xlYW4gdGhhdF9wcmVzZW50XyIgPDwgbmFtZSA8PCAiID0gIgotICAgICAgICAgICAgICAgPDwgdGhhdF9wcmVzZW50IDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWYgKCIgPDwgInRoaXNfcHJlc2VudF8iIDw8IG5hbWUKLSAgICAgICAgICAgICAgIDw8ICIgfHwgdGhhdF9wcmVzZW50XyIgPDwgbmFtZSA8PCAiKSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgImlmICghKCIgPDwgInRoaXNfcHJlc2VudF8iIDw8IG5hbWUKLSAgICAgICAgICAgICAgIDw8ICIgJiYgdGhhdF9wcmVzZW50XyIgPDwgbmFtZSA8PCAiKSkiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiBmYWxzZTsiIDw8IGVuZGw7Ci0KLSAgICBpZiAodC0+aXNfYmFzZV90eXBlKCkgJiYgKCh0X2Jhc2VfdHlwZSopdCktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICB1bmVxdWFsID0gIlRCYXNlSGVscGVyLmNvbXBhcmVUbyh0aGlzLiIgKyBuYW1lICsgIiwgdGhhdC4iICsKLQluYW1lICsgIikgIT0gMCI7Ci0gICAgfSBlbHNlIGlmIChjYW5fYmVfbnVsbCkgewotICAgICAgdW5lcXVhbCA9ICIhdGhpcy4iICsgbmFtZSArICIuZXF1YWxzKHRoYXQuIiArIG5hbWUgKyAiKSI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHVuZXF1YWwgPSAidGhpcy4iICsgbmFtZSArICIgIT0gdGhhdC4iICsgbmFtZTsKLSAgICB9Ci0KLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJpZiAoIiA8PCB1bmVxdWFsIDw8ICIpIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gZmFsc2U7IiA8PCBlbmRsOwotCi0gICAgc2NvcGVfZG93bihvdXQpOwotICB9Ci0gIG91dCA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRydWU7IiA8PCBlbmRsOwotICBzY29wZV9kb3duKG91dCk7Ci0gIG91dCA8PCBlbmRsOwotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGludCBoYXNoQ29kZSgpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIDA7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfY29tcGFyZV90byhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBpbmRlbnQob3V0KSA8PCAicHVibGljIGludCBjb21wYXJlVG8oT2JqZWN0IG90aGVyT2JqZWN0KSB7IiA8PCBlbmRsOwotICAvLyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBpbnQgY29tcGFyZVRvKCIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIgb3RoZXIpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChvdXQpIDw8ICJpZiAoIWdldENsYXNzKCkuZXF1YWxzKG90aGVyT2JqZWN0LmdldENsYXNzKCkpKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gZ2V0Q2xhc3MoKS5nZXROYW1lKCkuY29tcGFyZVRvKG90aGVyT2JqZWN0LmdldENsYXNzKCkuZ2V0TmFtZSgpKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICBvdXQgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIgb3RoZXIgPSAoIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIilvdGhlck9iamVjdDsiOwotCi0gIGluZGVudChvdXQpIDw8ICJpbnQgbGFzdENvbXBhcmlzb24gPSAwOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGVuZGw7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIHRfZmllbGQqIGZpZWxkID0gKm1faXRlcjsKLSAgICBpbmRlbnQob3V0KSA8PCAibGFzdENvbXBhcmlzb24gPSBUQmFzZUhlbHBlci5jb21wYXJlVG8oIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjayhmaWVsZCkgPDwgIiwgb3RoZXIuIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjayhmaWVsZCkgPDwgIik7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gbGFzdENvbXBhcmlzb247IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotCi0gICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKGZpZWxkKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgIGlmIChmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfc3RydWN0KCkgfHwgZmllbGQtPmdldF90eXBlKCktPmlzX3hjZXB0aW9uKCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgIGxhc3RDb21wYXJpc29uID0gdGhpcy4iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIuY29tcGFyZVRvKG90aGVyLiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIik7IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICBsYXN0Q29tcGFyaXNvbiA9IFRCYXNlSGVscGVyLmNvbXBhcmVUbyh0aGlzLiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiwgb3RoZXIuIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgaW5kZW50KG91dCkgPDwgIiAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgICByZXR1cm4gbGFzdENvbXBhcmlzb247IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgIH0iIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIDA7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gcmVhZCBhbGwgdGhlIGZpZWxkcyBvZiB0aGUgc3RydWN0LgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfcmVhZGVyKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgewotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAicHVibGljIHZvaWQgcmVhZChUUHJvdG9jb2wgaXByb3QpIHRocm93cyBURXhjZXB0aW9uIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICAvLyBEZWNsYXJlIHN0YWNrIHRtcCB2YXJpYWJsZXMgYW5kIHJlYWQgc3RydWN0IGhlYWRlcgotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAiVEZpZWxkIGZpZWxkOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJpcHJvdC5yZWFkU3RydWN0QmVnaW4oKTsiIDw8IGVuZGw7Ci0KLSAgLy8gTG9vcCBvdmVyIHJlYWRpbmcgaW4gZmllbGRzCi0gIGluZGVudChvdXQpIDw8Ci0gICAgIndoaWxlICh0cnVlKSIgPDwgZW5kbDsKLSAgICBzY29wZV91cChvdXQpOwotCi0gICAgLy8gUmVhZCBiZWdpbm5pbmcgZmllbGQgbWFya2VyCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJmaWVsZCA9IGlwcm90LnJlYWRGaWVsZEJlZ2luKCk7IiA8PCBlbmRsOwotCi0gICAgLy8gQ2hlY2sgZm9yIGZpZWxkIFNUT1AgbWFya2VyIGFuZCBicmVhawotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuU1RPUCkgeyAiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJicmVhazsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIn0iIDw8IGVuZGw7Ci0KLSAgICAvLyBTd2l0Y2ggc3RhdGVtZW50IG9uIHRoZSBmaWVsZCB3ZSBhcmUgcmVhZGluZwotICAgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKGZpZWxkLmlkKSB7IiA8PCBlbmRsOwotCi0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICAvLyBHZW5lcmF0ZSBkZXNlcmlhbGl6YXRpb24gY29kZSBmb3Iga25vd24gY2FzZXMKLSAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgImNhc2UgIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOiAvLyAiIDw8IGNvbnN0YW50X25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAiaWYgKGZpZWxkLnR5cGUgPT0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0KLSAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMuIik7Ci0gICAgICBnZW5lcmF0ZV9pc3NldF9zZXQob3V0LCAqZl9pdGVyKTsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIn0gZWxzZSB7ICIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICB9Ci0KLSAgICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotCi0gICAgLy8gUmVhZCBmaWVsZCBlbmQgbWFya2VyCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJpcHJvdC5yZWFkRmllbGRFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotCi0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaXByb3QucmVhZFN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKLQotICAgIC8vIHBlcmZvcm1zIHZhcmlvdXMgY2hlY2tzIChlLmcuIGNoZWNrIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgc2V0KQotICAgIGluZGVudChvdXQpIDw8ICJ2YWxpZGF0ZSgpOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLS8vIGdlbmVyYXRlcyBqYXZhIG1ldGhvZCB0byBwZXJmb3JtIHZhcmlvdXMgY2hlY2tzCi0vLyAoZS5nLiBjaGVjayB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHNldCkKLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3ZhbGlkYXRvcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpewotICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZvaWQgdmFsaWRhdGUoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgb3V0IDw8IGluZGVudCgpIDw8ICIvLyBjaGVjayBmb3IgcmVxdWlyZWQgZmllbGRzIiA8PCBlbmRsOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlmICghIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygqZl9pdGVyKSA8PCAiKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oXCJSZXF1aXJlZCBmaWVsZCAnIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIicgaXMgdW5zZXQhIFN0cnVjdDpcIiArIHRvU3RyaW5nKCkpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gd3JpdGUgYWxsIHRoZSBmaWVsZHMgb2YgdGhlIHN0cnVjdAotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3Rfd3JpdGVyKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgewotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAicHVibGljIHZvaWQgd3JpdGUoVFByb3RvY29sIG9wcm90KSB0aHJvd3MgVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgLy8gcGVyZm9ybXMgdmFyaW91cyBjaGVja3MgKGUuZy4gY2hlY2sgdGhhdCBhbGwgcmVxdWlyZWQgZmllbGRzIGFyZSBzZXQpCi0gIGluZGVudChvdXQpIDw8ICJ2YWxpZGF0ZSgpOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZVN0cnVjdEJlZ2luKFNUUlVDVF9ERVNDKTsiIDw8IGVuZGw7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBib29sIG51bGxfYWxsb3dlZCA9IHR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICBpZiAobnVsbF9hbGxvd2VkKSB7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlmICh0aGlzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIT0gbnVsbCkgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgIH0KLSAgICBib29sIG9wdGlvbmFsID0gKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTDsKLSAgICBpZiAob3B0aW9uYWwpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygoKmZfaXRlcikpIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICB9Ci0KLSAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVGaWVsZEJlZ2luKCIgPDwgY29uc3RhbnRfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICJfRklFTERfREVTQyk7IiA8PCBlbmRsOwotCi0gICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAidGhpcy4iKTsKLQotICAgIC8vIFdyaXRlIGZpZWxkIGNsb3NlcgotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3Byb3Qud3JpdGVGaWVsZEVuZCgpOyIgPDwgZW5kbDsKLQotICAgIGlmIChvcHRpb25hbCkgewotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0KLSAgICBpZiAobnVsbF9hbGxvd2VkKSB7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0gIC8vIFdyaXRlIHRoZSBzdHJ1Y3QgbWFwCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdC53cml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdC53cml0ZVN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gd3JpdGUgYWxsIHRoZSBmaWVsZHMgb2YgdGhlIHN0cnVjdCwKLSAqIHdoaWNoIGlzIGEgZnVuY3Rpb24gcmVzdWx0LiBUaGVzZSBmaWVsZHMgYXJlIG9ubHkgd3JpdHRlbgotICogaWYgdGhleSBhcmUgc2V0IGluIHRoZSBJc3NldCBhcnJheSwgYW5kIG9ubHkgb25lIG9mIHRoZW0KLSAqIGNhbiBiZSBzZXQgYXQgYSB0aW1lLgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJwdWJsaWMgdm9pZCB3cml0ZShUUHJvdG9jb2wgb3Byb3QpIHRocm93cyBURXhjZXB0aW9uIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbihTVFJVQ1RfREVTQyk7IiA8PCBlbmRsOwotCi0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIG91dCA8PAotICAgICAgICBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiAiOwotICAgIH0gZWxzZSB7Ci0gICAgICBvdXQgPDwgIiBlbHNlIGlmICI7Ci0gICAgfQotCi0gICAgb3V0IDw8ICIodGhpcy4iIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKCpmX2l0ZXIpIDw8ICIpIHsiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfdXAoKTsKLSAgICAKLSAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVGaWVsZEJlZ2luKCIgPDwgY29uc3RhbnRfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICJfRklFTERfREVTQyk7IiA8PCBlbmRsOwotCi0gICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAidGhpcy4iKTsKLQotICAgIC8vIFdyaXRlIGZpZWxkIGNsb3NlcgotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3Byb3Qud3JpdGVGaWVsZEVuZCgpOyIgPDwgZW5kbDsKLQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iOwotICB9Ci0gIC8vIFdyaXRlIHRoZSBzdHJ1Y3QgbWFwCi0gIG91dCA8PAotICAgIGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVGaWVsZFN0b3AoKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotfQotCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcmVmbGVjdGlvbl9nZXR0ZXJzKG9zdHJpbmdzdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlLCBzdHJpbmcgZmllbGRfbmFtZSwgc3RyaW5nIGNhcF9uYW1lKSB7Ci0gIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgY29uc3RhbnRfbmFtZShmaWVsZF9uYW1lKSA8PCAiOiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmICF0eXBlLT5pc19zdHJpbmcoKSkgewotICAgIHRfYmFzZV90eXBlKiBiYXNlX3R5cGUgPSAodF9iYXNlX3R5cGUqKXR5cGU7Ci0KLSAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCB0cnVlLCBmYWxzZSkgPDwgIigiIDw8IChiYXNlX3R5cGUtPmlzX2Jvb2woKSA/ICJpcyIgOiAiZ2V0IikgPDwgY2FwX25hbWUgPDwgIigpKTsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIGdldCIgPDwgY2FwX25hbWUgPDwgIigpOyIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLX0KLQotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3JlZmxlY3Rpb25fc2V0dGVycyhvc3RyaW5nc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSwgc3RyaW5nIGZpZWxkX25hbWUsIHN0cmluZyBjYXBfbmFtZSkgewotICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IGNvbnN0YW50X25hbWUoZmllbGRfbmFtZSkgPDwgIjoiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAiaWYgKHZhbHVlID09IG51bGwpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHVuc2V0IiA8PCBnZXRfY2FwX25hbWUoZmllbGRfbmFtZSkgPDwgIigpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICBzZXQiIDw8IGNhcF9uYW1lIDw8ICIoKCIgPDwgdHlwZV9uYW1lKHR5cGUsIHRydWUsIGZhbHNlKSA8PCAiKXZhbHVlKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiYnJlYWs7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLX0KLQotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2dlbmVyaWNfZmllbGRfZ2V0dGVyc19zZXR0ZXJzKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgKHZvaWQpIG91dDsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIGdldHRlcl9zdHJlYW07Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBzZXR0ZXJfc3RyZWFtOwotCi0gIC8vIGJ1aWxkIHVwIHRoZSBib2RpZXMgb2YgYm90aCB0aGUgZ2V0dGVyIGFuZCBzZXR0ZXIgYXQgb25jZQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9maWVsZCogZmllbGQgPSAqZl9pdGVyOwotICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUoZmllbGQtPmdldF90eXBlKCkpOwotICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSBmaWVsZC0+Z2V0X25hbWUoKTsKLSAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSA9IGdldF9jYXBfbmFtZShmaWVsZF9uYW1lKTsKLQotICAgIGluZGVudF91cCgpOwotICAgIGdlbmVyYXRlX3JlZmxlY3Rpb25fc2V0dGVycyhzZXR0ZXJfc3RyZWFtLCB0eXBlLCBmaWVsZF9uYW1lLCBjYXBfbmFtZSk7Ci0gICAgZ2VuZXJhdGVfcmVmbGVjdGlvbl9nZXR0ZXJzKGdldHRlcl9zdHJlYW0sIHR5cGUsIGZpZWxkX25hbWUsIGNhcF9uYW1lKTsKLSAgICBpbmRlbnRfZG93bigpOwotICB9Ci0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXQgb2YgSmF2YSBCZWFuIGJvaWxlcnBsYXRlIGZ1bmN0aW9ucyAoc2V0dGVycywgZ2V0dGVycywgZXRjLikKLSAqIGZvciB0aGUgZ2l2ZW4gc3RydWN0LgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9iZWFuX2JvaWxlcnBsYXRlKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9maWVsZCogZmllbGQgPSAqZl9pdGVyOwotICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUoZmllbGQtPmdldF90eXBlKCkpOwotICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSBmaWVsZC0+Z2V0X25hbWUoKTsKLSAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSA9IGdldF9jYXBfbmFtZShmaWVsZF9uYW1lKTsKLQotICAgIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgICAgLy8gTWV0aG9kIHRvIHJldHVybiB0aGUgc2l6ZSBvZiB0aGUgY29sbGVjdGlvbgotICAgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBpbnQgZ2V0IiA8PCBjYXBfbmFtZTsKLSAgICAgIG91dCA8PCBnZXRfY2FwX25hbWUoInNpemUoKSB7IikgPDwgZW5kbDsKLQotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuICh0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID09IG51bGwpID8gMCA6ICIgPDwKLSAgICAgICAgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIuc2l6ZSgpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICAgIH0KLQotICAgIGlmICh0eXBlLT5pc19zZXQoKSB8fCB0eXBlLT5pc19saXN0KCkpIHsKLQotICAgICAgdF90eXBlKiBlbGVtZW50X3R5cGU7Ci0gICAgICBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgICAgZWxlbWVudF90eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGVsZW1lbnRfdHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgICAgfQotCi0gICAgICAvLyBJdGVyYXRvciBnZXR0ZXIgZm9yIHNldHMgYW5kIGxpc3RzCi0gICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIEVudW1lcmF0aW9uIGdldCIgPDwgY2FwX25hbWU7Ci0gICAgICBvdXQgPDwgZ2V0X2NhcF9uYW1lKCJFbnVtZXJhdGlvbigpIHsiKSA8PCBlbmRsOwotCi0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gKHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPT0gbnVsbCkgPyBudWxsIDogIiA8PAotICAgICAgICAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIi5lbGVtZW50cygpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gICAgICAvLyBBZGQgdG8gc2V0IG9yIGxpc3QsIGNyZWF0ZSBpZiB0aGUgc2V0L2xpc3QgaXMgbnVsbAotICAgICAgaW5kZW50KG91dCk7Ci0gICAgICBvdXQgPDwgInB1YmxpYyB2b2lkIGFkZCIgPDwgZ2V0X2NhcF9uYW1lKCJ0byIpOwotICAgICAgb3V0IDw8IGNhcF9uYW1lIDw8ICIoIiA8PCB0eXBlX25hbWUoZWxlbWVudF90eXBlKSA8PCAiIGVsZW0pIHsiIDw8IGVuZGw7Ci0KLSAgICAgIGluZGVudF91cCgpOwotICAgICAgaW5kZW50KG91dCkgPDwgImlmICh0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID09IG51bGwpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlKSA8PAotICAgICAgICAiKCk7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0JaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIucHV0KCIgPDwKLQkgIGJveF90eXBlKGVsZW1lbnRfdHlwZSwgImVsZW0iKSA8PCAiLCAiIDw8Ci0JICBib3hfdHlwZShlbGVtZW50X3R5cGUsICJlbGVtIikgPDwgIik7IiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLQlpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIi5hZGRFbGVtZW50KCIgPDwKLQkgIGJveF90eXBlKGVsZW1lbnRfdHlwZSwgImVsZW0iKSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICAgIC8vIFB1dCB0byBtYXAKLSAgICAgIHRfdHlwZSoga2V5X3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgICB0X3R5cGUqIHZhbF90eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOwotCi0gICAgICBpbmRlbnQob3V0KTsKLSAgICAgIG91dCA8PCAicHVibGljIHZvaWQgcHV0VG8iCi0JICA8PCBjYXBfbmFtZSA8PCAiKCIgPDwgdHlwZV9uYW1lKGtleV90eXBlLCB0cnVlKSA8PCAiIGtleSwgIgotCSAgPDwgdHlwZV9uYW1lKHZhbF90eXBlLCB0cnVlKSA8PCAiIHZhbCkgeyIgPDwgZW5kbDsKLQotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPT0gbnVsbCkgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSBuZXcgIiA8PAotICAgICAgICB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8ICIoKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIi5wdXQoa2V5LCB2YWwpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICAgIH0KLQotICAgIC8vIFNpbXBsZSBnZXR0ZXIKLSAgICBnZW5lcmF0ZV9qYXZhX2RvYyhvdXQsIGZpZWxkKTsKLSAgICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHlwZV9uYW1lKHR5cGUpOwotICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSAmJgotICAgICAgICAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MKSB7Ci0gICAgICBvdXQgPDwgIiBpcyI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dCA8PCAiIGdldCI7Ci0gICAgfQotICAgIG91dCA8PCBjYXBfbmFtZSA8PCAiKCkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIC8vIFNpbXBsZSBzZXR0ZXIKLSAgICBnZW5lcmF0ZV9qYXZhX2RvYyhvdXQsIGZpZWxkKTsKLSAgICBpbmRlbnQob3V0KSA8PCAicHVibGljICI7Ci0gICAgb3V0IDw8ICJ2b2lkIjsKLSAgICBvdXQgPDwgIiBzZXQiIDw8IGNhcF9uYW1lIDw8ICIoIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiAiIDw8IGZpZWxkX25hbWUgPDwgIikgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9ICIgPDwgZmllbGRfbmFtZSA8PCAiOyIgPDwKLSAgICAgIGVuZGw7Ci0gICAgZ2VuZXJhdGVfaXNzZXRfc2V0KG91dCwgZmllbGQpOwotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gICAgLy8gVW5zZXR0ZXIKLSAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZvaWQgdW5zZXQiIDw8IGNhcF9uYW1lIDw8ICIoKSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKHR5cGUpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9IG51bGw7IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiX19pc3NldF92ZWN0b3JbIiA8PCBpc3NldF9maWVsZF9pZChmaWVsZCkgPDwgIl0gPSBmYWxzZTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIC8vIGlzU2V0IG1ldGhvZAotICAgIGluZGVudChvdXQpIDw8ICIvKiogUmV0dXJucyB0cnVlIGlmIGZpZWxkICIgPDwgZmllbGRfbmFtZSA8PCAiIGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSB2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZSAqLyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGJvb2xlYW4gaXMiIDw8IGdldF9jYXBfbmFtZSgic2V0IikgPDwgY2FwX25hbWUgPDwgIigpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaWYgKHR5cGVfY2FuX2JlX251bGwodHlwZSkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiAhPSBudWxsOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiBfX2lzc2V0X3ZlY3RvclsiIDw8IGlzc2V0X2ZpZWxkX2lkKGZpZWxkKSA8PCAiXTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCBzZXQiIDw8IGNhcF9uYW1lIDw8IGdldF9jYXBfbmFtZSgiaXNTZXQiKSA8PCAiKGJvb2xlYW4gdmFsdWUpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaWYgKHR5cGVfY2FuX2JlX251bGwodHlwZSkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIXZhbHVlKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIiAgdGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9IG51bGw7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJfX2lzc2V0X3ZlY3RvclsiIDw8IGlzc2V0X2ZpZWxkX2lkKGZpZWxkKSA8PCAiXSA9IHZhbHVlOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOyAKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHRvU3RyaW5nKCkgbWV0aG9kIGZvciB0aGUgZ2l2ZW4gc3RydWN0Ci0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF90b3N0cmluZyhvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgewotICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAiU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcihcIiIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKFwiKTsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiYm9vbGVhbiBmaXJzdCA9IHRydWU7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBib29sIGNvdWxkX2JlX3Vuc2V0ID0gKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTDsKLSAgICBpZihjb3VsZF9iZV91bnNldCkgewotICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKCpmX2l0ZXIpIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICB9Ci0KLSAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqZl9pdGVyKTsKLQotICAgIGlmICghZmlyc3QpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIWZpcnN0KSBzYi5hcHBlbmQoXCIsIFwiKTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudChvdXQpIDw8ICJzYi5hcHBlbmQoXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOlwiKTsiIDw8IGVuZGw7Ci0gICAgYm9vbCBjYW5fYmVfbnVsbCA9IHR5cGVfY2FuX2JlX251bGwoZmllbGQtPmdldF90eXBlKCkpOwotICAgIGlmIChjYW5fYmVfbnVsbCkgewotICAgICAgaW5kZW50KG91dCkgPDwgImlmICh0aGlzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPT0gbnVsbCkgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgIHNiLmFwcGVuZChcIm51bGxcIik7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgfQotICAgIAotICAgIGlmIChmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfYmFzZV90eXBlKCkgJiYgKCh0X2Jhc2VfdHlwZSopKGZpZWxkLT5nZXRfdHlwZSgpKSktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiVEJhc2VIZWxwZXIudG9TdHJpbmcodGhpcy4iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIsIHNiKTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJzYi5hcHBlbmQodGhpcy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIAotICAgIGlmIChjYW5fYmVfbnVsbCkgewotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnQob3V0KSA8PCAiZmlyc3QgPSBmYWxzZTsiIDw8IGVuZGw7Ci0KLSAgICBpZihjb3VsZF9iZV91bnNldCkgewotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0KLSAgICBmaXJzdCA9IGZhbHNlOwotICB9Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJzYi5hcHBlbmQoXCIpXCIpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJyZXR1cm4gc2IudG9TdHJpbmcoKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotfQotCi0vKiogCi0gKiBSZXR1cm5zIGEgc3RyaW5nIHdpdGggdGhlIGphdmEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIHRocmlmdCB0eXBlCi0gKiAoZS5nLiBmb3IgdGhlIHR5cGUgc3RydWN0IGl0IHJldHVybnMgIlRUeXBlLlNUUlVDVCIpCi0gKi8KLXN0ZDo6c3RyaW5nIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2V0X2phdmFfdHlwZV9zdHJpbmcodF90eXBlKiB0eXBlKSB7Ci0gIGlmICh0eXBlLT5pc19saXN0KCkpewotICAgIHJldHVybiAiVFR5cGUuTElTVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLk1BUCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLlNFVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiAiVFR5cGUuU1RSVUNUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLkVOVU0iOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3R5cGVkZWYoKSkgewotICAgIHJldHVybiBnZXRfamF2YV90eXBlX3N0cmluZygoKHRfdHlwZWRlZiopdHlwZSktPmdldF90eXBlKCkpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgc3dpdGNoICgoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEICAgOiByZXR1cm4gICAgICAiVFR5cGUuVk9JRCI7IGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkcgOiByZXR1cm4gICAgIlRUeXBlLlNUUklORyI7IGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MICAgOiByZXR1cm4gICAgICAiVFR5cGUuQk9PTCI7IGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFICAgOiByZXR1cm4gICAgICAiVFR5cGUuQllURSI7IGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTYgICAgOiByZXR1cm4gICAgICAgIlRUeXBlLkkxNiI7IGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzIgICAgOiByZXR1cm4gICAgICAgIlRUeXBlLkkzMiI7IGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQgICAgOiByZXR1cm4gICAgICAgIlRUeXBlLkk2NCI7IGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEUgOiByZXR1cm4gICAgIlRUeXBlLkRPVUJMRSI7IGJyZWFrOwotICAgICAgZGVmYXVsdCA6IHRocm93IHN0ZDo6cnVudGltZV9lcnJvcigiVW5rbm93biB0aHJpZnQgdHlwZSBcIiIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIlwiIHBhc3NlZCB0byB0X2phdmFtZV9nZW5lcmF0b3I6OmdldF9qYXZhX3R5cGVfc3RyaW5nISIpOyBicmVhazsgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIQotICAgIH0KLSAgfSBlbHNlIHsKLSAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoIlVua25vd24gdGhyaWZ0IHR5cGUgXCIiICsgdHlwZS0+Z2V0X25hbWUoKSArICJcIiBwYXNzZWQgdG8gdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZXRfamF2YV90eXBlX3N0cmluZyEiKTsgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIQotICB9Ci19Ci0KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUpewotICBvdXQgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudF91cCgpOwotICBpZiAodHlwZS0+aXNfc3RydWN0KCkpewotICAgIGluZGVudChvdXQpIDw8ICJuZXcgU3RydWN0TWV0YURhdGEoVFR5cGUuU1RSVUNULCAiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiLmNsYXNzIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSl7Ci0gICAgaWYgKHR5cGUtPmlzX2xpc3QoKSl7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAibmV3IExpc3RNZXRhRGF0YShUVHlwZS5MSVNULCAiOwotICAgICAgdF90eXBlKiBlbGVtX3R5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsgICAgCi0gICAgICBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEob3V0LCBlbGVtX3R5cGUpOyAgIAotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpewotICAgICAgaW5kZW50KG91dCkgPDwgIm5ldyBTZXRNZXRhRGF0YShUVHlwZS5TRVQsICI7Ci0gICAgICB0X3R5cGUqIGVsZW1fdHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOyAgICAKLSAgICAgIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShvdXQsIGVsZW1fdHlwZSk7IAotICAgIH0gZWxzZXsgLy8gbWFwCi0gICAgICBpbmRlbnQob3V0KSA8PCAibmV3IE1hcE1ldGFEYXRhKFRUeXBlLk1BUCwgIjsKLSAgICAgIHRfdHlwZSoga2V5X3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgICB0X3R5cGUqIHZhbF90eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOwotICAgICAgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKG91dCwga2V5X3R5cGUpOwotICAgICAgb3V0IDw8ICIsICI7Ci0gICAgICBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEob3V0LCB2YWxfdHlwZSk7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIGluZGVudChvdXQpIDw8ICJuZXcgRW51bU1ldGFEYXRhKFRUeXBlLkVOVU0sICIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIuY2xhc3MiOwotICB9IGVsc2UgewotICAgIGluZGVudChvdXQpIDw8ICJuZXcgRmllbGRWYWx1ZU1ldGFEYXRhKCIgPDwgZ2V0X2phdmFfdHlwZV9zdHJpbmcodHlwZSk7Ci0gICAgaWYgKHR5cGUtPmlzX3R5cGVkZWYoKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIiwgXCIiIDw8ICgodF90eXBlZGVmKil0eXBlKS0+Z2V0X3N5bWJvbGljKCkgPDwgIlwiIjsKLSAgICB9Ci0gIH0KLSAgb3V0IDw8ICIpIjsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50X2Rvd24oKTsKLX0KLQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHRocmlmdCBzZXJ2aWNlLiBJbiBDKyssIHRoaXMgY29tcHJpc2VzIGFuIGVudGlyZWx5IHNlcGFyYXRlCi0gKiBoZWFkZXIgYW5kIHNvdXJjZSBmaWxlLiBUaGUgaGVhZGVyIGZpbGUgZGVmaW5lcyB0aGUgbWV0aG9kcyBhbmQgaW5jbHVkZXMKLSAqIHRoZSBkYXRhIHR5cGVzIGRlZmluZWQgaW4gdGhlIG1haW4gaGVhZGVyIGZpbGUsIGFuZCB0aGUgaW1wbGVtZW50YXRpb24KLSAqIGZpbGUgY29udGFpbnMgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBiYXNpYyBwcmludGVyIGFuZCBkZWZhdWx0IGludGVyZmFjZXMuCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICAvLyBNYWtlIG91dHB1dCBmaWxlCi0gIHN0cmluZyBmX3NlcnZpY2VfbmFtZSA9IHBhY2thZ2VfZGlyXysiLyIrc2VydmljZV9uYW1lXysiLmphdmEiOwotICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGF1dG9nZW5fY29tbWVudCgpIDw8Ci0gICAgamF2YV9wYWNrYWdlKCkgPDwKLSAgICBqYXZhX3R5cGVfaW1wb3J0cygpIDw8Ci0gICAgamF2YV90aHJpZnRfaW1wb3J0cygpOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICAicHVibGljIGNsYXNzICIgPDwgc2VydmljZV9uYW1lXyA8PCAiIHsiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICAvLyBHZW5lcmF0ZSB0aGUgdGhyZWUgbWFpbiBwYXJ0cyBvZiB0aGUgc2VydmljZQotICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwKLSAgICAifSIgPDwgZW5kbDsKLSAgZl9zZXJ2aWNlXy5jbG9zZSgpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgaW50ZXJmYWNlIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCi0gKi8KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcmltaXRpdmVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgaW50ZXJmYWNlIElmYWNlIGV4dGVuZHMgIiA8PAotICAgIHNlcnZpY2VfbmFtZV8gPDwgIklmYWNlIHsgfSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIHN0cmluZyBmX2ludGVyZmFjZV9uYW1lID0gcGFja2FnZV9kaXJfICsgIi8iICsgc2VydmljZV9uYW1lXyArICJJZmFjZS5qYXZhIjsKLSAgc3RkOjpvZnN0cmVhbSBmX2lmYWNlOwotICBmX2lmYWNlLm9wZW4oZl9pbnRlcmZhY2VfbmFtZS5jX3N0cigpKTsKLQotICBzdHJpbmcgZXh0ZW5kc19pZmFjZSA9ICIiOwotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGV4dGVuZHNfaWZhY2UgPSAiIGV4dGVuZHMgIiArIHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSkgKyAiSWZhY2UiOwotICB9Ci0gIAotICBmX2lmYWNlIDw8Ci0gICAgYXV0b2dlbl9jb21tZW50KCkgPDwKLSAgICBqYXZhX3BhY2thZ2UoKSA8PAotICAgIGphdmFfdHlwZV9pbXBvcnRzKCkgPDwKLSAgICBqYXZhX3RocmlmdF9pbXBvcnRzKCk7Ci0gIGdlbmVyYXRlX2phdmFfZG9jKGZfaWZhY2UsIHRzZXJ2aWNlKTsKLSAgZl9pZmFjZSA8PAotICAgICJwdWJsaWMgaW50ZXJmYWNlICIgPDwgc2VydmljZV9uYW1lXyA8PCAiSWZhY2UiIDw8IGV4dGVuZHNfaWZhY2UgPDwgIiB7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGdlbmVyYXRlX2phdmFfZG9jKGZfaWZhY2UsICpmX2l0ZXIpOwotICAgIGZfaWZhY2UgPDwgIiAgcHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLSAgZl9pZmFjZSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgaW50ZXJmYWNlIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCi0gKi8KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIHN0cmluZyBleHRlbmRzX2lmYWNlID0gIiI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7Ci0gICAgZXh0ZW5kc19pZmFjZSA9ICIgZXh0ZW5kcyAiICsgZXh0ZW5kcyArICIuSWZhY2UiOwotICB9Ci0KLSAgZ2VuZXJhdGVfamF2YV9kb2MoZl9zZXJ2aWNlXywgdHNlcnZpY2UpOwotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgaW50ZXJmYWNlIElmYWNlIiA8PCBleHRlbmRzX2lmYWNlIDw8Ci0gICAgIiB7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9qYXZhX2RvYyhmX3NlcnZpY2VfLCAqZl9pdGVyKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgc3RydWN0cyBmb3IgYWxsIHRoZSBzZXJ2aWNlIGFyZ3MgYW5kIHJldHVybiB0eXBlcwotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZQotICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9zdHJ1Y3QqIHRzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotICAgIGdlbmVyYXRlX2phdmFfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgdHMsIGZhbHNlLCB0cnVlKTsKLSAgICBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKCpmX2l0ZXIpOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgotICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19jbGllbnQgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBleHRlbmRzX2NsaWVudCA9ICIgZXh0ZW5kcyAiICsgZXh0ZW5kcyArICIuQ2xpZW50IjsKLSAgfQotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJwdWJsaWMgc3RhdGljIGNsYXNzIENsaWVudCIgPDwgZXh0ZW5kc19jbGllbnQgPDwgIiBpbXBsZW1lbnRzIFRTZXJ2aWNlQ2xpZW50LCBJZmFjZSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAicHVibGljIENsaWVudChUUHJvdG9jb2wgcHJvdCkiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAidGhpcyhwcm90LCBwcm90KTsiIDw8IGVuZGw7Ci0gIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAicHVibGljIENsaWVudChUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCkiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgImlwcm90XyA9IGlwcm90OyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIm9wcm90XyA9IG9wcm90OyIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAic3VwZXIoaXByb3QsIG9wcm90KTsiIDw8IGVuZGw7Ci0gIH0KLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicHJvdGVjdGVkIFRQcm90b2NvbCBpcHJvdF87IiAgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgInByb3RlY3RlZCBUUHJvdG9jb2wgb3Byb3RfOyIgIDw8IGVuZGwgPDwKLSAgICAgIGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgaW50IHNlcWlkXzsiIDw8IGVuZGwgPDwKLSAgICAgIGVuZGw7Ci0KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICJwdWJsaWMgVFByb3RvY29sIGdldElucHV0UHJvdG9jb2woKSIgPDwgZW5kbDsKLSAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICJyZXR1cm4gdGhpcy5pcHJvdF87IiA8PCBlbmRsOwotICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAicHVibGljIFRQcm90b2NvbCBnZXRPdXRwdXRQcm90b2NvbCgpIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgInJldHVybiB0aGlzLm9wcm90XzsiIDw8IGVuZGw7Ci0gICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgfQotCi0gIC8vIEdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotCi0gICAgLy8gT3BlbiBmdW5jdGlvbgotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCBlbmRsOwotICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgInNlbmRfIiA8PCBmdW5uYW1lIDw8ICIoIjsKLQotICAgIC8vIEdldCB0aGUgc3RydWN0IG9mIGZ1bmN0aW9uIGNhbGwgcGFyYW1zCi0gICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0KLSAgICAvLyBEZWNsYXJlIHRoZSBmdW5jdGlvbiBhcmd1bWVudHMKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOwotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKLSAgICAgIH0KLSAgICAgIGZfc2VydmljZV8gPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgfQotICAgIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOwotCi0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOwotICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBmX3NlcnZpY2VfIDw8ICJyZXR1cm4gIjsKLSAgICAgIH0KLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgInJlY3ZfIiA8PCBmdW5uYW1lIDw8ICIoKTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gICAgdF9mdW5jdGlvbiBzZW5kX2Z1bmN0aW9uKGdfdHlwZV92b2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInNlbmRfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKSk7Ci0KLSAgICBzdHJpbmcgYXJnc25hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX2FyZ3MiOwotCi0gICAgLy8gT3BlbiBmdW5jdGlvbgotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmc2VuZF9mdW5jdGlvbikgPDwgZW5kbDsKLSAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKLQotICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVxdWVzdAotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJvcHJvdF8ud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKFwiIiA8PCBmdW5uYW1lIDw8ICJcIiwgIiA8PAotICAgICAgKCgqZl9pdGVyKS0+aXNfb25ld2F5KCkgPyAiVE1lc3NhZ2VUeXBlLk9ORVdBWSIgOiAiVE1lc3NhZ2VUeXBlLkNBTEwiKSA8PAotICAgICAgIiwgKytzZXFpZF8pKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8IGFyZ3NuYW1lIDw8ICIgYXJncyA9IG5ldyAiIDw8IGFyZ3NuYW1lIDw8ICIoKTsiIDw8IGVuZGw7Ci0KLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiYXJncy5zZXQiIDw8IGdldF9jYXBfbmFtZSgoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIigiIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiYXJncy53cml0ZShvcHJvdF8pOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIm9wcm90Xy53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJvcHJvdF8uZ2V0VHJhbnNwb3J0KCkuZmx1c2goKTsiIDw8IGVuZGw7Ci0KLSAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgc3RyaW5nIHJlc3VsdG5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7Ci0KLSAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7Ci0gICAgICB0X2Z1bmN0aW9uIHJlY3ZfZnVuY3Rpb24oKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygicmVjdl8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbm9hcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpKTsKLSAgICAgIC8vIE9wZW4gZnVuY3Rpb24KLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgICAicHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZyZWN2X2Z1bmN0aW9uKSA8PCBlbmRsOwotICAgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0KLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIlRNZXNzYWdlIG1zZyA9IGlwcm90Xy5yZWFkTWVzc2FnZUJlZ2luKCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiAobXNnLnR5cGUgPT0gVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTikgeyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBUQXBwbGljYXRpb25FeGNlcHRpb24geCA9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5yZWFkKGlwcm90Xyk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIGlwcm90Xy5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICB0aHJvdyB4OyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKG1zZy5zZXFpZCAhPSBzZXFpZF8pIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgdGhyb3cgbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uQkFEX1NFUVVFTkNFX0lELCBcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZmFpbGVkOiBvdXQgb2Ygc2VxdWVuY2UgcmVzcG9uc2VcIik7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8IHJlc3VsdG5hbWUgPDwgIiByZXN1bHQgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIoKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInJlc3VsdC5yZWFkKGlwcm90Xyk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpcHJvdF8ucmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgICAgIC8vIENhcmVmdWwsIG9ubHkgcmV0dXJuIF9yZXN1bHQgaWYgbm90IGEgdm9pZCBmdW5jdGlvbgotICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImlmIChyZXN1bHQuIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygic3VjY2VzcyIpIDw8ICIpIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gcmVzdWx0LnN1Y2Nlc3M7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOwotICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLSAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKHJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9IG51bGwpIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICB0aHJvdyByZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgLy8gSWYgeW91IGdldCBoZXJlIGl0J3MgYW4gZXhjZXB0aW9uLCB1bmxlc3MgYSB2b2lkIGZ1bmN0aW9uCi0gICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAgICAgInJldHVybjsiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgInRocm93IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLk1JU1NJTkdfUkVTVUxULCBcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZmFpbGVkOiB1bmtub3duIHJlc3VsdFwiKTsiIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIC8vIENsb3NlIGZ1bmN0aW9uCi0gICAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICAgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJ9IiA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2Ugc2VydmVyIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KLSAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgLy8gR2VuZXJhdGUgdGhlIGRpc3BhdGNoIG1ldGhvZHMKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0KLSAgLy8gRXh0ZW5kcyBzdHVmZgotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19wcm9jZXNzb3IgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBleHRlbmRzX3Byb2Nlc3NvciA9ICIgZXh0ZW5kcyAiICsgZXh0ZW5kcyArICIuUHJvY2Vzc29yIjsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIHRoZSBoZWFkZXIgcG9ydGlvbgotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAicHVibGljIHN0YXRpYyBjbGFzcyBQcm9jZXNzb3IiIDw8IGV4dGVuZHNfcHJvY2Vzc29yIDw8ICIgaW1wbGVtZW50cyBUUHJvY2Vzc29yIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJwdWJsaWMgUHJvY2Vzc29yKElmYWNlIGlmYWNlKSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gIGlmICghZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInN1cGVyKGlmYWNlKTsiIDw8IGVuZGw7Ci0gIH0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJpZmFjZV8gPSBpZmFjZTsiIDw8IGVuZGw7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicHJvY2Vzc01hcF8ucHV0KFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiLCBuZXcgIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIigpKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgc3RhdGljIGludGVyZmFjZSBQcm9jZXNzRnVuY3Rpb24geyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgcHVibGljIHZvaWQgcHJvY2VzcyhpbnQgc2VxaWQsIFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KSB0aHJvd3MgVEV4Y2VwdGlvbjsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJwcml2YXRlIElmYWNlIGlmYWNlXzsiIDw8IGVuZGw7Ci0KLSAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgZmluYWwgSGFzaHRhYmxlIHByb2Nlc3NNYXBfID0gbmV3IEhhc2h0YWJsZSgpOyIgPDwgZW5kbDsKLSAgfQotCi0gIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgc2VydmVyIGltcGxlbWVudGF0aW9uCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJwdWJsaWMgYm9vbGVhbiBwcm9jZXNzKFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KSB0aHJvd3MgVEV4Y2VwdGlvbiIgPDwgZW5kbDsKLSAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJUTWVzc2FnZSBtc2cgPSBpcHJvdC5yZWFkTWVzc2FnZUJlZ2luKCk7IiA8PCBlbmRsOwotCi0gIC8vIFRPRE8obWNzbGVlKTogdmFsaWRhdGUgbWVzc2FnZSwgd2FzIHRoZSBzZXFpZCBldGMuIGxlZ2l0PwotCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAiUHJvY2Vzc0Z1bmN0aW9uIGZuID0gKFByb2Nlc3NGdW5jdGlvbilwcm9jZXNzTWFwXy5nZXQobXNnLm5hbWUpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJpZiAoZm4gPT0gbnVsbCkgeyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIFRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgVFR5cGUuU1RSVUNUKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBpcHJvdC5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB4ID0gbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uVU5LTk9XTl9NRVRIT0QsIFwiSW52YWxpZCBtZXRob2QgbmFtZTogJ1wiK21zZy5uYW1lK1wiJ1wiKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UobXNnLm5hbWUsIFRNZXNzYWdlVHlwZS5FWENFUFRJT04sIG1zZy5zZXFpZCkpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIHgud3JpdGUob3Byb3QpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIG9wcm90LndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIG9wcm90LmdldFRyYW5zcG9ydCgpLmZsdXNoKCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRydWU7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiZm4ucHJvY2Vzcyhtc2cuc2VxaWQsIGlwcm90LCBvcHJvdCk7IiA8PCBlbmRsOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAicmV0dXJuIHRydWU7IiA8PCBlbmRsOwotCi0gIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2VzcyBzdWJmdW5jdGlvbnMKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRzZXJ2aWNlLCAqZl9pdGVyKTsKLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgYW5kIGhlbHBlcnMgZm9yIGEgZnVuY3Rpb24uCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24KLSAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOwotICB0X2ZpZWxkIHN1Y2Nlc3ModGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOwotICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7Ci0gIH0KLQotICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICByZXN1bHQuYXBwZW5kKCpmX2l0ZXIpOwotICB9Ci0KLSAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCAmcmVzdWx0LCBmYWxzZSwgdHJ1ZSwgdHJ1ZSk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgcHJvY2VzcyBmdW5jdGlvbiBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHdyaXRlIGEgZGlzcGF0Y2hlciBmb3IKLSAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgKHZvaWQpIHRzZXJ2aWNlOwotICAvLyBPcGVuIGNsYXNzCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJwcml2YXRlIGNsYXNzICIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIgaW1wbGVtZW50cyBQcm9jZXNzRnVuY3Rpb24geyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgLy8gT3BlbiBmdW5jdGlvbgotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAicHVibGljIHZvaWQgcHJvY2VzcyhpbnQgc2VxaWQsIFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KSB0aHJvd3MgVEV4Y2VwdGlvbiIgPDwgZW5kbDsKLSAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0KLSAgc3RyaW5nIGFyZ3NuYW1lID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKLSAgc3RyaW5nIHJlc3VsdG5hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8IGFyZ3NuYW1lIDw8ICIgYXJncyA9IG5ldyAiIDw8IGFyZ3NuYW1lIDw8ICIoKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAidHJ5IHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgImFyZ3MucmVhZChpcHJvdCk7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8IAotICAgIGluZGVudCgpIDw8ICJ9IGNhdGNoIChUUHJvdG9jb2xFeGNlcHRpb24gZSkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAiaXByb3QucmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHggPSBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5QUk9UT0NPTF9FUlJPUiwgZS5nZXRNZXNzYWdlKCkpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UoXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCIsIFRNZXNzYWdlVHlwZS5FWENFUFRJT04sIHNlcWlkKSk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIngud3JpdGUob3Byb3QpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAib3Byb3QuZ2V0VHJhbnNwb3J0KCkuZmx1c2goKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJpcHJvdC5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKLQotICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotCi0gIC8vIERlY2xhcmUgcmVzdWx0IGZvciBub24gb25ld2F5IGZ1bmN0aW9uCi0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8IHJlc3VsdG5hbWUgPDwgIiByZXN1bHQgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIoKTsiIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBUcnkgYmxvY2sgZm9yIGEgZnVuY3Rpb24gd2l0aCBleGNlcHRpb25zCi0gIGlmICh4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJ0cnkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIHRoZSBmdW5jdGlvbiBjYWxsCi0gIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOwotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOwotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCAicmVzdWx0LnN1Y2Nlc3MgPSAiOwotICB9Ci0gIGZfc2VydmljZV8gPDwKLSAgICAiaWZhY2VfLiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8ICIsICI7Ci0gICAgfQotICAgIGZfc2VydmljZV8gPDwgImFyZ3MuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gIH0KLSAgZl9zZXJ2aWNlXyA8PCAiKTsiIDw8IGVuZGw7Ci0KLSAgLy8gU2V0IGlzc2V0IG9uIHN1Y2Nlc3MgZmllbGQKLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSAmJiAhdHlwZV9jYW5fYmVfbnVsbCh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInJlc3VsdC5zZXQiIDw8IGdldF9jYXBfbmFtZSgic3VjY2VzcyIpIDw8IGdldF9jYXBfbmFtZSgiaXNTZXQiKSA8PCAiKHRydWUpOyIgPDwgZW5kbDsKLSAgfQotCi0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiB4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgewotICAgIGluZGVudF9kb3duKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSI7Ci0gICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgIGZfc2VydmljZV8gPDwgIiBjYXRjaCAoIiA8PCB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UpIDw8ICIgIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIikgeyIgPDwgZW5kbDsKLSAgICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJyZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgIn0iOwotICAgICAgfQotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8ICIgY2F0Y2ggKFRocm93YWJsZSB0aCkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHggPSBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5JTlRFUk5BTF9FUlJPUiwgXCJJbnRlcm5hbCBlcnJvciBwcm9jZXNzaW5nICIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJcIik7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIlwiLCBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OLCBzZXFpZCkpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIngud3JpdGUob3Byb3QpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIm9wcm90LmdldFRyYW5zcG9ydCgpLmZsdXNoKCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBTaG9ydGN1dCBvdXQgaGVyZSBmb3Igb25ld2F5IGZ1bmN0aW9ucwotICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJyZXR1cm47IiA8PCBlbmRsOwotICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0KLSAgICAvLyBDbG9zZSBjbGFzcwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgIGVuZGw7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UoXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCIsIFRNZXNzYWdlVHlwZS5SRVBMWSwgc2VxaWQpKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAicmVzdWx0LndyaXRlKG9wcm90KTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIm9wcm90LmdldFRyYW5zcG9ydCgpLmZsdXNoKCk7IiA8PCBlbmRsOwotCi0gIC8vIENsb3NlIGZ1bmN0aW9uCi0gIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAvLyBDbG9zZSBjbGFzcwotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotfQotCi0vKioKLSAqIERlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgotICoKLSAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkCi0gKiBAcGFyYW0gcHJlZml4IFRoZSB2YXJpYWJsZSBuYW1lIG9yIGNvbnRhaW5lciBmb3IgdGhpcyBmaWVsZAotICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLQotICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKwotICAgICAgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0KLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodF9zdHJ1Y3QqKXR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbmFtZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIgPSBpcHJvdC4iOwotCi0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKwotICAgICAgICAgIG5hbWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIGlmICghKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICAgICAgb3V0IDw8ICJyZWFkU3RyaW5nKCk7IjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBvdXQgPDwgInJlYWRCaW5hcnkoKTsiOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICBvdXQgPDwgInJlYWRCb29sKCk7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgIG91dCA8PCAicmVhZEJ5dGUoKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICBvdXQgPDwgInJlYWRJMTYoKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICBvdXQgPDwgInJlYWRJMzIoKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICBvdXQgPDwgInJlYWRJNjQoKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICBvdXQgPDwgInJlYWREb3VibGUoKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gSmF2YSBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIiA9ICIgPDwgdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSwgdHJ1ZSwgZmFsc2UpICsgIi5maW5kQnlWYWx1ZShpcHJvdC5yZWFkSTMyKCkpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBERVNFUklBTElaRSBGSUVMRCAnJXMnIFRZUEUgJyVzJ1xuIiwKLSAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksIHR5cGVfbmFtZSh0eXBlKS5jX3N0cigpKTsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhbiB1bnNlcmlhbGl6ZXIgZm9yIGEgc3RydWN0LCBpbnZva2VzIHJlYWQoKQotICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIigpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8IHByZWZpeCA8PCAiLnJlYWQoaXByb3QpOyIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBEZXNlcmlhbGl6ZXMgYSBjb250YWluZXIgYnkgcmVhZGluZyBpdHMgc2l6ZSBhbmQgdGhlbiBpdGVyYXRpbmcKLSAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgc2NvcGVfdXAob3V0KTsKLQotICBzdHJpbmcgb2JqOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBvYmogPSB0bXAoIl9tYXAiKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBvYmogPSB0bXAoIl9zZXQiKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgb2JqID0gdG1wKCJfbGlzdCIpOwotICB9Ci0KLSAgLy8gRGVjbGFyZSB2YXJpYWJsZXMsIHJlYWQgaGVhZGVyCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiVE1hcCAiIDw8IG9iaiA8PCAiID0gaXByb3QucmVhZE1hcEJlZ2luKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJUU2V0ICIgPDwgb2JqIDw8ICIgPSBpcHJvdC5yZWFkU2V0QmVnaW4oKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJUTGlzdCAiIDw8IG9iaiA8PCAiID0gaXByb3QucmVhZExpc3RCZWdpbigpOyIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudChvdXQpCi0gICAgPDwgcHJlZml4IDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlKQotICAgIC8vIHNpemUgdGhlIGNvbGxlY3Rpb24gY29ycmVjdGx5Ci0gICAgPDwgIigiCi0gICAgPDwgKHR0eXBlLT5pc19saXN0KCkgPyAiIiA6ICIyKiIgKQotICAgIDw8IG9iaiA8PCAiLnNpemUiCi0gICAgPDwgIik7IiA8PCBlbmRsOwotCi0gIC8vIEZvciBsb29wIGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMKLSAgc3RyaW5nIGkgPSB0bXAoIl9pIik7Ci0gIGluZGVudChvdXQpIDw8Ci0gICAgImZvciAoaW50ICIgPDwgaSA8PCAiID0gMDsgIiA8PAotICAgIGkgPDwgIiA8ICIgPDwgb2JqIDw8ICIuc2l6ZSIgPDwgIjsgIiA8PAotICAgICIrKyIgPDwgaSA8PCAiKSIgPDwgZW5kbDsKLQotICAgIHNjb3BlX3VwKG91dCk7Ci0KLSAgICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIHByZWZpeCk7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgcHJlZml4KTsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBwcmVmaXgpOwotICAgIH0KLQotICAgIHNjb3BlX2Rvd24ob3V0KTsKLQotICAvLyBSZWFkIGNvbnRhaW5lciBlbmQKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkTWFwRW5kKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkU2V0RW5kKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZExpc3RFbmQoKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBzY29wZV9kb3duKG91dCk7Ci19Ci0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgY29kZSB0byBkZXNlcmlhbGl6ZSBhIG1hcAotICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgc3RyaW5nIGtleSA9IHRtcCgiX2tleSIpOwotICBzdHJpbmcgdmFsID0gdG1wKCJfdmFsIik7Ci0gIHRfZmllbGQgZmtleSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KTsKLSAgdF9maWVsZCBmdmFsKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2YWwpOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgZGVjbGFyZV9maWVsZCgmZmtleSkgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwKLSAgICBkZWNsYXJlX2ZpZWxkKCZmdmFsKSA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZrZXkpOwotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmdmFsKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgIHByZWZpeCA8PCAiLnB1dCgiIDw8Ci0gICAgYm94X3R5cGUodG1hcC0+Z2V0X2tleV90eXBlKCksIGtleSkgPDwgIiwgIiA8PAotICAgIGJveF90eXBlKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2YWwpIDw8ICIpOyIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBEZXNlcmlhbGl6ZXMgYSBzZXQgZWxlbWVudAotICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7Ci0gIHRfZmllbGQgZmVsZW0odHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgIGRlY2xhcmVfZmllbGQoJmZlbGVtKSA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgIHByZWZpeCA8PCAiLnB1dCgiIDw8Ci0gICAgYm94X3R5cGUodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKSA8PCAiLCAiIDw8Ci0gICAgYm94X3R5cGUodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKSA8PCAiKTsiIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogRGVzZXJpYWxpemVzIGEgbGlzdCBlbGVtZW50Ci0gKi8KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOwotICB0X2ZpZWxkIGZlbGVtKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgZGVjbGFyZV9maWVsZCgmZmVsZW0pIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgcHJlZml4IDw8ICIuYWRkRWxlbWVudCgiIDw8Ci0gICAgYm94X3R5cGUodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSkgPDwgIik7IiA8PCBlbmRsOwotfQotCi0KLS8qKgotICogU2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgotICoKLSAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkIHRvIHNlcmlhbGl6ZQotICogQHBhcmFtIHByZWZpeCBOYW1lIHRvIHByZXBlbmQgdG8gZmllbGQgbmFtZQotICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLQotICAvLyBEbyBub3RoaW5nIGZvciB2b2lkIHR5cGVzCi0gIGlmICh0eXBlLT5pc192b2lkKCkpIHsKLSAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIFNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKwotICAgICAgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0X3N0cnVjdCopdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSl7Ci0gICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlSTMyKCIgPDwgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIuZ2V0VmFsdWUoKSk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvcHJvdC4iOwotCi0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIHRocm93Ci0gICAgICAgICAgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICBpZiAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICAgICAgb3V0IDw8ICJ3cml0ZUJpbmFyeSgiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBvdXQgPDwgIndyaXRlU3RyaW5nKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICBvdXQgPDwgIndyaXRlQm9vbCgiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgIG91dCA8PCAid3JpdGVCeXRlKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICBvdXQgPDwgIndyaXRlSTE2KCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICBvdXQgPDwgIndyaXRlSTMyKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICBvdXQgPDwgIndyaXRlSTY0KCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICBvdXQgPDwgIndyaXRlRG91YmxlKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gSmF2YSBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIG91dCA8PCAid3JpdGVJMzIoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIFNFUklBTElaRSBGSUVMRCAnJXMlcycgVFlQRSAnJXMnXG4iLAotICAgICAgICAgICBwcmVmaXguY19zdHIoKSwKLSAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCi0gICAgICAgICAgIHR5cGVfbmFtZSh0eXBlKS5jX3N0cigpKTsKLSAgfQotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgYWxsIHRoZSBtZW1iZXJzIG9mIGEgc3RydWN0LgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgdG8gc2VyaWFsaXplCi0gKiBAcGFyYW0gcHJlZml4ICBTdHJpbmcgcHJlZml4IHRvIGF0dGFjaCB0byBhbGwgZmllbGRzCi0gKi8KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICAodm9pZCkgdHN0cnVjdDsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIud3JpdGUob3Byb3QpOyIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIGEgY29udGFpbmVyIGJ5IHdyaXRpbmcgaXRzIHNpemUgdGhlbiB0aGUgZWxlbWVudHMuCi0gKgotICogQHBhcmFtIHR0eXBlICBUaGUgdHlwZSBvZiBjb250YWluZXIKLSAqIEBwYXJhbSBwcmVmaXggU3RyaW5nIHByZWZpeCBmb3IgZmllbGRzCi0gKi8KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3Byb3Qud3JpdGVNYXBCZWdpbihuZXcgVE1hcCgiIDw8Ci0gICAgICB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgIHByZWZpeCA8PCAiLnNpemUoKSkpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm9wcm90LndyaXRlU2V0QmVnaW4obmV3IFRTZXQoIiA8PAotICAgICAgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICBwcmVmaXggPDwgIi5zaXplKCkpKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3Byb3Qud3JpdGVMaXN0QmVnaW4obmV3IFRMaXN0KCIgPDwKLSAgICAgIHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgIHByZWZpeCA8PCAiLnNpemUoKSkpOyIgPDwgZW5kbDsKLSAgfQotCi0gIHN0cmluZyBpdGVyID0gdG1wKCJfaXRlciIpOwotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgc3RyaW5nIGVudW1lciA9IGl0ZXIgKyAiX2VudW0iOwotICAgIHN0cmluZyBrZXlfdHlwZSA9IHR5cGVfbmFtZSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpLCB0cnVlLCBmYWxzZSk7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJmb3IgKEVudW1lcmF0aW9uICIgPDwgZW51bWVyIDw8ICIgPSAiIDw8IHByZWZpeCA8PCAiLmtleXMoKTsgIiA8PCBlbnVtZXIgPDwgIi5oYXNNb3JlRWxlbWVudHMoKTsgKSAiOwotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgaW5kZW50KG91dCkKLSAgICAgIDw8IGtleV90eXBlIDw8ICIgIiA8PCBpdGVyIDw8ICIgPSAoIiA8PCBrZXlfdHlwZSA8PCAiKSIgPDwgZW51bWVyIDw8ICIubmV4dEVsZW1lbnQoKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgc3RyaW5nIGVudW1lciA9IGl0ZXIgKyAiX2VudW0iOwotICAgIHN0cmluZyBlbGVfdHlwZSA9IHR5cGVfbmFtZSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCksIHRydWUpOwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiZm9yIChFbnVtZXJhdGlvbiAiIDw8IGVudW1lciA8PCAiID0gIiA8PCBwcmVmaXggPDwgIi5rZXlzKCk7ICIgPDwgZW51bWVyIDw8ICIuaGFzTW9yZUVsZW1lbnRzKCk7ICkgIjsKLSAgICBzY29wZV91cChvdXQpOwotICAgIGluZGVudChvdXQpCi0gICAgICA8PCBlbGVfdHlwZSA8PCAiICIgPDwgaXRlciA8PCAiID0gKCIKLSAgICAgIDw8IGVsZV90eXBlIDw8ICIpIiA8PCBlbnVtZXIgPDwgIi5uZXh0RWxlbWVudCgpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgc3RyaW5nIGVudW1lciA9IGl0ZXIgKyAiX2VudW0iOwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiZm9yIChFbnVtZXJhdGlvbiAiIDw8IGVudW1lciA8PCAiID0gIiA8PCBwcmVmaXggPDwgIi5lbGVtZW50cygpOyAiIDw8IGVudW1lciA8PCAiLmhhc01vcmVFbGVtZW50cygpOyApICI7Ci0gICAgc2NvcGVfdXAob3V0KTsKLSAgICBzdHJpbmcgZWxlX3R5cGUgPSB0eXBlX25hbWUoKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpLCB0cnVlKTsKLSAgICBpbmRlbnQob3V0KQotICAgICAgPDwgZWxlX3R5cGUgPDwgIiAiIDw8IGl0ZXIgPDwgIiA9ICgiCi0gICAgICA8PCBlbGVfdHlwZSA8PCAiKSIgPDwgZW51bWVyIDw8ICIubmV4dEVsZW1lbnQoKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgaXRlciwgcHJlZml4KTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBpdGVyKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBpdGVyKTsKLSAgfQotICBzY29wZV9kb3duKG91dCk7Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3Byb3Qud3JpdGVNYXBFbmQoKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvcHJvdC53cml0ZVNldEVuZCgpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvcHJvdC53cml0ZUxpc3RFbmQoKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBzY29wZV9kb3duKG91dCk7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIG1hcC4KLSAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBtYXApIHsKLSAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksIGl0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAma2ZpZWxkLCAiIik7Ci0gIHN0cmluZyB2YWxfdHlwZSA9IHR5cGVfbmFtZSh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdHJ1ZSwgZmFsc2UpOwotICB0X2ZpZWxkIHZmaWVsZCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgIigoIiArIHZhbF90eXBlICsgIikiICsgbWFwICsgIi5nZXQoIiArIGl0ZXIgKyAiKSkiKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJnZmaWVsZCwgIiIpOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBzZXQuCi0gKi8KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0c2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZXIpIHsKLSAgdF9maWVsZCBlZmllbGQodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIpOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBsaXN0LgotICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZXIpIHsKLSAgdF9maWVsZCBlZmllbGQodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiKTsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIGEgSmF2YSB0eXBlIG5hbWUKLSAqCi0gKiBAcGFyYW0gdHR5cGUgVGhlIHR5cGUKLSAqIEBwYXJhbSBjb250YWluZXIgSXMgdGhlIHR5cGUgZ29pbmcgaW5zaWRlIGEgY29udGFpbmVyPwotICogQHJldHVybiBKYXZhIHR5cGUgbmFtZSwgaS5lLiBWZWN0b3IKLSAqLwotc3RyaW5nIHRfamF2YW1lX2dlbmVyYXRvcjo6dHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsIGJvb2wgaW5fY29udGFpbmVyLCBib29sIGluX2luaXQsIGJvb2wgc2tpcF9nZW5lcmljKSB7Ci0gICh2b2lkKSBpbl9pbml0OwotICAodm9pZCkgc2tpcF9nZW5lcmljOwotICAvLyBJbiBKYXZhIHR5cGVkZWZzIGFyZSBqdXN0IHJlc29sdmVkIHRvIHRoZWlyIHJlYWwgdHlwZQotICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOwotICBzdHJpbmcgcHJlZml4OwotCi0gIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICByZXR1cm4gYmFzZV90eXBlX25hbWUoKHRfYmFzZV90eXBlKil0dHlwZSwgaW5fY29udGFpbmVyKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gIkhhc2h0YWJsZSI7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgcmV0dXJuICJIYXNodGFibGUiOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICByZXR1cm4gIlZlY3RvciI7Ci0gIH0KLQotICAvLyBDaGVjayBmb3IgbmFtZXNwYWNpbmcKLSAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHR5cGUtPmdldF9wcm9ncmFtKCk7Ci0gIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgewotICAgIHN0cmluZyBwYWNrYWdlID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiamF2YSIpOwotICAgIGlmICghcGFja2FnZS5lbXB0eSgpKSB7Ci0gICAgICByZXR1cm4gcGFja2FnZSArICIuIiArIHR0eXBlLT5nZXRfbmFtZSgpOwotICAgIH0KLSAgfQotCi0gIHJldHVybiB0dHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIHRoZSBDKysgdHlwZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSB0aHJpZnQgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdGJhc2UgVGhlIGJhc2UgdHlwZQotICogQHBhcmFtIGNvbnRhaW5lciBJcyBpdCBnb2luZyBpbiBhIEphdmEgY29udGFpbmVyPwotICovCi1zdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjpiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZSogdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2NvbnRhaW5lcikgewotICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gdHlwZS0+Z2V0X2Jhc2UoKTsKLQotICBzd2l0Y2ggKHRiYXNlKSB7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICByZXR1cm4gInZvaWQiOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICBpZiAoIXR5cGUtPmlzX2JpbmFyeSgpKSB7Ci0gICAgICByZXR1cm4gIlN0cmluZyI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiAiYnl0ZVtdIjsKLSAgICB9Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICByZXR1cm4gKGluX2NvbnRhaW5lciA/ICJCb29sZWFuIiA6ICJib29sZWFuIik7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICByZXR1cm4gKGluX2NvbnRhaW5lciA/ICJCeXRlIiA6ICJieXRlIik7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgIHJldHVybiAoaW5fY29udGFpbmVyID8gIlNob3J0IiA6ICJzaG9ydCIpOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICByZXR1cm4gKGluX2NvbnRhaW5lciA/ICJJbnRlZ2VyIiA6ICJpbnQiKTsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgcmV0dXJuIChpbl9jb250YWluZXIgPyAiTG9uZyIgOiAibG9uZyIpOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICByZXR1cm4gKGluX2NvbnRhaW5lciA/ICJEb3VibGUiIDogImRvdWJsZSIpOwotICBkZWZhdWx0OgotICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gSmF2YSBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBEZWNsYXJlcyBhIGZpZWxkLCB3aGljaCBtYXkgaW5jbHVkZSBpbml0aWFsaXphdGlvbiBhcyBuZWNlc3NhcnkuCi0gKgotICogQHBhcmFtIHR0eXBlIFRoZSB0eXBlCi0gKi8KLXN0cmluZyB0X2phdmFtZV9nZW5lcmF0b3I6OmRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluaXQpIHsKLSAgLy8gVE9ETyhtY3NsZWUpOiBkbyB3ZSBldmVyIG5lZWQgdG8gaW5pdGlhbGl6ZSB0aGUgZmllbGQ/Ci0gIHN0cmluZyByZXN1bHQgPSB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpKSArICIgIiArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLSAgaWYgKGluaXQpIHsKLSAgICB0X3R5cGUqIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOwotICAgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgdGZpZWxkLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7Ci0gICAgICBvZnN0cmVhbSBkdW1teTsKLSAgICAgIHJlc3VsdCArPSAiID0gIiArIHJlbmRlcl9jb25zdF92YWx1ZShkdW1teSwgdGZpZWxkLT5nZXRfbmFtZSgpLCB0dHlwZSwgdGZpZWxkLT5nZXRfdmFsdWUoKSk7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICByZXN1bHQgKz0gIiA9IG51bGwiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgcmVzdWx0ICs9ICIgPSBmYWxzZSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICByZXN1bHQgKz0gIiA9IDAiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICByZXN1bHQgKz0gIiA9IChkb3VibGUpMCI7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgcmVzdWx0ICs9ICIgPSAwIjsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgICAgcmVzdWx0ICs9ICIgPSBuZXcgIiArIHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpICsgIigpIjsKLSAgICB9IGVsc2UgewotICAgICAgcmVzdWx0ICs9ICIgPSBuZXcgIiArIHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpICsgIigpIjs7Ci0gICAgfQotICB9Ci0gIHJldHVybiByZXN1bHQgKyAiOyI7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAndHlwZSBuYW1lKGFyZ3MpJwotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgotICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgotICovCi1zdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHRfdHlwZSogdHR5cGUgPSB0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCk7Ci0gIHN0ZDo6c3RyaW5nIHJlc3VsdCA9Ci0gICAgdHlwZV9uYW1lKHR0eXBlKSArICIgIiArIHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICIoIiArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKSArICIpIHRocm93cyAiOwotICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgIHJlc3VsdCArPSB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UpICsgIiwgIjsKLSAgfQotICByZXN1bHQgKz0gIlRFeGNlcHRpb24iOwotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioKLSAqIFJlbmRlcnMgYSBjb21tYSBzZXBhcmF0ZWQgZmllbGQgbGlzdCwgd2l0aCB0eXBlIG5hbWVzCi0gKi8KLXN0cmluZyB0X2phdmFtZV9nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaW5jbHVkZV90eXBlcykgewotICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlc3VsdCArPSAiLCAiOwotICAgIH0KLSAgICBpZiAoaW5jbHVkZV90eXBlcykgewotICAgICAgcmVzdWx0ICs9IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF90eXBlKCkpICsgIiAiOwotICAgIH0KLSAgICByZXN1bHQgKz0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBDKysgZW51bSBzdHJpbmcgZm9yIHRoZSBnaXZlbiB0eXBlLgotICovCi1zdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgcmV0dXJuICJUVHlwZS5TVFJJTkciOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIHJldHVybiAiVFR5cGUuQk9PTCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgcmV0dXJuICJUVHlwZS5CWVRFIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIHJldHVybiAiVFR5cGUuSTE2IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIHJldHVybiAiVFR5cGUuSTMyIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJldHVybiAiVFR5cGUuSTY0IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIHJldHVybiAiVFR5cGUuRE9VQkxFIjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZS5JMzIiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLlNUUlVDVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLk1BUCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLlNFVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZS5MSVNUIjsKLSAgfQotCi0gIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotLyoqCi0gKiBBcHBsaWVzIHRoZSBjb3JyZWN0IHN0eWxlIHRvIGEgc3RyaW5nIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZiBub2NhbWVsX3N0eWxlXwotICovCi1zdGQ6OnN0cmluZyB0X2phdmFtZV9nZW5lcmF0b3I6OmdldF9jYXBfbmFtZShzdGQ6OnN0cmluZyBuYW1lKXsKLSAgbmFtZVswXSA9IHRvdXBwZXIobmFtZVswXSk7Ci0gIHJldHVybiBuYW1lOwotfQotCi1zdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjpjb25zdGFudF9uYW1lKHN0cmluZyBuYW1lKSB7Ci0gIHN0cmluZyBjb25zdGFudF9uYW1lOwotCi0gIGJvb2wgaXNfZmlyc3QgPSB0cnVlOwotICBib29sIHdhc19wcmV2aW91c19jaGFyX3VwcGVyID0gZmFsc2U7Ci0gIGZvciAoc3RyaW5nOjppdGVyYXRvciBpdGVyID0gbmFtZS5iZWdpbigpOyBpdGVyICE9IG5hbWUuZW5kKCk7ICsraXRlcikgewotICAgIHN0cmluZzo6dmFsdWVfdHlwZSBjaGFyYWN0ZXIgPSAoKml0ZXIpOwotCi0gICAgYm9vbCBpc191cHBlciA9IGlzdXBwZXIoY2hhcmFjdGVyKTsKLQotICAgIGlmIChpc191cHBlciAmJiAhaXNfZmlyc3QgJiYgIXdhc19wcmV2aW91c19jaGFyX3VwcGVyKSB7Ci0gICAgICBjb25zdGFudF9uYW1lICs9ICdfJzsKLSAgICB9Ci0gICAgY29uc3RhbnRfbmFtZSArPSB0b3VwcGVyKGNoYXJhY3Rlcik7Ci0KLSAgICBpc19maXJzdCA9IGZhbHNlOwotICAgIHdhc19wcmV2aW91c19jaGFyX3VwcGVyID0gaXNfdXBwZXI7Ci0gIH0KLQotICByZXR1cm4gY29uc3RhbnRfbmFtZTsKLX0KLQotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfZG9jc3RyaW5nX2NvbW1lbnQob2ZzdHJlYW0gJm91dCwgc3RyaW5nIGNvbnRlbnRzKSB7Ci0gIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KG91dCwKLSAgICAiLyoqXG4iLAotICAgICIgKiAiLCBjb250ZW50cywKLSAgICAiICovXG4iKTsKLX0KLQotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfZG9jKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIGZpZWxkKSB7Ci0gIGlmIChmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfZW51bSgpKSB7Ci0gICAgc3RyaW5nIGNvbWJpbmVkX21lc3NhZ2UgPSBmaWVsZC0+Z2V0X2RvYygpICsgIlxuQHNlZSAiICsgZ2V0X2VudW1fY2xhc3NfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0gICAgZ2VuZXJhdGVfamF2YV9kb2NzdHJpbmdfY29tbWVudChvdXQsIGNvbWJpbmVkX21lc3NhZ2UpOwotICB9IGVsc2UgewotICAgIGdlbmVyYXRlX2phdmFfZG9jKG91dCwgKHRfZG9jKilmaWVsZCk7Ci0gIH0KLX0KLQotLyoqCi0gKiBFbWl0cyBhIEphdmFEb2MgY29tbWVudCBpZiB0aGUgcHJvdmlkZWQgb2JqZWN0IGhhcyBhIGRvYyBpbiBUaHJpZnQKLSAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfZG9jKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZG9jKiB0ZG9jKSB7Ci0gIGlmICh0ZG9jLT5oYXNfZG9jKCkpIHsKLSAgICBnZW5lcmF0ZV9qYXZhX2RvY3N0cmluZ19jb21tZW50KG91dCwgdGRvYy0+Z2V0X2RvYygpKTsKLSAgfQotfQotCi0vKioKLSAqIEVtaXRzIGEgSmF2YURvYyBjb21tZW50IGlmIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBvYmplY3QgaGFzIGEgZG9jIGluIFRocmlmdAotICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9kb2Mob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gIGlmICh0ZnVuY3Rpb24tPmhhc19kb2MoKSkgewotICAgIHN0cmluZ3N0cmVhbSBzczsKLSAgICBzcyA8PCB0ZnVuY3Rpb24tPmdldF9kb2MoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgcF9pdGVyOwotICAgIGZvciAocF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IHBfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrcF9pdGVyKSB7Ci0gICAgICB0X2ZpZWxkKiBwID0gKnBfaXRlcjsKLSAgICAgIHNzIDw8ICJcbkBwYXJhbSAiIDw8IHAtPmdldF9uYW1lKCk7Ci0gICAgICBpZiAocC0+aGFzX2RvYygpKSB7Ci0gICAgICAgIHNzIDw8ICIgIiA8PCBwLT5nZXRfZG9jKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KG91dCwKLSAgICAgICIvKipcbiIsCi0gICAgICAiICogIiwgc3Muc3RyKCksCi0gICAgICAiICovXG4iKTsKLSAgfQotfQotCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVlcF9jb3B5X2NvbnRhaW5lcihvZnN0cmVhbSAmb3V0LCBzdGQ6OnN0cmluZyBzb3VyY2VfbmFtZV9wMSwgc3RkOjpzdHJpbmcgc291cmNlX25hbWVfcDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcmVzdWx0X25hbWUsIHRfdHlwZSogdHlwZSkgewotCi0gIHRfY29udGFpbmVyKiBjb250YWluZXIgPSAodF9jb250YWluZXIqKXR5cGU7Ci0gIHN0ZDo6c3RyaW5nIHNvdXJjZV9uYW1lOwotICBpZiAoc291cmNlX25hbWVfcDIgPT0gIiIpCi0gICAgICBzb3VyY2VfbmFtZSA9IHNvdXJjZV9uYW1lX3AxOwotICBlbHNlCi0gICAgICBzb3VyY2VfbmFtZSA9IHNvdXJjZV9uYW1lX3AxICsgIi4iICsgc291cmNlX25hbWVfcDI7Ci0KLSAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKHR5cGUsIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgcmVzdWx0X25hbWUgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZShjb250YWluZXIsIGZhbHNlLCB0cnVlKSA8PCAiKCk7IiA8PCBlbmRsOwotCi0gIHN0ZDo6c3RyaW5nIGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSA9IHNvdXJjZV9uYW1lX3AxICsgIl9lbGVtZW50IjsKLSAgc3RkOjpzdHJpbmcgZW51bWVyYXRpb25fbmFtZSA9IHNvdXJjZV9uYW1lX3AxICsgIl9lbnVtIjsKLSAgc3RkOjpzdHJpbmcgcmVzdWx0X2VsZW1lbnRfbmFtZSA9IHJlc3VsdF9uYW1lICsgIl9jb3B5IjsKLQotICBpZihjb250YWluZXItPmlzX21hcCgpKSB7Ci0gICAgdF90eXBlKiBrZXlfdHlwZSA9ICgodF9tYXAqKWNvbnRhaW5lciktPmdldF9rZXlfdHlwZSgpOwotICAgIHRfdHlwZSogdmFsX3R5cGUgPSAoKHRfbWFwKiljb250YWluZXIpLT5nZXRfdmFsX3R5cGUoKTsKLQotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiZm9yIChFbnVtZXJhdGlvbiAiIDw8IGVudW1lcmF0aW9uX25hbWUgPDwgIiA9ICIgPDwgc291cmNlX25hbWUgPDwgIi5rZXlzKCk7ICIgPDwgZW51bWVyYXRpb25fbmFtZSA8PCAiLmhhc01vcmVFbGVtZW50cygpOyApIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBvdXQgPDwgZW5kbDsKLQotICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZShrZXlfdHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCBpdGVyYXRvcl9lbGVtZW50X25hbWUgPDwgIl9rZXkgPSAoIiA8PCB0eXBlX25hbWUoa2V5X3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiKSIgPDwgZW51bWVyYXRpb25fbmFtZSA8PCAiLm5leHRFbGVtZW50KCk7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZSh2YWxfdHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCBpdGVyYXRvcl9lbGVtZW50X25hbWUgPDwgIl92YWx1ZSA9ICgiCi0JCTw8IHR5cGVfbmFtZSh2YWxfdHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIpIiA8PCBzb3VyY2VfbmFtZSA8PCAiLmdldCgiIDw8IGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSA8PCAiX2tleSk7IiA8PCBlbmRsOwotCi0gICAgb3V0IDw8IGVuZGw7Ci0KLSAgICBpZiAoa2V5X3R5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfY29udGFpbmVyKG91dCwgaXRlcmF0b3JfZWxlbWVudF9uYW1lICsgIl9rZXkiLCAiIiwgcmVzdWx0X2VsZW1lbnRfbmFtZSArICJfa2V5Iiwga2V5X3R5cGUpOwotICAgIH0gZWxzZSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUoa2V5X3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgcmVzdWx0X2VsZW1lbnRfbmFtZSA8PCAiX2tleSA9ICI7Ci0gICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfbm9uX2NvbnRhaW5lcihvdXQsIGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSArICJfa2V5IiwgcmVzdWx0X2VsZW1lbnRfbmFtZSArICJfa2V5Iiwga2V5X3R5cGUpOwotICAgICAgb3V0IDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIG91dCA8PCBlbmRsOwotCi0gICAgaWYgKHZhbF90eXBlLT5pc19jb250YWluZXIoKSkgewotICAgICAgZ2VuZXJhdGVfZGVlcF9jb3B5X2NvbnRhaW5lcihvdXQsIGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSArICJfdmFsdWUiLCAiIiwgcmVzdWx0X2VsZW1lbnRfbmFtZSArICJfdmFsdWUiLCB2YWxfdHlwZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZSh2YWxfdHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCByZXN1bHRfZWxlbWVudF9uYW1lIDw8ICJfdmFsdWUgPSAiOwotICAgICAgZ2VuZXJhdGVfZGVlcF9jb3B5X25vbl9jb250YWluZXIob3V0LCBpdGVyYXRvcl9lbGVtZW50X25hbWUgKyAiX3ZhbHVlIiwgcmVzdWx0X2VsZW1lbnRfbmFtZSArICJfdmFsdWUiLCB2YWxfdHlwZSk7Ci0gICAgICBvdXQgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgb3V0IDw8IGVuZGw7Ci0KLSAgICBpbmRlbnQob3V0KSA8PCByZXN1bHRfbmFtZSA8PCAiLnB1dCgiIDw8IHJlc3VsdF9lbGVtZW50X25hbWUgPDwgIl9rZXksICIgPDwgcmVzdWx0X2VsZW1lbnRfbmFtZSA8PCAiX3ZhbHVlKTsiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotCi0gIH0gZWxzZSB7Ci0gICAgdF90eXBlKiBlbGVtX3R5cGU7Ci0KLSAgICBpZiAoY29udGFpbmVyLT5pc19zZXQoKSkgewotICAgICAgZWxlbV90eXBlID0gKCh0X3NldCopY29udGFpbmVyKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICBlbGVtX3R5cGUgPSAoKHRfbGlzdCopY29udGFpbmVyKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIH0KLQotICAgIGluZGVudChvdXQpCi0gICAgICA8PCAiZm9yIChFbnVtZXJhdGlvbiAiIDw8IGVudW1lcmF0aW9uX25hbWUgPDwgIiA9ICIgPDwgc291cmNlX25hbWUgPDwgIi5lbGVtZW50cygpOyAiIAotICAgICAgPDwgZW51bWVyYXRpb25fbmFtZSA8PCAiLmhhc01vcmVFbGVtZW50cygpOyApIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkKLSAgICAgIDw8IHR5cGVfbmFtZShlbGVtX3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgaXRlcmF0b3JfZWxlbWVudF9uYW1lIDw8ICIgPSAoIgotICAgICAgPDwgdHlwZV9uYW1lKGVsZW1fdHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIpIiA8PCBlbnVtZXJhdGlvbl9uYW1lIDw8ICIubmV4dEVsZW1lbnQoKTsiIDw8IGVuZGw7Ci0gICAgaWYgKGVsZW1fdHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICAgIC8vIHJlY3Vyc2l2ZSBkZWVwIGNvcHkKLSAgICAgIGdlbmVyYXRlX2RlZXBfY29weV9jb250YWluZXIob3V0LCBpdGVyYXRvcl9lbGVtZW50X25hbWUsICIiLCByZXN1bHRfZWxlbWVudF9uYW1lLCBlbGVtX3R5cGUpOwotICAgICAgaWYgKGVsZW1fdHlwZS0+aXNfbGlzdCgpKSB7Ci0JaW5kZW50KG91dCkgPDwgcmVzdWx0X25hbWUgPDwgIi5hZGRFbGVtZW50KCIgPDwgcmVzdWx0X2VsZW1lbnRfbmFtZSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotCWluZGVudChvdXQpIDw8IHJlc3VsdF9uYW1lIDw8ICIucHV0KCIgPDwgcmVzdWx0X2VsZW1lbnRfbmFtZSA8PCAiLCAiIDw8IHJlc3VsdF9lbGVtZW50X25hbWUgPDwgIik7IiA8PCBlbmRsOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBpdGVyYXRpdmUgY29weQotICAgICAgaWYoKCh0X2Jhc2VfdHlwZSopZWxlbV90eXBlKS0+aXNfYmluYXJ5KCkpewotICAgICAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUoZWxlbV90eXBlLCB0cnVlLCBmYWxzZSkgPDwgIiB0ZW1wX2JpbmFyeV9lbGVtZW50ID0gIjsKLSAgICAgICAgZ2VuZXJhdGVfZGVlcF9jb3B5X25vbl9jb250YWluZXIob3V0LCBpdGVyYXRvcl9lbGVtZW50X25hbWUsICJ0ZW1wX2JpbmFyeV9lbGVtZW50IiwgZWxlbV90eXBlKTsKLSAgICAgICAgb3V0IDw8ICI7IiA8PCBlbmRsOwotCWlmIChlbGVtX3R5cGUtPmlzX2xpc3QoKSkgewotCSAgaW5kZW50KG91dCkgPDwgcmVzdWx0X25hbWUgPDwgIi5hZGRFbGVtZW50KHRlbXBfYmluYXJ5X2VsZW1lbnQpOyIgPDwgZW5kbDsKLQl9IGVsc2UgewotCSAgaW5kZW50KG91dCkgPDwgcmVzdWx0X25hbWUgPDwgIi5wdXQodGVtcF9iaW5hcnlfZWxlbWVudCwgdGVtcF9iaW5hcnlfZWxlbWVudCk7IiA8PCBlbmRsOwotCX0KLSAgICAgIH0gZWxzZXsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgcmVzdWx0X25hbWUgPDwgIi5hZGRFbGVtZW50KCI7Ci0gICAgICAgIGdlbmVyYXRlX2RlZXBfY29weV9ub25fY29udGFpbmVyKG91dCwgaXRlcmF0b3JfZWxlbWVudF9uYW1lLCByZXN1bHRfbmFtZSwgZWxlbV90eXBlKTsKLSAgICAgICAgb3V0IDw8ICIpOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpbmRlbnRfZG93bigpOwotCi0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgfQotfQotCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVlcF9jb3B5X25vbl9jb250YWluZXIob2ZzdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgc291cmNlX25hbWUsIHN0ZDo6c3RyaW5nIGRlc3RfbmFtZSwgdF90eXBlKiB0eXBlKSB7Ci0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkgfHwgdHlwZS0+aXNfdHlwZWRlZigpKSB7Ci0gICAgLy8gYmluYXJ5IGZpZWxkcyBuZWVkIHRvIGJlIGNvcGllZCB3aXRoIFN5c3RlbS5hcnJheWNvcHkKLSAgICBpZiAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpKXsKLSAgICAgIG91dCA8PCAibmV3IGJ5dGVbIiA8PCBzb3VyY2VfbmFtZSA8PCAiLmxlbmd0aF07IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIlN5c3RlbS5hcnJheWNvcHkoIiA8PCBzb3VyY2VfbmFtZSA8PCAiLCAwLCAiIDw8IGRlc3RfbmFtZSA8PCAiLCAwLCAiIDw8IHNvdXJjZV9uYW1lIDw8ICIubGVuZ3RoKSI7Ci0gICAgfQotICAgIC8vIGV2ZXJ5dGhpbmcgZWxzZSBjYW4gYmUgY29waWVkIGRpcmVjdGx5Ci0gICAgZWxzZQotICAgICAgb3V0IDw8IHNvdXJjZV9uYW1lOwotICB9IGVsc2UgewotICAgIG91dCA8PCAibmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIHRydWUsIHRydWUpIDw8ICIoIiA8PCBzb3VyY2VfbmFtZSA8PCAiKSI7Ci0gIH0KLX0KLQotc3RkOjpzdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9pc3NldF9jaGVjayh0X2ZpZWxkKiBmaWVsZCkgewotICByZXR1cm4gZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQtPmdldF9uYW1lKCkpOwotfQotCi1zdGQ6OnN0cmluZyB0X2phdmFtZV9nZW5lcmF0b3I6Omlzc2V0X2ZpZWxkX2lkKHRfZmllbGQqIGZpZWxkKSB7Ci0gIHJldHVybiAiX18iICsgdXBjYXNlX3N0cmluZyhmaWVsZC0+Z2V0X25hbWUoKSArICJfaXNzZXRfaWQiKTsKLX0KLQotc3RkOjpzdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9pc3NldF9jaGVjayhzdGQ6OnN0cmluZyBmaWVsZF9uYW1lKSB7Ci0gIHJldHVybiAiaXMiICsgZ2V0X2NhcF9uYW1lKCJzZXQiKSArIGdldF9jYXBfbmFtZShmaWVsZF9uYW1lKSArICIoKSI7Ci19Ci0KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9pc3NldF9zZXQob2ZzdHJlYW0mIG91dCwgdF9maWVsZCogZmllbGQpIHsKLSAgaWYgKCF0eXBlX2Nhbl9iZV9udWxsKGZpZWxkLT5nZXRfdHlwZSgpKSkgewotICAgIGluZGVudChvdXQpIDw8ICJzZXQiIDw8IGdldF9jYXBfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgZ2V0X2NhcF9uYW1lKCJpc1NldCIpIDw8ICIodHJ1ZSk7IiA8PCBlbmRsOwotICB9Ci19Ci0KLXN0ZDo6c3RyaW5nIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2V0X2VudW1fY2xhc3NfbmFtZSh0X3R5cGUqIHR5cGUpIHsKLSAgc3RyaW5nIHBhY2thZ2UgPSAiIjsKLSAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHlwZS0+Z2V0X3Byb2dyYW0oKTsKLSAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7Ci0gICAgcGFja2FnZSA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2UoImphdmEiKSArICIuIjsKLSAgfQotICByZXR1cm4gcGFja2FnZSArIHR5cGUtPmdldF9uYW1lKCk7Ci19Ci0KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3RfZGVzYyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBpbmRlbnQob3V0KSA8PAotICAgICJwcml2YXRlIHN0YXRpYyBmaW5hbCBUU3RydWN0IFNUUlVDVF9ERVNDID0gbmV3IFRTdHJ1Y3QoXCIiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIlwiKTsiIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9maWVsZF9kZXNjcyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgInByaXZhdGUgc3RhdGljIGZpbmFsIFRGaWVsZCAiIDw8IGNvbnN0YW50X25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PAotICAgICAgIl9GSUVMRF9ERVNDID0gbmV3IFRGaWVsZChcIiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIiwgIiA8PAotICAgICAgdHlwZV90b19lbnVtKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgIihzaG9ydCkiIDw8ICgqbV9pdGVyKS0+Z2V0X2tleSgpIDw8ICIpOyIgPDwgZW5kbDsKLSAgfQotfQotCi1ib29sIHRfamF2YW1lX2dlbmVyYXRvcjo6aGFzX2JpdF92ZWN0b3IodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLQotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgaWYgKCF0eXBlX2Nhbl9iZV9udWxsKGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSkpIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF9jbGVhcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCBjbGVhcigpIHsiIDw8IGVuZGw7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLQotICBpbmRlbnRfdXAoKTsKLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICBpZiAoKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7Ci0gICAgICBwcmludF9jb25zdF92YWx1ZShvdXQsICJ0aGlzLiIgKyAoKm1faXRlciktPmdldF9uYW1lKCksIHQsICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCksIHRydWUsIHRydWUpOwotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0KSkgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gbnVsbDsiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAvLyBtdXN0IGJlIGEgYmFzZSB0eXBlCi0gICAgICAgIC8vIG1lYW5zIGl0IGFsc28gbmVlZHMgdG8gYmUgZXhwbGljaXRseSB1bnNldAotICAgICAgICBpbmRlbnQob3V0KSA8PCAic2V0IiA8PCBnZXRfY2FwX25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCBnZXRfY2FwX25hbWUoImlzU2V0IikgPDwgIihmYWxzZSk7IiA8PCBlbmRsOwotICAgICAgICBzd2l0Y2ggKCgodF9iYXNlX3R5cGUqKXQpLT5nZXRfYmFzZSgpKSB7Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9IDA7IiA8PCBlbmRsOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gMC4wOyIgPDwgZW5kbDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSBmYWxzZTsiIDw8IGVuZGw7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBkZWZhdWx0OiAgLy8gcHJldmVudCBnY2MgY29tcGlsZXIgd2FybmluZwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLQotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi1USFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKGphdmFtZSwgIkphdmEgTUUiLCAiIikKLQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2pzX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9qc19nZW5lcmF0b3IuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzMzBiZTkuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2pzX2dlbmVyYXRvci5jYworKysgL2Rldi9udWxsCkBAIC0xLDIyMDYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpbmNsdWRlIDxsaXN0PgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgInBsYXRmb3JtLmgiCi0jaW5jbHVkZSAidmVyc2lvbi5oIgotCi11c2luZyBzdGQ6Om1hcDsKLXVzaW5nIHN0ZDo6b2ZzdHJlYW07Ci11c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Ci11c2luZyBzdGQ6OnN0cmluZzsKLXVzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwotdXNpbmcgc3RkOjp2ZWN0b3I7Ci0KLXN0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7ICAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCi0KLSNpbmNsdWRlICJ0X29vcF9nZW5lcmF0b3IuaCIKLQotLyoqCi0gKiBKUyBjb2RlIGdlbmVyYXRvci4KLSAqLwotY2xhc3MgdF9qc19nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKLSBwdWJsaWM6Ci0gIHRfanNfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKLSAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKLSAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykgOgotICAgICB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkgewotICAgICAodm9pZCkgb3B0aW9uX3N0cmluZzsKLQotICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOwotCi0gICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJub2RlIik7Ci0gICAgIGdlbl9ub2RlXyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLQotICAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgianF1ZXJ5Iik7Ci0gICAgIGdlbl9qcXVlcnlfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotCi0gICAgIGlmICghZ2VuX25vZGVfKSB7Ci0gICAgICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoInRzIik7Ci0gICAgICAgZ2VuX3RzXyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLSAgICAgfQotICAgICBlbHNlIHsKLSAgICAgICBnZW5fdHNfID0gZmFsc2U7Ci0gICAgIH0gCi0gICAgCi0gICAgIGlmIChnZW5fbm9kZV8gJiYgZ2VuX2pxdWVyeV8pIHsKLSAgICAgICB0aHJvdyAiSW52YWxpZCBzd2l0Y2g6IFstZ2VuIGpzOm5vZGUsanF1ZXJ5XSBvcHRpb25zIG5vdCBjb21wYXRpYmxlLCB0cnk6IFstZ2VuIGpzOm5vZGUgLWdlbiBqczpqcXVlcnldIjsKLSAgICAgfQotCi0gICAgIGlmIChnZW5fbm9kZV8pIHsKLSAgICAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1ub2RlanMiOwotICAgICB9IGVsc2UgewotICAgICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLWpzIjsKLSAgICAgfQotCi0gICAgIGVzY2FwZV9bJ1wnJ10gPSAiXFwnIjsKLSAgfQotCi0gIC8qKgotICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCi0gICAqLwotCi0gIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKLSAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKLQotICAvKioKLSAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYgICh0X3R5cGVkZWYqICB0dHlwZWRlZik7Ci0gIHZvaWQgZ2VuZXJhdGVfZW51bSAgICAgKHRfZW51bSogICAgIHRlbnVtKTsKLSAgdm9pZCBnZW5lcmF0ZV9jb25zdCAgICAodF9jb25zdCogICAgdGNvbnN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QgICAodF9zdHJ1Y3QqICAgdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24gKHRfc3RydWN0KiAgIHR4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZSAgKHRfc2VydmljZSogIHRzZXJ2aWNlKTsKLQotICBzdGQ6OnN0cmluZyByZW5kZXJfcmVjdl90aHJvdyhzdGQ6OnN0cmluZyB2YXIpOwotICBzdGQ6OnN0cmluZyByZW5kZXJfcmVjdl9yZXR1cm4oc3RkOjpzdHJpbmcgdmFyKTsKLQotICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7Ci0KLQotICAvKioKLSAgICogU3RydWN0cyEKLSAgICovCi0gIHZvaWQgZ2VuZXJhdGVfanNfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfanNfc3RydWN0X2RlZmluaXRpb24oc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc194Y2VwdGlvbj1mYWxzZSwgYm9vbCBpc19leHBvcnRlZD10cnVlKTsKLSAgdm9pZCBnZW5lcmF0ZV9qc19zdHJ1Y3RfcmVhZGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2pzX3N0cnVjdF93cml0ZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfanNfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotCi0gIC8qKgotICAgKiBTZXJ2aWNlLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCi0gICAqLwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyAgICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9yZXN0ICAgICAgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50ICAgICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3NvciAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbiAgKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0KLSAgLyoqCi0gICAqIFNlcmlhbGl6YXRpb24gY29uc3RydWN0cwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkICAgICAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogICAgdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsYXNzPWZhbHNlKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdCAgICAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqICAgdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogICAgIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50ICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqICAgICAgdHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudCAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiAgICAgIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50IChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqICAgICB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQgICAgICAgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqICAgIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0ICAgICAgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiAgIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lciAgICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqICAgICB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiAgICAgIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBraXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHZpdGVyKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudCAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqICAgICAgdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGl0ZXIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudCAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqICAgICB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGl0ZXIpOwotCi0gIC8qKgotICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucwotICAgKi8KLQotICBzdGQ6OnN0cmluZyBqc19pbmNsdWRlcygpOwotICBzdGQ6OnN0cmluZyByZW5kZXJfaW5jbHVkZXMoKTsKLSAgc3RkOjpzdHJpbmcgZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdD1mYWxzZSwgYm9vbCBvYmo9ZmFsc2UpOwotICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXg9IiIsIGJvb2wgaW5jbHVkZV9jYWxsYmFjaz1mYWxzZSk7Ci0gIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaW5jbHVkZV9jYWxsYmFjaz1mYWxzZSk7Ci0gIHN0ZDo6c3RyaW5nIHR5cGVfdG9fZW51bSh0X3R5cGUqIHR0eXBlKTsKLQotICBzdGQ6OnN0cmluZyBhdXRvZ2VuX2NvbW1lbnQoKSB7Ci0gICAgcmV0dXJuCi0gICAgICBzdGQ6OnN0cmluZygiLy9cbiIpICsKLSAgICAgICIvLyBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoIiArIFRIUklGVF9WRVJTSU9OICsgIilcbiIgKwotICAgICAgIi8vXG4iICsKLSAgICAgICIvLyBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HXG4iICsKLSAgICAgICIvL1xuIjsKLSAgfQotCi0gIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBqc19uYW1lc3BhY2VfcGllY2VzKHRfcHJvZ3JhbSogcCkgewotICAgICAgc3RkOjpzdHJpbmcgbnMgPSBwLT5nZXRfbmFtZXNwYWNlKCJqcyIpOwotCi0gICAgICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlICAgbG9jOwotICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHBpZWNlczsKLQotICAgICAgaWYgKG5zLnNpemUoKSA+IDApIHsKLSAgICAgICAgICB3aGlsZSAoKGxvYyA9IG5zLmZpbmQoIi4iKSkgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKLSAgICAgICAgICAgICAgcGllY2VzLnB1c2hfYmFjayhucy5zdWJzdHIoMCwgbG9jKSk7Ci0gICAgICAgICAgICAgIG5zID0gbnMuc3Vic3RyKGxvYysxKTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmIChucy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgcGllY2VzLnB1c2hfYmFjayhucyk7Ci0gICAgICB9Ci0KLSAgICAgIHJldHVybiBwaWVjZXM7Ci0gIH0KLQotICBzdGQ6OnN0cmluZyBqc190eXBlX25hbWVzcGFjZSh0X3Byb2dyYW0qIHApIHsKLSAgICBpZiAoZ2VuX25vZGVfKSB7Ci0gICAgICBpZiAocCAhPSBOVUxMICYmIHAgIT0gcHJvZ3JhbV8pIHsKLSAgICAgICAgcmV0dXJuIHAtPmdldF9uYW1lKCkgKyAiX3R0eXBlcy4iOwotICAgICAgfQotICAgICAgcmV0dXJuICJ0dHlwZXMuIjsKLSAgICB9Ci0gICAgcmV0dXJuIGpzX25hbWVzcGFjZShwKTsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIGpzX2V4cG9ydF9uYW1lc3BhY2UodF9wcm9ncmFtKiBwKSB7Ci0gICAgaWYgKGdlbl9ub2RlXykgewotICAgICAgcmV0dXJuICJleHBvcnRzLiI7Ci0gICAgfQotICAgIHJldHVybiBqc19uYW1lc3BhY2UocCk7Ci0gIH0KLQotICBzdGQ6OnN0cmluZyBqc19uYW1lc3BhY2UodF9wcm9ncmFtKiBwKSB7Ci0gICAgICBzdGQ6OnN0cmluZyBucyA9IHAtPmdldF9uYW1lc3BhY2UoImpzIik7Ci0gICAgICBpZiAobnMuc2l6ZSgpID4gMCkgewotICAgICAgICAgIG5zICs9ICIuIjsKLSAgICAgIH0KLQotCi0gICAgICByZXR1cm4gbnM7Ci0gIH0KLQotICAvKioKLSAgICogVHlwZVNjcmlwdCBEZWZpbml0aW9uIEZpbGUgaGVscGVyIGZ1bmN0aW9ucwotICAgKi8KLQotICBzdHJpbmcgdHNfZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgYm9vbCBpbmNsdWRlX2NhbGxiYWNrKTsKLSAgc3RyaW5nIHRzX2dldF90eXBlKHRfdHlwZSogdHlwZSk7Ci0KLSAgLyoqCi0gICAqIFNwZWNpYWwgaW5kZW50YXRpb24gZm9yIFR5cGVTY3JpcHQgRGVmaW5pdGlvbnMgYmVjYXVzZSBvZiB0aGUgbW9kdWxlLgotICAgKiBSZXR1cm5zIHRoZSBub3JtYWwgaW5kZW50YXRpb24gKyAiICAiIGlmIGEgbW9kdWxlIHdhcyBkZWZpbmVkLgotICAgKiBAcmV0dXJuIHN0cmluZwotICAgKi8KLSAgc3RyaW5nIHRzX2luZGVudCgpIHsKLSAgICByZXR1cm4gaW5kZW50KCkgKyAoIXRzX21vZHVsZV8uZW1wdHkoKSA/ICIgICIgOiAiIik7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyAiZGVjbGFyZSAiIGlmIG5vIG1vZHVsZSB3YXMgZGVmaW5lZC4KLSAgICogQHJldHVybiBzdHJpbmcKLSAgICovCi0gIHN0cmluZyB0c19kZWNsYXJlKCkgewotICAgIHJldHVybiAodHNfbW9kdWxlXy5lbXB0eSgpID8gImRlY2xhcmUgIiA6ICIiKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zICI/IiBpZiB0aGUgZ2l2ZW4gZmllbGQgaXMgb3B0aW9uYWwuCi0gICAqIEBwYXJhbSB0X2ZpZWxkIFRoZSBmaWVsZCB0byBjaGVjawotICAgKiBAcmV0dXJuIHN0cmluZwotICAgKi8KLSAgc3RyaW5nIHRzX2dldF9yZXEodF9maWVsZCogZmllbGQpIHsKLSAgICByZXR1cm4gKGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTCA/ICI/IiA6ICIiKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBkb2N1bWVudGF0aW9uLCBpZiB0aGUgcHJvdmlkZWQgZG9jdW1lbnRhYmxlIG9iamVjdCBoYXMgb25lLgotICAgKiBAcGFyYW0gdF9kb2MgVGhlIG9iamVjdCB0byBnZXQgdGhlIGRvY3VtZW50YXRpb24gZnJvbQotICAgKiBAcmV0dXJuIHN0cmluZyBUaGUgZG9jdW1lbnRhdGlvbgotICAgKi8KLSAgc3RyaW5nIHRzX3ByaW50X2RvYyh0X2RvYyogdGRvYykgewotICAgIHN0cmluZyByZXN1bHQgPSBlbmRsOwotCi0gICAgaWYgKHRkb2MtPmhhc19kb2MoKSkgewotICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gZG9jKHRkb2MtPmdldF9kb2MoKSk7Ci0gICAgICBzdHJpbmcgaXRlbTsKLSAgICAgIAotICAgICAgcmVzdWx0ICs9IHRzX2luZGVudCgpICsgIi8qKiIgKyBlbmRsOwotICAgICAgd2hpbGUgKHN0ZDo6Z2V0bGluZShkb2MsIGl0ZW0pKSB7Ci0gICAgICAgIHJlc3VsdCArPSB0c19pbmRlbnQoKSArICIgKiAiICsgaXRlbSArIGVuZGw7Ci0gICAgICB9Ci0gICAgICByZXN1bHQgKz0gdHNfaW5kZW50KCkgKyAiICovIiArIGVuZGw7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotIHByaXZhdGU6Ci0KLSAgLyoqCi0gICAqIFRydWUgaWYgd2Ugc2hvdWxkIGdlbmVyYXRlIE5vZGVKUy1mcmllbmRseSBSUEMgc2VydmljZXMuCi0gICAqLwotICBib29sIGdlbl9ub2RlXzsKLQotICAvKioKLSAgICogVHJ1ZSBpZiB3ZSBzaG91bGQgZ2VuZXJhdGUgc2VydmljZXMgdGhhdCB1c2UgalF1ZXJ5IGFqYXggKGFzeW5jL3N5bmMpLgotICAgKi8KLSAgYm9vbCBnZW5fanF1ZXJ5XzsKLQotICAvKioKLSAgICogVHJ1ZSBpZiB3ZSBzaG91bGQgZ2VuZXJhdGUgYSBUeXBlU2NyaXB0IERlZmluaXRpb24gRmlsZSBmb3IgZWFjaCBzZXJ2aWNlLgotICAgKi8KLSAgYm9vbCBnZW5fdHNfOwotCi0gIC8qKgotICAgKiBUaGUgbmFtZSBvZiB0aGUgZGVmaW5lZCBtb2R1bGUocyksIGZvciBUeXBlU2NyaXB0IERlZmluaXRpb24gRmlsZXMuCi0gICAqLwotICBzdHJpbmcgdHNfbW9kdWxlXzsKLQotICAvKioKLSAgICogRmlsZSBzdHJlYW1zCi0gICAqLwotICBzdGQ6Om9mc3RyZWFtIGZfdHlwZXNfOwotICBzdGQ6Om9mc3RyZWFtIGZfc2VydmljZV87Ci0gIHN0ZDo6b2ZzdHJlYW0gZl90eXBlc190c187Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9zZXJ2aWNlX3RzXzsKLX07Ci0KLQotLyoqCi0gKiBQcmVwYXJlcyBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAotICogc3RyZWFtcy4KLSAqCi0gKiBAcGFyYW0gdHByb2dyYW0gVGhlIHByb2dyYW0gdG8gZ2VuZXJhdGUKLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQotICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOwotCi0gIHN0cmluZyBvdXRkaXIgPSBnZXRfb3V0X2RpcigpOwotCi0gIC8vIE1ha2Ugb3V0cHV0IGZpbGUocykKLSAgc3RyaW5nIGZfdHlwZXNfbmFtZSA9IG91dGRpcitwcm9ncmFtXy0+Z2V0X25hbWUoKSsiX3R5cGVzLmpzIjsKLSAgZl90eXBlc18ub3BlbihmX3R5cGVzX25hbWUuY19zdHIoKSk7Ci0KLSAgaWYgKGdlbl90c18pIHsKLSAgICBzdHJpbmcgZl90eXBlc190c19uYW1lID0gb3V0ZGlyICsgcHJvZ3JhbV8tPmdldF9uYW1lKCkgKyAiX3R5cGVzLmQudHMiOwotICAgIGZfdHlwZXNfdHNfLm9wZW4oZl90eXBlc190c19uYW1lLmNfc3RyKCkpOwotICB9Ci0KLSAgLy8gUHJpbnQgaGVhZGVyCi0gIGZfdHlwZXNfIDw8Ci0gICAgYXV0b2dlbl9jb21tZW50KCkgPDwKLSAgICBqc19pbmNsdWRlcygpIDw8IGVuZGwgPDwKLSAgICByZW5kZXJfaW5jbHVkZXMoKSA8PCBlbmRsOwotCi0gIGlmIChnZW5fdHNfKSB7Ci0gICAgZl90eXBlc190c18gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbDsKLSAgfQotCi0gIGlmIChnZW5fbm9kZV8pIHsKLSAgICBmX3R5cGVzXyA8PCAidmFyIHR0eXBlcyA9IG1vZHVsZS5leHBvcnRzID0ge307IiA8PCBlbmRsOwotICB9Ci0KLSAgc3RyaW5nIHBuczsKLQotICAvL3NldHVwIHRoZSBuYW1lc3BhY2UKLSAgLy8gVE9ETyBzaG91bGQgdGhlIG5hbWVzcGFjZSBqdXN0IGJlIGluIHRoZSBkaXJlY3Rvcnkgc3RydWN0dXJlIGZvciBub2RlPwotICB2ZWN0b3I8c3RyaW5nPiBuc19waWVjZXMgPSBqc19uYW1lc3BhY2VfcGllY2VzKCBwcm9ncmFtXyApOwotICBpZiggbnNfcGllY2VzLnNpemUoKSA+IDApewotICAgIGZvcihzaXplX3QgaSA9IDA7IGkgPCBuc19waWVjZXMuc2l6ZSgpOyArK2kpIHsKLSAgICAgIHBucyArPSAoKGkgPT0gMCkgPyAiIiA6ICIuIikgKyBuc19waWVjZXNbaV07Ci0gICAgICBmX3R5cGVzXyA8PCAiaWYgKHR5cGVvZiAiIDw8IHBucyA8PCAiID09PSAndW5kZWZpbmVkJykgeyIgPDwgZW5kbDsKLSAgICAgICAgZl90eXBlc18gPDwgIiAgIiA8PCBwbnMgPDwgIiA9IHt9OyIgPDwgZW5kbDsKLSAgICAgICAgZl90eXBlc18gPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICAgIGlmIChnZW5fdHNfKSB7Ci0gICAgICB0c19tb2R1bGVfID0gcG5zOwotICAgICAgZl90eXBlc190c18gPDwgImRlY2xhcmUgbW9kdWxlICIgPDwgdHNfbW9kdWxlXyA8PCAiIHsiOwotICAgIH0KLSAgfQotCi19Ci0KLS8qKgotICogUHJpbnRzIHN0YW5kYXJkIGpzIGltcG9ydHMKLSAqLwotc3RyaW5nIHRfanNfZ2VuZXJhdG9yOjpqc19pbmNsdWRlcygpIHsKLSAgaWYgKGdlbl9ub2RlXykgewotICAgIHJldHVybiBzdHJpbmcoInZhciB0aHJpZnQgPSByZXF1aXJlKCd0aHJpZnQnKTtcbiIKLSAgICAgICJ2YXIgVGhyaWZ0ID0gdGhyaWZ0LlRocmlmdDtcbiIKLSAgICAgICJ2YXIgUSA9IHRocmlmdC5RO1xuIik7Ci0gIH0KLQotICByZXR1cm4gIiI7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhbGwgdGhlIGltcG9ydHMgbmVjZXNzYXJ5IGZvciBpbmNsdWRpbmcgYW5vdGhlciBUaHJpZnQgcHJvZ3JhbQotICovCi1zdHJpbmcgdF9qc19nZW5lcmF0b3I6OnJlbmRlcl9pbmNsdWRlcygpIHsKLSAgc3RyaW5nIHJlc3VsdCA9ICIiOwotCi0gIGlmIChnZW5fbm9kZV8pIHsKLSAgICBjb25zdCB2ZWN0b3I8dF9wcm9ncmFtKj4mIGluY2x1ZGVzID0gcHJvZ3JhbV8tPmdldF9pbmNsdWRlcygpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5jbHVkZXMuc2l6ZSgpOyArK2kpIHsKLSAgICAgIHJlc3VsdCArPSAidmFyICIgKyBpbmNsdWRlc1tpXS0+Z2V0X25hbWUoKSArICJfdHR5cGVzID0gcmVxdWlyZSgnLi8iICsgaW5jbHVkZXNbaV0tPmdldF9uYW1lKCkgKyAiX3R5cGVzJylcbiI7Ci0gICAgfQotICAgIGlmIChpbmNsdWRlcy5zaXplKCkgPiAwKSB7Ci0gICAgICByZXN1bHQgKz0gIlxuIjsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioKLSAqIENsb3NlIHVwIChvciBkb3duKSBzb21lIGZpbGV6LgotICovCi12b2lkIHRfanNfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7Ci0gIC8vIENsb3NlIHR5cGVzIGZpbGUocykKLQotICBmX3R5cGVzXy5jbG9zZSgpOwotCi0gIGlmIChnZW5fdHNfKSB7Ci0gICAgaWYgKCF0c19tb2R1bGVfLmVtcHR5KCkpIHsKLSAgICAgIGZfdHlwZXNfdHNfIDw8ICJ9IjsKLSAgICB9Ci0gICAgZl90eXBlc190c18uY2xvc2UoKTsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIFRoaXMgaXMgbm90IGRvbmUgaW4gSlMsIHR5cGVzIGFyZSBhbGwgaW1wbGljaXQuCi0gKgotICogQHBhcmFtIHR0eXBlZGVmIFRoZSB0eXBlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7Ci0gICh2b2lkKSB0dHlwZWRlZjsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgY29kZSBmb3IgYW4gZW51bWVyYXRlZCB0eXBlLiBTaW5jZSBkZWZpbmUgaXMgZXhwZW5zaXZlIHRvIGxvb2t1cAotICogaW4gSlMsIHdlIHVzZSBhIGdsb2JhbCBhcnJheSBmb3IgdGhpcy4KLSAqCi0gKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCi0gKi8KLXZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgewotICBmX3R5cGVzXyA8PCBqc190eXBlX25hbWVzcGFjZSh0ZW51bS0+Z2V0X3Byb2dyYW0oKSk8PHRlbnVtLT5nZXRfbmFtZSgpPDwiID0geyI8PGVuZGw7Ci0KLSAgaWYgKGdlbl90c18pIHsKLSAgICBmX3R5cGVzX3RzXyA8PAotICAgICAgdHNfcHJpbnRfZG9jKHRlbnVtKSA8PAotICAgICAgdHNfaW5kZW50KCkgPDwgdHNfZGVjbGFyZSgpIDw8ICJlbnVtICIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIiB7IiA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50X3VwKCk7Ci0KLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7Ci0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOwotICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgewotICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0gICAgaWYgKGdlbl90c18pIHsKLSAgICAgIGZfdHlwZXNfdHNfIDw8IHRzX2luZGVudCgpIDw8ICInIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIicgPSAiIDw8IHZhbHVlIDw8ICIsIiA8PCBlbmRsOwotICAgICAgLy9hZGQgJ3ZhbHVlOiBrZXknIGluIGFkZGl0aW9uIHRvICdrZXk6IHZhbHVlJyBmb3IgVHlwZVNjcmlwdCBlbnVtcwotICAgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiciIDw8IHZhbHVlIDw8ICInIDogJyIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInLCIgPDwgZW5kbDsKLSAgICB9Ci0gICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiciIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJyA6ICIgPDwgdmFsdWU7Ci0gICAgaWYgKGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCktMSkgewotICAgICAgICBmX3R5cGVzXyA8PCAiLCI7Ci0gICAgfQotICAgIGZfdHlwZXNfIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotCi0gIGZfdHlwZXNfIDw8ICJ9OyI8PGVuZGw7Ci0KLSAgaWYgKGdlbl90c18pIHsKLSAgICBmX3R5cGVzX3RzXyA8PCB0c19pbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlIGEgY29uc3RhbnQgdmFsdWUKLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KSB7Ci0gIHRfdHlwZSogdHlwZSA9IHRjb25zdC0+Z2V0X3R5cGUoKTsKLSAgc3RyaW5nIG5hbWUgPSB0Y29uc3QtPmdldF9uYW1lKCk7Ci0gIHRfY29uc3RfdmFsdWUqIHZhbHVlID0gdGNvbnN0LT5nZXRfdmFsdWUoKTsKLQotICBmX3R5cGVzXyA8PCBqc190eXBlX25hbWVzcGFjZShwcm9ncmFtXykgIDw8IG5hbWUgPDwgIiA9ICI7Ci0gIGZfdHlwZXNfIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0eXBlLCB2YWx1ZSkgPDwgIjsiIDw8IGVuZGw7Ci0KLSAgaWYgKGdlbl90c18pIHsKLSAgICBmX3R5cGVzX3RzXyA8PAotICAgICAgdHNfcHJpbnRfZG9jKHRjb25zdCkgPDwKLSAgICAgIHRzX2luZGVudCgpIDw8IHRzX2RlY2xhcmUoKSA8PCAidmFyICIgPDwgbmFtZSA8PCAiOiAiIDw8IHRzX2dldF90eXBlKHR5cGUpIDw8ICI7IiA8PCBlbmRsOwotICB9Ci19Ci0KLS8qKgotICogUHJpbnRzIHRoZSB2YWx1ZSBvZiBhIGNvbnN0YW50IHdpdGggdGhlIGdpdmVuIHR5cGUuIE5vdGUgdGhhdCB0eXBlIGNoZWNraW5nCi0gKiBpcyBOT1QgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24gYXMgaXQgaXMgYWx3YXlzIHJ1biBiZWZvcmVoYW5kIHVzaW5nIHRoZQotICogdmFsaWRhdGVfdHlwZXMgbWV0aG9kIGluIG1haW4uY2MKLSAqLwotc3RyaW5nIHRfanNfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgewotICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OwotCi0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICBvdXQgPDwgIiciIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgIiciOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgb3V0IDw8ICh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDAgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKLSAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgb3V0IDw8ICJuZXcgIiA8PCBqc190eXBlX25hbWVzcGFjZSh0eXBlLT5nZXRfcHJvZ3JhbSgpKSA8PCB0eXBlLT5nZXRfbmFtZSgpIDw8ICIoeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKLSAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7Ci0gICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgewotICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOwotICAgICAgfQotICAgICAgaWYgKHZfaXRlciAhPSB2YWwuYmVnaW4oKSkKLSAgICAgICAgb3V0IDw8ICIsIjsKLSAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZ190eXBlX3N0cmluZywgdl9pdGVyLT5maXJzdCk7Ci0gICAgICBvdXQgPDwgIiA6ICI7Ci0gICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKLSAgICB9Ci0KLSAgICBvdXQgPDwgIn0pIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7Ci0KLSAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOwotICAgIG91dCA8PCAieyI7Ci0KLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICAgIGlmICh2X2l0ZXIgIT0gdmFsLmJlZ2luKCkpCi0gICAgICAgICAgb3V0IDw8ICIsIiA8PCBlbmRsOwotCi0gICAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoa3R5cGUsIHZfaXRlci0+Zmlyc3QpOwotCi0gICAgICAgIG91dCA8PCAiIDogIjsKLSAgICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZSh2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotICAgIH0KLQotICAgIG91dCA8PCBlbmRsIDw8ICJ9IjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKLSAgICB0X3R5cGUqIGV0eXBlOwotICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB9Ci0gICAgb3V0IDw8ICJbIjsKLSAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKLSAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIGlmICh2X2l0ZXIgIT0gdmFsLmJlZ2luKCkpCi0gICAgICAgIG91dCA8PCAiLCI7Ci0gICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGV0eXBlLCAqdl9pdGVyKTsKLSAgICB9Ci0gICAgb3V0IDw8ICJdIjsKLSAgfQotICByZXR1cm4gb3V0LnN0cigpOwotfQotCi0vKioKLSAqIE1ha2UgYSBzdHJ1Y3QKLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGdlbmVyYXRlX2pzX3N0cnVjdCh0c3RydWN0LCBmYWxzZSk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGV4Y2VwdGlvbi4gQmFzaWNhbGx5IHRoZSBzYW1lCi0gKiBhcyBhIHN0cnVjdCBidXQgZXh0ZW5kcyB0aGUgRXhjZXB0aW9uIGNsYXNzLgotICoKLSAqIEBwYXJhbSB0eGNlcHRpb24gVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKLSAgZ2VuZXJhdGVfanNfc3RydWN0KHR4Y2VwdGlvbiwgdHJ1ZSk7Ci19Ci0KLS8qKgotICogU3RydWN0cyBjYW4gYmUgbm9ybWFsIG9yIGV4Y2VwdGlvbnMuCi0gKi8KLXZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX2pzX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pIHsKLSAgZ2VuZXJhdGVfanNfc3RydWN0X2RlZmluaXRpb24oZl90eXBlc18sIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGRhdGEgdHlwZS4gVGhpcyBpcyBub3RoaW5nIGluIEpTCi0gKiB3aGVyZSB0aGUgb2JqZWN0cyBhcmUgYWxsIGp1c3QgYXNzb2NpYXRpdmUgYXJyYXlzICh1bmxlc3Mgb2YgY291cnNlIHdlCi0gKiBkZWNpZGUgdG8gc3RhcnQgdXNpbmcgb2JqZWN0cyBmb3IgdGhlbS4uLikKLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfanNfc3RydWN0X2RlZmluaXRpb24ob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4cG9ydGVkKSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0KLSAgaWYgKGdlbl9ub2RlXykgewotICAgIGlmIChpc19leHBvcnRlZCkgewotICAgICAgb3V0IDw8IGpzX25hbWVzcGFjZSh0c3RydWN0LT5nZXRfcHJvZ3JhbSgpKSA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8Ci0gICAgICAgICJtb2R1bGUuZXhwb3J0cy4iIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiA9IGZ1bmN0aW9uKGFyZ3MpIHsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dCA8PCBqc19uYW1lc3BhY2UodHN0cnVjdC0+Z2V0X3Byb2dyYW0oKSkgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiID0gZnVuY3Rpb24oYXJncykgeyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgb3V0IDw8IGpzX25hbWVzcGFjZSh0c3RydWN0LT5nZXRfcHJvZ3JhbSgpKSA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8IiA9IGZ1bmN0aW9uKGFyZ3MpIHsiIDw8IGVuZGw7Ci0gICAgaWYgKGdlbl90c18pIHsKLSAgICAgIGZfdHlwZXNfdHNfIDw8Ci0gICAgICAgIHRzX3ByaW50X2RvYyh0c3RydWN0KSA8PAotICAgICAgICB0c19pbmRlbnQoKSA8PCB0c19kZWNsYXJlKCkgPDwgImNsYXNzICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAoaXNfZXhjZXB0aW9uID8gIiBleHRlbmRzIFRocmlmdC5URXhjZXB0aW9uIiA6ICIiICkgPDwgIiB7IiA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIGluZGVudF91cCgpOwotCi0gIGlmIChnZW5fbm9kZV8gJiYgaXNfZXhjZXB0aW9uKSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIlRocmlmdC5URXhjZXB0aW9uLmNhbGwodGhpcywgXCIiIDw8Ci0gICAgICAgICAganNfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIlwiKSIgPDwgZW5kbDsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGhpcy5uYW1lID0gXCIiIDw8Ci0gICAgICAgICAganNfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIlwiIiA8PCBlbmRsOwotICB9Ci0KLSAgLy9tZW1iZXJzIHdpdGggYXJndW1lbnRzCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBzdHJpbmcgZHZhbCA9IGRlY2xhcmVfZmllbGQoKm1faXRlcixmYWxzZSx0cnVlKTsKLSAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCAmJiAhKHQtPmlzX3N0cnVjdCgpIHx8IHQtPmlzX3hjZXB0aW9uKCkpKSB7Ci0gICAgICAgIGR2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpLCAoKm1faXRlciktPmdldF92YWx1ZSgpKTsKLSAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0aGlzLiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8IGR2YWwgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICBkdmFsIDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLSAgICBpZiAoZ2VuX3RzXykgewotICAgICAgZl90eXBlc190c18gPDwgdHNfaW5kZW50KCkgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI6ICIgPDwgdHNfZ2V0X3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSBjb25zdHJ1Y3RvciBmcm9tIGFycmF5Ci0gIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKLQotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICAgIGlmICgoKm1faXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwgJiYgKHQtPmlzX3N0cnVjdCgpIHx8IHQtPmlzX3hjZXB0aW9uKCkpKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0LCAoKm1faXRlciktPmdldF92YWx1ZSgpKSAgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gRWFybHkgcmV0dXJucyBmb3IgZXhjZXB0aW9ucwotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgICAgaWYgKHQtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICAiaWYgKGFyZ3MgaW5zdGFuY2VvZiAiIDw8IGpzX3R5cGVfbmFtZXNwYWNlKHQtPmdldF9wcm9ncmFtKCkpIDw8IHQtPmdldF9uYW1lKCkgPDwgIikgeyIgPDwgZW5kbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudCgpIDw8ICJ0aGlzLiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSBhcmdzOyIgPDwgZW5kbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudCgpIDw8ICJyZXR1cm47IiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICAgfQotICAgIH0KLQotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAgImlmIChhcmdzKSB7IiA8PCBlbmRsOwotICAgIGlmIChnZW5fdHNfKSB7Ci0gICAgICBmX3R5cGVzX3RzXyA8PCBlbmRsIDw8IHRzX2luZGVudCgpIDw8ICJjb25zdHJ1Y3RvcihhcmdzPzogeyAiOwotICAgIH0KLQotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8IGluZGVudCgpIDw8ICJpZiAoYXJncy4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9PSB1bmRlZmluZWQpIHsiIDw8IGVuZGwKLSAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudCgpIDw8IGluZGVudCgpIDw8ICJ0aGlzLiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSBhcmdzLiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpICA8PCAiOyIgPDwgZW5kbDsKLSAgICAgICAgaWYgKCEoKm1faXRlciktPmdldF9yZXEoKSkgewotICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50KCkgPDwgaW5kZW50KCkgPDwgInRocm93IG5ldyBUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uKFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb25UeXBlLlVOS05PV04sICdSZXF1aXJlZCBmaWVsZCAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGlzIHVuc2V0IScpOyIgPDwgZW5kbDsKLSAgICAgICAgfQotICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICAgIGlmIChnZW5fdHNfKSB7Ci0gICAgICAgICAgZl90eXBlc190c18gPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8IHRzX2dldF9yZXEoKm1faXRlcikgPDwgIjogIiA8PCB0c19nZXRfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpIDw8ICI7ICI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgICJ9IiA8PCBlbmRsOwotICAgIGlmIChnZW5fdHNfKSB7Ci0gICAgICBmX3R5cGVzX3RzXyA8PCAifSk7IiA8PCBlbmRsOwotICAgIH0KLQotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgb3V0IDw8ICJ9OyIgPDwgZW5kbDsKLSAgaWYgKGdlbl90c18pIHsKLSAgICBmX3R5cGVzX3RzXyA8PCB0c19pbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgfQotCi0gIGlmIChpc19leGNlcHRpb24pIHsKLSAgICBvdXQgPDwgIlRocmlmdC5pbmhlcml0cygiIDw8Ci0gICAgICAgIGpzX25hbWVzcGFjZSh0c3RydWN0LT5nZXRfcHJvZ3JhbSgpKSA8PAotICAgICAgICB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIsIFRocmlmdC5URXhjZXB0aW9uKTsiIDw8IGVuZGw7Ci0Jb3V0IDw8IGpzX25hbWVzcGFjZSh0c3RydWN0LT5nZXRfcHJvZ3JhbSgpKTw8dHN0cnVjdC0+Z2V0X25hbWUoKSA8PCIucHJvdG90eXBlLm5hbWUgPSAnIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICInOyIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICAvL2luaXQgcHJvdG90eXBlCi0gICAgb3V0IDw8IGpzX25hbWVzcGFjZSh0c3RydWN0LT5nZXRfcHJvZ3JhbSgpKTw8dHN0cnVjdC0+Z2V0X25hbWUoKSA8PCIucHJvdG90eXBlID0ge307IiA8PCBlbmRsOwotICB9Ci0KLQotICBnZW5lcmF0ZV9qc19zdHJ1Y3RfcmVhZGVyKG91dCwgdHN0cnVjdCk7Ci0gIGdlbmVyYXRlX2pzX3N0cnVjdF93cml0ZXIob3V0LCB0c3RydWN0KTsKLQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyB0aGUgcmVhZCgpIG1ldGhvZCBmb3IgYSBzdHJ1Y3QKLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfanNfc3RydWN0X3JlYWRlcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIG91dCA8PCAganNfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpPDx0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIucHJvdG90eXBlLnJlYWQgPSBmdW5jdGlvbihpbnB1dCkgeyI8PGVuZGw7Ci0KLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgImlucHV0LnJlYWRTdHJ1Y3RCZWdpbigpOyIgPDwgZW5kbDsKLQotCi0gIC8vIExvb3Agb3ZlciByZWFkaW5nIGluIGZpZWxkcwotICBpbmRlbnQob3V0KSA8PCAid2hpbGUgKHRydWUpIiA8PCBlbmRsOwotCi0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgInZhciByZXQgPSBpbnB1dC5yZWFkRmllbGRCZWdpbigpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInZhciBmbmFtZSA9IHJldC5mbmFtZTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ2YXIgZnR5cGUgPSByZXQuZnR5cGU7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAidmFyIGZpZCA9IHJldC5maWQ7IiAgIDw8IGVuZGw7Ci0KLQotICAvLyBDaGVjayBmb3IgZmllbGQgU1RPUCBtYXJrZXIgYW5kIGJyZWFrCi0gIGluZGVudChvdXQpIDw8ICJpZiAoZnR5cGUgPT0gVGhyaWZ0LlR5cGUuU1RPUCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJicmVhazsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICBpZiAoIWZpZWxkcy5lbXB0eSgpKSB7Ci0gICAgLy8gU3dpdGNoIHN0YXRlbWVudCBvbiB0aGUgZmllbGQgd2UgYXJlIHJlYWRpbmcKLSAgICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChmaWQpIiA8PCBlbmRsOwotCi0gICAgc2NvcGVfdXAob3V0KTsKLQotICAgIC8vIEdlbmVyYXRlIGRlc2VyaWFsaXphdGlvbiBjb2RlIGZvciBrbm93biBjYXNlcwotICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0KLSAgICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjoiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKGZ0eXBlID09ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIikgeyIgPDwgZW5kbDsKLQotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJ0aGlzLiIpOwotICAgICAgaW5kZW50X2Rvd24oKTsKLQotICAgICAgaW5kZW50KG91dCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOwotCi0gICAgICBpbmRlbnQob3V0KSA8PCAgIiAgaW5wdXQuc2tpcChmdHlwZSk7IiA8PCBlbmRsOwotCi0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKLQotICAgIH0KLSAgICBpZiAoZmllbGRzLnNpemUoKSA9PSAxKSB7Ci0gICAgICAvLyBwc2V1ZG8gY2FzZSB0byBtYWtlIGpzbGludCBoYXBweQotICAgICAgaW5kZW50KG91dCkgPDwgICJjYXNlIDA6IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgICIgIGlucHV0LnNraXAoZnR5cGUpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICAiICBicmVhazsiIDw8IGVuZGw7Ci0gICAgfQotICAgIC8vIEluIHRoZSBkZWZhdWx0IGNhc2Ugd2Ugc2tpcCB0aGUgZmllbGQKLSAgICBpbmRlbnQob3V0KSA8PCAgImRlZmF1bHQ6IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICAiICBpbnB1dC5za2lwKGZ0eXBlKTsiIDw8IGVuZGw7Ci0KLSAgICBzY29wZV9kb3duKG91dCk7Ci0gIH0gZWxzZSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImlucHV0LnNraXAoZnR5cGUpOyIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudChvdXQpIDw8ICJpbnB1dC5yZWFkRmllbGRFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotCi0gIGluZGVudChvdXQpIDw8ICJpbnB1dC5yZWFkU3RydWN0RW5kKCk7IiA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJyZXR1cm47IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAifTsiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgdGhlIHdyaXRlKCkgbWV0aG9kIGZvciBhIHN0cnVjdAotICovCi12b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qc19zdHJ1Y3Rfd3JpdGVyKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgewotICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBvdXQgPDwganNfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKG91dHB1dCkgeyI8PGVuZGw7Ci0KLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgIm91dHB1dC53cml0ZVN0cnVjdEJlZ2luKCciIDw8IG5hbWUgPDwgIicpOyIgPDwgZW5kbDsKLQotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKHRoaXMuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgICIgIT09IG51bGwgJiYgdGhpcy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9PSB1bmRlZmluZWQpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm91dHB1dC53cml0ZUZpZWxkQmVnaW4oIiA8PAotICAgICAgIiciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJywgIiA8PAotICAgICAgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIik7IiA8PCBlbmRsOwotCi0KLSAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJ0aGlzLiIpOwotCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgIm91dHB1dC53cml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOwotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgfQotCi0KLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgIm91dHB1dC53cml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJvdXRwdXQud3JpdGVTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgb3V0IDw8aW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgIn07IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0aHJpZnQgc2VydmljZS4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgotICovCi12b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgICBzdHJpbmcgZl9zZXJ2aWNlX25hbWUgPSBnZXRfb3V0X2RpcigpK3NlcnZpY2VfbmFtZV8rIi5qcyI7Ci0gICAgZl9zZXJ2aWNlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOwotCi0gICAgaWYgKGdlbl90c18pIHsKLSAgICAgIHN0cmluZyBmX3NlcnZpY2VfdHNfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBzZXJ2aWNlX25hbWVfICsgIi5kLnRzIjsKLSAgICAgIGZfc2VydmljZV90c18ub3BlbihmX3NlcnZpY2VfdHNfbmFtZS5jX3N0cigpKTsKLSAgICB9Ci0KLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBhdXRvZ2VuX2NvbW1lbnQoKSA8PAotICAgICAganNfaW5jbHVkZXMoKSA8PCBlbmRsIDw8Ci0gICAgICByZW5kZXJfaW5jbHVkZXMoKSA8PCBlbmRsOwotCi0gICAgaWYgKGdlbl90c18pIHsKLSAgICAgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgICAgIGZfc2VydmljZV90c18gPDwgIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIiIDw8IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpIDw8ICIuZC50c1wiIC8+IiA8PCBlbmRsOwotICAgICAgfQotICAgICAgZl9zZXJ2aWNlX3RzXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsOwotICAgICAgaWYgKCF0c19tb2R1bGVfLmVtcHR5KCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlX3RzXyA8PCAiZGVjbGFyZSBtb2R1bGUgIiA8PCB0c19tb2R1bGVfIDw8ICIgeyI7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGdlbl9ub2RlXykgewotICAgICAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgICJ2YXIgIiA8PCB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSA8PAotICAgICAgICAgICIgPSByZXF1aXJlKCcuLyIgPDwgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkgPDwgIicpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgInZhciAiIDw8IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpIDw8ICJDbGllbnQgPSAiIDw8Ci0gICAgICAgICAgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkgPDwgIi5DbGllbnQiIDw8IGVuZGwgPDwKLSAgICAgICAgICAidmFyICIgPDwgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkgPDwgIlByb2Nlc3NvciA9ICIgPDwKLSAgICAgICAgICB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSA8PCAiLlByb2Nlc3NvciIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAidmFyIHR0eXBlcyA9IHJlcXVpcmUoJy4vIiArIHByb2dyYW1fLT5nZXRfbmFtZSgpICsgIl90eXBlcycpOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOwotICAgIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlKTsKLSAgICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0c2VydmljZSk7Ci0KLSAgICBpZiAoZ2VuX25vZGVfKSB7Ci0gICAgICBnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3Nvcih0c2VydmljZSk7Ci0gICAgfQotCi0gICAgZl9zZXJ2aWNlXy5jbG9zZSgpOwotICAgIGlmIChnZW5fdHNfKSB7Ci0gICAgICBpZiAoIXRzX21vZHVsZV8uZW1wdHkoKSkgewotICAgICAgICBmX3NlcnZpY2VfdHNfIDw8ICJ9IjsKLSAgICAgIH0KLSAgICAgIGZfc2VydmljZV90c18uY2xvc2UoKTsKLSAgICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgotICovCi12b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3Nvcih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gICAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLQotICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJQcm9jZXNzb3IgPSAiIDw8Ci0gICAgICAgICJleHBvcnRzLlByb2Nlc3NvciA9IGZ1bmN0aW9uKGhhbmRsZXIpICI7Ci0KLSAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKLQotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRoaXMuX2hhbmRsZXIgPSBoYW5kbGVyIiA8PCBlbmRsOwotCi0gICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLQotICAgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiVGhyaWZ0LmluaGVyaXRzKCIgPDwKLSAgICAgICAgICAgIGpzX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgPDwKLSAgICAgICAgICAgIHNlcnZpY2VfbmFtZV8gPDwgIlByb2Nlc3NvciwgIiA8PAotICAgICAgICAgICAgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkgPDwgIlByb2Nlc3NvcikiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgLy8gR2VuZXJhdGUgdGhlIHNlcnZlciBpbXBsZW1lbnRhdGlvbgotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgICBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpIDw8IHNlcnZpY2VfbmFtZV8gPDwgIlByb2Nlc3Nvci5wcm90b3R5cGUucHJvY2VzcyA9IGZ1bmN0aW9uKGlucHV0LCBvdXRwdXQpICI7Ci0KLSAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKLQotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInZhciByID0gaW5wdXQucmVhZE1lc3NhZ2VCZWdpbigpOyIgPDwgZW5kbAotICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmICh0aGlzWydwcm9jZXNzXycgKyByLmZuYW1lXSkgeyIgPDwgZW5kbAotICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRoaXNbJ3Byb2Nlc3NfJyArIHIuZm5hbWVdLmNhbGwodGhpcywgci5yc2VxaWQsIGlucHV0LCBvdXRwdXQpOyIgPDwgZW5kbAotICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsCi0gICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICBpbnB1dC5za2lwKFRocmlmdC5UeXBlLlNUUlVDVCk7IiA8PCBlbmRsCi0gICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICBpbnB1dC5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbAotICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgdmFyIHggPSBuZXcgVGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUaHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uVHlwZS5VTktOT1dOX01FVEhPRCwgJ1Vua25vd24gZnVuY3Rpb24gJyArIHIuZm5hbWUpOyIgPDwgZW5kbAotICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgb3V0cHV0LndyaXRlTWVzc2FnZUJlZ2luKHIuZm5hbWUsIFRocmlmdC5NZXNzYWdlVHlwZS5FWENFUFRJT04sIHIucnNlcWlkKTsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIHgud3JpdGUob3V0cHV0KTsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIG91dHB1dC53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIG91dHB1dC5mbHVzaCgpOyIgPDwgZW5kbAotICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAgIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzIHN1YmZ1bmN0aW9ucwotICAgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICAgIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odHNlcnZpY2UsICpmX2l0ZXIpOwotICAgIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBwcm9jZXNzIGZ1bmN0aW9uIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24gdG8gd3JpdGUgYSBkaXNwYXRjaGVyIGZvcgotICovCi12b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAgIGpzX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgPDwgc2VydmljZV9uYW1lXyA8PCAiUHJvY2Vzc29yLnByb3RvdHlwZS5wcm9jZXNzXyIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiID0gZnVuY3Rpb24oc2VxaWQsIGlucHV0LCBvdXRwdXQpICI7Ci0KLSAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKLQotICAgIHN0cmluZyBhcmdzbmFtZSA9ICBqc19uYW1lc3BhY2UocHJvZ3JhbV8pKyBzZXJ2aWNlX25hbWVfICsgIl8iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKLSAgICBzdHJpbmcgcmVzdWx0bmFtZSA9ICBqc19uYW1lc3BhY2UocHJvZ3JhbV8pKyBzZXJ2aWNlX25hbWVfICsgIl8iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOwotCi0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAidmFyIGFyZ3MgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiKCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJhcmdzLnJlYWQoaW5wdXQpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaW5wdXQucmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgICAvLyBHZW5lcmF0ZSB0aGUgZnVuY3Rpb24gY2FsbAotICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOwotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgICAvLyBTaG9ydGN1dCBvdXQgaGVyZSBmb3Igb25ld2F5IGZ1bmN0aW9ucwotICAgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInRoaXMuX2hhbmRsZXIuIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiOwotCi0gICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICAgIGlmIChmaXJzdCkgewotICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOwotICAgICAgICB9Ci0gICAgICAgIGZfc2VydmljZV8gPDwgImFyZ3MuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgICB9Ci0KLSAgICAgIGZfc2VydmljZV8gPDwgIikiIDw8IGVuZGw7Ci0gICAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICAgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlmICh0aGlzLl9oYW5kbGVyLiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIubGVuZ3RoID09PSAiIDw8IGZpZWxkcy5zaXplKCkgPDwiKSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiUS5mY2FsbCh0aGlzLl9oYW5kbGVyLiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpOwotCi0gICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgIGZfc2VydmljZV8gPDwgIiwgYXJncy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICB9Ci0KLSAgICBmX3NlcnZpY2VfIDw8ICIpIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInZhciByZXN1bHQgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIoe3N1Y2Nlc3M6IHJlc3VsdH0pOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAib3V0cHV0LndyaXRlTWVzc2FnZUJlZ2luKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwKLSAgICAgICAgIlwiLCBUaHJpZnQuTWVzc2FnZVR5cGUuUkVQTFksIHNlcWlkKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInJlc3VsdC53cml0ZShvdXRwdXQpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAib3V0cHV0LndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAib3V0cHV0LmZsdXNoKCk7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9LCBmdW5jdGlvbiAoZXJyKSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInZhciByZXN1bHQgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIoZXJyKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIm91dHB1dC53cml0ZU1lc3NhZ2VCZWdpbihcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8Ci0gICAgICAgICJcIiwgVGhyaWZ0Lk1lc3NhZ2VUeXBlLlJFUExZLCBzZXFpZCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJyZXN1bHQud3JpdGUob3V0cHV0KTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIm91dHB1dC53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIm91dHB1dC5mbHVzaCgpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSk7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidGhpcy5faGFuZGxlci4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCI7Ci0KLSAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgZl9zZXJ2aWNlXyA8PCAiYXJncy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiLCAiOwotICAgIH0KLQotICAgIGZfc2VydmljZV8gPDwgIiBmdW5jdGlvbiAoZXJyLCByZXN1bHQpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ2YXIgcmVzdWx0ID0gbmV3ICIgPDwgcmVzdWx0bmFtZSA8PCAiKChlcnIgIT0gbnVsbCA/IGVyciA6IHtzdWNjZXNzOiByZXN1bHR9KSk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJvdXRwdXQud3JpdGVNZXNzYWdlQmVnaW4oXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PAotICAgICAgICAiXCIsIFRocmlmdC5NZXNzYWdlVHlwZS5SRVBMWSwgc2VxaWQpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAicmVzdWx0LndyaXRlKG91dHB1dCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJvdXRwdXQud3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJvdXRwdXQuZmx1c2goKTsiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSk7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOwotICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBoZWxwZXIgZnVuY3Rpb25zIGZvciBhIHNlcnZpY2UuCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCi0gKi8KLXZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0JICAvL0RvIG5vdCBnZW5lcmF0ZSBUUyBkZWZpbml0aW9ucyBmb3IgaGVscGVyIGZ1bmN0aW9ucwotCSAgYm9vbCBnZW5fdHNfdG1wID0gZ2VuX3RzXzsKLQkgIGdlbl90c18gPSBmYWxzZTsKLQotICAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0KLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICIvL0hFTFBFUiBGVU5DVElPTlMgQU5EIFNUUlVDVFVSRVMiIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLSAgICAgICAgc3RyaW5nIG5hbWUgPSB0cy0+Z2V0X25hbWUoKTsKLSAgICAgICAgdHMtPnNldF9uYW1lKHNlcnZpY2VfbmFtZV8gKyAiXyIgKyBuYW1lKTsKLSAgICAgICAgZ2VuZXJhdGVfanNfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgdHMsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgIGdlbmVyYXRlX2pzX2Z1bmN0aW9uX2hlbHBlcnMoKmZfaXRlcik7Ci0gICAgICAgIHRzLT5zZXRfbmFtZShuYW1lKTsKLSAgICB9Ci0KLQkgIGdlbl90c18gPSBnZW5fdHNfdG1wOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBhbmQgaGVscGVycyBmb3IgYSBmdW5jdGlvbi4KLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbgotICovCi12b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qc19mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICAgIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgc2VydmljZV9uYW1lXyArICJfIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7Ci0gICAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKLSAgICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOwotICAgIH0KLQotICAgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgICByZXN1bHQuYXBwZW5kKCpmX2l0ZXIpOwotICAgIH0KLQotICAgIGdlbmVyYXRlX2pzX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sICZyZXN1bHQsIGZhbHNlLCBmYWxzZSk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBpbnRlcmZhY2UgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICAodm9pZCkgdHNlcnZpY2U7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgUkVTVCBpbnRlcmZhY2UKLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9yZXN0KHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgKHZvaWQpIHRzZXJ2aWNlOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBpZiAoZ2VuX25vZGVfKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudCA9ICIgPDwKLSAgICAgICAgImV4cG9ydHMuQ2xpZW50ID0gZnVuY3Rpb24ob3V0cHV0LCBwQ2xhc3MpIHsiPDxlbmRsOwotICB9IGVsc2UgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJDbGllbnQgPSBmdW5jdGlvbihpbnB1dCwgb3V0cHV0KSB7Ijw8ZW5kbDsKLSAgICBpZiAoZ2VuX3RzXykgewotICAgICAgZl9zZXJ2aWNlX3RzXyA8PAotICAgICAgICB0c19wcmludF9kb2ModHNlcnZpY2UpIDw8Ci0gICAgICAgIHRzX2luZGVudCgpIDw8IHRzX2RlY2xhcmUoKSA8PCAiY2xhc3MgIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJDbGllbnQgIjsKLSAgICAgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgICAgIGZfc2VydmljZV90c18gPDwgImV4dGVuZHMgIiA8PCB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSA8PCAiQ2xpZW50ICI7Ci0gICAgICB9Ci0gICAgICBmX3NlcnZpY2VfdHNfIDw8ICJ7IiA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIGluZGVudF91cCgpOwotCi0KLSAgaWYgKGdlbl9ub2RlXykgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHRoaXMub3V0cHV0ID0gb3V0cHV0OyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgdGhpcy5wQ2xhc3MgPSBwQ2xhc3M7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICB0aGlzLl9zZXFpZCA9IDA7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICB0aGlzLl9yZXFzID0ge307IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHRoaXMuaW5wdXQgPSBpbnB1dDsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHRoaXMub3V0cHV0ID0gKCFvdXRwdXQpID8gaW5wdXQgOiBvdXRwdXQ7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICB0aGlzLnNlcWlkID0gMDsiIDw8IGVuZGw7Ci0gICAgaWYgKGdlbl90c18pIHsKLSAgICAgICBmX3NlcnZpY2VfdHNfIDw8Ci0gICAgICAgICB0c19pbmRlbnQoKSA8PCAiaW5wdXQ6IFRocmlmdC5USlNPTlByb3RvY29sOyIgPDwgZW5kbCA8PAotICAgICAgICAgdHNfaW5kZW50KCkgPDwgIm91dHB1dDogVGhyaWZ0LlRKU09OUHJvdG9jb2w7IiA8PCBlbmRsIDw8Ci0gICAgICAgICB0c19pbmRlbnQoKSA8PCAic2VxaWQ6IG51bWJlcjsiIDw8IGVuZGwgPDwKLSAgICAgICAgIGVuZGwgPDwKLSAgICAgICAgIHRzX2luZGVudCgpIDw8ICJjb25zdHJ1Y3RvcihpbnB1dDogVGhyaWZ0LlRKU09OUHJvdG9jb2wsIG91dHB1dD86IFRocmlmdC5USlNPTlByb3RvY29sKTsiIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLQotICBpbmRlbnRfZG93bigpOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJ9OyIgPDwgZW5kbDsKLQotCi0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJUaHJpZnQuaW5oZXJpdHMoIiA8PAotICAgICAgICBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpIDw8Ci0gICAgICAgIHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudCwgIiA8PAotICAgICAgICBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9wcm9ncmFtKCkpIDw8Ci0gICAgICAgIHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpIDw8ICJDbGllbnQpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICAgIC8vaW5pdCBwcm90b3R5cGUKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKTw8c2VydmljZV9uYW1lXyA8PCAiQ2xpZW50LnByb3RvdHlwZSA9IHt9OyI8PGVuZGw7Ci0gIH0KLQotICAvLyB1dGlscyBmb3IgbXVsdGlwbGV4ZWQgc2VydmljZXMKLSAgaWYgKGdlbl9ub2RlXykgewotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKTw8c2VydmljZV9uYW1lXyA8PCAiQ2xpZW50LnByb3RvdHlwZS5zZXFpZCA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5fc2VxaWQ7IH0iIDw8IGVuZGwgPDwKLSAgICBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpPDxzZXJ2aWNlX25hbWVfIDw8ICJDbGllbnQucHJvdG90eXBlLm5ld19zZXFpZCA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5fc2VxaWQgKz0gMTsgfSIgPDwgZW5kbDsKLSAgfQotICAvLyBHZW5lcmF0ZSBjbGllbnQgbWV0aG9kIGltcGxlbWVudGF0aW9ucwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOwotICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIHN0cmluZyBhcmdsaXN0ID0gYXJndW1lbnRfbGlzdChhcmdfc3RydWN0KTsKLQotICAgIC8vIE9wZW4gZnVuY3Rpb24KLSAgICBmX3NlcnZpY2VfIDw8ICBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpPDxzZXJ2aWNlX25hbWVfPDwiQ2xpZW50LnByb3RvdHlwZS4iIDw8Ci0gICAgICBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlciwgIiIsIHRydWUpIDw8ICIgeyIgPDwgZW5kbDsKLQotICAgIGluZGVudF91cCgpOwotCi0gICAgaWYgKGdlbl90c18pIHsKLSAgICAgIGZfc2VydmljZV90c18gPDwKLSAgICAgIHRzX3ByaW50X2RvYygqZl9pdGVyKSA8PAotICAgICAgLy9mdW5jdGlvbiBkZWZpbml0aW9uIHdpdGhvdXQgY2FsbGJhY2sKLSAgICAgIHRzX2luZGVudCgpIDw8IHRzX2Z1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCBmYWxzZSkgPDwgZW5kbCA8PAotICAgICAgdHNfcHJpbnRfZG9jKCpmX2l0ZXIpIDw8Ci0gICAgICAvL292ZXJsb2FkIHdpdGggY2FsbGJhY2sKLSAgICAgIHRzX2luZGVudCgpIDw8IHRzX2Z1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCB0cnVlKSA8PCBlbmRsOwotICAgIH0KLQotICAgIGlmIChnZW5fbm9kZV8pIHsgICAgICAgICAgLy9Ob2RlLmpzIG91dHB1dCAgICAgIC4vZ2VuLW5vZGVqcwotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAidGhpcy5fc2VxaWQgPSB0aGlzLm5ld19zZXFpZCgpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKGNhbGxiYWNrID09PSB1bmRlZmluZWQpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInZhciBfZGVmZXIgPSBRLmRlZmVyKCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ0aGlzLl9yZXFzW3RoaXMuc2VxaWQoKV0gPSBmdW5jdGlvbihlcnJvciwgcmVzdWx0KSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImlmIChlcnJvcikgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJfZGVmZXIucmVqZWN0KGVycm9yKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJfZGVmZXIucmVzb2x2ZShyZXN1bHQpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9OyIgPDwgZW5kbDsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInRoaXMuc2VuZF8iIDw8IGZ1bm5hbWUgPDwgIigiIDw8IGFyZ2xpc3QgPDwgIik7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJyZXR1cm4gX2RlZmVyLnByb21pc2U7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInRoaXMuX3JlcXNbdGhpcy5zZXFpZCgpXSA9IGNhbGxiYWNrOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAidGhpcy5zZW5kXyIgPDwgZnVubmFtZSA8PCAiKCIgPDwgYXJnbGlzdCA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0KLSAgICBlbHNlIGlmIChnZW5fanF1ZXJ5XykgeyAgIC8valF1ZXJ5IG91dHB1dCAgICAgICAuL2dlbi1qcwotCQkgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChjYWxsYmFjayA9PT0gdW5kZWZpbmVkKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0aGlzLnNlbmRfIiA8PCBmdW5uYW1lIDw8ICIoIiA8PCBhcmdsaXN0IDw8ICIpOyIgPDwgZW5kbDsKLSAgICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOwotICAgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgICAgZl9zZXJ2aWNlXyA8PCAicmV0dXJuICI7Ci0gICAgICAgIH0KLSAgICAgICAgZl9zZXJ2aWNlXyA8PCAidGhpcy5yZWN2XyIgPDwgZnVubmFtZSA8PCAiKCk7IiA8PCBlbmRsOwotICAgICAgfQotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ2YXIgcG9zdERhdGEgPSB0aGlzLnNlbmRfIiA8PCBmdW5uYW1lIDw8Ci0gICAgICAgICIoIiA8PCBhcmdsaXN0IDw8IChhcmdsaXN0LmVtcHR5KCkgPyAiIiA6ICIsICIpIDw8ICJ0cnVlKTsiIDw8IGVuZGw7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gdGhpcy5vdXRwdXQuZ2V0VHJhbnNwb3J0KCkiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIi5qcVJlcXVlc3QodGhpcywgcG9zdERhdGEsIGFyZ3VtZW50cywgdGhpcy5yZWN2XyIgPDwgZnVubmFtZSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAvL1N0YW5kYXJkIEphdmFTY3JpcHQgLi9nZW4tanMKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwKLSAgICAgICAgInRoaXMuc2VuZF8iIDw8IGZ1bm5hbWUgPDwgIigiIDw8IGFyZ2xpc3QgPDwgKGFyZ2xpc3QuZW1wdHkoKSA/ICIiIDogIiwgIikgPDwgImNhbGxiYWNrKTsgIiA8PCBlbmRsOwotICAgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0JCSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAoIWNhbGxiYWNrKSB7IiA8PCBlbmRsOwotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOwotICAgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgICAgZl9zZXJ2aWNlXyA8PCAiICByZXR1cm4gIjsKLSAgICAgICAgfQotICAgICAgICBmX3NlcnZpY2VfIDw8ICJ0aGlzLnJlY3ZfIiA8PCBmdW5uYW1lIDw8ICIoKTsiIDw8IGVuZGw7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaW5kZW50X2Rvd24oKTsKLQotICAgIGZfc2VydmljZV8gPDwgIn07IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLQotICAgIC8vIFNlbmQgZnVuY3Rpb24KLSAgICBmX3NlcnZpY2VfIDw8ICBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpPDxzZXJ2aWNlX25hbWVfIDw8Ci0gICAgICAiQ2xpZW50LnByb3RvdHlwZS5zZW5kXyIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIsICIiLCAhZ2VuX25vZGVfKSA8PCAiIHsiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIHN0ZDo6c3RyaW5nIG91dHB1dFZhcjsKLSAgICBpZiAoZ2VuX25vZGVfKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ2YXIgb3V0cHV0ID0gbmV3IHRoaXMucENsYXNzKHRoaXMub3V0cHV0KTsiIDw8IGVuZGw7Ci0gICAgICBvdXRwdXRWYXIgPSAib3V0cHV0IjsKLSAgICB9IGVsc2UgewotICAgICAgb3V0cHV0VmFyID0gInRoaXMub3V0cHV0IjsKLSAgICB9Ci0KLSAgICBzdGQ6OnN0cmluZyBhcmdzbmFtZSA9ICBqc19uYW1lc3BhY2UocHJvZ3JhbV8pKyBzZXJ2aWNlX25hbWVfICsgIl8iICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKLQotICAgIHN0ZDo6c3RyaW5nIG1lc3NhZ2VUeXBlCi0gICAgICA9ICgqZl9pdGVyKS0+aXNfb25ld2F5KCkgPyAiVGhyaWZ0Lk1lc3NhZ2VUeXBlLk9ORVdBWSIgOiAiVGhyaWZ0Lk1lc3NhZ2VUeXBlLkNBTEwiOwotCi0gICAgLy8gU2VyaWFsaXplIHRoZSByZXF1ZXN0IGhlYWRlcgotICAgIGlmIChnZW5fbm9kZV8pIHsKLSAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICBpbmRlbnQoKSA8PCBvdXRwdXRWYXIgPDwgIi53cml0ZU1lc3NhZ2VCZWdpbignIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgICAgIDw8ICInLCAiIDw8IG1lc3NhZ2VUeXBlIDw8ICIsIHRoaXMuc2VxaWQoKSk7IiA8PCBlbmRsOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICBpbmRlbnQoKSA8PCBvdXRwdXRWYXIgPDwgIi53cml0ZU1lc3NhZ2VCZWdpbignIgotICAgICAgICAgICAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInLCAiCi0gICAgICAgICAgICAgICAgICA8PCBtZXNzYWdlVHlwZSA8PCAiLCB0aGlzLnNlcWlkKTsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInZhciBhcmdzID0gbmV3ICIgPDwgYXJnc25hbWUgPDwgIigpOyIgPDwgZW5kbDsKLQotICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJhcmdzLiIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgLy8gV3JpdGUgdG8gdGhlIHN0cmVhbQotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJhcmdzLndyaXRlKCIgPDwgb3V0cHV0VmFyIDw8ICIpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgb3V0cHV0VmFyIDw8ICIud3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOwotCi0gICAgaWYgKGdlbl9ub2RlXykgewotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHRoaXMub3V0cHV0LmZsdXNoKCk7IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAoZ2VuX2pxdWVyeV8pIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHRoaXMub3V0cHV0LmdldFRyYW5zcG9ydCgpLmZsdXNoKGNhbGxiYWNrKTsiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAoY2FsbGJhY2spIHsiIDw8IGVuZGw7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgdmFyIHNlbGYgPSB0aGlzOyIgPDwgZW5kbDsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICB0aGlzLm91dHB1dC5nZXRUcmFuc3BvcnQoKS5mbHVzaCh0cnVlLCBmdW5jdGlvbigpIHsiIDw8IGVuZGw7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgICB2YXIgcmVzdWx0ID0gbnVsbDsiIDw8IGVuZGw7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgICB0cnkgeyIgPDwgZW5kbDsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICAgICAgcmVzdWx0ID0gc2VsZi5yZWN2XyIgPDwgZnVubmFtZSA8PCAiKCk7IiA8PCBlbmRsOwotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgICAgfSBjYXRjaCAoZSkgeyIgPDwgZW5kbDsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICAgICAgcmVzdWx0ID0gZTsiIDw8IGVuZGw7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgICB9IiA8PCBlbmRsOwotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgICAgY2FsbGJhY2socmVzdWx0KTsiIDw8IGVuZGw7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgfSk7IiA8PCBlbmRsOwotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhpcy5vdXRwdXQuZ2V0VHJhbnNwb3J0KCkuZmx1c2goKTsiIDw8IGVuZGw7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaW5kZW50X2Rvd24oKTsKLQotICAgIGZfc2VydmljZV8gPDwgIn07IiA8PCBlbmRsOwotCi0KLSAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIHN0ZDo6c3RyaW5nIHJlc3VsdG5hbWUgPSBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpICsgc2VydmljZV9uYW1lXyArICJfIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKLQotICAgICAgaWYgKGdlbl9ub2RlXykgewotICAgICAgICAvLyBPcGVuIGZ1bmN0aW9uCi0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICAgIGVuZGwgPDwgIGpzX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSk8PHNlcnZpY2VfbmFtZV8gPDwKLSAgICAgICAgICAgICJDbGllbnQucHJvdG90eXBlLnJlY3ZfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IGZ1bmN0aW9uKGlucHV0LG10eXBlLHJzZXFpZCkgeyIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7Ci0KLSAgICAgICAgdF9mdW5jdGlvbiByZWN2X2Z1bmN0aW9uKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygicmVjdl8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZub2FyZ3MpOwotICAgICAgICAvLyBPcGVuIGZ1bmN0aW9uCi0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICAgIGVuZGwgPDwgIGpzX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSk8PHNlcnZpY2VfbmFtZV8gPDwKLSAgICAgICAgICAgICJDbGllbnQucHJvdG90eXBlLiIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZyZWN2X2Z1bmN0aW9uKSA8PCAiIHsiIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIGluZGVudF91cCgpOwotCi0gICAgICBzdGQ6OnN0cmluZyBpbnB1dFZhcjsKLSAgICAgIGlmIChnZW5fbm9kZV8pIHsKLSAgICAgICAgaW5wdXRWYXIgPSAiaW5wdXQiOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaW5wdXRWYXIgPSAidGhpcy5pbnB1dCI7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChnZW5fbm9kZV8pIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ2YXIgY2FsbGJhY2sgPSB0aGlzLl9yZXFzW3JzZXFpZF0gfHwgZnVuY3Rpb24oKSB7fTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiZGVsZXRlIHRoaXMuX3JlcXNbcnNlcWlkXTsiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgInZhciByZXQgPSB0aGlzLmlucHV0LnJlYWRNZXNzYWdlQmVnaW4oKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAidmFyIGZuYW1lID0gcmV0LmZuYW1lOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ2YXIgbXR5cGUgPSByZXQubXR5cGU7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgInZhciByc2VxaWQgPSByZXQucnNlcWlkOyIgPDxlbmRsOwotICAgICAgfQotCi0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImlmIChtdHlwZSA9PSBUaHJpZnQuTWVzc2FnZVR5cGUuRVhDRVBUSU9OKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgdmFyIHggPSBuZXcgVGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbigpOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIHgucmVhZCgiIDw8IGlucHV0VmFyIDw8ICIpOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgICIgPDwgaW5wdXRWYXIgPDwgIi5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgICIgPDwgcmVuZGVyX3JlY3ZfdGhyb3coIngiKSA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0KLQotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAidmFyIHJlc3VsdCA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIigpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAicmVzdWx0LnJlYWQoIiA8PCBpbnB1dFZhciA8PCAiKTsiIDw8IGVuZGw7Ci0KLQotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCBpbnB1dFZhciA8PCAiLnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGVuZGw7Ci0KLQotICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7Ci0gICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAobnVsbCAhPT0gcmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICAiIDw8IHJlbmRlcl9yZWN2X3Rocm93KCJyZXN1bHQuIiArICgqeF9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiByZXN1bHQgaWYgbm90IGEgdm9pZCBmdW5jdGlvbgotICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImlmIChudWxsICE9PSByZXN1bHQuc3VjY2VzcykgeyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgICIgPDwgcmVuZGVyX3JlY3ZfcmV0dXJuKCJyZXN1bHQuc3VjY2VzcyIpIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8IHJlbmRlcl9yZWN2X3Rocm93KCInIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICIgZmFpbGVkOiB1bmtub3duIHJlc3VsdCciKSA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpZiAoZ2VuX25vZGVfKSB7Ci0gICAgICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImNhbGxiYWNrKG51bGwpIiA8PCBlbmRsOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybjsiIDw8IGVuZGw7Ci0gICAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvLyBDbG9zZSBmdW5jdGlvbgotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGZfc2VydmljZV8gPDwgIn07Ijw8ZW5kbDsKLQotICAgIH0KLSAgfQotCi0gIGlmIChnZW5fdHNfKSB7Ci0gICAgZl9zZXJ2aWNlX3RzXyA8PCB0c19pbmRlbnQoKSA8PCAifSIgPDwgIGVuZGw7Ci0gIH0KLQotfQotCi1zdGQ6OnN0cmluZyB0X2pzX2dlbmVyYXRvcjo6cmVuZGVyX3JlY3ZfdGhyb3coc3RkOjpzdHJpbmcgdmFyKSB7Ci0gIGlmIChnZW5fbm9kZV8pIHsKLSAgICByZXR1cm4gInJldHVybiBjYWxsYmFjaygiICsgdmFyICsgIik7IjsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gInRocm93ICIgKyB2YXIgKyAiOyI7Ci0gIH0KLX0KLQotc3RkOjpzdHJpbmcgdF9qc19nZW5lcmF0b3I6OnJlbmRlcl9yZWN2X3JldHVybihzdGQ6OnN0cmluZyB2YXIpIHsKLSAgaWYgKGdlbl9ub2RlXykgewotICAgIHJldHVybiAicmV0dXJuIGNhbGxiYWNrKG51bGwsICIgKyB2YXIgKyAiKTsiOwotICB9IGVsc2UgewotICAgIHJldHVybiAicmV0dXJuICIgKyB2YXIgKyAiOyI7Ci0gIH0KLX0KLQotLyoqCi0gKiBEZXNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2xhc3MpIHsKLSAgKHZvaWQpIGluY2xhc3M7Ci0gIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLQotICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKwotICAgICAgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgc3RyaW5nIG5hbWUgPSBwcmVmaXgrdGZpZWxkLT5nZXRfbmFtZSgpOwotCi0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRfc3RydWN0Kil0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIgPSBpbnB1dC4iOwotCi0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsKLSAgICAgICAgICBuYW1lOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICBvdXQgPDwgKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSA/ICJyZWFkQmluYXJ5KCkiIDogInJlYWRTdHJpbmcoKSIpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgb3V0IDw8ICJyZWFkQm9vbCgpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgIG91dCA8PCAicmVhZEJ5dGUoKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgIG91dCA8PCAicmVhZEkxNigpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgb3V0IDw8ICJyZWFkSTMyKCkiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICBvdXQgPDwgInJlYWRJNjQoKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIG91dCA8PCAicmVhZERvdWJsZSgpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEpTIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgb3V0IDw8ICJyZWFkSTMyKCkiOwotICAgIH0KLQotICAgIGlmICghZ2VuX25vZGVfKSB7Ci0gICAgICAgIG91dCA8PCAiLnZhbHVlIjsKLSAgICB9Ci0KLSAgICBvdXQgPDwgIjsiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gREVTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCi0gICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLCB0eXBlLT5nZXRfbmFtZSgpLmNfc3RyKCkpOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGFuIHVuc2VyaWFsaXplciBmb3IgYSB2YXJpYWJsZS4gVGhpcyBtYWtlcyB0d28ga2V5IGFzc3VtcHRpb25zLAotICogZmlyc3QgdGhhdCB0aGVyZSBpcyBhIGNvbnN0IGNoYXIqIHZhcmlhYmxlIG5hbWVkIGRhdGEgdGhhdCBwb2ludHMgdG8gdGhlCi0gKiBidWZmZXIgZm9yIGRlc2VyaWFsaXphdGlvbiwgYW5kIHRoYXQgdGhlcmUgaXMgYSB2YXJpYWJsZSBwcm90b2NvbCB3aGljaAotICogaXMgYSByZWZlcmVuY2UgdG8gYSBUUHJvdG9jb2wgc2VyaWFsaXphdGlvbiBvYmplY3QuCi0gKi8KLXZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gbmV3ICIgPDwgIGpzX3R5cGVfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpPDx0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIucmVhZChpbnB1dCk7IiA8PCBlbmRsOwotCi19Ci0KLXZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgc3RyaW5nIHNpemUgPSB0bXAoIl9zaXplIik7Ci0gIHN0cmluZyBrdHlwZSA9IHRtcCgiX2t0eXBlIik7Ci0gIHN0cmluZyB2dHlwZSA9IHRtcCgiX3Z0eXBlIik7Ci0gIHN0cmluZyBldHlwZSA9IHRtcCgiX2V0eXBlIik7Ci0gIHN0cmluZyBydG1wMyA9IHRtcCgiX3J0bXAzIik7Ci0KLSAgdF9maWVsZCBmc2l6ZShnX3R5cGVfaTMyLCBzaXplKTsKLSAgdF9maWVsZCBma3R5cGUoZ190eXBlX2J5dGUsIGt0eXBlKTsKLSAgdF9maWVsZCBmdnR5cGUoZ190eXBlX2J5dGUsIHZ0eXBlKTsKLSAgdF9maWVsZCBmZXR5cGUoZ190eXBlX2J5dGUsIGV0eXBlKTsKLQotICBvdXQgPDwgaW5kZW50KCkgPDwgInZhciAiIDw8IHNpemUgPDwgIiA9IDA7IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgInZhciAiIDw8IHJ0bXAzIDw8ICI7IiA8PCBlbmRsOwotCi0KLSAgLy8gRGVjbGFyZSB2YXJpYWJsZXMsIHJlYWQgaGVhZGVyCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICAgIG91dCA8PAotICAgICAgICAgIGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0ge307IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgInZhciAiIDw8IGt0eXBlIDw8ICIgPSAwOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ2YXIgIiA8PCB2dHlwZSA8PCAiID0gMDsiIDw8IGVuZGw7Ci0KLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCBydG1wMyA8PCAiID0gaW5wdXQucmVhZE1hcEJlZ2luKCk7IiA8PCBlbmRsOwotICAgICAgb3V0IDw8IGluZGVudCgpIDw8IGt0eXBlIDw8ICIgPSAiIDw8IHJ0bXAzIDw8ICIua3R5cGU7IiA8PCBlbmRsOwotICAgICAgb3V0IDw8IGluZGVudCgpIDw8IHZ0eXBlIDw8ICIgPSAiIDw8IHJ0bXAzIDw8ICIudnR5cGU7IiA8PCBlbmRsOwotICAgICAgb3V0IDw8IGluZGVudCgpIDw8IHNpemUgIDw8ICIgPSAiIDw8IHJ0bXAzIDw8ICIuc2l6ZTsiIDw8IGVuZGw7Ci0KLQotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotCi0gICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gW107IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ2YXIgIiA8PCBldHlwZSA8PCAiID0gMDsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgcnRtcDMgPDwgIiA9IGlucHV0LnJlYWRTZXRCZWdpbigpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCBldHlwZSA8PCAiID0gIiA8PCBydG1wMyA8PCAiLmV0eXBlOyI8PGVuZGw8PAotICAgICAgICBpbmRlbnQoKSA8PCBzaXplIDw8ICIgPSAiIDw8IHJ0bXAzIDw8ICIuc2l6ZTsiPDxlbmRsOwotCi0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotCi0gICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gW107IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ2YXIgIiA8PCBldHlwZSA8PCAiID0gMDsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgcnRtcDMgPDwgIiA9IGlucHV0LnJlYWRMaXN0QmVnaW4oKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgZXR5cGUgPDwgIiA9ICIgPDwgcnRtcDMgPDwgIi5ldHlwZTsiPDxlbmRsPDwKLSAgICAgICAgaW5kZW50KCkgPDwgc2l6ZSA8PCAiID0gIiA8PCBydG1wMyA8PCAiLnNpemU7Ijw8ZW5kbDsKLSAgfQotCi0gIC8vIEZvciBsb29wIGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMKLSAgc3RyaW5nIGkgPSB0bXAoIl9pIik7Ci0gIGluZGVudChvdXQpIDw8Ci0gICAgImZvciAodmFyICIgPDwKLSAgICBpIDw8ICIgPSAwOyAiIDw8IGkgPDwgIiA8ICIgPDwgc2l6ZSA8PCAiOyArKyIgPDwgaSA8PCAiKSIgPDwgZW5kbDsKLQotICBzY29wZV91cChvdXQpOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpZiAoIWdlbl9ub2RlXykgewotICAgICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWYgKCIgPDwgaSA8PCAiID4gMCApIHsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIGlmIChpbnB1dC5yc3RhY2subGVuZ3RoID4gaW5wdXQucnBvc1tpbnB1dC5ycG9zLmxlbmd0aCAtMV0gKyAxKSB7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICAgIGlucHV0LnJzdGFjay5wb3AoKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0KLQotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgcHJlZml4KTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIHByZWZpeCk7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBwcmVmaXgpOwotICB9Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotCi0KLSAgLy8gUmVhZCBjb250YWluZXIgZW5kCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiaW5wdXQucmVhZE1hcEVuZCgpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiaW5wdXQucmVhZFNldEVuZCgpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImlucHV0LnJlYWRMaXN0RW5kKCk7IiA8PCBlbmRsOwotICB9Ci19Ci0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgY29kZSB0byBkZXNlcmlhbGl6ZSBhIG1hcAotICovCi12b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcga2V5ID0gdG1wKCJrZXkiKTsKLSAgc3RyaW5nIHZhbCA9IHRtcCgidmFsIik7Ci0gIHRfZmllbGQgZmtleSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KTsKLSAgdF9maWVsZCBmdmFsKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2YWwpOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgZGVjbGFyZV9maWVsZCgmZmtleSwgZmFsc2UsIGZhbHNlKSA8PCAiOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwKLSAgICBkZWNsYXJlX2ZpZWxkKCZmdmFsLCBmYWxzZSwgZmFsc2UpIDw8ICI7IiA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZrZXkpOwotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmdmFsKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICAgcHJlZml4IDw8ICJbIiA8PCBrZXkgPDwgIl0gPSAiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgc3RyaW5nIGVsZW0gPSB0bXAoImVsZW0iKTsKLSAgdF9maWVsZCBmZWxlbSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgInZhciAiIDw8IGVsZW0gPDwgIiA9IG51bGw7IiA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICAgcHJlZml4IDw8ICIucHVzaCgiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOwotfQotCi12b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHN0cmluZyBlbGVtID0gdG1wKCJlbGVtIik7Ci0gIHRfZmllbGQgZmVsZW0odGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAidmFyICIgPDwgZWxlbSA8PCAiID0gbnVsbDsiIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgICBwcmVmaXggPDwgIi5wdXNoKCIgPDwgZWxlbSA8PCAiKTsiIDw8IGVuZGw7Ci19Ci0KLQotLyoqCi0gKiBTZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCi0gKgotICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQgdG8gc2VyaWFsaXplCi0gKiBAcGFyYW0gcHJlZml4IE5hbWUgdG8gcHJlcGVuZCB0byBmaWVsZCBuYW1lCi0gKi8KLXZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0KLSAgLy8gRG8gbm90aGluZyBmb3Igdm9pZCB0eXBlcwotICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsKLSAgICAgIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodF9zdHJ1Y3QqKXR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ICt0ZmllbGQtPmdldF9uYW1lKCkgKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7Ci0KLSAgICBzdHJpbmcgbmFtZSA9IHRmaWVsZC0+Z2V0X25hbWUoKTsKLQotICAgIC8vSGFjayBmb3Igd2hlbiBwcmVmaXggaXMgZGVmaW5lZCAoYWx3YXlzIGEgaGFzaCByZWYpCi0gICAgaWYoIXByZWZpeC5lbXB0eSgpKQotICAgICAgbmFtZSA9IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLQotICAgIGluZGVudChvdXQpIDw8ICJvdXRwdXQuIjsKLQotICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICB0aHJvdwotICAgICAgICAgICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgb3V0IDw8ICgoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkgPyAid3JpdGVCaW5hcnkoIiA6ICJ3cml0ZVN0cmluZygiKSA8PCBuYW1lIDw8ICIpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIG91dCA8PCAid3JpdGVCb29sKCIgPDwgbmFtZSA8PCAiKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICBvdXQgPDwgIndyaXRlQnl0ZSgiIDw8IG5hbWUgPDwgIikiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICBvdXQgPDwgIndyaXRlSTE2KCIgPDwgbmFtZSA8PCAiKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgIG91dCA8PCAid3JpdGVJMzIoIiA8PCBuYW1lIDw8ICIpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUk2NCgiIDw8IG5hbWUgPDwgIikiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICBvdXQgPDwgIndyaXRlRG91YmxlKCIgPDwgbmFtZSA8PCAiKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBKUyBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIG91dCA8PCAid3JpdGVJMzIoIiA8PCBuYW1lIDw8ICIpIjsKLSAgICB9Ci0gICAgb3V0IDw8ICI7IiA8PCBlbmRsOwotCi0gIH0gZWxzZSB7Ci0gICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gU0VSSUFMSVpFIEZJRUxEICclcyVzJyBUWVBFICclcydcbiIsCi0gICAgICAgICAgIHByZWZpeC5jX3N0cigpLAotICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKLSAgICAgICAgICAgdHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKLSAgfQotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgYWxsIHRoZSBtZW1iZXJzIG9mIGEgc3RydWN0LgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgdG8gc2VyaWFsaXplCi0gKiBAcGFyYW0gcHJlZml4ICBTdHJpbmcgcHJlZml4IHRvIGF0dGFjaCB0byBhbGwgZmllbGRzCi0gKi8KLXZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gICh2b2lkKSB0c3RydWN0OwotICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi53cml0ZShvdXRwdXQpOyIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBXcml0ZXMgb3V0IGEgY29udGFpbmVyCi0gKi8KLXZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICJvdXRwdXQud3JpdGVNYXBCZWdpbigiIDw8Ci0gICAgICAgIHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICAgIHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICAgICJUaHJpZnQub2JqZWN0TGVuZ3RoKCIgPDwgcHJlZml4IDw8ICIpKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvdXRwdXQud3JpdGVTZXRCZWdpbigiIDw8Ci0gICAgICB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgICAgcHJlZml4IDw8ICIubGVuZ3RoKTsiIDw8IGVuZGw7Ci0KLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0KLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAib3V0cHV0LndyaXRlTGlzdEJlZ2luKCIgPDwKLSAgICAgICAgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgICBwcmVmaXggPDwgIi5sZW5ndGgpOyIgPDwgZW5kbDsKLQotICB9Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIHN0cmluZyBraXRlciA9IHRtcCgia2l0ZXIiKTsKLSAgICBzdHJpbmcgdml0ZXIgPSB0bXAoInZpdGVyIik7Ci0gICAgaW5kZW50KG91dCkgPDwgImZvciAodmFyICI8PGtpdGVyPDwiIGluICI8PHByZWZpeDw8IikiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAob3V0KTsKLSAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCI8PHByZWZpeDw8Ii5oYXNPd25Qcm9wZXJ0eSgiPDxraXRlcjw8IikpIiA8PGVuZGw7Ci0gICAgc2NvcGVfdXAob3V0KTsKLSAgICBpbmRlbnQob3V0KSA8PCAidmFyICI8PHZpdGVyPDwiID0gIjw8cHJlZml4PDwiWyI8PGtpdGVyPDwiXTsiPDxlbmRsOwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIGtpdGVyLCB2aXRlcik7Ci0gICAgc2NvcGVfZG93bihvdXQpOwotICAgIHNjb3BlX2Rvd24ob3V0KTsKLQotCi0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgc3RyaW5nIGl0ZXIgPSB0bXAoIml0ZXIiKTsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImZvciAodmFyICI8PGl0ZXI8PCIgaW4gIiA8PCBwcmVmaXggPDwgIikiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAob3V0KTsKLSAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCI8PHByZWZpeDw8Ii5oYXNPd25Qcm9wZXJ0eSgiPDxpdGVyPDwiKSkiIDw8ZW5kbDsKLSAgICBzY29wZV91cChvdXQpOwotICAgIGluZGVudChvdXQpIDw8IGl0ZXIgPDwgIiA9ICIgPDwgcHJlZml4IDw8ICJbIiA8PCBpdGVyIDw8ICJdOyI8PCBlbmRsOwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIGl0ZXIpOwotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgICBzY29wZV9kb3duKG91dCk7Ci0KLQotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBzdHJpbmcgaXRlciA9IHRtcCgiaXRlciIpOwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICJmb3IgKHZhciAiPDxpdGVyPDwiIGluICI8PCBwcmVmaXggPDwgIikiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAob3V0KTsKLSAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCI8PHByZWZpeDw8Ii5oYXNPd25Qcm9wZXJ0eSgiPDxpdGVyPDwiKSkiIDw8ZW5kbDsKLSAgICBzY29wZV91cChvdXQpOwotICAgIGluZGVudChvdXQpIDw8IGl0ZXIgPDwgIiA9ICIgPDwgcHJlZml4IDw8ICJbIiA8PCBpdGVyIDw8ICJdOyI8PCBlbmRsOwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgaXRlcik7Ci0gICAgc2NvcGVfZG93bihvdXQpOwotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgfQotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm91dHB1dC53cml0ZU1hcEVuZCgpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm91dHB1dC53cml0ZVNldEVuZCgpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvdXRwdXQud3JpdGVMaXN0RW5kKCk7IiA8PCBlbmRsOwotICB9Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIG1hcC4KLSAqCi0gKi8KLXZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcga2l0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdml0ZXIpIHsKLSAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksIGtpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmtmaWVsZCk7Ci0KLSAgdF9maWVsZCB2ZmllbGQodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJnZmaWVsZCk7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIHNldC4KLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyKSB7Ci0gIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQpOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBsaXN0LgotICovCi12b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlcikgewotICB0X2ZpZWxkIGVmaWVsZCh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCk7Ci19Ci0KLS8qKgotICogRGVjbGFyZXMgYSBmaWVsZCwgd2hpY2ggbWF5IGluY2x1ZGUgaW5pdGlhbGl6YXRpb24gYXMgbmVjZXNzYXJ5LgotICoKLSAqIEBwYXJhbSB0dHlwZSBUaGUgdHlwZQotICovCi1zdHJpbmcgdF9qc19nZW5lcmF0b3I6OmRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluaXQsIGJvb2wgb2JqKSB7Ci0gIHN0cmluZyByZXN1bHQgPSAidGhpcy4iICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotCi0gIGlmKCFvYmopewotICAgICAgcmVzdWx0ID0gInZhciAiICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgaWYgKGluaXQpIHsKLSAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgcmVzdWx0ICs9ICIgPSBudWxsIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEpTIGluaXRpYWxpemVyIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIHJlc3VsdCArPSAiID0gbnVsbCI7Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSl7Ci0gICAgICByZXN1bHQgKz0gIiA9IG51bGwiOwotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICAgIHJlc3VsdCArPSAiID0gbnVsbCI7Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgICBpZiAob2JqKSB7Ci0gICAgICAgICAgcmVzdWx0ICs9ICIgPSBuZXcgIiAranNfdHlwZV9uYW1lc3BhY2UodHlwZS0+Z2V0X3Byb2dyYW0oKSkgKyB0eXBlLT5nZXRfbmFtZSgpICsgIigpIjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlc3VsdCArPSAiID0gbnVsbCI7Ci0gICAgICB9Ci0gICAgfQotICB9IGVsc2UgewotICAgIHJlc3VsdCArPSAiID0gbnVsbCI7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd0eXBlIG5hbWUoYXJncyknCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCi0gKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCi0gKi8KLXN0cmluZyB0X2pzX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsdWRlX2NhbGxiYWNrKSB7Ci0KLSAgc3RyaW5nIHN0cjsKLQotICBzdHIgID0gcHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIiA9IGZ1bmN0aW9uKCI7Ci0KLSAgc3RyICs9IGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLCBpbmNsdWRlX2NhbGxiYWNrKTsKLQotICBzdHIgKz0gIikiOwotICByZXR1cm4gc3RyOwotfQotCi0vKioKLSAqIFJlbmRlcnMgYSBmaWVsZCBsaXN0Ci0gKi8KLXN0cmluZyB0X2pzX2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbHVkZV9jYWxsYmFjaykgewotICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlc3VsdCArPSAiLCAiOwotICAgIH0KLSAgICByZXN1bHQgKz0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgaWYgKGluY2x1ZGVfY2FsbGJhY2spIHsKLSAgICBpZiAoIWZpZWxkcy5lbXB0eSgpKSB7Ci0gICAgICByZXN1bHQgKz0gIiwgIjsKLSAgICB9Ci0gICAgcmVzdWx0ICs9ICJjYWxsYmFjayI7Ci0gIH0KLQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioKLSAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgQysrIGVudW0gc3RyaW5nIGZvciB0aGUgZ2l2ZW4gdHlwZS4KLSAqLwotc3RyaW5nIHRfanNfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgcmV0dXJuICJUaHJpZnQuVHlwZS5TVFJJTkciOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIHJldHVybiAiVGhyaWZ0LlR5cGUuQk9PTCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgcmV0dXJuICJUaHJpZnQuVHlwZS5CWVRFIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIHJldHVybiAiVGhyaWZ0LlR5cGUuSTE2IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIHJldHVybiAiVGhyaWZ0LlR5cGUuSTMyIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJldHVybiAiVGhyaWZ0LlR5cGUuSTY0IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIHJldHVybiAiVGhyaWZ0LlR5cGUuRE9VQkxFIjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJUaHJpZnQuVHlwZS5JMzIiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gIlRocmlmdC5UeXBlLlNUUlVDVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gIlRocmlmdC5UeXBlLk1BUCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gIlRocmlmdC5UeXBlLlNFVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgcmV0dXJuICJUaHJpZnQuVHlwZS5MSVNUIjsKLSAgfQotCi0gIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotLyoqCi0gKiBDb252ZXJ0cyBhIHRfdHlwZSB0byBhIFR5cGVTY3JpcHQgdHlwZSAoc3RyaW5nKS4KLSAqIEBwYXJhbSB0X3R5cGUgVHlwZSB0byBjb252ZXJ0IHRvIFR5cGVTY3JpcHQKLSAqIEByZXR1cm4gU3RyaW5nIFR5cGVTY3JpcHQgdHlwZQotICovCi1zdHJpbmcgdF9qc19nZW5lcmF0b3I6OnRzX2dldF90eXBlKHRfdHlwZSogdHlwZSkgewotICBzdGQ6OnN0cmluZyB0c190eXBlOwotCi0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgdHNfdHlwZSA9ICJzdHJpbmciOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgdHNfdHlwZSA9ICJib29sZWFuIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgIHRzX3R5cGUgPSAiYW55IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgdHNfdHlwZSA9ICJudW1iZXIiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgdHNfdHlwZSA9ICJ2b2lkIjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpIHx8IHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICB0c190eXBlID0gdHlwZS0+Z2V0X25hbWUoKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKLSAgICB0X3R5cGUqIGV0eXBlOwotCi0gICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB9IGVsc2UgewotICAgICAgZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIH0KLQotICAgIHRzX3R5cGUgPSB0c19nZXRfdHlwZShldHlwZSkgKyAiW10iOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgc3RyaW5nIGt0eXBlID0gdHNfZ2V0X3R5cGUoKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpKTsKLSAgICBzdHJpbmcgdnR5cGUgPSB0c19nZXRfdHlwZSgoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpOwotCi0gICAgaWYgKGt0eXBlID09ICJudW1iZXIiIHx8IGt0eXBlID09ICJzdHJpbmciKSB7Ci0gICAgICB0c190eXBlID0gInsgW2s6ICIgKyBrdHlwZSArICJdOiAiICsgdnR5cGUgKyAiOyB9IjsKLSAgICB9IGVsc2UgewotICAgICAgdHNfdHlwZSA9ICJhbnkiOwotICAgIH0KLSAgfQotCi0gIHJldHVybiB0c190eXBlOwotfQotCi0vKioKLSAqIFJlbmRlcnMgYSBUeXBlU2NyaXB0IGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAnbmFtZShhcmdzOiB0eXBlcyk6IHR5cGU7JwotICoKLSAqIEBwYXJhbSB0X2Z1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KLSAqIEBwYXJhbSBib29sIGluLS9leGNsdWRlIHRoZSBjYWxsYmFjayBhcmd1bWVudAotICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgotICovCi1zdGQ6OnN0cmluZyB0X2pzX2dlbmVyYXRvcjo6dHNfZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgYm9vbCBpbmNsdWRlX2NhbGxiYWNrKSB7Ci0gIHN0cmluZyBzdHI7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIHN0ciA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICIoIjsKLQotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHN0ciArPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyB0c19nZXRfcmVxKCpmX2l0ZXIpICsgIjogIiArIHRzX2dldF90eXBlKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgCi0gICAgaWYgKGZfaXRlciArIDEgIT0gZmllbGRzLmVuZCgpKSB7Ci0gICAgICBzdHIgKz0gIiwgIjsKLSAgICB9Ci0gIH0KLQotICBpZiAoaW5jbHVkZV9jYWxsYmFjaykgewotICAgIHN0ciArPSAiLCBjYWxsYmFjazogRnVuY3Rpb24pOiAiOwotCi0gICAgaWYgKGdlbl9qcXVlcnlfKSB7Ci0gICAgICBzdHIgKz0gIkpRdWVyeVhIUjsiOwotICAgIH0gZWxzZSB7Ci0gICAgICBzdHIgKz0gInZvaWQ7IjsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgc3RyICs9ICIpOiAiICsgdHNfZ2V0X3R5cGUodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKSArICI7IjsKLSAgfQotCi0gIHJldHVybiBzdHI7Ci19Ci0KLQotVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUihqcywgIkphdmFzY3JpcHQiLAotIiAgICBqcXVlcnk6ICAgICAgICAgIEdlbmVyYXRlIGpRdWVyeSBjb21wYXRpYmxlIGNvZGUuXG4iCi0iICAgIG5vZGU6ICAgICAgICAgICAgR2VuZXJhdGUgbm9kZS5qcyBjb21wYXRpYmxlIGNvZGUuXG4iCi0iICAgIHRzOiAgICAgICAgICAgICAgR2VuZXJhdGUgVHlwZVNjcmlwdCBkZWZpbml0aW9uIGZpbGVzLlxuIikKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9qc29uX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9qc29uX2dlbmVyYXRvci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjkwZmZhYS4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfanNvbl9nZW5lcmF0b3IuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0NzYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgotICogUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKLSAqIGRldGFpbHMuCi0gKi8KLQotI2luY2x1ZGUgPGZzdHJlYW0+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlICJ0X2dlbmVyYXRvci5oIgotI2luY2x1ZGUgInBsYXRmb3JtLmgiCi0KLXVzaW5nIHN0ZDo6bWFwOwotdXNpbmcgc3RkOjpvZnN0cmVhbTsKLXVzaW5nIHN0ZDo6b3N0cmVhbTsKLXVzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKLXVzaW5nIHN0ZDo6c3RyaW5nOwotdXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07Ci11c2luZyBzdGQ6OnZlY3RvcjsKLXVzaW5nIHN0ZDo6c3RhY2s7Ci0KLXN0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7Ci1zdGF0aWMgY29uc3Qgc3RyaW5nIHF1b3QgPSAiXCIiOwotCi1jbGFzcyB0X2pzb25fZ2VuZXJhdG9yIDogcHVibGljIHRfZ2VuZXJhdG9yIHsKLXB1YmxpYzoKLSAgdF9qc29uX2dlbmVyYXRvcigKLSAgICB0X3Byb2dyYW0qIHByb2dyYW0sCi0gICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCi0gICAgOiB0X2dlbmVyYXRvcihwcm9ncmFtKQotICB7Ci0gICAgKHZvaWQpIHBhcnNlZF9vcHRpb25zOwotICAgICh2b2lkKSBvcHRpb25fc3RyaW5nOwotICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLWpzb24iOwotICB9Ci0KLSAgdmlydHVhbCB+dF9qc29uX2dlbmVyYXRvcigpIHt9Ci0KLSAgLyoqCi0gICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcwotICAqLwotCi0gIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKLSAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKLQotICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZik7Ci0gIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKTsKLSAgdm9pZCBnZW5lcmF0ZV9wcm9ncmFtKCk7Ci0gIHZvaWQgZ2VuZXJhdGVfY29uc3RzKHZlY3Rvcjx0X2NvbnN0Kj4pOwotICB2b2lkIGdlbmVyYXRlX2Z1bmN0aW9uKHRfZnVuY3Rpb24gKiB0ZnVuYyk7Ci0gIHZvaWQgZ2VuZXJhdGVfZmllbGQodF9maWVsZCAqIGZpZWxkKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KTsKLQotcHJpdmF0ZToKLSAgc3RkOjpvZnN0cmVhbSBmX2pzb25fOwotICBzdGQ6OnN0YWNrPGJvb2w+IF9jb21tYU5lZWRlZDsKLSAgc3RyaW5nIGdldF90eXBlX25hbWUodF90eXBlKiB0eXBlKTsKLSAgc3RyaW5nIGdldF9jb25zdF92YWx1ZSh0X2NvbnN0X3ZhbHVlKiB2YWwpOwotCi0gIHZvaWQgc3RhcnRfb2JqZWN0KCk7Ci0gIHZvaWQgc3RhcnRfYXJyYXkoKTsKLSAgdm9pZCB3cml0ZV9rZXkoc3RyaW5nIGtleSwgc3RyaW5nIHZhbCk7Ci0gIHZvaWQgd3JpdGVfa2V5X2ludChzdHJpbmcga2V5LCBpbnQgdmFsKTsKLSAgdm9pZCBlbmRfb2JqZWN0KGJvb2wgbmV3TGluZSk7Ci0gIHZvaWQgZW5kX2FycmF5KGJvb2wgbmV3TGluZSk7Ci0gIHZvaWQgd3JpdGVfY29tbWFfaWZfbmVlZGVkKCk7Ci0gIHZvaWQgaW5kaWNhdGVfY29tbWFfbmVlZGVkKCk7Ci0gIHN0cmluZyBlc2NhcGVKc29uU3RyaW5nKGNvbnN0IHN0cmluZyYgaW5wdXQpOwotCi0gIHZvaWQgbWVyZ2VfaW5jbHVkZXModF9wcm9ncmFtKik7Ci19OwotCi12b2lkIHRfanNvbl9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgewotICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOwotCi0gIHN0cmluZyBmX2pzb25fbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBwcm9ncmFtXy0+Z2V0X25hbWUoKSArICIuanNvbiI7Ci0gIGZfanNvbl8ub3BlbihmX2pzb25fbmFtZS5jX3N0cigpKTsKLQotICAvL01lcmdlIGFsbCBpbmNsdWRlZCBwcm9ncmFtcyBpbnRvIHRoaXMgb25lIHNvIHdlIGNhbiBvdXRwdXQgb25lIGJpZyBmaWxlLgotICBtZXJnZV9pbmNsdWRlcyhwcm9ncmFtXyk7Ci19Ci0KLXN0cmluZyB0X2pzb25fZ2VuZXJhdG9yOjplc2NhcGVKc29uU3RyaW5nKGNvbnN0IHN0cmluZyYgaW5wdXQpIHsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIHNzOwotICBmb3IgKHN0ZDo6c3RyaW5nOjpjb25zdF9pdGVyYXRvciBpdGVyID0gaW5wdXQuYmVnaW4oKTsgaXRlciAhPSBpbnB1dC5lbmQoKTsgaXRlcisrKSB7Ci0gICAgc3dpdGNoICgqaXRlcikgewotICAgIGNhc2UgJ1xcJzogc3MgPDwgIlxcXFwiOyBicmVhazsKLSAgICBjYXNlICciJzogc3MgPDwgIlxcXCIiOyBicmVhazsKLSAgICBjYXNlICcvJzogc3MgPDwgIlxcLyI7IGJyZWFrOwotICAgIGNhc2UgJ1xiJzogc3MgPDwgIlxcYiI7IGJyZWFrOwotICAgIGNhc2UgJ1xmJzogc3MgPDwgIlxcZiI7IGJyZWFrOwotICAgIGNhc2UgJ1xuJzogc3MgPDwgIlxcbiI7IGJyZWFrOwotICAgIGNhc2UgJ1xyJzogc3MgPDwgIlxcciI7IGJyZWFrOwotICAgIGNhc2UgJ1x0Jzogc3MgPDwgIlxcdCI7IGJyZWFrOwotICAgIGRlZmF1bHQ6IHNzIDw8ICppdGVyOyBicmVhazsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHNzLnN0cigpOwotfQotCi12b2lkIHRfanNvbl9nZW5lcmF0b3I6OnN0YXJ0X29iamVjdCgpewotICBmX2pzb25fIDw8ICJ7IjsKLSAgX2NvbW1hTmVlZGVkLnB1c2goZmFsc2UpOwotfQotCi12b2lkIHRfanNvbl9nZW5lcmF0b3I6OnN0YXJ0X2FycmF5KCl7Ci0gIGZfanNvbl8gPDwgIlsiOwotICBfY29tbWFOZWVkZWQucHVzaChmYWxzZSk7Ci19Ci0KLXZvaWQgdF9qc29uX2dlbmVyYXRvcjo6d3JpdGVfY29tbWFfaWZfbmVlZGVkKCl7Ci0gIGlmIChfY29tbWFOZWVkZWQudG9wKCkpIGZfanNvbl8gPDwgIiwiOwotfQotCi12b2lkIHRfanNvbl9nZW5lcmF0b3I6OmluZGljYXRlX2NvbW1hX25lZWRlZCgpewotICBfY29tbWFOZWVkZWQucG9wKCk7Ci0gIF9jb21tYU5lZWRlZC5wdXNoKHRydWUpOwotfQotCi12b2lkIHRfanNvbl9nZW5lcmF0b3I6OndyaXRlX2tleShzdHJpbmcga2V5LCBzdHJpbmcgdmFsKXsKLSAgd3JpdGVfY29tbWFfaWZfbmVlZGVkKCk7Ci0gIGZfanNvbl8gPDwgcXVvdCA8PCBrZXkgPDwgcXVvdCA8PCAiOiIgPDwgcXVvdCA8PCBlc2NhcGVKc29uU3RyaW5nKHZhbCkgPDwgcXVvdDsKLSAgaW5kaWNhdGVfY29tbWFfbmVlZGVkKCk7Ci19Ci0KLXZvaWQgdF9qc29uX2dlbmVyYXRvcjo6d3JpdGVfa2V5X2ludChzdHJpbmcga2V5LCBpbnQgdmFsKXsKLSAgd3JpdGVfY29tbWFfaWZfbmVlZGVkKCk7Ci0gIGZfanNvbl8gPDwgcXVvdCA8PCBrZXkgPDwgcXVvdCA8PCAiOiIgPDwgcXVvdCA8PCB2YWwgPDwgcXVvdDsKLSAgaW5kaWNhdGVfY29tbWFfbmVlZGVkKCk7Ci19Ci0KLXZvaWQgdF9qc29uX2dlbmVyYXRvcjo6ZW5kX29iamVjdChib29sIG5ld0xpbmUpewotICBmX2pzb25fIDw8ICJ9IjsKLSAgaWYgKG5ld0xpbmUpIGZfanNvbl8gPDwgZW5kbDsKLSAgX2NvbW1hTmVlZGVkLnBvcCgpOwotfQotCi12b2lkIHRfanNvbl9nZW5lcmF0b3I6OmVuZF9hcnJheShib29sIG5ld0xpbmUpewotICBmX2pzb25fIDw8ICJdIjsKLSAgaWYgKG5ld0xpbmUpIGZfanNvbl8gPDwgZW5kbDsKLSAgX2NvbW1hTmVlZGVkLnBvcCgpOwotfQotCi12b2lkIHRfanNvbl9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKLSAgZl9qc29uXy5jbG9zZSgpOwotfQotCi12b2lkIHRfanNvbl9nZW5lcmF0b3I6Om1lcmdlX2luY2x1ZGVzKHRfcHJvZ3JhbSAqIHByb2dyYW0pIHsKLSAgdmVjdG9yPHRfcHJvZ3JhbSo+IGluY2x1ZGVzID0gcHJvZ3JhbS0+Z2V0X2luY2x1ZGVzKCk7Ci0gIHZlY3Rvcjx0X3Byb2dyYW0qPjo6aXRlcmF0b3IgaW5jX2l0ZXI7Ci0gIGZvciAoaW5jX2l0ZXIgPSBpbmNsdWRlcy5iZWdpbigpOyBpbmNfaXRlciAhPSBpbmNsdWRlcy5lbmQoKTsgKytpbmNfaXRlcil7Ci0gICAgdF9wcm9ncmFtKiBpbmNsdWRlID0gKmluY19pdGVyOwotICAgIC8vcmVjdXJzZSBpbiBjYXNlIHdlIGdldCBjcmF6eQotICAgIG1lcmdlX2luY2x1ZGVzKGluY2x1ZGUpOwotICAgIC8vbWVyZ2UgZW51bXMKLSAgICB2ZWN0b3I8dF9lbnVtKj4gZW51bXMgPSBpbmNsdWRlLT5nZXRfZW51bXMoKTsKLSAgICB2ZWN0b3I8dF9lbnVtKj46Oml0ZXJhdG9yIGVuX2l0ZXI7Ci0gICAgZm9yIChlbl9pdGVyID0gZW51bXMuYmVnaW4oKTsgZW5faXRlciAhPSBlbnVtcy5lbmQoKTsgKytlbl9pdGVyKSB7Ci0gICAgICBwcm9ncmFtLT5hZGRfZW51bSgqZW5faXRlcik7Ci0gICAgfQotICAgIC8vbWVyZ2UgdHlwZWRlZnMKLSAgICB2ZWN0b3I8dF90eXBlZGVmKj4gdHlwZWRlZnMgPSBpbmNsdWRlLT5nZXRfdHlwZWRlZnMoKTsKLSAgICB2ZWN0b3I8dF90eXBlZGVmKj46Oml0ZXJhdG9yIHRkX2l0ZXI7Ci0gICAgZm9yICh0ZF9pdGVyID0gdHlwZWRlZnMuYmVnaW4oKTsgdGRfaXRlciAhPSB0eXBlZGVmcy5lbmQoKTsgKyt0ZF9pdGVyKSB7Ci0gICAgICBwcm9ncmFtLT5hZGRfdHlwZWRlZigqdGRfaXRlcik7Ci0gICAgfQotICAgIC8vbWVyZ2Ugc3RydWN0cwotICAgIHZlY3Rvcjx0X3N0cnVjdCo+IG9iamVjdHMgPSBpbmNsdWRlLT5nZXRfb2JqZWN0cygpOwotICAgIHZlY3Rvcjx0X3N0cnVjdCo+OjppdGVyYXRvciBvX2l0ZXI7Ci0gICAgZm9yIChvX2l0ZXIgPSBvYmplY3RzLmJlZ2luKCk7IG9faXRlciAhPSBvYmplY3RzLmVuZCgpOyArK29faXRlcikgewotICAgICAgcHJvZ3JhbS0+YWRkX3N0cnVjdCgqb19pdGVyKTsKLSAgICB9Ci0gICAgLy9tZXJnZSBjb25zdGFudHMKLSAgICB2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyA9IGluY2x1ZGUtPmdldF9jb25zdHMoKTsKLSAgICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7Ci0gICAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpewotICAgICAgcHJvZ3JhbS0+YWRkX2NvbnN0KCpjX2l0ZXIpOwotICAgIH0KLQotICAgIC8vIEdlbmVyYXRlIHNlcnZpY2VzCi0gICAgdmVjdG9yPHRfc2VydmljZSo+IHNlcnZpY2VzID0gaW5jbHVkZS0+Z2V0X3NlcnZpY2VzKCk7Ci0gICAgdmVjdG9yPHRfc2VydmljZSo+OjppdGVyYXRvciBzdl9pdGVyOwotICAgIGZvciAoc3ZfaXRlciA9IHNlcnZpY2VzLmJlZ2luKCk7IHN2X2l0ZXIgIT0gc2VydmljZXMuZW5kKCk7ICsrc3ZfaXRlcikgewotICAgICAgcHJvZ3JhbS0+YWRkX3NlcnZpY2UoKnN2X2l0ZXIpOwotICAgIH0KLSAgfQotfQotCi12b2lkIHRfanNvbl9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2dyYW0oKSB7Ci0gIC8vIEluaXRpYWxpemUgdGhlIGdlbmVyYXRvcgotICBpbml0X2dlbmVyYXRvcigpOwotICBzdGFydF9vYmplY3QoKTsKLQotICB3cml0ZV9rZXkoIm5hbWUiLCBwcm9ncmFtXy0+Z2V0X25hbWUoKSk7Ci0gIGlmIChwcm9ncmFtXy0+aGFzX2RvYygpKSB3cml0ZV9rZXkoImRvYyIsIHByb2dyYW1fLT5nZXRfZG9jKCkpOwotCi0gIC8vIEdlbmVyYXRlIGVudW1zCi0gIHZlY3Rvcjx0X2VudW0qPiBlbnVtcyA9IHByb2dyYW1fLT5nZXRfZW51bXMoKTsKLSAgdmVjdG9yPHRfZW51bSo+OjppdGVyYXRvciBlbl9pdGVyOwotICBmX2pzb25fIDw8ICIsXCJlbnVtc1wiOiI7Ci0gIHN0YXJ0X2FycmF5KCk7Ci0gIGZfanNvbl8gPDwgZW5kbDsKLSAgZm9yIChlbl9pdGVyID0gZW51bXMuYmVnaW4oKTsgZW5faXRlciAhPSBlbnVtcy5lbmQoKTsgKytlbl9pdGVyKSB7Ci0gICAgd3JpdGVfY29tbWFfaWZfbmVlZGVkKCk7Ci0gICAgZ2VuZXJhdGVfZW51bSgqZW5faXRlcik7Ci0gICAgaW5kaWNhdGVfY29tbWFfbmVlZGVkKCk7Ci0gIH0KLSAgZW5kX2FycmF5KHRydWUpOwotCi0gIC8vIEdlbmVyYXRlIHR5cGVkZWZzCi0gIHZlY3Rvcjx0X3R5cGVkZWYqPiB0eXBlZGVmcyA9IHByb2dyYW1fLT5nZXRfdHlwZWRlZnMoKTsKLSAgdmVjdG9yPHRfdHlwZWRlZio+OjppdGVyYXRvciB0ZF9pdGVyOwotICBmX2pzb25fIDw8ICIsXCJ0eXBlZGVmc1wiOiI7Ci0gIHN0YXJ0X2FycmF5KCk7Ci0gIGZfanNvbl8gPDwgZW5kbDsKLSAgZm9yICh0ZF9pdGVyID0gdHlwZWRlZnMuYmVnaW4oKTsgdGRfaXRlciAhPSB0eXBlZGVmcy5lbmQoKTsgKyt0ZF9pdGVyKSB7Ci0gICAgd3JpdGVfY29tbWFfaWZfbmVlZGVkKCk7Ci0gICAgZ2VuZXJhdGVfdHlwZWRlZigqdGRfaXRlcik7Ci0gICAgaW5kaWNhdGVfY29tbWFfbmVlZGVkKCk7Ci0gIH0KLSAgZW5kX2FycmF5KHRydWUpOwotCi0gIC8vIEdlbmVyYXRlIHN0cnVjdHMsIGV4Y2VwdGlvbnMsIGFuZCB1bmlvbnMgaW4gZGVjbGFyZWQgb3JkZXIKLSAgdmVjdG9yPHRfc3RydWN0Kj4gb2JqZWN0cyA9IHByb2dyYW1fLT5nZXRfb2JqZWN0cygpOwotICB2ZWN0b3I8dF9zdHJ1Y3QqPjo6aXRlcmF0b3Igb19pdGVyOwotICBmX2pzb25fIDw8ICIsXCJzdHJ1Y3RzXCI6IjsKLSAgc3RhcnRfYXJyYXkoKTsKLSAgZl9qc29uXyA8PCBlbmRsOwotICBmb3IgKG9faXRlciA9IG9iamVjdHMuYmVnaW4oKTsgb19pdGVyICE9IG9iamVjdHMuZW5kKCk7ICsrb19pdGVyKSB7Ci0gICAgd3JpdGVfY29tbWFfaWZfbmVlZGVkKCk7Ci0gICAgaWYgKCgqb19pdGVyKS0+aXNfeGNlcHRpb24oKSkgewotICAgICAgZ2VuZXJhdGVfeGNlcHRpb24oKm9faXRlcik7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgZ2VuZXJhdGVfc3RydWN0KCpvX2l0ZXIpOwotICAgIH0KLSAgICBpbmRpY2F0ZV9jb21tYV9uZWVkZWQoKTsKLSAgfQotICBlbmRfYXJyYXkodHJ1ZSk7Ci0KLSAgLy8gR2VuZXJhdGUgY29uc3RhbnRzCi0gIHZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzID0gcHJvZ3JhbV8tPmdldF9jb25zdHMoKTsKLSAgZ2VuZXJhdGVfY29uc3RzKGNvbnN0cyk7Ci0KLSAgLy8gR2VuZXJhdGUgc2VydmljZXMKLSAgdmVjdG9yPHRfc2VydmljZSo+IHNlcnZpY2VzID0gcHJvZ3JhbV8tPmdldF9zZXJ2aWNlcygpOwotICB2ZWN0b3I8dF9zZXJ2aWNlKj46Oml0ZXJhdG9yIHN2X2l0ZXI7Ci0gIGZfanNvbl8gPDwgIixcInNlcnZpY2VzXCI6IjsKLSAgc3RhcnRfYXJyYXkoKTsKLSAgZl9qc29uXyA8PCBlbmRsOwotICBmb3IgKHN2X2l0ZXIgPSBzZXJ2aWNlcy5iZWdpbigpOyBzdl9pdGVyICE9IHNlcnZpY2VzLmVuZCgpOyArK3N2X2l0ZXIpIHsKLSAgICB3cml0ZV9jb21tYV9pZl9uZWVkZWQoKTsKLSAgICBzZXJ2aWNlX25hbWVfID0gZ2V0X3NlcnZpY2VfbmFtZSgqc3ZfaXRlcik7Ci0gICAgZ2VuZXJhdGVfc2VydmljZSgqc3ZfaXRlcik7Ci0gICAgaW5kaWNhdGVfY29tbWFfbmVlZGVkKCk7Ci0gIH0KLSAgZW5kX2FycmF5KGZhbHNlKTsKLSAgZW5kX29iamVjdCh0cnVlKTsKLSAgLy8gQ2xvc2UgdGhlIGdlbmVyYXRvcgotICBjbG9zZV9nZW5lcmF0b3IoKTsKLX0KLQotdm9pZCB0X2pzb25fZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpewotICBzdGFydF9vYmplY3QoKTsKLSAgd3JpdGVfa2V5KCJuYW1lIiwgdHR5cGVkZWYtPmdldF9uYW1lKCkpOwotICB3cml0ZV9rZXkoInR5cGUiLCBnZXRfdHlwZV9uYW1lKHR0eXBlZGVmLT5nZXRfdHJ1ZV90eXBlKCkpKTsKLSAgaWYgKHR0eXBlZGVmLT5oYXNfZG9jKCkpIHdyaXRlX2tleSgiZG9jIiwgdHR5cGVkZWYtPmdldF9kb2MoKSk7Ci0gIGVuZF9vYmplY3QodHJ1ZSk7Ci19Ci0KLXZvaWQgdF9qc29uX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3RzKHZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKXsKLSAgdmVjdG9yPHRfY29uc3QqPjo6aXRlcmF0b3IgY19pdGVyOwotICBmX2pzb25fIDw8ICIsXCJjb25zdGFudHNcIjoiOwotICBzdGFydF9hcnJheSgpOwotICBmX2pzb25fIDw8IGVuZGw7Ci0gIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgd3JpdGVfY29tbWFfaWZfbmVlZGVkKCk7Ci0gICAgaW5kaWNhdGVfY29tbWFfbmVlZGVkKCk7Ci0gICAgc3RhcnRfb2JqZWN0KCk7Ci0gICAgdF9jb25zdCogY29uID0gKCpjX2l0ZXIpOwotICAgIHdyaXRlX2tleSgibmFtZSIsIGNvbi0+Z2V0X25hbWUoKSk7Ci0gICAgd3JpdGVfa2V5KCJ0eXBlIiwgZ2V0X3R5cGVfbmFtZShjb24tPmdldF90eXBlKCkpKTsKLSAgICBpZiAoY29uLT5oYXNfZG9jKCkpIHdyaXRlX2tleSgiZG9jIiwgY29uLT5nZXRfZG9jKCkpOwotICAgIHdyaXRlX2tleSgidmFsdWUiLCBnZXRfY29uc3RfdmFsdWUoY29uLT5nZXRfdmFsdWUoKSkpOwotICAgIGVuZF9vYmplY3QodHJ1ZSk7Ci0gIH0KLSAgZW5kX2FycmF5KHRydWUpOwotfQotCi12b2lkIHRfanNvbl9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgewotICBzdGFydF9vYmplY3QoKTsKLSAgd3JpdGVfa2V5KCJuYW1lIiwgdGVudW0tPmdldF9uYW1lKCkpOwotICBpZiAodGVudW0tPmhhc19kb2MoKSkgd3JpdGVfa2V5KCJkb2MiLCB0ZW51bS0+Z2V0X2RvYygpKTsKLSAgZl9qc29uXyA8PCAiLFwibWVtYmVyc1wiOiI7Ci0gIHN0YXJ0X2FycmF5KCk7Ci0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiB2YWx1ZXMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOwotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIHZhbF9pdGVyOwotICBmb3IgKHZhbF9pdGVyID0gdmFsdWVzLmJlZ2luKCk7IHZhbF9pdGVyICE9IHZhbHVlcy5lbmQoKTsgKyt2YWxfaXRlcikgewotICAgIHRfZW51bV92YWx1ZSogdmFsID0gKCp2YWxfaXRlcik7Ci0gICAgd3JpdGVfY29tbWFfaWZfbmVlZGVkKCk7Ci0gICAgc3RhcnRfb2JqZWN0KCk7Ci0gICAgd3JpdGVfa2V5KCJuYW1lIiwgdmFsLT5nZXRfbmFtZSgpKTsKLSAgICB3cml0ZV9rZXlfaW50KCJ2YWx1ZSIsIHZhbC0+Z2V0X3ZhbHVlKCkpOwotICAgIGlmICh2YWwtPmhhc19kb2MoKSkgd3JpdGVfa2V5KCJkb2MiLCB2YWwtPmdldF9kb2MoKSk7Ci0gICAgZW5kX29iamVjdChmYWxzZSk7Ci0gICAgaW5kaWNhdGVfY29tbWFfbmVlZGVkKCk7Ci0gIH0KLSAgZW5kX2FycmF5KGZhbHNlKTsKLSAgZW5kX29iamVjdCh0cnVlKTsKLX0KLQotdm9pZCB0X2pzb25fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpewotICBzdGFydF9vYmplY3QoKTsKLSAgd3JpdGVfa2V5KCJuYW1lIiwgdHN0cnVjdC0+Z2V0X25hbWUoKSk7Ci0gIGlmICh0c3RydWN0LT5oYXNfZG9jKCkpIHdyaXRlX2tleSgiZG9jIiwgdHN0cnVjdC0+Z2V0X2RvYygpKTsKLSAgaWYgKHRzdHJ1Y3QtPmlzX3hjZXB0aW9uKCkpIHdyaXRlX2tleSgiaXNFeGNlcHRpb24iLCAidHJ1ZSIpOwotICB2ZWN0b3I8dF9maWVsZCo+IG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+OjppdGVyYXRvciBtZW1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsKLSAgZl9qc29uXyA8PCAiLFwiZmllbGRzXCI6IjsKLSAgc3RhcnRfYXJyYXkoKTsKLSAgZm9yICg7IG1lbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7IG1lbV9pdGVyKyspIHsKLSAgICBnZW5lcmF0ZV9maWVsZCgoKm1lbV9pdGVyKSk7Ci0gIH0KLSAgZW5kX2FycmF5KGZhbHNlKTsKLSAgZW5kX29iamVjdCh0cnVlKTsKLX0KLQotdm9pZCB0X2pzb25fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpewotICBzdGFydF9vYmplY3QoKTsKLSAgd3JpdGVfa2V5KCJuYW1lIiwgdHNlcnZpY2UtPmdldF9uYW1lKCkpOwotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpIHdyaXRlX2tleSgiZXh0ZW5kc1R5cGUiLCB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSk7Ci0gIGlmICh0c2VydmljZS0+aGFzX2RvYygpKSB3cml0ZV9rZXkoImRvYyIsIHRzZXJ2aWNlLT5nZXRfZG9jKCkpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZuX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsKLSAgZl9qc29uXyA8PCAiLFwiZnVuY3Rpb25zXCI6IjsKLSAgc3RhcnRfYXJyYXkoKTsKLSAgZm9yICg7IGZuX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyBmbl9pdGVyKyspIHsKLSAgICB0X2Z1bmN0aW9uKiBmdW5jID0gKCpmbl9pdGVyKTsKLSAgICB3cml0ZV9jb21tYV9pZl9uZWVkZWQoKTsKLSAgICBpbmRpY2F0ZV9jb21tYV9uZWVkZWQoKTsKLSAgICBnZW5lcmF0ZV9mdW5jdGlvbihmdW5jKTsKLSAgfQotICBlbmRfYXJyYXkoZmFsc2UpOwotICBlbmRfb2JqZWN0KHRydWUpOwotfQotCi12b2lkIHRfanNvbl9nZW5lcmF0b3I6OmdlbmVyYXRlX2Z1bmN0aW9uKHRfZnVuY3Rpb24qIHRmdW5jKXsKLSAgc3RhcnRfb2JqZWN0KCk7Ci0gIHdyaXRlX2tleSgibmFtZSIsIHRmdW5jLT5nZXRfbmFtZSgpKTsKLSAgd3JpdGVfa2V5KCJyZXR1cm5UeXBlIiwgZ2V0X3R5cGVfbmFtZSh0ZnVuYy0+Z2V0X3JldHVybnR5cGUoKSkpOwotICBpZiAodGZ1bmMtPmlzX29uZXdheSgpKSB3cml0ZV9rZXkoIm9uZVdheSIsICJ0cnVlIik7Ci0gIGlmICh0ZnVuYy0+aGFzX2RvYygpKSB3cml0ZV9rZXkoImRvYyIsIHRmdW5jLT5nZXRfZG9jKCkpOwotICB2ZWN0b3I8dF9maWVsZCo+IG1lbWJlcnMgPSB0ZnVuYy0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6aXRlcmF0b3IgbWVtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7Ci0gIGZfanNvbl8gPDwgIixcImFyZ3VtZW50c1wiOiI7Ci0gIHN0YXJ0X2FycmF5KCk7Ci0gIGZvciAoOyBtZW1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyBtZW1faXRlcisrKSB7Ci0gICAgZ2VuZXJhdGVfZmllbGQoKCptZW1faXRlcikpOwotICB9Ci0gIGVuZF9hcnJheShmYWxzZSk7Ci0KLSAgdmVjdG9yPHRfZmllbGQqPiBleGNlcHRzID0gdGZ1bmMtPmdldF94Y2VwdGlvbnMoKS0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6aXRlcmF0b3IgZXhfaXRlciA9IGV4Y2VwdHMuYmVnaW4oKTsKLSAgZl9qc29uXyA8PCAiLFwiZXhjZXB0aW9uc1wiOiI7Ci0gIHN0YXJ0X2FycmF5KCk7Ci0gIGZvciAoOyBleF9pdGVyICE9IGV4Y2VwdHMuZW5kKCk7IGV4X2l0ZXIrKykgewotICAgIGdlbmVyYXRlX2ZpZWxkKCgqZXhfaXRlcikpOwotICB9Ci0gIGVuZF9hcnJheShmYWxzZSk7Ci0gIGVuZF9vYmplY3QoZmFsc2UpOwotfQotCi12b2lkIHRfanNvbl9nZW5lcmF0b3I6OmdlbmVyYXRlX2ZpZWxkKHRfZmllbGQgKiBmaWVsZCl7Ci0gIHdyaXRlX2NvbW1hX2lmX25lZWRlZCgpOwotICBzdGFydF9vYmplY3QoKTsKLSAgd3JpdGVfa2V5X2ludCgiaW5kZXgiLCBmaWVsZC0+Z2V0X2tleSgpKTsKLSAgd3JpdGVfa2V5KCJuYW1lIiwgZmllbGQtPmdldF9uYW1lKCkpOwotICB3cml0ZV9rZXkoInR5cGUiLCBnZXRfdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpKSk7Ci0gIGlmIChmaWVsZC0+aGFzX2RvYygpKSB3cml0ZV9rZXkoImRvYyIsIGZpZWxkLT5nZXRfZG9jKCkpOwotICBzd2l0Y2ggKGZpZWxkLT5nZXRfcmVxKCkpIHsKLSAgICAgICAgY2FzZSB0X2ZpZWxkOjpUX1JFUVVJUkVEOgotICAgICAgICAgICAgd3JpdGVfa2V5KCJyZXF1aXJlZCIsICJ0cnVlIik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHdyaXRlX2tleSgicmVxdWlyZWQiLCAiZmFsc2UiKTsKLSAgICAgICAgICAgIGJyZWFrOwotICB9Ci0gIGlmIChmaWVsZC0+Z2V0X3ZhbHVlKCkpCi0gICAgd3JpdGVfa2V5KCJkZWZhdWx0IiwgZ2V0X2NvbnN0X3ZhbHVlKGZpZWxkLT5nZXRfdmFsdWUoKSkpOwotCi0gIGVuZF9vYmplY3QoZmFsc2UpOwotICBpbmRpY2F0ZV9jb21tYV9uZWVkZWQoKTsKLX0KLXN0cmluZyB0X2pzb25fZ2VuZXJhdG9yOjpnZXRfY29uc3RfdmFsdWUodF9jb25zdF92YWx1ZSogdHZhbHVlKXsKLQotICBzd2l0Y2ggKHR2YWx1ZS0+Z2V0X3R5cGUoKSkgewotICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVI6Ci0gICAgcmV0dXJuIHR2YWx1ZS0+Z2V0X3N0cmluZygpOwotICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX0RPVUJMRToKLSAgICByZXR1cm4gdHZhbHVlLT5nZXRfc3RyaW5nKCk7Ci0gIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfU1RSSU5HOgotICAgIHJldHVybiB0dmFsdWUtPmdldF9zdHJpbmcoKTsKLSAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9MSVNUOgotICB7Ci0gICAgc3RyaW5nIGxpc3QgPSAiWyI7Ci0gICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiBsaXN0X2VsZW1zID0gdHZhbHVlLT5nZXRfbGlzdCgpOzsKLSAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+OjppdGVyYXRvciBsaXN0X2l0ZXI7Ci0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgZm9yIChsaXN0X2l0ZXIgPSBsaXN0X2VsZW1zLmJlZ2luKCk7IGxpc3RfaXRlciAhPSBsaXN0X2VsZW1zLmVuZCgpOyBsaXN0X2l0ZXIrKykgewotICAgICAgaWYgKCFmaXJzdClsaXN0ICs9ICIsIjsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICBsaXN0ICs9IGdldF9jb25zdF92YWx1ZSgqbGlzdF9pdGVyKTsKLSAgICB9Ci0gICAgcmV0dXJuIGxpc3QgKyAiXSI7Ci0gIH0KLSAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9JREVOVElGSUVSOgotICAgIHJldHVybiB0dmFsdWUtPmdldF9pZGVudGlmaWVyX25hbWUoKTsKLSAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9NQVA6Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4gbWFwX2VsZW1zID0gdHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46Oml0ZXJhdG9yIG1hcF9pdGVyOwotICAgIHN0cmluZyBtYXAgPSAiWyI7Ci0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgZm9yIChtYXBfaXRlciA9IG1hcF9lbGVtcy5iZWdpbigpOyBtYXBfaXRlciAhPSBtYXBfZWxlbXMuZW5kKCk7IG1hcF9pdGVyKyspIHsKLSAgICAgIGlmICghZmlyc3QpIG1hcCArPSAiLCI7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgbWFwICs9IGdldF9jb25zdF92YWx1ZShtYXBfaXRlci0+Zmlyc3QpICsgIjoiOwotICAgICAgbWFwICs9IGdldF9jb25zdF92YWx1ZShtYXBfaXRlci0+c2Vjb25kKTsKLSAgICB9Ci0gICAgcmV0dXJuIG1hcCArICJdIjsKLSAgfQotICByZXR1cm4gIlVOS05PV04iOwotfQotc3RyaW5nIHRfanNvbl9nZW5lcmF0b3I6OmdldF90eXBlX25hbWUodF90eXBlKiB0dHlwZSl7Ci0gIGlmICh0dHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgcmV0dXJuICJsaXN0PCIgKyBnZXRfdHlwZV9uYW1lKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgKyAiPiI7Ci0gICAgfQotICAgIGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgICAgcmV0dXJuICJzZXQ8IiArIGdldF90eXBlX25hbWUoKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpICsgIj4iOwotICAgIH0KLSAgICBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICAgIHJldHVybiAibWFwPCIgKyBnZXRfdHlwZV9uYW1lKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpICsKLSAgICAgICAgKyIsIiArIGdldF90eXBlX25hbWUoKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgKyAiPiI7Ci0gICAgfQotICB9Ci0gIGVsc2UgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHJldHVybiAoKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5pc19iaW5hcnkoKSA/ICJiaW5hcnkiIDogdHR5cGUtPmdldF9uYW1lKCkpOwotICB9Ci0gIHJldHVybiB0dHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUihqc29uLCAiSlNPTiIsICIiKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2x1YV9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfbHVhX2dlbmVyYXRvci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzMwM2MyMS4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfbHVhX2dlbmVyYXRvci5jYworKysgL2Rldi9udWxsCkBAIC0xLDEyMzAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlICJ0X29vcF9nZW5lcmF0b3IuaCIKLSNpbmNsdWRlICJwbGF0Zm9ybS5oIgotCi11c2luZyBzdGQ6Om9mc3RyZWFtOwotdXNpbmcgc3RkOjpzdHJpbmc7Ci11c2luZyBzdGQ6OnZlY3RvcjsKLXVzaW5nIHN0ZDo6bWFwOwotCi1zdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAgLy8gYXZvaWQgb3N0cmVhbSA8PCBzdGQ6OmVuZGwgZmx1c2hlcwotCi0vKioKLSAqIExVQSBjb2RlIGdlbmVyYXRvci4KLSAqCi0gKi8KLWNsYXNzIHRfbHVhX2dlbmVyYXRvciA6IHB1YmxpYyB0X29vcF9nZW5lcmF0b3IgewotIHB1YmxpYzoKLSAgdF9sdWFfZ2VuZXJhdG9yKAotICAgICAgdF9wcm9ncmFtKiBwcm9ncmFtLAotICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKLSAgICA6IHRfb29wX2dlbmVyYXRvcihwcm9ncmFtKQotICB7Ci0gICAgKHZvaWQpIG9wdGlvbl9zdHJpbmc7Ci0gICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJvbWl0X3JlcXVpcmVzIik7Ci0gICAgZ2VuX3JlcXVpcmVzXyA9IChpdGVyID09IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLQotICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLWx1YSI7Ci0gIH0KLQotICAvKioKLSAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcwotICAgKi8KLSAgdm9pZCBpbml0X2dlbmVyYXRvcigpOwotICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOwotCi0gIC8qKgotICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCi0gICAqLwotICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYgICh0X3R5cGVkZWYqICB0dHlwZWRlZik7Ci0gIHZvaWQgZ2VuZXJhdGVfZW51bSAgICAgKHRfZW51bSogICAgIHRlbnVtKTsKLSAgdm9pZCBnZW5lcmF0ZV9jb25zdCAgICAodF9jb25zdCogICAgdGNvbnN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QgICAodF9zdHJ1Y3QqICAgdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24gKHRfc3RydWN0KiAgIHR4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZSAgKHRfc2VydmljZSogIHRzZXJ2aWNlKTsKLQotICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7Ci0KLSBwcml2YXRlOgotCi0gIC8qKgotICAgKiBUcnVlIGlmZiB3ZSBzaG91bGQgZ2VuZXJhdGUgbHVhIHJlcXVpcmUgc3RhdGVtZW50cy4KLSAgICovCi0gIGJvb2wgZ2VuX3JlcXVpcmVzXzsKLQotICAvKioKLSAgICogU3RydWN0LWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCi0gICAqLwotICB2b2lkIGdlbmVyYXRlX2x1YV9zdHJ1Y3RfZGVmaW5pdGlvbigKLSAgICBzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX3hjZXB0aW9uPWZhbHNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9sdWFfc3RydWN0X3JlYWRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9sdWFfc3RydWN0X3dyaXRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLQotICAvKioKLSAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSAoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3NvciAoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uICAoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyAgIChvZnN0cmVhbSAmb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzICAob2ZzdHJlYW0gJm91dCwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLQotICAvKioKLSAgICogRGVzZXJpYWxpemF0aW9uIChSZWFkKQotICAgKi8KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZCgKLSAgICBzdGQ6Om9mc3RyZWFtICZvdXQsIHRfZmllbGQgKnRmaWVsZCwgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdCgKLSAgICBzdGQ6Om9mc3RyZWFtICZvdXQsIHRfc3RydWN0ICp0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKAotICAgIHN0ZDo6b2ZzdHJlYW0gJm91dCwgdF90eXBlICp0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KAotICAgIHN0ZDo6b2ZzdHJlYW0gJm91dCwgdF9zZXQgKnRzZXQsIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudCgKLSAgICBzdGQ6Om9mc3RyZWFtICZvdXQsIHRfbWFwICp0bWFwLCBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KAotICAgIHN0ZDo6b2ZzdHJlYW0gJm91dCwgdF9saXN0ICp0bGlzdCwgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICAvKioKLSAgICogU2VyaWFsaXphdGlvbiAoV3JpdGUpCi0gICAqLwotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZCgKLSAgICBzdGQ6Om9mc3RyZWFtICZvdXQsIHRfZmllbGQgKnRmaWVsZCwgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3QoCi0gICAgc3RkOjpvZnN0cmVhbSAmb3V0LCB0X3N0cnVjdCAqdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIoCi0gICAgc3RkOjpvZnN0cmVhbSAmb3V0LCB0X3R5cGUgKnR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KAotICAgIHN0ZDo6b2ZzdHJlYW0gJm91dCwgdF9tYXAgKnRtYXAsIHN0ZDo6c3RyaW5nIGtpdGVyLCBzdGQ6OnN0cmluZyB2aXRlcik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQoCi0gICAgc3RkOjpvZnN0cmVhbSAmb3V0LCB0X3NldCAqdG1hcCwgc3RkOjpzdHJpbmcgaXRlcik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KAotICAgIHN0ZDo6b2ZzdHJlYW0gJm91dCwgdF9saXN0ICp0bGlzdCwgc3RkOjpzdHJpbmcgaXRlcik7Ci0KLSAgLyoqCi0gICAqIEhlbHBlciByZW5kZXJpbmcgZnVuY3Rpb25zCi0gICAqLwotICBzdGQ6OnN0cmluZyBsdWFfaW5jbHVkZXMoKTsKLSAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLSAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLSAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOwotICBzdGF0aWMgc3RkOjpzdHJpbmcgZ2V0X25hbWVzcGFjZShjb25zdCB0X3Byb2dyYW0qIHByb2dyYW0pOwotCi0gIHN0ZDo6c3RyaW5nIGF1dG9nZW5fY29tbWVudCgpIHsKLSAgICByZXR1cm4KLSAgICAgIHN0ZDo6c3RyaW5nKCItLVxuIikgKwotICAgICAgIi0tIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0XG4iICsKLSAgICAgICItLVxuIiArCi0gICAgICAiLS0gRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lOR1xuIiArCi0gICAgICAiLS0gQCIiZ2VuZXJhdGVkXG4iICsKLSAgICAgICItLVxuIjsKLSAgfQotCi0gIC8qKgotICAgKiBGaWxlIHN0cmVhbXMKLSAgICovCi0gIHN0ZDo6b2ZzdHJlYW0gZl90eXBlc187Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9jb25zdHNfOwotICBzdGQ6Om9mc3RyZWFtIGZfc2VydmljZV87Ci19OwotCi0KLS8qKgotICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcwotICovCi12b2lkIHRfbHVhX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQotICBzdHJpbmcgb3V0ZGlyID0gZ2V0X291dF9kaXIoKTsKLSAgTUtESVIob3V0ZGlyLmNfc3RyKCkpOwotCi0gIC8vIE1ha2Ugb3V0cHV0IGZpbGVzCi0gIHN0cmluZyBjdXJfbmFtZXNwYWNlID0gZ2V0X25hbWVzcGFjZShwcm9ncmFtXyk7Ci0gIHN0cmluZyBmX2NvbnN0c19uYW1lID0gb3V0ZGlyICsgY3VyX25hbWVzcGFjZSArICJjb25zdGFudHMubHVhIjsKLSAgZl9jb25zdHNfLm9wZW4oZl9jb25zdHNfbmFtZS5jX3N0cigpKTsKLSAgc3RyaW5nIGZfdHlwZXNfbmFtZSA9IG91dGRpciArIGN1cl9uYW1lc3BhY2UgKyAidHR5cGVzLmx1YSI7Ci0gIGZfdHlwZXNfLm9wZW4oZl90eXBlc19uYW1lLmNfc3RyKCkpOwotCi0gIC8vIEFkZCBoZWFkZXJzCi0gIGZfY29uc3RzXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBsdWFfaW5jbHVkZXMoKTsKLSAgZl90eXBlc18gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgbHVhX2luY2x1ZGVzKCk7Ci0gIGlmIChnZW5fcmVxdWlyZXNfKSB7Ci0gICAgZl90eXBlc18gPDwgZW5kbCA8PCAicmVxdWlyZSAnIiA8PCBjdXJfbmFtZXNwYWNlIDw8ICJjb25zdGFudHMnIjsKLSAgfQotfQotCi12b2lkIHRfbHVhX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgewotICAvLyBDbG9zZSB0eXBlcyBmaWxlCi0gIGZfdHlwZXNfLmNsb3NlKCk7Ci0gIGZfY29uc3RzXy5jbG9zZSgpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlIGEgdHlwZWRlZiAoZXNzZW50aWFsbHkgYSBjb25zdGFudCkKLSAqLwotdm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgewotICBmX3R5cGVzXwotICAgIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgIDw8IHR0eXBlZGVmLT5nZXRfc3ltYm9saWMoKSA8PCAiID0gIgotICAgIDw8IHR0eXBlZGVmLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBjb2RlIGZvciBhbiBlbnVtZXJhdGVkIHR5cGUgKHRhYmxlKQotICovCi12b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7Ci0gIGZfdHlwZXNfIDw8IGVuZGwgPDwgZW5kbCA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiID0geyIgPDwgZW5kbDsKLQotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7Ci0gIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7KSB7Ci0gICAgaW50MzJfdCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0KLSAgICBmX3R5cGVzXyA8PCAiICAiIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCB2YWx1ZTsKLSAgICArK2NfaXRlcjsKLSAgICBpZiAoY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKSkgewotICAgICAgZl90eXBlc18gPDwgIiwiOwotICAgIH0KLSAgICBmX3R5cGVzXyA8PCBlbmRsOwotICB9Ci0gIGZfdHlwZXNfIDw8ICJ9IjsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZSBhIGNvbnN0YW50IChub24tbG9jYWwpIHZhbHVlCi0gKi8KLXZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpIHsKLSAgdF90eXBlKiB0eXBlID0gdGNvbnN0LT5nZXRfdHlwZSgpOwotICBzdHJpbmcgbmFtZSA9IHRjb25zdC0+Z2V0X25hbWUoKTsKLSAgdF9jb25zdF92YWx1ZSogdmFsdWUgPSB0Y29uc3QtPmdldF92YWx1ZSgpOwotCi0gIGZfY29uc3RzXyA8PCBlbmRsIDw8IGVuZGwgPDwgbmFtZSA8PCAiID0gIjsKLSAgZl9jb25zdHNfIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0eXBlLCB2YWx1ZSk7Ci19Ci0KLS8qKgotICogUHJpbnRzIHRoZSB2YWx1ZSBvZiBhIGNvbnN0YW50IHdpdGggdGhlIGdpdmVuIHR5cGUuCi0gKi8KLXN0cmluZyB0X2x1YV9nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZSgKLSAgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgewotICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OwotCi0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgb3V0IDw8ICInIiA8PCB2YWx1ZS0+Z2V0X3N0cmluZygpIDw8ICInIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIG91dCA8PCAodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwID8gInRydWUiIDogImZhbHNlIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIG91dCA8PCAibHVhbG9uZ251bWJlci5uZXcoJyIgPDwgdmFsdWUtPmdldF9zdHJpbmcoKSA8PCAiJykiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgewotICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiCi0gICAgICAgICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBvdXQgPDwgdHlwZS0+Z2V0X25hbWUoKSA8PCAiID0geyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7KSB7Ci0gICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOwotICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKLSAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7Ci0gICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIKLSAgICAgICAgICArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKLSAgICAgIH0KLQotICAgICAgaW5kZW50KG91dCk7Ci0gICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGdfdHlwZV9zdHJpbmcsIHZfaXRlci0+Zmlyc3QpOwotICAgICAgb3V0IDw8ICIgPSAiOwotICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgICArK3ZfaXRlcjsKLSAgICAgIGlmICh2X2l0ZXIgIT0gdmFsLmVuZCgpKSB7Ci0gICAgICAgIG91dCA8PCAiLCI7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgb3V0IDw8ICJ9IjsKLSAgICBpbmRlbnRfZG93bigpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgb3V0IDw8IHR5cGUtPmdldF9uYW1lKCkgPDwgInsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOwotICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0KLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7KSB7Ci0gICAgICBpbmRlbnQob3V0KQotICAgICAgICA8PCAiWyIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGt0eXBlLCB2X2l0ZXItPmZpcnN0KSA8PCAiXSA9ICIKLSAgICAgICAgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHZ0eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgICArK3ZfaXRlcjsKLSAgICAgIGlmICh2X2l0ZXIgIT0gdmFsLmVuZCgpKSB7Ci0gICAgICAgIG91dCA8PCAiLCI7Ci0gICAgICB9Ci0gICAgICBvdXQgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgdF90eXBlKiBldHlwZTsKLSAgICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgfQotICAgIG91dCA8PCB0eXBlLT5nZXRfbmFtZSgpIDw8ICIgPSB7IiA8PCBlbmRsOwotICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOwotICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOykgewotICAgICAgaW5kZW50KG91dCk7Ci0gICAgICBvdXQgPDwgIlsiIDw8IHJlbmRlcl9jb25zdF92YWx1ZShldHlwZSwgKnZfaXRlcikgPDwgIl0iOwotICAgICAgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgICAgIG91dCA8PCAiID0gdHJ1ZSI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgIiA9IGZhbHNlIjsKLSAgICAgIH0KLSAgICAgICsrdl9pdGVyOwotICAgICAgaWYgKHZfaXRlciAhPSB2YWwuZW5kKCkpIHsKLSAgICAgICAgb3V0IDw8ICIsIiA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLSAgICBvdXQgPDwgIn0iOwotICB9Ci0gIHJldHVybiBvdXQuc3RyKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGUgYSB0aHJpZnQgc3RydWN0Ci0gKi8KLXZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgZ2VuZXJhdGVfbHVhX3N0cnVjdF9kZWZpbml0aW9uKGZfdHlwZXNfLCB0c3RydWN0LCBmYWxzZSk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGUgYSB0aHJpZnQgZXhjZXB0aW9uCi0gKi8KLXZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7Ci0gIGdlbmVyYXRlX2x1YV9zdHJ1Y3RfZGVmaW5pdGlvbihmX3R5cGVzXywgdHhjZXB0aW9uLCB0cnVlKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZSBhIHRocmlmdCBzdHJ1Y3Qgb3IgZXhjZXB0aW9uIChsdWEgdGFibGUpCi0gKi8KLXZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9sdWFfc3RydWN0X2RlZmluaXRpb24ob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QgKnRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgZW5kbCA8PCBlbmRsIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCk7Ci0gIGlmIChpc19leGNlcHRpb24pIHsKLSAgICBvdXQgPDwgIiA9IFRFeGNlcHRpb246bmV3eyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgX190eXBlID0gJyIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiJyI7Ci0gICAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgewotICAgICAgb3V0IDw8ICIsIjsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgb3V0IDw8ICIgPSBfX1RPYmplY3Q6bmV3eyIgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfdXAoKTsKLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOykgewotICAgIGluZGVudChvdXQpOwotICAgIG91dCA8PCAoKm1faXRlciktPmdldF9uYW1lKCk7Ci0gICAgKyttX2l0ZXI7Ci0gICAgaWYgKG1faXRlciAhPSBtZW1iZXJzLmVuZCgpKSB7Ci0gICAgICBvdXQgPDwgIiwiIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpOwotICBvdXQgPDwgZW5kbCA8PCAifSI7Ci0KLSAgZ2VuZXJhdGVfbHVhX3N0cnVjdF9yZWFkZXIob3V0LCB0c3RydWN0KTsKLSAgZ2VuZXJhdGVfbHVhX3N0cnVjdF93cml0ZXIob3V0LCB0c3RydWN0KTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZSBhIHN0cnVjdC9leGNlcHRpb24gcmVhZGVyCi0gKi8KLXZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9sdWFfc3RydWN0X3JlYWRlcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgLy8gZnVuY3Rpb24KLSAgaW5kZW50KG91dCkgPDwgZW5kbCA8PCBlbmRsCi0gICAgPDwgImZ1bmN0aW9uICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiOnJlYWQoaXByb3QpIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQob3V0KSA8PCAiaXByb3Q6cmVhZFN0cnVjdEJlZ2luKCkiIDw8IGVuZGw7Ci0KLSAgLy8gd2hpbGU6IFJlYWQgaW4gZmllbGRzCi0gIGluZGVudChvdXQpIDw8ICJ3aGlsZSB0cnVlIGRvIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotCi0gICAgLy8gaWY6IENoZWNrIHdoYXQgdG8gcmVhZAotICAgIGluZGVudChvdXQpIDw8ICJsb2NhbCBmbmFtZSwgZnR5cGUsIGZpZCA9IGlwcm90OnJlYWRGaWVsZEJlZ2luKCkiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgImlmIGZ0eXBlID09IFRUeXBlLlNUT1AgdGhlbiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgaW5kZW50KG91dCkgPDwgImJyZWFrIiA8PCBlbmRsOwotCi0gICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICBpbmRlbnQob3V0KQotICAgICAgICAgIDw8ICJlbHNlaWYgZmlkID09ICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIiB0aGVuIiA8PCBlbmRsOwotICAgICAgICAgIGluZGVudF91cCgpOwotICAgICAgICAgIGluZGVudChvdXQpCi0gICAgICAgICAgICA8PCAiaWYgZnR5cGUgPT0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKQotICAgICAgICAgICAgPDwgIiB0aGVuIiA8PCBlbmRsOwotICAgICAgICAgICAgaW5kZW50X3VwKCk7Ci0KLSAgICAgICAgICAgIC8vIFJlYWQgZmllbGQgY29udGVudHMKLSAgICAgICAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInNlbGYuIik7Ci0KLSAgICAgICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICAgICAgaW5kZW50KG91dCkgPDwgImVsc2UiIDw8IGVuZGw7Ci0gICAgICAgICAgaW5kZW50KG91dCkgPDwgIiAgaXByb3Q6c2tpcChmdHlwZSkiIDw8IGVuZGw7Ci0gICAgICAgICAgaW5kZW50KG91dCkgPDwgImVuZCIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgIC8vIGVuZCBpZgotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgImVsc2UiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgaXByb3Q6c2tpcChmdHlwZSkiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgImVuZCIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiaXByb3Q6cmVhZEZpZWxkRW5kKCkiIDw8IGVuZGw7Ci0KLSAgLy8gZW5kIHdoaWxlCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgImVuZCIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgImlwcm90OnJlYWRTdHJ1Y3RFbmQoKSIgPDwgZW5kbDsKLQotICAvLyBlbmQgZnVuY3Rpb24KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCk7Ci0gIG91dCA8PCAiZW5kIjsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZSBhIHN0cnVjdC9leGNlcHRpb24gd3JpdGVyCi0gKi8KLXZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9sdWFfc3RydWN0X3dyaXRlcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgLy8gZnVuY3Rpb24KLSAgaW5kZW50KG91dCkgPDwgZW5kbCA8PCBlbmRsCi0gICAgPDwgImZ1bmN0aW9uICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiOndyaXRlKG9wcm90KSIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgICBpbmRlbnQob3V0KQotICAgICAgPDwgIm9wcm90OndyaXRlU3RydWN0QmVnaW4oJyIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiJykiIDw8IGVuZGw7Ci0gICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJpZiBzZWxmLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgdGhlbiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgICBpbmRlbnQob3V0KQotICAgICAgICAgIDw8ICJvcHJvdDp3cml0ZUZpZWxkQmVnaW4oJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInLCAiCi0gICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiwgIgotICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICIpIiA8PCBlbmRsOwotCi0gICAgICAgIC8vIFdyaXRlIGZpZWxkIGNvbnRlbnRzCi0gICAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJzZWxmLiIpOwotCi0gICAgICAgIGluZGVudChvdXQpCi0gICAgICAgICAgPDwgIm9wcm90OndyaXRlRmllbGRFbmQoKSIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiZW5kIiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Q6d3JpdGVGaWVsZFN0b3AoKSIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Q6d3JpdGVTdHJ1Y3RFbmQoKSIgPDwgZW5kbDsKLQotICAvLyBlbmQgZnVuY3Rpb24KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCk7Ci0gIG91dCA8PCAiZW5kIjsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZSBhIHRocmlmdCBzZXJ2aWNlCi0gKi8KLXZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgLy8gR2V0IG91dHB1dCBkaXJlY3RvcnkKLSAgc3RyaW5nIG91dGRpciA9IGdldF9vdXRfZGlyKCk7Ci0KLSAgLy8gT3BlbiB0aGUgZmlsZSBmb3Igd3JpdGluZwotICBzdHJpbmcgY3VyX25zID0gZ2V0X25hbWVzcGFjZShwcm9ncmFtXyk7Ci0gIHN0cmluZyBmX3NlcnZpY2VfbmFtZSA9IG91dGRpciArIGN1cl9ucyArIHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIi5sdWEiOwotICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7Ci0KLSAgLy8gSGVhZGVycwotICBmX3NlcnZpY2VfIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGx1YV9pbmNsdWRlcygpOwotICBpZiAoZ2VuX3JlcXVpcmVzXykgewotICAgIGZfc2VydmljZV8gPDwgZW5kbCA8PCAicmVxdWlyZSAnIiA8PCBjdXJfbnMgPDwgInR0eXBlcyciIDw8IGVuZGw7Ci0KLSAgICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgICAgZl9zZXJ2aWNlXwotICAgICAgICA8PCAicmVxdWlyZSAnIiA8PCBnZXRfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfcHJvZ3JhbSgpKQotICAgICAgICA8PCB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSA8PCAiJyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQoZl9zZXJ2aWNlXywgdHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZShmX3NlcnZpY2VfLCB0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfcHJvY2Vzc29yKGZfc2VydmljZV8sIHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKGZfc2VydmljZV8sIHRzZXJ2aWNlKTsKLQotICAvLyBDbG9zZSB0aGUgZmlsZQotICBmX3NlcnZpY2VfLmNsb3NlKCk7Ci19Ci0KLXZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZShvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGNsYXNzbmFtZSA9IHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIklmYWNlIjsKLSAgdF9zZXJ2aWNlKiBleHRlbmRzX3MgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKLQotICAvLyBJbnRlcmZhY2Ugb2JqZWN0IGRlZmluaXRpb24KLSAgb3V0IDw8IGNsYXNzbmFtZSA8PCAiID0gIjsKLSAgaWYgKGV4dGVuZHNfcykgewotICAgIG91dCA8PCBleHRlbmRzX3MtPmdldF9uYW1lKCkgPDwgIklmYWNlOm5ld3siIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgb3V0IDw8ICJfX1RPYmplY3Q6bmV3eyIgPDwgZW5kbDsKLSAgfQotICBvdXQKLSAgICA8PCAiICBfX3R5cGUgPSAnIiA8PCBjbGFzc25hbWUgPDwgIiciIDw8IGVuZGwKLSAgICA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi12b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9jbGllbnQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBjbGFzc25hbWUgPSB0c2VydmljZS0+Z2V0X25hbWUoKSArICJDbGllbnQiOwotICB0X3NlcnZpY2UqIGV4dGVuZHNfcyA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOwotCi0gIC8vIENsaWVudCBvYmplY3QgZGVmaW5pdGlvbgotICBvdXQgPDwgY2xhc3NuYW1lIDw8ICIgPSBfX1RPYmplY3QubmV3KCI7Ci0gIGlmIChleHRlbmRzX3MgIT0gTlVMTCkgewotICAgIG91dCA8PCBleHRlbmRzX3MtPmdldF9uYW1lKCkgPDwgIkNsaWVudCI7Ci0gIH0gZWxzZSB7Ci0gICAgb3V0IDw8ICJfX1RDbGllbnQiOwotICB9Ci0gIG91dAotICAgIDw8IiwgeyIgPDwgZW5kbAotICAgIDw8ICIgIF9fdHlwZSA9ICciIDw8IGNsYXNzbmFtZSA8PCAiJyIgPDwgZW5kbAotICAgIDw8ICJ9KSIgPDwgZW5kbDsKLQotICAvLyBTZW5kL1JlY3YgZnVuY3Rpb25zCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHN0cmluZyBzaWcgPSBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcik7Ci0gICAgc3RyaW5nIGZ1bmNuYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotCi0gICAgLy8gV3JhcHBlciBmdW5jdGlvbgotICAgIGluZGVudChvdXQpIDw8IGVuZGwgPDwgImZ1bmN0aW9uICIgPDwgY2xhc3NuYW1lIDw8ICI6IiA8PCBzaWcgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotCi0gICAgICBpbmRlbnQob3V0KSA8PCAic2VsZjpzZW5kXyIgPDwgc2lnIDw8IGVuZGwgPDwgaW5kZW50KCk7Ci0gICAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICAgIG91dCA8PCAicmV0dXJuICI7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0IDw8ICJzZWxmOnJlY3ZfIiA8PCBzaWcgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiZW5kIiA8PCBlbmRsOwotCi0gICAgLy8gU2VuZCBmdW5jdGlvbgotICAgIGluZGVudChvdXQpIDw8IGVuZGwgPDwgImZ1bmN0aW9uICIgPDwgY2xhc3NuYW1lIDw8ICI6c2VuZF8iIDw8IHNpZyA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0KLSAgICAgIGluZGVudChvdXQpIDw8ICJzZWxmLm9wcm90OndyaXRlTWVzc2FnZUJlZ2luKCciIDw8IGZ1bmNuYW1lIDw8ICInLCAiCi0gICAgICAgICAgICAgICAgICA8PCAoKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSA/ICJUTWVzc2FnZVR5cGUuT05FV0FZIiA6ICJUTWVzc2FnZVR5cGUuQ0FMTCIpCi0gICAgICAgICAgICAgICAgICA8PCAiLCBzZWxmLl9zZXFpZCkiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAibG9jYWwgYXJncyA9ICIgPDwgZnVuY25hbWUgPDwgIl9hcmdzOm5ld3t9IiA8PCBlbmRsOwotCi0gICAgICAvLyBTZXQgdGhlIGFyZ3MKLSAgICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGFyZ3MgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7Ci0gICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKLSAgICAgIGZvciAoZmxkX2l0ZXIgPSBhcmdzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGFyZ3MuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKLSAgICAgICAgc3RkOjpzdHJpbmcgYXJnbmFtZSA9ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICAgICBpbmRlbnQob3V0KSA8PCAiYXJncy4iIDw8IGFyZ25hbWUgPDwgIiA9ICIgPDwgYXJnbmFtZSA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICBpbmRlbnQob3V0KSA8PCAiYXJnczp3cml0ZShzZWxmLm9wcm90KSIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJzZWxmLm9wcm90OndyaXRlTWVzc2FnZUVuZCgpIiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgInNlbGYub3Byb3QudHJhbnM6Zmx1c2goKSIgPDwgZW5kbDsKLQotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiZW5kIiA8PCBlbmRsOwotCi0gICAgLy8gUmVjdiBmdW5jdGlvbgotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgaW5kZW50KG91dCkKLSAgICAgICAgPDwgZW5kbCA8PCAiZnVuY3Rpb24gIiA8PCBjbGFzc25hbWUgPDwgIjpyZWN2XyIgPDwgc2lnIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF91cCgpOwotCi0gICAgICAgIG91dCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJsb2NhbCBmbmFtZSwgbXR5cGUsIHJzZXFpZCA9IHNlbGYuaXByb3Q6IgotICAgICAgICAgICAgICAgICAgIDw8ICJyZWFkTWVzc2FnZUJlZ2luKCkiPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJpZiBtdHlwZSA9PSBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OIHRoZW4iIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICBsb2NhbCB4ID0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uOm5ld3t9IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgeDpyZWFkKHNlbGYuaXByb3QpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgc2VsZi5pcHJvdDpyZWFkTWVzc2FnZUVuZCgpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgZXJyb3IoeCkiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiZW5kIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImxvY2FsIHJlc3VsdCA9ICIgPDwgZnVuY25hbWUgPDwgIl9yZXN1bHQ6bmV3e30iCi0gICAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJyZXN1bHQ6cmVhZChzZWxmLmlwcm90KSIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJzZWxmLmlwcm90OnJlYWRNZXNzYWdlRW5kKCkiIDw8IGVuZGw7Ci0KLSAgICAgICAgLy8gUmV0dXJuIHRoZSByZXN1bHQgaWYgaXQncyBub3QgYSB2b2lkIGZ1bmN0aW9uCi0gICAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgICBvdXQgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICJpZiByZXN1bHQuc3VjY2VzcyB0aGVuIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gcmVzdWx0LnN1Y2Nlc3MiIDw8IGVuZGw7Ci0KLSAgICAgICAgICAvLyBUaHJvdyBjdXN0b20gZXhjZXB0aW9ucwotICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGYgPQotICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCktPmdldF9tZW1iZXJzKCk7Ci0gICAgICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotICAgICAgICAgIGZvciAoeF9pdGVyID0geGYuYmVnaW4oKTsgeF9pdGVyICE9IHhmLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICJlbHNlaWYgcmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgdGhlbiIKLSAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICBlcnJvcihyZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIikiCi0gICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiZW5kIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiZXJyb3IoVEFwcGxpY2F0aW9uRXhjZXB0aW9uOm5ld3tlcnJvckNvZGUgPSAiCi0gICAgICAgICAgICAgICAgICAgICA8PCAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uLk1JU1NJTkdfUkVTVUxUfSkiIDw8IGVuZGw7Ci0gICAgICAgIH0KLQotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgImVuZCIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfcHJvY2Vzc29yKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgY2xhc3NuYW1lID0gdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiUHJvY2Vzc29yIjsKLSAgdF9zZXJ2aWNlKiBleHRlbmRzX3MgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKLQotICAvLyBEZWZpbmUgcHJvY2Vzc29yIHRhYmxlCi0gIG91dCA8PCBlbmRsCi0gICAgPDwgY2xhc3NuYW1lIDw8ICIgPSBfX1RPYmplY3QubmV3KCI7Ci0gIGlmIChleHRlbmRzX3MgIT0gTlVMTCkgewotICAgIG91dCA8PCBleHRlbmRzX3MgPDwgIlByb2Nlc3NvciIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBvdXQgPDwgIl9fVFByb2Nlc3NvciIgPDwgZW5kbDsKLSAgfQotICBvdXQKLSAgICA8PCAiLCB7IiA8PCBlbmRsCi0gICAgPDwgIiBfX3R5cGUgPSAnIiA8PCBjbGFzc25hbWUgPDwgIiciIDw8IGVuZGwKLSAgICA8PCAifSkiIDw8IGVuZGw7Ci0KLSAgLy8gUHJvY2VzcyBmdW5jdGlvbgotICBpbmRlbnQob3V0KSA8PCBlbmRsIDw8ICJmdW5jdGlvbiAiIDw8IGNsYXNzbmFtZQotICAgIDw8ICI6cHJvY2VzcyhpcHJvdCwgb3Byb3QsIHNlcnZlcl9jdHgpIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotCi0gICAgaW5kZW50KG91dCkKLSAgICAgIDw8ICJsb2NhbCBuYW1lLCBtdHlwZSwgc2VxaWQgPSBpcHJvdDpyZWFkTWVzc2FnZUJlZ2luKCkiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkKLSAgICAgIDw8ICJsb2NhbCBmdW5jX25hbWUgPSAncHJvY2Vzc18nIC4uIG5hbWUiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkKLSAgICAgIDw8ICJpZiBub3Qgc2VsZltmdW5jX25hbWVdIG9yIHR0eXBlKHNlbGZbZnVuY19uYW1lXSkgfj0gJ2Z1bmN0aW9uJyB0aGVuIjsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICAgIG91dCA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpcHJvdDpza2lwKFRUeXBlLlNUUlVDVCkiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlwcm90OnJlYWRNZXNzYWdlRW5kKCkiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInggPSBUQXBwbGljYXRpb25FeGNlcHRpb246bmV3eyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBlcnJvckNvZGUgPSBUQXBwbGljYXRpb25FeGNlcHRpb24uVU5LTk9XTl9NRVRIT0QiIDw8IGVuZGwKLSAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIm9wcm90OndyaXRlTWVzc2FnZUJlZ2luKG5hbWUsIFRNZXNzYWdlVHlwZS5FWENFUFRJT04sICIKLSAgICAgICAgICAgICAgICAgPDwgInNlcWlkKSIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAieDp3cml0ZShvcHJvdCkiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIm9wcm90OndyaXRlTWVzc2FnZUVuZCgpIiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJvcHJvdC50cmFuczpmbHVzaCgpIiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgImVsc2UiIDw8IGVuZGwgPDwKLSAgICAgICBpbmRlbnQoKSA8PCAiICBzZWxmW2Z1bmNfbmFtZV0oc2VsZiwgc2VxaWQsIGlwcm90LCBvcHJvdCwgc2VydmVyX2N0eCkiCi0gICAgICAgICAgICAgICAgPDwgZW5kbAotICAgIDw8IGluZGVudCgpIDw8ICJlbmQiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAiZW5kIiA8PCBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzIHN1YmZ1bmN0aW9ucwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKG91dCwgdHNlcnZpY2UsICpmX2l0ZXIpOwotICB9Ci19Ci0KLXZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NlcnZpY2UqIHRzZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gIHN0cmluZyBjbGFzc25hbWUgPSB0c2VydmljZS0+Z2V0X25hbWUoKSArICJQcm9jZXNzb3IiOwotICBzdHJpbmcgYXJnc25hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX2FyZ3MiOwotICBzdHJpbmcgcmVzdWx0bmFtZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKLSAgc3RyaW5nIGZuX25hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgZW5kbCA8PCAiZnVuY3Rpb24gIiA8PCBjbGFzc25hbWUgPDwgIjpwcm9jZXNzXyIgPDwgZm5fbmFtZQotICAgIDw8ICIoc2VxaWQsIGlwcm90LCBvcHJvdCwgc2VydmVyX2N0eCkiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICAvLyBSZWFkIHRoZSByZXF1ZXN0Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAibG9jYWwgYXJncyA9ICIgPDwgYXJnc25hbWUgPDwgIjpuZXd7fSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImxvY2FsIHJlcGx5X3R5cGUgPSBUTWVzc2FnZVR5cGUuUkVQTFkiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJhcmdzOnJlYWQoaXByb3QpIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaXByb3Q6cmVhZE1lc3NhZ2VFbmQoKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImxvY2FsIHJlc3VsdCA9ICIgPDwgcmVzdWx0bmFtZSA8PCAiOm5ld3t9IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAibG9jYWwgc3RhdHVzLCByZXMgPSBwY2FsbChzZWxmLmhhbmRsZXIuIiA8PCBmbl9uYW1lCi0gICAgICAgICAgICAgICA8PCAiLCBzZWxmLmhhbmRsZXIiOwotCi0gICAgLy8gUHJpbnQgYXJndW1lbnRzCi0gICAgdF9zdHJ1Y3QgKmFyZ3MgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7Ci0gICAgaWYgKGFyZ3MtPmdldF9tZW1iZXJzKCkuc2l6ZSgpID4gMCkgewotICAgICAgb3V0IDw8ICIsICIgPDwgYXJndW1lbnRfbGlzdChhcmdzLCAiYXJncy4iKTsKLSAgICB9Ci0KLSAgICAvLyBDaGVjayBmb3IgZXJyb3JzCi0gICAgb3V0IDw8ICIpIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWYgbm90IHN0YXR1cyB0aGVuIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICByZXBseV90eXBlID0gVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgcmVzdWx0ID0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uOm5ld3ttZXNzYWdlID0gcmVzfSIKLSAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0KLSAgICAvLyBIYW5kbGUgY3VzdG9tIGV4Y2VwdGlvbnMKLSAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhmID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCktPmdldF9tZW1iZXJzKCk7Ci0gICAgaWYgKHhmLnNpemUoKSA+IDApIHsKLSAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLSAgICAgIGZvciAoeF9pdGVyID0geGYuYmVnaW4oKTsgeF9pdGVyICE9IHhmLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiZWxzZWlmIHR0eXBlKHJlcykgPT0gJyIKLSAgICAgICAgICAgICAgICAgICA8PCAoKnhfaXRlciktPmdldF90eXBlKCktPmdldF9uYW1lKCkgPDwgIicgdGhlbiIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIHJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gcmVzIiA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIFNldCB0aGUgcmVzdWx0IGFuZCB3cml0ZSB0aGUgcmVwbHkKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJlbHNlIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICByZXN1bHQuc3VjY2VzcyA9IHJlcyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIm9wcm90OndyaXRlTWVzc2FnZUJlZ2luKCciIDw8IGZuX25hbWUgPDwgIicsIHJlcGx5X3R5cGUsICIKLSAgICAgICAgICAgICAgIDw8ICJzZXFpZCkiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJyZXN1bHQ6d3JpdGUob3Byb3QpIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAib3Byb3Q6d3JpdGVNZXNzYWdlRW5kKCkiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJvcHJvdC50cmFuczpmbHVzaCgpIiA8PCBlbmRsOwotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgImVuZCIgPDwgZW5kbDsKLX0KLQotLy8gU2VydmljZSBoZWxwZXJzCi12b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0KLSAgb3V0IDw8IGVuZGwgPDwgIi0tIEhFTFBFUiBGVU5DVElPTlMgQU5EIFNUUlVDVFVSRVMiOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLSAgICBnZW5lcmF0ZV9sdWFfc3RydWN0X2RlZmluaXRpb24ob3V0LCB0cywgZmFsc2UpOwotICAgIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnMob3V0LCAqZl9pdGVyKTsKLSAgfQotfQotCi12b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyhvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiAqdGZ1bmN0aW9uKSB7Ci0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKLSAgICB0X2ZpZWxkIHN1Y2Nlc3ModGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOwotICAgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOwotICAgIH0KLQotICAgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgcmVzdWx0LmFwcGVuZCgqZl9pdGVyKTsKLSAgICB9Ci0gICAgZ2VuZXJhdGVfbHVhX3N0cnVjdF9kZWZpbml0aW9uKG91dCwgJnJlc3VsdCwgZmFsc2UpOwotICB9Ci19Ci0KLS8qKgotICogRGVzZXJpYWxpemUgKFJlYWQpCi0gKi8KLXZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLQotICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKwotICAgICAgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0KLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIG5hbWUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbmFtZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgIG5hbWUgPDwgIiA9IGlwcm90OiI7Ci0KLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKwotICAgICAgICAgIG5hbWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIG91dCA8PCAicmVhZFN0cmluZygpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIG91dCA8PCAicmVhZEJvb2woKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICBvdXQgPDwgInJlYWRCeXRlKCkiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICBvdXQgPDwgInJlYWRJMTYoKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgIG91dCA8PCAicmVhZEkzMigpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgb3V0IDw8ICJyZWFkSTY0KCkiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICBvdXQgPDwgInJlYWREb3VibGUoKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBQSFAgbmFtZSBmb3IgYmFzZSB0eXBlICIgKwotICAgICAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIG91dCA8PCAicmVhZEkzMigpIjsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0KLSAgfSBlbHNlIHsKLSAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBERVNFUklBTElaRSBGSUVMRCAnJXMnIFRZUEUgJyVzJ1xuIiwKLSAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksIHR5cGUtPmdldF9uYW1lKCkuY19zdHIoKSk7Ci0gIH0KLX0KLQotdm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBpbmRlbnQob3V0KQotICAgIDw8IHByZWZpeCA8PCAiID0gIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICI6bmV3e30iIDw8IGVuZGwKLSAgICA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIjpyZWFkKGlwcm90KSIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHN0cmluZyBzaXplID0gdG1wKCJfc2l6ZSIpOwotICBzdHJpbmcga3R5cGUgPSB0bXAoIl9rdHlwZSIpOwotICBzdHJpbmcgdnR5cGUgPSB0bXAoIl92dHlwZSIpOwotICBzdHJpbmcgZXR5cGUgPSB0bXAoIl9ldHlwZSIpOwotCi0gIHRfZmllbGQgZnNpemUoZ190eXBlX2kzMiwgc2l6ZSk7Ci0gIHRfZmllbGQgZmt0eXBlKGdfdHlwZV9ieXRlLCBrdHlwZSk7Ci0gIHRfZmllbGQgZnZ0eXBlKGdfdHlwZV9ieXRlLCB2dHlwZSk7Ci0gIHRfZmllbGQgZmV0eXBlKGdfdHlwZV9ieXRlLCBldHlwZSk7Ci0KLSAgLy8gRGVjbGFyZSB2YXJpYWJsZXMsIHJlYWQgaGVhZGVyCi0gIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiID0ge30iIDw8IGVuZGw7Ci0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAibG9jYWwgIiA8PCBrdHlwZSA8PCAiLCAiIDw8IHZ0eXBlIDw8ICIsICIgPDwgc2l6ZQotICAgICAgICAgICAgICAgIDw8ICIgPSBpcHJvdDpyZWFkTWFwQmVnaW4oKSAiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImxvY2FsICIgPDwgZXR5cGUgPDwgIiwgIiA8PCBzaXplCi0gICAgICAgICAgICAgICAgPDwgIiA9IGlwcm90OnJlYWRTZXRCZWdpbigpIiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAibG9jYWwgIiA8PCBldHlwZSA8PCAiLCAiIDw8IHNpemUKLSAgICAgICAgICAgICAgICA8PCAiID0gaXByb3Q6cmVhZExpc3RCZWdpbigpIiA8PCBlbmRsOwotICB9Ci0KLSAgLy8gRGVzZXJpYWxpemUKLSAgaW5kZW50KG91dCkgPDwgImZvciBfaT0xLCIgPDwgc2l6ZSA8PCAiIGRvIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotCi0gICAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBwcmVmaXgpOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIHByZWZpeCk7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgcHJlZml4KTsKLSAgICB9Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAiZW5kIiA8PCBlbmRsOwotCi0gIC8vIFJlYWQgY29udGFpbmVyIGVuZAotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImlwcm90OnJlYWRNYXBFbmQoKSIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiaXByb3Q6cmVhZFNldEVuZCgpIiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiaXByb3Q6cmVhZExpc3RFbmQoKSIgPDwgZW5kbDsKLSAgfQotfQotCi12b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIC8vIEEgbWFwIGlzIHJlcHJlc2VudGVkIGJ5IGEgdGFibGUgaW5kZXhhYmxlIGJ5IGFueSBsdWEgdHlwZQotICBzdHJpbmcga2V5ID0gdG1wKCJfa2V5Iik7Ci0gIHN0cmluZyB2YWwgPSB0bXAoIl92YWwiKTsKLSAgdF9maWVsZCBma2V5KHRtYXAtPmdldF9rZXlfdHlwZSgpLCBrZXkpOwotICB0X2ZpZWxkIGZ2YWwodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZhbCk7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmtleSk7Ci0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZ2YWwpOwotCi0gIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiWyIgPDwga2V5IDw8ICJdID0gIiA8PCB2YWwgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICAvLyBBIHNldCBpcyByZXByZXNlbnRlZCBieSBhIHRhYmxlIGluZGV4ZWQgYnkgdGhlIHZhbHVlCi0gIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOwotICB0X2ZpZWxkIGZlbGVtKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgcHJlZml4IDw8ICJbIiA8PCBlbGVtIDw8ICJdID0gIiA8PCBlbGVtIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICAvLyBBIGxpc3QgaXMgcmVwcmVzZW50ZWQgYnkgYSB0YWJsZSBpbmRleGVkIGJ5IGludGVnZXIgdmFsdWVzCi0gIC8vIExVQSBuYXRpdmVseSBwcm92aWRlcyBhbGwgb2YgdGhlIGZ1bmN0aW9ucyByZXF1aXJlZCB0byBtYWludGFpbiBhIGxpc3QKLSAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7Ci0gIHRfZmllbGQgZmVsZW0odGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8ICJ0YWJsZS5pbnNlcnQoIiA8PCBwcmVmaXggPDwgIiwgIiA8PCBlbGVtIDw8ICIpIiA8PCBlbmRsOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZSAoV3JpdGUpCi0gKi8KLXZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLSAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0KLSAgLy8gRG8gbm90aGluZyBmb3Igdm9pZCB0eXBlcwotICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgbmFtZTsKLSAgfQotCi0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbmFtZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbmFtZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIm9wcm90OiI7Ci0KLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgdGhyb3cKLSAgICAgICAgICAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIG91dCA8PCAid3JpdGVTdHJpbmcoIiA8PCBuYW1lIDw8ICIpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIG91dCA8PCAid3JpdGVCb29sKCIgPDwgbmFtZSA8PCAiKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICBvdXQgPDwgIndyaXRlQnl0ZSgiIDw8IG5hbWUgPDwgIikiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICBvdXQgPDwgIndyaXRlSTE2KCIgPDwgbmFtZSA8PCAiKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgIG91dCA8PCAid3JpdGVJMzIoIiA8PCBuYW1lIDw8ICIpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUk2NCgiIDw8IG5hbWUgPDwgIikiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICBvdXQgPDwgIndyaXRlRG91YmxlKCIgPDwgbmFtZSA8PCAiKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBQSFAgbmFtZSBmb3IgYmFzZSB0eXBlICIgKwotICAgICAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIG91dCA8PCAid3JpdGVJMzIoIiA8PCBuYW1lIDw8ICIpIjsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gU0VSSUFMSVpFIEZJRUxEICclcycgVFlQRSAnJXMnXG4iLAotICAgICAgICAgICBuYW1lLmNfc3RyKCksCi0gICAgICAgICAgIHR5cGUtPmdldF9uYW1lKCkuY19zdHIoKSk7Ci0gIH0KLX0KLQotdm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICAodm9pZCkgdHN0cnVjdDsKLSAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICI6d3JpdGUob3Byb3QpIiA8PCBlbmRsOwotfQotCi12b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgLy8gQmVnaW4gd3JpdGluZwotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvcHJvdDp3cml0ZU1hcEJlZ2luKCIgPDwKLSAgICAgIHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgInN0cmluZy5sZW4oIiA8PCBwcmVmaXggPDwgIikpIiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3Byb3Q6d3JpdGVTZXRCZWdpbigiIDw8Ci0gICAgICB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgICJzdHJpbmcubGVuKCIgPDwgcHJlZml4IDw8ICIpKSIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvcHJvdDp3cml0ZUxpc3RCZWdpbigiIDw8Ci0gICAgICB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICAic3RyaW5nLmxlbigiIDw8IHByZWZpeCA8PCAiKSkiIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBTZXJpYWxpemUKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIHN0cmluZyBraXRlciA9IHRtcCgia2l0ZXIiKTsKLSAgICBzdHJpbmcgdml0ZXIgPSB0bXAoInZpdGVyIik7Ci0gICAgaW5kZW50KG91dCkKLSAgICAgIDw8ICJmb3IgIiA8PCBraXRlciA8PCAiLCIgPDwgdml0ZXIgPDwgIiBpbiBwYWlycygiIDw8IHByZWZpeCA8PCAiKSBkbyIKLSAgICAgIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIGtpdGVyLCB2aXRlcik7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJlbmQiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgc3RyaW5nIGl0ZXIgPSB0bXAoIml0ZXIiKTsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImZvciAiIDw8IGl0ZXIgPDwgIixfIGluIHBhaXJzKCIgPDwgcHJlZml4IDw8ICIpIGRvIiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBpdGVyKTsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgImVuZCIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgc3RyaW5nIGl0ZXIgPSB0bXAoIml0ZXIiKTsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImZvciBfLCIgPDwgaXRlciA8PCAiIGluIGlwYWlycygiIDw8IHByZWZpeCA8PCAiKSBkbyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBpdGVyKTsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgImVuZCIgPDwgZW5kbDsKLSAgfQotCi0gIC8vIEZpbmlzaCB3cml0aW5nCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Q6d3JpdGVNYXBFbmQoKSIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Q6d3JpdGVTZXRFbmQoKSIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIm9wcm90OndyaXRlTGlzdEVuZCgpIiA8PCBlbmRsOwotICB9Ci19Ci0KLXZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBraXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHZpdGVyKSB7Ci0gIHRfZmllbGQga2ZpZWxkKHRtYXAtPmdldF9rZXlfdHlwZSgpLCBraXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZrZmllbGQsICIiKTsKLQotICB0X2ZpZWxkIHZmaWVsZCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdml0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmdmZpZWxkLCAiIik7Ci19Ci0KLXZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyKSB7Ci0gIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiKTsKLX0KLQotdm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlcikgewotICB0X2ZpZWxkIGVmaWVsZCh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIpOwotfQotCi0vKioKLSAqICBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucwotICovCi1zdHJpbmcgdF9sdWFfZ2VuZXJhdG9yOjpsdWFfaW5jbHVkZXMoKSB7Ci0gIGlmIChnZW5fcmVxdWlyZXNfKSB7Ci0gICAgcmV0dXJuICJcblxucmVxdWlyZSAnVGhyaWZ0JyI7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuICIiOwotICB9Ci19Ci0KLXN0cmluZyB0X2x1YV9nZW5lcmF0b3I6OmdldF9uYW1lc3BhY2UoY29uc3QgdF9wcm9ncmFtKiBwcm9ncmFtKSB7Ci0gIHN0ZDo6c3RyaW5nIHJlYWxfbW9kdWxlID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgibHVhIik7Ci0gIGlmIChyZWFsX21vZHVsZS5lbXB0eSgpKSB7Ci0gICAgcmV0dXJuIHByb2dyYW0tPmdldF9uYW1lKCkgKyAiXyI7Ci0gIH0KLSAgcmV0dXJuIHJlYWxfbW9kdWxlICsgIl8iOwotfQotCi1zdHJpbmcgdF9sdWFfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgKHZvaWQpIHByZWZpeDsKLSAgc3RkOjpzdHJpbmcgcmV0ID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIigiICsKLSAgICBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSkgKyAiKSI7Ci0gIHJldHVybiByZXQ7Ci19Ci0KLXN0cmluZyB0X2x1YV9nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcmVmaXgpIHsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7Ci0gIHN0ZDo6c3RyaW5nIHJldCA9ICIiOwotICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTspIHsKLSAgICByZXQgKz0gcHJlZml4ICsgKCpmbGRfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgKytmbGRfaXRlcjsKLSAgICBpZiAoZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpKSB7Ci0gICAgICByZXQgKz0gIiwgIjsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHJldDsKLX0KLQotc3RyaW5nIHRfbHVhX2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgcmV0dXJuICJUVHlwZS5TVFJJTkciOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICByZXR1cm4gIlRUeXBlLkJPT0wiOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICByZXR1cm4gIlRUeXBlLkJZVEUiOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgIHJldHVybiAiVFR5cGUuSTE2IjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICByZXR1cm4gIlRUeXBlLkkzMiI7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgcmV0dXJuICJUVHlwZS5JNjQiOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIHJldHVybiAiVFR5cGUuRE9VQkxFIjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZS5JMzIiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLlNUUlVDVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLk1BUCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLlNFVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZS5MSVNUIjsKLSAgfQotCi0gIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUihsdWEsICJMdWEiLCAiIikKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9vY2FtbF9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3Rfb2NhbWxfZ2VuZXJhdG9yLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjA3ZjZlLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9vY2FtbF9nZW5lcmF0b3IuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxODk5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlICJ0X29vcF9nZW5lcmF0b3IuaCIKLSNpbmNsdWRlICJwbGF0Zm9ybS5oIgotI2luY2x1ZGUgInZlcnNpb24uaCIKLQotdXNpbmcgc3RkOjppb3M7Ci11c2luZyBzdGQ6Om1hcDsKLXVzaW5nIHN0ZDo6b2ZzdHJlYW07Ci11c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Ci11c2luZyBzdGQ6OnN0cmluZzsKLXVzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwotdXNpbmcgc3RkOjp2ZWN0b3I7Ci0KLXN0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7ICAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCi0KLS8qKgotICogT0NhbWwgY29kZSBnZW5lcmF0b3IuCi0gKgotICovCi1jbGFzcyB0X29jYW1sX2dlbmVyYXRvciA6IHB1YmxpYyB0X29vcF9nZW5lcmF0b3IgewotIHB1YmxpYzoKLSAgdF9vY2FtbF9nZW5lcmF0b3IoCi0gICAgICB0X3Byb2dyYW0qIHByb2dyYW0sCi0gICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQotICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pCi0gIHsKLSAgICAodm9pZCkgcGFyc2VkX29wdGlvbnM7Ci0gICAgKHZvaWQpIG9wdGlvbl9zdHJpbmc7Ci0gICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tb2NhbWwiOwotICB9Ci0KLSAgLyoqCi0gICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKLSAgICovCi0KLSAgdm9pZCBpbml0X2dlbmVyYXRvcigpOwotICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOwotCi0gIC8qKgotICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCi0gICAqLwotICB2b2lkIGdlbmVyYXRlX3Byb2dyYW0gICgpOwotICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYgICh0X3R5cGVkZWYqICB0dHlwZWRlZik7Ci0gIHZvaWQgZ2VuZXJhdGVfZW51bSAgICAgKHRfZW51bSogICAgIHRlbnVtKTsKLSAgdm9pZCBnZW5lcmF0ZV9jb25zdCAgICAodF9jb25zdCogICAgdGNvbnN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QgICAodF9zdHJ1Y3QqICAgdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24gKHRfc3RydWN0KiAgIHR4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZSAgKHRfc2VydmljZSogIHRzZXJ2aWNlKTsKLQotICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7Ci0gIGJvb2wgc3RydWN0X21lbWJlcl9wZXJzaXN0ZW50KHRfZmllbGQgKnRtZW1iZXIpOwotICBib29sIHN0cnVjdF9tZW1iZXJfb21pdGFibGUodF9maWVsZCAqdG1lbWJlcik7Ci0gIGJvb2wgc3RydWN0X21lbWJlcl9kZWZhdWx0X2NoZWFwbHlfY29tcGFyYWJsZSh0X2ZpZWxkICp0bWVtYmVyKTsKLSAgc3RkOjpzdHJpbmcgc3RydWN0X21lbWJlcl9jb3B5X29mKHRfdHlwZSAqdHlwZSwgc3RyaW5nIHdoYXQpOwotCi0gIC8qKgotICAgKiBTdHJ1Y3QgZ2VuZXJhdGlvbiBjb2RlCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfb2NhbWxfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfb2NhbWxfc3RydWN0X2RlZmluaXRpb24oc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc194Y2VwdGlvbj1mYWxzZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfb2NhbWxfc3RydWN0X21lbWJlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHN0cmluZyB0bmFtZSwgdF9maWVsZCogdG1lbWJlcik7Ci0gIHZvaWQgZ2VuZXJhdGVfb2NhbWxfc3RydWN0X3NpZyhzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfb2NhbWxfc3RydWN0X3JlYWRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3Rfd3JpdGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX29jYW1sX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9vY2FtbF9tZXRob2RfY29weShzdGQ6Om9mc3RyZWFtJiBvdXQsIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkICo+JiBtZW1iZXJzKTsKLSAgdm9pZCBnZW5lcmF0ZV9vY2FtbF9tZW1iZXJfY29weShzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfZmllbGQgKm1lbWJlcik7Ci0KLSAgLyoqCi0gICAqIFNlcnZpY2UtbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnMgICAodF9zZXJ2aWNlKiAgdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCAgICAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIgICAgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24gICh0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotCi0gIC8qKgotICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZCAgICAgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqICAgIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3QgICAgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiAgIHRzdHJ1Y3QpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqICAgICB0dHlwZSk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudCAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiAgICAgIHRzZXQpOwotCi0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogICAgIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV90eXBlICAgICAgICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZCAgICAgICAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogICAgdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZT0gIiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdCAgICAgICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogICB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIgICAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiAgICAgdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50ICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogICAgICB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcga2l0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB2aXRlcik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiAgICAgIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiAgICAgdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyKTsKLQotICAvKioKLSAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKLSAgICovCi0KLSAgc3RkOjpzdHJpbmcgb2NhbWxfYXV0b2dlbl9jb21tZW50KCk7Ci0gIHN0ZDo6c3RyaW5nIG9jYW1sX2ltcG9ydHMoKTsKLSAgc3RkOjpzdHJpbmcgdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpOwotICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotICBzdGQ6OnN0cmluZyBmdW5jdGlvbl90eXBlKHRfZnVuY3Rpb24qIHRmdW5jLCBib29sIG1ldGhvZD1mYWxzZSwgYm9vbCBvcHRpb25zID0gZmFsc2UpOwotICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KTsKLSAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOwotICBzdGQ6OnN0cmluZyByZW5kZXJfb2NhbWxfdHlwZSh0X3R5cGUqIHR5cGUpOwotCi0KLSBwcml2YXRlOgotCi0gIC8qKgotICAgKiBGaWxlIHN0cmVhbXMKLSAgICovCi0KLSAgc3RkOjpvZnN0cmVhbSBmX3R5cGVzXzsKLSAgc3RkOjpvZnN0cmVhbSBmX2NvbnN0c187Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9zZXJ2aWNlXzsKLQotICBzdGQ6Om9mc3RyZWFtIGZfdHlwZXNfaV87Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9zZXJ2aWNlX2lfOwotCi19OwotCi0KLS8qCi0gKiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHdlIHdhbnQgdHlwZWRlZnMgdG8gYXBwZWFyIGxhdGVyLAotICogYWZ0ZXIgYWxsIHRoZSB0eXBlcyBoYXZlIGJlZW4gZGVjbGFyZWQuCi0gKi8KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2dyYW0oKSB7Ci0gIC8vIEluaXRpYWxpemUgdGhlIGdlbmVyYXRvcgotICBpbml0X2dlbmVyYXRvcigpOwotCi0gIC8vIEdlbmVyYXRlIGVudW1zCi0gIHZlY3Rvcjx0X2VudW0qPiBlbnVtcyA9IHByb2dyYW1fLT5nZXRfZW51bXMoKTsKLSAgdmVjdG9yPHRfZW51bSo+OjppdGVyYXRvciBlbl9pdGVyOwotICBmb3IgKGVuX2l0ZXIgPSBlbnVtcy5iZWdpbigpOyBlbl9pdGVyICE9IGVudW1zLmVuZCgpOyArK2VuX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9lbnVtKCplbl9pdGVyKTsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIHN0cnVjdHMKLSAgdmVjdG9yPHRfc3RydWN0Kj4gc3RydWN0cyA9IHByb2dyYW1fLT5nZXRfc3RydWN0cygpOwotICB2ZWN0b3I8dF9zdHJ1Y3QqPjo6aXRlcmF0b3Igc3RfaXRlcjsKLSAgZm9yIChzdF9pdGVyID0gc3RydWN0cy5iZWdpbigpOyBzdF9pdGVyICE9IHN0cnVjdHMuZW5kKCk7ICsrc3RfaXRlcikgewotICAgIGdlbmVyYXRlX3N0cnVjdCgqc3RfaXRlcik7Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSB4Y2VwdGlvbnMKLSAgdmVjdG9yPHRfc3RydWN0Kj4geGNlcHRpb25zID0gcHJvZ3JhbV8tPmdldF94Y2VwdGlvbnMoKTsKLSAgdmVjdG9yPHRfc3RydWN0Kj46Oml0ZXJhdG9yIHhfaXRlcjsKLSAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV94Y2VwdGlvbigqeF9pdGVyKTsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIHR5cGVkZWZzCi0gIHZlY3Rvcjx0X3R5cGVkZWYqPiB0eXBlZGVmcyA9IHByb2dyYW1fLT5nZXRfdHlwZWRlZnMoKTsKLSAgdmVjdG9yPHRfdHlwZWRlZio+OjppdGVyYXRvciB0ZF9pdGVyOwotICBmb3IgKHRkX2l0ZXIgPSB0eXBlZGVmcy5iZWdpbigpOyB0ZF9pdGVyICE9IHR5cGVkZWZzLmVuZCgpOyArK3RkX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV90eXBlZGVmKCp0ZF9pdGVyKTsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIHNlcnZpY2VzCi0gIHZlY3Rvcjx0X3NlcnZpY2UqPiBzZXJ2aWNlcyA9IHByb2dyYW1fLT5nZXRfc2VydmljZXMoKTsKLSAgdmVjdG9yPHRfc2VydmljZSo+OjppdGVyYXRvciBzdl9pdGVyOwotICBmb3IgKHN2X2l0ZXIgPSBzZXJ2aWNlcy5iZWdpbigpOyBzdl9pdGVyICE9IHNlcnZpY2VzLmVuZCgpOyArK3N2X2l0ZXIpIHsKLSAgICBzZXJ2aWNlX25hbWVfID0gZ2V0X3NlcnZpY2VfbmFtZSgqc3ZfaXRlcik7Ci0gICAgZ2VuZXJhdGVfc2VydmljZSgqc3ZfaXRlcik7Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSBjb25zdGFudHMKLSAgdmVjdG9yPHRfY29uc3QqPiBjb25zdHMgPSBwcm9ncmFtXy0+Z2V0X2NvbnN0cygpOwotICBnZW5lcmF0ZV9jb25zdHMoY29uc3RzKTsKLQotICAvLyBDbG9zZSB0aGUgZ2VuZXJhdG9yCi0gIGNsb3NlX2dlbmVyYXRvcigpOwotfQotCi0KLS8qKgotICogUHJlcGFyZXMgZm9yIGZpbGUgZ2VuZXJhdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBuZWNlc3NhcnkgZmlsZSBvdXRwdXQKLSAqIHN0cmVhbXMuCi0gKgotICogQHBhcmFtIHRwcm9ncmFtIFRoZSBwcm9ncmFtIHRvIGdlbmVyYXRlCi0gKi8KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgewotICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKLSAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKLQotICAvLyBNYWtlIG91dHB1dCBmaWxlCi0gIHN0cmluZyBmX3R5cGVzX25hbWUgPSBnZXRfb3V0X2RpcigpK3Byb2dyYW1fbmFtZV8rIl90eXBlcy5tbCI7Ci0gIGZfdHlwZXNfLm9wZW4oZl90eXBlc19uYW1lLmNfc3RyKCkpOwotICBzdHJpbmcgZl90eXBlc19pX25hbWUgPSBnZXRfb3V0X2RpcigpK3Byb2dyYW1fbmFtZV8rIl90eXBlcy5tbGkiOwotICBmX3R5cGVzX2lfLm9wZW4oZl90eXBlc19pX25hbWUuY19zdHIoKSk7Ci0KLSAgc3RyaW5nIGZfY29uc3RzX25hbWUgPSBnZXRfb3V0X2RpcigpK3Byb2dyYW1fbmFtZV8rIl9jb25zdHMubWwiOwotICBmX2NvbnN0c18ub3BlbihmX2NvbnN0c19uYW1lLmNfc3RyKCkpOwotCi0gIC8vIFByaW50IGhlYWRlcgotICBmX3R5cGVzXyA8PAotICAgIG9jYW1sX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGwgPDwKLSAgICBvY2FtbF9pbXBvcnRzKCkgPDwgZW5kbDsKLSAgZl90eXBlc19pXyA8PAotICAgIG9jYW1sX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGwgPDwKLSAgICBvY2FtbF9pbXBvcnRzKCkgPDwgZW5kbDsKLSAgZl9jb25zdHNfIDw8Ci0gICAgb2NhbWxfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbCA8PAotICAgIG9jYW1sX2ltcG9ydHMoKSA8PCBlbmRsIDw8Ci0gICAgIm9wZW4gIiA8PCBjYXBpdGFsaXplKHByb2dyYW1fbmFtZV8pPDwiX3R5cGVzIjw8IGVuZGw7Ci19Ci0KLQotLyoqCi0gKiBBdXRvZ2VuJ2QgY29tbWVudAotICovCi1zdHJpbmcgdF9vY2FtbF9nZW5lcmF0b3I6Om9jYW1sX2F1dG9nZW5fY29tbWVudCgpIHsKLSAgcmV0dXJuCi0gICAgc3RkOjpzdHJpbmcoIigqXG4iKSArCi0gICAgIiBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoIiArIFRIUklGVF9WRVJTSU9OICsgIilcbiIgKwotICAgICJcbiIgKwotICAgICIgRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkdcbiIgKwotICAgICIqKVxuIjsKLX0KLQotLyoqCi0gKiBQcmludHMgc3RhbmRhcmQgdGhyaWZ0IGltcG9ydHMKLSAqLwotc3RyaW5nIHRfb2NhbWxfZ2VuZXJhdG9yOjpvY2FtbF9pbXBvcnRzKCkgewotICByZXR1cm4gIm9wZW4gVGhyaWZ0IjsKLX0KLQotLyoqCi0gKiBDbG9zZXMgdGhlIHR5cGUgZmlsZXMKLSAqLwotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgewotICAvLyBDbG9zZSB0eXBlcyBmaWxlCi0gIGZfdHlwZXNfLmNsb3NlKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgdHlwZWRlZi4gRXouCi0gKgotICogQHBhcmFtIHR0eXBlZGVmIFRoZSB0eXBlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7Ci0gIGZfdHlwZXNfIDw8Ci0gICAgaW5kZW50KCkgPDwgInR5cGUgIjw8IGRlY2FwaXRhbGl6ZSh0dHlwZWRlZi0+Z2V0X3N5bWJvbGljKCkpIDw8ICIgPSAiIDw8IHJlbmRlcl9vY2FtbF90eXBlKHR0eXBlZGVmLT5nZXRfdHlwZSgpKSA8PCBlbmRsIDw8IGVuZGw7Ci0gIGZfdHlwZXNfaV8gPDwKLSAgICBpbmRlbnQoKSA8PCAidHlwZSAiPDwgZGVjYXBpdGFsaXplKHR0eXBlZGVmLT5nZXRfc3ltYm9saWMoKSkgPDwgIiA9ICIgPDwgcmVuZGVyX29jYW1sX3R5cGUodHR5cGVkZWYtPmdldF90eXBlKCkpIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgY29kZSBmb3IgYW4gZW51bWVyYXRlZCB0eXBlLgotICogdGhlIHZhbHVlcy4KLSAqCi0gKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCi0gKi8KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgewotICBpbmRlbnQoZl90eXBlc18pIDw8ICJtb2R1bGUgIiA8PCBjYXBpdGFsaXplKHRlbnVtLT5nZXRfbmFtZSgpKSA8PCAiID0gIiA8PCBlbmRsIDw8ICJzdHJ1Y3QiIDw8IGVuZGw7Ci0gIGluZGVudChmX3R5cGVzX2lfKSA8PCAibW9kdWxlICIgPDwgY2FwaXRhbGl6ZSh0ZW51bS0+Z2V0X25hbWUoKSkgPDwgIiA6ICIgPDwgZW5kbCA8PCAic2lnIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KGZfdHlwZXNfKSA8PCAidHlwZSB0ID0gIiA8PCBlbmRsOwotICBpbmRlbnQoZl90eXBlc19pXykgPDwgInR5cGUgdCA9ICIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOwotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBzdHJpbmcgbmFtZSA9IGNhcGl0YWxpemUoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLSAgICBpbmRlbnQoZl90eXBlc18pIDw8ICJ8ICIgPDwgbmFtZSA8PCBlbmRsOwotICAgIGluZGVudChmX3R5cGVzX2lfKSA8PCAifCAiIDw8IG5hbWUgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfZG93bigpOwotCi0gIGluZGVudChmX3R5cGVzXykgPDwgImxldCB0b19pID0gZnVuY3Rpb24iIDw8IGVuZGw7Ci0gIGluZGVudChmX3R5cGVzX2lfKSA8PCAidmFsIHRvX2kgOiB0IC0+IEludDMyLnQiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgewotICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0gICAgc3RyaW5nIG5hbWUgPSBjYXBpdGFsaXplKCgqY19pdGVyKS0+Z2V0X25hbWUoKSk7Ci0gICAgaW5kZW50KGZfdHlwZXNfKSA8PCAifCAiIDw8IG5hbWUgPDwgIiAtPiAiIDw8IHZhbHVlIDw8ICJsIiA8PCBlbmRsOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgaW5kZW50KGZfdHlwZXNfKSA8PCAibGV0IG9mX2kgPSBmdW5jdGlvbiIgPDwgZW5kbDsKLSAgaW5kZW50KGZfdHlwZXNfaV8pIDw8ICJ2YWwgb2ZfaSA6IEludDMyLnQgLT4gdCIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZvcihjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOwotICAgIHN0cmluZyBuYW1lID0gY2FwaXRhbGl6ZSgoKmNfaXRlciktPmdldF9uYW1lKCkpOwotICAgIGluZGVudChmX3R5cGVzXykgPDwgInwgIiA8PCB2YWx1ZSA8PCAibCAtPiAiIDw8IG5hbWUgPDwgZW5kbDsKLSAgfQotICBpbmRlbnQoZl90eXBlc18pIDw8ICJ8IF8gLT4gcmFpc2UgVGhyaWZ0X2Vycm9yIiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQoZl90eXBlc18pIDw8ICJlbmQiIDw8IGVuZGw7Ci0gIGluZGVudChmX3R5cGVzX2lfKSA8PCAiZW5kIiA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlIGEgY29uc3RhbnQgdmFsdWUKLSAqLwotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KSB7Ci0gIHRfdHlwZSogdHlwZSA9IHRjb25zdC0+Z2V0X3R5cGUoKTsKLSAgc3RyaW5nIG5hbWUgPSBkZWNhcGl0YWxpemUodGNvbnN0LT5nZXRfbmFtZSgpKTsKLSAgdF9jb25zdF92YWx1ZSogdmFsdWUgPSB0Y29uc3QtPmdldF92YWx1ZSgpOwotCi0gIGluZGVudChmX2NvbnN0c18pIDw8ICJsZXQgIiA8PCBuYW1lIDw8ICIgPSAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0eXBlLCB2YWx1ZSkgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIFByaW50cyB0aGUgdmFsdWUgb2YgYSBjb25zdGFudCB3aXRoIHRoZSBnaXZlbiB0eXBlLiBOb3RlIHRoYXQgdHlwZSBjaGVja2luZwotICogaXMgTk9UIHBlcmZvcm1lZCBpbiB0aGlzIGZ1bmN0aW9uIGFzIGl0IGlzIGFsd2F5cyBydW4gYmVmb3JlaGFuZCB1c2luZyB0aGUKLSAqIHZhbGlkYXRlX3R5cGVzIG1ldGhvZCBpbiBtYWluLmNjCi0gKi8KLXN0cmluZyB0X29jYW1sX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7Ci0gIC8vIE9DYW1sIHJlcXVpcmVzIGFsbCBmbG9hdGluZyBwb2ludCBudW1iZXJzIGNvbnRhaW4gYSBkZWNpbWFsIHBvaW50Ci0gIG91dC5zZXRmKGlvczo6c2hvd3BvaW50KTsKLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIG91dCA8PCAnIicgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICBvdXQgPDwgKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgImwiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIkwiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgewotICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIi4wIjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICB0X2VudW0qIHRlbnVtID0gKHRfZW51bSopdHlwZTsKLSAgICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKLSAgICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKLSAgICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgewotICAgICAgaW50IHZhbCA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0gICAgICBpZiAodmFsID09IHZhbHVlLT5nZXRfaW50ZWdlcigpKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8IGNhcGl0YWxpemUodGVudW0tPmdldF9uYW1lKCkpIDw8ICIuIiA8PCBjYXBpdGFsaXplKCgqY19pdGVyKS0+Z2V0X25hbWUoKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgc3RyaW5nIGNuYW1lID0gdHlwZV9uYW1lKHR5cGUpOwotICAgIHN0cmluZyBjdCA9IHRtcCgiX2MiKTsKLSAgICBvdXQgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiKGxldCAiIDw8IGN0IDw8ICIgPSBuZXcgIiA8PCBjbmFtZSA8PCAiIGluIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOwotICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKLSAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7Ci0gICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7Ci0gICAgICB9Ci0gICAgICBzdHJpbmcgZm5hbWUgPSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7Ci0gICAgICBvdXQgPDwgaW5kZW50KCk7Ci0gICAgICBvdXQgPDwgY3QgPDwiI3NldF8iIDw8IGZuYW1lIDw8ICIgIjsKLSAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotICAgICAgb3V0IDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnQob3V0KSA8PCBjdCA8PCAiKSI7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnRfZG93bigpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKLSAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOwotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgc3RyaW5nIGhtID0gdG1wKCJfaG0iKTsKLSAgICBvdXQgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiKGxldCAiIDw8IGhtIDw8ICIgPSBIYXNodGJsLmNyZWF0ZSAiIDw8IHZhbC5zaXplKCkgPDwgIiBpbiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgc3RyaW5nIGtleSA9IHJlbmRlcl9jb25zdF92YWx1ZShrdHlwZSwgdl9pdGVyLT5maXJzdCk7Ci0gICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKHZ0eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiSGFzaHRibC5hZGQgIiA8PCBobSA8PCAiICIgPDwga2V5IDw8ICIgIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudChvdXQpIDw8IGhtIDw8ICIpIjsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgdF90eXBlKiBldHlwZTsKLSAgICBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIG91dCA8PCAiWyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKLSAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIG91dCA8PCBpbmRlbnQoKTsKLSAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZXR5cGUsICp2X2l0ZXIpOwotICAgICAgb3V0IDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJdIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOwotICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBzdHJpbmcgaG0gPSB0bXAoIl9obSIpOwotICAgIGluZGVudChvdXQpIDw8ICIobGV0ICIgPDwgaG0gPDwgIiA9IEhhc2h0YmwuY3JlYXRlICIgPDwgdmFsLnNpemUoKSA8PCAiIGluIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKGV0eXBlLCAqdl9pdGVyKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJIYXNodGJsLmFkZCAiIDw8IGhtIDw8ICIgIiA8PCB2YWwgPDwgIiB0cnVlOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50KG91dCkgPDwgaG0gPDwgIikiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBvdXQgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIENPTlNUQU5UIEZPUiBUWVBFOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLSAgfQotICByZXR1cm4gb3V0LnN0cigpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhICJzdHJ1Y3QiCi0gKi8KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICBnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3QodHN0cnVjdCwgZmFsc2UpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBleGNlcHRpb24uIEJhc2ljYWxseSB0aGUgc2FtZQotICogYXMgYSBzdHJ1Y3QsIGJ1dCBhbHNvIGhhcyBhbiBleGNlcHRpb24gZGVjbGFyYXRpb24uCi0gKgotICogQHBhcmFtIHR4Y2VwdGlvbiBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgewotICBnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3QodHhjZXB0aW9uLCB0cnVlKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYW4gT0NhbWwgc3RydWN0Ci0gKi8KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX29jYW1sX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgewotICBnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3RfZGVmaW5pdGlvbihmX3R5cGVzXywgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKLSAgZ2VuZXJhdGVfb2NhbWxfc3RydWN0X3NpZyhmX3R5cGVzX2lfLHRzdHJ1Y3QsaXNfZXhjZXB0aW9uKTsKLX0KLQotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfb2NhbWxfbWV0aG9kX2NvcHkob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkICo+JiBtZW1iZXJzKSB7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gICAgLyogQ3JlYXRlIGEgY29weSBvZiB0aGUgY3VycmVudCBvYmplY3QgKi8KLSAgICBpbmRlbnQob3V0KSA8PCAibWV0aG9kIGNvcHkgPSIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgImxldCBfbmV3ID0gT28uY29weSBzZWxmIGluIiA8PCBlbmRsOwotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpCi0gICAgICAgIGdlbmVyYXRlX29jYW1sX21lbWJlcl9jb3B5KG91dCwgKm1faXRlcik7Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJfbmV3IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci19Ci0KLXN0cmluZyB0X29jYW1sX2dlbmVyYXRvcjo6c3RydWN0X21lbWJlcl9jb3B5X29mKHRfdHlwZSAqdHlwZSwgc3RyaW5nIHdoYXQpIHsKLSAgICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgICAgICByZXR1cm4gd2hhdCArIHN0cmluZyAoIiNjb3B5Iik7Ci0gICAgfSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICAgICAgc3RyaW5nIGNvcHlfb2ZfayA9IHN0cnVjdF9tZW1iZXJfY29weV9vZigoKHRfbWFwICopdHlwZSktPmdldF9rZXlfdHlwZSgpLCAiayIpOwotICAgICAgICBzdHJpbmcgY29weV9vZl92ID0gc3RydWN0X21lbWJlcl9jb3B5X29mKCgodF9tYXAgKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCksICJ2Iik7Ci0KLSAgICAgICAgaWYoY29weV9vZl9rID09ICJrIiAmJiBjb3B5X29mX3YgPT0gInYiKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHN0cmluZyAoIihIYXNodGJsLmNvcHkgIikgKyB3aGF0ICsgc3RyaW5nKCIpIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHN0cmluZyAoIigoZnVuIG9oIC0+IGxldCBuaCA9IEhhc2h0YmwuY3JlYXRlIChIYXNodGJsLmxlbmd0aCBvaCkgaW4gSGFzaHRibC5pdGVyIChmdW4gayB2IC0+IEhhc2h0YmwuYWRkIG5oICIpCi0gICAgICAgICAgICAgICAgICAgICsgY29weV9vZl9rICsgc3RyaW5nKCIgIikgKyBjb3B5X29mX3YKLSAgICAgICAgICAgICAgICAgICAgKyBzdHJpbmcoIikgb2g7IG5oKSAiKQotICAgICAgICAgICAgICAgICAgICArIHdoYXQgKyAiKSI7Ci0gICAgICAgIH0KLSAgICB9IGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgICAgICBzdHJpbmcgY29weV9vZiA9IHN0cnVjdF9tZW1iZXJfY29weV9vZigoKHRfc2V0ICopdHlwZSktPmdldF9lbGVtX3R5cGUoKSwgImsiKTsKLQotICAgICAgICBpZihjb3B5X29mID09ICJrIikgewotICAgICAgICAgICAgICAgIHJldHVybiBzdHJpbmcgKCIoSGFzaHRibC5jb3B5ICIpICsgd2hhdCArIHN0cmluZygiKSIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBzdHJpbmcgKCIoKGZ1biBvaCAtPiBsZXQgbmggPSBIYXNodGJsLmNyZWF0ZSAoSGFzaHRibC5sZW5ndGggb2gpIGluIEhhc2h0YmwuaXRlciAoZnVuIGsgdiAtPiBIYXNodGJsLmFkZCBuaCAiKQotICAgICAgICAgICAgICAgICAgICArIGNvcHlfb2YgKyBzdHJpbmcoIiB0cnVlIikKLSAgICAgICAgICAgICAgICAgICAgKyBzdHJpbmcoIikgb2g7IG5oKSAiKQotICAgICAgICAgICAgICAgICAgICArIHdoYXQgKyAiKSI7Ci0gICAgICAgIH0KLSAgICB9IGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgICAgc3RyaW5nIGNvcHlfb2YgPSBzdHJ1Y3RfbWVtYmVyX2NvcHlfb2YoKCh0X2xpc3QgKil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpLCAieCIpOwotICAgICAgICBpZihjb3B5X29mICE9ICJ4IikgewotICAgICAgICAgICAgcmV0dXJuIHN0cmluZygiKExpc3QubWFwIChmdW4geCAtPiAiKQotICAgICAgICAgICAgICAgICsgY29weV9vZiArIHN0cmluZyAoIikgIikKLSAgICAgICAgICAgICAgICArIHdoYXQgKyBzdHJpbmcoIikiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiB3aGF0OwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiB3aGF0OwotfQotCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9vY2FtbF9tZW1iZXJfY29weShvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCAqdG1lbWJlcikgewotICAgIHN0cmluZyBtbmFtZSA9IGRlY2FwaXRhbGl6ZSh0bWVtYmVyLT5nZXRfbmFtZSgpKTsKLSAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRtZW1iZXItPmdldF90eXBlKCkpOwotCi0gICAgc3RyaW5nIGdyYWJfZmllbGQgPSBzdHJpbmcoInNlbGYjZ3JhYl8iKSArIG1uYW1lOwotICAgIHN0cmluZyBjb3B5X29mID0gc3RydWN0X21lbWJlcl9jb3B5X29mKHR5cGUsIGdyYWJfZmllbGQpOwotICAgIGlmKGNvcHlfb2YgIT0gZ3JhYl9maWVsZCkgewotICAgICAgICBpbmRlbnQob3V0KTsKLSAgICAgICAgaWYoIXN0cnVjdF9tZW1iZXJfcGVyc2lzdGVudCh0bWVtYmVyKSkgewotICAgICAgICAgICAgICAgIG91dCA8PCAiaWYgXyIgPDwgbW5hbWUgPDwgIiA8PiBOb25lIHRoZW4iIDw8IGVuZGw7Ci0gICAgICAgICAgICAgICAgaW5kZW50KG91dCkgPDwgIiAgIjsKLSAgICAgICAgfQotICAgICAgICBvdXQgPDwgIl9uZXcjc2V0XyIgPDwgbW5hbWUgPDwgIiAiIDw8IGNvcHlfb2YgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX29jYW1sX3N0cnVjdF9kZWZpbml0aW9uKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0gIHN0cmluZyB0bmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0KTsKLSAgaW5kZW50KG91dCkgPDwgImNsYXNzICIgPDwgdG5hbWUgPDwgIiA9IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAib2JqZWN0IChzZWxmKSIgPDwgZW5kbDsKLQotICBpbmRlbnRfdXAoKTsKLQotICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7Ci0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgZ2VuZXJhdGVfb2NhbWxfc3RydWN0X21lbWJlcihvdXQsIHRuYW1lLCAoKm1faXRlcikpOwotICAgICAgb3V0IDw8IGVuZGw7Ci0gICAgfQotICB9Ci0gIGdlbmVyYXRlX29jYW1sX21ldGhvZF9jb3B5KG91dCwgbWVtYmVycyk7Ci0gIGdlbmVyYXRlX29jYW1sX3N0cnVjdF93cml0ZXIob3V0LCB0c3RydWN0KTsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgImVuZCIgPDwgZW5kbDsKLQotICBpZihpc19leGNlcHRpb24pewotICAgIGluZGVudChvdXQpIDw8ICJleGNlcHRpb24gIiA8PCBjYXBpdGFsaXplKHRuYW1lKSA8PCIgb2YgIiA8PCB0bmFtZSA8PCBlbmRsOwotICB9Ci0KLSAgZ2VuZXJhdGVfb2NhbWxfc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdHVyZSBtZW1iZXIgZm9yIGEgdGhyaWZ0IGRhdGEgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdG5hbWUgTmFtZSBvZiB0aGUgcGFyZW50IHN0cnVjdHVyZSBmb3IgdGhlIG1lbWJlcgotICogQHBhcmFtIHRtZW1iZXIgTWVtYmVyIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfb2NhbWxfc3RydWN0X21lbWJlcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRtZW1iZXIpIHsKLSAgc3RyaW5nIHggPSB0bXAoIl94Iik7Ci0gIHN0cmluZyBtbmFtZSA9IGRlY2FwaXRhbGl6ZSh0bWVtYmVyLT5nZXRfbmFtZSgpKTsKLQotICBpbmRlbnQob3V0KSA8PCAidmFsIG11dGFibGUgXyIgPDwgbW5hbWUgPDwgIiA6ICIgPDwgcmVuZGVyX29jYW1sX3R5cGUodG1lbWJlci0+Z2V0X3R5cGUoKSk7Ci0gIHRfY29uc3RfdmFsdWUgKnZhbCA9IHRtZW1iZXItPmdldF92YWx1ZSgpOwotICBpZih2YWwpIHsKLSAgICBpZihzdHJ1Y3RfbWVtYmVyX3BlcnNpc3RlbnQodG1lbWJlcikpCi0gICAgICAgIG91dCA8PCAiID0gIiA8PCByZW5kZXJfY29uc3RfdmFsdWUodG1lbWJlci0+Z2V0X3R5cGUoKSwgdG1lbWJlci0+Z2V0X3ZhbHVlKCkpIDw8IGVuZGw7Ci0gICAgZWxzZQotICAgICAgICBvdXQgPDwgIiBvcHRpb24gPSBTb21lICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHRtZW1iZXItPmdldF90eXBlKCksIHRtZW1iZXItPmdldF92YWx1ZSgpKSA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIC8vIGFzc2VydCghc3RydWN0X21lbWJlcl9wZXJzaXN0ZW50KHRtZW1iZXIpKQotICAgIG91dCA8PCAiIG9wdGlvbiA9IE5vbmUiIDw8IGVuZGw7Ci0gIH0KLQotICBpZihzdHJ1Y3RfbWVtYmVyX3BlcnNpc3RlbnQodG1lbWJlcikpIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgIm1ldGhvZCBnZXRfIiA8PCBtbmFtZSA8PCAiID0gU29tZSBfIiA8PCBtbmFtZSA8PCBlbmRsOwotICAgICAgICBpbmRlbnQob3V0KSA8PCAibWV0aG9kIGdyYWJfIiA8PCBtbmFtZSA8PCAiID0gXyIgPDwgbW5hbWUgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgIm1ldGhvZCBzZXRfIiA8PCBtbmFtZSA8PCAiICIgPDwgeCA8PCAiID0gXyIgPDwgbW5hbWUgPDwgIiA8LSAiIDw8IHggPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgIm1ldGhvZCBnZXRfIiA8PCBtbmFtZSA8PCAiID0gXyIgPDwgbW5hbWUgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgIm1ldGhvZCBncmFiXyIgPDwgbW5hbWUgPDwgIiA9IG1hdGNoIF8iPDxtbmFtZTw8IiB3aXRoIE5vbmUtPnJhaXNlIChGaWVsZF9lbXB0eSBcIiI8PHRuYW1lPDwiLiI8PG1uYW1lPDwiXCIpIHwgU29tZSAiIDw8IHggPDwiIC0+ICIgPDwgeCA8PCBlbmRsOwotICAgICAgICBpbmRlbnQob3V0KSA8PCAibWV0aG9kIHNldF8iIDw8IG1uYW1lIDw8ICIgIiA8PCB4IDw8ICIgPSBfIiA8PCBtbmFtZSA8PCAiIDwtIFNvbWUgIiA8PCB4IDw8IGVuZGw7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJtZXRob2QgdW5zZXRfIiA8PCBtbmFtZSA8PCAiID0gXyIgPDwgbW5hbWUgPDwgIiA8LSBOb25lIiA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50KG91dCkgPDwgIm1ldGhvZCByZXNldF8iIDw8IG1uYW1lIDw8ICIgPSBfIiA8PCBtbmFtZSA8PCAiIDwtICI7Ci0gIGlmKHZhbCkgewotICAgIGlmKHN0cnVjdF9tZW1iZXJfcGVyc2lzdGVudCh0bWVtYmVyKSkKLSAgICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0bWVtYmVyLT5nZXRfdHlwZSgpLCB0bWVtYmVyLT5nZXRfdmFsdWUoKSkgPDwgZW5kbDsKLSAgICBlbHNlCi0gICAgICAgIG91dCA8PCAiU29tZSAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0bWVtYmVyLT5nZXRfdHlwZSgpLCB0bWVtYmVyLT5nZXRfdmFsdWUoKSkgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBvdXQgPDwgIk5vbmUiIDw8IGVuZGw7Ci0gIH0KLQotCi19Ci0KLS8qKgotICogQ2hlY2sgd2hldGhlciBhIG1lbWJlciBvZiB0aGUgc3RydWN0dXJlIGNhbiBub3QgaGF2ZSB1bmRlZmluZWQgdmFsdWUKLSAqCi0gKiBAcGFyYW0gdG1lbWJlciBNZW1iZXIgZGVmaW5pdGlvbgotICovCi1ib29sIHRfb2NhbWxfZ2VuZXJhdG9yOjpzdHJ1Y3RfbWVtYmVyX3BlcnNpc3RlbnQodF9maWVsZCAqdG1lbWJlcikgewotICB0X2NvbnN0X3ZhbHVlICp2YWwgPSB0bWVtYmVyLT5nZXRfdmFsdWUoKTsKLSAgcmV0dXJuICh2YWwgPyB0cnVlIDogZmFsc2UpOwotfQotCi0vKioKLSAqIENoZWNrIHdoZXRoZXIgYSBtZW1iZXIgb2YgdGhlIHN0cnVjdHVyZSBjYW4gYmUgc2tpcHBlZCBkdXJpbmcgZW5jb2RpbmcKLSAqCi0gKiBAcGFyYW0gdG1lbWJlciBNZW1iZXIgZGVmaW5pdGlvbgotICovCi1ib29sIHRfb2NhbWxfZ2VuZXJhdG9yOjpzdHJ1Y3RfbWVtYmVyX29taXRhYmxlKHRfZmllbGQgKnRtZW1iZXIpIHsKLSAgcmV0dXJuICh0bWVtYmVyLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCk7Ci19Ci0KLS8qKgotICogRmlndXJlIG91dCB3aGV0aGVyIGEgbWVtYmVyIG9mIHRoZSBzdHJ1Y3R1cmUgaGFzCi0gKiBhIGNoZWFwbHkgY29tcGFyYWJsZSBkZWZhdWx0IHZhbHVlLgotICoKLSAqIEBwYXJhbSB0bWVtYmVyIE1lbWJlciBkZWZpbml0aW9uCi0gKi8KLWJvb2wgdF9vY2FtbF9nZW5lcmF0b3I6OnN0cnVjdF9tZW1iZXJfZGVmYXVsdF9jaGVhcGx5X2NvbXBhcmFibGUodF9maWVsZCAqdG1lbWJlcikgewotICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRtZW1iZXItPmdldF90eXBlKCkpOwotICB0X2NvbnN0X3ZhbHVlICp2YWwgPSB0bWVtYmVyLT5nZXRfdmFsdWUoKTsKLSAgaWYoIXZhbCkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfSBlbHNlIGlmKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgLy8gQmFzZSB0eXBlcyBhcmUgZ2VuZXJhbGx5IGNoZWFwbHkgY29tcGFyZWQgZm9yIHN0cnVjdHVyYWwgZXF1aXZhbGVuY2UuCi0gICAgc3dpdGNoKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIGlmKHZhbC0+Z2V0X2RvdWJsZSgpID09IDAuMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIH0gZWxzZSBpZih0eXBlLT5pc19saXN0KCkpIHsKLSAgICAvLyBFbXB0eSBsaXN0cyBhcmUgY2hlYXBseSBjb21wYXJlZCBmb3Igc3RydWN0dXJhbCBlcXVpdmFsZW5jZS4KLSAgICAvLyBJcyBlbXB0eSBsaXN0PwotICAgIGlmKHZhbC0+Z2V0X2xpc3QoKS5zaXplKCkgPT0gMCkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGRhdGEgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfb2NhbWxfc3RydWN0X3NpZyhvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pIHsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLSAgc3RyaW5nIHRuYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QpOwotICBpbmRlbnQob3V0KSA8PCAiY2xhc3MgIiA8PCB0bmFtZSA8PCAiIDoiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJvYmplY3QgKCdhKSIgPDwgZW5kbDsKLQotICBpbmRlbnRfdXAoKTsKLQotICBzdHJpbmcgeCA9IHRtcCgiX3giKTsKLSAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgewotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIHN0cmluZyBtbmFtZSA9IGRlY2FwaXRhbGl6ZSgoKm1faXRlciktPmdldF9uYW1lKCkpOwotICAgICAgc3RyaW5nIHR5cGUgPSByZW5kZXJfb2NhbWxfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOwotICAgICAgaW5kZW50KG91dCkgPDwgIm1ldGhvZCBnZXRfIiA8PCBtbmFtZSA8PCAiIDogIiA8PCB0eXBlIDw8ICIgb3B0aW9uIiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIm1ldGhvZCBncmFiXyIgPDwgbW5hbWUgPDwgIiA6ICIgPDwgdHlwZSA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIm1ldGhvZCBzZXRfIiA8PCBtbmFtZSA8PCAiIDogIiA8PCB0eXBlIDw8ICIgLT4gdW5pdCIgPDwgZW5kbDsKLSAgICAgIGlmKCFzdHJ1Y3RfbWVtYmVyX3BlcnNpc3RlbnQoKm1faXRlcikpCi0gICAgICAgIGluZGVudChvdXQpIDw8ICJtZXRob2QgdW5zZXRfIiA8PCBtbmFtZSA8PCAiIDogdW5pdCIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJtZXRob2QgcmVzZXRfIiA8PCBtbmFtZSA8PCAiIDogdW5pdCIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLSAgaW5kZW50KG91dCkgPDwgIm1ldGhvZCBjb3B5IDogJ2EiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJtZXRob2Qgd3JpdGUgOiBQcm90b2NvbC50IC0+IHVuaXQiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJlbmQiIDw8IGVuZGw7Ci0KLSAgaWYoaXNfZXhjZXB0aW9uKXsKLSAgICBpbmRlbnQob3V0KSA8PCAiZXhjZXB0aW9uICIgPDwgY2FwaXRhbGl6ZSh0bmFtZSkgPDwiIG9mICIgPDwgdG5hbWUgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudChvdXQpIDw8ICJ2YWwgcmVhZF8iIDw8IHRuYW1lIDw8ICIgOiBQcm90b2NvbC50IC0+ICIgPDwgdG5hbWUgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgdGhlIHJlYWQgbWV0aG9kIGZvciBhIHN0cnVjdAotICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3RfcmVhZGVyKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgc3RyaW5nIHNuYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QpOwotICBzdHJpbmcgc3RyID0gdG1wKCJfc3RyIik7Ci0gIHN0cmluZyB0ID0gdG1wKCJfdCIpOwotICBzdHJpbmcgaWQgPSB0bXAoIl9pZCIpOwotICBpbmRlbnQob3V0KSA8PAotICAgICJsZXQgcmVjIHJlYWRfIiA8PCBzbmFtZSA8PCAiIChpcHJvdCA6IFByb3RvY29sLnQpID0iIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAibGV0ICIgPDwgc3RyIDw8ICIgPSBuZXcgIiA8PCBzbmFtZSA8PCAiIGluIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwKLSAgICAiaWdub3JlKGlwcm90I3JlYWRTdHJ1Y3RCZWdpbik7IiA8PCBlbmRsOwotCi0gIC8vIExvb3Agb3ZlciByZWFkaW5nIGluIGZpZWxkcwotICBpbmRlbnQob3V0KSA8PAotICAgICIodHJ5IHdoaWxlIHRydWUgZG8iIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnRfdXAoKTsKLQotICAvLyBSZWFkIGJlZ2lubmluZyBmaWVsZCBtYXJrZXIKLSAgaW5kZW50KG91dCkgPDwKLSAgICAibGV0IChfLCIgPDwgdCA8PCIsIjw8aWQ8PCIpID0gaXByb3QjcmVhZEZpZWxkQmVnaW4gaW4iIDw8IGVuZGw7Ci0KLSAgLy8gQ2hlY2sgZm9yIGZpZWxkIFNUT1AgbWFya2VyIGFuZCBicmVhawotICBpbmRlbnQob3V0KSA8PAotICAgICJpZiAiIDw8IHQgPDwiID0gUHJvdG9jb2wuVF9TVE9QIHRoZW4iIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PAotICAgICAgInJhaXNlIEJyZWFrIiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgImVsc2UgKCk7IiA8PCBlbmRsOwotCi0gICAgaW5kZW50KG91dCkgPDwgIihtYXRjaCAiIDw8IGlkPDwiIHdpdGggIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIC8vIEdlbmVyYXRlIGRlc2VyaWFsaXphdGlvbiBjb2RlIGZvciBrbm93biBjYXNlcwotICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifCAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICIgLT4gKCI7Ci0gICAgICBvdXQgPDwgImlmICIgPDwgdCA8PCIgPSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIgdGhlbiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsc3RyKTsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImVsc2UiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgaXByb3Qjc2tpcCAiPDwgdCA8PCAiKSIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgfQotCi0gICAgLy8gSW4gdGhlIGRlZmF1bHQgY2FzZSB3ZSBza2lwIHRoZSBmaWVsZAotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgInwgXyAtPiAiIDw8ICJpcHJvdCNza2lwICI8PHQ8PCIpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIC8vIFJlYWQgZmllbGQgZW5kIG1hcmtlcgotICAgIGluZGVudChvdXQpIDw8ICJpcHJvdCNyZWFkRmllbGRFbmQ7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgImRvbmU7ICgpIiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIndpdGggQnJlYWsgLT4gKCkpOyIgPDwgZW5kbDsKLQotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiaXByb3QjcmVhZFN0cnVjdEVuZDsiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnQob3V0KSA8PCBzdHIgPDwgZW5kbCA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50X2Rvd24oKTsKLX0KLQotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfb2NhbWxfc3RydWN0X3dyaXRlcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgewotICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIHN0cmluZyBzdHIgPSB0bXAoIl9zdHIiKTsKLSAgc3RyaW5nIGYgPSB0bXAoIl9mIik7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAibWV0aG9kIHdyaXRlIChvcHJvdCA6IFByb3RvY29sLnQpID0iIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PAotICAgICJvcHJvdCN3cml0ZVN0cnVjdEJlZ2luIFwiIjw8bmFtZTw8IlwiOyIgPDwgZW5kbDsKLQotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfZmllbGQgKnRtZW1iZXIgPSAoKmZfaXRlcik7Ci0gICAgc3RyaW5nIG1uYW1lID0gIl8iK2RlY2FwaXRhbGl6ZSh0bWVtYmVyLT5nZXRfbmFtZSgpKTsKLSAgICBzdHJpbmcgX3Y7Ci0KLSAgICBpZihzdHJ1Y3RfbWVtYmVyX3BlcnNpc3RlbnQodG1lbWJlcikpIHsKLQotICAgICAgaWYoc3RydWN0X21lbWJlcl9vbWl0YWJsZSh0bWVtYmVyKQotICAgICAgICAmJiBzdHJ1Y3RfbWVtYmVyX2RlZmF1bHRfY2hlYXBseV9jb21wYXJhYmxlKHRtZW1iZXIpKSB7Ci0gICAgICAgIF92ID0gIl92IjsKLSAgICAgICAgLy8gQXZvaWQgcmVkdW5kYW50IGVuY29kaW5nIG9mIG1lbWJlcnMgaGF2aW5nIGRlZmF1bHQgdmFsdWVzLgotICAgICAgICBpbmRlbnQob3V0KSA8PCAiKG1hdGNoICIgPDwgbW5hbWUgPDwgIiB3aXRoICIKLSAgICAgICAgICAgIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0bWVtYmVyLT5nZXRfdHlwZSgpLCB0bWVtYmVyLT5nZXRfdmFsdWUoKSkKLSAgICAgICAgICAgIDw8ICIgLT4gKCkgfCAiIDw8IF92IDw8ICIgLT4gIiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgX3YgPSBtbmFtZTsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgIigiIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICB9IGVsc2UgewotCi0gICAgICBpbmRlbnQob3V0KSA8PCAiKG1hdGNoICIgPDwgbW5hbWUgPDwgIiB3aXRoICI7Ci0KLSAgICAgIGlmKHN0cnVjdF9tZW1iZXJfb21pdGFibGUodG1lbWJlcikpIHsKLSAgICAgICAgb3V0IDw8ICJOb25lIC0+ICgpIjsKLQotICAgICAgICBpZihzdHJ1Y3RfbWVtYmVyX2RlZmF1bHRfY2hlYXBseV9jb21wYXJhYmxlKHRtZW1iZXIpKSB7Ci0gICAgICAgICAgLy8gQXZvaWQgcmVkdW5kYW50IGVuY29kaW5nIG9mIG1lbWJlcnMgaGF2aW5nIGRlZmF1bHQgdmFsdWVzLgotICAgICAgICAgIG91dCA8PCAiIHwgU29tZSAiCi0gICAgICAgICAgICAgIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0bWVtYmVyLT5nZXRfdHlwZSgpLCB0bWVtYmVyLT5nZXRfdmFsdWUoKSkKLSAgICAgICAgICAgICAgPDwgIiAtPiAoKSI7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0IDw8ICIgfCBTb21lIF92IC0+ICIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PCBlbmRsOwotICAgICAgICBpbmRlbnQob3V0KSA8PCAifCBOb25lIC0+IHJhaXNlIChGaWVsZF9lbXB0eSBcIiIKLSAgICAgICAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIuIiA8PCBtbmFtZSA8PCAiXCIpIiA8PCBlbmRsOwotICAgICAgICBpbmRlbnQob3V0KSA8PCAifCBTb21lIF92IC0+ICIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgX3YgPSAiX3YiOwotICAgIH0KLSAgICBpbmRlbnRfdXAoKTsKLSAgICAvLyBXcml0ZSBmaWVsZCBoZWFkZXIKLSAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qjd3JpdGVGaWVsZEJlZ2luKFwiIjw8IHRtZW1iZXItPmdldF9uYW1lKCk8PCJcIiwiCi0gICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKHRtZW1iZXItPmdldF90eXBlKCkpIDw8ICIsIgotICAgICAgICAgICAgICAgIDw8IHRtZW1iZXItPmdldF9rZXkoKTw8Iik7IiA8PCBlbmRsOwotCi0gICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCB0bWVtYmVyLCBfdik7Ci0KLSAgICAvLyBXcml0ZSBmaWVsZCBjbG9zZXIKLSAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qjd3JpdGVGaWVsZEVuZCIgPDwgZW5kbDsKLQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIik7IiA8PCBlbmRsOwotICB9Ci0KLSAgLy8gV3JpdGUgdGhlIHN0cnVjdCBtYXAKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgIm9wcm90I3dyaXRlRmllbGRTdG9wOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdCN3cml0ZVN0cnVjdEVuZCIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHRocmlmdCBzZXJ2aWNlLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZl9zZXJ2aWNlX25hbWUgPSBnZXRfb3V0X2RpcigpK2NhcGl0YWxpemUoc2VydmljZV9uYW1lXykrIi5tbCI7Ci0gIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKLSAgc3RyaW5nIGZfc2VydmljZV9pX25hbWUgPSBnZXRfb3V0X2RpcigpK2NhcGl0YWxpemUoc2VydmljZV9uYW1lXykrIi5tbGkiOwotICBmX3NlcnZpY2VfaV8ub3BlbihmX3NlcnZpY2VfaV9uYW1lLmNfc3RyKCkpOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICBvY2FtbF9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsIDw8Ci0gICAgb2NhbWxfaW1wb3J0cygpIDw8IGVuZGw7Ci0gIGZfc2VydmljZV9pXyA8PAotICAgIG9jYW1sX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGwgPDwKLSAgICBvY2FtbF9pbXBvcnRzKCkgPDwgZW5kbDsKLQotICAvKiBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgICJvcGVuICIgPDwgY2FwaXRhbGl6ZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSkgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfaV8gPDwKLSAgICAgICJvcGVuICIgPDwgY2FwaXRhbGl6ZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSkgPDwgZW5kbDsKLSAgfQotICAqLwotICBmX3NlcnZpY2VfIDw8Ci0gICAgICJvcGVuICIgPDwgY2FwaXRhbGl6ZShwcm9ncmFtX25hbWVfKSA8PCAiX3R5cGVzIiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICBmX3NlcnZpY2VfaV8gPDwKLSAgICAgIm9wZW4gIiA8PCBjYXBpdGFsaXplKHByb2dyYW1fbmFtZV8pIDw8ICJfdHlwZXMiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIHRoZSB0aHJlZSBtYWluIHBhcnRzIG9mIHRoZSBzZXJ2aWNlCi0gIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0c2VydmljZSk7Ci0KLQotICAvLyBDbG9zZSBzZXJ2aWNlIGZpbGUKLSAgZl9zZXJ2aWNlXy5jbG9zZSgpOwotICBmX3NlcnZpY2VfaV8uY2xvc2UoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgaGVscGVyIGZ1bmN0aW9ucyBmb3IgYSBzZXJ2aWNlLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgotICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSkgewotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAiKCogSEVMUEVSIEZVTkNUSU9OUyBBTkQgU1RSVUNUVVJFUyAqKSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9zdHJ1Y3QqIHRzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotICAgIGdlbmVyYXRlX29jYW1sX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sIHRzLCBmYWxzZSk7Ci0gICAgZ2VuZXJhdGVfb2NhbWxfZnVuY3Rpb25faGVscGVycygqZl9pdGVyKTsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBhbmQgaGVscGVycyBmb3IgYSBmdW5jdGlvbi4KLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbgotICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9vY2FtbF9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sIGRlY2FwaXRhbGl6ZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpICsgIl9yZXN1bHQiKTsKLSAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKLSAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOwotICB9Ci0KLSAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgcmVzdWx0LmFwcGVuZCgqZl9pdGVyKTsKLSAgfQotICBnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCAmcmVzdWx0LCBmYWxzZSk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBpbnRlcmZhY2UgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKLSAqLwotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgImNsYXNzIHZpcnR1YWwgaWZhY2UgPSIgPDwgZW5kbCA8PCAib2JqZWN0IChzZWxmKSIgPDwgZW5kbDsKLSAgZl9zZXJ2aWNlX2lfIDw8Ci0gICAgaW5kZW50KCkgPDwgImNsYXNzIHZpcnR1YWwgaWZhY2UgOiIgPDwgZW5kbCA8PCAib2JqZWN0IiA8PCBlbmRsOwotCi0gIGluZGVudF91cCgpOwotCi0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgc3RyaW5nIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaW5oZXJpdCAiIDw8IGV4dGVuZHMgPDwgIi5pZmFjZSIgPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlX2lfKSA8PCAiaW5oZXJpdCAiIDw8IGV4dGVuZHMgPDwgIi5pZmFjZSIgPDwgZW5kbDsKLSAgfQotCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHN0cmluZyBmdCA9IGZ1bmN0aW9uX3R5cGUoKmZfaXRlcix0cnVlLHRydWUpOwotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJtZXRob2QgdmlydHVhbCAiIDw8IGRlY2FwaXRhbGl6ZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIgOiAiIDw8IGZ0ICA8PCBlbmRsOwotICAgIGZfc2VydmljZV9pXyA8PAotICAgICAgaW5kZW50KCkgPDwgIm1ldGhvZCB2aXJ0dWFsICIgPDwgZGVjYXBpdGFsaXplKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiA6ICIgPDwgZnQgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOwotICBpbmRlbnQoZl9zZXJ2aWNlX2lfKSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgZGVmaW5pdGlvbi4gTm90ZSB0aGF0IGluIE9DYW1sLCB0aGUgY2xpZW50IGRvZXNuJ3QgaW1wbGVtZW50IGlmYWNlLiBUaGlzIGlzIGJlY2F1c2UKLSAqIFRoZSBjbGllbnQgZG9lcyBub3QgKGFuZCBzaG91bGQgbm90IGhhdmUgdG8pIGRlYWwgd2l0aCBhcmd1bWVudHMgYmVpbmcgTm9uZS4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgotICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJjbGFzcyBjbGllbnQgKGlwcm90IDogUHJvdG9jb2wudCkgKG9wcm90IDogUHJvdG9jb2wudCkgPSIgPDwgZW5kbCA8PCAib2JqZWN0IChzZWxmKSIgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV9pXykgPDwKLSAgICAiY2xhc3MgY2xpZW50IDogUHJvdG9jb2wudCAtPiBQcm90b2NvbC50IC0+ICIgPDwgZW5kbCA8PCAib2JqZWN0IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotCi0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpbmhlcml0ICIgPDwgZXh0ZW5kcyA8PCAiLmNsaWVudCBpcHJvdCBvcHJvdCBhcyBzdXBlciIgPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlX2lfKSA8PCAiaW5oZXJpdCAiIDw8IGV4dGVuZHMgPDwgIi5jbGllbnQiIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ2YWwgbXV0YWJsZSBzZXFpZCA9IDAiIDw8IGVuZGw7Ci0KLQotICAvLyBHZW5lcmF0ZSBjbGllbnQgbWV0aG9kIGltcGxlbWVudGF0aW9ucwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOwotICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotCi0gICAgLy8gT3BlbiBmdW5jdGlvbgotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgIm1ldGhvZCAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCAiID0gIiA8PCBlbmRsOwotICAgIGluZGVudChmX3NlcnZpY2VfaV8pIDw8Ci0gICAgICAibWV0aG9kICIgPDwgZGVjYXBpdGFsaXplKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiA6ICIgPDwgZnVuY3Rpb25fdHlwZSgqZl9pdGVyLHRydWUsZmFsc2UpIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAic2VsZiNzZW5kXyIgPDwgZnVubmFtZTsKLQotCi0gICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKLSAgICAgIGZfc2VydmljZV8gPDwgIiAiIDw8IGRlY2FwaXRhbGl6ZSgoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSk7Ci0gICAgfQotICAgIGZfc2VydmljZV8gPDwgIjsiIDw8IGVuZGw7Ci0KLSAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICJzZWxmI3JlY3ZfIiA8PCBmdW5uYW1lIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudF9kb3duKCk7Ci0KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICJtZXRob2QgcHJpdmF0ZSBzZW5kXyIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8ICIgPSAiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBzdGQ6OnN0cmluZyBhcmdzbmFtZSA9IGRlY2FwaXRhbGl6ZSgoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX2FyZ3MiKTsKLQotICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVxdWVzdCBoZWFkZXIKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAib3Byb3Qjd3JpdGVNZXNzYWdlQmVnaW4gKFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiLCAiCi0gICAgICAgICAgICAgICA8PCAoKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSA/ICJQcm90b2NvbC5PTkVXQVkiIDogIlByb3RvY29sLkNBTEwiKQotICAgICAgICAgICAgICAgPDwgIiwgc2VxaWQpOyIgPDwgZW5kbDsKLQotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJsZXQgYXJncyA9IG5ldyAiIDw8IGFyZ3NuYW1lIDw8ICIgaW4iIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiYXJncyNzZXRfIiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgLy8gV3JpdGUgdG8gdGhlIHN0cmVhbQotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJhcmdzI3dyaXRlIG9wcm90OyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIm9wcm90I3dyaXRlTWVzc2FnZUVuZDsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJvcHJvdCNnZXRUcmFuc3BvcnQjZmx1c2giIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudF9kb3duKCk7Ci0KLSAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIHN0ZDo6c3RyaW5nIHJlc3VsdG5hbWUgPSBkZWNhcGl0YWxpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKLSAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7Ci0KLSAgICAgIHRfZnVuY3Rpb24gcmVjdl9mdW5jdGlvbigoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJyZWN2XyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZub2FyZ3MpOwotICAgICAgLy8gT3BlbiBmdW5jdGlvbgotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAibWV0aG9kIHByaXZhdGUgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnJlY3ZfZnVuY3Rpb24pIDw8ICIgPSIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotCi0gICAgICAvLyBUT0RPKG1jc2xlZSk6IFZhbGlkYXRlIG1lc3NhZ2UgcmVwbHkgaGVyZSwgc2VxIGlkcyBldGMuCi0KLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImxldCAoZm5hbWUsIG10eXBlLCByc2VxaWQpID0gaXByb3QjcmVhZE1lc3NhZ2VCZWdpbiBpbiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiKGlmIG10eXBlID0gUHJvdG9jb2wuRVhDRVBUSU9OIHRoZW4iIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgbGV0IHggPSBBcHBsaWNhdGlvbl9FeG4ucmVhZCBpcHJvdCBpbiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICAoaXByb3QjcmVhZE1lc3NhZ2VFbmQ7IiA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICAgcmFpc2UgKEFwcGxpY2F0aW9uX0V4bi5FIHgpKSIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJlbHNlICgpKTsiIDw8IGVuZGw7Ci0gICAgICBzdHJpbmcgcmVzID0gIl8iOwotCi0gICAgICB0X3N0cnVjdCogeHMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKLSAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7Ci0KLSAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkgfHwgeGNlcHRpb25zLnNpemUoKSA+IDApIHsKLSAgICAgICAgcmVzID0gInJlc3VsdCI7Ci0gICAgICB9Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJsZXQgIjw8cmVzPDwiID0gcmVhZF8iIDw8IHJlc3VsdG5hbWUgPDwgIiBpcHJvdCBpbiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaXByb3QjcmVhZE1lc3NhZ2VFbmQ7IiA8PCBlbmRsOwotCi0gICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KLSAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJtYXRjaCByZXN1bHQjZ2V0X3N1Y2Nlc3Mgd2l0aCBTb21lIHYgLT4gdiB8IE5vbmUgLT4gKCIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICB9Ci0KLQotICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIobWF0Y2ggcmVzdWx0I2dldF8iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIHdpdGggTm9uZSAtPiAoKSB8IFNvbWUgX3YgLT4iIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICByYWlzZSAoIiA8PCBjYXBpdGFsaXplKHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCkpKSA8PCAiIF92KSk7IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KLSAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICAgICAiKCkiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgInJhaXNlIChBcHBsaWNhdGlvbl9FeG4uRSAoQXBwbGljYXRpb25fRXhuLmNyZWF0ZSBBcHBsaWNhdGlvbl9FeG4uTUlTU0lOR19SRVNVTFQgXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZhaWxlZDogdW5rbm93biByZXN1bHRcIikpKSIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIH0KLQotICAgICAgLy8gQ2xvc2UgZnVuY3Rpb24KLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICB9Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOwotICBpbmRlbnQoZl9zZXJ2aWNlX2lfKSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgotICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIC8vIEdlbmVyYXRlIHRoZSBkaXNwYXRjaCBtZXRob2RzCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotCi0KLSAgLy8gR2VuZXJhdGUgdGhlIGhlYWRlciBwb3J0aW9uCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJjbGFzcyBwcm9jZXNzb3IgKGhhbmRsZXIgOiBpZmFjZSkgPSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib2JqZWN0IChzZWxmKSIgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV9pXykgPDwKLSAgICAiY2xhc3MgcHJvY2Vzc29yIDogaWZhY2UgLT4iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9iamVjdCIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgICBpbmRlbnQoKSA8PCAiaW5oZXJpdCBQcm9jZXNzb3IudCIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0gIGZfc2VydmljZV9pXyA8PAotICAgICBpbmRlbnQoKSA8PCAiaW5oZXJpdCBQcm9jZXNzb3IudCIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0KLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImluaGVyaXQgIiArIGV4dGVuZHMgKyAiLnByb2Nlc3NvciAoaGFuZGxlciA6PiAiICsgZXh0ZW5kcyArICIuaWZhY2UpIiA8PCBlbmRsOwotICAgIGluZGVudChmX3NlcnZpY2VfaV8pIDw8ICJpbmhlcml0ICIgKyBleHRlbmRzICsgIi5wcm9jZXNzb3IiIDw8IGVuZGw7Ci0gIH0KLQotICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ2YWwgcHJvY2Vzc01hcCA9IEhhc2h0YmwuY3JlYXRlICIgPDwgZnVuY3Rpb25zLnNpemUoKSA8PCBlbmRsOwotICB9Ci0gIGluZGVudChmX3NlcnZpY2VfaV8pIDw8ICJ2YWwgcHJvY2Vzc01hcCA6IChzdHJpbmcsIGludCAqIFByb3RvY29sLnQgKiBQcm90b2NvbC50IC0+IHVuaXQpIEhhc2h0YmwudCIgPDwgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgc2VydmVyIGltcGxlbWVudGF0aW9uCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJtZXRob2QgcHJvY2VzcyBpcHJvdCBvcHJvdCA9IiA8PCBlbmRsOwotICBpbmRlbnQoZl9zZXJ2aWNlX2lfKSA8PAotICAgICJtZXRob2QgcHJvY2VzcyA6IFByb3RvY29sLnQgLT4gUHJvdG9jb2wudCAtPiBib29sIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgImxldCAobmFtZSwgdHlwLCBzZXFpZCkgID0gaXByb3QjcmVhZE1lc3NhZ2VCZWdpbiBpbiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIC8vIFRPRE8obWNzbGVlKTogdmFsaWRhdGUgbWVzc2FnZQotCi0gIC8vIEhPVDogZGljdGlvbmFyeSBmdW5jdGlvbiBsb29rdXAKLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJpZiBIYXNodGJsLm1lbSBwcm9jZXNzTWFwIG5hbWUgdGhlbiIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIChIYXNodGJsLmZpbmQgcHJvY2Vzc01hcCBuYW1lKSAoc2VxaWQsIGlwcm90LCBvcHJvdCkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiZWxzZSAoIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgaXByb3Qjc2tpcChQcm90b2NvbC5UX1NUUlVDVCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgaXByb3QjcmVhZE1lc3NhZ2VFbmQ7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgbGV0IHggPSBBcHBsaWNhdGlvbl9FeG4uY3JlYXRlIEFwcGxpY2F0aW9uX0V4bi5VTktOT1dOX01FVEhPRCAoXCJVbmtub3duIGZ1bmN0aW9uIFwiXm5hbWUpIGluIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgICBvcHJvdCN3cml0ZU1lc3NhZ2VCZWdpbihuYW1lLCBQcm90b2NvbC5FWENFUFRJT04sIHNlcWlkKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICAgIHgjd3JpdGUgb3Byb3Q7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgICBvcHJvdCN3cml0ZU1lc3NhZ2VFbmQ7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgICBvcHJvdCNnZXRUcmFuc3BvcnQjZmx1c2giIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiKTsiIDw8IGVuZGw7Ci0KLSAgLy8gUmVhZCBlbmQgb2YgYXJncyBmaWVsZCwgdGhlIFRfU1RPUCwgYW5kIHRoZSBzdHJ1Y3QgY2xvc2UKLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJ0cnVlIiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnRfZG93bigpOwotICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2VzcyBzdWJmdW5jdGlvbnMKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRzZXJ2aWNlLCAqZl9pdGVyKTsKLSAgfQotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaW5pdGlhbGl6ZXIiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJIYXNodGJsLmFkZCBwcm9jZXNzTWFwIFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiIHNlbGYjcHJvY2Vzc18iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfZG93bigpOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfaV8pIDw8ICJlbmQiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBwcm9jZXNzIGZ1bmN0aW9uIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24gdG8gd3JpdGUgYSBkaXNwYXRjaGVyIGZvcgotICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICAodm9pZCkgdHNlcnZpY2U7Ci0gIC8vIE9wZW4gZnVuY3Rpb24KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgIm1ldGhvZCBwcml2YXRlIHByb2Nlc3NfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwKLSAgICAiIChzZXFpZCwgaXByb3QsIG9wcm90KSA9IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBzdHJpbmcgYXJnc25hbWUgPSBkZWNhcGl0YWxpemUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSArICJfYXJncyI7Ci0gIHN0cmluZyByZXN1bHRuYW1lID0gZGVjYXBpdGFsaXplKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgKyAiX3Jlc3VsdCI7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGZ1bmN0aW9uIGNhbGwKLSAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIHN0cmluZyBhcmdzID0gImFyZ3MiOwotICBpZihmaWVsZHMuc2l6ZSgpID09IDApewotICAgIGFyZ3M9Il8iOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJsZXQgIjw8YXJnczw8IiA9IHJlYWRfIiA8PCBhcmdzbmFtZSA8PCAiIGlwcm90IGluIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJpcHJvdCNyZWFkTWVzc2FnZUVuZDsiIDw8IGVuZGw7Ci0KLSAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLQotICAvLyBEZWNsYXJlIHJlc3VsdCBmb3Igbm9uIG9uZXdheSBmdW5jdGlvbgotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAibGV0IHJlc3VsdCA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIiBpbiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgfQotCi0gIC8vIFRyeSBibG9jayBmb3IgYSBmdW5jdGlvbiB3aXRoIGV4Y2VwdGlvbnMKLSAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgIih0cnkiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gIH0KLQotCi0KLQotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOwotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCAicmVzdWx0I3NldF9zdWNjZXNzICI7Ci0gIH0KLSAgZl9zZXJ2aWNlXyA8PAotICAgICIoaGFuZGxlciMiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBmX3NlcnZpY2VfIDw8ICAiIGFyZ3MjZ2V0XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICB9Ci0gIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOwotCi0KLSAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIndpdGgiIDw8ZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAifCAiIDw8IGNhcGl0YWxpemUodHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSkpIDw8ICIgIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiAtPiAiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgaWYoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpewotICAgICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgICAgaW5kZW50KCkgPDwgInJlc3VsdCNzZXRfIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiAiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIoKSI7Ci0gICAgICB9Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIpOyIgPDwgZW5kbDsKLSAgfQotCi0KLQotICAvLyBTaG9ydGN1dCBvdXQgaGVyZSBmb3Igb25ld2F5IGZ1bmN0aW9ucwotICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICIoKSIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdCN3cml0ZU1lc3NhZ2VCZWdpbiAoXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCIsIFByb3RvY29sLlJFUExZLCBzZXFpZCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInJlc3VsdCN3cml0ZSBvcHJvdDsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAib3Byb3Qjd3JpdGVNZXNzYWdlRW5kOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdCNnZXRUcmFuc3BvcnQjZmx1c2giIDw8IGVuZGw7Ci0KLSAgLy8gQ2xvc2UgZnVuY3Rpb24KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50X2Rvd24oKTsKLX0KLQotLyoqCi0gKiBEZXNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KLSAqLwotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpewotICB0X3R5cGUqIHR5cGUgPSB0ZmllbGQtPmdldF90eXBlKCk7Ci0KLQotICBzdHJpbmcgbmFtZSA9IGRlY2FwaXRhbGl6ZSh0ZmllbGQtPmdldF9uYW1lKCkpOwotICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiNzZXRfIjw8bmFtZSA8PCAiICI7Ci0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3R5cGUob3V0LHR5cGUpOwotICBvdXQgPDwgZW5kbDsKLX0KLQotCi0vKioKLSAqIERlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgotICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV90eXBlKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUpewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLQotICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEUiOwotICB9Ci0KLQotICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0X3N0cnVjdCopdHlwZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIG91dCA8PCAiaXByb3QjIjsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0IjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgb3V0IDw8ICJyZWFkU3RyaW5nIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIG91dCA8PCAicmVhZEJvb2wiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgb3V0IDw8ICJyZWFkQnl0ZSI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIG91dCA8PCAicmVhZEkxNiI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIG91dCA8PCAicmVhZEkzMiI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIG91dCA8PCAicmVhZEk2NCI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIG91dCA8PCAicmVhZERvdWJsZSI7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBvY2FtbCBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHN0cmluZyBlbmFtZSA9IGNhcGl0YWxpemUodHlwZS0+Z2V0X25hbWUoKSk7Ci0gICAgb3V0IDw8ICIoIiA8PGVuYW1lIDw8ICIub2ZfaSBpcHJvdCNyZWFkSTMyKSI7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gREVTRVJJQUxJWkUgVFlQRSAnJXMnXG4iLAotICAgICAgICAgICB0eXBlLT5nZXRfbmFtZSgpLmNfc3RyKCkpOwotICB9Ci19Ci0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYW4gdW5zZXJpYWxpemVyIGZvciBhIHN0cnVjdCwgY2FsbGluZyByZWFkKCkKLSAqLwotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIHN0cmluZyBwcmVmaXggPSAiIjsKLSAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHN0cnVjdC0+Z2V0X3Byb2dyYW0oKTsKLSAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7Ci0gICAgIHByZWZpeCA9IGNhcGl0YWxpemUocHJvZ3JhbS0+Z2V0X25hbWUoKSkgKyAiX3R5cGVzLiI7Ci0gIH0KLSAgc3RyaW5nIG5hbWUgPSBkZWNhcGl0YWxpemUodHN0cnVjdC0+Z2V0X25hbWUoKSk7Ci0gIG91dCA8PCAiKCIgPDwgcHJlZml4IDw8ICJyZWFkXyIgPDwgbmFtZSA8PCAiIGlwcm90KSI7Ci0KLX0KLQotLyoqCi0gKiBTZXJpYWxpemUgYSBjb250YWluZXIgYnkgd3JpdGluZyBvdXQgdGhlIGhlYWRlciBmb2xsb3dlZCBieQotICogZGF0YSBhbmQgdGhlbiBhIGZvb3Rlci4KLSAqLwotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSkgewotICBzdHJpbmcgc2l6ZSA9IHRtcCgiX3NpemUiKTsKLSAgc3RyaW5nIGt0eXBlID0gdG1wKCJfa3R5cGUiKTsKLSAgc3RyaW5nIHZ0eXBlID0gdG1wKCJfdnR5cGUiKTsKLSAgc3RyaW5nIGV0eXBlID0gdG1wKCJfZXR5cGUiKTsKLSAgc3RyaW5nIGNvbiA9IHRtcCgiX2NvbiIpOwotCi0gIHRfZmllbGQgZnNpemUoZ190eXBlX2kzMiwgc2l6ZSk7Ci0gIHRfZmllbGQgZmt0eXBlKGdfdHlwZV9ieXRlLCBrdHlwZSk7Ci0gIHRfZmllbGQgZnZ0eXBlKGdfdHlwZV9ieXRlLCB2dHlwZSk7Ci0gIHRfZmllbGQgZmV0eXBlKGdfdHlwZV9ieXRlLCBldHlwZSk7Ci0KLSAgb3V0IDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICAvLyBEZWNsYXJlIHZhcmlhYmxlcywgcmVhZCBoZWFkZXIKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8ICIobGV0ICgiPDxrdHlwZTw8IiwiPDx2dHlwZTw8IiwiPDxzaXplPDwiKSA9IGlwcm90I3JlYWRNYXBCZWdpbiBpbiIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAibGV0ICI8PGNvbjw8IiA9IEhhc2h0YmwuY3JlYXRlICI8PHNpemU8PCIgaW4iIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgImZvciBpID0gMSB0byAiPDxzaXplPDwiIGRvIiA8PGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgImxldCBfayA9ICI7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfdHlwZShvdXQsKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSk7Ci0gICAgb3V0IDw8ICIgaW4iIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgImxldCBfdiA9ICI7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfdHlwZShvdXQsKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSk7Ci0gICAgb3V0IDw8ICIgaW4iIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIkhhc2h0YmwuYWRkICI8PGNvbjw8ICIgX2sgX3YiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJkb25lOyBpcHJvdCNyZWFkTWFwRW5kOyAiPDxjb248PCIpIjsKLSAgICBpbmRlbnRfZG93bigpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8ICIobGV0ICgiPDxldHlwZTw8IiwiPDxzaXplPDwiKSA9IGlwcm90I3JlYWRTZXRCZWdpbiBpbiIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAibGV0ICI8PGNvbjw8IiA9IEhhc2h0YmwuY3JlYXRlICI8PHNpemU8PCIgaW4iIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgImZvciBpID0gMSB0byAiPDxzaXplPDwiIGRvIiA8PGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIkhhc2h0YmwuYWRkICI8PGNvbjw8IiAiOwotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3R5cGUob3V0LCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKTsKLSAgICBvdXQgPDwgIiB0cnVlIiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgImRvbmU7IGlwcm90I3JlYWRTZXRFbmQ7ICI8PGNvbjw8IikiOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8ICIobGV0ICgiPDxldHlwZTw8IiwiPDxzaXplPDwiKSA9IGlwcm90I3JlYWRMaXN0QmVnaW4gaW4iIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgImxldCAiPDxjb248PCIgPSAoQXJyYXkudG9fbGlzdCAoQXJyYXkuaW5pdCAiPDxzaXplPDwiIChmdW4gXyAtPiAiOwotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3R5cGUob3V0LCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSk7Ci0gICAgb3V0IDw8ICIpKSkgaW4iIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgImlwcm90I3JlYWRMaXN0RW5kOyAiPDxjb248PCIpIjsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLX0KLQotCi0KLS8qKgotICogU2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgotICoKLSAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkIHRvIHNlcmlhbGl6ZQotICogQHBhcmFtIHByZWZpeCBOYW1lIHRvIHByZXBlbmQgdG8gZmllbGQgbmFtZQotICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUpIHsKLSAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOwotCi0gIC8vIERvIG5vdGhpbmcgZm9yIHZvaWQgdHlwZXMKLSAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgewotICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArCi0gICAgICB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gIH0KLQotICBpZihuYW1lLmxlbmd0aCgpID09IDApewotICAgIG5hbWUgPSBkZWNhcGl0YWxpemUodGZpZWxkLT5nZXRfbmFtZSgpKTsKLSAgfQotCi0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodF9zdHJ1Y3QqKXR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgewotCi0KLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm9wcm90IyI7Ci0KLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgdGhyb3cKLSAgICAgICAgICAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIG91dCA8PCAid3JpdGVTdHJpbmcoIiA8PCBuYW1lIDw8ICIpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIG91dCA8PCAid3JpdGVCb29sKCIgPDwgbmFtZSA8PCAiKSI7Ci0gICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgIG91dCA8PCAid3JpdGVCeXRlKCIgPDwgbmFtZSA8PCAiKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgIG91dCA8PCAid3JpdGVJMTYoIiA8PCBuYW1lIDw8ICIpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUkzMigiIDw8IG5hbWUgPDwgIikiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICBvdXQgPDwgIndyaXRlSTY0KCIgPDwgbmFtZSA8PCAiKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIG91dCA8PCAid3JpdGVEb3VibGUoIiA8PCBuYW1lIDw8ICIpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIG9jYW1sIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgc3RyaW5nIGVuYW1lID0gY2FwaXRhbGl6ZSh0eXBlLT5nZXRfbmFtZSgpKTsKLSAgICAgIG91dCA8PCAid3JpdGVJMzIoIjw8ZW5hbWU8PCIudG9faSAiIDw8IG5hbWUgPDwgIikiOwotICAgIH0KLQotICB9IGVsc2UgewotICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIFNFUklBTElaRSBGSUVMRCAnJXMnIFRZUEUgJyVzJ1xuIiwKLSAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCi0gICAgICAgICAgIHR5cGUtPmdldF9uYW1lKCkuY19zdHIoKSk7Ci0gIH0KLSAgb3V0IDw8ICI7IiA8PCBlbmRsOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgYWxsIHRoZSBtZW1iZXJzIG9mIGEgc3RydWN0LgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgdG8gc2VyaWFsaXplCi0gKiBAcGFyYW0gcHJlZml4ICBTdHJpbmcgcHJlZml4IHRvIGF0dGFjaCB0byBhbGwgZmllbGRzCi0gKi8KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgKHZvaWQpIHRzdHJ1Y3Q7Ci0gIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiI3dyaXRlKG9wcm90KSI7Ci19Ci0KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIm9wcm90I3dyaXRlTWFwQmVnaW4oIjw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKSA8PCAiLCI7Ci0gICAgb3V0IDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSA8PCAiLCI7Ci0gICAgb3V0IDw8ICJIYXNodGJsLmxlbmd0aCAiIDw8IHByZWZpeCA8PCAiKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvcHJvdCN3cml0ZVNldEJlZ2luKCIgPDwgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCI7Ci0gICAgb3V0IDw8ICJIYXNodGJsLmxlbmd0aCAiIDw8IHByZWZpeCA8PCAiKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3Byb3Qjd3JpdGVMaXN0QmVnaW4oIiA8PCB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCI7Ci0gICAgb3V0IDw8ICJMaXN0Lmxlbmd0aCAiIDw8IHByZWZpeCA8PCAiKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgc3RyaW5nIGtpdGVyID0gdG1wKCJfa2l0ZXIiKTsKLSAgICBzdHJpbmcgdml0ZXIgPSB0bXAoIl92aXRlciIpOwotICAgIGluZGVudChvdXQpIDw8ICJIYXNodGJsLml0ZXIgKGZ1biAiPDxraXRlcjw8IiAtPiBmdW4gIiA8PCB2aXRlciA8PCAiIC0+ICIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBraXRlciwgdml0ZXIpOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIikgIiA8PCBwcmVmaXggPDwgIjsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgc3RyaW5nIGl0ZXIgPSB0bXAoIl9pdGVyIik7Ci0gICAgaW5kZW50KG91dCkgPDwgIkhhc2h0YmwuaXRlciAoZnVuICI8PGl0ZXI8PCIgLT4gZnVuIF8gLT4gIjsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBpdGVyKTsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICIpICIgPDwgcHJlZml4IDw8ICI7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBzdHJpbmcgaXRlciA9IHRtcCgiX2l0ZXIiKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiTGlzdC5pdGVyIChmdW4gIjw8aXRlcjw8IiAtPiAiOwotICAgIGluZGVudF91cCgpOwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgaXRlcik7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiKSAiIDw8IHByZWZpeCA8PCAiOyIgPDwgIGVuZGw7Ci0gIH0KLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvcHJvdCN3cml0ZU1hcEVuZCI7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvcHJvdCN3cml0ZVNldEVuZCI7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3Byb3Qjd3JpdGVMaXN0RW5kIjsKLSAgfQotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBtYXAuCi0gKgotICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBraXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHZpdGVyKSB7Ci0gIHRfZmllbGQga2ZpZWxkKHRtYXAtPmdldF9rZXlfdHlwZSgpLCBraXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZrZmllbGQpOwotCi0gIHRfZmllbGQgdmZpZWxkKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2aXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZ2ZmllbGQpOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBzZXQuCi0gKi8KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZXIpIHsKLSAgdF9maWVsZCBlZmllbGQodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCk7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIGxpc3QuCi0gKi8KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlcikgewotICB0X2ZpZWxkIGVmaWVsZCh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCk7Ci19Ci0KLQotCi0vKioKLSAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGZvcm0gJ25hbWUgYXJncycKLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KLSAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KLSAqLwotc3RyaW5nIHRfb2NhbWxfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgcmV0dXJuCi0gICAgcHJlZml4ICsgZGVjYXBpdGFsaXplKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgKwotICAgICIgIiArICBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSk7Ci19Ci0KLXN0cmluZyB0X29jYW1sX2dlbmVyYXRvcjo6ZnVuY3Rpb25fdHlwZSh0X2Z1bmN0aW9uKiB0ZnVuYywgYm9vbCBtZXRob2QsIGJvb2wgb3B0aW9ucyl7Ci0gIHN0cmluZyByZXN1bHQ9IiI7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdGZ1bmMtPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICByZXN1bHQgKz0gcmVuZGVyX29jYW1sX3R5cGUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICBpZihvcHRpb25zKQotICAgICAgcmVzdWx0ICs9ICIgb3B0aW9uIjsKLSAgICByZXN1bHQgKz0gIiAtPiAiOwotICB9Ci0gIGlmKGZpZWxkcy5lbXB0eSgpICYmICFtZXRob2QpewotICAgIHJlc3VsdCArPSAidW5pdCAtPiAiOwotICB9Ci0gIHJlc3VsdCArPSByZW5kZXJfb2NhbWxfdHlwZSh0ZnVuYy0+Z2V0X3JldHVybnR5cGUoKSk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhIGZpZWxkIGxpc3QKLSAqLwotc3RyaW5nIHRfb2NhbWxfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIHN0cmluZyByZXN1bHQgPSAiIjsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgcmVzdWx0ICs9ICIgIjsKLSAgICB9Ci0gICAgcmVzdWx0ICs9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi1zdHJpbmcgdF9vY2FtbF9nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlKSB7Ci0gIHN0cmluZyBwcmVmaXggPSAiIjsKLSAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHR5cGUtPmdldF9wcm9ncmFtKCk7Ci0gIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgewotICAgIGlmICghdHR5cGUtPmlzX3NlcnZpY2UoKSkgewotICAgICAgcHJlZml4ID0gY2FwaXRhbGl6ZShwcm9ncmFtLT5nZXRfbmFtZSgpKSArICJfdHlwZXMuIjsKLSAgICB9Ci0gIH0KLQotICBzdHJpbmcgbmFtZSA9IHR0eXBlLT5nZXRfbmFtZSgpOwotICBpZih0dHlwZS0+aXNfc2VydmljZSgpKXsKLSAgICBuYW1lID0gY2FwaXRhbGl6ZShuYW1lKTsKLSAgfSBlbHNlIHsKLSAgICBuYW1lID0gZGVjYXBpdGFsaXplKG5hbWUpOwotICB9Ci0gIHJldHVybiBwcmVmaXggKyBuYW1lOwotfQotCi0vKioKLSAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgUHJvdG9jb2wudF90eXBlIGVudW0KLSAqLwotc3RyaW5nIHRfb2NhbWxfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgcmV0dXJuICJQcm90b2NvbC5UX1ZPSUQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgcmV0dXJuICJQcm90b2NvbC5UX1NUUklORyI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuICJQcm90b2NvbC5UX0JPT0wiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIHJldHVybiAiUHJvdG9jb2wuVF9CWVRFIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIHJldHVybiAiUHJvdG9jb2wuVF9JMTYiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgcmV0dXJuICJQcm90b2NvbC5UX0kzMiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZXR1cm4gIlByb3RvY29sLlRfSTY0IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIHJldHVybiAiUHJvdG9jb2wuVF9ET1VCTEUiOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gIlByb3RvY29sLlRfSTMyIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgcmV0dXJuICJQcm90b2NvbC5UX1NUUlVDVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gIlByb3RvY29sLlRfTUFQIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHJldHVybiAiUHJvdG9jb2wuVF9TRVQiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHJldHVybiAiUHJvdG9jb2wuVF9MSVNUIjsKLSAgfQotCi0gIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotLyoqCi0gKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhbiBvY2FtbCB0eXBlCi0gKi8KLXN0cmluZyB0X29jYW1sX2dlbmVyYXRvcjo6cmVuZGVyX29jYW1sX3R5cGUodF90eXBlKiB0eXBlKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgcmV0dXJuICJ1bml0IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIHJldHVybiAic3RyaW5nIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICByZXR1cm4gImJvb2wiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIHJldHVybiAiaW50IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIHJldHVybiAiaW50IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIHJldHVybiAiSW50MzIudCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZXR1cm4gIkludDY0LnQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuICJmbG9hdCI7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiBjYXBpdGFsaXplKCgodF9lbnVtKil0eXBlKS0+Z2V0X25hbWUoKSkrIi50IjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgcmV0dXJuIHR5cGVfbmFtZSgodF9zdHJ1Y3QqKXR5cGUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKLSAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOwotICAgIHJldHVybiAiKCIrcmVuZGVyX29jYW1sX3R5cGUoa3R5cGUpKyIsIityZW5kZXJfb2NhbWxfdHlwZSh2dHlwZSkrIikgSGFzaHRibC50IjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIHJldHVybiAiKCIrcmVuZGVyX29jYW1sX3R5cGUoZXR5cGUpKyIsYm9vbCkgSGFzaHRibC50IjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICB0X3R5cGUqIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgcmV0dXJuIHJlbmRlcl9vY2FtbF90eXBlKGV0eXBlKSsiIGxpc3QiOwotICB9Ci0KLSAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotfQotCi0KLVRIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1Iob2NhbWwsICJPQ2FtbCIsICIiKQotCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oIGIvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQyN2YzOC4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBUX09PUF9HRU5FUkFUT1JfSAotI2RlZmluZSBUX09PUF9HRU5FUkFUT1JfSAotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotCi0jaW5jbHVkZSAiZ2xvYmFscy5oIgotI2luY2x1ZGUgInRfZ2VuZXJhdG9yLmgiCi0jaW5jbHVkZSAidmVyc2lvbi5oIgotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotCi0vKioKLSAqIENsYXNzIHdpdGggdXRpbGl0eSBtZXRob2RzIHNoYXJlZCBhY3Jvc3MgY29tbW9uIG9iamVjdCBvcmllbnRlZCBsYW5ndWFnZXMuCi0gKiBTcGVjaWZpY2FsbHksIG1vc3Qgb2YgdGhpcyBzdHVmZiBpcyBmb3IgQysrL0phdmEuCi0gKgotICovCi1jbGFzcyB0X29vcF9nZW5lcmF0b3IgOiBwdWJsaWMgdF9nZW5lcmF0b3IgewotIHB1YmxpYzoKLSAgdF9vb3BfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSkgOgotICAgIHRfZ2VuZXJhdG9yKHByb2dyYW0pIHt9Ci0KLSAgLyoqCi0gICAqIFNjb3BpbmcsIHVzaW5nIGN1cmx5IGJyYWNlcyEKLSAgICovCi0KLSAgdm9pZCBzY29wZV91cChzdGQ6Om9zdHJlYW0mIG91dCkgewotICAgIGluZGVudChvdXQpIDw8ICJ7IiA8PCBzdGQ6OmVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gIH0KLQotICB2b2lkIHNjb3BlX2Rvd24oc3RkOjpvc3RyZWFtJiBvdXQpIHsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBzdGQ6OmVuZGw7Ci0gIH0KLQotICBzdGQ6OnN0cmluZyB1cGNhc2Vfc3RyaW5nKHN0ZDo6c3RyaW5nIG9yaWdpbmFsKSB7Ci0gICAgc3RkOjp0cmFuc2Zvcm0ob3JpZ2luYWwuYmVnaW4oKSwgb3JpZ2luYWwuZW5kKCksIG9yaWdpbmFsLmJlZ2luKCksIChpbnQoKikoaW50KSkgdG91cHBlcik7Ci0gICAgcmV0dXJuIG9yaWdpbmFsOwotICB9Ci0KLSAgLyoqCi0gICAqIEdlbmVyYXRlcyBhIGNvbW1lbnQgYWJvdXQgdGhpcyBjb2RlIGJlaW5nIGF1dG9nZW5lcmF0ZWQsIHVzaW5nIEMrKyBzdHlsZQotICAgKiBjb21tZW50cywgd2hpY2ggYXJlIGFsc28gZmFpciBnYW1lIGluIEphdmEgLyBQSFAsIHlheSEKLSAgICoKLSAgICogQHJldHVybiBDLXN0eWxlIGNvbW1lbnQgbWVudGlvbmluZyB0aGF0IHRoaXMgZmlsZSBpcyBhdXRvZ2VuZXJhdGVkLgotICAgKi8KLSAgdmlydHVhbCBzdGQ6OnN0cmluZyBhdXRvZ2VuX2NvbW1lbnQoKSB7Ci0gICAgcmV0dXJuCi0gICAgICBzdGQ6OnN0cmluZygiLyoqXG4iKSArCi0gICAgICAiICogIiArIGF1dG9nZW5fc3VtbWFyeSgpICsgIlxuIiArCi0gICAgICAiICpcbiIgKwotICAgICAgIiAqIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkdcbiIgKwotICAgICAgIiAqICBAZ2VuZXJhdGVkXG4iICsKLSAgICAgICIgKi9cbiI7Ci0gIH0KLQotICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGF1dG9nZW5fc3VtbWFyeSgpIHsKLSAgICByZXR1cm4KLSAgICAgIHN0ZDo6c3RyaW5nKCJBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoIikgKyBUSFJJRlRfVkVSU0lPTiArICIpIjsKLSAgfQotCi0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0X2VudW1fY2xhc3NfbmFtZSh0X3R5cGUqIHR5cGUpIHsKLSAgICBzdGQ6OnN0cmluZyBwYWNrYWdlID0gIiI7Ci0gICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHlwZS0+Z2V0X3Byb2dyYW0oKTsKLSAgICBpZiAocHJvZ3JhbSAhPSBOVUxMICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pIHsKLSAgICAgIHBhY2thZ2UgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJqYXZhIikgKyAiLiI7Ci0gICAgfQotICAgIHJldHVybiBwYWNrYWdlICsgdHlwZS0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV9qYXZhX2RvY3N0cmluZ19jb21tZW50KHN0ZDo6b2ZzdHJlYW0gJm91dCwgc3RkOjpzdHJpbmcgY29udGVudHMpIHsKLSAgICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8qKlxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICogIiwgY29udGVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAqL1xuIik7Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfamF2YV9kb2Moc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIGZpZWxkKSB7Ci0gICAgaWYgKGZpZWxkLT5nZXRfdHlwZSgpLT5pc19lbnVtKCkpIHsKLSAgICAgIHN0ZDo6c3RyaW5nIGNvbWJpbmVkX21lc3NhZ2UgPSBmaWVsZC0+Z2V0X2RvYygpICsgIlxuQHNlZSAiICsgZ2V0X2VudW1fY2xhc3NfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0gICAgICBnZW5lcmF0ZV9qYXZhX2RvY3N0cmluZ19jb21tZW50KG91dCwgY29tYmluZWRfbWVzc2FnZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGdlbmVyYXRlX2phdmFfZG9jKG91dCwgKHRfZG9jKilmaWVsZCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEVtaXRzIGEgSmF2YURvYyBjb21tZW50IGlmIHRoZSBwcm92aWRlZCBvYmplY3QgaGFzIGEgZG9jIGluIFRocmlmdAotICAgKi8KLSAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX2phdmFfZG9jKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2RvYyogdGRvYykgewotICAgIGlmICh0ZG9jLT5oYXNfZG9jKCkpIHsKLSAgICAgIGdlbmVyYXRlX2phdmFfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCB0ZG9jLT5nZXRfZG9jKCkpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBFbWl0cyBhIEphdmFEb2MgY29tbWVudCBpZiB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gb2JqZWN0IGhhcyBhIGRvYyBpbiBUaHJpZnQKLSAgICovCi0gIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV9qYXZhX2RvYyhzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gICAgaWYgKHRmdW5jdGlvbi0+aGFzX2RvYygpKSB7Ci0gICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKLSAgICAgIHNzIDw8IHRmdW5jdGlvbi0+Z2V0X2RvYygpOwotICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7Ci0gICAgICBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHBfaXRlcjsKLSAgICAgIGZvciAocF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IHBfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrcF9pdGVyKSB7Ci0gICAgICAgIHRfZmllbGQqIHAgPSAqcF9pdGVyOwotICAgICAgICBzcyA8PCAiXG5AcGFyYW0gIiA8PCBwLT5nZXRfbmFtZSgpOwotICAgICAgICBpZiAocC0+aGFzX2RvYygpKSB7Ci0gICAgICAgICAgc3MgPDwgIiAiIDw8IHAtPmdldF9kb2MoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8qKlxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgKiAiLCBzcy5zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgKi9cbiIpOwotICAgIH0KLSAgfQotfTsKLQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9wZXJsX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9wZXJsX2dlbmVyYXRvci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA1OWVlOC4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfcGVybF9nZW5lcmF0b3IuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxODIzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpbmNsdWRlIDxsaXN0PgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgInRfb29wX2dlbmVyYXRvci5oIgotI2luY2x1ZGUgInBsYXRmb3JtLmgiCi0jaW5jbHVkZSAidmVyc2lvbi5oIgotCi11c2luZyBzdGQ6Om1hcDsKLXVzaW5nIHN0ZDo6b2ZzdHJlYW07Ci11c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Ci11c2luZyBzdGQ6OnN0cmluZzsKLXVzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwotdXNpbmcgc3RkOjp2ZWN0b3I7Ci0KLXN0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7ICAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCi0KLS8qKgotICogUEVSTCBjb2RlIGdlbmVyYXRvci4KLSAqCi0gKi8KLWNsYXNzIHRfcGVybF9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKLSBwdWJsaWM6Ci0gIHRfcGVybF9nZW5lcmF0b3IoCi0gICAgICB0X3Byb2dyYW0qIHByb2dyYW0sCi0gICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQotICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pCi0gIHsKLSAgICAodm9pZCkgcGFyc2VkX29wdGlvbnM7Ci0gICAgKHZvaWQpIG9wdGlvbl9zdHJpbmc7Ci0gICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tcGVybCI7Ci0gICAgZXNjYXBlX1snJCddID0gIlxcJCI7Ci0gICAgZXNjYXBlX1snQCddID0gIlxcQCI7Ci0gIH0KLQotICAvKioKLSAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcwotICAgKi8KLQotICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7Ci0gIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7Ci0KLSAgLyoqCi0gICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmICAodF90eXBlZGVmKiAgdHR5cGVkZWYpOwotICB2b2lkIGdlbmVyYXRlX2VudW0gICAgICh0X2VudW0qICAgICB0ZW51bSk7Ci0gIHZvaWQgZ2VuZXJhdGVfY29uc3QgICAgKHRfY29uc3QqICAgIHRjb25zdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3RydWN0ICAgKHRfc3RydWN0KiAgIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uICh0X3N0cnVjdCogICB0eGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UgICh0X3NlcnZpY2UqICB0c2VydmljZSk7Ci0KLSAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOwotCi0gIC8qKgotICAgKiBTdHJ1Y3RzIQotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX3Blcmxfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfcGVybF9zdHJ1Y3RfZGVmaW5pdGlvbihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX3hjZXB0aW9uPWZhbHNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9wZXJsX3N0cnVjdF9yZWFkZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfcGVybF9zdHJ1Y3Rfd3JpdGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3BlcmxfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotCi0gIC8qKgotICAgKiBTZXJ2aWNlLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzICAgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3Jlc3QgICAgICAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQgICAgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfcHJvY2Vzc29yICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uICAodF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLQotICAvKioKLSAgICogU2VyaWFsaXphdGlvbiBjb25zdHJ1Y3RzCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQgICAgICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiAgICB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2xhc3M9ZmFsc2UpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0ICAgICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogICB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lciAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiAgICAgdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogICAgICB0c2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50ICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqICAgICAgdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogICAgIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZCAgICAgICAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogICAgdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3QgICAgICAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqICAgdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyICAgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogICAgIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudCAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqICAgICAgdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGtpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgdml0ZXIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50ICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogICAgICB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlcik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50ICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogICAgIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlcik7Ci0KLSAgLyoqCi0gICAqIEhlbHBlciByZW5kZXJpbmcgZnVuY3Rpb25zCi0gICAqLwotCi0gIHN0ZDo6c3RyaW5nIHBlcmxfaW5jbHVkZXMoKTsKLSAgc3RkOjpzdHJpbmcgZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdD1mYWxzZSwgYm9vbCBvYmo9ZmFsc2UpOwotICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KTsKLSAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOwotCi0gIHN0ZDo6c3RyaW5nIGF1dG9nZW5fY29tbWVudCgpIHsKLSAgICByZXR1cm4KLSAgICAgIHN0ZDo6c3RyaW5nKCIjXG4iKSArCi0gICAgICAiIyBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoIiArIFRIUklGVF9WRVJTSU9OICsgIilcbiIgKwotICAgICAgIiNcbiIgKwotICAgICAgIiMgRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lOR1xuIiArCi0gICAgICAiI1xuIjsKLSAgfQotCi0gIHZvaWQgcGVybF9uYW1lc3BhY2VfZGlycyh0X3Byb2dyYW0qIHAsIHN0ZDo6bGlzdDxzdGQ6OnN0cmluZz4mIGRpcnMpIHsKLSAgICBzdGQ6OnN0cmluZyBucyA9IHAtPmdldF9uYW1lc3BhY2UoInBlcmwiKTsKLSAgICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIGxvYzsKLQotICAgIGlmIChucy5zaXplKCkgPiAwKSB7Ci0gICAgICB3aGlsZSAoKGxvYyA9IG5zLmZpbmQoIi4iKSkgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKLSAgICAgICAgZGlycy5wdXNoX2JhY2sobnMuc3Vic3RyKDAsIGxvYykpOwotICAgICAgICBucyA9IG5zLnN1YnN0cihsb2MrMSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKG5zLnNpemUoKSA+IDApIHsKLSAgICAgIGRpcnMucHVzaF9iYWNrKG5zKTsKLSAgICB9Ci0gIH0KLQotICBzdGQ6OnN0cmluZyBwZXJsX25hbWVzcGFjZSh0X3Byb2dyYW0qIHApIHsKLSAgICBzdGQ6OnN0cmluZyBucyA9IHAtPmdldF9uYW1lc3BhY2UoInBlcmwiKTsKLSAgICBzdGQ6OnN0cmluZyByZXN1bHQgPSAiIjsKLSAgICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIGxvYzsKLQotICAgIGlmIChucy5zaXplKCkgPiAwKSB7Ci0gICAgICB3aGlsZSAoKGxvYyA9IG5zLmZpbmQoIi4iKSkgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKLSAgICAgICAgcmVzdWx0ICs9IG5zLnN1YnN0cigwLCBsb2MpOwotICAgICAgICByZXN1bHQgKz0gIjo6IjsKLSAgICAgICAgbnMgPSBucy5zdWJzdHIobG9jKzEpOwotICAgICAgfQotCi0gICAgICBpZiAobnMuc2l6ZSgpID4gMCkgewotICAgICAgICByZXN1bHQgKz0gbnMgKyAiOjoiOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBzdGQ6OnN0cmluZyBnZXRfbmFtZXNwYWNlX291dF9kaXIoKSB7Ci0gICAgc3RkOjpzdHJpbmcgb3V0ZGlyID0gZ2V0X291dF9kaXIoKTsKLSAgICBzdGQ6Omxpc3Q8c3RkOjpzdHJpbmc+IGRpcnM7Ci0gICAgcGVybF9uYW1lc3BhY2VfZGlycyhwcm9ncmFtXywgZGlycyk7Ci0gICAgc3RkOjpsaXN0PHN0ZDo6c3RyaW5nPjo6aXRlcmF0b3IgaXQ7Ci0gICAgZm9yIChpdCA9IGRpcnMuYmVnaW4oKTsgaXQgIT0gZGlycy5lbmQoKTsgaXQrKykgewotICAgICAgb3V0ZGlyICs9ICppdCArICIvIjsKLSAgICB9Ci0gICAgcmV0dXJuIG91dGRpcjsKLSAgfQotCi0gcHJpdmF0ZToKLQotICAvKioKLSAgICogRmlsZSBzdHJlYW1zCi0gICAqLwotICBzdGQ6Om9mc3RyZWFtIGZfdHlwZXNfOwotICBzdGQ6Om9mc3RyZWFtIGZfY29uc3RzXzsKLSAgc3RkOjpvZnN0cmVhbSBmX2hlbHBlcnNfOwotICBzdGQ6Om9mc3RyZWFtIGZfc2VydmljZV87Ci0KLX07Ci0KLQotLyoqCi0gKiBQcmVwYXJlcyBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAotICogc3RyZWFtcy4KLSAqCi0gKiBAcGFyYW0gdHByb2dyYW0gVGhlIHByb2dyYW0gdG8gZ2VuZXJhdGUKLSAqLwotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKLSAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5Ci0gIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7Ci0KLSAgc3RyaW5nIG91dGRpciA9IGdldF9vdXRfZGlyKCk7Ci0gIHN0ZDo6bGlzdDxzdGQ6OnN0cmluZz4gZGlyczsKLSAgcGVybF9uYW1lc3BhY2VfZGlycyhwcm9ncmFtXywgZGlycyk7Ci0gIHN0ZDo6bGlzdDxzdGQ6OnN0cmluZz46Oml0ZXJhdG9yIGl0OwotICBmb3IgKGl0ID0gZGlycy5iZWdpbigpOyBpdCAhPSBkaXJzLmVuZCgpOyBpdCsrKSB7Ci0gICAgICBvdXRkaXIgKz0gKml0ICsgIi8iOwotICAgICAgTUtESVIob3V0ZGlyLmNfc3RyKCkpOwotICB9Ci0KLSAgLy8gTWFrZSBvdXRwdXQgZmlsZQotICBzdHJpbmcgZl90eXBlc19uYW1lID0gb3V0ZGlyKyJUeXBlcy5wbSI7Ci0gIGZfdHlwZXNfLm9wZW4oZl90eXBlc19uYW1lLmNfc3RyKCkpOwotICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IG91dGRpcisiQ29uc3RhbnRzLnBtIjsKLSAgZl9jb25zdHNfLm9wZW4oZl9jb25zdHNfbmFtZS5jX3N0cigpKTsKLQotICAvLyBQcmludCBoZWFkZXIKLSAgZl90eXBlc18gPDwKLSAgICBhdXRvZ2VuX2NvbW1lbnQoKSA8PAotICAgIHBlcmxfaW5jbHVkZXMoKTsKLQotICAvLyBQcmludCBoZWFkZXIKLSAgZl9jb25zdHNfIDw8Ci0gICAgYXV0b2dlbl9jb21tZW50KCkgPDwKLSAgICAicGFja2FnZSAiPDwgcGVybF9uYW1lc3BhY2UocHJvZ3JhbV8pIDw8IkNvbnN0YW50czsiPDxlbmRsPDwKLSAgICBwZXJsX2luY2x1ZGVzKCkgPDwKLSAgICBlbmRsOwotfQotCi0vKioKLSAqIFByaW50cyBzdGFuZGFyZCBqYXZhIGltcG9ydHMKLSAqLwotc3RyaW5nIHRfcGVybF9nZW5lcmF0b3I6OnBlcmxfaW5jbHVkZXMoKSB7Ci0gIHN0cmluZyBpbmM7Ci0KLSAgaW5jICA9ICJyZXF1aXJlIDUuNi4wO1xuIjsKLSAgaW5jICs9ICJ1c2Ugc3RyaWN0O1xuIjsKLSAgaW5jICs9ICJ1c2Ugd2FybmluZ3M7XG4iOwotICBpbmMgKz0gInVzZSBUaHJpZnQ7XG5cbiI7Ci0KLSAgcmV0dXJuIGluYzsKLX0KLQotLyoqCi0gKiBDbG9zZSB1cCAob3IgZG93bikgc29tZSBmaWxlei4KLSAqLwotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7Ci0gIC8vIENsb3NlIHR5cGVzIGZpbGUKLSAgZl90eXBlc18gPDwgIjE7IiA8PCBlbmRsOwotICBmX3R5cGVzXy5jbG9zZSgpOwotCi0gIGZfY29uc3RzXyA8PCAiMTsiIDw8IGVuZGw7Ci0gIGZfY29uc3RzXy5jbG9zZSgpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIFRoaXMgaXMgbm90IGRvbmUgaW4gUEVSTCwgdHlwZXMgYXJlIGFsbCBpbXBsaWNpdC4KLSAqCi0gKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgotICovCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgewotICAodm9pZCkgdHR5cGVkZWY7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGNvZGUgZm9yIGFuIGVudW1lcmF0ZWQgdHlwZS4gU2luY2UgZGVmaW5lIGlzIGV4cGVuc2l2ZSB0byBsb29rdXAKLSAqIGluIFBFUkwsIHdlIHVzZSBhIGdsb2JhbCBhcnJheSBmb3IgdGhpcy4KLSAqCi0gKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCi0gKi8KLXZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7Ci0gIGZfdHlwZXNfIDw8ICJwYWNrYWdlICIgPDwgcGVybF9uYW1lc3BhY2UocHJvZ3JhbV8pIDw8dGVudW0tPmdldF9uYW1lKCk8PCI7Ijw8ZW5kbDsKLQotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7Ci0gIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgICBmX3R5cGVzXyA8PCAidXNlIGNvbnN0YW50ICI8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9PiAiIDw8IHZhbHVlIDw8ICI7IiA8PCBlbmRsOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGUgYSBjb25zdGFudCB2YWx1ZQotICovCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCkgewotICB0X3R5cGUqIHR5cGUgPSB0Y29uc3QtPmdldF90eXBlKCk7Ci0gIHN0cmluZyBuYW1lID0gdGNvbnN0LT5nZXRfbmFtZSgpOwotICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSA9IHRjb25zdC0+Z2V0X3ZhbHVlKCk7Ci0KLSAgZl9jb25zdHNfIDw8ICJ1c2UgY29uc3RhbnQgIiA8PCBuYW1lIDw8ICIgPT4gIjsKLSAgZl9jb25zdHNfIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0eXBlLCB2YWx1ZSk7Ci0gIGZfY29uc3RzXyA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIFByaW50cyB0aGUgdmFsdWUgb2YgYSBjb25zdGFudCB3aXRoIHRoZSBnaXZlbiB0eXBlLiBOb3RlIHRoYXQgdHlwZSBjaGVja2luZwotICogaXMgTk9UIHBlcmZvcm1lZCBpbiB0aGlzIGZ1bmN0aW9uIGFzIGl0IGlzIGFsd2F5cyBydW4gYmVmb3JlaGFuZCB1c2luZyB0aGUKLSAqIHZhbGlkYXRlX3R5cGVzIG1ldGhvZCBpbiBtYWluLmNjCi0gKi8KLXN0cmluZyB0X3BlcmxfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgewotICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OwotCi0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICBvdXQgPDwgJyInIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgb3V0IDw8ICh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDAgPyAiMSIgOiAiMCIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgewotICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBvdXQgPDwgIm5ldyAiIDw8IHBlcmxfbmFtZXNwYWNlKHR5cGUtPmdldF9wcm9ncmFtKCkpIDw8IHR5cGUtPmdldF9uYW1lKCkgPDwgIih7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOwotICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKLSAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7Ci0gICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7Ci0gICAgICB9Ci0gICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGdfdHlwZV9zdHJpbmcsIHZfaXRlci0+Zmlyc3QpOwotICAgICAgb3V0IDw8ICIgPT4gIjsKLSAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotICAgICAgb3V0IDw8ICIsIjsKLSAgICAgIG91dCA8PCBlbmRsOwotICAgIH0KLQotICAgIG91dCA8PCAifSkiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKLSAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOwotICAgIG91dCA8PCAieyIgPDwgZW5kbDsKLQotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoa3R5cGUsIHZfaXRlci0+Zmlyc3QpOwotICAgICAgb3V0IDw8ICIgPT4gIjsKLSAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUodnR5cGUsIHZfaXRlci0+c2Vjb25kKTsKLSAgICAgIG91dCA8PCAiLCIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBvdXQgPDwgIn0iOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkgewotICAgIHRfdHlwZSogZXR5cGU7Ci0gICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB9IGVsc2UgewotICAgICAgZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIH0KLSAgICBvdXQgPDwgIlsiIDw8IGVuZGw7Ci0gICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7Ci0gICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0KLSAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZXR5cGUsICp2X2l0ZXIpOwotICAgICAgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgICAgIG91dCA8PCAiID0+IDEiOwotICAgICAgfQotICAgICAgb3V0IDw8ICIsIiA8PCBlbmRsOwotICAgIH0KLSAgICBvdXQgPDwgIl0iOwotICB9Ci0gIHJldHVybiBvdXQuc3RyKCk7Ci19Ci0KLS8qKgotICogTWFrZSBhIHN0cnVjdAotICovCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICBnZW5lcmF0ZV9wZXJsX3N0cnVjdCh0c3RydWN0LCBmYWxzZSk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGV4Y2VwdGlvbi4gQmFzaWNhbGx5IHRoZSBzYW1lCi0gKiBhcyBhIHN0cnVjdCBidXQgZXh0ZW5kcyB0aGUgRXhjZXB0aW9uIGNsYXNzLgotICoKLSAqIEBwYXJhbSB0eGNlcHRpb24gVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgewotICBnZW5lcmF0ZV9wZXJsX3N0cnVjdCh0eGNlcHRpb24sIHRydWUpOwotfQotCi0vKioKLSAqIFN0cnVjdHMgY2FuIGJlIG5vcm1hbCBvciBleGNlcHRpb25zLgotICovCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Blcmxfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgewotICBnZW5lcmF0ZV9wZXJsX3N0cnVjdF9kZWZpbml0aW9uKGZfdHlwZXNfLCB0c3RydWN0LCBpc19leGNlcHRpb24pOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuIFRoaXMgaXMgbm90aGluZyBpbiBQRVJMCi0gKiB3aGVyZSB0aGUgb2JqZWN0cyBhcmUgYWxsIGp1c3QgYXNzb2NpYXRpdmUgYXJyYXlzICh1bmxlc3Mgb2YgY291cnNlIHdlCi0gKiBkZWNpZGUgdG8gc3RhcnQgdXNpbmcgb2JqZWN0cyBmb3IgdGhlbS4uLikKLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wZXJsX3N0cnVjdF9kZWZpbml0aW9uKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pIHsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLQotICBvdXQgPDwKLSAgICAgICJwYWNrYWdlICIgPDwgcGVybF9uYW1lc3BhY2UodHN0cnVjdC0+Z2V0X3Byb2dyYW0oKSkgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCI7XG4iOwotICBpZiAoaXNfZXhjZXB0aW9uKSB7Ci0gICAgb3V0IDw8ICJ1c2UgYmFzZSBxdyhUaHJpZnQ6OlRFeGNlcHRpb24pO1xuIjsKLSAgfQotCi0gIC8vQ3JlYXRlIHNpbXBsZSBhY2Vzc29yIG1ldGhvZHMKLSAgb3V0IDw8ICJ1c2UgYmFzZSBxdyhDbGFzczo6QWNjZXNzb3IpO1xuIjsKLQotICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7Ci0gICAgICBvdXQgPDwgcGVybF9uYW1lc3BhY2UodHN0cnVjdC0+Z2V0X3Byb2dyYW0oKSkgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCItPm1rX2FjY2Vzc29ycyggcXcoICI7Ci0gICAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICAgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOwotICAgICAgICAgIGlmICghdC0+aXNfeGNlcHRpb24oKSkgewotICAgICAgICAgICAgICBvdXQgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIjsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIG91dCA8PCAiKSApO1xuIjsKLSAgfQotCi0gIG91dCA8PCBlbmRsOwotCi0gIC8vIG5ldygpCi0gIGluZGVudF91cCgpOwotICBvdXQgPDwKLSAgICAic3ViIG5ldyB7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIm15ICRjbGFzc25hbWUgPSBzaGlmdDsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAibXkgJHNlbGYgICAgICA9IHt9OyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJteSAkdmFscyAgICAgID0gc2hpZnQgfHwge307IiA8PCBlbmRsOwotCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBzdHJpbmcgZHZhbCA9ICJ1bmRlZiI7Ci0gICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOwotICAgIGlmICgoKm1faXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwgJiYgISh0LT5pc19zdHJ1Y3QoKSB8fCB0LT5pc194Y2VwdGlvbigpKSkgewotICAgICAgZHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZSgoKm1faXRlciktPmdldF90eXBlKCksICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkpOwotICAgIH0KLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICIkc2VsZi0+eyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJ9ID0gIiA8PCBkdmFsIDw8ICI7IiA8PCBlbmRsOwotICB9Ci0KLSAgLy8gR2VuZXJhdGUgY29uc3RydWN0b3IgZnJvbSBhcnJheQotICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7Ci0KLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSAhPSBOVUxMICYmICh0LT5pc19zdHJ1Y3QoKSB8fCB0LT5pc194Y2VwdGlvbigpKSkgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAiJHNlbGYtPnsiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAifSA9ICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHQsICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkpIDw8ICI7IiA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLQotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKFVOSVZFUlNBTDo6aXNhKCR2YWxzLCdIQVNIJykpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiAoZGVmaW5lZCAkdmFscy0+eyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJ9KSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgICRzZWxmLT57IiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIn0gPSAkdmFscy0+eyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJ9OyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotCi0gIH0KLQotICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBibGVzcyAoJHNlbGYsICRjbGFzc25hbWUpOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgb3V0IDw8ICJ9XG5cbiI7Ci0KLSAgb3V0IDw8Ci0gICAgInN1YiBnZXROYW1lIHsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gJyIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiJzsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgZ2VuZXJhdGVfcGVybF9zdHJ1Y3RfcmVhZGVyKG91dCwgdHN0cnVjdCk7Ci0gIGdlbmVyYXRlX3Blcmxfc3RydWN0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOwotCi19Ci0KLS8qKgotICogR2VuZXJhdGVzIHRoZSByZWFkKCkgbWV0aG9kIGZvciBhIHN0cnVjdAotICovCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Blcmxfc3RydWN0X3JlYWRlcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIG91dCA8PCAic3ViIHJlYWQgeyIgPDxlbmRsOwotCi0gIGluZGVudF91cCgpOwotCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJteSAoJHNlbGYsICRpbnB1dCkgPSBAXzsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAibXkgJHhmZXIgID0gMDsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAibXkgJGZuYW1lOyIgICAgIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAibXkgJGZ0eXBlID0gMDsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAibXkgJGZpZCAgID0gMDsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZFN0cnVjdEJlZ2luKFxcJGZuYW1lKTsiIDw8IGVuZGw7Ci0KLQotICAvLyBMb29wIG92ZXIgcmVhZGluZyBpbiBmaWVsZHMKLSAgaW5kZW50KG91dCkgPDwgIndoaWxlICgxKSAiIDw8IGVuZGw7Ci0KLSAgc2NvcGVfdXAob3V0KTsKLQotICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJGlucHV0LT5yZWFkRmllbGRCZWdpbihcXCRmbmFtZSwgXFwkZnR5cGUsIFxcJGZpZCk7IiA8PCBlbmRsOwotCi0gIC8vIENoZWNrIGZvciBmaWVsZCBTVE9QIG1hcmtlciBhbmQgYnJlYWsKLSAgaW5kZW50KG91dCkgPDwgImlmICgkZnR5cGUgPT0gVFR5cGU6OlNUT1ApIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAibGFzdDsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotCi0gIC8vIFN3aXRjaCBzdGF0ZW1lbnQgb24gdGhlIGZpZWxkIHdlIGFyZSByZWFkaW5nCi0gIGluZGVudChvdXQpIDw8ICJTV0lUQ0g6IGZvcigkZmlkKSIgPDwgZW5kbDsKLQotICBzY29wZV91cChvdXQpOwotCi0gIC8vIEdlbmVyYXRlIGRlc2VyaWFsaXphdGlvbiBjb2RlIGZvciBrbm93biBjYXNlcwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotCi0gICAgaW5kZW50KG91dCkgPDwgIi9eIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiJC8gJiYgZG97IjsKLSAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCRmdHlwZSA9PSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIpIHsiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfdXAoKTsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJzZWxmLT4iKTsKLSAgICBpbmRlbnRfZG93bigpOwotCi0gICAgaW5kZW50KG91dCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOwotCi0gICAgaW5kZW50KG91dCkgPDwgICIgICR4ZmVyICs9ICRpbnB1dC0+c2tpcCgkZnR5cGUpOyIgPDwgZW5kbDsKLQotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJsYXN0OyB9OyIgPDwgZW5kbDsKLQotICB9Ci0gIC8vIEluIHRoZSBkZWZhdWx0IGNhc2Ugd2Ugc2tpcCB0aGUgZmllbGQKLQotICBpbmRlbnQob3V0KSA8PCAgIiAgJHhmZXIgKz0gJGlucHV0LT5za2lwKCRmdHlwZSk7IiA8PCBlbmRsOwotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLQotICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJGlucHV0LT5yZWFkRmllbGRFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotCi0gIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkaW5wdXQtPnJlYWRTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgInJldHVybiAkeGZlcjsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIHRoZSB3cml0ZSgpIG1ldGhvZCBmb3IgYSBzdHJ1Y3QKLSAqLwotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wZXJsX3N0cnVjdF93cml0ZXIob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBvdXQgPDwgInN1YiB3cml0ZSB7IiA8PCBlbmRsOwotCi0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAibXkgKCRzZWxmLCAkb3V0cHV0KSA9IEBfOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIm15ICR4ZmVyICAgPSAwOyIgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTdHJ1Y3RCZWdpbignIiA8PCBuYW1lIDw8ICInKTsiIDw8IGVuZGw7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChkZWZpbmVkICRzZWxmLT57IiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIn0pIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIiR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRCZWdpbigiIDw8Ci0gICAgICAiJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInLCAiIDw8Ci0gICAgICB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiKTsiIDw8IGVuZGw7Ci0KLQotICAgIC8vIFdyaXRlIGZpZWxkIGNvbnRlbnRzCi0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInNlbGYtPiIpOwotCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgIiR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICB9Ci0KLQotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAiJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZFN0b3AoKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgb3V0IDw8aW5kZW50KCkgPDwgInJldHVybiAkeGZlcjsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHRocmlmdCBzZXJ2aWNlLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBmX3NlcnZpY2VfbmFtZSA9IGdldF9uYW1lc3BhY2Vfb3V0X2RpcigpK3NlcnZpY2VfbmFtZV8rIi5wbSI7Ci0gIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgLy8vICAgICAgInBhY2thZ2UgIjw8c2VydmljZV9uYW1lXzw8IjsiPDxlbmRsPDwKLSAgICBhdXRvZ2VuX2NvbW1lbnQoKSA8PAotICAgIHBlcmxfaW5jbHVkZXMoKTsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgInVzZSAiIDw8IHBlcmxfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSA8PCAiVHlwZXM7IiA8PCBlbmRsOwotCi0gIHRfc2VydmljZSogZXh0ZW5kc19zID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7Ci0gIGlmIChleHRlbmRzX3MgIT0gTlVMTCkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgICJ1c2UgIiA8PCBwZXJsX25hbWVzcGFjZShleHRlbmRzX3MtPmdldF9wcm9ncmFtKCkpIDw8IGV4dGVuZHNfcy0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKLSAgfQotCi0gIGZfc2VydmljZV8gPDwKLSAgICBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIHRoZSB0aHJlZSBtYWluIHBhcnRzIG9mIHRoZSBzZXJ2aWNlICh3ZWxsLCB0d28gZm9yIG5vdyBpbiBQRVJMKQotICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfcmVzdCh0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3IodHNlcnZpY2UpOwotCi0gIC8vIENsb3NlIHNlcnZpY2UgZmlsZQotICBmX3NlcnZpY2VfIDw8ICIxOyIgPDwgZW5kbDsKLSAgZl9zZXJ2aWNlXy5jbG9zZSgpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2Ugc2VydmVyIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KLSAqLwotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3Nvcih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIC8vIEdlbmVyYXRlIHRoZSBkaXNwYXRjaCBtZXRob2RzCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotCi0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIHN0cmluZyBleHRlbmRzX3Byb2Nlc3NvciA9ICIiOwotICB0X3NlcnZpY2UqIGV4dGVuZHNfcyA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOwotICBpZiAoZXh0ZW5kc19zICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gcGVybF9uYW1lc3BhY2UoZXh0ZW5kc19zLT5nZXRfcHJvZ3JhbSgpKSArIGV4dGVuZHNfcy0+Z2V0X25hbWUoKTsKLSAgICBleHRlbmRzX3Byb2Nlc3NvciA9ICJ1c2UgYmFzZSBxdygiICsgZXh0ZW5kcyArICJQcm9jZXNzb3IpOyI7Ci0gIH0KLQotICBpbmRlbnRfdXAoKTsKLQotICAvLyBHZW5lcmF0ZSB0aGUgaGVhZGVyIHBvcnRpb24KLSAgZl9zZXJ2aWNlXyA8PAotICAgICJwYWNrYWdlICIgPDwgcGVybF9uYW1lc3BhY2UocHJvZ3JhbV8pIDw8IHNlcnZpY2VfbmFtZV8gPDwgIlByb2Nlc3NvcjsiIDw8IGVuZGwgPDwgZW5kbCA8PAotICAgICJ1c2Ugc3RyaWN0OyIgPDwgZW5kbCA8PAotICAgIGV4dGVuZHNfcHJvY2Vzc29yIDw8IGVuZGwgPDwgZW5kbDsKLQotCi0gIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8ICJzdWIgbmV3IHsiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJteSAoJGNsYXNzbmFtZSwgJGhhbmRsZXIpID0gQF87Ijw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJteSAkc2VsZiAgICAgID0ge307IiAgIDw8IGVuZGw7Ci0KLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiJHNlbGYtPntoYW5kbGVyfSA9ICRoYW5kbGVyOyIgPDwgZW5kbDsKLQotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJyZXR1cm4gYmxlc3MgKCRzZWxmLCAkY2xhc3NuYW1lKTsiPDxlbmRsOwotCi0gICAgaW5kZW50X2Rvd24oKTsKLQotICAgIGZfc2VydmljZV8gPDwKLSAgICAgICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSB0aGUgc2VydmVyIGltcGxlbWVudGF0aW9uCi0gIGZfc2VydmljZV8gPDwgInN1YiBwcm9jZXNzIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAibXkgKCRzZWxmLCAkaW5wdXQsICRvdXRwdXQpID0gQF87IiA8PCBlbmRsOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAibXkgJHJzZXFpZCA9IDA7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIm15ICRmbmFtZSAgPSB1bmRlZjsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAibXkgJG10eXBlICA9IDA7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICIkaW5wdXQtPnJlYWRNZXNzYWdlQmVnaW4oXFwkZm5hbWUsIFxcJG10eXBlLCBcXCRyc2VxaWQpOyIgPDwgZW5kbDsKLQotICAvLyBIT1Q6IGNoZWNrIGZvciBtZXRob2QgaW1wbGVtZW50YXRpb24KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJteSAkbWV0aG9kbmFtZSA9ICdwcm9jZXNzXycuJGZuYW1lOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJpZiAoISRzZWxmLT5jYW4oJG1ldGhvZG5hbWUpKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgIiRpbnB1dC0+c2tpcChUVHlwZTo6U1RSVUNUKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiJGlucHV0LT5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJteSAkeCA9IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oJ0Z1bmN0aW9uICcuJGZuYW1lLicgbm90IGltcGxlbWVudGVkLicsIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6VU5LTk9XTl9NRVRIT0QpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIkb3V0cHV0LT53cml0ZU1lc3NhZ2VCZWdpbigkZm5hbWUsIFRNZXNzYWdlVHlwZTo6RVhDRVBUSU9OLCAkcnNlcWlkKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiJHgtPndyaXRlKCRvdXRwdXQpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIkb3V0cHV0LT53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiJG91dHB1dC0+Z2V0VHJhbnNwb3J0KCktPmZsdXNoKCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiRzZWxmLT4kbWV0aG9kbmFtZSgkcnNlcWlkLCAkaW5wdXQsICRvdXRwdXQpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJyZXR1cm4gMTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgIn0iIDw8IGVuZGwgPDxlbmRsOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzIHN1YmZ1bmN0aW9ucwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odHNlcnZpY2UsICpmX2l0ZXIpOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgcHJvY2VzcyBmdW5jdGlvbiBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHdyaXRlIGEgZGlzcGF0Y2hlciBmb3IKLSAqLwotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gIC8vIE9wZW4gZnVuY3Rpb24KLSAgZl9zZXJ2aWNlXyA8PAotICAgICJzdWIgcHJvY2Vzc18iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiIHsiPDxlbmRsOwotCi0gIGluZGVudF91cCgpOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAibXkgKCRzZWxmLCAkc2VxaWQsICRpbnB1dCwgJG91dHB1dCkgPSBAXzsiIDw8IGVuZGw7Ci0KLSAgc3RyaW5nIGFyZ3NuYW1lID0gcGVybF9uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpICsgc2VydmljZV9uYW1lXyArICJfIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfYXJncyI7Ci0gIHN0cmluZyByZXN1bHRuYW1lID0gcGVybF9uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpICsgc2VydmljZV9uYW1lXyArICJfIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgIm15ICRhcmdzID0gbmV3ICIgPDwgYXJnc25hbWUgPDwgIigpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIkYXJncy0+cmVhZCgkaW5wdXQpOyIgPDwgZW5kbDsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgIiRpbnB1dC0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLQotICAvLyBEZWNsYXJlIHJlc3VsdCBmb3Igbm9uIG9uZXdheSBmdW5jdGlvbgotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAibXkgJHJlc3VsdCA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIigpOyIgPDwgZW5kbDsKLSAgfQotCi0gIC8vIFRyeSBibG9jayBmb3IgYSBmdW5jdGlvbiB3aXRoIGV4Y2VwdGlvbnMKLSAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgImV2YWwgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIHRoZSBmdW5jdGlvbiBjYWxsCi0gIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOwotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOwotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCAiJHJlc3VsdC0+e3N1Y2Nlc3N9ID0gIjsKLSAgfQotICBmX3NlcnZpY2VfIDw8Ci0gICAgIiRzZWxmLT57aGFuZGxlcn0tPiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8ICIsICI7Ci0gICAgfQotICAgIGZfc2VydmljZV8gPDwgIiRhcmdzLT4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgfQotICBmX3NlcnZpY2VfIDw8ICIpOyIgPDwgZW5kbDsKLQotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgeGNlcHRpb25zLnNpemUoKSA+IDApIHsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ9OyBpZiggVU5JVkVSU0FMOjppc2EoJEAsJyIgPDwKLSAgICAgICAgICBwZXJsX25hbWVzcGFjZSgoKnhfaXRlciktPmdldF90eXBlKCktPmdldF9wcm9ncmFtKCkpIDw8Ci0gICAgICAgICAgKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpIDw8Ci0gICAgICAgICAgIicpICl7ICIgPDwgZW5kbDsKLQotICAgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgICAgIGluZGVudF91cCgpOwotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiRyZXN1bHQtPnsiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAifSA9ICRAOyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZl9zZXJ2aWNlXyA8PCAifSIgPDwgZW5kbDsKLSAgfQotCi0gIC8vIFNob3J0Y3V0IG91dCBoZXJlIGZvciBvbmV3YXkgZnVuY3Rpb25zCi0gIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAifSIgPDwgZW5kbDsKLSAgICByZXR1cm47Ci0gIH0KLSAgLy8gU2VyaWFsaXplIHRoZSByZXF1ZXN0IGhlYWRlcgotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgIiRvdXRwdXQtPndyaXRlTWVzc2FnZUJlZ2luKCciIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiJywgVE1lc3NhZ2VUeXBlOjpSRVBMWSwgJHNlcWlkKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiJHJlc3VsdC0+d3JpdGUoJG91dHB1dCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiRvdXRwdXQtPndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIkb3V0cHV0LT5nZXRUcmFuc3BvcnQoKS0+Zmx1c2goKTsiIDw8IGVuZGw7Ci0KLSAgLy8gQ2xvc2UgZnVuY3Rpb24KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXyA8PAotICAgICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGhlbHBlciBmdW5jdGlvbnMgZm9yIGEgc2VydmljZS4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKLSAqLwotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSkgewotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgIiMgSEVMUEVSIEZVTkNUSU9OUyBBTkQgU1RSVUNUVVJFUyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9zdHJ1Y3QqIHRzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotICAgIHN0cmluZyBuYW1lID0gdHMtPmdldF9uYW1lKCk7Ci0gICAgdHMtPnNldF9uYW1lKHNlcnZpY2VfbmFtZV8gKyAiXyIgKyBuYW1lKTsKLSAgICBnZW5lcmF0ZV9wZXJsX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sIHRzLCBmYWxzZSk7Ci0gICAgZ2VuZXJhdGVfcGVybF9mdW5jdGlvbl9oZWxwZXJzKCpmX2l0ZXIpOwotICAgIHRzLT5zZXRfbmFtZShuYW1lKTsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBhbmQgaGVscGVycyBmb3IgYSBmdW5jdGlvbi4KLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbgotICovCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3BlcmxfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCBzZXJ2aWNlX25hbWVfICsgIl8iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKLSAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKLSAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOwotICB9Ci0KLSAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgcmVzdWx0LmFwcGVuZCgqZl9pdGVyKTsKLSAgfQotCi0gIGdlbmVyYXRlX3Blcmxfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgJnJlc3VsdCwgZmFsc2UpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgaW50ZXJmYWNlIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCi0gKi8KLXZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZXh0ZW5kc19pZiA9ICIiOwotICB0X3NlcnZpY2UqIGV4dGVuZHNfcyA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOwotICBpZiAoZXh0ZW5kc19zICE9IE5VTEwpIHsKLSAgICBleHRlbmRzX2lmID0gInVzZSBiYXNlIHF3KCIgKyBwZXJsX25hbWVzcGFjZShleHRlbmRzX3MtPmdldF9wcm9ncmFtKCkpICsgZXh0ZW5kc19zLT5nZXRfbmFtZSgpICsgIklmKTsiOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgICJwYWNrYWdlICIgPDwgcGVybF9uYW1lc3BhY2UocHJvZ3JhbV8pIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmOyIgPDwgZW5kbCA8PCBlbmRsIDw8Ci0gICAgInVzZSBzdHJpY3Q7IiA8PCBlbmRsIDw8Ci0gICAgZXh0ZW5kc19pZiA8PCBlbmRsIDw8IGVuZGw7Ci0KLQotICBpbmRlbnRfdXAoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgInN1YiAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PGVuZGw8PCAiICBkaWUgJ2ltcGxlbWVudCBpbnRlcmZhY2UnO1xufSIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBSRVNUIGludGVyZmFjZQotICovCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfcmVzdCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIHN0cmluZyBleHRlbmRzX2lmID0gIiI7Ci0gIHRfc2VydmljZSogZXh0ZW5kc19zID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7Ci0gIGlmIChleHRlbmRzX3MgIT0gTlVMTCkgewotICAgIGV4dGVuZHMgICAgPSAgZXh0ZW5kc19zLT5nZXRfbmFtZSgpOwotICAgIGV4dGVuZHNfaWYgPSAidXNlIGJhc2UgcXcoIiArIHBlcmxfbmFtZXNwYWNlKGV4dGVuZHNfcy0+Z2V0X3Byb2dyYW0oKSkgKyBleHRlbmRzX3MtPmdldF9uYW1lKCkgKyAiUmVzdCk7IjsKLSAgfQotICBmX3NlcnZpY2VfIDw8Ci0gICAgInBhY2thZ2UgIiA8PCBwZXJsX25hbWVzcGFjZShwcm9ncmFtXykgPDwgc2VydmljZV9uYW1lXyA8PCAiUmVzdDsiIDw8IGVuZGwgPDwgZW5kbCA8PAotICAgICJ1c2Ugc3RyaWN0OyIgPDwgZW5kbCA8PAotICAgIGV4dGVuZHNfaWYgPDwgZW5kbCA8PCBlbmRsOwotCi0KLSAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgewotICAgIGZfc2VydmljZV8gPDwgInN1YiBuZXcgeyIgPDwgZW5kbDsKLQotICAgIGluZGVudF91cCgpOwotCi0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgIm15ICgkY2xhc3NuYW1lLCAkaW1wbCkgPSBAXzsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJteSAkc2VsZiAgICAgPXsgaW1wbCA9PiAkaW1wbCB9OyIgPDwgZW5kbCA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicmV0dXJuIGJsZXNzKCRzZWxmLCRjbGFzc25hbWUpOyIgPDwgZW5kbDsKLQotCi0gICAgaW5kZW50X2Rvd24oKTsKLQotICAgIGZfc2VydmljZV8gIDw8Ci0gICAgICAifSIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci0KLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgInN1YiAiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PAotICAgICAgInsiICAgIDw8ZW5kbDsKLQotICAgIGluZGVudF91cCgpOwotCi0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgIm15ICgkc2VsZiwgJHJlcXVlc3QpID0gQF87IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLQotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGFyZ3MgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgYV9pdGVyOwotICAgIGZvciAoYV9pdGVyID0gYXJncy5iZWdpbigpOyBhX2l0ZXIgIT0gYXJncy5lbmQoKTsgKythX2l0ZXIpIHsKLSAgICAgIHRfdHlwZSogYXR5cGUgPSBnZXRfdHJ1ZV90eXBlKCgqYV9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgICBzdHJpbmcgcmVxID0gIiRyZXF1ZXN0LT57JyIgKyAoKmFfaXRlciktPmdldF9uYW1lKCkgKyAiJ30iOwotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAibXkgJCIgPDwgKCphX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAoIiA8PCByZXEgPDwgIikgPyAiIDw8IHJlcSA8PCAiIDogdW5kZWY7IiA8PCBlbmRsOwotICAgICAgaWYgKGF0eXBlLT5pc19zdHJpbmcoKSAmJgotICAgICAgICAgICgodF9iYXNlX3R5cGUqKWF0eXBlKS0+aXNfc3RyaW5nX2xpc3QoKSkgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIm15IEAiIDw8ICgqYV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gc3BsaXQoLywvLCAkIiA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgIik7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgICAgIDw8ICIkIjw8KCphX2l0ZXIpLT5nZXRfbmFtZSgpIDw8IiA9IFxcQCI8PCgqYV9pdGVyKS0+Z2V0X25hbWUoKTw8ZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInJldHVybiAkc2VsZi0+e2ltcGx9LT4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCIgPDwgYXJndW1lbnRfbGlzdCgoKmZfaXRlciktPmdldF9hcmdsaXN0KCkpIDw8ICIpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PGVuZGw7Ci0gIH0KLQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KLSAqLwotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIHN0cmluZyBleHRlbmRzX2NsaWVudCA9ICIiOwotICB0X3NlcnZpY2UqIGV4dGVuZHNfcyA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOwotICBpZiAoZXh0ZW5kc19zICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gcGVybF9uYW1lc3BhY2UoZXh0ZW5kc19zLT5nZXRfcHJvZ3JhbSgpKSArIGV4dGVuZHNfcy0+Z2V0X25hbWUoKTsKLSAgICBleHRlbmRzX2NsaWVudCA9ICJ1c2UgYmFzZSBxdygiICsgZXh0ZW5kcyArICJDbGllbnQpOyI7Ci0gIH0KLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgICAicGFja2FnZSAiIDw8IHBlcmxfbmFtZXNwYWNlKHByb2dyYW1fKSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJDbGllbnQ7IiA8PCBlbmRsIDw8IGVuZGwgPDwKLSAgICAgIGV4dGVuZHNfY2xpZW50IDw8IGVuZGwgPDwKLSAgICAgICJ1c2UgYmFzZSBxdygiIDw8IHBlcmxfbmFtZXNwYWNlKHByb2dyYW1fKSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZik7IiA8PCBlbmRsOwotCi0gIC8vIENvbnN0cnVjdG9yIGZ1bmN0aW9uCi0gIGZfc2VydmljZV8gPDwgInN1YiBuZXcgeyI8PGVuZGw7Ci0KLSAgaW5kZW50X3VwKCk7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJteSAoJGNsYXNzbmFtZSwgJGlucHV0LCAkb3V0cHV0KSA9IEBfOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJteSAkc2VsZiAgICAgID0ge307IiAgIDw8ZW5kbDsKLQotICBpZiAoIWV4dGVuZHMuZW1wdHkoKSkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICIkc2VsZiA9ICRjbGFzc25hbWUtPlNVUEVSOjpuZXcoJGlucHV0LCAkb3V0cHV0KTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgIiRzZWxmLT57aW5wdXR9ICA9ICRpbnB1dDsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIkc2VsZi0+e291dHB1dH0gPSBkZWZpbmVkICRvdXRwdXQgPyAkb3V0cHV0IDogJGlucHV0OyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiRzZWxmLT57c2VxaWR9ICA9IDA7IiA8PCBlbmRsOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJyZXR1cm4gYmxlc3MoJHNlbGYsJGNsYXNzbmFtZSk7Ijw8ZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7Ci0gICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0KLSAgICAvLyBPcGVuIGZ1bmN0aW9uCi0gICAgZl9zZXJ2aWNlXyA8PCAic3ViICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBpbmRlbnQoKSA8PAotICAgICAgIiRzZWxmLT5zZW5kXyIgPDwgZnVubmFtZSA8PCAiKCI7Ci0KLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7Ci0gICAgICB9Ci0gICAgICBmX3NlcnZpY2VfIDw8ICIkIiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICB9Ci0gICAgZl9zZXJ2aWNlXyA8PCAiKTsiIDw8IGVuZGw7Ci0KLSAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7Ci0gICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgInJldHVybiAiOwotICAgICAgfQotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAiJHNlbGYtPnJlY3ZfIiA8PCBmdW5uYW1lIDw8ICIoKTsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgaW5kZW50X2Rvd24oKTsKLQotICAgIGZfc2VydmljZV8gPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIGZfc2VydmljZV8gPDwKLSAgICAgICJzdWIgc2VuZF8iIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCBlbmRsOwotCi0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBzdGQ6OnN0cmluZyBhcmdzbmFtZSA9IHBlcmxfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSArIHNlcnZpY2VfbmFtZV8gKyAiXyIgKyAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX2FyZ3MiOwotCi0gICAgLy8gU2VyaWFsaXplIHRoZSByZXF1ZXN0IGhlYWRlcgotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICIkc2VsZi0+e291dHB1dH0tPndyaXRlTWVzc2FnZUJlZ2luKCciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJywgIiA8PAotICAgICAgKCgqZl9pdGVyKS0+aXNfb25ld2F5KCkgPyAiVE1lc3NhZ2VUeXBlOjpPTkVXQVkiIDogIlRNZXNzYWdlVHlwZTo6Q0FMTCIpIDw8IAotICAgICAgIiwgJHNlbGYtPntzZXFpZH0pOyIgPDwgZW5kbDsKLQotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJteSAkYXJncyA9IG5ldyAiIDw8IGFyZ3NuYW1lIDw8ICIoKTsiIDw8IGVuZGw7Ci0KLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiJGFyZ3MtPnsiIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJ9ID0gJCIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgLy8gV3JpdGUgdG8gdGhlIHN0cmVhbQotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICIkYXJncy0+d3JpdGUoJHNlbGYtPntvdXRwdXR9KTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIkc2VsZi0+e291dHB1dH0tPndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiRzZWxmLT57b3V0cHV0fS0+Z2V0VHJhbnNwb3J0KCktPmZsdXNoKCk7IiA8PCBlbmRsOwotCi0KLSAgICBpbmRlbnRfZG93bigpOwotCi0gICAgZl9zZXJ2aWNlXyA8PCAifSIgPDwgZW5kbDsKLQotCi0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBzdGQ6OnN0cmluZyByZXN1bHRuYW1lID0gcGVybF9uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpICsgc2VydmljZV9uYW1lXyArICJfIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKLSAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7Ci0KLSAgICAgIHRfZnVuY3Rpb24gcmVjdl9mdW5jdGlvbigoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJyZWN2XyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZub2FyZ3MpOwotICAgICAgLy8gT3BlbiBmdW5jdGlvbgotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBlbmRsIDw8Ci0gICAgICAgICJzdWIgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnJlY3ZfZnVuY3Rpb24pIDw8IGVuZGw7Ci0KLSAgICAgIGluZGVudF91cCgpOwotCi0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJteSAkcnNlcWlkID0gMDsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIm15ICRmbmFtZTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIm15ICRtdHlwZSA9IDA7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGVuZGw7Ci0KLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiRzZWxmLT57aW5wdXR9LT5yZWFkTWVzc2FnZUJlZ2luKFxcJGZuYW1lLCBcXCRtdHlwZSwgXFwkcnNlcWlkKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlmICgkbXR5cGUgPT0gVE1lc3NhZ2VUeXBlOjpFWENFUFRJT04pIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgbXkgJHggPSBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgICR4LT5yZWFkKCRzZWxmLT57aW5wdXR9KTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgJHNlbGYtPntpbnB1dH0tPnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIGRpZSAkeDsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0KLQotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAibXkgJHJlc3VsdCA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIigpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiJHJlc3VsdC0+cmVhZCgkc2VsZi0+e2lucHV0fSk7IiA8PCBlbmRsOwotCi0KLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiRzZWxmLT57aW5wdXR9LT5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgICAgICBlbmRsOwotCi0KLSAgICAgIC8vIENhcmVmdWwsIG9ubHkgcmV0dXJuIHJlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCi0gICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKGRlZmluZWQgJHJlc3VsdC0+e3N1Y2Nlc3N9ICkgeyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiAkcmVzdWx0LT57c3VjY2Vzc307IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOwotICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLSAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKGRlZmluZWQgJHJlc3VsdC0+eyIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJ9KSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgZGllICRyZXN1bHQtPnsiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAifTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgLy8gQ2FyZWZ1bCwgb25seSByZXR1cm4gX3Jlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCi0gICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAgICAgInJldHVybjsiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImRpZSBcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZmFpbGVkOiB1bmtub3duIHJlc3VsdFwiOyIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgLy8gQ2xvc2UgZnVuY3Rpb24KLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBmX3NlcnZpY2VfIDw8ICJ9Ijw8ZW5kbDsKLQotICAgIH0KLSAgfQotCi19Ci0KLS8qKgotICogRGVzZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCi0gKi8KLXZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2xhc3MpIHsKLSAgKHZvaWQpIGluY2xhc3M7Ci0gIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLQotICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKwotICAgICAgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgc3RyaW5nIG5hbWUgPSB0ZmllbGQtPmdldF9uYW1lKCk7Ci0KLSAgLy9IYWNrIGZvciB3aGVuIHByZWZpeCBpcyBkZWZpbmVkIChhbHdheXMgYSBoYXNoIHJlZikKLSAgaWYgKCFwcmVmaXguZW1wdHkoKSkgewotICAgIG5hbWUgPSBwcmVmaXggKyAieyIgKyB0ZmllbGQtPmdldF9uYW1lKCkgKyAifSI7Ci0gIH0KLQotICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0X3N0cnVjdCopdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbmFtZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICIkeGZlciArPSAkaW5wdXQtPiI7Ci0KLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKwotICAgICAgICAgIG5hbWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIG91dCA8PCAicmVhZFN0cmluZyhcXCQiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIG91dCA8PCAicmVhZEJvb2woXFwkIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICBvdXQgPDwgInJlYWRCeXRlKFxcJCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICBvdXQgPDwgInJlYWRJMTYoXFwkIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgIG91dCA8PCAicmVhZEkzMihcXCQiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgb3V0IDw8ICJyZWFkSTY0KFxcJCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICBvdXQgPDwgInJlYWREb3VibGUoXFwkIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBQRVJMIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgb3V0IDw8ICJyZWFkSTMyKFxcJCIgPDwgbmFtZSA8PCAiKTsiOwotICAgIH0KLSAgICBvdXQgPDwgZW5kbDsKLQotICB9IGVsc2UgewotICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIERFU0VSSUFMSVpFIEZJRUxEICclcycgVFlQRSAnJXMnXG4iLAotICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwgdHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhbiB1bnNlcmlhbGl6ZXIgZm9yIGEgdmFyaWFibGUuIFRoaXMgbWFrZXMgdHdvIGtleSBhc3N1bXB0aW9ucywKLSAqIGZpcnN0IHRoYXQgdGhlcmUgaXMgYSBjb25zdCBjaGFyKiB2YXJpYWJsZSBuYW1lZCBkYXRhIHRoYXQgcG9pbnRzIHRvIHRoZQotICogYnVmZmVyIGZvciBkZXNlcmlhbGl6YXRpb24sIGFuZCB0aGF0IHRoZXJlIGlzIGEgdmFyaWFibGUgcHJvdG9jb2wgd2hpY2gKLSAqIGlzIGEgcmVmZXJlbmNlIHRvIGEgVFByb3RvY29sIHNlcmlhbGl6YXRpb24gb2JqZWN0LgotICovCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICIkIiA8PCBwcmVmaXggPDwgIiA9IG5ldyAiIDw8IHBlcmxfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIigpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIkeGZlciArPSAkIiA8PCBwcmVmaXggPDwgIi0+cmVhZCgkaW5wdXQpOyIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgc3RyaW5nIHNpemUgPSB0bXAoIl9zaXplIik7Ci0gIHN0cmluZyBrdHlwZSA9IHRtcCgiX2t0eXBlIik7Ci0gIHN0cmluZyB2dHlwZSA9IHRtcCgiX3Z0eXBlIik7Ci0gIHN0cmluZyBldHlwZSA9IHRtcCgiX2V0eXBlIik7Ci0KLSAgdF9maWVsZCBmc2l6ZShnX3R5cGVfaTMyLCBzaXplKTsKLSAgdF9maWVsZCBma3R5cGUoZ190eXBlX2J5dGUsIGt0eXBlKTsKLSAgdF9maWVsZCBmdnR5cGUoZ190eXBlX2J5dGUsIHZ0eXBlKTsKLSAgdF9maWVsZCBmZXR5cGUoZ190eXBlX2J5dGUsIGV0eXBlKTsKLQotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAibXkgJCIgPDwgc2l6ZSA8PCAiID0gMDsiIDw8IGVuZGw7Ci0KLSAgLy8gRGVjbGFyZSB2YXJpYWJsZXMsIHJlYWQgaGVhZGVyCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICIkIiA8PCBwcmVmaXggPDwgIiA9IHt9OyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIm15ICQiIDw8IGt0eXBlIDw8ICIgPSAwOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIm15ICQiIDw8IHZ0eXBlIDw8ICIgPSAwOyIgPDwgZW5kbDsKLQotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZE1hcEJlZ2luKCIgPDwKLSAgICAgICJcXCQiIDw8IGt0eXBlIDw8ICIsIFxcJCIgPDwgdnR5cGUgPDwgIiwgXFwkIiA8PCBzaXplIDw8ICIpOyIgPDwgZW5kbDsKLQotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotCi0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiJCIgPDwgcHJlZml4IDw8ICIgPSB7fTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJteSAkIiA8PCBldHlwZSA8PCAiID0gMDsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIkeGZlciArPSAkaW5wdXQtPnJlYWRTZXRCZWdpbigiIDw8Ci0gICAgICAiXFwkIiA8PCBldHlwZSA8PCAiLCBcXCQiIDw8IHNpemUgPDwgIik7IiA8PCBlbmRsOwotCi0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotCi0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiJCIgPDwgcHJlZml4IDw8ICIgPSBbXTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJteSAkIiA8PCBldHlwZSA8PCAiID0gMDsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIkeGZlciArPSAkaW5wdXQtPnJlYWRMaXN0QmVnaW4oIiA8PAotICAgICAgIlxcJCIgPDwgZXR5cGUgPDwgIiwgXFwkIiA8PCBzaXplIDw8ICIpOyIgPDwgZW5kbDsKLQotICB9Ci0KLSAgLy8gRm9yIGxvb3AgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cwotICBzdHJpbmcgaSA9IHRtcCgiX2kiKTsKLSAgaW5kZW50KG91dCkgPDwKLSAgICAiZm9yIChteSAkIiA8PAotICAgIGkgPDwgIiA9IDA7ICQiIDw8IGkgPDwgIiA8ICQiIDw8IHNpemUgPDwgIjsgKyskIiA8PCBpIDw8ICIpIiA8PCBlbmRsOwotCi0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgcHJlZml4KTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIHByZWZpeCk7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBwcmVmaXgpOwotICB9Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotCi0KLSAgLy8gUmVhZCBjb250YWluZXIgZW5kCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJGlucHV0LT5yZWFkTWFwRW5kKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkaW5wdXQtPnJlYWRTZXRFbmQoKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkaW5wdXQtPnJlYWRMaXN0RW5kKCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotfQotCi0KLS8qKgotICogR2VuZXJhdGVzIGNvZGUgdG8gZGVzZXJpYWxpemUgYSBtYXAKLSAqLwotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcga2V5ID0gdG1wKCJrZXkiKTsKLSAgc3RyaW5nIHZhbCA9IHRtcCgidmFsIik7Ci0gIHRfZmllbGQgZmtleSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KTsKLSAgdF9maWVsZCBmdmFsKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2YWwpOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgZGVjbGFyZV9maWVsZCgmZmtleSwgdHJ1ZSwgdHJ1ZSkgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwKLSAgICBkZWNsYXJlX2ZpZWxkKCZmdmFsLCB0cnVlLCB0cnVlKSA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZrZXkpOwotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmdmFsKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICIkIiA8PCBwcmVmaXggPDwgIi0+eyQiIDw8IGtleSA8PCAifSA9ICQiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcgZWxlbSA9IHRtcCgiZWxlbSIpOwotICB0X2ZpZWxkIGZlbGVtKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAibXkgJCIgPDwgZWxlbSA8PCAiID0gdW5kZWY7IiA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICIkIiA8PCBwcmVmaXggPDwgIi0+eyQiIDw8IGVsZW0gPDwgIn0gPSAxOyIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHN0cmluZyBlbGVtID0gdG1wKCJlbGVtIik7Ci0gIHRfZmllbGQgZmVsZW0odGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAibXkgJCIgPDwgZWxlbSA8PCAiID0gdW5kZWY7IiA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICJwdXNoKEB7JCIgPDwgcHJlZml4IDw8ICJ9LCQiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOwotfQotCi0KLS8qKgotICogU2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgotICoKLSAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkIHRvIHNlcmlhbGl6ZQotICogQHBhcmFtIHByZWZpeCBOYW1lIHRvIHByZXBlbmQgdG8gZmllbGQgbmFtZQotICovCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0KLSAgLy8gRG8gbm90aGluZyBmb3Igdm9pZCB0eXBlcwotICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsKLSAgICAgIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodF9zdHJ1Y3QqKXR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ICsgInsiK3RmaWVsZC0+Z2V0X25hbWUoKSsifSIgKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCArICJ7IiArIHRmaWVsZC0+Z2V0X25hbWUoKSsifSIpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgewotCi0gICAgc3RyaW5nIG5hbWUgPSB0ZmllbGQtPmdldF9uYW1lKCk7Ci0KLSAgICAvL0hhY2sgZm9yIHdoZW4gcHJlZml4IGlzIGRlZmluZWQgKGFsd2F5cyBhIGhhc2ggcmVmKQotICAgIGlmKCFwcmVmaXguZW1wdHkoKSkKLSAgICAgIG5hbWUgPSBwcmVmaXggKyAieyIgKyB0ZmllbGQtPmdldF9uYW1lKCkgKyAifSI7Ci0KLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIiR4ZmVyICs9ICRvdXRwdXQtPiI7Ci0KLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgdGhyb3cKLSAgICAgICAgICAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIG91dCA8PCAid3JpdGVTdHJpbmcoJCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUJvb2woJCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUJ5dGUoJCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICBvdXQgPDwgIndyaXRlSTE2KCQiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUkzMigkIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgIG91dCA8PCAid3JpdGVJNjQoJCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICBvdXQgPDwgIndyaXRlRG91YmxlKCQiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIFBFUkwgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICBvdXQgPDwgIndyaXRlSTMyKCQiIDw8IG5hbWUgPDwgIik7IjsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0KLSAgfSBlbHNlIHsKLSAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgRklFTEQgJyVzJXMnIFRZUEUgJyVzJ1xuIiwKLSAgICAgICAgICAgcHJlZml4LmNfc3RyKCksCi0gICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAotICAgICAgICAgICB0eXBlLT5nZXRfbmFtZSgpLmNfc3RyKCkpOwotICB9Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyBhbGwgdGhlIG1lbWJlcnMgb2YgYSBzdHJ1Y3QuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCB0byBzZXJpYWxpemUKLSAqIEBwYXJhbSBwcmVmaXggIFN0cmluZyBwcmVmaXggdG8gYXR0YWNoIHRvIGFsbCBmaWVsZHMKLSAqLwotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICAodm9pZCkgdHN0cnVjdDsKLSAgaW5kZW50KG91dCkgPDwKLSAgICAgICIkeGZlciArPSAkIiA8PCBwcmVmaXggPDwgIi0+d3JpdGUoJG91dHB1dCk7IiA8PCBlbmRsOwotfQotCi0vKioKLSAqIFdyaXRlcyBvdXQgYSBjb250YWluZXIKLSAqLwotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVNYXBCZWdpbigiIDw8Ci0gICAgICB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgICJzY2FsYXIoa2V5cyAleyQiIDw8IHByZWZpeCA8PCAifSkpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIiR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU2V0QmVnaW4oIiA8PAotICAgICAgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICAic2NhbGFyKEB7JCIgPDwgcHJlZml4IDw8ICJ9KSk7IiA8PCBlbmRsOwotCi0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICIkeGZlciArPSAkb3V0cHV0LT53cml0ZUxpc3RCZWdpbigiIDw8Ci0gICAgICB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICAic2NhbGFyKEB7JCIgPDwgcHJlZml4IDw8ICJ9KSk7IiA8PCBlbmRsOwotCi0gIH0KLQotICBzY29wZV91cChvdXQpOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBzdHJpbmcga2l0ZXIgPSB0bXAoImtpdGVyIik7Ci0gICAgc3RyaW5nIHZpdGVyID0gdG1wKCJ2aXRlciIpOwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAid2hpbGUoIG15ICgkIjw8a2l0ZXI8PCIsJCI8PHZpdGVyPDwiKSA9IGVhY2ggJXskIiA8PCBwcmVmaXggPDwgIn0pICIgPDwgZW5kbDsKLQotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwga2l0ZXIsIHZpdGVyKTsKLSAgICBzY29wZV9kb3duKG91dCk7Ci0KLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBzdHJpbmcgaXRlciA9IHRtcCgiaXRlciIpOwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiZm9yZWFjaCBteSAkIjw8aXRlcjw8IiAoQHskIiA8PCBwcmVmaXggPDwgIn0pIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgaXRlcik7Ci0gICAgc2NvcGVfZG93bihvdXQpOwotCi0KLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgc3RyaW5nIGl0ZXIgPSB0bXAoIml0ZXIiKTsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImZvcmVhY2ggbXkgJCI8PGl0ZXI8PCIgKEB7JCIgPDwgcHJlZml4IDw8ICJ9KSAiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAob3V0KTsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIGl0ZXIpOwotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgfQotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICIkeGZlciArPSAkb3V0cHV0LT53cml0ZU1hcEVuZCgpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIiR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU2V0RW5kKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIiR4ZmVyICs9ICRvdXRwdXQtPndyaXRlTGlzdEVuZCgpOyIgPDwgZW5kbDsKLSAgfQotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbWFwLgotICoKLSAqLwotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGtpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHZpdGVyKSB7Ci0gIHRfZmllbGQga2ZpZWxkKHRtYXAtPmdldF9rZXlfdHlwZSgpLCBraXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZrZmllbGQpOwotCi0gIHRfZmllbGQgdmZpZWxkKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2aXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZ2ZmllbGQpOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBzZXQuCi0gKi8KLXZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyKSB7Ci0gIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQpOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBsaXN0LgotICovCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyKSB7Ci0gIHRfZmllbGQgZWZpZWxkKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkKTsKLX0KLQotLyoqCi0gKiBEZWNsYXJlcyBhIGZpZWxkLCB3aGljaCBtYXkgaW5jbHVkZSBpbml0aWFsaXphdGlvbiBhcyBuZWNlc3NhcnkuCi0gKgotICogQHBhcmFtIHR0eXBlIFRoZSB0eXBlCi0gKi8KLXN0cmluZyB0X3BlcmxfZ2VuZXJhdG9yOjpkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0LCBib29sIG9iaikgewotICBzdHJpbmcgcmVzdWx0ID0gIm15ICQiICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICBpZiAoaW5pdCkgewotICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgcmVzdWx0ICs9ICIgPSAnJyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICByZXN1bHQgKz0gIiA9IDAiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgcmVzdWx0ICs9ICIgPSAwIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgcmVzdWx0ICs9ICIgPSAwLjAiOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gUEVSTCBpbml0aWFsaXplciBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICByZXN1bHQgKz0gIiA9IDAiOwotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICAgIHJlc3VsdCArPSAiID0gW10iOwotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgICAgaWYgKG9iaikgewotICAgICAgICByZXN1bHQgKz0gIiA9IG5ldyAiICsgcGVybF9uYW1lc3BhY2UodHlwZS0+Z2V0X3Byb2dyYW0oKSkgKyB0eXBlLT5nZXRfbmFtZSgpICsgIigpIjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlc3VsdCArPSAiID0gdW5kZWYiOwotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gcmVzdWx0ICsgIjsiOwotfQotCi0vKioKLSAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGZvcm0gJ3R5cGUgbmFtZShhcmdzKScKLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KLSAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KLSAqLwotc3RyaW5nIHRfcGVybF9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLQotICBzdHJpbmcgc3RyOwotCi0gIHN0ciAgPSBwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAie1xuIjsKLSAgc3RyICs9ICIgIG15ICRzZWxmID0gc2hpZnQ7XG4iOwotCi0gIC8vTmVlZCB0byBjcmVhdGUgcGVybCBmdW5jdGlvbiBhcmcgaW5wdXRzCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4gJmZpZWxkcyA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgc3RyICs9ICIgIG15ICQiICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIiA9IHNoaWZ0O1xuIjsKLSAgfQotCi0gIHJldHVybiBzdHI7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhIGZpZWxkIGxpc3QKLSAqLwotc3RyaW5nIHRfcGVybF9nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgc3RyaW5nIHJlc3VsdCA9ICIiOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXN1bHQgKz0gIiwgIjsKLSAgICB9Ci0gICAgcmVzdWx0ICs9ICIkIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioKLSAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgQysrIGVudW0gc3RyaW5nIGZvciB0aGUgZ2l2ZW4gdHlwZS4KLSAqLwotc3RyaW5nIHRfcGVybF9nZW5lcmF0b3IgOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgcmV0dXJuICJUVHlwZTo6U1RSSU5HIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICByZXR1cm4gIlRUeXBlOjpCT09MIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICByZXR1cm4gIlRUeXBlOjpCWVRFIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIHJldHVybiAiVFR5cGU6OkkxNiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICByZXR1cm4gIlRUeXBlOjpJMzIiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmV0dXJuICJUVHlwZTo6STY0IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIHJldHVybiAiVFR5cGU6OkRPVUJMRSI7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAiVFR5cGU6OkkzMiI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiAiVFR5cGU6OlNUUlVDVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlOjpNQVAiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZTo6U0VUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICByZXR1cm4gIlRUeXBlOjpMSVNUIjsKLSAgfQotCi0gIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUihwZXJsLCAiUGVybCIsICIiKQotCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfcGhwX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9waHBfZ2VuZXJhdG9yLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTU3ZWMzLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9waHBfZ2VuZXJhdG9yLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjc2NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8ZnN0cmVhbT4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSAidF9vb3BfZ2VuZXJhdG9yLmgiCi0jaW5jbHVkZSAicGxhdGZvcm0uaCIKLQotdXNpbmcgc3RkOjptYXA7Ci11c2luZyBzdGQ6Om9mc3RyZWFtOwotdXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwotdXNpbmcgc3RkOjpzdHJpbmc7Ci11c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKLXVzaW5nIHN0ZDo6dmVjdG9yOwotCi1zdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAgLy8gYXZvaWQgb3N0cmVhbSA8PCBzdGQ6OmVuZGwgZmx1c2hlcwotCi0jZGVmaW5lIE5TR0xPQkFMICAobnNnbG9iYWxfLnNpemUoKSA/IG5zZ2xvYmFsXyA6ICIiKQotI2RlZmluZSBOU0dMT0JBTF9BICgiXFwiICsgTlNHTE9CQUwgKQotI2RlZmluZSBOU0dMT0JBTF9CICggTlNHTE9CQUwgKyAiXFwiKQotI2RlZmluZSBOU0dMT0JBTF9BQiAoIlxcIiArIE5TR0xPQkFMICsgIlxcIikKLQotCi0vKioKLSAqIFBIUCBjb2RlIGdlbmVyYXRvci4KLSAqCi0gKi8KLWNsYXNzIHRfcGhwX2dlbmVyYXRvciA6IHB1YmxpYyB0X29vcF9nZW5lcmF0b3IgewotIHB1YmxpYzoKLSAgdF9waHBfZ2VuZXJhdG9yKAotICAgICAgdF9wcm9ncmFtKiBwcm9ncmFtLAotICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKLSAgICA6IHRfb29wX2dlbmVyYXRvcihwcm9ncmFtKQotICB7Ci0gICAgKHZvaWQpIG9wdGlvbl9zdHJpbmc7Ci0gICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJpbmxpbmVkIik7Ci0gICAgYmluYXJ5X2lubGluZV8gPSAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7Ci0KLSAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgicmVzdCIpOwotICAgIHJlc3RfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotCi0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoInNlcnZlciIpOwotICAgIHBocHNfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotCi0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoIm9vcCIpOwotICAgIG9vcF8gPSAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7Ci0KLSAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgidmFsaWRhdGUiKTsKLSAgICB2YWxpZGF0ZV8gPSAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7Ci0KLSAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgianNvbiIpOwotICAgIGpzb25fc2VyaWFsaXphYmxlXyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJuc2dsb2JhbCIpOwotICAgIGlmKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpIHsKLSAgICAgIG5zZ2xvYmFsXyA9IGl0ZXItPnNlY29uZDsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBuc2dsb2JhbF8gPSAiIjsgLy8gYnkgZGVmYXVsdCBnbG9iYWwgbmFtZXNwYWNlIGlzIGVtcHR5Ci0gICAgfQotCi0gICAgaWYgKG9vcF8gJiYgYmluYXJ5X2lubGluZV8pIHsKLSAgICAgIHRocm93ICJvb3AgYW5kIGlubGluZWQgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS4iOwotICAgIH0KLQotICAgIG91dF9kaXJfYmFzZV8gPSAoYmluYXJ5X2lubGluZV8gPyAiZ2VuLXBocGkiIDogImdlbi1waHAiKTsKLSAgICBlc2NhcGVfWyckJ10gPSAiXFwkIjsKLSAgfQotCi0gIHN0YXRpYyBib29sIGlzX3ZhbGlkX25hbWVzcGFjZShjb25zdCBzdGQ6OnN0cmluZyYgc3ViX25hbWVzcGFjZSk7Ci0KLSAgLyoqCi0gICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKLSAgICovCi0KLSAgdm9pZCBpbml0X2dlbmVyYXRvcigpOwotICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOwotCi0gIC8qKgotICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZiAgKHRfdHlwZWRlZiogIHR0eXBlZGVmKTsKLSAgdm9pZCBnZW5lcmF0ZV9lbnVtICAgICAodF9lbnVtKiAgICAgdGVudW0pOwotICB2b2lkIGdlbmVyYXRlX2NvbnN0ICAgICh0X2NvbnN0KiAgICB0Y29uc3QpOwotICB2b2lkIGdlbmVyYXRlX2NvbnN0cyAgICh2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3RydWN0ICAgKHRfc3RydWN0KiAgIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uICh0X3N0cnVjdCogICB0eGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UgICh0X3NlcnZpY2UqICB0c2VydmljZSk7Ci0KLSAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOwotCi0gIC8qKgotICAgKiBTdHJ1Y3RzIQotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX3BocF9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9waHBfc3RydWN0X2RlZmluaXRpb24oc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc194Y2VwdGlvbj1mYWxzZSwgYm9vbCBpc19yZXN1bHQ9ZmFsc2UpOwotICB2b2lkIGdlbmVyYXRlX3BocF9zdHJ1Y3RfcmVhZGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfcmVzdWx0KTsKLSAgdm9pZCBnZW5lcmF0ZV9waHBfc3RydWN0X3dyaXRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX3Jlc3VsdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfcGhwX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9waHBfc3RydWN0X3JlcXVpcmVkX3ZhbGlkYXRvcihvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgbWV0aG9kX25hbWUsIGJvb2wgd3JpdGVfbW9kZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfcGhwX3N0cnVjdF9yZWFkX3ZhbGlkYXRvcihvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfcGhwX3N0cnVjdF93cml0ZV92YWxpZGF0b3Iob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3BocF9zdHJ1Y3RfanNvbl9zZXJpYWxpemUob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfcmVzdWx0KTsKLSAgYm9vbCBuZWVkc19waHBfd3JpdGVfdmFsaWRhdG9yKHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX3Jlc3VsdCk7Ci0gIGJvb2wgbmVlZHNfcGhwX3JlYWRfdmFsaWRhdG9yKHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX3Jlc3VsdCk7Ci0gIGludCBnZXRfcGhwX251bV9yZXF1aXJlZF9maWVsZHMoY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzLCBib29sIHdyaXRlX21vZGUpOwotCi0gIHZvaWQgZ2VuZXJhdGVfcGhwX3R5cGVfc3BlYyhzdGQ6Om9mc3RyZWFtICZvdXQsIHRfdHlwZSogdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfcGhwX3N0cnVjdF9zcGVjKHN0ZDo6b2ZzdHJlYW0gJm91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotCi0gIC8qKgotICAgKiBTZXJ2aWNlLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzICAgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3Jlc3QgICAgICAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQgICAgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfcHJvY2Vzc29yICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uICAodF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLQotICAvKioKLSAgICogU2VyaWFsaXphdGlvbiBjb25zdHJ1Y3RzCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQgICAgICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiAgICB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2xhc3M9ZmFsc2UpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0ICAgICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogICB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lciAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiAgICAgdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogICAgICB0c2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50ICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqICAgICAgdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogICAgIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZCAgICAgICAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogICAgdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3QgICAgICAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqICAgdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyICAgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogICAgIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudCAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqICAgICAgdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGtpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgdml0ZXIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50ICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogICAgICB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlcik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50ICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogICAgIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlcik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9waHBfZG9jICAgICAgICAgICAgICAgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZG9jKiAgICAgIHRkb2MpOwotCi0gIHZvaWQgZ2VuZXJhdGVfcGhwX2RvYyAgICAgICAgICAgICAgICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiAgICB0ZmllbGQpOwotCi0gIHZvaWQgZ2VuZXJhdGVfcGhwX2RvYyAgICAgICAgICAgICAgICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotCi0gIHZvaWQgZ2VuZXJhdGVfcGhwX2RvY3N0cmluZ19jb21tZW50ICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY29udGVudHMpOwotCi0gIC8qKgotICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucwotICAgKi8KLQotICBzdGQ6OnN0cmluZyBwaHBfaW5jbHVkZXMoKTsKLSAgc3RkOjpzdHJpbmcgZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdD1mYWxzZSwgYm9vbCBvYmo9ZmFsc2UpOwotICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGFkZFR5cGVIaW50cyA9IHRydWUpOwotICBzdGQ6OnN0cmluZyB0eXBlX3RvX2Nhc3QodF90eXBlKiB0dHlwZSk7Ci0gIHN0ZDo6c3RyaW5nIHR5cGVfdG9fZW51bSh0X3R5cGUqIHR0eXBlKTsKLSAgc3RkOjpzdHJpbmcgdHlwZV90b19waHBkb2ModF90eXBlKiB0dHlwZSk7Ci0KLSAgc3RkOjpzdHJpbmcgcGhwX25hbWVzcGFjZV9iYXNlKGNvbnN0IHRfcHJvZ3JhbSogcCkgewotICAgIHN0ZDo6c3RyaW5nIG5zID0gcC0+Z2V0X25hbWVzcGFjZSgicGhwIik7Ci0gICAgY29uc3QgY2hhciAqIGRlbGltaXRlciA9ICJcXCI7Ci0gICAgc2l6ZV90IHBvc2l0aW9uID0gbnMuZmluZCgnLicpOwotICAgIHdoaWxlIChwb3NpdGlvbiAhPSBzdHJpbmc6Om5wb3MpIHsKLSAgICAgIG5zLnJlcGxhY2UocG9zaXRpb24sIDEsIGRlbGltaXRlcik7Ci0gICAgICBwb3NpdGlvbiA9IG5zLmZpbmQoJy4nLCBwb3NpdGlvbiArIDEpOwotICAgIH0KLSAgICByZXR1cm4gbnM7Ci0gIH0KLQotICAvL2dlbmVyYWwgdXNlIG5hbWVzcGFjZSBwcmVmaXhpbmc6IFxteVxuYW1lc3BhY2VcIG9yIG15X25hbWVzcGFjZV8KLSAgc3RyaW5nIHBocF9uYW1lc3BhY2UoY29uc3QgdF9wcm9ncmFtKiBwKSB7Ci0gICAgc3RyaW5nIG5zID0gcGhwX25hbWVzcGFjZV9iYXNlKHApOwotICAgIHJldHVybiAobnNnbG9iYWxfLnNpemUoKSA/IE5TR0xPQkFMX0FCIDogTlNHTE9CQUxfQikgKyAobnMuc2l6ZSgpID8gKG5zICsgIlxcIikgOiAiIik7Ci0gIH0KLQotICAvL3NldHRpbmcgdGhlIG5hbWVzcGFjZSBvZiBhIGZpbGU6IG15XG5hbWVzcGFjZQotICBzdHJpbmcgcGhwX25hbWVzcGFjZV9zdWZmaXgoY29uc3QgdF9wcm9ncmFtKiBwKSB7Ci0gICAgc3RyaW5nIG5zID0gcGhwX25hbWVzcGFjZV9iYXNlKHApOwotCi0gICAgcmV0dXJuIChuc2dsb2JhbF8uc2l6ZSgpID8gTlNHTE9CQUxfQiA6IE5TR0xPQkFMKSArIG5zOwotICB9Ci0KLSAgLy9hZGQgYSBkaXJlY3RvcnkgdG8gYWxscmVhZHkgZXhpc3RpbmcgbmFtZXNwYWNlCi0gIHN0cmluZyBwaHBfbmFtZXNwYWNlX2RpcmVjdG9yeShzdHJpbmcgZGlyZWN0b3J5LCBib29sIGVuZCA9IHRydWUpIHsKLSAgICAodm9pZCkgZGlyZWN0b3J5OwotICAgIGlmKGVuZCkgewotICAgICAgcmV0dXJuICI7IjsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuICIiOwotICAgIH0KLSAgfQotCi0gIC8vd3JpdGluZyBhbiBhdXRsb2FkIGlkZW50aWZpZXIgaW50byBnbG9iYTtsczogbXlcbmFtZXNwYWNlXCBvciBteV9uYW1lc3BhY2VfCi0gIHN0cmluZyBwaHBfbmFtZXNwYWNlX2F1dG9sb2FkKGNvbnN0IHRfcHJvZ3JhbSogcCkgewotICAgIHN0ZDo6c3RyaW5nIG5zID0gcGhwX25hbWVzcGFjZV9iYXNlKHApOwotICAgIHJldHVybiAobnNnbG9iYWxfLnNpemUoKSA/IE5TR0xPQkFMX0IgOiBOU0dMT0JBTCkgKyAobnMuc2l6ZSgpID8gKG5zICsgIlxcIikgOiAiIik7Ci0gIH0KLQotICAvL2RlY2xhcmluZyBhIHR5cGU6IHR5cGVuYW1lIG9yIG15X25hbWVzcGFjZV90eXBlbmFtZQotICBzdHJpbmcgcGhwX25hbWVzcGFjZV9kZWNsYXJhdGlvbih0X3R5cGUqIHQpIHsKLSAgICByZXR1cm4gdC0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIHBocF9wYXRoKHRfcHJvZ3JhbSogcCkgewotICAgIHN0ZDo6c3RyaW5nIG5zID0gcC0+Z2V0X25hbWVzcGFjZSgicGhwLnBhdGgiKTsKLSAgICBpZiAobnMuZW1wdHkoKSkgewotICAgICAgcmV0dXJuIHAtPmdldF9uYW1lKCk7Ci0gICAgfQotCi0gICAgLy8gVHJhbnNmb3JtIHRoZSBqYXZhLXN0eWxlIG5hbWVzcGFjZSBpbnRvIGEgcGF0aC4KLSAgICBmb3IgKHN0ZDo6c3RyaW5nOjppdGVyYXRvciBpdCA9IG5zLmJlZ2luKCk7IGl0ICE9IG5zLmVuZCgpOyArK2l0KSB7Ci0gICAgICBpZiAoKml0ID09ICcuJykgewotICAgICAgICAqaXQgPSAnLyc7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIG5zICsgJy8nOwotICB9Ci0KLSAgLyoqCi0gICAqIFRyYW5zZm9ybSBjbGFzc19tZXRob2QgaW50byBDbGFzc01ldGhvZAotICAgKgotICAgKiBAcGFyYW0gc3RyCi0gICAqIEByZXR1cm4gc3Rpcm5nCi0gICAqLwotICBzdHJpbmcgY2xhc3NpZnkoc3RyaW5nIHN0cikKLSAgewotICAgIHN0cmluZyBjbGFzc2UgPSAiIjsKLQotICAgIHZlY3RvcjxzdHJpbmc+IHggPSBzcGxpdChzdHIsICdfJyk7Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHguc2l6ZSgpOyArK2kpIHsKLSAgICAgIGNsYXNzZSA9IGNsYXNzZSArIGNhcGl0YWxpemUoeFtpXSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGNsYXNzZTsKLSAgfQotCi0gIC8qKgotICAgKiBTcGxpdCBtZXRob2QKLSAgICogQHBhcmFtIHMKLSAgICogQHBhcmFtIGRlbGltCi0gICAqIEBwYXJhbSBlbGVtcwotICAgKiBAcmV0dXJuCi0gICAqLwotICB2ZWN0b3I8c3RyaW5nPiAmc3BsaXQoY29uc3Qgc3RyaW5nICZzLCBjaGFyIGRlbGltLCB2ZWN0b3I8c3RyaW5nPiAmZWxlbXMpIHsKLSAgICBzdHJpbmdzdHJlYW0gc3Mocyk7Ci0gICAgc3RyaW5nIGl0ZW07Ci0KLSAgICB3aGlsZShnZXRsaW5lKHNzLCBpdGVtLCBkZWxpbSkpIHsKLSAgICAgIGVsZW1zLnB1c2hfYmFjayhpdGVtKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZWxlbXM7Ci0gIH0KLQotICB2ZWN0b3I8c3RyaW5nPiBzcGxpdChjb25zdCBzdHJpbmcgJnMsIGNoYXIgZGVsaW0pIHsKLSAgICB2ZWN0b3I8c3RyaW5nPiBlbGVtczsKLQotICAgIHJldHVybiBzcGxpdChzLCBkZWxpbSwgZWxlbXMpOwotICB9Ci0KLSAgLyoqCi0gICAqIENhcGl0YWxpemUgbWV0aG9kCi0gICAqIEBwYXJhbSBzdHIKLSAgICogQHJldHVybgotICAgKi8KLSAgc3RyaW5nIGNhcGl0YWxpemUoc3RyaW5nIHN0cikKLSAgewotICAgIHN0cmluZzo6aXRlcmF0b3IgaXQoc3RyLmJlZ2luKCkpOwotCi0gICAgaWYgKGl0ICE9IHN0ci5lbmQoKSkKLSAgICAgICAgc3RyWzBdID0gdG91cHBlcigodW5zaWduZWQgY2hhcilzdHJbMF0pOwotCi0vLyAgICB3aGlsZSgrK2l0ICE9IHN0ci5lbmQoKSkKLS8vICAgIHsKLS8vICAgICAgKml0ID0gdG9sb3dlcigodW5zaWduZWQgY2hhcikqaXQpOwotLy8gICAgfQotICAgIHJldHVybiBzdHI7Ci0gIH0KLQotIHByaXZhdGU6Ci0KLSAgLyoqCi0gICAqIEZpbGUgc3RyZWFtcwotICAgKi8KLSAgc3RkOjpvZnN0cmVhbSBmX3R5cGVzXzsKLSAgc3RkOjpvZnN0cmVhbSBmX2hlbHBlcnNfOwotICBzdGQ6Om9mc3RyZWFtIGZfc2VydmljZV87Ci0KLSAgc3RkOjpzdHJpbmcgcGFja2FnZV9kaXJfOwotICAvKioKLSAgICogR2VuZXJhdGUgcHJvdG9jb2wtaW5kZXBlbmRlbnQgdGVtcGxhdGU/IE9yIEJpbmFyeSBpbmxpbmUgY29kZT8KLSAgICovCi0gIGJvb2wgYmluYXJ5X2lubGluZV87Ci0KLSAgLyoqCi0gICAqIEdlbmVyYXRlIGEgUkVTVCBoYW5kbGVyIGNsYXNzCi0gICAqLwotICBib29sIHJlc3RfOwotCi0gIC8qKgotICAgKiBHZW5lcmF0ZSBzdHVicyBmb3IgYSBQSFAgc2VydmVyCi0gICAqLwotICBib29sIHBocHNfOwotCi0gIC8qKgotICAgKiBXaGV0aGVyIHRvIHVzZSBPT1AgYmFzZSBjbGFzcyBUQmFzZQotICAgKi8KLSAgYm9vbCBvb3BfOwotCi0gIC8qKgotICAgKiBXaGV0aGVyIHRvIGdlbmVyYXRlIHZhbGlkYXRvciBjb2RlCi0gICAqLwotICBib29sIHZhbGlkYXRlXzsKLQotICAvKioKLSAgICogV2hldGhlciB0byBnZW5lcmF0ZSBKc29uU2VyaWFsaXphYmxlIGNsYXNzZXMKLSAgICovCi0gIGJvb2wganNvbl9zZXJpYWxpemFibGVfOwotCi0gIC8qKgotICAgKiBHbG9iYWwgbmFtZXNwYWNlIGZvciBQSFAgNS4zCi0gICAqLwotICBzdGQ6OnN0cmluZyBuc2dsb2JhbF87Ci19OwotCi0KLWJvb2wgdF9waHBfZ2VuZXJhdG9yOjppc192YWxpZF9uYW1lc3BhY2UoY29uc3Qgc3RkOjpzdHJpbmcmIHN1Yl9uYW1lc3BhY2UpIHsKLSAgcmV0dXJuIHN1Yl9uYW1lc3BhY2UgPT0gInBhdGgiOwotfQotCi0KLS8qKgotICogUHJlcGFyZXMgZm9yIGZpbGUgZ2VuZXJhdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBuZWNlc3NhcnkgZmlsZSBvdXRwdXQKLSAqIHN0cmVhbXMuCi0gKgotICogQHBhcmFtIHRwcm9ncmFtIFRoZSBwcm9ncmFtIHRvIGdlbmVyYXRlCi0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKLSAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5Ci0gIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7Ci0KLSAgLy8gQ3JlYXRlIFJlYWwgZGlyZWN0b3J5IE5hbWVzcGFjZXMKLSAgdmVjdG9yPHN0cmluZz4gTlN4ID0gc3BsaXQocGhwX25hbWVzcGFjZV9zdWZmaXgoZ2V0X3Byb2dyYW0oKSksICdcXCcpOwotICBwYWNrYWdlX2Rpcl8gPSBnZXRfb3V0X2RpcigpOwotCi0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgTlN4LnNpemUoKTsgKytpKSB7Ci0gICAgcGFja2FnZV9kaXJfID0gcGFja2FnZV9kaXJfICsgIi8iICsgTlN4W2ldICsgIi8iOwotICAgIE1LRElSKHBhY2thZ2VfZGlyXy5jX3N0cigpKTsKLSAgfQotCi0gIC8vIE1ha2Ugb3V0cHV0IGZpbGUKLSAgc3RyaW5nIGZfdHlwZXNfbmFtZSA9IHBhY2thZ2VfZGlyXysiVHlwZXMucGhwIjsKLSAgZl90eXBlc18ub3BlbihmX3R5cGVzX25hbWUuY19zdHIoKSk7Ci0KLSAgLy8gUHJpbnQgaGVhZGVyCi0gIGZfdHlwZXNfIDw8Ci0gICAgIjw/cGhwIiA8PCBlbmRsOwotICAgIGZfdHlwZXNfIDw8ICJuYW1lc3BhY2UgIiA8PCBwaHBfbmFtZXNwYWNlX3N1ZmZpeChnZXRfcHJvZ3JhbSgpKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOwotICBmX3R5cGVzXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBwaHBfaW5jbHVkZXMoKTsKLQotICBmX3R5cGVzXyA8PCBlbmRsOwotfQotCi0vKioKLSAqIFByaW50cyBzdGFuZGFyZCBwaHAgaW5jbHVkZXMKLSAqLwotc3RyaW5nIHRfcGhwX2dlbmVyYXRvcjo6cGhwX2luY2x1ZGVzKCkgewotICBzdHJpbmcgaW5jbHVkZXMgPQotICAgICJ1c2UgVGhyaWZ0XFxCYXNlXFxUQmFzZTtcbiIKLSAgICAidXNlIFRocmlmdFxcVHlwZVxcVFR5cGU7XG4iCi0gICAgInVzZSBUaHJpZnRcXFR5cGVcXFRNZXNzYWdlVHlwZTtcbiIKLSAgICAidXNlIFRocmlmdFxcRXhjZXB0aW9uXFxURXhjZXB0aW9uO1xuIgotICAgICJ1c2UgVGhyaWZ0XFxFeGNlcHRpb25cXFRQcm90b2NvbEV4Y2VwdGlvbjtcbiIKLSAgICAidXNlIFRocmlmdFxcUHJvdG9jb2xcXFRQcm90b2NvbDtcbiIKLSAgICAidXNlIFRocmlmdFxcUHJvdG9jb2xcXFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkO1xuIgotICAgICJ1c2UgVGhyaWZ0XFxFeGNlcHRpb25cXFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjtcbiI7Ci0KLSAgaWYgKGpzb25fc2VyaWFsaXphYmxlXykgewotICAgIGluY2x1ZGVzICs9Ci0gICAgICAidXNlIEpzb25TZXJpYWxpemFibGU7XG4iCi0gICAgICAidXNlIHN0ZENsYXNzO1xuIjsKLSAgfQotCi0gIHJldHVybiBpbmNsdWRlcyArICJcbiI7Ci19Ci0KLS8qKgotICogQ2xvc2UgdXAgKG9yIGRvd24pIHNvbWUgZmlsZXouCi0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7Ci0gIC8vIENsb3NlIHR5cGVzIGZpbGUKLSAgICBmX3R5cGVzXyA8PCBlbmRsOwotICBmX3R5cGVzXy5jbG9zZSgpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIFRoaXMgaXMgbm90IGRvbmUgaW4gUEhQLCB0eXBlcyBhcmUgYWxsIGltcGxpY2l0LgotICoKLSAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKLSAgKHZvaWQpIHR0eXBlZGVmOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBjb2RlIGZvciBhbiBlbnVtZXJhdGVkIHR5cGUuIFNpbmNlIGRlZmluZSBpcyBleHBlbnNpdmUgdG8gbG9va3VwCi0gKiBpbiBQSFAsIHdlIHVzZSBhIGdsb2JhbCBhcnJheSBmb3IgdGhpcy4KLSAqCi0gKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCi0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7Ci0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOwotCi0gIC8vIFdlJ3JlIGFsc28gZG9pbmcgaXQgdGhpcyB3YXkgdG8gc2VlIGhvdyBpdCBwZXJmb3Jtcy4gSXQncyBtb3JlIGxlZ2libGUKLSAgLy8gY29kZSBidXQgeW91IGNhbid0IGRvIHRoaW5ncyBsaWtlIGFuICdleHRyYWN0JyBvbiBpdCwgd2hpY2ggaXMgYSBiaXQgb2YKLSAgLy8gYSBkb3duZXIuCi0gIGdlbmVyYXRlX3BocF9kb2MoZl90eXBlc18sIHRlbnVtKTsKLSAgZl90eXBlc18gPDwKLSAgICAiZmluYWwgY2xhc3MgIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgICBnZW5lcmF0ZV9waHBfZG9jKGZfdHlwZXNfLCAqY19pdGVyKTsKLSAgICBpbmRlbnQoZl90eXBlc18pIDw8Ci0gICAgICAiY29uc3QgIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgdmFsdWUgPDwgIjsiIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnQoZl90eXBlc18pIDw8Ci0gICAgInN0YXRpYyBwdWJsaWMgJF9fbmFtZXMgPSBhcnJheSgiIDw8IGVuZGw7Ci0gIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgICBpbmRlbnQoZl90eXBlc18pIDw8Ci0gICAgICAiICAiIDw8IHZhbHVlIDw8ICIgPT4gJyIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInLCIgPDwgZW5kbDsKLSAgfQotICBpbmRlbnQoZl90eXBlc18pIDw8Ci0gICAgIik7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGZfdHlwZXNfIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGUgY29uc3RhbnQgY2xhc3MKLSAqCi0gKiBPdmVycmlkZSB0aGUgb25lIGZyb20gdF9nZW5lcmF0b3IKLSAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0cyh2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykgewotICAgIHZlY3Rvcjx0X2NvbnN0Kj46Oml0ZXJhdG9yIGNfaXRlcjsKLQotICAgIC8vIENyZWF0ZSBjbGFzcyBvbmx5IGlmIG5lZWRlZAotICAgIGlmKGNvbnN0cy5zaXplKCkgPiAwKQotICAgIHsKLSAgICAgICAgZl90eXBlc18gPDwgImZpbmFsIGNsYXNzIENvbnN0YW50IGV4dGVuZHMgXFxUaHJpZnRcXFR5cGVcXFRDb25zdGFudCB7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfdXAoKTsKLQotICAgICAgICAvLyBDcmVhdGUgc3RhdGljIHByb3BlcnR5Ci0gICAgICAgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgICAgICAgICBzdHJpbmcgbmFtZSA9ICgqY19pdGVyKS0+Z2V0X25hbWUoKTsKLQotICAgICAgICAgICAgaW5kZW50KGZfdHlwZXNfKSA8PCAic3RhdGljIHByb3RlY3RlZCAkIiA8PCBuYW1lIDw8ICI7IiA8PCBlbmRsOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ3JlYXRlIGluaXQgZnVuY3Rpb24KLSAgICAgICAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICAgICAgICAgIHN0cmluZyBuYW1lID0gKCpjX2l0ZXIpLT5nZXRfbmFtZSgpOwotCi0gICAgICAgICAgICBmX3R5cGVzXyA8PCBlbmRsOwotCi0gICAgICAgICAgICBpbmRlbnQoZl90eXBlc18pIDw8ICJzdGF0aWMgcHJvdGVjdGVkIGZ1bmN0aW9uIGluaXRfIiA8PCBuYW1lIDw8ICIoKSB7IiA8PCBlbmRsOwotICAgICAgICAgICAgaW5kZW50X3VwKCk7Ci0KLSAgICAgICAgICAgIGluZGVudChmX3R5cGVzXykgPDwgInJldHVybiAiOwotICAgICAgICAgICAgZ2VuZXJhdGVfY29uc3QoKmNfaXRlcik7Ci0gICAgICAgICAgICBmX3R5cGVzXyA8PCAiOyIgPDwgZW5kbDsKLQotICAgICAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgICAgICAgIGluZGVudChmX3R5cGVzXykgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICAgIH0KLQotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICBmX3R5cGVzXyA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICAgIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZSBhIGNvbnN0YW50IHZhbHVlCi0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpIHsKLSAgdF90eXBlKiB0eXBlID0gdGNvbnN0LT5nZXRfdHlwZSgpOwotICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSA9IHRjb25zdC0+Z2V0X3ZhbHVlKCk7Ci0KLSAgZ2VuZXJhdGVfcGhwX2RvYyhmX3R5cGVzXywgdGNvbnN0KTsKLSAgZl90eXBlc18gPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHR5cGUsIHZhbHVlKTsKLX0KLQotLyoqCi0gKiBQcmludHMgdGhlIHZhbHVlIG9mIGEgY29uc3RhbnQgd2l0aCB0aGUgZ2l2ZW4gdHlwZS4gTm90ZSB0aGF0IHR5cGUgY2hlY2tpbmcKLSAqIGlzIE5PVCBwZXJmb3JtZWQgaW4gdGhpcyBmdW5jdGlvbiBhcyBpdCBpcyBhbHdheXMgcnVuIGJlZm9yZWhhbmQgdXNpbmcgdGhlCi0gKiB2YWxpZGF0ZV90eXBlcyBtZXRob2QgaW4gbWFpbi5jYwotICovCi1zdHJpbmcgdF9waHBfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgewotICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OwotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIG91dCA8PCAnIicgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICBvdXQgPDwgKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgewotICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIG91dCA8PCAibmV3ICIgPDwgcGhwX25hbWVzcGFjZSh0eXBlLT5nZXRfcHJvZ3JhbSgpKSA8PCB0eXBlLT5nZXRfbmFtZSgpIDw8ICIoYXJyYXkoIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOwotICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKLSAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7Ci0gICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7Ci0gICAgICB9Ci0gICAgICBvdXQgPDwgaW5kZW50KCk7Ci0gICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGdfdHlwZV9zdHJpbmcsIHZfaXRlci0+Zmlyc3QpOwotICAgICAgb3V0IDw8ICIgPT4gIjsKLSAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotICAgICAgb3V0IDw8ICIsIiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICIpKSI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOwotICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0gICAgb3V0IDw8ICJhcnJheSgiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgb3V0IDw8IGluZGVudCgpOwotICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShrdHlwZSwgdl9pdGVyLT5maXJzdCk7Ci0gICAgICBvdXQgPDwgIiA9PiAiOwotICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZSh2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotICAgICAgb3V0IDw8ICIsIiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICIpIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKLSAgICB0X3R5cGUqIGV0eXBlOwotICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB9Ci0gICAgb3V0IDw8ICJhcnJheSgiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7Ci0gICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCk7Ci0gICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGV0eXBlLCAqdl9pdGVyKTsKLSAgICAgIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgICAgICBvdXQgPDwgIiA9PiB0cnVlIjsKLSAgICAgIH0KLSAgICAgIG91dCA8PCAiLCIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiKSI7Ci0gIH0KLSAgcmV0dXJuIG91dC5zdHIoKTsKLX0KLQotLyoqCi0gKiBNYWtlIGEgc3RydWN0Ci0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgZ2VuZXJhdGVfcGhwX3N0cnVjdCh0c3RydWN0LCBmYWxzZSk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGV4Y2VwdGlvbi4gQmFzaWNhbGx5IHRoZSBzYW1lCi0gKiBhcyBhIHN0cnVjdCBidXQgZXh0ZW5kcyB0aGUgRXhjZXB0aW9uIGNsYXNzLgotICoKLSAqIEBwYXJhbSB0eGNlcHRpb24gVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7Ci0gIGdlbmVyYXRlX3BocF9zdHJ1Y3QodHhjZXB0aW9uLCB0cnVlKTsKLX0KLQotLyoqCi0gKiBTdHJ1Y3RzIGNhbiBiZSBub3JtYWwgb3IgZXhjZXB0aW9ucy4KLSAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3BocF9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgewotICBnZW5lcmF0ZV9waHBfc3RydWN0X2RlZmluaXRpb24oZl90eXBlc18sIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7Ci19Ci0KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9waHBfdHlwZV9zcGVjKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHQpIHsKLSAgdCA9IGdldF90cnVlX3R5cGUodCk7Ci0gIGluZGVudChvdXQpIDw8ICIndHlwZScgPT4gIiA8PCB0eXBlX3RvX2VudW0odCkgPDwgIiwiIDw8IGVuZGw7Ci0KLSAgaWYgKHQtPmlzX2Jhc2VfdHlwZSgpIHx8IHQtPmlzX2VudW0oKSkgewotICAgIC8vIE5vb3AsIHR5cGUgaXMgYWxsIHdlIG5lZWQKLSAgfSBlbHNlIGlmICh0LT5pc19zdHJ1Y3QoKSB8fCB0LT5pc194Y2VwdGlvbigpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIidjbGFzcycgPT4gJyIgPDwgcGhwX25hbWVzcGFjZSh0LT5nZXRfcHJvZ3JhbSgpKSA8PCB0LT5nZXRfbmFtZSgpIDw8IicsIiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHQtPmlzX21hcCgpKSB7Ci0gICAgdF90eXBlKiBrdHlwZSA9IGdldF90cnVlX3R5cGUoKCh0X21hcCopdCktPmdldF9rZXlfdHlwZSgpKTsKLSAgICB0X3R5cGUqIHZ0eXBlID0gZ2V0X3RydWVfdHlwZSgoKHRfbWFwKil0KS0+Z2V0X3ZhbF90eXBlKCkpOwotICAgIGluZGVudChvdXQpIDw8ICIna3R5cGUnID0+ICIgPDwgdHlwZV90b19lbnVtKGt0eXBlKSA8PCAiLCIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiJ3Z0eXBlJyA9PiAiIDw8IHR5cGVfdG9fZW51bSh2dHlwZSkgPDwgIiwiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIidrZXknID0+IGFycmF5KCIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBnZW5lcmF0ZV9waHBfdHlwZV9zcGVjKG91dCwga3R5cGUpOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIiksIiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIndmFsJyA9PiBhcnJheSgiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZ2VuZXJhdGVfcGhwX3R5cGVfc3BlYyhvdXQsIHZ0eXBlKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiKSwiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfSBlbHNlIGlmICh0LT5pc19saXN0KCkgfHwgdC0+aXNfc2V0KCkpIHsKLSAgICB0X3R5cGUqIGV0eXBlOwotICAgIGlmICh0LT5pc19saXN0KCkpIHsKLSAgICAgIGV0eXBlID0gZ2V0X3RydWVfdHlwZSgoKHRfbGlzdCopdCktPmdldF9lbGVtX3R5cGUoKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGV0eXBlID0gZ2V0X3RydWVfdHlwZSgoKHRfc2V0Kil0KS0+Z2V0X2VsZW1fdHlwZSgpKTsKLSAgICB9Ci0gICAgaW5kZW50KG91dCkgPDwgIidldHlwZScgPT4gIiA8PCB0eXBlX3RvX2VudW0oZXR5cGUpIDw8IiwiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIidlbGVtJyA9PiBhcnJheSgiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZ2VuZXJhdGVfcGhwX3R5cGVfc3BlYyhvdXQsIGV0eXBlKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiKSwiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfSBlbHNlIHsKLSAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIHR5cGUgZm9yIHBocCBzdHJ1Y3Qgc3BlYyBmaWVsZCI7Ci0gIH0KLQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyB0aGUgc3RydWN0IHNwZWNpZmljYXRpb24gc3RydWN0dXJlLCB3aGljaCBmdWxseSBxdWFsaWZpZXMgZW5vdWdoCi0gKiB0eXBlIGluZm9ybWF0aW9uIHRvIGdlbmVyYWxpemUgc2VyaWFsaXphdGlvbiByb3V0aW5lcy4KLSAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3BocF9zdHJ1Y3Rfc3BlYyhvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgewotICBpbmRlbnQob3V0KSA8PCAiaWYgKCFpc3NldChzZWxmOjokX1RTUEVDKSkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgInNlbGY6OiRfVFNQRUMgPSBhcnJheSgiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgaW5kZW50KG91dCkgPDwgKCptX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIiA9PiBhcnJheSgiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiJ3ZhcicgPT4gJyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInLCIgPDwgZW5kbDsKLSAgICBnZW5lcmF0ZV9waHBfdHlwZV9zcGVjKG91dCwgdCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIiksIiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAiICApOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGRhdGEgdHlwZS4gVGhpcyBpcyBub3RoaW5nIGluIFBIUAotICogd2hlcmUgdGhlIG9iamVjdHMgYXJlIGFsbCBqdXN0IGFzc29jaWF0aXZlIGFycmF5cyAodW5sZXNzIG9mIGNvdXJzZSB3ZQotICogZGVjaWRlIHRvIHN0YXJ0IHVzaW5nIG9iamVjdHMgZm9yIHRoZW0uLi4pCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9waHBfc3RydWN0X2RlZmluaXRpb24ob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCkgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIGdlbmVyYXRlX3BocF9kb2Mob3V0LCB0c3RydWN0KTsKLSAgb3V0IDw8Ci0gICAgImNsYXNzICIgPDwgcGhwX25hbWVzcGFjZV9kZWNsYXJhdGlvbih0c3RydWN0KTsKLSAgaWYgKGlzX2V4Y2VwdGlvbikgewotICAgIG91dCA8PCAiIGV4dGVuZHMgIiA8PCAiVEV4Y2VwdGlvbiI7Ci0gIH0gZWxzZSBpZiAob29wXykgewotICAgIG91dCA8PCAiIGV4dGVuZHMgIiA8PCAiVEJhc2UiOwotICB9Ci0gIGlmIChqc29uX3NlcmlhbGl6YWJsZV8pIHsKLSAgICBvdXQgPDwgIiBpbXBsZW1lbnRzIEpzb25TZXJpYWxpemFibGUiOwotICB9Ci0gIG91dCA8PAotICAgICIgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgInN0YXRpYyAkX1RTUEVDOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBzdHJpbmcgZHZhbCA9ICJudWxsIjsKLSAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCAmJiAhKHQtPmlzX3N0cnVjdCgpIHx8IHQtPmlzX3hjZXB0aW9uKCkpKSB7Ci0gICAgICBkdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSwgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSk7Ci0gICAgfQotICAgIGdlbmVyYXRlX3BocF9kb2Mob3V0LCAqbV9pdGVyKTsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgInB1YmxpYyAkIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgZHZhbCA8PCAiOyIgPDwgZW5kbDsKLSAgfQotCi0gIG91dCA8PCBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIGNvbnN0cnVjdG9yIGZyb20gYXJyYXkKLSAgc3RyaW5nIHBhcmFtID0gKG1lbWJlcnMuc2l6ZSgpID4gMCkgPyAiJHZhbHM9bnVsbCIgOiAiIjsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgInB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgiIDw8IHBhcmFtIDw8ICIpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGdlbmVyYXRlX3BocF9zdHJ1Y3Rfc3BlYyhvdXQsIHRzdHJ1Y3QpOwotCi0gIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSAhPSBOVUxMICYmICh0LT5pc19zdHJ1Y3QoKSB8fCB0LT5pc194Y2VwdGlvbigpKSkgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAiJHRoaXMtPiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0LCAoKm1faXRlciktPmdldF92YWx1ZSgpKSA8PCAiOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWYgKGlzX2FycmF5KCR2YWxzKSkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpZiAob29wXykgewotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwYXJlbnQ6Ol9fY29uc3RydWN0KHNlbGY6OiRfVFNQRUMsICR2YWxzKTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImlmIChpc3NldCgkdmFsc1snIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiddKSkgeyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgICR0aGlzLT4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gJHZhbHNbJyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInXTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICB9Ci0gIHNjb3BlX2Rvd24ob3V0KTsKLSAgb3V0IDw8IGVuZGw7Ci0KLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgInB1YmxpYyBmdW5jdGlvbiBnZXROYW1lKCkgeyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIHJldHVybiAnIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICInOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICBnZW5lcmF0ZV9waHBfc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QsIGlzX3Jlc3VsdCk7Ci0gIGdlbmVyYXRlX3BocF9zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCwgaXNfcmVzdWx0KTsKLSAgaWYgKG5lZWRzX3BocF9yZWFkX3ZhbGlkYXRvcih0c3RydWN0LCBpc19yZXN1bHQpKSB7Ci0gICAgZ2VuZXJhdGVfcGhwX3N0cnVjdF9yZWFkX3ZhbGlkYXRvcihvdXQsIHRzdHJ1Y3QpOwotICB9Ci0gIGlmIChuZWVkc19waHBfd3JpdGVfdmFsaWRhdG9yKHRzdHJ1Y3QsIGlzX3Jlc3VsdCkpIHsKLSAgICBnZW5lcmF0ZV9waHBfc3RydWN0X3dyaXRlX3ZhbGlkYXRvcihvdXQsIHRzdHJ1Y3QpOwotICB9Ci0gIGlmIChqc29uX3NlcmlhbGl6YWJsZV8pIHsKLSAgICBnZW5lcmF0ZV9waHBfc3RydWN0X2pzb25fc2VyaWFsaXplKG91dCwgdHN0cnVjdCwgaXNfcmVzdWx0KTsKLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgdGhlIHJlYWQoKSBtZXRob2QgZm9yIGEgc3RydWN0Ci0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9waHBfc3RydWN0X3JlYWRlcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0KSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICJwdWJsaWMgZnVuY3Rpb24gcmVhZCgkaW5wdXQpIiA8PCBlbmRsOwotICBzY29wZV91cChvdXQpOwotCi0gIGlmIChvb3BfKSB7Ci0gICAgaWYgKG5lZWRzX3BocF9yZWFkX3ZhbGlkYXRvcih0c3RydWN0LCBpc19yZXN1bHQpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiJHRtcCA9ICR0aGlzLT5fcmVhZCgnIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICInLCBzZWxmOjokX1RTUEVDLCAkaW5wdXQpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICIkdGhpcy0+X3ZhbGlkYXRlRm9yUmVhZCgpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gJHRtcDsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gJHRoaXMtPl9yZWFkKCciIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIicsIHNlbGY6OiRfVFNQRUMsICRpbnB1dCk7IiA8PCBlbmRsOwotICAgIH0KLSAgICBzY29wZV9kb3duKG91dCk7Ci0gICAgb3V0IDw8IGVuZGw7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgIiR4ZmVyID0gMDsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiJGZuYW1lID0gbnVsbDsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiJGZ0eXBlID0gMDsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiJGZpZCA9IDA7IiA8PCBlbmRsOwotCi0gIC8vIERlY2xhcmUgc3RhY2sgdG1wIHZhcmlhYmxlcwotICBpZiAoIWJpbmFyeV9pbmxpbmVfKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICIkeGZlciArPSAkaW5wdXQtPnJlYWRTdHJ1Y3RCZWdpbigkZm5hbWUpOyIgPDwgZW5kbDsKLSAgfQotCi0gIC8vIExvb3Agb3ZlciByZWFkaW5nIGluIGZpZWxkcwotICBpbmRlbnQob3V0KSA8PAotICAgICJ3aGlsZSAodHJ1ZSkiIDw8IGVuZGw7Ci0KLSAgICBzY29wZV91cChvdXQpOwotCi0gICAgLy8gUmVhZCBiZWdpbm5pbmcgZmllbGQgbWFya2VyCi0gICAgaWYgKGJpbmFyeV9pbmxpbmVfKSB7Ci0gICAgICB0X2ZpZWxkIGZmdHlwZShnX3R5cGVfYnl0ZSwgImZ0eXBlIik7Ci0gICAgICB0X2ZpZWxkIGZmaWQoZ190eXBlX2kxNiwgImZpZCIpOwotICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmZ0eXBlKTsKLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKCRmdHlwZSA9PSAiIDw8ICJUVHlwZTo6U1RPUCkgeyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBicmVhazsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZmlkKTsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZEZpZWxkQmVnaW4oJGZuYW1lLCAkZnR5cGUsICRmaWQpOyIgPDwgZW5kbDsKLSAgICAgIC8vIENoZWNrIGZvciBmaWVsZCBTVE9QIG1hcmtlciBhbmQgYnJlYWsKLSAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICJpZiAoJGZ0eXBlID09ICIgPDwgIlRUeXBlOjpTVE9QKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAiYnJlYWs7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICJ9IiA8PCBlbmRsOwotICAgIH0KLQotICAgIC8vIFN3aXRjaCBzdGF0ZW1lbnQgb24gdGhlIGZpZWxkIHdlIGFyZSByZWFkaW5nCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJzd2l0Y2ggKCRmaWQpIiA8PCBlbmRsOwotCi0gICAgICBzY29wZV91cChvdXQpOwotCi0gICAgICAvLyBHZW5lcmF0ZSBkZXNlcmlhbGl6YXRpb24gY29kZSBmb3Iga25vd24gY2FzZXMKLSAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICAgImNhc2UgIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOiIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoJGZ0eXBlID09ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIikgeyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMtPiIpOwotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7Ci0gICAgICAgIGlmIChiaW5hcnlfaW5saW5lXykgewotICAgICAgICAgIGluZGVudChvdXQpIDw8ICAiICAkeGZlciArPSAiIDw8ICJUUHJvdG9jb2w6OnNraXBCaW5hcnkoJGlucHV0LCAkZnR5cGUpOyIgPDwgZW5kbDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpbmRlbnQob3V0KSA8PCAgIiAgJHhmZXIgKz0gJGlucHV0LT5za2lwKCRmdHlwZSk7IiA8PCBlbmRsOwotICAgICAgICB9Ci0gICAgICAgIG91dCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIH0KLQotICAgICAgLy8gSW4gdGhlIGRlZmF1bHQgY2FzZSB3ZSBza2lwIHRoZSBmaWVsZAotICAgICAgaW5kZW50KG91dCkgPDwgICJkZWZhdWx0OiIgPDwgZW5kbDsKLSAgICAgIGlmIChiaW5hcnlfaW5saW5lXykgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAgIiAgJHhmZXIgKz0gIiA8PCAiVFByb3RvY29sOjpza2lwQmluYXJ5KCRpbnB1dCwgJGZ0eXBlKTsiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAgIiAgJHhmZXIgKz0gJGlucHV0LT5za2lwKCRmdHlwZSk7IiA8PCBlbmRsOwotICAgICAgfQotICAgICAgaW5kZW50KG91dCkgPDwgICIgIGJyZWFrOyIgPDwgZW5kbDsKLQotICAgICAgc2NvcGVfZG93bihvdXQpOwotCi0gICAgaWYgKCFiaW5hcnlfaW5saW5lXykgewotICAgICAgLy8gUmVhZCBmaWVsZCBlbmQgbWFya2VyCi0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAiJHhmZXIgKz0gJGlucHV0LT5yZWFkRmllbGRFbmQoKTsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgc2NvcGVfZG93bihvdXQpOwotCi0gIGlmICghYmluYXJ5X2lubGluZV8pIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZFN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKLSAgfQotCi0gIGlmIChuZWVkc19waHBfcmVhZF92YWxpZGF0b3IodHN0cnVjdCwgaXNfcmVzdWx0KSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiJHRoaXMtPl92YWxpZGF0ZUZvclJlYWQoKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnQob3V0KSA8PAotICAgICJyZXR1cm4gJHhmZXI7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgdGhlIHdyaXRlKCkgbWV0aG9kIGZvciBhIHN0cnVjdAotICovCi12b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGhwX3N0cnVjdF93cml0ZXIob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCkgewotICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgaWYgKGJpbmFyeV9pbmxpbmVfKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJiRvdXRwdXQpIHsiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJG91dHB1dCkgeyIgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfdXAoKTsKLQotICBpZiAobmVlZHNfcGhwX3dyaXRlX3ZhbGlkYXRvcih0c3RydWN0LCBpc19yZXN1bHQpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIiR0aGlzLT5fdmFsaWRhdGVGb3JXcml0ZSgpOyIgPDwgZW5kbDsKLSAgfQotCi0gIGlmIChvb3BfKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgInJldHVybiAkdGhpcy0+X3dyaXRlKCciIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIicsIHNlbGY6OiRfVFNQRUMsICRvdXRwdXQpOyIgPDwgZW5kbDsKLSAgICBzY29wZV9kb3duKG91dCk7Ci0gICAgb3V0IDw8IGVuZGw7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAiJHhmZXIgPSAwOyIgPDwgZW5kbDsKLQotICBpZiAoIWJpbmFyeV9pbmxpbmVfKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICIkeGZlciArPSAkb3V0cHV0LT53cml0ZVN0cnVjdEJlZ2luKCciIDw8IG5hbWUgPDwgIicpOyIgPDwgZW5kbDsKLSAgfQotCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWYgKCR0aGlzLT4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9PSBudWxsKSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotCi0gICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSgoKmZfaXRlciktPmdldF90eXBlKCkpOwotICAgIHN0cmluZyBleHBlY3Q7Ci0gICAgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgICBleHBlY3QgPSAiYXJyYXkiOwotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkpIHsKLSAgICAgIGV4cGVjdCA9ICJvYmplY3QiOwotICAgIH0KLSAgICBpZiAoIWV4cGVjdC5lbXB0eSgpKSB7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlmICghaXNfIiA8PCBleHBlY3QgPDwgIigkdGhpcy0+IiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIikpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAidGhyb3cgbmV3ICIgPDwgIlRQcm90b2NvbEV4Y2VwdGlvbignQmFkIHR5cGUgaW4gc3RydWN0dXJlLicsICIgPDwgIlRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBKTsiIDw8IGVuZGw7Ci0gICAgICBzY29wZV9kb3duKG91dCk7Ci0gICAgfQotCi0gICAgLy8gV3JpdGUgZmllbGQgaGVhZGVyCi0gICAgaWYgKGJpbmFyeV9pbmxpbmVfKSB7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiRvdXRwdXQgLj0gcGFjaygnYycsICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIik7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHBhY2soJ24nLCAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICIpOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgIiR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRCZWdpbigiIDw8Ci0gICAgICAgICInIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIicsICIgPDwKLSAgICAgICAgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgICAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAidGhpcy0+Iik7Ci0KLSAgICAvLyBXcml0ZSBmaWVsZCBjbG9zZXIKLSAgICBpZiAoIWJpbmFyeV9pbmxpbmVfKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAiJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZEVuZCgpOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAifSIgPDwgZW5kbDsKLSAgfQotCi0gIGlmIChiaW5hcnlfaW5saW5lXykgewotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgIiRvdXRwdXQgLj0gcGFjaygnYycsICIgPDwgIlRUeXBlOjpTVE9QKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZFN0b3AoKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIkeGZlciArPSAkb3V0cHV0LT53cml0ZVN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKLSAgfQotCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJyZXR1cm4gJHhmZXI7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi12b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGhwX3N0cnVjdF9yZWFkX3ZhbGlkYXRvcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGdlbmVyYXRlX3BocF9zdHJ1Y3RfcmVxdWlyZWRfdmFsaWRhdG9yKG91dCwgdHN0cnVjdCwgIl92YWxpZGF0ZUZvclJlYWQiLCBmYWxzZSk7Ci19Ci0KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9waHBfc3RydWN0X3dyaXRlX3ZhbGlkYXRvcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGdlbmVyYXRlX3BocF9zdHJ1Y3RfcmVxdWlyZWRfdmFsaWRhdG9yKG91dCwgdHN0cnVjdCwgIl92YWxpZGF0ZUZvcldyaXRlIiwgdHJ1ZSk7Ci19Ci0KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9waHBfc3RydWN0X3JlcXVpcmVkX3ZhbGlkYXRvcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG1ldGhvZF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgd3JpdGVfbW9kZSkgewotICBpbmRlbnQob3V0KSA8PAotICAgICJwcml2YXRlIGZ1bmN0aW9uICIgPDwgbWV0aG9kX25hbWUgPDwgIigpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0KLSAgaWYgKGZpZWxkcy5zaXplKCkgPiAwKSB7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgIHRfZmllbGQqIGZpZWxkID0gKCpmX2l0ZXIpOwotICAgICAgaWYgKGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCB8fAotICAgICAgICAgIChmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUX0lOX1JFUV9PVVQgJiYgd3JpdGVfbW9kZSkpIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgICAiaWYgKCR0aGlzLT4iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgPT09IG51bGwpIHsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF91cCgpOwotICAgICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAgICJ0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCdSZXF1aXJlZCBmaWVsZCAiIDw8Ci0gICAgICAgICAgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiLiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiBpcyB1bnNldCEnKTsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICAgIn0iIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotCi0KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9waHBfc3RydWN0X2pzb25fc2VyaWFsaXplKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0KSB7Ci0gIGluZGVudChvdXQpIDw8Ci0gICAgInB1YmxpYyBmdW5jdGlvbiBqc29uU2VyaWFsaXplKCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaWYgKG5lZWRzX3BocF93cml0ZV92YWxpZGF0b3IodHN0cnVjdCwgaXNfcmVzdWx0KSkgewotICAgIGluZGVudChvdXQpIDw8ICIkdGhpcy0+X3ZhbGlkYXRlRm9yV3JpdGUoKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnQob3V0KSA8PCAiJGpzb24gPSBuZXcgc3RkQ2xhc3M7IiA8PCBlbmRsOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0KLSAgaWYgKGZpZWxkcy5zaXplKCkgPiAwKSB7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqZl9pdGVyKTsKLSAgICAgIHRfdHlwZSogdHlwZSA9IGZpZWxkLT5nZXRfdHlwZSgpOwotICAgICAgY29uc3Qgc3RyaW5nJiBuYW1lID0gZmllbGQtPmdldF9uYW1lKCk7Ci0gICAgICBpZiAodHlwZS0+aXNfbWFwKCkgJiYgISgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKS0+aXNfc3RyaW5nKCkpIHsKLSAgICAgICAgLy8gSlNPTiBvYmplY3Qga2V5cyBtdXN0IGJlIHN0cmluZ3MKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCR0aGlzLT4iIDw8IG5hbWUgPDwgIiAhPT0gbnVsbCkgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgaW5kZW50KG91dCkgPDwgIiRqc29uLT4iIDw8IG5hbWUgPDwgIiA9ICR0aGlzLT4iIDw8IG5hbWUgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgaW5kZW50KG91dCkgPDwgInJldHVybiAkanNvbjsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotaW50IHRfcGhwX2dlbmVyYXRvcjo6Z2V0X3BocF9udW1fcmVxdWlyZWRfZmllbGRzKGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHdyaXRlX21vZGUpIHsKLSAgaW50IG51bV9yZXEgPSAwOwotCi0gIGlmIChmaWVsZHMuc2l6ZSgpID4gMCkgewotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQgfHwKLSAgICAgICAgICAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVCAmJiB3cml0ZV9tb2RlKSkgewotICAgICAgICArK251bV9yZXE7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiBudW1fcmVxOwotfQotCi1ib29sIHRfcGhwX2dlbmVyYXRvcjo6bmVlZHNfcGhwX3dyaXRlX3ZhbGlkYXRvcih0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19yZXN1bHQpIHsKLSAgcmV0dXJuICh2YWxpZGF0ZV8gJiYKLSAgICAgICAgICAhaXNfcmVzdWx0ICYmCi0gICAgICAgICAgIXRzdHJ1Y3QtPmlzX3VuaW9uKCkgJiYKLSAgICAgICAgICBnZXRfcGhwX251bV9yZXF1aXJlZF9maWVsZHModHN0cnVjdC0+Z2V0X21lbWJlcnMoKSwgdHJ1ZSkgPiAwKTsKLX0KLQotYm9vbCB0X3BocF9nZW5lcmF0b3I6Om5lZWRzX3BocF9yZWFkX3ZhbGlkYXRvcih0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19yZXN1bHQpIHsKLSAgcmV0dXJuICh2YWxpZGF0ZV8gJiYKLSAgICAgICAgICAhaXNfcmVzdWx0ICYmCi0gICAgICAgICAgKGdldF9waHBfbnVtX3JlcXVpcmVkX2ZpZWxkcyh0c3RydWN0LT5nZXRfbWVtYmVycygpLCBmYWxzZSkgPiAwKSk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgdGhyaWZ0IHNlcnZpY2UuCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZl9zZXJ2aWNlX25hbWUgPSBwYWNrYWdlX2Rpcl8rc2VydmljZV9uYW1lXysiLnBocCI7Ci0gIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKLQotICBmX3NlcnZpY2VfIDw8ICI8P3BocCIgPDwgZW5kbDsKLSAgZl9zZXJ2aWNlXyA8PCAibmFtZXNwYWNlICIgPDwgcGhwX25hbWVzcGFjZV9zdWZmaXgodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpIDw8ICI7IiA8PCBlbmRsOwotICBmX3NlcnZpY2VfIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8Ci0gICAgcGhwX2luY2x1ZGVzKCk7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIHRocmVlIG1haW4gcGFydHMgb2YgdGhlIHNlcnZpY2UgKHdlbGwsIHR3byBmb3Igbm93IGluIFBIUCkKLSAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UpOwotICBpZiAocmVzdF8pIHsKLSAgICBnZW5lcmF0ZV9zZXJ2aWNlX3Jlc3QodHNlcnZpY2UpOwotICB9Ci0gIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRzZXJ2aWNlKTsKLSAgaWYgKHBocHNfKSB7Ci0gICAgZ2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3IodHNlcnZpY2UpOwotICB9Ci0KLSAgLy8gQ2xvc2Ugc2VydmljZSBmaWxlCi0gIGZfc2VydmljZV8gPDwgZW5kbDsKLSAgZl9zZXJ2aWNlXy5jbG9zZSgpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2Ugc2VydmVyIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KLSAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfcHJvY2Vzc29yKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgLy8gR2VuZXJhdGUgdGhlIGRpc3BhdGNoIG1ldGhvZHMKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0KLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfcHJvY2Vzc29yID0gIiI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpOwotICAgIGV4dGVuZHNfcHJvY2Vzc29yID0gIiBleHRlbmRzICIgKyBwaHBfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfcHJvZ3JhbSgpKSArIGV4dGVuZHMgKyAiUHJvY2Vzc29yIjsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIHRoZSBoZWFkZXIgcG9ydGlvbgotICBmX3NlcnZpY2VfIDw8Ci0gICAgImNsYXNzICIgPDwgc2VydmljZV9uYW1lXyA8PCAiUHJvY2Vzc29yIiA8PCBleHRlbmRzX3Byb2Nlc3NvciA8PCAiIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicHJvdGVjdGVkICRoYW5kbGVyXyA9IG51bGw7IiA8PCBlbmRsOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGhhbmRsZXIpIHsiIDw8IGVuZGw7Ci0gIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICAkdGhpcy0+aGFuZGxlcl8gPSAkaGFuZGxlcjsiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgcGFyZW50OjpfX2NvbnN0cnVjdCgkaGFuZGxlcik7IiA8PCBlbmRsOwotICB9Ci0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIHNlcnZlciBpbXBsZW1lbnRhdGlvbgotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAicHVibGljIGZ1bmN0aW9uIHByb2Nlc3MoJGlucHV0LCAkb3V0cHV0KSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgIiRyc2VxaWQgPSAwOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIkZm5hbWUgPSBudWxsOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIkbXR5cGUgPSAwOyIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgaWYgKGJpbmFyeV9pbmxpbmVfKSB7Ci0gICAgdF9maWVsZCBmZm5hbWUoZ190eXBlX3N0cmluZywgImZuYW1lIik7Ci0gICAgdF9maWVsZCBmbXR5cGUoZ190eXBlX2J5dGUsICJtdHlwZSIpOwotICAgIHRfZmllbGQgZnNlcWlkKGdfdHlwZV9pMzIsICJyc2VxaWQiKTsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChmX3NlcnZpY2VfLCAmZmZuYW1lLCAiIiwgdHJ1ZSk7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQoZl9zZXJ2aWNlXywgJmZtdHlwZSwgIiIsIHRydWUpOwotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKGZfc2VydmljZV8sICZmc2VxaWQsICIiLCB0cnVlKTsKLSAgfSBlbHNlIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiJGlucHV0LT5yZWFkTWVzc2FnZUJlZ2luKCRmbmFtZSwgJG10eXBlLCAkcnNlcWlkKTsiIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBIT1Q6IGNoZWNrIGZvciBtZXRob2QgaW1wbGVtZW50YXRpb24KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICIkbWV0aG9kbmFtZSA9ICdwcm9jZXNzXycuJGZuYW1lOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJpZiAoIW1ldGhvZF9leGlzdHMoJHRoaXMsICRtZXRob2RuYW1lKSkgeyIgPDwgZW5kbDsKLSAgaWYgKGJpbmFyeV9pbmxpbmVfKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgdGhyb3cgbmV3IFxcRXhjZXB0aW9uKCdGdW5jdGlvbiAnLiRmbmFtZS4nIG5vdCBpbXBsZW1lbnRlZC4nKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgJGlucHV0LT5za2lwKCIgPDwgIlRUeXBlOjpTVFJVQ1QpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgJGlucHV0LT5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgJHggPSBuZXcgIiA8PCAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uKCdGdW5jdGlvbiAnLiRmbmFtZS4nIG5vdCBpbXBsZW1lbnRlZC4nLCAiIDw8ICJUQXBwbGljYXRpb25FeGNlcHRpb246OlVOS05PV05fTUVUSE9EKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgICRvdXRwdXQtPndyaXRlTWVzc2FnZUJlZ2luKCRmbmFtZSwgIiA8PCAiVE1lc3NhZ2VUeXBlOjpFWENFUFRJT04sICRyc2VxaWQpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgJHgtPndyaXRlKCRvdXRwdXQpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgJG91dHB1dC0+d3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICAkb3V0cHV0LT5nZXRUcmFuc3BvcnQoKS0+Zmx1c2goKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybjsiIDw8IGVuZGw7Ci0gIH0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiR0aGlzLT4kbWV0aG9kbmFtZSgkcnNlcWlkLCAkaW5wdXQsICRvdXRwdXQpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJyZXR1cm4gdHJ1ZTsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3Mgc3ViZnVuY3Rpb25zCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0c2VydmljZSwgKmZfaXRlcik7Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8ICJ9IiA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHByb2Nlc3MgZnVuY3Rpb24gZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byB3cml0ZSBhIGRpc3BhdGNoZXIgZm9yCi0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgLy8gT3BlbiBmdW5jdGlvbgotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAicHJvdGVjdGVkIGZ1bmN0aW9uIHByb2Nlc3NfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwKLSAgICAiKCRzZXFpZCwgJGlucHV0LCAkb3V0cHV0KSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBzdHJpbmcgYXJnc25hbWUgPSBwaHBfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSArIHNlcnZpY2VfbmFtZV8gKyAiXyIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX2FyZ3MiOwotICBzdHJpbmcgcmVzdWx0bmFtZSA9IHBocF9uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpICsgc2VydmljZV9uYW1lXyArICJfIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgIiRhcmdzID0gbmV3ICIgPDwgYXJnc25hbWUgPDwgIigpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIkYXJncy0+cmVhZCgkaW5wdXQpOyIgPDwgZW5kbDsKLSAgaWYgKCFiaW5hcnlfaW5saW5lXykgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICIkaW5wdXQtPnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLQotICAvLyBEZWNsYXJlIHJlc3VsdCBmb3Igbm9uIG9uZXdheSBmdW5jdGlvbgotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiJHJlc3VsdCA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIigpOyIgPDwgZW5kbDsKLSAgfQotCi0gIC8vIFRyeSBibG9jayBmb3IgYSBmdW5jdGlvbiB3aXRoIGV4Y2VwdGlvbnMKLSAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInRyeSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICB9Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGZ1bmN0aW9uIGNhbGwKLSAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGZfc2VydmljZV8gPDwgaW5kZW50KCk7Ci0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8ICIkcmVzdWx0LT5zdWNjZXNzID0gIjsKLSAgfQotICBmX3NlcnZpY2VfIDw8Ci0gICAgIiR0aGlzLT5oYW5kbGVyXy0+IiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKLSAgICB9Ci0gICAgZl9zZXJ2aWNlXyA8PCAiJGFyZ3MtPiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICB9Ci0gIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOwotCi0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiB4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgewotICAgIGluZGVudF9kb3duKCk7Ci0gICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIn0gY2F0Y2ggKCIgPDwgcGhwX25hbWVzcGFjZShnZXRfdHJ1ZV90eXBlKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSktPmdldF9wcm9ncmFtKCkpIDw8ICgqeF9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X25hbWUoKSA8PCAiICQiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgICAgIGluZGVudF91cCgpOwotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiRyZXN1bHQtPiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAkIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGZfc2VydmljZV8gPDwgIn0iIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBTaG9ydGN1dCBvdXQgaGVyZSBmb3Igb25ld2F5IGZ1bmN0aW9ucwotICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJyZXR1cm47IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICIkYmluX2FjY2VsID0gKCRvdXRwdXQgaW5zdGFuY2VvZiAiIDw8ICJUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCkgJiYgZnVuY3Rpb25fZXhpc3RzKCd0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYmluYXJ5Jyk7IiA8PCBlbmRsOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAiaWYgKCRiaW5fYWNjZWwpIiA8PCBlbmRsOwotICBzY29wZV91cChmX3NlcnZpY2VfKTsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgInRocmlmdF9wcm90b2NvbF93cml0ZV9iaW5hcnkoJG91dHB1dCwgJyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICInLCAiIDw8ICJUTWVzc2FnZVR5cGU6OlJFUExZLCAkcmVzdWx0LCAkc2VxaWQsICRvdXRwdXQtPmlzU3RyaWN0V3JpdGUoKSk7IiA8PCBlbmRsOwotCi0gIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAiZWxzZSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0KLSAgLy8gU2VyaWFsaXplIHRoZSByZXF1ZXN0IGhlYWRlcgotICBpZiAoYmluYXJ5X2lubGluZV8pIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiJGJ1ZmYgPSBwYWNrKCdOJywgKDB4ODAwMTAwMDAgfCAiIDw8ICJUTWVzc2FnZVR5cGU6OlJFUExZKSk7ICIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiRidWZmIC49IHBhY2soJ04nLCBzdHJsZW4oJyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICInKSk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiJGJ1ZmYgLj0gJyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICInOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiRidWZmIC49IHBhY2soJ04nLCAkc2VxaWQpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiRyZXN1bHQtPndyaXRlKCRidWZmKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIkb3V0cHV0LT53cml0ZSgkYnVmZik7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiJG91dHB1dC0+Zmx1c2goKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgIiRvdXRwdXQtPndyaXRlTWVzc2FnZUJlZ2luKCciIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiJywgIiA8PCAiVE1lc3NhZ2VUeXBlOjpSRVBMWSwgJHNlcWlkKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIkcmVzdWx0LT53cml0ZSgkb3V0cHV0KTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIkb3V0cHV0LT53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIkb3V0cHV0LT5nZXRUcmFuc3BvcnQoKS0+Zmx1c2goKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotCi0gIC8vIENsb3NlIGZ1bmN0aW9uCi0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgaGVscGVyIGZ1bmN0aW9ucyBmb3IgYSBzZXJ2aWNlLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgotICovCi12b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgICIvLyBIRUxQRVIgRlVOQ1RJT05TIEFORCBTVFJVQ1RVUkVTIiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X3N0cnVjdCogdHMgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgc3RyaW5nIG5hbWUgPSB0cy0+Z2V0X25hbWUoKTsKLSAgICB0cy0+c2V0X25hbWUoc2VydmljZV9uYW1lXyArICJfIiArIG5hbWUpOwotICAgIGdlbmVyYXRlX3BocF9zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCB0cyk7Ci0gICAgZ2VuZXJhdGVfcGhwX2Z1bmN0aW9uX2hlbHBlcnMoKmZfaXRlcik7Ci0gICAgdHMtPnNldF9uYW1lKG5hbWUpOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGFuZCBoZWxwZXJzIGZvciBhIGZ1bmN0aW9uLgotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uCi0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9waHBfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCBzZXJ2aWNlX25hbWVfICsgIl8iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKLSAgICB0X2ZpZWxkIHN1Y2Nlc3ModGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOwotICAgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOwotICAgIH0KLQotICAgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgcmVzdWx0LmFwcGVuZCgqZl9pdGVyKTsKLSAgICB9Ci0KLSAgICBnZW5lcmF0ZV9waHBfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgJnJlc3VsdCwgZmFsc2UsIHRydWUpOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBpbnRlcmZhY2UgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKLSAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfaWYgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gIiBleHRlbmRzICIgKyBwaHBfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfcHJvZ3JhbSgpKSArIHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpOwotICAgIGV4dGVuZHNfaWYgPSAiIGV4dGVuZHMgIiArIHBocF9uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9wcm9ncmFtKCkpICsgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkgKyAiSWYiOwotICB9Ci0gIGdlbmVyYXRlX3BocF9kb2MoZl9zZXJ2aWNlXywgdHNlcnZpY2UpOwotICBmX3NlcnZpY2VfIDw8Ci0gICAgImludGVyZmFjZSAiIDw8IHBocF9uYW1lc3BhY2VfZGVjbGFyYXRpb24odHNlcnZpY2UpIDw8ICJJZiIgPDwgZXh0ZW5kc19pZiA8PCAiIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9waHBfZG9jKGZfc2VydmljZV8sICpmX2l0ZXIpOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgInB1YmxpYyBmdW5jdGlvbiAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCAiOyIgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8Ci0gICAgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBSRVNUIGludGVyZmFjZQotICovCi12b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9yZXN0KHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfaWYgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gIiBleHRlbmRzICIgKyBwaHBfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfcHJvZ3JhbSgpKSArIHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpOwotICAgIGV4dGVuZHNfaWYgPSAiIGV4dGVuZHMgIiArIHBocF9uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9wcm9ncmFtKCkpICsgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkgKyAiUmVzdCI7Ci0gIH0KLSAgZl9zZXJ2aWNlXyA8PAotICAgICJjbGFzcyAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIlJlc3QiIDw8IGV4dGVuZHNfaWYgPDwgIiB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInByb3RlY3RlZCAkaW1wbF87IiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGltcGwpIHsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICAkdGhpcy0+aW1wbF8gPSAkaW1wbDsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAicHVibGljIGZ1bmN0aW9uICIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoJHJlcXVlc3QpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgYXJncyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBhX2l0ZXI7Ci0gICAgZm9yIChhX2l0ZXIgPSBhcmdzLmJlZ2luKCk7IGFfaXRlciAhPSBhcmdzLmVuZCgpOyArK2FfaXRlcikgewotICAgICAgdF90eXBlKiBhdHlwZSA9IGdldF90cnVlX3R5cGUoKCphX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICAgIHN0cmluZyBjYXN0ID0gdHlwZV90b19jYXN0KGF0eXBlKTsKLSAgICAgIHN0cmluZyByZXEgPSAiJHJlcXVlc3RbJyIgKyAoKmFfaXRlciktPmdldF9uYW1lKCkgKyAiJ10iOwotICAgICAgaWYgKGF0eXBlLT5pc19ib29sKCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIkIiA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgY2FzdCA8PCAiKCFlbXB0eSgiIDw8IHJlcSA8PCAiKSAmJiAoIiA8PCByZXEgPDwgIiAhPT0gJ2ZhbHNlJykpOyIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiJCIgPDwgKCphX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSBpc3NldCgiIDw8IHJlcSA8PCAiKSA/ICIgPDwgY2FzdCA8PCByZXEgPDwgIiA6IG51bGw7IiA8PCBlbmRsOwotICAgICAgfQotICAgICAgaWYgKGF0eXBlLT5pc19zdHJpbmcoKSAmJgotICAgICAgICAgICgodF9iYXNlX3R5cGUqKWF0eXBlKS0+aXNfc3RyaW5nX2xpc3QoKSkgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiQiIDw8ICgqYV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gZXhwbG9kZSgnLCcsICQiIDw8ICgqYV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgaWYgKGF0eXBlLT5pc19tYXAoKSB8fCBhdHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiJCIgPDwgKCphX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSBqc29uX2RlY29kZSgkIiA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgIiwgdHJ1ZSk7IiA8PCBlbmRsOwotICAgICAgfSBlbHNlIGlmIChhdHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIkIiA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IGFycmF5X2ZpbGxfa2V5cyhqc29uX2RlY29kZSgkIiA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgIiwgdHJ1ZSksIDEpOyIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSBpZiAoYXR5cGUtPmlzX3N0cnVjdCgpIHx8IGF0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKCQiIDw8ICgqYV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9PSBudWxsKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgJCIgPDwgKCphX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSBuZXcgIiA8PCBwaHBfbmFtZXNwYWNlKGF0eXBlLT5nZXRfcHJvZ3JhbSgpKSA8PCBhdHlwZS0+Z2V0X25hbWUoKSA8PCAiKGpzb25fZGVjb2RlKCQiIDw8ICgqYV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiLCB0cnVlKSk7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJyZXR1cm4gJHRoaXMtPmltcGxfLT4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCIgPDwgYXJndW1lbnRfbGlzdCgoKmZfaXRlciktPmdldF9hcmdsaXN0KCksIGZhbHNlKSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICJ9IiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwKLSAgICAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KLSAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfY2xpZW50ID0gIiI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpOwotICAgIGV4dGVuZHNfY2xpZW50ID0gIiBleHRlbmRzICIgKyBwaHBfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfcHJvZ3JhbSgpKSArIGV4dGVuZHMgKyAiQ2xpZW50IjsKLSAgfQotCi0gIGZfc2VydmljZV8gPDwKLSAgICAiY2xhc3MgIiA8PCBwaHBfbmFtZXNwYWNlX2RlY2xhcmF0aW9uKHRzZXJ2aWNlKSA8PCAiQ2xpZW50IiA8PCBleHRlbmRzX2NsaWVudCA8PCAiIGltcGxlbWVudHMgIiA8PCAgcGhwX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgPDwgc2VydmljZV9uYW1lXyA8PCAiSWYgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgLy8gUHJpdmF0ZSBtZW1iZXJzCi0gIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicHJvdGVjdGVkICRpbnB1dF8gPSBudWxsOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgInByb3RlY3RlZCAkb3V0cHV0XyA9IG51bGw7IiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsOwotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgJHNlcWlkXyA9IDA7IiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsOwotICB9Ci0KLSAgLy8gQ29uc3RydWN0b3IgZnVuY3Rpb24KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGlucHV0LCAkb3V0cHV0PW51bGwpIHsiIDw8IGVuZGw7Ci0gIGlmICghZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgcGFyZW50OjpfX2NvbnN0cnVjdCgkaW5wdXQsICRvdXRwdXQpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICAkdGhpcy0+aW5wdXRfID0gJGlucHV0OyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgJHRoaXMtPm91dHB1dF8gPSAkb3V0cHV0ID8gJG91dHB1dCA6ICRpbnB1dDsiIDw8IGVuZGw7Ci0gIH0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKLSAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLQotICAgIC8vIE9wZW4gZnVuY3Rpb24KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICJwdWJsaWMgZnVuY3Rpb24gIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgZW5kbDsKLSAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgICAiJHRoaXMtPnNlbmRfIiA8PCBmdW5uYW1lIDw8ICIoIjsKLQotICAgICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKLSAgICAgICAgfQotICAgICAgICBmX3NlcnZpY2VfIDw8ICIkIiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICAgIH0KLSAgICAgIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOwotCi0gICAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKLSAgICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICAgIGZfc2VydmljZV8gPDwgInJldHVybiAiOwotICAgICAgICB9Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICAiJHRoaXMtPnJlY3ZfIiA8PCBmdW5uYW1lIDw8ICIoKTsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICJwdWJsaWMgZnVuY3Rpb24gc2VuZF8iIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCBlbmRsOwotICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOwotCi0gICAgICBzdGQ6OnN0cmluZyBhcmdzbmFtZSA9IHBocF9uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpICsgc2VydmljZV9uYW1lXyArICJfIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfYXJncyI7Ci0KLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiRhcmdzID0gbmV3ICIgPDwgYXJnc25hbWUgPDwgIigpOyIgPDwgZW5kbDsKLQotICAgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIkYXJncy0+IiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gJCIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiRiaW5fYWNjZWwgPSAoJHRoaXMtPm91dHB1dF8gaW5zdGFuY2VvZiAiIDw8ICJUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCkgJiYgZnVuY3Rpb25fZXhpc3RzKCd0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYmluYXJ5Jyk7IiA8PCBlbmRsOwotCi0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiAoJGJpbl9hY2NlbCkiIDw8IGVuZGw7Ci0gICAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKLQotICAgICAgc3RyaW5nIG1lc3NhZ2VUeXBlID0gKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSA/ICJUTWVzc2FnZVR5cGU6Ok9ORVdBWSIgOiAiVE1lc3NhZ2VUeXBlOjpDQUxMIjsKLQotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAidGhyaWZ0X3Byb3RvY29sX3dyaXRlX2JpbmFyeSgkdGhpcy0+b3V0cHV0XywgJyIKLSAgICAgICAgICAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInLCAiIDw8IG1lc3NhZ2VUeXBlCi0gICAgICAgICAgICAgICAgIDw8ICIsICRhcmdzLCAkdGhpcy0+c2VxaWRfLCAkdGhpcy0+b3V0cHV0Xy0+aXNTdHJpY3RXcml0ZSgpKTsiIDw8IGVuZGw7Ci0KLSAgICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJlbHNlIiA8PCBlbmRsOwotICAgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0KLSAgICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVxdWVzdCBoZWFkZXIKLSAgICAgIGlmIChiaW5hcnlfaW5saW5lXykgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiRidWZmID0gcGFjaygnTicsICgweDgwMDEwMDAwIHwgIiA8PCBtZXNzYWdlVHlwZQotICAgICAgICAgICAgICAgICAgIDw8ICIpKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiJGJ1ZmYgLj0gcGFjaygnTicsIHN0cmxlbignIiA8PCBmdW5uYW1lIDw8ICInKSk7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiRidWZmIC49ICciIDw8IGZ1bm5hbWUgPDwgIic7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiRidWZmIC49IHBhY2soJ04nLCAkdGhpcy0+c2VxaWRfKTsiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiR0aGlzLT5vdXRwdXRfLT53cml0ZU1lc3NhZ2VCZWdpbignIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIicsICIKLSAgICAgICAgICAgICAgICAgICA8PCBtZXNzYWdlVHlwZSA8PCAiLCAkdGhpcy0+c2VxaWRfKTsiIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIC8vIFdyaXRlIHRvIHRoZSBzdHJlYW0KLSAgICAgIGlmIChiaW5hcnlfaW5saW5lXykgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiRhcmdzLT53cml0ZSgkYnVmZik7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiR0aGlzLT5vdXRwdXRfLT53cml0ZSgkYnVmZik7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiR0aGlzLT5vdXRwdXRfLT5mbHVzaCgpOyIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiJGFyZ3MtPndyaXRlKCR0aGlzLT5vdXRwdXRfKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiJHRoaXMtPm91dHB1dF8tPndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIkdGhpcy0+b3V0cHV0Xy0+Z2V0VHJhbnNwb3J0KCktPmZsdXNoKCk7IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLQotICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0KLQotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgc3RkOjpzdHJpbmcgcmVzdWx0bmFtZSA9IHBocF9uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpICsgc2VydmljZV9uYW1lXyArICJfIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKLSAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7Ci0KLSAgICAgIHRfZnVuY3Rpb24gcmVjdl9mdW5jdGlvbigoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJyZWN2XyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZub2FyZ3MpOwotICAgICAgLy8gT3BlbiBmdW5jdGlvbgotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJwdWJsaWMgZnVuY3Rpb24gIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnJlY3ZfZnVuY3Rpb24pIDw8IGVuZGw7Ci0gICAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKLQotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiJGJpbl9hY2NlbCA9ICgkdGhpcy0+aW5wdXRfIGluc3RhbmNlb2YgIiA8PCAiVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQpIgotICAgICAgICAgICAgICAgICA8PCAiICYmIGZ1bmN0aW9uX2V4aXN0cygndGhyaWZ0X3Byb3RvY29sX3JlYWRfYmluYXJ5Jyk7IiA8PCBlbmRsOwotCi0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiAoJGJpbl9hY2NlbCkgJHJlc3VsdCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2JpbmFyeSgkdGhpcy0+aW5wdXRfLCAnIiA8PCByZXN1bHRuYW1lIDw8ICInLCAkdGhpcy0+aW5wdXRfLT5pc1N0cmljdFJlYWQoKSk7IiA8PCBlbmRsOwotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiZWxzZSIgPDwgZW5kbDsKLSAgICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOwotCi0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIkcnNlcWlkID0gMDsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiRmbmFtZSA9IG51bGw7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIkbXR5cGUgPSAwOyIgPDwgZW5kbCA8PAotICAgICAgICBlbmRsOwotCi0gICAgICBpZiAoYmluYXJ5X2lubGluZV8pIHsKLSAgICAgICAgdF9maWVsZCBmZm5hbWUoZ190eXBlX3N0cmluZywgImZuYW1lIik7Ci0gICAgICAgIHRfZmllbGQgZnNlcWlkKGdfdHlwZV9pMzIsICJyc2VxaWQiKTsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIkdmVyID0gdW5wYWNrKCdOJywgJHRoaXMtPmlucHV0Xy0+cmVhZEFsbCg0KSk7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiR2ZXIgPSAkdmVyWzFdOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIkbXR5cGUgPSAkdmVyICYgMHhmZjsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiJHZlciA9ICR2ZXIgJiAweGZmZmYwMDAwOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAoJHZlciAhPSAweDgwMDEwMDAwKSB0aHJvdyBuZXcgIiA8PCAiVFByb3RvY29sRXhjZXB0aW9uKCdCYWQgdmVyc2lvbiBpZGVudGlmaWVyOiAnLiR2ZXIsICIgPDwgIlRQcm90b2NvbEV4Y2VwdGlvbjo6QkFEX1ZFUlNJT04pOyIgPDwgZW5kbDsKLSAgICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQoZl9zZXJ2aWNlXywgJmZmbmFtZSwgIiIsIHRydWUpOwotICAgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChmX3NlcnZpY2VfLCAmZnNlcWlkLCAiIiwgdHJ1ZSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiR0aGlzLT5pbnB1dF8tPnJlYWRNZXNzYWdlQmVnaW4oJGZuYW1lLCAkbXR5cGUsICRyc2VxaWQpOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAoJG10eXBlID09ICIgPDwgIlRNZXNzYWdlVHlwZTo6RVhDRVBUSU9OKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgJHggPSBuZXcgIiA8PCAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uKCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgJHgtPnJlYWQoJHRoaXMtPmlucHV0Xyk7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgJHRoaXMtPmlucHV0Xy0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICB0aHJvdyAkeDsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiJHJlc3VsdCA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIigpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiJHJlc3VsdC0+cmVhZCgkdGhpcy0+aW5wdXRfKTsiIDw8IGVuZGw7Ci0KLSAgICAgIGlmICghYmluYXJ5X2lubGluZV8pIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIkdGhpcy0+aW5wdXRfLT5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLQotICAgICAgLy8gQ2FyZWZ1bCwgb25seSByZXR1cm4gcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KLSAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAoJHJlc3VsdC0+c3VjY2VzcyAhPT0gbnVsbCkgeyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiAkcmVzdWx0LT5zdWNjZXNzOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICB0X3N0cnVjdCogeHMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKLSAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0gICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImlmICgkcmVzdWx0LT4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9PSBudWxsKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgdGhyb3cgJHJlc3VsdC0+IiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgLy8gQ2FyZWZ1bCwgb25seSByZXR1cm4gX3Jlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCi0gICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAgICAgInJldHVybjsiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgInRocm93IG5ldyBcXEV4Y2VwdGlvbihcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZmFpbGVkOiB1bmtub3duIHJlc3VsdFwiKTsiIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAvLyBDbG9zZSBmdW5jdGlvbgotICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gICAgfQotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXyA8PAotICAgICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogRGVzZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCi0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbGFzcykgewotICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+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+d3JpdGVNYXBCZWdpbigiIDw8Ci0gICAgICAgIHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICAgIHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICAgICJjb3VudCgkIiA8PCBwcmVmaXggPDwgIikpOyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaWYgKGJpbmFyeV9pbmxpbmVfKSB7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiRvdXRwdXQgLj0gcGFjaygnYycsICIgPDwgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiRvdXRwdXQgLj0gc3RycmV2KHBhY2soJ2wnLCBjb3VudCgkIiA8PCBwcmVmaXggPDwgIikpKTsiIDw8IGVuZGw7Ci0KLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgIiRvdXRwdXQtPndyaXRlU2V0QmVnaW4oIiA8PAotICAgICAgICB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgICAgImNvdW50KCQiIDw8IHByZWZpeCA8PCAiKSk7IiA8PCBlbmRsOwotICAgIH0KLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaWYgKGJpbmFyeV9pbmxpbmVfKSB7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiRvdXRwdXQgLj0gcGFjaygnYycsICIgPDwgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIik7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHN0cnJldihwYWNrKCdsJywgY291bnQoJCIgPDwgcHJlZml4IDw8ICIpKSk7IiA8PCBlbmRsOwotCi0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICIkb3V0cHV0LT53cml0ZUxpc3RCZWdpbigiIDw8Ci0gICAgICAgIHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgICAgImNvdW50KCQiIDw8IHByZWZpeCA8PCAiKSk7IiA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIHN0cmluZyBraXRlciA9IHRtcCgia2l0ZXIiKTsKLSAgICBzdHJpbmcgdml0ZXIgPSB0bXAoInZpdGVyIik7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJmb3JlYWNoICgkIiA8PCBwcmVmaXggPDwgIiBhcyAiIDw8Ci0gICAgICAiJCIgPDwga2l0ZXIgPDwgIiA9PiAkIiA8PCB2aXRlciA8PCAiKSIgPDwgZW5kbDsKLSAgICBzY29wZV91cChvdXQpOwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIGtpdGVyLCB2aXRlcik7Ci0gICAgc2NvcGVfZG93bihvdXQpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIHN0cmluZyBpdGVyID0gdG1wKCJpdGVyIik7Ci0gICAgc3RyaW5nIGl0ZXJfdmFsID0gdG1wKCJpdGVyIik7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJmb3JlYWNoICgkIiA8PCBwcmVmaXggPDwgIiBhcyAkIiA8PCBpdGVyIDw8ICIgPT4gJCIgPDwgaXRlcl92YWwgPDwgIikiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAob3V0KTsKLSAgICBpbmRlbnQob3V0KSA8PCAiaWYgKGlzX3NjYWxhcigkIiA8PCBpdGVyX3ZhbCA8PCAiKSkgeyIgPDwgZW5kbDsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBpdGVyKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgaXRlcl92YWwpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgc3RyaW5nIGl0ZXIgPSB0bXAoIml0ZXIiKTsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImZvcmVhY2ggKCQiIDw8IHByZWZpeCA8PCAiIGFzICQiIDw8IGl0ZXIgPDwgIikiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAob3V0KTsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIGl0ZXIpOwotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgfQotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLQotICBpZiAoIWJpbmFyeV9pbmxpbmVfKSB7Ci0gICAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgIiRvdXRwdXQtPndyaXRlTWFwRW5kKCk7IiA8PCBlbmRsOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAiJG91dHB1dC0+d3JpdGVTZXRFbmQoKTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAiJG91dHB1dC0+d3JpdGVMaXN0RW5kKCk7IiA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbWFwLgotICoKLSAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGtpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdml0ZXIpIHsKLSAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksIGtpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmtmaWVsZCwgIiIpOwotCi0gIHRfZmllbGQgdmZpZWxkKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2aXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZ2ZmllbGQsICIiKTsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgc2V0LgotICovCi12b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0c2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlcikgewotICB0X2ZpZWxkIGVmaWVsZCh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIik7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIGxpc3QuCi0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZXIpIHsKLSAgdF9maWVsZCBlZmllbGQodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiKTsKLX0KLQotLyoqCi0gKiBFbWl0cyBhIFBIUERvYyBjb21tZW50IGZvciB0aGUgZ2l2ZW4gY29udGVudHMKLSAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3BocF9kb2NzdHJpbmdfY29tbWVudChvZnN0cmVhbSAmb3V0LCBzdHJpbmcgY29udGVudHMpIHsKLSAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLyoqXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICogIiwgY29udGVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgKi9cbiIpOwotfQotCi0vKioKLSAqIEVtaXRzIGEgUEhQRG9jIGNvbW1lbnQgaWYgdGhlIHByb3ZpZGVkIG9iamVjdCBoYXMgYSBkb2MgaW4gVGhyaWZ0Ci0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9waHBfZG9jKG9mc3RyZWFtICZvdXQsIHRfZG9jKiB0ZG9jKSB7Ci0gIGlmICh0ZG9jLT5oYXNfZG9jKCkpIHsKLSAgICBnZW5lcmF0ZV9waHBfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCB0ZG9jLT5nZXRfZG9jKCkpOwotICB9Ci19Ci0KLS8qKgotICogRW1pdHMgYSBQSFBEb2MgY29tbWVudCBmb3IgYSBmaWVsZAotICovCi12b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGhwX2RvYyhvZnN0cmVhbSAmb3V0LCB0X2ZpZWxkKiBmaWVsZCkgewotICBzdHJpbmdzdHJlYW0gc3M7Ci0KLSAgLy8gcHJlcGVuZCBmcmVlLXN0eWxlIGRvYyBpZiBhdmFpbGFibGUKLSAgaWYgKGZpZWxkLT5oYXNfZG9jKCkpIHsKLSAgICBzcyA8PCBmaWVsZC0+Z2V0X2RvYygpIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBhcHBlbmQgQHZhciB0YWcKLSAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZShmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0gIHNzIDw8ICJAdmFyICIgPDwgdHlwZV90b19waHBkb2ModHlwZSkgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9waHBfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCBzcy5zdHIoKSk7Ci19Ci0KLS8qKgotICogRW1pdHMgYSBQSFBEb2MgY29tbWVudCBmb3IgYSBmdW5jdGlvbgotICovCi12b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGhwX2RvYyhvZnN0cmVhbSAmb3V0LCB0X2Z1bmN0aW9uKiBmdW5jdGlvbikgewotICBzdHJpbmdzdHJlYW0gc3M7Ci0gIGlmIChmdW5jdGlvbi0+aGFzX2RvYygpKSB7Ci0gICAgc3MgPDwgZnVuY3Rpb24tPmdldF9kb2MoKSA8PCBlbmRsOwotICB9Ci0KLSAgLy8gZ2VuZXJhdGUgcGFyYW1ldGVyIHR5cGVzIGRvYwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBhcmdzID0gZnVuY3Rpb24tPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGFfaXRlcjsKLSAgZm9yIChhX2l0ZXIgPSBhcmdzLmJlZ2luKCk7IGFfaXRlciAhPSBhcmdzLmVuZCgpOyArK2FfaXRlcikgewotICAgIHRfZmllbGQqIGFyZyA9ICphX2l0ZXI7Ci0gICAgc3MgPDwgIkBwYXJhbSAiIDw8IHR5cGVfdG9fcGhwZG9jKGFyZy0+Z2V0X3R5cGUoKSkgPDwgIiAkIiA8PCBhcmctPmdldF9uYW1lKCk7Ci0gICAgaWYgKGFyZy0+aGFzX2RvYygpKSB7Ci0gICAgICBzcyA8PCAiICIgPDwgYXJnLT5nZXRfZG9jKCk7Ci0gICAgfQotICAgIHNzIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBnZW5lcmF0ZSByZXR1cm4gdHlwZSBkb2MKLSAgdF90eXBlKiByZXRfdHlwZSA9IGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpOwotICBpZiAoIXJldF90eXBlLT5pc192b2lkKCkgfHwgcmV0X3R5cGUtPmhhc19kb2MoKSkgewotICAgIHNzIDw8ICJAcmV0dXJuICIgPDwgdHlwZV90b19waHBkb2MocmV0X3R5cGUpOwotICAgIGlmIChyZXRfdHlwZS0+aGFzX2RvYygpKSB7Ci0gICAgICBzcyA8PCAiICIgPDwgcmV0X3R5cGUtPmdldF9kb2MoKTsKLSAgICB9Ci0gICAgc3MgPDwgZW5kbDsKLSAgfQotCi0gIC8vIGdlbmVyYXRlIGV4Y2VwdGlvbnMgZG9jCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGV4Y3MgPSBmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBlX2l0ZXI7Ci0gIGZvciAoZV9pdGVyID0gZXhjcy5iZWdpbigpOyBlX2l0ZXIgIT0gZXhjcy5lbmQoKTsgKytlX2l0ZXIpIHsKLSAgICB0X2ZpZWxkKiBleGMgPSAqZV9pdGVyOwotICAgIHNzIDw8ICJAdGhyb3dzICIgPDwgdHlwZV90b19waHBkb2MoZXhjLT5nZXRfdHlwZSgpKTsKLSAgICBpZiAoZXhjLT5oYXNfZG9jKCkpIHsKLSAgICAgIHNzIDw8ICIgIiA8PCBleGMtPmdldF9kb2MoKTsKLSAgICB9Ci0gICAgc3MgPDwgZW5kbDsKLSAgfQotCi0gIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICIvKipcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiICogIiwgc3Muc3RyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiICovXG4iKTsKLX0KLQotCi0vKioKLSAqIERlY2xhcmVzIGEgZmllbGQsIHdoaWNoIG1heSBpbmNsdWRlIGluaXRpYWxpemF0aW9uIGFzIG5lY2Vzc2FyeS4KLSAqCi0gKiBAcGFyYW0gdHR5cGUgVGhlIHR5cGUKLSAqLwotc3RyaW5nIHRfcGhwX2dlbmVyYXRvcjo6ZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdCwgYm9vbCBvYmopIHsKLSAgc3RyaW5nIHJlc3VsdCA9ICIkIiArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLSAgaWYgKGluaXQpIHsKLSAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIHJlc3VsdCArPSAiID0gJyciOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgcmVzdWx0ICs9ICIgPSBmYWxzZSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICByZXN1bHQgKz0gIiA9IDAiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICByZXN1bHQgKz0gIiA9IDAuMCI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBQSFAgaW5pdGlhbGl6ZXIgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgcmVzdWx0ICs9ICIgPSAwIjsKLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgICByZXN1bHQgKz0gIiA9IGFycmF5KCkiOwotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgICAgaWYgKG9iaikgewotICAgICAgICByZXN1bHQgKz0gIiA9IG5ldyAiICsgcGhwX25hbWVzcGFjZSh0eXBlLT5nZXRfcHJvZ3JhbSgpKSArIHR5cGUtPmdldF9uYW1lKCkgKyAiKCkiOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmVzdWx0ICs9ICIgPSBudWxsIjsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdCArICI7IjsKLX0KLQotLyoqCi0gKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd0eXBlIG5hbWUoYXJncyknCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCi0gKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCi0gKi8KLXN0cmluZyB0X3BocF9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICByZXR1cm4KLSAgICBwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKwotICAgICIoIiArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKSArICIpIjsKLX0KLQotLyoqCi0gKiBSZW5kZXJzIGEgZmllbGQgbGlzdAotICovCi1zdHJpbmcgdF9waHBfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGFkZFR5cGVIaW50cykgewotICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlc3VsdCArPSAiLCAiOwotICAgIH0KLQotICAgIHRfdHlwZSogdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKLQotICAgIC8vU2V0IHR5cGUgbmFtZQotICAgIGlmIChhZGRUeXBlSGludHMpCi0gICAgewotICAgICAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpKQotICAgICAgewotICAgICAgICBzdHJpbmcgY2xhc3NOYW1lID0gcGhwX25hbWVzcGFjZSh0eXBlLT5nZXRfcHJvZ3JhbSgpKSArIHBocF9uYW1lc3BhY2VfZGlyZWN0b3J5KCJEZWZpbml0aW9uIiwgZmFsc2UpICsgY2xhc3NpZnkodHlwZS0+Z2V0X25hbWUoKSk7Ci0KLSAgICAgICAgcmVzdWx0ICs9IGNsYXNzTmFtZSArICIgIjsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKQotICAgICAgewotICAgICAgICByZXN1bHQgKz0gImFycmF5ICI7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmVzdWx0ICs9ICIkIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioKLSAqIEdldHMgYSB0eXBlY2FzdCBzdHJpbmcgZm9yIGEgcGFydGljdWxhciB0eXBlLgotICovCi1zdHJpbmcgdF9waHBfZ2VuZXJhdG9yOjp0eXBlX3RvX2Nhc3QodF90eXBlKiB0eXBlKSB7Ci0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlKiBidHlwZSA9ICh0X2Jhc2VfdHlwZSopdHlwZTsKLSAgICBzd2l0Y2ggKGJ0eXBlLT5nZXRfYmFzZSgpKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuICIoYm9vbCkiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJldHVybiAiKGludCkiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuICIoZG91YmxlKSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICByZXR1cm4gIihzdHJpbmcpIjsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuICIiOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gIihpbnQpIjsKLSAgfQotICByZXR1cm4gIiI7Ci19Ci0KLS8qKgotICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBDKysgZW51bSBzdHJpbmcgZm9yIHRoZSBnaXZlbiB0eXBlLgotICovCi1zdHJpbmcgdF9waHBfZ2VuZXJhdG9yIDo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIHJldHVybiAiVFR5cGU6OlNUUklORyI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuICJUVHlwZTo6Qk9PTCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgcmV0dXJuICJUVHlwZTo6QllURSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICByZXR1cm4gIlRUeXBlOjpJMTYiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgcmV0dXJuICJUVHlwZTo6STMyIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJldHVybiAiVFR5cGU6Okk2NCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICByZXR1cm4gIlRUeXBlOjpET1VCTEUiOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlOjpJMzIiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlOjpTVFJVQ1QiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZTo6TUFQIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHJldHVybiAiVFR5cGU6OlNFVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZTo6TFNUIjsKLSAgfQotCi0gIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotLyoqCi0gKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhIFBIUERvYyBzdHJpbmcgZm9yIHRoZSBnaXZlbiB0eXBlLgotICovCi1zdHJpbmcgdF9waHBfZ2VuZXJhdG9yIDo6dHlwZV90b19waHBkb2ModF90eXBlKiB0eXBlKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgcmV0dXJuICJ2b2lkIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIHJldHVybiAic3RyaW5nIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICByZXR1cm4gImJvb2wiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIHJldHVybiAiaW50IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIHJldHVybiAiaW50IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIHJldHVybiAiaW50IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJldHVybiAiaW50IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIHJldHVybiAiZG91YmxlIjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJpbnQiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gcGhwX25hbWVzcGFjZSh0eXBlLT5nZXRfcHJvZ3JhbSgpKSArIHR5cGUtPmdldF9uYW1lKCk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gImFycmF5IjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHRfc2V0KiB0c2V0ID0gc3RhdGljX2Nhc3Q8dF9zZXQqPih0eXBlKTsKLSAgICB0X3R5cGUqIHRfZWxlbSA9IHRzZXQtPmdldF9lbGVtX3R5cGUoKTsKLSAgICBpZiAodF9lbGVtLT5pc19jb250YWluZXIoKSkgewotICAgICAgcmV0dXJuICIoIiArIHR5cGVfdG9fcGhwZG9jKHRfZWxlbSkgKyAiKVtdIjsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIHR5cGVfdG9fcGhwZG9jKHRfZWxlbSkgKyAiW10iOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICB0X2xpc3QqIHRsaXN0ID0gc3RhdGljX2Nhc3Q8dF9saXN0Kj4odHlwZSk7Ci0gICAgdF90eXBlKiB0X2VsZW0gPSB0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIGlmICh0X2VsZW0tPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgICByZXR1cm4gIigiICsgdHlwZV90b19waHBkb2ModF9lbGVtKSArICIpW10iOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gdHlwZV90b19waHBkb2ModF9lbGVtKSArICJbXSI7Ci0gICAgfQotICB9Ci0KLSAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotfQotCi1USFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKHBocCwgIlBIUCIsCi0iICAgIGlubGluZWQ6ICAgICAgICAgR2VuZXJhdGUgUEhQIGlubGluZWQgZmlsZXNcbiIKLSIgICAgc2VydmVyOiAgICAgICAgICBHZW5lcmF0ZSBQSFAgc2VydmVyIHN0dWJzXG4iCi0iICAgIG9vcDogICAgICAgICAgICAgR2VuZXJhdGUgUEhQIHdpdGggb2JqZWN0IG9yaWVudGVkIHN1YmNsYXNzZXNcbiIKLSIgICAgcmVzdDogICAgICAgICAgICBHZW5lcmF0ZSBQSFAgUkVTVCBwcm9jZXNzb3JzXG4iCi0iICAgIG5zZ2xvYmFsPU5BTUU6ICAgU2V0IGdsb2JhbCBuYW1lc3BhY2VcbiIKLSIgICAgdmFsaWRhdGU6ICAgICAgICBHZW5lcmF0ZSBQSFAgdmFsaWRhdG9yIG1ldGhvZHNcbiIKLSIgICAganNvbjogICAgICAgICAgICBHZW5lcmF0ZSBKc29uU2VyaWFsaXphYmxlIGNsYXNzZXMgKHJlcXVpcmVzIFBIUCA+PSA1LjQpXG4iCi0pCi0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9weV9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfcHlfZ2VuZXJhdG9yLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjRiY2M3Li4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9weV9nZW5lcmF0b3IuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyNzYyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSAidF9nZW5lcmF0b3IuaCIKLSNpbmNsdWRlICJwbGF0Zm9ybS5oIgotI2luY2x1ZGUgInZlcnNpb24uaCIKLQotdXNpbmcgc3RkOjptYXA7Ci11c2luZyBzdGQ6Om9mc3RyZWFtOwotdXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwotdXNpbmcgc3RkOjpzdHJpbmc7Ci11c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKLXVzaW5nIHN0ZDo6dmVjdG9yOwotCi1zdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAgLy8gYXZvaWQgb3N0cmVhbSA8PCBzdGQ6OmVuZGwgZmx1c2hlcwotCi0vKioKLSAqIFB5dGhvbiBjb2RlIGdlbmVyYXRvci4KLSAqCi0gKi8KLWNsYXNzIHRfcHlfZ2VuZXJhdG9yIDogcHVibGljIHRfZ2VuZXJhdG9yIHsKLSBwdWJsaWM6Ci0gIHRfcHlfZ2VuZXJhdG9yKAotICAgICAgdF9wcm9ncmFtKiBwcm9ncmFtLAotICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKLSAgICA6IHRfZ2VuZXJhdG9yKHByb2dyYW0pCi0gIHsKLSAgICAodm9pZCkgb3B0aW9uX3N0cmluZzsKLSAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOwotCi0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoIm5ld19zdHlsZSIpOwotICAgIGdlbl9uZXdzdHlsZV8gPSAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7Ci0KLSAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgic2xvdHMiKTsKLSAgICBnZW5fc2xvdHNfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotCi0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoImR5bmFtaWMiKTsKLSAgICBnZW5fZHluYW1pY18gPSAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7Ci0KLSAgICBpZiAoZ2VuX2R5bmFtaWNfKSB7Ci0gICAgICBnZW5fbmV3c3R5bGVfID0gMDsgLy8gZHluYW1pYyBpcyBuZXdzdHlsZQotICAgICAgZ2VuX2R5bmJhc2VjbGFzc18gPSAiVEJhc2UiOwotICAgICAgZ2VuX2R5bmJhc2VjbGFzc19leGNfID0gIlRFeGNlcHRpb25CYXNlIjsKLSAgICAgIGltcG9ydF9keW5iYXNlXyA9ICJmcm9tIHRocmlmdC5wcm90b2NvbC5UQmFzZSBpbXBvcnQgVEJhc2UsIFRFeGNlcHRpb25CYXNlXG4iOwotICAgIH0KLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJkeW5iYXNlIik7Ci0gICAgaWYgKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpIHsKLSAgICAgIGdlbl9keW5iYXNlXyA9IHRydWU7Ci0gICAgICBnZW5fZHluYmFzZWNsYXNzXyA9IChpdGVyLT5zZWNvbmQpOwotICAgIH0KLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJkeW5leGMiKTsKLSAgICBpZiAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSkgewotICAgICAgZ2VuX2R5bmJhc2VjbGFzc19leGNfID0gKGl0ZXItPnNlY29uZCk7Ci0gICAgfQotCi0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoImR5bmltcG9ydCIpOwotICAgIGlmIChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKSB7Ci0gICAgICBnZW5fZHluYmFzZV8gPSB0cnVlOwotICAgICAgaW1wb3J0X2R5bmJhc2VfID0gKGl0ZXItPnNlY29uZCk7Ci0gICAgfQotCi0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoInR3aXN0ZWQiKTsKLSAgICBnZW5fdHdpc3RlZF8gPSAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7Ci0KLSAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgidG9ybmFkbyIpOwotICAgIGdlbl90b3JuYWRvXyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLQotICAgIGlmIChnZW5fdHdpc3RlZF8gJiYgZ2VuX3Rvcm5hZG9fKSB7Ci0gICAgICB0aHJvdyAiYXQgbW9zdCBvbmUgb2YgJ3R3aXN0ZWQnIGFuZCAndG9ybmFkbycgYXJlIGFsbG93ZWQiOwotICAgIH0KLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJ1dGY4c3RyaW5ncyIpOwotICAgIGdlbl91dGY4c3RyaW5nc18gPSAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7Ci0KLSAgICBjb3B5X29wdGlvbnNfID0gb3B0aW9uX3N0cmluZzsKLQotICAgIGlmIChnZW5fdHdpc3RlZF8pIHsKLSAgICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLXB5LnR3aXN0ZWQiOwotICAgIH0gZWxzZSBpZiAoZ2VuX3Rvcm5hZG9fKSB7Ci0gICAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1weS50b3JuYWRvIjsKLSAgICB9IGVsc2UgewotICAgICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tcHkiOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCi0gICAqLwotCi0gIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKLSAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKLQotICAvKioKLSAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYgICh0X3R5cGVkZWYqICB0dHlwZWRlZik7Ci0gIHZvaWQgZ2VuZXJhdGVfZW51bSAgICAgKHRfZW51bSogICAgIHRlbnVtKTsKLSAgdm9pZCBnZW5lcmF0ZV9jb25zdCAgICAodF9jb25zdCogICAgdGNvbnN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QgICAodF9zdHJ1Y3QqICAgdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24gKHRfc3RydWN0KiAgIHR4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZSAgKHRfc2VydmljZSogIHRzZXJ2aWNlKTsKLQotICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFN0cnVjdCBnZW5lcmF0aW9uIGNvZGUKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9weV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9weV9zdHJ1Y3RfZGVmaW5pdGlvbihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX3hjZXB0aW9uPWZhbHNlLCBib29sIGlzX3Jlc3VsdD1mYWxzZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfcHlfc3RydWN0X3JlYWRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9weV9zdHJ1Y3Rfd3JpdGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3B5X3N0cnVjdF9yZXF1aXJlZF92YWxpZGF0b3Ioc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfcHlfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotCi0gIC8qKgotICAgKiBTZXJ2aWNlLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzICAgKHRfc2VydmljZSogIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQgICAgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfcmVtb3RlICAgICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlciAgICAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbiAgKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0KLSAgLyoqCi0gICAqIFNlcmlhbGl6YXRpb24gY29uc3RydWN0cwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkICAgICAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogICAgdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsYXNzPWZhbHNlKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdCAgICAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqICAgdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogICAgIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50ICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqICAgICAgdHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudCAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiAgICAgIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50IChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqICAgICB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQgICAgICAgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqICAgIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0ICAgICAgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiAgIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lciAgICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqICAgICB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiAgICAgIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBraXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHZpdGVyKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudCAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqICAgICAgdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGl0ZXIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudCAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqICAgICB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGl0ZXIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyAgICAgICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nICAgICAgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nICAgICAgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZG9jKiAgICB0ZG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzdWJoZWFkZXIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyAgICAgICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2RvYyogdGRvYyk7Ci0KLSAgLyoqCi0gICAqIEhlbHBlciByZW5kZXJpbmcgZnVuY3Rpb25zCi0gICAqLwotCi0gIHN0ZDo6c3RyaW5nIHB5X2F1dG9nZW5fY29tbWVudCgpOwotICBzdGQ6OnN0cmluZyBweV9pbXBvcnRzKCk7Ci0gIHN0ZDo6c3RyaW5nIHJlbmRlcl9pbmNsdWRlcygpOwotICBzdGQ6OnN0cmluZyByZW5kZXJfZmFzdGJpbmFyeV9pbmNsdWRlcygpOwotICBzdGQ6OnN0cmluZyBkZWNsYXJlX2FyZ3VtZW50KHRfZmllbGQqIHRmaWVsZCk7Ci0gIHN0ZDo6c3RyaW5nIHJlbmRlcl9maWVsZF9kZWZhdWx0X3ZhbHVlKHRfZmllbGQqIHRmaWVsZCk7Ci0gIHN0ZDo6c3RyaW5nIHR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlKTsKLSAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW50ZXJmYWNlPWZhbHNlKTsKLSAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gKnByZT1OVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAqcG9zdD1OVUxMKTsKLSAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOwotICBzdGQ6OnN0cmluZyB0eXBlX3RvX3NwZWNfYXJncyh0X3R5cGUqIHR0eXBlKTsKLQotICBzdGF0aWMgYm9vbCBpc192YWxpZF9uYW1lc3BhY2UoY29uc3Qgc3RkOjpzdHJpbmcmIHN1Yl9uYW1lc3BhY2UpIHsKLSAgICByZXR1cm4gc3ViX25hbWVzcGFjZSA9PSAidHdpc3RlZCI7Ci0gIH0KLQotICBzdGF0aWMgc3RkOjpzdHJpbmcgZ2V0X3JlYWxfcHlfbW9kdWxlKGNvbnN0IHRfcHJvZ3JhbSogcHJvZ3JhbSwgYm9vbCBnZW5fdHdpc3RlZCkgewotICAgIGlmKGdlbl90d2lzdGVkKSB7Ci0gICAgICBzdGQ6OnN0cmluZyB0d2lzdGVkX21vZHVsZSA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2UoInB5LnR3aXN0ZWQiKTsKLSAgICAgIGlmKCF0d2lzdGVkX21vZHVsZS5lbXB0eSgpKXsKLSAgICAgICAgcmV0dXJuIHR3aXN0ZWRfbW9kdWxlOwotICAgICAgfQotICAgIH0KLQotICAgIHN0ZDo6c3RyaW5nIHJlYWxfbW9kdWxlID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgicHkiKTsKLSAgICBpZiAocmVhbF9tb2R1bGUuZW1wdHkoKSkgewotICAgICAgcmV0dXJuIHByb2dyYW0tPmdldF9uYW1lKCk7Ci0gICAgfQotICAgIHJldHVybiByZWFsX21vZHVsZTsKLSAgfQotCi0gcHJpdmF0ZToKLQotICAvKioKLSAgICogVHJ1ZSBpZiB3ZSBzaG91bGQgZ2VuZXJhdGUgbmV3LXN0eWxlIGNsYXNzZXMuCi0gICAqLwotICBib29sIGdlbl9uZXdzdHlsZV87Ci0KLSAgIC8qKgotICAgKiBUcnVlIGlmIHdlIHNob3VsZCBnZW5lcmF0ZSBkeW5hbWljIHN0eWxlIGNsYXNzZXMuCi0gICAqLwotICBib29sIGdlbl9keW5hbWljXzsKLQotICBib29sIGdlbl9keW5iYXNlXzsKLSAgc3RkOjpzdHJpbmcgZ2VuX2R5bmJhc2VjbGFzc187Ci0gIHN0ZDo6c3RyaW5nIGdlbl9keW5iYXNlY2xhc3NfZXhjXzsKLQotICBzdGQ6OnN0cmluZyBpbXBvcnRfZHluYmFzZV87Ci0KLSAgYm9vbCBnZW5fc2xvdHNfOwotCi0gIHN0ZDo6c3RyaW5nIGNvcHlfb3B0aW9uc187Ci0KLSAgLyoqCi0gICAqIFRydWUgaWYgd2Ugc2hvdWxkIGdlbmVyYXRlIFR3aXN0ZWQtZnJpZW5kbHkgUlBDIHNlcnZpY2VzLgotICAgKi8KLSAgYm9vbCBnZW5fdHdpc3RlZF87Ci0KLSAgLyoqCi0gICAqIFRydWUgaWYgd2Ugc2hvdWxkIGdlbmVyYXRlIGNvZGUgZm9yIHVzZSB3aXRoIFRvcm5hZG8KLSAgICovCi0gIGJvb2wgZ2VuX3Rvcm5hZG9fOwotCi0gIC8qKgotICAgKiBUcnVlIGlmIHN0cmluZ3Mgc2hvdWxkIGJlIGVuY29kZWQgdXNpbmcgdXRmLTguCi0gICAqLwotICBib29sIGdlbl91dGY4c3RyaW5nc187Ci0KLSAgLyoqCi0gICAqIEZpbGUgc3RyZWFtcwotICAgKi8KLQotICBzdGQ6Om9mc3RyZWFtIGZfdHlwZXNfOwotICBzdGQ6Om9mc3RyZWFtIGZfY29uc3RzXzsKLSAgc3RkOjpvZnN0cmVhbSBmX3NlcnZpY2VfOwotCi0gIHN0ZDo6c3RyaW5nIHBhY2thZ2VfZGlyXzsKLSAgc3RkOjpzdHJpbmcgbW9kdWxlXzsKLQotfTsKLQotCi0vKioKLSAqIFByZXBhcmVzIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0Ci0gKiBzdHJlYW1zLgotICoKLSAqIEBwYXJhbSB0cHJvZ3JhbSBUaGUgcHJvZ3JhbSB0byBnZW5lcmF0ZQotICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKLSAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5Ci0gIHN0cmluZyBtb2R1bGUgPSBnZXRfcmVhbF9weV9tb2R1bGUocHJvZ3JhbV8sIGdlbl90d2lzdGVkXyk7Ci0gIHBhY2thZ2VfZGlyXyA9IGdldF9vdXRfZGlyKCk7Ci0gIG1vZHVsZV8gPSBtb2R1bGU7Ci0gIHdoaWxlICh0cnVlKSB7Ci0gICAgLy8gVE9ETzogRG8gYmV0dGVyIGVycm9yIGNoZWNraW5nIGhlcmUuCi0gICAgTUtESVIocGFja2FnZV9kaXJfLmNfc3RyKCkpOwotICAgIHN0ZDo6b2ZzdHJlYW0gaW5pdF9weSgocGFja2FnZV9kaXJfKyIvX19pbml0X18ucHkiKS5jX3N0cigpLCBzdGQ6Omlvc19iYXNlOjphcHApOwotICAgIGluaXRfcHkuY2xvc2UoKTsKLSAgICBpZiAobW9kdWxlLmVtcHR5KCkpIHsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBzdHJpbmc6OnNpemVfdHlwZSBwb3MgPSBtb2R1bGUuZmluZCgnLicpOwotICAgIGlmIChwb3MgPT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgICBwYWNrYWdlX2Rpcl8gKz0gIi8iOwotICAgICAgcGFja2FnZV9kaXJfICs9IG1vZHVsZTsKLSAgICAgIG1vZHVsZS5jbGVhcigpOwotICAgIH0gZWxzZSB7Ci0gICAgICBwYWNrYWdlX2Rpcl8gKz0gIi8iOwotICAgICAgcGFja2FnZV9kaXJfICs9IG1vZHVsZS5zdWJzdHIoMCwgcG9zKTsKLSAgICAgIG1vZHVsZS5lcmFzZSgwLCBwb3MrMSk7Ci0gICAgfQotICB9Ci0KLSAgLy8gTWFrZSBvdXRwdXQgZmlsZQotICBzdHJpbmcgZl90eXBlc19uYW1lID0gcGFja2FnZV9kaXJfKyIvIisidHR5cGVzLnB5IjsKLSAgZl90eXBlc18ub3BlbihmX3R5cGVzX25hbWUuY19zdHIoKSk7Ci0KLSAgc3RyaW5nIGZfY29uc3RzX25hbWUgPSBwYWNrYWdlX2Rpcl8rIi8iKyJjb25zdGFudHMucHkiOwotICBmX2NvbnN0c18ub3BlbihmX2NvbnN0c19uYW1lLmNfc3RyKCkpOwotCi0gIHN0cmluZyBmX2luaXRfbmFtZSA9IHBhY2thZ2VfZGlyXysiL19faW5pdF9fLnB5IjsKLSAgb2ZzdHJlYW0gZl9pbml0OwotICBmX2luaXQub3BlbihmX2luaXRfbmFtZS5jX3N0cigpKTsKLSAgZl9pbml0ICA8PAotICAgICJfX2FsbF9fID0gWyd0dHlwZXMnLCAnY29uc3RhbnRzJyI7Ci0gIHZlY3Rvcjx0X3NlcnZpY2UqPiBzZXJ2aWNlcyA9IHByb2dyYW1fLT5nZXRfc2VydmljZXMoKTsKLSAgdmVjdG9yPHRfc2VydmljZSo+OjppdGVyYXRvciBzdl9pdGVyOwotICBmb3IgKHN2X2l0ZXIgPSBzZXJ2aWNlcy5iZWdpbigpOyBzdl9pdGVyICE9IHNlcnZpY2VzLmVuZCgpOyArK3N2X2l0ZXIpIHsKLSAgICBmX2luaXQgPDwgIiwgJyIgPDwgKCpzdl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJyI7Ci0gIH0KLSAgZl9pbml0IDw8ICJdIiA8PCBlbmRsOwotICBmX2luaXQuY2xvc2UoKTsKLQotICAvLyBQcmludCBoZWFkZXIKLSAgZl90eXBlc18gPDwKLSAgICBweV9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsIDw8Ci0gICAgcHlfaW1wb3J0cygpIDw8IGVuZGwgPDwKLSAgICByZW5kZXJfaW5jbHVkZXMoKSA8PCBlbmRsIDw8Ci0gICAgcmVuZGVyX2Zhc3RiaW5hcnlfaW5jbHVkZXMoKSA8PAotICAgIGVuZGwgPDwgZW5kbDsKLQotICBmX2NvbnN0c18gPDwKLSAgICBweV9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsIDw8Ci0gICAgcHlfaW1wb3J0cygpIDw8IGVuZGwgPDwKLSAgICAiZnJvbSB0dHlwZXMgaW1wb3J0ICoiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotfQotCi0vKioKLSAqIFJlbmRlcnMgYWxsIHRoZSBpbXBvcnRzIG5lY2Vzc2FyeSBmb3IgaW5jbHVkaW5nIGFub3RoZXIgVGhyaWZ0IHByb2dyYW0KLSAqLwotc3RyaW5nIHRfcHlfZ2VuZXJhdG9yOjpyZW5kZXJfaW5jbHVkZXMoKSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X3Byb2dyYW0qPiYgaW5jbHVkZXMgPSBwcm9ncmFtXy0+Z2V0X2luY2x1ZGVzKCk7Ci0gIHN0cmluZyByZXN1bHQgPSAiIjsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmNsdWRlcy5zaXplKCk7ICsraSkgewotICAgIHJlc3VsdCArPSAiaW1wb3J0ICIgKyBnZXRfcmVhbF9weV9tb2R1bGUoaW5jbHVkZXNbaV0sIGdlbl90d2lzdGVkXykgKyAiLnR0eXBlc1xuIjsKLSAgfQotICBpZiAoaW5jbHVkZXMuc2l6ZSgpID4gMCkgewotICAgIHJlc3VsdCArPSAiXG4iOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhbGwgdGhlIGltcG9ydHMgbmVjZXNzYXJ5IHRvIHVzZSB0aGUgYWNjZWxlcmF0ZWQgVEJpbmFyeVByb3RvY29sCi0gKi8KLXN0cmluZyB0X3B5X2dlbmVyYXRvcjo6cmVuZGVyX2Zhc3RiaW5hcnlfaW5jbHVkZXMoKSB7Ci0gIHN0cmluZyBoZHIgPSAiIjsKLSAgaWYgKGdlbl9keW5hbWljXykgewotICAgIGhkciArPSBzdGQ6OnN0cmluZyhpbXBvcnRfZHluYmFzZV8pOwotICB9IGVsc2UgewotICAgIGhkciArPQotICAgICAgImZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydFxuIgotICAgICAgImZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wsIFRQcm90b2NvbFxuIgotICAgICAgInRyeTpcbiIKLSAgICAgICIgIGZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBmYXN0YmluYXJ5XG4iCi0gICAgICAiZXhjZXB0OlxuIgotICAgICAgIiAgZmFzdGJpbmFyeSA9IE5vbmVcbiI7Ci0gIH0KLSAgcmV0dXJuIGhkcjsKLX0KLQotLyoqCi0gKiBBdXRvZ2VuJ2QgY29tbWVudAotICovCi1zdHJpbmcgdF9weV9nZW5lcmF0b3I6OnB5X2F1dG9nZW5fY29tbWVudCgpIHsKLSAgcmV0dXJuCi0gICAgc3RkOjpzdHJpbmcoIiNcbiIpICsKLSAgICAiIyBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoIiArIFRIUklGVF9WRVJTSU9OICsgIilcbiIgKwotICAgICIjXG4iICsKLSAgICAiIyBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HXG4iICsKLSAgICAiI1xuIiArCi0gICAgIiMgIG9wdGlvbnMgc3RyaW5nOiAiICsgY29weV9vcHRpb25zXyAgKyAiXG4iICsKLSAgICAiI1xuIjsKLX0KLQotLyoqCi0gKiBQcmludHMgc3RhbmRhcmQgdGhyaWZ0IGltcG9ydHMKLSAqLwotc3RyaW5nIHRfcHlfZ2VuZXJhdG9yOjpweV9pbXBvcnRzKCkgewotICByZXR1cm4KLSAgICBzdHJpbmcoImZyb20gdGhyaWZ0LlRocmlmdCBpbXBvcnQgVFR5cGUsIFRNZXNzYWdlVHlwZSwgVEV4Y2VwdGlvbiwgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIik7Ci19Ci0KLS8qKgotICogQ2xvc2VzIHRoZSB0eXBlIGZpbGVzCi0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKLSAgLy8gQ2xvc2UgdHlwZXMgZmlsZQotICBmX3R5cGVzXy5jbG9zZSgpOwotICBmX2NvbnN0c18uY2xvc2UoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0eXBlZGVmLiBUaGlzIGlzIG5vdCBkb25lIGluIFB5dGhvbiwgdHlwZXMgYXJlIGFsbCBpbXBsaWNpdC4KLSAqCi0gKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgotICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKLSAgKHZvaWQpIHR0eXBlZGVmOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBjb2RlIGZvciBhbiBlbnVtZXJhdGVkIHR5cGUuIERvbmUgdXNpbmcgYSBjbGFzcyB0byBzY29wZQotICogdGhlIHZhbHVlcy4KLSAqCi0gKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCi0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgewotICBzdGQ6Om9zdHJpbmdzdHJlYW0gdG9fc3RyaW5nX21hcHBpbmcsIGZyb21fc3RyaW5nX21hcHBpbmc7Ci0KLSAgZl90eXBlc18gPDwKLSAgICAiY2xhc3MgIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PAotICAgIChnZW5fbmV3c3R5bGVfID8gIihvYmplY3QpIiA6ICIiKSA8PAotICAgIChnZW5fZHluYW1pY18gPyAiKCIgKyBnZW5fZHluYmFzZWNsYXNzXyArICIpIiA6ICIiKSA8PAotICAgICI6IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZ2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyhmX3R5cGVzXywgdGVudW0pOwotCi0gIHRvX3N0cmluZ19tYXBwaW5nIDw8IGluZGVudCgpIDw8ICJfVkFMVUVTX1RPX05BTUVTID0geyIgPDwgZW5kbDsKLSAgZnJvbV9zdHJpbmdfbWFwcGluZyA8PCBpbmRlbnQoKSA8PCAiX05BTUVTX1RPX1ZBTFVFUyA9IHsiIDw8IGVuZGw7Ci0KLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7Ci0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOwotICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgewotICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0gICAgaW5kZW50KGZfdHlwZXNfKSA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgdmFsdWUgPDwgZW5kbDsKLQotICAgIC8vIERpY3Rpb25hcmllcyB0by9mcm9tIHN0cmluZyBuYW1lcyBvZiBlbnVtcwotICAgIHRvX3N0cmluZ19tYXBwaW5nIDw8Ci0gICAgICBpbmRlbnQoKSA8PCBpbmRlbnQoKSA8PCB2YWx1ZSA8PCAiOiBcIiIgPDwKLSAgICAgIGVzY2FwZV9zdHJpbmcoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiXCIsIiA8PCBlbmRsOwotICAgIGZyb21fc3RyaW5nX21hcHBpbmcgPDwKLSAgICAgIGluZGVudCgpIDw8IGluZGVudCgpIDw8ICciJyA8PCBlc2NhcGVfc3RyaW5nKCgqY19pdGVyKS0+Z2V0X25hbWUoKSkgPDwKLSAgICAgICJcIjogIiA8PCB2YWx1ZSA8PCAnLCcgPDwgZW5kbDsKLSAgfQotICB0b19zdHJpbmdfbWFwcGluZyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgZnJvbV9zdHJpbmdfbWFwcGluZyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBmX3R5cGVzXyA8PCBlbmRsOwotICBmX3R5cGVzXyA8PCB0b19zdHJpbmdfbWFwcGluZy5zdHIoKSA8PCBlbmRsIDw8IGZyb21fc3RyaW5nX21hcHBpbmcuc3RyKCkgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZSBhIGNvbnN0YW50IHZhbHVlCi0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCkgewotICB0X3R5cGUqIHR5cGUgPSB0Y29uc3QtPmdldF90eXBlKCk7Ci0gIHN0cmluZyBuYW1lID0gdGNvbnN0LT5nZXRfbmFtZSgpOwotICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSA9IHRjb25zdC0+Z2V0X3ZhbHVlKCk7Ci0KLSAgaW5kZW50KGZfY29uc3RzXykgPDwgbmFtZSA8PCAiID0gIiA8PCByZW5kZXJfY29uc3RfdmFsdWUodHlwZSwgdmFsdWUpOwotICBmX2NvbnN0c18gPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBQcmludHMgdGhlIHZhbHVlIG9mIGEgY29uc3RhbnQgd2l0aCB0aGUgZ2l2ZW4gdHlwZS4gTm90ZSB0aGF0IHR5cGUgY2hlY2tpbmcKLSAqIGlzIE5PVCBwZXJmb3JtZWQgaW4gdGhpcyBmdW5jdGlvbiBhcyBpdCBpcyBhbHdheXMgcnVuIGJlZm9yZWhhbmQgdXNpbmcgdGhlCi0gKiB2YWxpZGF0ZV90eXBlcyBtZXRob2QgaW4gbWFpbi5jYwotICovCi1zdHJpbmcgdF9weV9nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICBvdXQgPDwgJyInIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgb3V0IDw8ICh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDAgPyAiVHJ1ZSIgOiAiRmFsc2UiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKLSAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIGluZGVudChvdXQpIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBvdXQgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIoKip7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOwotICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKLSAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7Ci0gICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7Ci0gICAgICB9Ci0gICAgICBvdXQgPDwgaW5kZW50KCk7Ci0gICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGdfdHlwZV9zdHJpbmcsIHZfaXRlci0+Zmlyc3QpOwotICAgICAgb3V0IDw8ICIgOiAiOwotICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgICBvdXQgPDwgIiwiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0pIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLSAgICBvdXQgPDwgInsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgb3V0IDw8IGluZGVudCgpOwotICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShrdHlwZSwgdl9pdGVyLT5maXJzdCk7Ci0gICAgICBvdXQgPDwgIiA6ICI7Ci0gICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHZ0eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgICBvdXQgPDwgIiwiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkgewotICAgIHRfdHlwZSogZXR5cGU7Ci0gICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB9IGVsc2UgewotICAgICAgZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIH0KLSAgICBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgIG91dCA8PCAic2V0KCI7Ci0gICAgfQotICAgIG91dCA8PCAiWyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKLSAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIG91dCA8PCBpbmRlbnQoKTsKLSAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZXR5cGUsICp2X2l0ZXIpOwotICAgICAgb3V0IDw8ICIsIiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJdIjsKLSAgICBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgIG91dCA8PCAiKSI7Ci0gICAgfQotICB9IGVsc2UgewotICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgQ09OU1RBTlQgRk9SIFRZUEU6ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgcmV0dXJuIG91dC5zdHIoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBweXRob24gc3RydWN0Ci0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICBnZW5lcmF0ZV9weV9zdHJ1Y3QodHN0cnVjdCwgZmFsc2UpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBleGNlcHRpb24uIEJhc2ljYWxseSB0aGUgc2FtZQotICogYXMgYSBzdHJ1Y3QgYnV0IGV4dGVuZHMgdGhlIEV4Y2VwdGlvbiBjbGFzcy4KLSAqCi0gKiBAcGFyYW0gdHhjZXB0aW9uIFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7Ci0gIGdlbmVyYXRlX3B5X3N0cnVjdCh0eGNlcHRpb24sIHRydWUpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHB5dGhvbiBzdHJ1Y3QKLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHlfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7Ci0gIGdlbmVyYXRlX3B5X3N0cnVjdF9kZWZpbml0aW9uKGZfdHlwZXNfLCB0c3RydWN0LCBpc19leGNlcHRpb24pOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3B5X3N0cnVjdF9kZWZpbml0aW9uKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQpIHsKLSAgKHZvaWQpIGlzX3Jlc3VsdDsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIHNvcnRlZF9tZW1iZXJzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLQotICBvdXQgPDwgc3RkOjplbmRsIDw8Ci0gICAgImNsYXNzICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKTsKLSAgaWYgKGlzX2V4Y2VwdGlvbikgewotICAgIGlmIChnZW5fZHluYW1pY18pIHsKLSAgICAgIG91dCA8PCAiKCIgPDwgZ2VuX2R5bmJhc2VjbGFzc19leGNfIDw8ICIpIjsKLSAgICB9IGVsc2UgewotICAgICAgb3V0IDw8ICIoVEV4Y2VwdGlvbikiOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBpZiAoZ2VuX25ld3N0eWxlXykgewotICAgICAgb3V0IDw8ICIob2JqZWN0KSI7Ci0gICAgfSBlbHNlIGlmIChnZW5fZHluYW1pY18pIHsKLSAgICAgIG91dCA8PCAiKCIgPDwgZ2VuX2R5bmJhc2VjbGFzc18gPDwgIikiOwotICAgIH0KLSAgfQotICBvdXQgPDwgIjoiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nKG91dCwgdHN0cnVjdCk7Ci0KLSAgb3V0IDw8IGVuZGw7Ci0KLSAgLyoKLSAgICAgSGVyZSB3ZSBnZW5lcmF0ZSB0aGUgc3RydWN0dXJlIHNwZWNpZmljYXRpb24gZm9yIHRoZSBmYXN0YmluYXJ5IGNvZGVjLgotICAgICBUaGVzZSBzcGVjaWZpY2F0aW9ucyBoYXZlIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlOgotICAgICB0aHJpZnRfc3BlYyAtPiB0dXBsZSBvZiBpdGVtX3NwZWMKLSAgICAgaXRlbV9zcGVjIC0+IE5vbmUgfCAodGFnLCB0eXBlX2VudW0sIG5hbWUsIHNwZWNfYXJncywgZGVmYXVsdCkKLSAgICAgdGFnIC0+IGludGVnZXIKLSAgICAgdHlwZV9lbnVtIC0+IFRUeXBlLkkzMiB8IFRUeXBlLlNUUklORyB8IFRUeXBlLlNUUlVDVCB8IC4uLgotICAgICBuYW1lIC0+IHN0cmluZ19saXRlcmFsCi0gICAgIGRlZmF1bHQgLT4gTm9uZSAgIyBIYW5kbGVkIGJ5IF9faW5pdF9fCi0gICAgIHNwZWNfYXJncyAtPiBOb25lICAjIEZvciBzaW1wbGUgdHlwZXMKLSAgICAgICAgICAgICAgICB8ICh0eXBlX2VudW0sIHNwZWNfYXJncykgICMgVmFsdWUgdHlwZSBmb3IgbGlzdC9zZXQKLSAgICAgICAgICAgICAgICB8ICh0eXBlX2VudW0sIHNwZWNfYXJncywgdHlwZV9lbnVtLCBzcGVjX2FyZ3MpCi0gICAgICAgICAgICAgICAgICAjIEtleSBhbmQgdmFsdWUgZm9yIG1hcAotICAgICAgICAgICAgICAgIHwgKGNsYXNzX25hbWUsIHNwZWNfYXJnc19wdHIpICMgRm9yIHN0cnVjdC9leGNlcHRpb24KLSAgICAgY2xhc3NfbmFtZSAtPiBpZGVudGlmaWVyICAjIEJhc2ljYWxseSBhIHBvaW50ZXIgdG8gdGhlIGNsYXNzCi0gICAgIHNwZWNfYXJnc19wdHIgLT4gZXhwcmVzc2lvbiAgIyBqdXN0IGNsYXNzX25hbWUuc3BlY19hcmdzCi0KLSAgICAgVE9ETyhkcmVpc3MpOiBDb25zaWRlciBtYWtpbmcgdGhpcyB3b3JrIGZvciBzdHJ1Y3RzIHdpdGggbmVnYXRpdmUgdGFncy4KLSAgKi8KLQotICBpZiAoZ2VuX3Nsb3RzXykgewotICAgIGluZGVudChvdXQpIDw8ICJfX3Nsb3RzX18gPSBbICIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBmb3IgKG1faXRlciA9IHNvcnRlZF9tZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBzb3J0ZWRfbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICAiJyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpICA8PCAiJywiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIiBdIiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgfQotCi0gIC8vIFRPRE8oZHJlaXNzKTogTG9vayBpbnRvIGdlbmVyYXRpbmcgYW4gZW1wdHkgdHVwbGUgaW5zdGVhZCBvZiBOb25lCi0gIC8vIGZvciBzdHJ1Y3R1cmVzIHdpdGggbm8gbWVtYmVycy4KLSAgLy8gVE9ETyhkcmVpc3MpOiBUZXN0IGVuY29kaW5nIG9mIHN0cnVjdHMgd2hlcmUgc29tZSBpbm5lciBzdHJ1Y3RzCi0gIC8vIGRvbid0IGhhdmUgdGhyaWZ0X3NwZWMuCi0gIGlmIChzb3J0ZWRfbWVtYmVycy5lbXB0eSgpIHx8IChzb3J0ZWRfbWVtYmVyc1swXS0+Z2V0X2tleSgpID49IDApKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgInRocmlmdF9zcGVjID0gKCIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIGludCBzb3J0ZWRfa2V5c19wb3MgPSAwOwotICAgIGZvciAobV9pdGVyID0gc29ydGVkX21lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IHNvcnRlZF9tZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotCi0gICAgICBmb3IgKDsgc29ydGVkX2tleXNfcG9zICE9ICgqbV9pdGVyKS0+Z2V0X2tleSgpOyBzb3J0ZWRfa2V5c19wb3MrKykgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAiTm9uZSwgIyAiIDw8IHNvcnRlZF9rZXlzX3BvcyA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICBpbmRlbnQob3V0KSA8PCAiKCIgPDwgKCptX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIiwgIgotICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiwgIgotICAgICAgICAgICAgPDwgIiciIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJyIgPDwgIiwgIgotICAgICAgICAgICAgPDwgdHlwZV90b19zcGVjX2FyZ3MoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiLCAiCi0gICAgICAgICAgICA8PCByZW5kZXJfZmllbGRfZGVmYXVsdF92YWx1ZSgqbV9pdGVyKSA8PCAiLCAiCi0gICAgICAgICAgICA8PCAiKSwiCi0gICAgICAgICAgICA8PCAiICMgIiA8PCBzb3J0ZWRfa2V5c19wb3MKLSAgICAgICAgICAgIDw8IGVuZGw7Ci0KLSAgICAgIHNvcnRlZF9rZXlzX3BvcyArKzsKLSAgICB9Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICIpIiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgaW5kZW50KG91dCkgPDwgInRocmlmdF9zcGVjID0gTm9uZSIgPDwgZW5kbDsKLSAgfQotCi0KLSAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgewotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgImRlZiBfX2luaXRfXyhzZWxmLCI7Ci0KLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICAvLyBUaGlzIGZpbGxzIGluIGRlZmF1bHQgdmFsdWVzLCBhcyBvcHBvc2VkIHRvIG51bGxzCi0gICAgICBvdXQgPDwgIiAiIDw8IGRlY2xhcmVfYXJndW1lbnQoKm1faXRlcikgPDwgIiwiOwotICAgIH0KLQotICAgIG91dCA8PCAiKToiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIC8vIEluaXRpYWxpemUgZmllbGRzCi0gICAgICB0X3R5cGUqIHR5cGUgPSAoKm1faXRlciktPmdldF90eXBlKCk7Ci0gICAgICBpZiAoIXR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmICF0eXBlLT5pc19lbnVtKCkgJiYgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICAgImlmICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgaXMgIiA8PCAic2VsZi50aHJpZnRfc3BlY1siIDw8Ci0gICAgICAgICAgICAoKm1faXRlciktPmdldF9rZXkoKSA8PCAiXVs0XToiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICIgICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8Ci0gICAgICAgICAgcmVuZGVyX2ZpZWxkX2RlZmF1bHRfdmFsdWUoKm1faXRlcikgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICJzZWxmLiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCBlbmRsOwotICAgIH0KLQotICAgIGluZGVudF9kb3duKCk7Ci0KLSAgICBvdXQgPDwgZW5kbDsKLSAgfQotCi0gIGlmICghZ2VuX2R5bmFtaWNfKSB7Ci0gICAgZ2VuZXJhdGVfcHlfc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QpOwotICAgIGdlbmVyYXRlX3B5X3N0cnVjdF93cml0ZXIob3V0LCB0c3RydWN0KTsKLSAgfQotCi0gIC8vIEZvciBleGNlcHRpb25zIG9ubHksIGdlbmVyYXRlIGEgX19zdHJfXyBtZXRob2QuIFRoaXMgaXMKLSAgLy8gYmVjYXVzZSB3aGVuIHJhaXNlZCBleGNlcHRpb25zIGFyZSBwcmludGVkIHRvIHRoZSBjb25zb2xlLCBfX3JlcHJfXwotICAvLyBpc24ndCB1c2VkLiBTZWUgcHl0aG9uIGJ1ZyAjNTg4MgotICBpZiAoaXNfZXhjZXB0aW9uKSB7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiZGVmIF9fc3RyX18oc2VsZik6IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gcmVwcihzZWxmKSIgPDwgZW5kbCA8PAotICAgICAgZW5kbDsKLSAgfQotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAiZGVmIF9faGFzaF9fKHNlbGYpOiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ2YWx1ZSA9IDE3IiA8PCBlbmRsOyAgLy8gUFlUSE9OSEFTSFNFRUQgd291bGQgYmUgYmV0dGVyLCBidXQgcmVxdWlyZXMgUHl0aG9uIDMuMi4zCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAidmFsdWUgPSAodmFsdWUgKiAzMSkgXiBoYXNoKHNlbGYuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgKyAiKSIgPDwgZW5kbDsKLSAgfQotICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHZhbHVlIiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwgZW5kbDsKLQotCi0gIGlmICghZ2VuX3Nsb3RzXykgewotICAgIC8vIFByaW50aW5nIHV0aWxpdGllcyBzbyB0aGF0IG9uIHRoZSBjb21tYW5kIGxpbmUgdGhyaWZ0Ci0gICAgLy8gc3RydWN0cyBsb29rIHByZXR0eSBsaWtlIGRpY3Rpb25hcmllcwotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgImRlZiBfX3JlcHJfXyhzZWxmKToiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIEwgPSBbJyVzPSVyJyAlIChrZXksIHZhbHVlKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgICBmb3Iga2V5LCB2YWx1ZSBpbiBzZWxmLl9fZGljdF9fLml0ZXJpdGVtcygpXSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuICclcyglcyknICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCAnLCAnLmpvaW4oTCkpIiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsOwotCi0gICAgLy8gRXF1YWxpdHkgYW5kIGluZXF1YWxpdHkgbWV0aG9kcyB0aGF0IGNvbXBhcmUgYnkgdmFsdWUKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJkZWYgX19lcV9fKHNlbGYsIG90aGVyKToiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicmV0dXJuIGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKSBhbmQgIgotICAgICAgICAgICAgICAgICAgInNlbGYuX19kaWN0X18gPT0gb3RoZXIuX19kaWN0X18iIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBvdXQgPDwgZW5kbDsKLQotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgImRlZiBfX25lX18oc2VsZiwgb3RoZXIpOiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgInJldHVybiBub3QgKHNlbGYgPT0gb3RoZXIpIiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0gZWxzZSBpZiAoIWdlbl9keW5hbWljXykgewotICAgIC8vIG5vIGJhc2UgY2xhc3MgYXZhaWxhYmxlIHRvIGltcGxlbWVudCBfX2VxX18gYW5kIF9fcmVwcl9fIGFuZCBfX25lX18gZm9yIHVzCi0gICAgLy8gc28gd2UgbXVzdCBwcm92aWRlIG9uZSB0aGF0IHVzZXMgX19zbG90c19fCi0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiZGVmIF9fcmVwcl9fKHNlbGYpOiIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgTCA9IFsnJXM9JXInICUgKGtleSwgZ2V0YXR0cihzZWxmLCBrZXkpKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgICBmb3Iga2V5IGluIHNlbGYuX19zbG90c19fXSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuICclcyglcyknICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCAnLCAnLmpvaW4oTCkpIiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsOwotCi0gICAgLy8gRXF1YWxpdHkgbWV0aG9kIHRoYXQgY29tcGFyZXMgZWFjaCBhdHRyaWJ1dGUgYnkgdmFsdWUgYW5kIHR5cGUsIHdhbGtpbmcgX19zbG90c19fCi0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pOiIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgICByZXR1cm4gRmFsc2UiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIGZvciBhdHRyIGluIHNlbGYuX19zbG90c19fOiIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgICBteV92YWwgPSBnZXRhdHRyKHNlbGYsIGF0dHIpIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICAgIG90aGVyX3ZhbCA9IGdldGF0dHIob3RoZXIsIGF0dHIpIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICAgIGlmIG15X3ZhbCAhPSBvdGhlcl92YWw6IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICAgICAgcmV0dXJuIEZhbHNlIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gVHJ1ZSIgPDwgZW5kbCA8PAotICAgICAgZW5kbDsKLQotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgImRlZiBfX25lX18oc2VsZiwgb3RoZXIpOiIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIG5vdCAoc2VsZiA9PSBvdGhlcikiIDw8IGVuZGwgPDwKLSAgICAgIGVuZGw7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgdGhlIHJlYWQgbWV0aG9kIGZvciBhIHN0cnVjdAotICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9weV9zdHJ1Y3RfcmVhZGVyKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAiZGVmIHJlYWQoc2VsZiwgaXByb3QpOiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAiaWYgaXByb3QuX19jbGFzc19fID09IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCAiCi0gICAgImFuZCBpc2luc3RhbmNlKGlwcm90LnRyYW5zLCBUVHJhbnNwb3J0LkNSZWFkYWJsZVRyYW5zcG9ydCkgIgotICAgICJhbmQgc2VsZi50aHJpZnRfc3BlYyBpcyBub3QgTm9uZSAiCi0gICAgImFuZCBmYXN0YmluYXJ5IGlzIG5vdCBOb25lOiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAiZmFzdGJpbmFyeS5kZWNvZGVfYmluYXJ5KHNlbGYsIGlwcm90LnRyYW5zLCAoc2VsZi5fX2NsYXNzX18sIHNlbGYudGhyaWZ0X3NwZWMpKSIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwKLSAgICAicmV0dXJuIiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgImlwcm90LnJlYWRTdHJ1Y3RCZWdpbigpIiA8PCBlbmRsOwotCi0gIC8vIExvb3Agb3ZlciByZWFkaW5nIGluIGZpZWxkcwotICBpbmRlbnQob3V0KSA8PAotICAgICJ3aGlsZSBUcnVlOiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIC8vIFJlYWQgYmVnaW5uaW5nIGZpZWxkIG1hcmtlcgotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiKGZuYW1lLCBmdHlwZSwgZmlkKSA9IGlwcm90LnJlYWRGaWVsZEJlZ2luKCkiIDw8IGVuZGw7Ci0KLSAgICAvLyBDaGVjayBmb3IgZmllbGQgU1RPUCBtYXJrZXIgYW5kIGJyZWFrCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJpZiBmdHlwZSA9PSBUVHlwZS5TVE9QOiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImJyZWFrIiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0KLSAgICAvLyBTd2l0Y2ggc3RhdGVtZW50IG9uIHRoZSBmaWVsZCB3ZSBhcmUgcmVhZGluZwotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotCi0gICAgLy8gR2VuZXJhdGUgZGVzZXJpYWxpemF0aW9uIGNvZGUgZm9yIGtub3duIGNhc2VzCi0gICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgIGlmIChmaXJzdCkgewotICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgIjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJlbGlmICI7Ci0gICAgICB9Ci0gICAgICBvdXQgPDwgImZpZCA9PSAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICI6IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiaWYgZnR5cGUgPT0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiOiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAic2VsZi4iKTsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImVsc2U6IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIGlwcm90LnNraXAoZnR5cGUpIiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICB9Ci0KLSAgICAvLyBJbiB0aGUgZGVmYXVsdCBjYXNlIHdlIHNraXAgdGhlIGZpZWxkCi0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAgImVsc2U6IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAgIiAgaXByb3Quc2tpcChmdHlwZSkiIDw8IGVuZGw7Ci0KLSAgICAvLyBSZWFkIGZpZWxkIGVuZCBtYXJrZXIKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImlwcm90LnJlYWRGaWVsZEVuZCgpIiA8PCBlbmRsOwotCi0gICAgaW5kZW50X2Rvd24oKTsKLQotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiaXByb3QucmVhZFN0cnVjdEVuZCgpIiA8PCBlbmRsOwotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgb3V0IDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3B5X3N0cnVjdF93cml0ZXIob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGluZGVudChvdXQpIDw8ICJkZWYgd3JpdGUoc2VsZiwgb3Byb3QpOiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAiaWYgb3Byb3QuX19jbGFzc19fID09IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCAiCi0gICAgImFuZCBzZWxmLnRocmlmdF9zcGVjIGlzIG5vdCBOb25lICIKLSAgICAiYW5kIGZhc3RiaW5hcnkgaXMgbm90IE5vbmU6IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICJvcHJvdC50cmFucy53cml0ZShmYXN0YmluYXJ5LmVuY29kZV9iaW5hcnkoc2VsZiwgKHNlbGYuX19jbGFzc19fLCBzZWxmLnRocmlmdF9zcGVjKSkpIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PAotICAgICJyZXR1cm4iIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAib3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbignIiA8PCBuYW1lIDw8ICInKSIgPDwgZW5kbDsKLQotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIC8vIFdyaXRlIGZpZWxkIGhlYWRlcgotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiaWYgc2VsZi4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGlzIG5vdCBOb25lOiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm9wcm90LndyaXRlRmllbGRCZWdpbigiIDw8Ci0gICAgICAiJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInLCAiIDw8Ci0gICAgICB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiKSIgPDwgZW5kbDsKLQotICAgIC8vIFdyaXRlIGZpZWxkIGNvbnRlbnRzCi0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInNlbGYuIik7Ci0KLSAgICAvLyBXcml0ZSBmaWVsZCBjbG9zZXIKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm9wcm90LndyaXRlRmllbGRFbmQoKSIgPDwgZW5kbDsKLQotICAgIGluZGVudF9kb3duKCk7Ci0gIH0KLQotICAvLyBXcml0ZSB0aGUgc3RydWN0IG1hcAotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVGaWVsZFN0b3AoKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdC53cml0ZVN0cnVjdEVuZCgpIiA8PCBlbmRsOwotCi0gIG91dCA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGdlbmVyYXRlX3B5X3N0cnVjdF9yZXF1aXJlZF92YWxpZGF0b3Iob3V0LCB0c3RydWN0KTsKLSAgb3V0IDw8Ci0gICAgZW5kbDsKLX0KLQotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHlfc3RydWN0X3JlcXVpcmVkX3ZhbGlkYXRvcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgewotICBpbmRlbnQob3V0KSA8PCAiZGVmIHZhbGlkYXRlKHNlbGYpOiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLQotICBpZiAoZmllbGRzLnNpemUoKSA+IDApIHsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgdF9maWVsZCogZmllbGQgPSAoKmZfaXRlcik7Ci0gICAgICBpZiAoZmllbGQtPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJpZiBzZWxmLiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiBpcyBOb25lOiIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgIiAgcmFpc2UgVFByb3RvY29sLlRQcm90b2NvbEV4Y2VwdGlvbihtZXNzYWdlPSdSZXF1aXJlZCBmaWVsZCAiIDw8Ci0gICAgICAgICAgZmllbGQtPmdldF9uYW1lKCkgPDwgIiBpcyB1bnNldCEnKSIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIiA8PCBlbmRsIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgdGhyaWZ0IHNlcnZpY2UuCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBmX3NlcnZpY2VfbmFtZSA9IHBhY2thZ2VfZGlyXysiLyIrc2VydmljZV9uYW1lXysiLnB5IjsKLSAgZl9zZXJ2aWNlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICBweV9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsIDw8Ci0gICAgcHlfaW1wb3J0cygpIDw8IGVuZGw7Ci0KLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAiaW1wb3J0ICIgPDwgZ2V0X3JlYWxfcHlfbW9kdWxlKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfcHJvZ3JhbSgpLCBnZW5fdHdpc3RlZF8pIDw8Ci0gICAgICAiLiIgPDwgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkgPDwgZW5kbDsKLSAgfQotCi0gIGZfc2VydmljZV8gPDwKLSAgICAiZnJvbSB0dHlwZXMgaW1wb3J0ICoiIDw8IGVuZGwgPDwKLSAgICAiZnJvbSB0aHJpZnQuVGhyaWZ0IGltcG9ydCBUUHJvY2Vzc29yIiA8PCBlbmRsIDw8Ci0gICAgcmVuZGVyX2Zhc3RiaW5hcnlfaW5jbHVkZXMoKSA8PCBlbmRsOwotCi0gIGlmIChnZW5fdHdpc3RlZF8pIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAiZnJvbSB6b3BlLmludGVyZmFjZSBpbXBvcnQgSW50ZXJmYWNlLCBpbXBsZW1lbnRzIiA8PCBlbmRsIDw8Ci0gICAgICAiZnJvbSB0d2lzdGVkLmludGVybmV0IGltcG9ydCBkZWZlciIgPDwgZW5kbCA8PAotICAgICAgImZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFR3aXN0ZWQiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAoZ2VuX3Rvcm5hZG9fKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCAiZnJvbSB0b3JuYWRvIGltcG9ydCBnZW4iIDw8IGVuZGw7Ci0gICAgZl9zZXJ2aWNlXyA8PCAiZnJvbSB0b3JuYWRvIGltcG9ydCBjb25jdXJyZW50IiA8PCBlbmRsOwotICAgIGZfc2VydmljZV8gPDwgImZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydCIgPDwgZW5kbDsKLSAgfQotCi0gIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgdGhyZWUgbWFpbiBwYXJ0cyBvZiB0aGUgc2VydmljZQotICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX3JlbW90ZSh0c2VydmljZSk7Ci0KLSAgLy8gQ2xvc2Ugc2VydmljZSBmaWxlCi0gIGZfc2VydmljZV8uY2xvc2UoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgaGVscGVyIGZ1bmN0aW9ucyBmb3IgYSBzZXJ2aWNlLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgotICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSkgewotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgIiMgSEVMUEVSIEZVTkNUSU9OUyBBTkQgU1RSVUNUVVJFUyIgPDwgZW5kbDsKLQotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLSAgICBnZW5lcmF0ZV9weV9zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCB0cywgZmFsc2UpOwotICAgIGdlbmVyYXRlX3B5X2Z1bmN0aW9uX2hlbHBlcnMoKmZfaXRlcik7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgYW5kIGhlbHBlcnMgZm9yIGEgZnVuY3Rpb24uCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24KLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHlfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOwotICAgIHRfZmllbGQgc3VjY2Vzcyh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksICJzdWNjZXNzIiwgMCk7Ci0gICAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7Ci0gICAgfQotCi0gICAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICByZXN1bHQuYXBwZW5kKCpmX2l0ZXIpOwotICAgIH0KLSAgICBnZW5lcmF0ZV9weV9zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCAmcmVzdWx0LCBmYWxzZSwgdHJ1ZSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGludGVyZmFjZSBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgotICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIHN0cmluZyBleHRlbmRzX2lmID0gIiI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7Ci0gICAgZXh0ZW5kc19pZiA9ICIoIiArIGV4dGVuZHMgKyAiLklmYWNlKSI7Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKGdlbl90d2lzdGVkXykgewotICAgICAgZXh0ZW5kc19pZiA9ICIoSW50ZXJmYWNlKSI7Ci0gICAgfSBlbHNlIGlmIChnZW5fbmV3c3R5bGVfIHx8IGdlbl9keW5hbWljXyB8fCBnZW5fdG9ybmFkb18pIHsKLSAgICAgIGV4dGVuZHNfaWYgPSAiKG9iamVjdCkiOwotICAgIH0KLSAgfQotCi0gIGZfc2VydmljZV8gPDwKLSAgICAiY2xhc3MgSWZhY2UiIDw8IGV4dGVuZHNfaWYgPDwgIjoiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nKGZfc2VydmljZV8sIHRzZXJ2aWNlKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICBpZiAoZnVuY3Rpb25zLmVtcHR5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicGFzcyIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0gICAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImRlZiAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCB0cnVlKSA8PCAiOiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgZ2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyhmX3NlcnZpY2VfLCAoKmZfaXRlcikpOwotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAicGFzcyIgPDwgZW5kbCA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICB9Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8Ci0gICAgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGNsaWVudCBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCi0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfY2xpZW50ID0gIiI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7Ci0gICAgaWYgKGdlbl90d2lzdGVkXykgewotICAgICAgZXh0ZW5kc19jbGllbnQgPSAiKCIgKyBleHRlbmRzICsgIi5DbGllbnQpIjsKLSAgICB9IGVsc2UgewotICAgICAgZXh0ZW5kc19jbGllbnQgPSBleHRlbmRzICsgIi5DbGllbnQsICI7Ci0gICAgfQotICB9IGVsc2UgewotICAgIGlmIChnZW5fdHdpc3RlZF8gJiYgKGdlbl9uZXdzdHlsZV8gfHwgZ2VuX2R5bmFtaWNfKSkgewotICAgICAgZXh0ZW5kc19jbGllbnQgPSAiKG9iamVjdCkiOwotICAgIH0KLSAgfQotCi0gIGlmIChnZW5fdHdpc3RlZF8pIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAiY2xhc3MgQ2xpZW50IiA8PCBleHRlbmRzX2NsaWVudCA8PCAiOiIgPDwgZW5kbCA8PAotICAgICAgIiAgaW1wbGVtZW50cyhJZmFjZSkiIDw8IGVuZGwgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAiY2xhc3MgQ2xpZW50KCIgPDwgZXh0ZW5kc19jbGllbnQgPDwgIklmYWNlKToiIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50X3VwKCk7Ci0gIGdlbmVyYXRlX3B5dGhvbl9kb2NzdHJpbmcoZl9zZXJ2aWNlXywgdHNlcnZpY2UpOwotCi0gIC8vIENvbnN0cnVjdG9yIGZ1bmN0aW9uCi0gIGlmIChnZW5fdHdpc3RlZF8pIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiZGVmIF9faW5pdF9fKHNlbGYsIHRyYW5zcG9ydCwgb3Byb3RfZmFjdG9yeSk6IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKGdlbl90b3JuYWRvXykgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJkZWYgX19pbml0X18oc2VsZiwgdHJhbnNwb3J0LCBpcHJvdF9mYWN0b3J5LCBvcHJvdF9mYWN0b3J5PU5vbmUpOiIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiZGVmIF9faW5pdF9fKHNlbGYsIGlwcm90LCBvcHJvdD1Ob25lKToiIDw8IGVuZGw7Ci0gIH0KLSAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgewotICAgIGlmIChnZW5fdHdpc3RlZF8pIHsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgc2VsZi5fdHJhbnNwb3J0ID0gdHJhbnNwb3J0IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIHNlbGYuX29wcm90X2ZhY3RvcnkgPSBvcHJvdF9mYWN0b3J5IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIHNlbGYuX3NlcWlkID0gMCIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBzZWxmLl9yZXFzID0ge30iIDw8IGVuZGwgPDwKLSAgICAgICAgZW5kbDsKLSAgICB9IGVsc2UgaWYgKGdlbl90b3JuYWRvXykgewotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBzZWxmLl90cmFuc3BvcnQgPSB0cmFuc3BvcnQiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgc2VsZi5faXByb3RfZmFjdG9yeSA9IGlwcm90X2ZhY3RvcnkiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgc2VsZi5fb3Byb3RfZmFjdG9yeSA9IChvcHJvdF9mYWN0b3J5IGlmIG9wcm90X2ZhY3RvcnkgaXMgbm90IE5vbmUiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlwcm90X2ZhY3RvcnkpIiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIHNlbGYuX3NlcWlkID0gMCIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBzZWxmLl9yZXFzID0ge30iIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgc2VsZi5fdHJhbnNwb3J0LmlvX2xvb3Auc3Bhd25fY2FsbGJhY2soc2VsZi5fc3RhcnRfcmVjZWl2aW5nKSIgPDwgZW5kbCA8PAotICAgICAgICBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIHNlbGYuX2lwcm90ID0gc2VsZi5fb3Byb3QgPSBpcHJvdCIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBpZiBvcHJvdCBpcyBub3QgTm9uZToiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgICBzZWxmLl9vcHJvdCA9IG9wcm90IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIHNlbGYuX3NlcWlkID0gMCIgPDwgZW5kbCA8PAotICAgICAgICBlbmRsOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBpZiAoZ2VuX3R3aXN0ZWRfKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgICIgPDwgZXh0ZW5kcyA8PCAiLkNsaWVudC5fX2luaXRfXyhzZWxmLCB0cmFuc3BvcnQsIG9wcm90X2ZhY3RvcnkpIiA8PCBlbmRsIDw8Ci0gICAgICAgIGVuZGw7Ci0gICAgfSBlbHNlIGlmIChnZW5fdG9ybmFkb18pIHsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgIiA8PCBleHRlbmRzIDw8ICIuQ2xpZW50Ll9faW5pdF9fKHNlbGYsIHRyYW5zcG9ydCwgaXByb3RfZmFjdG9yeSwgb3Byb3RfZmFjdG9yeSkiIDw8IGVuZGwgPDwKLSAgICAgICAgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICAiIDw8IGV4dGVuZHMgPDwgIi5DbGllbnQuX19pbml0X18oc2VsZiwgaXByb3QsIG9wcm90KSIgPDwgZW5kbCA8PAotICAgICAgICBlbmRsOwotICAgIH0KLSAgfQotCi0gIGlmIChnZW5fdG9ybmFkb18gJiYgZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgIkBnZW4uZW5naW5lIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiZGVmIF9zdGFydF9yZWNlaXZpbmcoc2VsZik6IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICB3aGlsZSBUcnVlOiIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgICB0cnk6IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICAgICAgZnJhbWUgPSB5aWVsZCBzZWxmLl90cmFuc3BvcnQucmVhZEZyYW1lKCkiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgICAgZXhjZXB0IFRUcmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbiBhcyBlOiIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgICAgIGZvciBmdXR1cmUgaW4gc2VsZi5fcmVxcy5pdGVydmFsdWVzKCk6IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICAgICAgICBmdXR1cmUuc2V0X2V4Y2VwdGlvbihlKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgICAgIHNlbGYuX3JlcXMgPSB7fSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgICAgIHJldHVybiIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgICB0ciA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcihmcmFtZSkiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgICAgaXByb3QgPSBzZWxmLl9pcHJvdF9mYWN0b3J5LmdldFByb3RvY29sKHRyKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgICAoZm5hbWUsIG10eXBlLCByc2VxaWQpID0gaXByb3QucmVhZE1lc3NhZ2VCZWdpbigpIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICAgIGZ1dHVyZSA9IHNlbGYuX3JlcXMucG9wKHJzZXFpZCwgTm9uZSkiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgICAgaWYgbm90IGZ1dHVyZToiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgICAgICAjIGZ1dHVyZSBoYXMgYWxyZWFkeSBiZWVuIGRpc2NhcmRlZCIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgICAgIGNvbnRpbnVlIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICAgIG1ldGhvZCA9IGdldGF0dHIoc2VsZiwgJ3JlY3ZfJyArIGZuYW1lKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgICB0cnk6IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICAgICAgcmVzdWx0ID0gbWV0aG9kKGlwcm90LCBtdHlwZSwgcnNlcWlkKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICAgICAgZnV0dXJlLnNldF9leGNlcHRpb24oZSkiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgICAgZWxzZToiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgICAgICBmdXR1cmUuc2V0X3Jlc3VsdChyZXN1bHQpIiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsOwotICB9Ci0KLSAgLy8gR2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKLSAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLQotICAgIC8vIE9wZW4gZnVuY3Rpb24KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICJkZWYgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlciwgZmFsc2UpIDw8ICI6IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGdlbmVyYXRlX3B5dGhvbl9kb2NzdHJpbmcoZl9zZXJ2aWNlXywgKCpmX2l0ZXIpKTsKLSAgICBpZiAoZ2VuX3R3aXN0ZWRfKSB7Ci0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInNlcWlkID0gc2VsZi5fc2VxaWQgPSBzZWxmLl9zZXFpZCArIDEiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInNlbGYuX3JlcXNbc2VxaWRdID0gZGVmZXIuRGVmZXJyZWQoKSIgPDwgZW5kbCA8PCBlbmRsOwotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJkID0gZGVmZXIubWF5YmVEZWZlcnJlZChzZWxmLnNlbmRfIiA8PCBmdW5uYW1lOwotCi0gICAgfSBlbHNlIGlmIChnZW5fdG9ybmFkb18pIHsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAic2VsZi5fc2VxaWQgKz0gMSIgPDwgZW5kbDsKLSAgICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICAgICAiZnV0dXJlID0gc2VsZi5fcmVxc1tzZWxmLl9zZXFpZF0gPSBjb25jdXJyZW50LkZ1dHVyZSgpIiA8PCBlbmRsOwotICAgICAgfQotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAgICJzZWxmLnNlbmRfIiA8PCBmdW5uYW1lIDw8ICIoIjsKLQotICAgIH0gZWxzZSB7Ci0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICAgInNlbGYuc2VuZF8iIDw8IGZ1bm5hbWUgPDwgIigiOwotICAgIH0KLQotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGlmIChnZW5fdHdpc3RlZF8pIHsKLSAgICAgIC8vIHdlIG5lZWQgYSBsZWFkaW5nIGNvbW1hIGlmIHRoZXJlIGFyZSBhcmdzLCBzaW5jZSBpdCdzIGNhbGxlZCBhcyBtYXliZURlZmVycmVkKGZ1bmNuYW1lLCBhcmcpCi0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0KLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7Ci0gICAgICB9Ci0gICAgICBmX3NlcnZpY2VfIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIH0KLQotICAgIGZfc2VydmljZV8gPDwgIikiIDw8IGVuZGw7Ci0KLSAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIGlmIChnZW5fdHdpc3RlZF8pIHsKLSAgICAgICAgLy8gbm90aGluZy4gU2VlIHRoZSBuZXh0IGJsb2NrLgotICAgICAgfSBlbHNlIGlmIChnZW5fdG9ybmFkb18pIHsKLSAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gZnV0dXJlIiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKLSAgICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICAgIGZfc2VydmljZV8gPDwgInJldHVybiAiOwotICAgICAgICB9Ci0gICAgICAgIGZfc2VydmljZV8gPDwgInNlbGYucmVjdl8iIDw8IGZ1bm5hbWUgPDwgIigpIiA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotCi0gICAgaWYgKGdlbl90d2lzdGVkXykgewotICAgICAgLy8gVGhpcyBibG9jayBpbmplY3RzIHRoZSBib2R5IG9mIHRoZSBzZW5kXzw+IG1ldGhvZCBmb3IgdHdpc3RlZCAoYW5kIGEgY2IvZWIgcGFpcikKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAgICJkLmFkZENhbGxiYWNrcygiIDw8IGVuZGw7Ci0KLSAgICAgIGluZGVudF91cCgpOwotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiY2FsbGJhY2s9c2VsZi5jYl9zZW5kXyIgPDwgZnVubmFtZSA8PCAiLCIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiY2FsbGJhY2tBcmdzPShzZXFpZCwpLCIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiZXJyYmFjaz1zZWxmLmViX3NlbmRfIiA8PCBmdW5uYW1lIDw8ICIsIiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJlcnJiYWNrQXJncz0oc2VxaWQsKSkiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotCi0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICAgInJldHVybiBkIiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAgICJkZWYgY2Jfc2VuZF8iIDw8IGZ1bm5hbWUgPDwgIihzZWxmLCBfLCBzZXFpZCk6IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBpZiAoKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgICAvLyBpZiBvbmUtd2F5LCBmaXJlIHRoZSBkZWZlcnJlZCAmIHJlbW92ZSBpdCBmcm9tIF9yZXFzCi0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwKLSAgICAgICAgICAiZCA9IHNlbGYuX3JlcXMucG9wKHNlcWlkKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PAotICAgICAgICAgICJkLmNhbGxiYWNrKE5vbmUpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8Ci0gICAgICAgICAgInJldHVybiBkIiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PAotICAgICAgICAgICJyZXR1cm4gc2VsZi5fcmVxc1tzZXFpZF0iIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gICAgICAvLyBhZGQgYW4gZXJyYmFjayB0byBmYWlsIHRoZSByZXF1ZXN0IGlmIHRoZSBjYWxsIHRvIHNlbmRfPD4gcmFpc2VkIGFuIGV4Y2VwdGlvbgotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAgICJkZWYgZWJfc2VuZF8iIDw8IGZ1bm5hbWUgPDwgIihzZWxmLCBmLCBzZXFpZCk6IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJkID0gc2VsZi5fcmVxcy5wb3Aoc2VxaWQpIiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJkLmVycmJhY2soZikiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInJldHVybiBkIiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICB9Ci0KLSAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAiZGVmIHNlbmRfIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlciwgZmFsc2UpIDw8ICI6IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotCi0gICAgc3RkOjpzdHJpbmcgYXJnc25hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX2FyZ3MiOwotICAgIHN0ZDo6c3RyaW5nIG1lc3NhZ2VUeXBlID0gKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSA/ICJUTWVzc2FnZVR5cGUuT05FV0FZIiA6ICJUTWVzc2FnZVR5cGUuQ0FMTCI7Ci0KLSAgICAvLyBTZXJpYWxpemUgdGhlIHJlcXVlc3QgaGVhZGVyCi0gICAgaWYgKGdlbl90d2lzdGVkXyB8fCBnZW5fdG9ybmFkb18pIHsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIm9wcm90ID0gc2VsZi5fb3Byb3RfZmFjdG9yeS5nZXRQcm90b2NvbChzZWxmLl90cmFuc3BvcnQpIiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbignIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIicsICIKLSAgICAgICAgICAgICAgICAgPDwgbWVzc2FnZVR5cGUgPDwgIiwgc2VsZi5fc2VxaWQpIiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJzZWxmLl9vcHJvdC53cml0ZU1lc3NhZ2VCZWdpbignIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIicsICIKLSAgICAgICAgICAgICAgICAgPDwgbWVzc2FnZVR5cGUgPDwgIiwgc2VsZi5fc2VxaWQpIiA8PCBlbmRsOwotICAgIH0KLQotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJhcmdzID0gIiA8PCBhcmdzbmFtZSA8PCAiKCkiIDw8IGVuZGw7Ci0KLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiYXJncy4iIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgLy8gV3JpdGUgdG8gdGhlIHN0cmVhbQotICAgIGlmIChnZW5fdHdpc3RlZF8gfHwgZ2VuX3Rvcm5hZG9fKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJhcmdzLndyaXRlKG9wcm90KSIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlRW5kKCkiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIm9wcm90LnRyYW5zLmZsdXNoKCkiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImFyZ3Mud3JpdGUoc2VsZi5fb3Byb3QpIiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJzZWxmLl9vcHJvdC53cml0ZU1lc3NhZ2VFbmQoKSIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAic2VsZi5fb3Byb3QudHJhbnMuZmx1c2goKSIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBpbmRlbnRfZG93bigpOwotCi0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBzdGQ6OnN0cmluZyByZXN1bHRuYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOwotICAgICAgLy8gT3BlbiBmdW5jdGlvbgotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBlbmRsOwotICAgICAgaWYgKGdlbl90d2lzdGVkXyB8fCBnZW5fdG9ybmFkb18pIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJkZWYgcmVjdl8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PAotICAgICAgICAgICAgICAiKHNlbGYsIGlwcm90LCBtdHlwZSwgcnNlcWlkKToiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICB0X3N0cnVjdCBub2FyZ3MocHJvZ3JhbV8pOwotICAgICAgICB0X2Z1bmN0aW9uIHJlY3ZfZnVuY3Rpb24oKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygicmVjdl8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbm9hcmdzKTsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJkZWYgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnJlY3ZfZnVuY3Rpb24pIDw8ICI6IiA8PCBlbmRsOwotICAgICAgfQotICAgICAgaW5kZW50X3VwKCk7Ci0KLSAgICAgIC8vIFRPRE8obWNzbGVlKTogVmFsaWRhdGUgbWVzc2FnZSByZXBseSBoZXJlLCBzZXEgaWRzIGV0Yy4KLQotICAgICAgaWYgKGdlbl90d2lzdGVkXykgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImQgPSBzZWxmLl9yZXFzLnBvcChyc2VxaWQpIiA8PCBlbmRsOwotICAgICAgfSBlbHNlIGlmIChnZW5fdG9ybmFkb18pIHsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaXByb3QgPSBzZWxmLl9pcHJvdCIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIoZm5hbWUsIG10eXBlLCByc2VxaWQpID0gaXByb3QucmVhZE1lc3NhZ2VCZWdpbigpIiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiBtdHlwZSA9PSBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OOiIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICB4ID0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uKCkiIDw8IGVuZGw7Ci0KLSAgICAgIGlmIChnZW5fdHdpc3RlZF8pIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIHgucmVhZChpcHJvdCkiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICBpcHJvdC5yZWFkTWVzc2FnZUVuZCgpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGQuZXJyYmFjayh4KSIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJyZXN1bHQgPSAiIDw8IHJlc3VsdG5hbWUgPDwgIigpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgInJlc3VsdC5yZWFkKGlwcm90KSIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJpcHJvdC5yZWFkTWVzc2FnZUVuZCgpIiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIHgucmVhZChpcHJvdCkiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICBpcHJvdC5yZWFkTWVzc2FnZUVuZCgpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgcmFpc2UgeCIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJyZXN1bHQgPSAiIDw8IHJlc3VsdG5hbWUgPDwgIigpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgInJlc3VsdC5yZWFkKGlwcm90KSIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJpcHJvdC5yZWFkTWVzc2FnZUVuZCgpIiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KLSAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJpZiByZXN1bHQuc3VjY2VzcyBpcyBub3QgTm9uZToiIDw8IGVuZGw7Ci0gICAgICAgICAgaWYgKGdlbl90d2lzdGVkXykgewotICAgICAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gZC5jYWxsYmFjayhyZXN1bHQuc3VjY2VzcykiIDw8IGVuZGw7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHJlc3VsdC5zdWNjZXNzIiA8PCBlbmRsOwotICAgICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7Ci0gICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJpZiByZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiBpcyBub3QgTm9uZToiIDw8IGVuZGw7Ci0gICAgICAgICAgaWYgKGdlbl90d2lzdGVkXykgewotICAgICAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gZC5lcnJiYWNrKHJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSIgPDwgZW5kbDsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICByYWlzZSByZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiIgPDwgZW5kbDsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8vIENhcmVmdWwsIG9ubHkgcmV0dXJuIF9yZXN1bHQgaWYgbm90IGEgdm9pZCBmdW5jdGlvbgotICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIGlmIChnZW5fdHdpc3RlZF8pIHsKLSAgICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAicmV0dXJuIGQuY2FsbGJhY2soTm9uZSkiIDw8IGVuZGw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgInJldHVybiIgPDwgZW5kbDsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKGdlbl90d2lzdGVkXykgewotICAgICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICJyZXR1cm4gZC5lcnJiYWNrKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uTUlTU0lOR19SRVNVTFQsIFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiBmYWlsZWQ6IHVua25vd24gcmVzdWx0XCIpKSIgPDwgZW5kbDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAicmFpc2UgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5NSVNTSU5HX1JFU1VMVCwgXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZhaWxlZDogdW5rbm93biByZXN1bHRcIik7IiA8PCBlbmRsOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8vIENsb3NlIGZ1bmN0aW9uCi0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwKLSAgICBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIGNvbW1hbmQgbGluZSB0b29sIGZvciBtYWtpbmcgcmVtb3RlIHJlcXVlc3RzCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgcmVtb3RlIGZvci4KLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9yZW1vdGUodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIC8vR2V0IGFsbCBmdW5jdGlvbiBmcm9tIHBhcmVudHMKLSAgdF9zZXJ2aWNlKiBwYXJlbnQgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKLSAgd2hpbGUocGFyZW50ICE9IE5VTEwpIHsKLSAgICB2ZWN0b3I8dF9mdW5jdGlvbio+IHBfZnVuY3Rpb25zID0gcGFyZW50LT5nZXRfZnVuY3Rpb25zKCk7Ci0gICAgZnVuY3Rpb25zLmluc2VydChmdW5jdGlvbnMuZW5kKCksIHBfZnVuY3Rpb25zLmJlZ2luKCksIHBfZnVuY3Rpb25zLmVuZCgpKTsKLSAgICBwYXJlbnQgPSBwYXJlbnQtPmdldF9leHRlbmRzKCk7Ci0gIH0KLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotCi0gIHN0cmluZyBmX3JlbW90ZV9uYW1lID0gcGFja2FnZV9kaXJfKyIvIitzZXJ2aWNlX25hbWVfKyItcmVtb3RlIjsKLSAgb2ZzdHJlYW0gZl9yZW1vdGU7Ci0gIGZfcmVtb3RlLm9wZW4oZl9yZW1vdGVfbmFtZS5jX3N0cigpKTsKLQotICBmX3JlbW90ZSA8PAotICAgICIjIS91c3IvYmluL2VudiBweXRob24iIDw8IGVuZGwgPDwKLSAgICBweV9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsIDw8Ci0gICAgImltcG9ydCBzeXMiIDw8IGVuZGwgPDwKLSAgICAiaW1wb3J0IHBwcmludCIgPDwgZW5kbCA8PAotICAgICJmcm9tIHVybHBhcnNlIGltcG9ydCB1cmxwYXJzZSIgPDwgZW5kbCA8PAotICAgICJmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQiIDw8IGVuZGwgPDwKLSAgICAiZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUU29ja2V0IiA8PCBlbmRsIDw8Ci0gICAgImZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFNTTFNvY2tldCIgPDwgZW5kbCA8PAotICAgICJmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRIdHRwQ2xpZW50IiA8PCBlbmRsIDw8Ci0gICAgImZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIGZfcmVtb3RlIDw8Ci0gICAgImZyb20gIiA8PCBtb2R1bGVfIDw8ICIgaW1wb3J0ICIgPDwgc2VydmljZV9uYW1lXyA8PCBlbmRsIDw8Ci0gICAgImZyb20gIiA8PCBtb2R1bGVfIDw8ICIudHR5cGVzIGltcG9ydCAqIiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICBmX3JlbW90ZSA8PAotICAgICJpZiBsZW4oc3lzLmFyZ3YpIDw9IDEgb3Igc3lzLmFyZ3ZbMV0gPT0gJy0taGVscCc6IiA8PCBlbmRsIDw8Ci0gICAgIiAgcHJpbnQoJycpIiA8PCBlbmRsIDw8Ci0gICAgIiAgcHJpbnQoJ1VzYWdlOiAnICsgc3lzLmFyZ3ZbMF0gKyAnIFstaCBob3N0Wzpwb3J0XV0gWy11IHVybF0gWy1mW3JhbWVkXV0gWy1zW3NsXV0gZnVuY3Rpb24gW2FyZzEgW2FyZzIuLi5dXScpIiA8PCBlbmRsIDw8Ci0gICAgIiAgcHJpbnQoJycpIiA8PCBlbmRsIDw8Ci0gICAgIiAgcHJpbnQoJ0Z1bmN0aW9uczonKSIgPDwgZW5kbDsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBmX3JlbW90ZSA8PAotICAgICAgIiAgcHJpbnQoJyAgIiA8PCAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmdldF9uYW1lKCkgPDwgIiAiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCI7Ci0gICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBhcmdzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBhX2l0ZXI7Ci0gICAgaW50IG51bV9hcmdzID0gYXJncy5zaXplKCk7Ci0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fYXJnczsgKytpKSB7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfcmVtb3RlIDw8ICIsICI7Ci0gICAgICB9Ci0gICAgICBmX3JlbW90ZSA8PAotICAgICAgICBhcmdzW2ldLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpIDw8ICIgIiA8PCBhcmdzW2ldLT5nZXRfbmFtZSgpOwotICAgIH0KLSAgICBmX3JlbW90ZSA8PCAiKScpIiA8PCBlbmRsOwotICB9Ci0gIGZfcmVtb3RlIDw8Ci0gICAgIiAgcHJpbnQoJycpIiA8PCBlbmRsIDw8Ci0gICAgIiAgc3lzLmV4aXQoMCkiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIGZfcmVtb3RlIDw8Ci0gICAgInBwID0gcHByaW50LlByZXR0eVByaW50ZXIoaW5kZW50ID0gMikiIDw8IGVuZGwgPDwKLSAgICAiaG9zdCA9ICdsb2NhbGhvc3QnIiA8PCBlbmRsIDw8Ci0gICAgInBvcnQgPSA5MDkwIiA8PCBlbmRsIDw8Ci0gICAgInVyaSA9ICcnIiA8PCBlbmRsIDw8Ci0gICAgImZyYW1lZCA9IEZhbHNlIiA8PCBlbmRsIDw8Ci0gICAgInNzbCA9IEZhbHNlIiA8PCBlbmRsIDw8Ci0gICAgImh0dHAgPSBGYWxzZSIgPDwgZW5kbCA8PAotICAgICJhcmdpID0gMSIgPDwgZW5kbCA8PAotICAgIGVuZGwgPDwKLSAgICAiaWYgc3lzLmFyZ3ZbYXJnaV0gPT0gJy1oJzoiIDw8IGVuZGwgPDwKLSAgICAiICBwYXJ0cyA9IHN5cy5hcmd2W2FyZ2krMV0uc3BsaXQoJzonKSIgPDwgZW5kbCA8PAotICAgICIgIGhvc3QgPSBwYXJ0c1swXSIgPDwgZW5kbCA8PAotICAgICIgIGlmIGxlbihwYXJ0cykgPiAxOiIgPDwgZW5kbCA8PAotICAgICIgICAgcG9ydCA9IGludChwYXJ0c1sxXSkiIDw8IGVuZGwgPDwKLSAgICAiICBhcmdpICs9IDIiIDw8IGVuZGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgImlmIHN5cy5hcmd2W2FyZ2ldID09ICctdSc6IiA8PCBlbmRsIDw8Ci0gICAgIiAgdXJsID0gdXJscGFyc2Uoc3lzLmFyZ3ZbYXJnaSsxXSkiIDw8IGVuZGwgPDwKLSAgICAiICBwYXJ0cyA9IHVybFsxXS5zcGxpdCgnOicpIiA8PCBlbmRsIDw8Ci0gICAgIiAgaG9zdCA9IHBhcnRzWzBdIiA8PCBlbmRsIDw8Ci0gICAgIiAgaWYgbGVuKHBhcnRzKSA+IDE6IiA8PCBlbmRsIDw8Ci0gICAgIiAgICBwb3J0ID0gaW50KHBhcnRzWzFdKSIgPDwgZW5kbCA8PAotICAgICIgIGVsc2U6IiA8PCBlbmRsIDw8Ci0gICAgIiAgICBwb3J0ID0gODAiIDw8IGVuZGwgPDwKLSAgICAiICB1cmkgPSB1cmxbMl0iIDw8IGVuZGwgPDwKLSAgICAiICBpZiB1cmxbNF06IiA8PCBlbmRsIDw8Ci0gICAgIiAgICB1cmkgKz0gJz8lcycgJSB1cmxbNF0iIDw8IGVuZGwgPDwKLSAgICAiICBodHRwID0gVHJ1ZSIgPDwgZW5kbCA8PAotICAgICIgIGFyZ2kgKz0gMiIgPDwgZW5kbCA8PAotICAgIGVuZGwgPDwKLSAgICAiaWYgc3lzLmFyZ3ZbYXJnaV0gPT0gJy1mJyBvciBzeXMuYXJndlthcmdpXSA9PSAnLWZyYW1lZCc6IiA8PCBlbmRsIDw8Ci0gICAgIiAgZnJhbWVkID0gVHJ1ZSIgPDwgZW5kbCA8PAotICAgICIgIGFyZ2kgKz0gMSIgPDwgZW5kbCA8PAotICAgIGVuZGwgPDwKLSAgICAiaWYgc3lzLmFyZ3ZbYXJnaV0gPT0gJy1zJyBvciBzeXMuYXJndlthcmdpXSA9PSAnLXNzbCc6IiA8PCBlbmRsIDw8Ci0gICAgIiAgc3NsID0gVHJ1ZSIgPDwgZW5kbCA8PAotICAgICIgIGFyZ2kgKz0gMSIgPDwgZW5kbCA8PAotICAgIGVuZGwgPDwKLSAgICAiY21kID0gc3lzLmFyZ3ZbYXJnaV0iIDw8IGVuZGwgPDwKLSAgICAiYXJncyA9IHN5cy5hcmd2W2FyZ2krMTpdIiA8PCBlbmRsIDw8Ci0gICAgZW5kbCA8PAotICAgICJpZiBodHRwOiIgPDwgZW5kbCA8PAotICAgICIgIHRyYW5zcG9ydCA9IFRIdHRwQ2xpZW50LlRIdHRwQ2xpZW50KGhvc3QsIHBvcnQsIHVyaSkiIDw8IGVuZGwgPDwKLSAgICAiZWxzZToiIDw8IGVuZGwgPDwKLSAgICAiICBzb2NrZXQgPSBUU1NMU29ja2V0LlRTU0xTb2NrZXQoaG9zdCwgcG9ydCwgdmFsaWRhdGU9RmFsc2UpIGlmIHNzbCBlbHNlIFRTb2NrZXQuVFNvY2tldChob3N0LCBwb3J0KSIgPDwgZW5kbCA8PAotICAgICIgIGlmIGZyYW1lZDoiIDw8IGVuZGwgPDwKLSAgICAiICAgIHRyYW5zcG9ydCA9IFRUcmFuc3BvcnQuVEZyYW1lZFRyYW5zcG9ydChzb2NrZXQpIiA8PCBlbmRsIDw8Ci0gICAgIiAgZWxzZToiIDw8IGVuZGwgPDwKLSAgICAiICAgIHRyYW5zcG9ydCA9IFRUcmFuc3BvcnQuVEJ1ZmZlcmVkVHJhbnNwb3J0KHNvY2tldCkiIDw8IGVuZGwgPDwKLSAgICAicHJvdG9jb2wgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCkiIDw8IGVuZGwgPDwKLSAgICAiY2xpZW50ID0gIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICIuQ2xpZW50KHByb3RvY29sKSIgPDwgZW5kbCA8PAotICAgICJ0cmFuc3BvcnQub3BlbigpIiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgZGlzcGF0Y2ggbWV0aG9kcwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLQotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgZl9yZW1vdGUgPDwgImVsIjsKLSAgICB9Ci0KLSAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLSAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGFyZ3MgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGFfaXRlcjsKLSAgICBpbnQgbnVtX2FyZ3MgPSBhcmdzLnNpemUoKTsKLQotICAgIGZfcmVtb3RlIDw8Ci0gICAgICAiaWYgY21kID09ICciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJzoiIDw8IGVuZGwgPDwKLSAgICAgICIgIGlmIGxlbihhcmdzKSAhPSAiIDw8IG51bV9hcmdzIDw8ICI6IiA8PCBlbmRsIDw8Ci0gICAgICAiICAgIHByaW50KCciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIHJlcXVpcmVzICIgPDwgbnVtX2FyZ3MgPDwgIiBhcmdzJykiIDw8IGVuZGwgPDwKLSAgICAgICIgICAgc3lzLmV4aXQoMSkiIDw8IGVuZGwgPDwKLSAgICAgICIgIHBwLnBwcmludChjbGllbnQuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIigiOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtX2FyZ3M7ICsraSkgewotICAgICAgaWYgKGFyZ3NbaV0tPmdldF90eXBlKCktPmlzX3N0cmluZygpKSB7Ci0gICAgICAgIGZfcmVtb3RlIDw8ICJhcmdzWyIgPDwgaSA8PCAiXSwiOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9yZW1vdGUgPDwgImV2YWwoYXJnc1siIDw8IGkgPDwgIl0pLCI7Ci0gICAgICB9Ci0gICAgfQotICAgIGZfcmVtb3RlIDw8ICIpKSIgPDwgZW5kbDsKLQotICAgIGZfcmVtb3RlIDw8IGVuZGw7Ci0gIH0KLQotICBpZiAoZnVuY3Rpb25zLnNpemUoKSA+IDApIHsKLSAgICBmX3JlbW90ZSA8PCAiZWxzZToiIDw8IGVuZGw7Ci0gICAgZl9yZW1vdGUgPDwgIiAgcHJpbnQoJ1VucmVjb2duaXplZCBtZXRob2QgJXMnICUgY21kKSIgPDwgZW5kbDsKLSAgICBmX3JlbW90ZSA8PCAiICBzeXMuZXhpdCgxKSIgPDwgZW5kbDsKLSAgICBmX3JlbW90ZSA8PCBlbmRsOwotICB9Ci0KLSAgZl9yZW1vdGUgPDwgInRyYW5zcG9ydC5jbG9zZSgpIiA8PCBlbmRsOwotCi0gIC8vIENsb3NlIHNlcnZpY2UgZmlsZQotICBmX3JlbW90ZS5jbG9zZSgpOwotCi0jaWZuZGVmIF9NU0NfVkVSCi0KLSAgLy8gTWFrZSBmaWxlIGV4ZWN1dGFibGUsIGxvdmUgdGhhdCBiaXR3aXNlIE9SIGFjdGlvbgotICBjaG1vZChmX3JlbW90ZV9uYW1lLmNfc3RyKCksCi0gICAgICAgICAgU19JUlVTUgotICAgICAgICB8IFNfSVdVU1IKLSAgICAgICAgfCBTX0lYVVNSCi0jaWZuZGVmIF9XSU4zMgotICAgICAgICB8IFNfSVJHUlAKLSAgICAgICAgfCBTX0lYR1JQCi0gICAgICAgIHwgU19JUk9USAotICAgICAgICB8IFNfSVhPVEgKLSNlbmRpZgotICApOwotCi0jZW5kaWYgLy8gX01TQ19WRVIKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIHNlcnZlciBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCi0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgLy8gR2VuZXJhdGUgdGhlIGRpc3BhdGNoIG1ldGhvZHMKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0KLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfcHJvY2Vzc29yID0gIiI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7Ci0gICAgZXh0ZW5kc19wcm9jZXNzb3IgPSBleHRlbmRzICsgIi5Qcm9jZXNzb3IsICI7Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSB0aGUgaGVhZGVyIHBvcnRpb24KLSAgaWYgKGdlbl90d2lzdGVkXykgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgICJjbGFzcyBQcm9jZXNzb3IoIiA8PCBleHRlbmRzX3Byb2Nlc3NvciA8PCAiVFByb2Nlc3Nvcik6IiA8PCBlbmRsIDw8Ci0gICAgICAiICBpbXBsZW1lbnRzKElmYWNlKSIgPDwgZW5kbCA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgICJjbGFzcyBQcm9jZXNzb3IoIiA8PCBleHRlbmRzX3Byb2Nlc3NvciA8PCAiSWZhY2UsIFRQcm9jZXNzb3IpOiIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJkZWYgX19pbml0X18oc2VsZiwgaGFuZGxlcik6IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgewotICAgIGlmIChnZW5fdHdpc3RlZF8pIHsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInNlbGYuX2hhbmRsZXIgPSBJZmFjZShoYW5kbGVyKSIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAic2VsZi5faGFuZGxlciA9IGhhbmRsZXIiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInNlbGYuX3Byb2Nlc3NNYXAgPSB7fSIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBpZiAoZ2VuX3R3aXN0ZWRfKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8IGV4dGVuZHMgPDwgIi5Qcm9jZXNzb3IuX19pbml0X18oc2VsZiwgSWZhY2UoaGFuZGxlcikpIiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8IGV4dGVuZHMgPDwgIi5Qcm9jZXNzb3IuX19pbml0X18oc2VsZiwgaGFuZGxlcikiIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInNlbGYuX3Byb2Nlc3NNYXBbXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdID0gUHJvY2Vzc29yLnByb2Nlc3NfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIHNlcnZlciBpbXBsZW1lbnRhdGlvbgotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgImRlZiBwcm9jZXNzKHNlbGYsIGlwcm90LCBvcHJvdCk6IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgIihuYW1lLCB0eXBlLCBzZXFpZCkgPSBpcHJvdC5yZWFkTWVzc2FnZUJlZ2luKCkiIDw8IGVuZGw7Ci0KLSAgLy8gVE9ETyhtY3NsZWUpOiB2YWxpZGF0ZSBtZXNzYWdlCi0KLSAgLy8gSE9UOiBkaWN0aW9uYXJ5IGZ1bmN0aW9uIGxvb2t1cAotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgImlmIG5hbWUgbm90IGluIHNlbGYuX3Byb2Nlc3NNYXA6IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgaXByb3Quc2tpcChUVHlwZS5TVFJVQ1QpIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgaXByb3QucmVhZE1lc3NhZ2VFbmQoKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIHggPSBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLlVOS05PV05fTUVUSE9ELCAnVW5rbm93biBmdW5jdGlvbiAlcycgJSAobmFtZSkpIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgb3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4obmFtZSwgVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiwgc2VxaWQpIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgeC53cml0ZShvcHJvdCkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIG9wcm90LnRyYW5zLmZsdXNoKCkiIDw8IGVuZGw7Ci0KLSAgaWYgKGdlbl90d2lzdGVkXykgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiBkZWZlci5zdWNjZWVkKE5vbmUpIiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiIgPDwgZW5kbDsKLSAgfQotCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAiZWxzZToiIDw8IGVuZGw7Ci0KLSAgaWYgKGdlbl90d2lzdGVkXyB8fCBnZW5fdG9ybmFkb18pIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gc2VsZi5fcHJvY2Vzc01hcFtuYW1lXShzZWxmLCBzZXFpZCwgaXByb3QsIG9wcm90KSIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICBzZWxmLl9wcm9jZXNzTWFwW25hbWVdKHNlbGYsIHNlcWlkLCBpcHJvdCwgb3Byb3QpIiA8PCBlbmRsOwotCi0gICAgLy8gUmVhZCBlbmQgb2YgYXJncyBmaWVsZCwgdGhlIFRfU1RPUCwgYW5kIHRoZSBzdHJ1Y3QgY2xvc2UKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicmV0dXJuIFRydWUiIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3Mgc3ViZnVuY3Rpb25zCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0c2VydmljZSwgKmZfaXRlcik7Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgcHJvY2VzcyBmdW5jdGlvbiBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHdyaXRlIGEgZGlzcGF0Y2hlciBmb3IKLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgKHZvaWQpIHRzZXJ2aWNlOwotICAvLyBPcGVuIGZ1bmN0aW9uCi0gIGlmIChnZW5fdG9ybmFkb18pIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiQGdlbi5jb3JvdXRpbmUiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJkZWYgcHJvY2Vzc18iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PAotICAgICAgICAgICAgICAgICAgIihzZWxmLCBzZXFpZCwgaXByb3QsIG9wcm90KToiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgImRlZiBwcm9jZXNzXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8Ci0gICAgICAgICAgICAgICAgICAiKHNlbGYsIHNlcWlkLCBpcHJvdCwgb3Byb3QpOiIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudF91cCgpOwotCi0gIHN0cmluZyBhcmdzbmFtZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfYXJncyI7Ci0gIHN0cmluZyByZXN1bHRuYW1lID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAiYXJncyA9ICIgPDwgYXJnc25hbWUgPDwgIigpIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImFyZ3MucmVhZChpcHJvdCkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiaXByb3QucmVhZE1lc3NhZ2VFbmQoKSIgPDwgZW5kbDsKLQotICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotCi0gIC8vIERlY2xhcmUgcmVzdWx0IGZvciBub24gb25ld2F5IGZ1bmN0aW9uCi0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJyZXN1bHQgPSAiIDw8IHJlc3VsdG5hbWUgPDwgIigpIiA8PCBlbmRsOwotICB9Ci0KLSAgaWYgKGdlbl90d2lzdGVkXykgewotICAgIC8vIEdlbmVyYXRlIHRoZSBmdW5jdGlvbiBjYWxsCi0gICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7Ci0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJkID0gZGVmZXIubWF5YmVEZWZlcnJlZChzZWxmLl9oYW5kbGVyLiIgPDwKLSAgICAgICAgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIsICI7Ci0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgIGlmIChmaXJzdCkgewotICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOwotICAgICAgfQotICAgICAgZl9zZXJ2aWNlXyA8PCAiYXJncy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICB9Ci0gICAgZl9zZXJ2aWNlXyA8PCAiKSIgPDwgZW5kbDsKLQotICAgIC8vIFNob3J0Y3V0IG91dCBoZXJlIGZvciBvbmV3YXkgZnVuY3Rpb25zCi0gICAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInJldHVybiBkIiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PAotICAgICAgICAiZC5hZGRDYWxsYmFjayhzZWxmLndyaXRlX3Jlc3VsdHNfc3VjY2Vzc18iIDw8Ci0gICAgICAgICAgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIsIHJlc3VsdCwgc2VxaWQsIG9wcm90KSIgPDwgZW5kbDsKLQotICAgIGlmICh4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgewotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PAotICAgICAgICAgICJkLmFkZEVycmJhY2soc2VsZi53cml0ZV9yZXN1bHRzX2V4Y2VwdGlvbl8iIDw8Ci0gICAgICAgICAgICB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIiwgcmVzdWx0LCBzZXFpZCwgb3Byb3QpIiA8PCBlbmRsOwotICAgIH0KLQotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJyZXR1cm4gZCIgPDwgZW5kbDsKLQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAgICJkZWYgd3JpdGVfcmVzdWx0c19zdWNjZXNzXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8Ci0gICAgICAgICIoc2VsZiwgc3VjY2VzcywgcmVzdWx0LCBzZXFpZCwgb3Byb3QpOiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicmVzdWx0LnN1Y2Nlc3MgPSBzdWNjZXNzIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4oXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PAotICAgICAgICAiXCIsIFRNZXNzYWdlVHlwZS5SRVBMWSwgc2VxaWQpIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicmVzdWx0LndyaXRlKG9wcm90KSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUVuZCgpIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAib3Byb3QudHJhbnMuZmx1c2goKSIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAgIC8vIFRyeSBibG9jayBmb3IgYSBmdW5jdGlvbiB3aXRoIGV4Y2VwdGlvbnMKLSAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgeGNlcHRpb25zLnNpemUoKSA+IDApIHsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgICAiZGVmIHdyaXRlX3Jlc3VsdHNfZXhjZXB0aW9uXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8Ci0gICAgICAgICIoc2VsZiwgZXJyb3IsIHJlc3VsdCwgc2VxaWQsIG9wcm90KToiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInRyeToiIDw8IGVuZGw7Ci0KLSAgICAgIC8vIEtpbmRhIGFic3VyZAotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBlcnJvci5yYWlzZUV4Y2VwdGlvbigpIiA8PCBlbmRsOwotICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJleGNlcHQgIiA8PCB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiLCAiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOiIgPDwgZW5kbDsKLSAgICAgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgInJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgZW5kbDsKLSAgICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICJwYXNzIiA8PCBlbmRsOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbihcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8Ci0gICAgICAgICAgIlwiLCBUTWVzc2FnZVR5cGUuUkVQTFksIHNlcWlkKSIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAicmVzdWx0LndyaXRlKG9wcm90KSIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlRW5kKCkiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIm9wcm90LnRyYW5zLmZsdXNoKCkiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotICAgIH0KLQotICB9IGVsc2UgaWYgKGdlbl90b3JuYWRvXykgewotICAgIC8qCi0gICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmIHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImRlZiBoYW5kbGVfZXhjZXB0aW9uKHh0eXBlLCB2YWx1ZSwgdHJhY2ViYWNrKToiIDw8IGVuZGw7Ci0KLSAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICBpZiB4dHlwZSA9PSAiIDw8IHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCkpIDw8ICI6IiA8PCBlbmRsOwotICAgICAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiICAgIHJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gdmFsdWUiIDw8IGVuZGw7Ci0gICAgICAgIH0KLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgICAgcmV0dXJuIFRydWUiIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAidHJ5OiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgIH0KLSAgICAqLwotCi0gICAgLy8gR2VuZXJhdGUgdGhlIGZ1bmN0aW9uIGNhbGwKLSAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKLSAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gICAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ0cnk6IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgfQotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7Ci0gICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgZl9zZXJ2aWNlXyA8PCAicmVzdWx0LnN1Y2Nlc3MgPSAiOwotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAieWllbGQgZ2VuLm1heWJlX2Z1dHVyZShzZWxmLl9oYW5kbGVyLiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIjsKLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7Ci0gICAgICB9Ci0gICAgICBmX3NlcnZpY2VfIDw8ICJhcmdzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8ICIpKSIgPDwgZW5kbDsKLQotICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiB4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgewotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiZXhjZXB0ICIgPDwgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiwgIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIjoiIDw8IGVuZGw7Ci0gICAgICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgICAgICAgIGluZGVudF91cCgpOwotICAgICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICJyZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8IGVuZGw7Ci0gICAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAicGFzcyIgPDwgZW5kbDsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4oXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCIsIFRNZXNzYWdlVHlwZS5SRVBMWSwgc2VxaWQpIiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJyZXN1bHQud3JpdGUob3Byb3QpIiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKSIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAib3Byb3QudHJhbnMuZmx1c2goKSIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICAvLyBDbG9zZSBmdW5jdGlvbgotICAgIGluZGVudF9kb3duKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gIH0gZWxzZSB7ICAvLyBweQotICAgIC8vIFRyeSBibG9jayBmb3IgYSBmdW5jdGlvbiB3aXRoIGV4Y2VwdGlvbnMKLSAgICBpZiAoeGNlcHRpb25zLnNpemUoKSA+IDApIHsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInRyeToiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICB9Ci0KLSAgICAvLyBHZW5lcmF0ZSB0aGUgZnVuY3Rpb24gY2FsbAotICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOwotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOwotICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgIGZfc2VydmljZV8gPDwgInJlc3VsdC5zdWNjZXNzID0gIjsKLSAgICB9Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgInNlbGYuX2hhbmRsZXIuIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiOwotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKLSAgICAgIH0KLSAgICAgIGZfc2VydmljZV8gPDwgImFyZ3MuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgfQotICAgIGZfc2VydmljZV8gPDwgIikiIDw8IGVuZGw7Ci0KLSAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgeGNlcHRpb25zLnNpemUoKSA+IDApIHsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImV4Y2VwdCAiIDw8IHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCkpIDw8ICIsICIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI6IiA8PCBlbmRsOwotICAgICAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAicmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCBlbmRsOwotICAgICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgInBhc3MiIDw8IGVuZGw7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBTaG9ydGN1dCBvdXQgaGVyZSBmb3Igb25ld2F5IGZ1bmN0aW9ucwotICAgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJyZXR1cm4iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbihcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJcIiwgVE1lc3NhZ2VUeXBlLlJFUExZLCBzZXFpZCkiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJyZXN1bHQud3JpdGUob3Byb3QpIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlRW5kKCkiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJvcHJvdC50cmFucy5mbHVzaCgpIiA8PCBlbmRsOwotCi0gICAgLy8gQ2xvc2UgZnVuY3Rpb24KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLSAgfQotfQotCi0vKioKLSAqIERlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgotICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbGFzcykgewotICAodm9pZCkgaW5jbGFzczsKLSAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOwotCi0gIGlmICh0eXBlLT5pc192b2lkKCkpIHsKLSAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIERFU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArCi0gICAgICBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gIH0KLQotICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLQotICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0X3N0cnVjdCopdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbmFtZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgIG5hbWUgPDwgIiA9IGlwcm90LiI7Ci0KLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKwotICAgICAgICAgIG5hbWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIGlmICgoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkgfHwgIWdlbl91dGY4c3RyaW5nc18pIHsKLSAgICAgICAgICBvdXQgPDwgInJlYWRTdHJpbmcoKTsiOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIG91dCA8PCAicmVhZFN0cmluZygpLmRlY29kZSgndXRmLTgnKSI7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIG91dCA8PCAicmVhZEJvb2woKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgb3V0IDw8ICJyZWFkQnl0ZSgpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgIG91dCA8PCAicmVhZEkxNigpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgIG91dCA8PCAicmVhZEkzMigpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgIG91dCA8PCAicmVhZEk2NCgpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIG91dCA8PCAicmVhZERvdWJsZSgpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBQeXRob24gbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICBvdXQgPDwgInJlYWRJMzIoKTsiOwotICAgIH0KLSAgICBvdXQgPDwgZW5kbDsKLQotICB9IGVsc2UgewotICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIERFU0VSSUFMSVpFIEZJRUxEICclcycgVFlQRSAnJXMnXG4iLAotICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwgdHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhbiB1bnNlcmlhbGl6ZXIgZm9yIGEgc3RydWN0LCBjYWxsaW5nIHJlYWQoKQotICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIgPSAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiKCkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIi5yZWFkKGlwcm90KSIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemUgYSBjb250YWluZXIgYnkgd3JpdGluZyBvdXQgdGhlIGhlYWRlciBmb2xsb3dlZCBieQotICogZGF0YSBhbmQgdGhlbiBhIGZvb3Rlci4KLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHN0cmluZyBzaXplID0gdG1wKCJfc2l6ZSIpOwotICBzdHJpbmcga3R5cGUgPSB0bXAoIl9rdHlwZSIpOwotICBzdHJpbmcgdnR5cGUgPSB0bXAoIl92dHlwZSIpOwotICBzdHJpbmcgZXR5cGUgPSB0bXAoIl9ldHlwZSIpOwotCi0gIHRfZmllbGQgZnNpemUoZ190eXBlX2kzMiwgc2l6ZSk7Ci0gIHRfZmllbGQgZmt0eXBlKGdfdHlwZV9ieXRlLCBrdHlwZSk7Ci0gIHRfZmllbGQgZnZ0eXBlKGdfdHlwZV9ieXRlLCB2dHlwZSk7Ci0gIHRfZmllbGQgZmV0eXBlKGdfdHlwZV9ieXRlLCBldHlwZSk7Ci0KLSAgLy8gRGVjbGFyZSB2YXJpYWJsZXMsIHJlYWQgaGVhZGVyCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0ge30iIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIoIiA8PCBrdHlwZSA8PCAiLCAiIDw8IHZ0eXBlIDw8ICIsICIgPDwgc2l6ZSA8PCAiICkgPSBpcHJvdC5yZWFkTWFwQmVnaW4oKSIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gc2V0KCkiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIoIiA8PCBldHlwZSA8PCAiLCAiIDw8IHNpemUgPDwgIikgPSBpcHJvdC5yZWFkU2V0QmVnaW4oKSIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIiA9IFtdIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiKCIgPDwgZXR5cGUgPDwgIiwgIiA8PCBzaXplIDw8ICIpID0gaXByb3QucmVhZExpc3RCZWdpbigpIiA8PCBlbmRsOwotICB9Ci0KLSAgLy8gRm9yIGxvb3AgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cwotICBzdHJpbmcgaSA9IHRtcCgiX2kiKTsKLSAgaW5kZW50KG91dCkgPDwKLSAgICAiZm9yICIgPDwgaSA8PCAiIGluIHhyYW5nZSgiIDw8IHNpemUgPDwgIik6IiA8PCBlbmRsOwotCi0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIHByZWZpeCk7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgcHJlZml4KTsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBwcmVmaXgpOwotICAgIH0KLQotICAgIGluZGVudF9kb3duKCk7Ci0KLSAgLy8gUmVhZCBjb250YWluZXIgZW5kCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZE1hcEVuZCgpIiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkU2V0RW5kKCkiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkTGlzdEVuZCgpIiA8PCBlbmRsOwotICB9Ci19Ci0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgY29kZSB0byBkZXNlcmlhbGl6ZSBhIG1hcAotICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgc3RyaW5nIGtleSA9IHRtcCgiX2tleSIpOwotICBzdHJpbmcgdmFsID0gdG1wKCJfdmFsIik7Ci0gIHRfZmllbGQgZmtleSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KTsKLSAgdF9maWVsZCBmdmFsKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2YWwpOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZrZXkpOwotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmdmFsKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgIHByZWZpeCA8PCAiWyIgPDwga2V5IDw8ICJdID0gIiA8PCB2YWwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBXcml0ZSBhIHNldCBlbGVtZW50Ci0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKLSAgdF9maWVsZCBmZWxlbSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgIHByZWZpeCA8PCAiLmFkZCgiIDw8IGVsZW0gPDwgIikiIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogV3JpdGUgYSBsaXN0IGVsZW1lbnQKLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7Ci0gIHRfZmllbGQgZmVsZW0odGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgcHJlZml4IDw8ICIuYXBwZW5kKCIgPDwgZWxlbSA8PCAiKSIgPDwgZW5kbDsKLX0KLQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCB0byBzZXJpYWxpemUKLSAqIEBwYXJhbSBwcmVmaXggTmFtZSB0byBwcmVwZW5kIHRvIGZpZWxkIG5hbWUKLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0KLSAgLy8gRG8gbm90aGluZyBmb3Igdm9pZCB0eXBlcwotICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsKLSAgICAgIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodF9zdHJ1Y3QqKXR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKLQotICAgIHN0cmluZyBuYW1lID0gcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvcHJvdC4iOwotCi0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIHRocm93Ci0gICAgICAgICAgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICBpZiAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpIHx8ICFnZW5fdXRmOHN0cmluZ3NfKSB7Ci0gICAgICAgICAgb3V0IDw8ICJ3cml0ZVN0cmluZygiIDw8IG5hbWUgPDwgIikiOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIG91dCA8PCAid3JpdGVTdHJpbmcoIiA8PCBuYW1lIDw8ICIuZW5jb2RlKCd1dGYtOCcpKSI7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIG91dCA8PCAid3JpdGVCb29sKCIgPDwgbmFtZSA8PCAiKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICBvdXQgPDwgIndyaXRlQnl0ZSgiIDw8IG5hbWUgPDwgIikiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICBvdXQgPDwgIndyaXRlSTE2KCIgPDwgbmFtZSA8PCAiKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgIG91dCA8PCAid3JpdGVJMzIoIiA8PCBuYW1lIDw8ICIpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUk2NCgiIDw8IG5hbWUgPDwgIikiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICBvdXQgPDwgIndyaXRlRG91YmxlKCIgPDwgbmFtZSA8PCAiKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBQeXRob24gbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICBvdXQgPDwgIndyaXRlSTMyKCIgPDwgbmFtZSA8PCAiKSI7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIFNFUklBTElaRSBGSUVMRCAnJXMlcycgVFlQRSAnJXMnXG4iLAotICAgICAgICAgICBwcmVmaXguY19zdHIoKSwKLSAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCi0gICAgICAgICAgIHR5cGUtPmdldF9uYW1lKCkuY19zdHIoKSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIGFsbCB0aGUgbWVtYmVycyBvZiBhIHN0cnVjdC4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IHRvIHNlcmlhbGl6ZQotICogQHBhcmFtIHByZWZpeCAgU3RyaW5nIHByZWZpeCB0byBhdHRhY2ggdG8gYWxsIGZpZWxkcwotICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gICh2b2lkKSB0c3RydWN0OwotICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi53cml0ZShvcHJvdCkiIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvcHJvdC53cml0ZU1hcEJlZ2luKCIgPDwKLSAgICAgIHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgImxlbigiIDw8IHByZWZpeCA8PCAiKSkiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvcHJvdC53cml0ZVNldEJlZ2luKCIgPDwKLSAgICAgIHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgImxlbigiIDw8IHByZWZpeCA8PCAiKSkiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3Byb3Qud3JpdGVMaXN0QmVnaW4oIiA8PAotICAgICAgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgImxlbigiIDw8IHByZWZpeCA8PCAiKSkiIDw8IGVuZGw7Ci0gIH0KLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgc3RyaW5nIGtpdGVyID0gdG1wKCJraXRlciIpOwotICAgIHN0cmluZyB2aXRlciA9IHRtcCgidml0ZXIiKTsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImZvciAiIDw8IGtpdGVyIDw8ICIsIiA8PCB2aXRlciA8PCAiIGluICIgPDwgcHJlZml4IDw8ICIuaXRlbXMoKToiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwga2l0ZXIsIHZpdGVyKTsKLSAgICBpbmRlbnRfZG93bigpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIHN0cmluZyBpdGVyID0gdG1wKCJpdGVyIik7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJmb3IgIiA8PCBpdGVyIDw8ICIgaW4gIiA8PCBwcmVmaXggPDwgIjoiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgaXRlcik7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgc3RyaW5nIGl0ZXIgPSB0bXAoIml0ZXIiKTsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImZvciAiIDw8IGl0ZXIgPDwgIiBpbiAiIDw8IHByZWZpeCA8PCAiOiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIGl0ZXIpOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0KLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvcHJvdC53cml0ZU1hcEVuZCgpIiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3Byb3Qud3JpdGVTZXRFbmQoKSIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvcHJvdC53cml0ZUxpc3RFbmQoKSIgPDwgZW5kbDsKLSAgfQotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBtYXAuCi0gKgotICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBraXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHZpdGVyKSB7Ci0gIHRfZmllbGQga2ZpZWxkKHRtYXAtPmdldF9rZXlfdHlwZSgpLCBraXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZrZmllbGQsICIiKTsKLQotICB0X2ZpZWxkIHZmaWVsZCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdml0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmdmZpZWxkLCAiIik7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIHNldC4KLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0c2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlcikgewotICB0X2ZpZWxkIGVmaWVsZCh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIik7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIGxpc3QuCi0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlcikgewotICB0X2ZpZWxkIGVmaWVsZCh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyB0aGUgZG9jc3RyaW5nIGZvciBhIGdpdmVuIHN0cnVjdC4KLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyhvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgewotICBnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nKG91dCwgdHN0cnVjdCwgdHN0cnVjdCwgIkF0dHJpYnV0ZXMiKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgdGhlIGRvY3N0cmluZyBmb3IgYSBnaXZlbiBmdW5jdGlvbi4KLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyhvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgZ2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyhvdXQsIHRmdW5jdGlvbiwgdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLCAiUGFyYW1ldGVycyIpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyB0aGUgZG9jc3RyaW5nIGZvciBhIHN0cnVjdCBvciBmdW5jdGlvbi4KLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyhvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2RvYyogICAgdGRvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHN1YmhlYWRlcikgewotICBib29sIGhhc19kb2MgPSBmYWxzZTsKLSAgc3RyaW5nc3RyZWFtIHNzOwotICBpZiAodGRvYy0+aGFzX2RvYygpKSB7Ci0gICAgaGFzX2RvYyA9IHRydWU7Ci0gICAgc3MgPDwgdGRvYy0+Z2V0X2RvYygpOwotICB9Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgaWYgKGZpZWxkcy5zaXplKCkgPiAwKSB7Ci0gICAgaWYgKGhhc19kb2MpIHsKLSAgICAgIHNzIDw8IGVuZGw7Ci0gICAgfQotICAgIGhhc19kb2MgPSB0cnVlOwotICAgIHNzIDw8IHN1YmhlYWRlciA8PCAiOlxuIjsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBwX2l0ZXI7Ci0gICAgZm9yIChwX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgcF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytwX2l0ZXIpIHsKLSAgICAgIHRfZmllbGQqIHAgPSAqcF9pdGVyOwotICAgICAgc3MgPDwgIiAtICIgPDwgcC0+Z2V0X25hbWUoKTsKLSAgICAgIGlmIChwLT5oYXNfZG9jKCkpIHsKLSAgICAgICAgc3MgPDwgIjogIiA8PCBwLT5nZXRfZG9jKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzcyA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGlmIChoYXNfZG9jKSB7Ci0gICAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LAotICAgICAgIlwiXCJcIlxuIiwKLSAgICAgICIiLCBzcy5zdHIoKSwKLSAgICAgICJcIlwiXCJcbiIpOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIHRoZSBkb2NzdHJpbmcgZm9yIGEgZ2VuZXJpYyBvYmplY3QuCi0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3B5dGhvbl9kb2NzdHJpbmcob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9kb2MqIHRkb2MpIHsKLSAgaWYgKHRkb2MtPmhhc19kb2MoKSkgewotICAgIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KG91dCwKLSAgICAgICJcIlwiXCJcbiIsCi0gICAgICAiIiwgdGRvYy0+Z2V0X2RvYygpLAotICAgICAgIlwiXCJcIlxuIik7Ci0gIH0KLX0KLQotLyoqCi0gKiBEZWNsYXJlcyBhbiBhcmd1bWVudCwgd2hpY2ggbWF5IGluY2x1ZGUgaW5pdGlhbGl6YXRpb24gYXMgbmVjZXNzYXJ5LgotICoKLSAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkCi0gKi8KLXN0cmluZyB0X3B5X2dlbmVyYXRvcjo6ZGVjbGFyZV9hcmd1bWVudCh0X2ZpZWxkKiB0ZmllbGQpIHsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIHJlc3VsdDsKLSAgcmVzdWx0IDw8IHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiPSI7Ci0gIGlmICh0ZmllbGQtPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKLSAgICByZXN1bHQgPDwgInRocmlmdF9zcGVjWyIgPDwKLSAgICAgIHRmaWVsZC0+Z2V0X2tleSgpIDw8ICJdWzRdIjsKLSAgfSBlbHNlIHsKLSAgICByZXN1bHQgPDwgIk5vbmUiOwotICB9Ci0gIHJldHVybiByZXN1bHQuc3RyKCk7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhIGZpZWxkIGRlZmF1bHQgdmFsdWUsIHJldHVybnMgTm9uZSBvdGhlcndpc2UuCi0gKgotICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQKLSAqLwotc3RyaW5nIHRfcHlfZ2VuZXJhdG9yOjpyZW5kZXJfZmllbGRfZGVmYXVsdF92YWx1ZSh0X2ZpZWxkKiB0ZmllbGQpIHsKLSAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOwotICBpZiAodGZpZWxkLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7Ci0gICAgcmV0dXJuIHJlbmRlcl9jb25zdF92YWx1ZSh0eXBlLCB0ZmllbGQtPmdldF92YWx1ZSgpKTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gIk5vbmUiOwotICB9Ci19Ci0KLS8qKgotICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAndHlwZSBuYW1lKGFyZ3MpJwotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgotICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgotICovCi1zdHJpbmcgdF9weV9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGludGVyZmFjZSkgewotICB2ZWN0b3I8c3RyaW5nPiBwcmU7Ci0gIHZlY3RvcjxzdHJpbmc+IHBvc3Q7Ci0gIHN0cmluZyBzaWduYXR1cmUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiKCI7Ci0KLSAgaWYgKCEoZ2VuX3R3aXN0ZWRfICYmIGludGVyZmFjZSkpIHsKLSAgICBwcmUucHVzaF9iYWNrKCJzZWxmIik7Ci0gIH0KLQotICBzaWduYXR1cmUgKz0gYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCksICZwcmUsICZwb3N0KSArICIpIjsKLSAgcmV0dXJuIHNpZ25hdHVyZTsKLX0KLQotLyoqCi0gKiBSZW5kZXJzIGEgZmllbGQgbGlzdAotICovCi1zdHJpbmcgdF9weV9nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIHZlY3RvcjxzdHJpbmc+ICpwcmUsIHZlY3RvcjxzdHJpbmc+ICpwb3N0KSB7Ci0gIHN0cmluZyByZXN1bHQgPSAiIjsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIHZlY3RvcjxzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBzX2l0ZXI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBpZiAocHJlKSB7Ci0gICAgZm9yIChzX2l0ZXIgPSBwcmUtPmJlZ2luKCk7IHNfaXRlciAhPSBwcmUtPmVuZCgpOyArK3NfaXRlcikgewotICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXN1bHQgKz0gIiwgIjsKLSAgICAgIH0KLSAgICAgIHJlc3VsdCArPSAqc19pdGVyOwotICAgIH0KLSAgfQotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgcmVzdWx0ICs9ICIsICI7Ci0gICAgfQotICAgIHJlc3VsdCArPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gIH0KLSAgaWYgKHBvc3QpIHsKLSAgICBmb3IgKHNfaXRlciA9IHBvc3QtPmJlZ2luKCk7IHNfaXRlciAhPSBwb3N0LT5lbmQoKTsgKytzX2l0ZXIpIHsKLSAgICAgIGlmIChmaXJzdCkgewotICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmVzdWx0ICs9ICIsICI7Ci0gICAgICB9Ci0gICAgICByZXN1bHQgKz0gKnNfaXRlcjsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RyaW5nIHRfcHlfZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSkgewotICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKTsKLSAgaWYgKHR0eXBlLT5pc19zZXJ2aWNlKCkpIHsKLSAgICByZXR1cm4gZ2V0X3JlYWxfcHlfbW9kdWxlKHByb2dyYW0sIGdlbl90d2lzdGVkXykgKyAiLiIgKyB0dHlwZS0+Z2V0X25hbWUoKTsKLSAgfQotICBpZiAocHJvZ3JhbSAhPSBOVUxMICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pIHsKLSAgICByZXR1cm4gZ2V0X3JlYWxfcHlfbW9kdWxlKHByb2dyYW0sIGdlbl90d2lzdGVkXykgKyAiLnR0eXBlcy4iICsgdHR5cGUtPmdldF9uYW1lKCk7Ci0gIH0KLSAgcmV0dXJuIHR0eXBlLT5nZXRfbmFtZSgpOwotfQotCi0vKioKLSAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgUHl0aG9uIHR5b2UKLSAqLwotc3RyaW5nIHRfcHlfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgcmV0dXJuICJUVHlwZS5TVFJJTkciOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIHJldHVybiAiVFR5cGUuQk9PTCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgcmV0dXJuICJUVHlwZS5CWVRFIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIHJldHVybiAiVFR5cGUuSTE2IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIHJldHVybiAiVFR5cGUuSTMyIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJldHVybiAiVFR5cGUuSTY0IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIHJldHVybiAiVFR5cGUuRE9VQkxFIjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZS5JMzIiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLlNUUlVDVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLk1BUCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLlNFVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZS5MSVNUIjsKLSAgfQotCi0gIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotLyoqIFNlZSB0aGUgY29tbWVudCBpbnNpZGUgZ2VuZXJhdGVfcHlfc3RydWN0X2RlZmluaXRpb24gZm9yIHdoYXQgdGhpcyBpcy4gKi8KLXN0cmluZyB0X3B5X2dlbmVyYXRvcjo6dHlwZV90b19zcGVjX2FyZ3ModF90eXBlKiB0dHlwZSkgewotICB3aGlsZSAodHR5cGUtPmlzX3R5cGVkZWYoKSkgewotICAgIHR0eXBlID0gKCh0X3R5cGVkZWYqKXR0eXBlKS0+Z2V0X3R5cGUoKTsKLSAgfQotCi0gIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAiTm9uZSI7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgcmV0dXJuICIoIiArIHR5cGVfbmFtZSh0dHlwZSkgKyAiLCAiICsgdHlwZV9uYW1lKHR0eXBlKSArICIudGhyaWZ0X3NwZWMpIjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gIigiICsKLSAgICAgIHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKSArICIsIiArCi0gICAgICB0eXBlX3RvX3NwZWNfYXJncygoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKSArICIsIiArCi0gICAgICB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgKyAiLCIgKwotICAgICAgdHlwZV90b19zcGVjX2FyZ3MoKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgKwotICAgICAgIikiOwotCi0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgcmV0dXJuICIoIiArCi0gICAgICB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpICsgIiwiICsKLSAgICAgIHR5cGVfdG9fc3BlY19hcmdzKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSArCi0gICAgICAiKSI7Ci0KLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgcmV0dXJuICIoIiArCi0gICAgICB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSArICIsIiArCi0gICAgICB0eXBlX3RvX3NwZWNfYXJncygoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpICsKLSAgICAgICIpIjsKLSAgfQotCi0gIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19zcGVjX2FyZ3M6ICIgKyB0dHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotCi1USFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKHB5LCAiUHl0aG9uIiwKLSIgICAgbmV3X3N0eWxlOiAgICAgICBHZW5lcmF0ZSBuZXctc3R5bGUgY2xhc3Nlcy5cbiIgXAotIiAgICB0d2lzdGVkOiAgICAgICAgIEdlbmVyYXRlIFR3aXN0ZWQtZnJpZW5kbHkgUlBDIHNlcnZpY2VzLlxuIiBcCi0iICAgIHRvcm5hZG86ICAgICAgICAgR2VuZXJhdGUgY29kZSBmb3IgdXNlIHdpdGggVG9ybmFkby5cbiIgXAotIiAgICB1dGY4c3RyaW5nczogICAgIEVuY29kZS9kZWNvZGUgc3RyaW5ncyB1c2luZyB1dGY4IGluIHRoZSBnZW5lcmF0ZWQgY29kZS5cbiIgXAotIiAgICBzbG90czogICAgICAgICAgIEdlbmVyYXRlIGNvZGUgdXNpbmcgc2xvdHMgZm9yIGluc3RhbmNlIG1lbWJlcnMuXG4iIFwKLSIgICAgZHluYW1pYzogICAgICAgICBHZW5lcmF0ZSBkeW5hbWljIGNvZGUsIGxlc3MgY29kZSBnZW5lcmF0ZWQgYnV0IHNsb3dlci5cbiIgXAotIiAgICBkeW5iYXNlPUNMUyAgICAgIERlcml2ZSBnZW5lcmF0ZWQgY2xhc3NlcyBmcm9tIGNsYXNzIENMUyBpbnN0ZWFkIG9mIFRCYXNlLlxuIiBcCi0iICAgIGR5bmV4Yz1DTFMgICAgICAgRGVyaXZlIGdlbmVyYXRlZCBleGNlcHRpb25zIGZyb20gQ0xTIGluc3RlYWQgb2YgVEV4Y2VwdGlvbkJhc2UuXG4iIFwKLSIgICAgZHluaW1wb3J0PSdmcm9tIGZvby5iYXIgaW1wb3J0IENMUydcbiIgXAotIiAgICAgICAgICAgICAgICAgICAgIEFkZCBhbiBpbXBvcnQgbGluZSB0byBnZW5lcmF0ZWQgY29kZSB0byBmaW5kIHRoZSBkeW5iYXNlIGNsYXNzLlxuIikKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9yYl9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfcmJfZ2VuZXJhdG9yLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2ZjMGIxLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9yYl9nZW5lcmF0b3IuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMjY5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KLSAqIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCi0gKiBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8ZnN0cmVhbT4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSA8YWxnb3JpdGhtPgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzc3RyZWFtPgotCi0jaW5jbHVkZSAidF9vb3BfZ2VuZXJhdG9yLmgiCi0jaW5jbHVkZSAicGxhdGZvcm0uaCIKLSNpbmNsdWRlICJ2ZXJzaW9uLmgiCi0KLXVzaW5nIHN0ZDo6bWFwOwotdXNpbmcgc3RkOjpvZnN0cmVhbTsKLXVzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKLXVzaW5nIHN0ZDo6c3RyaW5nOwotdXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07Ci11c2luZyBzdGQ6OnZlY3RvcjsKLQotc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsID0gIlxuIjsgIC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKLQotLyoqCi0gKiBBIHN1YmNsYXNzIG9mIHN0ZDo6b2ZzdHJlYW0gdGhhdCBpbmNsdWRlcyBpbmRlbnRpbmcgZnVuY3Rpb25hbGl0eS4KLSAqLwotY2xhc3MgdF9yYl9vZnN0cmVhbSA6IHB1YmxpYyBzdGQ6Om9mc3RyZWFtIHsKLSAgcHJpdmF0ZToKLSAgICBpbnQgaW5kZW50XzsKLQotICBwdWJsaWM6Ci0gICAgdF9yYl9vZnN0cmVhbSgpIDogc3RkOjpvZnN0cmVhbSgpLCBpbmRlbnRfKDApIHsgfQotICAgIGV4cGxpY2l0IHRfcmJfb2ZzdHJlYW0oY29uc3QgY2hhciogZmlsZW5hbWUsIGlvc19iYXNlOjpvcGVubW9kZSBtb2RlID0gaW9zX2Jhc2U6Om91dCwgaW50IGluZGVudCA9IDApIDoKLSAgICAgIHN0ZDo6b2ZzdHJlYW0oZmlsZW5hbWUsIG1vZGUpLCBpbmRlbnRfKGluZGVudCkgeyB9Ci0KLSAgdF9yYl9vZnN0cmVhbSYgaW5kZW50KCkgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5kZW50XzsgKytpKSB7ICp0aGlzIDw8ICIgICI7IH0KLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICB2b2lkIGluZGVudF91cCgpIHsgaW5kZW50XysrOyB9Ci0gIHZvaWQgaW5kZW50X2Rvd24oKSB7IGluZGVudF8tLTsgfQotfTsKLQotLyoqCi0gKiBSdWJ5IGNvZGUgZ2VuZXJhdG9yLgotICoKLSAqLwotY2xhc3MgdF9yYl9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKLSBwdWJsaWM6Ci0gIHRfcmJfZ2VuZXJhdG9yKAotICAgICAgdF9wcm9ncmFtKiBwcm9ncmFtLAotICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKLSAgICA6IHRfb29wX2dlbmVyYXRvcihwcm9ncmFtKQotICB7Ci0gICAgKHZvaWQpIG9wdGlvbl9zdHJpbmc7Ci0gICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tcmIiOwotCi0gICAgcmVxdWlyZV9ydWJ5Z2Vtc18gPSAocGFyc2VkX29wdGlvbnMuZmluZCgicnVieWdlbXMiKSAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7Ci0gICAgbmFtZXNwYWNlZF8gPSAocGFyc2VkX29wdGlvbnMuZmluZCgibmFtZXNwYWNlZCIpICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLSAgfQotCi0gIC8qKgotICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCi0gICAqLwotCi0gIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKLSAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKLQotICAvKioKLSAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYgICAgICh0X3R5cGVkZWYqICB0dHlwZWRlZik7Ci0gIHZvaWQgZ2VuZXJhdGVfZW51bSAgICAgICAgKHRfZW51bSogICAgIHRlbnVtKTsKLSAgdm9pZCBnZW5lcmF0ZV9jb25zdCAgICAgICAodF9jb25zdCogICAgdGNvbnN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QgICAgICAodF9zdHJ1Y3QqICAgdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfdW5pb24gICAgICAgICh0X3N0cnVjdCogICB0dW5pb24pOwotICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uICAgICh0X3N0cnVjdCogICB0eGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UgICAgICh0X3NlcnZpY2UqICB0c2VydmljZSk7Ci0KLSAgdF9yYl9vZnN0cmVhbSYgcmVuZGVyX2NvbnN0X3ZhbHVlKHRfcmJfb2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFN0cnVjdCBnZW5lcmF0aW9uIGNvZGUKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9yYl9zdHJ1Y3QodF9yYl9vZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX3JiX3N0cnVjdF9yZXF1aXJlZF92YWxpZGF0b3IodF9yYl9vZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfcmJfdW5pb24odF9yYl9vZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX3JiX3VuaW9uX3ZhbGlkYXRvcih0X3JiX29mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9yYl9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfcmJfc2ltcGxlX2NvbnN0cnVjdG9yKHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3JiX3NpbXBsZV9leGNlcHRpb25fY29uc3RydWN0b3IodF9yYl9vZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfZmllbGRfY29uc3RhbnRzICh0X3JiX29mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9maWVsZF9jb25zdHJ1Y3RvcnMgKHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2ZpZWxkX2RlZm5zICh0X3JiX29mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9maWVsZF9kYXRhICAodF9yYl9vZnN0cmVhbSYgb3V0LCB0X3R5cGUqIGZpZWxkX3R5cGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWVsZF9uYW1lLCB0X2NvbnN0X3ZhbHVlKiBmaWVsZF92YWx1ZSwgYm9vbCBvcHRpb25hbCk7Ci0KLSAgLyoqCi0gICAqIFNlcnZpY2UtbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnMgICAodF9zZXJ2aWNlKiAgdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCAgICAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIgICAgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24gICh0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotCi0gIC8qKgotICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZCAgICAgICAgKHRfcmJfb2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqICAgIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbGFzcz1mYWxzZSk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3QgICAgICAgKHRfcmJfb2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiAgIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyICAgICh0X3JiX29mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqICAgICB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudCAgKHRfcmJfb2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiAgICAgIHRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQgICh0X3JiX29mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogICAgICB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudCAodF9yYl9vZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiAgICAgdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkICAgICAgICAgICh0X3JiX29mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiAgICB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdCAgICAgICAgICh0X3JiX29mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogICB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIgICAgICAodF9yYl9vZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiAgICAgdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50ICAgICh0X3JiX29mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogICAgICB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcga2l0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB2aXRlcik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQgICAgKHRfcmJfb2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiAgICAgIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQgICAodF9yYl9vZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiAgICAgdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyKTsKLQotICB2b2lkIGdlbmVyYXRlX3Jkb2MgICAgICAgICAgICAgICAgICAgICAodF9yYl9vZnN0cmVhbSYgb3V0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZG9jKiB0ZG9jKTsKLQotICAvKioKLSAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKLSAgICovCi0KLSAgc3RkOjpzdHJpbmcgcmJfYXV0b2dlbl9jb21tZW50KCk7Ci0gIHN0ZDo6c3RyaW5nIHJlbmRlcl9yZXF1aXJlX3RocmlmdCgpOwotICBzdGQ6OnN0cmluZyByZW5kZXJfaW5jbHVkZXMoKTsKLSAgc3RkOjpzdHJpbmcgZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQpOwotICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSk7Ci0gIHN0ZDo6c3RyaW5nIGZ1bGxfdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpOwotICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KTsKLSAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOwotICBzdGQ6OnN0cmluZyByYl9uYW1lc3BhY2VfdG9fcGF0aF9wcmVmaXgoc3RkOjpzdHJpbmcgcmJfbmFtZXNwYWNlKTsKLQotCi0gIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBydWJ5X21vZHVsZXModF9wcm9ncmFtKiBwKSB7Ci0gICAgc3RkOjpzdHJpbmcgbnMgPSBwLT5nZXRfbmFtZXNwYWNlKCJyYiIpOwotICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBtb2R1bGVzOwotICAgIGlmIChucy5lbXB0eSgpKSB7Ci0gICAgICByZXR1cm4gbW9kdWxlczsKLSAgICB9Ci0KLSAgICBzdGQ6OnN0cmluZzo6aXRlcmF0b3IgcG9zID0gbnMuYmVnaW4oKTsKLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgc3RkOjpzdHJpbmc6Oml0ZXJhdG9yIGRlbGltID0gc3RkOjpmaW5kKHBvcywgbnMuZW5kKCksICcuJyk7Ci0gICAgICBtb2R1bGVzLnB1c2hfYmFjayhjYXBpdGFsaXplKHN0ZDo6c3RyaW5nKHBvcywgZGVsaW0pKSk7Ci0gICAgICBwb3MgPSBkZWxpbTsKLSAgICAgIGlmIChwb3MgPT0gbnMuZW5kKCkpIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICArK3BvczsKLSAgICB9Ci0KLSAgICByZXR1cm4gbW9kdWxlczsKLSAgfQotCi0gIHZvaWQgYmVnaW5fbmFtZXNwYWNlKHRfcmJfb2ZzdHJlYW0mLCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4pOwotICB2b2lkIGVuZF9uYW1lc3BhY2UodF9yYl9vZnN0cmVhbSYsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPik7Ci0KLSBwcml2YXRlOgotCi0gIC8qKgotICAgKiBGaWxlIHN0cmVhbXMKLSAgICovCi0KLSAgdF9yYl9vZnN0cmVhbSBmX3R5cGVzXzsKLSAgdF9yYl9vZnN0cmVhbSBmX2NvbnN0c187Ci0gIHRfcmJfb2ZzdHJlYW0gZl9zZXJ2aWNlXzsKLQotICBzdGQ6OnN0cmluZyBuYW1lc3BhY2VfZGlyXzsKLSAgc3RkOjpzdHJpbmcgcmVxdWlyZV9wcmVmaXhfOwotCi0gIC8qKiBJZiB0cnVlLCBhZGQgYSAicmVxdWlyZSAncnVieWdlbXMnIiBsaW5lIHRvIHRoZSB0b3Agb2YgZWFjaCBnZW4tcmIgZmlsZS4gKi8KLSAgYm9vbCByZXF1aXJlX3J1YnlnZW1zXzsKLQotICAvKiogSWYgdHJ1ZSwgZ2VuZXJhdGUgZmlsZXMgaW4gaWRpb21hdGljIG5hbWVzcGFjZWQgZGlyZWN0b3JpZXMuICovCi0gIGJvb2wgbmFtZXNwYWNlZF87Ci19OwotCi0KLS8qKgotICogUHJlcGFyZXMgZm9yIGZpbGUgZ2VuZXJhdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBuZWNlc3NhcnkgZmlsZSBvdXRwdXQKLSAqIHN0cmVhbXMuCi0gKgotICogQHBhcmFtIHRwcm9ncmFtIFRoZSBwcm9ncmFtIHRvIGdlbmVyYXRlCi0gKi8KLXZvaWQgdF9yYl9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgewotICBzdHJpbmcgc3ViZGlyID0gZ2V0X291dF9kaXIoKTsKLQotICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKLSAgTUtESVIoc3ViZGlyLmNfc3RyKCkpOwotCi0gIGlmIChuYW1lc3BhY2VkXykgewotICAgIHJlcXVpcmVfcHJlZml4XyA9IHJiX25hbWVzcGFjZV90b19wYXRoX3ByZWZpeChwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgicmIiKSk7Ci0KLSAgICBzdHJpbmcgZGlyID0gcmVxdWlyZV9wcmVmaXhfOwotICAgIHN0cmluZzo6c2l6ZV90eXBlIGxvYzsKLQotICAgIHdoaWxlICgobG9jID0gZGlyLmZpbmQoIi8iKSkgIT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgICBzdWJkaXIgPSBzdWJkaXIgKyBkaXIuc3Vic3RyKDAsIGxvYykgKyAiLyI7Ci0gICAgICBNS0RJUihzdWJkaXIuY19zdHIoKSk7Ci0gICAgICBkaXIgPSBkaXIuc3Vic3RyKGxvYysxKTsKLSAgICB9Ci0gIH0KLQotICBuYW1lc3BhY2VfZGlyXyA9IHN1YmRpcjsKLQotICAvLyBNYWtlIG91dHB1dCBmaWxlCi0gIHN0cmluZyBmX3R5cGVzX25hbWUgPSBuYW1lc3BhY2VfZGlyXyt1bmRlcnNjb3JlKHByb2dyYW1fbmFtZV8pKyJfdHlwZXMucmIiOwotICBmX3R5cGVzXy5vcGVuKGZfdHlwZXNfbmFtZS5jX3N0cigpKTsKLQotICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IG5hbWVzcGFjZV9kaXJfK3VuZGVyc2NvcmUocHJvZ3JhbV9uYW1lXykrIl9jb25zdGFudHMucmIiOwotICBmX2NvbnN0c18ub3BlbihmX2NvbnN0c19uYW1lLmNfc3RyKCkpOwotCi0gIC8vIFByaW50IGhlYWRlcgotICBmX3R5cGVzXyA8PAotICAgIHJiX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGwgPDwgcmVuZGVyX3JlcXVpcmVfdGhyaWZ0KCkgPDwKLSAgICByZW5kZXJfaW5jbHVkZXMoKSA8PCBlbmRsOwotICAgIGJlZ2luX25hbWVzcGFjZShmX3R5cGVzXywgcnVieV9tb2R1bGVzKHByb2dyYW1fKSk7Ci0KLSAgZl9jb25zdHNfIDw8Ci0gICAgcmJfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbCA8PCByZW5kZXJfcmVxdWlyZV90aHJpZnQoKSA8PAotICAgICJyZXF1aXJlICciIDw8IHJlcXVpcmVfcHJlZml4XyA8PCB1bmRlcnNjb3JlKHByb2dyYW1fbmFtZV8pIDw8ICJfdHlwZXMnIiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLSAgICBiZWdpbl9uYW1lc3BhY2UoZl9jb25zdHNfLCBydWJ5X21vZHVsZXMocHJvZ3JhbV8pKTsKLQotfQotCi0vKioKLSAqIFJlbmRlcnMgdGhlIHJlcXVpcmUgb2YgdGhyaWZ0IGl0c2VsZiwgYW5kIHBvc3NpYmx5IG9mIHRoZSBydWJ5Z2VtcyBkZXBlbmRlbmN5LgotICovCi1zdHJpbmcgdF9yYl9nZW5lcmF0b3I6OnJlbmRlcl9yZXF1aXJlX3RocmlmdCgpIHsKLSAgaWYgKHJlcXVpcmVfcnVieWdlbXNfKSB7Ci0gICAgcmV0dXJuICJyZXF1aXJlICdydWJ5Z2VtcydcbnJlcXVpcmUgJ3RocmlmdCdcbiI7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuICJyZXF1aXJlICd0aHJpZnQnXG4iOwotICB9Ci19Ci0KLS8qKgotICogUmVuZGVycyBhbGwgdGhlIGltcG9ydHMgbmVjZXNzYXJ5IGZvciBpbmNsdWRpbmcgYW5vdGhlciBUaHJpZnQgcHJvZ3JhbQotICovCi1zdHJpbmcgdF9yYl9nZW5lcmF0b3I6OnJlbmRlcl9pbmNsdWRlcygpIHsKLSAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+JiBpbmNsdWRlcyA9IHByb2dyYW1fLT5nZXRfaW5jbHVkZXMoKTsKLSAgc3RyaW5nIHJlc3VsdCA9ICIiOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluY2x1ZGVzLnNpemUoKTsgKytpKSB7Ci0gICAgdF9wcm9ncmFtKiBpbmNsdWRlZCA9IGluY2x1ZGVzW2ldOwotICAgIHN0ZDo6c3RyaW5nIGluY2x1ZGVkX3JlcXVpcmVfcHJlZml4ID0gcmJfbmFtZXNwYWNlX3RvX3BhdGhfcHJlZml4KGluY2x1ZGVkLT5nZXRfbmFtZXNwYWNlKCJyYiIpKTsKLSAgICBzdGQ6OnN0cmluZyBpbmNsdWRlZF9uYW1lID0gaW5jbHVkZWQtPmdldF9uYW1lKCk7Ci0gICAgcmVzdWx0ICs9ICJyZXF1aXJlICciICsgaW5jbHVkZWRfcmVxdWlyZV9wcmVmaXggKyB1bmRlcnNjb3JlKGluY2x1ZGVkX25hbWUpICsgIl90eXBlcydcbiI7Ci0gIH0KLSAgaWYgKGluY2x1ZGVzLnNpemUoKSA+IDApIHsKLSAgICByZXN1bHQgKz0gIlxuIjsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioKLSAqIEF1dG9nZW4nZCBjb21tZW50Ci0gKi8KLXN0cmluZyB0X3JiX2dlbmVyYXRvcjo6cmJfYXV0b2dlbl9jb21tZW50KCkgewotICByZXR1cm4KLSAgICBzdGQ6OnN0cmluZygiI1xuIikgKwotICAgICIjIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgiICsgVEhSSUZUX1ZFUlNJT04gKyAiKVxuIiArCi0gICAgIiNcbiIgKwotICAgICIjIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkdcbiIgKwotICAgICIjXG4iOwotfQotCi0vKioKLSAqIENsb3NlcyB0aGUgdHlwZSBmaWxlcwotICovCi12b2lkIHRfcmJfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7Ci0gIC8vIENsb3NlIHR5cGVzIGZpbGUKLSAgZW5kX25hbWVzcGFjZShmX3R5cGVzXywgcnVieV9tb2R1bGVzKHByb2dyYW1fKSk7Ci0gIGVuZF9uYW1lc3BhY2UoZl9jb25zdHNfLCBydWJ5X21vZHVsZXMocHJvZ3JhbV8pKTsKLSAgZl90eXBlc18uY2xvc2UoKTsKLSAgZl9jb25zdHNfLmNsb3NlKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgdHlwZWRlZi4gVGhpcyBpcyBub3QgZG9uZSBpbiBSdWJ5LCB0eXBlcyBhcmUgYWxsIGltcGxpY2l0LgotICoKLSAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgewotICAodm9pZCkgdHR5cGVkZWY7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGNvZGUgZm9yIGFuIGVudW1lcmF0ZWQgdHlwZS4gRG9uZSB1c2luZyBhIGNsYXNzIHRvIHNjb3BlCi0gKiB0aGUgdmFsdWVzLgotICoKLSAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KLSAqLwotdm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7Ci0gIGZfdHlwZXNfLmluZGVudCgpIDw8Ci0gICAgIm1vZHVsZSAiIDw8IGNhcGl0YWxpemUodGVudW0tPmdldF9uYW1lKCkpIDw8IGVuZGw7Ci0gIGZfdHlwZXNfLmluZGVudF91cCgpOwotCi0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOwotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOwotCi0gICAgLy8gUnVieSBjbGFzcyBjb25zdGFudHMgaGF2ZSB0byBiZSBjYXBpdGFsaXplZC4uLiBvbWcgaSBhbSBzbyBvbiB0aGUgZmVuY2UKLSAgICAvLyBhYm91dCBsYW5ndWFnZXMgc3RyaWN0bHkgZW5mb3JjaW5nIGNhcGl0YWxpemF0aW9uIHdoeSBjYW4ndCB3ZSBqdXN0IGFsbAotICAgIC8vIGFncmVlIGFuZCBwbGF5IG5pY2UuCi0gICAgc3RyaW5nIG5hbWUgPSBjYXBpdGFsaXplKCgqY19pdGVyKS0+Z2V0X25hbWUoKSk7Ci0KLSAgICBnZW5lcmF0ZV9yZG9jKGZfdHlwZXNfLCAqY19pdGVyKTsKLSAgICBmX3R5cGVzXy5pbmRlbnQoKSA8PCBuYW1lIDw8ICIgPSAiIDw8IHZhbHVlIDw8IGVuZGw7Ci0gIH0KLSAgCi0gIC8vIENyZWF0ZSBhIGhhc2ggbWFwcGluZyB2YWx1ZXMgYmFjayB0byB0aGVpciBuYW1lcyAoYXMgc3RyaW5ncykgc2luY2UgcnVieSBoYXMgbm8gbmF0aXZlIGVudW0gdHlwZQotICBmX3R5cGVzXy5pbmRlbnQoKSA8PCAiVkFMVUVfTUFQID0geyI7Ci0gIGZvcihjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICAvLyBQb3B1bGF0ZSB0aGUgaGFzaAotICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0gICAgaWYgKGNfaXRlciAhPSBjb25zdGFudHMuYmVnaW4oKSkgZl90eXBlc18gPDwgIiwgIjsKLSAgICBmX3R5cGVzXyA8PCB2YWx1ZSA8PCAiID0+IFwiIiA8PCBjYXBpdGFsaXplKCgqY19pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIlwiIjsKLSAgfQotICBmX3R5cGVzXyA8PCAifSIgPDwgZW5kbDsKLSAgCi0gIC8vIENyZWF0ZSBhIHNldCB3aXRoIHZhbGlkIHZhbHVlcyBmb3IgdGhpcyBlbnVtCi0gIGZfdHlwZXNfLmluZGVudCgpIDw8ICJWQUxJRF9WQUxVRVMgPSBTZXQubmV3KFsiOwotICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgewotICAgIC8vIFBvcHVsYXRlIHRoZSBzZXQKLSAgICBpZiAoY19pdGVyICE9IGNvbnN0YW50cy5iZWdpbigpKSBmX3R5cGVzXyA8PCAiLCAiOwotICAgIGZfdHlwZXNfIDw8IGNhcGl0YWxpemUoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLSAgfQotICBmX3R5cGVzXyA8PCAiXSkuZnJlZXplIiA8PCBlbmRsOwotCi0gIGZfdHlwZXNfLmluZGVudF9kb3duKCk7Ci0gIGZfdHlwZXNfLmluZGVudCgpIDw8Ci0gICAgImVuZCIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlIGEgY29uc3RhbnQgdmFsdWUKLSAqLwotdm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KSB7Ci0gIHRfdHlwZSogdHlwZSA9IHRjb25zdC0+Z2V0X3R5cGUoKTsKLSAgc3RyaW5nIG5hbWUgPSB0Y29uc3QtPmdldF9uYW1lKCk7Ci0gIHRfY29uc3RfdmFsdWUqIHZhbHVlID0gdGNvbnN0LT5nZXRfdmFsdWUoKTsKLQotICBuYW1lWzBdID0gdG91cHBlcihuYW1lWzBdKTsKLQotICBmX2NvbnN0c18uaW5kZW50KCkgPDwgbmFtZSA8PCAiID0gIjsKLSAgcmVuZGVyX2NvbnN0X3ZhbHVlKGZfY29uc3RzXywgdHlwZSwgdmFsdWUpIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBQcmludHMgdGhlIHZhbHVlIG9mIGEgY29uc3RhbnQgd2l0aCB0aGUgZ2l2ZW4gdHlwZS4gTm90ZSB0aGF0IHR5cGUgY2hlY2tpbmcKLSAqIGlzIE5PVCBwZXJmb3JtZWQgaW4gdGhpcyBmdW5jdGlvbiBhcyBpdCBpcyBhbHdheXMgcnVuIGJlZm9yZWhhbmQgdXNpbmcgdGhlCi0gKiB2YWxpZGF0ZV90eXBlcyBtZXRob2QgaW4gbWFpbi5jYwotICovCi10X3JiX29mc3RyZWFtJiB0X3JiX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKHRfcmJfb2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIG91dCA8PCAiJXFcIiIgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICBvdXQgPDwgKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgewotICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgb3V0LmluZGVudCgpIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBvdXQgPDwgZnVsbF90eXBlX25hbWUodHlwZSkgPDwgIi5uZXcoeyIgPDwgZW5kbDsKLSAgICBvdXQuaW5kZW50X3VwKCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7Ci0gICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgewotICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKLSAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKLSAgICAgIH0KLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIGdfdHlwZV9zdHJpbmcsIHZfaXRlci0+Zmlyc3QpIDw8ICIgPT4gIjsKLSAgICAgIHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKSA8PCAiLCIgPDwgZW5kbDsKLSAgICB9Ci0gICAgb3V0LmluZGVudF9kb3duKCk7Ci0gICAgb3V0LmluZGVudCgpIDw8ICJ9KSI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOwotICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0gICAgb3V0IDw8ICJ7IiA8PCBlbmRsOwotICAgIG91dC5pbmRlbnRfdXAoKTsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBrdHlwZSwgdl9pdGVyLT5maXJzdCkgPDwgIiA9PiAiOwotICAgICAgcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgdnR5cGUsIHZfaXRlci0+c2Vjb25kKSA8PCAiLCIgPDwgZW5kbDsKLSAgICB9Ci0gICAgb3V0LmluZGVudF9kb3duKCk7Ci0gICAgb3V0LmluZGVudCgpIDw8ICJ9IjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKLSAgICB0X3R5cGUqIGV0eXBlOwotICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB9Ci0gICAgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgICBvdXQgPDwgIlNldC5uZXcoWyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgb3V0IDw8ICJbIiA8PCBlbmRsOwotICAgIH0KLSAgICBvdXQuaW5kZW50X3VwKCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7Ci0gICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBldHlwZSwgKnZfaXRlcikgPDwgIiwiIDw8IGVuZGw7Ci0gICAgfQotICAgIG91dC5pbmRlbnRfZG93bigpOwotICAgIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgICAgb3V0LmluZGVudCgpIDw8ICJdKSI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dC5pbmRlbnQoKSA8PCAiXSI7Ci0gICAgfQotICB9IGVsc2UgewotICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgQ09OU1RBTlQgRk9SIFRZUEU6ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotICB9Ci0gIHJldHVybiBvdXQ7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgcnVieSBzdHJ1Y3QKLSAqLwotdm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGlmICh0c3RydWN0LT5pc191bmlvbigpKSB7Ci0gICAgZ2VuZXJhdGVfcmJfdW5pb24oZl90eXBlc18sIHRzdHJ1Y3QsIGZhbHNlKTsKLSAgfSBlbHNlIHsKLSAgICBnZW5lcmF0ZV9yYl9zdHJ1Y3QoZl90eXBlc18sIHRzdHJ1Y3QsIGZhbHNlKTsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBleGNlcHRpb24uIEJhc2ljYWxseSB0aGUgc2FtZQotICogYXMgYSBzdHJ1Y3QgYnV0IGV4dGVuZHMgdGhlIEV4Y2VwdGlvbiBjbGFzcy4KLSAqCi0gKiBAcGFyYW0gdHhjZXB0aW9uIFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7Ci0gIGdlbmVyYXRlX3JiX3N0cnVjdChmX3R5cGVzXywgdHhjZXB0aW9uLCB0cnVlKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBydWJ5IHN0cnVjdAotICovCi12b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yYl9zdHJ1Y3QodF9yYl9vZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24gPSBmYWxzZSkgewotICBnZW5lcmF0ZV9yZG9jKG91dCwgdHN0cnVjdCk7Ci0gIG91dC5pbmRlbnQoKSA8PCAiY2xhc3MgIiA8PCB0eXBlX25hbWUodHN0cnVjdCk7Ci0gIGlmIChpc19leGNlcHRpb24pIHsKLSAgICBvdXQgPDwgIiA8IDo6VGhyaWZ0OjpFeGNlcHRpb24iOwotICB9Ci0gIG91dCA8PCBlbmRsOwotCi0gIG91dC5pbmRlbnRfdXAoKTsKLSAgb3V0LmluZGVudCgpIDw8ICJpbmNsdWRlIDo6VGhyaWZ0OjpTdHJ1Y3QsIDo6VGhyaWZ0OjpTdHJ1Y3RfVW5pb24iIDw8IGVuZGw7Ci0KLSAgaWYgKGlzX2V4Y2VwdGlvbikgewotICAgIGdlbmVyYXRlX3JiX3NpbXBsZV9leGNlcHRpb25fY29uc3RydWN0b3Iob3V0LCB0c3RydWN0KTsKLSAgfQotCi0gIGdlbmVyYXRlX2ZpZWxkX2NvbnN0YW50cyhvdXQsIHRzdHJ1Y3QpOwotICBnZW5lcmF0ZV9maWVsZF9kZWZucyhvdXQsIHRzdHJ1Y3QpOwotICBnZW5lcmF0ZV9yYl9zdHJ1Y3RfcmVxdWlyZWRfdmFsaWRhdG9yKG91dCwgdHN0cnVjdCk7Ci0KLSAgb3V0LmluZGVudCgpIDw8ICI6OlRocmlmdDo6U3RydWN0LmdlbmVyYXRlX2FjY2Vzc29ycyBzZWxmIiA8PCBlbmRsOwotCi0gIG91dC5pbmRlbnRfZG93bigpOwotICBvdXQuaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0KLS8qKgotICogR2VuZXJhdGVzIGEgcnVieSB1bmlvbgotICovCi12b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yYl91bmlvbih0X3JiX29mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbiA9IGZhbHNlKSB7Ci0gICh2b2lkKSBpc19leGNlcHRpb247Ci0gIGdlbmVyYXRlX3Jkb2Mob3V0LCB0c3RydWN0KTsKLSAgb3V0LmluZGVudCgpIDw8ICJjbGFzcyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiIDwgOjpUaHJpZnQ6OlVuaW9uIiA8PCBlbmRsOwotCi0gIG91dC5pbmRlbnRfdXAoKTsKLSAgb3V0LmluZGVudCgpIDw8ICJpbmNsdWRlIDo6VGhyaWZ0OjpTdHJ1Y3RfVW5pb24iIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfZmllbGRfY29uc3RydWN0b3JzKG91dCwgdHN0cnVjdCk7Ci0KLSAgZ2VuZXJhdGVfZmllbGRfY29uc3RhbnRzKG91dCwgdHN0cnVjdCk7Ci0gIGdlbmVyYXRlX2ZpZWxkX2RlZm5zKG91dCwgdHN0cnVjdCk7Ci0gIGdlbmVyYXRlX3JiX3VuaW9uX3ZhbGlkYXRvcihvdXQsIHRzdHJ1Y3QpOwotCi0gIG91dC5pbmRlbnQoKSA8PCAiOjpUaHJpZnQ6OlVuaW9uLmdlbmVyYXRlX2FjY2Vzc29ycyBzZWxmIiA8PCBlbmRsOwotCi0gIG91dC5pbmRlbnRfZG93bigpOwotICBvdXQuaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi12b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9maWVsZF9jb25zdHJ1Y3RvcnModF9yYl9vZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotCi0gIG91dC5pbmRlbnQoKSA8PCAiY2xhc3MgPDwgc2VsZiIgPDwgZW5kbDsKLSAgb3V0LmluZGVudF91cCgpOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmX2l0ZXIgIT0gZmllbGRzLmJlZ2luKCkpIHsKLSAgICAgIG91dCA8PCBlbmRsOwotICAgIH0KLSAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotCi0gICAgb3V0LmluZGVudCgpIDw8ICJkZWYgIiA8PCBmaWVsZF9uYW1lIDw8ICIodmFsKSIgPDwgZW5kbDsKLSAgICBvdXQuaW5kZW50KCkgPDwgIiAgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIubmV3KDoiIDw8IGZpZWxkX25hbWUgPDwgIiwgdmFsKSIgPDwgZW5kbDsKLSAgICBvdXQuaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbDsKLSAgfQotICAKLSAgb3V0LmluZGVudF9kb3duKCk7Ci0gIG91dC5pbmRlbnQoKSA8PCAiZW5kIiA8PCBlbmRsOwotCi0gIG91dCA8PCBlbmRsOwotfQotCi12b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yYl9zaW1wbGVfZXhjZXB0aW9uX2NvbnN0cnVjdG9yKHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0KLSAgaWYgKG1lbWJlcnMuc2l6ZSgpID09IDEpIHsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7Ci0KLSAgICBpZiAoKCptX2l0ZXIpLT5nZXRfdHlwZSgpLT5pc19zdHJpbmcoKSkgewotICAgICAgc3RyaW5nIG5hbWUgPSAoKm1faXRlciktPmdldF9uYW1lKCk7Ci0KLSAgICAgIG91dC5pbmRlbnQoKSA8PCAiZGVmIGluaXRpYWxpemUobWVzc2FnZT1uaWwpIiA8PCBlbmRsOwotICAgICAgb3V0LmluZGVudF91cCgpOwotICAgICAgb3V0LmluZGVudCgpIDw8ICJzdXBlcigpIiA8PCBlbmRsOwotICAgICAgb3V0LmluZGVudCgpIDw8ICJzZWxmLiIgPDwgbmFtZSA8PCAiID0gbWVzc2FnZSIgPDwgZW5kbDsKLSAgICAgIG91dC5pbmRlbnRfZG93bigpOwotICAgICAgb3V0LmluZGVudCgpIDw8ICJlbmQiIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgICAgaWYgKG5hbWUgIT0gIm1lc3NhZ2UiKSB7Ci0gICAgICAgIG91dC5pbmRlbnQoKSA8PCAiZGVmIG1lc3NhZ2U7ICIgPDwgbmFtZSA8PCAiIGVuZCIgPDwgZW5kbCA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi12b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9maWVsZF9jb25zdGFudHModF9yYl9vZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIHN0ZDo6c3RyaW5nIGNhcF9maWVsZF9uYW1lID0gdXBjYXNlX3N0cmluZyhmaWVsZF9uYW1lKTsKLSAgICAKLSAgICBvdXQuaW5kZW50KCkgPDwgY2FwX2ZpZWxkX25hbWUgPDwgIiA9ICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgZW5kbDsKLSAgfQotICBvdXQgPDwgZW5kbDsKLX0KLQotdm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZmllbGRfZGVmbnModF9yYl9vZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgb3V0LmluZGVudCgpIDw8ICJGSUVMRFMgPSB7IiA8PCBlbmRsOwotICBvdXQuaW5kZW50X3VwKCk7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZfaXRlciAhPSBmaWVsZHMuYmVnaW4oKSkgewotICAgICAgb3V0IDw8ICIsIiA8PCBlbmRsOwotICAgIH0KLQotICAgIC8vIGdlbmVyYXRlIHRoZSBmaWVsZCBkb2NzdHJpbmdzIHdpdGhpbiB0aGUgRklFTERTIGNvbnN0YW50LiBubyByZWFsIGJldHRlciBwbGFjZS4uLgotICAgIGdlbmVyYXRlX3Jkb2Mob3V0LCAqZl9pdGVyKTsKLQotICAgIG91dC5pbmRlbnQoKSA8PCB1cGNhc2Vfc3RyaW5nKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiA9PiAiOwotCi0gICAgZ2VuZXJhdGVfZmllbGRfZGF0YShvdXQsICgqZl9pdGVyKS0+Z2V0X3R5cGUoKSwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLCAoKmZfaXRlciktPmdldF92YWx1ZSgpLCAKLSAgICAgICgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwpOwotICB9Ci0gIG91dC5pbmRlbnRfZG93bigpOwotICBvdXQgPDwgZW5kbDsKLSAgb3V0LmluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIAotICBvdXQuaW5kZW50KCkgPDwgImRlZiBzdHJ1Y3RfZmllbGRzOyBGSUVMRFM7IGVuZCIgPDwgZW5kbCA8PCBlbmRsOwotICAKLX0KLQotdm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZmllbGRfZGF0YSh0X3JiX29mc3RyZWFtJiBvdXQsIHRfdHlwZSogZmllbGRfdHlwZSwKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmllbGRfbmFtZSA9ICIiLCB0X2NvbnN0X3ZhbHVlKiBmaWVsZF92YWx1ZSA9IE5VTEwsIGJvb2wgb3B0aW9uYWwgPSBmYWxzZSkgewotICBmaWVsZF90eXBlID0gZ2V0X3RydWVfdHlwZShmaWVsZF90eXBlKTsKLQotICAvLyBCZWdpbiB0aGlzIGZpZWxkJ3MgZGVmbgotICBvdXQgPDwgIns6dHlwZSA9PiAiIDw8IHR5cGVfdG9fZW51bShmaWVsZF90eXBlKTsKLQotICBpZiAoIWZpZWxkX25hbWUuZW1wdHkoKSkgewotICAgIG91dCA8PCAiLCA6bmFtZSA9PiAnIiA8PCBmaWVsZF9uYW1lIDw8ICInIjsKLSAgfQotCi0gIGlmIChmaWVsZF92YWx1ZSAhPSBOVUxMKSB7Ci0gICAgb3V0IDw8ICIsIDpkZWZhdWx0ID0+ICI7Ci0gICAgcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgZmllbGRfdHlwZSwgZmllbGRfdmFsdWUpOwotICB9Ci0KLSAgaWYgKCFmaWVsZF90eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIGlmIChmaWVsZF90eXBlLT5pc19zdHJ1Y3QoKSB8fCBmaWVsZF90eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgICBvdXQgPDwgIiwgOmNsYXNzID0+ICIgPDwgZnVsbF90eXBlX25hbWUoKHRfc3RydWN0KilmaWVsZF90eXBlKTsKLSAgICB9IGVsc2UgaWYgKGZpZWxkX3R5cGUtPmlzX2xpc3QoKSkgewotICAgICAgb3V0IDw8ICIsIDplbGVtZW50ID0+ICI7Ci0gICAgICBnZW5lcmF0ZV9maWVsZF9kYXRhKG91dCwgKCh0X2xpc3QqKWZpZWxkX3R5cGUpLT5nZXRfZWxlbV90eXBlKCkpOwotICAgIH0gZWxzZSBpZiAoZmllbGRfdHlwZS0+aXNfbWFwKCkpIHsKLSAgICAgIG91dCA8PCAiLCA6a2V5ID0+ICI7Ci0gICAgICBnZW5lcmF0ZV9maWVsZF9kYXRhKG91dCwgKCh0X21hcCopZmllbGRfdHlwZSktPmdldF9rZXlfdHlwZSgpKTsKLSAgICAgIG91dCA8PCAiLCA6dmFsdWUgPT4gIjsKLSAgICAgIGdlbmVyYXRlX2ZpZWxkX2RhdGEob3V0LCAoKHRfbWFwKilmaWVsZF90eXBlKS0+Z2V0X3ZhbF90eXBlKCkpOwotICAgIH0gZWxzZSBpZiAoZmllbGRfdHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgIG91dCA8PCAiLCA6ZWxlbWVudCA9PiAiOwotICAgICAgZ2VuZXJhdGVfZmllbGRfZGF0YShvdXQsICgodF9zZXQqKWZpZWxkX3R5cGUpLT5nZXRfZWxlbV90eXBlKCkpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBpZiAoKCh0X2Jhc2VfdHlwZSopZmllbGRfdHlwZSktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICBvdXQgPDwgIiwgOmJpbmFyeSA9PiB0cnVlIjsKLSAgICB9Ci0gIH0KLSAgCi0gIGlmKG9wdGlvbmFsKSB7Ci0gICAgb3V0IDw8ICIsIDpvcHRpb25hbCA9PiB0cnVlIjsKLSAgfQotCi0gIGlmIChmaWVsZF90eXBlLT5pc19lbnVtKCkpIHsKLSAgICBvdXQgPDwgIiwgOmVudW1fY2xhc3MgPT4gIiA8PCBmdWxsX3R5cGVfbmFtZShmaWVsZF90eXBlKTsKLSAgfQotCi0gIC8vIEVuZCBvZiB0aGlzIGZpZWxkJ3MgZGVmbgotICBvdXQgPDwgIn0iOwotfQotCi12b2lkIHRfcmJfZ2VuZXJhdG9yOjpiZWdpbl9uYW1lc3BhY2UodF9yYl9vZnN0cmVhbSYgb3V0LCB2ZWN0b3I8c3RkOjpzdHJpbmc+IG1vZHVsZXMpIHsKLSAgZm9yICh2ZWN0b3I8c3RkOjpzdHJpbmc+OjppdGVyYXRvciBtX2l0ZXIgPSBtb2R1bGVzLmJlZ2luKCk7IG1faXRlciAhPSBtb2R1bGVzLmVuZCgpOyArK21faXRlcikgewotICAgIG91dC5pbmRlbnQoKSA8PCAibW9kdWxlICIgPDwgKm1faXRlciA8PCBlbmRsOwotICAgIG91dC5pbmRlbnRfdXAoKTsKLSAgfQotfQotCi12b2lkIHRfcmJfZ2VuZXJhdG9yOjplbmRfbmFtZXNwYWNlKHRfcmJfb2ZzdHJlYW0mIG91dCwgdmVjdG9yPHN0ZDo6c3RyaW5nPiBtb2R1bGVzKSB7Ci0gIGZvciAodmVjdG9yPHN0ZDo6c3RyaW5nPjo6cmV2ZXJzZV9pdGVyYXRvciBtX2l0ZXIgPSBtb2R1bGVzLnJiZWdpbigpOyBtX2l0ZXIgIT0gbW9kdWxlcy5yZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgb3V0LmluZGVudF9kb3duKCk7Ci0gICAgb3V0LmluZGVudCgpIDw8ICJlbmQiIDw8IGVuZGw7Ci0gIH0KLX0KLQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHRocmlmdCBzZXJ2aWNlLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZl9zZXJ2aWNlX25hbWUgPSBuYW1lc3BhY2VfZGlyXyt1bmRlcnNjb3JlKHNlcnZpY2VfbmFtZV8pKyIucmIiOwotICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIHJiX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGwgPDwgcmVuZGVyX3JlcXVpcmVfdGhyaWZ0KCk7Ci0KLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAicmVxdWlyZSAnIiA8PCByZXF1aXJlX3ByZWZpeF8gPDwgdW5kZXJzY29yZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSkgPDwgIiciIDw8IGVuZGw7Ci0gIH0KLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgInJlcXVpcmUgJyIgPDwgcmVxdWlyZV9wcmVmaXhfIDw8IHVuZGVyc2NvcmUocHJvZ3JhbV9uYW1lXykgPDwgIl90eXBlcyciIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIGJlZ2luX25hbWVzcGFjZShmX3NlcnZpY2VfLCBydWJ5X21vZHVsZXModHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpKTsKLQotICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJtb2R1bGUgIiA8PCBjYXBpdGFsaXplKHRzZXJ2aWNlLT5nZXRfbmFtZSgpKSA8PCBlbmRsOwotICBmX3NlcnZpY2VfLmluZGVudF91cCgpOwotCi0gIC8vIEdlbmVyYXRlIHRoZSB0aHJlZSBtYWluIHBhcnRzIG9mIHRoZSBzZXJ2aWNlICh3ZWxsLCB0d28gZm9yIG5vdyBpbiBQSFApCi0gIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOwotCi0gIGZfc2VydmljZV8uaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgZW5kX25hbWVzcGFjZShmX3NlcnZpY2VfLCBydWJ5X21vZHVsZXModHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpKTsKLQotICAvLyBDbG9zZSBzZXJ2aWNlIGZpbGUKLSAgZl9zZXJ2aWNlXy5jbG9zZSgpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBoZWxwZXIgZnVuY3Rpb25zIGZvciBhIHNlcnZpY2UuCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCi0gKi8KLXZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotCi0gIGZfc2VydmljZV8uaW5kZW50KCkgPDwgIiMgSEVMUEVSIEZVTkNUSU9OUyBBTkQgU1RSVUNUVVJFUyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9zdHJ1Y3QqIHRzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotICAgIGdlbmVyYXRlX3JiX3N0cnVjdChmX3NlcnZpY2VfLCB0cyk7Ci0gICAgZ2VuZXJhdGVfcmJfZnVuY3Rpb25faGVscGVycygqZl9pdGVyKTsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBhbmQgaGVscGVycyBmb3IgYSBmdW5jdGlvbi4KLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbgotICovCi12b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yYl9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7Ci0gIHRfZmllbGQgc3VjY2Vzcyh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksICJzdWNjZXNzIiwgMCk7Ci0gIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKLSAgfQotCi0gIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHJlc3VsdC5hcHBlbmQoKmZfaXRlcik7Ci0gIH0KLSAgZ2VuZXJhdGVfcmJfc3RydWN0KGZfc2VydmljZV8sICZyZXN1bHQpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KLSAqLwotdm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19jbGllbnQgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gZnVsbF90eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOwotICAgIGV4dGVuZHNfY2xpZW50ID0gIiA8ICIgKyBleHRlbmRzICsgIjo6Q2xpZW50ICI7Ci0gIH0KLQotICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJjbGFzcyBDbGllbnQiIDw8IGV4dGVuZHNfY2xpZW50IDw8IGVuZGw7Ci0gIGZfc2VydmljZV8uaW5kZW50X3VwKCk7Ci0KLSAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAiaW5jbHVkZSA6OlRocmlmdDo6Q2xpZW50IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKLSAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLQotICAgIC8vIE9wZW4gZnVuY3Rpb24KLSAgICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJkZWYgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfLmluZGVudF91cCgpOwotICAgICAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PAotICAgICAgICAic2VuZF8iIDw8IGZ1bm5hbWUgPDwgIigiOwotCi0gICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICAgIGlmIChmaXJzdCkgewotICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOwotICAgICAgICB9Ci0gICAgICAgIGZfc2VydmljZV8gPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgICB9Ci0gICAgICBmX3NlcnZpY2VfIDw8ICIpIiA8PCBlbmRsOwotCi0gICAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXy5pbmRlbnQoKTsKLSAgICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICAgIGZfc2VydmljZV8gPDwgInJldHVybiAiOwotICAgICAgICB9Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICAicmVjdl8iIDw8IGZ1bm5hbWUgPDwgIigpIiA8PCBlbmRsOwotICAgICAgfQotICAgIGZfc2VydmljZV8uaW5kZW50X2Rvd24oKTsKLSAgICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJlbmQiIDw8IGVuZGw7Ci0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gICAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PAotICAgICAgImRlZiBzZW5kXyIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8IGVuZGw7Ci0gICAgZl9zZXJ2aWNlXy5pbmRlbnRfdXAoKTsKLQotICAgICAgc3RkOjpzdHJpbmcgYXJnc25hbWUgPSBjYXBpdGFsaXplKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfYXJncyIpOwotICAgICAgc3RkOjpzdHJpbmcgbWVzc2FnZVNlbmRQcm9jID0gKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSA/ICJzZW5kX29uZXdheV9tZXNzYWdlIiA6ICJzZW5kX21lc3NhZ2UiOwotCi0gICAgICBmX3NlcnZpY2VfLmluZGVudCgpIDw8IG1lc3NhZ2VTZW5kUHJvYyA8PCAiKCciIDw8IGZ1bm5hbWUgPDwgIicsICIgPDwgYXJnc25hbWU7Ci0KLSAgICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgIiwgOiIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9PiAiIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICAgfQotCi0gICAgICBmX3NlcnZpY2VfIDw8ICIpIiA8PCBlbmRsOwotCi0gICAgZl9zZXJ2aWNlXy5pbmRlbnRfZG93bigpOwotICAgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbDsKLQotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgc3RkOjpzdHJpbmcgcmVzdWx0bmFtZSA9IGNhcGl0YWxpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKLSAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7Ci0KLSAgICAgIHRfZnVuY3Rpb24gcmVjdl9mdW5jdGlvbigoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJyZWN2XyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZub2FyZ3MpOwotICAgICAgLy8gT3BlbiBmdW5jdGlvbgotICAgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotICAgICAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAiZGVmICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZyZWN2X2Z1bmN0aW9uKSA8PCBlbmRsOwotICAgICAgZl9zZXJ2aWNlXy5pbmRlbnRfdXAoKTsKLQotICAgICAgLy8gVE9ETyhtY3NsZWUpOiBWYWxpZGF0ZSBtZXNzYWdlIHJlcGx5IGhlcmUsIHNlcSBpZHMgZXRjLgotCi0gICAgICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJyZXN1bHQgPSByZWNlaXZlX21lc3NhZ2UoIiA8PCByZXN1bHRuYW1lIDw8ICIpIiA8PCBlbmRsOwotCi0gICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KLSAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAicmV0dXJuIHJlc3VsdC5zdWNjZXNzIHVubGVzcyByZXN1bHQuc3VjY2Vzcy5uaWw/IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICB0X3N0cnVjdCogeHMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKLSAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0gICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgICBmX3NlcnZpY2VfLmluZGVudCgpIDw8Ci0gICAgICAgICAgInJhaXNlIHJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PAotICAgICAgICAgICAgIiB1bmxlc3MgcmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIubmlsPyIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgLy8gQ2FyZWZ1bCwgb25seSByZXR1cm4gX3Jlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCi0gICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PAotICAgICAgICAgICJyZXR1cm4iIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3NlcnZpY2VfLmluZGVudCgpIDw8Ci0gICAgICAgICAgInJhaXNlIDo6VGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbi5uZXcoOjpUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uOjpNSVNTSU5HX1JFU1VMVCwgJyIgPDwKLSAgICAgICAgICAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiBmYWlsZWQ6IHVua25vd24gcmVzdWx0JykiIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIC8vIENsb3NlIGZ1bmN0aW9uCi0gICAgICBmX3NlcnZpY2VfLmluZGVudF9kb3duKCk7Ci0gICAgICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJlbmQiIDw8IGVuZGwgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICBmX3NlcnZpY2VfLmluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8uaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2Ugc2VydmVyIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KLSAqLwotdm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICAvLyBHZW5lcmF0ZSB0aGUgZGlzcGF0Y2ggbWV0aG9kcwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLQotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19wcm9jZXNzb3IgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gZnVsbF90eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOwotICAgIGV4dGVuZHNfcHJvY2Vzc29yID0gIiA8ICIgKyBleHRlbmRzICsgIjo6UHJvY2Vzc29yICI7Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSB0aGUgaGVhZGVyIHBvcnRpb24KLSAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PAotICAgICJjbGFzcyBQcm9jZXNzb3IiIDw8IGV4dGVuZHNfcHJvY2Vzc29yIDw8IGVuZGw7Ci0gIGZfc2VydmljZV8uaW5kZW50X3VwKCk7Ci0KLSAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAiaW5jbHVkZSA6OlRocmlmdDo6UHJvY2Vzc29yIiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3Mgc3ViZnVuY3Rpb25zCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0c2VydmljZSwgKmZfaXRlcik7Ci0gIH0KLQotICBmX3NlcnZpY2VfLmluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8uaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHByb2Nlc3MgZnVuY3Rpb24gZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byB3cml0ZSBhIGRpc3BhdGNoZXIgZm9yCi0gKi8KLXZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gICh2b2lkKSB0c2VydmljZTsKLSAgLy8gT3BlbiBmdW5jdGlvbgotICBmX3NlcnZpY2VfLmluZGVudCgpIDw8Ci0gICAgImRlZiBwcm9jZXNzXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8Ci0gICAgIihzZXFpZCwgaXByb3QsIG9wcm90KSIgPDwgZW5kbDsKLSAgZl9zZXJ2aWNlXy5pbmRlbnRfdXAoKTsKLQotICBzdHJpbmcgYXJnc25hbWUgPSBjYXBpdGFsaXplKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgKyAiX2FyZ3MiOwotICBzdHJpbmcgcmVzdWx0bmFtZSA9IGNhcGl0YWxpemUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSArICJfcmVzdWx0IjsKLQotICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJhcmdzID0gcmVhZF9hcmdzKGlwcm90LCAiIDw8IGFyZ3NuYW1lIDw8ICIpIiA8PCBlbmRsOwotCi0gIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0KLSAgLy8gRGVjbGFyZSByZXN1bHQgZm9yIG5vbiBvbmV3YXkgZnVuY3Rpb24KLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAicmVzdWx0ID0gIiA8PCByZXN1bHRuYW1lIDw8ICIubmV3KCkiIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBUcnkgYmxvY2sgZm9yIGEgZnVuY3Rpb24gd2l0aCBleGNlcHRpb25zCi0gIGlmICh4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgewotICAgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgImJlZ2luIiA8PCBlbmRsOwotICAgIGZfc2VydmljZV8uaW5kZW50X3VwKCk7Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSB0aGUgZnVuY3Rpb24gY2FsbAotICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgZl9zZXJ2aWNlXy5pbmRlbnQoKTsKLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgIGZfc2VydmljZV8gPDwgInJlc3VsdC5zdWNjZXNzID0gIjsKLSAgfQotICBmX3NlcnZpY2VfIDw8Ci0gICAgIkBoYW5kbGVyLiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8ICIsICI7Ci0gICAgfQotICAgIGZfc2VydmljZV8gPDwgImFyZ3MuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gIH0KLSAgZl9zZXJ2aWNlXyA8PCAiKSIgPDwgZW5kbDsKLQotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgeGNlcHRpb25zLnNpemUoKSA+IDApIHsKLSAgICBmX3NlcnZpY2VfLmluZGVudF9kb3duKCk7Ci0gICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgInJlc2N1ZSAiIDw8IGZ1bGxfdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiA9PiAiIDw8Ci0gICAgICAgICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCBlbmRsOwotICAgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgICAgIGZfc2VydmljZV8uaW5kZW50X3VwKCk7Ci0gICAgICAgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgInJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgZW5kbDsKLSAgICAgICAgZl9zZXJ2aWNlXy5pbmRlbnRfZG93bigpOwotICAgICAgfQotICAgIH0KLSAgICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJlbmQiIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBTaG9ydGN1dCBvdXQgaGVyZSBmb3Igb25ld2F5IGZ1bmN0aW9ucwotICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgInJldHVybiIgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfLmluZGVudF9kb3duKCk7Ci0gICAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAid3JpdGVfcmVzdWx0KHJlc3VsdCwgb3Byb3QsICciIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiJywgc2VxaWQpIiA8PCBlbmRsOwotCi0gIC8vIENsb3NlIGZ1bmN0aW9uCi0gIGZfc2VydmljZV8uaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAndHlwZSBuYW1lKGFyZ3MpJwotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgotICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgotICovCi1zdHJpbmcgdF9yYl9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICAvLyBUT0RPKG1jc2xlZSk6IE5pdHBpY2t5LCBubyAnLCcgaWYgYXJndW1lbnRfbGlzdCBpcyBlbXB0eQotICByZXR1cm4KLSAgICBwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKwotICAgICIoIiArICBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSkgKyAiKSI7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhIGZpZWxkIGxpc3QKLSAqLwotc3RyaW5nIHRfcmJfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIHN0cmluZyByZXN1bHQgPSAiIjsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgcmVzdWx0ICs9ICIsICI7Ci0gICAgfQotICAgIHJlc3VsdCArPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RyaW5nIHRfcmJfZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSkgewotICBzdHJpbmcgcHJlZml4ID0gIiI7Ci0KLSAgc3RyaW5nIG5hbWUgPSB0dHlwZS0+Z2V0X25hbWUoKTsKLSAgaWYgKHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKSB8fCB0dHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgbmFtZSA9IGNhcGl0YWxpemUodHR5cGUtPmdldF9uYW1lKCkpOwotICB9Ci0KLSAgcmV0dXJuIHByZWZpeCArIG5hbWU7Ci19Ci0KLXN0cmluZyB0X3JiX2dlbmVyYXRvcjo6ZnVsbF90eXBlX25hbWUodF90eXBlKiB0dHlwZSkgewotICBzdHJpbmcgcHJlZml4ID0gIjo6IjsKLSAgdmVjdG9yPHN0ZDo6c3RyaW5nPiBtb2R1bGVzID0gcnVieV9tb2R1bGVzKHR0eXBlLT5nZXRfcHJvZ3JhbSgpKTsKLSAgZm9yICh2ZWN0b3I8c3RkOjpzdHJpbmc+OjppdGVyYXRvciBtX2l0ZXIgPSBtb2R1bGVzLmJlZ2luKCk7Ci0gICAgICAgbV9pdGVyICE9IG1vZHVsZXMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgcHJlZml4ICs9ICptX2l0ZXIgKyAiOjoiOwotICB9Ci0gIHJldHVybiBwcmVmaXggKyB0eXBlX25hbWUodHR5cGUpOwotfQotCi0vKioKLSAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgUnVieSB0eW9lCi0gKi8KLXN0cmluZyB0X3JiX2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIHJldHVybiAiOjpUaHJpZnQ6OlR5cGVzOjpTVFJJTkciOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIHJldHVybiAiOjpUaHJpZnQ6OlR5cGVzOjpCT09MIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICByZXR1cm4gIjo6VGhyaWZ0OjpUeXBlczo6QllURSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICByZXR1cm4gIjo6VGhyaWZ0OjpUeXBlczo6STE2IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIHJldHVybiAiOjpUaHJpZnQ6OlR5cGVzOjpJMzIiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmV0dXJuICI6OlRocmlmdDo6VHlwZXM6Okk2NCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICByZXR1cm4gIjo6VGhyaWZ0OjpUeXBlczo6RE9VQkxFIjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICI6OlRocmlmdDo6VHlwZXM6OkkzMiI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiAiOjpUaHJpZnQ6OlR5cGVzOjpTVFJVQ1QiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgcmV0dXJuICI6OlRocmlmdDo6VHlwZXM6Ok1BUCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gIjo6VGhyaWZ0OjpUeXBlczo6U0VUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICByZXR1cm4gIjo6VGhyaWZ0OjpUeXBlczo6TElTVCI7Ci0gIH0KLQotICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Ci19Ci0KLXN0cmluZyB0X3JiX2dlbmVyYXRvcjo6cmJfbmFtZXNwYWNlX3RvX3BhdGhfcHJlZml4KHN0cmluZyByYl9uYW1lc3BhY2UpIHsKLSAgc3RyaW5nIG5hbWVzcGFjZXNfbGVmdCA9IHJiX25hbWVzcGFjZTsKLSAgc3RyaW5nOjpzaXplX3R5cGUgbG9jOwotCi0gIHN0cmluZyBwYXRoX3ByZWZpeCA9ICIiOwotCi0gIHdoaWxlICgobG9jID0gbmFtZXNwYWNlc19sZWZ0LmZpbmQoIi4iKSkgIT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgcGF0aF9wcmVmaXggPSBwYXRoX3ByZWZpeCArIHVuZGVyc2NvcmUobmFtZXNwYWNlc19sZWZ0LnN1YnN0cigwLCBsb2MpKSArICIvIjsKLSAgICBuYW1lc3BhY2VzX2xlZnQgPSBuYW1lc3BhY2VzX2xlZnQuc3Vic3RyKGxvYysxKTsKLSAgfQotICBpZiAobmFtZXNwYWNlc19sZWZ0LnNpemUoKSA+IDApIHsKLSAgICBwYXRoX3ByZWZpeCA9IHBhdGhfcHJlZml4ICsgdW5kZXJzY29yZShuYW1lc3BhY2VzX2xlZnQpICsgIi8iOwotICB9Ci0gIHJldHVybiBwYXRoX3ByZWZpeDsKLX0KLQotCi12b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yZG9jKHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpIHsKLSAgaWYgKHRkb2MtPmhhc19kb2MoKSkgewotICAgIG91dC5pbmRlbnQoKTsKLSAgICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvdXQsCi0gICAgICAiIiwgIiMgIiwgdGRvYy0+Z2V0X2RvYygpLCAiIik7Ci0gIH0KLX0KLQotdm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcmJfc3RydWN0X3JlcXVpcmVkX3ZhbGlkYXRvcih0X3JiX29mc3RyZWFtJiBvdXQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgewotICBvdXQuaW5kZW50KCkgPDwgImRlZiB2YWxpZGF0ZSIgPDwgZW5kbDsKLSAgb3V0LmluZGVudF91cCgpOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfZmllbGQqIGZpZWxkID0gKCpmX2l0ZXIpOwotICAgIGlmIChmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKLSAgICAgIG91dC5pbmRlbnQoKSA8PAotICAgICAgICAicmFpc2UgOjpUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uLm5ldyg6OlRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb246OlVOS05PV04sICdSZXF1aXJlZCBmaWVsZCAiIDw8Ci0gICAgICAgIGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgaXMgdW5zZXQhJykiOwotICAgICAgaWYgKGZpZWxkLT5nZXRfdHlwZSgpLT5pc19ib29sKCkpIHsKLSAgICAgICAgb3V0IDw8ICIgaWYgQCIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIi5uaWw/IjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PCAiIHVubGVzcyBAIiA8PCBmaWVsZC0+Z2V0X25hbWUoKTsKLSAgICAgIH0KLSAgICAgIG91dCA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIC8vIGlmIGZpZWxkIGlzIGFuIGVudW0sIGNoZWNrIHRoYXQgaXRzIHZhbHVlIGlzIHZhbGlkCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9maWVsZCogZmllbGQgPSAoKmZfaXRlcik7Ci0KLSAgICBpZiAoZmllbGQtPmdldF90eXBlKCktPmlzX2VudW0oKSl7ICAgICAgCi0gICAgICBvdXQuaW5kZW50KCkgPDwgInVubGVzcyBAIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiLm5pbD8gfHwgIiA8PAotICAgICAgICBmdWxsX3R5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSkgPDwgIjo6VkFMSURfVkFMVUVTLmluY2x1ZGU/KEAiIDw8Ci0gICAgICAgIGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIpIiA8PCBlbmRsOwotICAgICAgb3V0LmluZGVudF91cCgpOwotICAgICAgb3V0LmluZGVudCgpIDw8Ci0gICAgICAgICJyYWlzZSA6OlRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb24ubmV3KDo6VGhyaWZ0OjpQcm90b2NvbEV4Y2VwdGlvbjo6VU5LTk9XTiwgJ0ludmFsaWQgdmFsdWUgb2YgZmllbGQgIiA8PAotICAgICAgICBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiIScpIiA8PCBlbmRsOyAgCi0gICAgICBvdXQuaW5kZW50X2Rvd24oKTsKLSAgICAgIG91dC5pbmRlbnQoKSA8PCAiZW5kIiA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIG91dC5pbmRlbnRfZG93bigpOwotICBvdXQuaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi12b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yYl91bmlvbl92YWxpZGF0b3IodF9yYl9vZnN0cmVhbSYgb3V0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgewotICBvdXQuaW5kZW50KCkgPDwgImRlZiB2YWxpZGF0ZSIgPDwgZW5kbDsKLSAgb3V0LmluZGVudF91cCgpOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBvdXQuaW5kZW50KCkgPDwKLSAgICAicmFpc2UoU3RhbmRhcmRFcnJvciwgJ1VuaW9uIGZpZWxkcyBhcmUgbm90IHNldC4nKSBpZiBnZXRfc2V0X2ZpZWxkLm5pbD8gfHwgZ2V0X3ZhbHVlLm5pbD8iIDw8IGVuZGw7Ci0KLSAgLy8gaWYgZmllbGQgaXMgYW4gZW51bSwgY2hlY2sgdGhhdCBpdHMgdmFsdWUgaXMgdmFsaWQKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBjb25zdCB0X2ZpZWxkKiBmaWVsZCA9ICgqZl9pdGVyKTsKLQotICAgIGlmIChmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfZW51bSgpKXsgICAgICAKLSAgICAgIG91dC5pbmRlbnQoKSA8PCAiaWYgZ2V0X3NldF9maWVsZCA9PSA6IiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCBlbmRsOwotICAgICAgb3V0LmluZGVudCgpIDw8Ci0gICAgICAgICIgIHJhaXNlIDo6VGhyaWZ0OjpQcm90b2NvbEV4Y2VwdGlvbi5uZXcoOjpUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uOjpVTktOT1dOLCAnSW52YWxpZCB2YWx1ZSBvZiBmaWVsZCAiIDw8Ci0gICAgICAgIGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIhJykgdW5sZXNzICIgPDwgZnVsbF90eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCkpIDw8Ci0gICAgICAgICI6OlZBTElEX1ZBTFVFUy5pbmNsdWRlPyhnZXRfdmFsdWUpIiA8PCBlbmRsOyAgCi0gICAgICBvdXQuaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICBvdXQuaW5kZW50X2Rvd24oKTsKLSAgb3V0LmluZGVudCgpIDw8ICJlbmQiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUihyYiwgIlJ1YnkiLAotIiAgICBydWJ5Z2VtczogICAgICAgIEFkZCBhIFwicmVxdWlyZSAncnVieWdlbXMnXCIgbGluZSB0byB0aGUgdG9wIG9mIGVhY2ggZ2VuZXJhdGVkIGZpbGUuXG4iCi0iICAgIG5hbWVzcGFjZWQ6ICAgICAgR2VuZXJhdGUgZmlsZXMgaW4gaWRpb21hdGljIG5hbWVzcGFjZWQgZGlyZWN0b3JpZXMuXG4iKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X3N0X2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9zdF9nZW5lcmF0b3IuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyZmZkODguLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X3N0X2dlbmVyYXRvci5jYworKysgL2Rldi9udWxsCkBAIC0xLDEwNjcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgotICogUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKLSAqIGRldGFpbHMuCi0gKi8KLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0KLSNpbmNsdWRlICJwbGF0Zm9ybS5oIgotI2luY2x1ZGUgInRfb29wX2dlbmVyYXRvci5oIgotI2luY2x1ZGUgInZlcnNpb24uaCIKLQotdXNpbmcgc3RkOjptYXA7Ci11c2luZyBzdGQ6Om9mc3RyZWFtOwotdXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwotdXNpbmcgc3RkOjpzdHJpbmc7Ci11c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKLXVzaW5nIHN0ZDo6dmVjdG9yOwotCi1zdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAgLy8gYXZvaWQgb3N0cmVhbSA8PCBzdGQ6OmVuZGwgZmx1c2hlcwotCi0vKioKLSAqIFNtYWxsdGFsayBjb2RlIGdlbmVyYXRvci4KLSAqCi0gKi8KLWNsYXNzIHRfc3RfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7Ci0gcHVibGljOgotICB0X3N0X2dlbmVyYXRvcigKLSAgICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSwKLSAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAotICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCi0gICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkKLSAgewotICAgICh2b2lkKSBwYXJzZWRfb3B0aW9uczsKLSAgICAodm9pZCkgb3B0aW9uX3N0cmluZzsKLSAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1zdCI7Ci0gIH0KLQotICAvKioKLSAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcwotICAgKi8KLQotICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7Ci0gIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7Ci0KLSAgLyoqCi0gICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmICAgICAodF90eXBlZGVmKiAgdHR5cGVkZWYpOwotICB2b2lkIGdlbmVyYXRlX2VudW0gICAgICAgICh0X2VudW0qICAgICB0ZW51bSk7Ci0gIHZvaWQgZ2VuZXJhdGVfY29uc3QgICAgICAgKHRfY29uc3QqICAgIHRjb25zdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3RydWN0ICAgICAgKHRfc3RydWN0KiAgIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uICAgICh0X3N0cnVjdCogICB0eGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UgICAgICh0X3NlcnZpY2UqICB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfY2xhc3Nfc2lkZV9kZWZpbml0aW9uICgpOwotICB2b2lkIGdlbmVyYXRlX2ZvcmNlX2NvbnN0cyAoKTsKLQotCi0gIHN0ZDo6c3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKLQotICAvKioKLSAgICogU3RydWN0IGdlbmVyYXRpb24gY29kZQotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX3N0X3N0cnVjdCAoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX2FjY2Vzc29ycyAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLQotICAvKioKLSAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50ICAgICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlbmRfbWV0aG9kICh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotICB2b2lkIGdlbmVyYXRlX3JlY3ZfbWV0aG9kICh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotCi0gIHN0ZDo6c3RyaW5nIG1hcF9yZWFkZXIgKHRfbWFwICp0bWFwKTsKLSAgc3RkOjpzdHJpbmcgbGlzdF9yZWFkZXIgKHRfbGlzdCAqdGxpc3QpOwotICBzdGQ6OnN0cmluZyBzZXRfcmVhZGVyICh0X3NldCAqdHNldCk7Ci0gIHN0ZDo6c3RyaW5nIHN0cnVjdF9yZWFkZXIgKHRfc3RydWN0ICp0c3RydWN0LCBzdGQ6OnN0cmluZyBjbHNOYW1lKTsKLQotICBzdGQ6OnN0cmluZyBtYXBfd3JpdGVyICh0X21hcCAqdG1hcCwgc3RkOjpzdHJpbmcgbmFtZSk7Ci0gIHN0ZDo6c3RyaW5nIGxpc3Rfd3JpdGVyICh0X2xpc3QgKnRsaXN0LCBzdGQ6OnN0cmluZyBuYW1lKTsKLSAgc3RkOjpzdHJpbmcgc2V0X3dyaXRlciAodF9zZXQgKnRzZXQsIHN0ZDo6c3RyaW5nIG5hbWUpOwotICBzdGQ6OnN0cmluZyBzdHJ1Y3Rfd3JpdGVyICh0X3N0cnVjdCAqdHN0cnVjdCwgc3RkOjpzdHJpbmcgZm5hbWUpOwotCi0gIHN0ZDo6c3RyaW5nIHdyaXRlX3ZhbCAodF90eXBlICp0LCBzdGQ6OnN0cmluZyBmbmFtZSk7Ci0gIHN0ZDo6c3RyaW5nIHJlYWRfdmFsICh0X3R5cGUgKnQpOwotCi0gIC8qKgotICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucwotICAgKi8KLQotICBzdGQ6OnN0cmluZyBzdF9hdXRvZ2VuX2NvbW1lbnQoKTsKLQotICB2b2lkIHN0X2NsYXNzX2RlZihzdGQ6Om9mc3RyZWFtICZvdXQsIHN0ZDo6c3RyaW5nIG5hbWUpOwotICB2b2lkIHN0X21ldGhvZChzdGQ6Om9mc3RyZWFtICZvdXQsIHN0ZDo6c3RyaW5nIGNscywgc3RkOjpzdHJpbmcgbmFtZSk7Ci0gIHZvaWQgc3RfbWV0aG9kKHN0ZDo6b2ZzdHJlYW0gJm91dCwgc3RkOjpzdHJpbmcgY2xzLCBzdGQ6OnN0cmluZyBuYW1lLCBzdGQ6OnN0cmluZyBjYXRlZ29yeSk7Ci0gIHZvaWQgc3RfY2xvc2VfbWV0aG9kKHN0ZDo6b2ZzdHJlYW0gJm91dCk7Ci0gIHZvaWQgc3RfY2xhc3NfbWV0aG9kKHN0ZDo6b2ZzdHJlYW0gJm91dCwgc3RkOjpzdHJpbmcgY2xzLCBzdGQ6OnN0cmluZyBuYW1lKTsKLSAgdm9pZCBzdF9jbGFzc19tZXRob2Qoc3RkOjpvZnN0cmVhbSAmb3V0LCBzdGQ6OnN0cmluZyBjbHMsIHN0ZDo6c3RyaW5nIG5hbWUsIHN0ZDo6c3RyaW5nIGNhdGVnb3J5KTsKLSAgdm9pZCBzdF9zZXR0ZXIoc3RkOjpvZnN0cmVhbSAmb3V0LCBzdGQ6OnN0cmluZyBjbHMsIHN0ZDo6c3RyaW5nIG5hbWUsIHN0ZDo6c3RyaW5nIHR5cGUpOwotICB2b2lkIHN0X2dldHRlcihzdGQ6Om9mc3RyZWFtICZvdXQsIHN0ZDo6c3RyaW5nIGNscywgc3RkOjpzdHJpbmcgbmFtZSk7Ci0gIHZvaWQgc3RfYWNjZXNzb3JzKHN0ZDo6b2ZzdHJlYW0gJm91dCwgc3RkOjpzdHJpbmcgY2xzLCBzdGQ6OnN0cmluZyBuYW1lLCBzdGQ6OnN0cmluZyB0eXBlKTsKLQotICBzdGQ6OnN0cmluZyBjbGFzc19uYW1lKCk7Ci0gIHN0YXRpYyBib29sIGlzX3ZhbGlkX25hbWVzcGFjZShjb25zdCBzdGQ6OnN0cmluZyYgc3ViX25hbWVzcGFjZSk7Ci0gIHN0ZDo6c3RyaW5nIGNsaWVudF9jbGFzc19uYW1lKCk7Ci0gIHN0ZDo6c3RyaW5nIHByZWZpeChzdGQ6OnN0cmluZyBuYW1lKTsKLSAgc3RkOjpzdHJpbmcgZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQpOwotICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSk7Ci0KLSAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0gIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICBzdGQ6OnN0cmluZyBmdW5jdGlvbl90eXBlc19jb21tZW50KHRfZnVuY3Rpb24qIGZuKTsKLQotICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7Ci0gIHN0ZDo6c3RyaW5nIGFfdHlwZSh0X3R5cGUqIHR5cGUpOwotICBib29sIGlzX3Zvd2VsKGNoYXIgYyk7Ci0gIHN0ZDo6c3RyaW5nIHRlbXBfbmFtZSgpOwotICBzdGQ6OnN0cmluZyBnZW5lcmF0ZWRfY2F0ZWdvcnkoKTsKLQotIHByaXZhdGU6Ci0KLSAgLyoqCi0gICAqIEZpbGUgc3RyZWFtcwotICAgKi8KLSAgaW50IHRlbXBvcmFyeV92YXI7Ci0gIHN0ZDo6b2ZzdHJlYW0gZl87Ci0KLX07Ci0KLQotLyoqCi0gKiBQcmVwYXJlcyBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAotICogc3RyZWFtcy4KLSAqCi0gKiBAcGFyYW0gdHByb2dyYW0gVGhlIHByb2dyYW0gdG8gZ2VuZXJhdGUKLSAqLwotdm9pZCB0X3N0X2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQotICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOwotCi0gIHRlbXBvcmFyeV92YXIgPSAwOwotCi0gIC8vIE1ha2Ugb3V0cHV0IGZpbGUKLSAgc3RyaW5nIGZfbmFtZSA9IGdldF9vdXRfZGlyKCkrIi8iK3Byb2dyYW1fbmFtZV8rIi5zdCI7Ci0gIGZfLm9wZW4oZl9uYW1lLmNfc3RyKCkpOwotCi0gIC8vIFByaW50IGhlYWRlcgotICBmXyA8PCBzdF9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsOwotCi0gIHN0X2NsYXNzX2RlZihmXywgcHJvZ3JhbV9uYW1lXyk7Ci0gIGdlbmVyYXRlX2NsYXNzX3NpZGVfZGVmaW5pdGlvbigpOwotCi0gIC8vR2VuZXJhdGUgZW51bXMKLSAgdmVjdG9yPHRfZW51bSo+IGVudW1zID0gcHJvZ3JhbV8tPmdldF9lbnVtcygpOwotICB2ZWN0b3I8dF9lbnVtKj46Oml0ZXJhdG9yIGVuX2l0ZXI7Ci0gIGZvciAoZW5faXRlciA9IGVudW1zLmJlZ2luKCk7IGVuX2l0ZXIgIT0gZW51bXMuZW5kKCk7ICsrZW5faXRlcikgewotICAgIGdlbmVyYXRlX2VudW0oKmVuX2l0ZXIpOwotICB9Ci19Ci0KLXN0cmluZyB0X3N0X2dlbmVyYXRvcjo6Y2xhc3NfbmFtZSgpIHsKLSAgcmV0dXJuIGNhcGl0YWxpemUocHJvZ3JhbV9uYW1lXyk7Ci19Ci0KLWJvb2wgdF9zdF9nZW5lcmF0b3I6OmlzX3ZhbGlkX25hbWVzcGFjZShjb25zdCBzdGQ6OnN0cmluZyYgc3ViX25hbWVzcGFjZSkgewotICByZXR1cm4gc3ViX25hbWVzcGFjZSA9PSAicHJlZml4IiB8fCBzdWJfbmFtZXNwYWNlID09ICJjYXRlZ29yeSI7Ci19Ci0KLXN0cmluZyB0X3N0X2dlbmVyYXRvcjo6cHJlZml4KHN0cmluZyBjbGFzc19uYW1lKSB7Ci0gIHN0cmluZyBwcmVmaXggPSBwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgic21hbGx0YWxrLnByZWZpeCIpOwotICBzdHJpbmcgbmFtZSA9IGNhcGl0YWxpemUoY2xhc3NfbmFtZSk7Ci0gIG5hbWUgPSBwcmVmaXguZW1wdHkoKSA/IG5hbWUgOiAocHJlZml4ICsgbmFtZSk7Ci0gIHJldHVybiBuYW1lOwotfQotCi1zdHJpbmcgdF9zdF9nZW5lcmF0b3I6OmNsaWVudF9jbGFzc19uYW1lKCkgewotICByZXR1cm4gY2FwaXRhbGl6ZShzZXJ2aWNlX25hbWVfKSArICJDbGllbnQiOwotfQotCi0vKioKLSAqIEF1dG9nZW4nZCBjb21tZW50Ci0gKi8KLXN0cmluZyB0X3N0X2dlbmVyYXRvcjo6c3RfYXV0b2dlbl9jb21tZW50KCkgewotICByZXR1cm4KLSAgICBzdGQ6OnN0cmluZygiJyIpICsKLSAgICAiQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKCIgKyBUSFJJRlRfVkVSU0lPTiArICIpXG4iICsKLSAgICAiXG4iICsKLSAgICAiRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lOR1xuIiArCi0gICAgIichXG4iOwotfQotCi12b2lkIHRfc3RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9mb3JjZV9jb25zdHMoKSB7Ci0gIGZfIDw8IHByZWZpeChjbGFzc19uYW1lKCkpIDw8ICIgZW51bXMga2V5c0FuZFZhbHVlc0RvOiBbOmsgOnYgfCAiIDw8Ci0gICAgcHJlZml4KGNsYXNzX25hbWUoKSkgPDwgIiBlbnVtcyBhdDogayBwdXQ6IHYgdmFsdWVdLiEiIDw8IGVuZGw7Ci0KLSAgZl8gPDwgcHJlZml4KGNsYXNzX25hbWUoKSkgPDwgIiBjb25zdGFudHMga2V5c0FuZFZhbHVlc0RvOiBbOmsgOnYgfCAiIDw8Ci0gICAgcHJlZml4KGNsYXNzX25hbWUoKSkgPDwgIiBjb25zdGFudHMgYXQ6IGsgcHV0OiB2IHZhbHVlXS4hIiA8PCBlbmRsOwotCi19Ci0KLXZvaWQgdF9zdF9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKLSAgZ2VuZXJhdGVfZm9yY2VfY29uc3RzKCk7Ci0gIGZfLmNsb3NlKCk7Ci19Ci0KLXN0cmluZyB0X3N0X2dlbmVyYXRvcjo6Z2VuZXJhdGVkX2NhdGVnb3J5KCkgewotICBzdHJpbmcgY2F0ID0gcHJvZ3JhbV8tPmdldF9uYW1lc3BhY2UoInNtYWxsdGFsay5jYXRlZ29yeSIpOwotICAvLyBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBUaHJpZnQgZ3JhbW1hciwgdGhlIGNhdGVnb3J5IG11c3QKLSAgLy8gYmUgcHVuY3R1YXRlZCBieSBkb3RzLiAgUmVwbGFjZXMgdGhlbSB3aXRoIGRhc2hlcyBoZXJlLgotICBmb3IgKHN0cmluZzo6aXRlcmF0b3IgaXRlciA9IGNhdC5iZWdpbigpOyBpdGVyICE9IGNhdC5lbmQoKTsgKytpdGVyKSB7Ci0gICAgaWYgKCppdGVyID09ICcuJykgewotICAgICAgKml0ZXIgPSAnLSc7Ci0gICAgfQotICB9Ci0gIHJldHVybiBjYXQuc2l6ZSgpID8gY2F0IDogIkdlbmVyYXRlZC0iICsgY2xhc3NfbmFtZSgpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIFRoaXMgaXMgbm90IGRvbmUgaW4gU21hbGx0YWxrLCB0eXBlcyBhcmUgYWxsIGltcGxpY2l0LgotICoKLSAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9zdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgewotICAodm9pZCkgdHR5cGVkZWY7Ci19Ci0KLXZvaWQgdF9zdF9nZW5lcmF0b3I6OnN0X2NsYXNzX2RlZihzdGQ6Om9mc3RyZWFtICZvdXQsIHN0cmluZyBuYW1lKSB7Ci0gIG91dCA8PCAiT2JqZWN0IHN1YmNsYXNzOiAjIiA8PCBwcmVmaXgobmFtZSkgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiaW5zdGFuY2VWYXJpYWJsZU5hbWVzOiAnJyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJjbGFzc1ZhcmlhYmxlTmFtZXM6ICcnIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInBvb2xEaWN0aW9uYXJpZXM6ICcnIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImNhdGVnb3J5OiAnIiA8PCBnZW5lcmF0ZWRfY2F0ZWdvcnkoKSA8PCAiJyEiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotdm9pZCB0X3N0X2dlbmVyYXRvcjo6c3RfbWV0aG9kKHN0ZDo6b2ZzdHJlYW0gJm91dCwgc3RyaW5nIGNscywgc3RyaW5nIG5hbWUpIHsKLSAgc3RfbWV0aG9kKG91dCwgY2xzLCBuYW1lLCAiYXMgeWV0IHVuY2F0ZWdvcml6ZWQiKTsKLX0KLQotdm9pZCB0X3N0X2dlbmVyYXRvcjo6c3RfY2xhc3NfbWV0aG9kKHN0ZDo6b2ZzdHJlYW0gJm91dCwgc3RyaW5nIGNscywgc3RyaW5nIG5hbWUpIHsKLSAgc3RfbWV0aG9kKG91dCwgY2xzICsgIiBjbGFzcyIsIG5hbWUpOwotfQotCi12b2lkIHRfc3RfZ2VuZXJhdG9yOjpzdF9jbGFzc19tZXRob2Qoc3RkOjpvZnN0cmVhbSAmb3V0LCBzdHJpbmcgY2xzLCBzdHJpbmcgbmFtZSwgc3RyaW5nIGNhdGVnb3J5KSB7Ci0gIHN0X21ldGhvZChvdXQsIGNscywgbmFtZSwgY2F0ZWdvcnkpOwotfQotCi12b2lkIHRfc3RfZ2VuZXJhdG9yOjpzdF9tZXRob2Qoc3RkOjpvZnN0cmVhbSAmb3V0LCBzdHJpbmcgY2xzLCBzdHJpbmcgbmFtZSwgc3RyaW5nIGNhdGVnb3J5KSB7Ci0gIGNoYXIgdGltZXN0cls1MF07Ci0gIHRpbWVfdCByYXd0aW1lOwotICBzdHJ1Y3QgdG0gKnRpbmZvOwotCi0gIHRpbWUoJnJhd3RpbWUpOwotICB0aW5mbyA9IGxvY2FsdGltZSgmcmF3dGltZSk7Ci0gIHN0cmZ0aW1lKHRpbWVzdHIsIDUwLCAiJW0vJWQvJVkgJUg6JU0iLCB0aW5mbyk7Ci0KLSAgb3V0IDw8ICIhIiA8PCBwcmVmaXgoY2xzKSA8PAotICAgICIgbWV0aG9kc0ZvcjogJyIrY2F0ZWdvcnkrIicgc3RhbXA6ICd0aHJpZnQgIiA8PCB0aW1lc3RyIDw8ICInIVxuIiA8PAotICAgIG5hbWUgPDwgZW5kbDsKLQotICBpbmRlbnRfdXAoKTsKLSAgb3V0IDw8IGluZGVudCgpOwotfQotCi12b2lkIHRfc3RfZ2VuZXJhdG9yOjpzdF9jbG9zZV9tZXRob2Qoc3RkOjpvZnN0cmVhbSAmb3V0KSB7Ci0gIG91dCA8PCAiISAhIiA8PCBlbmRsIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci19Ci0KLXZvaWQgdF9zdF9nZW5lcmF0b3I6OnN0X3NldHRlcihzdGQ6Om9mc3RyZWFtICZvdXQsIHN0cmluZyBjbHMsIHN0cmluZyBuYW1lLCBzdHJpbmcgdHlwZSA9ICJhbk9iamVjdCIpIHsKLSAgc3RfbWV0aG9kKG91dCwgY2xzLCBuYW1lICsgIjogIiArIHR5cGUpOwotICBvdXQgPDwgbmFtZSA8PCAiIDo9ICIgKyB0eXBlOwotICBzdF9jbG9zZV9tZXRob2Qob3V0KTsKLX0KLQotdm9pZCB0X3N0X2dlbmVyYXRvcjo6c3RfZ2V0dGVyKHN0ZDo6b2ZzdHJlYW0gJm91dCwgc3RyaW5nIGNscywgc3RyaW5nIG5hbWUpIHsKLSAgc3RfbWV0aG9kKG91dCwgY2xzLCBuYW1lICsgIiIpOwotICBvdXQgPDwgIl4gIiA8PCBuYW1lOwotICBzdF9jbG9zZV9tZXRob2Qob3V0KTsKLX0KLQotdm9pZCB0X3N0X2dlbmVyYXRvcjo6c3RfYWNjZXNzb3JzKHN0ZDo6b2ZzdHJlYW0gJm91dCwgc3RyaW5nIGNscywgc3RyaW5nIG5hbWUsIHN0cmluZyB0eXBlID0gImFuT2JqZWN0IikgewotICBzdF9zZXR0ZXIob3V0LCBjbHMsIG5hbWUsIHR5cGUpOwotICBzdF9nZXR0ZXIob3V0LCBjbHMsIG5hbWUpOwotfQotCi12b2lkIHRfc3RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jbGFzc19zaWRlX2RlZmluaXRpb24oKSB7Ci0gIGZfIDw8IHByZWZpeChjbGFzc19uYW1lKCkpIDw8ICIgY2xhc3MiIDw8IGVuZGwgPDwKLSAgICAiXHRpbnN0YW5jZVZhcmlhYmxlTmFtZXM6ICdjb25zdGFudHMgZW51bXMnISIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIHN0X2FjY2Vzc29ycyhmXywgY2xhc3NfbmFtZSgpICsgIiBjbGFzcyIsICJlbnVtcyIpOwotICBzdF9hY2Nlc3NvcnMoZl8sIGNsYXNzX25hbWUoKSArICIgY2xhc3MiLCAiY29uc3RhbnRzIik7Ci0KLSAgZl8gPDwgcHJlZml4KGNsYXNzX25hbWUoKSkgPDwgIiBlbnVtczogRGljdGlvbmFyeSBuZXchIiA8PCBlbmRsOwotICBmXyA8PCBwcmVmaXgoY2xhc3NfbmFtZSgpKSA8PCAiIGNvbnN0YW50czogRGljdGlvbmFyeSBuZXchIiA8PCBlbmRsOwotCi0gIGZfIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGNvZGUgZm9yIGFuIGVudW1lcmF0ZWQgdHlwZS4gRG9uZSB1c2luZyBhIGNsYXNzIHRvIHNjb3BlCi0gKiB0aGUgdmFsdWVzLgotICoKLSAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KLSAqLwotdm9pZCB0X3N0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7Ci0gIHN0cmluZyBjbHNfbmFtZSA9IHByb2dyYW1fbmFtZV8gKyBjYXBpdGFsaXplKHRlbnVtLT5nZXRfbmFtZSgpKTsKLQotICBmXyA8PCBwcmVmaXgoY2xhc3NfbmFtZSgpKSA8PCAiIGVudW1zIGF0OiAnIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiJyBwdXQ6IFsiIDw8Ci0gICAgIihEaWN0aW9uYXJ5IG5ldyAiIDw8IGVuZGw7Ci0KLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7Ci0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOwotICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgewotICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0gICAgZl8gPDwgIlx0YXQ6ICciIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJyBwdXQ6ICIgPDwgdmFsdWUgPDwgIjsiIDw8IGVuZGw7Ci0gIH0KLQotICBmXyA8PCAiXHR5b3Vyc2VsZildISIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlIGEgY29uc3RhbnQgdmFsdWUKLSAqLwotdm9pZCB0X3N0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KSB7Ci0gIHRfdHlwZSogdHlwZSA9IHRjb25zdC0+Z2V0X3R5cGUoKTsKLSAgc3RyaW5nIG5hbWUgPSB0Y29uc3QtPmdldF9uYW1lKCk7Ci0gIHRfY29uc3RfdmFsdWUqIHZhbHVlID0gdGNvbnN0LT5nZXRfdmFsdWUoKTsKLQotICBmXyA8PCBwcmVmaXgoY2xhc3NfbmFtZSgpKSA8PCAiIGNvbnN0YW50cyBhdDogJyIgPDwgbmFtZSA8PCAiJyBwdXQ6IFsiIDw8Ci0gICAgcmVuZGVyX2NvbnN0X3ZhbHVlKHR5cGUsIHZhbHVlKSA8PCAiXSEiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBQcmludHMgdGhlIHZhbHVlIG9mIGEgY29uc3RhbnQgd2l0aCB0aGUgZ2l2ZW4gdHlwZS4gTm90ZSB0aGF0IHR5cGUgY2hlY2tpbmcKLSAqIGlzIE5PVCBwZXJmb3JtZWQgaW4gdGhpcyBmdW5jdGlvbiBhcyBpdCBpcyBhbHdheXMgcnVuIGJlZm9yZWhhbmQgdXNpbmcgdGhlCi0gKiB2YWxpZGF0ZV90eXBlcyBtZXRob2QgaW4gbWFpbi5jYwotICovCi1zdHJpbmcgdF9zdF9nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OwotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgb3V0IDw8ICciJyA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICciJzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIG91dCA8PCAodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwID8gInRydWUiIDogImZhbHNlIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7Ci0gICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgb3V0IDw8ICIoIiA8PCBjYXBpdGFsaXplKHR5cGUtPmdldF9uYW1lKCkpIDw8ICIgbmV3ICIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotCi0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7Ci0gICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgewotICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKLSAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKLSAgICAgIH0KLQotICAgICAgb3V0IDw8IGluZGVudCgpIDw8IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSA8PCAiOiAiIDw8Ci0gICAgICAgIHJlbmRlcl9jb25zdF92YWx1ZShmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAieW91cnNlbGYpIjsKLQotICAgIGluZGVudF9kb3duKCk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOwotICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0gICAgb3V0IDw8ICIoRGljdGlvbmFyeSBuZXciIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgb3V0IDw8IGluZGVudCgpIDw8IGluZGVudCgpOwotICAgICAgb3V0IDw8ICJhdDogIiA8PCByZW5kZXJfY29uc3RfdmFsdWUoa3R5cGUsIHZfaXRlci0+Zmlyc3QpOwotICAgICAgb3V0IDw8ICIgcHV0OiAiOwotICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZSh2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotICAgICAgb3V0IDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgaW5kZW50KCkgPDwgInlvdXJzZWxmKSI7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnRfZG93bigpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkgewotICAgIHRfdHlwZSogZXR5cGU7Ci0gICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB9IGVsc2UgewotICAgICAgZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIH0KLSAgICBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgIG91dCA8PCAiKFNldCBuZXciIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dCA8PCAiKE9yZGVyZWRDb2xsZWN0aW9uIG5ldyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7Ci0gICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgaW5kZW50KCk7Ci0gICAgICBvdXQgPDwgImFkZDogIiA8PCByZW5kZXJfY29uc3RfdmFsdWUoZXR5cGUsICp2X2l0ZXIpOwotICAgICAgb3V0IDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgaW5kZW50KCkgPDwgInlvdXJzZWxmKSI7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnRfZG93bigpOwotICB9IGVsc2UgewotICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgQ09OU1RBTlQgRk9SIFRZUEU6ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotICB9Ci0gIHJldHVybiBvdXQuc3RyKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgU21hbGx0YWxrIHN0cnVjdAotICovCi12b2lkIHRfc3RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgZ2VuZXJhdGVfc3Rfc3RydWN0KGZfLCB0c3RydWN0LCBmYWxzZSk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGV4Y2VwdGlvbi4gQmFzaWNhbGx5IHRoZSBzYW1lCi0gKiBhcyBhIHN0cnVjdCBidXQgZXh0ZW5kcyB0aGUgRXhjZXB0aW9uIGNsYXNzLgotICoKLSAqIEBwYXJhbSB0eGNlcHRpb24gVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9zdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKLSAgZ2VuZXJhdGVfc3Rfc3RydWN0KGZfLCB0eGNlcHRpb24sIHRydWUpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNtYWxsdGFsayBjbGFzcyB0byByZXByZXNlbnQgYSBzdHJ1Y3QKLSAqLwotdm9pZCB0X3N0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3Rfc3RydWN0KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uID0gZmFsc2UpIHsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLQotICBpZiAoaXNfZXhjZXB0aW9uKQotICAgIG91dCA8PCAiRXJyb3IiOwotICBlbHNlCi0gICAgb3V0IDw8ICJPYmplY3QiOwotCi0gIG91dCA8PCAiIHN1YmNsYXNzOiAjIiA8PCBwcmVmaXgodHlwZV9uYW1lKHRzdHJ1Y3QpKSA8PCBlbmRsIDw8Ci0gICAgIlx0aW5zdGFuY2VWYXJpYWJsZU5hbWVzOiAnIjsKLQotICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7Ci0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgaWYgKG1faXRlciAhPSBtZW1iZXJzLmJlZ2luKCkpIG91dCA8PCAiICI7Ci0gICAgICBvdXQgPDwgY2FtZWxjYXNlKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSk7Ci0gICAgfQotICB9Ci0KLSAgb3V0IDw8ICInXG4iIDw8Ci0gICAgIlx0Y2xhc3NWYXJpYWJsZU5hbWVzOiAnJ1xuIiA8PAotICAgICJcdHBvb2xEaWN0aW9uYXJpZXM6ICcnXG4iIDw8Ci0gICAgIlx0Y2F0ZWdvcnk6ICciIDw8IGdlbmVyYXRlZF9jYXRlZ29yeSgpIDw8ICInIVxuXG4iOwotCi0gIGdlbmVyYXRlX2FjY2Vzc29ycyhvdXQsIHRzdHJ1Y3QpOwotfQotCi1ib29sIHRfc3RfZ2VuZXJhdG9yOjppc192b3dlbChjaGFyIGMpIHsKLSAgc3dpdGNoKHRvbG93ZXIoYykpIHsKLSAgICBjYXNlICdhJzogY2FzZSAnZSc6IGNhc2UgJ2knOiBjYXNlICdvJzogY2FzZSAndSc6Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1zdHJpbmcgdF9zdF9nZW5lcmF0b3I6OmFfdHlwZSh0X3R5cGUqIHR5cGUpIHsKLSAgc3RyaW5nIHByZWZpeDsKLQotICBpZiAoaXNfdm93ZWwodHlwZV9uYW1lKHR5cGUpWzBdKSkKLSAgICBwcmVmaXggPSAiYW4iOwotICBlbHNlCi0gICAgcHJlZml4ID0gImEiOwotCi0gIHJldHVybiBwcmVmaXggKyBjYXBpdGFsaXplKHR5cGVfbmFtZSh0eXBlKSk7Ci19Ci0KLXZvaWQgdF9zdF9nZW5lcmF0b3I6OmdlbmVyYXRlX2FjY2Vzc29ycyhzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0gIHN0cmluZyB0eXBlOwotICBzdHJpbmcgcHJlZml4OwotCi0gIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICBzdF9hY2Nlc3NvcnMob3V0LAotICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUodHlwZV9uYW1lKHRzdHJ1Y3QpKSwKLSAgICAgICAgICAgICAgICAgICBjYW1lbGNhc2UoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSwKLSAgICAgICAgICAgICAgICAgICBhX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSk7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgdGhyaWZ0IHNlcnZpY2UuCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X3N0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlKTsKLSAgLy8gZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodHNlcnZpY2UpOwotfQotCi1zdHJpbmcgdF9zdF9nZW5lcmF0b3I6OnRlbXBfbmFtZSgpIHsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKLSAgb3V0IDw8ICJ0ZW1wIiA8PCB0ZW1wb3JhcnlfdmFyKys7Ci0gIHJldHVybiBvdXQuc3RyKCk7Ci19Ci0KLXN0cmluZyB0X3N0X2dlbmVyYXRvcjo6bWFwX3dyaXRlcih0X21hcCAqdG1hcCwgc3RyaW5nIGZuYW1lKSB7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7Ci0gIHN0cmluZyBrZXkgPSB0ZW1wX25hbWUoKTsKLSAgc3RyaW5nIHZhbCA9IHRlbXBfbmFtZSgpOwotCi0gIG91dCA8PCAiW29wcm90IHdyaXRlTWFwQmVnaW46IChUTWFwIG5ldyBrZXlUeXBlOiAiIDw8IHR5cGVfdG9fZW51bSh0bWFwLT5nZXRfa2V5X3R5cGUoKSkgPDwKLSAgICAiOyB2YWx1ZVR5cGU6ICIgPDwgdHlwZV90b19lbnVtKHRtYXAtPmdldF92YWxfdHlwZSgpKSA8PCAiOyBzaXplOiAiIDw8IGZuYW1lIDw8ICIgc2l6ZSkuIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBvdXQgPDwgaW5kZW50KCkgPDwgZm5hbWUgPDwgIiBrZXlzQW5kVmFsdWVzRG86IFs6IiA8PCBrZXkgPDwgIiA6IiA8PCB2YWwgPDwgIiB8IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBvdXQgPDwgaW5kZW50KCkgPDwgd3JpdGVfdmFsKHRtYXAtPmdldF9rZXlfdHlwZSgpLCBrZXkpIDw8ICIuIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgd3JpdGVfdmFsKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2YWwpOwotICBpbmRlbnRfZG93bigpOwotCi0gIG91dCA8PCAiXS4iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAib3Byb3Qgd3JpdGVNYXBFbmRdIHZhbHVlIjsKLSAgaW5kZW50X2Rvd24oKTsKLQotICByZXR1cm4gb3V0LnN0cigpOwotfQotCi1zdHJpbmcgdF9zdF9nZW5lcmF0b3I6Om1hcF9yZWFkZXIodF9tYXAgKnRtYXApIHsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKLSAgc3RyaW5nIGRlc2MgPSB0ZW1wX25hbWUoKTsKLSAgc3RyaW5nIHZhbCA9IHRlbXBfbmFtZSgpOwotCi0gIG91dCA8PCAiW3wiIDw8IGRlc2MgPDwgIiAiIDw8IHZhbCA8PCAifCAiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCBkZXNjIDw8ICIgOj0gaXByb3QgcmVhZE1hcEJlZ2luLiIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8IHZhbCA8PCAiIDo9IERpY3Rpb25hcnkgbmV3LiIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8IGRlc2MgPDwgIiBzaXplIHRpbWVzUmVwZWF0OiBbIiA8PCBlbmRsOwotCi0gIGluZGVudF91cCgpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgdmFsIDw8ICIgYXQ6ICIgPDwgcmVhZF92YWwodG1hcC0+Z2V0X2tleV90eXBlKCkpIDw8Ci0gICAgIiBwdXQ6ICIgPDwgcmVhZF92YWwodG1hcC0+Z2V0X3ZhbF90eXBlKCkpOwotICBpbmRlbnRfZG93bigpOwotCi0gIG91dCA8PCAiXS4iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiaXByb3QgcmVhZE1hcEVuZC4iIDw8IGVuZGwgPDwKLSAgaW5kZW50KCkgPDwgdmFsIDw8ICJdIHZhbHVlIjsKLSAgaW5kZW50X2Rvd24oKTsKLQotICByZXR1cm4gb3V0LnN0cigpOwotfQotCi1zdHJpbmcgdF9zdF9nZW5lcmF0b3I6Omxpc3Rfd3JpdGVyKHRfbGlzdCAqdGxpc3QsIHN0cmluZyBmbmFtZSkgewotICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OwotICBzdHJpbmcgdmFsID0gdGVtcF9uYW1lKCk7Ci0KLSAgb3V0IDw8ICJbb3Byb3Qgd3JpdGVMaXN0QmVnaW46IChUTGlzdCBuZXcgZWxlbVR5cGU6ICIgPDwKLSAgICB0eXBlX3RvX2VudW0odGxpc3QtPmdldF9lbGVtX3R5cGUoKSkgPDwgIjsgc2l6ZTogIiA8PCBmbmFtZSA8PCAiIHNpemUpLiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgb3V0IDw8IGluZGVudCgpIDw8IGZuYW1lIDw8ICIgZG86IFs6IiA8PCB2YWwgPDwgInwiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCB3cml0ZV92YWwodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgdmFsKSA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotCi0gIG91dCA8PCAiXS4iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAib3Byb3Qgd3JpdGVMaXN0RW5kXSB2YWx1ZSI7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgcmV0dXJuIG91dC5zdHIoKTsKLX0KLQotc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjpsaXN0X3JlYWRlcih0X2xpc3QgKnRsaXN0KSB7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7Ci0gIHN0cmluZyBkZXNjID0gdGVtcF9uYW1lKCk7Ci0gIHN0cmluZyB2YWwgPSB0ZW1wX25hbWUoKTsKLQotICBvdXQgPDwgIlt8IiA8PCBkZXNjIDw8ICIgIiA8PCB2YWwgPDwgInwgIiA8PCBkZXNjIDw8ICIgOj0gaXByb3QgcmVhZExpc3RCZWdpbi4iIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCB2YWwgPDwgIiA6PSBPcmRlcmVkQ29sbGVjdGlvbiBuZXcuIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgZGVzYyA8PCAiIHNpemUgdGltZXNSZXBlYXQ6IFsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X3VwKCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCB2YWwgPDwgIiBhZGQ6ICIgPDwgcmVhZF92YWwodGxpc3QtPmdldF9lbGVtX3R5cGUoKSk7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgb3V0IDw8ICJdLiIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJpcHJvdCByZWFkTGlzdEVuZC4iIDw8IGVuZGwgPDwKLSAgaW5kZW50KCkgPDwgdmFsIDw8ICJdIHZhbHVlIjsKLSAgaW5kZW50X2Rvd24oKTsKLQotICByZXR1cm4gb3V0LnN0cigpOwotfQotCi1zdHJpbmcgdF9zdF9nZW5lcmF0b3I6OnNldF93cml0ZXIodF9zZXQgKnRzZXQsIHN0cmluZyBmbmFtZSkgewotICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OwotICBzdHJpbmcgdmFsID0gdGVtcF9uYW1lKCk7Ci0KLSAgb3V0IDw8ICJbb3Byb3Qgd3JpdGVTZXRCZWdpbjogKFRTZXQgbmV3IGVsZW1UeXBlOiAiIDw8IHR5cGVfdG9fZW51bSh0c2V0LT5nZXRfZWxlbV90eXBlKCkpIDw8Ci0gICAgIjsgc2l6ZTogIiA8PCBmbmFtZSA8PCAiIHNpemUpLiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgb3V0IDw8IGluZGVudCgpIDw8IGZuYW1lIDw8ICIgZG86IFs6IiA8PCB2YWwgPDwgInwiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCB3cml0ZV92YWwodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCB2YWwpIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgb3V0IDw8ICJdLiIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdCB3cml0ZVNldEVuZF0gdmFsdWUiOwotICBpbmRlbnRfZG93bigpOwotCi0gIHJldHVybiBvdXQuc3RyKCk7Ci19Ci0KLXN0cmluZyB0X3N0X2dlbmVyYXRvcjo6c2V0X3JlYWRlcih0X3NldCAqdHNldCkgewotICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OwotICBzdHJpbmcgZGVzYyA9IHRlbXBfbmFtZSgpOwotICBzdHJpbmcgdmFsID0gdGVtcF9uYW1lKCk7Ci0KLSAgb3V0IDw8ICJbfCIgPDwgZGVzYyA8PCAiICIgPDwgdmFsIDw8ICJ8ICIgPDwgZGVzYyA8PCAiIDo9IGlwcm90IHJlYWRTZXRCZWdpbi4iIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCB2YWwgPDwgIiA6PSBTZXQgbmV3LiIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8IGRlc2MgPDwgIiBzaXplIHRpbWVzUmVwZWF0OiBbIiA8PCBlbmRsOwotCi0gIGluZGVudF91cCgpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgdmFsIDw8ICIgYWRkOiAiIDw8IHJlYWRfdmFsKHRzZXQtPmdldF9lbGVtX3R5cGUoKSk7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgb3V0IDw8ICJdLiIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJpcHJvdCByZWFkU2V0RW5kLiIgPDwgZW5kbCA8PAotICBpbmRlbnQoKSA8PCB2YWwgPDwgIl0gdmFsdWUiOwotICBpbmRlbnRfZG93bigpOwotCi0gIHJldHVybiBvdXQuc3RyKCk7Ci19Ci0KLXN0cmluZyB0X3N0X2dlbmVyYXRvcjo6c3RydWN0X3dyaXRlcih0X3N0cnVjdCAqdHN0cnVjdCwgc3RyaW5nIHNuYW1lKSB7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKLQotICBvdXQgPDwgIltvcHJvdCB3cml0ZVN0cnVjdEJlZ2luOiAiIDw8Ci0gICAgIihUU3RydWN0IG5ldyBuYW1lOiAnIiArIHRzdHJ1Y3QtPmdldF9uYW1lKCkgKyInKS4iIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgYm9vbCBvcHRpb25hbCA9ICgqZmxkX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTDsKLSAgICBzdHJpbmcgZm5hbWUgPSBjYW1lbGNhc2UoKCpmbGRfaXRlciktPmdldF9uYW1lKCkpOwotICAgIHN0cmluZyBhY2Nlc3NvciA9IHNuYW1lICsgIiAiICsgY2FtZWxjYXNlKGZuYW1lKTsKLQotICAgIGlmIChvcHRpb25hbCkgewotICAgICAgb3V0IDw8IGluZGVudCgpIDw8IGFjY2Vzc29yIDw8ICIgaWZOb3ROaWw6IFsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICB9Ci0KLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIm9wcm90IHdyaXRlRmllbGRCZWdpbjogKFRGaWVsZCBuZXcgbmFtZTogJyIgPDwgZm5hbWUgPDwKLSAgICAgICInOyB0eXBlOiAiIDw8IHR5cGVfdG9fZW51bSgoKmZsZF9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwKLSAgICAgICI7IGlkOiAiIDw8ICgqZmxkX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIikuIiA8PCBlbmRsOwotCi0gICAgb3V0IDw8IGluZGVudCgpIDw8IHdyaXRlX3ZhbCgoKmZsZF9pdGVyKS0+Z2V0X3R5cGUoKSwgYWNjZXNzb3IpIDw8ICIuIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAib3Byb3Qgd3JpdGVGaWVsZEVuZCI7Ci0KLSAgICBpZiAob3B0aW9uYWwpIHsKLSAgICAgIG91dCA8PCAiXSI7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgIH0KLQotICAgIG91dCA8PCAiLiIgPDwgZW5kbDsKLSAgfQotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qgd3JpdGVGaWVsZFN0b3A7IHdyaXRlU3RydWN0RW5kXSB2YWx1ZSI7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgcmV0dXJuIG91dC5zdHIoKTsKLX0KLQotc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjpzdHJ1Y3RfcmVhZGVyKHRfc3RydWN0ICp0c3RydWN0LCBzdHJpbmcgY2xzTmFtZSA9ICIiKSB7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOwotICBzdHJpbmcgdmFsID0gdGVtcF9uYW1lKCk7Ci0gIHN0cmluZyBkZXNjID0gdGVtcF9uYW1lKCk7Ci0gIHN0cmluZyBmb3VuZCA9IHRlbXBfbmFtZSgpOwotCi0gIGlmIChjbHNOYW1lLnNpemUoKSA9PSAwKSB7Ci0gICAgY2xzTmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7Ci0gIH0KLQotICBvdXQgPDwgIlt8IiA8PCBkZXNjIDw8ICIgIiA8PCB2YWwgPDwgInwiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIC8vVGhpcyBpcyBuYXN0eSwgYnV0IHdpdGhvdXQgaXQgd2UnbGwgYnJlYWsgdGhpbmdzIGJ5IHByZWZpeGluZyBUUmVzdWx0LgotICBzdHJpbmcgbmFtZSA9ICgoY2FwaXRhbGl6ZShjbHNOYW1lKSA9PSAiVFJlc3VsdCIpID8gY2FwaXRhbGl6ZShjbHNOYW1lKSA6IHByZWZpeChjbHNOYW1lKSk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCB2YWwgPDwgIiA6PSAiIDw8IG5hbWUgPDwgIiBuZXcuIiA8PCBlbmRsOwotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAiaXByb3QgcmVhZFN0cnVjdEJlZ2luLiIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJbIiA8PCBkZXNjIDw8ICIgOj0gaXByb3QgcmVhZEZpZWxkQmVnaW4uIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgZGVzYyA8PCAiIHR5cGUgPSBUVHlwZSBzdG9wXSB3aGlsZUZhbHNlOiBbfCIgPDwgZm91bmQgPDwgInwiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8IGRlc2MgPDwgIiBpZCA9ICIgPDwgKCpmbGRfaXRlciktPmdldF9rZXkoKSA8PAotICAgICAgIiBpZlRydWU6IFsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgZm91bmQgPDwgIiA6PSB0cnVlLiIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgdmFsIDw8ICIgIiA8PCBjYW1lbGNhc2UoKCpmbGRfaXRlciktPmdldF9uYW1lKCkpIDw8ICI6ICIgPDwKLSAgICAgIHJlYWRfdmFsKCgqZmxkX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICBpbmRlbnRfZG93bigpOwotCi0gICAgb3V0IDw8ICJdLiIgPDwgZW5kbDsKLSAgfQotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCBmb3VuZCA8PCAiIGlmTmlsOiBbaXByb3Qgc2tpcDogIiA8PCBkZXNjIDw8ICIgdHlwZV1dLiIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLQotICBvdXQgPDwgaW5kZW50KCkgPDwgIm9wcm90IHJlYWRTdHJ1Y3RFbmQuIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgdmFsIDw8ICJdIHZhbHVlIjsKLSAgaW5kZW50X2Rvd24oKTsKLQotICByZXR1cm4gb3V0LnN0cigpOwotfQotCi1zdHJpbmcgdF9zdF9nZW5lcmF0b3I6OndyaXRlX3ZhbCh0X3R5cGUgKnQsIHN0cmluZyBmbmFtZSkgewotICB0ID0gZ2V0X3RydWVfdHlwZSh0KTsKLQotICBpZiAodC0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopIHQpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuICJpcHJvdCB3cml0ZURvdWJsZTogIiArIGZuYW1lICsgIiBhc0Zsb2F0IjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJldHVybiAiaXByb3Qgd3JpdGUiICsgY2FwaXRhbGl6ZSh0eXBlX25hbWUodCkpICsgIjogIiArIGZuYW1lICsgIiBhc0ludGVnZXIiOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gImlwcm90IHdyaXRlIiArIGNhcGl0YWxpemUodHlwZV9uYW1lKHQpKSArICI6ICIgKyBmbmFtZTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodC0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gbWFwX3dyaXRlcigodF9tYXAqKSB0LCBmbmFtZSk7Ci0gIH0gZWxzZSBpZiAodC0+aXNfc3RydWN0KCkgfHwgdC0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiBzdHJ1Y3Rfd3JpdGVyKCh0X3N0cnVjdCopIHQsIGZuYW1lKTsKLSAgfSBlbHNlIGlmICh0LT5pc19saXN0KCkpIHsKLSAgICByZXR1cm4gbGlzdF93cml0ZXIoKHRfbGlzdCopIHQsIGZuYW1lKTsKLSAgfSBlbHNlIGlmICh0LT5pc19zZXQoKSkgewotICAgIHJldHVybiBzZXRfd3JpdGVyKCh0X3NldCopIHQsIGZuYW1lKTsKLSAgfSBlbHNlIGlmICh0LT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gImlwcm90IHdyaXRlSTMyOiAiICsgZm5hbWU7Ci0gIH0gZWxzZSB7Ci0gICAgdGhyb3cgIlNvcnJ5LCBJIGRvbid0IGtub3cgaG93IHRvIHdyaXRlIHRoaXM6ICIgKyB0eXBlX25hbWUodCk7Ci0gIH0KLX0KLQotc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjpyZWFkX3ZhbCh0X3R5cGUgKnQpIHsKLSAgdCA9IGdldF90cnVlX3R5cGUodCk7Ci0KLSAgaWYgKHQtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgcmV0dXJuICJpcHJvdCByZWFkIiArIGNhcGl0YWxpemUodHlwZV9uYW1lKHQpKTsKLSAgfSBlbHNlIGlmICh0LT5pc19tYXAoKSkgewotICAgIHJldHVybiBtYXBfcmVhZGVyKCh0X21hcCopIHQpOwotICB9IGVsc2UgaWYgKHQtPmlzX3N0cnVjdCgpIHx8IHQtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gc3RydWN0X3JlYWRlcigodF9zdHJ1Y3QqKSB0KTsKLSAgfSBlbHNlIGlmICh0LT5pc19saXN0KCkpIHsKLSAgICByZXR1cm4gbGlzdF9yZWFkZXIoKHRfbGlzdCopIHQpOwotICB9IGVsc2UgaWYgKHQtPmlzX3NldCgpKSB7Ci0gICAgcmV0dXJuIHNldF9yZWFkZXIoKHRfc2V0KikgdCk7Ci0gIH0gZWxzZSBpZiAodC0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJpcHJvdCByZWFkSTMyIjsKLSAgfSBlbHNlIHsKLSAgICB0aHJvdyAiU29ycnksIEkgZG9uJ3Qga25vdyBob3cgdG8gcmVhZCB0aGlzOiAiICsgdHlwZV9uYW1lKHQpOwotICB9Ci19Ci0KLXZvaWQgdF9zdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlbmRfbWV0aG9kKHRfZnVuY3Rpb24qIGZ1bmN0aW9uKSB7Ci0gIHN0cmluZyBmdW5uYW1lID0gZnVuY3Rpb24tPmdldF9uYW1lKCk7Ci0gIHN0cmluZyBzaWduYXR1cmUgPSBmdW5jdGlvbl9zaWduYXR1cmUoZnVuY3Rpb24pOwotICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKLQotICBzdF9tZXRob2QoZl8sIGNsaWVudF9jbGFzc19uYW1lKCksICJzZW5kIiArIGNhcGl0YWxpemUoc2lnbmF0dXJlKSk7Ci0gIGZfIDw8ICJvcHJvdCB3cml0ZU1lc3NhZ2VCZWdpbjoiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGZfIDw8IGluZGVudCgpIDw8ICIoVENhbGxNZXNzYWdlIG5ldyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgZl8gPDwgaW5kZW50KCkgPDwgIm5hbWU6ICciIDw8IGZ1bm5hbWUgPDwgIic7ICIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJzZXFpZDogc2VsZiBuZXh0U2VxaWQpLiIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50X2Rvd24oKTsKLQotICBmXyA8PCBpbmRlbnQoKSA8PCAib3Byb3Qgd3JpdGVTdHJ1Y3RCZWdpbjogIiA8PAotICAgICIoVFN0cnVjdCBuZXcgbmFtZTogJyIgKyBjYXBpdGFsaXplKGNhbWVsY2FzZShmdW5uYW1lKSkgKyAiX2FyZ3MnKS4iIDw8IGVuZGw7Ci0KLSAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKLSAgICBzdHJpbmcgZm5hbWUgPSBjYW1lbGNhc2UoKCpmbGRfaXRlciktPmdldF9uYW1lKCkpOwotCi0gICAgZl8gPDwgaW5kZW50KCkgPDwgIm9wcm90IHdyaXRlRmllbGRCZWdpbjogKFRGaWVsZCBuZXcgbmFtZTogJyIgPDwgZm5hbWUgPDwKLSAgICAgICInOyB0eXBlOiAiIDw8IHR5cGVfdG9fZW51bSgoKmZsZF9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwKLSAgICAgICI7IGlkOiAiIDw8ICgqZmxkX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIikuIiA8PCBlbmRsOwotCi0gICAgZl8gPDwgaW5kZW50KCkgPDwgd3JpdGVfdmFsKCgqZmxkX2l0ZXIpLT5nZXRfdHlwZSgpLCBmbmFtZSkgPDwgIi4iIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJvcHJvdCB3cml0ZUZpZWxkRW5kLiIgPDwgZW5kbDsKLSAgfQotCi0gIGZfIDw8IGluZGVudCgpIDw8ICJvcHJvdCB3cml0ZUZpZWxkU3RvcDsgd3JpdGVTdHJ1Y3RFbmQ7IHdyaXRlTWVzc2FnZUVuZC4iIDw8IGVuZGw7Ci0gIGZfIDw8IGluZGVudCgpIDw8ICJvcHJvdCB0cmFuc3BvcnQgZmx1c2giOwotCi0gIHN0X2Nsb3NlX21ldGhvZChmXyk7Ci19Ci0KLS8vIFdlIG9ubHkgc3VwcG9ydCByZWNlaXZpbmcgVFJlc3VsdCBzdHJ1Y3R1cmVzIChzbyB0aGlzIHdvbid0IHdvcmsgb24gdGhlIHNlcnZlciBzaWRlKQotdm9pZCB0X3N0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfcmVjdl9tZXRob2QodF9mdW5jdGlvbiogZnVuY3Rpb24pIHsKLSAgc3RyaW5nIGZ1bm5hbWUgPSBjYW1lbGNhc2UoZnVuY3Rpb24tPmdldF9uYW1lKCkpOwotICBzdHJpbmcgc2lnbmF0dXJlID0gZnVuY3Rpb25fc2lnbmF0dXJlKGZ1bmN0aW9uKTsKLQotICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sICJUUmVzdWx0Iik7Ci0gIHRfZmllbGQgc3VjY2VzcyhmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKLSAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7Ci0KLSAgdF9zdHJ1Y3QqIHhzID0gZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAvLyBkdXBsaWNhdGUgdGhlIGZpZWxkLCBidXQgY2FsbCBpdCAiZXhjZXB0aW9uIi4uLiB3ZSBkb24ndCBuZWVkIGEgZHluYW1pYyBuYW1lCi0gICAgdF9maWVsZCAqZXhjZXB0aW9uID0gbmV3IHRfZmllbGQoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpLCAiZXhjZXB0aW9uIiwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkpOwotICAgIHJlc3VsdC5hcHBlbmQoZXhjZXB0aW9uKTsKLSAgfQotCi0gIHN0X21ldGhvZChmXywgY2xpZW50X2NsYXNzX25hbWUoKSwgInJlY3YiICsgY2FwaXRhbGl6ZShmdW5uYW1lKSk7Ci0gIGZfIDw8ICJ8IGYgbXNnIHJlcyB8ICIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJtc2cgOj0gb3Byb3QgcmVhZE1lc3NhZ2VCZWdpbi4iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAic2VsZiB2YWxpZGF0ZVJlbW90ZU1lc3NhZ2U6IG1zZy4iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAicmVzIDo9ICIgPDwgc3RydWN0X3JlYWRlcigmcmVzdWx0KSA8PCAiLiIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdCByZWFkTWVzc2FnZUVuZC4iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAib3Byb3QgdHJhbnNwb3J0IGZsdXNoLiIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJyZXMgZXhjZXB0aW9uIGlmTm90TmlsOiBbcmVzIGV4Y2VwdGlvbiBzaWduYWxdLiIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJeIHJlcyI7Ci0gIHN0X2Nsb3NlX21ldGhvZChmXyk7Ci19Ci0KLXN0cmluZyB0X3N0X2dlbmVyYXRvcjo6ZnVuY3Rpb25fdHlwZXNfY29tbWVudCh0X2Z1bmN0aW9uKiBmbikgewotICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBmbi0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIG91dCA8PCAiXCIiOwotCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgb3V0IDw8IGNhbWVsY2FzZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICI6ICIgPDwgdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgaWYgKChmX2l0ZXIgKyAxKSAhPSBmaWVsZHMuZW5kKCkpIHsKLSAgICAgIG91dCA8PCAiLCAiOwotICAgIH0KLSAgfQotCi0gIG91dCA8PCAiXCIiOwotCi0gIHJldHVybiBvdXQuc3RyKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgotICovCi12b2lkIHRfc3RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIHN0cmluZyBleHRlbmRzX2NsaWVudCA9ICJUQ2xpZW50IjsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0KLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBleHRlbmRzX2NsaWVudCA9IGV4dGVuZHMgKyAiQ2xpZW50IjsKLSAgfQotCi0gIGZfIDw8IGV4dGVuZHNfY2xpZW50IDw8ICIgc3ViY2xhc3M6ICMiIDw8IHByZWZpeChjbGllbnRfY2xhc3NfbmFtZSgpKSA8PCBlbmRsIDw8Ci0gICAgIlx0aW5zdGFuY2VWYXJpYWJsZU5hbWVzOiAnJ1xuIiA8PAotICAgICJcdGNsYXNzVmFyaWFibGVOYW1lczogJydcbiIgPDwKLSAgICAiXHRwb29sRGljdGlvbmFyaWVzOiAnJ1xuIiA8PAotICAgICJcdGNhdGVnb3J5OiAnIiA8PCBnZW5lcmF0ZWRfY2F0ZWdvcnkoKSA8PCAiJyFcblxuIjsKLQotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHN0cmluZyBmdW5uYW1lID0gY2FtZWxjYXNlKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSk7Ci0gICAgc3RyaW5nIHNpZ25hdHVyZSA9IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKTsKLQotICAgIHN0X21ldGhvZChmXywgY2xpZW50X2NsYXNzX25hbWUoKSwgc2lnbmF0dXJlKTsKLSAgICBmXyA8PCBmdW5jdGlvbl90eXBlc19jb21tZW50KCpmX2l0ZXIpIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJzZWxmIHNlbmQiIDw8IGNhcGl0YWxpemUoc2lnbmF0dXJlKSA8PCAiLiIgPDwgZW5kbDsKLQotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgZl8gPDwgaW5kZW50KCkgPDwgIl4gc2VsZiByZWN2IiA8PCBjYXBpdGFsaXplKGZ1bm5hbWUpIDw8ICIgc3VjY2VzcyAiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgc3RfY2xvc2VfbWV0aG9kKGZfKTsKLQotICAgIGdlbmVyYXRlX3NlbmRfbWV0aG9kKCpmX2l0ZXIpOwotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgZ2VuZXJhdGVfcmVjdl9tZXRob2QoKmZfaXRlcik7Ci0gICAgfQotICB9Ci19Ci0KLS8qKgotICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAndHlwZSBuYW1lKGFyZ3MpJwotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgotICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgotICovCi1zdHJpbmcgdF9zdF9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgcmV0dXJuIGNhbWVsY2FzZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpICsgY2FwaXRhbGl6ZShhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSkpOwotfQotCi0vKioKLSAqIFJlbmRlcnMgYSBmaWVsZCBsaXN0Ci0gKi8KLXN0cmluZyB0X3N0X2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlc3VsdCArPSAiICI7Ci0gICAgfQotICAgIHN0cmluZyBuYW1lID0gY2FtZWxjYXNlKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSk7Ci0gICAgcmVzdWx0ICs9IG5hbWUgKyAiOiAiICsgbmFtZTsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi1zdHJpbmcgdF9zdF9nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlKSB7Ci0gIHN0cmluZyBwcmVmaXggPSAiIjsKLSAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHR5cGUtPmdldF9wcm9ncmFtKCk7Ci0gIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgewotICAgIGlmICghdHR5cGUtPmlzX3NlcnZpY2UoKSkgewotICAgICAgcHJlZml4ID0gcHJvZ3JhbS0+Z2V0X25hbWUoKSArICJfdHlwZXMuIjsKLSAgICB9Ci0gIH0KLQotICBzdHJpbmcgbmFtZSA9IHR0eXBlLT5nZXRfbmFtZSgpOwotICBpZiAodHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgbmFtZSA9IGNhcGl0YWxpemUodHR5cGUtPmdldF9uYW1lKCkpOwotICB9Ci0KLSAgcmV0dXJuIHByZWZpeCArIG5hbWU7Ci19Ci0KLS8qIENvbnZlcnQgdF90eXBlIHRvIFNtYWxsdGFsayB0eXBlIGNvZGUgKi8KLXN0cmluZyB0X3N0X2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIHJldHVybiAiVFR5cGUgc3RyaW5nIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICByZXR1cm4gIlRUeXBlIGJvb2wiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIHJldHVybiAiVFR5cGUgYnl0ZSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICByZXR1cm4gIlRUeXBlIGkxNiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICByZXR1cm4gIlRUeXBlIGkzMiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZXR1cm4gIlRUeXBlIGk2NCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICByZXR1cm4gIlRUeXBlIGRvdWJsZSI7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAiVFR5cGUgaTMyIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgcmV0dXJuICJUVHlwZSBzdHJ1Y3QiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZSBtYXAiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZSBzZXQiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHJldHVybiAiVFR5cGUgbGlzdCI7Ci0gIH0KLQotICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Ci19Ci0KLQotVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUihzdCwgIlNtYWxsdGFsayIsICIiKQotCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfeHNkX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF94c2RfZ2VuZXJhdG9yLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTM1ZjZhLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF94c2RfZ2VuZXJhdG9yLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzY3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGZzdHJlYW0+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlICJ0X2dlbmVyYXRvci5oIgotI2luY2x1ZGUgInBsYXRmb3JtLmgiCi0KLXVzaW5nIHN0ZDo6bWFwOwotdXNpbmcgc3RkOjpvZnN0cmVhbTsKLXVzaW5nIHN0ZDo6b3N0cmVhbTsKLXVzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKLXVzaW5nIHN0ZDo6c3RyaW5nOwotdXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07Ci11c2luZyBzdGQ6OnZlY3RvcjsKLQotc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsID0gIlxuIjsgIC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKLQotLyoqCi0gKiBYU0QgZ2VuZXJhdG9yLCBjcmVhdGVzIGFuIFhTRCBmb3IgdGhlIGJhc2UgdHlwZXMgZXRjLgotICoKLSAqLwotY2xhc3MgdF94c2RfZ2VuZXJhdG9yIDogcHVibGljIHRfZ2VuZXJhdG9yIHsKLSBwdWJsaWM6Ci0gIHRfeHNkX2dlbmVyYXRvcigKLSAgICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSwKLSAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAotICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCi0gICAgOiB0X2dlbmVyYXRvcihwcm9ncmFtKQotICB7Ci0gICAgKHZvaWQpIHBhcnNlZF9vcHRpb25zOwotICAgICh2b2lkKSBvcHRpb25fc3RyaW5nOwotICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLXhzZCI7Ci0gIH0KLQotICB2aXJ0dWFsIH50X3hzZF9nZW5lcmF0b3IoKSB7fQotCi0gIC8qKgotICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCi0gICAqLwotCi0gIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKLSAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKLQotICAvKioKLSAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZik7Ci0gIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7Ci0gICAgKHZvaWQpIHRlbnVtOwotICB9Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCk7Ci0KLSBwcml2YXRlOgotCi0gIHZvaWQgZ2VuZXJhdGVfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgbmFtZSwgdF90eXBlKiB0dHlwZSwgdF9zdHJ1Y3QqIGF0dHJzPU5VTEwsIGJvb2wgb3B0aW9uYWw9ZmFsc2UsIGJvb2wgbmlsbGFibGU9ZmFsc2UsIGJvb2wgbGlzdF9lbGVtZW50PWZhbHNlKTsKLQotICBzdGQ6OnN0cmluZyBucyhzdGQ6OnN0cmluZyBpbiwgc3RkOjpzdHJpbmcgbnMpIHsKLSAgICByZXR1cm4gbnMgKyAiOiIgKyBpbjsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIHhzZChzdGQ6OnN0cmluZyBpbikgewotICAgIHJldHVybiBucyhpbiwgInhzZCIpOwotICB9Ci0KLSAgc3RkOjpzdHJpbmcgdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpOwotICBzdGQ6OnN0cmluZyBiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlKTsKLQotICAvKioKLSAgICogT3V0cHV0IHhzZC9waHAgZmlsZQotICAgKi8KLSAgc3RkOjpvZnN0cmVhbSBmX3hzZF87Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9waHBfOwotCi0gIC8qKgotICAgKiBPdXRwdXQgc3RyaW5nIHN0cmVhbQotICAgKi8KLSAgc3RkOjpvc3RyaW5nc3RyZWFtIHNfeHNkX3R5cGVzXzsKLQotfTsKLQotCi12b2lkIHRfeHNkX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQotICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOwotCi0gIC8vIE1ha2Ugb3V0cHV0IGZpbGUKLSAgc3RyaW5nIGZfcGhwX25hbWUgPSBnZXRfb3V0X2RpcigpK3Byb2dyYW1fLT5nZXRfbmFtZSgpKyJfeHNkLnBocCI7Ci0gIGZfcGhwXy5vcGVuKGZfcGhwX25hbWUuY19zdHIoKSk7Ci0KLSAgZl9waHBfIDw8Ci0gICAgIjw/cGhwIiA8PCBlbmRsOwotCi19Ci0KLXZvaWQgdF94c2RfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7Ci0gIGZfcGhwXyA8PCAiPz4iIDw8IGVuZGw7Ci0gIGZfcGhwXy5jbG9zZSgpOwotfQotCi12b2lkIHRfeHNkX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7Ci0gIGluZGVudChzX3hzZF90eXBlc18pIDw8Ci0gICAgIjx4c2Q6c2ltcGxlVHlwZSBuYW1lPVwiIiA8PCB0dHlwZWRlZi0+Z2V0X25hbWUoKSA8PCAiXCI+IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaWYgKHR0eXBlZGVmLT5nZXRfdHlwZSgpLT5pc19zdHJpbmcoKSAmJiAoKHRfYmFzZV90eXBlKil0dHlwZWRlZi0+Z2V0X3R5cGUoKSktPmlzX3N0cmluZ19lbnVtKCkpIHsKLSAgICBpbmRlbnQoc194c2RfdHlwZXNfKSA8PAotICAgICAgIjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT1cIiIgPDwgdHlwZV9uYW1lKHR0eXBlZGVmLT5nZXRfdHlwZSgpKSA8PCAiXCI+IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGNvbnN0IHZlY3RvcjxzdHJpbmc+JiB2YWx1ZXMgPSAoKHRfYmFzZV90eXBlKil0dHlwZWRlZi0+Z2V0X3R5cGUoKSktPmdldF9zdHJpbmdfZW51bV92YWxzKCk7Ci0gICAgdmVjdG9yPHN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbHVlcy5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsdWVzLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgaW5kZW50KHNfeHNkX3R5cGVzXykgPDwKLSAgICAgICAgIjx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9XCIiIDw8ICgqdl9pdGVyKSA8PCAiXCIgLz4iIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KHNfeHNkX3R5cGVzXykgPDwKLSAgICAgICI8L3hzZDpyZXN0cmljdGlvbj4iIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgaW5kZW50KHNfeHNkX3R5cGVzXykgPDwKLSAgICAgICI8eHNkOnJlc3RyaWN0aW9uIGJhc2U9XCIiIDw8IHR5cGVfbmFtZSh0dHlwZWRlZi0+Z2V0X3R5cGUoKSkgPDwgIlwiIC8+IiA8PCBlbmRsOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChzX3hzZF90eXBlc18pIDw8Ci0gICAgIjwveHNkOnNpbXBsZVR5cGU+IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF94c2RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgYm9vbCB4c2RfYWxsID0gdHN0cnVjdC0+Z2V0X3hzZF9hbGwoKTsKLQotICBpbmRlbnQoc194c2RfdHlwZXNfKSA8PCAiPHhzZDpjb21wbGV4VHlwZSBuYW1lPVwiIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICJcIj4iIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpZiAoeHNkX2FsbCkgewotICAgIGluZGVudChzX3hzZF90eXBlc18pIDw8ICI8eHNkOmFsbD4iIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgaW5kZW50KHNfeHNkX3R5cGVzXykgPDwgIjx4c2Q6c2VxdWVuY2U+IiA8PCBlbmRsOwotICB9Ci0gIGluZGVudF91cCgpOwotCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9lbGVtZW50KHNfeHNkX3R5cGVzXywgKCptX2l0ZXIpLT5nZXRfbmFtZSgpLCAoKm1faXRlciktPmdldF90eXBlKCksICgqbV9pdGVyKS0+Z2V0X3hzZF9hdHRycygpLCAoKm1faXRlciktPmdldF94c2Rfb3B0aW9uYWwoKSB8fCB4c2RfYWxsLCAoKm1faXRlciktPmdldF94c2RfbmlsbGFibGUoKSk7Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBpZiAoeHNkX2FsbCkgewotICAgIGluZGVudChzX3hzZF90eXBlc18pIDw8ICI8L3hzZDphbGw+IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGluZGVudChzX3hzZF90eXBlc18pIDw8ICI8L3hzZDpzZXF1ZW5jZT4iIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KHNfeHNkX3R5cGVzXykgPDwKLSAgICAiPC94c2Q6Y29tcGxleFR5cGU+IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLX0KLQotdm9pZCB0X3hzZF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VsZW1lbnQob3N0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIGF0dHJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBvcHRpb25hbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbmlsbGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGxpc3RfZWxlbWVudCkgewotICBzdHJpbmcgc21pbk9jY3VycyA9IChvcHRpb25hbCB8fCBsaXN0X2VsZW1lbnQpID8gIiBtaW5PY2N1cnM9XCIwXCIiIDogIiI7Ci0gIHN0cmluZyBzbWF4T2NjdXJzID0gbGlzdF9lbGVtZW50ID8gIiBtYXhPY2N1cnM9XCJ1bmJvdW5kZWRcIiIgOiAiIjsKLSAgc3RyaW5nIHNvcHRpb25hbCA9IHNtaW5PY2N1cnMgKyBzbWF4T2NjdXJzOwotICBzdHJpbmcgc25pbGxhYmxlID0gbmlsbGFibGUgPyAiIG5pbGxhYmxlPVwidHJ1ZVwiIiA6ICIiOwotCi0gIGlmICh0dHlwZS0+aXNfdm9pZCgpIHx8IHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIjx4c2Q6ZWxlbWVudCBuYW1lPVwiIiA8PCBuYW1lIDw8ICJcIiIgPDwgc29wdGlvbmFsIDw8IHNuaWxsYWJsZSA8PCAiPiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpZiAoYXR0cnMgPT0gTlVMTCAmJiB0dHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAiPHhzZDpjb21wbGV4VHlwZSAvPiIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgIjx4c2Q6Y29tcGxleFR5cGU+IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAiPHhzZDpzZXF1ZW5jZSBtaW5PY2N1cnM9XCIwXCIgbWF4T2NjdXJzPVwidW5ib3VuZGVkXCI+IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgICAgc3RyaW5nIHN1Ym5hbWU7Ci0gICAgICAgIHRfdHlwZSogc3VidHlwZSA9ICgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICAgICAgaWYgKHN1YnR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHN1YnR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgICAgICAgc3VibmFtZSA9IG5hbWUgKyAiX2VsdCI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgc3VibmFtZSA9IHR5cGVfbmFtZShzdWJ0eXBlKTsKLSAgICAgICAgfQotICAgICAgICBmX3BocF8gPDwgIiRHTE9CQUxTWyciIDw8IHByb2dyYW1fLT5nZXRfbmFtZSgpIDw8ICJfeHNkX2VsdF8iIDw8IG5hbWUgPDwgIiddID0gJyIgPDwgc3VibmFtZSA8PCAiJzsiIDw8IGVuZGw7Ci0gICAgICAgIGdlbmVyYXRlX2VsZW1lbnQob3V0LCBzdWJuYW1lLCBzdWJ0eXBlLCBOVUxMLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICBpbmRlbnQob3V0KSA8PCAiPC94c2Q6c2VxdWVuY2U+IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnQob3V0KSA8PCAiPHhzZDphdHRyaWJ1dGUgbmFtZT1cImxpc3RcIiB0eXBlPVwieHNkOmJvb2xlYW5cIiAvPiIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIGlmIChhdHRycyAhPSBOVUxMKSB7Ci0gICAgICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSBhdHRycy0+Z2V0X21lbWJlcnMoKTsKLSAgICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgYV9pdGVyOwotICAgICAgICBmb3IgKGFfaXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgYV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrYV9pdGVyKSB7Ci0gICAgICAgICAgaW5kZW50KG91dCkgPDwgIjx4c2Q6YXR0cmlidXRlIG5hbWU9XCIiIDw8ICgqYV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIgdHlwZT1cIiIgPDwgdHlwZV9uYW1lKCgqYV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIlwiIC8+IiA8PCBlbmRsOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgIjwveHNkOmNvbXBsZXhUeXBlPiIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIjwveHNkOmVsZW1lbnQ+IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGlmIChhdHRycyA9PSBOVUxMKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAiPHhzZDplbGVtZW50IG5hbWU9XCIiIDw8IG5hbWUgPDwgIlwiIiA8PCAiIHR5cGU9XCIiIDw8IHR5cGVfbmFtZSh0dHlwZSkgPDwgIlwiIiA8PCBzb3B0aW9uYWwgPDwgc25pbGxhYmxlIDw8ICIgLz4iIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIFdvdywgYWxsIHRoaXMgd29yayBmb3IgYSBTSU1QTEUgVFlQRSB3aXRoIGF0dHJpYnV0ZXM/IT8hPyEKLSAgICAgIGluZGVudChvdXQpIDw8ICI8eHNkOmVsZW1lbnQgbmFtZT1cIiIgPDwgbmFtZSA8PCAiXCIiIDw8IHNvcHRpb25hbCA8PCBzbmlsbGFibGUgPDwgIj4iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICI8eHNkOmNvbXBsZXhUeXBlPiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgaW5kZW50KG91dCkgPDwgIjx4c2Q6Y29tcGxleENvbnRlbnQ+IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiPHhzZDpleHRlbnNpb24gYmFzZT1cIiIgPDwgdHlwZV9uYW1lKHR0eXBlKSA8PCAiXCI+IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gYXR0cnMtPmdldF9tZW1iZXJzKCk7Ci0gICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBhX2l0ZXI7Ci0gICAgICBmb3IgKGFfaXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgYV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrYV9pdGVyKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICI8eHNkOmF0dHJpYnV0ZSBuYW1lPVwiIiA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiIHR5cGU9XCIiIDw8IHR5cGVfbmFtZSgoKmFfaXRlciktPmdldF90eXBlKCkpIDw8ICJcIiAvPiIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiPC94c2Q6ZXh0ZW5zaW9uPiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiPC94c2Q6Y29tcGxleENvbnRlbnQ+IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICI8L3hzZDpjb21wbGV4VHlwZT4iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIjwveHNkOmVsZW1lbnQ+IiA8PCBlbmRsOwotICAgIH0KLSAgfQotfQotCi12b2lkIHRfeHNkX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGZpbGUKLSAgc3RyaW5nIGZfeHNkX25hbWUgPSBnZXRfb3V0X2RpcigpK3RzZXJ2aWNlLT5nZXRfbmFtZSgpKyIueHNkIjsKLSAgZl94c2RfLm9wZW4oZl94c2RfbmFtZS5jX3N0cigpKTsKLQotICBzdHJpbmcgbnMgPSBwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgieHNkIik7Ci0gIGlmIChucy5zaXplKCkgPiAwKSB7Ci0gICAgbnMgPSAiIHRhcmdldE5hbWVzcGFjZT1cIiIgKyBucyArICJcIiB4bWxucz1cIiIgKyBucyArICJcIiAiICsKLSAgICAgICJlbGVtZW50Rm9ybURlZmF1bHQ9XCJxdWFsaWZpZWRcIiI7Ci0gIH0KLQotICAvLyBQcmludCB0aGUgWFNEIGhlYWRlcgotICBmX3hzZF8gPDwKLSAgICAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIiA/PiIgPDwgZW5kbCA8PAotICAgICI8eHNkOnNjaGVtYSB4bWxuczp4c2Q9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYVwiIiA8PCBucyA8PCAiPiIgPDwgZW5kbCA8PAotICAgIGVuZGwgPDwKLSAgICAiPCEtLSBZbyB5byB5bywgdGhpcyBYU0Qgd296IGJlIGdlbmVyYXRlZCBieSBUaHJpZnQuIC0tPiIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgLy8gUHJpbnQgb3V0IHRoZSB0eXBlIGRlZmluaXRpb25zCi0gIGluZGVudChmX3hzZF8pIDw8IHNfeHNkX3R5cGVzXy5zdHIoKTsKLQotICAvLyBLZWVwIGEgbGlzdCBvZiBhbGwgdGhlIHBvc3NpYmxlIGV4Y2VwdGlvbnMgdGhhdCBtaWdodCBnZXQgdGhyb3duCi0gIG1hcDxzdHJpbmcsIHRfc3RydWN0Kj4gYWxsX3hjZXB0aW9uczsKLQotICAvLyBMaXN0IHRoZSBlbGVtZW50cyB0aGF0IHlvdSBtaWdodCBhY3R1YWxseSBnZXQKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgc3RyaW5nIGVsZW1uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9yZXNwb25zZSI7Ci0gICAgdF90eXBlKiByZXR1cm50eXBlID0gKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpOwotICAgIGdlbmVyYXRlX2VsZW1lbnQoZl94c2RfLCBlbGVtbmFtZSwgcmV0dXJudHlwZSk7Ci0gICAgZl94c2RfIDw8IGVuZGw7Ci0KLSAgICB0X3N0cnVjdCogeHMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKLSAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLSAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgYWxsX3hjZXB0aW9uc1soKnhfaXRlciktPmdldF9uYW1lKCldID0gKHRfc3RydWN0KikoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICB9Ci0gIH0KLQotICBtYXA8c3RyaW5nLCB0X3N0cnVjdCo+OjppdGVyYXRvciBheF9pdGVyOwotICBmb3IgKGF4X2l0ZXIgPSBhbGxfeGNlcHRpb25zLmJlZ2luKCk7IGF4X2l0ZXIgIT0gYWxsX3hjZXB0aW9ucy5lbmQoKTsgKytheF9pdGVyKSB7Ci0gICAgZ2VuZXJhdGVfZWxlbWVudChmX3hzZF8sIGF4X2l0ZXItPmZpcnN0LCBheF9pdGVyLT5zZWNvbmQpOwotICB9Ci0KLSAgLy8gQ2xvc2UgdGhlIFhTRCBkb2N1bWVudAotICBmX3hzZF8gPDwgZW5kbCA8PCAiPC94c2Q6c2NoZW1hPiIgPDwgZW5kbDsKLSAgZl94c2RfLmNsb3NlKCk7Ci19Ci0KLXN0cmluZyB0X3hzZF9nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlKSB7Ci0gIGlmICh0dHlwZS0+aXNfdHlwZWRlZigpKSB7Ci0gICAgcmV0dXJuIHR0eXBlLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHJldHVybiB4c2QoYmFzZV90eXBlX25hbWUoKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpKSk7Ci0gIH0KLQotICBpZiAodHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiB4c2QoImludCIpOwotICB9Ci0KLSAgaWYgKHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiB0dHlwZS0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIHJldHVybiAiY29udGFpbmVyIjsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIHRoZSBYU0QgdHlwZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSB0aHJpZnQgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdGJhc2UgVGhlIGJhc2UgdHlwZQotICogQHJldHVybiBFeHBsaWNpdCBYU0QgdHlwZSwgaS5lLiB4c2Q6c3RyaW5nCi0gKi8KLXN0cmluZyB0X3hzZF9nZW5lcmF0b3I6OmJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UpIHsKLSAgc3dpdGNoICh0YmFzZSkgewotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgcmV0dXJuICJ2b2lkIjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgcmV0dXJuICJzdHJpbmciOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgcmV0dXJuICJib29sZWFuIjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgIHJldHVybiAiYnl0ZSI7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgIHJldHVybiAic2hvcnQiOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICByZXR1cm4gImludCI7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgIHJldHVybiAibG9uZyI7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgIHJldHVybiAiZGVjaW1hbCI7Ci0gIGRlZmF1bHQ6Ci0gICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBYU0QgYmFzZSB0eXBlIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgfQotfQotCi1USFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKHhzZCwgIlhTRCIsICIiKQotCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL2dsb2JhbHMuaCBiL2NvbXBpbGVyL2NwcC9zcmMvZ2xvYmFscy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjkyNGYxLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvZ2xvYmFscy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBUX0dMT0JBTFNfSAotI2RlZmluZSBUX0dMT0JBTFNfSAotCi0jaW5jbHVkZSA8c2V0PgotI2luY2x1ZGUgPHF1ZXVlPgotI2luY2x1ZGUgPHN0YWNrPgotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLS8qKgotICogVGhpcyBtb2R1bGUgY29udGFpbnMgYWxsIHRoZSBnbG9iYWwgdmFyaWFibGVzIChzbGFwIG9uIHRoZSB3cmlzdCkgdGhhdCBhcmUKLSAqIHNoYXJlZCB0aHJvdWdob3V0IHRoZSBwcm9ncmFtLiBUaGUgcmVhc29uIGZvciB0aGlzIGlzIHRvIGZhY2lsaXRhdGUgc2ltcGxlCi0gKiBpbnRlcmFjdGlvbiBiZXR3ZWVuIHRoZSBwYXJzZXIgYW5kIHRoZSByZXN0IG9mIHRoZSBwcm9ncmFtLiBCZWZvcmUgY2FsbGluZwotICogeXlwYXJzZSgpLCB0aGUgbWFpbi5jYyBwcm9ncmFtIHdpbGwgbWFrZSBuZWNlc3NhcnkgYWRqdXN0bWVudHMgdG8gdGhlc2UKLSAqIGdsb2JhbCB2YXJpYWJsZXMgc3VjaCB0aGF0IHRoZSBwYXJzZXIgZG9lcyB0aGUgcmlnaHQgdGhpbmcgYW5kIHB1dHMgZW50cmllcwotICogaW50byB0aGUgcmlnaHQgY29udGFpbmVycywgZXRjLgotICoKLSAqLwotCi0vKioKLSAqIEhvb3JheSBmb3IgZm9yd2FyZCBkZWNsYXJhdGlvbiBvZiB0eXBlcyEKLSAqLwotCi1jbGFzcyB0X3Byb2dyYW07Ci1jbGFzcyB0X3Njb3BlOwotY2xhc3MgdF90eXBlOwotCi0vKioKLSAqIFBhcnNpbmcgbW9kZSwgdHdvIHBhc3NlcyB1cCBpbiB0aGlzIGdpbiBydW1teSEKLSAqLwotCi1lbnVtIFBBUlNFX01PREUgewotICBJTkNMVURFUyA9IDEsCi0gIFBST0dSQU0gPSAyCi19OwotCi0vKioKLSAqIFN0cmljdG5lc3MgbGV2ZWwKLSAqLwotZXh0ZXJuIGludCBnX3N0cmljdDsKLQotLyoqCi0gKiBUaGUgbWFzdGVyIHByb2dyYW0gcGFyc2UgdHJlZS4gVGhpcyBpcyBhY2Nlc3NlZCBmcm9tIHdpdGhpbiB0aGUgcGFyc2VyIGNvZGUKLSAqIHRvIGJ1aWxkIHVwIHRoZSBwcm9ncmFtIGVsZW1lbnRzLgotICovCi1leHRlcm4gdF9wcm9ncmFtKiBnX3Byb2dyYW07Ci0KLS8qKgotICogR2xvYmFsIHR5cGVzIGZvciB0aGUgcGFyc2VyIHRvIGJlIGFibGUgdG8gcmVmZXJlbmNlCi0gKi8KLQotZXh0ZXJuIHRfdHlwZSogZ190eXBlX3ZvaWQ7Ci1leHRlcm4gdF90eXBlKiBnX3R5cGVfc3RyaW5nOwotZXh0ZXJuIHRfdHlwZSogZ190eXBlX2JpbmFyeTsKLWV4dGVybiB0X3R5cGUqIGdfdHlwZV9zbGlzdDsKLWV4dGVybiB0X3R5cGUqIGdfdHlwZV9ib29sOwotZXh0ZXJuIHRfdHlwZSogZ190eXBlX2J5dGU7Ci1leHRlcm4gdF90eXBlKiBnX3R5cGVfaTE2OwotZXh0ZXJuIHRfdHlwZSogZ190eXBlX2kzMjsKLWV4dGVybiB0X3R5cGUqIGdfdHlwZV9pNjQ7Ci1leHRlcm4gdF90eXBlKiBnX3R5cGVfZG91YmxlOwotCi0vKioKLSAqIFRoZSBzY29wZSB0aGF0IHdlIGFyZSBjdXJyZW50bHkgcGFyc2luZyBpbnRvCi0gKi8KLWV4dGVybiB0X3Njb3BlKiBnX3Njb3BlOwotCi0vKioKLSAqIFRoZSBwYXJlbnQgc2NvcGUgdG8gYWxzbyBsb2FkIHN5bWJvbHMgaW50bwotICovCi1leHRlcm4gdF9zY29wZSogZ19wYXJlbnRfc2NvcGU7Ci0KLS8qKgotICogVGhlIHByZWZpeCBmb3IgdGhlIHBhcmVudCBzY29wZSBlbnRyaWVzCi0gKi8KLWV4dGVybiBzdGQ6OnN0cmluZyBnX3BhcmVudF9wcmVmaXg7Ci0KLS8qKgotICogVGhlIHBhcnNpbmcgcGFzcyB0aGF0IHdlIGFyZSBvbi4gV2UgZG8gZGlmZmVyZW50IHRoaW5ncyBvbiBlYWNoIHBhc3MuCi0gKi8KLWV4dGVybiBQQVJTRV9NT0RFIGdfcGFyc2VfbW9kZTsKLQotLyoqCi0gKiBHbG9iYWwgdGltZSBzdHJpbmcsIHVzZWQgaW4gZm9ybWF0dGluZyBlcnJvciBtZXNzYWdlcyBldGMuCi0gKi8KLWV4dGVybiBjaGFyKiBnX3RpbWVfc3RyOwotCi0vKioKLSAqIFRoZSBsYXN0IHBhcnNlZCBkb2N0ZXh0IGNvbW1lbnQuCi0gKi8KLWV4dGVybiBjaGFyKiBnX2RvY3RleHQ7Ci0KLS8qKgotICogVGhlIGxvY2F0aW9uIG9mIHRoZSBsYXN0IHBhcnNlZCBkb2N0ZXh0IGNvbW1lbnQuCi0gKi8KLWV4dGVybiBpbnQgZ19kb2N0ZXh0X2xpbmVubzsKLQotLyoqCi0gKiBTdGF0dXMgb2YgcHJvZ3JhbSBsZXZlbCBkb2N0ZXh0IGNhbmRpZGF0ZQotICovCi1lbnVtIFBST0dET0NURVhUX1NUQVRVUyB7Ci0gIElOVkFMSUQgPSAwLAotICBTVElMTF9DQU5ESURBVEUgPSAxLCAgICAgIC8vIHRoZSB0ZXh0IG1heSBvciBtYXkgbm90IGJlIHRoZSBwcm9ncmFtIGRvY3RleHQKLSAgQUxSRUFEWV9QUk9DRVNTRUQgPSAyLCAgICAvLyBkb2N0ZXh0IGhhcyBiZWVuIHVzZWQgYW5kIGlzIG5vIGxvbmdlciBhdmFpbGFibGUKLSAgQUJTT0xVVEVMWV9TVVJFID0gMywgICAgICAvLyB0aGlzIGlzIHRoZSBwcm9ncmFtIGRvY3RleHQKLSAgTk9fUFJPR1JBTV9ET0NURVhUID0gNCAgICAvLyB0aGVyZSBpcyBubyBwcm9ncmFtIGRvY3RleHQKLX07Ci0KLQotLyoqCi0gKiBUaGUgcHJvZ3JhbSBsZXZlbCBkb2N0ZXh0LiBTdG9yZWQgc2VwZXJhdGVseSB0byBtYWtlIHBhcnNpbmcgZWFzaWVyLgotICovCi1leHRlcm4gY2hhciogZ19wcm9ncmFtX2RvY3RleHRfY2FuZGlkYXRlOwotZXh0ZXJuIGludCAgIGdfcHJvZ3JhbV9kb2N0ZXh0X2xpbmVubzsKLWV4dGVybiBQUk9HRE9DVEVYVF9TVEFUVVMgIGdfcHJvZ3JhbV9kb2N0ZXh0X3N0YXR1czsKLQotLyoqCi0gKiBXaGV0aGVyIG9yIG5vdCBuZWdhdGl2ZSBmaWVsZCBrZXlzIGFyZSBhY2NlcHRlZC4KLSAqCi0gKiBXaGVuIGEgZmllbGQgZG9lcyBub3QgaGF2ZSBhIHVzZXItc3BlY2lmaWVkIGtleSwgdGhyaWZ0IGF1dG9tYXRpY2FsbHkKLSAqIGFzc2lnbnMgYSBuZWdhdGl2ZSB2YWx1ZS4gIEhvd2V2ZXIsIHRoaXMgaXMgZnJhZ2lsZSBzaW5jZSBjaGFuZ2VzIHRvIHRoZQotICogZmlsZSBtYXkgdW5pbnRlbnRpb25hbGx5IGNoYW5nZSB0aGUga2V5IG51bWJlcmluZywgcmVzdWx0aW5nIGluIGEgbmV3Ci0gKiBwcm90b2NvbCB0aGF0IGlzIG5vdCBiYWNrd2FyZHMgY29tcGF0aWJsZS4KLSAqCi0gKiBXaGVuIGdfYWxsb3dfbmVnX2ZpZWxkX2tleXMgaXMgZW5hYmxlZCwgdXNlcnMgY2FuIGV4cGxpY2l0bHkgc3BlY2lmeQotICogbmVnYXRpdmUga2V5cy4gIFRoaXMgd2F5IHRoZXkgY2FuIHdyaXRlIGEgLnRocmlmdCBmaWxlIHdpdGggZXhwbGljaXRseQotICogc3BlY2lmaWVkIGtleXMgdGhhdCBpcyBzdGlsbCBiYWNrd2FyZHMgY29tcGF0aWJsZSB3aXRoIG9sZGVyIC50aHJpZnQgZmlsZXMKLSAqIHRoYXQgZGlkIG5vdCBzcGVjaWZ5IGtleSB2YWx1ZXMuCi0gKi8KLWV4dGVybiBpbnQgZ19hbGxvd19uZWdfZmllbGRfa2V5czsKLQotLyoqCi0gKiBXaGV0aGVyIG9yIG5vdCA2NC1iaXQgY29uc3RhbnRzIHdpbGwgZ2VuZXJhdGUgYSB3YXJuaW5nLgotICoKLSAqIFNvbWUgbGFuZ3VhZ2VzIGRvbid0IHN1cHBvcnQgNjQtYml0IGNvbnN0YW50cywgYnV0IG1hbnkgZG8sIHNvIHdlIGNhbgotICogc3VwcHJlc3MgdGhpcyB3YXJuaW5nIGZvciBwcm9qZWN0cyB0aGF0IGRvbid0IHVzZSBhbnkgbm9uLTY0LWJpdC1zYWZlCi0gKiBsYW5ndWFnZXMuCi0gKi8KLWV4dGVybiBpbnQgZ19hbGxvd182NGJpdF9jb25zdHM7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9sb2dnaW5nLmggYi9jb21waWxlci9jcHAvc3JjL2xvZ2dpbmcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk3NDY5ZC4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL2xvZ2dpbmcuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBUX0xPR0dJTkdfSAotI2RlZmluZSBUX0xPR0dJTkdfSAotCi0jaW5jbHVkZSA8c3RyaW5nPgotCi0vKioKLSAqIFBhcnNlIGRlYnVnZ2luZyBvdXRwdXQsIHVzZWQgdG8gcHJpbnQgaGVscGZ1bCBpbmZvCi0gKi8KLXZvaWQgcGRlYnVnKGNvbnN0IGNoYXIqIGZtdCwgLi4uKTsKLQotLyoqCi0gKiBQYXJzZXIgd2FybmluZwotICovCi12b2lkIHB3YXJuaW5nKGludCBsZXZlbCwgY29uc3QgY2hhciogZm10LCAuLi4pOwotCi0vKioKLSAqIFByaW50IHZlcmJvc2Ugb3V0cHV0IG1lc3NhZ2UKLSAqLwotdm9pZCBwdmVyYm9zZShjb25zdCBjaGFyKiBmbXQsIC4uLik7Ci0KLS8qKgotICogRmFpbHVyZSEKLSAqLwotdm9pZCBmYWlsdXJlKGNvbnN0IGNoYXIqIGZtdCwgLi4uKTsKLQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvbWFpbi5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvbWFpbi5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWU5MmYxZi4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL21haW4uY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMjI5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiB0aHJpZnQgLSBhIGxpZ2h0d2VpZ2h0IGNyb3NzLWxhbmd1YWdlIHJwYy9zZXJpYWxpemF0aW9uIHRvb2wKLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIG1haW4gY29tcGlsZXIgZW5naW5lIGZvciBUaHJpZnQsIHdoaWNoIGludm9rZXMgdGhlCi0gKiBzY2FubmVyL3BhcnNlciB0byBidWlsZCB0aGUgdGhyaWZ0IG9iamVjdCB0cmVlLiBUaGUgaW50ZXJmYWNlIGdlbmVyYXRpb24KLSAqIGNvZGUgZm9yIGVhY2ggbGFuZ3VhZ2UgbGl2ZXMgaW4gYSBmaWxlIGJ5IHRoZSBsYW5ndWFnZSBuYW1lIHVuZGVyIHRoZQotICogZ2VuZXJhdGUvIGZvbGRlciwgYW5kIGFsbCBwYXJzZSBzdHJ1Y3R1cmVzIGxpdmUgaW4gcGFyc2UvCi0gKgotICovCi0KLSNpbmNsdWRlIDxjYXNzZXJ0PgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPGxpbWl0cy5oPgotCi0jaWZkZWYgX1dJTjMyCi0jIGluY2x1ZGUgPHdpbmRvd3MuaD4gLyogZm9yIEdldEZ1bGxQYXRoTmFtZSAqLwotI2VuZGlmCi0KLS8vIENhcmVmdWw6IG11c3QgaW5jbHVkZSBnbG9iYWxzIGZpcnN0IGZvciBleHRlcm4gZGVmaW5pdGlvbnMKLSNpbmNsdWRlICJnbG9iYWxzLmgiCi0KLSNpbmNsdWRlICJwbGF0Zm9ybS5oIgotI2luY2x1ZGUgIm1haW4uaCIKLSNpbmNsdWRlICJwYXJzZS90X3Byb2dyYW0uaCIKLSNpbmNsdWRlICJwYXJzZS90X3Njb3BlLmgiCi0jaW5jbHVkZSAiZ2VuZXJhdGUvdF9nZW5lcmF0b3IuaCIKLQotI2luY2x1ZGUgInZlcnNpb24uaCIKLQotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLQotLyoqCi0gKiBHbG9iYWwgcHJvZ3JhbSB0cmVlCi0gKi8KLXRfcHJvZ3JhbSogZ19wcm9ncmFtOwotCi0vKioKLSAqIEdsb2JhbCB0eXBlcwotICovCi0KLXRfdHlwZSogZ190eXBlX3ZvaWQ7Ci10X3R5cGUqIGdfdHlwZV9zdHJpbmc7Ci10X3R5cGUqIGdfdHlwZV9iaW5hcnk7Ci10X3R5cGUqIGdfdHlwZV9zbGlzdDsKLXRfdHlwZSogZ190eXBlX2Jvb2w7Ci10X3R5cGUqIGdfdHlwZV9ieXRlOwotdF90eXBlKiBnX3R5cGVfaTE2OwotdF90eXBlKiBnX3R5cGVfaTMyOwotdF90eXBlKiBnX3R5cGVfaTY0OwotdF90eXBlKiBnX3R5cGVfZG91YmxlOwotCi0vKioKLSAqIEdsb2JhbCBzY29wZQotICovCi10X3Njb3BlKiBnX3Njb3BlOwotCi0vKioKLSAqIFBhcmVudCBzY29wZSB0byBhbHNvIHBhcnNlIHR5cGVzCi0gKi8KLXRfc2NvcGUqIGdfcGFyZW50X3Njb3BlOwotCi0vKioKLSAqIFByZWZpeCBmb3IgcHV0dGluZyB0eXBlcyBpbiBwYXJlbnQgc2NvcGUKLSAqLwotc3RyaW5nIGdfcGFyZW50X3ByZWZpeDsKLQotLyoqCi0gKiBQYXJzaW5nIHBhc3MKLSAqLwotUEFSU0VfTU9ERSBnX3BhcnNlX21vZGU7Ci0KLS8qKgotICogQ3VycmVudCBkaXJlY3Rvcnkgb2YgZmlsZSBiZWluZyBwYXJzZWQKLSAqLwotc3RyaW5nIGdfY3VyZGlyOwotCi0vKioKLSAqIEN1cnJlbnQgZmlsZSBiZWluZyBwYXJzZWQKLSAqLwotc3RyaW5nIGdfY3VycGF0aDsKLQotLyoqCi0gKiBTZWFyY2ggcGF0aCBmb3IgaW5jbHVzaW9ucwotICovCi12ZWN0b3I8c3RyaW5nPiBnX2luY2xfc2VhcmNocGF0aDsKLQotLyoqCi0gKiBHbG9iYWwgZGVidWcgc3RhdGUKLSAqLwotaW50IGdfZGVidWcgPSAwOwotCi0vKioKLSAqIFN0cmljdG5lc3MgbGV2ZWwKLSAqLwotaW50IGdfc3RyaWN0ID0gMTI3OwotCi0vKioKLSAqIFdhcm5pbmcgbGV2ZWwKLSAqLwotaW50IGdfd2FybiA9IDE7Ci0KLS8qKgotICogVmVyYm9zZSBvdXRwdXQKLSAqLwotaW50IGdfdmVyYm9zZSA9IDA7Ci0KLS8qKgotICogR2xvYmFsIHRpbWUgc3RyaW5nCi0gKi8KLWNoYXIqIGdfdGltZV9zdHI7Ci0KLS8qKgotICogVGhlIGxhc3QgcGFyc2VkIGRvY3RleHQgY29tbWVudC4KLSAqLwotY2hhciogZ19kb2N0ZXh0OwotCi0vKioKLSAqIFRoZSBsb2NhdGlvbiBvZiB0aGUgbGFzdCBwYXJzZWQgZG9jdGV4dCBjb21tZW50LgotICovCi1pbnQgZ19kb2N0ZXh0X2xpbmVubzsKLQotLyoqIAotICogVGhlIEZpcnN0IGRvY3RleHQgY29tbWVudAotICovCi1jaGFyKiBnX3Byb2dyYW1fZG9jdGV4dF9jYW5kaWRhdGU7Ci1pbnQgIGdfcHJvZ3JhbV9kb2N0ZXh0X2xpbmVubyA9IDA7Ci1QUk9HRE9DVEVYVF9TVEFUVVMgIGdfcHJvZ3JhbV9kb2N0ZXh0X3N0YXR1cyA9IElOVkFMSUQ7Ci0KLS8qKgotICogV2hldGhlciBvciBub3QgbmVnYXRpdmUgZmllbGQga2V5cyBhcmUgYWNjZXB0ZWQuCi0gKi8KLWludCBnX2FsbG93X25lZ19maWVsZF9rZXlzOwotCi0vKioKLSAqIFdoZXRoZXIgb3Igbm90IDY0LWJpdCBjb25zdGFudHMgd2lsbCBnZW5lcmF0ZSBhIHdhcm5pbmcuCi0gKi8KLWludCBnX2FsbG93XzY0Yml0X2NvbnN0cyA9IDA7Ci0KLS8qKgotICogRmxhZ3MgdG8gY29udHJvbCBjb2RlIGdlbmVyYXRpb24KLSAqLwotYm9vbCBnZW5fcmVjdXJzZSA9IGZhbHNlOwotCi0vKioKLSAqIFdpbjMyIGRvZXNuJ3QgaGF2ZSByZWFscGF0aCwgc28gdXNlIGZhbGxiYWNrIGltcGxlbWVudGF0aW9uIGluIHRoYXQgY2FzZSwKLSAqIG90aGVyd2lzZSB0aGlzIGp1c3QgY2FsbHMgdGhyb3VnaCB0byByZWFscGF0aAotICovCi1jaGFyICpzYWZlcmVhbHBhdGgoY29uc3QgY2hhciAqcGF0aCwgY2hhciAqcmVzb2x2ZWRfcGF0aCkgewotI2lmZGVmIF9XSU4zMgotICBjaGFyIGJ1ZltNQVhfUEFUSF07Ci0gIGNoYXIqIGJhc2VuYW1lOwotICBEV09SRCBsZW4gPSBHZXRGdWxsUGF0aE5hbWUocGF0aCwgTUFYX1BBVEgsIGJ1ZiwgJmJhc2VuYW1lKTsKLSAgaWYgKGxlbiA9PSAwIHx8IGxlbiA+IE1BWF9QQVRIIC0gMSl7Ci0gICAgc3RyY3B5KHJlc29sdmVkX3BhdGgsIHBhdGgpOwotICB9IGVsc2UgewotICAgIHN0cmNweShyZXNvbHZlZF9wYXRoLCBidWYpOwotICB9Ci0KLSAgLy8gUmVwbGFjZSBiYWNrc2xhc2hlcyB3aXRoIGZvcndhcmQgc2xhc2hlcyBzbyB0aGUKLSAgLy8gcmVzdCBvZiB0aGUgY29kZSBiZWhhdmVzIGNvcnJlY3RseS4KLSAgc2l6ZV90IHJlc29sdmVkX2xlbiA9IHN0cmxlbihyZXNvbHZlZF9wYXRoKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZXNvbHZlZF9sZW47IGkrKykgewotICAgIGlmIChyZXNvbHZlZF9wYXRoW2ldID09ICdcXCcpIHsKLSAgICAgIHJlc29sdmVkX3BhdGhbaV0gPSAnLyc7Ci0gICAgfQotICB9Ci0gIHJldHVybiByZXNvbHZlZF9wYXRoOwotI2Vsc2UKLSAgcmV0dXJuIHJlYWxwYXRoKHBhdGgsIHJlc29sdmVkX3BhdGgpOwotI2VuZGlmCi19Ci0KLWJvb2wgY2hlY2tfaXNfZGlyZWN0b3J5KGNvbnN0IGNoYXIgKmRpcl9uYW1lKSB7Ci0jaWZkZWYgX1dJTjMyCi0gIERXT1JEIGF0dHJpYnV0ZXMgPSA6OkdldEZpbGVBdHRyaWJ1dGVzQShkaXJfbmFtZSk7Ci0gIGlmKGF0dHJpYnV0ZXMgPT0gSU5WQUxJRF9GSUxFX0FUVFJJQlVURVMpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIk91dHB1dCBkaXJlY3RvcnkgJXMgaXMgdW51c2FibGU6IEdldExhc3RFcnJvcigpID0gJWxkXG4iLCBkaXJfbmFtZSwgR2V0TGFzdEVycm9yKCkpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZigoYXR0cmlidXRlcyAmIEZJTEVfQVRUUklCVVRFX0RJUkVDVE9SWSkgIT0gRklMRV9BVFRSSUJVVEVfRElSRUNUT1JZKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJPdXRwdXQgZGlyZWN0b3J5ICVzIGV4aXN0cyBidXQgaXMgbm90IGEgZGlyZWN0b3J5XG4iLCBkaXJfbmFtZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiB0cnVlOwotI2Vsc2UKLSAgc3RydWN0IHN0YXQgc2I7Ci0gIGlmIChzdGF0KGRpcl9uYW1lLCAmc2IpIDwgMCkgewotICAgIGZwcmludGYoc3RkZXJyLCAiT3V0cHV0IGRpcmVjdG9yeSAlcyBpcyB1bnVzYWJsZTogJXNcbiIsIGRpcl9uYW1lLCBzdHJlcnJvcihlcnJubykpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoISBTX0lTRElSKHNiLnN0X21vZGUpKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJPdXRwdXQgZGlyZWN0b3J5ICVzIGV4aXN0cyBidXQgaXMgbm90IGEgZGlyZWN0b3J5XG4iLCBkaXJfbmFtZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiB0cnVlOwotI2VuZGlmCi19Ci0KLS8qKgotICogUmVwb3J0IGFuIGVycm9yIHRvIHRoZSB1c2VyLiBUaGlzIGlzIGNhbGxlZCB5eWVycm9yIGZvciBoaXN0b3JpY2FsCi0gKiByZWFzb25zIChsZXggYW5kIHlhY2MgZXhwZWN0IHRoZSBlcnJvciByZXBvcnRpbmcgcm91dGluZSB0byBiZSBjYWxsZWQKLSAqIHRoaXMpLiBDYWxsIHRoaXMgZnVuY3Rpb24gdG8gcmVwb3J0IGFueSBlcnJvcnMgdG8gdGhlIHVzZXIuCi0gKiB5eWVycm9yIHRha2VzIHByaW50ZiBzdHlsZSBhcmd1bWVudHMuCi0gKgotICogQHBhcmFtIGZtdCBDIGZvcm1hdCBzdHJpbmcgZm9sbG93ZWQgYnkgYWRkaXRpb25hbCBhcmd1bWVudHMKLSAqLwotdm9pZCB5eWVycm9yKGNvbnN0IGNoYXIqIGZtdCwgLi4uKSB7Ci0gIHZhX2xpc3QgYXJnczsKLSAgZnByaW50ZihzdGRlcnIsCi0gICAgICAgICAgIltFUlJPUjolczolZF0gKGxhc3QgdG9rZW4gd2FzICclcycpXG4iLAotICAgICAgICAgIGdfY3VycGF0aC5jX3N0cigpLAotICAgICAgICAgIHl5bGluZW5vLAotICAgICAgICAgIHl5dGV4dCk7Ci0KLSAgdmFfc3RhcnQoYXJncywgZm10KTsKLSAgdmZwcmludGYoc3RkZXJyLCBmbXQsIGFyZ3MpOwotICB2YV9lbmQoYXJncyk7Ci0KLSAgZnByaW50ZihzdGRlcnIsICJcbiIpOwotfQotCi0vKioKLSAqIFByaW50cyBhIGRlYnVnIG1lc3NhZ2UgZnJvbSB0aGUgcGFyc2VyLgotICoKLSAqIEBwYXJhbSBmbXQgQyBmb3JtYXQgc3RyaW5nIGZvbGxvd2VkIGJ5IGFkZGl0aW9uYWwgYXJndW1lbnRzCi0gKi8KLXZvaWQgcGRlYnVnKGNvbnN0IGNoYXIqIGZtdCwgLi4uKSB7Ci0gIGlmIChnX2RlYnVnID09IDApIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgdmFfbGlzdCBhcmdzOwotICBwcmludGYoIltQQVJTRTolZF0gIiwgeXlsaW5lbm8pOwotICB2YV9zdGFydChhcmdzLCBmbXQpOwotICB2cHJpbnRmKGZtdCwgYXJncyk7Ci0gIHZhX2VuZChhcmdzKTsKLSAgcHJpbnRmKCJcbiIpOwotfQotCi0vKioKLSAqIFByaW50cyBhIHZlcmJvc2Ugb3V0cHV0IG1vZGUgbWVzc2FnZQotICoKLSAqIEBwYXJhbSBmbXQgQyBmb3JtYXQgc3RyaW5nIGZvbGxvd2VkIGJ5IGFkZGl0aW9uYWwgYXJndW1lbnRzCi0gKi8KLXZvaWQgcHZlcmJvc2UoY29uc3QgY2hhciogZm10LCAuLi4pIHsKLSAgaWYgKGdfdmVyYm9zZSA9PSAwKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHZhX2xpc3QgYXJnczsKLSAgdmFfc3RhcnQoYXJncywgZm10KTsKLSAgdnByaW50ZihmbXQsIGFyZ3MpOwotICB2YV9lbmQoYXJncyk7Ci19Ci0KLS8qKgotICogUHJpbnRzIGEgd2FybmluZyBtZXNzYWdlCi0gKgotICogQHBhcmFtIGZtdCBDIGZvcm1hdCBzdHJpbmcgZm9sbG93ZWQgYnkgYWRkaXRpb25hbCBhcmd1bWVudHMKLSAqLwotdm9pZCBwd2FybmluZyhpbnQgbGV2ZWwsIGNvbnN0IGNoYXIqIGZtdCwgLi4uKSB7Ci0gIGlmIChnX3dhcm4gPCBsZXZlbCkgewotICAgIHJldHVybjsKLSAgfQotICB2YV9saXN0IGFyZ3M7Ci0gIHByaW50ZigiW1dBUk5JTkc6JXM6JWRdICIsIGdfY3VycGF0aC5jX3N0cigpLCB5eWxpbmVubyk7Ci0gIHZhX3N0YXJ0KGFyZ3MsIGZtdCk7Ci0gIHZwcmludGYoZm10LCBhcmdzKTsKLSAgdmFfZW5kKGFyZ3MpOwotICBwcmludGYoIlxuIik7Ci19Ci0KLS8qKgotICogUHJpbnRzIGEgZmFpbHVyZSBtZXNzYWdlIGFuZCBleGl0cwotICoKLSAqIEBwYXJhbSBmbXQgQyBmb3JtYXQgc3RyaW5nIGZvbGxvd2VkIGJ5IGFkZGl0aW9uYWwgYXJndW1lbnRzCi0gKi8KLXZvaWQgZmFpbHVyZShjb25zdCBjaGFyKiBmbXQsIC4uLikgewotICB2YV9saXN0IGFyZ3M7Ci0gIGZwcmludGYoc3RkZXJyLCAiW0ZBSUxVUkU6JXM6JWRdICIsIGdfY3VycGF0aC5jX3N0cigpLCB5eWxpbmVubyk7Ci0gIHZhX3N0YXJ0KGFyZ3MsIGZtdCk7Ci0gIHZmcHJpbnRmKHN0ZGVyciwgZm10LCBhcmdzKTsKLSAgdmFfZW5kKGFyZ3MpOwotICBwcmludGYoIlxuIik7Ci0gIGV4aXQoMSk7Ci19Ci0KLS8qKgotICogQ29udmVydHMgYSBzdHJpbmcgZmlsZW5hbWUgaW50byBhIHRocmlmdCBwcm9ncmFtIG5hbWUKLSAqLwotc3RyaW5nIHByb2dyYW1fbmFtZShzdHJpbmcgZmlsZW5hbWUpIHsKLSAgc3RyaW5nOjpzaXplX3R5cGUgc2xhc2ggPSBmaWxlbmFtZS5yZmluZCgiLyIpOwotICBpZiAoc2xhc2ggIT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgZmlsZW5hbWUgPSBmaWxlbmFtZS5zdWJzdHIoc2xhc2grMSk7Ci0gIH0KLSAgc3RyaW5nOjpzaXplX3R5cGUgZG90ID0gZmlsZW5hbWUucmZpbmQoIi4iKTsKLSAgaWYgKGRvdCAhPSBzdHJpbmc6Om5wb3MpIHsKLSAgICBmaWxlbmFtZSA9IGZpbGVuYW1lLnN1YnN0cigwLCBkb3QpOwotICB9Ci0gIHJldHVybiBmaWxlbmFtZTsKLX0KLQotLyoqCi0gKiBHZXRzIHRoZSBkaXJlY3RvcnkgcGF0aCBvZiBhIGZpbGVuYW1lCi0gKi8KLXN0cmluZyBkaXJlY3RvcnlfbmFtZShzdHJpbmcgZmlsZW5hbWUpIHsKLSAgc3RyaW5nOjpzaXplX3R5cGUgc2xhc2ggPSBmaWxlbmFtZS5yZmluZCgiLyIpOwotICAvLyBObyBzbGFzaCwganVzdCB1c2UgdGhlIGN1cnJlbnQgZGlyZWN0b3J5Ci0gIGlmIChzbGFzaCA9PSBzdHJpbmc6Om5wb3MpIHsKLSAgICByZXR1cm4gIi4iOwotICB9Ci0gIHJldHVybiBmaWxlbmFtZS5zdWJzdHIoMCwgc2xhc2gpOwotfQotCi0vKioKLSAqIEZpbmRzIHRoZSBhcHByb3ByaWF0ZSBmaWxlIHBhdGggZm9yIHRoZSBnaXZlbiBmaWxlbmFtZQotICovCi1zdHJpbmcgaW5jbHVkZV9maWxlKHN0cmluZyBmaWxlbmFtZSkgewotICAvLyBBYnNvbHV0ZSBwYXRoPyBKdXN0IHRyeSB0aGF0Ci0gIGlmIChmaWxlbmFtZVswXSA9PSAnLycpIHsKLSAgICAvLyBSZWFscGF0aCEKLSAgICBjaGFyIHJwW1RIUklGVF9QQVRIX01BWF07Ci0gICAgaWYgKHNhZmVyZWFscGF0aChmaWxlbmFtZS5jX3N0cigpLCBycCkgPT0gTlVMTCkgewotICAgICAgcHdhcm5pbmcoMCwgIkNhbm5vdCBvcGVuIGluY2x1ZGUgZmlsZSAlc1xuIiwgZmlsZW5hbWUuY19zdHIoKSk7Ci0gICAgICByZXR1cm4gc3RkOjpzdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvLyBTdGF0IHRoaXMgZmlsZQotICAgIHN0cnVjdCBzdGF0IGZpbmZvOwotICAgIGlmIChzdGF0KHJwLCAmZmluZm8pID09IDApIHsKLSAgICAgIHJldHVybiBycDsKLSAgICB9Ci0gIH0gZWxzZSB7IC8vIHJlbGF0aXZlIHBhdGgsIHN0YXJ0IHNlYXJjaGluZwotICAgIC8vIG5ldyBzZWFyY2ggcGF0aCB3aXRoIGN1cnJlbnQgZGlyIGdsb2JhbAotICAgIHZlY3RvcjxzdHJpbmc+IHNwID0gZ19pbmNsX3NlYXJjaHBhdGg7Ci0gICAgc3AuaW5zZXJ0KHNwLmJlZ2luKCksIGdfY3VyZGlyKTsKLQotICAgIC8vIGl0ZXJhdGUgdGhyb3VnaCBwYXRocwotICAgIHZlY3RvcjxzdHJpbmc+OjppdGVyYXRvciBpdDsKLSAgICBmb3IgKGl0ID0gc3AuYmVnaW4oKTsgaXQgIT0gc3AuZW5kKCk7IGl0KyspIHsKLSAgICAgIHN0cmluZyBzZmlsZW5hbWUgPSAqKGl0KSArICIvIiArIGZpbGVuYW1lOwotCi0gICAgICAvLyBSZWFscGF0aCEKLSAgICAgIGNoYXIgcnBbVEhSSUZUX1BBVEhfTUFYXTsKLSAgICAgIGlmIChzYWZlcmVhbHBhdGgoc2ZpbGVuYW1lLmNfc3RyKCksIHJwKSA9PSBOVUxMKSB7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICAvLyBTdGF0IHRoaXMgZmlsZXMKLSAgICAgIHN0cnVjdCBzdGF0IGZpbmZvOwotICAgICAgaWYgKHN0YXQocnAsICZmaW5mbykgPT0gMCkgewotICAgICAgICByZXR1cm4gcnA7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLy8gVWggb2gKLSAgcHdhcm5pbmcoMCwgIkNvdWxkIG5vdCBmaW5kIGluY2x1ZGUgZmlsZSAlc1xuIiwgZmlsZW5hbWUuY19zdHIoKSk7Ci0gIHJldHVybiBzdGQ6OnN0cmluZygpOwotfQotCi0vKioKLSAqIENsZWFycyBhbnkgcHJldmlvdXNseSBzdG9yZWQgZG9jdGV4dCBzdHJpbmcuCi0gKiBBbHNvIHByaW50cyBhIHdhcm5pbmcgaWYgd2UgYXJlIGRpc2NhcmRpbmcgaW5mb3JtYXRpb24uCi0gKi8KLXZvaWQgY2xlYXJfZG9jdGV4dCgpIHsKLSAgaWYgKGdfZG9jdGV4dCAhPSBOVUxMKSB7Ci0gICAgcHdhcm5pbmcoMiwgIlVuY2FwdHVyZWQgZG9jdGV4dCBhdCBvbiBsaW5lICVkLiIsIGdfZG9jdGV4dF9saW5lbm8pOwotICB9Ci0gIGZyZWUoZ19kb2N0ZXh0KTsKLSAgZ19kb2N0ZXh0ID0gTlVMTDsKLX0KLQotLyoqCi0gKiBSZXNldCBwcm9ncmFtIGRvY3RleHQgaW5mb3JtYXRpb24gYWZ0ZXIgcHJvY2Vzc2luZyBhIGZpbGUKLSAqLwotdm9pZCByZXNldF9wcm9ncmFtX2RvY3RleHRfaW5mbygpIHsKLSAgaWYoZ19wcm9ncmFtX2RvY3RleHRfY2FuZGlkYXRlICE9IE5VTEwpIHsKLSAgICBmcmVlKGdfcHJvZ3JhbV9kb2N0ZXh0X2NhbmRpZGF0ZSk7Ci0gICAgZ19wcm9ncmFtX2RvY3RleHRfY2FuZGlkYXRlID0gTlVMTDsKLSAgfQotICBnX3Byb2dyYW1fZG9jdGV4dF9saW5lbm8gPSAwOwotICBnX3Byb2dyYW1fZG9jdGV4dF9zdGF0dXMgPSBJTlZBTElEOwotICBwZGVidWcoIiVzIiwicHJvZ3JhbSBkb2N0ZXh0IHNldCB0byBJTlZBTElEIik7Ci19Ci0KLS8qKgotICogV2UgYXJlIHN1cmUgdGhlIHByb2dyYW0gZG9jdGV4dCBjYW5kaWRhdGUgaXMgcmVhbGx5IHRoZSBwcm9ncmFtIGRvY3RleHQuCi0gKi8KLXZvaWQgZGVjbGFyZV92YWxpZF9wcm9ncmFtX2RvY3RleHQoKSB7Ci0gIGlmKChnX3Byb2dyYW1fZG9jdGV4dF9jYW5kaWRhdGUgIT0gTlVMTCkgJiYgKGdfcHJvZ3JhbV9kb2N0ZXh0X3N0YXR1cyA9PSBTVElMTF9DQU5ESURBVEUpKSB7Ci0gICAgZ19wcm9ncmFtX2RvY3RleHRfc3RhdHVzID0gQUJTT0xVVEVMWV9TVVJFOyAgCi0gICAgcGRlYnVnKCIlcyIsInByb2dyYW0gZG9jdGV4dCBzZXQgdG8gQUJTT0xVVEVMWV9TVVJFIik7Ci0gIH0gZWxzZSB7Ci0gICAgZ19wcm9ncmFtX2RvY3RleHRfc3RhdHVzID0gTk9fUFJPR1JBTV9ET0NURVhUOyAgCi0gICAgcGRlYnVnKCIlcyIsInByb2dyYW0gZG9jdGV4dCBzZXQgdG8gTk9fUFJPR1JBTV9ET0NURVhUIik7Ci0gIH0KLX0KLQotLyoqCi0gKiBDbGVhbnMgdXAgdGV4dCBjb21tb25seSBmb3VuZCBpbiBkb3h5Z2VuLWxpa2UgY29tbWVudHMKLSAqCi0gKiBXYXJuaW5nOiBpZiB5b3UgbWl4IHRhYnMgYW5kIHNwYWNlcyBpbiBhIG5vbi11bmlmb3JtIHdheSwKLSAqIHlvdSB3aWxsIGdldCB3aGF0IHlvdSBkZXNlcnZlLgotICovCi1jaGFyKiBjbGVhbl91cF9kb2N0ZXh0KGNoYXIqIGRvY3RleHQpIHsKLSAgLy8gQ29udmVydCB0byBDKysgc3RyaW5nLCBhbmQgcmVtb3ZlIFdpbmRvd3MncyBjYXJyaWFnZSByZXR1cm5zLgotICBzdHJpbmcgZG9jc3RyaW5nID0gZG9jdGV4dDsKLSAgZG9jc3RyaW5nLmVyYXNlKAotICAgICAgcmVtb3ZlKGRvY3N0cmluZy5iZWdpbigpLCBkb2NzdHJpbmcuZW5kKCksICdccicpLAotICAgICAgZG9jc3RyaW5nLmVuZCgpKTsKLQotICAvLyBTZXBhcmF0ZSBpbnRvIGxpbmVzLgotICB2ZWN0b3I8c3RyaW5nPiBsaW5lczsKLSAgc3RyaW5nOjpzaXplX3R5cGUgcG9zID0gc3RyaW5nOjpucG9zOwotICBzdHJpbmc6OnNpemVfdHlwZSBsYXN0OwotICB3aGlsZSAodHJ1ZSkgewotICAgIGxhc3QgPSAocG9zID09IHN0cmluZzo6bnBvcykgPyAwIDogcG9zKzE7Ci0gICAgcG9zID0gZG9jc3RyaW5nLmZpbmQoJ1xuJywgbGFzdCk7Ci0gICAgaWYgKHBvcyA9PSBzdHJpbmc6Om5wb3MpIHsKLSAgICAgIC8vIEZpcnN0IGJpdCBvZiBjbGVhbmluZy4gIElmIHRoZSBsYXN0IGxpbmUgaXMgb25seSB3aGl0ZXNwYWNlLCBkcm9wIGl0LgotICAgICAgc3RyaW5nOjpzaXplX3R5cGUgbm9ud2hpdGUgPSBkb2NzdHJpbmcuZmluZF9maXJzdF9ub3Rfb2YoIiBcdCIsIGxhc3QpOwotICAgICAgaWYgKG5vbndoaXRlICE9IHN0cmluZzo6bnBvcykgewotICAgICAgICBsaW5lcy5wdXNoX2JhY2soZG9jc3RyaW5nLnN1YnN0cihsYXN0KSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgbGluZXMucHVzaF9iYWNrKGRvY3N0cmluZy5zdWJzdHIobGFzdCwgcG9zLWxhc3QpKTsKLSAgfQotCi0gIC8vIEEgdmVyeSBwcm9mb3VuZCBkb2NzdHJpbmcuCi0gIGlmIChsaW5lcy5lbXB0eSgpKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICAvLyBDbGVhciBsZWFkaW5nIHdoaXRlc3BhY2UgZnJvbSB0aGUgZmlyc3QgbGluZS4KLSAgcG9zID0gbGluZXMuZnJvbnQoKS5maW5kX2ZpcnN0X25vdF9vZigiIFx0Iik7Ci0gIGxpbmVzLmZyb250KCkuZXJhc2UoMCwgcG9zKTsKLQotICAvLyBJZiBldmVyeSBub25ibGFuayBsaW5lIGFmdGVyIHRoZSBmaXJzdCBoYXMgdGhlIHNhbWUgbnVtYmVyIG9mIHNwYWNlcy90YWJzLAotICAvLyB0aGVuIGEgc3RhciwgcmVtb3ZlIHRoZW0uCi0gIGJvb2wgaGF2ZV9wcmVmaXggPSB0cnVlOwotICBib29sIGZvdW5kX3ByZWZpeCA9IGZhbHNlOwotICBzdHJpbmc6OnNpemVfdHlwZSBwcmVmaXhfbGVuID0gMDsKLSAgdmVjdG9yPHN0cmluZz46Oml0ZXJhdG9yIGxfaXRlcjsKLSAgZm9yIChsX2l0ZXIgPSBsaW5lcy5iZWdpbigpKzE7IGxfaXRlciAhPSBsaW5lcy5lbmQoKTsgKytsX2l0ZXIpIHsKLSAgICBpZiAobF9pdGVyLT5lbXB0eSgpKSB7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0KLSAgICBwb3MgPSBsX2l0ZXItPmZpbmRfZmlyc3Rfbm90X29mKCIgXHQiKTsKLSAgICBpZiAoIWZvdW5kX3ByZWZpeCkgewotICAgICAgaWYgKHBvcyAhPSBzdHJpbmc6Om5wb3MpIHsKLSAgICAgICAgaWYgKGxfaXRlci0+YXQocG9zKSA9PSAnKicpIHsKLSAgICAgICAgICBmb3VuZF9wcmVmaXggPSB0cnVlOwotICAgICAgICAgIHByZWZpeF9sZW4gPSBwb3M7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaGF2ZV9wcmVmaXggPSBmYWxzZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLy8gV2hpdGVzcGFjZS1vbmx5IGxpbmUuICBUcnVuY2F0ZSBpdC4KLSAgICAgICAgbF9pdGVyLT5jbGVhcigpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAobF9pdGVyLT5zaXplKCkgPiBwb3MKLSAgICAgICAgJiYgbF9pdGVyLT5hdChwb3MpID09ICcqJwotICAgICAgICAmJiBwb3MgPT0gcHJlZml4X2xlbikgewotICAgICAgLy8gQnVzaW5lc3MgYXMgdXN1YWwuCi0gICAgfSBlbHNlIGlmIChwb3MgPT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgICAvLyBXaGl0ZXNwYWNlLW9ubHkgbGluZS4gIExldCdzIHRydW5jYXRlIGl0IGZvciB0aGVtLgotICAgICAgbF9pdGVyLT5jbGVhcigpOwotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBUaGUgcGF0dGVybiBoYXMgYmVlbiBicm9rZW4uCi0gICAgICBoYXZlX3ByZWZpeCA9IGZhbHNlOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgLy8gSWYgb3VyIHByZWZpeCBzdXJ2aXZlZCwgZGVsZXRlIGl0IGZyb20gZXZlcnkgbGluZS4KLSAgaWYgKGhhdmVfcHJlZml4KSB7Ci0gICAgLy8gR2V0IHRoZSBzdGFyIHRvby4KLSAgICBwcmVmaXhfbGVuKys7Ci0gICAgZm9yIChsX2l0ZXIgPSBsaW5lcy5iZWdpbigpKzE7IGxfaXRlciAhPSBsaW5lcy5lbmQoKTsgKytsX2l0ZXIpIHsKLSAgICAgIGxfaXRlci0+ZXJhc2UoMCwgcHJlZml4X2xlbik7Ci0gICAgfQotICB9Ci0KLSAgLy8gTm93IGRlbGV0ZSB0aGUgbWluaW11bSBhbW91bnQgb2YgbGVhZGluZyB3aGl0ZXNwYWNlIGZyb20gZWFjaCBsaW5lLgotICBwcmVmaXhfbGVuID0gc3RyaW5nOjpucG9zOwotICBmb3IgKGxfaXRlciA9IGxpbmVzLmJlZ2luKCkrMTsgbF9pdGVyICE9IGxpbmVzLmVuZCgpOyArK2xfaXRlcikgewotICAgIGlmIChsX2l0ZXItPmVtcHR5KCkpIHsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICBwb3MgPSBsX2l0ZXItPmZpbmRfZmlyc3Rfbm90X29mKCIgXHQiKTsKLSAgICBpZiAocG9zICE9IHN0cmluZzo6bnBvcwotICAgICAgICAmJiAocHJlZml4X2xlbiA9PSBzdHJpbmc6Om5wb3MgfHwgcG9zIDwgcHJlZml4X2xlbikpIHsKLSAgICAgIHByZWZpeF9sZW4gPSBwb3M7Ci0gICAgfQotICB9Ci0KLSAgLy8gSWYgb3VyIHByZWZpeCBzdXJ2aXZlZCwgZGVsZXRlIGl0IGZyb20gZXZlcnkgbGluZS4KLSAgaWYgKHByZWZpeF9sZW4gIT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgZm9yIChsX2l0ZXIgPSBsaW5lcy5iZWdpbigpKzE7IGxfaXRlciAhPSBsaW5lcy5lbmQoKTsgKytsX2l0ZXIpIHsKLSAgICAgIGxfaXRlci0+ZXJhc2UoMCwgcHJlZml4X2xlbik7Ci0gICAgfQotICB9Ci0KLSAgLy8gUmVtb3ZlIHRyYWlsaW5nIHdoaXRlc3BhY2UgZnJvbSBldmVyeSBsaW5lLgotICBmb3IgKGxfaXRlciA9IGxpbmVzLmJlZ2luKCk7IGxfaXRlciAhPSBsaW5lcy5lbmQoKTsgKytsX2l0ZXIpIHsKLSAgICBwb3MgPSBsX2l0ZXItPmZpbmRfbGFzdF9ub3Rfb2YoIiBcdCIpOwotICAgIGlmIChwb3MgIT0gc3RyaW5nOjpucG9zICYmIHBvcyAhPSBsX2l0ZXItPmxlbmd0aCgpLTEpIHsKLSAgICAgIGxfaXRlci0+ZXJhc2UocG9zKzEpOwotICAgIH0KLSAgfQotCi0gIC8vIElmIHRoZSBmaXJzdCBsaW5lIGlzIGVtcHR5LCByZW1vdmUgaXQuCi0gIC8vIERvbid0IGRvIHRoaXMgZWFybGllciBiZWNhdXNlIGEgbG90IG9mIHN0ZXBzIHNraXAgdGhlIGZpcnN0IGxpbmUuCi0gIGlmIChsaW5lcy5mcm9udCgpLmVtcHR5KCkpIHsKLSAgICBsaW5lcy5lcmFzZShsaW5lcy5iZWdpbigpKTsKLSAgfQotCi0gIC8vIE5vdyByZWpvaW4gdGhlIGxpbmVzIGFuZCBjb3B5IHRoZW0gYmFjayBpbnRvIGRvY3RleHQuCi0gIGRvY3N0cmluZy5jbGVhcigpOwotICBmb3IgKGxfaXRlciA9IGxpbmVzLmJlZ2luKCk7IGxfaXRlciAhPSBsaW5lcy5lbmQoKTsgKytsX2l0ZXIpIHsKLSAgICBkb2NzdHJpbmcgKz0gKmxfaXRlcjsKLSAgICBkb2NzdHJpbmcgKz0gJ1xuJzsKLSAgfQotCi0gIC8vYXNzZXJ0KGRvY3N0cmluZy5sZW5ndGgoKSA8PSBzdHJsZW4oZG9jdGV4dCkpOyAgbWF5IGhhcHBlbiwgc2VlIFRIUklGVC0xNzU1Ci0gIGlmKGRvY3N0cmluZy5sZW5ndGgoKSA8PSBzdHJsZW4oZG9jdGV4dCkpIHsKLSAgICBzdHJjcHkoZG9jdGV4dCwgZG9jc3RyaW5nLmNfc3RyKCkpOwotICB9IGVsc2UgewotICAgIGZyZWUoZG9jdGV4dCk7ICAvLyB0b28gc2hvcnQKLSAgICBkb2N0ZXh0ID0gc3RyZHVwKGRvY3N0cmluZy5jX3N0cigpKTsKLSAgfQotICByZXR1cm4gZG9jdGV4dDsKLX0KLQotLyoqIFNldCB0byB0cnVlIHRvIGRlYnVnIGRvY3N0cmluZyBwYXJzaW5nICovCi1zdGF0aWMgYm9vbCBkdW1wX2RvY3MgPSBmYWxzZTsKLQotLyoqCi0gKiBEdW1wcyBkb2NzdHJpbmdzIHRvIHN0ZG91dAotICogT25seSB3b3JrcyBmb3IgdG9wLWxldmVsIGRlZmluaXRpb25zIGFuZCB0aGUgd2hvbGUgcHJvZ3JhbSBkb2MKLSAqIChpLmUuLCBub3QgZW51bSBjb25zdGFudHMsIHN0cnVjdCBmaWVsZHMsIG9yIGZ1bmN0aW9ucy4KLSAqLwotdm9pZCBkdW1wX2RvY3N0cmluZ3ModF9wcm9ncmFtKiBwcm9ncmFtKSB7Ci0gIHN0cmluZyBwcm9nZG9jID0gcHJvZ3JhbS0+Z2V0X2RvYygpOwotICBpZiAoIXByb2dkb2MuZW1wdHkoKSkgewotICAgIHByaW50ZigiV2hvbGUgcHJvZ3JhbSBkb2M6XG4lc1xuIiwgcHJvZ2RvYy5jX3N0cigpKTsKLSAgfQotICBjb25zdCB2ZWN0b3I8dF90eXBlZGVmKj4mIHR5cGVkZWZzID0gcHJvZ3JhbS0+Z2V0X3R5cGVkZWZzKCk7Ci0gIHZlY3Rvcjx0X3R5cGVkZWYqPjo6Y29uc3RfaXRlcmF0b3IgdF9pdGVyOwotICBmb3IgKHRfaXRlciA9IHR5cGVkZWZzLmJlZ2luKCk7IHRfaXRlciAhPSB0eXBlZGVmcy5lbmQoKTsgKyt0X2l0ZXIpIHsKLSAgICB0X3R5cGVkZWYqIHRkID0gKnRfaXRlcjsKLSAgICBpZiAodGQtPmhhc19kb2MoKSkgewotICAgICAgcHJpbnRmKCJ0eXBlZGVmICVzOlxuJXNcbiIsIHRkLT5nZXRfbmFtZSgpLmNfc3RyKCksIHRkLT5nZXRfZG9jKCkuY19zdHIoKSk7Ci0gICAgfQotICB9Ci0gIGNvbnN0IHZlY3Rvcjx0X2VudW0qPiYgZW51bXMgPSBwcm9ncmFtLT5nZXRfZW51bXMoKTsKLSAgdmVjdG9yPHRfZW51bSo+Ojpjb25zdF9pdGVyYXRvciBlX2l0ZXI7Ci0gIGZvciAoZV9pdGVyID0gZW51bXMuYmVnaW4oKTsgZV9pdGVyICE9IGVudW1zLmVuZCgpOyArK2VfaXRlcikgewotICAgIHRfZW51bSogZW4gPSAqZV9pdGVyOwotICAgIGlmIChlbi0+aGFzX2RvYygpKSB7Ci0gICAgICBwcmludGYoImVudW0gJXM6XG4lc1xuIiwgZW4tPmdldF9uYW1lKCkuY19zdHIoKSwgZW4tPmdldF9kb2MoKS5jX3N0cigpKTsKLSAgICB9Ci0gIH0KLSAgY29uc3QgdmVjdG9yPHRfY29uc3QqPiYgY29uc3RzID0gcHJvZ3JhbS0+Z2V0X2NvbnN0cygpOwotICB2ZWN0b3I8dF9jb25zdCo+Ojpjb25zdF9pdGVyYXRvciBjX2l0ZXI7Ci0gIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgdF9jb25zdCogY28gPSAqY19pdGVyOwotICAgIGlmIChjby0+aGFzX2RvYygpKSB7Ci0gICAgICBwcmludGYoImNvbnN0ICVzOlxuJXNcbiIsIGNvLT5nZXRfbmFtZSgpLmNfc3RyKCksIGNvLT5nZXRfZG9jKCkuY19zdHIoKSk7Ci0gICAgfQotICB9Ci0gIGNvbnN0IHZlY3Rvcjx0X3N0cnVjdCo+JiBzdHJ1Y3RzID0gcHJvZ3JhbS0+Z2V0X3N0cnVjdHMoKTsKLSAgdmVjdG9yPHRfc3RydWN0Kj46OmNvbnN0X2l0ZXJhdG9yIHNfaXRlcjsKLSAgZm9yIChzX2l0ZXIgPSBzdHJ1Y3RzLmJlZ2luKCk7IHNfaXRlciAhPSBzdHJ1Y3RzLmVuZCgpOyArK3NfaXRlcikgewotICAgIHRfc3RydWN0KiBzdCA9ICpzX2l0ZXI7Ci0gICAgaWYgKHN0LT5oYXNfZG9jKCkpIHsKLSAgICAgIHByaW50Zigic3RydWN0ICVzOlxuJXNcbiIsIHN0LT5nZXRfbmFtZSgpLmNfc3RyKCksIHN0LT5nZXRfZG9jKCkuY19zdHIoKSk7Ci0gICAgfQotICB9Ci0gIGNvbnN0IHZlY3Rvcjx0X3N0cnVjdCo+JiB4Y2VwdGlvbnMgPSBwcm9ncmFtLT5nZXRfeGNlcHRpb25zKCk7Ci0gIHZlY3Rvcjx0X3N0cnVjdCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0gIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgdF9zdHJ1Y3QqIHhuID0gKnhfaXRlcjsKLSAgICBpZiAoeG4tPmhhc19kb2MoKSkgewotICAgICAgcHJpbnRmKCJ4Y2VwdGlvbiAlczpcbiVzXG4iLCB4bi0+Z2V0X25hbWUoKS5jX3N0cigpLCB4bi0+Z2V0X2RvYygpLmNfc3RyKCkpOwotICAgIH0KLSAgfQotICBjb25zdCB2ZWN0b3I8dF9zZXJ2aWNlKj4mIHNlcnZpY2VzID0gcHJvZ3JhbS0+Z2V0X3NlcnZpY2VzKCk7Ci0gIHZlY3Rvcjx0X3NlcnZpY2UqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICBmb3IgKHZfaXRlciA9IHNlcnZpY2VzLmJlZ2luKCk7IHZfaXRlciAhPSBzZXJ2aWNlcy5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICB0X3NlcnZpY2UqIHN2ID0gKnZfaXRlcjsKLSAgICBpZiAoc3YtPmhhc19kb2MoKSkgewotICAgICAgcHJpbnRmKCJzZXJ2aWNlICVzOlxuJXNcbiIsIHN2LT5nZXRfbmFtZSgpLmNfc3RyKCksIHN2LT5nZXRfZG9jKCkuY19zdHIoKSk7Ci0gICAgfQotICB9Ci19Ci0KLS8qKgotICogQ2FsbCBnZW5lcmF0ZV9maW5nZXJwcmludCBmb3IgZXZlcnkgc3RydWN0dXJlIGFuZCBlbnVtLgotICovCi12b2lkIGdlbmVyYXRlX2FsbF9maW5nZXJwcmludHModF9wcm9ncmFtKiBwcm9ncmFtKSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X3N0cnVjdCo+JiBzdHJ1Y3RzID0gcHJvZ3JhbS0+Z2V0X3N0cnVjdHMoKTsKLSAgdmVjdG9yPHRfc3RydWN0Kj46OmNvbnN0X2l0ZXJhdG9yIHNfaXRlcjsKLSAgZm9yIChzX2l0ZXIgPSBzdHJ1Y3RzLmJlZ2luKCk7IHNfaXRlciAhPSBzdHJ1Y3RzLmVuZCgpOyArK3NfaXRlcikgewotICAgIHRfc3RydWN0KiBzdCA9ICpzX2l0ZXI7Ci0gICAgc3QtPmdlbmVyYXRlX2ZpbmdlcnByaW50KCk7Ci0gIH0KLQotICBjb25zdCB2ZWN0b3I8dF9zdHJ1Y3QqPiYgeGNlcHRpb25zID0gcHJvZ3JhbS0+Z2V0X3hjZXB0aW9ucygpOwotICB2ZWN0b3I8dF9zdHJ1Y3QqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgIHRfc3RydWN0KiBzdCA9ICp4X2l0ZXI7Ci0gICAgc3QtPmdlbmVyYXRlX2ZpbmdlcnByaW50KCk7Ci0gIH0KLQotICBjb25zdCB2ZWN0b3I8dF9lbnVtKj4mIGVudW1zID0gcHJvZ3JhbS0+Z2V0X2VudW1zKCk7Ci0gIHZlY3Rvcjx0X2VudW0qPjo6Y29uc3RfaXRlcmF0b3IgZV9pdGVyOwotICBmb3IgKGVfaXRlciA9IGVudW1zLmJlZ2luKCk7IGVfaXRlciAhPSBlbnVtcy5lbmQoKTsgKytlX2l0ZXIpIHsKLSAgICB0X2VudW0qIGUgPSAqZV9pdGVyOwotICAgIGUtPmdlbmVyYXRlX2ZpbmdlcnByaW50KCk7Ci0gIH0KLQotICBnX3R5cGVfdm9pZC0+Z2VuZXJhdGVfZmluZ2VycHJpbnQoKTsKLQotICAvLyBJZiB5b3Ugd2FudCB0byBnZW5lcmF0ZSBmaW5nZXJwcmludHMgZm9yIGltcGxpY2l0IHN0cnVjdHVyZXMsIHN0YXJ0IGhlcmUuCi0gIC8qCi0gIGNvbnN0IHZlY3Rvcjx0X3NlcnZpY2UqPiYgc2VydmljZXMgPSBwcm9ncmFtLT5nZXRfc2VydmljZXMoKTsKLSAgdmVjdG9yPHRfc2VydmljZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gIGZvciAodl9pdGVyID0gc2VydmljZXMuYmVnaW4oKTsgdl9pdGVyICE9IHNlcnZpY2VzLmVuZCgpOyArK3ZfaXRlcikgewotICAgIHRfc2VydmljZSogc3YgPSAqdl9pdGVyOwotICB9Ci0gICovCi19Ci0KLQotLyoqCi0gKiBFbWl0cyBhIHdhcm5pbmcgb24gbGlzdDxieXRlPiwgYmluYXJ5IHR5cGUgaXMgdHlwaWNhbGx5IGEgbXVjaCBiZXR0ZXIgY2hvaWNlLgotICovCi12b2lkIGNoZWNrX2Zvcl9saXN0X29mX2J5dGVzKHRfdHlwZSogbGlzdF9lbGVtX3R5cGUpIHsKLSAgaWYoKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSAmJiAobGlzdF9lbGVtX3R5cGUgIT0gTlVMTCkgJiYgbGlzdF9lbGVtX3R5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGUqIHRiYXNlID0gKHRfYmFzZV90eXBlKilsaXN0X2VsZW1fdHlwZTsKLSAgICBpZih0YmFzZS0+Z2V0X2Jhc2UoKSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFKSB7Ci0gICAgICBwd2FybmluZygxLCJDb25zaWRlciB1c2luZyB0aGUgbW9yZSBlZmZpY2llbnQgXCJiaW5hcnlcIiB0eXBlIGluc3RlYWQgb2YgXCJsaXN0PGJ5dGU+XCIuIik7Ci0gICAgfQotICB9Ci19Ci0KLQotLyoqCi0gKiBQcmludHMgdGhlIHZlcnNpb24gbnVtYmVyCi0gKi8KLXZvaWQgdmVyc2lvbigpIHsKLSAgcHJpbnRmKCJUaHJpZnQgdmVyc2lvbiAlc1xuIiwgVEhSSUZUX1ZFUlNJT04pOwotfQotCi0vKioKLSAqIERpc3BsYXkgdGhlIHVzYWdlIG1lc3NhZ2UgYW5kIHRoZW4gZXhpdCB3aXRoIGFuIGVycm9yIGNvZGUuCi0gKi8KLXZvaWQgdXNhZ2UoKSB7Ci0gIGZwcmludGYoc3RkZXJyLCAiVXNhZ2U6IHRocmlmdCBbb3B0aW9uc10gZmlsZVxuXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICJVc2UgdGhyaWZ0IC1oZWxwIGZvciBhIGxpc3Qgb2Ygb3B0aW9uc1xuIik7Ci0gIGV4aXQoMSk7Ci19Ci0KLS8qKgotICogRGlwbGF5cyB0aGUgaGVscCBtZXNzYWdlIGFuZCB0aGVuIGV4aXRzIHdpdGggYW4gZXJyb3IgY29kZS4KLSAqLwotdm9pZCBoZWxwKCkgewotICBmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiB0aHJpZnQgW29wdGlvbnNdIGZpbGVcbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIk9wdGlvbnM6XG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgIC12ZXJzaW9uICAgIFByaW50IHRoZSBjb21waWxlciB2ZXJzaW9uXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgIC1vIGRpciAgICAgIFNldCB0aGUgb3V0cHV0IGRpcmVjdG9yeSBmb3IgZ2VuLSogcGFja2FnZXNcbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgIChkZWZhdWx0OiBjdXJyZW50IGRpcmVjdG9yeSlcbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgLW91dCBkaXIgICAgU2V0IHRoZSBvdXB1dCBsb2NhdGlvbiBmb3IgZ2VuZXJhdGVkIGZpbGVzLlxuIik7Ci0gIGZwcmludGYoc3RkZXJyLCIgICAgICAgICAgICAgICAobm8gZ2VuLSogZm9sZGVyIHdpbGwgYmUgY3JlYXRlZClcbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgLUkgZGlyICAgICAgQWRkIGEgZGlyZWN0b3J5IHRvIHRoZSBsaXN0IG9mIGRpcmVjdG9yaWVzXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICAgICAgc2VhcmNoZWQgZm9yIGluY2x1ZGUgZGlyZWN0aXZlc1xuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiICAtbm93YXJuICAgICBTdXBwcmVzcyBhbGwgY29tcGlsZXIgd2FybmluZ3MgKEJBRCEpXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgIC1zdHJpY3QgICAgIFN0cmljdCBjb21waWxlciB3YXJuaW5ncyBvblxuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiICAtdltlcmJvc2VdICBWZXJib3NlIG1vZGVcbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgLXJbZWN1cnNlXSAgQWxzbyBnZW5lcmF0ZSBpbmNsdWRlZCBmaWxlc1xuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiICAtZGVidWcgICAgICBQYXJzZSBkZWJ1ZyB0cmFjZSB0byBzdGRvdXRcbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgLS1hbGxvdy1uZWcta2V5cyAgQWxsb3cgbmVnYXRpdmUgZmllbGQga2V5cyAoVXNlZCB0byAiCi0gICAgICAgICAgInByZXNlcnZlIHByb3RvY29sXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICAgICAgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIC50aHJpZnQgZmlsZXMpXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgIC0tYWxsb3ctNjRiaXQtY29uc3RzICBEbyBub3QgcHJpbnQgd2FybmluZ3MgYWJvdXQgdXNpbmcgNjQtYml0IGNvbnN0YW50c1xuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiICAtLWdlbiBTVFIgICBHZW5lcmF0ZSBjb2RlIHdpdGggYSBkeW5hbWljYWxseS1yZWdpc3RlcmVkIGdlbmVyYXRvci5cbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgICBTVFIgaGFzIHRoZSBmb3JtIGxhbmd1YWdlWzprZXkxPXZhbDFbLGtleTJbLGtleTM9dmFsM11dXS5cbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgICBLZXlzIGFuZCB2YWx1ZXMgYXJlIG9wdGlvbnMgcGFzc2VkIHRvIHRoZSBnZW5lcmF0b3IuXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICAgICAgTWFueSBvcHRpb25zIHdpbGwgbm90IHJlcXVpcmUgdmFsdWVzLlxuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICJBdmFpbGFibGUgZ2VuZXJhdG9ycyAoYW5kIG9wdGlvbnMpOlxuIik7Ci0KLSAgdF9nZW5lcmF0b3JfcmVnaXN0cnk6Omdlbl9tYXBfdCBnZW5fbWFwID0gdF9nZW5lcmF0b3JfcmVnaXN0cnk6OmdldF9nZW5lcmF0b3JfbWFwKCk7Ci0gIHRfZ2VuZXJhdG9yX3JlZ2lzdHJ5OjpnZW5fbWFwX3Q6Oml0ZXJhdG9yIGl0ZXI7Ci0gIGZvciAoaXRlciA9IGdlbl9tYXAuYmVnaW4oKTsgaXRlciAhPSBnZW5fbWFwLmVuZCgpOyArK2l0ZXIpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIiAgJXMgKCVzKTpcbiIsCi0gICAgICAgIGl0ZXItPnNlY29uZC0+Z2V0X3Nob3J0X25hbWUoKS5jX3N0cigpLAotICAgICAgICBpdGVyLT5zZWNvbmQtPmdldF9sb25nX25hbWUoKS5jX3N0cigpKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIiVzIiwgaXRlci0+c2Vjb25kLT5nZXRfZG9jdW1lbnRhdGlvbigpLmNfc3RyKCkpOwotICB9Ci0gIGV4aXQoMSk7Ci19Ci0KLS8qKgotICogWW91IGtub3csIHdoZW4gSSBzdGFydGVkIHdvcmtpbmcgb24gVGhyaWZ0IEkgcmVhbGx5IHRob3VnaHQgaXQgd2Fzbid0IGdvaW5nCi0gKiB0byBiZWNvbWUgYSBwcm9ncmFtbWluZyBsYW5ndWFnZSBiZWNhdXNlIGl0IHdhcyBqdXN0IGEgZ2VuZXJhdG9yIGFuZCBpdAotICogd291bGRuJ3QgbmVlZCBydW50aW1lIHR5cGUgaW5mb3JtYXRpb24gYW5kIGFsbCB0aGF0IGphenouIEJ1dCB0aGVuIHdlCi0gKiBkZWNpZGVkIHRvIGFkZCBjb25zdGFudHMsIGFuZCBhbGwgb2YgYSBzdWRkZW4gdGhhdCBtZWFucyBydW50aW1lIHR5cGUKLSAqIHZhbGlkYXRpb24gYW5kIGluZmVyZW5jZSwgZXhjZXB0IHRoZSAicnVudGltZSIgaXMgdGhlIGNvZGUgZ2VuZXJhdG9yCi0gKiBydW50aW1lLgotICovCi12b2lkIHZhbGlkYXRlX2NvbnN0X3JlYyhzdGQ6OnN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7Ci0gIGlmICh0eXBlLT5pc192b2lkKCkpIHsKLSAgICB0aHJvdyAidHlwZSBlcnJvcjogY2Fubm90IGRlY2xhcmUgYSB2b2lkIGNvbnN0OiAiICsgbmFtZTsKLSAgfQotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgIT0gdF9jb25zdF92YWx1ZTo6Q1ZfU1RSSU5HKSB7Ci0gICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiBjb25zdCBcIiIgKyBuYW1lICsgIlwiIHdhcyBkZWNsYXJlZCBhcyBzdHJpbmciOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpICE9IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKLSAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6IGNvbnN0IFwiIiArIG5hbWUgKyAiXCIgd2FzIGRlY2xhcmVkIGFzIGJvb2wiOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpICE9IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKLSAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6IGNvbnN0IFwiIiArIG5hbWUgKyAiXCIgd2FzIGRlY2xhcmVkIGFzIGJ5dGUiOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgIT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgewotICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogY29uc3QgXCIiICsgbmFtZSArICJcIiB3YXMgZGVjbGFyZWQgYXMgaTE2IjsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpICE9IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKLSAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6IGNvbnN0IFwiIiArIG5hbWUgKyAiXCIgd2FzIGRlY2xhcmVkIGFzIGkzMiI7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSAhPSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7Ci0gICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiBjb25zdCBcIiIgKyBuYW1lICsgIlwiIHdhcyBkZWNsYXJlZCBhcyBpNjQiOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgIT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUiAmJgotICAgICAgICAgIHZhbHVlLT5nZXRfdHlwZSgpICE9IHRfY29uc3RfdmFsdWU6OkNWX0RPVUJMRSkgewotICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogY29uc3QgXCIiICsgbmFtZSArICJcIiB3YXMgZGVjbGFyZWQgYXMgZG91YmxlIjsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKSArIG5hbWU7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSAhPSB0X2NvbnN0X3ZhbHVlOjpDVl9JREVOVElGSUVSKSB7Ci0gICAgICB0aHJvdyAidHlwZSBlcnJvcjogY29uc3QgXCIiICsgbmFtZSArICJcIiB3YXMgZGVjbGFyZWQgYXMgZW51bSI7Ci0gICAgfQotCi0gICAgLy8gc2VlIGlmIHRoZXJlJ3MgYSBkb3QgaW4gdGhlIGlkZW50aWZpZXIKLSAgICBzdGQ6OnN0cmluZyBuYW1lX3BvcnRpb24gPSB2YWx1ZS0+Z2V0X2lkZW50aWZpZXJfbmFtZSgpOwotCi0gICAgY29uc3QgdmVjdG9yPHRfZW51bV92YWx1ZSo+JiBlbnVtX3ZhbHVlcyA9ICgodF9lbnVtKil0eXBlKS0+Z2V0X2NvbnN0YW50cygpOwotICAgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3IgY19pdGVyOwotICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKLQotICAgIGZvciAoY19pdGVyID0gZW51bV92YWx1ZXMuYmVnaW4oKTsgY19pdGVyICE9IGVudW1fdmFsdWVzLmVuZCgpOyArK2NfaXRlcikgewotICAgICAgaWYgKCgqY19pdGVyKS0+Z2V0X25hbWUoKSA9PSBuYW1lX3BvcnRpb24pIHsKLSAgICAgICAgZm91bmQgPSB0cnVlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKCFmb3VuZCkgewotICAgICAgdGhyb3cgInR5cGUgZXJyb3I6IGNvbnN0ICIgKyBuYW1lICsgIiB3YXMgZGVjbGFyZWQgYXMgdHlwZSAiCi0gICAgICAgICsgdHlwZS0+Z2V0X25hbWUoKSArICIgd2hpY2ggaXMgYW4gZW51bSwgYnV0ICIKLSAgICAgICAgKyB2YWx1ZS0+Z2V0X2lkZW50aWZpZXIoKSArICIgaXMgbm90IGEgdmFsaWQgdmFsdWUgZm9yIHRoYXQgZW51bSI7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgIT0gdF9jb25zdF92YWx1ZTo6Q1ZfTUFQKSB7Ci0gICAgICB0aHJvdyAidHlwZSBlcnJvcjogY29uc3QgXCIiICsgbmFtZSArICJcIiB3YXMgZGVjbGFyZWQgYXMgc3RydWN0L3hjZXB0aW9uIjsKLSAgICB9Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgaWYgKHZfaXRlci0+Zmlyc3QtPmdldF90eXBlKCkgIT0gdF9jb25zdF92YWx1ZTo6Q1ZfU1RSSU5HKSB7Ci0gICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgbmFtZSArICIgc3RydWN0IGtleSBtdXN0IGJlIHN0cmluZyI7Ci0gICAgICB9Ci0gICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOwotICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKLSAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7Ci0gICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7Ci0gICAgICB9Ci0KLSAgICAgIHZhbGlkYXRlX2NvbnN0X3JlYyhuYW1lICsgIi4iICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpLCBmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgdF90eXBlKiBrX3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgdF90eXBlKiB2X3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgdmFsaWRhdGVfY29uc3RfcmVjKG5hbWUgKyAiPGtleT4iLCBrX3R5cGUsIHZfaXRlci0+Zmlyc3QpOwotICAgICAgdmFsaWRhdGVfY29uc3RfcmVjKG5hbWUgKyAiPHZhbD4iLCB2X3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgdF90eXBlKiBlX3R5cGU7Ci0gICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgZV90eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGVfdHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgfQotICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOwotICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgdmFsaWRhdGVfY29uc3RfcmVjKG5hbWUgKyAiPGVsZW0+IiwgZV90eXBlLCAqdl9pdGVyKTsKLSAgICB9Ci0gIH0KLX0KLQotLyoqCi0gKiBDaGVjayBzaW1wbGUgaWRlbnRpZmllciBuYW1lcwotICogSXQncyBlYXNpZXIgdG8gZG8gaXQgdGhpcyB3YXkgaW5zdGVhZCBvZiByZXdyaXRpbmcgdGhlIHdob2xlIGdyYW1tYXIgZXRjLgotICovCi12b2lkIHZhbGlkYXRlX3NpbXBsZV9pZGVudGlmaWVyKGNvbnN0IGNoYXIqIGlkZW50aWZpZXIpIHsKLSAgc3RyaW5nIG5hbWUoIGlkZW50aWZpZXIpOwotICBpZiggbmFtZS5maW5kKCIuIikgIT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgeXllcnJvcigiSWRlbnRpZmllciAlcyBjYW4ndCBoYXZlIGEgZG90LiIsIGlkZW50aWZpZXIpOwotICAgIGV4aXQoMSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBDaGVjayB0aGUgdHlwZSBvZiB0aGUgcGFyc2VkIGNvbnN0IGluZm9ybWF0aW9uIGFnYWluc3QgaXRzIGRlY2xhcmVkIHR5cGUKLSAqLwotdm9pZCB2YWxpZGF0ZV9jb25zdF90eXBlKHRfY29uc3QqIGMpIHsKLSAgdmFsaWRhdGVfY29uc3RfcmVjKGMtPmdldF9uYW1lKCksIGMtPmdldF90eXBlKCksIGMtPmdldF92YWx1ZSgpKTsKLX0KLQotLyoqCi0gKiBDaGVjayB0aGUgdHlwZSBvZiBhIGRlZmF1bHQgdmFsdWUgYXNzaWduZWQgdG8gYSBmaWVsZC4KLSAqLwotdm9pZCB2YWxpZGF0ZV9maWVsZF92YWx1ZSh0X2ZpZWxkKiBmaWVsZCwgdF9jb25zdF92YWx1ZSogY3YpIHsKLSAgdmFsaWRhdGVfY29uc3RfcmVjKGZpZWxkLT5nZXRfbmFtZSgpLCBmaWVsZC0+Z2V0X3R5cGUoKSwgY3YpOwotfQotCi0vKioKLSAqIENoZWNrIHRoYXQgYWxsIHRoZSBlbGVtZW50cyBvZiBhIHRocm93cyBibG9jayBhcmUgYWN0dWFsbHkgZXhjZXB0aW9ucy4KLSAqLwotYm9vbCB2YWxpZGF0ZV90aHJvd3ModF9zdHJ1Y3QqIHRocm93cykgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdGhyb3dzLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBpZiAoIXRfZ2VuZXJhdG9yOjpnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSktPmlzX3hjZXB0aW9uKCkpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qKgotICogU2tpcHMgVVRGLTggQk9NIGlmIHRoZXJlIGlzIG9uZQotICovCi1ib29sIHNraXBfdXRmOF9ib20oRklMRSogZikgewotCi0gIC8vIHByZXR0eSBzdHJhaWdodGZvcndhcmQsIGJ1dCB3b3JrcwotICBpZiggZmdldGMoZikgPT0gMHhFRikgewotICAgIGlmKCBmZ2V0YyhmKSA9PSAweEJCKSB7Ci0gICAgICBpZiggZmdldGMoZikgPT0gMHhCRikgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0gCi0gICAgfSAKLSAgfSAKLSAgCi0gIHJld2luZChmKTsgCi0gIHJldHVybiBmYWxzZTsKLX0KLQotLyoqCi0gKiBQYXJzZXMgYSBwcm9ncmFtCi0gKi8KLXZvaWQgcGFyc2UodF9wcm9ncmFtKiBwcm9ncmFtLCB0X3Byb2dyYW0qIHBhcmVudF9wcm9ncmFtKSB7Ci0gIC8vIEdldCBzY29wZSBmaWxlIHBhdGgKLSAgc3RyaW5nIHBhdGggPSBwcm9ncmFtLT5nZXRfcGF0aCgpOwotCi0gIC8vIFNldCBjdXJyZW50IGRpciBnbG9iYWwsIHdoaWNoIGlzIHVzZWQgaW4gdGhlIGluY2x1ZGVfZmlsZSBmdW5jdGlvbgotICBnX2N1cmRpciA9IGRpcmVjdG9yeV9uYW1lKHBhdGgpOwotICBnX2N1cnBhdGggPSBwYXRoOwotCi0gIC8vIE9wZW4gdGhlIGZpbGUKLSAgLy8gc2tpcCBVVEYtOCBCT00gaWYgdGhlcmUgaXMgb25lCi0gIHl5aW4gPSBmb3BlbihwYXRoLmNfc3RyKCksICJyIik7Ci0gIGlmICh5eWluID09IDApIHsKLSAgICBmYWlsdXJlKCJDb3VsZCBub3Qgb3BlbiBpbnB1dCBmaWxlOiBcIiVzXCIiLCBwYXRoLmNfc3RyKCkpOwotICB9Ci0gIGlmKCBza2lwX3V0ZjhfYm9tKCB5eWluKSkKLSAgICBwdmVyYm9zZSgiU2tpcHBlZCBVVEYtOCBCT00gYXQgJXNcbiIsIHBhdGguY19zdHIoKSk7Ci0gIAotICAvLyBDcmVhdGUgbmV3IHNjb3BlIGFuZCBzY2FuIGZvciBpbmNsdWRlcwotICBwdmVyYm9zZSgiU2Nhbm5pbmcgJXMgZm9yIGluY2x1ZGVzXG4iLCBwYXRoLmNfc3RyKCkpOwotICBnX3BhcnNlX21vZGUgPSBJTkNMVURFUzsKLSAgZ19wcm9ncmFtID0gcHJvZ3JhbTsKLSAgZ19zY29wZSA9IHByb2dyYW0tPnNjb3BlKCk7Ci0gIHRyeSB7Ci0gICAgeXlsaW5lbm8gPSAxOwotICAgIGlmICh5eXBhcnNlKCkgIT0gMCkgewotICAgICAgZmFpbHVyZSgiUGFyc2VyIGVycm9yIGR1cmluZyBpbmNsdWRlIHBhc3MuIik7Ci0gICAgfQotICB9IGNhdGNoIChzdHJpbmcgeCkgewotICAgIGZhaWx1cmUoeC5jX3N0cigpKTsKLSAgfQotICBmY2xvc2UoeXlpbik7Ci0KLSAgLy8gUmVjdXJzaXZlbHkgcGFyc2UgYWxsIHRoZSBpbmNsdWRlIHByb2dyYW1zCi0gIHZlY3Rvcjx0X3Byb2dyYW0qPiYgaW5jbHVkZXMgPSBwcm9ncmFtLT5nZXRfaW5jbHVkZXMoKTsKLSAgdmVjdG9yPHRfcHJvZ3JhbSo+OjppdGVyYXRvciBpdGVyOwotICBmb3IgKGl0ZXIgPSBpbmNsdWRlcy5iZWdpbigpOyBpdGVyICE9IGluY2x1ZGVzLmVuZCgpOyArK2l0ZXIpIHsKLSAgICBwYXJzZSgqaXRlciwgcHJvZ3JhbSk7Ci0gIH0KLQotICAvLyByZXNldCBwcm9ncmFtIGRvY3RleHQgc3RhdHVzIGJlZm9yZSBwYXJzaW5nIGEgbmV3IGZpbGUKLSAgcmVzZXRfcHJvZ3JhbV9kb2N0ZXh0X2luZm8oKTsKLQotICAvLyBQYXJzZSB0aGUgcHJvZ3JhbSBmaWxlCi0gIGdfcGFyc2VfbW9kZSA9IFBST0dSQU07Ci0gIGdfcHJvZ3JhbSA9IHByb2dyYW07Ci0gIGdfc2NvcGUgPSBwcm9ncmFtLT5zY29wZSgpOwotICBnX3BhcmVudF9zY29wZSA9IChwYXJlbnRfcHJvZ3JhbSAhPSBOVUxMKSA/IHBhcmVudF9wcm9ncmFtLT5zY29wZSgpIDogTlVMTDsKLSAgZ19wYXJlbnRfcHJlZml4ID0gcHJvZ3JhbS0+Z2V0X25hbWUoKSArICIuIjsKLSAgZ19jdXJwYXRoID0gcGF0aDsKLQotICAvLyBPcGVuIHRoZSBmaWxlCi0gIC8vIHNraXAgVVRGLTggQk9NIGlmIHRoZXJlIGlzIG9uZQotICB5eWluID0gZm9wZW4ocGF0aC5jX3N0cigpLCAiciIpOwotICBpZiAoeXlpbiA9PSAwKSB7Ci0gICAgZmFpbHVyZSgiQ291bGQgbm90IG9wZW4gaW5wdXQgZmlsZTogXCIlc1wiIiwgcGF0aC5jX3N0cigpKTsKLSAgfQotICBpZiggc2tpcF91dGY4X2JvbSggeXlpbikpCi0gICAgcHZlcmJvc2UoIlNraXBwZWQgVVRGLTggQk9NIGF0ICVzXG4iLCBwYXRoLmNfc3RyKCkpOwotICAKLSAgcHZlcmJvc2UoIlBhcnNpbmcgJXMgZm9yIHR5cGVzXG4iLCBwYXRoLmNfc3RyKCkpOwotICB5eWxpbmVubyA9IDE7Ci0gIHRyeSB7Ci0gICAgaWYgKHl5cGFyc2UoKSAhPSAwKSB7Ci0gICAgICBmYWlsdXJlKCJQYXJzZXIgZXJyb3IgZHVyaW5nIHR5cGVzIHBhc3MuIik7Ci0gICAgfQotICB9IGNhdGNoIChzdHJpbmcgeCkgewotICAgIGZhaWx1cmUoeC5jX3N0cigpKTsKLSAgfQotICBmY2xvc2UoeXlpbik7Ci19Ci0KLS8qKgotICogR2VuZXJhdGUgY29kZQotICovCi12b2lkIGdlbmVyYXRlKHRfcHJvZ3JhbSogcHJvZ3JhbSwgY29uc3QgdmVjdG9yPHN0cmluZz4mIGdlbmVyYXRvcl9zdHJpbmdzKSB7Ci0gIC8vIE9vb29oaCwgcmVjdXJzaXZlIGNvZGUgZ2VuZXJhdGlvbiwgaG90ISEKLSAgaWYgKGdlbl9yZWN1cnNlKSB7Ci0gICAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+JiBpbmNsdWRlcyA9IHByb2dyYW0tPmdldF9pbmNsdWRlcygpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5jbHVkZXMuc2l6ZSgpOyArK2kpIHsKLSAgICAgIC8vIFByb3BvZ2F0ZSBvdXRwdXQgcGF0aCBmcm9tIHBhcmVudCB0byBjaGlsZCBwcm9ncmFtcwotICAgICAgaW5jbHVkZXNbaV0tPnNldF9vdXRfcGF0aChwcm9ncmFtLT5nZXRfb3V0X3BhdGgoKSwgcHJvZ3JhbS0+aXNfb3V0X3BhdGhfYWJzb2x1dGUoKSk7Ci0KLSAgICAgIGdlbmVyYXRlKGluY2x1ZGVzW2ldLCBnZW5lcmF0b3Jfc3RyaW5ncyk7Ci0gICAgfQotICB9Ci0KLSAgLy8gR2VuZXJhdGUgY29kZSEKLSAgdHJ5IHsKLSAgICBwdmVyYm9zZSgiUHJvZ3JhbTogJXNcbiIsIHByb2dyYW0tPmdldF9wYXRoKCkuY19zdHIoKSk7Ci0KLSAgICAvLyBDb21wdXRlIGZpbmdlcnByaW50cy4gLSBub3QgYW55bW9yZSwgd2UgZG8gaXQgb24gdGhlIGZseSBub3cKLSAgICAvL2dlbmVyYXRlX2FsbF9maW5nZXJwcmludHMocHJvZ3JhbSk7Ci0KLSAgICBpZiAoZHVtcF9kb2NzKSB7Ci0gICAgICBkdW1wX2RvY3N0cmluZ3MocHJvZ3JhbSk7Ci0gICAgfQotCi0gICAgdmVjdG9yPHN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7Ci0gICAgZm9yIChpdGVyID0gZ2VuZXJhdG9yX3N0cmluZ3MuYmVnaW4oKTsgaXRlciAhPSBnZW5lcmF0b3Jfc3RyaW5ncy5lbmQoKTsgKytpdGVyKSB7Ci0gICAgICB0X2dlbmVyYXRvciogZ2VuZXJhdG9yID0gdF9nZW5lcmF0b3JfcmVnaXN0cnk6OmdldF9nZW5lcmF0b3IocHJvZ3JhbSwgKml0ZXIpOwotCi0gICAgICBpZiAoZ2VuZXJhdG9yID09IE5VTEwpIHsKLSAgICAgICAgcHdhcm5pbmcoMSwgIlVuYWJsZSB0byBnZXQgYSBnZW5lcmF0b3IgZm9yIFwiJXNcIi5cbiIsIGl0ZXItPmNfc3RyKCkpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcHZlcmJvc2UoIkdlbmVyYXRpbmcgXCIlc1wiXG4iLCBpdGVyLT5jX3N0cigpKTsKLSAgICAgICAgZ2VuZXJhdG9yLT5nZW5lcmF0ZV9wcm9ncmFtKCk7Ci0gICAgICAgIGRlbGV0ZSBnZW5lcmF0b3I7Ci0gICAgICB9Ci0gICAgfQotCi0gIH0gY2F0Y2ggKHN0cmluZyBzKSB7Ci0gICAgcHJpbnRmKCJFcnJvcjogJXNcbiIsIHMuY19zdHIoKSk7Ci0gIH0gY2F0Y2ggKGNvbnN0IGNoYXIqIGV4YykgewotICAgIHByaW50ZigiRXJyb3I6ICVzXG4iLCBleGMpOwotICB9Ci0KLX0KLQotLyoqCi0gKiBQYXJzZSBpdCB1cC4uIHRoZW4gc3BpdCBpdCBiYWNrIG91dCwgaW4gcHJldHR5IG11Y2ggZXZlcnkgbGFuZ3VhZ2UuIEFscmlnaHQKLSAqIG5vdCB0aGF0IG1hbnkgbGFuZ3VhZ2VzLCBidXQgdGhlIGNvb2wgb25lcyB0aGF0IHdlIGNhcmUgYWJvdXQuCi0gKi8KLWludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgewotICBpbnQgaTsKLSAgc3RkOjpzdHJpbmcgb3V0X3BhdGg7Ci0gIGJvb2wgb3V0X3BhdGhfaXNfYWJzb2x1dGUgPSBmYWxzZTsKLQotICAvLyBTZXR1cCB0aW1lIHN0cmluZwotICB0aW1lX3Qgbm93ID0gdGltZShOVUxMKTsKLSAgZ190aW1lX3N0ciA9IGN0aW1lKCZub3cpOwotCi0gIC8vIENoZWNrIGZvciBuZWNlc3NhcnkgYXJndW1lbnRzLCB5b3UgZ290dGEgaGF2ZSBhdCBsZWFzdCBhIGZpbGVuYW1lIGFuZAotICAvLyBhbiBvdXRwdXQgbGFuZ3VhZ2UgZmxhZwotICBpZiAoYXJnYyA8IDIpIHsKLSAgICB1c2FnZSgpOwotICB9Ci0KLSAgdmVjdG9yPHN0cmluZz4gZ2VuZXJhdG9yX3N0cmluZ3M7Ci0KLSAgLy8gU2V0IHRoZSBjdXJyZW50IHBhdGggdG8gYSBkdW1teSB2YWx1ZSB0byBtYWtlIHdhcm5pbmcgbWVzc2FnZXMgY2xlYXJlci4KLSAgZ19jdXJwYXRoID0gImFyZ3VtZW50cyI7Ci0KLSAgLy8gSGFja3kgcGFyYW1ldGVyIGhhbmRsaW5nLi4uIEkgZGlkbid0IGZlZWwgbGlrZSB1c2luZyBhIGxpYnJhcnkgc29ycnkhCi0gIGZvciAoaSA9IDE7IGkgPCBhcmdjLTE7IGkrKykgewotICAgIGNoYXIqIGFyZzsKLQotICAgIGFyZyA9IHN0cnRvayhhcmd2W2ldLCAiICIpOwotICAgIHdoaWxlIChhcmcgIT0gTlVMTCkgewotICAgICAgLy8gVHJlYXQgZG91YmxlIGRhc2hlcyBhcyBzaW5nbGUgZGFzaGVzCi0gICAgICBpZiAoYXJnWzBdID09ICctJyAmJiBhcmdbMV0gPT0gJy0nKSB7Ci0gICAgICAgICsrYXJnOwotICAgICAgfQotCi0gICAgICBpZiAoc3RyY21wKGFyZywgIi1oZWxwIikgPT0gMCkgewotICAgICAgICBoZWxwKCk7Ci0gICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItdmVyc2lvbiIpID09IDApIHsKLSAgICAgICAgdmVyc2lvbigpOwotICAgICAgICBleGl0KDApOwotICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLWRlYnVnIikgPT0gMCkgewotICAgICAgICBnX2RlYnVnID0gMTsKLSAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1ub3dhcm4iKSA9PSAwKSB7Ci0gICAgICAgIGdfd2FybiA9IDA7Ci0gICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItc3RyaWN0IikgPT0gMCkgewotICAgICAgICBnX3N0cmljdCA9IDI1NTsKLSAgICAgICAgZ193YXJuID0gMjsKLSAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi12IikgPT0gMCB8fCBzdHJjbXAoYXJnLCAiLXZlcmJvc2UiKSA9PSAwICkgewotICAgICAgICBnX3ZlcmJvc2UgPSAxOwotICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLXIiKSA9PSAwIHx8IHN0cmNtcChhcmcsICItcmVjdXJzZSIpID09IDAgKSB7Ci0gICAgICAgIGdlbl9yZWN1cnNlID0gdHJ1ZTsKLSAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1hbGxvdy1uZWcta2V5cyIpID09IDApIHsKLSAgICAgICAgZ19hbGxvd19uZWdfZmllbGRfa2V5cyA9IHRydWU7Ci0gICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItYWxsb3ctNjRiaXQtY29uc3RzIikgPT0gMCkgewotICAgICAgICBnX2FsbG93XzY0Yml0X2NvbnN0cyA9IHRydWU7Ci0gICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItZ2VuIikgPT0gMCkgewotICAgICAgICBhcmcgPSBhcmd2WysraV07Ci0gICAgICAgIGlmIChhcmcgPT0gTlVMTCkgewotICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiTWlzc2luZyBnZW5lcmF0b3Igc3BlY2lmaWNhdGlvblxuIik7Ci0gICAgICAgICAgdXNhZ2UoKTsKLSAgICAgICAgfQotICAgICAgICBnZW5lcmF0b3Jfc3RyaW5ncy5wdXNoX2JhY2soYXJnKTsKLSAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1JIikgPT0gMCkgewotICAgICAgICAvLyBBbiBhcmd1bWVudCBvZiAiLUlcIGFzZGYiIGlzIGludmFsaWQgYW5kIGhhcyB1bmtub3duIHJlc3VsdHMKLSAgICAgICAgYXJnID0gYXJndlsrK2ldOwotCi0gICAgICAgIGlmIChhcmcgPT0gTlVMTCkgewotICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiTWlzc2luZyBJbmNsdWRlIGRpcmVjdG9yeVxuIik7Ci0gICAgICAgICAgdXNhZ2UoKTsKLSAgICAgICAgfQotICAgICAgICBnX2luY2xfc2VhcmNocGF0aC5wdXNoX2JhY2soYXJnKTsKLSAgICAgIH0gZWxzZSBpZiAoKHN0cmNtcChhcmcsICItbyIpID09IDApIHx8IChzdHJjbXAoYXJnLCAiLW91dCIpID09IDApKSB7Ci0gICAgICAgIG91dF9wYXRoX2lzX2Fic29sdXRlID0gKHN0cmNtcChhcmcsICItb3V0IikgPT0gMCkgPyB0cnVlIDogZmFsc2U7Ci0gICAgICAgIGFyZyA9IGFyZ3ZbKytpXTsKLSAgICAgICAgaWYgKGFyZyA9PSBOVUxMKSB7Ci0gICAgICAgICAgZnByaW50ZihzdGRlcnIsICItbzogbWlzc2luZyBvdXRwdXQgZGlyZWN0b3J5XG4iKTsKLSAgICAgICAgICB1c2FnZSgpOwotICAgICAgICB9Ci0gICAgICAgIG91dF9wYXRoID0gYXJnOwotCi0jaWZkZWYgX1dJTjMyCi0gICAgICAgIC8vc3RyaXAgb3V0IHRyYWlsaW5nIFwgb24gV2luZG93cwotICAgICAgICBpbnQgbGFzdCA9IG91dF9wYXRoLmxlbmd0aCgpLTE7Ci0gICAgICAgIGlmIChvdXRfcGF0aFtsYXN0XSA9PSAnXFwnKQotICAgICAgICB7Ci0gICAgICAgICAgb3V0X3BhdGguZXJhc2UobGFzdCk7Ci0gICAgICAgIH0KLSNlbmRpZgotICAgICAgICBpZiAoIWNoZWNrX2lzX2RpcmVjdG9yeShvdXRfcGF0aC5jX3N0cigpKSkKLSAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVucmVjb2duaXplZCBvcHRpb246ICVzXG4iLCBhcmcpOwotICAgICAgICB1c2FnZSgpOwotICAgICAgfQotCi0gICAgICAvLyBUb2tlbml6ZSBtb3JlCi0gICAgICBhcmcgPSBzdHJ0b2soTlVMTCwgIiAiKTsKLSAgICB9Ci0gIH0KLQotICAvLyBkaXNwbGF5IGhlbHAKLSAgaWYgKChzdHJjbXAoYXJndlthcmdjLTFdLCAiLWhlbHAiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbYXJnYy0xXSwgIi0taGVscCIpID09IDApKSB7Ci0gICAgaGVscCgpOwotICB9Ci0KLSAgLy8gaWYgeW91J3JlIGFza2luZyBmb3IgdmVyc2lvbiwgeW91IGhhdmUgYSByaWdodCBub3QgdG8gcGFzcyBhIGZpbGUKLSAgaWYgKChzdHJjbXAoYXJndlthcmdjLTFdLCAiLXZlcnNpb24iKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbYXJnYy0xXSwgIi0tdmVyc2lvbiIpID09IDApKSB7Ci0gICAgdmVyc2lvbigpOwotICAgIGV4aXQoMCk7Ci0gIH0KLQotICAvLyBZb3UgZ290dGEgZ2VuZXJhdGUgc29tZXRoaW5nIQotICBpZiAoZ2VuZXJhdG9yX3N0cmluZ3MuZW1wdHkoKSkgewotICAgIGZwcmludGYoc3RkZXJyLCAiTm8gb3V0cHV0IGxhbmd1YWdlKHMpIHNwZWNpZmllZFxuIik7Ci0gICAgdXNhZ2UoKTsKLSAgfQotCi0gIC8vIFJlYWwtcGF0aGlmeSBpdAotICBjaGFyIHJwW1RIUklGVF9QQVRIX01BWF07Ci0gIGlmIChhcmd2W2ldID09IE5VTEwpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIk1pc3NpbmcgZmlsZSBuYW1lXG4iKTsKLSAgICB1c2FnZSgpOwotICB9Ci0gIGlmIChzYWZlcmVhbHBhdGgoYXJndltpXSwgcnApID09IE5VTEwpIHsKLSAgICBmYWlsdXJlKCJDb3VsZCBub3Qgb3BlbiBpbnB1dCBmaWxlIHdpdGggcmVhbHBhdGg6ICVzIiwgYXJndltpXSk7Ci0gIH0KLSAgc3RyaW5nIGlucHV0X2ZpbGUocnApOwotCi0gIC8vIEluc3RhbmNlIG9mIHRoZSBnbG9iYWwgcGFyc2UgdHJlZQotICB0X3Byb2dyYW0qIHByb2dyYW0gPSBuZXcgdF9wcm9ncmFtKGlucHV0X2ZpbGUpOwotICBpZiAob3V0X3BhdGguc2l6ZSgpKSB7Ci0gICAgcHJvZ3JhbS0+c2V0X291dF9wYXRoKG91dF9wYXRoLCBvdXRfcGF0aF9pc19hYnNvbHV0ZSk7Ci0gIH0KLQotICAvLyBDb21wdXRlIHRoZSBjcHAgaW5jbHVkZSBwcmVmaXguCi0gIC8vIGluZmVyIHRoaXMgZnJvbSB0aGUgZmlsZW5hbWUgcGFzc2VkIGluCi0gIHN0cmluZyBpbnB1dF9maWxlbmFtZSA9IGFyZ3ZbaV07Ci0gIHN0cmluZyBpbmNsdWRlX3ByZWZpeDsKLQotICBzdHJpbmc6OnNpemVfdHlwZSBsYXN0X3NsYXNoID0gc3RyaW5nOjpucG9zOwotICBpZiAoKGxhc3Rfc2xhc2ggPSBpbnB1dF9maWxlbmFtZS5yZmluZCgiLyIpKSAhPSBzdHJpbmc6Om5wb3MpIHsKLSAgICBpbmNsdWRlX3ByZWZpeCA9IGlucHV0X2ZpbGVuYW1lLnN1YnN0cigwLCBsYXN0X3NsYXNoKTsKLSAgfQotCi0gIHByb2dyYW0tPnNldF9pbmNsdWRlX3ByZWZpeChpbmNsdWRlX3ByZWZpeCk7Ci0KLSAgLy8gSW5pdGlhbGl6ZSBnbG9iYWwgdHlwZXMKLSAgZ190eXBlX3ZvaWQgICA9IG5ldyB0X2Jhc2VfdHlwZSgidm9pZCIsICAgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRCk7Ci0gIGdfdHlwZV9zdHJpbmcgPSBuZXcgdF9iYXNlX3R5cGUoInN0cmluZyIsIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORyk7Ci0gIGdfdHlwZV9iaW5hcnkgPSBuZXcgdF9iYXNlX3R5cGUoInN0cmluZyIsIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORyk7Ci0gICgodF9iYXNlX3R5cGUqKWdfdHlwZV9iaW5hcnkpLT5zZXRfYmluYXJ5KHRydWUpOwotICBnX3R5cGVfc2xpc3QgID0gbmV3IHRfYmFzZV90eXBlKCJzdHJpbmciLCB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkcpOwotICAoKHRfYmFzZV90eXBlKilnX3R5cGVfc2xpc3QpLT5zZXRfc3RyaW5nX2xpc3QodHJ1ZSk7Ci0gIGdfdHlwZV9ib29sICAgPSBuZXcgdF9iYXNlX3R5cGUoImJvb2wiLCAgIHRfYmFzZV90eXBlOjpUWVBFX0JPT0wpOwotICBnX3R5cGVfYnl0ZSAgID0gbmV3IHRfYmFzZV90eXBlKCJieXRlIiwgICB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFKTsKLSAgZ190eXBlX2kxNiAgICA9IG5ldyB0X2Jhc2VfdHlwZSgiaTE2IiwgICAgdF9iYXNlX3R5cGU6OlRZUEVfSTE2KTsKLSAgZ190eXBlX2kzMiAgICA9IG5ldyB0X2Jhc2VfdHlwZSgiaTMyIiwgICAgdF9iYXNlX3R5cGU6OlRZUEVfSTMyKTsKLSAgZ190eXBlX2k2NCAgICA9IG5ldyB0X2Jhc2VfdHlwZSgiaTY0IiwgICAgdF9iYXNlX3R5cGU6OlRZUEVfSTY0KTsKLSAgZ190eXBlX2RvdWJsZSA9IG5ldyB0X2Jhc2VfdHlwZSgiZG91YmxlIiwgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFKTsKLQotICAvLyBQYXJzZSBpdCEKLSAgcGFyc2UocHJvZ3JhbSwgTlVMTCk7Ci0KLSAgLy8gVGhlIGN1cnJlbnQgcGF0aCBpcyBub3QgcmVhbGx5IHJlbGV2YW50IHdoZW4gd2UgYXJlIGRvaW5nIGdlbmVyYXRpb24uCi0gIC8vIFJlc2V0IHRoZSB2YXJpYWJsZSB0byBtYWtlIHdhcm5pbmcgbWVzc2FnZXMgY2xlYXJlci4KLSAgZ19jdXJwYXRoID0gImdlbmVyYXRpb24iOwotICAvLyBSZXNldCB5eWxpbmVubyBmb3IgdGhlIGhlY2sgb2YgaXQuICBVc2UgMSBpbnN0ZWFkIG9mIDAgYmVjYXVzZQotICAvLyBUaGF0IGlzIHdoYXQgc2hvd3MgdXAgZHVyaW5nIGFyZ3VtZW50IHBhcnNpbmcuCi0gIHl5bGluZW5vID0gMTsKLQotICAvLyBHZW5lcmF0ZSBpdCEKLSAgZ2VuZXJhdGUocHJvZ3JhbSwgZ2VuZXJhdG9yX3N0cmluZ3MpOwotCi0gIC8vIENsZWFuIHVwLiBXaG8gYW0gSSBraWRkaW5nLi4uIHRoaXMgcHJvZ3JhbSBwcm9iYWJseSBvcnBoYW5zIGhlYXAgbWVtb3J5Ci0gIC8vIGFsbCBvdmVyIHRoZSBwbGFjZSwgYnV0IHdobyBjYXJlcyBiZWNhdXNlIGl0IGlzIGFib3V0IHRvIGV4aXQgYW5kIGl0IGlzCi0gIC8vIGFsbCByZWZlcmVuY2VkIGFuZCB1c2VkIGJ5IHRoaXMgd2Fja3kgcGFyc2UgdHJlZSB1cCB1bnRpbCBub3cgYW55d2F5cy4KLQotICBkZWxldGUgcHJvZ3JhbTsKLSAgZGVsZXRlIGdfdHlwZV92b2lkOwotICBkZWxldGUgZ190eXBlX3N0cmluZzsKLSAgZGVsZXRlIGdfdHlwZV9ib29sOwotICBkZWxldGUgZ190eXBlX2J5dGU7Ci0gIGRlbGV0ZSBnX3R5cGVfaTE2OwotICBkZWxldGUgZ190eXBlX2kzMjsKLSAgZGVsZXRlIGdfdHlwZV9pNjQ7Ci0gIGRlbGV0ZSBnX3R5cGVfZG91YmxlOwotCi0gIC8vIEZpbmlzaGVkCi0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9tYWluLmggYi9jb21waWxlci9jcHAvc3JjL21haW4uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWIwZjNmMy4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL21haW4uaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgVF9NQUlOX0gKLSNkZWZpbmUgVF9NQUlOX0gKLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlICJsb2dnaW5nLmgiCi0jaW5jbHVkZSAicGFyc2UvdF9jb25zdC5oIgotI2luY2x1ZGUgInBhcnNlL3RfZmllbGQuaCIKLQotLyoqCi0gKiBEZWZpbmVkIGluIHRoZSBmbGV4IGxpYnJhcnkKLSAqLwotCi1leHRlcm4gIkMiIHsKLSAgaW50IHl5bGV4KHZvaWQpOwotfQotCi1pbnQgeXlwYXJzZSh2b2lkKTsKLQotLyoqCi0gKiBFeHBlY3RlZCB0byBiZSBkZWZpbmVkIGJ5IEZsZXgvQmlzb24KLSAqLwotdm9pZCB5eWVycm9yKGNvbnN0IGNoYXIqIGZtdCwgLi4uKTsKLQotLyoqCi0gKiBDaGVjayBzaW1wbGUgaWRlbnRpZmllciBuYW1lcwotICovCi12b2lkIHZhbGlkYXRlX3NpbXBsZV9pZGVudGlmaWVyKGNvbnN0IGNoYXIqIGlkZW50aWZpZXIpOwotCi0vKioKLSAqIENoZWNrIGNvbnN0YW50IHR5cGVzCi0gKi8KLXZvaWQgdmFsaWRhdGVfY29uc3RfdHlwZSh0X2NvbnN0KiBjKTsKLQotLyoqCi0gKiBDaGVjayBjb25zdGFudCB0eXBlcwotICovCi12b2lkIHZhbGlkYXRlX2ZpZWxkX3ZhbHVlKHRfZmllbGQqIGZpZWxkLCB0X2NvbnN0X3ZhbHVlKiBjdik7Ci0KLS8qKgotICogQ2hlY2sgbWVtYmVycyBvZiBhIHRocm93cyBibG9jawotICovCi1ib29sIHZhbGlkYXRlX3Rocm93cyh0X3N0cnVjdCogdGhyb3dzKTsKLQotLyoqCi0gKiBDb252ZXJ0cyBhIHN0cmluZyBmaWxlbmFtZSBpbnRvIGEgdGhyaWZ0IHByb2dyYW0gbmFtZQotICovCi1zdGQ6OnN0cmluZyBwcm9ncmFtX25hbWUoc3RkOjpzdHJpbmcgZmlsZW5hbWUpOwotCi0vKioKLSAqIEdldHMgdGhlIGRpcmVjdG9yeSBwYXRoIG9mIGEgZmlsZW5hbWUKLSAqLwotc3RkOjpzdHJpbmcgZGlyZWN0b3J5X25hbWUoc3RkOjpzdHJpbmcgZmlsZW5hbWUpOwotCi0vKioKLSAqIEdldCB0aGUgYWJzb2x1dGUgcGF0aCBmb3IgYW4gaW5jbHVkZSBmaWxlCi0gKi8KLXN0ZDo6c3RyaW5nIGluY2x1ZGVfZmlsZShzdGQ6OnN0cmluZyBmaWxlbmFtZSk7Ci0KLS8qKgotICogQ2xlYXJzIGFueSBwcmV2aW91c2x5IHN0b3JlZCBkb2N0ZXh0IHN0cmluZy4KLSAqLwotdm9pZCBjbGVhcl9kb2N0ZXh0KCk7Ci0KLS8qKgotICogQ2xlYW5zIHVwIHRleHQgY29tbW9ubHkgZm91bmQgaW4gZG94eWdlbi1saWtlIGNvbW1lbnRzCi0gKi8KLWNoYXIqIGNsZWFuX3VwX2RvY3RleHQoY2hhciogZG9jdGV4dCk7Ci0KLS8qKgotICogV2UgYXJlIHN1cmUgdGhlIHByb2dyYW0gZG9jdGV4dCBjYW5kaWRhdGUgaXMgcmVhbGx5IHRoZSBwcm9ncmFtIGRvY3RleHQuCi0gKi8KLXZvaWQgZGVjbGFyZV92YWxpZF9wcm9ncmFtX2RvY3RleHQoKTsKLQotLyoqCi0gKiBFbWl0cyBhIHdhcm5pbmcgb24gbGlzdDxieXRlPiwgYmluYXJ5IHR5cGUgaXMgdHlwaWNhbGx5IGEgbXVjaCBiZXR0ZXIgY2hvaWNlLgotICovCi12b2lkIGNoZWNrX2Zvcl9saXN0X29mX2J5dGVzKHRfdHlwZSogbGlzdF9lbGVtX3R5cGUpOwotCi0vKioKLSAqIEZsZXggdXRpbGl0aWVzCi0gKi8KLQotZXh0ZXJuIGludCAgIHl5bGluZW5vOwotZXh0ZXJuIGNoYXIgIHl5dGV4dFtdOwotZXh0ZXJuIEZJTEUqIHl5aW47Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9tZDUuYyBiL2NvbXBpbGVyL2NwcC9zcmMvbWQ1LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNWQ5NmMuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9tZDUuYworKysgL2Rldi9udWxsCkBAIC0xLDM4MSArMCwwIEBACi0vKgotICBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDIgQWxhZGRpbiBFbnRlcnByaXNlcy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKLSAgd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcwotICBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgotCi0gIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAotICBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0Ci0gIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKLQotICAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAotICAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQotICAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKLSAgICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KLSAgMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKLSAgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgotICAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgotCi0gIEwuIFBldGVyIERldXRzY2gKLSAgZ2hvc3RAYWxhZGRpbi5jb20KLQotICovCi0vKiAkSWQ6IG1kNS5jLHYgMS42IDIwMDIvMDQvMTMgMTk6MjA6MjggbHBkIEV4cCAkICovCi0vKgotICBJbmRlcGVuZGVudCBpbXBsZW1lbnRhdGlvbiBvZiBNRDUgKFJGQyAxMzIxKS4KLQotICBUaGlzIGNvZGUgaW1wbGVtZW50cyB0aGUgTUQ1IEFsZ29yaXRobSBkZWZpbmVkIGluIFJGQyAxMzIxLCB3aG9zZQotICB0ZXh0IGlzIGF2YWlsYWJsZSBhdAotCWh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzEzMjEudHh0Ci0gIFRoZSBjb2RlIGlzIGRlcml2ZWQgZnJvbSB0aGUgdGV4dCBvZiB0aGUgUkZDLCBpbmNsdWRpbmcgdGhlIHRlc3Qgc3VpdGUKLSAgKHNlY3Rpb24gQS41KSBidXQgZXhjbHVkaW5nIHRoZSByZXN0IG9mIEFwcGVuZGl4IEEuICBJdCBkb2VzIG5vdCBpbmNsdWRlCi0gIGFueSBjb2RlIG9yIGRvY3VtZW50YXRpb24gdGhhdCBpcyBpZGVudGlmaWVkIGluIHRoZSBSRkMgYXMgYmVpbmcKLSAgY29weXJpZ2h0ZWQuCi0KLSAgVGhlIG9yaWdpbmFsIGFuZCBwcmluY2lwYWwgYXV0aG9yIG9mIG1kNS5jIGlzIEwuIFBldGVyIERldXRzY2gKLSAgPGdob3N0QGFsYWRkaW4uY29tPi4gIE90aGVyIGF1dGhvcnMgYXJlIG5vdGVkIGluIHRoZSBjaGFuZ2UgaGlzdG9yeQotICB0aGF0IGZvbGxvd3MgKGluIHJldmVyc2UgY2hyb25vbG9naWNhbCBvcmRlcik6Ci0KLSAgMjAwMi0wNC0xMyBscGQgQ2xhcmlmaWVkIGRlcml2YXRpb24gZnJvbSBSRkMgMTMyMTsgbm93IGhhbmRsZXMgYnl0ZSBvcmRlcgotCWVpdGhlciBzdGF0aWNhbGx5IG9yIGR5bmFtaWNhbGx5OyBhZGRlZCBtaXNzaW5nICNpbmNsdWRlIDxzdHJpbmcuaD4KLQlpbiBsaWJyYXJ5LgotICAyMDAyLTAzLTExIGxwZCBDb3JyZWN0ZWQgYXJndW1lbnQgbGlzdCBmb3IgbWFpbigpLCBhbmQgYWRkZWQgaW50IHJldHVybgotCXR5cGUsIGluIHRlc3QgcHJvZ3JhbSBhbmQgVCB2YWx1ZSBwcm9ncmFtLgotICAyMDAyLTAyLTIxIGxwZCBBZGRlZCBtaXNzaW5nICNpbmNsdWRlIDxzdGRpby5oPiBpbiB0ZXN0IHByb2dyYW0uCi0gIDIwMDAtMDctMDMgbHBkIFBhdGNoZWQgdG8gZWxpbWluYXRlIHdhcm5pbmdzIGFib3V0ICJjb25zdGFudCBpcwotCXVuc2lnbmVkIGluIEFOU0kgQywgc2lnbmVkIGluIHRyYWRpdGlvbmFsIjsgbWFkZSB0ZXN0IHByb2dyYW0KLQlzZWxmLWNoZWNraW5nLgotICAxOTk5LTExLTA0IGxwZCBFZGl0ZWQgY29tbWVudHMgc2xpZ2h0bHkgZm9yIGF1dG9tYXRpYyBUT0MgZXh0cmFjdGlvbi4KLSAgMTk5OS0xMC0xOCBscGQgRml4ZWQgdHlwbyBpbiBoZWFkZXIgY29tbWVudCAoYW5zaTJrbnIgcmF0aGVyIHRoYW4gbWQ1KS4KLSAgMTk5OS0wNS0wMyBscGQgT3JpZ2luYWwgdmVyc2lvbi4KLSAqLwotCi0jaW5jbHVkZSAibWQ1LmgiCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSN1bmRlZiBCWVRFX09SREVSCS8qIDEgPSBiaWctZW5kaWFuLCAtMSA9IGxpdHRsZS1lbmRpYW4sIDAgPSB1bmtub3duICovCi0jaWZkZWYgQVJDSF9JU19CSUdfRU5ESUFOCi0jICBkZWZpbmUgQllURV9PUkRFUiAoQVJDSF9JU19CSUdfRU5ESUFOID8gMSA6IC0xKQotI2Vsc2UKLSMgIGRlZmluZSBCWVRFX09SREVSIDAKLSNlbmRpZgotCi0jZGVmaW5lIFRfTUFTSyAoKG1kNV93b3JkX3QpfjApCi0jZGVmaW5lIFQxIC8qIDB4ZDc2YWE0NzggKi8gKFRfTUFTSyBeIDB4Mjg5NTViODcpCi0jZGVmaW5lIFQyIC8qIDB4ZThjN2I3NTYgKi8gKFRfTUFTSyBeIDB4MTczODQ4YTkpCi0jZGVmaW5lIFQzICAgIDB4MjQyMDcwZGIKLSNkZWZpbmUgVDQgLyogMHhjMWJkY2VlZSAqLyAoVF9NQVNLIF4gMHgzZTQyMzExMSkKLSNkZWZpbmUgVDUgLyogMHhmNTdjMGZhZiAqLyAoVF9NQVNLIF4gMHgwYTgzZjA1MCkKLSNkZWZpbmUgVDYgICAgMHg0Nzg3YzYyYQotI2RlZmluZSBUNyAvKiAweGE4MzA0NjEzICovIChUX01BU0sgXiAweDU3Y2ZiOWVjKQotI2RlZmluZSBUOCAvKiAweGZkNDY5NTAxICovIChUX01BU0sgXiAweDAyYjk2YWZlKQotI2RlZmluZSBUOSAgICAweDY5ODA5OGQ4Ci0jZGVmaW5lIFQxMCAvKiAweDhiNDRmN2FmICovIChUX01BU0sgXiAweDc0YmIwODUwKQotI2RlZmluZSBUMTEgLyogMHhmZmZmNWJiMSAqLyAoVF9NQVNLIF4gMHgwMDAwYTQ0ZSkKLSNkZWZpbmUgVDEyIC8qIDB4ODk1Y2Q3YmUgKi8gKFRfTUFTSyBeIDB4NzZhMzI4NDEpCi0jZGVmaW5lIFQxMyAgICAweDZiOTAxMTIyCi0jZGVmaW5lIFQxNCAvKiAweGZkOTg3MTkzICovIChUX01BU0sgXiAweDAyNjc4ZTZjKQotI2RlZmluZSBUMTUgLyogMHhhNjc5NDM4ZSAqLyAoVF9NQVNLIF4gMHg1OTg2YmM3MSkKLSNkZWZpbmUgVDE2ICAgIDB4NDliNDA4MjEKLSNkZWZpbmUgVDE3IC8qIDB4ZjYxZTI1NjIgKi8gKFRfTUFTSyBeIDB4MDllMWRhOWQpCi0jZGVmaW5lIFQxOCAvKiAweGMwNDBiMzQwICovIChUX01BU0sgXiAweDNmYmY0Y2JmKQotI2RlZmluZSBUMTkgICAgMHgyNjVlNWE1MQotI2RlZmluZSBUMjAgLyogMHhlOWI2YzdhYSAqLyAoVF9NQVNLIF4gMHgxNjQ5Mzg1NSkKLSNkZWZpbmUgVDIxIC8qIDB4ZDYyZjEwNWQgKi8gKFRfTUFTSyBeIDB4MjlkMGVmYTIpCi0jZGVmaW5lIFQyMiAgICAweDAyNDQxNDUzCi0jZGVmaW5lIFQyMyAvKiAweGQ4YTFlNjgxICovIChUX01BU0sgXiAweDI3NWUxOTdlKQotI2RlZmluZSBUMjQgLyogMHhlN2QzZmJjOCAqLyAoVF9NQVNLIF4gMHgxODJjMDQzNykKLSNkZWZpbmUgVDI1ICAgIDB4MjFlMWNkZTYKLSNkZWZpbmUgVDI2IC8qIDB4YzMzNzA3ZDYgKi8gKFRfTUFTSyBeIDB4M2NjOGY4MjkpCi0jZGVmaW5lIFQyNyAvKiAweGY0ZDUwZDg3ICovIChUX01BU0sgXiAweDBiMmFmMjc4KQotI2RlZmluZSBUMjggICAgMHg0NTVhMTRlZAotI2RlZmluZSBUMjkgLyogMHhhOWUzZTkwNSAqLyAoVF9NQVNLIF4gMHg1NjFjMTZmYSkKLSNkZWZpbmUgVDMwIC8qIDB4ZmNlZmEzZjggKi8gKFRfTUFTSyBeIDB4MDMxMDVjMDcpCi0jZGVmaW5lIFQzMSAgICAweDY3NmYwMmQ5Ci0jZGVmaW5lIFQzMiAvKiAweDhkMmE0YzhhICovIChUX01BU0sgXiAweDcyZDViMzc1KQotI2RlZmluZSBUMzMgLyogMHhmZmZhMzk0MiAqLyAoVF9NQVNLIF4gMHgwMDA1YzZiZCkKLSNkZWZpbmUgVDM0IC8qIDB4ODc3MWY2ODEgKi8gKFRfTUFTSyBeIDB4Nzg4ZTA5N2UpCi0jZGVmaW5lIFQzNSAgICAweDZkOWQ2MTIyCi0jZGVmaW5lIFQzNiAvKiAweGZkZTUzODBjICovIChUX01BU0sgXiAweDAyMWFjN2YzKQotI2RlZmluZSBUMzcgLyogMHhhNGJlZWE0NCAqLyAoVF9NQVNLIF4gMHg1YjQxMTViYikKLSNkZWZpbmUgVDM4ICAgIDB4NGJkZWNmYTkKLSNkZWZpbmUgVDM5IC8qIDB4ZjZiYjRiNjAgKi8gKFRfTUFTSyBeIDB4MDk0NGI0OWYpCi0jZGVmaW5lIFQ0MCAvKiAweGJlYmZiYzcwICovIChUX01BU0sgXiAweDQxNDA0MzhmKQotI2RlZmluZSBUNDEgICAgMHgyODliN2VjNgotI2RlZmluZSBUNDIgLyogMHhlYWExMjdmYSAqLyAoVF9NQVNLIF4gMHgxNTVlZDgwNSkKLSNkZWZpbmUgVDQzIC8qIDB4ZDRlZjMwODUgKi8gKFRfTUFTSyBeIDB4MmIxMGNmN2EpCi0jZGVmaW5lIFQ0NCAgICAweDA0ODgxZDA1Ci0jZGVmaW5lIFQ0NSAvKiAweGQ5ZDRkMDM5ICovIChUX01BU0sgXiAweDI2MmIyZmM2KQotI2RlZmluZSBUNDYgLyogMHhlNmRiOTllNSAqLyAoVF9NQVNLIF4gMHgxOTI0NjYxYSkKLSNkZWZpbmUgVDQ3ICAgIDB4MWZhMjdjZjgKLSNkZWZpbmUgVDQ4IC8qIDB4YzRhYzU2NjUgKi8gKFRfTUFTSyBeIDB4M2I1M2E5OWEpCi0jZGVmaW5lIFQ0OSAvKiAweGY0MjkyMjQ0ICovIChUX01BU0sgXiAweDBiZDZkZGJiKQotI2RlZmluZSBUNTAgICAgMHg0MzJhZmY5NwotI2RlZmluZSBUNTEgLyogMHhhYjk0MjNhNyAqLyAoVF9NQVNLIF4gMHg1NDZiZGM1OCkKLSNkZWZpbmUgVDUyIC8qIDB4ZmM5M2EwMzkgKi8gKFRfTUFTSyBeIDB4MDM2YzVmYzYpCi0jZGVmaW5lIFQ1MyAgICAweDY1NWI1OWMzCi0jZGVmaW5lIFQ1NCAvKiAweDhmMGNjYzkyICovIChUX01BU0sgXiAweDcwZjMzMzZkKQotI2RlZmluZSBUNTUgLyogMHhmZmVmZjQ3ZCAqLyAoVF9NQVNLIF4gMHgwMDEwMGI4MikKLSNkZWZpbmUgVDU2IC8qIDB4ODU4NDVkZDEgKi8gKFRfTUFTSyBeIDB4N2E3YmEyMmUpCi0jZGVmaW5lIFQ1NyAgICAweDZmYTg3ZTRmCi0jZGVmaW5lIFQ1OCAvKiAweGZlMmNlNmUwICovIChUX01BU0sgXiAweDAxZDMxOTFmKQotI2RlZmluZSBUNTkgLyogMHhhMzAxNDMxNCAqLyAoVF9NQVNLIF4gMHg1Y2ZlYmNlYikKLSNkZWZpbmUgVDYwICAgIDB4NGUwODExYTEKLSNkZWZpbmUgVDYxIC8qIDB4Zjc1MzdlODIgKi8gKFRfTUFTSyBeIDB4MDhhYzgxN2QpCi0jZGVmaW5lIFQ2MiAvKiAweGJkM2FmMjM1ICovIChUX01BU0sgXiAweDQyYzUwZGNhKQotI2RlZmluZSBUNjMgICAgMHgyYWQ3ZDJiYgotI2RlZmluZSBUNjQgLyogMHhlYjg2ZDM5MSAqLyAoVF9NQVNLIF4gMHgxNDc5MmM2ZSkKLQotCi1zdGF0aWMgdm9pZAotbWQ1X3Byb2Nlc3MobWQ1X3N0YXRlX3QgKnBtcywgY29uc3QgbWQ1X2J5dGVfdCAqZGF0YSAvKls2NF0qLykKLXsKLSAgICBtZDVfd29yZF90Ci0JYSA9IHBtcy0+YWJjZFswXSwgYiA9IHBtcy0+YWJjZFsxXSwKLQljID0gcG1zLT5hYmNkWzJdLCBkID0gcG1zLT5hYmNkWzNdOwotICAgIG1kNV93b3JkX3QgdDsKLSNpZiBCWVRFX09SREVSID4gMAotICAgIC8qIERlZmluZSBzdG9yYWdlIG9ubHkgZm9yIGJpZy1lbmRpYW4gQ1BVcy4gKi8KLSAgICBtZDVfd29yZF90IFhbMTZdOwotI2Vsc2UKLSAgICAvKiBEZWZpbmUgc3RvcmFnZSBmb3IgbGl0dGxlLWVuZGlhbiBvciBib3RoIHR5cGVzIG9mIENQVXMuICovCi0gICAgbWQ1X3dvcmRfdCB4YnVmWzE2XTsKLSAgICBjb25zdCBtZDVfd29yZF90ICpYOwotI2VuZGlmCi0KLSAgICB7Ci0jaWYgQllURV9PUkRFUiA9PSAwCi0JLyoKLQkgKiBEZXRlcm1pbmUgZHluYW1pY2FsbHkgd2hldGhlciB0aGlzIGlzIGEgYmlnLWVuZGlhbiBvcgotCSAqIGxpdHRsZS1lbmRpYW4gbWFjaGluZSwgc2luY2Ugd2UgY2FuIHVzZSBhIG1vcmUgZWZmaWNpZW50Ci0JICogYWxnb3JpdGhtIG9uIHRoZSBsYXR0ZXIuCi0JICovCi0Jc3RhdGljIGNvbnN0IGludCB3ID0gMTsKLQotCWlmICgqKChjb25zdCBtZDVfYnl0ZV90ICopJncpKSAvKiBkeW5hbWljIGxpdHRsZS1lbmRpYW4gKi8KLSNlbmRpZgotI2lmIEJZVEVfT1JERVIgPD0gMAkJLyogbGl0dGxlLWVuZGlhbiAqLwotCXsKLQkgICAgLyoKLQkgICAgICogT24gbGl0dGxlLWVuZGlhbiBtYWNoaW5lcywgd2UgY2FuIHByb2Nlc3MgcHJvcGVybHkgYWxpZ25lZAotCSAgICAgKiBkYXRhIHdpdGhvdXQgY29weWluZyBpdC4KLQkgICAgICovCi0JICAgIGlmICghKChkYXRhIC0gKGNvbnN0IG1kNV9ieXRlX3QgKikwKSAmIDMpKSB7Ci0JCS8qIGRhdGEgYXJlIHByb3Blcmx5IGFsaWduZWQgKi8KLQkJWCA9IChjb25zdCBtZDVfd29yZF90ICopZGF0YTsKLQkgICAgfSBlbHNlIHsKLQkJLyogbm90IGFsaWduZWQgKi8KLQkJbWVtY3B5KHhidWYsIGRhdGEsIDY0KTsKLQkJWCA9IHhidWY7Ci0JICAgIH0KLQl9Ci0jZW5kaWYKLSNpZiBCWVRFX09SREVSID09IDAKLQllbHNlCQkJLyogZHluYW1pYyBiaWctZW5kaWFuICovCi0jZW5kaWYKLSNpZiBCWVRFX09SREVSID49IDAJCS8qIGJpZy1lbmRpYW4gKi8KLQl7Ci0JICAgIC8qCi0JICAgICAqIE9uIGJpZy1lbmRpYW4gbWFjaGluZXMsIHdlIG11c3QgYXJyYW5nZSB0aGUgYnl0ZXMgaW4gdGhlCi0JICAgICAqIHJpZ2h0IG9yZGVyLgotCSAgICAgKi8KLQkgICAgY29uc3QgbWQ1X2J5dGVfdCAqeHAgPSBkYXRhOwotCSAgICBpbnQgaTsKLQotIyAgaWYgQllURV9PUkRFUiA9PSAwCi0JICAgIFggPSB4YnVmOwkJLyogKGR5bmFtaWMgb25seSkgKi8KLSMgIGVsc2UKLSMgICAgZGVmaW5lIHhidWYgWAkJLyogKHN0YXRpYyBvbmx5KSAqLwotIyAgZW5kaWYKLQkgICAgZm9yIChpID0gMDsgaSA8IDE2OyArK2ksIHhwICs9IDQpCi0JCXhidWZbaV0gPSB4cFswXSArICh4cFsxXSA8PCA4KSArICh4cFsyXSA8PCAxNikgKyAoeHBbM10gPDwgMjQpOwotCX0KLSNlbmRpZgotICAgIH0KLQotI2RlZmluZSBST1RBVEVfTEVGVCh4LCBuKSAoKCh4KSA8PCAobikpIHwgKCh4KSA+PiAoMzIgLSAobikpKSkKLQotICAgIC8qIFJvdW5kIDEuICovCi0gICAgLyogTGV0IFthYmNkIGsgcyBpXSBkZW5vdGUgdGhlIG9wZXJhdGlvbgotICAgICAgIGEgPSBiICsgKChhICsgRihiLGMsZCkgKyBYW2tdICsgVFtpXSkgPDw8IHMpLiAqLwotI2RlZmluZSBGKHgsIHksIHopICgoKHgpICYgKHkpKSB8ICh+KHgpICYgKHopKSkKLSNkZWZpbmUgU0VUKGEsIGIsIGMsIGQsIGssIHMsIFRpKVwKLSAgdCA9IGEgKyBGKGIsYyxkKSArIFhba10gKyBUaTtcCi0gIGEgPSBST1RBVEVfTEVGVCh0LCBzKSArIGIKLSAgICAvKiBEbyB0aGUgZm9sbG93aW5nIDE2IG9wZXJhdGlvbnMuICovCi0gICAgU0VUKGEsIGIsIGMsIGQsICAwLCAgNywgIFQxKTsKLSAgICBTRVQoZCwgYSwgYiwgYywgIDEsIDEyLCAgVDIpOwotICAgIFNFVChjLCBkLCBhLCBiLCAgMiwgMTcsICBUMyk7Ci0gICAgU0VUKGIsIGMsIGQsIGEsICAzLCAyMiwgIFQ0KTsKLSAgICBTRVQoYSwgYiwgYywgZCwgIDQsICA3LCAgVDUpOwotICAgIFNFVChkLCBhLCBiLCBjLCAgNSwgMTIsICBUNik7Ci0gICAgU0VUKGMsIGQsIGEsIGIsICA2LCAxNywgIFQ3KTsKLSAgICBTRVQoYiwgYywgZCwgYSwgIDcsIDIyLCAgVDgpOwotICAgIFNFVChhLCBiLCBjLCBkLCAgOCwgIDcsICBUOSk7Ci0gICAgU0VUKGQsIGEsIGIsIGMsICA5LCAxMiwgVDEwKTsKLSAgICBTRVQoYywgZCwgYSwgYiwgMTAsIDE3LCBUMTEpOwotICAgIFNFVChiLCBjLCBkLCBhLCAxMSwgMjIsIFQxMik7Ci0gICAgU0VUKGEsIGIsIGMsIGQsIDEyLCAgNywgVDEzKTsKLSAgICBTRVQoZCwgYSwgYiwgYywgMTMsIDEyLCBUMTQpOwotICAgIFNFVChjLCBkLCBhLCBiLCAxNCwgMTcsIFQxNSk7Ci0gICAgU0VUKGIsIGMsIGQsIGEsIDE1LCAyMiwgVDE2KTsKLSN1bmRlZiBTRVQKLQotICAgICAvKiBSb3VuZCAyLiAqLwotICAgICAvKiBMZXQgW2FiY2QgayBzIGldIGRlbm90ZSB0aGUgb3BlcmF0aW9uCi0gICAgICAgICAgYSA9IGIgKyAoKGEgKyBHKGIsYyxkKSArIFhba10gKyBUW2ldKSA8PDwgcykuICovCi0jZGVmaW5lIEcoeCwgeSwgeikgKCgoeCkgJiAoeikpIHwgKCh5KSAmIH4oeikpKQotI2RlZmluZSBTRVQoYSwgYiwgYywgZCwgaywgcywgVGkpXAotICB0ID0gYSArIEcoYixjLGQpICsgWFtrXSArIFRpO1wKLSAgYSA9IFJPVEFURV9MRUZUKHQsIHMpICsgYgotICAgICAvKiBEbyB0aGUgZm9sbG93aW5nIDE2IG9wZXJhdGlvbnMuICovCi0gICAgU0VUKGEsIGIsIGMsIGQsICAxLCAgNSwgVDE3KTsKLSAgICBTRVQoZCwgYSwgYiwgYywgIDYsICA5LCBUMTgpOwotICAgIFNFVChjLCBkLCBhLCBiLCAxMSwgMTQsIFQxOSk7Ci0gICAgU0VUKGIsIGMsIGQsIGEsICAwLCAyMCwgVDIwKTsKLSAgICBTRVQoYSwgYiwgYywgZCwgIDUsICA1LCBUMjEpOwotICAgIFNFVChkLCBhLCBiLCBjLCAxMCwgIDksIFQyMik7Ci0gICAgU0VUKGMsIGQsIGEsIGIsIDE1LCAxNCwgVDIzKTsKLSAgICBTRVQoYiwgYywgZCwgYSwgIDQsIDIwLCBUMjQpOwotICAgIFNFVChhLCBiLCBjLCBkLCAgOSwgIDUsIFQyNSk7Ci0gICAgU0VUKGQsIGEsIGIsIGMsIDE0LCAgOSwgVDI2KTsKLSAgICBTRVQoYywgZCwgYSwgYiwgIDMsIDE0LCBUMjcpOwotICAgIFNFVChiLCBjLCBkLCBhLCAgOCwgMjAsIFQyOCk7Ci0gICAgU0VUKGEsIGIsIGMsIGQsIDEzLCAgNSwgVDI5KTsKLSAgICBTRVQoZCwgYSwgYiwgYywgIDIsICA5LCBUMzApOwotICAgIFNFVChjLCBkLCBhLCBiLCAgNywgMTQsIFQzMSk7Ci0gICAgU0VUKGIsIGMsIGQsIGEsIDEyLCAyMCwgVDMyKTsKLSN1bmRlZiBTRVQKLQotICAgICAvKiBSb3VuZCAzLiAqLwotICAgICAvKiBMZXQgW2FiY2QgayBzIHRdIGRlbm90ZSB0aGUgb3BlcmF0aW9uCi0gICAgICAgICAgYSA9IGIgKyAoKGEgKyBIKGIsYyxkKSArIFhba10gKyBUW2ldKSA8PDwgcykuICovCi0jZGVmaW5lIEgoeCwgeSwgeikgKCh4KSBeICh5KSBeICh6KSkKLSNkZWZpbmUgU0VUKGEsIGIsIGMsIGQsIGssIHMsIFRpKVwKLSAgdCA9IGEgKyBIKGIsYyxkKSArIFhba10gKyBUaTtcCi0gIGEgPSBST1RBVEVfTEVGVCh0LCBzKSArIGIKLSAgICAgLyogRG8gdGhlIGZvbGxvd2luZyAxNiBvcGVyYXRpb25zLiAqLwotICAgIFNFVChhLCBiLCBjLCBkLCAgNSwgIDQsIFQzMyk7Ci0gICAgU0VUKGQsIGEsIGIsIGMsICA4LCAxMSwgVDM0KTsKLSAgICBTRVQoYywgZCwgYSwgYiwgMTEsIDE2LCBUMzUpOwotICAgIFNFVChiLCBjLCBkLCBhLCAxNCwgMjMsIFQzNik7Ci0gICAgU0VUKGEsIGIsIGMsIGQsICAxLCAgNCwgVDM3KTsKLSAgICBTRVQoZCwgYSwgYiwgYywgIDQsIDExLCBUMzgpOwotICAgIFNFVChjLCBkLCBhLCBiLCAgNywgMTYsIFQzOSk7Ci0gICAgU0VUKGIsIGMsIGQsIGEsIDEwLCAyMywgVDQwKTsKLSAgICBTRVQoYSwgYiwgYywgZCwgMTMsICA0LCBUNDEpOwotICAgIFNFVChkLCBhLCBiLCBjLCAgMCwgMTEsIFQ0Mik7Ci0gICAgU0VUKGMsIGQsIGEsIGIsICAzLCAxNiwgVDQzKTsKLSAgICBTRVQoYiwgYywgZCwgYSwgIDYsIDIzLCBUNDQpOwotICAgIFNFVChhLCBiLCBjLCBkLCAgOSwgIDQsIFQ0NSk7Ci0gICAgU0VUKGQsIGEsIGIsIGMsIDEyLCAxMSwgVDQ2KTsKLSAgICBTRVQoYywgZCwgYSwgYiwgMTUsIDE2LCBUNDcpOwotICAgIFNFVChiLCBjLCBkLCBhLCAgMiwgMjMsIFQ0OCk7Ci0jdW5kZWYgU0VUCi0KLSAgICAgLyogUm91bmQgNC4gKi8KLSAgICAgLyogTGV0IFthYmNkIGsgcyB0XSBkZW5vdGUgdGhlIG9wZXJhdGlvbgotICAgICAgICAgIGEgPSBiICsgKChhICsgSShiLGMsZCkgKyBYW2tdICsgVFtpXSkgPDw8IHMpLiAqLwotI2RlZmluZSBJKHgsIHksIHopICgoeSkgXiAoKHgpIHwgfih6KSkpCi0jZGVmaW5lIFNFVChhLCBiLCBjLCBkLCBrLCBzLCBUaSlcCi0gIHQgPSBhICsgSShiLGMsZCkgKyBYW2tdICsgVGk7XAotICBhID0gUk9UQVRFX0xFRlQodCwgcykgKyBiCi0gICAgIC8qIERvIHRoZSBmb2xsb3dpbmcgMTYgb3BlcmF0aW9ucy4gKi8KLSAgICBTRVQoYSwgYiwgYywgZCwgIDAsICA2LCBUNDkpOwotICAgIFNFVChkLCBhLCBiLCBjLCAgNywgMTAsIFQ1MCk7Ci0gICAgU0VUKGMsIGQsIGEsIGIsIDE0LCAxNSwgVDUxKTsKLSAgICBTRVQoYiwgYywgZCwgYSwgIDUsIDIxLCBUNTIpOwotICAgIFNFVChhLCBiLCBjLCBkLCAxMiwgIDYsIFQ1Myk7Ci0gICAgU0VUKGQsIGEsIGIsIGMsICAzLCAxMCwgVDU0KTsKLSAgICBTRVQoYywgZCwgYSwgYiwgMTAsIDE1LCBUNTUpOwotICAgIFNFVChiLCBjLCBkLCBhLCAgMSwgMjEsIFQ1Nik7Ci0gICAgU0VUKGEsIGIsIGMsIGQsICA4LCAgNiwgVDU3KTsKLSAgICBTRVQoZCwgYSwgYiwgYywgMTUsIDEwLCBUNTgpOwotICAgIFNFVChjLCBkLCBhLCBiLCAgNiwgMTUsIFQ1OSk7Ci0gICAgU0VUKGIsIGMsIGQsIGEsIDEzLCAyMSwgVDYwKTsKLSAgICBTRVQoYSwgYiwgYywgZCwgIDQsICA2LCBUNjEpOwotICAgIFNFVChkLCBhLCBiLCBjLCAxMSwgMTAsIFQ2Mik7Ci0gICAgU0VUKGMsIGQsIGEsIGIsICAyLCAxNSwgVDYzKTsKLSAgICBTRVQoYiwgYywgZCwgYSwgIDksIDIxLCBUNjQpOwotI3VuZGVmIFNFVAotCi0gICAgIC8qIFRoZW4gcGVyZm9ybSB0aGUgZm9sbG93aW5nIGFkZGl0aW9ucy4gKFRoYXQgaXMgaW5jcmVtZW50IGVhY2gKLSAgICAgICAgb2YgdGhlIGZvdXIgcmVnaXN0ZXJzIGJ5IHRoZSB2YWx1ZSBpdCBoYWQgYmVmb3JlIHRoaXMgYmxvY2sKLSAgICAgICAgd2FzIHN0YXJ0ZWQuKSAqLwotICAgIHBtcy0+YWJjZFswXSArPSBhOwotICAgIHBtcy0+YWJjZFsxXSArPSBiOwotICAgIHBtcy0+YWJjZFsyXSArPSBjOwotICAgIHBtcy0+YWJjZFszXSArPSBkOwotfQotCi12b2lkCi1tZDVfaW5pdChtZDVfc3RhdGVfdCAqcG1zKQotewotICAgIHBtcy0+Y291bnRbMF0gPSBwbXMtPmNvdW50WzFdID0gMDsKLSAgICBwbXMtPmFiY2RbMF0gPSAweDY3NDUyMzAxOwotICAgIHBtcy0+YWJjZFsxXSA9IC8qMHhlZmNkYWI4OSovIFRfTUFTSyBeIDB4MTAzMjU0NzY7Ci0gICAgcG1zLT5hYmNkWzJdID0gLyoweDk4YmFkY2ZlKi8gVF9NQVNLIF4gMHg2NzQ1MjMwMTsKLSAgICBwbXMtPmFiY2RbM10gPSAweDEwMzI1NDc2OwotfQotCi12b2lkCi1tZDVfYXBwZW5kKG1kNV9zdGF0ZV90ICpwbXMsIGNvbnN0IG1kNV9ieXRlX3QgKmRhdGEsIGludCBuYnl0ZXMpCi17Ci0gICAgY29uc3QgbWQ1X2J5dGVfdCAqcCA9IGRhdGE7Ci0gICAgaW50IGxlZnQgPSBuYnl0ZXM7Ci0gICAgaW50IG9mZnNldCA9IChwbXMtPmNvdW50WzBdID4+IDMpICYgNjM7Ci0gICAgbWQ1X3dvcmRfdCBuYml0cyA9IChtZDVfd29yZF90KShuYnl0ZXMgPDwgMyk7Ci0KLSAgICBpZiAobmJ5dGVzIDw9IDApCi0JcmV0dXJuOwotCi0gICAgLyogVXBkYXRlIHRoZSBtZXNzYWdlIGxlbmd0aC4gKi8KLSAgICBwbXMtPmNvdW50WzFdICs9IG5ieXRlcyA+PiAyOTsKLSAgICBwbXMtPmNvdW50WzBdICs9IG5iaXRzOwotICAgIGlmIChwbXMtPmNvdW50WzBdIDwgbmJpdHMpCi0JcG1zLT5jb3VudFsxXSsrOwotCi0gICAgLyogUHJvY2VzcyBhbiBpbml0aWFsIHBhcnRpYWwgYmxvY2suICovCi0gICAgaWYgKG9mZnNldCkgewotCWludCBjb3B5ID0gKG9mZnNldCArIG5ieXRlcyA+IDY0ID8gNjQgLSBvZmZzZXQgOiBuYnl0ZXMpOwotCi0JbWVtY3B5KHBtcy0+YnVmICsgb2Zmc2V0LCBwLCBjb3B5KTsKLQlpZiAob2Zmc2V0ICsgY29weSA8IDY0KQotCSAgICByZXR1cm47Ci0JcCArPSBjb3B5OwotCWxlZnQgLT0gY29weTsKLQltZDVfcHJvY2VzcyhwbXMsIHBtcy0+YnVmKTsKLSAgICB9Ci0KLSAgICAvKiBQcm9jZXNzIGZ1bGwgYmxvY2tzLiAqLwotICAgIGZvciAoOyBsZWZ0ID49IDY0OyBwICs9IDY0LCBsZWZ0IC09IDY0KQotCW1kNV9wcm9jZXNzKHBtcywgcCk7Ci0KLSAgICAvKiBQcm9jZXNzIGEgZmluYWwgcGFydGlhbCBibG9jay4gKi8KLSAgICBpZiAobGVmdCkKLQltZW1jcHkocG1zLT5idWYsIHAsIGxlZnQpOwotfQotCi12b2lkCi1tZDVfZmluaXNoKG1kNV9zdGF0ZV90ICpwbXMsIG1kNV9ieXRlX3QgZGlnZXN0WzE2XSkKLXsKLSAgICBzdGF0aWMgY29uc3QgbWQ1X2J5dGVfdCBwYWRbNjRdID0gewotCTB4ODAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0JMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLQkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAKLSAgICB9OwotICAgIG1kNV9ieXRlX3QgZGF0YVs4XTsKLSAgICBpbnQgaTsKLQotICAgIC8qIFNhdmUgdGhlIGxlbmd0aCBiZWZvcmUgcGFkZGluZy4gKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgODsgKytpKQotCWRhdGFbaV0gPSAobWQ1X2J5dGVfdCkocG1zLT5jb3VudFtpID4+IDJdID4+ICgoaSAmIDMpIDw8IDMpKTsKLSAgICAvKiBQYWQgdG8gNTYgYnl0ZXMgbW9kIDY0LiAqLwotICAgIG1kNV9hcHBlbmQocG1zLCBwYWQsICgoNTUgLSAocG1zLT5jb3VudFswXSA+PiAzKSkgJiA2MykgKyAxKTsKLSAgICAvKiBBcHBlbmQgdGhlIGxlbmd0aC4gKi8KLSAgICBtZDVfYXBwZW5kKHBtcywgZGF0YSwgOCk7Ci0gICAgZm9yIChpID0gMDsgaSA8IDE2OyArK2kpCi0JZGlnZXN0W2ldID0gKG1kNV9ieXRlX3QpKHBtcy0+YWJjZFtpID4+IDJdID4+ICgoaSAmIDMpIDw8IDMpKTsKLX0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvbWQ1LmggYi9jb21waWxlci9jcHAvc3JjL21kNS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OThjOTk1Li4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvbWQ1LmgKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKgotICBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDIgQWxhZGRpbiBFbnRlcnByaXNlcy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKLSAgd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcwotICBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgotCi0gIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAotICBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0Ci0gIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKLQotICAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAotICAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQotICAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKLSAgICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KLSAgMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKLSAgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgotICAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgotCi0gIEwuIFBldGVyIERldXRzY2gKLSAgZ2hvc3RAYWxhZGRpbi5jb20KLQotICovCi0vKiAkSWQ6IG1kNS5oLHYgMS40IDIwMDIvMDQvMTMgMTk6MjA6MjggbHBkIEV4cCAkICovCi0vKgotICBJbmRlcGVuZGVudCBpbXBsZW1lbnRhdGlvbiBvZiBNRDUgKFJGQyAxMzIxKS4KLQotICBUaGlzIGNvZGUgaW1wbGVtZW50cyB0aGUgTUQ1IEFsZ29yaXRobSBkZWZpbmVkIGluIFJGQyAxMzIxLCB3aG9zZQotICB0ZXh0IGlzIGF2YWlsYWJsZSBhdAotCWh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzEzMjEudHh0Ci0gIFRoZSBjb2RlIGlzIGRlcml2ZWQgZnJvbSB0aGUgdGV4dCBvZiB0aGUgUkZDLCBpbmNsdWRpbmcgdGhlIHRlc3Qgc3VpdGUKLSAgKHNlY3Rpb24gQS41KSBidXQgZXhjbHVkaW5nIHRoZSByZXN0IG9mIEFwcGVuZGl4IEEuICBJdCBkb2VzIG5vdCBpbmNsdWRlCi0gIGFueSBjb2RlIG9yIGRvY3VtZW50YXRpb24gdGhhdCBpcyBpZGVudGlmaWVkIGluIHRoZSBSRkMgYXMgYmVpbmcKLSAgY29weXJpZ2h0ZWQuCi0KLSAgVGhlIG9yaWdpbmFsIGFuZCBwcmluY2lwYWwgYXV0aG9yIG9mIG1kNS5oIGlzIEwuIFBldGVyIERldXRzY2gKLSAgPGdob3N0QGFsYWRkaW4uY29tPi4gIE90aGVyIGF1dGhvcnMgYXJlIG5vdGVkIGluIHRoZSBjaGFuZ2UgaGlzdG9yeQotICB0aGF0IGZvbGxvd3MgKGluIHJldmVyc2UgY2hyb25vbG9naWNhbCBvcmRlcik6Ci0KLSAgMjAwMi0wNC0xMyBscGQgUmVtb3ZlZCBzdXBwb3J0IGZvciBub24tQU5TSSBjb21waWxlcnM7IHJlbW92ZWQKLQlyZWZlcmVuY2VzIHRvIEdob3N0c2NyaXB0OyBjbGFyaWZpZWQgZGVyaXZhdGlvbiBmcm9tIFJGQyAxMzIxOwotCW5vdyBoYW5kbGVzIGJ5dGUgb3JkZXIgZWl0aGVyIHN0YXRpY2FsbHkgb3IgZHluYW1pY2FsbHkuCi0gIDE5OTktMTEtMDQgbHBkIEVkaXRlZCBjb21tZW50cyBzbGlnaHRseSBmb3IgYXV0b21hdGljIFRPQyBleHRyYWN0aW9uLgotICAxOTk5LTEwLTE4IGxwZCBGaXhlZCB0eXBvIGluIGhlYWRlciBjb21tZW50IChhbnNpMmtuciByYXRoZXIgdGhhbiBtZDUpOwotCWFkZGVkIGNvbmRpdGlvbmFsaXphdGlvbiBmb3IgQysrIGNvbXBpbGF0aW9uIGZyb20gTWFydGluCi0JUHVyc2Noa2UgPHB1cnNjaGtlQGJubC5nb3Y+LgotICAxOTk5LTA1LTAzIGxwZCBPcmlnaW5hbCB2ZXJzaW9uLgotICovCi0KLSNpZm5kZWYgbWQ1X0lOQ0xVREVECi0jICBkZWZpbmUgbWQ1X0lOQ0xVREVECi0KLS8qCi0gKiBUaGlzIHBhY2thZ2Ugc3VwcG9ydHMgYm90aCBjb21waWxlLXRpbWUgYW5kIHJ1bi10aW1lIGRldGVybWluYXRpb24gb2YgQ1BVCi0gKiBieXRlIG9yZGVyLiAgSWYgQVJDSF9JU19CSUdfRU5ESUFOIGlzIGRlZmluZWQgYXMgMCwgdGhlIGNvZGUgd2lsbCBiZQotICogY29tcGlsZWQgdG8gcnVuIG9ubHkgb24gbGl0dGxlLWVuZGlhbiBDUFVzOyBpZiBBUkNIX0lTX0JJR19FTkRJQU4gaXMKLSAqIGRlZmluZWQgYXMgbm9uLXplcm8sIHRoZSBjb2RlIHdpbGwgYmUgY29tcGlsZWQgdG8gcnVuIG9ubHkgb24gYmlnLWVuZGlhbgotICogQ1BVczsgaWYgQVJDSF9JU19CSUdfRU5ESUFOIGlzIG5vdCBkZWZpbmVkLCB0aGUgY29kZSB3aWxsIGJlIGNvbXBpbGVkIHRvCi0gKiBydW4gb24gZWl0aGVyIGJpZy0gb3IgbGl0dGxlLWVuZGlhbiBDUFVzLCBidXQgd2lsbCBydW4gc2xpZ2h0bHkgbGVzcwotICogZWZmaWNpZW50bHkgb24gZWl0aGVyIG9uZSB0aGFuIGlmIEFSQ0hfSVNfQklHX0VORElBTiBpcyBkZWZpbmVkLgotICovCi0KLXR5cGVkZWYgdW5zaWduZWQgY2hhciBtZDVfYnl0ZV90OyAvKiA4LWJpdCBieXRlICovCi10eXBlZGVmIHVuc2lnbmVkIGludCBtZDVfd29yZF90OyAvKiAzMi1iaXQgd29yZCAqLwotCi0vKiBEZWZpbmUgdGhlIHN0YXRlIG9mIHRoZSBNRDUgQWxnb3JpdGhtLiAqLwotdHlwZWRlZiBzdHJ1Y3QgbWQ1X3N0YXRlX3MgewotICAgIG1kNV93b3JkX3QgY291bnRbMl07CS8qIG1lc3NhZ2UgbGVuZ3RoIGluIGJpdHMsIGxzdyBmaXJzdCAqLwotICAgIG1kNV93b3JkX3QgYWJjZFs0XTsJCS8qIGRpZ2VzdCBidWZmZXIgKi8KLSAgICBtZDVfYnl0ZV90IGJ1Zls2NF07CQkvKiBhY2N1bXVsYXRlIGJsb2NrICovCi19IG1kNV9zdGF0ZV90OwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgCi17Ci0jZW5kaWYKLQotLyogSW5pdGlhbGl6ZSB0aGUgYWxnb3JpdGhtLiAqLwotdm9pZCBtZDVfaW5pdChtZDVfc3RhdGVfdCAqcG1zKTsKLQotLyogQXBwZW5kIGEgc3RyaW5nIHRvIHRoZSBtZXNzYWdlLiAqLwotdm9pZCBtZDVfYXBwZW5kKG1kNV9zdGF0ZV90ICpwbXMsIGNvbnN0IG1kNV9ieXRlX3QgKmRhdGEsIGludCBuYnl0ZXMpOwotCi0vKiBGaW5pc2ggdGhlIG1lc3NhZ2UgYW5kIHJldHVybiB0aGUgZGlnZXN0LiAqLwotdm9pZCBtZDVfZmluaXNoKG1kNV9zdGF0ZV90ICpwbXMsIG1kNV9ieXRlX3QgZGlnZXN0WzE2XSk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfSAgLyogZW5kIGV4dGVybiAiQyIgKi8KLSNlbmRpZgotCi0jZW5kaWYgLyogbWQ1X0lOQ0xVREVEICovCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3BhcnNlLmNjIGIvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS9wYXJzZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGEwYzJjMC4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3BhcnNlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAidF90eXBlLmgiCi0jaW5jbHVkZSAidF90eXBlZGVmLmgiCi0KLSNpbmNsdWRlICJtZDUuaCIKLSNpbmNsdWRlICJtYWluLmgiCi0KLXZvaWQgdF90eXBlOjpnZW5lcmF0ZV9maW5nZXJwcmludCgpIHsKLSAgaWYgKCEgaGFzX2ZpbmdlcnByaW50KCkpIHsKLSAgICBwZGVidWcoImdlbmVyYXRpbmcgZmluZ2VycHJpbnQgZm9yICVzIiwgZ2V0X25hbWUoKS5jX3N0cigpKTsKLSAgICBzdGQ6OnN0cmluZyBtYXRlcmlhbCA9IGdldF9maW5nZXJwcmludF9tYXRlcmlhbCgpOwotICAgIG1kNV9zdGF0ZV90IGN0eDsKLSAgICBtZDVfaW5pdCgmY3R4KTsKLSAgICBtZDVfYXBwZW5kKCZjdHgsIChtZDVfYnl0ZV90KikobWF0ZXJpYWwuZGF0YSgpKSwgKGludCltYXRlcmlhbC5zaXplKCkpOwotICAgIG1kNV9maW5pc2goJmN0eCwgKG1kNV9ieXRlX3QqKWZpbmdlcnByaW50Xyk7Ci0gIH0KLX0KLQotdF90eXBlKiB0X3R5cGU6OmdldF90cnVlX3R5cGUoKSB7Ci0gIHRfdHlwZSogdHlwZSA9IHRoaXM7Ci0gIHdoaWxlICh0eXBlLT5pc190eXBlZGVmKCkpIHsKLSAgICB0eXBlID0gKCh0X3R5cGVkZWYqKXR5cGUpLT5nZXRfdHlwZSgpOwotICB9Ci0gIHJldHVybiB0eXBlOwotfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X2Jhc2VfdHlwZS5oIGIvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X2Jhc2VfdHlwZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzY3NzJiLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9iYXNlX3R5cGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgVF9CQVNFX1RZUEVfSAotI2RlZmluZSBUX0JBU0VfVFlQRV9ICi0KLSNpbmNsdWRlIDxjc3RkbGliPgotI2luY2x1ZGUgInRfdHlwZS5oIgotCi0vKioKLSAqIEEgdGhyaWZ0IGJhc2UgdHlwZSwgd2hpY2ggbXVzdCBiZSBvbmUgb2YgdGhlIGRlZmluZWQgZW51bWVyYXRlZCB0eXBlcyBpbnNpZGUKLSAqIHRoaXMgZGVmaW5pdGlvbi4KLSAqCi0gKi8KLWNsYXNzIHRfYmFzZV90eXBlIDogcHVibGljIHRfdHlwZSB7Ci0gcHVibGljOgotICAvKioKLSAgICogRW51bWVyYXRpb24gb2YgdGhyaWZ0IGJhc2UgdHlwZXMKLSAgICovCi0gIGVudW0gdF9iYXNlIHsKLSAgICBUWVBFX1ZPSUQsCi0gICAgVFlQRV9TVFJJTkcsCi0gICAgVFlQRV9CT09MLAotICAgIFRZUEVfQllURSwKLSAgICBUWVBFX0kxNiwKLSAgICBUWVBFX0kzMiwKLSAgICBUWVBFX0k2NCwKLSAgICBUWVBFX0RPVUJMRQotICB9OwotCi0gIHRfYmFzZV90eXBlKHN0ZDo6c3RyaW5nIG5hbWUsIHRfYmFzZSBiYXNlKSA6Ci0gICAgdF90eXBlKG5hbWUpLAotICAgIGJhc2VfKGJhc2UpLAotICAgIHN0cmluZ19saXN0XyhmYWxzZSksCi0gICAgYmluYXJ5XyhmYWxzZSksCi0gICAgc3RyaW5nX2VudW1fKGZhbHNlKXt9Ci0KLSAgdF9iYXNlIGdldF9iYXNlKCkgY29uc3QgewotICAgIHJldHVybiBiYXNlXzsKLSAgfQotCi0gIGJvb2wgaXNfdm9pZCgpIGNvbnN0IHsKLSAgICByZXR1cm4gYmFzZV8gPT0gVFlQRV9WT0lEOwotICB9Ci0KLSAgYm9vbCBpc19zdHJpbmcoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGJhc2VfID09IFRZUEVfU1RSSU5HOwotICB9Ci0KLSAgYm9vbCBpc19ib29sKCkgY29uc3QgewotICAgIHJldHVybiBiYXNlXyA9PSBUWVBFX0JPT0w7Ci0gIH0KLQotICB2b2lkIHNldF9zdHJpbmdfbGlzdChib29sIHZhbCkgewotICAgIHN0cmluZ19saXN0XyA9IHZhbDsKLSAgfQotCi0gIGJvb2wgaXNfc3RyaW5nX2xpc3QoKSBjb25zdCB7Ci0gICAgcmV0dXJuIChiYXNlXyA9PSBUWVBFX1NUUklORykgJiYgc3RyaW5nX2xpc3RfOwotICB9Ci0KLSAgdm9pZCBzZXRfYmluYXJ5KGJvb2wgdmFsKSB7Ci0gICAgYmluYXJ5XyA9IHZhbDsKLSAgfQotCi0gIGJvb2wgaXNfYmluYXJ5KCkgY29uc3QgewotICAgIHJldHVybiAoYmFzZV8gPT0gVFlQRV9TVFJJTkcpICYmIGJpbmFyeV87Ci0gIH0KLQotICB2b2lkIHNldF9zdHJpbmdfZW51bShib29sIHZhbCkgewotICAgIHN0cmluZ19lbnVtXyA9IHZhbDsKLSAgfQotCi0gIGJvb2wgaXNfc3RyaW5nX2VudW0oKSBjb25zdCB7Ci0gICAgcmV0dXJuIGJhc2VfID09IFRZUEVfU1RSSU5HICYmIHN0cmluZ19lbnVtXzsKLSAgfQotCi0gIHZvaWQgYWRkX3N0cmluZ19lbnVtX3ZhbChzdGQ6OnN0cmluZyB2YWwpIHsKLSAgICBzdHJpbmdfZW51bV92YWxzXy5wdXNoX2JhY2sodmFsKTsKLSAgfQotCi0gIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgZ2V0X3N0cmluZ19lbnVtX3ZhbHMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHN0cmluZ19lbnVtX3ZhbHNfOwotICB9Ci0KLSAgYm9vbCBpc19iYXNlX3R5cGUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldF9maW5nZXJwcmludF9tYXRlcmlhbCgpIGNvbnN0IHsKLSAgICBzdGQ6OnN0cmluZyBydiA9IHRfYmFzZV9uYW1lKGJhc2VfKTsKLSAgICBpZiAocnYgPT0gIih1bmtub3duKSIpIHsKLSAgICAgIHRocm93ICJCVUc6IENhbid0IGdldCBmaW5nZXJwcmludCBtYXRlcmlhbCBmb3IgdGhpcyBiYXNlIHR5cGUuIjsKLSAgICB9Ci0gICAgcmV0dXJuIHJ2OwotICB9Ci0KLSAgc3RhdGljIHN0ZDo6c3RyaW5nIHRfYmFzZV9uYW1lKHRfYmFzZSB0YmFzZSkgewotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgVFlQRV9WT0lEICAgOiByZXR1cm4gICAgICAidm9pZCI7IGJyZWFrOwotICAgICAgY2FzZSBUWVBFX1NUUklORyA6IHJldHVybiAgICAic3RyaW5nIjsgYnJlYWs7Ci0gICAgICBjYXNlIFRZUEVfQk9PTCAgIDogcmV0dXJuICAgICAgImJvb2wiOyBicmVhazsKLSAgICAgIGNhc2UgVFlQRV9CWVRFICAgOiByZXR1cm4gICAgICAiYnl0ZSI7IGJyZWFrOwotICAgICAgY2FzZSBUWVBFX0kxNiAgICA6IHJldHVybiAgICAgICAiaTE2IjsgYnJlYWs7Ci0gICAgICBjYXNlIFRZUEVfSTMyICAgIDogcmV0dXJuICAgICAgICJpMzIiOyBicmVhazsKLSAgICAgIGNhc2UgVFlQRV9JNjQgICAgOiByZXR1cm4gICAgICAgImk2NCI7IGJyZWFrOwotICAgICAgY2FzZSBUWVBFX0RPVUJMRSA6IHJldHVybiAgICAiZG91YmxlIjsgYnJlYWs7Ci0gICAgICBkZWZhdWx0ICAgICAgICAgIDogcmV0dXJuICIodW5rbm93bikiOyBicmVhazsKLSAgICB9Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHRfYmFzZSBiYXNlXzsKLQotICBib29sIHN0cmluZ19saXN0XzsKLSAgYm9vbCBiaW5hcnlfOwotICBib29sIHN0cmluZ19lbnVtXzsKLSAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHN0cmluZ19lbnVtX3ZhbHNfOwotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfY29uc3QuaCBiL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9jb25zdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmQ4MWJkLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9jb25zdC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFRfQ09OU1RfSAotI2RlZmluZSBUX0NPTlNUX0gKLQotI2luY2x1ZGUgInRfdHlwZS5oIgotI2luY2x1ZGUgInRfY29uc3RfdmFsdWUuaCIKLQotLyoqCi0gKiBBIGNvbnN0IGlzIGEgY29uc3RhbnQgdmFsdWUgZGVmaW5lZCBhY3Jvc3MgbGFuZ3VhZ2VzIHRoYXQgaGFzIGEgdHlwZSBhbmQKLSAqIGEgdmFsdWUuIFRoZSB0cmljayBoZXJlIGlzIHRoYXQgdGhlIGRlY2xhcmVkIHR5cGUgbWlnaHQgbm90IG1hdGNoIHRoZSB0eXBlCi0gKiBvZiB0aGUgdmFsdWUgb2JqZWN0LCBzaW5jZSB0aGF0IGlzIG5vdCBkZXRlcm1pbmVkIHVudGlsIGFmdGVyIHBhcnNpbmcgdGhlCi0gKiB3aG9sZSB0aGluZyBvdXQuCi0gKgotICovCi1jbGFzcyB0X2NvbnN0IDogcHVibGljIHRfZG9jIHsKLSBwdWJsaWM6Ci0gIHRfY29uc3QodF90eXBlKiB0eXBlLCBzdGQ6OnN0cmluZyBuYW1lLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgOgotICAgIHR5cGVfKHR5cGUpLAotICAgIG5hbWVfKG5hbWUpLAotICAgIHZhbHVlXyh2YWx1ZSkge30KLQotICB0X3R5cGUqIGdldF90eXBlKCkgY29uc3QgewotICAgIHJldHVybiB0eXBlXzsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIGdldF9uYW1lKCkgY29uc3QgewotICAgIHJldHVybiBuYW1lXzsKLSAgfQotCi0gIHRfY29uc3RfdmFsdWUqIGdldF92YWx1ZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gdmFsdWVfOwotICB9Ci0KLSBwcml2YXRlOgotICB0X3R5cGUqIHR5cGVfOwotICBzdGQ6OnN0cmluZyBuYW1lXzsKLSAgdF9jb25zdF92YWx1ZSogdmFsdWVfOwotfTsKLQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9jb25zdF92YWx1ZS5oIGIvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X2NvbnN0X3ZhbHVlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmNDIyYWUuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X2NvbnN0X3ZhbHVlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxODMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFRfQ09OU1RfVkFMVUVfSAotI2RlZmluZSBUX0NPTlNUX1ZBTFVFX0gKLQotI2luY2x1ZGUgInRfZW51bS5oIgotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi0vKioKLSAqIEEgY29uc3QgdmFsdWUgaXMgc29tZXRoaW5nIHBhcnNlZCB0aGF0IGNvdWxkIGJlIGEgbWFwLCBzZXQsIGxpc3QsIHN0cnVjdAotICogb3Igd2hhdGV2ZXIuCi0gKgotICovCi1jbGFzcyB0X2NvbnN0X3ZhbHVlIHsKLSBwdWJsaWM6Ci0KLSAgZW51bSB0X2NvbnN0X3ZhbHVlX3R5cGUgewotICAgIENWX0lOVEVHRVIsCi0gICAgQ1ZfRE9VQkxFLAotICAgIENWX1NUUklORywKLSAgICBDVl9NQVAsCi0gICAgQ1ZfTElTVCwKLSAgICBDVl9JREVOVElGSUVSCi0gIH07Ci0KLSAgdF9jb25zdF92YWx1ZSgpIHt9Ci0KLSAgdF9jb25zdF92YWx1ZShpbnQ2NF90IHZhbCkgewotICAgIHNldF9pbnRlZ2VyKHZhbCk7Ci0gIH0KLQotICB0X2NvbnN0X3ZhbHVlKHN0ZDo6c3RyaW5nIHZhbCkgewotICAgIHNldF9zdHJpbmcodmFsKTsKLSAgfQotCi0gIHZvaWQgc2V0X3N0cmluZyhzdGQ6OnN0cmluZyB2YWwpIHsKLSAgICB2YWxUeXBlXyA9IENWX1NUUklORzsKLSAgICBzdHJpbmdWYWxfID0gdmFsOwotICB9Ci0KLSAgc3RkOjpzdHJpbmcgZ2V0X3N0cmluZygpIGNvbnN0IHsKLSAgICByZXR1cm4gc3RyaW5nVmFsXzsKLSAgfQotCi0gIHZvaWQgc2V0X2ludGVnZXIoaW50NjRfdCB2YWwpIHsKLSAgICB2YWxUeXBlXyA9IENWX0lOVEVHRVI7Ci0gICAgaW50VmFsXyA9IHZhbDsKLSAgfQotCi0gIGludDY0X3QgZ2V0X2ludGVnZXIoKSBjb25zdCB7Ci0gICAgaWYgKHZhbFR5cGVfID09IENWX0lERU5USUZJRVIpIHsKLSAgICAgIGlmIChlbnVtXyA9PSBOVUxMKSB7Ci0gICAgICAgIHRocm93ICJoYXZlIGlkZW50aWZpZXIgXCIiICsgZ2V0X2lkZW50aWZpZXIoKSArICJcIiwgYnV0IHVuc2V0IGVudW0gb24gbGluZSEiOwotICAgICAgfQotICAgICAgc3RkOjpzdHJpbmcgaWRlbnRpZmllciA9IGdldF9pZGVudGlmaWVyKCk7Ci0gICAgICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIGRvdCA9IGlkZW50aWZpZXIucmZpbmQoJy4nKTsKLSAgICAgIGlmIChkb3QgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKLSAgICAgICAgaWRlbnRpZmllciA9IGlkZW50aWZpZXIuc3Vic3RyKGRvdCsxKTsKLSAgICAgIH0KLSAgICAgIHRfZW51bV92YWx1ZSogdmFsID0gZW51bV8tPmdldF9jb25zdGFudF9ieV9uYW1lKGlkZW50aWZpZXIpOwotICAgICAgaWYgKHZhbCA9PSBOVUxMKSB7Ci0gICAgICAgIHRocm93Ci0gICAgICAgICAgIlVuYWJsZSB0byBmaW5kIGVudW0gdmFsdWUgXCIiICsgaWRlbnRpZmllciArCi0gICAgICAgICAgIlwiIGluIGVudW0gXCIiICsgZW51bV8tPmdldF9uYW1lKCkgKyAiXCIiOwotICAgICAgfQotICAgICAgcmV0dXJuIHZhbC0+Z2V0X3ZhbHVlKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBpbnRWYWxfOwotICAgIH0KLSAgfQotCi0gIHZvaWQgc2V0X2RvdWJsZShkb3VibGUgdmFsKSB7Ci0gICAgdmFsVHlwZV8gPSBDVl9ET1VCTEU7Ci0gICAgZG91YmxlVmFsXyA9IHZhbDsKLSAgfQotCi0gIGRvdWJsZSBnZXRfZG91YmxlKCkgY29uc3QgewotICAgIHJldHVybiBkb3VibGVWYWxfOwotICB9Ci0KLSAgdm9pZCBzZXRfbWFwKCkgewotICAgIHZhbFR5cGVfID0gQ1ZfTUFQOwotICB9Ci0KLSAgdm9pZCBhZGRfbWFwKHRfY29uc3RfdmFsdWUqIGtleSwgdF9jb25zdF92YWx1ZSogdmFsKSB7Ci0gICAgbWFwVmFsX1trZXldID0gdmFsOwotICB9Ci0KLSAgY29uc3Qgc3RkOjptYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgZ2V0X21hcCgpIGNvbnN0IHsKLSAgICByZXR1cm4gbWFwVmFsXzsKLSAgfQotCi0gIHZvaWQgc2V0X2xpc3QoKSB7Ci0gICAgdmFsVHlwZV8gPSBDVl9MSVNUOwotICB9Ci0KLSAgdm9pZCBhZGRfbGlzdCh0X2NvbnN0X3ZhbHVlKiB2YWwpIHsKLSAgICBsaXN0VmFsXy5wdXNoX2JhY2sodmFsKTsKLSAgfQotCi0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgZ2V0X2xpc3QoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGxpc3RWYWxfOwotICB9Ci0KLSAgdm9pZCBzZXRfaWRlbnRpZmllcihzdGQ6OnN0cmluZyB2YWwpIHsKLSAgICB2YWxUeXBlXyA9IENWX0lERU5USUZJRVI7Ci0gICAgaWRlbnRpZmllclZhbF8gPSB2YWw7Ci0gIH0KLQotICBzdGQ6OnN0cmluZyBnZXRfaWRlbnRpZmllcigpIGNvbnN0IHsKLSAgICByZXR1cm4gaWRlbnRpZmllclZhbF87Ci0gIH0KLQotICBzdGQ6OnN0cmluZyBnZXRfaWRlbnRpZmllcl9uYW1lKCkgY29uc3QgewotICAgIHN0ZDo6c3RyaW5nIHJldCA9IGdldF9pZGVudGlmaWVyKCk7Ci0gICAgc2l6ZV90IHMgPSByZXQuZmluZCgnLicpOwotICAgIGlmIChzID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7Ci0gICAgICB0aHJvdyAiZXJyb3I6IGlkZW50aWZpZXIgIiArIHJldCArICIgaXMgdW5xdWFsaWZpZWQhIjsKLSAgICB9Ci0gICAgcmV0ID0gcmV0LnN1YnN0cihzKzEpOwotICAgIHMgPSByZXQuZmluZCgnLicpOwotICAgIGlmIChzICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7Ci0gICAgICByZXQgPSByZXQuc3Vic3RyKHMrMSk7Ci0gICAgfQotICAgIHJldHVybiByZXQ7Ci0gIH0KLQotICBzdGQ6OnN0cmluZyBnZXRfaWRlbnRpZmllcl93aXRoX3BhcmVudCgpIGNvbnN0IHsKLSAgICBzdGQ6OnN0cmluZyByZXQgPSBnZXRfaWRlbnRpZmllcigpOwotICAgIHNpemVfdCBzID0gcmV0LmZpbmQoJy4nKTsKLSAgICBpZiAocyA9PSBzdGQ6OnN0cmluZzo6bnBvcykgewotICAgICAgdGhyb3cgImVycm9yOiBpZGVudGlmaWVyICIgKyByZXQgKyAiIGlzIHVucXVhbGlmaWVkISI7Ci0gICAgfQotICAgIHNpemVfdCBzMiA9IHJldC5maW5kKCcuJywgcysxKTsKLSAgICBpZiAoczIgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKLSAgICAgIHJldCA9IHJldC5zdWJzdHIocysxKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJldDsKLSAgfQotCi0gIHZvaWQgc2V0X2VudW0odF9lbnVtKiB0ZW51bSkgewotICAgIGVudW1fID0gdGVudW07Ci0gIH0KLQotICB0X2NvbnN0X3ZhbHVlX3R5cGUgZ2V0X3R5cGUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHZhbFR5cGVfOwotICB9Ci0KLSBwcml2YXRlOgotICBzdGQ6Om1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+IG1hcFZhbF87Ci0gIHN0ZDo6dmVjdG9yPHRfY29uc3RfdmFsdWUqPiBsaXN0VmFsXzsKLSAgc3RkOjpzdHJpbmcgc3RyaW5nVmFsXzsKLSAgaW50NjRfdCBpbnRWYWxfOwotICBkb3VibGUgZG91YmxlVmFsXzsKLSAgc3RkOjpzdHJpbmcgaWRlbnRpZmllclZhbF87Ci0gIHRfZW51bSogZW51bV87Ci0KLSAgdF9jb25zdF92YWx1ZV90eXBlIHZhbFR5cGVfOwotCi19OwotCi0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X2NvbnRhaW5lci5oIGIvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X2NvbnRhaW5lci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzUzNDkzLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9jb250YWluZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBUX0NPTlRBSU5FUl9ICi0jZGVmaW5lIFRfQ09OVEFJTkVSX0gKLQotI2luY2x1ZGUgInRfdHlwZS5oIgotCi1jbGFzcyB0X2NvbnRhaW5lciA6IHB1YmxpYyB0X3R5cGUgewotIHB1YmxpYzoKLSAgdF9jb250YWluZXIoKSA6Ci0gICAgY3BwX25hbWVfKCksCi0gICAgaGFzX2NwcF9uYW1lXyhmYWxzZSkge30KLQotICB2aXJ0dWFsIH50X2NvbnRhaW5lcigpIHt9Ci0KLSAgdm9pZCBzZXRfY3BwX25hbWUoc3RkOjpzdHJpbmcgY3BwX25hbWUpIHsKLSAgICBjcHBfbmFtZV8gPSBjcHBfbmFtZTsKLSAgICBoYXNfY3BwX25hbWVfID0gdHJ1ZTsKLSAgfQotCi0gIGJvb2wgaGFzX2NwcF9uYW1lKCkgewotICAgIHJldHVybiBoYXNfY3BwX25hbWVfOwotICB9Ci0KLSAgc3RkOjpzdHJpbmcgZ2V0X2NwcF9uYW1lKCkgewotICAgIHJldHVybiBjcHBfbmFtZV87Ci0gIH0KLQotICBib29sIGlzX2NvbnRhaW5lcigpIGNvbnN0IHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgc3RkOjpzdHJpbmcgY3BwX25hbWVfOwotICBib29sIGhhc19jcHBfbmFtZV87Ci0KLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X2RvYy5oIGIvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X2RvYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzYzYjVhLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9kb2MuaAorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBUX0RPQ19ICi0jZGVmaW5lIFRfRE9DX0gKLQotI2luY2x1ZGUgImdsb2JhbHMuaCIKLSNpbmNsdWRlICJsb2dnaW5nLmgiCi0KLS8qKgotICogRG9jdW1lbnRhdGlvbiBzdHVicwotICoKLSAqLwotY2xhc3MgdF9kb2MgewotCi0gcHVibGljOgotICB0X2RvYygpIDogaGFzX2RvY18oZmFsc2UpIHt9Ci0KLSAgdm9pZCBzZXRfZG9jKGNvbnN0IHN0ZDo6c3RyaW5nJiBkb2MpIHsKLSAgICBkb2NfID0gZG9jOwotICAgIGhhc19kb2NfID0gdHJ1ZTsKLSAgICBpZiggKGdfcHJvZ3JhbV9kb2N0ZXh0X2xpbmVubyA9PSBnX2RvY3RleHRfbGluZW5vKSAmJiAgKGdfcHJvZ3JhbV9kb2N0ZXh0X3N0YXR1cyA9PSBTVElMTF9DQU5ESURBVEUpKSB7Ci0gICAgICBnX3Byb2dyYW1fZG9jdGV4dF9zdGF0dXMgPSBBTFJFQURZX1BST0NFU1NFRDsKLSAgICAgIHBkZWJ1ZygiJXMiLCJwcm9ncmFtIGRvY3RleHQgc2V0IHRvIEFMUkVBRFlfUFJPQ0VTU0VEIik7Ci0gICAgfQotICB9Ci0KLSAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldF9kb2MoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGRvY187Ci0gIH0KLQotICBib29sIGhhc19kb2MoKSB7Ci0gICAgcmV0dXJuIGhhc19kb2NfOwotICB9Ci0KLSBwcml2YXRlOgotICBzdGQ6OnN0cmluZyBkb2NfOwotICBib29sIGhhc19kb2NfOwotCi19OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9lbnVtLmggYi9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfZW51bS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGNiMjZlLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9lbnVtLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFRfRU5VTV9ICi0jZGVmaW5lIFRfRU5VTV9ICi0KLSNpbmNsdWRlICJ0X2VudW1fdmFsdWUuaCIKLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLS8qKgotICogQW4gZW51bWVyYXRlZCB0eXBlLiBBIGxpc3Qgb2YgY29uc3RhbnQgb2JqZWN0cyB3aXRoIGEgbmFtZSBmb3IgdGhlIHR5cGUuCi0gKgotICovCi1jbGFzcyB0X2VudW0gOiBwdWJsaWMgdF90eXBlIHsKLSBwdWJsaWM6Ci0gIHRfZW51bSh0X3Byb2dyYW0qIHByb2dyYW0pIDoKLSAgICB0X3R5cGUocHJvZ3JhbSkge30KLQotICB2b2lkIHNldF9uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSB7Ci0gICAgbmFtZV8gPSBuYW1lOwotICB9Ci0KLSAgdm9pZCBhcHBlbmQodF9lbnVtX3ZhbHVlKiBjb25zdGFudCkgewotICAgIGNvbnN0YW50c18ucHVzaF9iYWNrKGNvbnN0YW50KTsKLSAgfQotCi0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZW51bV92YWx1ZSo+JiBnZXRfY29uc3RhbnRzKCkgewotICAgIHJldHVybiBjb25zdGFudHNfOwotICB9Ci0KLSAgdF9lbnVtX3ZhbHVlKiBnZXRfY29uc3RhbnRfYnlfbmFtZShjb25zdCBzdGQ6OnN0cmluZyBuYW1lKSB7Ci0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4mIGVudW1fdmFsdWVzID0gZ2V0X2NvbnN0YW50cygpOwotICAgIHN0ZDo6dmVjdG9yPHRfZW51bV92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciBjX2l0ZXI7Ci0gICAgZm9yIChjX2l0ZXIgPSBlbnVtX3ZhbHVlcy5iZWdpbigpOyBjX2l0ZXIgIT0gZW51bV92YWx1ZXMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgICBpZiAoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpID09IG5hbWUpIHsKLSAgICAgICAgcmV0dXJuICpjX2l0ZXI7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgdF9lbnVtX3ZhbHVlKiBnZXRfY29uc3RhbnRfYnlfdmFsdWUoaW50NjRfdCB2YWx1ZSkgewotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZW51bV92YWx1ZSo+JiBlbnVtX3ZhbHVlcyA9IGdldF9jb25zdGFudHMoKTsKLSAgICBzdGQ6OnZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3IgY19pdGVyOwotICAgIGZvciAoY19pdGVyID0gZW51bV92YWx1ZXMuYmVnaW4oKTsgY19pdGVyICE9IGVudW1fdmFsdWVzLmVuZCgpOyArK2NfaXRlcikgewotICAgICAgaWYgKCgqY19pdGVyKS0+Z2V0X3ZhbHVlKCkgPT0gdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuICpjX2l0ZXI7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgdF9lbnVtX3ZhbHVlKiBnZXRfbWluX3ZhbHVlKCkgewotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZW51bV92YWx1ZSo+JiBlbnVtX3ZhbHVlcyA9IGdldF9jb25zdGFudHMoKTsKLSAgICBzdGQ6OnZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3IgY19pdGVyOwotICAgIHRfZW51bV92YWx1ZSogbWluX3ZhbHVlOwotICAgIGlmIChlbnVtX3ZhbHVlcy5zaXplKCkgPT0gMCkgewotICAgICAgbWluX3ZhbHVlID0gTlVMTDsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBpbnQgbWluX3ZhbHVlX3ZhbHVlOwotICAgICAgbWluX3ZhbHVlID0gZW51bV92YWx1ZXMuZnJvbnQoKTsKLSAgICAgIG1pbl92YWx1ZV92YWx1ZSA9IG1pbl92YWx1ZS0+Z2V0X3ZhbHVlKCk7Ci0gICAgICBmb3IgKGNfaXRlciA9IGVudW1fdmFsdWVzLmJlZ2luKCk7IGNfaXRlciAhPSBlbnVtX3ZhbHVlcy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICAgICAgaWYgKCgqY19pdGVyKS0+Z2V0X3ZhbHVlKCkgPCBtaW5fdmFsdWVfdmFsdWUpIHsKLSAgICAgICAgICBtaW5fdmFsdWUgPSAoKmNfaXRlcik7Ci0gICAgICAgICAgbWluX3ZhbHVlX3ZhbHVlID0gbWluX3ZhbHVlLT5nZXRfdmFsdWUoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbWluX3ZhbHVlOwotICB9Ci0KLSAgdF9lbnVtX3ZhbHVlKiBnZXRfbWF4X3ZhbHVlKCkgewotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZW51bV92YWx1ZSo+JiBlbnVtX3ZhbHVlcyA9IGdldF9jb25zdGFudHMoKTsKLSAgICBzdGQ6OnZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3IgY19pdGVyOwotICAgIHRfZW51bV92YWx1ZSogbWF4X3ZhbHVlOwotICAgIGlmIChlbnVtX3ZhbHVlcy5zaXplKCkgPT0gMCkgewotICAgICAgbWF4X3ZhbHVlID0gTlVMTDsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBpbnQgbWF4X3ZhbHVlX3ZhbHVlOwotICAgICAgbWF4X3ZhbHVlID0gZW51bV92YWx1ZXMuYmFjaygpOwotICAgICAgbWF4X3ZhbHVlX3ZhbHVlID0gbWF4X3ZhbHVlLT5nZXRfdmFsdWUoKTsKLSAgICAgIGZvciAoY19pdGVyID0gZW51bV92YWx1ZXMuYmVnaW4oKTsgY19pdGVyICE9IGVudW1fdmFsdWVzLmVuZCgpOyArK2NfaXRlcikgewotICAgICAgICBpZiAoKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSA+IG1heF92YWx1ZV92YWx1ZSkgewotICAgICAgICAgIG1heF92YWx1ZSA9ICgqY19pdGVyKTsKLSAgICAgICAgICBtYXhfdmFsdWVfdmFsdWUgPSBtYXhfdmFsdWUtPmdldF92YWx1ZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBtYXhfdmFsdWU7Ci0gIH0KLQotICBib29sIGlzX2VudW0oKSBjb25zdCB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldF9maW5nZXJwcmludF9tYXRlcmlhbCgpIGNvbnN0IHsKLSAgICByZXR1cm4gImVudW0iOwotICB9Ci0KLQotIHByaXZhdGU6Ci0gIHN0ZDo6dmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50c187Ci19OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9lbnVtX3ZhbHVlLmggYi9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfZW51bV92YWx1ZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjc5OGQ3Li4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9lbnVtX3ZhbHVlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgVF9FTlVNX1ZBTFVFX0gKLSNkZWZpbmUgVF9FTlVNX1ZBTFVFX0gKLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlICJ0X2RvYy5oIgotCi0vKioKLSAqIEEgY29uc3RhbnQuIFRoZXNlIGFyZSB1c2VkIGluc2lkZSBvZiBlbnVtIGRlZmluaXRpb25zLiBDb25zdGFudHMgYXJlIGp1c3QKLSAqIHN5bWJvbCBpZGVudGlmaWVycyB0aGF0IG1heSBvciBtYXkgbm90IGhhdmUgYW4gZXhwbGljaXQgdmFsdWUgYXNzb2NpYXRlZAotICogd2l0aCB0aGVtLgotICoKLSAqLwotY2xhc3MgdF9lbnVtX3ZhbHVlIDogcHVibGljIHRfZG9jIHsKLSBwdWJsaWM6Ci0gIHRfZW51bV92YWx1ZShzdGQ6OnN0cmluZyBuYW1lLCBpbnQgdmFsdWUpIDoKLSAgICBuYW1lXyhuYW1lKSwKLSAgICB2YWx1ZV8odmFsdWUpIHt9Ci0KLSAgfnRfZW51bV92YWx1ZSgpIHt9Ci0KLSAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldF9uYW1lKCkgY29uc3QgewotICAgIHJldHVybiBuYW1lXzsKLSAgfQotCi0gIGludCBnZXRfdmFsdWUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHZhbHVlXzsKLSAgfQotCi0gIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gYW5ub3RhdGlvbnNfOwotCi0gcHJpdmF0ZToKLSAgc3RkOjpzdHJpbmcgbmFtZV87Ci0gIGludCB2YWx1ZV87Ci19OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9maWVsZC5oIGIvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X2ZpZWxkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwNWZkZjMuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X2ZpZWxkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFRfRklFTERfSAotI2RlZmluZSBUX0ZJRUxEX0gKLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxzc3RyZWFtPgotCi0jaW5jbHVkZSAidF9kb2MuaCIKLQotLy8gRm9yd2FyZCBkZWNsYXJlIGZvciB4c2RfYXR0cnMKLWNsYXNzIHRfc3RydWN0OwotCi0vKioKLSAqIENsYXNzIHRvIHJlcHJlc2VudCBhIGZpZWxkIGluIGEgdGhyaWZ0IHN0cnVjdHVyZS4gQSBmaWVsZCBoYXMgYSBkYXRhIHR5cGUsCi0gKiBhIHN5bWJvbGljIG5hbWUsIGFuZCBhIG51bWVyaWMgaWRlbnRpZmllci4KLSAqCi0gKi8KLWNsYXNzIHRfZmllbGQgOiBwdWJsaWMgdF9kb2MgewotIHB1YmxpYzoKLSAgdF9maWVsZCh0X3R5cGUqIHR5cGUsIHN0ZDo6c3RyaW5nIG5hbWUpIDoKLSAgICB0eXBlXyh0eXBlKSwKLSAgICBuYW1lXyhuYW1lKSwKLSAgICBrZXlfKDApLAotICAgIHZhbHVlXyhOVUxMKSwKLSAgICB4c2Rfb3B0aW9uYWxfKGZhbHNlKSwKLSAgICB4c2RfbmlsbGFibGVfKGZhbHNlKSwKLSAgICB4c2RfYXR0cnNfKE5VTEwpLAotICAgIHJlZmVyZW5jZV8oZmFsc2UpIHt9Ci0KLSAgdF9maWVsZCh0X3R5cGUqIHR5cGUsIHN0ZDo6c3RyaW5nIG5hbWUsIGludDMyX3Qga2V5KSA6Ci0gICAgdHlwZV8odHlwZSksCi0gICAgbmFtZV8obmFtZSksCi0gICAga2V5XyhrZXkpLAotICAgIHJlcV8oVF9PUFRfSU5fUkVRX09VVCksCi0gICAgdmFsdWVfKE5VTEwpLAotICAgIHhzZF9vcHRpb25hbF8oZmFsc2UpLAotICAgIHhzZF9uaWxsYWJsZV8oZmFsc2UpLAotICAgIHhzZF9hdHRyc18oTlVMTCksCi0gICAgcmVmZXJlbmNlXyhmYWxzZSkge30KLQotICB+dF9maWVsZCgpIHt9Ci0KLSAgdF90eXBlKiBnZXRfdHlwZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gdHlwZV87Ci0gIH0KLQotICBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0X25hbWUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG5hbWVfOwotICB9Ci0KLSAgaW50MzJfdCBnZXRfa2V5KCkgY29uc3QgewotICAgIHJldHVybiBrZXlfOwotICB9Ci0KLSAgZW51bSBlX3JlcSB7Ci0gICAgVF9SRVFVSVJFRCwKLSAgICBUX09QVElPTkFMLAotICAgIFRfT1BUX0lOX1JFUV9PVVQKLSAgfTsKLQotICB2b2lkIHNldF9yZXEoZV9yZXEgcmVxKSB7Ci0gICAgcmVxXyA9IHJlcTsKLSAgfQotCi0gIGVfcmVxIGdldF9yZXEoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHJlcV87Ci0gIH0KLQotICB2b2lkIHNldF92YWx1ZSh0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgewotICAgIHZhbHVlXyA9IHZhbHVlOwotICB9Ci0KLSAgdF9jb25zdF92YWx1ZSogZ2V0X3ZhbHVlKCkgewotICAgIHJldHVybiB2YWx1ZV87Ci0gIH0KLQotICB2b2lkIHNldF94c2Rfb3B0aW9uYWwoYm9vbCB4c2Rfb3B0aW9uYWwpIHsKLSAgICB4c2Rfb3B0aW9uYWxfID0geHNkX29wdGlvbmFsOwotICB9Ci0KLSAgYm9vbCBnZXRfeHNkX29wdGlvbmFsKCkgY29uc3QgewotICAgIHJldHVybiB4c2Rfb3B0aW9uYWxfOwotICB9Ci0KLSAgdm9pZCBzZXRfeHNkX25pbGxhYmxlKGJvb2wgeHNkX25pbGxhYmxlKSB7Ci0gICAgeHNkX25pbGxhYmxlXyA9IHhzZF9uaWxsYWJsZTsKLSAgfQotCi0gIGJvb2wgZ2V0X3hzZF9uaWxsYWJsZSgpIGNvbnN0IHsKLSAgICByZXR1cm4geHNkX25pbGxhYmxlXzsKLSAgfQotCi0gIHZvaWQgc2V0X3hzZF9hdHRycyh0X3N0cnVjdCogeHNkX2F0dHJzKSB7Ci0gICAgeHNkX2F0dHJzXyA9IHhzZF9hdHRyczsKLSAgfQotCi0gIHRfc3RydWN0KiBnZXRfeHNkX2F0dHJzKCkgewotICAgIHJldHVybiB4c2RfYXR0cnNfOwotICB9Ci0KLSAgLy8gVGhpcyBpcyBub3QgdGhlIHNhbWUgZnVuY3Rpb24gYXMgdF90eXBlOjpnZXRfZmluZ2VycHJpbnRfbWF0ZXJpYWwsCi0gIC8vIGJ1dCBpdCBkb2VzIHRoZSBzYW1lIHRoaW5nLgotICBzdGQ6OnN0cmluZyBnZXRfZmluZ2VycHJpbnRfbWF0ZXJpYWwoKSBjb25zdCB7Ci0gICAgc3RkOjpvc3RyaW5nc3RyZWFtIGtleXN0bTsKLSAgICBrZXlzdG0gPDwga2V5XzsKLSAgICByZXR1cm4ga2V5c3RtLnN0cigpICsgIjoiICsKLSAgICAgICgocmVxXyA9PSBUX09QVElPTkFMKSA/ICJvcHQtIiA6ICIiKSArCi0gICAgICB0eXBlXy0+Z2V0X2ZpbmdlcnByaW50X21hdGVyaWFsKCk7Ci0gIH0KLQotICAvKioKLSAgICogQ29tcGFyYXRvciB0byBzb3J0IGZpZWxkcyBpbiBhc2NlbmRpbmcgb3JkZXIgYnkga2V5LgotICAgKiBNYWtlIHRoaXMgYSBmdW5jdG9yIGluc3RlYWQgb2YgYSBmdW5jdGlvbiB0byBoZWxwIEdDQyBpbmxpbmUgaXQuCi0gICAqIFRoZSBhcmd1bWVudHMgYXJlIChjb25zdCkgcmVmZXJlbmNlcyB0byBjb25zdCBwb2ludGVycyB0byBjb25zdCB0X2ZpZWxkcy4KLSAgICovCi0gIHN0cnVjdCBrZXlfY29tcGFyZSB7Ci0gICAgYm9vbCBvcGVyYXRvcigpKHRfZmllbGQgY29uc3QgKiBjb25zdCAmIGEsIHRfZmllbGQgY29uc3QgKiBjb25zdCAmIGIpIHsKLSAgICAgIHJldHVybiBhLT5nZXRfa2V5KCkgPCBiLT5nZXRfa2V5KCk7Ci0gICAgfQotICB9OwotCi0gIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gYW5ub3RhdGlvbnNfOwotCi0gIGJvb2wgZ2V0X3JlZmVyZW5jZSgpIHsKLSAgICByZXR1cm4gcmVmZXJlbmNlXzsKLSAgfQotCi0gIHZvaWQgc2V0X3JlZmVyZW5jZShib29sIHJlZmVyZW5jZSkgewotICAgIHJlZmVyZW5jZV8gPSByZWZlcmVuY2U7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHRfdHlwZSogdHlwZV87Ci0gIHN0ZDo6c3RyaW5nIG5hbWVfOwotICBpbnQzMl90IGtleV87Ci0gIGVfcmVxIHJlcV87Ci0gIHRfY29uc3RfdmFsdWUqIHZhbHVlXzsKLQotICBib29sIHhzZF9vcHRpb25hbF87Ci0gIGJvb2wgeHNkX25pbGxhYmxlXzsKLSAgdF9zdHJ1Y3QqIHhzZF9hdHRyc187Ci0gIGJvb2wgcmVmZXJlbmNlXzsKLX07Ci0KLS8qKgotICogQSBzaW1wbGUgc3RydWN0IGZvciB0aGUgcGFyc2VyIHRvIHVzZSB0byBzdG9yZSBhIGZpZWxkIElELCBhbmQgd2hldGhlciBvcgotICogbm90IGl0IHdhcyBzcGVjaWZpZWQgYnkgdGhlIHVzZXIgb3IgYXV0b21hdGljYWxseSBjaG9zZW4uCi0gKi8KLXN0cnVjdCB0X2ZpZWxkX2lkIHsKLSAgaW50MzJfdCB2YWx1ZTsKLSAgYm9vbCBhdXRvX2Fzc2lnbmVkOwotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfZnVuY3Rpb24uaCBiL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9mdW5jdGlvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZThjMmY2Li4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9mdW5jdGlvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBUX0ZVTkNUSU9OX0gKLSNkZWZpbmUgVF9GVU5DVElPTl9ICi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSAidF90eXBlLmgiCi0jaW5jbHVkZSAidF9zdHJ1Y3QuaCIKLSNpbmNsdWRlICJ0X2RvYy5oIgotCi0vKioKLSAqIFJlcHJlc2VudGF0aW9uIG9mIGEgZnVuY3Rpb24uIEtleSBwYXJ0cyBhcmUgcmV0dXJuIHR5cGUsIGZ1bmN0aW9uIG5hbWUsCi0gKiBvcHRpb25hbCBtb2RpZmllcnMsIGFuZCBhbiBhcmd1bWVudCBsaXN0LCB3aGljaCBpcyBpbXBsZW1lbnRlZCBhcyBhIHRocmlmdAotICogc3RydWN0LgotICoKLSAqLwotY2xhc3MgdF9mdW5jdGlvbiA6IHB1YmxpYyB0X2RvYyB7Ci0gcHVibGljOgotICB0X2Z1bmN0aW9uKHRfdHlwZSogcmV0dXJudHlwZSwKLSAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAotICAgICAgICAgICAgIHRfc3RydWN0KiBhcmdsaXN0LAotICAgICAgICAgICAgIGJvb2wgb25ld2F5PWZhbHNlKSA6Ci0gICAgcmV0dXJudHlwZV8ocmV0dXJudHlwZSksCi0gICAgbmFtZV8obmFtZSksCi0gICAgYXJnbGlzdF8oYXJnbGlzdCksCi0gICAgb25ld2F5XyhvbmV3YXkpIHsKLSAgICB4Y2VwdGlvbnNfID0gbmV3IHRfc3RydWN0KE5VTEwpOwotICAgIGlmIChvbmV3YXlfICYmICghIHJldHVybnR5cGVfLT5pc192b2lkKCkpKSB7Ci0gICAgICBwd2FybmluZygxLCAiT25ld2F5IG1ldGhvZHMgc2hvdWxkIHJldHVybiB2b2lkLlxuIik7Ci0gICAgfQotICB9Ci0KLSAgdF9mdW5jdGlvbih0X3R5cGUqIHJldHVybnR5cGUsCi0gICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKLSAgICAgICAgICAgICB0X3N0cnVjdCogYXJnbGlzdCwKLSAgICAgICAgICAgICB0X3N0cnVjdCogeGNlcHRpb25zLAotICAgICAgICAgICAgIGJvb2wgb25ld2F5PWZhbHNlKSA6Ci0gICAgcmV0dXJudHlwZV8ocmV0dXJudHlwZSksCi0gICAgbmFtZV8obmFtZSksCi0gICAgYXJnbGlzdF8oYXJnbGlzdCksCi0gICAgeGNlcHRpb25zXyh4Y2VwdGlvbnMpLAotICAgIG9uZXdheV8ob25ld2F5KQotICB7Ci0gICAgaWYgKG9uZXdheV8gJiYgIXhjZXB0aW9uc18tPmdldF9tZW1iZXJzKCkuZW1wdHkoKSkgewotICAgICAgdGhyb3cgc3RkOjpzdHJpbmcoIk9uZXdheSBtZXRob2RzIGNhbid0IHRocm93IGV4Y2VwdGlvbnMuIik7Ci0gICAgfQotICAgIGlmIChvbmV3YXlfICYmICghIHJldHVybnR5cGVfLT5pc192b2lkKCkpKSB7Ci0gICAgICBwd2FybmluZygxLCAiT25ld2F5IG1ldGhvZHMgc2hvdWxkIHJldHVybiB2b2lkLlxuIik7Ci0gICAgfQotICB9Ci0KLSAgfnRfZnVuY3Rpb24oKSB7fQotCi0gIHRfdHlwZSogZ2V0X3JldHVybnR5cGUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHJldHVybnR5cGVfOwotICB9Ci0KLSAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldF9uYW1lKCkgY29uc3QgewotICAgIHJldHVybiBuYW1lXzsKLSAgfQotCi0gIHRfc3RydWN0KiBnZXRfYXJnbGlzdCgpIGNvbnN0IHsKLSAgICByZXR1cm4gYXJnbGlzdF87Ci0gIH0KLQotICB0X3N0cnVjdCogZ2V0X3hjZXB0aW9ucygpIGNvbnN0IHsKLSAgICByZXR1cm4geGNlcHRpb25zXzsKLSAgfQotCi0gIGJvb2wgaXNfb25ld2F5KCkgY29uc3QgewotICAgIHJldHVybiBvbmV3YXlfOwotICB9Ci0KLSAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBhbm5vdGF0aW9uc187Ci0KLSBwcml2YXRlOgotICB0X3R5cGUqIHJldHVybnR5cGVfOwotICBzdGQ6OnN0cmluZyBuYW1lXzsKLSAgdF9zdHJ1Y3QqIGFyZ2xpc3RfOwotICB0X3N0cnVjdCogeGNlcHRpb25zXzsKLSAgYm9vbCBvbmV3YXlfOwotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfbGlzdC5oIGIvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X2xpc3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFhOTYyNS4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfbGlzdC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFRfTElTVF9ICi0jZGVmaW5lIFRfTElTVF9ICi0KLSNpbmNsdWRlICJ0X2NvbnRhaW5lci5oIgotCi0vKioKLSAqIEEgbGlzdCBpcyBhIGxpZ2h0d2VpZ2h0IGNvbnRhaW5lciB0eXBlIHRoYXQganVzdCB3cmFwcyBhbm90aGVyIGRhdGEgdHlwZS4KLSAqCi0gKi8KLWNsYXNzIHRfbGlzdCA6IHB1YmxpYyB0X2NvbnRhaW5lciB7Ci0gcHVibGljOgotICB0X2xpc3QodF90eXBlKiBlbGVtX3R5cGUpIDoKLSAgICBlbGVtX3R5cGVfKGVsZW1fdHlwZSkge30KLQotICB0X3R5cGUqIGdldF9lbGVtX3R5cGUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGVsZW1fdHlwZV87Ci0gIH0KLQotICBib29sIGlzX2xpc3QoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldF9maW5nZXJwcmludF9tYXRlcmlhbCgpIGNvbnN0IHsKLSAgICByZXR1cm4gImxpc3Q8IiArIGVsZW1fdHlwZV8tPmdldF9maW5nZXJwcmludF9tYXRlcmlhbCgpICsgIj4iOwotICB9Ci0KLSAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX2ZpbmdlcnByaW50KCkgewotICAgIHRfdHlwZTo6Z2VuZXJhdGVfZmluZ2VycHJpbnQoKTsKLSAgICBlbGVtX3R5cGVfLT5nZW5lcmF0ZV9maW5nZXJwcmludCgpOwotICB9Ci0KLSBwcml2YXRlOgotICB0X3R5cGUqIGVsZW1fdHlwZV87Ci19OwotCi0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X21hcC5oIGIvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X21hcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGUzNThmLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9tYXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBUX01BUF9ICi0jZGVmaW5lIFRfTUFQX0gKLQotI2luY2x1ZGUgInRfY29udGFpbmVyLmgiCi0KLS8qKgotICogQSBtYXAgaXMgYSBsaWdodHdlaWdodCBjb250YWluZXIgdHlwZSB0aGF0IGp1c3Qgd3JhcHMgYW5vdGhlciB0d28gZGF0YQotICogdHlwZXMuCi0gKgotICovCi1jbGFzcyB0X21hcCA6IHB1YmxpYyB0X2NvbnRhaW5lciB7Ci0gcHVibGljOgotICB0X21hcCh0X3R5cGUqIGtleV90eXBlLCB0X3R5cGUqIHZhbF90eXBlKSA6Ci0gICAga2V5X3R5cGVfKGtleV90eXBlKSwKLSAgICB2YWxfdHlwZV8odmFsX3R5cGUpIHt9Ci0KLSAgdF90eXBlKiBnZXRfa2V5X3R5cGUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGtleV90eXBlXzsKLSAgfQotCi0gIHRfdHlwZSogZ2V0X3ZhbF90eXBlKCkgY29uc3QgewotICAgIHJldHVybiB2YWxfdHlwZV87Ci0gIH0KLQotICBib29sIGlzX21hcCgpIGNvbnN0IHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0X2ZpbmdlcnByaW50X21hdGVyaWFsKCkgY29uc3QgewotICAgIHJldHVybiAibWFwPCIgKyBrZXlfdHlwZV8tPmdldF9maW5nZXJwcmludF9tYXRlcmlhbCgpICsKLSAgICAgICIsIiArIHZhbF90eXBlXy0+Z2V0X2ZpbmdlcnByaW50X21hdGVyaWFsKCkgKyAiPiI7Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfZmluZ2VycHJpbnQoKSB7Ci0gICAgdF90eXBlOjpnZW5lcmF0ZV9maW5nZXJwcmludCgpOwotICAgIGtleV90eXBlXy0+Z2VuZXJhdGVfZmluZ2VycHJpbnQoKTsKLSAgICB2YWxfdHlwZV8tPmdlbmVyYXRlX2ZpbmdlcnByaW50KCk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHRfdHlwZSoga2V5X3R5cGVfOwotICB0X3R5cGUqIHZhbF90eXBlXzsKLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X3Byb2dyYW0uaCBiL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9wcm9ncmFtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1MzZmODEuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X3Byb2dyYW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDM4MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgVF9QUk9HUkFNX0gKLSNkZWZpbmUgVF9QUk9HUkFNX0gKLQotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0vLyBGb3IgcHJvZ3JhbV9uYW1lKCkKLSNpbmNsdWRlICJtYWluLmgiCi0KLSNpbmNsdWRlICJ0X2RvYy5oIgotI2luY2x1ZGUgInRfc2NvcGUuaCIKLSNpbmNsdWRlICJ0X2Jhc2VfdHlwZS5oIgotI2luY2x1ZGUgInRfdHlwZWRlZi5oIgotI2luY2x1ZGUgInRfZW51bS5oIgotI2luY2x1ZGUgInRfY29uc3QuaCIKLSNpbmNsdWRlICJ0X3N0cnVjdC5oIgotI2luY2x1ZGUgInRfc2VydmljZS5oIgotI2luY2x1ZGUgInRfbGlzdC5oIgotI2luY2x1ZGUgInRfbWFwLmgiCi0jaW5jbHVkZSAidF9zZXQuaCIKLSNpbmNsdWRlICJnZW5lcmF0ZS90X2dlbmVyYXRvcl9yZWdpc3RyeS5oIgotLy8jaW5jbHVkZSAidF9kb2MuaCIKLQotLyoqCi0gKiBUb3AgbGV2ZWwgY2xhc3MgcmVwcmVzZW50aW5nIGFuIGVudGlyZSB0aHJpZnQgcHJvZ3JhbS4gQSBwcm9ncmFtIGNvbnNpc3RzCi0gKiBmdW5kYW1lbnRhbGx5IG9mIHRoZSBmb2xsb3dpbmc6Ci0gKgotICogICBUeXBlZGVmcwotICogICBFbnVtZXJhdGlvbnMKLSAqICAgQ29uc3RhbnRzCi0gKiAgIFN0cnVjdHMKLSAqICAgRXhjZXB0aW9ucwotICogICBTZXJ2aWNlcwotICoKLSAqIFRoZSBwcm9ncmFtIG1vZHVsZSBhbHNvIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9ucyBvZiB0aGUgYmFzZSB0eXBlcy4KLSAqCi0gKi8KLWNsYXNzIHRfcHJvZ3JhbSA6IHB1YmxpYyB0X2RvYyB7Ci0gcHVibGljOgotICB0X3Byb2dyYW0oc3RkOjpzdHJpbmcgcGF0aCwgc3RkOjpzdHJpbmcgbmFtZSkgOgotICAgIHBhdGhfKHBhdGgpLAotICAgIG5hbWVfKG5hbWUpLAotICAgIG91dF9wYXRoXygiLi8iKSwKLSAgICBvdXRfcGF0aF9pc19hYnNvbHV0ZV8oZmFsc2UpIHsKLSAgICBzY29wZV8gPSBuZXcgdF9zY29wZSgpOwotICB9Ci0KLSAgdF9wcm9ncmFtKHN0ZDo6c3RyaW5nIHBhdGgpIDoKLSAgICBwYXRoXyhwYXRoKSwKLSAgICBvdXRfcGF0aF8oIi4vIiksCi0gICAgb3V0X3BhdGhfaXNfYWJzb2x1dGVfKGZhbHNlKSB7Ci0gICAgbmFtZV8gPSBwcm9ncmFtX25hbWUocGF0aCk7Ci0gICAgc2NvcGVfID0gbmV3IHRfc2NvcGUoKTsKLSAgfQotCi0gIH50X3Byb2dyYW0oKQotICB7Ci0gICBpZihzY29wZV8pCi0gICB7Ci0gICAgIGRlbGV0ZSBzY29wZV87IAotICAgICBzY29wZV8gPSBOVUxMOyAKLSAgIH0KLSAgfSAKLQotICAvLyBQYXRoIGFjY2Vzc29yCi0gIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRfcGF0aCgpIGNvbnN0IHsgcmV0dXJuIHBhdGhfOyB9Ci0KLSAgLy8gT3V0cHV0IHBhdGggYWNjZXNzb3IKLSAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldF9vdXRfcGF0aCgpIGNvbnN0IHsgcmV0dXJuIG91dF9wYXRoXzsgfQotCi0gIC8vIENyZWF0ZSBnZW4tKiBkaXIgYWNjZXNzb3IKLSAgYm9vbCBpc19vdXRfcGF0aF9hYnNvbHV0ZSgpIGNvbnN0IHsgcmV0dXJuIG91dF9wYXRoX2lzX2Fic29sdXRlXzsgfQotCi0gIC8vIE5hbWUgYWNjZXNzb3IKLSAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldF9uYW1lKCkgY29uc3QgeyByZXR1cm4gbmFtZV87IH0KLQotICAvLyBOYW1lc3BhY2UKLSAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldF9uYW1lc3BhY2UoKSBjb25zdCB7IHJldHVybiBuYW1lc3BhY2VfOyB9Ci0KLSAgLy8gSW5jbHVkZSBwcmVmaXggYWNjZXNzb3IKLSAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldF9pbmNsdWRlX3ByZWZpeCgpIGNvbnN0IHsgcmV0dXJuIGluY2x1ZGVfcHJlZml4XzsgfQotCi0gIC8vIEFjY2Vzc29ycyBmb3IgcHJvZ3JhbSBlbGVtZW50cwotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X3R5cGVkZWYqPiYgZ2V0X3R5cGVkZWZzKCkgIGNvbnN0IHsgcmV0dXJuIHR5cGVkZWZzXzsgIH0KLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9lbnVtKj4mICAgIGdldF9lbnVtcygpICAgICBjb25zdCB7IHJldHVybiBlbnVtc187ICAgICB9Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfY29uc3QqPiYgICBnZXRfY29uc3RzKCkgICAgY29uc3QgeyByZXR1cm4gY29uc3RzXzsgICAgfQotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X3N0cnVjdCo+JiAgZ2V0X3N0cnVjdHMoKSAgIGNvbnN0IHsgcmV0dXJuIHN0cnVjdHNfOyAgIH0KLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9zdHJ1Y3QqPiYgIGdldF94Y2VwdGlvbnMoKSBjb25zdCB7IHJldHVybiB4Y2VwdGlvbnNfOyB9Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfc3RydWN0Kj4mICBnZXRfb2JqZWN0cygpICAgY29uc3QgeyByZXR1cm4gb2JqZWN0c187ICAgfQotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X3NlcnZpY2UqPiYgZ2V0X3NlcnZpY2VzKCkgIGNvbnN0IHsgcmV0dXJuIHNlcnZpY2VzXzsgIH0KLQotICAvLyBQcm9ncmFtIGVsZW1lbnRzCi0gIHZvaWQgYWRkX3R5cGVkZWYgICh0X3R5cGVkZWYqIHRkKSB7IHR5cGVkZWZzXy5wdXNoX2JhY2sodGQpOyAgfQotICB2b2lkIGFkZF9lbnVtICAgICAodF9lbnVtKiAgICB0ZSkgeyBlbnVtc18ucHVzaF9iYWNrKHRlKTsgICAgIH0KLSAgdm9pZCBhZGRfY29uc3QgICAgKHRfY29uc3QqICAgdGMpIHsgY29uc3RzXy5wdXNoX2JhY2sodGMpOyAgICB9Ci0gIHZvaWQgYWRkX3N0cnVjdCAgICh0X3N0cnVjdCogIHRzKSB7IG9iamVjdHNfLnB1c2hfYmFjayh0cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdHNfLnB1c2hfYmFjayh0cyk7ICAgfQotICB2b2lkIGFkZF94Y2VwdGlvbiAodF9zdHJ1Y3QqICB0eCkgeyBvYmplY3RzXy5wdXNoX2JhY2sodHgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2VwdGlvbnNfLnB1c2hfYmFjayh0eCk7IH0KLSAgdm9pZCBhZGRfc2VydmljZSAgKHRfc2VydmljZSogdHMpIHsgc2VydmljZXNfLnB1c2hfYmFjayh0cyk7ICB9Ci0KLSAgLy8gUHJvZ3JhbXMgdG8gaW5jbHVkZQotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X3Byb2dyYW0qPiYgZ2V0X2luY2x1ZGVzKCkgY29uc3QgeyByZXR1cm4gaW5jbHVkZXNfOyB9Ci0KLSAgdm9pZCBzZXRfb3V0X3BhdGgoc3RkOjpzdHJpbmcgb3V0X3BhdGgsIGJvb2wgb3V0X3BhdGhfaXNfYWJzb2x1dGUpIHsKLSAgICBvdXRfcGF0aF8gPSBvdXRfcGF0aDsKLSAgICBvdXRfcGF0aF9pc19hYnNvbHV0ZV8gPSBvdXRfcGF0aF9pc19hYnNvbHV0ZTsKLSAgICAvLyBFbnN1cmUgdGhhdCBpdCBlbmRzIHdpdGggYSB0cmFpbGluZyAnLycgKG9yICdcJyBmb3Igd2luZG93cyBtYWNoaW5lcykKLSAgICBjaGFyIGMgPSBvdXRfcGF0aF8uYXQob3V0X3BhdGhfLnNpemUoKSAtIDEpOwotICAgIGlmICghKGMgPT0gJy8nIHx8IGMgPT0gJ1xcJykpIHsKLSAgICAgIG91dF9wYXRoXy5wdXNoX2JhY2soJy8nKTsKLSAgICB9Ci0gIH0KLQotICAvLyBUeXBlbmFtZSBjb2xsaXNpb24gZGV0ZWN0aW9uCi0gIC8qKgotICAgKiBTZWFyY2ggZm9yIHR5cGVuYW1lIGNvbGxpc2lvbnMKLSAgICogQHBhcmFtIHQgICAgdGhlIHR5cGUgdG8gdGVzdCBmb3IgY29sbGlzaW9ucwotICAgKiBAcmV0dXJuICAgICB0cnVlIGlmIGEgY2VydGFpbiBjb2xsaXNpb24gd2FzIGZvdW5kLCBvdGhlcndpc2UgZmFsc2UKLSAgICovCi0gIGJvb2wgaXNfdW5pcXVlX3R5cGVuYW1lKHRfdHlwZSAqIHQpIHsKLSAgICBpbnQgb2NjdXJhbmNlcyA9IHByb2dyYW1fdHlwZW5hbWVfY291bnQodGhpcywgdCk7Ci0gICAgZm9yIChzdGQ6OnZlY3Rvcjx0X3Byb2dyYW0qPjo6aXRlcmF0b3IgaXQgPSBpbmNsdWRlc18uYmVnaW4oKTsKLSAgICAgICAgIGl0ICE9IGluY2x1ZGVzXy5lbmQoKTsgKytpdCkgewotICAgICAgb2NjdXJhbmNlcyArPSBwcm9ncmFtX3R5cGVuYW1lX2NvdW50KCppdCwgdCk7Ci0gICAgfQotICAgIHJldHVybiAwID09IG9jY3VyYW5jZXM7Ci0gIH0KLQotICAvKioKLSAgICogU2VhcmNoIGFsbCB0eXBlIGNvbGxlY3Rpb25zIGZvciBkdXBsaWNhdGUgdHlwZW5hbWVzCi0gICAqIEBwYXJhbSBwcm9nIHRoZSBwcm9ncmFtIHRvIHNlYXJjaAotICAgKiBAcGFyYW0gdCAgICB0aGUgdHlwZSB0byB0ZXN0IGZvciBjb2xsaXNpb25zCi0gICAqIEByZXR1cm4gICAgIHRoZSBudW1iZXIgb2YgY2VydGFpbiB0eXBlbmFtZSBjb2xsaXNpb25zCi0gICAqLwotICBpbnQgcHJvZ3JhbV90eXBlbmFtZV9jb3VudCh0X3Byb2dyYW0gKiBwcm9nLCB0X3R5cGUgKiB0KSB7Ci0gICAgaW50IG9jY3VyYW5jZXMgPSAwOwotICAgIG9jY3VyYW5jZXMgKz0gY29sbGVjdGlvbl90eXBlbmFtZV9jb3VudChwcm9nLCBwcm9nLT50eXBlZGVmc18sIHQpOwotICAgIG9jY3VyYW5jZXMgKz0gY29sbGVjdGlvbl90eXBlbmFtZV9jb3VudChwcm9nLCBwcm9nLT5lbnVtc18sIHQpOwotICAgIG9jY3VyYW5jZXMgKz0gY29sbGVjdGlvbl90eXBlbmFtZV9jb3VudChwcm9nLCBwcm9nLT5vYmplY3RzXywgdCk7Ci0gICAgb2NjdXJhbmNlcyArPSBjb2xsZWN0aW9uX3R5cGVuYW1lX2NvdW50KHByb2csIHByb2ctPnNlcnZpY2VzXywgdCk7Ci0gICAgcmV0dXJuIG9jY3VyYW5jZXM7Ci0gIH0KLQotICAvKioKLSAgICogU2VhcmNoIGEgdHlwZSBjb2xsZWN0aW9uIGZvciBkdXBsaWNhdGUgdHlwZW5hbWVzCi0gICAqIEBwYXJhbSBwcm9nICAgICAgICAgICAgdGhlIHByb2dyYW0gdG8gc2VhcmNoCi0gICAqIEBwYXJhbSB0eXBlX2NvbGxlY3Rpb24gdGhlIHR5cGUgY29sbGVjdGlvbiB0byBzZWFyY2gKLSAgICogQHBhcmFtIHQgICAgICAgICAgICAgICB0aGUgdHlwZSB0byB0ZXN0IGZvciBjb2xsaXNpb25zCi0gICAqIEByZXR1cm4gICAgICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjZXJ0YWluIHR5cGVuYW1lIGNvbGxpc2lvbnMKLSAgICovCi0gIHRlbXBsYXRlIDxjbGFzcyBUPgotICBpbnQgY29sbGVjdGlvbl90eXBlbmFtZV9jb3VudCh0X3Byb2dyYW0gKiBwcm9nLCBUIHR5cGVfY29sbGVjdGlvbiwgdF90eXBlICogdCkgewotICAgIGludCBvY2N1cmFuY2VzID0gMDsKLSAgICBmb3IgKHR5cGVuYW1lIFQ6Oml0ZXJhdG9yIGl0ID0gdHlwZV9jb2xsZWN0aW9uLmJlZ2luKCk7IGl0ICE9IHR5cGVfY29sbGVjdGlvbi5lbmQoKTsgKytpdCkKLSAgICAgIGlmICh0ICE9ICppdCAmJiAwID09IHQtPmdldF9uYW1lKCkuY29tcGFyZSgoKml0KS0+Z2V0X25hbWUoKSkgJiYgaXNfY29tbW9uX25hbWVzcGFjZShwcm9nLCB0KSkKLSAgICAgICAgKytvY2N1cmFuY2VzOwotICAgIHJldHVybiBvY2N1cmFuY2VzOwotICB9Ci0KLSAgLyoqCi0gICAqIERldGVybWluZSB3aGV0aGVyIGlkZW50aWNhbCB0eXBlbmFtZXMgd2lsbCBjb2xsaWRlIGJhc2VkIG9uIG5hbWVzcGFjZXMuCi0gICAqCi0gICAqIEJlY2F1c2Ugd2UgZG8gbm90IGtub3cgd2hpY2ggbGFuZ3VhZ2VzIHRoZSB1c2VyIHdpbGwgZ2VuZXJhdGUgY29kZSBmb3IsCi0gICAqIGNvbGxpc2lvbnMgd2l0aGluIHByb2dyYW1zIChJREwgZmlsZXMpIGhhdmluZyBuYW1lc3BhY2UgZGVjbGFyYXRpb25zIGNhbiBiZQotICAgKiBkaWZmaWN1bHQgdG8gZGV0ZXJtaW5lLiBPbmx5IGd1YXJhbnRlZWQgY29sbGlzaW9ucyByZXR1cm4gdHJ1ZSAoY2F1c2UgYW4gZXJyb3IpLgotICAgKiBQb3NzaWJsZSBjb2xsaXNpb25zIGludm9sdmluZyBleHBsaWNpdCBuYW1lc3BhY2UgZGVjbGFyYXRpb25zIHByb2R1Y2UgYSB3YXJuaW5nLgotICAgKiBPdGhlciBwb3NzaWJsZSBjb2xsaXNpb25zIGdvIHVucmVwb3J0ZWQuCi0gICAqIEBwYXJhbSBwcm9nIHRoZSBwcm9ncmFtIGNvbnRhaW5pbmcgdGhlIHByZWV4aXN0aW5nIHR5cGVuYW1lCi0gICAqIEBwYXJhbSB0ICAgIHRoZSB0eXBlIGNvbnRhaW5pbmcgdGhlIHR5cGVuYW1lIG1hdGNoCi0gICAqIEByZXR1cm4gICAgIHRydWUgaWYgYSBjb2xsaXNpb24gd2l0aGluIG5hbWVzcGFjZXMgaXMgZm91bmQsIG90aGVyd2lzZSBmYWxzZQotICAgKi8KLSAgYm9vbCBpc19jb21tb25fbmFtZXNwYWNlKHRfcHJvZ3JhbSAqIHByb2csIHRfdHlwZSAqIHQpIHsKLSAgICAvL0Nhc2UgMTogVHlwZW5hbWVzIGFyZSBpbiB0aGUgc2FtZSBwcm9ncmFtIFtjb2xsaXNpb25dCi0gICAgaWYgKHByb2cgPT0gdC0+Z2V0X3Byb2dyYW0oKSkgewotICAgICAgcHdhcm5pbmcoMSwgIkR1cGxpY2F0ZSB0eXBlbmFtZSAlcyBmb3VuZCBpbiAlcyIsCi0gICAgICAgICAgICAgICB0LT5nZXRfbmFtZSgpLmNfc3RyKCksIHQtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lKCkuY19zdHIoKSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvL0Nhc2UgMjogQm90aCBwcm9ncmFtcyBoYXZlIGlkZW50aWNhbCBuYW1lc3BhY2Ugc2NvcGUvbmFtZSBkZWNsYXJhdGlvbnMgW2NvbGxpc2lvbl0KLSAgICBib29sIG1hdGNoID0gdHJ1ZTsKLSAgICBmb3IgKHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46Oml0ZXJhdG9yIGl0ID0gcHJvZy0+bmFtZXNwYWNlc18uYmVnaW4oKTsKLSAgICAgICAgIGl0ICE9IHByb2ctPm5hbWVzcGFjZXNfLmVuZCgpOyArK2l0KSB7Ci0gICAgICBpZiAoMCA9PSBpdC0+c2Vjb25kLmNvbXBhcmUodC0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWVzcGFjZShpdC0+Zmlyc3QpKSkgewotICAgICAgICBwd2FybmluZygxLCAiRHVwbGljYXRlIHR5cGVuYW1lICVzIGZvdW5kIGluICVzLCVzLCVzIGFuZCAlcywlcywlcyBbZmlsZSxzY29wZSxuc10iLAotICAgICAgICAgICAgICAgICB0LT5nZXRfbmFtZSgpLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgIHQtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lKCkuY19zdHIoKSwgaXQtPmZpcnN0LmNfc3RyKCksIGl0LT5zZWNvbmQuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgcHJvZy0+Z2V0X25hbWUoKS5jX3N0cigpLCBpdC0+Zmlyc3QuY19zdHIoKSwgaXQtPnNlY29uZC5jX3N0cigpKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG1hdGNoID0gZmFsc2U7Ci0gICAgICB9Ci0gICAgfQotICAgIGZvciAoc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6aXRlcmF0b3IgaXQgPSB0LT5nZXRfcHJvZ3JhbSgpLT5uYW1lc3BhY2VzXy5iZWdpbigpOwotICAgICAgICAgaXQgIT0gdC0+Z2V0X3Byb2dyYW0oKS0+bmFtZXNwYWNlc18uZW5kKCk7ICsraXQpIHsKLSAgICAgIGlmICgwID09IGl0LT5zZWNvbmQuY29tcGFyZShwcm9nLT5nZXRfbmFtZXNwYWNlKGl0LT5maXJzdCkpKSB7Ci0gICAgICAgIHB3YXJuaW5nKDEsICJEdXBsaWNhdGUgdHlwZW5hbWUgJXMgZm91bmQgaW4gJXMsJXMsJXMgYW5kICVzLCVzLCVzIFtmaWxlLHNjb3BlLG5zXSIsCi0gICAgICAgICAgICAgICAgIHQtPmdldF9uYW1lKCkuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgdC0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWUoKS5jX3N0cigpLCBpdC0+Zmlyc3QuY19zdHIoKSwgaXQtPnNlY29uZC5jX3N0cigpLAotICAgICAgICAgICAgICAgICBwcm9nLT5nZXRfbmFtZSgpLmNfc3RyKCksIGl0LT5maXJzdC5jX3N0cigpLCBpdC0+c2Vjb25kLmNfc3RyKCkpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgbWF0Y2ggPSBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKDAgPT0gcHJvZy0+bmFtZXNwYWNlc18uc2l6ZSgpICYmIDAgPT0gdC0+Z2V0X3Byb2dyYW0oKS0+bmFtZXNwYWNlc18uc2l6ZSgpKSB7Ci0gICAgICBwd2FybmluZygxLCAiRHVwbGljYXRlIHR5cGVuYW1lICVzIGZvdW5kIGluICVzIGFuZCAlcyIsCi0gICAgICAgIHQtPmdldF9uYW1lKCkuY19zdHIoKSwgdC0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWUoKS5jX3N0cigpLCAgcHJvZy0+Z2V0X25hbWUoKS5jX3N0cigpKTsKLSAgICB9Ci0gICAgcmV0dXJuIG1hdGNoOwotICB9Ci0KLSAgLy8gU2NvcGluZyBhbmQgbmFtZXNwYWNpbmcKLSAgdm9pZCBzZXRfbmFtZXNwYWNlKHN0ZDo6c3RyaW5nIG5hbWUpIHsKLSAgICBuYW1lc3BhY2VfID0gbmFtZTsKLSAgfQotCi0gIC8vIFNjb3BlIGFjY2Vzc29yCi0gIHRfc2NvcGUqIHNjb3BlKCkgY29uc3QgewotICAgIHJldHVybiBzY29wZV87Ci0gIH0KLQotICAvLyBJbmNsdWRlcwotCi0gIHZvaWQgYWRkX2luY2x1ZGUoc3RkOjpzdHJpbmcgcGF0aCwgc3RkOjpzdHJpbmcgaW5jbHVkZV9zaXRlKSB7Ci0gICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gbmV3IHRfcHJvZ3JhbShwYXRoKTsKLQotICAgIC8vIGluY2x1ZGUgcHJlZml4IGZvciB0aGlzIHByb2dyYW0gaXMgdGhlIHNpdGUgYXQgd2hpY2ggaXQgd2FzIGluY2x1ZGVkCi0gICAgLy8gKG1pbnVzIHRoZSBmaWxlbmFtZSkKLSAgICBzdGQ6OnN0cmluZyBpbmNsdWRlX3ByZWZpeDsKLSAgICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIGxhc3Rfc2xhc2ggPSBzdGQ6OnN0cmluZzo6bnBvczsKLSAgICBpZiAoKGxhc3Rfc2xhc2ggPSBpbmNsdWRlX3NpdGUucmZpbmQoIi8iKSkgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKLSAgICAgIGluY2x1ZGVfcHJlZml4ID0gaW5jbHVkZV9zaXRlLnN1YnN0cigwLCBsYXN0X3NsYXNoKTsKLSAgICB9Ci0KLSAgICBwcm9ncmFtLT5zZXRfaW5jbHVkZV9wcmVmaXgoaW5jbHVkZV9wcmVmaXgpOwotICAgIGluY2x1ZGVzXy5wdXNoX2JhY2socHJvZ3JhbSk7Ci0gIH0KLQotICBzdGQ6OnZlY3Rvcjx0X3Byb2dyYW0qPiYgZ2V0X2luY2x1ZGVzKCkgewotICAgIHJldHVybiBpbmNsdWRlc187Ci0gIH0KLQotICB2b2lkIHNldF9pbmNsdWRlX3ByZWZpeChzdGQ6OnN0cmluZyBpbmNsdWRlX3ByZWZpeCkgewotICAgIGluY2x1ZGVfcHJlZml4XyA9IGluY2x1ZGVfcHJlZml4OwotCi0gICAgLy8gdGhpcyBpcyBpbnRlbmRlZCB0byBiZSBhIGRpcmVjdG9yeTsgYWRkIGEgdHJhaWxpbmcgc2xhc2ggaWYgbmVjZXNzYXJ5Ci0gICAgaW50IGxlbiA9IGluY2x1ZGVfcHJlZml4Xy5zaXplKCk7Ci0gICAgaWYgKGxlbiA+IDAgJiYgaW5jbHVkZV9wcmVmaXhfW2xlbiAtIDFdICE9ICcvJykgewotICAgICAgaW5jbHVkZV9wcmVmaXhfICs9ICcvJzsKLSAgICB9Ci0gIH0KLQotICAvLyBMYW5ndWFnZSBuZXV0cmFsIG5hbWVzcGFjZSAvIHBhY2thZ2luZwotICB2b2lkIHNldF9uYW1lc3BhY2Uoc3RkOjpzdHJpbmcgbGFuZ3VhZ2UsIHN0ZDo6c3RyaW5nIG5hbWVfc3BhY2UpIHsKLSAgICBpZiAobGFuZ3VhZ2UgIT0gIioiKSB7Ci0gICAgICBzaXplX3Qgc3ViX2luZGV4ID0gbGFuZ3VhZ2UuZmluZCgnLicpOwotICAgICAgc3RkOjpzdHJpbmcgYmFzZV9sYW5ndWFnZSA9IGxhbmd1YWdlLnN1YnN0cigwLCBzdWJfaW5kZXgpOwotICAgICAgc3RkOjpzdHJpbmcgc3ViX25hbWVzcGFjZTsKLQotICAgICAgaWYoYmFzZV9sYW5ndWFnZSA9PSAic21hbGx0YWxrIikgewotICAgICAgICBwd2FybmluZygxLCAiTmFtZXNwYWNlICdzbWFsbHRhbGsnIGlzIGRlcHJlY2F0ZWQuIFVzZSAnc3QnIGluc3RlYWQiKTsKLSAgICAgICAgYmFzZV9sYW5ndWFnZSA9ICJzdCI7Ci0gICAgICB9Ci0KLSAgICAgIHRfZ2VuZXJhdG9yX3JlZ2lzdHJ5OjpnZW5fbWFwX3QgbXlfY29weSA9IHRfZ2VuZXJhdG9yX3JlZ2lzdHJ5OjpnZXRfZ2VuZXJhdG9yX21hcCgpOwotCi0gICAgICB0X2dlbmVyYXRvcl9yZWdpc3RyeTo6Z2VuX21hcF90OjppdGVyYXRvciBpdDsKLSAgICAgIGl0PW15X2NvcHkuZmluZChiYXNlX2xhbmd1YWdlKTsKLQotICAgICAgaWYgKGl0ID09IG15X2NvcHkuZW5kKCkpIHsKLSAgICAgICAgc3RkOjpzdHJpbmcgd2FybmluZyA9ICJObyBnZW5lcmF0b3IgbmFtZWQgJyIgKyBiYXNlX2xhbmd1YWdlICsgIicgY291bGQgYmUgZm91bmQhIjsKLSAgICAgICAgcHdhcm5pbmcoMSwgd2FybmluZy5jX3N0cigpKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChzdWJfaW5kZXggIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKLSAgICAgICAgICBzdGQ6OnN0cmluZyBzdWJfbmFtZXNwYWNlID0gbGFuZ3VhZ2Uuc3Vic3RyKHN1Yl9pbmRleCsxKTsKLSAgICAgICAgICBpZiAoICEgaXQtPnNlY29uZC0+aXNfdmFsaWRfbmFtZXNwYWNlKHN1Yl9uYW1lc3BhY2UpKSB7Ci0gICAgICAgICAgICBzdGQ6OnN0cmluZyB3YXJuaW5nID0gYmFzZV9sYW5ndWFnZSArICIgZ2VuZXJhdG9yIGRvZXMgbm90IGFjY2VwdCAnIiArIHN1Yl9uYW1lc3BhY2UgKyAiJyBhcyBzdWItbmFtZXNwYWNlISI7Ci0gICAgICAgICAgICBwd2FybmluZygxLCB3YXJuaW5nLmNfc3RyKCkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIG5hbWVzcGFjZXNfW2xhbmd1YWdlXSA9IG5hbWVfc3BhY2U7Ci0gIH0KLQotICBzdGQ6OnN0cmluZyBnZXRfbmFtZXNwYWNlKHN0ZDo6c3RyaW5nIGxhbmd1YWdlKSBjb25zdCB7Ci0gICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKLSAgICBpZiAoKGl0ZXIgPSBuYW1lc3BhY2VzXy5maW5kKGxhbmd1YWdlKSkgIT0gbmFtZXNwYWNlc18uZW5kKCkgfHwKLSAgICAgICAgKGl0ZXIgPSBuYW1lc3BhY2VzXy5maW5kKCIqIiAgICAgKSkgIT0gbmFtZXNwYWNlc18uZW5kKCkpIHsKLSAgICAgIHJldHVybiBpdGVyLT5zZWNvbmQ7Ci0gICAgfQotICAgIHJldHVybiBzdGQ6OnN0cmluZygpOwotICB9Ci0KLSAgLy8gTGFuZ3VhZ2Ugc3BlY2lmaWMgbmFtZXNwYWNlIC8gcGFja2FnaW5nCi0KLSAgdm9pZCBhZGRfY3BwX2luY2x1ZGUoc3RkOjpzdHJpbmcgcGF0aCkgewotICAgIGNwcF9pbmNsdWRlc18ucHVzaF9iYWNrKHBhdGgpOwotICB9Ci0KLSAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBnZXRfY3BwX2luY2x1ZGVzKCkgewotICAgIHJldHVybiBjcHBfaW5jbHVkZXNfOwotICB9Ci0KLSAgdm9pZCBhZGRfY19pbmNsdWRlKHN0ZDo6c3RyaW5nIHBhdGgpIHsKLSAgICBjX2luY2x1ZGVzXy5wdXNoX2JhY2socGF0aCk7Ci0gIH0KLQotICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGdldF9jX2luY2x1ZGVzKCkgewotICAgIHJldHVybiBjX2luY2x1ZGVzXzsKLSAgfQotCi0gcHJpdmF0ZToKLQotICAvLyBGaWxlIHBhdGgKLSAgc3RkOjpzdHJpbmcgcGF0aF87Ci0KLSAgLy8gTmFtZQotICBzdGQ6OnN0cmluZyBuYW1lXzsKLQotICAvLyBPdXRwdXQgZGlyZWN0b3J5Ci0gIHN0ZDo6c3RyaW5nIG91dF9wYXRoXzsKLQotICAvLyBPdXRwdXQgZGlyZWN0b3J5IGlzIGFic29sdXRlIGxvY2F0aW9uIGZvciBnZW5lcmF0ZWQgc291cmNlIChubyBnZW4tKikKLSAgYm9vbCBvdXRfcGF0aF9pc19hYnNvbHV0ZV87Ci0KLSAgLy8gTmFtZXNwYWNlCi0gIHN0ZDo6c3RyaW5nIG5hbWVzcGFjZV87Ci0KLSAgLy8gSW5jbHVkZWQgcHJvZ3JhbXMKLSAgc3RkOjp2ZWN0b3I8dF9wcm9ncmFtKj4gaW5jbHVkZXNfOwotCi0gIC8vIEluY2x1ZGUgcHJlZml4IGZvciB0aGlzIHByb2dyYW0sIGlmIGFueQotICBzdGQ6OnN0cmluZyBpbmNsdWRlX3ByZWZpeF87Ci0KLSAgLy8gSWRlbnRpZmllciBsb29rdXAgc2NvcGUKLSAgdF9zY29wZSogc2NvcGVfOwotCi0gIC8vIENvbXBvbmVudHMgdG8gZ2VuZXJhdGUgY29kZSBmb3IKLSAgc3RkOjp2ZWN0b3I8dF90eXBlZGVmKj4gdHlwZWRlZnNfOwotICBzdGQ6OnZlY3Rvcjx0X2VudW0qPiAgICBlbnVtc187Ci0gIHN0ZDo6dmVjdG9yPHRfY29uc3QqPiAgIGNvbnN0c187Ci0gIHN0ZDo6dmVjdG9yPHRfc3RydWN0Kj4gIG9iamVjdHNfOwotICBzdGQ6OnZlY3Rvcjx0X3N0cnVjdCo+ICBzdHJ1Y3RzXzsKLSAgc3RkOjp2ZWN0b3I8dF9zdHJ1Y3QqPiAgeGNlcHRpb25zXzsKLSAgc3RkOjp2ZWN0b3I8dF9zZXJ2aWNlKj4gc2VydmljZXNfOwotCi0gIC8vIER5bmFtaWMgbmFtZXNwYWNlcwotICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IG5hbWVzcGFjZXNfOwotCi0gIC8vIEMrKyBleHRyYSBpbmNsdWRlcwotICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gY3BwX2luY2x1ZGVzXzsKLQotICAvLyBDIGV4dHJhIGluY2x1ZGVzCi0gIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBjX2luY2x1ZGVzXzsKLQotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3Rfc2NvcGUuaCBiL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9zY29wZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjE3YmY4Li4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9zY29wZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBUX1NDT1BFX0gKLSNkZWZpbmUgVF9TQ09QRV9ICi0KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0KLSNpbmNsdWRlICJ0X3R5cGUuaCIKLSNpbmNsdWRlICJ0X3NlcnZpY2UuaCIKLSNpbmNsdWRlICJ0X2NvbnN0LmgiCi0jaW5jbHVkZSAidF9jb25zdF92YWx1ZS5oIgotI2luY2x1ZGUgInRfYmFzZV90eXBlLmgiCi0jaW5jbHVkZSAidF9tYXAuaCIKLSNpbmNsdWRlICJ0X2xpc3QuaCIKLQotLyoqCi0gKiBUaGlzIHJlcHJlc2VudHMgYSB2YXJpYWJsZSBzY29wZSB1c2VkIGZvciBsb29raW5nIHVwIHByZWRlZmluZWQgdHlwZXMgYW5kCi0gKiBzZXJ2aWNlcy4gVHlwaWNhbGx5LCBhIHNjb3BlIGlzIGFzc29jaWF0ZWQgd2l0aCBhIHRfcHJvZ3JhbS4gU2NvcGVzIGFyZSBub3QKLSAqIHVzZWQgdG8gZGV0ZXJtaW5lIGNvZGUgZ2VuZXJhdGlvbiwgYnV0IHJhdGhlciB0byByZXNvbHZlIGlkZW50aWZpZXJzIGF0Ci0gKiBwYXJzZSB0aW1lLgotICoKLSAqLwotY2xhc3MgdF9zY29wZSB7Ci0gcHVibGljOgotICB0X3Njb3BlKCkge30KLQotICB2b2lkIGFkZF90eXBlKHN0ZDo6c3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSkgewotICAgIHR5cGVzX1tuYW1lXSA9IHR5cGU7Ci0gIH0KLQotICB0X3R5cGUqIGdldF90eXBlKHN0ZDo6c3RyaW5nIG5hbWUpIHsKLSAgICByZXR1cm4gdHlwZXNfW25hbWVdOwotICB9Ci0KLSAgdm9pZCBhZGRfc2VydmljZShzdGQ6OnN0cmluZyBuYW1lLCB0X3NlcnZpY2UqIHNlcnZpY2UpIHsKLSAgICBzZXJ2aWNlc19bbmFtZV0gPSBzZXJ2aWNlOwotICB9Ci0KLSAgdF9zZXJ2aWNlKiBnZXRfc2VydmljZShzdGQ6OnN0cmluZyBuYW1lKSB7Ci0gICAgcmV0dXJuIHNlcnZpY2VzX1tuYW1lXTsKLSAgfQotCi0gIHZvaWQgYWRkX2NvbnN0YW50KHN0ZDo6c3RyaW5nIG5hbWUsIHRfY29uc3QqIGNvbnN0YW50KSB7Ci0gICAgaWYgKGNvbnN0YW50c18uZmluZChuYW1lKSAhPSBjb25zdGFudHNfLmVuZCgpKSB7Ci0gICAgICB0aHJvdyAiRW51bSAiICsgbmFtZSArICIgaXMgYWxyZWFkeSBkZWZpbmVkISI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGNvbnN0YW50c19bbmFtZV0gPSBjb25zdGFudDsKLSAgICB9Ci0JCSAgIAotICB9Ci0KLSAgdF9jb25zdCogZ2V0X2NvbnN0YW50KHN0ZDo6c3RyaW5nIG5hbWUpIHsKLSAgICByZXR1cm4gY29uc3RhbnRzX1tuYW1lXTsKLSAgfQotCi0gIHZvaWQgcHJpbnQoKSB7Ci0gICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHRfdHlwZSo+OjppdGVyYXRvciBpdGVyOwotICAgIGZvciAoaXRlciA9IHR5cGVzXy5iZWdpbigpOyBpdGVyICE9IHR5cGVzXy5lbmQoKTsgKytpdGVyKSB7Ci0gICAgICBwcmludGYoIiVzID0+ICVzXG4iLAotICAgICAgICAgICAgIGl0ZXItPmZpcnN0LmNfc3RyKCksCi0gICAgICAgICAgICAgaXRlci0+c2Vjb25kLT5nZXRfbmFtZSgpLmNfc3RyKCkpOwotICAgIH0KLSAgfQotCi0gIHZvaWQgcmVzb2x2ZV9jb25zdF92YWx1ZSh0X2NvbnN0X3ZhbHVlKiBjb25zdF92YWwsIHRfdHlwZSogdHR5cGUpIHsKLSAgICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgICBjb25zdCBzdGQ6Om1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiBtYXAgPSBjb25zdF92YWwtPmdldF9tYXAoKTsKLSAgICAgIHN0ZDo6bWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICAgIGZvciAodl9pdGVyID0gbWFwLmJlZ2luKCk7IHZfaXRlciAhPSBtYXAuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICAgIHJlc29sdmVfY29uc3RfdmFsdWUodl9pdGVyLT5maXJzdCwgKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSk7Ci0gICAgICAgIHJlc29sdmVfY29uc3RfdmFsdWUodl9pdGVyLT5zZWNvbmQsICgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSB8fCB0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gY29uc3RfdmFsLT5nZXRfbGlzdCgpOwotICAgICAgc3RkOjp2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgICByZXNvbHZlX2NvbnN0X3ZhbHVlKCgqdl9pdGVyKSwgKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zdHJ1Y3QoKSkgewotICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QgPSAodF9zdHJ1Y3QqKXR0eXBlOwotICAgICAgY29uc3Qgc3RkOjptYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgbWFwID0gY29uc3RfdmFsLT5nZXRfbWFwKCk7Ci0gICAgICBzdGQ6Om1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgICBmb3IgKHZfaXRlciA9IG1hcC5iZWdpbigpOyB2X2l0ZXIgIT0gbWFwLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgICB0X2ZpZWxkKiBmaWVsZCA9IHRzdHJ1Y3QtPmdldF9maWVsZF9ieV9uYW1lKHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSk7Ci0gICAgICAgIGlmIChmaWVsZCA9PSBOVUxMKSB7Ci0gICAgICAgICAgdGhyb3cgIk5vIGZpZWxkIG5hbWVkIFwiIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSArICJcIiB3YXMgZm91bmQgaW4gc3RydWN0IG9mIHR5cGUgXCIiICsgdHN0cnVjdC0+Z2V0X25hbWUoKSArICJcIiI7Ci0gICAgICAgIH0KLSAgICAgICAgcmVzb2x2ZV9jb25zdF92YWx1ZSh2X2l0ZXItPnNlY29uZCwgZmllbGQtPmdldF90eXBlKCkpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAoY29uc3RfdmFsLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lERU5USUZJRVIpIHsKLSAgICAgIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICAgIGNvbnN0X3ZhbC0+c2V0X2VudW0oKHRfZW51bSopdHR5cGUpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgdF9jb25zdCogY29uc3RhbnQgPSBnZXRfY29uc3RhbnQoY29uc3RfdmFsLT5nZXRfaWRlbnRpZmllcigpKTsKLSAgICAgICAgaWYgKGNvbnN0YW50ID09IE5VTEwpIHsKLSAgICAgICAgICB0aHJvdyAiTm8gZW51bSB2YWx1ZSBvciBjb25zdGFudCBmb3VuZCBuYW1lZCBcIiIgKyBjb25zdF92YWwtPmdldF9pZGVudGlmaWVyKCkgKyAiXCIhIjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFJlc29sdmUgdHlwZWRlZnMgdG8gdGhlIHVuZGVybHlpbmcgdHlwZQotICAgICAgICB0X3R5cGUqIGNvbnN0X3R5cGUgPSBjb25zdGFudC0+Z2V0X3R5cGUoKS0+Z2V0X3RydWVfdHlwZSgpOwotCi0gICAgICAgIGlmIChjb25zdF90eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgICAgIHN3aXRjaCAoKCh0X2Jhc2VfdHlwZSopY29uc3RfdHlwZSktPmdldF9iYXNlKCkpIHsKLSAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgICAgICAgY29uc3RfdmFsLT5zZXRfaW50ZWdlcihjb25zdGFudC0+Z2V0X3ZhbHVlKCktPmdldF9pbnRlZ2VyKCkpOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICAgICAgICBjb25zdF92YWwtPnNldF9zdHJpbmcoY29uc3RhbnQtPmdldF92YWx1ZSgpLT5nZXRfc3RyaW5nKCkpOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICAgICAgICBjb25zdF92YWwtPnNldF9kb3VibGUoY29uc3RhbnQtPmdldF92YWx1ZSgpLT5nZXRfZG91YmxlKCkpOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgICAgICAgdGhyb3cgIkNvbnN0YW50cyBjYW5ub3QgYmUgb2YgdHlwZSBWT0lEIjsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoY29uc3RfdHlwZS0+aXNfbWFwKCkpIHsKLSAgICAgICAgICBjb25zdCBzdGQ6Om1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiBtYXAgPSBjb25zdGFudC0+Z2V0X3ZhbHVlKCktPmdldF9tYXAoKTsKLSAgICAgICAgICBzdGQ6Om1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0KLSAgICAgICAgICBjb25zdF92YWwtPnNldF9tYXAoKTsKLSAgICAgICAgICBmb3IgKHZfaXRlciA9IG1hcC5iZWdpbigpOyB2X2l0ZXIgIT0gbWFwLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgICAgICAgY29uc3RfdmFsLT5hZGRfbWFwKHZfaXRlci0+Zmlyc3QsIHZfaXRlci0+c2Vjb25kKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoY29uc3RfdHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSBjb25zdGFudC0+Z2V0X3ZhbHVlKCktPmdldF9saXN0KCk7Ci0gICAgICAgICAgc3RkOjp2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0KLSAgICAgICAgICBjb25zdF92YWwtPnNldF9saXN0KCk7Ci0gICAgICAgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgICAgICAgIGNvbnN0X3ZhbC0+YWRkX2xpc3QoKnZfaXRlcik7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICAvLyBlbnVtIGNvbnN0YW50IHdpdGggbm9uLWlkZW50aWZpZXIgdmFsdWUuIHNldCB0aGUgZW51bSBhbmQgZmluZCB0aGUKLSAgICAgIC8vIHZhbHVlJ3MgbmFtZS4KLSAgICAgIHRfZW51bSogdGVudW0gPSAodF9lbnVtKil0dHlwZTsKLSAgICAgIHRfZW51bV92YWx1ZSogZW51bV92YWx1ZSA9IHRlbnVtLT5nZXRfY29uc3RhbnRfYnlfdmFsdWUoY29uc3RfdmFsLT5nZXRfaW50ZWdlcigpKTsKLSAgICAgIGlmIChlbnVtX3ZhbHVlID09IE5VTEwpIHsKLSAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIHZhbHN0bTsKLSAgICAgICAgdmFsc3RtIDw8IGNvbnN0X3ZhbC0+Z2V0X2ludGVnZXIoKTsKLSAgICAgICAgdGhyb3cgIkNvdWxkbid0IGZpbmQgYSBuYW1lZCB2YWx1ZSBpbiBlbnVtICIgKyB0ZW51bS0+Z2V0X25hbWUoKSArICIgZm9yIHZhbHVlICIgKyB2YWxzdG0uc3RyKCk7Ci0gICAgICB9Ci0gICAgICBjb25zdF92YWwtPnNldF9pZGVudGlmaWVyKHRlbnVtLT5nZXRfbmFtZSgpICsgIi4iICsgZW51bV92YWx1ZS0+Z2V0X25hbWUoKSk7Ci0gICAgICBjb25zdF92YWwtPnNldF9lbnVtKHRlbnVtKTsKLSAgICB9Ci0gIH0KLQotIHByaXZhdGU6Ci0KLSAgLy8gTWFwIG9mIG5hbWVzIHRvIHR5cGVzCi0gIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCB0X3R5cGUqPiB0eXBlc187Ci0KLSAgLy8gTWFwIG9mIG5hbWVzIHRvIGNvbnN0YW50cwotICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgdF9jb25zdCo+IGNvbnN0YW50c187Ci0KLSAgLy8gTWFwIG9mIG5hbWVzIHRvIHNlcnZpY2VzCi0gIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCB0X3NlcnZpY2UqPiBzZXJ2aWNlc187Ci0KLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X3NlcnZpY2UuaCBiL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9zZXJ2aWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxZTY5MjQuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X3NlcnZpY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBUX1NFUlZJQ0VfSAotI2RlZmluZSBUX1NFUlZJQ0VfSAotCi0jaW5jbHVkZSAidF9mdW5jdGlvbi5oIgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotY2xhc3MgdF9wcm9ncmFtOwotCi0vKioKLSAqIEEgc2VydmljZSBjb25zaXN0cyBvZiBhIHNldCBvZiBmdW5jdGlvbnMuCi0gKgotICovCi1jbGFzcyB0X3NlcnZpY2UgOiBwdWJsaWMgdF90eXBlIHsKLSBwdWJsaWM6Ci0gIHRfc2VydmljZSh0X3Byb2dyYW0qIHByb2dyYW0pIDoKLSAgICB0X3R5cGUocHJvZ3JhbSksCi0gICAgZXh0ZW5kc18oTlVMTCkge30KLQotICBib29sIGlzX3NlcnZpY2UoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICB2b2lkIHNldF9leHRlbmRzKHRfc2VydmljZSogZXh0ZW5kcykgewotICAgIGV4dGVuZHNfID0gZXh0ZW5kczsKLSAgfQotCi0gIHZvaWQgYWRkX2Z1bmN0aW9uKHRfZnVuY3Rpb24qIGZ1bmMpIHsKLSAgICBzdGQ6OnZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7Ci0gICAgZm9yIChpdGVyID0gZnVuY3Rpb25zXy5iZWdpbigpOyBpdGVyICE9IGZ1bmN0aW9uc18uZW5kKCk7IGl0ZXIrKykgewotICAgICAgaWYgKGZ1bmMtPmdldF9uYW1lKCkgPT0gKCppdGVyKS0+Z2V0X25hbWUoKSkgewotICAgICAgICB0aHJvdyAiRnVuY3Rpb24gIiArIGZ1bmMtPmdldF9uYW1lKCkgKyAiIGlzIGFscmVhZHkgZGVmaW5lZCI7Ci0gICAgICB9Ci0gICAgfQotICAgIGZ1bmN0aW9uc18ucHVzaF9iYWNrKGZ1bmMpOwotICB9Ci0KLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9mdW5jdGlvbio+JiBnZXRfZnVuY3Rpb25zKCkgY29uc3QgewotICAgIHJldHVybiBmdW5jdGlvbnNfOwotICB9Ci0KLSAgdF9zZXJ2aWNlKiBnZXRfZXh0ZW5kcygpIHsKLSAgICByZXR1cm4gZXh0ZW5kc187Ci0gIH0KLQotICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldF9maW5nZXJwcmludF9tYXRlcmlhbCgpIGNvbnN0IHsKLSAgICAvLyBTZXJ2aWNlcyBzaG91bGQgbmV2ZXIgYmUgdXNlZCBpbiBmaW5nZXJwcmludHMuCi0gICAgdGhyb3cgIkJVRzogQ2FuJ3QgZ2V0IGZpbmdlcnByaW50IG1hdGVyaWFsIGZvciBzZXJ2aWNlLiI7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHN0ZDo6dmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnNfOwotICB0X3NlcnZpY2UqIGV4dGVuZHNfOwotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3Rfc2V0LmggYi9jb21waWxlci9jcHAvc3JjL3BhcnNlL3Rfc2V0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxOTgzNTcuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X3NldC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFRfU0VUX0gKLSNkZWZpbmUgVF9TRVRfSAotCi0jaW5jbHVkZSAidF9jb250YWluZXIuaCIKLQotLyoqCi0gKiBBIHNldCBpcyBhIGxpZ2h0d2VpZ2h0IGNvbnRhaW5lciB0eXBlIHRoYXQganVzdCB3cmFwcyBhbm90aGVyIGRhdGEgdHlwZS4KLSAqCi0gKi8KLWNsYXNzIHRfc2V0IDogcHVibGljIHRfY29udGFpbmVyIHsKLSBwdWJsaWM6Ci0gIHRfc2V0KHRfdHlwZSogZWxlbV90eXBlKSA6Ci0gICAgZWxlbV90eXBlXyhlbGVtX3R5cGUpIHt9Ci0KLSAgdF90eXBlKiBnZXRfZWxlbV90eXBlKCkgY29uc3QgewotICAgIHJldHVybiBlbGVtX3R5cGVfOwotICB9Ci0KLSAgYm9vbCBpc19zZXQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldF9maW5nZXJwcmludF9tYXRlcmlhbCgpIGNvbnN0IHsKLSAgICByZXR1cm4gInNldDwiICsgZWxlbV90eXBlXy0+Z2V0X2ZpbmdlcnByaW50X21hdGVyaWFsKCkgKyAiPiI7Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfZmluZ2VycHJpbnQoKSB7Ci0gICAgdF90eXBlOjpnZW5lcmF0ZV9maW5nZXJwcmludCgpOwotICAgIGVsZW1fdHlwZV8tPmdlbmVyYXRlX2ZpbmdlcnByaW50KCk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHRfdHlwZSogZWxlbV90eXBlXzsKLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X3N0cnVjdC5oIGIvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X3N0cnVjdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjFmNDJlLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9zdHJ1Y3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDE5NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgVF9TVFJVQ1RfSAotI2RlZmluZSBUX1NUUlVDVF9ICi0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8dmVjdG9yPgotI2luY2x1ZGUgPHV0aWxpdHk+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSAidF90eXBlLmgiCi0jaW5jbHVkZSAidF9maWVsZC5oIgotCi0vLyBGb3J3YXJkIGRlY2xhcmUgdGhhdCBwdXBweQotY2xhc3MgdF9wcm9ncmFtOwotCi0vKioKLSAqIEEgc3RydWN0IGlzIGEgY29udGFpbmVyIGZvciBhIHNldCBvZiBtZW1iZXIgZmllbGRzIHRoYXQgaGFzIGEgbmFtZS4gU3RydWN0cwotICogYXJlIGFsc28gdXNlZCB0byBpbXBsZW1lbnQgZXhjZXB0aW9uIHR5cGVzLgotICoKLSAqLwotY2xhc3MgdF9zdHJ1Y3QgOiBwdWJsaWMgdF90eXBlIHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgc3RkOjp2ZWN0b3I8dF9maWVsZCo+IG1lbWJlcnNfdHlwZTsKLQotICB0X3N0cnVjdCh0X3Byb2dyYW0qIHByb2dyYW0pIDoKLSAgICB0X3R5cGUocHJvZ3JhbSksCi0gICAgaXNfeGNlcHRpb25fKGZhbHNlKSwKLSAgICBpc191bmlvbl8oZmFsc2UpLAotICAgIG1lbWJlcnNfdmFsaWRhdGVkKGZhbHNlKSwKLSAgICBtZW1iZXJzX3dpdGhfdmFsdWUoMCksCi0gICAgeHNkX2FsbF8oZmFsc2UpIHt9Ci0KLSAgdF9zdHJ1Y3QodF9wcm9ncmFtKiBwcm9ncmFtLCBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgOgotICAgIHRfdHlwZShwcm9ncmFtLCBuYW1lKSwKLSAgICBpc194Y2VwdGlvbl8oZmFsc2UpLAotICAgIGlzX3VuaW9uXyhmYWxzZSksCi0gICAgbWVtYmVyc192YWxpZGF0ZWQoZmFsc2UpLAotICAgIG1lbWJlcnNfd2l0aF92YWx1ZSgwKSwKLSAgICB4c2RfYWxsXyhmYWxzZSkge30KLQotICB2b2lkIHNldF9uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSB7Ci0gICAgbmFtZV8gPSBuYW1lOwotICAgIHZhbGlkYXRlX3VuaW9uX21lbWJlcnMoKTsKLSAgfQotCi0gIHZvaWQgc2V0X3hjZXB0aW9uKGJvb2wgaXNfeGNlcHRpb24pIHsKLSAgICBpc194Y2VwdGlvbl8gPSBpc194Y2VwdGlvbjsKLSAgfQotCi0gIHZvaWQgdmFsaWRhdGVfdW5pb25fbWVtYmVyKCB0X2ZpZWxkICogZmllbGQpIHsKLSAgICBpZiggaXNfdW5pb25fICYmICghIG5hbWVfLmVtcHR5KCkpKSB7Ci0KLSAgICAgIC8vIHVuaW9ucyBjYW4ndCBoYXZlIHJlcXVpcmVkIGZpZWxkcwotICAgICAgaWYoIGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgewotICAgICAgICBwd2FybmluZyggIDEsICJSZXF1aXJlZCBmaWVsZCAlcyBvZiB1bmlvbiAlcyBzZXQgdG8gb3B0aW9uYWwuXG4iLCBmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLCBuYW1lXy5jX3N0cigpKTsKLSAgICAgICAgZmllbGQtPnNldF9yZXEoIHRfZmllbGQ6OlRfT1BUSU9OQUwpOwotICAgICAgfQotCi0gICAgICAvLyB1bmlvbnMgbWF5IGhhdmUgdXAgdG8gb25lIG1lbWJlciBkZWZhdWx0ZWQsIGJ1dCBub3QgbW9yZQotICAgICAgaWYoIGZpZWxkLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7Ci0gICAgICAgIGlmKCAxIDwgKyttZW1iZXJzX3dpdGhfdmFsdWUpIHsKLSAgICAgICAgICB0aHJvdyAiRXJyb3I6IEZpZWxkICIrZmllbGQtPmdldF9uYW1lKCkrIiBwcm92aWRlcyBhbm90aGVyIGRlZmF1bHQgdmFsdWUgZm9yIHVuaW9uICIrbmFtZV87Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gIH0KLQotICB2b2lkIHZhbGlkYXRlX3VuaW9uX21lbWJlcnMoKSB7Ci0gICAgaWYoIGlzX3VuaW9uXyAmJiAoISBuYW1lXy5lbXB0eSgpKSAmJiAoIW1lbWJlcnNfdmFsaWRhdGVkKSkgewotICAgICAgbWVtYmVyc190eXBlOjpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0gICAgICBmb3IgKG1faXRlciA9IG1lbWJlcnNfaW5faWRfb3JkZXJfLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzX2luX2lkX29yZGVyXy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgICAgdmFsaWRhdGVfdW5pb25fbWVtYmVyKCAqbV9pdGVyKTsKLSAgICAgIH0KLSAgICAgIG1lbWJlcnNfdmFsaWRhdGVkID0gdHJ1ZTsgICAgICAgICAgCi0gICAgfQotICB9Ci0KLSAgdm9pZCBzZXRfdW5pb24oYm9vbCBpc191bmlvbikgewotICAgIGlzX3VuaW9uXyA9IGlzX3VuaW9uOwotICAgIHZhbGlkYXRlX3VuaW9uX21lbWJlcnMoKTsKLSAgfQotCi0gIHZvaWQgc2V0X3hzZF9hbGwoYm9vbCB4c2RfYWxsKSB7Ci0gICAgeHNkX2FsbF8gPSB4c2RfYWxsOwotICB9Ci0KLSAgYm9vbCBnZXRfeHNkX2FsbCgpIGNvbnN0IHsKLSAgICByZXR1cm4geHNkX2FsbF87Ci0gIH0KLQotICBib29sIGFwcGVuZCh0X2ZpZWxkKiBlbGVtKSB7Ci0gICAgdHlwZWRlZiBtZW1iZXJzX3R5cGU6Oml0ZXJhdG9yIGl0ZXJfdHlwZTsKLSAgICBzdGQ6OnBhaXI8aXRlcl90eXBlLCBpdGVyX3R5cGU+IGJvdW5kcyA9IHN0ZDo6ZXF1YWxfcmFuZ2UoCi0gICAgICAgICAgICBtZW1iZXJzX2luX2lkX29yZGVyXy5iZWdpbigpLCBtZW1iZXJzX2luX2lkX29yZGVyXy5lbmQoKSwgZWxlbSwgdF9maWVsZDo6a2V5X2NvbXBhcmUoKQotICAgICAgICApOwotICAgIGlmIChib3VuZHMuZmlyc3QgIT0gYm91bmRzLnNlY29uZCkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAvLyByZXR1cm5zIGZhbHNlIHdoZW4gdGhlcmUgaXMgYSBjb25mbGljdCBvZiBmaWVsZCBuYW1lcwotICAgIGlmIChnZXRfZmllbGRfYnlfbmFtZShlbGVtLT5nZXRfbmFtZSgpKSAhPSBOVUxMKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7IAotICAgIH0KLSAgICBtZW1iZXJzXy5wdXNoX2JhY2soZWxlbSk7Ci0gICAgbWVtYmVyc19pbl9pZF9vcmRlcl8uaW5zZXJ0KGJvdW5kcy5zZWNvbmQsIGVsZW0pOwotICAgIHZhbGlkYXRlX3VuaW9uX21lbWJlciggZWxlbSk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBjb25zdCBtZW1iZXJzX3R5cGUmIGdldF9tZW1iZXJzKCkgewotICAgIHJldHVybiBtZW1iZXJzXzsKLSAgfQotCi0gIGNvbnN0IG1lbWJlcnNfdHlwZSYgZ2V0X3NvcnRlZF9tZW1iZXJzKCkgewotICAgIHJldHVybiBtZW1iZXJzX2luX2lkX29yZGVyXzsKLSAgfQotCi0gIGJvb2wgaXNfc3RydWN0KCkgY29uc3QgewotICAgIHJldHVybiAhaXNfeGNlcHRpb25fOwotICB9Ci0KLSAgYm9vbCBpc194Y2VwdGlvbigpIGNvbnN0IHsKLSAgICByZXR1cm4gaXNfeGNlcHRpb25fOwotICB9Ci0gIAotICBib29sIGlzX3VuaW9uKCkgY29uc3QgewotICAgIHJldHVybiBpc191bmlvbl87Ci0gIH0KLQotICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldF9maW5nZXJwcmludF9tYXRlcmlhbCgpIGNvbnN0IHsKLSAgICBzdGQ6OnN0cmluZyBydiA9ICJ7IjsKLSAgICBib29sIGRvX3Jlc2VydmUgPSAobWVtYmVyc19pbl9pZF9vcmRlcl8uc2l6ZSgpID4gMSk7Ci0gICAgc2l6ZV90IGVzdGltYXRpb24gPSAwOwotICAgIG1lbWJlcnNfdHlwZTo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotICAgIGZvciAobV9pdGVyID0gbWVtYmVyc19pbl9pZF9vcmRlcl8uYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnNfaW5faWRfb3JkZXJfLmVuZCgpOyArK21faXRlcikgewotICAgICAgcnYgKz0gKCptX2l0ZXIpLT5nZXRfZmluZ2VycHJpbnRfbWF0ZXJpYWwoKTsKLSAgICAgIHJ2ICs9ICI7IjsKLSAgICAgIAotICAgICAgaWYoIGRvX3Jlc2VydmUpIHsKLSAgICAgICAgZXN0aW1hdGlvbiA9IG1lbWJlcnNfaW5faWRfb3JkZXJfLnNpemUoKSAqIHJ2LnNpemUoKSArIDE2OwotICAgICAgICBydi5yZXNlcnZlKCBlc3RpbWF0aW9uKTsKLSAgICAgICAgZG9fcmVzZXJ2ZSA9IGZhbHNlOwotICAgICAgfQotICAgIH0KLSAgICBydiArPSAifSI7Ci0gICAgcmV0dXJuIHJ2OwotICB9Ci0KLSAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX2ZpbmdlcnByaW50KCkgewotICAgIHRfdHlwZTo6Z2VuZXJhdGVfZmluZ2VycHJpbnQoKTsKLSAgICBtZW1iZXJzX3R5cGU6OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnNfaW5faWRfb3JkZXJfLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzX2luX2lkX29yZGVyXy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgICgqbV9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2VuZXJhdGVfZmluZ2VycHJpbnQoKTsKLSAgICB9Ci0gIH0KLQotICB0X2ZpZWxkKiBnZXRfZmllbGRfYnlfbmFtZShzdGQ6OnN0cmluZyBmaWVsZF9uYW1lKSB7Ci0gICAgbWVtYmVyc190eXBlOjpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzX2luX2lkX29yZGVyXy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVyc19pbl9pZF9vcmRlcl8uZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfbmFtZSgpID09IGZpZWxkX25hbWUpIHsKLSAgICAgICAgcmV0dXJuICptX2l0ZXI7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSBwcml2YXRlOgotCi0gIG1lbWJlcnNfdHlwZSBtZW1iZXJzXzsKLSAgbWVtYmVyc190eXBlIG1lbWJlcnNfaW5faWRfb3JkZXJfOwotICBib29sIGlzX3hjZXB0aW9uXzsKLSAgYm9vbCBpc191bmlvbl87Ci0gIGJvb2wgbWVtYmVyc192YWxpZGF0ZWQ7Ci0gIGludCAgbWVtYmVyc193aXRoX3ZhbHVlOwotCi0gIGJvb2wgeHNkX2FsbF87Ci19OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF90eXBlLmggYi9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfdHlwZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODVmMmRhLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF90eXBlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFRfVFlQRV9ICi0jZGVmaW5lIFRfVFlQRV9ICi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPGNzdHJpbmc+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSAidF9kb2MuaCIKLQotY2xhc3MgdF9wcm9ncmFtOwotCi0vKioKLSAqIEdlbmVyaWMgcmVwcmVzZW50YXRpb24gb2YgYSB0aHJpZnQgdHlwZS4gVGhlc2Ugb2JqZWN0cyBhcmUgdXNlZCBieSB0aGUKLSAqIHBhcnNlciBtb2R1bGUgdG8gYnVpbGQgdXAgYSB0cmVlIG9mIG9iamVjdCB0aGF0IGFyZSBhbGwgZXhwbGljaXRseSB0eXBlZC4KLSAqIFRoZSBnZW5lcmljIHRfdHlwZSBjbGFzcyBleHBvcnRzIGEgdmFyaWV0eSBvZiB1c2VmdWwgbWV0aG9kcyB0aGF0IGFyZQotICogdXNlZCBieSB0aGUgY29kZSBnZW5lcmF0b3IgdG8gYnJhbmNoIGJhc2VkIHVwb24gZGlmZmVyZW50IGhhbmRsaW5nIGZvciB0aGUKLSAqIHZhcmlvdXMgdHlwZXMuCi0gKgotICovCi1jbGFzcyB0X3R5cGUgOiBwdWJsaWMgdF9kb2MgewotIHB1YmxpYzoKLSAgdmlydHVhbCB+dF90eXBlKCkge30KLQotICB2aXJ0dWFsIHZvaWQgc2V0X25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIHsKLSAgICBuYW1lXyA9IG5hbWU7Ci0gIH0KLQotICB2aXJ0dWFsIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRfbmFtZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gbmFtZV87Ci0gIH0KLQotICB2aXJ0dWFsIGJvb2wgaXNfdm9pZCgpICAgICAgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgdmlydHVhbCBib29sIGlzX2Jhc2VfdHlwZSgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gIHZpcnR1YWwgYm9vbCBpc19zdHJpbmcoKSAgICBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotICB2aXJ0dWFsIGJvb2wgaXNfYm9vbCgpICAgICAgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgdmlydHVhbCBib29sIGlzX3R5cGVkZWYoKSAgIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gIHZpcnR1YWwgYm9vbCBpc19lbnVtKCkgICAgICBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotICB2aXJ0dWFsIGJvb2wgaXNfc3RydWN0KCkgICAgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgdmlydHVhbCBib29sIGlzX3hjZXB0aW9uKCkgIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gIHZpcnR1YWwgYm9vbCBpc19jb250YWluZXIoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotICB2aXJ0dWFsIGJvb2wgaXNfbGlzdCgpICAgICAgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgdmlydHVhbCBib29sIGlzX3NldCgpICAgICAgIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gIHZpcnR1YWwgYm9vbCBpc19tYXAoKSAgICAgICBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotICB2aXJ0dWFsIGJvb2wgaXNfc2VydmljZSgpICAgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLQotICB0X3Byb2dyYW0qIGdldF9wcm9ncmFtKCkgewotICAgIHJldHVybiBwcm9ncmFtXzsKLSAgfQotCi0gIGNvbnN0IHRfcHJvZ3JhbSogZ2V0X3Byb2dyYW0oKSBjb25zdCB7Ci0gICAgcmV0dXJuIHByb2dyYW1fOwotICB9Ci0KLSAgdF90eXBlKiBnZXRfdHJ1ZV90eXBlKCk7Ci0KLSAgLy8gUmV0dXJuIGEgc3RyaW5nIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGlzIHR5cGUKLSAgLy8gZnJvbSBhbnkgb3RoZXIgdGhyaWZ0IHR5cGUgaW4gdGhlIHdvcmxkLCBhcyBmYXIgYXMKLSAgLy8gVERlbnNlUHJvdG9jb2wgaXMgY29uY2VybmVkLgotICAvLyBXZSBkb24ndCBjYWNoZSB0aGlzLCB3aGljaCBpcyBhIGxpdHRsZSBzbG9wcHksCi0gIC8vIGJ1dCB0aGUgY29tcGlsZXIgaXMgc28gZmFzdCB0aGF0IGl0IGRvZXNuJ3QgcmVhbGx5IG1hdHRlci4KLSAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXRfZmluZ2VycHJpbnRfbWF0ZXJpYWwoKSBjb25zdCA9IDA7Ci0KLSAgLy8gRmluZ2VycHJpbnQgc2hvdWxkIGNoYW5nZSB3aGVuZXZlciAoYW5kIG9ubHkgd2hlbikKLSAgLy8gdGhlIGVuY29kaW5nIHZpYSBURGVuc2VQcm90b2NvbCBjaGFuZ2VzLgotICBzdGF0aWMgY29uc3QgaW50IGZpbmdlcnByaW50X2xlbiA9IDE2OwotCi0gIC8vIENhbGwgdGhpcyBiZWZvcmUgdHJ5aW5nIGdldF8qX2ZpbmdlcnByaW50KCkuCi0gIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV9maW5nZXJwcmludCgpOwotCi0gIGJvb2wgaGFzX2ZpbmdlcnByaW50KCkgY29uc3QgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmluZ2VycHJpbnRfbGVuOyBpKyspIHsKLSAgICAgIGlmIChmaW5nZXJwcmludF9baV0gIT0gMCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgY29uc3QgdWludDhfdCogZ2V0X2JpbmFyeV9maW5nZXJwcmludCgpICB7Ci0gICAgaWYoISBoYXNfZmluZ2VycHJpbnQoKSkgIC8vIGxhenkgZmluZ2VycHJpbnQgZ2VuZXJhdGlvbiwgcmlnaHQgbm93IG9ubHkgdXNlZCB3aXRoIHRoZSBjKysgZ2VuZXJhdG9yCi0gICAgICBnZW5lcmF0ZV9maW5nZXJwcmludCgpOwotICAgIHJldHVybiBmaW5nZXJwcmludF87Ci0gIH0KLQotICBzdGQ6OnN0cmluZyBnZXRfYXNjaWlfZmluZ2VycHJpbnQoKSB7Ci0gICAgc3RkOjpzdHJpbmcgcnY7Ci0gICAgY29uc3QgdWludDhfdCogZnAgPSBnZXRfYmluYXJ5X2ZpbmdlcnByaW50KCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaW5nZXJwcmludF9sZW47IGkrKykgewotICAgICAgcnYgKz0gYnl0ZV90b19oZXgoZnBbaV0pOwotICAgIH0KLSAgICByZXR1cm4gcnY7Ci0gIH0KLQotICAvLyBUaGlzIGZ1bmN0aW9uIHdpbGwgYnJlYWsgKG1heWJlIGJhZGx5KSB1bmxlc3MgMCA8PSBudW0gPD0gMTYuCi0gIHN0YXRpYyBjaGFyIG55YmJsZV90b194ZGlnaXQoaW50IG51bSkgewotICAgIGlmIChudW0gPCAxMCkgewotICAgICAgcmV0dXJuICcwJyArIG51bTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuICdBJyArIG51bSAtIDEwOwotICAgIH0KLSAgfQotCi0gIHN0YXRpYyBzdGQ6OnN0cmluZyBieXRlX3RvX2hleCh1aW50OF90IGJ5dGUpIHsKLSAgICBzdGQ6OnN0cmluZyBydjsKLSAgICBydiArPSBueWJibGVfdG9feGRpZ2l0KGJ5dGUgPj4gNCk7Ci0gICAgcnYgKz0gbnliYmxlX3RvX3hkaWdpdChieXRlICYgMHgwZik7Ci0gICAgcmV0dXJuIHJ2OwotICB9Ci0KLSAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBhbm5vdGF0aW9uc187Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHRfdHlwZSgpIDoKLSAgICBwcm9ncmFtXyhOVUxMKQotICB7Ci0gICAgbWVtc2V0KGZpbmdlcnByaW50XywgMCwgc2l6ZW9mKGZpbmdlcnByaW50XykpOwotICB9Ci0KLSAgdF90eXBlKHRfcHJvZ3JhbSogcHJvZ3JhbSkgOgotICAgIHByb2dyYW1fKHByb2dyYW0pCi0gIHsKLSAgICBtZW1zZXQoZmluZ2VycHJpbnRfLCAwLCBzaXplb2YoZmluZ2VycHJpbnRfKSk7Ci0gIH0KLQotICB0X3R5cGUodF9wcm9ncmFtKiBwcm9ncmFtLCBzdGQ6OnN0cmluZyBuYW1lKSA6Ci0gICAgcHJvZ3JhbV8ocHJvZ3JhbSksCi0gICAgbmFtZV8obmFtZSkKLSAgewotICAgIG1lbXNldChmaW5nZXJwcmludF8sIDAsIHNpemVvZihmaW5nZXJwcmludF8pKTsKLSAgfQotCi0gIHRfdHlwZShzdGQ6OnN0cmluZyBuYW1lKSA6Ci0gICAgcHJvZ3JhbV8oTlVMTCksCi0gICAgbmFtZV8obmFtZSkKLSAgewotICAgIG1lbXNldChmaW5nZXJwcmludF8sIDAsIHNpemVvZihmaW5nZXJwcmludF8pKTsKLSAgfQotCi0gIHRfcHJvZ3JhbSogcHJvZ3JhbV87Ci0gIHN0ZDo6c3RyaW5nIG5hbWVfOwotCi0gIHVpbnQ4X3QgZmluZ2VycHJpbnRfW2ZpbmdlcnByaW50X2xlbl07Ci19OwotCi0KLS8qKgotICogUGxhY2Vob2xkZXIgc3RydWN0IGZvciByZXR1cm5pbmcgdGhlIGtleSBhbmQgdmFsdWUgb2YgYW4gYW5ub3RhdGlvbgotICogZHVyaW5nIHBhcnNpbmcuCi0gKi8KLXN0cnVjdCB0X2Fubm90YXRpb24gewotICBzdGQ6OnN0cmluZyBrZXk7Ci0gIHN0ZDo6c3RyaW5nIHZhbDsKLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X3R5cGVkZWYuY2MgYi9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfdHlwZWRlZi5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRiZTc0OS4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfdHlwZWRlZi5jYworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSNpbmNsdWRlIDxjc3RkaW8+Ci0KLSNpbmNsdWRlICJ0X3R5cGVkZWYuaCIKLSNpbmNsdWRlICJ0X3Byb2dyYW0uaCIKLQotdF90eXBlKiB0X3R5cGVkZWY6OmdldF90eXBlKCkgY29uc3QgewotICBpZiAodHlwZV8gPT0gTlVMTCkgewotICAgIHRfdHlwZSogdHlwZSA9IGdldF9wcm9ncmFtKCktPnNjb3BlKCktPmdldF90eXBlKHN5bWJvbGljXyk7Ci0gICAgaWYgKHR5cGUgPT0gTlVMTCkgewotICAgICAgcHJpbnRmKCJUeXBlIFwiJXNcIiBub3QgZGVmaW5lZFxuIiwgc3ltYm9saWNfLmNfc3RyKCkpOwotICAgICAgZXhpdCgxKTsKLSAgICB9Ci0gICAgcmV0dXJuIHR5cGU7Ci0gIH0KLSAgcmV0dXJuIHR5cGVfOwotfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X3R5cGVkZWYuaCBiL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF90eXBlZGVmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyYTc1NjcuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X3R5cGVkZWYuaAorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBUX1RZUEVERUZfSAotI2RlZmluZSBUX1RZUEVERUZfSAotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgInRfdHlwZS5oIgotCi0vKioKLSAqIEEgdHlwZWRlZiBpcyBhIG1hcHBpbmcgZnJvbSBhIHN5bWJvbGljIG5hbWUgdG8gYW5vdGhlciB0eXBlLiBJbiBkeW1hbmljYWxseQotICogdHlwZWQgbGFuZ3VhZ2VzIChpLmUuIHBocC9weXRob24pIHRoZSBjb2RlIGdlbmVyYXRvciBjYW4gYWN0dWFsbHkgdXN1YWxseQotICogaWdub3JlIHR5cGVkZWZzIGFuZCBqdXN0IHVzZSB0aGUgdW5kZXJseWluZyB0eXBlIGRpcmVjdGx5LCB0aG91Z2ggaW4gQysrCi0gKiB0aGUgc3ltYm9saWMgbmFtaW5nIGNhbiBiZSBxdWl0ZSB1c2VmdWwgZm9yIGNvZGUgY2xhcml0eS4KLSAqCi0gKi8KLWNsYXNzIHRfdHlwZWRlZiA6IHB1YmxpYyB0X3R5cGUgewotIHB1YmxpYzoKLSAgdF90eXBlZGVmKHRfcHJvZ3JhbSogcHJvZ3JhbSwgdF90eXBlKiB0eXBlLCBjb25zdCBzdGQ6OnN0cmluZyYgc3ltYm9saWMpIDoKLSAgICB0X3R5cGUocHJvZ3JhbSwgc3ltYm9saWMpLAotICAgIHR5cGVfKHR5cGUpLAotICAgIHN5bWJvbGljXyhzeW1ib2xpYyksCi0gICAgZm9yd2FyZF8oZmFsc2UpLAotICAgIHNlZW5fKGZhbHNlKSB7fQotCi0gIC8qKgotICAgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWQgdG8gcmVmZXIgdG8gYSB0eXBlIHRoYXQgaXMgbGF6aWx5Ci0gICAqIHJlc29sdmVkIGF0IGEgbGF0ZXIgdGltZSwgbGlrZSBmb3IgZm9yd2FyZCBkZWNsYXJhdGlvbnMgb3IKLSAgICogcmVjdXJzaXZlIHR5cGVzLgotICAgKi8KLSAgdF90eXBlZGVmKHRfcHJvZ3JhbSogcHJvZ3JhbSwgY29uc3Qgc3RkOjpzdHJpbmcmIHN5bWJvbGljLCBib29sIGZvcndhcmQpIDoKLSAgICB0X3R5cGUocHJvZ3JhbSwgc3ltYm9saWMpLAotICAgIHR5cGVfKE5VTEwpLAotICAgIHN5bWJvbGljXyhzeW1ib2xpYyksCi0gICAgZm9yd2FyZF8oZm9yd2FyZCksCi0gICAgc2Vlbl8oZmFsc2UpIHt9Ci0KLSAgfnRfdHlwZWRlZigpIHt9Ci0KLSAgdF90eXBlKiBnZXRfdHlwZSgpIGNvbnN0OwotCi0gIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRfc3ltYm9saWMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHN5bWJvbGljXzsKLSAgfQotCi0gIGJvb2wgaXNfZm9yd2FyZF90eXBlZGVmKCkgY29uc3QgewotICAgIHJldHVybiBmb3J3YXJkXzsKLSAgfQotCi0gIGJvb2wgaXNfdHlwZWRlZigpIGNvbnN0IHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0X2ZpbmdlcnByaW50X21hdGVyaWFsKCkgY29uc3QgewotICAgIGlmICghc2Vlbl8pIHsKLSAgICAgIHNlZW5fID0gdHJ1ZTsKLSAgICAgIHN0ZDo6c3RyaW5nIHJldCA9IGdldF90eXBlKCktPmdldF9maW5nZXJwcmludF9tYXRlcmlhbCgpOwotICAgICAgc2Vlbl8gPSBmYWxzZTsKLSAgICAgIHJldHVybiByZXQ7Ci0gICAgfSAKLSAgICByZXR1cm4gIiI7Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfZmluZ2VycHJpbnQoKSB7Ci0gICAgdF90eXBlOjpnZW5lcmF0ZV9maW5nZXJwcmludCgpOwotICAgIGlmICghZ2V0X3R5cGUoKS0+aGFzX2ZpbmdlcnByaW50KCkpIHsKLSAgICAgIGdldF90eXBlKCktPmdlbmVyYXRlX2ZpbmdlcnByaW50KCk7Ci0gICAgfQotICB9Ci0KLSBwcml2YXRlOgotICB0X3R5cGUqIHR5cGVfOwotICBzdGQ6OnN0cmluZyBzeW1ib2xpY187Ci0gIGJvb2wgZm9yd2FyZF87Ci0gIG11dGFibGUgYm9vbCBzZWVuXzsKLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9wbGF0Zm9ybS5oIGIvY29tcGlsZXIvY3BwL3NyYy9wbGF0Zm9ybS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2JlOWRiLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvcGxhdGZvcm0uaAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBkZWZpbmUgZm9yIG1rZGlyLHNpbmNlIHRoZSBtZXRob2Qgc2lnbmF0dXJlCi0gKiBpcyBkaWZmZXJlbnQgZm9yIHRoZSBub24tUE9TSVggTWluR1cKLSAqLwotCi0jaWZkZWYgX01TQ19WRVIKLSNpbmNsdWRlICJ3aW5kb3dzL2NvbmZpZy5oIgotI2VuZGlmCi0KLSNpZmRlZiBfV0lOMzIKLSNpbmNsdWRlIDxkaXJlY3QuaD4KLSNpbmNsdWRlIDxpby5oPgotI2Vsc2UKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2VuZGlmCi0KLSNpZmRlZiBfV0lOMzIKLSNkZWZpbmUgTUtESVIoeCkgbWtkaXIoeCkKLSNlbHNlCi0jZGVmaW5lIE1LRElSKHgpIG1rZGlyKHgsIFNfSVJXWFUgfCBTX0lSV1hHIHwgU19JUldYTykKLSNlbmRpZgotCi0jaWZkZWYgUEFUSF9NQVgKLSNkZWZpbmUgVEhSSUZUX1BBVEhfTUFYIFBBVEhfTUFYCi0jZWxzZQotI2RlZmluZSBUSFJJRlRfUEFUSF9NQVggTUFYX1BBVEgKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvYXVkaXQvdF9hdWRpdC5jcHAgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9hdWRpdC90X2F1ZGl0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjM5ZDYwCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvYXVkaXQvdF9hdWRpdC5jcHAKQEAgLTAsMCArMSw0NjQgQEAKKworI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisKKy8vIENhcmVmdWw6IG11c3QgaW5jbHVkZSBnbG9iYWxzIGZpcnN0IGZvciBleHRlcm4gZGVmaW5pdGlvbnMKKyNpbmNsdWRlICJ0aHJpZnQvZ2xvYmFscy5oIgorCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfcHJvZ3JhbS5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3Njb3BlLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfY29uc3QuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9maWVsZC5oIgorCisjaW5jbHVkZSAidGhyaWZ0L3ZlcnNpb24uaCIKKworI2luY2x1ZGUgInRocmlmdC9hdWRpdC90X2F1ZGl0LmgiCisKK2V4dGVybiBpbnQgZ193YXJuOworZXh0ZXJuIHN0ZDo6c3RyaW5nIGdfY3VycGF0aDsKK2V4dGVybiBib29sIGdfcmV0dXJuX2ZhaWx1cmU7CisKK3ZvaWQgdGhyaWZ0X2F1ZGl0X3dhcm5pbmcoaW50IGxldmVsLCBjb25zdCBjaGFyKiBmbXQsIC4uLikgeworICAgaWYgKGdfd2FybiA8IGxldmVsKSB7CisgICAgICByZXR1cm47CisgICB9CisgICB2YV9saXN0IGFyZ3M7CisgICBwcmludGYoIltUaHJpZnQgQXVkaXQgV2FybmluZzolc10gIiwgZ19jdXJwYXRoLmNfc3RyKCkpOworICAgdmFfc3RhcnQoYXJncywgZm10KTsKKyAgIHZwcmludGYoZm10LCBhcmdzKTsKKyAgIHZhX2VuZChhcmdzKTsKKyAgIHByaW50ZigiXG4iKTsKK30KKwordm9pZCB0aHJpZnRfYXVkaXRfZmFpbHVyZShjb25zdCBjaGFyKiBmbXQsIC4uLikgeworICB2YV9saXN0IGFyZ3M7CisgIGZwcmludGYoc3RkZXJyLCAiW1RocmlmdCBBdWRpdCBGYWlsdXJlOiVzXSAiLCBnX2N1cnBhdGguY19zdHIoKSk7CisgIHZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisgIHZmcHJpbnRmKHN0ZGVyciwgZm10LCBhcmdzKTsKKyAgdmFfZW5kKGFyZ3MpOworICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisgIGdfcmV0dXJuX2ZhaWx1cmUgPSB0cnVlOworfQorCit2b2lkIGNvbXBhcmVfbmFtZXNwYWNlKHRfcHJvZ3JhbSogbmV3UHJvZ3JhbSwgdF9wcm9ncmFtKiBvbGRQcm9ncmFtKQoreworICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgbmV3TmFtZXNwYWNlTWFwID0gbmV3UHJvZ3JhbS0+Z2V0X2FsbF9uYW1lc3BhY2VzKCk7CisgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBvbGROYW1lc3BhY2VNYXAgPSBvbGRQcm9ncmFtLT5nZXRfYWxsX25hbWVzcGFjZXMoKTsKKworICAgZm9yKHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIG9sZE5hbWVzcGFjZU1hcEl0ID0gb2xkTmFtZXNwYWNlTWFwLmJlZ2luKCk7CisgICAgICAgICBvbGROYW1lc3BhY2VNYXBJdCAhPSBvbGROYW1lc3BhY2VNYXAuZW5kKCk7CisgICAgICAgICBvbGROYW1lc3BhY2VNYXBJdCsrKQorICAgeworICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgbmV3TmFtZXNwYWNlTWFwSXQgPSBuZXdOYW1lc3BhY2VNYXAuZmluZChvbGROYW1lc3BhY2VNYXBJdC0+Zmlyc3QpOworICAgICAgaWYobmV3TmFtZXNwYWNlTWFwSXQgPT0gbmV3TmFtZXNwYWNlTWFwLmVuZCgpKQorICAgICAgeworICAgICAgICAgdGhyaWZ0X2F1ZGl0X3dhcm5pbmcoMSwgIkxhbmd1YWdlICVzIG5vdCBmb3VuZCBpbiBuZXcgdGhyaWZ0IGZpbGVcbiIsIChvbGROYW1lc3BhY2VNYXBJdC0+Zmlyc3QpLmNfc3RyKCkpOworICAgICAgfQorICAgICAgZWxzZSBpZigobmV3TmFtZXNwYWNlTWFwSXQtPnNlY29uZCkgIT0gb2xkTmFtZXNwYWNlTWFwSXQtPnNlY29uZCkKKyAgICAgIHsKKyAgICAgICAgIHRocmlmdF9hdWRpdF93YXJuaW5nKDEsICJOYW1lc3BhY2UgJXMgY2hhbmdlZCBpbiBuZXcgdGhyaWZ0IGZpbGVcbiIsIChvbGROYW1lc3BhY2VNYXBJdC0+c2Vjb25kKS5jX3N0cigpKTsKKyAgICAgIH0KKyAgIH0KK30KKwordm9pZCBjb21wYXJlX2VudW1fdmFsdWVzKHRfZW51bSogbmV3RW51bSx0X2VudW0qIG9sZEVudW0pCit7CisgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2VudW1fdmFsdWUqPiYgb2xkRW51bVZhbHVlcyA9IG9sZEVudW0tPmdldF9jb25zdGFudHMoKTsKKyAgIGZvcihzdGQ6OnZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igb2xkRW51bVZhbHVlc0l0ID0gb2xkRW51bVZhbHVlcy5iZWdpbigpOworICAgICAgICAgb2xkRW51bVZhbHVlc0l0ICE9IG9sZEVudW1WYWx1ZXMuZW5kKCk7CisgICAgICAgICBvbGRFbnVtVmFsdWVzSXQrKykKKyAgIHsKKyAgICAgIGludCBlbnVtVmFsdWUgPSAoKm9sZEVudW1WYWx1ZXNJdCktPmdldF92YWx1ZSgpOworICAgICAgdF9lbnVtX3ZhbHVlKiBuZXdFbnVtVmFsdWUgPSBuZXdFbnVtLT5nZXRfY29uc3RhbnRfYnlfdmFsdWUoZW51bVZhbHVlKTsKKyAgICAgIGlmKG5ld0VudW1WYWx1ZSAhPSBOVUxMKQorICAgICAgeworICAgICAgICAgc3RkOjpzdHJpbmcgZW51bU5hbWUgPSAoKm9sZEVudW1WYWx1ZXNJdCktPmdldF9uYW1lKCk7CisgICAgICAgICBpZihlbnVtTmFtZSAhPSBuZXdFbnVtVmFsdWUtPmdldF9uYW1lKCkpCisgICAgICAgICB7CisgICAgICAgICAgICB0aHJpZnRfYXVkaXRfd2FybmluZygxLCAiTmFtZSBvZiB0aGUgdmFsdWUgJWQgY2hhbmdlZCBpbiBlbnVtICVzXG4iLCBlbnVtVmFsdWUsIG9sZEVudW0tPmdldF9uYW1lKCkuY19zdHIoKSk7CisgICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICB0aHJpZnRfYXVkaXRfZmFpbHVyZSgiRW51bSB2YWx1ZSAlZCBtaXNzaW5nIGluICVzXG4iLCBlbnVtVmFsdWUsIG9sZEVudW0tPmdldF9uYW1lKCkuY19zdHIoKSk7CisgICAgICB9CisKKyAgIH0KK30KKwordm9pZCBjb21wYXJlX2VudW1zKGNvbnN0IHN0ZDo6dmVjdG9yPHRfZW51bSo+JiBuZXdFbnVtTGlzdCwgY29uc3Qgc3RkOjp2ZWN0b3I8dF9lbnVtKj4mIG9sZEVudW1MaXN0KQoreworICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsdF9lbnVtKj4gbmV3RW51bU1hcDsKKyAgIHN0ZDo6dmVjdG9yPHRfZW51bSo+Ojpjb25zdF9pdGVyYXRvciBuZXdFbnVtSXQ7CisgICBmb3IobmV3RW51bUl0ID0gbmV3RW51bUxpc3QuYmVnaW4oKTsgbmV3RW51bUl0ICE9IG5ld0VudW1MaXN0LmVuZCgpOyBuZXdFbnVtSXQrKykKKyAgIHsKKyAgICAgIG5ld0VudW1NYXBbKCpuZXdFbnVtSXQpLT5nZXRfbmFtZSgpXSA9ICpuZXdFbnVtSXQ7CisgICB9CisgICBzdGQ6OnZlY3Rvcjx0X2VudW0qPjo6Y29uc3RfaXRlcmF0b3Igb2xkRW51bUl0OworICAgZm9yKG9sZEVudW1JdCA9IG9sZEVudW1MaXN0LmJlZ2luKCk7IG9sZEVudW1JdCAhPSBvbGRFbnVtTGlzdC5lbmQoKTsgb2xkRW51bUl0KyspCisgICB7CisgICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZyx0X2VudW0qPjo6aXRlcmF0b3IgbmV3RW51bU1hcEl0OworICAgICAgbmV3RW51bU1hcEl0ID0gbmV3RW51bU1hcC5maW5kKCgqb2xkRW51bUl0KS0+Z2V0X25hbWUoKSk7CisKKyAgICAgIGlmKG5ld0VudW1NYXBJdCA9PSBuZXdFbnVtTWFwLmVuZCgpKQorICAgICAgeworICAgICAgICAgdGhyaWZ0X2F1ZGl0X3dhcm5pbmcoMSwgIkVudW0gJXMgbm90IGZvdW5kIGluIG5ldyB0aHJpZnQgZmlsZVxuIiwoKm9sZEVudW1JdCktPmdldF9uYW1lKCkuY19zdHIoKSk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICBjb21wYXJlX2VudW1fdmFsdWVzKG5ld0VudW1NYXBJdC0+c2Vjb25kLCAqb2xkRW51bUl0KTsKKyAgICAgIH0KKyAgIH0KK30KKworLy9UaGlzIGZ1bmN0aW9uIHJldHVybnMgJ3RydWUnIGlmIHRoZSB0d28gYXJndWVtZW50cyBhcmUgb2Ygc2FtZSB0eXBlcy4KKy8vUmV0dXJucyBmYWxzZSBpZiB0aGV5IGFyZSBvZiBkaWZmZXJlbnQgdHlwZQorYm9vbCBjb21wYXJlX3R5cGUodF90eXBlKiBuZXdUeXBlLCB0X3R5cGUqIG9sZFR5cGUpCit7CisgICAvL0NvbXBhcmluZyBuYW1lcyBvZiB0d28gdHlwZXMgd2lsbCB3b3JrIHdoZW4gdGhlIG5ld1R5cGUgYW5kIG9sZFR5cGUgYXJlIGJhc2ljIHR5cGVzIG9yIHN0cnVjdHMgb3IgZW51bXMuCisgICAvL0hvd2V2ZXIsIHdoZW4gdGhleSBhcmUgY29udGFpbmVycywgZ2V0X25hbWUoKSByZXR1cm5zIGVtcHR5IGZvciB3aGljaCB3ZSBoYXZlIHRvIGNvbXBhcmUgdGhlIHR5cGUgb2YKKyAgIC8vdGhlaXIgZWxlbWVudHMgYXMgd2VsbC4KKyAgIGlmKChuZXdUeXBlLT5nZXRfbmFtZSgpKS5lbXB0eSgpICYmIChvbGRUeXBlLT5nZXRfbmFtZSgpKS5lbXB0eSgpKQorICAgeworCisgICAgICBpZihuZXdUeXBlLT5pc19saXN0KCkgJiYgb2xkVHlwZS0+aXNfbGlzdCgpKQorICAgICAgeworICAgICAgICAgdF90eXBlKiBuZXdFbGVtZW50VHlwZSA9ICgodF9saXN0KiluZXdUeXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgICAgICAgdF90eXBlKiBvbGRFbGVtZW50VHlwZSA9ICgodF9saXN0KilvbGRUeXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgICAgICAgcmV0dXJuIGNvbXBhcmVfdHlwZShuZXdFbGVtZW50VHlwZSwgb2xkRWxlbWVudFR5cGUpOworICAgICAgfQorICAgICAgZWxzZSBpZihuZXdUeXBlLT5pc19tYXAoKSAmJiBvbGRUeXBlLT5pc19tYXAoKSkKKyAgICAgIHsKKyAgICAgICAgIHRfdHlwZSogbmV3S2V5VHlwZSA9ICgodF9tYXAqKW5ld1R5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICAgICAgIHRfdHlwZSogb2xkS2V5VHlwZSA9ICgodF9tYXAqKW9sZFR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKworICAgICAgICAgdF90eXBlKiBuZXdWYWxUeXBlID0gKCh0X21hcCopbmV3VHlwZSktPmdldF92YWxfdHlwZSgpOworICAgICAgICAgdF90eXBlKiBvbGRWYWxUeXBlID0gKCh0X21hcCopb2xkVHlwZSktPmdldF92YWxfdHlwZSgpOworCisgICAgICAgICByZXR1cm4gKGNvbXBhcmVfdHlwZShuZXdLZXlUeXBlLCBvbGRLZXlUeXBlKSAmJiBjb21wYXJlX3R5cGUobmV3VmFsVHlwZSwgb2xkVmFsVHlwZSkpOworICAgICAgfQorICAgICAgZWxzZSBpZihuZXdUeXBlLT5pc19zZXQoKSAmJiBvbGRUeXBlLT5pc19zZXQoKSkKKyAgICAgIHsKKyAgICAgICAgIHRfdHlwZSogbmV3RWxlbWVudFR5cGUgPSAoKHRfc2V0KiluZXdUeXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgICAgICAgdF90eXBlKiBvbGRFbGVtZW50VHlwZSA9ICgodF9zZXQqKW9sZFR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgICAgICByZXR1cm4gY29tcGFyZV90eXBlKG5ld0VsZW1lbnRUeXBlLCBvbGRFbGVtZW50VHlwZSk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICB9CisgICBlbHNlIGlmKG5ld1R5cGUtPmdldF9uYW1lKCkgPT0gb2xkVHlwZS0+Z2V0X25hbWUoKSkKKyAgIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgfQorICAgZWxzZQorICAgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgfQorfQorCitib29sIGNvbXBhcmVfcGFpcihzdGQ6OnBhaXI8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiBuZXdNYXBQYWlyLCBzdGQ6OnBhaXI8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiBvbGRNYXBQYWlyKQoreworICAgcmV0dXJuIGNvbXBhcmVfZGVmYXVsdHMobmV3TWFwUGFpci5maXJzdCwgb2xkTWFwUGFpci5maXJzdCkgJiYgY29tcGFyZV9kZWZhdWx0cyhuZXdNYXBQYWlyLnNlY29uZCwgb2xkTWFwUGFpci5zZWNvbmQpOworfQorCisvLyBUaGlzIGZ1bmN0aW9uIHJldHVybnMgJ3RydWUnIGlmIHRoZSBkZWZhdWx0IHZhbHVlcyBhcmUgc2FtZS4gUmV0dXJucyBmYWxzZSBpZiB0aGV5IGFyZSBkaWZmZXJlbnQuCitib29sIGNvbXBhcmVfZGVmYXVsdHModF9jb25zdF92YWx1ZSogbmV3U3RydWN0RGVmYXVsdCwgdF9jb25zdF92YWx1ZSogb2xkU3RydWN0RGVmYXVsdCkKK3sKKyAgIGlmKG5ld1N0cnVjdERlZmF1bHQgPT0gTlVMTCAmJiBvbGRTdHJ1Y3REZWZhdWx0ID09IE5VTEwpIHJldHVybiB0cnVlOworICAgZWxzZSBpZihuZXdTdHJ1Y3REZWZhdWx0ID09IE5VTEwgJiYgb2xkU3RydWN0RGVmYXVsdCAhPSBOVUxMKSByZXR1cm4gZmFsc2U7CisgICBlbHNlIGlmIChuZXdTdHJ1Y3REZWZhdWx0ICE9IE5VTEwgJiYgb2xkU3RydWN0RGVmYXVsdCA9PSBOVUxMKSByZXR1cm4gZmFsc2U7CisKKyAgIGlmKG5ld1N0cnVjdERlZmF1bHQtPmdldF90eXBlKCkgIT0gb2xkU3RydWN0RGVmYXVsdC0+Z2V0X3R5cGUoKSkKKyAgIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgIH0KKworICAgc3dpdGNoKG5ld1N0cnVjdERlZmF1bHQtPmdldF90eXBlKCkpCisgICB7CisgICAgICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVI6CisgICAgICAgICByZXR1cm4gKG5ld1N0cnVjdERlZmF1bHQtPmdldF9pbnRlZ2VyKCkgPT0gb2xkU3RydWN0RGVmYXVsdC0+Z2V0X2ludGVnZXIoKSk7CisgICAgICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX0RPVUJMRToKKyAgICAgICAgIHJldHVybiAobmV3U3RydWN0RGVmYXVsdC0+Z2V0X2RvdWJsZSgpID09IG9sZFN0cnVjdERlZmF1bHQtPmdldF9kb3VibGUoKSk7CisgICAgICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX1NUUklORzoKKyAgICAgICAgIHJldHVybiAobmV3U3RydWN0RGVmYXVsdC0+Z2V0X3N0cmluZygpID09IG9sZFN0cnVjdERlZmF1bHQtPmdldF9zdHJpbmcoKSk7CisgICAgICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX0xJU1Q6CisgICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIG9sZERlZmF1bHRMaXN0ID0gb2xkU3RydWN0RGVmYXVsdC0+Z2V0X2xpc3QoKTsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgbmV3RGVmYXVsdExpc3QgPSBuZXdTdHJ1Y3REZWZhdWx0LT5nZXRfbGlzdCgpOworICAgICAgICAgICAgYm9vbCBkZWZhdWx0VmFsdWVzQ29tcGFyZSA9IChvbGREZWZhdWx0TGlzdC5zaXplKCkgPT0gbmV3RGVmYXVsdExpc3Quc2l6ZSgpKTsKKworICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZXNDb21wYXJlICYmIHN0ZDo6ZXF1YWwobmV3RGVmYXVsdExpc3QuYmVnaW4oKSwgbmV3RGVmYXVsdExpc3QuZW5kKCksIG9sZERlZmF1bHRMaXN0LmJlZ2luKCksIGNvbXBhcmVfZGVmYXVsdHMpOworICAgICAgICAgfQorICAgICAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9NQVA6CisgICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+IG5ld01hcCA9IG5ld1N0cnVjdERlZmF1bHQtPmdldF9tYXAoKTsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4gb2xkTWFwID0gb2xkU3RydWN0RGVmYXVsdC0+Z2V0X21hcCgpOworCisgICAgICAgICAgICBib29sIGRlZmF1bHRWYWx1ZXNDb21wYXJlID0gKG9sZE1hcC5zaXplKCkgPT0gbmV3TWFwLnNpemUoKSk7CisKKyAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWVzQ29tcGFyZSAmJiBzdGQ6OmVxdWFsKG5ld01hcC5iZWdpbigpLCBuZXdNYXAuZW5kKCksIG9sZE1hcC5iZWdpbigpLCBjb21wYXJlX3BhaXIpOworICAgICAgICAgfQorICAgICAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9JREVOVElGSUVSOgorICAgICAgICAgcmV0dXJuIChuZXdTdHJ1Y3REZWZhdWx0LT5nZXRfaWRlbnRpZmllcigpID09IG9sZFN0cnVjdERlZmF1bHQtPmdldF9pZGVudGlmaWVyKCkpOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgIH0KKworfQorCit2b2lkIGNvbXBhcmVfc3RydWN0X2ZpZWxkKHRfZmllbGQqIG5ld0ZpZWxkLCB0X2ZpZWxkKiBvbGRGaWVsZCwgc3RkOjpzdHJpbmcgb2xkU3RydWN0TmFtZSkKK3sKKyAgIHRfdHlwZSogbmV3RmllbGRUeXBlID0gbmV3RmllbGQtPmdldF90eXBlKCk7CisgICB0X3R5cGUqIG9sZEZpZWxkVHlwZSA9IG9sZEZpZWxkLT5nZXRfdHlwZSgpOworICAgaWYoIWNvbXBhcmVfdHlwZShuZXdGaWVsZFR5cGUsIG9sZEZpZWxkVHlwZSkpCisgICB7CisgICAgICB0aHJpZnRfYXVkaXRfZmFpbHVyZSgiU3RydWN0IEZpZWxkIFR5cGUgQ2hhbmdlZCBmb3IgSWQgPSAlZCBpbiAlcyBcbiIsIG5ld0ZpZWxkLT5nZXRfa2V5KCksIG9sZFN0cnVjdE5hbWUuY19zdHIoKSk7CisgICB9CisKKyAgIC8vIEEgU3RydWN0IG1lbWJlciBjYW4gYmUgb3B0aW9uYWwgaWYgaXQgaXMgbWVudGlvbmVkIGV4cGxpY2l0bHksIG9yIGlmIGl0IGlzIGFzc2lnbmVkIHdpdGggZGVmYXVsdCB2YWx1ZXMuCisgICBib29sIG5ld1N0cnVjdEZpZWxkT3B0aW9uYWwgPSAobmV3RmllbGQtPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKTsKKyAgIGJvb2wgb2xkU3RydWN0RmllbGRPcHRpb25hbCA9IChvbGRGaWVsZC0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpOworCisgICBpZihuZXdTdHJ1Y3RGaWVsZE9wdGlvbmFsICE9IG9sZFN0cnVjdEZpZWxkT3B0aW9uYWwpCisgICB7CisgICAgICB0aHJpZnRfYXVkaXRfZmFpbHVyZSgiU3RydWN0IEZpZWxkIFJlcXVpcmVkbmVzcyBDaGFuZ2VkIGZvciBJZCA9ICVkIGluICVzIFxuIiwgbmV3RmllbGQtPmdldF9rZXkoKSwgb2xkU3RydWN0TmFtZS5jX3N0cigpKTsKKyAgIH0KKyAgIGlmKG5ld1N0cnVjdEZpZWxkT3B0aW9uYWwgfHwgb2xkU3RydWN0RmllbGRPcHRpb25hbCkKKyAgIHsKKyAgICAgIGlmKCFjb21wYXJlX2RlZmF1bHRzKG5ld0ZpZWxkLT5nZXRfdmFsdWUoKSwgb2xkRmllbGQtPmdldF92YWx1ZSgpKSkKKyAgICAgIHsKKyAgICAgICAgIHRocmlmdF9hdWRpdF93YXJuaW5nKDEsICJEZWZhdWx0IHZhbHVlIGNoYW5nZWQgZm9yIElkID0gJWQgaW4gJXMgXG4iLCBuZXdGaWVsZC0+Z2V0X2tleSgpLCBvbGRTdHJ1Y3ROYW1lLmNfc3RyKCkpOworICAgICAgfQorICAgfQorCisgICBzdGQ6OnN0cmluZyBmaWVsZE5hbWUgPSBuZXdGaWVsZC0+Z2V0X25hbWUoKTsKKyAgIGlmKGZpZWxkTmFtZSAhPSBvbGRGaWVsZC0+Z2V0X25hbWUoKSkKKyAgIHsKKyAgICAgIHRocmlmdF9hdWRpdF93YXJuaW5nKDEsICJTdHJ1Y3QgZmllbGQgbmFtZSBjaGFuZ2VkIGZvciBJZCA9ICVkIGluICVzXG4iLCBuZXdGaWVsZC0+Z2V0X2tleSgpLCBvbGRTdHJ1Y3ROYW1lLmNfc3RyKCkpOworICAgfQorCit9CisKK3ZvaWQgY29tcGFyZV9zaW5nbGVfc3RydWN0KHRfc3RydWN0KiBuZXdTdHJ1Y3QsIHRfc3RydWN0KiBvbGRTdHJ1Y3QsIGNvbnN0IHN0ZDo6c3RyaW5nJiBvbGRTdHJ1Y3ROYW1lID0gc3RkOjpzdHJpbmcoKSkKK3sKKyAgIHN0ZDo6c3RyaW5nIHN0cnVjdE5hbWUgPSBvbGRTdHJ1Y3ROYW1lLmVtcHR5KCkgPyBvbGRTdHJ1Y3QtPmdldF9uYW1lKCkgOiBvbGRTdHJ1Y3ROYW1lOworICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBvbGRTdHJ1Y3RNZW1iZXJzSW5JZE9yZGVyID0gb2xkU3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgbmV3U3RydWN0TWVtYmVyc0luSWRPcmRlciA9IG5ld1N0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgICBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG9sZFN0cnVjdE1lbWJlckl0ID0gb2xkU3RydWN0TWVtYmVyc0luSWRPcmRlci5iZWdpbigpOworICAgc3RkOjp2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBuZXdTdHJ1Y3RNZW1iZXJJdCA9IG5ld1N0cnVjdE1lbWJlcnNJbklkT3JkZXIuYmVnaW4oKTsKKworICAgLy8gU2luY2Ugd2UgaGF2ZSB0aGUgc3RydWN0IG1lbWJlcnMgaW4gdGhlaXIgSUQgb3JkZXIsIGNvbXBhcmluZyB0aGVpciBJRHMgY2FuIGJlIGRvbmUgYnkgdHJhdmVyc2luZyB0aGUgdHdvIG1lbWJlcgorICAgLy8gbGlzdHMgdG9nZXRoZXIuCisgICB3aGlsZSghKG9sZFN0cnVjdE1lbWJlckl0ID09IG9sZFN0cnVjdE1lbWJlcnNJbklkT3JkZXIuZW5kKCkgJiYgbmV3U3RydWN0TWVtYmVySXQgPT0gbmV3U3RydWN0TWVtYmVyc0luSWRPcmRlci5lbmQoKSkpCisgICB7CisgICAgICBpZihuZXdTdHJ1Y3RNZW1iZXJJdCA9PSBuZXdTdHJ1Y3RNZW1iZXJzSW5JZE9yZGVyLmVuZCgpICYmIG9sZFN0cnVjdE1lbWJlckl0ICE9IG9sZFN0cnVjdE1lbWJlcnNJbklkT3JkZXIuZW5kKCkpCisgICAgICB7CisgICAgICAgICAvLyBBIGZpZWxkIElEIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgZW5kLgorICAgICAgICAgdGhyaWZ0X2F1ZGl0X2ZhaWx1cmUoIlN0cnVjdCBGaWVsZCByZW1vdmVkIGZvciBJZCA9ICVkIGluICVzIFxuIiwgKCpvbGRTdHJ1Y3RNZW1iZXJJdCktPmdldF9rZXkoKSwgc3RydWN0TmFtZS5jX3N0cigpKTsKKyAgICAgICAgIG9sZFN0cnVjdE1lbWJlckl0Kys7CisgICAgICB9CisgICAgICBlbHNlIGlmKG5ld1N0cnVjdE1lbWJlckl0ICE9IG5ld1N0cnVjdE1lbWJlcnNJbklkT3JkZXIuZW5kKCkgJiYgb2xkU3RydWN0TWVtYmVySXQgPT0gb2xkU3RydWN0TWVtYmVyc0luSWRPcmRlci5lbmQoKSkKKyAgICAgIHsKKyAgICAgICAgIC8vTmV3IGZpZWxkIElEIGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBlbmQuCisgICAgICAgICBpZigoKm5ld1N0cnVjdE1lbWJlckl0KS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpCisgICAgICAgICB7CisgICAgICAgICAgICB0aHJpZnRfYXVkaXRfZmFpbHVyZSgiUmVxdWlyZWQgU3RydWN0IEZpZWxkIEFkZGVkIGZvciBJZCA9ICVkIGluICVzIFxuIiwgKCpuZXdTdHJ1Y3RNZW1iZXJJdCktPmdldF9rZXkoKSwgc3RydWN0TmFtZS5jX3N0cigpKTsKKyAgICAgICAgIH0KKyAgICAgICAgIG5ld1N0cnVjdE1lbWJlckl0Kys7CisgICAgICB9CisgICAgICBlbHNlIGlmKCgqbmV3U3RydWN0TWVtYmVySXQpLT5nZXRfa2V5KCkgPT0gKCpvbGRTdHJ1Y3RNZW1iZXJJdCktPmdldF9rZXkoKSkKKyAgICAgIHsKKyAgICAgICAgIC8vRmllbGQgSUQgZm91bmQgaW4gYm90aCBzdHJ1Y3RzLiBDb21wYXJlIGZpZWxkIHR5cGVzLCBkZWZhdWx0IHZhbHVlcy4KKyAgICAgICAgIGNvbXBhcmVfc3RydWN0X2ZpZWxkKCpuZXdTdHJ1Y3RNZW1iZXJJdCwgKm9sZFN0cnVjdE1lbWJlckl0LCBzdHJ1Y3ROYW1lKTsKKworICAgICAgICAgbmV3U3RydWN0TWVtYmVySXQrKzsKKyAgICAgICAgIG9sZFN0cnVjdE1lbWJlckl0Kys7CisgICAgICB9CisgICAgICBlbHNlIGlmKCgqbmV3U3RydWN0TWVtYmVySXQpLT5nZXRfa2V5KCkgPCAoKm9sZFN0cnVjdE1lbWJlckl0KS0+Z2V0X2tleSgpKQorICAgICAgeworICAgICAgICAgLy9OZXcgRmllbGQgSWQgaXMgaW5zZXJ0ZWQgaW4gYmV0d2VlbgorICAgICAgICAgLy9BZGRpbmcgZmllbGRzIHRvIHN0cnVjdCBpcyBmaW5lLCBidXQgYWRkaW5nIHRoZW0gaW4gdGhlIG1pZGRsZSBpcyBzdXNwaWNpb3VzLiBFcnJvciEhCisgICAgICAgICB0aHJpZnRfYXVkaXRfZmFpbHVyZSgiU3RydWN0IGZpZWxkIGlzIGFkZGVkIGluIHRoZSBtaWRkbGUgd2l0aCBJZCA9ICVkIGluICVzXG4iLCAgKCpuZXdTdHJ1Y3RNZW1iZXJJdCktPmdldF9rZXkoKSwgIHN0cnVjdE5hbWUuY19zdHIoKSk7CisgICAgICAgICBuZXdTdHJ1Y3RNZW1iZXJJdCsrOworICAgICAgfQorICAgICAgZWxzZSBpZigoKm5ld1N0cnVjdE1lbWJlckl0KS0+Z2V0X2tleSgpID4gKCpvbGRTdHJ1Y3RNZW1iZXJJdCktPmdldF9rZXkoKSkKKyAgICAgIHsKKyAgICAgICAgIC8vQSBmaWVsZCBpcyBkZWxldGVkIGluIG5ld1N0cnVjdC4KKyAgICAgICAgIHRocmlmdF9hdWRpdF9mYWlsdXJlKCJTdHJ1Y3QgRmllbGQgcmVtb3ZlZCBmb3IgSWQgPSAlZCBpbiAlcyBcbiIsICAoKm9sZFN0cnVjdE1lbWJlckl0KS0+Z2V0X2tleSgpLCBzdHJ1Y3ROYW1lLmNfc3RyKCkpOworICAgICAgICAgb2xkU3RydWN0TWVtYmVySXQrKzsKKyAgICAgIH0KKworICAgfQorfQorCit2b2lkIGNvbXBhcmVfc3RydWN0cyhjb25zdCBzdGQ6OnZlY3Rvcjx0X3N0cnVjdCo+JiBuZXdTdHJ1Y3RMaXN0LCBjb25zdCBzdGQ6OnZlY3Rvcjx0X3N0cnVjdCo+JiBvbGRTdHJ1Y3RMaXN0KQoreworICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsdF9zdHJ1Y3QqPiBuZXdTdHJ1Y3RNYXA7CisgICBzdGQ6OnZlY3Rvcjx0X3N0cnVjdCo+Ojpjb25zdF9pdGVyYXRvciBuZXdTdHJ1Y3RMaXN0SXQ7CisgICBmb3IobmV3U3RydWN0TGlzdEl0ID0gbmV3U3RydWN0TGlzdC5iZWdpbigpOyBuZXdTdHJ1Y3RMaXN0SXQgIT0gbmV3U3RydWN0TGlzdC5lbmQoKTsgbmV3U3RydWN0TGlzdEl0KyspCisgICB7CisgICAgICBuZXdTdHJ1Y3RNYXBbKCpuZXdTdHJ1Y3RMaXN0SXQpLT5nZXRfbmFtZSgpXSA9ICpuZXdTdHJ1Y3RMaXN0SXQ7CisgICB9CisKKyAgIHN0ZDo6dmVjdG9yPHRfc3RydWN0Kj46OmNvbnN0X2l0ZXJhdG9yIG9sZFN0cnVjdExpc3RJdDsKKyAgIGZvcihvbGRTdHJ1Y3RMaXN0SXQgPSBvbGRTdHJ1Y3RMaXN0LmJlZ2luKCk7IG9sZFN0cnVjdExpc3RJdCAhPSBvbGRTdHJ1Y3RMaXN0LmVuZCgpOyBvbGRTdHJ1Y3RMaXN0SXQrKykKKyAgIHsKKyAgICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCB0X3N0cnVjdCo+OjppdGVyYXRvciBuZXdTdHJ1Y3RNYXBJdDsKKyAgICAgIG5ld1N0cnVjdE1hcEl0ID0gbmV3U3RydWN0TWFwLmZpbmQoKCpvbGRTdHJ1Y3RMaXN0SXQpLT5nZXRfbmFtZSgpKTsKKyAgICAgIGlmKG5ld1N0cnVjdE1hcEl0ID09IG5ld1N0cnVjdE1hcC5lbmQoKSkKKyAgICAgIHsKKyAgICAgICAgIHRocmlmdF9hdWRpdF9mYWlsdXJlKCJTdHJ1Y3QgJXMgbm90IGZvdW5kIGluIG5ldyB0aHJpZnQgZmlsZVxuIiwgKCpvbGRTdHJ1Y3RMaXN0SXQpLT5nZXRfbmFtZSgpLmNfc3RyKCkpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgY29tcGFyZV9zaW5nbGVfc3RydWN0KG5ld1N0cnVjdE1hcEl0LT5zZWNvbmQsICpvbGRTdHJ1Y3RMaXN0SXQpOworICAgICAgfQorICAgfQorCit9CisKK3ZvaWQgY29tcGFyZV9zaW5nbGVfZnVuY3Rpb24odF9mdW5jdGlvbiogbmV3RnVuY3Rpb24sIHRfZnVuY3Rpb24qIG9sZEZ1bmN0aW9uKQoreworICAgdF90eXBlKiBuZXdGdW5jdGlvblJldHVyblR5cGUgPSBuZXdGdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKTsKKworICAgaWYobmV3RnVuY3Rpb24tPmlzX29uZXdheSgpICE9IG9sZEZ1bmN0aW9uLT5pc19vbmV3YXkoKSkKKyAgIHsKKyAgICAgIHRocmlmdF9hdWRpdF9mYWlsdXJlKCJPbmV3YXkgYXR0cmlidXRlIGNoYW5nZWQgZm9yIGZ1bmN0aW9uICVzXG4iLG9sZEZ1bmN0aW9uLT5nZXRfbmFtZSgpLmNfc3RyKCkpOworICAgfQorICAgaWYoIWNvbXBhcmVfdHlwZShuZXdGdW5jdGlvblJldHVyblR5cGUsIG9sZEZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKSkKKyAgIHsKKyAgICAgIHRocmlmdF9hdWRpdF9mYWlsdXJlKCJSZXR1cm4gdHlwZSBjaGFuZ2VkIGZvciBmdW5jdGlvbiAlc1xuIixvbGRGdW5jdGlvbi0+Z2V0X25hbWUoKS5jX3N0cigpKTsKKyAgIH0KKworICAgLy9Db21wYXJlIGZ1bmN0aW9uIGFyZ3VtZW50cy4KKyAgIGNvbXBhcmVfc2luZ2xlX3N0cnVjdChuZXdGdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSwgb2xkRnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpOworICAgc3RkOjpzdHJpbmcgZXhjZXB0aW9uTmFtZSA9IG9sZEZ1bmN0aW9uLT5nZXRfbmFtZSgpOworICAgZXhjZXB0aW9uTmFtZSArPSAiX2V4Y2VwdGlvbiI7CisgICBjb21wYXJlX3NpbmdsZV9zdHJ1Y3QobmV3RnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKSwgb2xkRnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKSwgZXhjZXB0aW9uTmFtZSk7Cit9CisKK3ZvaWQgY29tcGFyZV9mdW5jdGlvbnMoY29uc3Qgc3RkOjp2ZWN0b3I8dF9mdW5jdGlvbio+JiBuZXdGdW5jdGlvbkxpc3QsIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZnVuY3Rpb24qPiYgb2xkRnVuY3Rpb25MaXN0KQoreworICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHRfZnVuY3Rpb24qPiBuZXdGdW5jdGlvbk1hcDsKKyAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCB0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIG5ld0Z1bmN0aW9uTWFwSXQ7CisgICBmb3Ioc3RkOjp2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBuZXdGdW5jdGlvbkl0ID0gbmV3RnVuY3Rpb25MaXN0LmJlZ2luKCk7CisgICAgICAgICBuZXdGdW5jdGlvbkl0ICE9IG5ld0Z1bmN0aW9uTGlzdC5lbmQoKTsKKyAgICAgICAgIG5ld0Z1bmN0aW9uSXQrKykKKyAgIHsKKyAgICAgIG5ld0Z1bmN0aW9uTWFwWygqbmV3RnVuY3Rpb25JdCktPmdldF9uYW1lKCldID0gKm5ld0Z1bmN0aW9uSXQ7CisgICB9CisKKyAgIGZvcihzdGQ6OnZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIG9sZEZ1bmN0aW9uSXQgPSBvbGRGdW5jdGlvbkxpc3QuYmVnaW4oKTsKKyAgICAgICAgIG9sZEZ1bmN0aW9uSXQgIT0gb2xkRnVuY3Rpb25MaXN0LmVuZCgpOworICAgICAgICAgb2xkRnVuY3Rpb25JdCsrKQorICAgeworICAgICAgbmV3RnVuY3Rpb25NYXBJdCA9IG5ld0Z1bmN0aW9uTWFwLmZpbmQoKCpvbGRGdW5jdGlvbkl0KS0+Z2V0X25hbWUoKSk7CisgICAgICBpZihuZXdGdW5jdGlvbk1hcEl0ID09IG5ld0Z1bmN0aW9uTWFwLmVuZCgpKQorICAgICAgeworICAgICAgICAgdGhyaWZ0X2F1ZGl0X2ZhaWx1cmUoIk5ldyBUaHJpZnQgRmlsZSBoYXMgbWlzc2luZyBmdW5jdGlvbiAlc1xuIiwoKm9sZEZ1bmN0aW9uSXQpLT5nZXRfbmFtZSgpLmNfc3RyKCkpOworICAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICAvL0Z1bmN0aW9uIGlzIGZvdW5kIGluIGJvdGggdGhyaWZ0IGZpbGVzLiBDb21wYXJlIHJldHVybiB0eXBlIGFuZCBhcmd1bWVudCBsaXN0CisgICAgICAgICBjb21wYXJlX3NpbmdsZV9mdW5jdGlvbihuZXdGdW5jdGlvbk1hcEl0LT5zZWNvbmQsICpvbGRGdW5jdGlvbkl0KTsKKyAgICAgIH0KKyAgIH0KKworfQorCit2b2lkIGNvbXBhcmVfc2VydmljZXMoY29uc3Qgc3RkOjp2ZWN0b3I8dF9zZXJ2aWNlKj4mIG5ld1NlcnZpY2VzLCBjb25zdCBzdGQ6OnZlY3Rvcjx0X3NlcnZpY2UqPiYgb2xkU2VydmljZXMpCit7CisgICBzdGQ6OnZlY3Rvcjx0X3NlcnZpY2UqPjo6Y29uc3RfaXRlcmF0b3Igb2xkU2VydmljZUl0OworCisgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgdF9zZXJ2aWNlKj4gbmV3U2VydmljZU1hcDsKKyAgIGZvcihzdGQ6OnZlY3Rvcjx0X3NlcnZpY2UqPjo6Y29uc3RfaXRlcmF0b3IgbmV3U2VydmljZUl0ID0gbmV3U2VydmljZXMuYmVnaW4oKTsKKyAgICAgICAgIG5ld1NlcnZpY2VJdCAhPSBuZXdTZXJ2aWNlcy5lbmQoKTsKKyAgICAgICAgIG5ld1NlcnZpY2VJdCsrKQorICAgeworICAgICAgbmV3U2VydmljZU1hcFsoKm5ld1NlcnZpY2VJdCktPmdldF9uYW1lKCldID0gKm5ld1NlcnZpY2VJdDsKKyAgIH0KKworCisgICBmb3Iob2xkU2VydmljZUl0ID0gb2xkU2VydmljZXMuYmVnaW4oKTsgb2xkU2VydmljZUl0ICE9IG9sZFNlcnZpY2VzLmVuZCgpOyBvbGRTZXJ2aWNlSXQrKykKKyAgIHsKKyAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIG9sZFNlcnZpY2VOYW1lID0gKCpvbGRTZXJ2aWNlSXQpLT5nZXRfbmFtZSgpOworICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHRfc2VydmljZSo+OjppdGVyYXRvciBuZXdTZXJ2aWNlTWFwSXQgPSBuZXdTZXJ2aWNlTWFwLmZpbmQob2xkU2VydmljZU5hbWUpOworCisgICAgICBpZihuZXdTZXJ2aWNlTWFwSXQgPT0gbmV3U2VydmljZU1hcC5lbmQoKSkKKyAgICAgIHsKKyAgICAgICAgIHRocmlmdF9hdWRpdF9mYWlsdXJlKCJOZXcgVGhyaWZ0IGZpbGUgaXMgbWlzc2luZyBhIHNlcnZpY2UgJXNcbiIsIG9sZFNlcnZpY2VOYW1lLmNfc3RyKCkpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgdF9zZXJ2aWNlKiBvbGRTZXJ2aWNlRXh0ZW5kcyA9ICgqb2xkU2VydmljZUl0KS0+Z2V0X2V4dGVuZHMoKTsKKyAgICAgICAgIHRfc2VydmljZSogbmV3U2VydmljZUV4dGVuZHMgPSAobmV3U2VydmljZU1hcEl0LT5zZWNvbmQpLT5nZXRfZXh0ZW5kcygpOworCisgICAgICAgICBpZihvbGRTZXJ2aWNlRXh0ZW5kcyA9PSBOVUxMKQorICAgICAgICAgeworICAgICAgICAgICAgLy8gSXQgaXMgZmluZSB0byBhZGQgZXh0ZW5kcy4gU28gaWYgc2VydmljZSBpbiBvbGRlciB0aHJpZnQgZGlkIG5vdCBoYXZlIGFueSBleHRlbmRzLCB3ZSBhcmUgZmluZS4KKyAgICAgICAgICAgIC8vIERPIE5vdGhpbmcKKyAgICAgICAgIH0KKyAgICAgICAgIGVsc2UgaWYob2xkU2VydmljZUV4dGVuZHMgIT0gTlVMTCAmJiBuZXdTZXJ2aWNlRXh0ZW5kcyA9PSBOVUxMKQorICAgICAgICAgeworICAgICAgICAgICAgdGhyaWZ0X2F1ZGl0X2ZhaWx1cmUoIkNoYW5nZSBpbiBTZXJ2aWNlIGluaGVyaXRhbmNlIGZvciAlc1xuIiwgb2xkU2VydmljZU5hbWUuY19zdHIoKSk7CisgICAgICAgICB9CisgICAgICAgICBlbHNlCisgICAgICAgICB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBvbGRFeHRlbmRzTmFtZSA9IG9sZFNlcnZpY2VFeHRlbmRzLT5nZXRfbmFtZSgpOworICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmV3RXh0ZW5kc05hbWUgPSBuZXdTZXJ2aWNlRXh0ZW5kcy0+Z2V0X25hbWUoKTsKKworICAgICAgICAgICAgaWYoIG5ld0V4dGVuZHNOYW1lICE9IG9sZEV4dGVuZHNOYW1lKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgdGhyaWZ0X2F1ZGl0X2ZhaWx1cmUoIkNoYW5nZSBpbiBTZXJ2aWNlIGluaGVyaXRhbmNlIGZvciAlc1xuIiwgb2xkU2VydmljZU5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisKKyAgICAgICAgIGNvbXBhcmVfZnVuY3Rpb25zKChuZXdTZXJ2aWNlTWFwSXQtPnNlY29uZCktPmdldF9mdW5jdGlvbnMoKSwgKCpvbGRTZXJ2aWNlSXQpLT5nZXRfZnVuY3Rpb25zKCkpOworICAgICAgfQorCisgICB9CisKK30KKwordm9pZCBjb21wYXJlX2NvbnN0cyhjb25zdCBzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4mIG5ld0NvbnN0LCBjb25zdCBzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4mIG9sZENvbnN0KQoreworICAgc3RkOjp2ZWN0b3I8dF9jb25zdCo+Ojpjb25zdF9pdGVyYXRvciBuZXdDb25zdEl0OworICAgc3RkOjp2ZWN0b3I8dF9jb25zdCo+Ojpjb25zdF9pdGVyYXRvciBvbGRDb25zdEl0OworCisgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgdF9jb25zdCo+IG5ld0NvbnN0TWFwOworCisgICBmb3IobmV3Q29uc3RJdCA9IG5ld0NvbnN0LmJlZ2luKCk7IG5ld0NvbnN0SXQgIT0gbmV3Q29uc3QuZW5kKCk7IG5ld0NvbnN0SXQrKykKKyAgIHsKKyAgICAgIG5ld0NvbnN0TWFwWygqbmV3Q29uc3RJdCktPmdldF9uYW1lKCldID0gKm5ld0NvbnN0SXQ7CisgICB9CisKKyAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCB0X2NvbnN0Kj46OmNvbnN0X2l0ZXJhdG9yIG5ld0NvbnN0TWFwSXQ7CisgICBmb3Iob2xkQ29uc3RJdCA9IG9sZENvbnN0LmJlZ2luKCk7IG9sZENvbnN0SXQgIT0gb2xkQ29uc3QuZW5kKCk7IG9sZENvbnN0SXQrKykKKyAgIHsKKyAgICAgIG5ld0NvbnN0TWFwSXQgPSBuZXdDb25zdE1hcC5maW5kKCgqb2xkQ29uc3RJdCktPmdldF9uYW1lKCkpOworICAgICAgaWYobmV3Q29uc3RNYXBJdCA9PSBuZXdDb25zdE1hcC5lbmQoKSkKKyAgICAgIHsKKyAgICAgICAgIHRocmlmdF9hdWRpdF93YXJuaW5nKDEsICJDb25zdGFudHMgTWlzc2luZyAlcyBcbiIsICgoKm9sZENvbnN0SXQpLT5nZXRfbmFtZSgpKS5jX3N0cigpKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYoIWNvbXBhcmVfdHlwZSgobmV3Q29uc3RNYXBJdC0+c2Vjb25kKS0+Z2V0X3R5cGUoKSwgKCpvbGRDb25zdEl0KS0+Z2V0X3R5cGUoKSkpCisgICAgICB7CisgICAgICAgICB0aHJpZnRfYXVkaXRfd2FybmluZygxLCAiQ29uc3RhbnQgJXMgaXMgb2YgZGlmZmVyZW50IHR5cGUgXG4iLCAoKCpvbGRDb25zdEl0KS0+Z2V0X25hbWUoKSkuY19zdHIoKSk7CisgICAgICB9CisgICAgICBlbHNlIGlmKCFjb21wYXJlX2RlZmF1bHRzKChuZXdDb25zdE1hcEl0LT5zZWNvbmQpLT5nZXRfdmFsdWUoKSwgKCpvbGRDb25zdEl0KS0+Z2V0X3ZhbHVlKCkpKQorICAgICAgeworICAgICAgICAgdGhyaWZ0X2F1ZGl0X3dhcm5pbmcoMSwgIkNvbnN0YW50ICVzIGhhcyBkaWZmZXJlbnQgdmFsdWVcbiIsICgoKm9sZENvbnN0SXQpLT5nZXRfbmFtZSgpKS5jX3N0cigpKTsKKyAgICAgIH0KKyAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2F1ZGl0L3RfYXVkaXQuaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2F1ZGl0L3RfYXVkaXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTc5ZTMxCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvYXVkaXQvdF9hdWRpdC5oCkBAIC0wLDAgKzEsMTQgQEAKKyNpZm5kZWYgVF9BVURJVF9ICisjZGVmaW5lIFRfQVVESVRfSAorCit2b2lkIGNvbXBhcmVfbmFtZXNwYWNlKHRfcHJvZ3JhbSogbmV3UHJvZ3JhbSwgdF9wcm9ncmFtKiBvbGRQcm9ncmFtKTsKK3ZvaWQgY29tcGFyZV9lbnVtcyhjb25zdCBzdGQ6OnZlY3Rvcjx0X2VudW0qPiYgbmV3RW51bUxpc3QsCisgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9lbnVtKj4mIG9sZEVudW1MaXN0KTsKK2Jvb2wgY29tcGFyZV9kZWZhdWx0cyh0X2NvbnN0X3ZhbHVlKiBuZXdTdHJ1Y3REZWZhdWx0LCB0X2NvbnN0X3ZhbHVlKiBvbGRTdHJ1Y3REZWZhdWx0KTsKK3ZvaWQgY29tcGFyZV9zdHJ1Y3RzKGNvbnN0IHN0ZDo6dmVjdG9yPHRfc3RydWN0Kj4mIG5ld1N0cnVjdExpc3QsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X3N0cnVjdCo+JiBvbGRTdHJ1Y3RMaXN0KTsKK3ZvaWQgY29tcGFyZV9zZXJ2aWNlcyhjb25zdCBzdGQ6OnZlY3Rvcjx0X3NlcnZpY2UqPiYgbmV3U2VydmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9zZXJ2aWNlKj4mIG9sZFNlcnZpY2VzKTsKK3ZvaWQgY29tcGFyZV9jb25zdHMoY29uc3Qgc3RkOjp2ZWN0b3I8dF9jb25zdCo+JiBuZXdDb25zdCwgY29uc3Qgc3RkOjp2ZWN0b3I8dF9jb25zdCo+JiBvbGRDb25zdCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvY29tbW9uLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvY29tbW9uLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhMmI5ZDMKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9jb21tb24uY2MKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAidGhyaWZ0L2NvbW1vbi5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X2Jhc2VfdHlwZS5oIgorCit0X3R5cGUqIGdfdHlwZV92b2lkOwordF90eXBlKiBnX3R5cGVfc3RyaW5nOwordF90eXBlKiBnX3R5cGVfYmluYXJ5OwordF90eXBlKiBnX3R5cGVfc2xpc3Q7Cit0X3R5cGUqIGdfdHlwZV9ib29sOwordF90eXBlKiBnX3R5cGVfaTg7Cit0X3R5cGUqIGdfdHlwZV9pMTY7Cit0X3R5cGUqIGdfdHlwZV9pMzI7Cit0X3R5cGUqIGdfdHlwZV9pNjQ7Cit0X3R5cGUqIGdfdHlwZV9kb3VibGU7CisKK3ZvaWQgaW5pdEdsb2JhbHMoKSB7CisgIGdfdHlwZV92b2lkID0gbmV3IHRfYmFzZV90eXBlKCJ2b2lkIiwgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRCk7CisgIGdfdHlwZV9zdHJpbmcgPSBuZXcgdF9iYXNlX3R5cGUoInN0cmluZyIsIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORyk7CisgIGdfdHlwZV9iaW5hcnkgPSBuZXcgdF9iYXNlX3R5cGUoInN0cmluZyIsIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORyk7CisgICgodF9iYXNlX3R5cGUqKWdfdHlwZV9iaW5hcnkpLT5zZXRfYmluYXJ5KHRydWUpOworICBnX3R5cGVfc2xpc3QgPSBuZXcgdF9iYXNlX3R5cGUoInN0cmluZyIsIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORyk7CisgICgodF9iYXNlX3R5cGUqKWdfdHlwZV9zbGlzdCktPnNldF9zdHJpbmdfbGlzdCh0cnVlKTsKKyAgZ190eXBlX2Jvb2wgPSBuZXcgdF9iYXNlX3R5cGUoImJvb2wiLCB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MKTsKKyAgZ190eXBlX2k4ID0gbmV3IHRfYmFzZV90eXBlKCJpOCIsIHRfYmFzZV90eXBlOjpUWVBFX0k4KTsKKyAgZ190eXBlX2kxNiA9IG5ldyB0X2Jhc2VfdHlwZSgiaTE2IiwgdF9iYXNlX3R5cGU6OlRZUEVfSTE2KTsKKyAgZ190eXBlX2kzMiA9IG5ldyB0X2Jhc2VfdHlwZSgiaTMyIiwgdF9iYXNlX3R5cGU6OlRZUEVfSTMyKTsKKyAgZ190eXBlX2k2NCA9IG5ldyB0X2Jhc2VfdHlwZSgiaTY0IiwgdF9iYXNlX3R5cGU6OlRZUEVfSTY0KTsKKyAgZ190eXBlX2RvdWJsZSA9IG5ldyB0X2Jhc2VfdHlwZSgiZG91YmxlIiwgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFKTsKK30KKwordm9pZCBjbGVhckdsb2JhbHMoKSB7CisgIGRlbGV0ZSBnX3R5cGVfdm9pZDsKKyAgZGVsZXRlIGdfdHlwZV9zdHJpbmc7CisgIGRlbGV0ZSBnX3R5cGVfYm9vbDsKKyAgZGVsZXRlIGdfdHlwZV9pODsKKyAgZGVsZXRlIGdfdHlwZV9pMTY7CisgIGRlbGV0ZSBnX3R5cGVfaTMyOworICBkZWxldGUgZ190eXBlX2k2NDsKKyAgZGVsZXRlIGdfdHlwZV9kb3VibGU7Cit9CisKKy8qKgorICogVGhvc2UgYXJlIG5vdCByZWFsbHkgbmVlZGVkIGZvciBwbHVnaW5zIGJ1dCBjYXVzZXMgbGluayBlcnJvcnMgd2l0aG91dAorICovCisKKy8qKgorICogVGhlIGxvY2F0aW9uIG9mIHRoZSBsYXN0IHBhcnNlZCBkb2N0ZXh0IGNvbW1lbnQuCisgKi8KK2ludCBnX2RvY3RleHRfbGluZW5vOworaW50IGdfcHJvZ3JhbV9kb2N0ZXh0X2xpbmVubyA9IDA7CitQUk9HRE9DVEVYVF9TVEFUVVMgZ19wcm9ncmFtX2RvY3RleHRfc3RhdHVzID0gSU5WQUxJRDsKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2NvbW1vbi5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk0ODg0NgotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2NvbW1vbi5oCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUX0NPTU1PTl9ICisjZGVmaW5lIFRfQ09NTU9OX0gKKworI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3R5cGUuaCIKKworLyoqCisgKiBHbG9iYWwgdHlwZXMgZm9yIHRoZSBwYXJzZXIgdG8gYmUgYWJsZSB0byByZWZlcmVuY2UKKyAqLworCitleHRlcm4gdF90eXBlKiBnX3R5cGVfdm9pZDsKK2V4dGVybiB0X3R5cGUqIGdfdHlwZV9zdHJpbmc7CitleHRlcm4gdF90eXBlKiBnX3R5cGVfYmluYXJ5OworZXh0ZXJuIHRfdHlwZSogZ190eXBlX3NsaXN0OworZXh0ZXJuIHRfdHlwZSogZ190eXBlX2Jvb2w7CitleHRlcm4gdF90eXBlKiBnX3R5cGVfaTg7CitleHRlcm4gdF90eXBlKiBnX3R5cGVfaTE2OworZXh0ZXJuIHRfdHlwZSogZ190eXBlX2kzMjsKK2V4dGVybiB0X3R5cGUqIGdfdHlwZV9pNjQ7CitleHRlcm4gdF90eXBlKiBnX3R5cGVfZG91YmxlOworCit2b2lkIGluaXRHbG9iYWxzKCk7Cit2b2lkIGNsZWFyR2xvYmFscygpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfYXMzX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfYXMzX2dlbmVyYXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTcyNGZlCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9hczNfZ2VuZXJhdG9yLmNjCkBAIC0wLDAgKzEsMjU5NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8Y2N0eXBlPgorCisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzdGRleGNlcHQ+CisKKyNpbmNsdWRlICJ0aHJpZnQvcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9vb3BfZ2VuZXJhdG9yLmgiCisKK3VzaW5nIHN0ZDo6bWFwOwordXNpbmcgc3RkOjpvc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6dmVjdG9yOworCitzdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCisKKy8qKgorICogQVMzIGNvZGUgZ2VuZXJhdG9yLgorICoKKyAqLworY2xhc3MgdF9hczNfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7CitwdWJsaWM6CisgIHRfYXMzX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQorICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pIHsKKyAgICAodm9pZClvcHRpb25fc3RyaW5nOworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7CisKKyAgICBiaW5kYWJsZV8gPSBmYWxzZTsKKyAgICBmb3IoIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5iZWdpbigpOyBpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJiaW5kYWJsZSIpID09IDApIHsKKyAgICAgICAgYmluZGFibGVfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93ICJ1bmtub3duIG9wdGlvbiBhczM6IiArIGl0ZXItPmZpcnN0OworICAgICAgfQorICAgIH0KKworICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLWFzMyI7CisgIH0KKworICAvKioKKyAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcworICAgKi8KKworICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7CisgIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyk7CisKKyAgLyoqCisgICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpOworICB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworCisgIHZvaWQgcHJpbnRfY29uc3RfdmFsdWUoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9zdGF0aWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWZ2YWwgPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZShvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpOworCisgIC8qKgorICAgKiBTZXJ2aWNlLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfYXMzX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOworCisgIHZvaWQgZ2VuZXJhdGVfYXMzX3N0cnVjdF9kZWZpbml0aW9uKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2NsYXNzID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0ID0gZmFsc2UpOworICAvLyByZW1vdmVkIC0tIGVxdWFsaXR5LGNvbXBhcmVfdG8KKyAgdm9pZCBnZW5lcmF0ZV9hczNfc3RydWN0X3JlYWRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2FzM192YWxpZGF0b3Ioc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9hczNfc3RydWN0X3Jlc3VsdF93cml0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9hczNfc3RydWN0X3dyaXRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2FzM19zdHJ1Y3RfdG9zdHJpbmcoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGJpbmRhYmxlKTsKKyAgdm9pZCBnZW5lcmF0ZV9hczNfbWV0YV9kYXRhX21hcChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlKTsKKyAgc3RkOjpzdHJpbmcgZ2V0X2FzM190eXBlX3N0cmluZyh0X3R5cGUqIHR5cGUpOworICB2b2lkIGdlbmVyYXRlX3JlZmxlY3Rpb25fc2V0dGVycyhzdGQ6Om9zdHJpbmdzdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSk7CisgIHZvaWQgZ2VuZXJhdGVfcmVmbGVjdGlvbl9nZXR0ZXJzKHN0ZDo6b3N0cmluZ3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNhcF9uYW1lKTsKKyAgdm9pZCBnZW5lcmF0ZV9nZW5lcmljX2ZpZWxkX2dldHRlcnNfc2V0dGVycyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2dlbmVyaWNfaXNzZXRfbWV0aG9kKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfYXMzX2JlYW5fYm9pbGVycGxhdGUoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGJpbmRhYmxlKTsKKworICB2b2lkIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgc3RkOjpzdHJpbmcgZ2V0X2NhcF9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpOworICBzdGQ6OnN0cmluZyBnZW5lcmF0ZV9pc3NldF9jaGVjayh0X2ZpZWxkKiBmaWVsZCk7CisgIHN0ZDo6c3RyaW5nIGdlbmVyYXRlX2lzc2V0X2NoZWNrKHN0ZDo6c3RyaW5nIGZpZWxkKTsKKyAgdm9pZCBnZW5lcmF0ZV9pc3NldF9zZXQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiBmaWVsZCk7CisgIC8vIHJlbW92ZWQgc3RkOjpzdHJpbmcgaXNzZXRfZmllbGRfaWQodF9maWVsZCogZmllbGQpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKworICAvKioKKyAgICogU2VyaWFsaXphdGlvbiBjb25zdHJ1Y3RzCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGl0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG1hcCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2V0KiB0bWFwLCBzdGQ6OnN0cmluZyBpdGVyKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0ZDo6c3RyaW5nIGl0ZXIpOworCisgIHZvaWQgZ2VuZXJhdGVfYXMzX2RvYyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpOworCisgIHZvaWQgZ2VuZXJhdGVfYXMzX2RvYyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogdGRvYyk7CisKKyAgLyoqCisgICAqIEhlbHBlciByZW5kZXJpbmcgZnVuY3Rpb25zCisgICAqLworCisgIHN0ZDo6c3RyaW5nIGFzM19wYWNrYWdlKCk7CisgIHN0ZDo6c3RyaW5nIGFzM190eXBlX2ltcG9ydHMoKTsKKyAgc3RkOjpzdHJpbmcgYXMzX3RocmlmdF9pbXBvcnRzKCk7CisgIHN0ZDo6c3RyaW5nIGFzM190aHJpZnRfZ2VuX2ltcG9ydHModF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyYgaW1wb3J0cyk7CisgIHN0ZDo6c3RyaW5nIGFzM190aHJpZnRfZ2VuX2ltcG9ydHModF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHN0ZDo6c3RyaW5nIHR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLCBib29sIGluX2NvbnRhaW5lciA9IGZhbHNlLCBib29sIGluX2luaXQgPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIGJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlKiB0YmFzZSwgYm9vbCBpbl9jb250YWluZXIgPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIGRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluaXQgPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgIHN0ZDo6c3RyaW5nIHR5cGVfdG9fZW51bSh0X3R5cGUqIHR0eXBlKTsKKyAgc3RkOjpzdHJpbmcgZ2V0X2VudW1fY2xhc3NfbmFtZSh0X3R5cGUqIHR5cGUpOworCisgIGJvb2wgdHlwZV9jYW5fYmVfbnVsbCh0X3R5cGUqIHR0eXBlKSB7CisgICAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKKworICAgIHJldHVybiB0dHlwZS0+aXNfY29udGFpbmVyKCkgfHwgdHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpCisgICAgICAgICAgIHx8IHR0eXBlLT5pc19zdHJpbmcoKTsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIGNvbnN0YW50X25hbWUoc3RkOjpzdHJpbmcgbmFtZSk7CisKK3ByaXZhdGU6CisgIC8qKgorICAgKiBGaWxlIHN0cmVhbXMKKyAgICovCisKKyAgc3RkOjpzdHJpbmcgcGFja2FnZV9uYW1lXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3NlcnZpY2VfOworICBzdGQ6OnN0cmluZyBwYWNrYWdlX2Rpcl87CisKKyAgYm9vbCBiaW5kYWJsZV87Cit9OworCisvKioKKyAqIFByZXBhcmVzIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0CisgKiBzdHJlYW1zLgorICoKKyAqIEBwYXJhbSB0cHJvZ3JhbSBUaGUgcHJvZ3JhbSB0byBnZW5lcmF0ZQorICovCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7CisgIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQorICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOworICBwYWNrYWdlX25hbWVfID0gcHJvZ3JhbV8tPmdldF9uYW1lc3BhY2UoImFzMyIpOworCisgIHN0cmluZyBkaXIgPSBwYWNrYWdlX25hbWVfOworICBzdHJpbmcgc3ViZGlyID0gZ2V0X291dF9kaXIoKTsKKyAgc3RyaW5nOjpzaXplX3R5cGUgbG9jOworICB3aGlsZSAoKGxvYyA9IGRpci5maW5kKCIuIikpICE9IHN0cmluZzo6bnBvcykgeworICAgIHN1YmRpciA9IHN1YmRpciArICIvIiArIGRpci5zdWJzdHIoMCwgbG9jKTsKKyAgICBNS0RJUihzdWJkaXIuY19zdHIoKSk7CisgICAgZGlyID0gZGlyLnN1YnN0cihsb2MgKyAxKTsKKyAgfQorICBpZiAoZGlyLnNpemUoKSA+IDApIHsKKyAgICBzdWJkaXIgPSBzdWJkaXIgKyAiLyIgKyBkaXI7CisgICAgTUtESVIoc3ViZGlyLmNfc3RyKCkpOworICB9CisKKyAgcGFja2FnZV9kaXJfID0gc3ViZGlyOworfQorCisvKioKKyAqIFBhY2thZ2VzIHRoZSBnZW5lcmF0ZWQgZmlsZQorICoKKyAqIEByZXR1cm4gU3RyaW5nIG9mIHRoZSBwYWNrYWdlLCBpLmUuICJwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0ZGVtbzsiCisgKi8KK3N0cmluZyB0X2FzM19nZW5lcmF0b3I6OmFzM19wYWNrYWdlKCkgeworICBpZiAoIXBhY2thZ2VfbmFtZV8uZW1wdHkoKSkgeworICAgIHJldHVybiBzdHJpbmcoInBhY2thZ2UgIikgKyBwYWNrYWdlX25hbWVfICsgIiAiOworICB9CisgIHJldHVybiAicGFja2FnZSAiOworfQorCisvKioKKyAqIFByaW50cyBzdGFuZGFyZCBhczMgaW1wb3J0cworICoKKyAqIEByZXR1cm4gTGlzdCBvZiBpbXBvcnRzIGZvciBBczMgdHlwZXMgdGhhdCBhcmUgdXNlZCBpbiBoZXJlCisgKi8KK3N0cmluZyB0X2FzM19nZW5lcmF0b3I6OmFzM190eXBlX2ltcG9ydHMoKSB7CisgIHJldHVybiBzdHJpbmcoKSArICJpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuU2V0O1xuIiArICJpbXBvcnQgZmxhc2gudXRpbHMuQnl0ZUFycmF5O1xuIgorICAgICAgICAgKyAiaW1wb3J0IGZsYXNoLnV0aWxzLkRpY3Rpb25hcnk7XG5cbiI7Cit9CisKKy8qKgorICogUHJpbnRzIHN0YW5kYXJkIGFzMyBpbXBvcnRzCisgKgorICogQHJldHVybiBMaXN0IG9mIGltcG9ydHMgbmVjZXNzYXJ5IGZvciB0aHJpZnQKKyAqLworc3RyaW5nIHRfYXMzX2dlbmVyYXRvcjo6YXMzX3RocmlmdF9pbXBvcnRzKCkgeworICByZXR1cm4gc3RyaW5nKCkgKyAiaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0Lio7XG4iICsgImltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuKjtcbiIKKyAgICAgICAgICsgImltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC4qO1xuXG4iOworfQorCisvKioKKyAqIFByaW50cyBpbXBvcnRzIG5lZWRlZCBmb3IgYSBnaXZlbiB0eXBlCisgKgorICogQHJldHVybiBMaXN0IG9mIGltcG9ydHMgbmVjZXNzYXJ5IGZvciBhIGdpdmVuIHRfc3RydWN0CisgKi8KK3N0cmluZyB0X2FzM19nZW5lcmF0b3I6OmFzM190aHJpZnRfZ2VuX2ltcG9ydHModF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyYgaW1wb3J0cykgeworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgLy8gRm9yIGVhY2ggdHlwZSBjaGVjayBpZiBpdCBpcyBmcm9tIGEgZGlmZmVybmV0IG5hbWVzcGFjZQorICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gKCptX2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfcHJvZ3JhbSgpOworICAgIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgeworICAgICAgc3RyaW5nIHBhY2thZ2UgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJhczMiKTsKKyAgICAgIGlmICghcGFja2FnZS5lbXB0eSgpKSB7CisgICAgICAgIGlmIChpbXBvcnRzLmZpbmQocGFja2FnZSArICIuIiArICgqbV9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X25hbWUoKSkgPT0gc3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgaW1wb3J0cy5hcHBlbmQoImltcG9ydCAiICsgcGFja2FnZSArICIuIiArICgqbV9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X25hbWUoKSArICI7XG4iKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gaW1wb3J0czsKK30KKworLyoqCisgKiBQcmludHMgaW1wb3J0cyBuZWVkZWQgZm9yIGEgZ2l2ZW4gdHlwZQorICoKKyAqIEByZXR1cm4gTGlzdCBvZiBpbXBvcnRzIG5lY2Vzc2FyeSBmb3IgYSBnaXZlbiB0X3NlcnZpY2UKKyAqLworc3RyaW5nIHRfYXMzX2dlbmVyYXRvcjo6YXMzX3RocmlmdF9nZW5faW1wb3J0cyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBpbXBvcnRzOworICBjb25zdCB2ZWN0b3I8dF9mdW5jdGlvbio+JiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgLy8gRm9yIGVhY2ggdHlwZSBjaGVjayBpZiBpdCBpcyBmcm9tIGEgZGlmZmVybmV0IG5hbWVzcGFjZQorICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9ICgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+Z2V0X3Byb2dyYW0oKTsKKyAgICBpZiAocHJvZ3JhbSAhPSBOVUxMICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pIHsKKyAgICAgIHN0cmluZyBwYWNrYWdlID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiYXMzIik7CisgICAgICBpZiAoIXBhY2thZ2UuZW1wdHkoKSkgeworICAgICAgICBpZiAoaW1wb3J0cy5maW5kKHBhY2thZ2UgKyAiLiIgKyAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmdldF9uYW1lKCkpID09IHN0cmluZzo6bnBvcykgeworICAgICAgICAgIGltcG9ydHMuYXBwZW5kKCJpbXBvcnQgIiArIHBhY2thZ2UgKyAiLiIgKyAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICArICI7XG4iKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGFzM190aHJpZnRfZ2VuX2ltcG9ydHMoKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpLCBpbXBvcnRzKTsKKyAgICBhczNfdGhyaWZ0X2dlbl9pbXBvcnRzKCgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpLCBpbXBvcnRzKTsKKyAgfQorCisgIHJldHVybiBpbXBvcnRzOworfQorCisvKioKKyAqIE5vdGhpbmcgaW4gQXMzCisgKi8KK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdHlwZWRlZi4gVGhpcyBpcyBub3QgZG9uZSBpbiBBczMsIHNpbmNlIGl0IGRvZXMKKyAqIG5vdCBzdXBwb3J0IGFyYml0cmFyeSBuYW1lIHJlcGxhY2VtZW50cywgYW5kIGl0J2QgYmUgYSB3YWNreSB3YXN0ZQorICogb2Ygb3ZlcmhlYWQgdG8gbWFrZSB3cmFwcGVyIGNsYXNzZXMuCisgKgorICogQHBhcmFtIHR0eXBlZGVmIFRoZSB0eXBlIGRlZmluaXRpb24KKyAqLwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgeworICAodm9pZCl0dHlwZWRlZjsKK30KKworLyoqCisgKiBFbnVtcyBhcmUgYSBjbGFzcyB3aXRoIGEgc2V0IG9mIHN0YXRpYyBjb25zdGFudHMuCisgKgorICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgorICovCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7CisgIC8vIE1ha2Ugb3V0cHV0IGZpbGUKKyAgc3RyaW5nIGZfZW51bV9uYW1lID0gcGFja2FnZV9kaXJfICsgIi8iICsgKHRlbnVtLT5nZXRfbmFtZSgpKSArICIuYXMiOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfZW51bTsKKyAgZl9lbnVtLm9wZW4oZl9lbnVtX25hbWUpOworCisgIC8vIENvbW1lbnQgYW5kIHBhY2thZ2UgaXQKKyAgZl9lbnVtIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGFzM19wYWNrYWdlKCkgPDwgZW5kbDsKKworICBzY29wZV91cChmX2VudW0pOworICAvLyBBZGQgYXMzIGltcG9ydHMKKyAgZl9lbnVtIDw8IHN0cmluZygpICsgImltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5TZXQ7IiA8PCBlbmRsIDw8ICJpbXBvcnQgZmxhc2gudXRpbHMuRGljdGlvbmFyeTsiCisgICAgICAgICA8PCBlbmRsOworCisgIGluZGVudChmX2VudW0pIDw8ICJwdWJsaWMgY2xhc3MgIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiICI7CisgIHNjb3BlX3VwKGZfZW51bSk7CisKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgICAgaW5kZW50KGZfZW51bSkgPDwgInB1YmxpYyBzdGF0aWMgY29uc3QgIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIjppbnQgPSAiIDw8IHZhbHVlIDw8ICI7IgorICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIH0KKworICAvLyBDcmVhdGUgYSBzdGF0aWMgU2V0IHdpdGggYWxsIHZhbGlkIHZhbHVlcyBmb3IgdGhpcyBlbnVtCisgIGZfZW51bSA8PCBlbmRsOworCisgIGluZGVudChmX2VudW0pIDw8ICJwdWJsaWMgc3RhdGljIGNvbnN0IFZBTElEX1ZBTFVFUzpTZXQgPSBuZXcgU2V0KCI7CisgIGluZGVudF91cCgpOworICBib29sIGZpcnN0VmFsdWUgPSB0cnVlOworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIC8vIHBvcHVsYXRlIHNldAorICAgIGZfZW51bSA8PCAoZmlyc3RWYWx1ZSA/ICIiIDogIiwgIikgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIGZpcnN0VmFsdWUgPSBmYWxzZTsKKyAgfQorICBpbmRlbnRfZG93bigpOworICBmX2VudW0gPDwgIik7IiA8PCBlbmRsOworCisgIGluZGVudChmX2VudW0pIDw8ICJwdWJsaWMgc3RhdGljIGNvbnN0IFZBTFVFU19UT19OQU1FUzpEaWN0aW9uYXJ5ID0gbmV3IERpY3Rpb25hcnkoKTsiIDw8IGVuZGw7CisKKyAgc2NvcGVfdXAoZl9lbnVtKTsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBpbmRlbnQoZl9lbnVtKSA8PCAiVkFMVUVTX1RPX05BTUVTWyIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJdID0gXCIiCisgICAgICAgICAgICAgICAgICAgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIjsiIDw8IGVuZGw7CisgIH0KKyAgZl9lbnVtIDw8IGVuZGw7CisKKyAgc2NvcGVfZG93bihmX2VudW0pOworCisgIHNjb3BlX2Rvd24oZl9lbnVtKTsgLy8gZW5kIGNsYXNzCisKKyAgc2NvcGVfZG93bihmX2VudW0pOyAvLyBlbmQgcGFja2FnZQorCisgIGZfZW51bS5jbG9zZSgpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGNsYXNzIHRoYXQgaG9sZHMgYWxsIHRoZSBjb25zdGFudHMuCisgKi8KK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykgeworICBpZiAoY29uc3RzLmVtcHR5KCkpIHsKKyAgICByZXR1cm47CisgIH0KKworICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArIHByb2dyYW1fbmFtZV8gKyAiQ29uc3RhbnRzLmFzIjsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2NvbnN0czsKKyAgZl9jb25zdHMub3BlbihmX2NvbnN0c19uYW1lKTsKKworICAvLyBQcmludCBoZWFkZXIKKyAgZl9jb25zdHMgPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgYXMzX3BhY2thZ2UoKTsKKworICBzY29wZV91cChmX2NvbnN0cyk7CisgIGZfY29uc3RzIDw8IGVuZGw7CisKKyAgZl9jb25zdHMgPDwgYXMzX3R5cGVfaW1wb3J0cygpOworCisgIGluZGVudChmX2NvbnN0cykgPDwgInB1YmxpYyBjbGFzcyAiIDw8IHByb2dyYW1fbmFtZV8gPDwgIkNvbnN0YW50cyB7IiA8PCBlbmRsIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7CisgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgcHJpbnRfY29uc3RfdmFsdWUoZl9jb25zdHMsCisgICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3R5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF92YWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgfQorICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9jb25zdHMpIDw8ICJ9IiA8PCBlbmRsOworICBzY29wZV9kb3duKGZfY29uc3RzKTsKKyAgZl9jb25zdHMuY2xvc2UoKTsKK30KKwordm9pZCB0X2FzM19nZW5lcmF0b3I6OnByaW50X2NvbnN0X3ZhbHVlKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX3N0YXRpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlZnZhbCkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKworICBpbmRlbnQob3V0KTsKKyAgaWYgKCFkZWZ2YWwpIHsKKyAgICBvdXQgPDwgKGluX3N0YXRpYyA/ICJ2YXIgIiA6ICJwdWJsaWMgc3RhdGljIGNvbnN0ICIpOworICB9CisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHN0cmluZyB2MiA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIHR5cGUsIHZhbHVlKTsKKyAgICBvdXQgPDwgbmFtZTsKKyAgICBpZiAoIWRlZnZhbCkgeworICAgICAgb3V0IDw8ICI6IiA8PCB0eXBlX25hbWUodHlwZSk7CisgICAgfQorICAgIG91dCA8PCAiID0gIiA8PCB2MiA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIG91dCA8PCBuYW1lOworICAgIGlmICghZGVmdmFsKSB7CisgICAgICBvdXQgPDwgIjoiIDw8IHR5cGVfbmFtZSh0eXBlKTsKKyAgICB9CisgICAgb3V0IDw8ICIgPSAiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIG91dCA8PCBuYW1lIDw8ICI6IiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIKKyAgICAgICAgPDwgZW5kbDsKKyAgICBpZiAoIWluX3N0YXRpYykgeworICAgICAgaW5kZW50KG91dCkgPDwgInsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJuZXcgZnVuY3Rpb24oKTp2b2lkIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICB9CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7CisgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgeworICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKKyAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKKyAgICAgIH0KKyAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIuIjsKKyAgICAgIG91dCA8PCB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkgPDwgIiA9ICIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKyAgICBpZiAoIWluX3N0YXRpYykgeworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9KCk7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIG91dCA8PCBuYW1lOworICAgIGlmICghZGVmdmFsKSB7CisgICAgICBvdXQgPDwgIjoiIDw8IHR5cGVfbmFtZSh0eXBlKTsKKyAgICB9CisgICAgb3V0IDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgaWYgKCFpbl9zdGF0aWMpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAibmV3IGZ1bmN0aW9uKCk6dm9pZCB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBzdHJpbmcga2V5ID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwga3R5cGUsIHZfaXRlci0+Zmlyc3QpOworICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIHZ0eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICJbIiA8PCBrZXkgPDwgIl0gPSAiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaWYgKCFpbl9zdGF0aWMpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSgpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKSB7CisgICAgb3V0IDw8IG5hbWU7CisgICAgaWYgKCFkZWZ2YWwpIHsKKyAgICAgIG91dCA8PCAiOiIgPDwgdHlwZV9uYW1lKHR5cGUpOworICAgIH0KKyAgICBvdXQgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKKyAgICBpZiAoIWluX3N0YXRpYykgeworICAgICAgaW5kZW50KG91dCkgPDwgInsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJuZXcgZnVuY3Rpb24oKTp2b2lkIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICB9CisgICAgdF90eXBlKiBldHlwZTsKKyAgICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIH0gZWxzZSB7CisgICAgICBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfQorICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOworICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGV0eXBlLCAqdl9pdGVyKTsKKyAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIi4iIDw8ICh0eXBlLT5pc19saXN0KCkgPyAicHVzaCIgOiAiYWRkIikgPDwgIigiIDw8IHZhbCA8PCAiKTsiCisgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIH0KKyAgICBpZiAoIWluX3N0YXRpYykgeworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9KCk7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIHR5cGUgIiArIHR5cGUtPmdldF9uYW1lKCk7CisgIH0KK30KKworc3RyaW5nIHRfYXMzX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKyAgKHZvaWQpbmFtZTsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSByZW5kZXI7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJlbmRlciA8PCAnIicgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZW5kZXIgPDwgKCh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDApID8gInRydWUiIDogImZhbHNlIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmVuZGVyIDw8ICIoYnl0ZSkiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZW5kZXIgPDwgIihzaG9ydCkiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiTCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7CisgICAgICAgIHJlbmRlciA8PCAiKGRvdWJsZSkiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgfSBlbHNlIHsKKyAgICBzdHJpbmcgdCA9IHRtcCgidG1wIik7CisgICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LCB0LCB0eXBlLCB2YWx1ZSwgdHJ1ZSk7CisgICAgcmVuZGVyIDw8IHQ7CisgIH0KKworICByZXR1cm4gcmVuZGVyLnN0cigpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuIFRoaXMgaXMgYSBjbGFzcworICogd2l0aCBkYXRhIG1lbWJlcnMsIHJlYWQoKSwgd3JpdGUoKSwgYW5kIGFuIGlubmVyIElzc2V0IGNsYXNzLgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGdlbmVyYXRlX2FzM19zdHJ1Y3QodHN0cnVjdCwgZmFsc2UpOworfQorCisvKioKKyAqIEV4Y2VwdGlvbnMgYXJlIHN0cnVjdHMsIGJ1dCB0aGV5IGluaGVyaXQgZnJvbSBFeGNlcHRpb24KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKKyAgZ2VuZXJhdGVfYXMzX3N0cnVjdCh0eGNlcHRpb24sIHRydWUpOworfQorCisvKioKKyAqIEFzMyBzdHJ1Y3QgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2FzM19zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisgIC8vIE1ha2Ugb3V0cHV0IGZpbGUKKyAgc3RyaW5nIGZfc3RydWN0X25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyAodHN0cnVjdC0+Z2V0X25hbWUoKSkgKyAiLmFzIjsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3N0cnVjdDsKKyAgZl9zdHJ1Y3Qub3BlbihmX3N0cnVjdF9uYW1lLmNfc3RyKCkpOworCisgIGZfc3RydWN0IDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGFzM19wYWNrYWdlKCk7CisKKyAgc2NvcGVfdXAoZl9zdHJ1Y3QpOworICBmX3N0cnVjdCA8PCBlbmRsOworCisgIHN0cmluZyBpbXBvcnRzOworCisgIGZfc3RydWN0IDw8IGFzM190eXBlX2ltcG9ydHMoKSA8PCBhczNfdGhyaWZ0X2ltcG9ydHMoKSA8PCBhczNfdGhyaWZ0X2dlbl9pbXBvcnRzKHRzdHJ1Y3QsIGltcG9ydHMpCisgICAgICAgICAgIDw8IGVuZGw7CisKKyAgaWYgKGJpbmRhYmxlXyAmJiAhaXNfZXhjZXB0aW9uKSB7CisgICAgZl9zdHJ1Y3QgPDwgImltcG9ydCBmbGFzaC5ldmVudHMuRXZlbnQ7IiA8PCBlbmRsIDw8ICJpbXBvcnQgZmxhc2guZXZlbnRzLkV2ZW50RGlzcGF0Y2hlcjsiCisgICAgICAgICAgICAgPDwgZW5kbCA8PCAiaW1wb3J0IG14LmV2ZW50cy5Qcm9wZXJ0eUNoYW5nZUV2ZW50OyIgPDwgZW5kbDsKKyAgfQorCisgIGdlbmVyYXRlX2FzM19zdHJ1Y3RfZGVmaW5pdGlvbihmX3N0cnVjdCwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKKworICBzY29wZV9kb3duKGZfc3RydWN0KTsgLy8gZW5kIG9mIHBhY2thZ2UKKyAgZl9zdHJ1Y3QuY2xvc2UoKTsKK30KKworLyoqCisgKiBBczMgc3RydWN0IGRlZmluaXRpb24uIFRoaXMgaGFzIHZhcmlvdXMgcGFyYW1ldGVycywgYXMgaXQgY291bGQgYmUKKyAqIGdlbmVyYXRlZCBzdGFuZGFsb25lIG9yIGluc2lkZSBhbm90aGVyIGNsYXNzIGFzIGEgaGVscGVyLiBJZiBpdAorICogaXMgYSBoZWxwZXIgdGhhbiBpdCBpcyBhIHN0YXRpYyBjbGFzcy4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCAgICAgIFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICogQHBhcmFtIGlzX2V4Y2VwdGlvbiBJcyB0aGlzIGFuIGV4Y2VwdGlvbj8KKyAqIEBwYXJhbSBpbl9jbGFzcyAgICAgSWYgaW5zaWRlIGEgY2xhc3MsIG5lZWRzIHRvIGJlIHN0YXRpYyBjbGFzcworICogQHBhcmFtIGlzX3Jlc3VsdCAgICBJZiB0aGlzIGlzIGEgcmVzdWx0IGl0IG5lZWRzIGEgZGlmZmVyZW50IHdyaXRlcgorICovCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfYXMzX3N0cnVjdF9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCkgeworICBnZW5lcmF0ZV9hczNfZG9jKG91dCwgdHN0cnVjdCk7CisKKyAgYm9vbCBpc19maW5hbCA9ICh0c3RydWN0LT5hbm5vdGF0aW9uc18uZmluZCgiZmluYWwiKSAhPSB0c3RydWN0LT5hbm5vdGF0aW9uc18uZW5kKCkpOworICBib29sIGJpbmRhYmxlID0gIWlzX2V4Y2VwdGlvbiAmJiAhaW5fY2xhc3MgJiYgYmluZGFibGVfOworCisgIGluZGVudChvdXQpIDw8IChpbl9jbGFzcyA/ICIiIDogInB1YmxpYyAiKSA8PCAoaXNfZmluYWwgPyAiZmluYWwgIiA6ICIiKSA8PCAiY2xhc3MgIgorICAgICAgICAgICAgICA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgIjsKKworICBpZiAoaXNfZXhjZXB0aW9uKSB7CisgICAgb3V0IDw8ICJleHRlbmRzIEVycm9yICI7CisgIH0gZWxzZSBpZiAoYmluZGFibGUpIHsKKyAgICBvdXQgPDwgImV4dGVuZHMgRXZlbnREaXNwYXRjaGVyICI7CisgIH0KKyAgb3V0IDw8ICJpbXBsZW1lbnRzIFRCYXNlICI7CisKKyAgc2NvcGVfdXAob3V0KTsKKworICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBzdGF0aWMgY29uc3QgU1RSVUNUX0RFU0M6VFN0cnVjdCA9IG5ldyBUU3RydWN0KFwiIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgIDw8ICJcIik7IiA8PCBlbmRsOworCisgIC8vIE1lbWJlcnMgYXJlIHB1YmxpYyBmb3IgLWFzMywgcHJpdmF0ZSBmb3IgLWFzM2JlYW4KKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgc3RhdGljIGNvbnN0ICIgPDwgY29uc3RhbnRfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpCisgICAgICAgICAgICAgICAgPDwgIl9GSUVMRF9ERVNDOlRGaWVsZCA9IG5ldyBURmllbGQoXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIsICIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiLCAiIDw8ICgqbV9pdGVyKS0+Z2V0X2tleSgpIDw8ICIpOyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICB9CisKKyAgb3V0IDw8IGVuZGw7CisKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIGdlbmVyYXRlX2FzM19kb2Mob3V0LCAqbV9pdGVyKTsKKyAgICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSB2YXIgXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpICsgIjoiICsgdHlwZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkKKyAgICAgICAgICAgICAgICA8PCAiOyIgPDwgZW5kbDsKKworICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgc3RhdGljIGNvbnN0ICIgPDwgdXBjYXNlX3N0cmluZygoKm1faXRlciktPmdldF9uYW1lKCkpCisgICAgICAgICAgICAgICAgPDwgIjppbnQgPSAiIDw8ICgqbV9pdGVyKS0+Z2V0X2tleSgpIDw8ICI7IiA8PCBlbmRsOworICB9CisKKyAgb3V0IDw8IGVuZGw7CisKKyAgLy8gSW5uZXIgSXNzZXQgY2xhc3MKKyAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgeworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIGlmICghdHlwZV9jYW5fYmVfbnVsbCgoKm1faXRlciktPmdldF90eXBlKCkpKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJwcml2YXRlIHZhciBfX2lzc2V0XyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI6Qm9vbGVhbiA9IGZhbHNlOyIKKyAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBvdXQgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9hczNfbWV0YV9kYXRhX21hcChvdXQsIHRzdHJ1Y3QpOworCisgIC8vIFN0YXRpYyBpbml0aWFsaXplciB0byBwb3B1bGF0ZSBnbG9iYWwgY2xhc3MgdG8gc3RydWN0IG1ldGFkYXRhIG1hcAorICBpbmRlbnQob3V0KSA8PCAieyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJGaWVsZE1ldGFEYXRhLmFkZFN0cnVjdE1ldGFEYXRhTWFwKCIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIsIG1ldGFEYXRhTWFwKTsiCisgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gRGVmYXVsdCBjb25zdHJ1Y3RvcgorICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBpZiAoKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy5fIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIKKyAgICAgICAgICAgICAgICAgIDw8ICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCktPmdldF9pbnRlZ2VyKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICB9CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfYXMzX2JlYW5fYm9pbGVycGxhdGUob3V0LCB0c3RydWN0LCBiaW5kYWJsZSk7CisgIGdlbmVyYXRlX2dlbmVyaWNfZmllbGRfZ2V0dGVyc19zZXR0ZXJzKG91dCwgdHN0cnVjdCk7CisgIGdlbmVyYXRlX2dlbmVyaWNfaXNzZXRfbWV0aG9kKG91dCwgdHN0cnVjdCk7CisKKyAgZ2VuZXJhdGVfYXMzX3N0cnVjdF9yZWFkZXIob3V0LCB0c3RydWN0KTsKKyAgaWYgKGlzX3Jlc3VsdCkgeworICAgIGdlbmVyYXRlX2FzM19zdHJ1Y3RfcmVzdWx0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOworICB9IGVsc2UgeworICAgIGdlbmVyYXRlX2FzM19zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCk7CisgIH0KKyAgZ2VuZXJhdGVfYXMzX3N0cnVjdF90b3N0cmluZyhvdXQsIHRzdHJ1Y3QsIGJpbmRhYmxlKTsKKyAgZ2VuZXJhdGVfYXMzX3ZhbGlkYXRvcihvdXQsIHRzdHJ1Y3QpOworICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGZ1bmN0aW9uIHRvIHJlYWQgYWxsIHRoZSBmaWVsZHMgb2YgdGhlIHN0cnVjdC4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2FzM19zdHJ1Y3RfcmVhZGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgZnVuY3Rpb24gcmVhZChpcHJvdDpUUHJvdG9jb2wpOnZvaWQgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIC8vIERlY2xhcmUgc3RhY2sgdG1wIHZhcmlhYmxlcyBhbmQgcmVhZCBzdHJ1Y3QgaGVhZGVyCisgIG91dCA8PCBpbmRlbnQoKSA8PCAidmFyIGZpZWxkOlRGaWVsZDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlwcm90LnJlYWRTdHJ1Y3RCZWdpbigpOyIgPDwgZW5kbDsKKworICAvLyBMb29wIG92ZXIgcmVhZGluZyBpbiBmaWVsZHMKKyAgaW5kZW50KG91dCkgPDwgIndoaWxlICh0cnVlKSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKworICAvLyBSZWFkIGJlZ2lubmluZyBmaWVsZCBtYXJrZXIKKyAgaW5kZW50KG91dCkgPDwgImZpZWxkID0gaXByb3QucmVhZEZpZWxkQmVnaW4oKTsiIDw8IGVuZGw7CisKKyAgLy8gQ2hlY2sgZm9yIGZpZWxkIFNUT1AgbWFya2VyIGFuZCBicmVhaworICBpbmRlbnQob3V0KSA8PCAiaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuU1RPUCkgeyAiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICAvLyBTd2l0Y2ggc3RhdGVtZW50IG9uIHRoZSBmaWVsZCB3ZSBhcmUgcmVhZGluZworICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChmaWVsZC5pZCkiIDw8IGVuZGw7CisKKyAgc2NvcGVfdXAob3V0KTsKKworICAvLyBHZW5lcmF0ZSBkZXNlcmlhbGl6YXRpb24gY29kZSBmb3Iga25vd24gY2FzZXMKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IHVwY2FzZV9zdHJpbmcoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKGZpZWxkLnR5cGUgPT0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAidGhpcy4iKTsKKyAgICBnZW5lcmF0ZV9pc3NldF9zZXQob3V0LCAqZl9pdGVyKTsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsgIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIFRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7IgorICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIC8vIEluIHRoZSBkZWZhdWx0IGNhc2Ugd2Ugc2tpcCB0aGUgZmllbGQKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOyIKKyAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgYnJlYWs7IiA8PCBlbmRsOworCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICAvLyBSZWFkIGZpZWxkIGVuZCBtYXJrZXIKKyAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRGaWVsZEVuZCgpOyIgPDwgZW5kbDsKKworICBzY29wZV9kb3duKG91dCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpcHJvdC5yZWFkU3RydWN0RW5kKCk7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gaW4gbm9uLWJlYW5zIHN0eWxlLCBjaGVjayBmb3IgcmVxdWlyZWQgZmllbGRzIG9mIHByaW1pdGl2ZSB0eXBlCisgIC8vICh3aGljaCBjYW4gYmUgY2hlY2tlZCBoZXJlIGJ1dCBub3QgaW4gdGhlIGdlbmVyYWwgdmFsaWRhdGUgbWV0aG9kKQorICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiLy8gY2hlY2sgZm9yIHJlcXVpcmVkIGZpZWxkcyBvZiBwcmltaXRpdmUgdHlwZSwgd2hpY2ggY2FuJ3QgYmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2hlY2tlZCBpbiB0aGUgdmFsaWRhdGUgbWV0aG9kIiA8PCBlbmRsOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEICYmICF0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCFfX2lzc2V0XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAiICB0aHJvdyBuZXcgVFByb3RvY29sRXJyb3IoVFByb3RvY29sRXJyb3IuVU5LTk9XTiwgXCJSZXF1aXJlZCBmaWVsZCAnIgorICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgIDw8ICInIHdhcyBub3QgZm91bmQgaW4gc2VyaWFsaXplZCBkYXRhISBTdHJ1Y3Q6IFwiICsgdG9TdHJpbmcoKSk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgLy8gcGVyZm9ybXMgdmFyaW91cyBjaGVja3MgKGUuZy4gY2hlY2sgdGhhdCBhbGwgcmVxdWlyZWQgZmllbGRzIGFyZSBzZXQpCisgIGluZGVudChvdXQpIDw8ICJ2YWxpZGF0ZSgpOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLy8gZ2VuZXJhdGVzIGFzMyBtZXRob2QgdG8gcGVyZm9ybSB2YXJpb3VzIGNoZWNrcworLy8gKGUuZy4gY2hlY2sgdGhhdCBhbGwgcmVxdWlyZWQgZmllbGRzIGFyZSBzZXQpCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfYXMzX3ZhbGlkYXRvcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuY3Rpb24gdmFsaWRhdGUoKTp2b2lkIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgIi8vIGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMiIDw8IGVuZGw7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID09IG51bGwpIHsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBUUHJvdG9jb2xFcnJvcihUUHJvdG9jb2xFcnJvci5VTktOT1dOLCBcIlJlcXVpcmVkIGZpZWxkICciCisgICAgICAgICAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJyB3YXMgbm90IHByZXNlbnQhIFN0cnVjdDogXCIgKyB0b1N0cmluZygpKTsiCisgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIi8vIGFsYXMsIHdlIGNhbm5vdCBjaGVjayAnIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgPDwgIicgYmVjYXVzZSBpdCdzIGEgcHJpbWl0aXZlIGFuZCB5b3UgY2hvc2UgdGhlIG5vbi1iZWFucyBnZW5lcmF0b3IuIiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIGNoZWNrIHRoYXQgZmllbGRzIG9mIHR5cGUgZW51bSBoYXZlIHZhbGlkIHZhbHVlcworICBvdXQgPDwgaW5kZW50KCkgPDwgIi8vIGNoZWNrIHRoYXQgZmllbGRzIG9mIHR5cGUgZW51bSBoYXZlIHZhbGlkIHZhbHVlcyIgPDwgZW5kbDsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqZl9pdGVyKTsKKyAgICB0X3R5cGUqIHR5cGUgPSBmaWVsZC0+Z2V0X3R5cGUoKTsKKyAgICAvLyBpZiBmaWVsZCBpcyBhbiBlbnVtLCBjaGVjayB0aGF0IGl0cyB2YWx1ZSBpcyB2YWxpZAorICAgIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjayhmaWVsZCkgPDwgIiAmJiAhIiA8PCBnZXRfZW51bV9jbGFzc19uYW1lKHR5cGUpCisgICAgICAgICAgICAgICAgICA8PCAiLlZBTElEX1ZBTFVFUy5jb250YWlucygiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIpKXsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ0aHJvdyBuZXcgVFByb3RvY29sRXJyb3IoVFByb3RvY29sRXJyb3IuVU5LTk9XTiwgXCJUaGUgZmllbGQgJyIKKyAgICAgICAgICAgICAgICAgIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICInIGhhcyBiZWVuIGFzc2lnbmVkIHRoZSBpbnZhbGlkIHZhbHVlIFwiICsgIgorICAgICAgICAgICAgICAgICAgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIik7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gd3JpdGUgYWxsIHRoZSBmaWVsZHMgb2YgdGhlIHN0cnVjdAorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfYXMzX3N0cnVjdF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBmdW5jdGlvbiB3cml0ZShvcHJvdDpUUHJvdG9jb2wpOnZvaWQgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIC8vIHBlcmZvcm1zIHZhcmlvdXMgY2hlY2tzIChlLmcuIGNoZWNrIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgc2V0KQorICBpbmRlbnQob3V0KSA8PCAidmFsaWRhdGUoKTsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbihTVFJVQ1RfREVTQyk7IiA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgYm9vbCBjb3VsZF9iZV91bnNldCA9ICgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUw7CisgICAgaWYgKGNvdWxkX2JlX3Vuc2V0KSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKmZfaXRlcikgPDwgIikgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKyAgICBib29sIG51bGxfYWxsb3dlZCA9IHR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICBpZiAobnVsbF9hbGxvd2VkKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICh0aGlzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUZpZWxkQmVnaW4oIiA8PCBjb25zdGFudF9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkKKyAgICAgICAgICAgICAgICA8PCAiX0ZJRUxEX0RFU0MpOyIgPDwgZW5kbDsKKworICAgIC8vIFdyaXRlIGZpZWxkIGNvbnRlbnRzCisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMuIik7CisKKyAgICAvLyBXcml0ZSBmaWVsZCBjbG9zZXIKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVGaWVsZEVuZCgpOyIgPDwgZW5kbDsKKworICAgIGlmIChudWxsX2FsbG93ZWQpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgICAgaWYgKGNvdWxkX2JlX3Vuc2V0KSB7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICB9CisgIC8vIFdyaXRlIHRoZSBzdHJ1Y3QgbWFwCisgIG91dCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVGaWVsZFN0b3AoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlU3RydWN0RW5kKCk7IgorICAgICAgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbiB0byB3cml0ZSBhbGwgdGhlIGZpZWxkcyBvZiB0aGUgc3RydWN0LAorICogd2hpY2ggaXMgYSBmdW5jdGlvbiByZXN1bHQuIFRoZXNlIGZpZWxkcyBhcmUgb25seSB3cml0dGVuCisgKiBpZiB0aGV5IGFyZSBzZXQgaW4gdGhlIElzc2V0IGFycmF5LCBhbmQgb25seSBvbmUgb2YgdGhlbQorICogY2FuIGJlIHNldCBhdCBhIHRpbWUuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9hczNfc3RydWN0X3Jlc3VsdF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBmdW5jdGlvbiB3cml0ZShvcHJvdDpUUHJvdG9jb2wpOnZvaWQgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZVN0cnVjdEJlZ2luKFNUUlVDVF9ERVNDKTsiIDw8IGVuZGw7CisKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlmICI7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCAiIGVsc2UgaWYgIjsKKyAgICB9CisKKyAgICBvdXQgPDwgIih0aGlzLiIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKmZfaXRlcikgPDwgIikgeyIgPDwgZW5kbDsKKworICAgIGluZGVudF91cCgpOworCisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlRmllbGRCZWdpbigiIDw8IGNvbnN0YW50X25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgIDw8ICJfRklFTERfREVTQyk7IiA8PCBlbmRsOworCisgICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAidGhpcy4iKTsKKworICAgIC8vIFdyaXRlIGZpZWxkIGNsb3NlcgorICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOworCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSI7CisgIH0KKyAgLy8gV3JpdGUgdGhlIHN0cnVjdCBtYXAKKyAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlRmllbGRTdG9wKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAib3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yZWZsZWN0aW9uX2dldHRlcnMob3N0cmluZ3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY2FwX25hbWUpIHsKKyAgKHZvaWQpdHlwZTsKKyAgKHZvaWQpY2FwX25hbWU7CisgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgdXBjYXNlX3N0cmluZyhmaWVsZF9uYW1lKSA8PCAiOiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIjsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7Cit9CisKK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yZWZsZWN0aW9uX3NldHRlcnMob3N0cmluZ3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY2FwX25hbWUpIHsKKyAgKHZvaWQpdHlwZTsKKyAgKHZvaWQpY2FwX25hbWU7CisgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgdXBjYXNlX3N0cmluZyhmaWVsZF9uYW1lKSA8PCAiOiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJpZiAodmFsdWUgPT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgdW5zZXQiIDw8IGdldF9jYXBfbmFtZShmaWVsZF9uYW1lKSA8PCAiKCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSB2YWx1ZTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiYnJlYWs7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKK30KKwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2dlbmVyaWNfZmllbGRfZ2V0dGVyc19zZXR0ZXJzKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7CisKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIGdldHRlcl9zdHJlYW07CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzZXR0ZXJfc3RyZWFtOworCisgIC8vIGJ1aWxkIHVwIHRoZSBib2RpZXMgb2YgYm90aCB0aGUgZ2V0dGVyIGFuZCBzZXR0ZXIgYXQgb25jZQorICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAqZl9pdGVyOworICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUoZmllbGQtPmdldF90eXBlKCkpOworICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSBmaWVsZC0+Z2V0X25hbWUoKTsKKyAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSA9IGdldF9jYXBfbmFtZShmaWVsZF9uYW1lKTsKKworICAgIGluZGVudF91cCgpOworICAgIGdlbmVyYXRlX3JlZmxlY3Rpb25fc2V0dGVycyhzZXR0ZXJfc3RyZWFtLCB0eXBlLCBmaWVsZF9uYW1lLCBjYXBfbmFtZSk7CisgICAgZ2VuZXJhdGVfcmVmbGVjdGlvbl9nZXR0ZXJzKGdldHRlcl9zdHJlYW0sIHR5cGUsIGZpZWxkX25hbWUsIGNhcF9uYW1lKTsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgLy8gY3JlYXRlIHRoZSBzZXR0ZXIKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jdGlvbiBzZXRGaWVsZFZhbHVlKGZpZWxkSUQ6aW50LCB2YWx1ZToqKTp2b2lkIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKGZpZWxkSUQpIHsiIDw8IGVuZGw7CisKKyAgb3V0IDw8IHNldHRlcl9zdHJlYW0uc3RyKCk7CisKKyAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcihcIkZpZWxkIFwiICsgZmllbGRJRCArIFwiIGRvZXNuJ3QgZXhpc3QhXCIpOyIgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIGNyZWF0ZSB0aGUgZ2V0dGVyCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuY3Rpb24gZ2V0RmllbGRWYWx1ZShmaWVsZElEOmludCk6KiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChmaWVsZElEKSB7IiA8PCBlbmRsOworCisgIG91dCA8PCBnZXR0ZXJfc3RyZWFtLnN0cigpOworCisgIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoXCJGaWVsZCBcIiArIGZpZWxkSUQgKyBcIiBkb2Vzbid0IGV4aXN0IVwiKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvLyBDcmVhdGVzIGEgZ2VuZXJpYyBpc1NldCBtZXRob2QgdGhhdCB0YWtlcyB0aGUgZmllbGQgbnVtYmVyIGFzIGFyZ3VtZW50Cit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ2VuZXJpY19pc3NldF9tZXRob2Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAvLyBjcmVhdGUgdGhlIGlzU2V0IG1ldGhvZAorICBpbmRlbnQob3V0KSA8PCAiLy8gUmV0dXJucyB0cnVlIGlmIGZpZWxkIGNvcnJlc3BvbmRpbmcgdG8gZmllbGRJRCBpcyBzZXQgKGhhcyBiZWVuIGFzc2lnbmVkIGEgIgorICAgICAgICAgICAgICAgICAidmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuY3Rpb24gaXNTZXQoZmllbGRJRDppbnQpOkJvb2xlYW4geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKGZpZWxkSUQpIHsiIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICpmX2l0ZXI7CisgICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCB1cGNhc2Vfc3RyaW5nKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuICIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQpIDw8ICI7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKFwiRmllbGQgXCIgKyBmaWVsZElEICsgXCIgZG9lc24ndCBleGlzdCFcIik7IiA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2V0IG9mIEFzMyBCZWFuIGJvaWxlcnBsYXRlIGZ1bmN0aW9ucyAoc2V0dGVycywgZ2V0dGVycywgZXRjLikKKyAqIGZvciB0aGUgZ2l2ZW4gc3RydWN0LgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfYXMzX2JlYW5fYm9pbGVycGxhdGUob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYmluZGFibGUpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfZmllbGQqIGZpZWxkID0gKmZfaXRlcjsKKyAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lID0gZmllbGQtPmdldF9uYW1lKCk7CisgICAgc3RkOjpzdHJpbmcgY2FwX25hbWUgPSBnZXRfY2FwX25hbWUoZmllbGRfbmFtZSk7CisKKyAgICAvLyBTaW1wbGUgZ2V0dGVyCisgICAgZ2VuZXJhdGVfYXMzX2RvYyhvdXQsIGZpZWxkKTsKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIGdldCAiIDw8IGZpZWxkX25hbWUgPDwgIigpOiIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRoaXMuXyIgPDwgZmllbGRfbmFtZSA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAvLyBTaW1wbGUgc2V0dGVyCisgICAgZ2VuZXJhdGVfYXMzX2RvYyhvdXQsIGZpZWxkKTsKKyAgICBzdGQ6OnN0cmluZyBwcm9wTmFtZSA9IHRtcCgidGhyaWZ0UHJvcGVydHlDaGFuZ2UiKTsKKyAgICBpZiAoYmluZGFibGUpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJbQmluZGFibGUoZXZlbnQ9XCIiIDw8IHByb3BOYW1lIDw8ICJcIildIiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIHNldCAiIDw8IGZpZWxkX25hbWUgPDwgIigiIDw8IGZpZWxkX25hbWUgPDwgIjoiCisgICAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIpOnZvaWQgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAidGhpcy5fIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSAiIDw8IGZpZWxkX25hbWUgPDwgIjsiIDw8IGVuZGw7CisgICAgZ2VuZXJhdGVfaXNzZXRfc2V0KG91dCwgZmllbGQpOworCisgICAgaWYgKGJpbmRhYmxlKSB7CisgICAgICAvLyBXZSBoYXZlIHRvIHVzZSBhIGN1c3RvbSBldmVudCByYXRoZXIgdGhhbiB0aGUgZGVmYXVsdCwgYmVjYXVzZSBpZiB5b3UgdXNlIHRoZSBkZWZhdWx0LAorICAgICAgLy8gdGhlIHNldHRlciBvbmx5IGdldHMgY2FsbGVkIGlmIHRoZSB2YWx1ZSBoYXMgY2hhbmdlZCAtIHRoaXMgbWVhbnMgY2FsbGluZworICAgICAgLy8gZm9vLnNldEludFZhbHVlKDApCisgICAgICAvLyB3aWxsIG5vdCBjYXVzZSBmb28uaXNJbnRWYWx1ZVNldCgpIHRvIHJldHVybiB0cnVlIHNpbmNlIHRoZSB2YWx1ZSBvZiBmb28uX2ludFZhbHVlIHdhc24ndAorICAgICAgLy8gY2hhbmdlZAorICAgICAgLy8gc28gdGhlIHNldHRlciB3YXMgbmV2ZXIgY2FsbGVkLgorICAgICAgaW5kZW50KG91dCkgPDwgImRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KFwiIiA8PCBwcm9wTmFtZSA8PCAiXCIpKTsiIDw8IGVuZGw7CisKKyAgICAgIC8vIEhvd2V2ZXIsIGlmIHlvdSBqdXN0IHVzZSBhIGN1c3RvbSBldmVudCwgdGhlbiBjb2xsZWN0aW9ucyB3b24ndCBiZSBhYmxlIHRvIGRldGVjdCB3aGVuCisgICAgICAvLyBlbGVtZW50cworICAgICAgLy8gaW4gdGhlIGNvbGxlY3Rpb25zIGhhdmUgY2hhbmdlZCBzaW5jZSB0aGV5IGxpc3RlZCBmb3IgUHJvcGVydHlDaGFuZ2VFdmVudHMuICBTbywgd2UKKyAgICAgIC8vIGRpc3BhdGNoIGJvdGguCisgICAgICBpbmRlbnQob3V0KSA8PCAiZGlzcGF0Y2hFdmVudChuZXcgUHJvcGVydHlDaGFuZ2VFdmVudChQcm9wZXJ0eUNoYW5nZUV2ZW50LlBST1BFUlRZX0NIQU5HRSkpOyIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIC8vIFVuc2V0dGVyCisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jdGlvbiB1bnNldCIgPDwgY2FwX25hbWUgPDwgIigpOnZvaWQgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0eXBlKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSBudWxsOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuX19pc3NldF8iIDw8IGZpZWxkX25hbWUgPDwgIiA9IGZhbHNlOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgLy8gaXNTZXQgbWV0aG9kCisgICAgaW5kZW50KG91dCkgPDwgIi8vIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCAiIDw8IGZpZWxkX25hbWUKKyAgICAgICAgICAgICAgICA8PCAiIGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSB2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZSIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIGlzIiA8PCBnZXRfY2FwX25hbWUoInNldCIpIDw8IGNhcF9uYW1lIDw8ICIoKTpCb29sZWFuIHsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0eXBlKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiB0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiICE9IG51bGw7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRoaXMuX19pc3NldF8iIDw8IGZpZWxkX25hbWUgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHRvU3RyaW5nKCkgbWV0aG9kIGZvciB0aGUgZ2l2ZW4gc3RydWN0CisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9hczNfc3RydWN0X3Rvc3RyaW5nKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiaW5kYWJsZSkgeworICAvLyBJZiBpdCdzIGJpbmRhYmxlLCBpdCBleHRlbmRzIEV2ZW50RGlzcGF0Y2hlciBzbyB0b1N0cmluZyBpcyBhbiBvdmVycmlkZS4KKyAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgIiA8PCAoYmluZGFibGUgPyAib3ZlcnJpZGUgIiA6ICIiKSA8PCAiZnVuY3Rpb24gdG9TdHJpbmcoKTpTdHJpbmcgeyIKKyAgICAgIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAidmFyIHJldDpTdHJpbmcgPSBuZXcgU3RyaW5nKFwiIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoXCIpOyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YXIgZmlyc3Q6Qm9vbGVhbiA9IHRydWU7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBib29sIGNvdWxkX2JlX3Vuc2V0ID0gKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTDsKKyAgICBpZiAoY291bGRfYmVfdW5zZXQpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygqZl9pdGVyKSA8PCAiKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorCisgICAgdF9maWVsZCogZmllbGQgPSAoKmZfaXRlcik7CisKKyAgICBpZiAoIWZpcnN0KSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCFmaXJzdCkgcmV0ICs9ICBcIiwgXCI7IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnQob3V0KSA8PCAicmV0ICs9IFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIjpcIjsiIDw8IGVuZGw7CisgICAgYm9vbCBjYW5fYmVfbnVsbCA9IHR5cGVfY2FuX2JlX251bGwoZmllbGQtPmdldF90eXBlKCkpOworICAgIGlmIChjYW5fYmVfbnVsbCkgeworICAgICAgaW5kZW50KG91dCkgPDwgImlmICh0aGlzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgIHJldCArPSBcIm51bGxcIjsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICB9CisKKyAgICBpZiAoZmllbGQtPmdldF90eXBlKCktPmlzX2JpbmFyeSgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICByZXQgKz0gXCJCSU5BUllcIjsiIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmIChmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfZW51bSgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAidmFyICIgPDwgZmllbGQtPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgIDw8ICJfbmFtZTpTdHJpbmcgPSAiIDw8IGdldF9lbnVtX2NsYXNzX25hbWUoZmllbGQtPmdldF90eXBlKCkpCisgICAgICAgICAgICAgICAgICA8PCAiLlZBTFVFU19UT19OQU1FU1t0aGlzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJdOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiX25hbWUgIT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgIHJldCArPSAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICJfbmFtZTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICByZXQgKz0gXCIgKFwiOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgInJldCArPSB0aGlzLiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIl9uYW1lICE9IG51bGwpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICByZXQgKz0gXCIpXCI7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJyZXQgKz0gdGhpcy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpZiAoY2FuX2JlX251bGwpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50KG91dCkgPDwgImZpcnN0ID0gZmFsc2U7IiA8PCBlbmRsOworCisgICAgaWYgKGNvdWxkX2JlX3Vuc2V0KSB7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICAgIGZpcnN0ID0gZmFsc2U7CisgIH0KKyAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXQgKz0gXCIpXCI7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gcmV0OyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0YXRpYyBtYXAgd2l0aCBtZXRhIGRhdGEgdG8gc3RvcmUgaW5mb3JtYXRpb24gc3VjaCBhcyBmaWVsZElEIHRvCisgKiBmaWVsZE5hbWUgbWFwcGluZworICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfYXMzX21ldGFfZGF0YV9tYXAob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgLy8gU3RhdGljIE1hcCB3aXRoIGZpZWxkSUQgLT4gRmllbGRNZXRhRGF0YSBtYXBwaW5ncworICBpbmRlbnQob3V0KSA8PCAicHVibGljIHN0YXRpYyBjb25zdCBtZXRhRGF0YU1hcDpEaWN0aW9uYXJ5ID0gbmV3IERpY3Rpb25hcnkoKTsiIDw8IGVuZGw7CisKKyAgaWYgKGZpZWxkcy5zaXplKCkgPiAwKSB7CisgICAgLy8gUG9wdWxhdGUgbWFwCisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgdF9maWVsZCogZmllbGQgPSAqZl9pdGVyOworICAgICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9IGZpZWxkLT5nZXRfbmFtZSgpOworICAgICAgaW5kZW50KG91dCkgPDwgIm1ldGFEYXRhTWFwWyIgPDwgdXBjYXNlX3N0cmluZyhmaWVsZF9uYW1lKSA8PCAiXSA9IG5ldyBGaWVsZE1ldGFEYXRhKFwiIgorICAgICAgICAgICAgICAgICAgPDwgZmllbGRfbmFtZSA8PCAiXCIsICI7CisKKyAgICAgIC8vIFNldCBmaWVsZCByZXF1aXJlbWVudCB0eXBlIChyZXF1aXJlZCwgb3B0aW9uYWwsIGV0Yy4pCisgICAgICBpZiAoZmllbGQtPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICAgIG91dCA8PCAiVEZpZWxkUmVxdWlyZW1lbnRUeXBlLlJFUVVJUkVELCAiOworICAgICAgfSBlbHNlIGlmIChmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKKyAgICAgICAgb3V0IDw8ICJURmllbGRSZXF1aXJlbWVudFR5cGUuT1BUSU9OQUwsICI7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgIlRGaWVsZFJlcXVpcmVtZW50VHlwZS5ERUZBVUxULCAiOworICAgICAgfQorCisgICAgICAvLyBDcmVhdGUgdmFsdWUgbWV0YSBkYXRhCisgICAgICBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEob3V0LCBmaWVsZC0+Z2V0X3R5cGUoKSk7CisgICAgICBvdXQgPDwgIik7IiA8PCBlbmRsOworICAgIH0KKyAgICBzY29wZV9kb3duKG91dCk7CisgIH0KK30KKworLyoqCisgKiBSZXR1cm5zIGEgc3RyaW5nIHdpdGggdGhlIGFzMyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gdGhyaWZ0IHR5cGUKKyAqIChlLmcuIGZvciB0aGUgdHlwZSBzdHJ1Y3QgaXQgcmV0dXJucyAiVFR5cGUuU1RSVUNUIikKKyAqLworc3RkOjpzdHJpbmcgdF9hczNfZ2VuZXJhdG9yOjpnZXRfYXMzX3R5cGVfc3RyaW5nKHRfdHlwZSogdHlwZSkgeworICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5MSVNUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAiVFR5cGUuTUFQIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAiVFR5cGUuU0VUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICJUVHlwZS5TVFJVQ1QiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiVFR5cGUuSTMyIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICByZXR1cm4gZ2V0X2FzM190eXBlX3N0cmluZygoKHRfdHlwZWRlZiopdHlwZSktPmdldF90eXBlKCkpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgc3dpdGNoICgoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHJldHVybiAiVFR5cGUuVk9JRCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAiVFR5cGUuU1RSSU5HIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiVFR5cGUuQk9PTCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmV0dXJuICJUVHlwZS5CWVRFIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmV0dXJuICJUVHlwZS5JMTYiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gIlRUeXBlLkkzMiI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiVFR5cGUuSTY0IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICJUVHlwZS5ET1VCTEUiOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcigiVW5rbm93biB0aHJpZnQgdHlwZSBcIiIgKyB0eXBlLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXCIgcGFzc2VkIHRvIHRfYXMzX2dlbmVyYXRvcjo6Z2V0X2FzM190eXBlX3N0cmluZyEiKTsKKyAgICAgIGJyZWFrOyAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4hCisgICAgfQorICB9IGVsc2UgeworICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcigKKyAgICAgICAgIlVua25vd24gdGhyaWZ0IHR5cGUgXCIiICsgdHlwZS0+Z2V0X25hbWUoKQorICAgICAgICArICJcIiBwYXNzZWQgdG8gdF9hczNfZ2VuZXJhdG9yOjpnZXRfYXMzX3R5cGVfc3RyaW5nISIpOyAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4hCisgIH0KK30KKwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlKSB7CisgIG91dCA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50X3VwKCk7CisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm5ldyBTdHJ1Y3RNZXRhRGF0YShUVHlwZS5TVFJVQ1QsICIgPDwgdHlwZV9uYW1lKHR5cGUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIm5ldyBMaXN0TWV0YURhdGEoVFR5cGUuTElTVCwgIjsKKyAgICAgIHRfdHlwZSogZWxlbV90eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgICBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEob3V0LCBlbGVtX3R5cGUpOworICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJuZXcgU2V0TWV0YURhdGEoVFR5cGUuU0VULCAiOworICAgICAgdF90eXBlKiBlbGVtX3R5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICAgIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShvdXQsIGVsZW1fdHlwZSk7CisgICAgfSBlbHNlIHsgLy8gbWFwCisgICAgICBpbmRlbnQob3V0KSA8PCAibmV3IE1hcE1ldGFEYXRhKFRUeXBlLk1BUCwgIjsKKyAgICAgIHRfdHlwZSoga2V5X3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgICB0X3R5cGUqIHZhbF90eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOworICAgICAgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKG91dCwga2V5X3R5cGUpOworICAgICAgb3V0IDw8ICIsICI7CisgICAgICBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEob3V0LCB2YWxfdHlwZSk7CisgICAgfQorICB9IGVsc2UgeworICAgIGluZGVudChvdXQpIDw8ICJuZXcgRmllbGRWYWx1ZU1ldGFEYXRhKCIgPDwgZ2V0X2FzM190eXBlX3N0cmluZyh0eXBlKTsKKyAgfQorICBvdXQgPDwgIikiOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnRfZG93bigpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHRocmlmdCBzZXJ2aWNlLiBJbiBDKyssIHRoaXMgY29tcHJpc2VzIGFuIGVudGlyZWx5IHNlcGFyYXRlCisgKiBoZWFkZXIgYW5kIHNvdXJjZSBmaWxlLiBUaGUgaGVhZGVyIGZpbGUgZGVmaW5lcyB0aGUgbWV0aG9kcyBhbmQgaW5jbHVkZXMKKyAqIHRoZSBkYXRhIHR5cGVzIGRlZmluZWQgaW4gdGhlIG1haW4gaGVhZGVyIGZpbGUsIGFuZCB0aGUgaW1wbGVtZW50YXRpb24KKyAqIGZpbGUgY29udGFpbnMgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBiYXNpYyBwcmludGVyIGFuZCBkZWZhdWx0IGludGVyZmFjZXMuCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGRlZmluaXRpb24KKyAqLwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICAvLyBNYWtlIGludGVyZmFjZSBmaWxlCisgIHN0cmluZyBmX3NlcnZpY2VfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArIHNlcnZpY2VfbmFtZV8gKyAiLmFzIjsKKyAgZl9zZXJ2aWNlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOworCisgIGZfc2VydmljZV8gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgYXMzX3BhY2thZ2UoKTsKKworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICBmX3NlcnZpY2VfIDw8IGVuZGwgPDwgYXMzX3R5cGVfaW1wb3J0cygpIDw8IGFzM190aHJpZnRfaW1wb3J0cygpCisgICAgICAgICAgICAgPDwgYXMzX3RocmlmdF9nZW5faW1wb3J0cyh0c2VydmljZSk7CisKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICB0X3R5cGUqIHBhcmVudCA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworICAgIHN0cmluZyBwYXJlbnRfbmFtZXNwYWNlID0gcGFyZW50LT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZXNwYWNlKCJhczMiKTsKKyAgICBpZiAoIXBhcmVudF9uYW1lc3BhY2UuZW1wdHkoKSAmJiBwYXJlbnRfbmFtZXNwYWNlICE9IHBhY2thZ2VfbmFtZV8pIHsKKyAgICAgIGZfc2VydmljZV8gPDwgImltcG9ydCAiIDw8IHR5cGVfbmFtZShwYXJlbnQpIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSk7CisKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXy5jbG9zZSgpOworCisgIC8vIE5vdyBtYWtlIHRoZSBpbXBsZW1lbnRhdGlvbi9jbGllbnQgZmlsZQorICBmX3NlcnZpY2VfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArIHNlcnZpY2VfbmFtZV8gKyAiSW1wbC5hcyI7CisgIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKKworICBmX3NlcnZpY2VfIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGFzM19wYWNrYWdlKCk7CisKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsIDw8IGFzM190eXBlX2ltcG9ydHMoKSA8PCBhczNfdGhyaWZ0X2ltcG9ydHMoKQorICAgICAgICAgICAgIDw8IGFzM190aHJpZnRfZ2VuX2ltcG9ydHModHNlcnZpY2UpOworCisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgdF90eXBlKiBwYXJlbnQgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKKyAgICBzdHJpbmcgcGFyZW50X25hbWVzcGFjZSA9IHBhcmVudC0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWVzcGFjZSgiYXMzIik7CisgICAgaWYgKCFwYXJlbnRfbmFtZXNwYWNlLmVtcHR5KCkgJiYgcGFyZW50X25hbWVzcGFjZSAhPSBwYWNrYWdlX25hbWVfKSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICJpbXBvcnQgIiA8PCB0eXBlX25hbWUocGFyZW50KSA8PCAiSW1wbDsiIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlKTsKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKworICBmX3NlcnZpY2VfIDw8IGFzM190eXBlX2ltcG9ydHMoKTsKKyAgZl9zZXJ2aWNlXyA8PCBhczNfdGhyaWZ0X2ltcG9ydHMoKTsKKyAgZl9zZXJ2aWNlXyA8PCBhczNfdGhyaWZ0X2dlbl9pbXBvcnRzKHRzZXJ2aWNlKTsKKyAgaWYgKCFwYWNrYWdlX25hbWVfLmVtcHR5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8ICJpbXBvcnQgIiA8PCBwYWNrYWdlX25hbWVfIDw8ICIuKjsiIDw8IGVuZGw7CisgIH0KKworICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOworCisgIGZfc2VydmljZV8uY2xvc2UoKTsKKworICAvLyBOb3cgbWFrZSB0aGUgcHJvY2Vzc29yL3NlcnZlciBmaWxlCisgIGZfc2VydmljZV9uYW1lID0gcGFja2FnZV9kaXJfICsgIi8iICsgc2VydmljZV9uYW1lXyArICJQcm9jZXNzb3IuYXMiOworICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7CisKKyAgZl9zZXJ2aWNlXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBhczNfcGFja2FnZSgpOworCisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgIGZfc2VydmljZV8gPDwgZW5kbCA8PCBhczNfdHlwZV9pbXBvcnRzKCkgPDwgYXMzX3RocmlmdF9pbXBvcnRzKCkKKyAgICAgICAgICAgICA8PCBhczNfdGhyaWZ0X2dlbl9pbXBvcnRzKHRzZXJ2aWNlKSA8PCBlbmRsOworCisgIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRzZXJ2aWNlKTsKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKworICBmX3NlcnZpY2VfIDw8IGFzM190eXBlX2ltcG9ydHMoKTsKKyAgZl9zZXJ2aWNlXyA8PCBhczNfdGhyaWZ0X2ltcG9ydHMoKTsKKyAgZl9zZXJ2aWNlXyA8PCBhczNfdGhyaWZ0X2dlbl9pbXBvcnRzKHRzZXJ2aWNlKSA8PCBlbmRsOworICBpZiAoIXBhY2thZ2VfbmFtZV8uZW1wdHkoKSkgeworICAgIGZfc2VydmljZV8gPDwgImltcG9ydCAiIDw8IHBhY2thZ2VfbmFtZV8gPDwgIi4qOyIgPDwgZW5kbDsKKyAgfQorCisgIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7CisKKyAgZl9zZXJ2aWNlXy5jbG9zZSgpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgaW50ZXJmYWNlIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCisgKi8KK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBleHRlbmRzX2lmYWNlID0gIiI7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kc19pZmFjZSA9ICIgZXh0ZW5kcyAiICsgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCk7CisgIH0KKworICBnZW5lcmF0ZV9hczNfZG9jKGZfc2VydmljZV8sIHRzZXJ2aWNlKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicHVibGljIGludGVyZmFjZSAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgZXh0ZW5kc19pZmFjZSA8PCAiIHsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZ2VuZXJhdGVfYXMzX2RvYyhmX3NlcnZpY2VfLCAqZl9pdGVyKTsKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIi8vZnVuY3Rpb24gb25FcnJvcihFcnJvcik6dm9pZDsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiLy9mdW5jdGlvbiBvblN1Y2Nlc3MoKTp2b2lkOyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiLy9mdW5jdGlvbiBvbkVycm9yKEVycm9yKTp2b2lkOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIvL2Z1bmN0aW9uIG9uU3VjY2VzcygiIDw8IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiKTp2b2lkOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgc3RydWN0cyBmb3IgYWxsIHRoZSBzZXJ2aWNlIGFyZ3MgYW5kIHJldHVybiB0eXBlcworICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZQorICovCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9zdHJ1Y3QqIHRzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIGdlbmVyYXRlX2FzM19zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCB0cywgZmFsc2UsIHRydWUpOworICAgIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnMoKmZfaXRlcik7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGNsaWVudCBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCisgKi8KK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX2NsaWVudCA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKTsKKyAgICBleHRlbmRzX2NsaWVudCA9ICIgZXh0ZW5kcyAiICsgZXh0ZW5kcyArICJJbXBsIjsKKyAgfQorCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIGNsYXNzICIgPDwgc2VydmljZV9uYW1lXyA8PCAiSW1wbCIgPDwgZXh0ZW5kc19jbGllbnQKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIgaW1wbGVtZW50cyAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBmdW5jdGlvbiAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkltcGwiCisgICAgICAgICAgICAgICAgICAgICA8PCAiKGlwcm90OlRQcm90b2NvbCwgb3Byb3Q6VFByb3RvY29sPW51bGwpIiA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlwcm90XyA9IGlwcm90OyIgPDwgZW5kbDsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAob3Byb3QgPT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJvcHJvdF8gPSBpcHJvdDsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJvcHJvdF8gPSBvcHJvdDsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IjsKKyAgfSBlbHNlIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJzdXBlcihpcHJvdCwgb3Byb3QpOyIgPDwgZW5kbDsKKyAgfQorICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInByb3RlY3RlZCB2YXIgaXByb3RfOlRQcm90b2NvbDsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICJwcm90ZWN0ZWQgdmFyIG9wcm90XzpUUHJvdG9jb2w7IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICJwcm90ZWN0ZWQgdmFyIHNlcWlkXzppbnQ7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBmdW5jdGlvbiBnZXRJbnB1dFByb3RvY29sKCk6VFByb3RvY29sIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIHRoaXMuaXByb3RfOyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIGZ1bmN0aW9uIGdldE91dHB1dFByb3RvY29sKCk6VFByb3RvY29sIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIHRoaXMub3Byb3RfOyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgfQorCisgIC8vIEdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworCisgICAgLy8gT3BlbiBmdW5jdGlvbgorICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiLy9mdW5jdGlvbiBvbkVycm9yKEVycm9yKTp2b2lkOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIvL2Z1bmN0aW9uIG9uU3VjY2VzcygpOnZvaWQ7IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIvL2Z1bmN0aW9uIG9uRXJyb3IoRXJyb3IpOnZvaWQ7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIi8vZnVuY3Rpb24gb25TdWNjZXNzKCIgPDwgdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIpOnZvaWQ7IiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgICAgLy8gR2V0IHRoZSBzdHJ1Y3Qgb2YgZnVuY3Rpb24gY2FsbCBwYXJhbXMKKyAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKworICAgIHN0cmluZyBhcmdzbmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfYXJncyI7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKworICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVxdWVzdAorICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90Xy53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UoXCIiIDw8IGZ1bm5hbWUgPDwgIlwiLCAiCisgICAgICAgICAgICAgICA8PCAoKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSA/ICJUTWVzc2FnZVR5cGUuT05FV0FZIiA6ICJUTWVzc2FnZVR5cGUuQ0FMTCIpCisgICAgICAgICAgICAgICA8PCAiLCBzZXFpZF8pKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInZhciBhcmdzOiIgPDwgYXJnc25hbWUgPDwgIiA9IG5ldyAiCisgICAgICAgICAgICAgICA8PCBhcmdzbmFtZSA8PCAiKCk7IiA8PCBlbmRsOworCisgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImFyZ3MuIiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIgorICAgICAgICAgICAgICAgICA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJhcmdzLndyaXRlKG9wcm90Xyk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAib3Byb3RfLndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKKworICAgIGlmICgoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJvcHJvdF8uZ2V0VHJhbnNwb3J0KCkuZmx1c2goKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90Xy5nZXRUcmFuc3BvcnQoKS5mbHVzaChmdW5jdGlvbihlcnJvcjpFcnJvcik6dm9pZCB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0cnkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgc3RyaW5nIHJlc3VsdG5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAoZXJyb3IgIT0gbnVsbCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAiICBpZiAob25FcnJvciAhPSBudWxsKSBvbkVycm9yKGVycm9yKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuOyIKKyAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAidmFyIG1zZzpUTWVzc2FnZSA9IGlwcm90Xy5yZWFkTWVzc2FnZUJlZ2luKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgIDw8ICJpZiAobXNnLnR5cGUgPT0gVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTikgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAiICB2YXIgeDpUQXBwbGljYXRpb25FcnJvciA9IFRBcHBsaWNhdGlvbkVycm9yLnJlYWQoaXByb3RfKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgaXByb3RfLnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgIDw8ICIgIGlmIChvbkVycm9yICE9IG51bGwpIG9uRXJyb3IoeCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybjsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInZhciByZXN1bHQgOiIgPDwgcmVzdWx0bmFtZSA8PCAiID0gbmV3ICIKKyAgICAgICAgICAgICAgICAgPDwgcmVzdWx0bmFtZSA8PCAiKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXN1bHQucmVhZChpcHJvdF8pOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaXByb3RfLnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOworCisgICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KKyAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKHJlc3VsdC4iIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKCJzdWNjZXNzIikgPDwgIikgeyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIGlmIChvblN1Y2Nlc3MgIT0gbnVsbCkgb25TdWNjZXNzKHJlc3VsdC5zdWNjZXNzKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm47IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgfQorCisgICAgICB0X3N0cnVjdCogeHMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKKyAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAocmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIT0gbnVsbCkgeyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIGlmIChvbkVycm9yICE9IG51bGwpIG9uRXJyb3IocmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgPDwgIik7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybjsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIC8vIElmIHlvdSBnZXQgaGVyZSBpdCdzIGFuIGV4Y2VwdGlvbiwgdW5sZXNzIGEgdm9pZCBmdW5jdGlvbgorICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChvblN1Y2Nlc3MgIT0gbnVsbCkgb25TdWNjZXNzKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgICAgPDwgInJldHVybjsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworCisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChvbkVycm9yICE9IG51bGwpIG9uRXJyb3IobmV3ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVEFwcGxpY2F0aW9uRXJyb3IoVEFwcGxpY2F0aW9uRXJyb3IuTUlTU0lOR19SRVNVTFQsIFwiIgorICAgICAgICAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZhaWxlZDogdW5rbm93biByZXN1bHRcIikpOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IGNhdGNoIChlOlRFcnJvcikgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAiICBpZiAob25FcnJvciAhPSBudWxsKSBvbkVycm9yKGUpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSk7IiA8PCBlbmRsOworICAgIH0KKyAgICAvLyBDbG9zZSBmdW5jdGlvbgorICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2Ugc2VydmVyIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KKyAqLwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgLy8gR2VuZXJhdGUgdGhlIGRpc3BhdGNoIG1ldGhvZHMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgLy8gRXh0ZW5kcyBzdHVmZgorICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19wcm9jZXNzb3IgPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICBleHRlbmRzX3Byb2Nlc3NvciA9ICIgZXh0ZW5kcyAiICsgZXh0ZW5kcyArICJQcm9jZXNzb3IiOworICB9CisKKyAgLy8gR2VuZXJhdGUgdGhlIGhlYWRlciBwb3J0aW9uCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIGNsYXNzICIgPDwgc2VydmljZV9uYW1lXyA8PCAiUHJvY2Vzc29yIiA8PCBleHRlbmRzX3Byb2Nlc3NvcgorICAgICAgICAgICAgICAgICAgICAgPDwgIiBpbXBsZW1lbnRzIFRQcm9jZXNzb3IgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgZnVuY3Rpb24gIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJQcm9jZXNzb3IoaWZhY2U6IiA8PCBzZXJ2aWNlX25hbWVfCisgICAgICAgICAgICAgICAgICAgICA8PCAiKSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgIGlmICghZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAic3VwZXIoaWZhY2UpOyIgPDwgZW5kbDsKKyAgfQorICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZmFjZV8gPSBpZmFjZTsiIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJQUk9DRVNTX01BUFtcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICA8PCAiXCJdID0gIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIigpOyIgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwcml2YXRlIHZhciBpZmFjZV86IiA8PCBzZXJ2aWNlX25hbWVfIDw8ICI7IiA8PCBlbmRsOworCisgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgY29uc3QgUFJPQ0VTU19NQVA6RGljdGlvbmFyeSA9IG5ldyBEaWN0aW9uYXJ5KCk7IiA8PCBlbmRsOworICB9CisKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSBzZXJ2ZXIgaW1wbGVtZW50YXRpb24KKyAgc3RyaW5nIG92ZXJyaWRlID0gIiI7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgb3ZlcnJpZGUgPSAib3ZlcnJpZGUgIjsKKyAgfQorICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgb3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgIDw8ICJwdWJsaWMgZnVuY3Rpb24gcHJvY2VzcyhpcHJvdDpUUHJvdG9jb2wsIG9wcm90OlRQcm90b2NvbCk6Qm9vbGVhbiIgPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidmFyIG1zZzpUTWVzc2FnZSA9IGlwcm90LnJlYWRNZXNzYWdlQmVnaW4oKTsiIDw8IGVuZGw7CisKKyAgLy8gVE9ETyhtY3NsZWUpOiB2YWxpZGF0ZSBtZXNzYWdlLCB3YXMgdGhlIHNlcWlkIGV0Yy4gbGVnaXQ/CisgIC8vIEFTLSBJZiBhbGwgbWV0aG9kIGlzIG9uZXdheToKKyAgLy8gZG8geW91IGhhdmUgYW4gb3Byb3Q/CisgIC8vIGRvIHlvdSB5b3UgbmVlZCBudWxsY2hlY2s/CisgIGZfc2VydmljZV8KKyAgICAgIDw8IGluZGVudCgpIDw8ICJ2YXIgZm46RnVuY3Rpb24gPSBQUk9DRVNTX01BUFttc2cubmFtZV07IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiaWYgKGZuID09IG51bGwpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBUVHlwZS5TVFJVQ1QpOyIKKyAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgaXByb3QucmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICIgIHZhciB4OlRBcHBsaWNhdGlvbkVycm9yID0gbmV3IFRBcHBsaWNhdGlvbkVycm9yKFRBcHBsaWNhdGlvbkVycm9yLlVOS05PV05fTUVUSE9ELCAiCisgICAgICAgICAiXCJJbnZhbGlkIG1ldGhvZCBuYW1lOiAnXCIrbXNnLm5hbWUrXCInXCIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIiAgb3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKG1zZy5uYW1lLCBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OLCBtc2cuc2VxaWQpKTsiCisgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHgud3JpdGUob3Byb3QpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKTsiCisgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIG9wcm90LmdldFRyYW5zcG9ydCgpLmZsdXNoKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiICByZXR1cm4gdHJ1ZTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJmbi5jYWxsKHRoaXMsbXNnLnNlcWlkLCBpcHJvdCwgb3Byb3QpOyIgPDwgZW5kbDsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gdHJ1ZTsiIDw8IGVuZGw7CisKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzIHN1YmZ1bmN0aW9ucworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odHNlcnZpY2UsICpmX2l0ZXIpOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGFuZCBoZWxwZXJzIGZvciBhIGZ1bmN0aW9uLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uCisgKi8KK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIHJldHVybjsKKyAgfQorCisgIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKKyAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKKyAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOworICB9CisKKyAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgcmVzdWx0LmFwcGVuZCgqZl9pdGVyKTsKKyAgfQorCisgIGdlbmVyYXRlX2FzM19zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCAmcmVzdWx0LCBmYWxzZSwgdHJ1ZSwgdHJ1ZSk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgcHJvY2VzcyBmdW5jdGlvbiBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHdyaXRlIGEgZGlzcGF0Y2hlciBmb3IKKyAqLwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgICh2b2lkKXRzZXJ2aWNlOworICAvLyBPcGVuIGNsYXNzCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJpdmF0ZSBmdW5jdGlvbiAiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCk6RnVuY3Rpb24geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gT3BlbiBmdW5jdGlvbgorICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybiBmdW5jdGlvbihzZXFpZDppbnQsIGlwcm90OlRQcm90b2NvbCwgb3Byb3Q6VFByb3RvY29sKTp2b2lkIiA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICBzdHJpbmcgYXJnc25hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX2FyZ3MiOworICBzdHJpbmcgcmVzdWx0bmFtZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ2YXIgYXJnczoiIDw8IGFyZ3NuYW1lIDw8ICIgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiKCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImFyZ3MucmVhZChpcHJvdCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpcHJvdC5yZWFkTWVzc2FnZUVuZCgpOyIKKyAgICAgICAgICAgICA8PCBlbmRsOworCisgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisKKyAgLy8gRGVjbGFyZSByZXN1bHQgZm9yIG5vbiBvbmV3YXkgZnVuY3Rpb24KKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidmFyIHJlc3VsdDoiIDw8IHJlc3VsdG5hbWUgPDwgIiA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIigpOyIKKyAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIH0KKworICAvLyBUcnkgYmxvY2sgZm9yIGEgZnVuY3Rpb24gd2l0aCBleGNlcHRpb25zCisgIGlmICh4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRyeSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICB9CisKKyAgLy8gR2VuZXJhdGUgdGhlIGZ1bmN0aW9uIGNhbGwKKyAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7CisgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAiaWZhY2VfLiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIjsKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfIDw8ICJhcmdzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIH0KKyAgICBmX3NlcnZpY2VfIDw8ICIpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBmX3NlcnZpY2VfIDw8ICIvLyBzb3JyeSB0aGlzIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIHlldCIgPDwgZW5kbDsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIGlzIG5vdCB5ZXQgc3VwcG9ydGVkXCIpOyIgPDwgZW5kbDsKKyAgfQorCisgIC8vIFNldCBpc3NldCBvbiBzdWNjZXNzIGZpZWxkCisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkKKyAgICAgICYmICF0eXBlX2Nhbl9iZV9udWxsKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQuc2V0IiA8PCBnZXRfY2FwX25hbWUoInN1Y2Nlc3MiKSA8PCBnZXRfY2FwX25hbWUoImlzU2V0IikKKyAgICAgICAgICAgICAgIDw8ICIodHJ1ZSk7IiA8PCBlbmRsOworICB9CisKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmIHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IjsKKyAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgZl9zZXJ2aWNlXyA8PCAiIGNhdGNoICgiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOiIKKyAgICAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlKSA8PCAiKSB7IiA8PCBlbmRsOworICAgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIKKyAgICAgICAgICAgICAgICAgICA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAifSI7CisgICAgICB9CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgIiBjYXRjaCAodGg6RXJyb3IpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidHJhY2UoXCJJbnRlcm5hbCBlcnJvciBwcm9jZXNzaW5nICIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICA8PCAiXCIsIHRoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICJ2YXIgeDpUQXBwbGljYXRpb25FcnJvciA9IG5ldyAiCisgICAgICAgICAgICAgICAgICAiVEFwcGxpY2F0aW9uRXJyb3IoVEFwcGxpY2F0aW9uRXJyb3IuSU5URVJOQUxfRVJST1IsIFwiSW50ZXJuYWwgZXJyb3IgcHJvY2Vzc2luZyAiCisgICAgICAgICAgICAgICA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIlwiKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UoXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgPDwgIlwiLCBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OLCBzZXFpZCkpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAieC53cml0ZShvcHJvdCk7IgorICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAib3Byb3QuZ2V0VHJhbnNwb3J0KCkuZmx1c2goKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9CisKKyAgLy8gU2hvcnRjdXQgb3V0IGhlcmUgZm9yIG9uZXdheSBmdW5jdGlvbnMKKyAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisKKyAgICAvLyBDbG9zZSBjbGFzcworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgIHJldHVybjsKKyAgfQorCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgPDwgIlwiLCBUTWVzc2FnZVR5cGUuUkVQTFksIHNlcWlkKSk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXN1bHQud3JpdGUob3Byb3QpOyIKKyAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAib3Byb3QuZ2V0VHJhbnNwb3J0KCkuZmx1c2goKTsiIDw8IGVuZGw7CisKKyAgLy8gQ2xvc2UgZnVuY3Rpb24KKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIC8vIENsb3NlIGNsYXNzCisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBEZXNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KKyAqCisgKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZAorICogQHBhcmFtIHByZWZpeCBUaGUgdmFyaWFibGUgbmFtZSBvciBjb250YWluZXIgZm9yIHRoaXMgZmllbGQKKyAqLwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdHJpbmcgcHJlZml4KSB7CisgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKworICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgIH0KKworICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKKworICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIiA9IGlwcm90LiI7CisKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgICBvdXQgPDwgInJlYWRCaW5hcnkoKTsiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG91dCA8PCAicmVhZFN0cmluZygpOyI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIG91dCA8PCAicmVhZEJvb2woKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIG91dCA8PCAicmVhZEJ5dGUoKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICBvdXQgPDwgInJlYWRJMTYoKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBvdXQgPDwgInJlYWRJMzIoKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICBvdXQgPDwgInJlYWRJNjQoKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICBvdXQgPDwgInJlYWREb3VibGUoKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gQXMzIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgb3V0IDw8ICJyZWFkSTMyKCk7IjsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gREVTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCisgICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYW4gdW5zZXJpYWxpemVyIGZvciBhIHN0cnVjdCwgaW52b2tlcyByZWFkKCkKKyAqLwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4KSB7CisgIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCBwcmVmaXggPDwgIi5yZWFkKGlwcm90KTsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogRGVzZXJpYWxpemVzIGEgY29udGFpbmVyIGJ5IHJlYWRpbmcgaXRzIHNpemUgYW5kIHRoZW4gaXRlcmF0aW5nCisgKi8KK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4KSB7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgc3RyaW5nIG9iajsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgb2JqID0gdG1wKCJfbWFwIik7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgb2JqID0gdG1wKCJfc2V0Iik7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIG9iaiA9IHRtcCgiX2xpc3QiKTsKKyAgfQorCisgIC8vIERlY2xhcmUgdmFyaWFibGVzLCByZWFkIGhlYWRlcgorICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgInZhciAiIDw8IG9iaiA8PCAiOlRNYXAgPSBpcHJvdC5yZWFkTWFwQmVnaW4oKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgInZhciAiIDw8IG9iaiA8PCAiOlRTZXQgPSBpcHJvdC5yZWFkU2V0QmVnaW4oKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJ2YXIgIiA8PCBvYmogPDwgIjpUTGlzdCA9IGlwcm90LnJlYWRMaXN0QmVnaW4oKTsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpCisgICAgICAgICAgICAgIC8vIHNpemUgdGhlIGNvbGxlY3Rpb24gY29ycmVjdGx5CisgICAgICAgICAgICAgIDw8ICIoIgorICAgICAgICAgICAgICA8PCAiKTsiIDw8IGVuZGw7CisKKyAgLy8gRm9yIGxvb3AgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cworICBzdHJpbmcgaSA9IHRtcCgiX2kiKTsKKyAgaW5kZW50KG91dCkgPDwgImZvciAodmFyICIgPDwgaSA8PCAiOmludCA9IDA7ICIgPDwgaSA8PCAiIDwgIiA8PCBvYmogPDwgIi5zaXplIgorICAgICAgICAgICAgICA8PCAiOyAiCisgICAgICAgICAgICAgIDw8ICIrKyIgPDwgaSA8PCAiKSIgPDwgZW5kbDsKKworICBzY29wZV91cChvdXQpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIHByZWZpeCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBwcmVmaXgpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgcHJlZml4KTsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICAvLyBSZWFkIGNvbnRhaW5lciBlbmQKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkTWFwRW5kKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkU2V0RW5kKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZExpc3RFbmQoKTsiIDw8IGVuZGw7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGNvZGUgdG8gZGVzZXJpYWxpemUgYSBtYXAKKyAqLwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIGtleSA9IHRtcCgiX2tleSIpOworICBzdHJpbmcgdmFsID0gdG1wKCJfdmFsIik7CisgIHRfZmllbGQgZmtleSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KTsKKyAgdF9maWVsZCBmdmFsKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2YWwpOworCisgIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZrZXkpIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZ2YWwpIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmtleSk7CisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZ2YWwpOworCisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiWyIgPDwga2V5IDw8ICJdID0gIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogRGVzZXJpYWxpemVzIGEgc2V0IGVsZW1lbnQKKyAqLwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7CisgIHRfZmllbGQgZmVsZW0odHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKKworICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZmZWxlbSkgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIuYWRkKCIgPDwgZWxlbSA8PCAiKTsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogRGVzZXJpYWxpemVzIGEgbGlzdCBlbGVtZW50CisgKi8KK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7CisgIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOworICB0X2ZpZWxkIGZlbGVtKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOworCisgIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZlbGVtKSA8PCBlbmRsOworCisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKKworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi5wdXNoKCIgPDwgZWxlbSA8PCAiKTsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgorICoKKyAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkIHRvIHNlcmlhbGl6ZQorICogQHBhcmFtIHByZWZpeCBOYW1lIHRvIHByZXBlbmQgdG8gZmllbGQgbmFtZQorICovCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdHJpbmcgcHJlZml4KSB7CisgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKworICAvLyBEbyBub3RoaW5nIGZvciB2b2lkIHR5cGVzCisgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIFNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgIH0KKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKKworICAgIHN0cmluZyBuYW1lID0gcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC4iOworCisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgICAgb3V0IDw8ICJ3cml0ZUJpbmFyeSgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgPDwgIndyaXRlU3RyaW5nKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICBvdXQgPDwgIndyaXRlQm9vbCgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICBvdXQgPDwgIndyaXRlQnl0ZSgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUkxNigiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUkzMigiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUk2NCgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgb3V0IDw8ICJ3cml0ZURvdWJsZSgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEFzMyBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIG91dCA8PCAid3JpdGVJMzIoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgfQorICAgIG91dCA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIFNFUklBTElaRSBGSUVMRCAnJXMlcycgVFlQRSAnJXMnXG4iLAorICAgICAgICAgICBwcmVmaXguY19zdHIoKSwKKyAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgIHR5cGVfbmFtZSh0eXBlKS5jX3N0cigpKTsKKyAgfQorfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgYWxsIHRoZSBtZW1iZXJzIG9mIGEgc3RydWN0LgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgdG8gc2VyaWFsaXplCisgKiBAcGFyYW0gcHJlZml4ICBTdHJpbmcgcHJlZml4IHRvIGF0dGFjaCB0byBhbGwgZmllbGRzCisgKi8KK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcmVmaXgpIHsKKyAgKHZvaWQpdHN0cnVjdDsKKyAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiLndyaXRlKG9wcm90KTsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhIGNvbnRhaW5lciBieSB3cml0aW5nIGl0cyBzaXplIHRoZW4gdGhlIGVsZW1lbnRzLgorICoKKyAqIEBwYXJhbSB0dHlwZSAgVGhlIHR5cGUgb2YgY29udGFpbmVyCisgKiBAcGFyYW0gcHJlZml4IFN0cmluZyBwcmVmaXggZm9yIGZpZWxkcworICovCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgpIHsKKyAgc2NvcGVfdXAob3V0KTsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgc3RyaW5nIGl0ZXIgPSB0bXAoIl9rZXkiKTsKKyAgICBzdHJpbmcgY291bnRlciA9IHRtcCgiX3NpemVDb3VudGVyIik7CisgICAgaW5kZW50KG91dCkgPDwgInZhciAiIDw8IGNvdW50ZXIgPDwgIjppbnQgPSAwOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yICh2YXIgIiA8PCBpdGVyIDw8ICI6KiBpbiAiIDw8IHByZWZpeCA8PCAiKSB7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgICIgPDwgY291bnRlciA8PCArIisrOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZU1hcEJlZ2luKG5ldyBUTWFwKCIgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpCisgICAgICAgICAgICAgICAgPDwgIiwgIiA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwgIiA8PCBjb3VudGVyIDw8ICIpKTsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTZXRCZWdpbihuZXcgVFNldCgiIDw8IHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkKKyAgICAgICAgICAgICAgICA8PCAiLCAiIDw8IHByZWZpeCA8PCAiLnNpemUpKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUxpc3RCZWdpbihuZXcgVExpc3QoIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIgPDwgcHJlZml4IDw8ICIubGVuZ3RoKSk7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIH0KKworICBzdHJpbmcgaXRlciA9IHRtcCgiZWxlbSIpOworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImZvciAodmFyICIgPDwgaXRlciA8PCAiOiogaW4gIiA8PCBwcmVmaXggPDwgIikiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJmb3IgZWFjaCAodmFyICIgPDwgaXRlciA8PCAiOiogaW4gIiA8PCBwcmVmaXggPDwgIi50b0FycmF5KCkpIjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImZvciBlYWNoICh2YXIgIiA8PCBpdGVyIDw8ICI6KiBpbiAiIDw8IHByZWZpeCA8PCAiKSI7CisgIH0KKworICBzY29wZV91cChvdXQpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBpdGVyLCBwcmVmaXgpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIGl0ZXIpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIGl0ZXIpOworICB9CisKKyAgc2NvcGVfZG93bihvdXQpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVNYXBFbmQoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlU2V0RW5kKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVMaXN0RW5kKCk7IiA8PCBlbmRsOworICB9CisKKyAgc2NvcGVfZG93bihvdXQpOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBtYXAuCisgKi8KK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBtYXApIHsKKyAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksIGl0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAma2ZpZWxkLCAiIik7CisgIHRfZmllbGQgdmZpZWxkKHRtYXAtPmdldF92YWxfdHlwZSgpLCBtYXAgKyAiWyIgKyBpdGVyICsgIl0iKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJnZmaWVsZCwgIiIpOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBzZXQuCisgKi8KK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIGl0ZXIpIHsKKyAgdF9maWVsZCBlZmllbGQodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIpOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBsaXN0LgorICovCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0cmluZyBpdGVyKSB7CisgIHRfZmllbGQgZWZpZWxkKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIik7Cit9CisKKy8qKgorICogUmV0dXJucyBhIEFzMyB0eXBlIG5hbWUKKyAqCisgKiBAcGFyYW0gdHR5cGUgVGhlIHR5cGUKKyAqIEBwYXJhbSBjb250YWluZXIgSXMgdGhlIHR5cGUgZ29pbmcgaW5zaWRlIGEgY29udGFpbmVyPworICogQHJldHVybiBBczMgdHlwZSBuYW1lLCBpLmUuIEhhc2hNYXA8S2V5LFZhbHVlPgorICovCitzdHJpbmcgdF9hczNfZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBpbl9jb250YWluZXIsIGJvb2wgaW5faW5pdCkgeworICAodm9pZClpbl9pbml0OworICAvLyBJbiBBczMgdHlwZWRlZnMgYXJlIGp1c3QgcmVzb2x2ZWQgdG8gdGhlaXIgcmVhbCB0eXBlCisgIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7CisgIHN0cmluZyBwcmVmaXg7CisKKyAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHJldHVybiBiYXNlX3R5cGVfbmFtZSgodF9iYXNlX3R5cGUqKXR0eXBlLCBpbl9jb250YWluZXIpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gImludCI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICJEaWN0aW9uYXJ5IjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIlNldCI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAiQXJyYXkiOworICB9CisKKyAgLy8gQ2hlY2sgZm9yIG5hbWVzcGFjaW5nCisgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR0eXBlLT5nZXRfcHJvZ3JhbSgpOworICBpZiAocHJvZ3JhbSAhPSBOVUxMICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pIHsKKyAgICBzdHJpbmcgcGFja2FnZSA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2UoImFzMyIpOworICAgIGlmICghcGFja2FnZS5lbXB0eSgpKSB7CisgICAgICByZXR1cm4gcGFja2FnZSArICIuIiArIHR0eXBlLT5nZXRfbmFtZSgpOworICAgIH0KKyAgfQorCisgIHJldHVybiB0dHlwZS0+Z2V0X25hbWUoKTsKK30KKworLyoqCisgKiBSZXR1cm5zIHRoZSBBUzMgdHlwZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSB0aHJpZnQgdHlwZS4KKyAqCisgKiBAcGFyYW0gdGJhc2UgVGhlIGJhc2UgdHlwZQorICogQHBhcmFtIGNvbnRhaW5lciBJcyBpdCBnb2luZyBpbiBhIEFzMyBjb250YWluZXI/CisgKi8KK3N0cmluZyB0X2FzM19nZW5lcmF0b3I6OmJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlKiB0eXBlLCBib29sIGluX2NvbnRhaW5lcikgeworICAodm9pZClpbl9jb250YWluZXI7CisgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSB0eXBlLT5nZXRfYmFzZSgpOworCisgIHN3aXRjaCAodGJhc2UpIHsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgIHJldHVybiAidm9pZCI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgcmV0dXJuICJCeXRlQXJyYXkiOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gIlN0cmluZyI7CisgICAgfQorICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgcmV0dXJuICJCb29sZWFuIjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgIHJldHVybiAiaW50IjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgdGhyb3cgImk2NCBpcyBub3QgeWV0IHN1cHBvcnRlZCBpbiBhczMiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICByZXR1cm4gIk51bWJlciI7CisgIGRlZmF1bHQ6CisgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBBczMgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICB9Cit9CisKKy8qKgorICogRGVjbGFyZXMgYSBmaWVsZCwgd2hpY2ggbWF5IGluY2x1ZGUgaW5pdGlhbGl6YXRpb24gYXMgbmVjZXNzYXJ5LgorICoKKyAqIEBwYXJhbSB0dHlwZSBUaGUgdHlwZQorICovCitzdHJpbmcgdF9hczNfZ2VuZXJhdG9yOjpkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0KSB7CisgIC8vIFRPRE8obWNzbGVlKTogZG8gd2UgZXZlciBuZWVkIHRvIGluaXRpYWxpemUgdGhlIGZpZWxkPworICBzdHJpbmcgcmVzdWx0ID0gInZhciAiICsgdGZpZWxkLT5nZXRfbmFtZSgpICsgIjoiICsgdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisgIGlmIChpbml0KSB7CisgICAgdF90eXBlKiB0dHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmIHRmaWVsZC0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgeworICAgICAgc3RkOjpvZnN0cmVhbSBkdW1teTsKKyAgICAgIHJlc3VsdCArPSAiID0gIiArIHJlbmRlcl9jb25zdF92YWx1ZShkdW1teSwgdGZpZWxkLT5nZXRfbmFtZSgpLCB0dHlwZSwgdGZpZWxkLT5nZXRfdmFsdWUoKSk7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICByZXN1bHQgKz0gIiA9IG51bGwiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgcmVzdWx0ICs9ICIgPSBmYWxzZSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgcmVzdWx0ICs9ICIgPSAwIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgcmVzdWx0ICs9ICIgPSAoZG91YmxlKTAiOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgcmVzdWx0ICs9ICIgPSAwIjsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgICAgcmVzdWx0ICs9ICIgPSBuZXcgIiArIHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpICsgIigpIjsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ICs9ICIgPSBuZXcgIiArIHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpICsgIigpIjsKKyAgICAgIDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlc3VsdCArICI7IjsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd0eXBlIG5hbWUoYXJncyknCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCisgKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCisgKi8KK3N0cmluZyB0X2FzM19nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RkOjpzdHJpbmcgYXJndW1lbnRzID0gYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpOworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBpZiAoYXJndW1lbnRzICE9ICIiKSB7CisgICAgICBhcmd1bWVudHMgKz0gIiwgIjsKKyAgICB9CisgICAgYXJndW1lbnRzICs9ICJvbkVycm9yOkZ1bmN0aW9uLCBvblN1Y2Nlc3M6RnVuY3Rpb24iOworICB9CisKKyAgc3RkOjpzdHJpbmcgcmVzdWx0ID0gImZ1bmN0aW9uICIgKyBwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiKCIgKyBhcmd1bWVudHMgKyAiKTp2b2lkIjsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgY29tbWEgc2VwYXJhdGVkIGZpZWxkIGxpc3QsIHdpdGggdHlwZSBuYW1lcworICovCitzdHJpbmcgdF9hczNfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ICs9ICIsICI7CisgICAgfQorICAgIHJlc3VsdCArPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiOiIgKyB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgQysrIGVudW0gc3RyaW5nIGZvciB0aGUgZ2l2ZW4gdHlwZS4KKyAqLworc3RyaW5nIHRfYXMzX2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAiVFR5cGUuU1RSSU5HIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gIlRUeXBlLkJPT0wiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZXR1cm4gIlRUeXBlLkJZVEUiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmV0dXJuICJUVHlwZS5JMTYiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmV0dXJuICJUVHlwZS5JMzIiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICJUVHlwZS5JNjQiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICJUVHlwZS5ET1VCTEUiOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLkkzMiI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiAiVFR5cGUuU1RSVUNUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAiVFR5cGUuTUFQIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAiVFR5cGUuU0VUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLkxJU1QiOworICB9CisKKyAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworfQorCisvKioKKyAqIEFwcGxpZXMgdGhlIGNvcnJlY3Qgc3R5bGUgdG8gYSBzdHJpbmcgYmFzZWQgb24gdGhlIHZhbHVlIG9mIG5vY2FtZWxfc3R5bGVfCisgKi8KK3N0ZDo6c3RyaW5nIHRfYXMzX2dlbmVyYXRvcjo6Z2V0X2NhcF9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpIHsKKyAgbmFtZVswXSA9IHRvdXBwZXIobmFtZVswXSk7CisgIHJldHVybiBuYW1lOworfQorCitzdHJpbmcgdF9hczNfZ2VuZXJhdG9yOjpjb25zdGFudF9uYW1lKHN0cmluZyBuYW1lKSB7CisgIHN0cmluZyBjb25zdGFudF9uYW1lOworCisgIGJvb2wgaXNfZmlyc3QgPSB0cnVlOworICBib29sIHdhc19wcmV2aW91c19jaGFyX3VwcGVyID0gZmFsc2U7CisgIGZvciAoc3RyaW5nOjppdGVyYXRvciBpdGVyID0gbmFtZS5iZWdpbigpOyBpdGVyICE9IG5hbWUuZW5kKCk7ICsraXRlcikgeworICAgIHN0cmluZzo6dmFsdWVfdHlwZSBjaGFyYWN0ZXIgPSAoKml0ZXIpOworCisgICAgYm9vbCBpc191cHBlciA9IGlzdXBwZXIoY2hhcmFjdGVyKTsKKworICAgIGlmIChpc191cHBlciAmJiAhaXNfZmlyc3QgJiYgIXdhc19wcmV2aW91c19jaGFyX3VwcGVyKSB7CisgICAgICBjb25zdGFudF9uYW1lICs9ICdfJzsKKyAgICB9CisgICAgY29uc3RhbnRfbmFtZSArPSB0b3VwcGVyKGNoYXJhY3Rlcik7CisKKyAgICBpc19maXJzdCA9IGZhbHNlOworICAgIHdhc19wcmV2aW91c19jaGFyX3VwcGVyID0gaXNfdXBwZXI7CisgIH0KKworICByZXR1cm4gY29uc3RhbnRfbmFtZTsKK30KKworLyoqCisgKiBFbWl0cyBhIEFzM0RvYyBjb21tZW50IGlmIHRoZSBwcm92aWRlZCBvYmplY3QgaGFzIGEgZG9jIGluIFRocmlmdAorICovCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfYXMzX2RvYyhvc3RyZWFtJiBvdXQsIHRfZG9jKiB0ZG9jKSB7CisgIGlmICh0ZG9jLT5oYXNfZG9jKCkpIHsKKyAgICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvdXQsICIvKipcbiIsICIgKiAiLCB0ZG9jLT5nZXRfZG9jKCksICIgKi9cbiIpOworICB9Cit9CisKKy8qKgorICogRW1pdHMgYSBBczNEb2MgY29tbWVudCBpZiB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gb2JqZWN0IGhhcyBhIGRvYyBpbiBUaHJpZnQKKyAqLwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2FzM19kb2Mob3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgaWYgKHRmdW5jdGlvbi0+aGFzX2RvYygpKSB7CisgICAgc3RyaW5nc3RyZWFtIHNzOworICAgIHNzIDw8IHRmdW5jdGlvbi0+Z2V0X2RvYygpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBwX2l0ZXI7CisgICAgZm9yIChwX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgcF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytwX2l0ZXIpIHsKKyAgICAgIHRfZmllbGQqIHAgPSAqcF9pdGVyOworICAgICAgc3MgPDwgIlxuQHBhcmFtICIgPDwgcC0+Z2V0X25hbWUoKTsKKyAgICAgIGlmIChwLT5oYXNfZG9jKCkpIHsKKyAgICAgICAgc3MgPDwgIiAiIDw8IHAtPmdldF9kb2MoKTsKKyAgICAgIH0KKyAgICB9CisgICAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCAiLyoqXG4iLCAiICogIiwgc3Muc3RyKCksICIgKi9cbiIpOworICB9Cit9CisKK3N0ZDo6c3RyaW5nIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaXNzZXRfY2hlY2sodF9maWVsZCogZmllbGQpIHsKKyAgcmV0dXJuIGdlbmVyYXRlX2lzc2V0X2NoZWNrKGZpZWxkLT5nZXRfbmFtZSgpKTsKK30KKworc3RkOjpzdHJpbmcgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9pc3NldF9jaGVjayhzdGQ6OnN0cmluZyBmaWVsZF9uYW1lKSB7CisgIHJldHVybiAiaXMiICsgZ2V0X2NhcF9uYW1lKCJzZXQiKSArIGdldF9jYXBfbmFtZShmaWVsZF9uYW1lKSArICIoKSI7Cit9CisKK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9pc3NldF9zZXQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiBmaWVsZCkgeworICBpZiAoIXR5cGVfY2FuX2JlX251bGwoZmllbGQtPmdldF90eXBlKCkpKSB7CisgICAgaW5kZW50KG91dCkgPDwgInRoaXMuX19pc3NldF8iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgPSB0cnVlOyIgPDwgZW5kbDsKKyAgfQorfQorCitzdGQ6OnN0cmluZyB0X2FzM19nZW5lcmF0b3I6OmdldF9lbnVtX2NsYXNzX25hbWUodF90eXBlKiB0eXBlKSB7CisgIHN0cmluZyBwYWNrYWdlID0gIiI7CisgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR5cGUtPmdldF9wcm9ncmFtKCk7CisgIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgeworICAgIHBhY2thZ2UgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJhczMiKSArICIuIjsKKyAgfQorICByZXR1cm4gcGFja2FnZSArIHR5cGUtPmdldF9uYW1lKCk7Cit9CisKK1RIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoCisgICAgYXMzLAorICAgICJBUzMiLAorICAgICIgICAgYmluZGFibGU6ICAgICAgICBBZGQgW2JpbmRhYmxlXSBtZXRhZGF0YSB0byBhbGwgdGhlIHN0cnVjdCBjbGFzc2VzLlxuIikKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfY19nbGliX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfY19nbGliX2dlbmVyYXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTNiYWQxCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9jX2dsaWJfZ2VuZXJhdG9yLmNjCkBAIC0wLDAgKzEsNDU4NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgorICogUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKKyAqIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8c3RkZXhjZXB0PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxjdHlwZS5oPgorCisjaW5jbHVkZSAidGhyaWZ0L3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oIgorCit1c2luZyBzdGQ6Om1hcDsKK3VzaW5nIHN0ZDo6b3N0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnZlY3RvcjsKKworc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsID0gIlxuIjsgLy8gYXZvaWQgb3N0cmVhbSA8PCBzdGQ6OmVuZGwgZmx1c2hlcworCisvKiBmb3J3YXJkIGRlY2xhcmF0aW9ucyAqLworc3RyaW5nIGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhzdHJpbmcgbmFtZSk7CitzdHJpbmcgdW5kZXJzY29yZXNfdG9faW5pdGlhbF9jYXBzKHN0cmluZyBuYW1lKTsKK3N0cmluZyB0b191cHBlcl9jYXNlKHN0cmluZyBuYW1lKTsKK3N0cmluZyB0b19sb3dlcl9jYXNlKHN0cmluZyBuYW1lKTsKKworLyoqCisgKiBDIGNvZGUgZ2VuZXJhdG9yLCB1c2luZyBnbGliIGZvciBDIHR5cGluZy4KKyAqLworY2xhc3MgdF9jX2dsaWJfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7CitwdWJsaWM6CisgIC8qIGNvbnN0cnVjdG9yICovCisgIHRfY19nbGliX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXA8c3RyaW5nLCBzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgb3B0aW9uX3N0cmluZykKKyAgICA6IHRfb29wX2dlbmVyYXRvcihwcm9ncmFtKSB7CisgICAgKHZvaWQpb3B0aW9uX3N0cmluZzsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworCisgICAgLyogc2V0IHRoZSBvdXRwdXQgZGlyZWN0b3J5ICovCisgICAgdGhpcy0+b3V0X2Rpcl9iYXNlXyA9ICJnZW4tY19nbGliIjsKKworICAgIC8qIG5vIG9wdGlvbnMgeWV0ICovCisgICAgZm9yKCBpdGVyID0gcGFyc2VkX29wdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKTsgKytpdGVyKSB7CisgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24gY19nbGliOiIgKyBpdGVyLT5maXJzdDsKKyAgICB9CisKKyAgICAvKiBzZXQgdGhlIG5hbWVzcGFjZSAqLworICAgIHRoaXMtPm5zcGFjZSA9IHByb2dyYW1fLT5nZXRfbmFtZXNwYWNlKCJjX2dsaWIiKTsKKworICAgIGlmICh0aGlzLT5uc3BhY2UuZW1wdHkoKSkgeworICAgICAgdGhpcy0+bnNwYWNlID0gIiI7CisgICAgICB0aGlzLT5uc3BhY2VfdSA9ICIiOworICAgICAgdGhpcy0+bnNwYWNlX3VjID0gIiI7CisgICAgICB0aGlzLT5uc3BhY2VfbGMgPSAiIjsKKyAgICB9IGVsc2UgeworICAgICAgLyogcmVwbGFjZSBkb3RzIHdpdGggdW5kZXJzY29yZXMgKi8KKyAgICAgIGNoYXIqIHRtcCA9IHN0cmR1cCh0aGlzLT5uc3BhY2UuY19zdHIoKSk7CisgICAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IHN0cmxlbih0bXApOyBpKyspIHsKKyAgICAgICAgaWYgKHRtcFtpXSA9PSAnLicpIHsKKyAgICAgICAgICB0bXBbaV0gPSAnXyc7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHRoaXMtPm5zcGFjZSA9IHN0cmluZyh0bXAsIHN0cmxlbih0bXApKTsKKyAgICAgIGZyZWUodG1wKTsKKworICAgICAgLyogY2xlYW4gdXAgdGhlIG5hbWVzcGFjZSBmb3IgQy4KKyAgICAgICAqIEFuIGlucHV0IG9mICduYW1lc3BhY2UgZm9vJyBzaG91bGQgcmVzdWx0IGluOgorICAgICAgICogIC0gbnNwYWNlID0gZm9vICAgICAgIC0gZm9yIHRocmlmdCBvYmplY3RzIGFuZCB0eXBlZGVmcworICAgICAgICogIC0gbnNwYWNlX3UgPSBGb28gICAgIC0gZm9yIGludGVybmFsIEdPYmplY3QgcHJlZml4ZXMKKyAgICAgICAqICAtIG5zcGFjZV91YyA9IEZPT18gICAtIGZvciBtYWNybyBwcmVmaXhlcworICAgICAgICogIC0gbnNwYWNlX2xjID0gZm9vXyAgIC0gZm9yIGZpbGVuYW1lIGFuZCBtZXRob2QgcHJlZml4ZXMKKyAgICAgICAqIFRoZSB1bmRlcnNjb3JlcyBhcmUgdGhlcmUgc2luY2UgdWMgYW5kIGxjIHN0cmluZ3MgYXJlIHVzZWQgYXMgZmlsZSBhbmQKKyAgICAgICAqIHZhcmlhYmxlIHByZWZpeGVzLgorICAgICAgICovCisgICAgICB0aGlzLT5uc3BhY2VfdSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3Jlcyh0aGlzLT5uc3BhY2UpOworICAgICAgdGhpcy0+bnNwYWNlX3VjID0gdG9fdXBwZXJfY2FzZSh0aGlzLT5uc3BhY2VfdSkgKyAiXyI7CisgICAgICB0aGlzLT5uc3BhY2VfbGMgPSB0b19sb3dlcl9jYXNlKHRoaXMtPm5zcGFjZV91KSArICJfIjsKKyAgICB9CisgIH0KKworICAvKiBpbml0aWFsaXphdGlvbiBhbmQgZGVzdHJ1Y3Rpb24gKi8KKyAgdm9pZCBpbml0X2dlbmVyYXRvcigpOworICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOworCisgIC8qIGdlbmVyYXRpb24gZnVuY3Rpb25zICovCisgIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pOworICB2b2lkIGdlbmVyYXRlX2NvbnN0cyh2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0c3RydWN0KTsKKworcHJpdmF0ZToKKyAgLyogZmlsZSBzdHJlYW1zICovCisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl90eXBlc187CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl90eXBlc19pbXBsXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2hlYWRlcl87CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9zZXJ2aWNlXzsKKworICAvKiBuYW1lc3BhY2UgdmFyaWFibGVzICovCisgIHN0cmluZyBuc3BhY2U7CisgIHN0cmluZyBuc3BhY2VfdTsKKyAgc3RyaW5nIG5zcGFjZV91YzsKKyAgc3RyaW5nIG5zcGFjZV9sYzsKKworICAvKiBoZWxwZXIgZnVuY3Rpb25zICovCisgIGJvb2wgaXNfY29tcGxleF90eXBlKHRfdHlwZSogdHR5cGUpOworICBib29sIGlzX251bWVyaWModF90eXBlKiB0dHlwZSk7CisgIHN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBpbl90eXBlZGVmID0gZmFsc2UsIGJvb2wgaXNfY29uc3QgPSBmYWxzZSk7CisgIHN0cmluZyBwcm9wZXJ0eV90eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBpbl90eXBlZGVmID0gZmFsc2UsIGJvb2wgaXNfY29uc3QgPSBmYWxzZSk7CisgIHN0cmluZyBiYXNlX3R5cGVfbmFtZSh0X3R5cGUqIHR5cGUpOworICBzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSk7CisgIHN0cmluZyBjb25zdGFudF9saXRlcmFsKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOworICBzdHJpbmcgY29uc3RhbnRfdmFsdWUoc3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOworICBzdHJpbmcgY29uc3RhbnRfdmFsdWVfd2l0aF9zdG9yYWdlKHN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKKyAgc3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICBzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgIHN0cmluZyB4Y2VwdGlvbl9saXN0KHRfc3RydWN0KiB0c3RydWN0KTsKKyAgc3RyaW5nIGRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIGluaXQgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwb2ludGVyID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY29uc3RhbnQgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZWZlcmVuY2UgPSBmYWxzZSk7CisgIHZvaWQgZGVjbGFyZV9sb2NhbF92YXJpYWJsZShvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyYgYmFzZV9uYW1lLCBib29sIGZvcl9oYXNoX3RhYmxlKTsKKyAgdm9pZCBkZWNsb3JlX2xvY2FsX3ZhcmlhYmxlX2Zvcl93cml0ZShvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyYgYmFzZV9uYW1lKTsKKworICAvKiBnZW5lcmF0aW9uIGZ1bmN0aW9ucyAqLworICB2b2lkIGdlbmVyYXRlX2NvbnN0X2luaXRpYWxpemVyKHN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHRvcF9sZXZlbCA9IGZhbHNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oYW5kbGVyKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfcHJvY2Vzc29yKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX29iamVjdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0X3dyaXRlcihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB0aGlzX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdGhpc19nZXQgPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZnVuY3Rpb24gPSB0cnVlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3RfcmVhZGVyKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHRoaXNfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB0aGlzX2dldCA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19mdW5jdGlvbiA9IHRydWUpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgc3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3JfcmV0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcmVmaXgsIGludCBlcnJvcl9yZXQpOworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4LCBpbnQgZXJyb3JfcmV0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3JfcmV0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIGVsZW1lbnQsIGludCBlcnJvcl9yZXQpOworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yX3JldCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3JfcmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYWxsb2NhdGUgPSB0cnVlKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yX3JldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhbGxvY2F0ZSA9IHRydWUpOworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgsIGludCBlcnJvcl9yZXQpOworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0cmluZyBwcmVmaXgsIGludCBlcnJvcl9yZXQpOworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBwcmVmaXgsIGludCBlcnJvcl9yZXQpOworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yX3JldCk7CisKKyAgc3RyaW5nIGdlbmVyYXRlX25ld19oYXNoX2Zyb21fdHlwZSh0X3R5cGUqIGtleSwgdF90eXBlKiB2YWx1ZSk7CisgIHN0cmluZyBnZW5lcmF0ZV9uZXdfYXJyYXlfZnJvbV90eXBlKHRfdHlwZSogdHR5cGUpOworCisgIHN0cmluZyBnZW5lcmF0ZV9mcmVlX2Z1bmNfZnJvbV90eXBlKHRfdHlwZSogdHR5cGUpOworICBzdHJpbmcgZ2VuZXJhdGVfaGFzaF9mdW5jX2Zyb21fdHlwZSh0X3R5cGUqIHR0eXBlKTsKKyAgc3RyaW5nIGdlbmVyYXRlX2NtcF9mdW5jX2Zyb21fdHlwZSh0X3R5cGUqIHR0eXBlKTsKK307CisKKy8qKgorICogUHJlcGFyZSBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlCisgKiBvdXRwdXQgc3RyZWFtcy4KKyAqLwordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgeworICAvKiBjcmVhdGUgb3V0cHV0IGRpcmVjdG9yeSAqLworICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOworCisgIHN0cmluZyBwcm9ncmFtX25hbWVfdSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3Jlcyhwcm9ncmFtX25hbWVfKTsKKyAgc3RyaW5nIHByb2dyYW1fbmFtZV91YyA9IHRvX3VwcGVyX2Nhc2UocHJvZ3JhbV9uYW1lX3UpOworICBzdHJpbmcgcHJvZ3JhbV9uYW1lX2xjID0gdG9fbG93ZXJfY2FzZShwcm9ncmFtX25hbWVfdSk7CisKKyAgLyogY3JlYXRlIG91dHB1dCBmaWxlcyAqLworICBzdHJpbmcgZl90eXBlc19uYW1lID0gZ2V0X291dF9kaXIoKSArIHRoaXMtPm5zcGFjZV9sYyArIHByb2dyYW1fbmFtZV9sYyArICJfdHlwZXMuaCI7CisgIGZfdHlwZXNfLm9wZW4oZl90eXBlc19uYW1lLmNfc3RyKCkpOworICBzdHJpbmcgZl90eXBlc19pbXBsX25hbWUgPSBnZXRfb3V0X2RpcigpICsgdGhpcy0+bnNwYWNlX2xjICsgcHJvZ3JhbV9uYW1lX2xjICsgIl90eXBlcy5jIjsKKyAgZl90eXBlc19pbXBsXy5vcGVuKGZfdHlwZXNfaW1wbF9uYW1lLmNfc3RyKCkpOworCisgIC8qIGFkZCB0aHJpZnQgYm9pbGVycGxhdGUgaGVhZGVycyAqLworICBmX3R5cGVzXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKTsKKyAgZl90eXBlc19pbXBsXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKTsKKworICAvKiBpbmNsdWRlIGluY2x1c2lvbiBndWFyZCAqLworICBmX3R5cGVzXyA8PCAiI2lmbmRlZiAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBwcm9ncmFtX25hbWVfdWMgPDwgIl9UWVBFU19IIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIKKyAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHByb2dyYW1fbmFtZV91YyA8PCAiX1RZUEVTX0giIDw8IGVuZGwgPDwgZW5kbDsKKworICAvKiBpbmNsdWRlIGJhc2UgdHlwZXMgKi8KKyAgZl90eXBlc18gPDwgIi8qIGJhc2UgaW5jbHVkZXMgKi8iIDw8IGVuZGwgPDwgIiNpbmNsdWRlIDxnbGliLW9iamVjdC5oPiIgPDwgZW5kbAorICAgICAgICAgICA8PCAiI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0X3N0cnVjdC5oPiIgPDwgZW5kbAorICAgICAgICAgICA8PCAiI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmg+IiA8PCBlbmRsOworCisgIC8qIGluY2x1ZGUgb3RoZXIgdGhyaWZ0IGluY2x1ZGVzICovCisgIGNvbnN0IHZlY3Rvcjx0X3Byb2dyYW0qPiYgaW5jbHVkZXMgPSBwcm9ncmFtXy0+Z2V0X2luY2x1ZGVzKCk7CisgIGlmICghaW5jbHVkZXMuZW1wdHkoKSkgeworICAgIGZfdHlwZXNfIDw8ICIvKiBvdGhlciB0aHJpZnQgaW5jbHVkZXMgKi8iIDw8IGVuZGw7CisKKyAgICBmb3IgKHZlY3Rvcjx0X3Byb2dyYW0qPjo6Y29uc3RfaXRlcmF0b3IgaXRlciA9IGluY2x1ZGVzLmJlZ2luKCk7CisgICAgICAgICBpdGVyICE9IGluY2x1ZGVzLmVuZCgpOworICAgICAgICAgKytpdGVyKSB7CisgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgaW5jbHVkZV9uc3BhY2UgPSAoKml0ZXIpLT5nZXRfbmFtZXNwYWNlKCJjX2dsaWIiKTsKKyAgICAgIHN0ZDo6c3RyaW5nIGluY2x1ZGVfbnNwYWNlX3ByZWZpeCA9CisgICAgICAgIGluY2x1ZGVfbnNwYWNlLmVtcHR5KCkgPyAiIiA6IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhpbmNsdWRlX25zcGFjZSkgKyAiXyI7CisKKyAgICAgIGZfdHlwZXNfIDw8ICIjaW5jbHVkZSBcIiIgPDwgaW5jbHVkZV9uc3BhY2VfcHJlZml4CisgICAgICAgICAgICAgICA8PCBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoKCppdGVyKS0+Z2V0X25hbWUoKSkgPDwgIl90eXBlcy5oXCIiIDw8IGVuZGw7CisgICAgfQorICAgIGZfdHlwZXNfIDw8IGVuZGw7CisgIH0KKworICAvKiBpbmNsdWRlIGN1c3RvbSBoZWFkZXJzICovCisgIGNvbnN0IHZlY3RvcjxzdHJpbmc+JiBjX2luY2x1ZGVzID0gcHJvZ3JhbV8tPmdldF9jX2luY2x1ZGVzKCk7CisgIGZfdHlwZXNfIDw8ICIvKiBjdXN0b20gdGhyaWZ0IGluY2x1ZGVzICovIiA8PCBlbmRsOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNfaW5jbHVkZXMuc2l6ZSgpOyArK2kpIHsKKyAgICBpZiAoY19pbmNsdWRlc1tpXVswXSA9PSAnPCcpIHsKKyAgICAgIGZfdHlwZXNfIDw8ICIjaW5jbHVkZSAiIDw8IGNfaW5jbHVkZXNbaV0gPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgZl90eXBlc18gPDwgIiNpbmNsdWRlIFwiIiA8PCBjX2luY2x1ZGVzW2ldIDw8ICJcIiIgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgZl90eXBlc18gPDwgZW5kbDsKKworICAvKiBpbmNsdWRlIG1hdGguaCAoZm9yICJJTkZJTklUWSIpIGluIHRoZSBpbXBsZW1lbnRhdGlvbiBmaWxlLCBpbiBjYXNlIHdlCisgICAgIGVuY291bnRlciBhIHN0cnVjdCB3aXRoIGEgbWVtYmVyIG9mIHR5cGUgZG91YmxlICovCisgIGZfdHlwZXNfaW1wbF8gPDwgZW5kbCA8PCAiI2luY2x1ZGUgPG1hdGguaD4iIDw8IGVuZGw7CisKKyAgLy8gaW5jbHVkZSB0aGUgdHlwZXMgZmlsZQorICBmX3R5cGVzX2ltcGxfIDw8IGVuZGwgPDwgIiNpbmNsdWRlIFwiIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgcHJvZ3JhbV9uYW1lX3UgPDwgIl90eXBlcy5oXCIiCisgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCAiI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0Lmg+IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZl90eXBlc18gPDwgIi8qIGJlZ2luIHR5cGVzICovIiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogIEZpbmlzaCB1cCBnZW5lcmF0aW9uIGFuZCBjbG9zZSBhbGwgZmlsZSBzdHJlYW1zLgorICovCit2b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgeworICBzdHJpbmcgcHJvZ3JhbV9uYW1lX3VjID0gdG9fdXBwZXJfY2FzZShpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMocHJvZ3JhbV9uYW1lXykpOworCisgIC8qIGVuZCB0aGUgaGVhZGVyIGluY2x1c2lvbiBndWFyZCAqLworICBmX3R5cGVzXyA8PCAiI2VuZGlmIC8qICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHByb2dyYW1fbmFtZV91YyA8PCAiX1RZUEVTX0ggKi8iIDw8IGVuZGw7CisKKyAgLyogY2xvc2Ugb3V0cHV0IGZpbGUgKi8KKyAgZl90eXBlc18uY2xvc2UoKTsKKyAgZl90eXBlc19pbXBsXy5jbG9zZSgpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIFRocmlmdCB0eXBlZGVmIGluIEMgY29kZS4gIEZvciBleGFtcGxlOgorICoKKyAqIFRocmlmdDoKKyAqIHR5cGVkZWYgbWFwPGkzMixpMzI+IFNvbWVNYXAKKyAqCisgKiBDOgorICogdHlwZWRlZiBHSGFzaFRhYmxlICogVGhyaWZ0U29tZU1hcDsKKyAqLwordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgeworICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAidHlwZWRlZiAiIDw8IHR5cGVfbmFtZSh0dHlwZWRlZi0+Z2V0X3R5cGUoKSwgdHJ1ZSkgPDwgIiAiIDw8IHRoaXMtPm5zcGFjZQorICAgICAgICAgICA8PCB0dHlwZWRlZi0+Z2V0X3N5bWJvbGljKCkgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBDIGVudW1lcmF0aW9uLiAgRm9yIGV4YW1wbGU6CisgKgorICogVGhyaWZ0OgorICogZW51bSBNeUVudW0geworICogICBPTkUgPSAxLAorICogICBUV08KKyAqIH0KKyAqCisgKiBDOgorICogZW51bSBfVGhyaWZ0TXlFbnVtIHsKKyAqICAgVEhSSUZUX01ZX0VOVU1fT05FID0gMSwKKyAqICAgVEhSSUZUX01ZX0VOVU1fVFdPCisgKiB9OworICogdHlwZWRlZiBlbnVtIF9UaHJpZnRNeUVudW0gVGhyaWZ0TXlFbnVtOworICovCit2b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7CisgIHN0cmluZyBuYW1lID0gdGVudW0tPmdldF9uYW1lKCk7CisgIHN0cmluZyBuYW1lX3VjID0gdG9fdXBwZXJfY2FzZShpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMobmFtZSkpOworCisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJlbnVtIF8iIDw8IHRoaXMtPm5zcGFjZSA8PCBuYW1lIDw8ICIgeyIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworCisgIC8qIG91dHB1dCBlYWNoIG9mIHRoZSBlbnVtZXJhdGlvbiBlbGVtZW50cyAqLworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgZl90eXBlc18gPDwgIiwiIDw8IGVuZGw7CisgICAgfQorCisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IG5hbWVfdWMgPDwgIl8iIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICBmX3R5cGVzXyA8PCAiID0gIiA8PCAoKmNfaXRlciktPmdldF92YWx1ZSgpOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl90eXBlc18gPDwgZW5kbCA8PCAifTsiIDw8IGVuZGwgPDwgInR5cGVkZWYgZW51bSBfIiA8PCB0aGlzLT5uc3BhY2UgPDwgbmFtZSA8PCAiICIKKyAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlIDw8IG5hbWUgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBmX3R5cGVzXyA8PCAiLyogcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBjb25zdGFudCAqLyIgPDwgZW5kbDsKKyAgZl90eXBlc18gPDwgImNvbnN0IGNoYXIgKiIgPDwgZW5kbDsKKyAgZl90eXBlc18gPDwgInRvU3RyaW5nXyIgPDwgbmFtZSA8PCAiKGludCB2YWx1ZSk7ICIgPDwgZW5kbCA8PCBlbmRsOworICA7CisgIGZfdHlwZXNfaW1wbF8gPDwgIi8qIHJldHVybiB0aGUgbmFtZSBvZiB0aGUgY29uc3RhbnQgKi8iIDw8IGVuZGw7CisgIGZfdHlwZXNfaW1wbF8gPDwgImNvbnN0IGNoYXIgKiIgPDwgZW5kbDsKKyAgZl90eXBlc19pbXBsXyA8PCAidG9TdHJpbmdfIiA8PCBuYW1lIDw8ICIoaW50IHZhbHVlKSAiIDw8IGVuZGw7CisgIGZfdHlwZXNfaW1wbF8gPDwgInsiIDw8IGVuZGw7CisgIGZfdHlwZXNfaW1wbF8gPDwgIiAgc3RhdGljIF9fdGhyZWFkIGNoYXIgYnVmWzE2XSA9IHswfTsiIDw8IGVuZGw7CisgIGZfdHlwZXNfaW1wbF8gPDwgIiAgc3dpdGNoKHZhbHVlKSB7IiA8PCBlbmRsOworICBzdGQ6OnNldDxpbnQ+IGRvbmU7CisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgICAvLyBTa2lwcGluZyBkdXBsaWNhdGUgdmFsdWUKKyAgICBpZiAoZG9uZS5maW5kKHZhbHVlKSA9PSBkb25lLmVuZCgpKSB7CisgICAgICBkb25lLmluc2VydCh2YWx1ZSk7CisgICAgICBmX3R5cGVzX2ltcGxfIDw8ICIgIGNhc2UgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgbmFtZV91YyA8PCAiXyIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgIDw8ICI6IgorICAgICAgICAgICAgICAgICAgICA8PCAicmV0dXJuIFwiIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgbmFtZV91YyA8PCAiXyIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgIDw8ICJcIjsiIDw8IGVuZGw7CisgICAgfQorICB9CisgIGZfdHlwZXNfaW1wbF8gPDwgIiAgZGVmYXVsdDogZ19zbnByaW50ZihidWYsIDE2LCBcIiVkXCIsIHZhbHVlKTsgcmV0dXJuIGJ1ZjsiIDw8IGVuZGw7CisgIGZfdHlwZXNfaW1wbF8gPDwgIiAgfSIgPDwgZW5kbDsKKyAgZl90eXBlc19pbXBsXyA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBUaHJpZnQgY29uc3RhbnRzIGluIEMgY29kZS4KKyAqLwordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0cyh2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykgeworICBmX3R5cGVzXyA8PCAiLyogY29uc3RhbnRzICovIiA8PCBlbmRsOworICBmX3R5cGVzX2ltcGxfIDw8ICIvKiBjb25zdGFudHMgKi8iIDw8IGVuZGw7CisKKyAgdmVjdG9yPHRfY29uc3QqPjo6aXRlcmF0b3IgY19pdGVyOworICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgeworICAgIHN0cmluZyBuYW1lID0gKCpjX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIHN0cmluZyBuYW1lX3VjID0gdG9fdXBwZXJfY2FzZShuYW1lKTsKKyAgICBzdHJpbmcgbmFtZV9sYyA9IHRvX2xvd2VyX2Nhc2UobmFtZSk7CisgICAgdF90eXBlKiB0eXBlID0gKCpjX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKworICAgIGlmIChpc19jb21wbGV4X3R5cGUodHlwZSkpIHsKKyAgICAgIGZfdHlwZXNfIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCBpbmRlbnQoKSA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgbmFtZV9sYworICAgICAgICAgICAgICAgPDwgIl9jb25zdGFudCgpOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiI2RlZmluZSAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBuYW1lX3VjIDw8ICIgIgorICAgICAgICAgICAgIDw8IGNvbnN0YW50X3ZhbHVlKG5hbWVfbGMsIHR5cGUsIHZhbHVlKSA8PCBlbmRsOworCisgICAgZ2VuZXJhdGVfY29uc3RfaW5pdGlhbGl6ZXIobmFtZV9sYywgdHlwZSwgdmFsdWUsIHRydWUpOworICB9CisKKyAgZl90eXBlc18gPDwgZW5kbDsKKyAgZl90eXBlc19pbXBsXyA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlIFRocmlmdCBzdHJ1Y3RzIGluIEMgY29kZSwgYXMgR09iamVjdHMuICBFeGFtcGxlOgorICoKKyAqIFRocmlmdDoKKyAqIHN0cnVjdCBCb25rCisgKiB7CisgKiAgIDE6IHN0cmluZyBtZXNzYWdlLAorICogICAyOiBpMzIgdHlwZQorICogfQorICoKKyAqIEMgR09iamVjdCBpbnN0YW5jZSBoZWFkZXI6CisgKiBzdHJ1Y3QgX1RocmlmdEJvbmsKKyAqIHsKKyAqICAgR09iamVjdCBwYXJlbnQ7CisgKgorICogICBnY2hhciAqIG1lc3NhZ2U7CisgKiAgIGdpbnQzMiB0eXBlOworICogfTsKKyAqIHR5cGVkZWYgc3RydWN0IF9UaHJpZnRCb25rIFRocmlmdEJvbmsKKyAqIC8vIC4uLiBhZGRpdGlvbmFsIEdPYmplY3QgYm9pbGVycGxhdGUgLi4uCisgKi8KK3ZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgZl90eXBlc18gPDwgIi8qIHN0cnVjdCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiAqLyIgPDwgZW5kbDsKKyAgZ2VuZXJhdGVfb2JqZWN0KHRzdHJ1Y3QpOworfQorCisvKioKKyAqIEdlbmVyYXRlIEMgY29kZSB0byByZXByZXNlbnQgVGhyaWZ0IHNlcnZpY2VzLiAgQ3JlYXRlcyBhIG5ldyBHT2JqZWN0CisgKiB3aGljaCBjYW4gYmUgdXNlZCB0byBhY2Nlc3MgdGhlIHNlcnZpY2UuCisgKi8KK3ZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIHN2Y25hbWVfdSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3Jlcyh0c2VydmljZS0+Z2V0X25hbWUoKSk7CisgIHN0cmluZyBzdmNuYW1lX3VjID0gdGhpcy0+bnNwYWNlX3VjICsgdG9fdXBwZXJfY2FzZShzdmNuYW1lX3UpOworICBzdHJpbmcgZmlsZW5hbWUgPSB0aGlzLT5uc3BhY2VfbGMgKyB0b19sb3dlcl9jYXNlKHN2Y25hbWVfdSk7CisKKyAgLy8gbWFrZSBvdXRwdXQgZmlsZXMKKyAgc3RyaW5nIGZfaGVhZGVyX25hbWUgPSBnZXRfb3V0X2RpcigpICsgZmlsZW5hbWUgKyAiLmgiOworICBmX2hlYWRlcl8ub3BlbihmX2hlYWRlcl9uYW1lLmNfc3RyKCkpOworCisgIHN0cmluZyBwcm9ncmFtX25hbWVfdSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3Jlcyhwcm9ncmFtX25hbWVfKTsKKyAgc3RyaW5nIHByb2dyYW1fbmFtZV9sYyA9IHRvX2xvd2VyX2Nhc2UocHJvZ3JhbV9uYW1lX3UpOworCisgIC8vIGFkZCBoZWFkZXIgZmlsZSBib2lsZXJwbGF0ZQorICBmX2hlYWRlcl8gPDwgYXV0b2dlbl9jb21tZW50KCk7CisKKyAgLy8gYWRkIGFuIGluY2x1c2lvbiBndWFyZAorICBmX2hlYWRlcl8gPDwgIiNpZm5kZWYgIiA8PCBzdmNuYW1lX3VjIDw8ICJfSCIgPDwgZW5kbCA8PCAiI2RlZmluZSAiIDw8IHN2Y25hbWVfdWMgPDwgIl9IIiA8PCBlbmRsCisgICAgICAgICAgICA8PCBlbmRsOworCisgIC8vIGFkZCBzdGFuZGFyZCBpbmNsdWRlcworICBmX2hlYWRlcl8gPDwgIiNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfZGlzcGF0Y2hfcHJvY2Vzc29yLmg+IiA8PCBlbmRsIDw8IGVuZGw7CisgIGZfaGVhZGVyXyA8PCAiI2luY2x1ZGUgXCIiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBwcm9ncmFtX25hbWVfbGMgPDwgIl90eXBlcy5oXCIiIDw8IGVuZGw7CisKKyAgLy8gaWYgd2UgYXJlIGluaGVyaXRpbmcgZnJvbSBhbm90aGVyIHNlcnZpY2UsIGluY2x1ZGUgaXRzIGhlYWRlcgorICB0X3NlcnZpY2UqIGV4dGVuZHNfc2VydmljZSA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworICBpZiAoZXh0ZW5kc19zZXJ2aWNlICE9IE5VTEwpIHsKKyAgICBmX2hlYWRlcl8gPDwgIiNpbmNsdWRlIFwiIiA8PCB0aGlzLT5uc3BhY2VfbGMKKyAgICAgICAgICAgICAgPDwgdG9fbG93ZXJfY2FzZShpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoZXh0ZW5kc19zZXJ2aWNlLT5nZXRfbmFtZSgpKSkgPDwgIi5oXCIiCisgICAgICAgICAgICAgIDw8IGVuZGw7CisgIH0KKyAgZl9oZWFkZXJfIDw8IGVuZGw7CisKKyAgLy8gY3JlYXRlIHRoZSBzZXJ2aWNlIGltcGxlbWVudGF0aW9uCisgIHN0cmluZyBmX3NlcnZpY2VfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBmaWxlbmFtZSArICIuYyI7CisgIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKKworICAvLyBhZGQgdGhlIGJvaWxlcnBsYWNlIGhlYWRlcgorICBmX3NlcnZpY2VfIDw8IGF1dG9nZW5fY29tbWVudCgpOworCisgIC8vIGluY2x1ZGUgdGhlIGhlYWRlcnMKKyAgZl9zZXJ2aWNlXyA8PCAiI2luY2x1ZGUgPHN0cmluZy5oPiIgPDwgZW5kbCA8PCAiI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0Lmg+IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgIiNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb24uaD4iIDw8IGVuZGwgPDwgIiNpbmNsdWRlIFwiIgorICAgICAgICAgICAgIDw8IGZpbGVuYW1lIDw8ICIuaFwiIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gZ2VuZXJhdGUgdGhlIHNlcnZpY2UtaGVscGVyIGNsYXNzZXMKKyAgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRzZXJ2aWNlKTsKKworICAvLyBnZW5lcmF0ZSB0aGUgY2xpZW50IG9iamVjdHMKKyAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UpOworCisgIC8vIGdlbmVyYXRlIHRoZSBzZXJ2ZXIgb2JqZWN0cworICBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0c2VydmljZSk7CisKKyAgLy8gZW5kIHRoZSBoZWFkZXIgaW5jbHVzaW9uIGd1YXJkCisgIGZfaGVhZGVyXyA8PCAiI2VuZGlmIC8qICIgPDwgc3ZjbmFtZV91YyA8PCAiX0ggKi8iIDw8IGVuZGw7CisKKyAgLy8gY2xvc2UgdGhlIGZpbGVzCisgIGZfc2VydmljZV8uY2xvc2UoKTsKKyAgZl9oZWFkZXJfLmNsb3NlKCk7Cit9CisKKy8qKgorICoKKyAqLwordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKKyAgc3RyaW5nIG5hbWVfdSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhuYW1lKTsKKyAgc3RyaW5nIG5hbWVfbGMgPSB0b19sb3dlcl9jYXNlKG5hbWVfdSk7CisgIHN0cmluZyBuYW1lX3VjID0gdG9fdXBwZXJfY2FzZShuYW1lX3UpOworCisgIGdlbmVyYXRlX29iamVjdCh0c3RydWN0KTsKKworICBmX3R5cGVzXyA8PCAiLyogZXhjZXB0aW9uICovIiA8PCBlbmRsCisgICAgICAgICAgIDw8ICJ0eXBlZGVmIGVudW0iIDw8IGVuZGwKKyAgICAgICAgICAgPDwgInsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgbmFtZV91YyA8PCAiX0VSUk9SX0NPREUiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfdHlwZXNfIDw8ICJ9ICIgPDwgdGhpcy0+bnNwYWNlIDw8IG5hbWUgPDwgIkVycm9yOyIgPDwgZW5kbAorICAgICAgICAgICA8PCBlbmRsCisgICAgICAgICAgIDw8ICJHUXVhcmsgIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgbmFtZV9sYworICAgICAgICAgICA8PCAiX2Vycm9yX3F1YXJrICh2b2lkKTsiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgIiNkZWZpbmUgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgbmFtZV91YyA8PCAiX0VSUk9SICgiCisgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX2xjIDw8ICJfZXJyb3JfcXVhcmsoKSkiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgZW5kbAorICAgICAgICAgICA8PCBlbmRsOworCisgIGZfdHlwZXNfaW1wbF8gPDwgIi8qIGRlZmluZSB0aGUgR0Vycm9yIGRvbWFpbiBmb3IgZXhjZXB0aW9ucyAqLyIgPDwgZW5kbCA8PCAiI2RlZmluZSAiCisgICAgICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IG5hbWVfdWMgPDwgIl9FUlJPUl9ET01BSU4gXCIiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX2xjCisgICAgICAgICAgICAgICAgPDwgIl9lcnJvcl9xdWFya1wiIiA8PCBlbmRsIDw8ICJHUXVhcmsiIDw8IGVuZGwgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IG5hbWVfbGMKKyAgICAgICAgICAgICAgICA8PCAiX2Vycm9yX3F1YXJrICh2b2lkKSIgPDwgZW5kbCA8PCAieyIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8ICIgIHJldHVybiBnX3F1YXJrX2Zyb21fc3RhdGljX3N0cmluZyAoIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgbmFtZV91YworICAgICAgICAgICAgICAgIDw8ICJfRVJST1JfRE9NQUlOKTsiIDw8IGVuZGwgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqCisgKiBIRUxQRVIgRlVOQ1RJT05TICoKKyAqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBSZXR1cm5zIHRydWUgaWYgdHR5cGUgaXMgbm90IGEgcHJpbWl0aXZlLgorICovCitib29sIHRfY19nbGliX2dlbmVyYXRvcjo6aXNfY29tcGxleF90eXBlKHRfdHlwZSogdHR5cGUpIHsKKyAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKKworICByZXR1cm4gdHR5cGUtPmlzX2NvbnRhaW5lcigpIHx8IHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKTsKK30KKworYm9vbCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmlzX251bWVyaWModF90eXBlKiB0dHlwZSkgeworICByZXR1cm4gdHR5cGUtPmlzX2VudW0oKSB8fCAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmICF0dHlwZS0+aXNfc3RyaW5nKCkpOworfQorCisvKioKKyAqIE1hcHMgYSBUaHJpZnQgdF90eXBlIHRvIGEgQyB0eXBlLgorICovCitzdHJpbmcgdF9jX2dsaWJfZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBpbl90eXBlZGVmLCBib29sIGlzX2NvbnN0KSB7CisgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICBzdHJpbmcgYm5hbWUgPSBiYXNlX3R5cGVfbmFtZSh0dHlwZSk7CisKKyAgICBpZiAoaXNfY29uc3QpIHsKKyAgICAgIHJldHVybiAiY29uc3QgIiArIGJuYW1lOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gYm5hbWU7CisgICAgfQorICB9CisKKyAgaWYgKHR0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIHN0cmluZyBjbmFtZTsKKworICAgIHRfY29udGFpbmVyKiB0Y29udGFpbmVyID0gKHRfY29udGFpbmVyKil0dHlwZTsKKyAgICBpZiAodGNvbnRhaW5lci0+aGFzX2NwcF9uYW1lKCkpIHsKKyAgICAgIGNuYW1lID0gdGNvbnRhaW5lci0+Z2V0X2NwcF9uYW1lKCk7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICAgIGNuYW1lID0gIkdIYXNoVGFibGUiOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgICAvLyBzaW5jZSBhIHNldCByZXF1aXJlcyB1bmlxdWUgZWxlbWVudHMsIHVzZSBhIEdIYXNoVGFibGUsIGFuZAorICAgICAgLy8gcG9wdWxhdGUgdGhlIGtleXMgYW5kIHZhbHVlcyB3aXRoIHRoZSBzYW1lIGRhdGEsIHVzaW5nIGtleXMgZm9yCisgICAgICAvLyB0aGUgYWN0dWFsIHdyaXRlcyBhbmQgcmVhZHMuCisgICAgICAvLyBUT0RPOiBkaXNjdXNzIHdoZXRoZXIgb3Igbm90IHRvIGltcGxlbWVudCBUU2V0LCBUSGFzaFNldCBvciBHSGFzaFNldAorICAgICAgY25hbWUgPSAiR0hhc2hUYWJsZSI7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICB0X3R5cGUqIGV0eXBlID0gZ2V0X3RydWVfdHlwZSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpOworICAgICAgaWYgKGV0eXBlLT5pc192b2lkKCkpIHsKKyAgICAgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCJjb21waWxlciBlcnJvcjogbGlzdCBlbGVtZW50IHR5cGUgY2Fubm90IGJlIHZvaWQiKTsKKyAgICAgIH0KKyAgICAgIC8vIFRPRE86IGludmVzdGlnYXRlIG90aGVyIGltcGxlbWVudGF0aW9ucyBiZXNpZGVzIEdQdHJBcnJheQorICAgICAgY25hbWUgPSBpc19udW1lcmljKGV0eXBlKSA/ICJHQXJyYXkiIDogIkdQdHJBcnJheSI7CisgICAgfQorCisgICAgLyogT21pdCB0aGUgZGVyZWZlcmVuY2Ugb3BlcmF0b3IgaWYgd2UgYXJlIGFsaWFzaW5nIHRoaXMgdHlwZSB3aXRoaW4gYQorICAgICAgIHR5cGVkZWYsIHRvIGFsbG93IHRoZSB0eXBlIHRvIGJlIHVzZWQgbW9yZSBuYXR1cmFsbHkgaW4gY2xpZW50IGNvZGU7CisgICAgICAgb3RoZXJ3aXNlLCBpbmNsdWRlIGl0ICovCisgICAgaWYgKCFpbl90eXBlZGVmKSB7CisgICAgICBjbmFtZSArPSAiICoiOworICAgIH0KKworICAgIGlmIChpc19jb25zdCkgeworICAgICAgcmV0dXJuICJjb25zdCAiICsgY25hbWU7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBjbmFtZTsKKyAgICB9CisgIH0KKworICAvLyBjaGVjayBmb3IgYSBuYW1lc3BhY2UKKyAgdF9wcm9ncmFtKiB0cHJvZ3JhbSA9IHR0eXBlLT5nZXRfcHJvZ3JhbSgpOworICBzdHJpbmcgcG5hbWUgPSAodHByb2dyYW0gPyB0cHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiY19nbGliIikgOiAiIikgKyB0dHlwZS0+Z2V0X25hbWUoKTsKKworICBpZiAoaXNfY29tcGxleF90eXBlKHR0eXBlKSkgeworICAgIHBuYW1lICs9ICIgKiI7CisgIH0KKworICBpZiAoaXNfY29uc3QpIHsKKyAgICByZXR1cm4gImNvbnN0ICIgKyBwbmFtZTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gcG5hbWU7CisgIH0KK30KKworLyoqCisgKiBNYXBzIGEgVGhyaWZ0IHByaW1pdGl2ZSB0byB0aGUgdHlwZSBuZWVkZWQgdG8gaG9sZCBpdHMgdmFsdWUgd2hlbiB1c2VkIGFzIGFuCisgKiBvYmplY3QgcHJvcGVydHkuCisgKgorICogVGhpcyBtZXRob2QgaXMgbmVlZGVkIGJlY2F1c2UgYWxsIGludGVnZXIgcHJvcGVydGllcyBvZiB3aWR0aCBsZXNzIHRoYW4gNjQKKyAqIGJpdHMgbWFwIHRvIHRoZSBzYW1lIHR5cGUsIGdpbnQsIGFzIG9wcG9zZWQgdG8gdGhlaXIgd2lkdGgtc3BlY2lmaWMgdHlwZQorICogKGdpbnQ4LCBnaW50MTYgb3IgZ2ludDMyKS4KKyAqLworc3RyaW5nIHRfY19nbGliX2dlbmVyYXRvcjo6cHJvcGVydHlfdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsIGJvb2wgaW5fdHlwZWRlZiwgYm9vbCBpc19jb25zdCkgeworICBzdHJpbmcgcmVzdWx0OworCisgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICBzd2l0Y2ggKCgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICBpZiAoaXNfY29uc3QpIHsKKyAgICAgICAgcmVzdWx0ID0gImNvbnN0IGdpbnQiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzdWx0ID0gImdpbnQiOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgcmVzdWx0ID0gdHlwZV9uYW1lKHR0eXBlLCBpbl90eXBlZGVmLCBpc19jb25zdCk7CisgICAgfQorICB9IGVsc2UgeworICAgIHJlc3VsdCA9IHR5cGVfbmFtZSh0dHlwZSwgaW5fdHlwZWRlZiwgaXNfY29uc3QpOworICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBNYXBzIGEgVGhyaWZ0IHByaW1pdGl2ZSB0byBhIEMgcHJpbWl0aXZlLgorICovCitzdHJpbmcgdF9jX2dsaWJfZ2VuZXJhdG9yOjpiYXNlX3R5cGVfbmFtZSh0X3R5cGUqIHR5cGUpIHsKKyAgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiB0eXBlX25hbWUodHlwZSk7CisgIH0KKyAgaWYgKCF0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRocm93IHN0ZDo6aW52YWxpZF9hcmd1bWVudCgiT25seSBiYXNlIHR5cGVzIGFyZSBzdXBwcG9ydGVkLiIpOworICB9CisgIHRfYmFzZV90eXBlKiBiYXNlX3R5cGUgPSByZWludGVycHJldF9jYXN0PHRfYmFzZV90eXBlKj4odHlwZSk7CisgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSBiYXNlX3R5cGUtPmdldF9iYXNlKCk7CisgIHN3aXRjaCAodGJhc2UpIHsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgIHJldHVybiAidm9pZCI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgIGlmIChiYXNlX3R5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICByZXR1cm4gIkdCeXRlQXJyYXkgKiI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAiZ2NoYXIgKiI7CisgICAgfQorICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgcmV0dXJuICJnYm9vbGVhbiI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgcmV0dXJuICJnaW50OCI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIHJldHVybiAiZ2ludDE2IjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgcmV0dXJuICJnaW50MzIiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICByZXR1cm4gImdpbnQ2NCI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgIHJldHVybiAiZ2RvdWJsZSI7CisgIGRlZmF1bHQ6CisgICAgdGhyb3cgc3RkOjpsb2dpY19lcnJvcigiY29tcGlsZXIgZXJyb3I6IG5vIEMgYmFzZSB0eXBlIG5hbWUgZm9yIGJhc2UgdHlwZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSkpOworICB9Cit9CisKKy8qKgorICogUmV0dXJucyBhIG1lbWJlciBvZiB0aGUgVGhyaWZ0VHlwZSBDIGVudW1lcmF0aW9uIGluIHRocmlmdF9wcm90b2NvbC5oCisgKiBmb3IgYSBUaHJpZnQgdHlwZS4KKyAqLworc3RyaW5nIHRfY19nbGliX2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICJUX1NUUklORyI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICJUX0JPT0wiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZXR1cm4gIlRfQllURSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gIlRfSTE2IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAiVF9JMzIiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICJUX0k2NCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIlRfRE9VQkxFIjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJUX0kzMiI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkpIHsKKyAgICByZXR1cm4gIlRfU1RSVUNUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICJUX1NUUlVDVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gIlRfTUFQIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAiVF9TRVQiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAiVF9MSVNUIjsKKyAgfQorCisgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKworLyoqCisgKiBSZXR1cm5zIGEgVGhyaWZ0IGNvbnN0YW50IGZvcm1hdHRlZCBhcyBhIGxpdGVyYWwgZm9yIGluY2x1c2lvbiBpbiBDIGNvZGUuCisgKi8KK3N0cmluZyB0X2NfZ2xpYl9nZW5lcmF0b3I6OmNvbnN0YW50X2xpdGVyYWwodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgeworICBvc3RyaW5nc3RyZWFtIHJlbmRlcjsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAvKiBwcmltaXRpdmVzICovCisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworCisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmVuZGVyIDw8ICJcIiIgKyB2YWx1ZS0+Z2V0X3N0cmluZygpICsgIlwiIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJlbmRlciA8PCAoKHZhbHVlLT5nZXRfaW50ZWdlcigpICE9IDApID8gIlRSVUUiIDogIkZBTFNFIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgdF9jb25zdF92YWx1ZTo6dF9jb25zdF92YWx1ZV90eXBlIHZhbHVlX3R5cGUgPSB2YWx1ZS0+Z2V0X3R5cGUoKTsKKworICAgIHN3aXRjaCAodmFsdWVfdHlwZSkgeworICAgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfSURFTlRJRklFUjoKKyAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfTElTVDoKKyAgICAgIHJlbmRlciA8PCAieyAiOworICAgICAgeworICAgICAgICB0X3R5cGUqIGVsZW1fdHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgICAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiBsaXN0ID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIGxpc3RfaXRlcjsKKworICAgICAgICBpZiAobGlzdC5zaXplKCkgPiAwKSB7CisgICAgICAgICAgbGlzdF9pdGVyID0gbGlzdC5iZWdpbigpOworICAgICAgICAgIHJlbmRlciA8PCBjb25zdGFudF9saXRlcmFsKGVsZW1fdHlwZSwgKmxpc3RfaXRlcik7CisKKyAgICAgICAgICB3aGlsZSAoKytsaXN0X2l0ZXIgIT0gbGlzdC5lbmQoKSkgeworICAgICAgICAgICAgcmVuZGVyIDw8ICIsICIgPDwgY29uc3RhbnRfbGl0ZXJhbChlbGVtX3R5cGUsICpsaXN0X2l0ZXIpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmVuZGVyIDw8ICIgfSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX01BUDoKKyAgICBkZWZhdWx0OgorICAgICAgcmVuZGVyIDw8ICJOVUxMIC8qIG5vdCBzdXBwb3J0ZWQgKi8iOworICAgIH0KKyAgfQorCisgIHJldHVybiByZW5kZXIuc3RyKCk7Cit9CisKKy8qKgorICogUmV0dXJucyBDIGNvZGUgdGhhdCByZXByZXNlbnRzIGEgVGhyaWZ0IGNvbnN0YW50LgorICovCitzdHJpbmcgdF9jX2dsaWJfZ2VuZXJhdG9yOjpjb25zdGFudF92YWx1ZShzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgeworICBvc3RyaW5nc3RyZWFtIHJlbmRlcjsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAvKiBwcmltaXRpdmVzICovCisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJlbmRlciA8PCAiZ19zdHJkdXAgKFwiIiArIHZhbHVlLT5nZXRfc3RyaW5nKCkgKyAiXCIpIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJlbmRlciA8PCAoKHZhbHVlLT5nZXRfaW50ZWdlcigpICE9IDApID8gMSA6IDApOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmVuZGVyIDw8ICJHX0dJTlQ2NF9DT05TVEFOVCAoIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiKSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7CisgICAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZW5kZXIgPDwgIigiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiKSIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgIH0gZWxzZSBpZiAoaXNfY29tcGxleF90eXBlKHR5cGUpKSB7CisgICAgcmVuZGVyIDw8ICIoIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgdG9fbG93ZXJfY2FzZShuYW1lKSA8PCAiX2NvbnN0YW50KCkpIjsKKyAgfSBlbHNlIHsKKyAgICByZW5kZXIgPDwgIk5VTEwgLyogbm90IHN1cHBvcnRlZCAqLyI7CisgIH0KKworICByZXR1cm4gcmVuZGVyLnN0cigpOworfQorCisvKioKKyAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGZvcm0gJ3R5cGUgbmFtZShhcmdzKScKKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KKyAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KKyAqLworc3RyaW5nIHRfY19nbGliX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICB0X3R5cGUqIHR0eXBlID0gdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpOworICB0X3N0cnVjdCogYXJnbGlzdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKKyAgdF9zdHJ1Y3QqIHhsaXN0ID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIHN0cmluZyBmbmFtZSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3Jlcyh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpOworCisgIGJvb2wgaGFzX3JldHVybiA9ICF0dHlwZS0+aXNfdm9pZCgpOworICBib29sIGhhc19hcmdzID0gYXJnbGlzdC0+Z2V0X21lbWJlcnMoKS5zaXplKCkgPT0gMDsKKyAgYm9vbCBoYXNfeGNlcHRpb25zID0geGxpc3QtPmdldF9tZW1iZXJzKCkuc2l6ZSgpID09IDA7CisgIHJldHVybiAiZ2Jvb2xlYW4gIiArIHRoaXMtPm5zcGFjZV9sYyArIGZuYW1lICsgIiAoIiArIHRoaXMtPm5zcGFjZSArIHNlcnZpY2VfbmFtZV8gKyAiSWYgKiBpZmFjZSIKKyAgICAgICAgICsgKGhhc19yZXR1cm4gPyAiLCAiICsgdHlwZV9uYW1lKHR0eXBlKSArICIqIF9yZXR1cm4iIDogIiIpCisgICAgICAgICArIChoYXNfYXJncyA/ICIiIDogKCIsICIgKyBhcmd1bWVudF9saXN0KGFyZ2xpc3QpKSkKKyAgICAgICAgICsgKGhhc194Y2VwdGlvbnMgPyAiIiA6ICgiLCAiICsgeGNlcHRpb25fbGlzdCh4bGlzdCkpKSArICIsIEdFcnJvciAqKiBlcnJvcikiOworfQorCisvKioKKyAqIFJlbmRlcnMgYSBmaWVsZCBsaXN0CisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKiBAcmV0dXJuIENvbW1hIHNlcGVhcmF0ZWQgbGlzdCBvZiBhbGwgZmllbGQgbmFtZXMgaW4gdGhhdCBzdHJ1Y3QKKyAqLworc3RyaW5nIHRfY19nbGliX2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBzdHJpbmcgcmVzdWx0ID0gIiI7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdCArPSAiLCAiOworICAgIH0KKyAgICByZXN1bHQgKz0gdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIHRydWUpICsgIiAiICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogUmVuZGVycyBtdXRhYmxlIGV4Y2VwdGlvbiBsaXN0cworICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICogQHJldHVybiBDb21tYSBzZXBlYXJhdGVkIGxpc3Qgb2YgYWxsIGZpZWxkIG5hbWVzIGluIHRoYXQgc3RydWN0CisgKi8KK3N0cmluZyB0X2NfZ2xpYl9nZW5lcmF0b3I6OnhjZXB0aW9uX2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgKz0gIiwgIjsKKyAgICB9CisgICAgcmVzdWx0ICs9IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF90eXBlKCksIGZhbHNlLCBmYWxzZSkgKyAiKiAiICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogRGVjbGFyZXMgYSBmaWVsZCwgaW5jbHVkaW5nIGFueSBuZWNlc3NhcnkgaW5pdGlhbGl6YXRpb24uCisgKi8KK3N0cmluZyB0X2NfZ2xpYl9nZW5lcmF0b3I6OmRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcG9pbnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBjb25zdGFudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZWZlcmVuY2UpIHsKKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworICBpZiAoY29uc3RhbnQpIHsKKyAgICByZXN1bHQgKz0gImNvbnN0ICI7CisgIH0KKyAgcmVzdWx0ICs9IHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCkpOworICBpZiAocG9pbnRlcikgeworICAgIHJlc3VsdCArPSAiKiI7CisgIH0KKyAgaWYgKHJlZmVyZW5jZSkgeworICAgIHJlc3VsdCArPSAiKiI7CisgIH0KKyAgcmVzdWx0ICs9ICIgIiArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgaWYgKGluaXQpIHsKKyAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICByZXN1bHQgKz0gIiA9IDAiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICByZXN1bHQgKz0gIiA9IChnZG91YmxlKSAwIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgcmVzdWx0ICs9ICIgPSBOVUxMIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEMgaW50aWFsaXplciBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICByZXN1bHQgKz0gIiA9ICgiICsgdHlwZV9uYW1lKHR5cGUpICsgIikgMCI7CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgICAgcmVzdWx0ICs9ICIgPSBOVUxMIjsKKyAgICB9CisgIH0KKworICBpZiAoIXJlZmVyZW5jZSkgeworICAgIHJlc3VsdCArPSAiOyI7CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCitzdHJpbmcgdF9jX2dsaWJfZ2VuZXJhdG9yOjpjb25zdGFudF92YWx1ZV93aXRoX3N0b3JhZ2Uoc3RyaW5nIGZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogZXR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKyAgb3N0cmluZ3N0cmVhbSByZW5kZXI7CisgIGlmIChpc19udW1lcmljKGV0eXBlKSkgeworICAgIHJlbmRlciA8PCAiICAgICIgPDwgdHlwZV9uYW1lKGV0eXBlKSA8PCAiICoiIDw8IGZuYW1lIDw8ICIgPSAiCisgICAgICAgICAgIDw8ICJnX25ldyAoIiA8PCBiYXNlX3R5cGVfbmFtZShldHlwZSkgPDwgIiwgMSk7IiA8PCBlbmRsCisgICAgICAgICAgIDw8ICIgICAgKiIgPDwgZm5hbWUgPDwgIiA9ICIgPDwgY29uc3RhbnRfdmFsdWUoZm5hbWUsICh0X3R5cGUqKWV0eXBlLCB2YWx1ZSkgPDwgIjsiCisgICAgICAgICAgIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgcmVuZGVyIDw8ICIgICAgIiA8PCB0eXBlX25hbWUoZXR5cGUpIDw8ICIgIiA8PCBmbmFtZSA8PCAiID0gIgorICAgICAgICAgICA8PCBjb25zdGFudF92YWx1ZShmbmFtZSwgKHRfdHlwZSopZXR5cGUsIHZhbHVlKSA8PCAiOyIgPDwgZW5kbDsKKyAgfQorICByZXR1cm4gcmVuZGVyLnN0cigpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBDIGNvZGUgdGhhdCBpbml0aWFsaXplcyBjb21wbGV4IGNvbnN0YW50cy4KKyAqLwordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0X2luaXRpYWxpemVyKHN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHRvcF9sZXZlbCkgeworICBzdHJpbmcgbmFtZV91ID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKG5hbWUpOworICBzdHJpbmcgbmFtZV9sYyA9IHRvX2xvd2VyX2Nhc2UobmFtZV91KTsKKyAgc3RyaW5nIHR5cGVfdSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3Jlcyh0eXBlLT5nZXRfbmFtZSgpKTsKKyAgc3RyaW5nIHR5cGVfdWMgPSB0b191cHBlcl9jYXNlKHR5cGVfdSk7CisgIHN0cmluZyBtYXliZV9zdGF0aWMgPSB0b3BfbGV2ZWwgPyAiIiA6ICJzdGF0aWMgIjsKKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIG9zdHJpbmdzdHJlYW0gaW5pdGlhbGl6ZXJzOworCisgICAgLy8gaW5pdGlhbGl6ZSBhbnkgY29uc3RhbnRzIHRoYXQgbWF5IGJlIHJlZmVyZW5jZWQgYnkgdGhpcyBpbml0aWFsaXplcgorICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOworICAgICAgc3RyaW5nIGZpZWxkX25hbWUgPSAiIjsKKworICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKKyAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgICAgIGZpZWxkX25hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKKyAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIgorICAgICAgICAgICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOworICAgICAgfQorICAgICAgZmllbGRfbmFtZSA9IHRtcChmaWVsZF9uYW1lKTsKKworICAgICAgZ2VuZXJhdGVfY29uc3RfaW5pdGlhbGl6ZXIobmFtZSArICJfY29uc3RhbnRfIiArIGZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9pdGVyLT5zZWNvbmQpOworICAgICAgaW5pdGlhbGl6ZXJzIDw8ICIgICAgY29uc3RhbnQtPiIgPDwgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpIDw8ICIgPSAiCisgICAgICAgICAgICAgICAgICAgPDwgY29uc3RhbnRfdmFsdWUobmFtZSArICJfY29uc3RhbnRfIiArIGZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X2l0ZXItPnNlY29uZCkgPDwgIjsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICA8PCAiICAgIGNvbnN0YW50LT5fX2lzc2V0XyIgPDwgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpCisgICAgICAgICAgICAgICAgICAgPDwgIiA9IFRSVUU7IiA8PCBlbmRsOworICAgIH0KKworICAgIC8vIGltcGxlbWVudCB0aGUgaW5pdGlhbGl6ZXIKKyAgICBmX3R5cGVzX2ltcGxfIDw8IG1heWJlX3N0YXRpYyA8PCB0aGlzLT5uc3BhY2UgPDwgdHlwZS0+Z2V0X25hbWUoKSA8PCAiICoiCisgICAgICAgICAgICAgICAgICA8PCBlbmRsCisgICAgICAgICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgbmFtZV9sYyA8PCAiX2NvbnN0YW50ICh2b2lkKSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3R5cGVzX2ltcGxfKTsKKyAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJzdGF0aWMgIiA8PCB0aGlzLT5uc3BhY2UgPDwgdHlwZS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgPDwgIiAqY29uc3RhbnQgPSBOVUxMOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmIChjb25zdGFudCA9PSBOVUxMKSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3R5cGVzX2ltcGxfKTsKKyAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJjb25zdGFudCA9IGdfb2JqZWN0X25ldyAoIiA8PCB0aGlzLT5uc3BhY2VfdWMKKyAgICAgICAgICAgICAgICAgIDw8ICJUWVBFXyIgPDwgdHlwZV91YyA8PCAiLCBOVUxMKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgIDw8IGluaXRpYWxpemVycy5zdHIoKTsKKyAgICBzY29wZV9kb3duKGZfdHlwZXNfaW1wbF8pOworCisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7CisgICAgICBzdHJpbmcgZmllbGRfbmFtZSA9ICIiOworCisgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgeworICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgICAgICAgZmllbGRfbmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgeworICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiCisgICAgICAgICAgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisgICAgICB9CisgICAgICBmaWVsZF9uYW1lID0gdG1wKGZpZWxkX25hbWUpOworICAgIH0KKworICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgInJldHVybiBjb25zdGFudDsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihmX3R5cGVzX2ltcGxfKTsKKyAgICBmX3R5cGVzX2ltcGxfIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgc3RyaW5nIGxpc3RfdHlwZSA9ICJHUHRyQXJyYXkgKiI7CisgICAgc3RyaW5nIGZyZWVfZnVuYworICAgICAgICA9IGdlbmVyYXRlX2ZyZWVfZnVuY19mcm9tX3R5cGUocmVpbnRlcnByZXRfY2FzdDx0X2xpc3QqPih0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKTsKKyAgICBzdHJpbmcgbGlzdF9pbml0aWFsaXplciA9ICJnX3B0cl9hcnJheV9uZXdfd2l0aF9mcmVlX2Z1bmMgKCIgKyBmcmVlX2Z1bmMgKyAiKTsiOworICAgIHN0cmluZyBsaXN0X2FwcGVuZGVyID0gImdfcHRyX2FycmF5X2FkZCI7CisgICAgYm9vbCBsaXN0X3ZhcmlhYmxlID0gZmFsc2U7CisKKyAgICB0X3R5cGUqIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIG9zdHJpbmdzdHJlYW0gaW5pdGlhbGl6ZXJzOworICAgIG9zdHJpbmdzdHJlYW0gYXBwZW5kZXJzOworCisgICAgbGlzdF9pbml0aWFsaXplciA9IGdlbmVyYXRlX25ld19hcnJheV9mcm9tX3R5cGUoZXR5cGUpOworICAgIGlmIChldHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKilldHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IGRldGVybWluZSBhcnJheSB0eXBlIjsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgbGlzdF90eXBlID0gIkdBcnJheSAqIjsKKyAgICAgICAgbGlzdF9hcHBlbmRlciA9ICJnX2FycmF5X2FwcGVuZF92YWwiOworICAgICAgICBsaXN0X3ZhcmlhYmxlID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGFycmF5IGluZm8gZm9yIHR5cGUiOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoZXR5cGUtPmlzX2VudW0oKSkgeworICAgICAgbGlzdF90eXBlID0gIkdBcnJheSAqIjsKKyAgICAgIGxpc3RfYXBwZW5kZXIgPSAiZ19hcnJheV9hcHBlbmRfdmFsIjsKKyAgICAgIGxpc3RfdmFyaWFibGUgPSB0cnVlOworICAgIH0KKworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBzdHJpbmcgZm5hbWUgPSB0bXAobmFtZSk7CisKKyAgICAgIGdlbmVyYXRlX2NvbnN0X2luaXRpYWxpemVyKGZuYW1lLCBldHlwZSwgKCp2X2l0ZXIpKTsKKyAgICAgIGlmIChsaXN0X3ZhcmlhYmxlKSB7CisgICAgICAgIGluaXRpYWxpemVycyA8PCAiICAgICIgPDwgdHlwZV9uYW1lKGV0eXBlKSA8PCAiICIgPDwgZm5hbWUgPDwgIiA9ICIKKyAgICAgICAgICAgICAgICAgICAgIDw8IGNvbnN0YW50X3ZhbHVlKGZuYW1lLCAodF90eXBlKilldHlwZSwgKCp2X2l0ZXIpKSA8PCAiOyIKKyAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIGFwcGVuZGVycyA8PCAiICAgICIgPDwgbGlzdF9hcHBlbmRlciA8PCAiKGNvbnN0YW50LCAiIDw8IGZuYW1lIDw8ICIpOyIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBhcHBlbmRlcnMgPDwgIiAgICAiIDw8IGxpc3RfYXBwZW5kZXIgPDwgIihjb25zdGFudCwgIgorICAgICAgICAgICAgICAgICAgPDwgY29uc3RhbnRfdmFsdWUoZm5hbWUsICh0X3R5cGUqKWV0eXBlLCAoKnZfaXRlcikpIDw8ICIpOyIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorCisgICAgZl90eXBlc19pbXBsXyA8PCBtYXliZV9zdGF0aWMgPDwgbGlzdF90eXBlIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX2xjIDw8ICJfY29uc3RhbnQgKHZvaWQpIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfdHlwZXNfaW1wbF8pOworICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgInN0YXRpYyAiIDw8IGxpc3RfdHlwZSA8PCAiIGNvbnN0YW50ID0gTlVMTDsiCisgICAgICAgICAgICAgICAgICA8PCBlbmRsCisgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKGNvbnN0YW50ID09IE5VTEwpIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfdHlwZXNfaW1wbF8pOworICAgIGlmICghaW5pdGlhbGl6ZXJzLnN0cigpLmVtcHR5KCkpIHsKKyAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5pdGlhbGl6ZXJzLnN0cigpCisgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfQorICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgImNvbnN0YW50ID0gIiA8PCBsaXN0X2luaXRpYWxpemVyIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgIDw8IGFwcGVuZGVycy5zdHIoKTsKKyAgICBzY29wZV9kb3duKGZfdHlwZXNfaW1wbF8pOworICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgInJldHVybiBjb25zdGFudDsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihmX3R5cGVzX2ltcGxfKTsKKyAgICBmX3R5cGVzX2ltcGxfIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3R5cGUqIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgb3N0cmluZ3N0cmVhbSBpbml0aWFsaXplcnM7CisgICAgb3N0cmluZ3N0cmVhbSBhcHBlbmRlcnM7CisKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgc3RyaW5nIGZuYW1lID0gdG1wKG5hbWUpOworICAgICAgc3RyaW5nIHB0ciA9IGlzX251bWVyaWMoZXR5cGUpID8gIioiIDogIiI7CisgICAgICBnZW5lcmF0ZV9jb25zdF9pbml0aWFsaXplcihmbmFtZSwgZXR5cGUsICgqdl9pdGVyKSk7CisgICAgICBpbml0aWFsaXplcnMgPDwgY29uc3RhbnRfdmFsdWVfd2l0aF9zdG9yYWdlKGZuYW1lLCAodF90eXBlKilldHlwZSwgKnZfaXRlcik7CisgICAgICBhcHBlbmRlcnMgPDwgIiAgICBnX2hhc2hfdGFibGVfaW5zZXJ0IChjb25zdGFudCwgIiA8PCBmbmFtZSA8PCAiLCAwKTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgZl90eXBlc19pbXBsXyA8PCBtYXliZV9zdGF0aWMgPDwgIkdIYXNoVGFibGUgKiIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IG5hbWVfbGMgPDwgIl9jb25zdGFudCAodm9pZCkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl90eXBlc19pbXBsXyk7CisgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAic3RhdGljIEdIYXNoVGFibGUgKmNvbnN0YW50ID0gTlVMTDsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoY29uc3RhbnQgPT0gTlVMTCkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl90eXBlc19pbXBsXyk7CisgICAgZl90eXBlc19pbXBsXyA8PCBpbml0aWFsaXplcnMuc3RyKCkgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImNvbnN0YW50ID0gIiA8PCBnZW5lcmF0ZV9uZXdfaGFzaF9mcm9tX3R5cGUoZXR5cGUsIE5VTEwpIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgIDw8IGFwcGVuZGVycy5zdHIoKTsKKyAgICBzY29wZV9kb3duKGZfdHlwZXNfaW1wbF8pOworICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgInJldHVybiBjb25zdGFudDsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihmX3R5cGVzX2ltcGxfKTsKKyAgICBmX3R5cGVzX2ltcGxfIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBvc3RyaW5nc3RyZWFtIGluaXRpYWxpemVyczsKKyAgICBvc3RyaW5nc3RyZWFtIGFwcGVuZGVyczsKKworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBzdHJpbmcgZm5hbWUgPSB0bXAobmFtZSk7CisgICAgICBzdHJpbmcga25hbWUgPSBmbmFtZSArICJrZXkiOworICAgICAgc3RyaW5nIHZuYW1lID0gZm5hbWUgKyAidmFsIjsKKyAgICAgIGdlbmVyYXRlX2NvbnN0X2luaXRpYWxpemVyKGtuYW1lLCBrdHlwZSwgdl9pdGVyLT5maXJzdCk7CisgICAgICBnZW5lcmF0ZV9jb25zdF9pbml0aWFsaXplcih2bmFtZSwgdnR5cGUsIHZfaXRlci0+c2Vjb25kKTsKKworICAgICAgaW5pdGlhbGl6ZXJzIDw8IGNvbnN0YW50X3ZhbHVlX3dpdGhfc3RvcmFnZShrbmFtZSwgKHRfdHlwZSopa3R5cGUsIHZfaXRlci0+Zmlyc3QpOworICAgICAgaW5pdGlhbGl6ZXJzIDw8IGNvbnN0YW50X3ZhbHVlX3dpdGhfc3RvcmFnZSh2bmFtZSwgKHRfdHlwZSopdnR5cGUsIHZfaXRlci0+c2Vjb25kKTsKKyAgICAgIGFwcGVuZGVycyA8PCAiICAgIGdfaGFzaF90YWJsZV9pbnNlcnQgKGNvbnN0YW50LCAiIDw8IGtuYW1lIDw8ICIsICIgPDwgdm5hbWUgPDwgIik7IiA8PCBlbmRsOworICAgIH0KKworICAgIGZfdHlwZXNfaW1wbF8gPDwgbWF5YmVfc3RhdGljIDw8ICJHSGFzaFRhYmxlICoiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX2xjIDw8ICJfY29uc3RhbnQgKHZvaWQpIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfdHlwZXNfaW1wbF8pOworICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgInN0YXRpYyBHSGFzaFRhYmxlICpjb25zdGFudCA9IE5VTEw7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKGNvbnN0YW50ID09IE5VTEwpIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfdHlwZXNfaW1wbF8pOworICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5pdGlhbGl6ZXJzLnN0cigpIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJjb25zdGFudCA9ICIgPDwgZ2VuZXJhdGVfbmV3X2hhc2hfZnJvbV90eXBlKGt0eXBlLCB2dHlwZSkgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgPDwgYXBwZW5kZXJzLnN0cigpOworICAgIHNjb3BlX2Rvd24oZl90eXBlc19pbXBsXyk7CisgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGNvbnN0YW50OyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKGZfdHlwZXNfaW1wbF8pOworICAgIGZfdHlwZXNfaW1wbF8gPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBoZWxwZXIgY2xhc3NlcyBmb3IgYSBzZXJ2aWNlLCBjb25zaXN0aW5nIG9mIGEgVGhyaWZ0U3RydWN0IHN1YmNsYXNzCisgKiBmb3IgdGhlIGFyZ3VtZW50cyB0byBhbmQgdGhlIHJlc3VsdCBmcm9tIGVhY2ggbWV0aG9kLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBmb3Igd2hpY2ggdG8gZ2VuZXJhdGUgaGVscGVyIGNsYXNzZXMKKyAqLwordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZnVuY3Rpb25faXRlcjsKKworICAvLyBJdGVyYXRlIHRocm91Z2ggdGhlIHNlcnZpY2UncyBtZXRob2RzCisgIGZvciAoZnVuY3Rpb25faXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmdW5jdGlvbl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmdW5jdGlvbl9pdGVyKSB7CisgICAgc3RyaW5nIGZ1bmN0aW9uX25hbWUgPSAoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIHRfc3RydWN0KiBhcmdfbGlzdCA9ICgqZnVuY3Rpb25faXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgc3RyaW5nIGFyZ19saXN0X25hbWVfb3JpZyA9IGFyZ19saXN0LT5nZXRfbmFtZSgpOworCisgICAgLy8gR2VuZXJhdGUgdGhlIGFyZ3VtZW50cyBjbGFzcworICAgIGFyZ19saXN0LT5zZXRfbmFtZSh0c2VydmljZS0+Z2V0X25hbWUoKSArIHVuZGVyc2NvcmVzX3RvX2luaXRpYWxfY2FwcyhmdW5jdGlvbl9uYW1lKSArICJBcmdzIik7CisgICAgZ2VuZXJhdGVfc3RydWN0KGFyZ19saXN0KTsKKworICAgIGFyZ19saXN0LT5zZXRfbmFtZShhcmdfbGlzdF9uYW1lX29yaWcpOworCisgICAgLy8gR2VuZXJhdGUgdGhlIHJlc3VsdCBjbGFzcworICAgIGlmICghKCpmdW5jdGlvbl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywKKyAgICAgICAgICAgICAgICAgICAgICB0c2VydmljZS0+Z2V0X25hbWUoKSArIHVuZGVyc2NvcmVzX3RvX2luaXRpYWxfY2FwcyhmdW5jdGlvbl9uYW1lKSArICJSZXN1bHQiKTsKKyAgICAgIHRfZmllbGQgc3VjY2VzcygoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOworICAgICAgc3VjY2Vzcy5zZXRfcmVxKHRfZmllbGQ6OlRfT1BUSU9OQUwpOworICAgICAgaWYgKCEoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7CisgICAgICB9CisKKyAgICAgIHRfc3RydWN0KiB4cyA9ICgqZnVuY3Rpb25faXRlciktPmdldF94Y2VwdGlvbnMoKTsKKyAgICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOworICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmllbGRfaXRlcjsKKyAgICAgIGZvciAoZmllbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmaWVsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmaWVsZF9pdGVyKSB7CisgICAgICAgICgqZmllbGRfaXRlciktPnNldF9yZXEodF9maWVsZDo6VF9PUFRJT05BTCk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoKmZpZWxkX2l0ZXIpOworICAgICAgfQorCisgICAgICBnZW5lcmF0ZV9zdHJ1Y3QoJnJlc3VsdCk7CisgICAgfQorICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIEMgY29kZSB0aGF0IHJlcHJlc2VudHMgYSBUaHJpZnQgc2VydmljZSBjbGllbnQuCisgKi8KK3ZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIC8qIGdldCBzb21lIEMgZnJpZW5kbHkgc2VydmljZSBuYW1lcyAqLworICBzdHJpbmcgc2VydmljZV9uYW1lX2xjID0gdG9fbG93ZXJfY2FzZShpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoc2VydmljZV9uYW1lXykpOworICBzdHJpbmcgc2VydmljZV9uYW1lX3VjID0gdG9fdXBwZXJfY2FzZShzZXJ2aWNlX25hbWVfbGMpOworCisgIHN0cmluZyBwYXJlbnRfc2VydmljZV9uYW1lOworICBzdHJpbmcgcGFyZW50X3NlcnZpY2VfbmFtZV9sYzsKKyAgc3RyaW5nIHBhcmVudF9zZXJ2aWNlX25hbWVfdWM7CisKKyAgc3RyaW5nIHBhcmVudF9jbGFzc19uYW1lID0gIkdPYmplY3QiOworICBzdHJpbmcgcGFyZW50X3R5cGVfbmFtZSA9ICJHX1RZUEVfT0JKRUNUIjsKKworICAvLyBUaGUgc2VydmljZSB0aGlzIHNlcnZpY2UgZXh0ZW5kcywgb3IgTlVMTCBpZiBpdCBleHRlbmRzIG5vCisgIC8vIHNlcnZpY2UKKyAgdF9zZXJ2aWNlKiBleHRlbmRzX3NlcnZpY2UgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKKyAgaWYgKGV4dGVuZHNfc2VydmljZSkgeworICAgIC8vIFRoZSBuYW1lIG9mIHRoZSBwYXJlbnQgc2VydmljZQorICAgIHBhcmVudF9zZXJ2aWNlX25hbWUgPSBleHRlbmRzX3NlcnZpY2UtPmdldF9uYW1lKCk7CisgICAgcGFyZW50X3NlcnZpY2VfbmFtZV9sYyA9IHRvX2xvd2VyX2Nhc2UoaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKHBhcmVudF9zZXJ2aWNlX25hbWUpKTsKKyAgICBwYXJlbnRfc2VydmljZV9uYW1lX3VjID0gdG9fdXBwZXJfY2FzZShwYXJlbnRfc2VydmljZV9uYW1lX2xjKTsKKworICAgIC8vIFRoZSBuYW1lcyBvZiB0aGUgY2xpZW50IGNsYXNzJyBwYXJlbnQgY2xhc3MgYW5kIHR5cGUKKyAgICBwYXJlbnRfY2xhc3NfbmFtZSA9IHRoaXMtPm5zcGFjZSArIHBhcmVudF9zZXJ2aWNlX25hbWUgKyAiQ2xpZW50IjsKKyAgICBwYXJlbnRfdHlwZV9uYW1lID0gdGhpcy0+bnNwYWNlX3VjICsgIlRZUEVfIiArIHBhcmVudF9zZXJ2aWNlX25hbWVfdWMgKyAiX0NMSUVOVCI7CisgIH0KKworICAvLyBUaGUgYmFzZSBzZXJ2aWNlICh0aGUgdG9wbW9zdCBpbiB0aGUgImV4dGVuZHMiIGhpZXJhcmNoeSksIG9uCisgIC8vIHdob3NlIGNsaWVudCBjbGFzcyB0aGUgImlucHV0X3Byb3RvY29sIiBhbmQgIm91dHB1dF9wcm90b2NvbCIKKyAgLy8gcHJvcGVydGllcyBhcmUgZGVmaW5lZAorICB0X3NlcnZpY2UqIGJhc2Vfc2VydmljZSA9IHRzZXJ2aWNlOworICB3aGlsZSAoYmFzZV9zZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKSB7CisgICAgYmFzZV9zZXJ2aWNlID0gYmFzZV9zZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworICB9CisKKyAgc3RyaW5nIGJhc2Vfc2VydmljZV9uYW1lID0gYmFzZV9zZXJ2aWNlLT5nZXRfbmFtZSgpOworICBzdHJpbmcgYmFzZV9zZXJ2aWNlX25hbWVfbGMgPSB0b19sb3dlcl9jYXNlKGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhiYXNlX3NlcnZpY2VfbmFtZSkpOworICBzdHJpbmcgYmFzZV9zZXJ2aWNlX25hbWVfdWMgPSB0b191cHBlcl9jYXNlKGJhc2Vfc2VydmljZV9uYW1lX2xjKTsKKworICAvLyBHZW5lcmF0ZSB0aGUgY2xpZW50IGludGVyZmFjZSBkdW1teSBvYmplY3QgaW4gdGhlIGhlYWRlci4KKyAgZl9oZWFkZXJfIDw8ICIvKiAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIiBzZXJ2aWNlIGludGVyZmFjZSAqLyIgPDwgZW5kbCA8PCAidHlwZWRlZiBzdHJ1Y3QgXyIKKyAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZiAiIDw8IHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZjsgIgorICAgICAgICAgICAgPDwgIiAvKiBkdW1teSBvYmplY3QgKi8iIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgY2xpZW50IGludGVyZmFjZSBvYmplY3QgaW4gdGhlIGhlYWRlci4KKyAgZl9oZWFkZXJfIDw8ICJzdHJ1Y3QgXyIgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmSW50ZXJmYWNlIiA8PCBlbmRsIDw8ICJ7IiA8PCBlbmRsCisgICAgICAgICAgICA8PCAiICBHVHlwZUludGVyZmFjZSBwYXJlbnQ7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLyogd3JpdGUgb3V0IHRoZSBmdW5jdGlvbnMgZm9yIHRoaXMgaW50ZXJmYWNlICovCisgIGluZGVudF91cCgpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAvKiBtYWtlIHRoZSBmdW5jdGlvbiBuYW1lIEMgZnJpZW5kbHkgKi8KKyAgICBzdHJpbmcgZnVubmFtZSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcygoKmZfaXRlciktPmdldF9uYW1lKCkpOworICAgIHRfdHlwZSogdHR5cGUgPSAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCk7CisgICAgdF9zdHJ1Y3QqIGFyZ2xpc3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgdF9zdHJ1Y3QqIHhsaXN0ID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7CisgICAgYm9vbCBoYXNfcmV0dXJuID0gIXR0eXBlLT5pc192b2lkKCk7CisgICAgYm9vbCBoYXNfYXJncyA9IGFyZ2xpc3QtPmdldF9tZW1iZXJzKCkuc2l6ZSgpID09IDA7CisgICAgYm9vbCBoYXNfeGNlcHRpb25zID0geGxpc3QtPmdldF9tZW1iZXJzKCkuc2l6ZSgpID09IDA7CisKKyAgICBzdHJpbmcgcGFyYW1zID0gIigiICsgdGhpcy0+bnNwYWNlICsgc2VydmljZV9uYW1lXyArICJJZiAqaWZhY2UiCisgICAgICAgICAgICAgICAgICAgICsgKGhhc19yZXR1cm4gPyAiLCAiICsgdHlwZV9uYW1lKHR0eXBlKSArICIqIF9yZXR1cm4iIDogIiIpCisgICAgICAgICAgICAgICAgICAgICsgKGhhc19hcmdzID8gIiIgOiAoIiwgIiArIGFyZ3VtZW50X2xpc3QoYXJnbGlzdCkpKQorICAgICAgICAgICAgICAgICAgICArIChoYXNfeGNlcHRpb25zID8gIiIgOiAoIiwgIiArIHhjZXB0aW9uX2xpc3QoeGxpc3QpKSkgKyAiLCBHRXJyb3IgKiplcnJvcikiOworCisgICAgaW5kZW50KGZfaGVhZGVyXykgPDwgImdib29sZWFuICgqIiA8PCBmdW5uYW1lIDw8ICIpICIgPDwgcGFyYW1zIDw8ICI7IiA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7CisKKyAgZl9oZWFkZXJfIDw8ICJ9OyIgPDwgZW5kbCA8PCAidHlwZWRlZiBzdHJ1Y3QgXyIgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmSW50ZXJmYWNlICIKKyAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZkludGVyZmFjZTsiIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBnZW5lcmF0ZSBhbGwgdGhlIGludGVyZmFjZSBib2lsZXJwbGF0ZQorICBmX2hlYWRlcl8gPDwgIkdUeXBlICIgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IHNlcnZpY2VfbmFtZV9sYyA8PCAiX2lmX2dldF90eXBlICh2b2lkKTsiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8ICIjZGVmaW5lICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSUYgIgorICAgICAgICAgICAgPDwgIigiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBzZXJ2aWNlX25hbWVfbGMgPDwgIl9pZl9nZXRfdHlwZSgpKSIgPDwgZW5kbCA8PCAiI2RlZmluZSAiCisgICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSUYob2JqKSAiCisgICAgICAgICAgICA8PCAiKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIgorICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSUYsICIgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmKSkiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8ICIjZGVmaW5lICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJJU18iIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0lGKG9iaikgIgorICAgICAgICAgICAgPDwgIihHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIKKyAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0lGKSkiIDw8IGVuZGwgPDwgIiNkZWZpbmUgIiA8PCB0aGlzLT5uc3BhY2VfdWMKKyAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0lGX0dFVF9JTlRFUkZBQ0UoaW5zdCkgKEdfVFlQRV9JTlNUQU5DRV9HRVRfSU5URVJGQUNFICgoaW5zdCksICIKKyAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0lGLCAiIDw8IHRoaXMtPm5zcGFjZQorICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lXyA8PCAiSWZJbnRlcmZhY2UpKSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIHdyaXRlIG91dCBhbGwgdGhlIGludGVyZmFjZSBmdW5jdGlvbiBwcm90b3R5cGVzCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgLyogbWFrZSB0aGUgZnVuY3Rpb24gbmFtZSBDIGZyaWVuZGx5ICovCisgICAgc3RyaW5nIGZ1bm5hbWUgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICB0X3R5cGUqIHR0eXBlID0gKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpOworICAgIHRfc3RydWN0KiBhcmdsaXN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIHRfc3RydWN0KiB4bGlzdCA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOworICAgIGJvb2wgaGFzX3JldHVybiA9ICF0dHlwZS0+aXNfdm9pZCgpOworICAgIGJvb2wgaGFzX2FyZ3MgPSBhcmdsaXN0LT5nZXRfbWVtYmVycygpLnNpemUoKSA9PSAwOworICAgIGJvb2wgaGFzX3hjZXB0aW9ucyA9IHhsaXN0LT5nZXRfbWVtYmVycygpLnNpemUoKSA9PSAwOworCisgICAgc3RyaW5nIHBhcmFtcyA9ICIoIiArIHRoaXMtPm5zcGFjZSArIHNlcnZpY2VfbmFtZV8gKyAiSWYgKmlmYWNlIgorICAgICAgICAgICAgICAgICAgICArIChoYXNfcmV0dXJuID8gIiwgIiArIHR5cGVfbmFtZSh0dHlwZSkgKyAiKiBfcmV0dXJuIiA6ICIiKQorICAgICAgICAgICAgICAgICAgICArIChoYXNfYXJncyA/ICIiIDogKCIsICIgKyBhcmd1bWVudF9saXN0KGFyZ2xpc3QpKSkKKyAgICAgICAgICAgICAgICAgICAgKyAoaGFzX3hjZXB0aW9ucyA/ICIiIDogKCIsICIgKyB4Y2VwdGlvbl9saXN0KHhsaXN0KSkpICsgIiwgR0Vycm9yICoqZXJyb3IpIjsKKworICAgIGZfaGVhZGVyXyA8PCAiZ2Jvb2xlYW4gIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjIDw8ICJfaWZfIiA8PCBmdW5uYW1lIDw8ICIgIgorICAgICAgICAgICAgICA8PCBwYXJhbXMgPDwgIjsiIDw8IGVuZGw7CisgIH0KKyAgZl9oZWFkZXJfIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIGNsaWVudCBvYmplY3QgaW5zdGFuY2UgZGVmaW5pdGlvbiBpbiB0aGUgaGVhZGVyLgorICBmX2hlYWRlcl8gPDwgIi8qICIgPDwgc2VydmljZV9uYW1lXyA8PCAiIHNlcnZpY2UgY2xpZW50ICovIiA8PCBlbmRsIDw8ICJzdHJ1Y3QgXyIgPDwgdGhpcy0+bnNwYWNlCisgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfIDw8ICJDbGllbnQiIDw8IGVuZGwgPDwgInsiIDw8IGVuZGwgPDwgIiAgIiA8PCBwYXJlbnRfY2xhc3NfbmFtZQorICAgICAgICAgICAgPDwgIiBwYXJlbnQ7IiA8PCBlbmRsOworICBpZiAoIWV4dGVuZHNfc2VydmljZSkgeworICAgIC8vIERlZmluZSAiaW5wdXRfcHJvdG9jb2wiIGFuZCAib3V0cHV0X3Byb3RvY29sIiBwcm9wZXJ0aWVzIG9ubHkKKyAgICAvLyBmb3IgYmFzZSBzZXJ2aWNlczsgY2hpbGQgc2VydmljZS1jbGllbnQgY2xhc3NlcyB3aWxsIGluaGVyaXQKKyAgICAvLyB0aGVzZQorICAgIGZfaGVhZGVyXyA8PCBlbmRsIDw8ICIgIFRocmlmdFByb3RvY29sICppbnB1dF9wcm90b2NvbDsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgPDwgIiAgVGhyaWZ0UHJvdG9jb2wgKm91dHB1dF9wcm90b2NvbDsiIDw8IGVuZGw7CisgIH0KKyAgZl9oZWFkZXJfIDw8ICJ9OyIgPDwgZW5kbCA8PCAidHlwZWRlZiBzdHJ1Y3QgXyIgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudCAiCisgICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50OyIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSBjbGFzcyBkZWZpbml0aW9uIGluIHRoZSBoZWFkZXIuCisgIGZfaGVhZGVyXyA8PCAic3RydWN0IF8iIDw8IHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJDbGllbnRDbGFzcyIgPDwgZW5kbCA8PCAieyIgPDwgZW5kbAorICAgICAgICAgICAgPDwgIiAgIiA8PCBwYXJlbnRfY2xhc3NfbmFtZSA8PCAiQ2xhc3MgcGFyZW50OyIgPDwgZW5kbCA8PCAifTsiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8ICJ0eXBlZGVmIHN0cnVjdCBfIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50Q2xhc3MgIiA8PCB0aGlzLT5uc3BhY2UKKyAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudENsYXNzOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIENyZWF0ZSBhbGwgdGhlIEdPYmplY3QgYm9pbGVycGxhdGUKKyAgZl9oZWFkZXJfIDw8ICJHVHlwZSAiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBzZXJ2aWNlX25hbWVfbGMgPDwgIl9jbGllbnRfZ2V0X3R5cGUgKHZvaWQpOyIgPDwgZW5kbAorICAgICAgICAgICAgPDwgIiNkZWZpbmUgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIiA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9DTElFTlQgIgorICAgICAgICAgICAgPDwgIigiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBzZXJ2aWNlX25hbWVfbGMgPDwgIl9jbGllbnRfZ2V0X3R5cGUoKSkiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8ICIjZGVmaW5lICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0NMSUVOVChvYmopICIKKyAgICAgICAgICAgIDw8ICIoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iCisgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9DTElFTlQsICIgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudCkpIiA8PCBlbmRsCisgICAgICAgICAgICA8PCAiI2RlZmluZSAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9DTElFTlRfQ0xBU1MoYykgIgorICAgICAgICAgICAgPDwgIihHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iIDw8IHNlcnZpY2VfbmFtZV91YworICAgICAgICAgICAgPDwgIl9DTElFTlQsICIgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudENsYXNzKSkiIDw8IGVuZGwgPDwgIiNkZWZpbmUgIgorICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0lTX0NMSUVOVChvYmopICIKKyAgICAgICAgICAgIDw8ICIoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iCisgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9DTElFTlQpKSIgPDwgZW5kbCA8PCAiI2RlZmluZSAiIDw8IHRoaXMtPm5zcGFjZV91YworICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSVNfQ0xJRU5UX0NMQVNTKGMpICIKKyAgICAgICAgICAgIDw8ICIoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIiA8PCBzZXJ2aWNlX25hbWVfdWMKKyAgICAgICAgICAgIDw8ICJfQ0xJRU5UKSkiIDw8IGVuZGwgPDwgIiNkZWZpbmUgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgc2VydmljZV9uYW1lX3VjCisgICAgICAgICAgICA8PCAiX0NMSUVOVF9HRVRfQ0xBU1Mob2JqKSAiCisgICAgICAgICAgICA8PCAiKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iCisgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9DTElFTlQsICIgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudENsYXNzKSkiCisgICAgICAgICAgICA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLyogd3JpdGUgb3V0IHRoZSBmdW5jdGlvbiBwcm90b3R5cGVzICovCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgLyogbWFrZSB0aGUgZnVuY3Rpb24gbmFtZSBDIGZyaWVuZGx5ICovCisgICAgc3RyaW5nIGZ1bm5hbWUgPSB0b19sb3dlcl9jYXNlKGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcygoKmZfaXRlciktPmdldF9uYW1lKCkpKTsKKworICAgIHRfZnVuY3Rpb24gc2VydmljZV9mdW5jdGlvbigoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VfbmFtZV9sYyArIHN0cmluZygiX2NsaWVudF8iKSArIGZ1bm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCkpOworICAgIGluZGVudChmX2hlYWRlcl8pIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmc2VydmljZV9mdW5jdGlvbikgPDwgIjsiIDw8IGVuZGw7CisKKyAgICB0X2Z1bmN0aW9uIHNlbmRfZnVuY3Rpb24oZ190eXBlX3ZvaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VfbmFtZV9sYyArIHN0cmluZygiX2NsaWVudF9zZW5kXyIpICsgZnVubmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpKTsKKyAgICBpbmRlbnQoZl9oZWFkZXJfKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnNlbmRfZnVuY3Rpb24pIDw8ICI7IiA8PCBlbmRsOworCisgICAgLy8gaW1wbGVtZW50IHJlY3YgaWYgbm90IGEgb25ld2F5IHNlcnZpY2UKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7CisgICAgICB0X2Z1bmN0aW9uIHJlY3ZfZnVuY3Rpb24oKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VfbmFtZV9sYyArIHN0cmluZygiX2NsaWVudF9yZWN2XyIpICsgZnVubmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbm9hcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpKTsKKyAgICAgIGluZGVudChmX2hlYWRlcl8pIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmcmVjdl9mdW5jdGlvbikgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgLyogd3JpdGUgb3V0IHRoZSBnZXQvc2V0IGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KKyAgZl9oZWFkZXJfIDw8ICJ2b2lkICIgKyBzZXJ2aWNlX25hbWVfbGMgKyAiX2NsaWVudF9zZXRfcHJvcGVydHkgKEdPYmplY3QgKm9iamVjdCwgZ3VpbnQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9wZXJ0eV9pZCwgY29uc3QgR1ZhbHVlICp2YWx1ZSwgR1BhcmFtU3BlYyAqcHNwZWMpOyIKKyAgICAgICAgICAgIDw8IGVuZGw7CisgIGZfaGVhZGVyXyA8PCAidm9pZCAiICsgc2VydmljZV9uYW1lX2xjICsgIl9jbGllbnRfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICpvYmplY3QsIGd1aW50ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvcGVydHlfaWQsIEdWYWx1ZSAqdmFsdWUsIEdQYXJhbVNwZWMgKnBzcGVjKTsiCisgICAgICAgICAgICA8PCBlbmRsOworCisgIGZfaGVhZGVyXyA8PCBlbmRsOworICAvLyBlbmQgb2YgaGVhZGVyIGNvZGUKKworICAvLyBHZW5lcmF0ZSBpbnRlcmZhY2UgbWV0aG9kIGltcGxlbWVudGF0aW9ucworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIC8qIG1ha2UgdGhlIGZ1bmN0aW9uIG5hbWUgQyBmcmllbmRseSAqLworICAgIHN0cmluZyBmdW5uYW1lID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgdF90eXBlKiB0dHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKTsKKyAgICB0X3N0cnVjdCogYXJnbGlzdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICB0X3N0cnVjdCogeGxpc3QgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKKyAgICBib29sIGhhc19yZXR1cm4gPSAhdHR5cGUtPmlzX3ZvaWQoKTsKKyAgICBib29sIGhhc19hcmdzID0gYXJnbGlzdC0+Z2V0X21lbWJlcnMoKS5zaXplKCkgPT0gMDsKKyAgICBib29sIGhhc194Y2VwdGlvbnMgPSB4bGlzdC0+Z2V0X21lbWJlcnMoKS5zaXplKCkgPT0gMDsKKworICAgIHN0cmluZyBwYXJhbXMgPSAiKCIgKyB0aGlzLT5uc3BhY2UgKyBzZXJ2aWNlX25hbWVfICsgIklmICppZmFjZSIKKyAgICAgICAgICAgICAgICAgICAgKyAoaGFzX3JldHVybiA/ICIsICIgKyB0eXBlX25hbWUodHR5cGUpICsgIiogX3JldHVybiIgOiAiIikKKyAgICAgICAgICAgICAgICAgICAgKyAoaGFzX2FyZ3MgPyAiIiA6ICgiLCAiICsgYXJndW1lbnRfbGlzdChhcmdsaXN0KSkpCisgICAgICAgICAgICAgICAgICAgICsgKGhhc194Y2VwdGlvbnMgPyAiIiA6ICgiLCAiICsgeGNlcHRpb25fbGlzdCh4bGlzdCkpKSArICIsIEdFcnJvciAqKmVycm9yKSI7CisKKyAgICBzdHJpbmcgcGFyYW1zX3dpdGhvdXRfdHlwZSA9IHN0cmluZygiaWZhY2UsICIpICsgKGhhc19yZXR1cm4gPyAiX3JldHVybiwgIiA6ICIiKTsKKworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ2xpc3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyX2ZpZWxkOworICAgIGZvciAoZl9pdGVyX2ZpZWxkID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlcl9maWVsZCAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyX2ZpZWxkKSB7CisgICAgICBwYXJhbXNfd2l0aG91dF90eXBlICs9ICgqZl9pdGVyX2ZpZWxkKS0+Z2V0X25hbWUoKTsKKyAgICAgIHBhcmFtc193aXRob3V0X3R5cGUgKz0gIiwgIjsKKyAgICB9CisKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4bGlzdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgIHBhcmFtc193aXRob3V0X3R5cGUgKz0gKCp4X2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgcGFyYW1zX3dpdGhvdXRfdHlwZSArPSAiLCAiOworICAgIH0KKworICAgIGZfc2VydmljZV8gPDwgImdib29sZWFuIiA8PCBlbmRsIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBzZXJ2aWNlX25hbWVfbGMgPDwgIl9pZl8iIDw8IGZ1bm5hbWUKKyAgICAgICAgICAgICAgIDw8ICIgIiA8PCBwYXJhbXMgPDwgZW5kbCA8PCAieyIgPDwgZW5kbCA8PCAiICByZXR1cm4gIiA8PCB0aGlzLT5uc3BhY2VfdWMKKyAgICAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0lGX0dFVF9JTlRFUkZBQ0UgKGlmYWNlKS0+IiA8PCBmdW5uYW1lIDw8ICIgKCIKKyAgICAgICAgICAgICAgIDw8IHBhcmFtc193aXRob3V0X3R5cGUgPDwgImVycm9yKTsiIDw8IGVuZGwgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIC8vIEdlbmVyYXRlIGludGVyZmFjZSBib2lsZXJwbGF0ZQorICBmX3NlcnZpY2VfIDw8ICJHVHlwZSIgPDwgZW5kbCA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjIDw8ICJfaWZfZ2V0X3R5cGUgKHZvaWQpIgorICAgICAgICAgICAgIDw8IGVuZGwgPDwgInsiIDw8IGVuZGwgPDwgIiAgc3RhdGljIEdUeXBlIHR5cGUgPSAwOyIgPDwgZW5kbCA8PCAiICBpZiAodHlwZSA9PSAwKSIKKyAgICAgICAgICAgICA8PCBlbmRsIDw8ICIgIHsiIDw8IGVuZGwgPDwgIiAgICBzdGF0aWMgY29uc3QgR1R5cGVJbmZvIHR5cGVfaW5mbyA9IiA8PCBlbmRsIDw8ICIgICAgeyIKKyAgICAgICAgICAgICA8PCBlbmRsIDw8ICIgICAgICBzaXplb2YgKCIgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmSW50ZXJmYWNlKSwiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAiICAgICAgTlVMTCwgIC8qIGJhc2VfaW5pdCAqLyIgPDwgZW5kbCA8PCAiICAgICAgTlVMTCwgIC8qIGJhc2VfZmluYWxpemUgKi8iIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAiICAgICAgTlVMTCwgIC8qIGNsYXNzX2luaXQgKi8iIDw8IGVuZGwgPDwgIiAgICAgIE5VTEwsICAvKiBjbGFzc19maW5hbGl6ZSAqLyIKKyAgICAgICAgICAgICA8PCBlbmRsIDw8ICIgICAgICBOVUxMLCAgLyogY2xhc3NfZGF0YSAqLyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICIgICAgICAwLCAgICAgLyogaW5zdGFuY2Vfc2l6ZSAqLyIgPDwgZW5kbCA8PCAiICAgICAgMCwgICAgIC8qIG5fcHJlYWxsb2NzICovIgorICAgICAgICAgICAgIDw8IGVuZGwgPDwgIiAgICAgIE5VTEwsICAvKiBpbnN0YW5jZV9pbml0ICovIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgIiAgICAgIE5VTEwgICAvKiB2YWx1ZV90YWJsZSAqLyIgPDwgZW5kbCA8PCAiICAgIH07IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgIiAgICB0eXBlID0gZ190eXBlX3JlZ2lzdGVyX3N0YXRpYyAoR19UWVBFX0lOVEVSRkFDRSwiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiIgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmXCIsIgorICAgICAgICAgICAgIDw8IGVuZGwgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnR5cGVfaW5mbywgMCk7IiA8PCBlbmRsIDw8ICIgIH0iCisgICAgICAgICAgICAgPDwgZW5kbCA8PCAiICByZXR1cm4gdHlwZTsiIDw8IGVuZGwgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSBjbGllbnQgYm9pbGVycGxhdGUKKyAgZl9zZXJ2aWNlXyA8PCAic3RhdGljIHZvaWQgIiA8PCBlbmRsIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBzZXJ2aWNlX25hbWVfbGMKKyAgICAgICAgICAgICA8PCAiX2lmX2ludGVyZmFjZV9pbml0ICgiIDw8IHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZkludGVyZmFjZSAqaWZhY2UpOyIKKyAgICAgICAgICAgICA8PCBlbmRsIDw8IGVuZGwgPDwgIkdfREVGSU5FX1RZUEVfV0lUSF9DT0RFICgiIDw8IHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfCisgICAgICAgICAgICAgPDwgIkNsaWVudCwgIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjIDw8ICJfY2xpZW50LCIgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgIiA8PCBwYXJlbnRfdHlwZV9uYW1lIDw8ICIsICIgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgR19JTVBMRU1FTlRfSU5URVJGQUNFICgiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iCisgICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSUYsIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgPDwgdGhpcy0+bnNwYWNlX2xjCisgICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lX2xjIDw8ICJfaWZfaW50ZXJmYWNlX2luaXQpKSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHByb3BlcnR5LXJlbGF0ZWQgY29kZSBvbmx5IGZvciBiYXNlIHNlcnZpY2VzLS0tY2hpbGQKKyAgLy8gc2VydmljZS1jbGllbnQgY2xhc3NlcyBoYXZlIG9ubHkgcHJvcGVydGllcyBpbmhlcml0ZWQgZnJvbSB0aGVpcgorICAvLyBwYXJlbnQgY2xhc3MKKyAgaWYgKCFleHRlbmRzX3NlcnZpY2UpIHsKKyAgICAvLyBHZW5lcmF0ZSBjbGllbnQgcHJvcGVydGllcworICAgIGZfc2VydmljZV8gPDwgImVudW0gXyIgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudFByb3BlcnRpZXMiIDw8IGVuZGwgPDwgInsiCisgICAgICAgICAgICAgICA8PCBlbmRsIDw8ICIgIFBST1BfMCwiIDw8IGVuZGwgPDwgIiAgUFJPUF8iIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBzZXJ2aWNlX25hbWVfdWMKKyAgICAgICAgICAgICAgIDw8ICJfQ0xJRU5UX0lOUFVUX1BST1RPQ09MLCIgPDwgZW5kbCA8PCAiICBQUk9QXyIgPDwgdGhpcy0+bnNwYWNlX3VjCisgICAgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9DTElFTlRfT1VUUFVUX1BST1RPQ09MIiA8PCBlbmRsIDw8ICJ9OyIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgLy8gZ2VuZXJhdGUgcHJvcGVydHkgc2V0dGVyCisgICAgZl9zZXJ2aWNlXyA8PCAidm9pZCIgPDwgZW5kbCA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjIDw8ICJfY2xpZW50X3NldF9wcm9wZXJ0eSAoIgorICAgICAgICAgICAgICAgPDwgIkdPYmplY3QgKm9iamVjdCwgZ3VpbnQgcHJvcGVydHlfaWQsIGNvbnN0IEdWYWx1ZSAqdmFsdWUsICIKKyAgICAgICAgICAgICAgIDw8ICJHUGFyYW1TcGVjICpwc3BlYykiIDw8IGVuZGwgPDwgInsiIDw8IGVuZGwgPDwgIiAgIiA8PCB0aGlzLT5uc3BhY2UKKyAgICAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudCAqY2xpZW50ID0gIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgc2VydmljZV9uYW1lX3VjCisgICAgICAgICAgICAgICA8PCAiX0NMSUVOVCAob2JqZWN0KTsiIDw8IGVuZGwgPDwgZW5kbCA8PCAiICBUSFJJRlRfVU5VU0VEX1ZBUiAocHNwZWMpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgZW5kbCA8PCAiICBzd2l0Y2ggKHByb3BlcnR5X2lkKSIgPDwgZW5kbCA8PCAiICB7IiA8PCBlbmRsIDw8ICIgICAgY2FzZSBQUk9QXyIKKyAgICAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9DTElFTlRfSU5QVVRfUFJPVE9DT0w6IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCAiICAgICAgY2xpZW50LT5pbnB1dF9wcm90b2NvbCA9IGdfdmFsdWVfZ2V0X29iamVjdCAodmFsdWUpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgIiAgICAgIGJyZWFrOyIgPDwgZW5kbCA8PCAiICAgIGNhc2UgUFJPUF8iIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBzZXJ2aWNlX25hbWVfdWMKKyAgICAgICAgICAgICAgIDw8ICJfQ0xJRU5UX09VVFBVVF9QUk9UT0NPTDoiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8ICIgICAgICBjbGllbnQtPm91dHB1dF9wcm90b2NvbCA9IGdfdmFsdWVfZ2V0X29iamVjdCAodmFsdWUpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgIiAgICAgIGJyZWFrOyIgPDwgZW5kbCA8PCAiICB9IiA8PCBlbmRsIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAvLyBnZW5lcmF0ZSBwcm9wZXJ0eSBnZXR0ZXIKKyAgICBmX3NlcnZpY2VfIDw8ICJ2b2lkIiA8PCBlbmRsIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBzZXJ2aWNlX25hbWVfbGMgPDwgIl9jbGllbnRfZ2V0X3Byb3BlcnR5ICgiCisgICAgICAgICAgICAgICA8PCAiR09iamVjdCAqb2JqZWN0LCBndWludCBwcm9wZXJ0eV9pZCwgR1ZhbHVlICp2YWx1ZSwgIgorICAgICAgICAgICAgICAgPDwgIkdQYXJhbVNwZWMgKnBzcGVjKSIgPDwgZW5kbCA8PCAieyIgPDwgZW5kbCA8PCAiICAiIDw8IHRoaXMtPm5zcGFjZQorICAgICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50ICpjbGllbnQgPSAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBzZXJ2aWNlX25hbWVfdWMKKyAgICAgICAgICAgICAgIDw8ICJfQ0xJRU5UIChvYmplY3QpOyIgPDwgZW5kbCA8PCBlbmRsIDw8ICIgIFRIUklGVF9VTlVTRURfVkFSIChwc3BlYyk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBlbmRsIDw8ICIgIHN3aXRjaCAocHJvcGVydHlfaWQpIiA8PCBlbmRsIDw8ICIgIHsiIDw8IGVuZGwgPDwgIiAgICBjYXNlIFBST1BfIgorICAgICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0NMSUVOVF9JTlBVVF9QUk9UT0NPTDoiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8ICIgICAgICBnX3ZhbHVlX3NldF9vYmplY3QgKHZhbHVlLCBjbGllbnQtPmlucHV0X3Byb3RvY29sKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8ICIgICAgICBicmVhazsiIDw8IGVuZGwgPDwgIiAgICBjYXNlIFBST1BfIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgc2VydmljZV9uYW1lX3VjCisgICAgICAgICAgICAgICA8PCAiX0NMSUVOVF9PVVRQVVRfUFJPVE9DT0w6IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCAiICAgICAgZ192YWx1ZV9zZXRfb2JqZWN0ICh2YWx1ZSwgY2xpZW50LT5vdXRwdXRfcHJvdG9jb2wpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgIiAgICAgIGJyZWFrOyIgPDwgZW5kbCA8PCAiICB9IiA8PCBlbmRsIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKworICAvLyBHZW5lcmF0ZSBjbGllbnQgbWV0aG9kIGltcGxlbWVudGF0aW9ucworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHN0cmluZyBuYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIHN0cmluZyBmdW5uYW1lID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKG5hbWUpOworCisgICAgLy8gR2V0IHRoZSBzdHJ1Y3Qgb2YgZnVuY3Rpb24gY2FsbCBwYXJhbXMgYW5kIGV4Y2VwdGlvbnMKKyAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKworICAgIC8vIEZ1bmN0aW9uIGZvciBzZW5kaW5nCisgICAgdF9mdW5jdGlvbiBzZW5kX2Z1bmN0aW9uKGdfdHlwZV92b2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlX25hbWVfbGMgKyBzdHJpbmcoIl9jbGllbnRfc2VuZF8iKSArIGZ1bm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKSk7CisKKyAgICAvLyBPcGVuIHRoZSBzZW5kIGZ1bmN0aW9uCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmc2VuZF9mdW5jdGlvbikgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICAgIHN0cmluZyByZXFUeXBlID0gKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSA/ICJUX09ORVdBWSIgOiAiVF9DQUxMIjsKKworICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVxdWVzdAorICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdpbnQzMiBjc2VxaWQgPSAwOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgIlRocmlmdFByb3RvY29sICogcHJvdG9jb2wgPSAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBiYXNlX3NlcnZpY2VfbmFtZV91YworICAgICAgICAgICAgICAgPDwgIl9DTElFTlQgKGlmYWNlKS0+b3V0cHV0X3Byb3RvY29sOyIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAiaWYgKHRocmlmdF9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgXCIiIDw8IG5hbWUgPDwgIlwiLCAiCisgICAgICAgICAgICAgICA8PCByZXFUeXBlIDw8ICIsIGNzZXFpZCwgZXJyb3IpIDwgMCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIEZBTFNFOyIKKyAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIGdlbmVyYXRlX3N0cnVjdF93cml0ZXIoZl9zZXJ2aWNlXywgYXJnX3N0cnVjdCwgIiIsICIiLCBmYWxzZSk7CisKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAodGhyaWZ0X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfZW5kIChwcm90b2NvbCwgZXJyb3IpIDwgMCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBGQUxTRTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICJpZiAoIXRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHByb3RvY29sLT50cmFuc3BvcnQsIGVycm9yKSkiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICIgIHJldHVybiBGQUxTRTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICJpZiAoIXRocmlmdF90cmFuc3BvcnRfd3JpdGVfZW5kIChwcm90b2NvbC0+dHJhbnNwb3J0LCBlcnJvcikpIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gRkFMU0U7IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJldHVybiBUUlVFOyIKKyAgICAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAgIC8vIEdlbmVyYXRlIHJlY3YgZnVuY3Rpb24gb25seSBpZiBub3QgYW4gYXN5bmMgZnVuY3Rpb24KKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7CisgICAgICB0X2Z1bmN0aW9uIHJlY3ZfZnVuY3Rpb24oKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VfbmFtZV9sYyArIHN0cmluZygiX2NsaWVudF9yZWN2XyIpICsgZnVubmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbm9hcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpKTsKKyAgICAgIC8vIE9wZW4gZnVuY3Rpb24KKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnJlY3ZfZnVuY3Rpb24pIDw8IGVuZGw7CisgICAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ2ludDMyIHJzZXFpZDsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImdjaGFyICogZm5hbWUgPSBOVUxMOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiVGhyaWZ0TWVzc2FnZVR5cGUgbXR5cGU7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJUaHJpZnRQcm90b2NvbCAqIHByb3RvY29sID0gIgorICAgICAgICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgYmFzZV9zZXJ2aWNlX25hbWVfdWMKKyAgICAgICAgICAgICAgICAgPDwgIl9DTElFTlQgKGlmYWNlKS0+aW5wdXRfcHJvdG9jb2w7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJUaHJpZnRBcHBsaWNhdGlvbkV4Y2VwdGlvbiAqeGNlcHRpb247IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmICh0aHJpZnRfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luICIKKyAgICAgICAgICAgICAgICAgICAgIihwcm90b2NvbCwgJmZuYW1lLCAmbXR5cGUsICZyc2VxaWQsIGVycm9yKSA8IDApIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChmbmFtZSkgZ19mcmVlIChmbmFtZSk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gRkFMU0U7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKG10eXBlID09IFRfRVhDRVBUSU9OKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAoZm5hbWUpIGdfZnJlZSAoZm5hbWUpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieGNlcHRpb24gPSBnX29iamVjdF9uZXcgIgorICAgICAgICAgICAgICAgICAgICAiKFRIUklGVF9UWVBFX0FQUExJQ0FUSU9OX0VYQ0VQVElPTiwgTlVMTCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ0aHJpZnRfc3RydWN0X3JlYWQgKFRIUklGVF9TVFJVQ1QgKHhjZXB0aW9uKSwgIgorICAgICAgICAgICAgICAgICAgICAicHJvdG9jb2wsIE5VTEwpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAidGhyaWZ0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9lbmQgIgorICAgICAgICAgICAgICAgICAgICAiKHByb3RvY29sLCBOVUxMKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInRocmlmdF90cmFuc3BvcnRfcmVhZF9lbmQgIgorICAgICAgICAgICAgICAgICAgICAiKHByb3RvY29sLT50cmFuc3BvcnQsIE5VTEwpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZ19zZXRfZXJyb3IgKGVycm9yLCAiCisgICAgICAgICAgICAgICAgICAgICJUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SLHhjZXB0aW9uLT50eXBlLCAiCisgICAgICAgICAgICAgICAgICAgICJcImFwcGxpY2F0aW9uIGVycm9yOiAlc1wiLCB4Y2VwdGlvbi0+bWVzc2FnZSk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJnX29iamVjdF91bnJlZiAoeGNlcHRpb24pOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIEZBTFNFOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgaWYgKG10eXBlICE9IFRfUkVQTFkpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChmbmFtZSkgZ19mcmVlIChmbmFtZSk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ0aHJpZnRfcHJvdG9jb2xfc2tpcCAocHJvdG9jb2wsIFRfU1RSVUNULCAiCisgICAgICAgICAgICAgICAgICAgICJOVUxMKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInRocmlmdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfZW5kIChwcm90b2NvbCwgIgorICAgICAgICAgICAgICAgICAgICAiTlVMTCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ0aHJpZnRfdHJhbnNwb3J0X3JlYWRfZW5kICgiCisgICAgICAgICAgICAgICAgICAgICJwcm90b2NvbC0+dHJhbnNwb3J0LCBOVUxMKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImdfc2V0X2Vycm9yIChlcnJvciwgIgorICAgICAgICAgICAgICAgICAgICAiVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUiwgIgorICAgICAgICAgICAgICAgICAgICAiVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUl9JTlZBTElEX01FU1NBR0VfVFlQRSwgIgorICAgICAgICAgICAgICAgICAgICAiXCJpbnZhbGlkIG1lc3NhZ2UgdHlwZSAlZCwgZXhwZWN0ZWQgVF9SRVBMWVwiLCBtdHlwZSk7IgorICAgICAgICAgICAgICAgICA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gRkFMU0U7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0gZWxzZSBpZiAoc3RybmNtcCAoZm5hbWUsIFwiIiA8PCBuYW1lCisgICAgICAgICAgICAgICAgIDw8ICJcIiwgIiA8PCBuYW1lLmxlbmd0aCgpIDw8ICIpICE9IDApIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRocmlmdF9wcm90b2NvbF9za2lwIChwcm90b2NvbCwgVF9TVFJVQ1QsICIKKyAgICAgICAgICAgICAgICAgICAgIk5VTEwpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAidGhyaWZ0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9lbmQgKHByb3RvY29sLCIKKyAgICAgICAgICAgICAgICAgICAgImVycm9yKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInRocmlmdF90cmFuc3BvcnRfcmVhZF9lbmQgKCIKKyAgICAgICAgICAgICAgICAgICAgInByb3RvY29sLT50cmFuc3BvcnQsIGVycm9yKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImdfc2V0X2Vycm9yIChlcnJvciwgIgorICAgICAgICAgICAgICAgICAgICAiVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUiwgIgorICAgICAgICAgICAgICAgICAgICAiVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUl9XUk9OR19NRVRIT0RfTkFNRSwgIgorICAgICAgICAgICAgICAgICAgICAiXCJ3cm9uZyBtZXRob2QgbmFtZSAlcywgZXhwZWN0ZWQgIiA8PCBuYW1lCisgICAgICAgICAgICAgICAgICAgIDw8ICJcIiwgZm5hbWUpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKGZuYW1lKSBnX2ZyZWUgKGZuYW1lKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInJldHVybiBGQUxTRTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKGZuYW1lKSBnX2ZyZWUgKGZuYW1lKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKworICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7CisgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworCisgICAgICB7CisgICAgICAgIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiXyIgKyAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOworICAgICAgICB0X2ZpZWxkIHN1Y2Nlc3MoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLCAiKl9yZXR1cm4iLCAwKTsKKyAgICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOworICAgICAgICB9CisKKyAgICAgICAgLy8gYWRkIHJlYWRlcnMgZm9yIGV4Y2VwdGlvbnMsIGRlcmVmZXJlbmNpbmcgdGhlIHBvaW50ZXIuCisgICAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7IHhfaXRlcisrKSB7CisgICAgICAgICAgdF9maWVsZCogeGNlcHRpb24gPSBuZXcgdF9maWVsZCgoKnhfaXRlciktPmdldF90eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKiIgKyAoKnhfaXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKnhfaXRlciktPmdldF9rZXkoKSk7CisgICAgICAgICAgcmVzdWx0LmFwcGVuZCh4Y2VwdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBnZW5lcmF0ZV9zdHJ1Y3RfcmVhZGVyKGZfc2VydmljZV8sICZyZXN1bHQsICIiLCAiIiwgZmFsc2UpOworICAgICAgfQorCisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAodGhyaWZ0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9lbmQgKHByb3RvY29sLCBlcnJvcikgPCAwKSIKKyAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gRkFMU0U7IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgPDwgImlmICghdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2VuZCAocHJvdG9jb2wtPnRyYW5zcG9ydCwgZXJyb3IpKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gRkFMU0U7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAgIC8vIGNvcHkgb3ZlciBhbnkgdGhyb3cgZXhjZXB0aW9ucyBhbmQgcmV0dXJuIGZhaWx1cmUKKyAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7IHhfaXRlcisrKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmICgqIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiAhPSBOVUxMKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgICAgZ19zZXRfZXJyb3IgKGVycm9yLCAiCisgICAgICAgICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX3VjCisgICAgICAgICAgICAgICAgICAgPDwgdG9fdXBwZXJfY2FzZShpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpKSkKKyAgICAgICAgICAgICAgICAgICA8PCAiX0VSUk9SLCAiIDw8IHRoaXMtPm5zcGFjZV91YworICAgICAgICAgICAgICAgICAgIDw8IHRvX3VwcGVyX2Nhc2UoaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X25hbWUoKSkpCisgICAgICAgICAgICAgICAgICAgPDwgIl9FUlJPUl9DT0RFLCBcIiIgPDwgKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpIDw8ICJcIik7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgICByZXR1cm4gRkFMU0U7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgfQorICAgICAgLy8gQ2xvc2UgZnVuY3Rpb24KKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIFRSVUU7IiA8PCBlbmRsOworICAgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgICB9CisKKyAgICAvLyBPcGVuIGZ1bmN0aW9uCisgICAgdF9mdW5jdGlvbiBzZXJ2aWNlX2Z1bmN0aW9uKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZV9uYW1lX2xjICsgc3RyaW5nKCJfY2xpZW50XyIpICsgZnVubmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKSk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmc2VydmljZV9mdW5jdGlvbikgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICAgIC8vIHdyYXAgZWFjaCBmdW5jdGlvbgorICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmICghIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjIDw8ICJfY2xpZW50X3NlbmRfIgorICAgICAgICAgICAgICAgPDwgZnVubmFtZSA8PCAiIChpZmFjZSI7CisKKyAgICAvLyBEZWNsYXJlIHRoZSBmdW5jdGlvbiBhcmd1bWVudHMKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOworICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICIsICIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCk7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgIiwgZXJyb3IpKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gRkFMU0U7IiA8PCBlbmRsOworCisgICAgLy8gaWYgbm90IG9uZXdheSwgaW1wbGVtZW50IHJlY3YKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIHN0cmluZyByZXQgPSAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSA/ICIiIDogIl9yZXR1cm4sICI7CisKKyAgICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpLT5nZXRfbWVtYmVycygpOworICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgICAgcmV0ICs9ICgqeF9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgICAgcmV0ICs9ICIsICI7CisgICAgICB9CisKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmICghIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjIDw8ICJfY2xpZW50X3JlY3ZfIgorICAgICAgICAgICAgICAgICA8PCBmdW5uYW1lIDw8ICIgKGlmYWNlLCAiIDw8IHJldCA8PCAiZXJyb3IpKSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAiICByZXR1cm4gRkFMU0U7IiA8PCBlbmRsOworICAgIH0KKworICAgIC8vIHJldHVybiBUUlVFIHdoaWNoIG1lYW5zIGFsbCBmdW5jdGlvbnMgd2VyZSBjYWxsZWQgT0sKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybiBUUlVFOyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgfQorCisgIC8vIGNyZWF0ZSB0aGUgaW50ZXJmYWNlIGluaXRpYWxpemVyCisgIGZfc2VydmljZV8gPDwgInN0YXRpYyB2b2lkIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IHNlcnZpY2VfbmFtZV9sYyA8PCAiX2lmX2ludGVyZmFjZV9pbml0ICgiCisgICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmSW50ZXJmYWNlICppZmFjZSkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBpZiAoZnVuY3Rpb25zLnNpemUoKSA+IDApIHsKKyAgICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgLyogbWFrZSB0aGUgZnVuY3Rpb24gbmFtZSBDIGZyaWVuZGx5ICovCisgICAgICBzdHJpbmcgZnVubmFtZSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcygoKmZfaXRlciktPmdldF9uYW1lKCkpOworCisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZmFjZS0+IiA8PCBmdW5uYW1lIDw8ICIgPSAiIDw8IHRoaXMtPm5zcGFjZV9sYworICAgICAgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfbGMgPDwgIl9jbGllbnRfIiA8PCBmdW5uYW1lIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKyAgfQorICBlbHNlIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJUSFJJRlRfVU5VU0VEX1ZBUiAoaWZhY2UpOyIgPDwgZW5kbDsKKyAgfQorICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgLy8gY3JlYXRlIHRoZSBjbGllbnQgaW5zdGFuY2UgaW5pdGlhbGl6ZXIKKyAgZl9zZXJ2aWNlXyA8PCAic3RhdGljIHZvaWQiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjIDw8ICJfY2xpZW50X2luaXQgKCIKKyAgICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50ICpjbGllbnQpIiA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgaWYgKCFleHRlbmRzX3NlcnZpY2UpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJjbGllbnQtPmlucHV0X3Byb3RvY29sID0gTlVMTDsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJjbGllbnQtPm91dHB1dF9wcm90b2NvbCA9IE5VTEw7IiA8PCBlbmRsOworICB9CisgIGVsc2UgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIlRIUklGVF9VTlVTRURfVkFSIChjbGllbnQpOyIgPDwgZW5kbDsKKyAgfQorICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgLy8gY3JlYXRlIHRoZSBjbGllbnQgY2xhc3MgaW5pdGlhbGl6ZXIKKyAgZl9zZXJ2aWNlXyA8PCAic3RhdGljIHZvaWQiIDw8IGVuZGwgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IHNlcnZpY2VfbmFtZV9sYworICAgICAgICAgICAgIDw8ICJfY2xpZW50X2NsYXNzX2luaXQgKCIgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudENsYXNzICpjbHMpIgorICAgICAgICAgICAgIDw8IGVuZGwgPDwgInsiIDw8IGVuZGw7CisgIGlmICghZXh0ZW5kc19zZXJ2aWNlKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAiICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoY2xzKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8ICIgIEdQYXJhbVNwZWMgKnBhcmFtX3NwZWM7IiA8PCBlbmRsIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8ICIgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9ICIgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IHNlcnZpY2VfbmFtZV9sYworICAgICAgICAgICAgICAgPDwgIl9jbGllbnRfc2V0X3Byb3BlcnR5OyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgIiAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjCisgICAgICAgICAgICAgICA8PCAiX2NsaWVudF9nZXRfcHJvcGVydHk7IiA8PCBlbmRsIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8ICIgIHBhcmFtX3NwZWMgPSBnX3BhcmFtX3NwZWNfb2JqZWN0IChcImlucHV0X3Byb3RvY29sXCIsIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJpbnB1dCBwcm90b2NvbCAoY29uc3RydWN0KVwiLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiU2V0IHRoZSBjbGllbnQgaW5wdXQgcHJvdG9jb2xcIiwiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSFJJRlRfVFlQRV9QUk9UT0NPTCwiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCAiICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPUF8iIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBzZXJ2aWNlX25hbWVfdWMKKyAgICAgICAgICAgICAgIDw8ICJfQ0xJRU5UX0lOUFVUX1BST1RPQ09MLCBwYXJhbV9zcGVjKTsiIDw8IGVuZGwgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgIiAgcGFyYW1fc3BlYyA9IGdfcGFyYW1fc3BlY19vYmplY3QgKFwib3V0cHV0X3Byb3RvY29sXCIsIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJvdXRwdXQgcHJvdG9jb2wgKGNvbnN0cnVjdClcIiwiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlNldCB0aGUgY2xpZW50IG91dHB1dCBwcm90b2NvbFwiLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIUklGVF9UWVBFX1BST1RPQ09MLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8ICIgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9QXyIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHNlcnZpY2VfbmFtZV91YworICAgICAgICAgICAgICAgPDwgIl9DTElFTlRfT1VUUFVUX1BST1RPQ09MLCBwYXJhbV9zcGVjKTsiIDw8IGVuZGw7CisgIH0KKyAgZWxzZSB7CisgICAgZl9zZXJ2aWNlXyA8PCAiICBUSFJJRlRfVU5VU0VEX1ZBUiAoY2xzKTsiIDw8IGVuZGw7CisgIH0KKyAgZl9zZXJ2aWNlXyA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBDIGNvZGUgdGhhdCByZXByZXNlbnRzIGEgVGhyaWZ0IHNlcnZpY2UgaGFuZGxlci4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZm9yIHdoaWNoIHRvIGdlbmVyYXRlIGEgaGFuZGxlci4KKyAqLwordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGFuZGxlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZnVuY3Rpb25faXRlcjsKKworICBzdHJpbmcgc2VydmljZV9uYW1lX2xjID0gdG9fbG93ZXJfY2FzZShpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoc2VydmljZV9uYW1lXykpOworICBzdHJpbmcgc2VydmljZV9uYW1lX3VjID0gdG9fdXBwZXJfY2FzZShzZXJ2aWNlX25hbWVfbGMpOworCisgIHN0cmluZyBzZXJ2aWNlX2hhbmRsZXJfbmFtZSA9IHNlcnZpY2VfbmFtZV8gKyAiSGFuZGxlciI7CisKKyAgc3RyaW5nIGNsYXNzX25hbWUgPSB0aGlzLT5uc3BhY2UgKyBzZXJ2aWNlX2hhbmRsZXJfbmFtZTsKKyAgc3RyaW5nIGNsYXNzX25hbWVfbGMgPSB0aGlzLT5uc3BhY2VfbGMgKyBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoc2VydmljZV9oYW5kbGVyX25hbWUpOworICBzdHJpbmcgY2xhc3NfbmFtZV91YyA9IHRvX3VwcGVyX2Nhc2UoY2xhc3NfbmFtZV9sYyk7CisKKyAgc3RyaW5nIHBhcmVudF9jbGFzc19uYW1lOworICBzdHJpbmcgcGFyZW50X3R5cGVfbmFtZTsKKworICBzdHJpbmcgYXJnc19pbmRlbnQ7CisKKyAgLy8gVGhlIHNlcnZpY2UgdGhpcyBzZXJ2aWNlIGV4dGVuZHMsIG9yIE5VTEwgaWYgaXQgZXh0ZW5kcyBubyBzZXJ2aWNlCisgIHRfc2VydmljZSogZXh0ZW5kc19zZXJ2aWNlID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7CisKKyAgLy8gRGV0ZXJtaW5lIHRoZSBuYW1lIG9mIG91ciBwYXJlbnQgc2VydmljZSAoaWYgYW55KSBhbmQgdGhlIGhhbmRsZXIgY2xhc3MnCisgIC8vIHBhcmVudCBjbGFzcyBuYW1lIGFuZCB0eXBlCisgIGlmIChleHRlbmRzX3NlcnZpY2UpIHsKKyAgICBzdHJpbmcgcGFyZW50X3NlcnZpY2VfbmFtZSA9IGV4dGVuZHNfc2VydmljZS0+Z2V0X25hbWUoKTsKKyAgICBzdHJpbmcgcGFyZW50X3NlcnZpY2VfbmFtZV9sYyA9IHRvX2xvd2VyX2Nhc2UoaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKHBhcmVudF9zZXJ2aWNlX25hbWUpKTsKKyAgICBzdHJpbmcgcGFyZW50X3NlcnZpY2VfbmFtZV91YyA9IHRvX3VwcGVyX2Nhc2UocGFyZW50X3NlcnZpY2VfbmFtZV9sYyk7CisKKyAgICBwYXJlbnRfY2xhc3NfbmFtZSA9IHRoaXMtPm5zcGFjZSArIHBhcmVudF9zZXJ2aWNlX25hbWUgKyAiSGFuZGxlciI7CisgICAgcGFyZW50X3R5cGVfbmFtZSA9IHRoaXMtPm5zcGFjZV91YyArICJUWVBFXyIgKyBwYXJlbnRfc2VydmljZV9uYW1lX3VjICsgIl9IQU5ETEVSIjsKKyAgfSBlbHNlIHsKKyAgICBwYXJlbnRfY2xhc3NfbmFtZSA9ICJHT2JqZWN0IjsKKyAgICBwYXJlbnRfdHlwZV9uYW1lID0gIkdfVFlQRV9PQkpFQ1QiOworICB9CisKKyAgLy8gR2VuZXJhdGUgdGhlIGhhbmRsZXIgY2xhc3MnIGRlZmluaXRpb24gaW4gdGhlIGhlYWRlciBmaWxlCisKKyAgLy8gR2VuZXJhdGUgdGhlIGhhbmRsZXIgaW5zdGFuY2UgZGVmaW5pdGlvbgorICBmX2hlYWRlcl8gPDwgIi8qICIgPDwgc2VydmljZV9uYW1lXyA8PCAiIGhhbmRsZXIgKGFic3RyYWN0IGJhc2UgY2xhc3MpICovIiA8PCBlbmRsIDw8ICJzdHJ1Y3QgXyIKKyAgICAgICAgICAgIDw8IGNsYXNzX25hbWUgPDwgZW5kbCA8PCAieyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCBwYXJlbnRfY2xhc3NfbmFtZSA8PCAiIHBhcmVudDsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfaGVhZGVyXyA8PCAifTsiIDw8IGVuZGwgPDwgInR5cGVkZWYgc3RydWN0IF8iIDw8IGNsYXNzX25hbWUgPDwgIiAiIDw8IGNsYXNzX25hbWUgPDwgIjsiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIGhhbmRsZXIgY2xhc3MgZGVmaW5pdGlvbiwgaW5jbHVkaW5nIGl0cyBjbGFzcyBtZW1iZXJzCisgIC8vIChtZXRob2RzKQorICBmX2hlYWRlcl8gPDwgInN0cnVjdCBfIiA8PCBjbGFzc19uYW1lIDw8ICJDbGFzcyIgPDwgZW5kbCA8PCAieyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCBwYXJlbnRfY2xhc3NfbmFtZSA8PCAiQ2xhc3MgcGFyZW50OyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGZvciAoZnVuY3Rpb25faXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmdW5jdGlvbl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmdW5jdGlvbl9pdGVyKSB7CisgICAgc3RyaW5nIG1ldGhvZF9uYW1lID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKCgqZnVuY3Rpb25faXRlciktPmdldF9uYW1lKCkpOworICAgIHRfdHlwZSogcmV0dXJuX3R5cGUgPSAoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpOworICAgIHRfc3RydWN0KiBhcmdfbGlzdCA9ICgqZnVuY3Rpb25faXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgdF9zdHJ1Y3QqIHhfbGlzdCA9ICgqZnVuY3Rpb25faXRlciktPmdldF94Y2VwdGlvbnMoKTsKKyAgICBib29sIGhhc19yZXR1cm4gPSAhcmV0dXJuX3R5cGUtPmlzX3ZvaWQoKTsKKyAgICBib29sIGhhc19hcmdzID0gYXJnX2xpc3QtPmdldF9tZW1iZXJzKCkuc2l6ZSgpID09IDA7CisgICAgYm9vbCBoYXNfeGNlcHRpb25zID0geF9saXN0LT5nZXRfbWVtYmVycygpLnNpemUoKSA9PSAwOworCisgICAgc3RyaW5nIHBhcmFtcyA9ICIoIiArIHRoaXMtPm5zcGFjZSArIHNlcnZpY2VfbmFtZV8gKyAiSWYgKmlmYWNlIgorICAgICAgICAgICAgICAgICAgICArIChoYXNfcmV0dXJuID8gIiwgIiArIHR5cGVfbmFtZShyZXR1cm5fdHlwZSkgKyAiKiBfcmV0dXJuIiA6ICIiKQorICAgICAgICAgICAgICAgICAgICArIChoYXNfYXJncyA/ICIiIDogKCIsICIgKyBhcmd1bWVudF9saXN0KGFyZ19saXN0KSkpCisgICAgICAgICAgICAgICAgICAgICsgKGhhc194Y2VwdGlvbnMgPyAiIiA6ICgiLCAiICsgeGNlcHRpb25fbGlzdCh4X2xpc3QpKSkgKyAiLCBHRXJyb3IgKiplcnJvcikiOworCisgICAgaW5kZW50KGZfaGVhZGVyXykgPDwgImdib29sZWFuICgqIiA8PCBtZXRob2RfbmFtZSA8PCAiKSAiIDw8IHBhcmFtcyA8PCAiOyIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bigpOworCisgIGZfaGVhZGVyXyA8PCAifTsiIDw8IGVuZGwgPDwgInR5cGVkZWYgc3RydWN0IF8iIDw8IGNsYXNzX25hbWUgPDwgIkNsYXNzICIgPDwgY2xhc3NfbmFtZQorICAgICAgICAgICAgPDwgIkNsYXNzOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSByZW1haW5pbmcgaGVhZGVyIGJvaWxlcnBsYXRlCisgIGZfaGVhZGVyXyA8PCAiR1R5cGUgIiA8PCBjbGFzc19uYW1lX2xjIDw8ICJfZ2V0X3R5cGUgKHZvaWQpOyIgPDwgZW5kbCA8PCAiI2RlZmluZSAiCisgICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIiA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9IQU5ETEVSICIKKyAgICAgICAgICAgIDw8ICIoIiA8PCBjbGFzc19uYW1lX2xjIDw8ICJfZ2V0X3R5cGUoKSkiIDw8IGVuZGwgPDwgIiNkZWZpbmUgIiA8PCBjbGFzc19uYW1lX3VjCisgICAgICAgICAgICA8PCAiKG9iaikgIgorICAgICAgICAgICAgPDwgIihHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIKKyAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0hBTkRMRVIsICIgPDwgY2xhc3NfbmFtZSA8PCAiKSkiIDw8IGVuZGwgPDwgIiNkZWZpbmUgIgorICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJJU18iIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0hBTkRMRVIob2JqKSAiCisgICAgICAgICAgICA8PCAiKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIgorICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSEFORExFUikpIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIgPDwgY2xhc3NfbmFtZV91YworICAgICAgICAgICAgPDwgIl9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIgorICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSEFORExFUiwgIiA8PCBjbGFzc19uYW1lIDw8ICJDbGFzcykpIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIKKyAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiSVNfIiA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9IQU5ETEVSX0NMQVNTKGMpICIKKyAgICAgICAgICAgIDw8ICIoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIiA8PCBzZXJ2aWNlX25hbWVfdWMKKyAgICAgICAgICAgIDw8ICJfSEFORExFUikpIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHNlcnZpY2VfbmFtZV91YworICAgICAgICAgICAgPDwgIl9IQU5ETEVSX0dFVF9DTEFTUyhvYmopICIKKyAgICAgICAgICAgIDw8ICIoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIKKyAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0hBTkRMRVIsICIgPDwgY2xhc3NfbmFtZSA8PCAiQ2xhc3MpKSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSBoYW5kbGVyIGNsYXNzJyBtZXRob2QgZGVmaW5pdGlvbnMKKyAgZm9yIChmdW5jdGlvbl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZ1bmN0aW9uX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2Z1bmN0aW9uX2l0ZXIpIHsKKyAgICBzdHJpbmcgbWV0aG9kX25hbWUgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgdF90eXBlKiByZXR1cm5fdHlwZSA9ICgqZnVuY3Rpb25faXRlciktPmdldF9yZXR1cm50eXBlKCk7CisgICAgdF9zdHJ1Y3QqIGFyZ19saXN0ID0gKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICB0X3N0cnVjdCogeF9saXN0ID0gKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOworICAgIGJvb2wgaGFzX3JldHVybiA9ICFyZXR1cm5fdHlwZS0+aXNfdm9pZCgpOworICAgIGJvb2wgaGFzX2FyZ3MgPSBhcmdfbGlzdC0+Z2V0X21lbWJlcnMoKS5zaXplKCkgPT0gMDsKKyAgICBib29sIGhhc194Y2VwdGlvbnMgPSB4X2xpc3QtPmdldF9tZW1iZXJzKCkuc2l6ZSgpID09IDA7CisKKyAgICBzdHJpbmcgcGFyYW1zID0gIigiICsgdGhpcy0+bnNwYWNlICsgc2VydmljZV9uYW1lXyArICJJZiAqaWZhY2UiCisgICAgICAgICAgICAgICAgICAgICsgKGhhc19yZXR1cm4gPyAiLCAiICsgdHlwZV9uYW1lKHJldHVybl90eXBlKSArICIqIF9yZXR1cm4iIDogIiIpCisgICAgICAgICAgICAgICAgICAgICsgKGhhc19hcmdzID8gIiIgOiAoIiwgIiArIGFyZ3VtZW50X2xpc3QoYXJnX2xpc3QpKSkKKyAgICAgICAgICAgICAgICAgICAgKyAoaGFzX3hjZXB0aW9ucyA/ICIiIDogKCIsICIgKyB4Y2VwdGlvbl9saXN0KHhfbGlzdCkpKSArICIsIEdFcnJvciAqKmVycm9yKSI7CisKKyAgICBmX2hlYWRlcl8gPDwgImdib29sZWFuICIgPDwgY2xhc3NfbmFtZV9sYyA8PCAiXyIgPDwgbWV0aG9kX25hbWUgPDwgIiAiIDw8IHBhcmFtcyA8PCAiOyIgPDwgZW5kbDsKKyAgfQorICBmX2hlYWRlcl8gPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgaGFuZGxlcidzIGltcGxlbWVudGF0aW9uIGluIHRoZSBpbXBsZW1lbnRhdGlvbiBmaWxlCisKKyAgLy8gR2VuZXJhdGUgdGhlIGltcGxlbWVudGF0aW9uIGJvaWxlcnBsYXRlCisgIGZfc2VydmljZV8gPDwgInN0YXRpYyB2b2lkIiA8PCBlbmRsIDw8IGNsYXNzX25hbWVfbGMgPDwgIl8iIDw8IHNlcnZpY2VfbmFtZV9sYworICAgICAgICAgICAgIDw8ICJfaWZfaW50ZXJmYWNlX2luaXQgKCIgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmSW50ZXJmYWNlICppZmFjZSk7IgorICAgICAgICAgICAgIDw8IGVuZGwgPDwgZW5kbDsKKworICBhcmdzX2luZGVudCA9IHN0cmluZygyNSwgJyAnKTsKKyAgZl9zZXJ2aWNlXyA8PCAiR19ERUZJTkVfVFlQRV9XSVRIX0NPREUgKCIgPDwgY2xhc3NfbmFtZSA8PCAiLCAiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKKyAgICAgICAgICAgICA8PCBjbGFzc19uYW1lX2xjIDw8ICIsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8IHBhcmVudF90eXBlX25hbWUgPDwgIiwiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBhcmdzX2luZGVudCA8PCAiR19JTVBMRU1FTlRfSU5URVJGQUNFICgiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iCisgICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSUYsIiA8PCBlbmRsOworICBhcmdzX2luZGVudCArPSBzdHJpbmcoMjMsICcgJyk7CisgIGZfc2VydmljZV8gPDwgYXJnc19pbmRlbnQgPDwgY2xhc3NfbmFtZV9sYyA8PCAiXyIgPDwgc2VydmljZV9uYW1lX2xjIDw8ICJfaWZfaW50ZXJmYWNlX2luaXQpKSIKKyAgICAgICAgICAgICA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIGhhbmRsZXIgbWV0aG9kIGltcGxlbWVudGF0aW9ucworICBmb3IgKGZ1bmN0aW9uX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZnVuY3Rpb25faXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZnVuY3Rpb25faXRlcikgeworICAgIHN0cmluZyBmdW5jdGlvbl9uYW1lID0gKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICBzdHJpbmcgbWV0aG9kX25hbWUgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoZnVuY3Rpb25fbmFtZSk7CisgICAgdF90eXBlKiByZXR1cm5fdHlwZSA9ICgqZnVuY3Rpb25faXRlciktPmdldF9yZXR1cm50eXBlKCk7CisgICAgdF9zdHJ1Y3QqIGFyZ19saXN0ID0gKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICB0X3N0cnVjdCogeF9saXN0ID0gKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOworCisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgYXJncyA9IGFyZ19saXN0LT5nZXRfbWVtYmVycygpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhfbGlzdC0+Z2V0X21lbWJlcnMoKTsKKworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZpZWxkX2l0ZXI7CisKKyAgICB0X2Z1bmN0aW9uIGltcGxlbWVudGluZ19mdW5jdGlvbihyZXR1cm5fdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlX25hbWVfbGMgKyAiX2hhbmRsZXJfIiArIG1ldGhvZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ19saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZ1bmN0aW9uX2l0ZXIpLT5pc19vbmV3YXkoKSk7CisKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZpbXBsZW1lbnRpbmdfZnVuY3Rpb24pIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKCIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJJU18iCisgICAgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9IQU5ETEVSIChpZmFjZSksIEZBTFNFKTsiIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgInJldHVybiAiIDw8IGNsYXNzX25hbWVfdWMgPDwgIl9HRVRfQ0xBU1MgKGlmYWNlKSIKKyAgICAgICAgICAgICAgIDw8ICItPiIgPDwgbWV0aG9kX25hbWUgPDwgIiAoaWZhY2UsICI7CisKKyAgICBpZiAoIXJldHVybl90eXBlLT5pc192b2lkKCkpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgIl9yZXR1cm4sICI7CisgICAgfQorICAgIGZvciAoZmllbGRfaXRlciA9IGFyZ3MuYmVnaW4oKTsgZmllbGRfaXRlciAhPSBhcmdzLmVuZCgpOyArK2ZpZWxkX2l0ZXIpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgKCpmaWVsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiLCAiOworICAgIH0KKyAgICBmb3IgKGZpZWxkX2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgZmllbGRfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsrZmllbGRfaXRlcikgeworICAgICAgZl9zZXJ2aWNlXyA8PCAoKmZpZWxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIsICI7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgImVycm9yKTsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisgIH0KKworICAvLyBHZW5lcmF0ZSB0aGUgaGFuZGxlciBpbnRlcmZhY2UgaW5pdGlhbGl6ZXIKKyAgZl9zZXJ2aWNlXyA8PCAic3RhdGljIHZvaWQiIDw8IGVuZGwgPDwgY2xhc3NfbmFtZV9sYyA8PCAiXyIgPDwgc2VydmljZV9uYW1lX2xjCisgICAgICAgICAgICAgPDwgIl9pZl9pbnRlcmZhY2VfaW5pdCAoIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiSWZJbnRlcmZhY2UgKmlmYWNlKSIKKyAgICAgICAgICAgICA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgaWYgKGZ1bmN0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgZm9yIChmdW5jdGlvbl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZ1bmN0aW9uX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2Z1bmN0aW9uX2l0ZXIpIHsKKyAgICAgIHN0cmluZyBtZXRob2RfbmFtZSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcygoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWZhY2UtPiIgPDwgbWV0aG9kX25hbWUgPDwgIiA9ICIgPDwgY2xhc3NfbmFtZV9sYyA8PCAiXyIKKyAgICAgICAgICAgICAgICAgPDwgbWV0aG9kX25hbWUgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICB9CisgIGVsc2UgeworICAgIGZfc2VydmljZV8gPDwgIlRIUklGVF9VTlVTRURfVkFSIChpZmFjZSk7IiA8PCBlbmRsOworICB9CisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgaGFuZGxlciBpbnN0YW5jZSBpbml0aWFsaXplcgorICBmX3NlcnZpY2VfIDw8ICJzdGF0aWMgdm9pZCIgPDwgZW5kbCA8PCBjbGFzc19uYW1lX2xjIDw8ICJfaW5pdCAoIiA8PCBjbGFzc19uYW1lIDw8ICIgKnNlbGYpIgorICAgICAgICAgICAgIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJUSFJJRlRfVU5VU0VEX1ZBUiAoc2VsZik7IiA8PCBlbmRsOworICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIGhhbmRsZXIgY2xhc3MgaW5pdGlhbGl6ZXIKKyAgZl9zZXJ2aWNlXyA8PCAic3RhdGljIHZvaWQiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBjbGFzc19uYW1lX2xjIDw8ICJfY2xhc3NfaW5pdCAoIiA8PCBjbGFzc19uYW1lIDw8ICJDbGFzcyAqY2xzKSIKKyAgICAgICAgICAgICA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgaWYgKGZ1bmN0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgZm9yIChmdW5jdGlvbl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7CisgICAgICAgICBmdW5jdGlvbl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsKKyAgICAgICAgICsrZnVuY3Rpb25faXRlcikgeworICAgICAgc3RyaW5nIGZ1bmN0aW9uX25hbWUgPSAoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgc3RyaW5nIG1ldGhvZF9uYW1lID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKGZ1bmN0aW9uX25hbWUpOworCisgICAgICAvLyBBbGwgbWV0aG9kcyBhcmUgcHVyZSB2aXJ0dWFsIGFuZCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzZXMKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImNscy0+IiA8PCBtZXRob2RfbmFtZSA8PCAiID0gTlVMTDsiIDw8IGVuZGw7CisgICAgfQorICB9CisgIGVsc2UgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIlRIUklGVF9VTlVTRURfVkFSIChjbHMpOyIgPDwgZW5kbDsKKyAgfQorICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIEMgY29kZSB0aGF0IHJlcHJlc2VudHMgYSBUaHJpZnQgc2VydmljZSBwcm9jZXNzb3IuCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGZvciB3aGljaCB0byBnZW5lcmF0ZSBhIHByb2Nlc3NvcgorICovCit2b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3IodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZ1bmN0aW9uX2l0ZXI7CisKKyAgc3RyaW5nIHNlcnZpY2VfbmFtZV9sYyA9IHRvX2xvd2VyX2Nhc2UoaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKHNlcnZpY2VfbmFtZV8pKTsKKyAgc3RyaW5nIHNlcnZpY2VfbmFtZV91YyA9IHRvX3VwcGVyX2Nhc2Uoc2VydmljZV9uYW1lX2xjKTsKKworICBzdHJpbmcgc2VydmljZV9wcm9jZXNzb3JfbmFtZSA9IHNlcnZpY2VfbmFtZV8gKyAiUHJvY2Vzc29yIjsKKworICBzdHJpbmcgY2xhc3NfbmFtZSA9IHRoaXMtPm5zcGFjZSArIHNlcnZpY2VfcHJvY2Vzc29yX25hbWU7CisgIHN0cmluZyBjbGFzc19uYW1lX2xjID0gdGhpcy0+bnNwYWNlX2xjICsgaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKHNlcnZpY2VfcHJvY2Vzc29yX25hbWUpOworICBzdHJpbmcgY2xhc3NfbmFtZV91YyA9IHRvX3VwcGVyX2Nhc2UoY2xhc3NfbmFtZV9sYyk7CisKKyAgc3RyaW5nIHBhcmVudF9jbGFzc19uYW1lOworICBzdHJpbmcgcGFyZW50X3R5cGVfbmFtZTsKKworICBzdHJpbmcgaGFuZGxlcl9jbGFzc19uYW1lID0gdGhpcy0+bnNwYWNlICsgc2VydmljZV9uYW1lXyArICJIYW5kbGVyIjsKKyAgc3RyaW5nIGhhbmRsZXJfY2xhc3NfbmFtZV9sYyA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhoYW5kbGVyX2NsYXNzX25hbWUpOworCisgIHN0cmluZyBwcm9jZXNzX2Z1bmN0aW9uX3R5cGVfbmFtZSA9IGNsYXNzX25hbWUgKyAiUHJvY2Vzc0Z1bmN0aW9uIjsKKyAgc3RyaW5nIHByb2Nlc3NfZnVuY3Rpb25fZGVmX3R5cGVfbmFtZSA9CisgICAgY2xhc3NfbmFtZV9sYyArICJfcHJvY2Vzc19mdW5jdGlvbl9kZWYiOworCisgIHN0cmluZyBmdW5jdGlvbl9uYW1lOworICBzdHJpbmcgYXJnc19pbmRlbnQ7CisKKyAgLy8gVGhlIHNlcnZpY2UgdGhpcyBzZXJ2aWNlIGV4dGVuZHMsIG9yIE5VTEwgaWYgaXQgZXh0ZW5kcyBubyBzZXJ2aWNlCisgIHRfc2VydmljZSogZXh0ZW5kc19zZXJ2aWNlID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7CisKKyAgLy8gRGV0ZXJtaW5lIHRoZSBuYW1lIG9mIG91ciBwYXJlbnQgc2VydmljZSAoaWYgYW55KSBhbmQgdGhlCisgIC8vIHByb2Nlc3NvciBjbGFzcycgcGFyZW50IGNsYXNzIG5hbWUgYW5kIHR5cGUKKyAgaWYgKGV4dGVuZHNfc2VydmljZSkgeworICAgIHN0cmluZyBwYXJlbnRfc2VydmljZV9uYW1lID0gZXh0ZW5kc19zZXJ2aWNlLT5nZXRfbmFtZSgpOworICAgIHN0cmluZyBwYXJlbnRfc2VydmljZV9uYW1lX2xjID0gdG9fbG93ZXJfY2FzZShpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMocGFyZW50X3NlcnZpY2VfbmFtZSkpOworICAgIHN0cmluZyBwYXJlbnRfc2VydmljZV9uYW1lX3VjID0gdG9fdXBwZXJfY2FzZShwYXJlbnRfc2VydmljZV9uYW1lX2xjKTsKKworICAgIHBhcmVudF9jbGFzc19uYW1lID0gdGhpcy0+bnNwYWNlICsgcGFyZW50X3NlcnZpY2VfbmFtZSArICJQcm9jZXNzb3IiOworICAgIHBhcmVudF90eXBlX25hbWUgPSB0aGlzLT5uc3BhY2VfdWMgKyAiVFlQRV8iICsgcGFyZW50X3NlcnZpY2VfbmFtZV91YyArICJfUFJPQ0VTU09SIjsKKyAgfSBlbHNlIHsKKyAgICBwYXJlbnRfY2xhc3NfbmFtZSA9ICJUaHJpZnREaXNwYXRjaFByb2Nlc3NvciI7CisgICAgcGFyZW50X3R5cGVfbmFtZSA9ICJUSFJJRlRfVFlQRV9ESVNQQVRDSF9QUk9DRVNTT1IiOworICB9CisKKyAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3NvciBjbGFzcycgZGVmaW5pdGlvbiBpbiB0aGUgaGVhZGVyIGZpbGUKKworICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2Vzc29yIGluc3RhbmNlIGRlZmluaXRpb24KKyAgZl9oZWFkZXJfIDw8ICIvKiAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIiBwcm9jZXNzb3IgKi8iIDw8IGVuZGwgPDwgInN0cnVjdCBfIiA8PCBjbGFzc19uYW1lIDw8IGVuZGwKKyAgICAgICAgICAgIDw8ICJ7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8IHBhcmVudF9jbGFzc19uYW1lIDw8ICIgcGFyZW50OyIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICA8PCAiLyogcHJvdGVjdGVkICovIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2UgKyBzZXJ2aWNlX25hbWVfICsgIkhhbmRsZXIgKmhhbmRsZXI7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICA8PCAiR0hhc2hUYWJsZSAqcHJvY2Vzc19tYXA7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX2hlYWRlcl8gPDwgIn07IiA8PCBlbmRsIDw8ICJ0eXBlZGVmIHN0cnVjdCBfIiA8PCBjbGFzc19uYW1lIDw8ICIgIiA8PCBjbGFzc19uYW1lIDw8ICI7IiA8PCBlbmRsCisgICAgICAgICAgICA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzb3IgY2xhc3MgZGVmaW5pdGlvbgorICBmX2hlYWRlcl8gPDwgInN0cnVjdCBfIiA8PCBjbGFzc19uYW1lIDw8ICJDbGFzcyIgPDwgZW5kbCA8PCAieyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCBwYXJlbnRfY2xhc3NfbmFtZSA8PCAiQ2xhc3MgcGFyZW50OyIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICA8PCAiLyogcHJvdGVjdGVkICovIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICA8PCAiZ2Jvb2xlYW4gKCpkaXNwYXRjaF9jYWxsKSAoVGhyaWZ0RGlzcGF0Y2hQcm9jZXNzb3IgKnByb2Nlc3NvciwiIDw8IGVuZGw7CisgIGFyZ3NfaW5kZW50ID0gaW5kZW50KCkgKyBzdHJpbmcoMjcsICcgJyk7CisgIGZfaGVhZGVyXyA8PCBhcmdzX2luZGVudCA8PCAiVGhyaWZ0UHJvdG9jb2wgKmluLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiVGhyaWZ0UHJvdG9jb2wgKm91dCwiCisgICAgICAgICAgICA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJnY2hhciAqZm5hbWUsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJnaW50MzIgc2VxaWQsIgorICAgICAgICAgICAgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiR0Vycm9yICoqZXJyb3IpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9oZWFkZXJfIDw8ICJ9OyIgPDwgZW5kbCA8PCAidHlwZWRlZiBzdHJ1Y3QgXyIgPDwgY2xhc3NfbmFtZSA8PCAiQ2xhc3MgIiA8PCBjbGFzc19uYW1lCisgICAgICAgICAgICA8PCAiQ2xhc3M7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHJlbWFpbmluZyBoZWFkZXIgYm9pbGVycGxhdGUKKyAgZl9oZWFkZXJfIDw8ICJHVHlwZSAiIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9nZXRfdHlwZSAodm9pZCk7IiA8PCBlbmRsIDw8ICIjZGVmaW5lICIKKyAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX1BST0NFU1NPUiAiCisgICAgICAgICAgICA8PCAiKCIgPDwgY2xhc3NfbmFtZV9sYyA8PCAiX2dldF90eXBlKCkpIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIgPDwgY2xhc3NfbmFtZV91YworICAgICAgICAgICAgPDwgIihvYmopICIKKyAgICAgICAgICAgIDw8ICIoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iCisgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9QUk9DRVNTT1IsICIgPDwgY2xhc3NfbmFtZSA8PCAiKSkiIDw8IGVuZGwgPDwgIiNkZWZpbmUgIgorICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJJU18iIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX1BST0NFU1NPUihvYmopICIKKyAgICAgICAgICAgIDw8ICIoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iCisgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9QUk9DRVNTT1IpKSIgPDwgZW5kbCA8PCAiI2RlZmluZSAiIDw8IGNsYXNzX25hbWVfdWMKKyAgICAgICAgICAgIDw8ICJfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIKKyAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX1BST0NFU1NPUiwgIiA8PCBjbGFzc19uYW1lIDw8ICJDbGFzcykpIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIKKyAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiSVNfIiA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9QUk9DRVNTT1JfQ0xBU1MoYykgIgorICAgICAgICAgICAgPDwgIihHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iIDw8IHNlcnZpY2VfbmFtZV91YworICAgICAgICAgICAgPDwgIl9QUk9DRVNTT1IpKSIgPDwgZW5kbCA8PCAiI2RlZmluZSAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBzZXJ2aWNlX25hbWVfdWMKKyAgICAgICAgICAgIDw8ICJfUFJPQ0VTU09SX0dFVF9DTEFTUyhvYmopICIKKyAgICAgICAgICAgIDw8ICIoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIKKyAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX1BST0NFU1NPUiwgIiA8PCBjbGFzc19uYW1lIDw8ICJDbGFzcykpIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3NvcidzIGltcGxlbWVudGF0aW9uIGluIHRoZSBpbXBsZW1lbnRhdGlvbiBmaWxlCisKKyAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3NvcidzIHByb3BlcnRpZXMgZW51bQorICBmX3NlcnZpY2VfIDw8ICJlbnVtIF8iIDw8IGNsYXNzX25hbWUgPDwgIlByb3BlcnRpZXMiIDw8IGVuZGwgPDwgInsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJQUk9QXyIgPDwgY2xhc3NfbmFtZV91YyA8PCAiXzAsIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJQUk9QXyIKKyAgICAgICAgICAgICA8PCBjbGFzc19uYW1lX3VjIDw8ICJfSEFORExFUiIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlXyA8PCAifTsiIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgaW1wbGVtZW50YXRpb24gYm9pbGVycGxhdGUKKyAgYXJnc19pbmRlbnQgPSBzdHJpbmcoMTUsICcgJyk7CisgIGZfc2VydmljZV8gPDwgIkdfREVGSU5FX1RZUEUgKCIgPDwgY2xhc3NfbmFtZSA8PCAiLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCBjbGFzc19uYW1lX2xjCisgICAgICAgICAgICAgPDwgIiwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgcGFyZW50X3R5cGVfbmFtZSA8PCAiKSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzb3IncyBwcm9jZXNzaW5nLWZ1bmN0aW9uIHR5cGUKKyAgYXJnc19pbmRlbnQgPSBzdHJpbmcocHJvY2Vzc19mdW5jdGlvbl90eXBlX25hbWUubGVuZ3RoKCkgKyAyMywgJyAnKTsKKyAgZl9zZXJ2aWNlXyA8PCAidHlwZWRlZiBnYm9vbGVhbiAoKiAiIDw8IHByb2Nlc3NfZnVuY3Rpb25fdHlwZV9uYW1lIDw8ICIpICgiCisgICAgICAgICAgICAgPDwgY2xhc3NfbmFtZSA8PCAiICosICIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGFyZ3NfaW5kZW50IDw8ICJnaW50MzIsIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgYXJnc19pbmRlbnQgPDwgIlRocmlmdFByb3RvY29sICosIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgYXJnc19pbmRlbnQgPDwgIlRocmlmdFByb3RvY29sICosIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgYXJnc19pbmRlbnQgPDwgIkdFcnJvciAqKik7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2Vzc29yJ3MgcHJvY2Vzc2luZy1mdW5jdGlvbi1kZWZpbml0aW9uIHR5cGUKKyAgZl9zZXJ2aWNlXyA8PCAidHlwZWRlZiBzdHJ1Y3QiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAieyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdjaGFyICpuYW1lOyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IHByb2Nlc3NfZnVuY3Rpb25fdHlwZV9uYW1lIDw8ICIgZnVuY3Rpb247IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX3NlcnZpY2VfIDw8ICJ9ICIgPDwgcHJvY2Vzc19mdW5jdGlvbl9kZWZfdHlwZV9uYW1lIDw8ICI7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSBmb3J3YXJkIGRlY2xhcmF0aW9ucyBvZiB0aGUgcHJvY2Vzc29yJ3MgcHJvY2Vzc2luZyBmdW5jdGlvbnMgc28gd2UKKyAgLy8gY2FuIHJlZmVyIHRvIHRoZW0gaW4gdGhlIHByb2Nlc3NpbmctZnVuY3Rpb24tZGVmaW5pdGlvbiBzdHJ1Y3QgYmVsb3cgYW5kCisgIC8vIGtlZXAgYWxsIG9mIHRoZSBwcm9jZXNzb3IncyBkZWNsYXJhdGlvbnMgaW4gb25lIHBsYWNlCisgIGZvciAoZnVuY3Rpb25faXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOworICAgICAgIGZ1bmN0aW9uX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOworICAgICAgICsrZnVuY3Rpb25faXRlcikgeworICAgIGZ1bmN0aW9uX25hbWUgPSBjbGFzc19uYW1lX2xjICsgIl9wcm9jZXNzXyIKKyAgICAgICsgaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKCgqZnVuY3Rpb25faXRlciktPmdldF9uYW1lKCkpOworCisgICAgYXJnc19pbmRlbnQgPSBzdHJpbmcoZnVuY3Rpb25fbmFtZS5sZW5ndGgoKSArIDIsICcgJyk7CisgICAgZl9zZXJ2aWNlXyA8PCAic3RhdGljIGdib29sZWFuIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBmdW5jdGlvbl9uYW1lIDw8ICIgKCIKKyAgICAgICAgICAgICAgIDw8IGNsYXNzX25hbWUgPDwgIiAqLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgYXJnc19pbmRlbnQgPDwgImdpbnQzMiwiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGFyZ3NfaW5kZW50IDw8ICJUaHJpZnRQcm90b2NvbCAqLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgYXJnc19pbmRlbnQgPDwgIlRocmlmdFByb3RvY29sICosIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBhcmdzX2luZGVudCA8PCAiR0Vycm9yICoqKTsiIDw8IGVuZGw7CisgIH0KKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzb3IncyBwcm9jZXNzaW5nLWZ1bmN0aW9uIGRlZmluaXRpb25zLCBpZiB0aGUgc2VydmljZQorICAvLyBkZWZpbmVzIGFueSBtZXRob2RzCisgIGlmIChmdW5jdGlvbnMuc2l6ZSgpID4gMCkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInN0YXRpYyAiIDw8IHByb2Nlc3NfZnVuY3Rpb25fZGVmX3R5cGVfbmFtZQorICAgICAgICAgICAgICAgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgY2xhc3NfbmFtZV9sYyA8PCAiX3Byb2Nlc3NfZnVuY3Rpb25fZGVmc1siCisgICAgICAgICAgICAgICA8PCBmdW5jdGlvbnMuc2l6ZSgpIDw8ICJdID0geyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmb3IgKGZ1bmN0aW9uX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsKKyAgICAgICAgIGZ1bmN0aW9uX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOworICAgICAgICAgKytmdW5jdGlvbl9pdGVyKSB7CisgICAgICBzdHJpbmcgc2VydmljZV9mdW5jdGlvbl9uYW1lID0gKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgIHN0cmluZyBwcm9jZXNzX2Z1bmN0aW9uX25hbWUgPSBjbGFzc19uYW1lX2xjICsgIl9wcm9jZXNzXyIKKyAgICAgICAgKyBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoc2VydmljZV9mdW5jdGlvbl9uYW1lKTsKKworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiXCIiIDw8IHNlcnZpY2VfZnVuY3Rpb25fbmFtZSA8PCAiXCIsIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IHByb2Nlc3NfZnVuY3Rpb25fbmFtZSA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iCisgICAgICAgICAgICAgICAgIDw8IChmdW5jdGlvbl9pdGVyID09IC0tZnVuY3Rpb25zLmVuZCgpID8gIiIgOiAiLCIpIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIH0KKworICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2Vzc29yJ3MgcHJvY2Vzc2luZyBmdW5jdGlvbnMKKyAgZm9yIChmdW5jdGlvbl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZ1bmN0aW9uX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2Z1bmN0aW9uX2l0ZXIpIHsKKyAgICBzdHJpbmcgc2VydmljZV9mdW5jdGlvbl9uYW1lID0gKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICBzdHJpbmcgc2VydmljZV9mdW5jdGlvbl9uYW1lX2ljID0gdW5kZXJzY29yZXNfdG9faW5pdGlhbF9jYXBzKHNlcnZpY2VfZnVuY3Rpb25fbmFtZSk7CisgICAgc3RyaW5nIHNlcnZpY2VfZnVuY3Rpb25fbmFtZV9sYyA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhzZXJ2aWNlX2Z1bmN0aW9uX25hbWUpOworICAgIHN0cmluZyBzZXJ2aWNlX2Z1bmN0aW9uX25hbWVfdWMgPSB0b191cHBlcl9jYXNlKHNlcnZpY2VfZnVuY3Rpb25fbmFtZV9sYyk7CisKKyAgICB0X3R5cGUqIHJldHVybl90eXBlID0gKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKTsKKyAgICBib29sIGhhc19yZXR1cm5fdmFsdWUgPSAhcmV0dXJuX3R5cGUtPmlzX3ZvaWQoKTsKKworICAgIHRfc3RydWN0KiBhcmdfbGlzdCA9ICgqZnVuY3Rpb25faXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgYXJncyA9IGFyZ19saXN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGFyZ19pdGVyOworCisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0gKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhjZXB0aW9uX2l0ZXI7CisKKyAgICBzdHJpbmcgYXJnc19jbGFzc19uYW1lID0gdGhpcy0+bnNwYWNlICsgc2VydmljZV9uYW1lXyArIHNlcnZpY2VfZnVuY3Rpb25fbmFtZV9pYyArICJBcmdzIjsKKyAgICBzdHJpbmcgYXJnc19jbGFzc190eXBlID0gdGhpcy0+bnNwYWNlX3VjICsgIlRZUEVfIiArIHNlcnZpY2VfbmFtZV91YyArICJfIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNlcnZpY2VfZnVuY3Rpb25fbmFtZV91YyArICJfQVJHUyI7CisKKyAgICBzdHJpbmcgcmVzdWx0X2NsYXNzX25hbWUgPSB0aGlzLT5uc3BhY2UgKyBzZXJ2aWNlX25hbWVfICsgc2VydmljZV9mdW5jdGlvbl9uYW1lX2ljICsgIlJlc3VsdCI7CisgICAgc3RyaW5nIHJlc3VsdF9jbGFzc190eXBlID0gdGhpcy0+bnNwYWNlX3VjICsgIlRZUEVfIiArIHNlcnZpY2VfbmFtZV91YyArICJfIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc2VydmljZV9mdW5jdGlvbl9uYW1lX3VjICsgIl9SRVNVTFQiOworCisgICAgc3RyaW5nIGhhbmRsZXJfZnVuY3Rpb25fbmFtZSA9IGhhbmRsZXJfY2xhc3NfbmFtZV9sYyArICJfIiArIHNlcnZpY2VfZnVuY3Rpb25fbmFtZV9sYzsKKworICAgIGZ1bmN0aW9uX25hbWUgPSBjbGFzc19uYW1lX2xjICsgIl9wcm9jZXNzXyIKKyAgICAgICAgICAgICAgICAgICAgKyBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoc2VydmljZV9mdW5jdGlvbl9uYW1lKTsKKworICAgIGFyZ3NfaW5kZW50ID0gc3RyaW5nKGZ1bmN0aW9uX25hbWUubGVuZ3RoKCkgKyAyLCAnICcpOworICAgIGZfc2VydmljZV8gPDwgInN0YXRpYyBnYm9vbGVhbiIgPDwgZW5kbCA8PCBmdW5jdGlvbl9uYW1lIDw8ICIgKCIgPDwgY2xhc3NfbmFtZSA8PCAiICpzZWxmLCIKKyAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgImdpbnQzMiBzZXF1ZW5jZV9pZCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKKyAgICAgICAgICAgICAgIDw8ICJUaHJpZnRQcm90b2NvbCAqaW5wdXRfcHJvdG9jb2wsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgICA8PCAiVGhyaWZ0UHJvdG9jb2wgKm91dHB1dF9wcm90b2NvbCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIkdFcnJvciAqKmVycm9yKSIKKyAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ2Jvb2xlYW4gcmVzdWx0ID0gVFJVRTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJUaHJpZnRUcmFuc3BvcnQgKiB0cmFuc3BvcnQ7IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiVGhyaWZ0QXBwbGljYXRpb25FeGNlcHRpb24gKnhjZXB0aW9uOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgYXJnc19jbGFzc19uYW1lICsgIiAqIGFyZ3MgPSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX29iamVjdF9uZXcgKCIgPDwgYXJnc19jbGFzc190eXBlIDw8ICIsIE5VTEwpOyIgPDwgZW5kbCA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgaWYgKCgqZnVuY3Rpb25faXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJUSFJJRlRfVU5VU0VEX1ZBUiAoc2VxdWVuY2VfaWQpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAiVEhSSUZUX1VOVVNFRF9WQVIgKG91dHB1dF9wcm90b2NvbCk7IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdfb2JqZWN0X2dldCAoaW5wdXRfcHJvdG9jb2wsIFwidHJhbnNwb3J0XCIsICIKKyAgICAgICAgICAgICAgIDw8ICImdHJhbnNwb3J0LCBOVUxMKTsiIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIC8vIFJlYWQgdGhlIG1ldGhvZCdzIGFyZ3VtZW50cyBmcm9tIHRoZSBjYWxsZXIKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAoKHRocmlmdF9zdHJ1Y3RfcmVhZCAoVEhSSUZUX1NUUlVDVCAoYXJncyksICIKKyAgICAgICAgICAgICAgIDw8ICJpbnB1dF9wcm90b2NvbCwgZXJyb3IpICE9IC0xKSAmJiIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgIiAgICAodGhyaWZ0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9lbmQgKGlucHV0X3Byb3RvY29sLCAiCisgICAgICAgICAgICAgICA8PCAiZXJyb3IpICE9IC0xKSAmJiIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgIiAgICAodGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2VuZCAodHJhbnNwb3J0LCBlcnJvcikgIT0gRkFMU0UpKSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICAgIGZvciAoYXJnX2l0ZXIgPSBhcmdzLmJlZ2luKCk7IGFyZ19pdGVyICE9IGFyZ3MuZW5kKCk7ICsrYXJnX2l0ZXIpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgcHJvcGVydHlfdHlwZV9uYW1lKCgqYXJnX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiICIKKyAgICAgICAgICAgICAgICAgPDwgKCphcmdfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICAgIGZvciAoeGNlcHRpb25faXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4Y2VwdGlvbl9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4Y2VwdGlvbl9pdGVyKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IHR5cGVfbmFtZSgoKnhjZXB0aW9uX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiICIKKyAgICAgICAgICAgICAgICAgPDwgaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKCgqeGNlcHRpb25faXRlciktPmdldF9uYW1lKCkpIDw8ICIgPSBOVUxMOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaWYgKGhhc19yZXR1cm5fdmFsdWUpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgcHJvcGVydHlfdHlwZV9uYW1lKHJldHVybl90eXBlKSA8PCAiIHJldHVybl92YWx1ZTsiIDw8IGVuZGw7CisgICAgfQorICAgIGlmICghKCpmdW5jdGlvbl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgcmVzdWx0X2NsYXNzX25hbWUgPDwgIiAqIHJlc3VsdF9zdHJ1Y3Q7IiA8PCBlbmRsOworICAgIH0KKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgICBpZiAoYXJncy5zaXplKCkgPiAwKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX29iamVjdF9nZXQgKGFyZ3MsIiA8PCBlbmRsOworICAgICAgYXJnc19pbmRlbnQgPSBpbmRlbnQoKSArIHN0cmluZygxNCwgJyAnKTsKKyAgICAgIGZvciAoYXJnX2l0ZXIgPSBhcmdzLmJlZ2luKCk7IGFyZ19pdGVyICE9IGFyZ3MuZW5kKCk7ICsrYXJnX2l0ZXIpIHsKKyAgICAgICAgc3RyaW5nIGFyZ19uYW1lID0gKCphcmdfaXRlciktPmdldF9uYW1lKCk7CisKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBhcmdzX2luZGVudCA8PCAiXCIiIDw8IGFyZ19uYW1lIDw8ICJcIiwgJiIgPDwgYXJnX25hbWUgPDwgIiwiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfIDw8IGFyZ3NfaW5kZW50IDw8ICJOVUxMKTsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpZiAoISgqZnVuY3Rpb25faXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgPDwgImdfb2JqZWN0X2dldCAob3V0cHV0X3Byb3RvY29sLCBcInRyYW5zcG9ydFwiLCAiCisgICAgICAgICAgICAgICAgIDw8ICImdHJhbnNwb3J0LCBOVUxMKTsiIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAicmVzdWx0X3N0cnVjdCA9IGdfb2JqZWN0X25ldyAoIiA8PCByZXN1bHRfY2xhc3NfdHlwZSA8PCAiLCBOVUxMKTsiIDw8IGVuZGw7CisgICAgICBpZiAoaGFzX3JldHVybl92YWx1ZSkgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX29iamVjdF9nZXQgKHJlc3VsdF9zdHJ1Y3QsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJzdWNjZXNzXCIsICZyZXR1cm5fdmFsdWUsIE5VTEwpOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgICB9CisKKyAgICAvLyBQYXNzIHRoZSBhcmd1bWVudHMgdG8gdGhlIGNvcnJlc3BvbmRpbmcgbWV0aG9kIGluIHRoZSBoYW5kbGVyCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKCIgPDwgaGFuZGxlcl9mdW5jdGlvbl9uYW1lIDw8ICIgKCIgPDwgdGhpcy0+bnNwYWNlX3VjCisgICAgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9JRiAoc2VsZi0+aGFuZGxlciksIiA8PCBlbmRsOworICAgIGFyZ3NfaW5kZW50ID0gaW5kZW50KCkgKyBzdHJpbmcoaGFuZGxlcl9mdW5jdGlvbl9uYW1lLmxlbmd0aCgpICsgNiwgJyAnKTsKKyAgICBpZiAoaGFzX3JldHVybl92YWx1ZSkgeworICAgICAgc3RyaW5nIHJldHVybl90eXBlX25hbWUgPSB0eXBlX25hbWUocmV0dXJuX3R5cGUpOworCisgICAgICBmX3NlcnZpY2VfIDw8IGFyZ3NfaW5kZW50OworCisgICAgICAvLyBDYXN0IHJldHVybl92YWx1ZSBpZiBpdCB3YXMgZGVjbGFyZWQgYXMgYSB0eXBlIG90aGVyIHRoYW4gdGhlIHJldHVybgorICAgICAgLy8gdmFsdWUncyBhY3R1YWwgdHlwZS0tLXRoaXMgaXMgdHJ1ZSBmb3IgaW50ZWdlciB2YWx1ZXMgMzIgYml0cyBvciBmZXdlcgorICAgICAgLy8gaW4gd2lkdGgsIGZvciB3aGljaCBHTGliIHJlcXVpcmVzIGEgcGxhaW4gZ2ludCB0eXBlIGJlIHVzZWQgd2hlbgorICAgICAgLy8gc3RvcmluZyBvciByZXRyaWV2aW5nIGFzIGFuIG9iamVjdCBwcm9wZXJ0eQorICAgICAgaWYgKHJldHVybl90eXBlX25hbWUgIT0gcHJvcGVydHlfdHlwZV9uYW1lKHJldHVybl90eXBlKSkgeworICAgICAgICBpZiAocmV0dXJuX3R5cGVfbmFtZVtyZXR1cm5fdHlwZV9uYW1lLmxlbmd0aCgpIC0gMV0gIT0gJyonKSB7CisgICAgICAgICAgcmV0dXJuX3R5cGVfbmFtZSArPSAnICc7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuX3R5cGVfbmFtZSArPSAnKic7CisKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAiKCIgPDwgcmV0dXJuX3R5cGVfbmFtZSA8PCAiKSI7CisgICAgICB9CisKKyAgICAgIGZfc2VydmljZV8gPDwgIiZyZXR1cm5fdmFsdWUsIiA8PCBlbmRsOworICAgIH0KKyAgICBmb3IgKGFyZ19pdGVyID0gYXJncy5iZWdpbigpOyBhcmdfaXRlciAhPSBhcmdzLmVuZCgpOyArK2FyZ19pdGVyKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGFyZ3NfaW5kZW50IDw8ICgqYXJnX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIsIiA8PCBlbmRsOworICAgIH0KKyAgICBmb3IgKHhjZXB0aW9uX2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeGNlcHRpb25faXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreGNlcHRpb25faXRlcikgeworICAgICAgZl9zZXJ2aWNlXyA8PCBhcmdzX2luZGVudCA8PCAiJiIgPDwgaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKCgqeGNlcHRpb25faXRlciktPmdldF9uYW1lKCkpCisgICAgICAgICAgICAgICAgIDw8ICIsIiA8PCBlbmRsOworICAgIH0KKyAgICBmX3NlcnZpY2VfIDw8IGFyZ3NfaW5kZW50IDw8ICJlcnJvcikgPT0gVFJVRSkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisKKyAgICAvLyBUaGUgaGFuZGxlciByZXBvcnRlZCBzdWNjZXNzOyByZXR1cm4gdGhlIHJlc3VsdCwgaWYgYW55LCB0byB0aGUgY2FsbGVyCisgICAgaWYgKCEoKmZ1bmN0aW9uX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgaWYgKGhhc19yZXR1cm5fdmFsdWUpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ19vYmplY3Rfc2V0IChyZXN1bHRfc3RydWN0LCBcInN1Y2Nlc3NcIiwgIjsKKyAgICAgICAgaWYgKHR5cGVfbmFtZShyZXR1cm5fdHlwZSkgIT0gcHJvcGVydHlfdHlwZV9uYW1lKHJldHVybl90eXBlKSkgeworICAgICAgICAgIC8vIFJvdW5kdHJpcCBjYXN0IHRvIGZpeCB0aGUgcG9zaXRpb24gb2Ygc2lnbiBiaXQuCisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCAiKCIgPDwgcHJvcGVydHlfdHlwZV9uYW1lKHJldHVybl90eXBlKSA8PCAiKSIKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIoIiA8PCB0eXBlX25hbWUocmV0dXJuX3R5cGUpIDw8ICIpIjsKKyAgICAgICAgfQorICAgICAgICBmX3NlcnZpY2VfIDw8ICJyZXR1cm5fdmFsdWUsICIKKyAgICAgICAgICAgICAgICAgICA8PCAiTlVMTCk7IiA8PCBlbmRsOworCisgICAgICAgIC8vIERlYWxsb2NhdGUgKG9yIHVucmVmKSByZXR1cm5fdmFsdWUKKyAgICAgICAgcmV0dXJuX3R5cGUgPSBnZXRfdHJ1ZV90eXBlKHJldHVybl90eXBlKTsKKyAgICAgICAgaWYgKHJldHVybl90eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgICAgIHRfYmFzZV90eXBlKiBiYXNlX3R5cGUgPSAoKHRfYmFzZV90eXBlKilyZXR1cm5fdHlwZSk7CisKKyAgICAgICAgICBpZiAoYmFzZV90eXBlLT5nZXRfYmFzZSgpID09IHRfYmFzZV90eXBlOjpUWVBFX1NUUklORykgeworICAgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKHJldHVybl92YWx1ZSAhPSBOVUxMKSIgPDwgZW5kbDsKKyAgICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICAgICAgaWYgKGJhc2VfdHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ19ieXRlX2FycmF5X3VucmVmIChyZXR1cm5fdmFsdWUpOyIgPDwgZW5kbDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdfZnJlZSAocmV0dXJuX3ZhbHVlKTsiIDw8IGVuZGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChyZXR1cm5fdHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAocmV0dXJuX3ZhbHVlICE9IE5VTEwpIiA8PCBlbmRsOworICAgICAgICAgIGluZGVudF91cCgpOworCisgICAgICAgICAgaWYgKHJldHVybl90eXBlLT5pc19saXN0KCkpIHsKKyAgICAgICAgICAgIHRfdHlwZSogZWxlbV90eXBlID0gKCh0X2xpc3QqKXJldHVybl90eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworCisgICAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOworICAgICAgICAgICAgaWYgKGlzX251bWVyaWMoZWxlbV90eXBlKSkgeworICAgICAgICAgICAgICBmX3NlcnZpY2VfIDw8ICJnX2FycmF5X3VucmVmIjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGZfc2VydmljZV8gPDwgImdfcHRyX2FycmF5X3VucmVmIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZfc2VydmljZV8gPDwgIiAocmV0dXJuX3ZhbHVlKTsiIDw8IGVuZGw7CisgICAgICAgICAgfSBlbHNlIGlmIChyZXR1cm5fdHlwZS0+aXNfbWFwKCkgfHwgcmV0dXJuX3R5cGUtPmlzX3NldCgpKSB7CisgICAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX2hhc2hfdGFibGVfdW5yZWYgKHJldHVybl92YWx1ZSk7IiA8PCBlbmRsOworICAgICAgICAgIH0KKworICAgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIH0gZWxzZSBpZiAocmV0dXJuX3R5cGUtPmlzX3N0cnVjdCgpKSB7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKHJldHVybl92YWx1ZSAhPSBOVUxMKSIgPDwgZW5kbDsKKyAgICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX29iamVjdF91bnJlZiAocmV0dXJuX3ZhbHVlKTsiIDw8IGVuZGw7CisgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgfQorCisgICAgICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJlc3VsdCA9IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIoKHRocmlmdF9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2JlZ2luIChvdXRwdXRfcHJvdG9jb2wsIiA8PCBlbmRsOworICAgICAgYXJnc19pbmRlbnQgPSBpbmRlbnQoKSArIHN0cmluZygzOSwgJyAnKTsKKyAgICAgIGZfc2VydmljZV8gPDwgYXJnc19pbmRlbnQgPDwgIlwiIiA8PCBzZXJ2aWNlX2Z1bmN0aW9uX25hbWUgPDwgIlwiLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgICAgICA8PCAiVF9SRVBMWSwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgInNlcXVlbmNlX2lkLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgICAgICA8PCAiZXJyb3IpICE9IC0xKSAmJiIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAiICh0aHJpZnRfc3RydWN0X3dyaXRlIChUSFJJRlRfU1RSVUNUIChyZXN1bHRfc3RydWN0KSwiIDw8IGVuZGw7CisgICAgICBhcmdzX2luZGVudCA9IGluZGVudCgpICsgc3RyaW5nKDIzLCAnICcpOworICAgICAgZl9zZXJ2aWNlXyA8PCBhcmdzX2luZGVudCA8PCAib3V0cHV0X3Byb3RvY29sLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiZXJyb3IpICE9IC0xKSk7IgorICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICB9CisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJlbHNlIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgICAgLy8gVGhlIGhhbmRsZXIgcmVwb3J0ZWQgZmFpbHVyZTsgY2hlY2sgdG8gc2VlIGlmIGFuIGFwcGxpY2F0aW9uLWRlZmluZWQKKyAgICAvLyBleGNlcHRpb24gd2FzIHJhaXNlZCBhbmQgaWYgc28sIHJldHVybiBpdCB0byB0aGUgY2FsbGVyCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKKyAgICBpZiAoeGNlcHRpb25zLnNpemUoKSA+IDApIHsKKyAgICAgIGZvciAoeGNlcHRpb25faXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4Y2VwdGlvbl9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4Y2VwdGlvbl9pdGVyKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgImlmICgiIDw8IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcygoKnhjZXB0aW9uX2l0ZXIpLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgICAgIDw8ICIgIT0gTlVMTCkiIDw8IGVuZGw7CisgICAgICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX29iamVjdF9zZXQgKHJlc3VsdF9zdHJ1Y3QsIiA8PCBlbmRsOworICAgICAgICBhcmdzX2luZGVudCA9IGluZGVudCgpICsgc3RyaW5nKDE0LCAnICcpOworICAgICAgICBmX3NlcnZpY2VfIDw8IGFyZ3NfaW5kZW50IDw8ICJcIiIgPDwgKCp4Y2VwdGlvbl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIsICIKKyAgICAgICAgICAgICAgICAgICA8PCAoKnhjZXB0aW9uX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJOVUxMKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQgPSIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIigodGhyaWZ0X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW4gKG91dHB1dF9wcm90b2NvbCwiIDw8IGVuZGw7CisgICAgICAgIGFyZ3NfaW5kZW50ID0gaW5kZW50KCkgKyBzdHJpbmcoMzksICcgJyk7CisgICAgICAgIGZfc2VydmljZV8gPDwgYXJnc19pbmRlbnQgPDwgIlwiIiA8PCBzZXJ2aWNlX2Z1bmN0aW9uX25hbWUgPDwgIlwiLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgICAgICAgIDw8ICJUX1JFUExZLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAic2VxdWVuY2VfaWQsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgICAgICAgPDwgImVycm9yKSAhPSAtMSkgJiYiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgICA8PCAiICh0aHJpZnRfc3RydWN0X3dyaXRlIChUSFJJRlRfU1RSVUNUIChyZXN1bHRfc3RydWN0KSwiIDw8IGVuZGw7CisgICAgICAgIGFyZ3NfaW5kZW50ID0gaW5kZW50KCkgKyBzdHJpbmcoMjMsICcgJyk7CisgICAgICAgIGZfc2VydmljZV8gPDwgYXJnc19pbmRlbnQgPDwgIm91dHB1dF9wcm90b2NvbCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgImVycm9yKSAhPSAtMSkpOyIKKyAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJlbHNlIiA8PCBlbmRsOworICAgICAgfQorCisgICAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7CisgICAgfQorCisgICAgLy8gSWYgdGhlIGhhbmRsZXIgcmVwb3J0ZWQgZmFpbHVyZSBidXQgcmFpc2VkIG5vIGFwcGxpY2F0aW9uLWRlZmluZWQKKyAgICAvLyBleGNlcHRpb24sIHJldHVybiBhIFRocmlmdCBhcHBsaWNhdGlvbiBleGNlcHRpb24gd2l0aCB0aGUgaW5mb3JtYXRpb24KKyAgICAvLyByZXR1cm5lZCB2aWEgR0xpYidzIG93biBlcnJvci1yZXBvcnRpbmcgbWVjaGFuaXNtCisgICAgZl9zZXJ2aWNlXyA8PCAiaWYgKCplcnJvciA9PSBOVUxMKSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX3dhcm5pbmcgKFwiIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICIuIgorICAgICAgICAgICAgICAgPDwgKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGltcGxlbWVudGF0aW9uIHJldHVybmVkIEZBTFNFIFwiIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBzdHJpbmcoMTEsICcgJykgPDwgIlwiYnV0IGRpZCBub3Qgc2V0IGFuIGVycm9yXCIpOyIgPDwgZW5kbCA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAieGNlcHRpb24gPSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0FQUExJQ0FUSU9OX0VYQ0VQVElPTiwiIDw8IGVuZGw7CisgICAgYXJnc19pbmRlbnQgPSBpbmRlbnQoKSArIHN0cmluZygxNCwgJyAnKTsKKyAgICBmX3NlcnZpY2VfIDw8IGFyZ3NfaW5kZW50IDw8ICJcInR5cGVcIiwgICAgKmVycm9yICE9IE5VTEwgPyAoKmVycm9yKS0+Y29kZSA6IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBhcmdzX2luZGVudCA8PCBzdHJpbmcoMTEsICcgJykgPDwgIlRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1JfVU5LTk9XTiwiCisgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJcIm1lc3NhZ2VcIiwgKmVycm9yICE9IE5VTEwgPyAoKmVycm9yKS0+bWVzc2FnZSA6IE5VTEwsIgorICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiTlVMTCk7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ19jbGVhcl9lcnJvciAoZXJyb3IpOyIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAicmVzdWx0ID0iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiKCh0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbiAob3V0cHV0X3Byb3RvY29sLCIgPDwgZW5kbDsKKyAgICBhcmdzX2luZGVudCA9IGluZGVudCgpICsgc3RyaW5nKDM5LCAnICcpOworICAgIGZfc2VydmljZV8gPDwgYXJnc19pbmRlbnQgPDwgIlwiIiA8PCBzZXJ2aWNlX2Z1bmN0aW9uX25hbWUgPDwgIlwiLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgICAgPDwgIlRfRVhDRVBUSU9OLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAic2VxdWVuY2VfaWQsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgICA8PCAiZXJyb3IpICE9IC0xKSAmJiIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgIiAodGhyaWZ0X3N0cnVjdF93cml0ZSAoVEhSSUZUX1NUUlVDVCAoeGNlcHRpb24pLCIgPDwgZW5kbDsKKyAgICBhcmdzX2luZGVudCA9IGluZGVudCgpICsgc3RyaW5nKDIzLCAnICcpOworICAgIGZfc2VydmljZV8gPDwgYXJnc19pbmRlbnQgPDwgIm91dHB1dF9wcm90b2NvbCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgImVycm9yKSAhPSAtMSkpOyIKKyAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImdfb2JqZWN0X3VucmVmICh4Y2VwdGlvbik7IiA8PCBlbmRsOworCisgICAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgIH0KKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAgIC8vIERlbGxvY2F0ZSBvciB1bnJlZiByZXRyaWV2ZWQgYXJndW1lbnQgdmFsdWVzIGFzIG5lY2Vzc2FyeQorICAgIGZvciAoYXJnX2l0ZXIgPSBhcmdzLmJlZ2luKCk7IGFyZ19pdGVyICE9IGFyZ3MuZW5kKCk7ICsrYXJnX2l0ZXIpIHsKKyAgICAgIHN0cmluZyBhcmdfbmFtZSA9ICgqYXJnX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgdF90eXBlKiBhcmdfdHlwZSA9IGdldF90cnVlX3R5cGUoKCphcmdfaXRlciktPmdldF90eXBlKCkpOworCisgICAgICBpZiAoYXJnX3R5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICAgIHRfYmFzZV90eXBlKiBiYXNlX3R5cGUgPSAoKHRfYmFzZV90eXBlKilhcmdfdHlwZSk7CisKKyAgICAgICAgaWYgKGJhc2VfdHlwZS0+Z2V0X2Jhc2UoKSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkcpIHsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAoIiA8PCBhcmdfbmFtZSA8PCAiICE9IE5VTEwpIiA8PCBlbmRsOworICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICAgIGlmIChiYXNlX3R5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX2J5dGVfYXJyYXlfdW5yZWYgKCIgPDwgYXJnX25hbWUgPDwgIik7IiA8PCBlbmRsOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX2ZyZWUgKCIgPDwgYXJnX25hbWUgPDwgIik7IiA8PCBlbmRsOworICAgICAgICAgIH0KKyAgICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKGFyZ190eXBlLT5pc19jb250YWluZXIoKSkgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAoIiA8PCBhcmdfbmFtZSA8PCAiICE9IE5VTEwpIiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKworICAgICAgICBpZiAoYXJnX3R5cGUtPmlzX2xpc3QoKSkgeworICAgICAgICAgIHRfdHlwZSogZWxlbV90eXBlID0gKCh0X2xpc3QqKWFyZ190eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworCisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKKyAgICAgICAgICBpZiAoaXNfbnVtZXJpYyhlbGVtX3R5cGUpKSB7CisgICAgICAgICAgICBmX3NlcnZpY2VfIDw8ICJnX2FycmF5X3VucmVmIjsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZl9zZXJ2aWNlXyA8PCAiZ19wdHJfYXJyYXlfdW5yZWYiOworICAgICAgICAgIH0KKyAgICAgICAgICBmX3NlcnZpY2VfIDw8ICIgKCIgPDwgYXJnX25hbWUgPDwgIik7IiA8PCBlbmRsOworICAgICAgICB9IGVsc2UgaWYgKGFyZ190eXBlLT5pc19tYXAoKSB8fCBhcmdfdHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX2hhc2hfdGFibGVfdW5yZWYgKCIgPDwgYXJnX25hbWUgPDwgIik7IiA8PCBlbmRsOworICAgICAgICB9CisKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIH0gZWxzZSBpZiAoYXJnX3R5cGUtPmlzX3N0cnVjdCgpKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmICgiIDw8IGFyZ19uYW1lIDw8ICIgIT0gTlVMTCkiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX29iamVjdF91bnJlZiAoIiA8PCBhcmdfbmFtZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKCEoKmZ1bmN0aW9uX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ19vYmplY3RfdW5yZWYgKHJlc3VsdF9zdHJ1Y3QpOyIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgIDw8ICJpZiAocmVzdWx0ID09IFRSVUUpIiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQgPSIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiKCh0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9lbmQgIgorICAgICAgICAgICAgICAgICA8PCAiKG91dHB1dF9wcm90b2NvbCwgZXJyb3IpICE9IC0xKSAmJiIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAiICh0aHJpZnRfdHJhbnNwb3J0X3dyaXRlX2VuZCAodHJhbnNwb3J0LCBlcnJvcikgIgorICAgICAgICAgICAgICAgICA8PCAiIT0gRkFMU0UpICYmIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgIDw8ICIgKHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgZXJyb3IpICIKKyAgICAgICAgICAgICAgICAgPDwgIiE9IEZBTFNFKSk7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgfQorICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZWxzZSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQgPSBGQUxTRTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKworICAgIGZfc2VydmljZV8gPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiZ19vYmplY3RfdW5yZWYgKHRyYW5zcG9ydCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAiZ19vYmplY3RfdW5yZWYgKGFyZ3MpOyIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gcmVzdWx0OyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworCisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworICB9CisKKyAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3NvcidzIGRpc3BhdGNoX2NhbGwgaW1wbGVtZW50YXRpb24KKyAgZnVuY3Rpb25fbmFtZSA9IGNsYXNzX25hbWVfbGMgKyAiX2Rpc3BhdGNoX2NhbGwiOworICBhcmdzX2luZGVudCA9IGluZGVudCgpICsgc3RyaW5nKGZ1bmN0aW9uX25hbWUubGVuZ3RoKCkgKyAyLCAnICcpOworICBmX3NlcnZpY2VfIDw8ICJzdGF0aWMgZ2Jvb2xlYW4iIDw8IGVuZGwgPDwgZnVuY3Rpb25fbmFtZQorICAgICAgICAgICAgIDw8ICIgKFRocmlmdERpc3BhdGNoUHJvY2Vzc29yICpkaXNwYXRjaF9wcm9jZXNzb3IsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgPDwgIlRocmlmdFByb3RvY29sICppbnB1dF9wcm90b2NvbCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKKyAgICAgICAgICAgICA8PCAiVGhyaWZ0UHJvdG9jb2wgKm91dHB1dF9wcm90b2NvbCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgImdjaGFyICptZXRob2RfbmFtZSwiCisgICAgICAgICAgICAgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiZ2ludDMyIHNlcXVlbmNlX2lkLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgIDw8ICJHRXJyb3IgKiplcnJvcikiIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9wcm9jZXNzX2Z1bmN0aW9uX2RlZiAqIgorICAgICAgICAgICAgIDw8ICJwcm9jZXNzX2Z1bmN0aW9uX2RlZjsiIDw8IGVuZGw7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdib29sZWFuIGRpc3BhdGNoX3Jlc3VsdCA9IEZBTFNFOyIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgY2xhc3NfbmFtZSA8PCAiICpzZWxmID0gIiA8PCBjbGFzc19uYW1lX3VjIDw8ICIgKGRpc3BhdGNoX3Byb2Nlc3Nvcik7IiA8PCBlbmRsOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IHBhcmVudF9jbGFzc19uYW1lIDw8ICJDbGFzcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIipwYXJlbnRfY2xhc3MgPSIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdfdHlwZV9jbGFzc19wZWVrX3BhcmVudCAoIiA8PCBjbGFzc19uYW1lX3VjIDw8ICJfR0VUX0NMQVNTIChzZWxmKSk7IgorICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV8gPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJwcm9jZXNzX2Z1bmN0aW9uX2RlZiA9ICIKKyAgICAgICAgICAgICA8PCAiZ19oYXNoX3RhYmxlX2xvb2t1cCAoc2VsZi0+cHJvY2Vzc19tYXAsIG1ldGhvZF9uYW1lKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKHByb2Nlc3NfZnVuY3Rpb25fZGVmICE9IE5VTEwpIiA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgYXJnc19pbmRlbnQgPSBpbmRlbnQoKSArIHN0cmluZyg1MywgJyAnKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ19mcmVlIChtZXRob2RfbmFtZSk7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImRpc3BhdGNoX3Jlc3VsdCA9ICIKKyAgICAgICAgICAgICA8PCAiKCpwcm9jZXNzX2Z1bmN0aW9uX2RlZi0+ZnVuY3Rpb24pIChzZWxmLCIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGFyZ3NfaW5kZW50IDw8ICJzZXF1ZW5jZV9pZCwiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBhcmdzX2luZGVudCA8PCAiaW5wdXRfcHJvdG9jb2wsIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgYXJnc19pbmRlbnQgPDwgIm91dHB1dF9wcm90b2NvbCwiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBhcmdzX2luZGVudCA8PCAiZXJyb3IpOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZWxzZSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisKKyAgLy8gTWV0aG9kIG5hbWUgbm90IHJlY29nbml6ZWQ7IGNoYWluIHVwIHRvIG91ciBwYXJlbnQgcHJvY2Vzc29yLS0tbm90ZSB0aGUKKyAgLy8gdG9wLW1vc3QgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QsIGluIFRocmlmdERpc3BhdGNoUHJvY2Vzc29yIGl0c2VsZiwKKyAgLy8gd2lsbCByZXR1cm4gYW4gYXBwbGljYXRpb24gZXhjZXB0aW9uIHRvIHRoZSBjYWxsZXIgaWYgbm8gY2xhc3MgaW4gdGhlCisgIC8vIGhpZXJhcmNoeSByZWNvZ25pemVzIHRoZSBtZXRob2QgbmFtZQorICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJkaXNwYXRjaF9yZXN1bHQgPSBwYXJlbnRfY2xhc3MtPmRpc3BhdGNoX2NhbGwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoZGlzcGF0Y2hfcHJvY2Vzc29yLCIgPDwgZW5kbDsKKyAgYXJnc19pbmRlbnQgPSBpbmRlbnQoKSArIHN0cmluZyg0NywgJyAnKTsKKyAgZl9zZXJ2aWNlXyA8PCBhcmdzX2luZGVudCA8PCAiaW5wdXRfcHJvdG9jb2wsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJvdXRwdXRfcHJvdG9jb2wsIgorICAgICAgICAgICAgIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIm1ldGhvZF9uYW1lLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAic2VxdWVuY2VfaWQsIgorICAgICAgICAgICAgIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgImVycm9yKTsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGRpc3BhdGNoX3Jlc3VsdDsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2Vzc29yJ3MgcHJvcGVydHkgc2V0dGVyCisgIGZ1bmN0aW9uX25hbWUgPSBjbGFzc19uYW1lX2xjICsgIl9zZXRfcHJvcGVydHkiOworICBhcmdzX2luZGVudCA9IHN0cmluZyhmdW5jdGlvbl9uYW1lLmxlbmd0aCgpICsgMiwgJyAnKTsKKyAgZl9zZXJ2aWNlXyA8PCAic3RhdGljIHZvaWQiIDw8IGVuZGwgPDwgZnVuY3Rpb25fbmFtZSA8PCAiIChHT2JqZWN0ICpvYmplY3QsIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgYXJnc19pbmRlbnQgPDwgImd1aW50IHByb3BlcnR5X2lkLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiY29uc3QgR1ZhbHVlICp2YWx1ZSwiCisgICAgICAgICAgICAgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiR1BhcmFtU3BlYyAqcHNwZWMpIiA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBjbGFzc19uYW1lIDw8ICIgKnNlbGYgPSAiIDw8IGNsYXNzX25hbWVfdWMgPDwgIiAob2JqZWN0KTsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJzd2l0Y2ggKHByb3BlcnR5X2lkKSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImNhc2UgUFJPUF8iIDw8IGNsYXNzX25hbWVfdWMgPDwgIl9IQU5ETEVSOiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChzZWxmLT5oYW5kbGVyICE9IE5VTEwpIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ19vYmplY3RfdW5yZWYgKHNlbGYtPmhhbmRsZXIpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAic2VsZi0+aGFuZGxlciA9IGdfdmFsdWVfZ2V0X29iamVjdCAodmFsdWUpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICJnX29iamVjdF9yZWYgKHNlbGYtPmhhbmRsZXIpOyIgPDwgZW5kbDsKKyAgaWYgKGV4dGVuZHNfc2VydmljZSkgeworICAgIC8vIENoYWluIHVwIHRvIHNldCB0aGUgaGFuZGxlciBpbiBldmVyeSBzdXBlcmNsYXNzIGFzIHdlbGwKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIkdfT0JKRUNUX0NMQVNTICgiIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9wYXJlbnRfY2xhc3MpLT4iCisgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInNldF9wcm9wZXJ0eSAob2JqZWN0LCBwcm9wZXJ0eV9pZCwgdmFsdWUsIHBzcGVjKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BlcnR5X2lkLCBwc3BlYyk7IgorICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHByb2Nlc3NvcidzIHByb3BlcnR5IGdldHRlcgorICBmdW5jdGlvbl9uYW1lID0gY2xhc3NfbmFtZV9sYyArICJfZ2V0X3Byb3BlcnR5IjsKKyAgYXJnc19pbmRlbnQgPSBzdHJpbmcoZnVuY3Rpb25fbmFtZS5sZW5ndGgoKSArIDIsICcgJyk7CisgIGZfc2VydmljZV8gPDwgInN0YXRpYyB2b2lkIiA8PCBlbmRsIDw8IGZ1bmN0aW9uX25hbWUgPDwgIiAoR09iamVjdCAqb2JqZWN0LCIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGFyZ3NfaW5kZW50IDw8ICJndWludCBwcm9wZXJ0eV9pZCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIkdWYWx1ZSAqdmFsdWUsIgorICAgICAgICAgICAgIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIkdQYXJhbVNwZWMgKnBzcGVjKSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgY2xhc3NfbmFtZSA8PCAiICpzZWxmID0gIiA8PCBjbGFzc19uYW1lX3VjIDw8ICIgKG9iamVjdCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAic3dpdGNoIChwcm9wZXJ0eV9pZCkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJjYXNlIFBST1BfIiA8PCBjbGFzc19uYW1lX3VjIDw8ICJfSEFORExFUjoiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX3ZhbHVlX3NldF9vYmplY3QgKHZhbHVlLCBzZWxmLT5oYW5kbGVyKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAiYnJlYWs7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIkdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wZXJ0eV9pZCwgcHNwZWMpOyIKKyAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAvLyBHZW5lcmF0b3IgdGhlIHByb2Nlc3NvcidzIGRpc3Bvc2UgZnVuY3Rpb24KKyAgZl9zZXJ2aWNlXyA8PCAic3RhdGljIHZvaWQiIDw8IGVuZGwgPDwgY2xhc3NfbmFtZV9sYyA8PCAiX2Rpc3Bvc2UgKEdPYmplY3QgKmdvYmplY3QpIiA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBjbGFzc19uYW1lIDw8ICIgKnNlbGYgPSAiIDw8IGNsYXNzX25hbWVfdWMgPDwgIiAoZ29iamVjdCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaWYgKHNlbGYtPmhhbmRsZXIgIT0gTlVMTCkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX29iamVjdF91bnJlZiAoc2VsZi0+aGFuZGxlcik7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgInNlbGYtPmhhbmRsZXIgPSBOVUxMOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJHX09CSkVDVF9DTEFTUyAoIiA8PCBjbGFzc19uYW1lX2xjIDw8ICJfcGFyZW50X2NsYXNzKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItPmRpc3Bvc2UgKGdvYmplY3QpOyIKKyAgICAgICAgICAgICA8PCBlbmRsOworICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgcHJvY2Vzc29yIGZpbmFsaXplIGZ1bmN0aW9uCisgIGZfc2VydmljZV8gPDwgInN0YXRpYyB2b2lkIiA8PCBlbmRsIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9maW5hbGl6ZSAoR09iamVjdCAqZ29iamVjdCkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJQcm9jZXNzb3IgKnNlbGYgPSAiIDw8IHRoaXMtPm5zcGFjZV91YworICAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX1BST0NFU1NPUiAoZ29iamVjdCk7IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAidGhyaWZ0X3NhZmVfaGFzaF90YWJsZV9kZXN0cm95IChzZWxmLT5wcm9jZXNzX21hcCk7IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAiR19PQkpFQ1RfQ0xBU1MgKCIgPDwgY2xhc3NfbmFtZV9sYyA8PCAiX3BhcmVudF9jbGFzcykiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0+ZmluYWxpemUgKGdvYmplY3QpOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHByb2Nlc3NvciBpbnN0YW5jZSBpbml0aWFsaXplcgorICBmX3NlcnZpY2VfIDw8ICJzdGF0aWMgdm9pZCIgPDwgZW5kbCA8PCBjbGFzc19uYW1lX2xjIDw8ICJfaW5pdCAoIiA8PCBjbGFzc19uYW1lIDw8ICIgKnNlbGYpIgorICAgICAgICAgICAgIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBpZiAoZnVuY3Rpb25zLnNpemUoKSA+IDApIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJndWludCBpbmRleDsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIH0KKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAic2VsZi0+aGFuZGxlciA9IE5VTEw7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgInNlbGYtPnByb2Nlc3NfbWFwID0gIgorICAgICAgICAgICAgICAgICJnX2hhc2hfdGFibGVfbmV3IChnX3N0cl9oYXNoLCBnX3N0cl9lcXVhbCk7IiA8PCBlbmRsOworICBpZiAoZnVuY3Rpb25zLnNpemUoKSA+IDApIHsKKyAgICBhcmdzX2luZGVudCA9IHN0cmluZygyMSwgJyAnKTsKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJmb3IgKGluZGV4ID0gMDsgaW5kZXggPCAiCisgICAgICAgICAgICAgICA8PCBmdW5jdGlvbnMuc2l6ZSgpIDw8ICI7IGluZGV4ICs9IDEpIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdfaGFzaF90YWJsZV9pbnNlcnQgKHNlbGYtPnByb2Nlc3NfbWFwLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgYXJnc19pbmRlbnQKKyAgICAgICAgICAgICAgIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9wcm9jZXNzX2Z1bmN0aW9uX2RlZnNbaW5kZXhdLm5hbWUsIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgICAgPDwgIiYiIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9wcm9jZXNzX2Z1bmN0aW9uX2RlZnNbaW5kZXhdIiA8PCAiKTsiCisgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHByb2Nlc3NvciBjbGFzcyBpbml0aWFsaXplcgorICBmX3NlcnZpY2VfIDw8ICJzdGF0aWMgdm9pZCIgPDwgZW5kbCA8PCBjbGFzc19uYW1lX2xjIDw8ICJfY2xhc3NfaW5pdCAoIiA8PCBjbGFzc19uYW1lCisgICAgICAgICAgICAgPDwgIkNsYXNzICpjbHMpIiA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGNscyk7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIlRocmlmdERpc3BhdGNoUHJvY2Vzc29yQ2xhc3MgKmRpc3BhdGNoX3Byb2Nlc3Nvcl9jbGFzcyA9IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiVEhSSUZUX0RJU1BBVENIX1BST0NFU1NPUl9DTEFTUyAoY2xzKTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIkdQYXJhbVNwZWMgKnBhcmFtX3NwZWM7IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAiZ29iamVjdF9jbGFzcy0+ZGlzcG9zZSA9ICIgPDwgY2xhc3NfbmFtZV9sYyA8PCAiX2Rpc3Bvc2U7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgImdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gIiA8PCBjbGFzc19uYW1lX2xjIDw8ICJfZmluYWxpemU7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgImdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9ICIgPDwgY2xhc3NfbmFtZV9sYyA8PCAiX3NldF9wcm9wZXJ0eTsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gIiA8PCBjbGFzc19uYW1lX2xjIDw8ICJfZ2V0X3Byb3BlcnR5OyIKKyAgICAgICAgICAgICA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAiZGlzcGF0Y2hfcHJvY2Vzc29yX2NsYXNzLT5kaXNwYXRjaF9jYWxsID0gIiA8PCBjbGFzc19uYW1lX2xjIDw8ICJfZGlzcGF0Y2hfY2FsbDsiCisgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiY2xzLT5kaXNwYXRjaF9jYWxsID0gIiA8PCBjbGFzc19uYW1lX2xjIDw8ICJfZGlzcGF0Y2hfY2FsbDsiCisgICAgICAgICAgICAgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJwYXJhbV9zcGVjID0gZ19wYXJhbV9zcGVjX29iamVjdCAoXCJoYW5kbGVyXCIsIgorICAgICAgICAgICAgIDw8IGVuZGw7CisgIGFyZ3NfaW5kZW50ID0gaW5kZW50KCkgKyBzdHJpbmcoMzQsICcgJyk7CisgIGZfc2VydmljZV8gPDwgYXJnc19pbmRlbnQgPDwgIlwiU2VydmljZSBoYW5kbGVyIGltcGxlbWVudGF0aW9uXCIsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgPDwgIlwiVGhlIHNlcnZpY2UgaGFuZGxlciBpbXBsZW1lbnRhdGlvbiBcIiIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgIDw8ICJcInRvIHdoaWNoIG1ldGhvZCBjYWxscyBhcmUgZGlzcGF0Y2hlZC5cIiwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKKyAgICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2VfdWMgKyAiVFlQRV8iICsgc2VydmljZV9uYW1lX3VjICsgIl9IQU5ETEVSLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgIDw8ICJHX1BBUkFNX1JFQURXUklURSk7IiA8PCBlbmRsOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCIgPDwgZW5kbDsKKyAgYXJnc19pbmRlbnQgPSBpbmRlbnQoKSArIHN0cmluZygzMywgJyAnKTsKKyAgZl9zZXJ2aWNlXyA8PCBhcmdzX2luZGVudCA8PCAiUFJPUF8iIDw8IGNsYXNzX25hbWVfdWMgPDwgIl9IQU5ETEVSLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgIDw8ICJwYXJhbV9zcGVjKTsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIEMgY29kZSB0aGF0IHJlcHJlc2VudHMgYSBUaHJpZnQgc2VydmljZSBzZXJ2ZXIuCisgKi8KK3ZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgICh2b2lkKXRzZXJ2aWNlOworICAvLyBHZW5lcmF0ZSB0aGUgc2VydmljZSdzIGhhbmRsZXIgY2xhc3MKKyAgZ2VuZXJhdGVfc2VydmljZV9oYW5kbGVyKHRzZXJ2aWNlKTsKKworICAvLyBHZW5lcmF0ZSB0aGUgc2VydmljZSdzIHByb2Nlc3NvciBjbGFzcworICBnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3Nvcih0c2VydmljZSk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIEMgY29kZSB0byByZXByZXNlbnQgYSBUSHJpZnQgc3RydWN0dXJlIGFzIGEgR09iamVjdC4KKyAqLwordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX29iamVjdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgIHN0cmluZyBuYW1lX3UgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMobmFtZSk7CisgIHN0cmluZyBuYW1lX3VjID0gdG9fdXBwZXJfY2FzZShuYW1lX3UpOworCisgIHN0cmluZyBjbGFzc19uYW1lID0gdGhpcy0+bnNwYWNlICsgbmFtZTsKKyAgc3RyaW5nIGNsYXNzX25hbWVfbGMgPSB0aGlzLT5uc3BhY2VfbGMgKyBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMobmFtZSk7CisgIHN0cmluZyBjbGFzc19uYW1lX3VjID0gdG9fdXBwZXJfY2FzZShjbGFzc19uYW1lX2xjKTsKKworICBzdHJpbmcgZnVuY3Rpb25fbmFtZTsKKyAgc3RyaW5nIGFyZ3NfaW5kZW50OworCisgIC8vIHdyaXRlIHRoZSBpbnN0YW5jZSBkZWZpbml0aW9uCisgIGZfdHlwZXNfIDw8ICJzdHJ1Y3QgXyIgPDwgdGhpcy0+bnNwYWNlIDw8IG5hbWUgPDwgZW5kbCA8PCAieyAiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgIiAgVGhyaWZ0U3RydWN0IHBhcmVudDsgIiA8PCBlbmRsIDw8IGVuZGwgPDwgIiAgLyogcHVibGljICovIiA8PCBlbmRsOworCisgIC8vIGZvciBlYWNoIGZpZWxkLCBhZGQgYSBtZW1iZXIgdmFyaWFibGUKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICBmX3R5cGVzXyA8PCAiICAiIDw8IHR5cGVfbmFtZSh0KSA8PCAiICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOworICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICBmX3R5cGVzXyA8PCAiICBnYm9vbGVhbiBfX2lzc2V0XyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIC8vIGNsb3NlIHRoZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbiBhbmQgY3JlYXRlIGEgdHlwZWRlZgorICBmX3R5cGVzXyA8PCAifTsiIDw8IGVuZGwgPDwgInR5cGVkZWYgc3RydWN0IF8iIDw8IHRoaXMtPm5zcGFjZSA8PCBuYW1lIDw8ICIgIiA8PCB0aGlzLT5uc3BhY2UKKyAgICAgICAgICAgPDwgbmFtZSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIHdyaXRlIHRoZSBjbGFzcyBkZWZpbml0aW9uCisgIGZfdHlwZXNfIDw8ICJzdHJ1Y3QgXyIgPDwgdGhpcy0+bnNwYWNlIDw8IG5hbWUgPDwgIkNsYXNzIiA8PCBlbmRsIDw8ICJ7IiA8PCBlbmRsCisgICAgICAgICAgIDw8ICIgIFRocmlmdFN0cnVjdENsYXNzIHBhcmVudDsiIDw8IGVuZGwgPDwgIn07IiA8PCBlbmRsIDw8ICJ0eXBlZGVmIHN0cnVjdCBfIgorICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2UgPDwgbmFtZSA8PCAiQ2xhc3MgIiA8PCB0aGlzLT5uc3BhY2UgPDwgbmFtZSA8PCAiQ2xhc3M7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gd3JpdGUgdGhlIHN0YW5kYXJkIEdPYmplY3QgYm9pbGVycGxhdGUKKyAgZl90eXBlc18gPDwgIkdUeXBlICIgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IG5hbWVfdSA8PCAiX2dldF90eXBlICh2b2lkKTsiIDw8IGVuZGwgPDwgIiNkZWZpbmUgIgorICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIiA8PCBuYW1lX3VjIDw8ICIgKCIgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IG5hbWVfdQorICAgICAgICAgICA8PCAiX2dldF90eXBlKCkpIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IG5hbWVfdWMKKyAgICAgICAgICAgPDwgIihvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIgPDwgbmFtZV91YworICAgICAgICAgICA8PCAiLCAiIDw8IHRoaXMtPm5zcGFjZSA8PCBuYW1lIDw8ICIpKSIgPDwgZW5kbCA8PCAiI2RlZmluZSAiIDw8IHRoaXMtPm5zcGFjZV91YworICAgICAgICAgICA8PCBuYW1lX3VjIDw8ICJfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJfVFlQRV8iCisgICAgICAgICAgIDw8IG5hbWVfdWMgPDwgIiwgIiA8PCB0aGlzLT5uc3BhY2UgPDwgbmFtZSA8PCAiQ2xhc3MpKSIgPDwgZW5kbCA8PCAiI2RlZmluZSAiCisgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiSVNfIiA8PCBuYW1lX3VjIDw8ICIob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCAiCisgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iIDw8IG5hbWVfdWMgPDwgIikpIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIgPDwgdGhpcy0+bnNwYWNlX3VjCisgICAgICAgICAgIDw8ICJJU18iIDw8IG5hbWVfdWMgPDwgIl9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgIiA8PCB0aGlzLT5uc3BhY2VfdWMKKyAgICAgICAgICAgPDwgIlRZUEVfIiA8PCBuYW1lX3VjIDw8ICIpKSIgPDwgZW5kbCA8PCAiI2RlZmluZSAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBuYW1lX3VjCisgICAgICAgICAgIDw8ICJfR0VUX0NMQVNTKG9iaikgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iCisgICAgICAgICAgIDw8IG5hbWVfdWMgPDwgIiwgIiA8PCB0aGlzLT5uc3BhY2UgPDwgbmFtZSA8PCAiQ2xhc3MpKSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIHN0YXJ0IHdyaXRpbmcgdGhlIG9iamVjdCBpbXBsZW1lbnRhdGlvbiAuYyBmaWxlCisKKyAgLy8gZ2VuZXJhdGUgcHJvcGVydGllcyBlbnVtCisgIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKKyAgICBmX3R5cGVzX2ltcGxfIDw8ICJlbnVtIF8iIDw8IGNsYXNzX25hbWUgPDwgIlByb3BlcnRpZXMiIDw8IGVuZGwgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiUFJPUF8iIDw8IGNsYXNzX25hbWVfdWMgPDwgIl8wIjsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBzdHJpbmcgbWVtYmVyX25hbWVfdWMKKyAgICAgICAgICA9IHRvX3VwcGVyX2Nhc2UodG9fbG93ZXJfY2FzZShpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSkpOworCisgICAgICBmX3R5cGVzX2ltcGxfIDw8ICIsIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJQUk9QXyIgPDwgY2xhc3NfbmFtZV91YyA8PCAiXyIgPDwgbWVtYmVyX25hbWVfdWM7CisgICAgfQorICAgIGZfdHlwZXNfaW1wbF8gPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfdHlwZXNfaW1wbF8gPDwgIn07IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKworICAvLyBnZW5lcmF0ZSBzdHJ1Y3QgSS9PIG1ldGhvZHMKKyAgc3RyaW5nIHRoaXNfZ2V0ID0gdGhpcy0+bnNwYWNlICsgbmFtZSArICIgKiB0aGlzX29iamVjdCA9ICIgKyB0aGlzLT5uc3BhY2VfdWMgKyBuYW1lX3VjCisgICAgICAgICAgICAgICAgICAgICsgIihvYmplY3QpOyI7CisgIGdlbmVyYXRlX3N0cnVjdF9yZWFkZXIoZl90eXBlc19pbXBsXywgdHN0cnVjdCwgInRoaXNfb2JqZWN0LT4iLCB0aGlzX2dldCk7CisgIGdlbmVyYXRlX3N0cnVjdF93cml0ZXIoZl90eXBlc19pbXBsXywgdHN0cnVjdCwgInRoaXNfb2JqZWN0LT4iLCB0aGlzX2dldCk7CisKKyAgLy8gZ2VuZXJhdGUgcHJvcGVydHkgc2V0dGVyIGFuZCBnZXR0ZXIKKyAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgeworICAgIC8vIGdlbmVyYXRlIHByb3BlcnR5IHNldHRlcgorICAgIGZ1bmN0aW9uX25hbWUgPSBjbGFzc19uYW1lX2xjICsgIl9zZXRfcHJvcGVydHkiOworICAgIGFyZ3NfaW5kZW50ID0gc3RyaW5nKGZ1bmN0aW9uX25hbWUubGVuZ3RoKCkgKyAyLCAnICcpOworICAgIGZfdHlwZXNfaW1wbF8gPDwgInN0YXRpYyB2b2lkIiA8PCBlbmRsIDw8IGZ1bmN0aW9uX25hbWUgPDwgIiAoR09iamVjdCAqb2JqZWN0LCIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgPDwgYXJnc19pbmRlbnQgPDwgImd1aW50IHByb3BlcnR5X2lkLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgICAgICAgPDwgImNvbnN0IEdWYWx1ZSAqdmFsdWUsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJHUGFyYW1TcGVjICpwc3BlYykiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl90eXBlc19pbXBsXyk7CisgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCBjbGFzc19uYW1lIDw8ICIgKnNlbGYgPSAiIDw8IGNsYXNzX25hbWVfdWMgPDwgIiAob2JqZWN0KTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInN3aXRjaCAocHJvcGVydHlfaWQpIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfdHlwZXNfaW1wbF8pOworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIHRfZmllbGQqIG1lbWJlciA9ICgqbV9pdGVyKTsKKyAgICAgIHN0cmluZyBtZW1iZXJfbmFtZSA9IG1lbWJlci0+Z2V0X25hbWUoKTsKKyAgICAgIHN0cmluZyBtZW1iZXJfbmFtZV91YworICAgICAgICAgID0gdG9fdXBwZXJfY2FzZSh0b19sb3dlcl9jYXNlKGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhtZW1iZXJfbmFtZSkpKTsKKyAgICAgIHRfdHlwZSogbWVtYmVyX3R5cGUgPSBnZXRfdHJ1ZV90eXBlKG1lbWJlci0+Z2V0X3R5cGUoKSk7CisKKyAgICAgIHN0cmluZyBwcm9wZXJ0eV9pZGVudGlmaWVyID0gIlBST1BfIiArIGNsYXNzX25hbWVfdWMgKyAiXyIgKyBtZW1iZXJfbmFtZV91YzsKKworICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiY2FzZSAiIDw8IHByb3BlcnR5X2lkZW50aWZpZXIgKyAiOiIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworCisgICAgICBpZiAobWVtYmVyX3R5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICAgIHRfYmFzZV90eXBlKiBiYXNlX3R5cGUgPSAoKHRfYmFzZV90eXBlKiltZW1iZXJfdHlwZSk7CisgICAgICAgIHN0cmluZyBhc3NpZ25fZnVuY3Rpb25fbmFtZTsKKworICAgICAgICBpZiAoYmFzZV90eXBlLT5nZXRfYmFzZSgpID09IHRfYmFzZV90eXBlOjpUWVBFX1NUUklORykgeworICAgICAgICAgIHN0cmluZyByZWxlYXNlX2Z1bmN0aW9uX25hbWU7CisKKyAgICAgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJpZiAoc2VsZi0+IiA8PCBtZW1iZXJfbmFtZSA8PCAiICE9IE5VTEwpIiA8PCBlbmRsOworICAgICAgICAgIGluZGVudF91cCgpOworCisgICAgICAgICAgaWYgKGJhc2VfdHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgICAgIHJlbGVhc2VfZnVuY3Rpb25fbmFtZSA9ICJnX2J5dGVfYXJyYXlfdW5yZWYiOworICAgICAgICAgICAgYXNzaWduX2Z1bmN0aW9uX25hbWUgPSAiZ192YWx1ZV9kdXBfYm94ZWQiOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZWxlYXNlX2Z1bmN0aW9uX25hbWUgPSAiZ19mcmVlIjsKKyAgICAgICAgICAgIGFzc2lnbl9mdW5jdGlvbl9uYW1lID0gImdfdmFsdWVfZHVwX3N0cmluZyI7CisgICAgICAgICAgfQorCisgICAgICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCByZWxlYXNlX2Z1bmN0aW9uX25hbWUgPDwgIiAoc2VsZi0+IiA8PCBtZW1iZXJfbmFtZSA8PCAiKTsiCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc3dpdGNoIChiYXNlX3R5cGUtPmdldF9iYXNlKCkpIHsKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgICAgICBhc3NpZ25fZnVuY3Rpb25fbmFtZSA9ICJnX3ZhbHVlX2dldF9ib29sZWFuIjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgICAgIGFzc2lnbl9mdW5jdGlvbl9uYW1lID0gImdfdmFsdWVfZ2V0X2ludCI7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICAgICAgYXNzaWduX2Z1bmN0aW9uX25hbWUgPSAiZ192YWx1ZV9nZXRfaW50NjQiOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgICAgIGFzc2lnbl9mdW5jdGlvbl9uYW1lID0gImdfdmFsdWVfZ2V0X2RvdWJsZSI7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6ICIKKyAgICAgICAgICAgICAgICAgICJ1bnJlY29nbml6ZWQgYmFzZSB0eXBlIFwiIiArIGJhc2VfdHlwZS0+Z2V0X25hbWUoKSArICJcIiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9yIHN0cnVjdCBtZW1iZXIgXCIiCisgICAgICAgICAgICAgICAgKyBtZW1iZXJfbmFtZSArICJcIiI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJzZWxmLT4iIDw8IG1lbWJlcl9uYW1lIDw8ICIgPSAiIDw8IGFzc2lnbl9mdW5jdGlvbl9uYW1lCisgICAgICAgICAgICAgICAgICAgICAgPDwgIiAodmFsdWUpOyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSBpZiAobWVtYmVyX3R5cGUtPmlzX2VudW0oKSkgeworICAgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJzZWxmLT4iIDw8IG1lbWJlcl9uYW1lIDw8ICIgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsiCisgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSBpZiAobWVtYmVyX3R5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgICAgIHN0cmluZyByZWxlYXNlX2Z1bmN0aW9uX25hbWU7CisgICAgICAgIHN0cmluZyBhc3NpZ25fZnVuY3Rpb25fbmFtZTsKKworICAgICAgICBpZiAobWVtYmVyX3R5cGUtPmlzX2xpc3QoKSkgeworICAgICAgICAgIHRfdHlwZSogZWxlbV90eXBlID0gKCh0X2xpc3QqKW1lbWJlcl90eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworCisgICAgICAgICAgLy8gTGlzdHMgb2YgYmFzZSB0eXBlcyBvdGhlciB0aGFuIHN0cmluZ3MgYXJlIHJlcHJlc2VudGVkIGFzIEdBcnJheXM7CisgICAgICAgICAgLy8gYWxsIG90aGVycyBhcyBHUHRyQXJyYXlzCisgICAgICAgICAgaWYgKGlzX251bWVyaWMoZWxlbV90eXBlKSkgeworICAgICAgICAgICAgcmVsZWFzZV9mdW5jdGlvbl9uYW1lID0gImdfYXJyYXlfdW5yZWYiOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZWxlYXNlX2Z1bmN0aW9uX25hbWUgPSAiZ19wdHJfYXJyYXlfdW5yZWYiOworICAgICAgICAgIH0KKworICAgICAgICAgIGFzc2lnbl9mdW5jdGlvbl9uYW1lID0gImdfdmFsdWVfZHVwX2JveGVkIjsKKyAgICAgICAgfSBlbHNlIGlmIChtZW1iZXJfdHlwZS0+aXNfc2V0KCkgfHwgbWVtYmVyX3R5cGUtPmlzX21hcCgpKSB7CisgICAgICAgICAgcmVsZWFzZV9mdW5jdGlvbl9uYW1lID0gImdfaGFzaF90YWJsZV91bnJlZiI7CisgICAgICAgICAgYXNzaWduX2Z1bmN0aW9uX25hbWUgPSAiZ192YWx1ZV9kdXBfYm94ZWQiOworICAgICAgICB9CisKKyAgICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiaWYgKHNlbGYtPiIgPDwgbWVtYmVyX25hbWUgPDwgIiAhPSBOVUxMKSIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgcmVsZWFzZV9mdW5jdGlvbl9uYW1lIDw8ICIgKHNlbGYtPiIgPDwgbWVtYmVyX25hbWUgPDwgIik7IgorICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgInNlbGYtPiIgPDwgbWVtYmVyX25hbWUgPDwgIiA9ICIgPDwgYXNzaWduX2Z1bmN0aW9uX25hbWUKKyAgICAgICAgICAgICAgICAgICAgICA8PCAiICh2YWx1ZSk7IiA8PCBlbmRsOworICAgICAgfSBlbHNlIGlmIChtZW1iZXJfdHlwZS0+aXNfc3RydWN0KCkgfHwgbWVtYmVyX3R5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiaWYgKHNlbGYtPiIgPDwgbWVtYmVyX25hbWUgPDwgIiAhPSBOVUxMKSIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgImdfb2JqZWN0X3VucmVmIChzZWxmLT4iIDw8IG1lbWJlcl9uYW1lIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAic2VsZi0+IiA8PCBtZW1iZXJfbmFtZSA8PCAiID0gZ192YWx1ZV9kdXBfb2JqZWN0ICh2YWx1ZSk7IgorICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIGlmIChtZW1iZXItPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgInNlbGYtPl9faXNzZXRfIiA8PCBtZW1iZXJfbmFtZSA8PCAiID0gVFJVRTsiIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgImJyZWFrOyIgPDwgZW5kbCA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICB9CisgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BlcnR5X2lkLCBwc3BlYyk7IgorICAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgc2NvcGVfZG93bihmX3R5cGVzX2ltcGxfKTsKKyAgICBzY29wZV9kb3duKGZfdHlwZXNfaW1wbF8pOworICAgIGZfdHlwZXNfaW1wbF8gPDwgZW5kbDsKKworICAgIC8vIGdlbmVyYXRlIHByb3BlcnR5IGdldHRlcgorICAgIGZ1bmN0aW9uX25hbWUgPSBjbGFzc19uYW1lX2xjICsgIl9nZXRfcHJvcGVydHkiOworICAgIGFyZ3NfaW5kZW50ID0gc3RyaW5nKGZ1bmN0aW9uX25hbWUubGVuZ3RoKCkgKyAyLCAnICcpOworICAgIGZfdHlwZXNfaW1wbF8gPDwgInN0YXRpYyB2b2lkIiA8PCBlbmRsIDw8IGZ1bmN0aW9uX25hbWUgPDwgIiAoR09iamVjdCAqb2JqZWN0LCIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgPDwgYXJnc19pbmRlbnQgPDwgImd1aW50IHByb3BlcnR5X2lkLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiR1ZhbHVlICp2YWx1ZSwiCisgICAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJHUGFyYW1TcGVjICpwc3BlYykiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl90eXBlc19pbXBsXyk7CisgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCBjbGFzc19uYW1lIDw8ICIgKnNlbGYgPSAiIDw8IGNsYXNzX25hbWVfdWMgPDwgIiAob2JqZWN0KTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInN3aXRjaCAocHJvcGVydHlfaWQpIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfdHlwZXNfaW1wbF8pOworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIHRfZmllbGQqIG1lbWJlciA9ICgqbV9pdGVyKTsKKyAgICAgIHN0cmluZyBtZW1iZXJfbmFtZSA9ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgIHN0cmluZyBtZW1iZXJfbmFtZV91YworICAgICAgICAgID0gdG9fdXBwZXJfY2FzZSh0b19sb3dlcl9jYXNlKGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhtZW1iZXJfbmFtZSkpKTsKKyAgICAgIHRfdHlwZSogbWVtYmVyX3R5cGUgPSBnZXRfdHJ1ZV90eXBlKG1lbWJlci0+Z2V0X3R5cGUoKSk7CisKKyAgICAgIHN0cmluZyBwcm9wZXJ0eV9pZGVudGlmaWVyID0gIlBST1BfIiArIGNsYXNzX25hbWVfdWMgKyAiXyIgKyBtZW1iZXJfbmFtZV91YzsKKworICAgICAgc3RyaW5nIHNldHRlcl9mdW5jdGlvbl9uYW1lOworCisgICAgICBpZiAobWVtYmVyX3R5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICAgIHRfYmFzZV90eXBlKiBiYXNlX3R5cGUgPSAoKHRfYmFzZV90eXBlKiltZW1iZXJfdHlwZSk7CisKKyAgICAgICAgc3dpdGNoIChiYXNlX3R5cGUtPmdldF9iYXNlKCkpIHsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICAgIHNldHRlcl9mdW5jdGlvbl9uYW1lID0gImdfdmFsdWVfc2V0X2Jvb2xlYW4iOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgICBzZXR0ZXJfZnVuY3Rpb25fbmFtZSA9ICJnX3ZhbHVlX3NldF9pbnQiOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICAgIHNldHRlcl9mdW5jdGlvbl9uYW1lID0gImdfdmFsdWVfc2V0X2ludDY0IjsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgICBzZXR0ZXJfZnVuY3Rpb25fbmFtZSA9ICJnX3ZhbHVlX3NldF9kb3VibGUiOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICAgIGlmIChiYXNlX3R5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgICAgICBzZXR0ZXJfZnVuY3Rpb25fbmFtZSA9ICJnX3ZhbHVlX3NldF9ib3hlZCI7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNldHRlcl9mdW5jdGlvbl9uYW1lID0gImdfdmFsdWVfc2V0X3N0cmluZyI7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiAiCisgICAgICAgICAgICAgICAgInVucmVjb2duaXplZCBiYXNlIHR5cGUgXCIiICsgYmFzZV90eXBlLT5nZXRfbmFtZSgpICsgIlwiICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9yIHN0cnVjdCBtZW1iZXIgXCIiCisgICAgICAgICAgICAgICsgbWVtYmVyX25hbWUgKyAiXCIiOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKG1lbWJlcl90eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgICAgc2V0dGVyX2Z1bmN0aW9uX25hbWUgPSAiZ192YWx1ZV9zZXRfaW50IjsKKyAgICAgIH0gZWxzZSBpZiAobWVtYmVyX3R5cGUtPmlzX3N0cnVjdCgpIHx8IG1lbWJlcl90eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgICAgIHNldHRlcl9mdW5jdGlvbl9uYW1lID0gImdfdmFsdWVfc2V0X29iamVjdCI7CisgICAgICB9IGVsc2UgaWYgKG1lbWJlcl90eXBlLT5pc19jb250YWluZXIoKSkgeworICAgICAgICBzZXR0ZXJfZnVuY3Rpb25fbmFtZSA9ICJnX3ZhbHVlX3NldF9ib3hlZCI7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6ICIKKyAgICAgICAgICAgICAgInVucmVjb2duaXplZCB0eXBlIGZvciBzdHJ1Y3QgbWVtYmVyIFwiIiArIG1lbWJlcl9uYW1lICsgIlwiIjsKKyAgICAgIH0KKworICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiY2FzZSAiIDw8IHByb3BlcnR5X2lkZW50aWZpZXIgKyAiOiIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCBzZXR0ZXJfZnVuY3Rpb25fbmFtZSA8PCAiICh2YWx1ZSwgc2VsZi0+IiA8PCBtZW1iZXJfbmFtZSA8PCAiKTsiCisgICAgICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImJyZWFrOyIgPDwgZW5kbCA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICB9CisgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BlcnR5X2lkLCBwc3BlYyk7IgorICAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgc2NvcGVfZG93bihmX3R5cGVzX2ltcGxfKTsKKyAgICBzY29wZV9kb3duKGZfdHlwZXNfaW1wbF8pOworICAgIGZfdHlwZXNfaW1wbF8gPDwgZW5kbDsKKyAgfQorCisgIC8vIGdlbmVyYXRlIHRoZSBpbnN0YW5jZSBpbml0IGZ1bmN0aW9uCisKKyAgZl90eXBlc19pbXBsXyA8PCAic3RhdGljIHZvaWQgIiA8PCBlbmRsIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX3UgPDwgIl9pbnN0YW5jZV9pbml0ICgiCisgICAgICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlIDw8IG5hbWUgPDwgIiAqIG9iamVjdCkiIDw8IGVuZGwgPDwgInsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIC8vIGdlbmVyYXRlIGRlZmF1bHQtdmFsdWUgc3RydWN0dXJlcyBmb3IgY29udGFpbmVyLXR5cGUgbWVtYmVycworICBib29sIGNvbnN0YW50X2RlY2xhcmF0aW9uX291dHB1dCA9IGZhbHNlOworICBib29sIHN0cmluZ19saXN0X2NvbnN0YW50X291dHB1dCA9IGZhbHNlOworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF9maWVsZCogbWVtYmVyID0gKm1faXRlcjsKKyAgICB0X2NvbnN0X3ZhbHVlKiBtZW1iZXJfdmFsdWUgPSBtZW1iZXItPmdldF92YWx1ZSgpOworCisgICAgaWYgKG1lbWJlcl92YWx1ZSAhPSBOVUxMKSB7CisgICAgICBzdHJpbmcgbWVtYmVyX25hbWUgPSBtZW1iZXItPmdldF9uYW1lKCk7CisgICAgICB0X3R5cGUqIG1lbWJlcl90eXBlID0gZ2V0X3RydWVfdHlwZShtZW1iZXItPmdldF90eXBlKCkpOworCisgICAgICBpZiAobWVtYmVyX3R5cGUtPmlzX2xpc3QoKSkgeworICAgICAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiBsaXN0ID0gbWVtYmVyX3ZhbHVlLT5nZXRfbGlzdCgpOworICAgICAgICB0X3R5cGUqIGVsZW1fdHlwZSA9ICgodF9saXN0KiltZW1iZXJfdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKworICAgICAgICAvLyBHZW5lcmF0ZSBhbiBhcnJheSB3aXRoIHRoZSBsaXN0IGxpdGVyYWwKKyAgICAgICAgaW5kZW50KGZfdHlwZXNfaW1wbF8pIDw8ICJzdGF0aWMgIiA8PCB0eXBlX25hbWUoZWxlbV90eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIiBfX2RlZmF1bHRfIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgbWVtYmVyX25hbWUgPDwgIlsiIDw8IGxpc3Quc2l6ZSgpIDw8ICJdID0gIiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCBjb25zdGFudF9saXRlcmFsKG1lbWJlcl90eXBlLCBtZW1iZXJfdmFsdWUpIDw8ICI7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworCisgICAgICAgIGNvbnN0YW50X2RlY2xhcmF0aW9uX291dHB1dCA9IHRydWU7CisKKyAgICAgICAgLy8gSWYgd2UgYXJlIGdlbmVyYXRpbmcgdmFsdWVzIGZvciBhIHBvaW50ZXIgYXJyYXkgKGkuZS4gYSBsaXN0IG9mCisgICAgICAgIC8vIHN0cmluZ3MpLCBzZXQgYSBmbGFnIHNvIHdlIGtub3cgdG8gYWxzbyBkZWNsYXJlIGFuIGluZGV4IHZhcmlhYmxlIHRvCisgICAgICAgIC8vIHVzZSBpbiBwcmUtcG9wdWxhdGluZyB0aGUgYXJyYXkKKyAgICAgICAgaWYgKGVsZW1fdHlwZS0+aXNfc3RyaW5nKCkpIHsKKyAgICAgICAgICBzdHJpbmdfbGlzdF9jb25zdGFudF9vdXRwdXQgPSB0cnVlOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8vIFRPRE86IEhhbmRsZSBjb250YWluZXIgdHlwZXMgb3RoZXIgdGhhbiBsaXN0CisgICAgfQorICB9CisgIGlmIChjb25zdGFudF9kZWNsYXJhdGlvbl9vdXRwdXQpIHsKKyAgICBpZiAoc3RyaW5nX2xpc3RfY29uc3RhbnRfb3V0cHV0KSB7CisgICAgICBpbmRlbnQoZl90eXBlc19pbXBsXykgPDwgInVuc2lnbmVkIGludCBsaXN0X2luZGV4OyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBmX3R5cGVzX2ltcGxfIDw8IGVuZGw7CisgIH0KKworICAvLyBzYXRpc2Z5IGNvbXBpbGVycyB3aXRoIC1XYWxsIHR1cm5lZCBvbgorICBpbmRlbnQoZl90eXBlc19pbXBsXykgPDwgIi8qIHNhdGlzZnkgLVdhbGwgKi8iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJUSFJJRlRfVU5VU0VEX1ZBUiAob2JqZWN0KTsiIDw8IGVuZGw7CisKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIHRfdHlwZSogbWVtYmVyX3R5cGUgPSAoKm1faXRlciktPmdldF90eXBlKCk7CisgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZShtZW1iZXJfdHlwZSk7CisgICAgaWYgKHQtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICBzdHJpbmcgZHZhbCA9ICIgPSAiOworICAgICAgaWYgKHQtPmlzX2VudW0oKSkgeworICAgICAgICBkdmFsICs9ICIoIiArIHR5cGVfbmFtZSh0KSArICIpIjsKKyAgICAgIH0KKyAgICAgIHRfY29uc3RfdmFsdWUqIGN2ID0gKCptX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgICAgIGlmIChjdiAhPSBOVUxMKSB7CisgICAgICAgIGR2YWwgKz0gY29uc3RhbnRfdmFsdWUoIiIsIHQsIGN2KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGR2YWwgKz0gdC0+aXNfc3RyaW5nKCkgPyAiTlVMTCIgOiAiMCI7CisgICAgICB9CisgICAgICBpbmRlbnQoZl90eXBlc19pbXBsXykgPDwgIm9iamVjdC0+IiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgZHZhbCA8PCAiOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKHQtPmlzX3N0cnVjdCgpKSB7CisgICAgICBzdHJpbmcgbmFtZSA9ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgIHRfcHJvZ3JhbSogdHlwZV9wcm9ncmFtID0gbWVtYmVyX3R5cGUtPmdldF9wcm9ncmFtKCk7CisgICAgICBzdHJpbmcgdHlwZV9uc3BhY2UgPSB0eXBlX3Byb2dyYW0gPyB0eXBlX3Byb2dyYW0tPmdldF9uYW1lc3BhY2UoImNfZ2xpYiIpIDogIiI7CisgICAgICBzdHJpbmcgdHlwZV9uc3BhY2VfcHJlZml4ID0KKyAgICAgICAgdHlwZV9uc3BhY2UuZW1wdHkoKSA/ICIiIDogaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKHR5cGVfbnNwYWNlKSArICJfIjsKKyAgICAgIHN0cmluZyB0eXBlX25hbWVfdWMgPSB0b191cHBlcl9jYXNlKGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhtZW1iZXJfdHlwZS0+Z2V0X25hbWUoKSkpOworICAgICAgaW5kZW50KGZfdHlwZXNfaW1wbF8pIDw8ICJvYmplY3QtPiIgPDwgbmFtZSA8PCAiID0gZ19vYmplY3RfbmV3ICgiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgdG9fdXBwZXJfY2FzZSh0eXBlX25zcGFjZV9wcmVmaXgpIDw8ICJUWVBFXyIgPDwgdHlwZV9uYW1lX3VjCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiwgTlVMTCk7IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAodC0+aXNfeGNlcHRpb24oKSkgeworICAgICAgc3RyaW5nIG5hbWUgPSAoKm1faXRlciktPmdldF9uYW1lKCk7CisgICAgICBpbmRlbnQoZl90eXBlc19pbXBsXykgPDwgIm9iamVjdC0+IiA8PCBuYW1lIDw8ICIgPSBOVUxMOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKHQtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgICBzdHJpbmcgbmFtZSA9ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgIHN0cmluZyBpbml0X2Z1bmN0aW9uOworICAgICAgdF90eXBlKiBldHlwZSA9IE5VTEw7CisKKyAgICAgIGlmICh0LT5pc19tYXAoKSkgeworICAgICAgICB0X3R5cGUqIGtleSA9ICgodF9tYXAqKXQpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICAgICAgdF90eXBlKiB2YWx1ZSA9ICgodF9tYXAqKXQpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICAgICAgaW5pdF9mdW5jdGlvbiA9IGdlbmVyYXRlX25ld19oYXNoX2Zyb21fdHlwZShrZXksIHZhbHVlKTsKKyAgICAgIH0gZWxzZSBpZiAodC0+aXNfc2V0KCkpIHsKKyAgICAgICAgZXR5cGUgPSAoKHRfc2V0Kil0KS0+Z2V0X2VsZW1fdHlwZSgpOworICAgICAgICBpbml0X2Z1bmN0aW9uID0gZ2VuZXJhdGVfbmV3X2hhc2hfZnJvbV90eXBlKGV0eXBlLCBOVUxMKTsKKyAgICAgIH0gZWxzZSBpZiAodC0+aXNfbGlzdCgpKSB7CisgICAgICAgIGV0eXBlID0gKCh0X2xpc3QqKXQpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgICAgIGluaXRfZnVuY3Rpb24gPSBnZW5lcmF0ZV9uZXdfYXJyYXlfZnJvbV90eXBlKGV0eXBlKTsKKyAgICAgIH0KKworICAgICAgaW5kZW50KGZfdHlwZXNfaW1wbF8pIDw8ICJvYmplY3QtPiIgPDwgbmFtZSA8PCAiID0gIiA8PCBpbml0X2Z1bmN0aW9uIDw8IGVuZGw7CisKKyAgICAgIC8vIFByZS1wb3B1bGF0ZSB0aGUgY29udGFpbmVyIHdpdGggdGhlIHNwZWNpZmllZCBkZWZhdWx0IHZhbHVlcywgaWYgYW55CisgICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSkgeworICAgICAgICB0X2NvbnN0X3ZhbHVlKiBtZW1iZXJfdmFsdWUgPSAoKm1faXRlciktPmdldF92YWx1ZSgpOworCisgICAgICAgIGlmICh0LT5pc19saXN0KCkpIHsKKyAgICAgICAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiBsaXN0ID0gbWVtYmVyX3ZhbHVlLT5nZXRfbGlzdCgpOworCisgICAgICAgICAgaWYgKGlzX251bWVyaWMoZXR5cGUpKSB7CisgICAgICAgICAgICBpbmRlbnQoZl90eXBlc19pbXBsXykgPDwKKyAgICAgICAgICAgICAgImdfYXJyYXlfYXBwZW5kX3ZhbHMgKG9iamVjdC0+IiA8PCBuYW1lIDw8ICIsICZfX2RlZmF1bHRfIiA8PAorICAgICAgICAgICAgICBuYW1lIDw8ICIsICIgPDwgbGlzdC5zaXplKCkgPDwgIik7IiA8PCBlbmRsOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGluZGVudChmX3R5cGVzX2ltcGxfKSA8PAorICAgICAgICAgICAgICAiZm9yIChsaXN0X2luZGV4ID0gMDsgbGlzdF9pbmRleCA8ICIgPDwgbGlzdC5zaXplKCkgPDwgIjsgIiA8PAorICAgICAgICAgICAgICAibGlzdF9pbmRleCArPSAxKSIgPDwgZW5kbDsKKyAgICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICAgICAgaW5kZW50KGZfdHlwZXNfaW1wbF8pIDw8CisgICAgICAgICAgICAgICJnX3B0cl9hcnJheV9hZGQgKG9iamVjdC0+IiA8PCBuYW1lIDw8ICIsIiA8PCBlbmRsIDw8CisgICAgICAgICAgICAgIGluZGVudCgpIDw8IHN0cmluZygxNywgJyAnKSA8PCAiZ19zdHJkdXAgKF9fZGVmYXVsdF8iIDw8CisgICAgICAgICAgICAgIG5hbWUgPDwgIltsaXN0X2luZGV4XSkpOyIgPDwgZW5kbDsKKyAgICAgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gVE9ETzogSGFuZGxlIGNvbnRhaW5lciB0eXBlcyBvdGhlciB0aGFuIGxpc3QKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBub3QgcmVxdWlyZWQsIGluaXRpYWxpemUgdGhlIF9faXNzZXQgdmFyaWFibGUgKi8KKyAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgaW5kZW50KGZfdHlwZXNfaW1wbF8pIDw8ICJvYmplY3QtPl9faXNzZXRfIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9IEZBTFNFOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBmX3R5cGVzX2ltcGxfIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLyogY3JlYXRlIHRoZSBkZXN0cnVjdG9yICovCisgIGZfdHlwZXNfaW1wbF8gPDwgInN0YXRpYyB2b2lkICIgPDwgZW5kbCA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgbmFtZV91CisgICAgICAgICAgICAgICAgPDwgIl9maW5hbGl6ZSAoR09iamVjdCAqb2JqZWN0KSIgPDwgZW5kbCA8PCAieyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCB0aGlzLT5uc3BhY2UgPDwgbmFtZSA8PCAiICp0b2JqZWN0ID0gIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgbmFtZV91YworICAgICAgICAgICAgICAgIDw8ICIgKG9iamVjdCk7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiLyogc2F0aXNmeSAtV2FsbCBpbiBjYXNlIHdlIGRvbid0IHVzZSB0b2JqZWN0ICovIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIlRIUklGVF9VTlVTRURfVkFSICh0b2JqZWN0KTsiIDw8IGVuZGw7CisKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICBpZiAodC0+aXNfY29udGFpbmVyKCkpIHsKKyAgICAgIHN0cmluZyBuYW1lID0gKCptX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgaWYgKHQtPmlzX21hcCgpIHx8IHQtPmlzX3NldCgpKSB7CisgICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgImlmICh0b2JqZWN0LT4iIDw8IG5hbWUgPDwgIiAhPSBOVUxMKSIgPDwgZW5kbDsKKyAgICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgImdfaGFzaF90YWJsZV9kZXN0cm95ICh0b2JqZWN0LT4iIDw8IG5hbWUgPDwgIik7IiA8PCBlbmRsOworICAgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJ0b2JqZWN0LT4iIDw8IG5hbWUgPDwgIiA9IE5VTEw7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgfSBlbHNlIGlmICh0LT5pc19saXN0KCkpIHsKKyAgICAgICAgdF90eXBlKiBldHlwZSA9ICgodF9saXN0Kil0KS0+Z2V0X2VsZW1fdHlwZSgpOworICAgICAgICBzdHJpbmcgZGVzdHJ1Y3Rvcl9mdW5jdGlvbiA9ICJnX3B0cl9hcnJheV91bnJlZiI7CisKKyAgICAgICAgaWYgKGV0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKilldHlwZSktPmdldF9iYXNlKCk7CisgICAgICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IGRldGVybWluZSBhcnJheSB0eXBlIjsKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgICAgIGRlc3RydWN0b3JfZnVuY3Rpb24gPSAiZ19hcnJheV91bnJlZiI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGFycmF5IGluZm8gZm9yIHR5cGUiOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChldHlwZS0+aXNfZW51bSgpKSB7CisgICAgICAgICAgZGVzdHJ1Y3Rvcl9mdW5jdGlvbiA9ICJnX2FycmF5X3VucmVmIjsKKyAgICAgICAgfQorCisgICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgImlmICh0b2JqZWN0LT4iIDw8IG5hbWUgPDwgIiAhPSBOVUxMKSIgPDwgZW5kbDsKKyAgICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgZGVzdHJ1Y3Rvcl9mdW5jdGlvbiA8PCAiICh0b2JqZWN0LT4iIDw8IG5hbWUgPDwgIik7IiA8PCBlbmRsOworICAgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJ0b2JqZWN0LT4iIDw8IG5hbWUgPDwgIiA9IE5VTEw7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodC0+aXNfc3RydWN0KCkgfHwgdC0+aXNfeGNlcHRpb24oKSkgeworICAgICAgc3RyaW5nIG5hbWUgPSAoKm1faXRlciktPmdldF9uYW1lKCk7CisgICAgICAvLyBUT0RPOiBnX2NsZWFyX29iamVjdCBuZWVkcyBnbGliID49IDIuMjgKKyAgICAgIC8vIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgImdfY2xlYXJfb2JqZWN0ICgmKHRvYmplY3QtPiIgPDwgbmFtZSA8PCAiKSk7IiA8PCBlbmRsOworICAgICAgLy8gZG9lcyBnX29iamVjdF91bnJlZiB0aGUgdHJpY2s/CisgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJpZiAodG9iamVjdC0+IiA8PCBuYW1lIDw8ICIgIT0gTlVMTCkiIDw8IGVuZGw7CisgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJnX29iamVjdF91bnJlZih0b2JqZWN0LT4iIDw8IG5hbWUgPDwgIik7IiA8PCBlbmRsOworICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAidG9iamVjdC0+IiA8PCBuYW1lIDw8ICIgPSBOVUxMOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAodC0+aXNfc3RyaW5nKCkpIHsKKyAgICAgIHN0cmluZyBuYW1lID0gKCptX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiaWYgKHRvYmplY3QtPiIgPDwgbmFtZSA8PCAiICE9IE5VTEwpIiA8PCBlbmRsOworICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCBnZW5lcmF0ZV9mcmVlX2Z1bmNfZnJvbV90eXBlKHQpIDw8ICIodG9iamVjdC0+IiA8PCBuYW1lIDw8ICIpOyIKKyAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgInRvYmplY3QtPiIgPDwgbmFtZSA8PCAiID0gTlVMTDsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBmX3R5cGVzX2ltcGxfIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gZ2VuZXJhdGUgdGhlIGNsYXNzIGluaXQgZnVuY3Rpb24KKworICBmX3R5cGVzX2ltcGxfIDw8ICJzdGF0aWMgdm9pZCIgPDwgZW5kbCA8PCBjbGFzc19uYW1lX2xjIDw8ICJfY2xhc3NfaW5pdCAoIiA8PCBjbGFzc19uYW1lCisgICAgICAgICAgICAgICAgPDwgIkNsYXNzICogY2xzKSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl90eXBlc19pbXBsXyk7CisKKyAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGNscyk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIlRocmlmdFN0cnVjdENsYXNzICpzdHJ1Y3RfY2xhc3MgPSAiCisgICAgICAgICAgICAgICAgPDwgIlRIUklGVF9TVFJVQ1RfQ0xBU1MgKGNscyk7IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICA8PCAic3RydWN0X2NsYXNzLT5yZWFkID0gIiA8PCBjbGFzc19uYW1lX2xjIDw8ICJfcmVhZDsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICA8PCAic3RydWN0X2NsYXNzLT53cml0ZSA9ICIgPDwgY2xhc3NfbmFtZV9sYyA8PCAiX3dyaXRlOyIgPDwgZW5kbCA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gIiA8PCBjbGFzc19uYW1lX2xjIDw8ICJfZmluYWxpemU7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKKyAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSAiIDw8IGNsYXNzX25hbWVfbGMKKyAgICAgICAgICAgICAgICAgIDw8ICJfZ2V0X3Byb3BlcnR5OyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICAgPDwgImdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9ICIgPDwgY2xhc3NfbmFtZV9sYyA8PCAiX3NldF9wcm9wZXJ0eTsiIDw8IGVuZGw7CisKKyAgICAvLyBpbnN0YWxsIGEgcHJvcGVydHkgZm9yIGVhY2ggbWVtYmVyCisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgdF9maWVsZCogbWVtYmVyID0gKCptX2l0ZXIpOworICAgICAgc3RyaW5nIG1lbWJlcl9uYW1lID0gbWVtYmVyLT5nZXRfbmFtZSgpOworICAgICAgc3RyaW5nIG1lbWJlcl9uYW1lX3VjCisgICAgICAgICAgPSB0b191cHBlcl9jYXNlKHRvX2xvd2VyX2Nhc2UoaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKG1lbWJlcl9uYW1lKSkpOworICAgICAgdF90eXBlKiBtZW1iZXJfdHlwZSA9IGdldF90cnVlX3R5cGUobWVtYmVyLT5nZXRfdHlwZSgpKTsKKyAgICAgIHRfY29uc3RfdmFsdWUqIG1lbWJlcl92YWx1ZSA9IG1lbWJlci0+Z2V0X3ZhbHVlKCk7CisKKyAgICAgIHN0cmluZyBwcm9wZXJ0eV9pZGVudGlmaWVyID0gIlBST1BfIiArIGNsYXNzX25hbWVfdWMgKyAiXyIgKyBtZW1iZXJfbmFtZV91YzsKKworICAgICAgZl90eXBlc19pbXBsXyA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBhcmdzX2luZGVudCA9IGluZGVudCgpICsgJyAnOworICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiKGdvYmplY3RfY2xhc3MsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8IHByb3BlcnR5X2lkZW50aWZpZXIKKyAgICAgICAgICAgICAgICAgICAgPDwgIiwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQ7CisKKyAgICAgIGlmIChtZW1iZXJfdHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSBiYXNlX3R5cGUgPSAoKHRfYmFzZV90eXBlKiltZW1iZXJfdHlwZSktPmdldF9iYXNlKCk7CisKKyAgICAgICAgaWYgKGJhc2VfdHlwZSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkcpIHsKKyAgICAgICAgICBpZiAoKCh0X2Jhc2VfdHlwZSopbWVtYmVyX3R5cGUpLT5pc19iaW5hcnkoKSkgeworICAgICAgICAgICAgYXJnc19pbmRlbnQgKz0gc3RyaW5nKDIwLCAnICcpOworICAgICAgICAgICAgZl90eXBlc19pbXBsXyA8PCAiZ19wYXJhbV9zcGVjX2JveGVkIChcIiIgPDwgbWVtYmVyX25hbWUgPDwgIlwiLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiTlVMTCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIk5VTEwsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJHX1RZUEVfQllURV9BUlJBWSwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIkdfUEFSQU1fUkVBRFdSSVRFKSk7IgorICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhcmdzX2luZGVudCArPSBzdHJpbmcoMjEsICcgJyk7CisgICAgICAgICAgICBmX3R5cGVzX2ltcGxfIDw8ICJnX3BhcmFtX3NwZWNfc3RyaW5nIChcIiIgPDwgbWVtYmVyX25hbWUgPDwgIlwiLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBhcmdzX2luZGVudCA8PCAiTlVMTCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIk5VTEwsIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICgobWVtYmVyX3ZhbHVlICE9IE5VTEwpID8gIlwiIiArIG1lbWJlcl92YWx1ZS0+Z2V0X3N0cmluZygpICsgIlwiIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJOVUxMIikgPDwgIiwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIkdfUEFSQU1fUkVBRFdSSVRFKSk7IiA8PCBlbmRsOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChiYXNlX3R5cGUgPT0gdF9iYXNlX3R5cGU6OlRZUEVfQk9PTCkgeworICAgICAgICAgIGFyZ3NfaW5kZW50ICs9IHN0cmluZygyMiwgJyAnKTsKKyAgICAgICAgICBmX3R5cGVzX2ltcGxfIDw8ICJnX3BhcmFtX3NwZWNfYm9vbGVhbiAoXCIiIDw8IG1lbWJlcl9uYW1lIDw8ICJcIiwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJOVUxMLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiTlVMTCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICgoKG1lbWJlcl92YWx1ZSAhPSBOVUxMKSAmJiAobWVtYmVyX3ZhbHVlLT5nZXRfaW50ZWdlcigpICE9IDApKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICJUUlVFIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJGQUxTRSIpIDw8ICIsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJHX1BBUkFNX1JFQURXUklURSkpOyIKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIH0gZWxzZSBpZiAoKGJhc2VfdHlwZSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9JOCkgfHwgKGJhc2VfdHlwZSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTYpCisgICAgICAgICAgICAgICAgICAgfHwgKGJhc2VfdHlwZSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzIpIHx8IChiYXNlX3R5cGUgPT0gdF9iYXNlX3R5cGU6OlRZUEVfSTY0KQorICAgICAgICAgICAgICAgICAgIHx8IChiYXNlX3R5cGUgPT0gdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFKSkgeworICAgICAgICAgIHN0cmluZyBwYXJhbV9zcGVjX2Z1bmN0aW9uX25hbWUgPSAiZ19wYXJhbV9zcGVjX2ludCI7CisgICAgICAgICAgc3RyaW5nIG1pbl92YWx1ZTsKKyAgICAgICAgICBzdHJpbmcgbWF4X3ZhbHVlOworICAgICAgICAgIG9zdHJpbmdzdHJlYW0gZGVmYXVsdF92YWx1ZTsKKworICAgICAgICAgIHN3aXRjaCAoYmFzZV90eXBlKSB7CisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgICAgIG1pbl92YWx1ZSA9ICJHX01JTklOVDgiOworICAgICAgICAgICAgbWF4X3ZhbHVlID0gIkdfTUFYSU5UOCI7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICAgICAgbWluX3ZhbHVlID0gIkdfTUlOSU5UMTYiOworICAgICAgICAgICAgbWF4X3ZhbHVlID0gIkdfTUFYSU5UMTYiOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgICAgIG1pbl92YWx1ZSA9ICJHX01JTklOVDMyIjsKKyAgICAgICAgICAgIG1heF92YWx1ZSA9ICJHX01BWElOVDMyIjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgICAgICBwYXJhbV9zcGVjX2Z1bmN0aW9uX25hbWUgPSAiZ19wYXJhbV9zcGVjX2ludDY0IjsKKyAgICAgICAgICAgIG1pbl92YWx1ZSA9ICJHX01JTklOVDY0IjsKKyAgICAgICAgICAgIG1heF92YWx1ZSA9ICJHX01BWElOVDY0IjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgICAgICBwYXJhbV9zcGVjX2Z1bmN0aW9uX25hbWUgPSAiZ19wYXJhbV9zcGVjX2RvdWJsZSI7CisgICAgICAgICAgICBtaW5fdmFsdWUgPSAiLUlORklOSVRZIjsKKyAgICAgICAgICAgIG1heF92YWx1ZSA9ICJJTkZJTklUWSI7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6ICIKKyAgICAgICAgICAgICAgICAgICJ1bnJlY29nbml6ZWQgYmFzZSB0eXBlIFwiIiArIG1lbWJlcl90eXBlLT5nZXRfbmFtZSgpICsgIlwiICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvciBzdHJ1Y3QgbWVtYmVyIFwiIgorICAgICAgICAgICAgICAgICsgbWVtYmVyX25hbWUgKyAiXCIiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKG1lbWJlcl92YWx1ZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBkZWZhdWx0X3ZhbHVlIDw8IChiYXNlX3R5cGUgPT0gdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFID8gbWVtYmVyX3ZhbHVlLT5nZXRfZG91YmxlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtZW1iZXJfdmFsdWUtPmdldF9pbnRlZ2VyKCkpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkZWZhdWx0X3ZhbHVlIDw8ICIwIjsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBhcmdzX2luZGVudCArPSBzdHJpbmcocGFyYW1fc3BlY19mdW5jdGlvbl9uYW1lLmxlbmd0aCgpICsgMiwgJyAnKTsKKyAgICAgICAgICBmX3R5cGVzX2ltcGxfIDw8IHBhcmFtX3NwZWNfZnVuY3Rpb25fbmFtZSA8PCAiIChcIiIgPDwgbWVtYmVyX25hbWUgPDwgIlwiLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgICAgPDwgYXJnc19pbmRlbnQgPDwgIk5VTEwsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJOVUxMLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgICAgPDwgYXJnc19pbmRlbnQgPDwgbWluX3ZhbHVlIDw8ICIsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8IG1heF92YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgZGVmYXVsdF92YWx1ZS5zdHIoKSA8PCAiLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgICAgPDwgYXJnc19pbmRlbnQgPDwgIkdfUEFSQU1fUkVBRFdSSVRFKSk7IiA8PCBlbmRsOworICAgICAgICB9CisKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIH0gZWxzZSBpZiAobWVtYmVyX3R5cGUtPmlzX2VudW0oKSkgeworICAgICAgICB0X2VudW1fdmFsdWUqIGVudW1fbWluX3ZhbHVlID0gKCh0X2VudW0qKW1lbWJlcl90eXBlKS0+Z2V0X21pbl92YWx1ZSgpOworICAgICAgICB0X2VudW1fdmFsdWUqIGVudW1fbWF4X3ZhbHVlID0gKCh0X2VudW0qKW1lbWJlcl90eXBlKS0+Z2V0X21heF92YWx1ZSgpOworICAgICAgICBpbnQgbWluX3ZhbHVlID0gKGVudW1fbWluX3ZhbHVlICE9IE5VTEwpID8gZW51bV9taW5fdmFsdWUtPmdldF92YWx1ZSgpIDogMDsKKyAgICAgICAgaW50IG1heF92YWx1ZSA9IChlbnVtX21heF92YWx1ZSAhPSBOVUxMKSA/IGVudW1fbWF4X3ZhbHVlLT5nZXRfdmFsdWUoKSA6IDA7CisKKyAgICAgICAgYXJnc19pbmRlbnQgKz0gc3RyaW5nKDE4LCAnICcpOworICAgICAgICBmX3R5cGVzX2ltcGxfIDw8ICJnX3BhcmFtX3NwZWNfaW50IChcIiIgPDwgbWVtYmVyX25hbWUgPDwgIlwiLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgICAgICAgICAgIDw8ICJOVUxMLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiTlVMTCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKKyAgICAgICAgICAgICAgICAgICAgICA8PCBtaW5fdmFsdWUgPDwgIiwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgbWF4X3ZhbHVlIDw8ICIsIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICAgPDwgYXJnc19pbmRlbnQgPDwgbWluX3ZhbHVlIDw8ICIsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgICAgICAgICAgPDwgIkdfUEFSQU1fUkVBRFdSSVRFKSk7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgfSBlbHNlIGlmIChtZW1iZXJfdHlwZS0+aXNfc3RydWN0KCkgfHwgbWVtYmVyX3R5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICAgICAgdF9wcm9ncmFtKiB0eXBlX3Byb2dyYW0gPSBtZW1iZXJfdHlwZS0+Z2V0X3Byb2dyYW0oKTsKKyAgICAgICAgc3RyaW5nIHR5cGVfbnNwYWNlID0gdHlwZV9wcm9ncmFtID8gdHlwZV9wcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJjX2dsaWIiKSA6ICIiOworICAgICAgICBzdHJpbmcgdHlwZV9uc3BhY2VfcHJlZml4ID0KKyAgICAgICAgICB0eXBlX25zcGFjZS5lbXB0eSgpID8gIiIgOiBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXModHlwZV9uc3BhY2UpICsgIl8iOworCisgICAgICAgIHN0cmluZyBwYXJhbV90eXBlID0gdG9fdXBwZXJfY2FzZSh0eXBlX25zcGFjZV9wcmVmaXgpICsgIlRZUEVfIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdG9fdXBwZXJfY2FzZShpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMobWVtYmVyX3R5cGUtPmdldF9uYW1lKCkpKTsKKworICAgICAgICBhcmdzX2luZGVudCArPSBzdHJpbmcoMjAsICcgJyk7CisgICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgImdfcGFyYW1fc3BlY19vYmplY3QgKFwiIiA8PCBtZW1iZXJfbmFtZSA8PCAiXCIsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgICAgICAgICAgPDwgIk5VTEwsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJOVUxMLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgICAgICAgICAgIDw8IHBhcmFtX3R5cGUgPDwgIiwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIkdfUEFSQU1fUkVBRFdSSVRFKSk7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgfSBlbHNlIGlmIChtZW1iZXJfdHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICAgIHRfdHlwZSogZWxlbV90eXBlID0gKCh0X2xpc3QqKW1lbWJlcl90eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgICAgICBzdHJpbmcgcGFyYW1fdHlwZTsKKworICAgICAgICBpZiAoZWxlbV90eXBlLT5pc19iYXNlX3R5cGUoKSAmJiAhZWxlbV90eXBlLT5pc19zdHJpbmcoKSkgeworICAgICAgICAgIHBhcmFtX3R5cGUgPSAiR19UWVBFX0FSUkFZIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBwYXJhbV90eXBlID0gIkdfVFlQRV9QVFJfQVJSQVkiOworICAgICAgICB9CisKKyAgICAgICAgYXJnc19pbmRlbnQgKz0gc3RyaW5nKDIwLCAnICcpOworICAgICAgICBmX3R5cGVzX2ltcGxfIDw8ICJnX3BhcmFtX3NwZWNfYm94ZWQgKFwiIiA8PCBtZW1iZXJfbmFtZSA8PCAiXCIsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgICAgICAgICAgPDwgIk5VTEwsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJOVUxMLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgICAgICAgICAgIDw8IHBhcmFtX3R5cGUgPDwgIiwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIkdfUEFSQU1fUkVBRFdSSVRFKSk7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgfSBlbHNlIGlmIChtZW1iZXJfdHlwZS0+aXNfc2V0KCkgfHwgbWVtYmVyX3R5cGUtPmlzX21hcCgpKSB7CisgICAgICAgIGFyZ3NfaW5kZW50ICs9IHN0cmluZygyMCwgJyAnKTsKKyAgICAgICAgZl90eXBlc19pbXBsXyA8PCAiZ19wYXJhbV9zcGVjX2JveGVkIChcIiIgPDwgbWVtYmVyX25hbWUgPDwgIlwiLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgICAgICAgICAgIDw8ICJOVUxMLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiTlVMTCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKKyAgICAgICAgICAgICAgICAgICAgICA8PCAiR19UWVBFX0hBU0hfVEFCTEUsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJHX1BBUkFNX1JFQURXUklURSkpOyIKKyAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgfQorICAgIH0KKyAgfQorICBzY29wZV9kb3duKGZfdHlwZXNfaW1wbF8pOworICBmX3R5cGVzX2ltcGxfIDw8IGVuZGw7CisKKyAgZl90eXBlc19pbXBsXyA8PCAiR1R5cGUiIDw8IGVuZGwgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IG5hbWVfdSA8PCAiX2dldF90eXBlICh2b2lkKSIgPDwgZW5kbCA8PCAieyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsIDw8ICIgIHN0YXRpYyBHVHlwZSB0eXBlID0gMDsiIDw8IGVuZGwgPDwgZW5kbCA8PCAiICBpZiAodHlwZSA9PSAwKSAiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCAiICB7IiA8PCBlbmRsIDw8ICIgICAgc3RhdGljIGNvbnN0IEdUeXBlSW5mbyB0eXBlX2luZm8gPSAiIDw8IGVuZGwgPDwgIiAgICB7IgorICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgIiAgICAgIHNpemVvZiAoIiA8PCB0aGlzLT5uc3BhY2UgPDwgbmFtZSA8PCAiQ2xhc3MpLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8ICIgICAgICBOVUxMLCAvKiBiYXNlX2luaXQgKi8iIDw8IGVuZGwgPDwgIiAgICAgIE5VTEwsIC8qIGJhc2VfZmluYWxpemUgKi8iCisgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCAiICAgICAgKEdDbGFzc0luaXRGdW5jKSAiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX3UgPDwgIl9jbGFzc19pbml0LCIKKyAgICAgICAgICAgICAgICA8PCBlbmRsIDw8ICIgICAgICBOVUxMLCAvKiBjbGFzc19maW5hbGl6ZSAqLyIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8ICIgICAgICBOVUxMLCAvKiBjbGFzc19kYXRhICovIiA8PCBlbmRsIDw8ICIgICAgICBzaXplb2YgKCIgPDwgdGhpcy0+bnNwYWNlCisgICAgICAgICAgICAgICAgPDwgbmFtZSA8PCAiKSwiIDw8IGVuZGwgPDwgIiAgICAgIDAsIC8qIG5fcHJlYWxsb2NzICovIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgIiAgICAgIChHSW5zdGFuY2VJbml0RnVuYykgIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgbmFtZV91IDw8ICJfaW5zdGFuY2VfaW5pdCwiCisgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCAiICAgICAgTlVMTCwgLyogdmFsdWVfdGFibGUgKi8iIDw8IGVuZGwgPDwgIiAgICB9OyIgPDwgZW5kbCA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgIiAgICB0eXBlID0gZ190eXBlX3JlZ2lzdGVyX3N0YXRpYyAoVEhSSUZUX1RZUEVfU1RSVUNULCAiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiIgPDwgdGhpcy0+bnNwYWNlIDw8IG5hbWUgPDwgIlR5cGVcIiwiCisgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHlwZV9pbmZvLCAwKTsiIDw8IGVuZGwgPDwgIiAgfSIKKyAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGVuZGwgPDwgIiAgcmV0dXJuIHR5cGU7IiA8PCBlbmRsIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGZ1bmN0aW9ucyB0byB3cml0ZSBUaHJpZnQgc3RydWN0dXJlcyB0byBhIHN0cmVhbS4KKyAqLwordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdF93cml0ZXIob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdGhpc19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHRoaXNfZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19mdW5jdGlvbikgeworICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgIHN0cmluZyBuYW1lX3UgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMobmFtZSk7CisgIHN0cmluZyBuYW1lX3VjID0gdG9fdXBwZXJfY2FzZShuYW1lX3UpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgaW50IGVycm9yX3JldCA9IDA7CisKKyAgaWYgKGlzX2Z1bmN0aW9uKSB7CisgICAgZXJyb3JfcmV0ID0gLTE7CisgICAgaW5kZW50KG91dCkgPDwgInN0YXRpYyBnaW50MzIiIDw8IGVuZGwgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IG5hbWVfdQorICAgICAgICAgICAgICAgIDw8ICJfd3JpdGUgKFRocmlmdFN0cnVjdCAqb2JqZWN0LCBUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKSIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICB9CisgIGluZGVudChvdXQpIDw8ICJ7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgImdpbnQzMiByZXQ7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJnaW50MzIgeGZlciA9IDA7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgdGhpc19nZXQgPDwgZW5kbDsKKyAgLy8gc2F0aXNmeSAtV2FsbCBpbiB0aGUgY2FzZSBvZiBhbiBlbXB0eSBzdHJ1Y3QKKyAgaWYgKCF0aGlzX2dldC5lbXB0eSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIlRIUklGVF9VTlVTRURfVkFSICh0aGlzX29iamVjdCk7IiA8PCBlbmRsOworICB9CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9zdHJ1Y3RfYmVnaW4gKHByb3RvY29sLCBcIiIgPDwgbmFtZQorICAgICAgPDwgIlwiLCBlcnJvcikpIDwgMCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAodGhpc19vYmplY3QtPl9faXNzZXRfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9PSBUUlVFKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICIKKyAgICAgICAgPDwgIlwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiLCAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIsICIKKyAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIiwgZXJyb3IpKSA8IDApIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IGVycm9yX3JldAorICAgICAgICA8PCAiOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsOworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsIHRoaXNfbmFtZSwgIiIsIGVycm9yX3JldCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQgKHByb3RvY29sLCBlcnJvcikpIDwgMCkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiCisgICAgICAgIDw8IGVuZGw7CisKKyAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTCkgeworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIC8vIHdyaXRlIHRoZSBzdHJ1Y3QgbWFwCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfZmllbGRfc3RvcCAocHJvdG9jb2wsIGVycm9yKSkgPCAwKSIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9zdHJ1Y3RfZW5kIChwcm90b2NvbCwgZXJyb3IpKSA8IDApIiA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbAorICAgICAgPDwgZW5kbDsKKworICBpZiAoaXNfZnVuY3Rpb24pIHsKKyAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHhmZXI7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgY29kZSB0byByZWFkIFRocmlmdCBzdHJ1Y3R1cmVzIGZyb20gYSBzdHJlYW0uCisgKi8KK3ZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3RfcmVhZGVyKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHRoaXNfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB0aGlzX2dldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZnVuY3Rpb24pIHsKKyAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworICBzdHJpbmcgbmFtZV91ID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKG5hbWUpOworICBzdHJpbmcgbmFtZV91YyA9IHRvX3VwcGVyX2Nhc2UobmFtZV91KTsKKyAgaW50IGVycm9yX3JldCA9IDA7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBpZiAoaXNfZnVuY3Rpb24pIHsKKyAgICBlcnJvcl9yZXQgPSAtMTsKKyAgICBpbmRlbnQob3V0KSA8PCAiLyogcmVhZHMgYSAiIDw8IG5hbWVfdSA8PCAiIG9iamVjdCAqLyIgPDwgZW5kbCA8PCAic3RhdGljIGdpbnQzMiIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX3UKKyAgICAgICAgICAgICAgICA8PCAiX3JlYWQgKFRocmlmdFN0cnVjdCAqb2JqZWN0LCBUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKSIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudChvdXQpIDw8ICJ7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICAvLyBkZWNsYXJlIHN0YWNrIHRlbXAgdmFyaWFibGVzCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiZ2ludDMyIHJldDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImdpbnQzMiB4ZmVyID0gMDsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJnY2hhciAqbmFtZSA9IE5VTEw7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJUaHJpZnRUeXBlIGZ0eXBlOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgImdpbnQxNiBmaWQ7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJndWludDMyIGxlbiA9IDA7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiZ3BvaW50ZXIgZGF0YSA9IE5VTEw7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IHRoaXNfZ2V0IDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgaW5kZW50KG91dCkgPDwgImdib29sZWFuIGlzc2V0XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSBGQUxTRTsiIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgb3V0IDw8IGVuZGw7CisKKyAgLy8gc2F0aXNmeSAtV2FsbCBpbiBjYXNlIHdlIGRvbid0IHVzZSBzb21lIHZhcmlhYmxlcworICBvdXQgPDwgaW5kZW50KCkgPDwgIi8qIHNhdGlzZnkgLVdhbGwgaW4gY2FzZSB0aGVzZSBhcmVuJ3QgdXNlZCAqLyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIlRIUklGVF9VTlVTRURfVkFSIChsZW4pOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiVEhSSUZUX1VOVVNFRF9WQVIgKGRhdGEpOyIgPDwgZW5kbDsKKworICBpZiAoIXRoaXNfZ2V0LmVtcHR5KCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIlRIUklGVF9VTlVTRURfVkFSICh0aGlzX29iamVjdCk7IiA8PCBlbmRsOworICB9CisgIG91dCA8PCBlbmRsOworCisgIC8vIHJlYWQgdGhlIGJlZ2lubmluZyBvZiB0aGUgc3RydWN0dXJlIG1hcmtlcgorICBvdXQgPDwgaW5kZW50KCkgPDwgIi8qIHJlYWQgdGhlIHN0cnVjdCBiZWdpbiBtYXJrZXIgKi8iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX3N0cnVjdF9iZWdpbiAocHJvdG9jb2wsICZuYW1lLCBlcnJvcikpIDwgMCkiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIGlmIChuYW1lKSBnX2ZyZWUgKG5hbWUpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIiAgcmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpZiAobmFtZSkgZ19mcmVlIChuYW1lKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJuYW1lID0gTlVMTDsiIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyByZWFkIHRoZSBzdHJ1Y3QgZmllbGRzCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiLyogcmVhZCB0aGUgc3RydWN0IGZpZWxkcyAqLyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAid2hpbGUgKDEpIiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworCisgIC8vIHJlYWQgYmVnaW5uaW5nIGZpZWxkIG1hcmtlcgorICBvdXQgPDwgaW5kZW50KCkgPDwgIi8qIHJlYWQgdGhlIGJlZ2lubmluZyBvZiBhIGZpZWxkICovIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZuYW1lLCAmZnR5cGUsICZmaWQsIGVycm9yKSkgPCAwKSIKKyAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgaWYgKG5hbWUpIGdfZnJlZSAobmFtZSk7IiA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlmIChuYW1lKSBnX2ZyZWUgKG5hbWUpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIm5hbWUgPSBOVUxMOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIGNoZWNrIGZvciBmaWVsZCBTVE9QIG1hcmtlcgorICBvdXQgPDwgaW5kZW50KCkgPDwgIi8qIGJyZWFrIGlmIHdlIGdldCBhIFNUT1AgZmllbGQgKi8iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJpZiAoZnR5cGUgPT0gVF9TVE9QKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBicmVhazsiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gc3dpdGNoIGRlcGVuZGluZyBvbiB0aGUgZmllbGQgdHlwZQorICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChmaWQpIiA8PCBlbmRsOworCisgIC8vIHN0YXJ0IHN3aXRjaAorICBzY29wZV91cChvdXQpOworCisgIC8vIGdlbmVyYXRlIGRlc2VyaWFsaXphdGlvbiBjb2RlIGZvciBrbm93biB0eXBlcworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjoiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgImlmIChmdHlwZSA9PSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIpIiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJ7IiA8PCBlbmRsOworCisgICAgaW5kZW50X3VwKCk7CisgICAgLy8gZ2VuZXJhdGUgZGVzZXJpYWxpemUgZmllbGQKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsIHRoaXNfbmFtZSwgIiIsIGVycm9yX3JldCwgZmFsc2UpOworICAgIGluZGVudF9kb3duKCk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICIgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3NraXAgKHByb3RvY29sLCBmdHlwZSwgZXJyb3IpKSA8IDApIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICIgICAgcmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHhmZXIgKz0gcmV0OyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICAvLyBjcmVhdGUgdGhlIGRlZmF1bHQgY2FzZQorICBvdXQgPDwgaW5kZW50KCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9za2lwIChwcm90b2NvbCwgZnR5cGUsIGVycm9yKSkgPCAwKSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIiAgICByZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgeGZlciArPSByZXQ7IiA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAiICBicmVhazsiIDw8IGVuZGw7CisKKyAgLy8gZW5kIHN3aXRjaAorICBzY29wZV9kb3duKG91dCk7CisKKyAgLy8gcmVhZCBmaWVsZCBlbmQgbWFya2VyCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9maWVsZF9lbmQgKHByb3RvY29sLCBlcnJvcikpIDwgMCkiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsOworCisgIC8vIGVuZCB3aGlsZSBsb29wCisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgb3V0IDw8IGVuZGw7CisKKyAgLy8gcmVhZCB0aGUgZW5kIG9mIHRoZSBzdHJ1Y3R1cmUKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX3N0cnVjdF9lbmQgKHByb3RvY29sLCBlcnJvcikpIDwgMCkiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsCisgICAgICA8PCBlbmRsOworCisgIC8vIGlmIGEgcmVxdWlyZWQgZmllbGQgaXMgbWlzc2luZywgdGhyb3cgYW4gZXJyb3IKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIWlzc2V0XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ7IgorICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfUFJPVE9DT0xfRVJST1IsIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIiAgICAgICAgICAgICAgIFRIUklGVF9QUk9UT0NPTF9FUlJPUl9JTlZBTElEX0RBVEEsIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIiAgICAgICAgICAgICAgIFwibWlzc2luZyBmaWVsZFwiKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIC0xOyIgPDwgZW5kbAorICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgaWYgKGlzX2Z1bmN0aW9uKSB7CisgICAgaW5kZW50KG91dCkgPDwgInJldHVybiB4ZmVyOyIgPDwgZW5kbDsKKyAgfQorCisgIC8vIGVuZCB0aGUgZnVuY3Rpb24vc3RydWN0dXJlCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBzdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJvcl9yZXQpIHsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSArIHN1ZmZpeDsKKworICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgbmFtZTsKKyAgfQorCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbmFtZSwgZXJyb3JfcmV0KTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lLCBlcnJvcl9yZXQpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV8iOworCisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIG91dCA8PCAiYm9vbCAocHJvdG9jb2wsICIgPDwgbmFtZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICBvdXQgPDwgImJ5dGUgKHByb3RvY29sLCAiIDw8IG5hbWU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgIG91dCA8PCAiaTE2IChwcm90b2NvbCwgIiA8PCBuYW1lOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBvdXQgPDwgImkzMiAocHJvdG9jb2wsICIgPDwgbmFtZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgb3V0IDw8ICJpNjQgKHByb3RvY29sLCAiIDw8IG5hbWU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIG91dCA8PCAiZG91YmxlIChwcm90b2NvbCwgIiA8PCBuYW1lOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgICBvdXQgPDwgImJpbmFyeSAocHJvdG9jb2wsICIgPDwgbmFtZSA8PCAiID8gKChHQnl0ZUFycmF5ICopICIgPDwgbmFtZSA8PCAiKS0+ZGF0YSA6IE5VTEwsICIKKyAgICAgICAgICAgICAgPDwgbmFtZSA8PCAiID8gKChHQnl0ZUFycmF5ICopICIgPDwgbmFtZSA8PCAiKS0+bGVuIDogMCI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgb3V0IDw8ICJzdHJpbmcgKHByb3RvY29sLCAiIDw8IG5hbWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEMgd3JpdGVyIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSkgKyBuYW1lOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgImkzMiAocHJvdG9jb2wsIChnaW50MzIpICIgPDwgbmFtZTsKKyAgICB9CisgICAgb3V0IDw8ICIsIGVycm9yKSkgPCAwKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbCA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHRocm93IHN0ZDo6bG9naWNfZXJyb3IoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgRklFTEQgJyIgKyBuYW1lICsgIicgVFlQRSAnIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0eXBlX25hbWUodHlwZSkpOworICB9Cit9CisKK3ZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJvcl9yZXQpIHsKKyAgKHZvaWQpdHN0cnVjdDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9zdHJ1Y3Rfd3JpdGUgKFRIUklGVF9TVFJVQ1QgKCIgPDwgcHJlZml4CisgICAgICA8PCAiKSwgcHJvdG9jb2wsIGVycm9yKSkgPCAwKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3JfcmV0KSB7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHRfdHlwZSogdGtleSA9ICgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgdF90eXBlKiB0dmFsID0gKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICBzdHJpbmcgdGtleV9uYW1lID0gdHlwZV9uYW1lKHRrZXkpOworICAgIHN0cmluZyB0dmFsX25hbWUgPSB0eXBlX25hbWUodHZhbCk7CisgICAgc3RyaW5nIHRrZXlfcHRyOworICAgIHN0cmluZyB0dmFsX3B0cjsKKyAgICBzdHJpbmcga2V5bmFtZSA9IHRtcCgia2V5Iik7CisgICAgc3RyaW5nIHZhbG5hbWUgPSB0bXAoInZhbCIpOworCisgICAgZGVjbG9yZV9sb2NhbF92YXJpYWJsZV9mb3Jfd3JpdGUob3V0LCB0a2V5LCBrZXluYW1lKTsKKyAgICBkZWNsb3JlX2xvY2FsX3ZhcmlhYmxlX2Zvcl93cml0ZShvdXQsIHR2YWwsIHZhbG5hbWUpOworCisgICAgLyogSWYgZWl0aGVyIHRoZSBrZXkgb3IgdmFsdWUgdHlwZSBpcyBhIHR5cGVkZWYsIGZpbmQgaXRzIHVuZGVybHlpbmcgdHlwZSBzbworICAgICAgIHdlIGNhbiBjb3JyZWN0bHkgZGV0ZXJtaW5lIGhvdyB0byBnZW5lcmF0ZSBhIHBvaW50ZXIgdG8gaXQgKi8KKyAgICB0a2V5ID0gZ2V0X3RydWVfdHlwZSh0a2V5KTsKKyAgICB0dmFsID0gZ2V0X3RydWVfdHlwZSh0dmFsKTsKKworICAgIHRrZXlfcHRyID0gdGtleS0+aXNfc3RyaW5nKCkgfHwgIXRrZXktPmlzX2Jhc2VfdHlwZSgpID8gIiIgOiAiKiI7CisgICAgdHZhbF9wdHIgPSB0dmFsLT5pc19zdHJpbmcoKSB8fCAhdHZhbC0+aXNfYmFzZV90eXBlKCkgPyAiIiA6ICIqIjsKKworICAgIC8qCisgICAgICogU29tZSB1Z2xpbmVzcyBoZXJlLiAgVG8gbWF4aW1pemUgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIHdlCisgICAgICogYXZvaWQgdXNpbmcgR0hhc2hUYWJsZUl0ZXIgYW5kIGluc3RlYWQgZ2V0IGEgR0xpc3Qgb2YgYWxsIGtleXMsCisgICAgICogdGhlbiBjb3B5IGl0IGludG8gYSBhcnJheSBvbiB0aGUgc3RhY2ssIGFuZCBmcmVlIGl0LgorICAgICAqIFRoaXMgaXMgYmVjYXVzZSB3ZSBtYXkgZXhpdCBlYXJseSBiZWZvcmUgd2UgZ2V0IGEgY2hhbmNlIHRvIGZyZWUgdGhlCisgICAgICogR0xpc3QuCisgICAgICovCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJHTGlzdCAqa2V5X2xpc3QgPSBOVUxMLCAqaXRlciA9IE5VTEw7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8IHRrZXlfbmFtZSA8PCB0a2V5X3B0ciA8PCAiKiBrZXlzOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaW50IGkgPSAwLCBrZXlfY291bnQ7IiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX21hcF9iZWdpbiAocHJvdG9jb2wsICIKKyAgICAgICAgPDwgdHlwZV90b19lbnVtKHRrZXkpIDw8ICIsICIgPDwgdHlwZV90b19lbnVtKHR2YWwpIDw8ICIsICIgPDwgcHJlZml4IDw8ICIgPyAiCisgICAgICAgIDw8ICIoZ2ludDMyKSBnX2hhc2hfdGFibGVfc2l6ZSAoKEdIYXNoVGFibGUgKikgIiA8PCBwcmVmaXggPDwgIikgOiAwIgorICAgICAgICA8PCAiLCBlcnJvcikpIDwgMCkiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKCIgPDwgcHJlZml4IDw8ICIpIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIGdfaGFzaF90YWJsZV9mb3JlYWNoICgoR0hhc2hUYWJsZSAqKSAiIDw8IHByZWZpeAorICAgICAgICA8PCAiLCB0aHJpZnRfaGFzaF90YWJsZV9nZXRfa2V5cywgJmtleV9saXN0KTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImtleV9jb3VudCA9IGdfbGlzdF9sZW5ndGggKGtleV9saXN0KTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImtleXMgPSBnX25ld2EgKCIgPDwgdGtleV9uYW1lIDw8IHRrZXlfcHRyCisgICAgICAgIDw8ICIsIGtleV9jb3VudCk7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJmb3IgKGl0ZXIgPSBnX2xpc3RfZmlyc3QgKGtleV9saXN0KTsgaXRlcjsgIgorICAgICAgICAgICAiaXRlciA9IGl0ZXItPm5leHQpIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAia2V5c1tpKytdID0gKCIgPDwgdGtleV9uYW1lIDw8IHRrZXlfcHRyCisgICAgICAgIDw8ICIpIGl0ZXItPmRhdGE7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJnX2xpc3RfZnJlZSAoa2V5X2xpc3QpOyIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJmb3IgKGkgPSAwOyBpIDwga2V5X2NvdW50OyArK2kpIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8IGtleW5hbWUgPDwgIiA9IGtleXNbaV07IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8IHZhbG5hbWUgPDwgIiA9ICgiIDw8IHR2YWxfbmFtZSA8PCB0dmFsX3B0cgorICAgICAgICA8PCAiKSBnX2hhc2hfdGFibGVfbG9va3VwICgoKEdIYXNoVGFibGUgKikgIiA8PCBwcmVmaXgKKyAgICAgICAgPDwgIiksIChncG9pbnRlcikgIiA8PCBrZXluYW1lIDw8ICIpOyIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsOworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0X21hcCopdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRrZXlfcHRyICsgIiAiICsga2V5bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHZhbF9wdHIgKyAiICIgKyB2YWxuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9yZXQpOworICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX21hcF9lbmQgKHByb3RvY29sLCAiCisgICAgICAgICAgICJlcnJvcikpIDwgMCkiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3R5cGUqIHRlbGVtID0gKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgc3RyaW5nIHRlbGVtX25hbWUgPSB0eXBlX25hbWUodGVsZW0pOworICAgIHN0cmluZyB0ZWxlbV9wdHIgPSB0ZWxlbS0+aXNfc3RyaW5nKCkgfHwgIXRlbGVtLT5pc19iYXNlX3R5cGUoKSA/ICIiIDogIioiOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiR0xpc3QgKmtleV9saXN0ID0gTlVMTCwgKml0ZXIgPSBOVUxMOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCB0ZWxlbV9uYW1lIDw8IHRlbGVtX3B0ciA8PCAiKiBrZXlzOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaW50IGkgPSAwLCBrZXlfY291bnQ7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8IHRlbGVtX25hbWUgPDwgdGVsZW1fcHRyIDw8ICIgZWxlbTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImdwb2ludGVyIHZhbHVlOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiVEhSSUZUX1VOVVNFRF9WQVIgKHZhbHVlKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfc2V0X2JlZ2luIChwcm90b2NvbCwgIgorICAgICAgICA8PCB0eXBlX3RvX2VudW0odGVsZW0pIDw8ICIsICIgPDwgcHJlZml4IDw8ICIgPyAiCisgICAgICAgIDw8ICIoZ2ludDMyKSBnX2hhc2hfdGFibGVfc2l6ZSAoKEdIYXNoVGFibGUgKikgIiA8PCBwcmVmaXggPDwgIikgOiAwIgorICAgICAgICA8PCAiLCBlcnJvcikpIDwgMCkiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKCIgPDwgcHJlZml4IDw8ICIpIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIGdfaGFzaF90YWJsZV9mb3JlYWNoICgoR0hhc2hUYWJsZSAqKSAiIDw8IHByZWZpeAorICAgICAgICA8PCAiLCB0aHJpZnRfaGFzaF90YWJsZV9nZXRfa2V5cywgJmtleV9saXN0KTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImtleV9jb3VudCA9IGdfbGlzdF9sZW5ndGggKGtleV9saXN0KTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImtleXMgPSBnX25ld2EgKCIgPDwgdGVsZW1fbmFtZSA8PCB0ZWxlbV9wdHIKKyAgICAgICAgPDwgIiwga2V5X2NvdW50KTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImZvciAoaXRlciA9IGdfbGlzdF9maXJzdCAoa2V5X2xpc3QpOyBpdGVyOyAiCisgICAgICAgICAgICJpdGVyID0gaXRlci0+bmV4dCkiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJrZXlzW2krK10gPSAoIiA8PCB0ZWxlbV9uYW1lIDw8IHRlbGVtX3B0cgorICAgICAgICA8PCAiKSBpdGVyLT5kYXRhOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZ19saXN0X2ZyZWUgKGtleV9saXN0KTsiIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZm9yIChpID0gMDsgaSA8IGtleV9jb3VudDsgKytpKSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChvdXQpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZWxlbSA9IGtleXNbaV07IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ2YWx1ZSA9IChncG9pbnRlcikgZ19oYXNoX3RhYmxlX2xvb2t1cCAiCisgICAgICAgICAgICIoKChHSGFzaFRhYmxlICopICIgPDwgcHJlZml4IDw8ICIpLCAoZ3BvaW50ZXIpIGVsZW0pOyIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsOworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0X3NldCopdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbGVtX3B0ciArICJlbGVtIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfcmV0KTsKKyAgICBzY29wZV9kb3duKG91dCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9zZXRfZW5kIChwcm90b2NvbCwgIgorICAgICAgICAgICAiZXJyb3IpKSA8IDApIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHN0cmluZyBsZW5ndGggPSAiKCIgKyBwcmVmaXggKyAiID8gIiArIHByZWZpeCArICItPmxlbiA6IDApIjsKKyAgICBzdHJpbmcgaSA9IHRtcCgiaSIpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZ3VpbnQgIiA8PCBpIDw8ICI7IiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2xpc3RfYmVnaW4gKHByb3RvY29sLCAiCisgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsIChnaW50MzIpICIKKyAgICAgICAgPDwgbGVuZ3RoIDw8ICIsIGVycm9yKSkgPCAwKSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJmb3IgKCIgPDwgaSA8PCAiID0gMDsgIiA8PCBpIDw8ICIgPCAiIDw8IGxlbmd0aCA8PCAiOyAiCisgICAgICAgIDw8IGkgPDwgIisrKSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChvdXQpOworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgcHJlZml4LCBpLCBlcnJvcl9yZXQpOworICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2xpc3RfZW5kIChwcm90b2NvbCwgIgorICAgICAgICAgICAiZXJyb3IpKSA8IDApIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGw7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7Cit9CisKK3ZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3JfcmV0KSB7CisgIHRfZmllbGQga2ZpZWxkKHRtYXAtPmdldF9rZXlfdHlwZSgpLCBrZXkpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAma2ZpZWxkLCAiIiwgIiIsIGVycm9yX3JldCk7CisKKyAgdF9maWVsZCB2ZmllbGQodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZhbHVlKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJnZmaWVsZCwgIiIsICIiLCBlcnJvcl9yZXQpOworfQorCit2b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBlbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3JfcmV0KSB7CisgIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbWVudCk7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiLCAiIiwgZXJyb3JfcmV0KTsKK30KKwordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yX3JldCkgeworICB0X3R5cGUqIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpKTsKKworICAvLyBjYXN0IHRvIG5vbi1jb25zdAorICBzdHJpbmcgY2FzdCA9ICIiOworICBzdHJpbmcgbmFtZSA9ICJnX3B0cl9hcnJheV9pbmRleCAoKEdQdHJBcnJheSAqKSAiICsgbGlzdCArICIsICIgKyBpbmRleCArICIpIjsKKworICBpZiAodHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcigiY29tcGlsZXIgZXJyb3I6IGxpc3QgZWxlbWVudCB0eXBlIGNhbm5vdCBiZSB2b2lkIik7CisgIH0gZWxzZSBpZiAoaXNfbnVtZXJpYyh0dHlwZSkpIHsKKyAgICBuYW1lID0gImdfYXJyYXlfaW5kZXggKCIgKyBsaXN0ICsgIiwgIiArIGJhc2VfdHlwZV9uYW1lKHR0eXBlKSArICIsICIgKyBpbmRleCArICIpIjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc3RyaW5nKCkpIHsKKyAgICBjYXN0ID0gIihnY2hhciopIjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkgfHwgdHR5cGUtPmlzX3NldCgpKSB7CisgICAgY2FzdCA9ICIoR0hhc2hUYWJsZSopIjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgdF90eXBlKiBldHlwZSA9ICgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICBpZiAoZXR5cGUtPmlzX3ZvaWQoKSkgeworICAgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCJjb21waWxlciBlcnJvcjogbGlzdCBlbGVtZW50IHR5cGUgY2Fubm90IGJlIHZvaWQiKTsKKyAgICB9CisgICAgY2FzdCA9IGlzX251bWVyaWMoZXR5cGUpID8gIihHQXJyYXkqKSIgOiAiKEdQdHJBcnJheSopIjsKKyAgfQorCisgIHRfZmllbGQgZWZpZWxkKHR0eXBlLCAiKCIgKyBjYXN0ICsgbmFtZSArICIpIik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiLCAiIiwgZXJyb3JfcmV0KTsKK30KKworLyogZGVzZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuICovCit2b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBzdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yX3JldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGFsbG9jYXRlKSB7CisgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKworICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7CisgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCJDQU5OT1QgR0VORVJBVEUgREVTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgcHJlZml4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdGZpZWxkLT5nZXRfbmFtZSgpKTsKKyAgfQorCisgIHN0cmluZyBuYW1lID0gcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpICsgc3VmZml4OworCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBuYW1lLCBlcnJvcl9yZXQsIGFsbG9jYXRlKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIG5hbWUsIGVycm9yX3JldCk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgaWYgKHRiYXNlID09IHRfYmFzZV90eXBlOjpUWVBFX1NUUklORykgeworICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IG5hbWUgPDwgIiAhPSBOVUxMKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50KG91dCkgPDwgImdfZnJlZSgiIDw8IG5hbWUgPDwgIik7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IG5hbWUgPDwgIiA9IE5VTEw7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudChvdXQpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkXyI7CisKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgb3V0IDw8ICJiaW5hcnkgKHByb3RvY29sLCAmZGF0YSwgJmxlbiI7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgInN0cmluZyAocHJvdG9jb2wsICYiIDw8IG5hbWU7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICBvdXQgPDwgImJvb2wgKHByb3RvY29sLCAmIiA8PCBuYW1lOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIG91dCA8PCAiYnl0ZSAocHJvdG9jb2wsICYiIDw8IG5hbWU7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIG91dCA8PCAiaTE2IChwcm90b2NvbCwgJiIgPDwgbmFtZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgb3V0IDw8ICJpMzIgKHByb3RvY29sLCAmIiA8PCBuYW1lOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICBvdXQgPDwgImk2NCAocHJvdG9jb2wsICYiIDw8IG5hbWU7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIG91dCA8PCAiZG91YmxlIChwcm90b2NvbCwgJiIgPDwgbmFtZTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEMgcmVhZGVyIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSkgKyBuYW1lOworICAgIH0KKyAgICBvdXQgPDwgIiwgZXJyb3IpKSA8IDApIiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIKKyAgICAgICAgPDwgZW5kbDsKKworICAgIC8vIGxvYWQgdGhlIGJ5dGUgYXJyYXkgd2l0aCB0aGUgZGF0YQorICAgIGlmICh0YmFzZSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkcgJiYgdHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIiA9IGdfYnl0ZV9hcnJheV9uZXcoKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiZ19ieXRlX2FycmF5X2FwcGVuZCAoIiA8PCBuYW1lIDw8ICIsIChndWludDggKikgZGF0YSwgKGd1aW50KSBsZW4pOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJnX2ZyZWUgKGRhdGEpOyIgPDwgZW5kbDsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgc3RyaW5nIHQgPSB0bXAoImVjYXN0Iik7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJnaW50MzIgIiA8PCB0IDw8ICI7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2kzMiAocHJvdG9jb2wsICYiIDw8IHQgPDwgIiwgZXJyb3IpKSA8IDApIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8IG5hbWUgPDwgIiA9ICgiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiKSIgPDwgdCA8PCAiOyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyBzdGQ6OmxvZ2ljX2Vycm9yKCJETyBOT1QgS05PVyBIT1cgVE8gU0VSSUFMSVpFIEZJRUxEICciICsgdGZpZWxkLT5nZXRfbmFtZSgpICsgIicgVFlQRSAnIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0eXBlX25hbWUodHlwZSkpOworICB9CisKKyAgLy8gaWYgdGhlIHR5cGUgaXMgbm90IHJlcXVpcmVkIGFuZCB0aGlzIGlzIGEgdGhyaWZ0IHN0cnVjdCAobm8gcHJlZml4KSwKKyAgLy8gc2V0IHRoZSBpc3NldCB2YXJpYWJsZS4gIGlmIHRoZSB0eXBlIGlzIHJlcXVpcmVkLCB0aGVuIHNldCB0aGUKKyAgLy8gbG9jYWwgdmFyaWFibGUgaW5kaWNhdGluZyB0aGUgdmFsdWUgd2FzIHNldCwgc28gdGhhdCB3ZSBjYW4gZG8gICAgLy8gdmFsaWRhdGlvbiBsYXRlci4KKyAgaWYgKHByZWZpeCAhPSAiIiAmJiB0ZmllbGQtPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICJfX2lzc2V0XyIgPDwgdGZpZWxkLT5nZXRfbmFtZSgpIDw8IHN1ZmZpeCA8PCAiID0gVFJVRTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAocHJlZml4ICE9ICIiICYmIHRmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaXNzZXRfIiA8PCB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIiA9IFRSVUU7IiA8PCBlbmRsOworICB9Cit9CisKK3ZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yX3JldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhbGxvY2F0ZSkgeworICBzdHJpbmcgbmFtZV91YyA9IHRvX3VwcGVyX2Nhc2UoaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKHRzdHJ1Y3QtPmdldF9uYW1lKCkpKTsKKyAgaWYgKHRzdHJ1Y3QtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIi8qIFRoaXMgc3RydWN0IGlzIGFuIGV4Y2VwdGlvbiAqLyIgPDwgZW5kbDsKKyAgICBhbGxvY2F0ZSA9IHRydWU7CisgIH0KKworICBpZiAoYWxsb2NhdGUpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICggIiA8PCBwcmVmaXggPDwgIiAhPSBOVUxMKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImdfb2JqZWN0X3VucmVmICgiIDw8IHByZWZpeCA8PCAiKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIgPSBnX29iamVjdF9uZXcgKCIgPDwgdGhpcy0+bnNwYWNlX3VjCisgICAgICAgIDw8ICJUWVBFXyIgPDwgbmFtZV91YyA8PCAiLCBOVUxMKTsiIDw8IGVuZGw7CisgIH0KKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9zdHJ1Y3RfcmVhZCAoVEhSSUZUX1NUUlVDVCAoIiA8PCBwcmVmaXgKKyAgICAgIDw8ICIpLCBwcm90b2NvbCwgZXJyb3IpKSA8IDApIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaWYgKGFsbG9jYXRlKSB7CisgICAgaW5kZW50KG91dCkgPDwgImdfb2JqZWN0X3VucmVmICgiIDw8IHByZWZpeCA8PCAiKTsiIDw8IGVuZGw7CisgICAgaWYgKHRzdHJ1Y3QtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiID0gTlVMTDsiIDw8IGVuZGw7CisgICAgfQorICB9CisgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbDsKK30KKwordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJvcl9yZXQpIHsKKyAgc2NvcGVfdXAob3V0KTsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJndWludDMyIHNpemU7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJndWludDMyIGk7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJUaHJpZnRUeXBlIGtleV90eXBlOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiVGhyaWZ0VHlwZSB2YWx1ZV90eXBlOyIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICIvKiByZWFkIHRoZSBtYXAgYmVnaW4gbWFya2VyICovIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX21hcF9iZWdpbiAocHJvdG9jb2wsICIKKyAgICAgICAgICAgIiZrZXlfdHlwZSwgJnZhbHVlX3R5cGUsICZzaXplLCBlcnJvcikpIDwgMCkiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsOworCisgICAgLy8gaXRlcmF0ZSBvdmVyIG1hcCBlbGVtZW50cworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiLyogaXRlcmF0ZSB0aHJvdWdoIGVhY2ggb2YgdGhlIG1hcCdzIGZpZWxkcyAqLyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIHByZWZpeCwgZXJyb3JfcmV0KTsKKyAgICBzY29wZV9kb3duKG91dCk7CisgICAgb3V0IDw8IGVuZGw7CisKKyAgICAvLyByZWFkIG1hcCBlbmQKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIi8qIHJlYWQgdGhlIG1hcCBlbmQgbWFya2VyICovIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX21hcF9lbmQgKHByb3RvY29sLCAiCisgICAgICAgICAgICJlcnJvcikpIDwgMCkiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImd1aW50MzIgc2l6ZTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImd1aW50MzIgaTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIlRocmlmdFR5cGUgZWxlbWVudF90eXBlOyIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX3NldF9iZWdpbiAocHJvdG9jb2wsICIKKyAgICAgICAgICAgIiZlbGVtZW50X3R5cGUsICZzaXplLCBlcnJvcikpIDwgMCkiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsOworCisgICAgLy8gaXRlcmF0ZSBvdmVyIHRoZSBlbGVtZW50cworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiLyogaXRlcmF0ZSB0aHJvdWdoIHRoZSBzZXQgZWxlbWVudHMgKi8iIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImZvciAoaSA9IDA7IGkgPCBzaXplOyArK2kpIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBwcmVmaXgsIGVycm9yX3JldCk7CisgICAgc2NvcGVfZG93bihvdXQpOworCisgICAgLy8gcmVhZCBzZXQgZW5kCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX3NldF9lbmQgKHByb3RvY29sLCAiCisgICAgICAgICAgICJlcnJvcikpIDwgMCkiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImd1aW50MzIgc2l6ZTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImd1aW50MzIgaTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIlRocmlmdFR5cGUgZWxlbWVudF90eXBlOyIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2xpc3RfYmVnaW4gKHByb3RvY29sLCAiCisgICAgICAgICAgICImZWxlbWVudF90eXBlLCZzaXplLCBlcnJvcikpIDwgMCkiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsOworCisgICAgLy8gaXRlcmF0ZSBvdmVyIHRoZSBlbGVtZW50cworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiLyogaXRlcmF0ZSB0aHJvdWdoIGxpc3QgZWxlbWVudHMgKi8iIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRfbGlzdCopdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9yZXQpOworICAgIHNjb3BlX2Rvd24ob3V0KTsKKworICAgIC8vIHJlYWQgbGlzdCBlbmQKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfbGlzdF9lbmQgKHByb3RvY29sLCAiCisgICAgICAgICAgICJlcnJvcikpIDwgMCkiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKK30KKwordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmRlY2xhcmVfbG9jYWxfdmFyaWFibGUob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcmIG5hbWUsIGJvb2wgZm9yX2hhc2hfdGFibGUpIHsKKyAgc3RyaW5nIHRuYW1lID0gdHlwZV9uYW1lKHR0eXBlKTsKKworICAvKiBJZiB0aGUgZ2l2ZW4gdHlwZSBpcyBhIHR5cGVkZWYsIGZpbmQgaXRzIHVuZGVybHlpbmcgdHlwZSBzbyB3ZQorICAgICBjYW4gY29ycmVjdGx5IGRldGVybWluZSBob3cgdG8gZ2VuZXJhdGUgYSBwb2ludGVyIHRvIGl0ICovCisgIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7CisgIHN0cmluZyBwdHIgPSAhaXNfbnVtZXJpYyh0dHlwZSkgPyAiIiA6ICIqIjsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgdF9tYXAqIHRtYXAgPSAodF9tYXAqKXR0eXBlOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCB0bmFtZSA8PCBwdHIgPDwgIiAiIDw8IG5hbWUgPDwgIiA9ICIKKyAgICAgICAgPDwgZ2VuZXJhdGVfbmV3X2hhc2hfZnJvbV90eXBlKHRtYXAtPmdldF9rZXlfdHlwZSgpLCB0bWFwLT5nZXRfdmFsX3R5cGUoKSkgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgdF9saXN0KiB0bGlzdCA9ICh0X2xpc3QqKXR0eXBlOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCB0bmFtZSA8PCBwdHIgPDwgIiAiIDw8IG5hbWUgPDwgIiA9ICIKKyAgICAgICAgPDwgZ2VuZXJhdGVfbmV3X2FycmF5X2Zyb21fdHlwZSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpKSA8PCBlbmRsOworICB9IGVsc2UgaWYgKGZvcl9oYXNoX3RhYmxlICYmIHR0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgdG5hbWUgPDwgIiAiIDw8IG5hbWUgPDwgIjsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8IHRuYW1lIDw8IHB0ciA8PCAiICIgPDwgbmFtZQorICAgICAgICA8PCAocHRyICE9ICIiID8gIiA9IGdfbmV3ICgiICsgdG5hbWUgKyAiLCAxKSIgOiAiID0gTlVMTCIpIDw8ICI7IiA8PCBlbmRsOworICB9Cit9CisKK3ZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpkZWNsb3JlX2xvY2FsX3ZhcmlhYmxlX2Zvcl93cml0ZShvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcmIG5hbWUpIHsKKyAgc3RyaW5nIHRuYW1lID0gdHlwZV9uYW1lKHR0eXBlKTsKKyAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKKyAgc3RyaW5nIHB0ciA9IHR0eXBlLT5pc19zdHJpbmcoKSB8fCAhdHR5cGUtPmlzX2Jhc2VfdHlwZSgpID8gIiAiIDogIiogIjsKKyAgc3RyaW5nIGluaXRfdmFsID0gdHR5cGUtPmlzX2VudW0oKSA/ICIiIDogIiA9IE5VTEwiOworICBvdXQgPDwgaW5kZW50KCkgPDwgdG5hbWUgPDwgcHRyIDw8IG5hbWUgPDwgaW5pdF92YWwgPDwgIjsiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3JfcmV0KSB7CisgIHRfdHlwZSogdGtleSA9IHRtYXAtPmdldF9rZXlfdHlwZSgpOworICB0X3R5cGUqIHR2YWwgPSB0bWFwLT5nZXRfdmFsX3R5cGUoKTsKKyAgc3RyaW5nIGtleW5hbWUgPSB0bXAoImtleSIpOworICBzdHJpbmcgdmFsbmFtZSA9IHRtcCgidmFsIik7CisKKyAgZGVjbGFyZV9sb2NhbF92YXJpYWJsZShvdXQsIHRrZXksIGtleW5hbWUsIHRydWUpOworICBkZWNsYXJlX2xvY2FsX3ZhcmlhYmxlKG91dCwgdHZhbCwgdmFsbmFtZSwgdHJ1ZSk7CisKKyAgLyogSWYgZWl0aGVyIHRoZSBrZXkgb3IgdmFsdWUgdHlwZSBpcyBhIHR5cGVkZWYsIGZpbmQgaXRzIHVuZGVybHlpbmcKKyAgICAgdHlwZSBzbyB3ZSBjYW4gY29ycmVjdGx5IGRldGVybWluZSBob3cgdG8gZ2VuZXJhdGUgYSBwb2ludGVyIHRvCisgICAgIGl0ICovCisgIHRrZXkgPSBnZXRfdHJ1ZV90eXBlKHRrZXkpOworICB0dmFsID0gZ2V0X3RydWVfdHlwZSh0dmFsKTsKKworICBzdHJpbmcgdGtleV9wdHIgPSB0a2V5LT5pc19zdHJpbmcoKSB8fCAhdGtleS0+aXNfYmFzZV90eXBlKCkgPyAiIiA6ICIqIjsKKyAgc3RyaW5nIHR2YWxfcHRyID0gdHZhbC0+aXNfc3RyaW5nKCkgfHwgIXR2YWwtPmlzX2Jhc2VfdHlwZSgpID8gIiIgOiAiKiI7CisKKyAgLy8gZGVzZXJpYWxpemUgdGhlIGZpZWxkcyBvZiB0aGUgbWFwIGVsZW1lbnQKKyAgdF9maWVsZCBma2V5KHRrZXksIHRrZXlfcHRyICsga2V5bmFtZSk7CisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZrZXksICIiLCAiIiwgZXJyb3JfcmV0KTsKKyAgdF9maWVsZCBmdmFsKHR2YWwsIHR2YWxfcHRyICsgdmFsbmFtZSk7CisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZ2YWwsICIiLCAiIiwgZXJyb3JfcmV0KTsKKworICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgcHJlZml4IDw8ICIgJiYgIiA8PCBrZXluYW1lIDw8ICIpIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgImdfaGFzaF90YWJsZV9pbnNlcnQgKChHSGFzaFRhYmxlICopIiA8PCBwcmVmaXggPDwgIiwgKGdwb2ludGVyKSAiIDw8IGtleW5hbWUKKyAgICAgICAgICAgICAgPDwgIiwgKGdwb2ludGVyKSAiIDw8IHZhbG5hbWUgPDwgIik7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworfQorCit2b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0c2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yX3JldCkgeworICB0X3R5cGUqIHRlbGVtID0gdHNldC0+Z2V0X2VsZW1fdHlwZSgpOworICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKKyAgc3RyaW5nIHRlbGVtX3B0ciA9IHRlbGVtLT5pc19zdHJpbmcoKSB8fCAhdGVsZW0tPmlzX2Jhc2VfdHlwZSgpID8gIiIgOiAiKiI7CisKKyAgZGVjbGFyZV9sb2NhbF92YXJpYWJsZShvdXQsIHRlbGVtLCBlbGVtLCB0cnVlKTsKKworICB0X2ZpZWxkIGZlbGVtKHRlbGVtLCB0ZWxlbV9wdHIgKyBlbGVtKTsKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0sICIiLCAiIiwgZXJyb3JfcmV0KTsKKworICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgcHJlZml4IDw8ICIgJiYgIiA8PCBlbGVtIDw8ICIpIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgImdfaGFzaF90YWJsZV9pbnNlcnQgKChHSGFzaFRhYmxlICopICIgPDwgcHJlZml4IDw8ICIsIChncG9pbnRlcikgIiA8PCBlbGVtCisgICAgICAgICAgICAgIDw8ICIsIChncG9pbnRlcikgIiA8PCBlbGVtIDw8ICIpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKK30KKwordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yX3JldCkgeworICAodm9pZClpbmRleDsKKyAgdF90eXBlKiB0dHlwZSA9IGdldF90cnVlX3R5cGUodGxpc3QtPmdldF9lbGVtX3R5cGUoKSk7CisgIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOworICBzdHJpbmcgdGVsZW1fcHRyID0gIWlzX251bWVyaWModHR5cGUpID8gIiIgOiAiKiI7CisKKyAgZGVjbGFyZV9sb2NhbF92YXJpYWJsZShvdXQsIHR0eXBlLCBlbGVtLCBmYWxzZSk7CisKKyAgdF9maWVsZCBmZWxlbSh0dHlwZSwgdGVsZW1fcHRyICsgZWxlbSk7CisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtLCAiIiwgIiIsIGVycm9yX3JldCk7CisKKyAgaWYgKHR0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoImNvbXBpbGVyIGVycm9yOiBsaXN0IGVsZW1lbnQgdHlwZSBjYW5ub3QgYmUgdm9pZCIpOworICB9IGVsc2UgaWYgKGlzX251bWVyaWModHR5cGUpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImdfYXJyYXlfYXBwZW5kX3ZhbHMgKCIgPDwgcHJlZml4IDw8ICIsICIgPDwgZWxlbSA8PCAiLCAxKTsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgImdfcHRyX2FycmF5X2FkZCAoIiA8PCBwcmVmaXggPDwgIiwgIiA8PCBlbGVtIDw8ICIpOyIgPDwgZW5kbDsKKyAgfQorfQorCitzdHJpbmcgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9mcmVlX2Z1bmNfZnJvbV90eXBlKHRfdHlwZSogdHR5cGUpIHsKKyAgaWYgKHR0eXBlID09IE5VTEwpCisgICAgcmV0dXJuICJOVUxMIjsKKworICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3QgZGV0ZXJtaW5lIGhhc2ggdHlwZSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiZ19mcmVlIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIGlmICgoKHRfYmFzZV90eXBlKil0dHlwZSktPmlzX2JpbmFyeSgpKSB7CisgICAgICAgIHJldHVybiAidGhyaWZ0X3N0cmluZ19mcmVlIjsKKyAgICAgIH0KKyAgICAgIHJldHVybiAiZ19mcmVlIjsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBoYXNoIHRhYmxlIGluZm8gZm9yIHR5cGUiOworICAgIH0KKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJOVUxMIjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkgfHwgdHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICIoR0Rlc3Ryb3lOb3RpZnkpIHRocmlmdF9zYWZlX2hhc2hfdGFibGVfZGVzdHJveSI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3N0cnVjdCgpKSB7CisgICAgcmV0dXJuICJnX29iamVjdF91bnJlZiI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgaWYgKGV0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKWV0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3QgZGV0ZXJtaW5lIGFycmF5IHR5cGUiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgcmV0dXJuICIoR0Rlc3Ryb3lOb3RpZnkpIGdfYXJyYXlfdW5yZWYiOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIHJldHVybiAiKEdEZXN0cm95Tm90aWZ5KSBnX3B0cl9hcnJheV91bnJlZiI7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGFycmF5IGluZm8gZm9yIHR5cGUiOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoZXR5cGUtPmlzX2NvbnRhaW5lcigpIHx8IGV0eXBlLT5pc19zdHJ1Y3QoKSkgeworICAgICAgcmV0dXJuICIoR0Rlc3Ryb3lOb3RpZnkpIGdfcHRyX2FycmF5X3VucmVmIjsKKyAgICAgIDsKKyAgICB9IGVsc2UgaWYgKGV0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIHJldHVybiAiKEdEZXN0cm95Tm90aWZ5KSBnX2FycmF5X3VucmVmIjsKKyAgICB9CisgICAgcHJpbnRmKCJUeXBlIG5vdCBleHBlY3RlZCBpbnNpZGUgdGhlIGFycmF5OiAlc1xuIiwgZXR5cGUtPmdldF9uYW1lKCkuY19zdHIoKSk7CisgICAgdGhyb3cgIlR5cGUgbm90IGV4cGVjdGVkIGluc2lkZSBhcnJheSI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHJldHVybiBnZW5lcmF0ZV9mcmVlX2Z1bmNfZnJvbV90eXBlKCgodF90eXBlZGVmKil0dHlwZSktPmdldF90eXBlKCkpOworICB9CisgIHByaW50ZigiVHlwZSBub3QgZXhwZWN0ZWQ6ICVzXG4iLCB0dHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKKyAgdGhyb3cgIlR5cGUgbm90IGV4cGVjdGVkIjsKK30KKworc3RyaW5nIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaGFzaF9mdW5jX2Zyb21fdHlwZSh0X3R5cGUqIHR0eXBlKSB7CisgIGlmICh0dHlwZSA9PSBOVUxMKQorICAgIHJldHVybiAiTlVMTCI7CisKKyAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IGRldGVybWluZSBoYXNoIHR5cGUiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICJ0aHJpZnRfYm9vbGVhbl9oYXNoIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmV0dXJuICJ0aHJpZnRfaW50OF9oYXNoIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAidGhyaWZ0X2ludDE2X2hhc2giOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmV0dXJuICJnX2ludF9oYXNoIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiZ19pbnQ2NF9oYXNoIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiZ19kb3VibGVfaGFzaCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gImdfc3RyX2hhc2giOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGhhc2ggdGFibGUgaW5mbyBmb3IgdHlwZSI7CisgICAgfQorICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gImdfZGlyZWN0X2hhc2giOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19jb250YWluZXIoKSB8fCB0dHlwZS0+aXNfc3RydWN0KCkpIHsKKyAgICByZXR1cm4gImdfZGlyZWN0X2hhc2giOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICByZXR1cm4gZ2VuZXJhdGVfaGFzaF9mdW5jX2Zyb21fdHlwZSgoKHRfdHlwZWRlZiopdHR5cGUpLT5nZXRfdHlwZSgpKTsKKyAgfQorICBwcmludGYoIlR5cGUgbm90IGV4cGVjdGVkOiAlc1xuIiwgdHR5cGUtPmdldF9uYW1lKCkuY19zdHIoKSk7CisgIHRocm93ICJUeXBlIG5vdCBleHBlY3RlZCI7Cit9CisKK3N0cmluZyB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX2NtcF9mdW5jX2Zyb21fdHlwZSh0X3R5cGUqIHR0eXBlKSB7CisgIGlmICh0dHlwZSA9PSBOVUxMKQorICAgIHJldHVybiAiTlVMTCI7CisKKyAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IGRldGVybWluZSBoYXNoIHR5cGUiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICJ0aHJpZnRfYm9vbGVhbl9lcXVhbCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAidGhyaWZ0X2ludDhfZXF1YWwiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmV0dXJuICJ0aHJpZnRfaW50MTZfZXF1YWwiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmV0dXJuICJnX2ludF9lcXVhbCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gImdfaW50NjRfZXF1YWwiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICJnX2RvdWJsZV9lcXVhbCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gImdfc3RyX2VxdWFsIjsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBoYXNoIHRhYmxlIGluZm8gZm9yIHR5cGUiOworICAgIH0KKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJnX2RpcmVjdF9lcXVhbCI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2NvbnRhaW5lcigpIHx8IHR0eXBlLT5pc19zdHJ1Y3QoKSkgeworICAgIHJldHVybiAiZ19kaXJlY3RfZXF1YWwiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICByZXR1cm4gZ2VuZXJhdGVfY21wX2Z1bmNfZnJvbV90eXBlKCgodF90eXBlZGVmKil0dHlwZSktPmdldF90eXBlKCkpOworICB9CisgIHByaW50ZigiVHlwZSBub3QgZXhwZWN0ZWQ6ICVzXG4iLCB0dHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKKyAgdGhyb3cgIlR5cGUgbm90IGV4cGVjdGVkIjsKK30KKworc3RyaW5nIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbmV3X2hhc2hfZnJvbV90eXBlKHRfdHlwZSoga2V5LCB0X3R5cGUqIHZhbHVlKSB7CisgIHN0cmluZyBoYXNoX2Z1bmMgPSBnZW5lcmF0ZV9oYXNoX2Z1bmNfZnJvbV90eXBlKGtleSk7CisgIHN0cmluZyBjbXBfZnVuYyA9IGdlbmVyYXRlX2NtcF9mdW5jX2Zyb21fdHlwZShrZXkpOworICBzdHJpbmcga2V5X2ZyZWVfZnVuYyA9IGdlbmVyYXRlX2ZyZWVfZnVuY19mcm9tX3R5cGUoa2V5KTsKKyAgc3RyaW5nIHZhbHVlX2ZyZWVfZnVuYyA9IGdlbmVyYXRlX2ZyZWVfZnVuY19mcm9tX3R5cGUodmFsdWUpOworCisgIHJldHVybiAiZ19oYXNoX3RhYmxlX25ld19mdWxsICgiICsgaGFzaF9mdW5jICsgIiwgIiArIGNtcF9mdW5jICsgIiwgIiArIGtleV9mcmVlX2Z1bmMgKyAiLCAiCisgICAgICAgICArIHZhbHVlX2ZyZWVfZnVuYyArICIpOyI7Cit9CisKK3N0cmluZyB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX25ld19hcnJheV9mcm9tX3R5cGUodF90eXBlKiB0dHlwZSkgeworICBpZiAodHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcigiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBkZXRlcm1pbmUgYXJyYXkgdHlwZSIpOworICB9IGVsc2UgaWYgKGlzX251bWVyaWModHR5cGUpKSB7CisgICAgcmV0dXJuICJnX2FycmF5X25ldyAoMCwgMSwgc2l6ZW9mICgiICsgYmFzZV90eXBlX25hbWUodHR5cGUpICsgIikpOyI7CisgIH0gZWxzZSB7CisgICAgc3RyaW5nIGZyZWVfZnVuYyA9IGdlbmVyYXRlX2ZyZWVfZnVuY19mcm9tX3R5cGUodHR5cGUpOworICAgIHJldHVybiAiZ19wdHJfYXJyYXlfbmV3X3dpdGhfZnJlZV9mdW5jICgiICsgZnJlZV9mdW5jICsgIik7IjsKKyAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBVVElMSVRZIEZVTkNUSU9OUyAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIFVwcGVyIGNhc2UgYSBzdHJpbmcuICBXcmFwcyBib29zdCdzIHN0cmluZyB1dGlsaXR5LgorICovCitzdHJpbmcgdG9fdXBwZXJfY2FzZShzdHJpbmcgbmFtZSkgeworICBzdHJpbmcgcyhuYW1lKTsKKyAgc3RkOjp0cmFuc2Zvcm0ocy5iZWdpbigpLCBzLmVuZCgpLCBzLmJlZ2luKCksIDo6dG91cHBlcik7CisgIHJldHVybiBzOworICAvLyAgcmV0dXJuIGJvb3N0Ojp0b191cHBlcl9jb3B5IChuYW1lKTsKK30KKworLyoqCisgKiBMb3dlciBjYXNlIGEgc3RyaW5nLiAgV3JhcHMgYm9vc3QncyBzdHJpbmcgdXRpbGl0eS4KKyAqLworc3RyaW5nIHRvX2xvd2VyX2Nhc2Uoc3RyaW5nIG5hbWUpIHsKKyAgc3RyaW5nIHMobmFtZSk7CisgIHN0ZDo6dHJhbnNmb3JtKHMuYmVnaW4oKSwgcy5lbmQoKSwgcy5iZWdpbigpLCA6OnRvbG93ZXIpOworICByZXR1cm4gczsKKyAgLy8gIHJldHVybiBib29zdDo6dG9fbG93ZXJfY29weSAobmFtZSk7Cit9CisKKy8qKgorICogTWFrZXMgYSBzdHJpbmcgZnJpZW5kbHkgdG8gQyBjb2RlIHN0YW5kYXJkcyBieSBsb3dlcmNhc2luZyBhbmQgYWRkaW5nCisgKiB1bmRlcnNjb3Jlcywgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIuICBGb3IgZXhhbXBsZToKKyAqCisgKiBJbnB1dDogIlpvbWdDYW1lbENhc2UiCisgKiBPdXRwdXQ6ICJ6b21nX2NhbWVsX2Nhc2UiCisgKi8KK3N0cmluZyBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoc3RyaW5nIG5hbWUpIHsKKyAgc3RyaW5nIHJldDsKKyAgY29uc3QgY2hhciogdG1wID0gbmFtZS5jX3N0cigpOworICBpbnQgcG9zID0gMDsKKworICAvKiB0aGUgZmlyc3QgY2hhcmFjdGVyIGlzbid0IHVuZGVyc2NvcmVkIGlmIHVwcGVyY2FzZSwganVzdCBsb3dlcmNhc2VkICovCisgIHJldCArPSB0b2xvd2VyKHRtcFtwb3NdKTsKKyAgcG9zKys7CisgIGZvciAodW5zaWduZWQgaW50IGkgPSBwb3M7IGkgPCBuYW1lLmxlbmd0aCgpOyBpKyspIHsKKyAgICBjaGFyIGxjID0gdG9sb3dlcih0bXBbaV0pOworICAgIGlmIChsYyAhPSB0bXBbaV0pIHsKKyAgICAgIHJldCArPSAnXyc7CisgICAgfQorICAgIHJldCArPSBsYzsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKKy8qKgorICogUGVyZm9ybXMgdGhlIHJldmVyc2Ugb3BlcmF0aW9uIG9mIGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlczogVGhlIGZpcnN0CisgKiBjaGFyYWN0ZXIgb2YgdGhlIHN0cmluZyBpcyBtYWRlIHVwcGVyY2FzZSwgYWxvbmcgd2l0aCBlYWNoIGNoYXJhY3RlciB0aGF0CisgKiBmb2xsb3dzIGFuIHVuZGVyc2NvcmUgKHdoaWNoIGlzIHJlbW92ZWQpLiBVc2VmdWwgZm9yIGNvbnZlcnRpbmcgVGhyaWZ0CisgKiBzZXJ2aWNlLW1ldGhvZCBuYW1lcyBpbnRvIEdPYmplY3Qtc3R5bGUgY2xhc3MgbmFtZXMuCisgKgorICogSW5wdXQ6ICJ6b21nX2NhbWVsX2Nhc2UiCisgKiBPdXRwdXQ6ICJab21nQ2FtZWxDYXNlIgorICovCitzdHJpbmcgdW5kZXJzY29yZXNfdG9faW5pdGlhbF9jYXBzKHN0cmluZyBuYW1lKSB7CisgIHN0cmluZyByZXQ7CisgIGNvbnN0IGNoYXIqIHRtcCA9IG5hbWUuY19zdHIoKTsKKyAgYm9vbCB1cHBlcmNhc2VfbmV4dCA9IHRydWU7CisKKyAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBuYW1lLmxlbmd0aCgpOyBpKyspIHsKKyAgICBjaGFyIGMgPSB0bXBbaV07CisgICAgaWYgKGMgPT0gJ18nKSB7CisgICAgICB1cHBlcmNhc2VfbmV4dCA9IHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmICh1cHBlcmNhc2VfbmV4dCkgeworICAgICAgICByZXQgKz0gdG91cHBlcihjKTsKKyAgICAgICAgdXBwZXJjYXNlX25leHQgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldCArPSBjOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKKy8qIHJlZ2lzdGVyIHRoaXMgZ2VuZXJhdG9yIHdpdGggdGhlIG1haW4gcHJvZ3JhbSAqLworVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUihjX2dsaWIsICJDLCB1c2luZyBHTGliIiwgIiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2NsX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfY2xfZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyOGQwZDgKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2NsX2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDU1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOC0gUGF0cmljayBDb2xsaXNvbiA8cGF0cmlja0Bjb2xsaXNvbi5pZT4KKyAqIENvcHlyaWdodCAoYykgMjAwNi0gRmFjZWJvb2sKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGJvb3N0L3Rva2VuaXplci5ocHA+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKKyNpbmNsdWRlICJ0aHJpZnQvcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ0X29vcF9nZW5lcmF0b3IuaCIKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKKworLyoqCisgKiBDb21tb24gTGlzcCBjb2RlIGdlbmVyYXRvci4KKyAqCisgKiBAYXV0aG9yIFBhdHJpY2sgQ29sbGlzb24gPHBhdHJpY2tAY29sbGlzb24uaWU+CisgKi8KK2NsYXNzIHRfY2xfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7CisgcHVibGljOgorICB0X2NsX2dlbmVyYXRvcigKKyAgICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAorICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCisgICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkKKyAgeworICAgIG5vX2FzZCA9IGZhbHNlOworICAgIHN5c3RlbV9wcmVmaXggPSAidGhyaWZ0LWdlbi0iOworCisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKworICAgIGZvcihpdGVyID0gcGFyc2VkX29wdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKTsgKytpdGVyKSB7CisgICAgICBpZihpdGVyLT5maXJzdC5jb21wYXJlKCJub19hc2QiKSA9PSAwKSB7CisgICAgICAgIG5vX2FzZCA9IHRydWU7CisgICAgICB9IGVsc2UgaWYgKGl0ZXItPmZpcnN0LmNvbXBhcmUoInN5c19wcmVmIikgPT0gMCkgeworCXN5c3RlbV9wcmVmaXggPSBpdGVyLT5zZWNvbmQ7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24gY2w6IiArIGl0ZXItPmZpcnN0OworICAgICAgfQorICAgIH0KKworICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLWNsIjsKKyAgICBjb3B5X29wdGlvbnNfID0gb3B0aW9uX3N0cmluZzsKKyAgfQorCisgIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKKyAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKKworICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYgICAgICh0X3R5cGVkZWYqICB0dHlwZWRlZik7CisgIHZvaWQgZ2VuZXJhdGVfZW51bSAgICAgICAgKHRfZW51bSogICAgIHRlbnVtKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb25zdCAgICAgICAodF9jb25zdCogICAgdGNvbnN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QgICAgICAodF9zdHJ1Y3QqICAgdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24gICAgKHRfc3RydWN0KiAgIHR4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZSAgICAgKHRfc2VydmljZSogIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9jbF9zdHJ1Y3QgKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX2NsX3N0cnVjdF9pbnRlcm5hbCAoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfZXhjZXB0aW9uX3NpZyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogZik7CisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKKworICBzdGQ6OnN0cmluZyBjbF9hdXRvZ2VuX2NvbW1lbnQoKTsKKyAgdm9pZCBhc2RmX2RlZihzdGQ6Om9zdHJlYW0gJm91dCk7CisgIHZvaWQgcGFja2FnZV9kZWYoc3RkOjpvc3RyZWFtICZvdXQpOworICB2b2lkIHBhY2thZ2VfaW4oc3RkOjpvc3RyZWFtICZvdXQpOworICBzdGQ6OnN0cmluZyBnZW5lcmF0ZWRfcGFja2FnZSgpOworICBzdGQ6OnN0cmluZyBwcmVmaXgoc3RkOjpzdHJpbmcgbmFtZSk7CisgIHN0ZDo6c3RyaW5nIHBhY2thZ2Vfb2YodF9wcm9ncmFtKiBwcm9ncmFtKTsKKyAgc3RkOjpzdHJpbmcgcGFja2FnZSgpOworICBzdGQ6OnN0cmluZyByZW5kZXJfaW5jbHVkZXMoKTsKKworICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSk7CisgIHN0ZDo6c3RyaW5nIHR5cGVzcGVjICh0X3R5cGUgKnQpOworICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgc3RkOjpzdHJpbmcgY2xfZG9jc3RyaW5nKHN0ZDo6c3RyaW5nIHJhdyk7CisKKyBwcml2YXRlOgorCisgIGludCB0ZW1wb3JhcnlfdmFyOworICAvKioKKyAgICogSXNvbGF0ZSB0aGUgdmFyaWFibGUgZGVmaW5pdGlvbnMsIGFzIHRoZXkgY2FuIHJlcXVpcmUgc3RydWN0dXJlIGRlZmluaXRpb25zCisgICAqLworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfYXNkXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3R5cGVzXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3ZhcnNfOworCisgIHN0ZDo6c3RyaW5nIGNvcHlfb3B0aW9uc187CisKKyAgYm9vbCBub19hc2Q7CisgIHN0ZDo6c3RyaW5nIHN5c3RlbV9wcmVmaXg7Cit9OworCisKK3ZvaWQgdF9jbF9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgeworICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOworICBzdHJpbmcgcHJvZ3JhbV9kaXIgPSBnZXRfb3V0X2RpcigpICsgIi8iICsgcHJvZ3JhbV9uYW1lXzsKKyAgTUtESVIocHJvZ3JhbV9kaXIuY19zdHIoKSk7CisKKyAgdGVtcG9yYXJ5X3ZhciA9IDA7CisKKyAgc3RyaW5nIGZfdHlwZXNfbmFtZSA9IHByb2dyYW1fZGlyICsgIi8iICsgcHJvZ3JhbV9uYW1lXyArICItdHlwZXMubGlzcCI7CisgIHN0cmluZyBmX3ZhcnNfbmFtZSA9IHByb2dyYW1fZGlyICsgIi8iICsgcHJvZ3JhbV9uYW1lXyArICItdmFycy5saXNwIjsKKworICBmX3R5cGVzXy5vcGVuKGZfdHlwZXNfbmFtZS5jX3N0cigpKTsKKyAgZl90eXBlc18gPDwgY2xfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbDsKKyAgZl92YXJzXy5vcGVuKGZfdmFyc19uYW1lLmNfc3RyKCkpOworICBmX3ZhcnNfIDw8IGNsX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGw7CisKKyAgcGFja2FnZV9kZWYoZl90eXBlc18pOworICBwYWNrYWdlX2luKGZfdHlwZXNfKTsKKyAgcGFja2FnZV9pbihmX3ZhcnNfKTsKKworICBpZiAoIW5vX2FzZCkgeworICAgIHN0cmluZyBmX2FzZF9uYW1lID0gcHJvZ3JhbV9kaXIgKyAiLyIgKyBzeXN0ZW1fcHJlZml4ICsgcHJvZ3JhbV9uYW1lXyArICIuYXNkIjsKKyAgICBmX2FzZF8ub3BlbihmX2FzZF9uYW1lLmNfc3RyKCkpOworICAgIGZfYXNkXyA8PCBjbF9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsOworICAgIGFzZGZfZGVmKGZfYXNkXyk7CisgIH0KK30KKworLyoqCisgKiBSZW5kZXJzIGFsbCB0aGUgaW1wb3J0cyBuZWNlc3NhcnkgZm9yIGluY2x1ZGluZyBhbm90aGVyIFRocmlmdCBwcm9ncmFtCisgKi8KK3N0cmluZyB0X2NsX2dlbmVyYXRvcjo6cmVuZGVyX2luY2x1ZGVzKCkgeworICBjb25zdCB2ZWN0b3I8dF9wcm9ncmFtKj4mIGluY2x1ZGVzID0gcHJvZ3JhbV8tPmdldF9pbmNsdWRlcygpOworICBzdHJpbmcgcmVzdWx0ID0gIiI7CisgIHJlc3VsdCArPSAiOmRlcGVuZHMtb24gKDp0aHJpZnQiOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluY2x1ZGVzLnNpemUoKTsgKytpKSB7CisgICAgcmVzdWx0ICs9ICIgOiIgKyBzeXN0ZW1fcHJlZml4ICsgdW5kZXJzY29yZShpbmNsdWRlc1tpXS0+Z2V0X25hbWUoKSk7CisgIH0KKyAgcmVzdWx0ICs9ICIpXG4iOworICByZXR1cm4gcmVzdWx0OworfQorCitzdHJpbmcgdF9jbF9nZW5lcmF0b3I6OnBhY2thZ2Vfb2YodF9wcm9ncmFtKiBwcm9ncmFtKSB7CisgIHN0cmluZyBwcmVmaXggPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJjbCIpOworICByZXR1cm4gcHJlZml4LmVtcHR5KCkgPyAidGhyaWZ0LWdlbmVyYXRlZCIgOiBwcmVmaXg7Cit9CisKK3N0cmluZyB0X2NsX2dlbmVyYXRvcjo6cGFja2FnZSgpIHsKKyAgcmV0dXJuIHBhY2thZ2Vfb2YocHJvZ3JhbV8pOworfQorCitzdHJpbmcgdF9jbF9nZW5lcmF0b3I6OnByZWZpeChzdHJpbmcgc3ltYm9sKSB7CisgIHJldHVybiAiXCIiICsgc3ltYm9sICsgIlwiIjsKK30KKworc3RyaW5nIHRfY2xfZ2VuZXJhdG9yOjpjbF9hdXRvZ2VuX2NvbW1lbnQoKSB7CisgIHJldHVybgorICAgIHN0ZDo6c3RyaW5nKCI7OzsgIikgKyAiQXV0b2dlbmVyYXRlZCBieSBUaHJpZnRcbiIgKworICAgICI7OzsgRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lOR1xuIiArCisgICAgIjs7OyBvcHRpb25zIHN0cmluZzogIiArIGNvcHlfb3B0aW9uc18gKyAiXG4iOworfQorCitzdHJpbmcgdF9jbF9nZW5lcmF0b3I6OmNsX2RvY3N0cmluZyhzdHJpbmcgcmF3KSB7CisgIHJlcGxhY2UocmF3LmJlZ2luKCksIHJhdy5lbmQoKSwgJyInLCAnXCcnKTsKKyAgcmV0dXJuIHJhdzsKK30KKworCit2b2lkIHRfY2xfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7CisgIGZfYXNkXy5jbG9zZSgpOworICBmX3R5cGVzXy5jbG9zZSgpOworICBmX3ZhcnNfLmNsb3NlKCk7Cit9CisKK3N0cmluZyB0X2NsX2dlbmVyYXRvcjo6Z2VuZXJhdGVkX3BhY2thZ2UoKSB7CisgIHJldHVybiBwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgiY3BwIik7Cit9CisKK3ZvaWQgdF9jbF9nZW5lcmF0b3I6OmFzZGZfZGVmKHN0ZDo6b3N0cmVhbSAmb3V0KSB7CisgIG91dCA8PCAiKGFzZGY6ZGVmc3lzdGVtICM6IiA8PCBzeXN0ZW1fcHJlZml4IDw8IHByb2dyYW1fbmFtZV8gPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCByZW5kZXJfaW5jbHVkZXMoKQorICAgICAgPDwgaW5kZW50KCkgPDwgIjpzZXJpYWwgdCIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgIjpjb21wb25lbnRzICgiCisgICAgICA8PCAiKDpmaWxlIFwiIiA8PCBwcm9ncmFtX25hbWVfIDw8ICItdHlwZXNcIikgIgorICAgICAgPDwgIig6ZmlsZSBcIiIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiLXZhcnNcIikpKSIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKK30KKworLyoqKgorICogR2VuZXJhdGUgYSBwYWNrYWdlIGRlZmluaXRpb24uIEFkZCB1c2UgcmVmZXJlbmNlcyBlcXVpdmFsZW50IHRvIHRoZSBpZGwgZmlsZSdzIGluY2x1ZGUgc3RhdGVtZW50cy4KKyAqLwordm9pZCB0X2NsX2dlbmVyYXRvcjo6cGFja2FnZV9kZWYoc3RkOjpvc3RyZWFtICZvdXQpIHsKKyAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+JiBpbmNsdWRlcyA9IHByb2dyYW1fLT5nZXRfaW5jbHVkZXMoKTsKKworICBvdXQgPDwgIih0aHJpZnQ6ZGVmLXBhY2thZ2UgOiIgPDwgcGFja2FnZSgpOworICBpZiAoIGluY2x1ZGVzLnNpemUoKSA+IDAgKSB7CisgICAgb3V0IDw8ICIgOnVzZSAoIjsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluY2x1ZGVzLnNpemUoKTsgKytpKSB7CisgICAgICBvdXQgPDwgIiA6IiA8PCBpbmNsdWRlc1tpXS0+Z2V0X25hbWUoKTsKKyAgICB9CisgICAgb3V0IDw8ICIpIjsKKyAgfQorICBvdXQgPDwgIikiIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2NsX2dlbmVyYXRvcjo6cGFja2FnZV9pbihzdGQ6Om9zdHJlYW0gJm91dCkgeworICBvdXQgPDwgIihjbDppbi1wYWNrYWdlIDoiIDw8IHBhY2thZ2UoKSA8PCAiKSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIFRoaXMgaXMgbm90IGRvbmUgaW4gQ29tbW9uIExpc3AsIHR5cGVzIGFyZSBhbGwgaW1wbGljaXQuCisgKgorICogQHBhcmFtIHR0eXBlZGVmIFRoZSB0eXBlIGRlZmluaXRpb24KKyAqLwordm9pZCB0X2NsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7CisgICh2b2lkKXR0eXBlZGVmOworfQorCit2b2lkIHRfY2xfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKKyAgZl90eXBlc18gPDwgIih0aHJpZnQ6ZGVmLWVudW0gIiA8PCBwcmVmaXgodGVudW0tPmdldF9uYW1lKCkpIDw8IGVuZGw7CisKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOworICBpbnQgdmFsdWUgPSAtMTsKKworICBpbmRlbnRfdXAoKTsKKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIigiOworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKworICAgIGlmKGNfaXRlciAhPSBjb25zdGFudHMuYmVnaW4oKSkgZl90eXBlc18gPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICI7CisKKyAgICBmX3R5cGVzXyA8PCAiKFwiIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiIC4gIiA8PCB2YWx1ZSA8PCAiKSI7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgZl90eXBlc18gPDwgIikpIiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGUgYSBjb25zdGFudCB2YWx1ZQorICovCit2b2lkIHRfY2xfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpIHsKKyAgdF90eXBlKiB0eXBlID0gdGNvbnN0LT5nZXRfdHlwZSgpOworICBzdHJpbmcgbmFtZSA9IHRjb25zdC0+Z2V0X25hbWUoKTsKKyAgdF9jb25zdF92YWx1ZSogdmFsdWUgPSB0Y29uc3QtPmdldF92YWx1ZSgpOworCisgIGZfdmFyc18gPDwgIih0aHJpZnQ6ZGVmLWNvbnN0YW50ICIgPDwgcHJlZml4KG5hbWUpIDw8ICIgIiA8PCByZW5kZXJfY29uc3RfdmFsdWUodHlwZSwgdmFsdWUpIDw8ICIpIgorICAgICAgICAgIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBQcmludHMgdGhlIHZhbHVlIG9mIGEgY29uc3RhbnQgd2l0aCB0aGUgZ2l2ZW4gdHlwZS4gTm90ZSB0aGF0IHR5cGUgY2hlY2tpbmcKKyAqIGlzIE5PVCBwZXJmb3JtZWQgaW4gdGhpcyBmdW5jdGlvbiBhcyBpdCBpcyBhbHdheXMgcnVuIGJlZm9yZWhhbmQgdXNpbmcgdGhlCisgKiB2YWxpZGF0ZV90eXBlcyBtZXRob2QgaW4gbWFpbi5jYworICovCitzdHJpbmcgdF9jbF9nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgb3V0IDw8ICJcIiIgPDwgdmFsdWUtPmdldF9zdHJpbmcoKSA8PCAiXCIiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgb3V0IDw8ICh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDAgPyAidCIgOiAibmlsIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgeworICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIG91dCA8PCAodHlwZS0+aXNfc3RydWN0KCkgPyAiKG1ha2UtaW5zdGFuY2UgJyIgOiAiKG1ha2UtZXhjZXB0aW9uICciKSA8PAorICAgICAgICAgICBsb3dlcmNhc2UodHlwZS0+Z2V0X25hbWUoKSkgPDwgIiAiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOworICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKKyAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisgICAgICB9CisKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiOiIgPDwgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpIDw8ICIgIiA8PAorICAgICAgICByZW5kZXJfY29uc3RfdmFsdWUoZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpIDw8IGVuZGw7CisgICAgfQorICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiKSI7CisKKyAgICBpbmRlbnRfZG93bigpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgLy8gZW1pdCBhbiBoYXNoIGZvcm0gd2l0aCBib3RoIGtleXMgYW5kIHZhbHVlcyB0byBiZSBldmFsdWF0ZWQKKyAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisgICAgb3V0IDw8ICIodGhyaWZ0Om1hcCAiOworICAgIGluZGVudF91cCgpOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIihjbDpjb25zICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGt0eXBlLCB2X2l0ZXItPmZpcnN0KSA8PCAiICIKKyAgICAgICAgICA8PCByZW5kZXJfY29uc3RfdmFsdWUodnR5cGUsIHZfaXRlci0+c2Vjb25kKSA8PCAiKSI7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIpIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3R5cGUqIGV0eXBlOworICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9CisgICAgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgICBvdXQgPDwgIih0aHJpZnQ6c2V0IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgIih0aHJpZnQ6bGlzdCIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50X3VwKCk7CisgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGV0eXBlLCAqdl9pdGVyKSA8PCBlbmRsOworICAgIH0KKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIikiOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIENPTlNUQU5UIEZPUiBUWVBFOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKKyAgfQorICByZXR1cm4gb3V0LnN0cigpOworfQorCit2b2lkIHRfY2xfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgZ2VuZXJhdGVfY2xfc3RydWN0KGZfdHlwZXNfLCB0c3RydWN0LCBmYWxzZSk7Cit9CisKK3ZvaWQgdF9jbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKKyAgZ2VuZXJhdGVfY2xfc3RydWN0KGZfdHlwZXNfLCB0eGNlcHRpb24sIHRydWUpOworfQorCit2b2lkIHRfY2xfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jbF9zdHJ1Y3RfaW50ZXJuYWwoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbikgeworICAodm9pZClpc19leGNlcHRpb247CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgb3V0IDw8ICIoIjsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF9jb25zdF92YWx1ZSogdmFsdWUgPSAoKm1faXRlciktPmdldF92YWx1ZSgpOworICAgIHRfdHlwZSogdHlwZSA9ICgqbV9pdGVyKS0+Z2V0X3R5cGUoKTsKKworICAgIGlmIChtX2l0ZXIgIT0gbWVtYmVycy5iZWdpbigpKSB7CisgICAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICI7CisgICAgfQorICAgIG91dCA8PCAiKCIgPDwgcHJlZml4KCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiAiIDw8CisgICAgICAgICggKE5VTEwgIT0gdmFsdWUpID8gcmVuZGVyX2NvbnN0X3ZhbHVlKHR5cGUsIHZhbHVlKSA6ICJuaWwiICkgPDwKKyAgICAgICAgIiA6aWQgIiA8PCAoKm1faXRlciktPmdldF9rZXkoKTsKKyAgICBpZiAoIHR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmICJzdHJpbmciID09IHR5cGVzcGVjKHR5cGUpICkKKyAgICAgIGlmICggKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpICkKKyAgICAgICAgb3V0IDw8ICIgOnR5cGUgYmluYXJ5IjsKKyAgICAgIGVsc2UKKyAgICAgICAgb3V0IDw8ICIgOnR5cGUgc3RyaW5nIjsKKyAgICBlbHNlCisgICAgICBvdXQgPDwgIiA6dHlwZSAiIDw8IHR5cGVzcGVjKHR5cGUpOworICAgIGlmICggKCptX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTCApIHsKKyAgICAgIG91dCA8PCAiIDpvcHRpb25hbCB0IjsKKyAgICB9CisgICAgaWYgKCAoKm1faXRlciktPmhhc19kb2MoKSkgeworICAgICAgb3V0IDw8ICIgOmRvY3VtZW50YXRpb24gXCIiIDw8IGNsX2RvY3N0cmluZygoKm1faXRlciktPmdldF9kb2MoKSkgPDwgIlwiIjsKKyAgICB9CisgICAgb3V0IDw8IikiOworICB9CisKKyAgb3V0IDw8ICIpIjsKK30KKwordm9pZCB0X2NsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY2xfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24gPSBmYWxzZSkgeworICBzdGQ6OnN0cmluZyBuYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QpOworICBvdXQgPDwgKGlzX2V4Y2VwdGlvbiA/ICIodGhyaWZ0OmRlZi1leGNlcHRpb24gIiA6ICIodGhyaWZ0OmRlZi1zdHJ1Y3QgIikgPDwKKyAgICAgIHByZWZpeChuYW1lKSA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaWYgKCB0c3RydWN0LT5oYXNfZG9jKCkgKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDsKKyAgICBvdXQgPDwgIlwiIiA8PCBjbF9kb2NzdHJpbmcodHN0cnVjdC0+Z2V0X2RvYygpKSA8PCAiXCIiIDw8IGVuZGw7CisgIH0KKyAgb3V0IDw8IGluZGVudCgpIDsKKyAgZ2VuZXJhdGVfY2xfc3RydWN0X2ludGVybmFsKG91dCwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8ICIpIiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jbF9nZW5lcmF0b3I6OmdlbmVyYXRlX2V4Y2VwdGlvbl9zaWcoc3RkOjpvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIGYpIHsKKyAgZ2VuZXJhdGVfY2xfc3RydWN0X2ludGVybmFsKG91dCwgZi0+Z2V0X3hjZXB0aW9ucygpLCB0cnVlKTsKK30KKwordm9pZCB0X2NsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBleHRlbmRzX2NsaWVudDsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzX2NsaWVudCA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7CisgIH0KKworICBleHRlbmRzX2NsaWVudCA9IGV4dGVuZHNfY2xpZW50LmVtcHR5KCkgPyAibmlsIiA6IHByZWZpeChleHRlbmRzX2NsaWVudCk7CisKKyAgZl90eXBlc18gPDwgIih0aHJpZnQ6ZGVmLXNlcnZpY2UgIiA8PCBwcmVmaXgoc2VydmljZV9uYW1lXykgPDwgIiAiCisgICAgICAgICAgIDw8IGV4dGVuZHNfY2xpZW50OworCisgIGluZGVudF91cCgpOworCisgIGlmICggdHNlcnZpY2UtPmhhc19kb2MoKSkgeworICAgICAgZl90eXBlc18gPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgIig6ZG9jdW1lbnRhdGlvbiBcIiIgPDwgY2xfZG9jc3RyaW5nKHRzZXJ2aWNlLT5nZXRfZG9jKCkpIDw8ICJcIikiOworICAgIH0KKworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfZnVuY3Rpb24qIGZ1bmN0aW9uID0gKmZfaXRlcjsKKyAgICBzdHJpbmcgZm5hbWUgPSBmdW5jdGlvbi0+Z2V0X25hbWUoKTsKKyAgICBzdHJpbmcgc2lnbmF0dXJlID0gZnVuY3Rpb25fc2lnbmF0dXJlKGZ1bmN0aW9uKTsKKyAgICB0X3N0cnVjdCogZXhjZXB0aW9ucyA9IGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgeG1lbWJlcnMgPSBleGNlcHRpb25zLT5nZXRfbWVtYmVycygpOworCisgICAgZl90eXBlc18gPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiKDptZXRob2QgIiA8PCBwcmVmaXgoZm5hbWUpOworICAgIGZfdHlwZXNfIDw8ICIgKCIgPDwgc2lnbmF0dXJlIDw8ICIgIiAgPDwgdHlwZXNwZWMoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpKSA8PCAiKSI7CisgICAgaWYgKHhtZW1iZXJzLnNpemUoKSA+IDApIHsKKyAgICAgIGZfdHlwZXNfIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiA6ZXhjZXB0aW9ucyAiIDsKKyAgICAgIGdlbmVyYXRlX2V4Y2VwdGlvbl9zaWcoZl90eXBlc18sIGZ1bmN0aW9uKTsKKyAgICB9CisgICAgaWYgKCAoKmZfaXRlciktPmlzX29uZXdheSgpICkgeworICAgICAgZl90eXBlc18gPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiIDpvbmV3YXkgdCI7CisgICAgfQorICAgIGlmICggKCpmX2l0ZXIpLT5oYXNfZG9jKCkgKSB7CisgICAgICBmX3R5cGVzXyA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgOmRvY3VtZW50YXRpb24gXCIiCisgICAgICAgICAgICAgICA8PCBjbF9kb2NzdHJpbmcoKCpmX2l0ZXIpLT5nZXRfZG9jKCkpIDw8ICJcIiI7CisgIH0KKyAgICBmX3R5cGVzXyA8PCAiKSI7CisgIH0KKworICBmX3R5cGVzXyA8PCAiKSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7Cit9CisKK3N0cmluZyB0X2NsX2dlbmVyYXRvcjo6dHlwZXNwZWModF90eXBlICp0KSB7CisgIHQgPSBnZXRfdHJ1ZV90eXBlKHQpOworCisgIGlmICh0IC0+IGlzX2JpbmFyeSgpKXsKKyAgICByZXR1cm4gImJpbmFyeSI7CisgIH0gZWxzZSBpZiAodC0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICByZXR1cm4gdHlwZV9uYW1lKHQpOworICB9IGVsc2UgaWYgKHQtPmlzX21hcCgpKSB7CisgICAgdF9tYXAgKm0gPSAodF9tYXAqKSB0OworICAgIHJldHVybiAiKHRocmlmdDptYXAgIiArIHR5cGVzcGVjKG0tPmdldF9rZXlfdHlwZSgpKSArICIgIiArCisgICAgICB0eXBlc3BlYyhtLT5nZXRfdmFsX3R5cGUoKSkgKyAiKSI7CisgIH0gZWxzZSBpZiAodC0+aXNfc3RydWN0KCkgfHwgdC0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiAiKHN0cnVjdCAiICsgcHJlZml4KHR5cGVfbmFtZSh0KSkgKyAiKSI7CisgIH0gZWxzZSBpZiAodC0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICIodGhyaWZ0Omxpc3QgIiArIHR5cGVzcGVjKCgodF9saXN0KikgdCktPmdldF9lbGVtX3R5cGUoKSkgKyAiKSI7CisgIH0gZWxzZSBpZiAodC0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIih0aHJpZnQ6c2V0ICIgKyB0eXBlc3BlYygoKHRfc2V0KikgdCktPmdldF9lbGVtX3R5cGUoKSkgKyAiKSI7CisgIH0gZWxzZSBpZiAodC0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICIoZW51bSBcIiIgKyAoKHRfZW51bSopIHQpLT5nZXRfbmFtZSgpICsgIlwiKSI7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgIlNvcnJ5LCBJIGRvbid0IGtub3cgaG93IHRvIGdlbmVyYXRlIHRoaXM6ICIgKyB0eXBlX25hbWUodCk7CisgIH0KK30KKworc3RyaW5nIHRfY2xfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIHJldHVybiBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSk7Cit9CisKK3N0cmluZyB0X2NsX2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBzdHJpbmdzdHJlYW0gcmVzOworICByZXMgPDwgIigiOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICByZXMgPDwgIiAiOworICAgIH0KKyAgICByZXMgPDwgIigiICsgcHJlZml4KCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiAiIDw8CisgICAgICB0eXBlc3BlYygoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIgIiA8PAorICAgICAgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgICIpIjsKKworCisgIH0KKyAgcmVzIDw8ICIpIjsKKyAgcmV0dXJuIHJlcy5zdHIoKTsKK30KKworc3RyaW5nIHRfY2xfZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSkgeworICBzdHJpbmcgcHJlZml4ID0gIiI7CisgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR0eXBlLT5nZXRfcHJvZ3JhbSgpOworCisgIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykKKyAgICBwcmVmaXggPSBwYWNrYWdlX29mKHByb2dyYW0pID09IHBhY2thZ2UoKSA/ICIiIDogcGFja2FnZV9vZihwcm9ncmFtKSArICI6IjsKKworICBzdHJpbmcgbmFtZSA9IHR0eXBlLT5nZXRfbmFtZSgpOworCisgIGlmICh0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkpCisgICAgbmFtZSA9IGxvd2VyY2FzZSh0dHlwZS0+Z2V0X25hbWUoKSk7CisKKyAgcmV0dXJuIHByZWZpeCArIG5hbWU7Cit9CisKK1RIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoCisgICAgY2wsCisgICAgIkNvbW1vbiBMaXNwIiwKKyAgICAiICAgIG5vX2FzZDogICAgICAgICAgRG8gbm90IGRlZmluZSBBU0RGIHN5c3RlbXMgZm9yIGVhY2ggZ2VuZXJhdGVkIFRocmlmdCBwcm9ncmFtLlxuIgorICAgICIgICAgc3lzX3ByZWY9ICAgICAgICBUaGUgcHJlZml4IHRvIGdpdmUgQVNERiBzeXN0ZW0gbmFtZXMuIERlZmF1bHQ6IHRocmlmdC1nZW4tXG4iKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9jb2NvYV9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2NvY29hX2dlbmVyYXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzY0NGY1Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9jb2NvYV9nZW5lcmF0b3IuY2MKQEAgLTAsMCArMSwzMzA5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSAidGhyaWZ0L3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oIgorCit1c2luZyBzdGQ6Om1hcDsKK3VzaW5nIHN0ZDo6b3N0cmVhbTsKK3VzaW5nIHN0ZDo6b2ZzdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjp2ZWN0b3I7CisKK3N0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKKworLyoqCisgKiBPYmplY3RpdmUtQyBjb2RlIGdlbmVyYXRvci4KKyAqCisgKiBtb3N0bHkgY29weS9wYXN0aW5nL3R3ZWFraW5nIGZyb20gbWNzbGVlJ3Mgd29yay4KKyAqLworY2xhc3MgdF9jb2NvYV9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgdF9jb2NvYV9nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCisgICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkgeworICAgICh2b2lkKW9wdGlvbl9zdHJpbmc7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKworICAgIGxvZ191bmV4cGVjdGVkXyA9IGZhbHNlOworICAgIHZhbGlkYXRlX3JlcXVpcmVkXyA9IGZhbHNlOworICAgIGFzeW5jX2NsaWVudHNfID0gZmFsc2U7CisgICAgcHJvbWlzZV9raXRfID0gZmFsc2U7CisgICAgZGVidWdfZGVzY3JpcHRpb25zXyA9IGZhbHNlOworICAgIHBvZHNfID0gZmFsc2U7CisgICAgZm9yKCBpdGVyID0gcGFyc2VkX29wdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKTsgKytpdGVyKSB7CisgICAgICBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgibG9nX3VuZXhwZWN0ZWQiKSA9PSAwKSB7CisgICAgICAgIGxvZ191bmV4cGVjdGVkXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoInZhbGlkYXRlX3JlcXVpcmVkIikgPT0gMCkgeworICAgICAgICB2YWxpZGF0ZV9yZXF1aXJlZF8gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJhc3luY19jbGllbnRzIikgPT0gMCkgeworICAgICAgICBhc3luY19jbGllbnRzXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoInByb21pc2Vfa2l0IikgPT0gMCkgeworICAgICAgICBwcm9taXNlX2tpdF8gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJkZWJ1Z19kZXNjcmlwdGlvbnMiKSA9PSAwKSB7CisgICAgICAgIGRlYnVnX2Rlc2NyaXB0aW9uc18gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJwb2RzIikgPT0gMCkgeworICAgICAgICBwb2RzXyA9IHRydWU7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24gY29jb2E6IiArIGl0ZXItPmZpcnN0OworICAgICAgfQorICAgIH0KKworICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLWNvY29hIjsKKyAgfQorCisgIC8qKgorICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCisgICAqLworCisgIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKKyAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKKworICB2b2lkIGdlbmVyYXRlX2NvbnN0cyhzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKTsKKworICAvKioKKyAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZik7CisgIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisKKyAgdm9pZCBwcmludF9jb25zdF92YWx1ZShvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVmdmFsID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJveF9pdCA9IGZhbHNlKTsKKworICB2b2lkIGdlbmVyYXRlX2NvY29hX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbnRlcmZhY2Uoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24gPSBmYWxzZSk7CisgIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2ltcGxlbWVudGF0aW9uKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCA9IGZhbHNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW5pdGlhbGl6ZXJfc2lnbmF0dXJlKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2luaXRfd2l0aF9jb2Rlcl9tZXRob2Qob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfZW5jb2RlX3dpdGhfY29kZXJfbWV0aG9kKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9jb3B5X21ldGhvZChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2hhc2hfbWV0aG9kKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9pc19lcXVhbF9tZXRob2Qob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2ZpZWxkX2FjY2Vzc29yX2ltcGxlbWVudGF0aW9ucyhzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9yZWFkZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2NvY29hX3N0cnVjdF93cml0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfdmFsaWRhdG9yKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2Rlc2NyaXB0aW9uKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fcmVzdWx0X2hlbHBlcl9zdHJ1Y3RfdHlwZSh0X3NlcnZpY2UgKnRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9hcmdzX2hlbHBlcl9zdHJ1Y3RfdHlwZSh0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICB2b2lkIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModF9zZXJ2aWNlICp0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKworICAvKioKKyAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfcHJvdG9jb2woc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfYXN5bmNfcHJvdG9jb2woc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOworCisgIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfaW50ZXJmYWNlKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9hc3luY19pbnRlcmZhY2Uoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOworCisgIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfc2VuZF9mdW5jdGlvbl9pbXBsZW1lbnRhdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NlcnZpY2UqIHRzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBuZWVkc19wcm90b2NvbCk7CisgIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfc2VuZF9mdW5jdGlvbl9pbnZvY2F0aW9uKG9zdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9zZW5kX2FzeW5jX2Z1bmN0aW9uX2ludm9jYXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmYWlsdXJlQmxvY2tOYW1lKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9yZWN2X2Z1bmN0aW9uX2ltcGxlbWVudGF0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2VydmljZSogdHNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG5lZWRzX3Byb3RvY29sKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9pbXBsZW1lbnRhdGlvbihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfYXN5bmNfaW1wbGVtZW50YXRpb24oc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOworCisgIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9zZXJ2ZXJfaW50ZXJmYWNlKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX3NlcnZlcl9pbXBsZW1lbnRhdGlvbihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKworICAvKioKKyAgICogU2VyaWFsaXphdGlvbiBjb25zdHJ1Y3RzCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RkOjpzdHJpbmcgZmllbGROYW1lKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBmaWVsZE5hbWUgPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBtYXApOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NldCogdG1hcCwgc3RkOjpzdHJpbmcgaXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbGlzdE5hbWUpOworCisgIC8qKgorICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucworICAgKi8KKworICBzdGQ6OnN0cmluZyBjb2NvYV9wcmVmaXgoKTsKKyAgc3RkOjpzdHJpbmcgY29jb2FfaW1wb3J0cygpOworICBzdGQ6OnN0cmluZyBjb2NvYV90aHJpZnRfaW1wb3J0cygpOworICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBjbGFzc19yZWYgPSBmYWxzZSwgYm9vbCBuZWVkc19tdXRhYmxlID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBlbGVtZW50X3R5cGVfbmFtZSh0X3R5cGUqIHR0eXBlKTsKKyAgc3RkOjpzdHJpbmcgYmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGUqIHRiYXNlKTsKKyAgc3RkOjpzdHJpbmcgZGVjbGFyZV9wcm9wZXJ0eSh0X2ZpZWxkKiB0ZmllbGQpOworICBzdGQ6OnN0cmluZyBkZWNsYXJlX3Byb3BlcnR5X2lzc2V0KHRfZmllbGQqIHRmaWVsZCk7CisgIHN0ZDo6c3RyaW5nIGRlY2xhcmVfcHJvcGVydHlfdW5zZXQodF9maWVsZCogdGZpZWxkKTsKKyAgc3RkOjpzdHJpbmcgaW52YWxpZF9yZXR1cm5fc3RhdGVtZW50KHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIGJvb2wgaW5jbHVkZV9lcnJvcik7CisgIHN0ZDo6c3RyaW5nIGFzeW5jX2Z1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIGJvb2wgaW5jbHVkZV9lcnJvcik7CisgIHN0ZDo6c3RyaW5nIHByb21pc2VfZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcm90b2NvbF9uYW1lLCBib29sIGluY2x1ZGVfZXJyb3IpOworICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7CisgIHN0ZDo6c3RyaW5nIGZvcm1hdF9zdHJpbmdfZm9yX3R5cGUodF90eXBlKiB0eXBlKTsKKyAgc3RkOjpzdHJpbmcgZm9ybWF0X2Nhc3RfZm9yX3R5cGUodF90eXBlKiB0eXBlKTsKKyAgc3RkOjpzdHJpbmcgY2FsbF9maWVsZF9zZXR0ZXIodF9maWVsZCogdGZpZWxkLCBzdGQ6OnN0cmluZyBmaWVsZE5hbWUpOworICBzdGQ6OnN0cmluZyBib3godF90eXBlICp0dHlwZSwgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSk7CisgIHN0ZDo6c3RyaW5nIHVuYm94KHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUpOworICBzdGQ6OnN0cmluZyBnZXR0ZXJfbmFtZShzdHJpbmcgZmllbGRfbmFtZSk7CisgIHN0ZDo6c3RyaW5nIHNldHRlcl9uYW1lKHN0cmluZyBmaWVsZF9uYW1lKTsKKworICBib29sIHR5cGVfY2FuX2JlX2NvcHkodF90eXBlKiB0dHlwZSkgeworICAgIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7CisgICAgCisgICAgcmV0dXJuIHR0eXBlLT5pc19zdHJpbmcoKTsKKyAgfQorICAKKyAgYm9vbCB0eXBlX2Nhbl9iZV9udWxsKHRfdHlwZSogdHR5cGUpIHsKKyAgICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOworCisgICAgcmV0dXJuIHR0eXBlLT5pc19jb250YWluZXIoKSB8fCB0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkKKyAgICAgICAgICAgfHwgdHR5cGUtPmlzX3N0cmluZygpOworICB9CisKK3ByaXZhdGU6CisgIHN0ZDo6c3RyaW5nIGNvY29hX3ByZWZpeF87CisgIHN0ZDo6c3RyaW5nIGNvbnN0YW50c19kZWNsYXJhdGlvbnNfOworICBpbnQgZXJyb3JfY29uc3RhbnRfOworCisgIC8qKgorICAgKiBGaWxlIHN0cmVhbXMKKyAgICovCisKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2hlYWRlcl87CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9pbXBsXzsKKworICBib29sIGxvZ191bmV4cGVjdGVkXzsKKyAgYm9vbCB2YWxpZGF0ZV9yZXF1aXJlZF87CisgIGJvb2wgYXN5bmNfY2xpZW50c187CisgIGJvb2wgcHJvbWlzZV9raXRfOworICBib29sIGRlYnVnX2Rlc2NyaXB0aW9uc187CisgIGJvb2wgcG9kc187Cit9OworCisvKioKKyAqIFByZXBhcmVzIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0CisgKiBzdHJlYW1zLgorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKKyAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5CisgIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7CisgIGNvY29hX3ByZWZpeF8gPSBwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgiY29jb2EiKTsKKworICAvLyB3ZSBoYXZlIGEgLmggaGVhZGVyIGZpbGUuLi4KKyAgc3RyaW5nIGZfaGVhZGVyX25hbWUgPSBjb2NvYV9wcmVmaXhfICsgY2FwaXRhbGl6ZShwcm9ncmFtX25hbWVfKSArICIuaCI7CisgIHN0cmluZyBmX2hlYWRlcl9mdWxsbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBmX2hlYWRlcl9uYW1lOworICBmX2hlYWRlcl8ub3BlbihmX2hlYWRlcl9mdWxsbmFtZS5jX3N0cigpKTsKKworICBmX2hlYWRlcl8gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbDsKKworICBmX2hlYWRlcl8gPDwgY29jb2FfaW1wb3J0cygpIDw8IGNvY29hX3RocmlmdF9pbXBvcnRzKCk7CisKKyAgLy8gLi4uYW5kIGEgLm0gaW1wbGVtZW50YXRpb24gZmlsZQorICBzdHJpbmcgZl9pbXBsX25hbWUgPSBjb2NvYV9wcmVmaXhfICsgY2FwaXRhbGl6ZShwcm9ncmFtX25hbWVfKSArICIubSI7CisgIHN0cmluZyBmX2ltcGxfZnVsbG5hbWUgPSBnZXRfb3V0X2RpcigpICsgZl9pbXBsX25hbWU7CisgIGZfaW1wbF8ub3BlbihmX2ltcGxfZnVsbG5hbWUuY19zdHIoKSk7CisKKyAgZl9pbXBsXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsOworCisgIGZfaW1wbF8gPDwgY29jb2FfaW1wb3J0cygpIDw8IGNvY29hX3RocmlmdF9pbXBvcnRzKCkgPDwgIiNpbXBvcnQgXCIiIDw8IGZfaGVhZGVyX25hbWUgPDwgIlwiIgorICAgICAgICAgIDw8IGVuZGwgPDwgZW5kbDsKKworICBlcnJvcl9jb25zdGFudF8gPSA2MDAwMDsKK30KKworLyoqCisgKiBQcmludHMgc3RhbmRhcmQgQ29jb2EgaW1wb3J0cworICoKKyAqIEByZXR1cm4gTGlzdCBvZiBpbXBvcnRzIGZvciBDb2NvYSBsaWJyYXJpZXMKKyAqLworc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjpjb2NvYV9pbXBvcnRzKCkgeworICByZXR1cm4gc3RyaW5nKCkgKyAiI2ltcG9ydCA8Rm91bmRhdGlvbi9Gb3VuZGF0aW9uLmg+XG4iICsgIlxuIjsKK30KKworLyoqCisgKiBQcmludHMgdGhyaWZ0IHJ1bnRpbWUgaW1wb3J0cworICoKKyAqIEByZXR1cm4gTGlzdCBvZiBpbXBvcnRzIG5lY2Vzc2FyeSBmb3IgdGhyaWZ0IHJ1bnRpbWUKKyAqLworc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjpjb2NvYV90aHJpZnRfaW1wb3J0cygpIHsKKworICB2ZWN0b3I8c3RyaW5nPiBpbmNsdWRlc19saXN0OworICBpbmNsdWRlc19saXN0LnB1c2hfYmFjaygiVFByb3RvY29sLmgiKTsKKyAgaW5jbHVkZXNfbGlzdC5wdXNoX2JhY2soIlRQcm90b2NvbEZhY3RvcnkuaCIpOworICBpbmNsdWRlc19saXN0LnB1c2hfYmFjaygiVEFwcGxpY2F0aW9uRXJyb3IuaCIpOworICBpbmNsdWRlc19saXN0LnB1c2hfYmFjaygiVFByb3RvY29sRXJyb3IuaCIpOworICBpbmNsdWRlc19saXN0LnB1c2hfYmFjaygiVFByb3RvY29sVXRpbC5oIik7CisgIGluY2x1ZGVzX2xpc3QucHVzaF9iYWNrKCJUUHJvY2Vzc29yLmgiKTsKKyAgaW5jbHVkZXNfbGlzdC5wdXNoX2JhY2soIlRCYXNlLmgiKTsKKyAgaW5jbHVkZXNfbGlzdC5wdXNoX2JhY2soIlRBc3luY1RyYW5zcG9ydC5oIik7CisgIGluY2x1ZGVzX2xpc3QucHVzaF9iYWNrKCJUQmFzZUNsaWVudC5oIik7CisKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIGluY2x1ZGVzOworCisgIHZlY3RvcjxzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpX2l0ZXI7CisgIGZvciAoaV9pdGVyPWluY2x1ZGVzX2xpc3QuYmVnaW4oKTsgaV9pdGVyIT1pbmNsdWRlc19saXN0LmVuZCgpOyArK2lfaXRlcikgeworICAgIGluY2x1ZGVzIDw8ICIjaW1wb3J0ICI7CisgICAgaWYgKHBvZHNfKSB7CisgICAgICBpbmNsdWRlcyA8PCAiPFRocmlmdC8iIDw8ICppX2l0ZXIgPDwgIj4iOworICAgIH0gZWxzZSB7CisgICAgICBpbmNsdWRlcyA8PCAiXCIiIDw8ICppX2l0ZXIgPDwgIlwiIjsKKyAgICB9CisgICAgaW5jbHVkZXMgPDwgZW5kbDsKKyAgfQorCisgIGluY2x1ZGVzIDw8IGVuZGw7CisKKyAgaWYgKHByb21pc2Vfa2l0XykgeworICAgIGluY2x1ZGVzIDw8ICIjaW1wb3J0ICI7CisgICAgaWYgKHBvZHNfKSB7CisgICAgICBpbmNsdWRlcyA8PCAiPFByb21pc2VLaXQvUHJvbWlzZUtpdC5oPiI7CisgICAgfSBlbHNlIHsKKyAgICAgIGluY2x1ZGVzIDw8ICJcIlByb21pc2VLaXQuaFwiIjsKKyAgICB9CisgICAgaW5jbHVkZXMgPDwgZW5kbDsKKyAgfQorCisgIC8vIEluY2x1ZGUgb3RoZXIgVGhyaWZ0IGluY2x1ZGVzCisgIGNvbnN0IHZlY3Rvcjx0X3Byb2dyYW0qPiYgb3RoZXJfaW5jbHVkZXMgPSBwcm9ncmFtXy0+Z2V0X2luY2x1ZGVzKCk7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3RoZXJfaW5jbHVkZXMuc2l6ZSgpOyArK2kpIHsKKyAgICBpbmNsdWRlcyA8PCAiI2ltcG9ydCBcIiIKKyAgICAgICAgICAgICA8PCBvdGhlcl9pbmNsdWRlc1tpXS0+Z2V0X25hbWVzcGFjZSgiY29jb2EiKQorICAgICAgICAgICAgIDw8IGNhcGl0YWxpemUob3RoZXJfaW5jbHVkZXNbaV0tPmdldF9uYW1lKCkpCisgICAgICAgICAgICAgPDwgIi5oXCIiIDw8IGVuZGw7CisgIH0KKworICBpbmNsdWRlcyA8PCBlbmRsOworCisgIHJldHVybiBpbmNsdWRlcy5zdHIoKTsKK30KKworLyoqCisgKiBGaW5pc2ggdXAgZ2VuZXJhdGlvbi4KKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgeworICAvLyBzdGljayBvdXIgY29uc3RhbnRzIGRlY2xhcmF0aW9ucyBhdCB0aGUgZW5kIG9mIHRoZSBoZWFkZXIgZmlsZQorICAvLyBzaW5jZSB0aGV5IHJlZmVyIHRvIHRoaW5ncyB3ZSBhcmUgZGVmaW5pbmcuCisgIGZfaGVhZGVyXyA8PCBjb25zdGFudHNfZGVjbGFyYXRpb25zXyA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIFRoaXMgaXMganVzdCBhIHNpbXBsZSAxLWxpbmVyIGluIG9iamVjdGl2ZS1jCisgKgorICogQHBhcmFtIHR0eXBlZGVmIFRoZSB0eXBlIGRlZmluaXRpb24KKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7CisgIGlmICh0dHlwZWRlZi0+Z2V0X3R5cGUoKS0+aXNfbWFwKCkpIHsKKyAgICB0X21hcCAqbWFwID0gKHRfbWFwICopdHR5cGVkZWYtPmdldF90eXBlKCk7CisgICAgaWYgKG1hcC0+Z2V0X2tleV90eXBlKCktPmlzX3N0cnVjdCgpKSB7CisgICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgIkBjbGFzcyAiIDw8IHR5cGVfbmFtZShtYXAtPmdldF9rZXlfdHlwZSgpLCB0cnVlKSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaWYgKG1hcC0+Z2V0X3ZhbF90eXBlKCktPmlzX3N0cnVjdCgpKSB7CisgICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgIkBjbGFzcyAiIDw8IHR5cGVfbmFtZShtYXAtPmdldF92YWxfdHlwZSgpLCB0cnVlKSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgZWxzZSBpZiAodHR5cGVkZWYtPmdldF90eXBlKCktPmlzX3NldCgpKSB7CisgICAgdF9zZXQgKnNldCA9ICh0X3NldCAqKXR0eXBlZGVmLT5nZXRfdHlwZSgpOworICAgIGlmIChzZXQtPmdldF9lbGVtX3R5cGUoKS0+aXNfc3RydWN0KCkpIHsKKyAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAiQGNsYXNzICIgPDwgdHlwZV9uYW1lKHNldC0+Z2V0X2VsZW1fdHlwZSgpLCB0cnVlKSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgZWxzZSBpZiAodHR5cGVkZWYtPmdldF90eXBlKCktPmlzX2xpc3QoKSkgeworICAgIHRfbGlzdCAqbGlzdCA9ICh0X2xpc3QgKil0dHlwZWRlZi0+Z2V0X3R5cGUoKTsKKyAgICBpZiAobGlzdC0+Z2V0X2VsZW1fdHlwZSgpLT5pc19zdHJ1Y3QoKSkgeworICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJAY2xhc3MgIiA8PCB0eXBlX25hbWUobGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCB0cnVlKSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJ0eXBlZGVmICIgPDwgdHlwZV9uYW1lKHR0eXBlZGVmLT5nZXRfdHlwZSgpKSA8PCAiICIgPDwgY29jb2FfcHJlZml4XworICAgICAgICAgICAgPDwgdHR5cGVkZWYtPmdldF9zeW1ib2xpYygpIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CisgIGlmICh0dHlwZWRlZi0+Z2V0X3R5cGUoKS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgInR5cGVkZWYgIiA8PCB0eXBlX25hbWUodHR5cGVkZWYtPmdldF90eXBlKCksIGZhbHNlLCB0cnVlKSA8PCAiICIgPDwgY29jb2FfcHJlZml4XworICAgICAgICAgICAgICA8PCAiTXV0YWJsZSIgPDwgdHR5cGVkZWYtPmdldF9zeW1ib2xpYygpIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgY29kZSBmb3IgYW4gZW51bWVyYXRlZCB0eXBlLiBJbiBPYmplY3RpdmUtQywgdGhpcyBpcworICogZXNzZW50aWFsbHkgdGhlIHNhbWUgYXMgdGhlIHRocmlmdCBkZWZpbml0aW9uIGl0c2VsZiwgaW5zdGVhZCB1c2luZworICogTlNfRU5VTSBrZXl3b3JkIGluIE9iamVjdGl2ZS1DLiAgRm9yIG5hbWVzcGFjZSBwdXJwb3NlcywgdGhlIG5hbWUgb2YKKyAqIHRoZSBlbnVtIGlzIHByZWZpeGVkIHRvIGVhY2ggZWxlbWVudCBpbiBrZWVwaW5nIHdpdGggQ29jb2EgJiBTd2lmdAorICogc3RhbmRhcmRzLgorICoKKyAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7CisgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAidHlwZWRlZiBOU19FTlVNKFNJbnQzMiwgIiA8PCBjb2NvYV9wcmVmaXhfIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICIpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBmX2hlYWRlcl8gPDwgIiwiIDw8IGVuZGw7CisgICAgfQorICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCBjb2NvYV9wcmVmaXhfIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICBmX2hlYWRlcl8gPDwgIiA9ICIgPDwgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGZfaGVhZGVyXyA8PCBlbmRsIDw8ICJ9OyIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGNsYXNzIHRoYXQgaG9sZHMgYWxsIHRoZSBjb25zdGFudHMuCisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0cyhzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBjb25zdF9pbnRlcmZhY2U7CisKKyAgY29uc3RfaW50ZXJmYWNlIDw8ICJGT1VOREFUSU9OX0VYUE9SVCBOU1N0cmluZyAqIiA8PCBjb2NvYV9wcmVmaXhfIDw8IGNhcGl0YWxpemUocHJvZ3JhbV9uYW1lXykgPDwgIkVycm9yRG9tYWluOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKworCisgIGJvb2wgbmVlZHNfY2xhc3MgPSBmYWxzZTsKKworICAvLyBQdWJsaWMgY29uc3RhbnRzIGZvciBiYXNlIHR5cGVzICYgc3RyaW5ncworICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7CisgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgdF90eXBlKiB0eXBlID0gKCpjX2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfdHJ1ZV90eXBlKCk7CisgICAgaWYgKCF0eXBlLT5pc19jb250YWluZXIoKSAmJiAhdHlwZS0+aXNfc3RydWN0KCkpIHsKKyAgICAgIGNvbnN0X2ludGVyZmFjZSA8PCAiRk9VTkRBVElPTl9FWFBPUlQgIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiAiCisgICAgICAgICAgICAgICAgICAgICAgPDwgY29jb2FfcHJlZml4XyA8PCBjYXBpdGFsaXplKCgqY19pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICAgIGVsc2UgeworICAgICAgbmVlZHNfY2xhc3MgPSB0cnVlOworICAgIH0KKyAgfQorCisKKyAgc3RyaW5nIGNvbnN0YW50c19jbGFzc19uYW1lID0gY29jb2FfcHJlZml4XyArIGNhcGl0YWxpemUocHJvZ3JhbV9uYW1lXykgKyAiQ29uc3RhbnRzIjsKKworICBpZiAobmVlZHNfY2xhc3MpIHsKKworICAgIGNvbnN0X2ludGVyZmFjZSA8PCBlbmRsOworCisgICAgY29uc3RfaW50ZXJmYWNlIDw8ICJAaW50ZXJmYWNlICIgPDwgY29uc3RhbnRzX2NsYXNzX25hbWUgPDwgIiA6IE5TT2JqZWN0ICI7CisgICAgc2NvcGVfdXAoY29uc3RfaW50ZXJmYWNlKTsKKyAgICBzY29wZV9kb3duKGNvbnN0X2ludGVyZmFjZSk7CisKKyAgICAvLyBnZXR0ZXIgbWV0aG9kIGZvciBlYWNoIGNvbnN0YW50IGRlZmluZWQuCisgICAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICAgIHN0cmluZyBuYW1lID0gKCpjX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgdF90eXBlKiB0eXBlID0gKCpjX2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfdHJ1ZV90eXBlKCk7CisgICAgICBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkgfHwgdHlwZS0+aXNfc3RydWN0KCkpIHsKKyAgICAgICAgdF90eXBlKiB0eXBlID0gKCpjX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgICBjb25zdF9pbnRlcmZhY2UgPDwgZW5kbCA8PCAiKyAoIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIikgIiA8PCBuYW1lIDw8ICI7IiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKworICAgIGNvbnN0X2ludGVyZmFjZSA8PCBlbmRsIDw8ICJAZW5kIjsKKyAgfQorCisgIC8vIHRoaXMgZ2V0cyBzcGl0IGludG8gdGhlIGhlYWRlciBmaWxlIGluIDo6Y2xvc2VfZ2VuZXJhdG9yCisgIGNvbnN0YW50c19kZWNsYXJhdGlvbnNfID0gY29uc3RfaW50ZXJmYWNlLnN0cigpOworCisgIGZfaW1wbF8gPDwgIk5TU3RyaW5nICoiIDw8IGNvY29hX3ByZWZpeF8gPDwgY2FwaXRhbGl6ZShwcm9ncmFtX25hbWVfKSA8PCAiRXJyb3JEb21haW4gPSAiCisgICAgICAgICAgPDwgIkBcIiIgPDwgY29jb2FfcHJlZml4XyA8PCBjYXBpdGFsaXplKHByb2dyYW1fbmFtZV8pIDw8ICJFcnJvckRvbWFpblwiOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIHZhcmlhYmxlcyBpbiB0aGUgLm0gaG9sZCBhbGwgc2ltcGxlIGNvbnN0YW50IHZhbHVlcworICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgeworICAgIHN0cmluZyBuYW1lID0gKCpjX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIHRfdHlwZSogdHlwZSA9ICgqY19pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICBmX2ltcGxfIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiICIgPDwgY29jb2FfcHJlZml4XyA8PCBuYW1lOworICAgIHRfdHlwZSogdHR5cGUgPSB0eXBlLT5nZXRfdHJ1ZV90eXBlKCk7CisgICAgaWYgKCF0dHlwZS0+aXNfY29udGFpbmVyKCkgJiYgIXR0eXBlLT5pc19zdHJ1Y3QoKSkgeworICAgICAgZl9pbXBsXyA8PCAiID0gIiA8PCByZW5kZXJfY29uc3RfdmFsdWUoZl9pbXBsXywgdHlwZSwgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSk7CisgICAgfQorICAgIGZfaW1wbF8gPDwgIjsiIDw8IGVuZGw7CisgIH0KKyAgZl9pbXBsXyA8PCBlbmRsOworCisgIGlmIChuZWVkc19jbGFzcykgeworCisgICAgZl9pbXBsXyA8PCAiQGltcGxlbWVudGF0aW9uICIgPDwgY29uc3RhbnRzX2NsYXNzX25hbWUgPDwgZW5kbCA8PCBlbmRsOworCisgICAgLy8gaW5pdGlhbGl6ZSBjb21wbGV4IGNvbnN0YW50cyB3aGVuIHRoZSBjbGFzcyBpcyBsb2FkZWQKKyAgICBmX2ltcGxfIDw8ICIrICh2b2lkKSBpbml0aWFsaXplICI7CisgICAgc2NvcGVfdXAoZl9pbXBsXyk7CisKKyAgICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgeworICAgICAgdF90eXBlKiB0dHlwZSA9ICgqY19pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X3RydWVfdHlwZSgpOworICAgICAgaWYgKHR0eXBlLT5pc19jb250YWluZXIoKSB8fCB0dHlwZS0+aXNfc3RydWN0KCkpIHsKKyAgICAgICAgZl9pbXBsXyA8PCBlbmRsOworICAgICAgICBwcmludF9jb25zdF92YWx1ZShmX2ltcGxfLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb2NvYV9wcmVmaXhfICsgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF90eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgICAgICAgZl9pbXBsXyA8PCAiOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgICAgc2NvcGVfZG93bihmX2ltcGxfKTsKKworICAgIC8vIGdldHRlciBtZXRob2QgZm9yIGVhY2ggY29uc3RhbnQKKyAgICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgeworICAgICAgc3RyaW5nIG5hbWUgPSAoKmNfaXRlciktPmdldF9uYW1lKCk7CisgICAgICB0X3R5cGUqIHR5cGUgPSAoKmNfaXRlciktPmdldF90eXBlKCktPmdldF90cnVlX3R5cGUoKTsKKyAgICAgIGlmICh0eXBlLT5pc19jb250YWluZXIoKSB8fCB0eXBlLT5pc19zdHJ1Y3QoKSkgeworICAgICAgICBmX2ltcGxfIDw8IGVuZGwgPDwgIisgKCIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIpICIgPDwgbmFtZSA8PCAiICI7CisgICAgICAgIHNjb3BlX3VwKGZfaW1wbF8pOworICAgICAgICBpbmRlbnQoZl9pbXBsXykgPDwgInJldHVybiAiIDw8IGNvY29hX3ByZWZpeF8gPDwgbmFtZSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgICAgc2NvcGVfZG93bihmX2ltcGxfKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBmX2ltcGxfIDw8ICJAZW5kIiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZGF0YSB0eXBlLiBUaGlzIGlzIGEgY2xhc3MKKyAqIHdpdGggcHJvdGVjdGVkIGRhdGEgbWVtYmVycywgcmVhZCgpLCB3cml0ZSgpLCBhbmQgZ2V0dGVycyBhbmQgc2V0dGVycy4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbnRlcmZhY2UoZl9oZWFkZXJfLCB0c3RydWN0LCBmYWxzZSk7CisgIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbXBsZW1lbnRhdGlvbihmX2ltcGxfLCB0c3RydWN0LCBmYWxzZSk7Cit9CisKKy8qKgorICogRXhjZXB0aW9ucyBhcmUgc3RydWN0cywgYnV0IHRoZXkgaW5oZXJpdCBmcm9tIE5TRXhjZXB0aW9uCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKKyAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2ludGVyZmFjZShmX2hlYWRlcl8sIHR4Y2VwdGlvbiwgdHJ1ZSk7CisgIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbXBsZW1lbnRhdGlvbihmX2ltcGxfLCB0eGNlcHRpb24sIHRydWUpOworfQorCisvKioKKyAqIEdlbmVyYXRlIHRoZSBpbnRlcmZhY2UgZm9yIGEgc3RydWN0CisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbnRlcmZhY2Uob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pIHsKKworICBpZiAoaXNfZXhjZXB0aW9uKSB7CisgICAgb3V0IDw8ICJlbnVtIHsiIDw8IGVuZGwKKyAgICAgICAgPDwgIiAgIiA8PCBjb2NvYV9wcmVmaXhfIDw8IGNhcGl0YWxpemUocHJvZ3JhbV9uYW1lXykgPDwgIkVycm9yIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICAiID0gLSIgPDwgZXJyb3JfY29uc3RhbnRfKysgPDwgZW5kbAorICAgICAgICA8PCAifTsiIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbDsKKyAgfQorCisgIG91dCA8PCAiQGludGVyZmFjZSAiIDw8IGNvY29hX3ByZWZpeF8gPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIDogIjsKKworICBpZiAoaXNfZXhjZXB0aW9uKSB7CisgICAgb3V0IDw8ICJOU0Vycm9yICI7CisgIH0gZWxzZSB7CisgICAgb3V0IDw8ICJOU09iamVjdCAiOworICB9CisgIG91dCA8PCAiPFRCYXNlLCBOU0NvZGluZywgTlNDb3B5aW5nPiAiIDw8IGVuZGw7CisKKyAgb3V0IDw8IGVuZGw7CisKKyAgLy8gcHJvcGVydGllcworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgeworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgZGVjbGFyZV9wcm9wZXJ0eSgqbV9pdGVyKSA8PCBlbmRsOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8IGRlY2xhcmVfcHJvcGVydHlfaXNzZXQoKm1faXRlcikgPDwgZW5kbDsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCBkZWNsYXJlX3Byb3BlcnR5X3Vuc2V0KCptX2l0ZXIpIDw8IGVuZGw7CisgICAgICBvdXQgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBvdXQgPDwgZW5kbDsKKworICAvLyBpbml0aWFsaXplciBmb3IgYWxsIGZpZWxkcworICBpZiAoIW1lbWJlcnMuZW1wdHkoKSkgeworICAgIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbml0aWFsaXplcl9zaWduYXR1cmUob3V0LCB0c3RydWN0KTsKKyAgICBvdXQgPDwgIjsiIDw8IGVuZGw7CisgIH0KKyAgb3V0IDw8IGVuZGw7CisKKyAgb3V0IDw8ICJAZW5kIiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGUgc2lnbmF0dXJlIGZvciBpbml0aWFsaXplciBvZiBzdHJ1Y3Qgd2l0aCBhIHBhcmFtZXRlciBmb3IKKyAqIGVhY2ggZmllbGQuCisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbml0aWFsaXplcl9zaWduYXR1cmUob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworICBpbmRlbnQob3V0KSA8PCAiLSAoaW5zdGFuY2V0eXBlKSBpbml0V2l0aCI7CisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTspIHsKKyAgICBpZiAobV9pdGVyID09IG1lbWJlcnMuYmVnaW4oKSkgeworICAgICAgb3V0IDw8IGNhcGl0YWxpemUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICB9CisgICAgb3V0IDw8ICI6ICgiIDw8IHR5cGVfbmFtZSgoKm1faXRlciktPmdldF90eXBlKCkpIDw8ICIpICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICsrbV9pdGVyOworICAgIGlmIChtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKSkgeworICAgICAgb3V0IDw8ICIgIjsKKyAgICB9CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZSB0aGUgaW5pdFdpdGhDb2RlciBtZXRob2QgZm9yIHRoaXMgc3RydWN0IHNvIGl0J3MgY29tcGF0aWJsZSB3aXRoCisgKiB0aGUgTlNDb2RpbmcgcHJvdG9jb2wKKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc3RydWN0X2luaXRfd2l0aF9jb2Rlcl9tZXRob2Qob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgeworCisgIGluZGVudChvdXQpIDw8ICItIChpbnN0YW5jZXR5cGUpIGluaXRXaXRoQ29kZXI6IChOU0NvZGVyICopIGRlY29kZXIiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgaWYgKGlzX2V4Y2VwdGlvbikgeworICAgIC8vIE5TRXhjZXB0aW9ucyBjb25mb3JtIHRvIE5TQ29kaW5nLCBzbyB3ZSBjYW4gY2FsbCBzdXBlcgorICAgIGluZGVudChvdXQpIDw8ICJzZWxmID0gW3N1cGVyIGluaXRXaXRoQ29kZXI6IGRlY29kZXJdOyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCAic2VsZiA9IFtzdXBlciBpbml0XTsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAiaWYgKHNlbGYpICI7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKFtkZWNvZGVyIGNvbnRhaW5zVmFsdWVGb3JLZXk6IEBcIiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIl0pIgorICAgICAgICA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJfIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICI7CisgICAgaWYgKHR5cGVfY2FuX2JlX251bGwodCkpIHsKKyAgICAgIG91dCA8PCAiW2RlY29kZXIgZGVjb2RlT2JqZWN0Rm9yS2V5OiBAXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdOyIKKyAgICAgICAgICA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAodC0+aXNfZW51bSgpKSB7CisgICAgICBvdXQgPDwgIltkZWNvZGVyIGRlY29kZUludEZvcktleTogQFwiIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiXTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0KS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgb3V0IDw8ICJbZGVjb2RlciBkZWNvZGVCb29sRm9yS2V5OiBAXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdOyIgPDwgZW5kbDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICBvdXQgPDwgIltkZWNvZGVyIGRlY29kZUludEZvcktleTogQFwiIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiXTsiIDw8IGVuZGw7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgIG91dCA8PCAiW2RlY29kZXIgZGVjb2RlSW50Rm9yS2V5OiBAXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdOyIgPDwgZW5kbDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgb3V0IDw8ICJbZGVjb2RlciBkZWNvZGVJbnQzMkZvcktleTogQFwiIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiXTsiIDw8IGVuZGw7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIG91dCA8PCAiW2RlY29kZXIgZGVjb2RlSW50NjRGb3JLZXk6IEBcIiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIl07IiA8PCBlbmRsOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICBvdXQgPDwgIltkZWNvZGVyIGRlY29kZURvdWJsZUZvcktleTogQFwiIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiXTsiIDw8IGVuZGw7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBkb24ndCBrbm93IGhvdyB0byBkZWNvZGUgdGhyaWZ0IHR5cGU6ICIKKyAgICAgICAgICAgICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgIH0KKyAgICB9CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJfIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIklzU2V0ID0gWUVTOyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKG91dCk7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gc2VsZjsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGUgdGhlIGVuY29kZVdpdGhDb2RlciBtZXRob2QgZm9yIHRoaXMgc3RydWN0IHNvIGl0J3MgY29tcGF0aWJsZSB3aXRoCisgKiB0aGUgTlNDb2RpbmcgcHJvdG9jb2wKKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc3RydWN0X2VuY29kZV93aXRoX2NvZGVyX21ldGhvZChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgeworCisgIGluZGVudChvdXQpIDw8ICItICh2b2lkKSBlbmNvZGVXaXRoQ29kZXI6IChOU0NvZGVyICopIGVuY29kZXIiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgaWYgKGlzX2V4Y2VwdGlvbikgeworICAgIC8vIE5TRXhjZXB0aW9ucyBjb25mb3JtIHRvIE5TQ29kaW5nLCBzbyB3ZSBjYW4gY2FsbCBzdXBlcgorICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW3N1cGVyIGVuY29kZVdpdGhDb2RlcjogZW5jb2Rlcl07IiA8PCBlbmRsOworICB9CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKF8iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiSXNTZXQpIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgaWYgKHR5cGVfY2FuX2JlX251bGwodCkpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW2VuY29kZXIgZW5jb2RlT2JqZWN0OiBfIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiBmb3JLZXk6IEBcIiIKKyAgICAgICAgICA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiXTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmICh0LT5pc19lbnVtKCkpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW2VuY29kZXIgZW5jb2RlSW50OiBfIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiBmb3JLZXk6IEBcIiIKKyAgICAgICAgICA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiXTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0KS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJbZW5jb2RlciBlbmNvZGVCb29sOiBfIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiBmb3JLZXk6IEBcIiIKKyAgICAgICAgICAgIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdOyIgPDwgZW5kbDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltlbmNvZGVyIGVuY29kZUludDogXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZm9yS2V5OiBAXCIiCisgICAgICAgICAgICA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiXTsiIDw8IGVuZGw7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW2VuY29kZXIgZW5jb2RlSW50OiBfIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiBmb3JLZXk6IEBcIiIKKyAgICAgICAgICAgIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdOyIgPDwgZW5kbDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJbZW5jb2RlciBlbmNvZGVJbnQzMjogXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZm9yS2V5OiBAXCIiCisgICAgICAgICAgICA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiXTsiIDw8IGVuZGw7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW2VuY29kZXIgZW5jb2RlSW50NjQ6IF8iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZvcktleTogQFwiIgorICAgICAgICAgICAgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIl07IiA8PCBlbmRsOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltlbmNvZGVyIGVuY29kZURvdWJsZTogXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZm9yS2V5OiBAXCIiCisgICAgICAgICAgICA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiXTsiIDw8IGVuZGw7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBkb24ndCBrbm93IGhvdyB0byBlbmNvZGUgdGhyaWZ0IHR5cGU6ICIKKyAgICAgICAgICAgICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgIH0KKyAgICB9CisgICAgc2NvcGVfZG93bihvdXQpOworICB9CisKKyAgc2NvcGVfZG93bihvdXQpOworICBvdXQgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZSB0aGUgY29weSBtZXRob2QgZm9yIHRoaXMgc3RydWN0CisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3N0cnVjdF9jb3B5X21ldGhvZChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbikgeworICBvdXQgPDwgaW5kZW50KCkgPDwgIi0gKGluc3RhbmNldHlwZSkgY29weVdpdGhab25lOihOU1pvbmUgKil6b25lIiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworCisgIGlmIChpc19leGNlcHRpb24pIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIgdmFsID0gWyIgPDwgY29jb2FfcHJlZml4XyA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgZXJyb3JXaXRoRG9tYWluOiBzZWxmLmRvbWFpbiBjb2RlOiBzZWxmLmNvZGUgdXNlckluZm86IHNlbGYudXNlckluZm9dOyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIgdmFsID0gWyIgPDwgY29jb2FfcHJlZml4XyA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgbmV3XTsiIDw8IGVuZGw7CisgIH0KKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJJc1NldCkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0KSkgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YWwuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9IFtzZWxmLiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgY29weV07IjsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YWwuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9IHNlbGYuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIjsiOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKG91dCk7CisgIH0KKworICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiB2YWw7IiA8PCBlbmRsOworCisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGUgdGhlIGhhc2ggbWV0aG9kIGZvciB0aGlzIHN0cnVjdAorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaGFzaF9tZXRob2Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpbmRlbnQob3V0KSA8PCAiLSAoTlNVSW50ZWdlcikgaGFzaCIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJOU1VJbnRlZ2VyIGhhc2ggPSAxNzsiIDw8IGVuZGw7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaGFzaCA9IChoYXNoICogMzEpIF4gXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgIDw8ICJJc1NldCA/IDI2NTQ0MzU3NjEgOiAwOyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChfIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIklzU2V0KSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChvdXQpOworICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKHQpKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImhhc2ggPSAoaGFzaCAqIDMxKSBeIFtfIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiBoYXNoXTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaGFzaCA9IChoYXNoICogMzEpIF4gW0AoXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIGhhc2hdOyIKKyAgICAgICAgICA8PCBlbmRsOworICAgIH0KKyAgICBzY29wZV9kb3duKG91dCk7CisgIH0KKworICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBoYXNoOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihvdXQpOworICBvdXQgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZSB0aGUgaXNFcXVhbCBtZXRob2QgZm9yIHRoaXMgc3RydWN0CisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3N0cnVjdF9pc19lcXVhbF9tZXRob2Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pIHsKKyAgaW5kZW50KG91dCkgPDwgIi0gKEJPT0wpIGlzRXF1YWw6IChpZCkgYW5PYmplY3QiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgaW5kZW50KG91dCkgPDwgImlmIChzZWxmID09IGFuT2JqZWN0KSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgInJldHVybiBZRVM7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICBzdHJpbmcgY2xhc3NfbmFtZSA9IGNvY29hX3ByZWZpeF8gKyB0c3RydWN0LT5nZXRfbmFtZSgpOworCisgIGlmIChpc19leGNlcHRpb24pIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCFbc3VwZXIgaXNFcXVhbDphbk9iamVjdF0pIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgInJldHVybiBOTzsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICB9CisgIGVsc2UgeworICAgIGluZGVudChvdXQpIDw8ICJpZiAoIVthbk9iamVjdCBpc0tpbmRPZkNsYXNzOlsiIDw8IGNsYXNzX25hbWUgPDwgIiBjbGFzc11dKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gTk87IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGlmICghbWVtYmVycy5lbXB0eSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgY2xhc3NfbmFtZSA8PCAiICpvdGhlciA9ICgiIDw8IGNsYXNzX25hbWUgPDwgIiAqKWFuT2JqZWN0OyIgPDwgZW5kbDsKKworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICAgIHN0cmluZyBuYW1lID0gKCptX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgaWYgKHR5cGVfY2FuX2JlX251bGwodCkpIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoKF8iIDw8IG5hbWUgPDwgIklzU2V0ICE9IG90aGVyLT5fIiA8PCBuYW1lIDw8ICJJc1NldCkgfHwiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgICAgIgorICAgICAgICAgICAgPDwgIihfIiA8PCBuYW1lIDw8ICJJc1NldCAmJiAiCisgICAgICAgICAgICA8PCAiKChfIiA8PCBuYW1lIDw8ICIgfHwgb3RoZXItPl8iIDw8IG5hbWUgPDwgIikgJiYgIgorICAgICAgICAgICAgPDwgIiFbXyIgPDwgbmFtZSA8PCAiIGlzRXF1YWw6b3RoZXItPl8iIDw8IG5hbWUgPDwgIl0pKSkgeyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKChfIiA8PCBuYW1lIDw8ICJJc1NldCAhPSBvdGhlci0+XyIgPDwgbmFtZSA8PCAiSXNTZXQpIHx8IiA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICAgICIKKyAgICAgICAgICAgIDw8ICIoXyIgPDwgbmFtZSA8PCAiSXNTZXQgJiYgIgorICAgICAgICAgICAgPDwgIihfIiA8PCBuYW1lIDw8ICIgIT0gb3RoZXItPl8iIDw8IG5hbWUgPDwgIikpKSB7IiA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIE5POyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBZRVM7IiA8PCBlbmRsOworICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlIHN0cnVjdCBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCAgICAgIFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICogQHBhcmFtIGlzX2V4Y2VwdGlvbiBJcyB0aGlzIGFuIGV4Y2VwdGlvbj8KKyAqIEBwYXJhbSBpc19yZXN1bHQgICAgSWYgdGhpcyBpcyBhIHJlc3VsdCBpdCBuZWVkcyBhIGRpZmZlcmVudCB3cml0ZXIKKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc3RydWN0X2ltcGxlbWVudGF0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCkgeworICBpbmRlbnQob3V0KSA8PCAiQGltcGxlbWVudGF0aW9uICIgPDwgY29jb2FfcHJlZml4XyA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8IGVuZGwgPDwgZW5kbDsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIC8vIGV4Y2VwdGlvbnMgbmVlZCB0byBjYWxsIHRoZSBkZXNpZ25hdGVkIGluaXRpYWxpemVyIG9uIE5TRXhjZXB0aW9uCisgIGlmIChpc19leGNlcHRpb24pIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIi0gKGluc3RhbmNldHlwZSkgaW5pdCIgPDwgZW5kbDsKKyAgICBzY29wZV91cChvdXQpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIFtzdXBlciBpbml0V2l0aERvbWFpbjogIiA8PCBjb2NvYV9wcmVmaXhfIDw8IGNhcGl0YWxpemUocHJvZ3JhbV9uYW1lXykgPDwgIkVycm9yRG9tYWluIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiAiIDw8IGNvY29hX3ByZWZpeF8gPDwgY2FwaXRhbGl6ZShwcm9ncmFtX25hbWVfKSA8PCAiRXJyb3IiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICAgICAgICAgICAgICAgICAgICB1c2VySW5mbzogbmlsXTsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihvdXQpOworICAgIG91dCA8PCBlbmRsOworICB9IGVsc2UgeworICAgIC8vIHN0cnVjdAorCisgICAgLy8gZGVmYXVsdCBpbml0aWFsaXplcgorICAgIC8vIHNldHVwIGluc3RhbmNlIHZhcmlhYmxlcyB3aXRoIGRlZmF1bHQgdmFsdWVzCisgICAgaW5kZW50KG91dCkgPDwgIi0gKGluc3RhbmNldHlwZSkgaW5pdCIgPDwgZW5kbDsKKyAgICBzY29wZV91cChvdXQpOworICAgIGluZGVudChvdXQpIDw8ICJzZWxmID0gW3N1cGVyIGluaXRdOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKHNlbGYpIjsKKyAgICBzY29wZV91cChvdXQpOworICAgIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKKyAgICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOworICAgICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7CisgICAgICAgICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZWxmLiIgKyAoKm1faXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKm1faXRlciktPmdldF92YWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBzY29wZV9kb3duKG91dCk7CisgICAgaW5kZW50KG91dCkgPDwgInJldHVybiBzZWxmOyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKG91dCk7CisgICAgb3V0IDw8IGVuZGw7CisgIH0KKworICAvLyBpbml0aWFsaXplciB3aXRoIGFsbCBmaWVsZHMgYXMgcGFyYW1zCisgIGlmICghbWVtYmVycy5lbXB0eSgpKSB7CisgICAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2luaXRpYWxpemVyX3NpZ25hdHVyZShvdXQsIHRzdHJ1Y3QpOworICAgIG91dCA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgaWYgKGlzX2V4Y2VwdGlvbikgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJzZWxmID0gW3NlbGYgaW5pdF07IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInNlbGYgPSBbc3VwZXIgaW5pdF07IiA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudChvdXQpIDw8ICJpZiAoc2VsZikiOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJfIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICI7CisgICAgICBpZiAoZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpLT5pc19jb250YWluZXIoKSkgeworICAgICAgICBvdXQgPDwgIlsiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIG11dGFibGVDb3B5XTsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOworICAgICAgfQorICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJfIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIklzU2V0ID0gWUVTOyIgPDwgZW5kbDsKKyAgICB9CisgICAgc2NvcGVfZG93bihvdXQpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gc2VsZjsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihvdXQpOworICAgIG91dCA8PCBlbmRsOworICB9CisKKyAgLy8gaW5pdFdpdGhDb2RlciBmb3IgTlNDb2RpbmcKKyAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2luaXRfd2l0aF9jb2Rlcl9tZXRob2Qob3V0LCB0c3RydWN0LCBpc19leGNlcHRpb24pOworICAvLyBlbmNvZGVXaXRoQ29kZXIgZm9yIE5TQ29kaW5nCisgIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9lbmNvZGVfd2l0aF9jb2Rlcl9tZXRob2Qob3V0LCB0c3RydWN0LCBpc19leGNlcHRpb24pOworICAvLyBoYXNoIGFuZCBpc0VxdWFsIGZvciBOU09iamVjdAorICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaGFzaF9tZXRob2Qob3V0LCB0c3RydWN0KTsKKyAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2lzX2VxdWFsX21ldGhvZChvdXQsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7CisgIC8vIGNvcHkgZm9yIE5TT2JqZWN0CisgIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9jb3B5X21ldGhvZChvdXQsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7CisKKyAgLy8gdGhlIHJlc3Qgb2YgdGhlIG1ldGhvZHMKKyAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2ZpZWxkX2FjY2Vzc29yX2ltcGxlbWVudGF0aW9ucyhvdXQsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7CisgIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9yZWFkZXIob3V0LCB0c3RydWN0KTsKKyAgaWYgKGlzX3Jlc3VsdCkgeworICAgIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9yZXN1bHRfd3JpdGVyKG91dCwgdHN0cnVjdCk7CisgIH0gZWxzZSB7CisgICAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOworICB9CisgIGdlbmVyYXRlX2NvY29hX3N0cnVjdF92YWxpZGF0b3Iob3V0LCB0c3RydWN0KTsKKyAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2Rlc2NyaXB0aW9uKG91dCwgdHN0cnVjdCk7CisKKyAgb3V0IDw8ICJAZW5kIiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gcmVhZCBhbGwgdGhlIGZpZWxkcyBvZiB0aGUgc3RydWN0LgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfcmVhZGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgb3V0IDw8ICItIChCT09MKSByZWFkOiAoaWQgPFRQcm90b2NvbD4pIGluUHJvdG9jb2wgZXJyb3I6IChOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKilfX3RocmlmdEVycm9yIiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAvLyBEZWNsYXJlIHN0YWNrIHRtcCB2YXJpYWJsZXMKKyAgaW5kZW50KG91dCkgPDwgIk5TU3RyaW5nICogZmllbGROYW1lOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIlNJbnQzMiBmaWVsZFR5cGU7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiU0ludDMyIGZpZWxkSUQ7IiA8PCBlbmRsOworICBvdXQgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAiaWYgKCFbaW5Qcm90b2NvbCByZWFkU3RydWN0QmVnaW5SZXR1cm5pbmdOYW1lOiBOVUxMIGVycm9yOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKworICAvLyBMb29wIG92ZXIgcmVhZGluZyBpbiBmaWVsZHMKKyAgaW5kZW50KG91dCkgPDwgIndoaWxlICh0cnVlKSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKworICAvLyBSZWFkIGJlZ2lubmluZyBmaWVsZCBtYXJrZXIKKyAgaW5kZW50KG91dCkKKyAgICAgIDw8ICJpZiAoIVtpblByb3RvY29sIHJlYWRGaWVsZEJlZ2luUmV0dXJuaW5nTmFtZTogJmZpZWxkTmFtZSB0eXBlOiAmZmllbGRUeXBlIGZpZWxkSUQ6ICZmaWVsZElEIGVycm9yOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIKKyAgICAgIDw8IGVuZGw7CisKKyAgLy8gQ2hlY2sgZm9yIGZpZWxkIFNUT1AgbWFya2VyIGFuZCBicmVhaworICBpbmRlbnQob3V0KSA8PCAiaWYgKGZpZWxkVHlwZSA9PSBUVHlwZVNUT1ApIHsgIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgLy8gU3dpdGNoIHN0YXRlbWVudCBvbiB0aGUgZmllbGQgd2UgYXJlIHJlYWRpbmcKKyAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmllbGRJRCkiIDw8IGVuZGw7CisKKyAgc2NvcGVfdXAob3V0KTsKKworICAvLyBHZW5lcmF0ZSBkZXNlcmlhbGl6YXRpb24gY29kZSBmb3Iga25vd24gY2FzZXMKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICI6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJpZiAoZmllbGRUeXBlID09ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIikgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgImZpZWxkVmFsdWUiKTsKKyAgICBpbmRlbnQob3V0KSA8PCBjYWxsX2ZpZWxkX3NldHRlcigqZl9pdGVyLCAiZmllbGRWYWx1ZSIpIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsgIiA8PCBlbmRsOworICAgIGlmIChsb2dfdW5leHBlY3RlZF8pIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBOU0xvZyhAXCIlczogZmllbGQgSUQgJWkgaGFzIHVuZXhwZWN0ZWQgdHlwZSAlaS4gIFNraXBwaW5nLlwiLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIl9fUFJFVFRZX0ZVTkNUSU9OX18sIChpbnQpZmllbGRJRCwgKGludClmaWVsZFR5cGUpOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgaWYgKCFbVFByb3RvY29sVXRpbCBza2lwVHlwZTogZmllbGRUeXBlIG9uUHJvdG9jb2w6IGluUHJvdG9jb2wgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICAvLyBJbiB0aGUgZGVmYXVsdCBjYXNlIHdlIHNraXAgdGhlIGZpZWxkCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7CisgIGlmIChsb2dfdW5leHBlY3RlZF8pIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgTlNMb2coQFwiJXM6IHVuZXhwZWN0ZWQgZmllbGQgSUQgJWkgd2l0aCB0eXBlICVpLiAgU2tpcHBpbmcuXCIsICIKKyAgICAgICAgICAgICAgICAgICAgICAgIl9fUFJFVFRZX0ZVTkNUSU9OX18sIChpbnQpZmllbGRJRCwgKGludClmaWVsZFR5cGUpOyIgPDwgZW5kbDsKKyAgfQorCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBpZiAoIVtUUHJvdG9jb2xVdGlsIHNraXBUeXBlOiBmaWVsZFR5cGUgb25Qcm90b2NvbDogaW5Qcm90b2NvbCBlcnJvcjogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgIGJyZWFrOyIgPDwgZW5kbDsKKworICBzY29wZV9kb3duKG91dCk7CisKKyAgLy8gUmVhZCBmaWVsZCBlbmQgbWFya2VyCisgIGluZGVudChvdXQpIDw8ICJpZiAoIVtpblByb3RvY29sIHJlYWRGaWVsZEVuZDogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisKKyAgc2NvcGVfZG93bihvdXQpOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCFbaW5Qcm90b2NvbCByZWFkU3RydWN0RW5kOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKworICAvLyBwZXJmb3JtcyB2YXJpb3VzIGNoZWNrcyAoZS5nLiBjaGVjayB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHNldCkKKyAgaWYgKHZhbGlkYXRlX3JlcXVpcmVkXykgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCFbc2VsZiB2YWxpZGF0ZTogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIFlFUzsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gd3JpdGUgYWxsIHRoZSBmaWVsZHMgb2YgdGhlIHN0cnVjdAorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3Rfd3JpdGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICItIChCT09MKSB3cml0ZTogKGlkIDxUUHJvdG9jb2w+KSBvdXRQcm90b2NvbCBlcnJvcjogKE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKV9fdGhyaWZ0RXJyb3IgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIVtvdXRQcm90b2NvbCB3cml0ZVN0cnVjdEJlZ2luV2l0aE5hbWU6IEBcIiIgPDwgbmFtZSA8PCAiXCIgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoXyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJJc1NldCkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBib29sIG51bGxfYWxsb3dlZCA9IHR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICBpZiAobnVsbF9hbGxvd2VkKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiAhPSBuaWwpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICB9CisKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCFbb3V0UHJvdG9jb2wgd3JpdGVGaWVsZEJlZ2luV2l0aE5hbWU6IEBcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgPDwgIlwiIHR5cGU6ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkKKyAgICAgICAgICAgICAgICA8PCAiIGZpZWxkSUQ6ICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIiBlcnJvcjogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisKKyAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJfIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSk7CisKKyAgICAvLyBXcml0ZSBmaWVsZCBjbG9zZXIKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCFbb3V0UHJvdG9jb2wgd3JpdGVGaWVsZEVuZDogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisKKyAgICBpZiAobnVsbF9hbGxvd2VkKSB7CisgICAgICBzY29wZV9kb3duKG91dCk7CisgICAgfQorICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgfQorICAvLyBXcml0ZSB0aGUgc3RydWN0IG1hcAorICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghW291dFByb3RvY29sIHdyaXRlRmllbGRTdG9wOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgImlmICghW291dFByb3RvY29sIHdyaXRlU3RydWN0RW5kOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIFlFUzsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gd3JpdGUgYWxsIHRoZSBmaWVsZHMgb2YgdGhlIHN0cnVjdCwgd2hpY2gKKyAqIGlzIGEgZnVuY3Rpb24gcmVzdWx0LiBUaGVzZSBmaWVsZHMgYXJlIG9ubHkgd3JpdHRlbiBpZiB0aGV5IGFyZQorICogc2V0LCBhbmQgb25seSBvbmUgb2YgdGhlbSBjYW4gYmUgc2V0IGF0IGEgdGltZS4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc3RydWN0X3Jlc3VsdF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBvdXQgPDwgaW5kZW50KCkgPDwgIi0gKEJPT0wpIHdyaXRlOiAoaWQgPFRQcm90b2NvbD4pIG91dFByb3RvY29sIGVycm9yOiAoTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopX190aHJpZnRFcnJvciB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghW291dFByb3RvY29sIHdyaXRlU3RydWN0QmVnaW5XaXRoTmFtZTogQFwiIiA8PCBuYW1lIDw8ICJcIiBlcnJvcjogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlmICI7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCAiIGVsc2UgaWYgIjsKKyAgICB9CisKKyAgICBvdXQgPDwgIihfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIklzU2V0KSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgYm9vbCBudWxsX2FsbG93ZWQgPSB0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgaWYgKG51bGxfYWxsb3dlZCkgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoXyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIT0gbmlsKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorCisgICAgaW5kZW50KG91dCkgPDwgImlmICghW291dFByb3RvY29sIHdyaXRlRmllbGRCZWdpbldpdGhOYW1lOiBAXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgIDw8ICJcIiB0eXBlOiAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpCisgICAgICAgICAgICAgICAgPDwgIiBmaWVsZElEOiAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICIgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworCisgICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAiXyIgKyAoKmZfaXRlciktPmdldF9uYW1lKCkpOworCisgICAgLy8gV3JpdGUgZmllbGQgY2xvc2VyCisgICAgaW5kZW50KG91dCkgPDwgImlmICghW291dFByb3RvY29sIHdyaXRlRmllbGRFbmQ6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworCisgICAgaWYgKG51bGxfYWxsb3dlZCkgeworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iOworICB9CisgIC8vIFdyaXRlIHRoZSBzdHJ1Y3QgbWFwCisgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpZiAoIVtvdXRQcm90b2NvbCB3cml0ZUZpZWxkU3RvcDogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiCisgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpZiAoIVtvdXRQcm90b2NvbCB3cml0ZVN0cnVjdEVuZDogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiCisgICAgICA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gWUVTOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbiB0byBwZXJmb3JtIHZhcmlvdXMgY2hlY2tzCisgKiAoZS5nLiBjaGVjayB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHNldCkKKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc3RydWN0X3ZhbGlkYXRvcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiLSAoQk9PTCkgdmFsaWRhdGU6IChOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKilfX3RocmlmdEVycm9yIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgIi8vIGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMiIDw8IGVuZGw7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAoKmZfaXRlcik7CisgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCFfIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiSXNTZXQpICI7CisgICAgICBzY29wZV91cChvdXQpOworICAgICAgaW5kZW50KG91dCkgPDwgImlmIChfX3RocmlmdEVycm9yKSAiOworICAgICAgc2NvcGVfdXAob3V0KTsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiKl9fdGhyaWZ0RXJyb3IgPSBbTlNFcnJvciBlcnJvcldpdGhEb21haW46IFRQcm90b2NvbEVycm9yRG9tYWluIiA8PCBlbmRsCisgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBUUHJvdG9jb2xFcnJvclVua25vd24iIDw8IGVuZGwKKyAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckluZm86IEB7VFByb3RvY29sRXJyb3JFeHRlbmRlZEVycm9yS2V5OiBAKFRQcm90b2NvbEV4dGVuZGVkRXJyb3JNaXNzaW5nUmVxdWlyZWRGaWVsZCksIiA8PCBlbmRsCisgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEVycm9yRmllbGROYW1lS2V5OiBAXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJ9XTsiIDw8IGVuZGw7CisgICAgICBzY29wZV9kb3duKG91dCk7CisgICAgICBzY29wZV9kb3duKG91dCk7CisgICAgfQorICB9CisgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gWUVTOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGUgcHJvcGVydHkgYWNjZXNzb3IgbWV0aG9kcyBmb3IgYWxsIGZpZWxkcyBpbiB0aGUgc3RydWN0LgorICogZ2V0dGVyLCBzZXR0ZXIsIGlzc2V0IGdldHRlci4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc3RydWN0X2ZpZWxkX2FjY2Vzc29yX2ltcGxlbWVudGF0aW9ucyhvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgeworICAodm9pZClpc19leGNlcHRpb247CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICpmX2l0ZXI7CisgICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZShmaWVsZC0+Z2V0X3R5cGUoKSk7CisgICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9IGZpZWxkLT5nZXRfbmFtZSgpOworICAgIHN0ZDo6c3RyaW5nIGNhcF9uYW1lID0gZmllbGRfbmFtZTsKKyAgICBjYXBfbmFtZVswXSA9IHRvdXBwZXIoY2FwX25hbWVbMF0pOworCisgICAgLy8gU2ltcGxlIHNldHRlcgorICAgIGluZGVudChvdXQpIDw8ICItICh2b2lkKSBzZXQiIDw8IGNhcF9uYW1lIDw8ICI6ICgiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIikgIiA8PCBmaWVsZF9uYW1lCisgICAgICAgICAgICAgICAgPDwgIiB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJfIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSAiIDw8IGZpZWxkX25hbWUgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIl8iIDw8IGZpZWxkX25hbWUgPDwgIklzU2V0ID0gWUVTOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAvLyBVbnNldHRlciAtIGRvIHdlIG5lZWQgdGhpcz8KKyAgICBpbmRlbnQob3V0KSA8PCAiLSAodm9pZCkgdW5zZXQiIDw8IGNhcF9uYW1lIDw8ICIgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0eXBlKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIl8iIDw8IGZpZWxkX25hbWUgPDwgIiA9IG5pbDsiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudChvdXQpIDw8ICJfIiA8PCBmaWVsZF9uYW1lIDw8ICJJc1NldCA9IE5POyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBkZXNjcmlwdGlvbiBtZXRob2QgZm9yIHRoZSBnaXZlbiBzdHJ1Y3QKKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc3RydWN0X2Rlc2NyaXB0aW9uKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKworICAvLyBBbGxvdyB1c2Ugb2YgZGVidWdEZXNjcmlwdGlvbiBzbyB0aGUgYXBwIGNhbiBhZGQgZGVzY3JpcHRpb24gdmlhIGEgY2F0ZW9nb3J5L2V4dGVuc2lvbgorICBpZiAoZGVidWdfZGVzY3JpcHRpb25zXykgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiLSAoTlNTdHJpbmcgKikgZGVidWdEZXNjcmlwdGlvbiB7IiA8PCBlbmRsOworICB9CisgIGVsc2UgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiLSAoTlNTdHJpbmcgKikgZGVzY3JpcHRpb24geyIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfdXAoKTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgIk5TTXV0YWJsZVN0cmluZyAqIG1zID0gW05TTXV0YWJsZVN0cmluZyBzdHJpbmdXaXRoU3RyaW5nOiBAXCIiCisgICAgICA8PCBjb2NvYV9wcmVmaXhfIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIihcIl07IiA8PCBlbmRsOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgaW5kZW50KG91dCkgPDwgIlttcyBhcHBlbmRTdHJpbmc6IEBcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI6XCJdOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgIlttcyBhcHBlbmRTdHJpbmc6IEBcIiwiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOlwiXTsiIDw8IGVuZGw7CisgICAgfQorICAgIHRfdHlwZSogdHR5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgaW5kZW50KG91dCkgPDwgIlttcyBhcHBlbmRGb3JtYXQ6IEBcIiIgPDwgZm9ybWF0X3N0cmluZ19mb3JfdHlwZSh0dHlwZSkgPDwgIlwiLCAiCisgICAgICAgICAgICAgICAgPDwgZm9ybWF0X2Nhc3RfZm9yX3R5cGUodHR5cGUpIDw8ICJfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIl07IiA8PCBlbmRsOworICB9CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiW21zIGFwcGVuZFN0cmluZzogQFwiKVwiXTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJyZXR1cm4gW05TU3RyaW5nIHN0cmluZ1dpdGhTdHJpbmc6IG1zXTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSB0aHJpZnQgc2VydmljZS4gIEluIE9iamVjdGl2ZS1DIHRoaXMgY29uc2lzdHMgb2YgYQorICogcHJvdG9jb2wgZGVmaW5pdGlvbiwgYSBjbGllbnQgaW50ZXJmYWNlIGFuZCBhIGNsaWVudCBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9wcm90b2NvbChmX2hlYWRlcl8sIHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfaW50ZXJmYWNlKGZfaGVhZGVyXywgdHNlcnZpY2UpOworICBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX3NlcnZlcl9pbnRlcmZhY2UoZl9oZWFkZXJfLCB0c2VydmljZSk7CisgIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7CisgIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X2ltcGxlbWVudGF0aW9uKGZfaW1wbF8sIHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9zZXJ2ZXJfaW1wbGVtZW50YXRpb24oZl9pbXBsXywgdHNlcnZpY2UpOworICBpZiAoYXN5bmNfY2xpZW50c18pIHsKKyAgICBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2FzeW5jX3Byb3RvY29sKGZfaGVhZGVyXywgdHNlcnZpY2UpOworICAgIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X2FzeW5jX2ludGVyZmFjZShmX2hlYWRlcl8sIHRzZXJ2aWNlKTsKKyAgICBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9hc3luY19pbXBsZW1lbnRhdGlvbihmX2ltcGxfLCB0c2VydmljZSk7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgc3RydWN0cyBmb3IgYWxsIHRoZSBzZXJ2aWNlIHJldHVybiB0eXBlcworICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZQorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSkgeworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKworICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKworICAgIHN0cmluZyBxbmFtZSA9IGZ1bmN0aW9uX2FyZ3NfaGVscGVyX3N0cnVjdF90eXBlKHRzZXJ2aWNlLCAqZl9pdGVyKTsKKworICAgIHRfc3RydWN0IHFuYW1lX3RzID0gdF9zdHJ1Y3QodHMtPmdldF9wcm9ncmFtKCksIHFuYW1lKTsKKworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0cy0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgcW5hbWVfdHMuYXBwZW5kKCptX2l0ZXIpOworICAgIH0KKworICAgIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbnRlcmZhY2UoZl9pbXBsXywgJnFuYW1lX3RzLCBmYWxzZSk7CisgICAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2ltcGxlbWVudGF0aW9uKGZfaW1wbF8sICZxbmFtZV90cywgZmFsc2UsIGZhbHNlKTsKKyAgICBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRzZXJ2aWNlLCAqZl9pdGVyKTsKKyAgfQorfQorCitzdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OmZ1bmN0aW9uX3Jlc3VsdF9oZWxwZXJfc3RydWN0X3R5cGUodF9zZXJ2aWNlICp0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgcmV0dXJuIHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIl8iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpOworICB9IGVsc2UgeworICAgIHJldHVybiB0c2VydmljZS0+Z2V0X25hbWUoKSArICJfIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKKyAgfQorfQorCitzdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OmZ1bmN0aW9uX2FyZ3NfaGVscGVyX3N0cnVjdF90eXBlKHRfc2VydmljZSAqdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICByZXR1cm4gdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiXyIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX2FyZ3MiOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBhbmQgaGVscGVycyBmb3IgYSBmdW5jdGlvbi4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbgorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRfc2VydmljZSAqdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIHJldHVybjsKKyAgfQorCisgIC8vIGNyZWF0ZSBhIHJlc3VsdCBzdHJ1Y3Qgd2l0aCBhIHN1Y2Nlc3MgZmllbGQgb2YgdGhlIHJldHVybiB0eXBlLAorICAvLyBhbmQgYSBmaWVsZCBmb3IgZWFjaCB0eXBlIG9mIGV4Y2VwdGlvbiB0aHJvd24KKyAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCBmdW5jdGlvbl9yZXN1bHRfaGVscGVyX3N0cnVjdF90eXBlKHRzZXJ2aWNlLCB0ZnVuY3Rpb24pKTsKKyAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKKyAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOworICB9CisKKyAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgcmVzdWx0LmFwcGVuZCgqZl9pdGVyKTsKKyAgfQorCisgIC8vIGdlbmVyYXRlIHRoZSByZXN1bHQgc3RydWN0CisgIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbnRlcmZhY2UoZl9pbXBsXywgJnJlc3VsdCwgZmFsc2UpOworICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW1wbGVtZW50YXRpb24oZl9pbXBsXywgJnJlc3VsdCwgZmFsc2UsIHRydWUpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgcHJvdG9jb2wgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBwcm90b2NvbCBkZWZpbml0aW9uIGZvcgorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX3Byb3RvY29sKG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBvdXQgPDwgIkBwcm90b2NvbCAiIDw8IGNvY29hX3ByZWZpeF8gPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIiA8TlNPYmplY3Q+IiA8PCBlbmRsOworCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIG91dCA8PCAiLSAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCB0cnVlKSA8PCAiOyIKKyAgICAgICAgPDwgIiAgLy8gdGhyb3dzICI7CisgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgIG91dCA8PCB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpKSArICIsICI7CisgICAgfQorICAgIG91dCA8PCAiVEV4Y2VwdGlvbiIgPDwgZW5kbDsKKyAgfQorICBvdXQgPDwgIkBlbmQiIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYW4gYXN5bmNocm9ub3VzIHNlcnZpY2UgcHJvdG9jb2wgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBwcm90b2NvbCBkZWZpbml0aW9uIGZvcgorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2FzeW5jX3Byb3RvY29sKG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBvdXQgPDwgIkBwcm90b2NvbCAiIDw8IGNvY29hX3ByZWZpeF8gPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIkFzeW5jIgorICAgICAgPDwgIiA8TlNPYmplY3Q+IiA8PCBlbmRsOworCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIG91dCA8PCAiLSAiIDw8IGFzeW5jX2Z1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCBmYWxzZSkgPDwgIjsiIDw8IGVuZGw7CisgICAgaWYgKHByb21pc2Vfa2l0XykgeworICAgICAgb3V0IDw8ICItICIgPDwgcHJvbWlzZV9mdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICB9CisgIG91dCA8PCAiQGVuZCIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGludGVyZmFjZSBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGNsaWVudCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmb3IKKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfaW50ZXJmYWNlKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIG91dCA8PCAiQGludGVyZmFjZSAiIDw8IGNvY29hX3ByZWZpeF8gPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIkNsaWVudCA6IFRCYXNlQ2xpZW50IDwiCisgICAgICA8PCBjb2NvYV9wcmVmaXhfIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICI+ICIgPDwgZW5kbDsKKworICBvdXQgPDwgIi0gKGlkKSBpbml0V2l0aFByb3RvY29sOiAoaWQgPFRQcm90b2NvbD4pIHByb3RvY29sOyIgPDwgZW5kbDsKKyAgb3V0IDw8ICItIChpZCkgaW5pdFdpdGhJblByb3RvY29sOiAoaWQgPFRQcm90b2NvbD4pIGluUHJvdG9jb2wgb3V0UHJvdG9jb2w6IChpZCA8VFByb3RvY29sPikgIgorICAgICAgICAgIm91dFByb3RvY29sOyIgPDwgZW5kbDsKKyAgb3V0IDw8ICJAZW5kIiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgaW50ZXJmYWNlIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgY2xpZW50IGludGVyZmFjZSBkZWZpbml0aW9uIGZvcgorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9hc3luY19pbnRlcmZhY2Uob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgb3V0IDw8ICJAaW50ZXJmYWNlICIgPDwgY29jb2FfcHJlZml4XyA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiQ2xpZW50QXN5bmMgOiBUQmFzZUNsaWVudCA8IgorICAgICAgPDwgY29jb2FfcHJlZml4XyA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiQXN5bmM+ICIgPDwgZW5kbAorICAgICAgPDwgZW5kbDsKKworICBvdXQgPDwgIi0gKGlkKSBpbml0V2l0aFByb3RvY29sRmFjdG9yeTogKGlkIDxUUHJvdG9jb2xGYWN0b3J5PikgcHJvdG9jb2xGYWN0b3J5ICIKKyAgICAgIDw8ICJ0cmFuc3BvcnRGYWN0b3J5OiAoaWQgPFRBc3luY1RyYW5zcG9ydEZhY3Rvcnk+KSB0cmFuc3BvcnRGYWN0b3J5OyIgPDwgZW5kbDsKKyAgb3V0IDw8ICJAZW5kIiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgaW50ZXJmYWNlIGRlZmluaXRpb24uIEluIG90aGVyIHdvcmRzLCB0aGUgVFByb2Nlc3MgaW1wbGVtZW50YXRpb24gZm9yCisgKnRoZQorICogc2VydmljZSBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGNsaWVudCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmb3IKKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc2VydmljZV9zZXJ2ZXJfaW50ZXJmYWNlKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIG91dCA8PCAiQGludGVyZmFjZSAiIDw8IGNvY29hX3ByZWZpeF8gPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkKKyAgICAgIDw8ICJQcm9jZXNzb3IgOiBOU09iamVjdCA8VFByb2Nlc3Nvcj4gIiA8PCBlbmRsOworCisgIG91dCA8PCAiLSAoaWQpIGluaXRXaXRoIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiOiAoaWQgPCIgPDwgY29jb2FfcHJlZml4XworICAgICAgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIj4pIHNlcnZpY2U7IiA8PCBlbmRsOworICBvdXQgPDwgIi0gKGlkPCIgPDwgY29jb2FfcHJlZml4XyA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiPikgc2VydmljZTsiIDw8IGVuZGw7CisKKyAgb3V0IDw8ICJAZW5kIiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X3NlbmRfZnVuY3Rpb25faW1wbGVtZW50YXRpb24oCisgICAgb3N0cmVhbSYgb3V0LAorICAgIHRfc2VydmljZSAqdHNlcnZpY2UsCisgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uLAorICAgIGJvb2wgbmVlZHNfcHJvdG9jb2wpIHsKKyAgc3RyaW5nIGZ1bm5hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCk7CisKKyAgdF9mdW5jdGlvbiBzZW5kX2Z1bmN0aW9uKGdfdHlwZV9ib29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJzZW5kXyIpICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKTsKKworICBzdHJpbmcgYXJnc25hbWUgPSBmdW5jdGlvbl9hcmdzX2hlbHBlcl9zdHJ1Y3RfdHlwZSh0c2VydmljZSwgdGZ1bmN0aW9uKTsKKworICAvLyBPcGVuIGZ1bmN0aW9uCisgIGluZGVudChvdXQpIDw8ICItIChCT09MKSBzZW5kXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8IGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLCBuZWVkc19wcm90b2NvbCA/ICJvdXRQcm90b2NvbCIgOiAiIiwgdHJ1ZSkgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKworICAvLyBTZXJpYWxpemUgdGhlIHJlcXVlc3QKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIVtvdXRQcm90b2NvbCB3cml0ZU1lc3NhZ2VCZWdpbldpdGhOYW1lOiBAXCIiIDw8IGZ1bm5hbWUgPDwgIlwiIgorICAgICAgPDwgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkgPyAiIHR5cGU6IFRNZXNzYWdlVHlwZU9ORVdBWSIgOiAiIHR5cGU6IFRNZXNzYWdlVHlwZUNBTEwiKQorICAgICAgPDwgIiBzZXF1ZW5jZUlEOiAwIGVycm9yOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghW291dFByb3RvY29sIHdyaXRlU3RydWN0QmVnaW5XaXRoTmFtZTogQFwiIiA8PCBhcmdzbmFtZQorICAgICAgICAgICAgICAgICAgPDwgIlwiIGVycm9yOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKworICAvLyB3cml0ZSBvdXQgZnVuY3Rpb24gcGFyYW1ldGVycworICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7CisgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgc3RyaW5nIGZpZWxkTmFtZSA9ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKCgqZmxkX2l0ZXIpLT5nZXRfdHlwZSgpKSkgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIiA8PCBmaWVsZE5hbWUgPDwgIiAhPSBuaWwpIjsKKyAgICAgIHNjb3BlX3VwKG91dCk7CisgICAgfQorICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCFbb3V0UHJvdG9jb2wgd3JpdGVGaWVsZEJlZ2luV2l0aE5hbWU6IEBcIiIgPDwgZmllbGROYW1lCisgICAgICAgIDw8ICJcIiIKKyAgICAgICAgICAgIiB0eXBlOiAiIDw8IHR5cGVfdG9fZW51bSgoKmZsZF9pdGVyKS0+Z2V0X3R5cGUoKSkKKyAgICAgICAgPDwgIiBmaWVsZElEOiAiIDw8ICgqZmxkX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIiBlcnJvcjogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZmxkX2l0ZXIsIGZpZWxkTmFtZSk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghW291dFByb3RvY29sIHdyaXRlRmllbGRFbmQ6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworCisgICAgaWYgKHR5cGVfY2FuX2JlX251bGwoKCpmbGRfaXRlciktPmdldF90eXBlKCkpKSB7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCFbb3V0UHJvdG9jb2wgd3JpdGVGaWVsZFN0b3A6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghW291dFByb3RvY29sIHdyaXRlU3RydWN0RW5kOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIVtvdXRQcm90b2NvbCB3cml0ZU1lc3NhZ2VFbmQ6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBZRVM7IiA8PCBlbmRsOworICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBlbmRsOworfQorCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9yZWN2X2Z1bmN0aW9uX2ltcGxlbWVudGF0aW9uKAorICAgIG9zdHJlYW0mIG91dCwKKyAgICB0X3NlcnZpY2UqIHRzZXJ2aWNlLAorICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKKyAgICBib29sIG5lZWRzX3Byb3RvY29sKSB7CisKKworICAvLyBPcGVuIGZ1bmN0aW9uCisgIGluZGVudChvdXQpIDw8ICItIChCT09MKSByZWN2XyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpOworICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgb3V0IDw8ICI6ICgiIDw8IHR5cGVfbmFtZSh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksIGZhbHNlLCB0cnVlKSA8PCAiICopIHJlc3VsdCAiOworICAgIGlmIChuZWVkc19wcm90b2NvbCkgeworICAgICAgb3V0IDw8ICJwcm90b2NvbCI7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCAiZXJyb3IiOworICAgIH0KKyAgfQorICBpZiAobmVlZHNfcHJvdG9jb2wpIHsKKyAgICBvdXQgPDwgIjogKGlkPFRQcm90b2NvbD4pIGluUHJvdG9jb2wgZXJyb3IiOworICB9CisgIG91dCA8PCAiOiAoTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopX190aHJpZnRFcnJvciIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKworICAvLyBUT0RPKG1jc2xlZSk6IE1lc3NhZ2UgdmFsaWRhdGlvbiBoZXJlLCB3YXMgdGhlIHNlcWlkIGV0YyBvaz8KKworICAvLyBjaGVjayBmb3IgYW4gZXhjZXB0aW9uCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiTlNFcnJvciAqaW5jb21pbmdFeGNlcHRpb24gPSBbc2VsZiBjaGVja0luY29taW5nTWVzc2FnZUV4Y2VwdGlvbjogaW5Qcm90b2NvbF07IiA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKGluY29taW5nRXhjZXB0aW9uKSI7CisgIHNjb3BlX3VwKG91dCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKF9fdGhyaWZ0RXJyb3IpIjsKKyAgc2NvcGVfdXAob3V0KTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIqX190aHJpZnRFcnJvciA9IGluY29taW5nRXhjZXB0aW9uOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihvdXQpOworICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBOTzsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24ob3V0KTsKKworICAvLyBGSVhNRSAtIGNvdWxkIG9wdGltaXplIGhlcmUgdG8gcmVkdWNlIGNyZWF0aW9uIG9mIHRlbXBvcmFyeSBvYmplY3RzLgorICBzdHJpbmcgcmVzdWx0bmFtZSA9IGZ1bmN0aW9uX3Jlc3VsdF9oZWxwZXJfc3RydWN0X3R5cGUodHNlcnZpY2UsIHRmdW5jdGlvbik7CisgIG91dCA8PCBpbmRlbnQoKSA8PCBjb2NvYV9wcmVmaXhfIDw8IHJlc3VsdG5hbWUgPDwgIiAqIHJlc3VsdGVyID0gWyIgPDwgY29jb2FfcHJlZml4XyA8PCByZXN1bHRuYW1lIDw8ICIgbmV3XTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJpZiAoIVtyZXN1bHRlciByZWFkOiBpblByb3RvY29sIGVycm9yOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgImlmICghW2luUHJvdG9jb2wgcmVhZE1lc3NhZ2VFbmQ6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworCisgIC8vIENhcmVmdWwsIG9ubHkgcmV0dXJuIF9yZXN1bHQgaWYgbm90IGEgdm9pZCBmdW5jdGlvbgorICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAocmVzdWx0ZXIuc3VjY2Vzc0lzU2V0KSI7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIipyZXN1bHQgPSByZXN1bHRlci5zdWNjZXNzOyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBZRVM7IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgfQorCisgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAocmVzdWx0ZXIuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIklzU2V0KSI7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChfX3RocmlmdEVycm9yKSI7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIipfX3RocmlmdEVycm9yID0gW3Jlc3VsdGVyICIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJdOyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKG91dCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gTk87IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgfQorCisgIC8vIElmIHlvdSBnZXQgaGVyZSBpdCdzIGFuIGV4Y2VwdGlvbiwgdW5sZXNzIGEgdm9pZCBmdW5jdGlvbgorICBpZiAodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIFlFUzsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoX190aHJpZnRFcnJvcikiOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIqX190aHJpZnRFcnJvciA9IFtOU0Vycm9yIGVycm9yV2l0aERvbWFpbjogVEFwcGxpY2F0aW9uRXJyb3JEb21haW4iIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBUQXBwbGljYXRpb25FcnJvck1pc3NpbmdSZXN1bHQiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvOiBAe1RBcHBsaWNhdGlvbkVycm9yTWV0aG9kS2V5OiBAXCIiCisgICAgICAgIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCJ9XTsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihvdXQpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIE5POyIgPDwgZW5kbDsKKyAgfQorCisgIC8vIENsb3NlIGZ1bmN0aW9uCisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGFuIGludm9jYXRpb24gb2YgYSBnaXZlbiAnc2VuZF8nIGZ1bmN0aW9uLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYW4gaW1wbGVtZW50YXRpb24gZm9yCisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X3NlbmRfZnVuY3Rpb25faW52b2NhdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisKKyAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOworICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghW3NlbGYgc2VuZF8iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKTsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgc3RyaW5nIGZpZWxkTmFtZSA9ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIG91dCA8PCAiICI7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgb3V0IDw8ICI6ICIgPDwgZmllbGROYW1lOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgZmllbGROYW1lIDw8ICI6ICIgPDwgZmllbGROYW1lOworICAgIH0KKyAgfQorICBpZiAoIWZpZWxkcy5lbXB0eSgpKSB7CisgICAgb3V0IDw8ICIgZXJyb3IiOworICB9CisgIG91dCA8PCAiOiBfX3RocmlmdEVycm9yXSkgIiA8PCBpbnZhbGlkX3JldHVybl9zdGF0ZW1lbnQodGZ1bmN0aW9uKSA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhbiBpbnZvY2F0aW9uIG9mIGEgZ2l2ZW4gJ3NlbmRfJyBmdW5jdGlvbi4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGFuIGltcGxlbWVudGF0aW9uIGZvcgorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9zZW5kX2FzeW5jX2Z1bmN0aW9uX2ludm9jYXRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZmFpbHVyZUJsb2NrTmFtZSkgeworCisgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIVtzZWxmIHNlbmRfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCk7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgIHN0cmluZyBmaWVsZE5hbWUgPSAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICBvdXQgPDwgIiAiOworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIG91dCA8PCAiOiAiIDw8IGZpZWxkTmFtZTsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8IGZpZWxkTmFtZSA8PCAiOiAiIDw8IGZpZWxkTmFtZTsKKyAgICB9CisgIH0KKyAgaWYgKCFmaWVsZHMuZW1wdHkoKSkgeworICAgIG91dCA8PCAiIHByb3RvY29sIjsKKyAgfQorICBvdXQgPDwgIjogcHJvdG9jb2wgZXJyb3I6ICZ0aHJpZnRFcnJvcl0pICI7CisgIHNjb3BlX3VwKG91dCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCBmYWlsdXJlQmxvY2tOYW1lIDw8ICIodGhyaWZ0RXJyb3IpOyIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24ob3V0KTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGNsaWVudCBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYW4gaW1wbGVtZW50YXRpb24gZm9yCisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X2ltcGxlbWVudGF0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2VydmljZSogdHNlcnZpY2UpIHsKKworICBzdHJpbmcgbmFtZSA9IGNvY29hX3ByZWZpeF8gKyB0c2VydmljZS0+Z2V0X25hbWUoKSArICJDbGllbnQiOworCisgIG91dCA8PCAiQGludGVyZmFjZSAiIDw8IG5hbWUgPDwgIiAoKSAiOworICBzY29wZV91cChvdXQpOworICBvdXQgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZDxUUHJvdG9jb2w+IGluUHJvdG9jb2w7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgImlkPFRQcm90b2NvbD4gb3V0UHJvdG9jb2w7IiA8PCBlbmRsOworICBvdXQgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihvdXQpOworICBvdXQgPDwgZW5kbDsKKyAgb3V0IDw8ICJAZW5kIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgb3V0IDw8ICJAaW1wbGVtZW50YXRpb24gIiA8PCBuYW1lIDw8IGVuZGw7CisKKyAgLy8gaW5pdGlhbGl6ZXJzCisgIG91dCA8PCAiLSAoaWQpIGluaXRXaXRoUHJvdG9jb2w6IChpZCA8VFByb3RvY29sPikgcHJvdG9jb2wiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIFtzZWxmIGluaXRXaXRoSW5Qcm90b2NvbDogcHJvdG9jb2wgb3V0UHJvdG9jb2w6IHByb3RvY29sXTsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgb3V0IDw8IGVuZGw7CisKKyAgb3V0IDw8ICItIChpZCkgaW5pdFdpdGhJblByb3RvY29sOiAoaWQgPFRQcm90b2NvbD4pIGFuSW5Qcm90b2NvbCBvdXRQcm90b2NvbDogKGlkIDxUUHJvdG9jb2w+KSAiCisgICAgICAgICAiYW5PdXRQcm90b2NvbCIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJzZWxmID0gW3N1cGVyIGluaXRdOyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoc2VsZikgIjsKKyAgc2NvcGVfdXAob3V0KTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpblByb3RvY29sID0gYW5JblByb3RvY29sOyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJvdXRQcm90b2NvbCA9IGFuT3V0UHJvdG9jb2w7IiA8PCBlbmRsOworICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHNlbGY7IiA8PCBlbmRsOworICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBlbmRsOworCisgIC8vIGdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworCisgICAgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfc2VuZF9mdW5jdGlvbl9pbXBsZW1lbnRhdGlvbihvdXQsIHRzZXJ2aWNlLCAqZl9pdGVyLCBmYWxzZSk7CisKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X3JlY3ZfZnVuY3Rpb25faW1wbGVtZW50YXRpb24ob3V0LCB0c2VydmljZSwgKmZfaXRlciwgZmFsc2UpOworICAgIH0KKworICAgIC8vIE9wZW4gZnVuY3Rpb24KKyAgICBpbmRlbnQob3V0KSA8PCAiLSAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCB0cnVlKSA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfc2VuZF9mdW5jdGlvbl9pbnZvY2F0aW9uKG91dCwgKmZfaXRlcik7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghW1tvdXRQcm90b2NvbCB0cmFuc3BvcnRdIGZsdXNoOiBfX3RocmlmdEVycm9yXSkgIiA8PCBpbnZhbGlkX3JldHVybl9zdGF0ZW1lbnQoKmZfaXRlcikgPDwgZW5kbDsKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghW3NlbGYgcmVjdl8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gWUVTOyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLCBmYWxzZSwgdHJ1ZSkgPDwgIiBfX3Jlc3VsdDsiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoIVtzZWxmIHJlY3ZfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIjogJl9fcmVzdWx0IGVycm9yOiBfX3RocmlmdEVycm9yXSkgIgorICAgICAgICAgICAgPDwgaW52YWxpZF9yZXR1cm5fc3RhdGVtZW50KCpmX2l0ZXIpIDw8IGVuZGw7CisgICAgICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSkpIHsKKyAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBfX3Jlc3VsdDsiIDw8IGVuZGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gQChfX3Jlc3VsdCk7IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gWUVTOyIgPDwgZW5kbDsKKyAgICB9CisgICAgc2NvcGVfZG93bihvdXQpOworICAgIG91dCA8PCBlbmRsOworICB9CisKKyAgb3V0IDw8ICJAZW5kIiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgaW1wbGVtZW50YXRpb24gZm9yIGl0cyBhc3luY2hyb25vdXMgaW50ZXJmYWNlLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhbiBpbXBsZW1lbnRhdGlvbiBmb3IKKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfYXN5bmNfaW1wbGVtZW50YXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXJ2aWNlKiB0c2VydmljZSkgeworCisgIHN0cmluZyBuYW1lID0gY29jb2FfcHJlZml4XyArIHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIkNsaWVudEFzeW5jIjsKKworICBvdXQgPDwgIkBpbnRlcmZhY2UgIiA8PCBuYW1lIDw8ICIgKCkgIjsKKyAgc2NvcGVfdXAob3V0KTsKKyAgb3V0IDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWQ8VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5OyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZDxUQXN5bmNUcmFuc3BvcnRGYWN0b3J5PiB0cmFuc3BvcnRGYWN0b3J5OyIgPDwgZW5kbDsKKyAgb3V0IDw8IGVuZGw7CisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgb3V0IDw8IGVuZGw7CisgIG91dCA8PCAiQGVuZCIgPDwgZW5kbCA8PCBlbmRsOworCisKKyAgb3V0IDw8ICJAaW1wbGVtZW50YXRpb24gIiA8PCBuYW1lIDw8IGVuZGwKKyAgICAgIDw8IGVuZGwgPDwgIi0gKGlkKSBpbml0V2l0aFByb3RvY29sRmFjdG9yeTogKGlkIDxUUHJvdG9jb2xGYWN0b3J5PikgYVByb3RvY29sRmFjdG9yeSAiCisgICAgICAgICAgICAgICAgICJ0cmFuc3BvcnRGYWN0b3J5OiAoaWQgPFRBc3luY1RyYW5zcG9ydEZhY3Rvcnk+KSBhVHJhbnNwb3J0RmFjdG9yeTsiIDw8IGVuZGw7CisKKyAgc2NvcGVfdXAob3V0KTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJzZWxmID0gW3N1cGVyIGluaXRdOyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoc2VsZikgeyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHByb3RvY29sRmFjdG9yeSA9IGFQcm90b2NvbEZhY3Rvcnk7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgdHJhbnNwb3J0RmFjdG9yeSA9IGFUcmFuc3BvcnRGYWN0b3J5OyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBzZWxmOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihvdXQpOworICBvdXQgPDwgZW5kbDsKKworICAvLyBnZW5lcmF0ZSBjbGllbnQgbWV0aG9kIGltcGxlbWVudGF0aW9ucworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKworICAgIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X3NlbmRfZnVuY3Rpb25faW1wbGVtZW50YXRpb24ob3V0LCB0c2VydmljZSwgKmZfaXRlciwgdHJ1ZSk7CisKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X3JlY3ZfZnVuY3Rpb25faW1wbGVtZW50YXRpb24ob3V0LCB0c2VydmljZSwgKmZfaXRlciwgdHJ1ZSk7CisgICAgfQorCisgICAgLy8gT3BlbiBmdW5jdGlvbgorICAgIGluZGVudChvdXQpIDw8ICItICIgPDwgYXN5bmNfZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIsIGZhbHNlKSA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIk5TRXJyb3IgKnRocmlmdEVycm9yOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWQ8VEFzeW5jVHJhbnNwb3J0PiB0cmFuc3BvcnQgPSBbdHJhbnNwb3J0RmFjdG9yeSBuZXdUcmFuc3BvcnRdOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWQ8VFByb3RvY29sPiBwcm90b2NvbCA9IFtwcm90b2NvbEZhY3RvcnkgbmV3UHJvdG9jb2xPblRyYW5zcG9ydDp0cmFuc3BvcnRdOyIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsOworCisgICAgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfc2VuZF9hc3luY19mdW5jdGlvbl9pbnZvY2F0aW9uKG91dCwgKmZfaXRlciwgImZhaWx1cmVCbG9jayIpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJbdHJhbnNwb3J0IGZsdXNoV2l0aENvbXBsZXRpb246XnsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiTlNFcnJvciAqdGhyaWZ0RXJyb3I7IiA8PCBlbmRsOworCisgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpKSA8PCAiIHJlc3VsdDsiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghW3NlbGYgcmVjdl8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgb3V0IDw8ICI6ICZyZXN1bHQgcHJvdG9jb2wiOworICAgICAgfQorICAgICAgb3V0IDw8ICI6IHByb3RvY29sIGVycm9yOiAmdGhyaWZ0RXJyb3JdKSAiOworICAgICAgc2NvcGVfdXAob3V0KTsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZmFpbHVyZUJsb2NrKHRocmlmdEVycm9yKTsiIDw8IGVuZGwKKyAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKyAgICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICB9CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJlc3BvbnNlQmxvY2soIjsKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkgJiYgISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICBvdXQgPDwgInJlc3VsdCI7CisgICAgfQorICAgIG91dCA8PCAiKTsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfZG93bigpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IGZhaWx1cmU6ZmFpbHVyZUJsb2NrXTsiIDw8IGVuZGw7CisKKyAgICBzY29wZV9kb3duKG91dCk7CisKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIC8vIFByb21pc2UgZnVuY3Rpb24KKyAgICBpZiAocHJvbWlzZV9raXRfKSB7CisKKyAgICAgIGluZGVudChvdXQpIDw8ICItICIgPDwgcHJvbWlzZV9mdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgZW5kbDsKKyAgICAgIHNjb3BlX3VwKG91dCk7CisKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIFtBbnlQcm9taXNlIHByb21pc2VXaXRoUmVzb2x2ZXJCbG9jazpeKFBNS1Jlc29sdmVyIHJlc29sdmVyKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiTlNFcnJvciAqdGhyaWZ0RXJyb3I7IiA8PCBlbmRsCisgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImlkPFRBc3luY1RyYW5zcG9ydD4gdHJhbnNwb3J0ID0gW3RyYW5zcG9ydEZhY3RvcnkgbmV3VHJhbnNwb3J0XTsiIDw8IGVuZGwKKyAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWQ8VFByb3RvY29sPiBwcm90b2NvbCA9IFtwcm90b2NvbEZhY3RvcnkgbmV3UHJvdG9jb2xPblRyYW5zcG9ydDp0cmFuc3BvcnRdOyIgPDwgZW5kbAorICAgICAgICAgIDw8IGVuZGw7CisKKyAgICAgIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X3NlbmRfYXN5bmNfZnVuY3Rpb25faW52b2NhdGlvbihvdXQsICpmX2l0ZXIsICJyZXNvbHZlciIpOworCisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIlt0cmFuc3BvcnQgZmx1c2hXaXRoQ29tcGxldGlvbjpeeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworCisgICAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJOU0Vycm9yICp0aHJpZnRFcnJvcjsiIDw8IGVuZGw7CisKKyAgICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpKSA8PCAiIHJlc3VsdDsiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIVtzZWxmIHJlY3ZfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgICAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgICBvdXQgPDwgIjogJnJlc3VsdCBwcm90b2NvbCI7CisgICAgICAgIH0KKyAgICAgICAgb3V0IDw8ICI6IHByb3RvY29sIGVycm9yOiAmdGhyaWZ0RXJyb3JdKSAiOworICAgICAgICBzY29wZV91cChvdXQpOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJlc29sdmVyKHRocmlmdEVycm9yKTsiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICAgICAgICBzY29wZV9kb3duKG91dCk7CisgICAgICB9CisKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmVzb2x2ZXIoIjsKKyAgICAgIGlmICgoKmZfaXRlciktPmlzX29uZXdheSgpIHx8ICgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIG91dCA8PCAiQFlFUyI7CisgICAgICB9IGVsc2UgaWYgKHR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpKSkgeworICAgICAgICBvdXQgPDwgInJlc3VsdCI7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgIkAocmVzdWx0KSI7CisgICAgICB9CisgICAgICBvdXQgPDwgIik7IiA8PCBlbmRsOworCisgICAgICBpbmRlbnRfZG93bigpOworCisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0gZmFpbHVyZTpeKE5TRXJyb3IgKmVycm9yKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJlc29sdmVyKGVycm9yKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9XTsiIDw8IGVuZGw7CisKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn1dOyIgPDwgZW5kbDsKKworICAgICAgc2NvcGVfZG93bihvdXQpOworCisgICAgICBvdXQgPDwgZW5kbDsKKworICAgIH0KKworICB9CisKKyAgb3V0IDw8ICJAZW5kIiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgaW1wbGVtZW50YXRpb24uICBJbiBvdGhlciB3b3JkcyB0aGUgYWN0dWFsIFRQcm9jZXNzb3IgaW1wbGVtZW50YXRpb24KKyAqIGZvciB0aGUgc2VydmljZS4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYW4gaW1wbGVtZW50YXRpb24gZm9yCisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3NlcnZpY2Vfc2VydmVyX2ltcGxlbWVudGF0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2VydmljZSogdHNlcnZpY2UpIHsKKworICBzdHJpbmcgbmFtZSA9IGNvY29hX3ByZWZpeF8gKyB0c2VydmljZS0+Z2V0X25hbWUoKSArICJQcm9jZXNzb3IiOworCisgIG91dCA8PCAiQGludGVyZmFjZSAiIDw8IG5hbWUgPDwgIiAoKSAiOworCisgIHNjb3BlX3VwKG91dCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWQgPCIgPDwgY29jb2FfcHJlZml4XyA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiPiBzZXJ2aWNlOyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJOU0RpY3Rpb25hcnkgKiBtZXRob2RNYXA7IiA8PCBlbmRsOworICBzY29wZV9kb3duKG91dCk7CisKKyAgb3V0IDw8ICJAZW5kIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgb3V0IDw8ICJAaW1wbGVtZW50YXRpb24gIiA8PCBuYW1lIDw8IGVuZGw7CisKKyAgLy8gaW5pdGlhbGl6ZXIKKyAgb3V0IDw8IGVuZGw7CisgIG91dCA8PCAiLSAoaWQpIGluaXRXaXRoIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiOiAoaWQgPCIgPDwgY29jb2FfcHJlZml4XyA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiPikgYVNlcnZpY2UiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAic2VsZiA9IFtzdXBlciBpbml0XTsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKHNlbGYpICI7CisgIHNjb3BlX3VwKG91dCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAic2VydmljZSA9IGFTZXJ2aWNlOyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJtZXRob2RNYXAgPSBbTlNNdXRhYmxlRGljdGlvbmFyeSBkaWN0aW9uYXJ5XTsiIDw8IGVuZGw7CisKKyAgLy8gZ2VuZXJhdGUgbWV0aG9kIG1hcCBmb3Igcm91dGluZyBpbmNvbWluZyBjYWxscworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICBzY29wZV91cChvdXQpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiU0VMIHMgPSBAc2VsZWN0b3IocHJvY2Vzc18iIDw8IGZ1bm5hbWUgPDwgIl93aXRoU2VxdWVuY2VJRDppblByb3RvY29sOm91dFByb3RvY29sOmVycm9yOik7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiTlNNZXRob2RTaWduYXR1cmUgKiBzaWcgPSBbc2VsZiBtZXRob2RTaWduYXR1cmVGb3JTZWxlY3Rvcjogc107IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiTlNJbnZvY2F0aW9uICogaW52b2NhdGlvbiA9IFtOU0ludm9jYXRpb24gaW52b2NhdGlvbldpdGhNZXRob2RTaWduYXR1cmU6IHNpZ107IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW2ludm9jYXRpb24gc2V0U2VsZWN0b3I6IHNdOyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltpbnZvY2F0aW9uIHJldGFpbkFyZ3VtZW50c107IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW21ldGhvZE1hcCBzZXRWYWx1ZTogaW52b2NhdGlvbiBmb3JLZXk6IEBcIiIgPDwgZnVubmFtZSA8PCAiXCJdOyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKG91dCk7CisgIH0KKyAgc2NvcGVfZG93bihvdXQpOworICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBzZWxmOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihvdXQpOworCisgIC8vIGltcGxlbWVudGF0aW9uIG9mIHRoZSAnc2VydmljZScgbWV0aG9kIHdoaWNoIHJldHVybnMgdGhlIHNlcnZpY2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMKKyAgLy8gcHJvY2Vzc29yCisgIG91dCA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIi0gKGlkPCIgPDwgY29jb2FfcHJlZml4XyA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiPikgc2VydmljZSIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHNlcnZpY2U7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgLy8gaW1wbGVtZW50YXRpb24gb2YgdGhlIFRQcm9jZXNzIG1ldGhvZCwgd2hpY2ggZGlzcGF0Y2hlcyB0aGUgaW5jb21pbmcgY2FsbCB1c2luZyB0aGUgbWV0aG9kIG1hcAorICBvdXQgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICItIChCT09MKSBwcm9jZXNzT25JbnB1dFByb3RvY29sOiAoaWQgPFRQcm90b2NvbD4pIGluUHJvdG9jb2wiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgICAgICAgICAgICAgICBvdXRwdXRQcm90b2NvbDogKGlkIDxUUHJvdG9jb2w+KSBvdXRQcm90b2NvbCIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiAoTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopX190aHJpZnRFcnJvciIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgTlNTdHJpbmcgKiBtZXNzYWdlTmFtZTsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBTSW50MzIgbWVzc2FnZVR5cGU7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgU0ludDMyIHNlcUlEOyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgIGlmICghW2luUHJvdG9jb2wgcmVhZE1lc3NhZ2VCZWdpblJldHVybmluZ05hbWU6ICZtZXNzYWdlTmFtZSIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAmbWVzc2FnZVR5cGUiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VJRDogJnNlcUlEIiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgTlNJbnZvY2F0aW9uICogaW52b2NhdGlvbiA9IFttZXRob2RNYXAgdmFsdWVGb3JLZXk6IG1lc3NhZ2VOYW1lXTsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBpZiAoaW52b2NhdGlvbiA9PSBuaWwpIHsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgIGlmICghW1RQcm90b2NvbFV0aWwgc2tpcFR5cGU6IFRUeXBlU1RSVUNUIG9uUHJvdG9jb2w6IGluUHJvdG9jb2wgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICBpZiAoIVtpblByb3RvY29sIHJlYWRNZXNzYWdlRW5kOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgTlNFcnJvciAqIHggPSBbTlNFcnJvciBlcnJvcldpdGhEb21haW46IFRBcHBsaWNhdGlvbkVycm9yRG9tYWluIiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogVEFwcGxpY2F0aW9uRXJyb3JVbmtub3duTWV0aG9kIiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySW5mbzogQHtUQXBwbGljYXRpb25FcnJvck1ldGhvZEtleTogbWVzc2FnZU5hbWV9XTsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgIGlmICghW291dFByb3RvY29sIHdyaXRlTWVzc2FnZUJlZ2luV2l0aE5hbWU6IG1lc3NhZ2VOYW1lIiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBUTWVzc2FnZVR5cGVFWENFUFRJT04iIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlSUQ6IHNlcUlEIiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgaWYgKCFbeCB3cml0ZTogb3V0UHJvdG9jb2wgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICBpZiAoIVtvdXRQcm90b2NvbCB3cml0ZU1lc3NhZ2VFbmQ6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICBpZiAoIVtbb3V0UHJvdG9jb2wgdHJhbnNwb3J0XSBmbHVzaDogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgIHJldHVybiBZRVM7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgfSIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgIC8vIE5TSW52b2NhdGlvbiBkb2VzIG5vdCBjb25mb3JtIHRvIE5TQ29weWluZyBwcm90b2NvbCIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgIE5TSW52b2NhdGlvbiAqIGkgPSBbTlNJbnZvY2F0aW9uIGludm9jYXRpb25XaXRoTWV0aG9kU2lnbmF0dXJlOiAiCisgICAgICAgICAgICAgICAgICAgICAiW2ludm9jYXRpb24gbWV0aG9kU2lnbmF0dXJlXV07IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgW2kgc2V0U2VsZWN0b3I6IFtpbnZvY2F0aW9uIHNlbGVjdG9yXV07IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgW2kgc2V0QXJndW1lbnQ6ICZzZXFJRCBhdEluZGV4OiAyXTsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBbaSBzZXRBcmd1bWVudDogJmluUHJvdG9jb2wgYXRJbmRleDogM107IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgW2kgc2V0QXJndW1lbnQ6ICZvdXRQcm90b2NvbCBhdEluZGV4OiA0XTsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBbaSBzZXRBcmd1bWVudDogJl9fdGhyaWZ0RXJyb3IgYXRJbmRleDogNV07IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgW2kgc2V0VGFyZ2V0OiBzZWxmXTsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBbaSBpbnZva2VdOyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBZRVM7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgLy8gZ2VuZXJhdGUgYSBwcm9jZXNzX1hYWFggbWV0aG9kIGZvciBlYWNoIHNlcnZpY2UgZnVuY3Rpb24sIHdoaWNoIHJlYWRzIGFyZ3MsIGNhbGxzIHRoZSBzZXJ2aWNlLAorICAvLyBhbmQgd3JpdGVzIHJlc3VsdHMKKyAgZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBvdXQgPDwgZW5kbDsKKyAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIi0gKEJPT0wpIHByb2Nlc3NfIiA8PCBmdW5uYW1lCisgICAgICAgIDw8ICJfd2l0aFNlcXVlbmNlSUQ6IChTSW50MzIpIHNlcUlEIGluUHJvdG9jb2w6IChpZDxUUHJvdG9jb2w+KSBpblByb3RvY29sIG91dFByb3RvY29sOiAiCisgICAgICAgICAgICIoaWQ8VFByb3RvY29sPikgb3V0UHJvdG9jb2wgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKV9fdGhyaWZ0RXJyb3IiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBzdHJpbmcgYXJnc3R5cGUgPSBjb2NvYV9wcmVmaXhfICsgZnVuY3Rpb25fYXJnc19oZWxwZXJfc3RydWN0X3R5cGUodHNlcnZpY2UsICpmX2l0ZXIpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCBhcmdzdHlwZSA8PCAiICogYXJncyA9IFsiIDw8IGFyZ3N0eXBlIDw8ICIgbmV3XTsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIVthcmdzIHJlYWQ6IGluUHJvdG9jb2wgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCFbaW5Qcm90b2NvbCByZWFkTWVzc2FnZUVuZDogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisKKyAgICAvLyBwcmVwYXJlIHRoZSByZXN1bHQgaWYgbm90IG9uZXdheQorICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgc3RyaW5nIHJlc3VsdHR5cGUgPSBjb2NvYV9wcmVmaXhfICsgZnVuY3Rpb25fcmVzdWx0X2hlbHBlcl9zdHJ1Y3RfdHlwZSh0c2VydmljZSwgKmZfaXRlcik7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgcmVzdWx0dHlwZSA8PCAiICogcmVzdWx0ID0gWyIgPDwgcmVzdWx0dHlwZSA8PCAiIG5ld107IiA8PCBlbmRsOworICAgIH0KKworICAgIC8vIG1ha2UgdGhlIGNhbGwgdG8gdGhlIGFjdHVhbCBzZXJ2aWNlIG9iamVjdAorICAgIG91dCA8PCBpbmRlbnQoKTsKKyAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgIG91dCA8PCAiQk9PTCI7CisgICAgfSBlbHNlIGlmICh0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSkpIHsKKyAgICAgIG91dCA8PCB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLCBmYWxzZSwgdHJ1ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCAiTlNOdW1iZXIgKiI7CisgICAgfQorICAgIG91dCA8PCAiIHNlcnZpY2VSZXN1bHQgPSAiOworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmdldF90cnVlX3R5cGUoKS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICAgIG91dCA8PCAiKCIgPDwgdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwgZmFsc2UsIHRydWUpIDw8ICIpIjsKKyAgICB9CisgICAgb3V0IDw8ICJbc2VydmljZSAiIDw8IGZ1bm5hbWU7CisgICAgLy8gc3VwcGx5aW5nIGFyZ3VtZW50cworICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICAgIHN0cmluZyBmaWVsZE5hbWUgPSAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICBvdXQgPDwgIjogW2FyZ3MgIiA8PCBmaWVsZE5hbWUgPDwgIl0iOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0IDw8ICIgIiA8PCBmaWVsZE5hbWUgPDwgIjogW2FyZ3MgIiA8PCBmaWVsZE5hbWUgPDwgIl0iOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIWZpZWxkcy5lbXB0eSgpKSB7CisgICAgICBvdXQgPDwgIiBlcnJvciI7CisgICAgfQorICAgIG91dCA8PCAiOiBfX3RocmlmdEVycm9yXTsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIXNlcnZpY2VSZXN1bHQpIHJldHVybiBOTzsiIDw8IGVuZGw7CisgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJbcmVzdWx0IHNldFN1Y2Nlc3M6ICIgPDwgdW5ib3goKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLCAic2VydmljZVJlc3VsdCIpIDw8ICJdOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICAvLyB3cml0ZSBvdXQgdGhlIHJlc3VsdCBpZiBub3Qgb25ld2F5CisgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghW291dFByb3RvY29sIHdyaXRlTWVzc2FnZUJlZ2luV2l0aE5hbWU6IEBcIiIgPDwgZnVubmFtZSA8PCAiXCIiIDw8IGVuZGw7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFRNZXNzYWdlVHlwZVJFUExZIiA8PCBlbmRsOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZUlEOiBzZXFJRCIgPDwgZW5kbDsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghW3Jlc3VsdCB3cml0ZTogb3V0UHJvdG9jb2wgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIVtvdXRQcm90b2NvbCB3cml0ZU1lc3NhZ2VFbmQ6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIVtbb3V0UHJvdG9jb2wgdHJhbnNwb3J0XSBmbHVzaDogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisgICAgfQorICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIFlFUzsiIDw8IGVuZGw7CisKKyAgICBzY29wZV9kb3duKG91dCk7CisgIH0KKworICBvdXQgPDwgIkBlbmQiIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBEZXNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KKyAqCisgKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZAorICogQHBhcmFtIGZpZWxkTmFtZSBUaGUgdmFyaWFibGUgbmFtZSBmb3IgdGhpcyBmaWVsZAorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZmllbGROYW1lKSB7CisgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKworICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgIH0KKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgZmllbGROYW1lKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIGZpZWxkTmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgIiA8PCBmaWVsZE5hbWUgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgImlmICghW2luUHJvdG9jb2wgIjsKKworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgICAgb3V0IDw8ICJyZWFkQmluYXJ5OiYiIDw8IGZpZWxkTmFtZSA8PCAiIGVycm9yOiBfX3RocmlmdEVycm9yXSI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgb3V0IDw8ICJyZWFkU3RyaW5nOiYiIDw8IGZpZWxkTmFtZSA8PCAiIGVycm9yOiBfX3RocmlmdEVycm9yXSI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIG91dCA8PCAicmVhZEJvb2w6JiIgPDwgZmllbGROYW1lIDw8ICIgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICBvdXQgPDwgInJlYWRCeXRlOihVSW50OCAqKSYiIDw8IGZpZWxkTmFtZSA8PCAiIGVycm9yOiBfX3RocmlmdEVycm9yXSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgIG91dCA8PCAicmVhZEkxNjomIiA8PCBmaWVsZE5hbWUgPDwgIiBlcnJvcjogX190aHJpZnRFcnJvcl0iOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBvdXQgPDwgInJlYWRJMzI6JiIgPDwgZmllbGROYW1lIDw8ICIgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgb3V0IDw8ICJyZWFkSTY0OiYiIDw8IGZpZWxkTmFtZSA8PCAiIGVycm9yOiBfX3RocmlmdEVycm9yXSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIG91dCA8PCAicmVhZERvdWJsZTomIiA8PCBmaWVsZE5hbWUgPDwgIiBlcnJvcjogX190aHJpZnRFcnJvcl0iOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gT2JqZWN0aXZlLUMgbmFtZSBmb3IgYmFzZSB0eXBlICIKKyAgICAgICAgICAgICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgb3V0IDw8ICJyZWFkSTMyOiYiIDw8IGZpZWxkTmFtZSA8PCAiIGVycm9yOiBfX3RocmlmdEVycm9yXSI7CisgICAgfQorICAgIG91dCA8PCAiKSByZXR1cm4gTk87IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIERFU0VSSUFMSVpFIEZJRUxEICclcycgVFlQRSAnJXMnXG4iLAorICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgdHlwZV9uYW1lKHR5cGUpLmNfc3RyKCkpOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGFuIHVuc2VyaWFsaXplciBmb3IgYSBzdHJ1Y3QsIGFsbG9jYXRlcyB0aGUgc3RydWN0IGFuZCBpbnZva2VzIHJlYWQ6CisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZpZWxkTmFtZSkgeworICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgZmllbGROYW1lIDw8ICIgPSBbWyIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QsIHRydWUpCisgICAgICAgICAgICAgIDw8ICIgYWxsb2NdIGluaXRdOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgImlmICghWyIgPDwgZmllbGROYW1lIDw8ICIgcmVhZDogaW5Qcm90b2NvbCBlcnJvcjogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogRGVzZXJpYWxpemVzIGEgY29udGFpbmVyIGJ5IHJlYWRpbmcgaXRzIHNpemUgYW5kIHRoZW4gaXRlcmF0aW5nCisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZmllbGROYW1lKSB7CisgIHN0cmluZyBzaXplID0gdG1wKCJfc2l6ZSIpOworICBpbmRlbnQob3V0KSA8PCAiU0ludDMyICIgPDwgc2l6ZSA8PCAiOyIgPDwgZW5kbDsKKworICAvLyBEZWNsYXJlIHZhcmlhYmxlcywgcmVhZCBoZWFkZXIKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpZiAoIVtpblByb3RvY29sIHJlYWRNYXBCZWdpblJldHVybmluZ0tleVR5cGU6IE5VTEwgdmFsdWVUeXBlOiBOVUxMIHNpemU6ICYiIDw8IHNpemUgPDwgIiBlcnJvcjogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIk5TTXV0YWJsZURpY3Rpb25hcnkgKiAiIDw8IGZpZWxkTmFtZQorICAgICAgICAgICAgICAgIDw8ICIgPSBbW05TTXV0YWJsZURpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoQ2FwYWNpdHk6ICIgPDwgc2l6ZSA8PCAiXTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlmICghW2luUHJvdG9jb2wgcmVhZFNldEJlZ2luUmV0dXJuaW5nRWxlbWVudFR5cGU6IE5VTEwgc2l6ZTogJiIgPDwgc2l6ZSA8PCAiIGVycm9yOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJOU011dGFibGVTZXQgKiAiIDw8IGZpZWxkTmFtZQorICAgICAgICAgICAgICAgIDw8ICIgPSBbW05TTXV0YWJsZVNldCBhbGxvY10gaW5pdFdpdGhDYXBhY2l0eTogIiA8PCBzaXplIDw8ICJdOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlmICghW2luUHJvdG9jb2wgcmVhZExpc3RCZWdpblJldHVybmluZ0VsZW1lbnRUeXBlOiBOVUxMIHNpemU6ICYiIDw8IHNpemUgPDwgIiBlcnJvcjogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiTlNNdXRhYmxlQXJyYXkgKiAiIDw8IGZpZWxkTmFtZQorICAgICAgICAgICAgICAgIDw8ICIgPSBbW05TTXV0YWJsZUFycmF5IGFsbG9jXSBpbml0V2l0aENhcGFjaXR5OiAiIDw8IHNpemUgPDwgIl07IiA8PCBlbmRsOworICB9CisgIC8vIEZJWE1FIC0gdGhlIGNvZGUgYWJvdmUgZG9lcyBub3QgdmVyaWZ5IHRoYXQgdGhlIGVsZW1lbnQgdHlwZXMgb2YKKyAgLy8gdGhlIGNvbnRhaW5lcnMgYmVpbmcgcmVhZCBtYXRjaCB0aGUgZWxlbWVudCB0eXBlcyBvZiB0aGUKKyAgLy8gY29udGFpbmVycyB3ZSBhcmUgcmVhZGluZyBpbnRvLiAgRG9lcyB0aGF0IG1hdHRlcj8KKworICAvLyBGb3IgbG9vcCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzCisgIHN0cmluZyBpID0gdG1wKCJfaSIpOworICBpbmRlbnQob3V0KSA8PCAiaW50ICIgPDwgaSA8PCAiOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiZm9yICgiIDw8IGkgPDwgIiA9IDA7ICIgPDwgaSA8PCAiIDwgIgorICAgICAgICAgICAgICA8PCBzaXplIDw8ICI7ICIKKyAgICAgICAgICAgICAgPDwgIisrIiA8PCBpIDw8ICIpIiA8PCBlbmRsOworCisgIHNjb3BlX3VwKG91dCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgZmllbGROYW1lKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIGZpZWxkTmFtZSk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBmaWVsZE5hbWUpOworICB9CisKKyAgc2NvcGVfZG93bihvdXQpOworCisgIC8vIFJlYWQgY29udGFpbmVyIGVuZAorICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlmICghW2luUHJvdG9jb2wgcmVhZE1hcEVuZDogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlmICghW2luUHJvdG9jb2wgcmVhZFNldEVuZDogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpZiAoIVtpblByb3RvY29sIHJlYWRMaXN0RW5kOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIFRha2UgYSB2YXJpYWJsZSBvZiBhIGdpdmVuIHR5cGUgYW5kIHdyYXAgaXQgaW4gY29kZSB0byBtYWtlIGl0CisgKiBzdWl0YWJsZSBmb3IgcHV0dGluZyBpbnRvIGEgY29udGFpbmVyLCBpZiBuZWNlc3NhcnkuICBCYXNpY2FsbHksCisgKiB3cmFwIHNjYWxlciBwcmltaXRpdmVzIGluIE5TTnVtYmVyIG9iamVjdHMuCisgKi8KK3N0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6Ym94KHRfdHlwZSogdHR5cGUsIHN0cmluZyBmaWVsZF9uYW1lKSB7CisKKyAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKKyAgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gIkAoIiArIGZpZWxkX25hbWUgKyAiKSI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJjYW4ndCBib3ggdm9pZCI7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIHJldHVybiAiQCgiICsgZmllbGRfbmFtZSArICIpIjsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIC8vIGRvIG5vdGhpbmcKKyAgcmV0dXJuIGZpZWxkX25hbWU7Cit9CisKKy8qKgorICogRXh0cmFjdHMgdGhlIGFjdHVhbCB2YWx1ZSBmcm9tIGEgYm94ZWQgdmFsdWUKKyAqLworc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjp1bmJveCh0X3R5cGUqIHR0eXBlLCBzdHJpbmcgZmllbGRfbmFtZSkgeworICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOworICBpZiAodHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiWyIgKyBmaWVsZF9uYW1lICsgIiBpbnRWYWx1ZV0iOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICB0aHJvdyAiY2FuJ3QgdW5ib3ggdm9pZCI7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIHJldHVybiAiWyIgKyBmaWVsZF9uYW1lICsgIiBib29sVmFsdWVdIjsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIHJldHVybiAiKChTSW50OClbIiArIGZpZWxkX25hbWUgKyAiIGNoYXJWYWx1ZV0pIjsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICByZXR1cm4gIigoU0ludDE2KVsiICsgZmllbGRfbmFtZSArICIgc2hvcnRWYWx1ZV0pIjsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICByZXR1cm4gIigoU0ludDMyKVsiICsgZmllbGRfbmFtZSArICIgbG9uZ1ZhbHVlXSkiOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIHJldHVybiAiKChTSW50NjQpWyIgKyBmaWVsZF9uYW1lICsgIiBsb25nTG9uZ1ZhbHVlXSkiOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIHJldHVybiAiWyIgKyBmaWVsZF9uYW1lICsgIiBkb3VibGVWYWx1ZV0iOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgLy8gZG8gbm90aGluZworICByZXR1cm4gZmllbGRfbmFtZTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgY29kZSB0byBkZXNlcmlhbGl6ZSBhIG1hcCBlbGVtZW50CisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZpZWxkTmFtZSkgeworICBzdHJpbmcga2V5ID0gdG1wKCJfa2V5Iik7CisgIHN0cmluZyB2YWwgPSB0bXAoIl92YWwiKTsKKyAgdF90eXBlKiBrZXlUeXBlID0gdG1hcC0+Z2V0X2tleV90eXBlKCk7CisgIHRfdHlwZSogdmFsVHlwZSA9IHRtYXAtPmdldF92YWxfdHlwZSgpOworICB0X2ZpZWxkIGZrZXkoa2V5VHlwZSwga2V5KTsKKyAgdF9maWVsZCBmdmFsKHZhbFR5cGUsIHZhbCk7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmtleSwga2V5KTsKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnZhbCwgdmFsKTsKKworICBpbmRlbnQob3V0KSA8PCAiWyIgPDwgZmllbGROYW1lIDw8ICIgc2V0T2JqZWN0OiAiIDw8IGJveCh2YWxUeXBlLCB2YWwpCisgICAgICAgICAgICAgIDw8ICIgZm9yS2V5OiAiIDw8IGJveChrZXlUeXBlLCBrZXkpIDw8ICJdOyIgPDwgZW5kbDsKK30KKworLyoqCisgKiBEZXNlcmlhbGl6ZXMgYSBzZXQgZWxlbWVudAorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdHNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmaWVsZE5hbWUpIHsKKyAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7CisgIHRfdHlwZSogdHlwZSA9IHRzZXQtPmdldF9lbGVtX3R5cGUoKTsKKyAgdF9maWVsZCBmZWxlbSh0eXBlLCBlbGVtKTsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSwgZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgIlsiIDw8IGZpZWxkTmFtZSA8PCAiIGFkZE9iamVjdDogIiA8PCBib3godHlwZSwgZWxlbSkgPDwgIl07IiA8PCBlbmRsOworfQorCisvKioKKyAqIERlc2VyaWFsaXplcyBhIGxpc3QgZWxlbWVudAorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZpZWxkTmFtZSkgeworICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKKyAgdF90eXBlKiB0eXBlID0gdGxpc3QtPmdldF9lbGVtX3R5cGUoKTsKKyAgdF9maWVsZCBmZWxlbSh0eXBlLCBlbGVtKTsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSwgZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgIlsiIDw8IGZpZWxkTmFtZSA8PCAiIGFkZE9iamVjdDogIiA8PCBib3godHlwZSwgZWxlbSkgPDwgIl07IiA8PCBlbmRsOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KKyAqCisgKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCB0byBzZXJpYWxpemUKKyAqIEBwYXJhbSBmaWVsZE5hbWUgTmFtZSB0byBvZiB0aGUgdmFyaWFibGUgaG9sZGluZyB0aGUgZmllbGQKKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdHJpbmcgZmllbGROYW1lKSB7CisgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKworICAvLyBEbyBub3RoaW5nIGZvciB2b2lkIHR5cGVzCisgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIFNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgIH0KKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIGZpZWxkTmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgZmllbGROYW1lKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCFbb3V0UHJvdG9jb2wgIjsKKworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIGZpZWxkTmFtZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgICAgb3V0IDw8ICJ3cml0ZUJpbmFyeTogIiA8PCBmaWVsZE5hbWUgPDwgIiBlcnJvcjogX190aHJpZnRFcnJvcl0iOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG91dCA8PCAid3JpdGVTdHJpbmc6ICIgPDwgZmllbGROYW1lIDw8ICIgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdIjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUJvb2w6ICIgPDwgZmllbGROYW1lIDw8ICIgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICBvdXQgPDwgIndyaXRlQnl0ZTogKFVJbnQ4KSIgPDwgZmllbGROYW1lIDw8ICIgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUkxNjogIiA8PCBmaWVsZE5hbWUgPDwgIiBlcnJvcjogX190aHJpZnRFcnJvcl0iOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBvdXQgPDwgIndyaXRlSTMyOiAiIDw8IGZpZWxkTmFtZSA8PCAiIGVycm9yOiBfX3RocmlmdEVycm9yXSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIG91dCA8PCAid3JpdGVJNjQ6ICIgPDwgZmllbGROYW1lIDw8ICIgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgb3V0IDw8ICJ3cml0ZURvdWJsZTogIiA8PCBmaWVsZE5hbWUgPDwgIiBlcnJvcjogX190aHJpZnRFcnJvcl0iOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gT2JqZWN0aXZlLUMgbmFtZSBmb3IgYmFzZSB0eXBlICIKKyAgICAgICAgICAgICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgb3V0IDw8ICJ3cml0ZUkzMjogIiA8PCBmaWVsZE5hbWUgPDwgIiBlcnJvcjogX190aHJpZnRFcnJvcl0iOworICAgIH0KKyAgICBvdXQgPDwgIikgcmV0dXJuIE5POyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCisgICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7CisgIH0KK30KKworLyoqCisgKiBTZXJpYWxpemUgYSBzdHJ1Y3QuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCB0byBzZXJpYWxpemUKKyAqIEBwYXJhbSBmaWVsZE5hbWUgTmFtZSBvZiB2YXJpYWJsZSBob2xkaW5nIHN0cnVjdAorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmaWVsZE5hbWUpIHsKKyAgKHZvaWQpdHN0cnVjdDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIVsiIDw8IGZpZWxkTmFtZSA8PCAiIHdyaXRlOiBvdXRQcm90b2NvbCBlcnJvcjogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhIGNvbnRhaW5lciBieSB3cml0aW5nIGl0cyBzaXplIHRoZW4gdGhlIGVsZW1lbnRzLgorICoKKyAqIEBwYXJhbSB0dHlwZSAgVGhlIHR5cGUgb2YgY29udGFpbmVyCisgKiBAcGFyYW0gZmllbGROYW1lIE5hbWUgb2YgdmFyaWFibGUgaG9sZGluZyBjb250YWluZXIKKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmaWVsZE5hbWUpIHsKKyAgc2NvcGVfdXAob3V0KTsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlmICghW291dFByb3RvY29sIHdyaXRlTWFwQmVnaW5XaXRoS2V5VHlwZTogIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKQorICAgICAgICAgICAgICAgIDw8ICIgdmFsdWVUeXBlOiAiIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSA8PCAiIHNpemU6IChTSW50MzIpWyIKKyAgICAgICAgICAgICAgICA8PCBmaWVsZE5hbWUgPDwgIiBjb3VudF0gZXJyb3I6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpZiAoIVtvdXRQcm90b2NvbCB3cml0ZVNldEJlZ2luV2l0aEVsZW1lbnRUeXBlOiAiCisgICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiIHNpemU6IChTSW50MzIpWyIgPDwgZmllbGROYW1lCisgICAgICAgICAgICAgICAgPDwgIiBjb3VudF0gZXJyb3I6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCFbb3V0UHJvdG9jb2wgd3JpdGVMaXN0QmVnaW5XaXRoRWxlbWVudFR5cGU6ICIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiIHNpemU6IChTSW50MzIpWyIgPDwgZmllbGROYW1lCisgICAgICAgICAgICAgICAgPDwgIiBjb3VudF0gZXJyb3I6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworICB9CisKKyAgc3RyaW5nIGl0ZXIgPSB0bXAoIl9pdGVyIik7CisgIHN0cmluZyBrZXk7CisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBrZXkgPSB0bXAoImtleSIpOworICAgIGluZGVudChvdXQpIDw8ICJOU0VudW1lcmF0b3IgKiAiIDw8IGl0ZXIgPDwgIiA9IFsiIDw8IGZpZWxkTmFtZSA8PCAiIGtleUVudW1lcmF0b3JdOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWQgIiA8PCBrZXkgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIndoaWxlICgoIiA8PCBrZXkgPDwgIiA9IFsiIDw8IGl0ZXIgPDwgIiBuZXh0T2JqZWN0XSkpIiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGtleSA9IHRtcCgib2JqIik7CisgICAgaW5kZW50KG91dCkgPDwgIk5TRW51bWVyYXRvciAqICIgPDwgaXRlciA8PCAiID0gWyIgPDwgZmllbGROYW1lIDw8ICIgb2JqZWN0RW51bWVyYXRvcl07IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgImlkICIgPDwga2V5IDw8ICI7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJ3aGlsZSAoKCIgPDwga2V5IDw8ICIgPSBbIiA8PCBpdGVyIDw8ICIgbmV4dE9iamVjdF0pKSIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAga2V5ID0gdG1wKCJpZHgiKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiaW50ICIgPDwga2V5IDw8ICI7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJmb3IgKCIgPDwga2V5IDw8ICIgPSAwOyAiIDw8IGtleSA8PCAiIDwgWyIgPDwgZmllbGROYW1lIDw8ICIgY291bnRdOyAiIDw8IGtleQorICAgICAgICAgICAgICAgIDw8ICIrKykiIDw8IGVuZGw7CisgIH0KKworICBzY29wZV91cChvdXQpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBrZXksIGZpZWxkTmFtZSk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwga2V5KTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBrZXksIGZpZWxkTmFtZSk7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpZiAoIVtvdXRQcm90b2NvbCB3cml0ZU1hcEVuZDogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlmICghW291dFByb3RvY29sIHdyaXRlU2V0RW5kOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlmICghW291dFByb3RvY29sIHdyaXRlTGlzdEVuZDogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIG1hcC4KKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBtYXBOYW1lKSB7CisgIHRfZmllbGQga2ZpZWxkKHRtYXAtPmdldF9rZXlfdHlwZSgpLCBrZXkpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAma2ZpZWxkLCB1bmJveChrZmllbGQuZ2V0X3R5cGUoKSwga2V5KSk7CisgIHRfZmllbGQgdmZpZWxkKHRtYXAtPmdldF92YWxfdHlwZSgpLCAiWyIgKyBtYXBOYW1lICsgIiBvYmplY3RGb3JLZXk6ICIgKyBrZXkgKyAiXSIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmdmZpZWxkLCB1bmJveCh2ZmllbGQuZ2V0X3R5cGUoKSwgdmZpZWxkLmdldF9uYW1lKCkpKTsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgc2V0LgorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0c2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBlbGVtZW50TmFtZSkgeworICB0X2ZpZWxkIGVmaWVsZCh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGVsZW1lbnROYW1lKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgdW5ib3goZWZpZWxkLmdldF90eXBlKCksIGVsZW1lbnROYW1lKSk7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIGxpc3QuCisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBsaXN0TmFtZSkgeworICB0X2ZpZWxkIGVmaWVsZCh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCAiWyIgKyBsaXN0TmFtZSArICIgb2JqZWN0QXRJbmRleDogIiArIGluZGV4ICsgIl0iKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgdW5ib3goZWZpZWxkLmdldF90eXBlKCksIGVmaWVsZC5nZXRfbmFtZSgpKSk7Cit9CisKKy8qKgorICogUmV0dXJucyBhbiBPYmplY3RpdmUtQyBuYW1lCisgKgorICogQHBhcmFtIHR0eXBlIFRoZSB0eXBlCisgKiBAcGFyYW0gY2xhc3NfcmVmIERvIHdlIHdhbnQgYSBDbGFzcyByZWZlcmVuY2UgaXN0ZWFkIG9mIGEgdHlwZSByZWZlcmVuY2U/CisgKiBAcmV0dXJuIE9iamVjdGl2ZS1DIHR5cGUgbmFtZSwgaS5lLiBOU0RpY3Rpb25hcnk8S2V5LFZhbHVlPiAqCisgKi8KK3N0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6dHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsIGJvb2wgY2xhc3NfcmVmLCBib29sIG5lZWRzX211dGFibGUpIHsKKyAgaWYgKHR0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICBzdHJpbmcgbmFtZSA9IChuZWVkc19tdXRhYmxlICYmIHR0eXBlLT5nZXRfdHJ1ZV90eXBlKCktPmlzX2NvbnRhaW5lcigpKSA/ICJNdXRhYmxlIiArIHR0eXBlLT5nZXRfbmFtZSgpIDogdHR5cGUtPmdldF9uYW1lKCk7CisgICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHR5cGUtPmdldF9wcm9ncmFtKCk7CisgICAgcmV0dXJuIHByb2dyYW0gPyAocHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiY29jb2EiKSArIG5hbWUpIDogbmFtZTsKKyAgfQorCisgIHN0cmluZyByZXN1bHQ7CisgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICByZXR1cm4gYmFzZV90eXBlX25hbWUoKHRfYmFzZV90eXBlKil0dHlwZSk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiBjb2NvYV9wcmVmaXhfICsgdHR5cGUtPmdldF9uYW1lKCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgdF9tYXAgKm1hcCA9ICh0X21hcCAqKXR0eXBlOworICAgIHJlc3VsdCA9IG5lZWRzX211dGFibGUgPyAiTlNNdXRhYmxlRGljdGlvbmFyeSIgOiAiTlNEaWN0aW9uYXJ5IjsKKyAgICByZXN1bHQgKz0gIjwiICsgZWxlbWVudF90eXBlX25hbWUobWFwLT5nZXRfa2V5X3R5cGUoKSkgKyAiLCAiICsgZWxlbWVudF90eXBlX25hbWUobWFwLT5nZXRfdmFsX3R5cGUoKSkgKyAiPiI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgdF9zZXQgKnNldCA9ICh0X3NldCAqKXR0eXBlOworICAgIHJlc3VsdCA9IG5lZWRzX211dGFibGUgPyAiTlNNdXRhYmxlU2V0IiA6ICJOU1NldCI7CisgICAgcmVzdWx0ICs9ICI8IiArIGVsZW1lbnRfdHlwZV9uYW1lKHNldC0+Z2V0X2VsZW1fdHlwZSgpKSArICI+IjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgdF9saXN0ICpsaXN0ID0gKHRfbGlzdCAqKXR0eXBlOworICAgIHJlc3VsdCA9IG5lZWRzX211dGFibGUgPyAiTlNNdXRhYmxlQXJyYXkiIDogIk5TQXJyYXkiOworICAgIHJlc3VsdCArPSAiPCIgKyBlbGVtZW50X3R5cGVfbmFtZShsaXN0LT5nZXRfZWxlbV90eXBlKCkpICsgIj4iOworICB9IGVsc2UgeworICAgIC8vIENoZWNrIGZvciBwcmVmaXgKKyAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKTsKKyAgICBpZiAocHJvZ3JhbSAhPSBOVUxMKSB7CisgICAgICByZXN1bHQgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJjb2NvYSIpICsgdHR5cGUtPmdldF9uYW1lKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdCA9IHR0eXBlLT5nZXRfbmFtZSgpOworICAgIH0KKyAgfQorCisgIGlmICghY2xhc3NfcmVmKSB7CisgICAgcmVzdWx0ICs9ICIgKiI7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBSZXR1cm5zIGFuIE9iamVjdGl2ZS1DIHR5cGUgbmFtZSBmb3IgY29udGFpbmVyIHR5cGVzCisgKgorICogQHBhcmFtIHR0eXBlIHRoZSB0eXBlCisgKi8KK3N0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6ZWxlbWVudF90eXBlX25hbWUodF90eXBlKiBldHlwZSkgeworCisgIHRfdHlwZSogdHR5cGUgPSBldHlwZS0+Z2V0X3RydWVfdHlwZSgpOworCisgIGlmIChldHlwZS0+aXNfdHlwZWRlZigpICYmIHR5cGVfY2FuX2JlX251bGwodHR5cGUpKSB7CisgICAgcmV0dXJuIHR5cGVfbmFtZShldHlwZSk7CisgIH0KKworICBzdHJpbmcgcmVzdWx0OworICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGUqIHRiYXNlID0gKHRfYmFzZV90eXBlKil0dHlwZTsKKyAgICBzd2l0Y2ggKHRiYXNlLT5nZXRfYmFzZSgpKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICBpZiAodGJhc2UtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgIHJlc3VsdCA9ICJOU0RhdGEgKiI7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgcmVzdWx0ID0gIk5TU3RyaW5nICoiOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJlc3VsdCA9ICJOU051bWJlciAqIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7CisgICAgICByZXN1bHQgPSAiTlNOdW1iZXIgKiI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgdF9tYXAgKm1hcCA9ICh0X21hcCAqKXR0eXBlOworICAgIHJlc3VsdCA9ICJOU0RpY3Rpb25hcnk8IiArIGVsZW1lbnRfdHlwZV9uYW1lKG1hcC0+Z2V0X2tleV90eXBlKCkpICsgIiwgIiArIGVsZW1lbnRfdHlwZV9uYW1lKG1hcC0+Z2V0X3ZhbF90eXBlKCkpICsgIj4gKiI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgdF9zZXQgKnNldCA9ICh0X3NldCAqKXR0eXBlOworICAgIHJlc3VsdCA9ICJOU1NldDwiICsgZWxlbWVudF90eXBlX25hbWUoc2V0LT5nZXRfZWxlbV90eXBlKCkpICsgIj4gKiI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHRfbGlzdCAqbGlzdCA9ICh0X2xpc3QgKil0dHlwZTsKKyAgICByZXN1bHQgPSAiTlNBcnJheTwiICsgZWxlbWVudF90eXBlX25hbWUobGlzdC0+Z2V0X2VsZW1fdHlwZSgpKSArICI+ICoiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJlc3VsdCA9IGNvY29hX3ByZWZpeF8gKyB0dHlwZS0+Z2V0X25hbWUoKSArICIgKiI7CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIFJldHVybnMgdGhlIE9iamVjdGl2ZS1DIHR5cGUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgdGhyaWZ0IHR5cGUuCisgKgorICogQHBhcmFtIHRiYXNlIFRoZSBiYXNlIHR5cGUKKyAqLworc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjpiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZSogdHlwZSkgeworICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gdHlwZS0+Z2V0X2Jhc2UoKTsKKworICBzd2l0Y2ggKHRiYXNlKSB7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICByZXR1cm4gInZvaWQiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgIHJldHVybiAiTlNEYXRhICoiOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gIk5TU3RyaW5nICoiOworICAgIH0KKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgIHJldHVybiAiQk9PTCI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgcmV0dXJuICJTSW50OCI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIHJldHVybiAiU0ludDE2IjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgcmV0dXJuICJTSW50MzIiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICByZXR1cm4gIlNJbnQ2NCI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgIHJldHVybiAiZG91YmxlIjsKKyAgZGVmYXVsdDoKKyAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIE9iamVjdGl2ZS1DIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgfQorfQorCisvKioKKyAqIFByaW50cyB0aGUgdmFsdWUgb2YgYSBjb25zdGFudCB3aXRoIHRoZSBnaXZlbiB0eXBlLiBOb3RlIHRoYXQgdHlwZSBjaGVja2luZworICogaXMgTk9UIHBlcmZvcm1lZCBpbiB0aGlzIGZ1bmN0aW9uIGFzIGl0IGlzIGFsd2F5cyBydW4gYmVmb3JlaGFuZCB1c2luZyB0aGUKKyAqIHZhbGlkYXRlX3R5cGVzIG1ldGhvZCBpbiBtYWluLmNjCisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OnByaW50X2NvbnN0X3ZhbHVlKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlZnZhbCkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICBzdHJpbmcgdjIgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCB0eXBlLCB2YWx1ZSk7CisgICAgaW5kZW50KG91dCk7CisgICAgaWYgKGRlZnZhbCkKKyAgICAgIG91dCA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiAiOworICAgIG91dCA8PCBuYW1lIDw8ICIgPSAiIDw8IHYyIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgaW5kZW50KG91dCk7CisgICAgaWYgKGRlZnZhbCkKKyAgICAgIG91dCA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiAiOworICAgIG91dCA8PCBuYW1lIDw8ICIgPSAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIHR5cGUsIHZhbHVlKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBpbmRlbnQob3V0KTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBpZiAoZGVmdmFsKQorICAgICAgb3V0IDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiICI7CisgICAgb3V0IDw8IG5hbWUgPDwgIiA9IFsiIDw8IHR5cGVfbmFtZSh0eXBlLCB0cnVlKSA8PCAiIG5ld107IgorICAgICAgICA8PCBlbmRsOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOworICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKKyAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisgICAgICB9CisgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgICAgc3RkOjpzdHJpbmcgY2FwX25hbWUgPSBjYXBpdGFsaXplKHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSk7CisgICAgICBpbmRlbnQob3V0KSA8PCAiWyIgPDwgbmFtZSA8PCAiIHNldCIgPDwgY2FwX25hbWUgPDwgIjoiIDw8IHZhbCA8PCAiXTsiIDw8IGVuZGw7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgb3N0cmluZ3N0cmVhbSBtYXBvdXQ7CisgICAgaW5kZW50KG1hcG91dCk7CisgICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgaWYgKGRlZnZhbCkKKyAgICAgIG1hcG91dCA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiAiOworICAgIG1hcG91dCA8PCBuYW1lIDw8ICIgPSBAeyI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTspIHsKKyAgICAgIG1hcG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBrdHlwZSwgdl9pdGVyLT5maXJzdCwgdHJ1ZSkgPDwgIjogIgorICAgICAgICAgIDw8IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIHZ0eXBlLCB2X2l0ZXItPnNlY29uZCwgdHJ1ZSk7CisgICAgICBpZiAoKyt2X2l0ZXIgIT0gdmFsLmVuZCgpKSB7CisgICAgICAgIG1hcG91dCA8PCAiLCAiOworICAgICAgfQorICAgIH0KKyAgICBtYXBvdXQgPDwgIn0iOworICAgIG91dCA8PCBtYXBvdXQuc3RyKCk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgb3N0cmluZ3N0cmVhbSBsaXN0b3V0OworICAgIGluZGVudChsaXN0b3V0KTsKKyAgICB0X3R5cGUqIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGlmIChkZWZ2YWwpCisgICAgICBsaXN0b3V0IDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiICI7CisgICAgbGlzdG91dCA8PCBuYW1lIDw8ICIgPSBAWyI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTspIHsKKyAgICAgIGxpc3RvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgZXR5cGUsICp2X2l0ZXIsIHRydWUpOworICAgICAgaWYgKCsrdl9pdGVyICE9IHZhbC5lbmQoKSkgeworICAgICAgICBsaXN0b3V0IDw8ICIsICI7CisgICAgICB9CisgICAgfQorICAgIGxpc3RvdXQgPDwgIl0iOworICAgIG91dCA8PCBsaXN0b3V0LnN0cigpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgb3N0cmluZ3N0cmVhbSBzZXRvdXQ7CisgICAgaW5kZW50KHNldG91dCk7CisgICAgdF90eXBlKiBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGlmIChkZWZ2YWwpCisgICAgICBzZXRvdXQgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgIjsKKyAgICBzZXRvdXQgPDwgbmFtZSA8PCAiID0gW05TU2V0IHNldFdpdGhBcnJheTpAWyI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTspIHsKKyAgICAgIHNldG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBldHlwZSwgKnZfaXRlciwgdHJ1ZSk7CisgICAgICBpZiAoKyt2X2l0ZXIgIT0gdmFsLmVuZCgpKSB7CisgICAgICAgIHNldG91dCA8PCAiLCAiOworICAgICAgfQorICAgIH0KKyAgICBzZXRvdXQgPDwgIl1dIjsKKyAgICBvdXQgPDwgc2V0b3V0LnN0cigpOworICB9IGVsc2UgeworICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgdHlwZSAiICsgdHlwZS0+Z2V0X25hbWUoKTsKKyAgfQorfQorCitzdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZShvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYm94X2l0KSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworICBzdGQ6Om9zdHJpbmdzdHJlYW0gcmVuZGVyOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAvLyBXZSBtdXN0IGhhbmRsZSBiaW5hcnkgY29uc3RhbnQgYnV0IHRoZSBzeW50YXggb2YgSURMIGRlZmluZXMKKyAgICAgIC8vIG5vdGhpbmcgYWJvdXQgYmluYXJ5IGNvbnN0YW50LgorICAgICAgLy8gICBpZiB0eXBlLT5pc19iaW5hcnkoKSkKKyAgICAgIC8vICAgICAgLy8gYmluYXJ5IGNvZGUKKyAgICAgIHJlbmRlciA8PCAiQFwiIiA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICciJzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJlbmRlciA8PCAoKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCkgPyAiWUVTIiA6ICJOTyIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKKyAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgfSBlbHNlIHsKKyAgICBzdHJpbmcgdCA9IHRtcCgidG1wIik7CisgICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LCB0LCB0eXBlLCB2YWx1ZSwgdHJ1ZSk7CisgICAgb3V0IDw8ICI7IiA8PCBlbmRsOworICAgIHJlbmRlciA8PCB0OworICB9CisKKyAgaWYgKGJveF9pdCkgeworICAgIHJldHVybiBib3godHlwZSwgcmVuZGVyLnN0cigpKTsKKyAgfQorICByZXR1cm4gcmVuZGVyLnN0cigpOworfQorCisjaWYgMAorLyoqCitPUklHSU5BTAorICogU3BpdCBvdXQgY29kZSB0aGF0IGV2YWx1YXRlcyB0byB0aGUgc3BlY2lmaWVkIGNvbnN0YW50IHZhbHVlLgorICovCitzdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZShzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBib3hfaXQpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSByZW5kZXI7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJlbmRlciA8PCAiQFwiIiA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICciJzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJlbmRlciA8PCAoKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCkgPyAiWUVTIiA6ICJOTyIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKKyAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgaWYgKHZhbC5zaXplKCkgPiAwKQorICAgICAgcmVuZGVyIDw8ICJbWyIgPDwgdHlwZV9uYW1lKHR5cGUsIHRydWUpIDw8ICIgYWxsb2NdIGluaXRXaXRoIjsKKyAgICBlbHNlCisgICAgICByZW5kZXIgPDwgIltbIiA8PCB0eXBlX25hbWUodHlwZSwgdHJ1ZSkgPDwgIiBhbGxvY10gaW5pdCI7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIC8vIEZJWE1FIFRoZSBnZW5lcmF0ZWQgY29kZSBkb2VzIG5vdCBtYXRjaCB3aXRoIGluaXRXaXRoWFhYCisgICAgICAvLyAgICAgICBpbml0aWFsaXplciBhbmQgY2F1c2VzIGNvbXBpbGUgZXJyb3IuCisgICAgICAvLyAgICAgICBUcnk6IHRlc3QvRGVidWdQcm90b1Rlc3QudGhyaWZ0IGFuZCB0ZXN0L1NtYWxsVGVzdC50aHJpZnQKKyAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7CisgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgeworICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKKyAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKKyAgICAgIH0KKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICByZW5kZXIgPDwgY2FwaXRhbGl6ZSh2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpOworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVuZGVyIDw8ICIgIiA8PCB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisgICAgICB9CisgICAgICByZW5kZXIgPDwgIjogIiA8PCByZW5kZXJfY29uc3RfdmFsdWUobmFtZSwgZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgIH0KKyAgICByZW5kZXIgPDwgIl0iOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmVuZGVyIDw8ICJbW05TRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhPYmplY3RzQW5kS2V5czogIjsKKyAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgc3RyaW5nIGtleSA9IHJlbmRlcl9jb25zdF92YWx1ZShuYW1lLCBrdHlwZSwgdl9pdGVyLT5maXJzdCwgdHJ1ZSk7CisgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG5hbWUsIHZ0eXBlLCB2X2l0ZXItPnNlY29uZCwgdHJ1ZSk7CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlbmRlciA8PCAiLCAiOworICAgICAgfQorICAgICAgcmVuZGVyIDw8IHZhbCA8PCAiLCAiIDw8IGtleTsKKyAgICB9CisgICAgaWYgKGZpcnN0KQorICAgICAgcmVuZGVyIDw8ICIgbmlsXSI7CisgICAgZWxzZQorICAgICAgcmVuZGVyIDw8ICIsIG5pbF0iOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJlbmRlciA8PCAiW1tOU0FycmF5IGFsbG9jXSBpbml0V2l0aE9iamVjdHM6ICI7CisgICAgdF90eXBlICogZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVuZGVyIDw8ICIsICI7CisgICAgICB9CisgICAgICByZW5kZXIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKG5hbWUsIGV0eXBlLCAqdl9pdGVyLCB0cnVlKTsKKyAgICB9CisgICAgaWYgKGZpcnN0KQorICAgICAgcmVuZGVyIDw8ICIgbmlsXSI7CisgICAgZWxzZQorICAgICAgcmVuZGVyIDw8ICIsIG5pbF0iOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmVuZGVyIDw8ICJbW05TU2V0IGFsbG9jXSBpbml0V2l0aE9iamVjdHM6ICI7CisgICAgdF90eXBlICogZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICByZW5kZXIgPDwgIiwgIjsKKyAgICAgIH0KKyAgICAgIHJlbmRlciA8PCByZW5kZXJfY29uc3RfdmFsdWUobmFtZSwgZXR5cGUsICp2X2l0ZXIsIHRydWUpOworICAgIH0KKyAgICBpZiAoZmlyc3QpCisgICAgICByZW5kZXIgPDwgIiBuaWxdIjsKKyAgICBlbHNlCisgICAgICByZW5kZXIgPDwgIiwgbmlsXSI7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgImRvbid0IGtub3cgaG93IHRvIHJlbmRlciBjb25zdGFudCBmb3IgdHlwZTogIiArIHR5cGUtPmdldF9uYW1lKCk7CisgIH0KKworICBpZiAoYm94X2l0KSB7CisgICAgcmV0dXJuIGJveCh0eXBlLCByZW5kZXIuc3RyKCkpOworICB9CisKKyAgcmV0dXJuIHJlbmRlci5zdHIoKTsKK30KKyNlbmRpZgorCisvKioKKyAqIERlY2xhcmVzIGFuIE9iamVjdGl2ZS1DIDIuMCBwcm9wZXJ0eS4KKyAqCisgKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCB0byBkZWNsYXJlIGEgcHJvcGVydHkgZm9yCisgKi8KK3N0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6ZGVjbGFyZV9wcm9wZXJ0eSh0X2ZpZWxkKiB0ZmllbGQpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHJlbmRlcjsKKyAgcmVuZGVyIDw8ICJAcHJvcGVydHkgKCI7CisKKyAgaWYgKHR5cGVfY2FuX2JlX2NvcHkodGZpZWxkLT5nZXRfdHlwZSgpKSkgeworICAgIHJlbmRlciA8PCAiY29weSwgIjsKKyAgfSBlbHNlIGlmICh0eXBlX2Nhbl9iZV9udWxsKHRmaWVsZC0+Z2V0X3R5cGUoKSkpIHsKKyAgICByZW5kZXIgPDwgInN0cm9uZywgIjsKKyAgfSBlbHNlIHsKKyAgICByZW5kZXIgPDwgImFzc2lnbiwgIjsKKyAgfQorCisgIHJlbmRlciA8PCAibm9uYXRvbWljKSAiIDw8IHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCksIGZhbHNlLCB0cnVlKSA8PCAiICIKKyAgPDwgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICI7IjsKKworICAvLyBDaGVjayBpZiB0aGUgcHJvcGVydHkgbmFtZSBpcyBhbiBPYmplY3RpdmUtQyByZXR1cm4gKzEgY291bnQgc2lnbmFsCisgIGlmICgodGZpZWxkLT5nZXRfbmFtZSgpLmxlbmd0aCgpID49IDMgJiYgdGZpZWxkLT5nZXRfbmFtZSgpLnN1YnN0cigwLDMpID09ICJuZXciKSB8fAorICAgICAgKHRmaWVsZC0+Z2V0X25hbWUoKS5sZW5ndGgoKSA+PSA2ICYmIHRmaWVsZC0+Z2V0X25hbWUoKS5zdWJzdHIoMCw2KSA9PSAiY3JlYXRlIikgfHwKKyAgICAgICh0ZmllbGQtPmdldF9uYW1lKCkubGVuZ3RoKCkgPj0gNSAmJiB0ZmllbGQtPmdldF9uYW1lKCkuc3Vic3RyKDAsNSkgPT0gImFsbG9jIikpIHsKKyAgICAvLyBMZXQgT2JqZWN0aXZlLUMga25vdyBub3QgdG8gcmV0dXJuICsxIGZvciBvYmplY3QgcG9pbnRlcnMKKyAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0ZmllbGQtPmdldF90eXBlKCkpKSB7CisgICAgICByZW5kZXIgPDwgZW5kbDsKKyAgICAgIHJlbmRlciA8PCAiLSAoIiArIHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCkpICsgIikgIiArIGRlY2FwaXRhbGl6ZSh0ZmllbGQtPmdldF9uYW1lKCkpICsgIiBfX2F0dHJpYnV0ZV9fKChvYmpjX21ldGhvZF9mYW1pbHkobm9uZSkpKTsiOworICAgIH0KKyAgfQorCisgIHJldHVybiByZW5kZXIuc3RyKCk7Cit9CisKKy8qKgorICogRGVjbGFyZXMgYW4gT2JqZWN0aXZlLUMgMi4wIHByb3BlcnR5LgorICoKKyAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkIHRvIGRlY2xhcmUgYSBwcm9wZXJ0eSBmb3IKKyAqLworc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjpkZWNsYXJlX3Byb3BlcnR5X2lzc2V0KHRfZmllbGQqIHRmaWVsZCkgeworICByZXR1cm4gIkBwcm9wZXJ0eSAoYXNzaWduLCBub25hdG9taWMpIEJPT0wgIiArIGRlY2FwaXRhbGl6ZSh0ZmllbGQtPmdldF9uYW1lKCkpICsgIklzU2V0OyI7Cit9CisKKy8qKgorICogRGVjbGFyZXMgcHJvcGVydHkgdW5zZXQgbWV0aG9kLgorICoKKyAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkIHRvIGRlY2xhcmUgYSBwcm9wZXJ0eSBmb3IKKyAqLworc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjpkZWNsYXJlX3Byb3BlcnR5X3Vuc2V0KHRfZmllbGQqIHRmaWVsZCkgeworICByZXR1cm4gIi0gKHZvaWQpIHVuc2V0IiArIGNhcGl0YWxpemUodGZpZWxkLT5nZXRfbmFtZSgpKSArICI7IjsKK30KKworLyoqCisgKiBSZW5kZXJzIHRoZSBlYXJseSBvdXQgcmV0dXJuIHN0YXRlbWVudAorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgorICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgaW52YWxpZCByZXR1cm4gc3RhdG1lbnQKKyAqLworc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjppbnZhbGlkX3JldHVybl9zdGF0ZW1lbnQodF9mdW5jdGlvbiAqdGZ1bmN0aW9uKSB7CisgIGlmICgodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpKSB7CisgICAgcmV0dXJuICJyZXR1cm4gTk87IjsKKyAgfQorICByZXR1cm4gInJldHVybiBuaWw7IjsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCisgKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCisgKi8KK3N0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgYm9vbCBpbmNsdWRlX2Vycm9yKSB7CisgIHRfdHlwZSogdHR5cGUgPSB0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCk7CisgIHN0cmluZyByZXN1bHQ7CisgIGlmICh0dHlwZS0+aXNfdm9pZCgpKSB7CisgICAgcmVzdWx0ID0gIihCT09MKSI7CisgIH0KKyAgZWxzZSBpZiAodHlwZV9jYW5fYmVfbnVsbCh0dHlwZSkpIHsKKyAgICByZXN1bHQgPSAiKCIgKyB0eXBlX25hbWUodHR5cGUpICsgIikiOworICB9CisgIGVsc2UgeworICAgIHJlc3VsdCA9ICIoTlNOdW1iZXIgKikiOworICB9CisgIHJlc3VsdCArPSAiICIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSwgIiIsIGluY2x1ZGVfZXJyb3IpOworICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgdGhhdCByZXR1cm5zIGFzeW5jaHJvbm91c2x5IGluc3RlYWQgb2YKKyAqIGxpdGVyYWxseSByZXR1cm5pbmcuCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCisgKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCisgKi8KK3N0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6YXN5bmNfZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgYm9vbCBpbmNsdWRlX2Vycm9yKSB7CisgIHRfdHlwZSogdHR5cGUgPSB0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCk7CisgIHRfc3RydWN0KiB0YXJnbGlzdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKKyAgc3RyaW5nIHJlc3BvbnNlX3BhcmFtID0gInZvaWQgKF4pKCIgKyAoKHR0eXBlLT5pc192b2lkKCkpID8gIiIgOiB0eXBlX25hbWUodHR5cGUpKSArICIpIjsKKyAgc3RkOjpzdHJpbmcgcmVzdWx0ID0gIih2b2lkKSAiICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCksICIiLCBpbmNsdWRlX2Vycm9yKQorICArICh0YXJnbGlzdC0+Z2V0X21lbWJlcnMoKS5zaXplKCkgPyAiIHJlc3BvbnNlIiA6ICIiKSArICI6ICgiCisgICsgcmVzcG9uc2VfcGFyYW0gKyAiKSByZXNwb25zZUJsb2NrICIKKyAgKyAiZmFpbHVyZSA6IChUQXN5bmNGYWlsdXJlQmxvY2spIGZhaWx1cmVCbG9jayI7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSB0aGF0IHJldHVybnMgYSBwcm9taXNlIGluc3RlYWQgb2YKKyAqIGxpdGVyYWxseSByZXR1cm5pbmcuCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCisgKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCisgKi8KK3N0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6cHJvbWlzZV9mdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIHJldHVybiAiKEFueVByb21pc2UgKikgIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLCAiIiwgZmFsc2UpOworfQorCisvKioKKyAqIFJlbmRlcnMgYSBjb2xvbiBzZXBhcmF0ZWQgbGlzdCBvZiB0eXBlcyBhbmQgbmFtZXMsIHN1aXRhYmxlIGZvciBhbgorICogb2JqZWN0aXZlLWMgcGFyYW1ldGVyIGxpc3QKKyAqLworc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJvdG9jb2xfbmFtZSwgYm9vbCBpbmNsdWRlX2Vycm9yKSB7CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKyAgYm9vbCBpbmNsdWRlX3Byb3RvY29sID0gIXByb3RvY29sX25hbWUuZW1wdHkoKTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHN0cmluZyBhcmdQcmVmaXggPSAiIjsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIGFyZ1ByZWZpeCA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgIHJlc3VsdCArPSAiICI7CisgICAgfQorICAgIHJlc3VsdCArPSBhcmdQcmVmaXggKyAiOiAoIiArIHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF90eXBlKCkpICsgIikgIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgfQorICBpZiAoaW5jbHVkZV9wcm90b2NvbCkgeworICAgIGlmICghZmlyc3QpIHsKKyAgICAgIHJlc3VsdCArPSAiIHByb3RvY29sIjsKKyAgICB9CisgICAgcmVzdWx0ICs9ICI6IChpZDxUUHJvdG9jb2w+KSAiICsgcHJvdG9jb2xfbmFtZTsKKyAgICBmaXJzdCA9IGZhbHNlOworICB9CisgIGlmIChpbmNsdWRlX2Vycm9yKSB7CisgICAgaWYgKCFmaXJzdCkgeworICAgICAgcmVzdWx0ICs9ICIgZXJyb3IiOworICAgIH0KKyAgICByZXN1bHQgKz0gIjogKE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKV9fdGhyaWZ0RXJyb3IiOworICAgIGZpcnN0ID0gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhbiBPYmplY3RpdmUtQyBlbnVtIHN0cmluZyBmb3IgdGhlIGdpdmVuIHR5cGUuCisgKi8KK3N0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAiVFR5cGVTVFJJTkciOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiVFR5cGVCT09MIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmV0dXJuICJUVHlwZUJZVEUiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmV0dXJuICJUVHlwZUkxNiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gIlRUeXBlSTMyIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiVFR5cGVJNjQiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICJUVHlwZURPVUJMRSI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiVFR5cGVJMzIiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlU1RSVUNUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAiVFR5cGVNQVAiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICJUVHlwZVNFVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJUVHlwZUxJU1QiOworICB9CisKKyAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworfQorCisvKioKKyAqIFJldHVybnMgYSBmb3JtYXQgc3RyaW5nIHNwZWNpZmllciBmb3IgdGhlIHN1cHBsaWVkIHBhcnNlIHR5cGUuCisgKi8KK3N0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6Zm9ybWF0X3N0cmluZ19mb3JfdHlwZSh0X3R5cGUqIHR5cGUpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gIlxcXCIlQFxcXCIiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiJWkiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZXR1cm4gIiVpIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAiJWhpIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAiJWkiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICIlcWkiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICIlZiI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiJWkiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIiVAIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAiJUAiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICIlQCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICIlQCI7CisgIH0KKworICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIGZvcm1hdF9zdHJpbmdfZm9yX3R5cGU6ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworfQorCisvKioKKyAqIFJldHVybnMgYSBmb3JtYXQgY2FzdCBmb3IgdGhlIHN1cHBsaWVkIHBhcnNlIHR5cGUuCisgKi8KK3N0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6Zm9ybWF0X2Nhc3RfZm9yX3R5cGUodF90eXBlKiB0eXBlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICIiOyAvLyAiXFxcIiVAXFxcIiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICIiOyAvLyAiJWkiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZXR1cm4gIiI7IC8vICIlaSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gIiI7IC8vICIlaGkiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmV0dXJuICIoaW50KSI7IC8vICIlaSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIiI7IC8vICIlcWkiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICIiOyAvLyAiJWYiOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gIihpbnQpIjsgLy8gIiVpIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICIiOyAvLyAiJUAiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICIiOyAvLyAiJUAiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICIiOyAvLyAiJUAiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAiIjsgLy8gIiVAIjsKKyAgfQorCisgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gZm9ybWF0X2Nhc3RfZm9yX3R5cGU6ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworfQorCisvKioKKyAqIEdlbmVyYXRlIGEgY2FsbCB0byBhIGZpZWxkJ3Mgc2V0dGVyLgorICoKKyAqIEBwYXJhbSB0ZmllbGQgRmllbGQgdGhlIHNldHRlciBpcyBiZWluZyBjYWxsZWQgb24KKyAqIEBwYXJhbSBmaWVsZE5hbWUgTmFtZSBvZiB2YXJpYWJsZSB0byBwYXNzIHRvIHNldHRlcgorICovCisKK3N0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6Y2FsbF9maWVsZF9zZXR0ZXIodF9maWVsZCogdGZpZWxkLCBzdHJpbmcgZmllbGROYW1lKSB7CisgIHJldHVybiAic2VsZi4iICsgdGZpZWxkLT5nZXRfbmFtZSgpICsgIiA9ICIgKyBmaWVsZE5hbWUgKyAiOyI7Cit9CisKK1RIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoCisgICAgY29jb2EsCisgICAgIkNvY29hIiwKKyAgICAiICAgIGxvZ191bmV4cGVjdGVkOiAgTG9nIGV2ZXJ5IHRpbWUgYW4gdW5leHBlY3RlZCBmaWVsZCBJRCBvciB0eXBlIGlzIGVuY291bnRlcmVkLlxuIgorICAgICIgICAgZGVidWdfZGVzY3JpcHRpb25zOlxuIgorICAgICIgICAgICAgICAgICAgICAgICAgICBBbGxvdyB1c2Ugb2YgZGVidWdEZXNjcmlwdGlvbiBzbyB0aGUgYXBwIGNhbiBhZGQgZGVzY3JpcHRpb24gdmlhIGEgY2F0ZW9nb3J5L2V4dGVuc2lvblxuIgorICAgICIgICAgdmFsaWRhdGVfcmVxdWlyZWQ6XG4iCisgICAgIiAgICAgICAgICAgICAgICAgICAgIFRocm93cyBleGNlcHRpb24gaWYgYW55IHJlcXVpcmVkIGZpZWxkIGlzIG5vdCBzZXQuXG4iCisgICAgIiAgICBhc3luY19jbGllbnRzOiAgIEdlbmVyYXRlIGNsaWVudHMgd2hpY2ggaW52b2tlIGFzeW5jaHJvbm91c2x5IHZpYSBibG9jayBzeW50YXguXG4iCisgICAgIiAgICBwb2RzOiAgICAgICAgICAgIEdlbmVyYXRlIGltcG9ydHMgaW4gQ29jb3BvZHMgZnJhbWV3b3JrIGZvcm1hdC5cbiIKKyAgICAiICAgIHByb21pc2Vfa2l0OiAgICAgR2VuZXJhdGUgY2xpZW50cyB3aGljaCBpbnZva2UgYXN5bmNocm9ub3VzbHkgdmlhIHByb21pc2VzLlxuIikKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfY3BwX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfY3BwX2dlbmVyYXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjMwMzYzCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9jcHBfZ2VuZXJhdG9yLmNjCkBAIC0wLDAgKzEsNDQ5MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgorICogUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKKyAqIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGNhc3NlcnQ+CisKKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvbWFuaXA+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisKKyNpbmNsdWRlICJ0aHJpZnQvcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9vb3BfZ2VuZXJhdG9yLmgiCisKK3VzaW5nIHN0ZDo6bWFwOwordXNpbmcgc3RkOjpvZnN0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmVhbTsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjp2ZWN0b3I7CisKK3N0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKKworLyoqCisgKiBDKysgY29kZSBnZW5lcmF0b3IuIFRoaXMgaXMgbGVnaXRpbWFjeSBpbmNhcm5hdGUuCisgKgorICovCitjbGFzcyB0X2NwcF9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgdF9jcHBfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAorICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCisgICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkgeworICAgICh2b2lkKW9wdGlvbl9zdHJpbmc7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKworCisgICAgZ2VuX3B1cmVfZW51bXNfID0gZmFsc2U7CisgICAgdXNlX2luY2x1ZGVfcHJlZml4XyA9IGZhbHNlOworICAgIGdlbl9jb2Jfc3R5bGVfID0gZmFsc2U7CisgICAgZ2VuX25vX2NsaWVudF9jb21wbGV0aW9uXyA9IGZhbHNlOworICAgIGdlbl9ub19kZWZhdWx0X29wZXJhdG9yc18gPSBmYWxzZTsKKyAgICBnZW5fdGVtcGxhdGVzXyA9IGZhbHNlOworICAgIGdlbl90ZW1wbGF0ZXNfb25seV8gPSBmYWxzZTsKKyAgICBnZW5fbW92ZWFibGVfID0gZmFsc2U7CisgICAgZ2VuX25vX29zdHJlYW1fb3BlcmF0b3JzXyA9IGZhbHNlOworICAgIGdlbl9ub19za2VsZXRvbl8gPSBmYWxzZTsKKworICAgIGZvciggaXRlciA9IHBhcnNlZF9vcHRpb25zLmJlZ2luKCk7IGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCk7ICsraXRlcikgeworICAgICAgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoInB1cmVfZW51bXMiKSA9PSAwKSB7CisgICAgICAgIGdlbl9wdXJlX2VudW1zXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImluY2x1ZGVfcHJlZml4IikgPT0gMCkgeworICAgICAgICB1c2VfaW5jbHVkZV9wcmVmaXhfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgiY29iX3N0eWxlIikgPT0gMCkgeworICAgICAgICBnZW5fY29iX3N0eWxlXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoIm5vX2NsaWVudF9jb21wbGV0aW9uIikgPT0gMCkgeworICAgICAgICBnZW5fbm9fY2xpZW50X2NvbXBsZXRpb25fID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgibm9fZGVmYXVsdF9vcGVyYXRvcnMiKSA9PSAwKSB7CisgICAgICAgIGdlbl9ub19kZWZhdWx0X29wZXJhdG9yc18gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJ0ZW1wbGF0ZXMiKSA9PSAwKSB7CisgICAgICAgIGdlbl90ZW1wbGF0ZXNfID0gdHJ1ZTsKKyAgICAgICAgZ2VuX3RlbXBsYXRlc19vbmx5XyA9IChpdGVyLT5zZWNvbmQgPT0gIm9ubHkiKTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgibW92ZWFibGVfdHlwZXMiKSA9PSAwKSB7CisgICAgICAgIGdlbl9tb3ZlYWJsZV8gPSB0cnVlOworICAgICAgfSBlbHNlIGlmICggaXRlci0+Zmlyc3QuY29tcGFyZSgibm9fb3N0cmVhbV9vcGVyYXRvcnMiKSA9PSAwKSB7CisgICAgICAgIGdlbl9ub19vc3RyZWFtX29wZXJhdG9yc18gPSB0cnVlOworICAgICAgfSBlbHNlIGlmICggaXRlci0+Zmlyc3QuY29tcGFyZSgibm9fc2tlbGV0b24iKSA9PSAwKSB7CisgICAgICAgIGdlbl9ub19za2VsZXRvbl8gPSB0cnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgInVua25vd24gb3B0aW9uIGNwcDoiICsgaXRlci0+Zmlyc3Q7CisgICAgICB9CisgICAgfQorCisgICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tY3BwIjsKKyAgfQorCisgIC8qKgorICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCisgICAqLworCisgIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKKyAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKKworICB2b2lkIGdlbmVyYXRlX2NvbnN0cyhzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKTsKKworICAvKioKKyAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZik7CisgIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKTsKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtX29zdHJlYW1fb3BlcmF0b3JfZGVjbChzdGQ6Om9zdHJlYW0mIG91dCwgdF9lbnVtKiB0ZW51bSk7CisgIHZvaWQgZ2VuZXJhdGVfZW51bV9vc3RyZWFtX29wZXJhdG9yKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2VudW0qIHRlbnVtKTsKKyAgdm9pZCBnZW5lcmF0ZV9mb3J3YXJkX2RlY2xhcmF0aW9uKHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsgZ2VuZXJhdGVfY3BwX3N0cnVjdCh0c3RydWN0LCBmYWxzZSk7IH0KKyAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7IGdlbmVyYXRlX2NwcF9zdHJ1Y3QodHhjZXB0aW9uLCB0cnVlKTsgfQorICB2b2lkIGdlbmVyYXRlX2NwcF9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisKKyAgdm9pZCBwcmludF9jb25zdF92YWx1ZShzdGQ6Om9zdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZShzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3RfZGVjbGFyYXRpb24oc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHBvaW50ZXJzID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVhZCA9IHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgd3JpdGUgPSB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN3YXAgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc191c2VyX3N0cnVjdCA9IGZhbHNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3RfZGVmaW5pdGlvbihzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9zdHJlYW0mIGZvcmNlX2NwcF9vdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzZXR0ZXJzID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3VzZXJfc3RydWN0ID0gZmFsc2UpOworICB2b2lkIGdlbmVyYXRlX2NvcHlfY29uc3RydWN0b3Ioc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfbW92ZV9jb25zdHJ1Y3RvcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb25zdHJ1Y3Rvcl9oZWxwZXIoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y3BldGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19tb3ZlKTsKKyAgdm9pZCBnZW5lcmF0ZV9hc3NpZ25tZW50X29wZXJhdG9yKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfbW92ZV9hc3NpZ25tZW50X29wZXJhdG9yKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfYXNzaWdubWVudF9oZWxwZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX21vdmUpOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdF9yZWFkZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIHBvaW50ZXJzID0gZmFsc2UpOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdF93cml0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIHBvaW50ZXJzID0gZmFsc2UpOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdF9yZXN1bHRfd3JpdGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBwb2ludGVycyA9IGZhbHNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3Rfc3dhcChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdF9wcmludF9tZXRob2Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9leGNlcHRpb25fd2hhdF9tZXRob2Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKworICAvKioKKyAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UsIHN0cmluZyBzdHlsZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2VfZmFjdG9yeSh0X3NlcnZpY2UqIHRzZXJ2aWNlLCBzdHJpbmcgc3R5bGUpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfbnVsbCh0X3NlcnZpY2UqIHRzZXJ2aWNlLCBzdHJpbmcgc3R5bGUpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfbXVsdGlmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlLCBzdHJpbmcgc3R5bGUpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfcHJvY2Vzc29yKHRfc2VydmljZSogdHNlcnZpY2UsIHN0cmluZyBzdHlsZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9za2VsZXRvbih0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgc3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNwZWNpYWxpemVkID0gZmFsc2UpOworICB2b2lkIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2FzeW5jX3NrZWxldG9uKHRfc2VydmljZSogdHNlcnZpY2UpOworCisgIC8qKgorICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgc3VmZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcG9pbnRlciA9IGZhbHNlKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHB1c2hfYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaW5kZXgpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBzdWZmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcG9pbnRlciA9IGZhbHNlKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0ZDo6c3RyaW5nIGl0ZXIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NldCogdG1hcCwgc3RkOjpzdHJpbmcgaXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdGQ6OnN0cmluZyBpdGVyKTsKKworICB2b2lkIGdlbmVyYXRlX2Z1bmN0aW9uX2NhbGwob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBhcmdfcHJlZml4KTsKKyAgLyoKKyAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKKyAgICovCisKKyAgc3RkOjpzdHJpbmcgbmFtZXNwYWNlX3ByZWZpeChzdGQ6OnN0cmluZyBucyk7CisgIHN0ZDo6c3RyaW5nIG5hbWVzcGFjZV9vcGVuKHN0ZDo6c3RyaW5nIG5zKTsKKyAgc3RkOjpzdHJpbmcgbmFtZXNwYWNlX2Nsb3NlKHN0ZDo6c3RyaW5nIG5zKTsKKyAgc3RkOjpzdHJpbmcgdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsIGJvb2wgaW5fdHlwZWRlZiA9IGZhbHNlLCBib29sIGFyZyA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgYmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSk7CisgIHN0ZDo6c3RyaW5nIGRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5pdCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcG9pbnRlciA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY29uc3RhbnQgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlZmVyZW5jZSA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHN0eWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG5hbWVfcGFyYW1zID0gdHJ1ZSk7CisgIHN0ZDo6c3RyaW5nIGNvYl9mdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbmFtZV9wYXJhbXMgPSB0cnVlKTsKKyAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBuYW1lX3BhcmFtcyA9IHRydWUsIGJvb2wgc3RhcnRfY29tbWEgPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIHR5cGVfdG9fZW51bSh0X3R5cGUqIHR0eXBlKTsKKworICB2b2lkIGdlbmVyYXRlX2VudW1fY29uc3RhbnRfbGlzdChzdGQ6Om9zdHJlYW0mIGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZlY3Rvcjx0X2VudW1fdmFsdWUqPiYgY29uc3RhbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsdWRlX3ZhbHVlcyk7CisKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3Rfb3N0cmVhbV9vcGVyYXRvcl9kZWNsKHN0ZDo6b3N0cmVhbSYgZiwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdF9vc3RyZWFtX29wZXJhdG9yKHN0ZDo6b3N0cmVhbSYgZiwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdF9wcmludF9tZXRob2RfZGVjbChzdGQ6Om9zdHJlYW0mIGYsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9leGNlcHRpb25fd2hhdF9tZXRob2RfZGVjbChzdGQ6Om9zdHJlYW0mIGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBleHRlcm5hbCA9IGZhbHNlKTsKKworICBib29sIGlzX3JlZmVyZW5jZSh0X2ZpZWxkKiB0ZmllbGQpIHsgcmV0dXJuIHRmaWVsZC0+Z2V0X3JlZmVyZW5jZSgpOyB9CisKKyAgYm9vbCBpc19jb21wbGV4X3R5cGUodF90eXBlKiB0dHlwZSkgeworICAgIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7CisKKyAgICByZXR1cm4gdHR5cGUtPmlzX2NvbnRhaW5lcigpIHx8IHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKQorICAgICAgICAgICB8fCAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpCisgICAgICAgICAgICAgICAmJiAoKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpID09IHRfYmFzZV90eXBlOjpUWVBFX1NUUklORykpOworICB9CisKKyAgdm9pZCBzZXRfdXNlX2luY2x1ZGVfcHJlZml4KGJvb2wgdXNlX2luY2x1ZGVfcHJlZml4KSB7IHVzZV9pbmNsdWRlX3ByZWZpeF8gPSB1c2VfaW5jbHVkZV9wcmVmaXg7IH0KKworICAvKioKKyAgICogVGhlIGNvbXBpbGVyIG9wdGlvbiAibm9fdGhyaWZ0X29zdHJlYW1faW1wbCIgY2FuIGJlIHVzZWQgdG8gcHJldmVudAorICAgKiB0aGUgY29tcGlsZXIgZnJvbSBlbWl0dGluZyBpbXBsZW1lbnRhdGlvbnMgZm9yIG9wZXJhdG9yIDw8LiAgSW4gdGhpcworICAgKiBjYXNlIHRoZSBjb25zdW1pbmcgYXBwbGljYXRpb24gbXVzdCBwcm92aWRlIGFueSBuZWVkZWQgdG8gYnVpbGQuCisgICAqCisgICAqIFRvIGRpc2FibGUgdGhpcyBvbiBhIHBlciBzdHJ1Y3R1cmUgYmFzZXMsIG9uZSBjYW4gYWx0ZXJuYXRpdmVseSBzZXQKKyAgICogdGhlIGFubm90YXRpb24gImNwcC5jdXN0b21vc3RyZWFtIiB0byBwcmV2ZW50IHRocmlmdCBmcm9tIGVtaXR0aW5nIGFuCisgICAqIG9wZXJhdG9yIDw8IChzdGQ6Om9zdHJlYW0mKS4KKyAgICoKKyAgICogU2VlIEFubm90YXRpb25UZXN0IGZvciB2YWxpZGF0aW9uIG9mIHRoaXMgYW5ub3RhdGlvbiBmZWF0dXJlLgorICAgKi8KKyAgYm9vbCBoYXNfY3VzdG9tX29zdHJlYW0odF90eXBlKiB0dHlwZSkgY29uc3QgeworICAgIHJldHVybiAoZ2VuX25vX29zdHJlYW1fb3BlcmF0b3JzXykgfHwKKyAgICAgICAgICAgKHR0eXBlLT5hbm5vdGF0aW9uc18uZmluZCgiY3BwLmN1c3RvbW9zdHJlYW0iKSAhPSB0dHlwZS0+YW5ub3RhdGlvbnNfLmVuZCgpKTsKKyAgfQorCitwcml2YXRlOgorICAvKioKKyAgICogUmV0dXJucyB0aGUgaW5jbHVkZSBwcmVmaXggdG8gdXNlIGZvciBhIGZpbGUgZ2VuZXJhdGVkIGJ5IHByb2dyYW0sIG9yIHRoZQorICAgKiBlbXB0eSBzdHJpbmcgaWYgbm8gaW5jbHVkZSBwcmVmaXggc2hvdWxkIGJlIHVzZWQuCisgICAqLworICBzdGQ6OnN0cmluZyBnZXRfaW5jbHVkZV9wcmVmaXgoY29uc3QgdF9wcm9ncmFtJiBwcm9ncmFtKSBjb25zdDsKKworICAvKioKKyAgICogVHJ1ZSBpZiB3ZSBzaG91bGQgZ2VuZXJhdGUgcHVyZSBlbnVtcyBmb3IgVGhyaWZ0IGVudW1zLCBpbnN0ZWFkIG9mIHdyYXBwZXIgY2xhc3Nlcy4KKyAgICovCisgIGJvb2wgZ2VuX3B1cmVfZW51bXNfOworCisgIC8qKgorICAgKiBUcnVlIGlmIHdlIHNob3VsZCBnZW5lcmF0ZSB0ZW1wbGF0aXplZCByZWFkZXIvd3JpdGVyIG1ldGhvZHMuCisgICAqLworICBib29sIGdlbl90ZW1wbGF0ZXNfOworCisgIC8qKgorICAgKiBUcnVlIGlmZiB3ZSBzaG91bGQgZ2VuZXJhdGUgcHJvY2VzcyBmdW5jdGlvbiBwb2ludGVycyBmb3Igb25seSB0ZW1wbGF0aXplZAorICAgKiByZWFkZXIvd3JpdGVyIG1ldGhvZHMuCisgICAqLworICBib29sIGdlbl90ZW1wbGF0ZXNfb25seV87CisKKyAgLyoqCisgICAqIFRydWUgaWYgd2Ugc2hvdWxkIGdlbmVyYXRlIG1vdmUgY29uc3RydWN0b3JzICYgYXNzaWdubWVudCBvcGVyYXRvcnMuCisgICAqLworICBib29sIGdlbl9tb3ZlYWJsZV87CisKKyAgLyoqCisgICAqIFRydWUgaWYgd2Ugc2hvdWxkIGdlbmVyYXRlIG9zdHJlYW0gZGVmaW5pdGlvbnMKKyAgICovCisgIGJvb2wgZ2VuX25vX29zdHJlYW1fb3BlcmF0b3JzXzsKKworICAvKioKKyAgICogVHJ1ZSBpZmYgd2Ugc2hvdWxkIHVzZSBhIHBhdGggcHJlZml4IGluIG91ciAjaW5jbHVkZSBzdGF0ZW1lbnRzIGZvciBvdGhlcgorICAgKiB0aHJpZnQtZ2VuZXJhdGVkIGhlYWRlciBmaWxlcy4KKyAgICovCisgIGJvb2wgdXNlX2luY2x1ZGVfcHJlZml4XzsKKworICAvKioKKyAgICogVHJ1ZSBpZiB3ZSBzaG91bGQgZ2VuZXJhdGUgIkNvbnRpbnVhdGlvbiBPQmplY3QiLXN0eWxlIGNsYXNzZXMgYXMgd2VsbC4KKyAgICovCisgIGJvb2wgZ2VuX2NvYl9zdHlsZV87CisKKyAgLyoqCisgICAqIFRydWUgaWYgd2Ugc2hvdWxkIG9taXQgY2FsbHMgdG8gY29tcGxldGlvbl9fKCkgaW4gQ29iQ2xpZW50IGNsYXNzLgorICAgKi8KKyAgYm9vbCBnZW5fbm9fY2xpZW50X2NvbXBsZXRpb25fOworCisgIC8qKgorICAgKiBUcnVlIGlmIHdlIHNob3VsZCBvbWl0IGdlbmVyYXRpbmcgdGhlIGRlZmF1bHQgb3BlYXJ0b3JzID09LCAhPSBhbmQgPC4KKyAgICovCisgIGJvb2wgZ2VuX25vX2RlZmF1bHRfb3BlcmF0b3JzXzsKKworICAgLyoqCisgICAqIFRydWUgaWYgd2Ugc2hvdWxkIGdlbmVyYXRlIHNrZWxldG9uLgorICAgKi8KKyAgYm9vbCBnZW5fbm9fc2tlbGV0b25fOworCisgIC8qKgorICAgKiBTdHJpbmdzIGZvciBuYW1lc3BhY2UsIGNvbXB1dGVkIG9uY2UgdXAgZnJvbnQgdGhlbiB1c2VkIGRpcmVjdGx5CisgICAqLworCisgIHN0ZDo6c3RyaW5nIG5zX29wZW5fOworICBzdGQ6OnN0cmluZyBuc19jbG9zZV87CisKKyAgLyoqCisgICAqIEZpbGUgc3RyZWFtcywgc3RvcmVkIGhlcmUgdG8gYXZvaWQgcGFzc2luZyB0aGVtIGFzIHBhcmFtZXRlcnMgdG8gZXZlcnkKKyAgICogZnVuY3Rpb24uCisgICAqLworCisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl90eXBlc187CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl90eXBlc19pbXBsXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3R5cGVzX3RjY187CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9oZWFkZXJfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc2VydmljZV87CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9zZXJ2aWNlX3RjY187CisKKyAgLy8gVGhlIFByb2Nlc3NvckdlbmVyYXRvciBpcyB1c2VkIHRvIGdlbmVyYXRlIHBhcnRzIG9mIHRoZSBjb2RlLAorICAvLyBzbyBpdCBuZWVkcyBhY2Nlc3MgdG8gbWFueSBvZiBvdXIgcHJvdGVjdGVkIG1lbWJlcnMgYW5kIG1ldGhvZHMuCisgIC8vCisgIC8vIFRPRE86IFRoZSBjb2RlIHJlYWxseSBzaG91bGQgYmUgY2xlYW5lZCB1cCBzbyB0aGF0IGhlbHBlciBtZXRob2RzIGZvcgorICAvLyB3cml0aW5nIHRvIHRoZSBvdXRwdXQgZmlsZXMgYXJlIHNlcGFyYXRlIGZyb20gdGhlIGdlbmVyYXRvciBjbGFzc2VzCisgIC8vIHRoZW1zZWx2ZXMuCisgIGZyaWVuZCBjbGFzcyBQcm9jZXNzb3JHZW5lcmF0b3I7Cit9OworCisvKioKKyAqIFByZXBhcmVzIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0CisgKiBzdHJlYW1zLgorICovCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7CisgIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQorICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOworCisgIC8vIE1ha2Ugb3V0cHV0IGZpbGUKKyAgc3RyaW5nIGZfdHlwZXNfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBwcm9ncmFtX25hbWVfICsgIl90eXBlcy5oIjsKKyAgZl90eXBlc18ub3BlbihmX3R5cGVzX25hbWUpOworCisgIHN0cmluZyBmX3R5cGVzX2ltcGxfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBwcm9ncmFtX25hbWVfICsgIl90eXBlcy5jcHAiOworICBmX3R5cGVzX2ltcGxfLm9wZW4oZl90eXBlc19pbXBsX25hbWUuY19zdHIoKSk7CisKKyAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7CisgICAgLy8gSWYgd2UgZG9uJ3Qgb3BlbiB0aGUgc3RyZWFtLCBpdCBhcHBlYXJzIHRvIGp1c3QgZGlzY2FyZCBkYXRhLAorICAgIC8vIHdoaWNoIGlzIGZpbmUuCisgICAgc3RyaW5nIGZfdHlwZXNfdGNjX25hbWUgPSBnZXRfb3V0X2RpcigpICsgcHJvZ3JhbV9uYW1lXyArICJfdHlwZXMudGNjIjsKKyAgICBmX3R5cGVzX3RjY18ub3BlbihmX3R5cGVzX3RjY19uYW1lLmNfc3RyKCkpOworICB9CisKKyAgLy8gUHJpbnQgaGVhZGVyCisgIGZfdHlwZXNfIDw8IGF1dG9nZW5fY29tbWVudCgpOworICBmX3R5cGVzX2ltcGxfIDw8IGF1dG9nZW5fY29tbWVudCgpOworICBmX3R5cGVzX3RjY18gPDwgYXV0b2dlbl9jb21tZW50KCk7CisKKyAgLy8gU3RhcnQgaWZuZGVmCisgIGZfdHlwZXNfIDw8ICIjaWZuZGVmICIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiX1RZUEVTX0giIDw8IGVuZGwgPDwgIiNkZWZpbmUgIiA8PCBwcm9ncmFtX25hbWVfCisgICAgICAgICAgIDw8ICJfVFlQRVNfSCIgPDwgZW5kbCA8PCBlbmRsOworICBmX3R5cGVzX3RjY18gPDwgIiNpZm5kZWYgIiA8PCBwcm9ncmFtX25hbWVfIDw8ICJfVFlQRVNfVENDIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIgPDwgcHJvZ3JhbV9uYW1lXworICAgICAgICAgICAgICAgPDwgIl9UWVBFU19UQ0MiIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBJbmNsdWRlIGJhc2UgdHlwZXMKKyAgZl90eXBlc18gPDwgIiNpbmNsdWRlIDxpb3Nmd2Q+IiA8PCBlbmRsCisgICAgICAgICAgIDw8IGVuZGwKKyAgICAgICAgICAgPDwgIiNpbmNsdWRlIDx0aHJpZnQvVGhyaWZ0Lmg+IiA8PCBlbmRsCisgICAgICAgICAgIDw8ICIjaW5jbHVkZSA8dGhyaWZ0L1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5oPiIgPDwgZW5kbAorICAgICAgICAgICA8PCAiI2luY2x1ZGUgPHRocmlmdC9UQmFzZS5oPiIgPDwgZW5kbAorICAgICAgICAgICA8PCAiI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuaD4iIDw8IGVuZGwKKyAgICAgICAgICAgPDwgIiNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaD4iIDw8IGVuZGwKKyAgICAgICAgICAgPDwgZW5kbDsKKyAgLy8gSW5jbHVkZSBDKyt4eCBjb21wYXRpYmlsaXR5IGhlYWRlcgorICBmX3R5cGVzXyA8PCAiI2luY2x1ZGUgPGZ1bmN0aW9uYWw+IiA8PCBlbmRsOworICBmX3R5cGVzXyA8PCAiI2luY2x1ZGUgPG1lbW9yeT4iIDw8IGVuZGw7CisKKyAgLy8gSW5jbHVkZSBvdGhlciBUaHJpZnQgaW5jbHVkZXMKKyAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+JiBpbmNsdWRlcyA9IHByb2dyYW1fLT5nZXRfaW5jbHVkZXMoKTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmNsdWRlcy5zaXplKCk7ICsraSkgeworICAgIGZfdHlwZXNfIDw8ICIjaW5jbHVkZSBcIiIgPDwgZ2V0X2luY2x1ZGVfcHJlZml4KCooaW5jbHVkZXNbaV0pKSA8PCBpbmNsdWRlc1tpXS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgIDw8ICJfdHlwZXMuaFwiIiA8PCBlbmRsOworCisgICAgLy8gWFhYKHNpbXBraW5zKTogSWYgZ2VuX3RlbXBsYXRlc18gaXMgZW5hYmxlZCwgd2UgY3VycmVudGx5IGFzc3VtZSBhbGwKKyAgICAvLyBpbmNsdWRlZCBmaWxlcyB3ZXJlIGFsc28gZ2VuZXJhdGVkIHdpdGggdGVtcGxhdGVzIGVuYWJsZWQuCisgICAgZl90eXBlc190Y2NfIDw8ICIjaW5jbHVkZSBcIiIgPDwgZ2V0X2luY2x1ZGVfcHJlZml4KCooaW5jbHVkZXNbaV0pKSA8PCBpbmNsdWRlc1tpXS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICA8PCAiX3R5cGVzLnRjY1wiIiA8PCBlbmRsOworICB9CisgIGZfdHlwZXNfIDw8IGVuZGw7CisKKyAgLy8gSW5jbHVkZSBjdXN0b20gaGVhZGVycworICBjb25zdCB2ZWN0b3I8c3RyaW5nPiYgY3BwX2luY2x1ZGVzID0gcHJvZ3JhbV8tPmdldF9jcHBfaW5jbHVkZXMoKTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjcHBfaW5jbHVkZXMuc2l6ZSgpOyArK2kpIHsKKyAgICBpZiAoY3BwX2luY2x1ZGVzW2ldWzBdID09ICc8JykgeworICAgICAgZl90eXBlc18gPDwgIiNpbmNsdWRlICIgPDwgY3BwX2luY2x1ZGVzW2ldIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfdHlwZXNfIDw8ICIjaW5jbHVkZSBcIiIgPDwgY3BwX2luY2x1ZGVzW2ldIDw8ICJcIiIgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgZl90eXBlc18gPDwgZW5kbDsKKworICAvLyBJbmNsdWRlIHRoZSB0eXBlcyBmaWxlCisgIGZfdHlwZXNfaW1wbF8gPDwgIiNpbmNsdWRlIFwiIiA8PCBnZXRfaW5jbHVkZV9wcmVmaXgoKmdldF9wcm9ncmFtKCkpIDw8IHByb2dyYW1fbmFtZV8KKyAgICAgICAgICAgICAgICA8PCAiX3R5cGVzLmhcIiIgPDwgZW5kbCA8PCBlbmRsOworICBmX3R5cGVzX3RjY18gPDwgIiNpbmNsdWRlIFwiIiA8PCBnZXRfaW5jbHVkZV9wcmVmaXgoKmdldF9wcm9ncmFtKCkpIDw8IHByb2dyYW1fbmFtZV8KKyAgICAgICAgICAgICAgIDw8ICJfdHlwZXMuaFwiIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gVGhlIHN3YXAoKSBjb2RlIG5lZWRzIDxhbGdvcml0aG0+IGZvciBzdGQ6OnN3YXAoKQorICBmX3R5cGVzX2ltcGxfIDw8ICIjaW5jbHVkZSA8YWxnb3JpdGhtPiIgPDwgZW5kbDsKKyAgLy8gZm9yIG9wZXJhdG9yPDwKKyAgZl90eXBlc19pbXBsXyA8PCAiI2luY2x1ZGUgPG9zdHJlYW0+IiA8PCBlbmRsIDw8IGVuZGw7CisgIGZfdHlwZXNfaW1wbF8gPDwgIiNpbmNsdWRlIDx0aHJpZnQvVFRvU3RyaW5nLmg+IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gT3BlbiBuYW1lc3BhY2UKKyAgbnNfb3Blbl8gPSBuYW1lc3BhY2Vfb3Blbihwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgiY3BwIikpOworICBuc19jbG9zZV8gPSBuYW1lc3BhY2VfY2xvc2UocHJvZ3JhbV8tPmdldF9uYW1lc3BhY2UoImNwcCIpKTsKKworICBmX3R5cGVzXyA8PCBuc19vcGVuXyA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZl90eXBlc19pbXBsXyA8PCBuc19vcGVuXyA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZl90eXBlc190Y2NfIDw8IG5zX29wZW5fIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBDbG9zZXMgdGhlIG91dHB1dCBmaWxlcy4KKyAqLwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKKyAgLy8gQ2xvc2UgbmFtZXNwYWNlCisgIGZfdHlwZXNfIDw8IG5zX2Nsb3NlXyA8PCBlbmRsIDw8IGVuZGw7CisgIGZfdHlwZXNfaW1wbF8gPDwgbnNfY2xvc2VfIDw8IGVuZGw7CisgIGZfdHlwZXNfdGNjXyA8PCBuc19jbG9zZV8gPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIEluY2x1ZGUgdGhlIHR5cGVzLnRjYyBmaWxlIGZyb20gdGhlIHR5cGVzIGhlYWRlciBmaWxlLAorICAvLyBzbyBjbGllbnRzIGRvbid0IGhhdmUgdG8gZXhwbGljaXRseSBpbmNsdWRlIHRoZSB0Y2MgZmlsZS4KKyAgLy8gVE9ETyhzaW1wa2lucyk6IE1ha2UgdGhpcyBhIHNlcGFyYXRlIG9wdGlvbi4KKyAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7CisgICAgZl90eXBlc18gPDwgIiNpbmNsdWRlIFwiIiA8PCBnZXRfaW5jbHVkZV9wcmVmaXgoKmdldF9wcm9ncmFtKCkpIDw8IHByb2dyYW1fbmFtZV8KKyAgICAgICAgICAgICA8PCAiX3R5cGVzLnRjY1wiIiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKworICAvLyBDbG9zZSBpZm5kZWYKKyAgZl90eXBlc18gPDwgIiNlbmRpZiIgPDwgZW5kbDsKKyAgZl90eXBlc190Y2NfIDw8ICIjZW5kaWYiIDw8IGVuZGw7CisKKyAgLy8gQ2xvc2Ugb3V0cHV0IGZpbGUKKyAgZl90eXBlc18uY2xvc2UoKTsKKyAgZl90eXBlc19pbXBsXy5jbG9zZSgpOworICBmX3R5cGVzX3RjY18uY2xvc2UoKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSB0eXBlZGVmLiBUaGlzIGlzIGp1c3QgYSBzaW1wbGUgMS1saW5lciBpbiBDKysKKyAqCisgKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgorICovCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7CisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ0eXBlZGVmICIgPDwgdHlwZV9uYW1lKHR0eXBlZGVmLT5nZXRfdHlwZSgpLCB0cnVlKSA8PCAiICIKKyAgICAgICAgICAgPDwgdHR5cGVkZWYtPmdldF9zeW1ib2xpYygpIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtX2NvbnN0YW50X2xpc3Qoc3RkOjpvc3RyZWFtJiBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4mIGNvbnN0YW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbHVkZV92YWx1ZXMpIHsKKyAgZiA8PCAiIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3IgY19pdGVyOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIGYgPDwgIiwiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudChmKSA8PCBwcmVmaXggPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8IHN1ZmZpeDsKKyAgICBpZiAoaW5jbHVkZV92YWx1ZXMpIHsKKyAgICAgIGYgPDwgIiA9ICIgPDwgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgICB9CisgIH0KKworICBmIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmKSA8PCAifTsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGNvZGUgZm9yIGFuIGVudW1lcmF0ZWQgdHlwZS4gSW4gQysrLCB0aGlzIGlzIGVzc2VudGlhbGx5IHRoZSBzYW1lCisgKiBhcyB0aGUgdGhyaWZ0IGRlZmluaXRpb24gaXRzZWxmLCB1c2luZyB0aGUgZW51bSBrZXl3b3JkIGluIEMrKy4KKyAqCisgKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCisgKi8KK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CisKKyAgc3RkOjpzdHJpbmcgZW51bV9uYW1lID0gdGVudW0tPmdldF9uYW1lKCk7CisgIGlmICghZ2VuX3B1cmVfZW51bXNfKSB7CisgICAgZW51bV9uYW1lID0gInR5cGUiOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJzdHJ1Y3QgIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgIH0KKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImVudW0gIiA8PCBlbnVtX25hbWU7CisKKyAgZ2VuZXJhdGVfZW51bV9jb25zdGFudF9saXN0KGZfdHlwZXNfLCBjb25zdGFudHMsICIiLCAiIiwgdHJ1ZSk7CisKKyAgaWYgKCFnZW5fcHVyZV9lbnVtc18pIHsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfdHlwZXNfIDw8ICJ9OyIgPDwgZW5kbDsKKyAgfQorCisgIGZfdHlwZXNfIDw8IGVuZGw7CisKKyAgLyoqCisgICAgIEdlbmVyYXRlIGEgY2hhcmFjdGVyIGFycmF5IG9mIGVudW0gbmFtZXMgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy4KKyAgKi8KKyAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiI7CisgIGlmICghZ2VuX3B1cmVfZW51bXNfKSB7CisgICAgcHJlZml4ID0gdGVudW0tPmdldF9uYW1lKCkgKyAiOjoiOworICB9CisKKyAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiaW50IF9rIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiVmFsdWVzW10gPSI7CisgIGdlbmVyYXRlX2VudW1fY29uc3RhbnRfbGlzdChmX3R5cGVzX2ltcGxfLCBjb25zdGFudHMsIHByZWZpeC5jX3N0cigpLCAiIiwgZmFsc2UpOworCisgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgImNvbnN0IGNoYXIqIF9rIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiTmFtZXNbXSA9IjsKKyAgZ2VuZXJhdGVfZW51bV9jb25zdGFudF9saXN0KGZfdHlwZXNfaW1wbF8sIGNvbnN0YW50cywgIlwiIiwgIlwiIiwgZmFsc2UpOworCisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJleHRlcm4gY29uc3Qgc3RkOjptYXA8aW50LCBjb25zdCBjaGFyKj4gXyIgPDwgdGVudW0tPmdldF9uYW1lKCkKKyAgICAgICAgICAgPDwgIl9WQUxVRVNfVE9fTkFNRVM7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiY29uc3Qgc3RkOjptYXA8aW50LCBjb25zdCBjaGFyKj4gXyIgPDwgdGVudW0tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICA8PCAiX1ZBTFVFU19UT19OQU1FUyg6OmFwYWNoZTo6dGhyaWZ0OjpURW51bUl0ZXJhdG9yKCIgPDwgY29uc3RhbnRzLnNpemUoKSA8PCAiLCBfayIKKyAgICAgICAgICAgICAgICA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiVmFsdWVzIgorICAgICAgICAgICAgICAgIDw8ICIsIF9rIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiTmFtZXMpLCAiCisgICAgICAgICAgICAgICAgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OlRFbnVtSXRlcmF0b3IoLTEsIE5VTEwsIE5VTEwpKTsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9lbnVtX29zdHJlYW1fb3BlcmF0b3JfZGVjbChmX3R5cGVzXywgdGVudW0pOworICBnZW5lcmF0ZV9lbnVtX29zdHJlYW1fb3BlcmF0b3IoZl90eXBlc19pbXBsXywgdGVudW0pOworfQorCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bV9vc3RyZWFtX29wZXJhdG9yX2RlY2woc3RkOjpvc3RyZWFtJiBvdXQsIHRfZW51bSogdGVudW0pIHsKKworICBvdXQgPDwgInN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG91dCwgY29uc3QgIjsKKyAgaWYgKGdlbl9wdXJlX2VudW1zXykgeworICAgIG91dCA8PCB0ZW51bS0+Z2V0X25hbWUoKTsKKyAgfSBlbHNlIHsKKyAgICBvdXQgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIjo6dHlwZSYiOworICB9CisgIG91dCA8PCAiIHZhbCk7IiA8PCBlbmRsOworICBvdXQgPDwgZW5kbDsKK30KKwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW1fb3N0cmVhbV9vcGVyYXRvcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9lbnVtKiB0ZW51bSkgeworCisgIC8vIElmIHdlJ3ZlIGJlZW4gdG9sZCB0aGUgY29uc3VtaW5nIGFwcGxpY2F0aW9uIHdpbGwgcHJvdmlkZSBhbiBvc3RyZWFtCisgIC8vIG9wZXJhdG9yIGRlZmluaXRpb24gdGhlbiB3ZSBvbmx5IG1ha2UgYSBkZWNsYXJhdGlvbjoKKworICBpZiAoIWhhc19jdXN0b21fb3N0cmVhbSh0ZW51bSkpIHsKKyAgICBvdXQgPDwgInN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG91dCwgY29uc3QgIjsKKyAgICBpZiAoZ2VuX3B1cmVfZW51bXNfKSB7CisgICAgICBvdXQgPDwgdGVudW0tPmdldF9uYW1lKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiOjp0eXBlJiI7CisgICAgfQorICAgIG91dCA8PCAiIHZhbCkgIjsKKyAgICBzY29wZV91cChvdXQpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJzdGQ6Om1hcDxpbnQsIGNvbnN0IGNoYXIqPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBfIgorICAgICAgICAgICAgIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICJfVkFMVUVTX1RPX05BTUVTLmZpbmQodmFsKTsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoaXQgIT0gXyIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIl9WQUxVRVNfVE9fTkFNRVMuZW5kKCkpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJvdXQgPDwgaXQtPnNlY29uZDsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAib3V0IDw8IHN0YXRpY19jYXN0PGludD4odmFsKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBvdXQ7IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICBvdXQgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGNsYXNzIHRoYXQgaG9sZHMgYWxsIHRoZSBjb25zdGFudHMuCisgKi8KK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykgeworICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBwcm9ncmFtX25hbWVfICsgIl9jb25zdGFudHMuaCI7CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9jb25zdHM7CisgIGZfY29uc3RzLm9wZW4oZl9jb25zdHNfbmFtZSk7CisKKyAgc3RyaW5nIGZfY29uc3RzX2ltcGxfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBwcm9ncmFtX25hbWVfICsgIl9jb25zdGFudHMuY3BwIjsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2NvbnN0c19pbXBsOworICBmX2NvbnN0c19pbXBsLm9wZW4oZl9jb25zdHNfaW1wbF9uYW1lKTsKKworICAvLyBQcmludCBoZWFkZXIKKyAgZl9jb25zdHMgPDwgYXV0b2dlbl9jb21tZW50KCk7CisgIGZfY29uc3RzX2ltcGwgPDwgYXV0b2dlbl9jb21tZW50KCk7CisKKyAgLy8gU3RhcnQgaWZuZGVmCisgIGZfY29uc3RzIDw8ICIjaWZuZGVmICIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiX0NPTlNUQU5UU19IIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIgPDwgcHJvZ3JhbV9uYW1lXworICAgICAgICAgICA8PCAiX0NPTlNUQU5UU19IIiA8PCBlbmRsIDw8IGVuZGwgPDwgIiNpbmNsdWRlIFwiIiA8PCBnZXRfaW5jbHVkZV9wcmVmaXgoKmdldF9wcm9ncmFtKCkpCisgICAgICAgICAgIDw8IHByb2dyYW1fbmFtZV8gPDwgIl90eXBlcy5oXCIiIDw8IGVuZGwgPDwgZW5kbCA8PCBuc19vcGVuXyA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZl9jb25zdHNfaW1wbCA8PCAiI2luY2x1ZGUgXCIiIDw8IGdldF9pbmNsdWRlX3ByZWZpeCgqZ2V0X3Byb2dyYW0oKSkgPDwgcHJvZ3JhbV9uYW1lXworICAgICAgICAgICAgICAgIDw8ICJfY29uc3RhbnRzLmhcIiIgPDwgZW5kbCA8PCBlbmRsIDw8IG5zX29wZW5fIDw8IGVuZGwgPDwgZW5kbDsKKworICBmX2NvbnN0cyA8PCAiY2xhc3MgIiA8PCBwcm9ncmFtX25hbWVfIDw8ICJDb25zdGFudHMgeyIgPDwgZW5kbCA8PCAiIHB1YmxpYzoiIDw8IGVuZGwgPDwgIiAgIgorICAgICAgICAgICA8PCBwcm9ncmFtX25hbWVfIDw8ICJDb25zdGFudHMoKTsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIHZlY3Rvcjx0X2NvbnN0Kj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBzdHJpbmcgbmFtZSA9ICgqY19pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICB0X3R5cGUqIHR5cGUgPSAoKmNfaXRlciktPmdldF90eXBlKCk7CisgICAgZl9jb25zdHMgPDwgaW5kZW50KCkgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgIiA8PCBuYW1lIDw8ICI7IiA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGZfY29uc3RzIDw8ICJ9OyIgPDwgZW5kbDsKKworICBmX2NvbnN0c19pbXBsIDw8ICJjb25zdCAiIDw8IHByb2dyYW1fbmFtZV8gPDwgIkNvbnN0YW50cyBnXyIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiX2NvbnN0YW50czsiCisgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBlbmRsIDw8IHByb2dyYW1fbmFtZV8gPDwgIkNvbnN0YW50czo6IiA8PCBwcm9ncmFtX25hbWVfCisgICAgICAgICAgICAgICAgPDwgIkNvbnN0YW50cygpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgeworICAgIHByaW50X2NvbnN0X3ZhbHVlKGZfY29uc3RzX2ltcGwsCisgICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3R5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF92YWx1ZSgpKTsKKyAgfQorICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9jb25zdHNfaW1wbCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgZl9jb25zdHMgPDwgZW5kbCA8PCAiZXh0ZXJuIGNvbnN0ICIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiQ29uc3RhbnRzIGdfIiA8PCBwcm9ncmFtX25hbWVfCisgICAgICAgICAgIDw8ICJfY29uc3RhbnRzOyIgPDwgZW5kbCA8PCBlbmRsIDw8IG5zX2Nsb3NlXyA8PCBlbmRsIDw8IGVuZGwgPDwgIiNlbmRpZiIgPDwgZW5kbDsKKyAgZl9jb25zdHMuY2xvc2UoKTsKKworICBmX2NvbnN0c19pbXBsIDw8IGVuZGwgPDwgbnNfY2xvc2VfIDw8IGVuZGwgPDwgZW5kbDsKKyAgZl9jb25zdHNfaW1wbC5jbG9zZSgpOworfQorCisvKioKKyAqIFByaW50cyB0aGUgdmFsdWUgb2YgYSBjb25zdGFudCB3aXRoIHRoZSBnaXZlbiB0eXBlLiBOb3RlIHRoYXQgdHlwZSBjaGVja2luZworICogaXMgTk9UIHBlcmZvcm1lZCBpbiB0aGlzIGZ1bmN0aW9uIGFzIGl0IGlzIGFsd2F5cyBydW4gYmVmb3JlaGFuZCB1c2luZyB0aGUKKyAqIHZhbGlkYXRlX3R5cGVzIG1ldGhvZCBpbiBtYWluLmNjCisgKi8KK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpwcmludF9jb25zdF92YWx1ZShvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICBzdHJpbmcgdjIgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCB0eXBlLCB2YWx1ZSk7CisgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiID0gIiA8PCB2MiA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIiA9ICgiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiKSIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIjsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBib29sIGlzX25vbnJlcXVpcmVkX2ZpZWxkID0gZmFsc2U7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7CisgICAgICBpc19ub25yZXF1aXJlZF9maWVsZCA9IGZhbHNlOworICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKKyAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgICAgIGlzX25vbnJlcXVpcmVkX2ZpZWxkID0gKCpmX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgeworICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOworICAgICAgfQorICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKKyAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIi4iIDw8IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSA8PCAiID0gIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7CisgICAgICBpZiAoaXNfbm9ucmVxdWlyZWRfZmllbGQpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiLl9faXNzZXQuIiA8PCB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkgPDwgIiA9IHRydWU7IiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBzdHJpbmcga2V5ID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwga3R5cGUsIHZfaXRlci0+Zmlyc3QpOworICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIHZ0eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKCIgPDwga2V5IDw8ICIsICIgPDwgdmFsIDw8ICIpKTsiIDw8IGVuZGw7CisgICAgfQorICAgIG91dCA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBldHlwZSwgKnZfaXRlcik7CisgICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIucHVzaF9iYWNrKCIgPDwgdmFsIDw8ICIpOyIgPDwgZW5kbDsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3R5cGUqIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBldHlwZSwgKnZfaXRlcik7CisgICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIuaW5zZXJ0KCIgPDwgdmFsIDw8ICIpOyIgPDwgZW5kbDsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiBwcmludF9jb25zdF92YWx1ZTogIiArIHR5cGUtPmdldF9uYW1lKCk7CisgIH0KK30KKworLyoqCisgKgorICovCitzdHJpbmcgdF9jcHBfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgeworICAodm9pZCluYW1lOworICBzdGQ6Om9zdHJpbmdzdHJlYW0gcmVuZGVyOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZW5kZXIgPDwgJyInIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmVuZGVyIDw8ICgodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICJMTCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7CisgICAgICAgIHJlbmRlciA8PCAic3RhdGljX2Nhc3Q8ZG91YmxlPigiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICIpIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlbmRlciA8PCBlbWl0X2RvdWJsZV9hc19zdHJpbmcodmFsdWUtPmdldF9kb3VibGUoKSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJlbmRlciA8PCAiKCIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIpIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgfSBlbHNlIHsKKyAgICBzdHJpbmcgdCA9IHRtcCgidG1wIik7CisgICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgIiA8PCB0IDw8ICI7IiA8PCBlbmRsOworICAgIHByaW50X2NvbnN0X3ZhbHVlKG91dCwgdCwgdHlwZSwgdmFsdWUpOworICAgIHJlbmRlciA8PCB0OworICB9CisKKyAgcmV0dXJuIHJlbmRlci5zdHIoKTsKK30KKwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2ZvcndhcmRfZGVjbGFyYXRpb24odF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgLy8gRm9yd2FyZCBkZWNsYXJlIHN0cnVjdCBkZWYKKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImNsYXNzICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuIFRoaXMgaXMgYSBjbGFzcworICogd2l0aCBkYXRhIG1lbWJlcnMgYW5kIGEgcmVhZC93cml0ZSgpIGZ1bmN0aW9uLCBwbHVzIGEgbWlycm9yaW5nIGlzc2V0CisgKiBpbm5lciBjbGFzcy4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NwcF9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisgIGdlbmVyYXRlX3N0cnVjdF9kZWNsYXJhdGlvbihmX3R5cGVzXywgdHN0cnVjdCwgaXNfZXhjZXB0aW9uLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7CisgIGdlbmVyYXRlX3N0cnVjdF9kZWZpbml0aW9uKGZfdHlwZXNfaW1wbF8sIGZfdHlwZXNfaW1wbF8sIHRzdHJ1Y3QsIHRydWUsIHRydWUpOworCisgIHN0ZDo6b3N0cmVhbSYgb3V0ID0gKGdlbl90ZW1wbGF0ZXNfID8gZl90eXBlc190Y2NfIDogZl90eXBlc19pbXBsXyk7CisgIGdlbmVyYXRlX3N0cnVjdF9yZWFkZXIob3V0LCB0c3RydWN0KTsKKyAgZ2VuZXJhdGVfc3RydWN0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9zdHJ1Y3Rfc3dhcChmX3R5cGVzX2ltcGxfLCB0c3RydWN0KTsKKyAgZ2VuZXJhdGVfY29weV9jb25zdHJ1Y3RvcihmX3R5cGVzX2ltcGxfLCB0c3RydWN0LCBpc19leGNlcHRpb24pOworICBpZiAoZ2VuX21vdmVhYmxlXykgeworICAgIGdlbmVyYXRlX21vdmVfY29uc3RydWN0b3IoZl90eXBlc19pbXBsXywgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKKyAgfQorICBnZW5lcmF0ZV9hc3NpZ25tZW50X29wZXJhdG9yKGZfdHlwZXNfaW1wbF8sIHRzdHJ1Y3QpOworICBpZiAoZ2VuX21vdmVhYmxlXykgeworICAgIGdlbmVyYXRlX21vdmVfYXNzaWdubWVudF9vcGVyYXRvcihmX3R5cGVzX2ltcGxfLCB0c3RydWN0KTsKKyAgfQorCisgIGlmICghaGFzX2N1c3RvbV9vc3RyZWFtKHRzdHJ1Y3QpKSB7CisgICAgZ2VuZXJhdGVfc3RydWN0X3ByaW50X21ldGhvZChmX3R5cGVzX2ltcGxfLCB0c3RydWN0KTsKKyAgfQorCisgIGlmIChpc19leGNlcHRpb24pIHsKKyAgICBnZW5lcmF0ZV9leGNlcHRpb25fd2hhdF9tZXRob2QoZl90eXBlc19pbXBsXywgdHN0cnVjdCk7CisgIH0KK30KKwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvcHlfY29uc3RydWN0b3Iob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgeworICBnZW5lcmF0ZV9jb25zdHJ1Y3Rvcl9oZWxwZXIob3V0LCB0c3RydWN0LCBpc19leGNlcHRpb24sIC8qaXNfbW92ZT0qL2ZhbHNlKTsKK30KKwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX21vdmVfY29uc3RydWN0b3Iob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgeworICBnZW5lcmF0ZV9jb25zdHJ1Y3Rvcl9oZWxwZXIob3V0LCB0c3RydWN0LCBpc19leGNlcHRpb24sIC8qaXNfbW92ZT0qL3RydWUpOworfQorCituYW1lc3BhY2UgeworLy8gSGVscGVyIHRvIGNvbnZlcnQgYSB2YXJpYWJsZSB0byBydmFsdWUsIGlmIG1vdmUgaXMgZW5hYmxlZAorc3RkOjpzdHJpbmcgbWF5YmVNb3ZlKHN0ZDo6c3RyaW5nIGNvbnN0JiBvdGhlciwgYm9vbCBtb3ZlKSB7CisgIGlmIChtb3ZlKSB7CisgICAgcmV0dXJuICJzdGQ6Om1vdmUoIiArIG90aGVyICsgIikiOworICB9CisgIHJldHVybiBvdGhlcjsKK30KK30KKwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0cnVjdG9yX2hlbHBlcihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19tb3ZlKSB7CisKKyAgc3RkOjpzdHJpbmcgdG1wX25hbWUgPSB0bXAoIm90aGVyIik7CisKKyAgaW5kZW50KG91dCkgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiOjoiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisKKyAgaWYgKGlzX21vdmUpIHsKKyAgICBvdXQgPDwgIiggIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICImJiAiOworICB9IGVsc2UgeworICAgIG91dCA8PCAiKGNvbnN0ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiJiAiOworICB9CisgIG91dCA8PCB0bXBfbmFtZSA8PCAiKSAiOworICBpZiAoaXNfZXhjZXB0aW9uKQorICAgIG91dCA8PCAiOiBURXhjZXB0aW9uKCkgIjsKKyAgb3V0IDw8ICJ7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKworICAvLyBlbGltaW5hdGUgY29tcGlsZXIgdW51c2VkIHdhcm5pbmcKKyAgaWYgKG1lbWJlcnMuZW1wdHkoKSkKKyAgICBpbmRlbnQob3V0KSA8PCAiKHZvaWQpICIgPDwgdG1wX25hbWUgPDwgIjsiIDw8IGVuZGw7CisKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBib29sIGhhc19ub25yZXF1aXJlZF9maWVsZHMgPSBmYWxzZTsKKyAgZm9yIChmX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IGZfaXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKQorICAgICAgaGFzX25vbnJlcXVpcmVkX2ZpZWxkcyA9IHRydWU7CisgICAgaW5kZW50KG91dCkgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiCisgICAgICAgICAgICAgICAgPDwgbWF5YmVNb3ZlKHRtcF9uYW1lICsgIi4iICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLCBpc19tb3ZlKSA8PCAiOyIgPDwgZW5kbDsKKyAgfQorCisgIGlmIChoYXNfbm9ucmVxdWlyZWRfZmllbGRzKSB7CisgICAgaW5kZW50KG91dCkgPDwgIl9faXNzZXQgPSAiIDw8IG1heWJlTW92ZSh0bXBfbmFtZSArICIuX19pc3NldCIsIGlzX21vdmUpIDw8ICI7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9hc3NpZ25tZW50X29wZXJhdG9yKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgZ2VuZXJhdGVfYXNzaWdubWVudF9oZWxwZXIob3V0LCB0c3RydWN0LCAvKmlzX21vdmU9Ki9mYWxzZSk7Cit9CisKK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9tb3ZlX2Fzc2lnbm1lbnRfb3BlcmF0b3Iob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBnZW5lcmF0ZV9hc3NpZ25tZW50X2hlbHBlcihvdXQsIHRzdHJ1Y3QsIC8qaXNfbW92ZT0qL3RydWUpOworfQorCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfYXNzaWdubWVudF9oZWxwZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19tb3ZlKSB7CisgIHN0ZDo6c3RyaW5nIHRtcF9uYW1lID0gdG1wKCJvdGhlciIpOworCisgIGluZGVudChvdXQpIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiYgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICI6Om9wZXJhdG9yPSgiOworCisgIGlmIChpc19tb3ZlKSB7CisgICAgb3V0IDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiYmICI7CisgIH0gZWxzZSB7CisgICAgb3V0IDw8ICJjb25zdCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiYgIjsKKyAgfQorICBvdXQgPDwgdG1wX25hbWUgPDwgIikgeyIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKworICAvLyBlbGltaW5hdGUgY29tcGlsZXIgdW51c2VkIHdhcm5pbmcKKyAgaWYgKG1lbWJlcnMuZW1wdHkoKSkKKyAgICBpbmRlbnQob3V0KSA8PCAiKHZvaWQpICIgPDwgdG1wX25hbWUgPDwgIjsiIDw8IGVuZGw7CisKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBib29sIGhhc19ub25yZXF1aXJlZF9maWVsZHMgPSBmYWxzZTsKKyAgZm9yIChmX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IGZfaXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKQorICAgICAgaGFzX25vbnJlcXVpcmVkX2ZpZWxkcyA9IHRydWU7CisgICAgaW5kZW50KG91dCkgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiCisgICAgICAgICAgICAgICAgPDwgbWF5YmVNb3ZlKHRtcF9uYW1lICsgIi4iICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLCBpc19tb3ZlKSA8PCAiOyIgPDwgZW5kbDsKKyAgfQorICBpZiAoaGFzX25vbnJlcXVpcmVkX2ZpZWxkcykgeworICAgIGluZGVudChvdXQpIDw8ICJfX2lzc2V0ID0gIiA8PCBtYXliZU1vdmUodG1wX25hbWUgKyAiLl9faXNzZXQiLCBpc19tb3ZlKSA8PCAiOyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gKnRoaXM7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKK30KKworLyoqCisgKiBXcml0ZXMgdGhlIHN0cnVjdCBkZWNsYXJhdGlvbiBpbnRvIHRoZSBoZWFkZXIgZmlsZQorICoKKyAqIEBwYXJhbSBvdXQgT3V0cHV0IHN0cmVhbQorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdAorICovCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0X2RlY2xhcmF0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHBvaW50ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgd3JpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3dhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc191c2VyX3N0cnVjdCkgeworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBpZiAoaXNfZXhjZXB0aW9uKSB7CisgICAgZXh0ZW5kcyA9ICIgOiBwdWJsaWMgOjphcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbiI7CisgIH0gZWxzZSB7CisgICAgaWYgKGlzX3VzZXJfc3RydWN0ICYmICFnZW5fdGVtcGxhdGVzXykgeworICAgICAgZXh0ZW5kcyA9ICIgOiBwdWJsaWMgdmlydHVhbCA6OmFwYWNoZTo6dGhyaWZ0OjpUQmFzZSI7CisgICAgfQorICB9CisKKyAgLy8gR2V0IG1lbWJlcnMKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKworICAvLyBXcml0ZSB0aGUgaXNzZXQgc3RydWN0dXJlIGRlY2xhcmF0aW9uIG91dHNpZGUgdGhlIGNsYXNzLiBUaGlzIG1ha2VzCisgIC8vIHRoZSBnZW5lcmF0ZWQgY29kZSBhbWVuYWJsZSB0byBwcm9jZXNzaW5nIGJ5IFNXSUcuCisgIC8vIFdlIG9ubHkgZGVjbGFyZSB0aGUgc3RydWN0IGlmIGl0IGdldHMgdXNlZCBpbiB0aGUgY2xhc3MuCisKKyAgLy8gSXNzZXQgc3RydWN0IGhhcyBib29sZWFuIGZpZWxkcywgYnV0IG9ubHkgZm9yIG5vbi1yZXF1aXJlZCBmaWVsZHMuCisgIGJvb2wgaGFzX25vbnJlcXVpcmVkX2ZpZWxkcyA9IGZhbHNlOworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpCisgICAgICBoYXNfbm9ucmVxdWlyZWRfZmllbGRzID0gdHJ1ZTsKKyAgfQorCisgIGlmIChoYXNfbm9ucmVxdWlyZWRfZmllbGRzICYmICghcG9pbnRlcnMgfHwgcmVhZCkpIHsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidHlwZWRlZiBzdHJ1Y3QgXyIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiX19pc3NldCB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgaW5kZW50KG91dCkgPDwgIl8iIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIl9faXNzZXQoKSAiOworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgc3RyaW5nIGlzU2V0ID0gKCgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgPyAidHJ1ZSIgOiAiZmFsc2UiOworICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgIG91dCA8PCAiOiAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCIgPDwgaXNTZXQgPDwgIikiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0IDw8ICIsICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoIiA8PCBpc1NldCA8PCAiKSI7CisgICAgICB9CisgICAgfQorICAgIG91dCA8PCAiIHt9IiA8PCBlbmRsOworCisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgImJvb2wgIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA6MTsiIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSBfIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICJfX2lzc2V0OyIgPDwgZW5kbDsKKyAgfQorCisgIG91dCA8PCBlbmRsOworCisgIC8vIE9wZW4gc3RydWN0IGRlZgorICBvdXQgPDwgaW5kZW50KCkgPDwgImNsYXNzICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCBleHRlbmRzIDw8ICIgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIiBwdWJsaWM6IiA8PCBlbmRsIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGlmICghcG9pbnRlcnMpIHsKKyAgICAvLyBDb3B5IGNvbnN0cnVjdG9yCisgICAgaW5kZW50KG91dCkgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKGNvbnN0ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiJik7IiA8PCBlbmRsOworCisgICAgLy8gTW92ZSBjb25zdHJ1Y3RvcgorICAgIGlmIChnZW5fbW92ZWFibGVfKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICImJik7IiA8PCBlbmRsOworICAgIH0KKworICAgIC8vIEFzc2lnbm1lbnQgT3BlcmF0b3IKKyAgICBpbmRlbnQob3V0KSA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICImIG9wZXJhdG9yPShjb25zdCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiYpOyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworCisgICAgLy8gTW92ZSBhc3NpZ25tZW50IG9wZXJhdG9yCisgICAgaWYgKGdlbl9tb3ZlYWJsZV8pIHsKKyAgICAgIGluZGVudChvdXQpIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiYgb3BlcmF0b3I9KCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiJiYpOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICAvLyBEZWZhdWx0IGNvbnN0cnVjdG9yCisgICAgaW5kZW50KG91dCkgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKCkiOworCisgICAgYm9vbCBpbml0X2N0b3IgPSBmYWxzZTsKKworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICAgIGlmICh0LT5pc19iYXNlX3R5cGUoKSB8fCB0LT5pc19lbnVtKCkgfHwgaXNfcmVmZXJlbmNlKCptX2l0ZXIpKSB7CisgICAgICAgIHN0cmluZyBkdmFsOworICAgICAgICBpZiAodC0+aXNfZW51bSgpKSB7CisgICAgICAgICAgZHZhbCArPSAiKCIgKyB0eXBlX25hbWUodCkgKyAiKSI7CisgICAgICAgIH0KKyAgICAgICAgZHZhbCArPSAodC0+aXNfc3RyaW5nKCkgfHwgaXNfcmVmZXJlbmNlKCptX2l0ZXIpKSA/ICIiIDogIjAiOworICAgICAgICB0X2NvbnN0X3ZhbHVlKiBjdiA9ICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgICAgICAgIGlmIChjdiAhPSBOVUxMKSB7CisgICAgICAgICAgZHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsICgqbV9pdGVyKS0+Z2V0X25hbWUoKSwgdCwgY3YpOworICAgICAgICB9CisgICAgICAgIGlmICghaW5pdF9jdG9yKSB7CisgICAgICAgICAgaW5pdF9jdG9yID0gdHJ1ZTsKKyAgICAgICAgICBvdXQgPDwgIiA6ICI7CisgICAgICAgICAgb3V0IDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCIgPDwgZHZhbCA8PCAiKSI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgb3V0IDw8ICIsICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoIiA8PCBkdmFsIDw8ICIpIjsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBvdXQgPDwgIiB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIC8vIFRPRE8oZHJlaXNzKTogV2hlbiBldmVyeXRoaW5nIGVsc2UgaW4gVGhyaWZ0IGlzIHBlcmZlY3QsCisgICAgLy8gZG8gbW9yZSBvZiB0aGVzZSBpbiB0aGUgaW5pdGlhbGl6ZXIgbGlzdC4KKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7CisKKyAgICAgIGlmICghdC0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgICAgdF9jb25zdF92YWx1ZSogY3YgPSAoKm1faXRlciktPmdldF92YWx1ZSgpOworICAgICAgICBpZiAoY3YgIT0gTlVMTCkgeworICAgICAgICAgIHByaW50X2NvbnN0X3ZhbHVlKG91dCwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpLCB0LCBjdik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgc2NvcGVfZG93bihvdXQpOworICB9CisKKyAgaWYgKHRzdHJ1Y3QtPmFubm90YXRpb25zXy5maW5kKCJmaW5hbCIpID09IHRzdHJ1Y3QtPmFubm90YXRpb25zXy5lbmQoKSkgeworICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ2aXJ0dWFsIH4iIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIigpIG5vZXhjZXB0OyIgPDwgZW5kbDsKKyAgfQorCisgIC8vIERlY2xhcmUgYWxsIGZpZWxkcworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgqbV9pdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocG9pbnRlcnMgJiYgISgqbV9pdGVyKS0+Z2V0X3R5cGUoKS0+aXNfeGNlcHRpb24oKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhcmVhZCkgPDwgZW5kbDsKKyAgfQorCisgIC8vIEFkZCB0aGUgX19pc3NldCBkYXRhIG1lbWJlciBpZiB3ZSBuZWVkIGl0LCB1c2luZyB0aGUgZGVmaW5pdGlvbiBmcm9tIGFib3ZlCisgIGlmIChoYXNfbm9ucmVxdWlyZWRfZmllbGRzICYmICghcG9pbnRlcnMgfHwgcmVhZCkpIHsKKyAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiXyIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiX19pc3NldCBfX2lzc2V0OyIgPDwgZW5kbDsKKyAgfQorCisgIC8vIENyZWF0ZSBhIHNldHRlciBmdW5jdGlvbiBmb3IgZWFjaCBmaWVsZAorICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgaWYgKHBvaW50ZXJzKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKGlzX3JlZmVyZW5jZSgoKm1faXRlcikpKSB7CisgICAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAidm9pZCBfX3NldF8iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKDo6c3RkOjpzaGFyZWRfcHRyPCIKKyAgICAgICAgICA8PCB0eXBlX25hbWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UpIDw8ICI+IjsKKyAgICAgIG91dCA8PCAiIHZhbCk7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAidm9pZCBfX3NldF8iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCIKKyAgICAgICAgICA8PCB0eXBlX25hbWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgdHJ1ZSk7CisgICAgICBvdXQgPDwgIiB2YWwpOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgb3V0IDw8IGVuZGw7CisKKyAgaWYgKCFwb2ludGVycykgeworICAgIC8vIFNob3VsZCB3ZSBnZW5lcmF0ZSBkZWZhdWx0IG9wZXJhdG9ycz8KKyAgICBpZiAoIWdlbl9ub19kZWZhdWx0X29wZXJhdG9yc18pIHsKKyAgICAgIC8vIEdlbmVyYXRlIGFuIGVxdWFsaXR5IHRlc3Rpbmcgb3BlcmF0b3IuICBNYWtlIGl0IGlubGluZSBzaW5jZSB0aGUgY29tcGlsZXIKKyAgICAgIC8vIHdpbGwgZG8gYSBiZXR0ZXIgam9iIHRoYW4gd2Ugd291bGQgd2hlbiBkZWNpZGluZyB3aGV0aGVyIHRvIGlubGluZSBpdC4KKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYm9vbCBvcGVyYXRvciA9PSAoY29uc3QgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgJiAiCisgICAgICAgICAgPDwgKG1lbWJlcnMuc2l6ZSgpID4gMCA/ICJyaHMiIDogIi8qIHJocyAqLyIpIDw8ICIpIGNvbnN0IiA8PCBlbmRsOworICAgICAgc2NvcGVfdXAob3V0KTsKKyAgICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgICAgLy8gTW9zdCBleGlzdGluZyBUaHJpZnQgY29kZSBkb2VzIG5vdCB1c2UgaXNzZXQgb3Igb3B0aW9uYWwvcmVxdWlyZWQsCisgICAgICAgIC8vIHNvIHdlIHRyZWF0ICJkZWZhdWx0IiBmaWVsZHMgYXMgcmVxdWlyZWQuCisgICAgICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX09QVElPTkFMKSB7CisgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoISgiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID09IHJocy4iCisgICAgICAgICAgICAgIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGZhbHNlOyIgPDwgZW5kbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChfX2lzc2V0LiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIT0gcmhzLl9faXNzZXQuIgorICAgICAgICAgICAgICA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIikiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGZhbHNlOyIgPDwgZW5kbAorICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZWxzZSBpZiAoX19pc3NldC4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICYmICEoIgorICAgICAgICAgICAgICA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9PSByaHMuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIikpIiA8PCBlbmRsCisgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBmYWxzZTsiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdHJ1ZTsiIDw8IGVuZGw7CisgICAgICBzY29wZV9kb3duKG91dCk7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImJvb2wgb3BlcmF0b3IgIT0gKGNvbnN0ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiICZyaHMpIGNvbnN0IHsiCisgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gISgqdGhpcyA9PSByaHMpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbAorICAgICAgICAgIDw8IGVuZGw7CisKKyAgICAgIC8vIEdlbmVyYXRlIHRoZSBkZWNsYXJhdGlvbiBvZiBhIGxlc3MtdGhhbiBvcGVyYXRvci4gIFRoaXMgbXVzdCBiZQorICAgICAgLy8gaW1wbGVtZW50ZWQgYnkgdGhlIGFwcGxpY2F0aW9uIGRldmVsb3BlciBpZiB0aGV5IHdpc2ggdG8gdXNlIGl0LiAgKFRoZXkKKyAgICAgIC8vIHdpbGwgZ2V0IGEgbGluayBlcnJvciBpZiB0aGV5IHRyeSB0byB1c2UgaXQgd2l0aG91dCBhbiBpbXBsZW1lbnRhdGlvbi4pCisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImJvb2wgb3BlcmF0b3IgPCAoY29uc3QgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgJiApIGNvbnN0OyIgPDwgZW5kbAorICAgICAgICAgIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgaWYgKHJlYWQpIHsKKyAgICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGVtcGxhdGUgPGNsYXNzIFByb3RvY29sXz4iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAidWludDMyX3QgcmVhZChQcm90b2NvbF8qIGlwcm90KTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidWludDMyX3QgcmVhZCgiCisgICAgICAgICAgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIGlwcm90KTsiIDw8IGVuZGw7CisgICAgfQorICB9CisgIGlmICh3cml0ZSkgeworICAgIGlmIChnZW5fdGVtcGxhdGVzXykgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0ZW1wbGF0ZSA8Y2xhc3MgUHJvdG9jb2xfPiIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICJ1aW50MzJfdCB3cml0ZShQcm90b2NvbF8qIG9wcm90KSBjb25zdDsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidWludDMyX3Qgd3JpdGUoIgorICAgICAgICAgIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBvcHJvdCkgY29uc3Q7IiA8PCBlbmRsOworICAgIH0KKyAgfQorICBvdXQgPDwgZW5kbDsKKworICBpZiAoaXNfdXNlcl9zdHJ1Y3QgJiYgIWhhc19jdXN0b21fb3N0cmVhbSh0c3RydWN0KSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidmlydHVhbCAiOworICAgIGdlbmVyYXRlX3N0cnVjdF9wcmludF9tZXRob2RfZGVjbChvdXQsIE5VTEwpOworICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKKyAgfQorCisgIC8vIHN0ZDo6ZXhjZXB0aW9uOjp3aGF0KCkKKyAgaWYgKGlzX2V4Y2VwdGlvbikgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAibXV0YWJsZSBzdGQ6OnN0cmluZyB0aHJpZnRURXhjZXB0aW9uTWVzc2FnZUhvbGRlcl87IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKTsKKyAgICBnZW5lcmF0ZV9leGNlcHRpb25fd2hhdF9tZXRob2RfZGVjbChvdXQsIHRzdHJ1Y3QsIGZhbHNlKTsKKyAgICBvdXQgPDwgIjsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifTsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBpZiAoc3dhcCkgeworICAgIC8vIEdlbmVyYXRlIGEgbmFtZXNwYWNlLXNjb3BlIHN3YXAoKSBmdW5jdGlvbgorICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidm9pZCBzd2FwKCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiICZhLCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkKKyAgICAgICAgPDwgIiAmYik7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKworICBpZiAoaXNfdXNlcl9zdHJ1Y3QpIHsKKyAgICBnZW5lcmF0ZV9zdHJ1Y3Rfb3N0cmVhbV9vcGVyYXRvcl9kZWNsKG91dCwgdHN0cnVjdCk7CisgIH0KK30KKwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdF9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvc3RyZWFtJiBmb3JjZV9jcHBfb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc2V0dGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3VzZXJfc3RydWN0KSB7CisgIC8vIEdldCBtZW1iZXJzCisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisKKyAgLy8gRGVzdHJ1Y3RvcgorICBpZiAodHN0cnVjdC0+YW5ub3RhdGlvbnNfLmZpbmQoImZpbmFsIikgPT0gdHN0cnVjdC0+YW5ub3RhdGlvbnNfLmVuZCgpKSB7CisgICAgZm9yY2VfY3BwX291dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIjo6fiIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgPDwgIigpIG5vZXhjZXB0IHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZvcmNlX2NwcF9vdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIC8vIENyZWF0ZSBhIHNldHRlciBmdW5jdGlvbiBmb3IgZWFjaCBmaWVsZAorICBpZiAoc2V0dGVycykgeworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIGlmIChpc19yZWZlcmVuY2UoKCptX2l0ZXIpKSkgeworICAgICAgICBzdGQ6OnN0cmluZyB0eXBlID0gdHlwZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ2b2lkICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiOjpfX3NldF8iCisgICAgICAgICAgICA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIig6OnN0ZDo6c2hhcmVkX3B0cjwiCisgICAgICAgICAgICA8PCB0eXBlX25hbWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UpIDw8ICI+IjsKKyAgICAgICAgb3V0IDw8ICIgdmFsKSB7IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInZvaWQgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICI6Ol9fc2V0XyIKKyAgICAgICAgICAgIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCIgPDwgdHlwZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIHRydWUpOworICAgICAgICBvdXQgPDwgIiB2YWwpIHsiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGhpcy0+IiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9IHZhbDsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworCisgICAgICAvLyBhc3N1bWUgYWxsIGZpZWxkcyBhcmUgcmVxdWlyZWQgZXhjZXB0IG9wdGlvbmFsIGZpZWxkcy4KKyAgICAgIC8vIGZvciBvcHRpb25hbCBmaWVsZHMgY2hhbmdlIF9faXNzZXQubmFtZSB0byB0cnVlCisgICAgICBib29sIGlzX29wdGlvbmFsID0gKCptX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTDsKKyAgICAgIGlmIChpc19vcHRpb25hbCkgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgaW5kZW50KCkgPDwgIl9faXNzZXQuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9IHRydWU7IiA8PCBlbmRsOworICAgICAgfQorICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgfQorICBpZiAoaXNfdXNlcl9zdHJ1Y3QpIHsKKyAgICBnZW5lcmF0ZV9zdHJ1Y3Rfb3N0cmVhbV9vcGVyYXRvcihvdXQsIHRzdHJ1Y3QpOworICB9CisgIG91dCA8PCBlbmRsOworfQorCisvKioKKyAqIE1ha2VzIGEgaGVscGVyIGZ1bmN0aW9uIHRvIGdlbiBhIHN0cnVjdCByZWFkZXIuCisgKgorICogQHBhcmFtIG91dCBTdHJlYW0gdG8gd3JpdGUgdG8KKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QKKyAqLwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdF9yZWFkZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBwb2ludGVycykgeworICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRlbXBsYXRlIDxjbGFzcyBQcm90b2NvbF8+IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ1aW50MzJfdCAiCisgICAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIjo6cmVhZChQcm90b2NvbF8qIGlwcm90KSB7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChvdXQpIDw8ICJ1aW50MzJfdCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICA8PCAiOjpyZWFkKDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIGlwcm90KSB7IiA8PCBlbmRsOworICB9CisgIGluZGVudF91cCgpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAvLyBEZWNsYXJlIHN0YWNrIHRtcCB2YXJpYWJsZXMKKyAgb3V0IDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VElucHV0UmVjdXJzaW9uVHJhY2tlciB0cmFja2VyKCppcHJvdCk7IiA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAidWludDMyX3QgeGZlciA9IDA7IiA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAic3RkOjpzdHJpbmcgZm5hbWU7IiA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRUeXBlIGZ0eXBlOyIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgImludDE2X3QgZmlkOyIgPDwgZW5kbAorICAgICAgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gaXByb3QtPnJlYWRTdHJ1Y3RCZWdpbihmbmFtZSk7IiA8PCBlbmRsCisgICAgICA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAidXNpbmcgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEV4Y2VwdGlvbjsiIDw8IGVuZGwKKyAgICAgIDw8IGVuZGw7CisKKyAgLy8gUmVxdWlyZWQgdmFyaWFibGVzIGFyZW4ndCBpbiBfX2lzc2V0LCBzbyB3ZSBuZWVkIHRtcCB2YXJzIHRvIGNoZWNrIHRoZW0uCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpCisgICAgICBpbmRlbnQob3V0KSA8PCAiYm9vbCBpc3NldF8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gZmFsc2U7IiA8PCBlbmRsOworICB9CisgIG91dCA8PCBlbmRsOworCisgIC8vIExvb3Agb3ZlciByZWFkaW5nIGluIGZpZWxkcworICBpbmRlbnQob3V0KSA8PCAid2hpbGUgKHRydWUpIiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworCisgIC8vIFJlYWQgYmVnaW5uaW5nIGZpZWxkIG1hcmtlcgorICBpbmRlbnQob3V0KSA8PCAieGZlciArPSBpcHJvdC0+cmVhZEZpZWxkQmVnaW4oZm5hbWUsIGZ0eXBlLCBmaWQpOyIgPDwgZW5kbDsKKworICAvLyBDaGVjayBmb3IgZmllbGQgU1RPUCBtYXJrZXIKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoZnR5cGUgPT0gOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfU1RPUCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIiAgYnJlYWs7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgIGlmIChmaWVsZHMuZW1wdHkoKSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSBpcHJvdC0+c2tpcChmdHlwZSk7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIC8vIFN3aXRjaCBzdGF0ZW1lbnQgb24gdGhlIGZpZWxkIHdlIGFyZSByZWFkaW5nCisgICAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmlkKSIgPDwgZW5kbDsKKworICAgIHNjb3BlX3VwKG91dCk7CisKKyAgICAvLyBHZW5lcmF0ZSBkZXNlcmlhbGl6YXRpb24gY29kZSBmb3Iga25vd24gY2FzZXMKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOiIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50KG91dCkgPDwgImlmIChmdHlwZSA9PSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKworICAgICAgY29uc3QgY2hhciogaXNzZXRfcHJlZml4ID0gKCgqZl9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpID8gInRoaXMtPl9faXNzZXQuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogImlzc2V0XyI7CisKKyNpZiAwCisgICAgICAgICAgLy8gVGhpcyBjb2RlIHRocm93cyBhbiBleGNlcHRpb24gaWYgdGhlIHNhbWUgZmllbGQgaXMgZW5jb3VudGVyZWQgdHdpY2UuCisgICAgICAgICAgLy8gV2UndmUgZGVjaWRlZCB0byBsZWF2ZSBpdCBvdXQgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuCisgICAgICAgICAgLy8gVE9ETyhkcmVpc3MpOiBHZW5lcmF0ZSB0aGlzIGNvZGUgYW5kICJpZiIgaXQgb3V0IHRvIG1ha2UgaXQgZWFzaWVyCisgICAgICAgICAgLy8gZm9yIHBlb3BsZSByZWNvbXBpbGluZyB0aHJpZnQgdG8gaW5jbHVkZSBpdC4KKyAgICAgICAgICBvdXQgPDwKKyAgICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAoIiA8PCBpc3NldF9wcmVmaXggPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIiA8PCBlbmRsIDw8CisgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEpOyIgPDwgZW5kbDsKKyNlbmRpZgorCisgICAgICBpZiAocG9pbnRlcnMgJiYgISgqZl9pdGVyKS0+Z2V0X3R5cGUoKS0+aXNfeGNlcHRpb24oKSkgeworICAgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICIoKih0aGlzLT4iLCAiKSkiKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMtPiIpOworICAgICAgfQorICAgICAgb3V0IDw8IGluZGVudCgpIDw8IGlzc2V0X3ByZWZpeCA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IHRydWU7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgeGZlciArPSBpcHJvdC0+c2tpcChmdHlwZSk7IiA8PCBlbmRsCisgICAgICAgICAgPDwKKyAgICAgICAgICAvLyBUT0RPKGRyZWlzcyk6IE1ha2UgdGhpcyBhbiBvcHRpb24gd2hlbiB0aHJpZnQgc3RydWN0cworICAgICAgICAgIC8vIGhhdmUgYSBjb21tb24gYmFzZSBjbGFzcy4KKyAgICAgICAgICAvLyBpbmRlbnQoKSA8PCAiICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEpOyIgPDwgZW5kbCA8PAorICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgIH0KKworICAgIC8vIEluIHRoZSBkZWZhdWx0IGNhc2Ugd2Ugc2tpcCB0aGUgZmllbGQKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHhmZXIgKz0gaXByb3QtPnNraXAoZnR5cGUpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICBicmVhazsiIDw8IGVuZGw7CisKKyAgICBzY29wZV9kb3duKG91dCk7CisgIH0gLy8hZmllbGRzLmVtcHR5KCkKKyAgLy8gUmVhZCBmaWVsZCBlbmQgbWFya2VyCisgIGluZGVudChvdXQpIDw8ICJ4ZmVyICs9IGlwcm90LT5yZWFkRmllbGRFbmQoKTsiIDw8IGVuZGw7CisKKyAgc2NvcGVfZG93bihvdXQpOworCisgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ4ZmVyICs9IGlwcm90LT5yZWFkU3RydWN0RW5kKCk7IiA8PCBlbmRsOworCisgIC8vIFRocm93IGlmIGFueSByZXF1aXJlZCBmaWVsZHMgYXJlIG1pc3NpbmcuCisgIC8vIFdlIGRvIHRoaXMgYWZ0ZXIgcmVhZGluZyB0aGUgc3RydWN0IGVuZCBzbyB0aGF0CisgIC8vIHRoZXJlIG1pZ2h0IHBvc3NpYmx5IGJlIGEgY2hhbmNlIG9mIGNvbnRpbnVpbmcuCisgIG91dCA8PCBlbmRsOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKQorICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIWlzc2V0XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICcpJyA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIiAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBKTsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHhmZXI7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHRoZSB3cml0ZSBmdW5jdGlvbi4KKyAqCisgKiBAcGFyYW0gb3V0IFN0cmVhbSB0byB3cml0ZSB0bworICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdAorICovCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0X3dyaXRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIHBvaW50ZXJzKSB7CisgIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRlbXBsYXRlIDxjbGFzcyBQcm90b2NvbF8+IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ1aW50MzJfdCAiCisgICAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIjo6d3JpdGUoUHJvdG9jb2xfKiBvcHJvdCkgY29uc3QgeyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCAidWludDMyX3QgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgPDwgIjo6d3JpdGUoOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCogb3Byb3QpIGNvbnN0IHsiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X3VwKCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ1aW50MzJfdCB4ZmVyID0gMDsiIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUT3V0cHV0UmVjdXJzaW9uVHJhY2tlciB0cmFja2VyKCpvcHJvdCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAieGZlciArPSBvcHJvdC0+d3JpdGVTdHJ1Y3RCZWdpbihcIiIgPDwgbmFtZSA8PCAiXCIpOyIgPDwgZW5kbDsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGJvb2wgY2hlY2tfaWZfc2V0ID0gKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTAorICAgICAgICAgICAgICAgICAgICAgICAgfHwgKCpmX2l0ZXIpLT5nZXRfdHlwZSgpLT5pc194Y2VwdGlvbigpOworICAgIGlmIChjaGVja19pZl9zZXQpIHsKKyAgICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpZiAodGhpcy0+X19pc3NldC4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCBlbmRsOworICAgIH0KKworICAgIC8vIFdyaXRlIGZpZWxkIGhlYWRlcgorICAgIG91dCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSBvcHJvdC0+d3JpdGVGaWVsZEJlZ2luKCIKKyAgICAgICAgPDwgIlwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiLCAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIsICIKKyAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIik7IiA8PCBlbmRsOworICAgIC8vIFdyaXRlIGZpZWxkIGNvbnRlbnRzCisgICAgaWYgKHBvaW50ZXJzICYmICEoKmZfaXRlciktPmdldF90eXBlKCktPmlzX3hjZXB0aW9uKCkpIHsKKyAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICIoKih0aGlzLT4iLCAiKSkiKTsKKyAgICB9IGVsc2UgeworICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMtPiIpOworICAgIH0KKyAgICAvLyBXcml0ZSBmaWVsZCBjbG9zZXIKKyAgICBpbmRlbnQob3V0KSA8PCAieGZlciArPSBvcHJvdC0+d3JpdGVGaWVsZEVuZCgpOyIgPDwgZW5kbDsKKyAgICBpZiAoY2hlY2tfaWZfc2V0KSB7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgJ30nOworICAgIH0KKyAgfQorCisgIG91dCA8PCBlbmRsOworCisgIC8vIFdyaXRlIHRoZSBzdHJ1Y3QgbWFwCisgIG91dCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSBvcHJvdC0+d3JpdGVGaWVsZFN0b3AoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJ4ZmVyICs9IG9wcm90LT53cml0ZVN0cnVjdEVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgInJldHVybiB4ZmVyOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIFN0cnVjdCB3cml0ZXIgZm9yIHJlc3VsdCBvZiBhIGZ1bmN0aW9uLCB3aGljaCBjYW4gaGF2ZSBvbmx5IG9uZSBvZiBpdHMKKyAqIGZpZWxkcyBzZXQgYW5kIGRvZXMgYSBjb25kaXRpb25hbCBpZiBlbHNlIGxvb2sgdXAgaW50byB0aGUgX19pc3NldCBmaWVsZAorICogb2YgdGhlIHN0cnVjdC4KKyAqCisgKiBAcGFyYW0gb3V0IE91dHB1dCBzdHJlYW0KKyAqIEBwYXJhbSB0c3RydWN0IFRoZSByZXN1bHQgc3RydWN0CisgKi8KK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwb2ludGVycykgeworICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0ZW1wbGF0ZSA8Y2xhc3MgUHJvdG9jb2xfPiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAidWludDMyX3QgIgorICAgICAgICA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICI6OndyaXRlKFByb3RvY29sXyogb3Byb3QpIGNvbnN0IHsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgInVpbnQzMl90ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgIDw8ICI6OndyaXRlKDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIG9wcm90KSBjb25zdCB7IiA8PCBlbmRsOworICB9CisgIGluZGVudF91cCgpOworCisgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ1aW50MzJfdCB4ZmVyID0gMDsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAieGZlciArPSBvcHJvdC0+d3JpdGVTdHJ1Y3RCZWdpbihcIiIgPDwgbmFtZSA8PCAiXCIpOyIgPDwgZW5kbDsKKworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaWYgIjsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8ICIgZWxzZSBpZiAiOworICAgIH0KKworICAgIG91dCA8PCAiKHRoaXMtPl9faXNzZXQuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIikgeyIgPDwgZW5kbDsKKworICAgIGluZGVudF91cCgpOworCisgICAgLy8gV3JpdGUgZmllbGQgaGVhZGVyCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ4ZmVyICs9IG9wcm90LT53cml0ZUZpZWxkQmVnaW4oIgorICAgICAgICA8PCAiXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIsICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiwgIgorICAgICAgICA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiKTsiIDw8IGVuZGw7CisgICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKKyAgICBpZiAocG9pbnRlcnMpIHsKKyAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICIoKih0aGlzLT4iLCAiKSkiKTsKKyAgICB9IGVsc2UgeworICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMtPiIpOworICAgIH0KKyAgICAvLyBXcml0ZSBmaWVsZCBjbG9zZXIKKyAgICBpbmRlbnQob3V0KSA8PCAieGZlciArPSBvcHJvdC0+d3JpdGVGaWVsZEVuZCgpOyIgPDwgZW5kbDsKKworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iOworICB9CisKKyAgLy8gV3JpdGUgdGhlIHN0cnVjdCBtYXAKKyAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gb3Byb3QtPndyaXRlRmllbGRTdG9wKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAieGZlciArPSBvcHJvdC0+d3JpdGVTdHJ1Y3RFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJldHVybiB4ZmVyOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyB0aGUgc3dhcCBmdW5jdGlvbi4KKyAqCisgKiBAcGFyYW0gb3V0IFN0cmVhbSB0byB3cml0ZSB0bworICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdAorICovCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0X3N3YXAob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBvdXQgPDwgaW5kZW50KCkgPDwgInZvaWQgc3dhcCgiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiAmYSwgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpCisgICAgICA8PCAiICZiKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICAvLyBMZXQgYXJndW1lbnQtZGVwZW5kZW50IG5hbWUgbG9va3VwIGZpbmQgdGhlIGNvcnJlY3Qgc3dhcCgpIGZ1bmN0aW9uIHRvCisgIC8vIHVzZSBiYXNlZCBvbiB0aGUgYXJndW1lbnQgdHlwZXMuICBJZiBub25lIGlzIGZvdW5kIGluIHRoZSBhcmd1bWVudHMnCisgIC8vIG5hbWVzcGFjZXMsIGZhbGwgYmFjayB0byA6OnN0ZDo6c3dhcCgpLgorICBvdXQgPDwgaW5kZW50KCkgPDwgInVzaW5nIDo6c3RkOjpzd2FwOyIgPDwgZW5kbDsKKworICBib29sIGhhc19ub25yZXF1aXJlZF9maWVsZHMgPSBmYWxzZTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgZm9yICh2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiB0ZmllbGQgPSAqZl9pdGVyOworCisgICAgaWYgKHRmaWVsZC0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgIGhhc19ub25yZXF1aXJlZF9maWVsZHMgPSB0cnVlOworICAgIH0KKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAic3dhcChhLiIgPDwgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIsIGIuIiA8PCB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIik7IgorICAgICAgICA8PCBlbmRsOworICB9CisKKyAgaWYgKGhhc19ub25yZXF1aXJlZF9maWVsZHMpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInN3YXAoYS5fX2lzc2V0LCBiLl9faXNzZXQpOyIgPDwgZW5kbDsKKyAgfQorCisgIC8vIGhhbmRsZSBlbXB0eSBzdHJ1Y3RzCisgIGlmIChmaWVsZHMuc2l6ZSgpID09IDApIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIih2b2lkKSBhOyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIih2b2lkKSBiOyIgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3Rfb3N0cmVhbV9vcGVyYXRvcl9kZWNsKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBvdXQgPDwgInN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG91dCwgY29uc3QgIgorICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKQorICAgICAgPDwgIiYgb2JqKTsiIDw8IGVuZGw7CisgIG91dCA8PCBlbmRsOworfQorCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0X29zdHJlYW1fb3BlcmF0b3Ioc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGlmICghaGFzX2N1c3RvbV9vc3RyZWFtKHRzdHJ1Y3QpKSB7CisgICAgLy8gdGhyaWZ0IGRlZmluZXMgdGhpcyBiZWhhdmlvcgorICAgIG91dCA8PCAic3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3V0LCBjb25zdCAiCisgICAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkKKyAgICAgICAgPDwgIiYgb2JqKSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChvdXQpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAib2JqLnByaW50VG8ob3V0KTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInJldHVybiBvdXQ7IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICBvdXQgPDwgZW5kbDsKKyAgfQorfQorCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0X3ByaW50X21ldGhvZF9kZWNsKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBvdXQgPDwgInZvaWQgIjsKKyAgaWYgKHRzdHJ1Y3QpIHsKKyAgICBvdXQgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiOjoiOworICB9CisgIG91dCA8PCAicHJpbnRUbyhzdGQ6Om9zdHJlYW0mIG91dCkgY29uc3QiOworfQorCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZXhjZXB0aW9uX3doYXRfbWV0aG9kX2RlY2woc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBleHRlcm5hbCkgeworICBvdXQgPDwgImNvbnN0IGNoYXIqICI7CisgIGlmIChleHRlcm5hbCkgeworICAgIG91dCA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICI6OiI7CisgIH0KKyAgb3V0IDw8ICJ3aGF0KCkgY29uc3Qgbm9leGNlcHQiOworfQorCituYW1lc3BhY2Ugc3RydWN0X29zdHJlYW1fb3BlcmF0b3JfZ2VuZXJhdG9yIHsKK3ZvaWQgZ2VuZXJhdGVfcmVxdWlyZWRfZmllbGRfdmFsdWUoc3RkOjpvc3RyZWFtJiBvdXQsIGNvbnN0IHRfZmllbGQqIGZpZWxkKSB7CisgIG91dCA8PCAiIDw8IHRvX3N0cmluZygiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIpIjsKK30KKwordm9pZCBnZW5lcmF0ZV9vcHRpb25hbF9maWVsZF92YWx1ZShzdGQ6Om9zdHJlYW0mIG91dCwgY29uc3QgdF9maWVsZCogZmllbGQpIHsKKyAgb3V0IDw8ICI7IChfX2lzc2V0LiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiA/IChvdXQiOworICBnZW5lcmF0ZV9yZXF1aXJlZF9maWVsZF92YWx1ZShvdXQsIGZpZWxkKTsKKyAgb3V0IDw8ICIpIDogKG91dCA8PCBcIjxudWxsPlwiKSkiOworfQorCit2b2lkIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlKHN0ZDo6b3N0cmVhbSYgb3V0LCBjb25zdCB0X2ZpZWxkKiBmaWVsZCkgeworICBpZiAoZmllbGQtPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMKQorICAgIGdlbmVyYXRlX29wdGlvbmFsX2ZpZWxkX3ZhbHVlKG91dCwgZmllbGQpOworICBlbHNlCisgICAgZ2VuZXJhdGVfcmVxdWlyZWRfZmllbGRfdmFsdWUob3V0LCBmaWVsZCk7Cit9CisKK3ZvaWQgZ2VuZXJhdGVfZmllbGRfbmFtZShzdGQ6Om9zdHJlYW0mIG91dCwgY29uc3QgdF9maWVsZCogZmllbGQpIHsKKyAgb3V0IDw8ICJcIiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIj1cIiI7Cit9CisKK3ZvaWQgZ2VuZXJhdGVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsIGNvbnN0IHRfZmllbGQqIGZpZWxkKSB7CisgIGdlbmVyYXRlX2ZpZWxkX25hbWUob3V0LCBmaWVsZCk7CisgIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlKG91dCwgZmllbGQpOworfQorCit2b2lkIGdlbmVyYXRlX2ZpZWxkcyhzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBpbmRlbnQpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgYmVnID0gZmllbGRzLmJlZ2luKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IGZpZWxkcy5lbmQoKTsKKworICBmb3IgKHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gYmVnOyBpdCAhPSBlbmQ7ICsraXQpIHsKKyAgICBvdXQgPDwgaW5kZW50IDw8ICJvdXQgPDwgIjsKKworICAgIGlmIChpdCAhPSBiZWcpIHsKKyAgICAgIG91dCA8PCAiXCIsIFwiIDw8ICI7CisgICAgfQorCisgICAgZ2VuZXJhdGVfZmllbGQob3V0LCAqaXQpOworICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKKyAgfQorfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBvcGVyYXRvcjw8CisgKi8KK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3RfcHJpbnRfbWV0aG9kKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBvdXQgPDwgaW5kZW50KCk7CisgIGdlbmVyYXRlX3N0cnVjdF9wcmludF9tZXRob2RfZGVjbChvdXQsIHRzdHJ1Y3QpOworICBvdXQgPDwgIiB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAidXNpbmcgOjphcGFjaGU6OnRocmlmdDo6dG9fc3RyaW5nOyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJvdXQgPDwgXCIiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIihcIjsiIDw8IGVuZGw7CisgIHN0cnVjdF9vc3RyZWFtX29wZXJhdG9yX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZmllbGRzKG91dCwgdHN0cnVjdC0+Z2V0X21lbWJlcnMoKSwgaW5kZW50KCkpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIm91dCA8PCBcIilcIjsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHdoYXQoKSBtZXRob2QgZm9yIGV4Y2VwdGlvbnMKKyAqLwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2V4Y2VwdGlvbl93aGF0X21ldGhvZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgb3V0IDw8IGluZGVudCgpOworICBnZW5lcmF0ZV9leGNlcHRpb25fd2hhdF9tZXRob2RfZGVjbChvdXQsIHRzdHJ1Y3QsIHRydWUpOworICBvdXQgPDwgIiB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworICBvdXQgPDwgaW5kZW50KCkgPDwgInRyeSB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworICBvdXQgPDwgaW5kZW50KCkgPDwgInN0ZDo6c3RyaW5nc3RyZWFtIHNzOyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJzcyA8PCBcIlRFeGNlcHRpb24gLSBzZXJ2aWNlIGhhcyB0aHJvd246IFwiIDw8ICp0aGlzOyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ0aGlzLT50aHJpZnRURXhjZXB0aW9uTWVzc2FnZUhvbGRlcl8gPSBzcy5zdHIoKTsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHRoaXMtPnRocmlmdFRFeGNlcHRpb25NZXNzYWdlSG9sZGVyXy5jX3N0cigpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0gY2F0Y2ggKGNvbnN0IHN0ZDo6ZXhjZXB0aW9uJikgeyIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gXCJURXhjZXB0aW9uIC0gc2VydmljZSBoYXMgdGhyb3duOiAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIlwiOyIKKyAgICAgIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHRocmlmdCBzZXJ2aWNlLiBJbiBDKyssIHRoaXMgY29tcHJpc2VzIGFuIGVudGlyZWx5IHNlcGFyYXRlCisgKiBoZWFkZXIgYW5kIHNvdXJjZSBmaWxlLiBUaGUgaGVhZGVyIGZpbGUgZGVmaW5lcyB0aGUgbWV0aG9kcyBhbmQgaW5jbHVkZXMKKyAqIHRoZSBkYXRhIHR5cGVzIGRlZmluZWQgaW4gdGhlIG1haW4gaGVhZGVyIGZpbGUsIGFuZCB0aGUgaW1wbGVtZW50YXRpb24KKyAqIGZpbGUgY29udGFpbnMgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBiYXNpYyBwcmludGVyIGFuZCBkZWZhdWx0IGludGVyZmFjZXMuCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGRlZmluaXRpb24KKyAqLwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgc3ZjbmFtZSA9IHRzZXJ2aWNlLT5nZXRfbmFtZSgpOworCisgIC8vIE1ha2Ugb3V0cHV0IGZpbGVzCisgIHN0cmluZyBmX2hlYWRlcl9uYW1lID0gZ2V0X291dF9kaXIoKSArIHN2Y25hbWUgKyAiLmgiOworICBmX2hlYWRlcl8ub3BlbihmX2hlYWRlcl9uYW1lLmNfc3RyKCkpOworCisgIC8vIFByaW50IGhlYWRlciBmaWxlIGluY2x1ZGVzCisgIGZfaGVhZGVyXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKTsKKyAgZl9oZWFkZXJfIDw8ICIjaWZuZGVmICIgPDwgc3ZjbmFtZSA8PCAiX0giIDw8IGVuZGwgPDwgIiNkZWZpbmUgIiA8PCBzdmNuYW1lIDw8ICJfSCIgPDwgZW5kbAorICAgICAgICAgICAgPDwgZW5kbDsKKyAgaWYgKGdlbl9jb2Jfc3R5bGVfKSB7CisgICAgZl9oZWFkZXJfIDw8ICIjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPiIgPDwgZW5kbCAvLyBUTWVtb3J5QnVmZmVyCisgICAgICAgICAgICAgIDw8ICIjaW5jbHVkZSA8ZnVuY3Rpb25hbD4iIDw8IGVuZGwgCisgICAgICAgICAgICAgIDw8ICIjaW5jbHVkZSA8bWVtb3J5PiIgPDwgZW5kbAorICAgICAgICAgICAgICA8PCAibmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgYXN5bmMgeyIgPDwgZW5kbAorICAgICAgICAgICAgICA8PCAiY2xhc3MgVEFzeW5jQ2hhbm5lbDsiIDw8IGVuZGwgPDwgIn19fSIgPDwgZW5kbDsKKyAgfQorICBmX2hlYWRlcl8gPDwgIiNpbmNsdWRlIDx0aHJpZnQvVERpc3BhdGNoUHJvY2Vzc29yLmg+IiA8PCBlbmRsOworICBpZiAoZ2VuX2NvYl9zdHlsZV8pIHsKKyAgICBmX2hlYWRlcl8gPDwgIiNpbmNsdWRlIDx0aHJpZnQvYXN5bmMvVEFzeW5jRGlzcGF0Y2hQcm9jZXNzb3IuaD4iIDw8IGVuZGw7CisgIH0KKyAgZl9oZWFkZXJfIDw8ICIjaW5jbHVkZSA8dGhyaWZ0L2FzeW5jL1RDb25jdXJyZW50Q2xpZW50U3luY0luZm8uaD4iIDw8IGVuZGw7CisgIGZfaGVhZGVyXyA8PCAiI2luY2x1ZGUgXCIiIDw8IGdldF9pbmNsdWRlX3ByZWZpeCgqZ2V0X3Byb2dyYW0oKSkgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiX3R5cGVzLmhcIiIKKyAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgdF9zZXJ2aWNlKiBleHRlbmRzX3NlcnZpY2UgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKKyAgaWYgKGV4dGVuZHNfc2VydmljZSAhPSBOVUxMKSB7CisgICAgZl9oZWFkZXJfIDw8ICIjaW5jbHVkZSBcIiIgPDwgZ2V0X2luY2x1ZGVfcHJlZml4KCooZXh0ZW5kc19zZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSkKKyAgICAgICAgICAgICAgPDwgZXh0ZW5kc19zZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICIuaFwiIiA8PCBlbmRsOworICB9CisKKyAgZl9oZWFkZXJfIDw8IGVuZGwgPDwgbnNfb3Blbl8gPDwgZW5kbCA8PCBlbmRsOworCisgIGZfaGVhZGVyXyA8PCAiI2lmZGVmIF9NU0NfVkVSXG4iCisgICAgICAgICAgICAgICAiICAjcHJhZ21hIHdhcm5pbmcoIHB1c2ggKVxuIgorICAgICAgICAgICAgICAgIiAgI3ByYWdtYSB3YXJuaW5nIChkaXNhYmxlIDogNDI1MCApIC8vaW5oZXJpdGluZyBtZXRob2RzIHZpYSBkb21pbmFuY2UgXG4iCisgICAgICAgICAgICAgICAiI2VuZGlmXG5cbiI7CisKKyAgLy8gU2VydmljZSBpbXBsZW1lbnRhdGlvbiBmaWxlIGluY2x1ZGVzCisgIHN0cmluZyBmX3NlcnZpY2VfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBzdmNuYW1lICsgIi5jcHAiOworICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7CisgIGZfc2VydmljZV8gPDwgYXV0b2dlbl9jb21tZW50KCk7CisgIGZfc2VydmljZV8gPDwgIiNpbmNsdWRlIFwiIiA8PCBnZXRfaW5jbHVkZV9wcmVmaXgoKmdldF9wcm9ncmFtKCkpIDw8IHN2Y25hbWUgPDwgIi5oXCIiIDw8IGVuZGw7CisgIGlmIChnZW5fY29iX3N0eWxlXykgeworICAgIGZfc2VydmljZV8gPDwgIiNpbmNsdWRlIFwidGhyaWZ0L2FzeW5jL1RBc3luY0NoYW5uZWwuaFwiIiA8PCBlbmRsOworICB9CisgIGlmIChnZW5fdGVtcGxhdGVzXykgeworICAgIGZfc2VydmljZV8gPDwgIiNpbmNsdWRlIFwiIiA8PCBnZXRfaW5jbHVkZV9wcmVmaXgoKmdldF9wcm9ncmFtKCkpIDw8IHN2Y25hbWUgPDwgIi50Y2NcIiIKKyAgICAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgICBzdHJpbmcgZl9zZXJ2aWNlX3RjY19uYW1lID0gZ2V0X291dF9kaXIoKSArIHN2Y25hbWUgKyAiLnRjYyI7CisgICAgZl9zZXJ2aWNlX3RjY18ub3BlbihmX3NlcnZpY2VfdGNjX25hbWUuY19zdHIoKSk7CisgICAgZl9zZXJ2aWNlX3RjY18gPDwgYXV0b2dlbl9jb21tZW50KCk7CisgICAgZl9zZXJ2aWNlX3RjY18gPDwgIiNpbmNsdWRlIFwiIiA8PCBnZXRfaW5jbHVkZV9wcmVmaXgoKmdldF9wcm9ncmFtKCkpIDw8IHN2Y25hbWUgPDwgIi5oXCIiCisgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKworICAgIGZfc2VydmljZV90Y2NfIDw8ICIjaWZuZGVmICIgPDwgc3ZjbmFtZSA8PCAiX1RDQyIgPDwgZW5kbCA8PCAiI2RlZmluZSAiIDw8IHN2Y25hbWUgPDwgIl9UQ0MiCisgICAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBlbmRsOworCisgICAgaWYgKGdlbl9jb2Jfc3R5bGVfKSB7CisgICAgICBmX3NlcnZpY2VfdGNjXyA8PCAiI2luY2x1ZGUgXCJ0aHJpZnQvYXN5bmMvVEFzeW5jQ2hhbm5lbC5oXCIiIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsIDw8IG5zX29wZW5fIDw8IGVuZGwgPDwgZW5kbDsKKyAgZl9zZXJ2aWNlX3RjY18gPDwgZW5kbCA8PCBuc19vcGVuXyA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgYWxsIHRoZSBjb21wb25lbnRzCisgIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlLCAiIik7CisgIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlX2ZhY3RvcnkodHNlcnZpY2UsICIiKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9udWxsKHRzZXJ2aWNlLCAiIik7CisgIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlLCAiIik7CisgIGdlbmVyYXRlX3NlcnZpY2VfcHJvY2Vzc29yKHRzZXJ2aWNlLCAiIik7CisgIGdlbmVyYXRlX3NlcnZpY2VfbXVsdGlmYWNlKHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UsICJDb25jdXJyZW50Iik7CisKKyAgLy8gR2VuZXJhdGUgc2tlbGV0b24KKyAgaWYgKCFnZW5fbm9fc2tlbGV0b25fKSB7CisgICAgICBnZW5lcmF0ZV9zZXJ2aWNlX3NrZWxldG9uKHRzZXJ2aWNlKTsKKyAgfQorCisgIC8vIEdlbmVyYXRlIGFsbCB0aGUgY29iIGNvbXBvbmVudHMKKyAgaWYgKGdlbl9jb2Jfc3R5bGVfKSB7CisgICAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UsICJDb2JDbCIpOworICAgIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlLCAiQ29iU3YiKTsKKyAgICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZV9mYWN0b3J5KHRzZXJ2aWNlLCAiQ29iU3YiKTsKKyAgICBnZW5lcmF0ZV9zZXJ2aWNlX251bGwodHNlcnZpY2UsICJDb2JTdiIpOworICAgIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlLCAiQ29iIik7CisgICAgZ2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3IodHNlcnZpY2UsICJDb2IiKTsKKworICAgIGlmICghZ2VuX25vX3NrZWxldG9uXykgeworICAgICAgZ2VuZXJhdGVfc2VydmljZV9hc3luY19za2VsZXRvbih0c2VydmljZSk7CisgICAgfQorCisgIH0KKworICBmX2hlYWRlcl8gPDwgIiNpZmRlZiBfTVNDX1ZFUlxuIgorICAgICAgICAgICAgICAgIiAgI3ByYWdtYSB3YXJuaW5nKCBwb3AgKVxuIgorICAgICAgICAgICAgICAgIiNlbmRpZlxuXG4iOworCisgIC8vIENsb3NlIHRoZSBuYW1lc3BhY2UKKyAgZl9zZXJ2aWNlXyA8PCBuc19jbG9zZV8gPDwgZW5kbCA8PCBlbmRsOworICBmX3NlcnZpY2VfdGNjXyA8PCBuc19jbG9zZV8gPDwgZW5kbCA8PCBlbmRsOworICBmX2hlYWRlcl8gPDwgbnNfY2xvc2VfIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBUT0RPKHNpbXBraW5zKTogTWFrZSB0aGlzIGEgc2VwYXJhdGUgb3B0aW9uCisgIGlmIChnZW5fdGVtcGxhdGVzXykgeworICAgIGZfaGVhZGVyXyA8PCAiI2luY2x1ZGUgXCIiIDw8IGdldF9pbmNsdWRlX3ByZWZpeCgqZ2V0X3Byb2dyYW0oKSkgPDwgc3ZjbmFtZSA8PCAiLnRjY1wiIiA8PCBlbmRsCisgICAgICAgICAgICAgIDw8ICIjaW5jbHVkZSBcIiIgPDwgZ2V0X2luY2x1ZGVfcHJlZml4KCpnZXRfcHJvZ3JhbSgpKSA8PCBwcm9ncmFtX25hbWVfCisgICAgICAgICAgICAgIDw8ICJfdHlwZXMudGNjXCIiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIGZfaGVhZGVyXyA8PCAiI2VuZGlmIiA8PCBlbmRsOworICBmX3NlcnZpY2VfdGNjXyA8PCAiI2VuZGlmIiA8PCBlbmRsOworCisgIC8vIENsb3NlIHRoZSBmaWxlcworICBmX3NlcnZpY2VfdGNjXy5jbG9zZSgpOworICBmX3NlcnZpY2VfLmNsb3NlKCk7CisgIGZfaGVhZGVyXy5jbG9zZSgpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBoZWxwZXIgZnVuY3Rpb25zIGZvciBhIHNlcnZpY2UuIEJhc2ljYWxseSwgdGhpcyBnZW5lcmF0ZXMgdHlwZXMKKyAqIGZvciBhbGwgdGhlIGFyZ3VtZW50cyBhbmQgcmVzdWx0cyB0byBmdW5jdGlvbnMuCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCisgKi8KK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSkgeworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgc3RkOjpvc3RyZWFtJiBvdXQgPSAoZ2VuX3RlbXBsYXRlc18gPyBmX3NlcnZpY2VfdGNjXyA6IGZfc2VydmljZV8pOworCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9zdHJ1Y3QqIHRzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIHN0cmluZyBuYW1lX29yaWcgPSB0cy0+Z2V0X25hbWUoKTsKKworICAgIC8vIFRPRE8oZHJlaXNzKTogV2h5IGlzIHRoaXMgc3R1ZmYgbm90IGluIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnM/CisgICAgdHMtPnNldF9uYW1lKHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIl8iICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9hcmdzIik7CisgICAgZ2VuZXJhdGVfc3RydWN0X2RlY2xhcmF0aW9uKGZfaGVhZGVyXywgdHMsIGZhbHNlKTsKKyAgICBnZW5lcmF0ZV9zdHJ1Y3RfZGVmaW5pdGlvbihvdXQsIGZfc2VydmljZV8sIHRzLCBmYWxzZSk7CisgICAgZ2VuZXJhdGVfc3RydWN0X3JlYWRlcihvdXQsIHRzKTsKKyAgICBnZW5lcmF0ZV9zdHJ1Y3Rfd3JpdGVyKG91dCwgdHMpOworICAgIHRzLT5zZXRfbmFtZSh0c2VydmljZS0+Z2V0X25hbWUoKSArICJfIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcGFyZ3MiKTsKKyAgICBnZW5lcmF0ZV9zdHJ1Y3RfZGVjbGFyYXRpb24oZl9oZWFkZXJfLCB0cywgZmFsc2UsIHRydWUsIGZhbHNlLCB0cnVlKTsKKyAgICBnZW5lcmF0ZV9zdHJ1Y3RfZGVmaW5pdGlvbihvdXQsIGZfc2VydmljZV8sIHRzLCBmYWxzZSk7CisgICAgZ2VuZXJhdGVfc3RydWN0X3dyaXRlcihvdXQsIHRzLCB0cnVlKTsKKyAgICB0cy0+c2V0X25hbWUobmFtZV9vcmlnKTsKKworICAgIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModHNlcnZpY2UsICpmX2l0ZXIpOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBpbnRlcmZhY2UgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKKyAqLwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UsIHN0cmluZyBzdHlsZSkgeworCisgIHN0cmluZyBzZXJ2aWNlX2lmX25hbWUgPSBzZXJ2aWNlX25hbWVfICsgc3R5bGUgKyAiSWYiOworICBpZiAoc3R5bGUgPT0gIkNvYkNsIikgeworICAgIC8vIEZvcndhcmQgZGVjbGFyZSB0aGUgY2xpZW50LgorICAgIHN0cmluZyBjbGllbnRfbmFtZSA9IHNlcnZpY2VfbmFtZV8gKyAiQ29iQ2xpZW50IjsKKyAgICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKKyAgICAgIGNsaWVudF9uYW1lICs9ICJUIjsKKyAgICAgIHNlcnZpY2VfaWZfbmFtZSArPSAiVCI7CisgICAgICBpbmRlbnQoZl9oZWFkZXJfKSA8PCAidGVtcGxhdGUgPGNsYXNzIFByb3RvY29sXz4iIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudChmX2hlYWRlcl8pIDw8ICJjbGFzcyAiIDw8IGNsaWVudF9uYW1lIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSAiIDogdmlydHVhbCBwdWJsaWMgIiArIHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSkgKyBzdHlsZSArICJJZiI7CisgICAgaWYgKHN0eWxlID09ICJDb2JDbCIgJiYgZ2VuX3RlbXBsYXRlc18pIHsKKyAgICAgIC8vIFRPRE8oc2ltcGtpbnMpOiBJZiBnZW5fdGVtcGxhdGVzXyBpcyBlbmFibGVkLCB3ZSBjdXJyZW50bHkgYXNzdW1lIGFsbAorICAgICAgLy8gcGFyZW50IHNlcnZpY2VzIHdlcmUgYWxzbyBnZW5lcmF0ZWQgd2l0aCB0ZW1wbGF0ZXMgZW5hYmxlZC4KKyAgICAgIGV4dGVuZHMgKz0gIlQ8UHJvdG9jb2xfPiI7CisgICAgfQorICB9CisKKyAgaWYgKHN0eWxlID09ICJDb2JDbCIgJiYgZ2VuX3RlbXBsYXRlc18pIHsKKyAgICBmX2hlYWRlcl8gPDwgInRlbXBsYXRlIDxjbGFzcyBQcm90b2NvbF8+IiA8PCBlbmRsOworICB9CisgIGZfaGVhZGVyXyA8PCAiY2xhc3MgIiA8PCBzZXJ2aWNlX2lmX25hbWUgPDwgZXh0ZW5kcyA8PCAiIHsiIDw8IGVuZGwgPDwgIiBwdWJsaWM6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJ2aXJ0dWFsIH4iIDw8IHNlcnZpY2VfaWZfbmFtZSA8PCAiKCkge30iIDw8IGVuZGw7CisKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKCgqZl9pdGVyKS0+aGFzX2RvYygpKQorICAgICAgZl9oZWFkZXJfIDw8IGVuZGw7CisgICAgZ2VuZXJhdGVfamF2YV9kb2MoZl9oZWFkZXJfLCAqZl9pdGVyKTsKKyAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgInZpcnR1YWwgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlciwgc3R5bGUpIDw8ICIgPSAwOyIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bigpOworICBmX2hlYWRlcl8gPDwgIn07IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaWYgKHN0eWxlID09ICJDb2JDbCIgJiYgZ2VuX3RlbXBsYXRlc18pIHsKKyAgICAvLyBnZW5lcmF0ZSBhIGJhY2t3YXJkcy1jb21wYXRpYmxlIHR5cGVkZWYgZm9yIGNsaWVudHMgdGhhdCBkbyBub3QKKyAgICAvLyBrbm93IGFib3V0IHRoZSBuZXcgdGVtcGxhdGUtc3R5bGUgY29kZQorICAgIGZfaGVhZGVyXyA8PCAidHlwZWRlZiAiIDw8IHNlcnZpY2VfaWZfbmFtZSA8PCAiPCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiAiCisgICAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV8gPDwgc3R5bGUgPDwgIklmOyIgPDwgZW5kbCA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBpbnRlcmZhY2UgZmFjdG9yeS4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYW4gaW50ZXJmYWNlIGZhY3RvcnkgZm9yLgorICovCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2VfZmFjdG9yeSh0X3NlcnZpY2UqIHRzZXJ2aWNlLCBzdHJpbmcgc3R5bGUpIHsKKyAgc3RyaW5nIHNlcnZpY2VfaWZfbmFtZSA9IHNlcnZpY2VfbmFtZV8gKyBzdHlsZSArICJJZiI7CisKKyAgLy8gRmlndXJlIG91dCB0aGUgbmFtZSBvZiB0aGUgdXBwZXItbW9zdCBwYXJlbnQgY2xhc3MuCisgIC8vIEdldHRpbmcgZXZlcnl0aGluZyB0byB3b3JrIG91dCBwcm9wZXJseSB3aXRoIGluaGVyaXRhbmNlIGlzIGFubm95aW5nLgorICAvLyBIZXJlJ3Mgd2hhdCB3ZSdyZSBkb2luZyBmb3Igbm93OgorICAvLworICAvLyAtIEFsbCBoYW5kbGVycyBpbXBsZW1lbnQgZ2V0SGFuZGxlcigpLCBidXQgc3ViY2xhc3NlcyB1c2UgY292YXJpYW50IHJldHVybgorICAvLyAgIHR5cGVzIHRvIHJldHVybiB0aGVpciBzcGVjaWZpYyBzZXJ2aWNlIGludGVyZmFjZSBjbGFzcyB0eXBlLiAgV2UgaGF2ZSB0bworICAvLyAgIHVzZSByYXcgcG9pbnRlcnMgYmVjYXVzZSBvZiB0aGlzOyBzaGFyZWRfcHRyPD4gY2FuJ3QgYmUgdXNlZCBmb3IKKyAgLy8gICBjb3ZhcmlhbnQgcmV0dXJuIHR5cGVzLgorICAvLworICAvLyAtIFNpbmNlIHdlJ3JlIG5vdCB1c2luZyBzaGFyZWRfcHRyPD4sIHdlIGFsc28gcHJvdmlkZSBhIHJlbGVhc2VIYW5kbGVyKCkKKyAgLy8gICBmdW5jdGlvbiB0aGF0IG11c3QgYmUgY2FsbGVkIHRvIHJlbGVhc2UgYSBwb2ludGVyIHRvIGEgaGFuZGxlciBvYnRhaW5lZAorICAvLyAgIHZpYSBnZXRIYW5kbGVyKCkuCisgIC8vCisgIC8vICAgcmVsZWFzZUhhbmRsZXIoKSBhbHdheXMgYWNjZXB0cyBhIHBvaW50ZXIgdG8gdGhlIHVwcGVyLW1vc3QgcGFyZW50IGNsYXNzCisgIC8vICAgdHlwZS4gIFRoaXMgaXMgbmVjZXNzYXJ5IHNpbmNlIHRoZSBwYXJlbnQgdmVyc2lvbnMgb2YgcmVsZWFzZUhhbmRsZXIoKQorICAvLyAgIG1heSBhY2NlcHQgYW55IG9mIHRoZSBwYXJlbnQgdHlwZXMsIG5vdCBqdXN0IHRoZSBtb3N0IHNwZWNpZmljIHN1YmNsYXNzCisgIC8vICAgdHlwZS4gIEltcGxlbWVudGF0aW9ucyBjYW4gdXNlIGR5bmFtaWNfY2FzdCB0byBjYXN0IHRoZSBwb2ludGVyIHRvIHRoZQorICAvLyAgIHN1YmNsYXNzIHR5cGUgaWYgZGVzaXJlZC4KKyAgdF9zZXJ2aWNlKiBiYXNlX3NlcnZpY2UgPSB0c2VydmljZTsKKyAgd2hpbGUgKGJhc2Vfc2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgYmFzZV9zZXJ2aWNlID0gYmFzZV9zZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworICB9CisgIHN0cmluZyBiYXNlX2lmX25hbWUgPSB0eXBlX25hbWUoYmFzZV9zZXJ2aWNlKSArIHN0eWxlICsgIklmIjsKKworICAvLyBHZW5lcmF0ZSB0aGUgYWJzdHJhY3QgZmFjdG9yeSBjbGFzcworICBzdHJpbmcgZmFjdG9yeV9uYW1lID0gc2VydmljZV9pZl9uYW1lICsgIkZhY3RvcnkiOworICBzdHJpbmcgZXh0ZW5kczsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gIiA6IHZpcnR1YWwgcHVibGljICIgKyB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpICsgc3R5bGUgKyAiSWZGYWN0b3J5IjsKKyAgfQorCisgIGZfaGVhZGVyXyA8PCAiY2xhc3MgIiA8PCBmYWN0b3J5X25hbWUgPDwgZXh0ZW5kcyA8PCAiIHsiIDw8IGVuZGwgPDwgIiBwdWJsaWM6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJ0eXBlZGVmICIgPDwgc2VydmljZV9pZl9uYW1lIDw8ICIgSGFuZGxlcjsiIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgPDwgInZpcnR1YWwgfiIgPDwgZmFjdG9yeV9uYW1lIDw8ICIoKSB7fSIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ2aXJ0dWFsICIKKyAgICAgICAgICAgIDw8IHNlcnZpY2VfaWZfbmFtZSA8PCAiKiBnZXRIYW5kbGVyKCIKKyAgICAgICAgICAgIDw8ICJjb25zdCA6OmFwYWNoZTo6dGhyaWZ0OjpUQ29ubmVjdGlvbkluZm8mIGNvbm5JbmZvKSA9IDA7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICA8PCAidmlydHVhbCB2b2lkIHJlbGVhc2VIYW5kbGVyKCIgPDwgYmFzZV9pZl9uYW1lIDw8ICIqIC8qIGhhbmRsZXIgKi8pID0gMDsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9oZWFkZXJfIDw8ICJ9OyIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSBzaW5nbGV0b24gZmFjdG9yeSBjbGFzcworICBzdHJpbmcgc2luZ2xldG9uX2ZhY3RvcnlfbmFtZSA9IHNlcnZpY2VfaWZfbmFtZSArICJTaW5nbGV0b25GYWN0b3J5IjsKKyAgZl9oZWFkZXJfIDw8ICJjbGFzcyAiIDw8IHNpbmdsZXRvbl9mYWN0b3J5X25hbWUgPDwgIiA6IHZpcnR1YWwgcHVibGljICIgPDwgZmFjdG9yeV9uYW1lIDw8ICIgeyIKKyAgICAgICAgICAgIDw8IGVuZGwgPDwgIiBwdWJsaWM6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8IHNpbmdsZXRvbl9mYWN0b3J5X25hbWUgPDwgIihjb25zdCA6OnN0ZDo6c2hhcmVkX3B0cjwiIDw8IHNlcnZpY2VfaWZfbmFtZQorICAgICAgICAgICAgPDwgIj4mIGlmYWNlKSA6IGlmYWNlXyhpZmFjZSkge30iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInZpcnR1YWwgfiIKKyAgICAgICAgICAgIDw8IHNpbmdsZXRvbl9mYWN0b3J5X25hbWUgPDwgIigpIHt9IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInZpcnR1YWwgIgorICAgICAgICAgICAgPDwgc2VydmljZV9pZl9uYW1lIDw8ICIqIGdldEhhbmRsZXIoIgorICAgICAgICAgICAgPDwgImNvbnN0IDo6YXBhY2hlOjp0aHJpZnQ6OlRDb25uZWN0aW9uSW5mbyYpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgIDw8ICIgIHJldHVybiBpZmFjZV8uZ2V0KCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICA8PCAidmlydHVhbCB2b2lkIHJlbGVhc2VIYW5kbGVyKCIgPDwgYmFzZV9pZl9uYW1lIDw8ICIqIC8qIGhhbmRsZXIgKi8pIHt9IiA8PCBlbmRsOworCisgIGZfaGVhZGVyXyA8PCBlbmRsIDw8ICIgcHJvdGVjdGVkOiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiOjpzdGQ6OnNoYXJlZF9wdHI8IiA8PCBzZXJ2aWNlX2lmX25hbWUKKyAgICAgICAgICAgIDw8ICI+IGlmYWNlXzsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9oZWFkZXJfIDw8ICJ9OyIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIG51bGwgaW1wbGVtZW50YXRpb24gb2YgdGhlIHNlcnZpY2UuCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCisgKi8KK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX251bGwodF9zZXJ2aWNlKiB0c2VydmljZSwgc3RyaW5nIHN0eWxlKSB7CisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kcyA9ICIgLCB2aXJ0dWFsIHB1YmxpYyAiICsgdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKSArIHN0eWxlICsgIk51bGwiOworICB9CisgIGZfaGVhZGVyXyA8PCAiY2xhc3MgIiA8PCBzZXJ2aWNlX25hbWVfIDw8IHN0eWxlIDw8ICJOdWxsIDogdmlydHVhbCBwdWJsaWMgIiA8PCBzZXJ2aWNlX25hbWVfCisgICAgICAgICAgICA8PCBzdHlsZSA8PCAiSWYiIDw8IGV4dGVuZHMgPDwgIiB7IiA8PCBlbmRsIDw8ICIgcHVibGljOiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAidmlydHVhbCB+IiA8PCBzZXJ2aWNlX25hbWVfIDw8IHN0eWxlIDw8ICJOdWxsKCkge30iIDw8IGVuZGw7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlciwgc3R5bGUsICIiLCBmYWxzZSkgPDwgIiB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgdF90eXBlKiByZXR1cm50eXBlID0gKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpOworICAgIHRfZmllbGQgcmV0dXJuZmllbGQocmV0dXJudHlwZSwgIl9yZXR1cm4iKTsKKworICAgIGlmIChzdHlsZSA9PSAiIikgeworICAgICAgaWYgKHJldHVybnR5cGUtPmlzX3ZvaWQoKSB8fCBpc19jb21wbGV4X3R5cGUocmV0dXJudHlwZSkpIHsKKyAgICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8IGRlY2xhcmVfZmllbGQoJnJldHVybmZpZWxkLCB0cnVlKSA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgICA8PCAicmV0dXJuIF9yZXR1cm47IiA8PCBlbmRsOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoc3R5bGUgPT0gIkNvYlN2IikgeworICAgICAgaWYgKHJldHVybnR5cGUtPmlzX3ZvaWQoKSkgeworICAgICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgInJldHVybiBjb2IoKTsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICB0X2ZpZWxkIHJldHVybmZpZWxkKHJldHVybnR5cGUsICJfcmV0dXJuIik7CisgICAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCBkZWNsYXJlX2ZpZWxkKCZyZXR1cm5maWVsZCwgdHJ1ZSkgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICAgPDwgInJldHVybiBjb2IoX3JldHVybik7IiA8PCBlbmRsOworICAgICAgfQorCisgICAgfSBlbHNlIHsKKyAgICAgIHRocm93ICJVTktOT1dOIFNUWUxFIjsKKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bigpOworICBmX2hlYWRlcl8gPDwgIn07IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9mdW5jdGlvbl9jYWxsKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgYXJnX3ByZWZpeCkgeworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgdF90eXBlKiByZXRfdHlwZSA9IGdldF90cnVlX3R5cGUodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKTsKKyAgb3V0IDw8IGluZGVudCgpOworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXJldF90eXBlLT5pc192b2lkKCkpIHsKKyAgICBpZiAoaXNfY29tcGxleF90eXBlKHJldF90eXBlKSkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIG91dCA8PCBpZmFjZSA8PCAiLT4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCIgPDwgdGFyZ2V0OworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgdGFyZ2V0IDw8ICIgPSAiIDw8IGlmYWNlIDw8ICItPiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIjsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgb3V0IDw8IGlmYWNlIDw8ICItPiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIjsKKyAgfQorICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8ICIsICI7CisgICAgfQorICAgIG91dCA8PCBhcmdfcHJlZml4IDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgfQorICBvdXQgPDwgIik7IiA8PCBlbmRsOworfQorCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9hc3luY19za2VsZXRvbih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBzdmNuYW1lID0gdHNlcnZpY2UtPmdldF9uYW1lKCk7CisKKyAgLy8gU2VydmljZSBpbXBsZW1lbnRhdGlvbiBmaWxlIGluY2x1ZGVzCisgIHN0cmluZyBmX3NrZWxldG9uX25hbWUgPSBnZXRfb3V0X2RpcigpICsgc3ZjbmFtZSArICJfYXN5bmNfc2VydmVyLnNrZWxldG9uLmNwcCI7CisKKyAgc3RyaW5nIG5zID0gbmFtZXNwYWNlX3ByZWZpeCh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWVzcGFjZSgiY3BwIikpOworCisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9za2VsZXRvbjsKKyAgZl9za2VsZXRvbi5vcGVuKGZfc2tlbGV0b25fbmFtZS5jX3N0cigpKTsKKyAgZl9za2VsZXRvbiA8PCAiLy8gVGhpcyBhdXRvZ2VuZXJhdGVkIHNrZWxldG9uIGZpbGUgaWxsdXN0cmF0ZXMgb25lIHdheSB0byBhZGFwdCBhIHN5bmNocm9ub3VzIgorICAgICAgICAgICAgIDw8IGVuZGwgPDwgIi8vIGludGVyZmFjZSBpbnRvIGFuIGFzeW5jaHJvbm91cyBpbnRlcmZhY2UuIFlvdSBzaG91bGQgY29weSBpdCB0byBhbm90aGVyIgorICAgICAgICAgICAgIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAiLy8gZmlsZW5hbWUgdG8gYXZvaWQgb3ZlcndyaXRpbmcgaXQgYW5kIHJld3JpdGUgYXMgYXN5bmNocm9ub3VzIGFueSBmdW5jdGlvbnMiCisgICAgICAgICAgICAgPDwgZW5kbCA8PCAiLy8gdGhhdCB3b3VsZCBvdGhlcndpc2UgaW50cm9kdWNlIHVud2FudGVkIGxhdGVuY3kuIiA8PCBlbmRsIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAiI2luY2x1ZGUgXCIiIDw8IGdldF9pbmNsdWRlX3ByZWZpeCgqZ2V0X3Byb2dyYW0oKSkgPDwgc3ZjbmFtZSA8PCAiLmhcIiIgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICIjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPiIgPDwgZW5kbCA8PCBlbmRsCisgICAgICAgICAgICAgPDwgInVzaW5nIG5hbWVzcGFjZSA6OmFwYWNoZTo6dGhyaWZ0OyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICJ1c2luZyBuYW1lc3BhY2UgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgInVzaW5nIG5hbWVzcGFjZSA6OmFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgInVzaW5nIG5hbWVzcGFjZSA6OmFwYWNoZTo6dGhyaWZ0Ojphc3luYzsiIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyB0aGUgZm9sbG93aW5nIGNvZGUgd291bGQgbm90IGNvbXBpbGU6CisgIC8vIHVzaW5nIG5hbWVzcGFjZSA7CisgIC8vIHVzaW5nIG5hbWVzcGFjZSA6OjsKKyAgaWYgKCghbnMuZW1wdHkoKSkgJiYgKG5zLmNvbXBhcmUoIiA6OiIpICE9IDApKSB7CisgICAgZl9za2VsZXRvbiA8PCAidXNpbmcgbmFtZXNwYWNlICIgPDwgc3RyaW5nKG5zLCAwLCBucy5zaXplKCkgLSAyKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworICB9CisKKyAgZl9za2VsZXRvbiA8PCAiY2xhc3MgIiA8PCBzdmNuYW1lIDw8ICJBc3luY0hhbmRsZXIgOiAiCisgICAgICAgICAgICAgPDwgInB1YmxpYyAiIDw8IHN2Y25hbWUgPDwgIkNvYlN2SWYgeyIgPDwgZW5kbCA8PCAiIHB1YmxpYzoiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX3NrZWxldG9uIDw8IGluZGVudCgpIDw8IHN2Y25hbWUgPDwgIkFzeW5jSGFuZGxlcigpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAiICBzeW5jSGFuZGxlcl8gPSBzdGQ6OmF1dG9fcHRyPCIgPDwgc3ZjbmFtZSA8PCAiSGFuZGxlcj4obmV3ICIgPDwgc3ZjbmFtZQorICAgICAgICAgICAgIDw8ICJIYW5kbGVyKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgLy8gWW91ciBpbml0aWFsaXphdGlvbiBnb2VzIGhlcmUiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgZl9za2VsZXRvbiA8PCBpbmRlbnQoKSA8PCAidmlydHVhbCB+IiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJBc3luY0hhbmRsZXIoKTsiIDw8IGVuZGw7CisKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZl9za2VsZXRvbiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCAiQ29iU3YiLCAiIiwgdHJ1ZSkgPDwgIiB7IgorICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIHRfdHlwZSogcmV0dXJudHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKTsKKyAgICB0X2ZpZWxkIHJldHVybmZpZWxkKHJldHVybnR5cGUsICJfcmV0dXJuIik7CisKKyAgICBzdHJpbmcgdGFyZ2V0ID0gcmV0dXJudHlwZS0+aXNfdm9pZCgpID8gIiIgOiAiX3JldHVybiI7CisgICAgaWYgKCFyZXR1cm50eXBlLT5pc192b2lkKCkpIHsKKyAgICAgIGZfc2tlbGV0b24gPDwgaW5kZW50KCkgPDwgZGVjbGFyZV9maWVsZCgmcmV0dXJuZmllbGQsIHRydWUpIDw8IGVuZGw7CisgICAgfQorICAgIGdlbmVyYXRlX2Z1bmN0aW9uX2NhbGwoZl9za2VsZXRvbiwgKmZfaXRlciwgdGFyZ2V0LCAic3luY0hhbmRsZXJfIiwgIiIpOworICAgIGZfc2tlbGV0b24gPDwgaW5kZW50KCkgPDwgInJldHVybiBjb2IoIiA8PCB0YXJnZXQgPDwgIik7IiA8PCBlbmRsOworCisgICAgc2NvcGVfZG93bihmX3NrZWxldG9uKTsKKyAgfQorICBmX3NrZWxldG9uIDw8IGVuZGwgPDwgIiBwcm90ZWN0ZWQ6IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJzdGQ6OmF1dG9fcHRyPCIgPDwgc3ZjbmFtZQorICAgICAgICAgICAgIDw8ICJIYW5kbGVyPiBzeW5jSGFuZGxlcl87IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX3NrZWxldG9uIDw8ICJ9OyIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIG11bHRpZmFjZSwgd2hpY2ggaXMgYSBzaW5nbGUgc2VydmVyIHRoYXQganVzdCB0YWtlcyBhIHNldAorICogb2Ygb2JqZWN0cyBpbXBsZW1lbnRpbmcgdGhlIGludGVyZmFjZSBhbmQgY2FsbHMgdGhlbSBhbGwsIHJldHVybmluZyB0aGUKKyAqIHZhbHVlIG9mIHRoZSBsYXN0IG9uZSB0byBiZSBjYWxsZWQuCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgbXVsdGlzZXJ2ZXIgZm9yLgorICovCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9tdWx0aWZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICAvLyBHZW5lcmF0ZSB0aGUgZGlzcGF0Y2ggbWV0aG9kcworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19tdWx0aWZhY2UgPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICBleHRlbmRzX211bHRpZmFjZSA9ICIsIHB1YmxpYyAiICsgZXh0ZW5kcyArICJNdWx0aWZhY2UiOworICB9CisKKyAgc3RyaW5nIGxpc3RfdHlwZSA9IHN0cmluZygic3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPCIpICsgc2VydmljZV9uYW1lXyArICJJZj4gPiI7CisKKyAgLy8gR2VuZXJhdGUgdGhlIGhlYWRlciBwb3J0aW9uCisgIGZfaGVhZGVyXyA8PCAiY2xhc3MgIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJNdWx0aWZhY2UgOiAiCisgICAgICAgICAgICA8PCAidmlydHVhbCBwdWJsaWMgIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZiIgPDwgZXh0ZW5kc19tdWx0aWZhY2UgPDwgIiB7IiA8PCBlbmRsCisgICAgICAgICAgICA8PCAiIHB1YmxpYzoiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgc2VydmljZV9uYW1lXyA8PCAiTXVsdGlmYWNlKCIgPDwgbGlzdF90eXBlCisgICAgICAgICAgICA8PCAiJiBpZmFjZXMpIDogaWZhY2VzXyhpZmFjZXMpIHsiIDw8IGVuZGw7CisgIGlmICghZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpCisgICAgICAgICAgICAgIDw8ICIgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjwiICsgc2VydmljZV9uYW1lXyArICJJZj4gPjo6aXRlcmF0b3IgaXRlcjsiCisgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgZm9yIChpdGVyID0gaWZhY2VzLmJlZ2luKCk7IGl0ZXIgIT0gaWZhY2VzLmVuZCgpOyArK2l0ZXIpIHsiCisgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgICAiIDw8IGV4dGVuZHMgPDwgIk11bHRpZmFjZTo6YWRkKCppdGVyKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgfSIgPDwgZW5kbDsKKyAgfQorICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInZpcnR1YWwgfiIgPDwgc2VydmljZV9uYW1lXworICAgICAgICAgICAgPDwgIk11bHRpZmFjZSgpIHt9IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworCisgIC8vIFByb3RlY3RlZCBkYXRhIG1lbWJlcnMKKyAgZl9oZWFkZXJfIDw8ICIgcHJvdGVjdGVkOiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCBsaXN0X3R5cGUgPDwgIiBpZmFjZXNfOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBzZXJ2aWNlX25hbWVfCisgICAgICAgICAgICA8PCAiTXVsdGlmYWNlKCkge30iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInZvaWQgYWRkKDo6c3RkOjpzaGFyZWRfcHRyPCIKKyAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmPiBpZmFjZSkgeyIgPDwgZW5kbDsKKyAgaWYgKCFleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgIiAgIiA8PCBleHRlbmRzIDw8ICJNdWx0aWZhY2U6OmFkZChpZmFjZSk7IiA8PCBlbmRsOworICB9CisgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAiICBpZmFjZXNfLnB1c2hfYmFjayhpZmFjZSk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworCisgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAiIHB1YmxpYzoiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9zdHJ1Y3QqIGFyZ2xpc3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgYXJncyA9IGFyZ2xpc3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgYV9pdGVyOworCisgICAgc3RyaW5nIGNhbGwgPSBzdHJpbmcoImlmYWNlc19baV0tPiIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIigiOworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGlmIChpc19jb21wbGV4X3R5cGUoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpKSkgeworICAgICAgY2FsbCArPSAiX3JldHVybiI7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0KKyAgICBmb3IgKGFfaXRlciA9IGFyZ3MuYmVnaW4oKTsgYV9pdGVyICE9IGFyZ3MuZW5kKCk7ICsrYV9pdGVyKSB7CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNhbGwgKz0gIiwgIjsKKyAgICAgIH0KKyAgICAgIGNhbGwgKz0gKCphX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIH0KKyAgICBjYWxsICs9ICIpIjsKKworICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlciwgIiIpIDw8ICIgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgInNpemVfdCBzeiA9IGlmYWNlc18uc2l6ZSgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAic2l6ZV90IGkgPSAwOyIKKyAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiZm9yICg7IGkgPCAoc3ogLSAxKTsgKytpKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCBjYWxsIDw8ICI7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgaWYgKGlzX2NvbXBsZXhfdHlwZSgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCkpKSB7CisgICAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCBjYWxsIDw8ICI7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gIiA8PCBjYWxsIDw8ICI7IiA8PCBlbmRsOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgY2FsbCA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJ9OyIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KKyAqLwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UsIHN0cmluZyBzdHlsZSkgeworICBzdHJpbmcgaWZzdHlsZTsKKyAgaWYgKHN0eWxlID09ICJDb2IiKSB7CisgICAgaWZzdHlsZSA9ICJDb2JDbCI7CisgIH0KKworICBzdGQ6Om9zdHJlYW0mIG91dCA9IChnZW5fdGVtcGxhdGVzXyA/IGZfc2VydmljZV90Y2NfIDogZl9zZXJ2aWNlXyk7CisgIHN0cmluZyB0ZW1wbGF0ZV9oZWFkZXIsIHRlbXBsYXRlX3N1ZmZpeCwgc2hvcnRfc3VmZml4LCBwcm90b2NvbF90eXBlLCBfdGhpczsKKyAgc3RyaW5nIGNvbnN0IHByb3RfZmFjdG9yeV90eXBlID0gIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5IjsKKyAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7CisgICAgdGVtcGxhdGVfaGVhZGVyID0gInRlbXBsYXRlIDxjbGFzcyBQcm90b2NvbF8+XG4iOworICAgIHNob3J0X3N1ZmZpeCA9ICJUIjsKKyAgICB0ZW1wbGF0ZV9zdWZmaXggPSAiVDxQcm90b2NvbF8+IjsKKyAgICBwcm90b2NvbF90eXBlID0gIlByb3RvY29sXyI7CisgICAgX3RoaXMgPSAidGhpcy0+IjsKKyAgfSBlbHNlIHsKKyAgICBwcm90b2NvbF90eXBlID0gIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wiOworICB9CisgIHN0cmluZyBwcm90X3B0ciA9ICJzdGQ6OnNoYXJlZF9wdHI8ICIgKyBwcm90b2NvbF90eXBlICsgIj4iOworICBzdHJpbmcgY2xpZW50X3N1ZmZpeCA9ICJDbGllbnQiICsgdGVtcGxhdGVfc3VmZml4OworICBzdHJpbmcgaWZfc3VmZml4ID0gIklmIjsKKyAgaWYgKHN0eWxlID09ICJDb2IiKSB7CisgICAgaWZfc3VmZml4ICs9IHRlbXBsYXRlX3N1ZmZpeDsKKyAgfQorCisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX2NsaWVudCA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIC8vIFRPRE8oc2ltcGtpbnMpOiBJZiBnZW5fdGVtcGxhdGVzXyBpcyBlbmFibGVkLCB3ZSBjdXJyZW50bHkgYXNzdW1lIGFsbAorICAgIC8vIHBhcmVudCBzZXJ2aWNlcyB3ZXJlIGFsc28gZ2VuZXJhdGVkIHdpdGggdGVtcGxhdGVzIGVuYWJsZWQuCisgICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7CisgICAgZXh0ZW5kc19jbGllbnQgPSAiLCBwdWJsaWMgIiArIGV4dGVuZHMgKyBzdHlsZSArIGNsaWVudF9zdWZmaXg7CisgIH0KKworICAvLyBHZW5lcmF0ZSB0aGUgaGVhZGVyIHBvcnRpb24KKyAgaWYgKHN0eWxlID09ICJDb25jdXJyZW50IikgeworICAgIGZfaGVhZGVyXyA8PCAiLy8gVGhlIFwnY29uY3VycmVudFwnIGNsaWVudCBpcyBhIHRocmVhZCBzYWZlIGNsaWVudCB0aGF0IGNvcnJlY3RseSBoYW5kbGVzXG4iCisgICAgICAgICAgICAgICAgICIvLyBvdXQgb2Ygb3JkZXIgcmVzcG9uc2VzLiAgSXQgaXMgc2xvd2VyIHRoYW4gdGhlIHJlZ3VsYXIgY2xpZW50LCBzbyBzaG91bGRcbiIKKyAgICAgICAgICAgICAgICAgIi8vIG9ubHkgYmUgdXNlZCB3aGVuIHlvdSBuZWVkIHRvIHNoYXJlIGEgY29ubmVjdGlvbiBhbW9uZyBtdWx0aXBsZSB0aHJlYWRzXG4iOworICB9CisgIGZfaGVhZGVyXyA8PCB0ZW1wbGF0ZV9oZWFkZXIgPDwgImNsYXNzICIgPDwgc2VydmljZV9uYW1lXyA8PCBzdHlsZSA8PCAiQ2xpZW50IiA8PCBzaG9ydF9zdWZmaXgKKyAgICAgICAgICAgIDw8ICIgOiAiCisgICAgICAgICAgICA8PCAidmlydHVhbCBwdWJsaWMgIiA8PCBzZXJ2aWNlX25hbWVfIDw8IGlmc3R5bGUgPDwgaWZfc3VmZml4IDw8IGV4dGVuZHNfY2xpZW50IDw8ICIgeyIKKyAgICAgICAgICAgIDw8IGVuZGwgPDwgIiBwdWJsaWM6IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworICBpZiAoc3R5bGUgIT0gIkNvYiIpIHsKKyAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgc2VydmljZV9uYW1lXyA8PCBzdHlsZSA8PCAiQ2xpZW50IiA8PCBzaG9ydF9zdWZmaXggPDwgIigiIDw8IHByb3RfcHRyCisgICAgICAgICAgICAgIDw8ICIgcHJvdCkgIjsKKworICAgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKKyAgICAgIGZfaGVhZGVyXyA8PCAieyIgPDwgZW5kbDsKKyAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAiICBzZXRQcm90b2NvbCIgPDwgc2hvcnRfc3VmZml4IDw8ICIocHJvdCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgPDwgIn0iIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfaGVhZGVyXyA8PCAiOiIgPDwgZW5kbDsKKyAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAiICAiIDw8IGV4dGVuZHMgPDwgc3R5bGUgPDwgY2xpZW50X3N1ZmZpeCA8PCAiKHByb3QsIHByb3QpIHt9IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfQorCisgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8IHNlcnZpY2VfbmFtZV8gPDwgc3R5bGUgPDwgIkNsaWVudCIgPDwgc2hvcnRfc3VmZml4IDw8ICIoIiA8PCBwcm90X3B0cgorICAgICAgICAgICAgICA8PCAiIGlwcm90LCAiIDw8IHByb3RfcHRyIDw8ICIgb3Byb3QpICI7CisgICAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgeworICAgICAgZl9oZWFkZXJfIDw8ICJ7IiA8PCBlbmRsOworICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICIgIHNldFByb3RvY29sIiA8PCBzaG9ydF9zdWZmaXggPDwgIihpcHJvdCxvcHJvdCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfaGVhZGVyXyA8PCAiOiIgPDwgaW5kZW50KCkgPDwgIiAgIiA8PCBleHRlbmRzIDw8IHN0eWxlIDw8IGNsaWVudF9zdWZmaXgKKyAgICAgICAgICAgICAgICA8PCAiKGlwcm90LCBvcHJvdCkge30iIDw8IGVuZGw7CisgICAgfQorCisgICAgLy8gY3JlYXRlIHRoZSBzZXRQcm90b2NvbCBtZXRob2RzCisgICAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgeworICAgICAgZl9oZWFkZXJfIDw8ICIgcHJpdmF0ZToiIDw8IGVuZGw7CisgICAgICAvLyAxOiBvbmUgcGFyYW1ldGVyCisgICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgInZvaWQgc2V0UHJvdG9jb2wiIDw8IHNob3J0X3N1ZmZpeCA8PCAiKCIgPDwgcHJvdF9wdHIgPDwgIiBwcm90KSB7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgInNldFByb3RvY29sIiA8PCBzaG9ydF9zdWZmaXggPDwgIihwcm90LHByb3QpOyIgPDwgZW5kbDsKKyAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIC8vIDI6IHR3byBwYXJhbWV0ZXIKKyAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAidm9pZCBzZXRQcm90b2NvbCIgPDwgc2hvcnRfc3VmZml4IDw8ICIoIiA8PCBwcm90X3B0ciA8PCAiIGlwcm90LCAiCisgICAgICAgICAgICAgICAgPDwgcHJvdF9wdHIgPDwgIiBvcHJvdCkgeyIgPDwgZW5kbDsKKworICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICIgIHBpcHJvdF89aXByb3Q7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHBvcHJvdF89b3Byb3Q7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgaXByb3RfID0gaXByb3QuZ2V0KCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgPDwgIiAgb3Byb3RfID0gb3Byb3QuZ2V0KCk7IiA8PCBlbmRsOworCisgICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICBmX2hlYWRlcl8gPDwgIiBwdWJsaWM6IiA8PCBlbmRsOworICAgIH0KKworICAgIC8vIEdlbmVyYXRlIGdldHRlcnMgZm9yIHRoZSBwcm90b2NvbHMuCisgICAgLy8gTm90ZSB0aGF0IHRoZXNlIGFyZSBub3QgY3VycmVudGx5IHRlbXBsYXRlZCBmb3Igc2ltcGxpY2l0eS4KKyAgICAvLyBUT0RPKHNpbXBraW5zKTogc2hvdWxkIHRoZXkgYmUgdGVtcGxhdGVkPworICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICA8PCAic3RkOjpzaGFyZWRfcHRyPCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBnZXRJbnB1dFByb3RvY29sKCkgeyIKKyAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBfdGhpcyA8PCAicGlwcm90XzsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iCisgICAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgPDwgInN0ZDo6c2hhcmVkX3B0cjwgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gZ2V0T3V0cHV0UHJvdG9jb2woKSB7IgorICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IF90aGlzIDw8ICJwb3Byb3RfOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIKKyAgICAgICAgICAgICAgPDwgZW5kbDsKKworICB9IGVsc2UgLyogaWYgKHN0eWxlID09ICJDb2IiKSAqLyB7CisgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8IHNlcnZpY2VfbmFtZV8gPDwgc3R5bGUgPDwgIkNsaWVudCIgPDwgc2hvcnRfc3VmZml4IDw8ICIoIgorICAgICAgICAgICAgICA8PCAic3RkOjpzaGFyZWRfcHRyPCA6OmFwYWNoZTo6dGhyaWZ0Ojphc3luYzo6VEFzeW5jQ2hhbm5lbD4gY2hhbm5lbCwgIgorICAgICAgICAgICAgICA8PCAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3RvcnkqIHByb3RvY29sRmFjdG9yeSkgOiIgPDwgZW5kbDsKKyAgICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgIiAgY2hhbm5lbF8oY2hhbm5lbCksIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgPDwgIiAgaXRyYW5zXyhuZXcgOjphcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyKCkpLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIG90cmFuc18obmV3IDo6YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlcigpKSwiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIGlmIChnZW5fdGVtcGxhdGVzXykgeworICAgICAgICAvLyBUUHJvdG9jb2xGYWN0b3J5IGNsYXNzZXMgcmV0dXJuIGdlbmVyaWMgVFByb3RvY29sIHBvaW50ZXJzLgorICAgICAgICAvLyBXZSBoYXZlIHRvIGR5bmFtaWMgY2FzdCB0byB0aGUgUHJvdG9jb2xfIHR5cGUgd2UgYXJlIGV4cGVjdGluZy4KKyAgICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICIgIHBpcHJvdF8oOjpzdGQ6OmR5bmFtaWNfcG9pbnRlcl9jYXN0PFByb3RvY29sXz4oIgorICAgICAgICAgICAgICAgICAgPDwgInByb3RvY29sRmFjdG9yeS0+Z2V0UHJvdG9jb2woaXRyYW5zXykpKSwiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgIDw8ICIgIHBvcHJvdF8oOjpzdGQ6OmR5bmFtaWNfcG9pbnRlcl9jYXN0PFByb3RvY29sXz4oIgorICAgICAgICAgICAgICAgICAgPDwgInByb3RvY29sRmFjdG9yeS0+Z2V0UHJvdG9jb2wob3RyYW5zXykpKSB7IiA8PCBlbmRsOworICAgICAgICAvLyBUaHJvdyBhIFRFeGNlcHRpb24gaWYgZWl0aGVyIGR5bmFtaWMgY2FzdCBmYWlsZWQuCisgICAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAiICBpZiAoIXBpcHJvdF8gfHwgIXBvcHJvdF8pIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgIDw8ICIgICAgdGhyb3cgOjphcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbihcIiIKKyAgICAgICAgICAgICAgICAgIDw8ICJUUHJvdG9jb2xGYWN0b3J5IHJldHVybmVkIHVuZXhwZWN0ZWQgcHJvdG9jb2wgdHlwZSBpbiAiIDw8IHNlcnZpY2VfbmFtZV8KKyAgICAgICAgICAgICAgICAgIDw8IHN0eWxlIDw8ICJDbGllbnQiIDw8IHNob3J0X3N1ZmZpeCA8PCAiIGNvbnN0cnVjdG9yXCIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICAgPDwgIiAgfSIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAiICBwaXByb3RfKHByb3RvY29sRmFjdG9yeS0+Z2V0UHJvdG9jb2woaXRyYW5zXykpLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgcG9wcm90Xyhwcm90b2NvbEZhY3RvcnktPmdldFByb3RvY29sKG90cmFuc18pKSB7IiA8PCBlbmRsOworICAgICAgfQorICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICIgIGlwcm90XyA9IHBpcHJvdF8uZ2V0KCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgPDwgIiAgb3Byb3RfID0gcG9wcm90Xy5nZXQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAiICAiIDw8IGV4dGVuZHMgPDwgc3R5bGUgPDwgY2xpZW50X3N1ZmZpeAorICAgICAgICAgICAgICAgIDw8ICIoY2hhbm5lbCwgcHJvdG9jb2xGYWN0b3J5KSB7fSIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBpZiAoc3R5bGUgPT0gIkNvYiIpIHsKKyAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgPDwgIjo6c3RkOjpzaGFyZWRfcHRyPCA6OmFwYWNoZTo6dGhyaWZ0Ojphc3luYzo6VEFzeW5jQ2hhbm5lbD4gZ2V0Q2hhbm5lbCgpIHsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgX3RoaXMgPDwgImNoYW5uZWxfOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICBpZiAoIWdlbl9ub19jbGllbnRfY29tcGxldGlvbl8pIHsKKyAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAidmlydHVhbCB2b2lkIGNvbXBsZXRlZF9fKGJvb2wgLyogc3VjY2VzcyAqLykge30iIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaW5kZW50KGZfaGVhZGVyXykgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIsIGlmc3R5bGUpIDw8ICI7IiA8PCBlbmRsOworICAgIC8vIFRPRE8oZHJlaXNzKTogVXNlIHByaXZhdGUgaW5oZXJpdGFuY2UgdG8gYXZvaWQgZ2VuZXJhdGluZyB0aGlzZSBpbiBjb2Itc3R5bGUuCisgICAgaWYgKHN0eWxlID09ICJDb25jdXJyZW50IiAmJiAhKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgLy8gY29uY3VycmVudCBjbGllbnRzIG5lZWQgdG8gbW92ZSB0aGUgc2VxaWQgZnJvbSB0aGUgc2VuZCBmdW5jdGlvbiB0byB0aGUKKyAgICAgIC8vIHJlY3YgZnVuY3Rpb24uICBPbmV3YXkgbWV0aG9kcyBkb24ndCBoYXZlIGEgcmVjdiBmdW5jdGlvbiwgc28gd2UgZG9uJ3QgbmVlZCB0bworICAgICAgLy8gbW92ZSB0aGUgc2VxaWQgZm9yIHRoZW0uICBBdHRlbXB0aW5nIHRvIGRvIHNvIHdvdWxkIHJlc3VsdCBpbiBhIHNlcWlkIGxlYWsuCisgICAgICB0X2Z1bmN0aW9uIHNlbmRfZnVuY3Rpb24oZ190eXBlX2kzMiwgLypyZXR1cm5pbmcgc2VxaWQqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygic2VuZF8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF9hcmdsaXN0KCkpOworICAgICAgaW5kZW50KGZfaGVhZGVyXykgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZzZW5kX2Z1bmN0aW9uLCAiIikgPDwgIjsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIHRfZnVuY3Rpb24gc2VuZF9mdW5jdGlvbihnX3R5cGVfdm9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInNlbmRfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpKTsKKyAgICAgIGluZGVudChmX2hlYWRlcl8pIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmc2VuZF9mdW5jdGlvbiwgIiIpIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGlmIChzdHlsZSA9PSAiQ29uY3VycmVudCIpIHsKKyAgICAgICAgdF9maWVsZCBzZXFJZEFyZyhnX3R5cGVfaTMyLCAic2VxaWQiKTsKKyAgICAgICAgdF9zdHJ1Y3Qgc2VxSWRBcmdTdHJ1Y3QocHJvZ3JhbV8pOworICAgICAgICBzZXFJZEFyZ1N0cnVjdC5hcHBlbmQoJnNlcUlkQXJnKTsKKyAgICAgICAgdF9mdW5jdGlvbiByZWN2X2Z1bmN0aW9uKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygicmVjdl8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXFJZEFyZ1N0cnVjdCk7CisgICAgICAgIGluZGVudChmX2hlYWRlcl8pIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmcmVjdl9mdW5jdGlvbiwgIiIpIDw8ICI7IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdF9zdHJ1Y3Qgbm9hcmdzKHByb2dyYW1fKTsKKyAgICAgICAgdF9mdW5jdGlvbiByZWN2X2Z1bmN0aW9uKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygicmVjdl8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZub2FyZ3MpOworICAgICAgICBpbmRlbnQoZl9oZWFkZXJfKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnJlY3ZfZnVuY3Rpb24sICIiKSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKworICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl9oZWFkZXJfIDw8ICIgcHJvdGVjdGVkOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGlmIChzdHlsZSA9PSAiQ29iIikgeworICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgPDwgIjo6c3RkOjpzaGFyZWRfcHRyPCA6OmFwYWNoZTo6dGhyaWZ0Ojphc3luYzo6VEFzeW5jQ2hhbm5lbD4gY2hhbm5lbF87IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICA8PCAiOjpzdGQ6OnNoYXJlZF9wdHI8IDo6YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlcj4gaXRyYW5zXzsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgIDw8ICI6OnN0ZDo6c2hhcmVkX3B0cjwgOjphcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyPiBvdHJhbnNfOyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIH0KKyAgICBmX2hlYWRlcl8gPDwKKyAgICAgIGluZGVudCgpIDw8IHByb3RfcHRyIDw8ICIgcGlwcm90XzsiIDw8IGVuZGwgPDwKKyAgICAgIGluZGVudCgpIDw8IHByb3RfcHRyIDw8ICIgcG9wcm90XzsiIDw8IGVuZGwgPDwKKyAgICAgIGluZGVudCgpIDw8IHByb3RvY29sX3R5cGUgPDwgIiogaXByb3RfOyIgPDwgZW5kbCA8PAorICAgICAgaW5kZW50KCkgPDwgcHJvdG9jb2xfdHlwZSA8PCAiKiBvcHJvdF87IiA8PCBlbmRsOworCisgICAgaWYgKHN0eWxlID09ICJDb25jdXJyZW50IikgeworICAgICAgZl9oZWFkZXJfIDw8CisgICAgICAgIGluZGVudCgpIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojphc3luYzo6VENvbmN1cnJlbnRDbGllbnRTeW5jSW5mbyBzeW5jXzsiPDxlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgZl9oZWFkZXJfIDw8ICJ9OyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGlmIChnZW5fdGVtcGxhdGVzXykgeworICAgIC8vIE91dHB1dCBhIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHR5cGVkZWYgdXNpbmcKKyAgICAvLyBUUHJvdG9jb2wgYXMgdGhlIHRlbXBsYXRlIHBhcmFtZXRlci4KKyAgICBmX2hlYWRlcl8gPDwgInR5cGVkZWYgIiA8PCBzZXJ2aWNlX25hbWVfIDw8IHN0eWxlCisgICAgICAgICAgICAgIDw8ICJDbGllbnRUPCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgc3R5bGUKKyAgICAgICAgICAgICAgPDwgIkNsaWVudDsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIHN0cmluZyBzY29wZSA9IHNlcnZpY2VfbmFtZV8gKyBzdHlsZSArIGNsaWVudF9zdWZmaXggKyAiOjoiOworCisgIC8vIEdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgc3RyaW5nIHNlcUlkQ2FwdHVyZTsKKyAgICBzdHJpbmcgc2VxSWRVc2U7CisgICAgc3RyaW5nIHNlcUlkQ29tbWFVc2U7CisgICAgaWYgKHN0eWxlID09ICJDb25jdXJyZW50IiAmJiAhKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgc2VxSWRDYXB0dXJlID0gImludDMyX3Qgc2VxaWQgPSAiOworICAgICAgc2VxSWRVc2UgPSAic2VxaWQiOworICAgICAgc2VxSWRDb21tYVVzZSA9ICIsIHNlcWlkIjsKKyAgICB9CisKKyAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKworICAgIC8vIE9wZW4gZnVuY3Rpb24KKyAgICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKKyAgICAgIGluZGVudChvdXQpIDw8IHRlbXBsYXRlX2hlYWRlcjsKKyAgICB9CisgICAgaW5kZW50KG91dCkgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIsIGlmc3R5bGUsIHNjb3BlKSA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgaW5kZW50KG91dCkgPDwgc2VxSWRDYXB0dXJlIDw8ICJzZW5kXyIgPDwgZnVubmFtZSA8PCAiKCI7CisKKyAgICAvLyBHZXQgdGhlIHN0cnVjdCBvZiBmdW5jdGlvbiBjYWxsIHBhcmFtcworICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworCisgICAgLy8gRGVjbGFyZSB0aGUgZnVuY3Rpb24gYXJndW1lbnRzCisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgIiwgIjsKKyAgICAgIH0KKyAgICAgIG91dCA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICB9CisgICAgb3V0IDw8ICIpOyIgPDwgZW5kbDsKKworICAgIGlmIChzdHlsZSAhPSAiQ29iIikgeworICAgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKTsKKyAgICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICAgIGlmIChpc19jb21wbGV4X3R5cGUoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpKSkgeworICAgICAgICAgICAgb3V0IDw8ICJyZWN2XyIgPDwgZnVubmFtZSA8PCAiKF9yZXR1cm4iIDw8IHNlcUlkQ29tbWFVc2UgPDwgIik7IiA8PCBlbmRsOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvdXQgPDwgInJldHVybiByZWN2XyIgPDwgZnVubmFtZSA8PCAiKCIgPDwgc2VxSWRVc2UgPDwgIik7IiA8PCBlbmRsOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgPDwgInJlY3ZfIiA8PCBmdW5uYW1lIDw8ICIoIiA8PCBzZXFJZFVzZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCBfdGhpcyA8PCAiY2hhbm5lbF8tPnNlbmRBbmRSZWN2TWVzc2FnZSgiCisgICAgICAgICAgICA8PCAiOjpzdGQ6OmJpbmQoY29iLCB0aGlzKSwgIiA8PCBfdGhpcyA8PCAib3RyYW5zXy5nZXQoKSwgIiA8PCBfdGhpcyA8PCAiaXRyYW5zXy5nZXQoKSk7IgorICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCBfdGhpcyA8PCAiY2hhbm5lbF8tPnNlbmRNZXNzYWdlKCIKKyAgICAgICAgICAgIDw8ICI6OnN0ZDo6YmluZChjb2IsIHRoaXMpLCAiIDw8IF90aGlzIDw8ICJvdHJhbnNfLmdldCgpKTsiIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIC8vIGlmIChzdHlsZSAhPSAiQ29iIikgLy8gVE9ETyhkcmVpc3MpOiBMaWJpZnkgdGhlIGNsaWVudCBhbmQgZG9uJ3QgZ2VuZXJhdGUgdGhpcyBmb3IgY29iLXN0eWxlCisgICAgaWYgKHRydWUpIHsKKyAgICAgIHRfdHlwZSogc2VuZF9mdW5jX3JldHVybl90eXBlID0gZ190eXBlX3ZvaWQ7CisgICAgICBpZiAoc3R5bGUgPT0gIkNvbmN1cnJlbnQiICYmICEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICAgIHNlbmRfZnVuY19yZXR1cm5fdHlwZSA9IGdfdHlwZV9pMzI7CisgICAgICB9CisgICAgICAvLyBGdW5jdGlvbiBmb3Igc2VuZGluZworICAgICAgdF9mdW5jdGlvbiBzZW5kX2Z1bmN0aW9uKHNlbmRfZnVuY19yZXR1cm5fdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInNlbmRfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpKTsKKworICAgICAgLy8gT3BlbiB0aGUgc2VuZCBmdW5jdGlvbgorICAgICAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8IHRlbXBsYXRlX2hlYWRlcjsKKyAgICAgIH0KKyAgICAgIGluZGVudChvdXQpIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmc2VuZF9mdW5jdGlvbiwgIiIsIHNjb3BlKSA8PCBlbmRsOworICAgICAgc2NvcGVfdXAob3V0KTsKKworICAgICAgLy8gRnVuY3Rpb24gYXJndW1lbnRzIGFuZCByZXN1bHRzCisgICAgICBzdHJpbmcgYXJnc25hbWUgPSB0c2VydmljZS0+Z2V0X25hbWUoKSArICJfIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcGFyZ3MiOworICAgICAgc3RyaW5nIHJlc3VsdG5hbWUgPSB0c2VydmljZS0+Z2V0X25hbWUoKSArICJfIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcHJlc3VsdCI7CisKKyAgICAgIHN0cmluZyBjc2VxaWRWYWwgPSAiMCI7CisgICAgICBpZiAoc3R5bGUgPT0gIkNvbmN1cnJlbnQiKSB7CisgICAgICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgICAgIGNzZXFpZFZhbCA9ICJ0aGlzLT5zeW5jXy5nZW5lcmF0ZVNlcUlkKCkiOworICAgICAgICB9CisgICAgICB9CisgICAgICAvLyBTZXJpYWxpemUgdGhlIHJlcXVlc3QKKyAgICAgIG91dCA8PAorICAgICAgICBpbmRlbnQoKSA8PCAiaW50MzJfdCBjc2VxaWQgPSAiIDw8IGNzZXFpZFZhbCA8PCAiOyIgPDwgZW5kbDsKKyAgICAgIGlmKHN0eWxlID09ICJDb25jdXJyZW50IikgeworICAgICAgICBvdXQgPDwKKyAgICAgICAgICBpbmRlbnQoKSA8PCAiOjphcGFjaGU6OnRocmlmdDo6YXN5bmM6OlRDb25jdXJyZW50U2VuZFNlbnRyeSBzZW50cnkoJnRoaXMtPnN5bmNfKTsiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBpZiAoc3R5bGUgPT0gIkNvYiIpIHsKKyAgICAgICAgb3V0IDw8CisgICAgICAgICAgaW5kZW50KCkgPDwgX3RoaXMgPDwgIm90cmFuc18tPnJlc2V0QnVmZmVyKCk7IiA8PCBlbmRsOworICAgICAgfQorICAgICAgb3V0IDw8CisgICAgICAgIGluZGVudCgpIDw8IF90aGlzIDw8ICJvcHJvdF8tPndyaXRlTWVzc2FnZUJlZ2luKFwiIiA8PAorICAgICAgICAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwKKyAgICAgICAgIlwiLCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6IiA8PCAoKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSA/ICJUX09ORVdBWSIgOiAiVF9DQUxMIikgPDwKKyAgICAgICAgIiwgY3NlcWlkKTsiIDw8IGVuZGwgPDwgZW5kbCA8PAorICAgICAgICBpbmRlbnQoKSA8PCBhcmdzbmFtZSA8PCAiIGFyZ3M7IiA8PCBlbmRsOworCisgICAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImFyZ3MuIiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gJiIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgIDw8ICI7IiA8PCBlbmRsOworICAgICAgfQorCisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImFyZ3Mud3JpdGUoIiA8PCBfdGhpcyA8PCAib3Byb3RfKTsiIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBfdGhpcworICAgICAgICAgIDw8ICJvcHJvdF8tPndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBfdGhpcworICAgICAgICAgIDw8ICJvcHJvdF8tPmdldFRyYW5zcG9ydCgpLT53cml0ZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBfdGhpcworICAgICAgICAgIDw8ICJvcHJvdF8tPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOyIgPDwgZW5kbDsKKworICAgICAgaWYgKHN0eWxlID09ICJDb25jdXJyZW50IikgeworICAgICAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAic2VudHJ5LmNvbW1pdCgpOyIgPDwgZW5kbDsKKworICAgICAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBjc2VxaWQ7IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICB9CisgICAgICBzY29wZV9kb3duKG91dCk7CisgICAgICBvdXQgPDwgZW5kbDsKKworICAgICAgLy8gR2VuZXJhdGUgcmVjdiBmdW5jdGlvbiBvbmx5IGlmIG5vdCBhbiBvbmV3YXkgZnVuY3Rpb24KKyAgICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgICB0X3N0cnVjdCBub2FyZ3MocHJvZ3JhbV8pOworCisgICAgICAgIHRfZmllbGQgc2VxSWRBcmcoZ190eXBlX2kzMiwgInNlcWlkIik7CisgICAgICAgIHRfc3RydWN0IHNlcUlkQXJnU3RydWN0KHByb2dyYW1fKTsKKyAgICAgICAgc2VxSWRBcmdTdHJ1Y3QuYXBwZW5kKCZzZXFJZEFyZyk7CisKKyAgICAgICAgdF9zdHJ1Y3QqIHJlY3ZfZnVuY3Rpb25fYXJncyA9ICZub2FyZ3M7CisgICAgICAgIGlmIChzdHlsZSA9PSAiQ29uY3VycmVudCIpIHsKKyAgICAgICAgICByZWN2X2Z1bmN0aW9uX2FyZ3MgPSAmc2VxSWRBcmdTdHJ1Y3Q7CisgICAgICAgIH0KKworICAgICAgICB0X2Z1bmN0aW9uIHJlY3ZfZnVuY3Rpb24oKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJyZWN2XyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdl9mdW5jdGlvbl9hcmdzKTsKKyAgICAgICAgLy8gT3BlbiB0aGUgcmVjdiBmdW5jdGlvbgorICAgICAgICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCB0ZW1wbGF0ZV9oZWFkZXI7CisgICAgICAgIH0KKyAgICAgICAgaW5kZW50KG91dCkgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZyZWN2X2Z1bmN0aW9uLCAiIiwgc2NvcGUpIDw8IGVuZGw7CisgICAgICAgIHNjb3BlX3VwKG91dCk7CisKKyAgICAgICAgb3V0IDw8IGVuZGwgPDwKKyAgICAgICAgICBpbmRlbnQoKSA8PCAiaW50MzJfdCByc2VxaWQgPSAwOyIgPDwgZW5kbCA8PAorICAgICAgICAgIGluZGVudCgpIDw8ICJzdGQ6OnN0cmluZyBmbmFtZTsiIDw8IGVuZGwgPDwKKyAgICAgICAgICBpbmRlbnQoKSA8PCAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRNZXNzYWdlVHlwZSBtdHlwZTsiIDw8IGVuZGw7CisgICAgICAgIGlmKHN0eWxlID09ICJDb25jdXJyZW50IikgeworICAgICAgICAgIG91dCA8PAorICAgICAgICAgICAgZW5kbCA8PAorICAgICAgICAgICAgaW5kZW50KCkgPDwgIi8vIHRoZSByZWFkIG11dGV4IGdldHMgZHJvcHBlZCBhbmQgcmVhY3F1aXJlZCBhcyBwYXJ0IG9mIHdhaXRGb3JXb3JrKCkiIDw8IGVuZGwgPDwKKyAgICAgICAgICAgIGluZGVudCgpIDw8ICIvLyBUaGUgZGVzdHJ1Y3RvciBvZiB0aGlzIHNlbnRyeSB3YWtlcyB1cCBvdGhlciBjbGllbnRzIiA8PCBlbmRsIDw8CisgICAgICAgICAgICBpbmRlbnQoKSA8PCAiOjphcGFjaGU6OnRocmlmdDo6YXN5bmM6OlRDb25jdXJyZW50UmVjdlNlbnRyeSBzZW50cnkoJnRoaXMtPnN5bmNfLCBzZXFpZCk7IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIGlmIChzdHlsZSA9PSAiQ29iIiAmJiAhZ2VuX25vX2NsaWVudF9jb21wbGV0aW9uXykgeworICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYm9vbCBjb21wbGV0ZWQgPSBmYWxzZTsiIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAidHJ5IHsiOworICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICB9CisgICAgICAgIG91dCA8PCBlbmRsOworICAgICAgICBpZiAoc3R5bGUgPT0gIkNvbmN1cnJlbnQiKSB7CisgICAgICAgICAgb3V0IDw8CisgICAgICAgICAgICBpbmRlbnQoKSA8PCAid2hpbGUodHJ1ZSkgeyIgPDwgZW5kbCA8PAorICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgaWYoIXRoaXMtPnN5bmNfLmdldFBlbmRpbmcoZm5hbWUsIG10eXBlLCByc2VxaWQpKSB7IiA8PCBlbmRsOworICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICB9CisgICAgICAgIG91dCA8PAorICAgICAgICAgIGluZGVudCgpIDw8IF90aGlzIDw8ICJpcHJvdF8tPnJlYWRNZXNzYWdlQmVnaW4oZm5hbWUsIG10eXBlLCByc2VxaWQpOyIgPDwgZW5kbDsKKyAgICAgICAgaWYgKHN0eWxlID09ICJDb25jdXJyZW50IikgeworICAgICAgICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmKHNlcWlkID09IHJzZXFpZCkgeyIgPDwgZW5kbDsKKyAgICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgfQorICAgICAgICBvdXQgPDwKKyAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKG10eXBlID09IDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0VYQ0VQVElPTikgeyIgPDwgZW5kbCA8PAorICAgICAgICAgIGluZGVudCgpIDw8ICIgIDo6YXBhY2hlOjp0aHJpZnQ6OlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB4OyIgPDwgZW5kbCA8PAorICAgICAgICAgIGluZGVudCgpIDw8ICIgIHgucmVhZCgiIDw8IF90aGlzIDw8ICJpcHJvdF8pOyIgPDwgZW5kbCA8PAorICAgICAgICAgIGluZGVudCgpIDw8ICIgICIgPDwgX3RoaXMgPDwgImlwcm90Xy0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKKyAgICAgICAgICBpbmRlbnQoKSA8PCAiICAiIDw8IF90aGlzIDw8ICJpcHJvdF8tPmdldFRyYW5zcG9ydCgpLT5yZWFkRW5kKCk7IiA8PCBlbmRsOworICAgICAgICBpZiAoc3R5bGUgPT0gIkNvYiIgJiYgIWdlbl9ub19jbGllbnRfY29tcGxldGlvbl8pIHsKKyAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgY29tcGxldGVkID0gdHJ1ZTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgY29tcGxldGVkX18odHJ1ZSk7IgorICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIGlmIChzdHlsZSA9PSAiQ29uY3VycmVudCIpIHsKKyAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgc2VudHJ5LmNvbW1pdCgpOyIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBvdXQgPDwKKyAgICAgICAgICBpbmRlbnQoKSA8PCAiICB0aHJvdyB4OyIgPDwgZW5kbCA8PAorICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8CisgICAgICAgICAgaW5kZW50KCkgPDwgImlmIChtdHlwZSAhPSA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9SRVBMWSkgeyIgPDwgZW5kbCA8PAorICAgICAgICAgIGluZGVudCgpIDw8ICIgICIgPDwgX3RoaXMgPDwgImlwcm90Xy0+c2tpcCgiIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9TVFJVQ1QpOyIgPDwgZW5kbCA8PAorICAgICAgICAgIGluZGVudCgpIDw8ICIgICIgPDwgX3RoaXMgPDwgImlwcm90Xy0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKKyAgICAgICAgICBpbmRlbnQoKSA8PCAiICAiIDw8IF90aGlzIDw8ICJpcHJvdF8tPmdldFRyYW5zcG9ydCgpLT5yZWFkRW5kKCk7IiA8PCBlbmRsOworICAgICAgICBpZiAoc3R5bGUgPT0gIkNvYiIgJiYgIWdlbl9ub19jbGllbnRfY29tcGxldGlvbl8pIHsKKyAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgY29tcGxldGVkID0gdHJ1ZTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgY29tcGxldGVkX18oZmFsc2UpOyIKKyAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBvdXQgPDwKKyAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAorICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAoZm5hbWUuY29tcGFyZShcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIikgIT0gMCkgeyIgPDwgZW5kbCA8PAorICAgICAgICAgIGluZGVudCgpIDw8ICIgICIgPDwgX3RoaXMgPDwgImlwcm90Xy0+c2tpcCgiIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9TVFJVQ1QpOyIgPDwgZW5kbCA8PAorICAgICAgICAgIGluZGVudCgpIDw8ICIgICIgPDwgX3RoaXMgPDwgImlwcm90Xy0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKKyAgICAgICAgICBpbmRlbnQoKSA8PCAiICAiIDw8IF90aGlzIDw8ICJpcHJvdF8tPmdldFRyYW5zcG9ydCgpLT5yZWFkRW5kKCk7IiA8PCBlbmRsOworICAgICAgICBpZiAoc3R5bGUgPT0gIkNvYiIgJiYgIWdlbl9ub19jbGllbnRfY29tcGxldGlvbl8pIHsKKyAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgY29tcGxldGVkID0gdHJ1ZTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgY29tcGxldGVkX18oZmFsc2UpOyIKKyAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3R5bGUgPT0gIkNvbmN1cnJlbnQiKSB7CisgICAgICAgICAgb3V0IDw8IGVuZGwgPDwKKyAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIC8vIGluIGEgYmFkIHN0YXRlLCBkb24ndCBjb21taXQiIDw8IGVuZGwgPDwKKyAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIHVzaW5nIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xFeGNlcHRpb247IiA8PCBlbmRsIDw8CisgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEpOyIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKQorICAgICAgICAgICAgJiYgIWlzX2NvbXBsZXhfdHlwZSgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCkpKSB7CisgICAgICAgICAgdF9maWVsZCByZXR1cm5maWVsZCgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksICJfcmV0dXJuIik7CisgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8IGRlY2xhcmVfZmllbGQoJnJldHVybmZpZWxkKSA8PCBlbmRsOworICAgICAgICB9CisKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8IHJlc3VsdG5hbWUgPDwgIiByZXN1bHQ7IiA8PCBlbmRsOworCisgICAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJlc3VsdC5zdWNjZXNzID0gJl9yZXR1cm47IiA8PCBlbmRsOworICAgICAgICB9CisKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXN1bHQucmVhZCgiIDw8IF90aGlzIDw8ICJpcHJvdF8pOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBfdGhpcworICAgICAgICAgICAgPDwgImlwcm90Xy0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgX3RoaXMKKyAgICAgICAgICAgIDw8ICJpcHJvdF8tPmdldFRyYW5zcG9ydCgpLT5yZWFkRW5kKCk7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAgICAgLy8gQ2FyZWZ1bCwgb25seSBsb29rIGZvciBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KKyAgICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICAgIGlmIChpc19jb21wbGV4X3R5cGUoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpKSkgeworICAgICAgICAgICAgb3V0IDw8CisgICAgICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAocmVzdWx0Ll9faXNzZXQuc3VjY2VzcykgeyIgPDwgZW5kbDsKKyAgICAgICAgICAgIG91dCA8PAorICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICAvLyBfcmV0dXJuIHBvaW50ZXIgaGFzIG5vdyBiZWVuIGZpbGxlZCIgPDwgZW5kbDsKKyAgICAgICAgICAgIGlmIChzdHlsZSA9PSAiQ29iIiAmJiAhZ2VuX25vX2NsaWVudF9jb21wbGV0aW9uXykgeworICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgY29tcGxldGVkID0gdHJ1ZTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgY29tcGxldGVkX18odHJ1ZSk7IgorICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdHlsZSA9PSAiQ29uY3VycmVudCIpIHsKKyAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHNlbnRyeS5jb21taXQoKTsiIDw8IGVuZGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXQgPDwKKyAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuOyIgPDwgZW5kbCA8PAorICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAocmVzdWx0Ll9faXNzZXQuc3VjY2VzcykgeyIgPDwgZW5kbDsKKyAgICAgICAgICAgIGlmIChzdHlsZSA9PSAiQ29iIiAmJiAhZ2VuX25vX2NsaWVudF9jb21wbGV0aW9uXykgeworICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgY29tcGxldGVkID0gdHJ1ZTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgY29tcGxldGVkX18odHJ1ZSk7IgorICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdHlsZSA9PSAiQ29uY3VycmVudCIpIHsKKyAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHNlbnRyeS5jb21taXQoKTsiIDw8IGVuZGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIF9yZXR1cm47IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOworICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICAgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgICAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAocmVzdWx0Ll9faXNzZXQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIikgeyIgPDwgZW5kbDsKKyAgICAgICAgICBpZiAoc3R5bGUgPT0gIkNvYiIgJiYgIWdlbl9ub19jbGllbnRfY29tcGxldGlvbl8pIHsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBjb21wbGV0ZWQgPSB0cnVlOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBjb21wbGV0ZWRfXyh0cnVlKTsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHN0eWxlID09ICJDb25jdXJyZW50IikgeworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHNlbnRyeS5jb21taXQoKTsiIDw8IGVuZGw7CisgICAgICAgICAgfQorICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICB0aHJvdyByZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgIH0KKworICAgICAgICAvLyBXZSBvbmx5IGdldCBoZXJlIGlmIHdlIGFyZSBhIHZvaWQgZnVuY3Rpb24KKyAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgICAgaWYgKHN0eWxlID09ICJDb2IiICYmICFnZW5fbm9fY2xpZW50X2NvbXBsZXRpb25fKSB7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImNvbXBsZXRlZCA9IHRydWU7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJjb21wbGV0ZWRfXyh0cnVlKTsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHN0eWxlID09ICJDb25jdXJyZW50IikgeworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJzZW50cnkuY29tbWl0KCk7IiA8PCBlbmRsOworICAgICAgICAgIH0KKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAoc3R5bGUgPT0gIkNvYiIgJiYgIWdlbl9ub19jbGllbnRfY29tcGxldGlvbl8pIHsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiY29tcGxldGVkID0gdHJ1ZTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImNvbXBsZXRlZF9fKHRydWUpOyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoc3R5bGUgPT0gIkNvbmN1cnJlbnQiKSB7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIi8vIGluIGEgYmFkIHN0YXRlLCBkb24ndCBjb21taXQiIDw8IGVuZGw7CisgICAgICAgICAgfQorICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGhyb3cgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOjphcGFjaGU6OnRocmlmdDo6VEFwcGxpY2F0aW9uRXhjZXB0aW9uKDo6YXBhY2hlOjp0aHJpZnQ6OiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6TUlTU0lOR19SRVNVTFQsIFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgPDwgIiBmYWlsZWQ6IHVua25vd24gcmVzdWx0XCIpOyIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3R5bGUgPT0gIkNvbmN1cnJlbnQiKSB7CisgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICAgIG91dCA8PAorICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgfSIgPDwgZW5kbCA8PAorICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgLy8gc2VxaWQgIT0gcnNlcWlkIiA8PCBlbmRsIDw8CisgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICB0aGlzLT5zeW5jXy51cGRhdGVQZW5kaW5nKGZuYW1lLCBtdHlwZSwgcnNlcWlkKTsiIDw8IGVuZGwgPDwKKyAgICAgICAgICAgIGVuZGwgPDwKKyAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIC8vIHRoaXMgd2lsbCB0ZW1wb3JhcmlseSB1bmxvY2sgdGhlIHJlYWRNdXRleCwgYW5kIGxldCBvdGhlciBjbGllbnRzIGdldCB3b3JrIGRvbmUiIDw8IGVuZGwgPDwKKyAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIHRoaXMtPnN5bmNfLndhaXRGb3JXb3JrKHNlcWlkKTsiIDw8IGVuZGwgPDwKKyAgICAgICAgICAgIGluZGVudCgpIDw8ICJ9IC8vIGVuZCB3aGlsZSh0cnVlKSIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3R5bGUgPT0gIkNvYiIgJiYgIWdlbl9ub19jbGllbnRfY29tcGxldGlvbl8pIHsKKyAgICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSBjYXRjaCAoLi4uKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIGlmICghY29tcGxldGVkKSB7IiA8PCBlbmRsCisgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgICAgY29tcGxldGVkX18oZmFsc2UpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsCisgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIHRocm93OyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICAvLyBDbG9zZSBmdW5jdGlvbgorICAgICAgICBzY29wZV9kb3duKG91dCk7CisgICAgICAgIG91dCA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgfQorfQorCitjbGFzcyBQcm9jZXNzb3JHZW5lcmF0b3IgeworcHVibGljOgorICBQcm9jZXNzb3JHZW5lcmF0b3IodF9jcHBfZ2VuZXJhdG9yKiBnZW5lcmF0b3IsIHRfc2VydmljZSogc2VydmljZSwgY29uc3Qgc3RyaW5nJiBzdHlsZSk7CisKKyAgdm9pZCBydW4oKSB7CisgICAgZ2VuZXJhdGVfY2xhc3NfZGVmaW5pdGlvbigpOworCisgICAgLy8gR2VuZXJhdGUgdGhlIGRpc3BhdGNoQ2FsbCgpIGZ1bmN0aW9uCisgICAgZ2VuZXJhdGVfZGlzcGF0Y2hfY2FsbChmYWxzZSk7CisgICAgaWYgKGdlbmVyYXRvcl8tPmdlbl90ZW1wbGF0ZXNfKSB7CisgICAgICBnZW5lcmF0ZV9kaXNwYXRjaF9jYWxsKHRydWUpOworICAgIH0KKworICAgIC8vIEdlbmVyYXRlIGFsbCBvZiB0aGUgcHJvY2VzcyBzdWJmdW5jdGlvbnMKKyAgICBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9ucygpOworCisgICAgZ2VuZXJhdGVfZmFjdG9yeSgpOworICB9CisKKyAgdm9pZCBnZW5lcmF0ZV9jbGFzc19kZWZpbml0aW9uKCk7CisgIHZvaWQgZ2VuZXJhdGVfZGlzcGF0Y2hfY2FsbChib29sIHRlbXBsYXRlX3Byb3RvY29sKTsKKyAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9ucygpOworICB2b2lkIGdlbmVyYXRlX2ZhY3RvcnkoKTsKKworcHJvdGVjdGVkOgorICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBpbl90eXBlZGVmID0gZmFsc2UsIGJvb2wgYXJnID0gZmFsc2UpIHsKKyAgICByZXR1cm4gZ2VuZXJhdG9yXy0+dHlwZV9uYW1lKHR0eXBlLCBpbl90eXBlZGVmLCBhcmcpOworICB9CisKKyAgc3RkOjpzdHJpbmcgaW5kZW50KCkgeyByZXR1cm4gZ2VuZXJhdG9yXy0+aW5kZW50KCk7IH0KKyAgc3RkOjpvc3RyZWFtJiBpbmRlbnQoc3RkOjpvc3RyZWFtJiBvcykgeyByZXR1cm4gZ2VuZXJhdG9yXy0+aW5kZW50KG9zKTsgfQorCisgIHZvaWQgaW5kZW50X3VwKCkgeyBnZW5lcmF0b3JfLT5pbmRlbnRfdXAoKTsgfQorICB2b2lkIGluZGVudF9kb3duKCkgeyBnZW5lcmF0b3JfLT5pbmRlbnRfZG93bigpOyB9CisKKyAgdF9jcHBfZ2VuZXJhdG9yKiBnZW5lcmF0b3JfOworICB0X3NlcnZpY2UqIHNlcnZpY2VfOworICBzdGQ6Om9zdHJlYW0mIGZfaGVhZGVyXzsKKyAgc3RkOjpvc3RyZWFtJiBmX291dF87CisgIHN0cmluZyBzZXJ2aWNlX25hbWVfOworICBzdHJpbmcgc3R5bGVfOworICBzdHJpbmcgcHN0eWxlXzsKKyAgc3RyaW5nIGNsYXNzX25hbWVfOworICBzdHJpbmcgaWZfbmFtZV87CisgIHN0cmluZyBmYWN0b3J5X2NsYXNzX25hbWVfOworICBzdHJpbmcgZmluaXNoX2NvYl87CisgIHN0cmluZyBmaW5pc2hfY29iX2RlY2xfOworICBzdHJpbmcgcmV0X3R5cGVfOworICBzdHJpbmcgY2FsbF9jb250ZXh0XzsKKyAgc3RyaW5nIGNvYl9hcmdfOworICBzdHJpbmcgY2FsbF9jb250ZXh0X2FyZ187CisgIHN0cmluZyBjYWxsX2NvbnRleHRfZGVjbF87CisgIHN0cmluZyB0ZW1wbGF0ZV9oZWFkZXJfOworICBzdHJpbmcgdGVtcGxhdGVfc3VmZml4XzsKKyAgc3RyaW5nIHR5cGVuYW1lX3N0cl87CisgIHN0cmluZyBjbGFzc19zdWZmaXhfOworICBzdHJpbmcgZXh0ZW5kc187Cit9OworCitQcm9jZXNzb3JHZW5lcmF0b3I6OlByb2Nlc3NvckdlbmVyYXRvcih0X2NwcF9nZW5lcmF0b3IqIGdlbmVyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2VydmljZSogc2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgc3R5bGUpCisgIDogZ2VuZXJhdG9yXyhnZW5lcmF0b3IpLAorICAgIHNlcnZpY2VfKHNlcnZpY2UpLAorICAgIGZfaGVhZGVyXyhnZW5lcmF0b3ItPmZfaGVhZGVyXyksCisgICAgZl9vdXRfKGdlbmVyYXRvci0+Z2VuX3RlbXBsYXRlc18gPyBnZW5lcmF0b3ItPmZfc2VydmljZV90Y2NfIDogZ2VuZXJhdG9yLT5mX3NlcnZpY2VfKSwKKyAgICBzZXJ2aWNlX25hbWVfKGdlbmVyYXRvci0+c2VydmljZV9uYW1lXyksCisgICAgc3R5bGVfKHN0eWxlKSB7CisgIGlmIChzdHlsZV8gPT0gIkNvYiIpIHsKKyAgICBwc3R5bGVfID0gIkFzeW5jIjsKKyAgICBjbGFzc19uYW1lXyA9IHNlcnZpY2VfbmFtZV8gKyBwc3R5bGVfICsgIlByb2Nlc3NvciI7CisgICAgaWZfbmFtZV8gPSBzZXJ2aWNlX25hbWVfICsgIkNvYlN2SWYiOworCisgICAgZmluaXNoX2NvYl8gPSAiOjpzdGQ6OmZ1bmN0aW9uPHZvaWQoYm9vbCBvayk+IGNvYiwgIjsKKyAgICBmaW5pc2hfY29iX2RlY2xfID0gIjo6c3RkOjpmdW5jdGlvbjx2b2lkKGJvb2wgb2spPiwgIjsKKyAgICBjb2JfYXJnXyA9ICJjb2IsICI7CisgICAgcmV0X3R5cGVfID0gInZvaWQgIjsKKyAgfSBlbHNlIHsKKyAgICBjbGFzc19uYW1lXyA9IHNlcnZpY2VfbmFtZV8gKyAiUHJvY2Vzc29yIjsKKyAgICBpZl9uYW1lXyA9IHNlcnZpY2VfbmFtZV8gKyAiSWYiOworCisgICAgcmV0X3R5cGVfID0gImJvb2wgIjsKKyAgICAvLyBUT0RPKGVkaGFsbCkgY2FsbENvbnRleHQgc2hvdWxkIGV2ZW50dWFsbHkgYmUgYWRkZWQgdG8gVEFzeW5jUHJvY2Vzc29yCisgICAgY2FsbF9jb250ZXh0XyA9ICIsIHZvaWQqIGNhbGxDb250ZXh0IjsKKyAgICBjYWxsX2NvbnRleHRfYXJnXyA9ICIsIGNhbGxDb250ZXh0IjsKKyAgICBjYWxsX2NvbnRleHRfZGVjbF8gPSAiLCB2b2lkKiI7CisgIH0KKworICBmYWN0b3J5X2NsYXNzX25hbWVfID0gY2xhc3NfbmFtZV8gKyAiRmFjdG9yeSI7CisKKyAgaWYgKGdlbmVyYXRvci0+Z2VuX3RlbXBsYXRlc18pIHsKKyAgICB0ZW1wbGF0ZV9oZWFkZXJfID0gInRlbXBsYXRlIDxjbGFzcyBQcm90b2NvbF8+XG4iOworICAgIHRlbXBsYXRlX3N1ZmZpeF8gPSAiPFByb3RvY29sXz4iOworICAgIHR5cGVuYW1lX3N0cl8gPSAidHlwZW5hbWUgIjsKKyAgICBjbGFzc19uYW1lXyArPSAiVCI7CisgICAgZmFjdG9yeV9jbGFzc19uYW1lXyArPSAiVCI7CisgIH0KKworICBpZiAoc2VydmljZV8tPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHNfID0gdHlwZV9uYW1lKHNlcnZpY2VfLT5nZXRfZXh0ZW5kcygpKSArIHBzdHlsZV8gKyAiUHJvY2Vzc29yIjsKKyAgICBpZiAoZ2VuZXJhdG9yXy0+Z2VuX3RlbXBsYXRlc18pIHsKKyAgICAgIC8vIFRPRE8oc2ltcGtpbnMpOiBJZiBnZW5fdGVtcGxhdGVzXyBpcyBlbmFibGVkLCB3ZSBjdXJyZW50bHkgYXNzdW1lIGFsbAorICAgICAgLy8gcGFyZW50IHNlcnZpY2VzIHdlcmUgYWxzbyBnZW5lcmF0ZWQgd2l0aCB0ZW1wbGF0ZXMgZW5hYmxlZC4KKyAgICAgIGV4dGVuZHNfICs9ICJUPFByb3RvY29sXz4iOworICAgIH0KKyAgfQorfQorCit2b2lkIFByb2Nlc3NvckdlbmVyYXRvcjo6Z2VuZXJhdGVfY2xhc3NfZGVmaW5pdGlvbigpIHsKKyAgLy8gR2VuZXJhdGUgdGhlIGRpc3BhdGNoIG1ldGhvZHMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSBzZXJ2aWNlXy0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgc3RyaW5nIHBhcmVudF9jbGFzczsKKyAgaWYgKHNlcnZpY2VfLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBwYXJlbnRfY2xhc3MgPSBleHRlbmRzXzsKKyAgfSBlbHNlIHsKKyAgICBpZiAoc3R5bGVfID09ICJDb2IiKSB7CisgICAgICBwYXJlbnRfY2xhc3MgPSAiOjphcGFjaGU6OnRocmlmdDo6YXN5bmM6OlRBc3luY0Rpc3BhdGNoUHJvY2Vzc29yIjsKKyAgICB9IGVsc2UgeworICAgICAgcGFyZW50X2NsYXNzID0gIjo6YXBhY2hlOjp0aHJpZnQ6OlREaXNwYXRjaFByb2Nlc3NvciI7CisgICAgfQorCisgICAgaWYgKGdlbmVyYXRvcl8tPmdlbl90ZW1wbGF0ZXNfKSB7CisgICAgICBwYXJlbnRfY2xhc3MgKz0gIlQ8UHJvdG9jb2xfPiI7CisgICAgfQorICB9CisKKyAgLy8gR2VuZXJhdGUgdGhlIGhlYWRlciBwb3J0aW9uCisgIGZfaGVhZGVyXyA8PCB0ZW1wbGF0ZV9oZWFkZXJfIDw8ICJjbGFzcyAiIDw8IGNsYXNzX25hbWVfIDw8ICIgOiBwdWJsaWMgIiA8PCBwYXJlbnRfY2xhc3MgPDwgIiB7IgorICAgICAgICAgICAgPDwgZW5kbDsKKworICAvLyBQcm90ZWN0ZWQgZGF0YSBtZW1iZXJzCisgIGZfaGVhZGVyXyA8PCAiIHByb3RlY3RlZDoiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgIjo6c3RkOjpzaGFyZWRfcHRyPCIgPDwgaWZfbmFtZV8gPDwgIj4gaWZhY2VfOyIgPDwgZW5kbDsKKyAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJ2aXJ0dWFsICIgPDwgcmV0X3R5cGVfIDw8ICJkaXNwYXRjaENhbGwoIiA8PCBmaW5pc2hfY29iXworICAgICAgICAgICAgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIGlwcm90LCAiCisgICAgICAgICAgICA8PCAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCogb3Byb3QsICIKKyAgICAgICAgICAgIDw8ICJjb25zdCBzdGQ6OnN0cmluZyYgZm5hbWUsIGludDMyX3Qgc2VxaWQiIDw8IGNhbGxfY29udGV4dF8gPDwgIik7IiA8PCBlbmRsOworICBpZiAoZ2VuZXJhdG9yXy0+Z2VuX3RlbXBsYXRlc18pIHsKKyAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgInZpcnR1YWwgIiA8PCByZXRfdHlwZV8gPDwgImRpc3BhdGNoQ2FsbFRlbXBsYXRlZCgiIDw8IGZpbmlzaF9jb2JfCisgICAgICAgICAgICAgIDw8ICJQcm90b2NvbF8qIGlwcm90LCBQcm90b2NvbF8qIG9wcm90LCAiCisgICAgICAgICAgICAgIDw8ICJjb25zdCBzdGQ6OnN0cmluZyYgZm5hbWUsIGludDMyX3Qgc2VxaWQiIDw8IGNhbGxfY29udGV4dF8gPDwgIik7IiA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7CisKKyAgLy8gUHJvY2VzcyBmdW5jdGlvbiBkZWNsYXJhdGlvbnMKKyAgZl9oZWFkZXJfIDw8ICIgcHJpdmF0ZToiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIC8vIERlY2xhcmUgcHJvY2Vzc01hcF8KKyAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJ0eXBlZGVmICB2b2lkICgiIDw8IGNsYXNzX25hbWVfIDw8ICI6OioiCisgICAgICAgICAgICA8PCAiUHJvY2Vzc0Z1bmN0aW9uKSgiIDw8IGZpbmlzaF9jb2JfZGVjbF8gPDwgImludDMyX3QsICIKKyAgICAgICAgICAgIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiwgIgorICAgICAgICAgICAgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIiA8PCBjYWxsX2NvbnRleHRfZGVjbF8gPDwgIik7IiA8PCBlbmRsOworICBpZiAoZ2VuZXJhdG9yXy0+Z2VuX3RlbXBsYXRlc18pIHsKKyAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgInR5cGVkZWYgdm9pZCAoIiA8PCBjbGFzc19uYW1lXyA8PCAiOjoqIgorICAgICAgICAgICAgICA8PCAiU3BlY2lhbGl6ZWRQcm9jZXNzRnVuY3Rpb24pKCIgPDwgZmluaXNoX2NvYl9kZWNsXyA8PCAiaW50MzJfdCwgIgorICAgICAgICAgICAgICA8PCAiUHJvdG9jb2xfKiwgUHJvdG9jb2xfKiIgPDwgY2FsbF9jb250ZXh0X2RlY2xfIDw8ICIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICA8PCAic3RydWN0IFByb2Nlc3NGdW5jdGlvbnMgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBQcm9jZXNzRnVuY3Rpb24gZ2VuZXJpYzsiCisgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgU3BlY2lhbGl6ZWRQcm9jZXNzRnVuY3Rpb24gc3BlY2lhbGl6ZWQ7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgIDw8ICIgIFByb2Nlc3NGdW5jdGlvbnMoUHJvY2Vzc0Z1bmN0aW9uIGcsICIKKyAgICAgICAgICAgICAgPDwgIlNwZWNpYWxpemVkUHJvY2Vzc0Z1bmN0aW9uIHMpIDoiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgICBnZW5lcmljKGcpLCIgPDwgZW5kbAorICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICAgIHNwZWNpYWxpemVkKHMpIHt9IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgIDw8ICIgIFByb2Nlc3NGdW5jdGlvbnMoKSA6IGdlbmVyaWMoTlVMTCksIHNwZWNpYWxpemVkKE5VTEwpICIKKyAgICAgICAgICAgICAgPDwgInt9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9OyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICA8PCAidHlwZWRlZiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgUHJvY2Vzc0Z1bmN0aW9ucz4gIgorICAgICAgICAgICAgICA8PCAiUHJvY2Vzc01hcDsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJ0eXBlZGVmIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBQcm9jZXNzRnVuY3Rpb24+ICIKKyAgICAgICAgICAgICAgPDwgIlByb2Nlc3NNYXA7IiA8PCBlbmRsOworICB9CisgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAiUHJvY2Vzc01hcCBwcm9jZXNzTWFwXzsiIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpbmRlbnQoZl9oZWFkZXJfKSA8PCAidm9pZCBwcm9jZXNzXyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoIiA8PCBmaW5pc2hfY29iXworICAgICAgICAgICAgICAgICAgICAgIDw8ICJpbnQzMl90IHNlcWlkLCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBpcHJvdCwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBvcHJvdCIgPDwgY2FsbF9jb250ZXh0XyA8PCAiKTsiCisgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBpZiAoZ2VuZXJhdG9yXy0+Z2VuX3RlbXBsYXRlc18pIHsKKyAgICAgIGluZGVudChmX2hlYWRlcl8pIDw8ICJ2b2lkIHByb2Nlc3NfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIigiIDw8IGZpbmlzaF9jb2JfCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAiaW50MzJfdCBzZXFpZCwgUHJvdG9jb2xfKiBpcHJvdCwgUHJvdG9jb2xfKiBvcHJvdCIgPDwgY2FsbF9jb250ZXh0XworICAgICAgICAgICAgICAgICAgICAgICAgPDwgIik7IiA8PCBlbmRsOworICAgIH0KKyAgICBpZiAoc3R5bGVfID09ICJDb2IiKSB7CisgICAgICAvLyBYWFggRmFjdG9yIHRoaXMgb3V0LCBldmVuIGlmIGl0IGlzIGEgcGFpbi4KKyAgICAgIHN0cmluZyByZXRfYXJnID0gKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAiIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIiwgY29uc3QgIiArIHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCkpICsgIiYgX3JldHVybiIpOworICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJ2b2lkIHJldHVybl8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgIDw8ICIoOjpzdGQ6OmZ1bmN0aW9uPHZvaWQoYm9vbCBvayk+IGNvYiwgaW50MzJfdCBzZXFpZCwgIgorICAgICAgICAgICAgICAgIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBvcHJvdCwgIgorICAgICAgICAgICAgICAgIDw8ICJ2b2lkKiBjdHgiIDw8IHJldF9hcmcgPDwgIik7IiA8PCBlbmRsOworICAgICAgaWYgKGdlbmVyYXRvcl8tPmdlbl90ZW1wbGF0ZXNfKSB7CisgICAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAidm9pZCByZXR1cm5fIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgIDw8ICIoOjpzdGQ6OmZ1bmN0aW9uPHZvaWQoYm9vbCBvayk+IGNvYiwgaW50MzJfdCBzZXFpZCwgIgorICAgICAgICAgICAgICAgICAgPDwgIlByb3RvY29sXyogb3Byb3QsIHZvaWQqIGN0eCIgPDwgcmV0X2FyZyA8PCAiKTsiIDw8IGVuZGw7CisgICAgICB9CisgICAgICAvLyBYWFggRG9uJ3QgZGVjbGFyZSB0aHJvdyBpZiBpdCBkb2Vzbid0IGV4aXN0CisgICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgInZvaWQgdGhyb3dfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICA8PCAiKDo6c3RkOjpmdW5jdGlvbjx2b2lkKGJvb2wgb2spPiBjb2IsIGludDMyX3Qgc2VxaWQsICIKKyAgICAgICAgICAgICAgICA8PCAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCogb3Byb3QsIHZvaWQqIGN0eCwgIgorICAgICAgICAgICAgICAgIDw8ICI6OmFwYWNoZTo6dGhyaWZ0OjpURGVsYXllZEV4Y2VwdGlvbiogX3Rocm93KTsiIDw8IGVuZGw7CisgICAgICBpZiAoZ2VuZXJhdG9yXy0+Z2VuX3RlbXBsYXRlc18pIHsKKyAgICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJ2b2lkIHRocm93XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICA8PCAiKDo6c3RkOjpmdW5jdGlvbjx2b2lkKGJvb2wgb2spPiBjb2IsIGludDMyX3Qgc2VxaWQsICIKKyAgICAgICAgICAgICAgICAgIDw8ICJQcm90b2NvbF8qIG9wcm90LCB2b2lkKiBjdHgsICIKKyAgICAgICAgICAgICAgICAgIDw8ICI6OmFwYWNoZTo6dGhyaWZ0OjpURGVsYXllZEV4Y2VwdGlvbiogX3Rocm93KTsiIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorICB9CisKKyAgZl9oZWFkZXJfIDw8ICIgcHVibGljOiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBjbGFzc19uYW1lXyA8PCAiKDo6c3RkOjpzaGFyZWRfcHRyPCIgPDwgaWZfbmFtZV8KKyAgICAgICAgICAgIDw8ICI+IGlmYWNlKSA6IiA8PCBlbmRsOworICBpZiAoIWV4dGVuZHNfLmVtcHR5KCkpIHsKKyAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgIiAgIiA8PCBleHRlbmRzXyA8PCAiKGlmYWNlKSwiIDw8IGVuZGw7CisgIH0KKyAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICIgIGlmYWNlXyhpZmFjZSkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgInByb2Nlc3NNYXBfW1wiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiXSA9ICI7CisgICAgaWYgKGdlbmVyYXRvcl8tPmdlbl90ZW1wbGF0ZXNfKSB7CisgICAgICBmX2hlYWRlcl8gPDwgIlByb2Nlc3NGdW5jdGlvbnMoIiA8PCBlbmRsOworICAgICAgaWYgKGdlbmVyYXRvcl8tPmdlbl90ZW1wbGF0ZXNfb25seV8pIHsKKyAgICAgICAgaW5kZW50KGZfaGVhZGVyXykgPDwgIiAgTlVMTCwiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbmRlbnQoZl9oZWFkZXJfKSA8PCAiICAmIiA8PCBjbGFzc19uYW1lXyA8PCAiOjpwcm9jZXNzXyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIsIgorICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50KGZfaGVhZGVyXykgPDwgIiAgJiIgPDwgY2xhc3NfbmFtZV8gPDwgIjo6cHJvY2Vzc18iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSI7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfaGVhZGVyXyA8PCAiJiIgPDwgY2xhc3NfbmFtZV8gPDwgIjo6cHJvY2Vzc18iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICB9CisgICAgZl9oZWFkZXJfIDw8ICI7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInZpcnR1YWwgfiIgPDwgY2xhc3NfbmFtZV8gPDwgIigpIHt9IgorICAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9oZWFkZXJfIDw8ICJ9OyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGlmIChnZW5lcmF0b3JfLT5nZW5fdGVtcGxhdGVzXykgeworICAgIC8vIEdlbmVyYXRlIGEgYmFja3dhcmRzIGNvbXBhdGlibGUgdHlwZWRlZiwgZm9yIGNhbGxlcnMgd2hvIGRvbid0IGtub3cKKyAgICAvLyBhYm91dCB0aGUgbmV3IHRlbXBsYXRlLXN0eWxlIGNvZGUuCisgICAgLy8KKyAgICAvLyBXZSBjYW4ndCB1c2UgVFByb3RvY29sIGFzIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIsIHNpbmNlIFByb2Nlc3NvclQKKyAgICAvLyBwcm92aWRlcyBvdmVybG9hZGVkIHZlcnNpb25zIG9mIG1vc3QgbWV0aG9kcywgb25lIG9mIHdoaWNoIGFjY2VwdHMKKyAgICAvLyBUUHJvdG9jb2wgcG9pbnRlcnMsIGFuZCBvbmUgd2hpY2ggYWNjZXB0cyBQcm90b2NvbF8gcG9pbnRlcnMuICBUaGlzCisgICAgLy8gcmVzdWx0cyBpbiBhIGNvbXBpbGUgZXJyb3IgaWYgaW5zdGFudGlhdGVkIHdpdGggUHJvdG9jb2xfID09IFRQcm90b2NvbC4KKyAgICAvLyBUaGVyZWZvcmUsIHdlIGRlZmluZSBURHVtbXlQcm90b2NvbCBzb2xlbHkgc28gd2UgY2FuIHVzZSBpdCBhcyB0aGUKKyAgICAvLyB0ZW1wbGF0ZSBwYXJhbWV0ZXIgaGVyZS4KKyAgICBmX2hlYWRlcl8gPDwgInR5cGVkZWYgIiA8PCBjbGFzc19uYW1lXyA8PCAiPCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VER1bW15UHJvdG9jb2wgPiAiCisgICAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV8gPDwgcHN0eWxlXyA8PCAiUHJvY2Vzc29yOyIgPDwgZW5kbCA8PCBlbmRsOworICB9Cit9CisKK3ZvaWQgUHJvY2Vzc29yR2VuZXJhdG9yOjpnZW5lcmF0ZV9kaXNwYXRjaF9jYWxsKGJvb2wgdGVtcGxhdGVfcHJvdG9jb2wpIHsKKyAgc3RyaW5nIHByb3RvY29sID0gIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wiOworICBzdHJpbmcgZnVuY3Rpb25fc3VmZml4OworICBpZiAodGVtcGxhdGVfcHJvdG9jb2wpIHsKKyAgICBwcm90b2NvbCA9ICJQcm90b2NvbF8iOworICAgIC8vIFdlIGNhbGwgdGhlIGdlbmVyaWMgdmVyc2lvbiBkaXNwYXRjaENhbGwoKSwgYW5kIHRoZSBzcGVjaWFsaXplZAorICAgIC8vIHZlcnNpb24gZGlzcGF0Y2hDYWxsVGVtcGxhdGVkKCkuICBXZSBjYW4ndCBjYWxsIHRoZW0gYm90aAorICAgIC8vIGRpc3BhdGNoQ2FsbCgpLCBzaW5jZSB0aGlzIHdpbGwgY2F1c2UgdGhlIGNvbXBpbGVyIHRvIGlzc3VlIGEgd2FybmluZyBpZgorICAgIC8vIGEgc2VydmljZSB0aGF0IGRvZXNuJ3QgdXNlIHRlbXBsYXRlcyBpbmhlcml0cyBmcm9tIGEgc2VydmljZSB0aGF0IGRvZXMKKyAgICAvLyB1c2UgdGVtcGxhdGVzOiB0aGUgY29tcGlsZXIgY29tcGxhaW5zIHRoYXQgdGhlIHN1YmNsYXNzIG9ubHkgaW1wbGVtZW50cworICAgIC8vIHRoZSBnZW5lcmljIHZlcnNpb24gb2YgZGlzcGF0Y2hDYWxsKCksIGFuZCBoaWRlcyB0aGUgdGVtcGxhdGVkIHZlcnNpb24uCisgICAgLy8gVXNpbmcgZGlmZmVyZW50IG5hbWVzIGZvciB0aGUgdHdvIGZ1bmN0aW9ucyBwcmV2ZW50cyB0aGlzLgorICAgIGZ1bmN0aW9uX3N1ZmZpeCA9ICJUZW1wbGF0ZWQiOworICB9CisKKyAgZl9vdXRfIDw8IHRlbXBsYXRlX2hlYWRlcl8gPDwgcmV0X3R5cGVfIDw8IGNsYXNzX25hbWVfIDw8IHRlbXBsYXRlX3N1ZmZpeF8gPDwgIjo6ZGlzcGF0Y2hDYWxsIgorICAgICAgICAgPDwgZnVuY3Rpb25fc3VmZml4IDw8ICIoIiA8PCBmaW5pc2hfY29iXyA8PCBwcm90b2NvbCA8PCAiKiBpcHJvdCwgIiA8PCBwcm90b2NvbAorICAgICAgICAgPDwgIiogb3Byb3QsICIKKyAgICAgICAgIDw8ICJjb25zdCBzdGQ6OnN0cmluZyYgZm5hbWUsIGludDMyX3Qgc2VxaWQiIDw8IGNhbGxfY29udGV4dF8gPDwgIikgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gSE9UOiBtZW1iZXIgZnVuY3Rpb24gcG9pbnRlciBtYXAKKyAgZl9vdXRfIDw8IGluZGVudCgpIDw8IHR5cGVuYW1lX3N0cl8gPDwgIlByb2Nlc3NNYXA6Oml0ZXJhdG9yIHBmbjsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgIDw8ICJwZm4gPSBwcm9jZXNzTWFwXy5maW5kKGZuYW1lKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgIDw8ICJpZiAocGZuID09IHByb2Nlc3NNYXBfLmVuZCgpKSB7IiA8PCBlbmRsOworICBpZiAoZXh0ZW5kc18uZW1wdHkoKSkgeworICAgIGZfb3V0XyA8PCBpbmRlbnQoKSA8PCAiICBpcHJvdC0+c2tpcCg6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9TVFJVQ1QpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICA8PCAiICBpcHJvdC0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgPDwgIiAgaXByb3QtPmdldFRyYW5zcG9ydCgpLT5yZWFkRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgIDw8ICIgIDo6YXBhY2hlOjp0aHJpZnQ6OlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiAiCisgICAgICAgICAgICAgICJ4KDo6YXBhY2hlOjp0aHJpZnQ6OlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6VU5LTk9XTl9NRVRIT0QsIFwiSW52YWxpZCBtZXRob2QgbmFtZTogIgorICAgICAgICAgICAgICAiJ1wiK2ZuYW1lK1wiJ1wiKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgPDwgIiAgb3Byb3QtPndyaXRlTWVzc2FnZUJlZ2luKGZuYW1lLCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9FWENFUFRJT04sIHNlcWlkKTsiCisgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgeC53cml0ZShvcHJvdCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgIDw8ICIgIG9wcm90LT53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgPDwgIiAgb3Byb3QtPmdldFRyYW5zcG9ydCgpLT53cml0ZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICA8PCAiICBvcHJvdC0+Z2V0VHJhbnNwb3J0KCktPmZsdXNoKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgIDw8IChzdHlsZV8gPT0gIkNvYiIgPyAiICByZXR1cm4gY29iKHRydWUpOyIgOiAiICByZXR1cm4gdHJ1ZTsiKSA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGZfb3V0XyA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBleHRlbmRzXyA8PCAiOjpkaXNwYXRjaENhbGwoIgorICAgICAgICAgICA8PCAoc3R5bGVfID09ICJDb2IiID8gImNvYiwgIiA6ICIiKSA8PCAiaXByb3QsIG9wcm90LCBmbmFtZSwgc2VxaWQiIDw8IGNhbGxfY29udGV4dF9hcmdfCisgICAgICAgICAgIDw8ICIpOyIgPDwgZW5kbDsKKyAgfQorICBmX291dF8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIGlmICh0ZW1wbGF0ZV9wcm90b2NvbCkgeworICAgIGZfb3V0XyA8PCBpbmRlbnQoKSA8PCAiKHRoaXMtPioocGZuLT5zZWNvbmQuc3BlY2lhbGl6ZWQpKSI7CisgIH0gZWxzZSB7CisgICAgaWYgKGdlbmVyYXRvcl8tPmdlbl90ZW1wbGF0ZXNfb25seV8pIHsKKyAgICAgIC8vIFRPRE86IFRoaXMgaXMgYSBudWxsIHBvaW50ZXIsIHNvIG5vdGhpbmcgZ29vZCB3aWxsIGNvbWUgZnJvbSBjYWxsaW5nCisgICAgICAvLyBpdC4gIFRocm93IGFuIGV4Y2VwdGlvbiBpbnN0ZWFkLgorICAgICAgZl9vdXRfIDw8IGluZGVudCgpIDw8ICIodGhpcy0+KihwZm4tPnNlY29uZC5nZW5lcmljKSkiOworICAgIH0gZWxzZSBpZiAoZ2VuZXJhdG9yXy0+Z2VuX3RlbXBsYXRlc18pIHsKKyAgICAgIGZfb3V0XyA8PCBpbmRlbnQoKSA8PCAiKHRoaXMtPioocGZuLT5zZWNvbmQuZ2VuZXJpYykpIjsKKyAgICB9IGVsc2UgeworICAgICAgZl9vdXRfIDw8IGluZGVudCgpIDw8ICIodGhpcy0+KihwZm4tPnNlY29uZCkpIjsKKyAgICB9CisgIH0KKyAgZl9vdXRfIDw8ICIoIiA8PCBjb2JfYXJnXyA8PCAic2VxaWQsIGlwcm90LCBvcHJvdCIgPDwgY2FsbF9jb250ZXh0X2FyZ18gPDwgIik7IiA8PCBlbmRsOworCisgIC8vIFRPRE8oZHJlaXNzKTogcmV0dXJuIHBmbiByZXQ/CisgIGlmIChzdHlsZV8gPT0gIkNvYiIpIHsKKyAgICBmX291dF8gPDwgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgZl9vdXRfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gdHJ1ZTsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBmX291dF8gPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCBQcm9jZXNzb3JHZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb25zKCkgeworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHNlcnZpY2VfLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZ2VuZXJhdG9yXy0+Z2VuX3RlbXBsYXRlc18pIHsKKyAgICAgIGdlbmVyYXRvcl8tPmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24oc2VydmljZV8sICpmX2l0ZXIsIHN0eWxlXywgZmFsc2UpOworICAgICAgZ2VuZXJhdG9yXy0+Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbihzZXJ2aWNlXywgKmZfaXRlciwgc3R5bGVfLCB0cnVlKTsKKyAgICB9IGVsc2UgeworICAgICAgZ2VuZXJhdG9yXy0+Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbihzZXJ2aWNlXywgKmZfaXRlciwgc3R5bGVfLCBmYWxzZSk7CisgICAgfQorICB9Cit9CisKK3ZvaWQgUHJvY2Vzc29yR2VuZXJhdG9yOjpnZW5lcmF0ZV9mYWN0b3J5KCkgeworICBzdHJpbmcgaWZfZmFjdG9yeV9uYW1lID0gaWZfbmFtZV8gKyAiRmFjdG9yeSI7CisKKyAgLy8gR2VuZXJhdGUgdGhlIGZhY3RvcnkgY2xhc3MgZGVmaW5pdGlvbgorICBmX2hlYWRlcl8gPDwgdGVtcGxhdGVfaGVhZGVyXyA8PCAiY2xhc3MgIiA8PCBmYWN0b3J5X2NsYXNzX25hbWVfIDw8ICIgOiBwdWJsaWMgOjphcGFjaGU6OnRocmlmdDo6IgorICAgICAgICAgICAgPDwgKHN0eWxlXyA9PSAiQ29iIiA/ICJhc3luYzo6VEFzeW5jUHJvY2Vzc29yRmFjdG9yeSIgOiAiVFByb2Nlc3NvckZhY3RvcnkiKSA8PCAiIHsiCisgICAgICAgICAgICA8PCBlbmRsIDw8ICIgcHVibGljOiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8IGZhY3RvcnlfY2xhc3NfbmFtZV8gPDwgIihjb25zdCA6OnN0ZDo6c2hhcmVkX3B0cjwgIiA8PCBpZl9mYWN0b3J5X25hbWUKKyAgICAgICAgICAgIDw8ICIgPiYgaGFuZGxlckZhY3RvcnkpIDoiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgIDw8ICIgICAgaGFuZGxlckZhY3RvcnlfKGhhbmRsZXJGYWN0b3J5KSB7fSIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICA8PCAiOjpzdGQ6OnNoYXJlZF9wdHI8IDo6YXBhY2hlOjp0aHJpZnQ6OiIKKyAgICAgICAgICAgIDw8IChzdHlsZV8gPT0gIkNvYiIgPyAiYXN5bmM6OlRBc3luY1Byb2Nlc3NvciIgOiAiVFByb2Nlc3NvciIpIDw8ICIgPiAiCisgICAgICAgICAgICA8PCAiZ2V0UHJvY2Vzc29yKGNvbnN0IDo6YXBhY2hlOjp0aHJpZnQ6OlRDb25uZWN0aW9uSW5mbyYgY29ubkluZm8pOyIgPDwgZW5kbDsKKworICBmX2hlYWRlcl8gPDwgZW5kbCA8PCAiIHByb3RlY3RlZDoiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIjo6c3RkOjpzaGFyZWRfcHRyPCAiCisgICAgICAgICAgICA8PCBpZl9mYWN0b3J5X25hbWUgPDwgIiA+IGhhbmRsZXJGYWN0b3J5XzsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9oZWFkZXJfIDw8ICJ9OyIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIElmIHdlIGFyZSBnZW5lcmF0aW5nIHRlbXBsYXRlcywgb3V0cHV0IGEgdHlwZWRlZiBmb3IgdGhlIHBsYWluCisgIC8vIGZhY3RvcnkgbmFtZS4KKyAgaWYgKGdlbmVyYXRvcl8tPmdlbl90ZW1wbGF0ZXNfKSB7CisgICAgZl9oZWFkZXJfIDw8ICJ0eXBlZGVmICIgPDwgZmFjdG9yeV9jbGFzc19uYW1lXworICAgICAgICAgICAgICA8PCAiPCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VER1bW15UHJvdG9jb2wgPiAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgcHN0eWxlXworICAgICAgICAgICAgICA8PCAiUHJvY2Vzc29yRmFjdG9yeTsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHRoZSBnZXRQcm9jZXNzb3IoKSBtZXRob2QKKyAgZl9vdXRfIDw8IHRlbXBsYXRlX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgIjo6c3RkOjpzaGFyZWRfcHRyPCA6OmFwYWNoZTo6dGhyaWZ0OjoiCisgICAgICAgICA8PCAoc3R5bGVfID09ICJDb2IiID8gImFzeW5jOjpUQXN5bmNQcm9jZXNzb3IiIDogIlRQcm9jZXNzb3IiKSA8PCAiID4gIgorICAgICAgICAgPDwgZmFjdG9yeV9jbGFzc19uYW1lXyA8PCB0ZW1wbGF0ZV9zdWZmaXhfIDw8ICI6OmdldFByb2Nlc3NvcigiCisgICAgICAgICA8PCAiY29uc3QgOjphcGFjaGU6OnRocmlmdDo6VENvbm5lY3Rpb25JbmZvJiBjb25uSW5mbykgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZl9vdXRfIDw8IGluZGVudCgpIDw8ICI6OmFwYWNoZTo6dGhyaWZ0OjpSZWxlYXNlSGFuZGxlcjwgIiA8PCBpZl9mYWN0b3J5X25hbWUKKyAgICAgICAgIDw8ICIgPiBjbGVhbnVwKGhhbmRsZXJGYWN0b3J5Xyk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICI6OnN0ZDo6c2hhcmVkX3B0cjwgIgorICAgICAgICAgPDwgaWZfbmFtZV8gPDwgIiA+IGhhbmRsZXIoIgorICAgICAgICAgPDwgImhhbmRsZXJGYWN0b3J5Xy0+Z2V0SGFuZGxlcihjb25uSW5mbyksIGNsZWFudXApOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgPDwgIjo6c3RkOjpzaGFyZWRfcHRyPCA6OmFwYWNoZTo6dGhyaWZ0OjoiCisgICAgICAgICA8PCAoc3R5bGVfID09ICJDb2IiID8gImFzeW5jOjpUQXN5bmNQcm9jZXNzb3IiIDogIlRQcm9jZXNzb3IiKSA8PCAiID4gIgorICAgICAgICAgPDwgInByb2Nlc3NvcihuZXcgIiA8PCBjbGFzc19uYW1lXyA8PCB0ZW1wbGF0ZV9zdWZmaXhfIDw8ICIoaGFuZGxlcikpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgPDwgInJldHVybiBwcm9jZXNzb3I7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGZfb3V0XyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgcHJvY2Vzc29yIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgcHJvY2Vzc29yIGZvci4KKyAqLwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfcHJvY2Vzc29yKHRfc2VydmljZSogdHNlcnZpY2UsIHN0cmluZyBzdHlsZSkgeworICBQcm9jZXNzb3JHZW5lcmF0b3IgZ2VuZXJhdG9yKHRoaXMsIHRzZXJ2aWNlLCBzdHlsZSk7CisgIGdlbmVyYXRvci5ydW4oKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgYW5kIGhlbHBlcnMgZm9yIGEgZnVuY3Rpb24uCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24KKyAqLwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgc3RkOjpvc3RyZWFtJiBvdXQgPSAoZ2VuX3RlbXBsYXRlc18gPyBmX3NlcnZpY2VfdGNjXyA6IGZfc2VydmljZV8pOworCisgIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiXyIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOworICB0X2ZpZWxkIHN1Y2Nlc3ModGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOworICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7CisgIH0KKworICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICByZXN1bHQuYXBwZW5kKCpmX2l0ZXIpOworICB9CisKKyAgZ2VuZXJhdGVfc3RydWN0X2RlY2xhcmF0aW9uKGZfaGVhZGVyXywgJnJlc3VsdCwgZmFsc2UpOworICBnZW5lcmF0ZV9zdHJ1Y3RfZGVmaW5pdGlvbihvdXQsIGZfc2VydmljZV8sICZyZXN1bHQsIGZhbHNlKTsKKyAgZ2VuZXJhdGVfc3RydWN0X3JlYWRlcihvdXQsICZyZXN1bHQpOworICBnZW5lcmF0ZV9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihvdXQsICZyZXN1bHQpOworCisgIHJlc3VsdC5zZXRfbmFtZSh0c2VydmljZS0+Z2V0X25hbWUoKSArICJfIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcHJlc3VsdCIpOworICBnZW5lcmF0ZV9zdHJ1Y3RfZGVjbGFyYXRpb24oZl9oZWFkZXJfLCAmcmVzdWx0LCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgZ2VuX2NvYl9zdHlsZV8pOworICBnZW5lcmF0ZV9zdHJ1Y3RfZGVmaW5pdGlvbihvdXQsIGZfc2VydmljZV8sICZyZXN1bHQsIGZhbHNlKTsKKyAgZ2VuZXJhdGVfc3RydWN0X3JlYWRlcihvdXQsICZyZXN1bHQsIHRydWUpOworICBpZiAoZ2VuX2NvYl9zdHlsZV8pIHsKKyAgICBnZW5lcmF0ZV9zdHJ1Y3Rfd3JpdGVyKG91dCwgJnJlc3VsdCwgdHJ1ZSk7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBwcm9jZXNzIGZ1bmN0aW9uIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24gdG8gd3JpdGUgYSBkaXNwYXRjaGVyIGZvcgorICovCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHN0eWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzcGVjaWFsaXplZCkgeworICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKyAgc3RyaW5nIHNlcnZpY2VfZnVuY19uYW1lID0gIlwiIiArIHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIi4iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIlwiIjsKKworICBzdGQ6Om9zdHJlYW0mIG91dCA9IChnZW5fdGVtcGxhdGVzXyA/IGZfc2VydmljZV90Y2NfIDogZl9zZXJ2aWNlXyk7CisKKyAgc3RyaW5nIHByb3RfdHlwZSA9IChzcGVjaWFsaXplZCA/ICJQcm90b2NvbF8iIDogIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wiKTsKKyAgc3RyaW5nIGNsYXNzX3N1ZmZpeDsKKyAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7CisgICAgY2xhc3Nfc3VmZml4ID0gIlQ8UHJvdG9jb2xfPiI7CisgIH0KKworICAvLyBJIHRyaWVkIHRvIGRvIHRoaXMgYXMgb25lIGZ1bmN0aW9uLiAgSSByZWFsbHkgZGlkLiAgQnV0IGl0IHdhcyB0b28gaGFyZC4KKyAgaWYgKHN0eWxlICE9ICJDb2IiKSB7CisgICAgLy8gT3BlbiBmdW5jdGlvbgorICAgIGlmIChnZW5fdGVtcGxhdGVzXykgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0ZW1wbGF0ZSA8Y2xhc3MgUHJvdG9jb2xfPiIgPDwgZW5kbDsKKyAgICB9CisgICAgY29uc3QgYm9vbCB1bm5hbWVkX29wcm90X3NlcWlkID0gdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhKGdlbl90ZW1wbGF0ZXNfICYmICFzcGVjaWFsaXplZCk7CisgICAgb3V0IDw8ICJ2b2lkICIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIlByb2Nlc3NvciIgPDwgY2xhc3Nfc3VmZml4IDw8ICI6OiIKKyAgICAgICAgPDwgInByb2Nlc3NfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiCisgICAgICAgIDw8ICJpbnQzMl90IiA8PCAodW5uYW1lZF9vcHJvdF9zZXFpZCA/ICIsICIgOiAiIHNlcWlkLCAiKSA8PCBwcm90X3R5cGUgPDwgIiogaXByb3QsICIKKyAgICAgICAgPDwgcHJvdF90eXBlIDw8ICIqIiA8PCAodW5uYW1lZF9vcHJvdF9zZXFpZCA/ICIsICIgOiAiIG9wcm90LCAiKSA8PCAidm9pZCogY2FsbENvbnRleHQpIgorICAgICAgICA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisKKyAgICBzdHJpbmcgYXJnc25hbWUgPSB0c2VydmljZS0+Z2V0X25hbWUoKSArICJfIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfYXJncyI7CisgICAgc3RyaW5nIHJlc3VsdG5hbWUgPSB0c2VydmljZS0+Z2V0X25hbWUoKSArICJfIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKKworICAgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF1bm5hbWVkX29wcm90X3NlcWlkKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIih2b2lkKSBzZXFpZDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIih2b2lkKSBvcHJvdDsiIDw8IGVuZGw7CisgICAgfQorCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ2b2lkKiBjdHggPSBOVUxMOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAiaWYgKHRoaXMtPmV2ZW50SGFuZGxlcl8uZ2V0KCkgIT0gTlVMTCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAiICBjdHggPSB0aGlzLT5ldmVudEhhbmRsZXJfLT5nZXRDb250ZXh0KCIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIiwgY2FsbENvbnRleHQpOyIKKyAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAiOjphcGFjaGU6OnRocmlmdDo6VFByb2Nlc3NvckNvbnRleHRGcmVlciBmcmVlcigiCisgICAgICAgIDw8ICJ0aGlzLT5ldmVudEhhbmRsZXJfLmdldCgpLCBjdHgsICIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIik7IiA8PCBlbmRsIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmICh0aGlzLT5ldmVudEhhbmRsZXJfLmdldCgpICE9IE5VTEwpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgIiAgdGhpcy0+ZXZlbnRIYW5kbGVyXy0+cHJlUmVhZChjdHgsICIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIik7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgYXJnc25hbWUgPDwgIiBhcmdzOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAiYXJncy5yZWFkKGlwcm90KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlwcm90LT5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAidWludDMyX3QgYnl0ZXMgPSBpcHJvdC0+Z2V0VHJhbnNwb3J0KCktPnJlYWRFbmQoKTsiIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAiaWYgKHRoaXMtPmV2ZW50SGFuZGxlcl8uZ2V0KCkgIT0gTlVMTCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAiICB0aGlzLT5ldmVudEhhbmRsZXJfLT5wb3N0UmVhZChjdHgsICIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIiwgYnl0ZXMpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgLy8gRGVjbGFyZSByZXN1bHQKKyAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCByZXN1bHRuYW1lIDw8ICIgcmVzdWx0OyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICAvLyBUcnkgYmxvY2sgZm9yIGZ1bmN0aW9ucyB3aXRoIGV4Y2VwdGlvbnMKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRyeSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgLy8gR2VuZXJhdGUgdGhlIGZ1bmN0aW9uIGNhbGwKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBvdXQgPDwgaW5kZW50KCk7CisgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgaWYgKGlzX2NvbXBsZXhfdHlwZSh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpKSB7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgIG91dCA8PCAiaWZhY2VfLT4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKHJlc3VsdC5zdWNjZXNzIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCAicmVzdWx0LnN1Y2Nlc3MgPSBpZmFjZV8tPiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIjsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8ICJpZmFjZV8tPiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIjsKKyAgICB9CisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0IDw8ICIsICI7CisgICAgICB9CisgICAgICBvdXQgPDwgImFyZ3MuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgICAgfQorICAgIG91dCA8PCAiKTsiIDw8IGVuZGw7CisKKyAgICAvLyBTZXQgaXNzZXQgb24gc3VjY2VzcyBmaWVsZAorICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmVzdWx0Ll9faXNzZXQuc3VjY2VzcyA9IHRydWU7IiA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IjsKKworICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgICAgb3V0IDw8ICIgY2F0Y2ggKCIgPDwgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiAmIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICA8PCAiOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmVzdWx0Ll9faXNzZXQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IHRydWU7IgorICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgPDwgIn0iOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICBvdXQgPDwgIiBjYXRjaCAoY29uc3Qgc3RkOjpleGNlcHRpb24mIGUpIHsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCAiIGNhdGNoIChjb25zdCBzdGQ6OmV4Y2VwdGlvbiYpIHsiIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAodGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSAhPSBOVUxMKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICIgIHRoaXMtPmV2ZW50SGFuZGxlcl8tPmhhbmRsZXJFcnJvcihjdHgsICIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIik7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiOjphcGFjaGU6OnRocmlmdDo6VEFwcGxpY2F0aW9uRXhjZXB0aW9uIHgoZS53aGF0KCkpOyIgPDwgZW5kbAorICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJvcHJvdC0+d3JpdGVNZXNzYWdlQmVnaW4oXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgIDw8ICJcIiwgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfRVhDRVBUSU9OLCBzZXFpZCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIngud3JpdGUob3Byb3QpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3QtPndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbAorICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJvcHJvdC0+Z2V0VHJhbnNwb3J0KCktPndyaXRlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIm9wcm90LT5nZXRUcmFuc3BvcnQoKS0+Zmx1c2goKTsiIDw8IGVuZGw7CisgICAgfQorICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgLy8gU2hvcnRjdXQgb3V0IGhlcmUgZm9yIG9uZXdheSBmdW5jdGlvbnMKKyAgICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAodGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSAhPSBOVUxMKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIiAgdGhpcy0+ZXZlbnRIYW5kbGVyXy0+YXN5bmNDb21wbGV0ZShjdHgsICIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIik7IiA8PCBlbmRsCisgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBvdXQgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBTZXJpYWxpemUgdGhlIHJlc3VsdCBpbnRvIGEgc3RydWN0CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAodGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSAhPSBOVUxMKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICIgIHRoaXMtPmV2ZW50SGFuZGxlcl8tPnByZVdyaXRlKGN0eCwgIiA8PCBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3QtPndyaXRlTWVzc2FnZUJlZ2luKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgPDwgIlwiLCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9SRVBMWSwgc2VxaWQpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAicmVzdWx0LndyaXRlKG9wcm90KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LT53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImJ5dGVzID0gb3Byb3QtPmdldFRyYW5zcG9ydCgpLT53cml0ZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAib3Byb3QtPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOyIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICJpZiAodGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSAhPSBOVUxMKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICIgIHRoaXMtPmV2ZW50SGFuZGxlcl8tPnBvc3RXcml0ZShjdHgsICIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIiwgYnl0ZXMpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICAgIC8vIENsb3NlIGZ1bmN0aW9uCisgICAgc2NvcGVfZG93bihvdXQpOworICAgIG91dCA8PCBlbmRsOworICB9CisKKyAgLy8gQ29iIHN0eWxlLgorICBlbHNlIHsKKyAgICAvLyBQcm9jZXNzb3IgZW50cnkgcG9pbnQuCisgICAgLy8gVE9ETyhlZGhhbGwpIHVwZGF0ZSBmb3IgY2FsbENvbnRleHQgd2hlbiBURXZlbnRTZXJ2ZXIgaXMgcmVhZHkKKyAgICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGVtcGxhdGUgPGNsYXNzIFByb3RvY29sXz4iIDw8IGVuZGw7CisgICAgfQorICAgIG91dCA8PCAidm9pZCAiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICJBc3luY1Byb2Nlc3NvciIgPDwgY2xhc3Nfc3VmZml4IDw8ICI6OnByb2Nlc3NfIgorICAgICAgICA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIig6OnN0ZDo6ZnVuY3Rpb248dm9pZChib29sIG9rKT4gY29iLCBpbnQzMl90IHNlcWlkLCAiCisgICAgICAgIDw8IHByb3RfdHlwZSA8PCAiKiBpcHJvdCwgIiA8PCBwcm90X3R5cGUgPDwgIiogb3Byb3QpIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisKKyAgICAvLyBUT0RPKHNpbXBraW5zKTogd2UgY291bGQgdHJ5IHRvIGNvbnNvbGRhdGUgdGhpcworICAgIC8vIHdpdGggdGhlIG5vbi1jb2IgY29kZSBhYm92ZQorICAgIGlmIChnZW5fdGVtcGxhdGVzXyAmJiAhc3BlY2lhbGl6ZWQpIHsKKyAgICAgIC8vIElmIHRoZXNlIGFyZSBpbnN0YW5jZXMgb2YgUHJvdG9jb2xfLCBpbnN0ZWFkIG9mIGFueSBvbGQgVFByb3RvY29sLAorICAgICAgLy8gdXNlIHRoZSBzcGVjaWFsaXplZCBwcm9jZXNzIGZ1bmN0aW9uIGluc3RlYWQuCisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIlByb3RvY29sXyogX2lwcm90ID0gZHluYW1pY19jYXN0PFByb3RvY29sXyo+KGlwcm90KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAiUHJvdG9jb2xfKiBfb3Byb3QgPSBkeW5hbWljX2Nhc3Q8UHJvdG9jb2xfKj4ob3Byb3QpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICJpZiAoX2lwcm90ICYmIF9vcHJvdCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gcHJvY2Vzc18iCisgICAgICAgICAgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoY29iLCBzZXFpZCwgX2lwcm90LCBfb3Byb3QpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIKKyAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJUX0dFTkVSSUNfUFJPVE9DT0wodGhpcywgaXByb3QsIF9pcHJvdCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIlRfR0VORVJJQ19QUk9UT0NPTCh0aGlzLCBvcHJvdCwgX29wcm90KTsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIodm9pZCkgc2VxaWQ7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIodm9pZCkgb3Byb3Q7IiA8PCBlbmRsOworICAgIH0KKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSArICJfIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiX2FyZ3MgYXJnczsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInZvaWQqIGN0eCA9IE5VTEw7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICJpZiAodGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSAhPSBOVUxMKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICIgIGN0eCA9IHRoaXMtPmV2ZW50SGFuZGxlcl8tPmdldENvbnRleHQoIiA8PCBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiLCBOVUxMKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3JDb250ZXh0RnJlZXIgZnJlZXIoIgorICAgICAgICA8PCAidGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSwgY3R4LCAiIDw8IHNlcnZpY2VfZnVuY19uYW1lIDw8ICIpOyIgPDwgZW5kbCA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ0cnkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICh0aGlzLT5ldmVudEhhbmRsZXJfLmdldCgpICE9IE5VTEwpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgIiAgdGhpcy0+ZXZlbnRIYW5kbGVyXy0+cHJlUmVhZChjdHgsICIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIik7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJhcmdzLnJlYWQoaXByb3QpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAiaXByb3QtPnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICJ1aW50MzJfdCBieXRlcyA9IGlwcm90LT5nZXRUcmFuc3BvcnQoKS0+cmVhZEVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAiaWYgKHRoaXMtPmV2ZW50SGFuZGxlcl8uZ2V0KCkgIT0gTlVMTCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAiICB0aGlzLT5ldmVudEhhbmRsZXJfLT5wb3N0UmVhZChjdHgsICIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIiwgYnl0ZXMpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKG91dCk7CisKKyAgICAvLyBUT0RPKGRyZWlzcyk6IEhhbmRsZSBURXhjZXB0aW9ucz8gIEV4cG9zZSB0byBzZXJ2ZXI/CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJjYXRjaCAoY29uc3Qgc3RkOjpleGNlcHRpb24mKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICIgIGlmICh0aGlzLT5ldmVudEhhbmRsZXJfLmdldCgpICE9IE5VTEwpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgIiAgICB0aGlzLT5ldmVudEhhbmRsZXJfLT5oYW5kbGVyRXJyb3IoY3R4LCAiIDw8IHNlcnZpY2VfZnVuY19uYW1lIDw8ICIpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBjb2IoZmFsc2UpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAifSIgPDwgZW5kbDsKKworICAgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICh0aGlzLT5ldmVudEhhbmRsZXJfLmdldCgpICE9IE5VTEwpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAiICB0aGlzLT5ldmVudEhhbmRsZXJfLT5hc3luY0NvbXBsZXRlKGN0eCwgIiA8PCBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiKTsiIDw8IGVuZGwKKyAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgICAgLy8gVE9ETyhkcmVpc3MpOiBGaWd1cmUgb3V0IGEgc3RyYXRlZ3kgZm9yIGV4Y2VwdGlvbnMgaW4gYXN5bmMgaGFuZGxlcnMuCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJmcmVlci51bnJlZ2lzdGVyKCk7IiA8PCBlbmRsOworICAgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICAvLyBObyByZXR1cm4uICBKdXN0IGhhbmQgb2ZmIG91ciBjb2IuCisgICAgICAvLyBUT0RPKGRyZWlzcyk6IENhbGwgdGhlIGNvYiBpbW1lZGlhdGVseT8KKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWZhY2VfLT4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCIKKyAgICAgICAgICA8PCAiOjpzdGQ6OmJpbmQoY29iLCB0cnVlKSIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHN0cmluZyByZXRfYXJnLCByZXRfcGxhY2Vob2xkZXI7CisgICAgICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIHJldF9hcmcgPSAiLCBjb25zdCAiICsgdHlwZV9uYW1lKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSkgKyAiJiBfcmV0dXJuIjsKKyAgICAgICAgcmV0X3BsYWNlaG9sZGVyID0gIiwgOjpzdGQ6OnBsYWNlaG9sZGVyczo6XzEiOworICAgICAgfQorCisgICAgICAvLyBXaGVuIGdlbl90ZW1wbGF0ZXNfIGlzIHRydWUsIHRoZSByZXR1cm5fIGFuZCB0aHJvd18gZnVuY3Rpb25zIGFyZQorICAgICAgLy8gb3ZlcmxvYWRlZC4gIFdlIGhhdmUgdG8gZGVjbGFyZSBwb2ludGVycyB0byB0aGVtIHNvIHRoYXQgdGhlIGNvbXBpbGVyCisgICAgICAvLyBjYW4gcmVzb2x2ZSB0aGUgY29ycmVjdCBvdmVybG9hZGVkIHZlcnNpb24uCisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInZvaWQgKCIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIkFzeW5jUHJvY2Vzc29yIiA8PCBjbGFzc19zdWZmaXgKKyAgICAgICAgICA8PCAiOjoqcmV0dXJuX2ZuKSg6OnN0ZDo6ZnVuY3Rpb248dm9pZChib29sIG9rKT4gIgorICAgICAgICAgIDw8ICJjb2IsIGludDMyX3Qgc2VxaWQsICIgPDwgcHJvdF90eXBlIDw8ICIqIG9wcm90LCB2b2lkKiBjdHgiIDw8IHJldF9hcmcKKyAgICAgICAgICA8PCAiKSA9IiA8PCBlbmRsOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgICYiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICJBc3luY1Byb2Nlc3NvciIgPDwgY2xhc3Nfc3VmZml4CisgICAgICAgICAgPDwgIjo6cmV0dXJuXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOworICAgICAgaWYgKCF4Y2VwdGlvbnMuZW1wdHkoKSkgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInZvaWQgKCIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIkFzeW5jUHJvY2Vzc29yIiA8PCBjbGFzc19zdWZmaXgKKyAgICAgICAgICAgIDw8ICI6Oip0aHJvd19mbikoOjpzdGQ6OmZ1bmN0aW9uPHZvaWQoYm9vbCBvayk+ICIKKyAgICAgICAgICAgIDw8ICJjb2IsIGludDMyX3Qgc2VxaWQsICIgPDwgcHJvdF90eXBlIDw8ICIqIG9wcm90LCB2b2lkKiBjdHgsICIKKyAgICAgICAgICAgIDw8ICI6OmFwYWNoZTo6dGhyaWZ0OjpURGVsYXllZEV4Y2VwdGlvbiogX3Rocm93KSA9IiA8PCBlbmRsOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgJiIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIkFzeW5jUHJvY2Vzc29yIiA8PCBjbGFzc19zdWZmaXgKKyAgICAgICAgICAgIDw8ICI6OnRocm93XyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOworICAgICAgfQorCisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmYWNlXy0+IiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICI6OnN0ZDo6YmluZChyZXR1cm5fZm4sIHRoaXMsIGNvYiwgc2VxaWQsIG9wcm90LCBjdHgiIDw8IHJldF9wbGFjZWhvbGRlcgorICAgICAgICAgIDw8ICIpIjsKKyAgICAgIGlmICgheGNlcHRpb25zLmVtcHR5KCkpIHsKKyAgICAgICAgb3V0IDw8ICcsJyA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICI6OnN0ZDo6YmluZCh0aHJvd19mbiwgdGhpcywgY29iLCBzZXFpZCwgb3Byb3QsICIKKyAgICAgICAgICAgIDw8ICJjdHgsIDo6c3RkOjpwbGFjZWhvbGRlcnM6Ol8xKSI7CisgICAgICB9CisgICAgfQorCisgICAgLy8gWFhYIFdoaXRlc3BhY2UgY2xlYW51cC4KKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgb3V0IDw8ICcsJyA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJhcmdzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIH0KKyAgICBvdXQgPDwgIik7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBzY29wZV9kb3duKG91dCk7CisgICAgb3V0IDw8IGVuZGw7CisKKyAgICAvLyBOb3JtYWwgcmV0dXJuLgorICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgc3RyaW5nIHJldF9hcmdfZGVjbCwgcmV0X2FyZ19uYW1lOworICAgICAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICByZXRfYXJnX2RlY2wgPSAiLCBjb25zdCAiICsgdHlwZV9uYW1lKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSkgKyAiJiBfcmV0dXJuIjsKKyAgICAgICAgcmV0X2FyZ19uYW1lID0gIiwgX3JldHVybiI7CisgICAgICB9CisgICAgICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0ZW1wbGF0ZSA8Y2xhc3MgUHJvdG9jb2xfPiIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIG91dCA8PCAidm9pZCAiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICJBc3luY1Byb2Nlc3NvciIgPDwgY2xhc3Nfc3VmZml4IDw8ICI6OnJldHVybl8iCisgICAgICAgICAgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoOjpzdGQ6OmZ1bmN0aW9uPHZvaWQoYm9vbCBvayk+IGNvYiwgaW50MzJfdCBzZXFpZCwgIgorICAgICAgICAgIDw8IHByb3RfdHlwZSA8PCAiKiBvcHJvdCwgdm9pZCogY3R4IiA8PCByZXRfYXJnX2RlY2wgPDwgJyknIDw8IGVuZGw7CisgICAgICBzY29wZV91cChvdXQpOworCisgICAgICBpZiAoZ2VuX3RlbXBsYXRlc18gJiYgIXNwZWNpYWxpemVkKSB7CisgICAgICAgIC8vIElmIG9wcm90IGlzIGEgUHJvdG9jb2xfIGluc3RhbmNlLAorICAgICAgICAvLyB1c2UgdGhlIHNwZWNpYWxpemVkIHJldHVybiBmdW5jdGlvbiBpbnN0ZWFkLgorICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIlByb3RvY29sXyogX29wcm90ID0gZHluYW1pY19jYXN0PFByb3RvY29sXyo+KG9wcm90KTsiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoX29wcm90KSB7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiByZXR1cm5fIgorICAgICAgICAgICAgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoY29iLCBzZXFpZCwgX29wcm90LCBjdHgiIDw8IHJldF9hcmdfbmFtZSA8PCAiKTsiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJUX0dFTkVSSUNfUFJPVE9DT0wodGhpcywgb3Byb3QsIF9vcHJvdCk7IgorICAgICAgICAgICAgPDwgZW5kbCA8PCBlbmRsOworICAgICAgfQorCisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIl8iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiX3ByZXN1bHQgcmVzdWx0OyIKKyAgICAgICAgICA8PCBlbmRsOworICAgICAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICAvLyBUaGUgY29uc3RfY2FzdCBoZXJlIGlzIHVuZm9ydHVuYXRlLCBidXQgaXQgd291bGQgYmUgYSBwYWluIHRvIGF2b2lkLAorICAgICAgICAvLyBhbmQgd2Ugb25seSBkbyBhIHdyaXRlIHdpdGggdGhpcyBzdHJ1Y3QsIHdoaWNoIGlzIGNvbnN0LXNhZmUuCisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LnN1Y2Nlc3MgPSBjb25zdF9jYXN0PCIgPDwgdHlwZV9uYW1lKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSkKKyAgICAgICAgICAgIDw8ICIqPigmX3JldHVybik7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXN1bHQuX19pc3NldC5zdWNjZXNzID0gdHJ1ZTsiIDw8IGVuZGw7CisgICAgICB9CisgICAgICAvLyBTZXJpYWxpemUgdGhlIHJlc3VsdCBpbnRvIGEgc3RydWN0CisgICAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaWYgKHRoaXMtPmV2ZW50SGFuZGxlcl8uZ2V0KCkgIT0gTlVMTCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICIgIGN0eCA9IHRoaXMtPmV2ZW50SGFuZGxlcl8tPmdldENvbnRleHQoIiA8PCBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiLCBOVUxMKTsiIDw8IGVuZGwKKyAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICI6OmFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yQ29udGV4dEZyZWVyIGZyZWVyKCIKKyAgICAgICAgICA8PCAidGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSwgY3R4LCAiIDw8IHNlcnZpY2VfZnVuY19uYW1lIDw8ICIpOyIgPDwgZW5kbCA8PCBlbmRsCisgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmICh0aGlzLT5ldmVudEhhbmRsZXJfLmdldCgpICE9IE5VTEwpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAiICB0aGlzLT5ldmVudEhhbmRsZXJfLT5wcmVXcml0ZShjdHgsICIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIik7IiA8PCBlbmRsCisgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3QtPndyaXRlTWVzc2FnZUJlZ2luKFwiIgorICAgICAgICAgIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCIsIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1JFUExZLCBzZXFpZCk7IiA8PCBlbmRsCisgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInJlc3VsdC53cml0ZShvcHJvdCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC0+d3JpdGVNZXNzYWdlRW5kKCk7IgorICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInVpbnQzMl90IGJ5dGVzID0gb3Byb3QtPmdldFRyYW5zcG9ydCgpLT53cml0ZUVuZCgpOyIgPDwgZW5kbAorICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJvcHJvdC0+Z2V0VHJhbnNwb3J0KCktPmZsdXNoKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgImlmICh0aGlzLT5ldmVudEhhbmRsZXJfLmdldCgpICE9IE5VTEwpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAiICB0aGlzLT5ldmVudEhhbmRsZXJfLT5wb3N0V3JpdGUoY3R4LCAiIDw8IHNlcnZpY2VfZnVuY19uYW1lIDw8ICIsIGJ5dGVzKTsiIDw8IGVuZGwKKyAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGNvYih0cnVlKTsiIDw8IGVuZGw7CisgICAgICBzY29wZV9kb3duKG91dCk7CisgICAgICBvdXQgPDwgZW5kbDsKKyAgICB9CisKKyAgICAvLyBFeGNlcHRpb24gcmV0dXJuLgorICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAheGNlcHRpb25zLmVtcHR5KCkpIHsKKyAgICAgIGlmIChnZW5fdGVtcGxhdGVzXykgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRlbXBsYXRlIDxjbGFzcyBQcm90b2NvbF8+IiA8PCBlbmRsOworICAgICAgfQorICAgICAgb3V0IDw8ICJ2b2lkICIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIkFzeW5jUHJvY2Vzc29yIiA8PCBjbGFzc19zdWZmaXggPDwgIjo6dGhyb3dfIgorICAgICAgICAgIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKDo6c3RkOjpmdW5jdGlvbjx2b2lkKGJvb2wgb2spPiBjb2IsIGludDMyX3Qgc2VxaWQsICIKKyAgICAgICAgICA8PCBwcm90X3R5cGUgPDwgIiogb3Byb3QsIHZvaWQqIGN0eCwgIgorICAgICAgICAgIDw8ICI6OmFwYWNoZTo6dGhyaWZ0OjpURGVsYXllZEV4Y2VwdGlvbiogX3Rocm93KSIgPDwgZW5kbDsKKyAgICAgIHNjb3BlX3VwKG91dCk7CisKKyAgICAgIGlmIChnZW5fdGVtcGxhdGVzXyAmJiAhc3BlY2lhbGl6ZWQpIHsKKyAgICAgICAgLy8gSWYgb3Byb3QgaXMgYSBQcm90b2NvbF8gaW5zdGFuY2UsCisgICAgICAgIC8vIHVzZSB0aGUgc3BlY2lhbGl6ZWQgdGhyb3cgZnVuY3Rpb24gaW5zdGVhZC4KKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJQcm90b2NvbF8qIF9vcHJvdCA9IGR5bmFtaWNfY2FzdDxQcm90b2NvbF8qPihvcHJvdCk7IiA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKF9vcHJvdCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhyb3dfIgorICAgICAgICAgICAgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoY29iLCBzZXFpZCwgX29wcm90LCBjdHgsIF90aHJvdyk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiVF9HRU5FUklDX1BST1RPQ09MKHRoaXMsIG9wcm90LCBfb3Byb3QpOyIgPDwgZW5kbAorICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgLy8gR2V0IHRoZSBldmVudCBoYW5kbGVyIGNvbnRleHQKKyAgICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpZiAodGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSAhPSBOVUxMKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIiAgY3R4ID0gdGhpcy0+ZXZlbnRIYW5kbGVyXy0+Z2V0Q29udGV4dCgiIDw8IHNlcnZpY2VfZnVuY19uYW1lIDw8ICIsIE5VTEwpOyIgPDwgZW5kbAorICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3JDb250ZXh0RnJlZXIgZnJlZXIoIgorICAgICAgICAgIDw8ICJ0aGlzLT5ldmVudEhhbmRsZXJfLmdldCgpLCBjdHgsICIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIik7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAgIC8vIFRocm93IHRoZSBURGVsYXllZEV4Y2VwdGlvbiwgYW5kIGNhdGNoIHRoZSByZXN1bHQKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJfcmVzdWx0IHJlc3VsdDsiCisgICAgICAgICAgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ0cnkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJfdGhyb3ctPnRocm93X2l0KCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gY29iKGZhbHNlKTsiCisgICAgICAgICAgPDwgZW5kbDsgLy8gSXMgdGhpcyBwb3NzaWJsZT8gIFRCRC4KKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgJ30nOworICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgICAgb3V0IDw8ICIgIGNhdGNoICgiIDw8IHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCkpIDw8ICIgJiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICA8PCAiKSB7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICA8PCAiOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmVzdWx0Ll9faXNzZXQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IHRydWU7IgorICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgc2NvcGVfZG93bihvdXQpOworICAgICAgfQorCisgICAgICAvLyBIYW5kbGUgdGhlIGNhc2Ugd2hlcmUgYW4gdW5kZWNsYXJlZCBleGNlcHRpb24gaXMgdGhyb3duCisgICAgICBvdXQgPDwgIiBjYXRjaCAoc3RkOjpleGNlcHRpb24mIGUpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKHRoaXMtPmV2ZW50SGFuZGxlcl8uZ2V0KCkgIT0gTlVMTCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICIgIHRoaXMtPmV2ZW50SGFuZGxlcl8tPmhhbmRsZXJFcnJvcihjdHgsICIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIik7IiA8PCBlbmRsCisgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICI6OmFwYWNoZTo6dGhyaWZ0OjpUQXBwbGljYXRpb25FeGNlcHRpb24geChlLndoYXQoKSk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIm9wcm90LT53cml0ZU1lc3NhZ2VCZWdpbihcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgPDwgIlwiLCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9FWENFUFRJT04sIHNlcWlkKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAieC53cml0ZShvcHJvdCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC0+d3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsCisgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm9wcm90LT5nZXRUcmFuc3BvcnQoKS0+d3JpdGVFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAib3Byb3QtPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOyIgPDwgZW5kbCA8PAorICAgICAgICAgIC8vIFdlIHBhc3MgdHJ1ZSB0byB0aGUgY29iIGhlcmUsIHNpbmNlIHdlIGRpZCBzdWNjZXNzZnVsbHkgd3JpdGUgYQorICAgICAgICAgIC8vIHJlc3BvbnNlLCBldmVuIHRob3VnaCBpdCBpcyBhbiBleGNlcHRpb24gcmVzcG9uc2UuCisgICAgICAgICAgLy8gSXQgbG9va3MgbGlrZSB0aGUgYXJndW1lbnQgaXMgY3VycmVudGx5IGlnbm9yZWQsIGFueXdheS4KKyAgICAgICAgICBpbmRlbnQoKSA8PCAicmV0dXJuIGNvYih0cnVlKTsiIDw8IGVuZGw7CisgICAgICBzY29wZV9kb3duKG91dCk7CisKKyAgICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVzdWx0IGludG8gYSBzdHJ1Y3QKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKHRoaXMtPmV2ZW50SGFuZGxlcl8uZ2V0KCkgIT0gTlVMTCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICIgIHRoaXMtPmV2ZW50SGFuZGxlcl8tPnByZVdyaXRlKGN0eCwgIiA8PCBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiKTsiIDw8IGVuZGwKKyAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC0+d3JpdGVNZXNzYWdlQmVnaW4oXCIiCisgICAgICAgICAgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJcIiwgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfUkVQTFksIHNlcWlkKTsiIDw8IGVuZGwKKyAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LndyaXRlKG9wcm90KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LT53cml0ZU1lc3NhZ2VFbmQoKTsiCisgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAidWludDMyX3QgYnl0ZXMgPSBvcHJvdC0+Z2V0VHJhbnNwb3J0KCktPndyaXRlRW5kKCk7IiA8PCBlbmRsCisgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm9wcm90LT5nZXRUcmFuc3BvcnQoKS0+Zmx1c2goKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAiaWYgKHRoaXMtPmV2ZW50SGFuZGxlcl8uZ2V0KCkgIT0gTlVMTCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICIgIHRoaXMtPmV2ZW50SGFuZGxlcl8tPnBvc3RXcml0ZShjdHgsICIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIiwgYnl0ZXMpOyIgPDwgZW5kbAorICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gY29iKHRydWUpOyIgPDwgZW5kbDsKKyAgICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICAgIG91dCA8PCBlbmRsOworICAgIH0gLy8gZm9yIGVhY2ggZnVuY3Rpb24KKyAgfSAgIC8vIGNvYiBzdHlsZQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNrZWxldG9uIGZpbGUgb2YgYSBzZXJ2ZXIKKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgorICovCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9za2VsZXRvbih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBzdmNuYW1lID0gdHNlcnZpY2UtPmdldF9uYW1lKCk7CisKKyAgLy8gU2VydmljZSBpbXBsZW1lbnRhdGlvbiBmaWxlIGluY2x1ZGVzCisgIHN0cmluZyBmX3NrZWxldG9uX25hbWUgPSBnZXRfb3V0X2RpcigpICsgc3ZjbmFtZSArICJfc2VydmVyLnNrZWxldG9uLmNwcCI7CisKKyAgc3RyaW5nIG5zID0gbmFtZXNwYWNlX3ByZWZpeCh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWVzcGFjZSgiY3BwIikpOworCisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9za2VsZXRvbjsKKyAgZl9za2VsZXRvbi5vcGVuKGZfc2tlbGV0b25fbmFtZS5jX3N0cigpKTsKKyAgZl9za2VsZXRvbiA8PCAiLy8gVGhpcyBhdXRvZ2VuZXJhdGVkIHNrZWxldG9uIGZpbGUgaWxsdXN0cmF0ZXMgaG93IHRvIGJ1aWxkIGEgc2VydmVyLiIgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICIvLyBZb3Ugc2hvdWxkIGNvcHkgaXQgdG8gYW5vdGhlciBmaWxlbmFtZSB0byBhdm9pZCBvdmVyd3JpdGluZyBpdC4iIDw8IGVuZGwgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICIjaW5jbHVkZSBcIiIgPDwgZ2V0X2luY2x1ZGVfcHJlZml4KCpnZXRfcHJvZ3JhbSgpKSA8PCBzdmNuYW1lIDw8ICIuaFwiIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgIiNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgIiNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuaD4iIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAiI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oPiIgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICIjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPiIgPDwgZW5kbCA8PCBlbmRsCisgICAgICAgICAgICAgPDwgInVzaW5nIG5hbWVzcGFjZSA6OmFwYWNoZTo6dGhyaWZ0OyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICJ1c2luZyBuYW1lc3BhY2UgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgInVzaW5nIG5hbWVzcGFjZSA6OmFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgInVzaW5nIG5hbWVzcGFjZSA6OmFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXI7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gdGhlIGZvbGxvd2luZyBjb2RlIHdvdWxkIG5vdCBjb21waWxlOgorICAvLyB1c2luZyBuYW1lc3BhY2UgOworICAvLyB1c2luZyBuYW1lc3BhY2UgOjo7CisgIGlmICgoIW5zLmVtcHR5KCkpICYmIChucy5jb21wYXJlKCIgOjoiKSAhPSAwKSkgeworICAgIGZfc2tlbGV0b24gPDwgInVzaW5nIG5hbWVzcGFjZSAiIDw8IHN0cmluZyhucywgMCwgbnMuc2l6ZSgpIC0gMikgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIGZfc2tlbGV0b24gPDwgImNsYXNzICIgPDwgc3ZjbmFtZSA8PCAiSGFuZGxlciA6IHZpcnR1YWwgcHVibGljICIgPDwgc3ZjbmFtZSA8PCAiSWYgeyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICIgcHVibGljOiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfc2tlbGV0b24gPDwgaW5kZW50KCkgPDwgc3ZjbmFtZSA8PCAiSGFuZGxlcigpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAiICAvLyBZb3VyIGluaXRpYWxpemF0aW9uIGdvZXMgaGVyZSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGdlbmVyYXRlX2phdmFfZG9jKGZfc2tlbGV0b24sICpmX2l0ZXIpOworICAgIGZfc2tlbGV0b24gPDwgaW5kZW50KCkgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIsICIiKSA8PCAiIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICIgIC8vIFlvdXIgaW1wbGVtZW50YXRpb24gZ29lcyBoZXJlIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHByaW50ZihcIiIKKyAgICAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXFxuXCIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9za2VsZXRvbiA8PCAifTsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBmX3NrZWxldG9uIDw8IGluZGVudCgpIDw8ICJpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX3NrZWxldG9uCisgICAgICA8PCBpbmRlbnQoKSA8PCAiaW50IHBvcnQgPSA5MDkwOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiOjpzdGQ6OnNoYXJlZF9wdHI8IiA8PCBzdmNuYW1lCisgICAgICA8PCAiSGFuZGxlcj4gaGFuZGxlcihuZXcgIiA8PCBzdmNuYW1lIDw8ICJIYW5kbGVyKCkpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIjo6c3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvcihuZXcgIiA8PCBzdmNuYW1lIDw8ICJQcm9jZXNzb3IoaGFuZGxlcikpOyIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgIjo6c3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+IHNlcnZlclRyYW5zcG9ydChuZXcgVFNlcnZlclNvY2tldChwb3J0KSk7IgorICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIjo6c3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiB0cmFuc3BvcnRGYWN0b3J5KG5ldyBUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KCkpOyIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgIjo6c3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeShuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKTsiCisgICAgICA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJUU2ltcGxlU2VydmVyIHNlcnZlcihwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KTsiCisgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJzZXJ2ZXIuc2VydmUoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJldHVybiAwOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9za2VsZXRvbiA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIENsb3NlIHRoZSBmaWxlcworICBmX3NrZWxldG9uLmNsb3NlKCk7Cit9CisKKy8qKgorICogRGVzZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCisgKi8KK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHN1ZmZpeCkgeworICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisKKyAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgREVTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICB9CisKKyAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkgKyBzdWZmaXg7CisKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIG5hbWUsIGlzX3JlZmVyZW5jZSh0ZmllbGQpKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIG5hbWUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgInhmZXIgKz0gaXByb3QtPiI7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICBvdXQgPDwgInJlYWRCaW5hcnkoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgInJlYWRTdHJpbmcoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICBvdXQgPDwgInJlYWRCb29sKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIG91dCA8PCAicmVhZEJ5dGUoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIG91dCA8PCAicmVhZEkxNigiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgb3V0IDw8ICJyZWFkSTMyKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICBvdXQgPDwgInJlYWRJNjQoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIG91dCA8PCAicmVhZERvdWJsZSgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEMrKyByZWFkZXIgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKSArIG5hbWU7CisgICAgfQorICAgIG91dCA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHN0cmluZyB0ID0gdG1wKCJlY2FzdCIpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaW50MzJfdCAiIDw8IHQgPDwgIjsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gaXByb3QtPnJlYWRJMzIoIiA8PCB0CisgICAgICAgIDw8ICIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBuYW1lIDw8ICIgPSAoIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIikiIDw8IHQgPDwgIjsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gREVTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCisgICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYW4gdW5zZXJpYWxpemVyIGZvciBhIHZhcmlhYmxlLiBUaGlzIG1ha2VzIHR3byBrZXkgYXNzdW1wdGlvbnMsCisgKiBmaXJzdCB0aGF0IHRoZXJlIGlzIGEgY29uc3QgY2hhciogdmFyaWFibGUgbmFtZWQgZGF0YSB0aGF0IHBvaW50cyB0byB0aGUKKyAqIGJ1ZmZlciBmb3IgZGVzZXJpYWxpemF0aW9uLCBhbmQgdGhhdCB0aGVyZSBpcyBhIHZhcmlhYmxlIHByb3RvY29sIHdoaWNoCisgKiBpcyBhIHJlZmVyZW5jZSB0byBhIFRQcm90b2NvbCBzZXJpYWxpemF0aW9uIG9iamVjdC4KKyAqLwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHBvaW50ZXIpIHsKKyAgaWYgKHBvaW50ZXIpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCEiIDw8IHByZWZpeCA8PCAiKSB7ICIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICAiIDw8IHByZWZpeCA8PCAiID0gOjpzdGQ6OnNoYXJlZF9wdHI8IiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIj4obmV3ICIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIik7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJ4ZmVyICs9ICIgPDwgcHJlZml4IDw8ICItPnJlYWQoaXByb3QpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiYm9vbCB3YXNTZXQgPSBmYWxzZTsiIDw8IGVuZGw7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICAgIGZvciAoZl9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBmX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKytmX2l0ZXIpIHsKKworICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IHByZWZpeCA8PCAiLT5fX2lzc2V0LiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICA8PCAiKSB7IHdhc1NldCA9IHRydWU7IH0iIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudChvdXQpIDw8ICJpZiAoIXdhc1NldCkgeyAiIDw8IHByZWZpeCA8PCAiLnJlc2V0KCk7IH0iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgInhmZXIgKz0gIiA8PCBwcmVmaXggPDwgIi5yZWFkKGlwcm90KTsiIDw8IGVuZGw7CisgIH0KK30KKwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgpIHsKKyAgc2NvcGVfdXAob3V0KTsKKworICBzdHJpbmcgc2l6ZSA9IHRtcCgiX3NpemUiKTsKKyAgc3RyaW5nIGt0eXBlID0gdG1wKCJfa3R5cGUiKTsKKyAgc3RyaW5nIHZ0eXBlID0gdG1wKCJfdnR5cGUiKTsKKyAgc3RyaW5nIGV0eXBlID0gdG1wKCJfZXR5cGUiKTsKKworICB0X2NvbnRhaW5lciogdGNvbnRhaW5lciA9ICh0X2NvbnRhaW5lciopdHR5cGU7CisgIGJvb2wgdXNlX3B1c2ggPSB0Y29udGFpbmVyLT5oYXNfY3BwX25hbWUoKTsKKworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi5jbGVhcigpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAidWludDMyX3QgIiA8PCBzaXplIDw8ICI7IiA8PCBlbmRsOworCisgIC8vIERlY2xhcmUgdmFyaWFibGVzLCByZWFkIGhlYWRlcgorICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFR5cGUgIiA8PCBrdHlwZSA8PCAiOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRUeXBlICIgPDwgdnR5cGUgPDwgIjsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgInhmZXIgKz0gaXByb3QtPnJlYWRNYXBCZWdpbigiIDw8IGt0eXBlIDw8ICIsICIgPDwgdnR5cGUgPDwgIiwgIiA8PCBzaXplIDw8ICIpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUVHlwZSAiIDw8IGV0eXBlIDw8ICI7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICJ4ZmVyICs9IGlwcm90LT5yZWFkU2V0QmVnaW4oIiA8PCBldHlwZSA8PCAiLCAiIDw8IHNpemUgPDwgIik7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUVHlwZSAiIDw8IGV0eXBlIDw8ICI7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICJ4ZmVyICs9IGlwcm90LT5yZWFkTGlzdEJlZ2luKCIgPDwgZXR5cGUgPDwgIiwgIiA8PCBzaXplIDw8ICIpOyIgPDwgZW5kbDsKKyAgICBpZiAoIXVzZV9wdXNoKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi5yZXNpemUoIiA8PCBzaXplIDw8ICIpOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICAvLyBGb3IgbG9vcCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzCisgIHN0cmluZyBpID0gdG1wKCJfaSIpOworICBvdXQgPDwgaW5kZW50KCkgPDwgInVpbnQzMl90ICIgPDwgaSA8PCAiOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiZm9yICgiIDw8IGkgPDwgIiA9IDA7ICIgPDwgaQorICAgICAgPDwgIiA8ICIgPDwgc2l6ZSA8PCAiOyArKyIgPDwgaSA8PCAiKSIgPDwgZW5kbDsKKworICBzY29wZV91cChvdXQpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIHByZWZpeCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBwcmVmaXgpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgcHJlZml4LCB1c2VfcHVzaCwgaSk7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7CisKKyAgLy8gUmVhZCBjb250YWluZXIgZW5kCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAieGZlciArPSBpcHJvdC0+cmVhZE1hcEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAieGZlciArPSBpcHJvdC0+cmVhZFNldEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgInhmZXIgKz0gaXByb3QtPnJlYWRMaXN0RW5kKCk7IiA8PCBlbmRsOworICB9CisKKyAgc2NvcGVfZG93bihvdXQpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBjb2RlIHRvIGRlc2VyaWFsaXplIGEgbWFwCisgKi8KK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdHJpbmcgcHJlZml4KSB7CisgIHN0cmluZyBrZXkgPSB0bXAoIl9rZXkiKTsKKyAgc3RyaW5nIHZhbCA9IHRtcCgiX3ZhbCIpOworICB0X2ZpZWxkIGZrZXkodG1hcC0+Z2V0X2tleV90eXBlKCksIGtleSk7CisgIHRfZmllbGQgZnZhbCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdmFsKTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgZGVjbGFyZV9maWVsZCgmZmtleSkgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZma2V5KTsKKyAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZnZhbCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgdHJ1ZSkgPDwgIiA9ICIgPDwgcHJlZml4IDw8ICJbIiA8PCBrZXkKKyAgICAgICAgICAgICAgPDwgIl07IiA8PCBlbmRsOworCisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZ2YWwpOworfQorCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIHByZWZpeCkgeworICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKKyAgdF9maWVsZCBmZWxlbSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOworCisgIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZlbGVtKSA8PCBlbmRsOworCisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKKworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi5pbnNlcnQoIiA8PCBlbGVtIDw8ICIpOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdXNlX3B1c2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpbmRleCkgeworICBpZiAodXNlX3B1c2gpIHsKKyAgICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKKyAgICB0X2ZpZWxkIGZlbGVtKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOworICAgIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZlbGVtKSA8PCBlbmRsOworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKKyAgICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi5wdXNoX2JhY2soIiA8PCBlbGVtIDw8ICIpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICB0X2ZpZWxkIGZlbGVtKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIHByZWZpeCArICJbIiArIGluZGV4ICsgIl0iKTsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7CisgIH0KK30KKworLyoqCisgKiBTZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCisgKgorICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQgdG8gc2VyaWFsaXplCisgKiBAcGFyYW0gcHJlZml4IE5hbWUgdG8gcHJlcGVuZCB0byBmaWVsZCBuYW1lCisgKi8KK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBzdWZmaXgpIHsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworCisgIHN0cmluZyBuYW1lID0gcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpICsgc3VmZml4OworCisgIC8vIERvIG5vdGhpbmcgZm9yIHZvaWQgdHlwZXMKKyAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIG5hbWU7CisgIH0KKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIG5hbWUsIGlzX3JlZmVyZW5jZSh0ZmllbGQpKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKKworICAgIGluZGVudChvdXQpIDw8ICJ4ZmVyICs9IG9wcm90LT4iOworCisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgICAgb3V0IDw8ICJ3cml0ZUJpbmFyeSgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgPDwgIndyaXRlU3RyaW5nKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICBvdXQgPDwgIndyaXRlQm9vbCgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICBvdXQgPDwgIndyaXRlQnl0ZSgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUkxNigiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUkzMigiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUk2NCgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgb3V0IDw8ICJ3cml0ZURvdWJsZSgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEMrKyB3cml0ZXIgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKQorICAgICAgICAgICAgKyBuYW1lOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICBvdXQgPDwgIndyaXRlSTMyKChpbnQzMl90KSIgPDwgbmFtZSA8PCAiKTsiOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCisgICAgICAgICAgIG5hbWUuY19zdHIoKSwKKyAgICAgICAgICAgdHlwZV9uYW1lKHR5cGUpLmNfc3RyKCkpOworICB9Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhbGwgdGhlIG1lbWJlcnMgb2YgYSBzdHJ1Y3QuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCB0byBzZXJpYWxpemUKKyAqIEBwYXJhbSBwcmVmaXggIFN0cmluZyBwcmVmaXggdG8gYXR0YWNoIHRvIGFsbCBmaWVsZHMKKyAqLwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwb2ludGVyKSB7CisgIGlmIChwb2ludGVyKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IHByZWZpeCA8PCAiKSB7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgIHhmZXIgKz0gIiA8PCBwcmVmaXggPDwgIi0+d3JpdGUob3Byb3QpOyAiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIn0gZWxzZSB7IgorICAgICAgICAgICAgICAgIDw8ICJvcHJvdC0+d3JpdGVTdHJ1Y3RCZWdpbihcIiIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiXCIpOyAiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgb3Byb3QtPndyaXRlU3RydWN0RW5kKCk7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgIG9wcm90LT53cml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCAieGZlciArPSAiIDw8IHByZWZpeCA8PCAiLndyaXRlKG9wcm90KTsiIDw8IGVuZGw7CisgIH0KK30KKwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4KSB7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJ4ZmVyICs9IG9wcm90LT53cml0ZU1hcEJlZ2luKCIgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpCisgICAgICAgICAgICAgICAgPDwgIiwgIiA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwgIgorICAgICAgICAgICAgICAgIDw8ICJzdGF0aWNfY2FzdDx1aW50MzJfdD4oIiA8PCBwcmVmaXggPDwgIi5zaXplKCkpKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgInhmZXIgKz0gb3Byb3QtPndyaXRlU2V0QmVnaW4oIiA8PCB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpCisgICAgICAgICAgICAgICAgPDwgIiwgIgorICAgICAgICAgICAgICAgIDw8ICJzdGF0aWNfY2FzdDx1aW50MzJfdD4oIiA8PCBwcmVmaXggPDwgIi5zaXplKCkpKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJ4ZmVyICs9IG9wcm90LT53cml0ZUxpc3RCZWdpbigiCisgICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgIgorICAgICAgICAgICAgICAgIDw8ICJzdGF0aWNfY2FzdDx1aW50MzJfdD4oIiA8PCBwcmVmaXggPDwgIi5zaXplKCkpKTsiIDw8IGVuZGw7CisgIH0KKworICBzdHJpbmcgaXRlciA9IHRtcCgiX2l0ZXIiKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8IHR5cGVfbmFtZSh0dHlwZSkgPDwgIjo6Y29uc3RfaXRlcmF0b3IgIiA8PCBpdGVyIDw8ICI7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiZm9yICgiIDw8IGl0ZXIgPDwgIiA9ICIgPDwgcHJlZml4IDw8ICIuYmVnaW4oKTsgIiA8PCBpdGVyIDw8ICIgIT0gIiA8PCBwcmVmaXgKKyAgICAgIDw8ICIuZW5kKCk7ICsrIiA8PCBpdGVyIDw8ICIpIiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgaXRlcik7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgaXRlcik7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgaXRlcik7CisgIH0KKyAgc2NvcGVfZG93bihvdXQpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAieGZlciArPSBvcHJvdC0+d3JpdGVNYXBFbmQoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgInhmZXIgKz0gb3Byb3QtPndyaXRlU2V0RW5kKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAieGZlciArPSBvcHJvdC0+d3JpdGVMaXN0RW5kKCk7IiA8PCBlbmRsOworICB9CisKKyAgc2NvcGVfZG93bihvdXQpOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBtYXAuCisgKgorICovCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0cmluZyBpdGVyKSB7CisgIHRfZmllbGQga2ZpZWxkKHRtYXAtPmdldF9rZXlfdHlwZSgpLCBpdGVyICsgIi0+Zmlyc3QiKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmtmaWVsZCwgIiIpOworCisgIHRfZmllbGQgdmZpZWxkKHRtYXAtPmdldF92YWxfdHlwZSgpLCBpdGVyICsgIi0+c2Vjb25kIik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZ2ZmllbGQsICIiKTsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgc2V0LgorICovCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBpdGVyKSB7CisgIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgIigqIiArIGl0ZXIgKyAiKSIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIik7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIGxpc3QuCisgKi8KK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RyaW5nIGl0ZXIpIHsKKyAgdF9maWVsZCBlZmllbGQodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgIigqIiArIGl0ZXIgKyAiKSIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIik7Cit9CisKKy8qKgorICogTWFrZXMgYSA6OiBwcmVmaXggZm9yIGEgbmFtZXNwYWNlCisgKgorICogQHBhcmFtIG5zIFRoZSBuYW1lc3BhY2UsIHcvIHBlcmlvZHMgaW4gaXQKKyAqIEByZXR1cm4gTmFtZXNwYWNlcworICovCitzdHJpbmcgdF9jcHBfZ2VuZXJhdG9yOjpuYW1lc3BhY2VfcHJlZml4KHN0cmluZyBucykgeworICAvLyBBbHdheXMgc3RhcnQgd2l0aCAiOjoiLCB0byBhdm9pZCBwb3NzaWJsZSBuYW1lIGNvbGxpc2lvbnMgd2l0aAorICAvLyBvdGhlciBuYW1lcyBpbiBvbmUgb2YgdGhlIGN1cnJlbnQgbmFtZXNwYWNlcy4KKyAgLy8KKyAgLy8gV2UgYWxzbyBuZWVkIGEgbGVhZGluZyBzcGFjZSwgaW4gY2FzZSB0aGUgbmFtZSBpcyB1c2VkIGluc2lkZSBvZiBhCisgIC8vIHRlbXBsYXRlIHBhcmFtZXRlci4gICJNeVRlbXBsYXRlPDo6Zm9vOjpCYXI+IiBpcyBub3QgdmFsaWQgQysrLAorICAvLyBzaW5jZSAiPDoiIGlzIGFuIGFsdGVybmF0aXZlIHRva2VuIGZvciAiWyIuCisgIHN0cmluZyByZXN1bHQgPSAiIDo6IjsKKworICBpZiAobnMuc2l6ZSgpID09IDApIHsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisgIHN0cmluZzo6c2l6ZV90eXBlIGxvYzsKKyAgd2hpbGUgKChsb2MgPSBucy5maW5kKCIuIikpICE9IHN0cmluZzo6bnBvcykgeworICAgIHJlc3VsdCArPSBucy5zdWJzdHIoMCwgbG9jKTsKKyAgICByZXN1bHQgKz0gIjo6IjsKKyAgICBucyA9IG5zLnN1YnN0cihsb2MgKyAxKTsKKyAgfQorICBpZiAobnMuc2l6ZSgpID4gMCkgeworICAgIHJlc3VsdCArPSBucyArICI6OiI7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBPcGVucyBuYW1lc3BhY2UuCisgKgorICogQHBhcmFtIG5zIFRoZSBuYW1lc3BhY2UsIHcvIHBlcmlvZHMgaW4gaXQKKyAqIEByZXR1cm4gTmFtZXNwYWNlcworICovCitzdHJpbmcgdF9jcHBfZ2VuZXJhdG9yOjpuYW1lc3BhY2Vfb3BlbihzdHJpbmcgbnMpIHsKKyAgaWYgKG5zLnNpemUoKSA9PSAwKSB7CisgICAgcmV0dXJuICIiOworICB9CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKyAgc3RyaW5nIHNlcGFyYXRvciA9ICIiOworICBzdHJpbmc6OnNpemVfdHlwZSBsb2M7CisgIHdoaWxlICgobG9jID0gbnMuZmluZCgiLiIpKSAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICByZXN1bHQgKz0gc2VwYXJhdG9yOworICAgIHJlc3VsdCArPSAibmFtZXNwYWNlICI7CisgICAgcmVzdWx0ICs9IG5zLnN1YnN0cigwLCBsb2MpOworICAgIHJlc3VsdCArPSAiIHsiOworICAgIHNlcGFyYXRvciA9ICIgIjsKKyAgICBucyA9IG5zLnN1YnN0cihsb2MgKyAxKTsKKyAgfQorICBpZiAobnMuc2l6ZSgpID4gMCkgeworICAgIHJlc3VsdCArPSBzZXBhcmF0b3IgKyAibmFtZXNwYWNlICIgKyBucyArICIgeyI7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBDbG9zZXMgbmFtZXNwYWNlLgorICoKKyAqIEBwYXJhbSBucyBUaGUgbmFtZXNwYWNlLCB3LyBwZXJpb2RzIGluIGl0CisgKiBAcmV0dXJuIE5hbWVzcGFjZXMKKyAqLworc3RyaW5nIHRfY3BwX2dlbmVyYXRvcjo6bmFtZXNwYWNlX2Nsb3NlKHN0cmluZyBucykgeworICBpZiAobnMuc2l6ZSgpID09IDApIHsKKyAgICByZXR1cm4gIiI7CisgIH0KKyAgc3RyaW5nIHJlc3VsdCA9ICJ9IjsKKyAgc3RyaW5nOjpzaXplX3R5cGUgbG9jOworICB3aGlsZSAoKGxvYyA9IG5zLmZpbmQoIi4iKSkgIT0gc3RyaW5nOjpucG9zKSB7CisgICAgcmVzdWx0ICs9ICJ9IjsKKyAgICBucyA9IG5zLnN1YnN0cihsb2MgKyAxKTsKKyAgfQorICByZXN1bHQgKz0gIiAvLyBuYW1lc3BhY2UiOworICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIFJldHVybnMgYSBDKysgdHlwZSBuYW1lCisgKgorICogQHBhcmFtIHR0eXBlIFRoZSB0eXBlCisgKiBAcmV0dXJuIFN0cmluZyBvZiB0aGUgdHlwZSBuYW1lLCBpLmUuIHN0ZDo6c2V0PHR5cGU+CisgKi8KK3N0cmluZyB0X2NwcF9nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLCBib29sIGluX3R5cGVkZWYsIGJvb2wgYXJnKSB7CisgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICBzdHJpbmcgYm5hbWUgPSBiYXNlX3R5cGVfbmFtZSgoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCkpOworICAgIHN0ZDo6bWFwPHN0cmluZywgc3RyaW5nPjo6aXRlcmF0b3IgaXQgPSB0dHlwZS0+YW5ub3RhdGlvbnNfLmZpbmQoImNwcC50eXBlIik7CisgICAgaWYgKGl0ICE9IHR0eXBlLT5hbm5vdGF0aW9uc18uZW5kKCkpIHsKKyAgICAgIGJuYW1lID0gaXQtPnNlY29uZDsKKyAgICB9CisKKyAgICBpZiAoIWFyZykgeworICAgICAgcmV0dXJuIGJuYW1lOworICAgIH0KKworICAgIGlmICgoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCkgPT0gdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HKSB7CisgICAgICByZXR1cm4gImNvbnN0ICIgKyBibmFtZSArICImIjsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuICJjb25zdCAiICsgYm5hbWU7CisgICAgfQorICB9CisKKyAgLy8gQ2hlY2sgZm9yIGEgY3VzdG9tIG92ZXJsb2FkZWQgQysrIG5hbWUKKyAgaWYgKHR0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIHN0cmluZyBjbmFtZTsKKworICAgIHRfY29udGFpbmVyKiB0Y29udGFpbmVyID0gKHRfY29udGFpbmVyKil0dHlwZTsKKyAgICBpZiAodGNvbnRhaW5lci0+aGFzX2NwcF9uYW1lKCkpIHsKKyAgICAgIGNuYW1lID0gdGNvbnRhaW5lci0+Z2V0X2NwcF9uYW1lKCk7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICAgIHRfbWFwKiB0bWFwID0gKHRfbWFwKil0dHlwZTsKKyAgICAgIGNuYW1lID0gInN0ZDo6bWFwPCIgKyB0eXBlX25hbWUodG1hcC0+Z2V0X2tleV90eXBlKCksIGluX3R5cGVkZWYpICsgIiwgIgorICAgICAgICAgICAgICArIHR5cGVfbmFtZSh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgaW5fdHlwZWRlZikgKyAiPiAiOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgICB0X3NldCogdHNldCA9ICh0X3NldCopdHR5cGU7CisgICAgICBjbmFtZSA9ICJzdGQ6OnNldDwiICsgdHlwZV9uYW1lKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgaW5fdHlwZWRlZikgKyAiPiAiOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgdF9saXN0KiB0bGlzdCA9ICh0X2xpc3QqKXR0eXBlOworICAgICAgY25hbWUgPSAic3RkOjp2ZWN0b3I8IiArIHR5cGVfbmFtZSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBpbl90eXBlZGVmKSArICI+ICI7CisgICAgfQorCisgICAgaWYgKGFyZykgeworICAgICAgcmV0dXJuICJjb25zdCAiICsgY25hbWUgKyAiJiI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBjbmFtZTsKKyAgICB9CisgIH0KKworICBzdHJpbmcgY2xhc3NfcHJlZml4OworICBpZiAoaW5fdHlwZWRlZiAmJiAodHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpKSkgeworICAgIGNsYXNzX3ByZWZpeCA9ICJjbGFzcyAiOworICB9CisKKyAgLy8gQ2hlY2sgaWYgaXQgbmVlZHMgdG8gYmUgbmFtZXNwYWNlZAorICBzdHJpbmcgcG5hbWU7CisgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR0eXBlLT5nZXRfcHJvZ3JhbSgpOworICBpZiAocHJvZ3JhbSAhPSBOVUxMICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pIHsKKyAgICBwbmFtZSA9IGNsYXNzX3ByZWZpeCArIG5hbWVzcGFjZV9wcmVmaXgocHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiY3BwIikpICsgdHR5cGUtPmdldF9uYW1lKCk7CisgIH0gZWxzZSB7CisgICAgcG5hbWUgPSBjbGFzc19wcmVmaXggKyB0dHlwZS0+Z2V0X25hbWUoKTsKKyAgfQorCisgIGlmICh0dHlwZS0+aXNfZW51bSgpICYmICFnZW5fcHVyZV9lbnVtc18pIHsKKyAgICBwbmFtZSArPSAiOjp0eXBlIjsKKyAgfQorCisgIGlmIChhcmcpIHsKKyAgICBpZiAoaXNfY29tcGxleF90eXBlKHR0eXBlKSkgeworICAgICAgcmV0dXJuICJjb25zdCAiICsgcG5hbWUgKyAiJiI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAiY29uc3QgIiArIHBuYW1lOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gcG5hbWU7CisgIH0KK30KKworLyoqCisgKiBSZXR1cm5zIHRoZSBDKysgdHlwZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSB0aHJpZnQgdHlwZS4KKyAqCisgKiBAcGFyYW0gdGJhc2UgVGhlIGJhc2UgdHlwZQorICogQHJldHVybiBFeHBsaWNpdCBDKysgdHlwZSwgaS5lLiAiaW50MzJfdCIKKyAqLworc3RyaW5nIHRfY3BwX2dlbmVyYXRvcjo6YmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSkgeworICBzd2l0Y2ggKHRiYXNlKSB7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICByZXR1cm4gInZvaWQiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICByZXR1cm4gInN0ZDo6c3RyaW5nIjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgIHJldHVybiAiYm9vbCI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgcmV0dXJuICJpbnQ4X3QiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICByZXR1cm4gImludDE2X3QiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICByZXR1cm4gImludDMyX3QiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICByZXR1cm4gImludDY0X3QiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICByZXR1cm4gImRvdWJsZSI7CisgIGRlZmF1bHQ6CisgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBDKysgYmFzZSB0eXBlIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgfQorfQorCisvKioKKyAqIERlY2xhcmVzIGEgZmllbGQsIHdoaWNoIG1heSBpbmNsdWRlIGluaXRpYWxpemF0aW9uIGFzIG5lY2Vzc2FyeS4KKyAqCisgKiBAcGFyYW0gdHR5cGUgVGhlIHR5cGUKKyAqIEByZXR1cm4gRmllbGQgZGVjbGFyYXRpb24sIGkuZS4gaW50IHggPSAwOworICovCitzdHJpbmcgdF9jcHBfZ2VuZXJhdG9yOjpkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHBvaW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY29uc3RhbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVmZXJlbmNlKSB7CisgIC8vIFRPRE8obWNzbGVlKTogZG8gd2UgZXZlciBuZWVkIHRvIGluaXRpYWxpemUgdGhlIGZpZWxkPworICBzdHJpbmcgcmVzdWx0ID0gIiI7CisgIGlmIChjb25zdGFudCkgeworICAgIHJlc3VsdCArPSAiY29uc3QgIjsKKyAgfQorICByZXN1bHQgKz0gdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisgIGlmIChpc19yZWZlcmVuY2UodGZpZWxkKSkgeworICAgIHJlc3VsdCA9ICI6OnN0ZDo6c2hhcmVkX3B0cjwiICsgcmVzdWx0ICsgIj4iOworICB9CisgIGlmIChwb2ludGVyKSB7CisgICAgcmVzdWx0ICs9ICIqIjsKKyAgfQorICBpZiAocmVmZXJlbmNlKSB7CisgICAgcmVzdWx0ICs9ICImIjsKKyAgfQorICByZXN1bHQgKz0gIiAiICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICBpZiAoaW5pdCkgeworICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICByZXN1bHQgKz0gIiA9IGZhbHNlIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICByZXN1bHQgKz0gIiA9IDAiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICByZXN1bHQgKz0gIiA9IChkb3VibGUpMCI7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBDKysgaW5pdGlhbGl6ZXIgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgcmVzdWx0ICs9ICIgPSAoIiArIHR5cGVfbmFtZSh0eXBlKSArICIpMCI7CisgICAgfQorICB9CisgIGlmICghcmVmZXJlbmNlKSB7CisgICAgcmVzdWx0ICs9ICI7IjsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGZvcm0gJ3R5cGUgbmFtZShhcmdzKScKKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KKyAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KKyAqLworc3RyaW5nIHRfY3BwX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgc3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG5hbWVfcGFyYW1zKSB7CisgIHRfdHlwZSogdHR5cGUgPSB0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCk7CisgIHRfc3RydWN0KiBhcmdsaXN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOworICBib29sIGhhc194Y2VwdGlvbnMgPSAhdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCktPmdldF9tZW1iZXJzKCkuZW1wdHkoKTsKKworICBpZiAoc3R5bGUgPT0gIiIpIHsKKyAgICBpZiAoaXNfY29tcGxleF90eXBlKHR0eXBlKSkgeworICAgICAgcmV0dXJuICJ2b2lkICIgKyBwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiKCIgKyB0eXBlX25hbWUodHR5cGUpCisgICAgICAgICAgICAgKyAobmFtZV9wYXJhbXMgPyAiJiBfcmV0dXJuIiA6ICImIC8qIF9yZXR1cm4gKi8iKQorICAgICAgICAgICAgICsgYXJndW1lbnRfbGlzdChhcmdsaXN0LCBuYW1lX3BhcmFtcywgdHJ1ZSkgKyAiKSI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiB0eXBlX25hbWUodHR5cGUpICsgIiAiICsgcHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIigiCisgICAgICAgICAgICAgKyBhcmd1bWVudF9saXN0KGFyZ2xpc3QsIG5hbWVfcGFyYW1zKSArICIpIjsKKyAgICB9CisgIH0gZWxzZSBpZiAoc3R5bGUuc3Vic3RyKDAsIDMpID09ICJDb2IiKSB7CisgICAgc3RyaW5nIGNvYl90eXBlOworICAgIHN0cmluZyBleG5fY29iOworICAgIGlmIChzdHlsZSA9PSAiQ29iQ2wiKSB7CisgICAgICBjb2JfdHlwZSA9ICIoIiArIHNlcnZpY2VfbmFtZV8gKyAiQ29iQ2xpZW50IjsKKyAgICAgIGlmIChnZW5fdGVtcGxhdGVzXykgeworICAgICAgICBjb2JfdHlwZSArPSAiVDxQcm90b2NvbF8+IjsKKyAgICAgIH0KKyAgICAgIGNvYl90eXBlICs9ICIqIGNsaWVudCkiOworICAgIH0gZWxzZSBpZiAoc3R5bGUgPT0gIkNvYlN2IikgeworICAgICAgY29iX3R5cGUgPSAodHR5cGUtPmlzX3ZvaWQoKSA/ICIoKSIgOiAoIigiICsgdHlwZV9uYW1lKHR0eXBlKSArICIgY29uc3QmIF9yZXR1cm4pIikpOworICAgICAgaWYgKGhhc194Y2VwdGlvbnMpIHsKKyAgICAgICAgZXhuX2NvYgorICAgICAgICAgICAgPSAiLCA6OnN0ZDo6ZnVuY3Rpb248dm9pZCg6OmFwYWNoZTo6dGhyaWZ0OjpURGVsYXllZEV4Y2VwdGlvbiogX3Rocm93KT4gLyogZXhuX2NvYiAqLyI7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHRocm93ICJVTktOT1dOIFNUWUxFIjsKKyAgICB9CisKKyAgICByZXR1cm4gInZvaWQgIiArIHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICIoOjpzdGQ6OmZ1bmN0aW9uPHZvaWQiICsgY29iX3R5cGUgKyAiPiBjb2IiCisgICAgICAgICAgICsgZXhuX2NvYiArIGFyZ3VtZW50X2xpc3QoYXJnbGlzdCwgbmFtZV9wYXJhbXMsIHRydWUpICsgIikiOworICB9IGVsc2UgeworICAgIHRocm93ICJVTktOT1dOIFNUWUxFIjsKKyAgfQorfQorCisvKioKKyAqIFJlbmRlcnMgYSBmaWVsZCBsaXN0CisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKiBAcmV0dXJuIENvbW1hIHNlcGVhcmF0ZWQgbGlzdCBvZiBhbGwgZmllbGQgbmFtZXMgaW4gdGhhdCBzdHJ1Y3QKKyAqLworc3RyaW5nIHRfY3BwX2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBuYW1lX3BhcmFtcywgYm9vbCBzdGFydF9jb21tYSkgeworICBzdHJpbmcgcmVzdWx0ID0gIiI7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBib29sIGZpcnN0ID0gIXN0YXJ0X2NvbW1hOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ICs9ICIsICI7CisgICAgfQorICAgIHJlc3VsdCArPSB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgdHJ1ZSkgKyAiICIKKyAgICAgICAgICAgICAgKyAobmFtZV9wYXJhbXMgPyAoKmZfaXRlciktPmdldF9uYW1lKCkgOiAiLyogIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICIgKi8iKTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgQysrIGVudW0gc3RyaW5nIGZvciB0aGUgZ2l2ZW4gdHlwZS4KKyAqCisgKiBAcGFyYW0gdHlwZSBUaHJpZnQgVHlwZQorICogQHJldHVybiBTdHJpbmcgb2YgQysrIGNvZGUgdG8gZGVmaW5pdGlvbiBvZiB0aGF0IHR5cGUgY29uc3RhbnQKKyAqLworc3RyaW5nIHRfY3BwX2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfU1RSSU5HIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0JPT0wiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZXR1cm4gIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0JZVEUiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmV0dXJuICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9JMTYiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmV0dXJuICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9JMzIiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9JNjQiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9ET1VCTEUiOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0kzMiI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkpIHsKKyAgICByZXR1cm4gIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1NUUlVDVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfU1RSVUNUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfTUFQIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfU0VUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0xJU1QiOworICB9CisKKyAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworfQorCitzdHJpbmcgdF9jcHBfZ2VuZXJhdG9yOjpnZXRfaW5jbHVkZV9wcmVmaXgoY29uc3QgdF9wcm9ncmFtJiBwcm9ncmFtKSBjb25zdCB7CisgIHN0cmluZyBpbmNsdWRlX3ByZWZpeCA9IHByb2dyYW0uZ2V0X2luY2x1ZGVfcHJlZml4KCk7CisgIGlmICghdXNlX2luY2x1ZGVfcHJlZml4XyB8fCAoaW5jbHVkZV9wcmVmaXguc2l6ZSgpID4gMCAmJiBpbmNsdWRlX3ByZWZpeFswXSA9PSAnLycpKSB7CisgICAgLy8gaWYgZmxhZyBpcyB0dXJuZWQgb2ZmIG9yIHRoaXMgaXMgYWJzb2x1dGUgcGF0aCwgcmV0dXJuIGVtcHR5IHByZWZpeAorICAgIHJldHVybiAiIjsKKyAgfQorCisgIHN0cmluZzo6c2l6ZV90eXBlIGxhc3Rfc2xhc2ggPSBzdHJpbmc6Om5wb3M7CisgIGlmICgobGFzdF9zbGFzaCA9IGluY2x1ZGVfcHJlZml4LnJmaW5kKCIvIikpICE9IHN0cmluZzo6bnBvcykgeworICAgIHJldHVybiBpbmNsdWRlX3ByZWZpeC5zdWJzdHIoMCwgbGFzdF9zbGFzaCkKKyAgICAgICAgICAgKyAoZ2V0X3Byb2dyYW0oKS0+aXNfb3V0X3BhdGhfYWJzb2x1dGUoKSA/ICIvIiA6ICIvIiArIG91dF9kaXJfYmFzZV8gKyAiLyIpOworICB9CisKKyAgcmV0dXJuICIiOworfQorCitUSFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKAorICAgIGNwcCwKKyAgICAiQysrIiwKKyAgICAiICAgIGNvYl9zdHlsZTogICAgICAgR2VuZXJhdGUgXCJDb250aW51YXRpb24gT0JqZWN0XCItc3R5bGUgY2xhc3Nlcy5cbiIKKyAgICAiICAgIG5vX2NsaWVudF9jb21wbGV0aW9uOlxuIgorICAgICIgICAgICAgICAgICAgICAgICAgICBPbWl0IGNhbGxzIHRvIGNvbXBsZXRpb25fXygpIGluIENvYkNsaWVudCBjbGFzcy5cbiIKKyAgICAiICAgIG5vX2RlZmF1bHRfb3BlcmF0b3JzOlxuIgorICAgICIgICAgICAgICAgICAgICAgICAgICBPbWl0cyBnZW5lcmF0aW9uIG9mIGRlZmF1bHQgb3BlcmF0b3JzID09LCAhPSBhbmQgPFxuIgorICAgICIgICAgdGVtcGxhdGVzOiAgICAgICBHZW5lcmF0ZSB0ZW1wbGF0aXplZCByZWFkZXIvd3JpdGVyIG1ldGhvZHMuXG4iCisgICAgIiAgICBwdXJlX2VudW1zOiAgICAgIEdlbmVyYXRlIHB1cmUgZW51bXMgaW5zdGVhZCBvZiB3cmFwcGVyIGNsYXNzZXMuXG4iCisgICAgIiAgICBpbmNsdWRlX3ByZWZpeDogIFVzZSBmdWxsIGluY2x1ZGUgcGF0aHMgaW4gZ2VuZXJhdGVkIGZpbGVzLlxuIgorICAgICIgICAgbW92ZWFibGVfdHlwZXM6ICBHZW5lcmF0ZSBtb3ZlIGNvbnN0cnVjdG9ycyBhbmQgYXNzaWdubWVudCBvcGVyYXRvcnMuXG4iCisgICAgIiAgICBub19vc3RyZWFtX29wZXJhdG9yczpcbiIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgT21pdCBnZW5lcmF0aW9uIG9mIG9zdHJlYW0gZGVmaW5pdGlvbnMuXG4iCisgICAgIiAgICBub19za2VsZXRvbjogICAgIE9taXRzIGdlbmVyYXRpb24gb2Ygc2tlbGV0b24uXG4iKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9jc2hhcnBfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9jc2hhcnBfZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkMWUyOWUKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2NzaGFycF9nZW5lcmF0b3IuY2MKQEAgLTAsMCArMSwzMjQ1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCisgKiBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgorICogZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8Y2Fzc2VydD4KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxjY3R5cGU+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHNzdHJlYW0+CisKKyNpbmNsdWRlICJ0aHJpZnQvcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9vb3BfZ2VuZXJhdG9yLmgiCisKK3VzaW5nIHN0ZDo6bWFwOwordXNpbmcgc3RkOjpvc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6dmVjdG9yOworCitzdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCisKK3N0cnVjdCBtZW1iZXJfbWFwcGluZ19zY29wZSB7CisgIHZvaWQqIHNjb3BlX21lbWJlcjsKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBtYXBwaW5nX3RhYmxlOworfTsKKworY2xhc3MgdF9jc2hhcnBfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7CitwdWJsaWM6CisgIHRfY3NoYXJwX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQorICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pIHsKKyAgICAodm9pZClvcHRpb25fc3RyaW5nOworCisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKworICAgIGFzeW5jXyA9IGZhbHNlOworICAgIG51bGxhYmxlXyA9IGZhbHNlOworICAgIGhhc2hjb2RlXyA9IGZhbHNlOworICAgIHVuaW9uXyA9IGZhbHNlOworICAgIHNlcmlhbGl6ZV8gPSBmYWxzZTsKKyAgICB3Y2ZfID0gZmFsc2U7CisgICAgd2NmX25hbWVzcGFjZV8uY2xlYXIoKTsKKyAgICBmb3IoIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5iZWdpbigpOyBpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJhc3luYyIpID09IDApIHsKKyAgICAgICAgYXN5bmNfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgibnVsbGFibGUiKSA9PSAwKSB7CisgICAgICAgIG51bGxhYmxlXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImhhc2hjb2RlIikgPT0gMCkgeworICAgICAgICBoYXNoY29kZV8gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJ1bmlvbiIpID09IDApIHsKKyAgICAgICAgdW5pb25fID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgic2VyaWFsIikgPT0gMCkgeworICAgICAgICBzZXJpYWxpemVfID0gdHJ1ZTsKKyAgICAgICAgd2NmX25hbWVzcGFjZV8gPSBpdGVyLT5zZWNvbmQ7IC8vIHNpbmNlIHRoZXJlIGNhbiBiZSBvbmx5IG9uZSBuYW1lc3BhY2UKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgid2NmIikgPT0gMCkgeworICAgICAgICB3Y2ZfID0gdHJ1ZTsKKyAgICAgICAgd2NmX25hbWVzcGFjZV8gPSBpdGVyLT5zZWNvbmQ7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24gY3NoYXJwOiIgKyBpdGVyLT5maXJzdDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1jc2hhcnAiOworICB9CisgIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKKyAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKKworICB2b2lkIGdlbmVyYXRlX2NvbnN0cyhzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKTsKKworICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZik7CisgIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3VuaW9uKHRfc3RydWN0KiB0dW5pb24pOworICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfcHJvcGVydHkob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaXNQdWJsaWMsIGJvb2wgZ2VuZXJhdGVJc3NldCk7CisgIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX3Byb3BlcnR5KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzUHVibGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2x1ZGVJc3NldCA9IHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkUHJlZml4ID0gIiIpOworICBib29sIHByaW50X2NvbnN0X3ZhbHVlKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fc3RhdGljLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVmdmFsID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBuZWVkdHlwZSA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKKyAgdm9pZCBwcmludF9jb25zdF9jb25zdHJ1Y3RvcihzdGQ6Om9zdHJlYW0mIG91dCwgc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyk7CisgIHZvaWQgcHJpbnRfY29uc3RfZGVmX3ZhbHVlKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKKworICB2b2lkIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9jc2hhcnBfdW5pb24odF9zdHJ1Y3QqIHR1bmlvbik7CisgIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9kZWZpbml0aW9uKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2NsYXNzID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0ID0gZmFsc2UpOworICB2b2lkIGdlbmVyYXRlX2NzaGFycF91bmlvbl9kZWZpbml0aW9uKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHVuaW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9jc2hhcnBfdW5pb25fY2xhc3Moc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0dW5pb24sIHRfZmllbGQqIHRmaWVsZCk7CisgIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX3djZmZhdWx0KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9yZWFkZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X3Jlc3VsdF93cml0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X3dyaXRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfdG9zdHJpbmcoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X2VxdWFscyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfaGFzaGNvZGUoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9jc2hhcnBfdW5pb25fcmVhZGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHVuaW9uKTsKKworICB2b2lkIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXBhcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZXModF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc3luY19zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9hc3luY19zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb21iaW5lZF9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zaWx2ZXJsaWdodF9hc3luY19tZXRob2RzKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcl9zeW5jKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyX2FzeW5jKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogZnVuY3Rpb24pOworICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb25fYXN5bmModF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogZnVuY3Rpb24pOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcHJvcGVydHlsZXNzID0gZmFsc2UpOworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfbGlzdCogbGlzdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19lbGVtZW50ID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcHJvcGVydHlsZXNzID0gZmFsc2UpOworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGl0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG1hcCk7CisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NldCogdG1hcCwgc3RkOjpzdHJpbmcgaXRlcik7CisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RkOjpzdHJpbmcgaXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9jc2hhcnBfZG9jKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiBmaWVsZCk7CisgIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX2RvYyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpOworICB2b2lkIGdlbmVyYXRlX2NzaGFycF9kb2Moc3RkOjpvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRkb2MpOworICB2b2lkIGdlbmVyYXRlX2NzaGFycF9kb2NzdHJpbmdfY29tbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgc3RyaW5nIGNvbnRlbnRzKTsKKworICB2b2lkIHN0YXJ0X2NzaGFycF9uYW1lc3BhY2Uoc3RkOjpvc3RyZWFtJiBvdXQpOworICB2b2lkIGVuZF9jc2hhcnBfbmFtZXNwYWNlKHN0ZDo6b3N0cmVhbSYgb3V0KTsKKworICBzdGQ6OnN0cmluZyBjc2hhcnBfdHlwZV91c2luZ3MoKTsKKyAgc3RkOjpzdHJpbmcgY3NoYXJwX3RocmlmdF91c2luZ3MoKTsKKworICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fY291bnRhaW5lciA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9pbml0ID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX3BhcmFtID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3JlcXVpcmVkID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZSogdGJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fY29udGFpbmVyID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fcGFyYW0gPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXF1aXJlZCA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdCA9IGZhbHNlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZV9hc3luY19iZWdpbih0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlX2FzeW5jX2VuZCh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlX2FzeW5jKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7CisgIHN0ZDo6c3RyaW5nIHByb3BfbmFtZSh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgc3VwcHJlc3NfbWFwcGluZyA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgZ2V0X2VudW1fY2xhc3NfbmFtZSh0X3R5cGUqIHR5cGUpOworCisgIGJvb2wgZmllbGRfaGFzX2RlZmF1bHQodF9maWVsZCogdGZpZWxkKSB7IHJldHVybiB0ZmllbGQtPmdldF92YWx1ZSgpICE9IE5VTEw7IH0KKworICBib29sIGZpZWxkX2lzX3JlcXVpcmVkKHRfZmllbGQqIHRmaWVsZCkgeyByZXR1cm4gdGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRDsgfQorCisgIGJvb2wgdHlwZV9jYW5fYmVfbnVsbCh0X3R5cGUqIHR0eXBlKSB7CisgICAgd2hpbGUgKHR0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICAgIHR0eXBlID0gKCh0X3R5cGVkZWYqKXR0eXBlKS0+Z2V0X3R5cGUoKTsKKyAgICB9CisKKyAgICByZXR1cm4gdHR5cGUtPmlzX2NvbnRhaW5lcigpIHx8IHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKQorICAgICAgICAgICB8fCB0dHlwZS0+aXNfc3RyaW5nKCk7CisgIH0KKworcHJpdmF0ZToKKyAgc3RkOjpzdHJpbmcgbmFtZXNwYWNlX25hbWVfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc2VydmljZV87CisgIHN0ZDo6c3RyaW5nIG5hbWVzcGFjZV9kaXJfOworICBib29sIGFzeW5jXzsKKyAgYm9vbCBudWxsYWJsZV87CisgIGJvb2wgdW5pb25fOworICBib29sIGhhc2hjb2RlXzsKKyAgYm9vbCBzZXJpYWxpemVfOworICBib29sIHdjZl87CisgIHN0ZDo6c3RyaW5nIHdjZl9uYW1lc3BhY2VfOworCisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IGNzaGFycF9rZXl3b3JkczsKKyAgc3RkOjp2ZWN0b3I8bWVtYmVyX21hcHBpbmdfc2NvcGU+ICBtZW1iZXJfbWFwcGluZ19zY29wZXM7CisKKyAgdm9pZCBpbml0X2tleXdvcmRzKCk7CisgIHN0ZDo6c3RyaW5nIG5vcm1hbGl6ZV9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpOworICBzdGQ6OnN0cmluZyBtYWtlX3ZhbGlkX2NzaGFycF9pZGVudGlmaWVyKHN0ZDo6c3RyaW5nIGNvbnN0JiBmcm9tTmFtZSk7CisgIHZvaWQgcHJlcGFyZV9tZW1iZXJfbmFtZV9tYXBwaW5nKHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBwcmVwYXJlX21lbWJlcl9uYW1lX21hcHBpbmcodm9pZCogc2NvcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgc3RydWN0bmFtZSk7CisgIHZvaWQgY2xlYW51cF9tZW1iZXJfbmFtZV9tYXBwaW5nKHZvaWQqIHNjb3BlKTsKKyAgc3RyaW5nIGdldF9tYXBwZWRfbWVtYmVyX25hbWUoc3RyaW5nIG9sZG5hbWUpOworfTsKKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgeworICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOworICBuYW1lc3BhY2VfbmFtZV8gPSBwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgiY3NoYXJwIik7CisKKyAgc3RyaW5nIGRpciA9IG5hbWVzcGFjZV9uYW1lXzsKKyAgc3RyaW5nIHN1YmRpciA9IGdldF9vdXRfZGlyKCkuY19zdHIoKTsKKyAgc3RyaW5nOjpzaXplX3R5cGUgbG9jOworCisgIHdoaWxlICgobG9jID0gZGlyLmZpbmQoIi4iKSkgIT0gc3RyaW5nOjpucG9zKSB7CisgICAgc3ViZGlyID0gc3ViZGlyICsgIi8iICsgZGlyLnN1YnN0cigwLCBsb2MpOworICAgIE1LRElSKHN1YmRpci5jX3N0cigpKTsKKyAgICBkaXIgPSBkaXIuc3Vic3RyKGxvYyArIDEpOworICB9CisgIGlmIChkaXIuc2l6ZSgpID4gMCkgeworICAgIHN1YmRpciA9IHN1YmRpciArICIvIiArIGRpcjsKKyAgICBNS0RJUihzdWJkaXIuY19zdHIoKSk7CisgIH0KKworICBuYW1lc3BhY2VfZGlyXyA9IHN1YmRpcjsKKyAgaW5pdF9rZXl3b3JkcygpOworCisgIHdoaWxlKCAhIG1lbWJlcl9tYXBwaW5nX3Njb3Blcy5lbXB0eSgpKSB7CisgICAgY2xlYW51cF9tZW1iZXJfbmFtZV9tYXBwaW5nKCBtZW1iZXJfbWFwcGluZ19zY29wZXMuYmFjaygpLnNjb3BlX21lbWJlcik7CisgIH0KKworICBwdmVyYm9zZSgiQyMgb3B0aW9uczpcbiIpOworICBwdmVyYm9zZSgiLSBhc3luYyAuLi4uLi4gJXNcbiIsIChhc3luY18gPyAiT04iIDogIm9mZiIpKTsKKyAgcHZlcmJvc2UoIi0gbnVsbGFibGUgLi4uICVzXG4iLCAobnVsbGFibGVfID8gIk9OIiA6ICJvZmYiKSk7CisgIHB2ZXJib3NlKCItIHVuaW9uIC4uLi4uLiAlc1xuIiwgKHVuaW9uXyA/ICJPTiIgOiAib2ZmIikpOworICBwdmVyYm9zZSgiLSBoYXNoY29kZSAuLi4gJXNcbiIsIChoYXNoY29kZV8gPyAiT04iIDogIm9mZiIpKTsKKyAgcHZlcmJvc2UoIi0gc2VyaWFsaXplIC4uICVzXG4iLCAoc2VyaWFsaXplXyA/ICJPTiIgOiAib2ZmIikpOworICBwdmVyYm9zZSgiLSB3Y2YgLi4uLi4uLi4gJXNcbiIsICh3Y2ZfID8gIk9OIiA6ICJvZmYiKSk7Cit9CisKK3N0ZDo6c3RyaW5nIHRfY3NoYXJwX2dlbmVyYXRvcjo6bm9ybWFsaXplX25hbWUoc3RkOjpzdHJpbmcgbmFtZSkgeworICBzdHJpbmcgdG1wKG5hbWUpOworICBzdGQ6OnRyYW5zZm9ybSh0bXAuYmVnaW4oKSwgdG1wLmVuZCgpLCB0bXAuYmVnaW4oKSwgc3RhdGljX2Nhc3Q8aW50ICgqKShpbnQpPihzdGQ6OnRvbG93ZXIpKTsKKworICAvLyB1bi1jb25mbGljdCBrZXl3b3JkcyBieSBwcmVmaXhpbmcgd2l0aCAiQCIKKyAgaWYgKGNzaGFycF9rZXl3b3Jkcy5maW5kKHRtcCkgIT0gY3NoYXJwX2tleXdvcmRzLmVuZCgpKSB7CisgICAgcmV0dXJuICJAIiArIG5hbWU7CisgIH0KKworICAvLyBubyBjaGFuZ2VzIG5lY2Vzc2FyeQorICByZXR1cm4gbmFtZTsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmluaXRfa2V5d29yZHMoKSB7CisgIGNzaGFycF9rZXl3b3Jkcy5jbGVhcigpOworCisgIC8vIEMjIGtleXdvcmRzCisgIGNzaGFycF9rZXl3b3Jkc1siYWJzdHJhY3QiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siYXMiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siYmFzZSJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJib29sIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImJyZWFrIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImJ5dGUiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siY2FzZSJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJjYXRjaCJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJjaGFyIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImNoZWNrZWQiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siY2xhc3MiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siY29uc3QiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siY29udGludWUiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siZGVjaW1hbCJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJkZWZhdWx0Il0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImRlbGVnYXRlIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImRvIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImRvdWJsZSJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJlbHNlIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImVudW0iXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siZXZlbnQiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siZXhwbGljaXQiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siZXh0ZXJuIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImZhbHNlIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImZpbmFsbHkiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siZml4ZWQiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siZmxvYXQiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siZm9yIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImZvcmVhY2giXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siZ290byJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJpZiJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJpbXBsaWNpdCJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJpbiJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJpbnQiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siaW50ZXJmYWNlIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImludGVybmFsIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImlzIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImxvY2siXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sibG9uZyJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJuYW1lc3BhY2UiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sibmV3Il0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbIm51bGwiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sib2JqZWN0Il0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbIm9wZXJhdG9yIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbIm91dCJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJvdmVycmlkZSJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJwYXJhbXMiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sicHJpdmF0ZSJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJwcm90ZWN0ZWQiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sicHVibGljIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInJlYWRvbmx5Il0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInJlZiJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJyZXR1cm4iXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sic2J5dGUiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sic2VhbGVkIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInNob3J0Il0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInNpemVvZiJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJzdGFja2FsbG9jIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInN0YXRpYyJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJzdHJpbmciXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sic3RydWN0Il0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInN3aXRjaCJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJ0aGlzIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInRocm93Il0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInRydWUiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sidHJ5Il0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInR5cGVvZiJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJ1aW50Il0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInVsb25nIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInVuY2hlY2tlZCJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJ1bnNhZmUiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sidXNob3J0Il0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInVzaW5nIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInZpcnR1YWwiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sidm9pZCJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJ2b2xhdGlsZSJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJ3aGlsZSJdID0gMTsKKworICAvLyBDIyBjb250ZXh0dWFsIGtleXdvcmRzCisgIGNzaGFycF9rZXl3b3Jkc1siYWRkIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImFsaWFzIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImFzY2VuZGluZyJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJhc3luYyJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJhd2FpdCJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJkZXNjZW5kaW5nIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImR5bmFtaWMiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siZnJvbSJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJnZXQiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siZ2xvYmFsIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImdyb3VwIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImludG8iXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siam9pbiJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJsZXQiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sib3JkZXJieSJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJwYXJ0aWFsIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInJlbW92ZSJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJzZWxlY3QiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sic2V0Il0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInZhbHVlIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInZhciJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJ3aGVyZSJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJ5aWVsZCJdID0gMTsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OnN0YXJ0X2NzaGFycF9uYW1lc3BhY2Uob3N0cmVhbSYgb3V0KSB7CisgIGlmICghbmFtZXNwYWNlX25hbWVfLmVtcHR5KCkpIHsKKyAgICBvdXQgPDwgIm5hbWVzcGFjZSAiIDw8IG5hbWVzcGFjZV9uYW1lXyA8PCAiXG4iOworICAgIHNjb3BlX3VwKG91dCk7CisgIH0KK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmVuZF9jc2hhcnBfbmFtZXNwYWNlKG9zdHJlYW0mIG91dCkgeworICBpZiAoIW5hbWVzcGFjZV9uYW1lXy5lbXB0eSgpKSB7CisgICAgc2NvcGVfZG93bihvdXQpOworICB9Cit9CisKK3N0cmluZyB0X2NzaGFycF9nZW5lcmF0b3I6OmNzaGFycF90eXBlX3VzaW5ncygpIHsKKyAgcmV0dXJuIHN0cmluZygpICsgInVzaW5nIFN5c3RlbTtcbiIgKyAidXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zO1xuIgorICAgICAgICAgKyAidXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7XG4iICsgInVzaW5nIFN5c3RlbS5UZXh0O1xuIiArICJ1c2luZyBTeXN0ZW0uSU87XG4iCisgICAgICAgICArICgoYXN5bmNfKSA/ICJ1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzO1xuIiA6ICIiKSArICJ1c2luZyBUaHJpZnQ7XG4iCisgICAgICAgICArICJ1c2luZyBUaHJpZnQuQ29sbGVjdGlvbnM7XG4iICsgKChzZXJpYWxpemVfIHx8IHdjZl8pID8gIiNpZiAhU0lMVkVSTElHSFRcbiIgOiAiIikKKyAgICAgICAgICsgKChzZXJpYWxpemVfIHx8IHdjZl8pID8gInVzaW5nIFN5c3RlbS5YbWwuU2VyaWFsaXphdGlvbjtcbiIgOiAiIikKKyAgICAgICAgICsgKChzZXJpYWxpemVfIHx8IHdjZl8pID8gIiNlbmRpZlxuIiA6ICIiKQorICAgICAgICAgKyAidXNpbmcgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbjtcbiI7Cit9CisKK3N0cmluZyB0X2NzaGFycF9nZW5lcmF0b3I6OmNzaGFycF90aHJpZnRfdXNpbmdzKCkgeworICByZXR1cm4gc3RyaW5nKCkgKyAidXNpbmcgVGhyaWZ0LlByb3RvY29sO1xuIiArICJ1c2luZyBUaHJpZnQuVHJhbnNwb3J0O1xuIjsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKK30KK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKKyAgKHZvaWQpdHR5cGVkZWY7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKKyAgc3RyaW5nIGZfZW51bV9uYW1lID0gbmFtZXNwYWNlX2Rpcl8gKyAiLyIgKyAodGVudW0tPmdldF9uYW1lKCkpICsgIi5jcyI7CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9lbnVtOworICBmX2VudW0ub3BlbihmX2VudW1fbmFtZS5jX3N0cigpKTsKKworICBmX2VudW0gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbDsKKworICBzdGFydF9jc2hhcnBfbmFtZXNwYWNlKGZfZW51bSk7CisKKyAgZ2VuZXJhdGVfY3NoYXJwX2RvYyhmX2VudW0sIHRlbnVtKTsKKworICBpbmRlbnQoZl9lbnVtKSA8PCAicHVibGljIGVudW0gIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiXG4iOworICBzY29wZV91cChmX2VudW0pOworCisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9jc2hhcnBfZG9jKGZfZW51bSwgKmNfaXRlcik7CisKKyAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOworICAgIGluZGVudChmX2VudW0pIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCB2YWx1ZSA8PCAiLCIgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX2Rvd24oZl9lbnVtKTsKKworICBlbmRfY3NoYXJwX25hbWVzcGFjZShmX2VudW0pOworCisgIGZfZW51bS5jbG9zZSgpOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3RzKHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpIHsKKyAgaWYgKGNvbnN0cy5lbXB0eSgpKSB7CisgICAgcmV0dXJuOworICB9CisgIHN0cmluZyBmX2NvbnN0c19uYW1lID0gbmFtZXNwYWNlX2Rpcl8gKyAnLycgKyBwcm9ncmFtX25hbWVfICsgIi5Db25zdGFudHMuY3MiOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfY29uc3RzOworICBmX2NvbnN0cy5vcGVuKGZfY29uc3RzX25hbWUuY19zdHIoKSk7CisKKyAgZl9jb25zdHMgPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgY3NoYXJwX3R5cGVfdXNpbmdzKCkgPDwgZW5kbDsKKworICBzdGFydF9jc2hhcnBfbmFtZXNwYWNlKGZfY29uc3RzKTsKKworICBpbmRlbnQoZl9jb25zdHMpIDw8ICJwdWJsaWMgc3RhdGljIGNsYXNzICIgPDwgbWFrZV92YWxpZF9jc2hhcnBfaWRlbnRpZmllcihwcm9ncmFtX25hbWVfKQorICAgICAgICAgICAgICAgICAgIDw8ICJDb25zdGFudHMiIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfY29uc3RzKTsKKworICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7CisgIGJvb2wgbmVlZF9zdGF0aWNfY29uc3RydWN0b3IgPSBmYWxzZTsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9jc2hhcnBfZG9jKGZfY29uc3RzLCAoKmNfaXRlcikpOworICAgIGlmIChwcmludF9jb25zdF92YWx1ZShmX2NvbnN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF90eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKSkgeworICAgICAgbmVlZF9zdGF0aWNfY29uc3RydWN0b3IgPSB0cnVlOworICAgIH0KKyAgfQorCisgIGlmIChuZWVkX3N0YXRpY19jb25zdHJ1Y3RvcikgeworICAgIHByaW50X2NvbnN0X2NvbnN0cnVjdG9yKGZfY29uc3RzLCBjb25zdHMpOworICB9CisKKyAgc2NvcGVfZG93bihmX2NvbnN0cyk7CisgIGVuZF9jc2hhcnBfbmFtZXNwYWNlKGZfY29uc3RzKTsKKyAgZl9jb25zdHMuY2xvc2UoKTsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OnByaW50X2NvbnN0X2RlZl92YWx1ZShzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBwcmVwYXJlX21lbWJlcl9uYW1lX21hcHBpbmcoKHRfc3RydWN0Kil0eXBlKTsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgdF9maWVsZCogZmllbGQgPSBOVUxMOworICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKKyAgICAgICAgICBmaWVsZCA9ICgqZl9pdGVyKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGZpZWxkID09IE5VTEwpIHsKKyAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKKyAgICAgIH0KKyAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IGZpZWxkLT5nZXRfdHlwZSgpOworICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKKyAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIi4iIDw8IHByb3BfbmFtZShmaWVsZCkgPDwgIiA9ICIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKyAgICBjbGVhbnVwX21lbWJlcl9uYW1lX21hcHBpbmcoKHRfc3RydWN0Kil0eXBlKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBzdHJpbmcga2V5ID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwga3R5cGUsIHZfaXRlci0+Zmlyc3QpOworICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIHZ0eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICJbIiA8PCBrZXkgPDwgIl0iCisgICAgICAgICAgICAgICAgICA8PCAiID0gIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkgeworICAgIHRfdHlwZSogZXR5cGU7CisgICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9IGVsc2UgeworICAgICAgZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIH0KKworICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOworICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGV0eXBlLCAqdl9pdGVyKTsKKyAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIi5BZGQoIiA8PCB2YWwgPDwgIik7IiA8PCBlbmRsOworICAgIH0KKyAgfQorfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6cHJpbnRfY29uc3RfY29uc3RydWN0b3Ioc3RkOjpvc3RyZWFtJiBvdXQsIHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpIHsKKyAgaW5kZW50KG91dCkgPDwgInN0YXRpYyAiIDw8IG1ha2VfdmFsaWRfY3NoYXJwX2lkZW50aWZpZXIocHJvZ3JhbV9uYW1lXykuY19zdHIoKSA8PCAiQ29uc3RhbnRzKCkiCisgICAgICAgICAgICAgIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisgIHZlY3Rvcjx0X2NvbnN0Kj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBzdHJpbmcgbmFtZSA9ICgqY19pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICB0X3R5cGUqIHR5cGUgPSAoKmNfaXRlciktPmdldF90eXBlKCk7CisgICAgdF9jb25zdF92YWx1ZSogdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOworCisgICAgcHJpbnRfY29uc3RfZGVmX3ZhbHVlKG91dCwgbmFtZSwgdHlwZSwgdmFsdWUpOworICB9CisgIHNjb3BlX2Rvd24ob3V0KTsKK30KKworLy8gaXQgc2VlbXMgbGlrZSBhbGwgdGhhdCBtZXRob2RzIHRoYXQgY2FsbCB0aGlzIGFyZSB1c2luZyBpbl9zdGF0aWMgdG8gYmUgdGhlIG9wcG9zaXRlIG9mIHdoYXQgaXQKKy8vIHdvdWxkIGltcGx5Citib29sIHRfY3NoYXJwX2dlbmVyYXRvcjo6cHJpbnRfY29uc3RfdmFsdWUoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fc3RhdGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVmdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbmVlZHR5cGUpIHsKKyAgaW5kZW50KG91dCk7CisgIGJvb2wgbmVlZF9zdGF0aWNfY29uc3RydWN0aW9uID0gIWluX3N0YXRpYzsKKyAgd2hpbGUgKHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHR5cGUgPSAoKHRfdHlwZWRlZiopdHlwZSktPmdldF90eXBlKCk7CisgIH0KKworICBpZiAoIWRlZnZhbCB8fCBuZWVkdHlwZSkgeworICAgIG91dCA8PCAoaW5fc3RhdGljID8gIiIgOiB0eXBlLT5pc19iYXNlX3R5cGUoKSA/ICJwdWJsaWMgY29uc3QgIiA6ICJwdWJsaWMgc3RhdGljICIpCisgICAgICAgIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiICI7CisgIH0KKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgc3RyaW5nIHYyID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgdHlwZSwgdmFsdWUpOworICAgIG91dCA8PCBuYW1lIDw8ICIgPSAiIDw8IHYyIDw8ICI7IiA8PCBlbmRsOworICAgIG5lZWRfc3RhdGljX2NvbnN0cnVjdGlvbiA9IGZhbHNlOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIG91dCA8PCBuYW1lIDw8ICIgPSAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIi4iIDw8IHZhbHVlLT5nZXRfaWRlbnRpZmllcl9uYW1lKCkKKyAgICAgICAgPDwgIjsiIDw8IGVuZGw7CisgICAgbmVlZF9zdGF0aWNfY29uc3RydWN0aW9uID0gZmFsc2U7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIG91dCA8PCBuYW1lIDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIigpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIG91dCA8PCBuYW1lIDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSwgdHJ1ZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKKyAgICBvdXQgPDwgbmFtZSA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIoKTsiIDw8IGVuZGw7CisgIH0KKworICBpZiAoZGVmdmFsICYmICF0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiAhdHlwZS0+aXNfZW51bSgpKSB7CisgICAgcHJpbnRfY29uc3RfZGVmX3ZhbHVlKG91dCwgbmFtZSwgdHlwZSwgdmFsdWUpOworICB9CisKKyAgcmV0dXJuIG5lZWRfc3RhdGljX2NvbnN0cnVjdGlvbjsKK30KKworc3RkOjpzdHJpbmcgdF9jc2hhcnBfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgeworICAodm9pZCluYW1lOworICBzdGQ6Om9zdHJpbmdzdHJlYW0gcmVuZGVyOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZW5kZXIgPDwgJyInIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmVuZGVyIDw8ICgodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKKyAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJlbmRlciA8PCB0eXBlLT5nZXRfbmFtZSgpIDw8ICIuIiA8PCB2YWx1ZS0+Z2V0X2lkZW50aWZpZXJfbmFtZSgpOworICB9IGVsc2UgeworICAgIHN0cmluZyB0ID0gdG1wKCJ0bXAiKTsKKyAgICBwcmludF9jb25zdF92YWx1ZShvdXQsIHQsIHR5cGUsIHZhbHVlLCB0cnVlLCB0cnVlLCB0cnVlKTsKKyAgICByZW5kZXIgPDwgdDsKKyAgfQorCisgIHJldHVybiByZW5kZXIuc3RyKCk7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaWYgKHVuaW9uXyAmJiB0c3RydWN0LT5pc191bmlvbigpKSB7CisgICAgZ2VuZXJhdGVfY3NoYXJwX3VuaW9uKHRzdHJ1Y3QpOworICB9IGVsc2UgeworICAgIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3QodHN0cnVjdCwgZmFsc2UpOworICB9Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7CisgIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3QodHhjZXB0aW9uLCB0cnVlKTsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisgIHN0cmluZyBmX3N0cnVjdF9uYW1lID0gbmFtZXNwYWNlX2Rpcl8gKyAiLyIgKyAodHN0cnVjdC0+Z2V0X25hbWUoKSkgKyAiLmNzIjsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3N0cnVjdDsKKworICBmX3N0cnVjdC5vcGVuKGZfc3RydWN0X25hbWUuY19zdHIoKSk7CisKKyAgZl9zdHJ1Y3QgPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgY3NoYXJwX3R5cGVfdXNpbmdzKCkgPDwgY3NoYXJwX3RocmlmdF91c2luZ3MoKSA8PCBlbmRsOworCisgIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfZGVmaW5pdGlvbihmX3N0cnVjdCwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKKworICBmX3N0cnVjdC5jbG9zZSgpOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCkgeworCisgIGlmICghaW5fY2xhc3MpIHsKKyAgICBzdGFydF9jc2hhcnBfbmFtZXNwYWNlKG91dCk7CisgIH0KKworICBvdXQgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9jc2hhcnBfZG9jKG91dCwgdHN0cnVjdCk7CisgIHByZXBhcmVfbWVtYmVyX25hbWVfbWFwcGluZyh0c3RydWN0KTsKKworICBpbmRlbnQob3V0KSA8PCAiI2lmICFTSUxWRVJMSUdIVCIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIltTZXJpYWxpemFibGVdIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiI2VuZGlmIiA8PCBlbmRsOworICBpZiAoKHNlcmlhbGl6ZV8gfHwgd2NmXykgJiYgIWlzX2V4Y2VwdGlvbikgeworICAgIGluZGVudChvdXQpIDw8ICJbRGF0YUNvbnRyYWN0KE5hbWVzcGFjZT1cIiIgPDwgd2NmX25hbWVzcGFjZV8gPDwgIlwiKV0iCisgICAgICAgICAgICAgICAgPDwgZW5kbDsgLy8gZG8gbm90IG1ha2UgZXhjZXB0aW9uIGNsYXNzZXMgZGlyZWN0bHkgV0NGIHNlcmlhbGl6YWJsZSwgd2UgcHJvdmlkZSBhCisgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VwYXJhdGUgImZhdWx0IiBmb3IgdGhhdAorICB9CisgIGJvb2wgaXNfZmluYWwgPSAodHN0cnVjdC0+YW5ub3RhdGlvbnNfLmZpbmQoImZpbmFsIikgIT0gdHN0cnVjdC0+YW5ub3RhdGlvbnNfLmVuZCgpKTsKKworICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgKGlzX2ZpbmFsID8gInNlYWxlZCAiIDogIiIpIDw8ICJwYXJ0aWFsIGNsYXNzICIKKyAgICAgICAgICAgICAgPDwgbm9ybWFsaXplX25hbWUodHN0cnVjdC0+Z2V0X25hbWUoKSkgPDwgIiA6ICI7CisKKyAgaWYgKGlzX2V4Y2VwdGlvbikgeworICAgIG91dCA8PCAiVEV4Y2VwdGlvbiwgIjsKKyAgfQorICBvdXQgPDwgIlRCYXNlIjsKKworICBvdXQgPDwgZW5kbDsKKworICBzY29wZV91cChvdXQpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgLy8gbWFrZSBwcml2YXRlIG1lbWJlcnMgd2l0aCBwdWJsaWMgUHJvcGVydGllcworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgLy8gaWYgdGhlIGZpZWxkIGlzIHJlcXVpZWQsIHRoZW4gd2UgdXNlIGF1dG8tcHJvcGVydGllcworICAgIGlmICghZmllbGRfaXNfcmVxdWlyZWQoKCptX2l0ZXIpKSAmJiAoIW51bGxhYmxlXyB8fCBmaWVsZF9oYXNfZGVmYXVsdCgoKm1faXRlcikpKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgIiA8PCBkZWNsYXJlX2ZpZWxkKCptX2l0ZXIsIGZhbHNlLCAiXyIpIDw8IGVuZGw7CisgICAgfQorICB9CisgIG91dCA8PCBlbmRsOworCisgIGJvb2wgaGFzX25vbl9yZXF1aXJlZF9maWVsZHMgPSBmYWxzZTsKKyAgYm9vbCBoYXNfbm9uX3JlcXVpcmVkX2RlZmF1bHRfdmFsdWVfZmllbGRzID0gZmFsc2U7CisgIGJvb2wgaGFzX3JlcXVpcmVkX2ZpZWxkcyA9IGZhbHNlOworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgZ2VuZXJhdGVfY3NoYXJwX2RvYyhvdXQsICptX2l0ZXIpOworICAgIGdlbmVyYXRlX3Byb3BlcnR5KG91dCwgKm1faXRlciwgdHJ1ZSwgdHJ1ZSk7CisgICAgYm9vbCBpc19yZXF1aXJlZCA9IGZpZWxkX2lzX3JlcXVpcmVkKCgqbV9pdGVyKSk7CisgICAgYm9vbCBoYXNfZGVmYXVsdCA9IGZpZWxkX2hhc19kZWZhdWx0KCgqbV9pdGVyKSk7CisgICAgaWYgKGlzX3JlcXVpcmVkKSB7CisgICAgICBoYXNfcmVxdWlyZWRfZmllbGRzID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKGhhc19kZWZhdWx0KSB7CisgICAgICAgIGhhc19ub25fcmVxdWlyZWRfZGVmYXVsdF92YWx1ZV9maWVsZHMgPSB0cnVlOworICAgICAgfQorICAgICAgaGFzX25vbl9yZXF1aXJlZF9maWVsZHMgPSB0cnVlOworICAgIH0KKyAgfQorCisgIGJvb2wgZ2VuZXJhdGVfaXNzZXQgPSAobnVsbGFibGVfICYmIGhhc19ub25fcmVxdWlyZWRfZGVmYXVsdF92YWx1ZV9maWVsZHMpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCAoIW51bGxhYmxlXyAmJiBoYXNfbm9uX3JlcXVpcmVkX2ZpZWxkcyk7CisgIGlmIChnZW5lcmF0ZV9pc3NldCkgeworICAgIG91dCA8PCBlbmRsOworICAgIGlmIChzZXJpYWxpemVfIHx8IHdjZl8pIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW1htbElnbm9yZV0gLy8gWG1sU2VyaWFsaXplciIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICJbRGF0YU1lbWJlcihPcmRlciA9IDEpXSAgLy8gWG1sT2JqZWN0U2VyaWFsaXplciwgRGF0YUNvbnRyYWN0SnNvblNlcmlhbGl6ZXIsIGV0Yy4iCisgICAgICAgICAgPDwgZW5kbDsKKyAgICB9CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgSXNzZXQgX19pc3NldDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiNpZiAhU0lMVkVSTElHSFQiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIltTZXJpYWxpemFibGVdIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIjZW5kaWYiIDw8IGVuZGw7CisgICAgaWYgKHNlcmlhbGl6ZV8gfHwgd2NmXykgeworICAgICAgaW5kZW50KG91dCkgPDwgIltEYXRhQ29udHJhY3RdIiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIHN0cnVjdCBJc3NldCB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIGJvb2wgaXNfcmVxdWlyZWQgPSBmaWVsZF9pc19yZXF1aXJlZCgoKm1faXRlcikpOworICAgICAgYm9vbCBoYXNfZGVmYXVsdCA9IGZpZWxkX2hhc19kZWZhdWx0KCgqbV9pdGVyKSk7CisgICAgICAvLyBpZiBpdCBpcyByZXF1aXJlZCwgZG9uJ3QgbmVlZCBJc3NldCBmb3IgdGhhdCB2YXJpYWJsZQorICAgICAgLy8gaWYgaXQgaXMgbm90IHJlcXVpcmVkLCBpZiBpdCBoYXMgYSBkZWZhdWx0IHZhbHVlLCB3ZSBuZWVkIHRvIGdlbmVyYXRlIElzc2V0CisgICAgICAvLyBpZiB3ZSBhcmUgbm90IG51bGxhYmxlLCB0aGVuIHdlIGdlbmVyYXRlIElzc2V0CisgICAgICBpZiAoIWlzX3JlcXVpcmVkICYmICghbnVsbGFibGVfIHx8IGhhc19kZWZhdWx0KSkgeworICAgICAgICBpZiAoc2VyaWFsaXplXyB8fCB3Y2ZfKSB7CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgIltEYXRhTWVtYmVyXSIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGJvb2wgIiA8PCBub3JtYWxpemVfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpIDw8ICI7IiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIGlmIChnZW5lcmF0ZV9pc3NldCAmJiAoc2VyaWFsaXplXyB8fCB3Y2ZfKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIiNyZWdpb24gWG1sU2VyaWFsaXplciBzdXBwb3J0IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgICAgYm9vbCBpc19yZXF1aXJlZCA9IGZpZWxkX2lzX3JlcXVpcmVkKCgqbV9pdGVyKSk7CisgICAgICAgIGJvb2wgaGFzX2RlZmF1bHQgPSBmaWVsZF9oYXNfZGVmYXVsdCgoKm1faXRlcikpOworICAgICAgICAvLyBpZiBpdCBpcyByZXF1aXJlZCwgZG9uJ3QgbmVlZCBJc3NldCBmb3IgdGhhdCB2YXJpYWJsZQorICAgICAgICAvLyBpZiBpdCBpcyBub3QgcmVxdWlyZWQsIGlmIGl0IGhhcyBhIGRlZmF1bHQgdmFsdWUsIHdlIG5lZWQgdG8gZ2VuZXJhdGUgSXNzZXQKKyAgICAgICAgLy8gaWYgd2UgYXJlIG5vdCBudWxsYWJsZSwgdGhlbiB3ZSBnZW5lcmF0ZSBJc3NldAorICAgICAgICBpZiAoIWlzX3JlcXVpcmVkICYmICghbnVsbGFibGVfIHx8IGhhc19kZWZhdWx0KSkgeworICAgICAgICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgYm9vbCBTaG91bGRTZXJpYWxpemUiIDw8IHByb3BfbmFtZSgoKm1faXRlcikpIDw8ICIoKSIgPDwgZW5kbDsKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAieyIgPDwgZW5kbDsKKyAgICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIF9faXNzZXQuIiA8PCBub3JtYWxpemVfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpIDw8ICI7IiA8PCBlbmRsOworICAgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpbmRlbnQob3V0KSA8PCAiI2VuZHJlZ2lvbiBYbWxTZXJpYWxpemVyIHN1cHBvcnQiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICAvLyBXZSBhbHdheXMgd2FudCBhIGRlZmF1bHQsIG5vIGFyZ3VtZW50IGNvbnN0cnVjdG9yIGZvciBSZWFkaW5nCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCBub3JtYWxpemVfbmFtZSh0c3RydWN0LT5nZXRfbmFtZSgpKSA8PCAiKCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIHRfdHlwZSogdCA9ICgqbV9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICB3aGlsZSAodC0+aXNfdHlwZWRlZigpKSB7CisgICAgICB0ID0gKCh0X3R5cGVkZWYqKXQpLT5nZXRfdHlwZSgpOworICAgIH0KKyAgICBpZiAoKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7CisgICAgICBpZiAoZmllbGRfaXNfcmVxdWlyZWQoKCptX2l0ZXIpKSkgeworICAgICAgICBwcmludF9jb25zdF92YWx1ZShvdXQsICJ0aGlzLiIgKyBwcm9wX25hbWUoKm1faXRlciksIHQsICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCksIHRydWUsIHRydWUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcy5fIiArICgqbV9pdGVyKS0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7CisgICAgICAgIC8vIE9wdGlvbmFscyB3aXRoIGRlZmF1bHRzIGFyZSBtYXJrZWQgc2V0CisgICAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLl9faXNzZXQuIiA8PCBub3JtYWxpemVfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpIDw8ICIgPSB0cnVlOyIKKyAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBpZiAoaGFzX3JlcXVpcmVkX2ZpZWxkcykgeworICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoIjsKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBpZiAoZmllbGRfaXNfcmVxdWlyZWQoKCptX2l0ZXIpKSkgeworICAgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG91dCA8PCAiLCAiOworICAgICAgICB9CisgICAgICAgIG91dCA8PCB0eXBlX25hbWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiICIgPDwgbm9ybWFsaXplX25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICAgIH0KKyAgICB9CisgICAgb3V0IDw8ICIpIDogdGhpcygpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBpZiAoZmllbGRfaXNfcmVxdWlyZWQoKCptX2l0ZXIpKSkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IHByb3BfbmFtZSgoKm1faXRlcikpIDw8ICIgPSAiIDw8IG5vcm1hbGl6ZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIjsiCisgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICB9CisKKyAgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9yZWFkZXIob3V0LCB0c3RydWN0KTsKKyAgaWYgKGlzX3Jlc3VsdCkgeworICAgIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOworICB9IGVsc2UgeworICAgIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCk7CisgIH0KKyAgaWYgKGhhc2hjb2RlXykgeworICAgIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfZXF1YWxzKG91dCwgdHN0cnVjdCk7CisgICAgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9oYXNoY29kZShvdXQsIHRzdHJ1Y3QpOworICB9CisgIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfdG9zdHJpbmcob3V0LCB0c3RydWN0KTsKKyAgc2NvcGVfZG93bihvdXQpOworICBvdXQgPDwgZW5kbDsKKworICAvLyBnZW5lcmF0ZSBhIGNvcnJlc3BvbmRpbmcgV0NGIGZhdWx0IHRvIHdyYXAgdGhlIGV4Y2VwdGlvbgorICBpZiAoKHNlcmlhbGl6ZV8gfHwgd2NmXykgJiYgaXNfZXhjZXB0aW9uKSB7CisgICAgZ2VuZXJhdGVfY3NoYXJwX3djZmZhdWx0KG91dCwgdHN0cnVjdCk7CisgIH0KKworICBjbGVhbnVwX21lbWJlcl9uYW1lX21hcHBpbmcodHN0cnVjdCk7CisgIGlmICghaW5fY2xhc3MpIHsKKyAgICBlbmRfY3NoYXJwX25hbWVzcGFjZShvdXQpOworICB9Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jc2hhcnBfd2NmZmF1bHQob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBvdXQgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiNpZiAhU0lMVkVSTElHSFQiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJbU2VyaWFsaXphYmxlXSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiNlbmRpZiIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIltEYXRhQ29udHJhY3RdIiA8PCBlbmRsOworICBib29sIGlzX2ZpbmFsID0gKHRzdHJ1Y3QtPmFubm90YXRpb25zXy5maW5kKCJmaW5hbCIpICE9IHRzdHJ1Y3QtPmFubm90YXRpb25zXy5lbmQoKSk7CisKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IChpc19maW5hbCA/ICJzZWFsZWQgIiA6ICIiKSA8PCAicGFydGlhbCBjbGFzcyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgPDwgIkZhdWx0IiA8PCBlbmRsOworCisgIHNjb3BlX3VwKG91dCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICAvLyBtYWtlIHByaXZhdGUgbWVtYmVycyB3aXRoIHB1YmxpYyBQcm9wZXJ0aWVzCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAvLyBpZiB0aGUgZmllbGQgaXMgcmVxdWllZCwgdGhlbiB3ZSB1c2UgYXV0by1wcm9wZXJ0aWVzCisgICAgaWYgKCFmaWVsZF9pc19yZXF1aXJlZCgoKm1faXRlcikpICYmICghbnVsbGFibGVfIHx8IGZpZWxkX2hhc19kZWZhdWx0KCgqbV9pdGVyKSkpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSAiIDw8IGRlY2xhcmVfZmllbGQoKm1faXRlciwgZmFsc2UsICJfIikgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgb3V0IDw8IGVuZGw7CisKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIGdlbmVyYXRlX3Byb3BlcnR5KG91dCwgKm1faXRlciwgdHJ1ZSwgZmFsc2UpOworICB9CisKKyAgc2NvcGVfZG93bihvdXQpOworICBvdXQgPDwgZW5kbDsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfcmVhZGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyB2b2lkIFJlYWQgKFRQcm90b2NvbCBpcHJvdCkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpcHJvdC5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ0cnkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIC8vIFJlcXVpcmVkIHZhcmlhYmxlcyBhcmVuJ3QgaW4gX19pc3NldCwgc28gd2UgbmVlZCB0bXAgdmFycyB0byBjaGVjayB0aGVtCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpZWxkX2lzX3JlcXVpcmVkKCgqZl9pdGVyKSkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJib29sIGlzc2V0XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSBmYWxzZTsiIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgaW5kZW50KG91dCkgPDwgIlRGaWVsZCBmaWVsZDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlwcm90LlJlYWRTdHJ1Y3RCZWdpbigpOyIgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAid2hpbGUgKHRydWUpIiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworCisgIGluZGVudChvdXQpIDw8ICJmaWVsZCA9IGlwcm90LlJlYWRGaWVsZEJlZ2luKCk7IiA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJpZiAoZmllbGQuVHlwZSA9PSBUVHlwZS5TdG9wKSB7ICIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKGZpZWxkLklEKSIgPDwgZW5kbDsKKworICBzY29wZV91cChvdXQpOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgYm9vbCBpc19yZXF1aXJlZCA9IGZpZWxkX2lzX3JlcXVpcmVkKCgqZl9pdGVyKSk7CisgICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKGZpZWxkLlR5cGUgPT0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyKTsKKyAgICBpZiAoaXNfcmVxdWlyZWQpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpc3NldF8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gdHJ1ZTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7ICIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBUUHJvdG9jb2xVdGlsLlNraXAoaXByb3QsIGZpZWxkLlR5cGUpOyIKKyAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDogIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgIlRQcm90b2NvbFV0aWwuU2tpcChpcHJvdCwgZmllbGQuVHlwZSk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICBpbmRlbnQob3V0KSA8PCAiaXByb3QuUmVhZEZpZWxkRW5kKCk7IiA8PCBlbmRsOworCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICBpbmRlbnQob3V0KSA8PCAiaXByb3QuUmVhZFN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaWVsZF9pc19yZXF1aXJlZCgoKmZfaXRlcikpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCFpc3NldF8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgb3V0IDw8IGluZGVudCgpCisgICAgICAgICAgPDwgInRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwgIgorICAgICAgICAgIDw8ICJcInJlcXVpcmVkIGZpZWxkICIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIiBub3Qgc2V0XCIpOyIKKyAgICAgICAgICA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICB9CisgIH0KKworICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiZmluYWxseSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpcHJvdC5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihvdXQpOworCisgIGluZGVudF9kb3duKCk7CisKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF9zdHJ1Y3Rfd3JpdGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgdm9pZCBXcml0ZShUUHJvdG9jb2wgb3Byb3QpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAib3Byb3QuSW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAidHJ5IiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworCisgIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBpbmRlbnQob3V0KSA8PCAiVFN0cnVjdCBzdHJ1YyA9IG5ldyBUU3RydWN0KFwiIiA8PCBuYW1lIDw8ICJcIik7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAib3Byb3QuV3JpdGVTdHJ1Y3RCZWdpbihzdHJ1Yyk7IiA8PCBlbmRsOworCisgIGlmIChmaWVsZHMuc2l6ZSgpID4gMCkgeworICAgIGluZGVudChvdXQpIDw8ICJURmllbGQgZmllbGQgPSBuZXcgVEZpZWxkKCk7IiA8PCBlbmRsOworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICBib29sIGlzX3JlcXVpcmVkID0gZmllbGRfaXNfcmVxdWlyZWQoKCpmX2l0ZXIpKTsKKyAgICAgIGJvb2wgaGFzX2RlZmF1bHQgPSBmaWVsZF9oYXNfZGVmYXVsdCgoKmZfaXRlcikpOworICAgICAgYm9vbCBudWxsX2FsbG93ZWQgPSB0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7CisKKyAgICAgIGlmIChpc19yZXF1aXJlZCkKKyAgICAgIHsKKyAgICAgICAgaWYgKG51bGxfYWxsb3dlZCkgeworICAgICAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKSA8PCAiID09IG51bGwpIiA8PCBlbmRsOworICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICAgIG91dCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICA8PCAidGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLCAiCisgICAgICAgICAgICAgIDw8ICJcInJlcXVpcmVkIGZpZWxkICIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIiBub3Qgc2V0XCIpOyIKKyAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGlmIChudWxsYWJsZV8gJiYgIWhhc19kZWZhdWx0KSB7CisgICAgICAgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIiAhPSBudWxsKSB7IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKG51bGxfYWxsb3dlZCkgeworICAgICAgICAgIG91dCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICA8PCAiaWYgKCIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIiAhPSBudWxsICYmIF9faXNzZXQuIgorICAgICAgICAgICAgICA8PCBub3JtYWxpemVfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIpIHsiCisgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoX19pc3NldC4iIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIikgeyIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIH0KKyAgICAgIGluZGVudChvdXQpIDw8ICJmaWVsZC5OYW1lID0gXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCI7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgImZpZWxkLlR5cGUgPSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICI7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgImZpZWxkLklEID0gIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oZmllbGQpOyIgPDwgZW5kbDsKKworICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlcik7CisKKyAgICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC5Xcml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOworICAgICAgaWYgKCFpc19yZXF1aXJlZCkgeworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAib3Byb3QuV3JpdGVGaWVsZFN0b3AoKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJvcHJvdC5Xcml0ZVN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKKworICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiZmluYWxseSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJvcHJvdC5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihvdXQpOworCisgIGluZGVudF9kb3duKCk7CisKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCBXcml0ZShUUHJvdG9jb2wgb3Byb3QpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAib3Byb3QuSW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAidHJ5IiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworCisgIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBpbmRlbnQob3V0KSA8PCAiVFN0cnVjdCBzdHJ1YyA9IG5ldyBUU3RydWN0KFwiIiA8PCBuYW1lIDw8ICJcIik7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAib3Byb3QuV3JpdGVTdHJ1Y3RCZWdpbihzdHJ1Yyk7IiA8PCBlbmRsOworCisgIGlmIChmaWVsZHMuc2l6ZSgpID4gMCkgeworICAgIGluZGVudChvdXQpIDw8ICJURmllbGQgZmllbGQgPSBuZXcgVEZpZWxkKCk7IiA8PCBlbmRsOworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlmICI7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgIiBlbHNlIGlmICI7CisgICAgICB9CisKKyAgICAgIGlmIChudWxsYWJsZV8pIHsKKyAgICAgICAgb3V0IDw8ICIodGhpcy4iIDw8IHByb3BfbmFtZSgoKmZfaXRlcikpIDw8ICIgIT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCAiKHRoaXMuX19pc3NldC4iIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIikgeyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGluZGVudF91cCgpOworCisgICAgICBib29sIG51bGxfYWxsb3dlZCA9ICFudWxsYWJsZV8gJiYgdHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpOworICAgICAgaWYgKG51bGxfYWxsb3dlZCkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgcHJvcF9uYW1lKCpmX2l0ZXIpIDw8ICIgIT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICB9CisKKyAgICAgIGluZGVudChvdXQpIDw8ICJmaWVsZC5OYW1lID0gXCIiIDw8IHByb3BfbmFtZSgqZl9pdGVyKSA8PCAiXCI7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgImZpZWxkLlR5cGUgPSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICI7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgImZpZWxkLklEID0gIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oZmllbGQpOyIgPDwgZW5kbDsKKworICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlcik7CisKKyAgICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC5Xcml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOworCisgICAgICBpZiAobnVsbF9hbGxvd2VkKSB7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgfQorCisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iOworICAgIH0KKyAgfQorCisgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC5Xcml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIm9wcm90LldyaXRlU3RydWN0RW5kKCk7IiA8PCBlbmRsOworCisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJmaW5hbGx5IiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIm9wcm90LkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsOworICBzY29wZV9kb3duKG91dCk7CisKKyAgaW5kZW50X2Rvd24oKTsKKworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX3N0cnVjdF90b3N0cmluZyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KG91dCkgPDwgIlN0cmluZ0J1aWxkZXIgX19zYiA9IG5ldyBTdHJpbmdCdWlsZGVyKFwiIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoXCIpOyIKKyAgICAgICAgICAgICAgPDwgZW5kbDsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgYm9vbCB1c2VGaXJzdEZsYWcgPSBmYWxzZTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoIWZpZWxkX2lzX3JlcXVpcmVkKCgqZl9pdGVyKSkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJib29sIF9fZmlyc3QgPSB0cnVlOyIgPDwgZW5kbDsKKyAgICAgIHVzZUZpcnN0RmxhZyA9IHRydWU7CisgICAgfQorICAgIGJyZWFrOworICB9CisKKyAgYm9vbCBoYWRfcmVxdWlyZWQgPSBmYWxzZTsgLy8gc2V0IHRvIHRydWUgYWZ0ZXIgZmlyc3QgcmVxdWlyZWQgZmllbGQgaGFzIGJlZW4gcHJvY2Vzc2VkCisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBib29sIGlzX3JlcXVpcmVkID0gZmllbGRfaXNfcmVxdWlyZWQoKCpmX2l0ZXIpKTsKKyAgICBib29sIGhhc19kZWZhdWx0ID0gZmllbGRfaGFzX2RlZmF1bHQoKCpmX2l0ZXIpKTsKKyAgICBpZiAobnVsbGFibGVfICYmICFoYXNfZGVmYXVsdCAmJiAhaXNfcmVxdWlyZWQpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKSA8PCAiICE9IG51bGwpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICB9IGVsc2UgaWYgKCFpc19yZXF1aXJlZCkgeworICAgICAgYm9vbCBudWxsX2FsbG93ZWQgPSB0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgICBpZiAobnVsbF9hbGxvd2VkKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKSA8PCAiICE9IG51bGwgJiYgX19pc3NldC4iCisgICAgICAgICAgICAgICAgICAgIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIikgeyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKF9faXNzZXQuIiA8PCBub3JtYWxpemVfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgfQorICAgIH0KKworICAgIGlmICh1c2VGaXJzdEZsYWcgJiYgKCFoYWRfcmVxdWlyZWQpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYoIV9fZmlyc3QpIHsgX19zYi5BcHBlbmQoXCIsIFwiKTsgfSIgPDwgZW5kbDsKKyAgICAgIGlmICghaXNfcmVxdWlyZWQpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIl9fZmlyc3QgPSBmYWxzZTsiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBpbmRlbnQob3V0KSA8PCAiX19zYi5BcHBlbmQoXCIiIDw8IHByb3BfbmFtZSgoKmZfaXRlcikpIDw8ICI6IFwiKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJfX3NiLkFwcGVuZChcIiwgIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKSA8PCAiOiBcIik7IiA8PCBlbmRsOworICAgIH0KKworICAgIHRfdHlwZSogdHR5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgaWYgKHR0eXBlLT5pc194Y2VwdGlvbigpIHx8IHR0eXBlLT5pc19zdHJ1Y3QoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIl9fc2IuQXBwZW5kKCIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkKKyAgICAgICAgICAgICAgICAgIDw8ICI9PSBudWxsID8gXCI8bnVsbD5cIiA6ICIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIi5Ub1N0cmluZygpKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJfX3NiLkFwcGVuZCgiIDw8IHByb3BfbmFtZSgoKmZfaXRlcikpIDw8ICIpOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpZiAoIWlzX3JlcXVpcmVkKSB7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGhhZF9yZXF1aXJlZCA9IHRydWU7IC8vIG5vdyBfX2ZpcnN0IG11c3QgYmUgZmFsc2UsIHNvIHdlIGRvbid0IG5lZWQgdG8gY2hlY2sgaXQgYW55bW9yZQorICAgIH0KKyAgfQorCisgIGluZGVudChvdXQpIDw8ICJfX3NiLkFwcGVuZChcIilcIik7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIF9fc2IuVG9TdHJpbmcoKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF91bmlvbih0X3N0cnVjdCogdHVuaW9uKSB7CisgIHN0cmluZyBmX3VuaW9uX25hbWUgPSBuYW1lc3BhY2VfZGlyXyArICIvIiArICh0dW5pb24tPmdldF9uYW1lKCkpICsgIi5jcyI7CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl91bmlvbjsKKworICBmX3VuaW9uLm9wZW4oZl91bmlvbl9uYW1lLmNfc3RyKCkpOworCisgIGZfdW5pb24gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgY3NoYXJwX3R5cGVfdXNpbmdzKCkgPDwgY3NoYXJwX3RocmlmdF91c2luZ3MoKSA8PCBlbmRsOworCisgIGdlbmVyYXRlX2NzaGFycF91bmlvbl9kZWZpbml0aW9uKGZfdW5pb24sIHR1bmlvbik7CisKKyAgZl91bmlvbi5jbG9zZSgpOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX3VuaW9uX2RlZmluaXRpb24oc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0dW5pb24pIHsKKyAgLy8gTGV0J3MgZGVmaW5lIHRoZSBjbGFzcyBmaXJzdAorICBzdGFydF9jc2hhcnBfbmFtZXNwYWNlKG91dCk7CisKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBhYnN0cmFjdCBwYXJ0aWFsIGNsYXNzICIgPDwgdHVuaW9uLT5nZXRfbmFtZSgpIDw8ICIgOiBUQWJzdHJhY3RCYXNlIHsiCisgICAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlKFRQcm90b2NvbCBwcm90b2NvbCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicHVibGljIHJlYWRvbmx5IGJvb2wgSXNzZXQ7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicHVibGljIGFic3RyYWN0IG9iamVjdCBEYXRhIHsgZ2V0OyB9IiA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJwcm90ZWN0ZWQgIiA8PCB0dW5pb24tPmdldF9uYW1lKCkgPDwgIihib29sIGlzc2V0KSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgIklzc2V0ID0gaXNzZXQ7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgY2xhc3MgX19fdW5kZWZpbmVkIDogIiA8PCB0dW5pb24tPmdldF9uYW1lKCkgPDwgIiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQob3V0KSA8PCAicHVibGljIG92ZXJyaWRlIG9iamVjdCBEYXRhIHsgZ2V0IHsgcmV0dXJuIG51bGw7IH0gfSIgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAicHVibGljIF9fX3VuZGVmaW5lZCgpIDogYmFzZShmYWxzZSkge30iIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAicHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGUoVFByb3RvY29sIHByb3RvY29sKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgInRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oIFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsIFwiQ2Fubm90IHBlcnNpc3QgIgorICAgICAgICAgICAgICAgICAiYW4gdW5pb24gdHlwZSB3aGljaCBpcyBub3Qgc2V0LlwiKTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0dW5pb24tPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGdlbmVyYXRlX2NzaGFycF91bmlvbl9jbGFzcyhvdXQsIHR1bmlvbiwgKCpmX2l0ZXIpKTsKKyAgfQorCisgIGdlbmVyYXRlX2NzaGFycF91bmlvbl9yZWFkZXIob3V0LCB0dW5pb24pOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZW5kX2NzaGFycF9uYW1lc3BhY2Uob3V0KTsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF91bmlvbl9jbGFzcyhzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHR1bmlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkKSB7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgY2xhc3MgIiA8PCB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIiA6ICIgPDwgdHVuaW9uLT5nZXRfbmFtZSgpIDw8ICIgeyIKKyAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJwcml2YXRlICIgPDwgdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSkgPDwgIiBfZGF0YTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgb3ZlcnJpZGUgb2JqZWN0IERhdGEgeyBnZXQgeyByZXR1cm4gX2RhdGE7IH0gfSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiKCIgPDwgdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSkKKyAgICAgICAgICAgICAgPDwgIiBkYXRhKSA6IGJhc2UodHJ1ZSkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJ0aGlzLl9kYXRhID0gZGF0YTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGUoVFByb3RvY29sIG9wcm90KSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgIm9wcm90LkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgInRyeSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKworICBpbmRlbnQob3V0KSA8PCAiVFN0cnVjdCBzdHJ1YyA9IG5ldyBUU3RydWN0KFwiIiA8PCB0dW5pb24tPmdldF9uYW1lKCkgPDwgIlwiKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJvcHJvdC5Xcml0ZVN0cnVjdEJlZ2luKHN0cnVjKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgIlRGaWVsZCBmaWVsZCA9IG5ldyBURmllbGQoKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJmaWVsZC5OYW1lID0gXCIiIDw8IHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiXCI7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiZmllbGQuVHlwZSA9ICIgPDwgdHlwZV90b19lbnVtKHRmaWVsZC0+Z2V0X3R5cGUoKSkgPDwgIjsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJmaWVsZC5JRCA9ICIgPDwgdGZpZWxkLT5nZXRfa2V5KCkgPDwgIjsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oZmllbGQpOyIgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCB0ZmllbGQsICJfZGF0YSIsIHRydWUsIHRydWUpOworCisgIGluZGVudChvdXQpIDw8ICJvcHJvdC5Xcml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAib3Byb3QuV3JpdGVGaWVsZFN0b3AoKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJvcHJvdC5Xcml0ZVN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKworICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiZmluYWxseSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJvcHJvdC5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihvdXQpOworCisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X2VxdWFscyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgb3ZlcnJpZGUgYm9vbCBFcXVhbHMob2JqZWN0IHRoYXQpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGluZGVudChvdXQpIDw8ICJ2YXIgb3RoZXIgPSB0aGF0IGFzICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICI7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiaWYgKG90aGVyID09IG51bGwpIHJldHVybiBmYWxzZTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJpZiAoUmVmZXJlbmNlRXF1YWxzKHRoaXMsIG90aGVyKSkgcmV0dXJuIHRydWU7IiA8PCBlbmRsOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBib29sIGZpcnN0ID0gdHJ1ZTsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gIjsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICImJiAiOworICAgIH0KKyAgICBpZiAoIWZpZWxkX2lzX3JlcXVpcmVkKCgqZl9pdGVyKSkgJiYgIShudWxsYWJsZV8gJiYgIWZpZWxkX2hhc19kZWZhdWx0KCgqZl9pdGVyKSkpKSB7CisgICAgICBvdXQgPDwgIigoX19pc3NldC4iIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiA9PSBvdGhlci5fX2lzc2V0LiIKKyAgICAgICAgICA8PCBub3JtYWxpemVfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIpICYmICgoIV9faXNzZXQuIgorICAgICAgICAgIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIikgfHwgKCI7CisgICAgfQorICAgIHRfdHlwZSogdHR5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgaWYgKHR0eXBlLT5pc19jb250YWluZXIoKSB8fCB0dHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgIG91dCA8PCAiVENvbGxlY3Rpb25zLkVxdWFscygiOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgIlN5c3RlbS5PYmplY3QuRXF1YWxzKCI7CisgICAgfQorICAgIG91dCA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKSA8PCAiLCBvdGhlci4iIDw8IHByb3BfbmFtZSgoKmZfaXRlcikpIDw8ICIpIjsKKyAgICBpZiAoIWZpZWxkX2lzX3JlcXVpcmVkKCgqZl9pdGVyKSkgJiYgIShudWxsYWJsZV8gJiYgIWZpZWxkX2hhc19kZWZhdWx0KCgqZl9pdGVyKSkpKSB7CisgICAgICBvdXQgPDwgIikpKSI7CisgICAgfQorICB9CisgIGlmIChmaXJzdCkgeworICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdHJ1ZTsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgb3V0IDw8ICI7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9oYXNoY29kZShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgb3ZlcnJpZGUgaW50IEdldEhhc2hDb2RlKCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KG91dCkgPDwgImludCBoYXNoY29kZSA9IDA7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAidW5jaGVja2VkIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfdHlwZSogdHR5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgaW5kZW50KG91dCkgPDwgImhhc2hjb2RlID0gKGhhc2hjb2RlICogMzk3KSBeICI7CisgICAgaWYgKGZpZWxkX2lzX3JlcXVpcmVkKCgqZl9pdGVyKSkpIHsKKyAgICAgIG91dCA8PCAiKCI7CisgICAgfSBlbHNlIGlmIChudWxsYWJsZV8pIHsKKyAgICAgIG91dCA8PCAiKCIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIiA9PSBudWxsID8gMCA6ICI7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCAiKCFfX2lzc2V0LiIgPDwgbm9ybWFsaXplX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiID8gMCA6ICI7CisgICAgfQorICAgIGlmICh0dHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICAgIG91dCA8PCAiKFRDb2xsZWN0aW9ucy5HZXRIYXNoQ29kZSgiIDw8IHByb3BfbmFtZSgoKmZfaXRlcikpIDw8ICIpKSI7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCAiKCIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIi5HZXRIYXNoQ29kZSgpKSI7CisgICAgfQorICAgIG91dCA8PCAiKTsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInJldHVybiBoYXNoY29kZTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZl9zZXJ2aWNlX25hbWUgPSBuYW1lc3BhY2VfZGlyXyArICIvIiArIHNlcnZpY2VfbmFtZV8gKyAiLmNzIjsKKyAgZl9zZXJ2aWNlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOworCisgIGZfc2VydmljZV8gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgY3NoYXJwX3R5cGVfdXNpbmdzKCkgPDwgY3NoYXJwX3RocmlmdF91c2luZ3MoKSA8PCBlbmRsOworCisgIHN0YXJ0X2NzaGFycF9uYW1lc3BhY2UoZl9zZXJ2aWNlXyk7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgcGFydGlhbCBjbGFzcyAiIDw8IG5vcm1hbGl6ZV9uYW1lKHNlcnZpY2VfbmFtZV8pIDw8ICIgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRzZXJ2aWNlKTsKKworICBpbmRlbnRfZG93bigpOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKKyAgZW5kX2NzaGFycF9uYW1lc3BhY2UoZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8uY2xvc2UoKTsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgZ2VuZXJhdGVfc2VwYXJhdGVfc2VydmljZV9pbnRlcmZhY2VzKHRzZXJ2aWNlKTsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcGFyYXRlX3NlcnZpY2VfaW50ZXJmYWNlcyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIGdlbmVyYXRlX3N5bmNfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UpOworCisgIGlmIChhc3luY18pIHsKKyAgICBnZW5lcmF0ZV9hc3luY19zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSk7CisgIH0KKworICBnZW5lcmF0ZV9jb21iaW5lZF9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSk7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zeW5jX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfaWZhY2UgPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICBleHRlbmRzX2lmYWNlID0gIiA6ICIgKyBleHRlbmRzICsgIi5JU3luYyI7CisgIH0KKworICBnZW5lcmF0ZV9jc2hhcnBfZG9jKGZfc2VydmljZV8sIHRzZXJ2aWNlKTsKKworICBpZiAod2NmXykgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiW1N5c3RlbS5TZXJ2aWNlTW9kZWwuU2VydmljZUNvbnRyYWN0KE5hbWVzcGFjZT1cIiIgPDwgd2NmX25hbWVzcGFjZV8gPDwgIlwiKV0iIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgaW50ZXJmYWNlIElTeW5jIiA8PCBleHRlbmRzX2lmYWNlIDw8ICIgeyIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZ2VuZXJhdGVfY3NoYXJwX2RvYyhmX3NlcnZpY2VfLCAqZl9pdGVyKTsKKworICAgIC8vIGlmIHdlJ3JlIHVzaW5nIFdDRiwgYWRkIHRoZSBjb3JyZXNwb25kaW5nIGF0dHJpYnV0ZXMKKyAgICBpZiAod2NmXykgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJbU3lzdGVtLlNlcnZpY2VNb2RlbC5PcGVyYXRpb25Db250cmFjdF0iIDw8IGVuZGw7CisKKyAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCktPmdldF9tZW1iZXJzKCk7CisgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIltTeXN0ZW0uU2VydmljZU1vZGVsLkZhdWx0Q29udHJhY3QodHlwZW9mKCIKKyAgICAgICAgICArIHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCksIGZhbHNlLCBmYWxzZSkgKyAiRmF1bHQpKV0iIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCAiOyIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bigpOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9hc3luY19zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX2lmYWNlID0gIiI7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7CisgICAgZXh0ZW5kc19pZmFjZSA9ICIgOiAiICsgZXh0ZW5kcyArICIuSUFzeW5jIjsKKyAgfQorCisgIGdlbmVyYXRlX2NzaGFycF9kb2MoZl9zZXJ2aWNlXywgdHNlcnZpY2UpOworCisgIGlmICh3Y2ZfKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJbU3lzdGVtLlNlcnZpY2VNb2RlbC5TZXJ2aWNlQ29udHJhY3QoTmFtZXNwYWNlPVwiIiA8PCB3Y2ZfbmFtZXNwYWNlXyA8PCAiXCIpXSIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBpbnRlcmZhY2UgSUFzeW5jIiA8PCBleHRlbmRzX2lmYWNlIDw8ICIgeyIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZ2VuZXJhdGVfY3NoYXJwX2RvYyhmX3NlcnZpY2VfLCAqZl9pdGVyKTsKKworICAgIC8vIGlmIHdlJ3JlIHVzaW5nIFdDRiwgYWRkIHRoZSBjb3JyZXNwb25kaW5nIGF0dHJpYnV0ZXMKKyAgICBpZiAod2NmXykgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJbU3lzdGVtLlNlcnZpY2VNb2RlbC5PcGVyYXRpb25Db250cmFjdF0iIDw8IGVuZGw7CisKKyAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCktPmdldF9tZW1iZXJzKCk7CisgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIltTeXN0ZW0uU2VydmljZU1vZGVsLkZhdWx0Q29udHJhY3QodHlwZW9mKCIKKyAgICAgICAgICArIHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCksIGZhbHNlLCBmYWxzZSkgKyAiRmF1bHQpKV0iIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZV9hc3luYygqZl9pdGVyKSA8PCAiOyIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bigpOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb21iaW5lZF9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBleHRlbmRzX2lmYWNlID0gIiA6IElTeW5jIjsKKworICBpZiAoYXN5bmNfKSB7CisgICAgZXh0ZW5kc19pZmFjZSArPSAiLCBJQXN5bmMiOworICB9CisKKyAgZ2VuZXJhdGVfY3NoYXJwX2RvYyhmX3NlcnZpY2VfLCB0c2VydmljZSk7CisKKyAgaWYgKHdjZl8pIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIltTeXN0ZW0uU2VydmljZU1vZGVsLlNlcnZpY2VDb250cmFjdChOYW1lc3BhY2U9XCIiIDw8IHdjZl9uYW1lc3BhY2VfIDw8ICJcIildIiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgaW50ZXJmYWNlIElmYWNlIiA8PCBleHRlbmRzX2lmYWNlIDw8ICIgeyIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKworICAvLyBXZSBuZWVkIHRvIGdlbmVyYXRlIGV4dHJhIG9sZCBzdHlsZSBhc3luYyBtZXRob2RzIGZvciBzaWx2ZXJsaWdodC4gU2luY2UKKyAgLy8gdGhpcyBpc24ndCBzb21ldGhpbmcgeW91J2Qgd2FudCB0byBpbXBsZW1lbnQgc2VydmVyLXNpZGUsIGp1c3QgcHV0IHRoZW0gaW50bworICAvLyB0aGUgbWFpbiBJZmFjZSBpbnRlcmZhY2UuCisgIGdlbmVyYXRlX3NpbHZlcmxpZ2h0X2FzeW5jX21ldGhvZHModHNlcnZpY2UpOworCisgIGluZGVudF9kb3duKCk7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2lsdmVybGlnaHRfYXN5bmNfbWV0aG9kcyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGdlbmVyYXRlX2NzaGFycF9kb2MoZl9zZXJ2aWNlXywgKmZfaXRlcik7CisKKyAgICAvLyBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIGluY2x1ZGUgdGhlIEJlZ2luXywgRW5kXyBtZXRob2RzIGlmIHdlJ3JlIGdlbmVyYXRpbmcKKyAgICAvLyB3aXRoIHRoZSBhc3luYyBmbGFnLiBJJ20gbm90IHN1cmUgdGhpcyBpcyBuZWNlc3NhcnksIHNvIHNvbWVvbmUgd2l0aCBtb3JlIGtub3dsZWRnZQorICAgIC8vIGNhbiBtYXliZSByZW1vdmUgdGhlc2UgY2hlY2tzIGlmIHRoZXkga25vdyBpdCdzIHNhZmUuCisgICAgaWYgKCFhc3luY18pIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiI2lmIFNJTFZFUkxJR0hUIiA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBmdW5jdGlvbl9zaWduYXR1cmVfYXN5bmNfYmVnaW4oKmZfaXRlciwgIkJlZ2luXyIpIDw8ICI7IiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBmdW5jdGlvbl9zaWduYXR1cmVfYXN5bmNfZW5kKCpmX2l0ZXIsICJFbmRfIikgPDwgIjsiIDw8IGVuZGw7CisKKyAgICBpZiAoIWFzeW5jXykgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIjZW5kaWYiIDw8IGVuZGw7CisgICAgfQorICB9Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSkgeworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgdHMsIGZhbHNlLCB0cnVlKTsKKyAgICBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKCpmX2l0ZXIpOworICB9Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX2NsaWVudCA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgIGV4dGVuZHNfY2xpZW50ID0gZXh0ZW5kcyArICIuQ2xpZW50LCAiOworICB9IGVsc2UgeworICAgIGV4dGVuZHNfY2xpZW50ID0gIklEaXNwb3NhYmxlLCAiOworICB9CisKKyAgZ2VuZXJhdGVfY3NoYXJwX2RvYyhmX3NlcnZpY2VfLCB0c2VydmljZSk7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgY2xhc3MgQ2xpZW50IDogIiA8PCBleHRlbmRzX2NsaWVudCA8PCAiSWZhY2UgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIENsaWVudChUUHJvdG9jb2wgcHJvdCkgOiB0aGlzKHByb3QsIHByb3QpIiA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIENsaWVudChUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCkiOworICBpZiAoIWV4dGVuZHMuZW1wdHkoKSkgeworICAgIGZfc2VydmljZV8gPDwgIiA6IGJhc2UoaXByb3QsIG9wcm90KSI7CisgIH0KKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaXByb3RfID0gaXByb3Q7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdF8gPSBvcHJvdDsiIDw8IGVuZGw7CisgIH0KKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInByb3RlY3RlZCBUUHJvdG9jb2wgaXByb3RfOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgInByb3RlY3RlZCBUUHJvdG9jb2wgb3Byb3RfOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicHJvdGVjdGVkIGludCBzZXFpZF87IgorICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBlbmRsOworCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicHVibGljIFRQcm90b2NvbCBJbnB1dFByb3RvY29sIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZ2V0IHsgcmV0dXJuIGlwcm90XzsgfSIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicHVibGljIFRQcm90b2NvbCBPdXRwdXRQcm90b2NvbCIgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImdldCB7IHJldHVybiBvcHJvdF87IH0iIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiI3JlZ2lvbiBcIiBJRGlzcG9zYWJsZSBTdXBwb3J0IFwiIiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJpdmF0ZSBib29sIF9Jc0Rpc3Bvc2VkOyIgPDwgZW5kbCA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiLy8gSURpc3Bvc2FibGUiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgdm9pZCBEaXNwb3NlKCkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJEaXNwb3NlKHRydWUpOyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBlbmRsIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwcm90ZWN0ZWQgdmlydHVhbCB2b2lkIERpc3Bvc2UoYm9vbCBkaXNwb3NpbmcpIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaWYgKCFfSXNEaXNwb3NlZCkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpZiAoZGlzcG9zaW5nKSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImlmIChpcHJvdF8gIT0gbnVsbCkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIoKElEaXNwb3NhYmxlKWlwcm90XykuRGlzcG9zZSgpOyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaWYgKG9wcm90XyAhPSBudWxsKSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIigoSURpc3Bvc2FibGUpb3Byb3RfKS5EaXNwb3NlKCk7IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiX0lzRGlzcG9zZWQgPSB0cnVlOyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiI2VuZHJlZ2lvbiIgPDwgZW5kbDsKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGVuZGw7CisKKyAgICBpZiAoIWFzeW5jXykgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIjaWYgU0lMVkVSTElHSFQiIDw8IGVuZGw7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgZW5kbDsKKyAgICB9CisgICAgLy8gQmVnaW5fCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmVfYXN5bmNfYmVnaW4oKmZfaXRlciwgIkJlZ2luXyIpIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gIgorICAgICAgICAgICAgICAgICAgICAgICA8PCAic2VuZF8iIDw8IGZ1bm5hbWUgPDwgIihjYWxsYmFjaywgc3RhdGUiOworCisgICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgcHJlcGFyZV9tZW1iZXJfbmFtZV9tYXBwaW5nKGFyZ19zdHJ1Y3QpOworCisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKKyAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOworICAgICAgZl9zZXJ2aWNlXyA8PCBub3JtYWxpemVfbmFtZSgoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgICAgLy8gRW5kCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmVfYXN5bmNfZW5kKCpmX2l0ZXIsICJFbmRfIikgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIm9wcm90Xy5UcmFuc3BvcnQuRW5kRmx1c2goYXN5bmNSZXN1bHQpOyIgPDwgZW5kbDsKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7CisgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgInJldHVybiAiOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlXyA8PCAicmVjdl8iIDw8IGZ1bm5hbWUgPDwgIigpOyIgPDwgZW5kbDsKKyAgICB9CisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgICAvLyBhc3luYworICAgIGJvb2wgZmlyc3Q7CisgICAgaWYgKGFzeW5jXykgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgYXN5bmMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmVfYXN5bmMoKmZfaXRlciwgIiIpIDw8IGVuZGw7CisgICAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSkgPDwgIiByZXR2YWw7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHZhbCA9ICI7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXyk7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfIDw8ICJhd2FpdCBUYXNrLlJ1bigoKSA9PiIgPDwgZW5kbDsKKyAgICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICAgICAgaW5kZW50KGZfc2VydmljZV8pOworICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBmX3NlcnZpY2VfIDw8ICJyZXR1cm4gIjsKKyAgICAgIH0KKyAgICAgIGZfc2VydmljZV8gPDwgZnVubmFtZSA8PCAiKCI7CisgICAgICBmaXJzdCA9IHRydWU7CisgICAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKKyAgICAgICAgfQorICAgICAgICBmX3NlcnZpY2VfIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlXyA8PCAiKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9KTsiIDw8IGVuZGw7CisgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIHJldHZhbDsiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworICAgIH0KKworICAgIGlmICghYXN5bmNfKSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiNlbmRpZiIgPDwgZW5kbCA8PCBlbmRsOworICAgIH0KKworICAgIGdlbmVyYXRlX2NzaGFycF9kb2MoZl9zZXJ2aWNlXywgKmZfaXRlcik7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICAgIC8vIHNpbHZlcmxpZ2h0IGludm9rZQorICAgIGlmICghYXN5bmNfKSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiNpZiBTSUxWRVJMSUdIVCIgPDwgZW5kbDsKKworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ2YXIgYXN5bmNSZXN1bHQgPSBCZWdpbl8iIDw8IGZ1bm5hbWUgPDwgIihudWxsLCBudWxsIjsKKyAgICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgIiwgIiA8PCBub3JtYWxpemVfbmFtZSgoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgIAorICAgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7CisgICAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8ICJyZXR1cm4gIjsKKyAgICAgICAgfQorICAgICAgICBmX3NlcnZpY2VfIDw8ICJFbmRfIiA8PCBmdW5uYW1lIDw8ICIoYXN5bmNSZXN1bHQpOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIjZWxzZSIgPDwgZW5kbDsKKyAgICB9CisKKyAgICAvLyBzeW5jaHJvbm91cyBpbnZva2UKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInNlbmRfIiA8PCBmdW5uYW1lIDw8ICIoIjsKKyAgCisgICAgZmlyc3QgPSB0cnVlOworICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKKyAgICAgIH0KKyAgICAgIGZfc2VydmljZV8gPDwgbm9ybWFsaXplX25hbWUoKCpmbGRfaXRlciktPmdldF9uYW1lKCkpOworICAgIH0KKyAgICBmX3NlcnZpY2VfIDw8ICIpOyIgPDwgZW5kbDsKKyAgCisgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOworICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBmX3NlcnZpY2VfIDw8ICJyZXR1cm4gIjsKKyAgICAgIH0KKyAgICAgIGZfc2VydmljZV8gPDwgInJlY3ZfIiA8PCBmdW5uYW1lIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAgIGlmICghYXN5bmNfKSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiNlbmRpZiIgPDwgZW5kbDsKKyAgICB9CisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKworICAgIC8vIFNlbmQKKyAgICB0X2Z1bmN0aW9uIHNlbmRfZnVuY3Rpb24oZ190eXBlX3ZvaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygic2VuZF8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpKTsKKworICAgIHN0cmluZyBhcmdzbmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfYXJncyI7CisKKyAgICBpZiAoIWFzeW5jXykgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIjaWYgU0lMVkVSTElHSFQiIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmVfYXN5bmNfYmVnaW4oJnNlbmRfZnVuY3Rpb24pIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJvcHJvdF8uV3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKFwiIiA8PCBmdW5uYW1lIDw8ICJcIiwgIgorICAgICAgICAgICAgICAgPDwgKCgqZl9pdGVyKS0+aXNfb25ld2F5KCkgPyAiVE1lc3NhZ2VUeXBlLk9uZXdheSIgOiAiVE1lc3NhZ2VUeXBlLkNhbGwiKQorICAgICAgICAgICAgICAgPDwgIiwgc2VxaWRfKSk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IGFyZ3NuYW1lIDw8ICIgYXJncyA9IG5ldyAiIDw8IGFyZ3NuYW1lCisgICAgICAgICAgICAgICA8PCAiKCk7IiA8PCBlbmRsOworCisgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImFyZ3MuIiA8PCBwcm9wX25hbWUoKmZsZF9pdGVyKSA8PCAiID0gIgorICAgICAgICAgICAgICAgICA8PCBub3JtYWxpemVfbmFtZSgoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiYXJncy5Xcml0ZShvcHJvdF8pOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgIm9wcm90Xy5Xcml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gb3Byb3RfLlRyYW5zcG9ydC5CZWdpbkZsdXNoKGNhbGxiYWNrLCBzdGF0ZSk7IiA8PCBlbmRsOworICAgICAgCisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgICBpZiAoIWFzeW5jXykgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIjZWxzZSIgPDwgZW5kbDsKKyAgICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmc2VuZF9mdW5jdGlvbikgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90Xy5Xcml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UoXCIiIDw8IGZ1bm5hbWUgPDwgIlwiLCAiCisgICAgICAgICAgICAgICA8PCAoKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSA/ICJUTWVzc2FnZVR5cGUuT25ld2F5IiA6ICJUTWVzc2FnZVR5cGUuQ2FsbCIpCisgICAgICAgICAgICAgICA8PCAiLCBzZXFpZF8pKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgYXJnc25hbWUgPDwgIiBhcmdzID0gbmV3ICIgPDwgYXJnc25hbWUKKyAgICAgICAgICAgICAgIDw8ICIoKTsiIDw8IGVuZGw7CisKKyAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiYXJncy4iIDw8IHByb3BfbmFtZSgqZmxkX2l0ZXIpIDw8ICIgPSAiCisgICAgICAgICAgICAgICAgIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJhcmdzLldyaXRlKG9wcm90Xyk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAib3Byb3RfLldyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKKworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAib3Byb3RfLlRyYW5zcG9ydC5GbHVzaCgpOyIgPDwgZW5kbDsKKyAgICBjbGVhbnVwX21lbWJlcl9uYW1lX21hcHBpbmcoYXJnX3N0cnVjdCk7CisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKworICAgIGlmICghYXN5bmNfKSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiNlbmRpZiIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIHN0cmluZyByZXN1bHRuYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOworCisgICAgICB0X3N0cnVjdCBub2FyZ3MocHJvZ3JhbV8pOworICAgICAgdF9mdW5jdGlvbiByZWN2X2Z1bmN0aW9uKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInJlY3ZfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5vYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKSk7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmcmVjdl9mdW5jdGlvbikgPDwgZW5kbDsKKyAgICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgICAgICB0X3N0cnVjdCogeHMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKKyAgICAgIHByZXBhcmVfbWVtYmVyX25hbWVfbWFwcGluZyh4cywgeHMtPmdldF9tZW1iZXJzKCksIHJlc3VsdG5hbWUpOworCisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJUTWVzc2FnZSBtc2cgPSBpcHJvdF8uUmVhZE1lc3NhZ2VCZWdpbigpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAiaWYgKG1zZy5UeXBlID09IFRNZXNzYWdlVHlwZS5FeGNlcHRpb24pIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB4ID0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uLlJlYWQoaXByb3RfKTsiCisgICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlwcm90Xy5SZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAidGhyb3cgeDsiCisgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCByZXN1bHRuYW1lIDw8ICIgcmVzdWx0ID0gbmV3ICIKKyAgICAgICAgICAgICAgICAgPDwgcmVzdWx0bmFtZSA8PCAiKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXN1bHQuUmVhZChpcHJvdF8pOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaXByb3RfLlJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOworCisgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGlmIChudWxsYWJsZV8pIHsKKyAgICAgICAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCkpKSB7CisgICAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAocmVzdWx0LlN1Y2Nlc3MgIT0gbnVsbCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICAgICAgICA8PCAiICByZXR1cm4gcmVzdWx0LlN1Y2Nlc3M7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAocmVzdWx0LlN1Y2Nlc3MuSGFzVmFsdWUpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIiAgcmV0dXJuIHJlc3VsdC5TdWNjZXNzLlZhbHVlOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKHJlc3VsdC5fX2lzc2V0LnN1Y2Nlc3MpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIgIHJldHVybiByZXN1bHQuU3VjY2VzczsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKyAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICAgIGlmIChudWxsYWJsZV8pIHsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAocmVzdWx0LiIgPDwgcHJvcF9uYW1lKCp4X2l0ZXIpIDw8ICIgIT0gbnVsbCkgeyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgdGhyb3cgcmVzdWx0LiIgPDwgcHJvcF9uYW1lKCp4X2l0ZXIpIDw8ICI7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAocmVzdWx0Ll9faXNzZXQuIiA8PCBub3JtYWxpemVfbmFtZSgoKnhfaXRlciktPmdldF9uYW1lKCkpCisgICAgICAgICAgICAgICAgICAgICA8PCAiKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHRocm93IHJlc3VsdC4iIDw8IHByb3BfbmFtZSgqeF9pdGVyKSA8PCAiOyIKKyAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgICA8PCAidGhyb3cgbmV3ICIKKyAgICAgICAgICAgICAgICAgICAgICAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk1pc3NpbmdSZXN1bHQsIFwiIgorICAgICAgICAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZhaWxlZDogdW5rbm93biByZXN1bHRcIik7IiA8PCBlbmRsOworICAgICAgfQorCisgICAgICBjbGVhbnVwX21lbWJlcl9uYW1lX21hcHBpbmcoKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCkpOworICAgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIGlmIChhc3luY18pIHsKKyAgICBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcl9hc3luYyh0c2VydmljZSk7CisgICAgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXJfc3luYyh0c2VydmljZSk7CisgIH0KKyAgZWxzZSB7CisgICAgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXJfc3luYyh0c2VydmljZSk7CisgIH0KK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyX3N5bmModF9zZXJ2aWNlKiB0c2VydmljZSkgeworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19wcm9jZXNzb3IgPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICBleHRlbmRzX3Byb2Nlc3NvciA9IGV4dGVuZHMgKyAiLlByb2Nlc3NvciwgIjsKKyAgfQorCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIGNsYXNzIFByb2Nlc3NvciA6ICIgPDwgZXh0ZW5kc19wcm9jZXNzb3IgPDwgIlRQcm9jZXNzb3IgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgUHJvY2Vzc29yKElTeW5jIGlmYWNlKSI7CisKKyAgaWYgKCFleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8ICIgOiBiYXNlKGlmYWNlKSI7CisgIH0KKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWZhY2VfID0gaWZhY2U7IiA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicHJvY2Vzc01hcF9bXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgPDwgIlwiXSA9ICIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJfUHJvY2VzczsiIDw8IGVuZGw7CisgIH0KKworICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgeworICAgIGZfc2VydmljZV8KKyAgICAgIDw8IGluZGVudCgpCisgICAgICA8PCAicHJvdGVjdGVkIGRlbGVnYXRlIHZvaWQgUHJvY2Vzc0Z1bmN0aW9uKGludCBzZXFpZCwgVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QpOyIKKyAgICAgIDw8IGVuZGw7CisgIH0KKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwcml2YXRlIElTeW5jIGlmYWNlXzsiIDw8IGVuZGw7CisKKyAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInByb3RlY3RlZCBEaWN0aW9uYXJ5PHN0cmluZywgUHJvY2Vzc0Z1bmN0aW9uPiBwcm9jZXNzTWFwXyA9IG5ldyAiCisgICAgICAiRGljdGlvbmFyeTxzdHJpbmcsIFByb2Nlc3NGdW5jdGlvbj4oKTsiIDw8IGVuZGw7CisgIH0KKworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIGJvb2wgUHJvY2VzcyhUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCkiIDw8IGVuZGw7CisgIH0KKyAgZWxzZSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgbmV3IGJvb2wgUHJvY2VzcyhUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCkiIDw8IGVuZGw7CisgIH0KKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidHJ5IiA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJUTWVzc2FnZSBtc2cgPSBpcHJvdC5SZWFkTWVzc2FnZUJlZ2luKCk7IiA8PCBlbmRsOworCisgIGZfc2VydmljZV8KKyAgICA8PCBpbmRlbnQoKSA8PCAiUHJvY2Vzc0Z1bmN0aW9uIGZuOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgIDw8ICJwcm9jZXNzTWFwXy5UcnlHZXRWYWx1ZShtc2cuTmFtZSwgb3V0IGZuKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlmIChmbiA9PSBudWxsKSB7IgorICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgVFByb3RvY29sVXRpbC5Ta2lwKGlwcm90LCBUVHlwZS5TdHJ1Y3QpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgIDw8ICIgIGlwcm90LlJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgPDwgIiAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHggPSBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uICIKKyAgICAiKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLlVua25vd25NZXRob2QsIFwiSW52YWxpZCBtZXRob2QgbmFtZTogJ1wiICsgIgorICAgICJtc2cuTmFtZSArIFwiJ1wiKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICA8PCAiICBvcHJvdC5Xcml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UobXNnLk5hbWUsIFRNZXNzYWdlVHlwZS5FeGNlcHRpb24sIG1zZy5TZXFJRCkpOyIKKyAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHguV3JpdGUob3Byb3QpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBvcHJvdC5Xcml0ZU1lc3NhZ2VFbmQoKTsiCisgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBvcHJvdC5UcmFuc3BvcnQuRmx1c2goKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRydWU7IgorICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImZuKG1zZy5TZXFJRCwgaXByb3QsIG9wcm90KTsiIDw8IGVuZGw7CisKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJjYXRjaCAoSU9FeGNlcHRpb24pIiA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGZhbHNlOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gdHJ1ZTsiIDw8IGVuZGw7CisKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0c2VydmljZSwgKmZfaXRlcik7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyX2FzeW5jKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfcHJvY2Vzc29yID0gIiI7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7CisgICAgZXh0ZW5kc19wcm9jZXNzb3IgPSBleHRlbmRzICsgIi5Bc3luY1Byb2Nlc3NvciwgIjsKKyAgfQorCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIGNsYXNzIEFzeW5jUHJvY2Vzc29yIDogIiA8PCBleHRlbmRzX3Byb2Nlc3NvciA8PCAiVEFzeW5jUHJvY2Vzc29yIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIEFzeW5jUHJvY2Vzc29yKElBc3luYyBpZmFjZSkiOworICBpZiAoIWV4dGVuZHMuZW1wdHkoKSkgeworICAgIGZfc2VydmljZV8gPDwgIiA6IGJhc2UoaWZhY2UpIjsKKyAgfQorICBmX3NlcnZpY2VfIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZmFjZV8gPSBpZmFjZTsiIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwcm9jZXNzTWFwX1tcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICA8PCAiXCJdID0gIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIl9Qcm9jZXNzQXN5bmM7IiA8PCBlbmRsOworICB9CisKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBmX3NlcnZpY2VfCisgICAgICA8PCBpbmRlbnQoKQorICAgICAgPDwgInByb3RlY3RlZCBkZWxlZ2F0ZSBUYXNrIFByb2Nlc3NGdW5jdGlvbihpbnQgc2VxaWQsIFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KTsiCisgICAgICA8PCBlbmRsOworICB9CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicHJpdmF0ZSBJQXN5bmMgaWZhY2VfOyIgPDwgZW5kbDsKKworICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicHJvdGVjdGVkIERpY3Rpb25hcnk8c3RyaW5nLCBQcm9jZXNzRnVuY3Rpb24+IHByb2Nlc3NNYXBfID0gbmV3ICIKKyAgICAgICJEaWN0aW9uYXJ5PHN0cmluZywgUHJvY2Vzc0Z1bmN0aW9uPigpOyIgPDwgZW5kbDsKKyAgfQorCisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgYXN5bmMgVGFzazxib29sPiBQcm9jZXNzQXN5bmMoVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QpIiA8PCBlbmRsOworICB9CisgIGVsc2UgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIG5ldyBhc3luYyBUYXNrPGJvb2w+IFByb2Nlc3NBc3luYyhUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCkiIDw8IGVuZGw7CisgIH0KKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidHJ5IiA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJUTWVzc2FnZSBtc2cgPSBpcHJvdC5SZWFkTWVzc2FnZUJlZ2luKCk7IiA8PCBlbmRsOworCisgIGZfc2VydmljZV8KKyAgICA8PCBpbmRlbnQoKSA8PCAiUHJvY2Vzc0Z1bmN0aW9uIGZuOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgIDw8ICJwcm9jZXNzTWFwXy5UcnlHZXRWYWx1ZShtc2cuTmFtZSwgb3V0IGZuKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlmIChmbiA9PSBudWxsKSB7IgorICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgVFByb3RvY29sVXRpbC5Ta2lwKGlwcm90LCBUVHlwZS5TdHJ1Y3QpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgIDw8ICIgIGlwcm90LlJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgPDwgIiAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHggPSBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uICIKKyAgICAiKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLlVua25vd25NZXRob2QsIFwiSW52YWxpZCBtZXRob2QgbmFtZTogJ1wiICsgIgorICAgICJtc2cuTmFtZSArIFwiJ1wiKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICA8PCAiICBvcHJvdC5Xcml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UobXNnLk5hbWUsIFRNZXNzYWdlVHlwZS5FeGNlcHRpb24sIG1zZy5TZXFJRCkpOyIKKyAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHguV3JpdGUob3Byb3QpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBvcHJvdC5Xcml0ZU1lc3NhZ2VFbmQoKTsiCisgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBvcHJvdC5UcmFuc3BvcnQuRmx1c2goKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRydWU7IgorICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImF3YWl0IGZuKG1zZy5TZXFJRCwgaXByb3QsIG9wcm90KTsiIDw8IGVuZGw7CisKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJjYXRjaCAoSU9FeGNlcHRpb24pIiA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGZhbHNlOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gdHJ1ZTsiIDw8IGVuZGw7CisKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbl9hc3luYyh0c2VydmljZSwgKmZfaXRlcik7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOworICB0X2ZpZWxkIHN1Y2Nlc3ModGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOworICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7CisgIH0KKworICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICByZXN1bHQuYXBwZW5kKCpmX2l0ZXIpOworICB9CisKKyAgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sICZyZXN1bHQsIGZhbHNlLCB0cnVlLCB0cnVlKTsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgICh2b2lkKXRzZXJ2aWNlOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyB2b2lkICIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICA8PCAiX1Byb2Nlc3MoaW50IHNlcWlkLCBUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgIHN0cmluZyBhcmdzbmFtZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfYXJncyI7CisgIHN0cmluZyByZXN1bHRuYW1lID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgYXJnc25hbWUgPDwgIiBhcmdzID0gbmV3ICIgPDwgYXJnc25hbWUgPDwgIigpOyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJhcmdzLlJlYWQoaXByb3QpOyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJpcHJvdC5SZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKKworICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworCisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgcmVzdWx0bmFtZSA8PCAiIHJlc3VsdCA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIigpOyIgPDwgZW5kbDsKKyAgfQorCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRyeSIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpZiAoeGNlcHRpb25zLnNpemUoKSA+IDApIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0cnkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICB9CisKKyAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7CisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8ICJyZXN1bHQuU3VjY2VzcyA9ICI7CisgIH0KKyAgZl9zZXJ2aWNlXyA8PCAiaWZhY2VfLiIgPDwgbm9ybWFsaXplX25hbWUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSA8PCAiKCI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBwcmVwYXJlX21lbWJlcl9uYW1lX21hcHBpbmcoYXJnX3N0cnVjdCk7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgImFyZ3MuIiA8PCBwcm9wX25hbWUoKmZfaXRlcik7CisgICAgaWYgKG51bGxhYmxlXyAmJiAhdHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpKSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICIuVmFsdWUiOworICAgIH0KKyAgfQorICBjbGVhbnVwX21lbWJlcl9uYW1lX21hcHBpbmcoYXJnX3N0cnVjdCk7CisgIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOworCisgIHByZXBhcmVfbWVtYmVyX25hbWVfbWFwcGluZyh4cywgeHMtPmdldF9tZW1iZXJzKCksIHJlc3VsdG5hbWUpOworICBpZiAoeGNlcHRpb25zLnNpemUoKSA+IDApIHsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImNhdGNoICgiIDw8IHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCksIGZhbHNlLCBmYWxzZSkgPDwgIiAiCisgICAgICAgICAgICAgICAgIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LiIgPDwgcHJvcF9uYW1lKCp4X2l0ZXIpIDw8ICIgPSAiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgIDw8ICI7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAib3Byb3QuV3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgIDw8ICJcIiwgVE1lc3NhZ2VUeXBlLlJlcGx5LCBzZXFpZCkpOyAiIDw8IGVuZGw7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LldyaXRlKG9wcm90KTsiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKworICBjbGVhbnVwX21lbWJlcl9uYW1lX21hcHBpbmcoeHMpOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24pIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICB0aHJvdzsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJjYXRjaCAoRXhjZXB0aW9uIGV4KSIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgQ29uc29sZS5FcnJvci5Xcml0ZUxpbmUoXCJFcnJvciBvY2N1cnJlZCBpbiBwcm9jZXNzb3I6XCIpOyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIENvbnNvbGUuRXJyb3IuV3JpdGVMaW5lKGV4LlRvU3RyaW5nKCkpOyIgPDwgZW5kbDsKKworICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICBUQXBwbGljYXRpb25FeGNlcHRpb24geCA9IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24iIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAiKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkludGVybmFsRXJyb3IsXCIgSW50ZXJuYWwgZXJyb3IuXCIpOyIKKyAgICAgICAgICAgICAgIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIG9wcm90LldyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICA8PCAiXCIsIFRNZXNzYWdlVHlwZS5FeGNlcHRpb24sIHNlcWlkKSk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICB4LldyaXRlKG9wcm90KTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90LldyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm9wcm90LlRyYW5zcG9ydC5GbHVzaCgpOyIgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbl9hc3luYyh0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgKHZvaWQpdHNlcnZpY2U7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIGFzeW5jIFRhc2sgIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICA8PCAiX1Byb2Nlc3NBc3luYyhpbnQgc2VxaWQsIFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisKKyAgc3RyaW5nIGFyZ3NuYW1lID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKKyAgc3RyaW5nIHJlc3VsdG5hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBhcmdzbmFtZSA8PCAiIGFyZ3MgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiKCk7IiA8PCBlbmRsCisgICAgPDwgaW5kZW50KCkgPDwgImFyZ3MuUmVhZChpcHJvdCk7IiA8PCBlbmRsCisgICAgPDwgaW5kZW50KCkgPDwgImlwcm90LlJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOworCisgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCByZXN1bHRuYW1lIDw8ICIgcmVzdWx0ID0gbmV3ICIgPDwgcmVzdWx0bmFtZSA8PCAiKCk7IiA8PCBlbmRsOworICB9CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidHJ5IiA8PCBlbmRsCisgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGlmICh4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRyeSIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgIH0KKworICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgIGZfc2VydmljZV8gPDwgInJlc3VsdC5TdWNjZXNzID0gIjsKKyAgfQorICBmX3NlcnZpY2VfIDw8ICJhd2FpdCBpZmFjZV8uIiA8PCBub3JtYWxpemVfbmFtZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpIDw8ICJBc3luYygiOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgcHJlcGFyZV9tZW1iZXJfbmFtZV9tYXBwaW5nKGFyZ19zdHJ1Y3QpOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgImFyZ3MuIiA8PCBwcm9wX25hbWUoKmZfaXRlcik7CisgICAgaWYgKG51bGxhYmxlXyAmJiAhdHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpKSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICIuVmFsdWUiOworICAgIH0KKyAgfQorICBjbGVhbnVwX21lbWJlcl9uYW1lX21hcHBpbmcoYXJnX3N0cnVjdCk7CisgIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOworCisgIHByZXBhcmVfbWVtYmVyX25hbWVfbWFwcGluZyh4cywgeHMtPmdldF9tZW1iZXJzKCksIHJlc3VsdG5hbWUpOworICBpZiAoeGNlcHRpb25zLnNpemUoKSA+IDApIHsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImNhdGNoICgiIDw8IHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCksIGZhbHNlLCBmYWxzZSkgPDwgIiAiCisgICAgICAgIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LiIgPDwgcHJvcF9uYW1lKCp4X2l0ZXIpIDw8ICIgPSAiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgIDw8ICI7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAib3Byb3QuV3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgIDw8ICJcIiwgVE1lc3NhZ2VUeXBlLlJlcGx5LCBzZXFpZCkpOyAiIDw8IGVuZGw7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LldyaXRlKG9wcm90KTsiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKworICBjbGVhbnVwX21lbWJlcl9uYW1lX21hcHBpbmcoeHMpOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwKKyAgICA8PCBpbmRlbnQoKSA8PCAiY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24pIiA8PCBlbmRsCisgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGwKKyAgICA8PCBpbmRlbnQoKSA8PCAiICB0aHJvdzsiIDw8IGVuZGwKKyAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbAorICAgIDw8IGluZGVudCgpIDw8ICJjYXRjaCAoRXhjZXB0aW9uIGV4KSIgPDwgZW5kbAorICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsCisgICAgPDwgaW5kZW50KCkgPDwgIiAgQ29uc29sZS5FcnJvci5Xcml0ZUxpbmUoXCJFcnJvciBvY2N1cnJlZCBpbiBwcm9jZXNzb3I6XCIpOyIgPDwgZW5kbAorICAgIDw8IGluZGVudCgpIDw8ICIgIENvbnNvbGUuRXJyb3IuV3JpdGVMaW5lKGV4LlRvU3RyaW5nKCkpOyIgPDwgZW5kbDsKKworICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKyAgZWxzZSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICBUQXBwbGljYXRpb25FeGNlcHRpb24geCA9IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24iIDw8IGluZGVudCgpCisgICAgICA8PCAiKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkludGVybmFsRXJyb3IsXCIgSW50ZXJuYWwgZXJyb3IuXCIpOyIKKyAgICAgIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICIgIG9wcm90LldyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICA8PCAiXCIsIFRNZXNzYWdlVHlwZS5FeGNlcHRpb24sIHNlcWlkKSk7IiA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAiICB4LldyaXRlKG9wcm90KTsiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90LldyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgIm9wcm90LlRyYW5zcG9ydC5GbHVzaCgpOyIgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX3VuaW9uX3JlYWRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHR1bmlvbikgeworICAvLyBUaGFua3MgdG8gVEhSSUZULTE3NjgsIHdlIGRvbid0IG5lZWQgdG8gY2hlY2sgZm9yIHJlcXVpcmVkIGZpZWxkcyBpbiB0aGUgdW5pb24KKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHVuaW9uLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBzdGF0aWMgIiA8PCB0dW5pb24tPmdldF9uYW1lKCkgPDwgIiBSZWFkKFRQcm90b2NvbCBpcHJvdCkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpcHJvdC5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ0cnkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgaW5kZW50KG91dCkgPDwgdHVuaW9uLT5nZXRfbmFtZSgpIDw8ICIgcmV0dmFsOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgImlwcm90LlJlYWRTdHJ1Y3RCZWdpbigpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIlRGaWVsZCBmaWVsZCA9IGlwcm90LlJlYWRGaWVsZEJlZ2luKCk7IiA8PCBlbmRsOworICAvLyB3ZSBjYW5ub3QgaGF2ZSB0aGUgZmlyc3QgZmllbGQgYmUgYSBzdG9wIC0tIHdlIG11c3QgaGF2ZSBhIHNpbmdsZSBmaWVsZCBkZWZpbmVkCisgIGluZGVudChvdXQpIDw8ICJpZiAoZmllbGQuVHlwZSA9PSBUVHlwZS5TdG9wKSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKyAgaW5kZW50KG91dCkgPDwgImlwcm90LlJlYWRGaWVsZEVuZCgpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInJldHZhbCA9IG5ldyBfX191bmRlZmluZWQoKTsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgaW5kZW50KG91dCkgPDwgImVsc2UiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKGZpZWxkLklEKSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjoiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgImlmIChmaWVsZC5UeXBlID09ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIikgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIgdGVtcDsiIDw8IGVuZGw7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAoKmZfaXRlciksICJ0ZW1wIiwgdHJ1ZSk7CisgICAgaW5kZW50KG91dCkgPDwgInJldHZhbCA9IG5ldyAiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKHRlbXApOyIgPDwgZW5kbDsKKworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyAiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgVFByb3RvY29sVXRpbC5Ta2lwKGlwcm90LCBmaWVsZC5UeXBlKTsiCisgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dmFsID0gbmV3IF9fX3VuZGVmaW5lZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDogIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgIlRQcm90b2NvbFV0aWwuU2tpcChpcHJvdCwgZmllbGQuVHlwZSk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgIDw8ICJyZXR2YWwgPSBuZXcgX19fdW5kZWZpbmVkKCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICBpbmRlbnQob3V0KSA8PCAiaXByb3QuUmVhZEZpZWxkRW5kKCk7IiA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJpZiAoaXByb3QuUmVhZEZpZWxkQmVnaW4oKS5UeXBlICE9IFRUeXBlLlN0b3ApIiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworICBpbmRlbnQob3V0KSA8PCAidGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBKTsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24ob3V0KTsKKworICAvLyBlbmQgb2YgZWxzZSBmb3IgVFN0b3AKKyAgc2NvcGVfZG93bihvdXQpOworICBpbmRlbnQob3V0KSA8PCAiaXByb3QuUmVhZFN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInJldHVybiByZXR2YWw7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworCisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJmaW5hbGx5IiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworICBvdXQgPDwgaW5kZW50KCkgPDwgImlwcm90LkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsOworICBzY29wZV9kb3duKG91dCk7CisKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Byb3BlcnR5bGVzcykgeworICB0X3R5cGUqIHR5cGUgPSB0ZmllbGQtPmdldF90eXBlKCk7CisgIHdoaWxlICh0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICB0eXBlID0gKCh0X3R5cGVkZWYqKXR5cGUpLT5nZXRfdHlwZSgpOworICB9CisKKyAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgREVTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICB9CisKKyAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyAoaXNfcHJvcGVydHlsZXNzID8gIiIgOiBwcm9wX25hbWUodGZpZWxkKSk7CisKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIG5hbWUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiID0gIjsKKworICAgIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIG91dCA8PCAiKCIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlKSA8PCAiKSI7CisgICAgfQorCisgICAgb3V0IDw8ICJpcHJvdC4iOworCisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgICAgb3V0IDw8ICJSZWFkQmluYXJ5KCk7IjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgPDwgIlJlYWRTdHJpbmcoKTsiOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICBvdXQgPDwgIlJlYWRCb29sKCk7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICBvdXQgPDwgIlJlYWRCeXRlKCk7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgb3V0IDw8ICJSZWFkSTE2KCk7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgb3V0IDw8ICJSZWFkSTMyKCk7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgb3V0IDw8ICJSZWFkSTY0KCk7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgb3V0IDw8ICJSZWFkRG91YmxlKCk7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEMjIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgb3V0IDw8ICJSZWFkSTMyKCk7IjsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gREVTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCisgICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7CisgIH0KK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7CisgIGlmICh1bmlvbl8gJiYgdHN0cnVjdC0+aXNfdW5pb24oKSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIiA9ICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIuUmVhZChpcHJvdCk7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8IHByZWZpeCA8PCAiLlJlYWQoaXByb3QpOyIgPDwgZW5kbDsKKyAgfQorfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgeworICBzY29wZV91cChvdXQpOworCisgIHN0cmluZyBvYmo7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIG9iaiA9IHRtcCgiX21hcCIpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIG9iaiA9IHRtcCgiX3NldCIpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBvYmogPSB0bXAoIl9saXN0Iik7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpIDw8ICIoKTsiIDw8IGVuZGw7CisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIlRNYXAgIiA8PCBvYmogPDwgIiA9IGlwcm90LlJlYWRNYXBCZWdpbigpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIlRTZXQgIiA8PCBvYmogPDwgIiA9IGlwcm90LlJlYWRTZXRCZWdpbigpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJUTGlzdCAiIDw8IG9iaiA8PCAiID0gaXByb3QuUmVhZExpc3RCZWdpbigpOyIgPDwgZW5kbDsKKyAgfQorCisgIHN0cmluZyBpID0gdG1wKCJfaSIpOworICBpbmRlbnQob3V0KSA8PCAiZm9yKCBpbnQgIiA8PCBpIDw8ICIgPSAwOyAiIDw8IGkgPDwgIiA8ICIgPDwgb2JqIDw8ICIuQ291bnQiCisgICAgICAgICAgICAgIDw8ICI7ICIKKyAgICAgICAgICAgICAgPDwgIisrIiA8PCBpIDw8ICIpIiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIHByZWZpeCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBwcmVmaXgpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgcHJlZml4KTsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlwcm90LlJlYWRNYXBFbmQoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlwcm90LlJlYWRTZXRFbmQoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5SZWFkTGlzdEVuZCgpOyIgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7CisgIHN0cmluZyBrZXkgPSB0bXAoIl9rZXkiKTsKKyAgc3RyaW5nIHZhbCA9IHRtcCgiX3ZhbCIpOworCisgIHRfZmllbGQgZmtleSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KTsKKyAgdF9maWVsZCBmdmFsKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2YWwpOworCisgIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZrZXkpIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZ2YWwpIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmtleSk7CisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZ2YWwpOworCisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiWyIgPDwga2V5IDw8ICJdID0gIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgeworICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKKyAgdF9maWVsZCBmZWxlbSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOworCisgIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZlbGVtKSA8PCBlbmRsOworCisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKKworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi5BZGQoIiA8PCBlbGVtIDw8ICIpOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7CisgIHRfZmllbGQgZmVsZW0odGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZmVsZW0pIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOworCisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLkFkZCgiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2VsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcHJvcGVydHlsZXNzKSB7CisgIHRfdHlwZSogdHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKKyAgd2hpbGUgKHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHR5cGUgPSAoKHRfdHlwZWRlZiopdHlwZSktPmdldF90eXBlKCk7CisgIH0KKworICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIChpc19wcm9wZXJ0eWxlc3MgPyAiIiA6IHByb3BfbmFtZSh0ZmllbGQpKTsKKworICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgbmFtZTsKKyAgfQorCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LiI7CisKKyAgICBzdHJpbmcgbnVsbGFibGVfbmFtZSA9IG51bGxhYmxlXyAmJiAhaXNfZWxlbWVudCAmJiAhZmllbGRfaXNfcmVxdWlyZWQodGZpZWxkKSA/IG5hbWUgKyAiLlZhbHVlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbmFtZTsKKworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICAgIG91dCA8PCAiV3JpdGVCaW5hcnkoIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgPDwgIldyaXRlU3RyaW5nKCI7CisgICAgICAgIH0KKyAgICAgICAgb3V0IDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIG91dCA8PCAiV3JpdGVCb29sKCIgPDwgbnVsbGFibGVfbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIG91dCA8PCAiV3JpdGVCeXRlKCIgPDwgbnVsbGFibGVfbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICBvdXQgPDwgIldyaXRlSTE2KCIgPDwgbnVsbGFibGVfbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBvdXQgPDwgIldyaXRlSTMyKCIgPDwgbnVsbGFibGVfbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICBvdXQgPDwgIldyaXRlSTY0KCIgPDwgbnVsbGFibGVfbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICBvdXQgPDwgIldyaXRlRG91YmxlKCIgPDwgbnVsbGFibGVfbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gQyMgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICBvdXQgPDwgIldyaXRlSTMyKChpbnQpIiA8PCBudWxsYWJsZV9uYW1lIDw8ICIpOyI7CisgICAgfQorICAgIG91dCA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIFNFUklBTElaRSAnJXMlcycgVFlQRSAnJXMnXG4iLAorICAgICAgICAgICBwcmVmaXguY19zdHIoKSwKKyAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgIHR5cGVfbmFtZSh0eXBlKS5jX3N0cigpKTsKKyAgfQorfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgKHZvaWQpdHN0cnVjdDsKKyAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiLldyaXRlKG9wcm90KTsiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkgeworICBzY29wZV91cChvdXQpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3QuV3JpdGVNYXBCZWdpbihuZXcgVE1hcCgiIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKQorICAgICAgICAgICAgICAgIDw8ICIsICIgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpIDw8ICIsICIgPDwgcHJlZml4CisgICAgICAgICAgICAgICAgPDwgIi5Db3VudCkpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3QuV3JpdGVTZXRCZWdpbihuZXcgVFNldCgiIDw8IHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkKKyAgICAgICAgICAgICAgICA8PCAiLCAiIDw8IHByZWZpeCA8PCAiLkNvdW50KSk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3QuV3JpdGVMaXN0QmVnaW4obmV3IFRMaXN0KCIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiIDw8IHByZWZpeCA8PCAiLkNvdW50KSk7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIH0KKworICBzdHJpbmcgaXRlciA9IHRtcCgiX2l0ZXIiKTsKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJmb3JlYWNoICgiIDw8IHR5cGVfbmFtZSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKSA8PCAiICIgPDwgaXRlcgorICAgICAgICAgICAgICAgIDw8ICIgaW4gIiA8PCBwcmVmaXggPDwgIi5LZXlzKSI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImZvcmVhY2ggKCIgPDwgdHlwZV9uYW1lKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiICIgPDwgaXRlcgorICAgICAgICAgICAgICAgIDw8ICIgaW4gIiA8PCBwcmVmaXggPDwgIikiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yZWFjaCAoIiA8PCB0eXBlX25hbWUoKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiICIgPDwgaXRlcgorICAgICAgICAgICAgICAgIDw8ICIgaW4gIiA8PCBwcmVmaXggPDwgIikiOworICB9CisKKyAgb3V0IDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIGl0ZXIsIHByZWZpeCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgaXRlcik7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgaXRlcik7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC5Xcml0ZU1hcEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3QuV3JpdGVTZXRFbmQoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC5Xcml0ZUxpc3RFbmQoKTsiIDw8IGVuZGw7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBtYXApIHsKKyAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksIGl0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAma2ZpZWxkLCAiIiwgdHJ1ZSk7CisgIHRfZmllbGQgdmZpZWxkKHRtYXAtPmdldF92YWxfdHlwZSgpLCBtYXAgKyAiWyIgKyBpdGVyICsgIl0iKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJnZmaWVsZCwgIiIsIHRydWUpOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBpdGVyKSB7CisgIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiLCB0cnVlKTsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyKSB7CisgIHRfZmllbGQgZWZpZWxkKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIiwgdHJ1ZSk7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9wZXJ0eShvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNQdWJsaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBnZW5lcmF0ZUlzc2V0KSB7CisgIGdlbmVyYXRlX2NzaGFycF9wcm9wZXJ0eShvdXQsIHRmaWVsZCwgaXNQdWJsaWMsIGdlbmVyYXRlSXNzZXQsICJfIik7Cit9Cit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX3Byb3BlcnR5KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzUHVibGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGdlbmVyYXRlSXNzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkUHJlZml4KSB7CisgIGlmICgoc2VyaWFsaXplXyB8fCB3Y2ZfKSAmJiBpc1B1YmxpYykgeworICAgIGluZGVudChvdXQpIDw8ICJbRGF0YU1lbWJlcihPcmRlciA9IDApXSIgPDwgZW5kbDsKKyAgfQorICBib29sIGhhc19kZWZhdWx0ID0gZmllbGRfaGFzX2RlZmF1bHQodGZpZWxkKTsKKyAgYm9vbCBpc19yZXF1aXJlZCA9IGZpZWxkX2lzX3JlcXVpcmVkKHRmaWVsZCk7CisgIGlmICgobnVsbGFibGVfICYmICFoYXNfZGVmYXVsdCkgfHwgKGlzX3JlcXVpcmVkKSkgeworICAgIGluZGVudChvdXQpIDw8IChpc1B1YmxpYyA/ICJwdWJsaWMgIiA6ICJwcml2YXRlICIpCisgICAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlLCB0cnVlLCBpc19yZXF1aXJlZCkgPDwgIiAiCisgICAgICAgICAgICAgICAgPDwgcHJvcF9uYW1lKHRmaWVsZCkgPDwgIiB7IGdldDsgc2V0OyB9IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChvdXQpIDw8IChpc1B1YmxpYyA/ICJwdWJsaWMgIiA6ICJwcml2YXRlICIpCisgICAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlLCB0cnVlKSA8PCAiICIgPDwgcHJvcF9uYW1lKHRmaWVsZCkKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgaW5kZW50KG91dCkgPDwgImdldCIgPDwgZW5kbDsKKyAgICBzY29wZV91cChvdXQpOworICAgIGJvb2wgdXNlX251bGxhYmxlID0gZmFsc2U7CisgICAgaWYgKG51bGxhYmxlXykgeworICAgICAgdF90eXBlKiB0dHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKKyAgICAgIHdoaWxlICh0dHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgICAgIHR0eXBlID0gKCh0X3R5cGVkZWYqKXR0eXBlKS0+Z2V0X3R5cGUoKTsKKyAgICAgIH0KKyAgICAgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgICAgdXNlX251bGxhYmxlID0gKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpICE9IHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzsKKyAgICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgICB1c2VfbnVsbGFibGUgPSB0cnVlOworICAgICAgfQorICAgIH0KKyAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuICIgPDwgZmllbGRQcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihvdXQpOworICAgIGluZGVudChvdXQpIDw8ICJzZXQiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBpZiAodXNlX251bGxhYmxlKSB7CisgICAgICBpZiAoZ2VuZXJhdGVJc3NldCkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiX19pc3NldC4iIDw8IG5vcm1hbGl6ZV9uYW1lKHRmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIiA9IHZhbHVlLkhhc1ZhbHVlOyIKKyAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAodmFsdWUuSGFzVmFsdWUpIHRoaXMuIiA8PCBmaWVsZFByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgPDwgIiA9IHZhbHVlLlZhbHVlOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKGdlbmVyYXRlSXNzZXQpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIl9faXNzZXQuIiA8PCBub3JtYWxpemVfbmFtZSh0ZmllbGQtPmdldF9uYW1lKCkpIDw8ICIgPSB0cnVlOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRQcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIiA9IHZhbHVlOyIgPDwgZW5kbDsKKyAgICB9CisgICAgc2NvcGVfZG93bihvdXQpOworICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgfQorICBvdXQgPDwgZW5kbDsKK30KKworc3RkOjpzdHJpbmcgdF9jc2hhcnBfZ2VuZXJhdG9yOjptYWtlX3ZhbGlkX2NzaGFycF9pZGVudGlmaWVyKHN0ZDo6c3RyaW5nIGNvbnN0JiBmcm9tTmFtZSkgeworICBzdGQ6OnN0cmluZyBzdHIgPSBmcm9tTmFtZTsKKyAgaWYgKHN0ci5lbXB0eSgpKSB7CisgICAgcmV0dXJuIHN0cjsKKyAgfQorCisgIC8vIHRlc3RzIHJlbHkgb24gdGhpcworICBhc3NlcnQoKCdBJyA8ICdaJykgJiYgKCdhJyA8ICd6JykgJiYgKCcwJyA8ICc5JykpOworCisgIC8vIGlmIHRoZSBmaXJzdCBsZXR0ZXIgaXMgYSBudW1iZXIsIHdlIGFkZCBhbiBhZGRpdGlvbmFsIHVuZGVyc2NvcmUgaW4gZnJvbnQgb2YgaXQKKyAgY2hhciBjID0gc3RyLmF0KDApOworICBpZiAoKCcwJyA8PSBjKSAmJiAoYyA8PSAnOScpKSB7CisgICAgc3RyID0gIl8iICsgc3RyOworICB9CisKKyAgLy8gZm9sbG93aW5nIGNoYXJzOiBsZXR0ZXIsIG51bWJlciBvciB1bmRlcnNjb3JlCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3RyLnNpemUoKTsgKytpKSB7CisgICAgYyA9IHN0ci5hdChpKTsKKyAgICBpZiAoKCgnQScgPiBjKSB8fCAoYyA+ICdaJykpICYmICgoJ2EnID4gYykgfHwgKGMgPiAneicpKSAmJiAoKCcwJyA+IGMpIHx8IChjID4gJzknKSkKKyAgICAgICAgJiYgKCdfJyAhPSBjKSkgeworICAgICAgc3RyLnJlcGxhY2UoaSwgMSwgIl8iKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gc3RyOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Y2xlYW51cF9tZW1iZXJfbmFtZV9tYXBwaW5nKHZvaWQqIHNjb3BlKSB7CisgIGlmKCBtZW1iZXJfbWFwcGluZ19zY29wZXMuZW1wdHkoKSkgeworICAgIHRocm93ICJpbnRlcm5hbCBlcnJvcjogY2xlYW51cF9tZW1iZXJfbmFtZV9tYXBwaW5nKCkgbm8gc2NvcGUgYWN0aXZlIjsKKyAgfQorCisgIG1lbWJlcl9tYXBwaW5nX3Njb3BlJiBhY3RpdmUgPSBtZW1iZXJfbWFwcGluZ19zY29wZXMuYmFjaygpOworICBpZiAoYWN0aXZlLnNjb3BlX21lbWJlciAhPSBzY29wZSkgeworICAgIHRocm93ICJpbnRlcm5hbCBlcnJvcjogY2xlYW51cF9tZW1iZXJfbmFtZV9tYXBwaW5nKCkgY2FsbGVkIGZvciB3cm9uZyBzdHJ1Y3QiOworICB9CisKKyAgbWVtYmVyX21hcHBpbmdfc2NvcGVzLnBvcF9iYWNrKCk7Cit9CisKK3N0cmluZyB0X2NzaGFycF9nZW5lcmF0b3I6OmdldF9tYXBwZWRfbWVtYmVyX25hbWUoc3RyaW5nIG5hbWUpIHsKKyAgaWYoICEgbWVtYmVyX21hcHBpbmdfc2NvcGVzLmVtcHR5KCkpIHsKKyAgICBtZW1iZXJfbWFwcGluZ19zY29wZSYgYWN0aXZlID0gbWVtYmVyX21hcHBpbmdfc2NvcGVzLmJhY2soKTsKKyAgICBtYXA8c3RyaW5nLCBzdHJpbmc+OjppdGVyYXRvciBpdGVyID0gYWN0aXZlLm1hcHBpbmdfdGFibGUuZmluZChuYW1lKTsKKyAgICBpZiAoYWN0aXZlLm1hcHBpbmdfdGFibGUuZW5kKCkgIT0gaXRlcikgeworICAgICAgcmV0dXJuIGl0ZXItPnNlY29uZDsKKyAgICB9CisgIH0KKworICBwdmVyYm9zZSgibm8gbWFwcGluZyBmb3IgbWVtYmVyICVzXG4iLCBuYW1lLmNfc3RyKCkpOworICByZXR1cm4gbmFtZTsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OnByZXBhcmVfbWVtYmVyX25hbWVfbWFwcGluZyh0X3N0cnVjdCogdHN0cnVjdCkgeworICBwcmVwYXJlX21lbWJlcl9uYW1lX21hcHBpbmcodHN0cnVjdCwgdHN0cnVjdC0+Z2V0X21lbWJlcnMoKSwgdHN0cnVjdC0+Z2V0X25hbWUoKSk7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpwcmVwYXJlX21lbWJlcl9uYW1lX21hcHBpbmcodm9pZCogc2NvcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgc3RydWN0bmFtZSkgeworICAvLyBiZWdpbiBuZXcgc2NvcGUKKyAgbWVtYmVyX21hcHBpbmdfc2NvcGUgZHVtbXk7CisgIGR1bW15LnNjb3BlX21lbWJlciA9IDA7CisgIG1lbWJlcl9tYXBwaW5nX3Njb3Blcy5wdXNoX2JhY2soZHVtbXkpOworICBtZW1iZXJfbWFwcGluZ19zY29wZSYgYWN0aXZlID0gbWVtYmVyX21hcHBpbmdfc2NvcGVzLmJhY2soKTsKKyAgYWN0aXZlLnNjb3BlX21lbWJlciA9IHNjb3BlOworCisgIC8vIGN1cnJlbnQgQyMgZ2VuZXJhdG9yIHBvbGljeToKKyAgLy8gLSBwcm9wIG5hbWVzIGFyZSBhbHdheXMgcmVuZGVyZWQgd2l0aCBhbiBVcHBlcmNhc2UgZmlyc3QgbGV0dGVyCisgIC8vIC0gc3RydWN0IG5hbWVzIGFyZSB1c2VkIGFzIGdpdmVuCisgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiB1c2VkX21lbWJlcl9uYW1lczsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKworICAvLyBwcmV2ZW50IG5hbWUgY29uZmxpY3RzIHdpdGggc3RydWN0IChDUzA1NDIgZXJyb3IpCisgIHVzZWRfbWVtYmVyX25hbWVzLmluc2VydChzdHJ1Y3RuYW1lKTsKKworICAvLyBwcmV2ZW50IG5hbWUgY29uZmxpY3RzIHdpdGgga25vd24gbWV0aG9kcyAoVEhSSUZULTI5NDIpCisgIHVzZWRfbWVtYmVyX25hbWVzLmluc2VydCgiUmVhZCIpOworICB1c2VkX21lbWJlcl9uYW1lcy5pbnNlcnQoIldyaXRlIik7CisKKyAgZm9yIChpdGVyID0gbWVtYmVycy5iZWdpbigpOyBpdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsraXRlcikgeworICAgIHN0cmluZyBvbGRuYW1lID0gKCppdGVyKS0+Z2V0X25hbWUoKTsKKyAgICBzdHJpbmcgbmV3bmFtZSA9IHByb3BfbmFtZSgqaXRlciwgdHJ1ZSk7CisgICAgd2hpbGUgKHRydWUpIHsKKworICAgICAgLy8gbmV3IG5hbWUgY29uZmxpY3RzIHdpdGggYW5vdGhlciBtZW1iZXIKKyAgICAgIGlmICh1c2VkX21lbWJlcl9uYW1lcy5maW5kKG5ld25hbWUpICE9IHVzZWRfbWVtYmVyX25hbWVzLmVuZCgpKSB7CisgICAgICAgIHB2ZXJib3NlKCJzdHJ1Y3QgJXM6IG1lbWJlciAlcyBjb25mbGljdHMgd2l0aCBhbm90aGVyIG1lbWJlclxuIiwKKyAgICAgICAgICAgICAgICAgc3RydWN0bmFtZS5jX3N0cigpLAorICAgICAgICAgICAgICAgICBuZXduYW1lLmNfc3RyKCkpOworICAgICAgICBuZXduYW1lICs9ICdfJzsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIC8vIGFkZCBhbHdheXMsIHRoaXMgaGVscHMgdXMgdG8gZGV0ZWN0IGVkZ2UgY2FzZXMgbGlrZQorICAgICAgLy8gZGlmZmVyZW50IHNwZWxsaW5ncyAoImZvbyIgYW5kICJGb28iKSB3aXRoaW4gdGhlIHNhbWUgc3RydWN0CisgICAgICBwdmVyYm9zZSgic3RydWN0ICVzOiBtZW1iZXIgbWFwcGluZyAlcyA9PiAlc1xuIiwKKyAgICAgICAgICAgICAgIHN0cnVjdG5hbWUuY19zdHIoKSwKKyAgICAgICAgICAgICAgIG9sZG5hbWUuY19zdHIoKSwKKyAgICAgICAgICAgICAgIG5ld25hbWUuY19zdHIoKSk7CisgICAgICBhY3RpdmUubWFwcGluZ190YWJsZVtvbGRuYW1lXSA9IG5ld25hbWU7CisgICAgICB1c2VkX21lbWJlcl9uYW1lcy5pbnNlcnQobmV3bmFtZSk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KK30KKworc3RkOjpzdHJpbmcgdF9jc2hhcnBfZ2VuZXJhdG9yOjpwcm9wX25hbWUodF9maWVsZCogdGZpZWxkLCBib29sIHN1cHByZXNzX21hcHBpbmcpIHsKKyAgc3RyaW5nIG5hbWUodGZpZWxkLT5nZXRfbmFtZSgpKTsKKyAgaWYgKHN1cHByZXNzX21hcHBpbmcpIHsKKyAgICBuYW1lWzBdID0gdG91cHBlcihuYW1lWzBdKTsKKyAgfSBlbHNlIHsKKyAgICBuYW1lID0gZ2V0X21hcHBlZF9tZW1iZXJfbmFtZShuYW1lKTsKKyAgfQorICByZXR1cm4gbmFtZTsKK30KKworc3RyaW5nIHRfY3NoYXJwX2dlbmVyYXRvcjo6dHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9jb250YWluZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9pbml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fcGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXF1aXJlZCkgeworICAodm9pZClpbl9pbml0OworICB3aGlsZSAodHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHR0eXBlID0gKCh0X3R5cGVkZWYqKXR0eXBlKS0+Z2V0X3R5cGUoKTsKKyAgfQorCisgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICByZXR1cm4gYmFzZV90eXBlX25hbWUoKHRfYmFzZV90eXBlKil0dHlwZSwgaW5fY29udGFpbmVyLCBpbl9wYXJhbSwgaXNfcmVxdWlyZWQpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHRfbWFwKiB0bWFwID0gKHRfbWFwKil0dHlwZTsKKyAgICByZXR1cm4gIkRpY3Rpb25hcnk8IiArIHR5cGVfbmFtZSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwgdHJ1ZSkgKyAiLCAiCisgICAgICAgICAgICsgdHlwZV9uYW1lKHRtYXAtPmdldF92YWxfdHlwZSgpLCB0cnVlKSArICI+IjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3NldCogdHNldCA9ICh0X3NldCopdHR5cGU7CisgICAgcmV0dXJuICJUSGFzaFNldDwiICsgdHlwZV9uYW1lKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgdHJ1ZSkgKyAiPiI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHRfbGlzdCogdGxpc3QgPSAodF9saXN0Kil0dHlwZTsKKyAgICByZXR1cm4gIkxpc3Q8IiArIHR5cGVfbmFtZSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCB0cnVlKSArICI+IjsKKyAgfQorCisgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR0eXBlLT5nZXRfcHJvZ3JhbSgpOworICBzdHJpbmcgcG9zdGZpeCA9ICghaXNfcmVxdWlyZWQgJiYgbnVsbGFibGVfICYmIGluX3BhcmFtICYmIHR0eXBlLT5pc19lbnVtKCkpID8gIj8iIDogIiI7CisgIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgeworICAgIHN0cmluZyBucyA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2UoImNzaGFycCIpOworICAgIGlmICghbnMuZW1wdHkoKSkgeworICAgICAgcmV0dXJuIG5zICsgIi4iICsgbm9ybWFsaXplX25hbWUodHR5cGUtPmdldF9uYW1lKCkpICsgcG9zdGZpeDsKKyAgICB9CisgIH0KKworICByZXR1cm4gbm9ybWFsaXplX25hbWUodHR5cGUtPmdldF9uYW1lKCkpICsgcG9zdGZpeDsKK30KKworc3RyaW5nIHRfY3NoYXJwX2dlbmVyYXRvcjo6YmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGUqIHRiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9jb250YWluZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX3BhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXF1aXJlZCkgeworICAodm9pZClpbl9jb250YWluZXI7CisgIHN0cmluZyBwb3N0Zml4ID0gKCFpc19yZXF1aXJlZCAmJiBudWxsYWJsZV8gJiYgaW5fcGFyYW0pID8gIj8iIDogIiI7CisgIHN3aXRjaCAodGJhc2UtPmdldF9iYXNlKCkpIHsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgIHJldHVybiAidm9pZCI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgIGlmICh0YmFzZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgIHJldHVybiAiYnl0ZVtdIjsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuICJzdHJpbmciOworICAgIH0KKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgIHJldHVybiAiYm9vbCIgKyBwb3N0Zml4OworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIHJldHVybiAic2J5dGUiICsgcG9zdGZpeDsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgcmV0dXJuICJzaG9ydCIgKyBwb3N0Zml4OworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICByZXR1cm4gImludCIgKyBwb3N0Zml4OworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICByZXR1cm4gImxvbmciICsgcG9zdGZpeDsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgcmV0dXJuICJkb3VibGUiICsgcG9zdGZpeDsKKyAgZGVmYXVsdDoKKyAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEMjIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlLT5nZXRfYmFzZSgpKTsKKyAgfQorfQorCitzdHJpbmcgdF9jc2hhcnBfZ2VuZXJhdG9yOjpkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0LCBzdGQ6OnN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIHJlc3VsdCA9IHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCkpICsgIiAiICsgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICBpZiAoaW5pdCkgeworICAgIHRfdHlwZSogdHR5cGUgPSB0ZmllbGQtPmdldF90eXBlKCk7CisgICAgd2hpbGUgKHR0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICAgIHR0eXBlID0gKCh0X3R5cGVkZWYqKXR0eXBlKS0+Z2V0X3R5cGUoKTsKKyAgICB9CisgICAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiBmaWVsZF9oYXNfZGVmYXVsdCh0ZmllbGQpKSB7CisgICAgICBzdGQ6Om9mc3RyZWFtIGR1bW15OworICAgICAgcmVzdWx0ICs9ICIgPSAiICsgcmVuZGVyX2NvbnN0X3ZhbHVlKGR1bW15LCB0ZmllbGQtPmdldF9uYW1lKCksIHR0eXBlLCB0ZmllbGQtPmdldF92YWx1ZSgpKTsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIHJlc3VsdCArPSAiID0gbnVsbCI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICByZXN1bHQgKz0gIiA9IGZhbHNlIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICByZXN1bHQgKz0gIiA9IDAiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICByZXN1bHQgKz0gIiA9IChkb3VibGUpMCI7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgcmVzdWx0ICs9ICIgPSAoIiArIHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpICsgIikwIjsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgICAgcmVzdWx0ICs9ICIgPSBuZXcgIiArIHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpICsgIigpIjsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ICs9ICIgPSBuZXcgIiArIHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpICsgIigpIjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlc3VsdCArICI7IjsKK30KKworc3RyaW5nIHRfY3NoYXJwX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RyaW5nIHByZWZpeCkgeworICB0X3R5cGUqIHR0eXBlID0gdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpOworICByZXR1cm4gdHlwZV9uYW1lKHR0eXBlKSArICIgIiArIG5vcm1hbGl6ZV9uYW1lKHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgKyAiKCIKKyAgICAgICAgICsgYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpICsgIikiOworfQorCitzdHJpbmcgdF9jc2hhcnBfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmVfYXN5bmNfYmVnaW4odF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdHJpbmcgcHJlZml4KSB7CisgIHN0cmluZyBjb21tYSA9ICh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCkuc2l6ZSgpID4gMCA/ICIsICIgOiAiIik7CisgIHJldHVybiAiSUFzeW5jUmVzdWx0ICIgKyBub3JtYWxpemVfbmFtZShwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkpCisgICAgICAgICArICIoQXN5bmNDYWxsYmFjayBjYWxsYmFjaywgb2JqZWN0IHN0YXRlIiArIGNvbW1hICsgYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpCisgICAgICAgICArICIpIjsKK30KKworc3RyaW5nIHRfY3NoYXJwX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlX2FzeW5jX2VuZCh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0cmluZyBwcmVmaXgpIHsKKyAgdF90eXBlKiB0dHlwZSA9IHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKTsKKyAgcmV0dXJuIHR5cGVfbmFtZSh0dHlwZSkgKyAiICIgKyBub3JtYWxpemVfbmFtZShwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkpCisgICAgICAgICArICIoSUFzeW5jUmVzdWx0IGFzeW5jUmVzdWx0KSI7Cit9CisKK3N0cmluZyB0X2NzaGFycF9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZV9hc3luYyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0cmluZyBwcmVmaXgpIHsKKyAgdF90eXBlKiB0dHlwZSA9IHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKTsKKyAgc3RyaW5nIHRhc2sgPSAiVGFzayI7CisgIGlmICghdHR5cGUtPmlzX3ZvaWQoKSkKKyAgICB0YXNrICs9ICI8IiArIHR5cGVfbmFtZSh0dHlwZSkgKyAiPiI7CisgIHJldHVybiB0YXNrICsgIiAiICsgbm9ybWFsaXplX25hbWUocHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSArICJBc3luYygiCisgICAgICAgICArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKSArICIpIjsKK30KKworc3RyaW5nIHRfY3NoYXJwX2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBzdHJpbmcgcmVzdWx0ID0gIiI7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgKz0gIiwgIjsKKyAgICB9CisgICAgcmVzdWx0ICs9IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF90eXBlKCkpICsgIiAiICsgbm9ybWFsaXplX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCitzdHJpbmcgdF9jc2hhcnBfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7CisgIHdoaWxlICh0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICB0eXBlID0gKCh0X3R5cGVkZWYqKXR5cGUpLT5nZXRfdHlwZSgpOworICB9CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gIlRUeXBlLlN0cmluZyI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICJUVHlwZS5Cb29sIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmV0dXJuICJUVHlwZS5CeXRlIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAiVFR5cGUuSTE2IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAiVFR5cGUuSTMyIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiVFR5cGUuSTY0IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiVFR5cGUuRG91YmxlIjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5JMzIiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLlN0cnVjdCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLk1hcCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLlNldCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5MaXN0IjsKKyAgfQorCisgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF9kb2NzdHJpbmdfY29tbWVudChvc3RyZWFtJiBvdXQsIHN0cmluZyBjb250ZW50cykgeworICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvdXQsICIvLy8gPHN1bW1hcnk+XG4iLCAiLy8vICIsIGNvbnRlbnRzLCAiLy8vIDwvc3VtbWFyeT5cbiIpOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX2RvYyhvc3RyZWFtJiBvdXQsIHRfZmllbGQqIGZpZWxkKSB7CisgIGlmIChmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfZW51bSgpKSB7CisgICAgc3RyaW5nIGNvbWJpbmVkX21lc3NhZ2UgPSBmaWVsZC0+Z2V0X2RvYygpICsgIlxuPHNlZWFsc28gY3JlZj1cIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZ2V0X2VudW1fY2xhc3NfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSkgKyAiXCIvPiI7CisgICAgZ2VuZXJhdGVfY3NoYXJwX2RvY3N0cmluZ19jb21tZW50KG91dCwgY29tYmluZWRfbWVzc2FnZSk7CisgIH0gZWxzZSB7CisgICAgZ2VuZXJhdGVfY3NoYXJwX2RvYyhvdXQsICh0X2RvYyopZmllbGQpOworICB9Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jc2hhcnBfZG9jKG9zdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpIHsKKyAgaWYgKHRkb2MtPmhhc19kb2MoKSkgeworICAgIGdlbmVyYXRlX2NzaGFycF9kb2NzdHJpbmdfY29tbWVudChvdXQsIHRkb2MtPmdldF9kb2MoKSk7CisgIH0KK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF9kb2Mob3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgaWYgKHRmdW5jdGlvbi0+aGFzX2RvYygpKSB7CisgICAgc3RyaW5nc3RyZWFtIHBzOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBwX2l0ZXI7CisgICAgZm9yIChwX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgcF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytwX2l0ZXIpIHsKKyAgICAgIHRfZmllbGQqIHAgPSAqcF9pdGVyOworICAgICAgcHMgPDwgIlxuPHBhcmFtIG5hbWU9XCIiIDw8IHAtPmdldF9uYW1lKCkgPDwgIlwiPiI7CisgICAgICBpZiAocC0+aGFzX2RvYygpKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIHN0ciA9IHAtPmdldF9kb2MoKTsKKyAgICAgICAgc3RyLmVyYXNlKHN0ZDo6cmVtb3ZlKHN0ci5iZWdpbigpLCBzdHIuZW5kKCksICdcbicpLAorICAgICAgICAgICAgICAgICAgc3RyLmVuZCgpKTsgLy8gcmVtb3ZlIHRoZSBuZXdsaW5lcyB0aGF0IGFwcGVhciBmcm9tIHRoZSBwYXJzZXIKKyAgICAgICAgcHMgPDwgc3RyOworICAgICAgfQorICAgICAgcHMgPDwgIjwvcGFyYW0+IjsKKyAgICB9CisgICAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvLy8gIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPHN1bW1hcnk+XG4iICsgdGZ1bmN0aW9uLT5nZXRfZG9jKCkgKyAiPC9zdW1tYXJ5PiIgKyBwcy5zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIik7CisgIH0KK30KKworc3RkOjpzdHJpbmcgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZXRfZW51bV9jbGFzc19uYW1lKHRfdHlwZSogdHlwZSkgeworICBzdHJpbmcgcGFja2FnZSA9ICIiOworICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0eXBlLT5nZXRfcHJvZ3JhbSgpOworICBpZiAocHJvZ3JhbSAhPSBOVUxMICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pIHsKKyAgICBwYWNrYWdlID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiY3NoYXJwIikgKyAiLiI7CisgIH0KKyAgcmV0dXJuIHBhY2thZ2UgKyB0eXBlLT5nZXRfbmFtZSgpOworfQorCisKK1RIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoCisgICAgY3NoYXJwLAorICAgICJDIyIsCisgICAgIiAgICBhc3luYzogICAgICAgICAgIEFkZHMgQXN5bmMgc3VwcG9ydCB1c2luZyBUYXNrLlJ1bi5cbiIKKyAgICAiICAgIHdjZjogICAgICAgICAgICAgQWRkcyBiaW5kaW5ncyBmb3IgV0NGIHRvIGdlbmVyYXRlZCBjbGFzc2VzLlxuIgorICAgICIgICAgc2VyaWFsOiAgICAgICAgICBBZGQgc2VyaWFsaXphdGlvbiBzdXBwb3J0IHRvIGdlbmVyYXRlZCBjbGFzc2VzLlxuIgorICAgICIgICAgbnVsbGFibGU6ICAgICAgICBVc2UgbnVsbGFibGUgdHlwZXMgZm9yIHByb3BlcnRpZXMuXG4iCisgICAgIiAgICBoYXNoY29kZTogICAgICAgIEdlbmVyYXRlIGEgaGFzaGNvZGUgYW5kIGVxdWFscyBpbXBsZW1lbnRhdGlvbiBmb3IgY2xhc3Nlcy5cbiIKKyAgICAiICAgIHVuaW9uOiAgICAgICAgICAgVXNlIG5ldyB1bmlvbiB0eXBpbmcsIHdoaWNoIGluY2x1ZGVzIGEgc3RhdGljIHJlYWQgZnVuY3Rpb24gZm9yIHVuaW9uICIKKyAgICAidHlwZXMuXG4iKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9kX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZF9nZW5lcmF0b3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY1NmNmYwotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZF9nZW5lcmF0b3IuY2MKQEAgLTAsMCArMSw3NDIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KKyAqIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCisgKiBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxjYXNzZXJ0PgorCisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKworI2luY2x1ZGUgInRocmlmdC9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaCIKKwordXNpbmcgc3RkOjptYXA7Cit1c2luZyBzdGQ6Om9mc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjpzZXQ7Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6dmVjdG9yOworCitzdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCisKKy8qKgorICogRCBjb2RlIGdlbmVyYXRvci4KKyAqCisgKiBnZW5lcmF0ZV8qKCkgZnVuY3Rpb25zIGFyZSBjYWxsZWQgYnkgdGhlIGJhc2UgY2xhc3MgdG8gZW1pdCBjb2RlIGZvciB0aGUKKyAqIGdpdmVuIGVudGl0eSwgcHJpbnRfKigpIGZ1bmN0aW9ucyB3cml0ZSBhIHBpZWNlIG9mIGNvZGUgdG8gdGhlIHBhc3NlZAorICogc3RyZWFtLCBhbmQgcmVuZGVyXyooKSByZXR1cm4gYSBzdHJpbmcgY29udGFpbmluZyB0aGUgRCByZXByZXNlbnRhdGlvbiBvZgorICogdGhlIHBhc3NlZCBlbnRpdHkuCisgKi8KK2NsYXNzIHRfZF9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgdF9kX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RyaW5nLCBzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKKyAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCisgICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkgeworICAgICh2b2lkKW9wdGlvbl9zdHJpbmc7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKworICAgIC8qIG5vIG9wdGlvbnMgeWV0ICovCisgICAgZm9yKCBpdGVyID0gcGFyc2VkX29wdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKTsgKytpdGVyKSB7CisgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24gZDoiICsgaXRlci0+Zmlyc3Q7CisgICAgfQorCisgICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tZCI7CisgIH0KKworcHJvdGVjdGVkOgorICB2aXJ0dWFsIHZvaWQgaW5pdF9nZW5lcmF0b3IoKSB7CisgICAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5CisgICAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKKworICAgIHN0cmluZyBkaXIgPSBwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgiZCIpOworICAgIHN0cmluZyBzdWJkaXIgPSBnZXRfb3V0X2RpcigpOworICAgIHN0cmluZzo6c2l6ZV90eXBlIGxvYzsKKyAgICB3aGlsZSAoKGxvYyA9IGRpci5maW5kKCIuIikpICE9IHN0cmluZzo6bnBvcykgeworICAgICAgc3ViZGlyID0gc3ViZGlyICsgIi8iICsgZGlyLnN1YnN0cigwLCBsb2MpOworICAgICAgTUtESVIoc3ViZGlyLmNfc3RyKCkpOworICAgICAgZGlyID0gZGlyLnN1YnN0cihsb2MgKyAxKTsKKyAgICB9CisgICAgaWYgKCFkaXIuZW1wdHkoKSkgeworICAgICAgc3ViZGlyID0gc3ViZGlyICsgIi8iICsgZGlyOworICAgICAgTUtESVIoc3ViZGlyLmNfc3RyKCkpOworICAgIH0KKworICAgIHBhY2thZ2VfZGlyXyA9IHN1YmRpciArICIvIjsKKworICAgIC8vIE1ha2Ugb3V0cHV0IGZpbGUKKyAgICBzdHJpbmcgZl90eXBlc19uYW1lID0gcGFja2FnZV9kaXJfICsgcHJvZ3JhbV9uYW1lXyArICJfdHlwZXMuZCI7CisgICAgZl90eXBlc18ub3BlbihmX3R5cGVzX25hbWUuY19zdHIoKSk7CisKKyAgICAvLyBQcmludCBoZWFkZXIKKyAgICBmX3R5cGVzXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCAibW9kdWxlICIgPDwgcmVuZGVyX3BhY2thZ2UoKnByb2dyYW1fKSA8PCBwcm9ncmFtX25hbWVfCisgICAgICAgICAgICAgPDwgIl90eXBlczsiIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIHByaW50X2RlZmF1bHRfaW1wb3J0cyhmX3R5cGVzXyk7CisKKyAgICAvLyBJbmNsdWRlIHR5cGUgbW9kdWxlcyBmcm9tIG90aGVyIGltcG9ydGVkIHByb2dyYW1zLgorICAgIGNvbnN0IHZlY3Rvcjx0X3Byb2dyYW0qPiYgaW5jbHVkZXMgPSBwcm9ncmFtXy0+Z2V0X2luY2x1ZGVzKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmNsdWRlcy5zaXplKCk7ICsraSkgeworICAgICAgZl90eXBlc18gPDwgInB1YmxpYyBpbXBvcnQgIiA8PCByZW5kZXJfcGFja2FnZSgqKGluY2x1ZGVzW2ldKSkgPDwgaW5jbHVkZXNbaV0tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgIDw8ICJfdHlwZXM7IiA8PCBlbmRsOworICAgIH0KKyAgICBpZiAoIWluY2x1ZGVzLmVtcHR5KCkpCisgICAgICBmX3R5cGVzXyA8PCBlbmRsOworICB9CisKKyAgdmlydHVhbCB2b2lkIGNsb3NlX2dlbmVyYXRvcigpIHsKKyAgICAvLyBDbG9zZSBvdXRwdXQgZmlsZQorICAgIGZfdHlwZXNfLmNsb3NlKCk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfY29uc3RzKHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpIHsKKyAgICBpZiAoIWNvbnN0cy5lbXB0eSgpKSB7CisgICAgICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IHBhY2thZ2VfZGlyXyArIHByb2dyYW1fbmFtZV8gKyAiX2NvbnN0YW50cy5kIjsKKyAgICAgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9jb25zdHM7CisgICAgICBmX2NvbnN0cy5vcGVuKGZfY29uc3RzX25hbWUuY19zdHIoKSk7CisKKyAgICAgIGZfY29uc3RzIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8ICJtb2R1bGUgIiA8PCByZW5kZXJfcGFja2FnZSgqcHJvZ3JhbV8pIDw8IHByb2dyYW1fbmFtZV8KKyAgICAgICAgICAgICAgIDw8ICJfY29uc3RhbnRzOyIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgICBwcmludF9kZWZhdWx0X2ltcG9ydHMoZl9jb25zdHMpOworCisgICAgICBmX2NvbnN0cyA8PCAiaW1wb3J0ICIgPDwgcmVuZGVyX3BhY2thZ2UoKmdldF9wcm9ncmFtKCkpIDw8IHByb2dyYW1fbmFtZV8gPDwgIl90eXBlczsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgICAgIHZlY3Rvcjx0X2NvbnN0Kj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgICAgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgICAgIHRoaXMtPmVtaXRfZG9jKCpjX2l0ZXIsIGZfY29uc3RzKTsKKyAgICAgICAgc3RyaW5nIG5hbWUgPSAoKmNfaXRlciktPmdldF9uYW1lKCk7CisgICAgICAgIHRfdHlwZSogdHlwZSA9ICgqY19pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICAgICAgaW5kZW50KGZfY29uc3RzKSA8PCAiaW1tdXRhYmxlKCIgPDwgcmVuZGVyX3R5cGVfbmFtZSh0eXBlKSA8PCAiKSAiIDw8IG5hbWUgPDwgIjsiIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIGZfY29uc3RzIDw8IGVuZGwgPDwgInN0YXRpYyB0aGlzKCkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworCisgICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICAgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgICAgIGlmIChmaXJzdCkgeworICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZl9jb25zdHMgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICB0X3R5cGUqIHR5cGUgPSAoKmNfaXRlciktPmdldF90eXBlKCk7CisgICAgICAgIGluZGVudChmX2NvbnN0cykgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiOworICAgICAgICBpZiAoIWlzX2ltbXV0YWJsZV90eXBlKHR5cGUpKSB7CisgICAgICAgICAgZl9jb25zdHMgPDwgImNhc3QoaW1tdXRhYmxlKCIgPDwgcmVuZGVyX3R5cGVfbmFtZSh0eXBlKSA8PCAiKSkgIjsKKyAgICAgICAgfQorICAgICAgICBmX2NvbnN0cyA8PCByZW5kZXJfY29uc3RfdmFsdWUodHlwZSwgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSkgPDwgIjsiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KGZfY29uc3RzKSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7CisgICAgdGhpcy0+ZW1pdF9kb2ModHR5cGVkZWYsIGZfdHlwZXNfKTsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiYWxpYXMgIiA8PCByZW5kZXJfdHlwZV9uYW1lKHR0eXBlZGVmLT5nZXRfdHlwZSgpKSA8PCAiICIKKyAgICAgICAgICAgICA8PCB0dHlwZWRlZi0+Z2V0X3N5bWJvbGljKCkgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKKyAgICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKworICAgIHRoaXMtPmVtaXRfZG9jKHRlbnVtLCBmX3R5cGVzXyk7CisgICAgc3RyaW5nIGVudW1fbmFtZSA9IHRlbnVtLT5nZXRfbmFtZSgpOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJlbnVtICIgPDwgZW51bV9uYW1lIDw8ICIgeyIgPDwgZW5kbDsKKworICAgIGluZGVudF91cCgpOworCisgICAgdmVjdG9yPHRfZW51bV92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciBjX2l0ZXI7CisgICAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICAgIHRoaXMtPmVtaXRfZG9jKCpjX2l0ZXIsIGZfdHlwZXNfKTsKKyAgICAgIGluZGVudChmX3R5cGVzXykgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgZl90eXBlc18gPDwgIiA9ICIgPDwgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSA8PCAiLCI7CisgICAgfQorCisgICAgZl90eXBlc18gPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChmX3R5cGVzXykgPDwgIn0iIDw8IGVuZGw7CisKKyAgICBmX3R5cGVzXyA8PCBlbmRsOworICB9CisKKyAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICAgIHByaW50X3N0cnVjdF9kZWZpbml0aW9uKGZfdHlwZXNfLCB0c3RydWN0LCBmYWxzZSk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgeworICAgIHByaW50X3N0cnVjdF9kZWZpbml0aW9uKGZfdHlwZXNfLCB0eGNlcHRpb24sIHRydWUpOworICB9CisKKyAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICAgIHN0cmluZyBzdmNfbmFtZSA9IHRzZXJ2aWNlLT5nZXRfbmFtZSgpOworCisgICAgLy8gU2VydmljZSBpbXBsZW1lbnRhdGlvbiBmaWxlIGluY2x1ZGVzCisgICAgc3RyaW5nIGZfc2VydmljZW5hbWUgPSBwYWNrYWdlX2Rpcl8gKyBzdmNfbmFtZSArICIuZCI7CisgICAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3NlcnZpY2U7CisgICAgZl9zZXJ2aWNlLm9wZW4oZl9zZXJ2aWNlbmFtZS5jX3N0cigpKTsKKyAgICBmX3NlcnZpY2UgPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgIm1vZHVsZSAiIDw8IHJlbmRlcl9wYWNrYWdlKCpwcm9ncmFtXykgPDwgc3ZjX25hbWUgPDwgIjsiCisgICAgICAgICAgICAgIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIHByaW50X2RlZmF1bHRfaW1wb3J0cyhmX3NlcnZpY2UpOworCisgICAgZl9zZXJ2aWNlIDw8ICJpbXBvcnQgIiA8PCByZW5kZXJfcGFja2FnZSgqZ2V0X3Byb2dyYW0oKSkgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiX3R5cGVzOyIgPDwgZW5kbDsKKworICAgIHRfc2VydmljZSogZXh0ZW5kc19zZXJ2aWNlID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7CisgICAgaWYgKGV4dGVuZHNfc2VydmljZSAhPSBOVUxMKSB7CisgICAgICBmX3NlcnZpY2UgPDwgImltcG9ydCAiIDw8IHJlbmRlcl9wYWNrYWdlKCooZXh0ZW5kc19zZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSkKKyAgICAgICAgICAgICAgICA8PCBleHRlbmRzX3NlcnZpY2UtPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorCisgICAgZl9zZXJ2aWNlIDw8IGVuZGw7CisKKyAgICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICAgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgICBleHRlbmRzID0gIiA6ICIgKyByZW5kZXJfdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICB9CisKKyAgICB0aGlzLT5lbWl0X2RvYyh0c2VydmljZSwgZl9zZXJ2aWNlKTsKKyAgICBmX3NlcnZpY2UgPDwgaW5kZW50KCkgPDwgImludGVyZmFjZSAiIDw8IHN2Y19uYW1lIDw8IGV4dGVuZHMgPDwgIiB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgLy8gQ29sbGVjdCBhbGwgdGhlIGV4Y2VwdGlvbiB0eXBlcyBzZXJ2aWNlIG1ldGhvZHMgY2FuIHRocm93IHNvIHdlIGNhbgorICAgIC8vIGVtaXQgdGhlIG5lY2Vzc2FyeSBhbGlhc2VzIGxhdGVyLgorICAgIHNldDx0X3R5cGUqPiBleGNlcHRpb25fdHlwZXM7CisKKyAgICAvLyBQcmludCB0aGUgbWV0aG9kIHNpZ25hdHVyZXMuCisgICAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZuX2l0ZXI7CisgICAgZm9yIChmbl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZuX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZuX2l0ZXIpIHsKKyAgICAgIHRoaXMtPmVtaXRfZG9jKCpmbl9pdGVyLCBmX3NlcnZpY2UpOworICAgICAgZl9zZXJ2aWNlIDw8IGluZGVudCgpOworICAgICAgcHJpbnRfZnVuY3Rpb25fc2lnbmF0dXJlKGZfc2VydmljZSwgKmZuX2l0ZXIpOworICAgICAgZl9zZXJ2aWNlIDw8ICI7IiA8PCBlbmRsOworCisgICAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBleGNlcHRpb25zID0gKCpmbl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpLT5nZXRfbWVtYmVycygpOworICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZXhfaXRlcjsKKyAgICAgIGZvciAoZXhfaXRlciA9IGV4Y2VwdGlvbnMuYmVnaW4oKTsgZXhfaXRlciAhPSBleGNlcHRpb25zLmVuZCgpOyArK2V4X2l0ZXIpIHsKKyAgICAgICAgZXhjZXB0aW9uX3R5cGVzLmluc2VydCgoKmV4X2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBBbGlhcyB0aGUgZXhjZXB0aW9uIHR5cGVzIGludG8gdGhlIGN1cnJlbnQgc2NvcGUuCisgICAgaWYgKCFleGNlcHRpb25fdHlwZXMuZW1wdHkoKSkKKyAgICAgIGZfc2VydmljZSA8PCBlbmRsOworICAgIHNldDx0X3R5cGUqPjo6Y29uc3RfaXRlcmF0b3IgZXRfaXRlcjsKKyAgICBmb3IgKGV0X2l0ZXIgPSBleGNlcHRpb25fdHlwZXMuYmVnaW4oKTsgZXRfaXRlciAhPSBleGNlcHRpb25fdHlwZXMuZW5kKCk7ICsrZXRfaXRlcikgeworICAgICAgaW5kZW50KGZfc2VydmljZSkgPDwgImFsaWFzICIgPDwgcmVuZGVyX3BhY2thZ2UoKigqZXRfaXRlciktPmdldF9wcm9ncmFtKCkpCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAoKmV0X2l0ZXIpLT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZSgpIDw8ICJfdHlwZXMiCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLiIgPDwgKCpldF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICIgPDwgKCpldF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfQorCisgICAgLy8gV3JpdGUgdGhlIG1ldGhvZCBtZXRhZGF0YS4KKyAgICBvc3RyaW5nc3RyZWFtIG1ldGE7CisgICAgaW5kZW50X3VwKCk7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yIChmbl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZuX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZuX2l0ZXIpIHsKKyAgICAgIGlmICgoKmZuX2l0ZXIpLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpLmVtcHR5KCkKKyAgICAgICAgICAmJiAoKmZuX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCktPmdldF9tZW1iZXJzKCkuZW1wdHkoKSAmJiAhKCpmbl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbWV0YSA8PCAiLCI7CisgICAgICB9CisKKyAgICAgIG1ldGEgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiVE1ldGhvZE1ldGEoYCIgPDwgKCpmbl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiYCwgIiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQobWV0YSkgPDwgIlsiOworCisgICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIHBhcmFtcyA9ICgqZm5faXRlciktPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7CisgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBwX2l0ZXI7CisgICAgICBmb3IgKHBfaXRlciA9IHBhcmFtcy5iZWdpbigpOyBwX2l0ZXIgIT0gcGFyYW1zLmVuZCgpOyArK3BfaXRlcikgeworICAgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG1ldGEgPDwgIiwgIjsKKyAgICAgICAgfQorCisgICAgICAgIG1ldGEgPDwgIlRQYXJhbU1ldGEoYCIgPDwgKCpwX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJgLCAiIDw8ICgqcF9pdGVyKS0+Z2V0X2tleSgpOworCisgICAgICAgIHRfY29uc3RfdmFsdWUqIGN2ID0gKCpwX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgICAgICAgaWYgKGN2ICE9IE5VTEwpIHsKKyAgICAgICAgICBtZXRhIDw8ICIsIHF7IiA8PCByZW5kZXJfY29uc3RfdmFsdWUoKCpwX2l0ZXIpLT5nZXRfdHlwZSgpLCBjdikgPDwgIn0iOworICAgICAgICB9CisgICAgICAgIG1ldGEgPDwgIikiOworICAgICAgfQorCisgICAgICBtZXRhIDw8ICJdIjsKKworICAgICAgaWYgKCEoKmZuX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCktPmdldF9tZW1iZXJzKCkuZW1wdHkoKSB8fCAoKmZuX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgICBtZXRhIDw8ICIsIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJbIjsKKworICAgICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZXhjZXB0aW9ucyA9ICgqZm5faXRlciktPmdldF94Y2VwdGlvbnMoKS0+Z2V0X21lbWJlcnMoKTsKKyAgICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZXhfaXRlcjsKKyAgICAgICAgZm9yIChleF9pdGVyID0gZXhjZXB0aW9ucy5iZWdpbigpOyBleF9pdGVyICE9IGV4Y2VwdGlvbnMuZW5kKCk7ICsrZXhfaXRlcikgeworICAgICAgICAgIGlmIChmaXJzdCkgeworICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWV0YSA8PCAiLCAiOworICAgICAgICAgIH0KKworICAgICAgICAgIG1ldGEgPDwgIlRFeGNlcHRpb25NZXRhKGAiIDw8ICgqZXhfaXRlciktPmdldF9uYW1lKCkgPDwgImAsICIgPDwgKCpleF9pdGVyKS0+Z2V0X2tleSgpCisgICAgICAgICAgICAgICA8PCAiLCBgIiA8PCAoKmV4X2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpIDw8ICJgKSI7CisgICAgICAgIH0KKworICAgICAgICBtZXRhIDw8ICJdIjsKKyAgICAgIH0KKworICAgICAgaWYgKCgqZm5faXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICAgIG1ldGEgPDwgIiwiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIlRNZXRob2RUeXBlLk9ORVdBWSI7CisgICAgICB9CisKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBtZXRhIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIikiOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworCisgICAgc3RyaW5nIG1ldGFfc3RyKG1ldGEuc3RyKCkpOworICAgIGlmICghbWV0YV9zdHIuZW1wdHkoKSkgeworICAgICAgZl9zZXJ2aWNlIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImVudW0gbWV0aG9kTWV0YSA9IFsiIDw8IG1ldGFfc3RyIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIl07IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlKSA8PCAifSIgPDwgZW5kbDsKKworICAgIC8vIFNlcnZlciBza2VsZXRvbiBnZW5lcmF0aW9uLgorICAgIHN0cmluZyBmX3NrZWxldG9ubmFtZSA9IHBhY2thZ2VfZGlyXyArIHN2Y19uYW1lICsgIl9zZXJ2ZXIuc2tlbGV0b24uZCI7CisgICAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3NrZWxldG9uOworICAgIGZfc2tlbGV0b24ub3BlbihmX3NrZWxldG9ubmFtZS5jX3N0cigpKTsKKyAgICBwcmludF9zZXJ2ZXJfc2tlbGV0b24oZl9za2VsZXRvbiwgdHNlcnZpY2UpOworICAgIGZfc2tlbGV0b24uY2xvc2UoKTsKKyAgfQorCisgIHZvaWQgZW1pdF9kb2ModF9kb2MgKmRvYywgc3RkOjpvc3RyZWFtJiBvdXQpIHsKKyAgICBpZiAoIWRvYy0+aGFzX2RvYygpKSB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGluZGVudChvdXQpIDw8ICIvKioiIDw8IHN0ZDo6ZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICAvLyBObyBlbmRsIC0tIGNvbW1lbnRzIHJlbGlhYmx5IGhhdmUgYSBuZXdsaW5lIGF0IHRoZSBlbmQuCisgICAgLy8gVGhpcyBpcyB0cnVlIGV2ZW4gZm9yIHN0dWZmIGxpa2U6CisgICAgLy8gICAgIC8qKiBtZXRob2QgaW5mb3MgKi8gdm9pZCBmb28oLyoqIGh1aD8qLyAxOiBpNjQgc3R1ZmYpCisgICAgaW5kZW50KG91dCkgPDwgZG9jLT5nZXRfZG9jKCk7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiKi8iIDw8IHN0ZDo6ZW5kbDsKKyAgfQorCitwcml2YXRlOgorICAvKioKKyAgICogV3JpdGVzIGEgc2VydmVyIHNrZWxldG9uIGZvciB0aGUgcGFzc2VkIHNlcnZpY2UgdG8gb3V0LgorICAgKi8KKyAgdm9pZCBwcmludF9zZXJ2ZXJfc2tlbGV0b24ob3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgICAgc3RyaW5nIHN2Y19uYW1lID0gdHNlcnZpY2UtPmdldF9uYW1lKCk7CisKKyAgICBvdXQgPDwgIi8qIiA8PCBlbmRsCisgICAgICAgIDw8ICIgKiBUaGlzIGF1dG8tZ2VuZXJhdGVkIHNrZWxldG9uIGZpbGUgaWxsdXN0cmF0ZXMgaG93IHRvIGJ1aWxkIGEgc2VydmVyLiBJZiB5b3UiIDw8IGVuZGwKKyAgICAgICAgPDwgIiAqIGludGVuZCB0byBjdXN0b21pemUgaXQsIHlvdSBzaG91bGQgZWRpdCBhIGNvcHkgd2l0aCBhbm90aGVyIGZpbGUgbmFtZSB0byAiIDw8IGVuZGwKKyAgICAgICAgPDwgIiAqIGF2b2lkIG92ZXJ3cml0aW5nIGl0IHdoZW4gcnVubmluZyB0aGUgZ2VuZXJhdG9yIGFnYWluLiIgPDwgZW5kbCA8PCAiICovIiA8PCBlbmRsCisgICAgICAgIDw8ICJtb2R1bGUgIiA8PCByZW5kZXJfcGFja2FnZSgqdHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpIDw8IHN2Y19uYW1lIDw8ICJfc2VydmVyOyIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsIDw8ICJpbXBvcnQgc3RkLnN0ZGlvOyIgPDwgZW5kbCA8PCAiaW1wb3J0IHRocmlmdC5jb2RlZ2VuLnByb2Nlc3NvcjsiIDw8IGVuZGwKKyAgICAgICAgPDwgImltcG9ydCB0aHJpZnQucHJvdG9jb2wuYmluYXJ5OyIgPDwgZW5kbCA8PCAiaW1wb3J0IHRocmlmdC5zZXJ2ZXIuc2ltcGxlOyIgPDwgZW5kbAorICAgICAgICA8PCAiaW1wb3J0IHRocmlmdC5zZXJ2ZXIudHJhbnNwb3J0LnNvY2tldDsiIDw8IGVuZGwgPDwgImltcG9ydCB0aHJpZnQudHJhbnNwb3J0LmJ1ZmZlcmVkOyIKKyAgICAgICAgPDwgZW5kbCA8PCAiaW1wb3J0IHRocmlmdC51dGlsLmhhc2hzZXQ7IiA8PCBlbmRsIDw8IGVuZGwgPDwgImltcG9ydCAiCisgICAgICAgIDw8IHJlbmRlcl9wYWNrYWdlKCp0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgPDwgc3ZjX25hbWUgPDwgIjsiIDw8IGVuZGwgPDwgImltcG9ydCAiCisgICAgICAgIDw8IHJlbmRlcl9wYWNrYWdlKCpnZXRfcHJvZ3JhbSgpKSA8PCBwcm9ncmFtX25hbWVfIDw8ICJfdHlwZXM7IiA8PCBlbmRsIDw8IGVuZGwgPDwgZW5kbAorICAgICAgICA8PCAiY2xhc3MgIiA8PCBzdmNfbmFtZSA8PCAiSGFuZGxlciA6ICIgPDwgc3ZjX25hbWUgPDwgIiB7IiA8PCBlbmRsOworCisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0aGlzKCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICAvLyBZb3VyIGluaXRpYWxpemF0aW9uIGdvZXMgaGVyZS4iCisgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgICAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKTsKKyAgICAgIHByaW50X2Z1bmN0aW9uX3NpZ25hdHVyZShvdXQsICpmX2l0ZXIpOworICAgICAgb3V0IDw8ICIgeyIgPDwgZW5kbDsKKworICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiLy8gWW91ciBpbXBsZW1lbnRhdGlvbiBnb2VzIGhlcmUuIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ3cml0ZWxuKFwiIgorICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGNhbGxlZFwiKTsiIDw8IGVuZGw7CisKKwkgIHRfdHlwZSogcnQgPSAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCk7CisJICBpZiAoIXJ0LT5pc192b2lkKCkpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiB0eXBlb2YocmV0dXJuKS5pbml0OyIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgaW5kZW50X2Rvd24oKTsKKworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidm9pZCBtYWluKCkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImF1dG8gcHJvdG9jb2xGYWN0b3J5ID0gbmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkhKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICJhdXRvIHByb2Nlc3NvciA9IG5ldyBUU2VydmljZVByb2Nlc3NvciEiIDw8IHN2Y19uYW1lIDw8ICIobmV3ICIgPDwgc3ZjX25hbWUKKyAgICAgICAgPDwgIkhhbmRsZXIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiYXV0byBzZXJ2ZXJUcmFuc3BvcnQgPSBuZXcgVFNlcnZlclNvY2tldCg5MDkwKTsiCisgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImF1dG8gdHJhbnNwb3J0RmFjdG9yeSA9IG5ldyBUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5OyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXV0byBzZXJ2ZXIgPSBuZXcgVFNpbXBsZVNlcnZlcigiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgIiAgcHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICJzZXJ2ZXIuc2VydmUoKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgIn0iIDw8IGVuZGw7CisgIH0KKworICAvKioKKyAgICogV3JpdGVzIHRoZSBkZWZpbml0aW9uIG9mIGEgc3RydWN0IG9yIGFuIGV4Y2VwdGlvbiB0eXBlIHRvIG91dC4KKyAgICovCisgIHZvaWQgcHJpbnRfc3RydWN0X2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pIHsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKworICAgIGlmIChpc19leGNlcHRpb24pIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJjbGFzcyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiA6IFRFeGNlcHRpb24geyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgInN0cnVjdCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiB7IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfdXAoKTsKKworICAgIC8vIERlY2xhcmUgYWxsIGZpZWxkcy4KKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgaW5kZW50KG91dCkgPDwgcmVuZGVyX3R5cGVfbmFtZSgoKm1faXRlciktPmdldF90eXBlKCkpIDw8ICIgIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIjsiCisgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIH0KKworICAgIGlmICghbWVtYmVycy5lbXB0eSgpKQorICAgICAgaW5kZW50KG91dCkgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAibWl4aW4gVFN0cnVjdEhlbHBlcnMhKCI7CisKKyAgICBpZiAoIW1lbWJlcnMuZW1wdHkoKSkgeworICAgICAgLy8gSWYgdGhlcmUgYXJlIGFueSBmaWVsZHMsIGNvbnN0cnVjdCB0aGUgVEZpZWxkTWV0YSBhcnJheSB0byBwYXNzIHRvCisgICAgICAvLyBUU3RydWN0SGVscGVycy4gV2UgY2FuJ3QganVzdCBwYXNzIGFuIGVtcHR5IGFycmF5IGlmIG5vdCBiZWNhdXNlIFtdCisgICAgICAvLyBkb2Vzbid0IHBhc3MgdGhlIFRGaWVsZE1ldGFbXSBjb25zdHJhaW50LgorICAgICAgb3V0IDw8ICJbIjsKKyAgICAgIGluZGVudF91cCgpOworCisgICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKyAgICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgPDwgIiwiOworICAgICAgICB9CisgICAgICAgIG91dCA8PCBlbmRsOworCisgICAgICAgIGluZGVudChvdXQpIDw8ICJURmllbGRNZXRhKGAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiYCwgIiA8PCAoKm1faXRlciktPmdldF9rZXkoKTsKKworICAgICAgICB0X2NvbnN0X3ZhbHVlKiBjdiA9ICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgICAgICAgIHRfZmllbGQ6OmVfcmVxIHJlcSA9ICgqbV9pdGVyKS0+Z2V0X3JlcSgpOworICAgICAgICBvdXQgPDwgIiwgIiA8PCByZW5kZXJfcmVxKHJlcSk7CisgICAgICAgIGlmIChjdiAhPSBOVUxMKSB7CisgICAgICAgICAgb3V0IDw8ICIsIHF7IiA8PCByZW5kZXJfY29uc3RfdmFsdWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpLCBjdikgPDwgIn0iOworICAgICAgICB9CisgICAgICAgIG91dCA8PCAiKSI7CisgICAgICB9CisKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiXSI7CisgICAgfQorCisgICAgb3V0IDw8ICIpOyIgPDwgZW5kbDsKKworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIC8qKgorICAgKiBQcmludHMgdGhlIEQgZnVuY3Rpb24gc2lnbmF0dXJlIChpbmNsdWRpbmcgcmV0dXJuIHR5cGUpIGZvciB0aGUgZ2l2ZW4KKyAgICogbWV0aG9kLgorICAgKi8KKyAgdm9pZCBwcmludF9mdW5jdGlvbl9zaWduYXR1cmUob3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiBmbikgeworICAgIG91dCA8PCByZW5kZXJfdHlwZV9uYW1lKGZuLT5nZXRfcmV0dXJudHlwZSgpKSA8PCAiICIgPDwgZm4tPmdldF9uYW1lKCkgPDwgIigiOworCisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gZm4tPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCAiLCAiOworICAgICAgfQorICAgICAgb3V0IDw8IHJlbmRlcl90eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpLCB0cnVlKSA8PCAiICIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIH0KKworICAgIG91dCA8PCAiKSI7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0aGUgRCByZXByZXNlbnRhdGlvbiBvZiB2YWx1ZS4gVGhlIHJlc3VsdCBpcyBndWFyYW50ZWVkIHRvIGJlIGEKKyAgICogc2luZ2xlIGV4cHJlc3Npb247IGZvciBjb21wbGV4IHR5cGVzLCBpbW1lZGlhdGVseSBjYWxsZWQgZGVsZWdhdGUKKyAgICogbGl0ZXJhbHMgYXJlIHVzZWQgdG8gYWNoaWV2ZSB0aGlzLgorICAgKi8KKyAgc3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7CisgICAgLy8gUmVzb2x2ZSBhbnkgdHlwZWRlZnMuCisgICAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisKKyAgICBvc3RyaW5nc3RyZWFtIG91dDsKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICBvdXQgPDwgJyInIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgb3V0IDw8ICgodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgb3V0IDw8ICJjYXN0KCIgPDwgcmVuZGVyX3R5cGVfbmFtZSh0eXBlKSA8PCAiKSIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICJMIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKKyAgICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiQ29tcGlsZXIgZXJyb3I6IE5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgb3V0IDw8ICJjYXN0KCIgPDwgcmVuZGVyX3R5cGVfbmFtZSh0eXBlKSA8PCAiKSIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCAieyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworCisgICAgICBpbmRlbnQob3V0KSA8PCByZW5kZXJfdHlwZV9uYW1lKHR5cGUpIDw8ICIgdjsiIDw8IGVuZGw7CisgICAgICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAidiA9ICIgPDwgKHR5cGUtPmlzX3hjZXB0aW9uKCkgPyAibmV3ICIgOiAiIikgPDwgcmVuZGVyX3R5cGVfbmFtZSh0eXBlKQorICAgICAgICAgICAgICAgICAgICA8PCAiKCk7IiA8PCBlbmRsOworCisgICAgICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOworICAgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgICAgICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgICAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgICAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7CisgICAgICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7CisgICAgICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKKyAgICAgICAgICAgIHRocm93ICJUeXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIKKyAgICAgICAgICAgICAgICArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKKyAgICAgICAgICB9CisgICAgICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgInYuc2V0IWAiIDw8IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSA8PCAiYCgiIDw8IHZhbCA8PCAiKTsiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICAgICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICAgICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICAgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICAgICAgc3RyaW5nIGtleSA9IHJlbmRlcl9jb25zdF92YWx1ZShrdHlwZSwgdl9pdGVyLT5maXJzdCk7CisgICAgICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZSh2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgICAgICAgIGluZGVudChvdXQpIDw8ICJ2WyI7CisgICAgICAgICAgaWYgKCFpc19pbW11dGFibGVfdHlwZShrdHlwZSkpIHsKKyAgICAgICAgICAgIG91dCA8PCAiY2FzdChpbW11dGFibGUoIiA8PCByZW5kZXJfdHlwZV9uYW1lKGt0eXBlKSA8PCAiKSkiOworICAgICAgICAgIH0KKyAgICAgICAgICBvdXQgPDwga2V5IDw8ICJdID0gIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICAgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICAgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKGV0eXBlLCAqdl9pdGVyKTsKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAidiB+PSAiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgICAgICB0X3R5cGUqIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICAgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICAgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKGV0eXBlLCAqdl9pdGVyKTsKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAidiB+PSAiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgIkNvbXBpbGVyIGVycm9yOiBJbnZhbGlkIHR5cGUgaW4gcmVuZGVyX2NvbnN0X3ZhbHVlOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKKyAgICAgIH0KKyAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdjsiIDw8IGVuZGw7CisKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSgpIjsKKyAgICB9CisKKyAgICByZXR1cm4gb3V0LnN0cigpOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIEQgcGFja2FnZSB0byB3aGljaCBtb2R1bGVzIGZvciBwcm9ncmFtIGFyZSB3cml0dGVuICh3aXRoIGEKKyAgICogdHJhaWxpbmcgZG90LCBpZiBub3QgZW1wdHkpLgorICAgKi8KKyAgc3RyaW5nIHJlbmRlcl9wYWNrYWdlKGNvbnN0IHRfcHJvZ3JhbSYgcHJvZ3JhbSkgY29uc3QgeworICAgIHN0cmluZyBwYWNrYWdlID0gcHJvZ3JhbS5nZXRfbmFtZXNwYWNlKCJkIik7CisgICAgaWYgKHBhY2thZ2Uuc2l6ZSgpID09IDApCisgICAgICByZXR1cm4gIiI7CisgICAgcmV0dXJuIHBhY2thZ2UgKyAiLiI7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgRCByZXBlc2VudGF0aW9uIG9mIHR0eXBlLgorICAgKgorICAgKiBJZiBpc0FyZyBpcyB0cnVlLCBhIGNvbnN0IHJlZmVyZW5jZSB0byB0aGUgdHlwZSB3aWxsIGJlIHJldHVybmVkIGZvcgorICAgKiBzdHJ1Y3RzLgorICAgKi8KKyAgc3RyaW5nIHJlbmRlcl90eXBlX25hbWUoY29uc3QgdF90eXBlKiB0dHlwZSwgYm9vbCBpc0FyZyA9IGZhbHNlKSBjb25zdCB7CisgICAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgcmV0dXJuICJ2b2lkIjsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICByZXR1cm4gInN0cmluZyI7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIHJldHVybiAiYm9vbCI7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICByZXR1cm4gImJ5dGUiOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgIHJldHVybiAic2hvcnQiOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgIHJldHVybiAiaW50IjsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICByZXR1cm4gImxvbmciOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIHJldHVybiAiZG91YmxlIjsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJDb21waWxlciBlcnJvcjogTm8gRCB0eXBlIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgICB0X2NvbnRhaW5lciogdGNvbnRhaW5lciA9ICh0X2NvbnRhaW5lciopdHR5cGU7CisgICAgICBpZiAodGNvbnRhaW5lci0+aGFzX2NwcF9uYW1lKCkpIHsKKyAgICAgICAgcmV0dXJuIHRjb250YWluZXItPmdldF9jcHBfbmFtZSgpOworICAgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICAgICAgdF9tYXAqIHRtYXAgPSAodF9tYXAqKXR0eXBlOworICAgICAgICB0X3R5cGUqIGt0eXBlID0gdG1hcC0+Z2V0X2tleV90eXBlKCk7CisKKyAgICAgICAgc3RyaW5nIG5hbWUgPSByZW5kZXJfdHlwZV9uYW1lKHRtYXAtPmdldF92YWxfdHlwZSgpKSArICJbIjsKKyAgICAgICAgaWYgKCFpc19pbW11dGFibGVfdHlwZShrdHlwZSkpIHsKKyAgICAgICAgICBuYW1lICs9ICJpbW11dGFibGUoIjsKKyAgICAgICAgfQorICAgICAgICBuYW1lICs9IHJlbmRlcl90eXBlX25hbWUoa3R5cGUpOworICAgICAgICBpZiAoIWlzX2ltbXV0YWJsZV90eXBlKGt0eXBlKSkgeworICAgICAgICAgIG5hbWUgKz0gIikiOworICAgICAgICB9CisgICAgICAgIG5hbWUgKz0gIl0iOworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgICAgIHRfc2V0KiB0c2V0ID0gKHRfc2V0Kil0dHlwZTsKKyAgICAgICAgcmV0dXJuICJIYXNoU2V0ISgiICsgcmVuZGVyX3R5cGVfbmFtZSh0c2V0LT5nZXRfZWxlbV90eXBlKCkpICsgIikiOworICAgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICAgIHRfbGlzdCogdGxpc3QgPSAodF9saXN0Kil0dHlwZTsKKyAgICAgICAgcmV0dXJuIHJlbmRlcl90eXBlX25hbWUodGxpc3QtPmdldF9lbGVtX3R5cGUoKSkgKyAiW10iOworICAgICAgfQorICAgIH0KKworICAgIGlmICh0dHlwZS0+aXNfc3RydWN0KCkgJiYgaXNBcmcpIHsKKyAgICAgIHJldHVybiAicmVmIGNvbnN0KCIgKyB0dHlwZS0+Z2V0X25hbWUoKSArICIpIjsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIHR0eXBlLT5nZXRfbmFtZSgpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBEIFRSZXEgZW51bSBtZW1iZXIgY29ycmVzcG9uZGluZyB0byByZXEuCisgICAqLworICBzdHJpbmcgcmVuZGVyX3JlcSh0X2ZpZWxkOjplX3JlcSByZXEpIGNvbnN0IHsKKyAgICBzd2l0Y2ggKHJlcSkgeworICAgIGNhc2UgdF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVDoKKyAgICAgIHJldHVybiAiVFJlcS5PUFRfSU5fUkVRX09VVCI7CisgICAgY2FzZSB0X2ZpZWxkOjpUX09QVElPTkFMOgorICAgICAgcmV0dXJuICJUUmVxLk9QVElPTkFMIjsKKyAgICBjYXNlIHRfZmllbGQ6OlRfUkVRVUlSRUQ6CisgICAgICByZXR1cm4gIlRSZXEuUkVRVUlSRUQiOworICAgIGRlZmF1bHQ6IHsKKyAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICAgICAgc3MgPDwgIkNvbXBpbGVyIGVycm9yOiBJbnZhbGlkIHJlcXVpcmVtZW50IGxldmVsICIgPDwgcmVxOworICAgICAgdGhyb3cgc3Muc3RyKCk7CisgICAgfQorICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBXcml0ZXMgdGhlIGRlZmF1bHQgbGlzdCBvZiBpbXBvcnRzICh3aGljaCBhcmUgd3JpdHRlbiB0byBldmVyeSBnZW5lcmF0ZWQKKyAgICogbW9kdWxlKSB0byBmLgorICAgKi8KKyAgdm9pZCBwcmludF9kZWZhdWx0X2ltcG9ydHMob3N0cmVhbSYgb3V0KSB7CisgICAgaW5kZW50KG91dCkgPDwgImltcG9ydCB0aHJpZnQuYmFzZTsiIDw8IGVuZGwgPDwgImltcG9ydCB0aHJpZnQuY29kZWdlbi5iYXNlOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8ICJpbXBvcnQgdGhyaWZ0LnV0aWwuaGFzaHNldDsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHdoZXRoZXIgdHlwZSBpcyDCu2ludHJpbnNpY2FsbHkgaW1tdXRhYmxlwqssIGluIHRoZSBzZW5zZSB0aGF0CisgICAqIGEgdmFsdWUgb2YgdGhhdCB0eXBlIGlzIGltcGxpY2l0bHkgY2FzdGFibGUgdG8gaW1tdXRhYmxlKHR5cGUpLCBhbmQgaXQgaXMKKyAgICogYWxsb3dlZCBmb3IgQUEga2V5cyB3aXRob3V0IGFuIGltbXV0YWJsZSgpIHF1YWxpZmllci4KKyAgICovCisgIGJvb2wgaXNfaW1tdXRhYmxlX3R5cGUodF90eXBlKiB0eXBlKSBjb25zdCB7CisgICAgdF90eXBlKiB0dHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisgICAgcmV0dXJuIHR0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0dHlwZS0+aXNfZW51bSgpOworICB9CisKKyAgLyoKKyAgICogRmlsZSBzdHJlYW1zLCBzdG9yZWQgaGVyZSB0byBhdm9pZCBwYXNzaW5nIHRoZW0gYXMgcGFyYW1ldGVycyB0byBldmVyeQorICAgKiBmdW5jdGlvbi4KKyAgICovCisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl90eXBlc187CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9oZWFkZXJfOworCisgIHN0cmluZyBwYWNrYWdlX2Rpcl87Cit9OworCitUSFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKGQsICJEIiwgIiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2RhcnRfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9kYXJ0X2dlbmVyYXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTRjMzMzCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9kYXJ0X2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDI1MTYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGNjdHlwZT4KKworI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3RkZXhjZXB0PgorCisjaW5jbHVkZSAidGhyaWZ0L3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oIgorCit1c2luZyBzdGQ6Om1hcDsKK3VzaW5nIHN0ZDo6b3N0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnZlY3RvcjsKKworc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsID0gIlxuIjsgLy8gYXZvaWQgb3N0cmVhbSA8PCBzdGQ6OmVuZGwgZmx1c2hlcworc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsMiA9ICJcblxuIjsKKworLyoqCisgKiBVc2UgdGhlIGN1cnJlbnQgVGhyaWZ0IHZlcnNpb24gZm9yIHN0YXRpYyBsaWJyYXJpZXMuICBXaGVuIHJlbGVhc2luZywgdXBkYXRlCisgKiB0aGUgdmVyc2lvbiBpbiB0aGVzZSBmaWxlcy4KKyAqIC0gbGliL2RhcnQvcHVic3BlYy55YW1sCisgKiAtIHRlc3QvZGFydC90ZXN0X2NsaWVudC9wdWJzcGVjLnlhbWwKKyAqIC0gdHV0b3JpYWwvZGFydC9jbGllbnQvcHVic3BlYy55YW1sCisgKiAtIHR1dG9yaWFsL2RhcnQvY29uc29sZV9jbGllbnQvcHVic3BlYy55YW1sCisgKiAtIHR1dG9yaWFsL2RhcnQvc2VydmVyL3B1YnNwZWMueWFtbAorICogU2VlIGh0dHBzOi8vdGhyaWZ0LmFwYWNoZS5vcmcvZG9jcy9jb21taXR0ZXJzL0hvd1RvVmVyc2lvbgorICovCitzdGF0aWMgY29uc3Qgc3RyaW5nIGRhcnRfdGhyaWZ0X3ZlcnNpb24gPSBUSFJJRlRfVkVSU0lPTjsKKworLyogZm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KK3N0cmluZyBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoc3RyaW5nIG5hbWUpOworCisvKioKKyAqIERhcnQgY29kZSBnZW5lcmF0b3IKKyAqCisgKi8KK2NsYXNzIHRfZGFydF9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgdF9kYXJ0X2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQorICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pIHsKKyAgICAodm9pZClvcHRpb25fc3RyaW5nOworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7CisKKyAgICBsaWJyYXJ5X25hbWVfID0gIiI7CisgICAgbGlicmFyeV9wcmVmaXhfID0gIiI7CisgICAgcGFja2FnZV9wcmVmaXhfID0gIiI7CisgICAgcHVic3BlY19saWJfID0gIiI7CisgICAgZm9yKCBpdGVyID0gcGFyc2VkX29wdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKTsgKytpdGVyKSB7CisgICAgICBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgibGlicmFyeV9uYW1lIikgPT0gMCkgeworICAgICAgICBsaWJyYXJ5X25hbWVfID0gKGl0ZXItPnNlY29uZCk7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImxpYnJhcnlfcHJlZml4IikgPT0gMCkgeworICAgICAgICBsaWJyYXJ5X3ByZWZpeF8gPSAoaXRlci0+c2Vjb25kKSArICIuIjsKKyAgICAgICAgcGFja2FnZV9wcmVmaXhfID0gcmVwbGFjZV9hbGwobGlicmFyeV9wcmVmaXhfLCAiLiIsICIvIik7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoInB1YnNwZWNfbGliIikgPT0gMCkgeworICAgICAgICBwdWJzcGVjX2xpYl8gPSAoaXRlci0+c2Vjb25kKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93ICJ1bmtub3duIG9wdGlvbiBkYXJ0OiIgKyBpdGVyLT5maXJzdDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1kYXJ0IjsKKyAgfQorCisgIHZvaWQgc2NvcGVfdXAoc3RkOjpvc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIHByZWZpeD0iICIpIHsKKyAgICBvdXQgPDwgcHJlZml4IDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICB9CisKKyAgdm9pZCBzY29wZV9kb3duKHN0ZDo6b3N0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBwb3N0Zml4PWVuZGwpIHsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBwb3N0Zml4OworICB9CisKKyAgc3RyaW5nIHJlcGxhY2VfYWxsKHN0cmluZyBjb250ZW50cywgc3RyaW5nIHNlYXJjaCwgc3RyaW5nIHJlcGwpIHsKKyAgICBzdHJpbmcgc3RyKGNvbnRlbnRzKTsKKworICAgIHNpemVfdCBzbGVuID0gc2VhcmNoLmxlbmd0aCgpOworICAgIHNpemVfdCBybGVuID0gcmVwbC5sZW5ndGgoKTsKKyAgICBzaXplX3QgaW5jciA9IChybGVuID4gMCkgPyBybGVuIDogMTsKKworICAgIGlmIChzbGVuID4gMCkgeworICAgICAgc2l6ZV90IGZvdW5kID0gc3RyLmZpbmQoc2VhcmNoKTsKKyAgICAgIHdoaWxlICgoZm91bmQgIT0gc3RyaW5nOjpucG9zKSAmJiAoZm91bmQgPCBzdHIubGVuZ3RoKCkpKSB7CisgICAgICAgIHN0ci5yZXBsYWNlKGZvdW5kLCBzbGVuLCByZXBsKTsKKyAgICAgICAgZm91bmQgPSBzdHIuZmluZChzZWFyY2gsIGZvdW5kICsgaW5jcik7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHN0cjsKKyAgfQorCisKKyAgLyoqCisgICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKKyAgICovCisKKyAgdm9pZCBpbml0X2dlbmVyYXRvcigpOworICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOworCisgIHZvaWQgZXhwb3J0X2NsYXNzX3RvX2xpYnJhcnkoc3RyaW5nIGZpbGVfbmFtZSwgc3RyaW5nIGNsYXNzX25hbWUpOworCisgIHZvaWQgZ2VuZXJhdGVfZGFydF9saWJyYXJ5KCk7CisgIHZvaWQgZ2VuZXJhdGVfZGFydF9wdWJzcGVjKCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyk7CisKKyAgLyoqCisgICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpOworICB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworCisgIHZvaWQgcHJpbnRfY29uc3RfdmFsdWUoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9zdGF0aWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWZ2YWwgPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZShvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpOworCisgIC8qKgorICAgKiBTZXJ2aWNlLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfZGFydF9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKKworICB2b2lkIGdlbmVyYXRlX2RhcnRfc3RydWN0X2RlZmluaXRpb24oc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24gPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0ID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZXhwb3J0X2ZpbGVfbmFtZSA9ICIiKTsKKyAgdm9pZCBnZW5lcmF0ZV9kYXJ0X3N0cnVjdF9yZWFkZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9kYXJ0X3ZhbGlkYXRvcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2RhcnRfc3RydWN0X3Jlc3VsdF93cml0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9kYXJ0X3N0cnVjdF93cml0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9kYXJ0X3N0cnVjdF90b3N0cmluZyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICBzdGQ6OnN0cmluZyBnZXRfZGFydF90eXBlX3N0cmluZyh0X3R5cGUqIHR5cGUpOworICB2b2lkIGdlbmVyYXRlX2dlbmVyaWNfZmllbGRfZ2V0dGVycyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2dlbmVyaWNfZmllbGRfc2V0dGVycyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2dlbmVyaWNfaXNzZXRfbWV0aG9kKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZGFydF9iZWFuX2JvaWxlcnBsYXRlKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHN0ZDo6c3RyaW5nIGluaXRfdmFsdWUodF9maWVsZCogdGZpZWxkKTsKKyAgc3RkOjpzdHJpbmcgZ2V0X2NhcF9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpOworICBzdGQ6OnN0cmluZyBnZXRfbWVtYmVyX25hbWUoc3RkOjpzdHJpbmcgbmFtZSk7CisgIHN0ZDo6c3RyaW5nIGdldF9hcmdzX2NsYXNzX25hbWUoc3RkOjpzdHJpbmcgbmFtZSk7CisgIHN0ZDo6c3RyaW5nIGdldF9yZXN1bHRfY2xhc3NfbmFtZShzdGQ6OnN0cmluZyBuYW1lKTsKKyAgc3RkOjpzdHJpbmcgZ2V0X2ZpbGVfbmFtZShzdGQ6OnN0cmluZyBuYW1lKTsKKyAgc3RkOjpzdHJpbmcgZ2V0X2NvbnN0YW50c19jbGFzc19uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpOworICBzdGQ6OnN0cmluZyBnZW5lcmF0ZV9pc3NldF9jaGVjayh0X2ZpZWxkKiBmaWVsZCk7CisgIHN0ZDo6c3RyaW5nIGdlbmVyYXRlX2lzc2V0X2NoZWNrKHN0ZDo6c3RyaW5nIGZpZWxkKTsKKyAgdm9pZCBnZW5lcmF0ZV9pc3NldF9zZXQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiBmaWVsZCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworCisgIC8qKgorICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbWFwKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXQqIHRtYXAsIHN0ZDo6c3RyaW5nIGl0ZXIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RkOjpzdHJpbmcgaXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kYXJ0X2RvYyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpOworCisgIHZvaWQgZ2VuZXJhdGVfZGFydF9kb2Moc3RkOjpvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRkb2MpOworCisgIC8qKgorICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucworICAgKi8KKworICBzdGQ6OnN0cmluZyBmaW5kX2xpYnJhcnlfbmFtZSh0X3Byb2dyYW0qIHByb2dyYW0pOworICBzdGQ6OnN0cmluZyBkYXJ0X2xpYnJhcnkoc3RyaW5nIGZpbGVfbmFtZSk7CisgIHN0ZDo6c3RyaW5nIHNlcnZpY2VfaW1wb3J0cygpOworICBzdGQ6OnN0cmluZyBkYXJ0X3RocmlmdF9pbXBvcnRzKCk7CisgIHN0ZDo6c3RyaW5nIHR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlKTsKKyAgc3RkOjpzdHJpbmcgYmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGUqIHRiYXNlKTsKKyAgc3RkOjpzdHJpbmcgZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdCA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7CisgIHN0ZDo6c3RyaW5nIGdldF90dHlwZV9jbGFzc19uYW1lKHRfdHlwZSogdHR5cGUpOworCisgIGJvb2wgdHlwZV9jYW5fYmVfbnVsbCh0X3R5cGUqIHR0eXBlKSB7CisgICAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKKworICAgIHJldHVybiB0dHlwZS0+aXNfY29udGFpbmVyKCkgfHwgdHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpCisgICAgICAgICAgIHx8IHR0eXBlLT5pc19zdHJpbmcoKTsKKyAgfQorCisgIHZlY3RvcjxzdGQ6OnN0cmluZz4gc3BsaXQoY29uc3Qgc3RyaW5nJiBzLCBjaGFyIGRlbGltKSB7CisgICAgdmVjdG9yPHN0ZDo6c3RyaW5nPiBlbGVtczsKKyAgICBzdHJpbmdzdHJlYW0gc3Mocyk7CisgICAgc3RyaW5nIGl0ZW07CisgICAgd2hpbGUgKGdldGxpbmUoc3MsIGl0ZW0sIGRlbGltKSkgeworICAgICAgZWxlbXMucHVzaF9iYWNrKGl0ZW0pOworICAgIH0KKyAgICByZXR1cm4gZWxlbXM7CisgIH0KKworICBzdGQ6OnN0cmluZyBjb25zdGFudF9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpOworCitwcml2YXRlOgorICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc2VydmljZV87CisKKyAgc3RkOjpzdHJpbmcgbGlicmFyeV9uYW1lXzsKKyAgc3RkOjpzdHJpbmcgbGlicmFyeV9wcmVmaXhfOworICBzdGQ6OnN0cmluZyBwYWNrYWdlX3ByZWZpeF87CisgIHN0ZDo6c3RyaW5nIHB1YnNwZWNfbGliXzsKKworICBzdGQ6OnN0cmluZyBiYXNlX2Rpcl87CisgIHN0ZDo6c3RyaW5nIHNyY19kaXJfOworICBzdGQ6OnN0cmluZyBsaWJyYXJ5X2V4cG9ydHNfOworfTsKKworLyoqCisgKiBQcmVwYXJlcyBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAorICogc3RyZWFtcy4KKyAqCisgKiBAcGFyYW0gdHByb2dyYW0gVGhlIHByb2dyYW0gdG8gZ2VuZXJhdGUKKyAqLwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKKyAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKKworICBpZiAobGlicmFyeV9uYW1lXy5lbXB0eSgpKSB7CisgICAgbGlicmFyeV9uYW1lXyA9IGZpbmRfbGlicmFyeV9uYW1lKHByb2dyYW1fKTsKKyAgfQorCisgIHN0cmluZyBzdWJkaXIgPSBnZXRfb3V0X2RpcigpICsgIi8iICsgbGlicmFyeV9uYW1lXzsKKyAgTUtESVIoc3ViZGlyLmNfc3RyKCkpOworICBiYXNlX2Rpcl8gPSBzdWJkaXI7CisKKyAgaWYgKGxpYnJhcnlfcHJlZml4Xy5lbXB0eSgpKSB7CisgICAgc3ViZGlyICs9ICIvbGliIjsKKyAgICBNS0RJUihzdWJkaXIuY19zdHIoKSk7CisgICAgc3ViZGlyICs9ICIvc3JjIjsKKyAgICBNS0RJUihzdWJkaXIuY19zdHIoKSk7CisgICAgc3JjX2Rpcl8gPSBzdWJkaXI7CisgIH0gZWxzZSB7CisgICAgc3JjX2Rpcl8gPSBiYXNlX2Rpcl87CisgIH0KK30KKworc3RyaW5nIHRfZGFydF9nZW5lcmF0b3I6OmZpbmRfbGlicmFyeV9uYW1lKHRfcHJvZ3JhbSogcHJvZ3JhbSkgeworICBzdHJpbmcgbmFtZSA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2UoImRhcnQiKTsKKyAgaWYgKG5hbWUuZW1wdHkoKSkgeworICAgIG5hbWUgPSBwcm9ncmFtLT5nZXRfbmFtZSgpOworICB9CisgIG5hbWUgPSByZXBsYWNlX2FsbChuYW1lLCAiLiIsICJfIik7CisgIG5hbWUgPSByZXBsYWNlX2FsbChuYW1lLCAiLSIsICJfIik7CisgIHJldHVybiBuYW1lOworfQorCisvKioKKyAqIFRoZSBEYXJ0IGxpYnJhcnkKKyAqCisgKiBAcmV0dXJuIFN0cmluZyBvZiB0aGUgbGlicmFyeSwgZS5nLiAibGlicmFyeSBteXNlcnZpY2U7IgorICovCitzdHJpbmcgdF9kYXJ0X2dlbmVyYXRvcjo6ZGFydF9saWJyYXJ5KHN0cmluZyBmaWxlX25hbWUpIHsKKyAgc3RyaW5nIG91dCA9ICJsaWJyYXJ5ICIgKyBsaWJyYXJ5X3ByZWZpeF8gKyBsaWJyYXJ5X25hbWVfOworICBpZiAoIWZpbGVfbmFtZS5lbXB0eSgpKSB7CisgICAgaWYgKGxpYnJhcnlfcHJlZml4Xy5lbXB0eSgpKSB7CisgICAgICBvdXQgKz0gIi5zcmMuIiArIGZpbGVfbmFtZTsKKyAgICB9IGVsc2UgeworICAgICAgb3V0ICs9ICIuIiArIGZpbGVfbmFtZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG91dCArICI7XG4iOworfQorCisvKioKKyAqIFByaW50cyBpbXBvcnRzIGZvciBzZXJ2aWNlcworICoKKyAqIEByZXR1cm4gTGlzdCBvZiBpbXBvcnRzIGZvciBzZXJ2aWNlcworICovCitzdHJpbmcgdF9kYXJ0X2dlbmVyYXRvcjo6c2VydmljZV9pbXBvcnRzKCkgeworICByZXR1cm4gImltcG9ydCAnZGFydDphc3luYyc7IiArIGVuZGw7Cit9CisKKy8qKgorICogUHJpbnRzIHN0YW5kYXJkIGRhcnQgaW1wb3J0cworICoKKyAqIEByZXR1cm4gTGlzdCBvZiBpbXBvcnRzIG5lY2Vzc2FyeSBmb3IgdGhyaWZ0CisgKi8KK3N0cmluZyB0X2RhcnRfZ2VuZXJhdG9yOjpkYXJ0X3RocmlmdF9pbXBvcnRzKCkgeworICBzdHJpbmcgaW1wb3J0cyA9ICJpbXBvcnQgJ2RhcnQ6dHlwZWRfZGF0YScgc2hvdyBVaW50OExpc3Q7IiArIGVuZGwgKworICAgICAgICAgICAgICAgICAgICJpbXBvcnQgJ3BhY2thZ2U6dGhyaWZ0L3RocmlmdC5kYXJ0JzsiICsgZW5kbDsKKworICAvLyBhZGQgaW1wb3J0IGZvciB0aGlzIGxpYnJhcnkKKyAgaWYgKHBhY2thZ2VfcHJlZml4Xy5lbXB0eSgpKSB7CisgICAgaW1wb3J0cyArPSAiaW1wb3J0ICdwYWNrYWdlOiIgKyBsaWJyYXJ5X25hbWVfICsgIi8iICsgbGlicmFyeV9uYW1lXyArICIuZGFydCc7IiArIGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW1wb3J0cyArPSAiaW1wb3J0ICdwYWNrYWdlOiIgKyBwYWNrYWdlX3ByZWZpeF8gKyBsaWJyYXJ5X25hbWVfICsgIi5kYXJ0JzsiICsgZW5kbDsKKyAgfQorCisgIC8vIGFkZCBpbXBvcnRzIGZvciBpbmNsdWRlZCB0aHJpZnQgZmlsZXMKKyAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+JiBpbmNsdWRlcyA9IHByb2dyYW1fLT5nZXRfaW5jbHVkZXMoKTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmNsdWRlcy5zaXplKCk7ICsraSkgeworICAgIHN0cmluZyBpbmNsdWRlX25hbWUgPSBmaW5kX2xpYnJhcnlfbmFtZShpbmNsdWRlc1tpXSk7CisgICAgc3RyaW5nIG5hbWVkX2ltcG9ydCA9ICJ0XyIgKyBpbmNsdWRlX25hbWU7CisgICAgaWYgKHBhY2thZ2VfcHJlZml4Xy5lbXB0eSgpKSB7CisgICAgICBpbXBvcnRzICs9ICJpbXBvcnQgJ3BhY2thZ2U6IiArIGluY2x1ZGVfbmFtZSArICIvIiArIGluY2x1ZGVfbmFtZSArICIuZGFydCcgYXMgIiArIG5hbWVkX2ltcG9ydCArICI7IiArIGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGltcG9ydHMgKz0gImltcG9ydCAncGFja2FnZToiICsgcGFja2FnZV9wcmVmaXhfICsgaW5jbHVkZV9uYW1lICsgIi5kYXJ0JyBhcyAiICsgbmFtZWRfaW1wb3J0ICsgIjsiICsgZW5kbDsKKyAgICB9CisgIH0KKworICByZXR1cm4gaW1wb3J0czsKK30KKworLyoqCisgKiBOb3QgdXNlZAorICovCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKKyAgZ2VuZXJhdGVfZGFydF9saWJyYXJ5KCk7CisKKyAgaWYgKGxpYnJhcnlfcHJlZml4Xy5lbXB0eSgpKSB7CisgICAgZ2VuZXJhdGVfZGFydF9wdWJzcGVjKCk7CisgIH0KK30KKwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kYXJ0X2xpYnJhcnkoKSB7CisgIHN0cmluZyBmX2xpYnJhcnlfbmFtZTsKKyAgaWYgKGxpYnJhcnlfcHJlZml4Xy5lbXB0eSgpKSB7CisgICAgZl9saWJyYXJ5X25hbWUgPSBiYXNlX2Rpcl8gKyAiL2xpYi8iICsgbGlicmFyeV9uYW1lXyArICIuZGFydCI7CisgIH0gZWxzZSB7CisgICAgZl9saWJyYXJ5X25hbWUgPSBnZXRfb3V0X2RpcigpICsgIi8iICsgbGlicmFyeV9uYW1lXyArICIuZGFydCI7CisgIH0KKworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfbGlicmFyeTsKKyAgZl9saWJyYXJ5Lm9wZW4oZl9saWJyYXJ5X25hbWUuY19zdHIoKSk7CisKKyAgZl9saWJyYXJ5IDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGVuZGw7CisgIGZfbGlicmFyeSA8PCAibGlicmFyeSAiIDw8IGxpYnJhcnlfcHJlZml4XyA8PCBsaWJyYXJ5X25hbWVfIDw8ICI7IiA8PCBlbmRsMjsKKyAgZl9saWJyYXJ5IDw8IGxpYnJhcnlfZXhwb3J0c187CisKKyAgZl9saWJyYXJ5LmNsb3NlKCk7Cit9CisKK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6ZXhwb3J0X2NsYXNzX3RvX2xpYnJhcnkoc3RyaW5nIGZpbGVfbmFtZSwgc3RyaW5nIGNsYXNzX25hbWUpIHsKKyAgc3RyaW5nIHN1YmRpcjsKKyAgaWYgKGxpYnJhcnlfcHJlZml4Xy5lbXB0eSgpKSB7CisgICAgc3ViZGlyID0gInNyYyI7CisgIH0gZWxzZSB7CisgICAgc3ViZGlyID0gbGlicmFyeV9uYW1lXzsKKyAgfQorICBsaWJyYXJ5X2V4cG9ydHNfICs9ICJleHBvcnQgJyIgKyBzdWJkaXIgKyAiLyIgKyBmaWxlX25hbWUgKyAiLmRhcnQnIHNob3cgIiArIGNsYXNzX25hbWUgKyAiOyIgKyBlbmRsOworfQorCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX2RhcnRfcHVic3BlYygpIHsKKyAgc3RyaW5nIGZfcHVic3BlY19uYW1lID0gYmFzZV9kaXJfICsgIi9wdWJzcGVjLnlhbWwiOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfcHVic3BlYzsKKyAgZl9wdWJzcGVjLm9wZW4oZl9wdWJzcGVjX25hbWUuY19zdHIoKSk7CisKKyAgaW5kZW50KGZfcHVic3BlYykgPDwgIm5hbWU6ICIgPDwgbGlicmFyeV9uYW1lXyA8PCBlbmRsOworICBpbmRlbnQoZl9wdWJzcGVjKSA8PCAidmVyc2lvbjogMC4wLjEiIDw8IGVuZGw7CisgIGluZGVudChmX3B1YnNwZWMpIDw8ICJkZXNjcmlwdGlvbjogQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIiIDw8IGVuZGw7CisgIGZfcHVic3BlYyA8PCBlbmRsOworCisgIGluZGVudChmX3B1YnNwZWMpIDw8ICJlbnZpcm9ubWVudDoiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQoZl9wdWJzcGVjKSA8PCAic2RrOiBeMS4xMi4wIiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX3B1YnNwZWMgPDwgZW5kbDsKKworICBpbmRlbnQoZl9wdWJzcGVjKSA8PCAiZGVwZW5kZW5jaWVzOiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaWYgKHB1YnNwZWNfbGliXy5lbXB0eSgpKSB7CisgICAgLy8gZGVmYXVsdCB0byByZWxhdGl2ZSBwYXRoIHdpdGhpbiB3b3JraW5nIGRpcmVjdG9yeSwgd2hpY2ggd29ya3MgZm9yIHRlc3RzCisgICAgaW5kZW50KGZfcHVic3BlYykgPDwgInRocmlmdDogICMgXiIgPDwgZGFydF90aHJpZnRfdmVyc2lvbiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChmX3B1YnNwZWMpIDw8ICJwYXRoOiAuLi8uLi8uLi8uLi9saWIvZGFydCIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9IGVsc2UgeworICAgIGNvbnN0IHZlY3RvcjxzdGQ6OnN0cmluZz4gbGluZXMgPSBzcGxpdChwdWJzcGVjX2xpYl8sICd8Jyk7CisgICAgZm9yIChzaXplX3QgbGluZV9pbmRleCA9IDA7IGxpbmVfaW5kZXggPCBsaW5lcy5zaXplKCk7IGxpbmVfaW5kZXgrKykgeworICAgICAgaW5kZW50KGZfcHVic3BlYykgPDwgbGluZXNbbGluZV9pbmRleF0gPDwgZW5kbDsKKyAgICB9CisgIH0KKworICAvLyBhZGQgaW5jbHVkZWQgdGhyaWZ0IGZpbGVzIGFzIGRlcGVuZGVuY2llcworICBjb25zdCB2ZWN0b3I8dF9wcm9ncmFtKj4mIGluY2x1ZGVzID0gcHJvZ3JhbV8tPmdldF9pbmNsdWRlcygpOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluY2x1ZGVzLnNpemUoKTsgKytpKSB7CisgICAgc3RyaW5nIGluY2x1ZGVfbmFtZSA9IGZpbmRfbGlicmFyeV9uYW1lKGluY2x1ZGVzW2ldKTsKKyAgICBpbmRlbnQoZl9wdWJzcGVjKSA8PCBpbmNsdWRlX25hbWUgPDwgIjoiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KGZfcHVic3BlYykgPDwgInBhdGg6IC4uLyIgPDwgaW5jbHVkZV9uYW1lIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGZfcHVic3BlYyA8PCBlbmRsOworCisgIGZfcHVic3BlYy5jbG9zZSgpOworfQorCisvKioKKyAqIE5vdCB1c2VkCisgKgorICogQHBhcmFtIHR0eXBlZGVmIFRoZSB0eXBlIGRlZmluaXRpb24KKyAqLwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKKyAgKHZvaWQpdHR5cGVkZWY7Cit9CisKKy8qKgorICogRW51bXMgYXJlIGEgY2xhc3Mgd2l0aCBhIHNldCBvZiBzdGF0aWMgY29uc3RhbnRzLgorICoKKyAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KKyAqLwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKKyAgLy8gTWFrZSBvdXRwdXQgZmlsZQorICBzdHJpbmcgZmlsZV9uYW1lID0gZ2V0X2ZpbGVfbmFtZSh0ZW51bS0+Z2V0X25hbWUoKSk7CisKKyAgc3RyaW5nIGZfZW51bV9uYW1lID0gc3JjX2Rpcl8gKyAiLyIgKyBmaWxlX25hbWUgKyAiLmRhcnQiOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfZW51bTsKKyAgZl9lbnVtLm9wZW4oZl9lbnVtX25hbWUuY19zdHIoKSk7CisKKyAgLy8gQ29tbWVudCBhbmQgYWRkIGxpYnJhcnkKKyAgZl9lbnVtIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGRhcnRfbGlicmFyeShmaWxlX25hbWUpIDw8IGVuZGw7CisKKyAgc3RyaW5nIGNsYXNzX25hbWUgPSB0ZW51bS0+Z2V0X25hbWUoKTsKKyAgZXhwb3J0X2NsYXNzX3RvX2xpYnJhcnkoZmlsZV9uYW1lLCBjbGFzc19uYW1lKTsKKyAgZl9lbnVtIDw8ICJjbGFzcyAiIDw8IGNsYXNzX25hbWU7CisgIHNjb3BlX3VwKGZfZW51bSk7CisKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgICAgaW5kZW50KGZfZW51bSkgPDwgInN0YXRpYyBjb25zdCBpbnQgIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgdmFsdWUgPDwgIjsiCisgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgfQorCisgIC8vIENyZWF0ZSBhIHN0YXRpYyBTZXQgd2l0aCBhbGwgdmFsaWQgdmFsdWVzIGZvciB0aGlzIGVudW0KKyAgZl9lbnVtIDw8IGVuZGw7CisKKyAgaW5kZW50KGZfZW51bSkgPDwgInN0YXRpYyBmaW5hbCBTZXQ8aW50PiBWQUxJRF9WQUxVRVMgPSBuZXcgU2V0LmZyb20oWyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGJvb2wgZmlyc3RWYWx1ZSA9IHRydWU7CisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgLy8gcG9wdWxhdGUgc2V0CisgICAgaW5kZW50KGZfZW51bSkgPDwgKGZpcnN0VmFsdWUgPyAiIiA6ICIsICIpOworICAgIGZfZW51bSA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgZW5kbDsKKyAgICBmaXJzdFZhbHVlID0gZmFsc2U7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGZfZW51bSkgPDwgIl0pOyIgPDwgZW5kbDsKKworICBpbmRlbnQoZl9lbnVtKSA8PCAic3RhdGljIGZpbmFsIE1hcDxpbnQsIFN0cmluZz4gVkFMVUVTX1RPX05BTUVTID0geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZpcnN0VmFsdWUgPSB0cnVlOworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGluZGVudChmX2VudW0pIDw8IChmaXJzdFZhbHVlID8gIiIgOiAiLCAiKTsKKyAgICBmX2VudW0gIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOiAnIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIiciIDw8IGVuZGw7CisgICAgZmlyc3RWYWx1ZSA9IGZhbHNlOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX2VudW0pIDw8ICJ9OyIgPDwgZW5kbDsKKworICBzY29wZV9kb3duKGZfZW51bSk7IC8vIGVuZCBjbGFzcworCisgIGZfZW51bS5jbG9zZSgpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGNsYXNzIHRoYXQgaG9sZHMgYWxsIHRoZSBjb25zdGFudHMuCisgKi8KK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3RzKHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpIHsKKyAgaWYgKGNvbnN0cy5lbXB0eSgpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgc3RyaW5nIGNsYXNzX25hbWUgPSBnZXRfY29uc3RhbnRzX2NsYXNzX25hbWUocHJvZ3JhbV9uYW1lXyk7CisgIHN0cmluZyBmaWxlX25hbWUgPSBnZXRfZmlsZV9uYW1lKGNsYXNzX25hbWUpOworCisgIHN0cmluZyBmX2NvbnN0c19uYW1lID0gc3JjX2Rpcl8gKyAiLyIgKyBmaWxlX25hbWUgKyAiLmRhcnQiOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfY29uc3RzOworICBmX2NvbnN0cy5vcGVuKGZfY29uc3RzX25hbWUuY19zdHIoKSk7CisKKyAgLy8gUHJpbnQgaGVhZGVyCisgIGZfY29uc3RzIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGRhcnRfbGlicmFyeShmaWxlX25hbWUpIDw8IGVuZGw7CisgIGZfY29uc3RzIDw8IGRhcnRfdGhyaWZ0X2ltcG9ydHMoKSA8PCBlbmRsOworCisgIGV4cG9ydF9jbGFzc190b19saWJyYXJ5KGZpbGVfbmFtZSwgY2xhc3NfbmFtZSk7CisgIGluZGVudChmX2NvbnN0cykgPDwgImNsYXNzICIgPDwgY2xhc3NfbmFtZTsKKyAgc2NvcGVfdXAoZl9jb25zdHMpOworCisgIHZlY3Rvcjx0X2NvbnN0Kj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBwcmludF9jb25zdF92YWx1ZShmX2NvbnN0cywKKyAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICAgIGZfY29uc3RzIDw8IGVuZGw7CisgIH0KKworICBzY29wZV9kb3duKGZfY29uc3RzKTsKKworICBmX2NvbnN0cy5jbG9zZSgpOworfQorCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OnByaW50X2NvbnN0X3ZhbHVlKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX3N0YXRpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlZnZhbCkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKworICBpbmRlbnQob3V0KTsKKyAgaWYgKCFkZWZ2YWwpIHsKKyAgICBvdXQgPDwgKGluX3N0YXRpYyA/ICJ2YXIgIiA6ICJzdGF0aWMgZmluYWwgIik7CisgIH0KKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgaWYgKCFkZWZ2YWwpIHsKKyAgICAgIG91dCA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiAiOworICAgIH0KKyAgICBzdHJpbmcgdjIgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCB0eXBlLCB2YWx1ZSk7CisgICAgb3V0IDw8IG5hbWU7CisgICAgb3V0IDw8ICIgPSAiIDw8IHYyIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgaWYgKCFkZWZ2YWwpIHsKKyAgICAgIG91dCA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiAiOworICAgIH0KKyAgICBvdXQgPDwgbmFtZTsKKyAgICBvdXQgPDwgIiA9ICIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgb3V0IDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiICIgPDwgbmFtZSA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIoKSI7CisgICAgaW5kZW50X3VwKCk7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7CisgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgeworICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKKyAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKKyAgICAgIH0KKyAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgICBvdXQgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICIuLiIgPDwgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpIDw8ICIgPSAiIDw8IHZhbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgIjsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpZiAoIWRlZnZhbCkgeworICAgICAgb3V0IDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiICI7CisgICAgfQorICAgIG91dCA8PCBuYW1lIDw8ICIgPSI7CisgICAgc2NvcGVfdXAob3V0KTsKKworICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworCisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHN0cmluZyBrZXkgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBrdHlwZSwgdl9pdGVyLT5maXJzdCk7CisgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgdnR5cGUsIHZfaXRlci0+c2Vjb25kKTsKKyAgICAgIGluZGVudChvdXQpIDw8IGtleSA8PCAiOiAiIDw8IHZhbCA8PCAiLCIgPDwgZW5kbDsKKyAgICB9CisgICAgc2NvcGVfZG93bihvdXQsICI7IiArIGVuZGwpOworCisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKSB7CisgICAgaWYgKCFkZWZ2YWwpIHsKKyAgICAgIG91dCA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiAiOworICAgIH0KKyAgICBvdXQgPDwgbmFtZSA8PCAiID0gIjsKKyAgICB0X3R5cGUqIGV0eXBlOworICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIG91dCA8PCAiWyIgPDwgZW5kbDsKKyAgICAgIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCAibmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIuZnJvbShbIiA8PCBlbmRsOworICAgICAgZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIH0KKyAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGV0eXBlLCAqdl9pdGVyKTsKKyAgICAgIGluZGVudChvdXQpIDw8IHZhbCA8PCAiLCIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKworICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJdOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgIl0pOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIHR5cGUgIiArIHR5cGUtPmdldF9uYW1lKCk7CisgIH0KK30KKworc3RyaW5nIHRfZGFydF9nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZShvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7CisgICh2b2lkKW5hbWU7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworICBzdGQ6Om9zdHJpbmdzdHJlYW0gcmVuZGVyOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZW5kZXIgPDwgIiciIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgIiciOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmVuZGVyIDw8ICgodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKKyAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgfSBlbHNlIHsKKyAgICBzdHJpbmcgdCA9IHRtcCgidG1wIik7CisgICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LCB0LCB0eXBlLCB2YWx1ZSwgdHJ1ZSk7CisgICAgb3V0IDw8IGVuZGw7CisgICAgcmVuZGVyIDw8IHQ7CisgIH0KKworICByZXR1cm4gcmVuZGVyLnN0cigpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuIFRoaXMgaXMgYSBjbGFzcworICogd2l0aCBkYXRhIG1lbWJlcnMsIHJlYWQoKSwgd3JpdGUoKSwgYW5kIGFuIGlubmVyIElzc2V0IGNsYXNzLgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBnZW5lcmF0ZV9kYXJ0X3N0cnVjdCh0c3RydWN0LCBmYWxzZSk7Cit9CisKKy8qKgorICogRXhjZXB0aW9ucyBhcmUgc3RydWN0cywgYnV0IHRoZXkgaW5oZXJpdCBmcm9tIEV4Y2VwdGlvbgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKKyAgZ2VuZXJhdGVfZGFydF9zdHJ1Y3QodHhjZXB0aW9uLCB0cnVlKTsKK30KKworLyoqCisgKiBEYXJ0IHN0cnVjdCBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX2RhcnRfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbikgeworICBzdHJpbmcgZmlsZV9uYW1lID0gZ2V0X2ZpbGVfbmFtZSh0c3RydWN0LT5nZXRfbmFtZSgpKTsKKyAgc3RyaW5nIGZfc3RydWN0X25hbWUgPSBzcmNfZGlyXyArICIvIiArIGZpbGVfbmFtZSArICIuZGFydCI7CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9zdHJ1Y3Q7CisgIGZfc3RydWN0Lm9wZW4oZl9zdHJ1Y3RfbmFtZS5jX3N0cigpKTsKKworICBmX3N0cnVjdCA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBkYXJ0X2xpYnJhcnkoZmlsZV9uYW1lKSA8PCBlbmRsOworCisgIHN0cmluZyBpbXBvcnRzOworCisgIGZfc3RydWN0IDw8IGRhcnRfdGhyaWZ0X2ltcG9ydHMoKSA8PCBlbmRsOworCisgIGdlbmVyYXRlX2RhcnRfc3RydWN0X2RlZmluaXRpb24oZl9zdHJ1Y3QsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbiwgZmFsc2UsIGZpbGVfbmFtZSk7CisKKyAgZl9zdHJ1Y3QuY2xvc2UoKTsKK30KKworLyoqCisgKiBEYXJ0IHN0cnVjdCBkZWZpbml0aW9uLiBUaGlzIGhhcyB2YXJpb3VzIHBhcmFtZXRlcnMsIGFzIGl0IGNvdWxkIGJlCisgKiBnZW5lcmF0ZWQgc3RhbmRhbG9uZSBvciBpbnNpZGUgYW5vdGhlciBjbGFzcyBhcyBhIGhlbHBlci4gSWYgaXQKKyAqIGlzIGEgaGVscGVyIHRoYW4gaXQgaXMgYSBzdGF0aWMgY2xhc3MuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgICAgICBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqIEBwYXJhbSBpc19leGNlcHRpb24gSXMgdGhpcyBhbiBleGNlcHRpb24/CisgKiBAcGFyYW0gaW5fY2xhc3MgICAgIElmIGluc2lkZSBhIGNsYXNzLCBuZWVkcyB0byBiZSBzdGF0aWMgY2xhc3MKKyAqIEBwYXJhbSBpc19yZXN1bHQgICAgSWYgdGhpcyBpcyBhIHJlc3VsdCBpdCBuZWVkcyBhIGRpZmZlcmVudCB3cml0ZXIKKyAqLwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kYXJ0X3N0cnVjdF9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZXhwb3J0X2ZpbGVfbmFtZSkgeworICBnZW5lcmF0ZV9kYXJ0X2RvYyhvdXQsIHRzdHJ1Y3QpOworCisgIHN0cmluZyBjbGFzc19uYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKKyAgaWYgKCFleHBvcnRfZmlsZV9uYW1lLmVtcHR5KCkpIHsKKyAgICBleHBvcnRfY2xhc3NfdG9fbGlicmFyeShleHBvcnRfZmlsZV9uYW1lLCBjbGFzc19uYW1lKTsKKyAgfQorICBpbmRlbnQob3V0KSA8PCAiY2xhc3MgIiA8PCBjbGFzc19uYW1lIDw8ICIgIjsKKworICBvdXQgPDwgImltcGxlbWVudHMgVEJhc2UiOworICBpZiAoaXNfZXhjZXB0aW9uKSB7CisgICAgb3V0IDw8ICIsIEV4Y2VwdGlvbiAiOworICB9CisgIHNjb3BlX3VwKG91dCk7CisKKyAgaW5kZW50KG91dCkgPDwgInN0YXRpYyBmaW5hbCBUU3RydWN0IF9TVFJVQ1RfREVTQyA9IG5ldyBUU3RydWN0KFwiIiA8PCBjbGFzc19uYW1lCisgICAgICAgICAgICAgIDw8ICJcIik7IiA8PCBlbmRsOworCisgIC8vIE1lbWJlcnMgYXJlIHB1YmxpYyBmb3IgLWRhcnQsIHByaXZhdGUgZm9yIC1kYXJ0YmVhbgorICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAic3RhdGljIGZpbmFsIFRGaWVsZCBfIiA8PCBjb25zdGFudF9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkKKyAgICAgICAgICAgICAgICA8PCAiX0ZJRUxEX0RFU0MgPSBuZXcgVEZpZWxkKFwiIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiLCAiCisgICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiwgIiA8PCAoKm1faXRlciktPmdldF9rZXkoKSA8PCAiKTsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgfQorCisgIG91dCA8PCBlbmRsOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9kYXJ0X2RvYyhvdXQsICptX2l0ZXIpOworICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZSgoKm1faXRlciktPmdldF90eXBlKCkpICsgIiBfIgorICAgICAgICAgICAgICAgIDw8IGdldF9tZW1iZXJfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpIDw8IGluaXRfdmFsdWUoKm1faXRlcikgPDwgIjsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnQob3V0KSA8PCAic3RhdGljIGNvbnN0IGludCAiIDw8IHVwY2FzZV9zdHJpbmcoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgIDw8ICIgPSAiIDw8ICgqbV9pdGVyKS0+Z2V0X2tleSgpIDw8ICI7IiA8PCBlbmRsOworICB9CisKKyAgb3V0IDw8IGVuZGw7CisKKyAgLy8gSW5uZXIgSXNzZXQgY2xhc3MKKyAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgeworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIGlmICghdHlwZV9jYW5fYmVfbnVsbCgoKm1faXRlciktPmdldF90eXBlKCkpKSB7CisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lID0gZ2V0X21lbWJlcl9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJib29sIF9faXNzZXRfIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSBmYWxzZTsiIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorICB9CisKKyAgb3V0IDw8IGVuZGw7CisKKyAgLy8gRGVmYXVsdCBjb25zdHJ1Y3RvcgorICBpbmRlbnQob3V0KSA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoKSI7CisgIHNjb3BlX3VwKG91dCk7CisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgeworICAgICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMuIiArIGdldF9tZW1iZXJfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7CisgICAgfQorICB9CisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgb3V0IDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfZGFydF9iZWFuX2JvaWxlcnBsYXRlKG91dCwgdHN0cnVjdCk7CisgIGdlbmVyYXRlX2dlbmVyaWNfZmllbGRfZ2V0dGVycyhvdXQsIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9nZW5lcmljX2ZpZWxkX3NldHRlcnMob3V0LCB0c3RydWN0KTsKKyAgZ2VuZXJhdGVfZ2VuZXJpY19pc3NldF9tZXRob2Qob3V0LCB0c3RydWN0KTsKKworICBnZW5lcmF0ZV9kYXJ0X3N0cnVjdF9yZWFkZXIob3V0LCB0c3RydWN0KTsKKyAgaWYgKGlzX3Jlc3VsdCkgeworICAgIGdlbmVyYXRlX2RhcnRfc3RydWN0X3Jlc3VsdF93cml0ZXIob3V0LCB0c3RydWN0KTsKKyAgfSBlbHNlIHsKKyAgICBnZW5lcmF0ZV9kYXJ0X3N0cnVjdF93cml0ZXIob3V0LCB0c3RydWN0KTsKKyAgfQorICBnZW5lcmF0ZV9kYXJ0X3N0cnVjdF90b3N0cmluZyhvdXQsIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9kYXJ0X3ZhbGlkYXRvcihvdXQsIHRzdHJ1Y3QpOworICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGZ1bmN0aW9uIHRvIHJlYWQgYWxsIHRoZSBmaWVsZHMgb2YgdGhlIHN0cnVjdC4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kYXJ0X3N0cnVjdF9yZWFkZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpbmRlbnQob3V0KSA8PCAicmVhZChUUHJvdG9jb2wgaXByb3QpIjsKKyAgc2NvcGVfdXAob3V0KTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgLy8gRGVjbGFyZSBzdGFjayB0bXAgdmFyaWFibGVzIGFuZCByZWFkIHN0cnVjdCBoZWFkZXIKKyAgaW5kZW50KG91dCkgPDwgIlRGaWVsZCBmaWVsZDsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkU3RydWN0QmVnaW4oKTsiIDw8IGVuZGw7CisKKyAgLy8gTG9vcCBvdmVyIHJlYWRpbmcgaW4gZmllbGRzCisgIGluZGVudChvdXQpIDw8ICJ3aGlsZSAodHJ1ZSkiOworICBzY29wZV91cChvdXQpOworCisgIC8vIFJlYWQgYmVnaW5uaW5nIGZpZWxkIG1hcmtlcgorICBpbmRlbnQob3V0KSA8PCAiZmllbGQgPSBpcHJvdC5yZWFkRmllbGRCZWdpbigpOyIgPDwgZW5kbDsKKworICAvLyBDaGVjayBmb3IgZmllbGQgU1RPUCBtYXJrZXIgYW5kIGJyZWFrCisgIGluZGVudChvdXQpIDw8ICJpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5TVE9QKSI7CisgIHNjb3BlX3VwKG91dCk7CisgIGluZGVudChvdXQpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24ob3V0KTsKKworICAvLyBTd2l0Y2ggc3RhdGVtZW50IG9uIHRoZSBmaWVsZCB3ZSBhcmUgcmVhZGluZworICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChmaWVsZC5pZCkiOworICBzY29wZV91cChvdXQpOworCisgIC8vIEdlbmVyYXRlIGRlc2VyaWFsaXphdGlvbiBjb2RlIGZvciBrbm93biBjYXNlcworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgdXBjYXNlX3N0cmluZygoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICI6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgaW5kZW50KG91dCkgPDwgImlmIChmaWVsZC50eXBlID09ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIikiOworICAgIHNjb3BlX3VwKG91dCk7CisKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJ0aGlzLiIpOworICAgIGdlbmVyYXRlX2lzc2V0X3NldChvdXQsICpmX2l0ZXIpOworCisgICAgc2NvcGVfZG93bihvdXQsICIgZWxzZSIpOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgaW5kZW50KG91dCkgPDwgIlRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24ob3V0KTsKKworICAgIGluZGVudChvdXQpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIC8vIEluIHRoZSBkZWZhdWx0IGNhc2Ugd2Ugc2tpcCB0aGUgZmllbGQKKyAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgIlRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICAvLyBSZWFkIGZpZWxkIGVuZCBtYXJrZXIKKyAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRGaWVsZEVuZCgpOyIgPDwgZW5kbDsKKworICBzY29wZV9kb3duKG91dCk7CisKKyAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRTdHJ1Y3RFbmQoKTsiIDw8IGVuZGwyOworCisgIC8vIGluIG5vbi1iZWFucyBzdHlsZSwgY2hlY2sgZm9yIHJlcXVpcmVkIGZpZWxkcyBvZiBwcmltaXRpdmUgdHlwZQorICAvLyAod2hpY2ggY2FuIGJlIGNoZWNrZWQgaGVyZSBidXQgbm90IGluIHRoZSBnZW5lcmFsIHZhbGlkYXRlIG1ldGhvZCkKKyAgaW5kZW50KG91dCkgPDwgIi8vIGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMgb2YgcHJpbWl0aXZlIHR5cGUsIHdoaWNoIGNhbid0IGJlICIKKyAgICAgICAgICAgICAgICAgImNoZWNrZWQgaW4gdGhlIHZhbGlkYXRlIG1ldGhvZCIgPDwgZW5kbDsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCAmJiAhdHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpKSB7CisgICAgICBzdHJpbmcgZmllbGRfbmFtZSA9IGdldF9tZW1iZXJfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpOworICAgICAgaW5kZW50KG91dCkgPDwgImlmICghX19pc3NldF8iIDw8IGZpZWxkX25hbWUgPDwgIikiOworICAgICAgc2NvcGVfdXAob3V0KTsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBUUHJvdG9jb2xFcnJvcihUUHJvdG9jb2xFcnJvclR5cGUuVU5LTk9XTiwgXCJSZXF1aXJlZCBmaWVsZCAnIgorICAgICAgICAgIDw8IGZpZWxkX25hbWUKKyAgICAgICAgICA8PCAiJyB3YXMgbm90IGZvdW5kIGluIHNlcmlhbGl6ZWQgZGF0YSEgU3RydWN0OiBcIiArIHRvU3RyaW5nKCkpOyIgPDwgZW5kbDsKKyAgICAgIHNjb3BlX2Rvd24ob3V0LCBlbmRsMik7CisgICAgfQorICB9CisKKyAgLy8gcGVyZm9ybXMgdmFyaW91cyBjaGVja3MgKGUuZy4gY2hlY2sgdGhhdCBhbGwgcmVxdWlyZWQgZmllbGRzIGFyZSBzZXQpCisgIGluZGVudChvdXQpIDw8ICJ2YWxpZGF0ZSgpOyIgPDwgZW5kbDsKKworICBzY29wZV9kb3duKG91dCwgZW5kbDIpOworfQorCisvLyBnZW5lcmF0ZXMgZGFydCBtZXRob2QgdG8gcGVyZm9ybSB2YXJpb3VzIGNoZWNrcworLy8gKGUuZy4gY2hlY2sgdGhhdCBhbGwgcmVxdWlyZWQgZmllbGRzIGFyZSBzZXQpCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX2RhcnRfdmFsaWRhdG9yKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgInZhbGlkYXRlKCkiOworICBzY29wZV91cChvdXQpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBpbmRlbnQob3V0KSA8PCAiLy8gY2hlY2sgZm9yIHJlcXVpcmVkIGZpZWxkcyIgPDwgZW5kbDsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgc3RyaW5nIGZpZWxkX25hbWUgPSBnZXRfbWVtYmVyX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IGZpZWxkX25hbWUgPDwgIiA9PSBudWxsKSI7CisgICAgICAgIHNjb3BlX3VwKG91dCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJ0aHJvdyBuZXcgVFByb3RvY29sRXJyb3IoVFByb3RvY29sRXJyb3JUeXBlLlVOS05PV04sIFwiUmVxdWlyZWQgZmllbGQgJyIKKyAgICAgICAgICAgICAgICAgICAgPDwgZmllbGRfbmFtZSA8PCAiJyB3YXMgbm90IHByZXNlbnQhIFN0cnVjdDogXCIgKyB0b1N0cmluZygpKTsiCisgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICIvLyBhbGFzLCB3ZSBjYW5ub3QgY2hlY2sgJyIgPDwgZmllbGRfbmFtZQorICAgICAgICAgICAgICAgICAgICA8PCAiJyBiZWNhdXNlIGl0J3MgYSBwcmltaXRpdmUgYW5kIHlvdSBjaG9zZSB0aGUgbm9uLWJlYW5zIGdlbmVyYXRvci4iIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gY2hlY2sgdGhhdCBmaWVsZHMgb2YgdHlwZSBlbnVtIGhhdmUgdmFsaWQgdmFsdWVzCisgIGluZGVudChvdXQpIDw8ICIvLyBjaGVjayB0aGF0IGZpZWxkcyBvZiB0eXBlIGVudW0gaGF2ZSB2YWxpZCB2YWx1ZXMiIDw8IGVuZGw7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAoKmZfaXRlcik7CisgICAgdF90eXBlKiB0eXBlID0gZmllbGQtPmdldF90eXBlKCk7CisgICAgLy8gaWYgZmllbGQgaXMgYW4gZW51bSwgY2hlY2sgdGhhdCBpdHMgdmFsdWUgaXMgdmFsaWQKKyAgICBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICBzdHJpbmcgZmllbGRfbmFtZSA9IGdldF9tZW1iZXJfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSk7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQpIDw8ICIgJiYgISIgPDwgZ2V0X3R0eXBlX2NsYXNzX25hbWUodHlwZSkKKyAgICAgICAgICAgICAgICAgIDw8ICIuVkFMSURfVkFMVUVTLmNvbnRhaW5zKCIgPDwgZmllbGRfbmFtZSA8PCAiKSkiOworICAgICAgc2NvcGVfdXAob3V0KTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ0aHJvdyBuZXcgVFByb3RvY29sRXJyb3IoVFByb3RvY29sRXJyb3JUeXBlLlVOS05PV04sIFwiVGhlIGZpZWxkICciCisgICAgICAgICAgICAgICAgICA8PCBmaWVsZF9uYW1lIDw8ICInIGhhcyBiZWVuIGFzc2lnbmVkIHRoZSBpbnZhbGlkIHZhbHVlICIKKyAgICAgICAgICAgICAgICAgIDw8ICIkIiA8PCBmaWVsZF9uYW1lIDw8ICJcIik7IiA8PCBlbmRsOworICAgICAgc2NvcGVfZG93bihvdXQpOworICAgIH0KKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0LCBlbmRsMik7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gd3JpdGUgYWxsIHRoZSBmaWVsZHMgb2YgdGhlIHN0cnVjdAorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX2RhcnRfc3RydWN0X3dyaXRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAid3JpdGUoVFByb3RvY29sIG9wcm90KSI7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAvLyBwZXJmb3JtcyB2YXJpb3VzIGNoZWNrcyAoZS5nLiBjaGVjayB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHNldCkKKyAgaW5kZW50KG91dCkgPDwgInZhbGlkYXRlKCk7IiA8PCBlbmRsMjsKKworICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbihfU1RSVUNUX0RFU0MpOyIgPDwgZW5kbDsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHN0cmluZyBmaWVsZF9uYW1lID0gZ2V0X21lbWJlcl9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgYm9vbCBjb3VsZF9iZV91bnNldCA9ICgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUw7CisgICAgaWYgKGNvdWxkX2JlX3Vuc2V0KSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKmZfaXRlcikgPDwgIikiOworICAgICAgc2NvcGVfdXAob3V0KTsKKyAgICB9CisgICAgYm9vbCBudWxsX2FsbG93ZWQgPSB0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgaWYgKG51bGxfYWxsb3dlZCkgeworICAgICAgaW5kZW50KG91dCkgPDwgImlmICh0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiICE9IG51bGwpIjsKKyAgICAgIHNjb3BlX3VwKG91dCk7CisgICAgfQorCisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlRmllbGRCZWdpbihfIiA8PCBjb25zdGFudF9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkKKyAgICAgICAgICAgICAgICA8PCAiX0ZJRUxEX0RFU0MpOyIgPDwgZW5kbDsKKworICAgIC8vIFdyaXRlIGZpZWxkIGNvbnRlbnRzCisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMuIik7CisKKyAgICAvLyBXcml0ZSBmaWVsZCBjbG9zZXIKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVGaWVsZEVuZCgpOyIgPDwgZW5kbDsKKworICAgIGlmIChudWxsX2FsbG93ZWQpIHsKKyAgICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICB9CisgICAgaWYgKGNvdWxkX2JlX3Vuc2V0KSB7CisgICAgICBzY29wZV9kb3duKG91dCk7CisgICAgfQorICB9CisgIC8vIFdyaXRlIHRoZSBzdHJ1Y3QgbWFwCisgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKTsiCisgICAgICA8PCBlbmRsOworCisgIHNjb3BlX2Rvd24ob3V0LCBlbmRsMik7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gd3JpdGUgYWxsIHRoZSBmaWVsZHMgb2YgdGhlIHN0cnVjdCwKKyAqIHdoaWNoIGlzIGEgZnVuY3Rpb24gcmVzdWx0LiBUaGVzZSBmaWVsZHMgYXJlIG9ubHkgd3JpdHRlbgorICogaWYgdGhleSBhcmUgc2V0IGluIHRoZSBJc3NldCBhcnJheSwgYW5kIG9ubHkgb25lIG9mIHRoZW0KKyAqIGNhbiBiZSBzZXQgYXQgYSB0aW1lLgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX2RhcnRfc3RydWN0X3Jlc3VsdF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpbmRlbnQob3V0KSA8PCAid3JpdGUoVFByb3RvY29sIG9wcm90KSI7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbihfU1RSVUNUX0RFU0MpOyIgPDwgZW5kbDI7CisKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgaW5kZW50KG91dCkgPDwgImlmICI7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCAiIGVsc2UgaWYgIjsKKyAgICB9CisKKyAgICBvdXQgPDwgIih0aGlzLiIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKmZfaXRlcikgPDwgIikiOworICAgIHNjb3BlX3VwKG91dCk7CisKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVGaWVsZEJlZ2luKF8iIDw8IGNvbnN0YW50X25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgIDw8ICJfRklFTERfREVTQyk7IiA8PCBlbmRsOworCisgICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAidGhpcy4iKTsKKworICAgIC8vIFdyaXRlIGZpZWxkIGNsb3NlcgorICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOworCisgICAgc2NvcGVfZG93bihvdXQsICIiKTsKKyAgfQorICBvdXQgPDwgZW5kbDsKKworICAvLyBXcml0ZSB0aGUgc3RydWN0IG1hcAorICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVGaWVsZFN0b3AoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJvcHJvdC53cml0ZVN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKKworICBzY29wZV9kb3duKG91dCwgZW5kbDIpOworfQorCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX2dlbmVyaWNfZmllbGRfZ2V0dGVycyhzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIC8vIGNyZWF0ZSB0aGUgZ2V0dGVyCisgIGluZGVudChvdXQpIDw8ICJnZXRGaWVsZFZhbHVlKGludCBmaWVsZElEKSI7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmllbGRJRCkiOworICBzY29wZV91cChvdXQpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICpmX2l0ZXI7CisgICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9IGdldF9tZW1iZXJfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSk7CisKKyAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IHVwY2FzZV9zdHJpbmcoZmllbGRfbmFtZSkgPDwgIjoiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgInJldHVybiB0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgInRocm93IG5ldyBBcmd1bWVudEVycm9yKFwiRmllbGQgJGZpZWxkSUQgZG9lc24ndCBleGlzdCFcIik7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworCisgIHNjb3BlX2Rvd24ob3V0KTsgIC8vIHN3aXRjaAorICBzY29wZV9kb3duKG91dCwgZW5kbDIpOyAgLy8gbWV0aG9kCit9CisKK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ2VuZXJpY19maWVsZF9zZXR0ZXJzKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKworICAvLyBjcmVhdGUgdGhlIHNldHRlcgorICBpbmRlbnQob3V0KSA8PCAic2V0RmllbGRWYWx1ZShpbnQgZmllbGRJRCwgT2JqZWN0IHZhbHVlKSI7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmllbGRJRCkiOworICBzY29wZV91cChvdXQpOworCisgIC8vIGJ1aWxkIHVwIHRoZSBib2RpZXMgb2YgYm90aCB0aGUgZ2V0dGVyIGFuZCBzZXR0ZXIgYXQgb25jZQorICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAqZl9pdGVyOworICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSBnZXRfbWVtYmVyX25hbWUoZmllbGQtPmdldF9uYW1lKCkpOworCisgICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCB1cGNhc2Vfc3RyaW5nKGZpZWxkX25hbWUpIDw8ICI6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgaW5kZW50KG91dCkgPDwgImlmICh2YWx1ZSA9PSBudWxsKSI7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBpbmRlbnQob3V0KSA8PCAidW5zZXQiIDw8IGdldF9jYXBfbmFtZShmaWVsZF9uYW1lKSA8PCAiKCk7IiA8PCBlbmRsOworCisgICAgc2NvcGVfZG93bihvdXQsICIgZWxzZSIpOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSB2YWx1ZTsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihvdXQpOworCisgICAgaW5kZW50KG91dCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKKworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGVuZGw7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAidGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoXCJGaWVsZCAkZmllbGRJRCBkb2Vzbid0IGV4aXN0IVwiKTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisKKyAgc2NvcGVfZG93bihvdXQpOyAgLy8gc3dpdGNoCisgIHNjb3BlX2Rvd24ob3V0LCBlbmRsMik7ICAvLyBtZXRob2QKK30KKworLy8gQ3JlYXRlcyBhIGdlbmVyaWMgaXNTZXQgbWV0aG9kIHRoYXQgdGFrZXMgdGhlIGZpZWxkIG51bWJlciBhcyBhcmd1bWVudAordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nZW5lcmljX2lzc2V0X21ldGhvZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIC8vIGNyZWF0ZSB0aGUgaXNTZXQgbWV0aG9kCisgIGluZGVudChvdXQpIDw8ICIvLyBSZXR1cm5zIHRydWUgaWYgZmllbGQgY29ycmVzcG9uZGluZyB0byBmaWVsZElEIGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSAiCisgICAgICAgICAgICAgICAgICJ2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgImJvb2wgaXNTZXQoaW50IGZpZWxkSUQpIjsKKyAgc2NvcGVfdXAob3V0KTsKKworICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChmaWVsZElEKSI7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICpmX2l0ZXI7CisgICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCB1cGNhc2Vfc3RyaW5nKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuICIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQpIDw8ICI7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAidGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoXCJGaWVsZCAkZmllbGRJRCBkb2Vzbid0IGV4aXN0IVwiKTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisKKyAgc2NvcGVfZG93bihvdXQpOyAgLy8gc3dpdGNoCisgIHNjb3BlX2Rvd24ob3V0LCBlbmRsMik7ICAvLyBtZXRob2QKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXQgb2YgRGFydCBCZWFuIGJvaWxlcnBsYXRlIGZ1bmN0aW9ucyAoc2V0dGVycywgZ2V0dGVycywgZXRjLikKKyAqIGZvciB0aGUgZ2l2ZW4gc3RydWN0LgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX2RhcnRfYmVhbl9ib2lsZXJwbGF0ZShvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfZmllbGQqIGZpZWxkID0gKmZfaXRlcjsKKyAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lID0gZ2V0X21lbWJlcl9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKTsKKyAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSA9IGdldF9jYXBfbmFtZShmaWVsZF9uYW1lKTsKKworICAgIGluZGVudChvdXQpIDw8ICIvLyAiIDw8IGZpZWxkX25hbWUgPDwgZW5kbDsKKworICAgIC8vIFNpbXBsZSBnZXR0ZXIKKyAgICBnZW5lcmF0ZV9kYXJ0X2RvYyhvdXQsIGZpZWxkKTsKKyAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiBnZXQgIiA8PCBmaWVsZF9uYW1lIDw8ICIgPT4gdGhpcy5fIiA8PCBmaWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsMjsKKworICAgIC8vIFNpbXBsZSBzZXR0ZXIKKyAgICBnZW5lcmF0ZV9kYXJ0X2RvYyhvdXQsIGZpZWxkKTsKKyAgICBpbmRlbnQob3V0KSA8PCAic2V0ICIgPDwgZmllbGRfbmFtZSA8PCAiKCIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgIiA8PCBmaWVsZF9uYW1lIDw8ICIpIjsKKyAgICBzY29wZV91cChvdXQpOworICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLl8iIDw8IGZpZWxkX25hbWUgPDwgIiA9ICIgPDwgZmllbGRfbmFtZSA8PCAiOyIgPDwgZW5kbDsKKyAgICBnZW5lcmF0ZV9pc3NldF9zZXQob3V0LCBmaWVsZCk7CisgICAgc2NvcGVfZG93bihvdXQsIGVuZGwyKTsKKworICAgIC8vIGlzU2V0IG1ldGhvZAorICAgIGluZGVudChvdXQpIDw8ICJib29sIGlzIiA8PCBnZXRfY2FwX25hbWUoInNldCIpIDw8IGNhcF9uYW1lIDw8ICIoKSI7CisgICAgaWYgKHR5cGVfY2FuX2JlX251bGwodHlwZSkpIHsKKyAgICAgIG91dCA8PCAiID0+IHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgIT0gbnVsbDsiIDw8IGVuZGwyOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgIiA9PiB0aGlzLl9faXNzZXRfIiA8PCBmaWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsMjsKKyAgICB9CisKKyAgICAvLyBVbnNldHRlcgorICAgIGluZGVudChvdXQpIDw8ICJ1bnNldCIgPDwgY2FwX25hbWUgPDwgIigpIjsKKyAgICBzY29wZV91cChvdXQpOworICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKHR5cGUpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9IG51bGw7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy5fX2lzc2V0XyIgPDwgZmllbGRfbmFtZSA8PCAiID0gZmFsc2U7IiA8PCBlbmRsOworICAgIH0KKyAgICBzY29wZV9kb3duKG91dCwgZW5kbDIpOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdG9TdHJpbmcoKSBtZXRob2QgZm9yIHRoZSBnaXZlbiBzdHJ1Y3QKKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kYXJ0X3N0cnVjdF90b3N0cmluZyhvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpbmRlbnQob3V0KSA8PCAiU3RyaW5nIHRvU3RyaW5nKCkiOworICBzY29wZV91cChvdXQpOworCisgIGluZGVudChvdXQpIDw8ICJTdHJpbmdCdWZmZXIgcmV0ID0gbmV3IFN0cmluZ0J1ZmZlcihcIiIKKyAgICAgICAgICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKFwiKTsiIDw8IGVuZGwyOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBib29sIGNvdWxkX2JlX3Vuc2V0ID0gKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTDsKKyAgICBpZiAoY291bGRfYmVfdW5zZXQpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygqZl9pdGVyKSA8PCAiKSI7CisgICAgICBzY29wZV91cChvdXQpOworICAgIH0KKworICAgIHRfZmllbGQqIGZpZWxkID0gKCpmX2l0ZXIpOworICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSBnZXRfbWVtYmVyX25hbWUoZmllbGQtPmdldF9uYW1lKCkpOworCisgICAgaWYgKCFmaXJzdCkgeworICAgICAgaW5kZW50KG91dCkgPDwgInJldC53cml0ZShcIiwgXCIpOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50KG91dCkgPDwgInJldC53cml0ZShcIiIgPDwgZmllbGRfbmFtZSA8PCAiOlwiKTsiIDw8IGVuZGw7CisgICAgYm9vbCBjYW5fYmVfbnVsbCA9IHR5cGVfY2FuX2JlX251bGwoZmllbGQtPmdldF90eXBlKCkpOworICAgIGlmIChjYW5fYmVfbnVsbCkgeworICAgICAgaW5kZW50KG91dCkgPDwgImlmICh0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID09IG51bGwpIjsKKyAgICAgIHNjb3BlX3VwKG91dCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAicmV0LndyaXRlKFwibnVsbFwiKTsiIDw8IGVuZGw7CisgICAgICBzY29wZV9kb3duKG91dCwgIiBlbHNlIik7CisgICAgICBzY29wZV91cChvdXQpOworICAgIH0KKworICAgIGlmIChmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJyZXQud3JpdGUoXCJCSU5BUllcIik7IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAoZmllbGQtPmdldF90eXBlKCktPmlzX2VudW0oKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIlN0cmluZyAiIDw8IGZpZWxkX25hbWUgPDwgIl9uYW1lID0gIgorICAgICAgICAgICAgICAgICAgPDwgZ2V0X3R0eXBlX2NsYXNzX25hbWUoZmllbGQtPmdldF90eXBlKCkpCisgICAgICAgICAgICAgICAgICA8PCAiLlZBTFVFU19UT19OQU1FU1t0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiXTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgZmllbGRfbmFtZSA8PCAiX25hbWUgIT0gbnVsbCkiOworICAgICAgc2NvcGVfdXAob3V0KTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJyZXQud3JpdGUoIiA8PCBmaWVsZF9uYW1lIDw8ICJfbmFtZSk7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgInJldC53cml0ZShcIiAoXCIpOyIgPDwgZW5kbDsKKyAgICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJyZXQud3JpdGUodGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIik7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IGZpZWxkX25hbWUgPDwgIl9uYW1lICE9IG51bGwpIjsKKyAgICAgIHNjb3BlX3VwKG91dCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAicmV0LndyaXRlKFwiKVwiKTsiIDw8IGVuZGw7CisgICAgICBzY29wZV9kb3duKG91dCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJyZXQud3JpdGUodGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIik7IiA8PCBlbmRsOworICAgIH0KKworICAgIGlmIChjYW5fYmVfbnVsbCkgeworICAgICAgc2NvcGVfZG93bihvdXQpOworICAgIH0KKyAgICBpZiAoY291bGRfYmVfdW5zZXQpIHsKKyAgICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICB9CisKKyAgICBvdXQgPDwgZW5kbDsKKyAgICBmaXJzdCA9IGZhbHNlOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgInJldC53cml0ZShcIilcIik7IiA8PCBlbmRsMjsKKworICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHJldC50b1N0cmluZygpOyIgPDwgZW5kbDsKKworICBzY29wZV9kb3duKG91dCwgZW5kbDIpOworfQorCisvKioKKyAqIFJldHVybnMgYSBzdHJpbmcgd2l0aCB0aGUgZGFydCByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gdGhyaWZ0IHR5cGUKKyAqIChlLmcuIGZvciB0aGUgdHlwZSBzdHJ1Y3QgaXQgcmV0dXJucyAiVFR5cGUuU1RSVUNUIikKKyAqLworc3RkOjpzdHJpbmcgdF9kYXJ0X2dlbmVyYXRvcjo6Z2V0X2RhcnRfdHlwZV9zdHJpbmcodF90eXBlKiB0eXBlKSB7CisgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLkxJU1QiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5NQVAiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5TRVQiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLlNUUlVDVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5JMzIiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHJldHVybiBnZXRfZGFydF90eXBlX3N0cmluZygoKHRfdHlwZWRlZiopdHlwZSktPmdldF90eXBlKCkpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgc3dpdGNoICgoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHJldHVybiAiVFR5cGUuVk9JRCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAiVFR5cGUuU1RSSU5HIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiVFR5cGUuQk9PTCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmV0dXJuICJUVHlwZS5CWVRFIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmV0dXJuICJUVHlwZS5JMTYiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gIlRUeXBlLkkzMiI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiVFR5cGUuSTY0IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICJUVHlwZS5ET1VCTEUiOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcigiVW5rbm93biB0aHJpZnQgdHlwZSBcIiIgKyB0eXBlLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXCIgcGFzc2VkIHRvIHRfZGFydF9nZW5lcmF0b3I6OmdldF9kYXJ0X3R5cGVfc3RyaW5nISIpOworICAgICAgYnJlYWs7IC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiEKKyAgICB9CisgIH0gZWxzZSB7CisgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKAorICAgICAgICAiVW5rbm93biB0aHJpZnQgdHlwZSBcIiIgKyB0eXBlLT5nZXRfbmFtZSgpCisgICAgICAgICsgIlwiIHBhc3NlZCB0byB0X2RhcnRfZ2VuZXJhdG9yOjpnZXRfZGFydF90eXBlX3N0cmluZyEiKTsgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIQorICB9Cit9CisKK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBmaWxlX25hbWUgPSBnZXRfZmlsZV9uYW1lKHNlcnZpY2VfbmFtZV8pOworICBzdHJpbmcgZl9zZXJ2aWNlX25hbWUgPSBzcmNfZGlyXyArICIvIiArIGZpbGVfbmFtZSArICIuZGFydCI7CisgIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKKworICBmX3NlcnZpY2VfIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGRhcnRfbGlicmFyeShmaWxlX25hbWUpIDw8IGVuZGw7CisgIGZfc2VydmljZV8gPDwgc2VydmljZV9pbXBvcnRzKCkgPDwgZGFydF90aHJpZnRfaW1wb3J0cygpIDw8IGVuZGw7CisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOworCisgIGZfc2VydmljZV8uY2xvc2UoKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGludGVyZmFjZSBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgorICovCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGV4dGVuZHNfaWZhY2UgPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzX2lmYWNlID0gIiBleHRlbmRzICIgKyBnZXRfdHR5cGVfY2xhc3NfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7CisgIH0KKworICBnZW5lcmF0ZV9kYXJ0X2RvYyhmX3NlcnZpY2VfLCB0c2VydmljZSk7CisKKyAgc3RyaW5nIGNsYXNzX25hbWUgPSBzZXJ2aWNlX25hbWVfOworICBleHBvcnRfY2xhc3NfdG9fbGlicmFyeShnZXRfZmlsZV9uYW1lKHNlcnZpY2VfbmFtZV8pLCBjbGFzc19uYW1lKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJhYnN0cmFjdCBjbGFzcyAiIDw8IGNsYXNzX25hbWUgPDwgZXh0ZW5kc19pZmFjZTsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworICAgIGdlbmVyYXRlX2RhcnRfZG9jKGZfc2VydmljZV8sICpmX2l0ZXIpOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgIjsiIDw8IGVuZGw7CisgIH0KKworICBzY29wZV9kb3duKGZfc2VydmljZV8sIGVuZGwyKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgc3RydWN0cyBmb3IgYWxsIHRoZSBzZXJ2aWNlIGFyZ3MgYW5kIHJldHVybiB0eXBlcworICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZQorICovCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBnZW5lcmF0ZV9kYXJ0X3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sIHRzLCBmYWxzZSwgZmFsc2UpOworICAgIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnMoKmZfaXRlcik7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGNsaWVudCBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCisgKi8KK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19jbGllbnQgPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gZ2V0X3R0eXBlX2NsYXNzX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgIGV4dGVuZHNfY2xpZW50ID0gIiBleHRlbmRzICIgKyBleHRlbmRzICsgIkNsaWVudCI7CisgIH0KKworICBzdHJpbmcgY2xhc3NfbmFtZSA9IHNlcnZpY2VfbmFtZV8gKyAiQ2xpZW50IjsKKyAgZXhwb3J0X2NsYXNzX3RvX2xpYnJhcnkoZ2V0X2ZpbGVfbmFtZShzZXJ2aWNlX25hbWVfKSwgY2xhc3NfbmFtZSk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiY2xhc3MgIiA8PCBjbGFzc19uYW1lIDw8IGV4dGVuZHNfY2xpZW50CisgICAgICAgICAgICAgICAgICAgICA8PCAiIGltcGxlbWVudHMgIiA8PCBzZXJ2aWNlX25hbWVfOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCBjbGFzc19uYW1lIDw8ICIoVFByb3RvY29sIGlwcm90LCBbVFByb3RvY29sIG9wcm90ID0gbnVsbF0pIjsKKworICBpZiAoIWV4dGVuZHMuZW1wdHkoKSkgeworICAgIGluZGVudF91cCgpOworICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIjogc3VwZXIoaXByb3QsIG9wcm90KTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfSBlbHNlIHsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIl9pcHJvdCA9IGlwcm90OyIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIl9vcHJvdCA9IChvcHJvdCA9PSBudWxsKSA/IGlwcm90IDogb3Byb3Q7IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIH0KKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlRQcm90b2NvbCBfaXByb3Q7IiA8PCBlbmRsMjsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlRQcm90b2NvbCBnZXQgaXByb3QgPT4gX2lwcm90OyIgPDwgZW5kbDI7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJUUHJvdG9jb2wgX29wcm90OyIgPDwgZW5kbDI7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJUUHJvdG9jb2wgZ2V0IG9wcm90ID0+IF9vcHJvdDsiIDw8IGVuZGwyOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaW50IF9zZXFpZCA9IDA7IiA8PCBlbmRsMjsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImludCBnZXQgc2VxaWQgPT4gX3NlcWlkOyIgPDwgZW5kbDI7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpbnQgbmV4dFNlcWlkKCkgPT4gKytfc2VxaWQ7IiA8PCBlbmRsMjsKKyAgfQorCisgIC8vIEdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIC8vIE9wZW4gZnVuY3Rpb24KKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8ICIgYXN5bmMiOworICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgICAgLy8gR2V0IHRoZSBzdHJ1Y3Qgb2YgZnVuY3Rpb24gY2FsbCBwYXJhbXMKKyAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKworICAgIHN0cmluZyBhcmdzbmFtZSA9IGdldF9hcmdzX2NsYXNzX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworCisgICAgLy8gU2VyaWFsaXplIHRoZSByZXF1ZXN0CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UoXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIsICIKKyAgICAgICAgICAgICAgIDw8ICgoKmZfaXRlciktPmlzX29uZXdheSgpID8gIlRNZXNzYWdlVHlwZS5PTkVXQVkiIDogIlRNZXNzYWdlVHlwZS5DQUxMIikKKyAgICAgICAgICAgICAgIDw8ICIsIG5leHRTZXFpZCgpKSk7IiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBhcmdzbmFtZSA8PCAiIGFyZ3MgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiKCk7IiA8PCBlbmRsOworCisgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICAgIHN0cmluZyBhcmdfZmllbGRfbmFtZSA9IGdldF9tZW1iZXJfbmFtZSgoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImFyZ3MuIiA8PCBhcmdfZmllbGRfbmFtZSA8PCAiID0gIgorICAgICAgICAgICAgICAgICA8PCBhcmdfZmllbGRfbmFtZSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImFyZ3Mud3JpdGUob3Byb3QpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIm9wcm90LndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDI7CisKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImF3YWl0IG9wcm90LnRyYW5zcG9ydC5mbHVzaCgpOyIgPDwgZW5kbDI7CisKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiVE1lc3NhZ2UgbXNnID0gaXByb3QucmVhZE1lc3NhZ2VCZWdpbigpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaWYgKG1zZy50eXBlID09IFRNZXNzYWdlVHlwZS5FWENFUFRJT04pIjsKKyAgICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJUQXBwbGljYXRpb25FcnJvciBlcnJvciA9IFRBcHBsaWNhdGlvbkVycm9yLnJlYWQoaXByb3QpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaXByb3QucmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInRocm93IGVycm9yOyIgPDwgZW5kbDsKKyAgICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXywgZW5kbDIpOworCisgICAgICBzdHJpbmcgcmVzdWx0X2NsYXNzID0gZ2V0X3Jlc3VsdF9jbGFzc19uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgcmVzdWx0X2NsYXNzIDw8ICIgcmVzdWx0ID0gbmV3ICIgPDwgcmVzdWx0X2NsYXNzIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJlc3VsdC5yZWFkKGlwcm90KTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImlwcm90LnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOworCisgICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KKyAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpZiAocmVzdWx0LiIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soInN1Y2Nlc3MiKSA8PCAiKSI7CisgICAgICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybiByZXN1bHQuc3VjY2VzczsiIDw8IGVuZGw7CisgICAgICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXywgZW5kbDIpOworICAgICAgfQorCisgICAgICB0X3N0cnVjdCogeHMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKKyAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgICBzdHJpbmcgcmVzdWx0X2ZpZWxkX25hbWUgPSBnZXRfbWVtYmVyX25hbWUoKCp4X2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpZiAocmVzdWx0LiIgPDwgcmVzdWx0X2ZpZWxkX25hbWUgPDwgIiAhPSBudWxsKSI7CisgICAgICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInRocm93IHJlc3VsdC4iIDw8IHJlc3VsdF9maWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsOworICAgICAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgICAgfQorCisgICAgICAvLyBJZiB5b3UgZ2V0IGhlcmUgaXQncyBhbiBleGNlcHRpb24sIHVubGVzcyBhIHZvaWQgZnVuY3Rpb24KKyAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybjsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInRocm93IG5ldyBUQXBwbGljYXRpb25FcnJvcihUQXBwbGljYXRpb25FcnJvclR5cGUuTUlTU0lOR19SRVNVTFQsIFwiIgorICAgICAgICAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZhaWxlZDogdW5rbm93biByZXN1bHRcIik7IiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKworICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXywgZW5kbDIpOworICB9CisKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfLCBlbmRsMik7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgorICovCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgLy8gR2VuZXJhdGUgdGhlIGRpc3BhdGNoIG1ldGhvZHMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgLy8gdHlwZWRlZgorICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInR5cGVkZWYgdm9pZCBQcm9jZXNzRnVuY3Rpb24oaW50IHNlcWlkLCBUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCk7IiA8PCBlbmRsMjsKKworICAvLyBFeHRlbmRzIHN0dWZmCisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX3Byb2Nlc3NvciA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSBnZXRfdHR5cGVfY2xhc3NfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7CisgICAgZXh0ZW5kc19wcm9jZXNzb3IgPSAiIGV4dGVuZHMgIiArIGV4dGVuZHMgKyAiUHJvY2Vzc29yIjsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHRoZSBoZWFkZXIgcG9ydGlvbgorICBzdHJpbmcgY2xhc3NfbmFtZSA9ICBzZXJ2aWNlX25hbWVfICsgIlByb2Nlc3NvciI7CisgIGV4cG9ydF9jbGFzc190b19saWJyYXJ5KGdldF9maWxlX25hbWUoc2VydmljZV9uYW1lXyksIGNsYXNzX25hbWUpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImNsYXNzICIgPDwgY2xhc3NfbmFtZSA8PCBleHRlbmRzX3Byb2Nlc3NvciA8PCAiIGltcGxlbWVudHMgVFByb2Nlc3NvciI7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCBjbGFzc19uYW1lIDw8ICIoIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICIgaWZhY2UpIjsKKyAgaWYgKCFleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICI6IHN1cGVyKGlmYWNlKSI7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpZmFjZV8gPSBpZmFjZTsiIDw8IGVuZGw7CisgIH0KKworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiUFJPQ0VTU19NQVBbXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgPDwgIlwiXSA9ICIgPDwgZ2V0X21lbWJlcl9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIjsiIDw8IGVuZGw7CisgIH0KKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfLCBlbmRsMik7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8IHNlcnZpY2VfbmFtZV8gPDwgIiBpZmFjZV87IiA8PCBlbmRsOworCisgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImZpbmFsIE1hcDxTdHJpbmcsIFByb2Nlc3NGdW5jdGlvbj4gUFJPQ0VTU19NQVAgPSB7fTsiIDw8IGVuZGw7CisgIH0KKworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHNlcnZlciBpbXBsZW1lbnRhdGlvbgorICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImJvb2wgcHJvY2VzcyhUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCkiOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJUTWVzc2FnZSBtc2cgPSBpcHJvdC5yZWFkTWVzc2FnZUJlZ2luKCk7IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlByb2Nlc3NGdW5jdGlvbiBmbiA9IFBST0NFU1NfTUFQW21zZy5uYW1lXTsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaWYgKGZuID09IG51bGwpIjsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBUVHlwZS5TVFJVQ1QpOyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpcHJvdC5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJUQXBwbGljYXRpb25FcnJvciB4ID0gbmV3IFRBcHBsaWNhdGlvbkVycm9yKFRBcHBsaWNhdGlvbkVycm9yVHlwZS5VTktOT1dOX01FVEhPRCwgIgorICAgICAgICAgIlwiSW52YWxpZCBtZXRob2QgbmFtZTogJ1wiK21zZy5uYW1lK1wiJ1wiKTsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKG1zZy5uYW1lLCBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OLCBtc2cuc2VxaWQpKTsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAieC53cml0ZShvcHJvdCk7IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIm9wcm90LndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJvcHJvdC50cmFuc3BvcnQuZmx1c2goKTsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIHRydWU7IiA8PCBlbmRsOworICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImZuKG1zZy5zZXFpZCwgaXByb3QsIG9wcm90KTsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIHRydWU7IiA8PCBlbmRsOworICBzY29wZV9kb3duKGZfc2VydmljZV8sIGVuZGwyKTsgLy8gcHJvY2VzcyBmdW5jdGlvbgorCisgIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzIHN1YmZ1bmN0aW9ucworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odHNlcnZpY2UsICpmX2l0ZXIpOworICB9CisKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfLCBlbmRsMik7IC8vIGNsYXNzCit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGFuZCBoZWxwZXJzIGZvciBhIGZ1bmN0aW9uLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uCisgKi8KK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICByZXR1cm47CisgIH0KKworICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sIGdldF9yZXN1bHRfY2xhc3NfbmFtZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpKTsKKyAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKKyAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOworICB9CisKKyAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgcmVzdWx0LmFwcGVuZCgqZl9pdGVyKTsKKyAgfQorCisgIGdlbmVyYXRlX2RhcnRfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgJnJlc3VsdCwgZmFsc2UsIHRydWUpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHByb2Nlc3MgZnVuY3Rpb24gZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byB3cml0ZSBhIGRpc3BhdGNoZXIgZm9yCisgKi8KK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgKHZvaWQpdHNlcnZpY2U7CisKKyAgYm9vbCBhd2FpdF9yZXN1bHQgPSAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKTsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgZ2V0X21lbWJlcl9uYW1lKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgPDwgIihpbnQgc2VxaWQsIFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KSI7CisgIGlmIChhd2FpdF9yZXN1bHQpIHsKKyAgICBmX3NlcnZpY2VfIDw8ICIgYXN5bmMiOworICB9CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgIHN0cmluZyBhcmdzbmFtZSA9IGdldF9hcmdzX2NsYXNzX25hbWUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKTsKKyAgc3RyaW5nIHJlc3VsdG5hbWUgPSBnZXRfcmVzdWx0X2NsYXNzX25hbWUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKTsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgYXJnc25hbWUgPDwgIiBhcmdzID0gbmV3ICIgPDwgYXJnc25hbWUgPDwgIigpOyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJhcmdzLnJlYWQoaXByb3QpOyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpcHJvdC5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKKworICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworCisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCByZXN1bHRuYW1lIDw8ICIgcmVzdWx0ID0gbmV3ICIgPDwgcmVzdWx0bmFtZSA8PCAiKCk7IiA8PCBlbmRsOworICB9CisKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmIHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ0cnkiOworICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICB9CisKKyAgLy8gR2VuZXJhdGUgdGhlIGZ1bmN0aW9uIGNhbGwKKyAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7CisgIGlmIChhd2FpdF9yZXN1bHQpIHsKKyAgICBmX3NlcnZpY2VfIDw8ICJyZXN1bHQuc3VjY2VzcyA9IGF3YWl0ICI7CisgIH0KKyAgZl9zZXJ2aWNlXyA8PCAiaWZhY2VfLiIgPDwgZ2V0X21lbWJlcl9uYW1lKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgPDwgIigiOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCAiYXJncy4iIDw8IGdldF9tZW1iZXJfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpOworICB9CisgIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOworCisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiB4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgeworICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICBzdHJpbmcgcmVzdWx0X2ZpZWxkX25hbWUgPSBnZXRfbWVtYmVyX25hbWUoKCp4X2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXywgIiIpOworICAgICAgZl9zZXJ2aWNlXyA8PCAiIG9uICIgPDwgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSkKKyAgICAgICAgICAgICAgPDwgIiBjYXRjaCgiIDw8IHJlc3VsdF9maWVsZF9uYW1lIDw8ICIpIjsKKyAgICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICAgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmVzdWx0LiIgPDwgcmVzdWx0X2ZpZWxkX25hbWUgPDwgIiA9ICIKKyAgICAgICAgICAgICAgICAgICA8PCByZXN1bHRfZmllbGRfbmFtZSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfLCAiICIpOworICAgIGZfc2VydmljZV8gPDwgImNhdGNoICh0aCkiOworICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiLy8gSW50ZXJuYWwgZXJyb3IiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJUQXBwbGljYXRpb25FcnJvciB4ID0gbmV3ICIKKyAgICAgICAgICAgICAgICJUQXBwbGljYXRpb25FcnJvcihUQXBwbGljYXRpb25FcnJvclR5cGUuSU5URVJOQUxfRVJST1IsIFwiSW50ZXJuYWwgZXJyb3IgcHJvY2Vzc2luZyAiCisgICAgICAgICAgICAgICA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIlwiKTsiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UoXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgPDwgIlwiLCBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OLCBzZXFpZCkpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIngud3JpdGUob3Byb3QpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIm9wcm90LndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIm9wcm90LnRyYW5zcG9ydC5mbHVzaCgpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybjsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgfQorCisgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgIDw8ICJcIiwgVE1lc3NhZ2VUeXBlLlJFUExZLCBzZXFpZCkpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJlc3VsdC53cml0ZShvcHJvdCk7IiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAib3Byb3QudHJhbnNwb3J0LmZsdXNoKCk7IiA8PCBlbmRsOworICB9CisKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfLCBlbmRsMik7Cit9CisKKy8qKgorICogRGVzZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCisgKgorICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQKKyAqIEBwYXJhbSBwcmVmaXggVGhlIHZhcmlhYmxlIG5hbWUgb3IgY29udGFpbmVyIGZvciB0aGlzIGZpZWxkCisgKi8KK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBwcmVmaXgpIHsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworICBzdHJpbmcgZmllbGRfbmFtZSA9IGdldF9tZW1iZXJfbmFtZSh0ZmllbGQtPmdldF9uYW1lKCkpOworCisgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIERFU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIHByZWZpeCArIGZpZWxkX25hbWU7CisgIH0KKworICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIGZpZWxkX25hbWU7CisKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIG5hbWUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7CisKKyAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIgPSBpcHJvdC4iOworCisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgICAgb3V0IDw8ICJyZWFkQmluYXJ5KCk7IjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgPDwgInJlYWRTdHJpbmcoKTsiOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICBvdXQgPDwgInJlYWRCb29sKCk7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICBvdXQgPDwgInJlYWRCeXRlKCk7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgb3V0IDw8ICJyZWFkSTE2KCk7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgb3V0IDw8ICJyZWFkSTMyKCk7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgb3V0IDw8ICJyZWFkSTY0KCk7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgb3V0IDw8ICJyZWFkRG91YmxlKCk7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIERhcnQgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICBvdXQgPDwgInJlYWRJMzIoKTsiOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBERVNFUklBTElaRSBGSUVMRCAnJXMnIFRZUEUgJyVzJ1xuIiwKKyAgICAgICAgICAgZmllbGRfbmFtZS5jX3N0cigpLAorICAgICAgICAgICB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYW4gdW5zZXJpYWxpemVyIGZvciBhIHN0cnVjdCwgaW52b2tlcyByZWFkKCkKKyAqLwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCkgeworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiKCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi5yZWFkKGlwcm90KTsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogRGVzZXJpYWxpemVzIGEgY29udGFpbmVyIGJ5IHJlYWRpbmcgaXRzIHNpemUgYW5kIHRoZW4gaXRlcmF0aW5nCisgKi8KK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkgeworICBpbmRlbnQob3V0KTsKKyAgc2NvcGVfdXAob3V0LCAiIik7CisKKyAgc3RyaW5nIG9iajsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgb2JqID0gdG1wKCJfbWFwIik7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgb2JqID0gdG1wKCJfc2V0Iik7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIG9iaiA9IHRtcCgiX2xpc3QiKTsKKyAgfQorCisgIC8vIERlY2xhcmUgdmFyaWFibGVzLCByZWFkIGhlYWRlcgorICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIlRNYXAgIiA8PCBvYmogPDwgIiA9IGlwcm90LnJlYWRNYXBCZWdpbigpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiVFNldCAiIDw8IG9iaiA8PCAiID0gaXByb3QucmVhZFNldEJlZ2luKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiVExpc3QgIiA8PCBvYmogPDwgIiA9IGlwcm90LnJlYWRMaXN0QmVnaW4oKTsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0dHlwZSkgPDwgIigpOyIgPDwgZW5kbDsKKworICAvLyBGb3IgbG9vcCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzCisgIHN0cmluZyBpID0gdG1wKCJfaSIpOworICBpbmRlbnQob3V0KSA8PCAiZm9yIChpbnQgIiA8PCBpIDw8ICIgPSAwOyAiIDw8IGkgPDwgIiA8ICIgPDwgb2JqIDw8ICIubGVuZ3RoIgorICAgICAgICAgICAgICA8PCAiOyAiCisgICAgICAgICAgICAgIDw8ICIrKyIgPDwgaSA8PCAiKSI7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgcHJlZml4KTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIHByZWZpeCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBwcmVmaXgpOworICB9CisKKyAgc2NvcGVfZG93bihvdXQpOworCisgIC8vIFJlYWQgY29udGFpbmVyIGVuZAorICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRNYXBFbmQoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRTZXRFbmQoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkTGlzdEVuZCgpOyIgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgY29kZSB0byBkZXNlcmlhbGl6ZSBhIG1hcAorICovCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIGtleSA9IHRtcCgiX2tleSIpOworICBzdHJpbmcgdmFsID0gdG1wKCJfdmFsIik7CisgIHRfZmllbGQgZmtleSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KTsKKyAgdF9maWVsZCBmdmFsKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2YWwpOworCisgIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZrZXkpIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZ2YWwpIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmtleSk7CisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZ2YWwpOworCisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiWyIgPDwga2V5IDw8ICJdID0gIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogRGVzZXJpYWxpemVzIGEgc2V0IGVsZW1lbnQKKyAqLwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgcHJlZml4KSB7CisgIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOworICB0X2ZpZWxkIGZlbGVtKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZmVsZW0pIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOworCisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLmFkZCgiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOworfQorCisvKioKKyAqIERlc2VyaWFsaXplcyBhIGxpc3QgZWxlbWVudAorICovCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7CisgIHRfZmllbGQgZmVsZW0odGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZmVsZW0pIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOworCisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLmFkZCgiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KKyAqCisgKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCB0byBzZXJpYWxpemUKKyAqIEBwYXJhbSBwcmVmaXggTmFtZSB0byBwcmVwZW5kIHRvIGZpZWxkIG5hbWUKKyAqLwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBwcmVmaXgpIHsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworICBzdHJpbmcgZmllbGRfbmFtZSA9IGdldF9tZW1iZXJfbmFtZSh0ZmllbGQtPmdldF9uYW1lKCkpOworCisgIC8vIERvIG5vdGhpbmcgZm9yIHZvaWQgdHlwZXMKKyAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIHByZWZpeCArIGZpZWxkX25hbWU7CisgIH0KKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIHByZWZpeCArIGZpZWxkX25hbWUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIHByZWZpeCArIGZpZWxkX25hbWUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgeworCisgICAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyBmaWVsZF9uYW1lOworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC4iOworCisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgICAgb3V0IDw8ICJ3cml0ZUJpbmFyeSgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgPDwgIndyaXRlU3RyaW5nKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICBvdXQgPDwgIndyaXRlQm9vbCgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICBvdXQgPDwgIndyaXRlQnl0ZSgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUkxNigiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUkzMigiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUk2NCgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgb3V0IDw8ICJ3cml0ZURvdWJsZSgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIERhcnQgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICBvdXQgPDwgIndyaXRlSTMyKCIgPDwgbmFtZSA8PCAiKTsiOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgRklFTEQgJyVzJXMnIFRZUEUgJyVzJ1xuIiwKKyAgICAgICAgICAgcHJlZml4LmNfc3RyKCksCisgICAgICAgICAgIGZpZWxkX25hbWUuY19zdHIoKSwKKyAgICAgICAgICAgdHlwZV9uYW1lKHR5cGUpLmNfc3RyKCkpOworICB9Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhbGwgdGhlIG1lbWJlcnMgb2YgYSBzdHJ1Y3QuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCB0byBzZXJpYWxpemUKKyAqIEBwYXJhbSBwcmVmaXggIFN0cmluZyBwcmVmaXggdG8gYXR0YWNoIHRvIGFsbCBmaWVsZHMKKyAqLwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcmVmaXgpIHsKKyAgKHZvaWQpdHN0cnVjdDsKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIud3JpdGUob3Byb3QpOyIgPDwgZW5kbDsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIGEgY29udGFpbmVyIGJ5IHdyaXRpbmcgaXRzIHNpemUgdGhlbiB0aGUgZWxlbWVudHMuCisgKgorICogQHBhcmFtIHR0eXBlICBUaGUgdHlwZSBvZiBjb250YWluZXIKKyAqIEBwYXJhbSBwcmVmaXggU3RyaW5nIHByZWZpeCBmb3IgZmllbGRzCisgKi8KK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgpIHsKKyAgaW5kZW50KG91dCk7CisgIHNjb3BlX3VwKG91dCwgIiIpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBzdHJpbmcgaXRlciA9IHRtcCgiX2tleSIpOworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZU1hcEJlZ2luKG5ldyBUTWFwKCIgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpCisgICAgICAgICAgICAgICAgPDwgIiwgIiA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwgIiA8PCBwcmVmaXggPDwgIi5sZW5ndGgpKTsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTZXRCZWdpbihuZXcgVFNldCgiIDw8IHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkKKyAgICAgICAgICAgICAgICA8PCAiLCAiIDw8IHByZWZpeCA8PCAiLmxlbmd0aCkpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlTGlzdEJlZ2luKG5ldyBUTGlzdCgiCisgICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgIiA8PCBwcmVmaXggPDwgIi5sZW5ndGgpKTsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgfQorCisgIHN0cmluZyBpdGVyID0gdG1wKCJlbGVtIik7CisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yICh2YXIgIiA8PCBpdGVyIDw8ICIgaW4gIiA8PCBwcmVmaXggPDwgIi5rZXlzKSI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpIHx8IHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yICh2YXIgIiA8PCBpdGVyIDw8ICIgaW4gIiA8PCBwcmVmaXggPDwgIikiOworICB9CisKKyAgc2NvcGVfdXAob3V0KTsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgaXRlciwgcHJlZml4KTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBpdGVyKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBpdGVyKTsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlTWFwRW5kKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZVNldEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlTGlzdEVuZCgpOyIgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbWFwLgorICovCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG1hcCkgeworICB0X2ZpZWxkIGtmaWVsZCh0bWFwLT5nZXRfa2V5X3R5cGUoKSwgaXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZrZmllbGQsICIiKTsKKyAgdF9maWVsZCB2ZmllbGQodG1hcC0+Z2V0X3ZhbF90eXBlKCksIG1hcCArICJbIiArIGl0ZXIgKyAiXSIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmdmZpZWxkLCAiIik7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIHNldC4KKyAqLwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIGl0ZXIpIHsKKyAgdF9maWVsZCBlZmllbGQodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIpOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBsaXN0LgorICovCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdHJpbmcgaXRlcikgeworICB0X2ZpZWxkIGVmaWVsZCh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIpOworfQorCisvKioKKyAqIFJldHVybnMgYSBEYXJ0IHR5cGUgbmFtZQorICoKKyAqIEBwYXJhbSB0dHlwZSBUaGUgdHlwZQorICogQHJldHVybiBEYXJ0IHR5cGUgbmFtZSwgaS5lLiBNYXA8S2V5LCBWYWx1ZT4KKyAqLworc3RyaW5nIHRfZGFydF9nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlKSB7CisgIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7CisKKyAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHJldHVybiBiYXNlX3R5cGVfbmFtZSgodF9iYXNlX3R5cGUqKXR0eXBlKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJpbnQiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHRfbWFwKiB0bWFwID0gKHRfbWFwKil0dHlwZTsKKyAgICByZXR1cm4gIk1hcDwiICsgdHlwZV9uYW1lKHRtYXAtPmdldF9rZXlfdHlwZSgpKSArICIsICIKKyAgICAgICAgICAgICAgICAgICsgdHlwZV9uYW1lKHRtYXAtPmdldF92YWxfdHlwZSgpKSArICI+IjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3NldCogdHNldCA9ICh0X3NldCopdHR5cGU7CisgICAgcmV0dXJuICJTZXQ8IiArIHR5cGVfbmFtZSh0c2V0LT5nZXRfZWxlbV90eXBlKCkpICsgIj4iOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICB0X2xpc3QqIHRsaXN0ID0gKHRfbGlzdCopdHR5cGU7CisgICAgcmV0dXJuICJMaXN0PCIgKyB0eXBlX25hbWUodGxpc3QtPmdldF9lbGVtX3R5cGUoKSkgKyAiPiI7CisgIH0KKworICByZXR1cm4gZ2V0X3R0eXBlX2NsYXNzX25hbWUodHR5cGUpOworfQorCisvKioKKyAqIFJldHVybnMgdGhlIERhcnQgdHlwZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSB0aHJpZnQgdHlwZS4KKyAqCisgKiBAcGFyYW0gdGJhc2UgVGhlIGJhc2UgdHlwZQorICovCitzdHJpbmcgdF9kYXJ0X2dlbmVyYXRvcjo6YmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGUqIHR5cGUpIHsKKyAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9IHR5cGUtPmdldF9iYXNlKCk7CisKKyAgc3dpdGNoICh0YmFzZSkgeworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgcmV0dXJuICJ2b2lkIjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICByZXR1cm4gIlVpbnQ4TGlzdCI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAiU3RyaW5nIjsKKyAgICB9CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICByZXR1cm4gImJvb2wiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgIHJldHVybiAiaW50IjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgcmV0dXJuICJkb3VibGUiOworICBkZWZhdWx0OgorICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gRGFydCBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgIH0KK30KKworLyoqCisgKiBEZWNsYXJlcyBhIGZpZWxkLCB3aGljaCBtYXkgaW5jbHVkZSBpbml0aWFsaXphdGlvbiBhcyBuZWNlc3NhcnkuCisgKgorICogQHBhcmFtIHR0eXBlIFRoZSB0eXBlCisgKi8KK3N0cmluZyB0X2RhcnRfZ2VuZXJhdG9yOjpkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0KSB7CisgIHN0cmluZyBmaWVsZF9uYW1lID0gZ2V0X21lbWJlcl9uYW1lKHRmaWVsZC0+Z2V0X25hbWUoKSk7CisgIHN0cmluZyByZXN1bHQgPSB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpKSArICIgIiArIGZpZWxkX25hbWU7CisgIGlmIChpbml0KSB7CisgICAgdF90eXBlKiB0dHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmIHRmaWVsZC0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgeworICAgICAgc3RkOjogb2ZzdHJlYW0gZHVtbXk7CisgICAgICByZXN1bHQgKz0gIiA9ICIgKyByZW5kZXJfY29uc3RfdmFsdWUoZHVtbXksIGZpZWxkX25hbWUsIHR0eXBlLCB0ZmllbGQtPmdldF92YWx1ZSgpKTsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIHJlc3VsdCArPSAiID0gbnVsbCI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICByZXN1bHQgKz0gIiA9IGZhbHNlIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICByZXN1bHQgKz0gIiA9IDAiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICByZXN1bHQgKz0gIiA9IDAuMCI7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7CisgICAgICByZXN1bHQgKz0gIiA9IDAiOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgICByZXN1bHQgKz0gIiA9IG5ldyAiICsgdHlwZV9uYW1lKHR0eXBlKSArICIoKSI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdCArPSAiID0gbmV3ICIgKyB0eXBlX25hbWUodHR5cGUpICsgIigpIjsKKyAgICAgIDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlc3VsdCArICI7IjsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd0eXBlIG5hbWUoYXJncyknCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCisgKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCisgKi8KK3N0cmluZyB0X2RhcnRfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIHN0ZDo6c3RyaW5nIGFyZ3VtZW50cyA9IGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKTsKKworICBzdGQ6OnN0cmluZyByZXR1cm50eXBlOworICBpZiAodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICByZXR1cm50eXBlID0gIkZ1dHVyZSI7CisgIH0gZWxzZSB7CisgICAgcmV0dXJudHlwZSA9ICJGdXR1cmU8IiArIHR5cGVfbmFtZSh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpICsgIj4iOworICB9CisKKyAgc3RkOjpzdHJpbmcgcmVzdWx0ID0gcmV0dXJudHlwZSArICIgIiArIGdldF9tZW1iZXJfbmFtZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpICsKKyAgICAgICAgICAgICAgICAgICAgICAgIigiICsgYXJndW1lbnRzICsgIikiOworICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIFJlbmRlcnMgYSBjb21tYSBzZXBhcmF0ZWQgZmllbGQgbGlzdCwgd2l0aCB0eXBlIG5hbWVzCisgKi8KK3N0cmluZyB0X2RhcnRfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ICs9ICIsICI7CisgICAgfQorICAgIHN0cmluZyBmaWVsZF9uYW1lID0gZ2V0X21lbWJlcl9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgcmVzdWx0ICs9IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF90eXBlKCkpICsgIiAiICsgZmllbGRfbmFtZTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgQysrIGVudW0gc3RyaW5nIGZvciB0aGUgZ2l2ZW4gdHlwZS4KKyAqLworc3RyaW5nIHRfZGFydF9nZW5lcmF0b3I6OnR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gIlRUeXBlLlNUUklORyI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICJUVHlwZS5CT09MIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmV0dXJuICJUVHlwZS5CWVRFIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAiVFR5cGUuSTE2IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAiVFR5cGUuSTMyIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiVFR5cGUuSTY0IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiVFR5cGUuRE9VQkxFIjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5JMzIiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLlNUUlVDVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLk1BUCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLlNFVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5MSVNUIjsKKyAgfQorCisgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKworc3RkOjpzdHJpbmcgdF9kYXJ0X2dlbmVyYXRvcjo6aW5pdF92YWx1ZSh0X2ZpZWxkKiBmaWVsZCkgeworICAvLyBEbyBub3QgaW5pdGlhbGl6ZSBvcHRpb25hbCBmaWVsZHMKKyAgaWYgKGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTCkgeworICAgIHJldHVybiAiIjsKKyAgfQorCisgIHRfdHlwZSogdHR5cGUgPSBmaWVsZC0+Z2V0X3R5cGUoKTsKKworICAvLyBHZXQgdGhlIGFjdHVhbCB0eXBlIGZvciBhIHR5cGVkZWYKKyAgaWYgKHR0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICB0dHlwZSA9ICgodF90eXBlZGVmKil0dHlwZSktPmdldF90eXBlKCk7CisgIH0KKworICAvLyBPbmx5IGNvbnNpZGVyIGJhc2UgdHlwZXMgZm9yIGRlZmF1bHQgaW5pdGlhbGl6YXRpb24KKyAgaWYgKCF0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICByZXR1cm4gIiI7CisgIH0KKyAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKTsKKworICAvLyBJbml0aWFsaXplIGJvb2xzLCBpbnRzLCBhbmQgZG91YmxlcyB3aXRoIHNhbmUgZGVmYXVsdHMKKyAgc3RyaW5nIHJlc3VsdDsKKyAgc3dpdGNoICh0YmFzZSkgeworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgcmVzdWx0ID0gIiA9IGZhbHNlIjsKKyAgICBicmVhazsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICByZXN1bHQgPSAiID0gMCI7CisgICAgYnJlYWs7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgIHJlc3VsdCA9ICIgPSAwLjAiOworICAgIGJyZWFrOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgIHJlc3VsdCA9ICIiOworICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RkOjpzdHJpbmcgdF9kYXJ0X2dlbmVyYXRvcjo6Z2V0X2NhcF9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpIHsKKyAgbmFtZVswXSA9IHRvdXBwZXIobmFtZVswXSk7CisgIHJldHVybiBuYW1lOworfQorCitzdGQ6OnN0cmluZyB0X2RhcnRfZ2VuZXJhdG9yOjpnZXRfbWVtYmVyX25hbWUoc3RkOjpzdHJpbmcgbmFtZSkgeworICBuYW1lWzBdID0gdG9sb3dlcihuYW1lWzBdKTsKKyAgcmV0dXJuIG5hbWU7Cit9CisKK3N0ZDo6c3RyaW5nIHRfZGFydF9nZW5lcmF0b3I6OmdldF9hcmdzX2NsYXNzX25hbWUoc3RkOjpzdHJpbmcgbmFtZSkgeworICByZXR1cm4gbmFtZSArICJfYXJncyI7Cit9CisKK3N0ZDo6c3RyaW5nIHRfZGFydF9nZW5lcmF0b3I6OmdldF9yZXN1bHRfY2xhc3NfbmFtZShzdGQ6OnN0cmluZyBuYW1lKSB7CisgIHJldHVybiBuYW1lICsgIl9yZXN1bHQiOworfQorCitzdGQ6OnN0cmluZyB0X2RhcnRfZ2VuZXJhdG9yOjpnZXRfZmlsZV9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpIHsKKyAgLy8gZS5nLiBjaGFuZ2UgQVBJRm9yRmlsZUlPIHRvIGFwaV9mb3JfZmlsZV9pbworCisgIHN0cmluZyByZXQ7CisgIGNvbnN0IGNoYXIqIHRtcCA9IG5hbWUuY19zdHIoKTsKKyAgYm9vbCBpc19wcmV2X2xjID0gdHJ1ZTsKKyAgYm9vbCBpc19jdXJyZW50X2xjID0gdG1wWzBdID09IHRvbG93ZXIodG1wWzBdKTsKKyAgYm9vbCBpc19uZXh0X2xjID0gZmFsc2U7CisKKyAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBuYW1lLmxlbmd0aCgpOyBpKyspIHsKKyAgICBjaGFyIGxjID0gdG9sb3dlcih0bXBbaV0pOworCisgICAgaWYgKGkgPT0gbmFtZS5sZW5ndGgoKSAtIDEpIHsKKyAgICAgIGlzX25leHRfbGMgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgaXNfbmV4dF9sYyA9ICh0bXBbaSsxXSA9PSB0b2xvd2VyKHRtcFtpKzFdKSk7CisgICAgfQorCisgICAgaWYgKGkgIT0gMCAmJiAhaXNfY3VycmVudF9sYyAmJiAoaXNfcHJldl9sYyB8fCBpc19uZXh0X2xjKSkgeworICAgICAgcmV0ICs9ICJfIjsKKyAgICB9CisgICAgcmV0ICs9IGxjOworCisgICAgaXNfcHJldl9sYyA9IGlzX2N1cnJlbnRfbGM7CisgICAgaXNfY3VycmVudF9sYyA9IGlzX25leHRfbGM7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdGQ6OnN0cmluZyB0X2RhcnRfZ2VuZXJhdG9yOjpnZXRfY29uc3RhbnRzX2NsYXNzX25hbWUoc3RkOjpzdHJpbmcgbmFtZSkgeworICAvLyBlLmcuIGNoYW5nZSBteV9ncmVhdF9tb2RlbCB0byBNeUdyZWF0TW9kZWxDb25zdGFudHMKKyAgc3RyaW5nIHJldDsKKyAgY29uc3QgY2hhciogdG1wID0gbmFtZS5jX3N0cigpOworICBib29sIGlzX3ByZXZfdW5kZXJzY29yZSA9IHRydWU7CisKKyAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBuYW1lLmxlbmd0aCgpOyBpKyspIHsKKyAgICBpZiAodG1wW2ldID09ICdfJykgeworICAgICAgaXNfcHJldl91bmRlcnNjb3JlID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKGlzX3ByZXZfdW5kZXJzY29yZSkgeworICAgICAgICByZXQgKz0gdG91cHBlcih0bXBbaV0pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0ICs9IHRtcFtpXTsKKyAgICAgIH0KKworICAgICAgaXNfcHJldl91bmRlcnNjb3JlID0gZmFsc2U7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHJldCArICJDb25zdGFudHMiOworfQorCitzdHJpbmcgdF9kYXJ0X2dlbmVyYXRvcjo6Y29uc3RhbnRfbmFtZShzdHJpbmcgbmFtZSkgeworICBzdHJpbmcgY29uc3RhbnRfbmFtZTsKKworICBib29sIGlzX2ZpcnN0ID0gdHJ1ZTsKKyAgYm9vbCB3YXNfcHJldmlvdXNfY2hhcl91cHBlciA9IGZhbHNlOworICBmb3IgKHN0cmluZzo6aXRlcmF0b3IgaXRlciA9IG5hbWUuYmVnaW4oKTsgaXRlciAhPSBuYW1lLmVuZCgpOyArK2l0ZXIpIHsKKyAgICBzdHJpbmc6OnZhbHVlX3R5cGUgY2hhcmFjdGVyID0gKCppdGVyKTsKKworICAgIGJvb2wgaXNfdXBwZXIgPSBpc3VwcGVyKGNoYXJhY3Rlcik7CisKKyAgICBpZiAoaXNfdXBwZXIgJiYgIWlzX2ZpcnN0ICYmICF3YXNfcHJldmlvdXNfY2hhcl91cHBlcikgeworICAgICAgY29uc3RhbnRfbmFtZSArPSAnXyc7CisgICAgfQorICAgIGNvbnN0YW50X25hbWUgKz0gdG91cHBlcihjaGFyYWN0ZXIpOworCisgICAgaXNfZmlyc3QgPSBmYWxzZTsKKyAgICB3YXNfcHJldmlvdXNfY2hhcl91cHBlciA9IGlzX3VwcGVyOworICB9CisKKyAgcmV0dXJuIGNvbnN0YW50X25hbWU7Cit9CisKKy8qKgorICogRW1pdHMgYSBkb2MgY29tbWVudCBpZiB0aGUgcHJvdmlkZWQgb2JqZWN0IGhhcyBhIGRvYyBpbiBUaHJpZnQKKyAqLwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kYXJ0X2RvYyhvc3RyZWFtJiBvdXQsIHRfZG9jKiB0ZG9jKSB7CisgIGlmICh0ZG9jLT5oYXNfZG9jKCkpIHsKKyAgICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvdXQsICIiLCAiLy8vICIsIHRkb2MtPmdldF9kb2MoKSwgIiIpOworICB9Cit9CisKKy8qKgorICogRW1pdHMgYSBkb2MgY29tbWVudCBpZiB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gb2JqZWN0IGhhcyBhIGRvYyBpbiBUaHJpZnQKKyAqLwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kYXJ0X2RvYyhvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICBpZiAodGZ1bmN0aW9uLT5oYXNfZG9jKCkpIHsKKyAgICBzdHJpbmdzdHJlYW0gc3M7CisgICAgc3MgPDwgdGZ1bmN0aW9uLT5nZXRfZG9jKCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHBfaXRlcjsKKyAgICBmb3IgKHBfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBwX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK3BfaXRlcikgeworICAgICAgdF9maWVsZCogcCA9ICpwX2l0ZXI7CisgICAgICBzdHJpbmcgZmllbGRfbmFtZSA9IGdldF9tZW1iZXJfbmFtZShwLT5nZXRfbmFtZSgpKTsKKyAgICAgIHNzIDw8ICJcbkBwYXJhbSAiIDw8IGZpZWxkX25hbWU7CisgICAgICBpZiAocC0+aGFzX2RvYygpKSB7CisgICAgICAgIHNzIDw8ICIgIiA8PCBwLT5nZXRfZG9jKCk7CisgICAgICB9CisgICAgfQorICAgIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KG91dCwgIiIsICIvLy8gIiwgc3Muc3RyKCksICIiKTsKKyAgfQorfQorCitzdGQ6OnN0cmluZyB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9pc3NldF9jaGVjayh0X2ZpZWxkKiBmaWVsZCkgeworICBzdHJpbmcgZmllbGRfbmFtZSA9IGdldF9tZW1iZXJfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSk7CisgIHJldHVybiBnZW5lcmF0ZV9pc3NldF9jaGVjayhmaWVsZF9uYW1lKTsKK30KKworc3RkOjpzdHJpbmcgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfaXNzZXRfY2hlY2soc3RkOjpzdHJpbmcgZmllbGRfbmFtZSkgeworICByZXR1cm4gImlzIiArIGdldF9jYXBfbmFtZSgic2V0IikgKyBnZXRfY2FwX25hbWUoZmllbGRfbmFtZSkgKyAiKCkiOworfQorCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX2lzc2V0X3NldChvc3RyZWFtJiBvdXQsIHRfZmllbGQqIGZpZWxkKSB7CisgIGlmICghdHlwZV9jYW5fYmVfbnVsbChmaWVsZC0+Z2V0X3R5cGUoKSkpIHsKKyAgICBzdHJpbmcgZmllbGRfbmFtZSA9IGdldF9tZW1iZXJfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSk7CisgICAgaW5kZW50KG91dCkgPDwgInRoaXMuX19pc3NldF8iIDw8IGZpZWxkX25hbWUgPDwgIiA9IHRydWU7IiA8PCBlbmRsOworICB9Cit9CisKK3N0ZDo6c3RyaW5nIHRfZGFydF9nZW5lcmF0b3I6OmdldF90dHlwZV9jbGFzc19uYW1lKHRfdHlwZSogdHR5cGUpIHsKKyAgaWYgKHByb2dyYW1fID09IHR0eXBlLT5nZXRfcHJvZ3JhbSgpKSB7CisgICAgcmV0dXJuIHR0eXBlLT5nZXRfbmFtZSgpOworICB9IGVsc2UgeworICAgIHN0cmluZyBuYW1lZF9pbXBvcnQgPSAidF8iICsgZmluZF9saWJyYXJ5X25hbWUodHR5cGUtPmdldF9wcm9ncmFtKCkpOworICAgIHJldHVybiBuYW1lZF9pbXBvcnQgKyAiLiIgKyB0dHlwZS0+Z2V0X25hbWUoKTsKKyAgfQorfQorCitUSFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKAorICAgIGRhcnQsCisgICAgIkRhcnQiLAorICAgICIgICAgbGlicmFyeV9uYW1lOiAgICBPcHRpb25hbCBvdmVycmlkZSBmb3IgbGlicmFyeSBuYW1lLlxuIgorICAgICIgICAgbGlicmFyeV9wcmVmaXg6ICBHZW5lcmF0ZSBjb2RlIHRoYXQgY2FuIGJlIHVzZWQgd2l0aGluIGFuIGV4aXN0aW5nIGxpYnJhcnkuXG4iCisgICAgIiAgICAgICAgICAgICAgICAgICAgIFVzZSBhIGRvdC1zZXBhcmF0ZWQgc3RyaW5nLCBlLmcuIFwibXlfcGFyZW50X2xpYi5zcmMuZ2VuXCJcbiIKKyAgICAiICAgIHB1YnNwZWNfbGliOiAgICAgT3B0aW9uYWwgb3ZlcnJpZGUgZm9yIHRocmlmdCBsaWIgZGVwZW5kZW5jeSBpbiBwdWJzcGVjLnlhbWwsXG4iCisgICAgIiAgICAgICAgICAgICAgICAgICAgIGUuZy4gXCJ0aHJpZnQ6IDAueC54XCIuICBVc2UgYSBwaXBlIGRlbGltaXRlciB0byBzZXBhcmF0ZSBsaW5lcyxcbiIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgZS5nLiBcInRocmlmdDp8ICBnaXQ6fCAgICB1cmw6IGdpdEBmb28uY29tXCJcbiIKKykKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZGVscGhpX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZGVscGhpX2dlbmVyYXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmQ3N2U4Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9kZWxwaGlfZ2VuZXJhdG9yLmNjCkBAIC0wLDAgKzEsNDAxMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgorICogUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKKyAqIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGNhc3NlcnQ+CisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8bGlzdD4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxjY3R5cGU+CisKKyNpbmNsdWRlICJ0aHJpZnQvcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9vb3BfZ2VuZXJhdG9yLmgiCisKK3VzaW5nIHN0ZDo6bWFwOwordXNpbmcgc3RkOjpvZnN0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnZlY3RvcjsKKworc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsID0gIlxuIjsgLy8gYXZvaWQgb3N0cmVhbSA8PCBzdGQ6OmVuZGwgZmx1c2hlcworCitjbGFzcyB0X2RlbHBoaV9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgdF9kZWxwaGlfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCisgICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkgeworICAgICh2b2lkKW9wdGlvbl9zdHJpbmc7CisgICAgaW5kZW50X2ltcGxfID0gMDsKKyAgICBoYXNfZm9yd2FyZCA9IGZhbHNlOworICAgIGhhc19lbnVtID0gZmFsc2U7CisgICAgaGFzX2NvbnN0ID0gZmFsc2U7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKworICAgIGFuc2lzdHJfYmluYXJ5XyA9IGZhbHNlOworICAgIHJlZ2lzdGVyX3R5cGVzXyA9IGZhbHNlOworICAgIGNvbnN0cHJlZml4XyA9IGZhbHNlOworICAgIGV2ZW50c18gPSBmYWxzZTsKKyAgICB4bWxkb2NfID0gZmFsc2U7CisgICAgYXN5bmNfID0gZmFsc2U7CisgICAgZm9yKCBpdGVyID0gcGFyc2VkX29wdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKTsgKytpdGVyKSB7CisgICAgICBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgiYW5zaXN0cl9iaW5hcnkiKSA9PSAwKSB7CisgICAgICAgIGFuc2lzdHJfYmluYXJ5XyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoInJlZ2lzdGVyX3R5cGVzIikgPT0gMCkgeworICAgICAgICByZWdpc3Rlcl90eXBlc18gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJjb25zdHByZWZpeCIpID09IDApIHsKKyAgICAgICAgY29uc3RwcmVmaXhfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgiZXZlbnRzIikgPT0gMCkgeworICAgICAgICBldmVudHNfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgieG1sZG9jIikgPT0gMCkgeworICAgICAgICB4bWxkb2NfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgiYXN5bmMiKSA9PSAwKSB7CisgICAgICAgIGFzeW5jXyA9IHRydWU7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24gZGVscGhpOiIgKyBpdGVyLT5maXJzdDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1kZWxwaGkiOworICAgIGVzY2FwZV8uY2xlYXIoKTsKKyAgICBlc2NhcGVfWydcJyddID0gIicnIjsKKyAgfQorCisgIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKKyAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKKworICB2b2lkIGdlbmVyYXRlX2NvbnN0cyhzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKTsKKworICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZik7CisgIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKTsKKyAgdm9pZCBnZW5lcmF0ZV9mb3J3YXJkX2RlY2xhcmF0aW9uKHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfcHJvcGVydHkob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaXNQdWJsaWMsIGJvb2wgaXNfeGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX3Byb3BlcnR5X3dyaXRlcl8ob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaXNQdWJsaWMpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVscGhpX3Byb3BlcnR5KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdHJ1Y3RfaXNfZXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNQdWJsaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkUHJlZml4ID0gIiIpOworICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9pc3NldF9yZWFkZXJfZGVmaW5pdGlvbihvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpc194Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfZGVscGhpX3Byb3BlcnR5X3JlYWRlcl9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uX2NsYXNzKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfcHJvcGVydHlfd3JpdGVyX2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb25fY2xhc3MpOworICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9wcm9wZXJ0eV9yZWFkZXJfaW1wbChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNsc19wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBmaWVsZFByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbl9jbGFzcyk7CisgIHZvaWQgZ2VuZXJhdGVfZGVscGhpX3Byb3BlcnR5X3dyaXRlcl9pbXBsKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2xzX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkUHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uX2NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3VuaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uX2ZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHhjZXB0aW9uX2ZhY3RvcnlfbmFtZSk7CisgIHZvaWQgZ2VuZXJhdGVfZGVscGhpX2NsZWFyX3VuaW9uX3ZhbHVlKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2xzX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkUHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uX2NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3VuaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uX2ZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHhjZXB0aW9uX2ZhY3RvcnlfbmFtZSk7CisgIHZvaWQgZ2VuZXJhdGVfZGVscGhpX2lzc2V0X3JlYWRlcl9pbXBsKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2xzX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkUHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X3dyaXRlcl9pbXBsKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNsc19wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X3Jlc3VsdF93cml0ZXJfaW1wbChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2xzX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X3Rvc3RyaW5nX2ltcGwob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjbHNfcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeF9mYWN0b3J5KTsKKworICB2b2lkIGFkZF9kZWxwaGlfdXNlc19saXN0KHN0cmluZyB1bml0bmFtZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X3JlYWRlcl9pbXBsKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNsc19wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfY3JlYXRlX2V4Y2VwdGlvbl9pbXBsKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjbHNfcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbik7CisKKyAgYm9vbCBjb25zdF9uZWVkc192YXIodF90eXBlKiB0eXBlKTsKKyAgdm9pZCBwcmludF9jb25zdF9wcm9wKHN0ZDo6b3N0cmVhbSYgb3V0LCBzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisgIHZvaWQgcHJpbnRfcHJpdmF0ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwgc3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOworICB2b2lkIHByaW50X2NvbnN0X3ZhbHVlKHN0ZDo6b3N0cmVhbSYgdmFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisgIHZvaWQgaW5pdGlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIHZhcnMsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisgIHZvaWQgZmluYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2xzX25tID0gIiIpOworICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUoc3RkOjpvc3RyZWFtJiBsb2NhbF92YXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpOworICB2b2lkIHByaW50X2NvbnN0X2RlZl92YWx1ZShzdGQ6Om9zdHJlYW0mIHZhcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjbHNfbm0gPSAiIik7CisgIHN0ZDo6c3RyaW5nIG1ha2VfY29uc3RhbnRzX2NsYXNzbmFtZSgpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfaW1wbChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNsc19wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194X2ZhY3RvcnkgPSBmYWxzZSk7CisgIHZvaWQgcHJpbnRfZGVscGhpX3N0cnVjdF90eXBlX2ZhY3RvcnlfZnVuYyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X3R5cGVfZmFjdG9yeShvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2xzX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeF9mYWN0b3J5ID0gZmFsc2UpOworICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfdHlwZV9mYWN0b3J5X3JlZ2lzdHJhdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNsc19wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194X2ZhY3RvcnkgPSBmYWxzZSk7CisgIHZvaWQgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF9kZWZpbml0aW9uKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2NsYXNzID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0ID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeF9mYWN0b3J5ID0gZmFsc2UpOworICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfcmVhZGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF9yZXN1bHRfd3JpdGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF93cml0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X3Rvc3RyaW5nKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSwgYm9vbCBmb3JfYXN5bmMpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIGZ1bmN0aW9uKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9zdHJlYW0mIGxvY2FsX3ZhcnMpOworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCk7CisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6b3N0cmVhbSYgbG9jYWxfdmFycyk7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0c2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9zdHJlYW0mIGxvY2FsX3ZhcnMpOworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6b3N0cmVhbSYgbG9jYWxfdmFycyk7CisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvc3RyZWFtJiBsb2NhbF92YXJzKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6b3N0cmVhbSYgbG9jYWxfdmFycyk7CisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvc3RyZWFtJiBsb2NhbF92YXJzKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9zdHJlYW0mIGxvY2FsX3ZhcnMpOworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGl0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvc3RyZWFtJiBsb2NhbF92YXJzKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9zdHJlYW0mIGxvY2FsX3ZhcnMpOworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGl0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9zdHJlYW0mIGxvY2FsX3ZhcnMpOworCisgIHZvaWQgZGVscGhpX3R5cGVfdXNpbmdzKHN0ZDo6b3N0cmVhbSYgb3V0KTsKKyAgc3RkOjpzdHJpbmcgZGVscGhpX3RocmlmdF91c2luZ3MoKTsKKworICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYl9jbHMgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYl9ub19wb3N0Zml4ID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJfZXhjZXB0aW9uX2ZhY3RvcnkgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYl9mdWxsX2V4Y2VwdGlvbl9mYWN0b3J5ID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBub3JtYWxpemVfY2xzbm0oc3RkOjpzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYl9ub19jaGVja19rZXl3b3JkID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBtYWtlX3ZhbGlkX2RlbHBoaV9pZGVudGlmaWVyKHN0ZDo6c3RyaW5nIGNvbnN0JiBmcm9tTmFtZSk7CisgIHN0ZDo6c3RyaW5nIGlucHV0X2FyZ19wcmVmaXgodF90eXBlKiB0dHlwZSk7CisKKyAgc3RkOjpzdHJpbmcgYmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGUqIHRiYXNlKTsKKyAgc3RkOjpzdHJpbmcgZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbml0ID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbl9jbGFzcyA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yX2FzeW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZnVsbF9jbHMgPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24gPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICBzdGQ6OnN0cmluZyBjb25zdHJ1Y3Rvcl9hcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBjdXJyZW50X2luZGVudCk7CisgIHN0ZDo6c3RyaW5nIHR5cGVfdG9fZW51bSh0X3R5cGUqIHR0eXBlKTsKKyAgc3RkOjpzdHJpbmcgcHJvcF9uYW1lKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpc194Y2VwdGlvbiA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgcHJvcF9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUsIGJvb2wgaXNfeGNlcHRpb24gPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIGNvbnN0cnVjdG9yX3BhcmFtX25hbWUoc3RyaW5nIG5hbWUpOworCisgIHZvaWQgd3JpdGVfZW51bShzdGQ6OnN0cmluZyBsaW5lKTsKKyAgdm9pZCB3cml0ZV9mb3J3YXJkX2RlY3Ioc3RkOjpzdHJpbmcgbGluZSk7CisgIHZvaWQgd3JpdGVfY29uc3Qoc3RkOjpzdHJpbmcgbGluZSk7CisgIHZvaWQgd3JpdGVfc3RydWN0KHN0ZDo6c3RyaW5nIGxpbmUpOworICB2b2lkIHdyaXRlX3NlcnZpY2Uoc3RkOjpzdHJpbmcgbGluZSk7CisKKyAgdmlydHVhbCBzdGQ6OnN0cmluZyBhdXRvZ2VuX2NvbW1lbnQoKSB7CisgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCIoKipcbiIpICsgIiAqIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgiICsgVEhSSUZUX1ZFUlNJT04gKyAiKVxuIgorICAgICAgICAgICArICIgKlxuIiArICIgKiBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HXG4iCisgICAgICAgICAgICsgIiAqKVxuIjsKKyAgfQorCisgIHN0cmluZyByZXBsYWNlX2FsbChzdHJpbmcgY29udGVudHMsIHN0cmluZyBzZWFyY2gsIHN0cmluZyByZXBsYWNlKTsKKyAgc3RyaW5nIHhtbF9lbmNvZGUoc3RyaW5nIGNvbnRlbnRzKTsKKyAgc3RyaW5nIHhtbGRvY19lbmNvZGUoc3RyaW5nIGNvbnRlbnRzKTsKKyAgc3RyaW5nIHhtbGF0dHJpYl9lbmNvZGUoc3RyaW5nIGNvbnRlbnRzKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfZG9jKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiBmaWVsZCk7CisgIHZvaWQgZ2VuZXJhdGVfZGVscGhpX2RvYyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpOworICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9kb2Moc3RkOjpvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRkb2MpOworICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9kb2NzdHJpbmdfY29tbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgc3RyaW5nIGNvbnRlbnRzKTsKKworICBib29sIHR5cGVfY2FuX2JlX251bGwodF90eXBlKiB0dHlwZSkgeworICAgIHdoaWxlICh0dHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgICB0dHlwZSA9ICgodF90eXBlZGVmKil0dHlwZSktPmdldF90eXBlKCk7CisgICAgfQorCisgICAgcmV0dXJuIHR0eXBlLT5pc19jb250YWluZXIoKSB8fCB0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCk7CisgIH0KKworcHJpdmF0ZToKKyAgc3RkOjpzdHJpbmcgbmFtZXNwYWNlX25hbWVfOworICBzdGQ6Om9zdHJpbmdzdHJlYW0gc19mb3J3YXJkX2RlY3I7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzX2VudW07CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzX2NvbnN0OworICBzdGQ6Om9zdHJpbmdzdHJlYW0gc19zdHJ1Y3Q7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzX3NlcnZpY2U7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzX2NvbnN0X2ltcGw7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzX3N0cnVjdF9pbXBsOworICBzdGQ6Om9zdHJpbmdzdHJlYW0gc19zZXJ2aWNlX2ltcGw7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzX3R5cGVfZmFjdG9yeV9yZWdpc3RyYXRpb247CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzX3R5cGVfZmFjdG9yeV9mdW5jczsKKyAgYm9vbCBoYXNfZm9yd2FyZDsKKyAgYm9vbCBoYXNfZW51bTsKKyAgYm9vbCBoYXNfY29uc3Q7CisgIHN0ZDo6c3RyaW5nIG5hbWVzcGFjZV9kaXJfOworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBkZWxwaGlfa2V5d29yZHM7CisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IGRlbHBoaV9yZXNlcnZlZF9tZXRob2Q7CisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uOworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiB0eXBlc19rbm93bjsKKyAgc3RkOjpsaXN0PHRfdHlwZWRlZio+IHR5cGVkZWZzX3BlbmRpbmc7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiB1c2VzX2xpc3Q7CisgIHZvaWQgY3JlYXRlX2tleXdvcmRzKCk7CisgIGJvb2wgZmluZF9rZXl3b3JkKHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+JiBrZXl3b3JkX21hcCwgc3RkOjpzdHJpbmcgbmFtZSk7CisgIHN0ZDo6c3RyaW5nIG5vcm1hbGl6ZV9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYl9tZXRob2QgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiX2V4Y2VwdGlvbl9tZXRob2QgPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIGVtcHR5X3ZhbHVlKHRfdHlwZSogdHlwZSk7CisgIGJvb2wgaXNfZnVsbHlfZGVmaW5lZF90eXBlKHRfdHlwZSogdHR5cGUpOworICB2b2lkIGFkZF9kZWZpbmVkX3R5cGUodF90eXBlKiB0dHlwZSk7CisgIHZvaWQgaW5pdF9rbm93bl90eXBlc19saXN0KCk7CisgIGJvb2wgaXNfdm9pZCh0X3R5cGUqIHR5cGUpOworICBpbnQgaW5kZW50X2ltcGxfOworICBib29sIGFuc2lzdHJfYmluYXJ5XzsKKyAgYm9vbCByZWdpc3Rlcl90eXBlc187CisgIGJvb2wgY29uc3RwcmVmaXhfOworICBib29sIGV2ZW50c187CisgIGJvb2wgeG1sZG9jXzsKKyAgYm9vbCBhc3luY187CisgIHZvaWQgaW5kZW50X3VwX2ltcGwoKSB7ICsraW5kZW50X2ltcGxfOyB9OworICB2b2lkIGluZGVudF9kb3duX2ltcGwoKSB7IC0taW5kZW50X2ltcGxfOyB9OworICBzdGQ6OnN0cmluZyBpbmRlbnRfaW1wbCgpIHsKKyAgICBzdGQ6OnN0cmluZyBpbmQgPSAiIjsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgaW5kZW50X2ltcGxfOyArK2kpIHsKKyAgICAgIGluZCArPSAiICAiOworICAgIH0KKyAgICByZXR1cm4gaW5kOworICB9OworICBzdGQ6Om9zdHJlYW0mIGluZGVudF9pbXBsKHN0ZDo6b3N0cmVhbSYgb3MpIHsgcmV0dXJuIG9zIDw8IGluZGVudF9pbXBsKCk7IH07Cit9OworCitzdHJpbmcgdF9kZWxwaGlfZ2VuZXJhdG9yOjpyZXBsYWNlX2FsbChzdHJpbmcgY29udGVudHMsIHN0cmluZyBzZWFyY2gsIHN0cmluZyByZXBsKSB7CisgIHN0cmluZyBzdHIoY29udGVudHMpOworCisgIHNpemVfdCBzbGVuID0gc2VhcmNoLmxlbmd0aCgpOworICBzaXplX3QgcmxlbiA9IHJlcGwubGVuZ3RoKCk7CisgIHNpemVfdCBpbmNyID0gKHJsZW4gPiAwKSA/IHJsZW4gOiAxOworCisgIGlmIChzbGVuID4gMCkgeworICAgIHNpemVfdCBmb3VuZCA9IHN0ci5maW5kKHNlYXJjaCk7CisgICAgd2hpbGUgKChmb3VuZCAhPSBzdHJpbmc6Om5wb3MpICYmIChmb3VuZCA8IHN0ci5sZW5ndGgoKSkpIHsKKyAgICAgIHN0ci5yZXBsYWNlKGZvdW5kLCBzbGVuLCByZXBsKTsKKyAgICAgIGZvdW5kID0gc3RyLmZpbmQoc2VhcmNoLCBmb3VuZCArIGluY3IpOworICAgIH0KKyAgfQorCisgIHJldHVybiBzdHI7Cit9CisKKy8vIFhNTCBlbmNvZGluZworc3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6eG1sX2VuY29kZShzdHJpbmcgY29udGVudHMpIHsKKyAgc3RyaW5nIHN0cihjb250ZW50cyk7CisKKyAgLy8gZXNjYXBlIHRoZSBlc2NhcGUKKyAgc3RyID0gcmVwbGFjZV9hbGwoc3RyLCAiJiIsICImYW1wOyIpOworCisgIC8vIG90aGVyIHN0YW5kYXJkIFhNTCBlbnRpdGllcworICBzdHIgPSByZXBsYWNlX2FsbChzdHIsICI8IiwgIiZsdDsiKTsKKyAgc3RyID0gcmVwbGFjZV9hbGwoc3RyLCAiPiIsICImZ3Q7Iik7CisKKyAgcmV0dXJuIHN0cjsKK30KKworLy8gWE1MIGF0dHJpYnV0ZSBlbmNvZGluZworc3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6eG1sYXR0cmliX2VuY29kZShzdHJpbmcgY29udGVudHMpIHsKKyAgc3RyaW5nIHN0cih4bWxfZW5jb2RlKGNvbnRlbnRzKSk7CisKKyAgLy8gb3VyIGF0dHJpYnMgYXJlIGVuY2xvc2VkIGluICIKKyAgc3RyID0gcmVwbGFjZV9hbGwoc3RyLCAiXCIiLCAiXFxcIiIpOworCisgIHJldHVybiBzdHI7Cit9CisKKy8vIFhNTCBlbmNvZGluZyBmb3IgZG9jIGNvbW1lbnRzCitzdHJpbmcgdF9kZWxwaGlfZ2VuZXJhdG9yOjp4bWxkb2NfZW5jb2RlKHN0cmluZyBjb250ZW50cykgeworICBzdHJpbmcgc3RyKHhtbF9lbmNvZGUoY29udGVudHMpKTsKKworICAvLyBYTUxEb2Mgc3BlY2lmaWM6IGNvbnZlcnQgbGluZWJyZWFrcyBpbnRvIDxwYXJhPmdyYXBoczwvcGFyYT4KKyAgc3RyID0gcmVwbGFjZV9hbGwoc3RyLCAiXHJcbiIsICJcciIpOworICBzdHIgPSByZXBsYWNlX2FsbChzdHIsICJcbiIsICJcciIpOworICBzdHIgPSByZXBsYWNlX2FsbChzdHIsICJcciIsICI8L3BhcmE+XG48cGFyYT4iKTsKKworICByZXR1cm4gc3RyOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVscGhpX2RvY3N0cmluZ19jb21tZW50KG9zdHJlYW0mIG91dCwgc3RyaW5nIGNvbnRlbnRzKSB7CisgIGlmICh4bWxkb2NfKSB7CisgICAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ7JFJFR0lPTiAnWE1MRG9jJ30vLy8gPHN1bW1hcnk+XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvLy8gIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPHBhcmE+IiArIGNvbnRlbnRzICsgIjwvcGFyYT4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvLy8gPC9zdW1tYXJ5PlxueyRFTkRSRUdJT059XG4iKTsKKyAgfQorfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVscGhpX2RvYyhvc3RyZWFtJiBvdXQsIHRfZmllbGQqIGZpZWxkKSB7CisgIGlmICh4bWxkb2NfKSB7CisgICAgaWYgKGZpZWxkLT5nZXRfdHlwZSgpLT5pc19lbnVtKCkpIHsKKyAgICAgIHN0cmluZyBjb21iaW5lZF9tZXNzYWdlID0geG1sZG9jX2VuY29kZShmaWVsZC0+Z2V0X2RvYygpKSArICJcbjxzZWVhbHNvIGNyZWY9XCIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgeG1sZG9jX2VuY29kZSh0eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCkpKSArICJcIi8+IjsKKyAgICAgIGdlbmVyYXRlX2RlbHBoaV9kb2NzdHJpbmdfY29tbWVudChvdXQsIGNvbWJpbmVkX21lc3NhZ2UpOworICAgIH0gZWxzZSB7CisgICAgICBnZW5lcmF0ZV9kZWxwaGlfZG9jKG91dCwgKHRfZG9jKilmaWVsZCk7CisgICAgfQorICB9Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWxwaGlfZG9jKG9zdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpIHsKKyAgaWYgKHRkb2MtPmhhc19kb2MoKSAmJiB4bWxkb2NfKSB7CisgICAgZ2VuZXJhdGVfZGVscGhpX2RvY3N0cmluZ19jb21tZW50KG91dCwgeG1sZG9jX2VuY29kZSh0ZG9jLT5nZXRfZG9jKCkpKTsKKyAgfQorfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVscGhpX2RvYyhvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICBpZiAodGZ1bmN0aW9uLT5oYXNfZG9jKCkgJiYgeG1sZG9jXykgeworICAgIHN0cmluZ3N0cmVhbSBwczsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgcF9pdGVyOworICAgIGZvciAocF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IHBfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrcF9pdGVyKSB7CisgICAgICB0X2ZpZWxkKiBwID0gKnBfaXRlcjsKKyAgICAgIHBzIDw8ICJcbjxwYXJhbSBuYW1lPVwiIiA8PCB4bWxhdHRyaWJfZW5jb2RlKHAtPmdldF9uYW1lKCkpIDw8ICJcIj4iOworICAgICAgaWYgKHAtPmhhc19kb2MoKSkgeworICAgICAgICBzdGQ6OnN0cmluZyBzdHIgPSBwLT5nZXRfZG9jKCk7CisgICAgICAgIHN0ci5lcmFzZShzdGQ6OnJlbW92ZShzdHIuYmVnaW4oKSwgc3RyLmVuZCgpLCAnXG4nKSwKKyAgICAgICAgICAgICAgICAgIHN0ci5lbmQoKSk7IC8vIHJlbW92ZSB0aGUgbmV3bGluZXMgdGhhdCBhcHBlYXIgZnJvbSB0aGUgcGFyc2VyCisgICAgICAgIHBzIDw8IHhtbGRvY19lbmNvZGUoc3RyKTsKKyAgICAgIH0KKyAgICAgIHBzIDw8ICI8L3BhcmFtPiI7CisgICAgfQorICAgIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAieyRSRUdJT04gJ1hNTERvYyd9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLy8vICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxzdW1tYXJ5PjxwYXJhPiIgKyB4bWxkb2NfZW5jb2RlKHRmdW5jdGlvbi0+Z2V0X2RvYygpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIjwvcGFyYT48L3N1bW1hcnk+IiArIHBzLnN0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ7JEVORFJFR0lPTn1cbiIpOworICB9Cit9CisKK2Jvb2wgdF9kZWxwaGlfZ2VuZXJhdG9yOjpmaW5kX2tleXdvcmQoc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4mIGtleXdvcmRfbWFwLCBzdGQ6OnN0cmluZyBuYW1lKSB7CisgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgbGVuID0gbmFtZS5sZW5ndGgoKTsKKworICBpZiAobGVuIDw9IDApIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIG5sYXN0ID0gbmFtZS5maW5kX2xhc3Rfb2YoJ18nKTsKKworICBpZiAobmxhc3QgPj0gMSkgeworICAgIGlmIChubGFzdCA9PSAobGVuIC0gMSkpIHsKKyAgICAgIHN0cmluZyBuZXdfbmFtZShuYW1lLCAwLCBubGFzdCk7CisgICAgICByZXR1cm4gZmluZF9rZXl3b3JkKGtleXdvcmRfbWFwLCBuZXdfbmFtZSk7CisgICAgfQorICB9CisgIHJldHVybiAoa2V5d29yZF9tYXBbbmFtZV0gPT0gMSk7Cit9CisKK3N0ZDo6c3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6bm9ybWFsaXplX25hbWUoc3RkOjpzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiX21ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiX2V4Y2VwdGlvbl9tZXRob2QpIHsKKyAgc3RyaW5nIHRtcChuYW1lKTsKKyAgc3RkOjp0cmFuc2Zvcm0odG1wLmJlZ2luKCksIHRtcC5lbmQoKSwgdG1wLmJlZ2luKCksIHN0YXRpY19jYXN0PGludCAoKikoaW50KT4oc3RkOjp0b2xvd2VyKSk7CisKKyAgYm9vbCBiX2ZvdW5kID0gZmFsc2U7CisKKyAgaWYgKGZpbmRfa2V5d29yZChkZWxwaGlfa2V5d29yZHMsIHRtcCkpIHsKKyAgICBiX2ZvdW5kID0gdHJ1ZTsKKyAgfSBlbHNlIGlmIChiX21ldGhvZCAmJiBmaW5kX2tleXdvcmQoZGVscGhpX3Jlc2VydmVkX21ldGhvZCwgdG1wKSkgeworICAgIGJfZm91bmQgPSB0cnVlOworICB9IGVsc2UgaWYgKGJfZXhjZXB0aW9uX21ldGhvZCAmJiBmaW5kX2tleXdvcmQoZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb24sIHRtcCkpIHsKKyAgICBiX2ZvdW5kID0gdHJ1ZTsKKyAgfQorCisgIGlmIChiX2ZvdW5kKSB7CisgICAgcmV0dXJuIG5hbWUgKyAiXyI7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIG5hbWU7CisgIH0KK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmNyZWF0ZV9rZXl3b3JkcygpIHsKKyAgZGVscGhpX2tleXdvcmRzWyJhbmQiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siZW5kIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImludGVyZmFjZSJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJyYWlzZSJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJ1c2VzIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImFycmF5Il0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImV4Y2VwdCJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJpcyJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJyZWNvcmQiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sidmFyIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImFzIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImV4cG9ydHMiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sibGFiZWwiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sicmVwZWF0Il0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbIndoaWxlIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImFzbSJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJmaWxlIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImxpYnJhcnkiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sicmVzb3VyY2VzdHJpbmciXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sid2l0aCJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJiZWdpbiJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJmaW5hbGl6YXRpb24iXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sibW9kIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInNldCJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJ4b3IiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siY2FzZSJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJmaW5hbGx5Il0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbIm5pbCJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJzaGwiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siY2xhc3MiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siZm9yIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbIm5vdCJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJzaHIiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siY29uc3QiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siZnVuY3Rpb24iXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sib2JqZWN0Il0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInN0cmluZyJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJjb25zdHJ1Y3RvciJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJnb3RvIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbIm9mIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInRoZW4iXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siZGVzdHJ1Y3RvciJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJpZiJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJvciJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJ0aHJlYWR2YXIiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siZGlzcGludGVyZmFjZSJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJpbXBsZW1lbnRhdGlvbiJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJvdXQiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sidG8iXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siZGl2Il0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImluIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInBhY2tlZCJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJ0cnkiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siZG8iXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siaW5oZXJpdGVkIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInByb2NlZHVyZSJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJ0eXBlIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImRvd250byJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJpbml0aWFsaXphdGlvbiJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJwcm9ncmFtIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInVuaXQiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siZWxzZSJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJpbmxpbmUiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sicHJvcGVydHkiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sidW50aWwiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sicHJpdmF0ZSJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJwcm90ZWN0ZWQiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sicHVibGljIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInB1Ymxpc2hlZCJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJhdXRvbWF0ZWQiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siYXQiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sib24iXSA9IDE7CisKKyAgLy8gcmVzZXJ2ZWQvcHJlZGVmaW5lZCB2YXJpYWJsZXMgYW5kIHR5cGVzIChsb3dlcmNhc2UhKQorICBkZWxwaGlfa2V5d29yZHNbInJlc3VsdCJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJzeXN0ZW0iXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sic3lzdXRpbHMiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sidGhyaWZ0Il0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInRieXRlcyJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJ0b2JqZWN0Il0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInRjbGFzcyJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJ0aW50ZXJmYWNlZG9iamVjdCJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJhbnNpc3RyaW5nIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInN0cmluZyJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJib29sZWFuIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInNob3J0aW50Il0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInNtYWxsaW50Il0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImludGVnZXIiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siaW50NjQiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siZG91YmxlIl0gPSAxOworCisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImNyZWF0ZSJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiZnJlZSJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiaW5pdGluc3RhbmNlIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJjbGVhbnVwaW5zdGFuY2UiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImNsYXNzdHlwZSJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiY2xhc3NuYW1lIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJjbGFzc25hbWVpcyJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiY2xhc3NwYXJlbnQiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImNsYXNzaW5mbyJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiaW5zdGFuY2VzaXplIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJpbmhlcml0c2Zyb20iXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbIm1ldGhvZGFkZHJlc3MiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbIm1ldGhvZGFkZHJlc3MiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbIm1ldGhvZG5hbWUiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImZpZWxkYWRkcmVzcyJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiZmllbGRhZGRyZXNzIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJnZXRpbnRlcmZhY2UiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImdldGludGVyZmFjZWVudHJ5Il0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJnZXRpbnRlcmZhY2V0YWJsZSJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsidW5pdG5hbWUiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImVxdWFscyJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiZ2V0aGFzaGNvZGUiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbInRvc3RyaW5nIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJzYWZlY2FsbGV4Y2VwdGlvbiJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiYWZ0ZXJjb25zdHJ1Y3Rpb24iXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImJlZm9yZWRlc3RydWN0aW9uIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJkaXNwYXRjaCJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiZGVmYXVsdGhhbmRsZXIiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbIm5ld2luc3RhbmNlIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJmcmVlaW5zdGFuY2UiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImRlc3Ryb3kiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbInJlYWQiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbIndyaXRlIl0gPSAxOworCisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJzZXRpbm5lcmV4Y2VwdGlvbiJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb25bInNldHN0YWNraW5mbyJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb25bImdldHN0YWNrdHJhY2UiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJyYWlzaW5nZXhjZXB0aW9uIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvblsiY3JlYXRlZm10Il0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvblsiY3JlYXRlcmVzIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvblsiY3JlYXRlcmVzZm10Il0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvblsiY3JlYXRlaGVscCJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb25bImNyZWF0ZWZtdGhlbHAiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJjcmVhdGVyZXNoZWxwIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvblsiY3JlYXRlcmVzZm10aGVscCJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb25bImdldGJhc2VleGNlcHRpb24iXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJiYXNlZXhjZXB0aW9uIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvblsiaGVscGNvbnRleHQiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJpbm5lcmV4Y2VwdGlvbiJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb25bIm1lc3NhZ2UiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJzdGFja3RyYWNlIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvblsic3RhY2tpbmZvIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvblsiZ2V0ZXhjZXB0aW9uc3RhY2tpbmZvcHJvYyJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb25bImdldHN0YWNraW5mb3N0cmluZ3Byb2MiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJjbGVhbnVwc3RhY2tpbmZvcHJvYyJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb25bInJhaXNlb3V0ZXJleGNlcHRpb24iXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJ0aHJvd291dGVyZXhjZXB0aW9uIl0gPSAxOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6YWRkX2RlbHBoaV91c2VzX2xpc3Qoc3RyaW5nIHVuaXRuYW1lKSB7CisgIHZlY3RvcjxzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIHNfaXRlcjsKKyAgYm9vbCBmb3VuZCA9IGZhbHNlOworICBmb3IgKHNfaXRlciA9IHVzZXNfbGlzdC5iZWdpbigpOyBzX2l0ZXIgIT0gdXNlc19saXN0LmVuZCgpOyArK3NfaXRlcikgeworICAgIGlmICgoKnNfaXRlcikgPT0gdW5pdG5hbWUpIHsKKyAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBpZiAoIWZvdW5kKSB7CisgICAgdXNlc19saXN0LnB1c2hfYmFjayh1bml0bmFtZSk7CisgIH0KK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgeworICBpbmRlbnRfaW1wbF8gPSAwOworICBuYW1lc3BhY2VfbmFtZV8gPSBwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgiZGVscGhpIik7CisgIGhhc19mb3J3YXJkID0gZmFsc2U7CisgIGhhc19lbnVtID0gZmFsc2U7CisgIGhhc19jb25zdCA9IGZhbHNlOworICBjcmVhdGVfa2V5d29yZHMoKTsKKworICBhZGRfZGVscGhpX3VzZXNfbGlzdCgiQ2xhc3NlcyIpOworICBhZGRfZGVscGhpX3VzZXNfbGlzdCgiU3lzVXRpbHMiKTsKKyAgYWRkX2RlbHBoaV91c2VzX2xpc3QoIkdlbmVyaWNzLkNvbGxlY3Rpb25zIik7CisgIGlmKGFzeW5jXykgeworICAgIGFkZF9kZWxwaGlfdXNlc19saXN0KCJTeXN0ZW0uVGhyZWFkaW5nIik7CisgIH0KKworICBhZGRfZGVscGhpX3VzZXNfbGlzdCgiVGhyaWZ0Iik7CisgIGFkZF9kZWxwaGlfdXNlc19saXN0KCJUaHJpZnQuVXRpbHMiKTsKKyAgYWRkX2RlbHBoaV91c2VzX2xpc3QoIlRocmlmdC5Db2xsZWN0aW9ucyIpOworICBhZGRfZGVscGhpX3VzZXNfbGlzdCgiVGhyaWZ0LlByb3RvY29sIik7CisgIGFkZF9kZWxwaGlfdXNlc19saXN0KCJUaHJpZnQuVHJhbnNwb3J0Iik7CisgIGlmIChyZWdpc3Rlcl90eXBlc18pIHsKKyAgICBhZGRfZGVscGhpX3VzZXNfbGlzdCgiVGhyaWZ0LlR5cGVSZWdpc3RyeSIpOworICB9CisKKyAgaW5pdF9rbm93bl90eXBlc19saXN0KCk7CisKKyAgc3RyaW5nIHVuaXRuYW1lLCBuc25hbWU7CisgIGNvbnN0IHZlY3Rvcjx0X3Byb2dyYW0qPiYgaW5jbHVkZXMgPSBwcm9ncmFtXy0+Z2V0X2luY2x1ZGVzKCk7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5jbHVkZXMuc2l6ZSgpOyArK2kpIHsKKyAgICB1bml0bmFtZSA9IGluY2x1ZGVzW2ldLT5nZXRfbmFtZSgpOworICAgIG5zbmFtZSA9IGluY2x1ZGVzW2ldLT5nZXRfbmFtZXNwYWNlKCJkZWxwaGkiKTsKKyAgICBpZiAoIiIgIT0gbnNuYW1lKSB7CisgICAgICB1bml0bmFtZSA9IG5vcm1hbGl6ZV9uYW1lKG5zbmFtZSk7CisgICAgfQorICAgIGFkZF9kZWxwaGlfdXNlc19saXN0KHVuaXRuYW1lKTsKKyAgfQorCisgIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7CisgIHN0ZDo6c3RyaW5nIHVuaXRuYW1lID0gcHJvZ3JhbV9uYW1lXzsKKyAgaWYgKCIiICE9IG5hbWVzcGFjZV9uYW1lXykgeworICAgIHVuaXRuYW1lID0gbmFtZXNwYWNlX25hbWVfOworICB9CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAoaW50KXVuaXRuYW1lLnNpemUoKTsgaSsrKSB7CisgICAgaWYgKHVuaXRuYW1lW2ldID09ICcgJykgeworICAgICAgdW5pdG5hbWUucmVwbGFjZShpLCAxLCAiXyIpOworICAgIH0KKyAgfQorCisgIHVuaXRuYW1lID0gbm9ybWFsaXplX25hbWUodW5pdG5hbWUpOworICAKKyAgc3RkOjpzdHJpbmcgZl9uYW1lID0gZ2V0X291dF9kaXIoKSArICIvIiArIHVuaXRuYW1lICsgIi5wYXMiOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfYWxsOworCisgIGZfYWxsLm9wZW4oZl9uYW1lLmNfc3RyKCkpOworCisgIGZfYWxsIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGVuZGw7CisgIGdlbmVyYXRlX2RlbHBoaV9kb2MoZl9hbGwsIHByb2dyYW1fKTsKKyAgZl9hbGwgPDwgInVuaXQgIiA8PCB1bml0bmFtZSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworICBmX2FsbCA8PCAiaW50ZXJmYWNlIiA8PCBlbmRsIDw8IGVuZGw7CisgIGZfYWxsIDw8ICJ1c2VzIiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIHZlY3RvcjxzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIHNfaXRlcjsKKyAgZm9yIChzX2l0ZXIgPSB1c2VzX2xpc3QuYmVnaW4oKTsgc19pdGVyICE9IHVzZXNfbGlzdC5lbmQoKTsgKytzX2l0ZXIpIHsKKyAgICBpZiAoc19pdGVyICE9IHVzZXNfbGlzdC5iZWdpbigpKSB7CisgICAgICBmX2FsbCA8PCAiLCI7CisgICAgICBmX2FsbCA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnQoZl9hbGwpIDw8ICpzX2l0ZXI7CisgIH0KKworICBmX2FsbCA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisKKyAgc3RyaW5nIHRtcF91bml0KHVuaXRuYW1lKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAoaW50KXRtcF91bml0LnNpemUoKTsgaSsrKSB7CisgICAgaWYgKHRtcF91bml0W2ldID09ICcuJykgeworICAgICAgdG1wX3VuaXQucmVwbGFjZShpLCAxLCAiXyIpOworICAgIH0KKyAgfQorCisgIGZfYWxsIDw8ICJjb25zdCIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChmX2FsbCkgPDwgImMiIDw8IHRtcF91bml0CisgICAgICAgICAgICAgICAgPDwgIl9PcHRpb25fQW5zaVN0cl9CaW5hcnkgPSAiIDw8IChhbnNpc3RyX2JpbmFyeV8gPyAiVHJ1ZSIgOiAiRmFsc2UiKSA8PCAiOyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnQoZl9hbGwpIDw8ICJjIiA8PCB0bXBfdW5pdAorICAgICAgICAgICAgICAgIDw8ICJfT3B0aW9uX1JlZ2lzdGVyX1R5cGVzID0gIiA8PCAocmVnaXN0ZXJfdHlwZXNfID8gIlRydWUiIDogIkZhbHNlIikgPDwgIjsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50KGZfYWxsKSA8PCAiYyIgPDwgdG1wX3VuaXQKKyAgICAgICAgICAgICAgICA8PCAiX09wdGlvbl9Db25zdFByZWZpeCAgICA9ICIgPDwgKGNvbnN0cHJlZml4XyA/ICJUcnVlIiA6ICJGYWxzZSIpIDw8ICI7IiA8PCBlbmRsOworICBpbmRlbnQoZl9hbGwpIDw8ICJjIiA8PCB0bXBfdW5pdCA8PCAiX09wdGlvbl9FdmVudHMgICAgICAgICA9ICIgPDwgKGV2ZW50c18gPyAiVHJ1ZSIgOiAiRmFsc2UiKQorICAgICAgICAgICAgICAgIDw8ICI7IiA8PCBlbmRsOworICBpbmRlbnQoZl9hbGwpIDw8ICJjIiA8PCB0bXBfdW5pdCA8PCAiX09wdGlvbl9YbWxEb2MgICAgICAgICA9ICIgPDwgKHhtbGRvY18gPyAiVHJ1ZSIgOiAiRmFsc2UiKQorICAgICAgICAgICAgICAgIDw8ICI7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworCisgIGZfYWxsIDw8IGVuZGw7CisgIGZfYWxsIDw8ICJ0eXBlIiA8PCBlbmRsOworICBpZiAoaGFzX2ZvcndhcmQpIHsKKyAgICBmX2FsbCA8PCBzX2ZvcndhcmRfZGVjci5zdHIoKSA8PCBlbmRsOworICB9CisgIGlmIChoYXNfZW51bSkgeworICAgIGluZGVudChmX2FsbCkgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9hbGwpIDw8ICJ7JFNDT1BFREVOVU1TIE9OfSIgPDwgZW5kbCA8PCBlbmRsOworICAgIGZfYWxsIDw8IHNfZW51bS5zdHIoKTsKKyAgICBpbmRlbnQoZl9hbGwpIDw8ICJ7JFNDT1BFREVOVU1TIE9GRn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorICBmX2FsbCA8PCBzX3N0cnVjdC5zdHIoKTsKKyAgZl9hbGwgPDwgc19zZXJ2aWNlLnN0cigpOworICBmX2FsbCA8PCBzX2NvbnN0LnN0cigpOworICBmX2FsbCA8PCAiaW1wbGVtZW50YXRpb24iIDw8IGVuZGwgPDwgZW5kbDsKKyAgZl9hbGwgPDwgc19zdHJ1Y3RfaW1wbC5zdHIoKTsKKyAgZl9hbGwgPDwgc19zZXJ2aWNlX2ltcGwuc3RyKCk7CisgIGZfYWxsIDw8IHNfY29uc3RfaW1wbC5zdHIoKTsKKworICBpZiAocmVnaXN0ZXJfdHlwZXNfKSB7CisgICAgZl9hbGwgPDwgZW5kbDsKKyAgICBmX2FsbCA8PCAiLy8gVHlwZSBmYWN0b3J5IG1ldGhvZHMgYW5kIHJlZ2lzdHJhdGlvbiIgPDwgZW5kbDsKKyAgICBmX2FsbCA8PCBzX3R5cGVfZmFjdG9yeV9mdW5jcy5zdHIoKTsKKyAgICBmX2FsbCA8PCAicHJvY2VkdXJlIFJlZ2lzdGVyVHlwZUZhY3RvcmllczsiIDw8IGVuZGw7CisgICAgZl9hbGwgPDwgImJlZ2luIiA8PCBlbmRsOworICAgIGZfYWxsIDw8IHNfdHlwZV9mYWN0b3J5X3JlZ2lzdHJhdGlvbi5zdHIoKTsKKyAgICBmX2FsbCA8PCAiZW5kOyIgPDwgZW5kbDsKKyAgfQorICBmX2FsbCA8PCBlbmRsOworCisgIHN0cmluZyBjb25zdGFudHNfY2xhc3MgPSBtYWtlX2NvbnN0YW50c19jbGFzc25hbWUoKTsKKworICBmX2FsbCA8PCAiaW5pdGlhbGl6YXRpb24iIDw8IGVuZGw7CisgIGlmIChoYXNfY29uc3QpIHsKKyAgICBmX2FsbCA8PCAieyRJRiBDb21waWxlclZlcnNpb24gPCAyMS4wfSAgLy8gRDIwMTAiIDw8IGVuZGw7CisgICAgZl9hbGwgPDwgIiAgIiA8PCBjb25zdGFudHNfY2xhc3MuY19zdHIoKSA8PCAiX0luaXRpYWxpemU7IiA8PCBlbmRsOworICAgIGZfYWxsIDw8ICJ7JElGRU5EfSIgPDwgZW5kbDsKKyAgfQorICBpZiAocmVnaXN0ZXJfdHlwZXNfKSB7CisgICAgZl9hbGwgPDwgIiAgUmVnaXN0ZXJUeXBlRmFjdG9yaWVzOyIgPDwgZW5kbDsKKyAgfQorICBmX2FsbCA8PCBlbmRsOworCisgIGZfYWxsIDw8ICJmaW5hbGl6YXRpb24iIDw8IGVuZGw7CisgIGlmIChoYXNfY29uc3QpIHsKKyAgICBmX2FsbCA8PCAieyRJRiBDb21waWxlclZlcnNpb24gPCAyMS4wfSAgLy8gRDIwMTAiIDw8IGVuZGw7CisgICAgZl9hbGwgPDwgIiAgIiA8PCBjb25zdGFudHNfY2xhc3MuY19zdHIoKSA8PCAiX0ZpbmFsaXplOyIgPDwgZW5kbDsKKyAgICBmX2FsbCA8PCAieyRJRkVORH0iIDw8IGVuZGw7CisgIH0KKyAgZl9hbGwgPDwgZW5kbCA8PCBlbmRsOworCisgIGZfYWxsIDw8ICJlbmQuIiA8PCBlbmRsOworICBmX2FsbC5jbG9zZSgpOworCisgIGlmICghdHlwZWRlZnNfcGVuZGluZy5lbXB0eSgpKSB7CisgICAgcHdhcm5pbmcoMCwgIiVkIHR5cGVkZWZzIHdpdGggdW5yZXNvbHZlZCB0eXBlIHJlZmVyZW5jZXMgbGVmdDpcbiIsIHR5cGVkZWZzX3BlbmRpbmcuc2l6ZSgpKTsKKyAgICBmb3IgKHN0ZDo6bGlzdDx0X3R5cGVkZWYqPjo6aXRlcmF0b3IgaXRlciA9IHR5cGVkZWZzX3BlbmRpbmcuYmVnaW4oKTsKKyAgICAgICAgIHR5cGVkZWZzX3BlbmRpbmcuZW5kKCkgIT0gaXRlcjsKKyAgICAgICAgICsraXRlcikgeworICAgICAgcHdhcm5pbmcoMCwgIi0gJXNcbiIsICgqaXRlciktPmdldF9zeW1ib2xpYygpLmNfc3RyKCkpOworICAgIH0KKyAgfQorfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6ZGVscGhpX3R5cGVfdXNpbmdzKG9zdHJlYW0mIG91dCkgeworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgIkNsYXNzZXMsIFN5c1V0aWxzLCBHZW5lcmljcy5Db2xsZWN0aW9ucywgVGhyaWZ0LkNvbGxlY3Rpb25zLCBUaHJpZnQuUHJvdG9jb2wsIgorICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiVGhyaWZ0LlRyYW5zcG9ydDsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2ZvcndhcmRfZGVjbGFyYXRpb24odF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgLy8gRm9yd2FyZCBkZWNsYXJlIHN0cnVjdCBkZWYKKyAgaGFzX2ZvcndhcmQgPSB0cnVlOworICBwdmVyYm9zZSgiZm9yd2FyZCBkZWNsYXJhdGlvbiBvZiAlc1xuIiwgdHlwZV9uYW1lKHRzdHJ1Y3QpLmNfc3RyKCkpOworCisgIHN0cmluZyB3aGF0ID0gdHN0cnVjdC0+aXNfeGNlcHRpb24oKSA/ICJjbGFzcyIgOiAiaW50ZXJmYWNlIjsKKworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KHNfZm9yd2FyZF9kZWNyKSA8PCB0eXBlX25hbWUodHN0cnVjdCwgdHN0cnVjdC0+aXNfeGNlcHRpb24oKSwgdHJ1ZSkgPDwgIiA9ICIgPDwgd2hhdCA8PCAiOyIKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworCisgIGFkZF9kZWZpbmVkX3R5cGUodHN0cnVjdCk7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKKyAgdF90eXBlKiB0eXBlID0gdHR5cGVkZWYtPmdldF90eXBlKCk7CisKKyAgLy8gd3JpdGUgbm93IG9yIHNhdmUgZm9yIGxhdGVyPworICBpZiAoIWlzX2Z1bGx5X2RlZmluZWRfdHlwZSh0eXBlKSkgeworICAgIHB2ZXJib3NlKCJ0eXBlZGVmICVzOiB1bnJlc29sdmVkIGRlcGVuZGVuY2llcyBmb3VuZFxuIiwgdHlwZV9uYW1lKHR0eXBlZGVmKS5jX3N0cigpKTsKKyAgICB0eXBlZGVmc19wZW5kaW5nLnB1c2hfYmFjayh0dHlwZWRlZik7CisgICAgcmV0dXJuOworICB9CisKKyAgaW5kZW50X3VwKCk7CisgIGdlbmVyYXRlX2RlbHBoaV9kb2Moc19zdHJ1Y3QsIHR0eXBlZGVmKTsKKyAgaW5kZW50KHNfc3RydWN0KSA8PCB0eXBlX25hbWUodHR5cGVkZWYpIDw8ICIgPSAiOworCisgIC8vIGNvbW1lbnRlZCBvdXQ6IHRoZSBiZW5lZml0IGlzIG5vdCBiaWcgZW5vdWdoIHRvIHJpc2sgYnJlYWtpbmcgZXhpc3RpbmcgY29kZQorICAvLyBib29sIGNvbnRhaW5lciA9IHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19tYXAoKSB8fCB0eXBlLT5pc19zZXQoKTsKKyAgLy8gaWYoICEgY29udGFpbmVyKQorICAvLyAgc19zdHJ1Y3QgPDwgInR5cGUgIjsgIC8vdGhlICJ0eXBlIEEgPSB0eXBlIEIiIHN5bnRheCBsZWFkcyB0byBFMjU3NCB3aXRoIGdlbmVyaWNzCisKKyAgc19zdHJ1Y3QgPDwgdHlwZV9uYW1lKHR0eXBlZGVmLT5nZXRfdHlwZSgpKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworCisgIGFkZF9kZWZpbmVkX3R5cGUodHR5cGVkZWYpOworfQorCitib29sIHRfZGVscGhpX2dlbmVyYXRvcjo6aXNfZnVsbHlfZGVmaW5lZF90eXBlKHRfdHlwZSogdHR5cGUpIHsKKyAgaWYgKChOVUxMICE9IHR0eXBlLT5nZXRfcHJvZ3JhbSgpKSAmJiAodHR5cGUtPmdldF9wcm9ncmFtKCkgIT0gcHJvZ3JhbV8pKSB7CisgICAgdF9zY29wZSogc2NvcGUgPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKS0+c2NvcGUoKTsKKyAgICBpZiAoTlVMTCAhPSBzY29wZS0+Z2V0X3R5cGUodHR5cGUtPmdldF9uYW1lKCkpKSB7CisgICAgICAvLyBwcmludGYoInR5cGUgJXMgZm91bmQgaW4gaW5jbHVkZWQgc2NvcGUgJXNcbiIsIHR0eXBlLT5nZXRfbmFtZSgpLmNfc3RyKCksCisgICAgICAvLyB0dHlwZS0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorCisgIGlmICh0dHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgcmV0dXJuICgxID09IHR5cGVzX2tub3duW3R5cGVfbmFtZSh0dHlwZSldKTsKKyAgfQorCisgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICByZXR1cm4gKDEgPT0gdHlwZXNfa25vd25bYmFzZV90eXBlX25hbWUoKHRfYmFzZV90eXBlKil0dHlwZSldKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuIHRydWU7IC8vIGVudW1zIGFyZSB3cml0dGVuIGZpcnN0LCBiZWZvcmUgYWxsIG90aGVyIHR5cGVzCisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgdF9tYXAqIHRtYXAgPSAodF9tYXAqKXR0eXBlOworICAgIHJldHVybiBpc19mdWxseV9kZWZpbmVkX3R5cGUodG1hcC0+Z2V0X2tleV90eXBlKCkpCisgICAgICAgICAgICYmIGlzX2Z1bGx5X2RlZmluZWRfdHlwZSh0bWFwLT5nZXRfdmFsX3R5cGUoKSk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgdF9zZXQqIHRzZXQgPSAodF9zZXQqKXR0eXBlOworICAgIHJldHVybiBpc19mdWxseV9kZWZpbmVkX3R5cGUodHNldC0+Z2V0X2VsZW1fdHlwZSgpKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgdF9saXN0KiB0bGlzdCA9ICh0X2xpc3QqKXR0eXBlOworICAgIHJldHVybiBpc19mdWxseV9kZWZpbmVkX3R5cGUodGxpc3QtPmdldF9lbGVtX3R5cGUoKSk7CisgIH0KKworICByZXR1cm4gKDEgPT0gdHlwZXNfa25vd25bdHlwZV9uYW1lKHR0eXBlKV0pOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6YWRkX2RlZmluZWRfdHlwZSh0X3R5cGUqIHR0eXBlKSB7CisgIC8vIG1hcmsgYXMga25vd24gdHlwZQorICB0eXBlc19rbm93blt0eXBlX25hbWUodHR5cGUpXSA9IDE7CisKKyAgLy8gY2hlY2sgYWxsIHBlbmRpbmcgdHlwZWRlZnMKKyAgc3RkOjpsaXN0PHRfdHlwZWRlZio+OjppdGVyYXRvciBpdGVyOworICBib29sIG1vcmUgPSB0cnVlOworICB3aGlsZSAobW9yZSAmJiAoIXR5cGVkZWZzX3BlbmRpbmcuZW1wdHkoKSkpIHsKKyAgICBtb3JlID0gZmFsc2U7CisKKyAgICBmb3IgKGl0ZXIgPSB0eXBlZGVmc19wZW5kaW5nLmJlZ2luKCk7IHR5cGVkZWZzX3BlbmRpbmcuZW5kKCkgIT0gaXRlcjsgKytpdGVyKSB7CisgICAgICB0X3R5cGVkZWYqIHR0eXBlZGVmID0gKCppdGVyKTsKKyAgICAgIGlmIChpc19mdWxseV9kZWZpbmVkX3R5cGUodHR5cGVkZWYtPmdldF90eXBlKCkpKSB7CisgICAgICAgIHB2ZXJib3NlKCJ0eXBlZGVmICVzOiBhbGwgcGVuZGluZyByZWZlcmVuY2VzIGFyZSBub3cgcmVzb2x2ZWRcbiIsCisgICAgICAgICAgICAgICAgIHR5cGVfbmFtZSh0dHlwZWRlZikuY19zdHIoKSk7CisgICAgICAgIHR5cGVkZWZzX3BlbmRpbmcuZXJhc2UoaXRlcik7CisgICAgICAgIGdlbmVyYXRlX3R5cGVkZWYodHR5cGVkZWYpOworICAgICAgICBtb3JlID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjppbml0X2tub3duX3R5cGVzX2xpc3QoKSB7CisgIC8vIGtub3duIGJhc2UgdHlwZXMKKyAgdHlwZXNfa25vd25bdHlwZV9uYW1lKGdfdHlwZV9zdHJpbmcpXSA9IDE7CisgIHR5cGVzX2tub3duW3R5cGVfbmFtZShnX3R5cGVfYmluYXJ5KV0gPSAxOworICB0eXBlc19rbm93blt0eXBlX25hbWUoZ190eXBlX2Jvb2wpXSA9IDE7CisgIHR5cGVzX2tub3duW3R5cGVfbmFtZShnX3R5cGVfaTgpXSA9IDE7CisgIHR5cGVzX2tub3duW3R5cGVfbmFtZShnX3R5cGVfaTE2KV0gPSAxOworICB0eXBlc19rbm93blt0eXBlX25hbWUoZ190eXBlX2kzMildID0gMTsKKyAgdHlwZXNfa25vd25bdHlwZV9uYW1lKGdfdHlwZV9pNjQpXSA9IDE7CisgIHR5cGVzX2tub3duW3R5cGVfbmFtZShnX3R5cGVfZG91YmxlKV0gPSAxOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7CisgIGhhc19lbnVtID0gdHJ1ZTsKKyAgaW5kZW50X3VwKCk7CisgIGdlbmVyYXRlX2RlbHBoaV9kb2Moc19lbnVtLCB0ZW51bSk7CisgIGluZGVudChzX2VudW0pIDw8IHR5cGVfbmFtZSh0ZW51bSwgdHJ1ZSwgdHJ1ZSkgPDwgIiA9ICIKKyAgICAgICAgICAgICAgICAgPDwgIigiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKyAgaWYgKGNvbnN0YW50cy5lbXB0eSgpKSB7CisgICAgaW5kZW50KHNfZW51bSkgPDwgImR1bW15ID0gMCAgLy8gZW1wdHkgZW51bXMgYXJlIG5vdCBhbGxvd2VkIjsKKyAgfSBlbHNlIHsKKyAgICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgICAgIGlmIChjX2l0ZXIgIT0gY29uc3RhbnRzLmJlZ2luKCkpIHsKKyAgICAgICAgc19lbnVtIDw8ICIsIjsKKyAgICAgICAgc19lbnVtIDw8IGVuZGw7CisgICAgICB9CisgICAgICBnZW5lcmF0ZV9kZWxwaGlfZG9jKHNfZW51bSwgKmNfaXRlcik7CisgICAgICBpbmRlbnQoc19lbnVtKSA8PCBub3JtYWxpemVfbmFtZSgoKmNfaXRlciktPmdldF9uYW1lKCkpIDw8ICIgPSAiIDw8IHZhbHVlOworICAgIH0KKyAgfQorICBzX2VudW0gPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KHNfZW51bSkgPDwgIik7IiA8PCBlbmRsIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7Cit9CisKK3N0ZDo6c3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6bWFrZV92YWxpZF9kZWxwaGlfaWRlbnRpZmllcihzdGQ6OnN0cmluZyBjb25zdCYgZnJvbU5hbWUpIHsKKyAgc3RkOjpzdHJpbmcgc3RyID0gZnJvbU5hbWU7CisgIGlmIChzdHIuZW1wdHkoKSkgeworICAgIHJldHVybiBzdHI7CisgIH0KKworICAvLyB0ZXN0cyByZWx5IG9uIHRoaXMKKyAgYXNzZXJ0KCgnQScgPCAnWicpICYmICgnYScgPCAneicpICYmICgnMCcgPCAnOScpKTsKKworICAvLyBpZiB0aGUgZmlyc3QgbGV0dGVyIGlzIGEgbnVtYmVyLCB3ZSBhZGQgYW4gYWRkaXRpb25hbCB1bmRlcnNjb3JlIGluIGZyb250IG9mIGl0CisgIGNoYXIgYyA9IHN0ci5hdCgwKTsKKyAgaWYgKCgnMCcgPD0gYykgJiYgKGMgPD0gJzknKSkgeworICAgIHN0ciA9ICJfIiArIHN0cjsKKyAgfQorCisgIC8vIGZvbGxvd2luZyBjaGFyczogbGV0dGVyLCBudW1iZXIgb3IgdW5kZXJzY29yZQorICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN0ci5zaXplKCk7ICsraSkgeworICAgIGMgPSBzdHIuYXQoaSk7CisgICAgaWYgKCgoJ0EnID4gYykgfHwgKGMgPiAnWicpKSAmJiAoKCdhJyA+IGMpIHx8IChjID4gJ3onKSkgJiYgKCgnMCcgPiBjKSB8fCAoYyA+ICc5JykpCisgICAgICAgICYmICgnXycgIT0gYykpIHsKKyAgICAgIHN0ci5yZXBsYWNlKGksIDEsICJfIik7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHN0cjsKK30KKworc3RkOjpzdHJpbmcgdF9kZWxwaGlfZ2VuZXJhdG9yOjptYWtlX2NvbnN0YW50c19jbGFzc25hbWUoKSB7CisgIGlmIChjb25zdHByZWZpeF8pIHsKKyAgICByZXR1cm4gbWFrZV92YWxpZF9kZWxwaGlfaWRlbnRpZmllcigiVCIgKyBwcm9ncmFtX25hbWVfICsgIkNvbnN0YW50cyIpOworICB9IGVsc2UgeworICAgIHJldHVybiAiVENvbnN0YW50cyI7IC8vIGNvbXBhdGliaWxpdHkKKyAgfQorfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3RzKHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpIHsKKyAgaWYgKGNvbnN0cy5lbXB0eSgpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgaGFzX2NvbnN0ID0gdHJ1ZTsKKyAgc3RyaW5nIGNvbnN0YW50c19jbGFzcyA9IG1ha2VfY29uc3RhbnRzX2NsYXNzbmFtZSgpOworCisgIGluZGVudF91cCgpOworICBpbmRlbnQoc19jb25zdCkgPDwgY29uc3RhbnRzX2NsYXNzLmNfc3RyKCkgPDwgIiA9IGNsYXNzIiA8PCBlbmRsOworICBpbmRlbnQoc19jb25zdCkgPDwgInByaXZhdGUiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7CisgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgaWYgKGNvbnN0X25lZWRzX3ZhcigoKmNfaXRlciktPmdldF90eXBlKCkpKSB7CisgICAgICBwcmludF9wcml2YXRlX2ZpZWxkKHNfY29uc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZV9uYW1lKCgqY19pdGVyKS0+Z2V0X25hbWUoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3R5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSk7CisgICAgfQorICB9CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChzX2NvbnN0KSA8PCAicHVibGljIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9kZWxwaGlfZG9jKHNfY29uc3QsICpjX2l0ZXIpOworICAgIHByaW50X2NvbnN0X3Byb3Aoc19jb25zdCwKKyAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZV9uYW1lKCgqY19pdGVyKS0+Z2V0X25hbWUoKSksCisgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF90eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF92YWx1ZSgpKTsKKyAgfQorICBpbmRlbnQoc19jb25zdCkgPDwgInskSUYgQ29tcGlsZXJWZXJzaW9uID49IDIxLjB9IiA8PCBlbmRsOworICBpbmRlbnQoc19jb25zdCkgPDwgImNsYXNzIGNvbnN0cnVjdG9yIENyZWF0ZTsiIDw8IGVuZGw7CisgIGluZGVudChzX2NvbnN0KSA8PCAiY2xhc3MgZGVzdHJ1Y3RvciBEZXN0cm95OyIgPDwgZW5kbDsKKyAgaW5kZW50KHNfY29uc3QpIDw8ICJ7JElGRU5EfSIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KHNfY29uc3QpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHZhcnMsIGNvZGU7CisKKyAgaW5kZW50X3VwX2ltcGwoKTsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBpbml0aWFsaXplX2ZpZWxkKHZhcnMsCisgICAgICAgICAgICAgICAgICAgICBjb2RlLAorICAgICAgICAgICAgICAgICAgICAgIkYiICsgcHJvcF9uYW1lKCgqY19pdGVyKS0+Z2V0X25hbWUoKSksCisgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF90eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF92YWx1ZSgpKTsKKyAgfQorICBpbmRlbnRfZG93bl9pbXBsKCk7CisKKyAgaW5kZW50X2ltcGwoc19jb25zdF9pbXBsKSA8PCAieyRJRiBDb21waWxlclZlcnNpb24gPj0gMjEuMH0iIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKHNfY29uc3RfaW1wbCkgPDwgImNsYXNzIGNvbnN0cnVjdG9yICIgPDwgY29uc3RhbnRzX2NsYXNzLmNfc3RyKCkgPDwgIi5DcmVhdGU7IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgaWYgKCF2YXJzLnN0cigpLmVtcHR5KCkpIHsKKyAgICBpbmRlbnRfaW1wbChzX2NvbnN0X2ltcGwpIDw8ICJ2YXIiIDw8IGVuZGw7CisgICAgc19jb25zdF9pbXBsIDw8IHZhcnMuc3RyKCk7CisgIH0KKyAgaW5kZW50X2ltcGwoc19jb25zdF9pbXBsKSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgIGlmICghY29kZS5zdHIoKS5lbXB0eSgpKSB7CisgICAgc19jb25zdF9pbXBsIDw8IGNvZGUuc3RyKCk7CisgIH0KKyAgaW5kZW50X2ltcGwoc19jb25zdF9pbXBsKSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOworICBpbmRlbnRfaW1wbChzX2NvbnN0X2ltcGwpIDw8ICJjbGFzcyBkZXN0cnVjdG9yICIgPDwgY29uc3RhbnRzX2NsYXNzLmNfc3RyKCkgPDwgIi5EZXN0cm95OyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnRfaW1wbChzX2NvbnN0X2ltcGwpIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBpZiAoY29uc3RfbmVlZHNfdmFyKCgqY19pdGVyKS0+Z2V0X3R5cGUoKSkpIHsKKyAgICAgIGZpbmFsaXplX2ZpZWxkKHNfY29uc3RfaW1wbCwKKyAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZV9uYW1lKCgqY19pdGVyKS0+Z2V0X25hbWUoKSksCisgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF90eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF92YWx1ZSgpKTsKKyAgICB9CisgIH0KKyAgaW5kZW50X2ltcGwoc19jb25zdF9pbXBsKSA8PCAiaW5oZXJpdGVkOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChzX2NvbnN0X2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChzX2NvbnN0X2ltcGwpIDw8ICJ7JEVMU0V9IiA8PCBlbmRsOworCisgIHZhcnMuc3RyKCIiKTsKKyAgY29kZS5zdHIoIiIpOworCisgIGluZGVudF91cF9pbXBsKCk7CisgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgaWYgKGNvbnN0X25lZWRzX3ZhcigoKmNfaXRlciktPmdldF90eXBlKCkpKSB7CisgICAgICBpbml0aWFsaXplX2ZpZWxkKHZhcnMsCisgICAgICAgICAgICAgICAgICAgICAgIGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0YW50c19jbGFzcyArICIuRiIgKyBwcm9wX25hbWUoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF92YWx1ZSgpKTsKKyAgICB9CisgIH0KKyAgaW5kZW50X2Rvd25faW1wbCgpOworCisgIGluZGVudF9pbXBsKHNfY29uc3RfaW1wbCkgPDwgInByb2NlZHVyZSAiIDw8IGNvbnN0YW50c19jbGFzcy5jX3N0cigpIDw8ICJfSW5pdGlhbGl6ZTsiIDw8IGVuZGw7CisgIGlmICghdmFycy5zdHIoKS5lbXB0eSgpKSB7CisgICAgaW5kZW50X2ltcGwoc19jb25zdF9pbXBsKSA8PCAidmFyIiA8PCBlbmRsOworICAgIHNfY29uc3RfaW1wbCA8PCB2YXJzLnN0cigpOworICB9CisgIGluZGVudF9pbXBsKHNfY29uc3RfaW1wbCkgPDwgImJlZ2luIiA8PCBlbmRsOworICBpZiAoIWNvZGUuc3RyKCkuZW1wdHkoKSkgeworICAgIHNfY29uc3RfaW1wbCA8PCBjb2RlLnN0cigpOworICB9CisgIGluZGVudF9pbXBsKHNfY29uc3RfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnRfaW1wbChzX2NvbnN0X2ltcGwpIDw8ICJwcm9jZWR1cmUgIiA8PCBjb25zdGFudHNfY2xhc3MuY19zdHIoKSA8PCAiX0ZpbmFsaXplOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoc19jb25zdF9pbXBsKSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgZmluYWxpemVfZmllbGQoc19jb25zdF9pbXBsLAorICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZV9uYW1lKCgqY19pdGVyKS0+Z2V0X25hbWUoKSksCisgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdHlwZSgpLAorICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgY29uc3RhbnRzX2NsYXNzKTsKKyAgfQorICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKHNfY29uc3RfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKHNfY29uc3RfaW1wbCkgPDwgInskSUZFTkR9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpwcmludF9jb25zdF9kZWZfdmFsdWUoc3RkOjpvc3RyZWFtJiB2YXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjbHNfbm0pIHsKKworICBzdHJpbmcgY2xzX3ByZWZpeDsKKworICBpZiAoY2xzX25tID09ICIiKSB7CisgICAgY2xzX3ByZWZpeCA9ICIiOworICB9IGVsc2UgeworICAgIGNsc19wcmVmaXggPSBjbHNfbm0gKyAiLiI7CisgIH0KKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOworICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKKyAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisgICAgICB9CisgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKHZhcnMsIG91dCwgbmFtZSwgZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgICAgaW5kZW50X2ltcGwob3V0KSA8PCBjbHNfcHJlZml4IDw8IG5vcm1hbGl6ZV9uYW1lKG5hbWUpIDw8ICIuIgorICAgICAgICAgICAgICAgICAgICAgICA8PCBwcm9wX25hbWUodl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpLCB0eXBlLT5pc194Y2VwdGlvbigpKQorICAgICAgICAgICAgICAgICAgICAgICA8PCAiIDo9ICIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBzdHJpbmcga2V5ID0gcmVuZGVyX2NvbnN0X3ZhbHVlKHZhcnMsIG91dCwgbmFtZSwga3R5cGUsIHZfaXRlci0+Zmlyc3QpOworICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZSh2YXJzLCBvdXQsIG5hbWUsIHZ0eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgICBpbmRlbnRfaW1wbChvdXQpIDw8IGNsc19wcmVmaXggPDwgbm9ybWFsaXplX25hbWUobmFtZSkgPDwgIlsiIDw8IGtleSA8PCAiXSIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIiA6PSAiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKSB7CisgICAgdF90eXBlKiBldHlwZTsKKyAgICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIH0gZWxzZSB7CisgICAgICBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfQorCisgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKHZhcnMsIG91dCwgbmFtZSwgZXR5cGUsICp2X2l0ZXIpOworICAgICAgaW5kZW50X2ltcGwob3V0KSA8PCBjbHNfcHJlZml4IDw8IG5vcm1hbGl6ZV9uYW1lKG5hbWUpIDw8ICIuQWRkKCIgPDwgdmFsIDw8ICIpOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OnByaW50X3ByaXZhdGVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7CisgICh2b2lkKXZhbHVlOworICBpbmRlbnQob3V0KSA8PCAiY2xhc3MgdmFyIEYiIDw8IG5hbWUgPDwgIjogIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIjsiIDw8IGVuZGw7Cit9CisKK2Jvb2wgdF9kZWxwaGlfZ2VuZXJhdG9yOjpjb25zdF9uZWVkc192YXIodF90eXBlKiB0eXBlKSB7CisgIHRfdHlwZSogdHJ1ZXR5cGUgPSB0eXBlOworICB3aGlsZSAodHJ1ZXR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHRydWV0eXBlID0gKCh0X3R5cGVkZWYqKXRydWV0eXBlKS0+Z2V0X3R5cGUoKTsKKyAgfQorICByZXR1cm4gKCF0cnVldHlwZS0+aXNfYmFzZV90eXBlKCkpOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6cHJpbnRfY29uc3RfcHJvcChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKyAgKHZvaWQpdmFsdWU7CisgIGlmIChjb25zdF9uZWVkc192YXIodHlwZSkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiY2xhc3MgcHJvcGVydHkgIiA8PCBuYW1lIDw8ICI6ICIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgcmVhZCBGIiA8PCBuYW1lIDw8ICI7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIHZhcnM7IC8vIGR1bW15CisgICAgc3RyaW5nIHYyID0gcmVuZGVyX2NvbnN0X3ZhbHVlKHZhcnMsIG91dCwgbmFtZSwgdHlwZSwgdmFsdWUpOworICAgIGluZGVudChvdXQpIDw8ICJjb25zdCAiIDw8IG5hbWUgPDwgIiA9ICIgPDwgdjIgPDwgIjsiIDw8IGVuZGw7CisgIH0KK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OnByaW50X2NvbnN0X3ZhbHVlKHN0ZDo6b3N0cmVhbSYgdmFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKyAgdF90eXBlKiB0cnVldHlwZSA9IHR5cGU7CisgIHdoaWxlICh0cnVldHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgdHJ1ZXR5cGUgPSAoKHRfdHlwZWRlZiopdHJ1ZXR5cGUpLT5nZXRfdHlwZSgpOworICB9CisKKyAgaWYgKHRydWV0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIC8vIGFscmVhZHkgZG9uZQorICAgIC8vIHN0cmluZyB2MiA9IHJlbmRlcl9jb25zdF92YWx1ZSggdmFycywgb3V0LCBuYW1lLCB0eXBlLCB2YWx1ZSk7CisgICAgLy8gaW5kZW50X2ltcGwob3V0KSA8PCBuYW1lIDw8ICIgOj0gIiA8PCB2MiA8PCAiOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0cnVldHlwZS0+aXNfZW51bSgpKSB7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCBuYW1lIDw8ICIgOj0gIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIi4iIDw8IHZhbHVlLT5nZXRfaWRlbnRpZmllcl9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgIDw8ICI7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHN0cmluZyB0eXBuYW1lOworICAgIHR5cG5hbWUgPSB0eXBlX25hbWUodHJ1ZXR5cGUsIHRydWUsIGZhbHNlLCB0eXBlLT5pc194Y2VwdGlvbigpLCB0eXBlLT5pc194Y2VwdGlvbigpKTsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8IG5hbWUgPDwgIiA6PSAiIDw8IHR5cG5hbWUgPDwgIi5DcmVhdGU7IiA8PCBlbmRsOworICAgIHByaW50X2NvbnN0X2RlZl92YWx1ZSh2YXJzLCBvdXQsIG5hbWUsIHRydWV0eXBlLCB2YWx1ZSk7CisgIH0KK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmluaXRpYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiB2YXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7CisgIHByaW50X2NvbnN0X3ZhbHVlKHZhcnMsIG91dCwgbmFtZSwgdHlwZSwgdmFsdWUpOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6ZmluYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjbHNfbm0pIHsKKyAgKHZvaWQpb3V0OworICAodm9pZCluYW1lOworICAodm9pZCl0eXBlOworICAodm9pZCl2YWx1ZTsKKyAgKHZvaWQpY2xzX25tOworfQorCitzdHJpbmcgdF9kZWxwaGlfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUob3N0cmVhbSYgdmFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7CisgICh2b2lkKW5hbWU7CisKKyAgdF90eXBlKiB0cnVldHlwZSA9IHR5cGU7CisgIHdoaWxlICh0cnVldHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgdHJ1ZXR5cGUgPSAoKHRfdHlwZWRlZiopdHJ1ZXR5cGUpLT5nZXRfdHlwZSgpOworICB9CisKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHJlbmRlcjsKKworICBpZiAodHJ1ZXR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXRydWV0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZW5kZXIgPDwgIiciIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgIiciOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmVuZGVyIDw8ICgodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwKSA/ICJUcnVlIiA6ICJGYWxzZSIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJlbmRlciA8PCAiU2hvcnRJbnQoICIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIikiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZW5kZXIgPDwgIlNtYWxsSW50KCAiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICIpIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmVuZGVyIDw8ICJMb25nSW50KCAiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICIpIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmVuZGVyIDw8ICJJbnQ2NCggIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiKSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7CisgICAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiLjAiOyAvLyBtYWtlIGl0IGEgZG91YmxlIGNvbnN0YW50IGJ5IGFkZGluZyAiLjAiCisgICAgICB9IGVsc2UgeworICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICB9CisgIH0gZWxzZSBpZiAodHJ1ZXR5cGUtPmlzX2VudW0oKSkgeworICAgIHJlbmRlciA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UpIDw8ICIuIiA8PCB2YWx1ZS0+Z2V0X2lkZW50aWZpZXJfbmFtZSgpOworICB9IGVsc2UgeworICAgIHN0cmluZyB0ID0gdG1wKCJ0bXAiKTsKKyAgICB2YXJzIDw8ICIgICIgPDwgdCA8PCAiIDogIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIjsiIDw8IGVuZGw7CisgICAgcHJpbnRfY29uc3RfdmFsdWUodmFycywgb3V0LCB0LCB0eXBlLCB2YWx1ZSk7CisgICAgcmVuZGVyIDw8IHQ7CisgIH0KKworICByZXR1cm4gcmVuZGVyLnN0cigpOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3QodHN0cnVjdCwgZmFsc2UpOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgeworICBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0KHR4Y2VwdGlvbiwgdHJ1ZSk7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWxwaGlfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbikgeworICBpbmRlbnRfdXAoKTsKKyAgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF9kZWZpbml0aW9uKHNfc3RydWN0LCB0c3RydWN0LCBpc19leGNlcHRpb24pOworICBpbmRlbnRfZG93bigpOworCisgIGFkZF9kZWZpbmVkX3R5cGUodHN0cnVjdCk7CisKKyAgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF9pbXBsKHNfc3RydWN0X2ltcGwsICIiLCB0c3RydWN0LCBpc19leGNlcHRpb24pOworICBpZiAocmVnaXN0ZXJfdHlwZXNfKSB7CisgICAgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF90eXBlX2ZhY3Rvcnkoc190eXBlX2ZhY3RvcnlfZnVuY3MsICIiLCB0c3RydWN0LCBpc19leGNlcHRpb24pOworICAgIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfdHlwZV9mYWN0b3J5X3JlZ2lzdHJhdGlvbihzX3R5cGVfZmFjdG9yeV9yZWdpc3RyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19leGNlcHRpb24pOworICB9Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X2ltcGwob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY2xzX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194X2ZhY3RvcnkpIHsKKworICBpZiAoaXNfZXhjZXB0aW9uICYmICghaXNfeF9mYWN0b3J5KSkgeworICAgIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfaW1wbChvdXQsIGNsc19wcmVmaXgsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbiwgaXNfcmVzdWx0LCB0cnVlKTsKKyAgfQorCisgIHN0cmluZyBjbHNfbm07CisKKyAgc3RyaW5nIGV4Y2VwdGlvbl9mYWN0b3J5X25hbWU7CisKKyAgaWYgKGlzX2V4Y2VwdGlvbikgeworICAgIGV4Y2VwdGlvbl9mYWN0b3J5X25hbWUgPSBub3JtYWxpemVfY2xzbm0odHN0cnVjdC0+Z2V0X25hbWUoKSwgIiIsIHRydWUpICsgIkZhY3RvcnkiOworICB9CisKKyAgaWYgKGlzX2V4Y2VwdGlvbikgeworICAgIGNsc19ubSA9IHR5cGVfbmFtZSh0c3RydWN0LCB0cnVlLCAoIWlzX3hfZmFjdG9yeSksIGlzX3hfZmFjdG9yeSwgdHJ1ZSk7CisgIH0gZWxzZSB7CisgICAgY2xzX25tID0gdHlwZV9uYW1lKHRzdHJ1Y3QsIHRydWUsIGZhbHNlKTsKKyAgfQorCisgIHN0ZDo6b3N0cmluZ3N0cmVhbSB2YXJzLCBjb2RlOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgaW5kZW50X3VwX2ltcGwoKTsKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIHRfdHlwZSogdCA9ICgqbV9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICB3aGlsZSAodC0+aXNfdHlwZWRlZigpKSB7CisgICAgICB0ID0gKCh0X3R5cGVkZWYqKXQpLT5nZXRfdHlwZSgpOworICAgIH0KKyAgICBpZiAoKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7CisgICAgICBpbml0aWFsaXplX2ZpZWxkKHZhcnMsCisgICAgICAgICAgICAgICAgICAgICAgIGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICJGIiArIHByb3BfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCksIGlzX2V4Y2VwdGlvbiksCisgICAgICAgICAgICAgICAgICAgICAgIHQsCisgICAgICAgICAgICAgICAgICAgICAgICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkpOworICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgICAgaW5kZW50X2ltcGwoY29kZSkgPDwgIkZfX2lzc2V0XyIgPDwgcHJvcF9uYW1lKCgqbV9pdGVyKSwgaXNfZXhjZXB0aW9uKSA8PCAiIDo9IFRydWU7IgorICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgfQorICBpbmRlbnRfZG93bl9pbXBsKCk7CisKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiY29uc3RydWN0b3IgIiA8PCBjbHNfcHJlZml4IDw8IGNsc19ubSA8PCAiLiIKKyAgICAgICAgICAgICAgICAgICA8PCAiQ3JlYXRlOyIgPDwgZW5kbDsKKworICBpZiAoIXZhcnMuc3RyKCkuZW1wdHkoKSkgeworICAgIG91dCA8PCAidmFyIiA8PCBlbmRsOworICAgIG91dCA8PCB2YXJzLnN0cigpOworICB9CisKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisgIGlmIChpc19leGNlcHRpb24gJiYgKCFpc194X2ZhY3RvcnkpKSB7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiaW5oZXJpdGVkIENyZWF0ZSgnJyk7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudF9pbXBsKG91dCkgPDwgImluaGVyaXRlZDsiIDw8IGVuZGw7CisgIH0KKworICBpZiAoIWNvZGUuc3RyKCkuZW1wdHkoKSkgeworICAgIG91dCA8PCBjb2RlLnN0cigpOworICB9CisKKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaWYgKChtZW1iZXJzLnNpemUoKSA+IDApICYmIGlzX2V4Y2VwdGlvbiAmJiAoIWlzX3hfZmFjdG9yeSkpIHsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJjb25zdHJ1Y3RvciAiIDw8IGNsc19wcmVmaXggPDwgY2xzX25tIDw8ICIuIgorICAgICAgICAgICAgICAgICAgICAgPDwgIkNyZWF0ZSgiIDw8IGNvbnN0cnVjdG9yX2FyZ3VtZW50X2xpc3QodHN0cnVjdCwgaW5kZW50X2ltcGwoKSkgPDwgIik7IgorICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXBfaW1wbCgpOworICAgIGluZGVudF9pbXBsKG91dCkgPDwgIkNyZWF0ZTsiIDw8IGVuZGw7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgc3RyaW5nIHByb3BuYW1lID0gcHJvcF9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSwgaXNfZXhjZXB0aW9uKTsKKyAgICAgIHN0cmluZyBwYXJhbV9uYW1lID0gY29uc3RydWN0b3JfcGFyYW1fbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpOworICAgICAgaW5kZW50X2ltcGwob3V0KSA8PCBwcm9wbmFtZSA8PCAiIDo9ICIgPDwgcGFyYW1fbmFtZSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiVXBkYXRlTWVzc2FnZVByb3BlcnR5OyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bl9pbXBsKCk7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiZGVzdHJ1Y3RvciAiIDw8IGNsc19wcmVmaXggPDwgY2xzX25tIDw8ICIuIgorICAgICAgICAgICAgICAgICAgIDw8ICJEZXN0cm95OyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIHRfdHlwZSogdCA9ICgqbV9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICB3aGlsZSAodC0+aXNfdHlwZWRlZigpKSB7CisgICAgICB0ID0gKCh0X3R5cGVkZWYqKXQpLT5nZXRfdHlwZSgpOworICAgIH0KKyAgICBmaW5hbGl6ZV9maWVsZChvdXQsIHByb3BfbmFtZSgqbV9pdGVyLCBpc19leGNlcHRpb24pLCB0LCAoKm1faXRlciktPmdldF92YWx1ZSgpKTsKKyAgfQorCisgIGluZGVudF9pbXBsKG91dCkgPDwgImluaGVyaXRlZDsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGlmIChpc19leGNlcHRpb24gJiYgKCFpc194X2ZhY3RvcnkpKSB7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiZnVuY3Rpb24gIiA8PCBjbHNfcHJlZml4IDw8IGNsc19ubSA8PCAiLiIgPDwgZXhjZXB0aW9uX2ZhY3RvcnlfbmFtZQorICAgICAgICAgICAgICAgICAgICAgPDwgIjogSSIgPDwgZXhjZXB0aW9uX2ZhY3RvcnlfbmFtZSA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXBfaW1wbCgpOworICAgIGluZGVudF9pbXBsKG91dCkgPDwgImlmIEYiIDw8IGV4Y2VwdGlvbl9mYWN0b3J5X25hbWUgPDwgIiA9IG5pbCIgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJ0aGVuIEYiIDw8IGV4Y2VwdGlvbl9mYWN0b3J5X25hbWUgPDwgIiA6PSBUIiA8PCBleGNlcHRpb25fZmFjdG9yeV9uYW1lIDw8ICJJbXBsLkNyZWF0ZTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKG91dCkgPDwgInJlc3VsdCA6PSBGIiA8PCBleGNlcHRpb25fZmFjdG9yeV9uYW1lIDw8ICI7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKworICBpZiAodHN0cnVjdC0+aXNfdW5pb24oKSkgeworICAgIGluZGVudF9pbXBsKG91dCkgPDwgInByb2NlZHVyZSAiIDw8IGNsc19wcmVmaXggPDwgY2xzX25tIDw8ICIuIgorICAgICAgICAgICAgICAgICAgICAgPDwgIkNsZWFyVW5pb25WYWx1ZXM7IiA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKG91dCkgPDwgImJlZ2luIiA8PCBlbmRsOworICAgIGluZGVudF91cF9pbXBsKCk7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgdF90eXBlKiB0ID0gKCptX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgd2hpbGUgKHQtPmlzX3R5cGVkZWYoKSkgeworICAgICAgICB0ID0gKCh0X3R5cGVkZWYqKXQpLT5nZXRfdHlwZSgpOworICAgICAgfQorCisgICAgICBnZW5lcmF0ZV9kZWxwaGlfY2xlYXJfdW5pb25fdmFsdWUob3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsc19wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xzX25tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm1faXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfZXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzdHJ1Y3QtPmlzX3VuaW9uKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfeF9mYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbl9mYWN0b3J5X25hbWUpOworICAgIH0KKyAgICBpbmRlbnRfZG93bl9pbXBsKCk7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOworICB9CisKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIHRfdHlwZSogdCA9ICgqbV9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICB3aGlsZSAodC0+aXNfdHlwZWRlZigpKSB7CisgICAgICB0ID0gKCh0X3R5cGVkZWYqKXQpLT5nZXRfdHlwZSgpOworICAgIH0KKyAgICBnZW5lcmF0ZV9kZWxwaGlfcHJvcGVydHlfcmVhZGVyX2ltcGwob3V0LCBjbHNfcHJlZml4LCBjbHNfbm0sIHQsICptX2l0ZXIsICJGIiwgaXNfZXhjZXB0aW9uKTsKKyAgICBnZW5lcmF0ZV9kZWxwaGlfcHJvcGVydHlfd3JpdGVyX2ltcGwob3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHNfcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHNfbm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICptX2l0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfZXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0c3RydWN0LT5pc191bmlvbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc194X2ZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbl9mYWN0b3J5X25hbWUpOworICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICBnZW5lcmF0ZV9kZWxwaGlfaXNzZXRfcmVhZGVyX2ltcGwob3V0LCBjbHNfcHJlZml4LCBjbHNfbm0sIHQsICptX2l0ZXIsICJGIiwgaXNfZXhjZXB0aW9uKTsKKyAgICB9CisgIH0KKworICBpZiAoKCFpc19leGNlcHRpb24pIHx8IGlzX3hfZmFjdG9yeSkgeworICAgIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfcmVhZGVyX2ltcGwob3V0LCBjbHNfcHJlZml4LCB0c3RydWN0LCBpc19leGNlcHRpb24pOworICAgIGlmIChpc19yZXN1bHQpIHsKKyAgICAgIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfcmVzdWx0X3dyaXRlcl9pbXBsKG91dCwgY2xzX3ByZWZpeCwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKKyAgICB9IGVsc2UgeworICAgICAgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF93cml0ZXJfaW1wbChvdXQsIGNsc19wcmVmaXgsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7CisgICAgfQorICB9CisgIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfdG9zdHJpbmdfaW1wbChvdXQsIGNsc19wcmVmaXgsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbiwgaXNfeF9mYWN0b3J5KTsKKworICBpZiAoaXNfZXhjZXB0aW9uICYmIGlzX3hfZmFjdG9yeSkgeworICAgIGdlbmVyYXRlX2RlbHBoaV9jcmVhdGVfZXhjZXB0aW9uX2ltcGwob3V0LCBjbHNfcHJlZml4LCB0c3RydWN0LCBpc19leGNlcHRpb24pOworICB9Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpwcmludF9kZWxwaGlfc3RydWN0X3R5cGVfZmFjdG9yeV9mdW5jKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgc3RyaW5nIHN0cnVjdF9pbnRmX25hbWUgPSB0eXBlX25hbWUodHN0cnVjdCk7CisgIG91dCA8PCAiQ3JlYXRlXyI7CisgIG91dCA8PCBzdHJ1Y3RfaW50Zl9uYW1lOworICBvdXQgPDwgIl9JbXBsIjsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfdHlwZV9mYWN0b3J5KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY2xzX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hfZmFjdG9yeSkgeworICAodm9pZCljbHNfcHJlZml4OworICBpZiAoaXNfZXhjZXB0aW9uKQorICAgIHJldHVybjsKKyAgaWYgKGlzX3Jlc3VsdCkKKyAgICByZXR1cm47CisgIGlmIChpc194X2ZhY3RvcnkpCisgICAgcmV0dXJuOworCisgIHN0cmluZyBzdHJ1Y3RfaW50Zl9uYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QpOworICBzdHJpbmcgY2xzX25tID0gdHlwZV9uYW1lKHRzdHJ1Y3QsIHRydWUsIGZhbHNlKTsKKworICBvdXQgPDwgImZ1bmN0aW9uICI7CisgIHByaW50X2RlbHBoaV9zdHJ1Y3RfdHlwZV9mYWN0b3J5X2Z1bmMob3V0LCB0c3RydWN0KTsKKyAgb3V0IDw8ICI6ICI7CisgIG91dCA8PCBzdHJ1Y3RfaW50Zl9uYW1lOworICBvdXQgPDwgIjsiIDw8IGVuZGw7CisgIG91dCA8PCAiYmVnaW4iIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAiUmVzdWx0IDo9ICIgPDwgY2xzX25tIDw8ICIuQ3JlYXRlOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X3R5cGVfZmFjdG9yeV9yZWdpc3RyYXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY2xzX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194X2ZhY3RvcnkpIHsKKyAgKHZvaWQpY2xzX3ByZWZpeDsKKyAgaWYgKGlzX2V4Y2VwdGlvbikKKyAgICByZXR1cm47CisgIGlmIChpc19yZXN1bHQpCisgICAgcmV0dXJuOworICBpZiAoaXNfeF9mYWN0b3J5KQorICAgIHJldHVybjsKKworICBzdHJpbmcgc3RydWN0X2ludGZfbmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0KTsKKworICBpbmRlbnQob3V0KSA8PCAiICBUeXBlUmVnaXN0cnkuUmVnaXN0ZXJUeXBlRmFjdG9yeTwiIDw8IHN0cnVjdF9pbnRmX25hbWUgPDwgIj4oIjsKKyAgcHJpbnRfZGVscGhpX3N0cnVjdF90eXBlX2ZhY3RvcnlfZnVuYyhvdXQsIHRzdHJ1Y3QpOworICBvdXQgPDwgIik7IjsKKyAgb3V0IDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hfZmFjdG9yeSkgeworICBib29sIGlzX2ZpbmFsID0gKHRzdHJ1Y3QtPmFubm90YXRpb25zXy5maW5kKCJmaW5hbCIpICE9IHRzdHJ1Y3QtPmFubm90YXRpb25zXy5lbmQoKSk7CisgIHN0cmluZyBzdHJ1Y3RfaW50Zl9uYW1lOworICBzdHJpbmcgc3RydWN0X25hbWU7CisgIHN0cmluZyBpc3NldF9uYW1lOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIHN0cmluZyBleGNlcHRpb25fZmFjdG9yeV9uYW1lID0gbm9ybWFsaXplX2Nsc25tKHRzdHJ1Y3QtPmdldF9uYW1lKCksICIiLCB0cnVlKSArICJGYWN0b3J5IjsKKworICBpZiAoaXNfZXhjZXB0aW9uKSB7CisgICAgc3RydWN0X2ludGZfbmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0LCBmYWxzZSwgZmFsc2UsIHRydWUpOworICB9IGVsc2UgeworICAgIHN0cnVjdF9pbnRmX25hbWUgPSB0eXBlX25hbWUodHN0cnVjdCk7CisgIH0KKworICBpZiAoaXNfZXhjZXB0aW9uKSB7CisgICAgc3RydWN0X25hbWUgPSB0eXBlX25hbWUodHN0cnVjdCwgdHJ1ZSwgKCFpc194X2ZhY3RvcnkpLCBpc194X2ZhY3RvcnkpOworICB9IGVsc2UgeworICAgIHN0cnVjdF9uYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QsIHRydWUpOworICB9CisKKyAgaWYgKCghaXNfZXhjZXB0aW9uKSB8fCBpc194X2ZhY3RvcnkpIHsKKworICAgIGdlbmVyYXRlX2RlbHBoaV9kb2Mob3V0LCB0c3RydWN0KTsKKyAgICBpbmRlbnQob3V0KSA8PCBzdHJ1Y3RfaW50Zl9uYW1lIDw8ICIgPSBpbnRlcmZhY2UoSUJhc2UpIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgZ2VuZXJhdGVfZGVscGhpX3Byb3BlcnR5X3JlYWRlcl9kZWZpbml0aW9uKG91dCwgKm1faXRlciwgaXNfZXhjZXB0aW9uKTsKKyAgICAgIGdlbmVyYXRlX2RlbHBoaV9wcm9wZXJ0eV93cml0ZXJfZGVmaW5pdGlvbihvdXQsICptX2l0ZXIsIGlzX2V4Y2VwdGlvbik7CisgICAgfQorCisgICAgaWYgKGlzX3hfZmFjdG9yeSkgeworICAgICAgb3V0IDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiLy8gQ3JlYXRlIEV4Y2VwdGlvbiBPYmplY3QiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiZnVuY3Rpb24gQ3JlYXRlRXhjZXB0aW9uOiAiIDw8IHR5cGVfbmFtZSh0c3RydWN0LCB0cnVlLCB0cnVlKSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7CisgICAgICBvdXQgPDwgZW5kbDsKKyAgICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgICAgZ2VuZXJhdGVfcHJvcGVydHkob3V0LCAqbV9pdGVyLCB0cnVlLCBpc19leGNlcHRpb24pOworICAgICAgfQorICAgIH0KKworICAgIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKKyAgICAgIG91dCA8PCBlbmRsOworICAgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgICAgIGdlbmVyYXRlX2RlbHBoaV9pc3NldF9yZWFkZXJfZGVmaW5pdGlvbihvdXQsICptX2l0ZXIsIGlzX2V4Y2VwdGlvbik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7CisgICAgICBvdXQgPDwgZW5kbDsKKyAgICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgICAgICBpc3NldF9uYW1lID0gIl9faXNzZXRfIiArIHByb3BfbmFtZSgqbV9pdGVyLCBpc19leGNlcHRpb24pOworICAgICAgICAgIGluZGVudChvdXQpIDw8ICJwcm9wZXJ0eSAiIDw8IGlzc2V0X25hbWUgPDwgIjogU3lzdGVtLkJvb2xlYW4gcmVhZCBHZXQiIDw8IGlzc2V0X25hbWUgPDwgIjsiCisgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIGdlbmVyYXRlX2RlbHBoaV9kb2Mob3V0LCB0c3RydWN0KTsKKyAgaW5kZW50KG91dCkgPDwgc3RydWN0X25hbWUgPDwgIiA9ICI7CisgIGlmIChpc19maW5hbCkgeworICAgIG91dCA8PCAic2VhbGVkICI7CisgIH0KKyAgb3V0IDw8ICJjbGFzcygiOworICBpZiAoaXNfZXhjZXB0aW9uICYmICghaXNfeF9mYWN0b3J5KSkgeworICAgIG91dCA8PCAiVEV4Y2VwdGlvbiI7CisgIH0gZWxzZSB7CisgICAgb3V0IDw8ICJUSW50ZXJmYWNlZE9iamVjdCwgSUJhc2UsICIgPDwgc3RydWN0X2ludGZfbmFtZTsKKyAgfQorICBvdXQgPDwgIikiIDw8IGVuZGw7CisKKyAgaWYgKGlzX2V4Y2VwdGlvbiAmJiAoIWlzX3hfZmFjdG9yeSkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJ0eXBlIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfZGVmaW5pdGlvbihvdXQsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbiwgaW5fY2xhc3MsIGlzX3Jlc3VsdCwgdHJ1ZSk7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgInByaXZhdGUiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGlmIChpc19leGNlcHRpb24gJiYgKCFpc194X2ZhY3RvcnkpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIkYiIDw8IGV4Y2VwdGlvbl9mYWN0b3J5X25hbWUgPDwgIiA6IiA8PCBzdHJ1Y3RfaW50Zl9uYW1lIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgqbV9pdGVyLCBmYWxzZSwgIkYiLCBpc19leGNlcHRpb24pIDw8IGVuZGw7CisgIH0KKworICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7CisgICAgaW5kZW50KG91dCkgPDwgZW5kbDsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgICBpc3NldF9uYW1lID0gIkZfX2lzc2V0XyIgKyBwcm9wX25hbWUoKm1faXRlciwgaXNfZXhjZXB0aW9uKTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgaXNzZXRfbmFtZSA8PCAiOiBTeXN0ZW0uQm9vbGVhbjsiIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaW5kZW50KG91dCkgPDwgZW5kbDsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgZ2VuZXJhdGVfZGVscGhpX3Byb3BlcnR5X3JlYWRlcl9kZWZpbml0aW9uKG91dCwgKm1faXRlciwgaXNfZXhjZXB0aW9uKTsKKyAgICBnZW5lcmF0ZV9kZWxwaGlfcHJvcGVydHlfd3JpdGVyX2RlZmluaXRpb24ob3V0LCAqbV9pdGVyLCBpc19leGNlcHRpb24pOworICB9CisKKyAgaWYgKHRzdHJ1Y3QtPmlzX3VuaW9uKCkpIHsKKyAgICBvdXQgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiLy8gQ2xlYXIgdmFsdWVzKGZvciB1bmlvbidzIHByb3BlcnR5IHNldHRlcikiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgInByb2NlZHVyZSBDbGVhclVuaW9uVmFsdWVzOyIgPDwgZW5kbDsKKyAgfQorCisgIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKKyAgICBvdXQgPDwgZW5kbDsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgICBpc3NldF9uYW1lID0gIl9faXNzZXRfIiArIHByb3BfbmFtZSgqbV9pdGVyLCBpc19leGNlcHRpb24pOworICAgICAgICBpbmRlbnQob3V0KSA8PCAiZnVuY3Rpb24gR2V0IiA8PCBpc3NldF9uYW1lIDw8ICI6IFN5c3RlbS5Cb29sZWFuOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpbmRlbnRfZG93bigpOworCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGlmICgobWVtYmVycy5zaXplKCkgPiAwKSAmJiBpc19leGNlcHRpb24gJiYgKCFpc194X2ZhY3RvcnkpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImNvbnN0cnVjdG9yIENyZWF0ZTsgb3ZlcmxvYWQ7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJjb25zdHJ1Y3RvciBDcmVhdGUoIiA8PCBjb25zdHJ1Y3Rvcl9hcmd1bWVudF9saXN0KHRzdHJ1Y3QsIGluZGVudCgpKQorICAgICAgICAgICAgICAgIDw8ICIpOyBvdmVybG9hZDsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgImNvbnN0cnVjdG9yIENyZWF0ZTsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAiZGVzdHJ1Y3RvciBEZXN0cm95OyBvdmVycmlkZTsiIDw8IGVuZGw7CisKKyAgb3V0IDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJmdW5jdGlvbiBUb1N0cmluZzogc3RyaW5nOyBvdmVycmlkZTsiIDw8IGVuZGw7CisKKyAgaWYgKGlzX2V4Y2VwdGlvbiAmJiAoIWlzX3hfZmFjdG9yeSkpIHsKKyAgICBvdXQgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiLy8gRXhjZXB0aW9uIEZhY3RvcnkiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgImZ1bmN0aW9uICIgPDwgZXhjZXB0aW9uX2ZhY3RvcnlfbmFtZSA8PCAiOiAiIDw8IHN0cnVjdF9pbnRmX25hbWUgPDwgIjsiIDw8IGVuZGw7CisgIH0KKworICBpZiAoKCFpc19leGNlcHRpb24pIHx8IGlzX3hfZmFjdG9yeSkgeworICAgIG91dCA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIvLyBJQmFzZSIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAicHJvY2VkdXJlIFJlYWQoIGNvbnN0IGlwcm90OiBJUHJvdG9jb2wpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAicHJvY2VkdXJlIFdyaXRlKCBjb25zdCBvcHJvdDogSVByb3RvY29sKTsiIDw8IGVuZGw7CisgIH0KKworICBpZiAoaXNfZXhjZXB0aW9uICYmIGlzX3hfZmFjdG9yeSkgeworICAgIG91dCA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIvLyBDcmVhdGUgRXhjZXB0aW9uIE9iamVjdCIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiZnVuY3Rpb24gQ3JlYXRlRXhjZXB0aW9uOiAiIDw8IHR5cGVfbmFtZSh0c3RydWN0LCB0cnVlLCB0cnVlKSA8PCAiOyIgPDwgZW5kbDsKKyAgfQorCisgIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKKyAgICBvdXQgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiLy8gUHJvcGVydGllcyIgPDwgZW5kbDsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBnZW5lcmF0ZV9wcm9wZXJ0eShvdXQsICptX2l0ZXIsIHRydWUsIGlzX2V4Y2VwdGlvbik7CisgICAgfQorICB9CisKKyAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgeworICAgIG91dCA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIvLyBpc3NldCIgPDwgZW5kbDsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgICBpc3NldF9uYW1lID0gIl9faXNzZXRfIiArIHByb3BfbmFtZSgqbV9pdGVyLCBpc19leGNlcHRpb24pOworICAgICAgICBpbmRlbnQob3V0KSA8PCAicHJvcGVydHkgIiA8PCBpc3NldF9uYW1lIDw8ICI6IFN5c3RlbS5Cb29sZWFuIHJlYWQgR2V0IiA8PCBpc3NldF9uYW1lIDw8ICI7IgorICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgaW5kZW50X3VwKCk7CisgIGdlbmVyYXRlX2RlbHBoaV9kb2Moc19zZXJ2aWNlLCB0c2VydmljZSk7CisgIGluZGVudChzX3NlcnZpY2UpIDw8IG5vcm1hbGl6ZV9jbHNubShzZXJ2aWNlX25hbWVfLCAiVCIpIDw8ICIgPSBjbGFzcyIgPDwgZW5kbDsKKyAgaW5kZW50KHNfc2VydmljZSkgPDwgInB1YmxpYyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChzX3NlcnZpY2UpIDw8ICJ0eXBlIiA8PCBlbmRsOworICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAiZW5kOyIgPDwgZW5kbDsKKyAgaW5kZW50KHNfc2VydmljZSkgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UsZmFsc2UpOworICBpZihhc3luY18pIHsKKyAgICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSx0cnVlKTsKKyAgfQorfQorCisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlLCBib29sIGZvcl9hc3luYykgeworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19pZmFjZSA9ICIiOworICBzdHJpbmcgaWZhY2VfbmFtZSA9IGZvcl9hc3luYyA/ICJJQXN5bmMiIDogIklmYWNlIjsKKworICBpbmRlbnRfdXAoKTsKKworICBnZW5lcmF0ZV9kZWxwaGlfZG9jKHNfc2VydmljZSwgdHNlcnZpY2UpOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCksIHRydWUsIHRydWUpOworICAgIGV4dGVuZHNfaWZhY2UgPSBleHRlbmRzICsgIi4iICsgaWZhY2VfbmFtZTsKKyAgICBnZW5lcmF0ZV9kZWxwaGlfZG9jKHNfc2VydmljZSwgdHNlcnZpY2UpOworICAgIGluZGVudChzX3NlcnZpY2UpIDw8IGlmYWNlX25hbWUgPDwgIiA9IGludGVyZmFjZSgiIDw8IGV4dGVuZHNfaWZhY2UgPDwgIikiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KHNfc2VydmljZSkgPDwgaWZhY2VfbmFtZSA8PCAiID0gaW50ZXJmYWNlIiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X3VwKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGdlbmVyYXRlX2RlbHBoaV9kb2Moc19zZXJ2aWNlLCAqZl9pdGVyKTsKKyAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlciwgZm9yX2FzeW5jKSA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChzX3NlcnZpY2UpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9zdHJ1Y3QqIHRzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfZGVmaW5pdGlvbihzX3NlcnZpY2UsIHRzLCBmYWxzZSwgdHJ1ZSk7CisgICAgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF9pbXBsKHNfc2VydmljZV9pbXBsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVfY2xzbm0oc2VydmljZV9uYW1lXywgIlQiKSArICIuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgICBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKCpmX2l0ZXIpOworICB9Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIGluZGVudF91cCgpOworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19jbGllbnQgPSAiVEludGVyZmFjZWRPYmplY3QiOworICBzdHJpbmcgaW1wbGVtZW50cyA9IGFzeW5jXyA/ICJJZmFjZSwgSUFzeW5jIiA6ICJJZmFjZSI7CisKKyAgZ2VuZXJhdGVfZGVscGhpX2RvYyhzX3NlcnZpY2UsIHRzZXJ2aWNlKTsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLCB0cnVlLCB0cnVlKTsKKyAgICBleHRlbmRzX2NsaWVudCA9IGV4dGVuZHMgKyAiLlRDbGllbnQiOworICB9CisgIGluZGVudChzX3NlcnZpY2UpIDw8ICJUQ2xpZW50ID0gY2xhc3MoICIgPDwgZXh0ZW5kc19jbGllbnQgPDwgIiwgIiA8PCBpbXBsZW1lbnRzIDw8ICIpIiA8PCBlbmRsOworCisgIGluZGVudChzX3NlcnZpY2UpIDw8ICJwdWJsaWMiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGluZGVudChzX3NlcnZpY2UpIDw8ICJjb25zdHJ1Y3RvciBDcmVhdGUoIHByb3Q6IElQcm90b2NvbCk7IG92ZXJsb2FkOyIgPDwgZW5kbDsKKworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImNvbnN0cnVjdG9yICIgPDwgbm9ybWFsaXplX2Nsc25tKHNlcnZpY2VfbmFtZV8sICJUIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIuVENsaWVudC5DcmVhdGUoIHByb3Q6IElQcm90b2NvbCk7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImJlZ2luIiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIkNyZWF0ZSggcHJvdCwgcHJvdCApOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQoc19zZXJ2aWNlKQorICAgICAgPDwgImNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgaXByb3Q6IElQcm90b2NvbDsgY29uc3Qgb3Byb3Q6IElQcm90b2NvbCk7IG92ZXJsb2FkOyIgPDwgZW5kbDsKKworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImNvbnN0cnVjdG9yICIgPDwgbm9ybWFsaXplX2Nsc25tKHNlcnZpY2VfbmFtZV8sICJUIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIuVENsaWVudC5DcmVhdGUoIGNvbnN0IGlwcm90OiBJUHJvdG9jb2w7IGNvbnN0IG9wcm90OiBJUHJvdG9jb2wpOyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiaW5oZXJpdGVkIENyZWF0ZTsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiaXByb3RfIDo9IGlwcm90OyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJvcHJvdF8gOj0gb3Byb3Q7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisKKyAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgeworICAgIGluZGVudChzX3NlcnZpY2UpIDw8ICJwcm90ZWN0ZWQiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KHNfc2VydmljZSkgPDwgImlwcm90XzogSVByb3RvY29sOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAib3Byb3RfOiBJUHJvdG9jb2w7IiA8PCBlbmRsOworICAgIGluZGVudChzX3NlcnZpY2UpIDw8ICJzZXFpZF86IFN5c3RlbS5JbnRlZ2VyOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworCisgICAgaW5kZW50KHNfc2VydmljZSkgPDwgInB1YmxpYyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAicHJvcGVydHkgSW5wdXRQcm90b2NvbDogSVByb3RvY29sIHJlYWQgaXByb3RfOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAicHJvcGVydHkgT3V0cHV0UHJvdG9jb2w6IElQcm90b2NvbCByZWFkIG9wcm90XzsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGluZGVudChzX3NlcnZpY2UpIDw8ICJwcm90ZWN0ZWQiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGluZGVudChzX3NlcnZpY2UpIDw8ICIvLyBJZmFjZSIgPDwgZW5kbDsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICBnZW5lcmF0ZV9kZWxwaGlfZG9jKHNfc2VydmljZSwgKmZfaXRlcik7CisgICAgaW5kZW50KHNfc2VydmljZSkgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIsIGZhbHNlKSA8PCBlbmRsOworICB9CisKKyAgaWYoIGFzeW5jXykgeworICAgIGluZGVudChzX3NlcnZpY2UpIDw8IGVuZGw7CisgICAgaW5kZW50KHNfc2VydmljZSkgPDwgIi8vIElBc3luYyIgPDwgZW5kbDsKKyAgICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgICAgICBnZW5lcmF0ZV9kZWxwaGlfZG9jKHNfc2VydmljZSwgKmZfaXRlcik7CisgICAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlciwgdHJ1ZSkgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBpbmRlbnRfZG93bigpOworCisgIGluZGVudChzX3NlcnZpY2UpIDw8ICJwdWJsaWMiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIHN0cmluZyBmdWxsX2NscyA9IG5vcm1hbGl6ZV9jbHNubShzZXJ2aWNlX25hbWVfLCAiVCIpICsgIi5UQ2xpZW50IjsKKworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworCisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7CisgICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKworICAgIC8vIG9uZSBmb3Igc3luYyBvbmx5LCB0d28gZm9yIGFzeW5jK3N5bmMKKyAgICBpbnQgbW9kZSA9IGFzeW5jXyA/IDEgOiAwOworICAgIHdoaWxlKCBtb2RlID49IDApIHsKKyAgICAgIGJvb2wgZm9yX2FzeW5jID0gKG1vZGUgIT0gMCk7CisgICAgICBtb2RlLS07CisKKyAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlciwgZm9yX2FzeW5jLCBmdWxsX2NscykgPDwgZW5kbDsKKyAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXBfaW1wbCgpOworCisgICAgICB0X3R5cGUqIHR0eXBlID0gKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpOworICAgICAgaWYoIGZvcl9hc3luYykgeworICAgICAgICBpZiAoaXNfdm9pZCh0dHlwZSkpIHsKKyAgICAgICAgICAgLy8gRGVscGhpIGZvcmNlcyB1cyB0byBzcGVjaWZ5IGEgdHlwZSB3aXRoIElGdXR1cmU8VD4sIHNvIHdlIHVzZSBJbnRlZ2VyPTAgZm9yIHZvaWQgbWV0aG9kcworICAgICAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAicmVzdWx0IDo9IFRUYXNrLkZ1dHVyZTxTeXN0ZW0uSW50ZWdlcj4oZnVuY3Rpb246IFN5c3RlbS5JbnRlZ2VyIiA8PCBlbmRsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHN0cmluZyByZXR0eXBlID0gdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsIHRydWUpOworICAgICAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAicmVzdWx0IDo9IFRUYXNrLkZ1dHVyZTwiIDw8IHJldHR5cGUgPDwgIj4oZnVuY3Rpb246ICIgPDwgcmV0dHlwZSA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cF9pbXBsKCk7CisgICAgICB9CisKKyAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAic2VuZF8iIDw8IGZ1bm5hbWUgPDwgIigiOworCisgICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgICAgIGlmIChmaXJzdCkgeworICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc19zZXJ2aWNlX2ltcGwgPDwgIiwgIjsKKyAgICAgICAgfQorICAgICAgICBzX3NlcnZpY2VfaW1wbCA8PCBub3JtYWxpemVfbmFtZSgoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgICB9CisgICAgICBzX3NlcnZpY2VfaW1wbCA8PCAiKTsiIDw8IGVuZGw7CisKKyAgICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgICBzX3NlcnZpY2VfaW1wbCA8PCBpbmRlbnRfaW1wbCgpOworICAgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgICAgc19zZXJ2aWNlX2ltcGwgPDwgIlJlc3VsdCA6PSAiOworICAgICAgICB9CisgICAgICAgIHNfc2VydmljZV9pbXBsIDw8ICJyZWN2XyIgPDwgZnVubmFtZSA8PCAiKCk7IiA8PCBlbmRsOworICAgICAgfQorCisgICAgICBpZiggZm9yX2FzeW5jKSB7CisgICAgICAgIGlmIChpc192b2lkKHR0eXBlKSkgeworICAgICAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiUmVzdWx0IDo9IDA7IiA8PCBlbmRsOyAgLy8gbm8gSUZ1dHVyZTx2b2lkPiBpbiBEZWxwaGkKKyAgICAgICAgfQorICAgICAgICBpbmRlbnRfZG93bl9pbXBsKCk7CisgICAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZW5kKTsiIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOworICAgIH0KKworICAgIHRfZnVuY3Rpb24gc2VuZF9mdW5jdGlvbihnX3R5cGVfdm9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJzZW5kXyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF9hcmdsaXN0KCkpOworCisgICAgc3RyaW5nIGFyZ3NuYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKKyAgICBzdHJpbmcgYXJnc19jbHNubSA9IG5vcm1hbGl6ZV9jbHNubShhcmdzbmFtZSwgIlQiKTsKKyAgICBzdHJpbmcgYXJnc19pbnRmbm0gPSBub3JtYWxpemVfY2xzbm0oYXJnc25hbWUsICJJIik7CisKKyAgICBzdHJpbmcgYXJnc3ZhciA9IHRtcCgiX2FyZ3MiKTsKKyAgICBzdHJpbmcgbXNndmFyID0gdG1wKCJfbXNnIik7CisKKyAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnNlbmRfZnVuY3Rpb24sIGZhbHNlKSA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnNlbmRfZnVuY3Rpb24sIGZhbHNlLCBmdWxsX2NscykgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInZhciIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXBfaW1wbCgpOworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCBhcmdzdmFyIDw8ICIgOiAiIDw8IGFyZ3NfaW50Zm5tIDw8ICI7IiA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCBtc2d2YXIgPDwgIiA6IFRocmlmdC5Qcm90b2NvbC5UVGhyaWZ0TWVzc2FnZTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd25faW1wbCgpOworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwX2ltcGwoKTsKKworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAic2VxaWRfIDo9IHNlcWlkXyArIDE7IiA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiVGhyaWZ0LlByb3RvY29sLkluaXQoICIgPDwgbXNndmFyIDw8ICIsICciIDw8IGZ1bm5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIicsICIgPDwgKCgqZl9pdGVyKS0+aXNfb25ld2F5KCkgPyAiVE1lc3NhZ2VUeXBlLk9uZXdheSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiVE1lc3NhZ2VUeXBlLkNhbGwiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCBzZXFpZF8pOyIgPDwgZW5kbDsKKworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAib3Byb3RfLldyaXRlTWVzc2FnZUJlZ2luKCAiIDw8IG1zZ3ZhciA8PCAiICk7IiA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCBhcmdzdmFyIDw8ICIgOj0gIiA8PCBhcmdzX2Nsc25tIDw8ICJJbXBsLkNyZWF0ZSgpOyIgPDwgZW5kbDsKKworICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgYXJnc3ZhciA8PCAiLiIgPDwgcHJvcF9uYW1lKCpmbGRfaXRlcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIDo9ICIgPDwgbm9ybWFsaXplX25hbWUoKCpmbGRfaXRlciktPmdldF9uYW1lKCkpIDw8ICI7IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCBhcmdzdmFyIDw8ICIuV3JpdGUob3Byb3RfKTsiIDw8IGVuZGw7CisgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCBhcmdzdmFyIDw8ICIuIiA8PCBwcm9wX25hbWUoKmZsZF9pdGVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgOj0gIiA8PCBlbXB0eV92YWx1ZSgoKmZsZF9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJvcHJvdF8uV3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAib3Byb3RfLlRyYW5zcG9ydC5GbHVzaCgpOyIgPDwgZW5kbDsKKworICAgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgc3RyaW5nIG9yZ19yZXN1bHRuYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOworICAgICAgc3RyaW5nIHJlc3VsdF9jbHNubSA9IG5vcm1hbGl6ZV9jbHNubShvcmdfcmVzdWx0bmFtZSwgIlQiKTsKKyAgICAgIHN0cmluZyByZXN1bHRfaW50Zm5tID0gbm9ybWFsaXplX2Nsc25tKG9yZ19yZXN1bHRuYW1lLCAiSSIpOworCisgICAgICB0X3N0cnVjdCBub2FyZ3MocHJvZ3JhbV8pOworICAgICAgdF9mdW5jdGlvbiByZWN2X2Z1bmN0aW9uKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInJlY3ZfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5vYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKSk7CisKKyAgICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOworICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKworICAgICAgc3RyaW5nIGV4Y2VwdHZhciA9IHRtcCgiX2V4Iik7CisgICAgICBzdHJpbmcgYXBwZXh2YXIgPSB0bXAoIl9heCIpOworICAgICAgc3RyaW5nIHJldHZhciA9IHRtcCgiX3JldCIpOworCisgICAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnJlY3ZfZnVuY3Rpb24sIGZhbHNlKSA8PCBlbmRsOworICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmcmVjdl9mdW5jdGlvbiwgZmFsc2UsIGZ1bGxfY2xzKSA8PCBlbmRsOworICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJ2YXIiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXBfaW1wbCgpOworICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8IG1zZ3ZhciA8PCAiIDogVGhyaWZ0LlByb3RvY29sLlRUaHJpZnRNZXNzYWdlOyIgPDwgZW5kbDsKKyAgICAgIGlmICh4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgeworICAgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgZXhjZXB0dmFyIDw8ICIgOiBFeGNlcHRpb247IiA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8IGFwcGV4dmFyIDw8ICIgOiBUQXBwbGljYXRpb25FeGNlcHRpb247IiA8PCBlbmRsOworICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8IHJldHZhciA8PCAiIDogIiA8PCByZXN1bHRfaW50Zm5tIDw8ICI7IiA8PCBlbmRsOworCisgICAgICBpbmRlbnRfZG93bl9pbXBsKCk7CisgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImJlZ2luIiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwX2ltcGwoKTsKKyAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCBtc2d2YXIgPDwgIiA6PSBpcHJvdF8uUmVhZE1lc3NhZ2VCZWdpbigpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiaWYgKCIgPDwgbXNndmFyIDw8ICIuVHlwZV8gPSBUTWVzc2FnZVR5cGUuRXhjZXB0aW9uKSB0aGVuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImJlZ2luIiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwX2ltcGwoKTsKKyAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCBhcHBleHZhciA8PCAiIDo9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5SZWFkKGlwcm90Xyk7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJpcHJvdF8uUmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInJhaXNlICIgPDwgYXBwZXh2YXIgPDwgIjsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bl9pbXBsKCk7CisgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGw7CisKKyAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCByZXR2YXIgPDwgIiA6PSAiIDw8IHJlc3VsdF9jbHNubSA8PCAiSW1wbC5DcmVhdGUoKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgcmV0dmFyIDw8ICIuUmVhZChpcHJvdF8pOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiaXByb3RfLlJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOworCisgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiaWYgKCIgPDwgcmV0dmFyIDw8ICIuX19pc3NldF9zdWNjZXNzKSB0aGVuIiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImJlZ2luIiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXBfaW1wbCgpOworICAgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIlJlc3VsdCA6PSAiIDw8IHJldHZhciA8PCAiLlN1Y2Nlc3M7IiA8PCBlbmRsOworICAgICAgICB0X3R5cGUqIHR5cGUgPSAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCk7CisgICAgICAgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpIHx8IHR5cGUtPmlzX21hcCgpIHx8IHR5cGUtPmlzX2xpc3QoKQorICAgICAgICAgICAgfHwgdHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgcmV0dmFyIDw8ICIuU3VjY2VzcyA6PSBuaWw7IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiRXhpdDsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsOworICAgICAgfQorCisgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImlmICgiIDw8IHJldHZhciA8PCAiLl9faXNzZXRfIiA8PCBwcm9wX25hbWUoKnhfaXRlcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIpIHRoZW4iIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cF9pbXBsKCk7CisgICAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCBleGNlcHR2YXIgPDwgIiA6PSAiIDw8IHJldHZhciA8PCAiLiIgPDwgcHJvcF9uYW1lKCp4X2l0ZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLkNyZWF0ZUV4Y2VwdGlvbjsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAicmFpc2UgIiA8PCBleGNlcHR2YXIgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsOworICAgICAgfQorCisgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKQorICAgICAgICAgICAgPDwgInJhaXNlIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbk1pc3NpbmdSZXN1bHQuQ3JlYXRlKCciCisgICAgICAgICAgICA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiBmYWlsZWQ6IHVua25vd24gcmVzdWx0Jyk7IiA8PCBlbmRsOworICAgICAgfQorCisgICAgICBpbmRlbnRfZG93bl9pbXBsKCk7CisgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19wcm9jZXNzb3IgPSAiIjsKKworICBzdHJpbmcgZnVsbF9jbHMgPSBub3JtYWxpemVfY2xzbm0oc2VydmljZV9uYW1lXywgIlQiKSArICIuVFByb2Nlc3NvckltcGwiOworCisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSwgdHJ1ZSwgdHJ1ZSk7CisgICAgZXh0ZW5kc19wcm9jZXNzb3IgPSBleHRlbmRzICsgIi5UUHJvY2Vzc29ySW1wbCI7CisgICAgaW5kZW50KHNfc2VydmljZSkgPDwgIlRQcm9jZXNzb3JJbXBsID0gY2xhc3MoIiA8PCBleHRlbmRzX3Byb2Nlc3NvciA8PCAiLCBJUHJvY2Vzc29yKSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAiVFByb2Nlc3NvckltcGwgPSBjbGFzcyggVEludGVyZmFjZWRPYmplY3QsIElQcm9jZXNzb3IpIiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50KHNfc2VydmljZSkgPDwgInB1YmxpYyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChzX3NlcnZpY2UpIDw8ICJjb25zdHJ1Y3RvciBDcmVhdGUoIGlmYWNlXzogSWZhY2UgKTsiIDw8IGVuZGw7CisgIGluZGVudChzX3NlcnZpY2UpIDw8ICJkZXN0cnVjdG9yIERlc3Ryb3k7IG92ZXJyaWRlOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImNvbnN0cnVjdG9yICIgPDwgZnVsbF9jbHMgPDwgIi5DcmVhdGUoIGlmYWNlXzogSWZhY2UgKTsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJpbmhlcml0ZWQgQ3JlYXRlKCBpZmFjZV8pOyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImluaGVyaXRlZCBDcmVhdGU7IiA8PCBlbmRsOworICB9CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiU2VsZi5pZmFjZV8gOj0gaWZhY2VfOyIgPDwgZW5kbDsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIkFTU0VSVCggcHJvY2Vzc01hcF8gPD4gbmlsKTsgIC8vIGluaGVyaXRlZCIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkKKyAgICAgICAgPDwgInByb2Nlc3NNYXBfIDo9IFRUaHJpZnREaWN0aW9uYXJ5SW1wbDxzdHJpbmcsIFRQcm9jZXNzRnVuY3Rpb24+LkNyZWF0ZTsiIDw8IGVuZGw7CisgIH0KKworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAicHJvY2Vzc01hcF8uQWRkT3JTZXRWYWx1ZSggJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiX1Byb2Nlc3MpOyIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZGVzdHJ1Y3RvciAiIDw8IGZ1bGxfY2xzIDw8ICIuRGVzdHJveTsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiaW5oZXJpdGVkOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAicHJpdmF0ZSIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChzX3NlcnZpY2UpIDw8ICJpZmFjZV86IElmYWNlOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgPT0gTlVMTCkgeworICAgIGluZGVudChzX3NlcnZpY2UpIDw8ICJwcm90ZWN0ZWQiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KHNfc2VydmljZSkgPDwgInR5cGUiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KHNfc2VydmljZSkgPDwgIlRQcm9jZXNzRnVuY3Rpb24gPSByZWZlcmVuY2UgdG8gcHJvY2VkdXJlKCBzZXFpZDogU3lzdGVtLkludGVnZXI7IGNvbnN0IGlwcm90OiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIklQcm90b2NvbDsgY29uc3Qgb3Byb3Q6IElQcm90b2NvbCIKKyAgICAgICAgICAgICAgICAgICAgICA8PCAoZXZlbnRzXyA/ICI7IGNvbnN0IGV2ZW50cyA6IElSZXF1ZXN0RXZlbnRzIiA6ICIiKSA8PCAiKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChzX3NlcnZpY2UpIDw8ICJwcm90ZWN0ZWQiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KHNfc2VydmljZSkgPDwgInByb2Nlc3NNYXBfOiBJVGhyaWZ0RGljdGlvbmFyeTxzdHJpbmcsIFRQcm9jZXNzRnVuY3Rpb24+OyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgaW5kZW50KHNfc2VydmljZSkgPDwgInB1YmxpYyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAiZnVuY3Rpb24gUHJvY2VzcyggY29uc3QgaXByb3Q6IElQcm90b2NvbDsgY29uc3Qgb3Byb3Q6IElQcm90b2NvbDsgY29uc3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJldmVudHMgOiBJUHJvY2Vzc29yRXZlbnRzKTogU3lzdGVtLkJvb2xlYW47IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChzX3NlcnZpY2UpIDw8ICJmdW5jdGlvbiBQcm9jZXNzKCBjb25zdCBpcHJvdDogSVByb3RvY29sOyBjb25zdCBvcHJvdDogSVByb3RvY29sOyBjb25zdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgImV2ZW50cyA6IElQcm9jZXNzb3JFdmVudHMpOiBTeXN0ZW0uQm9vbGVhbjsgcmVpbnRyb2R1Y2U7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJmdW5jdGlvbiAiIDw8IGZ1bGxfY2xzIDw8ICIuUHJvY2VzcyggY29uc3QgaXByb3Q6IElQcm90b2NvbDsgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnN0IG9wcm90OiBJUHJvdG9jb2w7IGNvbnN0IGV2ZW50cyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOiBJUHJvY2Vzc29yRXZlbnRzKTogU3lzdGVtLkJvb2xlYW47IiA8PCBlbmRsOworICA7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAidmFyIiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIm1zZyA6IFRocmlmdC5Qcm90b2NvbC5UVGhyaWZ0TWVzc2FnZTsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZm4gOiBUUHJvY2Vzc0Z1bmN0aW9uOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJ4IDogVEFwcGxpY2F0aW9uRXhjZXB0aW9uOyIgPDwgZW5kbDsKKyAgaWYgKGV2ZW50c18pIHsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImNvbnRleHQgOiBJUmVxdWVzdEV2ZW50czsiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImJlZ2luIiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInRyeSIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJtc2cgOj0gaXByb3QuUmVhZE1lc3NhZ2VCZWdpbigpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJmbiA6PSBuaWw7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImlmIG5vdCBwcm9jZXNzTWFwXy5UcnlHZXRWYWx1ZShtc2cuTmFtZSwgZm4pIiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIm9yIG5vdCBBc3NpZ25lZChmbikgdGhlbiIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJUUHJvdG9jb2xVdGlsLlNraXAoaXByb3QsIFRUeXBlLlN0cnVjdCk7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImlwcm90LlJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInggOj0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRBcHBsaWNhdGlvbkV4Y2VwdGlvblVua25vd25NZXRob2QuQ3JlYXRlKCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICInSW52YWxpZCBtZXRob2QgbmFtZTogJycnICsgbXNnLk5hbWUgKyAnJycnKTsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKQorICAgICAgPDwgIlRocmlmdC5Qcm90b2NvbC5Jbml0KCBtc2csIG1zZy5OYW1lLCBUTWVzc2FnZVR5cGUuRXhjZXB0aW9uLCBtc2cuU2VxSUQpOyIKKyAgICAgIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAib3Byb3QuV3JpdGVNZXNzYWdlQmVnaW4oIG1zZyk7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInguV3JpdGUob3Byb3QpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJvcHJvdC5Xcml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAib3Byb3QuVHJhbnNwb3J0LkZsdXNoKCk7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIlJlc3VsdCA6PSBUcnVlOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJFeGl0OyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGw7CisgIGlmIChldmVudHNfKSB7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJpZiBldmVudHMgPD4gbmlsIiA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAidGhlbiBjb250ZXh0IDo9IGV2ZW50cy5DcmVhdGVSZXF1ZXN0Q29udGV4dChtc2cuTmFtZSkiIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbHNlIGNvbnRleHQgOj0gbmlsOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInRyeSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXBfaW1wbCgpOworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZm4obXNnLlNlcUlELCBpcHJvdCwgb3Byb3QsIGNvbnRleHQpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bl9pbXBsKCk7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJmaW5hbGx5IiA8PCBlbmRsOworICAgIGluZGVudF91cF9pbXBsKCk7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJpZiBjb250ZXh0IDw+IG5pbCB0aGVuIGJlZ2luIiA8PCBlbmRsOworICAgIGluZGVudF91cF9pbXBsKCk7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJjb250ZXh0LkNsZWFudXBDb250ZXh0OyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImNvbnRleHQgOj0gbmlsOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bl9pbXBsKCk7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJmbihtc2cuU2VxSUQsIGlwcm90LCBvcHJvdCk7IiA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJleGNlcHQiIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAib24gVFRyYW5zcG9ydEV4Y2VwdGlvblRpbWVkT3V0IGRvIGJlZ2luIiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIlJlc3VsdCA6PSBUcnVlOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJFeGl0OyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZWxzZSBiZWdpbiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJSZXN1bHQgOj0gRmFsc2U7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIkV4aXQ7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZW5kOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiUmVzdWx0IDo9IFRydWU7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0c2VydmljZSwgKmZfaXRlcik7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICByZXR1cm47CisgIH0KKworICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7CisgIHRfZmllbGQgc3VjY2Vzcyh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksICJTdWNjZXNzIiwgMCk7CisgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKKyAgfQorCisgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHJlc3VsdC5hcHBlbmQoKmZfaXRlcik7CisgIH0KKworICBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X2RlZmluaXRpb24oc19zZXJ2aWNlLCAmcmVzdWx0LCBmYWxzZSwgdHJ1ZSwgdHJ1ZSk7CisgIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfaW1wbChzX3NlcnZpY2VfaW1wbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZV9jbHNubShzZXJ2aWNlX25hbWVfLCAiVCIpICsgIi4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgICh2b2lkKXRzZXJ2aWNlOworICBzdHJpbmcgZnVuY25hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCk7CisgIHN0cmluZyBmdWxsX2NscyA9IG5vcm1hbGl6ZV9jbHNubShzZXJ2aWNlX25hbWVfLCAiVCIpICsgIi5UUHJvY2Vzc29ySW1wbCI7CisKKyAgc3RyaW5nIG9yZ19hcmdzbmFtZSA9IGZ1bmNuYW1lICsgIl9hcmdzIjsKKyAgc3RyaW5nIGFyZ3NfY2xzbm0gPSBub3JtYWxpemVfY2xzbm0ob3JnX2FyZ3NuYW1lLCAiVCIpOworICBzdHJpbmcgYXJnc19pbnRmbm0gPSBub3JtYWxpemVfY2xzbm0ob3JnX2FyZ3NuYW1lLCAiSSIpOworCisgIHN0cmluZyBvcmdfcmVzdWx0bmFtZSA9IGZ1bmNuYW1lICsgIl9yZXN1bHQiOworICBzdHJpbmcgcmVzdWx0X2Nsc25tID0gbm9ybWFsaXplX2Nsc25tKG9yZ19yZXN1bHRuYW1lLCAiVCIpOworICBzdHJpbmcgcmVzdWx0X2ludGZubSA9IG5vcm1hbGl6ZV9jbHNubShvcmdfcmVzdWx0bmFtZSwgIkkiKTsKKworICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAicHJvY2VkdXJlICIgPDwgZnVuY25hbWUKKyAgICAgICAgICAgICAgICAgICAgPDwgIl9Qcm9jZXNzKCBzZXFpZDogU3lzdGVtLkludGVnZXI7IGNvbnN0IGlwcm90OiBJUHJvdG9jb2w7IGNvbnN0IG9wcm90OiBJUHJvdG9jb2wiCisgICAgICAgICAgICAgICAgICAgIDw8IChldmVudHNfID8gIjsgY29uc3QgZXZlbnRzIDogSVJlcXVlc3RFdmVudHMiIDogIiIpIDw8ICIpOyIgPDwgZW5kbDsKKworICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiLy8gb25lIHdheSBwcm9jZXNzb3IiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICIvLyBib3RoIHdheSBwcm9jZXNzb3IiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkKKyAgICAgIDw8ICJwcm9jZWR1cmUgIiA8PCBmdWxsX2NscyA8PCAiLiIgPDwgZnVuY25hbWUKKyAgICAgIDw8ICJfUHJvY2Vzcyggc2VxaWQ6IFN5c3RlbS5JbnRlZ2VyOyBjb25zdCBpcHJvdDogSVByb3RvY29sOyBjb25zdCBvcHJvdDogSVByb3RvY29sIgorICAgICAgPDwgKGV2ZW50c18gPyAiOyBjb25zdCBldmVudHMgOiBJUmVxdWVzdEV2ZW50cyIgOiAiIikgPDwgIik7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInZhciIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJhcmdzOiAiIDw8IGFyZ3NfaW50Zm5tIDw8ICI7IiA8PCBlbmRsOworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIm1zZzogVGhyaWZ0LlByb3RvY29sLlRUaHJpZnRNZXNzYWdlOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInJldDogIiA8PCByZXN1bHRfaW50Zm5tIDw8ICI7IiA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiYXBweCA6IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisKKyAgaWYgKGV2ZW50c18pIHsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImlmIGV2ZW50cyA8PiBuaWwgdGhlbiBldmVudHMuUHJlUmVhZDsiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJhcmdzIDo9ICIgPDwgYXJnc19jbHNubSA8PCAiSW1wbC5DcmVhdGU7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImFyZ3MuUmVhZChpcHJvdCk7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImlwcm90LlJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOworICBpZiAoZXZlbnRzXykgeworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiaWYgZXZlbnRzIDw+IG5pbCB0aGVuIGV2ZW50cy5Qb3N0UmVhZDsiIDw8IGVuZGw7CisgIH0KKworICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworCisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAicmV0IDo9ICIgPDwgcmVzdWx0X2Nsc25tIDw8ICJJbXBsLkNyZWF0ZTsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInRyeSIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKworICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgc19zZXJ2aWNlX2ltcGwgPDwgaW5kZW50X2ltcGwoKTsKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgIHNfc2VydmljZV9pbXBsIDw8ICJyZXQuU3VjY2VzcyA6PSAiOworICB9CisgIHNfc2VydmljZV9pbXBsIDw8ICJpZmFjZV8uIiA8PCBub3JtYWxpemVfbmFtZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCksIHRydWUpIDw8ICIoIjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBzX3NlcnZpY2VfaW1wbCA8PCAiLCAiOworICAgIH0KKyAgICBzX3NlcnZpY2VfaW1wbCA8PCAiYXJncy4iIDw8IHByb3BfbmFtZSgqZl9pdGVyKTsKKyAgfQorICBzX3NlcnZpY2VfaW1wbCA8PCAiKTsiIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImFyZ3MuIiA8PCBwcm9wX25hbWUoKmZfaXRlcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiA6PSAiIDw8IGVtcHR5X3ZhbHVlKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIjsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZXhjZXB0IiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworCisgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJvbiBFOiAiIDw8IHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCksIHRydWUsIHRydWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgZG8gYmVnaW4iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwX2ltcGwoKTsKKyAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICAgIHN0cmluZyBmYWN0b3J5X25hbWUgPSBub3JtYWxpemVfY2xzbm0oKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpLCAiIiwgdHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJGYWN0b3J5IjsKKyAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAicmV0LiIgPDwgcHJvcF9uYW1lKCp4X2l0ZXIpIDw8ICIgOj0gRS4iIDw8IGZhY3RvcnlfbmFtZSA8PCAiOyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bl9pbXBsKCk7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJvbiBFOiBFeGNlcHRpb24gZG8gYmVnaW4iIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisgIGlmKGV2ZW50c18pIHsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImlmIGV2ZW50cyA8PiBuaWwgdGhlbiBldmVudHMuVW5oYW5kbGVkRXJyb3IoRSk7IiA8PCBlbmRsOworICB9CisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiYXBweCA6PSBUQXBwbGljYXRpb25FeGNlcHRpb25JbnRlcm5hbEVycm9yLkNyZWF0ZShFLk1lc3NhZ2UpOyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInRyeSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXBfaW1wbCgpOworICAgIGlmKGV2ZW50c18pIHsKKyAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiaWYgZXZlbnRzIDw+IG5pbCB0aGVuIGV2ZW50cy5QcmVXcml0ZTsiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiVGhyaWZ0LlByb3RvY29sLkluaXQoIG1zZywgJyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICInLCBUTWVzc2FnZVR5cGUuRXhjZXB0aW9uLCBzZXFpZCk7IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAib3Byb3QuV3JpdGVNZXNzYWdlQmVnaW4oIG1zZyk7IiA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiYXBweC5Xcml0ZShvcHJvdCk7IiA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAib3Byb3QuV3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAib3Byb3QuVHJhbnNwb3J0LkZsdXNoKCk7IiA8PCBlbmRsOworICAgIGlmKGV2ZW50c18pIHsKKyAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiaWYgZXZlbnRzIDw+IG5pbCB0aGVuIGV2ZW50cy5Qb3N0V3JpdGU7IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIkV4aXQ7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImZpbmFsbHkiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwX2ltcGwoKTsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImFwcHguRnJlZTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd25faW1wbCgpOworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZW5kOyIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZW5kOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZW5kOyIgPDwgZW5kbDsKKworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBpZiAoZXZlbnRzXykgeworICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJpZiBldmVudHMgPD4gbmlsIHRoZW4gZXZlbnRzLlByZVdyaXRlOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJUaHJpZnQuUHJvdG9jb2wuSW5pdCggbXNnLCAnIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIicsIFRNZXNzYWdlVHlwZS5SZXBseSwgc2VxaWQpOyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJvcHJvdC5Xcml0ZU1lc3NhZ2VCZWdpbiggbXNnKTsgIiA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAicmV0LldyaXRlKG9wcm90KTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJvcHJvdC5Xcml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJvcHJvdC5UcmFuc3BvcnQuRmx1c2goKTsiIDw8IGVuZGw7CisgICAgaWYgKGV2ZW50c18pIHsKKyAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiaWYgZXZlbnRzIDw+IG5pbCB0aGVuIGV2ZW50cy5Qb3N0V3JpdGU7IiA8PCBlbmRsOworICAgIH0KKyAgfSBlbHNlIGlmIChldmVudHNfKSB7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJpZiBldmVudHMgPD4gbmlsIHRoZW4gZXZlbnRzLk9uZXdheUNvbXBsZXRlOyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvc3RyZWFtJiBsb2NhbF92YXJzKSB7CisgIHRfdHlwZSogdHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKKyAgd2hpbGUgKHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHR5cGUgPSAoKHRfdHlwZWRlZiopdHlwZSktPmdldF90eXBlKCk7CisgIH0KKworICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgIH0KKworICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHByb3BfbmFtZSh0ZmllbGQsIGlzX3hjZXB0aW9uKTsKKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbmFtZSwgIiIpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG91dCwgaXNfeGNlcHRpb24sIHR5cGUsIG5hbWUsIGxvY2FsX3ZhcnMpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgeworICAgIGluZGVudF9pbXBsKG91dCkgPDwgbmFtZSA8PCAiIDo9ICI7CisKKyAgICBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICBvdXQgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlKSA8PCAiKCI7CisgICAgfQorCisgICAgb3V0IDw8ICJpcHJvdC4iOworCisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgICAgaWYgKGFuc2lzdHJfYmluYXJ5XykgeworICAgICAgICAgICAgb3V0IDw8ICJSZWFkQW5zaVN0cmluZygpOyI7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG91dCA8PCAiUmVhZEJpbmFyeSgpOyI7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG91dCA8PCAiUmVhZFN0cmluZygpOyI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIG91dCA8PCAiUmVhZEJvb2woKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIG91dCA8PCAiUmVhZEJ5dGUoKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICBvdXQgPDwgIlJlYWRJMTYoKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBvdXQgPDwgIlJlYWRJMzIoKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICBvdXQgPDwgIlJlYWRJNjQoKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICBvdXQgPDwgIlJlYWREb3VibGUoKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gRGVscGhpIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgb3V0IDw8ICJSZWFkSTMyKCkiOworICAgICAgb3V0IDw8ICIpOyI7CisgICAgfQorICAgIG91dCA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIERFU0VSSUFMSVpFIEZJRUxEICclcycgVFlQRSAnJXMnXG4iLAorICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgdHlwZV9uYW1lKHR5cGUpLmNfc3RyKCkpOworICB9Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIHR5cF9uYW1lOworCisgIGlmICh0c3RydWN0LT5pc194Y2VwdGlvbigpKSB7CisgICAgdHlwX25hbWUgPSB0eXBlX25hbWUodHN0cnVjdCwgdHJ1ZSwgZmFsc2UsIHRydWUsIHRydWUpOworICB9IGVsc2UgeworICAgIHR5cF9uYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QsIHRydWUsIGZhbHNlKTsKKyAgfQorCisgIGluZGVudF9pbXBsKG91dCkgPDwgcHJlZml4IDw8IG5hbWUgPDwgIiA6PSAiIDw8IHR5cF9uYW1lIDw8ICIuQ3JlYXRlOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCBwcmVmaXggPDwgbmFtZSA8PCAiLlJlYWQoaXByb3QpOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9zdHJlYW0mIGxvY2FsX3ZhcnMpIHsKKworICBzdHJpbmcgb2JqOworICBzdHJpbmcgY291bnRlcjsKKyAgc3RyaW5nIGxvY2FsX3ZhcjsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgb2JqID0gdG1wKCJfbWFwIik7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgb2JqID0gdG1wKCJfc2V0Iik7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIG9iaiA9IHRtcCgiX2xpc3QiKTsKKyAgfQorCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBsb2NhbF92YXIgPSBvYmogKyAiOiBUVGhyaWZ0TWFwOyI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgbG9jYWxfdmFyID0gb2JqICsgIjogVFRocmlmdFNldDsiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBsb2NhbF92YXIgPSBvYmogKyAiOiBUVGhyaWZ0TGlzdDsiOworICB9CisgIGxvY2FsX3ZhcnMgPDwgIiAgIiA8PCBsb2NhbF92YXIgPDwgZW5kbDsKKyAgY291bnRlciA9IHRtcCgiX2kiKTsKKyAgbG9jYWxfdmFyID0gY291bnRlciArICI6IFN5c3RlbS5JbnRlZ2VyOyI7CisgIGxvY2FsX3ZhcnMgPDwgIiAgIiA8PCBsb2NhbF92YXIgPDwgZW5kbDsKKworICBpbmRlbnRfaW1wbChvdXQpIDw8IG5hbWUgPDwgIiA6PSAiIDw8IHR5cGVfbmFtZSh0dHlwZSwgdHJ1ZSkgPDwgIi5DcmVhdGU7IiA8PCBlbmRsOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8IG9iaiA8PCAiIDo9IGlwcm90LlJlYWRNYXBCZWdpbigpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8IG9iaiA8PCAiIDo9IGlwcm90LlJlYWRTZXRCZWdpbigpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCBvYmogPDwgIiA6PSBpcHJvdC5SZWFkTGlzdEJlZ2luKCk7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiZm9yICIgPDwgY291bnRlciA8PCAiIDo9IDAgdG8gIiA8PCBvYmogPDwgIi5Db3VudCAtIDEgZG8iIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKG91dCkgPDwgImJlZ2luIiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCBpc194Y2VwdGlvbiwgKHRfbWFwKil0dHlwZSwgbmFtZSwgbG9jYWxfdmFycyk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCBpc194Y2VwdGlvbiwgKHRfc2V0Kil0dHlwZSwgbmFtZSwgbG9jYWxfdmFycyk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsIGlzX3hjZXB0aW9uLCAodF9saXN0Kil0dHlwZSwgbmFtZSwgbG9jYWxfdmFycyk7CisgIH0KKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJlbmQ7IiA8PCBlbmRsOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJpcHJvdC5SZWFkTWFwRW5kKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudF9pbXBsKG91dCkgPDwgImlwcm90LlJlYWRTZXRFbmQoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudF9pbXBsKG91dCkgPDwgImlwcm90LlJlYWRMaXN0RW5kKCk7IiA8PCBlbmRsOworICB9Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zdHJlYW0mIGxvY2FsX3ZhcnMpIHsKKworICBzdHJpbmcga2V5ID0gdG1wKCJfa2V5Iik7CisgIHN0cmluZyB2YWwgPSB0bXAoIl92YWwiKTsKKyAgc3RyaW5nIGxvY2FsX3ZhcjsKKworICB0X2ZpZWxkIGZrZXkodG1hcC0+Z2V0X2tleV90eXBlKCksIGtleSk7CisgIHRfZmllbGQgZnZhbCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdmFsKTsKKworICBsb2NhbF92YXJzIDw8ICIgICIgPDwgZGVjbGFyZV9maWVsZCgmZmtleSkgPDwgZW5kbDsKKyAgbG9jYWxfdmFycyA8PCAiICAiIDw8IGRlY2xhcmVfZmllbGQoJmZ2YWwpIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCBpc194Y2VwdGlvbiwgJmZrZXksICIiLCBsb2NhbF92YXJzKTsKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCBpc194Y2VwdGlvbiwgJmZ2YWwsICIiLCBsb2NhbF92YXJzKTsKKworICBpbmRlbnRfaW1wbChvdXQpIDw8IHByZWZpeCA8PCAiLkFkZE9yU2V0VmFsdWUoICIgPDwga2V5IDw8ICIsICIgPDwgdmFsIDw8ICIpOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0c2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3N0cmVhbSYgbG9jYWxfdmFycykgeworICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKKyAgdF9maWVsZCBmZWxlbSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOworICBsb2NhbF92YXJzIDw8ICIgICIgPDwgZGVjbGFyZV9maWVsZCgmZmVsZW0pIDw8IGVuZGw7CisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgaXNfeGNlcHRpb24sICZmZWxlbSwgIiIsIGxvY2FsX3ZhcnMpOworICBpbmRlbnRfaW1wbChvdXQpIDw8IHByZWZpeCA8PCAiLkFkZCgiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3N0cmVhbSYgbG9jYWxfdmFycykgeworICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKKyAgdF9maWVsZCBmZWxlbSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKKyAgbG9jYWxfdmFycyA8PCAiICAiIDw8IGRlY2xhcmVfZmllbGQoJmZlbGVtKSA8PCBlbmRsOworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsIGlzX3hjZXB0aW9uLCAmZmVsZW0sICIiLCBsb2NhbF92YXJzKTsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCBwcmVmaXggPDwgIi5BZGQoIiA8PCBlbGVtIDw8ICIpOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3N0cmVhbSYgbG9jYWxfdmFycykgeworICAodm9pZClsb2NhbF92YXJzOworCisgIHRfdHlwZSogdHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKKyAgd2hpbGUgKHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHR5cGUgPSAoKHRfdHlwZWRlZiopdHlwZSktPmdldF90eXBlKCk7CisgIH0KKworICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHByb3BfbmFtZSh0ZmllbGQsIGlzX3hjZXB0aW9uKTsKKworICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgbmFtZTsKKyAgfQorCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbmFtZSwgbG9jYWxfdmFycyk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG91dCwgaXNfeGNlcHRpb24sIHR5cGUsIG5hbWUsIGxvY2FsX3ZhcnMpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgeworCisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAib3Byb3QuIjsKKworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworCisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgICAgaWYgKGFuc2lzdHJfYmluYXJ5XykgeworICAgICAgICAgICAgb3V0IDw8ICJXcml0ZUFuc2lTdHJpbmcoIjsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb3V0IDw8ICJXcml0ZUJpbmFyeSgiOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgPDwgIldyaXRlU3RyaW5nKCI7CisgICAgICAgIH0KKyAgICAgICAgb3V0IDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIG91dCA8PCAiV3JpdGVCb29sKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIG91dCA8PCAiV3JpdGVCeXRlKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICBvdXQgPDwgIldyaXRlSTE2KCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBvdXQgPDwgIldyaXRlSTMyKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICBvdXQgPDwgIldyaXRlSTY0KCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICBvdXQgPDwgIldyaXRlRG91YmxlKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gRGVscGhpIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgb3V0IDw8ICJXcml0ZUkzMihTeXN0ZW0uSW50ZWdlcigiIDw8IG5hbWUgPDwgIikpOyI7CisgICAgfQorICAgIG91dCA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIFNFUklBTElaRSAnJXMlcycgVFlQRSAnJXMnXG4iLAorICAgICAgICAgICBwcmVmaXguY19zdHIoKSwKKyAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgIHR5cGVfbmFtZSh0eXBlKS5jX3N0cigpKTsKKyAgfQorfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvc3RyZWFtJiBsb2NhbF92YXJzKSB7CisgICh2b2lkKWxvY2FsX3ZhcnM7CisgICh2b2lkKXRzdHJ1Y3Q7CisgIG91dCA8PCBpbmRlbnRfaW1wbCgpIDw8IHByZWZpeCA8PCAiLldyaXRlKG9wcm90KTsiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zdHJlYW0mIGxvY2FsX3ZhcnMpIHsKKyAgc3RyaW5nIG9iajsKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIG9iaiA9IHRtcCgibWFwIik7CisgICAgbG9jYWxfdmFycyA8PCAiICAiIDw8IG9iaiA8PCAiIDogVFRocmlmdE1hcDsiIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiVGhyaWZ0LlByb3RvY29sLkluaXQoICIgPDwgb2JqIDw8ICIsICIKKyAgICAgICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwgIiA8PCBwcmVmaXgKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIuQ291bnQpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJvcHJvdC5Xcml0ZU1hcEJlZ2luKCAiIDw8IG9iaiA8PCAiKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgb2JqID0gdG1wKCJzZXRfIik7CisgICAgbG9jYWxfdmFycyA8PCAiICAiIDw8IG9iaiA8PCAiIDogVFRocmlmdFNldDsiIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiVGhyaWZ0LlByb3RvY29sLkluaXQoICIgPDwgb2JqIDw8ICIsICIKKyAgICAgICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgIiA8PCBwcmVmaXgKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIuQ291bnQpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJvcHJvdC5Xcml0ZVNldEJlZ2luKCAiIDw8IG9iaiA8PCAiKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIG9iaiA9IHRtcCgibGlzdF8iKTsKKyAgICBsb2NhbF92YXJzIDw8ICIgICIgPDwgb2JqIDw8ICIgOiBUVGhyaWZ0TGlzdDsiIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiVGhyaWZ0LlByb3RvY29sLkluaXQoICIgPDwgb2JqIDw8ICIsICIKKyAgICAgICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIgPDwgcHJlZml4CisgICAgICAgICAgICAgICAgICAgICA8PCAiLkNvdW50KTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAib3Byb3QuV3JpdGVMaXN0QmVnaW4oICIgPDwgb2JqIDw8ICIpOyIgPDwgZW5kbDsKKyAgfQorCisgIHN0cmluZyBpdGVyID0gdG1wKCJfaXRlciIpOworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgbG9jYWxfdmFycyA8PCAiICAiIDw8IGl0ZXIgPDwgIjogIiA8PCB0eXBlX25hbWUoKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiZm9yICIgPDwgaXRlciA8PCAiIGluICIgPDwgcHJlZml4IDw8ICIuS2V5cyBkbyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXBfaW1wbCgpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGxvY2FsX3ZhcnMgPDwgIiAgIiA8PCBpdGVyIDw8ICI6ICIgPDwgdHlwZV9uYW1lKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiOyIKKyAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiZm9yICIgPDwgaXRlciA8PCAiIGluICIgPDwgcHJlZml4IDw8ICIgZG8iIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwX2ltcGwoKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgbG9jYWxfdmFycyA8PCAiICAiIDw8IGl0ZXIgPDwgIjogIiA8PCB0eXBlX25hbWUoKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiOyIKKyAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiZm9yICIgPDwgaXRlciA8PCAiIGluICIgPDwgcHJlZml4IDw8ICIgZG8iIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwX2ltcGwoKTsKKyAgfQorCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCBpc194Y2VwdGlvbiwgKHRfbWFwKil0dHlwZSwgaXRlciwgcHJlZml4LCBsb2NhbF92YXJzKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCBpc194Y2VwdGlvbiwgKHRfc2V0Kil0dHlwZSwgaXRlciwgbG9jYWxfdmFycyk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCBpc194Y2VwdGlvbiwgKHRfbGlzdCopdHR5cGUsIGl0ZXIsIGxvY2FsX3ZhcnMpOworICB9CisKKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJlbmQ7IiA8PCBlbmRsOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJvcHJvdC5Xcml0ZU1hcEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJvcHJvdC5Xcml0ZVNldEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAib3Byb3QuV3JpdGVMaXN0RW5kKCk7IiA8PCBlbmRsOworICB9Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zdHJlYW0mIGxvY2FsX3ZhcnMpIHsKKyAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksIGl0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCBpc194Y2VwdGlvbiwgJmtmaWVsZCwgIiIsIGxvY2FsX3ZhcnMpOworICB0X2ZpZWxkIHZmaWVsZCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgbWFwICsgIlsiICsgaXRlciArICJdIik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsIGlzX3hjZXB0aW9uLCAmdmZpZWxkLCAiIiwgbG9jYWxfdmFycyk7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdHNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zdHJlYW0mIGxvY2FsX3ZhcnMpIHsKKyAgdF9maWVsZCBlZmllbGQodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgaXNfeGNlcHRpb24sICZlZmllbGQsICIiLCBsb2NhbF92YXJzKTsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zdHJlYW0mIGxvY2FsX3ZhcnMpIHsKKyAgdF9maWVsZCBlZmllbGQodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsIGlzX3hjZXB0aW9uLCAmZWZpZWxkLCAiIiwgbG9jYWxfdmFycyk7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9wZXJ0eShvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNQdWJsaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbikgeworICBnZW5lcmF0ZV9kZWxwaGlfcHJvcGVydHkob3V0LCBpc194Y2VwdGlvbiwgdGZpZWxkLCBpc1B1YmxpYywgIkdldCIpOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVscGhpX3Byb3BlcnR5KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdHJ1Y3RfaXNfeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1B1YmxpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZmllbGRQcmVmaXgpIHsKKyAgKHZvaWQpaXNQdWJsaWM7CisKKyAgdF90eXBlKiBmdHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKKyAgYm9vbCBpc194Y2VwdGlvbiA9IGZ0eXBlLT5pc194Y2VwdGlvbigpOworICBnZW5lcmF0ZV9kZWxwaGlfZG9jKG91dCwgdGZpZWxkKTsKKyAgaW5kZW50KG91dCkgPDwgInByb3BlcnR5ICIgPDwgcHJvcF9uYW1lKHRmaWVsZCwgc3RydWN0X2lzX3hjZXB0aW9uKSA8PCAiOiAiCisgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZShmdHlwZSwgZmFsc2UsIHRydWUsIGlzX3hjZXB0aW9uLCB0cnVlKSA8PCAiIHJlYWQgIgorICAgICAgICAgICAgICA8PCBmaWVsZFByZWZpeCArIHByb3BfbmFtZSh0ZmllbGQsIHN0cnVjdF9pc194Y2VwdGlvbikgPDwgIiB3cml0ZSBTZXQiCisgICAgICAgICAgICAgIDw8IHByb3BfbmFtZSh0ZmllbGQsIHN0cnVjdF9pc194Y2VwdGlvbikgPDwgIjsiIDw8IGVuZGw7Cit9CisKK3N0ZDo6c3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6cHJvcF9uYW1lKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpc194Y2VwdGlvbikgeworICByZXR1cm4gcHJvcF9uYW1lKHRmaWVsZC0+Z2V0X25hbWUoKSwgaXNfeGNlcHRpb24pOworfQorCitzdGQ6OnN0cmluZyB0X2RlbHBoaV9nZW5lcmF0b3I6OnByb3BfbmFtZShzdHJpbmcgbmFtZSwgYm9vbCBpc194Y2VwdGlvbikgeworICBzdHJpbmcgcmV0ID0gbmFtZTsKKyAgcmV0WzBdID0gdG91cHBlcihyZXRbMF0pOworICByZXR1cm4gbm9ybWFsaXplX25hbWUocmV0LCB0cnVlLCBpc194Y2VwdGlvbik7Cit9CisKK3N0ZDo6c3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6Y29uc3RydWN0b3JfcGFyYW1fbmFtZShzdHJpbmcgbmFtZSkgeworICBzdHJpbmcgcmV0ID0gbmFtZTsKKyAgcmV0WzBdID0gdG91cHBlcihyZXRbMF0pOworICByZXQgPSAiQSIgKyByZXQ7CisgIHJldHVybiBub3JtYWxpemVfbmFtZShyZXQsIGZhbHNlLCBmYWxzZSk7Cit9CisKK3N0cmluZyB0X2RlbHBoaV9nZW5lcmF0b3I6Om5vcm1hbGl6ZV9jbHNubShzdHJpbmcgY2xzbm0sIHN0cmluZyBwcmVmaXgsIGJvb2wgYl9ub19jaGVja19rZXl3b3JkKSB7CisgIGlmIChjbHNubS5zaXplKCkgPiAwKSB7CisgICAgY2xzbm1bMF0gPSB0b3VwcGVyKGNsc25tWzBdKTsKKyAgfQorICBpZiAoYl9ub19jaGVja19rZXl3b3JkKSB7CisgICAgcmV0dXJuIHByZWZpeCArIGNsc25tOworICB9IGVsc2UgeworICAgIHJldHVybiBub3JtYWxpemVfbmFtZShwcmVmaXggKyBjbHNubSk7CisgIH0KK30KKworc3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6dHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiX2NscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJfbm9fcG9zdGZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJfZXhjZXB0aW9uX2ZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiX2Z1bGxfZXhjZXB0aW9uX2ZhY3RvcnkpIHsKKworICBpZiAodHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHRfdHlwZWRlZiogdGRlZiA9ICh0X3R5cGVkZWYqKXR0eXBlOworICAgIGlmICh0ZGVmLT5pc19mb3J3YXJkX3R5cGVkZWYoKSkgeyAvLyBmb3J3YXJkIHR5cGVzIGFjY29yZGluZyB0byBUSFJJRlQtMjQyMQorICAgICAgaWYgKHRkZWYtPmdldF90eXBlKCkgIT0gTlVMTCkgeworICAgICAgICByZXR1cm4gdHlwZV9uYW1lKHRkZWYtPmdldF90eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgYl9jbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgYl9ub19wb3N0Zml4LAorICAgICAgICAgICAgICAgICAgICAgICAgIGJfZXhjZXB0aW9uX2ZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgYl9mdWxsX2V4Y2VwdGlvbl9mYWN0b3J5KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93ICJ1bnJlc29sdmVkIGZvcndhcmQgZGVjbGFyYXRpb246ICIgKyB0ZGVmLT5nZXRfc3ltYm9saWMoKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIG5vcm1hbGl6ZV9uYW1lKCJUIiArIHRkZWYtPmdldF9zeW1ib2xpYygpKTsKKyAgICB9CisgIH0KKworICBzdHJpbmcgdHlwX25tOworCisgIHN0cmluZyBzX2ZhY3Rvcnk7CisKKyAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHJldHVybiBiYXNlX3R5cGVfbmFtZSgodF9iYXNlX3R5cGUqKXR0eXBlKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7CisgICAgYl9jbHMgPSB0cnVlOworICAgIGJfbm9fcG9zdGZpeCA9IHRydWU7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgdF9tYXAqIHRtYXAgPSAodF9tYXAqKXR0eXBlOworICAgIGlmIChiX2NscykgeworICAgICAgdHlwX25tID0gIlRUaHJpZnREaWN0aW9uYXJ5SW1wbCI7CisgICAgfSBlbHNlIHsKKyAgICAgIHR5cF9ubSA9ICJJVGhyaWZ0RGljdGlvbmFyeSI7CisgICAgfQorICAgIHJldHVybiB0eXBfbm0gKyAiPCIgKyB0eXBlX25hbWUodG1hcC0+Z2V0X2tleV90eXBlKCkpICsgIiwgIiArIHR5cGVfbmFtZSh0bWFwLT5nZXRfdmFsX3R5cGUoKSkKKyAgICAgICAgICAgKyAiPiI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgdF9zZXQqIHRzZXQgPSAodF9zZXQqKXR0eXBlOworICAgIGlmIChiX2NscykgeworICAgICAgdHlwX25tID0gIlRIYXNoU2V0SW1wbCI7CisgICAgfSBlbHNlIHsKKyAgICAgIHR5cF9ubSA9ICJJSGFzaFNldCI7CisgICAgfQorICAgIHJldHVybiB0eXBfbm0gKyAiPCIgKyB0eXBlX25hbWUodHNldC0+Z2V0X2VsZW1fdHlwZSgpKSArICI+IjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgdF9saXN0KiB0bGlzdCA9ICh0X2xpc3QqKXR0eXBlOworICAgIGlmIChiX2NscykgeworICAgICAgdHlwX25tID0gIlRUaHJpZnRMaXN0SW1wbCI7CisgICAgfSBlbHNlIHsKKyAgICAgIHR5cF9ubSA9ICJJVGhyaWZ0TGlzdCI7CisgICAgfQorICAgIHJldHVybiB0eXBfbm0gKyAiPCIgKyB0eXBlX25hbWUodGxpc3QtPmdldF9lbGVtX3R5cGUoKSkgKyAiPiI7CisgIH0KKworICBzdHJpbmcgdHlwZV9wcmVmaXg7CisKKyAgaWYgKGJfY2xzKSB7CisgICAgdHlwZV9wcmVmaXggPSAiVCI7CisgIH0gZWxzZSB7CisgICAgdHlwZV9wcmVmaXggPSAiSSI7CisgIH0KKworICBzdHJpbmcgbm0gPSBub3JtYWxpemVfY2xzbm0odHR5cGUtPmdldF9uYW1lKCksIHR5cGVfcHJlZml4KTsKKworICBpZiAoYl9leGNlcHRpb25fZmFjdG9yeSkgeworICAgIG5tID0gbm0gKyAiRmFjdG9yeSI7CisgIH0KKworICBpZiAoYl9jbHMpIHsKKyAgICBpZiAoIWJfbm9fcG9zdGZpeCkgeworICAgICAgbm0gPSBubSArICJJbXBsIjsKKyAgICB9CisgIH0KKworICBpZiAoYl9leGNlcHRpb25fZmFjdG9yeSAmJiBiX2Z1bGxfZXhjZXB0aW9uX2ZhY3RvcnkpIHsKKyAgICByZXR1cm4gdHlwZV9uYW1lKHR0eXBlLCB0cnVlLCB0cnVlLCBmYWxzZSwgZmFsc2UpICsgIi4iICsgbm07CisgIH0KKworICByZXR1cm4gbm07Cit9CisKKy8vIHJldHVybnMgImNvbnN0ICIgZm9yIHNvbWUgYXJndW1lbnQgdHlwZXMKK3N0cmluZyB0X2RlbHBoaV9nZW5lcmF0b3I6OmlucHV0X2FyZ19wcmVmaXgodF90eXBlKiB0dHlwZSkgeworCisgIC8vIGJhc2UgdHlwZXMKKyAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHN3aXRjaCAoKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpKSB7CisKKyAgICAvLyB0aGVzZSBzaG91bGQgYmUgY29uc3QnZWQgZm9yIG9wdGltYWwgcGVyZm9ybWFtY2UKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzogLy8gcmVmY291bnRlZCBwb2ludGVyCisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6ICAgIC8vIGxhcmdlciB0aGFuIDMyIGJpdAorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOiAvLyBsYXJnZXIgdGhhbiAzMiBiaXQKKyAgICAgIHJldHVybiAiY29uc3QgIjsKKworICAgIC8vIGFsbCBvdGhlcnMgZG9uJ3QgbmVlZCB0byBiZQorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHJldHVybiAiIjsKKworICAgIC8vIHdlIGJldHRlciBhbHdheXMgcmVwb3J0IGFueSB1bmtub3duIHR5cGVzCisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gaW5wdXRfYXJnX3ByZWZpeCgpIGZvciBiYXNlIHR5cGUgIgorICAgICAgICAgICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKCgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKSk7CisgICAgfQorCisgICAgLy8gZW51bXMKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICIiOyAvLyB1c3VhbGx5IDw9IDMyIGJpdAorCisgICAgLy8gY29udGFpbmVycworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAiY29uc3QgIjsgLy8gcmVmY291bnRlZCBwb2ludGVyCisKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gImNvbnN0ICI7IC8vIHJlZmNvdW50ZWQgcG9pbnRlcgorCisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAiY29uc3QgIjsgLy8gcmVmY291bnRlZCBwb2ludGVyCisgIH0KKworICAvLyBhbnkgb3RoZXIgdHlwZSwgZWl0aGVyIFRTb21ldGhpbmcgb3IgSVNvbWV0aGluZworICByZXR1cm4gImNvbnN0ICI7IC8vIHBvc3NpYmx5IHJlZmNvdW50ZWQgcG9pbnRlcgorfQorCitzdHJpbmcgdF9kZWxwaGlfZ2VuZXJhdG9yOjpiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZSogdGJhc2UpIHsKKyAgc3dpdGNoICh0YmFzZS0+Z2V0X2Jhc2UoKSkgeworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgLy8gbm8gInZvaWQiIGluIERlbHBoaSBsYW5ndWFnZQorICAgIHJldHVybiAiIjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgaWYgKHRiYXNlLT5pc19iaW5hcnkoKSkgeworICAgICAgaWYgKGFuc2lzdHJfYmluYXJ5XykgeworICAgICAgICByZXR1cm4gIlN5c3RlbS5BbnNpU3RyaW5nIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAiU3lzVXRpbHMuVEJ5dGVzIjsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuICJTeXN0ZW0uc3RyaW5nIjsKKyAgICB9CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICByZXR1cm4gIlN5c3RlbS5Cb29sZWFuIjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICByZXR1cm4gIlN5c3RlbS5TaG9ydEludCI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIHJldHVybiAiU3lzdGVtLlNtYWxsSW50IjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgcmV0dXJuICJTeXN0ZW0uSW50ZWdlciI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgIHJldHVybiAiU3lzdGVtLkludDY0IjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgcmV0dXJuICJTeXN0ZW0uRG91YmxlIjsKKyAgZGVmYXVsdDoKKyAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIERlbHBoaSBuYW1lIGZvciBiYXNlIHR5cGUgIgorICAgICAgICArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZS0+Z2V0X2Jhc2UoKSk7CisgIH0KK30KKworc3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6ZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uX2NsYXNzKSB7CisgICh2b2lkKWluaXQ7CisKKyAgdF90eXBlKiBmdHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKKyAgYm9vbCBpc194Y2VwdGlvbiA9IGZ0eXBlLT5pc194Y2VwdGlvbigpOworCisgIHN0cmluZyByZXN1bHQgPSBwcmVmaXggKyBwcm9wX25hbWUodGZpZWxkLCBpc194Y2VwdGlvbl9jbGFzcykgKyAiOiAiCisgICAgICAgICAgICAgICAgICArIHR5cGVfbmFtZShmdHlwZSwgZmFsc2UsIHRydWUsIGlzX3hjZXB0aW9uLCB0cnVlKSArICI7IjsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcl9hc3luYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBmdWxsX2NscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uKSB7CisgIHRfdHlwZSogdHR5cGUgPSB0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCk7CisgIHN0cmluZyBwcmVmaXg7CisgIGlmIChmdWxsX2NscyA9PSAiIikgeworICAgIHByZWZpeCA9ICIiOworICB9IGVsc2UgeworICAgIHByZWZpeCA9IGZ1bGxfY2xzICsgIi4iOworICB9CisKKyAgaWYoIGZvcl9hc3luYykgeworICAgIGlmIChpc192b2lkKHR0eXBlKSkgeworICAgICAgcmV0dXJuICJmdW5jdGlvbiAiICsgcHJlZml4ICsgbm9ybWFsaXplX25hbWUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpLCB0cnVlLCBpc194Y2VwdGlvbikgKyAiQXN5bmMoIgorICAgICAgICAgICAgICsgYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpICsgIik6IElGdXR1cmU8SW50ZWdlcj47IjsgIC8vIG5vIElGdXR1cmU8dm9pZD4gaW4gRGVscGhpCisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAiZnVuY3Rpb24gIiArIHByZWZpeCArIG5vcm1hbGl6ZV9uYW1lKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSwgdHJ1ZSwgaXNfeGNlcHRpb24pICsgIkFzeW5jKCIKKyAgICAgICAgICAgICArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKSArICIpOiBJRnV0dXJlPCIKKyAgICAgICAgICAgICArIHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUsIGlzX3hjZXB0aW9uLCB0cnVlKSArICI+OyI7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmIChpc192b2lkKHR0eXBlKSkgeworICAgICAgcmV0dXJuICJwcm9jZWR1cmUgIiArIHByZWZpeCArIG5vcm1hbGl6ZV9uYW1lKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSwgdHJ1ZSwgaXNfeGNlcHRpb24pICsgIigiCisgICAgICAgICAgICAgKyBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSkgKyAiKTsiOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gImZ1bmN0aW9uICIgKyBwcmVmaXggKyBub3JtYWxpemVfbmFtZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCksIHRydWUsIGlzX3hjZXB0aW9uKSArICIoIgorICAgICAgICAgICAgICsgYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpICsgIik6ICIKKyAgICAgICAgICAgICArIHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUsIGlzX3hjZXB0aW9uLCB0cnVlKSArICI7IjsKKyAgICB9CisgIH0KK30KKworc3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBzdHJpbmcgcmVzdWx0ID0gIiI7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIHRfdHlwZSogdHQ7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdCArPSAiOyAiOworICAgIH0KKworICAgIHR0ID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgIHJlc3VsdCArPSBpbnB1dF9hcmdfcHJlZml4KHR0KTsgLy8gY29uc3Q/CisgICAgcmVzdWx0ICs9IG5vcm1hbGl6ZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgKyAiOiAiCisgICAgICAgICAgICAgICsgdHlwZV9uYW1lKHR0LCBmYWxzZSwgdHJ1ZSwgdHQtPmlzX3hjZXB0aW9uKCksIHRydWUpOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0cmluZyB0X2RlbHBoaV9nZW5lcmF0b3I6OmNvbnN0cnVjdG9yX2FyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBjdXJyZW50X2luZGVudCkgeworICBvc3RyaW5nc3RyZWFtIHJlc3VsdDsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgdF90eXBlKiB0dDsKKyAgc3RyaW5nIGxpbmUgPSAiIjsKKyAgc3RyaW5nIG5ld2xpbmVfaW5kZW50ID0gY3VycmVudF9pbmRlbnQgKyAiICAiOworCisgIGJvb2wgZmlyc3RsaW5lID0gdHJ1ZTsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgbGluZSArPSAiOyI7CisgICAgfQorCisgICAgaWYgKGxpbmUuc2l6ZSgpID4gODApIHsKKyAgICAgIGlmIChmaXJzdGxpbmUpIHsKKyAgICAgICAgcmVzdWx0IDw8IGVuZGwgPDwgbmV3bGluZV9pbmRlbnQ7CisgICAgICAgIGZpcnN0bGluZSA9IGZhbHNlOworICAgICAgfQorICAgICAgcmVzdWx0IDw8IGxpbmUgPDwgZW5kbDsKKyAgICAgIGxpbmUgPSBuZXdsaW5lX2luZGVudDsKKyAgICB9IGVsc2UgaWYgKGxpbmUuc2l6ZSgpID4gMCkgeworICAgICAgbGluZSArPSAiICI7CisgICAgfQorCisgICAgdHQgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgbGluZSArPSBpbnB1dF9hcmdfcHJlZml4KHR0KTsgLy8gY29uc3Q/CisgICAgbGluZSArPSBjb25zdHJ1Y3Rvcl9wYXJhbV9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgKyAiOiAiCisgICAgICAgICAgICArIHR5cGVfbmFtZSh0dCwgZmFsc2UsIHRydWUsIHR0LT5pc194Y2VwdGlvbigpLCB0cnVlKTsKKyAgfQorCisgIGlmIChsaW5lLnNpemUoKSA+IDApIHsKKyAgICByZXN1bHQgPDwgbGluZTsKKyAgfQorCisgIHN0cmluZyByZXN1bHRfc3RyOworCisgIGlmIChmaXJzdGxpbmUpIHsKKyAgICByZXN1bHRfc3RyID0gIiAiICsgcmVzdWx0LnN0cigpOworICB9IGVsc2UgeworICAgIHJlc3VsdF9zdHIgPSByZXN1bHQuc3RyKCk7CisgIH0KKworICByZXR1cm4gcmVzdWx0X3N0cjsKK30KKworc3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgeworICB3aGlsZSAodHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgdHlwZSA9ICgodF90eXBlZGVmKil0eXBlKS0+Z2V0X3R5cGUoKTsKKyAgfQorCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICJUVHlwZS5TdHJpbmdfIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gIlRUeXBlLkJvb2xfIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmV0dXJuICJUVHlwZS5CeXRlXyI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gIlRUeXBlLkkxNiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gIlRUeXBlLkkzMiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIlRUeXBlLkk2NCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIlRUeXBlLkRvdWJsZV8iOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLkkzMiI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiAiVFR5cGUuU3RydWN0IjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAiVFR5cGUuTWFwIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAiVFR5cGUuU2V0XyI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5MaXN0IjsKKyAgfQorCisgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKworc3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6ZW1wdHlfdmFsdWUodF90eXBlKiB0eXBlKSB7CisgIHdoaWxlICh0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICB0eXBlID0gKCh0X3R5cGVkZWYqKXR5cGUpLT5nZXRfdHlwZSgpOworICB9CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICByZXR1cm4gIjAiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgIGlmIChhbnNpc3RyX2JpbmFyeV8pIHsKKyAgICAgICAgICByZXR1cm4gIicnIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByZXR1cm4gIm5pbCI7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAiJyciOworICAgICAgfQorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiRmFsc2UiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIjAiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICIwLjAiOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gIlQiICsgdHlwZS0+Z2V0X25hbWUoKSArICIoMCkiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIm5pbCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gIm5pbCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIm5pbCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJuaWwiOworICB9CisKKyAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVscGhpX3Byb3BlcnR5X3dyaXRlcl9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uX2NsYXNzKSB7CisgIHRfdHlwZSogZnR5cGUgPSB0ZmllbGQtPmdldF90eXBlKCk7CisgIGJvb2wgaXNfeGNlcHRpb24gPSBmdHlwZS0+aXNfeGNlcHRpb24oKTsKKworICBpbmRlbnQob3V0KSA8PCAicHJvY2VkdXJlIFNldCIgPDwgcHJvcF9uYW1lKHRmaWVsZCwgaXNfeGNlcHRpb25fY2xhc3MpCisgICAgICAgICAgICAgIDw8ICIoIGNvbnN0IFZhbHVlOiAiIDw8IHR5cGVfbmFtZShmdHlwZSwgZmFsc2UsIHRydWUsIGlzX3hjZXB0aW9uLCB0cnVlKSA8PCAiKTsiCisgICAgICAgICAgICAgIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWxwaGlfcHJvcGVydHlfcmVhZGVyX2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb25fY2xhc3MpIHsKKyAgdF90eXBlKiBmdHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKKyAgYm9vbCBpc194Y2VwdGlvbiA9IGZ0eXBlLT5pc194Y2VwdGlvbigpOworCisgIGluZGVudChvdXQpIDw8ICJmdW5jdGlvbiBHZXQiIDw8IHByb3BfbmFtZSh0ZmllbGQsIGlzX3hjZXB0aW9uX2NsYXNzKSA8PCAiOiAiCisgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZShmdHlwZSwgZmFsc2UsIHRydWUsIGlzX3hjZXB0aW9uLCB0cnVlKSA8PCAiOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlbHBoaV9pc3NldF9yZWFkZXJfZGVmaW5pdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbikgeworICBpbmRlbnQob3V0KSA8PCAiZnVuY3Rpb24gR2V0X19pc3NldF8iIDw8IHByb3BfbmFtZSh0ZmllbGQsIGlzX3hjZXB0aW9uKSA8PCAiOiBTeXN0ZW0uQm9vbGVhbjsiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWxwaGlfY2xlYXJfdW5pb25fdmFsdWUob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjbHNfcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZmllbGRQcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb25fY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfdW5pb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb25fZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgeGNlcHRpb25fZmFjdG9yeV9uYW1lKSB7CisgICh2b2lkKWNsc19wcmVmaXg7CisgICh2b2lkKW5hbWU7CisgICh2b2lkKXR5cGU7CisgICh2b2lkKWlzX3VuaW9uOworICAodm9pZClpc194Y2VwdGlvbl9mYWN0b3J5OworICAodm9pZCl4Y2VwdGlvbl9mYWN0b3J5X25hbWU7CisKKyAgdF90eXBlKiBmdHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKKyAgYm9vbCBpc194Y2VwdGlvbiA9IGZ0eXBlLT5pc194Y2VwdGlvbigpOworCisgIGluZGVudF9pbXBsKG91dCkgPDwgImlmIEZfX2lzc2V0XyIgPDwgcHJvcF9uYW1lKHRmaWVsZCwgaXNfeGNlcHRpb25fY2xhc3MpIDw8ICIgdGhlbiBiZWdpbiIKKyAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJGX19pc3NldF8iIDw8IHByb3BfbmFtZSh0ZmllbGQsIGlzX3hjZXB0aW9uX2NsYXNzKSA8PCAiIDo9IEZhbHNlOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCBmaWVsZFByZWZpeCA8PCBwcm9wX25hbWUodGZpZWxkLCBpc194Y2VwdGlvbl9jbGFzcykgPDwgIiA6PSAiCisgICAgICAgICAgICAgICAgICAgPDwgIkRlZmF1bHQoICIgPDwgdHlwZV9uYW1lKGZ0eXBlLCBmYWxzZSwgdHJ1ZSwgaXNfeGNlcHRpb24sIHRydWUpIDw8ICIpOyIKKyAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKG91dCkgPDwgImVuZDsiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWxwaGlfcHJvcGVydHlfd3JpdGVyX2ltcGwob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjbHNfcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZmllbGRQcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb25fY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfdW5pb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb25fZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgeGNlcHRpb25fZmFjdG9yeV9uYW1lKSB7CisgICh2b2lkKXR5cGU7CisKKyAgdF90eXBlKiBmdHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKKyAgYm9vbCBpc194Y2VwdGlvbiA9IGZ0eXBlLT5pc194Y2VwdGlvbigpOworCisgIGluZGVudF9pbXBsKG91dCkgPDwgInByb2NlZHVyZSAiIDw8IGNsc19wcmVmaXggPDwgbmFtZSA8PCAiLiIKKyAgICAgICAgICAgICAgICAgICA8PCAiU2V0IiA8PCBwcm9wX25hbWUodGZpZWxkLCBpc194Y2VwdGlvbl9jbGFzcykKKyAgICAgICAgICAgICAgICAgICA8PCAiKCBjb25zdCBWYWx1ZTogIiA8PCB0eXBlX25hbWUoZnR5cGUsIGZhbHNlLCB0cnVlLCBpc194Y2VwdGlvbiwgdHJ1ZSkgPDwgIik7IgorICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKG91dCkgPDwgImJlZ2luIiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworICBpZiAoaXNfdW5pb24pIHsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJDbGVhclVuaW9uVmFsdWVzOyIgPDwgZW5kbDsKKyAgfQorICBpZiAodGZpZWxkLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgIGluZGVudF9pbXBsKG91dCkgPDwgIkZfX2lzc2V0XyIgPDwgcHJvcF9uYW1lKHRmaWVsZCwgaXNfeGNlcHRpb25fY2xhc3MpIDw8ICIgOj0gVHJ1ZTsiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2ltcGwob3V0KSA8PCBmaWVsZFByZWZpeCA8PCBwcm9wX25hbWUodGZpZWxkLCBpc194Y2VwdGlvbl9jbGFzcykgPDwgIiA6PSBWYWx1ZTsiIDw8IGVuZGw7CisKKyAgaWYgKGlzX3hjZXB0aW9uX2NsYXNzICYmICghaXNfeGNlcHRpb25fZmFjdG9yeSkpIHsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8IHhjZXB0aW9uX2ZhY3RvcnlfbmFtZSA8PCAiLiIgPDwgcHJvcF9uYW1lKHRmaWVsZCwgaXNfeGNlcHRpb25fY2xhc3MpCisgICAgICAgICAgICAgICAgICAgICA8PCAiIDo9IFZhbHVlOyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVscGhpX3Byb3BlcnR5X3JlYWRlcl9pbXBsKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2xzX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkUHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uX2NsYXNzKSB7CisgICh2b2lkKXR5cGU7CisKKyAgdF90eXBlKiBmdHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKKyAgYm9vbCBpc194Y2VwdGlvbiA9IGZ0eXBlLT5pc194Y2VwdGlvbigpOworCisgIGluZGVudF9pbXBsKG91dCkgPDwgImZ1bmN0aW9uICIgPDwgY2xzX3ByZWZpeCA8PCBuYW1lIDw8ICIuIgorICAgICAgICAgICAgICAgICAgIDw8ICJHZXQiIDw8IHByb3BfbmFtZSh0ZmllbGQsIGlzX3hjZXB0aW9uX2NsYXNzKSA8PCAiOiAiCisgICAgICAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKGZ0eXBlLCBmYWxzZSwgdHJ1ZSwgaXNfeGNlcHRpb24sIHRydWUpIDw8ICI7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiUmVzdWx0IDo9ICIgPDwgZmllbGRQcmVmaXggPDwgcHJvcF9uYW1lKHRmaWVsZCwgaXNfeGNlcHRpb25fY2xhc3MpIDw8ICI7IgorICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVscGhpX2lzc2V0X3JlYWRlcl9pbXBsKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2xzX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkUHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uKSB7CisgICh2b2lkKXR5cGU7CisKKyAgc3RyaW5nIGlzc2V0X25hbWUgPSAiX19pc3NldF8iICsgcHJvcF9uYW1lKHRmaWVsZCwgaXNfeGNlcHRpb24pOworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJmdW5jdGlvbiAiIDw8IGNsc19wcmVmaXggPDwgbmFtZSA8PCAiLiIKKyAgICAgICAgICAgICAgICAgICA8PCAiR2V0IiA8PCBpc3NldF9uYW1lIDw8ICI6IFN5c3RlbS5Cb29sZWFuOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisgIGluZGVudF9pbXBsKG91dCkgPDwgIlJlc3VsdCA6PSAiIDw8IGZpZWxkUHJlZml4IDw8IGlzc2V0X25hbWUgPDwgIjsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVscGhpX2NyZWF0ZV9leGNlcHRpb25faW1wbChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY2xzX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pIHsKKyAgKHZvaWQpY2xzX3ByZWZpeDsKKworICBzdHJpbmcgZXhjZXB0aW9uX2Nsc19ubSA9IHR5cGVfbmFtZSh0c3RydWN0LCB0cnVlLCB0cnVlKTsKKyAgc3RyaW5nIGNsc19ubSA9IHR5cGVfbmFtZSh0c3RydWN0LCB0cnVlLCBmYWxzZSwgaXNfZXhjZXB0aW9uLCBpc19leGNlcHRpb24pOworCisgIGluZGVudF9pbXBsKG91dCkgPDwgImZ1bmN0aW9uICIgPDwgY2xzX25tIDw8ICIuQ3JlYXRlRXhjZXB0aW9uOiAiIDw8IGV4Y2VwdGlvbl9jbHNfbm0gPDwgIjsiCisgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJSZXN1bHQgOj0gIiA8PCBleGNlcHRpb25fY2xzX25tIDw8ICIuQ3JlYXRlOyIgPDwgZW5kbDsKKyAgc3RyaW5nIGZhY3RvcnlfbmFtZSA9IG5vcm1hbGl6ZV9jbHNubSh0c3RydWN0LT5nZXRfbmFtZSgpLCAiIiwgdHJ1ZSkgKyAiRmFjdG9yeSI7CisgIGluZGVudF9pbXBsKG91dCkgPDwgIlJlc3VsdC5GIiA8PCBmYWN0b3J5X25hbWUgPDwgIiA6PSBTZWxmOyIgPDwgZW5kbDsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgc3RyaW5nIHByb3BuYW1lOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgcHJvcG5hbWUgPSBwcm9wX25hbWUoKmZfaXRlciwgaXNfZXhjZXB0aW9uKTsKKyAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiaWYgX19pc3NldF8iIDw8IHByb3BuYW1lIDw8ICIgdGhlbiBiZWdpbiIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cF9pbXBsKCk7CisgICAgfQorICAgIGluZGVudF9pbXBsKG91dCkgPDwgIlJlc3VsdC4iIDw8IHByb3BuYW1lIDw8ICIgOj0gIiA8PCBwcm9wbmFtZSA8PCAiOyIgPDwgZW5kbDsKKyAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgaW5kZW50X2Rvd25faW1wbCgpOworICAgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiZW5kOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJSZXN1bHQuVXBkYXRlTWVzc2FnZVByb3BlcnR5OyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKG91dCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfcmVhZGVyX2ltcGwob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGNsc19wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisKKyAgb3N0cmluZ3N0cmVhbSBsb2NhbF92YXJzOworICBvc3RyaW5nc3RyZWFtIGNvZGVfYmxvY2s7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKworICBpbmRlbnRfaW1wbChsb2NhbF92YXJzKSA8PCAidHJhY2tlciA6IElQcm90b2NvbFJlY3Vyc2lvblRyYWNrZXI7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAidHJhY2tlciA6PSBpcHJvdC5OZXh0UmVjdXJzaW9uTGV2ZWw7IiA8PCBlbmRsOworCisgIC8vIGxvY2FsIGJvb2xzIGZvciByZXF1aXJlZCBmaWVsZHMKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgaW5kZW50X2ltcGwobG9jYWxfdmFycykgPDwgIl9yZXFfaXNzZXRfIiA8PCBwcm9wX25hbWUoKmZfaXRlciwgaXNfZXhjZXB0aW9uKSA8PCAiIDogU3lzdGVtLkJvb2xlYW47IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJfcmVxX2lzc2V0XyIgPDwgcHJvcF9uYW1lKCpmX2l0ZXIsIGlzX2V4Y2VwdGlvbikgPDwgIiA6PSBGQUxTRTsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJzdHJ1YyA6PSBpcHJvdC5SZWFkU3RydWN0QmVnaW47IiA8PCBlbmRsOworCisgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJ0cnkiIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisKKyAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgIndoaWxlICh0cnVlKSBkbyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImJlZ2luIiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworCisgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJmaWVsZF8gOj0gaXByb3QuUmVhZEZpZWxkQmVnaW4oKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImlmIChmaWVsZF8uVHlwZV8gPSBUVHlwZS5TdG9wKSB0aGVuIiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJCcmVhazsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImVuZDsiIDw8IGVuZGw7CisKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKworICAgIGlmIChmaXJzdCkgeworICAgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImNhc2UgZmllbGRfLklEIG9mIiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwX2ltcGwoKTsKKyAgICB9CisKKyAgICBmaXJzdCA9IGZhbHNlOworICAgIGlmIChmX2l0ZXIgIT0gZmllbGRzLmJlZ2luKCkpIHsKKyAgICAgIGNvZGVfYmxvY2sgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICI6IGJlZ2luIiA8PCBlbmRsOworICAgIGluZGVudF91cF9pbXBsKCk7CisgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImlmIChmaWVsZF8uVHlwZV8gPSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIikgdGhlbiBiZWdpbiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXBfaW1wbCgpOworCisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQoY29kZV9ibG9jaywgaXNfZXhjZXB0aW9uLCAqZl9pdGVyLCAiU2VsZi4iLCBsb2NhbF92YXJzKTsKKworICAgIC8vIHJlcXVpcmVkIGZpZWxkPworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiX3JlcV9pc3NldF8iIDw8IHByb3BfbmFtZSgqZl9pdGVyLCBpc19leGNlcHRpb24pIDw8ICIgOj0gVFJVRTsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudF9kb3duX2ltcGwoKTsKKworICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJlbmQgZWxzZSBiZWdpbiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXBfaW1wbCgpOworICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJUUHJvdG9jb2xVdGlsLlNraXAoaXByb3QsIGZpZWxkXy5UeXBlXyk7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiZW5kOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bl9pbXBsKCk7CisgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImVuZCI7CisgIH0KKworICBpZiAoIWZpcnN0KSB7CisgICAgY29kZV9ibG9jayA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJlbHNlIGJlZ2luIiA8PCBlbmRsOworICAgIGluZGVudF91cF9pbXBsKCk7CisgIH0KKworICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiVFByb3RvY29sVXRpbC5Ta2lwKGlwcm90LCBmaWVsZF8uVHlwZV8pOyIgPDwgZW5kbDsKKworICBpZiAoIWZpcnN0KSB7CisgICAgaW5kZW50X2Rvd25faW1wbCgpOworICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJlbmQ7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiZW5kOyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJpcHJvdC5SZWFkRmllbGRFbmQ7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duX2ltcGwoKTsKKworICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiZW5kOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd25faW1wbCgpOworCisgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJmaW5hbGx5IiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiaXByb3QuUmVhZFN0cnVjdEVuZDsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImVuZDsiIDw8IGVuZGw7CisKKyAgLy8gYWxsIHJlcXVpcmVkIGZpZWxkcyBoYXZlIGJlZW4gcmVhZD8KKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImlmIG5vdCBfcmVxX2lzc2V0XyIgPDwgcHJvcF9uYW1lKCpmX2l0ZXIsIGlzX2V4Y2VwdGlvbikgPDwgZW5kbDsKKyAgICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spCisgICAgICAgICAgPDwgInRoZW4gcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uSW52YWxpZERhdGEuQ3JlYXRlKCIKKyAgICAgICAgICA8PCAiJ3JlcXVpcmVkIGZpZWxkICIgPDwgcHJvcF9uYW1lKCpmX2l0ZXIsIGlzX2V4Y2VwdGlvbikgPDwgIiBub3Qgc2V0Jyk7IgorICAgICAgICAgIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIHN0cmluZyBjbHNfbm07CisKKyAgY2xzX25tID0gdHlwZV9uYW1lKHRzdHJ1Y3QsIHRydWUsIGZhbHNlLCBpc19leGNlcHRpb24sIGlzX2V4Y2VwdGlvbik7CisKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAicHJvY2VkdXJlICIgPDwgY2xzX3ByZWZpeCA8PCBjbHNfbm0gPDwgIi5SZWFkKCBjb25zdCBpcHJvdDogSVByb3RvY29sKTsiCisgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAidmFyIiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJmaWVsZF8gOiBUVGhyaWZ0RmllbGQ7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJzdHJ1YyA6IFRUaHJpZnRTdHJ1Y3Q7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIG91dCA8PCBsb2NhbF92YXJzLnN0cigpIDw8IGVuZGw7CisgIG91dCA8PCBjb2RlX2Jsb2NrLnN0cigpOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVscGhpX3N0cnVjdF9yZXN1bHRfd3JpdGVyX2ltcGwob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjbHNfcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisKKyAgb3N0cmluZ3N0cmVhbSBsb2NhbF92YXJzOworICBvc3RyaW5nc3RyZWFtIGNvZGVfYmxvY2s7CisKKyAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKworICBpbmRlbnRfaW1wbChsb2NhbF92YXJzKSA8PCAidHJhY2tlciA6IElQcm90b2NvbFJlY3Vyc2lvblRyYWNrZXI7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAidHJhY2tlciA6PSBvcHJvdC5OZXh0UmVjdXJzaW9uTGV2ZWw7IiA8PCBlbmRsOworCisgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJUaHJpZnQuUHJvdG9jb2wuSW5pdCggc3RydWMsICciIDw8IG5hbWUgPDwgIicpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgIm9wcm90LldyaXRlU3RydWN0QmVnaW4oc3RydWMpOyIgPDwgZW5kbDsKKworICBpZiAoZmllbGRzLnNpemUoKSA+IDApIHsKKyAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiVGhyaWZ0LlByb3RvY29sLkluaXQoIGZpZWxkXyk7IiA8PCBlbmRsOworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiaWYgKF9faXNzZXRfIiA8PCBwcm9wX25hbWUoKmZfaXRlciwgaXNfZXhjZXB0aW9uKSA8PCAiKSB0aGVuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cF9pbXBsKCk7CisgICAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiZmllbGRfLk5hbWUgOj0gJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJmaWVsZF8uVHlwZV8gIDo9ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIjsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImZpZWxkXy5JRCA6PSAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICI7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgIm9wcm90LldyaXRlRmllbGRCZWdpbihmaWVsZF8pOyIgPDwgZW5kbDsKKyAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChjb2RlX2Jsb2NrLCBpc19leGNlcHRpb24sICpmX2l0ZXIsICJTZWxmLiIsIGxvY2FsX3ZhcnMpOworICAgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgIm9wcm90LldyaXRlRmllbGRFbmQoKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bl9pbXBsKCk7CisgICAgfQorICB9CisKKyAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgIm9wcm90LldyaXRlRmllbGRTdG9wKCk7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAib3Byb3QuV3JpdGVTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIHN0cmluZyBjbHNfbm07CisKKyAgY2xzX25tID0gdHlwZV9uYW1lKHRzdHJ1Y3QsIHRydWUsIGZhbHNlLCBpc19leGNlcHRpb24sIGlzX2V4Y2VwdGlvbik7CisKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAicHJvY2VkdXJlICIgPDwgY2xzX3ByZWZpeCA8PCBjbHNfbm0gPDwgIi5Xcml0ZSggY29uc3Qgb3Byb3Q6IElQcm90b2NvbCk7IgorICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKG91dCkgPDwgInZhciIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAic3RydWMgOiBUVGhyaWZ0U3RydWN0OyIgPDwgZW5kbDsKKworICBpZiAoZmllbGRzLnNpemUoKSA+IDApIHsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJmaWVsZF8gOiBUVGhyaWZ0RmllbGQ7IiA8PCBlbmRsOworICB9CisKKyAgb3V0IDw8IGxvY2FsX3ZhcnMuc3RyKCk7CisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgb3V0IDw8IGNvZGVfYmxvY2suc3RyKCk7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X3dyaXRlcl9pbXBsKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjbHNfcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgeworCisgIG9zdHJpbmdzdHJlYW0gbG9jYWxfdmFyczsKKyAgb3N0cmluZ3N0cmVhbSBjb2RlX2Jsb2NrOworCisgIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisKKyAgaW5kZW50X2ltcGwobG9jYWxfdmFycykgPDwgInRyYWNrZXIgOiBJUHJvdG9jb2xSZWN1cnNpb25UcmFja2VyOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgInRyYWNrZXIgOj0gb3Byb3QuTmV4dFJlY3Vyc2lvbkxldmVsOyIgPDwgZW5kbDsKKworICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiVGhyaWZ0LlByb3RvY29sLkluaXQoIHN0cnVjLCAnIiA8PCBuYW1lIDw8ICInKTsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJvcHJvdC5Xcml0ZVN0cnVjdEJlZ2luKHN0cnVjKTsiIDw8IGVuZGw7CisKKyAgaWYgKGZpZWxkcy5zaXplKCkgPiAwKSB7CisgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgIlRocmlmdC5Qcm90b2NvbC5Jbml0KCBmaWVsZF8pOyIgPDwgZW5kbDsKKyAgfQorCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgc3RyaW5nIGZpZWxkbmFtZSA9IHByb3BfbmFtZSgoKmZfaXRlciksIGlzX2V4Y2VwdGlvbik7CisgICAgYm9vbCBudWxsX2FsbG93ZWQgPSB0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgYm9vbCBpc19yZXF1aXJlZCA9ICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKTsKKyAgICBib29sIGhhc19pc3NldCA9ICghaXNfcmVxdWlyZWQpOworICAgIGlmIChpc19yZXF1aXJlZCAmJiBudWxsX2FsbG93ZWQpIHsKKyAgICAgIG51bGxfYWxsb3dlZCA9IGZhbHNlOworICAgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImlmIChTZWxmLiIgPDwgZmllbGRuYW1lIDw8ICIgPSBuaWwpIiA8PCBlbmRsOworICAgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgInRoZW4gcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uSW52YWxpZERhdGEuQ3JlYXRlKCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIncmVxdWlyZWQgZmllbGQgIiA8PCBmaWVsZG5hbWUgPDwgIiBub3Qgc2V0Jyk7IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB9CisgICAgaWYgKG51bGxfYWxsb3dlZCkgeworICAgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImlmIChTZWxmLiIgPDwgZmllbGRuYW1lIDw8ICIgPD4gbmlsKSI7CisgICAgICBpZiAoaGFzX2lzc2V0KSB7CisgICAgICAgIGNvZGVfYmxvY2sgPDwgIiBhbmQgX19pc3NldF8iIDw8IGZpZWxkbmFtZTsKKyAgICAgIH0KKyAgICAgIGNvZGVfYmxvY2sgPDwgIiB0aGVuIGJlZ2luIiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwX2ltcGwoKTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKGhhc19pc3NldCkgeworICAgICAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiaWYgKF9faXNzZXRfIiA8PCBmaWVsZG5hbWUgPDwgIikgdGhlbiBiZWdpbiIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwX2ltcGwoKTsKKyAgICAgIH0KKyAgICB9CisgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImZpZWxkXy5OYW1lIDo9ICciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJzsiIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImZpZWxkXy5UeXBlXyAgOj0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiOyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJmaWVsZF8uSUQgOj0gIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAib3Byb3QuV3JpdGVGaWVsZEJlZ2luKGZpZWxkXyk7IiA8PCBlbmRsOworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChjb2RlX2Jsb2NrLCBpc19leGNlcHRpb24sICpmX2l0ZXIsICJTZWxmLiIsIGxvY2FsX3ZhcnMpOworICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJvcHJvdC5Xcml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOworICAgIGlmIChudWxsX2FsbG93ZWQgfHwgaGFzX2lzc2V0KSB7CisgICAgICBpbmRlbnRfZG93bl9pbXBsKCk7CisgICAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiZW5kOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAib3Byb3QuV3JpdGVGaWVsZFN0b3AoKTsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJvcHJvdC5Xcml0ZVN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgc3RyaW5nIGNsc19ubTsKKworICBjbHNfbm0gPSB0eXBlX25hbWUodHN0cnVjdCwgdHJ1ZSwgZmFsc2UsIGlzX2V4Y2VwdGlvbiwgaXNfZXhjZXB0aW9uKTsKKworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJwcm9jZWR1cmUgIiA8PCBjbHNfcHJlZml4IDw8IGNsc19ubSA8PCAiLldyaXRlKCBjb25zdCBvcHJvdDogSVByb3RvY29sKTsiCisgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAidmFyIiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJzdHJ1YyA6IFRUaHJpZnRTdHJ1Y3Q7IiA8PCBlbmRsOworICBpZiAoZmllbGRzLnNpemUoKSA+IDApIHsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJmaWVsZF8gOiBUVGhyaWZ0RmllbGQ7IiA8PCBlbmRsOworICB9CisgIG91dCA8PCBsb2NhbF92YXJzLnN0cigpOworICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIG91dCA8PCBjb2RlX2Jsb2NrLnN0cigpOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVscGhpX3N0cnVjdF90b3N0cmluZ19pbXBsKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGNsc19wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194X2ZhY3RvcnkpIHsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgc3RyaW5nIGNsc19ubTsKKworICBpZiAoaXNfZXhjZXB0aW9uKSB7CisgICAgY2xzX25tID0gdHlwZV9uYW1lKHRzdHJ1Y3QsIHRydWUsICghaXNfeF9mYWN0b3J5KSwgaXNfeF9mYWN0b3J5LCB0cnVlKTsKKyAgfSBlbHNlIHsKKyAgICBjbHNfbm0gPSB0eXBlX25hbWUodHN0cnVjdCwgdHJ1ZSwgZmFsc2UpOworICB9CisKKyAgc3RyaW5nIHRtcF9zYiA9IHRtcCgiX3NiIik7CisgIHN0cmluZyB0bXBfZmlyc3QgPSB0bXAoIl9maXJzdCIpOworICBib29sIHVzZUZpcnN0RmxhZyA9IGZhbHNlOworCisgIGluZGVudF9pbXBsKG91dCkgPDwgImZ1bmN0aW9uICIgPDwgY2xzX3ByZWZpeCA8PCBjbHNfbm0gPDwgIi5Ub1N0cmluZzogc3RyaW5nOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAidmFyIiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworICBpbmRlbnRfaW1wbChvdXQpIDw8IHRtcF9zYiA8PCAiIDogVFRocmlmdFN0cmluZ0J1aWxkZXI7IiA8PCBlbmRsOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGJvb2wgaXNfb3B0aW9uYWwgPSAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCk7CisgICAgaWYgKGlzX29wdGlvbmFsKSB7CisgICAgICBpbmRlbnRfaW1wbChvdXQpIDw8IHRtcF9maXJzdCA8PCAiIDogU3lzdGVtLkJvb2xlYW47IiA8PCBlbmRsOworICAgICAgdXNlRmlyc3RGbGFnID0gdHJ1ZTsKKyAgICB9CisgICAgYnJlYWs7CisgIH0KKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKworICBpbmRlbnRfaW1wbChvdXQpIDw8IHRtcF9zYiA8PCAiIDo9IFRUaHJpZnRTdHJpbmdCdWlsZGVyLkNyZWF0ZSgnKCcpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAidHJ5IiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworCisgIGlmICh1c2VGaXJzdEZsYWcpIHsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8IHRtcF9maXJzdCA8PCAiIDo9IFRSVUU7IiA8PCBlbmRsOworICB9CisKKyAgYm9vbCBoYWRfcmVxdWlyZWQgPSBmYWxzZTsgLy8gc2V0IHRvIHRydWUgYWZ0ZXIgZmlyc3QgcmVxdWlyZWQgZmllbGQgaGFzIGJlZW4gcHJvY2Vzc2VkCisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBib29sIG51bGxfYWxsb3dlZCA9IHR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICBib29sIGlzX29wdGlvbmFsID0gKCgqZl9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpOworICAgIGlmIChudWxsX2FsbG93ZWQpIHsKKyAgICAgIGluZGVudF9pbXBsKG91dCkgPDwgImlmIChTZWxmLiIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSwgaXNfZXhjZXB0aW9uKSA8PCAiIDw+IG5pbCkiOworICAgICAgaWYgKGlzX29wdGlvbmFsKSB7CisgICAgICAgIG91dCA8PCAiIGFuZCBfX2lzc2V0XyIgPDwgcHJvcF9uYW1lKCpmX2l0ZXIsIGlzX2V4Y2VwdGlvbik7CisgICAgICB9CisgICAgICBvdXQgPDwgIiB0aGVuIGJlZ2luIiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwX2ltcGwoKTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKGlzX29wdGlvbmFsKSB7CisgICAgICAgIGluZGVudF9pbXBsKG91dCkgPDwgImlmIChfX2lzc2V0XyIgPDwgcHJvcF9uYW1lKCpmX2l0ZXIsIGlzX2V4Y2VwdGlvbikgPDwgIikgdGhlbiBiZWdpbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXBfaW1wbCgpOworICAgICAgfQorICAgIH0KKworICAgIGlmICh1c2VGaXJzdEZsYWcgJiYgKCFoYWRfcmVxdWlyZWQpKSB7CisgICAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJpZiBub3QgIiA8PCB0bXBfZmlyc3QgPDwgIiB0aGVuICIgPDwgdG1wX3NiIDw8ICIuQXBwZW5kKCcsJyk7IiA8PCBlbmRsOworICAgICAgaWYgKGlzX29wdGlvbmFsKSB7CisgICAgICAgIGluZGVudF9pbXBsKG91dCkgPDwgdG1wX2ZpcnN0IDw8ICIgOj0gRkFMU0U7IiA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50X2ltcGwob3V0KSA8PCB0bXBfc2IgPDwgIi5BcHBlbmQoJyIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSwgaXNfZXhjZXB0aW9uKSA8PCAiOiAnKTsiCisgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudF9pbXBsKG91dCkgPDwgdG1wX3NiIDw8ICIuQXBwZW5kKCcsICIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSwgaXNfZXhjZXB0aW9uKSA8PCAiOiAnKTsiCisgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfQorCisgICAgdF90eXBlKiB0dHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICB3aGlsZSAodHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgICAgdHR5cGUgPSAoKHRfdHlwZWRlZiopdHR5cGUpLT5nZXRfdHlwZSgpOworICAgIH0KKworICAgIGlmICh0dHlwZS0+aXNfeGNlcHRpb24oKSB8fCB0dHlwZS0+aXNfc3RydWN0KCkpIHsKKyAgICAgIGluZGVudF9pbXBsKG91dCkgPDwgImlmIChTZWxmLiIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSwgaXNfZXhjZXB0aW9uKSA8PCAiID0gbmlsKSB0aGVuICIgPDwgdG1wX3NiCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICIuQXBwZW5kKCc8bnVsbD4nKSBlbHNlICIgPDwgdG1wX3NiIDw8ICIuQXBwZW5kKCBTZWxmLiIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSwgaXNfZXhjZXB0aW9uKSA8PCAiLlRvU3RyaW5nKCkpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIGluZGVudF9pbXBsKG91dCkgPDwgdG1wX3NiIDw8ICIuQXBwZW5kKFN5c3RlbS5JbnRlZ2VyKCBTZWxmLiIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSwgaXNfZXhjZXB0aW9uKQorICAgICAgICAgICAgICAgICAgICAgICA8PCAiKSk7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnRfaW1wbChvdXQpIDw8IHRtcF9zYiA8PCAiLkFwcGVuZCggU2VsZi4iIDw8IHByb3BfbmFtZSgoKmZfaXRlciksIGlzX2V4Y2VwdGlvbikgPDwgIik7IgorICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIH0KKworICAgIGlmIChudWxsX2FsbG93ZWQgfHwgaXNfb3B0aW9uYWwpIHsKKyAgICAgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgICAgIGluZGVudF9pbXBsKG91dCkgPDwgImVuZDsiIDw8IGVuZGw7CisgICAgfQorCisgICAgaWYgKCFpc19vcHRpb25hbCkgeworICAgICAgaGFkX3JlcXVpcmVkID0gdHJ1ZTsgLy8gbm93IF9fZmlyc3QgbXVzdCBiZSBmYWxzZSwgc28gd2UgZG9uJ3QgbmVlZCB0byBjaGVjayBpdCBhbnltb3JlCisgICAgfQorICB9CisKKyAgaW5kZW50X2ltcGwob3V0KSA8PCB0bXBfc2IgPDwgIi5BcHBlbmQoJyknKTsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKG91dCkgPDwgIlJlc3VsdCA6PSAiIDw8IHRtcF9zYiA8PCAiLlRvU3RyaW5nOyIgPDwgZW5kbDsKKyAgaWYgKHVzZUZpcnN0RmxhZykgeworICAgIGluZGVudF9pbXBsKG91dCkgPDwgImlmICIgPDwgdG1wX2ZpcnN0IDw8ICIgdGhlbiB7cHJldmVudCB3YXJuaW5nfTsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKG91dCkgPDwgImZpbmFsbHkiIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisgIGluZGVudF9pbXBsKG91dCkgPDwgdG1wX3NiIDw8ICIuRnJlZTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiZW5kOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKG91dCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKK30KKworYm9vbCB0X2RlbHBoaV9nZW5lcmF0b3I6OmlzX3ZvaWQodF90eXBlKiB0eXBlKSB7CisgIHdoaWxlICh0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICB0eXBlID0gKCh0X3R5cGVkZWYqKXR5cGUpLT5nZXRfdHlwZSgpOworICB9CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIGlmICh0YmFzZSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCitUSFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKAorICAgIGRlbHBoaSwKKyAgICAiZGVscGhpIiwKKyAgICAiICAgIGFuc2lzdHJfYmluYXJ5OiAgVXNlIEFuc2lTdHJpbmcgZm9yIGJpbmFyeSBkYXRhdHlwZSAoZGVmYXVsdCBpcyBUQnl0ZXMpLlxuIgorICAgICIgICAgcmVnaXN0ZXJfdHlwZXM6ICBFbmFibGUgVHlwZVJlZ2lzdHJ5LCBhbGxvd3MgZm9yIGNyZWF0aW9uIG9mIHN0cnVjdCwgdW5pb25cbiIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgYW5kIGNvbnRhaW5lciBpbnN0YW5jZXMgYnkgaW50ZXJmYWNlIG9yIFR5cGVJbmZvKClcbiIKKyAgICAiICAgIGNvbnN0cHJlZml4OiAgICAgTmFtZSBUQ29uc3RhbnRzIGNsYXNzZXMgYWZ0ZXIgSURMIHRvIHJlZHVjZSBhbWJpZ3VpdGllc1xuIgorICAgICIgICAgZXZlbnRzOiAgICAgICAgICBFbmFibGUgYW5kIHVzZSBwcm9jZXNzaW5nIGV2ZW50cyBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUuXG4iCisgICAgIiAgICB4bWxkb2M6ICAgICAgICAgIEVuYWJsZSBYTUxEb2MgY29tbWVudHMgZm9yIEhlbHAgSW5zaWdodCBldGMuXG4iCisgICAgIiAgICBhc3luYzogICAgICAgICAgIEdlbmVyYXRlIElBc3luYyBpbnRlcmZhY2UgdG8gdXNlIFBhcmFsbGVsIFByb2dyYW1taW5nIExpYnJhcnkgKFhFNysgb25seSkuXG4iKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9lcmxfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9lcmxfZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyZDkxYTcKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2VybF9nZW5lcmF0b3IuY2MKQEAgLTAsMCArMSwxMjgxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgInRocmlmdC9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInRocmlmdC92ZXJzaW9uLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmgiCisKK3VzaW5nIHN0ZDo6bWFwOwordXNpbmcgc3RkOjpvZnN0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnZlY3RvcjsKKworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGVuZGwgPSAiXG4iOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCisKKy8qKgorICogRXJsYW5nIGNvZGUgZ2VuZXJhdG9yLgorICoKKyAqLworY2xhc3MgdF9lcmxfZ2VuZXJhdG9yIDogcHVibGljIHRfZ2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgdF9lcmxfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAorICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCisgICAgOiB0X2dlbmVyYXRvcihwcm9ncmFtKSB7CisgICAgKHZvaWQpb3B0aW9uX3N0cmluZzsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworCisgICAgbGVnYWN5X25hbWVzXyA9IGZhbHNlOworICAgIG1hcHNfID0gZmFsc2U7CisgICAgb3RwMTZfID0gZmFsc2U7CisgICAgZXhwb3J0X2xpbmVzX2ZpcnN0XyA9IHRydWU7CisgICAgZXhwb3J0X3R5cGVzX2xpbmVzX2ZpcnN0XyA9IHRydWU7CisKKyAgICBmb3IoIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5iZWdpbigpOyBpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJsZWdhY3luYW1lcyIpID09IDApIHsKKyAgICAgICAgbGVnYWN5X25hbWVzXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoIm1hcHMiKSA9PSAwKSB7CisgICAgICAgIG1hcHNfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgib3RwMTYiKSA9PSAwKSB7CisgICAgICAgIG90cDE2XyA9IHRydWU7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24gZXJsOiIgKyBpdGVyLT5maXJzdDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobWFwc18gJiYgb3RwMTZfKSB7CisgICAgICB0aHJvdyAiYXJndW1lbnQgZXJyb3I6IENhbm5vdCBzcGVjaWZ5IGJvdGggbWFwcyBhbmQgb3RwMTY7IG1hcHMgYXJlIG5vdCBhdmFpbGFibGUgZm9yIEVybGFuZy9PVFAgUjE2IG9yIG9sZGVyIjsKKyAgICB9CisKKyAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1lcmwiOworICB9CisKKyAgLyoqCisgICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKKyAgICovCisKKyAgdm9pZCBpbml0X2dlbmVyYXRvcigpOworICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOworCisgIC8qKgorICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pOworICB2b2lkIGdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX21lbWJlcl90eXBlKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUpOworICB2b2lkIGdlbmVyYXRlX21lbWJlcl92YWx1ZShzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX21lbWJlcl90eXBlKHRfZmllbGQqIGZpZWxkKTsKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX21lbWJlcl92YWx1ZSh0X2ZpZWxkKiBmaWVsZCk7CisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9tZW1iZXJfcmVxdWlyZWRuZXNzKHRfZmllbGQqIGZpZWxkKTsKKworICAvLyAgc3RkOjpzdHJpbmcgcmVuZGVyX2RlZmF1bHRfdmFsdWUodF90eXBlKiB0eXBlKTsKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX2RlZmF1bHRfdmFsdWUodF9maWVsZCogZmllbGQpOworICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisgIHN0ZDo6c3RyaW5nIHJlbmRlcl90eXBlX3Rlcm0odF90eXBlKiB0dHlwZSwgYm9vbCBleHBhbmRfc3RydWN0cywgYm9vbCBleHRlbmRlZF9pbmZvID0gZmFsc2UpOworCisgIC8qKgorICAgKiBTdHJ1Y3QgZ2VuZXJhdGlvbiBjb2RlCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfZXJsX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX2VybF9zdHJ1Y3RfZGVmaW5pdGlvbihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2VybF9zdHJ1Y3RfbWVtYmVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0bWVtYmVyKTsKKyAgdm9pZCBnZW5lcmF0ZV9lcmxfc3RydWN0X2luZm8oc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9lcmxfZXh0ZW5kZWRfc3RydWN0X2luZm8oc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9lcmxfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICB2b2lkIGdlbmVyYXRlX3R5cGVfbWV0YWRhdGEoc3RkOjpzdHJpbmcgZnVuY3Rpb25fbmFtZSwgdmVjdG9yPHN0cmluZz4gbmFtZXMpOworICB2b2lkIGdlbmVyYXRlX2VudW1faW5mbyh0X2VudW0qIHRlbnVtKTsKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtX21ldGFkYXRhKCk7CisgIHZvaWQgZ2VuZXJhdGVfY29uc3RfZnVuY3Rpb24odF9jb25zdCogdGNvbnN0LCBvc3RyaW5nc3RyZWFtJiBleHBvcnRzLCBvc3RyaW5nc3RyZWFtJiBmdW5jdGlvbnMpOworICB2b2lkIGdlbmVyYXRlX2NvbnN0X2Z1bmN0aW9ucygpOworCisgIC8qKgorICAgKiBTZXJ2aWNlLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfbWV0YWRhdGEodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfZnVuY3Rpb25faW5mbyh0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworCisgIC8qKgorICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucworICAgKi8KKworICBzdGQ6OnN0cmluZyBlcmxfYXV0b2dlbl9jb21tZW50KCk7CisgIHN0ZDo6c3RyaW5nIGVybF9pbXBvcnRzKCk7CisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9pbmNsdWRlcygpOworICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSk7CisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9jb25zdF9saXN0X3ZhbHVlcyh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKKworICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgIHN0ZDo6c3RyaW5nIHR5cGVfdG9fZW51bSh0X3R5cGUqIHR0eXBlKTsKKyAgc3RkOjpzdHJpbmcgdHlwZV9tb2R1bGUodF90eXBlKiB0dHlwZSk7CisKKyAgc3RkOjpzdHJpbmcgbWFrZV9zYWZlX2Zvcl9tb2R1bGVfbmFtZShzdGQ6OnN0cmluZyBpbikgeworICAgIGlmIChsZWdhY3lfbmFtZXNfKSB7CisgICAgICByZXR1cm4gZGVjYXBpdGFsaXplKGluKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIHVuZGVyc2NvcmUoaW4pOworICAgIH0KKyAgfQorCisgIHN0ZDo6c3RyaW5nIGF0b21pZnkoc3RkOjpzdHJpbmcgaW4pIHsKKyAgICBpZiAobGVnYWN5X25hbWVzXykgeworICAgICAgcmV0dXJuICInIiArIGRlY2FwaXRhbGl6ZShpbikgKyAiJyI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAiJyIgKyBpbiArICInIjsKKyAgICB9CisgIH0KKworICBzdGQ6OnN0cmluZyBjb25zdGlmeShzdGQ6OnN0cmluZyBpbikgeworICAgIGlmIChsZWdhY3lfbmFtZXNfKSB7CisgICAgICByZXR1cm4gY2FwaXRhbGl6ZShpbik7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiB1cHBlcmNhc2UoaW4pOworICAgIH0KKyAgfQorCisgIHN0YXRpYyBzdGQ6OnN0cmluZyBjb21tZW50KHN0cmluZyBpbik7CisKK3ByaXZhdGU6CisgIGJvb2wgaGFzX2RlZmF1bHRfdmFsdWUodF9maWVsZCopOworCisgIC8qIGlmIHRydWUgcmV0YWluIHByZSAwLjkuMiBuYW1pbmcgc2NoZW1lIGZvciBmdW5jdGlvbnMsIGF0b21zIGFuZCBjb25zdHMgKi8KKyAgYm9vbCBsZWdhY3lfbmFtZXNfOworCisgIC8qIGlmIHRydWUgdXNlIG1hcHMgaW5zdGVhZCBvZiBkaWN0cyBpbiBnZW5lcmF0ZWQgY29kZSAqLworICBib29sIG1hcHNfOworCisgIC8qIGlmIHRydWUgdXNlIG5vbi1uYW1lc3BhY2VkIGRpY3QgYW5kIHNldCBpbnN0ZWFkIG9mIGRpY3Q6ZGljdCBhbmQgc2V0czpzZXQgKi8KKyAgYm9vbCBvdHAxNl87CisKKyAgLyoqCisgICAqIGFkZCBmdW5jdGlvbiB0byBleHBvcnQgbGlzdAorICAgKi8KKworICB2b2lkIGV4cG9ydF9mdW5jdGlvbih0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgdm9pZCBleHBvcnRfc3RyaW5nKHN0ZDo6c3RyaW5nIG5hbWUsIGludCBudW0pOworCisgIHZvaWQgZXhwb3J0X3R5cGVzX3N0cmluZyhzdGQ6OnN0cmluZyBuYW1lLCBpbnQgbnVtKTsKKworICAvKioKKyAgICogd3JpdGUgb3V0IGhlYWRlcnMgYW5kIGZvb3RlcnMgZm9yIGhybCBmaWxlcworICAgKi8KKworICB2b2lkIGhybF9oZWFkZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIG5hbWUpOworICB2b2lkIGhybF9mb290ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIG5hbWUpOworCisgIC8qKgorICAgKiBzdHVmZiB0byBzcGl0IG91dCBhdCB0aGUgdG9wIG9mIGdlbmVyYXRlZCBmaWxlcworICAgKi8KKworICBib29sIGV4cG9ydF9saW5lc19maXJzdF87CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBleHBvcnRfbGluZXNfOworCisgIGJvb2wgZXhwb3J0X3R5cGVzX2xpbmVzX2ZpcnN0XzsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIGV4cG9ydF90eXBlc19saW5lc187CisKKyAgLyoqCisgICAqIEZpbGUgc3RyZWFtcworICAgKi8KKworICBzdGQ6Om9zdHJpbmdzdHJlYW0gZl9pbmZvXzsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIGZfaW5mb19leHRfOworCisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl90eXBlc19maWxlXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3R5cGVzX2hybF9maWxlXzsKKworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfY29uc3RzX2ZpbGVfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfY29uc3RzX2hybF9maWxlXzsKKworICBzdGQ6Om9zdHJpbmdzdHJlYW0gZl9zZXJ2aWNlXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3NlcnZpY2VfZmlsZV87CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9zZXJ2aWNlX2hybF87CisKKyAgLyoqCisgICAqIE1ldGFkYXRhIGNvbnRhaW5lcnMKKyAgICovCisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiB2X3N0cnVjdF9uYW1lc187CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiB2X2VudW1fbmFtZXNfOworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gdl9leGNlcHRpb25fbmFtZXNfOworICBzdGQ6OnZlY3Rvcjx0X2VudW0qPiB2X2VudW1zXzsKKyAgc3RkOjp2ZWN0b3I8dF9jb25zdCo+IHZfY29uc3RzXzsKK307CisKKy8qKgorICogVUkgZm9yIGZpbGUgZ2VuZXJhdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBuZWNlc3NhcnkgZmlsZSBvdXRwdXQKKyAqIHN0cmVhbXMuCisgKgorICogQHBhcmFtIHRwcm9ncmFtIFRoZSBwcm9ncmFtIHRvIGdlbmVyYXRlCisgKi8KK3ZvaWQgdF9lcmxfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKKyAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5CisgIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7CisKKyAgLy8gc2V0dXAgZXhwb3J0IGxpbmVzCisgIGV4cG9ydF9saW5lc19maXJzdF8gPSB0cnVlOworICBleHBvcnRfdHlwZXNfbGluZXNfZmlyc3RfID0gdHJ1ZTsKKworICBzdHJpbmcgcHJvZ3JhbV9tb2R1bGVfbmFtZSA9IG1ha2Vfc2FmZV9mb3JfbW9kdWxlX25hbWUocHJvZ3JhbV9uYW1lXyk7CisKKyAgLy8gdHlwZXMgZmlsZXMKKyAgc3RyaW5nIGZfdHlwZXNfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBwcm9ncmFtX21vZHVsZV9uYW1lICsgIl90eXBlcy5lcmwiOworICBzdHJpbmcgZl90eXBlc19ocmxfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBwcm9ncmFtX21vZHVsZV9uYW1lICsgIl90eXBlcy5ocmwiOworCisgIGZfdHlwZXNfZmlsZV8ub3BlbihmX3R5cGVzX25hbWUuY19zdHIoKSk7CisgIGZfdHlwZXNfaHJsX2ZpbGVfLm9wZW4oZl90eXBlc19ocmxfbmFtZS5jX3N0cigpKTsKKworICBocmxfaGVhZGVyKGZfdHlwZXNfaHJsX2ZpbGVfLCBwcm9ncmFtX21vZHVsZV9uYW1lICsgIl90eXBlcyIpOworCisgIGZfdHlwZXNfZmlsZV8gPDwgZXJsX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCAiLW1vZHVsZSgiIDw8IHByb2dyYW1fbW9kdWxlX25hbWUgPDwgIl90eXBlcykuIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgZXJsX2ltcG9ydHMoKSA8PCBlbmRsOworCisgIGZfdHlwZXNfZmlsZV8gPDwgIi1pbmNsdWRlKFwiIiA8PCBwcm9ncmFtX21vZHVsZV9uYW1lIDw8ICJfdHlwZXMuaHJsXCIpLiIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKworICBmX3R5cGVzX2hybF9maWxlXyA8PCByZW5kZXJfaW5jbHVkZXMoKSA8PCBlbmRsOworCisgIC8vIGNvbnN0cyBmaWxlcworICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBwcm9ncmFtX21vZHVsZV9uYW1lICsgIl9jb25zdGFudHMuZXJsIjsKKyAgc3RyaW5nIGZfY29uc3RzX2hybF9uYW1lID0gZ2V0X291dF9kaXIoKSArIHByb2dyYW1fbW9kdWxlX25hbWUgKyAiX2NvbnN0YW50cy5ocmwiOworCisgIGZfY29uc3RzX2ZpbGVfLm9wZW4oZl9jb25zdHNfbmFtZS5jX3N0cigpKTsKKyAgZl9jb25zdHNfaHJsX2ZpbGVfLm9wZW4oZl9jb25zdHNfaHJsX25hbWUuY19zdHIoKSk7CisKKyAgZl9jb25zdHNfZmlsZV8gPDwgZXJsX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgIi1tb2R1bGUoIiA8PCBwcm9ncmFtX21vZHVsZV9uYW1lIDw8ICJfY29uc3RhbnRzKS4iIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgZXJsX2ltcG9ydHMoKSA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8ICItaW5jbHVkZShcIiIgPDwgcHJvZ3JhbV9tb2R1bGVfbmFtZSA8PCAiX3R5cGVzLmhybFwiKS4iIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKworICBmX2NvbnN0c19ocmxfZmlsZV8gPDwgZXJsX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGwgPDwgZXJsX2ltcG9ydHMoKSA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICA8PCAiLWluY2x1ZGUoXCIiIDw8IHByb2dyYW1fbW9kdWxlX25hbWUgPDwgIl90eXBlcy5ocmxcIikuIiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogQm9pbGVycGxhdGUgYXQgYmVnaW5uaW5nIGFuZCBlbmQgb2YgaGVhZGVyIGZpbGVzCisgKi8KK3ZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpocmxfaGVhZGVyKG9zdHJlYW0mIG91dCwgc3RyaW5nIG5hbWUpIHsKKyAgb3V0IDw8ICItaWZuZGVmKF8iIDw8IG5hbWUgPDwgIl9pbmNsdWRlZCkuIiA8PCBlbmRsIDw8ICItZGVmaW5lKF8iIDw8IG5hbWUgPDwgIl9pbmNsdWRlZCwgeWVhaCkuIgorICAgICAgPDwgZW5kbDsKK30KKwordm9pZCB0X2VybF9nZW5lcmF0b3I6OmhybF9mb290ZXIob3N0cmVhbSYgb3V0LCBzdHJpbmcgbmFtZSkgeworICAodm9pZCluYW1lOworICBvdXQgPDwgIi1lbmRpZi4iIDw8IGVuZGw7Cit9CisKKy8qKgorICogUmVuZGVycyBhbGwgdGhlIGltcG9ydHMgbmVjZXNzYXJ5IGZvciBpbmNsdWRpbmcgYW5vdGhlciBUaHJpZnQgcHJvZ3JhbQorICovCitzdHJpbmcgdF9lcmxfZ2VuZXJhdG9yOjpyZW5kZXJfaW5jbHVkZXMoKSB7CisgIGNvbnN0IHZlY3Rvcjx0X3Byb2dyYW0qPiYgaW5jbHVkZXMgPSBwcm9ncmFtXy0+Z2V0X2luY2x1ZGVzKCk7CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmNsdWRlcy5zaXplKCk7ICsraSkgeworICAgIHJlc3VsdCArPSAiLWluY2x1ZGUoXCIiICsgbWFrZV9zYWZlX2Zvcl9tb2R1bGVfbmFtZShpbmNsdWRlc1tpXS0+Z2V0X25hbWUoKSkKKyAgICAgICAgICAgICAgKyAiX3R5cGVzLmhybFwiKS5cbiI7CisgIH0KKyAgaWYgKGluY2x1ZGVzLnNpemUoKSA+IDApIHsKKyAgICByZXN1bHQgKz0gIlxuIjsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIEF1dG9nZW4nZCBjb21tZW50CisgKi8KK3N0cmluZyB0X2VybF9nZW5lcmF0b3I6OmVybF9hdXRvZ2VuX2NvbW1lbnQoKSB7CisgIHJldHVybiBzdGQ6OnN0cmluZygiJSVcbiIpICsgIiUlIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgiICsgVEhSSUZUX1ZFUlNJT04gKyAiKVxuIgorICAgICAgICAgKyAiJSVcbiIgKyAiJSUgRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lOR1xuIgorICAgICAgICAgKyAiJSVcbiI7Cit9CisKKy8qKgorICogQ29tbWVudCBvdXQgdGV4dAorICovCisKK3N0cmluZyB0X2VybF9nZW5lcmF0b3I6OmNvbW1lbnQoc3RyaW5nIGluKSB7CisgIHNpemVfdCBwb3MgPSAwOworICBpbi5pbnNlcnQocG9zLCAiJSUgIik7CisgIHdoaWxlICgocG9zID0gaW4uZmluZF9maXJzdF9vZignXG4nLCBwb3MpKSAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICBpbi5pbnNlcnQoKytwb3MsICIlJSAiKTsKKyAgfQorICByZXR1cm4gaW47Cit9CisKKy8qKgorICogUHJpbnRzIHN0YW5kYXJkIHRocmlmdCBpbXBvcnRzCisgKi8KK3N0cmluZyB0X2VybF9nZW5lcmF0b3I6OmVybF9pbXBvcnRzKCkgeworICByZXR1cm4gIiI7Cit9CisKKy8qKgorICogQ2xvc2VzIHRoZSB0eXBlIGZpbGVzCisgKi8KK3ZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7CisKKyAgZXhwb3J0X3R5cGVzX3N0cmluZygic3RydWN0X2luZm8iLCAxKTsKKyAgZXhwb3J0X3R5cGVzX3N0cmluZygic3RydWN0X2luZm9fZXh0IiwgMSk7CisgIGV4cG9ydF90eXBlc19zdHJpbmcoImVudW1faW5mbyIsIDEpOworICBleHBvcnRfdHlwZXNfc3RyaW5nKCJlbnVtX25hbWVzIiwgMCk7CisgIGV4cG9ydF90eXBlc19zdHJpbmcoInN0cnVjdF9uYW1lcyIsIDApOworICBleHBvcnRfdHlwZXNfc3RyaW5nKCJleGNlcHRpb25fbmFtZXMiLCAwKTsKKworICBmX3R5cGVzX2ZpbGVfIDw8ICItZXhwb3J0KFsiIDw8IGV4cG9ydF90eXBlc19saW5lc18uc3RyKCkgPDwgIl0pLiIgPDwgZW5kbCA8PCBlbmRsOworCisgIGZfdHlwZXNfZmlsZV8gPDwgZl9pbmZvXy5zdHIoKTsKKyAgZl90eXBlc19maWxlXyA8PCAic3RydWN0X2luZm8oXykgLT4gZXJsYW5nOmVycm9yKGZ1bmN0aW9uX2NsYXVzZSkuIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZl90eXBlc19maWxlXyA8PCBmX2luZm9fZXh0Xy5zdHIoKTsKKyAgZl90eXBlc19maWxlXyA8PCAic3RydWN0X2luZm9fZXh0KF8pIC0+IGVybGFuZzplcnJvcihmdW5jdGlvbl9jbGF1c2UpLiIgPDwgZW5kbCA8PCBlbmRsOworCisgIGdlbmVyYXRlX2NvbnN0X2Z1bmN0aW9ucygpOworCisgIGdlbmVyYXRlX3R5cGVfbWV0YWRhdGEoInN0cnVjdF9uYW1lcyIsIHZfc3RydWN0X25hbWVzXyk7CisgIGdlbmVyYXRlX2VudW1fbWV0YWRhdGEoKTsKKyAgZ2VuZXJhdGVfdHlwZV9tZXRhZGF0YSgiZW51bV9uYW1lcyIsIHZfZW51bV9uYW1lc18pOworICBnZW5lcmF0ZV90eXBlX21ldGFkYXRhKCJleGNlcHRpb25fbmFtZXMiLCB2X2V4Y2VwdGlvbl9uYW1lc18pOworCisgIGhybF9mb290ZXIoZl90eXBlc19ocmxfZmlsZV8sIHN0cmluZygiQk9HVVMiKSk7CisKKyAgZl90eXBlc19maWxlXy5jbG9zZSgpOworICBmX3R5cGVzX2hybF9maWxlXy5jbG9zZSgpOworICBmX2NvbnN0c19maWxlXy5jbG9zZSgpOworICBmX2NvbnN0c19ocmxfZmlsZV8uY2xvc2UoKTsKK30KKworY29uc3Qgc3RkOjpzdHJpbmcgZW1pdF9kb3VibGVfYXNfc3RyaW5nKGNvbnN0IGRvdWJsZSB2YWx1ZSkgeworICBzdGQ6OnN0cmluZ3N0cmVhbSBkb3VibGVfb3V0cHV0X3N0cmVhbTsKKyAgLy8gc2V0cyB0aGUgbWF4aW11bSBwcmVjaXNpb246IGh0dHA6Ly9lbi5jcHByZWZlcmVuY2UuY29tL3cvY3BwL2lvL21hbmlwL3NldHByZWNpc2lvbgorICAvLyBzZXRzIHRoZSBvdXRwdXQgZm9ybWF0IHRvIGZpeGVkOiBodHRwOi8vZW4uY3BwcmVmZXJlbmNlLmNvbS93L2NwcC9pby9tYW5pcC9maXhlZCAobm90IGluIHNjaWVudGlmaWMgbm90YXRpb24pCisgIGRvdWJsZV9vdXRwdXRfc3RyZWFtIDw8IHN0ZDo6c2V0cHJlY2lzaW9uKHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6ZGlnaXRzMTAgKyAxKTsKKworICAjaWZkZWYgX01TQ19WRVIKKyAgICAgIC8vIHN0cnRvZCBpcyBicm9rZW4gaW4gTVNWQyBjb21waWxlcnMgb2xkZXIgdGhhbiAyMDE1LCBzbyBzdGQ6OmZpeGVkIGZhaWxzIHRvIGZvcm1hdCBhIGRvdWJsZSBsaXRlcmFsLgorICAgICAgLy8gbW9yZSBkZXRhaWxzOiBodHRwczovL2Jsb2dzLm1zZG4ubWljcm9zb2Z0LmNvbS92Y2Jsb2cvMjAxNC8wNi8xOC8KKyAgICAgIC8vICAgICAgICAgICAgICAgYy1ydW50aW1lLWNydC1mZWF0dXJlcy1maXhlcy1hbmQtYnJlYWtpbmctY2hhbmdlcy1pbi12aXN1YWwtc3R1ZGlvLTE0LWN0cDEvCisgICAgICAvLyAgICAgICAgICAgICAgIGFuZAorICAgICAgLy8gICAgICAgICAgICAgICBodHRwOi8vd3d3LmV4cGxvcmluZ2JpbmFyeS5jb20vdmlzdWFsLWMtcGx1cy1wbHVzLXN0cnRvZC1zdGlsbC1icm9rZW4vCisgICAgICAjaWYgX01TQ19WRVIgPj0gTVNDXzIwMTVfVkVSCisgICAgICAgICAgZG91YmxlX291dHB1dF9zdHJlYW0gPDwgc3RkOjpmaXhlZDsKKyAgICAgICNlbHNlCisgICAgICAgICAgLy8gbm90ZSB0aGF0IGlmIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gdGhlIGVybGFuZyBnZW5lcmF0b3IgYW5kIHRoZSBNU1ZDIGNvbXBpbGVyIGlzIG9sZGVyIHRoYW4gMjAxNSwKKyAgICAgICAgICAvLyB0aGUgZG91YmxlIGxpdGVyYWwgbXVzdCBiZSBvdXRwdXQgaW4gdGhlIHNjaWVudGlmaWMgZm9ybWF0LiBUaGVyZSBjYW4gYmUgc29tZSBjYXNlcyB3aGVyZSB0aGUKKyAgICAgICAgICAvLyBtYW50aXNzYSBvZiB0aGUgb3V0cHV0IGRvZXMgbm90IGhhdmUgZnJhY3Rpb25hbHMsIHdoaWNoIGlzIGlsbGVnYWwgaW4gRXJsYW5nLgorICAgICAgICAgIC8vIGV4YW1wbGUgPT4gMTAwMDAwMDAwMDAwMDAwMDAuMCBiZWluZyBvdXRwdXQgYXMgMWUrMTYKKyAgICAgICAgICBkb3VibGVfb3V0cHV0X3N0cmVhbSA8PCBzdGQ6OnNjaWVudGlmaWM7CisgICAgICAjZW5kaWYKKyAgI2Vsc2UKKyAgICAgIGRvdWJsZV9vdXRwdXRfc3RyZWFtIDw8IHN0ZDo6Zml4ZWQ7CisgICNlbmRpZgorCisgIGRvdWJsZV9vdXRwdXRfc3RyZWFtIDw8IHZhbHVlOworCisgIHJldHVybiBkb3VibGVfb3V0cHV0X3N0cmVhbS5zdHIoKTsKK30KKwordm9pZCB0X2VybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVfbWV0YWRhdGEoc3RkOjpzdHJpbmcgZnVuY3Rpb25fbmFtZSwgdmVjdG9yPHN0cmluZz4gbmFtZXMpIHsKKyAgc2l6ZV90IG51bV9zdHJ1Y3RzID0gbmFtZXMuc2l6ZSgpOworCisgIGluZGVudChmX3R5cGVzX2ZpbGVfKSA8PCBmdW5jdGlvbl9uYW1lIDw8ICIoKSAtPlxuIjsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChmX3R5cGVzX2ZpbGVfKSA8PCAiWyI7CisKKworICBmb3Ioc2l6ZV90IGk9MDsgaSA8IG51bV9zdHJ1Y3RzOyBpKyspIHsKKyAgICBmX3R5cGVzX2ZpbGVfIDw8IG5hbWVzLmF0KGkpOworCisgICAgaWYgKGkgPCBudW1fc3RydWN0cyAtIDEpIHsKKyAgICAgIGZfdHlwZXNfZmlsZV8gPDwgIiwgIjsKKyAgICB9CisgIH0KKworICBmX3R5cGVzX2ZpbGVfIDw8ICJdLlxuXG4iOworICBpbmRlbnRfZG93bigpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIG5vIG9wCisgKgorICogQHBhcmFtIHR0eXBlZGVmIFRoZSB0eXBlIGRlZmluaXRpb24KKyAqLwordm9pZCB0X2VybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgeworICAodm9pZCl0dHlwZWRlZjsKK30KKworCit2b2lkIHRfZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3RfZnVuY3Rpb24odF9jb25zdCogdGNvbnN0LCBvc3RyaW5nc3RyZWFtJiBleHBvcnRzLCBvc3RyaW5nc3RyZWFtJiBmdW5jdGlvbnMpIHsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0Y29uc3QtPmdldF90eXBlKCkpOworICBzdHJpbmcgbmFtZSA9IHRjb25zdC0+Z2V0X25hbWUoKTsKKyAgdF9jb25zdF92YWx1ZSogdmFsdWUgPSB0Y29uc3QtPmdldF92YWx1ZSgpOworCisgIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICBzdHJpbmcgY29uc3RfZnVuX25hbWUgPSBsb3dlcmNhc2UobmFtZSk7CisKKyAgICAvLyBFbWl0IGNvbnN0IGZ1bmN0aW9uIGV4cG9ydC4KKyAgICBpZiAoZXhwb3J0cy50ZWxscCgpID4gMCkgeyBleHBvcnRzIDw8ICIsICI7IH0KKyAgICBleHBvcnRzIDw8IGNvbnN0X2Z1bl9uYW1lIDw8ICIvMSwgIiA8PCBjb25zdF9mdW5fbmFtZSA8PCAiLzIiOworCisgICAgLy8gRW1pdCBjb25zdCBmdW5jdGlvbiBkZWZpbml0aW9uLgorICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciBpLCBlbmQgPSB2YWx1ZS0+Z2V0X21hcCgpLmVuZCgpOworICAgIC8vIFRoZSBvbmUtYXJndW1lbnQgZm9ybSB0aHJvd3MgYW4gZXJyb3IgaWYgdGhlIGtleSBkb2VzIG5vdCBleGlzdCBpbiB0aGUgbWFwLgorICAgIGZvciAoaSA9IHZhbHVlLT5nZXRfbWFwKCkuYmVnaW4oKTsgaSAhPSBlbmQ7KSB7CisgICAgICBmdW5jdGlvbnMgPDwgY29uc3RfZnVuX25hbWUgPDwgIigiIDw8IHJlbmRlcl9jb25zdF92YWx1ZShrdHlwZSwgaS0+Zmlyc3QpIDw8ICIpIC0+ICIKKyAgICAgICAgICAgICAgICA8PCByZW5kZXJfY29uc3RfdmFsdWUodnR5cGUsIGktPnNlY29uZCk7CisgICAgICArK2k7CisgICAgICBmdW5jdGlvbnMgPDwgKGkgIT0gZW5kID8gIjtcbiIgOiAiLlxuXG4iKTsKKyAgICB9CisKKyAgICAvLyBUaGUgdHdvLWFyZ3VtZW50IGZvcm0gcmV0dXJucyBhIGRlZmF1bHQgdmFsdWUgaWYgdGhlIGtleSBkb2VzIG5vdCBleGlzdCBpbiB0aGUgbWFwLgorICAgIGZvciAoaSA9IHZhbHVlLT5nZXRfbWFwKCkuYmVnaW4oKTsgaSAhPSBlbmQ7ICsraSkgeworICAgICAgZnVuY3Rpb25zIDw8IGNvbnN0X2Z1bl9uYW1lIDw8ICIoIiA8PCByZW5kZXJfY29uc3RfdmFsdWUoa3R5cGUsIGktPmZpcnN0KSA8PCAiLCBfKSAtPiAiCisgICAgICAgICAgICAgICAgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHZ0eXBlLCBpLT5zZWNvbmQpIDw8ICI7XG4iOworICAgIH0KKyAgICBmdW5jdGlvbnMgPDwgY29uc3RfZnVuX25hbWUgPDwgIihfLCBEZWZhdWx0KSAtPiBEZWZhdWx0LlxuXG4iOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHN0cmluZyBjb25zdF9mdW5fbmFtZSA9IGxvd2VyY2FzZShuYW1lKTsKKworICAgIGlmIChleHBvcnRzLnRlbGxwKCkgPiAwKSB7IGV4cG9ydHMgPDwgIiwgIjsgfQorICAgIGV4cG9ydHMgPDwgY29uc3RfZnVuX25hbWUgPDwgIi8xLCAiIDw8IGNvbnN0X2Z1bl9uYW1lIDw8ICIvMiI7CisKKyAgICBzaXplX3QgbGlzdF9zaXplID0gdmFsdWUtPmdldF9saXN0KCkuc2l6ZSgpOworICAgIHN0cmluZyByZW5kZXJlZF9saXN0ID0gcmVuZGVyX2NvbnN0X2xpc3RfdmFsdWVzKHR5cGUsIHZhbHVlKTsKKyAgICBmdW5jdGlvbnMgPDwgY29uc3RfZnVuX25hbWUgPDwgIihOKSB3aGVuIE4gPj0gMSwgTiA9PCAiIDw8IGxpc3Rfc2l6ZSA8PCAiIC0+XG4iCisgICAgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAiZWxlbWVudChOLCB7IiA8PCByZW5kZXJlZF9saXN0IDw8ICJ9KS5cbiI7CisgICAgZnVuY3Rpb25zIDw8IGNvbnN0X2Z1bl9uYW1lIDw8ICIoTiwgXykgd2hlbiBOID49IDEsIE4gPTwgIiA8PCBsaXN0X3NpemUgPDwgIiAtPlxuIgorICAgICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgImVsZW1lbnQoTiwgeyIgPDwgcmVuZGVyZWRfbGlzdCA8PCAifSk7XG4iCisgICAgICAgICAgICAgIDw8IGNvbnN0X2Z1bl9uYW1lIDw8ICIoXywgRGVmYXVsdCkgLT4gRGVmYXVsdC5cblxuIjsKKyAgICBpbmRlbnRfZG93bigpOworICB9Cit9CisKK3ZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdF9mdW5jdGlvbnMoKSB7CisgIG9zdHJpbmdzdHJlYW0gZXhwb3J0czsKKyAgb3N0cmluZ3N0cmVhbSBmdW5jdGlvbnM7CisgIHZlY3Rvcjx0X2NvbnN0Kj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgZm9yIChjX2l0ZXIgPSB2X2NvbnN0c18uYmVnaW4oKTsgY19pdGVyICE9IHZfY29uc3RzXy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9jb25zdF9mdW5jdGlvbigqY19pdGVyLCBleHBvcnRzLCBmdW5jdGlvbnMpOworICB9CisgIGlmIChleHBvcnRzLnRlbGxwKCkgPiAwKSB7CisgICAgZl9jb25zdHNfZmlsZV8gPDwgIi1leHBvcnQoWyIgPDwgZXhwb3J0cy5zdHIoKSA8PCAiXSkuXG5cbiIKKyAgICAgICAgICAgICAgICAgICA8PCBmdW5jdGlvbnMuc3RyKCk7CisgIH0KK30KKworCisvKioKKyAqIEdlbmVyYXRlcyBjb2RlIGZvciBhbiBlbnVtZXJhdGVkIHR5cGUuIERvbmUgdXNpbmcgYSBjbGFzcyB0byBzY29wZQorICogdGhlIHZhbHVlcy4KKyAqCisgKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCisgKi8KK3ZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOworCisgIHZfZW51bXNfLnB1c2hfYmFjayh0ZW51bSk7CisgIHZfZW51bV9uYW1lc18ucHVzaF9iYWNrKGF0b21pZnkodGVudW0tPmdldF9uYW1lKCkpKTsKKworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgICAgc3RyaW5nIG5hbWUgPSAoKmNfaXRlciktPmdldF9uYW1lKCk7CisgICAgaW5kZW50KGZfdHlwZXNfaHJsX2ZpbGVfKSA8PCAiLWRlZmluZSgiIDw8IGNvbnN0aWZ5KG1ha2Vfc2FmZV9mb3JfbW9kdWxlX25hbWUocHJvZ3JhbV9uYW1lXykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiXyIgPDwgY29uc3RpZnkodGVudW0tPmdldF9uYW1lKCkpIDw8ICJfIiA8PCBjb25zdGlmeShuYW1lKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCB2YWx1ZSA8PCAiKS4iIDw8IGVuZGw7CisgIH0KKworICBmX3R5cGVzX2hybF9maWxlXyA8PCBlbmRsOworfQorCit2b2lkIHRfZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bV9pbmZvKHRfZW51bSogdGVudW0peworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKyAgc2l6ZV90IG51bV9jb25zdGFudHMgPSBjb25zdGFudHMuc2l6ZSgpOworCisgIGluZGVudChmX3R5cGVzX2ZpbGVfKSA8PCAiZW51bV9pbmZvKCIgPDwgYXRvbWlmeSh0ZW51bS0+Z2V0X25hbWUoKSkgPDwgIikgLT5cbiI7CisgIGluZGVudF91cCgpOworICBpbmRlbnQoZl90eXBlc19maWxlXykgPDwgIltcbiI7CisKKyAgZm9yKHNpemVfdCBpPTA7IGkgPCBudW1fY29uc3RhbnRzOyBpKyspIHsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICB0X2VudW1fdmFsdWUqIHZhbHVlID0gY29uc3RhbnRzLmF0KGkpOworICAgIGluZGVudChmX3R5cGVzX2ZpbGVfKSA8PCAieyIgPDwgYXRvbWlmeSh2YWx1ZS0+Z2V0X25hbWUoKSkgPDwgIiwgIiA8PCB2YWx1ZS0+Z2V0X3ZhbHVlKCkgPDwgIn0iOworCisgICAgaWYgKGkgPCBudW1fY29uc3RhbnRzIC0gMSkgeworICAgICAgZl90eXBlc19maWxlXyA8PCAiLFxuIjsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorICBmX3R5cGVzX2ZpbGVfIDw8ICJcbiI7CisgIGluZGVudChmX3R5cGVzX2ZpbGVfKSA8PCAiXTtcblxuIjsKKyAgaW5kZW50X2Rvd24oKTsKK30KKwordm9pZCB0X2VybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW1fbWV0YWRhdGEoKSB7CisgIHNpemVfdCBlbnVtX2NvdW50ID0gdl9lbnVtc18uc2l6ZSgpOworCisgIGZvcihzaXplX3QgaT0wOyBpIDwgZW51bV9jb3VudDsgaSsrKSB7CisgICAgdF9lbnVtKiB0ZW51bSA9IHZfZW51bXNfLmF0KGkpOworICAgIGdlbmVyYXRlX2VudW1faW5mbyh0ZW51bSk7CisgIH0KKworICBpbmRlbnQoZl90eXBlc19maWxlXykgPDwgImVudW1faW5mbyhfKSAtPiBlcmxhbmc6ZXJyb3IoZnVuY3Rpb25fY2xhdXNlKS5cblxuIjsKK30KKworLyoqCisgKiBHZW5lcmF0ZSBhIGNvbnN0YW50IHZhbHVlCisgKi8KK3ZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpIHsKKyAgdF90eXBlKiB0eXBlID0gdGNvbnN0LT5nZXRfdHlwZSgpOworICBzdHJpbmcgbmFtZSA9IHRjb25zdC0+Z2V0X25hbWUoKTsKKyAgdF9jb25zdF92YWx1ZSogdmFsdWUgPSB0Y29uc3QtPmdldF92YWx1ZSgpOworCisgIC8vIFNhdmUgdGhlIHRjb25zdCBzbyB0aGF0IGZ1bmN0aW9uIGNhbiBiZSBlbWl0dGVkIGluIGdlbmVyYXRlX2NvbnN0X2Z1bmN0aW9ucygpLgorICB2X2NvbnN0c18ucHVzaF9iYWNrKHRjb25zdCk7CisKKyAgZl9jb25zdHNfaHJsX2ZpbGVfIDw8ICItZGVmaW5lKCIgPDwgY29uc3RpZnkobWFrZV9zYWZlX2Zvcl9tb2R1bGVfbmFtZShwcm9ncmFtX25hbWVfKSkgPDwgIl8iCisgICAgICAgICAgICAgICAgICAgICA8PCBjb25zdGlmeShuYW1lKSA8PCAiLCAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0eXBlLCB2YWx1ZSkgPDwgIikuIiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogUHJpbnRzIHRoZSB2YWx1ZSBvZiBhIGNvbnN0YW50IHdpdGggdGhlIGdpdmVuIHR5cGUuIE5vdGUgdGhhdCB0eXBlIGNoZWNraW5nCisgKiBpcyBOT1QgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24gYXMgaXQgaXMgYWx3YXlzIHJ1biBiZWZvcmVoYW5kIHVzaW5nIHRoZQorICogdmFsaWRhdGVfdHlwZXMgbWV0aG9kIGluIG1haW4uY2MKKyAqLworc3RyaW5nIHRfZXJsX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIG91dCA8PCAnIicgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICBvdXQgPDwgKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKKyAgICAgICAgb3V0IDw8ICJmbG9hdCgiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICIpIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCBlbWl0X2RvdWJsZV9hc19zdHJpbmcodmFsdWUtPmdldF9kb3VibGUoKSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIGluZGVudChvdXQpIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworCisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIG91dCA8PCAiIyIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICJ7IjsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOworICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKKyAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisgICAgICB9CisKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0IDw8ICIsIjsKKyAgICAgIH0KKyAgICAgIG91dCA8PCB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisgICAgICBvdXQgPDwgIiA9ICI7CisgICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSI7CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKworICAgIGlmIChtYXBzXykgeworICAgICAgb3V0IDw8ICJtYXBzOmZyb21fbGlzdChbIjsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8ICJkaWN0OmZyb21fbGlzdChbIjsKKyAgICB9CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIGksIGVuZCA9IHZhbHVlLT5nZXRfbWFwKCkuZW5kKCk7CisgICAgZm9yIChpID0gdmFsdWUtPmdldF9tYXAoKS5iZWdpbigpOyBpICE9IGVuZDspIHsKKyAgICAgIG91dCA8PCAieyIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGt0eXBlLCBpLT5maXJzdCkgPDwgIiwiCisgICAgICAgICAgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHZ0eXBlLCBpLT5zZWNvbmQpIDw8ICJ9IjsKKyAgICAgIGlmICgrK2kgIT0gZW5kKSB7CisgICAgICAgIG91dCA8PCAiLCI7CisgICAgICB9CisgICAgfQorICAgIG91dCA8PCAiXSkiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgdF90eXBlKiBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgb3V0IDw8ICJzZXRzOmZyb21fbGlzdChbIjsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciBpLCBlbmQgPSB2YWx1ZS0+Z2V0X2xpc3QoKS5lbmQoKTsKKyAgICBmb3IgKGkgPSB2YWx1ZS0+Z2V0X2xpc3QoKS5iZWdpbigpOyBpICE9IGVuZDspIHsKKyAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZXR5cGUsICppKTsKKyAgICAgIGlmICgrK2kgIT0gZW5kKSB7CisgICAgICAgIG91dCA8PCAiLCI7CisgICAgICB9CisgICAgfQorICAgIG91dCA8PCAiXSkiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIG91dCA8PCAiWyIgPDwgcmVuZGVyX2NvbnN0X2xpc3RfdmFsdWVzKHR5cGUsIHZhbHVlKSA8PCAiXSI7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBDT05TVEFOVCBGT1IgVFlQRTogIiArIHR5cGUtPmdldF9uYW1lKCk7CisgIH0KKyAgcmV0dXJuIG91dC5zdHIoKTsKK30KKworc3RyaW5nIHRfZXJsX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X2xpc3RfdmFsdWVzKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKKyAgdF90eXBlKiBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworCisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8ICIsIjsKKyAgICB9CisgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShldHlwZSwgKnZfaXRlcik7CisgIH0KKyAgcmV0dXJuIG91dC5zdHIoKTsKK30KKworCitzdHJpbmcgdF9lcmxfZ2VuZXJhdG9yOjpyZW5kZXJfZGVmYXVsdF92YWx1ZSh0X2ZpZWxkKiBmaWVsZCkgeworICB0X3R5cGUqIHR5cGUgPSBmaWVsZC0+Z2V0X3R5cGUoKTsKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIiMiICsgdHlwZV9uYW1lKHR5cGUpICsgInt9IjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIGlmIChtYXBzXykgeworICAgICAgcmV0dXJuICIje30iOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gImRpY3Q6bmV3KCkiOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAic2V0czpuZXcoKSI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJbXSI7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuICJ1bmRlZmluZWQiOworICB9Cit9CisKK3N0cmluZyB0X2VybF9nZW5lcmF0b3I6OnJlbmRlcl9tZW1iZXJfdHlwZSh0X2ZpZWxkKiBmaWVsZCkgeworICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAic3RyaW5nKCkgfCBiaW5hcnkoKSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICJib29sZWFuKCkiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gImludGVnZXIoKSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gImZsb2F0KCkiOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IHVuc3VwcG9ydGVkIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJpbnRlZ2VyKCkiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gdHlwZV9uYW1lKHR5cGUpICsgIigpIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIGlmIChtYXBzXykgeworICAgICAgcmV0dXJuICJtYXAoKSI7CisgICAgfSBlbHNlIGlmIChvdHAxNl8pIHsKKyAgICAgIHJldHVybiAiZGljdCgpIjsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuICJkaWN0OmRpY3QoKSI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgaWYgKG90cDE2XykgeworICAgICAgcmV0dXJuICJzZXQoKSI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAic2V0czpzZXQoKSI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAibGlzdCgpIjsKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IHVuc3VwcG9ydGVkIHR5cGUgIiArIHR5cGUtPmdldF9uYW1lKCk7CisgIH0KK30KKworc3RyaW5nIHRfZXJsX2dlbmVyYXRvcjo6cmVuZGVyX21lbWJlcl9yZXF1aXJlZG5lc3ModF9maWVsZCogZmllbGQpIHsKKyAgc3dpdGNoIChmaWVsZC0+Z2V0X3JlcSgpKSB7CisgIGNhc2UgdF9maWVsZDo6VF9SRVFVSVJFRDoKKyAgICByZXR1cm4gInJlcXVpcmVkIjsKKyAgY2FzZSB0X2ZpZWxkOjpUX09QVElPTkFMOgorICAgIHJldHVybiAib3B0aW9uYWwiOworICBkZWZhdWx0OgorICAgIHJldHVybiAidW5kZWZpbmVkIjsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdAorICovCit2b2lkIHRfZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHZfc3RydWN0X25hbWVzXy5wdXNoX2JhY2sodHlwZV9uYW1lKHRzdHJ1Y3QpKTsKKyAgZ2VuZXJhdGVfZXJsX3N0cnVjdCh0c3RydWN0LCBmYWxzZSk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGV4Y2VwdGlvbi4gQmFzaWNhbGx5IHRoZSBzYW1lCisgKiBhcyBhIHN0cnVjdCBidXQgZXh0ZW5kcyB0aGUgRXhjZXB0aW9uIGNsYXNzLgorICoKKyAqIEBwYXJhbSB0eGNlcHRpb24gVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7CisgIHZfZXhjZXB0aW9uX25hbWVzXy5wdXNoX2JhY2sodHlwZV9uYW1lKHR4Y2VwdGlvbikpOworICBnZW5lcmF0ZV9lcmxfc3RydWN0KHR4Y2VwdGlvbiwgdHJ1ZSk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0CisgKi8KK3ZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lcmxfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbikgeworICAodm9pZClpc19leGNlcHRpb247CisgIGdlbmVyYXRlX2VybF9zdHJ1Y3RfZGVmaW5pdGlvbihmX3R5cGVzX2hybF9maWxlXywgdHN0cnVjdCk7CisgIGdlbmVyYXRlX2VybF9zdHJ1Y3RfaW5mbyhmX2luZm9fLCB0c3RydWN0KTsKKyAgZ2VuZXJhdGVfZXJsX2V4dGVuZGVkX3N0cnVjdF9pbmZvKGZfaW5mb19leHRfLCB0c3RydWN0KTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZGF0YSB0eXBlLgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZXJsX3N0cnVjdF9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgIiUlIHN0cnVjdCAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCBlbmRsIDw8IGVuZGw7CisKKyAgc3RkOjpzdHJpbmdzdHJlYW0gYnVmOworICBidWYgPDwgaW5kZW50KCkgPDwgIi1yZWNvcmQoIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIiwgeyI7CisgIHN0cmluZyBmaWVsZF9pbmRlbnQoYnVmLnN0cigpLnNpemUoKSwgJyAnKTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgZm9yICh2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOykgeworICAgIGdlbmVyYXRlX2VybF9zdHJ1Y3RfbWVtYmVyKGJ1ZiwgKm1faXRlcik7CisgICAgaWYgKCsrbV9pdGVyICE9IG1lbWJlcnMuZW5kKCkpIHsKKyAgICAgIGJ1ZiA8PCAiLCIgPDwgZW5kbCA8PCBmaWVsZF9pbmRlbnQ7CisgICAgfQorICB9CisgIGJ1ZiA8PCAifSkuIjsKKworICBvdXQgPDwgYnVmLnN0cigpIDw8IGVuZGw7CisgIG91dCA8PCAiLXR5cGUgIiArIHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiKCkgOjogIyIgKyB0eXBlX25hbWUodHN0cnVjdCkgKyAie30uIiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHRoZSByZWNvcmQgZmllbGQgZGVmaW5pdGlvbgorICovCisKK3ZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lcmxfc3RydWN0X21lbWJlcihvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRtZW1iZXIpIHsKKyAgb3V0IDw8IGF0b21pZnkodG1lbWJlci0+Z2V0X25hbWUoKSk7CisgIGlmIChoYXNfZGVmYXVsdF92YWx1ZSh0bWVtYmVyKSkKKyAgICBvdXQgPDwgIiA9ICIgPDwgcmVuZGVyX21lbWJlcl92YWx1ZSh0bWVtYmVyKTsKKyAgb3V0IDw8ICIgOjogIiA8PCByZW5kZXJfbWVtYmVyX3R5cGUodG1lbWJlcik7CisgIGlmICh0bWVtYmVyLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCkKKyAgICBvdXQgPDwgIiB8ICd1bmRlZmluZWQnIjsKK30KKworYm9vbCB0X2VybF9nZW5lcmF0b3I6Omhhc19kZWZhdWx0X3ZhbHVlKHRfZmllbGQqIGZpZWxkKSB7CisgIHRfdHlwZSogdHlwZSA9IGZpZWxkLT5nZXRfdHlwZSgpOworICBpZiAoIWZpZWxkLT5nZXRfdmFsdWUoKSkgeworICAgIGlmIChmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpIHx8IHR5cGUtPmlzX21hcCgpIHx8IHR5cGUtPmlzX3NldCgpCisgICAgICAgICAgfHwgdHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9IGVsc2UgeworICAgIHJldHVybiB0cnVlOworICB9Cit9CisKK3N0cmluZyB0X2VybF9nZW5lcmF0b3I6OnJlbmRlcl9tZW1iZXJfdmFsdWUodF9maWVsZCogZmllbGQpIHsKKyAgaWYgKCFmaWVsZC0+Z2V0X3ZhbHVlKCkpIHsKKyAgICByZXR1cm4gcmVuZGVyX2RlZmF1bHRfdmFsdWUoZmllbGQpOworICB9IGVsc2UgeworICAgIHJldHVybiByZW5kZXJfY29uc3RfdmFsdWUoZmllbGQtPmdldF90eXBlKCksIGZpZWxkLT5nZXRfdmFsdWUoKSk7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgdGhlIHJlYWQgbWV0aG9kIGZvciBhIHN0cnVjdAorICovCit2b2lkIHRfZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZXJsX3N0cnVjdF9pbmZvKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgInN0cnVjdF9pbmZvKCIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIpIC0+IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8IHJlbmRlcl90eXBlX3Rlcm0odHN0cnVjdCwgdHJ1ZSkgPDwgIjsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBlbmRsOworfQorCit2b2lkIHRfZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZXJsX2V4dGVuZGVkX3N0cnVjdF9pbmZvKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgInN0cnVjdF9pbmZvX2V4dCgiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiKSAtPiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCByZW5kZXJfdHlwZV90ZXJtKHRzdHJ1Y3QsIHRydWUsIHRydWUpIDw8ICI7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSB0aHJpZnQgc2VydmljZS4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgorICovCit2b2lkIHRfZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHNlcnZpY2VfbmFtZV8gPSBtYWtlX3NhZmVfZm9yX21vZHVsZV9uYW1lKHNlcnZpY2VfbmFtZV8pOworCisgIHN0cmluZyBmX3NlcnZpY2VfaHJsX25hbWUgPSBnZXRfb3V0X2RpcigpICsgc2VydmljZV9uYW1lXyArICJfdGhyaWZ0LmhybCI7CisgIHN0cmluZyBmX3NlcnZpY2VfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBzZXJ2aWNlX25hbWVfICsgIl90aHJpZnQuZXJsIjsKKyAgZl9zZXJ2aWNlX2ZpbGVfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7CisgIGZfc2VydmljZV9ocmxfLm9wZW4oZl9zZXJ2aWNlX2hybF9uYW1lLmNfc3RyKCkpOworCisgIC8vIFJlc2V0IHNlcnZpY2UgdGV4dCBhZ2dyZWdhdGluZyBzdHJlYW0gc3RyZWFtcworICBmX3NlcnZpY2VfLnN0cigiIik7CisgIGV4cG9ydF9saW5lc18uc3RyKCIiKTsKKyAgZXhwb3J0X2xpbmVzX2ZpcnN0XyA9IHRydWU7CisKKyAgaHJsX2hlYWRlcihmX3NlcnZpY2VfaHJsXywgc2VydmljZV9uYW1lXyk7CisKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBmX3NlcnZpY2VfaHJsXyA8PCAiLWluY2x1ZGUoXCIiCisgICAgICAgICAgICAgICAgICAgPDwgbWFrZV9zYWZlX2Zvcl9tb2R1bGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSkKKyAgICAgICAgICAgICAgICAgICA8PCAiX3RocmlmdC5ocmxcIikuICUgaW5oZXJpdCAiIDw8IGVuZGw7CisgIH0KKworICBmX3NlcnZpY2VfaHJsXyA8PCAiLWluY2x1ZGUoXCIiIDw8IG1ha2Vfc2FmZV9mb3JfbW9kdWxlX25hbWUocHJvZ3JhbV9uYW1lXykgPDwgIl90eXBlcy5ocmxcIikuIgorICAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHRocmVlIG1haW4gcGFydHMgb2YgdGhlIHNlcnZpY2UgKHdlbGwsIHR3byBmb3Igbm93IGluIFBIUCkKKyAgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRzZXJ2aWNlKTsgLy8gY3Bpcm86IE5ldyBFcmxhbmcgT3JkZXIKKworICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSk7CisKKyAgZ2VuZXJhdGVfc2VydmljZV9tZXRhZGF0YSh0c2VydmljZSk7CisKKyAgLy8gaW5kZW50X2Rvd24oKTsKKworICBmX3NlcnZpY2VfZmlsZV8gPDwgZXJsX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGwgPDwgIi1tb2R1bGUoIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJfdGhyaWZ0KS4iCisgICAgICAgICAgICAgICAgICA8PCBlbmRsIDw8ICItYmVoYXZpb3VyKHRocmlmdF9zZXJ2aWNlKS4iIDw8IGVuZGwgPDwgZW5kbCA8PCBlcmxfaW1wb3J0cygpIDw8IGVuZGw7CisKKyAgZl9zZXJ2aWNlX2ZpbGVfIDw8ICItaW5jbHVkZShcIiIgPDwgbWFrZV9zYWZlX2Zvcl9tb2R1bGVfbmFtZSh0c2VydmljZS0+Z2V0X25hbWUoKSkKKyAgICAgICAgICAgICAgICAgIDw8ICJfdGhyaWZ0LmhybFwiKS4iIDw8IGVuZGwgPDwgZW5kbDsKKworICBmX3NlcnZpY2VfZmlsZV8gPDwgIi1leHBvcnQoWyIgPDwgZXhwb3J0X2xpbmVzXy5zdHIoKSA8PCAiXSkuIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZl9zZXJ2aWNlX2ZpbGVfIDw8IGZfc2VydmljZV8uc3RyKCk7CisKKyAgaHJsX2Zvb3RlcihmX3NlcnZpY2VfaHJsXywgZl9zZXJ2aWNlX25hbWUpOworCisgIC8vIENsb3NlIHNlcnZpY2UgZmlsZQorICBmX3NlcnZpY2VfZmlsZV8uY2xvc2UoKTsKKyAgZl9zZXJ2aWNlX2hybF8uY2xvc2UoKTsKK30KKwordm9pZCB0X2VybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfbWV0YWRhdGEodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBleHBvcnRfc3RyaW5nKCJmdW5jdGlvbl9uYW1lcyIsIDApOworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHNpemVfdCBudW1fZnVuY3Rpb25zID0gZnVuY3Rpb25zLnNpemUoKTsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImZ1bmN0aW9uX25hbWVzKCkgLT4gIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJbIjsKKworICBmb3IgKHNpemVfdCBpPTA7IGkgPCBudW1fZnVuY3Rpb25zOyBpKyspIHsKKyAgICB0X2Z1bmN0aW9uKiBjdXJyZW50ID0gZnVuY3Rpb25zLmF0KGkpOworICAgIGZfc2VydmljZV8gPDwgYXRvbWlmeShjdXJyZW50LT5nZXRfbmFtZSgpKTsKKyAgICBpZiAoaSA8IG51bV9mdW5jdGlvbnMgLSAxKSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7CisgICAgfQorICB9CisKKyAgZl9zZXJ2aWNlXyA8PCAiXS5cblxuIjsKKyAgaW5kZW50X2Rvd24oKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgaGVscGVyIGZ1bmN0aW9ucyBmb3IgYSBzZXJ2aWNlLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgorICovCit2b2lkIHRfZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgLy8gIGluZGVudChmX3NlcnZpY2VfKSA8PAorICAvLyAgIiUgSEVMUEVSIEZVTkNUSU9OUyBBTkQgU1RSVUNUVVJFUyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGV4cG9ydF9zdHJpbmcoInN0cnVjdF9pbmZvIiwgMSk7CisKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9lcmxfZnVuY3Rpb25faGVscGVycygqZl9pdGVyKTsKKyAgfQorICBmX3NlcnZpY2VfIDw8ICJzdHJ1Y3RfaW5mbyhfKSAtPiBlcmxhbmc6ZXJyb3IoZnVuY3Rpb25fY2xhdXNlKS4iIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGFuZCBoZWxwZXJzIGZvciBhIGZ1bmN0aW9uLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uCisgKi8KK3ZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lcmxfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgKHZvaWQpdGZ1bmN0aW9uOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgaW50ZXJmYWNlIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCisgKi8KK3ZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisKKyAgZXhwb3J0X3N0cmluZygiZnVuY3Rpb25faW5mbyIsIDIpOworCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBmX3NlcnZpY2VfIDw8ICIlJSUgaW50ZXJmYWNlIiA8PCBlbmRsOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiUgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgZW5kbDsKKworICAgIGdlbmVyYXRlX2Z1bmN0aW9uX2luZm8odHNlcnZpY2UsICpmX2l0ZXIpOworICB9CisKKyAgLy8gSW5oZXJpdGFuY2UgLSBwYXNzIHVua25vd24gZnVuY3Rpb25zIHRvIGJhc2UgY2xhc3MKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImZ1bmN0aW9uX2luZm8oRnVuY3Rpb24sIEluZm9UeXBlKSAtPiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgbWFrZV9zYWZlX2Zvcl9tb2R1bGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIl90aHJpZnQ6ZnVuY3Rpb25faW5mbyhGdW5jdGlvbiwgSW5mb1R5cGUpLiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9IGVsc2UgeworICAgIC8vIHJldHVybiBmdW5jdGlvbl9jbGF1c2UgZXJyb3IgZm9yIG5vbi1leGlzdGVudCBmdW5jdGlvbnMKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImZ1bmN0aW9uX2luZm8oX0Z1bmMsIF9JbmZvKSAtPiBlcmxhbmc6ZXJyb3IoZnVuY3Rpb25fY2xhdXNlKS4iIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbl9pbmZvKEZ1bmN0aW9uTmFtZSwgcGFyYW1zX3R5cGUpIGFuZAorICogZnVuY3Rpb25faW5mbyhGdW5jdGlvbk5hbWUsIHJlcGx5X3R5cGUpCisgKi8KK3ZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9mdW5jdGlvbl9pbmZvKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICAodm9pZCl0c2VydmljZTsKKyAgc3RyaW5nIG5hbWVfYXRvbSA9IGF0b21pZnkodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKTsKKworICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisKKyAgLy8gZnVuY3Rpb25faW5mbyhGdW5jdGlvbiwgcGFyYW1zX3R5cGUpOgorICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImZ1bmN0aW9uX2luZm8oIiA8PCBuYW1lX2F0b20gPDwgIiwgcGFyYW1zX3R5cGUpIC0+IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgcmVuZGVyX3R5cGVfdGVybShhcmdfc3RydWN0LCB0cnVlKSA8PCAiOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworCisgIC8vIGZ1bmN0aW9uX2luZm8oRnVuY3Rpb24sIHJlcGx5X3R5cGUpOgorICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImZ1bmN0aW9uX2luZm8oIiA8PCBuYW1lX2F0b20gPDwgIiwgcmVwbHlfdHlwZSkgLT4iIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IHJlbmRlcl90eXBlX3Rlcm0odGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCBmYWxzZSkgPDwgIjsiIDw8IGVuZGw7CisgIGVsc2UgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJvbmV3YXlfdm9pZDsiIDw8IGVuZGw7CisgIGVsc2UKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIntzdHJ1Y3QsIFtdfSIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIjsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisKKyAgLy8gZnVuY3Rpb25faW5mbyhGdW5jdGlvbiwgZXhjZXB0aW9ucyk6CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZnVuY3Rpb25faW5mbygiIDw8IG5hbWVfYXRvbSA8PCAiLCBleGNlcHRpb25zKSAtPiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCByZW5kZXJfdHlwZV90ZXJtKHhzLCB0cnVlKSA8PCAiOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd0eXBlIG5hbWUoYXJncyknCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCisgKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCisgKi8KK3N0cmluZyB0X2VybF9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0cmluZyBwcmVmaXgpIHsKKyAgcmV0dXJuIHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICIoVGhpcyIKKyAgICAgICAgICsgY2FwaXRhbGl6ZShhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSkpICsgIikiOworfQorCisvKioKKyAqIEFkZCBhIGZ1bmN0aW9uIHRvIHRoZSBleHBvcnRzIGxpc3QKKyAqLwordm9pZCB0X2VybF9nZW5lcmF0b3I6OmV4cG9ydF9zdHJpbmcoc3RyaW5nIG5hbWUsIGludCBudW0pIHsKKyAgaWYgKGV4cG9ydF9saW5lc19maXJzdF8pIHsKKyAgICBleHBvcnRfbGluZXNfZmlyc3RfID0gZmFsc2U7CisgIH0gZWxzZSB7CisgICAgZXhwb3J0X2xpbmVzXyA8PCAiLCAiOworICB9CisgIGV4cG9ydF9saW5lc18gPDwgbmFtZSA8PCAiLyIgPDwgbnVtOworfQorCit2b2lkIHRfZXJsX2dlbmVyYXRvcjo6ZXhwb3J0X3R5cGVzX3N0cmluZyhzdHJpbmcgbmFtZSwgaW50IG51bSkgeworICBpZiAoZXhwb3J0X3R5cGVzX2xpbmVzX2ZpcnN0XykgeworICAgIGV4cG9ydF90eXBlc19saW5lc19maXJzdF8gPSBmYWxzZTsKKyAgfSBlbHNlIHsKKyAgICBleHBvcnRfdHlwZXNfbGluZXNfIDw8ICIsICI7CisgIH0KKyAgZXhwb3J0X3R5cGVzX2xpbmVzXyA8PCBuYW1lIDw8ICIvIiA8PCBudW07Cit9CisKK3ZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpleHBvcnRfZnVuY3Rpb24odF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdHJpbmcgcHJlZml4KSB7CisgIHRfc3RydWN0OjptZW1iZXJzX3R5cGU6OnNpemVfdHlwZSBudW0gPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCkuc2l6ZSgpOworICBpZiAobnVtID4gc3RhdGljX2Nhc3Q8dF9zdHJ1Y3Q6Om1lbWJlcnNfdHlwZTo6c2l6ZV90eXBlPihzdGQ6Om51bWVyaWNfbGltaXRzPGludD4oKS5tYXgoKSkpIHsKKyAgICB0aHJvdyAiaW50ZWdlciBvdmVyZmxvdyBpbiB0X2VybF9nZW5lcmF0b3I6OmV4cG9ydF9mdW5jdGlvbiwgbmFtZSAiICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpOworICB9CisgIGV4cG9ydF9zdHJpbmcocHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgIDEgLy8gVGhpcworICAgICAgICAgICAgICAgICsgc3RhdGljX2Nhc3Q8aW50PihudW0pKTsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgZmllbGQgbGlzdAorICovCitzdHJpbmcgdF9lcmxfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIHJlc3VsdCArPSAiLCAiOyAvLyBpbml0aWFsIGNvbW1hIHRvIGNvbXBlbnNhdGUgZm9yIGluaXRpYWwgVGhpcworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgKz0gIiwgIjsKKyAgICB9CisgICAgcmVzdWx0ICs9IGNhcGl0YWxpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCitzdHJpbmcgdF9lcmxfZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSkgeworICBzdHJpbmcgcHJlZml4ID0gdHR5cGUtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lc3BhY2UoImVybCIpOworICBzaXplX3QgcHJlZml4X2xlbmd0aCA9IHByZWZpeC5sZW5ndGgoKTsKKyAgaWYgKHByZWZpeF9sZW5ndGggPiAwICYmIHByZWZpeFtwcmVmaXhfbGVuZ3RoIC0gMV0gIT0gJ18nKSB7CisgICAgcHJlZml4ICs9ICcuJzsKKyAgfQorCisgIHN0cmluZyBuYW1lID0gdHR5cGUtPmdldF9uYW1lKCk7CisKKyAgcmV0dXJuIGF0b21pZnkocHJlZml4ICsgbmFtZSk7Cit9CisKKy8qKgorICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBFcmxhbmcgInR5cGUiIChtYWNybyBmb3IgaW50IGNvbnN0YW50cykKKyAqLworc3RyaW5nIHRfZXJsX2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAiP3RUeXBlX1NUUklORyI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICI/dFR5cGVfQk9PTCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiP3RUeXBlX0k4IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAiP3RUeXBlX0kxNiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gIj90VHlwZV9JMzIiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICI/dFR5cGVfSTY0IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiP3RUeXBlX0RPVUJMRSI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiP3RUeXBlX0kzMiI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiAiP3RUeXBlX1NUUlVDVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gIj90VHlwZV9NQVAiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICI/dFR5cGVfU0VUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gIj90VHlwZV9MSVNUIjsKKyAgfQorCisgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZSBhbiBFcmxhbmcgdGVybSB3aGljaCByZXByZXNlbnRzIGEgdGhyaWZ0IHR5cGUKKyAqLworc3RkOjpzdHJpbmcgdF9lcmxfZ2VuZXJhdG9yOjpyZW5kZXJfdHlwZV90ZXJtKHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGV4cGFuZF9zdHJ1Y3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZXh0ZW5kZWRfaW5mbykgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAic3RyaW5nIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gImJvb2wiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZXR1cm4gImJ5dGUiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmV0dXJuICJpMTYiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmV0dXJuICJpMzIiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICJpNjQiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICJkb3VibGUiOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gImkzMiI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGlmIChleHBhbmRfc3RydWN0cykgeworCisgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBidWY7CisgICAgICBidWYgPDwgIntzdHJ1Y3QsIFsiOworICAgICAgc3RyaW5nIGZpZWxkX2luZGVudChidWYuc3RyKCkuc2l6ZSgpLCAnICcpOworCisgICAgICB0X3N0cnVjdDo6bWVtYmVyc190eXBlIGNvbnN0JiBmaWVsZHMgPSBzdGF0aWNfY2FzdDx0X3N0cnVjdCo+KHR5cGUpLT5nZXRfbWVtYmVycygpOworICAgICAgdF9zdHJ1Y3Q6Om1lbWJlcnNfdHlwZTo6Y29uc3RfaXRlcmF0b3IgaSwgZW5kID0gZmllbGRzLmVuZCgpOworICAgICAgZm9yIChpID0gZmllbGRzLmJlZ2luKCk7IGkgIT0gZW5kOykgeworICAgICAgICB0X3N0cnVjdDo6bWVtYmVyc190eXBlOjp2YWx1ZV90eXBlIG1lbWJlciA9ICppOworICAgICAgICBpbnQzMl90IGtleSA9IG1lbWJlci0+Z2V0X2tleSgpOworICAgICAgICBzdHJpbmcgdHlwZSA9IHJlbmRlcl90eXBlX3Rlcm0obWVtYmVyLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UpOyAvLyByZWN1cnNpdmUgY2FsbAorCisgICAgICAgIGlmICghZXh0ZW5kZWRfaW5mbykgeworICAgICAgICAgIC8vIENvbnZlcnQgdG8gZm9ybWF0OiB7c3RydWN0LCBbe0ZpZCwgVHlwZX18Li4uXX0KKyAgICAgICAgICBidWYgPDwgInsiIDw8IGtleSA8PCAiLCAiIDw8IHR5cGUgPDwgIn0iOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIENvbnZlcnQgdG8gZm9ybWF0OiB7c3RydWN0LCBbe0ZpZCwgUmVxLCBUeXBlLCBOYW1lLCBEZWZ9fC4uLl19CisgICAgICAgICAgc3RyaW5nIG5hbWUgPSBtZW1iZXItPmdldF9uYW1lKCk7CisgICAgICAgICAgc3RyaW5nIHZhbHVlID0gcmVuZGVyX21lbWJlcl92YWx1ZShtZW1iZXIpOworICAgICAgICAgIHN0cmluZyByZXF1aXJlZG5lc3MgPSByZW5kZXJfbWVtYmVyX3JlcXVpcmVkbmVzcyhtZW1iZXIpOworICAgICAgICAgIGJ1ZiA8PCAieyIgPDwga2V5IDw8ICIsICIgPDwgcmVxdWlyZWRuZXNzIDw8ICIsICIgPDwgdHlwZSA8PCAiLCAiIDw8IGF0b21pZnkobmFtZSkgPDwgIiwgIgorICAgICAgICAgICAgICA8PCB2YWx1ZSA8PCAifSI7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKytpICE9IGVuZCkgeworICAgICAgICAgIGJ1ZiA8PCAiLCIgPDwgZW5kbCA8PCBmaWVsZF9pbmRlbnQ7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgYnVmIDw8ICJdfSIgPDwgZW5kbDsKKyAgICAgIHJldHVybiBidWYuc3RyKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAie3N0cnVjdCwgeyIgKyBhdG9taWZ5KHR5cGVfbW9kdWxlKHR5cGUpKSArICIsICIgKyB0eXBlX25hbWUodHlwZSkgKyAifX0iOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIC8vIHttYXAsIEtleVR5cGUsIFZhbFR5cGV9CisgICAgdF90eXBlKiBrZXlfdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICB0X3R5cGUqIHZhbF90eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOworCisgICAgcmV0dXJuICJ7bWFwLCAiICsgcmVuZGVyX3R5cGVfdGVybShrZXlfdHlwZSwgZmFsc2UpICsgIiwgIiArIHJlbmRlcl90eXBlX3Rlcm0odmFsX3R5cGUsIGZhbHNlKQorICAgICAgICAgICArICJ9IjsKKworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgdF90eXBlKiBlbGVtX3R5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworCisgICAgcmV0dXJuICJ7c2V0LCAiICsgcmVuZGVyX3R5cGVfdGVybShlbGVtX3R5cGUsIGZhbHNlKSArICJ9IjsKKworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHRfdHlwZSogZWxlbV90eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisKKyAgICByZXR1cm4gIntsaXN0LCAiICsgcmVuZGVyX3R5cGVfdGVybShlbGVtX3R5cGUsIGZhbHNlKSArICJ9IjsKKyAgfQorCisgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKworc3RkOjpzdHJpbmcgdF9lcmxfZ2VuZXJhdG9yOjp0eXBlX21vZHVsZSh0X3R5cGUqIHR0eXBlKSB7CisgIHJldHVybiBtYWtlX3NhZmVfZm9yX21vZHVsZV9uYW1lKHR0eXBlLT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZSgpKSArICJfdHlwZXMiOworfQorCitUSFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKAorICAgIGVybCwKKyAgICAiRXJsYW5nIiwKKyAgICAiICAgIGxlZ2FjeW5hbWVzOiBPdXRwdXQgZmlsZXMgcmV0YWluIG5hbWluZyBjb252ZW50aW9ucyBvZiBUaHJpZnQgMC45LjEgYW5kIGVhcmxpZXIuXG4iCisgICAgIiAgICBtYXBzOiAgICAgICAgR2VuZXJhdGUgbWFwcyBpbnN0ZWFkIG9mIGRpY3RzLlxuIgorICAgICIgICAgb3RwMTY6ICAgICAgIEdlbmVyYXRlIG5vbi1uYW1lc3BhY2VkIGRpY3QgYW5kIHNldCBpbnN0ZWFkIG9mIGRpY3Q6ZGljdCBhbmQgc2V0czpzZXQuXG4iKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTNmNWRkCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuY2MKQEAgLTAsMCArMSwyNjIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvci5oIgordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworLyoqCisgKiBUb3AgbGV2ZWwgcHJvZ3JhbSBnZW5lcmF0aW9uIGZ1bmN0aW9uLiBDYWxscyB0aGUgZ2VuZXJhdG9yIHN1YmNsYXNzIG1ldGhvZHMKKyAqIGZvciBwcmVwYXJpbmcgZmlsZSBzdHJlYW1zIGV0Yy4gdGhlbiBpdGVyYXRlcyBvdmVyIGFsbCB0aGUgcGFydHMgb2YgdGhlCisgKiBwcm9ncmFtIHRvIHBlcmZvcm0gdGhlIGNvcnJlY3QgYWN0aW9ucy4KKyAqCisgKiBAcGFyYW0gcHJvZ3JhbSBUaGUgdGhyaWZ0IHByb2dyYW0gdG8gY29tcGlsZSBpbnRvIEMrKyBzb3VyY2UKKyAqLwordm9pZCB0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvZ3JhbSgpIHsKKyAgLy8gSW5pdGlhbGl6ZSB0aGUgZ2VuZXJhdG9yCisgIGluaXRfZ2VuZXJhdG9yKCk7CisKKyAgLy8gR2VuZXJhdGUgZW51bXMKKyAgdmVjdG9yPHRfZW51bSo+IGVudW1zID0gcHJvZ3JhbV8tPmdldF9lbnVtcygpOworICB2ZWN0b3I8dF9lbnVtKj46Oml0ZXJhdG9yIGVuX2l0ZXI7CisgIGZvciAoZW5faXRlciA9IGVudW1zLmJlZ2luKCk7IGVuX2l0ZXIgIT0gZW51bXMuZW5kKCk7ICsrZW5faXRlcikgeworICAgIGdlbmVyYXRlX2VudW0oKmVuX2l0ZXIpOworICB9CisKKyAgLy8gR2VuZXJhdGUgdHlwZWRlZnMKKyAgdmVjdG9yPHRfdHlwZWRlZio+IHR5cGVkZWZzID0gcHJvZ3JhbV8tPmdldF90eXBlZGVmcygpOworICB2ZWN0b3I8dF90eXBlZGVmKj46Oml0ZXJhdG9yIHRkX2l0ZXI7CisgIGZvciAodGRfaXRlciA9IHR5cGVkZWZzLmJlZ2luKCk7IHRkX2l0ZXIgIT0gdHlwZWRlZnMuZW5kKCk7ICsrdGRfaXRlcikgeworICAgIGdlbmVyYXRlX3R5cGVkZWYoKnRkX2l0ZXIpOworICB9CisKKyAgLy8gR2VuZXJhdGUgc3RydWN0cywgZXhjZXB0aW9ucywgYW5kIHVuaW9ucyBpbiBkZWNsYXJlZCBvcmRlcgorICB2ZWN0b3I8dF9zdHJ1Y3QqPiBvYmplY3RzID0gcHJvZ3JhbV8tPmdldF9vYmplY3RzKCk7CisKKyAgdmVjdG9yPHRfc3RydWN0Kj46Oml0ZXJhdG9yIG9faXRlcjsKKyAgZm9yIChvX2l0ZXIgPSBvYmplY3RzLmJlZ2luKCk7IG9faXRlciAhPSBvYmplY3RzLmVuZCgpOyArK29faXRlcikgeworICAgIGdlbmVyYXRlX2ZvcndhcmRfZGVjbGFyYXRpb24oKm9faXRlcik7CisgIH0KKyAgZm9yIChvX2l0ZXIgPSBvYmplY3RzLmJlZ2luKCk7IG9faXRlciAhPSBvYmplY3RzLmVuZCgpOyArK29faXRlcikgeworICAgIGlmICgoKm9faXRlciktPmlzX3hjZXB0aW9uKCkpIHsKKyAgICAgIGdlbmVyYXRlX3hjZXB0aW9uKCpvX2l0ZXIpOworICAgIH0gZWxzZSB7CisgICAgICBnZW5lcmF0ZV9zdHJ1Y3QoKm9faXRlcik7CisgICAgfQorICB9CisKKyAgLy8gR2VuZXJhdGUgY29uc3RhbnRzCisgIHZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzID0gcHJvZ3JhbV8tPmdldF9jb25zdHMoKTsKKyAgZ2VuZXJhdGVfY29uc3RzKGNvbnN0cyk7CisKKyAgLy8gR2VuZXJhdGUgc2VydmljZXMKKyAgdmVjdG9yPHRfc2VydmljZSo+IHNlcnZpY2VzID0gcHJvZ3JhbV8tPmdldF9zZXJ2aWNlcygpOworICB2ZWN0b3I8dF9zZXJ2aWNlKj46Oml0ZXJhdG9yIHN2X2l0ZXI7CisgIGZvciAoc3ZfaXRlciA9IHNlcnZpY2VzLmJlZ2luKCk7IHN2X2l0ZXIgIT0gc2VydmljZXMuZW5kKCk7ICsrc3ZfaXRlcikgeworICAgIHNlcnZpY2VfbmFtZV8gPSBnZXRfc2VydmljZV9uYW1lKCpzdl9pdGVyKTsKKyAgICBnZW5lcmF0ZV9zZXJ2aWNlKCpzdl9pdGVyKTsKKyAgfQorCisgIC8vIENsb3NlIHRoZSBnZW5lcmF0b3IKKyAgY2xvc2VfZ2VuZXJhdG9yKCk7Cit9CisKK3N0ZDo6c2V0PHN0ZDo6c3RyaW5nPiB0X2dlbmVyYXRvcjo6bGFuZ19rZXl3b3JkcygpIGNvbnN0IHsKKyAgc3RkOjpzdHJpbmcga2V5d29yZHNbXSA9IHsgIkJFR0lOIiwgIkVORCIsICJfX0NMQVNTX18iLCAiX19ESVJfXyIsICJfX0ZJTEVfXyIsICJfX0ZVTkNUSU9OX18iLAorICAgICAgIl9fTElORV9fIiwgIl9fTUVUSE9EX18iLCAiX19OQU1FU1BBQ0VfXyIsICJhYnN0cmFjdCIsICJhbGlhcyIsICJhbmQiLCAiYXJncyIsICJhcyIsCisgICAgICAiYXNzZXJ0IiwgImJlZ2luIiwgImJyZWFrIiwgImNhc2UiLCAiY2F0Y2giLCAiY2xhc3MiLCAiY2xvbmUiLCAiY29udGludWUiLCAiZGVjbGFyZSIsCisgICAgICAiZGVmIiwgImRlZmF1bHQiLCAiZGVsIiwgImRlbGV0ZSIsICJkbyIsICJkeW5hbWljIiwgImVsaWYiLCAiZWxzZSIsICJlbHNlaWYiLCAiZWxzaWYiLAorICAgICAgImVuZCIsICJlbmRkZWNsYXJlIiwgImVuZGZvciIsICJlbmRmb3JlYWNoIiwgImVuZGlmIiwgImVuZHN3aXRjaCIsICJlbmR3aGlsZSIsICJlbnN1cmUiLAorICAgICAgImV4Y2VwdCIsICJleGVjIiwgImZpbmFsbHkiLCAiZmxvYXQiLCAiZm9yIiwgImZvcmVhY2giLCAiZnJvbSIsICJmdW5jdGlvbiIsICJnbG9iYWwiLAorICAgICAgImdvdG8iLCAiaWYiLCAiaW1wbGVtZW50cyIsICJpbXBvcnQiLCAiaW4iLCAiaW5saW5lIiwgImluc3RhbmNlb2YiLCAiaW50ZXJmYWNlIiwgImlzIiwKKyAgICAgICJsYW1iZGEiLCAibW9kdWxlIiwgIm5hdGl2ZSIsICJuZXciLCAibmV4dCIsICJuaWwiLCAibm90IiwgIm9yIiwgInBhY2thZ2UiLCAicGFzcyIsCisgICAgICAicHVibGljIiwgInByaW50IiwgInByaXZhdGUiLCAicHJvdGVjdGVkIiwgInJhaXNlIiwgInJlZG8iLCAicmVzY3VlIiwgInJldHJ5IiwgInJlZ2lzdGVyIiwKKyAgICAgICJyZXR1cm4iLCAic2VsZiIsICJzaXplb2YiLCAic3RhdGljIiwgInN1cGVyIiwgInN3aXRjaCIsICJzeW5jaHJvbml6ZWQiLCAidGhlbiIsICJ0aGlzIiwKKyAgICAgICJ0aHJvdyIsICJ0cmFuc2llbnQiLCAidHJ5IiwgInVuZGVmIiwgInVubGVzcyIsICJ1bnNpZ25lZCIsICJ1bnRpbCIsICJ1c2UiLCAidmFyIiwKKyAgICAgICJ2aXJ0dWFsIiwgInZvbGF0aWxlIiwgIndoZW4iLCAid2hpbGUiLCAid2l0aCIsICJ4b3IiLCAieWllbGQiIH07CisgIHJldHVybiBzdGQ6OnNldDxzdGQ6OnN0cmluZz4oa2V5d29yZHMsIGtleXdvcmRzICsgc2l6ZW9mKGtleXdvcmRzKS9zaXplb2Yoa2V5d29yZHNbMF0pICk7Cit9CisKK3ZvaWQgdF9nZW5lcmF0b3I6OnZhbGlkYXRlX2lucHV0KCkgY29uc3QgeworICB2YWxpZGF0ZShwcm9ncmFtXy0+Z2V0X2VudW1zKCkpOworICB2YWxpZGF0ZShwcm9ncmFtXy0+Z2V0X3R5cGVkZWZzKCkpOworICB2YWxpZGF0ZShwcm9ncmFtXy0+Z2V0X29iamVjdHMoKSk7CisgIHZhbGlkYXRlKHByb2dyYW1fLT5nZXRfY29uc3RzKCkpOworICB2YWxpZGF0ZShwcm9ncmFtXy0+Z2V0X3NlcnZpY2VzKCkpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3ZvaWQgdF9nZW5lcmF0b3I6OnZhbGlkYXRlKGNvbnN0IHZlY3RvcjxUPiYgbGlzdCkgY29uc3R7CisgIHR5cGVuYW1lIHZlY3RvcjxUPjo6Y29uc3RfaXRlcmF0b3IgaXQ7CisgIGZvcihpdD1saXN0LmJlZ2luKCk7IGl0ICE9IGxpc3QuZW5kKCk7ICsraXQpIHsKKyAgICAgIHZhbGlkYXRlKCppdCk7CisgIH0KK30KKwordm9pZCB0X2dlbmVyYXRvcjo6dmFsaWRhdGUodF9mdW5jdGlvbiBjb25zdCogZikgY29uc3QgeworICB2YWxpZGF0ZV9pZChmLT5nZXRfbmFtZSgpKTsKKyAgdmFsaWRhdGUoZi0+Z2V0X2FyZ2xpc3QoKSk7CisgIHZhbGlkYXRlKGYtPmdldF94Y2VwdGlvbnMoKSk7Cit9CisKK3ZvaWQgdF9nZW5lcmF0b3I6OnZhbGlkYXRlKHRfc2VydmljZSBjb25zdCogcykgY29uc3QgeworICB2YWxpZGF0ZV9pZChzLT5nZXRfbmFtZSgpKTsKKyAgdmFsaWRhdGUocy0+Z2V0X2Z1bmN0aW9ucygpKTsKK30KKwordm9pZCB0X2dlbmVyYXRvcjo6dmFsaWRhdGUodF9lbnVtIGNvbnN0KiBlbikgY29uc3QgeworICB2YWxpZGF0ZV9pZChlbi0+Z2V0X25hbWUoKSk7CisgIHZhbGlkYXRlKGVuLT5nZXRfY29uc3RhbnRzKCkpOworfQordm9pZCB0X2dlbmVyYXRvcjo6dmFsaWRhdGUodF9zdHJ1Y3QgY29uc3QqIHMpIGNvbnN0IHsKKyAgdmFsaWRhdGVfaWQocy0+Z2V0X25hbWUoKSk7CisgIHZhbGlkYXRlKHMtPmdldF9tZW1iZXJzKCkpOworfQorCit2b2lkIHRfZ2VuZXJhdG9yOjp2YWxpZGF0ZSh0X2VudW1fdmFsdWUgY29uc3QqIGVuX3ZhbCkgY29uc3QgeworICB2YWxpZGF0ZV9pZChlbl92YWwtPmdldF9uYW1lKCkpOworfQordm9pZCB0X2dlbmVyYXRvcjo6dmFsaWRhdGUodF90eXBlZGVmIGNvbnN0KiB0ZCkgY29uc3QgeworICB2YWxpZGF0ZV9pZCh0ZC0+Z2V0X25hbWUoKSk7Cit9Cit2b2lkIHRfZ2VuZXJhdG9yOjp2YWxpZGF0ZSh0X2NvbnN0IGNvbnN0KiBjKSBjb25zdCB7CisgIHZhbGlkYXRlX2lkKGMtPmdldF9uYW1lKCkpOworfQordm9pZCB0X2dlbmVyYXRvcjo6dmFsaWRhdGUodF9maWVsZCBjb25zdCogZikgY29uc3QgeworICB2YWxpZGF0ZV9pZChmLT5nZXRfbmFtZSgpKTsKK30KKwordm9pZCB0X2dlbmVyYXRvcjo6dmFsaWRhdGVfaWQoY29uc3Qgc3RyaW5nJiBpZCkgY29uc3QgeworICBpZiAoa2V5d29yZHNfLmZpbmQoaWQpICE9IGtleXdvcmRzXy5lbmQoKSkgeworICAgIGZhaWx1cmUoIkNhbm5vdCB1c2UgcmVzZXJ2ZWQgbGFuZ3VhZ2Uga2V5d29yZDogXCIlc1wiIiwgaWQuY19zdHIoKSk7CisgIH0KK30KKworc3RyaW5nIHRfZ2VuZXJhdG9yOjplc2NhcGVfc3RyaW5nKGNvbnN0IHN0cmluZyYgaW4pIGNvbnN0IHsKKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworICBmb3IgKHN0cmluZzo6Y29uc3RfaXRlcmF0b3IgaXQgPSBpbi5iZWdpbigpOyBpdCA8IGluLmVuZCgpOyBpdCsrKSB7CisgICAgc3RkOjptYXA8Y2hhciwgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciByZXMgPSBlc2NhcGVfLmZpbmQoKml0KTsKKyAgICBpZiAocmVzICE9IGVzY2FwZV8uZW5kKCkpIHsKKyAgICAgIHJlc3VsdC5hcHBlbmQocmVzLT5zZWNvbmQpOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQucHVzaF9iYWNrKCppdCk7CisgICAgfQorICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgdF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0cyh2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykgeworICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7CisgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgZ2VuZXJhdGVfY29uc3QoKmNfaXRlcik7CisgIH0KK30KKwordm9pZCB0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBjb21tZW50X3N0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBsaW5lX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgY29udGVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGNvbW1lbnRfZW5kKSB7CisgIGlmICghY29tbWVudF9zdGFydC5lbXB0eSgpKQorICAgIGluZGVudChvdXQpIDw8IGNvbW1lbnRfc3RhcnQ7CisgIHN0cmluZ3N0cmVhbSBkb2NzKGNvbnRlbnRzLCBpb3NfYmFzZTo6aW4pOworICB3aGlsZSAoIShkb2NzLmVvZigpIHx8IGRvY3MuZmFpbCgpKSkgeworICAgIGNoYXIgbGluZVsxMDI0XTsKKyAgICBkb2NzLmdldGxpbmUobGluZSwgMTAyNCk7CisKKyAgICBpZiAoc3RybGVuKGxpbmUpID4gMCkgeworICAgICAgaW5kZW50KG91dCkgPDwgbGluZV9wcmVmaXggPDwgbGluZSA8PCBzdGQ6OmVuZGw7CisgICAgfSBlbHNlIGlmIChsaW5lX3ByZWZpeC5lbXB0eSgpKXsKKyAgICAgIG91dCA8PCBzdGQ6OmVuZGw7CisgICAgfSBlbHNlIGlmKCFkb2NzLmVvZigpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCBsaW5lX3ByZWZpeCA8PCBzdGQ6OmVuZGw7CisgICAgfQorICB9CisgIGlmICghY29tbWVudF9lbmQuZW1wdHkoKSkKKyAgICBpbmRlbnQob3V0KSA8PCBjb21tZW50X2VuZDsKK30KKwordm9pZCB0X2dlbmVyYXRvcl9yZWdpc3RyeTo6cmVnaXN0ZXJfZ2VuZXJhdG9yKHRfZ2VuZXJhdG9yX2ZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgZ2VuX21hcF90JiB0aGVfbWFwID0gZ2V0X2dlbmVyYXRvcl9tYXAoKTsKKyAgaWYgKHRoZV9tYXAuZmluZChmYWN0b3J5LT5nZXRfc2hvcnRfbmFtZSgpKSAhPSB0aGVfbWFwLmVuZCgpKSB7CisgICAgZmFpbHVyZSgiRHVwbGljYXRlIGdlbmVyYXRvcnMgZm9yIGxhbmd1YWdlIFwiJXNcIiFcbiIsIGZhY3RvcnktPmdldF9zaG9ydF9uYW1lKCkuY19zdHIoKSk7CisgIH0KKyAgdGhlX21hcFtmYWN0b3J5LT5nZXRfc2hvcnRfbmFtZSgpXSA9IGZhY3Rvcnk7Cit9CisKK3ZvaWQgdF9nZW5lcmF0b3I6OnBhcnNlX29wdGlvbnMoY29uc3Qgc3RyaW5nJiBvcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcmIGxhbmd1YWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXA8c3RyaW5nLCBzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucykgeworICBzdHJpbmc6OnNpemVfdHlwZSBjb2xvbiA9IG9wdGlvbnMuZmluZCgnOicpOworICBsYW5ndWFnZSA9IG9wdGlvbnMuc3Vic3RyKDAsIGNvbG9uKTsKKworICBpZiAoY29sb24gIT0gc3RyaW5nOjpucG9zKSB7CisgICAgc3RyaW5nOjpzaXplX3R5cGUgcG9zID0gY29sb24gKyAxOworICAgIHdoaWxlIChwb3MgIT0gc3RyaW5nOjpucG9zICYmIHBvcyA8IG9wdGlvbnMuc2l6ZSgpKSB7CisgICAgICBzdHJpbmc6OnNpemVfdHlwZSBuZXh0X3BvcyA9IG9wdGlvbnMuZmluZCgnLCcsIHBvcyk7CisgICAgICBzdHJpbmcgb3B0aW9uID0gb3B0aW9ucy5zdWJzdHIocG9zLCBuZXh0X3BvcyAtIHBvcyk7CisgICAgICBwb3MgPSAoKG5leHRfcG9zID09IHN0cmluZzo6bnBvcykgPyBuZXh0X3BvcyA6IG5leHRfcG9zICsgMSk7CisKKyAgICAgIHN0cmluZzo6c2l6ZV90eXBlIHNlcGFyYXRvciA9IG9wdGlvbi5maW5kKCc9Jyk7CisgICAgICBzdHJpbmcga2V5LCB2YWx1ZTsKKyAgICAgIGlmIChzZXBhcmF0b3IgPT0gc3RyaW5nOjpucG9zKSB7CisgICAgICAgIGtleSA9IG9wdGlvbjsKKyAgICAgICAgdmFsdWUgPSAiIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGtleSA9IG9wdGlvbi5zdWJzdHIoMCwgc2VwYXJhdG9yKTsKKyAgICAgICAgdmFsdWUgPSBvcHRpb24uc3Vic3RyKHNlcGFyYXRvciArIDEpOworICAgICAgfQorCisgICAgICBwYXJzZWRfb3B0aW9uc1trZXldID0gdmFsdWU7CisgICAgfQorICB9Cit9CisKK3RfZ2VuZXJhdG9yKiB0X2dlbmVyYXRvcl9yZWdpc3RyeTo6Z2V0X2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBsYW5ndWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXA8c3RyaW5nLCBzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9ucykgeworICBnZW5fbWFwX3QmIHRoZV9tYXAgPSBnZXRfZ2VuZXJhdG9yX21hcCgpOworICBnZW5fbWFwX3Q6Oml0ZXJhdG9yIGl0ZXIgPSB0aGVfbWFwLmZpbmQobGFuZ3VhZ2UpOworCisgIGlmIChpdGVyID09IHRoZV9tYXAuZW5kKCkpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIHJldHVybiBpdGVyLT5zZWNvbmQtPmdldF9nZW5lcmF0b3IocHJvZ3JhbSwgcGFyc2VkX29wdGlvbnMsIG9wdGlvbnMpOworfQorCit0X2dlbmVyYXRvciogdF9nZW5lcmF0b3JfcmVnaXN0cnk6OmdldF9nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLCBjb25zdCBzdHJpbmcmIG9wdGlvbnMpIHsKKyAgc3RyaW5nIGxhbmd1YWdlOworICBtYXA8c3RyaW5nLCBzdHJpbmc+IHBhcnNlZF9vcHRpb25zOworICB0X2dlbmVyYXRvcjo6cGFyc2Vfb3B0aW9ucyhvcHRpb25zLCBsYW5ndWFnZSwgcGFyc2VkX29wdGlvbnMpOworICByZXR1cm4gZ2V0X2dlbmVyYXRvcihwcm9ncmFtLCBsYW5ndWFnZSwgcGFyc2VkX29wdGlvbnMsIG9wdGlvbnMpOworfQorCit0X2dlbmVyYXRvcl9yZWdpc3RyeTo6Z2VuX21hcF90JiB0X2dlbmVyYXRvcl9yZWdpc3RyeTo6Z2V0X2dlbmVyYXRvcl9tYXAoKSB7CisgIC8vIGh0dHA6Ly93d3cucGFyYXNoaWZ0LmNvbS9jKystZmFxLWxpdGUvY3RvcnMuaHRtbCNmYXEtMTAuMTIKKyAgc3RhdGljIGdlbl9tYXBfdCogdGhlX21hcCA9IG5ldyBnZW5fbWFwX3QoKTsKKyAgcmV0dXJuICp0aGVfbWFwOworfQorCit0X2dlbmVyYXRvcl9mYWN0b3J5Ojp0X2dlbmVyYXRvcl9mYWN0b3J5KGNvbnN0IHN0ZDo6c3RyaW5nJiBzaG9ydF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbG9uZ19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZG9jdW1lbnRhdGlvbikKKyAgOiBzaG9ydF9uYW1lXyhzaG9ydF9uYW1lKSwgbG9uZ19uYW1lXyhsb25nX25hbWUpLCBkb2N1bWVudGF0aW9uXyhkb2N1bWVudGF0aW9uKSB7CisgIHRfZ2VuZXJhdG9yX3JlZ2lzdHJ5OjpyZWdpc3Rlcl9nZW5lcmF0b3IodGhpcyk7Cit9CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvci5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjlkMDc2Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuaApAQCAtMCwwICsxLDQ1MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRfR0VORVJBVE9SX0gKKyNkZWZpbmUgVF9HRU5FUkFUT1JfSAorI2RlZmluZSBNU0NfMjAxNV9WRVIgMTkwMAorCisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8aW9tYW5pcD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgInRocmlmdC9jb21tb24uaCIKKyNpbmNsdWRlICJ0aHJpZnQvbG9nZ2luZy5oIgorI2luY2x1ZGUgInRocmlmdC92ZXJzaW9uLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yX3JlZ2lzdHJ5LmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfcHJvZ3JhbS5oIgorCisvKioKKyAqIEJhc2UgY2xhc3MgZm9yIGEgdGhyaWZ0IGNvZGUgZ2VuZXJhdG9yLiBUaGlzIGNsYXNzIGRlZmluZXMgdGhlIGJhc2ljCisgKiByb3V0aW5lcyBmb3IgY29kZSBnZW5lcmF0aW9uIGFuZCBjb250YWlucyB0aGUgdG9wIGxldmVsIG1ldGhvZCB0aGF0CisgKiBkaXNwYXRjaGVzIGNvZGUgZ2VuZXJhdGlvbiBhY3Jvc3MgdmFyaW91cyBjb21wb25lbnRzLgorICoKKyAqLworY2xhc3MgdF9nZW5lcmF0b3IgeworcHVibGljOgorICB0X2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0pCisgICAgOiBrZXl3b3Jkc18obGFuZ19rZXl3b3JkcygpKXsKKyAgICB0bXBfID0gMDsKKyAgICBpbmRlbnRfID0gMDsKKyAgICBwcm9ncmFtXyA9IHByb2dyYW07CisgICAgcHJvZ3JhbV9uYW1lXyA9IGdldF9wcm9ncmFtX25hbWUocHJvZ3JhbSk7CisgICAgZXNjYXBlX1snXG4nXSA9ICJcXG4iOworICAgIGVzY2FwZV9bJ1xyJ10gPSAiXFxyIjsKKyAgICBlc2NhcGVfWydcdCddID0gIlxcdCI7CisgICAgZXNjYXBlX1snIiddID0gIlxcXCIiOworICAgIGVzY2FwZV9bJ1xcJ10gPSAiXFxcXCI7CisgIH0KKworICB2aXJ0dWFsIH50X2dlbmVyYXRvcigpIHt9CisKKyAgLyoqCisgICAqIEZyYW1ld29yayBnZW5lcmF0b3IgbWV0aG9kIHRoYXQgaXRlcmF0ZXMgb3ZlciBhbGwgdGhlIHBhcnRzIG9mIGEgcHJvZ3JhbQorICAgKiBhbmQgcGVyZm9ybXMgZ2VuZXJhbCBhY3Rpb25zLiBUaGlzIGlzIGltcGxlbWVudGVkIGJ5IHRoZSBiYXNlIGNsYXNzIGFuZAorICAgKiBzaG91bGQgbm90IG5vcm1hbGx5IGJlIG92ZXJ3cml0dGVuIGluIHRoZSBzdWJjbGFzc2VzLgorICAgKi8KKyAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX3Byb2dyYW0oKTsKKworICBjb25zdCB0X3Byb2dyYW0qIGdldF9wcm9ncmFtKCkgY29uc3QgeyByZXR1cm4gcHJvZ3JhbV87IH0KKworICB2b2lkIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBjb21tZW50X3N0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBsaW5lX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgY29udGVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGNvbW1lbnRfZW5kKTsKKworICBzdGF0aWMgdm9pZCBwYXJzZV9vcHRpb25zKGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25zLCBzdGQ6OnN0cmluZyYgbGFuZ3VhZ2UsCisgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucyk7CisKKyAgLyoqCisgICAqIGNoZWNrIHdoZXRoZXIgc3ViLW5hbWVzcGFjZSBkZWNsYXJhY3Rpb24gaXMgdXNlZCBieSBnZW5lcmF0b3IuCisgICAqIGUuZy4gYWxsb3cKKyAgICogbmFtZXNwYWNlIHB5LnR3aXN0ZWQgYmFyCisgICAqIHRvIHNwZWNpZnkgbmFtZXNwYWNlIHRvIHVzZSB3aGVuIC1nZW4gcHk6dHdpc3RlZCBpcyBzcGVjaWZpZWQuCisgICAqIFdpbGwgYmUgY2FsbGVkIHdpdGggc3VibmFtZXNwYWNlLCBpLmUuIGlzX3ZhbGlkX25hbWVzcGFjZSgidHdpc3RlZCIpCisgICAqIHdpbGwgYmUgY2FsbGVkIGZvciB0aGUgYWJvdmUgZXhhbXBsZS4KKyAgICovCisgIHN0YXRpYyBib29sIGlzX3ZhbGlkX25hbWVzcGFjZShjb25zdCBzdGQ6OnN0cmluZyYgc3ViX25hbWVzcGFjZSkgeworICAgICh2b2lkKXN1Yl9uYW1lc3BhY2U7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLyoqCisgICAqIEVzY2FwZSBzdHJpbmcgdG8gdXNlIG9uZSBpbiBnZW5lcmF0ZWQgc291cmNlcy4KKyAgICovCisgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZXNjYXBlX3N0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgaW4pIGNvbnN0OworCisgIHN0ZDo6c3RyaW5nIGdldF9lc2NhcGVkX3N0cmluZyh0X2NvbnN0X3ZhbHVlKiBjb25zdHZhbCkgeworICAgIHJldHVybiBlc2NhcGVfc3RyaW5nKGNvbnN0dmFsLT5nZXRfc3RyaW5nKCkpOworICB9CisKKyAgLyoqCisgICAqIENoZWNrIGlmIGFsbCBpZGVudGlmaWVycyBhcmUgdmFsaWQgZm9yIHRoZSB0YXJnZXQgbGFuZ3VhZ2UKKyAgICovCisgIHZpcnR1YWwgdm9pZCB2YWxpZGF0ZV9pbnB1dCgpIGNvbnN0OworCitwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IGxhbmdfa2V5d29yZHMoKSBjb25zdDsKKworICAvKioKKyAgICogQSBsaXN0IG9mIHJlc2VydmVkIHdvcmRzIHRoYXQgY2Fubm90IGJlIHVzZWQgYXMgaWRlbnRpZmllcnMuCisgICAqLworICBjb25zdCBzdGQ6OnNldDxzdGQ6OnN0cmluZz4ga2V5d29yZHNfOworCisgIHZpcnR1YWwgdm9pZCB2YWxpZGF0ZV9pZChjb25zdCBzdGQ6OnN0cmluZyYgaWQpIGNvbnN0OworCisgIHZpcnR1YWwgdm9pZCB2YWxpZGF0ZSh0X2VudW0gY29uc3QqIGVuKSBjb25zdDsKKyAgdmlydHVhbCB2b2lkIHZhbGlkYXRlKHRfZW51bV92YWx1ZSBjb25zdCogZW5fdmFsKSBjb25zdDsKKyAgdmlydHVhbCB2b2lkIHZhbGlkYXRlKHRfdHlwZWRlZiBjb25zdCogdGQpIGNvbnN0OworICB2aXJ0dWFsIHZvaWQgdmFsaWRhdGUodF9jb25zdCBjb25zdCogYykgY29uc3Q7CisgIHZpcnR1YWwgdm9pZCB2YWxpZGF0ZSh0X3NlcnZpY2UgY29uc3QqIHMpIGNvbnN0OworICB2aXJ0dWFsIHZvaWQgdmFsaWRhdGUodF9zdHJ1Y3QgY29uc3QqIGMpIGNvbnN0OworICB2aXJ0dWFsIHZvaWQgdmFsaWRhdGUodF9maWVsZCBjb25zdCogZikgY29uc3Q7CisgIHZpcnR1YWwgdm9pZCB2YWxpZGF0ZSh0X2Z1bmN0aW9uIGNvbnN0KiBmKSBjb25zdDsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgdm9pZCB2YWxpZGF0ZShjb25zdCBzdGQ6OnZlY3RvcjxUPiYgbGlzdCkgY29uc3Q7CisKKyAgLyoqCisgICAqIE9wdGlvbmFsIG1ldGhvZHMgdGhhdCBtYXkgYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3NlcyB0byB0YWtlIG5lY2Vzc2FyeQorICAgKiBzdGVwcyBhdCB0aGUgYmVnaW5uaW5nIG9yIGVuZCBvZiBjb2RlIGdlbmVyYXRpb24uCisgICAqLworCisgIHZpcnR1YWwgdm9pZCBpbml0X2dlbmVyYXRvcigpIHt9CisgIHZpcnR1YWwgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKSB7fQorCisgIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyk7CisKKyAgLyoqCisgICAqIFB1cmUgdmlydHVhbCBtZXRob2RzIGltcGxlbWVudGVkIGJ5IHRoZSBnZW5lcmF0b3Igc3ViY2xhc3Nlcy4KKyAgICovCisKKyAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgPSAwOworICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpIHsgKHZvaWQpdGNvbnN0OyB9CisgIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpID0gMDsKKyAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgPSAwOworICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfZm9yd2FyZF9kZWNsYXJhdGlvbih0X3N0cnVjdCopIHt9CisgIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7CisgICAgLy8gQnkgZGVmYXVsdCBleGNlcHRpb25zIGFyZSB0aGUgc2FtZSBhcyBzdHJ1Y3RzCisgICAgZ2VuZXJhdGVfc3RydWN0KHR4Y2VwdGlvbik7CisgIH0KKworICAvKioKKyAgICogTWV0aG9kIHRvIGdldCB0aGUgcHJvZ3JhbSBuYW1lLCBtYXkgYmUgb3ZlcnJpZGRlbgorICAgKi8KKyAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXRfcHJvZ3JhbV9uYW1lKHRfcHJvZ3JhbSogdHByb2dyYW0pIHsgcmV0dXJuIHRwcm9ncmFtLT5nZXRfbmFtZSgpOyB9CisKKyAgLyoqCisgICAqIE1ldGhvZCB0byBnZXQgdGhlIHNlcnZpY2UgbmFtZSwgbWF5IGJlIG92ZXJyaWRkZW4KKyAgICovCisgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0X3NlcnZpY2VfbmFtZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7IHJldHVybiB0c2VydmljZS0+Z2V0X25hbWUoKTsgfQorCisgIC8qKgorICAgKiBHZXQgdGhlIGN1cnJlbnQgb3V0cHV0IGRpcmVjdG9yeQorICAgKi8KKyAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXRfb3V0X2RpcigpIGNvbnN0IHsKKyAgICBpZiAocHJvZ3JhbV8tPmlzX291dF9wYXRoX2Fic29sdXRlKCkpIHsKKyAgICAgIHJldHVybiBwcm9ncmFtXy0+Z2V0X291dF9wYXRoKCkgKyAiLyI7CisgICAgfQorCisgICAgcmV0dXJuIHByb2dyYW1fLT5nZXRfb3V0X3BhdGgoKSArIG91dF9kaXJfYmFzZV8gKyAiLyI7CisgIH0KKworICAvKioKKyAgICogQ3JlYXRlcyBhIHVuaXF1ZSB0ZW1wb3JhcnkgdmFyaWFibGUgbmFtZSwgd2hpY2ggaXMganVzdCAibmFtZSIgd2l0aCBhCisgICAqIG51bWJlciBhcHBlbmRlZCB0byBpdCAoaS5lLiBuYW1lMzUpCisgICAqLworICBzdGQ6OnN0cmluZyB0bXAoc3RkOjpzdHJpbmcgbmFtZSkgeworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7CisgICAgb3V0IDw8IG5hbWUgPDwgdG1wXysrOworICAgIHJldHVybiBvdXQuc3RyKCk7CisgIH0KKworICAvKioKKyAgICogR2VuZXJhdGVzIGEgY29tbWVudCBhYm91dCB0aGlzIGNvZGUgYmVpbmcgYXV0b2dlbmVyYXRlZCwgdXNpbmcgQysrIHN0eWxlCisgICAqIGNvbW1lbnRzLCB3aGljaCBhcmUgYWxzbyBmYWlyIGdhbWUgaW4gSmF2YSAvIFBIUCwgeWF5IQorICAgKgorICAgKiBAcmV0dXJuIEMtc3R5bGUgY29tbWVudCBtZW50aW9uaW5nIHRoYXQgdGhpcyBmaWxlIGlzIGF1dG9nZW5lcmF0ZWQuCisgICAqLworICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGF1dG9nZW5fY29tbWVudCgpIHsKKyAgICByZXR1cm4gc3RkOjpzdHJpbmcoIi8qKlxuIikgKyAiICogIiArIGF1dG9nZW5fc3VtbWFyeSgpICsgIlxuIiArICIgKlxuIgorICAgICAgICAgICArICIgKiBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HXG4iCisgICAgICAgICAgICsgIiAqICBAZ2VuZXJhdGVkXG4iICsgIiAqL1xuIjsKKyAgfQorCisgIHZpcnR1YWwgc3RkOjpzdHJpbmcgYXV0b2dlbl9zdW1tYXJ5KCkgeworICAgIHJldHVybiBzdGQ6OnN0cmluZygiQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKCIpICsgVEhSSUZUX1ZFUlNJT04gKyAiKSI7CisgIH0KKworICAvKioKKyAgICogSW5kZW50YXRpb24gbGV2ZWwgbW9kaWZpZXJzCisgICAqLworCisgIHZvaWQgaW5kZW50X3VwKCkgeyArK2luZGVudF87IH0KKworICB2b2lkIGluZGVudF9kb3duKCkgeyAtLWluZGVudF87IH0KKworICAvKioKKyAgKiBJbmRlbnRhdGlvbiB2YWxpZGF0aW9uIGhlbHBlcgorICAqLworICBpbnQgaW5kZW50X2NvdW50KCkgeyByZXR1cm4gaW5kZW50XzsgfQorCisgIHZvaWQgaW5kZW50X3ZhbGlkYXRlKCBpbnQgZXhwZWN0ZWQsIGNvbnN0IGNoYXIgKiBmdW5jX25hbWUpIHsKKyAgICBpZiAoaW5kZW50XyAhPSBleHBlY3RlZCkgeyAKKyAgICAgIHB2ZXJib3NlKCJXcm9uZyBpbmRlbnQgY291bnQgaW4gJXM6IGRpZmZlcmVuY2UgPSAlaSBcbiIsIGZ1bmNfbmFtZSwgKGV4cGVjdGVkIC0gaW5kZW50XykpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBJbmRlbnRhdGlvbiBwcmludCBmdW5jdGlvbgorICAgKi8KKyAgc3RkOjpzdHJpbmcgaW5kZW50KCkgeworICAgIHN0ZDo6c3RyaW5nIGluZCA9ICIiOworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBpbmRlbnRfOyArK2kpIHsKKyAgICAgIGluZCArPSBpbmRlbnRfc3RyKCk7CisgICAgfQorICAgIHJldHVybiBpbmQ7CisgIH0KKworICAvKioKKyAgICogSW5kZW50YXRpb24gdXRpbGl0eSB3cmFwcGVyCisgICAqLworICBzdGQ6Om9zdHJlYW0mIGluZGVudChzdGQ6Om9zdHJlYW0mIG9zKSB7IHJldHVybiBvcyA8PCBpbmRlbnQoKTsgfQorCisgIC8qKgorICAgKiBDYXBpdGFsaXphdGlvbiBoZWxwZXJzCisgICAqLworICBzdGQ6OnN0cmluZyBjYXBpdGFsaXplKHN0ZDo6c3RyaW5nIGluKSB7CisgICAgaW5bMF0gPSB0b3VwcGVyKGluWzBdKTsKKyAgICByZXR1cm4gaW47CisgIH0KKyAgc3RkOjpzdHJpbmcgZGVjYXBpdGFsaXplKHN0ZDo6c3RyaW5nIGluKSB7CisgICAgaW5bMF0gPSB0b2xvd2VyKGluWzBdKTsKKyAgICByZXR1cm4gaW47CisgIH0KKyAgc3RhdGljIHN0ZDo6c3RyaW5nIGxvd2VyY2FzZShzdGQ6OnN0cmluZyBpbikgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW4uc2l6ZSgpOyArK2kpIHsKKyAgICAgIGluW2ldID0gdG9sb3dlcihpbltpXSk7CisgICAgfQorICAgIHJldHVybiBpbjsKKyAgfQorICBzdGF0aWMgc3RkOjpzdHJpbmcgdXBwZXJjYXNlKHN0ZDo6c3RyaW5nIGluKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbi5zaXplKCk7ICsraSkgeworICAgICAgaW5baV0gPSB0b3VwcGVyKGluW2ldKTsKKyAgICB9CisgICAgcmV0dXJuIGluOworICB9CisKKyAgLyoqCisgICAqIFRyYW5zZm9ybXMgYSBjYW1lbCBjYXNlIHN0cmluZyB0byBhbiBlcXVpdmFsZW50IG9uZSBzZXBhcmF0ZWQgYnkgdW5kZXJzY29yZXMKKyAgICogZS5nLiBhTXVsdGlXb3JkIC0+IGFfbXVsdGlfd29yZAorICAgKiAgICAgIHNvbWVOYW1lICAgLT4gc29tZV9uYW1lCisgICAqICAgICAgQ2FtZWxDYXNlICAtPiBjYW1lbF9jYXNlCisgICAqICAgICAgbmFtZSAgICAgICAtPiBuYW1lCisgICAqICAgICAgTmFtZSAgICAgICAtPiBuYW1lCisgICAqLworICBzdGQ6OnN0cmluZyB1bmRlcnNjb3JlKHN0ZDo6c3RyaW5nIGluKSB7CisgICAgaW5bMF0gPSB0b2xvd2VyKGluWzBdKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMTsgaSA8IGluLnNpemUoKTsgKytpKSB7CisgICAgICBpZiAoaXN1cHBlcihpbltpXSkpIHsKKyAgICAgICAgaW5baV0gPSB0b2xvd2VyKGluW2ldKTsKKyAgICAgICAgaW4uaW5zZXJ0KGksICJfIik7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBpbjsKKyAgfQorCisgIC8qKgorICAgICogVHJhbnNmb3JtcyBhIHN0cmluZyB3aXRoIHdvcmRzIHNlcGFyYXRlZCBieSB1bmRlcnNjb3JlcyB0byBhIGNhbWVsIGNhc2UgZXF1aXZhbGVudAorICAgICogZS5nLiBhX211bHRpX3dvcmQgLT4gYU11bHRpV29yZAorICAgICogICAgICBzb21lX25hbWUgICAgLT4gIHNvbWVOYW1lCisgICAgKiAgICAgIG5hbWUgICAgICAgICAtPiAgbmFtZQorICAgICovCisgIHN0ZDo6c3RyaW5nIGNhbWVsY2FzZShzdGQ6OnN0cmluZyBpbikgeworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7CisgICAgYm9vbCB1bmRlcnNjb3JlID0gZmFsc2U7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluLnNpemUoKTsgaSsrKSB7CisgICAgICBpZiAoaW5baV0gPT0gJ18nKSB7CisgICAgICAgIHVuZGVyc2NvcmUgPSB0cnVlOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmICh1bmRlcnNjb3JlKSB7CisgICAgICAgIG91dCA8PCAoY2hhcil0b3VwcGVyKGluW2ldKTsKKyAgICAgICAgdW5kZXJzY29yZSA9IGZhbHNlOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIG91dCA8PCBpbltpXTsKKyAgICB9CisKKyAgICByZXR1cm4gb3V0LnN0cigpOworICB9CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZW1pdF9kb3VibGVfYXNfc3RyaW5nKGNvbnN0IGRvdWJsZSB2YWx1ZSkgeworICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gZG91YmxlX291dHB1dF9zdHJlYW07CisgICAgICAvLyBzZXRzIHRoZSBtYXhpbXVtIHByZWNpc2lvbjogaHR0cDovL2VuLmNwcHJlZmVyZW5jZS5jb20vdy9jcHAvaW8vbWFuaXAvc2V0cHJlY2lzaW9uCisgICAgICAvLyBzZXRzIHRoZSBvdXRwdXQgZm9ybWF0IHRvIGZpeGVkOiBodHRwOi8vZW4uY3BwcmVmZXJlbmNlLmNvbS93L2NwcC9pby9tYW5pcC9maXhlZCAobm90IGluIHNjaWVudGlmaWMgbm90YXRpb24pCisgICAgICBkb3VibGVfb3V0cHV0X3N0cmVhbSA8PCBzdGQ6OnNldHByZWNpc2lvbihzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmRpZ2l0czEwICsgMSk7CisKKyAgICAgICNpZmRlZiBfTVNDX1ZFUgorICAgICAgICAgIC8vIHN0cnRvZCBpcyBicm9rZW4gaW4gTVNWQyBjb21waWxlcnMgb2xkZXIgdGhhbiAyMDE1LCBzbyBzdGQ6OmZpeGVkIGZhaWxzIHRvIGZvcm1hdCBhIGRvdWJsZSBsaXRlcmFsLgorICAgICAgICAgIC8vIG1vcmUgZGV0YWlsczogaHR0cHM6Ly9ibG9ncy5tc2RuLm1pY3Jvc29mdC5jb20vdmNibG9nLzIwMTQvMDYvMTgvCisgICAgICAgICAgLy8gICAgICAgICAgICAgICBjLXJ1bnRpbWUtY3J0LWZlYXR1cmVzLWZpeGVzLWFuZC1icmVha2luZy1jaGFuZ2VzLWluLXZpc3VhbC1zdHVkaW8tMTQtY3RwMS8KKyAgICAgICAgICAvLyAgICAgICAgICAgICAgIGFuZAorICAgICAgICAgIC8vICAgICAgICAgICAgICAgaHR0cDovL3d3dy5leHBsb3JpbmdiaW5hcnkuY29tL3Zpc3VhbC1jLXBsdXMtcGx1cy1zdHJ0b2Qtc3RpbGwtYnJva2VuLworICAgICAgICAgICNpZiBfTVNDX1ZFUiA+PSBNU0NfMjAxNV9WRVIKKyAgICAgICAgICAgICAgZG91YmxlX291dHB1dF9zdHJlYW0gPDwgc3RkOjpmaXhlZDsKKyAgICAgICAgICAjZW5kaWYKKyAgICAgICNlbHNlCisgICAgICAgICAgZG91YmxlX291dHB1dF9zdHJlYW0gPDwgc3RkOjpmaXhlZDsKKyAgICAgICNlbmRpZgorCisgICAgICBkb3VibGVfb3V0cHV0X3N0cmVhbSA8PCB2YWx1ZTsKKworICAgICAgcmV0dXJuIGRvdWJsZV9vdXRwdXRfc3RyZWFtLnN0cigpOworICB9CisKK3B1YmxpYzoKKyAgLyoqCisgICAqIEdldCB0aGUgdHJ1ZSB0eXBlIGJlaGluZCBhIHNlcmllcyBvZiB0eXBlZGVmcy4KKyAgICovCisgIHN0YXRpYyBjb25zdCB0X3R5cGUqIGdldF90cnVlX3R5cGUoY29uc3QgdF90eXBlKiB0eXBlKSB7IHJldHVybiB0eXBlLT5nZXRfdHJ1ZV90eXBlKCk7IH0KKyAgc3RhdGljIHRfdHlwZSogZ2V0X3RydWVfdHlwZSh0X3R5cGUqIHR5cGUpIHsgcmV0dXJuIHR5cGUtPmdldF90cnVlX3R5cGUoKTsgfQorCitwcm90ZWN0ZWQ6CisgIC8qKgorICAgKiBUaGUgcHJvZ3JhbSBiZWluZyBnZW5lcmF0ZWQKKyAgICovCisgIHRfcHJvZ3JhbSogcHJvZ3JhbV87CisKKyAgLyoqCisgICAqIFF1aWNrIGFjY2Vzc29yIGZvciBmb3JtYXR0ZWQgcHJvZ3JhbSBuYW1lIHRoYXQgaXMgY3VycmVudGx5IGJlaW5nCisgICAqIGdlbmVyYXRlZC4KKyAgICovCisgIHN0ZDo6c3RyaW5nIHByb2dyYW1fbmFtZV87CisKKyAgLyoqCisgICAqIFF1aWNrIGFjY2Vzc29yIGZvciBmb3JtYXR0ZWQgc2VydmljZSBuYW1lIHRoYXQgaXMgY3VycmVudGx5IGJlaW5nCisgICAqIGdlbmVyYXRlZC4KKyAgICovCisgIHN0ZDo6c3RyaW5nIHNlcnZpY2VfbmFtZV87CisKKyAgLyoqCisgICAqIE91dHB1dCB0eXBlLXNwZWNpZmMgZGlyZWN0b3J5IG5hbWUgKCJnZW4tKiIpCisgICAqLworICBzdGQ6OnN0cmluZyBvdXRfZGlyX2Jhc2VfOworCisgIC8qKgorICAgKiBNYXAgb2YgY2hhcmFjdGVycyB0byBlc2NhcGUgaW4gc3RyaW5nIGxpdGVyYWxzLgorICAgKi8KKyAgc3RkOjptYXA8Y2hhciwgc3RkOjpzdHJpbmc+IGVzY2FwZV87CisKKyAgdmlydHVhbCBzdGQ6OnN0cmluZyBpbmRlbnRfc3RyKCkgY29uc3QgeworICAgIHJldHVybiAiICAiOworICB9CisKK3ByaXZhdGU6CisgIC8qKgorICAgKiBDdXJyZW50IGNvZGUgaW5kZW50YXRpb24gbGV2ZWwKKyAgICovCisgIGludCBpbmRlbnRfOworCisgIC8qKgorICAgKiBUZW1wb3JhcnkgdmFyaWFibGUgY291bnRlciwgZm9yIG1ha2luZyB1bmlxdWUgdmFyaWFibGUgbmFtZXMKKyAgICovCisgIGludCB0bXBfOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzID0gc3RkOjpjaGFyX3RyYWl0czxfQ2hhclQ+ID4KK2NsYXNzIHRlbXBsYXRlX29mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgOiBwdWJsaWMgc3RkOjpvc3RyaW5nc3RyZWFtIHsKK3B1YmxpYzoKKyAgdGVtcGxhdGVfb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSgpOiBjb250ZW50c193cml0dGVuKGZhbHNlKSB7fQorCisgIHRlbXBsYXRlX29mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUoc3RkOjpzdHJpbmcgY29uc3QmIG91dHB1dF9maWxlX3BhdGhfKQorICA6IG91dHB1dF9maWxlX3BhdGgob3V0cHV0X2ZpbGVfcGF0aF8pLCBjb250ZW50c193cml0dGVuKGZhbHNlKSB7fQorCisgIH50ZW1wbGF0ZV9vZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlKCkgeworICAgIGlmICghY29udGVudHNfd3JpdHRlbikgeworICAgICAgY2xvc2UoKTsKKyAgICB9CisgIH0KKworICB2b2lkIG9wZW4oc3RkOjpzdHJpbmcgY29uc3QmIG91dHB1dF9maWxlX3BhdGhfKSB7CisgICAgb3V0cHV0X2ZpbGVfcGF0aCA9IG91dHB1dF9maWxlX3BhdGhfOworICAgIGNsZWFyX2J1ZigpOworICAgIGNvbnRlbnRzX3dyaXR0ZW4gPSBmYWxzZTsKKyAgfQorCisgIHZvaWQgY2xvc2UoKSB7CisgICAgaWYgKGNvbnRlbnRzX3dyaXR0ZW4gfHwgb3V0cHV0X2ZpbGVfcGF0aCA9PSAiIikKKyAgICAgIHJldHVybjsKKworICAgIGlmICghaXNfcmVhZGFibGUob3V0cHV0X2ZpbGVfcGF0aCkpIHsKKyAgICAgIGR1bXAoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdGQ6Omlmc3RyZWFtIG9sZF9maWxlOworICAgIG9sZF9maWxlLmV4Y2VwdGlvbnMob2xkX2ZpbGUuZXhjZXB0aW9ucygpIHwgc3RkOjppZnN0cmVhbTo6YmFkYml0IHwgc3RkOjppZnN0cmVhbTo6ZmFpbGJpdCk7CisgICAgb2xkX2ZpbGUub3BlbihvdXRwdXRfZmlsZV9wYXRoLmNfc3RyKCksIHN0ZDo6aW9zOjppbik7CisKKyAgICBpZiAob2xkX2ZpbGUpIHsKKyAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0IG9sZF9maWxlX2NvbnRlbnRzKHN0YXRpY19jYXN0PHN0ZDo6b3N0cmluZ3N0cmVhbSBjb25zdCY+KHN0ZDo6b3N0cmluZ3N0cmVhbSgpIDw8IG9sZF9maWxlLnJkYnVmKCkpLnN0cigpKTsKKyAgICAgIG9sZF9maWxlLmNsb3NlKCk7CisKKyAgICAgIGlmIChvbGRfZmlsZV9jb250ZW50cyAhPSBzdHIoKSkgeworICAgICAgICBkdW1wKCk7CisgICAgICB9CisgICAgfQorICB9CisKK3Byb3RlY3RlZDoKKyAgdm9pZCBkdW1wKCkgeworICAgIHN0ZDo6b2ZzdHJlYW0gb3V0X2ZpbGU7CisgICAgb3V0X2ZpbGUuZXhjZXB0aW9ucyhvdXRfZmlsZS5leGNlcHRpb25zKCkgfCBzdGQ6Om9mc3RyZWFtOjpiYWRiaXQgfCBzdGQ6Om9mc3RyZWFtOjpmYWlsYml0KTsKKyAgICB0cnkgeworICAgICAgb3V0X2ZpbGUub3BlbihvdXRwdXRfZmlsZV9wYXRoLmNfc3RyKCksIHN0ZDo6aW9zOjpvdXQpOworICAgIH0KKyAgICBjYXRjaCAoY29uc3Qgc3RkOjppb3NfYmFzZTo6ZmFpbHVyZSYgZSkgeworICAgICAgOjpmYWlsdXJlKCJmYWlsZWQgdG8gd3JpdGUgdGhlIG91dHB1dCB0byB0aGUgZmlsZSAnJXMnLCBkZXRhaWxzOiAnJXMnIiwgb3V0cHV0X2ZpbGVfcGF0aC5jX3N0cigpLCBlLndoYXQoKSk7CisgICAgfQorICAgIG91dF9maWxlIDw8IHN0cigpOworICAgIG91dF9maWxlLmNsb3NlKCk7CisgICAgY2xlYXJfYnVmKCk7CisgICAgY29udGVudHNfd3JpdHRlbiA9IHRydWU7CisgIH0KKworICB2b2lkIGNsZWFyX2J1ZigpIHsKKyAgICBzdHIoc3RkOjpzdHJpbmcoKSk7CisgIH0KKworICBzdGF0aWMgYm9vbCBpc19yZWFkYWJsZShzdGQ6OnN0cmluZyBjb25zdCYgZmlsZV9uYW1lKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGJvb2w+KHN0ZDo6aWZzdHJlYW0oZmlsZV9uYW1lLmNfc3RyKCkpKTsKKyAgfQorCitwcml2YXRlOgorICBzdGQ6OnN0cmluZyBvdXRwdXRfZmlsZV9wYXRoOworICBib29sIGNvbnRlbnRzX3dyaXR0ZW47Cit9OwordHlwZWRlZiB0ZW1wbGF0ZV9vZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlPGNoYXI+IG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGU7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3JfcmVnaXN0cnkuaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yX3JlZ2lzdHJ5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYwMjE2NwotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yX3JlZ2lzdHJ5LmgKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUX0dFTkVSQVRPUl9SRUdJU1RSWV9ICisjZGVmaW5lIFRfR0VORVJBVE9SX1JFR0lTVFJZX0gKKworY2xhc3MgdF9nZW5lcmF0b3I7CisKKy8qKgorICogQSBmYWN0b3J5IGZvciBwcm9kdWNpbmcgZ2VuZXJhdG9yIGNsYXNzZXMgb2YgYSBwYXJ0aWN1bGFyIGxhbmd1YWdlLgorICoKKyAqIFRoaXMgY2xhc3MgaXMgYWxzbyByZXNwb25zaWJsZSBmb3I6CisgKiAgLSBSZWdpc3RlcmluZyBpdHNlbGYgd2l0aCB0aGUgZ2VuZXJhdG9yIHJlZ2lzdHJ5LgorICogIC0gUHJvdmlkaW5nIGRvY3VtZW50YXRpb24gZm9yIHRoZSBnZW5lcmF0b3JzIGl0IHByb2R1Y2VzLgorICovCitjbGFzcyB0X2dlbmVyYXRvcl9mYWN0b3J5IHsKK3B1YmxpYzoKKyAgdF9nZW5lcmF0b3JfZmFjdG9yeShjb25zdCBzdGQ6OnN0cmluZyYgc2hvcnRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbG9uZ19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkb2N1bWVudGF0aW9uKTsKKworICB2aXJ0dWFsIH50X2dlbmVyYXRvcl9mYWN0b3J5KCkge30KKworICB2aXJ0dWFsIHRfZ2VuZXJhdG9yKiBnZXRfZ2VuZXJhdG9yKAorICAgICAgLy8gVGhlIHByb2dyYW0gdG8gZ2VuZXJhdGUuCisgICAgICB0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAvLyBOb3RlOiBwYXJzZWRfb3B0aW9ucyB3aWxsIG5vdCBleGlzdCBiZXlvbmQgdGhlIGNhbGwgdG8gZ2V0X2dlbmVyYXRvci4KKyAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAorICAgICAgLy8gTm90ZTogb3B0aW9uX3N0cmluZyBtaWdodCBub3QgZXhpc3QgYmV5b25kIHRoZSBjYWxsIHRvIGdldF9nZW5lcmF0b3IuCisgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykgPSAwOworCisgIHZpcnR1YWwgYm9vbCBpc192YWxpZF9uYW1lc3BhY2UoY29uc3Qgc3RkOjpzdHJpbmcmIHN1Yl9uYW1lc3BhY2UpID0gMDsKKworICBzdGQ6OnN0cmluZyBnZXRfc2hvcnRfbmFtZSgpIHsgcmV0dXJuIHNob3J0X25hbWVfOyB9CisgIHN0ZDo6c3RyaW5nIGdldF9sb25nX25hbWUoKSB7IHJldHVybiBsb25nX25hbWVfOyB9CisgIHN0ZDo6c3RyaW5nIGdldF9kb2N1bWVudGF0aW9uKCkgeyByZXR1cm4gZG9jdW1lbnRhdGlvbl87IH0KKworcHJpdmF0ZToKKyAgc3RkOjpzdHJpbmcgc2hvcnRfbmFtZV87CisgIHN0ZDo6c3RyaW5nIGxvbmdfbmFtZV87CisgIHN0ZDo6c3RyaW5nIGRvY3VtZW50YXRpb25fOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIGdlbmVyYXRvcj4KK2NsYXNzIHRfZ2VuZXJhdG9yX2ZhY3RvcnlfaW1wbCA6IHB1YmxpYyB0X2dlbmVyYXRvcl9mYWN0b3J5IHsKK3B1YmxpYzoKKyAgdF9nZW5lcmF0b3JfZmFjdG9yeV9pbXBsKGNvbnN0IHN0ZDo6c3RyaW5nJiBzaG9ydF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGxvbmdfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkb2N1bWVudGF0aW9uKQorICAgIDogdF9nZW5lcmF0b3JfZmFjdG9yeShzaG9ydF9uYW1lLCBsb25nX25hbWUsIGRvY3VtZW50YXRpb24pIHt9CisKKyAgdmlydHVhbCB0X2dlbmVyYXRvciogZ2V0X2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpIHsKKyAgICByZXR1cm4gbmV3IGdlbmVyYXRvcihwcm9ncmFtLCBwYXJzZWRfb3B0aW9ucywgb3B0aW9uX3N0cmluZyk7CisgIH0KKworICB2aXJ0dWFsIGJvb2wgaXNfdmFsaWRfbmFtZXNwYWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdWJfbmFtZXNwYWNlKSB7CisgICAgcmV0dXJuIGdlbmVyYXRvcjo6aXNfdmFsaWRfbmFtZXNwYWNlKHN1Yl9uYW1lc3BhY2UpOworICB9Cit9OworCitjbGFzcyB0X2dlbmVyYXRvcl9yZWdpc3RyeSB7CitwdWJsaWM6CisgIHN0YXRpYyB2b2lkIHJlZ2lzdGVyX2dlbmVyYXRvcih0X2dlbmVyYXRvcl9mYWN0b3J5KiBmYWN0b3J5KTsKKworICBzdGF0aWMgdF9nZW5lcmF0b3IqIGdldF9nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLCBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9ucyk7CisgIHN0YXRpYyB0X2dlbmVyYXRvciogZ2V0X2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbGF1Z25hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25zKTsKKworICB0eXBlZGVmIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCB0X2dlbmVyYXRvcl9mYWN0b3J5Kj4gZ2VuX21hcF90OworICBzdGF0aWMgZ2VuX21hcF90JiBnZXRfZ2VuZXJhdG9yX21hcCgpOworCitwcml2YXRlOgorICB0X2dlbmVyYXRvcl9yZWdpc3RyeSgpOworICB0X2dlbmVyYXRvcl9yZWdpc3RyeShjb25zdCB0X2dlbmVyYXRvcl9yZWdpc3RyeSYpOworfTsKKworI2RlZmluZSBUSFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKGxhbmd1YWdlLCBsb25nX25hbWUsIGRvYykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjbGFzcyB0XyMjbGFuZ3VhZ2UjI19nZW5lcmF0b3JfZmFjdG9yeV9pbXBsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgOiBwdWJsaWMgdF9nZW5lcmF0b3JfZmFjdG9yeV9pbXBsPHRfIyNsYW5ndWFnZSMjX2dlbmVyYXRvcj4geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRfIyNsYW5ndWFnZSMjX2dlbmVyYXRvcl9mYWN0b3J5X2ltcGwoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgOiB0X2dlbmVyYXRvcl9mYWN0b3J5X2ltcGw8dF8jI2xhbmd1YWdlIyNfZ2VuZXJhdG9yPigjbGFuZ3VhZ2UsIGxvbmdfbmFtZSwgZG9jKSB7fSAgICAgICAgICAgXAorICB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzdGF0aWMgdF8jI2xhbmd1YWdlIyNfZ2VuZXJhdG9yX2ZhY3RvcnlfaW1wbCBfcmVnaXN0ZXJlcjsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2dvX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZ29fZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjMTZiODcKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2dvX2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDM3MTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBpcyBwcm9ncmFtbWF0aWNhbGx5IHNhbml0aXplZCBmb3Igc3R5bGU6CisgKiBhc3R5bGUgLS1zdHlsZT0xdGJzIC1mIC1wIC1IIC1qIC1VIHRfZ29fZ2VuZXJhdG9yLmNjCisgKgorICogVGhlIG91dHB1dCBvZiBhc3R5bGUgc2hvdWxkIG5vdCBiZSB0YWtlbiB1bnF1ZXN0aW9uaW5nbHksIGJ1dCBpdCBpcyBhIGdvb2QKKyAqIGd1aWRlIGZvciBlbnN1cmluZyB1bmlmb3JtaXR5IGFuZCByZWFkYWJpbGl0eS4KKyAqLworCisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y2xvY2FsZT4KKyNpbmNsdWRlICJ0aHJpZnQvcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ0aHJpZnQvdmVyc2lvbi5oIgorI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvci5oIgorCit1c2luZyBzdGQ6Om1hcDsKK3VzaW5nIHN0ZDo6b3N0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnZlY3RvcjsKKworc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsID0gIlxuIjsgLy8gYXZvaWQgb3N0cmVhbSA8PCBzdGQ6OmVuZGwgZmx1c2hlcworCisvKioKKyAqIEEgaGVscGVyIGZvciBhdXRvbWF0aWNhbGx5IGZvcm1hdHRpbmcgdGhlIGVtaXR0ZWQgR28gY29kZSBmcm9tIHRoZSBUaHJpZnQKKyAqIElETCBwZXIgdGhlIEdvIHN0eWxlIGd1aWRlLgorICoKKyAqIFJldHVybnM6CisgKiAgLSB0cnVlLCBpZiB0aGUgZm9ybWF0dGluZyBwcm9jZXNzIHN1Y2NlZWRlZC4KKyAqICAtIGZhbHNlLCBpZiB0aGUgZm9ybWF0dGluZyBwcm9jZXNzIGZhaWxlZCwgd2hpY2ggbWVhbnMgdGhlIGJhc2ljIG91dHB1dCB3YXMKKyAqICAgICAgICAgICBzdGlsbCBnZW5lcmF0ZWQuCisgKi8KK2Jvb2wgZm9ybWF0X2dvX291dHB1dChjb25zdCBzdHJpbmcmIGZpbGVfcGF0aCk7CisKK2NvbnN0IHN0cmluZyBERUZBVUxUX1RIUklGVF9JTVBPUlQgPSAiZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0L2xpYi9nby90aHJpZnQiOworc3RhdGljIHN0ZDo6c3RyaW5nIHBhY2thZ2VfZmxhZzsKKworLyoqCisgKiBHbyBjb2RlIGdlbmVyYXRvci4KKyAqLworY2xhc3MgdF9nb19nZW5lcmF0b3IgOiBwdWJsaWMgdF9nZW5lcmF0b3IgeworcHVibGljOgorICB0X2dvX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAorICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKKyAgICA6IHRfZ2VuZXJhdG9yKHByb2dyYW0pIHsKKyAgICAodm9pZClvcHRpb25fc3RyaW5nOworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7CisKKworICAgIGdlbl90aHJpZnRfaW1wb3J0XyA9IERFRkFVTFRfVEhSSUZUX0lNUE9SVDsKKyAgICBnZW5fcGFja2FnZV9wcmVmaXhfID0gIiI7CisgICAgcGFja2FnZV9mbGFnID0gIiI7CisgICAgcmVhZF93cml0ZV9wcml2YXRlXyA9IGZhbHNlOworICAgIGlnbm9yZV9pbml0aWFsaXNtc18gPSBmYWxzZTsKKyAgICBmb3IoIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5iZWdpbigpOyBpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJwYWNrYWdlX3ByZWZpeCIpID09IDApIHsKKyAgICAgICAgZ2VuX3BhY2thZ2VfcHJlZml4XyA9IChpdGVyLT5zZWNvbmQpOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJ0aHJpZnRfaW1wb3J0IikgPT0gMCkgeworICAgICAgICBnZW5fdGhyaWZ0X2ltcG9ydF8gPSAoaXRlci0+c2Vjb25kKTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgicGFja2FnZSIpID09IDApIHsKKyAgICAgICAgcGFja2FnZV9mbGFnID0gKGl0ZXItPnNlY29uZCk7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoInJlYWRfd3JpdGVfcHJpdmF0ZSIpID09IDApIHsKKyAgICAgICAgcmVhZF93cml0ZV9wcml2YXRlXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImlnbm9yZV9pbml0aWFsaXNtcyIpID09IDApIHsKKyAgICAgICAgaWdub3JlX2luaXRpYWxpc21zXyA9ICB0cnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgInVua25vd24gb3B0aW9uIGdvOiIgKyBpdGVyLT5maXJzdDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1nbyI7CisgIH0KKworICAvKioKKyAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcworICAgKi8KKworICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7CisgIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7CisKKyAgLyoqCisgICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpOworICB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSk7CisgIHZvaWQgZ2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUsIGNvbnN0IHN0cmluZyYgbmFtZSwgYm9vbCBvcHQgPSBmYWxzZSk7CisKKyAgLyoqCisgICAqIFN0cnVjdCBnZW5lcmF0aW9uIGNvZGUKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9nb19zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9nb19zdHJ1Y3RfZGVmaW5pdGlvbihzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2FyZ3MgPSBmYWxzZSk7CisgIHZvaWQgZ2VuZXJhdGVfZ29fc3RydWN0X2luaXRpYWxpemVyKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19hcmdzX29yX3Jlc3VsdCA9IGZhbHNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9pc3NldF9oZWxwZXJzKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHRzdHJ1Y3RfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0ID0gZmFsc2UpOworICB2b2lkIGdlbmVyYXRlX2NvdW50c2V0ZmllbGRzX2hlbHBlcihzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgdHN0cnVjdF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCA9IGZhbHNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9nb19zdHJ1Y3RfcmVhZGVyKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHRzdHJ1Y3RfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0ID0gZmFsc2UpOworICB2b2lkIGdlbmVyYXRlX2dvX3N0cnVjdF93cml0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgdHN0cnVjdF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdXNlc19jb3VudHNldGZpZWxkcyA9IGZhbHNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9nb19mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHZvaWQgZ2V0X3B1YmxpY2l6ZWRfbmFtZV9hbmRfZGVmX3ZhbHVlKHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKiBPVVRfcHViX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqKiBPVVRfZGVmX3ZhbHVlKSBjb25zdDsKKworICAvKioKKyAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3JlbW90ZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisKKyAgLyoqCisgICAqIFNlcmlhbGl6YXRpb24gY29uc3RydWN0cworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlY2xhcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsYXNzID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBjb2VyY2VEYXRhID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmtleSA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fY29udGFpbmVyID0gZmFsc2UpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19wb2ludGVyX2ZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlY2xhcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwb2ludGVyX2ZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlY2xhcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0c2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVjbGFyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlY2xhcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlY2xhcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmtleSA9IGZhbHNlKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcG9pbnRlcl9maWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGtpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB2aXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2V0KiB0bWFwLCBzdGQ6OnN0cmluZyBpdGVyKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0ZDo6c3RyaW5nIGl0ZXIpOworCisgIHZvaWQgZ2VuZXJhdGVfZ29fZG9jc3RyaW5nKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9nb19kb2NzdHJpbmcoc3RkOjpvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisKKyAgdm9pZCBnZW5lcmF0ZV9nb19kb2NzdHJpbmcoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZG9jKiB0ZG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogc3ViaGVhZGVyKTsKKworICB2b2lkIGdlbmVyYXRlX2dvX2RvY3N0cmluZyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpOworCisgIC8qKgorICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucworICAgKi8KKworICBzdGQ6OnN0cmluZyBnb19hdXRvZ2VuX2NvbW1lbnQoKTsKKyAgc3RkOjpzdHJpbmcgZ29fcGFja2FnZSgpOworICBzdGQ6OnN0cmluZyBnb19pbXBvcnRzX2JlZ2luKGJvb2wgY29uc3RzKTsKKyAgc3RkOjpzdHJpbmcgZ29faW1wb3J0c19lbmQoKTsKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX2luY2x1ZGVzKGJvb2wgY29uc3RzKTsKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX2luY2x1ZGVkX3Byb2dyYW1zKHN0cmluZyYgdW51c2VkX3Byb3RlY3Rpb24pOworICBzdGQ6OnN0cmluZyByZW5kZXJfaW1wb3J0X3Byb3RlY3Rpb24oKTsKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX2Zhc3RiaW5hcnlfaW5jbHVkZXMoKTsKKyAgc3RkOjpzdHJpbmcgZGVjbGFyZV9hcmd1bWVudCh0X2ZpZWxkKiB0ZmllbGQpOworICBzdGQ6OnN0cmluZyByZW5kZXJfZmllbGRfaW5pdGlhbF92YWx1ZSh0X2ZpZWxkKiB0ZmllbGQsIGNvbnN0IHN0cmluZyYgbmFtZSwgYm9vbCBvcHRpb25hbF9maWVsZCk7CisgIHN0ZDo6c3RyaW5nIHR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlKTsKKyAgc3RkOjpzdHJpbmcgbW9kdWxlX25hbWUodF90eXBlKiB0dHlwZSk7CisgIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlX2lmKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhZGRFcnJvciA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgIHN0ZDo6c3RyaW5nIHR5cGVfdG9fZW51bSh0X3R5cGUqIHR0eXBlKTsKKyAgc3RkOjpzdHJpbmcgdHlwZV90b19nb190eXBlKHRfdHlwZSogdHR5cGUpOworICBzdGQ6OnN0cmluZyB0eXBlX3RvX2dvX3R5cGVfd2l0aF9vcHQodF90eXBlKiB0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgb3B0aW9uYWxfZmllbGQpOworICBzdGQ6OnN0cmluZyB0eXBlX3RvX2dvX2tleV90eXBlKHRfdHlwZSogdHR5cGUpOworICBzdGQ6OnN0cmluZyB0eXBlX3RvX3NwZWNfYXJncyh0X3R5cGUqIHR0eXBlKTsKKworICBzdGF0aWMgc3RkOjpzdHJpbmcgZ2V0X3JlYWxfZ29fbW9kdWxlKGNvbnN0IHRfcHJvZ3JhbSogcHJvZ3JhbSkgeworCisgICAgaWYgKCFwYWNrYWdlX2ZsYWcuZW1wdHkoKSkgeworICAgICAgcmV0dXJuIHBhY2thZ2VfZmxhZzsKKyAgICB9CisgICAgc3RkOjpzdHJpbmcgcmVhbF9tb2R1bGUgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJnbyIpOworICAgIGlmICghcmVhbF9tb2R1bGUuZW1wdHkoKSkgeworICAgICAgcmV0dXJuIHJlYWxfbW9kdWxlOworICAgIH0KKworICAgIHJldHVybiBsb3dlcmNhc2UocHJvZ3JhbS0+Z2V0X25hbWUoKSk7CisgIH0KKworcHJpdmF0ZToKKyAgc3RkOjpzdHJpbmcgZ2VuX3BhY2thZ2VfcHJlZml4XzsKKyAgc3RkOjpzdHJpbmcgZ2VuX3RocmlmdF9pbXBvcnRfOworICBib29sIHJlYWRfd3JpdGVfcHJpdmF0ZV87CisgIGJvb2wgaWdub3JlX2luaXRpYWxpc21zXzsKKworICAvKioKKyAgICogRmlsZSBzdHJlYW1zCisgICAqLworCisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl90eXBlc187CisgIHN0ZDo6c3RyaW5nIGZfdHlwZXNfbmFtZV87CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9jb25zdHNfOworICBzdGQ6OnN0cmluZyBmX2NvbnN0c19uYW1lXzsKKyAgc3RkOjpzdHJpbmdzdHJlYW0gZl9jb25zdF92YWx1ZXNfOworCisgIHN0ZDo6c3RyaW5nIHBhY2thZ2VfbmFtZV87CisgIHN0ZDo6c3RyaW5nIHBhY2thZ2VfZGlyXzsKKyAgc3RkOjpzdHJpbmcgcmVhZF9tZXRob2RfbmFtZV87CisgIHN0ZDo6c3RyaW5nIHdyaXRlX21ldGhvZF9uYW1lXzsKKworICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gY29tbW9uSW5pdGlhbGlzbXM7CisKKyAgc3RkOjpzdHJpbmcgY2FtZWxjYXNlKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgY29uc3Q7CisgIHZvaWQgZml4X2NvbW1vbl9pbml0aWFsaXNtKHN0ZDo6c3RyaW5nJiB2YWx1ZSwgaW50IGkpIGNvbnN0OworICBzdGQ6OnN0cmluZyBwdWJsaWNpemUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlLCBib29sIGlzX2FyZ3Nfb3JfcmVzdWx0ID0gZmFsc2UpIGNvbnN0OworICBzdGQ6OnN0cmluZyBwcml2YXRpemUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSBjb25zdDsKKyAgc3RkOjpzdHJpbmcgbmV3X3ByZWZpeChjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIGNvbnN0OworICBzdGF0aWMgc3RkOjpzdHJpbmcgdmFyaWFibGVfbmFtZV90b19nb19uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSk7CisgIHN0YXRpYyBib29sIGlzX3BvaW50ZXJfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluX2NvbnRhaW5lciA9IGZhbHNlKTsKKyAgc3RhdGljIGJvb2wgb21pdF9pbml0aWFsaXphdGlvbih0X2ZpZWxkKiB0ZmllbGQpOworfTsKKworLy8gcmV0dXJucyB0cnVlIGlmIGZpZWxkIGluaXRpYWxpemF0aW9uIGNhbiBiZSBvbWl0dGVkIHNpbmNlIGl0IGhhcyBjb3JyZXNwb25kaW5nIGdvIHR5cGUgemVybyB2YWx1ZQorLy8gb3IgZGVmYXVsdCB2YWx1ZSBpcyBub3Qgc2V0Citib29sIHRfZ29fZ2VuZXJhdG9yOjpvbWl0X2luaXRpYWxpemF0aW9uKHRfZmllbGQqIHRmaWVsZCkgeworICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSA9IHRmaWVsZC0+Z2V0X3ZhbHVlKCk7CisgIGlmICghdmFsdWUpIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICB0X3R5cGUqIHR5cGUgPSB0ZmllbGQtPmdldF90eXBlKCktPmdldF90cnVlX3R5cGUoKTsKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworCisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHRocm93ICIiOworCisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgLy9bXWJ5dGUgYXJlIGFsd2F5cyBpbmxpbmUKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgLy8gc3RyaW5ncyBhcmUgcG9pbnRlcnMgaWYgaGFzIG5vIGRlZmF1bHQKKyAgICAgIHJldHVybiB2YWx1ZS0+Z2V0X3N0cmluZygpLmVtcHR5KCk7CisKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA9PSAwOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlLT5nZXRfaW50ZWdlcigpID09IDA7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gdmFsdWUtPmdldF9kb3VibGUoKSA9PSAwLjsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCisvLyBSZXR1cm5zIHRydWUgaWYgdGhlIHR5cGUgbmVlZCBhIHJlZmVyZW5jZSBpZiB1c2VkIGFzIG9wdGlvbmFsIHdpdGhvdXQgZGVmYXVsdAorc3RhdGljIGJvb2wgdHlwZV9uZWVkX3JlZmVyZW5jZSh0X3R5cGUqIHR5cGUpIHsKKyAgdHlwZSA9IHR5cGUtPmdldF90cnVlX3R5cGUoKTsKKyAgaWYgKHR5cGUtPmlzX21hcCgpIHx8IHR5cGUtPmlzX3NldCgpIHx8IHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zdHJ1Y3QoKQorICAgICAgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSB8fCB0eXBlLT5pc19iaW5hcnkoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworLy8gcmV0dXJucyBmYWxzZSBpZiBmaWVsZCBjb3VsZCBub3QgdXNlIGNvbXBhcmlzb24gdG8gZGVmYXVsdCB2YWx1ZSBhcyAhSXNTZXQqCitib29sIHRfZ29fZ2VuZXJhdG9yOjppc19wb2ludGVyX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbl9jb250YWluZXJfdmFsdWUpIHsKKyAgKHZvaWQpaW5fY29udGFpbmVyX3ZhbHVlOworICBpZiAodGZpZWxkLT5hbm5vdGF0aW9uc18uY291bnQoImNwcC5yZWYiKSAhPSAwKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgdF90eXBlKiB0eXBlID0gdGZpZWxkLT5nZXRfdHlwZSgpLT5nZXRfdHJ1ZV90eXBlKCk7CisgIC8vIFN0cnVjdHMgaW4gY29udGFpbmVycyBhcmUgcG9pbnRlcnMKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICBpZiAoISh0ZmllbGQtPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBib29sIGhhc19kZWZhdWx0ID0gdGZpZWxkLT5nZXRfdmFsdWUoKTsKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworCisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHRocm93ICIiOworCisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgLy9bXWJ5dGUgYXJlIGFsd2F5cyBpbmxpbmUKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgLy8gc3RyaW5ncyBhcmUgcG9pbnRlcnMgaWYgaGFzIG5vIGRlZmF1bHQKKyAgICAgIHJldHVybiAhaGFzX2RlZmF1bHQ7CisKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAhaGFzX2RlZmF1bHQ7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAhaGFzX2RlZmF1bHQ7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiB0cnVlOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuIGhhc19kZWZhdWx0OworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuIGhhc19kZWZhdWx0OworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiBoYXNfZGVmYXVsdDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICByZXR1cm4gaGFzX2RlZmF1bHQ7CisgIH0KKworICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZ29fdHlwZTogIiArIHR5cGUtPmdldF9uYW1lKCk7Cit9CisKK3N0ZDo6c3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjpjYW1lbGNhc2UoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSBjb25zdCB7CisgIHN0ZDo6c3RyaW5nIHZhbHVlMih2YWx1ZSk7CisgIHN0ZDo6c2V0bG9jYWxlKExDX0FMTCwgIkMiKTsgLy8gc2V0IGxvY2FsZSB0byBjbGFzc2ljCisKKyAgLy8gRml4IGNvbW1vbiBpbml0aWFsaXNtIGluIGZpcnN0IHdvcmQKKyAgZml4X2NvbW1vbl9pbml0aWFsaXNtKHZhbHVlMiwgMCk7CisKKyAgLy8gYXMgbG9uZyBhcyB3ZSBhcmUgY2hhbmdpbmcgdGhpbmdzLCBsZXQncyBjaGFuZ2UgXyBmb2xsb3dlZCBieSBsb3dlcmNhc2UgdG8KKyAgLy8gY2FwaXRhbCBhbmQgZml4IGNvbW1vbiBpbml0aWFsaXNtcworICBmb3IgKHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgaSA9IDE7IGkgPCB2YWx1ZTIuc2l6ZSgpIC0gMTsgKytpKSB7CisgICAgaWYgKHZhbHVlMltpXSA9PSAnXycpIHsKKyAgICAgIGlmIChpc2xvd2VyKHZhbHVlMltpICsgMV0pKSB7CisgICAgICAgIHZhbHVlMi5yZXBsYWNlKGksIDIsIDEsIHRvdXBwZXIodmFsdWUyW2kgKyAxXSkpOworICAgICAgfQorCisgICAgICBpZiAoaSA+IHN0YXRpY19jYXN0PHN0ZDo6c3RyaW5nOjpzaXplX3R5cGU+KHN0ZDo6bnVtZXJpY19saW1pdHM8aW50PigpLm1heCgpKSkgeworICAgICAgICB0aHJvdyAiaW50ZWdlciBvdmVyZmxvdyBpbiB0X2dvX2dlbmVyYXRvcjo6Y2FtZWxjYXNlLCB2YWx1ZSA9ICIgKyB2YWx1ZTsKKyAgICAgIH0KKyAgICAgIGZpeF9jb21tb25faW5pdGlhbGlzbSh2YWx1ZTIsIHN0YXRpY19jYXN0PGludD4oaSkpOworICAgIH0KKyAgfQorCisgIHJldHVybiB2YWx1ZTI7Cit9CisKKy8vIENoZWNrcyB0byBzZWUgaWYgdGhlIHdvcmQgc3RhcnRpbmcgYXQgaSBpbiB2YWx1ZSBjb250YWlucyBhIGNvbW1vbiBpbml0aWFsaXNtCisvLyBhbmQgaWYgc28gcmVwbGFjZXMgaXQgd2l0aCB0aGUgdXBwZXIgY2FzZSB2ZXJzaW9uIG9mIHRoZSB3b3JkLgordm9pZCB0X2dvX2dlbmVyYXRvcjo6Zml4X2NvbW1vbl9pbml0aWFsaXNtKHN0ZDo6c3RyaW5nJiB2YWx1ZSwgaW50IGkpIGNvbnN0IHsKKyAgaWYgKCFpZ25vcmVfaW5pdGlhbGlzbXNfKSB7CisgICAgc2l6ZV90IHdvcmRMZW4gPSB2YWx1ZS5maW5kKCdfJywgaSk7CisgICAgaWYgKHdvcmRMZW4gIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgIHdvcmRMZW4gLT0gaTsKKyAgICB9CisgICAgc3RkOjpzdHJpbmcgd29yZCA9IHZhbHVlLnN1YnN0cihpLCB3b3JkTGVuKTsKKyAgICBzdGQ6OnRyYW5zZm9ybSh3b3JkLmJlZ2luKCksIHdvcmQuZW5kKCksIHdvcmQuYmVnaW4oKSwgOjp0b3VwcGVyKTsKKyAgICBpZiAoY29tbW9uSW5pdGlhbGlzbXMuZmluZCh3b3JkKSAhPSBjb21tb25Jbml0aWFsaXNtcy5lbmQoKSkgeworICAgICAgdmFsdWUucmVwbGFjZShpLCB3b3JkLmxlbmd0aCgpLCB3b3JkKTsKKyAgICB9CisgIH0KK30KKworc3RkOjpzdHJpbmcgdF9nb19nZW5lcmF0b3I6OnB1YmxpY2l6ZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUsIGJvb2wgaXNfYXJnc19vcl9yZXN1bHQpIGNvbnN0IHsKKyAgaWYgKHZhbHVlLnNpemUoKSA8PSAwKSB7CisgICAgcmV0dXJuIHZhbHVlOworICB9CisKKyAgc3RkOjpzdHJpbmcgdmFsdWUyKHZhbHVlKSwgcHJlZml4OworCisgIHN0cmluZzo6c2l6ZV90eXBlIGRvdF9wb3MgPSB2YWx1ZS5yZmluZCgnLicpOworICBpZiAoZG90X3BvcyAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICBwcmVmaXggPSB2YWx1ZS5zdWJzdHIoMCwgZG90X3BvcyArIDEpICsgcHJlZml4OworICAgIHZhbHVlMiA9IHZhbHVlLnN1YnN0cihkb3RfcG9zICsgMSk7CisgIH0KKworICBpZiAoIWlzdXBwZXIodmFsdWUyWzBdKSkgeworICAgIHZhbHVlMlswXSA9IHRvdXBwZXIodmFsdWUyWzBdKTsKKyAgfQorCisgIHZhbHVlMiA9IGNhbWVsY2FzZSh2YWx1ZTIpOworCisgIC8vIGZpbmFsIGxlbmd0aCBiZWZvcmUgZnVydGhlciBjaGVja3MsIHRoZSBzdHJpbmcgbWF5IGJlY29tZSBsb25nZXIKKyAgc2l6ZV90IGxlbl9iZWZvcmUgPSB2YWx1ZTIubGVuZ3RoKCk7CisKKyAgLy8gSURMIGlkZW50aWZpZXJzIG1heSBzdGFydCB3aXRoICJOZXciIHdoaWNoIGludGVyZmVyZXMgd2l0aCB0aGUgQ1RPUiBwYXR0ZXJuCisgIC8vIEFkZGluZyBhbiBleHRyYSB1bmRlcnNjb3JlIHRvIGFsbCB0aG9zZSBpZGVudGlmaWVycyBzb2x2ZXMgdGhpcworICBpZiAoKGxlbl9iZWZvcmUgPj0gMykgJiYgKHZhbHVlMi5zdWJzdHIoMCwgMykgPT0gIk5ldyIpKSB7CisgICAgdmFsdWUyICs9ICdfJzsKKyAgfQorCisgIC8vIElETCBpZGVudGlmaWVycyBtYXkgZW5kIHdpdGggIkFyZ3MiLyJSZXN1bHQiIHdoaWNoIGludGVyZmVyZXMgd2l0aCB0aGUgaW1wbGljaXQgc2VydmljZQorICAvLyBmdW5jdGlvbiBzdHJ1Y3RzCisgIC8vIEFkZGluZyBhbm90aGVyIGV4dHJhIHVuZGVyc2NvcmUgdG8gYWxsIHRob3NlIGlkZW50aWZpZXJzIHNvbHZlcyB0aGlzCisgIC8vIFN1cHByZXNzIHRoaXMgY2hlY2sgZm9yIHRoZSBhY3R1YWwgaGVscGVyIHN0cnVjdCBuYW1lcworICBpZiAoIWlzX2FyZ3Nfb3JfcmVzdWx0KSB7CisgICAgYm9vbCBlbmRzX3dpdGhfYXJncyA9IChsZW5fYmVmb3JlID49IDQpICYmICh2YWx1ZTIuc3Vic3RyKGxlbl9iZWZvcmUgLSA0LCA0KSA9PSAiQXJncyIpOworICAgIGJvb2wgZW5kc193aXRoX3JzbHQgPSAobGVuX2JlZm9yZSA+PSA2KSAmJiAodmFsdWUyLnN1YnN0cihsZW5fYmVmb3JlIC0gNiwgNikgPT0gIlJlc3VsdCIpOworICAgIGlmIChlbmRzX3dpdGhfYXJncyB8fCBlbmRzX3dpdGhfcnNsdCkgeworICAgICAgdmFsdWUyICs9ICdfJzsKKyAgICB9CisgIH0KKworICAvLyBBdm9pZCBuYW1pbmcgY29sbGlzaW9ucyB3aXRoIG90aGVyIHNlcnZpY2VzCisgIGlmIChpc19hcmdzX29yX3Jlc3VsdCkgeworICAgIHByZWZpeCArPSBwdWJsaWNpemUoc2VydmljZV9uYW1lXyk7CisgIH0KKworICByZXR1cm4gcHJlZml4ICsgdmFsdWUyOworfQorCitzdGQ6OnN0cmluZyB0X2dvX2dlbmVyYXRvcjo6bmV3X3ByZWZpeChjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIGNvbnN0IHsKKyAgaWYgKHZhbHVlLnNpemUoKSA8PSAwKSB7CisgICAgcmV0dXJuIHZhbHVlOworICB9CisKKyAgc3RyaW5nOjpzaXplX3R5cGUgZG90X3BvcyA9IHZhbHVlLnJmaW5kKCcuJyk7CisgIGlmIChkb3RfcG9zICE9IHN0cmluZzo6bnBvcykgeworICAgIHJldHVybiB2YWx1ZS5zdWJzdHIoMCwgZG90X3BvcyArIDEpICsgIk5ldyIgKyBwdWJsaWNpemUodmFsdWUuc3Vic3RyKGRvdF9wb3MgKyAxKSk7CisgIH0KKyAgcmV0dXJuICJOZXciICsgcHVibGljaXplKHZhbHVlKTsKK30KKworc3RkOjpzdHJpbmcgdF9nb19nZW5lcmF0b3I6OnByaXZhdGl6ZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIGNvbnN0IHsKKyAgaWYgKHZhbHVlLnNpemUoKSA8PSAwKSB7CisgICAgcmV0dXJuIHZhbHVlOworICB9CisKKyAgc3RkOjpzdHJpbmcgdmFsdWUyKHZhbHVlKTsKKworICBpZiAoIWlzbG93ZXIodmFsdWUyWzBdKSkgeworICAgIHZhbHVlMlswXSA9IHRvbG93ZXIodmFsdWUyWzBdKTsKKyAgfQorCisgIHZhbHVlMiA9IGNhbWVsY2FzZSh2YWx1ZTIpOworCisgIHJldHVybiB2YWx1ZTI7Cit9CisKK3N0ZDo6c3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjp2YXJpYWJsZV9uYW1lX3RvX2dvX25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIGlmICh2YWx1ZS5zaXplKCkgPD0gMCkgeworICAgIHJldHVybiB2YWx1ZTsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIHZhbHVlMih2YWx1ZSk7CisgIHN0ZDo6dHJhbnNmb3JtKHZhbHVlMi5iZWdpbigpLCB2YWx1ZTIuZW5kKCksIHZhbHVlMi5iZWdpbigpLCA6OnRvbG93ZXIpOworCisgIHN3aXRjaCAodmFsdWVbMF0pIHsKKyAgY2FzZSAnYic6CisgIGNhc2UgJ0InOgorICAgIGlmICh2YWx1ZTIgIT0gImJyZWFrIikgeworICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIGJyZWFrOworCisgIGNhc2UgJ2MnOgorICBjYXNlICdDJzoKKyAgICBpZiAodmFsdWUyICE9ICJjYXNlIiAmJiB2YWx1ZTIgIT0gImNoYW4iICYmIHZhbHVlMiAhPSAiY29uc3QiICYmIHZhbHVlMiAhPSAiY29udGludWUiKSB7CisgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgYnJlYWs7CisKKyAgY2FzZSAnZCc6CisgIGNhc2UgJ0QnOgorICAgIGlmICh2YWx1ZTIgIT0gImRlZmF1bHQiICYmIHZhbHVlMiAhPSAiZGVmZXIiKSB7CisgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgYnJlYWs7CisKKyAgY2FzZSAnZSc6CisgIGNhc2UgJ0UnOgorICAgIGlmICh2YWx1ZTIgIT0gImVsc2UiICYmIHZhbHVlMiAhPSAiZXJyb3IiKSB7CisgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgYnJlYWs7CisKKyAgY2FzZSAnZic6CisgIGNhc2UgJ0YnOgorICAgIGlmICh2YWx1ZTIgIT0gImZhbGx0aHJvdWdoIiAmJiB2YWx1ZTIgIT0gImZvciIgJiYgdmFsdWUyICE9ICJmdW5jIikgeworICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIGJyZWFrOworCisgIGNhc2UgJ2cnOgorICBjYXNlICdHJzoKKyAgICBpZiAodmFsdWUyICE9ICJnbyIgJiYgdmFsdWUyICE9ICJnb3RvIikgeworICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIGJyZWFrOworCisgIGNhc2UgJ2knOgorICBjYXNlICdJJzoKKyAgICBpZiAodmFsdWUyICE9ICJpZiIgJiYgdmFsdWUyICE9ICJpbXBvcnQiICYmIHZhbHVlMiAhPSAiaW50ZXJmYWNlIikgeworICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIGJyZWFrOworCisgIGNhc2UgJ20nOgorICBjYXNlICdNJzoKKyAgICBpZiAodmFsdWUyICE9ICJtYXAiKSB7CisgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgYnJlYWs7CisKKyAgY2FzZSAncCc6CisgIGNhc2UgJ1AnOgorICAgIGlmICh2YWx1ZTIgIT0gInBhY2thZ2UiKSB7CisgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgYnJlYWs7CisKKyAgY2FzZSAncic6CisgIGNhc2UgJ1InOgorICAgIGlmICh2YWx1ZTIgIT0gInJhbmdlIiAmJiB2YWx1ZTIgIT0gInJldHVybiIpIHsKKyAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICBicmVhazsKKworICBjYXNlICdzJzoKKyAgY2FzZSAnUyc6CisgICAgaWYgKHZhbHVlMiAhPSAic2VsZWN0IiAmJiB2YWx1ZTIgIT0gInN0cnVjdCIgJiYgdmFsdWUyICE9ICJzd2l0Y2giKSB7CisgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgYnJlYWs7CisKKyAgY2FzZSAndCc6CisgIGNhc2UgJ1QnOgorICAgIGlmICh2YWx1ZTIgIT0gInR5cGUiKSB7CisgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgYnJlYWs7CisKKyAgY2FzZSAndic6CisgIGNhc2UgJ1YnOgorICAgIGlmICh2YWx1ZTIgIT0gInZhciIpIHsKKyAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICBicmVhazsKKworICBkZWZhdWx0OgorICAgIHJldHVybiB2YWx1ZTsKKyAgfQorCisgIHJldHVybiB2YWx1ZTIgKyAiX2ExIjsKK30KKworLyoqCisgKiBQcmVwYXJlcyBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAorICogc3RyZWFtcy4KKyAqCisgKiBAcGFyYW0gdHByb2dyYW0gVGhlIHByb2dyYW0gdG8gZ2VuZXJhdGUKKyAqLwordm9pZCB0X2dvX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7CisgIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQorICBzdHJpbmcgbW9kdWxlID0gZ2V0X3JlYWxfZ29fbW9kdWxlKHByb2dyYW1fKTsKKyAgc3RyaW5nIHRhcmdldCA9IG1vZHVsZTsKKyAgcGFja2FnZV9kaXJfID0gZ2V0X291dF9kaXIoKTsKKworICAvLyBUaGlzIHNldCBpcyB0YWtlbiBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9nb2xhbmcvbGludC9ibG9iL21hc3Rlci9saW50LmdvI0w2OTIKKyAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJBUEkiKTsKKyAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJBU0NJSSIpOworICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIkNQVSIpOworICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIkNTUyIpOworICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIkROUyIpOworICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIkVPRiIpOworICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIkdVSUQiKTsKKyAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJIVE1MIik7CisgIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiSFRUUCIpOworICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIkhUVFBTIik7CisgIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiSUQiKTsKKyAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJJUCIpOworICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIkpTT04iKTsKKyAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJMSFMiKTsKKyAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJRUFMiKTsKKyAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJSQU0iKTsKKyAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJSSFMiKTsKKyAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJSUEMiKTsKKyAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJTTEEiKTsKKyAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJTTVRQIik7CisgIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiU1NIIik7CisgIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiVENQIik7CisgIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiVExTIik7CisgIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiVFRMIik7CisgIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiVURQIik7CisgIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiVUkiKTsKKyAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJVSUQiKTsKKyAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJVVUlEIik7CisgIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiVVJJIik7CisgIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiVVJMIik7CisgIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiVVRGOCIpOworICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIlZNIik7CisgIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiWE1MIik7CisgIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiWFNSRiIpOworICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIlhTUyIpOworCisgIC8vIG5hbWVzIG9mIHJlYWQgYW5kIHdyaXRlIG1ldGhvZHMKKyAgaWYgKHJlYWRfd3JpdGVfcHJpdmF0ZV8pIHsKKyAgICByZWFkX21ldGhvZF9uYW1lXyA9ICJyZWFkIjsKKyAgICB3cml0ZV9tZXRob2RfbmFtZV8gPSAid3JpdGUiOworICB9IGVsc2UgeworICAgIHJlYWRfbWV0aG9kX25hbWVfID0gIlJlYWQiOworICAgIHdyaXRlX21ldGhvZF9uYW1lXyA9ICJXcml0ZSI7CisgIH0KKworICB3aGlsZSAodHJ1ZSkgeworICAgIC8vIFRPRE86IERvIGJldHRlciBlcnJvciBjaGVja2luZyBoZXJlLgorICAgIE1LRElSKHBhY2thZ2VfZGlyXy5jX3N0cigpKTsKKworICAgIGlmIChtb2R1bGUuZW1wdHkoKSkgeworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgc3RyaW5nOjpzaXplX3R5cGUgcG9zID0gbW9kdWxlLmZpbmQoJy4nKTsKKworICAgIGlmIChwb3MgPT0gc3RyaW5nOjpucG9zKSB7CisgICAgICBwYWNrYWdlX2Rpcl8gKz0gIi8iOworICAgICAgcGFja2FnZV9kaXJfICs9IG1vZHVsZTsKKyAgICAgIHBhY2thZ2VfbmFtZV8gPSBtb2R1bGU7CisgICAgICBtb2R1bGUuY2xlYXIoKTsKKyAgICB9IGVsc2UgeworICAgICAgcGFja2FnZV9kaXJfICs9ICIvIjsKKyAgICAgIHBhY2thZ2VfZGlyXyArPSBtb2R1bGUuc3Vic3RyKDAsIHBvcyk7CisgICAgICBtb2R1bGUuZXJhc2UoMCwgcG9zICsgMSk7CisgICAgfQorICB9CisKKyAgc3RyaW5nOjpzaXplX3R5cGUgbG9jOworCisgIHdoaWxlICgobG9jID0gdGFyZ2V0LmZpbmQoIi4iKSkgIT0gc3RyaW5nOjpucG9zKSB7CisgICAgdGFyZ2V0LnJlcGxhY2UobG9jLCAxLCAxLCAnLycpOworICB9CisKKyAgLy8gTWFrZSBvdXRwdXQgZmlsZXMKKyAgZl90eXBlc19uYW1lXyA9IHBhY2thZ2VfZGlyXyArICIvIiArIHByb2dyYW1fbmFtZV8gKyAiLmdvIjsKKyAgZl90eXBlc18ub3BlbihmX3R5cGVzX25hbWVfLmNfc3RyKCkpOworCisgIGZfY29uc3RzX25hbWVfID0gcGFja2FnZV9kaXJfICsgIi8iICsgcHJvZ3JhbV9uYW1lXyArICItY29uc3RzLmdvIjsKKyAgZl9jb25zdHNfLm9wZW4oZl9jb25zdHNfbmFtZV8uY19zdHIoKSk7CisKKyAgLy8gUHJpbnQgaGVhZGVyCisgIGZfdHlwZXNfIDw8IGdvX2F1dG9nZW5fY29tbWVudCgpIDw8IGdvX3BhY2thZ2UoKSA8PCByZW5kZXJfaW5jbHVkZXMoZmFsc2UpOworCisgIGZfY29uc3RzXyA8PCBnb19hdXRvZ2VuX2NvbW1lbnQoKSA8PCBnb19wYWNrYWdlKCkgPDwgcmVuZGVyX2luY2x1ZGVzKHRydWUpOworCisgIGZfY29uc3RfdmFsdWVzXyA8PCBlbmRsIDw8ICJmdW5jIGluaXQoKSB7IiA8PCBlbmRsOworCisgIC8vIENyZWF0ZSBmaWxlIGZvciB0aGUgR29VbnVzZWRQcm90ZWN0aW9uX18gdmFyaWFibGUKKyAgc3RyaW5nIGZfdW51c2VkX3Byb3RfbmFtZV8gPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyAiR29VbnVzZWRQcm90ZWN0aW9uX18uZ28iOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfdW51c2VkX3Byb3RfOworICBmX3VudXNlZF9wcm90Xy5vcGVuKGZfdW51c2VkX3Byb3RfbmFtZV8uY19zdHIoKSk7CisgIGZfdW51c2VkX3Byb3RfIDw8IGdvX2F1dG9nZW5fY29tbWVudCgpIDw8IGdvX3BhY2thZ2UoKSA8PCByZW5kZXJfaW1wb3J0X3Byb3RlY3Rpb24oKTsKKyAgZl91bnVzZWRfcHJvdF8uY2xvc2UoKTsKK30KKworCitzdHJpbmcgdF9nb19nZW5lcmF0b3I6OnJlbmRlcl9pbmNsdWRlZF9wcm9ncmFtcyhzdHJpbmcmIHVudXNlZF9wcm90ZWN0aW9uKSB7CisgIGNvbnN0IHZlY3Rvcjx0X3Byb2dyYW0qPiYgaW5jbHVkZXMgPSBwcm9ncmFtXy0+Z2V0X2luY2x1ZGVzKCk7CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKworICB1bnVzZWRfcHJvdGVjdGlvbiA9ICIiOworCisgIHN0cmluZyBsb2NhbF9uYW1lc3BhY2UgPSBwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgiZ28iKTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmNsdWRlcy5zaXplKCk7ICsraSkgeworICAgIGlmICghbG9jYWxfbmFtZXNwYWNlLmVtcHR5KCkgJiYgbG9jYWxfbmFtZXNwYWNlID09IGluY2x1ZGVzW2ldLT5nZXRfbmFtZXNwYWNlKCJnbyIpKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBzdHJpbmcgZ29fbW9kdWxlID0gZ2V0X3JlYWxfZ29fbW9kdWxlKGluY2x1ZGVzW2ldKTsKKyAgICBzaXplX3QgZm91bmQgPSAwOworICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgZ29fbW9kdWxlLnNpemUoKTsgaisrKSB7CisgICAgICAvLyBJbXBvcnQgc3RhdGVtZW50IHVzZXMgc2xhc2hlcyAoJy8nKSBpbiBuYW1lc3BhY2UKKyAgICAgIGlmIChnb19tb2R1bGVbal0gPT0gJy4nKSB7CisgICAgICAgIGdvX21vZHVsZVtqXSA9ICcvJzsKKyAgICAgICAgZm91bmQgPSBqICsgMTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXN1bHQgKz0gIlx0XCIiICsgZ2VuX3BhY2thZ2VfcHJlZml4XyArIGdvX21vZHVsZSArICJcIlxuIjsKKyAgICB1bnVzZWRfcHJvdGVjdGlvbiArPSAidmFyIF8gPSAiICsgZ29fbW9kdWxlLnN1YnN0cihmb3VuZCkgKyAiLkdvVW51c2VkUHJvdGVjdGlvbl9fXG4iOworICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBSZW5kZXJzIGFsbCB0aGUgaW1wb3J0cyBuZWNlc3NhcnkgZm9yIGluY2x1ZGluZyBhbm90aGVyIFRocmlmdCBwcm9ncmFtLgorICogSWYgY29uc3RzIGluY2x1ZGUgdGhlIGFkZGl0aW9uYWwgaW1wb3J0cy4KKyAqLworc3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjpyZW5kZXJfaW5jbHVkZXMoYm9vbCBjb25zdHMpIHsKKyAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+JiBpbmNsdWRlcyA9IHByb2dyYW1fLT5nZXRfaW5jbHVkZXMoKTsKKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworICBzdHJpbmcgdW51c2VkX3Byb3QgPSAiIjsKKworICBzdHJpbmcgbG9jYWxfbmFtZXNwYWNlID0gcHJvZ3JhbV8tPmdldF9uYW1lc3BhY2UoImdvIik7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5jbHVkZXMuc2l6ZSgpOyArK2kpIHsKKyAgICBpZiAoIWxvY2FsX25hbWVzcGFjZS5lbXB0eSgpICYmIGxvY2FsX25hbWVzcGFjZSA9PSBpbmNsdWRlc1tpXS0+Z2V0X25hbWVzcGFjZSgiZ28iKSkgeworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgc3RyaW5nIGdvX21vZHVsZSA9IGdldF9yZWFsX2dvX21vZHVsZShpbmNsdWRlc1tpXSk7CisgICAgc2l6ZV90IGZvdW5kID0gMDsKKyAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGdvX21vZHVsZS5zaXplKCk7IGorKykgeworICAgICAgLy8gSW1wb3J0IHN0YXRlbWVudCB1c2VzIHNsYXNoZXMgKCcvJykgaW4gbmFtZXNwYWNlCisgICAgICBpZiAoZ29fbW9kdWxlW2pdID09ICcuJykgeworICAgICAgICBnb19tb2R1bGVbal0gPSAnLyc7CisgICAgICAgIGZvdW5kID0gaiArIDE7CisgICAgICB9CisgICAgfQorCisgICAgcmVzdWx0ICs9ICJcdFwiIiArIGdlbl9wYWNrYWdlX3ByZWZpeF8gKyBnb19tb2R1bGUgKyAiXCJcbiI7CisgICAgdW51c2VkX3Byb3QgKz0gInZhciBfID0gIiArIGdvX21vZHVsZS5zdWJzdHIoZm91bmQpICsgIi5Hb1VudXNlZFByb3RlY3Rpb25fX1xuIjsKKyAgfQorCisgIGlmIChpbmNsdWRlcy5zaXplKCkgPiAwKSB7CisgICAgcmVzdWx0ICs9ICJcbiI7CisgIH0KKworICByZXR1cm4gZ29faW1wb3J0c19iZWdpbihjb25zdHMpICsgcmVzdWx0ICsgZ29faW1wb3J0c19lbmQoKSArIHVudXNlZF9wcm90OworfQorCitzdHJpbmcgdF9nb19nZW5lcmF0b3I6OnJlbmRlcl9pbXBvcnRfcHJvdGVjdGlvbigpIHsKKyAgcmV0dXJuIHN0cmluZygidmFyIEdvVW51c2VkUHJvdGVjdGlvbl9fIGludDtcblxuIik7Cit9CisKKy8qKgorICogUmVuZGVycyBhbGwgdGhlIGltcG9ydHMgbmVjZXNzYXJ5IHRvIHVzZSB0aGUgYWNjZWxlcmF0ZWQgVEJpbmFyeVByb3RvY29sCisgKi8KK3N0cmluZyB0X2dvX2dlbmVyYXRvcjo6cmVuZGVyX2Zhc3RiaW5hcnlfaW5jbHVkZXMoKSB7CisgIHJldHVybiAiIjsKK30KKworLyoqCisgKiBBdXRvZ2VuJ2QgY29tbWVudAorICovCitzdHJpbmcgdF9nb19nZW5lcmF0b3I6OmdvX2F1dG9nZW5fY29tbWVudCgpIHsKKyAgcmV0dXJuCisgICAgICAgIHN0ZDo6c3RyaW5nKCkgKworICAgICAgICAiLy8gQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKCIgKyBUSFJJRlRfVkVSU0lPTiArICIpXG4iCisgICAgICAgICIvLyBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HXG5cbiI7Cit9CisKKy8qKgorICogUHJpbnRzIHN0YW5kYXJkIHRocmlmdCBwYWNrYWdlCisgKi8KK3N0cmluZyB0X2dvX2dlbmVyYXRvcjo6Z29fcGFja2FnZSgpIHsKKyAgcmV0dXJuIHN0cmluZygicGFja2FnZSAiKSArIHBhY2thZ2VfbmFtZV8gKyAiXG5cbiI7Cit9CisKKy8qKgorICogUmVuZGVyIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGltcG9ydCBzdGF0ZW1lbnQuCisgKiBJZiBjb25zdHMgaW5jbHVkZSB0aGUgYWRkaXRpb25hbCBpbXBvcnRzLgorICovCitzdHJpbmcgdF9nb19nZW5lcmF0b3I6OmdvX2ltcG9ydHNfYmVnaW4oYm9vbCBjb25zdHMpIHsKKyAgc3RyaW5nIGV4dHJhOworCisgIC8vIElmIG5vdCB3cml0aW5nIGNvbnN0YW50cywgYW5kIHRoZXJlIGFyZSBlbnVtcywgbmVlZCBleHRyYSBpbXBvcnRzLgorICBpZiAoIWNvbnN0cyAmJiBnZXRfcHJvZ3JhbSgpLT5nZXRfZW51bXMoKS5zaXplKCkgPiAwKSB7CisgICAgZXh0cmEgKz0KKyAgICAgICJcdFwiZGF0YWJhc2Uvc3FsL2RyaXZlclwiXG4iCisgICAgICAiXHRcImVycm9yc1wiXG4iOworICB9CisgIHJldHVybiBzdHJpbmcoCisgICAgICAiaW1wb3J0IChcbiIKKyAgICAgICJcdFwiYnl0ZXNcIlxuIgorICAgICAgIlx0XCJjb250ZXh0XCJcbiIKKyAgICAgICJcdFwicmVmbGVjdFwiXG4iCisgICAgICArIGV4dHJhICsKKyAgICAgICJcdFwiZm10XCJcbiIKKyAgICAgICJcdFwiIiArIGdlbl90aHJpZnRfaW1wb3J0XyArICJcIlxuIik7Cit9CisKKy8qKgorICogRW5kIHRoZSBpbXBvcnQgc3RhdGVtZW50LCBpbmNsdWRlIHVuZHNjb3JlLWFzc2lnbm1lbnRzCisgKgorICogVGhlc2UgIl8gPSIgcHJldmVudCB0aGUgZ28gY29tcGlsZXIgY29tcGxhaW5pbmcgYWJvdXQgdW51c2VkIGltcG9ydHMuCisgKiBUaGlzIHdpbGwgaGF2ZSB0byBkbyBpbiBsaWV1IG9mIG1vcmUgaW50ZWxsaWdlbnQgaW1wb3J0IHN0YXRlbWVudCBjb25zdHJ1Y3Rpb24KKyAqLworc3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjpnb19pbXBvcnRzX2VuZCgpIHsKKyAgcmV0dXJuIHN0cmluZygKKyAgICAgICIpXG5cbiIKKyAgICAgICIvLyAobmVlZGVkIHRvIGVuc3VyZSBzYWZldHkgYmVjYXVzZSBvZiBuYWl2ZSBpbXBvcnQgbGlzdCBjb25zdHJ1Y3Rpb24uKVxuIgorICAgICAgInZhciBfID0gdGhyaWZ0LlpFUk9cbiIKKyAgICAgICJ2YXIgXyA9IGZtdC5QcmludGZcbiIKKyAgICAgICJ2YXIgXyA9IGNvbnRleHQuQmFja2dyb3VuZFxuIgorICAgICAgInZhciBfID0gcmVmbGVjdC5EZWVwRXF1YWxcbiIKKyAgICAgICJ2YXIgXyA9IGJ5dGVzLkVxdWFsXG5cbiIpOworfQorCisvKioKKyAqIENsb3NlcyB0aGUgdHlwZSBmaWxlcworICovCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7CisgIGZfY29uc3RfdmFsdWVzXyA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICBmX2NvbnN0c18gPDwgZl9jb25zdF92YWx1ZXNfLnN0cigpOworCisgIC8vIENsb3NlIHR5cGVzIGFuZCBjb25zdGFudHMgZmlsZXMKKyAgZl9jb25zdHNfLmNsb3NlKCk7CisgIGZfdHlwZXNfLmNsb3NlKCk7CisgIGZvcm1hdF9nb19vdXRwdXQoZl90eXBlc19uYW1lXyk7CisgIGZvcm1hdF9nb19vdXRwdXQoZl9jb25zdHNfbmFtZV8pOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuCisgKgorICogQHBhcmFtIHR0eXBlZGVmIFRoZSB0eXBlIGRlZmluaXRpb24KKyAqLwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7CisgIGdlbmVyYXRlX2dvX2RvY3N0cmluZyhmX3R5cGVzXywgdHR5cGVkZWYpOworICBzdHJpbmcgbmV3X3R5cGVfbmFtZShwdWJsaWNpemUodHR5cGVkZWYtPmdldF9zeW1ib2xpYygpKSk7CisgIHN0cmluZyBiYXNlX3R5cGUodHlwZV90b19nb190eXBlKHR0eXBlZGVmLT5nZXRfdHlwZSgpKSk7CisKKyAgaWYgKGJhc2VfdHlwZSA9PSBuZXdfdHlwZV9uYW1lKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgZl90eXBlc18gPDwgInR5cGUgIiA8PCBuZXdfdHlwZV9uYW1lIDw8ICIgIiA8PCBiYXNlX3R5cGUgPDwgZW5kbCA8PCBlbmRsOworICAvLyBHZW5lcmF0ZSBhIGNvbnZlbmllbmNlIGZ1bmN0aW9uIHRoYXQgY29udmVydHMgYW4gaW5zdGFuY2Ugb2YgYSB0eXBlCisgIC8vICh3aGljaCBtYXkgYmUgYSBjb25zdGFudCkgaW50byBhIHBvaW50ZXIgdG8gYW4gaW5zdGFuY2Ugb2YgYSB0eXBlLgorICBmX3R5cGVzXyA8PCAiZnVuYyAiIDw8IG5ld190eXBlX25hbWUgPDwgIlB0cih2ICIgPDwgbmV3X3R5cGVfbmFtZSA8PCAiKSAqIiA8PCBuZXdfdHlwZV9uYW1lCisgICAgICAgICAgIDw8ICIgeyByZXR1cm4gJnYgfSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBjb2RlIGZvciBhbiBlbnVtZXJhdGVkIHR5cGUuIERvbmUgdXNpbmcgYSBjbGFzcyB0byBzY29wZQorICogdGhlIHZhbHVlcy4KKyAqCisgKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCisgKi8KK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gdG9fc3RyaW5nX21hcHBpbmcsIGZyb21fc3RyaW5nX21hcHBpbmc7CisgIHN0ZDo6c3RyaW5nIHRlbnVtX25hbWUocHVibGljaXplKHRlbnVtLT5nZXRfbmFtZSgpKSk7CisgIGdlbmVyYXRlX2dvX2RvY3N0cmluZyhmX3R5cGVzXywgdGVudW0pOworICBmX3R5cGVzXyA8PCAidHlwZSAiIDw8IHRlbnVtX25hbWUgPDwgIiBpbnQ2NCIgPDwgZW5kbCA8PCAiY29uc3QgKCIgPDwgZW5kbDsKKworICB0b19zdHJpbmdfbWFwcGluZyA8PCBpbmRlbnQoKSA8PCAiZnVuYyAocCAiIDw8IHRlbnVtX25hbWUgPDwgIikgU3RyaW5nKCkgc3RyaW5nIHsiIDw8IGVuZGw7CisgIHRvX3N0cmluZ19tYXBwaW5nIDw8IGluZGVudCgpIDw8ICIgIHN3aXRjaCBwIHsiIDw8IGVuZGw7CisKKyAgZnJvbV9zdHJpbmdfbWFwcGluZyA8PCBpbmRlbnQoKSA8PCAiZnVuYyAiIDw8IHRlbnVtX25hbWUgPDwgIkZyb21TdHJpbmcocyBzdHJpbmcpICgiIDw8IHRlbnVtX25hbWUKKyAgICAgICAgICAgICAgICAgICAgICA8PCAiLCBlcnJvcikgeyIgPDwgZW5kbDsKKyAgZnJvbV9zdHJpbmdfbWFwcGluZyA8PCBpbmRlbnQoKSA8PCAiICBzd2l0Y2ggcyB7IiA8PCBlbmRsOworCisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgaW50IHZhbHVlID0gLTE7CisKKyAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7CisKKyAgICBzdHJpbmcgaXRlcl9zdGRfbmFtZShlc2NhcGVfc3RyaW5nKCgqY19pdGVyKS0+Z2V0X25hbWUoKSkpOworICAgIHN0cmluZyBpdGVyX25hbWUoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICAiIDw8IHRlbnVtX25hbWUgPDwgIl8iIDw8IGl0ZXJfbmFtZSA8PCAnICcgPDwgdGVudW1fbmFtZSA8PCAiID0gIgorICAgICAgICAgICAgIDw8IHZhbHVlIDw8IGVuZGw7CisgICAgLy8gRGljdGlvbmFyaWVzIHRvL2Zyb20gc3RyaW5nIG5hbWVzIG9mIGVudW1zCisgICAgdG9fc3RyaW5nX21hcHBpbmcgPDwgaW5kZW50KCkgPDwgIiAgY2FzZSAiIDw8IHRlbnVtX25hbWUgPDwgIl8iIDw8IGl0ZXJfbmFtZSA8PCAiOiByZXR1cm4gXCIiCisgICAgICAgICAgICAgICAgICAgICAgPDwgaXRlcl9zdGRfbmFtZSA8PCAiXCIiIDw8IGVuZGw7CisKKyAgICBpZiAoaXRlcl9zdGRfbmFtZSAhPSBlc2NhcGVfc3RyaW5nKGl0ZXJfbmFtZSkpIHsKKyAgICAgIGZyb21fc3RyaW5nX21hcHBpbmcgPDwgaW5kZW50KCkgPDwgIiAgY2FzZSBcIiIgPDwgaXRlcl9zdGRfbmFtZSA8PCAiXCIsIFwiIgorICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlc2NhcGVfc3RyaW5nKGl0ZXJfbmFtZSkgPDwgIlwiOiByZXR1cm4gIiA8PCB0ZW51bV9uYW1lIDw8ICJfIgorICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBpdGVyX25hbWUgPDwgIiwgbmlsICIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgZnJvbV9zdHJpbmdfbWFwcGluZyA8PCBpbmRlbnQoKSA8PCAiICBjYXNlIFwiIiA8PCBpdGVyX3N0ZF9uYW1lIDw8ICJcIjogcmV0dXJuICIgPDwgdGVudW1fbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiXyIgPDwgaXRlcl9uYW1lIDw8ICIsIG5pbCAiIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgdG9fc3RyaW5nX21hcHBpbmcgPDwgaW5kZW50KCkgPDwgIiAgfSIgPDwgZW5kbDsKKyAgdG9fc3RyaW5nX21hcHBpbmcgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIFwiPFVOU0VUPlwiIiA8PCBlbmRsOworICB0b19zdHJpbmdfbWFwcGluZyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgZnJvbV9zdHJpbmdfbWFwcGluZyA8PCBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsOworICBmcm9tX3N0cmluZ19tYXBwaW5nIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IHRlbnVtX25hbWUgPDwgIigwKSwiCisgICAgICAgICAgICAgICAgICAgICAgPDwgIiBmbXQuRXJyb3JmKFwibm90IGEgdmFsaWQgIiA8PCB0ZW51bV9uYW1lIDw8ICIgc3RyaW5nXCIpIiA8PCBlbmRsOworICBmcm9tX3N0cmluZ19tYXBwaW5nIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgIGZfdHlwZXNfIDw8ICIpIiA8PCBlbmRsIDw8IGVuZGwgPDwgdG9fc3RyaW5nX21hcHBpbmcuc3RyKCkgPDwgZW5kbCA8PCBmcm9tX3N0cmluZ19tYXBwaW5nLnN0cigpCisgICAgICAgICAgIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSBhIGNvbnZlbmllbmNlIGZ1bmN0aW9uIHRoYXQgY29udmVydHMgYW4gaW5zdGFuY2Ugb2YgYW4gZW51bQorICAvLyAod2hpY2ggbWF5IGJlIGEgY29uc3RhbnQpIGludG8gYSBwb2ludGVyIHRvIGFuIGluc3RhbmNlIG9mIHRoYXQgZW51bQorICAvLyB0eXBlLgorICBmX3R5cGVzXyA8PCAiZnVuYyAiIDw8IHRlbnVtX25hbWUgPDwgIlB0cih2ICIgPDwgdGVudW1fbmFtZSA8PCAiKSAqIiA8PCB0ZW51bV9uYW1lCisgICAgICAgICAgIDw8ICIgeyByZXR1cm4gJnYgfSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIE1hcnNoYWxUZXh0CisgIGZfdHlwZXNfIDw8ICJmdW5jIChwICIgPDwgdGVudW1fbmFtZSA8PCAiKSBNYXJzaGFsVGV4dCgpIChbXWJ5dGUsIGVycm9yKSB7IiA8PCBlbmRsOworICBmX3R5cGVzXyA8PCAicmV0dXJuIFtdYnl0ZShwLlN0cmluZygpKSwgbmlsIiA8PCBlbmRsOworICBmX3R5cGVzXyA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIFVubWFyc2hhbFRleHQKKyAgZl90eXBlc18gPDwgImZ1bmMgKHAgKiIgPDwgdGVudW1fbmFtZSA8PCAiKSBVbm1hcnNoYWxUZXh0KHRleHQgW11ieXRlKSBlcnJvciB7IiA8PCBlbmRsOworICBmX3R5cGVzXyA8PCAicSwgZXJyIDo9ICIgPDwgdGVudW1fbmFtZSA8PCAiRnJvbVN0cmluZyhzdHJpbmcodGV4dCkpIiA8PCBlbmRsOworICBmX3R5cGVzXyA8PCAiaWYgKGVyciAhPSBuaWwpIHsiIDw8IGVuZGwgPDwgInJldHVybiBlcnIiIDw8IGVuZGwgPDwgIn0iIDw8IGVuZGw7CisgIGZfdHlwZXNfIDw8ICIqcCA9IHEiIDw8IGVuZGw7CisgIGZfdHlwZXNfIDw8ICJyZXR1cm4gbmlsIiA8PCBlbmRsOworICBmX3R5cGVzXyA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIFNjYW4gZm9yIHNxbC5TY2FubmVyIGludGVyZmFjZQorICBmX3R5cGVzXyA8PCAiZnVuYyAocCAqIiA8PCB0ZW51bV9uYW1lIDw8ICIpIFNjYW4odmFsdWUgaW50ZXJmYWNle30pIGVycm9yIHsiIDw8ZW5kbDsKKyAgZl90eXBlc18gPDwgInYsIG9rIDo9IHZhbHVlLihpbnQ2NCkiIDw8ZW5kbDsKKyAgZl90eXBlc18gPDwgImlmICFvayB7IiA8PGVuZGw7CisgIGZfdHlwZXNfIDw8ICJyZXR1cm4gZXJyb3JzLk5ldyhcIlNjYW4gdmFsdWUgaXMgbm90IGludDY0XCIpIiA8PGVuZGw7CisgIGZfdHlwZXNfIDw8ICJ9IiA8PGVuZGw7CisgIGZfdHlwZXNfIDw8ICIqcCA9ICIgPDwgdGVudW1fbmFtZSA8PCAiKHYpIiA8PCBlbmRsOworICBmX3R5cGVzXyA8PCAicmV0dXJuIG5pbCIgPDwgZW5kbDsKKyAgZl90eXBlc18gPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSBWYWx1ZSBmb3IgZHJpdmVyLlZhbHVlciBpbnRlcmZhY2UKKyAgZl90eXBlc18gPDwgImZ1bmMgKHAgKiAiIDw8IHRlbnVtX25hbWUgPDwgIikgVmFsdWUoKSAoZHJpdmVyLlZhbHVlLCBlcnJvcikgeyIgPDxlbmRsOworICBmX3R5cGVzXyA8PCAiICBpZiBwID09IG5pbCB7IiA8PCBlbmRsOworICBmX3R5cGVzXyA8PCAiICAgIHJldHVybiBuaWwsIG5pbCIgPDwgZW5kbDsKKyAgZl90eXBlc18gPDwgIiAgfSIgPDwgZW5kbDsKKyAgZl90eXBlc18gPDwgInJldHVybiBpbnQ2NCgqcCksIG5pbCIgPDwgZW5kbDsKKyAgZl90eXBlc18gPDwgIn0iIDw8IGVuZGw7CisKK30KKworLyoqCisgKiBHZW5lcmF0ZSBhIGNvbnN0YW50IHZhbHVlCisgKi8KK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCkgeworICB0X3R5cGUqIHR5cGUgPSB0Y29uc3QtPmdldF90eXBlKCk7CisgIHN0cmluZyBuYW1lID0gcHVibGljaXplKHRjb25zdC0+Z2V0X25hbWUoKSk7CisgIHRfY29uc3RfdmFsdWUqIHZhbHVlID0gdGNvbnN0LT5nZXRfdmFsdWUoKTsKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgeworICAgIGluZGVudChmX2NvbnN0c18pIDw8ICJjb25zdCAiIDw8IG5hbWUgPDwgIiA9ICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHR5cGUsIHZhbHVlLCBuYW1lKSA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGZfY29uc3RfdmFsdWVzXyA8PCBpbmRlbnQoKSA8PCBuYW1lIDw8ICIgPSAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0eXBlLCB2YWx1ZSwgbmFtZSkgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworCisgICAgZl9jb25zdHNfIDw8IGluZGVudCgpIDw8ICJ2YXIgIiA8PCBuYW1lIDw8ICIgIiA8PCB0eXBlX3RvX2dvX3R5cGUodHlwZSkgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIFByaW50cyB0aGUgdmFsdWUgb2YgYSBjb25zdGFudCB3aXRoIHRoZSBnaXZlbiB0eXBlLiBOb3RlIHRoYXQgdHlwZSBjaGVja2luZworICogaXMgTk9UIHBlcmZvcm1lZCBpbiB0aGlzIGZ1bmN0aW9uIGFzIGl0IGlzIGFsd2F5cyBydW4gYmVmb3JlaGFuZCB1c2luZyB0aGUKKyAqIHZhbGlkYXRlX3R5cGVzIG1ldGhvZCBpbiBtYWluLmNjCisgKi8KK3N0cmluZyB0X2dvX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUsIGNvbnN0IHN0cmluZyYgbmFtZSwgYm9vbCBvcHQpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworCisgICAgaWYgKG9wdCkgeworICAgICAgb3V0IDw8ICImKCZzdHJ1Y3R7eCAiOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgICAgb3V0IDw8ICJib29sfXsiOworICAgICAgICAgIG91dCA8PCAodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwID8gInRydWUiIDogImZhbHNlIik7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgICBvdXQgPDwgImludDh9eyI7CisgICAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgICBvdXQgPDwgImludDE2fXsiOworICAgICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgICAgb3V0IDw8ICJpbnQzMn17IjsKKyAgICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICAgIG91dCA8PCAiaW50NjR9eyI7CisgICAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICAgIG91dCA8PCAiZmxvYXQ2NH17IjsKKyAgICAgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgeworICAgICAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgICAgb3V0IDw8ICJzdHJpbmd9eyI7CisgICAgICAgICAgb3V0IDw8ICciJyArIGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgKyAnIic7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgIH0KKyAgICAgIG91dCA8PCAifSkueCI7CisgICAgfSBlbHNlIHsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgICAgICBvdXQgPDwgIltdYnl0ZShcIiIgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAiXCIpIjsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb3V0IDw8ICciJyA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICciJzsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgICAgb3V0IDw8ICh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDAgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICAgIGlmIChvcHQpIHsKKyAgICAgICAgICAgIG91dCA8PCAiJigmc3RydWN0e3ggaW50fXsiOworICAgICAgICAgIH0KKyAgICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICAgICAgaWYgKG9wdCkgeworICAgICAgICAgICAgb3V0IDw8ICJ9KS54IjsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKKyAgICAgICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7CisgICAgICAgICAgfQorCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIG91dCA8PCAiJiIgPDwgcHVibGljaXplKHR5cGVfbmFtZSh0eXBlKSkgPDwgInsiOworICAgIGluZGVudF91cCgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworCisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7CisgICAgICBib29sIGlzX29wdGlvbmFsID0gZmFsc2U7CisgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgeworICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgICAgICAgaXNfb3B0aW9uYWwgPSBpc19wb2ludGVyX2ZpZWxkKCpmX2l0ZXIpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKKyAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKKyAgICAgIH0KKyAgICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8IHB1YmxpY2l6ZSh2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIDw8ICI6ICIKKyAgICAgICAgICA8PCByZW5kZXJfY29uc3RfdmFsdWUoZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQsIG5hbWUsIGlzX29wdGlvbmFsKSA8PCAiLCIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCAifSI7CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBvdXQgPDwgIm1hcFsiIDw8IHR5cGVfdG9fZ29fdHlwZShrdHlwZSkgPDwgIl0iIDw8IHR5cGVfdG9fZ29fdHlwZSh2dHlwZSkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGt0eXBlLCB2X2l0ZXItPmZpcnN0LCBuYW1lKSA8PCAiOiAiCisgICAgICAgICAgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHZ0eXBlLCB2X2l0ZXItPnNlY29uZCwgbmFtZSkgPDwgIiwiIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICBvdXQgPDwgIltdIiA8PCB0eXBlX3RvX2dvX3R5cGUoZXR5cGUpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGV0eXBlLCAqdl9pdGVyLCBuYW1lKSA8PCAiLCAiOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOworICAgIG91dCA8PCAiW10iIDw8IHR5cGVfdG9fZ29fa2V5X3R5cGUoZXR5cGUpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGV0eXBlLCAqdl9pdGVyLCBuYW1lKSA8PCAiLCAiOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IjsKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIENPTlNUQU5UIEZPUiBUWVBFOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKKyAgfQorCisgIHJldHVybiBvdXQuc3RyKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgZ28gc3RydWN0CisgKi8KK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBnZW5lcmF0ZV9nb19zdHJ1Y3QodHN0cnVjdCwgZmFsc2UpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBleGNlcHRpb24uIEJhc2ljYWxseSB0aGUgc2FtZQorICogYXMgYSBzdHJ1Y3QgYnV0IGV4dGVuZHMgdGhlIEV4Y2VwdGlvbiBjbGFzcy4KKyAqCisgKiBAcGFyYW0gdHhjZXB0aW9uIFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7CisgIGdlbmVyYXRlX2dvX3N0cnVjdCh0eGNlcHRpb24sIHRydWUpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGdvIHN0cnVjdAorICovCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nb19zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisgIGdlbmVyYXRlX2dvX3N0cnVjdF9kZWZpbml0aW9uKGZfdHlwZXNfLCB0c3RydWN0LCBpc19leGNlcHRpb24pOworfQorCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZXRfcHVibGljaXplZF9uYW1lX2FuZF9kZWZfdmFsdWUodF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyogT1VUX3B1Yl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqKiBPVVRfZGVmX3ZhbHVlKSBjb25zdCB7CisgIGNvbnN0IHN0cmluZyBiYXNlX2ZpZWxkX25hbWUgPSB0ZmllbGQtPmdldF9uYW1lKCk7CisgIGNvbnN0IHN0cmluZyBlc2NhcGVkX2ZpZWxkX25hbWUgPSBlc2NhcGVfc3RyaW5nKGJhc2VfZmllbGRfbmFtZSk7CisgICpPVVRfcHViX25hbWUgPSBwdWJsaWNpemUoZXNjYXBlZF9maWVsZF9uYW1lKTsKKyAgKk9VVF9kZWZfdmFsdWUgPSB0ZmllbGQtPmdldF92YWx1ZSgpOworfQorCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nb19zdHJ1Y3RfaW5pdGlhbGl6ZXIob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfYXJnc19vcl9yZXN1bHQpIHsKKyAgb3V0IDw8IHB1YmxpY2l6ZSh0eXBlX25hbWUodHN0cnVjdCksIGlzX2FyZ3Nfb3JfcmVzdWx0KSA8PCAieyI7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICBmb3IgKHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7CisgICAgICAgKyttX2l0ZXIpIHsKKyAgICBib29sIHBvaW50ZXJfZmllbGQgPSBpc19wb2ludGVyX2ZpZWxkKCptX2l0ZXIpOworICAgIHN0cmluZyBwdWJsaWNpemVkX25hbWU7CisgICAgdF9jb25zdF92YWx1ZSogZGVmX3ZhbHVlOworICAgIGdldF9wdWJsaWNpemVkX25hbWVfYW5kX2RlZl92YWx1ZSgqbV9pdGVyLCAmcHVibGljaXplZF9uYW1lLCAmZGVmX3ZhbHVlKTsKKyAgICBpZiAoIXBvaW50ZXJfZmllbGQgJiYgZGVmX3ZhbHVlICE9IE5VTEwgJiYgIW9taXRfaW5pdGlhbGl6YXRpb24oKm1faXRlcikpIHsKKyAgICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8IHB1YmxpY2l6ZWRfbmFtZSA8PCAiOiAiCisgICAgICAgICAgPDwgcmVuZGVyX2ZpZWxkX2luaXRpYWxfdmFsdWUoKm1faXRlciwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpLCBwb2ludGVyX2ZpZWxkKSA8PCAiLCIKKyAgICAgICAgICA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIG91dCA8PCAifSIgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZGF0YSB0eXBlLgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nb19zdHJ1Y3RfZGVmaW5pdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2FyZ3MpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIHNvcnRlZF9tZW1iZXJzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBzdGQ6OnN0cmluZyB0c3RydWN0X25hbWUocHVibGljaXplKHRzdHJ1Y3QtPmdldF9uYW1lKCksIGlzX2FyZ3MgfHwgaXNfcmVzdWx0KSk7CisgIGdlbmVyYXRlX2dvX2RvY3N0cmluZyhvdXQsIHRzdHJ1Y3QpOworICBvdXQgPDwgaW5kZW50KCkgPDwgInR5cGUgIiA8PCB0c3RydWN0X25hbWUgPDwgIiBzdHJ1Y3QgeyIgPDwgZW5kbDsKKyAgLyoKKyAgICAgSGVyZSB3ZSBnZW5lcmF0ZSB0aGUgc3RydWN0dXJlIHNwZWNpZmljYXRpb24gZm9yIHRoZSBmYXN0YmluYXJ5IGNvZGVjLgorICAgICBUaGVzZSBzcGVjaWZpY2F0aW9ucyBoYXZlIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlOgorICAgICB0aHJpZnRfc3BlYyAtPiB0dXBsZSBvZiBpdGVtX3NwZWMKKyAgICAgaXRlbV9zcGVjIC0+IG5pbCB8ICh0YWcsIHR5cGVfZW51bSwgbmFtZSwgc3BlY19hcmdzLCBkZWZhdWx0KQorICAgICB0YWcgLT4gaW50ZWdlcgorICAgICB0eXBlX2VudW0gLT4gVFR5cGUuSTMyIHwgVFR5cGUuU1RSSU5HIHwgVFR5cGUuU1RSVUNUIHwgLi4uCisgICAgIG5hbWUgLT4gc3RyaW5nX2xpdGVyYWwKKyAgICAgZGVmYXVsdCAtPiBuaWwgICMgSGFuZGxlZCBieSBfX2luaXRfXworICAgICBzcGVjX2FyZ3MgLT4gbmlsICAjIEZvciBzaW1wbGUgdHlwZXMKKyAgICAgICAgICAgICAgICB8ICh0eXBlX2VudW0sIHNwZWNfYXJncykgICMgVmFsdWUgdHlwZSBmb3IgbGlzdC9zZXQKKyAgICAgICAgICAgICAgICB8ICh0eXBlX2VudW0sIHNwZWNfYXJncywgdHlwZV9lbnVtLCBzcGVjX2FyZ3MpCisgICAgICAgICAgICAgICAgICAjIEtleSBhbmQgdmFsdWUgZm9yIG1hcAorICAgICAgICAgICAgICAgIHwgKGNsYXNzX25hbWUsIHNwZWNfYXJnc19wdHIpICMgRm9yIHN0cnVjdC9leGNlcHRpb24KKyAgICAgY2xhc3NfbmFtZSAtPiBpZGVudGlmaWVyICAjIEJhc2ljYWxseSBhIHBvaW50ZXIgdG8gdGhlIGNsYXNzCisgICAgIHNwZWNfYXJnc19wdHIgLT4gZXhwcmVzc2lvbiAgIyBqdXN0IGNsYXNzX25hbWUuc3BlY19hcmdzCisKKyAgICAgVE9ETyhkcmVpc3MpOiBDb25zaWRlciBtYWtpbmcgdGhpcyB3b3JrIGZvciBzdHJ1Y3RzIHdpdGggbmVnYXRpdmUgdGFncy4KKyAgKi8KKyAgLy8gVE9ETyhkcmVpc3MpOiBMb29rIGludG8gZ2VuZXJhdGluZyBhbiBlbXB0eSB0dXBsZSBpbnN0ZWFkIG9mIG5pbAorICAvLyBmb3Igc3RydWN0dXJlcyB3aXRoIG5vIG1lbWJlcnMuCisgIC8vIFRPRE8oZHJlaXNzKTogVGVzdCBlbmNvZGluZyBvZiBzdHJ1Y3RzIHdoZXJlIHNvbWUgaW5uZXIgc3RydWN0cworICAvLyBkb24ndCBoYXZlIHRocmlmdF9zcGVjLgorICBpbmRlbnRfdXAoKTsKKworICBpbnQgbnVtX3NldGFibGUgPSAwOworICBpZiAoc29ydGVkX21lbWJlcnMuZW1wdHkoKSB8fCAoc29ydGVkX21lbWJlcnNbMF0tPmdldF9rZXkoKSA+PSAwKSkgeworICAgIGludCBzb3J0ZWRfa2V5c19wb3MgPSAwOworCisgICAgZm9yIChtX2l0ZXIgPSBzb3J0ZWRfbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gc29ydGVkX21lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICAvLyBTZXQgZmllbGQgdG8gb3B0aW9uYWwgaWYgZmllbGQgaXMgdW5pb24sIHRoaXMgaXMgc28gd2UgY2FuIGdldCBhCisgICAgICAvLyBwb2ludGVyIHRvIHRoZSBmaWVsZC4KKyAgICAgIGlmICh0c3RydWN0LT5pc191bmlvbigpKQorICAgICAgICAoKm1faXRlciktPnNldF9yZXEodF9maWVsZDo6VF9PUFRJT05BTCk7CisgICAgICBpZiAoc29ydGVkX2tleXNfcG9zICE9ICgqbV9pdGVyKS0+Z2V0X2tleSgpKSB7CisgICAgICAgIGludCBmaXJzdF91bnVzZWQgPSAoc3RkOjptYXgpKDEsIHNvcnRlZF9rZXlzX3BvcysrKTsKKyAgICAgICAgd2hpbGUgKHNvcnRlZF9rZXlzX3BvcyAhPSAoKm1faXRlciktPmdldF9rZXkoKSkgeworICAgICAgICAgICsrc29ydGVkX2tleXNfcG9zOworICAgICAgICB9CisgICAgICAgIGludCBsYXN0X3VudXNlZCA9IHNvcnRlZF9rZXlzX3BvcyAtIDE7CisgICAgICAgIGlmIChmaXJzdF91bnVzZWQgPCBsYXN0X3VudXNlZCkgeworICAgICAgICAgIGluZGVudChvdXQpIDw8ICIvLyB1bnVzZWQgZmllbGRzICMgIiA8PCBmaXJzdF91bnVzZWQgPDwgIiB0byAiIDw8IGxhc3RfdW51c2VkIDw8IGVuZGw7CisgICAgICAgIH0gZWxzZSBpZiAoZmlyc3RfdW51c2VkID09IGxhc3RfdW51c2VkKSB7CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgIi8vIHVudXNlZCBmaWVsZCAjICIgPDwgZmlyc3RfdW51c2VkIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgdF90eXBlKiBmaWVsZFR5cGUgPSAoKm1faXRlciktPmdldF90eXBlKCk7CisgICAgICBzdHJpbmcgZ29UeXBlID0gdHlwZV90b19nb190eXBlX3dpdGhfb3B0KGZpZWxkVHlwZSwgaXNfcG9pbnRlcl9maWVsZCgqbV9pdGVyKSk7CisgICAgICBzdHJpbmcgZ290YWcgPSAiZGI6XCIiICsgZXNjYXBlX3N0cmluZygoKm1faXRlciktPmdldF9uYW1lKCkpICArICJcIiAiOworICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKKyAgICAgICAgZ290YWcgKz0gImpzb246XCIiICsgZXNjYXBlX3N0cmluZygoKm1faXRlciktPmdldF9uYW1lKCkpICsgIixvbWl0ZW1wdHlcIiI7CisgICAgICB9IGVsc2UgeworICAgICAgICBnb3RhZyArPSAianNvbjpcIiIgKyBlc2NhcGVfc3RyaW5nKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgKyAiXCIiOworICAgICAgfQorCisgICAgICAvLyBDaGVjayBmb3IgdXNlciBvdmVycmlkZSBvZiBkYiBhbmQganNvbiB0YWdzIHVzaW5nICJnby50YWciCisgICAgICBzdGQ6Om1hcDxzdHJpbmcsIHN0cmluZz46Oml0ZXJhdG9yIGl0ID0gKCptX2l0ZXIpLT5hbm5vdGF0aW9uc18uZmluZCgiZ28udGFnIik7CisgICAgICBpZiAoaXQgIT0gKCptX2l0ZXIpLT5hbm5vdGF0aW9uc18uZW5kKCkpIHsKKyAgICAgICAgZ290YWcgPSBpdC0+c2Vjb25kOworICAgICAgfQorICAgICAgaW5kZW50KG91dCkgPDwgcHVibGljaXplKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiAiIDw8IGdvVHlwZSA8PCAiIGB0aHJpZnQ6XCIiCisgICAgICAgICAgICAgICAgICA8PCBlc2NhcGVfc3RyaW5nKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiwiIDw8IHNvcnRlZF9rZXlzX3BvczsKKyAgICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICAgIG91dCA8PCAiLHJlcXVpcmVkIjsKKyAgICAgIH0KKworICAgICAgb3V0IDw8ICJcIiAiIDw8IGdvdGFnIDw8ICJgIiA8PCBlbmRsOworICAgICAgc29ydGVkX2tleXNfcG9zKys7CisgICAgfQorICB9IGVsc2UgeworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIC8vIFRoaXMgZmlsbHMgaW4gZGVmYXVsdCB2YWx1ZXMsIGFzIG9wcG9zZWQgdG8gbnVsbHMKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCBwdWJsaWNpemUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiICIKKyAgICAgICAgICA8PCB0eXBlX3RvX2dvX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgImZ1bmMgTmV3IiA8PCB0c3RydWN0X25hbWUgPDwgIigpICoiIDw8IHRzdHJ1Y3RfbmFtZSA8PCAiIHsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gJiI7CisgIGdlbmVyYXRlX2dvX3N0cnVjdF9pbml0aWFsaXplcihvdXQsIHRzdHJ1Y3QsIGlzX3Jlc3VsdCB8fCBpc19hcmdzKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIC8vIERlZmF1bHQgdmFsdWVzIGZvciBvcHRpb25hbCBmaWVsZHMKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIHN0cmluZyBwdWJsaWNpemVkX25hbWU7CisgICAgdF9jb25zdF92YWx1ZSogZGVmX3ZhbHVlOworICAgIGdldF9wdWJsaWNpemVkX25hbWVfYW5kX2RlZl92YWx1ZSgqbV9pdGVyLCAmcHVibGljaXplZF9uYW1lLCAmZGVmX3ZhbHVlKTsKKyAgICB0X3R5cGUqIGZpZWxkVHlwZSA9ICgqbV9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICBzdHJpbmcgZ29UeXBlID0gdHlwZV90b19nb190eXBlX3dpdGhfb3B0KGZpZWxkVHlwZSwgZmFsc2UpOworICAgIHN0cmluZyBkZWZfdmFyX25hbWUgPSB0c3RydWN0X25hbWUgKyAiXyIgKyBwdWJsaWNpemVkX25hbWUgKyAiX0RFRkFVTFQiOworICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMIHx8IGlzX3BvaW50ZXJfZmllbGQoKm1faXRlcikpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidmFyICIgPDwgZGVmX3Zhcl9uYW1lIDw8ICIgIiA8PCBnb1R5cGU7CisgICAgICBpZiAoZGVmX3ZhbHVlICE9IE5VTEwpIHsKKyAgICAgICAgb3V0IDw8ICIgPSAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZShmaWVsZFR5cGUsIGRlZl92YWx1ZSwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICAgIH0KKyAgICAgIG91dCA8PCBlbmRsOworICAgIH0KKworICAgIC8vIG51bV9zZXRhYmxlIGlzIHVzZWQgZm9yIGRlY2lkaW5nIGlmIENvdW50KiBtZXRob2RzIHdpbGwgYmUgZ2VuZXJhdGVkIGZvciB1bmlvbiBmaWVsZHMuCisgICAgLy8gVGhpcyBhcHBsaWVzIHRvIGFsbCBudWxsYWJsZSBmaWVsZHMgaW5jbHVkaW5nIHNsaWNlcyAodXNlZCBmb3Igc2V0LCBsaXN0IGFuZCBiaW5hcnkpIGFuZCBtYXBzLCBub3QganVzdCBwb2ludGVycy4KKyAgICB0X3R5cGUqIHR5cGUgPSBmaWVsZFR5cGUtPmdldF90cnVlX3R5cGUoKTsKKyAgICBpZiAoaXNfcG9pbnRlcl9maWVsZCgqbV9pdGVyKXx8IHR5cGUtPmlzX21hcCgpIHx8IHR5cGUtPmlzX3NldCgpIHx8IHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgbnVtX3NldGFibGUgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoaXNfcG9pbnRlcl9maWVsZCgqbV9pdGVyKSkgeworICAgICAgc3RyaW5nIGdvT3B0VHlwZSA9IHR5cGVfdG9fZ29fdHlwZV93aXRoX29wdChmaWVsZFR5cGUsIHRydWUpOworICAgICAgc3RyaW5nIG1heWJlcG9pbnRlciA9IGdvT3B0VHlwZSAhPSBnb1R5cGUgPyAiKiIgOiAiIjsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZnVuYyAocCAqIiA8PCB0c3RydWN0X25hbWUgPDwgIikgR2V0IiA8PCBwdWJsaWNpemVkX25hbWUgPDwgIigpICIKKyAgICAgICAgICA8PCBnb1R5cGUgPDwgIiB7IiA8PCBlbmRsOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIGlmICFwLklzU2V0IiA8PCBwdWJsaWNpemVkX25hbWUgPDwgIigpIHsiIDw8IGVuZGw7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICByZXR1cm4gIiA8PCBkZWZfdmFyX25hbWUgPDwgZW5kbDsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gIiA8PCBtYXliZXBvaW50ZXIgPDwgInAuIiA8PCBwdWJsaWNpemVkX25hbWUgPDwgZW5kbDsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8IGVuZGw7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImZ1bmMgKHAgKiIgPDwgdHN0cnVjdF9uYW1lIDw8ICIpIEdldCIgPDwgcHVibGljaXplZF9uYW1lIDw8ICIoKSAiCisgICAgICAgICAgPDwgZ29UeXBlIDw8ICIgeyIgPDwgZW5kbDsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gcC4iIDw8IHB1YmxpY2l6ZWRfbmFtZSA8PCBlbmRsOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIGlmICh0c3RydWN0LT5pc191bmlvbigpICYmIG51bV9zZXRhYmxlID4gMCkgeworICAgIGdlbmVyYXRlX2NvdW50c2V0ZmllbGRzX2hlbHBlcihvdXQsIHRzdHJ1Y3QsIHRzdHJ1Y3RfbmFtZSwgaXNfcmVzdWx0KTsKKyAgfQorCisgIGdlbmVyYXRlX2lzc2V0X2hlbHBlcnMob3V0LCB0c3RydWN0LCB0c3RydWN0X25hbWUsIGlzX3Jlc3VsdCk7CisgIGdlbmVyYXRlX2dvX3N0cnVjdF9yZWFkZXIob3V0LCB0c3RydWN0LCB0c3RydWN0X25hbWUsIGlzX3Jlc3VsdCk7CisgIGdlbmVyYXRlX2dvX3N0cnVjdF93cml0ZXIob3V0LCB0c3RydWN0LCB0c3RydWN0X25hbWUsIGlzX3Jlc3VsdCwgbnVtX3NldGFibGUgPiAwKTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgImZ1bmMgKHAgKiIgPDwgdHN0cnVjdF9uYW1lIDw8ICIpIFN0cmluZygpIHN0cmluZyB7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgaWYgcCA9PSBuaWwgeyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgcmV0dXJuIFwiPG5pbD5cIiIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gZm10LlNwcmludGYoXCIiIDw8IGVzY2FwZV9zdHJpbmcodHN0cnVjdF9uYW1lKSA8PCAiKCUrdilcIiwgKnApIgorICAgICAgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaWYgKGlzX2V4Y2VwdGlvbikgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZnVuYyAocCAqIiA8PCB0c3RydWN0X25hbWUgPDwgIikgRXJyb3IoKSBzdHJpbmcgeyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHAuU3RyaW5nKCkiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgdGhlIElzU2V0IGhlbHBlciBtZXRob2RzIGZvciBhIHN0cnVjdAorICovCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9pc3NldF9oZWxwZXJzKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgdHN0cnVjdF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCkgeworICAodm9pZClpc19yZXN1bHQ7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgY29uc3Qgc3RyaW5nIGVzY2FwZWRfdHN0cnVjdF9uYW1lKGVzY2FwZV9zdHJpbmcodHN0cnVjdC0+Z2V0X25hbWUoKSkpOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgY29uc3Qgc3RyaW5nIGZpZWxkX25hbWUocHVibGljaXplKGVzY2FwZV9zdHJpbmcoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSkpOworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMIHx8IGlzX3BvaW50ZXJfZmllbGQoKmZfaXRlcikpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZnVuYyAocCAqIiA8PCB0c3RydWN0X25hbWUgPDwgIikgSXNTZXQiIDw8IGZpZWxkX25hbWUgPDwgIigpIGJvb2wgeyIKKyAgICAgICAgICA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICB0X3R5cGUqIHR0eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfdHJ1ZV90eXBlKCk7CisgICAgICBib29sIGlzX2J5dGVzbGljZSA9IHR0eXBlLT5pc19iaW5hcnkoKTsKKyAgICAgIGJvb2wgY29tcGFyZV90b19uaWxfb25seSA9IHR0eXBlLT5pc19zZXQoKSB8fCB0dHlwZS0+aXNfbGlzdCgpIHx8IHR0eXBlLT5pc19tYXAoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGlzX2J5dGVzbGljZSAmJiAhKCpmX2l0ZXIpLT5nZXRfdmFsdWUoKSk7CisgICAgICBpZiAoaXNfcG9pbnRlcl9maWVsZCgqZl9pdGVyKSB8fCBjb21wYXJlX3RvX25pbF9vbmx5KSB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHAuIiA8PCBmaWVsZF9uYW1lIDw8ICIgIT0gbmlsIiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc3RyaW5nIGRlZl92YXJfbmFtZSA9IHRzdHJ1Y3RfbmFtZSArICJfIiArIGZpZWxkX25hbWUgKyAiX0RFRkFVTFQiOworICAgICAgICBpZiAoaXNfYnl0ZXNsaWNlKSB7CisgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gIWJ5dGVzLkVxdWFsKHAuIiA8PCBmaWVsZF9uYW1lIDw8ICIsICIgPDwgZGVmX3Zhcl9uYW1lIDw8ICIpIgorICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHAuIiA8PCBmaWVsZF9uYW1lIDw8ICIgIT0gIiA8PCBkZWZfdmFyX25hbWUgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgIH0KKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyB0aGUgQ291bnRTZXRGaWVsZHMgaGVscGVyIG1ldGhvZCBmb3IgYSBzdHJ1Y3QKKyAqLwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY291bnRzZXRmaWVsZHNfaGVscGVyKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHRzdHJ1Y3RfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCkgeworICAodm9pZClpc19yZXN1bHQ7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgY29uc3Qgc3RyaW5nIGVzY2FwZWRfdHN0cnVjdF9uYW1lKGVzY2FwZV9zdHJpbmcodHN0cnVjdC0+Z2V0X25hbWUoKSkpOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiZnVuYyAocCAqIiA8PCB0c3RydWN0X25hbWUgPDwgIikgQ291bnRTZXRGaWVsZHMiIDw8IHRzdHJ1Y3RfbmFtZSA8PCAiKCkgaW50IHsiCisgICAgICA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJjb3VudCA6PSAwIiA8PCBlbmRsOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKQorICAgICAgY29udGludWU7CisKKyAgICB0X3R5cGUqIHR5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCktPmdldF90cnVlX3R5cGUoKTsKKworICAgIGlmICghKGlzX3BvaW50ZXJfZmllbGQoKmZfaXRlcikgfHwgdHlwZS0+aXNfbWFwKCkgfHwgdHlwZS0+aXNfc2V0KCkgfHwgdHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX2JpbmFyeSgpKSkKKyAgICAgIGNvbnRpbnVlOworCisgICAgY29uc3Qgc3RyaW5nIGZpZWxkX25hbWUocHVibGljaXplKGVzY2FwZV9zdHJpbmcoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSkpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAocC5Jc1NldCIgPDwgZmllbGRfbmFtZSA8PCAiKCkpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJjb3VudCsrIiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gY291bnQiIDw8IGVuZGwgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHRoZSByZWFkIG1ldGhvZCBmb3IgYSBzdHJ1Y3QKKyAqLwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ29fc3RydWN0X3JlYWRlcihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHRzdHJ1Y3RfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQpIHsKKyAgKHZvaWQpaXNfcmVzdWx0OworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIHN0cmluZyBlc2NhcGVkX3RzdHJ1Y3RfbmFtZShlc2NhcGVfc3RyaW5nKHRzdHJ1Y3QtPmdldF9uYW1lKCkpKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJmdW5jIChwICoiIDw8IHRzdHJ1Y3RfbmFtZSA8PCAiKSAiIDw8IHJlYWRfbWV0aG9kX25hbWVfIDw8ICIoaXByb3QgdGhyaWZ0LlRQcm90b2NvbCkgZXJyb3IgeyIKKyAgICAgIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIF8sIGVyciA6PSBpcHJvdC5SZWFkU3RydWN0QmVnaW4oKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRocmlmdC5QcmVwZW5kRXJyb3IoZm10LlNwcmludGYoXCIlVCByZWFkIGVycm9yOiBcIiwgcCksIGVycikiCisgICAgICA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBSZXF1aXJlZCB2YXJpYWJsZXMgZG9lcyBub3QgaGF2ZSBJc1NldCBmdW5jdGlvbnMsIHNvIHdlIG5lZWQgdG1wIHZhcnMgdG8gY2hlY2sgdGhlbS4KKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgY29uc3Qgc3RyaW5nIGZpZWxkX25hbWUocHVibGljaXplKGVzY2FwZV9zdHJpbmcoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSkpOworICAgICAgaW5kZW50KG91dCkgPDwgInZhciBpc3NldCIgPDwgZmllbGRfbmFtZSA8PCAiIGJvb2wgPSBmYWxzZTsiIDw8IGVuZGw7CisgICAgfQorICB9CisgIG91dCA8PCBlbmRsOworCisgIC8vIExvb3Agb3ZlciByZWFkaW5nIGluIGZpZWxkcworICBpbmRlbnQob3V0KSA8PCAiZm9yIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICAvLyBSZWFkIGJlZ2lubmluZyBmaWVsZCBtYXJrZXIKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJfLCBmaWVsZFR5cGVJZCwgZmllbGRJZCwgZXJyIDo9IGlwcm90LlJlYWRGaWVsZEJlZ2luKCkiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRocmlmdC5QcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIgorICAgICAgICAgICAgICAgICAgICAgIlwiJVQgZmllbGQgJWQgcmVhZCBlcnJvcjogXCIsIHAsIGZpZWxkSWQpLCBlcnIpIiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIC8vIENoZWNrIGZvciBmaWVsZCBTVE9QIG1hcmtlciBhbmQgYnJlYWsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBmaWVsZFR5cGVJZCA9PSB0aHJpZnQuU1RPUCB7IGJyZWFrOyB9IiA8PCBlbmRsOworCisgIHN0cmluZyB0aHJpZnRGaWVsZFR5cGVJZDsKKyAgLy8gR2VuZXJhdGUgZGVzZXJpYWxpemF0aW9uIGNvZGUgZm9yIGtub3duIGNhc2VzCisgIGludDMyX3QgZmllbGRfaWQgPSAtMTsKKworICAvLyBTd2l0Y2ggc3RhdGVtZW50IG9uIHRoZSBmaWVsZCB3ZSBhcmUgcmVhZGluZywgZmFsc2UgaWYgbm8gZmllbGRzIHByZXNlbnQKKyAgYm9vbCBoYXZlX3N3aXRjaCA9ICFmaWVsZHMuZW1wdHkoKTsKKyAgaWYgKGhhdmVfc3dpdGNoKSB7CisgICAgaW5kZW50KG91dCkgPDwgInN3aXRjaCBmaWVsZElkIHsiIDw8IGVuZGw7CisgIH0KKworICAvLyBBbGwgdGhlIGZpZWxkcyB3ZSBrbm93CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZmllbGRfaWQgPSAoKmZfaXRlciktPmdldF9rZXkoKTsKKworICAgIC8vIGlmIG5lZ2F0aXZlIGlkLCBlbnN1cmUgd2UgZ2VuZXJhdGUgYSB2YWxpZCBtZXRob2QgbmFtZQorICAgIHN0cmluZyBmaWVsZF9tZXRob2RfcHJlZml4KCJSZWFkRmllbGQiKTsKKyAgICBpbnQzMl90IGZpZWxkX21ldGhvZF9zdWZmaXggPSBmaWVsZF9pZDsKKworICAgIGlmIChmaWVsZF9tZXRob2Rfc3VmZml4IDwgMCkgeworICAgICAgZmllbGRfbWV0aG9kX3ByZWZpeCArPSAiXyI7CisgICAgICBmaWVsZF9tZXRob2Rfc3VmZml4ICo9IC0xOworICAgIH0KKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiY2FzZSAiIDw8IGZpZWxkX2lkIDw8ICI6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIHRocmlmdEZpZWxkVHlwZUlkID0gdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7CisKKyAgICBpZiAodGhyaWZ0RmllbGRUeXBlSWQgPT0gInRocmlmdC5CSU5BUlkiKSB7CisgICAgICB0aHJpZnRGaWVsZFR5cGVJZCA9ICJ0aHJpZnQuU1RSSU5HIjsKKyAgICB9CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGZpZWxkVHlwZUlkID09ICIgPDwgdGhyaWZ0RmllbGRUeXBlSWQgPDwgIiB7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBpZiBlcnIgOj0gcC4iIDw8IGZpZWxkX21ldGhvZF9wcmVmaXggPDwgZmllbGRfbWV0aG9kX3N1ZmZpeCA8PCAiKGlwcm90KTsgZXJyICE9IG5pbCB7IgorICAgICAgICA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgIHJldHVybiBlcnIiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGw7CisKKyAgICAvLyBNYXJrIHJlcXVpcmVkIGZpZWxkIGFzIHJlYWQKKyAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgY29uc3Qgc3RyaW5nIGZpZWxkX25hbWUocHVibGljaXplKGVzY2FwZV9zdHJpbmcoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSkpOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIGlzc2V0IiA8PCBmaWVsZF9uYW1lIDw8ICIgPSB0cnVlIiA8PCBlbmRsOworICAgIH0KKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIGlmIGVyciA6PSBpcHJvdC5Ta2lwKGZpZWxkVHlwZUlkKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgIHJldHVybiBlcnIiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgLy8gQmVnaW4gc3dpdGNoIGRlZmF1bHQgY2FzZQorICBpZiAoaGF2ZV9zd2l0Y2gpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICB9CisKKyAgLy8gU2tpcCB1bmtub3duIGZpZWxkcyBpbiBlaXRoZXIgY2FzZQorICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGVyciA6PSBpcHJvdC5Ta2lwKGZpZWxkVHlwZUlkKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGVyciIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgIC8vIEVuZCBzd2l0Y2ggZGVmYXVsdCBjYXNlCisgIGlmIChoYXZlX3N3aXRjaCkgeworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9CisKKyAgLy8gUmVhZCBmaWVsZCBlbmQgbWFya2VyCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyIDo9IGlwcm90LlJlYWRGaWVsZEVuZCgpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gZXJyIiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBlcnIgOj0gaXByb3QuUmVhZFN0cnVjdEVuZCgpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhyaWZ0LlByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiCisgICAgICAgICAgICAgICAgICAgICAiXCIlVCByZWFkIHN0cnVjdCBlbmQgZXJyb3I6IFwiLCBwKSwgZXJyKSIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgIC8vIFJldHVybiBlcnJvciBpZiBhbnkgcmVxdWlyZWQgZmllbGRzIGFyZSBtaXNzaW5nLgorICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICBjb25zdCBzdHJpbmcgZmllbGRfbmFtZShwdWJsaWNpemUoZXNjYXBlX3N0cmluZygoKmZfaXRlciktPmdldF9uYW1lKCkpKSk7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICFpc3NldCIgPDwgZmllbGRfbmFtZSA8PCAieyIgPDwgZW5kbDsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhyaWZ0Lk5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKHRocmlmdC5JTlZBTElEX0RBVEEsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiZm10LkVycm9yZihcIlJlcXVpcmVkIGZpZWxkICIgPDwgZmllbGRfbmFtZSA8PCAiIGlzIG5vdCBzZXRcIikpOyIgPDwgZW5kbDsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBuaWwiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgc3RyaW5nIGZpZWxkX3R5cGVfbmFtZShwdWJsaWNpemUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpKSk7CisgICAgc3RyaW5nIGZpZWxkX25hbWUocHVibGljaXplKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkpOworICAgIHN0cmluZyBmaWVsZF9tZXRob2RfcHJlZml4KCJSZWFkRmllbGQiKTsKKyAgICBpbnQzMl90IGZpZWxkX2lkID0gKCpmX2l0ZXIpLT5nZXRfa2V5KCk7CisgICAgaW50MzJfdCBmaWVsZF9tZXRob2Rfc3VmZml4ID0gZmllbGRfaWQ7CisKKyAgICBpZiAoZmllbGRfbWV0aG9kX3N1ZmZpeCA8IDApIHsKKyAgICAgIGZpZWxkX21ldGhvZF9wcmVmaXggKz0gIl8iOworICAgICAgZmllbGRfbWV0aG9kX3N1ZmZpeCAqPSAtMTsKKyAgICB9CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImZ1bmMgKHAgKiIgPDwgdHN0cnVjdF9uYW1lIDw8ICIpICAiIDw8IGZpZWxkX21ldGhvZF9wcmVmaXggPDwgZmllbGRfbWV0aG9kX3N1ZmZpeAorICAgICAgICA8PCAiKGlwcm90IHRocmlmdC5UUHJvdG9jb2wpIGVycm9yIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCBmYWxzZSwgInAuIik7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIG5pbCIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorfQorCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nb19zdHJ1Y3Rfd3JpdGVyKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgdHN0cnVjdF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB1c2VzX2NvdW50c2V0ZmllbGRzKSB7CisgICh2b2lkKWlzX3Jlc3VsdDsKKyAgc3RyaW5nIG5hbWUodHN0cnVjdC0+Z2V0X25hbWUoKSk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGluZGVudChvdXQpIDw8ICJmdW5jIChwICoiIDw8IHRzdHJ1Y3RfbmFtZSA8PCAiKSAiIDw8IHdyaXRlX21ldGhvZF9uYW1lXyA8PCAiKG9wcm90IHRocmlmdC5UUHJvdG9jb2wpIGVycm9yIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpZiAodHN0cnVjdC0+aXNfdW5pb24oKSAmJiB1c2VzX2NvdW50c2V0ZmllbGRzKSB7CisgICAgc3RkOjpzdHJpbmcgdHN0cnVjdF9uYW1lKHB1YmxpY2l6ZSh0c3RydWN0LT5nZXRfbmFtZSgpKSk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBjIDo9IHAuQ291bnRTZXRGaWVsZHMiIDw8IHRzdHJ1Y3RfbmFtZSA8PCAiKCk7IGMgIT0gMSB7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpCisgICAgICAgIDw8ICIgIHJldHVybiBmbXQuRXJyb3JmKFwiJVQgd3JpdGUgdW5pb246IGV4YWN0bHkgb25lIGZpZWxkIG11c3QgYmUgc2V0ICglZCBzZXQpLlwiLCBwLCBjKSIKKyAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgfQorICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGVyciA6PSBvcHJvdC5Xcml0ZVN0cnVjdEJlZ2luKFwiIiA8PCBuYW1lIDw8ICJcIik7IGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0aHJpZnQuUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIKKyAgICAgICAgICAgICAgICAgICAgICJcIiVUIHdyaXRlIHN0cnVjdCBiZWdpbiBlcnJvcjogXCIsIHApLCBlcnIpIH0iIDw8IGVuZGw7CisKKyAgc3RyaW5nIGZpZWxkX25hbWU7CisgIHN0cmluZyBlc2NhcGVfZmllbGRfbmFtZTsKKyAgLy8gdF9jb25zdF92YWx1ZSogZmllbGRfZGVmYXVsdF92YWx1ZTsKKyAgdF9maWVsZDo6ZV9yZXEgZmllbGRfcmVxdWlyZWQ7CisgIGludDMyX3QgZmllbGRfaWQgPSAtMTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIHAgIT0gbmlsIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgc3RyaW5nIGZpZWxkX21ldGhvZF9wcmVmaXgoIndyaXRlRmllbGQiKTsKKyAgICBmaWVsZF9uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIGVzY2FwZV9maWVsZF9uYW1lID0gZXNjYXBlX3N0cmluZyhmaWVsZF9uYW1lKTsKKyAgICBmaWVsZF9pZCA9ICgqZl9pdGVyKS0+Z2V0X2tleSgpOworICAgIGludDMyX3QgZmllbGRfbWV0aG9kX3N1ZmZpeCA9IGZpZWxkX2lkOworCisgICAgaWYgKGZpZWxkX21ldGhvZF9zdWZmaXggPCAwKSB7CisgICAgICBmaWVsZF9tZXRob2RfcHJlZml4ICs9ICJfIjsKKyAgICAgIGZpZWxkX21ldGhvZF9zdWZmaXggKj0gLTE7CisgICAgfQorCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBlcnIgOj0gcC4iIDw8IGZpZWxkX21ldGhvZF9wcmVmaXggPDwgZmllbGRfbWV0aG9kX3N1ZmZpeAorICAgICAgICA8PCAiKG9wcm90KTsgZXJyICE9IG5pbCB7IHJldHVybiBlcnIgfSIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICAvLyBXcml0ZSB0aGUgc3RydWN0IG1hcAorICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGVyciA6PSBvcHJvdC5Xcml0ZUZpZWxkU3RvcCgpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhyaWZ0LlByZXBlbmRFcnJvcihcIndyaXRlIGZpZWxkIHN0b3AgZXJyb3I6IFwiLCBlcnIpIH0iIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyIDo9IG9wcm90LldyaXRlU3RydWN0RW5kKCk7IGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0aHJpZnQuUHJlcGVuZEVycm9yKFwid3JpdGUgc3RydWN0IHN0b3AgZXJyb3I6IFwiLCBlcnIpIH0iIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIG5pbCIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBzdHJpbmcgZmllbGRfbWV0aG9kX3ByZWZpeCgid3JpdGVGaWVsZCIpOworICAgIGZpZWxkX2lkID0gKCpmX2l0ZXIpLT5nZXRfa2V5KCk7CisgICAgZmllbGRfbmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICBlc2NhcGVfZmllbGRfbmFtZSA9IGVzY2FwZV9zdHJpbmcoZmllbGRfbmFtZSk7CisgICAgLy8gZmllbGRfZGVmYXVsdF92YWx1ZSA9ICgqZl9pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgICAgZmllbGRfcmVxdWlyZWQgPSAoKmZfaXRlciktPmdldF9yZXEoKTsKKyAgICBpbnQzMl90IGZpZWxkX21ldGhvZF9zdWZmaXggPSBmaWVsZF9pZDsKKworICAgIGlmIChmaWVsZF9tZXRob2Rfc3VmZml4IDwgMCkgeworICAgICAgZmllbGRfbWV0aG9kX3ByZWZpeCArPSAiXyI7CisgICAgICBmaWVsZF9tZXRob2Rfc3VmZml4ICo9IC0xOworICAgIH0KKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZnVuYyAocCAqIiA8PCB0c3RydWN0X25hbWUgPDwgIikgIiA8PCBmaWVsZF9tZXRob2RfcHJlZml4IDw8IGZpZWxkX21ldGhvZF9zdWZmaXgKKyAgICAgICAgPDwgIihvcHJvdCB0aHJpZnQuVFByb3RvY29sKSAoZXJyIGVycm9yKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgaWYgKGZpZWxkX3JlcXVpcmVkID09IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgcC5Jc1NldCIgPDwgcHVibGljaXplKGZpZWxkX25hbWUpIDw8ICIoKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBlcnIgOj0gb3Byb3QuV3JpdGVGaWVsZEJlZ2luKFwiIiA8PCBlc2NhcGVfZmllbGRfbmFtZSA8PCAiXCIsICIKKyAgICAgICAgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiwgIiA8PCBmaWVsZF9pZCA8PCAiKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhyaWZ0LlByZXBlbmRFcnJvcihmbXQuU3ByaW50ZihcIiVUIHdyaXRlIGZpZWxkIGJlZ2luIGVycm9yICIKKyAgICAgICAgPDwgZmllbGRfaWQgPDwgIjoiIDw8IGVzY2FwZV9maWVsZF9uYW1lIDw8ICI6IFwiLCBwKSwgZXJyKSB9IiA8PCBlbmRsOworCisgICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAicC4iKTsKKworICAgIC8vIFdyaXRlIGZpZWxkIGNsb3NlcgorICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyIDo9IG9wcm90LldyaXRlRmllbGRFbmQoKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhyaWZ0LlByZXBlbmRFcnJvcihmbXQuU3ByaW50ZihcIiVUIHdyaXRlIGZpZWxkIGVuZCBlcnJvciAiCisgICAgICAgIDw8IGZpZWxkX2lkIDw8ICI6IiA8PCBlc2NhcGVfZmllbGRfbmFtZSA8PCAiOiBcIiwgcCksIGVycikgfSIgPDwgZW5kbDsKKworICAgIGlmIChmaWVsZF9yZXF1aXJlZCA9PSB0X2ZpZWxkOjpUX09QVElPTkFMKSB7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBlcnIiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSB0aHJpZnQgc2VydmljZS4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgorICovCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIHRlc3Rfc3VmZml4KCJfdGVzdCIpOworICBzdHJpbmcgZmlsZW5hbWUgPSBsb3dlcmNhc2Uoc2VydmljZV9uYW1lXyk7CisgIHN0cmluZyBmX3NlcnZpY2VfbmFtZTsKKworICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX3JlbW90ZSh0c2VydmljZSk7CisgIGZfdHlwZXNfIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGhlbHBlciBmdW5jdGlvbnMgZm9yIGEgc2VydmljZS4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKKyAqLwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgIGZfdHlwZXNfIDw8ICIvLyBIRUxQRVIgRlVOQ1RJT05TIEFORCBTVFJVQ1RVUkVTIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X3N0cnVjdCogdHMgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgZ2VuZXJhdGVfZ29fc3RydWN0X2RlZmluaXRpb24oZl90eXBlc18sIHRzLCBmYWxzZSwgZmFsc2UsIHRydWUpOworICAgIGdlbmVyYXRlX2dvX2Z1bmN0aW9uX2hlbHBlcnMoKmZfaXRlcik7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgYW5kIGhlbHBlcnMgZm9yIGEgZnVuY3Rpb24uCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24KKyAqLwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ29fZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOworICAgIHRfZmllbGQgc3VjY2Vzcyh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksICJzdWNjZXNzIiwgMCk7CisgICAgc3VjY2Vzcy5zZXRfcmVxKHRfZmllbGQ6OlRfT1BUSU9OQUwpOworCisgICAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7CisgICAgfQorCisgICAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIHRfZmllbGQqIGYgPSAqZl9pdGVyOworICAgICAgZi0+c2V0X3JlcSh0X2ZpZWxkOjpUX09QVElPTkFMKTsKKyAgICAgIHJlc3VsdC5hcHBlbmQoZik7CisgICAgfQorCisgICAgZ2VuZXJhdGVfZ29fc3RydWN0X2RlZmluaXRpb24oZl90eXBlc18sICZyZXN1bHQsIGZhbHNlLCB0cnVlKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgaW50ZXJmYWNlIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCisgKi8KK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfaWYgPSAiIjsKKyAgc3RyaW5nIHNlcnZpY2VOYW1lKHB1YmxpY2l6ZSh0c2VydmljZS0+Z2V0X25hbWUoKSkpOworICBzdHJpbmcgaW50ZXJmYWNlTmFtZSA9IHNlcnZpY2VOYW1lOworCisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7CisgICAgc2l6ZV90IGluZGV4ID0gZXh0ZW5kcy5yZmluZCgiLiIpOworCisgICAgaWYgKGluZGV4ICE9IHN0cmluZzo6bnBvcykgeworICAgICAgZXh0ZW5kc19pZiA9ICJcbiIgKyBpbmRlbnQoKSArICIgICIgKyBleHRlbmRzLnN1YnN0cigwLCBpbmRleCArIDEpCisgICAgICAgICAgICAgICAgICAgKyBwdWJsaWNpemUoZXh0ZW5kcy5zdWJzdHIoaW5kZXggKyAxKSkgKyAiXG4iOworICAgIH0gZWxzZSB7CisgICAgICBleHRlbmRzX2lmID0gIlxuIiArIGluZGVudCgpICsgcHVibGljaXplKGV4dGVuZHMpICsgIlxuIjsKKyAgICB9CisgIH0KKworICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAidHlwZSAiIDw8IGludGVyZmFjZU5hbWUgPDwgIiBpbnRlcmZhY2UgeyIgPDwgZXh0ZW5kc19pZjsKKyAgaW5kZW50X3VwKCk7CisgIGdlbmVyYXRlX2dvX2RvY3N0cmluZyhmX3R5cGVzXywgdHNlcnZpY2UpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisKKyAgaWYgKCFmdW5jdGlvbnMuZW1wdHkoKSkgeworICAgIGZfdHlwZXNfIDw8IGVuZGw7CisgICAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworCisgICAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIGdlbmVyYXRlX2dvX2RvY3N0cmluZyhmX3R5cGVzXywgKCpmX2l0ZXIpKTsKKyAgICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZV9pZigqZl9pdGVyLCAiIiwgdHJ1ZSkgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KKyAqLwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19maWVsZCA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19jbGllbnQgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfY2xpZW50X25ldyA9ICIiOworICBzdHJpbmcgc2VydmljZU5hbWUocHVibGljaXplKHRzZXJ2aWNlLT5nZXRfbmFtZSgpKSk7CisKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICBzaXplX3QgaW5kZXggPSBleHRlbmRzLnJmaW5kKCIuIik7CisKKyAgICBpZiAoaW5kZXggIT0gc3RyaW5nOjpucG9zKSB7CisgICAgICBleHRlbmRzX2NsaWVudCA9IGV4dGVuZHMuc3Vic3RyKDAsIGluZGV4ICsgMSkgKyBwdWJsaWNpemUoZXh0ZW5kcy5zdWJzdHIoaW5kZXggKyAxKSkKKyAgICAgICAgICAgICAgICAgICAgICAgKyAiQ2xpZW50IjsKKyAgICAgIGV4dGVuZHNfY2xpZW50X25ldyA9IGV4dGVuZHMuc3Vic3RyKDAsIGluZGV4ICsgMSkgKyAiTmV3IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwdWJsaWNpemUoZXh0ZW5kcy5zdWJzdHIoaW5kZXggKyAxKSkgKyAiQ2xpZW50IjsKKyAgICB9IGVsc2UgeworICAgICAgZXh0ZW5kc19jbGllbnQgPSBwdWJsaWNpemUoZXh0ZW5kcykgKyAiQ2xpZW50IjsKKyAgICAgIGV4dGVuZHNfY2xpZW50X25ldyA9ICJOZXciICsgZXh0ZW5kc19jbGllbnQ7CisgICAgfQorICB9CisKKyAgZXh0ZW5kc19maWVsZCA9IGV4dGVuZHNfY2xpZW50LnN1YnN0cihleHRlbmRzX2NsaWVudC5maW5kKCIuIikgKyAxKTsKKworICBnZW5lcmF0ZV9nb19kb2NzdHJpbmcoZl90eXBlc18sIHRzZXJ2aWNlKTsKKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInR5cGUgIiA8PCBzZXJ2aWNlTmFtZSA8PCAiQ2xpZW50IHN0cnVjdCB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpZiAoIWV4dGVuZHNfY2xpZW50LmVtcHR5KCkpIHsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiKiIgPDwgZXh0ZW5kc19jbGllbnQgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiYyB0aHJpZnQuVENsaWVudCIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gTGVnYWN5IGNvbnN0cnVjdG9yIGZ1bmN0aW9uCisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJmdW5jIE5ldyIgPDwgc2VydmljZU5hbWUKKyAgICAgICAgICAgICA8PCAiQ2xpZW50RmFjdG9yeSh0IHRocmlmdC5UVHJhbnNwb3J0LCBmIHRocmlmdC5UUHJvdG9jb2xGYWN0b3J5KSAqIiA8PCBzZXJ2aWNlTmFtZQorICAgICAgICAgICAgIDw8ICJDbGllbnQgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gJiIgPDwgc2VydmljZU5hbWUgPDwgIkNsaWVudCI7CisKKyAgaWYgKCFleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBmX3R5cGVzXyA8PCAieyIgPDwgZXh0ZW5kc19maWVsZCA8PCAiOiAiIDw8IGV4dGVuZHNfY2xpZW50X25ldyA8PCAiRmFjdG9yeSh0LCBmKX0iOworICB9IGVsc2UgeworICAgIGluZGVudF91cCgpOworICAgIGZfdHlwZXNfIDw8ICJ7IiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJjOiB0aHJpZnQuTmV3VFN0YW5kYXJkQ2xpZW50KGYuR2V0UHJvdG9jb2wodCksIGYuR2V0UHJvdG9jb2wodCkpLCIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgLy8gTGVnYWN5IGNvbnN0cnVjdG9yIGZ1bmN0aW9uIHdpdGggY3VzdG9tIGlucHV0ICYgb3V0cHV0IHByb3RvY29scworICBmX3R5cGVzXworICAgICAgPDwgaW5kZW50KCkgPDwgImZ1bmMgTmV3IiA8PCBzZXJ2aWNlTmFtZQorICAgICAgPDwgIkNsaWVudFByb3RvY29sKHQgdGhyaWZ0LlRUcmFuc3BvcnQsIGlwcm90IHRocmlmdC5UUHJvdG9jb2wsIG9wcm90IHRocmlmdC5UUHJvdG9jb2wpICoiCisgICAgICA8PCBzZXJ2aWNlTmFtZSA8PCAiQ2xpZW50IHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuICYiIDw8IHNlcnZpY2VOYW1lIDw8ICJDbGllbnQiOworCisgIGlmICghZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl90eXBlc18gPDwgInsiIDw8IGV4dGVuZHNfZmllbGQgPDwgIjogIiA8PCBleHRlbmRzX2NsaWVudF9uZXcgPDwgIlByb3RvY29sKHQsIGlwcm90LCBvcHJvdCl9IgorICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3R5cGVzXyA8PCAieyIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiYzogdGhyaWZ0Lk5ld1RTdGFuZGFyZENsaWVudChpcHJvdCwgb3Byb3QpLCIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBDb25zdHJ1Y3RvciBmdW5jdGlvbgorICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiZnVuYyBOZXciIDw8IHNlcnZpY2VOYW1lCisgICAgPDwgIkNsaWVudChjIHRocmlmdC5UQ2xpZW50KSAqIiA8PCBzZXJ2aWNlTmFtZSA8PCAiQ2xpZW50IHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuICYiIDw8IHNlcnZpY2VOYW1lIDw8ICJDbGllbnR7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworICBpZiAoIWV4dGVuZHMuZW1wdHkoKSkgeworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8IGV4dGVuZHNfZmllbGQgPDwgIjogIiA8PCBleHRlbmRzX2NsaWVudF9uZXcgPDwgIihjKSwiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImM6IGMsIiA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgeworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJmdW5jIChwICoiIDw8IHNlcnZpY2VOYW1lIDw8ICJDbGllbnQpIENsaWVudF8oKSB0aHJpZnQuVENsaWVudCB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gcC5jIiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKworICAvLyBHZW5lcmF0ZSBjbGllbnQgbWV0aG9kIGltcGxlbWVudGF0aW9ucworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7CisgICAgc3RyaW5nIGZ1bm5hbWUgPSBwdWJsaWNpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICAvLyBPcGVuIGZ1bmN0aW9uCisgICAgZ2VuZXJhdGVfZ29fZG9jc3RyaW5nKGZfdHlwZXNfLCAoKmZfaXRlcikpOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJmdW5jIChwICoiIDw8IHNlcnZpY2VOYW1lIDw8ICJDbGllbnQpICIKKyAgICAgICAgICAgICAgIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZV9pZigqZl9pdGVyLCAiIiwgdHJ1ZSkgPDwgIiB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgc3RkOjpzdHJpbmcgbWV0aG9kID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIHN0ZDo6c3RyaW5nIGFyZ3NUeXBlID0gcHVibGljaXplKG1ldGhvZCArICJfYXJncyIsIHRydWUpOworICAgIHN0ZDo6c3RyaW5nIGFyZ3NOYW1lID0gdG1wKCJfYXJncyIpOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ2YXIgIiA8PCBhcmdzTmFtZSA8PCAiICIgPDwgYXJnc1R5cGUgPDwgZW5kbDsKKworICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCBhcmdzTmFtZSA8PCAiLiIgPDwgcHVibGljaXplKCgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgPDwgIiA9ICIgPDwgdmFyaWFibGVfbmFtZV90b19nb19uYW1lKCgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCBlbmRsOworICAgIH0KKworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgc3RkOjpzdHJpbmcgcmVzdWx0TmFtZSA9IHRtcCgiX3Jlc3VsdCIpOworICAgICAgc3RkOjpzdHJpbmcgcmVzdWx0VHlwZSA9IHB1YmxpY2l6ZShtZXRob2QgKyAiX3Jlc3VsdCIsIHRydWUpOworICAgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInZhciAiIDw8IHJlc3VsdE5hbWUgPDwgIiAiIDw8IHJlc3VsdFR5cGUgPDwgZW5kbDsKKyAgICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJpZiBlcnIgPSBwLkNsaWVudF8oKS5DYWxsKGN0eCwgXCIiCisgICAgICAgIDw8IG1ldGhvZCA8PCAiXCIsICYiIDw8IGFyZ3NOYW1lIDw8ICIsICYiIDw8IHJlc3VsdE5hbWUgPDwgIik7IGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKKworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgICAgICB0X3N0cnVjdCogeHMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKKyAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisKKyAgICAgIGlmICgheGNlcHRpb25zLmVtcHR5KCkpIHsKKyAgICAgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInN3aXRjaCB7IiA8PCBlbmRsOworCisgICAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgcHVibmFtZSA9IHB1YmxpY2l6ZSgoKnhfaXRlciktPmdldF9uYW1lKCkpOworICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGZpZWxkID0gcmVzdWx0TmFtZSArICIuIiArIHB1Ym5hbWU7CisKKyAgICAgICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiY2FzZSAiIDw8IGZpZWxkIDw8ICIhPSBuaWw6IiA8PCBlbmRsOworICAgICAgICAgIGluZGVudF91cCgpOworCisgICAgICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICAgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInJldHVybiByLCAiIDw8IGZpZWxkIDw8IGVuZGw7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gIjw8IGZpZWxkIDw8IGVuZGw7CisgICAgICAgICAgfQorCisgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgfQorCisgICAgICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInJldHVybiAiIDw8IHJlc3VsdE5hbWUgPDwgIi5HZXRTdWNjZXNzKCksIG5pbCIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gbmlsIiA8PCBlbmRsOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAvLyBUT0RPOiB3b3VsZCBiZSBuaWNlIHRvIG5vdCB0byBkdXBsaWNhdGUgdGhlIGNhbGwgZ2VuZXJhdGlvbgorICAgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImlmIGVyciA6PSBwLkNsaWVudF8oKS5DYWxsKGN0eCwgXCIiCisgICAgICA8PCBtZXRob2QgPDwgIlwiLCAmIjw8IGFyZ3NOYW1lIDw8ICIsIG5pbCk7IGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKKworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGVyciIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gbmlsIiA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgZl90eXBlc18gPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGNvbW1hbmQgbGluZSB0b29sIGZvciBtYWtpbmcgcmVtb3RlIHJlcXVlc3RzCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgcmVtb3RlIGZvci4KKyAqLwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9yZW1vdGUodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHRfc2VydmljZSogcGFyZW50ID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7CisKKyAgLy8gY29sbGVjdCBpbmhlcml0ZWQgZnVuY3Rpb25zCisgIHdoaWxlIChwYXJlbnQgIT0gTlVMTCkgeworICAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gcF9mdW5jdGlvbnMgPSBwYXJlbnQtPmdldF9mdW5jdGlvbnMoKTsKKyAgICBmdW5jdGlvbnMuaW5zZXJ0KGZ1bmN0aW9ucy5lbmQoKSwgcF9mdW5jdGlvbnMuYmVnaW4oKSwgcF9mdW5jdGlvbnMuZW5kKCkpOworICAgIHBhcmVudCA9IHBhcmVudC0+Z2V0X2V4dGVuZHMoKTsKKyAgfQorCisgIC8vIFRoaXMgZmlsZSBpcyBub3QgdXNlZnVsIGlmIHRoZXJlIGFyZSBubyBmdW5jdGlvbnM7IGRvbid0IGdlbmVyYXRlIGl0CisgIGlmIChmdW5jdGlvbnMuc2l6ZSgpID09IDApIHsKKyAgICByZXR1cm47CisgIH0KKworICBzdHJpbmcgZl9yZW1vdGVfZGlyID0gcGFja2FnZV9kaXJfICsgIi8iICsgdW5kZXJzY29yZShzZXJ2aWNlX25hbWVfKSArICItcmVtb3RlIjsKKyAgTUtESVIoZl9yZW1vdGVfZGlyLmNfc3RyKCkpOworCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgc3RyaW5nIGZfcmVtb3RlX25hbWUgPSBmX3JlbW90ZV9kaXIgKyAiLyIKKyAgICAgICAgICAgICAgICAgICAgICAgICArIHVuZGVyc2NvcmUoc2VydmljZV9uYW1lXykgKyAiLXJlbW90ZS5nbyI7CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9yZW1vdGU7CisgIGZfcmVtb3RlLm9wZW4oZl9yZW1vdGVfbmFtZS5jX3N0cigpKTsKKyAgc3RyaW5nIHNlcnZpY2VfbW9kdWxlID0gZ2V0X3JlYWxfZ29fbW9kdWxlKHByb2dyYW1fKTsKKyAgc3RyaW5nOjpzaXplX3R5cGUgbG9jOworCisgIHdoaWxlICgobG9jID0gc2VydmljZV9tb2R1bGUuZmluZCgiLiIpKSAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICBzZXJ2aWNlX21vZHVsZS5yZXBsYWNlKGxvYywgMSwgMSwgJy8nKTsKKyAgfQorICBpZiAoIWdlbl9wYWNrYWdlX3ByZWZpeF8uZW1wdHkoKSkgeworICAgIHNlcnZpY2VfbW9kdWxlID0gZ2VuX3BhY2thZ2VfcHJlZml4XyArIHNlcnZpY2VfbW9kdWxlOworICB9CisKKyAgc3RyaW5nIHVudXNlZF9wcm90ZWN0aW9uOworCisgIHN0cmluZyBjdHhQYWNrYWdlID0gImNvbnRleHQiOworCisgIGZfcmVtb3RlIDw8IGdvX2F1dG9nZW5fY29tbWVudCgpOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAicGFja2FnZSBtYWluIiA8PCBlbmRsIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJpbXBvcnQgKCIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgXCIiIDw8IGN0eFBhY2thZ2UgPDwgIlwiIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgICAgICBcImZsYWdcIiIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgXCJmbXRcIiIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgXCJtYXRoXCIiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgICAgICAgIFwibmV0XCIiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgICAgICAgIFwibmV0L3VybFwiIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgICAgICBcIm9zXCIiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgICAgICAgIFwic3RyY29udlwiIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgICAgICBcInN0cmluZ3NcIiIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgXCIiICsgZ2VuX3RocmlmdF9pbXBvcnRfICsgIlwiIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCByZW5kZXJfaW5jbHVkZWRfcHJvZ3JhbXModW51c2VkX3Byb3RlY3Rpb24pOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgICAgICBcIiIgPDwgc2VydmljZV9tb2R1bGUgPDwgIlwiIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgdW51c2VkX3Byb3RlY3Rpb247IC8vIGZpbGxlZCBpbiByZW5kZXJfaW5jbHVkZWRfcHJvZ3JhbXMoKQorICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiZnVuYyBVc2FnZSgpIHsiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIGZtdC5GcHJpbnRsbihvcy5TdGRlcnIsIFwiVXNhZ2Ugb2YgXCIsIG9zLkFyZ3NbMF0sIFwiICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlstaCBob3N0OnBvcnRdIFstdSB1cmxdIFstZltyYW1lZF1dIGZ1bmN0aW9uIFthcmcxIFthcmcyLi4uXV06XCIpIgorICAgICAgICAgICA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBmbGFnLlByaW50RGVmYXVsdHMoKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgZm10LkZwcmludGxuKG9zLlN0ZGVyciwgXCJcXG5GdW5jdGlvbnM6XCIpIiA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZl9yZW1vdGUgPDwgIiAgZm10LkZwcmludGxuKG9zLlN0ZGVyciwgXCIgICIgPDwgKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5nZXRfbmFtZSgpIDw8ICIgIgorICAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCI7CisgICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBhcmdzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj46OnNpemVfdHlwZSBudW1fYXJncyA9IGFyZ3Muc2l6ZSgpOworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworCisgICAgZm9yIChzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj46OnNpemVfdHlwZSBpID0gMDsgaSA8IG51bV9hcmdzOyArK2kpIHsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9yZW1vdGUgPDwgIiwgIjsKKyAgICAgIH0KKworICAgICAgZl9yZW1vdGUgPDwgYXJnc1tpXS0+Z2V0X3R5cGUoKS0+Z2V0X25hbWUoKSA8PCAiICIgPDwgYXJnc1tpXS0+Z2V0X25hbWUoKTsKKyAgICB9CisKKyAgICBmX3JlbW90ZSA8PCAiKVwiKSIgPDwgZW5kbDsKKyAgfQorCisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIGZtdC5GcHJpbnRsbihvcy5TdGRlcnIpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBvcy5FeGl0KDApIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgZW5kbDsKKworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAidHlwZSBodHRwSGVhZGVycyBtYXBbc3RyaW5nXXN0cmluZyIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImZ1bmMgKGggaHR0cEhlYWRlcnMpIFN0cmluZygpIHN0cmluZyB7IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICB2YXIgbSBtYXBbc3RyaW5nXXN0cmluZyA9IGgiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBmbXQuU3ByaW50ZihcIiVzXCIsIG0pIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImZ1bmMgKGggaHR0cEhlYWRlcnMpIFNldCh2YWx1ZSBzdHJpbmcpIGVycm9yIHsiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIHBhcnRzIDo9IHN0cmluZ3MuU3BsaXQodmFsdWUsIFwiOiBcIikiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIGlmIGxlbihwYXJ0cykgIT0gMiB7IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgIHJldHVybiBmbXQuRXJyb3JmKFwiaGVhZGVyIHNob3VsZCBiZSBvZiBmb3JtYXQgJ0tleTogVmFsdWUnXCIpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBoW3BhcnRzWzBdXSA9IHBhcnRzWzFdIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gbmlsIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgZW5kbDsKKworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiZnVuYyBtYWluKCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJmbGFnLlVzYWdlID0gVXNhZ2UiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ2YXIgaG9zdCBzdHJpbmciIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ2YXIgcG9ydCBpbnQiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ2YXIgcHJvdG9jb2wgc3RyaW5nIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAidmFyIHVybFN0cmluZyBzdHJpbmciIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ2YXIgZnJhbWVkIGJvb2wiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ2YXIgdXNlSHR0cCBib29sIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiaGVhZGVycyA6PSBtYWtlKGh0dHBIZWFkZXJzKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgInZhciBwYXJzZWRVcmwgKnVybC5VUkwiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ2YXIgdHJhbnMgdGhyaWZ0LlRUcmFuc3BvcnQiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJfID0gc3RyY29udi5BdG9pIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiXyA9IG1hdGguQWJzIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiZmxhZy5Vc2FnZSA9IFVzYWdlIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiZmxhZy5TdHJpbmdWYXIoJmhvc3QsIFwiaFwiLCBcImxvY2FsaG9zdFwiLCBcIlNwZWNpZnkgaG9zdCBhbmQgcG9ydFwiKSIKKyAgICAgICAgICAgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImZsYWcuSW50VmFyKCZwb3J0LCBcInBcIiwgOTA5MCwgXCJTcGVjaWZ5IHBvcnRcIikiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJmbGFnLlN0cmluZ1ZhcigmcHJvdG9jb2wsIFwiUFwiLCBcImJpbmFyeVwiLCBcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlNwZWNpZnkgdGhlIHByb3RvY29sIChiaW5hcnksIGNvbXBhY3QsIHNpbXBsZWpzb24sIGpzb24pXCIpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiZmxhZy5TdHJpbmdWYXIoJnVybFN0cmluZywgXCJ1XCIsIFwiXCIsIFwiU3BlY2lmeSB0aGUgdXJsXCIpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiZmxhZy5Cb29sVmFyKCZmcmFtZWQsIFwiZnJhbWVkXCIsIGZhbHNlLCBcIlVzZSBmcmFtZWQgdHJhbnNwb3J0XCIpIgorICAgICAgICAgICA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiZmxhZy5Cb29sVmFyKCZ1c2VIdHRwLCBcImh0dHBcIiwgZmFsc2UsIFwiVXNlIGh0dHBcIikiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJmbGFnLlZhcihoZWFkZXJzLCBcIkhcIiwgXCJIZWFkZXJzIHRvIHNldCBvbiB0aGUgaHR0cChzKSByZXF1ZXN0IChlLmcuIC1IIFxcXCJLZXk6IFZhbHVlXFxcIilcIikiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJmbGFnLlBhcnNlKCkiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJpZiBsZW4odXJsU3RyaW5nKSA+IDAgeyIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgdmFyIGVyciBlcnJvciIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgcGFyc2VkVXJsLCBlcnIgPSB1cmwuUGFyc2UodXJsU3RyaW5nKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgaWYgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgIGZtdC5GcHJpbnRsbihvcy5TdGRlcnIsIFwiRXJyb3IgcGFyc2luZyBVUkw6IFwiLCBlcnIpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgIGZsYWcuVXNhZ2UoKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgfSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgaG9zdCA9IHBhcnNlZFVybC5Ib3N0IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICB1c2VIdHRwID0gbGVuKHBhcnNlZFVybC5TY2hlbWUpIDw9IDAgfHwgcGFyc2VkVXJsLlNjaGVtZSA9PSBcImh0dHBcIiB8fCBwYXJzZWRVcmwuU2NoZW1lID09IFwiaHR0cHNcIiIKKyAgICAgICAgICAgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIn0gZWxzZSBpZiB1c2VIdHRwIHsiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIF8sIGVyciA6PSB1cmwuUGFyc2UoZm10LlNwcmludChcImh0dHA6Ly9cIiwgaG9zdCwgXCI6XCIsIHBvcnQpKSIKKyAgICAgICAgICAgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgaWYgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgIGZtdC5GcHJpbnRsbihvcy5TdGRlcnIsIFwiRXJyb3IgcGFyc2luZyBVUkw6IFwiLCBlcnIpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgIGZsYWcuVXNhZ2UoKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgfSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJjbWQgOj0gZmxhZy5BcmcoMCkiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ2YXIgZXJyIGVycm9yIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiaWYgdXNlSHR0cCB7IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICB0cmFucywgZXJyID0gdGhyaWZ0Lk5ld1RIdHRwQ2xpZW50KHBhcnNlZFVybC5TdHJpbmcoKSkiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIGlmIGxlbihoZWFkZXJzKSA+IDAgeyIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgICBodHRwdHJhbnMgOj0gdHJhbnMuKCp0aHJpZnQuVEh0dHBDbGllbnQpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgIGZvciBrZXksIHZhbHVlIDo9IHJhbmdlIGhlYWRlcnMgeyIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgICAgIGh0dHB0cmFucy5TZXRIZWFkZXIoa2V5LCB2YWx1ZSkiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgICAgfSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgfSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBwb3J0U3RyIDo9IGZtdC5TcHJpbnQocG9ydCkiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIGlmIHN0cmluZ3MuQ29udGFpbnMoaG9zdCwgXCI6XCIpIHsiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgICAgICAgICBob3N0LCBwb3J0U3RyLCBlcnIgPSBuZXQuU3BsaXRIb3N0UG9ydChob3N0KSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgIGlmIGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgICAgZm10LkZwcmludGxuKG9zLlN0ZGVyciwgXCJlcnJvciB3aXRoIGhvc3Q6XCIsIGVycikiCisgICAgICAgICAgIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgICAgICAgICAgICAgICAgIG9zLkV4aXQoMSkiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgICAgICAgICB9IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICB0cmFucywgZXJyID0gdGhyaWZ0Lk5ld1RTb2NrZXQobmV0LkpvaW5Ib3N0UG9ydChob3N0LCBwb3J0U3RyKSkiCisgICAgICAgICAgIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIGlmIGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgICBmbXQuRnByaW50bG4ob3MuU3RkZXJyLCBcImVycm9yIHJlc29sdmluZyBhZGRyZXNzOlwiLCBlcnIpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgIG9zLkV4aXQoMSkiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIGlmIGZyYW1lZCB7IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgIHRyYW5zID0gdGhyaWZ0Lk5ld1RGcmFtZWRUcmFuc3BvcnQodHJhbnMpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImlmIGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgZm10LkZwcmludGxuKG9zLlN0ZGVyciwgXCJFcnJvciBjcmVhdGluZyB0cmFuc3BvcnRcIiwgZXJyKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgb3MuRXhpdCgxKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJkZWZlciB0cmFucy5DbG9zZSgpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAidmFyIHByb3RvY29sRmFjdG9yeSB0aHJpZnQuVFByb3RvY29sRmFjdG9yeSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgInN3aXRjaCBwcm90b2NvbCB7IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiY2FzZSBcImNvbXBhY3RcIjoiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIHByb3RvY29sRmFjdG9yeSA9IHRocmlmdC5OZXdUQ29tcGFjdFByb3RvY29sRmFjdG9yeSgpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBicmVhayIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImNhc2UgXCJzaW1wbGVqc29uXCI6IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBwcm90b2NvbEZhY3RvcnkgPSB0aHJpZnQuTmV3VFNpbXBsZUpTT05Qcm90b2NvbEZhY3RvcnkoKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgYnJlYWsiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJjYXNlIFwianNvblwiOiIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgcHJvdG9jb2xGYWN0b3J5ID0gdGhyaWZ0Lk5ld1RKU09OUHJvdG9jb2xGYWN0b3J5KCkiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIGJyZWFrIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiY2FzZSBcImJpbmFyeVwiLCBcIlwiOiIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgcHJvdG9jb2xGYWN0b3J5ID0gdGhyaWZ0Lk5ld1RCaW5hcnlQcm90b2NvbEZhY3RvcnlEZWZhdWx0KCkiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIGJyZWFrIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIGZtdC5GcHJpbnRsbihvcy5TdGRlcnIsIFwiSW52YWxpZCBwcm90b2NvbCBzcGVjaWZpZWQ6IFwiLCBwcm90b2NvbCkiCisgICAgICAgICAgIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIFVzYWdlKCkiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIG9zLkV4aXQoMSkiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiaXByb3QgOj0gcHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHRyYW5zKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIm9wcm90IDo9IHByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbCh0cmFucykiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJjbGllbnQgOj0gIiA8PCBwYWNrYWdlX25hbWVfIDw8ICIuTmV3IiA8PCBwdWJsaWNpemUoc2VydmljZV9uYW1lXykKKyAgICAgICAgICAgPDwgIkNsaWVudCh0aHJpZnQuTmV3VFN0YW5kYXJkQ2xpZW50KGlwcm90LCBvcHJvdCkpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyIDo9IHRyYW5zLk9wZW4oKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBmbXQuRnByaW50bG4ob3MuU3RkZXJyLCBcIkVycm9yIG9wZW5pbmcgc29ja2V0IHRvIFwiLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJob3N0LCBcIjpcIiwgcG9ydCwgXCIgXCIsIGVycikiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIG9zLkV4aXQoMSkiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAic3dpdGNoIGNtZCB7IiA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBhcmdzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj46OnNpemVfdHlwZSBudW1fYXJncyA9IGFyZ3Muc2l6ZSgpOworICAgIHN0cmluZyBmdW5jTmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpOworICAgIHN0cmluZyBwdWJOYW1lKHB1YmxpY2l6ZShmdW5jTmFtZSkpOworICAgIHN0cmluZyBhcmd1bWVudHNOYW1lKHB1YmxpY2l6ZShmdW5jTmFtZSArICJfYXJncyIsIHRydWUpKTsKKyAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiY2FzZSBcIiIgPDwgZXNjYXBlX3N0cmluZyhmdW5jTmFtZSkgPDwgIlwiOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiaWYgZmxhZy5OQXJnKCkgLSAxICE9ICIgPDwgbnVtX2FyZ3MgPDwgIiB7IiA8PCBlbmRsOworICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIGZtdC5GcHJpbnRsbihvcy5TdGRlcnIsIFwiIiA8PCBlc2NhcGVfc3RyaW5nKHB1Yk5hbWUpIDw8ICIgcmVxdWlyZXMgIgorICAgICAgICAgICAgIDw8IG51bV9hcmdzIDw8ICIgYXJnc1wiKSIgPDwgZW5kbDsKKyAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBmbGFnLlVzYWdlKCkiIDw8IGVuZGw7CisgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgICBmb3IgKHN0ZDo6dmVjdG9yPHRfZmllbGQqPjo6c2l6ZV90eXBlIGkgPSAwOyBpIDwgbnVtX2FyZ3M7ICsraSkgeworICAgICAgc3RkOjp2ZWN0b3I8dF9maWVsZCo+OjpzaXplX3R5cGUgZmxhZ0FyZyA9IGkgKyAxOworICAgICAgdF90eXBlKiB0aGVfdHlwZShhcmdzW2ldLT5nZXRfdHlwZSgpKTsKKyAgICAgIHRfdHlwZSogdGhlX3R5cGUyKGdldF90cnVlX3R5cGUodGhlX3R5cGUpKTsKKworICAgICAgaWYgKHRoZV90eXBlMi0+aXNfZW51bSgpKSB7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ0bXAiIDw8IGkgPDwgIiwgZXJyIDo9IChzdHJjb252LkF0b2koZmxhZy5BcmcoIiA8PCBmbGFnQXJnIDw8ICIpKSkiCisgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJpZiBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIFVzYWdlKCkiIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgcmV0dXJuIiA8PCBlbmRsOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImFyZ3ZhbHVlIiA8PCBpIDw8ICIgOj0gIiA8PCBwYWNrYWdlX25hbWVfIDw8ICIuIgorICAgICAgICAgICAgICAgICA8PCBwdWJsaWNpemUodGhlX3R5cGUtPmdldF9uYW1lKCkpIDw8ICIodG1wIiA8PCBpIDw8ICIpIiA8PCBlbmRsOworICAgICAgfSBlbHNlIGlmICh0aGVfdHlwZTItPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgZSA9ICgodF9iYXNlX3R5cGUqKXRoZV90eXBlMiktPmdldF9iYXNlKCk7CisgICAgICAgIHN0cmluZyBlcnIodG1wKCJlcnIiKSk7CisKKyAgICAgICAgc3dpdGNoIChlKSB7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgICBpZiAodGhlX3R5cGUyLT5pc19iaW5hcnkoKSkgeworICAgICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImFyZ3ZhbHVlIiA8PCBpIDw8ICIgOj0gW11ieXRlKGZsYWcuQXJnKCIgPDwgZmxhZ0FyZyA8PCAiKSkiCisgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiYXJndmFsdWUiIDw8IGkgPDwgIiA6PSBmbGFnLkFyZygiIDw8IGZsYWdBcmcgPDwgIikiIDw8IGVuZGw7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiYXJndmFsdWUiIDw8IGkgPDwgIiA6PSBmbGFnLkFyZygiIDw8IGZsYWdBcmcgPDwgIikgPT0gXCJ0cnVlXCIiCisgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ0bXAiIDw8IGkgPDwgIiwgIiA8PCBlcnIgPDwgIiA6PSAoc3RyY29udi5BdG9pKGZsYWcuQXJnKCIKKyAgICAgICAgICAgICAgICAgICA8PCBmbGFnQXJnIDw8ICIpKSkiIDw8IGVuZGw7CisgICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImlmICIgPDwgZXJyIDw8ICIgIT0gbmlsIHsiIDw8IGVuZGw7CisgICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgVXNhZ2UoKSIgPDwgZW5kbDsKKyAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4iIDw8IGVuZGw7CisgICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImFyZ3ZhbHVlIiA8PCBpIDw8ICIgOj0gaW50OCh0bXAiIDw8IGkgPDwgIikiIDw8IGVuZGw7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgInRtcCIgPDwgaSA8PCAiLCAiIDw8IGVyciA8PCAiIDo9IChzdHJjb252LkF0b2koZmxhZy5BcmcoIgorICAgICAgICAgICAgICAgICAgIDw8IGZsYWdBcmcgPDwgIikpKSIgPDwgZW5kbDsKKyAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiaWYgIiA8PCBlcnIgPDwgIiAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBVc2FnZSgpIiA8PCBlbmRsOworICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiIgPDwgZW5kbDsKKyAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiYXJndmFsdWUiIDw8IGkgPDwgIiA6PSBpbnQxNih0bXAiIDw8IGkgPDwgIikiIDw8IGVuZGw7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgInRtcCIgPDwgaSA8PCAiLCAiIDw8IGVyciA8PCAiIDo9IChzdHJjb252LkF0b2koZmxhZy5BcmcoIgorICAgICAgICAgICAgICAgICAgIDw8IGZsYWdBcmcgPDwgIikpKSIgPDwgZW5kbDsKKyAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiaWYgIiA8PCBlcnIgPDwgIiAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBVc2FnZSgpIiA8PCBlbmRsOworICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiIgPDwgZW5kbDsKKyAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiYXJndmFsdWUiIDw8IGkgPDwgIiA6PSBpbnQzMih0bXAiIDw8IGkgPDwgIikiIDw8IGVuZGw7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImFyZ3ZhbHVlIiA8PCBpIDw8ICIsICIgPDwgZXJyCisgICAgICAgICAgICAgICAgICAgPDwgIiA6PSAoc3RyY29udi5QYXJzZUludChmbGFnLkFyZygiIDw8IGZsYWdBcmcgPDwgIiksIDEwLCA2NCkpIiA8PCBlbmRsOworICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJpZiAiIDw8IGVyciA8PCAiICE9IG5pbCB7IiA8PCBlbmRsOworICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIFVzYWdlKCkiIDw8IGVuZGw7CisgICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIiA8PCBlbmRsOworICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJhcmd2YWx1ZSIgPDwgaSA8PCAiLCAiIDw8IGVycgorICAgICAgICAgICAgICAgICAgIDw8ICIgOj0gKHN0cmNvbnYuUGFyc2VGbG9hdChmbGFnLkFyZygiIDw8IGZsYWdBcmcgPDwgIiksIDY0KSkiIDw8IGVuZGw7CisgICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImlmICIgPDwgZXJyIDw8ICIgIT0gbmlsIHsiIDw8IGVuZGw7CisgICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgVXNhZ2UoKSIgPDwgZW5kbDsKKyAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4iIDw8IGVuZGw7CisgICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICB0aHJvdygiSW52YWxpZCBiYXNlIHR5cGUgaW4gZ2VuZXJhdGVfc2VydmljZV9yZW1vdGUiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGZfcmVtb3RlIDw8IHB1YmxpY2l6ZShhcmdzW2ldLT5nZXRfbmFtZSgpKSA8PCAiKHN0cmNvbnYuQXRvaShmbGFnLkFyZygiIDw8IGZsYWdBcmcgPDwKKyAgICAgICAgLy8gIikpKSI7CisgICAgICB9IGVsc2UgaWYgKHRoZV90eXBlMi0+aXNfc3RydWN0KCkpIHsKKyAgICAgICAgc3RyaW5nIGFyZyh0bXAoImFyZyIpKTsKKyAgICAgICAgc3RyaW5nIG1iVHJhbnModG1wKCJtYlRyYW5zIikpOworICAgICAgICBzdHJpbmcgZXJyMSh0bXAoImVyciIpKTsKKyAgICAgICAgc3RyaW5nIGZhY3RvcnkodG1wKCJmYWN0b3J5IikpOworICAgICAgICBzdHJpbmcganNQcm90KHRtcCgianNQcm90IikpOworICAgICAgICBzdHJpbmcgZXJyMih0bXAoImVyciIpKTsKKyAgICAgICAgc3RkOjpzdHJpbmcgdHN0cnVjdF9uYW1lKHB1YmxpY2l6ZSh0aGVfdHlwZS0+Z2V0X25hbWUoKSkpOworICAgICAgICBzdGQ6OnN0cmluZyB0c3RydWN0X21vZHVsZSggbW9kdWxlX25hbWUodGhlX3R5cGUpKTsKKyAgICAgICAgaWYodHN0cnVjdF9tb2R1bGUuZW1wdHkoKSkgeworICAgICAgICAgIHRzdHJ1Y3RfbW9kdWxlID0gcGFja2FnZV9uYW1lXzsKKyAgICAgICAgfQorCisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8IGFyZyA8PCAiIDo9IGZsYWcuQXJnKCIgPDwgZmxhZ0FyZyA8PCAiKSIgPDwgZW5kbDsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgbWJUcmFucyA8PCAiIDo9IHRocmlmdC5OZXdUTWVtb3J5QnVmZmVyTGVuKGxlbigiIDw8IGFyZyA8PCAiKSkiCisgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJkZWZlciAiIDw8IG1iVHJhbnMgPDwgIi5DbG9zZSgpIiA8PCBlbmRsOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiXywgIiA8PCBlcnIxIDw8ICIgOj0gIiA8PCBtYlRyYW5zIDw8ICIuV3JpdGVTdHJpbmcoIiA8PCBhcmcgPDwgIikiCisgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJpZiAiIDw8IGVycjEgPDwgIiAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgVXNhZ2UoKSIgPDwgZW5kbDsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIiA8PCBlbmRsOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgZmFjdG9yeSA8PCAiIDo9IHRocmlmdC5OZXdUSlNPTlByb3RvY29sRmFjdG9yeSgpIiA8PCBlbmRsOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCBqc1Byb3QgPDwgIiA6PSAiIDw8IGZhY3RvcnkgPDwgIi5HZXRQcm90b2NvbCgiIDw8IG1iVHJhbnMgPDwgIikiCisgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJhcmd2YWx1ZSIgPDwgaSA8PCAiIDo9ICIgPDwgdHN0cnVjdF9tb2R1bGUgPDwgIi5OZXciIDw8IHRzdHJ1Y3RfbmFtZQorICAgICAgICAgICAgICAgICA8PCAiKCkiIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8IGVycjIgPDwgIiA6PSBhcmd2YWx1ZSIgPDwgaSA8PCAiLiIgPDwgcmVhZF9tZXRob2RfbmFtZV8gPDwgICIoIiA8PCBqc1Byb3QgPDwgIikiIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJpZiAiIDw8IGVycjIgPDwgIiAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgVXNhZ2UoKSIgPDwgZW5kbDsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIiA8PCBlbmRsOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSBpZiAodGhlX3R5cGUyLT5pc19jb250YWluZXIoKSB8fCB0aGVfdHlwZTItPmlzX3hjZXB0aW9uKCkpIHsKKyAgICAgICAgc3RyaW5nIGFyZyh0bXAoImFyZyIpKTsKKyAgICAgICAgc3RyaW5nIG1iVHJhbnModG1wKCJtYlRyYW5zIikpOworICAgICAgICBzdHJpbmcgZXJyMSh0bXAoImVyciIpKTsKKyAgICAgICAgc3RyaW5nIGZhY3RvcnkodG1wKCJmYWN0b3J5IikpOworICAgICAgICBzdHJpbmcganNQcm90KHRtcCgianNQcm90IikpOworICAgICAgICBzdHJpbmcgZXJyMih0bXAoImVyciIpKTsKKyAgICAgICAgc3RkOjpzdHJpbmcgYXJnTmFtZShwdWJsaWNpemUoYXJnc1tpXS0+Z2V0X25hbWUoKSkpOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCBhcmcgPDwgIiA6PSBmbGFnLkFyZygiIDw8IGZsYWdBcmcgPDwgIikiIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8IG1iVHJhbnMgPDwgIiA6PSB0aHJpZnQuTmV3VE1lbW9yeUJ1ZmZlckxlbihsZW4oIiA8PCBhcmcgPDwgIikpIgorICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiZGVmZXIgIiA8PCBtYlRyYW5zIDw8ICIuQ2xvc2UoKSIgPDwgZW5kbDsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIl8sICIgPDwgZXJyMSA8PCAiIDo9ICIgPDwgbWJUcmFucyA8PCAiLldyaXRlU3RyaW5nKCIgPDwgYXJnIDw8ICIpIgorICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiaWYgIiA8PCBlcnIxIDw8ICIgIT0gbmlsIHsgIiA8PCBlbmRsOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBVc2FnZSgpIiA8PCBlbmRsOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4iIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCBmYWN0b3J5IDw8ICIgOj0gdGhyaWZ0Lk5ld1RKU09OUHJvdG9jb2xGYWN0b3J5KCkiIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8IGpzUHJvdCA8PCAiIDo9ICIgPDwgZmFjdG9yeSA8PCAiLkdldFByb3RvY29sKCIgPDwgbWJUcmFucyA8PCAiKSIKKyAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImNvbnRhaW5lclN0cnVjdCIgPDwgaSA8PCAiIDo9ICIgPDwgcGFja2FnZV9uYW1lXyA8PCAiLk5ldyIKKyAgICAgICAgICAgICAgICAgPDwgYXJndW1lbnRzTmFtZSA8PCAiKCkiIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8IGVycjIgPDwgIiA6PSBjb250YWluZXJTdHJ1Y3QiIDw8IGkgPDwgIi5SZWFkRmllbGQiIDw8IChpICsgMSkgPDwgIigiCisgICAgICAgICAgICAgICAgIDw8IGpzUHJvdCA8PCAiKSIgPDwgZW5kbDsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImlmICIgPDwgZXJyMiA8PCAiICE9IG5pbCB7IiA8PCBlbmRsOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBVc2FnZSgpIiA8PCBlbmRsOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4iIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiYXJndmFsdWUiIDw8IGkgPDwgIiA6PSBjb250YWluZXJTdHJ1Y3QiIDw8IGkgPDwgIi4iIDw8IGFyZ05hbWUKKyAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93KCJJbnZhbGlkIGFyZ3VtZW50IHR5cGUgaW4gZ2VuZXJhdGVfc2VydmljZV9yZW1vdGUiKTsKKyAgICAgIH0KKworICAgICAgaWYgKHRoZV90eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgdHlwZWRlZl9tb2R1bGUoIG1vZHVsZV9uYW1lKHRoZV90eXBlKSk7CisgICAgICAgIGlmKHR5cGVkZWZfbW9kdWxlLmVtcHR5KCkpIHsKKyAgICAgICAgICB0eXBlZGVmX21vZHVsZSA9IHBhY2thZ2VfbmFtZV87CisgICAgICAgIH0KKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgInZhbHVlIiA8PCBpIDw8ICIgOj0gIiA8PCB0eXBlZGVmX21vZHVsZSA8PCAiLiIKKyAgICAgICAgICAgICAgICAgPDwgcHVibGljaXplKHRoZV90eXBlLT5nZXRfbmFtZSgpKSA8PCAiKGFyZ3ZhbHVlIiA8PCBpIDw8ICIpIiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgInZhbHVlIiA8PCBpIDw8ICIgOj0gYXJndmFsdWUiIDw8IGkgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiZm10LlByaW50KGNsaWVudC4iIDw8IHB1Yk5hbWUgPDwgIigiOworICAgIGJvb2wgYXJnRmlyc3QgPSB0cnVlOworCisgICAgZl9yZW1vdGUgPDwgImNvbnRleHQuQmFja2dyb3VuZCgpIjsKKyAgICBmb3IgKHN0ZDo6dmVjdG9yPHRfZmllbGQqPjo6c2l6ZV90eXBlIGkgPSAwOyBpIDwgbnVtX2FyZ3M7ICsraSkgeworICAgICAgaWYgKGFyZ0ZpcnN0KSB7CisgICAgICAgIGFyZ0ZpcnN0ID0gZmFsc2U7CisgICAgICAgIGZfcmVtb3RlIDw8ICIsICI7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3JlbW90ZSA8PCAiLCAiOworICAgICAgfQorCisgICAgICBpZiAoYXJnc1tpXS0+Z2V0X3R5cGUoKS0+aXNfZW51bSgpKSB7CisgICAgICAgIGZfcmVtb3RlIDw8ICJ2YWx1ZSIgPDwgaTsKKyAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXS0+Z2V0X3R5cGUoKS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSBlID0gKCh0X2Jhc2VfdHlwZSopKGFyZ3NbaV0tPmdldF90eXBlKCkpKS0+Z2V0X2Jhc2UoKTsKKworICAgICAgICBzd2l0Y2ggKGUpIHsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICAgIGZfcmVtb3RlIDw8ICJ2YWx1ZSIgPDwgaTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHRocm93KCJJbnZhbGlkIGJhc2UgdHlwZSBpbiBnZW5lcmF0ZV9zZXJ2aWNlX3JlbW90ZSIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gZl9yZW1vdGUgPDwgcHVibGljaXplKGFyZ3NbaV0tPmdldF9uYW1lKCkpIDw8ICIoc3RyY29udi5BdG9pKGZsYWcuQXJnKCIgPDwgZmxhZ0FyZyA8PAorICAgICAgICAvLyAiKSkpIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfcmVtb3RlIDw8ICJ2YWx1ZSIgPDwgaTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBmX3JlbW90ZSA8PCAiKSkiIDw8IGVuZGw7CisgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImZtdC5QcmludChcIlxcblwiKSIgPDwgZW5kbDsKKyAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiYnJlYWsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJjYXNlIFwiXCI6IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBVc2FnZSgpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBicmVhayIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBmbXQuRnByaW50bG4ob3MuU3RkZXJyLCBcIkludmFsaWQgZnVuY3Rpb24gXCIsIGNtZCkiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgLy8gQ2xvc2Ugc2VydmljZSBmaWxlCisgIGZfcmVtb3RlLmNsb3NlKCk7CisgIGZvcm1hdF9nb19vdXRwdXQoZl9yZW1vdGVfbmFtZSk7CisjaWZuZGVmIF9NU0NfVkVSCisgIC8vIE1ha2UgZmlsZSBleGVjdXRhYmxlLCBsb3ZlIHRoYXQgYml0d2lzZSBPUiBhY3Rpb24KKyAgY2htb2QoZl9yZW1vdGVfbmFtZS5jX3N0cigpLAorICAgICAgICBTX0lSVVNSIHwgU19JV1VTUiB8IFNfSVhVU1IKKyNpZm5kZWYgX1dJTjMyCisgICAgICAgIHwgU19JUkdSUCB8IFNfSVhHUlAgfCBTX0lST1RIIHwgU19JWE9USAorI2VuZGlmCisgICAgICAgICk7CisjZW5kaWYKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIHNlcnZlciBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCisgKi8KK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgLy8gR2VuZXJhdGUgdGhlIGRpc3BhdGNoIG1ldGhvZHMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX3Byb2Nlc3NvciA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19wcm9jZXNzb3JfbmV3ID0gIiI7CisgIHN0cmluZyBzZXJ2aWNlTmFtZShwdWJsaWNpemUodHNlcnZpY2UtPmdldF9uYW1lKCkpKTsKKworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgIHNpemVfdCBpbmRleCA9IGV4dGVuZHMucmZpbmQoIi4iKTsKKworICAgIGlmIChpbmRleCAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICAgIGV4dGVuZHNfcHJvY2Vzc29yID0gZXh0ZW5kcy5zdWJzdHIoMCwgaW5kZXggKyAxKSArIHB1YmxpY2l6ZShleHRlbmRzLnN1YnN0cihpbmRleCArIDEpKQorICAgICAgICAgICAgICAgICAgICAgICAgICArICJQcm9jZXNzb3IiOworICAgICAgZXh0ZW5kc19wcm9jZXNzb3JfbmV3ID0gZXh0ZW5kcy5zdWJzdHIoMCwgaW5kZXggKyAxKSArICJOZXciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHB1YmxpY2l6ZShleHRlbmRzLnN1YnN0cihpbmRleCArIDEpKSArICJQcm9jZXNzb3IiOworICAgIH0gZWxzZSB7CisgICAgICBleHRlbmRzX3Byb2Nlc3NvciA9IHB1YmxpY2l6ZShleHRlbmRzKSArICJQcm9jZXNzb3IiOworICAgICAgZXh0ZW5kc19wcm9jZXNzb3JfbmV3ID0gIk5ldyIgKyBleHRlbmRzX3Byb2Nlc3NvcjsKKyAgICB9CisgIH0KKworICBzdHJpbmcgcFNlcnZpY2VOYW1lKHByaXZhdGl6ZSh0c2VydmljZS0+Z2V0X25hbWUoKSkpOworICAvLyBHZW5lcmF0ZSB0aGUgaGVhZGVyIHBvcnRpb24KKyAgc3RyaW5nIHNlbGYodG1wKCJzZWxmIikpOworCisgIGlmIChleHRlbmRzX3Byb2Nlc3Nvci5lbXB0eSgpKSB7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInR5cGUgIiA8PCBzZXJ2aWNlTmFtZSA8PCAiUHJvY2Vzc29yIHN0cnVjdCB7IiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIHByb2Nlc3Nvck1hcCBtYXBbc3RyaW5nXXRocmlmdC5UUHJvY2Vzc29yRnVuY3Rpb24iIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgaGFuZGxlciAiIDw8IHNlcnZpY2VOYW1lIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiZnVuYyAocCAqIiA8PCBzZXJ2aWNlTmFtZQorICAgICAgICAgICAgICAgPDwgIlByb2Nlc3NvcikgQWRkVG9Qcm9jZXNzb3JNYXAoa2V5IHN0cmluZywgcHJvY2Vzc29yIHRocmlmdC5UUHJvY2Vzc29yRnVuY3Rpb24pIHsiCisgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIHAucHJvY2Vzc29yTWFwW2tleV0gPSBwcm9jZXNzb3IiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiZnVuYyAocCAqIiA8PCBzZXJ2aWNlTmFtZQorICAgICAgICAgICAgICAgPDwgIlByb2Nlc3NvcikgR2V0UHJvY2Vzc29yRnVuY3Rpb24oa2V5IHN0cmluZykgIgorICAgICAgICAgICAgICAgICAgIihwcm9jZXNzb3IgdGhyaWZ0LlRQcm9jZXNzb3JGdW5jdGlvbiwgb2sgYm9vbCkgeyIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICBwcm9jZXNzb3IsIG9rID0gcC5wcm9jZXNzb3JNYXBba2V5XSIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gcHJvY2Vzc29yLCBvayIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJmdW5jIChwICoiIDw8IHNlcnZpY2VOYW1lCisgICAgICAgICAgICAgICA8PCAiUHJvY2Vzc29yKSBQcm9jZXNzb3JNYXAoKSBtYXBbc3RyaW5nXXRocmlmdC5UUHJvY2Vzc29yRnVuY3Rpb24geyIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gcC5wcm9jZXNzb3JNYXAiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiZnVuYyBOZXciIDw8IHNlcnZpY2VOYW1lIDw8ICJQcm9jZXNzb3IoaGFuZGxlciAiIDw8IHNlcnZpY2VOYW1lCisgICAgICAgICAgICAgICA8PCAiKSAqIiA8PCBzZXJ2aWNlTmFtZSA8PCAiUHJvY2Vzc29yIHsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICBmX3R5cGVzXworICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICAiIDw8IHNlbGYgPDwgIiA6PSAmIiA8PCBzZXJ2aWNlTmFtZQorICAgICAgICA8PCAiUHJvY2Vzc29ye2hhbmRsZXI6aGFuZGxlciwgcHJvY2Vzc29yTWFwOm1ha2UobWFwW3N0cmluZ110aHJpZnQuVFByb2Nlc3NvckZ1bmN0aW9uKX0iCisgICAgICAgIDw8IGVuZGw7CisKKyAgICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgc3RyaW5nIGVzY2FwZWRGdW5jTmFtZShlc2NhcGVfc3RyaW5nKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkpOworICAgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgIiA8PCBzZWxmIDw8ICIucHJvY2Vzc29yTWFwW1wiIiA8PCBlc2NhcGVkRnVuY05hbWUgPDwgIlwiXSA9ICYiCisgICAgICAgICAgICAgICAgIDw8IHBTZXJ2aWNlTmFtZSA8PCAiUHJvY2Vzc29yIiA8PCBwdWJsaWNpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgICA8PCAie2hhbmRsZXI6aGFuZGxlcn0iIDw8IGVuZGw7CisgICAgfQorCisgICAgc3RyaW5nIHgodG1wKCJ4IikpOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gIiA8PCBzZWxmIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiZnVuYyAocCAqIiA8PCBzZXJ2aWNlTmFtZQorICAgICAgICAgICAgICAgPDwgIlByb2Nlc3NvcikgUHJvY2VzcyhjdHggY29udGV4dC5Db250ZXh0LCBpcHJvdCwgb3Byb3QgdGhyaWZ0LlRQcm90b2NvbCkgKHN1Y2Nlc3MgYm9vbCwgZXJyICIKKyAgICAgICAgICAgICAgICAgICJ0aHJpZnQuVEV4Y2VwdGlvbikgeyIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICBuYW1lLCBfLCBzZXFJZCwgZXJyIDo9IGlwcm90LlJlYWRNZXNzYWdlQmVnaW4oKSIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICBpZiBlcnIgIT0gbmlsIHsgcmV0dXJuIGZhbHNlLCBlcnIgfSIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICBpZiBwcm9jZXNzb3IsIG9rIDo9IHAuR2V0UHJvY2Vzc29yRnVuY3Rpb24obmFtZSk7IG9rIHsiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgICByZXR1cm4gcHJvY2Vzc29yLlByb2Nlc3MoY3R4LCBzZXFJZCwgaXByb3QsIG9wcm90KSIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIGlwcm90LlNraXAodGhyaWZ0LlNUUlVDVCkiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgaXByb3QuUmVhZE1lc3NhZ2VFbmQoKSIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICAiIDw8IHgKKyAgICAgICAgICAgICAgIDw8ICIgOj0gdGhyaWZ0Lk5ld1RBcHBsaWNhdGlvbkV4Y2VwdGlvbih0aHJpZnQuVU5LTk9XTl9NRVRIT0QsIFwiVW5rbm93biBmdW5jdGlvbiAiCisgICAgICAgICAgICAgICAgICAiXCIgKyBuYW1lKSIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICBvcHJvdC5Xcml0ZU1lc3NhZ2VCZWdpbihuYW1lLCB0aHJpZnQuRVhDRVBUSU9OLCBzZXFJZCkiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgIiA8PCB4IDw8ICIuV3JpdGUob3Byb3QpIiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIG9wcm90LldyaXRlTWVzc2FnZUVuZCgpIiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIG9wcm90LkZsdXNoKGN0eCkiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGZhbHNlLCAiIDw8IHggPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiIiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInR5cGUgIiA8PCBzZXJ2aWNlTmFtZSA8PCAiUHJvY2Vzc29yIHN0cnVjdCB7IiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgICoiIDw8IGV4dGVuZHNfcHJvY2Vzc29yIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiZnVuYyBOZXciIDw8IHNlcnZpY2VOYW1lIDw8ICJQcm9jZXNzb3IoaGFuZGxlciAiIDw8IHNlcnZpY2VOYW1lCisgICAgICAgICAgICAgICA8PCAiKSAqIiA8PCBzZXJ2aWNlTmFtZSA8PCAiUHJvY2Vzc29yIHsiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgIiA8PCBzZWxmIDw8ICIgOj0gJiIgPDwgc2VydmljZU5hbWUgPDwgIlByb2Nlc3NvcnsiCisgICAgICAgICAgICAgICA8PCBleHRlbmRzX3Byb2Nlc3Nvcl9uZXcgPDwgIihoYW5kbGVyKX0iIDw8IGVuZGw7CisKKyAgICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgc3RyaW5nIGVzY2FwZWRGdW5jTmFtZShlc2NhcGVfc3RyaW5nKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkpOworICAgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgIiA8PCBzZWxmIDw8ICIuQWRkVG9Qcm9jZXNzb3JNYXAoXCIiIDw8IGVzY2FwZWRGdW5jTmFtZQorICAgICAgICAgICAgICAgICA8PCAiXCIsICYiIDw8IHBTZXJ2aWNlTmFtZSA8PCAiUHJvY2Vzc29yIiA8PCBwdWJsaWNpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgICA8PCAie2hhbmRsZXI6aGFuZGxlcn0pIiA8PCBlbmRsOworICAgIH0KKworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IHNlbGYgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICB9CisKKyAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3Mgc3ViZnVuY3Rpb25zCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0c2VydmljZSwgKmZfaXRlcik7CisgIH0KKworICBmX3R5cGVzXyA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHByb2Nlc3MgZnVuY3Rpb24gZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byB3cml0ZSBhIGRpc3BhdGNoZXIgZm9yCisgKi8KK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIC8vIE9wZW4gZnVuY3Rpb24KKyAgc3RyaW5nIHByb2Nlc3Nvck5hbWUgPSBwcml2YXRpemUodHNlcnZpY2UtPmdldF9uYW1lKCkpICsgIlByb2Nlc3NvciIKKyAgICAgICAgICAgICAgICAgICAgICAgICArIHB1YmxpY2l6ZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpOworICBzdHJpbmcgYXJnc25hbWUgPSBwdWJsaWNpemUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9hcmdzIiwgdHJ1ZSk7CisgIHN0cmluZyByZXN1bHRuYW1lID0gcHVibGljaXplKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0IiwgdHJ1ZSk7CisKKyAgLy8gdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIC8vIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ0eXBlICIgPDwgcHJvY2Vzc29yTmFtZSA8PCAiIHN0cnVjdCB7IiA8PCBlbmRsOworICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICBoYW5kbGVyICIgPDwgcHVibGljaXplKHRzZXJ2aWNlLT5nZXRfbmFtZSgpKSA8PCBlbmRsOworICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiZnVuYyAocCAqIiA8PCBwcm9jZXNzb3JOYW1lCisgICAgICAgICAgICAgPDwgIikgUHJvY2VzcyhjdHggY29udGV4dC5Db250ZXh0LCBzZXFJZCBpbnQzMiwgaXByb3QsIG9wcm90IHRocmlmdC5UUHJvdG9jb2wpIChzdWNjZXNzIGJvb2wsIGVyciAiCisgICAgICAgICAgICAgICAgInRocmlmdC5URXhjZXB0aW9uKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImFyZ3MgOj0gIiA8PCBhcmdzbmFtZSA8PCAie30iIDw8IGVuZGw7CisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJpZiBlcnIgPSBhcmdzLiIgPDwgcmVhZF9tZXRob2RfbmFtZV8gPDwgICIoaXByb3QpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIGlwcm90LlJlYWRNZXNzYWdlRW5kKCkiIDw8IGVuZGw7CisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAiICB4IDo9IHRocmlmdC5OZXdUQXBwbGljYXRpb25FeGNlcHRpb24odGhyaWZ0LlBST1RPQ09MX0VSUk9SLCBlcnIuRXJyb3IoKSkiCisgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIG9wcm90LldyaXRlTWVzc2FnZUJlZ2luKFwiIiA8PCBlc2NhcGVfc3RyaW5nKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkKKyAgICAgICAgICAgICAgIDw8ICJcIiwgdGhyaWZ0LkVYQ0VQVElPTiwgc2VxSWQpIiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIHguV3JpdGUob3Byb3QpIiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIG9wcm90LldyaXRlTWVzc2FnZUVuZCgpIiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIG9wcm90LkZsdXNoKGN0eCkiIDw8IGVuZGw7CisgIH0KKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGZhbHNlLCBlcnIiIDw8IGVuZGw7CisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJpcHJvdC5SZWFkTWVzc2FnZUVuZCgpIiA8PCBlbmRsOworCisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQgOj0gIiA8PCByZXN1bHRuYW1lIDw8ICJ7fSIgPDwgZW5kbDsKKyAgfQorICBib29sIG5lZWRfcmVmZXJlbmNlID0gdHlwZV9uZWVkX3JlZmVyZW5jZSh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpOworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgZl90eXBlc18gPDwgInZhciByZXR2YWwgIiA8PCB0eXBlX3RvX2dvX3R5cGUodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKSA8PCBlbmRsOworICB9CisKKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInZhciBlcnIyIGVycm9yIiA8PCBlbmRsOworICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiaWYgIjsKKworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICBmX3R5cGVzXyA8PCAicmV0dmFsLCAiOworICAgIH0KKyAgfQorCisgIC8vIEdlbmVyYXRlIHRoZSBmdW5jdGlvbiBjYWxsCisgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZl90eXBlc18gPDwgImVycjIgPSBwLmhhbmRsZXIuIiA8PCBwdWJsaWNpemUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSA8PCAiKCI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworCisgIGZfdHlwZXNfIDw8ICJjdHgiOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIGZfdHlwZXNfIDw8ICIsICI7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfdHlwZXNfIDw8ICIsICI7CisgICAgfQorCisgICAgZl90eXBlc18gPDwgImFyZ3MuIiA8PCBwdWJsaWNpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgfQorCisgIGZfdHlwZXNfIDw8ICIpOyBlcnIyICE9IG5pbCB7IiA8PCBlbmRsOworCisgIHRfc3RydWN0KiBleGNlcHRpb25zID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIHhfZmllbGRzID0gZXhjZXB0aW9ucy0+Z2V0X21lbWJlcnMoKTsKKyAgaWYgKCF4X2ZpZWxkcy5lbXB0eSgpKSB7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInN3aXRjaCB2IDo9IGVycjIuKHR5cGUpIHsiIDw8IGVuZGw7CisKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4Zl9pdGVyOworCisgICAgZm9yICh4Zl9pdGVyID0geF9maWVsZHMuYmVnaW4oKTsgeGZfaXRlciAhPSB4X2ZpZWxkcy5lbmQoKTsgKyt4Zl9pdGVyKSB7CisgICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICBjYXNlICIgPDwgdHlwZV90b19nb190eXBlKCgoKnhmX2l0ZXIpLT5nZXRfdHlwZSgpKSkgPDwgIjoiCisgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LiIgPDwgcHVibGljaXplKCgqeGZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIgPSB2IiA8PCBlbmRsOworICAgIH0KKworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIGRlZmF1bHQ6IiA8PCBlbmRsOworICB9CisKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgeCA6PSB0aHJpZnQuTmV3VEFwcGxpY2F0aW9uRXhjZXB0aW9uKHRocmlmdC5JTlRFUk5BTF9FUlJPUiwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiSW50ZXJuYWwgZXJyb3IgcHJvY2Vzc2luZyAiIDw8IGVzY2FwZV9zdHJpbmcodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgPDwgIjogXCIgKyBlcnIyLkVycm9yKCkpIiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIG9wcm90LldyaXRlTWVzc2FnZUJlZ2luKFwiIiA8PCBlc2NhcGVfc3RyaW5nKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkKKyAgICAgICAgICAgICAgIDw8ICJcIiwgdGhyaWZ0LkVYQ0VQVElPTiwgc2VxSWQpIiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIHguV3JpdGUob3Byb3QpIiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIG9wcm90LldyaXRlTWVzc2FnZUVuZCgpIiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIG9wcm90LkZsdXNoKGN0eCkiIDw8IGVuZGw7CisgIH0KKworICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdHJ1ZSwgZXJyMiIgPDwgZW5kbDsKKworICBpZiAoIXhfZmllbGRzLmVtcHR5KCkpIHsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgfQorCisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ9IjsgLy8gY2xvc2VzIGVycjIgIT0gbmlsCisKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgZl90eXBlc18gPDwgIiBlbHNlIHsiIDw8IGVuZGw7IC8vIG1ha2Ugc3VyZSB3ZSBzZXQgU3VjY2VzcyByZXR2YWwgb25seSBvbiBzdWNjZXNzCisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQuU3VjY2VzcyA9ICI7CisgICAgICBpZiAobmVlZF9yZWZlcmVuY2UpIHsKKyAgICAgICAgZl90eXBlc18gPDwgIiYiOworICAgICAgfQorICAgICAgZl90eXBlc18gPDwgInJldHZhbCIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBmX3R5cGVzXyA8PCAifSIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgZl90eXBlc18gPDwgZW5kbDsKKyAgICB9CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImlmIGVycjIgPSBvcHJvdC5Xcml0ZU1lc3NhZ2VCZWdpbihcIiIKKyAgICAgICAgICAgICAgIDw8IGVzY2FwZV9zdHJpbmcodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSA8PCAiXCIsIHRocmlmdC5SRVBMWSwgc2VxSWQpOyBlcnIyICE9IG5pbCB7IgorICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICBlcnIgPSBlcnIyIiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJpZiBlcnIyID0gcmVzdWx0LiIgPDwgd3JpdGVfbWV0aG9kX25hbWVfIDw8ICIob3Byb3QpOyBlcnIgPT0gbmlsICYmIGVycjIgIT0gbmlsIHsiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgZXJyID0gZXJyMiIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyMiA9IG9wcm90LldyaXRlTWVzc2FnZUVuZCgpOyBlcnIgPT0gbmlsICYmIGVycjIgIT0gbmlsIHsiCisgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIGVyciA9IGVycjIiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImlmIGVycjIgPSBvcHJvdC5GbHVzaChjdHgpOyBlcnIgPT0gbmlsICYmIGVycjIgIT0gbmlsIHsiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgZXJyID0gZXJyMiIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHRydWUsIGVyciIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBmX3R5cGVzXyA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gdHJ1ZSwgbmlsIiA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogRGVzZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCisgKi8KK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVjbGFyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNvZXJjZURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlua2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9jb250YWluZXJfdmFsdWUpIHsKKyAgKHZvaWQpaW5jbGFzczsKKyAgKHZvaWQpY29lcmNlRGF0YTsKKyAgdF90eXBlKiBvcmlnX3R5cGUgPSB0ZmllbGQtPmdldF90eXBlKCk7CisgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUob3JpZ190eXBlKTsKKyAgc3RyaW5nIG5hbWUocHJlZml4ICsgcHVibGljaXplKHRmaWVsZC0+Z2V0X25hbWUoKSkpOworCisgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIERFU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIG5hbWU7CisgIH0KKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0X3N0cnVjdCopdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfcG9pbnRlcl9maWVsZCh0ZmllbGQsIGluX2NvbnRhaW5lcl92YWx1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2xhcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG91dCwgb3JpZ190eXBlLCBpc19wb2ludGVyX2ZpZWxkKHRmaWVsZCksIGRlY2xhcmUsIG5hbWUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgeworCisgICAgaWYgKGRlY2xhcmUpIHsKKyAgICAgIHN0cmluZyB0eXBlX25hbWUgPSBpbmtleSA/IHR5cGVfdG9fZ29fa2V5X3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdHlwZV90b19nb190eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisKKyAgICAgIG91dCA8PCAidmFyICIgPDwgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgIiA8PCB0eXBlX25hbWUgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgdiwgZXJyIDo9IGlwcm90LiI7CisKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpICYmICFpbmtleSkgeworICAgICAgICAgIG91dCA8PCAiUmVhZEJpbmFyeSgpIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgPDwgIlJlYWRTdHJpbmcoKSI7CisgICAgICAgIH0KKworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICBvdXQgPDwgIlJlYWRCb29sKCkiOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgb3V0IDw8ICJSZWFkQnl0ZSgpIjsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICBvdXQgPDwgIlJlYWRJMTYoKSI7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgb3V0IDw8ICJSZWFkSTMyKCkiOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIG91dCA8PCAiUmVhZEk2NCgpIjsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICBvdXQgPDwgIlJlYWREb3VibGUoKSI7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEdvIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgb3V0IDw8ICJSZWFkSTMyKCkiOworICAgIH0KKworICAgIG91dCA8PCAiOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gdGhyaWZ0LlByZXBlbmRFcnJvcihcImVycm9yIHJlYWRpbmcgZmllbGQgIiA8PCB0ZmllbGQtPmdldF9rZXkoKQorICAgICAgICA8PCAiOiBcIiwgZXJyKSIgPDwgZW5kbDsKKworICAgIG91dCA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgICAgc3RyaW5nIHdyYXA7CisKKyAgICBpZiAodHlwZS0+aXNfZW51bSgpIHx8IG9yaWdfdHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgICB3cmFwID0gcHVibGljaXplKHR5cGVfbmFtZShvcmlnX3R5cGUpKTsKKyAgICB9IGVsc2UgaWYgKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpID09IHRfYmFzZV90eXBlOjpUWVBFX0k4KSB7CisgICAgICB3cmFwID0gImludDgiOworICAgIH0KKworICAgIHN0cmluZyBtYXliZV9hZGRyZXNzID0gKGlzX3BvaW50ZXJfZmllbGQodGZpZWxkKSA/ICImIiA6ICIiKTsKKyAgICBpZiAod3JhcCA9PSAiIikgeworICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiID0gIiA8PCBtYXliZV9hZGRyZXNzIDw8ICJ2IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAidGVtcCA6PSAiIDw8IHdyYXAgPDwgIih2KSIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIiA9ICIgPDwgbWF5YmVfYWRkcmVzcyA8PCAidGVtcCIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBvdXQgPDwgIn0iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZCAnIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiJyBmb3IgZmllbGQgJyIKKyAgICAgICAgKyB0ZmllbGQtPmdldF9uYW1lKCkgKyAiJyI7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYW4gdW5zZXJpYWxpemVyIGZvciBhIHN0cnVjdCwgY2FsbGluZyByZWFkKCkKKyAqLwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHBvaW50ZXJfZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWNsYXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIGVxKGRlY2xhcmUgPyAiIDo9ICIgOiAiID0gIik7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCBlcSA8PCAocG9pbnRlcl9maWVsZCA/ICImIiA6ICIiKTsKKyAgZ2VuZXJhdGVfZ29fc3RydWN0X2luaXRpYWxpemVyKG91dCwgdHN0cnVjdCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyIDo9ICIgPDwgcHJlZml4IDw8ICIuIiA8PCByZWFkX21ldGhvZF9uYW1lXyA8PCAgIihpcHJvdCk7IGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0aHJpZnQuUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKFwiJVQgZXJyb3IgcmVhZGluZyBzdHJ1Y3Q6IFwiLCAiCisgICAgICA8PCBwcmVmaXggPDwgIiksIGVycikiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKK30KKworLyoqCisgKiBTZXJpYWxpemUgYSBjb250YWluZXIgYnkgd3JpdGluZyBvdXQgdGhlIGhlYWRlciBmb2xsb3dlZCBieQorICogZGF0YSBhbmQgdGhlbiBhIGZvb3Rlci4KKyAqLwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIG9yaWdfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHBvaW50ZXJfZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWNsYXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgdF90eXBlKiB0dHlwZSA9IGdldF90cnVlX3R5cGUob3JpZ190eXBlKTsKKyAgc3RyaW5nIGVxKCIgPSAiKTsKKworICBpZiAoZGVjbGFyZSkgeworICAgIGVxID0gIiA6PSAiOworICB9CisKKyAgLy8gRGVjbGFyZSB2YXJpYWJsZXMsIHJlYWQgaGVhZGVyCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIl8sIF8sIHNpemUsIGVyciA6PSBpcHJvdC5SZWFkTWFwQmVnaW4oKSIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRocmlmdC5QcmVwZW5kRXJyb3IoXCJlcnJvciByZWFkaW5nIG1hcCBiZWdpbjogXCIsIGVycikiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidE1hcCA6PSBtYWtlKCIgPDwgdHlwZV90b19nb190eXBlKG9yaWdfdHlwZSkgPDwgIiwgc2l6ZSkiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCBlcSA8PCAiICIgPDwgKHBvaW50ZXJfZmllbGQgPyAiJiIgOiAiIikgPDwgInRNYXAiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJfLCBzaXplLCBlcnIgOj0gaXByb3QuUmVhZFNldEJlZ2luKCkiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0aHJpZnQuUHJlcGVuZEVycm9yKFwiZXJyb3IgcmVhZGluZyBzZXQgYmVnaW46IFwiLCBlcnIpIiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRTZXQgOj0gbWFrZSgiIDw8IHR5cGVfdG9fZ29fdHlwZShvcmlnX3R5cGUpIDw8ICIsIDAsIHNpemUpIiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgZXEgPDwgIiAiIDw8IChwb2ludGVyX2ZpZWxkID8gIiYiIDogIiIpIDw8ICJ0U2V0IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIl8sIHNpemUsIGVyciA6PSBpcHJvdC5SZWFkTGlzdEJlZ2luKCkiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0aHJpZnQuUHJlcGVuZEVycm9yKFwiZXJyb3IgcmVhZGluZyBsaXN0IGJlZ2luOiBcIiwgZXJyKSIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0U2xpY2UgOj0gbWFrZSgiIDw8IHR5cGVfdG9fZ29fdHlwZShvcmlnX3R5cGUpIDw8ICIsIDAsIHNpemUpIiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgZXEgPDwgIiAiIDw8IChwb2ludGVyX2ZpZWxkID8gIiYiIDogIiIpIDw8ICJ0U2xpY2UiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIgJyIgKyB0dHlwZS0+Z2V0X25hbWUoKSArICInIGZvciBwcmVmaXggJyIKKyAgICAgICAgKyBwcmVmaXggKyAiJyI7CisgIH0KKworICAvLyBGb3IgbG9vcCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiZm9yIGkgOj0gMDsgaSA8IHNpemU7IGkgKysgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaWYgKHBvaW50ZXJfZmllbGQpIHsKKyAgICBwcmVmaXggPSAiKCoiICsgcHJlZml4ICsgIikiOworICB9CisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIGRlY2xhcmUsIHByZWZpeCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBkZWNsYXJlLCBwcmVmaXgpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgZGVjbGFyZSwgcHJlZml4KTsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICAvLyBSZWFkIGNvbnRhaW5lciBlbmQKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyIDo9IGlwcm90LlJlYWRNYXBFbmQoKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhyaWZ0LlByZXBlbmRFcnJvcihcImVycm9yIHJlYWRpbmcgbWFwIGVuZDogXCIsIGVycikiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyIDo9IGlwcm90LlJlYWRTZXRFbmQoKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhyaWZ0LlByZXBlbmRFcnJvcihcImVycm9yIHJlYWRpbmcgc2V0IGVuZDogXCIsIGVycikiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGVyciA6PSBpcHJvdC5SZWFkTGlzdEVuZCgpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0aHJpZnQuUHJlcGVuZEVycm9yKFwiZXJyb3IgcmVhZGluZyBsaXN0IGVuZDogXCIsIGVycikiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGNvZGUgdG8gZGVzZXJpYWxpemUgYSBtYXAKKyAqLwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlY2xhcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7CisgICh2b2lkKWRlY2xhcmU7CisgIHN0cmluZyBrZXkgPSB0bXAoIl9rZXkiKTsKKyAgc3RyaW5nIHZhbCA9IHRtcCgiX3ZhbCIpOworICB0X2ZpZWxkIGZrZXkodG1hcC0+Z2V0X2tleV90eXBlKCksIGtleSk7CisgIHRfZmllbGQgZnZhbCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdmFsKTsKKyAgZmtleS5zZXRfcmVxKHRfZmllbGQ6OlRfT1BUX0lOX1JFUV9PVVQpOworICBmdmFsLnNldF9yZXEodF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVCk7CisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZrZXksIHRydWUsICIiLCBmYWxzZSwgZmFsc2UsIHRydWUpOworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmdmFsLCB0cnVlLCAiIiwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7CisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiWyIgPDwga2V5IDw8ICJdID0gIiA8PCB2YWwgPDwgZW5kbDsKK30KKworLyoqCisgKiBXcml0ZSBhIHNldCBlbGVtZW50CisgKi8KK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0c2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWNsYXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgeworICAodm9pZClkZWNsYXJlOworICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKKyAgdF9maWVsZCBmZWxlbSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOworICBmZWxlbS5zZXRfcmVxKHRfZmllbGQ6OlRfT1BUX0lOX1JFUV9PVVQpOworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSwgdHJ1ZSwgIiIsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUpOworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiA9IGFwcGVuZCgiIDw8IHByZWZpeCA8PCAiLCAiIDw8IGVsZW0gPDwgIikiIDw8IGVuZGw7Cit9CisKKy8qKgorICogV3JpdGUgYSBsaXN0IGVsZW1lbnQKKyAqLwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVjbGFyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7CisgICh2b2lkKWRlY2xhcmU7CisgIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOworICB0X2ZpZWxkIGZlbGVtKCgodF9saXN0Kil0bGlzdCktPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7CisgIGZlbGVtLnNldF9yZXEodF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVCk7CisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtLCB0cnVlLCAiIiwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7CisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiID0gYXBwZW5kKCIgPDwgcHJlZml4IDw8ICIsICIgPDwgZWxlbSA8PCAiKSIgPDwgZW5kbDsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCisgKgorICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQgdG8gc2VyaWFsaXplCisgKiBAcGFyYW0gcHJlZml4IE5hbWUgdG8gcHJlcGVuZCB0byBmaWVsZCBuYW1lCisgKi8KK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmtleSkgeworICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisgIHN0cmluZyBuYW1lKHByZWZpeCArIHB1YmxpY2l6ZSh0ZmllbGQtPmdldF9uYW1lKCkpKTsKKworICAvLyBEbyBub3RoaW5nIGZvciB2b2lkIHR5cGVzCisgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBnZW5lcmF0ZSBzZXJpYWxpemUgZm9yIHZvaWQgdHlwZTogIiArIG5hbWU7CisgIH0KKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIG5hbWUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIGlzX3BvaW50ZXJfZmllbGQodGZpZWxkKSwgbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlmIGVyciA6PSBvcHJvdC4iOworCisgICAgaWYgKGlzX3BvaW50ZXJfZmllbGQodGZpZWxkKSkgeworICAgICAgbmFtZSA9ICIqIiArIG5hbWU7CisgICAgfQorCisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSAmJiAhaW5rZXkpIHsKKyAgICAgICAgICBvdXQgPDwgIldyaXRlQmluYXJ5KCIgPDwgbmFtZSA8PCAiKSI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgb3V0IDw8ICJXcml0ZVN0cmluZyhzdHJpbmcoIiA8PCBuYW1lIDw8ICIpKSI7CisgICAgICAgIH0KKworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICBvdXQgPDwgIldyaXRlQm9vbChib29sKCIgPDwgbmFtZSA8PCAiKSkiOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgb3V0IDw8ICJXcml0ZUJ5dGUoaW50OCgiIDw8IG5hbWUgPDwgIikpIjsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICBvdXQgPDwgIldyaXRlSTE2KGludDE2KCIgPDwgbmFtZSA8PCAiKSkiOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgIG91dCA8PCAiV3JpdGVJMzIoaW50MzIoIiA8PCBuYW1lIDw8ICIpKSI7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgb3V0IDw8ICJXcml0ZUk2NChpbnQ2NCgiIDw8IG5hbWUgPDwgIikpIjsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICBvdXQgPDwgIldyaXRlRG91YmxlKGZsb2F0NjQoIiA8PCBuYW1lIDw8ICIpKSI7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEdvIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgb3V0IDw8ICJXcml0ZUkzMihpbnQzMigiIDw8IG5hbWUgPDwgIikpIjsKKyAgICB9CisKKyAgICBvdXQgPDwgIjsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHRocmlmdC5QcmVwZW5kRXJyb3IoZm10LlNwcmludGYoXCIlVC4iCisgICAgICAgIDw8IGVzY2FwZV9zdHJpbmcodGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiICgiIDw8IHRmaWVsZC0+Z2V0X2tleSgpCisgICAgICAgIDw8ICIpIGZpZWxkIHdyaXRlIGVycm9yOiBcIiwgcCksIGVycikgfSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IEludmFsaWQgdHlwZSBpbiBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQgJyIgKyB0eXBlLT5nZXRfbmFtZSgpCisgICAgICAgICsgIicgZm9yIGZpZWxkICciICsgbmFtZSArICInIjsKKyAgfQorfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgYWxsIHRoZSBtZW1iZXJzIG9mIGEgc3RydWN0LgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgdG8gc2VyaWFsaXplCisgKiBAcGFyYW0gcHJlZml4ICBTdHJpbmcgcHJlZml4IHRvIGF0dGFjaCB0byBhbGwgZmllbGRzCisgKi8KK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCkgeworICAodm9pZCl0c3RydWN0OworICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGVyciA6PSAiIDw8IHByZWZpeCA8PCAiLiIgPDwgd3JpdGVfbWV0aG9kX25hbWVfIDw8ICIob3Byb3QpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhyaWZ0LlByZXBlbmRFcnJvcihmbXQuU3ByaW50ZihcIiVUIGVycm9yIHdyaXRpbmcgc3RydWN0OiBcIiwgIgorICAgICAgPDwgcHJlZml4IDw8ICIpLCBlcnIpIiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHBvaW50ZXJfZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgaWYgKHBvaW50ZXJfZmllbGQpIHsKKyAgICBwcmVmaXggPSAiKiIgKyBwcmVmaXg7CisgIH0KKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyIDo9IG9wcm90LldyaXRlTWFwQmVnaW4oIgorICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgPDwgIiwgIgorICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwgIgorICAgICAgICA8PCAibGVuKCIgPDwgcHJlZml4IDw8ICIpKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhyaWZ0LlByZXBlbmRFcnJvcihcImVycm9yIHdyaXRpbmcgbWFwIGJlZ2luOiBcIiwgZXJyKSIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBlcnIgOj0gb3Byb3QuV3JpdGVTZXRCZWdpbigiCisgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgIgorICAgICAgICA8PCAibGVuKCIgPDwgcHJlZml4IDw8ICIpKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhyaWZ0LlByZXBlbmRFcnJvcihcImVycm9yIHdyaXRpbmcgc2V0IGJlZ2luOiBcIiwgZXJyKSIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyIDo9IG9wcm90LldyaXRlTGlzdEJlZ2luKCIKKyAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgIgorICAgICAgICA8PCAibGVuKCIgPDwgcHJlZml4IDw8ICIpKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhyaWZ0LlByZXBlbmRFcnJvcihcImVycm9yIHdyaXRpbmcgbGlzdCBiZWdpbjogXCIsIGVycikiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHRocm93ICJjb21waWxlciBlcnJvcjogSW52YWxpZCB0eXBlIGluIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIgJyIgKyB0dHlwZS0+Z2V0X25hbWUoKQorICAgICAgICArICInIGZvciBwcmVmaXggJyIgKyBwcmVmaXggKyAiJyI7CisgIH0KKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgdF9tYXAqIHRtYXAgPSAodF9tYXAqKXR0eXBlOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZm9yIGssIHYgOj0gcmFuZ2UgIiA8PCBwcmVmaXggPDwgIiB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsIHRtYXAsICJrIiwgInYiKTsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIHRfc2V0KiB0c2V0ID0gKHRfc2V0Kil0dHlwZTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImZvciBpIDo9IDA7IGk8bGVuKCIgPDwgcHJlZml4IDw8ICIpOyBpKysgeyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgZm9yIGogOj0gaSsxOyBqPGxlbigiIDw8IHByZWZpeCA8PCAiKTsgaisrIHsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgaWYgcmVmbGVjdC5EZWVwRXF1YWwoIiA8PCBwcmVmaXggPDwgIltpXSwiIDw8IHByZWZpeCA8PCAiW2pdKSB7ICIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICAgIHJldHVybiB0aHJpZnQuUHJlcGVuZEVycm9yKFwiXCIsIGZtdC5FcnJvcmYoXCIlVCBlcnJvciB3cml0aW5nIHNldCBmaWVsZDogc2xpY2UgaXMgbm90IHVuaXF1ZVwiLCAiIDw8IHByZWZpeCA8PCAiW2ldKSkiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgfSIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgfSIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJmb3IgXywgdiA6PSByYW5nZSAiIDw8IHByZWZpeCA8PCAiIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgdHNldCwgInYiKTsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICB0X2xpc3QqIHRsaXN0ID0gKHRfbGlzdCopdHR5cGU7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJmb3IgXywgdiA6PSByYW5nZSAiIDw8IHByZWZpeCA8PCAiIHsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgdGxpc3QsICJ2Iik7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgfQorCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGVyciA6PSBvcHJvdC5Xcml0ZU1hcEVuZCgpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0aHJpZnQuUHJlcGVuZEVycm9yKFwiZXJyb3Igd3JpdGluZyBtYXAgZW5kOiBcIiwgZXJyKSIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBlcnIgOj0gb3Byb3QuV3JpdGVTZXRFbmQoKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhyaWZ0LlByZXBlbmRFcnJvcihcImVycm9yIHdyaXRpbmcgc2V0IGVuZDogXCIsIGVycikiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGVyciA6PSBvcHJvdC5Xcml0ZUxpc3RFbmQoKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhyaWZ0LlByZXBlbmRFcnJvcihcImVycm9yIHdyaXRpbmcgbGlzdCBlbmQ6IFwiLCBlcnIpIiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBtYXAuCisgKgorICovCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBraXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdml0ZXIpIHsKKyAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksICIiKTsKKyAgdF9maWVsZCB2ZmllbGQodG1hcC0+Z2V0X3ZhbF90eXBlKCksICIiKTsKKyAga2ZpZWxkLnNldF9yZXEodF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVCk7CisgIHZmaWVsZC5zZXRfcmVxKHRfZmllbGQ6OlRfT1BUX0lOX1JFUV9PVVQpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAma2ZpZWxkLCBraXRlciwgdHJ1ZSk7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZ2ZmllbGQsIHZpdGVyKTsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgc2V0LgorICovCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIHByZWZpeCkgeworICB0X2ZpZWxkIGVmaWVsZCh0c2V0LT5nZXRfZWxlbV90eXBlKCksICIiKTsKKyAgZWZpZWxkLnNldF9yZXEodF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVCk7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsIHByZWZpeCk7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIGxpc3QuCisgKi8KK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdHJpbmcgcHJlZml4KSB7CisgIHRfZmllbGQgZWZpZWxkKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksICIiKTsKKyAgZWZpZWxkLnNldF9yZXEodF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVCk7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsIHByZWZpeCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHRoZSBkb2NzdHJpbmcgZm9yIGEgZ2l2ZW4gc3RydWN0LgorICovCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nb19kb2NzdHJpbmcob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBnZW5lcmF0ZV9nb19kb2NzdHJpbmcob3V0LCB0c3RydWN0LCB0c3RydWN0LCAiQXR0cmlidXRlcyIpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyB0aGUgZG9jc3RyaW5nIGZvciBhIGdpdmVuIGZ1bmN0aW9uLgorICovCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nb19kb2NzdHJpbmcob3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgZ2VuZXJhdGVfZ29fZG9jc3RyaW5nKG91dCwgdGZ1bmN0aW9uLCB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCksICJQYXJhbWV0ZXJzIik7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHRoZSBkb2NzdHJpbmcgZm9yIGEgc3RydWN0IG9yIGZ1bmN0aW9uLgorICovCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nb19kb2NzdHJpbmcob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZG9jKiB0ZG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHN1YmhlYWRlcikgeworICBib29sIGhhc19kb2MgPSBmYWxzZTsKKyAgc3RyaW5nc3RyZWFtIHNzOworCisgIGlmICh0ZG9jLT5oYXNfZG9jKCkpIHsKKyAgICBoYXNfZG9jID0gdHJ1ZTsKKyAgICBzcyA8PCB0ZG9jLT5nZXRfZG9jKCk7CisgIH0KKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworCisgIGlmIChmaWVsZHMuc2l6ZSgpID4gMCkgeworICAgIGlmIChoYXNfZG9jKSB7CisgICAgICBzcyA8PCBlbmRsOworICAgIH0KKworICAgIGhhc19kb2MgPSB0cnVlOworICAgIHNzIDw8IHN1YmhlYWRlciA8PCAiOlxuIjsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBwX2l0ZXI7CisKKyAgICBmb3IgKHBfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBwX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK3BfaXRlcikgeworICAgICAgdF9maWVsZCogcCA9ICpwX2l0ZXI7CisgICAgICBzcyA8PCAiIC0gIiA8PCBwdWJsaWNpemUocC0+Z2V0X25hbWUoKSk7CisKKyAgICAgIGlmIChwLT5oYXNfZG9jKCkpIHsKKyAgICAgICAgc3MgPDwgIjogIiA8PCBwLT5nZXRfZG9jKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzcyA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmIChoYXNfZG9jKSB7CisgICAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCAiIiwgIi8vICIsIHNzLnN0cigpLCAiIik7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgdGhlIGRvY3N0cmluZyBmb3IgYSBnZW5lcmljIG9iamVjdC4KKyAqLwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ29fZG9jc3RyaW5nKG9zdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpIHsKKyAgaWYgKHRkb2MtPmhhc19kb2MoKSkgeworICAgIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KG91dCwgIiIsICIvLyIsIHRkb2MtPmdldF9kb2MoKSwgIiIpOworICB9Cit9CisKKy8qKgorICogRGVjbGFyZXMgYW4gYXJndW1lbnQsIHdoaWNoIG1heSBpbmNsdWRlIGluaXRpYWxpemF0aW9uIGFzIG5lY2Vzc2FyeS4KKyAqCisgKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZAorICovCitzdHJpbmcgdF9nb19nZW5lcmF0b3I6OmRlY2xhcmVfYXJndW1lbnQodF9maWVsZCogdGZpZWxkKSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSByZXN1bHQ7CisgIHJlc3VsdCA8PCBwdWJsaWNpemUodGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiPSI7CisKKyAgaWYgKHRmaWVsZC0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgeworICAgIHJlc3VsdCA8PCAidGhyaWZ0X3NwZWNbIiA8PCB0ZmllbGQtPmdldF9rZXkoKSA8PCAiXVs0XSI7CisgIH0gZWxzZSB7CisgICAgcmVzdWx0IDw8ICJuaWwiOworICB9CisKKyAgcmV0dXJuIHJlc3VsdC5zdHIoKTsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgc3RydWN0IGZpZWxkIGluaXRpYWwgdmFsdWUuCisgKgorICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQsIHdoaWNoIG11c3QgaGF2ZSBgdGZpZWxkLT5nZXRfdmFsdWUoKSAhPSBOVUxMYAorICovCitzdHJpbmcgdF9nb19nZW5lcmF0b3I6OnJlbmRlcl9maWVsZF9pbml0aWFsX3ZhbHVlKHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG9wdGlvbmFsX2ZpZWxkKSB7CisgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKworICBpZiAob3B0aW9uYWxfZmllbGQpIHsKKyAgICAvLyBUaGUgY2FsbGVyIHdpbGwgbWFrZSBhIHNlY29uZCBwYXNzIGZvciBvcHRpb25hbCBmaWVsZHMsCisgICAgLy8gYXNzaWduaW5nIHRoZSByZXN1bHQgb2YgcmVuZGVyX2NvbnN0X3ZhbHVlIHRvICIqZmllbGRfbmFtZSIuIEl0CisgICAgLy8gaXMgbWFkZGVuaW5nIHRoYXQgR28gc3ludGF4IGRvZXMgbm90IGFsbG93IGZvciBhIHR5cGUtYWdub3N0aWMKKyAgICAvLyB3YXkgdG8gaW5pdGlhbGl6ZSBhIHBvaW50ZXIgdG8gYSBjb25zdCB2YWx1ZSwgYnV0IHNvIGl0IGdvZXMuCisgICAgLy8gVGhlIGFsdGVybmF0aXZlIHdvdWxkIGJlIHRvIHdyaXRlIHR5cGUgc3BlY2lmaWMgZnVuY3Rpb25zIHRoYXQKKyAgICAvLyBjb252ZXJ0IGZyb20gY29uc3QgdmFsdWVzIHRvIHBvaW50ZXIgdHlwZXMsIGJ1dCBnaXZlbiB0aGUgbGFjaworICAgIC8vIG9mIG92ZXJsb2FkaW5nIGl0IHdvdWxkIGJlIG1lc3N5LgorICAgIHJldHVybiAibmV3KCIgKyB0eXBlX3RvX2dvX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKSArICIpIjsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gcmVuZGVyX2NvbnN0X3ZhbHVlKHR5cGUsIHRmaWVsZC0+Z2V0X3ZhbHVlKCksIG5hbWUpOworICB9Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAndHlwZSBuYW1lKGFyZ3MpJworICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgorICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgorICovCitzdHJpbmcgdF9nb19nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0cmluZyBwcmVmaXgpIHsKKyAgLy8gVE9ETyhtY3NsZWUpOiBOaXRwaWNreSwgbm8gJywnIGlmIGFyZ3VtZW50X2xpc3QgaXMgZW1wdHkKKyAgcmV0dXJuIHB1YmxpY2l6ZShwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkpICsgIigiICsgYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpCisgICAgICAgICArICIpIjsKK30KKworLyoqCisgKiBSZW5kZXJzIGFuIGludGVyZmFjZSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGZvcm0gJ3R5cGUgbmFtZShhcmdzKScKKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KKyAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KKyAqLworc3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmVfaWYodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdHJpbmcgcHJlZml4LCBib29sIGFkZEVycm9yKSB7CisgIHN0cmluZyBzaWduYXR1cmUgPSBwdWJsaWNpemUocHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSArICIoIjsKKyAgc2lnbmF0dXJlICs9ICJjdHggY29udGV4dC5Db250ZXh0IjsKKyAgaWYgKCF0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCkuZW1wdHkoKSkgeworICAgIHNpZ25hdHVyZSArPSAiLCAiICsgYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpOworICB9CisgIHNpZ25hdHVyZSArPSAiKSAoIjsKKworICB0X3R5cGUqIHJldCA9IHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKTsKKyAgdF9zdHJ1Y3QqIGV4Y2VwdGlvbnMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgc3RyaW5nIGVycnMgPSBhcmd1bWVudF9saXN0KGV4Y2VwdGlvbnMpOworCisgIGlmICghcmV0LT5pc192b2lkKCkpIHsKKyAgICBzaWduYXR1cmUgKz0gInIgIiArIHR5cGVfdG9fZ29fdHlwZShyZXQpOworCisgICAgaWYgKGFkZEVycm9yIHx8IGVycnMuc2l6ZSgpID09IDApIHsKKyAgICAgIHNpZ25hdHVyZSArPSAiLCAiOworICAgIH0KKyAgfQorCisgIGlmIChhZGRFcnJvcikgeworICAgIHNpZ25hdHVyZSArPSAiZXJyIGVycm9yIjsKKyAgfQorCisgIHNpZ25hdHVyZSArPSAiKSI7CisgIHJldHVybiBzaWduYXR1cmU7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZpZWxkIGxpc3QKKyAqLworc3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ICs9ICIsICI7CisgICAgfQorCisgICAgcmVzdWx0ICs9IHZhcmlhYmxlX25hbWVfdG9fZ29fbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpICsgIiAiCisgICAgICAgICAgICAgICsgdHlwZV90b19nb190eXBlKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCitzdHJpbmcgdF9nb19nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlKSB7CisgIHN0cmluZyBtb2R1bGUoIG1vZHVsZV9uYW1lKHR0eXBlKSk7CisgIGlmKCAhIG1vZHVsZS5lbXB0eSgpKSB7CisgICAgcmV0dXJuIG1vZHVsZSArICIuIiArIHR0eXBlLT5nZXRfbmFtZSgpOworICB9CisKKyAgcmV0dXJuIHR0eXBlLT5nZXRfbmFtZSgpOworfQorCitzdHJpbmcgdF9nb19nZW5lcmF0b3I6Om1vZHVsZV9uYW1lKHRfdHlwZSogdHR5cGUpIHsKKyAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHR5cGUtPmdldF9wcm9ncmFtKCk7CisKKyAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7CisgICAgaWYgKHByb2dyYW0tPmdldF9uYW1lc3BhY2UoImdvIikuZW1wdHkoKSB8fAorICAgICAgICBwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgiZ28iKS5lbXB0eSgpIHx8CisgICAgICAgIHByb2dyYW0tPmdldF9uYW1lc3BhY2UoImdvIikgIT0gcHJvZ3JhbV8tPmdldF9uYW1lc3BhY2UoImdvIikpIHsKKyAgICAgIHN0cmluZyBtb2R1bGUoZ2V0X3JlYWxfZ29fbW9kdWxlKHByb2dyYW0pKTsKKyAgICAgIC8vIGZvciBuYW1lc3BhY2VkIGluY2x1ZGVzLCBvbmx5IGtlZXAgcGFydCBhZnRlciBkb3QuCisgICAgICBzaXplX3QgZG90ID0gbW9kdWxlLnJmaW5kKCcuJyk7CisgICAgICBpZiAoZG90ICE9IHN0cmluZzo6bnBvcykgeworICAgICAgICBtb2R1bGUgPSBtb2R1bGUuc3Vic3RyKGRvdCArIDEpOworICAgICAgfQorICAgICAgcmV0dXJuIG1vZHVsZTsKKyAgICB9CisgIH0KKworICByZXR1cm4gIiI7Cit9CisKKy8qKgorICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBnbyB0eW9lCisgKi8KK3N0cmluZyB0X2dvX2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOworCisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAvKiB0aGlzIGlzIHdyb25nLCBiaW5hcnkgaXMgc3RpbGwgYSBzdHJpbmcgdHlwZSBpbnRlcm5hbGx5CisgICAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgICByZXR1cm4gInRocmlmdC5CSU5BUlkiOworICAgICAgfQorICAgICAgKi8KKyAgICAgIHJldHVybiAidGhyaWZ0LlNUUklORyI7CisKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gInRocmlmdC5CT09MIjsKKworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZXR1cm4gInRocmlmdC5CWVRFIjsKKworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmV0dXJuICJ0aHJpZnQuSTE2IjsKKworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmV0dXJuICJ0aHJpZnQuSTMyIjsKKworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICJ0aHJpZnQuSTY0IjsKKworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICJ0aHJpZnQuRE9VQkxFIjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJ0aHJpZnQuSTMyIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICJ0aHJpZnQuU1RSVUNUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAidGhyaWZ0Lk1BUCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gInRocmlmdC5TRVQiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAidGhyaWZ0LkxJU1QiOworICB9CisKKyAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworfQorCisvKioKKyAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgZ28gbWFwIHR5cGUsIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIGl0IHdpbGwKKyAqIG5vdCBwcm9kdWNlIGEgdmFsaWQgZ28gbWFwIHR5cGUuCisgKi8KK3N0cmluZyB0X2dvX2dlbmVyYXRvcjo6dHlwZV90b19nb19rZXlfdHlwZSh0X3R5cGUqIHR5cGUpIHsKKyAgdF90eXBlKiByZXNvbHZlZF90eXBlID0gdHlwZTsKKworICB3aGlsZSAocmVzb2x2ZWRfdHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgcmVzb2x2ZWRfdHlwZSA9ICgodF90eXBlZGVmKilyZXNvbHZlZF90eXBlKS0+Z2V0X3R5cGUoKS0+Z2V0X3RydWVfdHlwZSgpOworICB9CisKKyAgaWYgKHJlc29sdmVkX3R5cGUtPmlzX21hcCgpIHx8IHJlc29sdmVkX3R5cGUtPmlzX2xpc3QoKSB8fCByZXNvbHZlZF90eXBlLT5pc19zZXQoKSkgeworICAgIHRocm93ICJDYW5ub3QgcHJvZHVjZSBhIHZhbGlkIHR5cGUgZm9yIGEgR28gbWFwIGtleTogIiArIHR5cGVfdG9fZ29fdHlwZSh0eXBlKSArICIgLSBhYm9ydGluZy4iOworICB9CisKKyAgaWYgKHJlc29sdmVkX3R5cGUtPmlzX2JpbmFyeSgpKQorICAgIHJldHVybiAic3RyaW5nIjsKKworICByZXR1cm4gdHlwZV90b19nb190eXBlKHR5cGUpOworfQorCisvKioKKyAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgZ28gdHlwZQorICovCitzdHJpbmcgdF9nb19nZW5lcmF0b3I6OnR5cGVfdG9fZ29fdHlwZSh0X3R5cGUqIHR5cGUpIHsKKyAgcmV0dXJuIHR5cGVfdG9fZ29fdHlwZV93aXRoX29wdCh0eXBlLCBmYWxzZSk7Cit9CisKKy8qKgorICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBnbyB0eXBlLCB0YWtpbmcgaW50byBhY2NvdW50IHdoZXRoZXIgdGhlIGZpZWxkCisgKiBhc3NvY2lhdGVkIHdpdGggdGhlIHR5cGUgaXMgVF9PUFRJT05BTC4KKyAqLworc3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjp0eXBlX3RvX2dvX3R5cGVfd2l0aF9vcHQodF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBvcHRpb25hbF9maWVsZCkgeworICBzdHJpbmcgbWF5YmVfcG9pbnRlcihvcHRpb25hbF9maWVsZCA/ICIqIiA6ICIiKTsKKworICBpZiAodHlwZS0+aXNfdHlwZWRlZigpICYmICgodF90eXBlZGVmKil0eXBlKS0+aXNfZm9yd2FyZF90eXBlZGVmKCkpIHsKKyAgICB0eXBlID0gKCh0X3R5cGVkZWYqKXR5cGUpLT5nZXRfdHJ1ZV90eXBlKCk7CisgIH0KKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgIiI7CisKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICByZXR1cm4gbWF5YmVfcG9pbnRlciArICJbXWJ5dGUiOworICAgICAgfQorCisgICAgICByZXR1cm4gbWF5YmVfcG9pbnRlciArICJzdHJpbmciOworCisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuIG1heWJlX3BvaW50ZXIgKyAiYm9vbCI7CisKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmV0dXJuIG1heWJlX3BvaW50ZXIgKyAiaW50OCI7CisKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiBtYXliZV9wb2ludGVyICsgImludDE2IjsKKworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmV0dXJuIG1heWJlX3BvaW50ZXIgKyAiaW50MzIiOworCisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gbWF5YmVfcG9pbnRlciArICJpbnQ2NCI7CisKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiBtYXliZV9wb2ludGVyICsgImZsb2F0NjQiOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gbWF5YmVfcG9pbnRlciArIHB1YmxpY2l6ZSh0eXBlX25hbWUodHlwZSkpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIioiICsgcHVibGljaXplKHR5cGVfbmFtZSh0eXBlKSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICB0X21hcCogdCA9ICh0X21hcCopdHlwZTsKKyAgICBzdHJpbmcga2V5VHlwZSA9IHR5cGVfdG9fZ29fa2V5X3R5cGUodC0+Z2V0X2tleV90eXBlKCkpOworICAgIHN0cmluZyB2YWx1ZVR5cGUgPSB0eXBlX3RvX2dvX3R5cGUodC0+Z2V0X3ZhbF90eXBlKCkpOworICAgIHJldHVybiBtYXliZV9wb2ludGVyICsgc3RyaW5nKCJtYXBbIikgKyBrZXlUeXBlICsgIl0iICsgdmFsdWVUeXBlOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgdF9zZXQqIHQgPSAodF9zZXQqKXR5cGU7CisgICAgc3RyaW5nIGVsZW1UeXBlID0gdHlwZV90b19nb190eXBlKHQtPmdldF9lbGVtX3R5cGUoKSk7CisgICAgcmV0dXJuIG1heWJlX3BvaW50ZXIgKyBzdHJpbmcoIltdIikgKyBlbGVtVHlwZTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICB0X2xpc3QqIHQgPSAodF9saXN0Kil0eXBlOworICAgIHN0cmluZyBlbGVtVHlwZSA9IHR5cGVfdG9fZ29fdHlwZSh0LT5nZXRfZWxlbV90eXBlKCkpOworICAgIHJldHVybiBtYXliZV9wb2ludGVyICsgc3RyaW5nKCJbXSIpICsgZWxlbVR5cGU7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgcmV0dXJuIG1heWJlX3BvaW50ZXIgKyBwdWJsaWNpemUodHlwZV9uYW1lKHR5cGUpKTsKKyAgfQorCisgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19nb190eXBlOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKworLyoqIFNlZSB0aGUgY29tbWVudCBpbnNpZGUgZ2VuZXJhdGVfZ29fc3RydWN0X2RlZmluaXRpb24gZm9yIHdoYXQgdGhpcyBpcy4gKi8KK3N0cmluZyB0X2dvX2dlbmVyYXRvcjo6dHlwZV90b19zcGVjX2FyZ3ModF90eXBlKiB0dHlwZSkgeworICB3aGlsZSAodHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHR0eXBlID0gKCh0X3R5cGVkZWYqKXR0eXBlKS0+Z2V0X3R5cGUoKTsKKyAgfQorCisgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAibmlsIjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIigiICsgdHlwZV9uYW1lKHR0eXBlKSArICIsICIgKyB0eXBlX25hbWUodHR5cGUpICsgIi50aHJpZnRfc3BlYykiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAiKCIgKyB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgKyAiLCIKKyAgICAgICAgICAgKyB0eXBlX3RvX3NwZWNfYXJncygoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKSArICIsIgorICAgICAgICAgICArIHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSArICIsIgorICAgICAgICAgICArIHR5cGVfdG9fc3BlY19hcmdzKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpICsgIikiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAiKCIgKyB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpICsgIiwiCisgICAgICAgICAgICsgdHlwZV90b19zcGVjX2FyZ3MoKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpICsgIikiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gIigiICsgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgKyAiLCIKKyAgICAgICAgICAgKyB0eXBlX3RvX3NwZWNfYXJncygoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpICsgIikiOworICB9CisKKyAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX3NwZWNfYXJnczogIiArIHR0eXBlLT5nZXRfbmFtZSgpOworfQorCitib29sIGZvcm1hdF9nb19vdXRwdXQoY29uc3Qgc3RyaW5nJiBmaWxlX3BhdGgpIHsKKworICAvLyBmb3JtYXR0aW5nIHZpYSBnb2ZtdCBkZWFjdGl2YXRlZCBkdWUgdG8gVEhSSUZULTM4OTMKKyAgLy8gUGxlYXNlIGxvb2sgYXQgdGhlIHRpY2tldCBhbmQgbWFrZSBzdXJlIHlvdSBmdWxseSB1bmRlcnN0YW5kIGFsbCB0aGUgaW1wbGljYXRpb25zCisgIC8vIGJlZm9yZSBzdWJtaXR0aW5nIGEgcGF0Y2ggdGhhdCBlbmFibGVzIHRoaXMgZmVhdHVyZSBhZ2Fpbi4gVGhhbmsgeW91LgorICAodm9pZCkgZmlsZV9wYXRoOworICByZXR1cm4gZmFsc2U7CisKKyAgLyoKKyAgY29uc3Qgc3RyaW5nIGNvbW1hbmQgPSAiZ29mbXQgLXcgIiArIGZpbGVfcGF0aDsKKworICBpZiAoc3lzdGVtKGNvbW1hbmQuY19zdHIoKSkgPT0gMCkgeworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgZnByaW50ZihzdGRlcnIsICJXQVJOSU5HIC0gUnVubmluZyAnJXMnIGZhaWxlZC5cbiIsIGNvbW1hbmQuY19zdHIoKSk7CisgIHJldHVybiBmYWxzZTsKKyAgKi8KKyB9CisKK1RIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoZ28sICJHbyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgcGFja2FnZV9wcmVmaXg9ICBQYWNrYWdlIHByZWZpeCBmb3IgZ2VuZXJhdGVkIGZpbGVzLlxuIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgdGhyaWZ0X2ltcG9ydD0gICBPdmVycmlkZSB0aHJpZnQgcGFja2FnZSBpbXBvcnQgcGF0aCAoZGVmYXVsdDoiICsgREVGQVVMVF9USFJJRlRfSU1QT1JUICsgIilcbiIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIHBhY2thZ2U9ICAgICAgICAgUGFja2FnZSBuYW1lIChkZWZhdWx0OiBpbmZlcnJlZCBmcm9tIHRocmlmdCBmaWxlIG5hbWUpXG4iIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBpZ25vcmVfaW5pdGlhbGlzbXNcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgIERpc2FibGUgYXV0b21hdGljIHNwZWxsaW5nIGNvcnJlY3Rpb24gb2YgaW5pdGlhbGlzbXMgKGUuZy4gXCJVUkxcIilcbiIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIHJlYWRfd3JpdGVfcHJpdmF0ZVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgTWFrZSByZWFkL3dyaXRlIG1ldGhvZHMgcHJpdmF0ZSwgZGVmYXVsdCBpcyBwdWJsaWMgUmVhZC9Xcml0ZVxuIikKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZ3ZfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9ndl9nZW5lcmF0b3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y4MzAxYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZ3ZfZ2VuZXJhdG9yLmNjCkBAIC0wLDAgKzEsMzQ1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPGxpc3Q+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSAidGhyaWZ0L3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmgiCisKK3VzaW5nIHN0ZDo6bWFwOwordXNpbmcgc3RkOjpvZnN0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6cGFpcjsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnZlY3RvcjsKKworc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsID0gIlxuIjsgLy8gYXZvaWQgb3N0cmVhbSA8PCBzdGQ6OmVuZGwgZmx1c2hlcworCisvKioKKyAqIEdyYXBodml6IGNvZGUgZ2VuZXJhdG9yCisgKi8KK2NsYXNzIHRfZ3ZfZ2VuZXJhdG9yIDogcHVibGljIHRfZ2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgdF9ndl9nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLAorICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCisgICAgOiB0X2dlbmVyYXRvcihwcm9ncmFtKSB7CisgICAgKHZvaWQpb3B0aW9uX3N0cmluZzsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworCisgICAgZXhjZXB0aW9uX2Fycm93cyA9IGZhbHNlOworICAgIGZvciggaXRlciA9IHBhcnNlZF9vcHRpb25zLmJlZ2luKCk7IGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCk7ICsraXRlcikgeworICAgICAgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImV4Y2VwdGlvbnMiKSA9PSAwKSB7CisgICAgICAgIGV4Y2VwdGlvbl9hcnJvd3MgPSB0cnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgInVua25vd24gb3B0aW9uIGd2OiIgKyBpdGVyLT5maXJzdDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1ndiI7CisgIH0KKworICAvKioKKyAgICogSW5pdCBhbmQgZW5kIG9mIGdlbmVyYXRvcgorICAgKi8KKyAgdm9pZCBpbml0X2dlbmVyYXRvcigpOworICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOworCisgIC8qKgorICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZik7CisgIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworcHJvdGVjdGVkOgorICAvKioKKyAgICogSGVscGVycworICAgKi8KKyAgdm9pZCBwcmludF90eXBlKHRfdHlwZSogdHR5cGUsIHN0cmluZyBzdHJ1Y3RfZmllbGRfcmVmKTsKKyAgdm9pZCBwcmludF9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHR2YWx1ZSk7CisKK3ByaXZhdGU6CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9vdXRfOworICBzdGQ6Omxpc3Q8c3RyaW5nPiBlZGdlczsKKyAgYm9vbCBleGNlcHRpb25fYXJyb3dzOworfTsKKworLyoqCisgKiBJbml0IGdlbmVyYXRvcjoKKyAqIC0gQWRkcyBzb21lIGVzY2FwaW5nIGZvciB0aGUgR3JhcGh2aXogZG9tYWluLgorICogLSBDcmVhdGUgb3V0cHV0IGRpcmVjdG9yeSBhbmQgb3BlbiBmaWxlIGZvciB3cml0dGluZy4KKyAqIC0gV3JpdGUgdGhlIGZpbGUgaGVhZGVyLgorICovCit2b2lkIHRfZ3ZfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKKyAgZXNjYXBlX1sneyddID0gIlxceyI7CisgIGVzY2FwZV9bJ30nXSA9ICJcXH0iOworCisgIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQorICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOworICBzdHJpbmcgZm5hbWUgPSBnZXRfb3V0X2RpcigpICsgcHJvZ3JhbV8tPmdldF9uYW1lKCkgKyAiLmd2IjsKKyAgZl9vdXRfLm9wZW4oZm5hbWUuY19zdHIoKSk7CisgIGZfb3V0XyA8PCAiZGlncmFwaCBcIiIgPDwgZXNjYXBlX3N0cmluZyhwcm9ncmFtX25hbWVfKSA8PCAiXCIgeyIgPDwgZW5kbDsKKyAgZl9vdXRfIDw8ICJub2RlIFtzdHlsZT1maWxsZWQsIHNoYXBlPXJlY29yZF07IiA8PCBlbmRsOworICBmX291dF8gPDwgImVkZ2UgW2Fycm93c2l6ZT0wLjVdOyIgPDwgZW5kbDsKKyAgZl9vdXRfIDw8ICJyYW5rZGlyPUxSIiA8PCBlbmRsOworfQorCisvKioKKyAqIENsb3NlcyBnZW5lcmF0b3I6CisgKiAtIFByaW50IGFjY3VtdWxhdGVkIG5vZGVzIGNvbm5lY3Rpb25zLgorICogLSBQcmludCBmb290bm90ZS4KKyAqIC0gQ2xvc2VzIGZpbGUuCisgKi8KK3ZvaWQgdF9ndl9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKKyAgLy8gUHJpbnQgZWRnZXMKKyAgc3RkOjpsaXN0PHN0cmluZz46Oml0ZXJhdG9yIGl0ZXIgPSBlZGdlcy5iZWdpbigpOworICBmb3IgKDsgaXRlciAhPSBlZGdlcy5lbmQoKTsgaXRlcisrKSB7CisgICAgZl9vdXRfIDw8ICgqaXRlcikgPDwgZW5kbDsKKyAgfQorCisgIC8vIFByaW50IGdyYXBoIGVuZCB9IGFuZCBjbG9zZSBmaWxlCisgIGZfb3V0XyA8PCAifSIgPDwgZW5kbDsKKyAgZl9vdXRfLmNsb3NlKCk7Cit9CisKK3ZvaWQgdF9ndl9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgeworICBzdHJpbmcgbmFtZSA9IHR0eXBlZGVmLT5nZXRfbmFtZSgpOworICBmX291dF8gPDwgIm5vZGUgW2ZpbGxjb2xvcj1henVyZV07IiA8PCBlbmRsOworICBmX291dF8gPDwgbmFtZSA8PCAiIFtsYWJlbD1cIiI7CisKKyAgZl9vdXRfIDw8IGVzY2FwZV9zdHJpbmcobmFtZSk7CisgIGZfb3V0XyA8PCAiIDo6ICI7CisgIHByaW50X3R5cGUodHR5cGVkZWYtPmdldF90eXBlKCksIG5hbWUpOworCisgIGZfb3V0XyA8PCAiXCJdOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X2d2X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7CisgIHN0cmluZyBuYW1lID0gdGVudW0tPmdldF9uYW1lKCk7CisgIGZfb3V0XyA8PCAibm9kZSBbZmlsbGNvbG9yPXdoaXRlXTsiIDw8IGVuZGw7CisgIGZfb3V0XyA8PCBuYW1lIDw8ICIgW2xhYmVsPVwiZW51bSAiIDw8IGVzY2FwZV9zdHJpbmcobmFtZSk7CisKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IHZhbHVlcyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgdmFsX2l0ZXI7CisgIGZvciAodmFsX2l0ZXIgPSB2YWx1ZXMuYmVnaW4oKTsgdmFsX2l0ZXIgIT0gdmFsdWVzLmVuZCgpOyArK3ZhbF9pdGVyKSB7CisgICAgZl9vdXRfIDw8ICd8JyA8PCAoKnZhbF9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICBmX291dF8gPDwgIiA9ICI7CisgICAgZl9vdXRfIDw8ICgqdmFsX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgfQorCisgIGZfb3V0XyA8PCAiXCJdOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X2d2X2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KSB7CisgIHN0cmluZyBuYW1lID0gdGNvbnN0LT5nZXRfbmFtZSgpOworCisgIGZfb3V0XyA8PCAibm9kZSBbZmlsbGNvbG9yPWFsaWNlYmx1ZV07IiA8PCBlbmRsOworICBmX291dF8gPDwgImNvbnN0XyIgPDwgbmFtZSA8PCAiIFtsYWJlbD1cIiI7CisKKyAgZl9vdXRfIDw8IGVzY2FwZV9zdHJpbmcobmFtZSk7CisgIGZfb3V0XyA8PCAiID0gIjsKKyAgcHJpbnRfY29uc3RfdmFsdWUodGNvbnN0LT5nZXRfdHlwZSgpLCB0Y29uc3QtPmdldF92YWx1ZSgpKTsKKyAgZl9vdXRfIDw8ICIgOjogIjsKKyAgcHJpbnRfdHlwZSh0Y29uc3QtPmdldF90eXBlKCksICJjb25zdF8iICsgbmFtZSk7CisKKyAgZl9vdXRfIDw8ICJcIl07IiA8PCBlbmRsOworfQorCit2b2lkIHRfZ3ZfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworCisgIGlmICh0c3RydWN0LT5pc194Y2VwdGlvbigpKSB7CisgICAgZl9vdXRfIDw8ICJub2RlIFtmaWxsY29sb3I9bGlnaHRwaW5rXTsiIDw8IGVuZGw7CisgICAgZl9vdXRfIDw8IG5hbWUgPDwgIiBbbGFiZWw9XCIiOworICAgIGZfb3V0XyA8PCAiZXhjZXB0aW9uICIgPDwgZXNjYXBlX3N0cmluZyhuYW1lKTsKKyAgfSBlbHNlIGlmICh0c3RydWN0LT5pc191bmlvbigpKSB7CisgICAgZl9vdXRfIDw8ICJub2RlIFtmaWxsY29sb3I9bGlnaHRjeWFuXTsiIDw8IGVuZGw7CisgICAgZl9vdXRfIDw8IG5hbWUgPDwgIiBbbGFiZWw9XCIiOworICAgIGZfb3V0XyA8PCAidW5pb24gIiA8PCBlc2NhcGVfc3RyaW5nKG5hbWUpOworICB9IGVsc2UgeworICAgIGZfb3V0XyA8PCAibm9kZSBbZmlsbGNvbG9yPWJlaWdlXTsiIDw8IGVuZGw7CisgICAgZl9vdXRfIDw8IG5hbWUgPDwgIiBbbGFiZWw9XCIiOworICAgIGZfb3V0XyA8PCAic3RydWN0ICIgPDwgZXNjYXBlX3N0cmluZyhuYW1lKTsKKyAgfQorCisgIHZlY3Rvcjx0X2ZpZWxkKj4gbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46Oml0ZXJhdG9yIG1lbV9pdGVyID0gbWVtYmVycy5iZWdpbigpOworICBmb3IgKDsgbWVtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgbWVtX2l0ZXIrKykgeworICAgIHN0cmluZyBmaWVsZF9uYW1lID0gKCptZW1faXRlciktPmdldF9uYW1lKCk7CisKKyAgICAvLyBwcmludCBwb3J0IChhbmNob3IgcmVmZXJlbmNlKQorICAgIGZfb3V0XyA8PCAifDxmaWVsZF8iIDw8IGZpZWxkX25hbWUgPDwgJz4nOworCisgICAgLy8gZmllbGQgbmFtZSA6OiBmaWVsZCB0eXBlCisgICAgZl9vdXRfIDw8ICgqbWVtX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIGZfb3V0XyA8PCAiIDo6ICI7CisgICAgcHJpbnRfdHlwZSgoKm1lbV9pdGVyKS0+Z2V0X3R5cGUoKSwgbmFtZSArICI6ZmllbGRfIiArIGZpZWxkX25hbWUpOworICB9CisKKyAgZl9vdXRfIDw8ICJcIl07IiA8PCBlbmRsOworfQorCit2b2lkIHRfZ3ZfZ2VuZXJhdG9yOjpwcmludF90eXBlKHRfdHlwZSogdHR5cGUsIHN0cmluZyBzdHJ1Y3RfZmllbGRfcmVmKSB7CisgIGlmICh0dHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgZl9vdXRfIDw8ICJsaXN0XFw8IjsKKyAgICAgIHByaW50X3R5cGUoKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpLCBzdHJ1Y3RfZmllbGRfcmVmKTsKKyAgICAgIGZfb3V0XyA8PCAiXFw+IjsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgICAgZl9vdXRfIDw8ICJzZXRcXDwiOworICAgICAgcHJpbnRfdHlwZSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSwgc3RydWN0X2ZpZWxkX3JlZik7CisgICAgICBmX291dF8gPDwgIlxcPiI7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICAgIGZfb3V0XyA8PCAibWFwXFw8IjsKKyAgICAgIHByaW50X3R5cGUoKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSwgc3RydWN0X2ZpZWxkX3JlZik7CisgICAgICBmX291dF8gPDwgIiwgIjsKKyAgICAgIHByaW50X3R5cGUoKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSwgc3RydWN0X2ZpZWxkX3JlZik7CisgICAgICBmX291dF8gPDwgIlxcPiI7CisgICAgfQorICB9IGVsc2UgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIGZfb3V0XyA8PCAodHR5cGUtPmlzX2JpbmFyeSgpID8gImJpbmFyeSIgOiB0dHlwZS0+Z2V0X25hbWUoKSk7CisgIH0gZWxzZSB7CisgICAgZl9vdXRfIDw8IHR0eXBlLT5nZXRfbmFtZSgpOworICAgIGVkZ2VzLnB1c2hfYmFjayhzdHJ1Y3RfZmllbGRfcmVmICsgIiAtPiAiICsgdHR5cGUtPmdldF9uYW1lKCkpOworICB9Cit9CisKKy8qKgorICogUHJpbnRzIG91dCBhbiBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHByb3ZpZGVkIGNvbnN0YW50IHZhbHVlCisgKi8KK3ZvaWQgdF9ndl9nZW5lcmF0b3I6OnByaW50X2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdHZhbHVlKSB7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBzd2l0Y2ggKHR2YWx1ZS0+Z2V0X3R5cGUoKSkgeworICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVI6CisgICAgZl9vdXRfIDw8IHR2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICBicmVhazsKKyAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9ET1VCTEU6CisgICAgZl9vdXRfIDw8IHR2YWx1ZS0+Z2V0X2RvdWJsZSgpOworICAgIGJyZWFrOworICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX1NUUklORzoKKyAgICBmX291dF8gPDwgIlxcXCIiIDw8IGdldF9lc2NhcGVkX3N0cmluZyh0dmFsdWUpIDw8ICJcXFwiIjsKKyAgICBicmVhazsKKyAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9NQVA6IHsKKyAgICBmX291dF8gPDwgIlxceyAiOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+IG1hcF9lbGVtcyA9IHR2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+OjppdGVyYXRvciBtYXBfaXRlcjsKKyAgICBmb3IgKG1hcF9pdGVyID0gbWFwX2VsZW1zLmJlZ2luKCk7IG1hcF9pdGVyICE9IG1hcF9lbGVtcy5lbmQoKTsgbWFwX2l0ZXIrKykgeworICAgICAgaWYgKCFmaXJzdCkgeworICAgICAgICBmX291dF8gPDwgIiwgIjsKKyAgICAgIH0KKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICBwcmludF9jb25zdF92YWx1ZSgoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCksIG1hcF9pdGVyLT5maXJzdCk7CisgICAgICBmX291dF8gPDwgIiA9ICI7CisgICAgICBwcmludF9jb25zdF92YWx1ZSgoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCksIG1hcF9pdGVyLT5zZWNvbmQpOworICAgIH0KKyAgICBmX291dF8gPDwgIiBcXH0iOworICB9IGJyZWFrOworICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX0xJU1Q6IHsKKyAgICBmX291dF8gPDwgIlxceyAiOworICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4gbGlzdF9lbGVtcyA9IHR2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICA7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6aXRlcmF0b3IgbGlzdF9pdGVyOworICAgIGZvciAobGlzdF9pdGVyID0gbGlzdF9lbGVtcy5iZWdpbigpOyBsaXN0X2l0ZXIgIT0gbGlzdF9lbGVtcy5lbmQoKTsgbGlzdF9pdGVyKyspIHsKKyAgICAgIGlmICghZmlyc3QpIHsKKyAgICAgICAgZl9vdXRfIDw8ICIsICI7CisgICAgICB9CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgICBwcmludF9jb25zdF92YWx1ZSgoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKSwgKmxpc3RfaXRlcik7CisgICAgICB9IGVsc2UgeworICAgICAgICBwcmludF9jb25zdF92YWx1ZSgoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpLCAqbGlzdF9pdGVyKTsKKyAgICAgIH0KKyAgICB9CisgICAgZl9vdXRfIDw8ICIgXFx9IjsKKyAgfSBicmVhazsKKyAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9JREVOVElGSUVSOgorICAgIGZfb3V0XyA8PCBlc2NhcGVfc3RyaW5nKHR5cGUtPmdldF9uYW1lKCkpIDw8ICIuIgorICAgICAgICAgICA8PCBlc2NhcGVfc3RyaW5nKHR2YWx1ZS0+Z2V0X2lkZW50aWZpZXJfbmFtZSgpKTsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBmX291dF8gPDwgIlVOS05PV04iOworICAgIGJyZWFrOworICB9Cit9CisKK3ZvaWQgdF9ndl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgc2VydmljZV9uYW1lID0gZ2V0X3NlcnZpY2VfbmFtZSh0c2VydmljZSk7CisgIGZfb3V0XyA8PCAic3ViZ3JhcGggY2x1c3Rlcl8iIDw8IHNlcnZpY2VfbmFtZSA8PCAiIHsiIDw8IGVuZGw7CisgIGZfb3V0XyA8PCAibm9kZSBbZmlsbGNvbG9yPWJpc3F1ZV07IiA8PCBlbmRsOworICBmX291dF8gPDwgInN0eWxlPWRhc2hlZDsiIDw8IGVuZGw7CisgIGZfb3V0XyA8PCAibGFiZWwgPSBcIiIgPDwgZXNjYXBlX3N0cmluZyhzZXJ2aWNlX25hbWUpIDw8ICIgc2VydmljZVwiOyIgPDwgZW5kbDsKKworICAvLyBUT0RPOiBzZXJ2aWNlIGV4dGVuZHMKKworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZuX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsKKyAgZm9yICg7IGZuX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyBmbl9pdGVyKyspIHsKKyAgICBzdHJpbmcgZm5fbmFtZSA9ICgqZm5faXRlciktPmdldF9uYW1lKCk7CisKKyAgICBmX291dF8gPDwgImZ1bmN0aW9uXyIgPDwgc2VydmljZV9uYW1lIDw8IGZuX25hbWU7CisgICAgZl9vdXRfIDw8ICJbbGFiZWw9XCI8cmV0dXJuX3R5cGU+ZnVuY3Rpb24gIiA8PCBlc2NhcGVfc3RyaW5nKGZuX25hbWUpOworICAgIGZfb3V0XyA8PCAiIDo6ICI7CisgICAgcHJpbnRfdHlwZSgoKmZuX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLCAiZnVuY3Rpb25fIiArIHNlcnZpY2VfbmFtZSArIGZuX25hbWUgKyAiOnJldHVybl90eXBlIik7CisKKyAgICB2ZWN0b3I8dF9maWVsZCo+IGFyZ3MgPSAoKmZuX2l0ZXIpLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46Oml0ZXJhdG9yIGFyZ19pdGVyID0gYXJncy5iZWdpbigpOworICAgIGZvciAoOyBhcmdfaXRlciAhPSBhcmdzLmVuZCgpOyBhcmdfaXRlcisrKSB7CisgICAgICBmX291dF8gPDwgInw8cGFyYW1fIiA8PCAoKmFyZ19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiPiI7CisgICAgICBmX291dF8gPDwgKCphcmdfaXRlciktPmdldF9uYW1lKCk7CisgICAgICBpZiAoKCphcmdfaXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKKyAgICAgICAgZl9vdXRfIDw8ICIgPSAiOworICAgICAgICBwcmludF9jb25zdF92YWx1ZSgoKmFyZ19pdGVyKS0+Z2V0X3R5cGUoKSwgKCphcmdfaXRlciktPmdldF92YWx1ZSgpKTsKKyAgICAgIH0KKyAgICAgIGZfb3V0XyA8PCAiIDo6ICI7CisgICAgICBwcmludF90eXBlKCgqYXJnX2l0ZXIpLT5nZXRfdHlwZSgpLAorICAgICAgICAgICAgICAgICAiZnVuY3Rpb25fIiArIHNlcnZpY2VfbmFtZSArIGZuX25hbWUgKyAiOnBhcmFtXyIgKyAoKmFyZ19pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgfQorICAgIC8vIGVuZCBvZiBub2RlCisgICAgZl9vdXRfIDw8ICJcIl07IiA8PCBlbmRsOworCisgICAgLy8gRXhjZXB0aW9uIGVkZ2VzCisgICAgaWYgKGV4Y2VwdGlvbl9hcnJvd3MpIHsKKyAgICAgIHZlY3Rvcjx0X2ZpZWxkKj4gZXhjZXB0cyA9ICgqZm5faXRlciktPmdldF94Y2VwdGlvbnMoKS0+Z2V0X21lbWJlcnMoKTsKKyAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46Oml0ZXJhdG9yIGV4X2l0ZXIgPSBleGNlcHRzLmJlZ2luKCk7CisgICAgICBmb3IgKDsgZXhfaXRlciAhPSBleGNlcHRzLmVuZCgpOyBleF9pdGVyKyspIHsKKyAgICAgICAgZWRnZXMucHVzaF9iYWNrKCJmdW5jdGlvbl8iICsgc2VydmljZV9uYW1lICsgZm5fbmFtZSArICIgLT4gIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAoKmV4X2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpICsgIiBbY29sb3I9cmVkXSIpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGZfb3V0XyA8PCAiIH0iIDw8IGVuZGw7Cit9CisKK1RIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoCisgICAgZ3YsCisgICAgIkdyYXBodml6IiwKKyAgICAiICAgIGV4Y2VwdGlvbnM6ICAgICAgV2hldGhlciB0byBkcmF3IGFycm93cyBmcm9tIGZ1bmN0aW9ucyB0byBleGNlcHRpb24uXG4iKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9oYXhlX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfaGF4ZV9nZW5lcmF0b3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I4OGM0ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfaGF4ZV9nZW5lcmF0b3IuY2MKQEAgLTAsMCArMSwyOTgzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxjY3R5cGU+CisKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKworI2luY2x1ZGUgInRocmlmdC9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaCIKKwordXNpbmcgc3RkOjptYXA7Cit1c2luZyBzdGQ6Om9zdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjp2ZWN0b3I7CisKK3N0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKKworLyoqCisgKiBIYXhlIGNvZGUgZ2VuZXJhdG9yLgorICoKKyAqLworY2xhc3MgdF9oYXhlX2dlbmVyYXRvciA6IHB1YmxpYyB0X29vcF9nZW5lcmF0b3IgeworcHVibGljOgorICB0X2hheGVfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKKyAgICA6IHRfb29wX2dlbmVyYXRvcihwcm9ncmFtKSB7CisgICAgKHZvaWQpb3B0aW9uX3N0cmluZzsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworCisgICAgY2FsbGJhY2tzXyA9IGZhbHNlOworICAgIHJ0dGlfID0gZmFsc2U7CisgICAgYnVpbGRtYWNyb18gPSAiIjsKKyAgICBmb3IoIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5iZWdpbigpOyBpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJjYWxsYmFja3MiKSA9PSAwKSB7CisgICAgICAgIGNhbGxiYWNrc18gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJydHRpIikgPT0gMCkgeworICAgICAgICBydHRpXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImJ1aWxkbWFjcm8iKSA9PSAwKSB7CisgICAgICAgIGJ1aWxkbWFjcm9fID0gKGl0ZXItPnNlY29uZCk7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24gaGF4ZToiICsgaXRlci0+Zmlyc3Q7CisgICAgICB9CisgICAgfQorCisgICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4taGF4ZSI7CisgIH0KKworICAvKioKKyAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcworICAgKi8KKworICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7CisgIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyk7CisKKyAgLyoqCisgICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpOworICB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworCisgIHZvaWQgcHJpbnRfY29uc3RfdmFsdWUoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9zdGF0aWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWZ2YWwgPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZShvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpOworCisgIC8qKgorICAgKiBTZXJ2aWNlLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfaGF4ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uLCBib29sIGlzX3Jlc3VsdCA9IGZhbHNlKTsKKworICB2b2lkIGdlbmVyYXRlX2hheGVfc3RydWN0X2RlZmluaXRpb24oc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24gPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0ID0gZmFsc2UpOworICAvLyByZW1vdmVkIC0tIGVxdWFsaXR5LGNvbXBhcmVfdG8KKyAgdm9pZCBnZW5lcmF0ZV9oYXhlX3N0cnVjdF9yZWFkZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9oYXhlX3ZhbGlkYXRvcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2hheGVfc3RydWN0X3Jlc3VsdF93cml0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9oYXhlX3N0cnVjdF93cml0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9oYXhlX3N0cnVjdF90b3N0cmluZyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2hheGVfbWV0YV9kYXRhX21hcChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlKTsKKyAgc3RkOjpzdHJpbmcgZ2V0X2hheGVfdHlwZV9zdHJpbmcodF90eXBlKiB0eXBlKTsKKyAgdm9pZCBnZW5lcmF0ZV9yZWZsZWN0aW9uX3NldHRlcnMoc3RkOjpvc3RyaW5nc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2FwX25hbWUpOworICB2b2lkIGdlbmVyYXRlX3JlZmxlY3Rpb25fZ2V0dGVycyhzdGQ6Om9zdHJpbmdzdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSk7CisgIHZvaWQgZ2VuZXJhdGVfZ2VuZXJpY19maWVsZF9nZXR0ZXJzX3NldHRlcnMoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9nZW5lcmljX2lzc2V0X21ldGhvZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3Byb3BlcnR5X2dldHRlcnNfc2V0dGVycyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIHZvaWQgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICBzdGQ6OnN0cmluZyBnZXRfY2FwX25hbWUoc3RkOjpzdHJpbmcgbmFtZSk7CisgIHN0ZDo6c3RyaW5nIGdlbmVyYXRlX2lzc2V0X2NoZWNrKHRfZmllbGQqIGZpZWxkKTsKKyAgc3RkOjpzdHJpbmcgZ2VuZXJhdGVfaXNzZXRfY2hlY2soc3RkOjpzdHJpbmcgZmllbGQpOworICB2b2lkIGdlbmVyYXRlX2lzc2V0X3NldChvc3RyZWFtJiBvdXQsIHRfZmllbGQqIGZpZWxkKTsKKyAgLy8gcmVtb3ZlZCBzdGQ6OnN0cmluZyBpc3NldF9maWVsZF9pZCh0X2ZpZWxkKiBmaWVsZCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfbWV0aG9kX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIGJvb2wgaXNfaW50ZXJmYWNlKTsKKworICAvKioKKyAgICogU2VyaWFsaXphdGlvbiBjb25zdHJ1Y3RzCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NldCogdG1hcCwgc3RkOjpzdHJpbmcgaXRlcik7CisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RkOjpzdHJpbmcgaXRlcik7CisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbWFwKTsKKworICB2b2lkIGdlbmVyYXRlX2hheGVfZG9jKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2RvYyogdGRvYyk7CisgIHZvaWQgZ2VuZXJhdGVfaGF4ZV9kb2Moc3RkOjpvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRkb2MpOworCisgIHZvaWQgZ2VuZXJhdGVfcnR0aV9kZWNvcmF0aW9uKHN0ZDo6b3N0cmVhbSYgb3V0KTsKKyAgdm9pZCBnZW5lcmF0ZV9tYWNyb19kZWNvcmF0aW9uKHN0ZDo6b3N0cmVhbSYgb3V0KTsKKworICAvKioKKyAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKKyAgICovCisKKyAgc3RkOjpzdHJpbmcgaGF4ZV9wYWNrYWdlKCk7CisgIHN0ZDo6c3RyaW5nIGhheGVfdHlwZV9pbXBvcnRzKCk7CisgIHN0ZDo6c3RyaW5nIGhheGVfdGhyaWZ0X2ltcG9ydHMoKTsKKyAgc3RkOjpzdHJpbmcgaGF4ZV90aHJpZnRfZ2VuX2ltcG9ydHModF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyYgaW1wb3J0cyk7CisgIHN0ZDo6c3RyaW5nIGhheGVfdGhyaWZ0X2dlbl9pbXBvcnRzKHRfc2VydmljZSogdHNlcnZpY2UpOworICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBpbl9jb250YWluZXIgPSBmYWxzZSwgYm9vbCBpbl9pbml0ID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZSogdGJhc2UsIGJvb2wgaW5fY29udGFpbmVyID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0ID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmVfY2FsbGJhY2sodF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlX25vcm1hbCh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KTsKKyAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOworICBzdGQ6OnN0cmluZyBnZXRfZW51bV9jbGFzc19uYW1lKHRfdHlwZSogdHlwZSk7CisgIHN0cmluZyBnZW5lcmF0ZV9zZXJ2aWNlX21ldGhvZF9vbnN1Y2Nlc3ModF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBib29sIGFzX3R5cGUsIGJvb2wgb21pdF9uYW1lKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX21ldGhvZF9zaWduYXR1cmVfY2FsbGJhY2sodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBib29sIGlzX2ludGVyZmFjZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9tZXRob2Rfc2lnbmF0dXJlX25vcm1hbCh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIGJvb2wgaXNfaW50ZXJmYWNlKTsKKworICBib29sIHR5cGVfY2FuX2JlX251bGwodF90eXBlKiB0dHlwZSkgeworICAgIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7CisKKyAgICBpZiAodHR5cGUtPmlzX2NvbnRhaW5lcigpIHx8IHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKSB8fCB0dHlwZS0+aXNfc3RyaW5nKCkpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgLy8gY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6ICAtIEludDY0IGlzIG5vdCByZWFsbHkgbnVsbGFibGUsIGV2ZW4gdGhvdWdoIGl0IGJlaGF2ZWQgdGhhdAorICAgICAgICAvLyB3YXkgYmVmb3JlIEhheGUgMy4yLjAKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgc3RkOjpzdHJpbmcgY29uc3RhbnRfbmFtZShzdGQ6OnN0cmluZyBuYW1lKTsKKworcHJpdmF0ZToKKyAgYm9vbCBjYWxsYmFja3NfOworICBib29sIHJ0dGlfOworICBzdHJpbmcgYnVpbGRtYWNyb187CisKKyAgLyoqCisgICAqIEZpbGUgc3RyZWFtcworICAgKi8KKworICBzdGQ6OnN0cmluZyBwYWNrYWdlX25hbWVfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc2VydmljZV87CisgIHN0ZDo6c3RyaW5nIHBhY2thZ2VfZGlyXzsKK307CisKKy8qKgorICogUHJlcGFyZXMgZm9yIGZpbGUgZ2VuZXJhdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBuZWNlc3NhcnkgZmlsZSBvdXRwdXQKKyAqIHN0cmVhbXMuCisgKgorICogQHBhcmFtIHRwcm9ncmFtIFRoZSBwcm9ncmFtIHRvIGdlbmVyYXRlCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7CisgIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQorICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOworICBwYWNrYWdlX25hbWVfID0gcHJvZ3JhbV8tPmdldF9uYW1lc3BhY2UoImhheGUiKTsKKworICAvLyBIYXhlIHBhY2thZ2UgbmFtZXMgYXJlIGxvd2VyY2FzZQorICBpZiAocGFja2FnZV9uYW1lXy5sZW5ndGgoKSA+IDApIHsKKyAgICBwYWNrYWdlX25hbWVfWzBdID0gdG9sb3dlcihwYWNrYWdlX25hbWVfWzBdKTsKKyAgICBzaXplX3QgaW5kZXggPSBwYWNrYWdlX25hbWVfLmZpbmQoJy4nKTsKKyAgICB3aGlsZSAoaW5kZXggIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgIGlmICgrK2luZGV4IDwgcGFja2FnZV9uYW1lXy5sZW5ndGgoKSkgeworICAgICAgICBwYWNrYWdlX25hbWVfW2luZGV4XSA9IHRvbG93ZXIocGFja2FnZV9uYW1lX1tpbmRleF0pOworICAgICAgfQorICAgICAgaW5kZXggPSBwYWNrYWdlX25hbWVfLmZpbmQoJy4nLCBpbmRleCk7CisgICAgfQorICB9CisKKyAgc3RyaW5nIGRpciA9IHBhY2thZ2VfbmFtZV87CisgIHN0cmluZyBzdWJkaXIgPSBnZXRfb3V0X2RpcigpOworICBzdHJpbmc6OnNpemVfdHlwZSBsb2M7CisgIHdoaWxlICgobG9jID0gZGlyLmZpbmQoIi4iKSkgIT0gc3RyaW5nOjpucG9zKSB7CisgICAgc3ViZGlyID0gc3ViZGlyICsgIi8iICsgZGlyLnN1YnN0cigwLCBsb2MpOworICAgIE1LRElSKHN1YmRpci5jX3N0cigpKTsKKyAgICBkaXIgPSBkaXIuc3Vic3RyKGxvYyArIDEpOworICB9CisgIGlmIChkaXIuc2l6ZSgpID4gMCkgeworICAgIHN1YmRpciA9IHN1YmRpciArICIvIiArIGRpcjsKKyAgICBNS0RJUihzdWJkaXIuY19zdHIoKSk7CisgIH0KKworICBwYWNrYWdlX2Rpcl8gPSBzdWJkaXI7Cit9CisKKy8qKgorICogUGFja2FnZXMgdGhlIGdlbmVyYXRlZCBmaWxlCisgKgorICogQHJldHVybiBTdHJpbmcgb2YgdGhlIHBhY2thZ2UsIGkuZS4gInBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnRkZW1vOyIKKyAqLworc3RyaW5nIHRfaGF4ZV9nZW5lcmF0b3I6OmhheGVfcGFja2FnZSgpIHsKKyAgaWYgKCFwYWNrYWdlX25hbWVfLmVtcHR5KCkpIHsKKyAgICByZXR1cm4gc3RyaW5nKCJwYWNrYWdlICIpICsgcGFja2FnZV9uYW1lXzsKKyAgfQorICByZXR1cm4gInBhY2thZ2UiOworfQorCisvKioKKyAqIFByaW50cyBzdGFuZGFyZCBoYXhlIGltcG9ydHMKKyAqCisgKiBAcmV0dXJuIExpc3Qgb2YgaW1wb3J0cyBmb3IgaGF4ZSB0eXBlcyB0aGF0IGFyZSB1c2VkIGluIGhlcmUKKyAqLworc3RyaW5nIHRfaGF4ZV9nZW5lcmF0b3I6OmhheGVfdHlwZV9pbXBvcnRzKCkgeworICByZXR1cm4gc3RyaW5nKCkgKyAiaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LmhlbHBlci4qO1xuIiArICJpbXBvcnQgaGF4ZS5pby5CeXRlcztcbiIKKyAgICAgICAgICsgImltcG9ydCBoYXhlLmRzLkludE1hcDtcbiIgKyAiaW1wb3J0IGhheGUuZHMuU3RyaW5nTWFwO1xuIgorICAgICAgICAgKyAiaW1wb3J0IGhheGUuZHMuT2JqZWN0TWFwO1xuIiArICJcbiIgKyAiI2lmIGZsYXNoXG4iCisgICAgICAgICArICJpbXBvcnQgZmxhc2guZXJyb3JzLkFyZ3VtZW50RXJyb3I7XG4iICsgIiNlbmRcbiIgKyAiXG4iOworfQorCisvKioKKyAqIFByaW50cyBzdGFuZGFyZCBoYXhlIGltcG9ydHMKKyAqCisgKiBAcmV0dXJuIExpc3Qgb2YgaW1wb3J0cyBuZWNlc3NhcnkgZm9yIHRocmlmdAorICovCitzdHJpbmcgdF9oYXhlX2dlbmVyYXRvcjo6aGF4ZV90aHJpZnRfaW1wb3J0cygpIHsKKyAgcmV0dXJuIHN0cmluZygpICsgImltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC4qO1xuIiArICJpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLio7XG4iCisgICAgICAgICArICJpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuKjtcbiIgKyAiXG4iOworfQorCisvKioKKyAqIFByaW50cyBpbXBvcnRzIG5lZWRlZCBmb3IgYSBnaXZlbiB0eXBlCisgKgorICogQHJldHVybiBMaXN0IG9mIGltcG9ydHMgbmVjZXNzYXJ5IGZvciBhIGdpdmVuIHRfc3RydWN0CisgKi8KK3N0cmluZyB0X2hheGVfZ2VuZXJhdG9yOjpoYXhlX3RocmlmdF9nZW5faW1wb3J0cyh0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nJiBpbXBvcnRzKSB7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICAvLyBGb3IgZWFjaCB0eXBlIGNoZWNrIGlmIGl0IGlzIGZyb20gYSBkaWZmZXJlbnQgbmFtZXNwYWNlCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSAoKm1faXRlciktPmdldF90eXBlKCktPmdldF9wcm9ncmFtKCk7CisgICAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7CisgICAgICBzdHJpbmcgcGFja2FnZSA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2UoImhheGUiKTsKKyAgICAgIGlmICghcGFja2FnZS5lbXB0eSgpKSB7CisgICAgICAgIGlmIChpbXBvcnRzLmZpbmQocGFja2FnZSArICIuIiArICgqbV9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X25hbWUoKSkgPT0gc3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgaW1wb3J0cy5hcHBlbmQoImltcG9ydCAiICsgcGFja2FnZSArICIuIiArICgqbV9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X25hbWUoKSArICI7XG4iKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gaW1wb3J0czsKK30KKworLyoqCisgKiBQcmludHMgaW1wb3J0cyBuZWVkZWQgZm9yIGEgZ2l2ZW4gdHlwZQorICoKKyAqIEByZXR1cm4gTGlzdCBvZiBpbXBvcnRzIG5lY2Vzc2FyeSBmb3IgYSBnaXZlbiB0X3NlcnZpY2UKKyAqLworc3RyaW5nIHRfaGF4ZV9nZW5lcmF0b3I6OmhheGVfdGhyaWZ0X2dlbl9pbXBvcnRzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGltcG9ydHM7CisgIGNvbnN0IHZlY3Rvcjx0X2Z1bmN0aW9uKj4mIGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAvLyBGb3IgZWFjaCB0eXBlIGNoZWNrIGlmIGl0IGlzIGZyb20gYSBkaWZmZXJlbnQgbmFtZXNwYWNlCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5nZXRfcHJvZ3JhbSgpOworICAgIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgeworICAgICAgc3RyaW5nIHBhY2thZ2UgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJoYXhlIik7CisgICAgICBpZiAoIXBhY2thZ2UuZW1wdHkoKSkgeworICAgICAgICBpZiAoaW1wb3J0cy5maW5kKHBhY2thZ2UgKyAiLiIgKyAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmdldF9uYW1lKCkpID09IHN0cmluZzo6bnBvcykgeworICAgICAgICAgIGltcG9ydHMuYXBwZW5kKCJpbXBvcnQgIiArIHBhY2thZ2UgKyAiLiIgKyAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICArICI7XG4iKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGhheGVfdGhyaWZ0X2dlbl9pbXBvcnRzKCgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKSwgaW1wb3J0cyk7CisgICAgaGF4ZV90aHJpZnRfZ2VuX2ltcG9ydHMoKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCksIGltcG9ydHMpOworICB9CisKKyAgcmV0dXJuIGltcG9ydHM7Cit9CisKKy8qKgorICogTm90aGluZyBpbiBoYXhlCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgeworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIFRoaXMgaXMgbm90IGRvbmUgaW4gaGF4ZSwgc2luY2UgaXQgZG9lcworICogbm90IHN1cHBvcnQgYXJiaXRyYXJ5IG5hbWUgcmVwbGFjZW1lbnRzLCBhbmQgaXQnZCBiZSBhIHdhY2t5IHdhc3RlCisgKiBvZiBvdmVyaGVhZCB0byBtYWtlIHdyYXBwZXIgY2xhc3Nlcy4KKyAqCisgKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgeworICAodm9pZCl0dHlwZWRlZjsKK30KKworLyoqCisgKiBFbnVtcyBhcmUgYSBjbGFzcyB3aXRoIGEgc2V0IG9mIHN0YXRpYyBjb25zdGFudHMuCisgKgorICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgeworICAvLyBNYWtlIG91dHB1dCBmaWxlCisgIHN0cmluZyBmX2VudW1fbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArIGdldF9jYXBfbmFtZSh0ZW51bS0+Z2V0X25hbWUoKSkgKyAiLmh4IjsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2VudW07CisgIGZfZW51bS5vcGVuKGZfZW51bV9uYW1lLmNfc3RyKCkpOworCisgIC8vIENvbW1lbnQgYW5kIHBhY2thZ2UgaXQKKyAgZl9lbnVtIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGhheGVfcGFja2FnZSgpIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gQWRkIGhheGUgaW1wb3J0cworICBmX2VudW0gPDwgc3RyaW5nKCkgKyAiaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LmhlbHBlci4qOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGdlbmVyYXRlX3J0dGlfZGVjb3JhdGlvbihmX2VudW0pOworICBnZW5lcmF0ZV9tYWNyb19kZWNvcmF0aW9uKGZfZW51bSk7CisgIGluZGVudChmX2VudW0pIDw8ICJjbGFzcyAiIDw8IGdldF9jYXBfbmFtZSh0ZW51bS0+Z2V0X25hbWUoKSkgPDwgIiAiOworICBzY29wZV91cChmX2VudW0pOworCisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOworICAgIGluZGVudChmX2VudW0pIDw8ICJwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIiA6IEludCA9ICIgPDwgdmFsdWUKKyAgICAgICAgICAgICAgICAgICA8PCAiOyIgPDwgZW5kbDsKKyAgfQorCisgIC8vIENyZWF0ZSBhIHN0YXRpYyBTZXQgd2l0aCBhbGwgdmFsaWQgdmFsdWVzIGZvciB0aGlzIGVudW0KKyAgZl9lbnVtIDw8IGVuZGw7CisKKyAgaW5kZW50KGZfZW51bSkgPDwgInB1YmxpYyBzdGF0aWMgdmFyIFZBTElEX1ZBTFVFUyA9IHsgbmV3IEludFNldCggWyI7CisgIGluZGVudF91cCgpOworICBib29sIGZpcnN0VmFsdWUgPSB0cnVlOworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIC8vIHBvcHVsYXRlIHNldAorICAgIGZfZW51bSA8PCAoZmlyc3RWYWx1ZSA/ICIiIDogIiwgIikgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIGZpcnN0VmFsdWUgPSBmYWxzZTsKKyAgfQorICBpbmRlbnRfZG93bigpOworICBmX2VudW0gPDwgIl0pOyB9OyIgPDwgZW5kbDsKKworICBpbmRlbnQoZl9lbnVtKSA8PCAicHVibGljIHN0YXRpYyB2YXIgVkFMVUVTX1RPX05BTUVTID0geyBbIjsKKyAgaW5kZW50X3VwKCk7CisgIGZpcnN0VmFsdWUgPSB0cnVlOworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGZfZW51bSA8PCAoZmlyc3RWYWx1ZSA/ICIiIDogIiwiKSA8PCBlbmRsOworICAgIGluZGVudChmX2VudW0pIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0+IFwiIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiIjsKKyAgICBmaXJzdFZhbHVlID0gZmFsc2U7CisgIH0KKyAgZl9lbnVtIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX2VudW0pIDw8ICJdOyB9OyIgPDwgZW5kbDsKKworICBzY29wZV9kb3duKGZfZW51bSk7IC8vIGVuZCBjbGFzcworCisgIGZfZW51bS5jbG9zZSgpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGNsYXNzIHRoYXQgaG9sZHMgYWxsIHRoZSBjb25zdGFudHMuCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3RzKHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpIHsKKyAgaWYgKGNvbnN0cy5lbXB0eSgpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgc3RyaW5nIGZfY29uc3RzX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyBnZXRfY2FwX25hbWUocHJvZ3JhbV9uYW1lXykgKyAiQ29uc3RhbnRzLmh4IjsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2NvbnN0czsKKyAgZl9jb25zdHMub3BlbihmX2NvbnN0c19uYW1lLmNfc3RyKCkpOworCisgIC8vIFByaW50IGhlYWRlcgorICBmX2NvbnN0cyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBoYXhlX3BhY2thZ2UoKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGZfY29uc3RzIDw8IGVuZGw7CisKKyAgZl9jb25zdHMgPDwgaGF4ZV90eXBlX2ltcG9ydHMoKTsKKworICBnZW5lcmF0ZV9ydHRpX2RlY29yYXRpb24oZl9jb25zdHMpOworICBnZW5lcmF0ZV9tYWNyb19kZWNvcmF0aW9uKGZfY29uc3RzKTsKKyAgaW5kZW50KGZfY29uc3RzKSA8PCAiY2xhc3MgIiA8PCBnZXRfY2FwX25hbWUocHJvZ3JhbV9uYW1lXykgPDwgIkNvbnN0YW50cyB7IiA8PCBlbmRsIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7CisgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgcHJpbnRfY29uc3RfdmFsdWUoZl9jb25zdHMsCisgICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3R5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF92YWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgfQorICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9jb25zdHMpIDw8ICJ9IiA8PCBlbmRsOworICBmX2NvbnN0cy5jbG9zZSgpOworfQorCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OnByaW50X2NvbnN0X3ZhbHVlKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9zdGF0aWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVmdmFsKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGluZGVudChvdXQpOworICBpZiAoIWRlZnZhbCkgeworICAgIG91dCA8PCAoaW5fc3RhdGljID8gInZhciAiIDogInB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciAgIik7CisgIH0KKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgc3RyaW5nIHYyID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgdHlwZSwgdmFsdWUpOworICAgIG91dCA8PCBuYW1lOworICAgIGlmICghZGVmdmFsKSB7CisgICAgICBvdXQgPDwgIjoiIDw8IHR5cGVfbmFtZSh0eXBlKTsKKyAgICB9CisgICAgb3V0IDw8ICIgPSAiIDw8IHYyIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgb3V0IDw8IG5hbWU7CisgICAgaWYgKCFkZWZ2YWwpIHsKKyAgICAgIG91dCA8PCAiOiIgPDwgdHlwZV9uYW1lKHR5cGUpOworICAgIH0KKyAgICBvdXQgPDwgIiA9ICIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgb3V0IDw8IG5hbWUgPDwgIjoiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlKSA8PCAiKCk7IgorICAgICAgICA8PCBlbmRsOworICAgIGlmICghaW5fc3RhdGljKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAieyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50KG91dCkgPDwgIm5ldyBmdW5jdGlvbigpIDogVm9pZCB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOworICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKKyAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisgICAgICB9CisgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiLiI7CisgICAgICBvdXQgPDwgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpIDw8ICIgPSAiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaWYgKCFpbl9zdGF0aWMpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSgpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICBvdXQgPDwgbmFtZTsKKyAgICBpZiAoIWRlZnZhbCkgeworICAgICAgb3V0IDw8ICI6IiA8PCB0eXBlX25hbWUodHlwZSk7CisgICAgfQorICAgIG91dCA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlKSA8PCAiKCk7IiA8PCBlbmRsOworICAgIGlmICghaW5fc3RhdGljKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAieyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50KG91dCkgPDwgIm5ldyBmdW5jdGlvbigpIDogVm9pZCB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBzdHJpbmcga2V5ID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwga3R5cGUsIHZfaXRlci0+Zmlyc3QpOworICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIHZ0eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICJbIiA8PCBrZXkgPDwgIl0gPSAiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaWYgKCFpbl9zdGF0aWMpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSgpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKSB7CisgICAgb3V0IDw8IG5hbWU7CisgICAgaWYgKCFkZWZ2YWwpIHsKKyAgICAgIG91dCA8PCAiOiIgPDwgdHlwZV9uYW1lKHR5cGUpOworICAgIH0KKyAgICBvdXQgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKKyAgICBpZiAoIWluX3N0YXRpYykgeworICAgICAgaW5kZW50KG91dCkgPDwgInsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJuZXcgZnVuY3Rpb24oKSA6IFZvaWQgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKyAgICB0X3R5cGUqIGV0eXBlOworICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9CisgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgZXR5cGUsICp2X2l0ZXIpOworICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiLiIgPDwgKHR5cGUtPmlzX2xpc3QoKSA/ICJwdXNoIiA6ICJhZGQiKSA8PCAiKCIgPDwgdmFsIDw8ICIpOyIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfQorICAgIGlmICghaW5fc3RhdGljKSB7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0oKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICAgIG91dCA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgdHlwZSAiICsgdHlwZS0+Z2V0X25hbWUoKTsKKyAgfQorfQorCitzdHJpbmcgdF9oYXhlX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKyAgKHZvaWQpbmFtZTsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSByZW5kZXI7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJlbmRlciA8PCAnIicgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZW5kZXIgPDwgKCh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDApID8gInRydWUiIDogImZhbHNlIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmVuZGVyIDw8ICIoYnl0ZSkiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZW5kZXIgPDwgIihzaG9ydCkiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiTCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7CisgICAgICAgIHJlbmRlciA8PCAiKGRvdWJsZSkiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgfSBlbHNlIHsKKyAgICBzdHJpbmcgdCA9IHRtcCgidG1wIik7CisgICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LCB0LCB0eXBlLCB2YWx1ZSwgdHJ1ZSk7CisgICAgcmVuZGVyIDw8IHQ7CisgIH0KKworICByZXR1cm4gcmVuZGVyLnN0cigpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuIFRoaXMgaXMgYSBjbGFzcworICogd2l0aCBkYXRhIG1lbWJlcnMsIHJlYWQoKSwgd3JpdGUoKSwgYW5kIGFuIGlubmVyIElzc2V0IGNsYXNzLgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBnZW5lcmF0ZV9oYXhlX3N0cnVjdCh0c3RydWN0LCBmYWxzZSk7Cit9CisKKy8qKgorICogRXhjZXB0aW9ucyBhcmUgc3RydWN0cywgYnV0IHRoZXkgaW5oZXJpdCBmcm9tIEV4Y2VwdGlvbgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKKyAgZ2VuZXJhdGVfaGF4ZV9zdHJ1Y3QodHhjZXB0aW9uLCB0cnVlKTsKK30KKworLyoqCisgKiBIYXhlIHN0cnVjdCBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2hheGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbiwgYm9vbCBpc19yZXN1bHQpIHsKKyAgLy8gTWFrZSBvdXRwdXQgZmlsZQorICBzdHJpbmcgZl9zdHJ1Y3RfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArIGdldF9jYXBfbmFtZSh0c3RydWN0LT5nZXRfbmFtZSgpKSArICIuaHgiOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc3RydWN0OworICBmX3N0cnVjdC5vcGVuKGZfc3RydWN0X25hbWUuY19zdHIoKSk7CisKKyAgZl9zdHJ1Y3QgPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgaGF4ZV9wYWNrYWdlKCkgPDwgIjsiIDw8IGVuZGw7CisKKyAgZl9zdHJ1Y3QgPDwgZW5kbDsKKworICBzdHJpbmcgaW1wb3J0czsKKworICBmX3N0cnVjdCA8PCBoYXhlX3R5cGVfaW1wb3J0cygpIDw8IGhheGVfdGhyaWZ0X2ltcG9ydHMoKQorICAgICAgICAgICA8PCBoYXhlX3RocmlmdF9nZW5faW1wb3J0cyh0c3RydWN0LCBpbXBvcnRzKSA8PCBlbmRsOworCisgIGdlbmVyYXRlX2hheGVfc3RydWN0X2RlZmluaXRpb24oZl9zdHJ1Y3QsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbiwgaXNfcmVzdWx0KTsKKworICBmX3N0cnVjdC5jbG9zZSgpOworfQorCisvKioKKyAqIGhheGUgc3RydWN0IGRlZmluaXRpb24uIFRoaXMgaGFzIHZhcmlvdXMgcGFyYW1ldGVycywgYXMgaXQgY291bGQgYmUKKyAqIGdlbmVyYXRlZCBzdGFuZGFsb25lIG9yIGluc2lkZSBhbm90aGVyIGNsYXNzIGFzIGEgaGVscGVyLiBJZiBpdAorICogaXMgYSBoZWxwZXIgdGhhbiBpdCBpcyBhIHN0YXRpYyBjbGFzcy4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCAgICAgIFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICogQHBhcmFtIGlzX2V4Y2VwdGlvbiBJcyB0aGlzIGFuIGV4Y2VwdGlvbj8KKyAqIEBwYXJhbSBpbl9jbGFzcyAgICAgSWYgaW5zaWRlIGEgY2xhc3MsIG5lZWRzIHRvIGJlIHN0YXRpYyBjbGFzcworICogQHBhcmFtIGlzX3Jlc3VsdCAgICBJZiB0aGlzIGlzIGEgcmVzdWx0IGl0IG5lZWRzIGEgZGlmZmVyZW50IHdyaXRlcgorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2hheGVfc3RydWN0X2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0KSB7CisgIGdlbmVyYXRlX2hheGVfZG9jKG91dCwgdHN0cnVjdCk7CisKKyAgc3RyaW5nIGNsc25hbWUgPSBnZXRfY2FwX25hbWUodHN0cnVjdC0+Z2V0X25hbWUoKSk7CisKKyAgZ2VuZXJhdGVfcnR0aV9kZWNvcmF0aW9uKG91dCk7CisgIGdlbmVyYXRlX21hY3JvX2RlY29yYXRpb24ob3V0KTsKKyAgaW5kZW50KG91dCkgPDwgImNsYXNzICIgPDwgY2xzbmFtZSA8PCAiICI7CisKKyAgaWYgKGlzX2V4Y2VwdGlvbikgeworICAgIG91dCA8PCAiZXh0ZW5kcyBURXhjZXB0aW9uICI7CisgIH0KKyAgb3V0IDw8ICJpbXBsZW1lbnRzIFRCYXNlICI7CisKKyAgc2NvcGVfdXAob3V0KTsKKyAgaW5kZW50KG91dCkgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAic3RhdGljIHZhciBTVFJVQ1RfREVTQyA9IHsgbmV3IFRTdHJ1Y3QoXCIiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIlwiKTsgfTsiCisgICAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgaW5kZW50KG91dCkgPDwgInN0YXRpYyB2YXIgIiA8PCBjb25zdGFudF9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkKKyAgICAgICAgICAgICAgICA8PCAiX0ZJRUxEX0RFU0MgPSB7IG5ldyBURmllbGQoXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIsICIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiLCAiIDw8ICgqbV9pdGVyKS0+Z2V0X2tleSgpIDw8ICIpOyB9OyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICB9CisgIG91dCA8PCBlbmRsOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9oYXhlX2RvYyhvdXQsICptX2l0ZXIpOworICAgIC8vIGluZGVudChvdXQpIDw8ICJwcml2YXRlIHZhciBfIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgKyAiIDogIiArCisgICAgLy8gdHlwZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIkA6aXNWYXIiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyB2YXIgIgorICAgICAgICAgICAgICAgIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSArICIoZ2V0LHNldCkgOiAiCisgICAgICAgICAgICAgICAgICAgKyBnZXRfY2FwX25hbWUodHlwZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkpIDw8ICI7IiA8PCBlbmRsOworICB9CisKKyAgb3V0IDw8IGVuZGw7CisKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIGluZGVudChvdXQpIDw8ICJpbmxpbmUgc3RhdGljIHZhciAiIDw8IHVwY2FzZV9zdHJpbmcoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgIDw8ICJfRklFTERfSUQgOiBJbnQgPSAiIDw8ICgqbV9pdGVyKS0+Z2V0X2tleSgpIDw8ICI7IiA8PCBlbmRsOworICB9CisKKyAgb3V0IDw8IGVuZGw7CisKKyAgLy8gSW5uZXIgSXNzZXQgY2xhc3MKKyAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgeworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIGlmICghdHlwZV9jYW5fYmVfbnVsbCgoKm1faXRlciktPmdldF90eXBlKCkpKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJwcml2YXRlIHZhciBfX2lzc2V0XyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgOiBCb29sID0gZmFsc2U7IgorICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgfQorCisgIG91dCA8PCBlbmRsOworCisgIC8vIFN0YXRpYyBpbml0aWFsaXplciB0byBwb3B1bGF0ZSBnbG9iYWwgY2xhc3MgdG8gc3RydWN0IG1ldGFkYXRhIG1hcAorICBpZiAoZmFsc2UpIHsKKyAgICAvLyBUT0RPOiByZWFjdGl2YXRlIHdoZW4gbmVlZGVkCisgICAgZ2VuZXJhdGVfaGF4ZV9tZXRhX2RhdGFfbWFwKG91dCwgdHN0cnVjdCk7CisgICAgaW5kZW50KG91dCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgIkZpZWxkTWV0YURhdGEuYWRkU3RydWN0TWV0YURhdGFNYXAoIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIiwgbWV0YURhdGFNYXApOyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKworICAvLyBEZWZhdWx0IGNvbnN0cnVjdG9yCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuY3Rpb24gbmV3KCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGlmIChpc19leGNlcHRpb24pIHsKKyAgICBpbmRlbnQob3V0KSA8PCAic3VwZXIoKTsiIDw8IGVuZGw7CisgIH0KKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIGlmICgoKm1faXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiCisgICAgICAgICAgICAgICAgICA8PCAoKm1faXRlciktPmdldF92YWx1ZSgpLT5nZXRfaW50ZWdlcigpIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKyAgfQorICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGdlbmVyYXRlX3Byb3BlcnR5X2dldHRlcnNfc2V0dGVycyhvdXQsIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9nZW5lcmljX2ZpZWxkX2dldHRlcnNfc2V0dGVycyhvdXQsIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9nZW5lcmljX2lzc2V0X21ldGhvZChvdXQsIHRzdHJ1Y3QpOworCisgIGdlbmVyYXRlX2hheGVfc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QpOworICBpZiAoaXNfcmVzdWx0KSB7CisgICAgZ2VuZXJhdGVfaGF4ZV9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOworICB9IGVsc2UgeworICAgIGdlbmVyYXRlX2hheGVfc3RydWN0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOworICB9CisgIGdlbmVyYXRlX2hheGVfc3RydWN0X3Rvc3RyaW5nKG91dCwgdHN0cnVjdCk7CisgIGdlbmVyYXRlX2hheGVfdmFsaWRhdG9yKG91dCwgdHN0cnVjdCk7CisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gcmVhZCBhbGwgdGhlIGZpZWxkcyBvZiB0aGUgc3RydWN0LgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2hheGVfc3RydWN0X3JlYWRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGZ1bmN0aW9uIHJlYWQoIGlwcm90IDogVFByb3RvY29sKSA6IFZvaWQgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGluZGVudChvdXQpIDw8ICJpcHJvdC5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInRyeSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKworICAvLyBEZWNsYXJlIHN0YWNrIHRtcCB2YXJpYWJsZXMgYW5kIHJlYWQgc3RydWN0IGhlYWRlcgorICBvdXQgPDwgaW5kZW50KCkgPDwgInZhciBmaWVsZCA6IFRGaWVsZDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlwcm90LnJlYWRTdHJ1Y3RCZWdpbigpOyIKKyAgICAgIDw8IGVuZGw7CisKKyAgLy8gTG9vcCBvdmVyIHJlYWRpbmcgaW4gZmllbGRzCisgIGluZGVudChvdXQpIDw8ICJ3aGlsZSAodHJ1ZSkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgLy8gUmVhZCBiZWdpbm5pbmcgZmllbGQgbWFya2VyCisgIGluZGVudChvdXQpIDw8ICJmaWVsZCA9IGlwcm90LnJlYWRGaWVsZEJlZ2luKCk7IiA8PCBlbmRsOworCisgIC8vIENoZWNrIGZvciBmaWVsZCBTVE9QIG1hcmtlciBhbmQgYnJlYWsKKyAgaW5kZW50KG91dCkgPDwgImlmIChmaWVsZC50eXBlID09IFRUeXBlLlNUT1ApIHsgIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgLy8gU3dpdGNoIHN0YXRlbWVudCBvbiB0aGUgZmllbGQgd2UgYXJlIHJlYWRpbmcKKyAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmllbGQuaWQpIiA8PCBlbmRsOworCisgIHNjb3BlX3VwKG91dCk7CisKKyAgLy8gR2VuZXJhdGUgZGVzZXJpYWxpemF0aW9uIGNvZGUgZm9yIGtub3duIGNhc2VzCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCB1cGNhc2Vfc3RyaW5nKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIl9GSUVMRF9JRDoiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgImlmIChmaWVsZC50eXBlID09ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIikgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMuIik7CisgICAgZ2VuZXJhdGVfaXNzZXRfc2V0KG91dCwgKmZfaXRlcik7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7ICIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOyIKKyAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgLy8gSW4gdGhlIGRlZmF1bHQgY2FzZSB3ZSBza2lwIHRoZSBmaWVsZAorICBvdXQgPDwgaW5kZW50KCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIFRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7IgorICAgICAgPDwgZW5kbDsKKworICBzY29wZV9kb3duKG91dCk7CisKKyAgLy8gUmVhZCBmaWVsZCBlbmQgbWFya2VyCisgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkRmllbGRFbmQoKTsiIDw8IGVuZGw7CisKKyAgc2NvcGVfZG93bihvdXQpOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaXByb3QucmVhZFN0cnVjdEVuZCgpOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJpcHJvdC5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihvdXQpOworICBpbmRlbnQob3V0KSA8PCAiY2F0Y2goZTpEeW5hbWljKSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKyAgaW5kZW50KG91dCkgPDwgImlwcm90LkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAidGhyb3cgZTsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24ob3V0KTsKKworICAvLyBjaGVjayBmb3IgcmVxdWlyZWQgZmllbGRzIG9mIHByaW1pdGl2ZSB0eXBlCisgIC8vICh3aGljaCBjYW4gYmUgY2hlY2tlZCBoZXJlIGJ1dCBub3QgaW4gdGhlIGdlbmVyYWwgdmFsaWRhdGUgbWV0aG9kKQorICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiLy8gY2hlY2sgZm9yIHJlcXVpcmVkIGZpZWxkcyBvZiBwcmltaXRpdmUgdHlwZSwgd2hpY2ggY2FuJ3QgYmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2hlY2tlZCBpbiB0aGUgdmFsaWRhdGUgbWV0aG9kIiA8PCBlbmRsOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEICYmICF0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCFfX2lzc2V0XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAiICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5VTktOT1dOLCBcIlJlcXVpcmVkIGZpZWxkICciCisgICAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgPDwgIicgd2FzIG5vdCBmb3VuZCBpbiBzZXJpYWxpemVkIGRhdGEhIFN0cnVjdDogXCIgKyB0b1N0cmluZygpKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICAvLyBwZXJmb3JtcyB2YXJpb3VzIGNoZWNrcyAoZS5nLiBjaGVjayB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHNldCkKKyAgaW5kZW50KG91dCkgPDwgInZhbGlkYXRlKCk7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvLyBnZW5lcmF0ZXMgaGF4ZSBtZXRob2QgdG8gcGVyZm9ybSB2YXJpb3VzIGNoZWNrcworLy8gKGUuZy4gY2hlY2sgdGhhdCBhbGwgcmVxdWlyZWQgZmllbGRzIGFyZSBzZXQpCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2hheGVfdmFsaWRhdG9yKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jdGlvbiB2YWxpZGF0ZSgpIDogVm9pZCB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIvLyBjaGVjayBmb3IgcmVxdWlyZWQgZmllbGRzIiA8PCBlbmRsOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9PSBudWxsKSB7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnQob3V0KQorICAgICAgICAgICAgPDwgIiAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uVU5LTk9XTiwgXCJSZXF1aXJlZCBmaWVsZCAnIgorICAgICAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInIHdhcyBub3QgcHJlc2VudCEgU3RydWN0OiBcIiArIHRvU3RyaW5nKCkpOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiLy8gYWxhcywgd2UgY2Fubm90IGNoZWNrICciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICA8PCAiJyBiZWNhdXNlIGl0J3MgYSBwcmltaXRpdmUuIiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIGNoZWNrIHRoYXQgZmllbGRzIG9mIHR5cGUgZW51bSBoYXZlIHZhbGlkIHZhbHVlcworICBvdXQgPDwgaW5kZW50KCkgPDwgIi8vIGNoZWNrIHRoYXQgZmllbGRzIG9mIHR5cGUgZW51bSBoYXZlIHZhbGlkIHZhbHVlcyIgPDwgZW5kbDsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqZl9pdGVyKTsKKyAgICB0X3R5cGUqIHR5cGUgPSBmaWVsZC0+Z2V0X3R5cGUoKTsKKyAgICAvLyBpZiBmaWVsZCBpcyBhbiBlbnVtLCBjaGVjayB0aGF0IGl0cyB2YWx1ZSBpcyB2YWxpZAorICAgIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjayhmaWVsZCkgPDwgIiAmJiAhIgorICAgICAgICAgICAgICAgICAgPDwgZ2V0X2NhcF9uYW1lKGdldF9lbnVtX2NsYXNzX25hbWUodHlwZSkpIDw8ICIuVkFMSURfVkFMVUVTLmNvbnRhaW5zKCIKKyAgICAgICAgICAgICAgICAgIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIpKXsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5VTktOT1dOLCBcIlRoZSBmaWVsZCAnIgorICAgICAgICAgICAgICAgICAgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIicgaGFzIGJlZW4gYXNzaWduZWQgdGhlIGludmFsaWQgdmFsdWUgXCIgKyAiCisgICAgICAgICAgICAgICAgICA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbiB0byB3cml0ZSBhbGwgdGhlIGZpZWxkcyBvZiB0aGUgc3RydWN0CisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaGF4ZV9zdHJ1Y3Rfd3JpdGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgZnVuY3Rpb24gd3JpdGUob3Byb3Q6VFByb3RvY29sKSA6IFZvaWQgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIC8vIHBlcmZvcm1zIHZhcmlvdXMgY2hlY2tzIChlLmcuIGNoZWNrIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgc2V0KQorICBpbmRlbnQob3V0KSA8PCAidmFsaWRhdGUoKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJvcHJvdC5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInRyeSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKworICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbihTVFJVQ1RfREVTQyk7IiA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgYm9vbCBjb3VsZF9iZV91bnNldCA9ICgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUw7CisgICAgaWYgKGNvdWxkX2JlX3Vuc2V0KSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKmZfaXRlcikgPDwgIikgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKyAgICBib29sIG51bGxfYWxsb3dlZCA9IHR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICBpZiAobnVsbF9hbGxvd2VkKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICh0aGlzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUZpZWxkQmVnaW4oIiA8PCBjb25zdGFudF9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkKKyAgICAgICAgICAgICAgICA8PCAiX0ZJRUxEX0RFU0MpOyIgPDwgZW5kbDsKKworICAgIC8vIFdyaXRlIGZpZWxkIGNvbnRlbnRzCisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMuIik7CisKKyAgICAvLyBXcml0ZSBmaWVsZCBjbG9zZXIKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVGaWVsZEVuZCgpOyIgPDwgZW5kbDsKKworICAgIGlmIChudWxsX2FsbG93ZWQpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgICAgaWYgKGNvdWxkX2JlX3Vuc2V0KSB7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlRmllbGRTdG9wKCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgIm9wcm90LkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsOworICBzY29wZV9kb3duKG91dCk7CisgIGluZGVudChvdXQpIDw8ICJjYXRjaChlOkR5bmFtaWMpIiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworICBpbmRlbnQob3V0KSA8PCAib3Byb3QuRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ0aHJvdyBlOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihvdXQpOworCisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGZ1bmN0aW9uIHRvIHdyaXRlIGFsbCB0aGUgZmllbGRzIG9mIHRoZSBzdHJ1Y3QsCisgKiB3aGljaCBpcyBhIGZ1bmN0aW9uIHJlc3VsdC4gVGhlc2UgZmllbGRzIGFyZSBvbmx5IHdyaXR0ZW4KKyAqIGlmIHRoZXkgYXJlIHNldCBpbiB0aGUgSXNzZXQgYXJyYXksIGFuZCBvbmx5IG9uZSBvZiB0aGVtCisgKiBjYW4gYmUgc2V0IGF0IGEgdGltZS4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9oYXhlX3N0cnVjdF9yZXN1bHRfd3JpdGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgZnVuY3Rpb24gd3JpdGUob3Byb3Q6VFByb3RvY29sKSA6IFZvaWQgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGluZGVudChvdXQpIDw8ICJvcHJvdC5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInRyeSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKworICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbihTVFJVQ1RfREVTQyk7IiA8PCBlbmRsOworCisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpZiAiOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgIiBlbHNlIGlmICI7CisgICAgfQorCisgICAgb3V0IDw8ICIodGhpcy4iIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKCpmX2l0ZXIpIDw8ICIpIHsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUZpZWxkQmVnaW4oIiA8PCBjb25zdGFudF9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkKKyAgICAgICAgICAgICAgICA8PCAiX0ZJRUxEX0RFU0MpOyIgPDwgZW5kbDsKKworICAgIC8vIFdyaXRlIGZpZWxkIGNvbnRlbnRzCisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMuIik7CisKKyAgICAvLyBXcml0ZSBmaWVsZCBjbG9zZXIKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVGaWVsZEVuZCgpOyIgPDwgZW5kbDsKKworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlRmllbGRTdG9wKCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgIm9wcm90LkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsOworICBzY29wZV9kb3duKG91dCk7CisgIGluZGVudChvdXQpIDw8ICJjYXRjaChlOkR5bmFtaWMpIiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworICBpbmRlbnQob3V0KSA8PCAib3Byb3QuRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ0aHJvdyBlOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihvdXQpOworCisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3JlZmxlY3Rpb25fZ2V0dGVycyhvc3RyaW5nc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjYXBfbmFtZSkgeworICAodm9pZCl0eXBlOworICAodm9pZCljYXBfbmFtZTsKKyAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCB1cGNhc2Vfc3RyaW5nKGZpZWxkX25hbWUpIDw8ICJfRklFTERfSUQ6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgInJldHVybiB0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKK30KKwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yZWZsZWN0aW9uX3NldHRlcnMob3N0cmluZ3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY2FwX25hbWUpIHsKKyAgKHZvaWQpdHlwZTsKKyAgKHZvaWQpY2FwX25hbWU7CisgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgdXBjYXNlX3N0cmluZyhmaWVsZF9uYW1lKSA8PCAiX0ZJRUxEX0lEOiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJpZiAodmFsdWUgPT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgdW5zZXQiIDw8IGdldF9jYXBfbmFtZShmaWVsZF9uYW1lKSA8PCAiKCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSB2YWx1ZTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKK30KKwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nZW5lcmljX2ZpZWxkX2dldHRlcnNfc2V0dGVycyhzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKworICBzdGQ6Om9zdHJpbmdzdHJlYW0gZ2V0dGVyX3N0cmVhbTsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHNldHRlcl9zdHJlYW07CisKKyAgLy8gYnVpbGQgdXAgdGhlIGJvZGllcyBvZiBib3RoIHRoZSBnZXR0ZXIgYW5kIHNldHRlciBhdCBvbmNlCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICpmX2l0ZXI7CisgICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZShmaWVsZC0+Z2V0X3R5cGUoKSk7CisgICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9IGZpZWxkLT5nZXRfbmFtZSgpOworICAgIHN0ZDo6c3RyaW5nIGNhcF9uYW1lID0gZ2V0X2NhcF9uYW1lKGZpZWxkX25hbWUpOworCisgICAgaW5kZW50X3VwKCk7CisgICAgZ2VuZXJhdGVfcmVmbGVjdGlvbl9zZXR0ZXJzKHNldHRlcl9zdHJlYW0sIHR5cGUsIGZpZWxkX25hbWUsIGNhcF9uYW1lKTsKKyAgICBnZW5lcmF0ZV9yZWZsZWN0aW9uX2dldHRlcnMoZ2V0dGVyX3N0cmVhbSwgdHlwZSwgZmllbGRfbmFtZSwgY2FwX25hbWUpOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICAvLyBjcmVhdGUgdGhlIHNldHRlcgorICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIHNldEZpZWxkVmFsdWUoZmllbGRJRCA6IEludCwgdmFsdWUgOiBEeW5hbWljKSA6IFZvaWQgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaWYgKGZpZWxkcy5zaXplKCkgPiAwKSB7CisgICAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmllbGRJRCkgeyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgc2V0dGVyX3N0cmVhbS5zdHIoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoXCJGaWVsZCBcIiArIGZpZWxkSUQgKyBcIiBkb2Vzbid0IGV4aXN0IVwiKTsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgInRocm93IG5ldyBBcmd1bWVudEVycm9yKFwiRmllbGQgXCIgKyBmaWVsZElEICsgXCIgZG9lc24ndCBleGlzdCFcIik7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBjcmVhdGUgdGhlIGdldHRlcgorICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIGdldEZpZWxkVmFsdWUoZmllbGRJRCA6IEludCkgOiBEeW5hbWljIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGlmIChmaWVsZHMuc2l6ZSgpID4gMCkgeworICAgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKGZpZWxkSUQpIHsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGdldHRlcl9zdHJlYW0uc3RyKCk7CisgICAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKFwiRmllbGQgXCIgKyBmaWVsZElEICsgXCIgZG9lc24ndCBleGlzdCFcIik7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChvdXQpIDw8ICJ0aHJvdyBuZXcgQXJndW1lbnRFcnJvcihcIkZpZWxkIFwiICsgZmllbGRJRCArIFwiIGRvZXNuJ3QgZXhpc3QhXCIpOyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLy8gQ3JlYXRlcyBhIGdlbmVyaWMgaXNTZXQgbWV0aG9kIHRoYXQgdGFrZXMgdGhlIGZpZWxkIG51bWJlciBhcyBhcmd1bWVudAordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nZW5lcmljX2lzc2V0X21ldGhvZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIC8vIGNyZWF0ZSB0aGUgaXNTZXQgbWV0aG9kCisgIGluZGVudChvdXQpIDw8ICIvLyBSZXR1cm5zIHRydWUgaWYgZmllbGQgY29ycmVzcG9uZGluZyB0byBmaWVsZElEIGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSAiCisgICAgICAgICAgICAgICAgICJ2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jdGlvbiBpc1NldChmaWVsZElEIDogSW50KSA6IEJvb2wgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGlmIChmaWVsZHMuc2l6ZSgpID4gMCkgeworICAgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKGZpZWxkSUQpIHsiIDw8IGVuZGw7CisKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgdF9maWVsZCogZmllbGQgPSAqZl9pdGVyOworICAgICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCB1cGNhc2Vfc3RyaW5nKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiX0ZJRUxEX0lEOiIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiAiIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKGZpZWxkKSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgfQorCisgICAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKFwiRmllbGQgXCIgKyBmaWVsZElEICsgXCIgZG9lc24ndCBleGlzdCFcIik7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChvdXQpIDw8ICJ0aHJvdyBuZXcgQXJndW1lbnRFcnJvcihcIkZpZWxkIFwiICsgZmllbGRJRCArIFwiIGRvZXNuJ3QgZXhpc3QhXCIpOyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2V0IG9mIHByb3BlcnR5IHNldHRlcnMvZ2V0dGVycyBmb3IgdGhlIGdpdmVuIHN0cnVjdC4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9wZXJ0eV9nZXR0ZXJzX3NldHRlcnMob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAqZl9pdGVyOworICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUoZmllbGQtPmdldF90eXBlKCkpOworICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSBmaWVsZC0+Z2V0X25hbWUoKTsKKyAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSA9IGdldF9jYXBfbmFtZShmaWVsZF9uYW1lKTsKKworICAgIC8vIFNpbXBsZSBnZXR0ZXIKKyAgICBnZW5lcmF0ZV9oYXhlX2RvYyhvdXQsIGZpZWxkKTsKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIGdldF8iIDw8IGZpZWxkX25hbWUgPDwgIigpIDogIiA8PCBnZXRfY2FwX25hbWUodHlwZV9uYW1lKHR5cGUpKQorICAgICAgICAgICAgICAgIDw8ICIgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIC8vIFNpbXBsZSBzZXR0ZXIKKyAgICBnZW5lcmF0ZV9oYXhlX2RvYyhvdXQsIGZpZWxkKTsKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIHNldF8iIDw8IGZpZWxkX25hbWUgPDwgIigiIDw8IGZpZWxkX25hbWUgPDwgIjoiCisgICAgICAgICAgICAgICAgPDwgZ2V0X2NhcF9uYW1lKHR5cGVfbmFtZSh0eXBlKSkgPDwgIikgOiAiIDw8IGdldF9jYXBfbmFtZSh0eXBlX25hbWUodHlwZSkpIDw8ICIgeyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID0gIiA8PCBmaWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsOworICAgIGdlbmVyYXRlX2lzc2V0X3NldChvdXQsIGZpZWxkKTsKKyAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsOworCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgLy8gVW5zZXR0ZXIKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIHVuc2V0IiA8PCBjYXBfbmFtZSA8PCAiKCkgOiBWb2lkIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaWYgKHR5cGVfY2FuX2JlX251bGwodHlwZSkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID0gbnVsbDsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLl9faXNzZXRfIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSBmYWxzZTsiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIC8vIGlzU2V0IG1ldGhvZAorICAgIGluZGVudChvdXQpIDw8ICIvLyBSZXR1cm5zIHRydWUgaWYgZmllbGQgIiA8PCBmaWVsZF9uYW1lCisgICAgICAgICAgICAgICAgPDwgIiBpcyBzZXQgKGhhcyBiZWVuIGFzc2lnbmVkIGEgdmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jdGlvbiBpcyIgPDwgZ2V0X2NhcF9uYW1lKCJzZXQiKSA8PCBjYXBfbmFtZSA8PCAiKCkgOiBCb29sIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaWYgKHR5cGVfY2FuX2JlX251bGwodHlwZSkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiAhPSBudWxsOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiB0aGlzLl9faXNzZXRfIiA8PCBmaWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSB0b1N0cmluZygpIG1ldGhvZCBmb3IgdGhlIGdpdmVuIHN0cnVjdAorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2hheGVfc3RydWN0X3Rvc3RyaW5nKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgIgorICAgICAgPDwgImZ1bmN0aW9uIHRvU3RyaW5nKCkgOiBTdHJpbmcgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YXIgcmV0IDogU3RyaW5nID0gXCIiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIihcIjsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAidmFyIGZpcnN0IDogQm9vbCA9IHRydWU7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBib29sIGNvdWxkX2JlX3Vuc2V0ID0gKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTDsKKyAgICBpZiAoY291bGRfYmVfdW5zZXQpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygqZl9pdGVyKSA8PCAiKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorCisgICAgdF9maWVsZCogZmllbGQgPSAoKmZfaXRlcik7CisKKyAgICBpZiAoIWZpcnN0KSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCFmaXJzdCkgcmV0ICs9ICBcIiwgXCI7IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnQob3V0KSA8PCAicmV0ICs9IFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIjpcIjsiIDw8IGVuZGw7CisgICAgYm9vbCBjYW5fYmVfbnVsbCA9IHR5cGVfY2FuX2JlX251bGwoZmllbGQtPmdldF90eXBlKCkpOworICAgIGlmIChjYW5fYmVfbnVsbCkgeworICAgICAgaW5kZW50KG91dCkgPDwgImlmICh0aGlzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgIHJldCArPSBcIm51bGxcIjsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICB9CisKKyAgICBpZiAoZmllbGQtPmdldF90eXBlKCktPmlzX2JpbmFyeSgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICByZXQgKz0gXCJCSU5BUllcIjsiIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmIChmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfZW51bSgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAidmFyICIgPDwgZmllbGQtPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgIDw8ICJfbmFtZSA6IFN0cmluZyA9ICIgPDwgZ2V0X2NhcF9uYW1lKGdldF9lbnVtX2NsYXNzX25hbWUoZmllbGQtPmdldF90eXBlKCkpKQorICAgICAgICAgICAgICAgICAgPDwgIi5WQUxVRVNfVE9fTkFNRVNbdGhpcy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIl9uYW1lICE9IG51bGwpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICByZXQgKz0gIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiX25hbWU7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIiAgcmV0ICs9IFwiIChcIjsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJyZXQgKz0gdGhpcy4iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICJfbmFtZSAhPSBudWxsKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIiAgcmV0ICs9IFwiKVwiOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAicmV0ICs9IHRoaXMuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorCisgICAgaWYgKGNhbl9iZV9udWxsKSB7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudChvdXQpIDw8ICJmaXJzdCA9IGZhbHNlOyIgPDwgZW5kbDsKKworICAgIGlmIChjb3VsZF9iZV91bnNldCkgeworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgICBmaXJzdCA9IGZhbHNlOworICB9CisgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0ICs9IFwiKVwiOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHJldDsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdGF0aWMgbWFwIHdpdGggbWV0YSBkYXRhIHRvIHN0b3JlIGluZm9ybWF0aW9uIHN1Y2ggYXMgZmllbGRJRCB0bworICogZmllbGROYW1lIG1hcHBpbmcKKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9oYXhlX21ldGFfZGF0YV9tYXAob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgLy8gU3RhdGljIE1hcCB3aXRoIGZpZWxkSUQgLT4gRmllbGRNZXRhRGF0YSBtYXBwaW5ncworICBpbmRlbnQob3V0KSA8PCAiaW5saW5lIHN0YXRpYyB2YXIgbWV0YURhdGFNYXAgOiBJbnRNYXAgPSBuZXcgSW50TWFwKCk7IiA8PCBlbmRsOworCisgIGlmIChmaWVsZHMuc2l6ZSgpID4gMCkgeworICAgIC8vIFBvcHVsYXRlIG1hcAorICAgIHNjb3BlX3VwKG91dCk7CisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIHRfZmllbGQqIGZpZWxkID0gKmZfaXRlcjsKKyAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSBmaWVsZC0+Z2V0X25hbWUoKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJtZXRhRGF0YU1hcFsiIDw8IHVwY2FzZV9zdHJpbmcoZmllbGRfbmFtZSkKKyAgICAgICAgICAgICAgICAgIDw8ICJfRklFTERfSURdID0gbmV3IEZpZWxkTWV0YURhdGEoXCIiIDw8IGZpZWxkX25hbWUgPDwgIlwiLCAiOworCisgICAgICAvLyBTZXQgZmllbGQgcmVxdWlyZW1lbnQgdHlwZSAocmVxdWlyZWQsIG9wdGlvbmFsLCBldGMuKQorICAgICAgaWYgKGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgICBvdXQgPDwgIlRGaWVsZFJlcXVpcmVtZW50VHlwZS5SRVFVSVJFRCwgIjsKKyAgICAgIH0gZWxzZSBpZiAoZmllbGQtPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMKSB7CisgICAgICAgIG91dCA8PCAiVEZpZWxkUmVxdWlyZW1lbnRUeXBlLk9QVElPTkFMLCAiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0IDw8ICJURmllbGRSZXF1aXJlbWVudFR5cGUuREVGQVVMVCwgIjsKKyAgICAgIH0KKworICAgICAgLy8gQ3JlYXRlIHZhbHVlIG1ldGEgZGF0YQorICAgICAgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKG91dCwgZmllbGQtPmdldF90eXBlKCkpOworICAgICAgb3V0IDw8ICIpOyIgPDwgZW5kbDsKKyAgICB9CisgICAgc2NvcGVfZG93bihvdXQpOworICB9Cit9CisKKy8qKgorICogUmV0dXJucyBhIHN0cmluZyB3aXRoIHRoZSBoYXhlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiB0aHJpZnQgdHlwZQorICogKGUuZy4gZm9yIHRoZSB0eXBlIHN0cnVjdCBpdCByZXR1cm5zICJUVHlwZS5TVFJVQ1QiKQorICovCitzdGQ6OnN0cmluZyB0X2hheGVfZ2VuZXJhdG9yOjpnZXRfaGF4ZV90eXBlX3N0cmluZyh0X3R5cGUqIHR5cGUpIHsKKyAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAiVFR5cGUuTElTVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLk1BUCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLlNFVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiAiVFR5cGUuU1RSVUNUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLkkzMiI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgcmV0dXJuIGdldF9oYXhlX3R5cGVfc3RyaW5nKCgodF90eXBlZGVmKil0eXBlKS0+Z2V0X3R5cGUoKSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICBzd2l0Y2ggKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgcmV0dXJuICJUVHlwZS5WT0lEIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICJUVHlwZS5TVFJJTkciOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICJUVHlwZS5CT09MIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZXR1cm4gIlRUeXBlLkJZVEUiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gIlRUeXBlLkkxNiI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAiVFR5cGUuSTMyIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICJUVHlwZS5JNjQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIlRUeXBlLkRPVUJMRSI7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCJVbmtub3duIHRocmlmdCB0eXBlIFwiIiArIHR5cGUtPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJcIiBwYXNzZWQgdG8gdF9oYXhlX2dlbmVyYXRvcjo6Z2V0X2hheGVfdHlwZV9zdHJpbmchIik7CisgICAgICBicmVhazsgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoCisgICAgICAgICJVbmtub3duIHRocmlmdCB0eXBlIFwiIiArIHR5cGUtPmdldF9uYW1lKCkKKyAgICAgICAgKyAiXCIgcGFzc2VkIHRvIHRfaGF4ZV9nZW5lcmF0b3I6OmdldF9oYXhlX3R5cGVfc3RyaW5nISIpOyAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4hCisgIH0KK30KKwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSkgeworICBvdXQgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudF91cCgpOworICBpZiAodHlwZS0+aXNfc3RydWN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAibmV3IFN0cnVjdE1ldGFEYXRhKFRUeXBlLlNUUlVDVCwgIiA8PCB0eXBlX25hbWUodHlwZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAibmV3IExpc3RNZXRhRGF0YShUVHlwZS5MSVNULCAiOworICAgICAgdF90eXBlKiBlbGVtX3R5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICAgIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShvdXQsIGVsZW1fdHlwZSk7CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIm5ldyBTZXRNZXRhRGF0YShUVHlwZS5TRVQsICI7CisgICAgICB0X3R5cGUqIGVsZW1fdHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgICAgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKG91dCwgZWxlbV90eXBlKTsKKyAgICB9IGVsc2UgeyAvLyBtYXAKKyAgICAgIGluZGVudChvdXQpIDw8ICJuZXcgTWFwTWV0YURhdGEoVFR5cGUuTUFQLCAiOworICAgICAgdF90eXBlKiBrZXlfdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICAgIHRfdHlwZSogdmFsX3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisgICAgICBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEob3V0LCBrZXlfdHlwZSk7CisgICAgICBvdXQgPDwgIiwgIjsKKyAgICAgIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShvdXQsIHZhbF90eXBlKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgIm5ldyBGaWVsZFZhbHVlTWV0YURhdGEoIiA8PCBnZXRfaGF4ZV90eXBlX3N0cmluZyh0eXBlKTsKKyAgfQorICBvdXQgPDwgIikiOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnRfZG93bigpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHRocmlmdCBzZXJ2aWNlLiBJbiBDKyssIHRoaXMgY29tcHJpc2VzIGFuIGVudGlyZWx5IHNlcGFyYXRlCisgKiBoZWFkZXIgYW5kIHNvdXJjZSBmaWxlLiBUaGUgaGVhZGVyIGZpbGUgZGVmaW5lcyB0aGUgbWV0aG9kcyBhbmQgaW5jbHVkZXMKKyAqIHRoZSBkYXRhIHR5cGVzIGRlZmluZWQgaW4gdGhlIG1haW4gaGVhZGVyIGZpbGUsIGFuZCB0aGUgaW1wbGVtZW50YXRpb24KKyAqIGZpbGUgY29udGFpbnMgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBiYXNpYyBwcmludGVyIGFuZCBkZWZhdWx0IGludGVyZmFjZXMuCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGRlZmluaXRpb24KKyAqLwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgLy8gTWFrZSBpbnRlcmZhY2UgZmlsZQorICBzdHJpbmcgZl9zZXJ2aWNlX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyBnZXRfY2FwX25hbWUoc2VydmljZV9uYW1lXykgKyAiLmh4IjsKKyAgZl9zZXJ2aWNlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOworCisgIGZfc2VydmljZV8gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgaGF4ZV9wYWNrYWdlKCkgPDwgIjsiIDw8IGVuZGw7CisKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsIDw8IGhheGVfdHlwZV9pbXBvcnRzKCkgPDwgaGF4ZV90aHJpZnRfaW1wb3J0cygpCisgICAgICAgICAgICAgPDwgaGF4ZV90aHJpZnRfZ2VuX2ltcG9ydHModHNlcnZpY2UpOworCisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgdF90eXBlKiBwYXJlbnQgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKKyAgICBzdHJpbmcgcGFyZW50X25hbWVzcGFjZSA9IHBhcmVudC0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWVzcGFjZSgiaGF4ZSIpOworICAgIGlmICghcGFyZW50X25hbWVzcGFjZS5lbXB0eSgpICYmIHBhcmVudF9uYW1lc3BhY2UgIT0gcGFja2FnZV9uYW1lXykgeworICAgICAgZl9zZXJ2aWNlXyA8PCAiaW1wb3J0ICIgPDwgdHlwZV9uYW1lKHBhcmVudCkgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlKTsKKworICBmX3NlcnZpY2VfLmNsb3NlKCk7CisKKyAgLy8gTm93IG1ha2UgdGhlIGltcGxlbWVudGF0aW9uL2NsaWVudCBmaWxlCisgIGZfc2VydmljZV9uYW1lID0gcGFja2FnZV9kaXJfICsgIi8iICsgZ2V0X2NhcF9uYW1lKHNlcnZpY2VfbmFtZV8pICsgIkltcGwuaHgiOworICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7CisKKyAgZl9zZXJ2aWNlXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBoYXhlX3BhY2thZ2UoKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsIDw8IGhheGVfdHlwZV9pbXBvcnRzKCkKKyAgICAgICAgICAgICA8PCBoYXhlX3RocmlmdF9pbXBvcnRzKCkgPDwgaGF4ZV90aHJpZnRfZ2VuX2ltcG9ydHModHNlcnZpY2UpIDw8IGVuZGw7CisKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICB0X3R5cGUqIHBhcmVudCA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworICAgIHN0cmluZyBwYXJlbnRfbmFtZXNwYWNlID0gcGFyZW50LT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZXNwYWNlKCJoYXhlIik7CisgICAgaWYgKCFwYXJlbnRfbmFtZXNwYWNlLmVtcHR5KCkgJiYgcGFyZW50X25hbWVzcGFjZSAhPSBwYWNrYWdlX25hbWVfKSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICJpbXBvcnQgIiA8PCB0eXBlX25hbWUocGFyZW50KSA8PCAiSW1wbDsiIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlKTsKKworICBmX3NlcnZpY2VfLmNsb3NlKCk7CisKKyAgLy8gTm93IG1ha2UgdGhlIGhlbHBlciBjbGFzcyBmaWxlcworICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOworCisgIC8vIE5vdyBtYWtlIHRoZSBwcm9jZXNzb3Ivc2VydmVyIGZpbGUKKyAgZl9zZXJ2aWNlX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyBnZXRfY2FwX25hbWUoc2VydmljZV9uYW1lXykgKyAiUHJvY2Vzc29yLmh4IjsKKyAgZl9zZXJ2aWNlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOworCisgIGZfc2VydmljZV8gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgaGF4ZV9wYWNrYWdlKCkgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbCA8PCBoYXhlX3R5cGVfaW1wb3J0cygpCisgICAgICAgICAgICAgPDwgaGF4ZV90aHJpZnRfaW1wb3J0cygpIDw8IGhheGVfdGhyaWZ0X2dlbl9pbXBvcnRzKHRzZXJ2aWNlKSA8PCBlbmRsOworCisgIGlmICghcGFja2FnZV9uYW1lXy5lbXB0eSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAiaW1wb3J0ICIgPDwgcGFja2FnZV9uYW1lXyA8PCAiLio7IiA8PCBlbmRsOworICAgIGZfc2VydmljZV8gPDwgImltcG9ydCAiIDw8IHBhY2thZ2VfbmFtZV8gPDwgIi4iIDw8IGdldF9jYXBfbmFtZShzZXJ2aWNlX25hbWVfKS5jX3N0cigpCisgICAgICAgICAgICAgICA8PCAiSW1wbDsiIDw8IGVuZGw7CisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworICB9CisKKyAgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodHNlcnZpY2UpOworCisgIGZfc2VydmljZV8uY2xvc2UoKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgdGhlIGNvZGUgc25pcHBldCBmb3IgdGhlIG9uU3VjY2VzcyBjYWxsYmFja3MKKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBzZXJ2aWNlIGZ1bmN0aW9uIHRvIGdlbmVyYXRlIGNvZGUgZm9yLgorICovCitzdHJpbmcgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9tZXRob2Rfb25zdWNjZXNzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhc190eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG9taXRfbmFtZSkgeworICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIHJldHVybiAiIjsKKyAgfQorCisgIHN0cmluZyBuYW1lID0gIiI7CisgIGlmICghb21pdF9uYW1lKSB7CisgICAgbmFtZSA9ICJvblN1Y2Nlc3MiOworICAgIGlmIChhc190eXBlKSB7CisgICAgICBuYW1lICs9ICIgOiAiOworICAgIH0KKyAgfQorCisgIGlmICh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgIGlmIChhc190eXBlKSB7CisgICAgICByZXR1cm4gbmFtZSArICJWb2lkLT5Wb2lkID0gbnVsbCI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBuYW1lICsgIigpIDogVm9pZCI7CisgICAgfQorICB9CisKKyAgaWYgKGFzX3R5cGUpIHsKKyAgICByZXR1cm4gbmFtZSArIHR5cGVfbmFtZSh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpICsgIi0+Vm9pZCA9IG51bGwiOworICB9IGVsc2UgeworICAgIHJldHVybiBuYW1lICsgIiggcmV0dmFsIDogIiArIHR5cGVfbmFtZSh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpICsgIikiOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBtZXRob2QgaGVhZGVyCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgc2VydmljZSBmdW5jdGlvbiB0byBnZW5lcmF0ZSBjb2RlIGZvci4KKyAqLwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX21ldGhvZF9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBib29sIGlzX2ludGVyZmFjZSkgeworICBpZiAoY2FsbGJhY2tzXykgeworICAgIGdlbmVyYXRlX3NlcnZpY2VfbWV0aG9kX3NpZ25hdHVyZV9jYWxsYmFjayh0ZnVuY3Rpb24sIGlzX2ludGVyZmFjZSk7CisgIH0gZWxzZSB7CisgICAgZ2VuZXJhdGVfc2VydmljZV9tZXRob2Rfc2lnbmF0dXJlX25vcm1hbCh0ZnVuY3Rpb24sIGlzX2ludGVyZmFjZSk7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIG1ldGhvZCBoZWFkZXIgaW4gIm5vcm1hbCIgc3R5bGUKKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBzZXJ2aWNlIGZ1bmN0aW9uIHRvIGdlbmVyYXRlIGNvZGUgZm9yLgorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfbWV0aG9kX3NpZ25hdHVyZV9ub3JtYWwodF9mdW5jdGlvbiogdGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfaW50ZXJmYWNlKSB7CisgIGlmIChpc19pbnRlcmZhY2UpIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgZnVuY3Rpb25fc2lnbmF0dXJlX25vcm1hbCh0ZnVuY3Rpb24pIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmVfbm9ybWFsKHRmdW5jdGlvbikgPDwgIiB7IiA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBtZXRob2QgaGVhZGVyIGluICJjYWxsYmFjayIgc3R5bGUKKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBzZXJ2aWNlIGZ1bmN0aW9uIHRvIGdlbmVyYXRlIGNvZGUgZm9yLgorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfbWV0aG9kX3NpZ25hdHVyZV9jYWxsYmFjayh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2ludGVyZmFjZSkgeworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBzdGQ6OnN0cmluZyBvbl9zdWNjZXNzX2ltcGwgPSBnZW5lcmF0ZV9zZXJ2aWNlX21ldGhvZF9vbnN1Y2Nlc3ModGZ1bmN0aW9uLCBmYWxzZSwgZmFsc2UpOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiLy8gZnVuY3Rpb24gb25FcnJvcihEeW5hbWljKSA6IFZvaWQ7IiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiLy8gZnVuY3Rpb24gIiA8PCBvbl9zdWNjZXNzX2ltcGwuY19zdHIoKSA8PCAiOyIgPDwgZW5kbDsKKyAgfQorCisgIGlmIChpc19pbnRlcmZhY2UpIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgZnVuY3Rpb25fc2lnbmF0dXJlX2NhbGxiYWNrKHRmdW5jdGlvbikgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZV9jYWxsYmFjayh0ZnVuY3Rpb24pIDw8ICIgeyIgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgaW50ZXJmYWNlIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZXh0ZW5kc19pZmFjZSA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHNfaWZhY2UgPSAiIGV4dGVuZHMgIiArIHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpOworICB9CisKKyAgZ2VuZXJhdGVfaGF4ZV9kb2MoZl9zZXJ2aWNlXywgdHNlcnZpY2UpOworICAvLyBnZW5lcmF0ZV9ydHRpX2RlY29yYXRpb24oZl9zZXJ2aWNlXyk7IC0gbm90IHlldCwgYmVjYXVzZSBvZgorICAvLyBodHRwczovL2dpdGh1Yi5jb20vSGF4ZUZvdW5kYXRpb24vaGF4ZS9pc3N1ZXMvMzYyNgorICBnZW5lcmF0ZV9tYWNyb19kZWNvcmF0aW9uKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpbnRlcmZhY2UgIiA8PCBnZXRfY2FwX25hbWUoc2VydmljZV9uYW1lXykgPDwgZXh0ZW5kc19pZmFjZSA8PCAiIHsiCisgICAgICAgICAgICAgPDwgZW5kbCA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZ2VuZXJhdGVfaGF4ZV9kb2MoZl9zZXJ2aWNlXywgKmZfaXRlcik7CisgICAgZ2VuZXJhdGVfc2VydmljZV9tZXRob2Rfc2lnbmF0dXJlKCpmX2l0ZXIsIHRydWUpOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgc3RydWN0cyBmb3IgYWxsIHRoZSBzZXJ2aWNlIGFyZ3MgYW5kIHJldHVybiB0eXBlcworICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZQorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIGZfc2VydmljZV8gPDwgZW5kbCA8PCBlbmRsOworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X3N0cnVjdCogdHMgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgZ2VuZXJhdGVfaGF4ZV9zdHJ1Y3QodHMsIGZhbHNlKTsKKyAgICBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKCpmX2l0ZXIpOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfY2xpZW50ID0gIiI7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kcyA9IGdldF9jYXBfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSk7CisgICAgZXh0ZW5kc19jbGllbnQgPSAiIGV4dGVuZHMgIiArIGV4dGVuZHMgKyAiSW1wbCI7CisgIH0KKworICBnZW5lcmF0ZV9ydHRpX2RlY29yYXRpb24oZl9zZXJ2aWNlXyk7CisgIC8vIGJ1aWxkIG1hY3JvIGlzIGluaGVyaXRlZCBmcm9tIGludGVyZmFjZQorICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImNsYXNzICIgPDwgZ2V0X2NhcF9uYW1lKHNlcnZpY2VfbmFtZV8pIDw8ICJJbXBsIiA8PCBleHRlbmRzX2NsaWVudAorICAgICAgICAgICAgICAgICAgICAgPDwgIiBpbXBsZW1lbnRzICIgPDwgZ2V0X2NhcF9uYW1lKHNlcnZpY2VfbmFtZV8pIDw8ICIgeyIgPDwgZW5kbCA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBmdW5jdGlvbiBuZXcoIGlwcm90IDogVFByb3RvY29sLCBvcHJvdCA6IFRQcm90b2NvbCA9IG51bGwpIiA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlwcm90XyA9IGlwcm90OyIgPDwgZW5kbDsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAob3Byb3QgPT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJvcHJvdF8gPSBpcHJvdDsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJvcHJvdF8gPSBvcHJvdDsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInN1cGVyKGlwcm90LCBvcHJvdCk7IiA8PCBlbmRsOworICB9CisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicHJpdmF0ZSB2YXIgaXByb3RfIDogVFByb3RvY29sOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgInByaXZhdGUgdmFyIG9wcm90XyA6IFRQcm90b2NvbDsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICJwcml2YXRlIHZhciBzZXFpZF8gOiBJbnQ7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBmdW5jdGlvbiBnZXRJbnB1dFByb3RvY29sKCkgOiBUUHJvdG9jb2wiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gdGhpcy5pcHJvdF87IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgZnVuY3Rpb24gZ2V0T3V0cHV0UHJvdG9jb2woKSA6IFRQcm90b2NvbCIgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybiB0aGlzLm9wcm90XzsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisgIH0KKworICAvLyBHZW5lcmF0ZSBjbGllbnQgbWV0aG9kIGltcGxlbWVudGF0aW9ucworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKworICAgIC8vIE9wZW4gZnVuY3Rpb24KKyAgICBnZW5lcmF0ZV9zZXJ2aWNlX21ldGhvZF9zaWduYXR1cmUoKmZfaXRlciwgZmFsc2UpOworCisgICAgaW5kZW50X3VwKCk7CisKKyAgICAvLyBHZXQgdGhlIHN0cnVjdCBvZiBmdW5jdGlvbiBjYWxsIHBhcmFtcworICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworCisgICAgc3RyaW5nIGFyZ3NuYW1lID0gZ2V0X2NhcF9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfYXJncyIpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisKKyAgICAvLyBTZXJpYWxpemUgdGhlIHJlcXVlc3QKKyAgICBzdHJpbmcgY2FsbHR5cGUgPSAoKmZfaXRlciktPmlzX29uZXdheSgpID8gIk9ORVdBWSIgOiAiQ0FMTCI7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAib3Byb3RfLndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShcIiIgPDwgZnVubmFtZQorICAgICAgICAgICAgICAgPDwgIlwiLCBUTWVzc2FnZVR5cGUuIiA8PCBjYWxsdHlwZSA8PCAiLCBzZXFpZF8pKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICJ2YXIgYXJncyA6ICIgPDwgYXJnc25hbWUgPDwgIiA9IG5ldyAiIDw8IGFyZ3NuYW1lIDw8ICIoKTsiIDw8IGVuZGw7CisKKyAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiYXJncy4iIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiCisgICAgICAgICAgICAgICAgIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImFyZ3Mud3JpdGUob3Byb3RfKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICJvcHJvdF8ud3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOworCisgICAgaWYgKCEoKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSB8fCAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInZhciByZXR2YWwgOiAiIDw8IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCkpIDw8ICI7IgorICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIH0KKworICAgIGlmICgoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJvcHJvdF8uZ2V0VHJhbnNwb3J0KCkuZmx1c2goKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAib3Byb3RfLmdldFRyYW5zcG9ydCgpLmZsdXNoKGZ1bmN0aW9uKGVycm9yOkR5bmFtaWMpIDogVm9pZCB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpZiAoY2FsbGJhY2tzXykgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInRyeSB7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIH0KKyAgICAgIHN0cmluZyByZXN1bHRuYW1lID0gZ2V0X2NhcF9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImlmIChlcnJvciAhPSBudWxsKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpZiAoY2FsbGJhY2tzXykgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImlmIChvbkVycm9yICE9IG51bGwpIG9uRXJyb3IoZXJyb3IpOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ0aHJvdyBlcnJvcjsiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ2YXIgbXNnIDogVE1lc3NhZ2UgPSBpcHJvdF8ucmVhZE1lc3NhZ2VCZWdpbigpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaWYgKG1zZy50eXBlID09IFRNZXNzYWdlVHlwZS5FWENFUFRJT04pIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidmFyIHggPSBUQXBwbGljYXRpb25FeGNlcHRpb24ucmVhZChpcHJvdF8pOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaXByb3RfLnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOworICAgICAgaWYgKGNhbGxiYWNrc18pIHsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpZiAob25FcnJvciAhPSBudWxsKSBvbkVycm9yKHgpOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ0aHJvdyB4OyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInZhciByZXN1bHQgOiAiIDw8IHJlc3VsdG5hbWUgPDwgIiA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIigpOyIKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXN1bHQucmVhZChpcHJvdF8pOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaXByb3RfLnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOworCisgICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KKyAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpZiAocmVzdWx0LiIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soInN1Y2Nlc3MiKSA8PCAiKSB7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgaWYgKGNhbGxiYWNrc18pIHsKKyAgICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImlmIChvblN1Y2Nlc3MgIT0gbnVsbCkgb25TdWNjZXNzKHJlc3VsdC5zdWNjZXNzKTsiIDw8IGVuZGw7CisgICAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dmFsID0gcmVzdWx0LnN1Y2Nlc3M7IiA8PCBlbmRsOworICAgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOworICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKyAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaWYgKHJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9IG51bGwpIHsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBpZiAoY2FsbGJhY2tzXykgeworICAgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaWYgKG9uRXJyb3IgIT0gbnVsbCkgb25FcnJvcihyZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIik7IiA8PCBlbmRsOworICAgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInRocm93IHJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIC8vIElmIHlvdSBnZXQgaGVyZSBpdCdzIGFuIGV4Y2VwdGlvbiwgdW5sZXNzIGEgdm9pZCBmdW5jdGlvbgorICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGlmIChjYWxsYmFja3NfKSB7CisgICAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpZiAob25TdWNjZXNzICE9IG51bGwpIG9uU3VjY2VzcygpOyIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybjsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoY2FsbGJhY2tzXykgeworICAgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaWYgKG9uRXJyb3IgIT0gbnVsbCkiIDw8IGVuZGw7CisgICAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgICAgaW5kZW50KGZfc2VydmljZV8pCisgICAgICAgICAgICAgIDw8ICJvbkVycm9yKCBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5NSVNTSU5HX1JFU1VMVCwiIDw8IGVuZGw7CisgICAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIGZhaWxlZDogdW5rbm93biByZXN1bHRcIikpOyIgPDwgZW5kbDsKKyAgICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGluZGVudChmX3NlcnZpY2VfKQorICAgICAgICAgICAgICA8PCAidGhyb3cgbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uTUlTU0lOR19SRVNVTFQsIiA8PCBlbmRsOworICAgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBmYWlsZWQ6IHVua25vd24gcmVzdWx0XCIpOyIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoY2FsbGJhY2tzXykgeworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0gY2F0Y2goIGUgOiBURXhjZXB0aW9uKSB7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpZiAob25FcnJvciAhPSBudWxsKSBvbkVycm9yKGUpOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOworICAgICAgfQorCisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9KTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgaWYgKCEoKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSB8fCAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybiByZXR2YWw7IiA8PCBlbmRsOworICAgIH0KKworICAgIC8vIENsb3NlIGZ1bmN0aW9uCisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgLy8gR2VuZXJhdGUgdGhlIGRpc3BhdGNoIG1ldGhvZHMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgLy8gRXh0ZW5kcyBzdHVmZgorICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19wcm9jZXNzb3IgPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gZ2V0X2NhcF9uYW1lKHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSkpOworICAgIGV4dGVuZHNfcHJvY2Vzc29yID0gIiBleHRlbmRzICIgKyBleHRlbmRzICsgIlByb2Nlc3NvciI7CisgIH0KKworICAvLyBHZW5lcmF0ZSB0aGUgaGVhZGVyIHBvcnRpb24KKyAgZ2VuZXJhdGVfcnR0aV9kZWNvcmF0aW9uKGZfc2VydmljZV8pOworICBnZW5lcmF0ZV9tYWNyb19kZWNvcmF0aW9uKGZfc2VydmljZV8pOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImNsYXNzICIgPDwgZ2V0X2NhcF9uYW1lKHNlcnZpY2VfbmFtZV8pIDw8ICJQcm9jZXNzb3IiIDw8IGV4dGVuZHNfcHJvY2Vzc29yCisgICAgICAgICAgICAgICAgICAgICA8PCAiIGltcGxlbWVudHMgVFByb2Nlc3NvciB7IiA8PCBlbmRsIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInByaXZhdGUgdmFyICIgPDwgZ2V0X2NhcF9uYW1lKHNlcnZpY2VfbmFtZV8pCisgICAgICAgICAgICAgPDwgIl9pZmFjZV8gOiAiIDw8IGdldF9jYXBfbmFtZShzZXJ2aWNlX25hbWVfKSA8PCAiOyIgPDwgZW5kbDsKKworICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgInByaXZhdGUgdmFyIFBST0NFU1NfTUFQID0gbmV3IFN0cmluZ01hcDwgSW50LT5UUHJvdG9jb2wtPlRQcm90b2NvbC0+Vm9pZCA+KCk7IgorICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgfQorCisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBmdW5jdGlvbiBuZXcoIGlmYWNlIDogIiA8PCBnZXRfY2FwX25hbWUoc2VydmljZV9uYW1lXykgPDwgIikiCisgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgaWYgKCFleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJzdXBlcihpZmFjZSk7IiA8PCBlbmRsOworICB9CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgZ2V0X2NhcF9uYW1lKHNlcnZpY2VfbmFtZV8pIDw8ICJfaWZhY2VfID0gaWZhY2U7IiA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiUFJPQ0VTU19NQVAuc2V0KFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiLCAiCisgICAgICAgICAgICAgICA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIigpKTsiIDw8IGVuZGw7CisgIH0KKworICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHNlcnZlciBpbXBsZW1lbnRhdGlvbgorICBzdHJpbmcgb3ZlcnJpZGUgPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBvdmVycmlkZSA9ICJvdmVycmlkZSAiOworICB9CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCBvdmVycmlkZQorICAgICAgICAgICAgICAgICAgICAgPDwgInB1YmxpYyBmdW5jdGlvbiBwcm9jZXNzKCBpcHJvdCA6IFRQcm90b2NvbCwgb3Byb3QgOiBUUHJvdG9jb2wpIDogQm9vbCIKKyAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInZhciBtc2cgOiBUTWVzc2FnZSA9IGlwcm90LnJlYWRNZXNzYWdlQmVnaW4oKTsiIDw8IGVuZGw7CisKKyAgLy8gVE9ETyhtY3NsZWUpOiB2YWxpZGF0ZSBtZXNzYWdlLCB3YXMgdGhlIHNlcWlkIGV0Yy4gbGVnaXQ/CisgIC8vIEFTLSBJZiBhbGwgbWV0aG9kIGlzIG9uZXdheToKKyAgLy8gZG8geW91IGhhdmUgYW4gb3Byb3Q/CisgIC8vIGRvIHlvdSB5b3UgbmVlZCBudWxsY2hlY2s/CisgIGZfc2VydmljZV8KKyAgICAgIDw8IGluZGVudCgpIDw8ICJ2YXIgZm4gID0gUFJPQ0VTU19NQVAuZ2V0KG1zZy5uYW1lKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJpZiAoZm4gPT0gbnVsbCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIFRUeXBlLlNUUlVDVCk7IgorICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBpcHJvdC5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIiAgdmFyIHggPSBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5VTktOT1dOX01FVEhPRCwgXCJJbnZhbGlkICIKKyAgICAgICAgICJtZXRob2QgbmFtZTogJ1wiK21zZy5uYW1lK1wiJ1wiKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICIgIG9wcm90LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShtc2cubmFtZSwgVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiwgbXNnLnNlcWlkKSk7IgorICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICB4LndyaXRlKG9wcm90KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgb3Byb3Qud3JpdGVNZXNzYWdlRW5kKCk7IgorICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBvcHJvdC5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIiAgcmV0dXJuIHRydWU7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiZm4oIG1zZy5zZXFpZCwgaXByb3QsIG9wcm90KTsiIDw8IGVuZGw7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHRydWU7IiA8PCBlbmRsOworCisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2VzcyBzdWJmdW5jdGlvbnMKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRzZXJ2aWNlLCAqZl9pdGVyKTsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBhbmQgaGVscGVycyBmb3IgYSBmdW5jdGlvbi4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbgorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgc3RyaW5nIHJlc3VsdG5hbWUgPSBnZXRfY2FwX25hbWUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKKyAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCByZXN1bHRuYW1lKTsKKyAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKKyAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOworICB9CisKKyAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgcmVzdWx0LmFwcGVuZCgqZl9pdGVyKTsKKyAgfQorCisgIGdlbmVyYXRlX2hheGVfc3RydWN0KCZyZXN1bHQsIGZhbHNlLCB0cnVlKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBwcm9jZXNzIGZ1bmN0aW9uIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24gdG8gd3JpdGUgYSBkaXNwYXRjaGVyIGZvcgorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgICh2b2lkKXRzZXJ2aWNlOworICAvLyBPcGVuIGNsYXNzCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJpdmF0ZSBmdW5jdGlvbiAiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgPDwgIigpIDogSW50LT5UUHJvdG9jb2wtPlRQcm90b2NvbC0+Vm9pZCB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICAvLyBPcGVuIGZ1bmN0aW9uCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIGZ1bmN0aW9uKCBzZXFpZCA6IEludCwgaXByb3QgOiBUUHJvdG9jb2wsIG9wcm90IDogVFByb3RvY29sKSA6IFZvaWQiCisgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICBzdHJpbmcgYXJnc25hbWUgPSBnZXRfY2FwX25hbWUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9hcmdzIik7CisgIHN0cmluZyByZXN1bHRuYW1lID0gZ2V0X2NhcF9uYW1lKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidmFyIGFyZ3MgOiAiIDw8IGFyZ3NuYW1lIDw8ICIgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiKCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImFyZ3MucmVhZChpcHJvdCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpcHJvdC5yZWFkTWVzc2FnZUVuZCgpOyIKKyAgICAgICAgICAgICA8PCBlbmRsOworCisgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisKKyAgLy8gRGVjbGFyZSByZXN1bHQgZm9yIG5vbiBvbmV3YXkgZnVuY3Rpb24KKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidmFyIHJlc3VsdCA6ICIgPDwgcmVzdWx0bmFtZSA8PCAiID0gbmV3ICIgPDwgcmVzdWx0bmFtZSA8PCAiKCk7IgorICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgfQorCisgIC8vIFRyeSBibG9jayBmb3IgYW55ICBmdW5jdGlvbiB0byBjYXRjaCAoZGVmaW5lZCBvciB1bmRlZmluZWQpIGV4Y2VwdGlvbnMKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidHJ5IHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGlmIChjYWxsYmFja3NfKSB7CisgICAgLy8gY2FsbGJhY2sgZnVuY3Rpb24gc3R5bGUgb25FcnJvci9vblN1Y2Nlc3MKKworICAgIC8vIEdlbmVyYXRlIHRoZSBmdW5jdGlvbiBjYWxsCisgICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7CisgICAgZl9zZXJ2aWNlXyA8PCBnZXRfY2FwX25hbWUoc2VydmljZV9uYW1lXykgPDwgIl9pZmFjZV8uIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiOworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKKyAgICAgIH0KKyAgICAgIGZfc2VydmljZV8gPDwgImFyZ3MuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgICAgfQorCisgICAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKKyAgICAgIH0KKyAgICAgIHN0cmluZyBvbl9zdWNjZXNzID0gZ2VuZXJhdGVfc2VydmljZV9tZXRob2Rfb25zdWNjZXNzKHRmdW5jdGlvbiwgZmFsc2UsIHRydWUpOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIm51bGwsICAvLyBlcnJvcnMgYXJlIHRocm93biBieSB0aGUgaGFuZGxlciIgPDwgZW5kbDsKKyAgICAgIGlmICh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIm51bGwpOyAvLyBubyByZXR2YWwiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImZ1bmN0aW9uIiA8PCBvbl9zdWNjZXNzLmNfc3RyKCkgPDwgIiB7IiA8PCBlbmRsOworICAgICAgICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXN1bHQuc3VjY2VzcyA9IHJldHZhbDsiIDw8IGVuZGw7CisgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgfQorICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0pOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgfQorCisgIH0gZWxzZSB7CisgICAgLy8gbm9ybWFsIGZ1bmN0aW9uKCk6cmVzdWx0IHN0eWxlCisKKyAgICAvLyBHZW5lcmF0ZSB0aGUgZnVuY3Rpb24gY2FsbAorICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOworICAgIGlmICghKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkgfHwgdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpKSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICJyZXN1bHQuc3VjY2VzcyA9ICI7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgZ2V0X2NhcF9uYW1lKHNlcnZpY2VfbmFtZV8pIDw8ICJfaWZhY2VfLiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIjsKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfIDw8ICJhcmdzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIH0KKyAgICBmX3NlcnZpY2VfIDw8ICIpOyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iOworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICAvLyBjYXRjaCBleGNlcHRpb25zIGRlZmluZWQgaW4gdGhlIElETAorICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICIgY2F0Y2ggKCIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI6IgorICAgICAgICAgICAgICAgICA8PCBnZXRfY2FwX25hbWUodHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlKSkgPDwgIikgeyIgPDwgZW5kbDsKKyAgICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiCisgICAgICAgICAgICAgICAgICAgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgIn0iOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIGFsd2F5cyBjYXRjaCBhbGwgZXhjZXB0aW9ucyB0byBwcmV2ZW50IGZyb20gc2VydmljZSBkZW5pYWwKKyAgZl9zZXJ2aWNlXyA8PCAiIGNhdGNoICh0aCA6IER5bmFtaWMpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInRyYWNlKFwiSW50ZXJuYWwgZXJyb3IgcHJvY2Vzc2luZyAiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCIsIHRoKTsiCisgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInZhciB4ID0gbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uSU5URVJOQUxfRVJST1IsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiSW50ZXJuYWwgZXJyb3IgcHJvY2Vzc2luZyAiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCIpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIm9wcm90LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcIiwgVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiwgc2VxaWQpKTsiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ4LndyaXRlKG9wcm90KTsiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJvcHJvdC5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOyIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybjsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgLy8gU2hvcnRjdXQgb3V0IGhlcmUgZm9yIG9uZXdheSBmdW5jdGlvbnMKKyAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisKKyAgICAvLyBDbG9zZSBjbGFzcworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgIHJldHVybjsKKyAgfQorCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgPDwgIlwiLCBUTWVzc2FnZVR5cGUuUkVQTFksIHNlcWlkKSk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXN1bHQud3JpdGUob3Byb3QpOyIKKyAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAib3Byb3QuZ2V0VHJhbnNwb3J0KCkuZmx1c2goKTsiIDw8IGVuZGw7CisKKyAgLy8gQ2xvc2UgZnVuY3Rpb24KKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIC8vIENsb3NlIGNsYXNzCisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBEZXNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KKyAqCisgKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZAorICogQHBhcmFtIHByZWZpeCBUaGUgdmFyaWFibGUgbmFtZSBvciBjb250YWluZXIgZm9yIHRoaXMgZmllbGQKKyAqLwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RyaW5nIHByZWZpeCkgeworICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisKKyAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgREVTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICB9CisKKyAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIG5hbWUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7CisKKyAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIgPSBpcHJvdC4iOworCisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgICAgb3V0IDw8ICJyZWFkQmluYXJ5KCk7IjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgPDwgInJlYWRTdHJpbmcoKTsiOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICBvdXQgPDwgInJlYWRCb29sKCk7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICBvdXQgPDwgInJlYWRCeXRlKCk7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgb3V0IDw8ICJyZWFkSTE2KCk7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgb3V0IDw8ICJyZWFkSTMyKCk7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgb3V0IDw8ICJyZWFkSTY0KCk7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgb3V0IDw8ICJyZWFkRG91YmxlKCk7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEhheGUgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICBvdXQgPDwgInJlYWRJMzIoKTsiOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBERVNFUklBTElaRSBGSUVMRCAnJXMnIFRZUEUgJyVzJ1xuIiwKKyAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgIHR5cGVfbmFtZSh0eXBlKS5jX3N0cigpKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhbiB1bnNlcmlhbGl6ZXIgZm9yIGEgc3RydWN0LCBpbnZva2VzIHJlYWQoKQorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gbmV3ICIgPDwgZ2V0X2NhcF9uYW1lKHR5cGVfbmFtZSh0c3RydWN0KSkgPDwgIigpOyIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIucmVhZChpcHJvdCk7IiA8PCBlbmRsOworfQorCisvKioKKyAqIERlc2VyaWFsaXplcyBhIGNvbnRhaW5lciBieSByZWFkaW5nIGl0cyBzaXplIGFuZCB0aGVuIGl0ZXJhdGluZworICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgpIHsKKyAgc2NvcGVfdXAob3V0KTsKKworICBzdHJpbmcgb2JqOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBvYmogPSB0bXAoIl9tYXAiKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBvYmogPSB0bXAoIl9zZXQiKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgb2JqID0gdG1wKCJfbGlzdCIpOworICB9CisKKyAgLy8gRGVjbGFyZSB2YXJpYWJsZXMsIHJlYWQgaGVhZGVyCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAidmFyICIgPDwgb2JqIDw8ICIgPSBpcHJvdC5yZWFkTWFwQmVnaW4oKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgInZhciAiIDw8IG9iaiA8PCAiID0gaXByb3QucmVhZFNldEJlZ2luKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAidmFyICIgPDwgb2JqIDw8ICIgPSBpcHJvdC5yZWFkTGlzdEJlZ2luKCk7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlKQorICAgICAgICAgICAgICAvLyBzaXplIHRoZSBjb2xsZWN0aW9uIGNvcnJlY3RseQorICAgICAgICAgICAgICA8PCAiKCIKKyAgICAgICAgICAgICAgPDwgIik7IiA8PCBlbmRsOworCisgIC8vIEZvciBsb29wIGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMKKyAgc3RyaW5nIGkgPSB0bXAoIl9pIik7CisgIGluZGVudChvdXQpIDw8ICJmb3IoICIgPDwgaSA8PCAiIGluIDAgLi4uICIgPDwgb2JqIDw8ICIuc2l6ZSkiIDw8IGVuZGw7CisKKyAgc2NvcGVfdXAob3V0KTsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBwcmVmaXgpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgcHJlZml4KTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIHByZWZpeCk7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7CisKKyAgLy8gUmVhZCBjb250YWluZXIgZW5kCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZE1hcEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZFNldEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRMaXN0RW5kKCk7IiA8PCBlbmRsOworICB9CisKKyAgc2NvcGVfZG93bihvdXQpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBjb2RlIHRvIGRlc2VyaWFsaXplIGEgbWFwCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RyaW5nIHByZWZpeCkgeworICBzdHJpbmcga2V5ID0gdG1wKCJfa2V5Iik7CisgIHN0cmluZyB2YWwgPSB0bXAoIl92YWwiKTsKKyAgdF9maWVsZCBma2V5KHRtYXAtPmdldF9rZXlfdHlwZSgpLCBrZXkpOworICB0X2ZpZWxkIGZ2YWwodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZhbCk7CisKKyAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZmtleSkgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZnZhbCkgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZma2V5KTsKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnZhbCk7CisKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIuc2V0KCAiIDw8IGtleSA8PCAiLCAiIDw8IHZhbCA8PCAiKTsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogRGVzZXJpYWxpemVzIGEgc2V0IGVsZW1lbnQKKyAqLwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgcHJlZml4KSB7CisgIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOworICB0X2ZpZWxkIGZlbGVtKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZmVsZW0pIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOworCisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLmFkZCgiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOworfQorCisvKioKKyAqIERlc2VyaWFsaXplcyBhIGxpc3QgZWxlbWVudAorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgeworICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKKyAgdF9maWVsZCBmZWxlbSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKKworICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZmZWxlbSkgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIuYWRkKCIgPDwgZWxlbSA8PCAiKTsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgorICoKKyAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkIHRvIHNlcmlhbGl6ZQorICogQHBhcmFtIHByZWZpeCBOYW1lIHRvIHByZXBlbmQgdG8gZmllbGQgbmFtZQorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RyaW5nIHByZWZpeCkgeworICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisKKyAgLy8gRG8gbm90aGluZyBmb3Igdm9pZCB0eXBlcworICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICB9CisKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7CisKKyAgICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3QuIjsKKworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICAgIG91dCA8PCAid3JpdGVCaW5hcnkoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgb3V0IDw8ICJ3cml0ZVN0cmluZygiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUJvb2woIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUJ5dGUoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgIG91dCA8PCAid3JpdGVJMTYoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgIG91dCA8PCAid3JpdGVJMzIoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIG91dCA8PCAid3JpdGVJNjQoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIG91dCA8PCAid3JpdGVEb3VibGUoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBIYXhlIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgb3V0IDw8ICJ3cml0ZUkzMigiIDw8IG5hbWUgPDwgIik7IjsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gU0VSSUFMSVpFIEZJRUxEICclcyVzJyBUWVBFICclcydcbiIsCisgICAgICAgICAgIHByZWZpeC5jX3N0cigpLAorICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgdHlwZV9uYW1lKHR5cGUpLmNfc3RyKCkpOworICB9Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhbGwgdGhlIG1lbWJlcnMgb2YgYSBzdHJ1Y3QuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCB0byBzZXJpYWxpemUKKyAqIEBwYXJhbSBwcmVmaXggIFN0cmluZyBwcmVmaXggdG8gYXR0YWNoIHRvIGFsbCBmaWVsZHMKKyAqLwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcmVmaXgpIHsKKyAgKHZvaWQpdHN0cnVjdDsKKyAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiLndyaXRlKG9wcm90KTsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhIGNvbnRhaW5lciBieSB3cml0aW5nIGl0cyBzaXplIHRoZW4gdGhlIGVsZW1lbnRzLgorICoKKyAqIEBwYXJhbSB0dHlwZSAgVGhlIHR5cGUgb2YgY29udGFpbmVyCisgKiBAcGFyYW0gcHJlZml4IFN0cmluZyBwcmVmaXggZm9yIGZpZWxkcworICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4KSB7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHN0cmluZyBpdGVyID0gdG1wKCJfa2V5Iik7CisgICAgc3RyaW5nIGNvdW50ZXIgPSB0bXAoIl9zaXplQ291bnRlciIpOworICAgIGluZGVudChvdXQpIDw8ICJ2YXIgIiA8PCBjb3VudGVyIDw8ICIgOiBJbnQgPSAwOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yKCAiIDw8IGl0ZXIgPDwgIiBpbiAiIDw8IHByZWZpeCA8PCAiKSB7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgICIgPDwgY291bnRlciA8PCArIisrOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZU1hcEJlZ2luKG5ldyBUTWFwKCIgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpCisgICAgICAgICAgICAgICAgPDwgIiwgIiA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwgIiA8PCBjb3VudGVyIDw8ICIpKTsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTZXRCZWdpbihuZXcgVFNldCgiIDw8IHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkKKyAgICAgICAgICAgICAgICA8PCAiLCAiIDw8IHByZWZpeCA8PCAiLnNpemUpKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUxpc3RCZWdpbihuZXcgVExpc3QoIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIgPDwgcHJlZml4IDw8ICIubGVuZ3RoKSk7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIH0KKworICBzdHJpbmcgaXRlciA9IHRtcCgiZWxlbSIpOworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImZvciggIiA8PCBpdGVyIDw8ICIgaW4gIiA8PCBwcmVmaXggPDwgIi5rZXlzKCkpIiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJmb3IoICIgPDwgaXRlciA8PCAiIGluICIgPDwgcHJlZml4IDw8ICIudG9BcnJheSgpKSIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImZvciggIiA8PCBpdGVyIDw8ICIgaW4gIiA8PCBwcmVmaXggPDwgIikiIDw8IGVuZGw7CisgIH0KKworICBzY29wZV91cChvdXQpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBpdGVyLCBwcmVmaXgpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIGl0ZXIpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIGl0ZXIpOworICB9CisKKyAgc2NvcGVfZG93bihvdXQpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVNYXBFbmQoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlU2V0RW5kKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVMaXN0RW5kKCk7IiA8PCBlbmRsOworICB9CisKKyAgc2NvcGVfZG93bihvdXQpOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBtYXAuCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbWFwKSB7CisgIHRfZmllbGQga2ZpZWxkKHRtYXAtPmdldF9rZXlfdHlwZSgpLCBpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmtmaWVsZCwgIiIpOworICB0X2ZpZWxkIHZmaWVsZCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgbWFwICsgIi5nZXQoIiArIGl0ZXIgKyAiKSIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmdmZpZWxkLCAiIik7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIHNldC4KKyAqLwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIGl0ZXIpIHsKKyAgdF9maWVsZCBlZmllbGQodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIpOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBsaXN0LgorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdHJpbmcgaXRlcikgeworICB0X2ZpZWxkIGVmaWVsZCh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIpOworfQorCisvKioKKyAqIFJldHVybnMgYSBoYXhlIHR5cGUgbmFtZQorICoKKyAqIEBwYXJhbSB0dHlwZSBUaGUgdHlwZQorICogQHBhcmFtIGNvbnRhaW5lciBJcyB0aGUgdHlwZSBnb2luZyBpbnNpZGUgYSBjb250YWluZXI/CisgKiBAcmV0dXJuIGhheGUgdHlwZSBuYW1lLCBpLmUuIEhhc2hNYXA8S2V5LFZhbHVlPgorICovCitzdHJpbmcgdF9oYXhlX2dlbmVyYXRvcjo6dHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsIGJvb2wgaW5fY29udGFpbmVyLCBib29sIGluX2luaXQpIHsKKyAgKHZvaWQpaW5faW5pdDsKKworICAvLyB0eXBlZGVmcyBhcmUganVzdCByZXNvbHZlZCB0byB0aGVpciByZWFsIHR5cGUKKyAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKKyAgc3RyaW5nIHByZWZpeDsKKworICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgcmV0dXJuIGJhc2VfdHlwZV9uYW1lKCh0X2Jhc2VfdHlwZSopdHR5cGUsIGluX2NvbnRhaW5lcik7CisgIH0KKworICBpZiAodHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiSW50IjsKKyAgfQorCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICB0X3R5cGUqIHRrZXkgPSBnZXRfdHJ1ZV90eXBlKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpOworICAgIHRfdHlwZSogdHZhbCA9IGdldF90cnVlX3R5cGUoKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSk7CisgICAgaWYgKHRrZXktPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdGtleSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgaWYgKCEodGtleS0+aXNfYmluYXJ5KCkpKSB7CisgICAgICAgICAgcmV0dXJuICJTdHJpbmdNYXA8ICIgKyB0eXBlX25hbWUodHZhbCkgKyAiPiI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7IC8vIGRlZmF1bHQgdG8gT2JqZWN0TWFwPD4KKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICByZXR1cm4gIkludE1hcDwgIiArIHR5cGVfbmFtZSh0dmFsKSArICI+IjsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICByZXR1cm4gIkludDY0TWFwPCAiICsgdHlwZV9uYW1lKHR2YWwpICsgIj4iOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7IC8vIGRlZmF1bHQgdG8gT2JqZWN0TWFwPD4KKyAgICAgIH0KKyAgICB9CisgICAgaWYgKHRrZXktPmlzX2VudW0oKSkgeworICAgICAgcmV0dXJuICJJbnRNYXA8ICIgKyB0eXBlX25hbWUodHZhbCkgKyAiPiI7CisgICAgfQorICAgIHJldHVybiAiT2JqZWN0TWFwPCAiICsgdHlwZV9uYW1lKHRrZXkpICsgIiwgIiArIHR5cGVfbmFtZSh0dmFsKSArICI+IjsKKyAgfQorCisgIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3R5cGUqIHRrZXkgPSBnZXRfdHJ1ZV90eXBlKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKTsKKyAgICBpZiAodGtleS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0a2V5KS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICBpZiAoISh0a2V5LT5pc19iaW5hcnkoKSkpIHsKKyAgICAgICAgICByZXR1cm4gIlN0cmluZ1NldCI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7IC8vIGRlZmF1bHQgdG8gT2JqZWN0U2V0CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgcmV0dXJuICJJbnRTZXQiOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIHJldHVybiAiSW50NjRTZXQiOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7IC8vIGRlZmF1bHQgdG8gT2JqZWN0U2V0CisgICAgICB9CisgICAgfQorICAgIGlmICh0a2V5LT5pc19lbnVtKCkpIHsKKyAgICAgIHJldHVybiAiSW50U2V0IjsKKyAgICB9CisgICAgcmV0dXJuICJPYmplY3RTZXQ8ICIgKyB0eXBlX25hbWUodGtleSkgKyAiPiI7CisgIH0KKworICBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHRfdHlwZSogdGVsbSA9ICgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICByZXR1cm4gIkxpc3Q8ICIgKyB0eXBlX25hbWUodGVsbSkgKyAiPiI7CisgIH0KKworICAvLyBDaGVjayBmb3IgbmFtZXNwYWNpbmcKKyAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHR5cGUtPmdldF9wcm9ncmFtKCk7CisgIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgeworICAgIHN0cmluZyBwYWNrYWdlID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiaGF4ZSIpOworICAgIGlmICghcGFja2FnZS5lbXB0eSgpKSB7CisgICAgICByZXR1cm4gcGFja2FnZSArICIuIiArIHR0eXBlLT5nZXRfbmFtZSgpOworICAgIH0KKyAgfQorCisgIHJldHVybiB0dHlwZS0+Z2V0X25hbWUoKTsKK30KKworLyoqCisgKiBSZXR1cm5zIHRoZSBoYXhlIHR5cGUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgdGhyaWZ0IHR5cGUuCisgKgorICogQHBhcmFtIHRiYXNlIFRoZSBiYXNlIHR5cGUKKyAqIEBwYXJhbSBjb250YWluZXIgSXMgaXQgZ29pbmcgaW4gYSBoYXhlIGNvbnRhaW5lcj8KKyAqLworc3RyaW5nIHRfaGF4ZV9nZW5lcmF0b3I6OmJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlKiB0eXBlLCBib29sIGluX2NvbnRhaW5lcikgeworICAodm9pZClpbl9jb250YWluZXI7CisgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSB0eXBlLT5nZXRfYmFzZSgpOworCisgIHN3aXRjaCAodGJhc2UpIHsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgIHJldHVybiAiVm9pZCI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgcmV0dXJuICJoYXhlLmlvLkJ5dGVzIjsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuICJTdHJpbmciOworICAgIH0KKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgIHJldHVybiAiQm9vbCI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICByZXR1cm4gImhheGUuSW50MzIiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICByZXR1cm4gImhheGUuSW50NjQiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICByZXR1cm4gIkZsb2F0IjsKKyAgZGVmYXVsdDoKKyAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEhheGUgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICB9Cit9CisKKy8qKgorICogRGVjbGFyZXMgYSBmaWVsZCwgd2hpY2ggbWF5IGluY2x1ZGUgaW5pdGlhbGl6YXRpb24gYXMgbmVjZXNzYXJ5LgorICoKKyAqIEBwYXJhbSB0dHlwZSBUaGUgdHlwZQorICovCitzdHJpbmcgdF9oYXhlX2dlbmVyYXRvcjo6ZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdCkgeworICAvLyBUT0RPKG1jc2xlZSk6IGRvIHdlIGV2ZXIgbmVlZCB0byBpbml0aWFsaXplIHRoZSBmaWVsZD8KKyAgc3RyaW5nIHJlc3VsdCA9ICJ2YXIgIiArIHRmaWVsZC0+Z2V0X25hbWUoKSArICIgOiAiICsgdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisgIGlmIChpbml0KSB7CisgICAgdF90eXBlKiB0dHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmIHRmaWVsZC0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgeworICAgICAgc3RkOjpvZnN0cmVhbSBkdW1teTsKKyAgICAgIHJlc3VsdCArPSAiID0gIiArIHJlbmRlcl9jb25zdF92YWx1ZShkdW1teSwgdGZpZWxkLT5nZXRfbmFtZSgpLCB0dHlwZSwgdGZpZWxkLT5nZXRfdmFsdWUoKSk7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICByZXN1bHQgKz0gIiA9IG51bGwiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgcmVzdWx0ICs9ICIgPSBmYWxzZSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgcmVzdWx0ICs9ICIgPSAwIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgcmVzdWx0ICs9ICIgPSAoZG91YmxlKTAiOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgcmVzdWx0ICs9ICIgPSAwIjsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgICAgcmVzdWx0ICs9ICIgPSBuZXcgIiArIHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpICsgIigpIjsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ICs9ICIgPSBuZXcgIiArIHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpICsgIigpIjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlc3VsdCArICI7IjsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd0eXBlIG5hbWUoYXJncyknCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCisgKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCisgKi8KK3N0cmluZyB0X2hheGVfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmVfY2FsbGJhY2sodF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIHN0ZDo6c3RyaW5nIG9uX2Vycm9yX3N1Y2Nlc3MgPSAib25FcnJvciA6IER5bmFtaWMtPlZvaWQgPSBudWxsLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGdlbmVyYXRlX3NlcnZpY2VfbWV0aG9kX29uc3VjY2Vzcyh0ZnVuY3Rpb24sIHRydWUsIGZhbHNlKTsKKworICBzdGQ6OnN0cmluZyBhcmd1bWVudHMgPSBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSk7CisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGlmIChhcmd1bWVudHMgIT0gIiIpIHsKKyAgICAgIGFyZ3VtZW50cyArPSAiLCAiOworICAgIH0KKyAgICBhcmd1bWVudHMgKz0gb25fZXJyb3Jfc3VjY2VzczsgLy8ib25FcnJvciA6IEZ1bmN0aW9uLCBvblN1Y2Nlc3MgOiBGdW5jdGlvbiI7CisgIH0KKworICBzdGQ6OnN0cmluZyByZXN1bHQgPSAiZnVuY3Rpb24gIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICIoIiArIGFyZ3VtZW50cyArICIpIDogVm9pZCI7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAndHlwZSBuYW1lKGFyZ3MpJworICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgorICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgorICovCitzdHJpbmcgdF9oYXhlX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlX25vcm1hbCh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgc3RkOjpzdHJpbmcgYXJndW1lbnRzID0gYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpOworCisgIHN0ZDo6c3RyaW5nIHJlc3VsdHR5cGU7CisgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpIHx8IHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgcmVzdWx0dHlwZSA9ICJWb2lkIjsKKyAgfSBlbHNlIHsKKyAgICByZXN1bHR0eXBlID0gdHlwZV9uYW1lKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSk7CisgIH0KKworICBzdGQ6OnN0cmluZyByZXN1bHQgPSAiZnVuY3Rpb24gIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICIoIiArIGFyZ3VtZW50cyArICIpIDogIiArIHJlc3VsdHR5cGU7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGNvbW1hIHNlcGFyYXRlZCBmaWVsZCBsaXN0LCB3aXRoIHR5cGUgbmFtZXMKKyAqLworc3RyaW5nIHRfaGF4ZV9nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgKz0gIiwgIjsKKyAgICB9CisgICAgcmVzdWx0ICs9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICIgOiAiICsgdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhIEMrKyBlbnVtIHN0cmluZyBmb3IgdGhlIGdpdmVuIHR5cGUuCisgKi8KK3N0cmluZyB0X2hheGVfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICJUVHlwZS5TVFJJTkciOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiVFR5cGUuQk9PTCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiVFR5cGUuQllURSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gIlRUeXBlLkkxNiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gIlRUeXBlLkkzMiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIlRUeXBlLkk2NCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIlRUeXBlLkRPVUJMRSI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiVFR5cGUuSTMyIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICJUVHlwZS5TVFJVQ1QiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5NQVAiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5TRVQiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAiVFR5cGUuTElTVCI7CisgIH0KKworICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Cit9CisKKy8qKgorICogSGF4ZSBjbGFzcyBuYW1lcyBtdXN0IHN0YXJ0IHdpdGggdXBwZXJjYXNlIGxldHRlciwgYnV0IEhheGUgbmFtZXNwYWNlcyBtdXN0IG5vdC4KKyAqLworc3RkOjpzdHJpbmcgdF9oYXhlX2dlbmVyYXRvcjo6Z2V0X2NhcF9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpIHsKKyAgaWYgKG5hbWUubGVuZ3RoKCkgPT0gMCkgeworICAgIHJldHVybiBuYW1lOworICB9CisKKyAgLy8gdGVzdC5mb3IuR2VuZXJpYzwgZGF0YS5UeXBlLCBvci50aGUuTGlrZT4gYW5kIGhhbmRsZSBpdCByZWN1cnNpdmVseQorICBzaXplX3QgZ2VuZXJpY19maXJzdCA9IG5hbWUuZmluZCgnPCcpOworICBzaXplX3QgZ2VuZXJpY19sYXN0ID0gbmFtZS5yZmluZCgnPicpOworICBpZiAoKGdlbmVyaWNfZmlyc3QgIT0gc3RkOjpzdHJpbmc6Om5wb3MpICYmIChnZW5lcmljX2xhc3QgIT0gc3RkOjpzdHJpbmc6Om5wb3MpKSB7CisgICAgc3RyaW5nIG91dGVyX3R5cGUgPSBuYW1lLnN1YnN0cigwLCBnZW5lcmljX2ZpcnN0KTsKKyAgICBzdHJpbmcgaW5uZXJfdHlwZXMgPSBuYW1lLnN1YnN0cihnZW5lcmljX2ZpcnN0ICsgMSwgZ2VuZXJpY19sYXN0IC0gZ2VuZXJpY19maXJzdCAtIDEpOworCisgICAgc3RyaW5nIG5ld19pbm5lciA9ICIiOworICAgIHNpemVfdCBjb21tYV9zdGFydCA9IDA7CisgICAgd2hpbGUgKGNvbW1hX3N0YXJ0IDwgaW5uZXJfdHlwZXMubGVuZ3RoKCkpIHsKKyAgICAgIHNpemVfdCBjb21tYV9wb3MgPSBjb21tYV9zdGFydDsKKyAgICAgIGludCBuZXN0ZWQgPSAwOworCisgICAgICB3aGlsZSAoY29tbWFfcG9zIDwgaW5uZXJfdHlwZXMubGVuZ3RoKCkpIHsKKyAgICAgICAgYm9vbCBmb3VuZCA9IGZhbHNlOworICAgICAgICBzd2l0Y2ggKGlubmVyX3R5cGVzW2NvbW1hX3Bvc10pIHsKKyAgICAgICAgY2FzZSAnPCc6CisgICAgICAgICAgKytuZXN0ZWQ7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJz4nOgorICAgICAgICAgIC0tbmVzdGVkOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICcsJzoKKyAgICAgICAgICBmb3VuZCA9IChuZXN0ZWQgPT0gMCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZvdW5kKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgKytjb21tYV9wb3M7CisgICAgICB9CisKKyAgICAgIGlmIChuZXdfaW5uZXIubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgIG5ld19pbm5lciArPSAiLCI7CisgICAgICB9CisKKyAgICAgIHN0cmluZyBpbm5lciA9IGlubmVyX3R5cGVzLnN1YnN0cihjb21tYV9zdGFydCwgY29tbWFfcG9zIC0gY29tbWFfc3RhcnQpOworICAgICAgbmV3X2lubmVyICs9IGdldF9jYXBfbmFtZShpbm5lcik7CisgICAgICBjb21tYV9zdGFydCA9ICsrY29tbWFfcG9zOworICAgIH0KKworICAgIHJldHVybiBnZXRfY2FwX25hbWUob3V0ZXJfdHlwZSkgKyAiPCIgKyBuZXdfaW5uZXIgKyAiPiI7CisgIH0KKworICAvLyBwYWNrYWdlIG5hbWUKKyAgc2l6ZV90IGluZGV4ID0gbmFtZS5maW5kX2ZpcnN0X25vdF9vZigiIFxuXHJcdCIpOworICBpZiAoaW5kZXggPCBuYW1lLmxlbmd0aCgpKSB7CisgICAgbmFtZVtpbmRleF0gPSB0b2xvd2VyKG5hbWVbaW5kZXhdKTsKKyAgICBpbmRleCA9IG5hbWUuZmluZCgnLicpOworICAgIHdoaWxlIChpbmRleCAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgaWYgKCsraW5kZXggPCBuYW1lLmxlbmd0aCgpKSB7CisgICAgICAgIG5hbWVbaW5kZXhdID0gdG9sb3dlcihuYW1lW2luZGV4XSk7CisgICAgICB9CisgICAgICBpbmRleCA9IG5hbWUuZmluZCgnLicsIGluZGV4KTsKKyAgICB9CisgIH0KKworICAvLyBjbGFzcyBuYW1lCisgIGluZGV4ID0gbmFtZS5yZmluZCgnLicpOworICBpZiAoaW5kZXggIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICArK2luZGV4OworICB9IGVsc2UgeworICAgIGluZGV4ID0gbmFtZS5maW5kX2ZpcnN0X25vdF9vZigiIFxuXHJcdCIpOworICB9CisKKyAgaWYgKGluZGV4IDwgbmFtZS5sZW5ndGgoKSkgeworICAgIG5hbWVbaW5kZXhdID0gdG91cHBlcihuYW1lW2luZGV4XSk7CisgIH0KKworICByZXR1cm4gbmFtZTsKK30KKworc3RyaW5nIHRfaGF4ZV9nZW5lcmF0b3I6OmNvbnN0YW50X25hbWUoc3RyaW5nIG5hbWUpIHsKKyAgc3RyaW5nIGNvbnN0YW50X25hbWU7CisKKyAgYm9vbCBpc19maXJzdCA9IHRydWU7CisgIGJvb2wgd2FzX3ByZXZpb3VzX2NoYXJfdXBwZXIgPSBmYWxzZTsKKyAgZm9yIChzdHJpbmc6Oml0ZXJhdG9yIGl0ZXIgPSBuYW1lLmJlZ2luKCk7IGl0ZXIgIT0gbmFtZS5lbmQoKTsgKytpdGVyKSB7CisgICAgc3RyaW5nOjp2YWx1ZV90eXBlIGNoYXJhY3RlciA9ICgqaXRlcik7CisKKyAgICBib29sIGlzX3VwcGVyID0gaXN1cHBlcihjaGFyYWN0ZXIpOworCisgICAgaWYgKGlzX3VwcGVyICYmICFpc19maXJzdCAmJiAhd2FzX3ByZXZpb3VzX2NoYXJfdXBwZXIpIHsKKyAgICAgIGNvbnN0YW50X25hbWUgKz0gJ18nOworICAgIH0KKyAgICBjb25zdGFudF9uYW1lICs9IHRvdXBwZXIoY2hhcmFjdGVyKTsKKworICAgIGlzX2ZpcnN0ID0gZmFsc2U7CisgICAgd2FzX3ByZXZpb3VzX2NoYXJfdXBwZXIgPSBpc191cHBlcjsKKyAgfQorCisgIHJldHVybiBjb25zdGFudF9uYW1lOworfQorCisvKioKKyAqIEVuYWJsZXMgUlRUSSBmb3IgYSBjbGFzcyBvciBpbnRlcmZhY2UKKyAqLwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9ydHRpX2RlY29yYXRpb24ob3N0cmVhbSYgb3V0KSB7CisgIGlmIChydHRpXykgeworICAgIG91dCA8PCAiQDpydHRpIiA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogQWRkcyBidWlsZCBtYWNyb3MgdG8gYSBjbGFzcyBvciBpbnRlcmZhY2UKKyAqLwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9tYWNyb19kZWNvcmF0aW9uKG9zdHJlYW0mIG91dCkgeworICBpZiAoIWJ1aWxkbWFjcm9fLmVtcHR5KCkpIHsKKyAgICBvdXQgPDwgIiNpZiAhIG1hY3JvIiA8PCBlbmRsOworICAgIG91dCA8PCAiQDpidWlsZCggIiA8PCBidWlsZG1hY3JvXyA8PCAiKSIgPDwgZW5kbDsgICAgIC8vIGN1cnJlbnQgY2xhc3MvaW50ZXJmYWNlCisgICAgb3V0IDw8ICJAOmF1dG9CdWlsZCggIiA8PCBidWlsZG1hY3JvXyA8PCAiKSIgPDwgZW5kbDsgLy8gaW5oZXJpdGVkIGNsYXNzZXMvaW50ZXJmYWNlcworICAgIG91dCA8PCAiI2VuZCIgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIEVtaXRzIGEgaGF4ZURvYyBjb21tZW50IGlmIHRoZSBwcm92aWRlZCBvYmplY3QgaGFzIGEgZG9jIGluIFRocmlmdAorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2hheGVfZG9jKG9zdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpIHsKKyAgaWYgKHRkb2MtPmhhc19kb2MoKSkgeworICAgIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KG91dCwgIi8qKlxuIiwgIiAqICIsIHRkb2MtPmdldF9kb2MoKSwgIiAqL1xuIik7CisgIH0KK30KKworLyoqCisgKiBFbWl0cyBhIGhheGVEb2MgY29tbWVudCBpZiB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gb2JqZWN0IGhhcyBhIGRvYyBpbiBUaHJpZnQKKyAqLwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9oYXhlX2RvYyhvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICBpZiAodGZ1bmN0aW9uLT5oYXNfZG9jKCkpIHsKKyAgICBzdHJpbmdzdHJlYW0gc3M7CisgICAgc3MgPDwgdGZ1bmN0aW9uLT5nZXRfZG9jKCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHBfaXRlcjsKKyAgICBmb3IgKHBfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBwX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK3BfaXRlcikgeworICAgICAgdF9maWVsZCogcCA9ICpwX2l0ZXI7CisgICAgICBzcyA8PCAiXG5AcGFyYW0gIiA8PCBwLT5nZXRfbmFtZSgpOworICAgICAgaWYgKHAtPmhhc19kb2MoKSkgeworICAgICAgICBzcyA8PCAiICIgPDwgcC0+Z2V0X2RvYygpOworICAgICAgfQorICAgIH0KKyAgICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvdXQsICIvKipcbiIsICIgKiAiLCBzcy5zdHIoKSwgIiAqL1xuIik7CisgIH0KK30KKworc3RkOjpzdHJpbmcgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaXNzZXRfY2hlY2sodF9maWVsZCogZmllbGQpIHsKKyAgcmV0dXJuIGdlbmVyYXRlX2lzc2V0X2NoZWNrKGZpZWxkLT5nZXRfbmFtZSgpKTsKK30KKworc3RkOjpzdHJpbmcgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaXNzZXRfY2hlY2soc3RkOjpzdHJpbmcgZmllbGRfbmFtZSkgeworICByZXR1cm4gImlzIiArIGdldF9jYXBfbmFtZSgic2V0IikgKyBnZXRfY2FwX25hbWUoZmllbGRfbmFtZSkgKyAiKCkiOworfQorCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2lzc2V0X3NldChvc3RyZWFtJiBvdXQsIHRfZmllbGQqIGZpZWxkKSB7CisgIGlmICghdHlwZV9jYW5fYmVfbnVsbChmaWVsZC0+Z2V0X3R5cGUoKSkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAidGhpcy5fX2lzc2V0XyIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiA9IHRydWU7IiA8PCBlbmRsOworICB9Cit9CisKK3N0ZDo6c3RyaW5nIHRfaGF4ZV9nZW5lcmF0b3I6OmdldF9lbnVtX2NsYXNzX25hbWUodF90eXBlKiB0eXBlKSB7CisgIHN0cmluZyBwYWNrYWdlID0gIiI7CisgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR5cGUtPmdldF9wcm9ncmFtKCk7CisgIGlmIChwcm9ncmFtICE9IE5VTEwgLyomJiBwcm9ncmFtICE9IHByb2dyYW1fKi8pIHsKKyAgICBwYWNrYWdlID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiaGF4ZSIpICsgIi4iOworICB9CisgIHJldHVybiBwYWNrYWdlICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKworVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUigKKyAgICBoYXhlLAorICAgICJIYXhlIiwKKyAgICAiICAgIGNhbGxiYWNrcyAgICAgICAgVXNlIG9uRXJyb3IoKS9vblN1Y2Nlc3MoKSBjYWxsYmFja3MgZm9yIHNlcnZpY2UgbWV0aG9kcyAobGlrZSBBUzMpXG4iCisgICAgIiAgICBydHRpICAgICAgICAgICAgIEVuYWJsZSBAOnJ0dGkgZm9yIGdlbmVyYXRlZCBjbGFzc2VzIGFuZCBpbnRlcmZhY2VzXG4iCisgICAgIiAgICBidWlsZG1hY3JvPW15Lm1hY3Jvcy5DbGFzcy5tZXRob2QoYXJncylcbiIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgQWRkIEA6YnVpbGQgbWFjcm8gY2FsbHMgdG8gZ2VuZXJhdGVkIGNsYXNzZXMgYW5kIGludGVyZmFjZXNcbiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2hzX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfaHNfZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmNmQ0YjAKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2hzX2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDE3MjggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3N0cmVhbT4KKworI2luY2x1ZGUgInRocmlmdC9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInRocmlmdC92ZXJzaW9uLmgiCisKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9vb3BfZ2VuZXJhdG9yLmgiCisKK3VzaW5nIHN0ZDo6bWFwOwordXNpbmcgc3RkOjpvc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6dmVjdG9yOworCitzdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCisKKy8qKgorICogSGFza2VsbCBjb2RlIGdlbmVyYXRvci4KKyAqCisgKi8KK2NsYXNzIHRfaHNfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7CitwdWJsaWM6CisgIHRfaHNfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgY29uc3QgbWFwPHN0cmluZywgc3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgb3B0aW9uX3N0cmluZykKKyAgICA6IHRfb29wX2dlbmVyYXRvcihwcm9ncmFtKSB7CisgICAgKHZvaWQpb3B0aW9uX3N0cmluZzsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworCisgICAgLyogbm8gb3B0aW9ucyB5ZXQgKi8KKyAgICBmb3IoIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5iZWdpbigpOyBpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgIHRocm93ICJ1bmtub3duIG9wdGlvbiBoczoiICsgaXRlci0+Zmlyc3Q7CisgICAgfQorCisgICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4taHMiOworICB9CisKKyAgLyoqCisgICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKKyAgICovCisKKyAgdm9pZCBpbml0X2dlbmVyYXRvcigpOworICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOworCisgIC8qKgorICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZik7CisgIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworICBzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOworCisgIC8qKgorICAgKiBTdHJ1Y3QgZ2VuZXJhdGlvbiBjb2RlCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfaHNfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7CisKKyAgdm9pZCBnZW5lcmF0ZV9oc19zdHJ1Y3RfZGVmaW5pdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGVscGVyID0gZmFsc2UpOworCisgIHZvaWQgZ2VuZXJhdGVfaHNfc3RydWN0X3JlYWRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKworICB2b2lkIGdlbmVyYXRlX2hzX3N0cnVjdF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9oc19zdHJ1Y3RfYXJiaXRyYXJ5KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIHZvaWQgZ2VuZXJhdGVfaHNfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworCisgIHZvaWQgZ2VuZXJhdGVfaHNfdHlwZW1hcChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKworICB2b2lkIGdlbmVyYXRlX2hzX2RlZmF1bHQob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgLyoqCisgICAqIFNlcnZpY2UtbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworCisgIC8qKgorICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RyaW5nIHByZWZpeCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIG5hbWUgPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgYXJnID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfdHlwZShvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSwgc3RyaW5nIGFyZyA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV90eXBlKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlLCBzdHJpbmcgbmFtZSA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0cmluZyBraXRlciwgc3RyaW5nIHZpdGVyKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfc2V0KiB0bWFwLCBzdHJpbmcgaXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RyaW5nIGl0ZXIpOworCisgIC8qKgorICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucworICAgKi8KKworICBzdHJpbmcgaHNfYXV0b2dlbl9jb21tZW50KCk7CisgIHN0cmluZyBoc19sYW5ndWFnZV9wcmFnbWEoKTsKKyAgc3RyaW5nIGhzX2ltcG9ydHMoKTsKKworICBzdHJpbmcgdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsIHN0cmluZyBmdW5jdGlvbl9wcmVmaXggPSAiIik7CisKKyAgc3RyaW5nIGZpZWxkX25hbWUoc3RyaW5nIHRuYW1lLCBzdHJpbmcgZm5hbWUpOworCisgIHN0cmluZyBmdW5jdGlvbl90eXBlKHRfZnVuY3Rpb24qIHRmdW5jLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIG9wdGlvbnMgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbyA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIG1ldGhvZCA9IGZhbHNlKTsKKworICBzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOworCisgIHN0cmluZyB0eXBlX3RvX2RlZmF1bHQodF90eXBlKiB0dHlwZSk7CisKKyAgc3RyaW5nIHJlbmRlcl9oc190eXBlKHRfdHlwZSogdHlwZSwgYm9vbCBuZWVkc19wYXJlbnMpOworCisgIHN0cmluZyB0eXBlX3RvX2NvbnN0cnVjdG9yKHRfdHlwZSogdHR5cGUpOworCisgIHN0cmluZyByZW5kZXJfaHNfdHlwZV9mb3JfZnVuY3Rpb25fbmFtZSh0X3R5cGUqIHR5cGUpOworCitwcml2YXRlOgorICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfdHlwZXNfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfY29uc3RzXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3NlcnZpY2VfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfaWZhY2VfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfY2xpZW50XzsKK307CisKKy8qKgorICogUHJlcGFyZXMgZm9yIGZpbGUgZ2VuZXJhdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBuZWNlc3NhcnkgZmlsZSBvdXRwdXQKKyAqIHN0cmVhbXMuCisgKgorICogQHBhcmFtIHRwcm9ncmFtIFRoZSBwcm9ncmFtIHRvIGdlbmVyYXRlCisgKi8KK3ZvaWQgdF9oc19nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgeworICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKKyAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKKworICAvLyBNYWtlIG91dHB1dCBmaWxlCisgIHN0cmluZyBwbmFtZSA9IGNhcGl0YWxpemUocHJvZ3JhbV9uYW1lXyk7CisgIHN0cmluZyBmX3R5cGVzX25hbWUgPSBnZXRfb3V0X2RpcigpICsgcG5hbWUgKyAiX1R5cGVzLmhzIjsKKyAgZl90eXBlc18ub3BlbihmX3R5cGVzX25hbWUuY19zdHIoKSk7CisKKyAgc3RyaW5nIGZfY29uc3RzX25hbWUgPSBnZXRfb3V0X2RpcigpICsgcG5hbWUgKyAiX0NvbnN0cy5ocyI7CisgIGZfY29uc3RzXy5vcGVuKGZfY29uc3RzX25hbWUuY19zdHIoKSk7CisKKyAgLy8gUHJpbnQgaGVhZGVyCisgIGZfdHlwZXNfIDw8IGhzX2xhbmd1YWdlX3ByYWdtYSgpIDw8IGVuZGw7CisgIGZfdHlwZXNfIDw8IGhzX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGw7CisgIGZfdHlwZXNfIDw8ICJtb2R1bGUgIiA8PCBwbmFtZSA8PCAiX1R5cGVzIHdoZXJlIiA8PCBlbmRsOworICBmX3R5cGVzXyA8PCBoc19pbXBvcnRzKCkgPDwgZW5kbDsKKworICBmX2NvbnN0c18gPDwgaHNfbGFuZ3VhZ2VfcHJhZ21hKCkgPDwgZW5kbDsKKyAgZl9jb25zdHNfIDw8IGhzX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGw7CisgIGZfY29uc3RzXyA8PCAibW9kdWxlICIgPDwgcG5hbWUgPDwgIl9Db25zdHMgd2hlcmUiIDw8IGVuZGw7CisgIGZfY29uc3RzXyA8PCBoc19pbXBvcnRzKCkgPDwgZW5kbDsKKyAgZl9jb25zdHNfIDw8ICJpbXBvcnQgIiA8PCBwbmFtZSA8PCAiX1R5cGVzIiA8PCBlbmRsOworfQorCitzdHJpbmcgdF9oc19nZW5lcmF0b3I6OmhzX2xhbmd1YWdlX3ByYWdtYSgpIHsKKyAgcmV0dXJuIHN0cmluZygKKyAgICAgICJ7LSMgTEFOR1VBR0UgRGVyaXZlRGF0YVR5cGVhYmxlICMtfVxuIgorICAgICAgInstIyBMQU5HVUFHRSBEZXJpdmVHZW5lcmljICMtfVxuIgorICAgICAgInstIyBMQU5HVUFHRSBPdmVybG9hZGVkU3RyaW5ncyAjLX1cbiIKKyAgICAgICJ7LSMgT1BUSU9OU19HSEMgLWZuby13YXJuLW1pc3NpbmctZmllbGRzICMtfVxuIgorICAgICAgInstIyBPUFRJT05TX0dIQyAtZm5vLXdhcm4tbWlzc2luZy1zaWduYXR1cmVzICMtfVxuIgorICAgICAgInstIyBPUFRJT05TX0dIQyAtZm5vLXdhcm4tbmFtZS1zaGFkb3dpbmcgIy19XG4iCisgICAgICAiey0jIE9QVElPTlNfR0hDIC1mbm8td2Fybi11bnVzZWQtaW1wb3J0cyAjLX1cbiIKKyAgICAgICJ7LSMgT1BUSU9OU19HSEMgLWZuby13YXJuLXVudXNlZC1tYXRjaGVzICMtfVxuIik7Cit9CisKKy8qKgorICogQXV0b2dlbidkIGNvbW1lbnQKKyAqLworc3RyaW5nIHRfaHNfZ2VuZXJhdG9yOjpoc19hdXRvZ2VuX2NvbW1lbnQoKSB7CisgIHJldHVybiBzdHJpbmcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKQorICAgICAgICAgKyAiLS0gQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKCIgKyBUSFJJRlRfVkVSU0lPTiArICIpICAgICAgICAgICAgICAgICAgICAgIC0tXG4iCisgICAgICAgICArICItLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLVxuIgorICAgICAgICAgKyAiLS0gRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkcgLS1cbiIKKyAgICAgICAgICsgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iOworfQorCisvKioKKyAqIFByaW50cyBzdGFuZGFyZCB0aHJpZnQgaW1wb3J0cworICovCitzdHJpbmcgdF9oc19nZW5lcmF0b3I6OmhzX2ltcG9ydHMoKSB7CisgIGNvbnN0IHZlY3Rvcjx0X3Byb2dyYW0qPiYgaW5jbHVkZXMgPSBwcm9ncmFtXy0+Z2V0X2luY2x1ZGVzKCk7CisgIHN0cmluZyByZXN1bHQgPSBzdHJpbmcoCisgICAgICAiaW1wb3J0IFByZWx1ZGUgKCgkKSwgKC4pLCAoPj49KSwgKD09KSwgKCsrKSlcbiIKKyAgICAgICJpbXBvcnQgcXVhbGlmaWVkIFByZWx1ZGUgYXMgUFxuIgorICAgICAgImltcG9ydCBxdWFsaWZpZWQgQ29udHJvbC5FeGNlcHRpb24gYXMgWFxuIgorICAgICAgImltcG9ydCBxdWFsaWZpZWQgQ29udHJvbC5Nb25hZCBhcyBNICggbGlmdE0sIGFwLCB3aGVuIClcbiIKKyAgICAgICJpbXBvcnQgRGF0YS5GdW5jdG9yICggKDwkPikgKVxuIgorICAgICAgImltcG9ydCBxdWFsaWZpZWQgRGF0YS5CeXRlU3RyaW5nLkxhenkgYXMgTEJTXG4iCisgICAgICAiaW1wb3J0IHF1YWxpZmllZCBEYXRhLkhhc2hhYmxlIGFzIEhcbiIKKyAgICAgICJpbXBvcnQgcXVhbGlmaWVkIERhdGEuSW50IGFzIElcbiIKKyAgICAgICJpbXBvcnQgcXVhbGlmaWVkIERhdGEuTWF5YmUgYXMgTSAoY2F0TWF5YmVzKVxuIgorICAgICAgImltcG9ydCBxdWFsaWZpZWQgRGF0YS5UZXh0LkxhenkuRW5jb2RpbmcgYXMgRSAoIGRlY29kZVV0ZjgsIGVuY29kZVV0ZjggKVxuIgorICAgICAgImltcG9ydCBxdWFsaWZpZWQgRGF0YS5UZXh0LkxhenkgYXMgTFRcbiIKKyAgICAgICJpbXBvcnQgcXVhbGlmaWVkIEdIQy5HZW5lcmljcyBhcyBHIChHZW5lcmljKVxuIgorICAgICAgImltcG9ydCBxdWFsaWZpZWQgRGF0YS5UeXBlYWJsZSBhcyBUWSAoIFR5cGVhYmxlIClcbiIKKyAgICAgICJpbXBvcnQgcXVhbGlmaWVkIERhdGEuSGFzaE1hcC5TdHJpY3QgYXMgTWFwXG4iCisgICAgICAiaW1wb3J0IHF1YWxpZmllZCBEYXRhLkhhc2hTZXQgYXMgU2V0XG4iCisgICAgICAiaW1wb3J0IHF1YWxpZmllZCBEYXRhLlZlY3RvciBhcyBWZWN0b3JcbiIKKyAgICAgICJpbXBvcnQgcXVhbGlmaWVkIFRlc3QuUXVpY2tDaGVjay5BcmJpdHJhcnkgYXMgUUMgKCBBcmJpdHJhcnkoLi4pIClcbiIKKyAgICAgICJpbXBvcnQgcXVhbGlmaWVkIFRlc3QuUXVpY2tDaGVjayBhcyBRQyAoIGVsZW1lbnRzIClcbiIKKyAgICAgICJcbiIKKyAgICAgICJpbXBvcnQgcXVhbGlmaWVkIFRocmlmdCBhcyBUXG4iCisgICAgICAiaW1wb3J0IHF1YWxpZmllZCBUaHJpZnQuVHlwZXMgYXMgVFxuIgorICAgICAgImltcG9ydCBxdWFsaWZpZWQgVGhyaWZ0LkFyYml0cmFyaWVzIGFzIFRcbiIKKyAgICAgICJcbiIpOworCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5jbHVkZXMuc2l6ZSgpOyArK2kpCisgICAgcmVzdWx0ICs9ICJpbXBvcnQgcXVhbGlmaWVkICIgKyBjYXBpdGFsaXplKGluY2x1ZGVzW2ldLT5nZXRfbmFtZSgpKSArICJfVHlwZXNcbiI7CisKKyAgaWYgKGluY2x1ZGVzLnNpemUoKSA+IDApCisgICAgcmVzdWx0ICs9ICJcbiI7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBDbG9zZXMgdGhlIHR5cGUgZmlsZXMKKyAqLwordm9pZCB0X2hzX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgeworICAvLyBDbG9zZSB0eXBlcyBmaWxlCisgIGZfdHlwZXNfLmNsb3NlKCk7CisgIGZfY29uc3RzXy5jbG9zZSgpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIEV6LgorICoKKyAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgeworICBzdHJpbmcgdG5hbWUgPSBjYXBpdGFsaXplKHR0eXBlZGVmLT5nZXRfc3ltYm9saWMoKSk7CisgIHN0cmluZyB0ZGVmID0gcmVuZGVyX2hzX3R5cGUodHR5cGVkZWYtPmdldF90eXBlKCksIGZhbHNlKTsKKyAgaW5kZW50KGZfdHlwZXNfKSA8PCAidHlwZSAiIDw8IHRuYW1lIDw8ICIgPSAiIDw8IHRkZWYgPDwgZW5kbDsKKyAgZl90eXBlc18gPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgY29kZSBmb3IgYW4gZW51bWVyYXRlZCB0eXBlLgorICogdGhlIHZhbHVlcy4KKyAqCisgKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCisgKi8KK3ZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgeworICBpbmRlbnQoZl90eXBlc18pIDw8ICJkYXRhICIgPDwgY2FwaXRhbGl6ZSh0ZW51bS0+Z2V0X25hbWUoKSkgPDwgIiA9ICI7CisgIGluZGVudF91cCgpOworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7CisKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgc3RyaW5nIG5hbWUgPSBjYXBpdGFsaXplKCgqY19pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgZl90eXBlc18gPDwgKGZpcnN0ID8gIiIgOiAifCIpOworICAgIGZfdHlwZXNfIDw8IG5hbWU7CisgICAgZmlyc3QgPSBmYWxzZTsKKyAgfQorICBpbmRlbnQoZl90eXBlc18pIDw8ICJkZXJpdmluZyAoUC5TaG93LCBQLkVxLCBHLkdlbmVyaWMsIFRZLlR5cGVhYmxlLCBQLk9yZCwgUC5Cb3VuZGVkKSIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKworICBzdHJpbmcgZW5hbWUgPSBjYXBpdGFsaXplKHRlbnVtLT5nZXRfbmFtZSgpKTsKKworICBpbmRlbnQoZl90eXBlc18pIDw8ICJpbnN0YW5jZSBQLkVudW0gIiA8PCBlbmFtZSA8PCAiIHdoZXJlIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KGZfdHlwZXNfKSA8PCAiZnJvbUVudW0gdCA9IGNhc2UgdCBvZiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgICBzdHJpbmcgbmFtZSA9IGNhcGl0YWxpemUoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICBpbmRlbnQoZl90eXBlc18pIDw8IG5hbWUgPDwgIiAtPiAiIDw8IHZhbHVlIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGZfdHlwZXNfKSA8PCAidG9FbnVtIHQgPSBjYXNlIHQgb2YiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgICAgc3RyaW5nIG5hbWUgPSBjYXBpdGFsaXplKCgqY19pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgaW5kZW50KGZfdHlwZXNfKSA8PCB2YWx1ZSA8PCAiIC0+ICIgPDwgbmFtZSA8PCBlbmRsOworICB9CisgIGluZGVudChmX3R5cGVzXykgPDwgIl8gLT4gWC50aHJvdyBULlRocmlmdEV4Y2VwdGlvbiIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50X2Rvd24oKTsKKworICBpbmRlbnQoZl90eXBlc18pIDw8ICJpbnN0YW5jZSBILkhhc2hhYmxlICIgPDwgZW5hbWUgPDwgIiB3aGVyZSIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChmX3R5cGVzXykgPDwgImhhc2hXaXRoU2FsdCBzYWx0ID0gSC5oYXNoV2l0aFNhbHQgc2FsdCBQLi4gUC5mcm9tRW51bSIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKworICBpbmRlbnQoZl90eXBlc18pIDw8ICJpbnN0YW5jZSBRQy5BcmJpdHJhcnkgIiA8PCBlbmFtZSA8PCAiIHdoZXJlIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KGZfdHlwZXNfKSA8PCAiYXJiaXRyYXJ5ID0gUUMuZWxlbWVudHMgKFAuZW51bUZyb21UbyBQLm1pbkJvdW5kIFAubWF4Qm91bmQpIiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworfQorCisvKioKKyAqIEdlbmVyYXRlIGEgY29uc3RhbnQgdmFsdWUKKyAqLwordm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KSB7CisgIHRfdHlwZSogdHlwZSA9IHRjb25zdC0+Z2V0X3R5cGUoKTsKKyAgc3RyaW5nIG5hbWUgPSBkZWNhcGl0YWxpemUodGNvbnN0LT5nZXRfbmFtZSgpKTsKKworICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSA9IHRjb25zdC0+Z2V0X3ZhbHVlKCk7CisKKyAgaW5kZW50KGZfY29uc3RzXykgPDwgbmFtZSA8PCAiIDo6ICIgPDwgcmVuZGVyX2hzX3R5cGUodHlwZSwgZmFsc2UpIDw8IGVuZGw7CisgIGluZGVudChmX2NvbnN0c18pIDw8IG5hbWUgPDwgIiA9ICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHR5cGUsIHZhbHVlKSA8PCBlbmRsOworICBmX2NvbnN0c18gPDwgZW5kbDsKK30KKworLyoqCisgKiBQcmludHMgdGhlIHZhbHVlIG9mIGEgY29uc3RhbnQgd2l0aCB0aGUgZ2l2ZW4gdHlwZS4gTm90ZSB0aGF0IHR5cGUgY2hlY2tpbmcKKyAqIGlzIE5PVCBwZXJmb3JtZWQgaW4gdGhpcyBmdW5jdGlvbiBhcyBpdCBpcyBhbHdheXMgcnVuIGJlZm9yZWhhbmQgdXNpbmcgdGhlCisgKiB2YWxpZGF0ZV90eXBlcyBtZXRob2QgaW4gbWFpbi5jYworICovCitzdHJpbmcgdF9oc19nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7CisgIGlmICh2YWx1ZSA9PSBOVUxMKQorICAgIHJldHVybiB0eXBlX3RvX2RlZmF1bHQodHlwZSk7CisKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisgIG9zdHJpbmdzdHJlYW0gb3V0OworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIG91dCA8PCAnIicgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7CisgICAgICBicmVhazsKKworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIG91dCA8PCAodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwID8gIlAuVHJ1ZSIgOiAiUC5GYWxzZSIpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgb3V0IDw8ICIoIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiKSI7CisgICAgICBicmVhazsKKworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKKyAgICAgICAgb3V0IDw8ICIoIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiKSI7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgIigiIDw8IHZhbHVlLT5nZXRfZG91YmxlKCkgPDwgIikiOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgfQorCisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgdF9lbnVtKiB0ZW51bSA9ICh0X2VudW0qKXR5cGU7CisgICAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CisgICAgZm9yICh2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOworICAgICAgICAgKytjX2l0ZXIpIHsKKyAgICAgIGludCB2YWwgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOworICAgICAgaWYgKHZhbCA9PSB2YWx1ZS0+Z2V0X2ludGVnZXIoKSkgeworICAgICAgICB0X3Byb2dyYW0qIHByb2cgPSB0eXBlLT5nZXRfcHJvZ3JhbSgpOworICAgICAgICBpZiAocHJvZyAhPSBOVUxMICYmIHByb2cgIT0gcHJvZ3JhbV8pCisgICAgICAgICAgb3V0IDw8IGNhcGl0YWxpemUocHJvZy0+Z2V0X25hbWUoKSkgPDwgIl9UeXBlcy4iOworICAgICAgICBvdXQgPDwgY2FwaXRhbGl6ZSgoKmNfaXRlciktPmdldF9uYW1lKCkpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgc3RyaW5nIGNuYW1lID0gdHlwZV9uYW1lKHR5cGUpOworICAgIG91dCA8PCAiZGVmYXVsdF8iIDw8IGNuYW1lIDw8ICJ7IjsKKworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworCisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yIChtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyID0gdmFsLmJlZ2luKCk7CisgICAgICAgICB2X2l0ZXIgIT0gdmFsLmVuZCgpOworICAgICAgICAgKyt2X2l0ZXIpIHsKKyAgICAgIHRfZmllbGQqIGZpZWxkID0gTlVMTDsKKworICAgICAgZm9yICh2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsKKyAgICAgICAgICAgKytmX2l0ZXIpCisgICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKQorICAgICAgICAgIGZpZWxkID0gKCpmX2l0ZXIpOworCisgICAgICBpZiAoZmllbGQgPT0gTlVMTCkKKyAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyBjbmFtZSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisKKyAgICAgIHN0cmluZyBmbmFtZSA9IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKKyAgICAgIHN0cmluZyBjb25zdF92YWx1ZSA9IHJlbmRlcl9jb25zdF92YWx1ZShmaWVsZC0+Z2V0X3R5cGUoKSwgdl9pdGVyLT5zZWNvbmQpOworCisgICAgICBvdXQgPDwgKGZpcnN0ID8gIiIgOiAiLCAiKTsKKyAgICAgIG91dCA8PCBmaWVsZF9uYW1lKGNuYW1lLCBmbmFtZSkgPDwgIiA9ICI7CisgICAgICBpZiAoZmllbGQtPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMIHx8ICgodF90eXBlKilmaWVsZC0+Z2V0X3R5cGUoKSktPmlzX3hjZXB0aW9uKCkpIHsKKyAgICAgICAgb3V0IDw8ICJQLkp1c3QgIjsKKyAgICAgIH0KKyAgICAgIG91dCA8PCBjb25zdF92YWx1ZTsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfQorCisgICAgb3V0IDw8ICJ9IjsKKworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOworCisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKworICAgIG91dCA8PCAiKE1hcC5mcm9tTGlzdCBbIjsKKworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBzdHJpbmcga2V5ID0gcmVuZGVyX2NvbnN0X3ZhbHVlKGt0eXBlLCB2X2l0ZXItPmZpcnN0KTsKKyAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUodnR5cGUsIHZfaXRlci0+c2Vjb25kKTsKKyAgICAgIG91dCA8PCAoZmlyc3QgPyAiIiA6ICIsIik7CisgICAgICBvdXQgPDwgIigiIDw8IGtleSA8PCAiLCIgPDwgdmFsIDw8ICIpIjsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfQorICAgIG91dCA8PCAiXSkiOworCisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKSB7CisgICAgdF90eXBlKiBldHlwZSA9IHR5cGUtPmlzX2xpc3QoKSA/ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisKKyAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisKKyAgICBpZiAodHlwZS0+aXNfc2V0KCkpCisgICAgICBvdXQgPDwgIihTZXQuZnJvbUxpc3QgWyI7CisgICAgZWxzZQorICAgICAgb3V0IDw8ICIoVmVjdG9yLmZyb21MaXN0IFsiOworCisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIG91dCA8PCAoZmlyc3QgPyAiIiA6ICIsIik7CisgICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGV0eXBlLCAqdl9pdGVyKTsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfQorCisgICAgb3V0IDw8ICJdKSI7CisKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIENPTlNUQU5UIEZPUiBUWVBFOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKKyAgfQorCisgIHJldHVybiBvdXQuc3RyKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgInN0cnVjdCIKKyAqLwordm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGdlbmVyYXRlX2hzX3N0cnVjdCh0c3RydWN0LCBmYWxzZSk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGV4Y2VwdGlvbi4gQmFzaWNhbGx5IHRoZSBzYW1lCisgKiBhcyBhIHN0cnVjdCwgYnV0IGFsc28gaGFzIGFuIGV4Y2VwdGlvbiBkZWNsYXJhdGlvbi4KKyAqCisgKiBAcGFyYW0gdHhjZXB0aW9uIFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7CisgIGdlbmVyYXRlX2hzX3N0cnVjdCh0eGNlcHRpb24sIHRydWUpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIEhhc2tlbGwgc3RydWN0CisgKi8KK3ZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX2hzX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pIHsKKyAgZ2VuZXJhdGVfaHNfc3RydWN0X2RlZmluaXRpb24oZl90eXBlc18sIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbiwgZmFsc2UpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX2hzX3N0cnVjdF9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhlbHBlcikgeworICAodm9pZCloZWxwZXI7CisgIHN0cmluZyB0bmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0KTsKKyAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKworICBpbmRlbnQob3V0KSA8PCAiZGF0YSAiIDw8IHRuYW1lIDw8ICIgPSAiIDw8IHRuYW1lOworICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7CisgICAgaW5kZW50X3VwKCk7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yICh2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOworICAgICAgICAgKyttX2l0ZXIpIHsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAieyAiOworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIiwgIjsKKyAgICAgIH0KKyAgICAgIHN0cmluZyBtbmFtZSA9ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgIG91dCA8PCBmaWVsZF9uYW1lKHRuYW1lLCBtbmFtZSkgPDwgIiA6OiAiOworICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwKKyAgICAgICAgICB8fCAoKHRfdHlwZSopKCptX2l0ZXIpLT5nZXRfdHlwZSgpKS0+aXNfeGNlcHRpb24oKSkgeworICAgICAgICBvdXQgPDwgIlAuTWF5YmUgIjsKKyAgICAgIH0KKyAgICAgIG91dCA8PCByZW5kZXJfaHNfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCksIHRydWUpIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudChvdXQpIDw8ICJ9IjsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgb3V0IDw8ICIgZGVyaXZpbmcgKFAuU2hvdyxQLkVxLEcuR2VuZXJpYyxUWS5UeXBlYWJsZSkiIDw8IGVuZGw7CisKKyAgaWYgKGlzX2V4Y2VwdGlvbikKKyAgICBvdXQgPDwgImluc3RhbmNlIFguRXhjZXB0aW9uICIgPDwgdG5hbWUgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAiaW5zdGFuY2UgSC5IYXNoYWJsZSAiIDw8IHRuYW1lIDw8ICIgd2hlcmUiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAiaGFzaFdpdGhTYWx0IHNhbHQgcmVjb3JkID0gc2FsdCI7CisgIGZvciAodmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsKKyAgICAgICArK21faXRlcikgeworICAgIHN0cmluZyBtbmFtZSA9ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiIGBILmhhc2hXaXRoU2FsdGAgIiA8PCBmaWVsZF9uYW1lKHRuYW1lLCBtbmFtZSkgPDwgIiByZWNvcmQiOworICB9CisgIGluZGVudChvdXQpIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisKKyAgZ2VuZXJhdGVfaHNfc3RydWN0X2FyYml0cmFyeShvdXQsIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9oc19zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCk7CisgIGdlbmVyYXRlX2hzX3N0cnVjdF9yZWFkZXIob3V0LCB0c3RydWN0KTsKKyAgZ2VuZXJhdGVfaHNfdHlwZW1hcChvdXQsIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9oc19kZWZhdWx0KG91dCwgdHN0cnVjdCk7Cit9CisKK3ZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX2hzX3N0cnVjdF9hcmJpdHJhcnkob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBzdHJpbmcgdG5hbWUgPSB0eXBlX25hbWUodHN0cnVjdCk7CisgIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisKKyAgaW5kZW50KG91dCkgPDwgImluc3RhbmNlIFFDLkFyYml0cmFyeSAiIDw8IHRuYW1lIDw8ICIgd2hlcmUgIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgeworICAgIGluZGVudChvdXQpIDw8ICJhcmJpdHJhcnkgPSBNLmxpZnRNICIgPDwgdG5hbWU7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50X3VwKCk7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yICh2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOworICAgICAgICAgKyttX2l0ZXIpIHsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICBvdXQgPDwgIiAiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgImBNLmFwYCI7CisgICAgICB9CisgICAgICBvdXQgPDwgIigiOworICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwKKyAgICAgICAgICB8fCAoKHRfdHlwZSopKCptX2l0ZXIpLT5nZXRfdHlwZSgpKS0+aXNfeGNlcHRpb24oKSkgeworICAgICAgICBvdXQgPDwgIk0ubGlmdE0gUC5KdXN0ICI7CisgICAgICB9CisgICAgICBvdXQgPDwgIlFDLmFyYml0cmFyeSkiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudF9kb3duKCk7CisKKyAgICAvLyBTaHJpbmsKKyAgICBpbmRlbnQob3V0KSA8PCAic2hyaW5rIG9iaiB8IG9iaiA9PSBkZWZhdWx0XyIgPDwgdG5hbWUgPDwgIiA9IFtdIiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgICAgICAgICAgIHwgUC5vdGhlcndpc2UgPSBNLmNhdE1heWJlcyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmaXJzdCA9IHRydWU7CisgICAgZm9yICh2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOworICAgICAgICAgKyttX2l0ZXIpIHsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICBpbmRlbnQob3V0KSA8PCAiWyAiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIiwgIjsKKyAgICAgIH0KKyAgICAgIHN0cmluZyBmbmFtZSA9IGZpZWxkX25hbWUodG5hbWUsICgqbV9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgICBvdXQgPDwgImlmIG9iaiA9PSBkZWZhdWx0XyIgPDwgdG5hbWU7CisgICAgICBvdXQgPDwgInsiIDw8IGZuYW1lIDw8ICIgPSAiIDw8IGZuYW1lIDw8ICIgb2JqfSAiOworICAgICAgb3V0IDw8ICJ0aGVuIFAuTm90aGluZyAiOworICAgICAgb3V0IDw8ICJlbHNlIFAuSnVzdCAkIGRlZmF1bHRfIiA8PCB0bmFtZTsKKyAgICAgIG91dCA8PCAieyIgPDwgZm5hbWUgPDwgIiA9ICIgPDwgZm5hbWUgPDwgIiBvYmp9IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnQob3V0KSA8PCAiXSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9IGVsc2UgeyAvKiAwID09IG1lbWJlcnMuc2l6ZSgpICovCisgICAgaW5kZW50KG91dCkgPDwgImFyYml0cmFyeSA9IFFDLmVsZW1lbnRzIFsiIDw8IHRuYW1lIDw8ICJdIiA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHRoZSByZWFkIG1ldGhvZCBmb3IgYSBzdHJ1Y3QKKyAqLwordm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaHNfc3RydWN0X3JlYWRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisKKyAgc3RyaW5nIHNuYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QpOworICBzdHJpbmcgaWQgPSB0bXAoIl9pZCIpOworICBzdHJpbmcgdmFsID0gdG1wKCJfdmFsIik7CisKKyAgaW5kZW50KG91dCkgPDwgInRvXyIgPDwgc25hbWUgPDwgIiA6OiBULlRocmlmdFZhbCAtPiAiIDw8IHNuYW1lIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ0b18iIDw8IHNuYW1lIDw8ICIgKFQuVFN0cnVjdCBmaWVsZHMpID0gIiA8PCBzbmFtZSA8PCAieyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisKKyAgLy8gR2VuZXJhdGUgZGVzZXJpYWxpemF0aW9uIGNvZGUgZm9yIGtub3duIGNhc2VzCisgIGZvciAodmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaW50MzJfdCBrZXkgPSAoKmZfaXRlciktPmdldF9rZXkoKTsKKyAgICBzdHJpbmcgZXR5cGUgPSB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICBzdHJpbmcgZm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCAiLCIgPDwgZW5kbDsKKyAgICB9CisKKyAgICAvLyBGaWxsIGluIEZpZWxkCisgICAgaW5kZW50KG91dCkgPDwgZmllbGRfbmFtZShzbmFtZSwgZm5hbWUpIDw8ICIgPSAiOworCisgICAgb3V0IDw8ICJQLm1heWJlICgiOworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICBvdXQgPDwgIlAuZXJyb3IgXCJNaXNzaW5nIHJlcXVpcmVkIGZpZWxkOiAiIDw8IGZuYW1lIDw8ICJcIiI7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmICgoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTAorICAgICAgICAgICB8fCAoKHRfdHlwZSopKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKS0+aXNfeGNlcHRpb24oKSkgJiYgKCpmX2l0ZXIpLT5nZXRfdmFsdWUoKSA9PSBOVUxMKSB7CisgICAgICAgIG91dCA8PCAiUC5Ob3RoaW5nIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCBmaWVsZF9uYW1lKHNuYW1lLCBmbmFtZSkgPDwgIiBkZWZhdWx0XyIgPDwgc25hbWU7CisgICAgICB9CisgICAgfQorICAgIG91dCA8PCAiKSAiOworCisgICAgb3V0IDw8ICIoXFwoXywiIDw8IHZhbCA8PCAiKSAtPiAiOworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMCisgICAgICAgIHx8ICgodF90eXBlKikoKmZfaXRlciktPmdldF90eXBlKCkpLT5pc194Y2VwdGlvbigpKQorICAgICAgb3V0IDw8ICJQLkp1c3QgIjsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsIHZhbCk7CisgICAgb3V0IDw8ICIpIjsKKyAgICBvdXQgPDwgIiAoTWFwLmxvb2t1cCAoIiA8PCBrZXkgPDwgIikgZmllbGRzKSI7CisgIH0KKworICBvdXQgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisKKyAgLy8gcmVhZAorICBzdHJpbmcgdG1hcCA9IHR5cGVfbmFtZSh0c3RydWN0LCAidHlwZW1hcF8iKTsKKyAgaW5kZW50KG91dCkgPDwgInRvXyIgPDwgc25hbWUgPDwgIiBfID0gUC5lcnJvciBcIm5vdCBhIHN0cnVjdFwiIiA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJyZWFkXyIgPDwgc25hbWUgPDwgIiA6OiBULlByb3RvY29sIHAgPT4gcCAtPiBQLklPICIgPDwgc25hbWUKKyAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInJlYWRfIiA8PCBzbmFtZSA8PCAiIGlwcm90ID0gdG9fIiA8PCBzbmFtZTsKKyAgb3V0IDw8ICIgPCQ+IFQucmVhZFZhbCBpcHJvdCAoVC5UX1NUUlVDVCAiIDw8IHRtYXAgPDwgIikiIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgImRlY29kZV8iIDw8IHNuYW1lCisgICAgICAgICAgICAgIDw8ICIgOjogVC5TdGF0ZWxlc3NQcm90b2NvbCBwID0+IHAgLT4gTEJTLkJ5dGVTdHJpbmcgLT4gIiA8PCBzbmFtZSA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiZGVjb2RlXyIgPDwgc25hbWUgPDwgIiBpcHJvdCBicyA9IHRvXyIgPDwgc25hbWUgPDwgIiAkICI7CisgIG91dCA8PCAiVC5kZXNlcmlhbGl6ZVZhbCBpcHJvdCAoVC5UX1NUUlVDVCAiIDw8IHRtYXAgPDwgIikgYnMiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX2hzX3N0cnVjdF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBzdHJpbmcgbmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0KTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHN0cmluZyBzdHIgPSB0bXAoIl9zdHIiKTsKKyAgc3RyaW5nIGYgPSB0bXAoIl9mIik7CisgIHN0cmluZyB2ID0gdG1wKCJfdiIpOworCisgIGluZGVudChvdXQpIDw8ICJmcm9tXyIgPDwgbmFtZSA8PCAiIDo6ICIgPDwgbmFtZSA8PCAiIC0+IFQuVGhyaWZ0VmFsIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiZnJvbV8iIDw8IG5hbWUgPDwgIiByZWNvcmQgPSBULlRTdHJ1Y3QgJCBNYXAuZnJvbUxpc3QgIjsKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gR2V0IEV4Y2VwdGlvbnMKKyAgYm9vbCBoYXNFeG4gPSBmYWxzZTsKKyAgZm9yICh2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoKCh0X3R5cGUqKSgqZl9pdGVyKS0+Z2V0X3R5cGUoKSktPmlzX3hjZXB0aW9uKCkpIHsKKyAgICAgIGhhc0V4biA9IHRydWU7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBib29sIGlzZmlyc3QgPSB0cnVlOworICBpZiAoaGFzRXhuKSB7CisgICAgb3V0IDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIihsZXQgZXhucyA9IE0uY2F0TWF5YmVzICI7CisgICAgaW5kZW50X3VwKCk7CisgICAgZm9yICh2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsKKyAgICAgICAgICsrZl9pdGVyKSB7CisgICAgICBpZiAoKCh0X3R5cGUqKSgqZl9pdGVyKS0+Z2V0X3R5cGUoKSktPmlzX3hjZXB0aW9uKCkpIHsKKyAgICAgICAgaWYgKGlzZmlyc3QpIHsKKyAgICAgICAgICBvdXQgPDwgIlsgIjsKKyAgICAgICAgICBpc2ZpcnN0ID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgb3V0IDw8ICIsICI7CisgICAgICAgIH0KKyAgICAgICAgc3RyaW5nIG1uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgICBpbnQzMl90IGtleSA9ICgqZl9pdGVyKS0+Z2V0X2tleSgpOworICAgICAgICBvdXQgPDwgIihcXCIgPDwgdiA8PCAiIC0+ICgiIDw8IGtleSA8PCAiLCAoXCIiIDw8IG1uYW1lIDw8ICJcIiwiOworICAgICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfdHlwZShvdXQsICgqZl9pdGVyKS0+Z2V0X3R5cGUoKSwgdik7CisgICAgICAgIG91dCA8PCAiKSkpIDwkPiAiIDw8IGZpZWxkX25hbWUobmFtZSwgbW5hbWUpIDw8ICIgcmVjb3JkIjsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFpc2ZpcnN0KSB7CisgICAgICBvdXQgPDwgIl0iIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgImluIGlmIFAubm90IChQLm51bGwgZXhucykgdGhlbiBleG5zIGVsc2UgIjsKKyAgICBpbmRlbnRfdXAoKTsKKyAgfSBlbHNlIHsKKyAgICBvdXQgPDwgIiQgIjsKKyAgfQorCisgIG91dCA8PCAiTS5jYXRNYXliZXMiIDw8IGVuZGw7CisgIC8vIEdldCB0aGUgUmVzdAorICBpc2ZpcnN0ID0gdHJ1ZTsKKyAgZm9yICh2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAvLyBXcml0ZSBmaWVsZCBoZWFkZXIKKyAgICBpZiAoaXNmaXJzdCkgeworICAgICAgaW5kZW50KG91dCkgPDwgIlsgIjsKKyAgICAgIGlzZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgIiwgIjsKKyAgICB9CisgICAgc3RyaW5nIG1uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIGludDMyX3Qga2V5ID0gKCpmX2l0ZXIpLT5nZXRfa2V5KCk7CisgICAgb3V0IDw8ICIoXFwiOworICAgIG91dCA8PCB2IDw8ICIgLT4gIjsKKyAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9PUFRJT05BTAorICAgICAgICAmJiAhKCh0X3R5cGUqKSgqZl9pdGVyKS0+Z2V0X3R5cGUoKSktPmlzX3hjZXB0aW9uKCkpIHsKKyAgICAgIG91dCA8PCAiUC5KdXN0ICI7CisgICAgfQorICAgIG91dCA8PCAiKCIgPDwga2V5IDw8ICIsIChcIiIgPDwgbW5hbWUgPDwgIlwiLCI7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3R5cGUob3V0LCAoKmZfaXRlciktPmdldF90eXBlKCksIHYpOworICAgIG91dCA8PCAiKSkpICI7CisgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfT1BUSU9OQUwKKyAgICAgICAgJiYgISgodF90eXBlKikoKmZfaXRlciktPmdldF90eXBlKCkpLT5pc194Y2VwdGlvbigpKSB7CisgICAgICBvdXQgPDwgIiQiOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgIjwkPiI7CisgICAgfQorICAgIG91dCA8PCAiICIgPDwgZmllbGRfbmFtZShuYW1lLCBtbmFtZSkgPDwgIiByZWNvcmQiIDw8IGVuZGw7CisgIH0KKworICAvLyBXcml0ZSB0aGUgc3RydWN0IG1hcAorICBpZiAoaXNmaXJzdCkgeworICAgIGluZGVudChvdXQpIDw8ICJbXSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiXSIgPDwgZW5kbDsKKyAgfQorICBpZiAoaGFzRXhuKSB7CisgICAgaW5kZW50KG91dCkgPDwgIikiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorICBpbmRlbnRfZG93bigpOworCisgIC8vIHdyaXRlCisgIGluZGVudChvdXQpIDw8ICJ3cml0ZV8iIDw8IG5hbWUgPDwgIiA6OiBULlByb3RvY29sIHAgPT4gcCAtPiAiIDw8IG5hbWUKKyAgICAgICAgICAgICAgPDwgIiAtPiBQLklPICgpIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAid3JpdGVfIiA8PCBuYW1lIDw8ICIgb3Byb3QgcmVjb3JkID0gVC53cml0ZVZhbCBvcHJvdCAkIGZyb21fIjsKKyAgb3V0IDw8IG5hbWUgPDwgIiByZWNvcmQiIDw8IGVuZGw7CisKKyAgLy8gZW5jb2RlCisgIGluZGVudChvdXQpIDw8ICJlbmNvZGVfIiA8PCBuYW1lIDw8ICIgOjogVC5TdGF0ZWxlc3NQcm90b2NvbCBwID0+IHAgLT4gIiA8PCBuYW1lCisgICAgICAgICAgICAgIDw8ICIgLT4gTEJTLkJ5dGVTdHJpbmciIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJlbmNvZGVfIiA8PCBuYW1lIDw8ICIgb3Byb3QgcmVjb3JkID0gVC5zZXJpYWxpemVWYWwgb3Byb3QgJCAiOworICBvdXQgPDwgImZyb21fIiA8PCBuYW1lIDw8ICIgcmVjb3JkIiA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHRocmlmdCBzZXJ2aWNlLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZl9zZXJ2aWNlX25hbWUgPSBnZXRfb3V0X2RpcigpICsgY2FwaXRhbGl6ZShzZXJ2aWNlX25hbWVfKSArICIuaHMiOworICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7CisKKyAgZl9zZXJ2aWNlXyA8PCBoc19sYW5ndWFnZV9wcmFnbWEoKSA8PCBlbmRsOworICBmX3NlcnZpY2VfIDw8IGhzX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGw7CisgIGZfc2VydmljZV8gPDwgIm1vZHVsZSAiIDw8IGNhcGl0YWxpemUoc2VydmljZV9uYW1lXykgPDwgIiB3aGVyZSIgPDwgZW5kbDsKKyAgZl9zZXJ2aWNlXyA8PCBoc19pbXBvcnRzKCkgPDwgZW5kbDsKKworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8ICJpbXBvcnQgcXVhbGlmaWVkICIgPDwgY2FwaXRhbGl6ZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSkgPDwgZW5kbDsKKyAgfQorCisgIGZfc2VydmljZV8gPDwgImltcG9ydCAiIDw8IGNhcGl0YWxpemUocHJvZ3JhbV9uYW1lXykgPDwgIl9UeXBlcyIgPDwgZW5kbDsKKyAgZl9zZXJ2aWNlXyA8PCAiaW1wb3J0IHF1YWxpZmllZCAiIDw8IGNhcGl0YWxpemUoc2VydmljZV9uYW1lXykgPDwgIl9JZmFjZSBhcyBJZmFjZSIgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgdGhyZWUgbWFpbiBwYXJ0cyBvZiB0aGUgc2VydmljZQorICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodHNlcnZpY2UpOworCisgIC8vIENsb3NlIHNlcnZpY2UgZmlsZQorICBmX3NlcnZpY2VfLmNsb3NlKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGhlbHBlciBmdW5jdGlvbnMgZm9yIGEgc2VydmljZS4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKKyAqLwordm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICItLSBIRUxQRVIgRlVOQ1RJT05TIEFORCBTVFJVQ1RVUkVTIC0tIiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgZW5kbDsKKworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBnZW5lcmF0ZV9oc19zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCB0cywgZmFsc2UpOworICAgIGdlbmVyYXRlX2hzX2Z1bmN0aW9uX2hlbHBlcnMoKmZfaXRlcik7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgYW5kIGhlbHBlcnMgZm9yIGEgZnVuY3Rpb24uCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24KKyAqLwordm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaHNfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCBmaWVsZF9uYW1lKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSwgInJlc3VsdCIpKTsKKyAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKKworICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKQorICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOworCisgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKQorICAgIHJlc3VsdC5hcHBlbmQoKmZfaXRlcik7CisKKyAgZ2VuZXJhdGVfaHNfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgJnJlc3VsdCwgZmFsc2UpOworfQorCisvKioKKyAqIEdlbmVyYXRlIHRoZSBtYXAgZnJvbSBmaWVsZCBuYW1lcyB0byAodHlwZSwgaWQpCisgKiBAcGFyYW0gdHN0cnVjdCB0aGUgU3RydWN0CisgKi8KK3ZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX2hzX3R5cGVtYXAob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBzdHJpbmcgbmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0KTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisKKyAgaW5kZW50KG91dCkgPDwgInR5cGVtYXBfIiA8PCBuYW1lIDw8ICIgOjogVC5UeXBlTWFwIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAidHlwZW1hcF8iIDw8IG5hbWUgPDwgIiA9IE1hcC5mcm9tTGlzdCBbIjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAodmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgc3RyaW5nIG1uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIGlmICghZmlyc3QpIHsKKyAgICAgIG91dCA8PCAiLCI7CisgICAgfQorCisgICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSgoKmZfaXRlciktPmdldF90eXBlKCkpOworICAgIGludDMyX3Qga2V5ID0gKCpmX2l0ZXIpLT5nZXRfa2V5KCk7CisgICAgb3V0IDw8ICIoIiA8PCBrZXkgPDwgIiwoXCIiIDw8IG1uYW1lIDw8ICJcIiwiIDw8IHR5cGVfdG9fZW51bSh0eXBlKSA8PCAiKSkiOworICAgIGZpcnN0ID0gZmFsc2U7CisgIH0KKyAgb3V0IDw8ICJdIiA8PCBlbmRsOworfQorCisvKioKKyAqIGdlbmVyYXRlIHRoZSBzdHJ1Y3Qgd2l0aCBkZWZhdWx0IHZhbHVlcyBmaWxsZWQgaW4KKyAqIEBwYXJhbSB0c3RydWN0IHRoZSBTdHJ1Y3QKKyAqLwordm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaHNfZGVmYXVsdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHN0cmluZyBuYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QpOworICBzdHJpbmcgZm5hbWUgPSB0eXBlX25hbWUodHN0cnVjdCwgImRlZmF1bHRfIik7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworCisgIGluZGVudChvdXQpIDw8IGZuYW1lIDw8ICIgOjogIiA8PCBuYW1lIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8IGZuYW1lIDw8ICIgPSAiIDw8IG5hbWUgPDwgInsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yICh2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBzdHJpbmcgbW5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgIiwiIDw8IGVuZGw7CisgICAgfQorCisgICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSgoKmZfaXRlciktPmdldF90eXBlKCkpOworICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlID0gKCpmX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgICBpbmRlbnQob3V0KSA8PCBmaWVsZF9uYW1lKG5hbWUsIG1uYW1lKSA8PCAiID0gIjsKKyAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTAorICAgICAgICB8fCAoKHRfdHlwZSopKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKS0+aXNfeGNlcHRpb24oKSkgeworICAgICAgaWYgKHZhbHVlID09IE5VTEwpIHsKKyAgICAgICAgb3V0IDw8ICJQLk5vdGhpbmciOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0IDw8ICJQLkp1c3QgIiA8PCByZW5kZXJfY29uc3RfdmFsdWUodHlwZSwgdmFsdWUpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHR5cGUsIHZhbHVlKTsKKyAgICB9CisgIH0KKyAgb3V0IDw8ICJ9IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgaW50ZXJmYWNlIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCisgKi8KK3ZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGZfaWZhY2VfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBjYXBpdGFsaXplKHNlcnZpY2VfbmFtZV8pICsgIl9JZmFjZS5ocyI7CisgIGZfaWZhY2VfLm9wZW4oZl9pZmFjZV9uYW1lLmNfc3RyKCkpOworCisgIGZfaWZhY2VfIDw8IGhzX2xhbmd1YWdlX3ByYWdtYSgpIDw8IGVuZGw7CisgIGZfaWZhY2VfIDw8IGhzX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGw7CisKKyAgZl9pZmFjZV8gPDwgIm1vZHVsZSAiIDw8IGNhcGl0YWxpemUoc2VydmljZV9uYW1lXykgPDwgIl9JZmFjZSB3aGVyZSIgPDwgZW5kbDsKKworICBmX2lmYWNlXyA8PCBoc19pbXBvcnRzKCkgPDwgZW5kbDsKKyAgZl9pZmFjZV8gPDwgImltcG9ydCAiIDw8IGNhcGl0YWxpemUocHJvZ3JhbV9uYW1lXykgPDwgIl9UeXBlcyIgPDwgZW5kbDsKKyAgZl9pZmFjZV8gPDwgZW5kbDsKKworICBzdHJpbmcgc25hbWUgPSBjYXBpdGFsaXplKHNlcnZpY2VfbmFtZV8pOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIHN0cmluZyBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKworICAgIGluZGVudChmX2lmYWNlXykgPDwgImltcG9ydCAiIDw8IGV4dGVuZHMgPDwgIl9JZmFjZSIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9pZmFjZV8pIDw8ICJjbGFzcyAiIDw8IGV4dGVuZHMgPDwgIl9JZmFjZSBhID0+ICIgPDwgc25hbWUgPDwgIl9JZmFjZSBhIHdoZXJlIiA8PCBlbmRsOworCisgIH0gZWxzZSB7CisgICAgaW5kZW50KGZfaWZhY2VfKSA8PCAiY2xhc3MgIiA8PCBzbmFtZSA8PCAiX0lmYWNlIGEgd2hlcmUiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfdXAoKTsKKworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBzdHJpbmcgZnQgPSBmdW5jdGlvbl90eXBlKCpmX2l0ZXIsIHRydWUsIHRydWUsIHRydWUpOworICAgIGluZGVudChmX2lmYWNlXykgPDwgZGVjYXBpdGFsaXplKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiA6OiBhIC0+ICIgPDwgZnQgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGZfaWZhY2VfLmNsb3NlKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgZGVmaW5pdGlvbi4gTm90ZSB0aGF0IGluIEhhc2tlbGwsIHRoZSBjbGllbnQgZG9lc24ndCBpbXBsZW1lbnQgaWZhY2UuCisgKlRoaXMgaXMgYmVjYXVzZQorICogVGhlIGNsaWVudCBkb2VzIG5vdCAoYW5kIHNob3VsZCBub3QgaGF2ZSB0bykgZGVhbCB3aXRoIGFyZ3VtZW50cyBiZWluZyBOb3RoaW5nLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCisgKi8KK3ZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGZfY2xpZW50X25hbWUgPSBnZXRfb3V0X2RpcigpICsgY2FwaXRhbGl6ZShzZXJ2aWNlX25hbWVfKSArICJfQ2xpZW50LmhzIjsKKyAgZl9jbGllbnRfLm9wZW4oZl9jbGllbnRfbmFtZS5jX3N0cigpKTsKKyAgZl9jbGllbnRfIDw8IGhzX2xhbmd1YWdlX3ByYWdtYSgpIDw8IGVuZGw7CisgIGZfY2xpZW50XyA8PCBoc19hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsOworCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHBvcnRzID0gIiI7CisKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZXhwb3J0cyArPSAoZmlyc3QgPyAiIiA6ICIsIik7CisgICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgICAgZXhwb3J0cyArPSBkZWNhcGl0YWxpemUoZnVubmFtZSk7CisgICAgZmlyc3QgPSBmYWxzZTsKKyAgfQorCisgIHN0cmluZyBzbmFtZSA9IGNhcGl0YWxpemUoc2VydmljZV9uYW1lXyk7CisgIGluZGVudChmX2NsaWVudF8pIDw8ICJtb2R1bGUgIiA8PCBzbmFtZSA8PCAiX0NsaWVudCgiIDw8IGV4cG9ydHMgPDwgIikgd2hlcmUiIDw8IGVuZGw7CisKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAiaW1wb3J0ICIgPDwgZXh0ZW5kcyA8PCAiX0NsaWVudCIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudChmX2NsaWVudF8pIDw8ICJpbXBvcnQgcXVhbGlmaWVkIERhdGEuSU9SZWYgYXMgUiIgPDwgZW5kbDsKKyAgaW5kZW50KGZfY2xpZW50XykgPDwgaHNfaW1wb3J0cygpIDw8IGVuZGw7CisgIGluZGVudChmX2NsaWVudF8pIDw8ICJpbXBvcnQgIiA8PCBjYXBpdGFsaXplKHByb2dyYW1fbmFtZV8pIDw8ICJfVHlwZXMiIDw8IGVuZGw7CisgIGluZGVudChmX2NsaWVudF8pIDw8ICJpbXBvcnQgIiA8PCBjYXBpdGFsaXplKHNlcnZpY2VfbmFtZV8pIDw8IGVuZGw7CisKKyAgLy8gREFUUyBSSVRFIEEgR0xPQkFMIFZBUgorICBpbmRlbnQoZl9jbGllbnRfKSA8PCAic2VxaWQgPSBSLm5ld0lPUmVmIDAiIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOworICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworCisgICAgc3RyaW5nIGZhcmdzID0gIiI7CisgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpCisgICAgICBmYXJncyArPSAiIGFyZ18iICsgKCpmbGRfaXRlciktPmdldF9uYW1lKCk7CisKKyAgICAvLyBPcGVuIGZ1bmN0aW9uCisgICAgaW5kZW50KGZfY2xpZW50XykgPDwgZGVjYXBpdGFsaXplKGZ1bm5hbWUpIDw8ICIgKGlwLG9wKSIgPDwgZmFyZ3MgPDwgIiA9IGRvIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChmX2NsaWVudF8pIDw8ICJzZW5kXyIgPDwgZnVubmFtZSA8PCAiIG9wIiA8PCBmYXJnczsKKworICAgIGZfY2xpZW50XyA8PCBlbmRsOworCisgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKQorICAgICAgaW5kZW50KGZfY2xpZW50XykgPDwgInJlY3ZfIiA8PCBmdW5uYW1lIDw8ICIgaXAiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfZG93bigpOworCisgICAgaW5kZW50KGZfY2xpZW50XykgPDwgInNlbmRfIiA8PCBmdW5uYW1lIDw8ICIgb3AiIDw8IGZhcmdzIDw8ICIgPSBkbyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGluZGVudChmX2NsaWVudF8pIDw8ICJzZXEgPC0gc2VxaWQiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfY2xpZW50XykgPDwgInNlcW4gPC0gUi5yZWFkSU9SZWYgc2VxIiA8PCBlbmRsOworICAgIHN0cmluZyBhcmdzbmFtZSA9IGNhcGl0YWxpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9hcmdzIik7CisKKyAgICAvLyBTZXJpYWxpemUgdGhlIHJlcXVlc3QgaGVhZGVyCisgICAgc3RyaW5nIGZuYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIHN0cmluZyBtc2dUeXBlID0gKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSA/ICJULk1fT05FV0FZIiA6ICJULk1fQ0FMTCI7CisgICAgaW5kZW50KGZfY2xpZW50XykgPDwgIlQud3JpdGVNZXNzYWdlIG9wIChcIiIgPDwgZm5hbWUgPDwgIlwiLCAiIDw8IG1zZ1R5cGUgPDwgIiwgc2VxbikgJCIKKyAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChmX2NsaWVudF8pIDw8ICJ3cml0ZV8iIDw8IGFyZ3NuYW1lIDw8ICIgb3AgKCIgPDwgYXJnc25hbWUgPDwgInsiOworCisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yICh2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7CisgICAgICAgICArK2ZsZF9pdGVyKSB7CisgICAgICBzdHJpbmcgZmllbGRuYW1lID0gKCpmbGRfaXRlciktPmdldF9uYW1lKCk7CisgICAgICBmX2NsaWVudF8gPDwgKGZpcnN0ID8gIiIgOiAiLCIpOworICAgICAgZl9jbGllbnRfIDw8IGZpZWxkX25hbWUoYXJnc25hbWUsIGZpZWxkbmFtZSkgPDwgIj0iOworICAgICAgaWYgKCgqZmxkX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTAorICAgICAgICAgIHx8ICgodF90eXBlKikoKmZsZF9pdGVyKS0+Z2V0X3R5cGUoKSktPmlzX3hjZXB0aW9uKCkpCisgICAgICAgIGZfY2xpZW50XyA8PCAiUC5KdXN0ICI7CisgICAgICBmX2NsaWVudF8gPDwgImFyZ18iIDw8IGZpZWxkbmFtZTsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfQorICAgIGZfY2xpZW50XyA8PCAifSkiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnRfZG93bigpOworCisgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBzdHJpbmcgcmVzdWx0bmFtZSA9IGNhcGl0YWxpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKKyAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7CisKKyAgICAgIHN0cmluZyBmdW5uYW1lID0gc3RyaW5nKCJyZWN2XyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgdF9mdW5jdGlvbiByZWN2X2Z1bmN0aW9uKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwgZnVubmFtZSwgJm5vYXJncyk7CisKKyAgICAgIC8vIE9wZW4gZnVuY3Rpb24KKyAgICAgIGluZGVudChmX2NsaWVudF8pIDw8IGZ1bm5hbWUgPDwgIiBpcCA9IGRvIiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgIGluZGVudChmX2NsaWVudF8pIDw8ICJULnJlYWRNZXNzYWdlIGlwICQgXFwoZm5hbWUsIG10eXBlLCByc2VxaWQpIC0+IGRvIiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAiTS53aGVuIChtdHlwZSA9PSBULk1fRVhDRVBUSU9OKSAkIGRvIHsgZXhuIDwtIFQucmVhZEFwcEV4biBpcCA7ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJYLnRocm93IGV4biB9IiA8PCBlbmRsOworCisgICAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAicmVzIDwtIHJlYWRfIiA8PCByZXN1bHRuYW1lIDw8ICIgaXAiIDw8IGVuZGw7CisKKyAgICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOworICAgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisKKyAgICAgIGZvciAodmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7CisgICAgICAgICAgICsreF9pdGVyKSB7CisgICAgICAgIGluZGVudChmX2NsaWVudF8pIDw8ICJQLm1heWJlIChQLnJldHVybiAoKSkgWC50aHJvdyAoIgorICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBmaWVsZF9uYW1lKHJlc3VsdG5hbWUsICgqeF9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiByZXMpIiA8PCBlbmRsOworICAgICAgfQorCisgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKQorICAgICAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAiUC5yZXR1cm4gJCAiIDw8IGZpZWxkX25hbWUocmVzdWx0bmFtZSwgInN1Y2Nlc3MiKSA8PCAiIHJlcyIgPDwgZW5kbDsKKyAgICAgIGVsc2UKKyAgICAgICAgaW5kZW50KGZfY2xpZW50XykgPDwgIlAucmV0dXJuICgpIiA8PCBlbmRsOworCisgICAgICAvLyBDbG9zZSBmdW5jdGlvbgorICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgfQorICB9CisKKyAgZl9jbGllbnRfLmNsb3NlKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgorICovCit2b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIC8vIEdlbmVyYXRlIHRoZSBkaXNwYXRjaCBtZXRob2RzCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworCisgIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzIHN1YmZ1bmN0aW9ucworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikKKyAgICBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRzZXJ2aWNlLCAqZl9pdGVyKTsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInByb2NfIGhhbmRsZXIgKGlwcm90LG9wcm90KSAobmFtZSx0eXAsc2VxaWQpID0gY2FzZSBuYW1lIG9mIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHN0cmluZyBmbmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlwiIiA8PCBmbmFtZSA8PCAiXCIgLT4gcHJvY2Vzc18iIDw8IGRlY2FwaXRhbGl6ZShmbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIiAoc2VxaWQsaXByb3Qsb3Byb3QsaGFuZGxlcikiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIl8gLT4gIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBmX3NlcnZpY2VfIDw8IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSkKKyAgICAgICAgICAgICAgIDw8ICIucHJvY18gaGFuZGxlciAoaXByb3Qsb3Byb3QpIChuYW1lLHR5cCxzZXFpZCkiIDw8IGVuZGw7CisKKyAgfSBlbHNlIHsKKyAgICBmX3NlcnZpY2VfIDw8ICJkbyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIl8gPC0gVC5yZWFkVmFsIGlwcm90IChULlRfU1RSVUNUIE1hcC5lbXB0eSkiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJULndyaXRlTWVzc2FnZSBvcHJvdCAobmFtZSxULk1fRVhDRVBUSU9OLHNlcWlkKSAkIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiVC53cml0ZUFwcEV4biBvcHJvdCAoVC5BcHBFeG4gVC5BRV9VTktOT1dOX01FVEhPRCAoXCJVbmtub3duIGZ1bmN0aW9uICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiICsrIExULnVucGFjayBuYW1lKSkiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKworICAvLyBHZW5lcmF0ZSB0aGUgc2VydmVyIGltcGxlbWVudGF0aW9uCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJvY2VzcyBoYW5kbGVyIChpcHJvdCwgb3Byb3QpID0gZG8iIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiVC5yZWFkTWVzc2FnZSBpcHJvdCAoIiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgcHJvY18gaGFuZGxlciAoaXByb3Qsb3Byb3QpKSIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJQLnJldHVybiBQLlRydWUiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7Cit9CisKK2Jvb2wgaGFzTm9Bcmd1bWVudHModF9mdW5jdGlvbiogZnVuYykgeworICByZXR1cm4gKGZ1bmMtPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCkuZW1wdHkoKSk7Cit9CisKK3N0cmluZyB0X2hzX2dlbmVyYXRvcjo6cmVuZGVyX2hzX3R5cGVfZm9yX2Z1bmN0aW9uX25hbWUodF90eXBlKiB0eXBlKSB7CisgIHN0cmluZyB0eXBlX3N0ciA9IHJlbmRlcl9oc190eXBlKHR5cGUsIGZhbHNlKTsKKyAgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBmb3VuZCA9IC0xOworCisgIHdoaWxlICh0cnVlKSB7CisgICAgZm91bmQgPSB0eXBlX3N0ci5maW5kX2ZpcnN0X29mKCJbXS4gIiwgZm91bmQgKyAxKTsKKyAgICBpZiAoc3RyaW5nOjpucG9zID09IHNpemVfdChmb3VuZCkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICh0eXBlX3N0cltmb3VuZF0gPT0gJy4nKQorICAgICAgdHlwZV9zdHJbZm91bmRdID0gJ18nOworICAgIGVsc2UKKyAgICAgIHR5cGVfc3RyW2ZvdW5kXSA9ICdaJzsKKyAgfQorICByZXR1cm4gdHlwZV9zdHI7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgcHJvY2VzcyBmdW5jdGlvbiBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHdyaXRlIGEgZGlzcGF0Y2hlciBmb3IKKyAqLwordm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgKHZvaWQpdHNlcnZpY2U7CisgIC8vIE9wZW4gZnVuY3Rpb24KKyAgc3RyaW5nIGZ1bm5hbWUgPSBkZWNhcGl0YWxpemUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwcm9jZXNzXyIgPDwgZnVubmFtZSA8PCAiIChzZXFpZCwgaXByb3QsIG9wcm90LCBoYW5kbGVyKSA9IGRvIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBzdHJpbmcgYXJnc25hbWUgPSBjYXBpdGFsaXplKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgKyAiX2FyZ3MiOworICBzdHJpbmcgcmVzdWx0bmFtZSA9IGNhcGl0YWxpemUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSArICJfcmVzdWx0IjsKKworICAvLyBHZW5lcmF0ZSB0aGUgZnVuY3Rpb24gY2FsbAorICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiYXJncyA8LSByZWFkXyIgPDwgYXJnc25hbWUgPDwgIiBpcHJvdCIgPDwgZW5kbDsKKworICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKworICBzaXplX3QgbiA9IHhjZXB0aW9ucy5zaXplKCkgKyAxOworICAvLyBUcnkgYmxvY2sgZm9yIGEgZnVuY3Rpb24gd2l0aCBleGNlcHRpb25zCisgIGlmIChuID4gMCkgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIihYLmNhdGNoIiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorICB9CisKKyAgaWYgKG4gPiAwKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIoZG8iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgIH0KKyAgaW5kZW50KGZfc2VydmljZV8pOworCisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpCisgICAgZl9zZXJ2aWNlXyA8PCAidmFsIDwtICI7CisKKyAgZl9zZXJ2aWNlXyA8PCAiSWZhY2UuIiA8PCBkZWNhcGl0YWxpemUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSA8PCAiIGhhbmRsZXIiOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikKKyAgICBmX3NlcnZpY2VfIDw8ICIgKCIgPDwgZmllbGRfbmFtZShhcmdzbmFtZSwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiIGFyZ3MpIjsKKworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAibGV0IHJlcyA9IGRlZmF1bHRfIiA8PCByZXN1bHRuYW1lIDw8ICJ7IgorICAgICAgICAgICAgICAgICAgICAgICA8PCBmaWVsZF9uYW1lKHJlc3VsdG5hbWUsICJzdWNjZXNzIikgPDwgIiA9IHZhbH0iOworCisgIH0gZWxzZSBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJsZXQgcmVzID0gZGVmYXVsdF8iIDw8IHJlc3VsdG5hbWU7CisgIH0KKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIC8vIFNob3J0Y3V0IG91dCBoZXJlIGZvciBvbmV3YXkgZnVuY3Rpb25zCisgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJQLnJldHVybiAoKSI7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJULndyaXRlTWVzc2FnZSBvcHJvdCAoXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICA8PCAiXCIsIFQuTV9SRVBMWSwgc2VxaWQpICQiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ3cml0ZV8iIDw8IHJlc3VsdG5hbWUgPDwgIiBvcHJvdCByZXMiOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKyAgaWYgKG4gPiAwKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAiKSI7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgaWYgKG4gPiAwKSB7CisgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiKFxcZSAgLT4gZG8iIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKworICAgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAibGV0IHJlcyA9IGRlZmF1bHRfIiA8PCByZXN1bHRuYW1lIDw8ICJ7IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZmllbGRfbmFtZShyZXN1bHRuYW1lLCAoKnhfaXRlciktPmdldF9uYW1lKCkpIDw8ICIgPSBQLkp1c3QgZX0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlQud3JpdGVNZXNzYWdlIG9wcm90IChcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiXCIsIFQuTV9SRVBMWSwgc2VxaWQpICQiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIndyaXRlXyIgPDwgcmVzdWx0bmFtZSA8PCAiIG9wcm90IHJlcyI7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlAucmV0dXJuICgpIjsKKyAgICAgIH0KKworICAgICAgZl9zZXJ2aWNlXyA8PCAiKSkiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICB9CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIoKFxcXyAtPiBkbyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJULndyaXRlTWVzc2FnZSBvcHJvdCAoXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcIiwgVC5NX0VYQ0VQVElPTiwgc2VxaWQpICQiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiVC53cml0ZUFwcEV4biBvcHJvdCAoVC5BcHBFeG4gVC5BRV9VTktOT1dOIFwiXCIpIjsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiUC5yZXR1cm4gKCkiOworICAgIH0KKworICAgIGZfc2VydmljZV8gPDwgIikgOjogWC5Tb21lRXhjZXB0aW9uIC0+IFAuSU8gKCkpKSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKyAgLy8gQ2xvc2UgZnVuY3Rpb24KKyAgaW5kZW50X2Rvd24oKTsKK30KKworLyoqCisgKiBEZXNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KKyAqLwordm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBwcmVmaXgpIHsKKyAgKHZvaWQpcHJlZml4OworICB0X3R5cGUqIHR5cGUgPSB0ZmllbGQtPmdldF90eXBlKCk7CisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3R5cGUob3V0LCB0eXBlLCBwcmVmaXgpOworfQorCisvKioKKyAqIERlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgorICovCit2b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV90eXBlKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlLCBzdHJpbmcgYXJnKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworICBzdHJpbmcgdmFsID0gdG1wKCJfdmFsIik7CisgIG91dCA8PCAiKGNhc2UgIiA8PCBhcmcgPDwgIiBvZiB7IiA8PCB0eXBlX3RvX2NvbnN0cnVjdG9yKHR5cGUpIDw8ICIgIiA8PCB2YWwgPDwgIiAtPiAiOworCisgIGlmICh0eXBlLT5pc192b2lkKCkpCisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEUiOworCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCB2YWwpOworCisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCB2YWwpOworCisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgaWYgKHRiYXNlID09IHRfYmFzZV90eXBlOjpUWVBFX1NUUklORyAmJiAhdHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgIG91dCA8PCAiRS5kZWNvZGVVdGY4ICI7CisgICAgfQorICAgIG91dCA8PCB2YWw7CisgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAvLyBTaW5jZSB3aXJlIHR5cGUgb2YgYmluYXJ5IGlzIHRoZSBzYW1lIGFzIHN0cmluZywgd2UgYWN0dWFsbHkgcmVjZWl2ZSBULlRTdHJpbmcgbm90CisgICAgICAvLyBULlRCaW5hcnkKKyAgICAgIG91dCA8PCAiOyBULlRTdHJpbmcgIiA8PCB2YWwgPDwgIiAtPiAiIDw8IHZhbDsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgb3V0IDw8ICJQLnRvRW51bSAkIFAuZnJvbUludGVncmFsICIgPDwgdmFsOworCisgIH0gZWxzZSB7CisgICAgdGhyb3cgIkRPIE5PVCBLTk9XIEhPVyBUTyBERVNFUklBTElaRSBUWVBFICIgKyB0eXBlLT5nZXRfbmFtZSgpOworICB9CisgIG91dCA8PCAiOyBfIC0+IFAuZXJyb3IgXCJ3cm9uZyB0eXBlXCJ9KSI7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGFuIHVuc2VyaWFsaXplciBmb3IgYSBzdHJ1Y3QsIGNhbGxpbmcgcmVhZCgpCisgKi8KK3ZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgbmFtZSkgeworCisgIG91dCA8PCAiKCIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QsICJ0b18iKSA8PCAiIChULlRTdHJ1Y3QgIiA8PCBuYW1lIDw8ICIpKSI7Cit9CisKKy8qKgorICogU2VyaWFsaXplIGEgY29udGFpbmVyIGJ5IHdyaXRpbmcgb3V0IHRoZSBoZWFkZXIgZm9sbG93ZWQgYnkKKyAqIGRhdGEgYW5kIHRoZW4gYSBmb290ZXIuCisgKi8KK3ZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBhcmcpIHsKKworICBzdHJpbmcgdmFsID0gdG1wKCJfdiIpOworICAvLyBEZWNsYXJlIHZhcmlhYmxlcywgcmVhZCBoZWFkZXIKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHN0cmluZyBrZXkgPSB0bXAoIl9rIik7CisgICAgb3V0IDw8ICIoTWFwLmZyb21MaXN0ICQgUC5tYXAgKFxcKCIgPDwga2V5IDw8ICIsIiA8PCB2YWwgPDwgIikgLT4gKCI7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfdHlwZShvdXQsICgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCksIGtleSk7CisKKyAgICBvdXQgPDwgIiwiOworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3R5cGUob3V0LCAoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpLCB2YWwpOworCisgICAgb3V0IDw8ICIpKSAiIDw8IGFyZyA8PCAiKSI7CisKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBvdXQgPDwgIihTZXQuZnJvbUxpc3QgJCBQLm1hcCAoXFwiIDw8IHZhbCA8PCAiIC0+ICI7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfdHlwZShvdXQsICgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpLCB2YWwpOworICAgIG91dCA8PCAiKSAiIDw8IGFyZyA8PCAiKSI7CisKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgb3V0IDw8ICIoVmVjdG9yLmZyb21MaXN0ICQgUC5tYXAgKFxcIiA8PCB2YWwgPDwgIiAtPiAiOworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3R5cGUob3V0LCAoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCksIHZhbCk7CisgICAgb3V0IDw8ICIpICIgPDwgYXJnIDw8ICIpIjsKKyAgfQorfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KKyAqCisgKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCB0byBzZXJpYWxpemUKKyAqIEBwYXJhbSBwcmVmaXggTmFtZSB0byBwcmVwZW5kIHRvIGZpZWxkIG5hbWUKKyAqLwordm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3R5cGUob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUsIHN0cmluZyBuYW1lKSB7CisKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisgIC8vIERvIG5vdGhpbmcgZm9yIHZvaWQgdHlwZXMKKyAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIFNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEUiOworCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbmFtZSk7CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lKTsKKworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgeworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgb3V0IDw8IHR5cGVfdG9fY29uc3RydWN0b3IodHlwZSkgPDwgIiAiOworICAgICAgaWYgKHRiYXNlID09IHRfYmFzZV90eXBlOjpUWVBFX1NUUklORyAmJiAhdHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgb3V0IDw8ICIkIEUuZW5jb2RlVXRmOCAiOworICAgICAgfQorICAgICAgb3V0IDw8IG5hbWU7CisKKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgc3RyaW5nIGVuYW1lID0gY2FwaXRhbGl6ZSh0eXBlLT5nZXRfbmFtZSgpKTsKKyAgICAgIG91dCA8PCAiVC5USTMyICQgUC5mcm9tSW50ZWdyYWwgJCBQLmZyb21FbnVtICIgPDwgbmFtZTsKKyAgICB9CisKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyAiRE8gTk9UIEtOT1cgSE9XIFRPIFNFUklBTElaRSBGSUVMRCBPRiBUWVBFICIgKyB0eXBlLT5nZXRfbmFtZSgpOworICB9Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhbGwgdGhlIG1lbWJlcnMgb2YgYSBzdHJ1Y3QuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCB0byBzZXJpYWxpemUKKyAqIEBwYXJhbSBwcmVmaXggIFN0cmluZyBwcmVmaXggdG8gYXR0YWNoIHRvIGFsbCBmaWVsZHMKKyAqLwordm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4KSB7CisgIG91dCA8PCB0eXBlX25hbWUodHN0cnVjdCwgImZyb21fIikgPDwgIiAiIDw8IHByZWZpeDsKK30KKwordm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIGsgPSB0bXAoIl9rIik7CisgIHN0cmluZyB2ID0gdG1wKCJfdiIpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICBvdXQgPDwgIlQuVE1hcCAiIDw8IHR5cGVfdG9fZW51bShrdHlwZSkgPDwgIiAiIDw8IHR5cGVfdG9fZW51bSh2dHlwZSk7CisgICAgb3V0IDw8ICIgJCBQLm1hcCAoXFwoIiA8PCBrIDw8ICIsIiA8PCB2IDw8ICIpIC0+ICgiOworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV90eXBlKG91dCwga3R5cGUsIGspOworICAgIG91dCA8PCAiLCAiOworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV90eXBlKG91dCwgdnR5cGUsIHYpOworICAgIG91dCA8PCAiKSkgJCBNYXAudG9MaXN0ICIgPDwgcHJlZml4OworCisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgb3V0IDw8ICJULlRTZXQgIiA8PCB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpOworICAgIG91dCA8PCAiICQgUC5tYXAgKFxcIiA8PCB2IDw8ICIgLT4gIjsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfdHlwZShvdXQsICgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpLCB2KTsKKyAgICBvdXQgPDwgIikgJCBTZXQudG9MaXN0ICIgPDwgcHJlZml4OworCisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIG91dCA8PCAiVC5UTGlzdCAiIDw8IHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpOworICAgIG91dCA8PCAiICQgUC5tYXAgKFxcIiA8PCB2IDw8ICIgLT4gIjsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfdHlwZShvdXQsICgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSwgdik7CisgICAgb3V0IDw8ICIpICQgVmVjdG9yLnRvTGlzdCAiIDw8IHByZWZpeDsKKyAgfQorfQorCitzdHJpbmcgdF9oc19nZW5lcmF0b3I6OmZ1bmN0aW9uX3R5cGUodF9mdW5jdGlvbiogdGZ1bmMsIGJvb2wgb3B0aW9ucywgYm9vbCBpbywgYm9vbCBtZXRob2QpIHsKKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRmdW5jLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOworICBmb3IgKHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMCisgICAgICAgIHx8ICgodF90eXBlKikoKmZfaXRlciktPmdldF90eXBlKCkpLT5pc194Y2VwdGlvbigpKQorICAgICAgcmVzdWx0ICs9ICJQLk1heWJlICI7CisgICAgcmVzdWx0ICs9IHJlbmRlcl9oc190eXBlKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSwgb3B0aW9ucyk7CisgICAgcmVzdWx0ICs9ICIgLT4gIjsKKyAgfQorCisgIGlmIChmaWVsZHMuZW1wdHkoKSAmJiAhbWV0aG9kKQorICAgIHJlc3VsdCArPSAiKCkgLT4gIjsKKworICBpZiAoaW8pCisgICAgcmVzdWx0ICs9ICJQLklPICI7CisKKyAgcmVzdWx0ICs9IHJlbmRlcl9oc190eXBlKHRmdW5jLT5nZXRfcmV0dXJudHlwZSgpLCBpbyk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0cmluZyB0X2hzX2dlbmVyYXRvcjo6dHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsIHN0cmluZyBmdW5jdGlvbl9wcmVmaXgpIHsKKyAgc3RyaW5nIHByZWZpeCA9ICIiOworICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKTsKKworICBpZiAocHJvZ3JhbSAhPSBOVUxMICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pCisgICAgaWYgKCF0dHlwZS0+aXNfc2VydmljZSgpKQorICAgICAgcHJlZml4ID0gY2FwaXRhbGl6ZShwcm9ncmFtLT5nZXRfbmFtZSgpKSArICJfVHlwZXMuIjsKKworICByZXR1cm4gcHJlZml4ICsgZnVuY3Rpb25fcHJlZml4ICsgY2FwaXRhbGl6ZSh0dHlwZS0+Z2V0X25hbWUoKSk7Cit9CisKK3N0cmluZyB0X2hzX2dlbmVyYXRvcjo6ZmllbGRfbmFtZShzdHJpbmcgdG5hbWUsIHN0cmluZyBmbmFtZSkgeworICByZXR1cm4gZGVjYXBpdGFsaXplKHRuYW1lKSArICJfIiArIGZuYW1lOworfQorCisvKioKKyAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgUHJvdG9jb2wudF90eXBlIGVudW0KKyAqLworc3RyaW5nIHRfaHNfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgcmV0dXJuICJULlRfVk9JRCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gdHlwZS0+aXNfYmluYXJ5KCkgPyAiVC5UX0JJTkFSWSIgOiAiVC5UX1NUUklORyI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICJULlRfQk9PTCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiVC5UX0JZVEUiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmV0dXJuICJULlRfSTE2IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAiVC5UX0kzMiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIlQuVF9JNjQiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICJULlRfRE9VQkxFIjsKKyAgICB9CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gIlQuVF9JMzIiOworCisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiAiKFQuVF9TVFJVQ1QgIiArIHR5cGVfbmFtZSgodF9zdHJ1Y3QqKXR5cGUsICJ0eXBlbWFwXyIpICsgIikiOworCisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICBzdHJpbmcga3R5cGUgPSB0eXBlX3RvX2VudW0oKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpKTsKKyAgICBzdHJpbmcgdnR5cGUgPSB0eXBlX3RvX2VudW0oKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpKTsKKyAgICByZXR1cm4gIihULlRfTUFQICIgKyBrdHlwZSArICIgIiArIHZ0eXBlICsgIikiOworCisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIihULlRfU0VUICIgKyB0eXBlX3RvX2VudW0oKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKSkgKyAiKSI7CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gIihULlRfTElTVCAiICsgdHlwZV90b19lbnVtKCgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSArICIpIjsKKyAgfQorCisgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKworLyoqCisgKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhIGRlZmF1bHQgdmFsdWUKKyAqLworc3RyaW5nIHRfaHNfZ2VuZXJhdG9yOjp0eXBlX3RvX2RlZmF1bHQodF90eXBlKiB0eXBlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgcmV0dXJuICJQLmVycm9yIFwiTm8gZGVmYXVsdCB2YWx1ZSBmb3IgdHlwZSBUX1ZPSURcIiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gIlwiXCIiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiUC5GYWxzZSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiMCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gIjAiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmV0dXJuICIwIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiMCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIjAiOworICAgIH0KKworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiKFAudG9FbnVtIDApIjsKKworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gdHlwZV9uYW1lKCh0X3N0cnVjdCopdHlwZSwgImRlZmF1bHRfIik7CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAiTWFwLmVtcHR5IjsKKworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICJTZXQuZW1wdHkiOworCisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJWZWN0b3IuZW1wdHkiOworICB9CisKKyAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2RlZmF1bHQ6ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworfQorCisvKioKKyAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGFuIGhhc2tlbGwgdHlwZQorICovCitzdHJpbmcgdF9oc19nZW5lcmF0b3I6OnJlbmRlcl9oc190eXBlKHRfdHlwZSogdHlwZSwgYm9vbCBuZWVkc19wYXJlbnMpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisgIHN0cmluZyB0eXBlX3JlcHI7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICByZXR1cm4gIigpIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAodHlwZS0+aXNfYmluYXJ5KCkgPyAiTEJTLkJ5dGVTdHJpbmciIDogIkxULlRleHQiKTsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gIlAuQm9vbCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiSS5JbnQ4IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAiSS5JbnQxNiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gIkkuSW50MzIiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICJJLkludDY0IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiUC5Eb3VibGUiOworICAgIH0KKworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiB0eXBlX25hbWUoKHRfZW51bSopdHlwZSk7CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuIHR5cGVfbmFtZSgodF9zdHJ1Y3QqKXR5cGUpOworCisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisgICAgdHlwZV9yZXByID0gIk1hcC5IYXNoTWFwICIgKyByZW5kZXJfaHNfdHlwZShrdHlwZSwgdHJ1ZSkgKyAiICIgKyByZW5kZXJfaHNfdHlwZSh2dHlwZSwgdHJ1ZSk7CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIHR5cGVfcmVwciA9ICJTZXQuSGFzaFNldCAiICsgcmVuZGVyX2hzX3R5cGUoZXR5cGUsIHRydWUpOworCisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgdF90eXBlKiBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIHR5cGVfcmVwciA9ICJWZWN0b3IuVmVjdG9yICIgKyByZW5kZXJfaHNfdHlwZShldHlwZSwgdHJ1ZSk7CisKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7CisgIH0KKworICByZXR1cm4gbmVlZHNfcGFyZW5zID8gIigiICsgdHlwZV9yZXByICsgIikiIDogdHlwZV9yZXByOworfQorCisvKioKKyAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgaGFza2VsbCBjb25zdHJ1Y3RvcgorICovCitzdHJpbmcgdF9oc19nZW5lcmF0b3I6OnR5cGVfdG9fY29uc3RydWN0b3IodF90eXBlKiB0eXBlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgImludmFsaWQgdHlwZTogVF9WT0lEIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiB0eXBlLT5pc19iaW5hcnkoKSA/ICJULlRCaW5hcnkiIDogIlQuVFN0cmluZyI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICJULlRCb29sIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmV0dXJuICJULlRCeXRlIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAiVC5USTE2IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAiVC5USTMyIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiVC5USTY0IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiVC5URG91YmxlIjsKKyAgICB9CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gIlQuVEkzMiI7CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICJULlRTdHJ1Y3QiOworCisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gIlQuVE1hcCBfIF8iOworCisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIlQuVFNldCBfIjsKKworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAiVC5UTGlzdCBfIjsKKyAgfQorICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Cit9CisKK1RIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoaHMsICJIYXNrZWxsIiwgIiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2h0bWxfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9odG1sX2dlbmVyYXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGZhMzg5Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9odG1sX2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDEwODggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxtYXA+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSAidGhyaWZ0L3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3RfaHRtbF9nZW5lcmF0b3IuaCIKKwordXNpbmcgc3RkOjptYXA7Cit1c2luZyBzdGQ6Om9mc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjpwYWlyOwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6dmVjdG9yOworCitzdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCisKK2VudW0gaW5wdXRfdHlwZSB7IElOUFVUX1VOS05PV04sIElOUFVUX1VURjgsIElOUFVUX1BMQUlOIH07CisKKy8qKgorICogSFRNTCBjb2RlIGdlbmVyYXRvcgorICoKKyAqIG1vc3RseSBjb3B5L3Bhc3RpbmcvdHdlYWtpbmcgZnJvbSBtY3NsZWUncyB3b3JrLgorICovCitjbGFzcyB0X2h0bWxfZ2VuZXJhdG9yIDogcHVibGljIHRfZ2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgdF9odG1sX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCisgICAgOiB0X2dlbmVyYXRvcihwcm9ncmFtKSB7CisgICAgKHZvaWQpb3B0aW9uX3N0cmluZzsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworCisgICAgc3RhbmRhbG9uZV8gPSBmYWxzZTsKKyAgICB1bnNhZmVfID0gZmFsc2U7CisgICAgZm9yKCBpdGVyID0gcGFyc2VkX29wdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKTsgKytpdGVyKSB7CisgICAgICBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgic3RhbmRhbG9uZSIpID09IDApIHsKKyAgICAgICAgc3RhbmRhbG9uZV8gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJub2VzY2FwZSIpID09IDApIHsKKyAgICAgICAgdW5zYWZlXyA9IHRydWU7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24gaHRtbDoiICsgaXRlci0+Zmlyc3Q7CisgICAgICB9CisgICAgfQorCisKKyAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1odG1sIjsKKyAgICBpbnB1dF90eXBlXyA9IElOUFVUX1VOS05PV047CisKKyAgICBlc2NhcGVfLmNsZWFyKCk7CisgICAgZXNjYXBlX1snJiddID0gIiZhbXA7IjsKKyAgICBlc2NhcGVfWyc8J10gPSAiJmx0OyI7CisgICAgZXNjYXBlX1snPiddID0gIiZndDsiOworICAgIGVzY2FwZV9bJyInXSA9ICImcXVvdDsiOworICAgIGVzY2FwZV9bJ1wnJ10gPSAiJmFwb3M7IjsKKworICAgIGluaXRfYWxsb3dlZF9fbWFya3VwKCk7CisgIH0KKworICB2b2lkIGdlbmVyYXRlX3Byb2dyYW0oKTsKKyAgdm9pZCBnZW5lcmF0ZV9wcm9ncmFtX3RvYygpOworICB2b2lkIGdlbmVyYXRlX3Byb2dyYW1fdG9jX3Jvdyh0X3Byb2dyYW0qIHRwcm9nKTsKKyAgdm9pZCBnZW5lcmF0ZV9wcm9ncmFtX3RvY19yb3dzKHRfcHJvZ3JhbSogdHByb2csIHN0ZDo6dmVjdG9yPHRfcHJvZ3JhbSo+JiBmaW5pc2hlZCk7CisgIHZvaWQgZ2VuZXJhdGVfaW5kZXgoKTsKKyAgc3RkOjpzdHJpbmcgZXNjYXBlX2h0bWwoc3RkOjpzdHJpbmcgY29uc3QmIHN0cik7CisgIHN0ZDo6c3RyaW5nIGVzY2FwZV9odG1sX3RhZ3Moc3RkOjpzdHJpbmcgY29uc3QmIHN0cik7CisgIHZvaWQgZ2VuZXJhdGVfY3NzKCk7CisgIHZvaWQgZ2VuZXJhdGVfY3NzX2NvbnRlbnQoc3RkOjpvc3RyZWFtJiBmX3RhcmdldCk7CisgIHZvaWQgZ2VuZXJhdGVfc3R5bGVfdGFnKCk7CisgIHN0ZDo6c3RyaW5nIG1ha2VfZmlsZV9saW5rKHN0ZDo6c3RyaW5nIG5hbWUpOworICBib29sIGlzX3V0Zjhfc2VxdWVuY2Uoc3RkOjpzdHJpbmcgY29uc3QmIHN0ciwgc2l6ZV90IGZpcnN0cG9zKTsKKyAgdm9pZCBkZXRlY3RfaW5wdXRfZW5jb2Rpbmcoc3RkOjpzdHJpbmcgY29uc3QmIHN0ciwgc2l6ZV90IGZpcnN0cG9zKTsKKyAgdm9pZCBpbml0X2FsbG93ZWRfX21hcmt1cCgpOworCisgIC8qKgorICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pOworICB2b2lkIGdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pOworCisgIHZvaWQgcHJpbnRfZG9jKHRfZG9jKiB0ZG9jKTsKKyAgaW50IHByaW50X3R5cGUodF90eXBlKiB0dHlwZSk7CisgIHZvaWQgcHJpbnRfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB0dmFsdWUpOworICB2b2lkIHByaW50X2ZuX2FyZ3NfZG9jKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisKK3ByaXZhdGU6CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9vdXRfOworICBzdGQ6OnN0cmluZyBjdXJyZW50X2ZpbGVfOworICBpbnB1dF90eXBlIGlucHV0X3R5cGVfOworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBhbGxvd2VkX21hcmt1cDsKKyAgYm9vbCBzdGFuZGFsb25lXzsKKyAgYm9vbCB1bnNhZmVfOworfTsKKworLyoqCisgKiBFbWl0cyB0aGUgVGFibGUgb2YgQ29udGVudHMgbGlua3MgYXQgdGhlIHRvcCBvZiB0aGUgbW9kdWxlJ3MgcGFnZQorICovCit2b2lkIHRfaHRtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2dyYW1fdG9jKCkgeworICBmX291dF8gPDwgIjx0YWJsZSBjbGFzcz1cInRhYmxlLWJvcmRlcmVkIHRhYmxlLXN0cmlwZWQgIgorICAgICAgICAgICAgInRhYmxlLWNvbmRlbnNlZFwiPjx0aGVhZD48dGg+TW9kdWxlPC90aD48dGg+U2VydmljZXM8L3RoPiIKKyAgICAgICAgIDw8ICI8dGg+RGF0YSB0eXBlczwvdGg+PHRoPkNvbnN0YW50czwvdGg+PC90aGVhZD4iIDw8IGVuZGw7CisgIGdlbmVyYXRlX3Byb2dyYW1fdG9jX3Jvdyhwcm9ncmFtXyk7CisgIGZfb3V0XyA8PCAiPC90YWJsZT4iIDw8IGVuZGw7Cit9CisKKy8qKgorICogUmVjdXJzZXMgdGhyb3VnaCBmcm9tIHRoZSBwcm92aWRlZCBwcm9ncmFtIGFuZCBnZW5lcmF0ZXMgYSBUb0Mgcm93CisgKiBmb3IgZWFjaCBkaXNjb3ZlcmVkIHByb2dyYW0gZXhhY3RseSBvbmNlIGJ5IG1haW50YWluaW5nIHRoZSBsaXN0IG9mCisgKiBjb21wbGV0ZWQgcm93cyBpbiAnZmluaXNoZWQnCisgKi8KK3ZvaWQgdF9odG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvZ3JhbV90b2Nfcm93cyh0X3Byb2dyYW0qIHRwcm9nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHRfcHJvZ3JhbSo+JiBmaW5pc2hlZCkgeworICBmb3IgKHZlY3Rvcjx0X3Byb2dyYW0qPjo6aXRlcmF0b3IgaXRlciA9IGZpbmlzaGVkLmJlZ2luKCk7IGl0ZXIgIT0gZmluaXNoZWQuZW5kKCk7IGl0ZXIrKykgeworICAgIGlmICh0cHJvZy0+Z2V0X3BhdGgoKSA9PSAoKml0ZXIpLT5nZXRfcGF0aCgpKSB7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisgIGZpbmlzaGVkLnB1c2hfYmFjayh0cHJvZyk7CisgIGdlbmVyYXRlX3Byb2dyYW1fdG9jX3Jvdyh0cHJvZyk7CisgIHZlY3Rvcjx0X3Byb2dyYW0qPiBpbmNsdWRlcyA9IHRwcm9nLT5nZXRfaW5jbHVkZXMoKTsKKyAgZm9yICh2ZWN0b3I8dF9wcm9ncmFtKj46Oml0ZXJhdG9yIGl0ZXIgPSBpbmNsdWRlcy5iZWdpbigpOyBpdGVyICE9IGluY2x1ZGVzLmVuZCgpOyBpdGVyKyspIHsKKyAgICBnZW5lcmF0ZV9wcm9ncmFtX3RvY19yb3dzKCppdGVyLCBmaW5pc2hlZCk7CisgIH0KK30KKworLyoqCisgKiBFbWl0cyB0aGUgVGFibGUgb2YgQ29udGVudHMgbGlua3MgYXQgdGhlIHRvcCBvZiB0aGUgbW9kdWxlJ3MgcGFnZQorICovCit2b2lkIHRfaHRtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2dyYW1fdG9jX3Jvdyh0X3Byb2dyYW0qIHRwcm9nKSB7CisgIHN0cmluZyBmbmFtZSA9IHRwcm9nLT5nZXRfbmFtZSgpICsgIi5odG1sIjsKKyAgZl9vdXRfIDw8ICI8dHI+IiA8PCBlbmRsIDw8ICI8dGQ+IiA8PCB0cHJvZy0+Z2V0X25hbWUoKSA8PCAiPC90ZD48dGQ+IjsKKyAgaWYgKCF0cHJvZy0+Z2V0X3NlcnZpY2VzKCkuZW1wdHkoKSkgeworICAgIHZlY3Rvcjx0X3NlcnZpY2UqPiBzZXJ2aWNlcyA9IHRwcm9nLT5nZXRfc2VydmljZXMoKTsKKyAgICB2ZWN0b3I8dF9zZXJ2aWNlKj46Oml0ZXJhdG9yIHN2X2l0ZXI7CisgICAgZm9yIChzdl9pdGVyID0gc2VydmljZXMuYmVnaW4oKTsgc3ZfaXRlciAhPSBzZXJ2aWNlcy5lbmQoKTsgKytzdl9pdGVyKSB7CisgICAgICBzdHJpbmcgbmFtZSA9IGdldF9zZXJ2aWNlX25hbWUoKnN2X2l0ZXIpOworICAgICAgZl9vdXRfIDw8ICI8YSBocmVmPVwiIiA8PCBtYWtlX2ZpbGVfbGluayhmbmFtZSkgPDwgIiNTdmNfIiA8PCBuYW1lIDw8ICJcIj4iIDw8IG5hbWUKKyAgICAgICAgICAgICA8PCAiPC9hPjxici8+IiA8PCBlbmRsOworICAgICAgZl9vdXRfIDw8ICI8dWw+IiA8PCBlbmRsOworICAgICAgbWFwPHN0cmluZywgc3RyaW5nPiBmbl9odG1sOworICAgICAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSAoKnN2X2l0ZXIpLT5nZXRfZnVuY3Rpb25zKCk7CisgICAgICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmbl9pdGVyOworICAgICAgZm9yIChmbl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZuX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZuX2l0ZXIpIHsKKyAgICAgICAgc3RyaW5nIGZuX25hbWUgPSAoKmZuX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgICBzdHJpbmcgaHRtbCA9ICI8bGk+PGEgaHJlZj1cIiIgKyBtYWtlX2ZpbGVfbGluayhmbmFtZSkgKyAiI0ZuXyIgKyBuYW1lICsgIl8iICsgZm5fbmFtZQorICAgICAgICAgICAgICAgICAgICAgICsgIlwiPiIgKyBmbl9uYW1lICsgIjwvYT48L2xpPiI7CisgICAgICAgIGZuX2h0bWwuaW5zZXJ0KHBhaXI8c3RyaW5nLCBzdHJpbmc+KGZuX25hbWUsIGh0bWwpKTsKKyAgICAgIH0KKyAgICAgIGZvciAobWFwPHN0cmluZywgc3RyaW5nPjo6aXRlcmF0b3IgaHRtbF9pdGVyID0gZm5faHRtbC5iZWdpbigpOyBodG1sX2l0ZXIgIT0gZm5faHRtbC5lbmQoKTsKKyAgICAgICAgICAgaHRtbF9pdGVyKyspIHsKKyAgICAgICAgZl9vdXRfIDw8IGh0bWxfaXRlci0+c2Vjb25kIDw8IGVuZGw7CisgICAgICB9CisgICAgICBmX291dF8gPDwgIjwvdWw+IiA8PCBlbmRsOworICAgIH0KKyAgfQorICBmX291dF8gPDwgIjwvdGQ+IiA8PCBlbmRsIDw8ICI8dGQ+IjsKKyAgbWFwPHN0cmluZywgc3RyaW5nPiBkYXRhX3R5cGVzOworICBpZiAoIXRwcm9nLT5nZXRfZW51bXMoKS5lbXB0eSgpKSB7CisgICAgdmVjdG9yPHRfZW51bSo+IGVudW1zID0gdHByb2ctPmdldF9lbnVtcygpOworICAgIHZlY3Rvcjx0X2VudW0qPjo6aXRlcmF0b3IgZW5faXRlcjsKKyAgICBmb3IgKGVuX2l0ZXIgPSBlbnVtcy5iZWdpbigpOyBlbl9pdGVyICE9IGVudW1zLmVuZCgpOyArK2VuX2l0ZXIpIHsKKyAgICAgIHN0cmluZyBuYW1lID0gKCplbl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgIC8vIGZfb3V0XyA8PCAiPGEgaHJlZj1cIiIgPDwgbWFrZV9maWxlX2xpbmsoZm5hbWUpIDw8ICIjRW51bV8iIDw8IG5hbWUgPDwgIlwiPiIgPDwgbmFtZQorICAgICAgLy8gPDwgICI8L2E+PGJyLz4iIDw8IGVuZGw7CisgICAgICBzdHJpbmcgaHRtbCA9ICI8YSBocmVmPVwiIiArIG1ha2VfZmlsZV9saW5rKGZuYW1lKSArICIjRW51bV8iICsgbmFtZSArICJcIj4iICsgbmFtZSArICI8L2E+IjsKKyAgICAgIGRhdGFfdHlwZXMuaW5zZXJ0KHBhaXI8c3RyaW5nLCBzdHJpbmc+KG5hbWUsIGh0bWwpKTsKKyAgICB9CisgIH0KKyAgaWYgKCF0cHJvZy0+Z2V0X3R5cGVkZWZzKCkuZW1wdHkoKSkgeworICAgIHZlY3Rvcjx0X3R5cGVkZWYqPiB0eXBlZGVmcyA9IHRwcm9nLT5nZXRfdHlwZWRlZnMoKTsKKyAgICB2ZWN0b3I8dF90eXBlZGVmKj46Oml0ZXJhdG9yIHRkX2l0ZXI7CisgICAgZm9yICh0ZF9pdGVyID0gdHlwZWRlZnMuYmVnaW4oKTsgdGRfaXRlciAhPSB0eXBlZGVmcy5lbmQoKTsgKyt0ZF9pdGVyKSB7CisgICAgICBzdHJpbmcgbmFtZSA9ICgqdGRfaXRlciktPmdldF9zeW1ib2xpYygpOworICAgICAgLy8gZl9vdXRfIDw8ICI8YSBocmVmPVwiIiA8PCBtYWtlX2ZpbGVfbGluayhmbmFtZSkgPDwgIiNUeXBlZGVmXyIgPDwgbmFtZSA8PCAiXCI+IiA8PCBuYW1lCisgICAgICAvLyA8PCAiPC9hPjxici8+IiA8PCBlbmRsOworICAgICAgc3RyaW5nIGh0bWwgPSAiPGEgaHJlZj1cIiIgKyBtYWtlX2ZpbGVfbGluayhmbmFtZSkgKyAiI1R5cGVkZWZfIiArIG5hbWUgKyAiXCI+IiArIG5hbWUKKyAgICAgICAgICAgICAgICAgICAgKyAiPC9hPiI7CisgICAgICBkYXRhX3R5cGVzLmluc2VydChwYWlyPHN0cmluZywgc3RyaW5nPihuYW1lLCBodG1sKSk7CisgICAgfQorICB9CisgIGlmICghdHByb2ctPmdldF9vYmplY3RzKCkuZW1wdHkoKSkgeworICAgIHZlY3Rvcjx0X3N0cnVjdCo+IG9iamVjdHMgPSB0cHJvZy0+Z2V0X29iamVjdHMoKTsKKyAgICB2ZWN0b3I8dF9zdHJ1Y3QqPjo6aXRlcmF0b3Igb19pdGVyOworICAgIGZvciAob19pdGVyID0gb2JqZWN0cy5iZWdpbigpOyBvX2l0ZXIgIT0gb2JqZWN0cy5lbmQoKTsgKytvX2l0ZXIpIHsKKyAgICAgIHN0cmluZyBuYW1lID0gKCpvX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgLy8gZl9vdXRfIDw8ICI8YSBocmVmPVwiIiA8PCBtYWtlX2ZpbGVfbGluayhmbmFtZSkgPDwgIiNTdHJ1Y3RfIiA8PCBuYW1lIDw8ICJcIj4iIDw8IG5hbWUKKyAgICAgIC8vPDwgIjwvYT48YnIvPiIgPDwgZW5kbDsKKyAgICAgIHN0cmluZyBodG1sID0gIjxhIGhyZWY9XCIiICsgbWFrZV9maWxlX2xpbmsoZm5hbWUpICsgIiNTdHJ1Y3RfIiArIG5hbWUgKyAiXCI+IiArIG5hbWUKKyAgICAgICAgICAgICAgICAgICAgKyAiPC9hPiI7CisgICAgICBkYXRhX3R5cGVzLmluc2VydChwYWlyPHN0cmluZywgc3RyaW5nPihuYW1lLCBodG1sKSk7CisgICAgfQorICB9CisgIGZvciAobWFwPHN0cmluZywgc3RyaW5nPjo6aXRlcmF0b3IgZHRfaXRlciA9IGRhdGFfdHlwZXMuYmVnaW4oKTsgZHRfaXRlciAhPSBkYXRhX3R5cGVzLmVuZCgpOworICAgICAgIGR0X2l0ZXIrKykgeworICAgIGZfb3V0XyA8PCBkdF9pdGVyLT5zZWNvbmQgPDwgIjxici8+IiA8PCBlbmRsOworICB9CisgIGZfb3V0XyA8PCAiPC90ZD4iIDw8IGVuZGwgPDwgIjx0ZD4iOworICBpZiAoIXRwcm9nLT5nZXRfY29uc3RzKCkuZW1wdHkoKSkgeworICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gY29uc3RfaHRtbDsKKyAgICB2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyA9IHRwcm9nLT5nZXRfY29uc3RzKCk7CisgICAgdmVjdG9yPHRfY29uc3QqPjo6aXRlcmF0b3IgY29uX2l0ZXI7CisgICAgZm9yIChjb25faXRlciA9IGNvbnN0cy5iZWdpbigpOyBjb25faXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY29uX2l0ZXIpIHsKKyAgICAgIHN0cmluZyBuYW1lID0gKCpjb25faXRlciktPmdldF9uYW1lKCk7CisgICAgICBzdHJpbmcgaHRtbCA9ICI8Y29kZT48YSBocmVmPVwiIiArIG1ha2VfZmlsZV9saW5rKGZuYW1lKSArICIjQ29uc3RfIiArIG5hbWUgKyAiXCI+IiArIG5hbWUKKyAgICAgICAgICAgICAgICAgICAgKyAiPC9hPjwvY29kZT4iOworICAgICAgY29uc3RfaHRtbC5pbnNlcnQocGFpcjxzdHJpbmcsIHN0cmluZz4obmFtZSwgaHRtbCkpOworICAgIH0KKyAgICBmb3IgKG1hcDxzdHJpbmcsIHN0cmluZz46Oml0ZXJhdG9yIGNvbl9pdGVyID0gY29uc3RfaHRtbC5iZWdpbigpOyBjb25faXRlciAhPSBjb25zdF9odG1sLmVuZCgpOworICAgICAgICAgY29uX2l0ZXIrKykgeworICAgICAgZl9vdXRfIDw8IGNvbl9pdGVyLT5zZWNvbmQgPDwgIjxici8+IiA8PCBlbmRsOworICAgIH0KKyAgfQorICBmX291dF8gPDwgIjwvY29kZT48L3RkPiIgPDwgZW5kbCA8PCAiPC90cj4iOworfQorCisvKioKKyAqIFByZXBhcmVzIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0CisgKiBzdHJlYW0uCisgKi8KK3ZvaWQgdF9odG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvZ3JhbSgpIHsKKyAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5CisgIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7CisgIGN1cnJlbnRfZmlsZV8gPSBwcm9ncmFtXy0+Z2V0X25hbWUoKSArICIuaHRtbCI7CisgIHN0cmluZyBmbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBjdXJyZW50X2ZpbGVfOworICBmX291dF8ub3BlbihmbmFtZS5jX3N0cigpKTsKKyAgZl9vdXRfIDw8ICI8IURPQ1RZUEUgaHRtbCBQVUJMSUMgXCItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTlwiIiA8PCBlbmRsOworICBmX291dF8gPDwgIiAgICBcImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGRcIj4iIDw8IGVuZGw7CisgIGZfb3V0XyA8PCAiPGh0bWwgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCI+IiA8PCBlbmRsOworICBmX291dF8gPDwgIjxoZWFkPiIgPDwgZW5kbDsKKyAgZl9vdXRfIDw8ICI8bWV0YSBodHRwLWVxdWl2PVwiQ29udGVudC1UeXBlXCIgY29udGVudD1cInRleHQvaHRtbDtjaGFyc2V0PXV0Zi04XCIgLz4iIDw8IGVuZGw7CisgIGdlbmVyYXRlX3N0eWxlX3RhZygpOworICBmX291dF8gPDwgIjx0aXRsZT5UaHJpZnQgbW9kdWxlOiAiIDw8IHByb2dyYW1fLT5nZXRfbmFtZSgpIDw8ICI8L3RpdGxlPjwvaGVhZD48Ym9keT4iIDw8IGVuZGwKKyAgICAgICAgIDw8ICI8ZGl2IGNsYXNzPVwiY29udGFpbmVyLWZsdWlkXCI+IiA8PCBlbmRsCisgICAgICAgICA8PCAiPGgxPlRocmlmdCBtb2R1bGU6ICIgPDwgcHJvZ3JhbV8tPmdldF9uYW1lKCkgPDwgIjwvaDE+IiA8PCBlbmRsOworCisgIHByaW50X2RvYyhwcm9ncmFtXyk7CisKKyAgZ2VuZXJhdGVfcHJvZ3JhbV90b2MoKTsKKworICBpZiAoIXByb2dyYW1fLT5nZXRfY29uc3RzKCkuZW1wdHkoKSkgeworICAgIGZfb3V0XyA8PCAiPGhyLz48aDIgaWQ9XCJDb25zdGFudHNcIj5Db25zdGFudHM8L2gyPiIgPDwgZW5kbDsKKyAgICB2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyA9IHByb2dyYW1fLT5nZXRfY29uc3RzKCk7CisgICAgZl9vdXRfIDw8ICI8dGFibGUgY2xhc3M9XCJ0YWJsZS1ib3JkZXJlZCB0YWJsZS1zdHJpcGVkIHRhYmxlLWNvbmRlbnNlZFwiPiI7CisgICAgZl9vdXRfIDw8ICI8dGhlYWQ+PHRoPkNvbnN0YW50PC90aD48dGg+VHlwZTwvdGg+PHRoPlZhbHVlPC90aD48L3RoZWFkPiIgPDwgZW5kbDsKKyAgICBnZW5lcmF0ZV9jb25zdHMoY29uc3RzKTsKKyAgICBmX291dF8gPDwgIjwvdGFibGU+IjsKKyAgfQorCisgIGlmICghcHJvZ3JhbV8tPmdldF9lbnVtcygpLmVtcHR5KCkpIHsKKyAgICBmX291dF8gPDwgIjxoci8+PGgyIGlkPVwiRW51bWVyYXRpb25zXCI+RW51bWVyYXRpb25zPC9oMj4iIDw8IGVuZGw7CisgICAgLy8gR2VuZXJhdGUgZW51bXMKKyAgICB2ZWN0b3I8dF9lbnVtKj4gZW51bXMgPSBwcm9ncmFtXy0+Z2V0X2VudW1zKCk7CisgICAgdmVjdG9yPHRfZW51bSo+OjppdGVyYXRvciBlbl9pdGVyOworICAgIGZvciAoZW5faXRlciA9IGVudW1zLmJlZ2luKCk7IGVuX2l0ZXIgIT0gZW51bXMuZW5kKCk7ICsrZW5faXRlcikgeworICAgICAgZ2VuZXJhdGVfZW51bSgqZW5faXRlcik7CisgICAgfQorICB9CisKKyAgaWYgKCFwcm9ncmFtXy0+Z2V0X3R5cGVkZWZzKCkuZW1wdHkoKSkgeworICAgIGZfb3V0XyA8PCAiPGhyLz48aDIgaWQ9XCJUeXBlZGVmc1wiPlR5cGUgZGVjbGFyYXRpb25zPC9oMj4iIDw8IGVuZGw7CisgICAgLy8gR2VuZXJhdGUgdHlwZWRlZnMKKyAgICB2ZWN0b3I8dF90eXBlZGVmKj4gdHlwZWRlZnMgPSBwcm9ncmFtXy0+Z2V0X3R5cGVkZWZzKCk7CisgICAgdmVjdG9yPHRfdHlwZWRlZio+OjppdGVyYXRvciB0ZF9pdGVyOworICAgIGZvciAodGRfaXRlciA9IHR5cGVkZWZzLmJlZ2luKCk7IHRkX2l0ZXIgIT0gdHlwZWRlZnMuZW5kKCk7ICsrdGRfaXRlcikgeworICAgICAgZ2VuZXJhdGVfdHlwZWRlZigqdGRfaXRlcik7CisgICAgfQorICB9CisKKyAgaWYgKCFwcm9ncmFtXy0+Z2V0X29iamVjdHMoKS5lbXB0eSgpKSB7CisgICAgZl9vdXRfIDw8ICI8aHIvPjxoMiBpZD1cIlN0cnVjdHNcIj5EYXRhIHN0cnVjdHVyZXM8L2gyPiIgPDwgZW5kbDsKKyAgICAvLyBHZW5lcmF0ZSBzdHJ1Y3RzIGFuZCBleGNlcHRpb25zIGluIGRlY2xhcmVkIG9yZGVyCisgICAgdmVjdG9yPHRfc3RydWN0Kj4gb2JqZWN0cyA9IHByb2dyYW1fLT5nZXRfb2JqZWN0cygpOworICAgIHZlY3Rvcjx0X3N0cnVjdCo+OjppdGVyYXRvciBvX2l0ZXI7CisgICAgZm9yIChvX2l0ZXIgPSBvYmplY3RzLmJlZ2luKCk7IG9faXRlciAhPSBvYmplY3RzLmVuZCgpOyArK29faXRlcikgeworICAgICAgaWYgKCgqb19pdGVyKS0+aXNfeGNlcHRpb24oKSkgeworICAgICAgICBnZW5lcmF0ZV94Y2VwdGlvbigqb19pdGVyKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGdlbmVyYXRlX3N0cnVjdCgqb19pdGVyKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAoIXByb2dyYW1fLT5nZXRfc2VydmljZXMoKS5lbXB0eSgpKSB7CisgICAgZl9vdXRfIDw8ICI8aHIvPjxoMiBpZD1cIlNlcnZpY2VzXCI+U2VydmljZXM8L2gyPiIgPDwgZW5kbDsKKyAgICAvLyBHZW5lcmF0ZSBzZXJ2aWNlcworICAgIHZlY3Rvcjx0X3NlcnZpY2UqPiBzZXJ2aWNlcyA9IHByb2dyYW1fLT5nZXRfc2VydmljZXMoKTsKKyAgICB2ZWN0b3I8dF9zZXJ2aWNlKj46Oml0ZXJhdG9yIHN2X2l0ZXI7CisgICAgZm9yIChzdl9pdGVyID0gc2VydmljZXMuYmVnaW4oKTsgc3ZfaXRlciAhPSBzZXJ2aWNlcy5lbmQoKTsgKytzdl9pdGVyKSB7CisgICAgICBzZXJ2aWNlX25hbWVfID0gZ2V0X3NlcnZpY2VfbmFtZSgqc3ZfaXRlcik7CisgICAgICBnZW5lcmF0ZV9zZXJ2aWNlKCpzdl9pdGVyKTsKKyAgICB9CisgIH0KKworICBmX291dF8gPDwgIjwvZGl2PjwvYm9keT48L2h0bWw+IiA8PCBlbmRsOworICBmX291dF8uY2xvc2UoKTsKKworICBnZW5lcmF0ZV9pbmRleCgpOworICBnZW5lcmF0ZV9jc3MoKTsKK30KKworLyoqCisgKiBFbWl0cyB0aGUgaW5kZXguaHRtbCBmaWxlIGZvciB0aGUgcmVjdXJzaXZlIHNldCBvZiBUaHJpZnQgcHJvZ3JhbXMKKyAqLwordm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9pbmRleCgpIHsKKyAgY3VycmVudF9maWxlXyA9ICJpbmRleC5odG1sIjsKKyAgc3RyaW5nIGluZGV4X2ZuYW1lID0gZ2V0X291dF9kaXIoKSArIGN1cnJlbnRfZmlsZV87CisgIGZfb3V0Xy5vcGVuKGluZGV4X2ZuYW1lLmNfc3RyKCkpOworICBmX291dF8gPDwgIjxodG1sPjxoZWFkPiIgPDwgZW5kbDsKKyAgZ2VuZXJhdGVfc3R5bGVfdGFnKCk7CisgIGZfb3V0XyA8PCAiPHRpdGxlPkFsbCBUaHJpZnQgZGVjbGFyYXRpb25zPC90aXRsZT48L2hlYWQ+PGJvZHk+IiA8PCBlbmRsCisgICAgICAgICA8PCAiPGRpdiBjbGFzcz1cImNvbnRhaW5lci1mbHVpZFwiPiIgPDwgZW5kbCA8PCAiPGgxPkFsbCBUaHJpZnQgZGVjbGFyYXRpb25zPC9oMT4iIDw8IGVuZGw7CisgIGZfb3V0XyA8PCAiPHRhYmxlIGNsYXNzPVwidGFibGUtYm9yZGVyZWQgdGFibGUtc3RyaXBlZCAiCisgICAgICAgICAgICAidGFibGUtY29uZGVuc2VkXCI+PHRoZWFkPjx0aD5Nb2R1bGU8L3RoPjx0aD5TZXJ2aWNlczwvdGg+PHRoPkRhdGEgdHlwZXM8L3RoPiIKKyAgICAgICAgIDw8ICI8dGg+Q29uc3RhbnRzPC90aD48L3RoZWFkPiIgPDwgZW5kbDsKKyAgdmVjdG9yPHRfcHJvZ3JhbSo+IHByb2dyYW1zOworICBnZW5lcmF0ZV9wcm9ncmFtX3RvY19yb3dzKHByb2dyYW1fLCBwcm9ncmFtcyk7CisgIGZfb3V0XyA8PCAiPC90YWJsZT4iIDw8IGVuZGw7CisgIGZfb3V0XyA8PCAiPC9kaXY+PC9ib2R5PjwvaHRtbD4iIDw8IGVuZGw7CisgIGZfb3V0Xy5jbG9zZSgpOworfQorCit2b2lkIHRfaHRtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzcygpIHsKKyAgaWYgKCFzdGFuZGFsb25lXykgeworICAgIGN1cnJlbnRfZmlsZV8gPSAic3R5bGUuY3NzIjsKKyAgICBzdHJpbmcgY3NzX2ZuYW1lID0gZ2V0X291dF9kaXIoKSArIGN1cnJlbnRfZmlsZV87CisgICAgZl9vdXRfLm9wZW4oY3NzX2ZuYW1lLmNfc3RyKCkpOworICAgIGdlbmVyYXRlX2Nzc19jb250ZW50KGZfb3V0Xyk7CisgICAgZl9vdXRfLmNsb3NlKCk7CisgIH0KK30KKwordm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jc3NfY29udGVudChzdGQ6Om9zdHJlYW0mIGZfdGFyZ2V0KSB7CisgIGZfdGFyZ2V0IDw8IEJPT1RTVFJBUF9DU1MoKSA8PCBlbmRsOworICBmX3RhcmdldCA8PCAiLyogQXV0by1nZW5lcmF0ZWQgQ1NTIGZvciBnZW5lcmF0ZWQgVGhyaWZ0IGRvY3MgKi8iIDw8IGVuZGw7CisgIGZfdGFyZ2V0IDw8ICJoMywgaDQgeyBtYXJnaW4tYm90dG9tOiA2cHg7IH0iIDw8IGVuZGw7CisgIGZfdGFyZ2V0IDw8ICJkaXYuZGVmaW5pdGlvbiB7IGJvcmRlcjogMXB4IHNvbGlkICNDQ0M7IG1hcmdpbi1ib3R0b206IDEwcHg7IHBhZGRpbmc6IDEwcHg7IH0iCisgICAgICAgICAgIDw8IGVuZGw7CisgIGZfdGFyZ2V0IDw8ICJkaXYuZXh0ZW5kcyB7IG1hcmdpbjogLTAuNWVtIDAgMWVtIDVlbSB9IiA8PCBlbmRsOworICBmX3RhcmdldCA8PCAidGQgeyB2ZXJ0aWNhbC1hbGlnbjogdG9wOyB9IiA8PCBlbmRsOworICBmX3RhcmdldCA8PCAidGFibGUgeyBlbXB0eS1jZWxsczogc2hvdzsgfSIgPDwgZW5kbDsKKyAgZl90YXJnZXQgPDwgImNvZGUgeyBsaW5lLWhlaWdodDogMjBweDsgfSIgPDwgZW5kbDsKKyAgZl90YXJnZXQgPDwgIi50YWJsZS1ib3JkZXJlZCB0aCwgLnRhYmxlLWJvcmRlcmVkIHRkIHsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNEREREREQ7IH0iCisgICAgICAgICAgIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHRoZSBDU1MgdGFnLgorICogRGVwZW5kaW5nIG9uICJzdGFuZGFsb25lIiwgZWl0aGVyIGEgQ1NTIGZpbGUgbGluayAoZGVmYXVsdCksIG9yIHRoZSBlbnRpcmUgQ1NTIGlzIGVtYmVkZGVkCisgKiBpbmxpbmUuCisgKi8KK3ZvaWQgdF9odG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3R5bGVfdGFnKCkgeworICBpZiAoIXN0YW5kYWxvbmVfKSB7CisgICAgZl9vdXRfIDw8ICI8bGluayBocmVmPVwic3R5bGUuY3NzXCIgcmVsPVwic3R5bGVzaGVldFwiIHR5cGU9XCJ0ZXh0L2Nzc1wiLz4iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgZl9vdXRfIDw8ICI8c3R5bGUgdHlwZT1cInRleHQvY3NzXCIvPjwhLS0iIDw8IGVuZGw7CisgICAgZ2VuZXJhdGVfY3NzX2NvbnRlbnQoZl9vdXRfKTsKKyAgICBmX291dF8gPDwgIi0tPjwvc3R5bGU+IiA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogUmV0dXJucyB0aGUgdGFyZ2V0IGZpbGUgZm9yIGEgPGEgaHJlZj4gbGluaworICogVGhlIHJldHVybmVkIHN0cmluZyBpcyBlbXB0eSwgd2hlbmV2ZXIgZmlsZW5hbWUgcmVmZXJzIHRvIHRoZSBjdXJyZW50IGZpbGUuCisgKi8KK3N0ZDo6c3RyaW5nIHRfaHRtbF9nZW5lcmF0b3I6Om1ha2VfZmlsZV9saW5rKHN0ZDo6c3RyaW5nIGZpbGVuYW1lKSB7CisgIHJldHVybiAoY3VycmVudF9maWxlXy5jb21wYXJlKGZpbGVuYW1lKSAhPSAwKSA/IGZpbGVuYW1lIDogIiI7Cit9CisKKy8qKgorICogSWYgdGhlIHByb3ZpZGVkIGRvY3VtZW50YWJsZSBvYmplY3QgaGFzIGRvY3VtZW50YXRpb24gYXR0YWNoZWQsIHRoaXMKKyAqIHdpbGwgZW1pdCBpdCB0byB0aGUgb3V0cHV0IHN0cmVhbSBpbiBIVE1MIGZvcm1hdC4KKyAqLwordm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpwcmludF9kb2ModF9kb2MqIHRkb2MpIHsKKyAgaWYgKHRkb2MtPmhhc19kb2MoKSkgeworICAgIGlmICh1bnNhZmVfKSB7CisgICAgICBmX291dF8gPDwgdGRvYy0+Z2V0X2RvYygpIDw8ICI8YnIvPiI7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfb3V0XyA8PCAiPHByZT4iIDw8IGVzY2FwZV9odG1sKHRkb2MtPmdldF9kb2MoKSkgPDwgIjwvcHJlPjxici8+IjsKKyAgICB9CisgIH0KK30KKworYm9vbCB0X2h0bWxfZ2VuZXJhdG9yOjppc191dGY4X3NlcXVlbmNlKHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIsIHNpemVfdCBmaXJzdHBvcykgeworICAvLyBsZWFkaW5nIGNoYXIgZGV0ZXJtaW5lcyB0aGUgbGVuZ3RoIG9mIHRoZSBzZXF1ZW5jZQorICB1bnNpZ25lZCBjaGFyIGMgPSBzdHIuYXQoZmlyc3Rwb3MpOworICBpbnQgY291bnQgPSAwOworICBpZiAoKGMgJiAweEUwKSA9PSAweEMwKSB7CisgICAgY291bnQgPSAxOworICB9IGVsc2UgaWYgKChjICYgMHhGMCkgPT0gMHhFMCkgeworICAgIGNvdW50ID0gMjsKKyAgfSBlbHNlIGlmICgoYyAmIDB4RjgpID09IDB4RjApIHsKKyAgICBjb3VudCA9IDM7CisgIH0gZWxzZSBpZiAoKGMgJiAweEZDKSA9PSAweEY4KSB7CisgICAgY291bnQgPSA0OworICB9IGVsc2UgaWYgKChjICYgMHhGRSkgPT0gMHhGQykgeworICAgIGNvdW50ID0gNTsKKyAgfSBlbHNlIHsKKyAgICAvLyBwZGVidWcoIlVURi04IHRlc3Q6IGNoYXIgJyVjJyAoJWQpIGlzIG5vdCBhIHZhbGlkIFVURi04IGxlYWRpbmcgYnl0ZSIsIGMsIGludChjKSk7CisgICAgcmV0dXJuIGZhbHNlOyAvLyBubyBVVEYtOAorICB9CisKKyAgLy8gZm9sbG93aW5nIGNoYXJzCisgIHNpemVfdCBwb3MgPSBmaXJzdHBvcyArIDE7CisgIHdoaWxlICgocG9zIDwgc3RyLmxlbmd0aCgpKSAmJiAoMCA8IGNvdW50KSkgeworICAgIGMgPSBzdHIuYXQocG9zKTsKKyAgICBpZiAoKGMgJiAweEMwKSAhPSAweDgwKSB7CisgICAgICAvLyBwZGVidWcoIlVURi04IHRlc3Q6IGNoYXIgJyVjJyAoJWQpIGlzIG5vdCBhIHZhbGlkIFVURi04IGZvbGxvd2luZyBieXRlIiwgYywgaW50KGMpKTsKKyAgICAgIHJldHVybiBmYWxzZTsgLy8gbm8gVVRGLTgKKyAgICB9CisgICAgLS1jb3VudDsKKyAgICArK3BvczsKKyAgfQorCisgIC8vIHRydWUgaWYgdGhlIHNlcXVlbmNlIGlzIGNvbXBsZXRlCisgIHJldHVybiAoMCA9PSBjb3VudCk7Cit9CisKK3ZvaWQgdF9odG1sX2dlbmVyYXRvcjo6ZGV0ZWN0X2lucHV0X2VuY29kaW5nKHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIsIHNpemVfdCBmaXJzdHBvcykgeworICBpZiAoaXNfdXRmOF9zZXF1ZW5jZShzdHIsIGZpcnN0cG9zKSkgeworICAgIHBkZWJ1ZygiSW5wdXQgc2VlbXMgdG8gYmUgYWxyZWFkeSBVVEYtOCBlbmNvZGVkIik7CisgICAgaW5wdXRfdHlwZV8gPSBJTlBVVF9VVEY4OworICAgIHJldHVybjsKKyAgfQorCisgIC8vIGZhbGxiYWNrCisgIHB3YXJuaW5nKDEsICJJbnB1dCBpcyBub3QgVVRGLTgsIHRyZWF0aW5nIGFzIHBsYWluIEFOU0kiKTsKKyAgaW5wdXRfdHlwZV8gPSBJTlBVVF9QTEFJTjsKK30KKwordm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjppbml0X2FsbG93ZWRfX21hcmt1cCgpIHsKKyAgYWxsb3dlZF9tYXJrdXAuY2xlYXIoKTsKKyAgLy8gc3RhbmRhbG9uZSB0YWdzCisgIGFsbG93ZWRfbWFya3VwWyJiciJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbImJyLyJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbImltZyJdID0gMTsKKyAgLy8gcGFpcmVkIHRhZ3MKKyAgYWxsb3dlZF9tYXJrdXBbImIiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyIvYiJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbInUiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyIvdSJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbImkiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyIvaSJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbInMiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyIvcyJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbImJpZyJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbIi9iaWciXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyJzbWFsbCJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbIi9zbWFsbCJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbInN1cCJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbIi9zdXAiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyJzdWIiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyIvc3ViIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsicHJlIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiL3ByZSJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbInR0Il0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiL3R0Il0gPSAxOworICBhbGxvd2VkX21hcmt1cFsidWwiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyIvdWwiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyJvbCJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbIi9vbCJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbImxpIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiL2xpIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiYSJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbIi9hIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsicCJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbIi9wIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiY29kZSJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbIi9jb2RlIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiZGwiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyIvZGwiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyJkdCJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbIi9kdCJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbImRkIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiL2RkIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiaDEiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyIvaDEiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyJoMiJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbIi9oMiJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbImgzIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiL2gzIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiaDQiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyIvaDQiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyJoNSJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbIi9oNSJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbImg2Il0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiL2g2Il0gPSAxOworfQorCitzdGQ6OnN0cmluZyB0X2h0bWxfZ2VuZXJhdG9yOjplc2NhcGVfaHRtbF90YWdzKHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHJlc3VsdDsKKworICB1bnNpZ25lZCBjaGFyIGMgPSAnPyc7CisgIHNpemVfdCBsYXN0cG9zOworICBzaXplX3QgZmlyc3Rwb3MgPSAwOworICB3aGlsZSAoZmlyc3Rwb3MgPCBzdHIubGVuZ3RoKCkpIHsKKworICAgIC8vIGxvb2sgZm9yIG5vbi1BU0NJSSBjaGFyCisgICAgbGFzdHBvcyA9IGZpcnN0cG9zOworICAgIHdoaWxlIChsYXN0cG9zIDwgc3RyLmxlbmd0aCgpKSB7CisgICAgICBjID0gc3RyLmF0KGxhc3Rwb3MpOworICAgICAgaWYgKCgnPCcgPT0gYykgfHwgKCc+JyA9PSBjKSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgICsrbGFzdHBvczsKKyAgICB9CisKKyAgICAvLyBjb3B5IHdoYXQgd2UgZ290IHNvIGZhcgorICAgIGlmIChsYXN0cG9zID4gZmlyc3Rwb3MpIHsKKyAgICAgIHJlc3VsdCA8PCBzdHIuc3Vic3RyKGZpcnN0cG9zLCBsYXN0cG9zIC0gZmlyc3Rwb3MpOworICAgICAgZmlyc3Rwb3MgPSBsYXN0cG9zOworICAgIH0KKworICAgIC8vIHJlYWNoZWQgdGhlIGVuZD8KKyAgICBpZiAoZmlyc3Rwb3MgPj0gc3RyLmxlbmd0aCgpKSB7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvLyB0YWcgZW5kIHdpdGhvdXQgY29ycmVzcG9uZGluZyBiZWdpbgorICAgICsrZmlyc3Rwb3M7CisgICAgaWYgKCc+JyA9PSBjKSB7CisgICAgICByZXN1bHQgPDwgIiZndDsiOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgLy8gZXh0cmFjdCB0aGUgdGFnCisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIHRhZ3N0cmVhbTsKKyAgICB3aGlsZSAoZmlyc3Rwb3MgPCBzdHIubGVuZ3RoKCkpIHsKKyAgICAgIGMgPSBzdHIuYXQoZmlyc3Rwb3MpOworICAgICAgKytmaXJzdHBvczsKKyAgICAgIGlmICgnPCcgPT0gYykgeworICAgICAgICB0YWdzdHJlYW0gPDwgIiZsdDsiOyAvLyBuZXN0ZWQgYmVnaW4/CisgICAgICB9IGVsc2UgaWYgKCc+JyA9PSBjKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGFnc3RyZWFtIDw8IGM7IC8vIG5vdCB2ZXJ5IGVmZmljaWVudCwgYnV0IHRhZ3Mgc2hvdWxkIGJlIHF1aXRlIHNob3J0CisgICAgICB9CisgICAgfQorCisgICAgLy8gd2UgYWxsb3cgZm9yIHNldmVyYWwgbWFya3VwIGluIGRvY3N0cmluZ3MsIGFsbCBlbHNlIHdpbGwgYmVjb21lIGVzY2FwZWQKKyAgICBzdHJpbmcgdGFnX2NvbnRlbnQgPSB0YWdzdHJlYW0uc3RyKCk7CisgICAgc3RyaW5nIHRhZ19rZXkgPSB0YWdfY29udGVudDsKKyAgICBzaXplX3QgZmlyc3Rfd2hpdGUgPSB0YWdfa2V5LmZpbmRfZmlyc3Rfb2YoIiBcdFxmXHZcblxyIik7CisgICAgaWYgKGZpcnN0X3doaXRlICE9IHN0cmluZzo6bnBvcykgeworICAgICAgdGFnX2tleS5lcmFzZShmaXJzdF93aGl0ZSk7CisgICAgfQorICAgIGZvciAoc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBpID0gMDsgaSA8IHRhZ19rZXkubGVuZ3RoKCk7ICsraSkgeworICAgICAgdGFnX2tleVtpXSA9IHRvbG93ZXIodGFnX2tleVtpXSk7CisgICAgfQorICAgIGlmIChhbGxvd2VkX21hcmt1cC5maW5kKHRhZ19rZXkpICE9IGFsbG93ZWRfbWFya3VwLmVuZCgpKSB7CisgICAgICByZXN1bHQgPDwgIjwiIDw8IHRhZ19jb250ZW50IDw8ICI+IjsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0IDw8ICImbHQ7IiA8PCB0YWdzdHJlYW0uc3RyKCkgPDwgIiZndDsiOworICAgICAgcHZlcmJvc2UoImlsbGVnYWwgbWFya3VwIDwlcz4gaW4gZG9jLWNvbW1lbnRcbiIsIHRhZ19rZXkuY19zdHIoKSk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHJlc3VsdC5zdHIoKTsKK30KKworc3RkOjpzdHJpbmcgdF9odG1sX2dlbmVyYXRvcjo6ZXNjYXBlX2h0bWwoc3RkOjpzdHJpbmcgY29uc3QmIHN0cikgeworICAvLyB0aGUgZ2VuZXJhdGVkIEhUTUwgaGVhZGVyIHNheXMgaXQgaXMgVVRGLTggZW5jb2RlZAorICAvLyBpZiBVVEYtOCBpbnB1dCBoYXMgYmVlbiBkZXRlY3RlZCBiZWZvcmUsIHdlIGRvbid0IG5lZWQgdG8gY2hhbmdlIGFueXRoaW5nCisgIGlmIChpbnB1dF90eXBlXyA9PSBJTlBVVF9VVEY4KSB7CisgICAgcmV0dXJuIGVzY2FwZV9odG1sX3RhZ3Moc3RyKTsKKyAgfQorCisgIC8vIGNvbnZlcnQgdW5zYWZlIGNoYXJzIHRvIHRoZWlyICYjPG51bT47IGVxdWl2YWxlbnQKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHJlc3VsdDsKKyAgdW5zaWduZWQgY2hhciBjID0gJz8nOworICB1bnNpZ25lZCBpbnQgaWMgPSAwOworICBzaXplX3QgbGFzdHBvczsKKyAgc2l6ZV90IGZpcnN0cG9zID0gMDsKKyAgd2hpbGUgKGZpcnN0cG9zIDwgc3RyLmxlbmd0aCgpKSB7CisKKyAgICAvLyBsb29rIGZvciBub24tQVNDSUkgY2hhcgorICAgIGxhc3Rwb3MgPSBmaXJzdHBvczsKKyAgICB3aGlsZSAobGFzdHBvcyA8IHN0ci5sZW5ndGgoKSkgeworICAgICAgYyA9IHN0ci5hdChsYXN0cG9zKTsKKyAgICAgIGljID0gYzsKKyAgICAgIGlmICgoMzIgPiBpYykgfHwgKDEyNyA8IGljKSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgICsrbGFzdHBvczsKKyAgICB9CisKKyAgICAvLyBjb3B5IHdoYXQgd2UgZ290IHNvIGZhcgorICAgIGlmIChsYXN0cG9zID4gZmlyc3Rwb3MpIHsKKyAgICAgIHJlc3VsdCA8PCBzdHIuc3Vic3RyKGZpcnN0cG9zLCBsYXN0cG9zIC0gZmlyc3Rwb3MpOworICAgICAgZmlyc3Rwb3MgPSBsYXN0cG9zOworICAgIH0KKworICAgIC8vIHJlYWNoZWQgdGhlIGVuZD8KKyAgICBpZiAoZmlyc3Rwb3MgPj0gc3RyLmxlbmd0aCgpKSB7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvLyBzb21lIGNvbnRyb2wgY29kZT8KKyAgICBpZiAoaWMgPD0gMzEpIHsKKyAgICAgIHN3aXRjaCAoYykgeworICAgICAgY2FzZSAnXHInOgorICAgICAgY2FzZSAnXG4nOgorICAgICAgY2FzZSAnXHQnOgorICAgICAgICByZXN1bHQgPDwgYzsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OiAvLyBzaWxlbnRseSBjb25zdW1lIGFsbCBvdGhlciBjdHJsIGNoYXJzCisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgKytmaXJzdHBvczsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIC8vIHJlYWNoZWQgdGhlIGVuZD8KKyAgICBpZiAoZmlyc3Rwb3MgPj0gc3RyLmxlbmd0aCgpKSB7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvLyB0cnkgdG8gZGV0ZWN0IGlucHV0IGVuY29kaW5nCisgICAgaWYgKGlucHV0X3R5cGVfID09IElOUFVUX1VOS05PV04pIHsKKyAgICAgIGRldGVjdF9pbnB1dF9lbmNvZGluZyhzdHIsIGZpcnN0cG9zKTsKKyAgICAgIGlmIChpbnB1dF90eXBlXyA9PSBJTlBVVF9VVEY4KSB7CisgICAgICAgIGxhc3Rwb3MgPSBzdHIubGVuZ3RoKCk7CisgICAgICAgIHJlc3VsdCA8PCBzdHIuc3Vic3RyKGZpcnN0cG9zLCBsYXN0cG9zIC0gZmlyc3Rwb3MpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBjb252ZXJ0IHRoZSBjaGFyYWN0ZXIgdG8gc29tZXRoaW5nIHVzZWZ1bCBiYXNlZCBvbiB0aGUgZGV0ZWN0ZWQgZW5jb2RpbmcKKyAgICBzd2l0Y2ggKGlucHV0X3R5cGVfKSB7CisgICAgY2FzZSBJTlBVVF9QTEFJTjoKKyAgICAgIHJlc3VsdCA8PCAiJiMiIDw8IGljIDw8ICI7IjsKKyAgICAgICsrZmlyc3Rwb3M7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgIlVuZXhwZWN0ZWQgb3IgdW5yZWNvZ25pemVkIGlucHV0IGVuY29kaW5nIjsKKyAgICB9CisgIH0KKworICByZXR1cm4gZXNjYXBlX2h0bWxfdGFncyhyZXN1bHQuc3RyKCkpOworfQorCisvKioKKyAqIFByaW50cyBvdXQgdGhlIHByb3ZpZGVkIHR5cGUgaW4gSFRNTAorICovCitpbnQgdF9odG1sX2dlbmVyYXRvcjo6cHJpbnRfdHlwZSh0X3R5cGUqIHR0eXBlKSB7CisgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgbGVuID0gMDsKKyAgZl9vdXRfIDw8ICI8Y29kZT4iOworICBpZiAodHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIGZfb3V0XyA8PCAibGlzdCZsdDsiOworICAgICAgbGVuID0gNiArIHByaW50X3R5cGUoKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKTsKKyAgICAgIGZfb3V0XyA8PCAiJmd0OyI7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgIGZfb3V0XyA8PCAic2V0Jmx0OyI7CisgICAgICBsZW4gPSA1ICsgcHJpbnRfdHlwZSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSk7CisgICAgICBmX291dF8gPDwgIiZndDsiOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgICBmX291dF8gPDwgIm1hcCZsdDsiOworICAgICAgbGVuID0gNSArIHByaW50X3R5cGUoKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSk7CisgICAgICBmX291dF8gPDwgIiwgIjsKKyAgICAgIGxlbiArPSBwcmludF90eXBlKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpOworICAgICAgZl9vdXRfIDw8ICImZ3Q7IjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgZl9vdXRfIDw8ICh0dHlwZS0+aXNfYmluYXJ5KCkgPyAiYmluYXJ5IiA6IHR0eXBlLT5nZXRfbmFtZSgpKTsKKyAgICBsZW4gPSB0dHlwZS0+Z2V0X25hbWUoKS5zaXplKCk7CisgIH0gZWxzZSB7CisgICAgc3RyaW5nIHByb2dfbmFtZSA9IHR0eXBlLT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZSgpOworICAgIHN0cmluZyB0eXBlX25hbWUgPSB0dHlwZS0+Z2V0X25hbWUoKTsKKyAgICBmX291dF8gPDwgIjxhIGhyZWY9XCIiIDw8IG1ha2VfZmlsZV9saW5rKHByb2dfbmFtZSArICIuaHRtbCIpIDw8ICIjIjsKKyAgICBpZiAodHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgICAgZl9vdXRfIDw8ICJTdHJ1Y3RfIjsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgICAgZl9vdXRfIDw8ICJTdHJ1Y3RfIjsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIGZfb3V0XyA8PCAiRW51bV8iOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NlcnZpY2UoKSkgeworICAgICAgZl9vdXRfIDw8ICJTdmNfIjsKKyAgICB9CisgICAgZl9vdXRfIDw8IHR5cGVfbmFtZSA8PCAiXCI+IjsKKyAgICBsZW4gPSB0eXBlX25hbWUuc2l6ZSgpOworICAgIGlmICh0dHlwZS0+Z2V0X3Byb2dyYW0oKSAhPSBwcm9ncmFtXykgeworICAgICAgZl9vdXRfIDw8IHByb2dfbmFtZSA8PCAiLiI7CisgICAgICBsZW4gKz0gcHJvZ19uYW1lLnNpemUoKSArIDE7CisgICAgfQorICAgIGZfb3V0XyA8PCB0eXBlX25hbWUgPDwgIjwvYT4iOworICB9CisgIGZfb3V0XyA8PCAiPC9jb2RlPiI7CisgIHJldHVybiAoaW50KWxlbjsKK30KKworLyoqCisgKiBQcmludHMgb3V0IGFuIEhUTUwgcmVwcmVzZW50YXRpb24gb2YgdGhlIHByb3ZpZGVkIGNvbnN0YW50IHZhbHVlCisgKi8KK3ZvaWQgdF9odG1sX2dlbmVyYXRvcjo6cHJpbnRfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB0dmFsdWUpIHsKKworICAvLyBpZiB0dmFsdWUgaXMgYW4gaWRlbnRpZmllciwgdGhlIGNvbnN0YW50IGNvbnRlbnQgaXMgYWxyZWFkeSBzaG93biBlbHNld2hlcmUKKyAgaWYgKHR2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JREVOVElGSUVSKSB7CisgICAgc3RyaW5nIGZuYW1lID0gcHJvZ3JhbV8tPmdldF9uYW1lKCkgKyAiLmh0bWwiOworICAgIHN0cmluZyBuYW1lID0gZXNjYXBlX2h0bWwodHZhbHVlLT5nZXRfaWRlbnRpZmllcigpKTsKKyAgICBmX291dF8gPDwgIjxjb2RlPjxhIGhyZWY9XCIiICsgbWFrZV9maWxlX2xpbmsoZm5hbWUpICsgIiNDb25zdF8iICsgbmFtZSArICJcIj4iICsgbmFtZQorICAgICAgICAgICAgICArICI8L2E+PC9jb2RlPiI7CisgICAgcmV0dXJuOworICB9CisKKyAgdF90eXBlKiB0cnVldHlwZSA9IHR5cGU7CisgIHdoaWxlICh0cnVldHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgdHJ1ZXR5cGUgPSAoKHRfdHlwZWRlZiopdHJ1ZXR5cGUpLT5nZXRfdHlwZSgpOworICB9CisKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGlmICh0cnVldHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHJ1ZXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIGZfb3V0XyA8PCAnIicgPDwgZXNjYXBlX2h0bWwoZ2V0X2VzY2FwZWRfc3RyaW5nKHR2YWx1ZSkpIDw8ICciJzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIGZfb3V0XyA8PCAoKHR2YWx1ZS0+Z2V0X2ludGVnZXIoKSAhPSAwKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIGZfb3V0XyA8PCB0dmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIGZfb3V0XyA8PCB0dmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIGZfb3V0XyA8PCB0dmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIGZfb3V0XyA8PCB0dmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIGlmICh0dmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgeworICAgICAgICBmX291dF8gPDwgdHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9vdXRfIDw8IHR2YWx1ZS0+Z2V0X2RvdWJsZSgpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGZfb3V0XyA8PCAiVU5LTk9XTiBCQVNFIFRZUEUiOworICAgICAgYnJlYWs7CisgICAgfQorICB9IGVsc2UgaWYgKHRydWV0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBmX291dF8gPDwgZXNjYXBlX2h0bWwodHJ1ZXR5cGUtPmdldF9uYW1lKCkpIDw8ICIuIgorICAgICAgICAgICA8PCBlc2NhcGVfaHRtbCh0dmFsdWUtPmdldF9pZGVudGlmaWVyX25hbWUoKSk7CisgIH0gZWxzZSBpZiAodHJ1ZXR5cGUtPmlzX3N0cnVjdCgpIHx8IHRydWV0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZl9vdXRfIDw8ICJ7ICI7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHJ1ZXR5cGUpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKKyAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7CisgICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgeworICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHRydWV0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIgorICAgICAgICAgICAgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisgICAgICB9CisgICAgICBpZiAoIWZpcnN0KSB7CisgICAgICAgIGZfb3V0XyA8PCAiLCAiOworICAgICAgfQorICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIGZfb3V0XyA8PCBlc2NhcGVfaHRtbCh2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIDw8ICIgPSAiOworICAgICAgcHJpbnRfY29uc3RfdmFsdWUoZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgIH0KKyAgICBmX291dF8gPDwgIiB9IjsKKyAgfSBlbHNlIGlmICh0cnVldHlwZS0+aXNfbWFwKCkpIHsKKyAgICBmX291dF8gPDwgInsgIjsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiBtYXBfZWxlbXMgPSB0dmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6aXRlcmF0b3IgbWFwX2l0ZXI7CisgICAgZm9yIChtYXBfaXRlciA9IG1hcF9lbGVtcy5iZWdpbigpOyBtYXBfaXRlciAhPSBtYXBfZWxlbXMuZW5kKCk7IG1hcF9pdGVyKyspIHsKKyAgICAgIGlmICghZmlyc3QpIHsKKyAgICAgICAgZl9vdXRfIDw8ICIsICI7CisgICAgICB9CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgcHJpbnRfY29uc3RfdmFsdWUoKCh0X21hcCopdHJ1ZXR5cGUpLT5nZXRfa2V5X3R5cGUoKSwgbWFwX2l0ZXItPmZpcnN0KTsKKyAgICAgIGZfb3V0XyA8PCAiID0gIjsKKyAgICAgIHByaW50X2NvbnN0X3ZhbHVlKCgodF9tYXAqKXRydWV0eXBlKS0+Z2V0X3ZhbF90eXBlKCksIG1hcF9pdGVyLT5zZWNvbmQpOworICAgIH0KKyAgICBmX291dF8gPDwgIiB9IjsKKyAgfSBlbHNlIGlmICh0cnVldHlwZS0+aXNfbGlzdCgpKSB7CisgICAgZl9vdXRfIDw8ICJ7ICI7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiBsaXN0X2VsZW1zID0gdHZhbHVlLT5nZXRfbGlzdCgpOworICAgIDsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+OjppdGVyYXRvciBsaXN0X2l0ZXI7CisgICAgZm9yIChsaXN0X2l0ZXIgPSBsaXN0X2VsZW1zLmJlZ2luKCk7IGxpc3RfaXRlciAhPSBsaXN0X2VsZW1zLmVuZCgpOyBsaXN0X2l0ZXIrKykgeworICAgICAgaWYgKCFmaXJzdCkgeworICAgICAgICBmX291dF8gPDwgIiwgIjsKKyAgICAgIH0KKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICBwcmludF9jb25zdF92YWx1ZSgoKHRfbGlzdCopdHJ1ZXR5cGUpLT5nZXRfZWxlbV90eXBlKCksICpsaXN0X2l0ZXIpOworICAgIH0KKyAgICBmX291dF8gPDwgIiB9IjsKKyAgfSBlbHNlIGlmICh0cnVldHlwZS0+aXNfc2V0KCkpIHsKKyAgICBmX291dF8gPDwgInsgIjsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+IGxpc3RfZWxlbXMgPSB0dmFsdWUtPmdldF9saXN0KCk7CisgICAgOworICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46Oml0ZXJhdG9yIGxpc3RfaXRlcjsKKyAgICBmb3IgKGxpc3RfaXRlciA9IGxpc3RfZWxlbXMuYmVnaW4oKTsgbGlzdF9pdGVyICE9IGxpc3RfZWxlbXMuZW5kKCk7IGxpc3RfaXRlcisrKSB7CisgICAgICBpZiAoIWZpcnN0KSB7CisgICAgICAgIGZfb3V0XyA8PCAiLCAiOworICAgICAgfQorICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIHByaW50X2NvbnN0X3ZhbHVlKCgodF9zZXQqKXRydWV0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpLCAqbGlzdF9pdGVyKTsKKyAgICB9CisgICAgZl9vdXRfIDw8ICIgfSI7CisgIH0gZWxzZSB7CisgICAgZl9vdXRfIDw8ICJVTktOT1dOIFRZUEUiOworICB9Cit9CisKKy8qKgorICogUHJpbnRzIG91dCBkb2N1bWVudGF0aW9uIGZvciBhcmd1bWVudHMvZXhjZXB0aW9ucyBvZiBhIGZ1bmN0aW9uLCBpZiBhbnkgZG9jdW1lbnRhdGlvbiBoYXMgYmVlbgorICogc3VwcGxpZWQuCisgKi8KK3ZvaWQgdF9odG1sX2dlbmVyYXRvcjo6cHJpbnRfZm5fYXJnc19kb2ModF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIGJvb2wgaGFzX2RvY3MgPSBmYWxzZTsKKyAgdmVjdG9yPHRfZmllbGQqPiBhcmdzID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+OjppdGVyYXRvciBhcmdfaXRlciA9IGFyZ3MuYmVnaW4oKTsKKyAgaWYgKGFyZ19pdGVyICE9IGFyZ3MuZW5kKCkpIHsKKyAgICBmb3IgKDsgYXJnX2l0ZXIgIT0gYXJncy5lbmQoKTsgYXJnX2l0ZXIrKykgeworICAgICAgaWYgKCgqYXJnX2l0ZXIpLT5oYXNfZG9jKCkgJiYgISgqYXJnX2l0ZXIpLT5nZXRfZG9jKCkuZW1wdHkoKSkKKyAgICAgICAgaGFzX2RvY3MgPSB0cnVlOworICAgIH0KKyAgICBpZiAoaGFzX2RvY3MpIHsKKyAgICAgIGFyZ19pdGVyID0gYXJncy5iZWdpbigpOworICAgICAgZl9vdXRfIDw8ICI8YnIvPjxoNCBpZD1cIlBhcmFtZXRlcnNfIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICA8PCAiXCI+UGFyYW1ldGVyczwvaDQ+IiA8PCBlbmRsOworICAgICAgZl9vdXRfIDw8ICI8dGFibGUgY2xhc3M9XCJ0YWJsZS1ib3JkZXJlZCB0YWJsZS1zdHJpcGVkIHRhYmxlLWNvbmRlbnNlZFwiPiI7CisgICAgICBmX291dF8gPDwgIjx0aGVhZD48dGg+TmFtZTwvdGg+PHRoPkRlc2NyaXB0aW9uPC90aD48L3RoZWFkPiI7CisgICAgICBmb3IgKDsgYXJnX2l0ZXIgIT0gYXJncy5lbmQoKTsgYXJnX2l0ZXIrKykgeworICAgICAgICBmX291dF8gPDwgIjx0cj48dGQ+IiA8PCAoKmFyZ19pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgICAgZl9vdXRfIDw8ICI8L3RkPjx0ZD4iOworICAgICAgICBmX291dF8gPDwgZXNjYXBlX2h0bWwoKCphcmdfaXRlciktPmdldF9kb2MoKSk7CisgICAgICAgIGZfb3V0XyA8PCAiPC90ZD48L3RyPiIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGZfb3V0XyA8PCAiPC90YWJsZT4iOworICAgIH0KKyAgfQorCisgIGhhc19kb2NzID0gZmFsc2U7CisgIHZlY3Rvcjx0X2ZpZWxkKj4gZXhjZXB0cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+OjppdGVyYXRvciBleF9pdGVyID0gZXhjZXB0cy5iZWdpbigpOworICBpZiAoZXhfaXRlciAhPSBleGNlcHRzLmVuZCgpKSB7CisgICAgZm9yICg7IGV4X2l0ZXIgIT0gZXhjZXB0cy5lbmQoKTsgZXhfaXRlcisrKSB7CisgICAgICBpZiAoKCpleF9pdGVyKS0+aGFzX2RvYygpICYmICEoKmV4X2l0ZXIpLT5nZXRfZG9jKCkuZW1wdHkoKSkKKyAgICAgICAgaGFzX2RvY3MgPSB0cnVlOworICAgIH0KKyAgICBpZiAoaGFzX2RvY3MpIHsKKyAgICAgIGV4X2l0ZXIgPSBleGNlcHRzLmJlZ2luKCk7CisgICAgICBmX291dF8gPDwgIjxici8+PGg0IGlkPVwiRXhjZXB0aW9uc18iIDw8IHNlcnZpY2VfbmFtZV8gPDwgIl8iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgIDw8ICJcIj5FeGNlcHRpb25zPC9oND4iIDw8IGVuZGw7CisgICAgICBmX291dF8gPDwgIjx0YWJsZSBjbGFzcz1cInRhYmxlLWJvcmRlcmVkIHRhYmxlLXN0cmlwZWQgdGFibGUtY29uZGVuc2VkXCI+IjsKKyAgICAgIGZfb3V0XyA8PCAiPHRoZWFkPjx0aD5UeXBlPC90aD48dGg+RGVzY3JpcHRpb248L3RoPjwvdGhlYWQ+IjsKKyAgICAgIGZvciAoOyBleF9pdGVyICE9IGV4Y2VwdHMuZW5kKCk7IGV4X2l0ZXIrKykgeworICAgICAgICBmX291dF8gPDwgIjx0cj48dGQ+IiA8PCAoKmV4X2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpOworICAgICAgICBmX291dF8gPDwgIjwvdGQ+PHRkPiI7CisgICAgICAgIGZfb3V0XyA8PCBlc2NhcGVfaHRtbCgoKmV4X2l0ZXIpLT5nZXRfZG9jKCkpOworICAgICAgICBmX291dF8gPDwgIjwvdGQ+PC90cj4iIDw8IGVuZGw7CisgICAgICB9CisgICAgICBmX291dF8gPDwgIjwvdGFibGU+IjsKKyAgICB9CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSB0eXBlZGVmLgorICoKKyAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9odG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7CisgIHN0cmluZyBuYW1lID0gdHR5cGVkZWYtPmdldF9uYW1lKCk7CisgIGZfb3V0XyA8PCAiPGRpdiBjbGFzcz1cImRlZmluaXRpb25cIj4iOworICBmX291dF8gPDwgIjxoMyBpZD1cIlR5cGVkZWZfIiA8PCBuYW1lIDw8ICJcIj5UeXBlZGVmOiAiIDw8IG5hbWUgPDwgIjwvaDM+IiA8PCBlbmRsOworICBmX291dF8gPDwgIjxwPjxzdHJvbmc+QmFzZSB0eXBlOjwvc3Ryb25nPiZuYnNwOyI7CisgIHByaW50X3R5cGUodHR5cGVkZWYtPmdldF90eXBlKCkpOworICBmX291dF8gPDwgIjwvcD4iIDw8IGVuZGw7CisgIHByaW50X2RvYyh0dHlwZWRlZik7CisgIGZfb3V0XyA8PCAiPC9kaXY+IiA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBjb2RlIGZvciBhbiBlbnVtZXJhdGVkIHR5cGUuCisgKgorICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgorICovCit2b2lkIHRfaHRtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgeworICBzdHJpbmcgbmFtZSA9IHRlbnVtLT5nZXRfbmFtZSgpOworICBmX291dF8gPDwgIjxkaXYgY2xhc3M9XCJkZWZpbml0aW9uXCI+IjsKKyAgZl9vdXRfIDw8ICI8aDMgaWQ9XCJFbnVtXyIgPDwgbmFtZSA8PCAiXCI+RW51bWVyYXRpb246ICIgPDwgbmFtZSA8PCAiPC9oMz4iIDw8IGVuZGw7CisgIHByaW50X2RvYyh0ZW51bSk7CisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiB2YWx1ZXMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIHZhbF9pdGVyOworICBmX291dF8gPDwgIjxici8+PHRhYmxlIGNsYXNzPVwidGFibGUtYm9yZGVyZWQgdGFibGUtc3RyaXBlZCB0YWJsZS1jb25kZW5zZWRcIj4iIDw8IGVuZGw7CisgIGZvciAodmFsX2l0ZXIgPSB2YWx1ZXMuYmVnaW4oKTsgdmFsX2l0ZXIgIT0gdmFsdWVzLmVuZCgpOyArK3ZhbF9pdGVyKSB7CisgICAgZl9vdXRfIDw8ICI8dHI+PHRkPjxjb2RlPiI7CisgICAgZl9vdXRfIDw8ICgqdmFsX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIGZfb3V0XyA8PCAiPC9jb2RlPjwvdGQ+PHRkPjxjb2RlPiI7CisgICAgZl9vdXRfIDw8ICgqdmFsX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgICBmX291dF8gPDwgIjwvY29kZT48L3RkPjx0ZD4iIDw8IGVuZGw7CisgICAgcHJpbnRfZG9jKCgqdmFsX2l0ZXIpKTsKKyAgICBmX291dF8gPDwgIjwvdGQ+PC90cj4iIDw8IGVuZGw7CisgIH0KKyAgZl9vdXRfIDw8ICI8L3RhYmxlPjwvZGl2PiIgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBjb25zdGFudCB2YWx1ZQorICovCit2b2lkIHRfaHRtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCkgeworICBzdHJpbmcgbmFtZSA9IHRjb25zdC0+Z2V0X25hbWUoKTsKKyAgZl9vdXRfIDw8ICI8dHIgaWQ9XCJDb25zdF8iIDw8IG5hbWUgPDwgIlwiPjx0ZD48Y29kZT4iIDw8IG5hbWUgPDwgIjwvY29kZT48L3RkPjx0ZD4iOworICBwcmludF90eXBlKHRjb25zdC0+Z2V0X3R5cGUoKSk7CisgIGZfb3V0XyA8PCAiPC90ZD48dGQ+PGNvZGU+IjsKKyAgcHJpbnRfY29uc3RfdmFsdWUodGNvbnN0LT5nZXRfdHlwZSgpLCB0Y29uc3QtPmdldF92YWx1ZSgpKTsKKyAgZl9vdXRfIDw8ICI8L2NvZGU+PC90ZD48L3RyPiI7CisgIGlmICh0Y29uc3QtPmhhc19kb2MoKSkgeworICAgIGZfb3V0XyA8PCAiPHRyPjx0ZCBjb2xzcGFuPVwiM1wiPjxibG9ja3F1b3RlPiI7CisgICAgcHJpbnRfZG9jKHRjb25zdCk7CisgICAgZl9vdXRfIDw8ICI8L2Jsb2NrcXVvdGU+PC90ZD48L3RyPiI7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZGF0YSB0eXBlLgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfaHRtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgIGZfb3V0XyA8PCAiPGRpdiBjbGFzcz1cImRlZmluaXRpb25cIj4iOworICBmX291dF8gPDwgIjxoMyBpZD1cIlN0cnVjdF8iIDw8IG5hbWUgPDwgIlwiPiI7CisgIGlmICh0c3RydWN0LT5pc194Y2VwdGlvbigpKSB7CisgICAgZl9vdXRfIDw8ICJFeGNlcHRpb246ICI7CisgIH0gZWxzZSBpZiAodHN0cnVjdC0+aXNfdW5pb24oKSkgeworICAgIGZfb3V0XyA8PCAiVW5pb246ICI7CisgIH0gZWxzZSB7CisgICAgZl9vdXRfIDw8ICJTdHJ1Y3Q6ICI7CisgIH0KKyAgZl9vdXRfIDw8IG5hbWUgPDwgIjwvaDM+IiA8PCBlbmRsOworICB2ZWN0b3I8dF9maWVsZCo+IG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+OjppdGVyYXRvciBtZW1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsKKyAgZl9vdXRfIDw8ICI8dGFibGUgY2xhc3M9XCJ0YWJsZS1ib3JkZXJlZCB0YWJsZS1zdHJpcGVkIHRhYmxlLWNvbmRlbnNlZFwiPiI7CisgIGZfb3V0XyA8PCAiPHRoZWFkPjx0aD5LZXk8L3RoPjx0aD5GaWVsZDwvdGg+PHRoPlR5cGU8L3RoPjx0aD5EZXNjcmlwdGlvbjwvdGg+PHRoPlJlcXVpcmVkbmVzczwvIgorICAgICAgICAgICAgInRoPjx0aD5EZWZhdWx0IHZhbHVlPC90aD48L3RoZWFkPiIgPDwgZW5kbDsKKyAgZm9yICg7IG1lbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7IG1lbV9pdGVyKyspIHsKKyAgICBmX291dF8gPDwgIjx0cj48dGQ+IiA8PCAoKm1lbV9pdGVyKS0+Z2V0X2tleSgpIDw8ICI8L3RkPjx0ZD4iOworICAgIGZfb3V0XyA8PCAoKm1lbV9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICBmX291dF8gPDwgIjwvdGQ+PHRkPiI7CisgICAgcHJpbnRfdHlwZSgoKm1lbV9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgZl9vdXRfIDw8ICI8L3RkPjx0ZD4iOworICAgIGZfb3V0XyA8PCBlc2NhcGVfaHRtbCgoKm1lbV9pdGVyKS0+Z2V0X2RvYygpKTsKKyAgICBmX291dF8gPDwgIjwvdGQ+PHRkPiI7CisgICAgaWYgKCgqbWVtX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTCkgeworICAgICAgZl9vdXRfIDw8ICJvcHRpb25hbCI7CisgICAgfSBlbHNlIGlmICgoKm1lbV9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgIGZfb3V0XyA8PCAicmVxdWlyZWQiOworICAgIH0gZWxzZSB7CisgICAgICBmX291dF8gPDwgImRlZmF1bHQiOworICAgIH0KKyAgICBmX291dF8gPDwgIjwvdGQ+PHRkPiI7CisgICAgdF9jb25zdF92YWx1ZSogZGVmYXVsdF92YWwgPSAoKm1lbV9pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgICAgaWYgKGRlZmF1bHRfdmFsICE9IE5VTEwpIHsKKyAgICAgIGZfb3V0XyA8PCAiPGNvZGU+IjsKKyAgICAgIHByaW50X2NvbnN0X3ZhbHVlKCgqbWVtX2l0ZXIpLT5nZXRfdHlwZSgpLCBkZWZhdWx0X3ZhbCk7CisgICAgICBmX291dF8gPDwgIjwvY29kZT4iOworICAgIH0KKyAgICBmX291dF8gPDwgIjwvdGQ+PC90cj4iIDw8IGVuZGw7CisgIH0KKyAgZl9vdXRfIDw8ICI8L3RhYmxlPjxici8+IjsKKyAgcHJpbnRfZG9jKHRzdHJ1Y3QpOworICBmX291dF8gPDwgIjwvZGl2PiI7Cit9CisKKy8qKgorICogRXhjZXB0aW9ucyBhcmUgc3BlY2lhbCBzdHJ1Y3RzCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9odG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgeworICBnZW5lcmF0ZV9zdHJ1Y3QodHhjZXB0aW9uKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgdGhlIEhUTUwgYmxvY2sgZm9yIGEgVGhyaWZ0IHNlcnZpY2UuCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGRlZmluaXRpb24KKyAqLwordm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgZl9vdXRfIDw8ICI8aDMgaWQ9XCJTdmNfIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJcIj5TZXJ2aWNlOiAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIjwvaDM+IiA8PCBlbmRsOworCisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSkgeworICAgIGZfb3V0XyA8PCAiPGRpdiBjbGFzcz1cImV4dGVuZHNcIj48ZW0+ZXh0ZW5kczwvZW0+ICI7CisgICAgcHJpbnRfdHlwZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7CisgICAgZl9vdXRfIDw8ICI8L2Rpdj5cbiI7CisgIH0KKyAgcHJpbnRfZG9jKHRzZXJ2aWNlKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmbl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7CisgIGZvciAoOyBmbl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgZm5faXRlcisrKSB7CisgICAgc3RyaW5nIGZuX25hbWUgPSAoKmZuX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIGZfb3V0XyA8PCAiPGRpdiBjbGFzcz1cImRlZmluaXRpb25cIj4iOworICAgIGZfb3V0XyA8PCAiPGg0IGlkPVwiRm5fIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJfIiA8PCBmbl9uYW1lIDw8ICJcIj5GdW5jdGlvbjogIiA8PCBzZXJ2aWNlX25hbWVfCisgICAgICAgICAgIDw8ICIuIiA8PCBmbl9uYW1lIDw8ICI8L2g0PiIgPDwgZW5kbDsKKyAgICBmX291dF8gPDwgIjxwcmU+IjsKKyAgICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIG9mZnNldCA9IHByaW50X3R5cGUoKCpmbl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSk7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZl9vdXRfIDw8ICIgIiA8PCBmbl9uYW1lIDw8ICIoIjsKKyAgICBvZmZzZXQgKz0gZm5fbmFtZS5zaXplKCkgKyAyOworICAgIHZlY3Rvcjx0X2ZpZWxkKj4gYXJncyA9ICgqZm5faXRlciktPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6aXRlcmF0b3IgYXJnX2l0ZXIgPSBhcmdzLmJlZ2luKCk7CisgICAgZm9yICg7IGFyZ19pdGVyICE9IGFyZ3MuZW5kKCk7IGFyZ19pdGVyKyspIHsKKyAgICAgIGlmICghZmlyc3QpIHsKKyAgICAgICAgZl9vdXRfIDw8ICIsIiA8PCBlbmRsOworICAgICAgICBmb3IgKHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgaSA9IDA7IGkgPCBvZmZzZXQ7ICsraSkgeworICAgICAgICAgIGZfb3V0XyA8PCAiICI7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICBwcmludF90eXBlKCgqYXJnX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICAgIGZfb3V0XyA8PCAiICIgPDwgKCphcmdfaXRlciktPmdldF9uYW1lKCk7CisgICAgICBpZiAoKCphcmdfaXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKKyAgICAgICAgZl9vdXRfIDw8ICIgPSAiOworICAgICAgICBwcmludF9jb25zdF92YWx1ZSgoKmFyZ19pdGVyKS0+Z2V0X3R5cGUoKSwgKCphcmdfaXRlciktPmdldF92YWx1ZSgpKTsKKyAgICAgIH0KKyAgICB9CisgICAgZl9vdXRfIDw8ICIpIiA8PCBlbmRsOworICAgIGZpcnN0ID0gdHJ1ZTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+IGV4Y2VwdHMgPSAoKmZuX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6aXRlcmF0b3IgZXhfaXRlciA9IGV4Y2VwdHMuYmVnaW4oKTsKKyAgICBpZiAoZXhfaXRlciAhPSBleGNlcHRzLmVuZCgpKSB7CisgICAgICBmX291dF8gPDwgIiAgICB0aHJvd3MgIjsKKyAgICAgIGZvciAoOyBleF9pdGVyICE9IGV4Y2VwdHMuZW5kKCk7IGV4X2l0ZXIrKykgeworICAgICAgICBpZiAoIWZpcnN0KSB7CisgICAgICAgICAgZl9vdXRfIDw8ICIsICI7CisgICAgICAgIH0KKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgcHJpbnRfdHlwZSgoKmV4X2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICAgIH0KKyAgICAgIGZfb3V0XyA8PCBlbmRsOworICAgIH0KKyAgICBmX291dF8gPDwgIjwvcHJlPiI7CisgICAgcHJpbnRfZG9jKCpmbl9pdGVyKTsKKyAgICBwcmludF9mbl9hcmdzX2RvYygqZm5faXRlcik7CisgICAgZl9vdXRfIDw8ICI8L2Rpdj4iOworICB9Cit9CisKK1RIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoCisgICAgaHRtbCwKKyAgICAiSFRNTCIsCisgICAgIiAgICBzdGFuZGFsb25lOiAgICAgIFNlbGYtY29udGFpbmVkIG1vZGUsIGluY2x1ZGVzIGFsbCBDU1MgaW4gdGhlIEhUTUwgZmlsZXMuXG4iCisgICAgIiAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlcyBubyBzdHlsZS5jc3MgZmlsZSwgYnV0IEhUTUwgZmlsZXMgd2lsbCBiZSBsYXJnZXIuXG4iCisgICAgIiAgICBub2VzY2FwZTogICAgICAgIERvIG5vdCBlc2NhcGUgaHRtbCBpbiBkb2MgdGV4dC5cbiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2h0bWxfZ2VuZXJhdG9yLmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2h0bWxfZ2VuZXJhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjAwYjE3ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfaHRtbF9nZW5lcmF0b3IuaApAQCAtMCwwICsxLDI0MCBAQAorI2RlZmluZSBCT09UU1RSQVBfQ1NTKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLyohXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiICogQm9vdHN0cmFwIHYyLjAuM1xuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiICpcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiICogQ29weXJpZ2h0IDIwMTIgVHdpdHRlciwgSW5jXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlIHYyLjBcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiICpcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiICogRGVzaWduZWQgYW5kIGJ1aWx0IHdpdGggYWxsIHRoZSBsb3ZlIGluIHRoZSB3b3JsZCBAdHdpdHRlciBieSBAbWRvIGFuZCBAZmF0LlxuIiAgICAgICAgICAgICAgXAorICAiICovXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLmNsZWFyZml4eyp6b29tOjE7fS5jbGVhcmZpeDpiZWZvcmUsLmNsZWFyZml4OmFmdGVye2Rpc3BsYXk6dGFibGU7Y29udGVudDpcIlwiO31cbiIgICAgICAgICAgICAgXAorICAiLmNsZWFyZml4OmFmdGVye2NsZWFyOmJvdGg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLmhpZGUtdGV4dHtmb250OjAvMCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiYTtjb2xvcjp0cmFuc3BhcmVudDt0ZXh0LXNoYWRvdzpub25lO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7Ym9yZGVyOjA7fVxuIiAgICAgICAgICAgICAgICAgXAorICAiLmlucHV0LWJsb2NrLWxldmVse2Rpc3BsYXk6YmxvY2s7d2lkdGg6MTAwJTttaW4taGVpZ2h0OjI4cHg7LXdlYmtpdC1ib3gtc2l6aW5nOmJvcmRlci1ib3g7LSIgICAgXAorICAibW96LWJveC1zaXppbmc6Ym9yZGVyLWJveDstbXMtYm94LXNpemluZzpib3JkZXItYm94O2JveC1zaXppbmc6Ym9yZGVyLWJveDt9XG4iICAgICAgICAgICAgICAgICAgXAorICAiYXJ0aWNsZSxhc2lkZSxkZXRhaWxzLGZpZ2NhcHRpb24sZmlndXJlLGZvb3RlcixoZWFkZXIsaGdyb3VwLG5hdixzZWN0aW9ue2Rpc3BsYXk6YmxvY2s7fVxuIiAgICAgXAorICAiYXVkaW8sY2FudmFzLHZpZGVve2Rpc3BsYXk6aW5saW5lLWJsb2NrOypkaXNwbGF5OmlubGluZTsqem9vbToxO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiYXVkaW86bm90KFtjb250cm9sc10pe2Rpc3BsYXk6bm9uZTt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiaHRtbHtmb250LXNpemU6MTAwJTstd2Via2l0LXRleHQtc2l6ZS1hZGp1c3Q6MTAwJTstbXMtdGV4dC1zaXplLWFkanVzdDoxMDAlO31cbiIgICAgICAgICAgICAgICAgXAorICAiYTpmb2N1c3tvdXRsaW5lOnRoaW4gZG90dGVkICMzMzM7b3V0bGluZTo1cHggYXV0byAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLXdlYmtpdC1mb2N1cy1yaW5nLWNvbG9yO291dGxpbmUtb2Zmc2V0Oi0ycHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiYTpob3ZlcixhOmFjdGl2ZXtvdXRsaW5lOjA7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAic3ViLHN1cHtwb3NpdGlvbjpyZWxhdGl2ZTtmb250LXNpemU6NzUlO2xpbmUtaGVpZ2h0OjA7dmVydGljYWwtYWxpZ246YmFzZWxpbmU7fVxuIiAgICAgICAgICAgICAgXAorICAic3Vwe3RvcDotMC41ZW07fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAic3Vie2JvdHRvbTotMC4yNWVtO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiaW1ne21heC13aWR0aDoxMDAlO3ZlcnRpY2FsLWFsaWduOm1pZGRsZTtib3JkZXI6MDstbXMtaW50ZXJwb2xhdGlvbi1tb2RlOmJpY3ViaWM7fVxuIiAgICAgICAgICAgXAorICAiYnV0dG9uLGlucHV0LHNlbGVjdCx0ZXh0YXJlYXttYXJnaW46MDtmb250LXNpemU6MTAwJTt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7fVxuIiAgICAgICAgICAgICAgICAgXAorICAiYnV0dG9uLGlucHV0eypvdmVyZmxvdzp2aXNpYmxlO2xpbmUtaGVpZ2h0Om5vcm1hbDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiYnV0dG9uOjotbW96LWZvY3VzLWlubmVyLGlucHV0OjotbW96LWZvY3VzLWlubmVye3BhZGRpbmc6MDtib3JkZXI6MDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiYnV0dG9uLGlucHV0W3R5cGU9XCJidXR0b25cIl0saW5wdXRbdHlwZT1cInJlc2V0XCJdLGlucHV0W3R5cGU9XCJzdWJtaXRcIl17Y3Vyc29yOnBvaW50ZXI7LSIgICAgXAorICAid2Via2l0LWFwcGVhcmFuY2U6YnV0dG9uO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiaW5wdXRbdHlwZT1cInNlYXJjaFwiXXstd2Via2l0LWJveC1zaXppbmc6Y29udGVudC1ib3g7LW1vei1ib3gtc2l6aW5nOmNvbnRlbnQtYm94O2JveC1zaXppbmc6IiAgXAorICAiY29udGVudC1ib3g7LXdlYmtpdC1hcHBlYXJhbmNlOnRleHRmaWVsZDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiaW5wdXRbdHlwZT1cInNlYXJjaFwiXTo6LXdlYmtpdC1zZWFyY2gtZGVjb3JhdGlvbixpbnB1dFt0eXBlPVwic2VhcmNoXCJdOjotd2Via2l0LXNlYXJjaC0iICAgICAgXAorICAiY2FuY2VsLWJ1dHRvbnstd2Via2l0LWFwcGVhcmFuY2U6bm9uZTt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGV4dGFyZWF7b3ZlcmZsb3c6YXV0bzt2ZXJ0aWNhbC1hbGlnbjp0b3A7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiYm9keXttYXJnaW46MDtmb250LWZhbWlseTpcIkhlbHZldGljYSAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiTmV1ZVwiLEhlbHZldGljYSxBcmlhbCxzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxM3B4O2xpbmUtaGVpZ2h0OjE4cHg7Y29sb3I6IzMzMzMzMztiYWNrZ3JvdW5kLSIgICAgXAorICAiY29sb3I6I2ZmZmZmZjt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiYXtjb2xvcjojMDA4OGNjO3RleHQtZGVjb3JhdGlvbjpub25lO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiYTpob3Zlcntjb2xvcjojMDA1NTgwO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnJvd3ttYXJnaW4tbGVmdDotMjBweDsqem9vbToxO30ucm93OmJlZm9yZSwucm93OmFmdGVye2Rpc3BsYXk6dGFibGU7Y29udGVudDpcIlwiO31cbiIgICAgICAgICAgXAorICAiLnJvdzphZnRlcntjbGVhcjpib3RoO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiW2NsYXNzKj1cInNwYW5cIl17ZmxvYXQ6bGVmdDttYXJnaW4tbGVmdDoyMHB4O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLmNvbnRhaW5lciwubmF2YmFyLWZpeGVkLXRvcCAuY29udGFpbmVyLC5uYXZiYXItZml4ZWQtYm90dG9tIC5jb250YWluZXJ7d2lkdGg6OTQwcHg7fVxuIiAgICAgICAgXAorICAiLnNwYW4xMnt3aWR0aDo5NDBweDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnNwYW4xMXt3aWR0aDo4NjBweDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnNwYW4xMHt3aWR0aDo3ODBweDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnNwYW45e3dpZHRoOjcwMHB4O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnNwYW44e3dpZHRoOjYyMHB4O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnNwYW43e3dpZHRoOjU0MHB4O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnNwYW42e3dpZHRoOjQ2MHB4O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnNwYW41e3dpZHRoOjM4MHB4O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnNwYW40e3dpZHRoOjMwMHB4O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnNwYW4ze3dpZHRoOjIyMHB4O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnNwYW4ye3dpZHRoOjE0MHB4O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnNwYW4xe3dpZHRoOjYwcHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLm9mZnNldDEye21hcmdpbi1sZWZ0Ojk4MHB4O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLm9mZnNldDExe21hcmdpbi1sZWZ0OjkwMHB4O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLm9mZnNldDEwe21hcmdpbi1sZWZ0OjgyMHB4O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLm9mZnNldDl7bWFyZ2luLWxlZnQ6NzQwcHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLm9mZnNldDh7bWFyZ2luLWxlZnQ6NjYwcHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLm9mZnNldDd7bWFyZ2luLWxlZnQ6NTgwcHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLm9mZnNldDZ7bWFyZ2luLWxlZnQ6NTAwcHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLm9mZnNldDV7bWFyZ2luLWxlZnQ6NDIwcHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLm9mZnNldDR7bWFyZ2luLWxlZnQ6MzQwcHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLm9mZnNldDN7bWFyZ2luLWxlZnQ6MjYwcHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLm9mZnNldDJ7bWFyZ2luLWxlZnQ6MTgwcHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLm9mZnNldDF7bWFyZ2luLWxlZnQ6MTAwcHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnJvdy1mbHVpZHt3aWR0aDoxMDAlOyp6b29tOjE7fS5yb3ctZmx1aWQ6YmVmb3JlLC5yb3ctZmx1aWQ6YWZ0ZXJ7ZGlzcGxheTp0YWJsZTtjb250ZW50OlwiXCI7fSIgXAorICAiXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnJvdy1mbHVpZDphZnRlcntjbGVhcjpib3RoO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnJvdy1mbHVpZCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiW2NsYXNzKj1cInNwYW5cIl17ZGlzcGxheTpibG9jazt3aWR0aDoxMDAlO21pbi1oZWlnaHQ6MjhweDstd2Via2l0LWJveC1zaXppbmc6Ym9yZGVyLWJveDstbW96LSIgXAorICAiYm94LXNpemluZzpib3JkZXItYm94Oy1tcy1ib3gtc2l6aW5nOmJvcmRlci1ib3g7Ym94LXNpemluZzpib3JkZXItYm94O2Zsb2F0OmxlZnQ7bWFyZ2luLWxlZnQ6IiAgXAorICAiMi4xMjc2NTk1NzQlOyptYXJnaW4tbGVmdDoyLjA3NDQ2ODA4NDYzODI5NzclO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnJvdy1mbHVpZCBbY2xhc3MqPVwic3BhblwiXTpmaXJzdC1jaGlsZHttYXJnaW4tbGVmdDowO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnJvdy1mbHVpZCAuc3BhbjEye3dpZHRoOjk5Ljk5OTk5OTk4OTk5OTk5JTsqd2lkdGg6OTkuOTQ2ODA4NTAwNjM4MjglO31cbiIgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnJvdy1mbHVpZCAuc3BhbjExe3dpZHRoOjkxLjQ4OTM2MTY5MyU7KndpZHRoOjkxLjQzNjE3MDIwMzYzODMlO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnJvdy1mbHVpZCAuc3BhbjEwe3dpZHRoOjgyLjk3ODcyMzM5NTk5OTk5JTsqd2lkdGg6ODIuOTI1NTMxOTA2NjM4MjglO31cbiIgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnJvdy1mbHVpZCAuc3Bhbjl7d2lkdGg6NzQuNDY4MDg1MDk5JTsqd2lkdGg6NzQuNDE0ODkzNjA5NjM4MyU7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnJvdy1mbHVpZCAuc3Bhbjh7d2lkdGg6NjUuOTU3NDQ2ODAxOTk5OTklOyp3aWR0aDo2NS45MDQyNTUzMTI2MzgyOCU7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnJvdy1mbHVpZCAuc3Bhbjd7d2lkdGg6NTcuNDQ2ODA4NTA1JTsqd2lkdGg6NTcuMzkzNjE3MDE1NjM4MyU7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnJvdy1mbHVpZCAuc3BhbjZ7d2lkdGg6NDguOTM2MTcwMjA3OTk5OTklOyp3aWR0aDo0OC44ODI5Nzg3MTg2MzgyOSU7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnJvdy1mbHVpZCAuc3BhbjV7d2lkdGg6NDAuNDI1NTMxOTExJTsqd2lkdGg6NDAuMzcyMzQwNDIxNjM4MyU7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnJvdy1mbHVpZCAuc3BhbjR7d2lkdGg6MzEuOTE0ODkzNjE0JTsqd2lkdGg6MzEuODYxNzAyMTI0NjM4MyU7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnJvdy1mbHVpZCAuc3BhbjN7d2lkdGg6MjMuNDA0MjU1MzE3JTsqd2lkdGg6MjMuMzUxMDYzODI3NjM4MyU7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnJvdy1mbHVpZCAuc3BhbjJ7d2lkdGg6MTQuODkzNjE3MDIlOyp3aWR0aDoxNC44NDA0MjU1MzA2MzgzJTt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnJvdy1mbHVpZCAuc3BhbjF7d2lkdGg6Ni4zODI5Nzg3MjMlOyp3aWR0aDo2LjMyOTc4NzIzMzYzODI5OCU7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLmNvbnRhaW5lcnttYXJnaW4tcmlnaHQ6YXV0bzttYXJnaW4tbGVmdDphdXRvOyp6b29tOjE7fS5jb250YWluZXI6YmVmb3JlLC5jb250YWluZXI6YWZ0ZXJ7IiAgICAgXAorICAiZGlzcGxheTp0YWJsZTtjb250ZW50OlwiXCI7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLmNvbnRhaW5lcjphZnRlcntjbGVhcjpib3RoO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLmNvbnRhaW5lci1mbHVpZHtwYWRkaW5nLXJpZ2h0OjIwcHg7cGFkZGluZy1sZWZ0OjIwcHg7Knpvb206MTt9LmNvbnRhaW5lci1mbHVpZDpiZWZvcmUsLiIgICAgICAgXAorICAiY29udGFpbmVyLWZsdWlkOmFmdGVye2Rpc3BsYXk6dGFibGU7Y29udGVudDpcIlwiO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLmNvbnRhaW5lci1mbHVpZDphZnRlcntjbGVhcjpib3RoO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAicHttYXJnaW46MCAwIDlweDtmb250LWZhbWlseTpcIkhlbHZldGljYSAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiTmV1ZVwiLEhlbHZldGljYSxBcmlhbCxzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxM3B4O2xpbmUtaGVpZ2h0OjE4cHg7fXAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAic21hbGx7Zm9udC1zaXplOjExcHg7Y29sb3I6Izk5OTk5OTt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLmxlYWR7bWFyZ2luLWJvdHRvbToxOHB4O2ZvbnQtc2l6ZToyMHB4O2ZvbnQtd2VpZ2h0OjIwMDtsaW5lLWhlaWdodDoyN3B4O31cbiIgICAgICAgICAgICAgICAgICAgXAorICAiaDEsaDIsaDMsaDQsaDUsaDZ7bWFyZ2luOjA7Zm9udC1mYW1pbHk6aW5oZXJpdDtmb250LXdlaWdodDpib2xkO2NvbG9yOmluaGVyaXQ7dGV4dC1yZW5kZXJpbmc6IiAgXAorICAib3B0aW1pemVsZWdpYmlsaXR5O31oMSBzbWFsbCxoMiBzbWFsbCxoMyBzbWFsbCxoNCBzbWFsbCxoNSBzbWFsbCxoNiAiICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAic21hbGx7Zm9udC13ZWlnaHQ6bm9ybWFsO2NvbG9yOiM5OTk5OTk7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiaDF7Zm9udC1zaXplOjMwcHg7bGluZS1oZWlnaHQ6MzZweDt9aDEgc21hbGx7Zm9udC1zaXplOjE4cHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiaDJ7Zm9udC1zaXplOjI0cHg7bGluZS1oZWlnaHQ6MzZweDt9aDIgc21hbGx7Zm9udC1zaXplOjE4cHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiaDN7Zm9udC1zaXplOjE4cHg7bGluZS1oZWlnaHQ6MjdweDt9aDMgc21hbGx7Zm9udC1zaXplOjE0cHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiaDQsaDUsaDZ7bGluZS1oZWlnaHQ6MThweDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiaDR7Zm9udC1zaXplOjE0cHg7fWg0IHNtYWxse2ZvbnQtc2l6ZToxMnB4O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiaDV7Zm9udC1zaXplOjEycHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiaDZ7Zm9udC1zaXplOjExcHg7Y29sb3I6Izk5OTk5OTt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnBhZ2UtaGVhZGVye3BhZGRpbmctYm90dG9tOjE3cHg7bWFyZ2luOjE4cHggMDtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZWVlZWVlO31cbiIgICAgICAgICAgICAgXAorICAiLnBhZ2UtaGVhZGVyIGgxe2xpbmUtaGVpZ2h0OjE7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidWwsb2x7cGFkZGluZzowO21hcmdpbjowIDAgOXB4IDI1cHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidWwgdWwsdWwgb2wsb2wgb2wsb2wgdWx7bWFyZ2luLWJvdHRvbTowO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidWx7bGlzdC1zdHlsZTpkaXNjO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAib2x7bGlzdC1zdHlsZTpkZWNpbWFsO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAibGl7bGluZS1oZWlnaHQ6MThweDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidWwudW5zdHlsZWQsb2wudW5zdHlsZWR7bWFyZ2luLWxlZnQ6MDtsaXN0LXN0eWxlOm5vbmU7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiZGx7bWFyZ2luLWJvdHRvbToxOHB4O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiZHQsZGR7bGluZS1oZWlnaHQ6MThweDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiZHR7Zm9udC13ZWlnaHQ6Ym9sZDtsaW5lLWhlaWdodDoxN3B4O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiZGR7bWFyZ2luLWxlZnQ6OXB4O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLmRsLWhvcml6b250YWwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiZHR7ZmxvYXQ6bGVmdDt3aWR0aDoxMjBweDtjbGVhcjpsZWZ0O3RleHQtYWxpZ246cmlnaHQ7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7IiAgXAorICAid2hpdGUtc3BhY2U6bm93cmFwO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLmRsLWhvcml6b250YWwgZGR7bWFyZ2luLWxlZnQ6MTMwcHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiaHJ7bWFyZ2luOjE4cHggMDtib3JkZXI6MDtib3JkZXItdG9wOjFweCBzb2xpZCAjZWVlZWVlO2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNmZmZmZmY7fVxuIiAgICAgXAorICAic3Ryb25ne2ZvbnQtd2VpZ2h0OmJvbGQ7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiZW17Zm9udC1zdHlsZTppdGFsaWM7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLm11dGVke2NvbG9yOiM5OTk5OTk7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiYWJiclt0aXRsZV17Y3Vyc29yOmhlbHA7Ym9yZGVyLWJvdHRvbToxcHggZG90dGVkICNkZGQ7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiYWJici5pbml0aWFsaXNte2ZvbnQtc2l6ZTo5MCU7dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiYmxvY2txdW90ZXtwYWRkaW5nOjAgMCAwIDE1cHg7bWFyZ2luOjAgMCAxOHB4O2JvcmRlci1sZWZ0OjVweCBzb2xpZCAjZWVlZWVlO31ibG9ja3F1b3RlICIgICAgICAgXAorICAicHttYXJnaW4tYm90dG9tOjA7Zm9udC1zaXplOjE2cHg7Zm9udC13ZWlnaHQ6MzAwO2xpbmUtaGVpZ2h0OjIyLjVweDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiYmxvY2txdW90ZSBzbWFsbHtkaXNwbGF5OmJsb2NrO2xpbmUtaGVpZ2h0OjE4cHg7Y29sb3I6Izk5OTk5OTt9YmxvY2txdW90ZSAiICAgICAgICAgICAgICAgICAgICAgXAorICAic21hbGw6YmVmb3Jle2NvbnRlbnQ6J1xcMjAxNCBcXDAwQTAnO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiYmxvY2txdW90ZS5wdWxsLXJpZ2h0e2Zsb2F0OnJpZ2h0O3BhZGRpbmctcmlnaHQ6MTVweDtwYWRkaW5nLWxlZnQ6MDtib3JkZXItcmlnaHQ6NXB4IHNvbGlkICIgICAgXAorICAiI2VlZWVlZTtib3JkZXItbGVmdDowO31ibG9ja3F1b3RlLnB1bGwtcmlnaHQgcCxibG9ja3F1b3RlLnB1bGwtcmlnaHQgIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAic21hbGx7dGV4dC1hbGlnbjpyaWdodDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAicTpiZWZvcmUscTphZnRlcixibG9ja3F1b3RlOmJlZm9yZSxibG9ja3F1b3RlOmFmdGVye2NvbnRlbnQ6XCJcIjt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiYWRkcmVzc3tkaXNwbGF5OmJsb2NrO21hcmdpbi1ib3R0b206MThweDtmb250LXN0eWxlOm5vcm1hbDtsaW5lLWhlaWdodDoxOHB4O31cbiIgICAgICAgICAgICAgICAgXAorICAic21hbGx7Zm9udC1zaXplOjEwMCU7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiY2l0ZXtmb250LXN0eWxlOm5vcm1hbDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiY29kZSxwcmV7cGFkZGluZzowIDNweCAycHg7Zm9udC1mYW1pbHk6TWVubG8sTW9uYWNvLENvbnNvbGFzLFwiQ291cmllciAiICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiTmV3XCIsbW9ub3NwYWNlO2ZvbnQtc2l6ZToxMnB4O2NvbG9yOiMzMzMzMzM7LXdlYmtpdC1ib3JkZXItcmFkaXVzOjNweDstbW96LWJvcmRlci1yYWRpdXM6M3B4OyIgXAorICAiYm9yZGVyLXJhZGl1czozcHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiY29kZXtwYWRkaW5nOjJweCA0cHg7Y29sb3I6I2QxNDtiYWNrZ3JvdW5kLWNvbG9yOiNmN2Y3Zjk7Ym9yZGVyOjFweCBzb2xpZCAjZTFlMWU4O31cbiIgICAgICAgICAgXAorICAicHJle2Rpc3BsYXk6YmxvY2s7cGFkZGluZzo4LjVweDttYXJnaW46MCAwICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiOXB4O2ZvbnQtc2l6ZToxMi4wMjVweDtsaW5lLWhlaWdodDoxOHB4O3dvcmQtYnJlYWs6YnJlYWstYWxsO3dvcmQtd3JhcDpicmVhay13b3JkO3doaXRlLXNwYWNlOiIgXAorICAicHJlO3doaXRlLXNwYWNlOnByZS13cmFwO2JhY2tncm91bmQtY29sb3I6I2Y1ZjVmNTtib3JkZXI6MXB4IHNvbGlkICNjY2M7Ym9yZGVyOjFweCBzb2xpZCAiICAgICAgXAorICAicmdiYSgwLCAwLCAwLCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiMC4xNSk7LXdlYmtpdC1ib3JkZXItcmFkaXVzOjRweDstbW96LWJvcmRlci1yYWRpdXM6NHB4O2JvcmRlci1yYWRpdXM6NHB4O31wcmUucHJldHR5cHJpbnR7IiAgICAgXAorICAibWFyZ2luLWJvdHRvbToxOHB4O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAicHJlIGNvZGV7cGFkZGluZzowO2NvbG9yOmluaGVyaXQ7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDtib3JkZXI6MDt9XG4iICAgICAgICAgICAgICAgICAgICAgXAorICAiLnByZS1zY3JvbGxhYmxle21heC1oZWlnaHQ6MzQwcHg7b3ZlcmZsb3cteTpzY3JvbGw7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLmxhYmVsLC5iYWRnZXtmb250LXNpemU6MTAuOTk4cHg7Zm9udC13ZWlnaHQ6Ym9sZDtsaW5lLWhlaWdodDoxNHB4O2NvbG9yOiNmZmZmZmY7dmVydGljYWwtIiAgICAgXAorICAiYWxpZ246YmFzZWxpbmU7d2hpdGUtc3BhY2U6bm93cmFwO3RleHQtc2hhZG93OjAgLTFweCAwIHJnYmEoMCwgMCwgMCwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiMC4yNSk7YmFja2dyb3VuZC1jb2xvcjojOTk5OTk5O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLmxhYmVse3BhZGRpbmc6MXB4IDRweCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiMnB4Oy13ZWJraXQtYm9yZGVyLXJhZGl1czozcHg7LW1vei1ib3JkZXItcmFkaXVzOjNweDtib3JkZXItcmFkaXVzOjNweDt9XG4iICAgICAgICAgICAgICAgICAgICAgXAorICAiLmJhZGdle3BhZGRpbmc6MXB4IDlweCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiMnB4Oy13ZWJraXQtYm9yZGVyLXJhZGl1czo5cHg7LW1vei1ib3JkZXItcmFkaXVzOjlweDtib3JkZXItcmFkaXVzOjlweDt9XG4iICAgICAgICAgICAgICAgICAgICAgXAorICAiYS5sYWJlbDpob3ZlcixhLmJhZGdlOmhvdmVye2NvbG9yOiNmZmZmZmY7dGV4dC1kZWNvcmF0aW9uOm5vbmU7Y3Vyc29yOnBvaW50ZXI7fVxuIiAgICAgICAgICAgICAgXAorICAiLmxhYmVsLWltcG9ydGFudCwuYmFkZ2UtaW1wb3J0YW50e2JhY2tncm91bmQtY29sb3I6I2I5NGE0ODt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLmxhYmVsLWltcG9ydGFudFtocmVmXSwuYmFkZ2UtaW1wb3J0YW50W2hyZWZde2JhY2tncm91bmQtY29sb3I6Izk1M2IzOTt9XG4iICAgICAgICAgICAgICAgICAgICAgXAorICAiLmxhYmVsLXdhcm5pbmcsLmJhZGdlLXdhcm5pbmd7YmFja2dyb3VuZC1jb2xvcjojZjg5NDA2O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLmxhYmVsLXdhcm5pbmdbaHJlZl0sLmJhZGdlLXdhcm5pbmdbaHJlZl17YmFja2dyb3VuZC1jb2xvcjojYzY3NjA1O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLmxhYmVsLXN1Y2Nlc3MsLmJhZGdlLXN1Y2Nlc3N7YmFja2dyb3VuZC1jb2xvcjojNDY4ODQ3O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLmxhYmVsLXN1Y2Nlc3NbaHJlZl0sLmJhZGdlLXN1Y2Nlc3NbaHJlZl17YmFja2dyb3VuZC1jb2xvcjojMzU2NjM1O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLmxhYmVsLWluZm8sLmJhZGdlLWluZm97YmFja2dyb3VuZC1jb2xvcjojM2E4N2FkO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLmxhYmVsLWluZm9baHJlZl0sLmJhZGdlLWluZm9baHJlZl17YmFja2dyb3VuZC1jb2xvcjojMmQ2OTg3O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLmxhYmVsLWludmVyc2UsLmJhZGdlLWludmVyc2V7YmFja2dyb3VuZC1jb2xvcjojMzMzMzMzO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLmxhYmVsLWludmVyc2VbaHJlZl0sLmJhZGdlLWludmVyc2VbaHJlZl17YmFja2dyb3VuZC1jb2xvcjojMWExYTFhO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGFibGV7bWF4LXdpZHRoOjEwMCU7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDtib3JkZXItY29sbGFwc2U6Y29sbGFwc2U7Ym9yZGVyLXNwYWNpbmc6MDt9IiAgXAorICAiXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnRhYmxle3dpZHRoOjEwMCU7bWFyZ2luLWJvdHRvbToxOHB4O30udGFibGUgdGgsLnRhYmxlICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGR7cGFkZGluZzo4cHg7bGluZS1oZWlnaHQ6MThweDt0ZXh0LWFsaWduOmxlZnQ7dmVydGljYWwtYWxpZ246dG9wO2JvcmRlci10b3A6MXB4IHNvbGlkICIgICAgICAgXAorICAiI2RkZGRkZDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnRhYmxlIHRoe2ZvbnQtd2VpZ2h0OmJvbGQ7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnRhYmxlIHRoZWFkIHRoe3ZlcnRpY2FsLWFsaWduOmJvdHRvbTt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnRhYmxlIGNhcHRpb24rdGhlYWQgdHI6Zmlyc3QtY2hpbGQgdGgsLnRhYmxlIGNhcHRpb24rdGhlYWQgdHI6Zmlyc3QtY2hpbGQgdGQsLnRhYmxlICIgICAgICAgICAgXAorICAiY29sZ3JvdXArdGhlYWQgdHI6Zmlyc3QtY2hpbGQgdGgsLnRhYmxlIGNvbGdyb3VwK3RoZWFkIHRyOmZpcnN0LWNoaWxkIHRkLC50YWJsZSAiICAgICAgICAgICAgICAgXAorICAidGhlYWQ6Zmlyc3QtY2hpbGQgdHI6Zmlyc3QtY2hpbGQgdGgsLnRhYmxlIHRoZWFkOmZpcnN0LWNoaWxkIHRyOmZpcnN0LWNoaWxkICIgICAgICAgICAgICAgICAgICAgXAorICAidGR7Ym9yZGVyLXRvcDowO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnRhYmxlIHRib2R5K3Rib2R5e2JvcmRlci10b3A6MnB4IHNvbGlkICNkZGRkZGQ7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnRhYmxlLWNvbmRlbnNlZCB0aCwudGFibGUtY29uZGVuc2VkIHRke3BhZGRpbmc6NHB4IDVweDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnRhYmxlLWJvcmRlcmVke2JvcmRlcjoxcHggc29saWQgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiI2RkZGRkZDtib3JkZXItY29sbGFwc2U6c2VwYXJhdGU7KmJvcmRlci1jb2xsYXBzZTpjb2xsYXBzZWQ7Ym9yZGVyLWxlZnQ6MDstd2Via2l0LWJvcmRlci0iICAgICAgXAorICAicmFkaXVzOjRweDstbW96LWJvcmRlci1yYWRpdXM6NHB4O2JvcmRlci1yYWRpdXM6NHB4O30udGFibGUtYm9yZGVyZWQgdGgsLnRhYmxlLWJvcmRlcmVkICIgICAgICAgXAorICAidGR7Ym9yZGVyLWxlZnQ6MXB4IHNvbGlkICNkZGRkZGQ7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnRhYmxlLWJvcmRlcmVkIGNhcHRpb24rdGhlYWQgdHI6Zmlyc3QtY2hpbGQgdGgsLnRhYmxlLWJvcmRlcmVkIGNhcHRpb24rdGJvZHkgdHI6Zmlyc3QtY2hpbGQgIiAgXAorICAidGgsLnRhYmxlLWJvcmRlcmVkIGNhcHRpb24rdGJvZHkgdHI6Zmlyc3QtY2hpbGQgdGQsLnRhYmxlLWJvcmRlcmVkIGNvbGdyb3VwK3RoZWFkICIgICAgICAgICAgICAgXAorICAidHI6Zmlyc3QtY2hpbGQgdGgsLnRhYmxlLWJvcmRlcmVkIGNvbGdyb3VwK3Rib2R5IHRyOmZpcnN0LWNoaWxkIHRoLC50YWJsZS1ib3JkZXJlZCAiICAgICAgICAgICAgXAorICAiY29sZ3JvdXArdGJvZHkgdHI6Zmlyc3QtY2hpbGQgdGQsLnRhYmxlLWJvcmRlcmVkIHRoZWFkOmZpcnN0LWNoaWxkIHRyOmZpcnN0LWNoaWxkICIgICAgICAgICAgICAgXAorICAidGgsLnRhYmxlLWJvcmRlcmVkIHRib2R5OmZpcnN0LWNoaWxkIHRyOmZpcnN0LWNoaWxkIHRoLC50YWJsZS1ib3JkZXJlZCB0Ym9keTpmaXJzdC1jaGlsZCAiICAgICAgXAorICAidHI6Zmlyc3QtY2hpbGQgdGR7Ym9yZGVyLXRvcDowO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnRhYmxlLWJvcmRlcmVkIHRoZWFkOmZpcnN0LWNoaWxkIHRyOmZpcnN0LWNoaWxkIHRoOmZpcnN0LWNoaWxkLC50YWJsZS1ib3JkZXJlZCAiICAgICAgICAgICAgICAgXAorICAidGJvZHk6Zmlyc3QtY2hpbGQgdHI6Zmlyc3QtY2hpbGQgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGQ6Zmlyc3QtY2hpbGR7LXdlYmtpdC1ib3JkZXItdG9wLWxlZnQtcmFkaXVzOjRweDtib3JkZXItdG9wLWxlZnQtcmFkaXVzOjRweDstbW96LWJvcmRlci0iICAgICAgXAorICAicmFkaXVzLXRvcGxlZnQ6NHB4O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnRhYmxlLWJvcmRlcmVkIHRoZWFkOmZpcnN0LWNoaWxkIHRyOmZpcnN0LWNoaWxkIHRoOmxhc3QtY2hpbGQsLnRhYmxlLWJvcmRlcmVkICIgICAgICAgICAgICAgICAgXAorICAidGJvZHk6Zmlyc3QtY2hpbGQgdHI6Zmlyc3QtY2hpbGQgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGQ6bGFzdC1jaGlsZHstd2Via2l0LWJvcmRlci10b3AtcmlnaHQtcmFkaXVzOjRweDtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czo0cHg7LW1vei1ib3JkZXItIiAgICAgXAorICAicmFkaXVzLXRvcHJpZ2h0OjRweDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnRhYmxlLWJvcmRlcmVkIHRoZWFkOmxhc3QtY2hpbGQgdHI6bGFzdC1jaGlsZCB0aDpmaXJzdC1jaGlsZCwudGFibGUtYm9yZGVyZWQgIiAgICAgICAgICAgICAgICAgXAorICAidGJvZHk6bGFzdC1jaGlsZCB0cjpsYXN0LWNoaWxkIHRkOmZpcnN0LWNoaWxkey13ZWJraXQtYm9yZGVyLXJhZGl1czowIDAgMCAiICAgICAgICAgICAgICAgICAgICAgXAorICAiNHB4Oy1tb3otYm9yZGVyLXJhZGl1czowIDAgMCA0cHg7Ym9yZGVyLXJhZGl1czowIDAgMCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiNHB4Oy13ZWJraXQtYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czo0cHg7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czo0cHg7LW1vei1ib3JkZXItcmFkaXVzLSIgICAgXAorICAiYm90dG9tbGVmdDo0cHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnRhYmxlLWJvcmRlcmVkIHRoZWFkOmxhc3QtY2hpbGQgdHI6bGFzdC1jaGlsZCB0aDpsYXN0LWNoaWxkLC50YWJsZS1ib3JkZXJlZCB0Ym9keTpsYXN0LWNoaWxkICIgXAorICAidHI6bGFzdC1jaGlsZCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGQ6bGFzdC1jaGlsZHstd2Via2l0LWJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOjRweDtib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czo0cHg7LW1vei0iICAgICAgXAorICAiYm9yZGVyLXJhZGl1cy1ib3R0b21yaWdodDo0cHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnRhYmxlLXN0cmlwZWQgdGJvZHkgdHI6bnRoLWNoaWxkKG9kZCkgdGQsLnRhYmxlLXN0cmlwZWQgdGJvZHkgdHI6bnRoLWNoaWxkKG9kZCkgIiAgICAgICAgICAgICAgXAorICAidGh7YmFja2dyb3VuZC1jb2xvcjojZjlmOWY5O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnRhYmxlIHRib2R5IHRyOmhvdmVyIHRkLC50YWJsZSB0Ym9keSB0cjpob3ZlciB0aHtiYWNrZ3JvdW5kLWNvbG9yOiNmNWY1ZjU7fVxuIiAgICAgICAgICAgICAgICAgXAorICAidGFibGUgLnNwYW4xe2Zsb2F0Om5vbmU7d2lkdGg6NDRweDttYXJnaW4tbGVmdDowO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGFibGUgLnNwYW4ye2Zsb2F0Om5vbmU7d2lkdGg6MTI0cHg7bWFyZ2luLWxlZnQ6MDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGFibGUgLnNwYW4ze2Zsb2F0Om5vbmU7d2lkdGg6MjA0cHg7bWFyZ2luLWxlZnQ6MDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGFibGUgLnNwYW40e2Zsb2F0Om5vbmU7d2lkdGg6Mjg0cHg7bWFyZ2luLWxlZnQ6MDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGFibGUgLnNwYW41e2Zsb2F0Om5vbmU7d2lkdGg6MzY0cHg7bWFyZ2luLWxlZnQ6MDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGFibGUgLnNwYW42e2Zsb2F0Om5vbmU7d2lkdGg6NDQ0cHg7bWFyZ2luLWxlZnQ6MDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGFibGUgLnNwYW43e2Zsb2F0Om5vbmU7d2lkdGg6NTI0cHg7bWFyZ2luLWxlZnQ6MDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGFibGUgLnNwYW44e2Zsb2F0Om5vbmU7d2lkdGg6NjA0cHg7bWFyZ2luLWxlZnQ6MDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGFibGUgLnNwYW45e2Zsb2F0Om5vbmU7d2lkdGg6Njg0cHg7bWFyZ2luLWxlZnQ6MDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGFibGUgLnNwYW4xMHtmbG9hdDpub25lO3dpZHRoOjc2NHB4O21hcmdpbi1sZWZ0OjA7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGFibGUgLnNwYW4xMXtmbG9hdDpub25lO3dpZHRoOjg0NHB4O21hcmdpbi1sZWZ0OjA7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGFibGUgLnNwYW4xMntmbG9hdDpub25lO3dpZHRoOjkyNHB4O21hcmdpbi1sZWZ0OjA7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGFibGUgLnNwYW4xM3tmbG9hdDpub25lO3dpZHRoOjEwMDRweDttYXJnaW4tbGVmdDowO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGFibGUgLnNwYW4xNHtmbG9hdDpub25lO3dpZHRoOjEwODRweDttYXJnaW4tbGVmdDowO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGFibGUgLnNwYW4xNXtmbG9hdDpub25lO3dpZHRoOjExNjRweDttYXJnaW4tbGVmdDowO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGFibGUgLnNwYW4xNntmbG9hdDpub25lO3dpZHRoOjEyNDRweDttYXJnaW4tbGVmdDowO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGFibGUgLnNwYW4xN3tmbG9hdDpub25lO3dpZHRoOjEzMjRweDttYXJnaW4tbGVmdDowO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGFibGUgLnNwYW4xOHtmbG9hdDpub25lO3dpZHRoOjE0MDRweDttYXJnaW4tbGVmdDowO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGFibGUgLnNwYW4xOXtmbG9hdDpub25lO3dpZHRoOjE0ODRweDttYXJnaW4tbGVmdDowO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGFibGUgLnNwYW4yMHtmbG9hdDpub25lO3dpZHRoOjE1NjRweDttYXJnaW4tbGVmdDowO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGFibGUgLnNwYW4yMXtmbG9hdDpub25lO3dpZHRoOjE2NDRweDttYXJnaW4tbGVmdDowO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGFibGUgLnNwYW4yMntmbG9hdDpub25lO3dpZHRoOjE3MjRweDttYXJnaW4tbGVmdDowO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGFibGUgLnNwYW4yM3tmbG9hdDpub25lO3dpZHRoOjE4MDRweDttYXJnaW4tbGVmdDowO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGFibGUgLnNwYW4yNHtmbG9hdDpub25lO3dpZHRoOjE4ODRweDttYXJnaW4tbGVmdDowO30iCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2phdmFfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9qYXZhX2dlbmVyYXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzg0NTUxCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9qYXZhX2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDU0NTQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3RpbWU+CisKKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvbWFuaXA+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxjY3R5cGU+CisKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKworI2luY2x1ZGUgInRocmlmdC9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaCIKKwordXNpbmcgc3RkOjptYXA7Cit1c2luZyBzdGQ6Om9zdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnNldGZpbGw7Cit1c2luZyBzdGQ6OnNldHc7Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjp2ZWN0b3I7CisKK3N0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKKworLyoqCisgKiBKYXZhIGNvZGUgZ2VuZXJhdG9yLgorICoKKyAqLworY2xhc3MgdF9qYXZhX2dlbmVyYXRvciA6IHB1YmxpYyB0X29vcF9nZW5lcmF0b3IgeworcHVibGljOgorICB0X2phdmFfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKKyAgICA6IHRfb29wX2dlbmVyYXRvcihwcm9ncmFtKSB7CisgICAgKHZvaWQpb3B0aW9uX3N0cmluZzsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworCisgICAgYmVhbl9zdHlsZV8gPSBmYWxzZTsKKyAgICBhbmRyb2lkX3N0eWxlXyA9IGZhbHNlOworICAgIHByaXZhdGVfbWVtYmVyc18gPSBmYWxzZTsKKyAgICBub2NhbWVsX3N0eWxlXyA9IGZhbHNlOworICAgIGZ1bGxjYW1lbF9zdHlsZV8gPSBmYWxzZTsKKyAgICBhbmRyb2lkX2xlZ2FjeV8gPSBmYWxzZTsKKyAgICBzb3J0ZWRfY29udGFpbmVyc18gPSBmYWxzZTsKKyAgICBqYXZhNV8gPSBmYWxzZTsKKyAgICByZXVzZV9vYmplY3RzXyA9IGZhbHNlOworICAgIHVzZV9vcHRpb25fdHlwZV8gPSBmYWxzZTsKKyAgICB1bmRhdGVkX2dlbmVyYXRlZF9hbm5vdGF0aW9uc18gID0gZmFsc2U7CisgICAgc3VwcHJlc3NfZ2VuZXJhdGVkX2Fubm90YXRpb25zXyA9IGZhbHNlOworICAgIHJldGhyb3dfdW5oYW5kbGVkX2V4Y2VwdGlvbnNfID0gZmFsc2U7CisgICAgdW5zYWZlX2JpbmFyaWVzXyA9IGZhbHNlOworICAgIGZvciggaXRlciA9IHBhcnNlZF9vcHRpb25zLmJlZ2luKCk7IGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCk7ICsraXRlcikgeworICAgICAgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImJlYW5zIikgPT0gMCkgeworICAgICAgICBiZWFuX3N0eWxlXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImFuZHJvaWQiKSA9PSAwKSB7CisgICAgICAgIGFuZHJvaWRfc3R5bGVfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgicHJpdmF0ZS1tZW1iZXJzIikgPT0gMCkgeworICAgICAgICBwcml2YXRlX21lbWJlcnNfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgibm9jYW1lbCIpID09IDApIHsKKyAgICAgICAgbm9jYW1lbF9zdHlsZV8gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJmdWxsY2FtZWwiKSA9PSAwKSB7CisgICAgICAgIGZ1bGxjYW1lbF9zdHlsZV8gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJhbmRyb2lkX2xlZ2FjeSIpID09IDApIHsKKyAgICAgICAgYW5kcm9pZF9sZWdhY3lfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgic29ydGVkX2NvbnRhaW5lcnMiKSA9PSAwKSB7CisgICAgICAgIHNvcnRlZF9jb250YWluZXJzXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImphdmE1IikgPT0gMCkgeworICAgICAgICBqYXZhNV8gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJyZXVzZS1vYmplY3RzIikgPT0gMCkgeworICAgICAgICByZXVzZV9vYmplY3RzXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoIm9wdGlvbl90eXBlIikgPT0gMCkgeworICAgICAgICB1c2Vfb3B0aW9uX3R5cGVfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgicmV0aHJvd191bmhhbmRsZWRfZXhjZXB0aW9ucyIpID09IDApIHsKKyAgICAgICAgcmV0aHJvd191bmhhbmRsZWRfZXhjZXB0aW9uc18gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJnZW5lcmF0ZWRfYW5ub3RhdGlvbnMiKSA9PSAwKSB7CisgICAgICAgIGlmKCBpdGVyLT5zZWNvbmQuY29tcGFyZSgidW5kYXRlZCIpID09IDApIHsKKyAgICAgICAgICB1bmRhdGVkX2dlbmVyYXRlZF9hbm5vdGF0aW9uc18gID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmKGl0ZXItPnNlY29uZC5jb21wYXJlKCJzdXBwcmVzcyIpID09IDApIHsKKyAgICAgICAgICBzdXBwcmVzc19nZW5lcmF0ZWRfYW5ub3RhdGlvbnNfID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24gamF2YToiICsgaXRlci0+Zmlyc3QgKyAiPSIgKyBpdGVyLT5zZWNvbmQ7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgidW5zYWZlX2JpbmFyaWVzIikgPT0gMCkgeworICAgICAgICB1bnNhZmVfYmluYXJpZXNfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93ICJ1bmtub3duIG9wdGlvbiBqYXZhOiIgKyBpdGVyLT5maXJzdDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoamF2YTVfKSB7CisgICAgICBhbmRyb2lkX2xlZ2FjeV8gPSB0cnVlOworICAgIH0KKworICAgIG91dF9kaXJfYmFzZV8gPSAoYmVhbl9zdHlsZV8gPyAiZ2VuLWphdmFiZWFuIiA6ICJnZW4tamF2YSIpOworICB9CisKKyAgLyoqCisgICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKKyAgICovCisKKyAgdm9pZCBpbml0X2dlbmVyYXRvcigpOworICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOworCisgIHZvaWQgZ2VuZXJhdGVfY29uc3RzKHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpOworCisgIC8qKgorICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfdW5pb24odF9zdHJ1Y3QqIHR1bmlvbik7CisgIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworICB2b2lkIHByaW50X2NvbnN0X3ZhbHVlKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fc3RhdGljLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVmdmFsID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOworCisgIC8qKgorICAgKiBTZXJ2aWNlLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKKworICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X2RlZmluaXRpb24oc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24gPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fY2xhc3MgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0ID0gZmFsc2UpOworICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X3BhcmNlbGFibGUoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9lcXVhbGl0eShzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X2NvbXBhcmVfdG8oc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9yZWFkZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3ZhbGlkYXRvcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X3Jlc3VsdF93cml0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF93cml0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF90b3N0cmluZyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X2NsZWFyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3Rfd3JpdGVfb2JqZWN0KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfcmVhZF9vYmplY3Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX21ldGFfZGF0YV9tYXAoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSk7CisgIHN0ZDo6c3RyaW5nIGdldF9qYXZhX3R5cGVfc3RyaW5nKHRfdHlwZSogdHlwZSk7CisgIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfZmllbGRfYnlfaWQob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfcmVmbGVjdGlvbl9zZXR0ZXJzKHN0ZDo6b3N0cmluZ3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNhcF9uYW1lKTsKKyAgdm9pZCBnZW5lcmF0ZV9yZWZsZWN0aW9uX2dldHRlcnMoc3RkOjpvc3RyaW5nc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2FwX25hbWUpOworICB2b2lkIGdlbmVyYXRlX2dlbmVyaWNfZmllbGRfZ2V0dGVyc19zZXR0ZXJzKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZ2VuZXJpY19pc3NldF9tZXRob2Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX2JlYW5fYm9pbGVycGxhdGUoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKworICB2b2lkIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgc3RkOjpzdHJpbmcgYXNfY2FtZWxfY2FzZShzdGQ6OnN0cmluZyBuYW1lLCBib29sIHVjZmlyc3QgPSB0cnVlKTsKKyAgc3RkOjpzdHJpbmcgZ2V0X3JwY19tZXRob2RfbmFtZShzdGQ6OnN0cmluZyBuYW1lKTsKKyAgc3RkOjpzdHJpbmcgZ2V0X2NhcF9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpOworICBzdGQ6OnN0cmluZyBnZW5lcmF0ZV9pc3NldF9jaGVjayh0X2ZpZWxkKiBmaWVsZCk7CisgIHN0ZDo6c3RyaW5nIGdlbmVyYXRlX2lzc2V0X2NoZWNrKHN0ZDo6c3RyaW5nIGZpZWxkKTsKKyAgdm9pZCBnZW5lcmF0ZV9pc3NldF9zZXQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiBmaWVsZCwgc3RkOjpzdHJpbmcgcHJlZml4KTsKKyAgc3RkOjpzdHJpbmcgaXNzZXRfZmllbGRfaWQodF9maWVsZCogZmllbGQpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9hc3luY19pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfYXN5bmNfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfYXN5bmNfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2FzeW5jX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3VuaW9uKHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV91bmlvbl9jb25zdHJ1Y3Rvcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV91bmlvbl9nZXR0ZXJzX2FuZF9zZXR0ZXJzKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3VuaW9uX2lzX3NldF9tZXRob2RzKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3VuaW9uX2Fic3RyYWN0X21ldGhvZHMob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfY2hlY2tfdHlwZShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zdGFuZGFyZF9zY2hlbWVfcmVhZF92YWx1ZShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zdGFuZGFyZF9zY2hlbWVfd3JpdGVfdmFsdWUob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfdHVwbGVfc2NoZW1lX3JlYWRfdmFsdWUob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfdHVwbGVfc2NoZW1lX3dyaXRlX3ZhbHVlKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2dldF9maWVsZF9kZXNjKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2dldF9zdHJ1Y3RfZGVzYyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9nZXRfZmllbGRfbmFtZShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKworICB2b2lkIGdlbmVyYXRlX3VuaW9uX2NvbXBhcmlzb25zKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3VuaW9uX2hhc2hjb2RlKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIHZvaWQgZ2VuZXJhdGVfc2NoZW1lX21hcChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zdGFuZGFyZF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19yZXN1bHQpOworICB2b2lkIGdlbmVyYXRlX3N0YW5kYXJkX3JlYWRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9zdGFuZGFyZF9zY2hlbWUob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19yZXN1bHQpOworCisgIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfdHVwbGVfc2NoZW1lKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X3R1cGxlX3JlYWRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF90dXBsZV93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3NjaGVtZV9sb29rdXAob3N0cmVhbSYgb3V0KTsKKworICB2b2lkIGdlbmVyYXRlX2phdmF4X2dlbmVyYXRlZF9hbm5vdGF0aW9uKG9zdHJlYW0mIG91dCk7CisgIC8qKgorICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNfbWV0YWRhdGEgPSB0cnVlKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzX21ldGFkYXRhID0gdHJ1ZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdHNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBvYmogPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc19tZXRhZGF0YSA9IHRydWUpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgb2JqID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNfbWV0YWRhdGEgPSB0cnVlKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG9iaiA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc19tZXRhZGF0YSA9IHRydWUpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc19tZXRhZGF0YSA9IHRydWUpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc19tZXRhZGF0YSA9IHRydWUpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc19tZXRhZGF0YSA9IHRydWUpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNfbWV0YWRhdGEgPSB0cnVlKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzX21ldGFkYXRhID0gdHJ1ZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZWVwX2NvcHlfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgc291cmNlX25hbWVfcDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBzb3VyY2VfbmFtZV9wMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHJlc3VsdF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZWVwX2NvcHlfbm9uX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBzb3VyY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBkZXN0X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlKTsKKworICBlbnVtIGlzc2V0X3R5cGUgeyBJU1NFVF9OT05FLCBJU1NFVF9QUklNSVRJVkUsIElTU0VUX0JJVFNFVCB9OworICBpc3NldF90eXBlIG5lZWRzX2lzc2V0KHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyogb3V0UHJpbWl0aXZlVHlwZSA9IE5VTEwpOworCisgIC8qKgorICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucworICAgKi8KKworICBzdGQ6OnN0cmluZyBqYXZhX3BhY2thZ2UoKTsKKyAgc3RkOjpzdHJpbmcgamF2YV9zdXBwcmVzc2lvbnMoKTsKKyAgc3RkOjpzdHJpbmcgamF2YV9udWxsYWJsZV9hbm5vdGF0aW9uKCk7CisgIHN0ZDo6c3RyaW5nIHR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9jb250YWluZXIgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5faW5pdCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBza2lwX2dlbmVyaWMgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2VfbmFtZXNwYWNlID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZSogdGJhc2UsIGJvb2wgaW5fY29udGFpbmVyID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0ID0gZmFsc2UsIGJvb2wgY29tbWVudCA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmVfYXN5bmModF9mdW5jdGlvbiogdGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB1c2VfYmFzZV9tZXRob2QgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpbmNsdWRlX3R5cGVzID0gdHJ1ZSk7CisgIHN0ZDo6c3RyaW5nIGFzeW5jX2Z1bmN0aW9uX2NhbGxfYXJnbGlzdCh0X2Z1bmN0aW9uKiB0ZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdXNlX2Jhc2VfbWV0aG9kID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbHVkZV90eXBlcyA9IHRydWUpOworICBzdGQ6OnN0cmluZyBhc3luY19hcmd1bWVudF9saXN0KHRfZnVuY3Rpb24qIHRmdW5jdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbHVkZV90eXBlcyA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdF9kZXNjKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2ZpZWxkX2Rlc2NzKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2ZpZWxkX25hbWVfY29uc3RhbnRzKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIHN0ZDo6c3RyaW5nIG1ha2VfdmFsaWRfamF2YV9maWxlbmFtZShzdGQ6OnN0cmluZyBjb25zdCYgZnJvbU5hbWUpOworICBzdGQ6OnN0cmluZyBtYWtlX3ZhbGlkX2phdmFfaWRlbnRpZmllcihzdGQ6OnN0cmluZyBjb25zdCYgZnJvbU5hbWUpOworCisgIGJvb2wgdHlwZV9jYW5fYmVfbnVsbCh0X3R5cGUqIHR0eXBlKSB7CisgICAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKKworICAgIHJldHVybiB0dHlwZS0+aXNfY29udGFpbmVyKCkgfHwgdHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpIHx8IHR0eXBlLT5pc19zdHJpbmcoKQorICAgICAgICAgICB8fCB0dHlwZS0+aXNfZW51bSgpOworICB9CisKKyAgYm9vbCBpc19kZXByZWNhdGVkKGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIGFubm90YXRpb25zKSB7CisgICAgcmV0dXJuIGFubm90YXRpb25zLmZpbmQoImRlcHJlY2F0ZWQiKSAhPSBhbm5vdGF0aW9ucy5lbmQoKTsKKyAgfQorCisgIGJvb2wgaXNfZW51bV9zZXQodF90eXBlKiB0dHlwZSkgeworICAgIGlmICghc29ydGVkX2NvbnRhaW5lcnNfKSB7CisgICAgICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOworICAgICAgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgICAgICB0X3NldCogdHNldCA9ICh0X3NldCopdHR5cGU7CisgICAgICAgIHRfdHlwZSogZWxlbV90eXBlID0gZ2V0X3RydWVfdHlwZSh0c2V0LT5nZXRfZWxlbV90eXBlKCkpOworICAgICAgICByZXR1cm4gZWxlbV90eXBlLT5pc19lbnVtKCk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGJvb2wgaXNfZW51bV9tYXAodF90eXBlKiB0dHlwZSkgeworICAgIGlmICghc29ydGVkX2NvbnRhaW5lcnNfKSB7CisgICAgICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOworICAgICAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgICAgICB0X21hcCogdG1hcCA9ICh0X21hcCopdHR5cGU7CisgICAgICAgIHRfdHlwZSoga2V5X3R5cGUgPSBnZXRfdHJ1ZV90eXBlKHRtYXAtPmdldF9rZXlfdHlwZSgpKTsKKyAgICAgICAgcmV0dXJuIGtleV90eXBlLT5pc19lbnVtKCk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIGlubmVyX2VudW1fdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpIHsKKyAgICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOworICAgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICAgIHRfbWFwKiB0bWFwID0gKHRfbWFwKil0dHlwZTsKKyAgICAgIHRfdHlwZSoga2V5X3R5cGUgPSBnZXRfdHJ1ZV90eXBlKHRtYXAtPmdldF9rZXlfdHlwZSgpKTsKKyAgICAgIHJldHVybiB0eXBlX25hbWUoa2V5X3R5cGUsIHRydWUpICsgIi5jbGFzcyI7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgIHRfc2V0KiB0c2V0ID0gKHRfc2V0Kil0dHlwZTsKKyAgICAgIHRfdHlwZSogZWxlbV90eXBlID0gZ2V0X3RydWVfdHlwZSh0c2V0LT5nZXRfZWxlbV90eXBlKCkpOworICAgICAgcmV0dXJuIHR5cGVfbmFtZShlbGVtX3R5cGUsIHRydWUpICsgIi5jbGFzcyI7CisgICAgfQorICAgIHJldHVybiAiIjsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIGNvbnN0YW50X25hbWUoc3RkOjpzdHJpbmcgbmFtZSk7CisKK3ByaXZhdGU6CisgIC8qKgorICAgKiBGaWxlIHN0cmVhbXMKKyAgICovCisKKyAgc3RkOjpzdHJpbmcgcGFja2FnZV9uYW1lXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3NlcnZpY2VfOworICBzdGQ6OnN0cmluZyBwYWNrYWdlX2Rpcl87CisKKyAgYm9vbCBiZWFuX3N0eWxlXzsKKyAgYm9vbCBhbmRyb2lkX3N0eWxlXzsKKyAgYm9vbCBwcml2YXRlX21lbWJlcnNfOworICBib29sIG5vY2FtZWxfc3R5bGVfOworICBib29sIGZ1bGxjYW1lbF9zdHlsZV87CisgIGJvb2wgYW5kcm9pZF9sZWdhY3lfOworICBib29sIGphdmE1XzsKKyAgYm9vbCBzb3J0ZWRfY29udGFpbmVyc187CisgIGJvb2wgcmV1c2Vfb2JqZWN0c187CisgIGJvb2wgdXNlX29wdGlvbl90eXBlXzsKKyAgYm9vbCB1bmRhdGVkX2dlbmVyYXRlZF9hbm5vdGF0aW9uc187CisgIGJvb2wgc3VwcHJlc3NfZ2VuZXJhdGVkX2Fubm90YXRpb25zXzsKKyAgYm9vbCByZXRocm93X3VuaGFuZGxlZF9leGNlcHRpb25zXzsKKyAgYm9vbCB1bnNhZmVfYmluYXJpZXNfOworCit9OworCisvKioKKyAqIFByZXBhcmVzIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0CisgKiBzdHJlYW1zLgorICoKKyAqIEBwYXJhbSB0cHJvZ3JhbSBUaGUgcHJvZ3JhbSB0byBnZW5lcmF0ZQorICovCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgeworICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKKyAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKKyAgcGFja2FnZV9uYW1lXyA9IHByb2dyYW1fLT5nZXRfbmFtZXNwYWNlKCJqYXZhIik7CisKKyAgc3RyaW5nIGRpciA9IHBhY2thZ2VfbmFtZV87CisgIHN0cmluZyBzdWJkaXIgPSBnZXRfb3V0X2RpcigpOworICBzdHJpbmc6OnNpemVfdHlwZSBsb2M7CisgIHdoaWxlICgobG9jID0gZGlyLmZpbmQoIi4iKSkgIT0gc3RyaW5nOjpucG9zKSB7CisgICAgc3ViZGlyID0gc3ViZGlyICsgIi8iICsgZGlyLnN1YnN0cigwLCBsb2MpOworICAgIE1LRElSKHN1YmRpci5jX3N0cigpKTsKKyAgICBkaXIgPSBkaXIuc3Vic3RyKGxvYyArIDEpOworICB9CisgIGlmIChkaXIuc2l6ZSgpID4gMCkgeworICAgIHN1YmRpciA9IHN1YmRpciArICIvIiArIGRpcjsKKyAgICBNS0RJUihzdWJkaXIuY19zdHIoKSk7CisgIH0KKworICBwYWNrYWdlX2Rpcl8gPSBzdWJkaXI7Cit9CisKKy8qKgorICogUGFja2FnZXMgdGhlIGdlbmVyYXRlZCBmaWxlCisgKgorICogQHJldHVybiBTdHJpbmcgb2YgdGhlIHBhY2thZ2UsIGkuZS4gInBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnRkZW1vOyIKKyAqLworc3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OmphdmFfcGFja2FnZSgpIHsKKyAgaWYgKCFwYWNrYWdlX25hbWVfLmVtcHR5KCkpIHsKKyAgICByZXR1cm4gc3RyaW5nKCJwYWNrYWdlICIpICsgcGFja2FnZV9uYW1lXyArICI7XG5cbiI7CisgIH0KKyAgcmV0dXJuICIiOworfQorCitzdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6amF2YV9zdXBwcmVzc2lvbnMoKSB7CisgIHJldHVybiAiQFN1cHByZXNzV2FybmluZ3Moe1wiY2FzdFwiLCBcInJhd3R5cGVzXCIsIFwic2VyaWFsXCIsIFwidW5jaGVja2VkXCIsIFwidW51c2VkXCJ9KVxuIjsKK30KKworc3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OmphdmFfbnVsbGFibGVfYW5ub3RhdGlvbigpIHsKKyAgcmV0dXJuICJAb3JnLmFwYWNoZS50aHJpZnQuYW5ub3RhdGlvbi5OdWxsYWJsZSI7Cit9CisKKy8qKgorICogTm90aGluZyBpbiBKYXZhCisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgeworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIFRoaXMgaXMgbm90IGRvbmUgaW4gSmF2YSwgc2luY2UgaXQgZG9lcworICogbm90IHN1cHBvcnQgYXJiaXRyYXJ5IG5hbWUgcmVwbGFjZW1lbnRzLCBhbmQgaXQnZCBiZSBhIHdhY2t5IHdhc3RlCisgKiBvZiBvdmVyaGVhZCB0byBtYWtlIHdyYXBwZXIgY2xhc3Nlcy4KKyAqCisgKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgorICovCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgeworICAodm9pZCl0dHlwZWRlZjsKK30KKworLyoqCisgKiBFbnVtcyBhcmUgYSBjbGFzcyB3aXRoIGEgc2V0IG9mIHN0YXRpYyBjb25zdGFudHMuCisgKgorICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgorICovCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgeworICBib29sIGlzX2RlcHJlY2F0ZWQgPSB0aGlzLT5pc19kZXByZWNhdGVkKHRlbnVtLT5hbm5vdGF0aW9uc18pOworICAvLyBNYWtlIG91dHB1dCBmaWxlCisgIHN0cmluZyBmX2VudW1fbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArIG1ha2VfdmFsaWRfamF2YV9maWxlbmFtZSh0ZW51bS0+Z2V0X25hbWUoKSkgKyAiLmphdmEiOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfZW51bTsKKyAgZl9lbnVtLm9wZW4oZl9lbnVtX25hbWUuY19zdHIoKSk7CisKKyAgLy8gQ29tbWVudCBhbmQgcGFja2FnZSBpdAorICBmX2VudW0gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgamF2YV9wYWNrYWdlKCkgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9qYXZhX2RvYyhmX2VudW0sIHRlbnVtKTsKKworICBpZiAoIXN1cHByZXNzX2dlbmVyYXRlZF9hbm5vdGF0aW9uc18pIHsKKyAgICBnZW5lcmF0ZV9qYXZheF9nZW5lcmF0ZWRfYW5ub3RhdGlvbihmX2VudW0pOworICB9CisKKyAgaWYgKGlzX2RlcHJlY2F0ZWQpIHsKKyAgICBpbmRlbnQoZl9lbnVtKSA8PCAiQERlcHJlY2F0ZWQiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50KGZfZW51bSkgPDwgInB1YmxpYyBlbnVtICIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIiBpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LlRFbnVtICI7CisgIHNjb3BlX3VwKGZfZW51bSk7CisKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOworCisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBmX2VudW0gPDwgIiwiIDw8IGVuZGw7CisgICAgfQorCisgICAgZ2VuZXJhdGVfamF2YV9kb2MoZl9lbnVtLCAqY19pdGVyKTsKKyAgICBpZiAodGhpcy0+aXNfZGVwcmVjYXRlZCgoKmNfaXRlciktPmFubm90YXRpb25zXykpIHsKKyAgICAgIGluZGVudChmX2VudW0pIDw8ICJARGVwcmVjYXRlZCIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50KGZfZW51bSkgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoIiA8PCB2YWx1ZSA8PCAiKSI7CisgIH0KKyAgZl9lbnVtIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gRmllbGQgZm9yIHRocmlmdENvZGUKKyAgaW5kZW50KGZfZW51bSkgPDwgInByaXZhdGUgZmluYWwgaW50IHZhbHVlOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChmX2VudW0pIDw8ICJwcml2YXRlICIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIihpbnQgdmFsdWUpIHsiIDw8IGVuZGw7CisgIGluZGVudChmX2VudW0pIDw8ICIgIHRoaXMudmFsdWUgPSB2YWx1ZTsiIDw8IGVuZGw7CisgIGluZGVudChmX2VudW0pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KGZfZW51bSkgPDwgIi8qKiIgPDwgZW5kbDsKKyAgaW5kZW50KGZfZW51bSkgPDwgIiAqIEdldCB0aGUgaW50ZWdlciB2YWx1ZSBvZiB0aGlzIGVudW0gdmFsdWUsIGFzIGRlZmluZWQgaW4gdGhlIFRocmlmdCBJREwuIgorICAgICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnQoZl9lbnVtKSA8PCAiICovIiA8PCBlbmRsOworICBpbmRlbnQoZl9lbnVtKSA8PCAicHVibGljIGludCBnZXRWYWx1ZSgpIHsiIDw8IGVuZGw7CisgIGluZGVudChmX2VudW0pIDw8ICIgIHJldHVybiB2YWx1ZTsiIDw8IGVuZGw7CisgIGluZGVudChmX2VudW0pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KGZfZW51bSkgPDwgIi8qKiIgPDwgZW5kbDsKKyAgaW5kZW50KGZfZW51bSkgPDwgIiAqIEZpbmQgYSB0aGUgZW51bSB0eXBlIGJ5IGl0cyBpbnRlZ2VyIHZhbHVlLCBhcyBkZWZpbmVkIGluIHRoZSBUaHJpZnQgSURMLiIKKyAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50KGZfZW51bSkgPDwgIiAqIEByZXR1cm4gbnVsbCBpZiB0aGUgdmFsdWUgaXMgbm90IGZvdW5kLiIgPDwgZW5kbDsKKyAgaW5kZW50KGZfZW51bSkgPDwgIiAqLyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfZW51bSkgPDwgamF2YV9udWxsYWJsZV9hbm5vdGF0aW9uKCkgPDwgZW5kbDsKKyAgaW5kZW50KGZfZW51bSkgPDwgInB1YmxpYyBzdGF0aWMgIiArIHRlbnVtLT5nZXRfbmFtZSgpICsgIiBmaW5kQnlWYWx1ZShpbnQgdmFsdWUpIHsgIiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIGluZGVudChmX2VudW0pIDw8ICJzd2l0Y2ggKHZhbHVlKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgICAgaW5kZW50KGZfZW51bSkgPDwgImNhc2UgIiA8PCB2YWx1ZSA8PCAiOiIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9lbnVtKSA8PCAiICByZXR1cm4gIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnQoZl9lbnVtKSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7CisgIGluZGVudChmX2VudW0pIDw8ICIgIHJldHVybiBudWxsOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworCisgIGluZGVudChmX2VudW0pIDw8ICJ9IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisKKyAgaW5kZW50KGZfZW51bSkgPDwgIn0iIDw8IGVuZGw7CisKKyAgc2NvcGVfZG93bihmX2VudW0pOworCisgIGZfZW51bS5jbG9zZSgpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGNsYXNzIHRoYXQgaG9sZHMgYWxsIHRoZSBjb25zdGFudHMuCisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3RzKHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpIHsKKyAgaWYgKGNvbnN0cy5lbXB0eSgpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgc3RyaW5nIGZfY29uc3RzX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAnLycgKyBtYWtlX3ZhbGlkX2phdmFfZmlsZW5hbWUocHJvZ3JhbV9uYW1lXykKKyAgICAgICAgICAgICAgICAgICAgICAgICArICJDb25zdGFudHMuamF2YSI7CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9jb25zdHM7CisgIGZfY29uc3RzLm9wZW4oZl9jb25zdHNfbmFtZS5jX3N0cigpKTsKKworICAvLyBQcmludCBoZWFkZXIKKyAgZl9jb25zdHMgPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgamF2YV9wYWNrYWdlKCkgPDwgamF2YV9zdXBwcmVzc2lvbnMoKTsKKworICBmX2NvbnN0cyA8PCAicHVibGljIGNsYXNzICIgPDwgbWFrZV92YWxpZF9qYXZhX2lkZW50aWZpZXIocHJvZ3JhbV9uYW1lXykgPDwgIkNvbnN0YW50cyB7IiA8PCBlbmRsCisgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7CisgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgZ2VuZXJhdGVfamF2YV9kb2MoZl9jb25zdHMsICgqY19pdGVyKSk7CisgICAgcHJpbnRfY29uc3RfdmFsdWUoZl9jb25zdHMsCisgICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3R5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF92YWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgfQorICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9jb25zdHMpIDw8ICJ9IiA8PCBlbmRsOworICBmX2NvbnN0cy5jbG9zZSgpOworfQorCisKKy8qKgorICogUHJpbnRzIHRoZSB2YWx1ZSBvZiBhIGNvbnN0YW50IHdpdGggdGhlIGdpdmVuIHR5cGUuIE5vdGUgdGhhdCB0eXBlIGNoZWNraW5nCisgKiBpcyBOT1QgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24gYXMgaXQgaXMgYWx3YXlzIHJ1biBiZWZvcmVoYW5kIHVzaW5nIHRoZQorICogdmFsaWRhdGVfdHlwZXMgbWV0aG9kIGluIG1haW4uY2MKKyAqLwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpwcmludF9jb25zdF92YWx1ZShzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fc3RhdGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlZnZhbCkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKworICBpbmRlbnQob3V0KTsKKyAgaWYgKCFkZWZ2YWwpIHsKKyAgICBvdXQgPDwgKGluX3N0YXRpYyA/ICIiIDogInB1YmxpYyBzdGF0aWMgZmluYWwgIikgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgIjsKKyAgfQorICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICBzdHJpbmcgdjIgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCB0eXBlLCB2YWx1ZSk7CisgICAgb3V0IDw8IG5hbWUgPDwgIiA9ICIgPDwgdjIgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBvdXQgPDwgbmFtZSA8PCAiID0gIiA8PCByZW5kZXJfY29uc3RfdmFsdWUob3V0LCB0eXBlLCB2YWx1ZSkgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgdW5zb3J0ZWRfZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPiBmaWVsZHMgPSB1bnNvcnRlZF9maWVsZHM7CisgICAgc3RkOjpzb3J0KGZpZWxkcy5iZWdpbigpLCBmaWVsZHMuZW5kKCksIHRfZmllbGQ6OmtleV9jb21wYXJlKCkpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIG91dCA8PCBuYW1lIDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgaWYgKCFpbl9zdGF0aWMpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJzdGF0aWMgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKKyAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7CisgICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgeworICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOworICAgICAgfQorICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKKyAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIi4iOworICAgICAgc3RkOjpzdHJpbmcgY2FwX25hbWUgPSBnZXRfY2FwX25hbWUodl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKTsKKyAgICAgIG91dCA8PCAic2V0IiA8PCBjYXBfbmFtZSA8PCAiKCIgPDwgdmFsIDw8ICIpOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaWYgKCFpbl9zdGF0aWMpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICBzdGQ6OnN0cmluZyBjb25zdHJ1Y3Rvcl9hcmdzOworICAgIGlmIChpc19lbnVtX21hcCh0eXBlKSkgeworICAgICAgY29uc3RydWN0b3JfYXJncyA9IGlubmVyX2VudW1fdHlwZV9uYW1lKHR5cGUpOworICAgIH0KKyAgICBvdXQgPDwgbmFtZSA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlKSA8PCAiKCIgPDwgY29uc3RydWN0b3JfYXJncyA8PCAiKTsiIDw8IGVuZGw7CisgICAgaWYgKCFpbl9zdGF0aWMpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJzdGF0aWMgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKyAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgc3RyaW5nIGtleSA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIGt0eXBlLCB2X2l0ZXItPmZpcnN0KTsKKyAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCB2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiLnB1dCgiIDw8IGtleSA8PCAiLCAiIDw8IHZhbCA8PCAiKTsiIDw8IGVuZGw7CisgICAgfQorICAgIGlmICghaW5fc3RhdGljKSB7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICAgIG91dCA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkgeworICAgIGlmIChpc19lbnVtX3NldCh0eXBlKSkgeworICAgICAgb3V0IDw8IG5hbWUgPDwgIiA9ICIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlLCB0cnVlKSA8PCAiLm5vbmVPZigiIDw8IGlubmVyX2VudW1fdHlwZV9uYW1lKHR5cGUpIDw8ICIpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8IG5hbWUgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaWYgKCFpbl9zdGF0aWMpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJzdGF0aWMgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKyAgICB0X3R5cGUqIGV0eXBlOworICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9CisgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgZXR5cGUsICp2X2l0ZXIpOworICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiLmFkZCgiIDw8IHZhbCA8PCAiKTsiIDw8IGVuZGw7CisgICAgfQorICAgIGlmICghaW5fc3RhdGljKSB7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICAgIG91dCA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgdHlwZSAiICsgdHlwZS0+Z2V0X25hbWUoKTsKKyAgfQorfQorCitzdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHJlbmRlcjsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmVuZGVyIDw8ICciJyA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICciJzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJlbmRlciA8PCAoKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZW5kZXIgPDwgIihieXRlKSIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJlbmRlciA8PCAiKHNob3J0KSIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICJMIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKKyAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICJkIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlbmRlciA8PCBlbWl0X2RvdWJsZV9hc19zdHJpbmcodmFsdWUtPmdldF9kb3VibGUoKSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHN0ZDo6c3RyaW5nIG5hbWVzcGFjZV9wcmVmaXggPSB0eXBlLT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZXNwYWNlKCJqYXZhIik7CisgICAgaWYgKG5hbWVzcGFjZV9wcmVmaXgubGVuZ3RoKCkgPiAwKSB7CisgICAgICBuYW1lc3BhY2VfcHJlZml4ICs9ICIuIjsKKyAgICB9CisgICAgcmVuZGVyIDw8IG5hbWVzcGFjZV9wcmVmaXggPDwgdmFsdWUtPmdldF9pZGVudGlmaWVyX3dpdGhfcGFyZW50KCk7CisgIH0gZWxzZSB7CisgICAgc3RyaW5nIHQgPSB0bXAoInRtcCIpOworICAgIHByaW50X2NvbnN0X3ZhbHVlKG91dCwgdCwgdHlwZSwgdmFsdWUsIHRydWUpOworICAgIHJlbmRlciA8PCB0OworICB9CisKKyAgcmV0dXJuIHJlbmRlci5zdHIoKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZGF0YSB0eXBlLiBUaGlzIHdpbGwgYmUgYSBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZQorICogaW1wbGVtZW50b3IuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGlmICh0c3RydWN0LT5pc191bmlvbigpKSB7CisgICAgZ2VuZXJhdGVfamF2YV91bmlvbih0c3RydWN0KTsKKyAgfSBlbHNlIHsKKyAgICBnZW5lcmF0ZV9qYXZhX3N0cnVjdCh0c3RydWN0LCBmYWxzZSk7CisgIH0KK30KKworLyoqCisgKiBFeGNlcHRpb25zIGFyZSBzdHJ1Y3RzLCBidXQgdGhleSBpbmhlcml0IGZyb20gRXhjZXB0aW9uCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgeworICBnZW5lcmF0ZV9qYXZhX3N0cnVjdCh0eGNlcHRpb24sIHRydWUpOworfQorCisvKioKKyAqIEphdmEgc3RydWN0IGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisgIC8vIE1ha2Ugb3V0cHV0IGZpbGUKKyAgc3RyaW5nIGZfc3RydWN0X25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyBtYWtlX3ZhbGlkX2phdmFfZmlsZW5hbWUodHN0cnVjdC0+Z2V0X25hbWUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICArICIuamF2YSI7CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9zdHJ1Y3Q7CisgIGZfc3RydWN0Lm9wZW4oZl9zdHJ1Y3RfbmFtZS5jX3N0cigpKTsKKworICBmX3N0cnVjdCA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBqYXZhX3BhY2thZ2UoKSA8PCBqYXZhX3N1cHByZXNzaW9ucygpOworCisgIGdlbmVyYXRlX2phdmFfc3RydWN0X2RlZmluaXRpb24oZl9zdHJ1Y3QsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7CisgIGZfc3RydWN0LmNsb3NlKCk7Cit9CisKKy8qKgorICogSmF2YSB1bmlvbiBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfdW5pb24odF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgLy8gTWFrZSBvdXRwdXQgZmlsZQorICBzdHJpbmcgZl9zdHJ1Y3RfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArIG1ha2VfdmFsaWRfamF2YV9maWxlbmFtZSh0c3RydWN0LT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICsgIi5qYXZhIjsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3N0cnVjdDsKKyAgZl9zdHJ1Y3Qub3BlbihmX3N0cnVjdF9uYW1lLmNfc3RyKCkpOworCisgIGZfc3RydWN0IDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGphdmFfcGFja2FnZSgpIDw8IGphdmFfc3VwcHJlc3Npb25zKCk7CisKKyAgZ2VuZXJhdGVfamF2YV9kb2MoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOworCisgIGJvb2wgaXNfZmluYWwgPSAodHN0cnVjdC0+YW5ub3RhdGlvbnNfLmZpbmQoImZpbmFsIikgIT0gdHN0cnVjdC0+YW5ub3RhdGlvbnNfLmVuZCgpKTsKKyAgYm9vbCBpc19kZXByZWNhdGVkID0gdGhpcy0+aXNfZGVwcmVjYXRlZCh0c3RydWN0LT5hbm5vdGF0aW9uc18pOworCisgIGlmICghc3VwcHJlc3NfZ2VuZXJhdGVkX2Fubm90YXRpb25zXykgeworICAgIGdlbmVyYXRlX2phdmF4X2dlbmVyYXRlZF9hbm5vdGF0aW9uKGZfc3RydWN0KTsKKyAgfQorCisgIGlmIChpc19kZXByZWNhdGVkKSB7CisgICAgaW5kZW50KGZfc3RydWN0KSA8PCAiQERlcHJlY2F0ZWQiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50KGZfc3RydWN0KSA8PCAicHVibGljICIgPDwgKGlzX2ZpbmFsID8gImZpbmFsICIgOiAiIikgPDwgImNsYXNzICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgIDw8ICIgZXh0ZW5kcyBvcmcuYXBhY2hlLnRocmlmdC5UVW5pb248IiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIsICIKKyAgICAgICAgICAgICAgICAgICA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIuX0ZpZWxkcz4gIjsKKworICBzY29wZV91cChmX3N0cnVjdCk7CisKKyAgZ2VuZXJhdGVfc3RydWN0X2Rlc2MoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9maWVsZF9kZXNjcyhmX3N0cnVjdCwgdHN0cnVjdCk7CisKKyAgZl9zdHJ1Y3QgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9maWVsZF9uYW1lX2NvbnN0YW50cyhmX3N0cnVjdCwgdHN0cnVjdCk7CisKKyAgZl9zdHJ1Y3QgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9qYXZhX21ldGFfZGF0YV9tYXAoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOworCisgIGdlbmVyYXRlX3VuaW9uX2NvbnN0cnVjdG9yKGZfc3RydWN0LCB0c3RydWN0KTsKKworICBmX3N0cnVjdCA8PCBlbmRsOworCisgIGdlbmVyYXRlX3VuaW9uX2Fic3RyYWN0X21ldGhvZHMoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOworCisgIGZfc3RydWN0IDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfZmllbGRfYnlfaWQoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOworCisgIGZfc3RydWN0IDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfdW5pb25fZ2V0dGVyc19hbmRfc2V0dGVycyhmX3N0cnVjdCwgdHN0cnVjdCk7CisKKyAgZl9zdHJ1Y3QgPDwgZW5kbDsKKworICBnZW5lcmF0ZV91bmlvbl9pc19zZXRfbWV0aG9kcyhmX3N0cnVjdCwgdHN0cnVjdCk7CisKKyAgZl9zdHJ1Y3QgPDwgZW5kbDsKKworICBnZW5lcmF0ZV91bmlvbl9jb21wYXJpc29ucyhmX3N0cnVjdCwgdHN0cnVjdCk7CisKKyAgZl9zdHJ1Y3QgPDwgZW5kbDsKKworICBnZW5lcmF0ZV91bmlvbl9oYXNoY29kZShmX3N0cnVjdCwgdHN0cnVjdCk7CisKKyAgZl9zdHJ1Y3QgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF93cml0ZV9vYmplY3QoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOworCisgIGZfc3RydWN0IDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfcmVhZF9vYmplY3QoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOworCisgIGZfc3RydWN0IDw8IGVuZGw7CisKKyAgc2NvcGVfZG93bihmX3N0cnVjdCk7CisKKyAgZl9zdHJ1Y3QuY2xvc2UoKTsKK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV91bmlvbl9jb25zdHJ1Y3Rvcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiKCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGJvb2wgZGVmYXVsdF92YWx1ZSA9IGZhbHNlOworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOworICAgIGlmICgoKm1faXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJzdXBlcihfRmllbGRzLiIgPDwgY29uc3RhbnRfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpIDw8ICIsICIKKyAgICAgICAgICAgICAgICAgIDw8IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIHR5cGUsICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkpIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgIGRlZmF1bHRfdmFsdWUgPSB0cnVlOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGlmIChkZWZhdWx0X3ZhbHVlID09IGZhbHNlKSB7CisgICAgaW5kZW50KG91dCkgPDwgInN1cGVyKCk7IiA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiKF9GaWVsZHMgc2V0RmllbGQsIGphdmEubGFuZy5PYmplY3QgdmFsdWUpIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHN1cGVyKHNldEZpZWxkLCB2YWx1ZSk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIigiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiIG90aGVyKSB7IgorICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICBzdXBlcihvdGhlcik7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIGRlZXBDb3B5KCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIG5ldyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIih0aGlzKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gZ2VuZXJhdGUgImNvbnN0cnVjdG9ycyIgZm9yIGVhY2ggZmllbGQKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIHRfdHlwZSogdHlwZSA9ICgqbV9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIHN0YXRpYyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiIHZhbHVlKSB7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIgeCA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiKCk7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgIHguc2V0IiA8PCBnZXRfY2FwX25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKHZhbHVlKTsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIHg7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgc3RhdGljICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIgIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgIDw8ICIoYnl0ZVtdIHZhbHVlKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIiAgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIiB4ID0gbmV3ICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIoKTsiCisgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIiAgeC5zZXQiIDw8IGdldF9jYXBfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpOworICAgICAgaWYodW5zYWZlX2JpbmFyaWVzXykgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiKGphdmEubmlvLkJ5dGVCdWZmZXIud3JhcCh2YWx1ZSkpOyIgPDwgZW5kbDsKKyAgICAgIH1lbHNleworICAgICAgICBpbmRlbnQob3V0KSA8PCAiKGphdmEubmlvLkJ5dGVCdWZmZXIud3JhcCh2YWx1ZS5jbG9uZSgpKSk7IiA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIHg7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICB9CisgIH0KK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV91bmlvbl9nZXR0ZXJzX2FuZF9zZXR0ZXJzKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8IGVuZGw7CisgICAgfQorCisgICAgdF9maWVsZCogZmllbGQgPSAoKm1faXRlcik7CisgICAgdF90eXBlKiB0eXBlID0gZmllbGQtPmdldF90eXBlKCk7CisgICAgc3RkOjpzdHJpbmcgY2FwX25hbWUgPSBnZXRfY2FwX25hbWUoZmllbGQtPmdldF9uYW1lKCkpOworICAgIGJvb2wgaXNfZGVwcmVjYXRlZCA9IHRoaXMtPmlzX2RlcHJlY2F0ZWQoZmllbGQtPmFubm90YXRpb25zXyk7CisKKyAgICBnZW5lcmF0ZV9qYXZhX2RvYyhvdXQsIGZpZWxkKTsKKyAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgIGlmIChpc19kZXByZWNhdGVkKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJARGVwcmVjYXRlZCIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgYnl0ZVtdIGdldCIgPDwgY2FwX25hbWUgPDwgIigpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICBzZXQiIDw8IGNhcF9uYW1lIDw8ICIob3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIucmlnaHRTaXplKGJ1ZmZlciIKKyAgICAgICAgICAgICAgICAgIDw8IGdldF9jYXBfbmFtZSgiZm9yIikgPDwgY2FwX25hbWUgPDwgIigpKSk7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIiAgamF2YS5uaW8uQnl0ZUJ1ZmZlciBiID0gYnVmZmVyIiA8PCBnZXRfY2FwX25hbWUoImZvciIpIDw8IGNhcF9uYW1lIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gYiA9PSBudWxsID8gbnVsbCA6IGIuYXJyYXkoKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICAgICAgb3V0IDw8IGVuZGw7CisKKyAgICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgamF2YS5uaW8uQnl0ZUJ1ZmZlciBidWZmZXIiIDw8IGdldF9jYXBfbmFtZSgiZm9yIikKKyAgICAgICAgICAgICAgICAgIDw8IGdldF9jYXBfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIigpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICBpZiAoZ2V0U2V0RmllbGQoKSA9PSBfRmllbGRzLiIgPDwgY29uc3RhbnRfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIikgeyIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgICAgIGlmKHVuc2FmZV9iaW5hcmllc18peworICAgICAgICBpbmRlbnQob3V0KQorICAgICAgICAgIDw8ICIgICAgcmV0dXJuIChqYXZhLm5pby5CeXRlQnVmZmVyKWdldEZpZWxkVmFsdWUoKTsiCisgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIH1lbHNleworICAgICAgICBpbmRlbnQob3V0KQorICAgICAgICAgIDw8ICIgICAgcmV0dXJuIG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLmNvcHlCaW5hcnkoKGphdmEubmlvLkJ5dGVCdWZmZXIpZ2V0RmllbGRWYWx1ZSgpKTsiCisgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgaW5kZW50KG91dCkgPDwgIiAgfSBlbHNlIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICAgIHRocm93IG5ldyBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbihcIkNhbm5vdCBnZXQgZmllbGQgJyIgPDwgZmllbGQtPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgIDw8ICInIGJlY2F1c2UgdW5pb24gaXMgY3VycmVudGx5IHNldCB0byBcIiArIGdldEZpZWxkRGVzYyhnZXRTZXRGaWVsZCgpKS5uYW1lKTsiCisgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIiAgfSIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoaXNfZGVwcmVjYXRlZCkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiQERlcHJlY2F0ZWQiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpKSA8PCAiIGdldCIKKyAgICAgICAgICAgICAgICAgIDw8IGdldF9jYXBfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIigpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICBpZiAoZ2V0U2V0RmllbGQoKSA9PSBfRmllbGRzLiIgPDwgY29uc3RhbnRfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIikgeyIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICAgIHJldHVybiAoIiA8PCB0eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCksIHRydWUpIDw8ICIpZ2V0RmllbGRWYWx1ZSgpOyIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICB9IGVsc2UgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgICAgdGhyb3cgbmV3IGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uKFwiQ2Fubm90IGdldCBmaWVsZCAnIiA8PCBmaWVsZC0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgPDwgIicgYmVjYXVzZSB1bmlvbiBpcyBjdXJyZW50bHkgc2V0IHRvIFwiICsgZ2V0RmllbGREZXNjKGdldFNldEZpZWxkKCkpLm5hbWUpOyIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICB9IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorCisgICAgb3V0IDw8IGVuZGw7CisKKyAgICBnZW5lcmF0ZV9qYXZhX2RvYyhvdXQsIGZpZWxkKTsKKyAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgIGlmIChpc19kZXByZWNhdGVkKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJARGVwcmVjYXRlZCIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCBzZXQiIDw8IGdldF9jYXBfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIihieXRlW10gdmFsdWUpIHsiCisgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIiAgc2V0IiA8PCBnZXRfY2FwX25hbWUoZmllbGQtPmdldF9uYW1lKCkpOworCisgICAgICBpZih1bnNhZmVfYmluYXJpZXNfKXsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIihqYXZhLm5pby5CeXRlQnVmZmVyLndyYXAodmFsdWUpKTsiIDw8IGVuZGw7CisgICAgICB9ZWxzZXsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIihqYXZhLm5pby5CeXRlQnVmZmVyLndyYXAodmFsdWUuY2xvbmUoKSkpOyIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgICAgIG91dCA8PCBlbmRsOworICAgIH0KKyAgICBpZiAoaXNfZGVwcmVjYXRlZCkgeworICAgICAgaW5kZW50KG91dCkgPDwgIkBEZXByZWNhdGVkIiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZvaWQgc2V0IiA8PCBnZXRfY2FwX25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICIoIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSkgPDwgIiB2YWx1ZSkgeyIgPDwgZW5kbDsKKyAgICBpZiAodHlwZV9jYW5fYmVfbnVsbChmaWVsZC0+Z2V0X3R5cGUoKSkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgIGlmICh2YWx1ZSA9PSBudWxsKSB0aHJvdyBuZXcgamF2YS5sYW5nLk51bGxQb2ludGVyRXhjZXB0aW9uKCk7IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnQob3V0KSA8PCAiICBzZXRGaWVsZF8gPSBfRmllbGRzLiIgPDwgY29uc3RhbnRfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgdmFsdWVfID0gdmFsdWU7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICB9Cit9CisKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdW5pb25faXNfc2V0X21ldGhvZHMob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgZW5kbDsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lID0gKCptX2l0ZXIpLT5nZXRfbmFtZSgpOworCisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBib29sZWFuIGlzIiA8PCBnZXRfY2FwX25hbWUoInNldCIpIDw8IGdldF9jYXBfbmFtZShmaWVsZF9uYW1lKSA8PCAiKCkgeyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gc2V0RmllbGRfID09IF9GaWVsZHMuIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkX25hbWUpIDw8ICI7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorfQorCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3VuaW9uX2Fic3RyYWN0X21ldGhvZHMob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBnZW5lcmF0ZV9jaGVja190eXBlKG91dCwgdHN0cnVjdCk7CisgIG91dCA8PCBlbmRsOworICBnZW5lcmF0ZV9zdGFuZGFyZF9zY2hlbWVfcmVhZF92YWx1ZShvdXQsIHRzdHJ1Y3QpOworICBvdXQgPDwgZW5kbDsKKyAgZ2VuZXJhdGVfc3RhbmRhcmRfc2NoZW1lX3dyaXRlX3ZhbHVlKG91dCwgdHN0cnVjdCk7CisgIG91dCA8PCBlbmRsOworICBnZW5lcmF0ZV90dXBsZV9zY2hlbWVfcmVhZF92YWx1ZShvdXQsIHRzdHJ1Y3QpOworICBvdXQgPDwgZW5kbDsKKyAgZ2VuZXJhdGVfdHVwbGVfc2NoZW1lX3dyaXRlX3ZhbHVlKG91dCwgdHN0cnVjdCk7CisgIG91dCA8PCBlbmRsOworICBnZW5lcmF0ZV9nZXRfZmllbGRfZGVzYyhvdXQsIHRzdHJ1Y3QpOworICBvdXQgPDwgZW5kbDsKKyAgZ2VuZXJhdGVfZ2V0X3N0cnVjdF9kZXNjKG91dCwgdHN0cnVjdCk7CisgIG91dCA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicHJvdGVjdGVkIF9GaWVsZHMgZW51bUZvcklkKHNob3J0IGlkKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gX0ZpZWxkcy5maW5kQnlUaHJpZnRJZE9yVGhyb3coaWQpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY2hlY2tfdHlwZShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGluZGVudChvdXQpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGw7CisgIGluZGVudChvdXQpCisgICAgICA8PCAicHJvdGVjdGVkIHZvaWQgY2hlY2tUeXBlKF9GaWVsZHMgc2V0RmllbGQsIGphdmEubGFuZy5PYmplY3QgdmFsdWUpIHRocm93cyBqYXZhLmxhbmcuQ2xhc3NDYXN0RXhjZXB0aW9uIHsiCisgICAgICA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChzZXRGaWVsZCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAoKm1faXRlcik7CisKKyAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICI6IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgIGlmICh2YWx1ZSBpbnN0YW5jZW9mICIgPDwgdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpLCB0cnVlLCBmYWxzZSwgdHJ1ZSkKKyAgICAgICAgICAgICAgICA8PCAiKSB7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgICAgYnJlYWs7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgIH0iIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IGphdmEubGFuZy5DbGFzc0Nhc3RFeGNlcHRpb24oXCJXYXMgZXhwZWN0aW5nIHZhbHVlIG9mIHR5cGUgIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSwgdHJ1ZSwgZmFsc2UpIDw8ICIgZm9yIGZpZWxkICciIDw8IGZpZWxkLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgPDwgIicsIGJ1dCBnb3QgXCIgKyB2YWx1ZS5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSk7IiA8PCBlbmRsOworICAgIC8vIGRvIHRoZSByZWFsIGNoZWNrIGhlcmUKKyAgfQorCisgIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oXCJVbmtub3duIGZpZWxkIGlkIFwiICsgc2V0RmllbGQpOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdGFuZGFyZF9zY2hlbWVfcmVhZF92YWx1ZShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGluZGVudChvdXQpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJwcm90ZWN0ZWQgamF2YS5sYW5nLk9iamVjdCBzdGFuZGFyZFNjaGVtZVJlYWRWYWx1ZShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgIgorICAgICAgICAgICAgICAgICAiaXByb3QsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCBmaWVsZCkgdGhyb3dzICIKKyAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geyIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQob3V0KSA8PCAiX0ZpZWxkcyBzZXRGaWVsZCA9IF9GaWVsZHMuZmluZEJ5VGhyaWZ0SWQoZmllbGQuaWQpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgImlmIChzZXRGaWVsZCAhPSBudWxsKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoc2V0RmllbGQpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIHRfZmllbGQqIGZpZWxkID0gKCptX2l0ZXIpOworCisgICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKGZpZWxkLnR5cGUgPT0gIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiX0ZJRUxEX0RFU0MudHlwZSkgeyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiOyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgZmllbGQsICIiKTsKKyAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuICIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIG51bGw7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBqYXZhLmxhbmcuSWxsZWdhbFN0YXRlRXhjZXB0aW9uKFwic2V0RmllbGQgd2Fzbid0IG51bGwsIGJ1dCBkaWRuJ3QgbWF0Y2ggYW55ICIKKyAgICAgICAgICAgICAgICAgIm9mIHRoZSBjYXNlIHN0YXRlbWVudHMhXCIpOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gbnVsbDsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0YW5kYXJkX3NjaGVtZV93cml0ZV92YWx1ZShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGluZGVudChvdXQpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJwcm90ZWN0ZWQgdm9pZCBzdGFuZGFyZFNjaGVtZVdyaXRlVmFsdWUob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sICIKKyAgICAgICAgICAgICAgICAgIm9wcm90KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKHNldEZpZWxkXykgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAoKm1faXRlcik7CisKKyAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICI6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiID0gKCIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCksIHRydWUsIGZhbHNlKSA8PCAiKXZhbHVlXzsiIDw8IGVuZGw7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgZmllbGQsICIiKTsKKyAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICB0aHJvdyBuZXcgamF2YS5sYW5nLklsbGVnYWxTdGF0ZUV4Y2VwdGlvbihcIkNhbm5vdCB3cml0ZSB1bmlvbiB3aXRoIHVua25vd24gZmllbGQgXCIgKyAiCisgICAgICAgICAgICAgICAgICJzZXRGaWVsZF8pOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworCisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3R1cGxlX3NjaGVtZV9yZWFkX3ZhbHVlKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInByb3RlY3RlZCBqYXZhLmxhbmcuT2JqZWN0IHR1cGxlU2NoZW1lUmVhZFZhbHVlKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCAiCisgICAgICAgICAgICAgICAgICJpcHJvdCwgc2hvcnQgZmllbGRJRCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geyIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQob3V0KSA8PCAiX0ZpZWxkcyBzZXRGaWVsZCA9IF9GaWVsZHMuZmluZEJ5VGhyaWZ0SWQoZmllbGRJRCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiaWYgKHNldEZpZWxkICE9IG51bGwpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChzZXRGaWVsZCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAoKm1faXRlcik7CisKKyAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICI6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiOyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgZmllbGQsICIiKTsKKyAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuICIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IGphdmEubGFuZy5JbGxlZ2FsU3RhdGVFeGNlcHRpb24oXCJzZXRGaWVsZCB3YXNuJ3QgbnVsbCwgYnV0IGRpZG4ndCBtYXRjaCBhbnkgIgorICAgICAgICAgICAgICAgICAib2YgdGhlIGNhc2Ugc3RhdGVtZW50cyFcIik7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJ0aHJvdyBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sRXhjZXB0aW9uKFwiQ291bGRuJ3QgZmluZCBhIGZpZWxkIHdpdGggZmllbGQgaWQgXCIgKyBmaWVsZElEKTsiCisgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90dXBsZV9zY2hlbWVfd3JpdGVfdmFsdWUob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpbmRlbnQob3V0KSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicHJvdGVjdGVkIHZvaWQgdHVwbGVTY2hlbWVXcml0ZVZhbHVlKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBvcHJvdCkgIgorICAgICAgICAgICAgICAgICAidGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geyIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChzZXRGaWVsZF8pIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIHRfZmllbGQqIGZpZWxkID0gKCptX2l0ZXIpOworCisgICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCksIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiA9ICgiCisgICAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpLCB0cnVlLCBmYWxzZSkgPDwgIil2YWx1ZV87IiA8PCBlbmRsOworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsIGZpZWxkLCAiIik7CisgICAgaW5kZW50KG91dCkgPDwgInJldHVybjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IGphdmEubGFuZy5JbGxlZ2FsU3RhdGVFeGNlcHRpb24oXCJDYW5ub3Qgd3JpdGUgdW5pb24gd2l0aCB1bmtub3duIGZpZWxkIFwiICsgIgorICAgICAgICAgICAgICAgICAic2V0RmllbGRfKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nZXRfZmllbGRfZGVzYyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGluZGVudChvdXQpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJwcm90ZWN0ZWQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkIGdldEZpZWxkRGVzYyhfRmllbGRzIHNldEZpZWxkKSB7IgorICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKHNldEZpZWxkKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAoKm1faXRlcik7CisgICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiOiIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiX0ZJRUxEX0RFU0M7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICB0aHJvdyBuZXcgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihcIlVua25vd24gZmllbGQgaWQgXCIgKyBzZXRGaWVsZCk7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2dldF9zdHJ1Y3RfZGVzYyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgICh2b2lkKXRzdHJ1Y3Q7CisgIGluZGVudChvdXQpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJwcm90ZWN0ZWQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFN0cnVjdCBnZXRTdHJ1Y3REZXNjKCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIFNUUlVDVF9ERVNDOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdW5pb25fY29tcGFyaXNvbnMob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICAvLyBlcXVhbGl0eQorICBpbmRlbnQob3V0KSA8PCAicHVibGljIGJvb2xlYW4gZXF1YWxzKGphdmEubGFuZy5PYmplY3Qgb3RoZXIpIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIGlmIChvdGhlciBpbnN0YW5jZW9mICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICAgIHJldHVybiBlcXVhbHMoKCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKW90aGVyKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIH0gZWxzZSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICAgIHJldHVybiBmYWxzZTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIH0iIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgIG91dCA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgYm9vbGVhbiBlcXVhbHMoIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgb3RoZXIpIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBvdGhlciAhPSBudWxsICYmIGdldFNldEZpZWxkKCkgPT0gb3RoZXIuZ2V0U2V0RmllbGQoKSAmJiAiCisgICAgICAgICAgICAgICAgICJnZXRGaWVsZFZhbHVlKCkuZXF1YWxzKG90aGVyLmdldEZpZWxkVmFsdWUoKSk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgb3V0IDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBpbnQgY29tcGFyZVRvKCIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIgb3RoZXIpIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIGludCBsYXN0Q29tcGFyaXNvbiA9IG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLmNvbXBhcmVUbyhnZXRTZXRGaWVsZCgpLCAiCisgICAgICAgICAgICAgICAgICJvdGhlci5nZXRTZXRGaWVsZCgpKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIGlmIChsYXN0Q29tcGFyaXNvbiA9PSAwKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICAgIHJldHVybiBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5jb21wYXJlVG8oZ2V0RmllbGRWYWx1ZSgpLCAiCisgICAgICAgICAgICAgICAgICJvdGhlci5nZXRGaWVsZFZhbHVlKCkpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgfSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIGxhc3RDb21wYXJpc29uOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIG91dCA8PCBlbmRsOworfQorCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3VuaW9uX2hhc2hjb2RlKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgKHZvaWQpdHN0cnVjdDsKKyAgaW5kZW50KG91dCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBpbnQgaGFzaENvZGUoKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICBqYXZhLnV0aWwuTGlzdDxqYXZhLmxhbmcuT2JqZWN0PiBsaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3Q8amF2YS5sYW5nLk9iamVjdD4oKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIGxpc3QuYWRkKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgb3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkSWRFbnVtIHNldEZpZWxkID0gZ2V0U2V0RmllbGQoKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIGlmIChzZXRGaWVsZCAhPSBudWxsKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICAgIGxpc3QuYWRkKHNldEZpZWxkLmdldFRocmlmdEZpZWxkSWQoKSk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICAgIGphdmEubGFuZy5PYmplY3QgdmFsdWUgPSBnZXRGaWVsZFZhbHVlKCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIG9yZy5hcGFjaGUudGhyaWZ0LlRFbnVtKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICAgICAgbGlzdC5hZGQoKChvcmcuYXBhY2hlLnRocmlmdC5URW51bSlnZXRGaWVsZFZhbHVlKCkpLmdldFZhbHVlKCkpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgICB9IGVsc2UgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgICAgIGxpc3QuYWRkKHZhbHVlKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgICAgfSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgfSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIGxpc3QuaGFzaENvZGUoKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IjsKK30KKworLyoqCisgKiBKYXZhIHN0cnVjdCBkZWZpbml0aW9uLiBUaGlzIGhhcyB2YXJpb3VzIHBhcmFtZXRlcnMsIGFzIGl0IGNvdWxkIGJlCisgKiBnZW5lcmF0ZWQgc3RhbmRhbG9uZSBvciBpbnNpZGUgYW5vdGhlciBjbGFzcyBhcyBhIGhlbHBlci4gSWYgaXQKKyAqIGlzIGEgaGVscGVyIHRoYW4gaXQgaXMgYSBzdGF0aWMgY2xhc3MuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgICAgICBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqIEBwYXJhbSBpc19leGNlcHRpb24gSXMgdGhpcyBhbiBleGNlcHRpb24/CisgKiBAcGFyYW0gaW5fY2xhc3MgICAgIElmIGluc2lkZSBhIGNsYXNzLCBuZWVkcyB0byBiZSBzdGF0aWMgY2xhc3MKKyAqIEBwYXJhbSBpc19yZXN1bHQgICAgSWYgdGhpcyBpcyBhIHJlc3VsdCBpdCBuZWVkcyBhIGRpZmZlcmVudCB3cml0ZXIKKyAqLwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0KSB7CisgIGdlbmVyYXRlX2phdmFfZG9jKG91dCwgdHN0cnVjdCk7CisKKyAgYm9vbCBpc19maW5hbCA9ICh0c3RydWN0LT5hbm5vdGF0aW9uc18uZmluZCgiZmluYWwiKSAhPSB0c3RydWN0LT5hbm5vdGF0aW9uc18uZW5kKCkpOworICBib29sIGlzX2RlcHJlY2F0ZWQgPSB0aGlzLT5pc19kZXByZWNhdGVkKHRzdHJ1Y3QtPmFubm90YXRpb25zXyk7CisKKyAgaWYgKCFpbl9jbGFzcyAmJiAhc3VwcHJlc3NfZ2VuZXJhdGVkX2Fubm90YXRpb25zXykgeworICAgIGdlbmVyYXRlX2phdmF4X2dlbmVyYXRlZF9hbm5vdGF0aW9uKG91dCk7CisgIH0KKworICBpZiAoaXNfZGVwcmVjYXRlZCkgeworICAgIGluZGVudChvdXQpIDw8ICJARGVwcmVjYXRlZCIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgKGlzX2ZpbmFsID8gImZpbmFsICIgOiAiIikgPDwgKGluX2NsYXNzID8gInN0YXRpYyAiIDogIiIpIDw8ICJjbGFzcyAiCisgICAgICAgICAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiAiOworCisgIGlmIChpc19leGNlcHRpb24pIHsKKyAgICBvdXQgPDwgImV4dGVuZHMgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiAiOworICB9CisgIG91dCA8PCAiaW1wbGVtZW50cyBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZTwiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiwgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpCisgICAgICA8PCAiLl9GaWVsZHM+LCBqYXZhLmlvLlNlcmlhbGl6YWJsZSwgQ2xvbmVhYmxlLCBDb21wYXJhYmxlPCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiPiI7CisKKyAgaWYgKGFuZHJvaWRfc3R5bGVfKSB7CisgICAgb3V0IDw8ICIsIGFuZHJvaWQub3MuUGFyY2VsYWJsZSI7CisgIH0KKworICBvdXQgPDwgIiAiOworCisgIHNjb3BlX3VwKG91dCk7CisKKyAgZ2VuZXJhdGVfc3RydWN0X2Rlc2Mob3V0LCB0c3RydWN0KTsKKworICAvLyBNZW1iZXJzIGFyZSBwdWJsaWMgZm9yIC1qYXZhLCBwcml2YXRlIGZvciAtamF2YWJlYW4KKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBvdXQgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9maWVsZF9kZXNjcyhvdXQsIHRzdHJ1Y3QpOworCisgIG91dCA8PCBlbmRsOworCisgIGdlbmVyYXRlX3NjaGVtZV9tYXAob3V0LCB0c3RydWN0KTsKKworICBvdXQgPDwgZW5kbDsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgaWYgKGJlYW5fc3R5bGVfIHx8IHByaXZhdGVfbWVtYmVyc18pIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJwcml2YXRlICI7CisgICAgfSBlbHNlIHsKKyAgICAgIGdlbmVyYXRlX2phdmFfZG9jKG91dCwgKm1faXRlcik7CisgICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljICI7CisgICAgfQorICAgIG91dCA8PCBkZWNsYXJlX2ZpZWxkKCptX2l0ZXIsIGZhbHNlLCB0cnVlKSA8PCBlbmRsOworICB9CisKKyAgb3V0IDw8IGVuZGw7CisKKyAgaWYgKGFuZHJvaWRfc3R5bGVfKSB7CisgICAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfcGFyY2VsYWJsZShvdXQsIHRzdHJ1Y3QpOworICB9CisKKyAgZ2VuZXJhdGVfZmllbGRfbmFtZV9jb25zdGFudHMob3V0LCB0c3RydWN0KTsKKworICAvLyBpc3NldCBkYXRhCisgIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIGluZGVudChvdXQpIDw8ICIvLyBpc3NldCBpZCBhc3NpZ25tZW50cyIgPDwgZW5kbDsKKworICAgIGludCBpID0gMDsKKyAgICBpbnQgb3B0aW9uYWxzID0gMDsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTCkgeworICAgICAgICBvcHRpb25hbHMrKzsKKyAgICAgIH0KKyAgICAgIGlmICghdHlwZV9jYW5fYmVfbnVsbCgoKm1faXRlciktPmdldF90eXBlKCkpKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgIiA8PCBpc3NldF9maWVsZF9pZCgqbV9pdGVyKSA8PCAiID0gIiA8PCBpIDw8ICI7IgorICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICBpKys7CisgICAgICB9CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgcHJpbWl0aXZlVHlwZTsKKyAgICBzd2l0Y2ggKG5lZWRzX2lzc2V0KHRzdHJ1Y3QsICZwcmltaXRpdmVUeXBlKSkgeworICAgIGNhc2UgSVNTRVRfTk9ORToKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSVNTRVRfUFJJTUlUSVZFOgorICAgICAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgIiA8PCBwcmltaXRpdmVUeXBlIDw8ICIgX19pc3NldF9iaXRmaWVsZCA9IDA7IiA8PCBlbmRsOworICAgICAgYnJlYWs7CisgICAgY2FzZSBJU1NFVF9CSVRTRVQ6CisgICAgICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBqYXZhLnV0aWwuQml0U2V0IF9faXNzZXRfYml0X3ZlY3RvciA9IG5ldyBqYXZhLnV0aWwuQml0U2V0KCIgPDwgaSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAob3B0aW9uYWxzID4gMCkgeworICAgICAgc3RkOjpzdHJpbmcgb3V0cHV0X3N0cmluZyA9ICJwcml2YXRlIHN0YXRpYyBmaW5hbCBfRmllbGRzIG9wdGlvbmFsc1tdID0geyI7CisgICAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMKSB7CisgICAgICAgICAgb3V0cHV0X3N0cmluZyA9IG91dHB1dF9zdHJpbmcgKyAiX0ZpZWxkcy4iICsgY29uc3RhbnRfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpICsgIiwiOworICAgICAgICB9CisgICAgICB9CisgICAgICBpbmRlbnQob3V0KSA8PCBvdXRwdXRfc3RyaW5nLnN1YnN0cigwLCBvdXRwdXRfc3RyaW5nLmxlbmd0aCgpIC0gMSkgPDwgIn07IiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIGdlbmVyYXRlX2phdmFfbWV0YV9kYXRhX21hcChvdXQsIHRzdHJ1Y3QpOworCisgIGJvb2wgYWxsX29wdGlvbmFsX21lbWJlcnMgPSB0cnVlOworCisgIC8vIERlZmF1bHQgY29uc3RydWN0b3IKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIigpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOworICAgIGlmICgoKm1faXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKKyAgICAgIHByaW50X2NvbnN0X3ZhbHVlKG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzLiIgKyAoKm1faXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICB0LAorICAgICAgICAgICAgICAgICAgICAgICAgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKKyAgICB9CisgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKKyAgICAgIGFsbF9vcHRpb25hbF9tZW1iZXJzID0gZmFsc2U7CisgICAgfQorICB9CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaWYgKCFtZW1iZXJzLmVtcHR5KCkgJiYgIWFsbF9vcHRpb25hbF9tZW1iZXJzKSB7CisgICAgLy8gRnVsbCBjb25zdHJ1Y3RvciBmb3IgYWxsIGZpZWxkcworICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX09QVElPTkFMKSB7CisgICAgICAgIGlmICghZmlyc3QpIHsKKyAgICAgICAgICBvdXQgPDwgIiwiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgIH0KKyAgICB9CisgICAgb3V0IDw8ICIpIiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgInRoaXMoKTsiIDw8IGVuZGw7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKKyAgICAgICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOworICAgICAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgICBpZih1bnNhZmVfYmluYXJpZXNfKXsKKyAgICAgICAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAiID0gIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICI7IiA8PCBlbmRsOworICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgPSBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5jb3B5QmluYXJ5KCIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAiKTsiIDw8IGVuZGw7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIKKyAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIGdlbmVyYXRlX2lzc2V0X3NldChvdXQsICgqbV9pdGVyKSwgIiIpOworICAgICAgfQorICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIC8vIGNvcHkgY29uc3RydWN0b3IKKyAgaW5kZW50KG91dCkgPDwgIi8qKiIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAqIFBlcmZvcm1zIGEgZGVlcCBjb3B5IG9uIDxpPm90aGVyPC9pPi4iIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgKi8iIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgb3RoZXIpIHsiCisgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIHN3aXRjaCAobmVlZHNfaXNzZXQodHN0cnVjdCkpIHsKKyAgY2FzZSBJU1NFVF9OT05FOgorICAgIGJyZWFrOworICBjYXNlIElTU0VUX1BSSU1JVElWRToKKyAgICBpbmRlbnQob3V0KSA8PCAiX19pc3NldF9iaXRmaWVsZCA9IG90aGVyLl9faXNzZXRfYml0ZmllbGQ7IiA8PCBlbmRsOworICAgIGJyZWFrOworICBjYXNlIElTU0VUX0JJVFNFVDoKKyAgICBpbmRlbnQob3V0KSA8PCAiX19pc3NldF9iaXRfdmVjdG9yLmNsZWFyKCk7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJfX2lzc2V0X2JpdF92ZWN0b3Iub3Iob3RoZXIuX19pc3NldF9iaXRfdmVjdG9yKTsiIDw8IGVuZGw7CisgICAgYnJlYWs7CisgIH0KKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAoKm1faXRlcik7CisgICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9IGZpZWxkLT5nZXRfbmFtZSgpOworICAgIHRfdHlwZSogdHlwZSA9IGZpZWxkLT5nZXRfdHlwZSgpLT5nZXRfdHJ1ZV90eXBlKCk7CisgICAgYm9vbCBjYW5fYmVfbnVsbCA9IHR5cGVfY2FuX2JlX251bGwodHlwZSk7CisKKyAgICBpZiAoY2FuX2JlX251bGwpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAob3RoZXIuIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjayhmaWVsZCkgPDwgIikgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKworICAgIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgICAgZ2VuZXJhdGVfZGVlcF9jb3B5X2NvbnRhaW5lcihvdXQsICJvdGhlciIsIGZpZWxkX25hbWUsICJfX3RoaXNfXyIgKyBmaWVsZF9uYW1lLCB0eXBlKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID0gX190aGlzX18iIDw8IGZpZWxkX25hbWUgPDwgIjsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID0gIjsKKyAgICAgIGdlbmVyYXRlX2RlZXBfY29weV9ub25fY29udGFpbmVyKG91dCwgIm90aGVyLiIgKyBmaWVsZF9uYW1lLCBmaWVsZF9uYW1lLCB0eXBlKTsKKyAgICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpZiAoY2FuX2JlX251bGwpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIGNsb25lIG1ldGhvZCwgc28gdGhhdCB5b3UgY2FuIGRlZXAgY29weSBhbiBvYmplY3Qgd2hlbiB5b3UgZG9uJ3Qga25vdyBpdHMgY2xhc3MuCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgZGVlcENvcHkoKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gbmV3ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKHRoaXMpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9jbGVhcihvdXQsIHRzdHJ1Y3QpOworCisgIGdlbmVyYXRlX2phdmFfYmVhbl9ib2lsZXJwbGF0ZShvdXQsIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9nZW5lcmljX2ZpZWxkX2dldHRlcnNfc2V0dGVycyhvdXQsIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9nZW5lcmljX2lzc2V0X21ldGhvZChvdXQsIHRzdHJ1Y3QpOworCisgIGdlbmVyYXRlX2phdmFfc3RydWN0X2VxdWFsaXR5KG91dCwgdHN0cnVjdCk7CisgIGdlbmVyYXRlX2phdmFfc3RydWN0X2NvbXBhcmVfdG8ob3V0LCB0c3RydWN0KTsKKyAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfZmllbGRfYnlfaWQob3V0LCB0c3RydWN0KTsKKworICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9yZWFkZXIob3V0LCB0c3RydWN0KTsKKyAgaWYgKGlzX3Jlc3VsdCkgeworICAgIGdlbmVyYXRlX2phdmFfc3RydWN0X3Jlc3VsdF93cml0ZXIob3V0LCB0c3RydWN0KTsKKyAgfSBlbHNlIHsKKyAgICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF93cml0ZXIob3V0LCB0c3RydWN0KTsKKyAgfQorICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF90b3N0cmluZyhvdXQsIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9qYXZhX3ZhbGlkYXRvcihvdXQsIHRzdHJ1Y3QpOworCisgIGdlbmVyYXRlX2phdmFfc3RydWN0X3dyaXRlX29iamVjdChvdXQsIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9yZWFkX29iamVjdChvdXQsIHRzdHJ1Y3QpOworCisgIGdlbmVyYXRlX2phdmFfc3RydWN0X3N0YW5kYXJkX3NjaGVtZShvdXQsIHRzdHJ1Y3QsIGlzX3Jlc3VsdCk7CisgIGdlbmVyYXRlX2phdmFfc3RydWN0X3R1cGxlX3NjaGVtZShvdXQsIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9qYXZhX3NjaGVtZV9sb29rdXAob3V0KTsKKworICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBlbmRsOworfQorCisvKioKKyAqIGdlbmVyYXRlcyBwYXJjZWxhYmxlIGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbgorICovCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X3BhcmNlbGFibGUob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBzdHJpbmcgdG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJwdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKGFuZHJvaWQub3MuUGFyY2VsIG91dCwgaW50IGZsYWdzKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgc3RyaW5nIGJpdHNldFByaW1pdGl2ZVR5cGUgPSAiIjsKKyAgc3dpdGNoIChuZWVkc19pc3NldCh0c3RydWN0LCAmYml0c2V0UHJpbWl0aXZlVHlwZSkpIHsKKyAgY2FzZSBJU1NFVF9OT05FOgorICAgIGJyZWFrOworICBjYXNlIElTU0VUX1BSSU1JVElWRToKKyAgICBpbmRlbnQob3V0KSA8PCAiLy9wcmltaXRpdmUgYml0ZmllbGQgb2YgdHlwZTogIiA8PCBiaXRzZXRQcmltaXRpdmVUeXBlIDw8IGVuZGw7CisgICAgaWYgKGJpdHNldFByaW1pdGl2ZVR5cGUgPT0gImJ5dGUiKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAib3V0LndyaXRlQnl0ZShfX2lzc2V0X2JpdGZpZWxkKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmIChiaXRzZXRQcmltaXRpdmVUeXBlID09ICJzaG9ydCIpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJvdXQud3JpdGVJbnQobmV3IFNob3J0KF9faXNzZXRfYml0ZmllbGQpLmludFZhbHVlKCkpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKGJpdHNldFByaW1pdGl2ZVR5cGUgPT0gImludCIpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJvdXQud3JpdGVJbnQoX19pc3NldF9iaXRmaWVsZCk7IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAoYml0c2V0UHJpbWl0aXZlVHlwZSA9PSAibG9uZyIpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJvdXQud3JpdGVMb25nKF9faXNzZXRfYml0ZmllbGQpOyIgPDwgZW5kbDsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgICAgYnJlYWs7CisgIGNhc2UgSVNTRVRfQklUU0VUOgorICAgIGluZGVudChvdXQpIDw8ICIvL0JpdFNldCIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAib3V0LndyaXRlU2VyaWFsaXphYmxlKF9faXNzZXRfYml0X3ZlY3Rvcik7IiA8PCBlbmRsOworICAgIG91dCA8PCBlbmRsOworICAgIGJyZWFrOworICB9CisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgc3RyaW5nIG5hbWUgPSAoKm1faXRlciktPmdldF9uYW1lKCk7CisKKyAgICBpZiAodC0+aXNfc3RydWN0KCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJvdXQud3JpdGVQYXJjZWxhYmxlKCIgPDwgbmFtZSA8PCAiLCBmbGFncyk7IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAodHlwZV9uYW1lKHQpID09ICJmbG9hdCIpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJvdXQud3JpdGVGbG9hdCgiIDw8IG5hbWUgPDwgIik7IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAodC0+aXNfZW51bSgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAib3V0LndyaXRlSW50KCIgPDwgbmFtZSA8PCAiICE9IG51bGwgPyAiIDw8IG5hbWUgPDwgIi5nZXRWYWx1ZSgpIDogLTEpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKHQtPmlzX2xpc3QoKSkgeworICAgICAgaWYgKCgodF9saXN0Kil0KS0+Z2V0X2VsZW1fdHlwZSgpLT5nZXRfdHJ1ZV90eXBlKCktPmlzX3N0cnVjdCgpKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJvdXQud3JpdGVUeXBlZExpc3QoIiA8PCBuYW1lIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJvdXQud3JpdGVMaXN0KCIgPDwgbmFtZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0LT5pc19tYXAoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIm91dC53cml0ZU1hcCgiIDw8IG5hbWUgPDwgIik7IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAodC0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIGlmICh0LT5pc19iaW5hcnkoKSkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAib3V0LndyaXRlSW50KCIgPDwgbmFtZSA8PCAiIT1udWxsID8gMSA6IDApOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgImlmKCIgPDwgbmFtZSA8PCAiICE9IG51bGwpIHsgIiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIm91dC53cml0ZUJ5dGVBcnJheSgiIDw8IG5hbWUgPDwgIi5hcnJheSgpLCAiIDw8IG5hbWUgPDwgIi5wb3NpdGlvbigpICsgIgorICAgICAgICAgICAgICAgICAgICA8PCBuYW1lIDw8ICIuYXJyYXlPZmZzZXQoKSwgIiA8PCBuYW1lIDw8ICIubGltaXQoKSAtICIgPDwgbmFtZQorICAgICAgICAgICAgICAgICAgICA8PCAiLnBvc2l0aW9uKCkgKTsiIDw8IGVuZGw7CisgICAgICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHN3aXRjaCAoKCh0X2Jhc2VfdHlwZSopdCktPmdldF9iYXNlKCkpIHsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgIm91dC53cml0ZUludChuZXcgU2hvcnQoIiA8PCBuYW1lIDw8ICIpLmludFZhbHVlKCkpOyIgPDwgZW5kbDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgIm91dC53cml0ZUludCgiIDw8IG5hbWUgPDwgIik7IiA8PCBlbmRsOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAib3V0LndyaXRlTG9uZygiIDw8IG5hbWUgPDwgIik7IiA8PCBlbmRsOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgIm91dC53cml0ZUludCgiIDw8IG5hbWUgPDwgIiA/IDEgOiAwKTsiIDw8IGVuZGw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgIm91dC53cml0ZUJ5dGUoIiA8PCBuYW1lIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgIm91dC53cml0ZURvdWJsZSgiIDw8IG5hbWUgPDwgIik7IiA8PCBlbmRsOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAib3V0LndyaXRlU3RyaW5nKCIgPDwgbmFtZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBlbmRsOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gMDsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgb3V0IDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHRuYW1lIDw8ICIoYW5kcm9pZC5vcy5QYXJjZWwgaW4pIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICAvLyByZWFkIGluIHRoZSByZXF1aXJlZCBiaXRmaWVsZAorICBzd2l0Y2ggKG5lZWRzX2lzc2V0KHRzdHJ1Y3QsICZiaXRzZXRQcmltaXRpdmVUeXBlKSkgeworICBjYXNlIElTU0VUX05PTkU6CisgICAgYnJlYWs7CisgIGNhc2UgSVNTRVRfUFJJTUlUSVZFOgorICAgIGluZGVudChvdXQpIDw8ICIvL3ByaW1pdGl2ZSBiaXRmaWVsZCBvZiB0eXBlOiAiIDw8IGJpdHNldFByaW1pdGl2ZVR5cGUgPDwgZW5kbDsKKyAgICBpZiAoYml0c2V0UHJpbWl0aXZlVHlwZSA9PSAiYnl0ZSIpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJfX2lzc2V0X2JpdGZpZWxkID0gaW4ucmVhZEJ5dGUoKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmIChiaXRzZXRQcmltaXRpdmVUeXBlID09ICJzaG9ydCIpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJfX2lzc2V0X2JpdGZpZWxkID0gKHNob3J0KSBpbi5yZWFkSW50KCk7IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAoYml0c2V0UHJpbWl0aXZlVHlwZSA9PSAiaW50IikgeworICAgICAgaW5kZW50KG91dCkgPDwgIl9faXNzZXRfYml0ZmllbGQgPSBpbi5yZWFkSW50KCk7IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAoYml0c2V0UHJpbWl0aXZlVHlwZSA9PSAibG9uZyIpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJfX2lzc2V0X2JpdGZpZWxkID0gaW4ucmVhZExvbmcoKTsiIDw8IGVuZGw7CisgICAgfQorICAgIG91dCA8PCBlbmRsOworICAgIGJyZWFrOworICBjYXNlIElTU0VUX0JJVFNFVDoKKyAgICBpbmRlbnQob3V0KSA8PCAiLy9CaXRTZXQiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIl9faXNzZXRfYml0X3ZlY3RvciA9IChqYXZhLnV0aWwuQml0U2V0KSBpbi5yZWFkU2VyaWFsaXphYmxlKCk7IiA8PCBlbmRsOworICAgIG91dCA8PCBlbmRsOworICAgIGJyZWFrOworICB9CisgIC8vIHJlYWQgYWxsIHRoZSBmaWVsZHMKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICBzdHJpbmcgbmFtZSA9ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICBzdHJpbmcgcHJlZml4ID0gInRoaXMuIiArIG5hbWU7CisKKyAgICBpZiAodC0+aXNfc3RydWN0KCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiPSBpbi5yZWFkUGFyY2VsYWJsZSgiIDw8IHRuYW1lIDw8ICIuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSk7IgorICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKHQtPmlzX2VudW0oKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIgPSAiIDw8IHR5cGVfbmFtZSh0KSA8PCAiLmZpbmRCeVZhbHVlKGluLnJlYWRJbnQoKSk7IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAodC0+aXNfbGlzdCgpKSB7CisgICAgICB0X2xpc3QqIGxpc3QgPSAodF9saXN0Kil0OworICAgICAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodCwgZmFsc2UsIHRydWUpIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgICBpZiAobGlzdC0+Z2V0X2VsZW1fdHlwZSgpLT5nZXRfdHJ1ZV90eXBlKCktPmlzX3N0cnVjdCgpKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJpbi5yZWFkVHlwZWRMaXN0KCIgPDwgcHJlZml4IDw8ICIsICIgPDwgdHlwZV9uYW1lKGxpc3QtPmdldF9lbGVtX3R5cGUoKSkKKyAgICAgICAgICAgICAgICAgICAgPDwgIi5DUkVBVE9SKTsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiaW4ucmVhZExpc3QoIiA8PCBwcmVmaXggPDwgIiwgIiA8PCB0bmFtZSA8PCAiLmNsYXNzLmdldENsYXNzTG9hZGVyKCkpOyIKKyAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHQtPmlzX21hcCgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0LCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgaW4ucmVhZE1hcCgiIDw8IHByZWZpeCA8PCAiLCAiIDw8IHRuYW1lIDw8ICIuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSk7IgorICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKHR5cGVfbmFtZSh0KSA9PSAiZmxvYXQiKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiA9IGluLnJlYWRGbG9hdCgpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKHQtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZSogYnQgPSAodF9iYXNlX3R5cGUqKXQ7CisgICAgICBpZiAoYnQtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJpZihpbi5yZWFkSW50KCk9PTEpIHsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiA9IGphdmEubmlvLkJ5dGVCdWZmZXIud3JhcChpbi5jcmVhdGVCeXRlQXJyYXkoKSk7IiA8PCBlbmRsOworICAgICAgICBzY29wZV9kb3duKG91dCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzd2l0Y2ggKGJ0LT5nZXRfYmFzZSgpKSB7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICAgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiID0gKHNob3J0KSBpbi5yZWFkSW50KCk7IiA8PCBlbmRsOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiA9IGluLnJlYWRJbnQoKTsiIDw8IGVuZGw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICAgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiID0gaW4ucmVhZExvbmcoKTsiIDw8IGVuZGw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiA9IChpbi5yZWFkSW50KCk9PTEpOyIgPDwgZW5kbDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiA9IGluLnJlYWRCeXRlKCk7IiA8PCBlbmRsOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiA9IGluLnJlYWREb3VibGUoKTsiIDw8IGVuZGw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICAgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiPSBpbi5yZWFkU3RyaW5nKCk7IiA8PCBlbmRsOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQub3MuUGFyY2VsYWJsZS5DcmVhdG9yPCIgPDwgdG5hbWUKKyAgICAgICAgICAgICAgPDwgIj4gQ1JFQVRPUiA9IG5ldyBhbmRyb2lkLm9zLlBhcmNlbGFibGUuQ3JlYXRvcjwiIDw8IHRuYW1lIDw8ICI+KCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KG91dCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicHVibGljICIgPDwgdG5hbWUgPDwgIltdIG5ld0FycmF5KGludCBzaXplKSB7IgorICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgInJldHVybiBuZXcgIiA8PCB0bmFtZSA8PCAiW3NpemVdOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihvdXQpOworICBvdXQgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgIiA8PCB0bmFtZQorICAgICAgICAgICAgICA8PCAiIGNyZWF0ZUZyb21QYXJjZWwoYW5kcm9pZC5vcy5QYXJjZWwgaW4pIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIG5ldyAiIDw8IHRuYW1lIDw8ICIoaW4pOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihvdXQpOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9OyIgPDwgZW5kbDsKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGVxdWFscyBtZXRob2RzIGFuZCBhIGhhc2hDb2RlIG1ldGhvZCBmb3IgYSBzdHJ1Y3R1cmUuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfZXF1YWxpdHkob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBvdXQgPDwgaW5kZW50KCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGJvb2xlYW4gZXF1YWxzKGphdmEubGFuZy5PYmplY3QgdGhhdCkgeyIKKyAgICAgIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICh0aGF0ID09IG51bGwpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBmYWxzZTsiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAodGhhdCBpbnN0YW5jZW9mICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIiAgcmV0dXJuIHRoaXMuZXF1YWxzKCgiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIil0aGF0KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJyZXR1cm4gZmFsc2U7IiA8PCBlbmRsOworICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBlbmRsOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGJvb2xlYW4gZXF1YWxzKCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIHRoYXQpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICh0aGF0ID09IG51bGwpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBmYWxzZTsiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAodGhpcyA9PSB0aGF0KSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdHJ1ZTsiICA8PCBlbmRsOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICAvLyBNb3N0IGV4aXN0aW5nIFRocmlmdCBjb2RlIGRvZXMgbm90IHVzZSBpc3NldCBvciBvcHRpb25hbC9yZXF1aXJlZCwKKyAgICAvLyBzbyB3ZSB0cmVhdCAiZGVmYXVsdCIgZmllbGRzIGFzIHJlcXVpcmVkLgorICAgIGJvb2wgaXNfb3B0aW9uYWwgPSAoKm1faXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMOworICAgIGJvb2wgY2FuX2JlX251bGwgPSB0eXBlX2Nhbl9iZV9udWxsKHQpOworICAgIHN0cmluZyBuYW1lID0gKCptX2l0ZXIpLT5nZXRfbmFtZSgpOworCisgICAgc3RyaW5nIHRoaXNfcHJlc2VudCA9ICJ0cnVlIjsKKyAgICBzdHJpbmcgdGhhdF9wcmVzZW50ID0gInRydWUiOworICAgIHN0cmluZyB1bmVxdWFsOworCisgICAgaWYgKGlzX29wdGlvbmFsIHx8IGNhbl9iZV9udWxsKSB7CisgICAgICB0aGlzX3ByZXNlbnQgKz0gIiAmJiB0aGlzLiIgKyBnZW5lcmF0ZV9pc3NldF9jaGVjaygqbV9pdGVyKTsKKyAgICAgIHRoYXRfcHJlc2VudCArPSAiICYmIHRoYXQuIiArIGdlbmVyYXRlX2lzc2V0X2NoZWNrKCptX2l0ZXIpOworICAgIH0KKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYm9vbGVhbiB0aGlzX3ByZXNlbnRfIiA8PCBuYW1lIDw8ICIgPSAiIDw8IHRoaXNfcHJlc2VudCA8PCAiOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYm9vbGVhbiB0aGF0X3ByZXNlbnRfIiA8PCBuYW1lIDw8ICIgPSAiIDw8IHRoYXRfcHJlc2VudCA8PCAiOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKCIKKyAgICAgICAgPDwgInRoaXNfcHJlc2VudF8iIDw8IG5hbWUgPDwgIiB8fCB0aGF0X3ByZXNlbnRfIiA8PCBuYW1lIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoISgiCisgICAgICAgIDw8ICJ0aGlzX3ByZXNlbnRfIiA8PCBuYW1lIDw8ICIgJiYgdGhhdF9wcmVzZW50XyIgPDwgbmFtZSA8PCAiKSkiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgIiAgcmV0dXJuIGZhbHNlOyIgPDwgZW5kbDsKKworICAgIGlmICh0LT5pc19iaW5hcnkoKSkgeworICAgICAgdW5lcXVhbCA9ICIhdGhpcy4iICsgbmFtZSArICIuZXF1YWxzKHRoYXQuIiArIG5hbWUgKyAiKSI7CisgICAgfSBlbHNlIGlmIChjYW5fYmVfbnVsbCkgeworICAgICAgdW5lcXVhbCA9ICIhdGhpcy4iICsgbmFtZSArICIuZXF1YWxzKHRoYXQuIiArIG5hbWUgKyAiKSI7CisgICAgfSBlbHNlIHsKKyAgICAgIHVuZXF1YWwgPSAidGhpcy4iICsgbmFtZSArICIgIT0gdGhhdC4iICsgbmFtZTsKKyAgICB9CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgiIDw8IHVuZXF1YWwgPDwgIikiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGZhbHNlOyIgPDwgZW5kbDsKKworICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgfQorICBvdXQgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInJldHVybiB0cnVlOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihvdXQpOworICBvdXQgPDwgZW5kbDsKKworICBjb25zdCBpbnQgTVVMID0gODE5MTsgLy8gSGFzaENvZGUgbXVsdGlwbGllcgorICBjb25zdCBpbnQgQl9ZRVMgPSAxMzEwNzE7CisgIGNvbnN0IGludCBCX05PID0gNTI0Mjg3OworICBvdXQgPDwgaW5kZW50KCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGludCBoYXNoQ29kZSgpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAiaW50IGhhc2hDb2RlID0gMTsiIDw8IGVuZGw7CisKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIG91dCA8PCBlbmRsOworCisgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOworICAgIGJvb2wgaXNfb3B0aW9uYWwgPSAoKm1faXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMOworICAgIGJvb2wgY2FuX2JlX251bGwgPSB0eXBlX2Nhbl9iZV9udWxsKHQpOworICAgIHN0cmluZyBuYW1lID0gKCptX2l0ZXIpLT5nZXRfbmFtZSgpOworCisgICAgaWYgKGlzX29wdGlvbmFsIHx8IGNhbl9iZV9udWxsKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaGFzaENvZGUgPSBoYXNoQ29kZSAqICIgPDwgTVVMIDw8ICIgKyAoKCIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKm1faXRlcikKKyAgICAgICAgICAgICAgICAgIDw8ICIpID8gIiA8PCBCX1lFUyA8PCAiIDogIiA8PCBCX05PIDw8ICIpOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpZiAoaXNfb3B0aW9uYWwgfHwgY2FuX2JlX251bGwpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiArIGdlbmVyYXRlX2lzc2V0X2NoZWNrKCptX2l0ZXIpICsgIikiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICB9CisKKyAgICBpZiAodC0+aXNfZW51bSgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaGFzaENvZGUgPSBoYXNoQ29kZSAqICIgPDwgTVVMIDw8ICIgKyAiIDw8IG5hbWUgPDwgIi5nZXRWYWx1ZSgpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKHQtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICBzd2l0Y2goKCh0X2Jhc2VfdHlwZSopdCktPmdldF9iYXNlKCkpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICBpbmRlbnQob3V0KSA8PCAiaGFzaENvZGUgPSBoYXNoQ29kZSAqICIgPDwgTVVMIDw8ICIgKyAiIDw8IG5hbWUgPDwgIi5oYXNoQ29kZSgpOyIgPDwgZW5kbDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIGluZGVudChvdXQpIDw8ICJoYXNoQ29kZSA9IGhhc2hDb2RlICogIiA8PCBNVUwgPDwgIiArICgoIiA8PCBuYW1lIDw8ICIpID8gIgorICAgICAgICAgICAgICAgICAgICA8PCBCX1lFUyA8PCAiIDogIiA8PCBCX05PIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICBpbmRlbnQob3V0KSA8PCAiaGFzaENvZGUgPSBoYXNoQ29kZSAqICIgPDwgTVVMIDw8ICIgKyAoaW50KSAoIiA8PCBuYW1lIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBpbmRlbnQob3V0KSA8PCAiaGFzaENvZGUgPSBoYXNoQ29kZSAqICIgPDwgTVVMIDw8ICIgKyAiIDw8IG5hbWUgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgaW5kZW50KG91dCkgPDwgImhhc2hDb2RlID0gaGFzaENvZGUgKiAiIDw8IE1VTCA8PCAiICsgb3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIuaGFzaENvZGUoIiA8PCBuYW1lIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93IHN0ZDo6bG9naWNfZXJyb3IoImNvbXBpbGVyIGVycm9yOiBhIHN0cnVjdCBmaWVsZCBjYW5ub3QgYmUgdm9pZCIpOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgc3RkOjpsb2dpY19lcnJvcigiY29tcGlsZXIgZXJyb3I6IHRoZSBmb2xsb3dpbmcgYmFzZSB0eXBlIGhhcyBubyBoYXNoY29kZSBnZW5lcmF0b3I6ICIgKworICAgICAgICAgICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKCgodF9iYXNlX3R5cGUqKXQpLT5nZXRfYmFzZSgpKSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJoYXNoQ29kZSA9IGhhc2hDb2RlICogIiA8PCBNVUwgPDwgIiArICIgPDwgbmFtZSA8PCAiLmhhc2hDb2RlKCk7IiA8PCBlbmRsOworICAgIH0KKworICAgIGlmIChpc19vcHRpb25hbCB8fCBjYW5fYmVfbnVsbCkgeworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICB9CisgIH0KKworICBvdXQgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInJldHVybiBoYXNoQ29kZTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfY29tcGFyZV90byhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGluZGVudChvdXQpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgaW50IGNvbXBhcmVUbygiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiIG90aGVyKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQob3V0KSA8PCAiaWYgKCFnZXRDbGFzcygpLmVxdWFscyhvdGhlci5nZXRDbGFzcygpKSkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIGdldENsYXNzKCkuZ2V0TmFtZSgpLmNvbXBhcmVUbyhvdGhlci5nZXRDbGFzcygpLmdldE5hbWUoKSk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgb3V0IDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgImludCBsYXN0Q29tcGFyaXNvbiA9IDA7IiA8PCBlbmRsOworICBvdXQgPDwgZW5kbDsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAqbV9pdGVyOworICAgIGluZGVudChvdXQpIDw8ICJsYXN0Q29tcGFyaXNvbiA9IGphdmEubGFuZy5Cb29sZWFuLnZhbHVlT2YoIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjayhmaWVsZCkKKyAgICAgICAgICAgICAgICA8PCAiKS5jb21wYXJlVG8ob3RoZXIuIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjayhmaWVsZCkgPDwgIik7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gbGFzdENvbXBhcmlzb247IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKGZpZWxkKSA8PCAiKSB7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgIGxhc3RDb21wYXJpc29uID0gb3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIuY29tcGFyZVRvKHRoaXMuIgorICAgICAgICAgICAgICAgIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIsIG90aGVyLiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIik7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICB9IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgInJldHVybiAwOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGZ1bmN0aW9uIHRvIHJlYWQgYWxsIHRoZSBmaWVsZHMgb2YgdGhlIHN0cnVjdC4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF9yZWFkZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICAodm9pZCl0c3RydWN0OworICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZvaWQgcmVhZChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgaXByb3QpIHRocm93cyAiCisgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAic2NoZW1lKGlwcm90KS5yZWFkKGlwcm90LCB0aGlzKTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8vIGdlbmVyYXRlcyBqYXZhIG1ldGhvZCB0byBwZXJmb3JtIHZhcmlvdXMgY2hlY2tzCisvLyAoZS5nLiBjaGVjayB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHNldCkKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV92YWxpZGF0b3Iob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZvaWQgdmFsaWRhdGUoKSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIvLyBjaGVjayBmb3IgcmVxdWlyZWQgZmllbGRzIiA8PCBlbmRsOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICBpZiAoYmVhbl9zdHlsZV8pIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoISIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKmZfaXRlcikgPDwgIikgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgPDwgIiAgdGhyb3cgbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbEV4Y2VwdGlvbihcIlJlcXVpcmVkIGZpZWxkICciCisgICAgICAgICAgICA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIicgaXMgdW5zZXQhIFN0cnVjdDpcIiArIHRvU3RyaW5nKCkpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkpIHsKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICAgICAgICBpbmRlbnQob3V0KQorICAgICAgICAgICAgICA8PCAiICB0aHJvdyBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sRXhjZXB0aW9uKFwiUmVxdWlyZWQgZmllbGQgJyIKKyAgICAgICAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInIHdhcyBub3QgcHJlc2VudCEgU3RydWN0OiBcIiArIHRvU3RyaW5nKCkpOyIgPDwgZW5kbDsKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAiLy8gYWxhcywgd2UgY2Fubm90IGNoZWNrICciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgIDw8ICInIGJlY2F1c2UgaXQncyBhIHByaW1pdGl2ZSBhbmQgeW91IGNob3NlIHRoZSBub24tYmVhbnMgZ2VuZXJhdG9yLiIKKyAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIvLyBjaGVjayBmb3Igc3ViLXN0cnVjdCB2YWxpZGl0eSIgPDwgZW5kbDsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X3R5cGUqIHR5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpICYmICEoKHRfc3RydWN0Kil0eXBlKS0+aXNfdW5pb24oKSkgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiAhPSBudWxsKSB7IiA8PCBlbmRsOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgICIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIudmFsaWRhdGUoKTsiIDw8IGVuZGw7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbiB0byB3cml0ZSBhbGwgdGhlIGZpZWxkcyBvZiB0aGUgc3RydWN0CisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3Rfd3JpdGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgKHZvaWQpdHN0cnVjdDsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyB2b2lkIHdyaXRlKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBvcHJvdCkgdGhyb3dzICIKKyAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJzY2hlbWUob3Byb3QpLndyaXRlKG9wcm90LCB0aGlzKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbiB0byB3cml0ZSBhbGwgdGhlIGZpZWxkcyBvZiB0aGUgc3RydWN0LAorICogd2hpY2ggaXMgYSBmdW5jdGlvbiByZXN1bHQuIFRoZXNlIGZpZWxkcyBhcmUgb25seSB3cml0dGVuCisgKiBpZiB0aGV5IGFyZSBzZXQgaW4gdGhlIElzc2V0IGFycmF5LCBhbmQgb25seSBvbmUgb2YgdGhlbQorICogY2FuIGJlIHNldCBhdCBhIHRpbWUuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgICh2b2lkKXRzdHJ1Y3Q7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCB3cml0ZShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgb3Byb3QpIHRocm93cyAiCisgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAic2NoZW1lKG9wcm90KS53cml0ZShvcHJvdCwgdGhpcyk7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICIgIH0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF9maWVsZF9ieV9pZChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgICh2b2lkKXRzdHJ1Y3Q7CisgIGluZGVudChvdXQpIDw8IGphdmFfbnVsbGFibGVfYW5ub3RhdGlvbigpIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgX0ZpZWxkcyBmaWVsZEZvcklkKGludCBmaWVsZElkKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gX0ZpZWxkcy5maW5kQnlUaHJpZnRJZChmaWVsZElkKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcmVmbGVjdGlvbl9nZXR0ZXJzKG9zdHJpbmdzdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGNhcF9uYW1lKSB7CisgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgY29uc3RhbnRfbmFtZShmaWVsZF9uYW1lKSA8PCAiOiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gIiA8PCAodHlwZS0+aXNfYm9vbCgpID8gImlzIiA6ICJnZXQiKSA8PCBjYXBfbmFtZSA8PCAiKCk7IiA8PCBlbmRsIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7Cit9CisKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcmVmbGVjdGlvbl9zZXR0ZXJzKG9zdHJpbmdzdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGNhcF9uYW1lKSB7CisgIGNvbnN0IGJvb2wgaXNfYmluYXJ5ID0gdHlwZS0+aXNfYmluYXJ5KCk7CisgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgY29uc3RhbnRfbmFtZShmaWVsZF9uYW1lKSA8PCAiOiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJpZiAodmFsdWUgPT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgdW5zZXQiIDw8IGdldF9jYXBfbmFtZShmaWVsZF9uYW1lKSA8PCAiKCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgIGlmIChpc19iaW5hcnkpIHsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKHZhbHVlIGluc3RhbmNlb2YgYnl0ZVtdKSB7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgIHNldCIgPDwgY2FwX25hbWUgPDwgIigoYnl0ZVtdKXZhbHVlKTsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICB9CisgIGluZGVudChvdXQpIDw8ICIgIHNldCIgPDwgY2FwX25hbWUgPDwgIigoIiA8PCB0eXBlX25hbWUodHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIpdmFsdWUpOyIgPDwgZW5kbDsKKyAgaWYgKGlzX2JpbmFyeSkgeworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJicmVhazsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworfQorCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2dlbmVyaWNfZmllbGRfZ2V0dGVyc19zZXR0ZXJzKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gZ2V0dGVyX3N0cmVhbTsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHNldHRlcl9zdHJlYW07CisKKyAgLy8gYnVpbGQgdXAgdGhlIGJvZGllcyBvZiBib3RoIHRoZSBnZXR0ZXIgYW5kIHNldHRlciBhdCBvbmNlCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICpmX2l0ZXI7CisgICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZShmaWVsZC0+Z2V0X3R5cGUoKSk7CisgICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9IGZpZWxkLT5nZXRfbmFtZSgpOworICAgIHN0ZDo6c3RyaW5nIGNhcF9uYW1lID0gZ2V0X2NhcF9uYW1lKGZpZWxkX25hbWUpOworCisgICAgaW5kZW50X3VwKCk7CisgICAgZ2VuZXJhdGVfcmVmbGVjdGlvbl9zZXR0ZXJzKHNldHRlcl9zdHJlYW0sIHR5cGUsIGZpZWxkX25hbWUsIGNhcF9uYW1lKTsKKyAgICBnZW5lcmF0ZV9yZWZsZWN0aW9uX2dldHRlcnMoZ2V0dGVyX3N0cmVhbSwgdHlwZSwgZmllbGRfbmFtZSwgY2FwX25hbWUpOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICAvLyBjcmVhdGUgdGhlIHNldHRlcgorCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCBzZXRGaWVsZFZhbHVlKF9GaWVsZHMgZmllbGQsICIgPDwgamF2YV9udWxsYWJsZV9hbm5vdGF0aW9uKCkKKyAgICAgICAgICAgICAgPDwgIiBqYXZhLmxhbmcuT2JqZWN0IHZhbHVlKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICBzd2l0Y2ggKGZpZWxkKSB7IiA8PCBlbmRsOworICBvdXQgPDwgc2V0dGVyX3N0cmVhbS5zdHIoKTsKKyAgaW5kZW50KG91dCkgPDwgIiAgfSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBjcmVhdGUgdGhlIGdldHRlcgorICBpbmRlbnQob3V0KSA8PCBqYXZhX251bGxhYmxlX2Fubm90YXRpb24oKSA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0RmllbGRWYWx1ZShfRmllbGRzIGZpZWxkKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmllbGQpIHsiIDw8IGVuZGw7CisgIG91dCA8PCBnZXR0ZXJfc3RyZWFtLnN0cigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInRocm93IG5ldyBqYXZhLmxhbmcuSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvLyBDcmVhdGVzIGEgZ2VuZXJpYyBpc1NldCBtZXRob2QgdGhhdCB0YWtlcyB0aGUgZmllbGQgbnVtYmVyIGFzIGFyZ3VtZW50Cit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2dlbmVyaWNfaXNzZXRfbWV0aG9kKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgLy8gY3JlYXRlIHRoZSBpc1NldCBtZXRob2QKKyAgaW5kZW50KG91dCkgPDwgIi8qKiBSZXR1cm5zIHRydWUgaWYgZmllbGQgY29ycmVzcG9uZGluZyB0byBmaWVsZElEIGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSAiCisgICAgICAgICAgICAgICAgICJ2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZSAqLyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBib29sZWFuIGlzU2V0KF9GaWVsZHMgZmllbGQpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAiaWYgKGZpZWxkID09IG51bGwpIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKGZpZWxkKSB7IiA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAqZl9pdGVyOworICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgY29uc3RhbnRfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIjoiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgInJldHVybiAiIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKGZpZWxkKSA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ0aHJvdyBuZXcgamF2YS5sYW5nLklsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXQgb2YgSmF2YSBCZWFuIGJvaWxlcnBsYXRlIGZ1bmN0aW9ucyAoc2V0dGVycywgZ2V0dGVycywgZXRjLikKKyAqIGZvciB0aGUgZ2l2ZW4gc3RydWN0LgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfYmVhbl9ib2lsZXJwbGF0ZShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGlzc2V0X3R5cGUgaXNzZXRUeXBlID0gbmVlZHNfaXNzZXQodHN0cnVjdCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICpmX2l0ZXI7CisgICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZShmaWVsZC0+Z2V0X3R5cGUoKSk7CisgICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9IGZpZWxkLT5nZXRfbmFtZSgpOworICAgIHN0ZDo6c3RyaW5nIGNhcF9uYW1lID0gZ2V0X2NhcF9uYW1lKGZpZWxkX25hbWUpOworICAgIGJvb2wgb3B0aW9uYWwgPSB1c2Vfb3B0aW9uX3R5cGVfICYmIGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTDsKKyAgICBib29sIGlzX2RlcHJlY2F0ZWQgPSB0aGlzLT5pc19kZXByZWNhdGVkKGZpZWxkLT5hbm5vdGF0aW9uc18pOworCisgICAgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgICAvLyBNZXRob2QgdG8gcmV0dXJuIHRoZSBzaXplIG9mIHRoZSBjb2xsZWN0aW9uCisgICAgICBpZiAob3B0aW9uYWwpIHsKKyAgICAgICAgaWYgKGlzX2RlcHJlY2F0ZWQpIHsKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAiQERlcHJlY2F0ZWQiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBvcmcuYXBhY2hlLnRocmlmdC5PcHRpb248SW50ZWdlcj4gZ2V0IiA8PCBjYXBfbmFtZTsKKyAgICAgICAgb3V0IDw8IGdldF9jYXBfbmFtZSgic2l6ZSgpIHsiKSA8PCBlbmRsOworCisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gb3JnLmFwYWNoZS50aHJpZnQuT3B0aW9uLm5vbmUoKTsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gb3JnLmFwYWNoZS50aHJpZnQuT3B0aW9uLnNvbWUodGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIi5zaXplKCkpOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoaXNfZGVwcmVjYXRlZCkgeworICAgICAgICAgIGluZGVudChvdXQpIDw8ICJARGVwcmVjYXRlZCIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGludCBnZXQiIDw8IGNhcF9uYW1lOworICAgICAgICBvdXQgPDwgZ2V0X2NhcF9uYW1lKCJzaXplKCkgeyIpIDw8IGVuZGw7CisKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gKHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPT0gbnVsbCkgPyAwIDogIgorICAgICAgICAgICAgICAgICAgICA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIi5zaXplKCk7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgICAgfQorICAgIH0KKworICAgIGlmICh0eXBlLT5pc19zZXQoKSB8fCB0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIHRfdHlwZSogZWxlbWVudF90eXBlOworICAgICAgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgICAgIGVsZW1lbnRfdHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBlbGVtZW50X3R5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICAgIH0KKworICAgICAgLy8gSXRlcmF0b3IgZ2V0dGVyIGZvciBzZXRzIGFuZCBsaXN0cworICAgICAgaWYgKG9wdGlvbmFsKSB7CisgICAgICAgIGlmIChpc19kZXByZWNhdGVkKSB7CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgIkBEZXByZWNhdGVkIiA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgb3JnLmFwYWNoZS50aHJpZnQuT3B0aW9uPGphdmEudXRpbC5JdGVyYXRvcjwiIDw8IHR5cGVfbmFtZShlbGVtZW50X3R5cGUsIHRydWUsIGZhbHNlKQorICAgICAgICAgICAgICAgICAgICA8PCAiPj4gZ2V0IiA8PCBjYXBfbmFtZTsKKyAgICAgICAgb3V0IDw8IGdldF9jYXBfbmFtZSgiaXRlcmF0b3IoKSB7IikgPDwgZW5kbDsKKworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgImlmICh0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID09IG51bGwpIHsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIG9yZy5hcGFjaGUudGhyaWZ0Lk9wdGlvbi5ub25lKCk7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIG9yZy5hcGFjaGUudGhyaWZ0Lk9wdGlvbi5zb21lKHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIuaXRlcmF0b3IoKSk7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChpc19kZXByZWNhdGVkKSB7CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgIkBEZXByZWNhdGVkIiA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIGluZGVudChvdXQpIDw8IGphdmFfbnVsbGFibGVfYW5ub3RhdGlvbigpIDw8IGVuZGw7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgamF2YS51dGlsLkl0ZXJhdG9yPCIgPDwgdHlwZV9uYW1lKGVsZW1lbnRfdHlwZSwgdHJ1ZSwgZmFsc2UpCisgICAgICAgICAgICAgICAgICAgIDw8ICI+IGdldCIgPDwgY2FwX25hbWU7CisgICAgICAgIG91dCA8PCBnZXRfY2FwX25hbWUoIml0ZXJhdG9yKCkgeyIpIDw8IGVuZGw7CisKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gKHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPT0gbnVsbCkgPyBudWxsIDogIgorICAgICAgICAgICAgICAgICAgICA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIi5pdGVyYXRvcigpOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgLy8gQWRkIHRvIHNldCBvciBsaXN0LCBjcmVhdGUgaWYgdGhlIHNldC9saXN0IGlzIG51bGwKKyAgICAgIGlmIChpc19kZXByZWNhdGVkKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJARGVwcmVjYXRlZCIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCBhZGQiIDw8IGdldF9jYXBfbmFtZSgidG8iKTsKKyAgICAgIG91dCA8PCBjYXBfbmFtZSA8PCAiKCIgPDwgdHlwZV9uYW1lKGVsZW1lbnRfdHlwZSkgPDwgIiBlbGVtKSB7IiA8PCBlbmRsOworCisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAodGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9PSBudWxsKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWU7CisgICAgICBpZiAoaXNfZW51bV9zZXQodHlwZSkpIHsKKyAgICAgICAgb3V0IDw8ICIgPSAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSkgPDwgIi5ub25lT2YoIiA8PCBpbm5lcl9lbnVtX3R5cGVfbmFtZSh0eXBlKSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiLmFkZChlbGVtKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgICAvLyBQdXQgdG8gbWFwCisgICAgICB0X3R5cGUqIGtleV90eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgICAgdF90eXBlKiB2YWxfdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKworICAgICAgaWYgKGlzX2RlcHJlY2F0ZWQpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIkBEZXByZWNhdGVkIiA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyB2b2lkIHB1dCIgPDwgZ2V0X2NhcF9uYW1lKCJ0byIpOworICAgICAgb3V0IDw8IGNhcF9uYW1lIDw8ICIoIiA8PCB0eXBlX25hbWUoa2V5X3R5cGUpIDw8ICIga2V5LCAiIDw8IHR5cGVfbmFtZSh2YWxfdHlwZSkgPDwgIiB2YWwpIHsiCisgICAgICAgICAgPDwgZW5kbDsKKworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgc3RkOjpzdHJpbmcgY29uc3RydWN0b3JfYXJnczsKKyAgICAgIGlmIChpc19lbnVtX21hcCh0eXBlKSkgeworICAgICAgICBjb25zdHJ1Y3Rvcl9hcmdzID0gaW5uZXJfZW51bV90eXBlX25hbWUodHlwZSk7CisgICAgICB9CisgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIigiIDw8IGNvbnN0cnVjdG9yX2FyZ3MgPDwgIik7IgorICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiLnB1dChrZXksIHZhbCk7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgfQorCisgICAgLy8gU2ltcGxlIGdldHRlcgorICAgIGdlbmVyYXRlX2phdmFfZG9jKG91dCwgZmllbGQpOworICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgaWYgKGlzX2RlcHJlY2F0ZWQpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIkBEZXByZWNhdGVkIiA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBieXRlW10gZ2V0IiA8PCBjYXBfbmFtZSA8PCAiKCkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgIHNldCIgPDwgY2FwX25hbWUgPDwgIihvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5yaWdodFNpemUoIgorICAgICAgICAgICAgICAgICAgPDwgZmllbGRfbmFtZSA8PCAiKSk7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuICIgPDwgZmllbGRfbmFtZSA8PCAiID09IG51bGwgPyBudWxsIDogIiA8PCBmaWVsZF9uYW1lIDw8ICIuYXJyYXkoKTsiCisgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBqYXZhLm5pby5CeXRlQnVmZmVyIGJ1ZmZlciIgPDwgZ2V0X2NhcF9uYW1lKCJmb3IiKSA8PCBjYXBfbmFtZSA8PCAiKCkgeyIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICBpZih1bnNhZmVfYmluYXJpZXNfKXsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuICIgPDwgZmllbGRfbmFtZSA8PCAiOyIKKyAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIH1lbHNlIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLmNvcHlCaW5hcnkoIiA8PCBmaWVsZF9uYW1lIDw8ICIpOyIKKyAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChvcHRpb25hbCkgeworICAgICAgICBpZiAoaXNfZGVwcmVjYXRlZCkgeworICAgICAgICAgIGluZGVudChvdXQpIDw8ICJARGVwcmVjYXRlZCIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIG9yZy5hcGFjaGUudGhyaWZ0Lk9wdGlvbjwiIDw8IHR5cGVfbmFtZSh0eXBlLCB0cnVlKSA8PCAiPiI7CisgICAgICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MKSB7CisgICAgICAgICAgb3V0IDw8ICIgaXMiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG91dCA8PCAiIGdldCI7CisgICAgICAgIH0KKyAgICAgICAgb3V0IDw8IGNhcF9uYW1lIDw8ICIoKSB7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKworICAgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKHRoaXMuaXNTZXQiIDw8IGNhcF9uYW1lIDw8ICIoKSkgeyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gb3JnLmFwYWNoZS50aHJpZnQuT3B0aW9uLnNvbWUodGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIik7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIG9yZy5hcGFjaGUudGhyaWZ0Lk9wdGlvbi5ub25lKCk7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChpc19kZXByZWNhdGVkKSB7CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgIkBEZXByZWNhdGVkIiA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKHR5cGUpKSB7CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgamF2YV9udWxsYWJsZV9hbm5vdGF0aW9uKCkgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHlwZV9uYW1lKHR5cGUpOworICAgICAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCkgPT0gdF9iYXNlX3R5cGU6OlRZUEVfQk9PTCkgeworICAgICAgICAgIG91dCA8PCAiIGlzIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgPDwgIiBnZXQiOworICAgICAgICB9CisgICAgICAgIG91dCA8PCBjYXBfbmFtZSA8PCAiKCkgeyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorCisgICAgLy8gU2ltcGxlIHNldHRlcgorICAgIGdlbmVyYXRlX2phdmFfZG9jKG91dCwgZmllbGQpOworICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgaWYgKGlzX2RlcHJlY2F0ZWQpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIkBEZXByZWNhdGVkIiA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiOworICAgICAgaWYgKGJlYW5fc3R5bGVfKSB7CisgICAgICAgIG91dCA8PCAidm9pZCI7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpOworICAgICAgfQorICAgICAgb3V0IDw8ICIgc2V0IiA8PCBjYXBfbmFtZSA8PCAiKGJ5dGVbXSAiIDw8IGZpZWxkX25hbWUgPDwgIikgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgIHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSAiIDw8IGZpZWxkX25hbWUgPDwgIiA9PSBudWxsID8gKGphdmEubmlvLkJ5dGVCdWZmZXIpbnVsbCI7CisKKyAgICAgIGlmKHVuc2FmZV9iaW5hcmllc18peworICAgICAgICBpbmRlbnQob3V0KSA8PCAiIDogamF2YS5uaW8uQnl0ZUJ1ZmZlci53cmFwKCIgPDwgZmllbGRfbmFtZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICB9ZWxzZXsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIiA6IGphdmEubmlvLkJ5dGVCdWZmZXIud3JhcCgiIDw8IGZpZWxkX25hbWUgPDwgIi5jbG9uZSgpKTsiIDw8IGVuZGw7CisgICAgICB9CisgICAgICAgICAgICAgICAgIAorICAgICAgaWYgKCFiZWFuX3N0eWxlXykgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gdGhpczsiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgIH0KKyAgICBpZiAoaXNfZGVwcmVjYXRlZCkgeworICAgICAgaW5kZW50KG91dCkgPDwgIkBEZXByZWNhdGVkIiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljICI7CisgICAgaWYgKGJlYW5fc3R5bGVfKSB7CisgICAgICBvdXQgPDwgInZvaWQiOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpOworICAgIH0KKyAgICBvdXQgPDwgIiBzZXQiIDw8IGNhcF9uYW1lIDw8ICIoIiA8PCAodHlwZV9jYW5fYmVfbnVsbCh0eXBlKSA/IChqYXZhX251bGxhYmxlX2Fubm90YXRpb24oKSArICIgIikgOiAiIikKKyAgICAgICAgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgIiA8PCBmaWVsZF9uYW1lIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSAiOworICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSAmJiAhdW5zYWZlX2JpbmFyaWVzXykgeworICAgICAgb3V0IDw8ICJvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5jb3B5QmluYXJ5KCIgPDwgZmllbGRfbmFtZSA8PCAiKSI7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCBmaWVsZF9uYW1lOworICAgIH0KKyAgICBvdXQgPDwgIjsiIDw8IGVuZGw7CisgICAgZ2VuZXJhdGVfaXNzZXRfc2V0KG91dCwgZmllbGQsICIiKTsKKyAgICBpZiAoIWJlYW5fc3R5bGVfKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRoaXM7IiA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIC8vIFVuc2V0dGVyCisgICAgaWYgKGlzX2RlcHJlY2F0ZWQpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJARGVwcmVjYXRlZCIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyB2b2lkIHVuc2V0IiA8PCBjYXBfbmFtZSA8PCAiKCkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0eXBlKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSBudWxsOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKGlzc2V0VHlwZSA9PSBJU1NFVF9QUklNSVRJVkUpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJfX2lzc2V0X2JpdGZpZWxkID0gb3JnLmFwYWNoZS50aHJpZnQuRW5jb2RpbmdVdGlscy5jbGVhckJpdChfX2lzc2V0X2JpdGZpZWxkLCAiCisgICAgICAgICAgICAgICAgICA8PCBpc3NldF9maWVsZF9pZChmaWVsZCkgPDwgIik7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiX19pc3NldF9iaXRfdmVjdG9yLmNsZWFyKCIgPDwgaXNzZXRfZmllbGRfaWQoZmllbGQpIDw8ICIpOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgLy8gaXNTZXQgbWV0aG9kCisgICAgaW5kZW50KG91dCkgPDwgIi8qKiBSZXR1cm5zIHRydWUgaWYgZmllbGQgIiA8PCBmaWVsZF9uYW1lCisgICAgICAgICAgICAgICAgPDwgIiBpcyBzZXQgKGhhcyBiZWVuIGFzc2lnbmVkIGEgdmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UgKi8iIDw8IGVuZGw7CisgICAgaWYgKGlzX2RlcHJlY2F0ZWQpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJARGVwcmVjYXRlZCIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBib29sZWFuIGlzIiA8PCBnZXRfY2FwX25hbWUoInNldCIpIDw8IGNhcF9uYW1lIDw8ICIoKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKHR5cGUpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgIT0gbnVsbDsiIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmIChpc3NldFR5cGUgPT0gSVNTRVRfUFJJTUlUSVZFKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIG9yZy5hcGFjaGUudGhyaWZ0LkVuY29kaW5nVXRpbHMudGVzdEJpdChfX2lzc2V0X2JpdGZpZWxkLCAiIDw8IGlzc2V0X2ZpZWxkX2lkKGZpZWxkKQorICAgICAgICAgICAgICAgICAgPDwgIik7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIF9faXNzZXRfYml0X3ZlY3Rvci5nZXQoIiA8PCBpc3NldF9maWVsZF9pZChmaWVsZCkgPDwgIik7IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICBpZiAoaXNfZGVwcmVjYXRlZCkgeworICAgICAgaW5kZW50KG91dCkgPDwgIkBEZXByZWNhdGVkIiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZvaWQgc2V0IiA8PCBjYXBfbmFtZSA8PCBnZXRfY2FwX25hbWUoImlzU2V0IikgPDwgIihib29sZWFuIHZhbHVlKSB7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaWYgKHR5cGVfY2FuX2JlX251bGwodHlwZSkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIXZhbHVlKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIiAgdGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9IG51bGw7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmIChpc3NldFR5cGUgPT0gSVNTRVRfUFJJTUlUSVZFKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiX19pc3NldF9iaXRmaWVsZCA9IG9yZy5hcGFjaGUudGhyaWZ0LkVuY29kaW5nVXRpbHMuc2V0Qml0KF9faXNzZXRfYml0ZmllbGQsICIKKyAgICAgICAgICAgICAgICAgIDw8IGlzc2V0X2ZpZWxkX2lkKGZpZWxkKSA8PCAiLCB2YWx1ZSk7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiX19pc3NldF9iaXRfdmVjdG9yLnNldCgiIDw8IGlzc2V0X2ZpZWxkX2lkKGZpZWxkKSA8PCAiLCB2YWx1ZSk7IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSB0b1N0cmluZygpIG1ldGhvZCBmb3IgdGhlIGdpdmVuIHN0cnVjdAorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X3Rvc3RyaW5nKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJqYXZhLmxhbmcuU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlcihcIiIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKFwiKTsiCisgICAgICA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgImJvb2xlYW4gZmlyc3QgPSB0cnVlOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgYm9vbCBjb3VsZF9iZV91bnNldCA9ICgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUw7CisgICAgaWYgKGNvdWxkX2JlX3Vuc2V0KSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKmZfaXRlcikgPDwgIikgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKworICAgIHRfZmllbGQqIGZpZWxkID0gKCpmX2l0ZXIpOworCisgICAgaWYgKCFmaXJzdCkgeworICAgICAgaW5kZW50KG91dCkgPDwgImlmICghZmlyc3QpIHNiLmFwcGVuZChcIiwgXCIpOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50KG91dCkgPDwgInNiLmFwcGVuZChcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI6XCIpOyIgPDwgZW5kbDsKKyAgICBib29sIGNhbl9iZV9udWxsID0gdHlwZV9jYW5fYmVfbnVsbChmaWVsZC0+Z2V0X3R5cGUoKSk7CisgICAgaWYgKGNhbl9iZV9udWxsKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKHRoaXMuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9PSBudWxsKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIiAgc2IuYXBwZW5kKFwibnVsbFwiKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICB9CisKKyAgICBpZiAoZ2V0X3RydWVfdHlwZShmaWVsZC0+Z2V0X3R5cGUoKSktPmlzX2JpbmFyeSgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAib3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIudG9TdHJpbmcodGhpcy4iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIsIHNiKTsiCisgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAoKGZpZWxkLT5nZXRfdHlwZSgpLT5pc19zZXQoKSkKKyAgICAgICAgICAgICAgICYmIChnZXRfdHJ1ZV90eXBlKCgodF9zZXQqKWZpZWxkLT5nZXRfdHlwZSgpKS0+Z2V0X2VsZW1fdHlwZSgpKS0+aXNfYmluYXJ5KCkpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAib3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIudG9TdHJpbmcodGhpcy4iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIsIHNiKTsiCisgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAoKGZpZWxkLT5nZXRfdHlwZSgpLT5pc19saXN0KCkpCisgICAgICAgICAgICAgICAmJiAoZ2V0X3RydWVfdHlwZSgoKHRfbGlzdCopZmllbGQtPmdldF90eXBlKCkpLT5nZXRfZWxlbV90eXBlKCkpLT5pc19iaW5hcnkoKSkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci50b1N0cmluZyh0aGlzLiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiwgc2IpOyIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJzYi5hcHBlbmQodGhpcy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgaWYgKGNhbl9iZV9udWxsKSB7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudChvdXQpIDw8ICJmaXJzdCA9IGZhbHNlOyIgPDwgZW5kbDsKKworICAgIGlmIChjb3VsZF9iZV91bnNldCkgeworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgICBmaXJzdCA9IGZhbHNlOworICB9CisgIG91dCA8PCBpbmRlbnQoKSA8PCAic2IuYXBwZW5kKFwiKVwiKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJldHVybiBzYi50b1N0cmluZygpOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0YXRpYyBtYXAgd2l0aCBtZXRhIGRhdGEgdG8gc3RvcmUgaW5mb3JtYXRpb24gc3VjaCBhcyBmaWVsZElEIHRvCisgKiBmaWVsZE5hbWUgbWFwcGluZworICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfbWV0YV9kYXRhX21hcChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAvLyBTdGF0aWMgTWFwIHdpdGggZmllbGRJRCAtPiBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YSBtYXBwaW5ncworICBpbmRlbnQob3V0KQorICAgICAgPDwgInB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS51dGlsLk1hcDxfRmllbGRzLCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YT4gbWV0YURhdGFNYXA7IgorICAgICAgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInN0YXRpYyB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQob3V0KSA8PCAiamF2YS51dGlsLk1hcDxfRmllbGRzLCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YT4gdG1wTWFwID0gbmV3ICIKKyAgICAgICAgICAgICAgICAgImphdmEudXRpbC5FbnVtTWFwPF9GaWVsZHMsIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhPihfRmllbGRzLmNsYXNzKTsiCisgICAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgLy8gUG9wdWxhdGUgbWFwCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAqZl9pdGVyOworICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSBmaWVsZC0+Z2V0X25hbWUoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAidG1wTWFwLnB1dChfRmllbGRzLiIgPDwgY29uc3RhbnRfbmFtZShmaWVsZF9uYW1lKQorICAgICAgICAgICAgICAgIDw8ICIsIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YShcIiIgPDwgZmllbGRfbmFtZSA8PCAiXCIsICI7CisKKyAgICAvLyBTZXQgZmllbGQgcmVxdWlyZW1lbnQgdHlwZSAocmVxdWlyZWQsIG9wdGlvbmFsLCBldGMuKQorICAgIGlmIChmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgIG91dCA8PCAib3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkUmVxdWlyZW1lbnRUeXBlLlJFUVVJUkVELCAiOworICAgIH0gZWxzZSBpZiAoZmllbGQtPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMKSB7CisgICAgICBvdXQgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LlRGaWVsZFJlcXVpcmVtZW50VHlwZS5PUFRJT05BTCwgIjsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8ICJvcmcuYXBhY2hlLnRocmlmdC5URmllbGRSZXF1aXJlbWVudFR5cGUuREVGQVVMVCwgIjsKKyAgICB9CisKKyAgICAvLyBDcmVhdGUgdmFsdWUgbWV0YSBkYXRhCisgICAgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKG91dCwgZmllbGQtPmdldF90eXBlKCkpOworICAgIG91dCA8PCAiKSk7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgIm1ldGFEYXRhTWFwID0gamF2YS51dGlsLkNvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcCh0bXBNYXApOyIgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAib3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGEuYWRkU3RydWN0TWV0YURhdGFNYXAoIgorICAgICAgICAgICAgICA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIi5jbGFzcywgbWV0YURhdGFNYXApOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBSZXR1cm5zIGEgc3RyaW5nIHdpdGggdGhlIGphdmEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIHRocmlmdCB0eXBlCisgKiAoZS5nLiBmb3IgdGhlIHR5cGUgc3RydWN0IGl0IHJldHVybnMgIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUlVDVCIpCisgKi8KK3N0ZDo6c3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OmdldF9qYXZhX3R5cGVfc3RyaW5nKHRfdHlwZSogdHlwZSkgeworICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5MSVNUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuTUFQIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU0VUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuRU5VTSI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgcmV0dXJuIGdldF9qYXZhX3R5cGVfc3RyaW5nKCgodF90eXBlZGVmKil0eXBlKS0+Z2V0X3R5cGUoKSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICBzd2l0Y2ggKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5WT0lEIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkciOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5CT09MIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkJZVEUiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkkxNiI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTMyIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5JNjQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkRPVUJMRSI7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCJVbmtub3duIHRocmlmdCB0eXBlIFwiIiArIHR5cGUtPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJcIiBwYXNzZWQgdG8gdF9qYXZhX2dlbmVyYXRvcjo6Z2V0X2phdmFfdHlwZV9zdHJpbmchIik7CisgICAgICByZXR1cm4gIlVua25vd24gdGhyaWZ0IHR5cGUgXCIiICsgdHlwZS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICsgIlwiIHBhc3NlZCB0byB0X2phdmFfZ2VuZXJhdG9yOjpnZXRfamF2YV90eXBlX3N0cmluZyEiOworICAgICAgYnJlYWs7IC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiEKKyAgICB9CisgIH0gZWxzZSB7CisgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCJVbmtub3duIHRocmlmdCB0eXBlIFwiIiArIHR5cGUtPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXCIgcGFzc2VkIHRvIHRfamF2YV9nZW5lcmF0b3I6OmdldF9qYXZhX3R5cGVfc3RyaW5nISIpOworICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiEKKyAgfQorfQorCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlKSB7CisgIG91dCA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50X3VwKCk7CisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm5ldyAiCisgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5TdHJ1Y3RNZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS4iCisgICAgICAgICAgICAgICAgICAgIlNUUlVDVCwgIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIi5jbGFzcyI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICBpbmRlbnQob3V0KQorICAgICAgICAgIDw8ICJuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkxpc3RNZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5MSVNULCAiOworICAgICAgdF90eXBlKiBlbGVtX3R5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICAgIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShvdXQsIGVsZW1fdHlwZSk7CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgICAgaW5kZW50KG91dCkKKyAgICAgICAgICA8PCAibmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5TZXRNZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TRVQsICI7CisgICAgICB0X3R5cGUqIGVsZW1fdHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgICBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEob3V0LCBlbGVtX3R5cGUpOworICAgIH0gZWxzZSB7IC8vIG1hcAorICAgICAgaW5kZW50KG91dCkKKyAgICAgICAgICA8PCAibmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5NYXBNZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5NQVAsICI7CisgICAgICB0X3R5cGUqIGtleV90eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgICAgdF90eXBlKiB2YWxfdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICAgIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShvdXQsIGtleV90eXBlKTsKKyAgICAgIG91dCA8PCAiLCAiOworICAgICAgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKG91dCwgdmFsX3R5cGUpOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBpbmRlbnQob3V0KQorICAgICAgICA8PCAibmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5FbnVtTWV0YURhdGEob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuRU5VTSwgIgorICAgICAgICA8PCB0eXBlX25hbWUodHlwZSkgPDwgIi5jbGFzcyI7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgIm5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRWYWx1ZU1ldGFEYXRhKCIKKyAgICAgICAgICAgICAgICA8PCBnZXRfamF2YV90eXBlX3N0cmluZyh0eXBlKTsKKyAgICBpZiAodHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiLCBcIiIgPDwgKCh0X3R5cGVkZWYqKXR5cGUpLT5nZXRfc3ltYm9saWMoKSA8PCAiXCIiOworICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICIsIHRydWUiOworICAgIH0KKyAgfQorICBvdXQgPDwgIikiOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnRfZG93bigpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHRocmlmdCBzZXJ2aWNlLiBJbiBDKyssIHRoaXMgY29tcHJpc2VzIGFuIGVudGlyZWx5IHNlcGFyYXRlCisgKiBoZWFkZXIgYW5kIHNvdXJjZSBmaWxlLiBUaGUgaGVhZGVyIGZpbGUgZGVmaW5lcyB0aGUgbWV0aG9kcyBhbmQgaW5jbHVkZXMKKyAqIHRoZSBkYXRhIHR5cGVzIGRlZmluZWQgaW4gdGhlIG1haW4gaGVhZGVyIGZpbGUsIGFuZCB0aGUgaW1wbGVtZW50YXRpb24KKyAqIGZpbGUgY29udGFpbnMgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBiYXNpYyBwcmludGVyIGFuZCBkZWZhdWx0IGludGVyZmFjZXMuCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGRlZmluaXRpb24KKyAqLwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgLy8gTWFrZSBvdXRwdXQgZmlsZQorICBzdHJpbmcgZl9zZXJ2aWNlX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyBtYWtlX3ZhbGlkX2phdmFfZmlsZW5hbWUoc2VydmljZV9uYW1lXykgKyAiLmphdmEiOworICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7CisKKyAgZl9zZXJ2aWNlXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBqYXZhX3BhY2thZ2UoKSA8PCBqYXZhX3N1cHByZXNzaW9ucygpOworCisgIGlmICghc3VwcHJlc3NfZ2VuZXJhdGVkX2Fubm90YXRpb25zXykgeworICAgIGdlbmVyYXRlX2phdmF4X2dlbmVyYXRlZF9hbm5vdGF0aW9uKGZfc2VydmljZV8pOworICB9CisgIGZfc2VydmljZV8gPDwgInB1YmxpYyBjbGFzcyAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIiB7IiA8PCBlbmRsIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIC8vIEdlbmVyYXRlIHRoZSB0aHJlZSBtYWluIHBhcnRzIG9mIHRoZSBzZXJ2aWNlCisgIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9hc3luY19pbnRlcmZhY2UodHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfYXN5bmNfY2xpZW50KHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX2FzeW5jX3NlcnZlcih0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlXyA8PCAifSIgPDwgZW5kbDsKKyAgZl9zZXJ2aWNlXy5jbG9zZSgpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgaW50ZXJmYWNlIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19pZmFjZSA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgIGV4dGVuZHNfaWZhY2UgPSAiIGV4dGVuZHMgIiArIGV4dGVuZHMgKyAiLklmYWNlIjsKKyAgfQorCisgIGdlbmVyYXRlX2phdmFfZG9jKGZfc2VydmljZV8sIHRzZXJ2aWNlKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicHVibGljIGludGVyZmFjZSBJZmFjZSIgPDwgZXh0ZW5kc19pZmFjZSA8PCAiIHsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGdlbmVyYXRlX2phdmFfZG9jKGZfc2VydmljZV8sICpmX2l0ZXIpOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfYXN5bmNfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfaWZhY2UgPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICBleHRlbmRzX2lmYWNlID0gIiBleHRlbmRzICIgKyBleHRlbmRzICsgIiAuQXN5bmNJZmFjZSI7CisgIH0KKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgaW50ZXJmYWNlIEFzeW5jSWZhY2UiIDw8IGV4dGVuZHNfaWZhY2UgPDwgIiB7IiA8PCBlbmRsIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZV9hc3luYygqZl9pdGVyLCB0cnVlKQorICAgICAgICAgICAgICAgICAgICAgICA8PCAiIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOyIgPDwgZW5kbCA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgc3RydWN0cyBmb3IgYWxsIHRoZSBzZXJ2aWNlIGFyZ3MgYW5kIHJldHVybiB0eXBlcworICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZQorICovCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sIHRzLCBmYWxzZSwgdHJ1ZSk7CisgICAgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycygqZl9pdGVyKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KKyAqLwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX2NsaWVudCA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgPT0gTlVMTCkgeworICAgIGV4dGVuZHNfY2xpZW50ID0gIm9yZy5hcGFjaGUudGhyaWZ0LlRTZXJ2aWNlQ2xpZW50IjsKKyAgfSBlbHNlIHsKKyAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICBleHRlbmRzX2NsaWVudCA9IGV4dGVuZHMgKyAiLkNsaWVudCI7CisgIH0KKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBzdGF0aWMgY2xhc3MgQ2xpZW50IGV4dGVuZHMgIiA8PCBleHRlbmRzX2NsaWVudAorICAgICAgICAgICAgICAgICAgICAgPDwgIiBpbXBsZW1lbnRzIElmYWNlIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGluZGVudChmX3NlcnZpY2VfKQorICAgICAgPDwgInB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeSBpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LlRTZXJ2aWNlQ2xpZW50RmFjdG9yeTxDbGllbnQ+IHsiCisgICAgICA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgRmFjdG9yeSgpIHt9IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBDbGllbnQgZ2V0Q2xpZW50KG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBwcm90KSB7IgorICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIG5ldyBDbGllbnQocHJvdCk7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIENsaWVudCBnZXRDbGllbnQob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIGlwcm90LCAiCisgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIG9wcm90KSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gbmV3IENsaWVudChpcHJvdCwgb3Byb3QpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBDbGllbnQob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIHByb3QpIiA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJzdXBlcihwcm90LCBwcm90KTsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBDbGllbnQob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIGlwcm90LCAiCisgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIG9wcm90KSB7IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgc3VwZXIoaXByb3QsIG9wcm90KTsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIHN0cmluZyBzZXAgPSAiXyI7CisgICAgc3RyaW5nIGphdmFuYW1lID0gZnVubmFtZTsKKyAgICBpZiAoZnVsbGNhbWVsX3N0eWxlXykgeworICAgICAgc2VwID0gIiI7CisgICAgICBqYXZhbmFtZSA9IGFzX2NhbWVsX2Nhc2UoZnVubmFtZSk7CisgICAgfQorCisgICAgLy8gT3BlbiBmdW5jdGlvbgorICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJzZW5kIiA8PCBzZXAgPDwgamF2YW5hbWUgPDwgIigiOworCisgICAgLy8gR2V0IHRoZSBzdHJ1Y3Qgb2YgZnVuY3Rpb24gY2FsbCBwYXJhbXMKKyAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKworICAgIC8vIERlY2xhcmUgdGhlIGZ1bmN0aW9uIGFyZ3VtZW50cworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlXyA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCAiKTsiIDw8IGVuZGw7CisKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7CisgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgInJldHVybiAiOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlXyA8PCAicmVjdiIgPDwgc2VwIDw8IGphdmFuYW1lIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgfQorICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgICAgdF9mdW5jdGlvbiBzZW5kX2Z1bmN0aW9uKGdfdHlwZV92b2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInNlbmQiKSArIHNlcCArIGphdmFuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF9hcmdsaXN0KCkpOworCisgICAgc3RyaW5nIGFyZ3NuYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKKworICAgIC8vIE9wZW4gZnVuY3Rpb24KKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmc2VuZF9mdW5jdGlvbikgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVxdWVzdAorICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBhcmdzbmFtZSA8PCAiIGFyZ3MgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiKCk7IiA8PCBlbmRsOworCisgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiYXJncy5zZXQiIDw8IGdldF9jYXBfbmFtZSgoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIigiCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIik7IiA8PCBlbmRsOworICAgIH0KKworICAgIGNvbnN0IHN0cmluZyBzZW5kQmFzZU5hbWUgPSAoKmZfaXRlciktPmlzX29uZXdheSgpID8gInNlbmRCYXNlT25ld2F5IiA6ICJzZW5kQmFzZSI7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IHNlbmRCYXNlTmFtZSA8PCAiKFwiIiA8PCBmdW5uYW1lIDw8ICJcIiwgYXJncyk7IiA8PCBlbmRsOworCisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIHN0cmluZyByZXN1bHRuYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOworCisgICAgICB0X3N0cnVjdCBub2FyZ3MocHJvZ3JhbV8pOworICAgICAgdF9mdW5jdGlvbiByZWN2X2Z1bmN0aW9uKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInJlY3YiKSArIHNlcCArIGphdmFuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZub2FyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCkpOworICAgICAgLy8gT3BlbiBmdW5jdGlvbgorICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnJlY3ZfZnVuY3Rpb24pIDw8IGVuZGw7CisgICAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCByZXN1bHRuYW1lIDw8ICIgcmVzdWx0ID0gbmV3ICIgPDwgcmVzdWx0bmFtZSA8PCAiKCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJyZWNlaXZlQmFzZShyZXN1bHQsIFwiIiA8PCBmdW5uYW1lIDw8ICJcIik7IiA8PCBlbmRsOworCisgICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KKyAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKHJlc3VsdC4iIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKCJzdWNjZXNzIikgPDwgIikgeyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiByZXN1bHQuc3VjY2VzczsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOworICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKyAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChyZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiAhPSBudWxsKSB7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgdGhyb3cgcmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIC8vIElmIHlvdSBnZXQgaGVyZSBpdCdzIGFuIGV4Y2VwdGlvbiwgdW5sZXNzIGEgdm9pZCBmdW5jdGlvbgorICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRocm93IG5ldyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbihvcmcuYXBhY2hlLnRocmlmdC4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5NSVNTSU5HX1JFU1VMVCwgXCIiCisgICAgICAgICAgICAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZmFpbGVkOiB1bmtub3duIHJlc3VsdFwiKTsiIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIC8vIENsb3NlIGZ1bmN0aW9uCisgICAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2FzeW5jX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBleHRlbmRzID0gIm9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLlRBc3luY0NsaWVudCI7CisgIHN0cmluZyBleHRlbmRzX2NsaWVudCA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpICsgIi5Bc3luY0NsaWVudCI7CisgIH0KKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBzdGF0aWMgY2xhc3MgQXN5bmNDbGllbnQgZXh0ZW5kcyAiIDw8IGV4dGVuZHMKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIgaW1wbGVtZW50cyBBc3luY0lmYWNlIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIC8vIEZhY3RvcnkgbWV0aG9kCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5IGltcGxlbWVudHMgIgorICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLlRBc3luY0NsaWVudEZhY3Rvcnk8QXN5bmNDbGllbnQ+IHsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICBwcml2YXRlIG9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLlRBc3luY0NsaWVudE1hbmFnZXIgY2xpZW50TWFuYWdlcjsiCisgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgcHJpdmF0ZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeTsiCisgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgcHVibGljIEZhY3Rvcnkob3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuVEFzeW5jQ2xpZW50TWFuYWdlciAiCisgICAgICAgICAgICAgICAgICAgICAgICAiY2xpZW50TWFuYWdlciwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sRmFjdG9yeSAiCisgICAgICAgICAgICAgICAgICAgICAgICAicHJvdG9jb2xGYWN0b3J5KSB7IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgICB0aGlzLmNsaWVudE1hbmFnZXIgPSBjbGllbnRNYW5hZ2VyOyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgICAgdGhpcy5wcm90b2NvbEZhY3RvcnkgPSBwcm90b2NvbEZhY3Rvcnk7IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgfSIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIHB1YmxpYyBBc3luY0NsaWVudCAiCisgICAgICAgICAgICAgICAgICAgICAgICAiZ2V0QXN5bmNDbGllbnQob3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlROb25ibG9ja2luZ1RyYW5zcG9ydCAiCisgICAgICAgICAgICAgICAgICAgICAgICAidHJhbnNwb3J0KSB7IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgICByZXR1cm4gbmV3IEFzeW5jQ2xpZW50KHByb3RvY29sRmFjdG9yeSwgY2xpZW50TWFuYWdlciwgdHJhbnNwb3J0KTsiCisgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgfSIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgQXN5bmNDbGllbnQob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sRmFjdG9yeSAiCisgICAgICAgICAgICAgICAgICAgICAgICAicHJvdG9jb2xGYWN0b3J5LCBvcmcuYXBhY2hlLnRocmlmdC5hc3luYy5UQXN5bmNDbGllbnRNYW5hZ2VyICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJjbGllbnRNYW5hZ2VyLCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVE5vbmJsb2NraW5nVHJhbnNwb3J0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0cmFuc3BvcnQpIHsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICBzdXBlcihwcm90b2NvbEZhY3RvcnksIGNsaWVudE1hbmFnZXIsIHRyYW5zcG9ydCk7IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSBjbGllbnQgbWV0aG9kIGltcGxlbWVudGF0aW9ucworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICBzdHJpbmcgc2VwID0gIl8iOworICAgIHN0cmluZyBqYXZhbmFtZSA9IGZ1bm5hbWU7CisgICAgaWYgKGZ1bGxjYW1lbF9zdHlsZV8pIHsKKyAgICAgIHNlcCA9ICIiOworICAgICAgamF2YW5hbWUgPSBhc19jYW1lbF9jYXNlKGphdmFuYW1lKTsKKyAgICB9CisgICAgdF90eXBlKiByZXRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKTsKKyAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBzdHJpbmcgZnVuY2xhc3NuYW1lID0gZnVubmFtZSArICJfY2FsbCI7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOworICAgIHN0cmluZyBhcmdzX25hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX2FyZ3MiOworICAgIHN0cmluZyByZXN1bHRfbmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKKworICAgIC8vIE1haW4gbWV0aG9kIGJvZHkKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZV9hc3luYygqZl9pdGVyLCBmYWxzZSkKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIiB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICBjaGVja1JlYWR5KCk7IiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICAiIDw8IGZ1bmNsYXNzbmFtZSA8PCAiIG1ldGhvZF9jYWxsID0gbmV3ICIgKyBmdW5jbGFzc25hbWUgKyAiKCIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgYXN5bmNfYXJndW1lbnRfbGlzdCgqZl9pdGVyLCBhcmdfc3RydWN0LCByZXRfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIiwgdGhpcywgX19fcHJvdG9jb2xGYWN0b3J5LCBfX190cmFuc3BvcnQpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgdGhpcy5fX19jdXJyZW50TWV0aG9kID0gbWV0aG9kX2NhbGw7IiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICBfX19tYW5hZ2VyLmNhbGwobWV0aG9kX2NhbGwpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7CisKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgICAvLyBUQXN5bmNNZXRob2Qgb2JqZWN0IGZvciB0aGlzIGZ1bmN0aW9uIGNhbGwKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBzdGF0aWMgY2xhc3MgIiArIGZ1bmNsYXNzbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZXh0ZW5kcyBvcmcuYXBhY2hlLnRocmlmdC5hc3luYy5UQXN5bmNNZXRob2RDYWxsPCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLCB0cnVlKSArICI+IHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICAvLyBNZW1iZXIgdmFyaWFibGVzCisgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJpdmF0ZSAiICsgdHlwZV9uYW1lKCgqZmxkX2l0ZXIpLT5nZXRfdHlwZSgpKSArICIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgKyAiOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICAvLyBOT1RFIHNpbmNlIHdlIHVzZSBhIG5ldyBDbGllbnQgaW5zdGFuY2UgdG8gZGVzZXJpYWxpemUsIGxldCdzIGtlZXAgc2VxaWQgdG8gMCBmb3Igbm93CisgICAgLy8gaW5kZW50KGZfc2VydmljZV8pIDw8ICJwcml2YXRlIGludCBzZXFpZDsiIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIC8vIENvbnN0cnVjdG9yCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgIiArIGZ1bmNsYXNzbmFtZSArICIoIgorICAgICAgICAgICAgICAgICAgICAgICAgICArIGFzeW5jX2FyZ3VtZW50X2xpc3QoKmZfaXRlciwgYXJnX3N0cnVjdCwgcmV0X3R5cGUsIHRydWUpCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICIsIG9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLlRBc3luY0NsaWVudCBjbGllbnQsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5LCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVE5vbmJsb2NraW5nVHJhbnNwb3J0IHRyYW5zcG9ydCkgdGhyb3dzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geyIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgc3VwZXIoY2xpZW50LCBwcm90b2NvbEZhY3RvcnksIHRyYW5zcG9ydCwgcmVzdWx0SGFuZGxlciwgIgorICAgICAgICAgICAgICAgICAgICAgICA8PCAoKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSA/ICJ0cnVlIiA6ICJmYWxzZSIpIDw8ICIpOyIgPDwgZW5kbDsKKworICAgIC8vIEFzc2lnbiBtZW1iZXIgdmFyaWFibGVzCisgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICB0aGlzLiIgKyAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSArICIgPSAiICsgKCpmbGRfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICI7IiA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgdm9pZCB3cml0ZV9hcmdzKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBwcm90KSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgLy8gU2VyaWFsaXplIHJlcXVlc3QKKyAgICAvLyBOT1RFIHdlIGFyZSBsZWF2aW5nIHNlcWlkIGFzIDAsIGZvciBub3cgKHNlZSBhYm92ZSkKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwcm90LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWVzc2FnZShcIiIKKyAgICAgICAgICAgICAgIDw8IGZ1bm5hbWUgPDwgIlwiLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC4iCisgICAgICAgICAgICAgICA8PCAoKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSA/ICJUTWVzc2FnZVR5cGUuT05FV0FZIiA6ICJUTWVzc2FnZVR5cGUuQ0FMTCIpIDw8ICIsIDApKTsiCisgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8IGFyZ3NfbmFtZSA8PCAiIGFyZ3MgPSBuZXcgIiA8PCBhcmdzX25hbWUgPDwgIigpOyIgPDwgZW5kbDsKKworICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJhcmdzLnNldCIgPDwgZ2V0X2NhcF9uYW1lKCgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKCIKKyAgICAgICAgICAgICAgICAgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIik7IiA8PCBlbmRsOworICAgIH0KKworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImFyZ3Mud3JpdGUocHJvdCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJwcm90LndyaXRlTWVzc2FnZUVuZCgpOyIKKyAgICAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgLy8gUmV0dXJuIG1ldGhvZAorICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgKyB0eXBlX25hbWUocmV0X3R5cGUsIHRydWUpICsgIiBnZXRSZXN1bHQoKSB0aHJvd3MgIjsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlKSArICIsICI7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgIm9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geyIgPDwgZW5kbDsKKworICAgIGluZGVudF91cCgpOworICAgIGZfc2VydmljZV8KKyAgICAgICAgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgImlmIChnZXRTdGF0ZSgpICE9IG9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLlRBc3luY01ldGhvZENhbGwuU3RhdGUuUkVTUE9OU0VfUkVBRCkgeyIKKyAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICB0aHJvdyBuZXcgamF2YS5sYW5nLklsbGVnYWxTdGF0ZUV4Y2VwdGlvbihcIk1ldGhvZCBjYWxsIG5vdCBmaW5pc2hlZCFcIik7IgorICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICJvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVE1lbW9yeUlucHV0VHJhbnNwb3J0IG1lbW9yeVRyYW5zcG9ydCA9IG5ldyAiCisgICAgICAgICAgICJvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVE1lbW9yeUlucHV0VHJhbnNwb3J0KGdldEZyYW1lQnVmZmVyKCkuYXJyYXkoKSk7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgcHJvdCA9ICIKKyAgICAgICAgICAgICAgICAgICAgICAgImNsaWVudC5nZXRQcm90b2NvbEZhY3RvcnkoKS5nZXRQcm90b2NvbChtZW1vcnlUcmFuc3BvcnQpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXyk7CisgICAgaWYgKHJldF90eXBlLT5pc192b2lkKCkpIHsgLy8gTkI6IEluY2x1ZGVzIG9uZXdheXMgd2hpY2ggYWx3YXlzIHJldHVybiB2b2lkLgorICAgICAgZl9zZXJ2aWNlXyA8PCAicmV0dXJuIG51bGw7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICJyZXR1cm4gKG5ldyBDbGllbnQocHJvdCkpLnJlY3YiICsgc2VwICsgamF2YW5hbWUgKyAiKCk7IiA8PCBlbmRsOworICAgIH0KKworICAgIC8vIENsb3NlIGZ1bmN0aW9uCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7CisKKyAgICAvLyBDbG9zZSBjbGFzcworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKworICAvLyBDbG9zZSBBc3luY0NsaWVudAorICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgorICovCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgLy8gR2VuZXJhdGUgdGhlIGRpc3BhdGNoIG1ldGhvZHMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgLy8gRXh0ZW5kcyBzdHVmZgorICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19wcm9jZXNzb3IgPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpID09IE5VTEwpIHsKKyAgICBleHRlbmRzX3Byb2Nlc3NvciA9ICJvcmcuYXBhY2hlLnRocmlmdC5UQmFzZVByb2Nlc3NvcjxJPiI7CisgIH0gZWxzZSB7CisgICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7CisgICAgZXh0ZW5kc19wcm9jZXNzb3IgPSBleHRlbmRzICsgIi5Qcm9jZXNzb3I8ST4iOworICB9CisKKyAgLy8gR2VuZXJhdGUgdGhlIGhlYWRlciBwb3J0aW9uCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIHN0YXRpYyBjbGFzcyBQcm9jZXNzb3I8SSBleHRlbmRzIElmYWNlPiBleHRlbmRzICIKKyAgICAgICAgICAgICAgICAgICAgIDw8IGV4dGVuZHNfcHJvY2Vzc29yIDw8ICIgaW1wbGVtZW50cyBvcmcuYXBhY2hlLnRocmlmdC5UUHJvY2Vzc29yIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGluZGVudChmX3NlcnZpY2VfKQorICAgICAgPDwgInByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5zbGY0ai5Mb2dnZXIgX0xPR0dFUiA9IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5LmdldExvZ2dlcihQcm9jZXNzb3IuY2xhc3MuZ2V0TmFtZSgpKTsiCisgICAgICA8PCBlbmRsOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIFByb2Nlc3NvcihJIGlmYWNlKSB7IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgc3VwZXIoaWZhY2UsIGdldFByb2Nlc3NNYXAobmV3IGphdmEudXRpbC5IYXNoTWFwPGphdmEubGFuZy5TdHJpbmcsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRocmlmdC5Qcm9jZXNzRnVuY3Rpb248SSwgPyBleHRlbmRzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRocmlmdC5UQmFzZT4+KCkpKTsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJvdGVjdGVkIFByb2Nlc3NvcihJIGlmYWNlLCBqYXZhLnV0aWwuTWFwPGphdmEubGFuZy5TdHJpbmcsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRocmlmdC5Qcm9jZXNzRnVuY3Rpb248SSwgPyBleHRlbmRzIG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlPj4gIgorICAgICAgICAgICAgICAgICAgICAgICAgInByb2Nlc3NNYXApIHsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICBzdXBlcihpZmFjZSwgZ2V0UHJvY2Vzc01hcChwcm9jZXNzTWFwKSk7IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInByaXZhdGUgc3RhdGljIDxJIGV4dGVuZHMgSWZhY2U+IGphdmEudXRpbC5NYXA8amF2YS5sYW5nLlN0cmluZywgICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRocmlmdC5Qcm9jZXNzRnVuY3Rpb248SSwgPyBleHRlbmRzIG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlPj4gIgorICAgICAgICAgICAgICAgICAgICAgICAgImdldFByb2Nlc3NNYXAoamF2YS51dGlsLk1hcDxqYXZhLmxhbmcuU3RyaW5nLCBvcmcuYXBhY2hlLnRocmlmdC5Qcm9jZXNzRnVuY3Rpb248SSwgPyBleHRlbmRzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgb3JnLmFwYWNoZS50aHJpZnQuVEJhc2U+PiBwcm9jZXNzTWFwKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInByb2Nlc3NNYXAucHV0KFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiLCBuZXcgIgorICAgICAgICAgICAgICAgICAgICAgICA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIigpKTsiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gcHJvY2Vzc01hcDsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzIHN1YmZ1bmN0aW9ucworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odHNlcnZpY2UsICpmX2l0ZXIpOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgorICovCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfYXN5bmNfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgLy8gR2VuZXJhdGUgdGhlIGRpc3BhdGNoIG1ldGhvZHMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgLy8gRXh0ZW5kcyBzdHVmZgorICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19wcm9jZXNzb3IgPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpID09IE5VTEwpIHsKKyAgICBleHRlbmRzX3Byb2Nlc3NvciA9ICJvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUFzeW5jUHJvY2Vzc29yPEk+IjsKKyAgfSBlbHNlIHsKKyAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICBleHRlbmRzX3Byb2Nlc3NvciA9IGV4dGVuZHMgKyAiLkFzeW5jUHJvY2Vzc29yPEk+IjsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHRoZSBoZWFkZXIgcG9ydGlvbgorICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBzdGF0aWMgY2xhc3MgQXN5bmNQcm9jZXNzb3I8SSBleHRlbmRzIEFzeW5jSWZhY2U+IGV4dGVuZHMgIgorICAgICAgICAgICAgICAgICAgICAgPDwgZXh0ZW5kc19wcm9jZXNzb3IgPDwgIiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5zbGY0ai5Mb2dnZXIgX0xPR0dFUiA9ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQXN5bmNQcm9jZXNzb3IuY2xhc3MuZ2V0TmFtZSgpKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgQXN5bmNQcm9jZXNzb3IoSSBpZmFjZSkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIHN1cGVyKGlmYWNlLCBnZXRQcm9jZXNzTWFwKG5ldyBqYXZhLnV0aWwuSGFzaE1hcDxqYXZhLmxhbmcuU3RyaW5nLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS50aHJpZnQuQXN5bmNQcm9jZXNzRnVuY3Rpb248SSwgPyBleHRlbmRzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRocmlmdC5UQmFzZSwgPz4+KCkpKTsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJvdGVjdGVkIEFzeW5jUHJvY2Vzc29yKEkgaWZhY2UsIGphdmEudXRpbC5NYXA8amF2YS5sYW5nLlN0cmluZywgICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRocmlmdC5Bc3luY1Byb2Nlc3NGdW5jdGlvbjxJLCA/IGV4dGVuZHMgICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRocmlmdC5UQmFzZSwgPz4+IHByb2Nlc3NNYXApIHsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICBzdXBlcihpZmFjZSwgZ2V0UHJvY2Vzc01hcChwcm9jZXNzTWFwKSk7IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInByaXZhdGUgc3RhdGljIDxJIGV4dGVuZHMgQXN5bmNJZmFjZT4gamF2YS51dGlsLk1hcDxqYXZhLmxhbmcuU3RyaW5nLCAgIgorICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LkFzeW5jUHJvY2Vzc0Z1bmN0aW9uPEksID8gZXh0ZW5kcyAgIgorICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlLD8+PiBnZXRQcm9jZXNzTWFwKGphdmEudXRpbC5NYXA8amF2YS5sYW5nLlN0cmluZywgICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRocmlmdC5Bc3luY1Byb2Nlc3NGdW5jdGlvbjxJLCA/IGV4dGVuZHMgICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRocmlmdC5UQmFzZSwgPz4+IHByb2Nlc3NNYXApIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJvY2Vzc01hcC5wdXQoXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIsIG5ldyAiCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCkpOyIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybiBwcm9jZXNzTWFwOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3Mgc3ViZnVuY3Rpb25zCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZ2VuZXJhdGVfcHJvY2Vzc19hc3luY19mdW5jdGlvbih0c2VydmljZSwgKmZfaXRlcik7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgYW5kIGhlbHBlcnMgZm9yIGEgZnVuY3Rpb24uCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24KKyAqLwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIHJldHVybjsKKyAgfQorCisgIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKKyAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKKyAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOworICB9CisKKyAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgcmVzdWx0LmFwcGVuZCgqZl9pdGVyKTsKKyAgfQorCisgIGdlbmVyYXRlX2phdmFfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgJnJlc3VsdCwgZmFsc2UsIHRydWUsIHRydWUpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHByb2Nlc3MgZnVuY3Rpb24gZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byB3cml0ZSBhIGRpc3BhdGNoZXIgZm9yCisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19hc3luY19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgc3RyaW5nIGFyZ3NuYW1lID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKKworICBzdHJpbmcgcmVzdWx0bmFtZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKKyAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICByZXN1bHRuYW1lID0gIm9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlIjsKKyAgfQorCisgIHN0cmluZyByZXN1bHR0eXBlID0gdHlwZV9uYW1lKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgdHJ1ZSk7CisKKyAgKHZvaWQpdHNlcnZpY2U7CisgIC8vIE9wZW4gY2xhc3MKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgc3RhdGljIGNsYXNzICIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICA8PCAiPEkgZXh0ZW5kcyBBc3luY0lmYWNlPiBleHRlbmRzIG9yZy5hcGFjaGUudGhyaWZ0LkFzeW5jUHJvY2Vzc0Z1bmN0aW9uPEksICIKKyAgICAgICAgICAgICAgICAgICAgIDw8IGFyZ3NuYW1lIDw8ICIsICIgPDwgcmVzdWx0dHlwZSA8PCAiPiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIHN1cGVyKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIlwiKTsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgPDwgYXJnc25hbWUgPDwgIiBnZXRFbXB0eUFyZ3NJbnN0YW5jZSgpIHsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICByZXR1cm4gbmV3ICIgPDwgYXJnc25hbWUgPDwgIigpOyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgb3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuQXN5bmNNZXRob2RDYWxsYmFjazwiIDw8IHJlc3VsdHR5cGUKKyAgICAgICAgICAgICAgICAgICAgIDw8ICI+IGdldFJlc3VsdEhhbmRsZXIoZmluYWwgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLkFic3RyYWN0Tm9uYmxvY2tpbmdTZXJ2ZXIuQXN5bmNGcmFtZUJ1ZmZlciBmYiwgZmluYWwgaW50IHNlcWlkKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5Bc3luY1Byb2Nlc3NGdW5jdGlvbiBmY2FsbCA9IHRoaXM7IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybiBuZXcgb3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuQXN5bmNNZXRob2RDYWxsYmFjazwiIDw8IHJlc3VsdHR5cGUKKyAgICAgICAgICAgICAgICAgICAgIDw8ICI+KCkgeyAiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyB2b2lkIG9uQ29tcGxldGUoIiA8PCByZXN1bHR0eXBlIDw8ICIgbykgeyIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IHJlc3VsdG5hbWUgPDwgIiByZXN1bHQgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIoKTsiIDw8IGVuZGw7CisKKyAgICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJlc3VsdC5zdWNjZXNzID0gbzsiIDw8IGVuZGw7CisgICAgICAvLyBTZXQgaXNzZXQgb24gc3VjY2VzcyBmaWVsZAorICAgICAgaWYgKCF0eXBlX2Nhbl9iZV9udWxsKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSkpIHsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXN1bHQuc2V0IiA8PCBnZXRfY2FwX25hbWUoInN1Y2Nlc3MiKSA8PCBnZXRfY2FwX25hbWUoImlzU2V0IikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIodHJ1ZSk7IiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidHJ5IHsiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pCisgICAgICAgIDw8ICIgIGZjYWxsLnNlbmRSZXNwb25zZShmYiwgcmVzdWx0LCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWVzc2FnZVR5cGUuUkVQTFksc2VxaWQpOyIKKyAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0gY2F0Y2ggKG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uIGUpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgIl9MT0dHRVIuZXJyb3IoXCJUVHJhbnNwb3J0RXhjZXB0aW9uIHdyaXRpbmcgdG8gaW50ZXJuYWwgZnJhbWUgYnVmZmVyXCIsIGUpOyIKKyAgICAgICAgICAgICAgIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJmYi5jbG9zZSgpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSBjYXRjaCAoamF2YS5sYW5nLkV4Y2VwdGlvbiBlKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIl9MT0dHRVIuZXJyb3IoXCJFeGNlcHRpb24gd3JpdGluZyB0byBpbnRlcm5hbCBmcmFtZSBidWZmZXJcIiwgZSk7IgorICAgICAgICAgICAgICAgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm9uRXJyb3IoZSk7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyB2b2lkIG9uRXJyb3IoamF2YS5sYW5nLkV4Y2VwdGlvbiBlKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaWYgKGUgaW5zdGFuY2VvZiBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbikgeyIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIl9MT0dHRVIuZXJyb3IoXCJUVHJhbnNwb3J0RXhjZXB0aW9uIGluc2lkZSBoYW5kbGVyXCIsIGUpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImZiLmNsb3NlKCk7IiA8PCBlbmRsOworCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiX0xPR0dFUi5lcnJvcihcIkV4Y2VwdGlvbiBpbnNpZGUgb25ld2F5IGhhbmRsZXJcIiwgZSk7IiA8PCBlbmRsOworCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJieXRlIG1zZ1R5cGUgPSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWVzc2FnZVR5cGUuUkVQTFk7IiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAib3JnLmFwYWNoZS50aHJpZnQuVFNlcmlhbGl6YWJsZSBtc2c7IiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCByZXN1bHRuYW1lIDw8ICIgcmVzdWx0ID0gbmV3ICIgPDwgcmVzdWx0bmFtZSA8PCAiKCk7IiA8PCBlbmRsOworCisgICAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKyAgICBpZiAoeGNlcHRpb25zLnNpemUoKSA+IDApIHsKKyAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICAgIGlmICh4X2l0ZXIgPT0geGNlcHRpb25zLmJlZ2luKCkpCisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKKyAgICAgICAgc3RyaW5nIHR5cGUgPSB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UpOworICAgICAgICBzdHJpbmcgbmFtZSA9ICgqeF9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAiaWYgKGUgaW5zdGFuY2VvZiAiIDw8IHR5cGUgPDwgIikgeyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJlc3VsdC4iIDw8IG5hbWUgPDwgIiA9ICgiIDw8IHR5cGUgPDwgIikgZTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LnNldCIgPDwgZ2V0X2NhcF9uYW1lKG5hbWUpIDw8IGdldF9jYXBfbmFtZSgiaXNTZXQiKQorICAgICAgICAgICAgICAgICAgIDw8ICIodHJ1ZSk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm1zZyA9IHJlc3VsdDsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSBlbHNlICI7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKTsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCAiaWYgKGUgaW5zdGFuY2VvZiBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbikgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJfTE9HR0VSLmVycm9yKFwiVFRyYW5zcG9ydEV4Y2VwdGlvbiBpbnNpZGUgaGFuZGxlclwiLCBlKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJmYi5jbG9zZSgpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIG9yZy5hcGFjaGUudGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbikgeyIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJfTE9HR0VSLmVycm9yKFwiVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGluc2lkZSBoYW5kbGVyXCIsIGUpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm1zZ1R5cGUgPSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWVzc2FnZVR5cGUuRVhDRVBUSU9OOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm1zZyA9IChvcmcuYXBhY2hlLnRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24pZTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIl9MT0dHRVIuZXJyb3IoXCJFeGNlcHRpb24gaW5zaWRlIGhhbmRsZXJcIiwgZSk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAibXNnVHlwZSA9IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNZXNzYWdlVHlwZS5FWENFUFRJT047IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAibXNnID0gbmV3ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24ob3JnLmFwYWNoZS50aHJpZnQuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5JTlRFUk5BTF9FUlJPUiwgZS5nZXRNZXNzYWdlKCkpOyIKKyAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAidHJ5IHsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIGZjYWxsLnNlbmRSZXNwb25zZShmYixtc2csbXNnVHlwZSxzZXFpZCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSBjYXRjaCAoamF2YS5sYW5nLkV4Y2VwdGlvbiBleCkgeyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgX0xPR0dFUi5lcnJvcihcIkV4Y2VwdGlvbiB3cml0aW5nIHRvIGludGVybmFsIGZyYW1lIGJ1ZmZlclwiLCBleCk7IgorICAgICAgICAgICAgICAgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgZmIuY2xvc2UoKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9OyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwcm90ZWN0ZWQgYm9vbGVhbiBpc09uZXdheSgpIHsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICByZXR1cm4gIiA8PCAoKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpID8gInRydWUiIDogImZhbHNlIikgPDwgIjsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIHZvaWQgc3RhcnQoSSBpZmFjZSwgIiA8PCBhcmdzbmFtZQorICAgICAgICAgICAgICAgICAgICAgPDwgIiBhcmdzLCBvcmcuYXBhY2hlLnRocmlmdC5hc3luYy5Bc3luY01ldGhvZENhbGxiYWNrPCIgPDwgcmVzdWx0dHlwZQorICAgICAgICAgICAgICAgICAgICAgPDwgIj4gcmVzdWx0SGFuZGxlcikgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gR2VuZXJhdGUgdGhlIGZ1bmN0aW9uIGNhbGwKKyAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOworCisgIGZfc2VydmljZV8gPDwgImlmYWNlLiIgPDwgZ2V0X3JwY19tZXRob2RfbmFtZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpIDw8ICIoIjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgImFyZ3MuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgIH0KKyAgaWYgKCFmaXJzdCkKKyAgICBmX3NlcnZpY2VfIDw8ICIsIjsKKyAgZl9zZXJ2aWNlXyA8PCAicmVzdWx0SGFuZGxlciI7CisgIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSI7CisKKyAgLy8gQ2xvc2UgZnVuY3Rpb24KKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIC8vIENsb3NlIGNsYXNzCisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBwcm9jZXNzIGZ1bmN0aW9uIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24gdG8gd3JpdGUgYSBkaXNwYXRjaGVyIGZvcgorICovCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIHN0cmluZyBhcmdzbmFtZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfYXJncyI7CisgIHN0cmluZyByZXN1bHRuYW1lID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOworICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIHJlc3VsdG5hbWUgPSAib3JnLmFwYWNoZS50aHJpZnQuVEJhc2UiOworICB9CisKKyAgKHZvaWQpdHNlcnZpY2U7CisgIC8vIE9wZW4gY2xhc3MKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgc3RhdGljIGNsYXNzICIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICA8PCAiPEkgZXh0ZW5kcyBJZmFjZT4gZXh0ZW5kcyBvcmcuYXBhY2hlLnRocmlmdC5Qcm9jZXNzRnVuY3Rpb248SSwgIgorICAgICAgICAgICAgICAgICAgICAgPDwgYXJnc25hbWUgPDwgIj4geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigpIHsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICBzdXBlcihcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJcIik7IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IGFyZ3NuYW1lIDw8ICIgZ2V0RW1wdHlBcmdzSW5zdGFuY2UoKSB7IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgcmV0dXJuIG5ldyAiIDw8IGFyZ3NuYW1lIDw8ICIoKTsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJvdGVjdGVkIGJvb2xlYW4gaXNPbmV3YXkoKSB7IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgcmV0dXJuICIgPDwgKCh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSA/ICJ0cnVlIiA6ICJmYWxzZSIpIDw8ICI7IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIkBPdmVycmlkZSIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwcm90ZWN0ZWQgYm9vbGVhbiByZXRocm93VW5oYW5kbGVkRXhjZXB0aW9ucygpIHsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICByZXR1cm4gIiA8PCAoKHJldGhyb3dfdW5oYW5kbGVkX2V4Y2VwdGlvbnNfKSA/ICJ0cnVlIiA6ICJmYWxzZSIpIDw8ICI7IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IHJlc3VsdG5hbWUgPDwgIiBnZXRSZXN1bHQoSSBpZmFjZSwgIiA8PCBhcmdzbmFtZQorICAgICAgICAgICAgICAgICAgICAgPDwgIiBhcmdzKSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IHJlc3VsdG5hbWUgPDwgIiByZXN1bHQgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIoKTsiIDw8IGVuZGw7CisgIH0KKworICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworCisgIC8vIFRyeSBibG9jayBmb3IgYSBmdW5jdGlvbiB3aXRoIGV4Y2VwdGlvbnMKKyAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidHJ5IHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgIH0KKworICAvLyBHZW5lcmF0ZSB0aGUgZnVuY3Rpb24gY2FsbAorICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7CisKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgIGZfc2VydmljZV8gPDwgInJlc3VsdC5zdWNjZXNzID0gIjsKKyAgfQorICBmX3NlcnZpY2VfIDw8ICJpZmFjZS4iIDw8IGdldF9ycGNfbWV0aG9kX25hbWUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSA8PCAiKCI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOworICAgIH0KKyAgICBmX3NlcnZpY2VfIDw8ICJhcmdzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICB9CisgIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOworCisgIC8vIFNldCBpc3NldCBvbiBzdWNjZXNzIGZpZWxkCisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkKKyAgICAgICYmICF0eXBlX2Nhbl9iZV9udWxsKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSkpIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJlc3VsdC5zZXQiIDw8IGdldF9jYXBfbmFtZSgic3VjY2VzcyIpIDw8IGdldF9jYXBfbmFtZSgiaXNTZXQiKQorICAgICAgICAgICAgICAgICAgICAgICA8PCAiKHRydWUpOyIgPDwgZW5kbDsKKyAgfQorCisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiB4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgeworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSI7CisgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgIiBjYXRjaCAoIiA8PCB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UpIDw8ICIgIgorICAgICAgICAgICAgICAgICA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIikgeyIgPDwgZW5kbDsKKyAgICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiCisgICAgICAgICAgICAgICAgICAgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgIn0iOworICAgICAgfQorICAgIH0KKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisgIH0KKworICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIG51bGw7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIHJlc3VsdDsiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IjsKKworICAvLyBDbG9zZSBmdW5jdGlvbgorICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgLy8gQ2xvc2UgY2xhc3MKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIERlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgorICoKKyAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkCisgKiBAcGFyYW0gcHJlZml4IFRoZSB2YXJpYWJsZSBuYW1lIG9yIGNvbnRhaW5lciBmb3IgdGhpcyBmaWVsZAorICovCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc19tZXRhZGF0YSkgeworICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisKKyAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgREVTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICB9CisKKyAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIG5hbWUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbmFtZSwgaGFzX21ldGFkYXRhKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIiA9IGlwcm90LiI7CisKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgIG91dCA8PCAicmVhZEJpbmFyeSgpOyI7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgInJlYWRTdHJpbmcoKTsiOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgb3V0IDw8ICJyZWFkQm9vbCgpOyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgb3V0IDw8ICJyZWFkQnl0ZSgpOyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIG91dCA8PCAicmVhZEkxNigpOyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIG91dCA8PCAicmVhZEkzMigpOyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIG91dCA8PCAicmVhZEk2NCgpOyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIG91dCA8PCAicmVhZERvdWJsZSgpOyI7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBKYXZhIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiID0gIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCksIHRydWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSkKKyAgICAgICAgICAgICAgICAgICArICIuZmluZEJ5VmFsdWUoaXByb3QucmVhZEkzMigpKTsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gREVTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCisgICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYW4gdW5zZXJpYWxpemVyIGZvciBhIHN0cnVjdCwgaW52b2tlcyByZWFkKCkKKyAqLwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7CisKKyAgaWYgKHJldXNlX29iamVjdHNfKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IHByZWZpeCA8PCAiID09IG51bGwpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgIH0KKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIigpOyIgPDwgZW5kbDsKKyAgaWYgKHJldXNlX29iamVjdHNfKSB7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi5yZWFkKGlwcm90KTsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogRGVzZXJpYWxpemVzIGEgY29udGFpbmVyIGJ5IHJlYWRpbmcgaXRzIHNpemUgYW5kIHRoZW4gaXRlcmF0aW5nCisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNfbWV0YWRhdGEpIHsKKworICBzY29wZV91cChvdXQpOworCisgIHN0cmluZyBvYmo7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIG9iaiA9IHRtcCgiX21hcCIpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIG9iaiA9IHRtcCgiX3NldCIpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBvYmogPSB0bXAoIl9saXN0Iik7CisgIH0KKworICBpZiAoaGFzX21ldGFkYXRhKSB7CisgICAgLy8gRGVjbGFyZSB2YXJpYWJsZXMsIHJlYWQgaGVhZGVyCisgICAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAgIiA8PCBvYmogPDwgIiA9IGlwcm90LnJlYWRNYXBCZWdpbigpOyIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU2V0ICIgPDwgb2JqIDw8ICIgPSBpcHJvdC5yZWFkU2V0QmVnaW4oKTsiCisgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRMaXN0ICIgPDwgb2JqIDw8ICIgPSBpcHJvdC5yZWFkTGlzdEJlZ2luKCk7IgorICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgLy8gRGVjbGFyZSB2YXJpYWJsZXMsIHJlYWQgaGVhZGVyCisgICAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAgIiA8PCBvYmoKKyAgICAgICAgICAgICAgICAgIDw8ICIgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcCgiCisgICAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgPDwgIiwgIgorICAgICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpIDw8ICIsICIKKyAgICAgICAgICAgICAgICAgIDw8ICJpcHJvdC5yZWFkSTMyKCkpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTZXQgIiA8PCBvYmoKKyAgICAgICAgICAgICAgICAgIDw8ICIgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFNldCgiCisgICAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsIGlwcm90LnJlYWRJMzIoKSk7IgorICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTGlzdCAiIDw8IG9iagorICAgICAgICAgICAgICAgICAgPDwgIiA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTGlzdCgiCisgICAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCBpcHJvdC5yZWFkSTMyKCkpOyIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgaWYgKHJldXNlX29iamVjdHNfKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IHByZWZpeCA8PCAiID09IG51bGwpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgIH0KKworICBpZiAoaXNfZW51bV9zZXQodHR5cGUpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gIiA8PCB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlLCB0cnVlKSA8PCAiLm5vbmVPZiI7CisgIH0gZWxzZSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSk7CisgIH0KKworICAvLyBjb25zdHJ1Y3QgdGhlIGNvbGxlY3Rpb24gY29ycmVjdGx5IGkuZS4gd2l0aCBhcHByb3ByaWF0ZSBzaXplL3R5cGUKKyAgaWYgKGlzX2VudW1fc2V0KHR0eXBlKSB8fCBpc19lbnVtX21hcCh0dHlwZSkpIHsKKyAgICBvdXQgPDwgIigiIDw8IGlubmVyX2VudW1fdHlwZV9uYW1lKHR0eXBlKSA8PCAiKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAoc29ydGVkX2NvbnRhaW5lcnNfICYmICh0dHlwZS0+aXNfbWFwKCkgfHwgdHR5cGUtPmlzX3NldCgpKSkgeworICAgIC8vIFRyZWVTZXQgYW5kIFRyZWVNYXAgZG9uJ3QgaGF2ZSBhbnkgY29uc3RydWN0b3Igd2hpY2ggdGFrZXMgYSBjYXBhY2l0eSBhcyBhbiBhcmd1bWVudAorICAgIG91dCA8PCAiKCk7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIG91dCA8PCAiKCIgPDwgKHR0eXBlLT5pc19saXN0KCkgPyAiIiA6ICIyKiIpIDw8IG9iaiA8PCAiLnNpemUiCisgICAgICAgIDw8ICIpOyIgPDwgZW5kbDsKKyAgfQorCisgIGlmIChyZXVzZV9vYmplY3RzXykgeworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBwcmVmaXgsIG9iaiwgaGFzX21ldGFkYXRhKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIHByZWZpeCwgb2JqLCBoYXNfbWV0YWRhdGEpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgcHJlZml4LCBvYmosIGhhc19tZXRhZGF0YSk7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7CisKKyAgaWYgKGhhc19tZXRhZGF0YSkgeworICAgIC8vIFJlYWQgY29udGFpbmVyIGVuZAorICAgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkTWFwRW5kKCk7IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZFNldEVuZCgpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkTGlzdEVuZCgpOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgc2NvcGVfZG93bihvdXQpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBjb2RlIHRvIGRlc2VyaWFsaXplIGEgbWFwCisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNfbWV0YWRhdGEpIHsKKyAgc3RyaW5nIGtleSA9IHRtcCgiX2tleSIpOworICBzdHJpbmcgdmFsID0gdG1wKCJfdmFsIik7CisgIHRfZmllbGQgZmtleSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KTsKKyAgdF9maWVsZCBmdmFsKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2YWwpOworCisgIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZrZXksIHJldXNlX29iamVjdHNfLCBmYWxzZSkgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZnZhbCwgcmV1c2Vfb2JqZWN0c18sIGZhbHNlKSA8PCBlbmRsOworCisgIC8vIEZvciBsb29wIGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMKKyAgc3RyaW5nIGkgPSB0bXAoIl9pIik7CisgIGluZGVudChvdXQpIDw8ICJmb3IgKGludCAiIDw8IGkgPDwgIiA9IDA7ICIgPDwgaSA8PCAiIDwgIiA8PCBvYmogPDwgIi5zaXplIgorICAgICAgICAgICAgICA8PCAiOyAiCisgICAgICAgICAgICAgIDw8ICIrKyIgPDwgaSA8PCAiKSIgPDwgZW5kbDsKKworICBzY29wZV91cChvdXQpOworCisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZrZXksICIiLCBoYXNfbWV0YWRhdGEpOworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmdmFsLCAiIiwgaGFzX21ldGFkYXRhKTsKKworICBpZiAoZ2V0X3RydWVfdHlwZShma2V5LmdldF90eXBlKCkpLT5pc19lbnVtKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwga2V5IDw8ICIgIT0gbnVsbCkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgfQorCisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLnB1dCgiIDw8IGtleSA8PCAiLCAiIDw8IHZhbCA8PCAiKTsiIDw8IGVuZGw7CisKKyAgaWYgKGdldF90cnVlX3R5cGUoZmtleS5nZXRfdHlwZSgpKS0+aXNfZW51bSgpKSB7CisgICAgc2NvcGVfZG93bihvdXQpOworICB9CisKKyAgaWYgKHJldXNlX29iamVjdHNfICYmICFnZXRfdHJ1ZV90eXBlKGZrZXkuZ2V0X3R5cGUoKSktPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwga2V5IDw8ICIgPSBudWxsOyIgPDwgZW5kbDsKKyAgfQorCisgIGlmIChyZXVzZV9vYmplY3RzXyAmJiAhZ2V0X3RydWVfdHlwZShmdmFsLmdldF90eXBlKCkpLT5pc19iYXNlX3R5cGUoKSkgeworICAgIGluZGVudChvdXQpIDw8IHZhbCA8PCAiID0gbnVsbDsiIDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBEZXNlcmlhbGl6ZXMgYSBzZXQgZWxlbWVudAorICovCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBvYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzX21ldGFkYXRhKSB7CisgIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOworICB0X2ZpZWxkIGZlbGVtKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZmVsZW0sIHJldXNlX29iamVjdHNfLCBmYWxzZSkgPDwgZW5kbDsKKworICAvLyBGb3IgbG9vcCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzCisgIHN0cmluZyBpID0gdG1wKCJfaSIpOworICBpbmRlbnQob3V0KSA8PCAiZm9yIChpbnQgIiA8PCBpIDw8ICIgPSAwOyAiIDw8IGkgPDwgIiA8ICIgPDwgb2JqIDw8ICIuc2l6ZSIKKyAgICAgICAgICAgICAgPDwgIjsgIgorICAgICAgICAgICAgICA8PCAiKysiIDw8IGkgPDwgIikiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0sICIiLCBoYXNfbWV0YWRhdGEpOworCisgIGlmIChnZXRfdHJ1ZV90eXBlKGZlbGVtLmdldF90eXBlKCkpLT5pc19lbnVtKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgZWxlbSA8PCAiICE9IG51bGwpIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi5hZGQoIiA8PCBlbGVtIDw8ICIpOyIgPDwgZW5kbDsKKworICBpZiAoZ2V0X3RydWVfdHlwZShmZWxlbS5nZXRfdHlwZSgpKS0+aXNfZW51bSgpKSB7CisgICAgc2NvcGVfZG93bihvdXQpOworICB9CisKKyAgaWYgKHJldXNlX29iamVjdHNfICYmICFnZXRfdHJ1ZV90eXBlKGZlbGVtLmdldF90eXBlKCkpLT5pc19iYXNlX3R5cGUoKSkgeworICAgIGluZGVudChvdXQpIDw8IGVsZW0gPDwgIiA9IG51bGw7IiA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogRGVzZXJpYWxpemVzIGEgbGlzdCBlbGVtZW50CisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzX21ldGFkYXRhKSB7CisgIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOworICB0X2ZpZWxkIGZlbGVtKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOworCisgIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZlbGVtLCByZXVzZV9vYmplY3RzXywgZmFsc2UpIDw8IGVuZGw7CisKKyAgLy8gRm9yIGxvb3AgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cworICBzdHJpbmcgaSA9IHRtcCgiX2kiKTsKKyAgaW5kZW50KG91dCkgPDwgImZvciAoaW50ICIgPDwgaSA8PCAiID0gMDsgIiA8PCBpIDw8ICIgPCAiIDw8IG9iaiA8PCAiLnNpemUiCisgICAgICAgICAgICAgIDw8ICI7ICIKKyAgICAgICAgICAgICAgPDwgIisrIiA8PCBpIDw8ICIpIiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworCisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtLCAiIiwgaGFzX21ldGFkYXRhKTsKKworICBpZiAoZ2V0X3RydWVfdHlwZShmZWxlbS5nZXRfdHlwZSgpKS0+aXNfZW51bSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IGVsZW0gPDwgIiAhPSBudWxsKSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChvdXQpOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIuYWRkKCIgPDwgZWxlbSA8PCAiKTsiIDw8IGVuZGw7CisKKyAgaWYgKGdldF90cnVlX3R5cGUoZmVsZW0uZ2V0X3R5cGUoKSktPmlzX2VudW0oKSkgeworICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgfQorCisgIGlmIChyZXVzZV9vYmplY3RzXyAmJiAhZ2V0X3RydWVfdHlwZShmZWxlbS5nZXRfdHlwZSgpKS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCBlbGVtIDw8ICIgPSBudWxsOyIgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KKyAqCisgKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCB0byBzZXJpYWxpemUKKyAqIEBwYXJhbSBwcmVmaXggTmFtZSB0byBwcmVwZW5kIHRvIGZpZWxkIG5hbWUKKyAqLwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzX21ldGFkYXRhKSB7CisgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKworICAvLyBEbyBub3RoaW5nIGZvciB2b2lkIHR5cGVzCisgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIFNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgIH0KKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpLCBoYXNfbWV0YWRhdGEpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUkzMigiIDw8IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiLmdldFZhbHVlKCkpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHN0cmluZyBuYW1lID0gcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC4iOworCisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgICAgb3V0IDw8ICJ3cml0ZUJpbmFyeSgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgPDwgIndyaXRlU3RyaW5nKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICBvdXQgPDwgIndyaXRlQm9vbCgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICBvdXQgPDwgIndyaXRlQnl0ZSgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUkxNigiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUkzMigiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUk2NCgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgb3V0IDw8ICJ3cml0ZURvdWJsZSgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEphdmEgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICBvdXQgPDwgIndyaXRlSTMyKHN0cnVjdC4iIDw8IG5hbWUgPDwgIik7IjsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gU0VSSUFMSVpFIEZJRUxEICclcyVzJyBUWVBFICclcydcbiIsCisgICAgICAgICAgIHByZWZpeC5jX3N0cigpLAorICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgdHlwZV9uYW1lKHR5cGUpLmNfc3RyKCkpOworICB9Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhbGwgdGhlIG1lbWJlcnMgb2YgYSBzdHJ1Y3QuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCB0byBzZXJpYWxpemUKKyAqIEBwYXJhbSBwcmVmaXggIFN0cmluZyBwcmVmaXggdG8gYXR0YWNoIHRvIGFsbCBmaWVsZHMKKyAqLwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcmVmaXgpIHsKKyAgKHZvaWQpdHN0cnVjdDsKKyAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiLndyaXRlKG9wcm90KTsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhIGNvbnRhaW5lciBieSB3cml0aW5nIGl0cyBzaXplIHRoZW4gdGhlIGVsZW1lbnRzLgorICoKKyAqIEBwYXJhbSB0dHlwZSAgVGhlIHR5cGUgb2YgY29udGFpbmVyCisgKiBAcGFyYW0gcHJlZml4IFN0cmluZyBwcmVmaXggZm9yIGZpZWxkcworICovCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc19tZXRhZGF0YSkgeworICBzY29wZV91cChvdXQpOworCisgIGlmIChoYXNfbWV0YWRhdGEpIHsKKyAgICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVNYXBCZWdpbihuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcCgiCisgICAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgPDwgIiwgIgorICAgICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpIDw8ICIsICIgPDwgcHJlZml4IDw8ICIuc2l6ZSgpKSk7IgorICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlU2V0QmVnaW4obmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTZXQoIgorICAgICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiIDw8IHByZWZpeAorICAgICAgICAgICAgICAgICAgPDwgIi5zaXplKCkpKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVMaXN0QmVnaW4obmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRMaXN0KCIKKyAgICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIgPDwgcHJlZml4CisgICAgICAgICAgICAgICAgICA8PCAiLnNpemUoKSkpOyIgPDwgZW5kbDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlSTMyKCIgPDwgcHJlZml4IDw8ICIuc2l6ZSgpKTsiIDw8IGVuZGw7CisgIH0KKworICBzdHJpbmcgaXRlciA9IHRtcCgiX2l0ZXIiKTsKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJmb3IgKGphdmEudXRpbC5NYXAuRW50cnk8IiA8PCB0eXBlX25hbWUoKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSwgdHJ1ZSwgZmFsc2UpCisgICAgICAgICAgICAgICAgPDwgIiwgIiA8PCB0eXBlX25hbWUoKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSwgdHJ1ZSwgZmFsc2UpIDw8ICI+ICIgPDwgaXRlcgorICAgICAgICAgICAgICAgIDw8ICIgOiAiIDw8IHByZWZpeCA8PCAiLmVudHJ5U2V0KCkpIjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yICgiIDw8IHR5cGVfbmFtZSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiAiIDw8IGl0ZXIgPDwgIiA6ICIKKyAgICAgICAgICAgICAgICA8PCBwcmVmaXggPDwgIikiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yICgiIDw8IHR5cGVfbmFtZSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIgIiA8PCBpdGVyIDw8ICIgOiAiCisgICAgICAgICAgICAgICAgPDwgcHJlZml4IDw8ICIpIjsKKyAgfQorCisgIG91dCA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgaXRlciwgcHJlZml4LCBoYXNfbWV0YWRhdGEpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIGl0ZXIsIGhhc19tZXRhZGF0YSk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgaXRlciwgaGFzX21ldGFkYXRhKTsKKyAgfQorICBzY29wZV9kb3duKG91dCk7CisKKyAgaWYgKGhhc19tZXRhZGF0YSkgeworICAgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZU1hcEVuZCgpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlU2V0RW5kKCk7IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlTGlzdEVuZCgpOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBzY29wZV9kb3duKG91dCk7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIG1hcC4KKyAqLwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc19tZXRhZGF0YSkgeworICAodm9pZCltYXA7CisgIHRfZmllbGQga2ZpZWxkKHRtYXAtPmdldF9rZXlfdHlwZSgpLCBpdGVyICsgIi5nZXRLZXkoKSIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAma2ZpZWxkLCAiIiwgaGFzX21ldGFkYXRhKTsKKyAgdF9maWVsZCB2ZmllbGQodG1hcC0+Z2V0X3ZhbF90eXBlKCksIGl0ZXIgKyAiLmdldFZhbHVlKCkiKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJnZmaWVsZCwgIiIsIGhhc19tZXRhZGF0YSk7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIHNldC4KKyAqLwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzX21ldGFkYXRhKSB7CisgIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiLCBoYXNfbWV0YWRhdGEpOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBsaXN0LgorICovCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNfbWV0YWRhdGEpIHsKKyAgdF9maWVsZCBlZmllbGQodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiLCBoYXNfbWV0YWRhdGEpOworfQorCisvKioKKyAqIFJldHVybnMgYSBKYXZhIHR5cGUgbmFtZQorICoKKyAqIEBwYXJhbSB0dHlwZSBUaGUgdHlwZQorICogQHBhcmFtIGNvbnRhaW5lciBJcyB0aGUgdHlwZSBnb2luZyBpbnNpZGUgYSBjb250YWluZXI/CisgKiBAcmV0dXJuIEphdmEgdHlwZSBuYW1lLCBpLmUuIGphdmEudXRpbC5IYXNoTWFwPEtleSxWYWx1ZT4KKyAqLworc3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2NvbnRhaW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9pbml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNraXBfZ2VuZXJpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZV9uYW1lc3BhY2UpIHsKKyAgLy8gSW4gSmF2YSB0eXBlZGVmcyBhcmUganVzdCByZXNvbHZlZCB0byB0aGVpciByZWFsIHR5cGUKKyAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKKyAgc3RyaW5nIHByZWZpeDsKKworICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgcmV0dXJuIGJhc2VfdHlwZV9uYW1lKCh0X2Jhc2VfdHlwZSopdHR5cGUsIGluX2NvbnRhaW5lcik7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgdF9tYXAqIHRtYXAgPSAodF9tYXAqKXR0eXBlOworICAgIGlmIChpbl9pbml0KSB7CisgICAgICBpZiAoaXNfZW51bV9tYXAodG1hcCkpIHsKKyAgICAgICAgcHJlZml4ID0gImphdmEudXRpbC5FbnVtTWFwIjsKKyAgICAgIH0gZWxzZSBpZiAoc29ydGVkX2NvbnRhaW5lcnNfKSB7CisgICAgICAgIHByZWZpeCA9ICJqYXZhLnV0aWwuVHJlZU1hcCI7CisgICAgICB9IGVsc2UgeworICAgICAgICBwcmVmaXggPSAiamF2YS51dGlsLkhhc2hNYXAiOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBwcmVmaXggPSAiamF2YS51dGlsLk1hcCI7CisgICAgfQorICAgIHJldHVybiBwcmVmaXggKyAoc2tpcF9nZW5lcmljID8gIiIgOiAiPCIgKyB0eXBlX25hbWUodG1hcC0+Z2V0X2tleV90eXBlKCksIHRydWUpICsgIiwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdHlwZV9uYW1lKHRtYXAtPmdldF92YWxfdHlwZSgpLCB0cnVlKSArICI+Iik7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgdF9zZXQqIHRzZXQgPSAodF9zZXQqKXR0eXBlOworICAgIGlmIChpbl9pbml0KSB7CisgICAgICBpZiAoaXNfZW51bV9zZXQodHNldCkpIHsKKyAgICAgICAgcHJlZml4ID0gImphdmEudXRpbC5FbnVtU2V0IjsKKyAgICAgIH0gZWxzZSBpZiAoc29ydGVkX2NvbnRhaW5lcnNfKSB7CisgICAgICAgIHByZWZpeCA9ICJqYXZhLnV0aWwuVHJlZVNldCI7CisgICAgICB9IGVsc2UgeworICAgICAgICBwcmVmaXggPSAiamF2YS51dGlsLkhhc2hTZXQiOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBwcmVmaXggPSAiamF2YS51dGlsLlNldCI7CisgICAgfQorICAgIHJldHVybiBwcmVmaXggKyAoc2tpcF9nZW5lcmljID8gIiIgOiAiPCIgKyB0eXBlX25hbWUodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCB0cnVlKSArICI+Iik7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHRfbGlzdCogdGxpc3QgPSAodF9saXN0Kil0dHlwZTsKKyAgICBpZiAoaW5faW5pdCkgeworICAgICAgcHJlZml4ID0gImphdmEudXRpbC5BcnJheUxpc3QiOworICAgIH0gZWxzZSB7CisgICAgICBwcmVmaXggPSAiamF2YS51dGlsLkxpc3QiOworICAgIH0KKyAgICByZXR1cm4gcHJlZml4ICsgKHNraXBfZ2VuZXJpYyA/ICIiIDogIjwiICsgdHlwZV9uYW1lKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIHRydWUpICsgIj4iKTsKKyAgfQorCisgIC8vIENoZWNrIGZvciBuYW1lc3BhY2luZworICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKTsKKyAgaWYgKChwcm9ncmFtICE9IE5VTEwpICYmICgocHJvZ3JhbSAhPSBwcm9ncmFtXykgfHwgZm9yY2VfbmFtZXNwYWNlKSkgeworICAgIHN0cmluZyBwYWNrYWdlID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiamF2YSIpOworICAgIGlmICghcGFja2FnZS5lbXB0eSgpKSB7CisgICAgICByZXR1cm4gcGFja2FnZSArICIuIiArIHR0eXBlLT5nZXRfbmFtZSgpOworICAgIH0KKyAgfQorCisgIHJldHVybiB0dHlwZS0+Z2V0X25hbWUoKTsKK30KKworLyoqCisgKiBSZXR1cm5zIHRoZSBKYXZhIHR5cGUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgdGhyaWZ0IHR5cGUuCisgKgorICogQHBhcmFtIHRiYXNlIFRoZSBiYXNlIHR5cGUKKyAqIEBwYXJhbSBjb250YWluZXIgSXMgaXQgZ29pbmcgaW4gYSBKYXZhIGNvbnRhaW5lcj8KKyAqLworc3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OmJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlKiB0eXBlLCBib29sIGluX2NvbnRhaW5lcikgeworICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gdHlwZS0+Z2V0X2Jhc2UoKTsKKworICBzd2l0Y2ggKHRiYXNlKSB7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICByZXR1cm4gKGluX2NvbnRhaW5lciA/ICJWb2lkIiA6ICJ2b2lkIik7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgcmV0dXJuICJqYXZhLm5pby5CeXRlQnVmZmVyIjsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuICJqYXZhLmxhbmcuU3RyaW5nIjsKKyAgICB9CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICByZXR1cm4gKGluX2NvbnRhaW5lciA/ICJqYXZhLmxhbmcuQm9vbGVhbiIgOiAiYm9vbGVhbiIpOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIHJldHVybiAoaW5fY29udGFpbmVyID8gImphdmEubGFuZy5CeXRlIiA6ICJieXRlIik7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIHJldHVybiAoaW5fY29udGFpbmVyID8gImphdmEubGFuZy5TaG9ydCIgOiAic2hvcnQiKTsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgcmV0dXJuIChpbl9jb250YWluZXIgPyAiamF2YS5sYW5nLkludGVnZXIiIDogImludCIpOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICByZXR1cm4gKGluX2NvbnRhaW5lciA/ICJqYXZhLmxhbmcuTG9uZyIgOiAibG9uZyIpOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICByZXR1cm4gKGluX2NvbnRhaW5lciA/ICJqYXZhLmxhbmcuRG91YmxlIiA6ICJkb3VibGUiKTsKKyAgZGVmYXVsdDoKKyAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEphdmEgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICB9Cit9CisKKy8qKgorICogRGVjbGFyZXMgYSBmaWVsZCwgd2hpY2ggbWF5IGluY2x1ZGUgaW5pdGlhbGl6YXRpb24gYXMgbmVjZXNzYXJ5LgorICoKKyAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkCisgKiBAcGFyYW0gaW5pdCBXaGV0aGVyIHRvIGluaXRpYWxpemUgdGhlIGZpZWxkCisgKi8KK3N0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjpkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0LCBib29sIGNvbW1lbnQpIHsKKyAgLy8gVE9ETyhtY3NsZWUpOiBkbyB3ZSBldmVyIG5lZWQgdG8gaW5pdGlhbGl6ZSB0aGUgZmllbGQ/CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKyAgdF90eXBlKiB0dHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgaWYgKHR5cGVfY2FuX2JlX251bGwodHR5cGUpKSB7CisgICAgcmVzdWx0ICs9IGphdmFfbnVsbGFibGVfYW5ub3RhdGlvbigpICsgIiAiOworICB9CisgIHJlc3VsdCArPSB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpKSArICIgIiArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgaWYgKGluaXQpIHsKKyAgICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmIHRmaWVsZC0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgeworICAgICAgc3RkOjpvZnN0cmVhbSBkdW1teTsKKyAgICAgIHJlc3VsdCArPSAiID0gIiArIHJlbmRlcl9jb25zdF92YWx1ZShkdW1teSwgdHR5cGUsIHRmaWVsZC0+Z2V0X3ZhbHVlKCkpOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgcmVzdWx0ICs9ICIgPSBudWxsIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIHJlc3VsdCArPSAiID0gZmFsc2UiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIHJlc3VsdCArPSAiID0gMCI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIHJlc3VsdCArPSAiID0gKGRvdWJsZSkwIjsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7CisgICAgICByZXN1bHQgKz0gIiA9IG51bGwiOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgICByZXN1bHQgKz0gIiA9IG5ldyAiICsgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSkgKyAiKCkiOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgKz0gIiA9IG5ldyAiICsgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSkgKyAiKCkiOworICAgICAgOworICAgIH0KKyAgfQorICByZXN1bHQgKz0gIjsiOworICBpZiAoY29tbWVudCkgeworICAgIHJlc3VsdCArPSAiIC8vICI7CisgICAgaWYgKHRmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKKyAgICAgIHJlc3VsdCArPSAib3B0aW9uYWwiOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgKz0gInJlcXVpcmVkIjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd0eXBlIG5hbWUoYXJncyknCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCisgKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCisgKi8KK3N0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdHJpbmcgcHJlZml4KSB7CisgIHRfdHlwZSogdHR5cGUgPSB0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCk7CisgIHN0ZDo6c3RyaW5nIGZuX25hbWUgPSBnZXRfcnBjX21ldGhvZF9uYW1lKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSk7CisgIHN0ZDo6c3RyaW5nIHJlc3VsdCA9IHR5cGVfbmFtZSh0dHlwZSkgKyAiICIgKyBwcmVmaXggKyBmbl9uYW1lICsgIigiCisgICAgICAgICAgICAgICAgICAgICAgICsgYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpICsgIikgdGhyb3dzICI7CisgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgcmVzdWx0ICs9IHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCksIGZhbHNlLCBmYWxzZSkgKyAiLCAiOworICB9CisgIHJlc3VsdCArPSAib3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiI7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAndm9pZCBuYW1lKGFyZ3MsIHJlc3VsdEhhbmRsZXIpJworICoKKyAqIEBwYXJhbXMgdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KKyAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KKyAqLworc3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZV9hc3luYyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdXNlX2Jhc2VfbWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7CisgIHN0ZDo6c3RyaW5nIGFyZ2xpc3QgPSBhc3luY19mdW5jdGlvbl9jYWxsX2FyZ2xpc3QodGZ1bmN0aW9uLCB1c2VfYmFzZV9tZXRob2QsIHRydWUpOworCisgIHN0ZDo6c3RyaW5nIHJldF90eXBlID0gIiI7CisgIGlmICh1c2VfYmFzZV9tZXRob2QpIHsKKyAgICByZXRfdHlwZSArPSAiQXN5bmNDbGllbnQuIjsKKyAgfQorICByZXRfdHlwZSArPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX2NhbGwiOworCisgIHN0ZDo6c3RyaW5nIGZuX25hbWUgPSBnZXRfcnBjX21ldGhvZF9uYW1lKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSk7CisKKyAgc3RkOjpzdHJpbmcgcmVzdWx0ID0gcHJlZml4ICsgInZvaWQgIiArIGZuX25hbWUgKyAiKCIgKyBhcmdsaXN0ICsgIikiOworICByZXR1cm4gcmVzdWx0OworfQorCitzdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6YXN5bmNfZnVuY3Rpb25fY2FsbF9hcmdsaXN0KHRfZnVuY3Rpb24qIHRmdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHVzZV9iYXNlX21ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsdWRlX3R5cGVzKSB7CisgICh2b2lkKXVzZV9iYXNlX21ldGhvZDsKKyAgc3RkOjpzdHJpbmcgYXJnbGlzdCA9ICIiOworICBpZiAodGZ1bmMtPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCkuc2l6ZSgpID4gMCkgeworICAgIGFyZ2xpc3QgPSBhcmd1bWVudF9saXN0KHRmdW5jLT5nZXRfYXJnbGlzdCgpLCBpbmNsdWRlX3R5cGVzKSArICIsICI7CisgIH0KKworICBpZiAoaW5jbHVkZV90eXBlcykgeworICAgIGFyZ2xpc3QgKz0gIm9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLkFzeW5jTWV0aG9kQ2FsbGJhY2s8IjsKKyAgICBhcmdsaXN0ICs9IHR5cGVfbmFtZSh0ZnVuYy0+Z2V0X3JldHVybnR5cGUoKSwgdHJ1ZSkgKyAiPiAiOworICB9CisgIGFyZ2xpc3QgKz0gInJlc3VsdEhhbmRsZXIiOworCisgIHJldHVybiBhcmdsaXN0OworfQorCisvKioKKyAqIFJlbmRlcnMgYSBjb21tYSBzZXBhcmF0ZWQgZmllbGQgbGlzdCwgd2l0aCB0eXBlIG5hbWVzCisgKi8KK3N0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGluY2x1ZGVfdHlwZXMpIHsKKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgKz0gIiwgIjsKKyAgICB9CisgICAgaWYgKGluY2x1ZGVfdHlwZXMpIHsKKyAgICAgIHJlc3VsdCArPSB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSArICIgIjsKKyAgICB9CisgICAgcmVzdWx0ICs9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCitzdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6YXN5bmNfYXJndW1lbnRfbGlzdCh0X2Z1bmN0aW9uKiB0ZnVuY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2x1ZGVfdHlwZXMpIHsKKyAgKHZvaWQpdGZ1bmN0OworICAodm9pZCl0dHlwZTsKKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ICs9ICIsICI7CisgICAgfQorICAgIGlmIChpbmNsdWRlX3R5cGVzKSB7CisgICAgICByZXN1bHQgKz0gdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgKyAiICI7CisgICAgfQorICAgIHJlc3VsdCArPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgIH0KKyAgaWYgKCFmaXJzdCkgeworICAgIHJlc3VsdCArPSAiLCAiOworICB9CisgIGlmIChpbmNsdWRlX3R5cGVzKSB7CisgICAgcmVzdWx0ICs9ICJvcmcuYXBhY2hlLnRocmlmdC5hc3luYy5Bc3luY01ldGhvZENhbGxiYWNrPCI7CisgICAgcmVzdWx0ICs9IHR5cGVfbmFtZSh0ZnVuY3QtPmdldF9yZXR1cm50eXBlKCksIHRydWUpICsgIj4gIjsKKyAgfQorICByZXN1bHQgKz0gInJlc3VsdEhhbmRsZXIiOworICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgSmF2YSBlbnVtIHN0cmluZyBmb3IgdGhlIGdpdmVuIHR5cGUuCisgKi8KK3N0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkciOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuQk9PTCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuQllURSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkkxNiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkkzMiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkk2NCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkRPVUJMRSI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTMyIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5NQVAiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TRVQiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuTElTVCI7CisgIH0KKworICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Cit9CisKKy8qKgorICogVGFrZXMgYSBuYW1lIGFuZCBwcm9kdWVzIGEgdmFsaWQgSmF2YSBzb3VyY2UgZmlsZSBuYW1lIGZyb20gaXQKKyAqCisgKiBAcGFyYW0gZnJvbU5hbWUgVGhlIG5hbWUgd2hpY2ggc2hhbGwgYmVjb21lIGEgdmFsaWQgSmF2YSBzb3VyY2UgZmlsZSBuYW1lCisgKiBAcmV0dXJuIFRoZSBwcm9kdWNlZCBpZGVudGlmaWVyCisgKi8KK3N0ZDo6c3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6Om1ha2VfdmFsaWRfamF2YV9maWxlbmFtZShzdGQ6OnN0cmluZyBjb25zdCYgZnJvbU5hbWUpIHsKKyAgLy8gaWYgYW55IGZ1cnRoZXIgcnVsZXMgYXBwbHkgdG8gc291cmNlIGZpbGUgbmFtZXMgaW4gSmF2YSwgbW9kaWZ5IGFzIG5lY2Vzc2FyeQorICByZXR1cm4gbWFrZV92YWxpZF9qYXZhX2lkZW50aWZpZXIoZnJvbU5hbWUpOworfQorCisvKioKKyAqIFRha2VzIGEgbmFtZSBhbmQgcHJvZHVlcyBhIHZhbGlkIEphdmEgaWRlbnRpZmllciBmcm9tIGl0CisgKgorICogQHBhcmFtIGZyb21OYW1lIFRoZSBuYW1lIHdoaWNoIHNoYWxsIGJlY29tZSBhIHZhbGlkIEphdmEgaWRlbnRpZmllcgorICogQHJldHVybiBUaGUgcHJvZHVjZWQgaWRlbnRpZmllcgorICovCitzdGQ6OnN0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjptYWtlX3ZhbGlkX2phdmFfaWRlbnRpZmllcihzdGQ6OnN0cmluZyBjb25zdCYgZnJvbU5hbWUpIHsKKyAgc3RkOjpzdHJpbmcgc3RyID0gZnJvbU5hbWU7CisgIGlmIChzdHIuZW1wdHkoKSkgeworICAgIHJldHVybiBzdHI7CisgIH0KKworICAvLyB0ZXN0cyByZWx5IG9uIHRoaXMKKyAgYXNzZXJ0KCgnQScgPCAnWicpICYmICgnYScgPCAneicpICYmICgnMCcgPCAnOScpKTsKKworICAvLyBpZiB0aGUgZmlyc3QgbGV0dGVyIGlzIGEgbnVtYmVyLCB3ZSBhZGQgYW4gYWRkaXRpb25hbCB1bmRlcnNjb3JlIGluIGZyb250IG9mIGl0CisgIGNoYXIgYyA9IHN0ci5hdCgwKTsKKyAgaWYgKCgnMCcgPD0gYykgJiYgKGMgPD0gJzknKSkgeworICAgIHN0ciA9ICJfIiArIHN0cjsKKyAgfQorCisgIC8vIGZvbGxvd2luZyBjaGFyczogbGV0dGVyLCBudW1iZXIgb3IgdW5kZXJzY29yZQorICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN0ci5zaXplKCk7ICsraSkgeworICAgIGMgPSBzdHIuYXQoaSk7CisgICAgaWYgKCgoJ0EnID4gYykgfHwgKGMgPiAnWicpKSAmJiAoKCdhJyA+IGMpIHx8IChjID4gJ3onKSkgJiYgKCgnMCcgPiBjKSB8fCAoYyA+ICc5JykpCisgICAgICAgICYmICgnXycgIT0gYykpIHsKKyAgICAgIHN0ci5yZXBsYWNlKGksIDEsICJfIik7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHN0cjsKK30KKworc3RkOjpzdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6YXNfY2FtZWxfY2FzZShzdGQ6OnN0cmluZyBuYW1lLCBib29sIHVjZmlyc3QpIHsKKyAgc3RkOjpzdHJpbmcgbmV3X25hbWU7CisgIHNpemVfdCBpID0gMDsKKyAgZm9yIChpID0gMDsgaSA8IG5hbWUuc2l6ZSgpOyBpKyspIHsKKyAgICBpZiAobmFtZVtpXSAhPSAnXycpCisgICAgICBicmVhazsKKyAgfQorICBpZiAodWNmaXJzdCkgeworICAgIG5ld19uYW1lICs9IHRvdXBwZXIobmFtZVtpKytdKTsKKyAgfSBlbHNlIHsKKyAgICBuZXdfbmFtZSArPSB0b2xvd2VyKG5hbWVbaSsrXSk7CisgIH0KKyAgZm9yICg7IGkgPCBuYW1lLnNpemUoKTsgaSsrKSB7CisgICAgaWYgKG5hbWVbaV0gPT0gJ18nKSB7CisgICAgICBpZiAoaSA8IG5hbWUuc2l6ZSgpIC0gMSkgeworICAgICAgICBpKys7CisgICAgICAgIG5ld19uYW1lICs9IHRvdXBwZXIobmFtZVtpXSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIG5ld19uYW1lICs9IG5hbWVbaV07CisgICAgfQorICB9CisgIHJldHVybiBuZXdfbmFtZTsKK30KKworc3RkOjpzdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6Z2V0X3JwY19tZXRob2RfbmFtZShzdGQ6OnN0cmluZyBuYW1lKSB7CisgIGlmIChmdWxsY2FtZWxfc3R5bGVfKSB7CisgICAgcmV0dXJuIGFzX2NhbWVsX2Nhc2UobmFtZSwgZmFsc2UpOworICB9IGVsc2UgeworICAgIHJldHVybiBuYW1lOworICB9Cit9CisKKy8qKgorICogQXBwbGllcyB0aGUgY29ycmVjdCBzdHlsZSB0byBhIHN0cmluZyBiYXNlZCBvbiB0aGUgdmFsdWUgb2Ygbm9jYW1lbF9zdHlsZV8KKyAqIGFuZC9vciBmdWxsY2FtZWxfc3R5bGVfCisgKi8KK3N0ZDo6c3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OmdldF9jYXBfbmFtZShzdGQ6OnN0cmluZyBuYW1lKSB7CisgIGlmIChub2NhbWVsX3N0eWxlXykgeworICAgIHJldHVybiAiXyIgKyBuYW1lOworICB9IGVsc2UgaWYgKGZ1bGxjYW1lbF9zdHlsZV8pIHsKKyAgICByZXR1cm4gYXNfY2FtZWxfY2FzZShuYW1lKTsKKyAgfSBlbHNlIHsKKyAgICBuYW1lWzBdID0gdG91cHBlcihuYW1lWzBdKTsKKyAgICByZXR1cm4gbmFtZTsKKyAgfQorfQorCitzdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6Y29uc3RhbnRfbmFtZShzdHJpbmcgbmFtZSkgeworICBzdHJpbmcgY29uc3RhbnRfbmFtZTsKKworICBib29sIGlzX2ZpcnN0ID0gdHJ1ZTsKKyAgYm9vbCB3YXNfcHJldmlvdXNfY2hhcl91cHBlciA9IGZhbHNlOworICBmb3IgKHN0cmluZzo6aXRlcmF0b3IgaXRlciA9IG5hbWUuYmVnaW4oKTsgaXRlciAhPSBuYW1lLmVuZCgpOyArK2l0ZXIpIHsKKyAgICBzdHJpbmc6OnZhbHVlX3R5cGUgY2hhcmFjdGVyID0gKCppdGVyKTsKKworICAgIGJvb2wgaXNfdXBwZXIgPSBpc3VwcGVyKGNoYXJhY3Rlcik7CisKKyAgICBpZiAoaXNfdXBwZXIgJiYgIWlzX2ZpcnN0ICYmICF3YXNfcHJldmlvdXNfY2hhcl91cHBlcikgeworICAgICAgY29uc3RhbnRfbmFtZSArPSAnXyc7CisgICAgfQorICAgIGNvbnN0YW50X25hbWUgKz0gdG91cHBlcihjaGFyYWN0ZXIpOworCisgICAgaXNfZmlyc3QgPSBmYWxzZTsKKyAgICB3YXNfcHJldmlvdXNfY2hhcl91cHBlciA9IGlzX3VwcGVyOworICB9CisKKyAgcmV0dXJuIGNvbnN0YW50X25hbWU7Cit9CisKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVlcF9jb3B5X2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgc291cmNlX25hbWVfcDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgc291cmNlX25hbWVfcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcmVzdWx0X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlKSB7CisKKyAgdF9jb250YWluZXIqIGNvbnRhaW5lciA9ICh0X2NvbnRhaW5lciopdHlwZTsKKyAgc3RkOjpzdHJpbmcgc291cmNlX25hbWU7CisgIGlmIChzb3VyY2VfbmFtZV9wMiA9PSAiIikKKyAgICBzb3VyY2VfbmFtZSA9IHNvdXJjZV9uYW1lX3AxOworICBlbHNlCisgICAgc291cmNlX25hbWUgPSBzb3VyY2VfbmFtZV9wMSArICIuIiArIHNvdXJjZV9uYW1lX3AyOworCisgIGJvb2wgY29weV9jb25zdHJ1Y3RfY29udGFpbmVyOworICBpZiAoY29udGFpbmVyLT5pc19tYXAoKSkgeworICAgIHRfbWFwKiB0bWFwID0gKHRfbWFwKiljb250YWluZXI7CisgICAgY29weV9jb25zdHJ1Y3RfY29udGFpbmVyID0gdG1hcC0+Z2V0X2tleV90eXBlKCktPmlzX2Jhc2VfdHlwZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgdG1hcC0+Z2V0X3ZhbF90eXBlKCktPmlzX2Jhc2VfdHlwZSgpOworICB9IGVsc2UgeworICAgIHRfdHlwZSogZWxlbV90eXBlID0gY29udGFpbmVyLT5pc19saXN0KCkgPyAoKHRfbGlzdCopY29udGFpbmVyKS0+Z2V0X2VsZW1fdHlwZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICgodF9zZXQqKWNvbnRhaW5lciktPmdldF9lbGVtX3R5cGUoKTsKKyAgICBjb3B5X2NvbnN0cnVjdF9jb250YWluZXIgPSBlbGVtX3R5cGUtPmlzX2Jhc2VfdHlwZSgpOworICB9CisKKyAgaWYgKGNvcHlfY29uc3RydWN0X2NvbnRhaW5lcikgeworICAgIC8vIGRlZXAgY29weSBvZiBiYXNlIHR5cGVzIGNhbiBiZSBkb25lIG11Y2ggbW9yZSBlZmZpY2llbnRseSB0aGFuIGl0ZXJhdGluZyBvdmVyIGFsbCB0aGUKKyAgICAvLyBlbGVtZW50cyBtYW51YWxseQorICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZSh0eXBlLCB0cnVlLCBmYWxzZSkgPDwgIiAiIDw8IHJlc3VsdF9uYW1lIDw8ICIgPSBuZXcgIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZShjb250YWluZXIsIGZhbHNlLCB0cnVlKSA8PCAiKCIgPDwgc291cmNlX25hbWUgPDwgIik7IiA8PCBlbmRsOworICAgIHJldHVybjsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIGNvbnN0cnVjdG9yX2FyZ3M7CisgIGlmIChpc19lbnVtX3NldChjb250YWluZXIpIHx8IGlzX2VudW1fbWFwKGNvbnRhaW5lcikpIHsKKyAgICBjb25zdHJ1Y3Rvcl9hcmdzID0gaW5uZXJfZW51bV90eXBlX25hbWUoY29udGFpbmVyKTsKKyAgfSBlbHNlIGlmICghKHNvcnRlZF9jb250YWluZXJzXyAmJiAoY29udGFpbmVyLT5pc19tYXAoKSB8fCBjb250YWluZXItPmlzX3NldCgpKSkpIHsKKyAgICAvLyB1bnNvcnRlZCBjb250YWluZXJzIGFjY2VwdCBhIGNhcGFjaXR5IHZhbHVlCisgICAgY29uc3RydWN0b3JfYXJncyA9IHNvdXJjZV9uYW1lICsgIi5zaXplKCkiOworICB9CisKKyAgaWYgKGlzX2VudW1fc2V0KGNvbnRhaW5lcikpIHsKKyAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUodHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCByZXN1bHRfbmFtZSA8PCAiID0gIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZShjb250YWluZXIsIGZhbHNlLCB0cnVlLCB0cnVlKSA8PCAiLm5vbmVPZigiIDw8IGNvbnN0cnVjdG9yX2FyZ3MgPDwgIik7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZSh0eXBlLCB0cnVlLCBmYWxzZSkgPDwgIiAiIDw8IHJlc3VsdF9uYW1lIDw8ICIgPSBuZXcgIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZShjb250YWluZXIsIGZhbHNlLCB0cnVlKSA8PCAiKCIgPDwgY29uc3RydWN0b3JfYXJncyA8PCAiKTsiIDw8IGVuZGw7CisgIH0KKworICBzdGQ6OnN0cmluZyBpdGVyYXRvcl9lbGVtZW50X25hbWUgPSBzb3VyY2VfbmFtZV9wMSArICJfZWxlbWVudCI7CisgIHN0ZDo6c3RyaW5nIHJlc3VsdF9lbGVtZW50X25hbWUgPSByZXN1bHRfbmFtZSArICJfY29weSI7CisKKyAgaWYgKGNvbnRhaW5lci0+aXNfbWFwKCkpIHsKKyAgICB0X3R5cGUqIGtleV90eXBlID0gKCh0X21hcCopY29udGFpbmVyKS0+Z2V0X2tleV90eXBlKCk7CisgICAgdF90eXBlKiB2YWxfdHlwZSA9ICgodF9tYXAqKWNvbnRhaW5lciktPmdldF92YWxfdHlwZSgpOworCisgICAgaW5kZW50KG91dCkgPDwgImZvciAoamF2YS51dGlsLk1hcC5FbnRyeTwiIDw8IHR5cGVfbmFtZShrZXlfdHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIsICIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX25hbWUodmFsX3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiPiAiIDw8IGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSA8PCAiIDogIgorICAgICAgICAgICAgICAgIDw8IHNvdXJjZV9uYW1lIDw8ICIuZW50cnlTZXQoKSkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIG91dCA8PCBlbmRsOworCisgICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKGtleV90eXBlLCB0cnVlLCBmYWxzZSkgPDwgIiAiIDw8IGl0ZXJhdG9yX2VsZW1lbnRfbmFtZQorICAgICAgICAgICAgICAgIDw8ICJfa2V5ID0gIiA8PCBpdGVyYXRvcl9lbGVtZW50X25hbWUgPDwgIi5nZXRLZXkoKTsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKHZhbF90eXBlLCB0cnVlLCBmYWxzZSkgPDwgIiAiIDw8IGl0ZXJhdG9yX2VsZW1lbnRfbmFtZQorICAgICAgICAgICAgICAgIDw8ICJfdmFsdWUgPSAiIDw8IGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSA8PCAiLmdldFZhbHVlKCk7IiA8PCBlbmRsOworCisgICAgb3V0IDw8IGVuZGw7CisKKyAgICBpZiAoa2V5X3R5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfY29udGFpbmVyKG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3JfZWxlbWVudF9uYW1lICsgIl9rZXkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0X2VsZW1lbnRfbmFtZSArICJfa2V5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X3R5cGUpOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUoa2V5X3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgcmVzdWx0X2VsZW1lbnRfbmFtZSA8PCAiX2tleSA9ICI7CisgICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfbm9uX2NvbnRhaW5lcihvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcl9lbGVtZW50X25hbWUgKyAiX2tleSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRfZWxlbWVudF9uYW1lICsgIl9rZXkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X3R5cGUpOworICAgICAgb3V0IDw8ICI7IiA8PCBlbmRsOworICAgIH0KKworICAgIG91dCA8PCBlbmRsOworCisgICAgaWYgKHZhbF90eXBlLT5pc19jb250YWluZXIoKSkgeworICAgICAgZ2VuZXJhdGVfZGVlcF9jb3B5X2NvbnRhaW5lcihvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSArICJfdmFsdWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0X2VsZW1lbnRfbmFtZSArICJfdmFsdWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxfdHlwZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZSh2YWxfdHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCByZXN1bHRfZWxlbWVudF9uYW1lIDw8ICJfdmFsdWUgPSAiOworICAgICAgZ2VuZXJhdGVfZGVlcF9jb3B5X25vbl9jb250YWluZXIob3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3JfZWxlbWVudF9uYW1lICsgIl92YWx1ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRfZWxlbWVudF9uYW1lICsgIl92YWx1ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxfdHlwZSk7CisgICAgICBvdXQgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorCisgICAgb3V0IDw8IGVuZGw7CisKKyAgICBpbmRlbnQob3V0KSA8PCByZXN1bHRfbmFtZSA8PCAiLnB1dCgiIDw8IHJlc3VsdF9lbGVtZW50X25hbWUgPDwgIl9rZXksICIgPDwgcmVzdWx0X2VsZW1lbnRfbmFtZQorICAgICAgICAgICAgICAgIDw8ICJfdmFsdWUpOyIgPDwgZW5kbDsKKworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgfSBlbHNlIHsKKyAgICB0X3R5cGUqIGVsZW1fdHlwZTsKKworICAgIGlmIChjb250YWluZXItPmlzX3NldCgpKSB7CisgICAgICBlbGVtX3R5cGUgPSAoKHRfc2V0Kiljb250YWluZXIpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGVsZW1fdHlwZSA9ICgodF9saXN0Kiljb250YWluZXIpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfQorCisgICAgaW5kZW50KG91dCkgPDwgImZvciAoIiA8PCB0eXBlX25hbWUoZWxlbV90eXBlLCB0cnVlLCBmYWxzZSkgPDwgIiAiIDw8IGl0ZXJhdG9yX2VsZW1lbnRfbmFtZQorICAgICAgICAgICAgICAgIDw8ICIgOiAiIDw8IHNvdXJjZV9uYW1lIDw8ICIpIHsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGlmIChlbGVtX3R5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgICAvLyByZWN1cnNpdmUgZGVlcCBjb3B5CisgICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfY29udGFpbmVyKG91dCwgaXRlcmF0b3JfZWxlbWVudF9uYW1lLCAiIiwgcmVzdWx0X2VsZW1lbnRfbmFtZSwgZWxlbV90eXBlKTsKKyAgICAgIGluZGVudChvdXQpIDw8IHJlc3VsdF9uYW1lIDw8ICIuYWRkKCIgPDwgcmVzdWx0X2VsZW1lbnRfbmFtZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIGl0ZXJhdGl2ZSBjb3B5CisgICAgICBpZiAoZWxlbV90eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiamF2YS5uaW8uQnl0ZUJ1ZmZlciB0ZW1wX2JpbmFyeV9lbGVtZW50ID0gIjsKKyAgICAgICAgZ2VuZXJhdGVfZGVlcF9jb3B5X25vbl9jb250YWluZXIob3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcl9lbGVtZW50X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZW1wX2JpbmFyeV9lbGVtZW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbV90eXBlKTsKKyAgICAgICAgb3V0IDw8ICI7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnQob3V0KSA8PCByZXN1bHRfbmFtZSA8PCAiLmFkZCh0ZW1wX2JpbmFyeV9lbGVtZW50KTsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbmRlbnQob3V0KSA8PCByZXN1bHRfbmFtZSA8PCAiLmFkZCgiOworICAgICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfbm9uX2NvbnRhaW5lcihvdXQsIGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSwgcmVzdWx0X25hbWUsIGVsZW1fdHlwZSk7CisgICAgICAgIG91dCA8PCAiKTsiIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICB9Cit9CisKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVlcF9jb3B5X25vbl9jb250YWluZXIob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBzb3VyY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZGVzdF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUpIHsKKyAgKHZvaWQpZGVzdF9uYW1lOworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSB8fCB0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgIG91dCA8PCAib3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIuY29weUJpbmFyeSgiIDw8IHNvdXJjZV9uYW1lIDw8ICIpIjsKKyAgICB9IGVsc2UgeworICAgICAgLy8gZXZlcnl0aGluZyBlbHNlIGNhbiBiZSBjb3BpZWQgZGlyZWN0bHkKKyAgICAgIG91dCA8PCBzb3VyY2VfbmFtZTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgb3V0IDw8ICJuZXcgIiA8PCB0eXBlX25hbWUodHlwZSwgdHJ1ZSwgdHJ1ZSkgPDwgIigiIDw8IHNvdXJjZV9uYW1lIDw8ICIpIjsKKyAgfQorfQorCitzdGQ6OnN0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9pc3NldF9jaGVjayh0X2ZpZWxkKiBmaWVsZCkgeworICByZXR1cm4gZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQtPmdldF9uYW1lKCkpOworfQorCitzdGQ6OnN0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjppc3NldF9maWVsZF9pZCh0X2ZpZWxkKiBmaWVsZCkgeworICByZXR1cm4gIl9fIiArIHVwY2FzZV9zdHJpbmcoZmllbGQtPmdldF9uYW1lKCkgKyAiX2lzc2V0X2lkIik7Cit9CisKK3N0ZDo6c3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2lzc2V0X2NoZWNrKHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUpIHsKKyAgcmV0dXJuICJpcyIgKyBnZXRfY2FwX25hbWUoInNldCIpICsgZ2V0X2NhcF9uYW1lKGZpZWxkX25hbWUpICsgIigpIjsKK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9pc3NldF9zZXQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiBmaWVsZCwgc3RyaW5nIHByZWZpeCkgeworICBpZiAoIXR5cGVfY2FuX2JlX251bGwoZmllbGQtPmdldF90eXBlKCkpKSB7CisgICAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICJzZXQiIDw8IGdldF9jYXBfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgZ2V0X2NhcF9uYW1lKCJpc1NldCIpCisgICAgICAgICAgICAgICAgPDwgIih0cnVlKTsiIDw8IGVuZGw7CisgIH0KK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3RfZGVzYyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGluZGVudChvdXQpIDw8ICJwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU3RydWN0IFNUUlVDVF9ERVNDID0gbmV3ICIKKyAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTdHJ1Y3QoXCIiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIlwiKTsiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZmllbGRfZGVzY3Mob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkICIKKyAgICAgICAgICAgICAgICA8PCBjb25zdGFudF9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkKKyAgICAgICAgICAgICAgICA8PCAiX0ZJRUxEX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkKFwiIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICA8PCAiXCIsICIgPDwgdHlwZV90b19lbnVtKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiwgIgorICAgICAgICAgICAgICAgIDw8ICIoc2hvcnQpIiA8PCAoKm1faXRlciktPmdldF9rZXkoKSA8PCAiKTsiIDw8IGVuZGw7CisgIH0KK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zY2hlbWVfbWFwKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZS5TY2hlbWVGYWN0b3J5IFNUQU5EQVJEX1NDSEVNRV9GQUNUT1JZID0gbmV3ICIKKyAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIlN0YW5kYXJkU2NoZW1lRmFjdG9yeSgpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZS5TY2hlbWVGYWN0b3J5IFRVUExFX1NDSEVNRV9GQUNUT1JZID0gbmV3ICIKKyAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIlR1cGxlU2NoZW1lRmFjdG9yeSgpOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9maWVsZF9uYW1lX2NvbnN0YW50cyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGluZGVudChvdXQpIDw8ICIvKiogVGhlIHNldCBvZiBmaWVsZHMgdGhpcyBzdHJ1Y3QgY29udGFpbnMsIGFsb25nIHdpdGggY29udmVuaWVuY2UgbWV0aG9kcyBmb3IgIgorICAgICAgICAgICAgICAgICAiZmluZGluZyBhbmQgbWFuaXB1bGF0aW5nIHRoZW0uICovIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicHVibGljIGVudW0gX0ZpZWxkcyBpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LlRGaWVsZElkRW51bSB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIGlmICghZmlyc3QpIHsKKyAgICAgIG91dCA8PCAiLCIgPDwgZW5kbDsKKyAgICB9CisgICAgZmlyc3QgPSBmYWxzZTsKKyAgICBnZW5lcmF0ZV9qYXZhX2RvYyhvdXQsICptX2l0ZXIpOworICAgIGluZGVudChvdXQpIDw8IGNvbnN0YW50X25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKChzaG9ydCkiIDw8ICgqbV9pdGVyKS0+Z2V0X2tleSgpCisgICAgICAgICAgICAgICAgPDwgIiwgXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIpIjsKKyAgfQorCisgIG91dCA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChvdXQpCisgICAgICA8PCAicHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS51dGlsLk1hcDxqYXZhLmxhbmcuU3RyaW5nLCBfRmllbGRzPiBieU5hbWUgPSBuZXcgamF2YS51dGlsLkhhc2hNYXA8amF2YS5sYW5nLlN0cmluZywgX0ZpZWxkcz4oKTsiCisgICAgICA8PCBlbmRsOworICBvdXQgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAic3RhdGljIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIGZvciAoX0ZpZWxkcyBmaWVsZCA6IGphdmEudXRpbC5FbnVtU2V0LmFsbE9mKF9GaWVsZHMuY2xhc3MpKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICAgIGJ5TmFtZS5wdXQoZmllbGQuZ2V0RmllbGROYW1lKCksIGZpZWxkKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIH0iIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgIi8qKiIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAqIEZpbmQgdGhlIF9GaWVsZHMgY29uc3RhbnQgdGhhdCBtYXRjaGVzIGZpZWxkSWQsIG9yIG51bGwgaWYgaXRzIG5vdCBmb3VuZC4iCisgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgKi8iIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8IGphdmFfbnVsbGFibGVfYW5ub3RhdGlvbigpIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgc3RhdGljIF9GaWVsZHMgZmluZEJ5VGhyaWZ0SWQoaW50IGZpZWxkSWQpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAic3dpdGNoKGZpZWxkSWQpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8ICgqbV9pdGVyKS0+Z2V0X2tleSgpIDw8ICI6IC8vICIKKyAgICAgICAgICAgICAgICA8PCBjb25zdGFudF9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gIiA8PCBjb25zdGFudF9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIjsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBudWxsOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICIvKioiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgKiBGaW5kIHRoZSBfRmllbGRzIGNvbnN0YW50IHRoYXQgbWF0Y2hlcyBmaWVsZElkLCB0aHJvd2luZyBhbiBleGNlcHRpb24iIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgKiBpZiBpdCBpcyBub3QgZm91bmQuIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICovIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicHVibGljIHN0YXRpYyBfRmllbGRzIGZpbmRCeVRocmlmdElkT3JUaHJvdyhpbnQgZmllbGRJZCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgX0ZpZWxkcyBmaWVsZHMgPSBmaW5kQnlUaHJpZnRJZChmaWVsZElkKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIGlmIChmaWVsZHMgPT0gbnVsbCkgdGhyb3cgbmV3IGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oXCJGaWVsZCBcIiArIGZpZWxkSWQgKyAiCisgICAgICAgICAgICAgICAgICJcIiBkb2Vzbid0IGV4aXN0IVwiKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBmaWVsZHM7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICIvKioiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgKiBGaW5kIHRoZSBfRmllbGRzIGNvbnN0YW50IHRoYXQgbWF0Y2hlcyBuYW1lLCBvciBudWxsIGlmIGl0cyBub3QgZm91bmQuIgorICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICovIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCBqYXZhX251bGxhYmxlX2Fubm90YXRpb24oKSA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicHVibGljIHN0YXRpYyBfRmllbGRzIGZpbmRCeU5hbWUoamF2YS5sYW5nLlN0cmluZyBuYW1lKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gYnlOYW1lLmdldChuYW1lKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgZmluYWwgc2hvcnQgX3RocmlmdElkOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgZmluYWwgamF2YS5sYW5nLlN0cmluZyBfZmllbGROYW1lOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJfRmllbGRzKHNob3J0IHRocmlmdElkLCBqYXZhLmxhbmcuU3RyaW5nIGZpZWxkTmFtZSkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgX3RocmlmdElkID0gdGhyaWZ0SWQ7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICBfZmllbGROYW1lID0gZmllbGROYW1lOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAicHVibGljIHNob3J0IGdldFRocmlmdEZpZWxkSWQoKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gX3RocmlmdElkOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAicHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0RmllbGROYW1lKCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIF9maWVsZE5hbWU7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworCisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworfQorCit0X2phdmFfZ2VuZXJhdG9yOjppc3NldF90eXBlIHRfamF2YV9nZW5lcmF0b3I6Om5lZWRzX2lzc2V0KHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogb3V0UHJpbWl0aXZlVHlwZSkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGludCBjb3VudCA9IDA7CisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBpZiAoIXR5cGVfY2FuX2JlX251bGwoZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpKSkgeworICAgICAgY291bnQrKzsKKyAgICB9CisgIH0KKyAgaWYgKGNvdW50ID09IDApIHsKKyAgICByZXR1cm4gSVNTRVRfTk9ORTsKKyAgfSBlbHNlIGlmIChjb3VudCA8PSA2NCkgeworICAgIGlmIChvdXRQcmltaXRpdmVUeXBlICE9IE5VTEwpIHsKKyAgICAgIGlmIChjb3VudCA8PSA4KQorICAgICAgICAqb3V0UHJpbWl0aXZlVHlwZSA9ICJieXRlIjsKKyAgICAgIGVsc2UgaWYgKGNvdW50IDw9IDE2KQorICAgICAgICAqb3V0UHJpbWl0aXZlVHlwZSA9ICJzaG9ydCI7CisgICAgICBlbHNlIGlmIChjb3VudCA8PSAzMikKKyAgICAgICAgKm91dFByaW1pdGl2ZVR5cGUgPSAiaW50IjsKKyAgICAgIGVsc2UgaWYgKGNvdW50IDw9IDY0KQorICAgICAgICAqb3V0UHJpbWl0aXZlVHlwZSA9ICJsb25nIjsKKyAgICB9CisgICAgcmV0dXJuIElTU0VUX1BSSU1JVElWRTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gSVNTRVRfQklUU0VUOworICB9Cit9CisKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfY2xlYXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGlmICghamF2YTVfKSB7CisgICAgaW5kZW50KG91dCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZvaWQgY2xlYXIoKSB7IiA8PCBlbmRsOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgaW5kZW50X3VwKCk7CisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICptX2l0ZXI7CisgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZShmaWVsZC0+Z2V0X3R5cGUoKSk7CisKKyAgICBpZiAoZmllbGQtPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKKyAgICAgIHByaW50X2NvbnN0X3ZhbHVlKG91dCwgInRoaXMuIiArIGZpZWxkLT5nZXRfbmFtZSgpLCB0LCBmaWVsZC0+Z2V0X3ZhbHVlKCksIHRydWUsIHRydWUpOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgaWYgKHR5cGVfY2FuX2JlX251bGwodCkpIHsKKworICAgICAgaWYgKHJldXNlX29iamVjdHNfICYmICh0LT5pc19jb250YWluZXIoKSB8fCB0LT5pc19zdHJ1Y3QoKSkpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgImlmICh0aGlzLiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiAhPSBudWxsKSB7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiLmNsZWFyKCk7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICAgICAgfSBlbHNlIHsKKworICAgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgPSBudWxsOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIC8vIG11c3QgYmUgYSBiYXNlIHR5cGUKKyAgICAvLyBtZWFucyBpdCBhbHNvIG5lZWRzIHRvIGJlIGV4cGxpY2l0bHkgdW5zZXQKKyAgICBpbmRlbnQob3V0KSA8PCAic2V0IiA8PCBnZXRfY2FwX25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8IGdldF9jYXBfbmFtZSgiaXNTZXQiKSA8PCAiKGZhbHNlKTsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB0X2Jhc2VfdHlwZSogYmFzZV90eXBlID0gKHRfYmFzZV90eXBlKil0OworCisgICAgc3dpdGNoIChiYXNlX3R5cGUtPmdldF9iYXNlKCkpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiID0gMDsiIDw8IGVuZGw7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiA9IDAuMDsiIDw8IGVuZGw7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgPSBmYWxzZTsiIDw8IGVuZGw7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgInVuc3VwcG9ydGVkIHR5cGU6ICIgKyBiYXNlX3R5cGUtPmdldF9uYW1lKCkgKyAiIGZvciBmaWVsZCAiICsgZmllbGQtPmdldF9uYW1lKCk7CisgICAgfQorICB9CisgIGluZGVudF9kb3duKCk7CisKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLy8gZ2VuZXJhdGVzIGphdmEgbWV0aG9kIHRvIHNlcmlhbGl6ZSAoaW4gdGhlIEphdmEgc2Vuc2UpIHRoZSBvYmplY3QKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3Rfd3JpdGVfb2JqZWN0KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgKHZvaWQpdHN0cnVjdDsKKyAgaW5kZW50KG91dCkKKyAgICAgIDw8ICJwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7IgorICAgICAgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgdHJ5IHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgICAgd3JpdGUobmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRDb21wYWN0UHJvdG9jb2wobmV3ICIKKyAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5USU9TdHJlYW1UcmFuc3BvcnQob3V0KSkpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgfSBjYXRjaCAob3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB0ZSkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgICB0aHJvdyBuZXcgamF2YS5pby5JT0V4Y2VwdGlvbih0ZSIgPDwgKGFuZHJvaWRfbGVnYWN5XyA/ICIuZ2V0TWVzc2FnZSgpIiA6ICIiKQorICAgICAgICAgICAgICA8PCAiKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIH0iIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8vIGdlbmVyYXRlcyBqYXZhIG1ldGhvZCB0byBzZXJpYWxpemUgKGluIHRoZSBKYXZhIHNlbnNlKSB0aGUgb2JqZWN0Cit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X3JlYWRfb2JqZWN0KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgdm9pZCByZWFkT2JqZWN0KGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0gaW4pIHRocm93cyAiCisgICAgICAgICAgICAgICAgICJqYXZhLmlvLklPRXhjZXB0aW9uLCBqYXZhLmxhbmcuQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICB0cnkgeyIgPDwgZW5kbDsKKyAgaWYgKCF0c3RydWN0LT5pc191bmlvbigpKSB7CisgICAgc3dpdGNoIChuZWVkc19pc3NldCh0c3RydWN0KSkgeworICAgIGNhc2UgSVNTRVRfTk9ORToKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSVNTRVRfUFJJTUlUSVZFOgorICAgICAgaW5kZW50KG91dCkgPDwgIiAgICAvLyBpdCBkb2Vzbid0IHNlZW0gbGlrZSB5b3Ugc2hvdWxkIGhhdmUgdG8gZG8gdGhpcywgYnV0IGphdmEgIgorICAgICAgICAgICAgICAgICAgICAgInNlcmlhbGl6YXRpb24gaXMgd2Fja3ksIGFuZCBkb2Vzbid0IGNhbGwgdGhlIGRlZmF1bHQgY29uc3RydWN0b3IuIiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIiAgICBfX2lzc2V0X2JpdGZpZWxkID0gMDsiIDw8IGVuZGw7CisgICAgICBicmVhazsKKyAgICBjYXNlIElTU0VUX0JJVFNFVDoKKyAgICAgIGluZGVudChvdXQpIDw8ICIgICAgLy8gaXQgZG9lc24ndCBzZWVtIGxpa2UgeW91IHNob3VsZCBoYXZlIHRvIGRvIHRoaXMsIGJ1dCBqYXZhICIKKyAgICAgICAgICAgICAgICAgICAgICJzZXJpYWxpemF0aW9uIGlzIHdhY2t5LCBhbmQgZG9lc24ndCBjYWxsIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yLiIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgICAgX19pc3NldF9iaXRfdmVjdG9yID0gbmV3IGphdmEudXRpbC5CaXRTZXQoMSk7IiA8PCBlbmRsOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGluZGVudChvdXQpIDw8ICIgICAgcmVhZChuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbChuZXcgIgorICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRJT1N0cmVhbVRyYW5zcG9ydChpbikpKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIH0gY2F0Y2ggKG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24gdGUpIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgICAgdGhyb3cgbmV3IGphdmEuaW8uSU9FeGNlcHRpb24odGUiIDw8IChhbmRyb2lkX2xlZ2FjeV8gPyAiLmdldE1lc3NhZ2UoKSIgOiAiIikKKyAgICAgICAgICAgICAgPDwgIik7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICB9IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0YW5kYXJkX3JlYWRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIHZvaWQgcmVhZChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgaXByb3QsICIKKyAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiBzdHJ1Y3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAvLyBEZWNsYXJlIHN0YWNrIHRtcCB2YXJpYWJsZXMgYW5kIHJlYWQgc3RydWN0IGhlYWRlcgorICBvdXQgPDwgaW5kZW50KCkgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCBzY2hlbWVGaWVsZDsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJpcHJvdC5yZWFkU3RydWN0QmVnaW4oKTsiIDw8IGVuZGw7CisKKyAgLy8gTG9vcCBvdmVyIHJlYWRpbmcgaW4gZmllbGRzCisgIGluZGVudChvdXQpIDw8ICJ3aGlsZSAodHJ1ZSkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgLy8gUmVhZCBiZWdpbm5pbmcgZmllbGQgbWFya2VyCisgIGluZGVudChvdXQpIDw8ICJzY2hlbWVGaWVsZCA9IGlwcm90LnJlYWRGaWVsZEJlZ2luKCk7IiA8PCBlbmRsOworCisgIC8vIENoZWNrIGZvciBmaWVsZCBTVE9QIG1hcmtlciBhbmQgYnJlYWsKKyAgaW5kZW50KG91dCkgPDwgImlmIChzY2hlbWVGaWVsZC50eXBlID09IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUT1ApIHsgIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgLy8gU3dpdGNoIHN0YXRlbWVudCBvbiB0aGUgZmllbGQgd2UgYXJlIHJlYWRpbmcKKyAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoc2NoZW1lRmllbGQuaWQpIHsiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gR2VuZXJhdGUgZGVzZXJpYWxpemF0aW9uIGNvZGUgZm9yIGtub3duIGNhc2VzCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOiAvLyAiCisgICAgICAgICAgICAgICAgPDwgY29uc3RhbnRfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgImlmIChzY2hlbWVGaWVsZC50eXBlID09ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIikgeyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAic3RydWN0LiIsIHRydWUpOworICAgIGluZGVudChvdXQpIDw8ICJzdHJ1Y3QuIgorICAgICAgICAgICAgICAgIDw8ICJzZXQiIDw8IGdldF9jYXBfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8IGdldF9jYXBfbmFtZSgiaXNTZXQiKQorICAgICAgICAgICAgICAgIDw8ICIodHJ1ZSk7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyAiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgIiAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBzY2hlbWVGaWVsZC50eXBlKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIHNjaGVtZUZpZWxkLnR5cGUpOyIKKyAgICAgICAgICAgICAgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICAvLyBSZWFkIGZpZWxkIGVuZCBtYXJrZXIKKyAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRGaWVsZEVuZCgpOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgImlwcm90LnJlYWRTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7CisKKyAgLy8gaW4gbm9uLWJlYW5zIHN0eWxlLCBjaGVjayBmb3IgcmVxdWlyZWQgZmllbGRzIG9mIHByaW1pdGl2ZSB0eXBlCisgIC8vICh3aGljaCBjYW4gYmUgY2hlY2tlZCBoZXJlIGJ1dCBub3QgaW4gdGhlIGdlbmVyYWwgdmFsaWRhdGUgbWV0aG9kKQorICBpZiAoIWJlYW5fc3R5bGVfKSB7CisgICAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIi8vIGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMgb2YgcHJpbWl0aXZlIHR5cGUsIHdoaWNoIGNhbid0IGJlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2hlY2tlZCBpbiB0aGUgdmFsaWRhdGUgbWV0aG9kIiA8PCBlbmRsOworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCAmJiAhdHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpKSB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCFzdHJ1Y3QuIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygqZl9pdGVyKSA8PCAiKSB7IiA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKQorICAgICAgICAgICAgPDwgIiAgdGhyb3cgbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbEV4Y2VwdGlvbihcIlJlcXVpcmVkIGZpZWxkICciCisgICAgICAgICAgICA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgIDw8ICInIHdhcyBub3QgZm91bmQgaW4gc2VyaWFsaXplZCBkYXRhISBTdHJ1Y3Q6IFwiICsgdG9TdHJpbmcoKSk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICA8PCAifSIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBwZXJmb3JtcyB2YXJpb3VzIGNoZWNrcyAoZS5nLiBjaGVjayB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHNldCkKKyAgaW5kZW50KG91dCkgPDwgInN0cnVjdC52YWxpZGF0ZSgpOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RhbmRhcmRfd3JpdGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfcmVzdWx0KSB7CisgIGluZGVudF91cCgpOworICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyB2b2lkIHdyaXRlKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBvcHJvdCwgIgorICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIHN0cnVjdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgLy8gcGVyZm9ybXMgdmFyaW91cyBjaGVja3MgKGUuZy4gY2hlY2sgdGhhdCBhbGwgcmVxdWlyZWQgZmllbGRzIGFyZSBzZXQpCisgIGluZGVudChvdXQpIDw8ICJzdHJ1Y3QudmFsaWRhdGUoKTsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbihTVFJVQ1RfREVTQyk7IiA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgYm9vbCBudWxsX2FsbG93ZWQgPSB0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgaWYgKG51bGxfYWxsb3dlZCkgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoc3RydWN0LiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKyAgICBib29sIG9wdGlvbmFsID0gKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHx8IChpc19yZXN1bHQgJiYgIW51bGxfYWxsb3dlZCk7CisgICAgaWYgKG9wdGlvbmFsKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIKKyAgICAgICAgICAgICAgICAgIDw8ICJzdHJ1Y3QuIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygoKmZfaXRlcikpIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICB9CisKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVGaWVsZEJlZ2luKCIgPDwgY29uc3RhbnRfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpCisgICAgICAgICAgICAgICAgPDwgIl9GSUVMRF9ERVNDKTsiIDw8IGVuZGw7CisKKyAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJzdHJ1Y3QuIiwgdHJ1ZSk7CisKKyAgICAvLyBXcml0ZSBmaWVsZCBjbG9zZXIKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVGaWVsZEVuZCgpOyIgPDwgZW5kbDsKKworICAgIGlmIChvcHRpb25hbCkgeworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgICBpZiAobnVsbF9hbGxvd2VkKSB7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICB9CisgIC8vIFdyaXRlIHRoZSBzdHJ1Y3QgbWFwCisgIG91dCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVGaWVsZFN0b3AoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlU3RydWN0RW5kKCk7IgorICAgICAgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF9zdGFuZGFyZF9zY2hlbWUob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCkgeworICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBzdGF0aWMgY2xhc3MgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgIDw8ICJTdGFuZGFyZFNjaGVtZUZhY3RvcnkgaW1wbGVtZW50cyBvcmcuYXBhY2hlLnRocmlmdC5zY2hlbWUuU2NoZW1lRmFjdG9yeSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIlN0YW5kYXJkU2NoZW1lIGdldFNjaGVtZSgpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIG5ldyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIlN0YW5kYXJkU2NoZW1lKCk7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgInByaXZhdGUgc3RhdGljIGNsYXNzICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKQorICAgICAgPDwgIlN0YW5kYXJkU2NoZW1lIGV4dGVuZHMgb3JnLmFwYWNoZS50aHJpZnQuc2NoZW1lLlN0YW5kYXJkU2NoZW1lPCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiPiB7IiA8PCBlbmRsIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBnZW5lcmF0ZV9zdGFuZGFyZF9yZWFkZXIob3V0LCB0c3RydWN0KTsKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGVuZGw7CisgIGdlbmVyYXRlX3N0YW5kYXJkX3dyaXRlcihvdXQsIHRzdHJ1Y3QsIGlzX3Jlc3VsdCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfdHVwbGVfcmVhZGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyB2b2lkIHJlYWQob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIHByb3QsICIKKyAgICAgICAgICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIHN0cnVjdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHVwbGVQcm90b2NvbCBpcHJvdCA9IChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHVwbGVQcm90b2NvbCkgcHJvdDsiIDw8IGVuZGw7CisgIGludCBvcHRpb25hbF9jb3VudCA9IDA7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTAorICAgICAgICB8fCAoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVF9JTl9SRVFfT1VUKSB7CisgICAgICBvcHRpb25hbF9jb3VudCsrOworICAgIH0KKyAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAoKmZfaXRlciksICJzdHJ1Y3QuIiwgZmFsc2UpOworICAgICAgaW5kZW50KG91dCkgPDwgInN0cnVjdC5zZXQiIDw8IGdldF9jYXBfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8IGdldF9jYXBfbmFtZSgiaXNTZXQiKQorICAgICAgICAgICAgICAgICAgPDwgIih0cnVlKTsiIDw8IGVuZGw7CisgICAgfQorICB9CisgIGlmIChvcHRpb25hbF9jb3VudCA+IDApIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiamF2YS51dGlsLkJpdFNldCBpbmNvbWluZyA9IGlwcm90LnJlYWRCaXRTZXQoIiA8PCBvcHRpb25hbF9jb3VudCA8PCAiKTsiIDw8IGVuZGw7CisgICAgaW50IGkgPSAwOworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTAorICAgICAgICAgIHx8ICgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUX0lOX1JFUV9PVVQpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgImlmIChpbmNvbWluZy5nZXQoIiA8PCBpIDw8ICIpKSB7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAoKmZfaXRlciksICJzdHJ1Y3QuIiwgZmFsc2UpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAic3RydWN0LnNldCIgPDwgZ2V0X2NhcF9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgZ2V0X2NhcF9uYW1lKCJpc1NldCIpCisgICAgICAgICAgICAgICAgICAgIDw8ICIodHJ1ZSk7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgaSsrOworICAgICAgfQorICAgIH0KKyAgfQorICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF90dXBsZV93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpbmRlbnQob3V0KSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZvaWQgd3JpdGUob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIHByb3QsICIKKyAgICAgICAgICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIHN0cnVjdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHVwbGVQcm90b2NvbCBvcHJvdCA9IChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHVwbGVQcm90b2NvbCkgcHJvdDsiIDw8IGVuZGw7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBib29sIGhhc19vcHRpb25hbCA9IGZhbHNlOworICBpbnQgb3B0aW9uYWxfY291bnQgPSAwOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMCisgICAgICAgIHx8ICgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUX0lOX1JFUV9PVVQpIHsKKyAgICAgIG9wdGlvbmFsX2NvdW50Kys7CisgICAgICBoYXNfb3B0aW9uYWwgPSB0cnVlOworICAgIH0KKyAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKCpmX2l0ZXIpLCAic3RydWN0LiIsIGZhbHNlKTsKKyAgICB9CisgIH0KKyAgaWYgKGhhc19vcHRpb25hbCkgeworICAgIGluZGVudChvdXQpIDw8ICJqYXZhLnV0aWwuQml0U2V0IG9wdGlvbmFscyA9IG5ldyBqYXZhLnV0aWwuQml0U2V0KCk7IiA8PCBlbmRsOworICAgIGludCBpID0gMDsKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwKKyAgICAgICAgICB8fCAoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVF9JTl9SRVFfT1VUKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoc3RydWN0LiIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKCpmX2l0ZXIpKSA8PCAiKSB7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIm9wdGlvbmFscy5zZXQoIiA8PCBpIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgIGkrKzsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVCaXRTZXQob3B0aW9uYWxzLCAiIDw8IG9wdGlvbmFsX2NvdW50IDw8ICIpOyIgPDwgZW5kbDsKKyAgICBpbnQgaiA9IDA7CisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMCisgICAgICAgICAgfHwgKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVCkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKHN0cnVjdC4iIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKCpmX2l0ZXIpIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAoKmZfaXRlciksICJzdHJ1Y3QuIiwgZmFsc2UpOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgaisrOworICAgICAgfQorICAgIH0KKyAgfQorICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF90dXBsZV9zY2hlbWUob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBzdGF0aWMgY2xhc3MgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgIDw8ICJUdXBsZVNjaGVtZUZhY3RvcnkgaW1wbGVtZW50cyBvcmcuYXBhY2hlLnRocmlmdC5zY2hlbWUuU2NoZW1lRmFjdG9yeSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIlR1cGxlU2NoZW1lIGdldFNjaGVtZSgpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIG5ldyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIlR1cGxlU2NoZW1lKCk7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJwcml2YXRlIHN0YXRpYyBjbGFzcyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkKKyAgICAgIDw8ICJUdXBsZVNjaGVtZSBleHRlbmRzIG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZS5UdXBsZVNjaGVtZTwiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIj4geyIgPDwgZW5kbCA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfdHVwbGVfd3JpdGVyKG91dCwgdHN0cnVjdCk7CisgIG91dCA8PCBlbmRsOworICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF90dXBsZV9yZWFkZXIob3V0LCB0c3RydWN0KTsKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zY2hlbWVfbG9va3VwKG9zdHJlYW0mIG91dCkgeworICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBzdGF0aWMgPFMgZXh0ZW5kcyBvcmcuYXBhY2hlLnRocmlmdC5zY2hlbWUuSVNjaGVtZT4gUyBzY2hlbWUoIgorICAgICAgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBwcm90bykgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gKG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZS5TdGFuZGFyZFNjaGVtZS5jbGFzcy5lcXVhbHMocHJvdG8uZ2V0U2NoZW1lKCkpICIKKyAgICAgIDw8ICI/IFNUQU5EQVJEX1NDSEVNRV9GQUNUT1JZICIKKyAgICAgIDw8ICI6IFRVUExFX1NDSEVNRV9GQUNUT1JZIgorICAgICAgPDwgIikuZ2V0U2NoZW1lKCk7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZheF9nZW5lcmF0ZWRfYW5ub3RhdGlvbihvc3RyZWFtJiBvdXQpIHsKKyAgdGltZV90IHNlY29uZHMgPSB0aW1lKE5VTEwpOworICBzdHJ1Y3QgdG0qIG5vdyA9IGxvY2FsdGltZSgmc2Vjb25kcyk7CisgIGluZGVudChvdXQpIDw8ICJAamF2YXguYW5ub3RhdGlvbi5HZW5lcmF0ZWQodmFsdWUgPSBcIiIgPDwgYXV0b2dlbl9zdW1tYXJ5KCkgPDwgIlwiIjsKKyAgaWYgKHVuZGF0ZWRfZ2VuZXJhdGVkX2Fubm90YXRpb25zXykgeworICAgIG91dCA8PCAiKSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiLCBkYXRlID0gXCIiIDw8IChub3ctPnRtX3llYXIgKyAxOTAwKSA8PCAiLSIgPDwgc2V0ZmlsbCgnMCcpIDw8IHNldHcoMikKKyAgICAgICAgICAgICAgICA8PCAobm93LT50bV9tb24gKyAxKSA8PCAiLSIgPDwgc2V0ZmlsbCgnMCcpIDw8IHNldHcoMikgPDwgbm93LT50bV9tZGF5CisgICAgICAgICAgICAgICAgPDwgIlwiKSIgPDwgZW5kbDsKKyAgfQorfQorCitUSFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKAorICAgIGphdmEsCisgICAgIkphdmEiLAorICAgICIgICAgYmVhbnM6ICAgICAgICAgICBNZW1iZXJzIHdpbGwgYmUgcHJpdmF0ZSwgYW5kIHNldHRlciBtZXRob2RzIHdpbGwgcmV0dXJuIHZvaWQuXG4iCisgICAgIiAgICBwcml2YXRlLW1lbWJlcnM6IE1lbWJlcnMgd2lsbCBiZSBwcml2YXRlLCBidXQgc2V0dGVyIG1ldGhvZHMgd2lsbCByZXR1cm4gJ3RoaXMnIGxpa2UgIgorICAgICJ1c3VhbC5cbiIKKyAgICAiICAgIG5vY2FtZWw6ICAgICAgICAgRG8gbm90IHVzZSBDYW1lbENhc2UgZmllbGQgYWNjZXNzb3JzIHdpdGggYmVhbnMuXG4iCisgICAgIiAgICBmdWxsY2FtZWw6ICAgICAgIENvbnZlcnQgdW5kZXJzY29yZWRfYWNjZXNzb3Jfb3Jfc2VydmljZV9uYW1lcyB0byBjYW1lbENhc2UuXG4iCisgICAgIiAgICBhbmRyb2lkOiAgICAgICAgIEdlbmVyYXRlZCBzdHJ1Y3R1cmVzIGFyZSBQYXJjZWxhYmxlLlxuIgorICAgICIgICAgYW5kcm9pZF9sZWdhY3k6ICBEbyBub3QgdXNlIGphdmEuaW8uSU9FeGNlcHRpb24odGhyb3dhYmxlKSAoYXZhaWxhYmxlIGZvciBBbmRyb2lkIDIuMyBhbmQgIgorICAgICJhYm92ZSkuXG4iCisgICAgIiAgICBvcHRpb25fdHlwZTogICAgIFdyYXAgb3B0aW9uYWwgZmllbGRzIGluIGFuIE9wdGlvbiB0eXBlLlxuIgorICAgICIgICAgcmV0aHJvd191bmhhbmRsZWRfZXhjZXB0aW9uczpcbiIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgRW5hYmxlIHJldGhyb3cgb2YgdW5oYW5kbGVkIGV4Y2VwdGlvbnMgYW5kIGxldCB0aGVtIHByb3BhZ2F0ZSBmdXRoZXIuIgorICAgICIgKERlZmF1bHQgYmVoYXZpb3IgaXMgdG8gY2F0Y2ggYW5kIGxvZyBpdC4pXG4iCisgICAgIiAgICBqYXZhNTogICAgICAgICAgIEdlbmVyYXRlIEphdmEgMS41IGNvbXBsaWFudCBjb2RlIChpbmNsdWRlcyBhbmRyb2lkX2xlZ2FjeSBmbGFnKS5cbiIKKyAgICAiICAgIHJldXNlLW9iamVjdHM6ICAgRGF0YSBvYmplY3RzIHdpbGwgbm90IGJlIGFsbG9jYXRlZCwgYnV0IGV4aXN0aW5nIGluc3RhbmNlcyB3aWxsIGJlIHVzZWQgIgorICAgICIocmVhZCBhbmQgd3JpdGUpLlxuIgorICAgICIgICAgc29ydGVkX2NvbnRhaW5lcnM6XG4iCisgICAgIiAgICAgICAgICAgICAgICAgICAgIFVzZSBUcmVlU2V0L1RyZWVNYXAgaW5zdGVhZCBvZiBIYXNoU2V0L0hhc2hNYXAgYXMgYSBpbXBsZW1lbnRhdGlvbiBvZiAiCisgICAgInNldC9tYXAuXG4iCisgICAgIiAgICBnZW5lcmF0ZWRfYW5ub3RhdGlvbnM9W3VuZGF0ZWR8c3VwcHJlc3NdOlxuIgorICAgICIgICAgICAgICAgICAgICAgICAgICB1bmRhdGVkOiBzdXBwcmVzcyB0aGUgZGF0ZSBhdCBAR2VuZXJhdGVkIGFubm90YXRpb25zXG4iCisgICAgIiAgICAgICAgICAgICAgICAgICAgIHN1cHByZXNzOiBzdXBwcmVzcyBAR2VuZXJhdGVkIGFubm90YXRpb25zIGVudGlyZWx5XG4iCisgICAgIiAgICB1bnNhZmVfYmluYXJpZXM6IERvIG5vdCBjb3B5IEJ5dGVCdWZmZXJzIGluIGNvbnN0cnVjdG9ycywgZ2V0dGVycywgYW5kIHNldHRlcnMuXG4iKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9qYXZhbWVfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9qYXZhbWVfZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhNzQzY2EKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2phdmFtZV9nZW5lcmF0b3IuY2MKQEAgLTAsMCArMSwzMjk2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxjY3R5cGU+CisKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKworI2luY2x1ZGUgInRocmlmdC9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaCIKKwordXNpbmcgc3RkOjptYXA7Cit1c2luZyBzdGQ6Om9zdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjp2ZWN0b3I7CisKK3N0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKKworLyoqCisgKiBKYXZhIGNvZGUgZ2VuZXJhdG9yLgorICoKKyAqLworY2xhc3MgdF9qYXZhbWVfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7CitwdWJsaWM6CisgIHRfamF2YW1lX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQorICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pIHsKKyAgICAodm9pZClwYXJzZWRfb3B0aW9uczsKKyAgICAodm9pZClvcHRpb25fc3RyaW5nOworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7CisKKyAgICAvKiBubyBvcHRpb25zIHlldCAqLworICAgIGZvciggaXRlciA9IHBhcnNlZF9vcHRpb25zLmJlZ2luKCk7IGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCk7ICsraXRlcikgeworICAgICAgdGhyb3cgInVua25vd24gb3B0aW9uIGphdmFtZToiICsgaXRlci0+Zmlyc3Q7CisgICAgfQorCisgICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tamF2YW1lIjsKKyAgfQorCisgIC8qKgorICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCisgICAqLworCisgIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKKyAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKKworICB2b2lkIGdlbmVyYXRlX2NvbnN0cyhzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKTsKKworICAvKioKKyAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZik7CisgIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3VuaW9uKHRfc3RydWN0KiB0dW5pb24pOworICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisKKyAgdm9pZCBwcmludF9jb25zdF92YWx1ZShzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX3N0YXRpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlZnZhbCA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKKworICAvKioKKyAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7CisKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9kZWZpbml0aW9uKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2NsYXNzID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCA9IGZhbHNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9lcXVhbGl0eShzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X2NvbXBhcmVfdG8oc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9yZWFkZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3ZhbGlkYXRvcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X3Jlc3VsdF93cml0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF93cml0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF90b3N0cmluZyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X2NsZWFyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUpOworICBzdGQ6OnN0cmluZyBnZXRfamF2YV90eXBlX3N0cmluZyh0X3R5cGUqIHR5cGUpOworICB2b2lkIGdlbmVyYXRlX3JlZmxlY3Rpb25fc2V0dGVycyhzdGQ6Om9zdHJpbmdzdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSk7CisgIHZvaWQgZ2VuZXJhdGVfcmVmbGVjdGlvbl9nZXR0ZXJzKHN0ZDo6b3N0cmluZ3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNhcF9uYW1lKTsKKyAgdm9pZCBnZW5lcmF0ZV9nZW5lcmljX2ZpZWxkX2dldHRlcnNfc2V0dGVycyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2phdmFfYmVhbl9ib2lsZXJwbGF0ZShzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIHZvaWQgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICBzdGQ6OnN0cmluZyBnZXRfY2FwX25hbWUoc3RkOjpzdHJpbmcgbmFtZSk7CisgIHN0ZDo6c3RyaW5nIGdlbmVyYXRlX2lzc2V0X2NoZWNrKHRfZmllbGQqIGZpZWxkKTsKKyAgc3RkOjpzdHJpbmcgZ2VuZXJhdGVfaXNzZXRfY2hlY2soc3RkOjpzdHJpbmcgZmllbGQpOworICB2b2lkIGdlbmVyYXRlX2lzc2V0X3NldChvc3RyZWFtJiBvdXQsIHRfZmllbGQqIGZpZWxkKTsKKyAgc3RkOjpzdHJpbmcgaXNzZXRfZmllbGRfaWQodF9maWVsZCogZmllbGQpOworCisgIHZvaWQgZ2VuZXJhdGVfcHJpbWl0aXZlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3VuaW9uKHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV91bmlvbl9jb25zdHJ1Y3Rvcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV91bmlvbl9nZXR0ZXJzX2FuZF9zZXR0ZXJzKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3VuaW9uX2Fic3RyYWN0X21ldGhvZHMob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfY2hlY2tfdHlwZShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9yZWFkX3ZhbHVlKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3dyaXRlX3ZhbHVlKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2dldF9maWVsZF9kZXNjKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2dldF9zdHJ1Y3RfZGVzYyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9nZXRfZmllbGRfbmFtZShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKworICB2b2lkIGdlbmVyYXRlX3VuaW9uX2NvbXBhcmlzb25zKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3VuaW9uX2hhc2hjb2RlKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIC8qKgorICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbWFwKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXQqIHRtYXAsIHN0ZDo6c3RyaW5nIGl0ZXIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RkOjpzdHJpbmcgaXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX2RvYyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9maWVsZCogZmllbGQpOworCisgIHZvaWQgZ2VuZXJhdGVfamF2YV9kb2Moc3RkOjpvc3RyZWFtJiBvdXQsIHRfZG9jKiB0ZG9jKTsKKworICB2b2lkIGdlbmVyYXRlX2phdmFfZG9jKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZG9jKTsKKworICB2b2lkIGdlbmVyYXRlX2phdmFfZG9jc3RyaW5nX2NvbW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHN0cmluZyBjb250ZW50cyk7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZWVwX2NvcHlfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgc291cmNlX25hbWVfcDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBzb3VyY2VfbmFtZV9wMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHJlc3VsdF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZWVwX2NvcHlfbm9uX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBzb3VyY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBkZXN0X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlKTsKKworICBib29sIGhhc19iaXRfdmVjdG9yKHRfc3RydWN0KiB0c3RydWN0KTsKKworICAvKioKKyAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKKyAgICovCisKKyAgc3RkOjpzdHJpbmcgamF2YV9wYWNrYWdlKCk7CisgIHN0ZDo6c3RyaW5nIGphdmFfdHlwZV9pbXBvcnRzKCk7CisgIHN0ZDo6c3RyaW5nIGphdmFfdGhyaWZ0X2ltcG9ydHMoKTsKKyAgc3RkOjpzdHJpbmcgdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2NvbnRhaW5lciA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9pbml0ID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNraXBfZ2VuZXJpYyA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgYmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGUqIHRiYXNlLCBib29sIGluX2NvbnRhaW5lciA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdCA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGluY2x1ZGVfdHlwZXMgPSB0cnVlKTsKKyAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOworICBzdGQ6OnN0cmluZyBnZXRfZW51bV9jbGFzc19uYW1lKHRfdHlwZSogdHlwZSk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0X2Rlc2Mob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZmllbGRfZGVzY3Mob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHN0ZDo6c3RyaW5nIGJveF90eXBlKHRfdHlwZSogdHlwZSwgc3RyaW5nIHZhbHVlKTsKKworICBib29sIHR5cGVfY2FuX2JlX251bGwodF90eXBlKiB0dHlwZSkgeworICAgIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7CisKKyAgICByZXR1cm4gdHR5cGUtPmlzX2NvbnRhaW5lcigpIHx8IHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKSB8fCB0dHlwZS0+aXNfc3RyaW5nKCkKKyAgICAgICAgICAgfHwgdHR5cGUtPmlzX2VudW0oKTsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIGNvbnN0YW50X25hbWUoc3RkOjpzdHJpbmcgbmFtZSk7CisKK3ByaXZhdGU6CisgIC8qKgorICAgKiBGaWxlIHN0cmVhbXMKKyAgICovCisKKyAgc3RkOjpzdHJpbmcgcGFja2FnZV9uYW1lXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3NlcnZpY2VfOworICBzdGQ6OnN0cmluZyBwYWNrYWdlX2Rpcl87Cit9OworCisvKioKKyAqIFByZXBhcmVzIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0CisgKiBzdHJlYW1zLgorICoKKyAqIEBwYXJhbSB0cHJvZ3JhbSBUaGUgcHJvZ3JhbSB0byBnZW5lcmF0ZQorICovCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7CisgIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQorICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOworICBwYWNrYWdlX25hbWVfID0gcHJvZ3JhbV8tPmdldF9uYW1lc3BhY2UoImphdmEiKTsKKworICBzdHJpbmcgZGlyID0gcGFja2FnZV9uYW1lXzsKKyAgc3RyaW5nIHN1YmRpciA9IGdldF9vdXRfZGlyKCk7CisgIHN0cmluZzo6c2l6ZV90eXBlIGxvYzsKKyAgd2hpbGUgKChsb2MgPSBkaXIuZmluZCgiLiIpKSAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICBzdWJkaXIgPSBzdWJkaXIgKyAiLyIgKyBkaXIuc3Vic3RyKDAsIGxvYyk7CisgICAgTUtESVIoc3ViZGlyLmNfc3RyKCkpOworICAgIGRpciA9IGRpci5zdWJzdHIobG9jICsgMSk7CisgIH0KKyAgaWYgKGRpci5zaXplKCkgPiAwKSB7CisgICAgc3ViZGlyID0gc3ViZGlyICsgIi8iICsgZGlyOworICAgIE1LRElSKHN1YmRpci5jX3N0cigpKTsKKyAgfQorCisgIHBhY2thZ2VfZGlyXyA9IHN1YmRpcjsKK30KKworLyoqCisgKiBQYWNrYWdlcyB0aGUgZ2VuZXJhdGVkIGZpbGUKKyAqCisgKiBAcmV0dXJuIFN0cmluZyBvZiB0aGUgcGFja2FnZSwgaS5lLiAicGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdGRlbW87IgorICovCitzdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjpqYXZhX3BhY2thZ2UoKSB7CisgIGlmICghcGFja2FnZV9uYW1lXy5lbXB0eSgpKSB7CisgICAgcmV0dXJuIHN0cmluZygicGFja2FnZSAiKSArIHBhY2thZ2VfbmFtZV8gKyAiO1xuXG4iOworICB9CisgIHJldHVybiAiIjsKK30KKworLyoqCisgKiBQcmludHMgc3RhbmRhcmQgamF2YSBpbXBvcnRzCisgKgorICogQHJldHVybiBMaXN0IG9mIGltcG9ydHMgZm9yIEphdmEgdHlwZXMgdGhhdCBhcmUgdXNlZCBpbiBoZXJlCisgKi8KK3N0cmluZyB0X2phdmFtZV9nZW5lcmF0b3I6OmphdmFfdHlwZV9pbXBvcnRzKCkgeworICByZXR1cm4gc3RyaW5nKCkgKyAiaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7XG4iICsgImltcG9ydCBqYXZhLnV0aWwuVmVjdG9yO1xuIgorICAgICAgICAgKyAiaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjtcblxuIjsKK30KKworLyoqCisgKiBQcmludHMgc3RhbmRhcmQgamF2YSBpbXBvcnRzCisgKgorICogQHJldHVybiBMaXN0IG9mIGltcG9ydHMgbmVjZXNzYXJ5IGZvciB0aHJpZnQKKyAqLworc3RyaW5nIHRfamF2YW1lX2dlbmVyYXRvcjo6amF2YV90aHJpZnRfaW1wb3J0cygpIHsKKyAgcmV0dXJuIHN0cmluZygpICsgImltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC4qO1xuIiArICJpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLio7XG4iCisgICAgICAgICArICJpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0Lio7XG4iICsgImltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC4qO1xuXG4iOworfQorCisvKioKKyAqIE5vdGhpbmcgaW4gSmF2YQorICovCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgeworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIFRoaXMgaXMgbm90IGRvbmUgaW4gSmF2YSwgc2luY2UgaXQgZG9lcworICogbm90IHN1cHBvcnQgYXJiaXRyYXJ5IG5hbWUgcmVwbGFjZW1lbnRzLCBhbmQgaXQnZCBiZSBhIHdhY2t5IHdhc3RlCisgKiBvZiBvdmVyaGVhZCB0byBtYWtlIHdyYXBwZXIgY2xhc3Nlcy4KKyAqCisgKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgorICovCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7CisgICh2b2lkKXR0eXBlZGVmOworfQorCisvKioKKyAqIEVudW1zIGFyZSBhIGNsYXNzIHdpdGggYSBzZXQgb2Ygc3RhdGljIGNvbnN0YW50cy4KKyAqCisgKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKKyAgLy8gTWFrZSBvdXRwdXQgZmlsZQorICBzdHJpbmcgZl9lbnVtX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyAodGVudW0tPmdldF9uYW1lKCkpICsgIi5qYXZhIjsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2VudW07CisgIGZfZW51bS5vcGVuKGZfZW51bV9uYW1lLmNfc3RyKCkpOworCisgIC8vIENvbW1lbnQgYW5kIHBhY2thZ2UgaXQKKyAgZl9lbnVtIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGphdmFfcGFja2FnZSgpOworCisgIGdlbmVyYXRlX2phdmFfZG9jKGZfZW51bSwgdGVudW0pOworICBpbmRlbnQoZl9lbnVtKSA8PCAicHVibGljIGNsYXNzICIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIiBpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LlRFbnVtICI7CisgIHNjb3BlX3VwKGZfZW51bSk7CisgIGZfZW51bSA8PCBlbmRsOworCisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOworICAgIGdlbmVyYXRlX2phdmFfZG9jKGZfZW51bSwgKmNfaXRlcik7CisgICAgaW5kZW50KGZfZW51bSkgPDwgInB1YmxpYyBzdGF0aWMgZmluYWwgIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiICIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgPDwgIiA9IG5ldyAiIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICIoIiA8PCB2YWx1ZSA8PCAiKTsiIDw8IGVuZGw7CisgIH0KKyAgZl9lbnVtIDw8IGVuZGw7CisKKyAgLy8gRmllbGQgZm9yIHRocmlmdENvZGUKKyAgaW5kZW50KGZfZW51bSkgPDwgInByaXZhdGUgZmluYWwgaW50IHZhbHVlOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChmX2VudW0pIDw8ICJwcml2YXRlICIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIihpbnQgdmFsdWUpIHsiIDw8IGVuZGw7CisgIGluZGVudChmX2VudW0pIDw8ICIgIHRoaXMudmFsdWUgPSB2YWx1ZTsiIDw8IGVuZGw7CisgIGluZGVudChmX2VudW0pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KGZfZW51bSkgPDwgIi8qKiIgPDwgZW5kbDsKKyAgaW5kZW50KGZfZW51bSkgPDwgIiAqIEdldCB0aGUgaW50ZWdlciB2YWx1ZSBvZiB0aGlzIGVudW0gdmFsdWUsIGFzIGRlZmluZWQgaW4gdGhlIFRocmlmdCBJREwuIgorICAgICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnQoZl9lbnVtKSA8PCAiICovIiA8PCBlbmRsOworICBpbmRlbnQoZl9lbnVtKSA8PCAicHVibGljIGludCBnZXRWYWx1ZSgpIHsiIDw8IGVuZGw7CisgIGluZGVudChmX2VudW0pIDw8ICIgIHJldHVybiB2YWx1ZTsiIDw8IGVuZGw7CisgIGluZGVudChmX2VudW0pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KGZfZW51bSkgPDwgIi8qKiIgPDwgZW5kbDsKKyAgaW5kZW50KGZfZW51bSkgPDwgIiAqIEZpbmQgYSB0aGUgZW51bSB0eXBlIGJ5IGl0cyBpbnRlZ2VyIHZhbHVlLCBhcyBkZWZpbmVkIGluIHRoZSBUaHJpZnQgSURMLiIKKyAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50KGZfZW51bSkgPDwgIiAqIEByZXR1cm4gbnVsbCBpZiB0aGUgdmFsdWUgaXMgbm90IGZvdW5kLiIgPDwgZW5kbDsKKyAgaW5kZW50KGZfZW51bSkgPDwgIiAqLyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfZW51bSkgPDwgInB1YmxpYyBzdGF0aWMgIiArIHRlbnVtLT5nZXRfbmFtZSgpICsgIiBmaW5kQnlWYWx1ZShpbnQgdmFsdWUpIHsgIiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIGluZGVudChmX2VudW0pIDw8ICJzd2l0Y2ggKHZhbHVlKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgICAgaW5kZW50KGZfZW51bSkgPDwgImNhc2UgIiA8PCB2YWx1ZSA8PCAiOiIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9lbnVtKSA8PCAiICByZXR1cm4gIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnQoZl9lbnVtKSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7CisgIGluZGVudChmX2VudW0pIDw8ICIgIHJldHVybiBudWxsOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworCisgIGluZGVudChmX2VudW0pIDw8ICJ9IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisKKyAgaW5kZW50KGZfZW51bSkgPDwgIn0iIDw8IGVuZGw7CisKKyAgc2NvcGVfZG93bihmX2VudW0pOworCisgIGZfZW51bS5jbG9zZSgpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGNsYXNzIHRoYXQgaG9sZHMgYWxsIHRoZSBjb25zdGFudHMuCisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykgeworICBpZiAoY29uc3RzLmVtcHR5KCkpIHsKKyAgICByZXR1cm47CisgIH0KKworICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArIHByb2dyYW1fbmFtZV8gKyAiQ29uc3RhbnRzLmphdmEiOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfY29uc3RzOworICBmX2NvbnN0cy5vcGVuKGZfY29uc3RzX25hbWUuY19zdHIoKSk7CisKKyAgLy8gUHJpbnQgaGVhZGVyCisgIGZfY29uc3RzIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGphdmFfcGFja2FnZSgpIDw8IGphdmFfdHlwZV9pbXBvcnRzKCk7CisKKyAgZl9jb25zdHMgPDwgInB1YmxpYyBjbGFzcyAiIDw8IHByb2dyYW1fbmFtZV8gPDwgIkNvbnN0YW50cyB7IiA8PCBlbmRsIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7CisgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgcHJpbnRfY29uc3RfdmFsdWUoZl9jb25zdHMsCisgICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3R5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF92YWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgfQorICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9jb25zdHMpIDw8ICJ9IiA8PCBlbmRsOworICBmX2NvbnN0cy5jbG9zZSgpOworfQorCisvKioKKyAqIFByaW50cyB0aGUgdmFsdWUgb2YgYSBjb25zdGFudCB3aXRoIHRoZSBnaXZlbiB0eXBlLiBOb3RlIHRoYXQgdHlwZSBjaGVja2luZworICogaXMgTk9UIHBlcmZvcm1lZCBpbiB0aGlzIGZ1bmN0aW9uIGFzIGl0IGlzIGFsd2F5cyBydW4gYmVmb3JlaGFuZCB1c2luZyB0aGUKKyAqIHZhbGlkYXRlX3R5cGVzIG1ldGhvZCBpbiBtYWluLmNjCisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpwcmludF9jb25zdF92YWx1ZShzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9zdGF0aWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWZ2YWwpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisKKyAgaW5kZW50KG91dCk7CisgIGlmICghZGVmdmFsKSB7CisgICAgb3V0IDw8IChpbl9zdGF0aWMgPyAiIiA6ICJwdWJsaWMgc3RhdGljIGZpbmFsICIpIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiICI7CisgIH0KKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgc3RyaW5nIHYyID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgdHlwZSwgdmFsdWUpOworICAgIG91dCA8PCBuYW1lIDw8ICIgPSAiIDw8IHYyIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgb3V0IDw8IG5hbWUgPDwgIiA9ICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgdHlwZSwgdmFsdWUpIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIG91dCA8PCBuYW1lIDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgaWYgKCFpbl9zdGF0aWMpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJzdGF0aWMgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKKyAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7CisgICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgeworICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOworICAgICAgfQorICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKKyAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIi4iOworICAgICAgc3RkOjpzdHJpbmcgY2FwX25hbWUgPSBnZXRfY2FwX25hbWUodl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKTsKKyAgICAgIG91dCA8PCAic2V0IiA8PCBjYXBfbmFtZSA8PCAiKCIgPDwgdmFsIDw8ICIpOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaWYgKCFpbl9zdGF0aWMpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICBvdXQgPDwgbmFtZSA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlKSA8PCAiKCk7IiA8PCBlbmRsOworICAgIGlmICghaW5fc3RhdGljKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAic3RhdGljIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICB9CisgICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHN0cmluZyBrZXkgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBrdHlwZSwgdl9pdGVyLT5maXJzdCk7CisgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgdnR5cGUsIHZfaXRlci0+c2Vjb25kKTsKKyAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIi5wdXQoIiA8PCBib3hfdHlwZShrdHlwZSwga2V5KSA8PCAiLCAiIDw8IGJveF90eXBlKHZ0eXBlLCB2YWwpIDw8ICIpOyIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfQorICAgIGlmICghaW5fc3RhdGljKSB7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICAgIG91dCA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkgeworICAgIG91dCA8PCBuYW1lIDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgaWYgKCFpbl9zdGF0aWMpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJzdGF0aWMgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKyAgICB0X3R5cGUqIGV0eXBlOworICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9CisgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgZXR5cGUsICp2X2l0ZXIpOworICAgICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIuYWRkRWxlbWVudCgiIDw8IGJveF90eXBlKGV0eXBlLCB2YWwpIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIi5wdXQoIiA8PCBib3hfdHlwZShldHlwZSwgdmFsKSA8PCAiLCAiIDw8IGJveF90eXBlKGV0eXBlLCB2YWwpCisgICAgICAgICAgICAgICAgICAgIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFpbl9zdGF0aWMpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiB0eXBlICIgKyB0eXBlLT5nZXRfbmFtZSgpOworICB9Cit9CisKK3N0cmluZyB0X2phdmFtZV9nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZShvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7CisgICh2b2lkKW5hbWU7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworICBzdGQ6Om9zdHJpbmdzdHJlYW0gcmVuZGVyOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZW5kZXIgPDwgJyInIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmVuZGVyIDw8ICgodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJlbmRlciA8PCAiKGJ5dGUpIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmVuZGVyIDw8ICIoc2hvcnQpIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIkwiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgeworICAgICAgICByZW5kZXIgPDwgIihkb3VibGUpIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZW5kZXIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCBmYWxzZSkgPDwgIi4iIDw8IHZhbHVlLT5nZXRfaWRlbnRpZmllcigpOworICB9IGVsc2UgeworICAgIHN0cmluZyB0ID0gdG1wKCJ0bXAiKTsKKyAgICBwcmludF9jb25zdF92YWx1ZShvdXQsIHQsIHR5cGUsIHZhbHVlLCB0cnVlKTsKKyAgICByZW5kZXIgPDwgdDsKKyAgfQorCisgIHJldHVybiByZW5kZXIuc3RyKCk7Cit9CisKK3N0cmluZyB0X2phdmFtZV9nZW5lcmF0b3I6OmJveF90eXBlKHRfdHlwZSogdHlwZSwgc3RyaW5nIHZhbHVlKSB7CisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHN3aXRjaCAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCkpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gIm5ldyBCb29sZWFuKCIgKyB2YWx1ZSArICIpIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmV0dXJuICJuZXcgQnl0ZSgiICsgdmFsdWUgKyAiKSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gIm5ldyBTaG9ydCgiICsgdmFsdWUgKyAiKSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gIm5ldyBJbnRlZ2VyKCIgKyB2YWx1ZSArICIpIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAibmV3IExvbmcoIiArIHZhbHVlICsgIikiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICJuZXcgRG91YmxlKCIgKyB2YWx1ZSArICIpIjsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiB2YWx1ZTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZGF0YSB0eXBlLiBUaGlzIHdpbGwgYmUgYSBUQmFzZQorICogaW1wbGVtZW50b3IuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaWYgKHRzdHJ1Y3QtPmlzX3VuaW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9qYXZhX3VuaW9uKHRzdHJ1Y3QpOworICB9IGVsc2UgeworICAgIGdlbmVyYXRlX2phdmFfc3RydWN0KHRzdHJ1Y3QsIGZhbHNlKTsKKyAgfQorfQorCisvKioKKyAqIEV4Y2VwdGlvbnMgYXJlIHN0cnVjdHMsIGJ1dCB0aGV5IGluaGVyaXQgZnJvbSBFeGNlcHRpb24KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKKyAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3QodHhjZXB0aW9uLCB0cnVlKTsKK30KKworLyoqCisgKiBKYXZhIHN0cnVjdCBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisgIC8vIE1ha2Ugb3V0cHV0IGZpbGUKKyAgc3RyaW5nIGZfc3RydWN0X25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyAodHN0cnVjdC0+Z2V0X25hbWUoKSkgKyAiLmphdmEiOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc3RydWN0OworICBmX3N0cnVjdC5vcGVuKGZfc3RydWN0X25hbWUuY19zdHIoKSk7CisKKyAgZl9zdHJ1Y3QgPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgamF2YV9wYWNrYWdlKCkgPDwgamF2YV90eXBlX2ltcG9ydHMoKSA8PCBqYXZhX3RocmlmdF9pbXBvcnRzKCk7CisKKyAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfZGVmaW5pdGlvbihmX3N0cnVjdCwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKKyAgZl9zdHJ1Y3QuY2xvc2UoKTsKK30KKworLyoqCisgKiBKYXZhIHVuaW9uIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3VuaW9uKHRfc3RydWN0KiB0c3RydWN0KSB7CisgIC8vIE1ha2Ugb3V0cHV0IGZpbGUKKyAgc3RyaW5nIGZfc3RydWN0X25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyAodHN0cnVjdC0+Z2V0X25hbWUoKSkgKyAiLmphdmEiOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc3RydWN0OworICBmX3N0cnVjdC5vcGVuKGZfc3RydWN0X25hbWUuY19zdHIoKSk7CisKKyAgZl9zdHJ1Y3QgPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgamF2YV9wYWNrYWdlKCkgPDwgamF2YV90eXBlX2ltcG9ydHMoKSA8PCBqYXZhX3RocmlmdF9pbXBvcnRzKCk7CisKKyAgZ2VuZXJhdGVfamF2YV9kb2MoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOworCisgIGJvb2wgaXNfZmluYWwgPSAodHN0cnVjdC0+YW5ub3RhdGlvbnNfLmZpbmQoImZpbmFsIikgIT0gdHN0cnVjdC0+YW5ub3RhdGlvbnNfLmVuZCgpKTsKKworICBpbmRlbnQoZl9zdHJ1Y3QpIDw8ICJwdWJsaWMgIiA8PCAoaXNfZmluYWwgPyAiZmluYWwgIiA6ICIiKSA8PCAiY2xhc3MgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgPDwgIiBleHRlbmRzIFRVbmlvbiAiOworCisgIHNjb3BlX3VwKGZfc3RydWN0KTsKKworICBnZW5lcmF0ZV9zdHJ1Y3RfZGVzYyhmX3N0cnVjdCwgdHN0cnVjdCk7CisgIGdlbmVyYXRlX2ZpZWxkX2Rlc2NzKGZfc3RydWN0LCB0c3RydWN0KTsKKworICBmX3N0cnVjdCA8PCBlbmRsOworCisgIGdlbmVyYXRlX3VuaW9uX2NvbnN0cnVjdG9yKGZfc3RydWN0LCB0c3RydWN0KTsKKworICBmX3N0cnVjdCA8PCBlbmRsOworCisgIGdlbmVyYXRlX3VuaW9uX2Fic3RyYWN0X21ldGhvZHMoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOworCisgIGZfc3RydWN0IDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfdW5pb25fZ2V0dGVyc19hbmRfc2V0dGVycyhmX3N0cnVjdCwgdHN0cnVjdCk7CisKKyAgZl9zdHJ1Y3QgPDwgZW5kbDsKKworICBnZW5lcmF0ZV91bmlvbl9jb21wYXJpc29ucyhmX3N0cnVjdCwgdHN0cnVjdCk7CisKKyAgZl9zdHJ1Y3QgPDwgZW5kbDsKKworICBnZW5lcmF0ZV91bmlvbl9oYXNoY29kZShmX3N0cnVjdCwgdHN0cnVjdCk7CisKKyAgZl9zdHJ1Y3QgPDwgZW5kbDsKKworICBzY29wZV9kb3duKGZfc3RydWN0KTsKKworICBmX3N0cnVjdC5jbG9zZSgpOworfQorCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdW5pb25fY29uc3RydWN0b3Iob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIoKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICBzdXBlcigpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIoX0ZpZWxkcyBzZXRGaWVsZCwgT2JqZWN0IHZhbHVlKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICBzdXBlcihzZXRGaWVsZCwgdmFsdWUpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIoIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIiBvdGhlcikgeyIKKyAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgc3VwZXIob3RoZXIpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiBkZWVwQ29weSgpIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBuZXcgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIodGhpcyk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIGdlbmVyYXRlICJjb25zdHJ1Y3RvcnMiIGZvciBlYWNoIGZpZWxkCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIHN0YXRpYyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZSgoKm1faXRlciktPmdldF90eXBlKCkpIDw8ICIgdmFsdWUpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIiB4ID0gbmV3ICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgeC5zZXQiIDw8IGdldF9jYXBfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpIDw8ICIodmFsdWUpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4geDsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorfQorCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdW5pb25fZ2V0dGVyc19hbmRfc2V0dGVycyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCBlbmRsOworICAgIH0KKworICAgIHRfZmllbGQqIGZpZWxkID0gKCptX2l0ZXIpOworCisgICAgZ2VuZXJhdGVfamF2YV9kb2Mob3V0LCBmaWVsZCk7CisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHR5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSkgPDwgIiBnZXQiCisgICAgICAgICAgICAgICAgPDwgZ2V0X2NhcF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiKCkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICBpZiAoZ2V0U2V0RmllbGQoKSA9PSBfRmllbGRzLiIgPDwgY29uc3RhbnRfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIikgeyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgICAgcmV0dXJuICgiIDw8IHR5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSwgdHJ1ZSkgPDwgIilnZXRGaWVsZFZhbHVlKCk7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgfSBlbHNlIHsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihcIkNhbm5vdCBnZXQgZmllbGQgJyIgPDwgZmllbGQtPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICA8PCAiJyBiZWNhdXNlIHVuaW9uIGlzIGN1cnJlbnRseSBzZXQgdG8gXCIgKyBnZXRGaWVsZERlc2MoZ2V0U2V0RmllbGQoKSkubmFtZSk7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgfSIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICAgIG91dCA8PCBlbmRsOworCisgICAgZ2VuZXJhdGVfamF2YV9kb2Mob3V0LCBmaWVsZCk7CisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyB2b2lkIHNldCIgPDwgZ2V0X2NhcF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiKCIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCkpIDw8ICIgdmFsdWUpIHsiIDw8IGVuZGw7CisgICAgaWYgKHR5cGVfY2FuX2JlX251bGwoZmllbGQtPmdldF90eXBlKCkpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICBpZiAodmFsdWUgPT0gbnVsbCkgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnQob3V0KSA8PCAiICBzZXRGaWVsZF8gPSBfRmllbGRzLiIgPDwgY29uc3RhbnRfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgdmFsdWVfID0gdmFsdWU7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICB9Cit9CisKK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV91bmlvbl9hYnN0cmFjdF9tZXRob2RzKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgZ2VuZXJhdGVfY2hlY2tfdHlwZShvdXQsIHRzdHJ1Y3QpOworICBvdXQgPDwgZW5kbDsKKyAgZ2VuZXJhdGVfcmVhZF92YWx1ZShvdXQsIHRzdHJ1Y3QpOworICBvdXQgPDwgZW5kbDsKKyAgZ2VuZXJhdGVfd3JpdGVfdmFsdWUob3V0LCB0c3RydWN0KTsKKyAgb3V0IDw8IGVuZGw7CisgIGdlbmVyYXRlX2dldF9maWVsZF9kZXNjKG91dCwgdHN0cnVjdCk7CisgIG91dCA8PCBlbmRsOworICBnZW5lcmF0ZV9nZXRfc3RydWN0X2Rlc2Mob3V0LCB0c3RydWN0KTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jaGVja190eXBlKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkKKyAgICAgIDw8ICJwcm90ZWN0ZWQgdm9pZCBjaGVja1R5cGUoX0ZpZWxkcyBzZXRGaWVsZCwgT2JqZWN0IHZhbHVlKSB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uIHsiCisgICAgICA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChzZXRGaWVsZCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAoKm1faXRlcik7CisKKyAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICI6IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgIGlmICh2YWx1ZSBpbnN0YW5jZW9mICIgPDwgdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpLCB0cnVlLCBmYWxzZSwgdHJ1ZSkKKyAgICAgICAgICAgICAgICA8PCAiKSB7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgICAgYnJlYWs7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgIH0iIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IENsYXNzQ2FzdEV4Y2VwdGlvbihcIldhcyBleHBlY3RpbmcgdmFsdWUgb2YgdHlwZSAiCisgICAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpLCB0cnVlLCBmYWxzZSkgPDwgIiBmb3IgZmllbGQgJyIgPDwgZmllbGQtPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICA8PCAiJywgYnV0IGdvdCBcIiArIHZhbHVlLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKTsiIDw8IGVuZGw7CisgICAgLy8gZG8gdGhlIHJlYWwgY2hlY2sgaGVyZQorICB9CisKKyAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFwiVW5rbm93biBmaWVsZCBpZCBcIiArIHNldEZpZWxkKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yZWFkX3ZhbHVlKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgInByb3RlY3RlZCBPYmplY3QgcmVhZFZhbHVlKFRQcm90b2NvbCBpcHJvdCwgVEZpZWxkIGZpZWxkKSB0aHJvd3MgVEV4Y2VwdGlvbiB7IgorICAgICAgICAgICAgICA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIGluZGVudChvdXQpIDw8ICJfRmllbGRzIHNldEZpZWxkID0gX0ZpZWxkcy5maW5kQnlUaHJpZnRJZChmaWVsZC5pZCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiaWYgKHNldEZpZWxkICE9IG51bGwpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChzZXRGaWVsZCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAoKm1faXRlcik7CisKKyAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICI6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJpZiAoZmllbGQudHlwZSA9PSAiIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICJfRklFTERfREVTQy50eXBlKSB7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpLCB0cnVlLCBmYWxzZSkgPDwgIiAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICI7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCBmaWVsZCwgIiIpOworICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gbnVsbDsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihcInNldEZpZWxkIHdhc24ndCBudWxsLCBidXQgZGlkbid0IG1hdGNoIGFueSAiCisgICAgICAgICAgICAgICAgICJvZiB0aGUgY2FzZSBzdGF0ZW1lbnRzIVwiKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgIlRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIG51bGw7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3dyaXRlX3ZhbHVlKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgInByb3RlY3RlZCB2b2lkIHdyaXRlVmFsdWUoVFByb3RvY29sIG9wcm90KSB0aHJvd3MgVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKHNldEZpZWxkXykgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAoKm1faXRlcik7CisKKyAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICI6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiID0gKCIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCksIHRydWUsIGZhbHNlKSA8PCAiKXZhbHVlXzsiIDw8IGVuZGw7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgZmllbGQsICIiKTsKKyAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKFwiQ2Fubm90IHdyaXRlIHVuaW9uIHdpdGggdW5rbm93biBmaWVsZCBcIiArICIKKyAgICAgICAgICAgICAgICAgInNldEZpZWxkXyk7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nZXRfZmllbGRfZGVzYyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGluZGVudChvdXQpIDw8ICJwcm90ZWN0ZWQgVEZpZWxkIGdldEZpZWxkRGVzYyhfRmllbGRzIHNldEZpZWxkKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKHNldEZpZWxkKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAoKm1faXRlcik7CisgICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiOiIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiX0ZJRUxEX0RFU0M7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFwiVW5rbm93biBmaWVsZCBpZCBcIiArIHNldEZpZWxkKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nZXRfc3RydWN0X2Rlc2Mob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICAodm9pZCl0c3RydWN0OworICBpbmRlbnQob3V0KSA8PCAicHJvdGVjdGVkIFRTdHJ1Y3QgZ2V0U3RydWN0RGVzYygpIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBTVFJVQ1RfREVTQzsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdW5pb25fY29tcGFyaXNvbnMob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICAvLyBlcXVhbGl0eQorICBpbmRlbnQob3V0KSA8PCAicHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvdGhlcikgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgaWYgKG90aGVyIGluc3RhbmNlb2YgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIpIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgICAgcmV0dXJuIGVxdWFscygoIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIpb3RoZXIpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgfSBlbHNlIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgICAgcmV0dXJuIGZhbHNlOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgfSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgb3V0IDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBib29sZWFuIGVxdWFscygiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiBvdGhlcikgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIG90aGVyICE9IG51bGwgJiYgZ2V0U2V0RmllbGQoKSA9PSBvdGhlci5nZXRTZXRGaWVsZCgpICYmICIKKyAgICAgICAgICAgICAgICAgImdldEZpZWxkVmFsdWUoKS5lcXVhbHMob3RoZXIuZ2V0RmllbGRWYWx1ZSgpKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICBvdXQgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAicHVibGljIGludCBjb21wYXJlVG8oIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIiBvdGhlcikgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgaW50IGxhc3RDb21wYXJpc29uID0gVEJhc2VIZWxwZXIuY29tcGFyZVRvKGdldFNldEZpZWxkKCksIG90aGVyLmdldFNldEZpZWxkKCkpOyIKKyAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgaWYgKGxhc3RDb21wYXJpc29uID09IDApIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgICAgcmV0dXJuIFRCYXNlSGVscGVyLmNvbXBhcmVUbyhnZXRGaWVsZFZhbHVlKCksIG90aGVyLmdldEZpZWxkVmFsdWUoKSk7IgorICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICB9IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gbGFzdENvbXBhcmlzb247IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgb3V0IDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV91bmlvbl9oYXNoY29kZShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgICh2b2lkKXRzdHJ1Y3Q7CisgIGluZGVudChvdXQpIDw8ICIvKioiIDw8IGVuZGw7CisgIGluZGVudChvdXQpCisgICAgICA8PCAiICogSWYgeW91J2QgbGlrZSB0aGlzIHRvIHBlcmZvcm0gbW9yZSByZXNwZWN0YWJseSwgdXNlIHRoZSBoYXNoY29kZSBnZW5lcmF0b3Igb3B0aW9uLiIKKyAgICAgIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgKi8iIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgaW50IGhhc2hDb2RlKCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIDA7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKK30KKworLyoqCisgKiBKYXZhIHN0cnVjdCBkZWZpbml0aW9uLiBUaGlzIGhhcyB2YXJpb3VzIHBhcmFtZXRlcnMsIGFzIGl0IGNvdWxkIGJlCisgKiBnZW5lcmF0ZWQgc3RhbmRhbG9uZSBvciBpbnNpZGUgYW5vdGhlciBjbGFzcyBhcyBhIGhlbHBlci4gSWYgaXQKKyAqIGlzIGEgaGVscGVyIHRoYW4gaXQgaXMgYSBzdGF0aWMgY2xhc3MuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgICAgICBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqIEBwYXJhbSBpc19leGNlcHRpb24gSXMgdGhpcyBhbiBleGNlcHRpb24/CisgKiBAcGFyYW0gaW5fY2xhc3MgICAgIElmIGluc2lkZSBhIGNsYXNzLCBuZWVkcyB0byBiZSBzdGF0aWMgY2xhc3MKKyAqIEBwYXJhbSBpc19yZXN1bHQgICAgSWYgdGhpcyBpcyBhIHJlc3VsdCBpdCBuZWVkcyBhIGRpZmZlcmVudCB3cml0ZXIKKyAqLwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCkgeworICBnZW5lcmF0ZV9qYXZhX2RvYyhvdXQsIHRzdHJ1Y3QpOworCisgIGJvb2wgaXNfZmluYWwgPSAodHN0cnVjdC0+YW5ub3RhdGlvbnNfLmZpbmQoImZpbmFsIikgIT0gdHN0cnVjdC0+YW5ub3RhdGlvbnNfLmVuZCgpKTsKKworICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgKGlzX2ZpbmFsID8gImZpbmFsICIgOiAiIikgPDwgKGluX2NsYXNzID8gInN0YXRpYyAiIDogIiIpIDw8ICJjbGFzcyAiCisgICAgICAgICAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiAiOworCisgIGlmIChpc19leGNlcHRpb24pIHsKKyAgICBvdXQgPDwgImV4dGVuZHMgRXhjZXB0aW9uICI7CisgIH0KKyAgb3V0IDw8ICJpbXBsZW1lbnRzIFRCYXNlICI7CisKKyAgc2NvcGVfdXAob3V0KTsKKworICBnZW5lcmF0ZV9zdHJ1Y3RfZGVzYyhvdXQsIHRzdHJ1Y3QpOworCisgIC8vIE1lbWJlcnMgYXJlIHB1YmxpYyBmb3IgLWphdmEsIHByaXZhdGUgZm9yIC1qYXZhYmVhbgorICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIG91dCA8PCBlbmRsOworCisgIGdlbmVyYXRlX2ZpZWxkX2Rlc2NzKG91dCwgdHN0cnVjdCk7CisKKyAgb3V0IDw8IGVuZGw7CisKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIGluZGVudChvdXQpIDw8ICJwcml2YXRlICI7CisgICAgb3V0IDw8IGRlY2xhcmVfZmllbGQoKm1faXRlciwgZmFsc2UpIDw8IGVuZGw7CisgIH0KKworICAvLyBpc3NldCBkYXRhCisgIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIGluZGVudChvdXQpIDw8ICIvLyBpc3NldCBpZCBhc3NpZ25tZW50cyIgPDwgZW5kbDsKKworICAgIGludCBpID0gMDsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBpZiAoIXR5cGVfY2FuX2JlX251bGwoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50ICIgPDwgaXNzZXRfZmllbGRfaWQoKm1faXRlcikgPDwgIiA9ICIgPDwgaSA8PCAiOyIKKyAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgaSsrOworICAgICAgfQorICAgIH0KKworICAgIGlmIChpID4gMCkgeworICAgICAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgYm9vbGVhbltdIF9faXNzZXRfdmVjdG9yID0gbmV3IGJvb2xlYW5bIiA8PCBpIDw8ICJdOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBvdXQgPDwgZW5kbDsKKyAgfQorCisgIGJvb2wgYWxsX29wdGlvbmFsX21lbWJlcnMgPSB0cnVlOworCisgIC8vIERlZmF1bHQgY29uc3RydWN0b3IKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIigpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOworICAgIGlmICgoKm1faXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKKyAgICAgIHByaW50X2NvbnN0X3ZhbHVlKG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzLiIgKyAoKm1faXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICB0LAorICAgICAgICAgICAgICAgICAgICAgICAgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKKyAgICB9CisgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKKyAgICAgIGFsbF9vcHRpb25hbF9tZW1iZXJzID0gZmFsc2U7CisgICAgfQorICB9CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaWYgKCFtZW1iZXJzLmVtcHR5KCkgJiYgIWFsbF9vcHRpb25hbF9tZW1iZXJzKSB7CisgICAgLy8gRnVsbCBjb25zdHJ1Y3RvciBmb3IgYWxsIGZpZWxkcworICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX09QVElPTkFMKSB7CisgICAgICAgIGlmICghZmlyc3QpIHsKKyAgICAgICAgICBvdXQgPDwgIiwiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgIH0KKyAgICB9CisgICAgb3V0IDw8ICIpIiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgInRoaXMoKTsiIDw8IGVuZGw7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IgorICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICBnZW5lcmF0ZV9pc3NldF9zZXQob3V0LCAoKm1faXRlcikpOworICAgICAgfQorICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKworICAvLyBjb3B5IGNvbnN0cnVjdG9yCisgIGluZGVudChvdXQpIDw8ICIvKioiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgKiBQZXJmb3JtcyBhIGRlZXAgY29weSBvbiA8aT5vdGhlcjwvaT4uIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICovIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIG90aGVyKSB7IgorICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpZiAoaGFzX2JpdF92ZWN0b3IodHN0cnVjdCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiU3lzdGVtLmFycmF5Y29weShvdGhlci5fX2lzc2V0X3ZlY3RvciwgMCwgX19pc3NldF92ZWN0b3IsIDAsICIKKyAgICAgICAgICAgICAgICAgICAib3RoZXIuX19pc3NldF92ZWN0b3IubGVuZ3RoKTsiIDw8IGVuZGw7CisgIH0KKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAoKm1faXRlcik7CisgICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9IGZpZWxkLT5nZXRfbmFtZSgpOworICAgIHRfdHlwZSogdHlwZSA9IGZpZWxkLT5nZXRfdHlwZSgpOworICAgIGJvb2wgY2FuX2JlX251bGwgPSB0eXBlX2Nhbl9iZV9udWxsKHR5cGUpOworCisgICAgaWYgKGNhbl9iZV9udWxsKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKG90aGVyLiIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQpIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICB9CisKKyAgICBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICAgIGdlbmVyYXRlX2RlZXBfY29weV9jb250YWluZXIob3V0LCAib3RoZXIiLCBmaWVsZF9uYW1lLCAiX190aGlzX18iICsgZmllbGRfbmFtZSwgdHlwZSk7CisgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9IF9fdGhpc19fIiA8PCBmaWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9ICI7CisgICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfbm9uX2NvbnRhaW5lcihvdXQsICJvdGhlci4iICsgZmllbGRfbmFtZSwgZmllbGRfbmFtZSwgdHlwZSk7CisgICAgICBvdXQgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorCisgICAgaWYgKGNhbl9iZV9udWxsKSB7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBjbG9uZSBtZXRob2QsIHNvIHRoYXQgeW91IGNhbiBkZWVwIGNvcHkgYW4gb2JqZWN0IHdoZW4geW91IGRvbid0IGtub3cgaXRzIGNsYXNzLgorICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIGRlZXBDb3B5KCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIG5ldyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIih0aGlzKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfY2xlYXIob3V0LCB0c3RydWN0KTsKKworICBnZW5lcmF0ZV9qYXZhX2JlYW5fYm9pbGVycGxhdGUob3V0LCB0c3RydWN0KTsKKyAgZ2VuZXJhdGVfZ2VuZXJpY19maWVsZF9nZXR0ZXJzX3NldHRlcnMob3V0LCB0c3RydWN0KTsKKworICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9lcXVhbGl0eShvdXQsIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9jb21wYXJlX3RvKG91dCwgdHN0cnVjdCk7CisKKyAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfcmVhZGVyKG91dCwgdHN0cnVjdCk7CisgIGlmIChpc19yZXN1bHQpIHsKKyAgICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9yZXN1bHRfd3JpdGVyKG91dCwgdHN0cnVjdCk7CisgIH0gZWxzZSB7CisgICAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCk7CisgIH0KKyAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfdG9zdHJpbmcob3V0LCB0c3RydWN0KTsKKyAgZ2VuZXJhdGVfamF2YV92YWxpZGF0b3Iob3V0LCB0c3RydWN0KTsKKyAgc2NvcGVfZG93bihvdXQpOworICBvdXQgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgZXF1YWxzIG1ldGhvZHMgYW5kIGEgaGFzaENvZGUgbWV0aG9kIGZvciBhIHN0cnVjdHVyZS4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X2VxdWFsaXR5KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IHRoYXQpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICh0aGF0ID09IG51bGwpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBmYWxzZTsiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAodGhhdCBpbnN0YW5jZW9mICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIiAgcmV0dXJuIHRoaXMuZXF1YWxzKCgiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIil0aGF0KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJyZXR1cm4gZmFsc2U7IiA8PCBlbmRsOworICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBlbmRsOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGJvb2xlYW4gZXF1YWxzKCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIHRoYXQpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICh0aGF0ID09IG51bGwpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBmYWxzZTsiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAodGhpcyA9PSB0aGF0KSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdHJ1ZTsiICA8PCBlbmRsOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICAvLyBNb3N0IGV4aXN0aW5nIFRocmlmdCBjb2RlIGRvZXMgbm90IHVzZSBpc3NldCBvciBvcHRpb25hbC9yZXF1aXJlZCwKKyAgICAvLyBzbyB3ZSB0cmVhdCAiZGVmYXVsdCIgZmllbGRzIGFzIHJlcXVpcmVkLgorICAgIGJvb2wgaXNfb3B0aW9uYWwgPSAoKm1faXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMOworICAgIGJvb2wgY2FuX2JlX251bGwgPSB0eXBlX2Nhbl9iZV9udWxsKHQpOworICAgIHN0cmluZyBuYW1lID0gKCptX2l0ZXIpLT5nZXRfbmFtZSgpOworCisgICAgc3RyaW5nIHRoaXNfcHJlc2VudCA9ICJ0cnVlIjsKKyAgICBzdHJpbmcgdGhhdF9wcmVzZW50ID0gInRydWUiOworICAgIHN0cmluZyB1bmVxdWFsOworCisgICAgaWYgKGlzX29wdGlvbmFsIHx8IGNhbl9iZV9udWxsKSB7CisgICAgICB0aGlzX3ByZXNlbnQgKz0gIiAmJiB0aGlzLiIgKyBnZW5lcmF0ZV9pc3NldF9jaGVjaygqbV9pdGVyKTsKKyAgICAgIHRoYXRfcHJlc2VudCArPSAiICYmIHRoYXQuIiArIGdlbmVyYXRlX2lzc2V0X2NoZWNrKCptX2l0ZXIpOworICAgIH0KKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYm9vbGVhbiB0aGlzX3ByZXNlbnRfIiA8PCBuYW1lIDw8ICIgPSAiIDw8IHRoaXNfcHJlc2VudCA8PCAiOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYm9vbGVhbiB0aGF0X3ByZXNlbnRfIiA8PCBuYW1lIDw8ICIgPSAiIDw8IHRoYXRfcHJlc2VudCA8PCAiOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKCIKKyAgICAgICAgPDwgInRoaXNfcHJlc2VudF8iIDw8IG5hbWUgPDwgIiB8fCB0aGF0X3ByZXNlbnRfIiA8PCBuYW1lIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoISgiCisgICAgICAgIDw8ICJ0aGlzX3ByZXNlbnRfIiA8PCBuYW1lIDw8ICIgJiYgdGhhdF9wcmVzZW50XyIgPDwgbmFtZSA8PCAiKSkiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgIiAgcmV0dXJuIGZhbHNlOyIgPDwgZW5kbDsKKworICAgIGlmICh0LT5pc19iaW5hcnkoKSkgeworICAgICAgdW5lcXVhbCA9ICJUQmFzZUhlbHBlci5jb21wYXJlVG8odGhpcy4iICsgbmFtZSArICIsIHRoYXQuIiArIG5hbWUgKyAiKSAhPSAwIjsKKyAgICB9IGVsc2UgaWYgKGNhbl9iZV9udWxsKSB7CisgICAgICB1bmVxdWFsID0gIiF0aGlzLiIgKyBuYW1lICsgIi5lcXVhbHModGhhdC4iICsgbmFtZSArICIpIjsKKyAgICB9IGVsc2UgeworICAgICAgdW5lcXVhbCA9ICJ0aGlzLiIgKyBuYW1lICsgIiAhPSB0aGF0LiIgKyBuYW1lOworICAgIH0KKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCIgPDwgdW5lcXVhbCA8PCAiKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gZmFsc2U7IiA8PCBlbmRsOworCisgICAgc2NvcGVfZG93bihvdXQpOworICB9CisgIG91dCA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRydWU7IiA8PCBlbmRsOworICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBlbmRsOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGludCBoYXNoQ29kZSgpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIDA7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfY29tcGFyZV90byhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgaW50IGNvbXBhcmVUbyhPYmplY3Qgb3RoZXJPYmplY3QpIHsiIDw8IGVuZGw7CisgIC8vICBpbmRlbnQob3V0KSA8PCAicHVibGljIGludCBjb21wYXJlVG8oIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIiBvdGhlcikgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KG91dCkgPDwgImlmICghZ2V0Q2xhc3MoKS5lcXVhbHMob3RoZXJPYmplY3QuZ2V0Q2xhc3MoKSkpIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKS5jb21wYXJlVG8ob3RoZXJPYmplY3QuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOyIKKyAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIG91dCA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIiBvdGhlciA9ICgiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiKW90aGVyT2JqZWN0OyI7CisKKyAgaW5kZW50KG91dCkgPDwgImludCBsYXN0Q29tcGFyaXNvbiA9IDA7IiA8PCBlbmRsOworICBvdXQgPDwgZW5kbDsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAqbV9pdGVyOworICAgIGluZGVudChvdXQpIDw8ICJsYXN0Q29tcGFyaXNvbiA9IFRCYXNlSGVscGVyLmNvbXBhcmVUbygiIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKGZpZWxkKQorICAgICAgICAgICAgICAgIDw8ICIsIG90aGVyLiIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQpIDw8ICIpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIGxhc3RDb21wYXJpc29uOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjayhmaWVsZCkgPDwgIikgeyIgPDwgZW5kbDsKKyAgICBpZiAoZmllbGQtPmdldF90eXBlKCktPmlzX3N0cnVjdCgpIHx8IGZpZWxkLT5nZXRfdHlwZSgpLT5pc194Y2VwdGlvbigpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICBsYXN0Q29tcGFyaXNvbiA9IHRoaXMuIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiLmNvbXBhcmVUbyhvdGhlci4iCisgICAgICAgICAgICAgICAgICA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgIGxhc3RDb21wYXJpc29uID0gVEJhc2VIZWxwZXIuY29tcGFyZVRvKHRoaXMuIiA8PCBmaWVsZC0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgPDwgIiwgb3RoZXIuIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiKTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50KG91dCkgPDwgIiAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgICByZXR1cm4gbGFzdENvbXBhcmlzb247IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgIH0iIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIDA7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gcmVhZCBhbGwgdGhlIGZpZWxkcyBvZiB0aGUgc3RydWN0LgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfcmVhZGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgdm9pZCByZWFkKFRQcm90b2NvbCBpcHJvdCkgdGhyb3dzIFRFeGNlcHRpb24geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIC8vIERlY2xhcmUgc3RhY2sgdG1wIHZhcmlhYmxlcyBhbmQgcmVhZCBzdHJ1Y3QgaGVhZGVyCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiVEZpZWxkIGZpZWxkOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaXByb3QucmVhZFN0cnVjdEJlZ2luKCk7IiA8PCBlbmRsOworCisgIC8vIExvb3Agb3ZlciByZWFkaW5nIGluIGZpZWxkcworICBpbmRlbnQob3V0KSA8PCAid2hpbGUgKHRydWUpIiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworCisgIC8vIFJlYWQgYmVnaW5uaW5nIGZpZWxkIG1hcmtlcgorICBpbmRlbnQob3V0KSA8PCAiZmllbGQgPSBpcHJvdC5yZWFkRmllbGRCZWdpbigpOyIgPDwgZW5kbDsKKworICAvLyBDaGVjayBmb3IgZmllbGQgU1RPUCBtYXJrZXIgYW5kIGJyZWFrCisgIGluZGVudChvdXQpIDw8ICJpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5TVE9QKSB7ICIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgIC8vIFN3aXRjaCBzdGF0ZW1lbnQgb24gdGhlIGZpZWxkIHdlIGFyZSByZWFkaW5nCisgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKGZpZWxkLmlkKSB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIC8vIEdlbmVyYXRlIGRlc2VyaWFsaXphdGlvbiBjb2RlIGZvciBrbm93biBjYXNlcworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjogLy8gIgorICAgICAgICAgICAgICAgIDw8IGNvbnN0YW50X25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJpZiAoZmllbGQudHlwZSA9PSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJ0aGlzLiIpOworICAgIGdlbmVyYXRlX2lzc2V0X3NldChvdXQsICpmX2l0ZXIpOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyAiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsiCisgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICAvLyBSZWFkIGZpZWxkIGVuZCBtYXJrZXIKKyAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRGaWVsZEVuZCgpOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgImlwcm90LnJlYWRTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7CisKKyAgLy8gcGVyZm9ybXMgdmFyaW91cyBjaGVja3MgKGUuZy4gY2hlY2sgdGhhdCBhbGwgcmVxdWlyZWQgZmllbGRzIGFyZSBzZXQpCisgIGluZGVudChvdXQpIDw8ICJ2YWxpZGF0ZSgpOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLy8gZ2VuZXJhdGVzIGphdmEgbWV0aG9kIHRvIHBlcmZvcm0gdmFyaW91cyBjaGVja3MKKy8vIChlLmcuIGNoZWNrIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgc2V0KQordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfdmFsaWRhdG9yKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyB2b2lkIHZhbGlkYXRlKCkgdGhyb3dzIFRFeGNlcHRpb24geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiLy8gY2hlY2sgZm9yIHJlcXVpcmVkIGZpZWxkcyIgPDwgZW5kbDsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoISIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKmZfaXRlcikgPDwgIikgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICIgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oXCJSZXF1aXJlZCBmaWVsZCAnIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICA8PCAiJyBpcyB1bnNldCEgU3RydWN0OlwiICsgdG9TdHJpbmcoKSk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbiB0byB3cml0ZSBhbGwgdGhlIGZpZWxkcyBvZiB0aGUgc3RydWN0CisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyB2b2lkIHdyaXRlKFRQcm90b2NvbCBvcHJvdCkgdGhyb3dzIFRFeGNlcHRpb24geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIC8vIHBlcmZvcm1zIHZhcmlvdXMgY2hlY2tzIChlLmcuIGNoZWNrIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgc2V0KQorICBpbmRlbnQob3V0KSA8PCAidmFsaWRhdGUoKTsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbihTVFJVQ1RfREVTQyk7IiA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgYm9vbCBudWxsX2FsbG93ZWQgPSB0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgaWYgKG51bGxfYWxsb3dlZCkgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAodGhpcy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9IG51bGwpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICB9CisgICAgYm9vbCBvcHRpb25hbCA9ICgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUw7CisgICAgaWYgKG9wdGlvbmFsKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKCpmX2l0ZXIpKSA8PCAiKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorCisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlRmllbGRCZWdpbigiIDw8IGNvbnN0YW50X25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgIDw8ICJfRklFTERfREVTQyk7IiA8PCBlbmRsOworCisgICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAidGhpcy4iKTsKKworICAgIC8vIFdyaXRlIGZpZWxkIGNsb3NlcgorICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOworCisgICAgaWYgKG9wdGlvbmFsKSB7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICAgIGlmIChudWxsX2FsbG93ZWQpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgLy8gV3JpdGUgdGhlIHN0cnVjdCBtYXAKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKTsiCisgICAgICA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGZ1bmN0aW9uIHRvIHdyaXRlIGFsbCB0aGUgZmllbGRzIG9mIHRoZSBzdHJ1Y3QsCisgKiB3aGljaCBpcyBhIGZ1bmN0aW9uIHJlc3VsdC4gVGhlc2UgZmllbGRzIGFyZSBvbmx5IHdyaXR0ZW4KKyAqIGlmIHRoZXkgYXJlIHNldCBpbiB0aGUgSXNzZXQgYXJyYXksIGFuZCBvbmx5IG9uZSBvZiB0aGVtCisgKiBjYW4gYmUgc2V0IGF0IGEgdGltZS4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X3Jlc3VsdF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyB2b2lkIHdyaXRlKFRQcm90b2NvbCBvcHJvdCkgdGhyb3dzIFRFeGNlcHRpb24geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZVN0cnVjdEJlZ2luKFNUUlVDVF9ERVNDKTsiIDw8IGVuZGw7CisKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlmICI7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCAiIGVsc2UgaWYgIjsKKyAgICB9CisKKyAgICBvdXQgPDwgIih0aGlzLiIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKmZfaXRlcikgPDwgIikgeyIgPDwgZW5kbDsKKworICAgIGluZGVudF91cCgpOworCisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlRmllbGRCZWdpbigiIDw8IGNvbnN0YW50X25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgIDw8ICJfRklFTERfREVTQyk7IiA8PCBlbmRsOworCisgICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAidGhpcy4iKTsKKworICAgIC8vIFdyaXRlIGZpZWxkIGNsb3NlcgorICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOworCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSI7CisgIH0KKyAgLy8gV3JpdGUgdGhlIHN0cnVjdCBtYXAKKyAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlRmllbGRTdG9wKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAib3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yZWZsZWN0aW9uX2dldHRlcnMob3N0cmluZ3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY2FwX25hbWUpIHsKKyAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkX25hbWUpIDw8ICI6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgIXR5cGUtPmlzX3N0cmluZygpKSB7CisgICAgdF9iYXNlX3R5cGUqIGJhc2VfdHlwZSA9ICh0X2Jhc2VfdHlwZSopdHlwZTsKKworICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIHRydWUsIGZhbHNlKSA8PCAiKCIKKyAgICAgICAgICAgICAgICA8PCAoYmFzZV90eXBlLT5pc19ib29sKCkgPyAiaXMiIDogImdldCIpIDw8IGNhcF9uYW1lIDw8ICIoKSk7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgInJldHVybiBnZXQiIDw8IGNhcF9uYW1lIDw8ICIoKTsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9kb3duKCk7Cit9CisKK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yZWZsZWN0aW9uX3NldHRlcnMob3N0cmluZ3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY2FwX25hbWUpIHsKKyAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkX25hbWUpIDw8ICI6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgImlmICh2YWx1ZSA9PSBudWxsKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICB1bnNldCIgPDwgZ2V0X2NhcF9uYW1lKGZpZWxkX25hbWUpIDw8ICIoKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgc2V0IiA8PCBjYXBfbmFtZSA8PCAiKCgiIDw8IHR5cGVfbmFtZSh0eXBlLCB0cnVlLCBmYWxzZSkgPDwgIil2YWx1ZSk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgImJyZWFrOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7Cit9CisKK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nZW5lcmljX2ZpZWxkX2dldHRlcnNfc2V0dGVycyhzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgeworICAodm9pZClvdXQ7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBnZXR0ZXJfc3RyZWFtOworICBzdGQ6Om9zdHJpbmdzdHJlYW0gc2V0dGVyX3N0cmVhbTsKKworICAvLyBidWlsZCB1cCB0aGUgYm9kaWVzIG9mIGJvdGggdGhlIGdldHRlciBhbmQgc2V0dGVyIGF0IG9uY2UKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfZmllbGQqIGZpZWxkID0gKmZfaXRlcjsKKyAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lID0gZmllbGQtPmdldF9uYW1lKCk7CisgICAgc3RkOjpzdHJpbmcgY2FwX25hbWUgPSBnZXRfY2FwX25hbWUoZmllbGRfbmFtZSk7CisKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBnZW5lcmF0ZV9yZWZsZWN0aW9uX3NldHRlcnMoc2V0dGVyX3N0cmVhbSwgdHlwZSwgZmllbGRfbmFtZSwgY2FwX25hbWUpOworICAgIGdlbmVyYXRlX3JlZmxlY3Rpb25fZ2V0dGVycyhnZXR0ZXJfc3RyZWFtLCB0eXBlLCBmaWVsZF9uYW1lLCBjYXBfbmFtZSk7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNldCBvZiBKYXZhIEJlYW4gYm9pbGVycGxhdGUgZnVuY3Rpb25zIChzZXR0ZXJzLCBnZXR0ZXJzLCBldGMuKQorICogZm9yIHRoZSBnaXZlbiBzdHJ1Y3QuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX2JlYW5fYm9pbGVycGxhdGUob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAqZl9pdGVyOworICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUoZmllbGQtPmdldF90eXBlKCkpOworICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSBmaWVsZC0+Z2V0X25hbWUoKTsKKyAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSA9IGdldF9jYXBfbmFtZShmaWVsZF9uYW1lKTsKKworICAgIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgICAgLy8gTWV0aG9kIHRvIHJldHVybiB0aGUgc2l6ZSBvZiB0aGUgY29sbGVjdGlvbgorICAgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBpbnQgZ2V0IiA8PCBjYXBfbmFtZTsKKyAgICAgIG91dCA8PCBnZXRfY2FwX25hbWUoInNpemUoKSB7IikgPDwgZW5kbDsKKworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuICh0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID09IG51bGwpID8gMCA6ICIKKyAgICAgICAgICAgICAgICAgIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiLnNpemUoKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpZiAodHlwZS0+aXNfc2V0KCkgfHwgdHlwZS0+aXNfbGlzdCgpKSB7CisKKyAgICAgIHRfdHlwZSogZWxlbWVudF90eXBlOworICAgICAgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgICAgIGVsZW1lbnRfdHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBlbGVtZW50X3R5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICAgIH0KKworICAgICAgLy8gSXRlcmF0b3IgZ2V0dGVyIGZvciBzZXRzIGFuZCBsaXN0cworICAgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBFbnVtZXJhdGlvbiBnZXQiIDw8IGNhcF9uYW1lOworICAgICAgb3V0IDw8IGdldF9jYXBfbmFtZSgiRW51bWVyYXRpb24oKSB7IikgPDwgZW5kbDsKKworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuICh0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID09IG51bGwpID8gbnVsbCA6ICIKKyAgICAgICAgICAgICAgICAgIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiLmVsZW1lbnRzKCk7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAgIC8vIEFkZCB0byBzZXQgb3IgbGlzdCwgY3JlYXRlIGlmIHRoZSBzZXQvbGlzdCBpcyBudWxsCisgICAgICBpbmRlbnQob3V0KTsKKyAgICAgIG91dCA8PCAicHVibGljIHZvaWQgYWRkIiA8PCBnZXRfY2FwX25hbWUoInRvIik7CisgICAgICBvdXQgPDwgY2FwX25hbWUgPDwgIigiIDw8IHR5cGVfbmFtZShlbGVtZW50X3R5cGUpIDw8ICIgZWxlbSkgeyIgPDwgZW5kbDsKKworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8ICIoKTsiCisgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiLnB1dCgiIDw8IGJveF90eXBlKGVsZW1lbnRfdHlwZSwgImVsZW0iKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgICAgIDw8IGJveF90eXBlKGVsZW1lbnRfdHlwZSwgImVsZW0iKSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIi5hZGRFbGVtZW50KCIgPDwgYm94X3R5cGUoZWxlbWVudF90eXBlLCAiZWxlbSIpCisgICAgICAgICAgICAgICAgICAgIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgICAgLy8gUHV0IHRvIG1hcAorICAgICAgdF90eXBlKiBrZXlfdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICAgIHRfdHlwZSogdmFsX3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisKKyAgICAgIGluZGVudChvdXQpOworICAgICAgb3V0IDw8ICJwdWJsaWMgdm9pZCBwdXRUbyIgPDwgY2FwX25hbWUgPDwgIigiIDw8IHR5cGVfbmFtZShrZXlfdHlwZSwgdHJ1ZSkgPDwgIiBrZXksICIKKyAgICAgICAgICA8PCB0eXBlX25hbWUodmFsX3R5cGUsIHRydWUpIDw8ICIgdmFsKSB7IiA8PCBlbmRsOworCisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAodGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9PSBudWxsKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIi5wdXQoa2V5LCB2YWwpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgIH0KKworICAgIC8vIFNpbXBsZSBnZXR0ZXIKKyAgICBnZW5lcmF0ZV9qYXZhX2RvYyhvdXQsIGZpZWxkKTsKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHlwZV9uYW1lKHR5cGUpOworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MKSB7CisgICAgICBvdXQgPDwgIiBpcyI7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCAiIGdldCI7CisgICAgfQorICAgIG91dCA8PCBjYXBfbmFtZSA8PCAiKCkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIC8vIFNpbXBsZSBzZXR0ZXIKKyAgICBnZW5lcmF0ZV9qYXZhX2RvYyhvdXQsIGZpZWxkKTsKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljICI7CisgICAgb3V0IDw8ICJ2b2lkIjsKKyAgICBvdXQgPDwgIiBzZXQiIDw8IGNhcF9uYW1lIDw8ICIoIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiAiIDw8IGZpZWxkX25hbWUgPDwgIikgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9ICIgPDwgZmllbGRfbmFtZSA8PCAiOyIgPDwgZW5kbDsKKyAgICBnZW5lcmF0ZV9pc3NldF9zZXQob3V0LCBmaWVsZCk7CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAvLyBVbnNldHRlcgorICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCB1bnNldCIgPDwgY2FwX25hbWUgPDwgIigpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaWYgKHR5cGVfY2FuX2JlX251bGwodHlwZSkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID0gbnVsbDsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJfX2lzc2V0X3ZlY3RvclsiIDw8IGlzc2V0X2ZpZWxkX2lkKGZpZWxkKSA8PCAiXSA9IGZhbHNlOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgLy8gaXNTZXQgbWV0aG9kCisgICAgaW5kZW50KG91dCkgPDwgIi8qKiBSZXR1cm5zIHRydWUgaWYgZmllbGQgIiA8PCBmaWVsZF9uYW1lCisgICAgICAgICAgICAgICAgPDwgIiBpcyBzZXQgKGhhcyBiZWVuIGFzc2lnbmVkIGEgdmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UgKi8iIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBib29sZWFuIGlzIiA8PCBnZXRfY2FwX25hbWUoInNldCIpIDw8IGNhcF9uYW1lIDw8ICIoKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKHR5cGUpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgIT0gbnVsbDsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gX19pc3NldF92ZWN0b3JbIiA8PCBpc3NldF9maWVsZF9pZChmaWVsZCkgPDwgIl07IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZvaWQgc2V0IiA8PCBjYXBfbmFtZSA8PCBnZXRfY2FwX25hbWUoImlzU2V0IikgPDwgIihib29sZWFuIHZhbHVlKSB7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaWYgKHR5cGVfY2FuX2JlX251bGwodHlwZSkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIXZhbHVlKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIiAgdGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9IG51bGw7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJfX2lzc2V0X3ZlY3RvclsiIDw8IGlzc2V0X2ZpZWxkX2lkKGZpZWxkKSA8PCAiXSA9IHZhbHVlOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdG9TdHJpbmcoKSBtZXRob2QgZm9yIHRoZSBnaXZlbiBzdHJ1Y3QKKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X3Rvc3RyaW5nKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKFwiIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoXCIpOyIKKyAgICAgIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiYm9vbGVhbiBmaXJzdCA9IHRydWU7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBib29sIGNvdWxkX2JlX3Vuc2V0ID0gKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTDsKKyAgICBpZiAoY291bGRfYmVfdW5zZXQpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygqZl9pdGVyKSA8PCAiKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorCisgICAgdF9maWVsZCogZmllbGQgPSAoKmZfaXRlcik7CisKKyAgICBpZiAoIWZpcnN0KSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCFmaXJzdCkgc2IuYXBwZW5kKFwiLCBcIik7IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnQob3V0KSA8PCAic2IuYXBwZW5kKFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIjpcIik7IiA8PCBlbmRsOworICAgIGJvb2wgY2FuX2JlX251bGwgPSB0eXBlX2Nhbl9iZV9udWxsKGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgICBpZiAoY2FuX2JlX251bGwpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAodGhpcy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID09IG51bGwpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICBzYi5hcHBlbmQoXCJudWxsXCIpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKworICAgIGlmIChmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJUQmFzZUhlbHBlci50b1N0cmluZyh0aGlzLiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiwgc2IpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgInNiLmFwcGVuZCh0aGlzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpZiAoY2FuX2JlX251bGwpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50KG91dCkgPDwgImZpcnN0ID0gZmFsc2U7IiA8PCBlbmRsOworCisgICAgaWYgKGNvdWxkX2JlX3Vuc2V0KSB7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICAgIGZpcnN0ID0gZmFsc2U7CisgIH0KKyAgb3V0IDw8IGluZGVudCgpIDw8ICJzYi5hcHBlbmQoXCIpXCIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHNiLnRvU3RyaW5nKCk7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogUmV0dXJucyBhIHN0cmluZyB3aXRoIHRoZSBqYXZhIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiB0aHJpZnQgdHlwZQorICogKGUuZy4gZm9yIHRoZSB0eXBlIHN0cnVjdCBpdCByZXR1cm5zICJUVHlwZS5TVFJVQ1QiKQorICovCitzdGQ6OnN0cmluZyB0X2phdmFtZV9nZW5lcmF0b3I6OmdldF9qYXZhX3R5cGVfc3RyaW5nKHRfdHlwZSogdHlwZSkgeworICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5MSVNUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAiVFR5cGUuTUFQIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAiVFR5cGUuU0VUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICJUVHlwZS5TVFJVQ1QiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiVFR5cGUuRU5VTSI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgcmV0dXJuIGdldF9qYXZhX3R5cGVfc3RyaW5nKCgodF90eXBlZGVmKil0eXBlKS0+Z2V0X3R5cGUoKSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICBzd2l0Y2ggKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgcmV0dXJuICJUVHlwZS5WT0lEIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICJUVHlwZS5TVFJJTkciOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICJUVHlwZS5CT09MIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZXR1cm4gIlRUeXBlLkJZVEUiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gIlRUeXBlLkkxNiI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAiVFR5cGUuSTMyIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICJUVHlwZS5JNjQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIlRUeXBlLkRPVUJMRSI7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCJVbmtub3duIHRocmlmdCB0eXBlIFwiIiArIHR5cGUtPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJcIiBwYXNzZWQgdG8gdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZXRfamF2YV90eXBlX3N0cmluZyEiKTsKKyAgICAgIGJyZWFrOyAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4hCisgICAgfQorICB9IGVsc2UgeworICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcigKKyAgICAgICAgIlVua25vd24gdGhyaWZ0IHR5cGUgXCIiICsgdHlwZS0+Z2V0X25hbWUoKQorICAgICAgICArICJcIiBwYXNzZWQgdG8gdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZXRfamF2YV90eXBlX3N0cmluZyEiKTsgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIQorICB9Cit9CisKK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSkgeworICBvdXQgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudF91cCgpOworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGluZGVudChvdXQpIDw8ICJuZXcgU3RydWN0TWV0YURhdGEoVFR5cGUuU1RSVUNULCAiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiLmNsYXNzIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJuZXcgTGlzdE1ldGFEYXRhKFRUeXBlLkxJU1QsICI7CisgICAgICB0X3R5cGUqIGVsZW1fdHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgICAgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKG91dCwgZWxlbV90eXBlKTsKKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAibmV3IFNldE1ldGFEYXRhKFRUeXBlLlNFVCwgIjsKKyAgICAgIHRfdHlwZSogZWxlbV90eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgICBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEob3V0LCBlbGVtX3R5cGUpOworICAgIH0gZWxzZSB7IC8vIG1hcAorICAgICAgaW5kZW50KG91dCkgPDwgIm5ldyBNYXBNZXRhRGF0YShUVHlwZS5NQVAsICI7CisgICAgICB0X3R5cGUqIGtleV90eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgICAgdF90eXBlKiB2YWxfdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICAgIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShvdXQsIGtleV90eXBlKTsKKyAgICAgIG91dCA8PCAiLCAiOworICAgICAgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKG91dCwgdmFsX3R5cGUpOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAibmV3IEVudW1NZXRhRGF0YShUVHlwZS5FTlVNLCAiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiLmNsYXNzIjsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCAibmV3IEZpZWxkVmFsdWVNZXRhRGF0YSgiIDw8IGdldF9qYXZhX3R5cGVfc3RyaW5nKHR5cGUpOworICAgIGlmICh0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICIsIFwiIiA8PCAoKHRfdHlwZWRlZiopdHlwZSktPmdldF9zeW1ib2xpYygpIDw8ICJcIiI7CisgICAgfQorICB9CisgIG91dCA8PCAiKSI7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudF9kb3duKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdGhyaWZ0IHNlcnZpY2UuIEluIEMrKywgdGhpcyBjb21wcmlzZXMgYW4gZW50aXJlbHkgc2VwYXJhdGUKKyAqIGhlYWRlciBhbmQgc291cmNlIGZpbGUuIFRoZSBoZWFkZXIgZmlsZSBkZWZpbmVzIHRoZSBtZXRob2RzIGFuZCBpbmNsdWRlcworICogdGhlIGRhdGEgdHlwZXMgZGVmaW5lZCBpbiB0aGUgbWFpbiBoZWFkZXIgZmlsZSwgYW5kIHRoZSBpbXBsZW1lbnRhdGlvbgorICogZmlsZSBjb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIGJhc2ljIHByaW50ZXIgYW5kIGRlZmF1bHQgaW50ZXJmYWNlcy4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgorICovCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIC8vIE1ha2Ugb3V0cHV0IGZpbGUKKyAgc3RyaW5nIGZfc2VydmljZV9uYW1lID0gcGFja2FnZV9kaXJfICsgIi8iICsgc2VydmljZV9uYW1lXyArICIuamF2YSI7CisgIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKKworICBmX3NlcnZpY2VfIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGphdmFfcGFja2FnZSgpIDw8IGphdmFfdHlwZV9pbXBvcnRzKCkgPDwgamF2YV90aHJpZnRfaW1wb3J0cygpOworCisgIGZfc2VydmljZV8gPDwgInB1YmxpYyBjbGFzcyAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIiB7IiA8PCBlbmRsIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIC8vIEdlbmVyYXRlIHRoZSB0aHJlZSBtYWluIHBhcnRzIG9mIHRoZSBzZXJ2aWNlCisgIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlXyA8PCAifSIgPDwgZW5kbDsKKyAgZl9zZXJ2aWNlXy5jbG9zZSgpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgaW50ZXJmYWNlIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcmltaXRpdmVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgaW50ZXJmYWNlIElmYWNlIGV4dGVuZHMgIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZmFjZSB7IH0iCisgICAgICAgICAgICAgPDwgZW5kbCA8PCBlbmRsOworCisgIHN0cmluZyBmX2ludGVyZmFjZV9uYW1lID0gcGFja2FnZV9kaXJfICsgIi8iICsgc2VydmljZV9uYW1lXyArICJJZmFjZS5qYXZhIjsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2lmYWNlOworICBmX2lmYWNlLm9wZW4oZl9pbnRlcmZhY2VfbmFtZS5jX3N0cigpKTsKKworICBzdHJpbmcgZXh0ZW5kc19pZmFjZSA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHNfaWZhY2UgPSAiIGV4dGVuZHMgIiArIHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSkgKyAiSWZhY2UiOworICB9CisKKyAgZl9pZmFjZSA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBqYXZhX3BhY2thZ2UoKSA8PCBqYXZhX3R5cGVfaW1wb3J0cygpIDw8IGphdmFfdGhyaWZ0X2ltcG9ydHMoKTsKKyAgZ2VuZXJhdGVfamF2YV9kb2MoZl9pZmFjZSwgdHNlcnZpY2UpOworICBmX2lmYWNlIDw8ICJwdWJsaWMgaW50ZXJmYWNlICIgPDwgc2VydmljZV9uYW1lXyA8PCAiSWZhY2UiIDw8IGV4dGVuZHNfaWZhY2UgPDwgIiB7IiA8PCBlbmRsCisgICAgICAgICAgPDwgZW5kbDsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZ2VuZXJhdGVfamF2YV9kb2MoZl9pZmFjZSwgKmZfaXRlcik7CisgICAgZl9pZmFjZSA8PCAiICBwdWJsaWMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorICBmX2lmYWNlIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBpbnRlcmZhY2UgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKKyAqLwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfaWZhY2UgPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICBleHRlbmRzX2lmYWNlID0gIiBleHRlbmRzICIgKyBleHRlbmRzICsgIi5JZmFjZSI7CisgIH0KKworICBnZW5lcmF0ZV9qYXZhX2RvYyhmX3NlcnZpY2VfLCB0c2VydmljZSk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInB1YmxpYyBpbnRlcmZhY2UgSWZhY2UiIDw8IGV4dGVuZHNfaWZhY2UgPDwgIiB7IiA8PCBlbmRsIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9qYXZhX2RvYyhmX3NlcnZpY2VfLCAqZl9pdGVyKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgc3RydWN0cyBmb3IgYWxsIHRoZSBzZXJ2aWNlIGFyZ3MgYW5kIHJldHVybiB0eXBlcworICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZQorICovCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9zdHJ1Y3QqIHRzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIGdlbmVyYXRlX2phdmFfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgdHMsIGZhbHNlLCB0cnVlKTsKKyAgICBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKCpmX2l0ZXIpOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgorICovCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19jbGllbnQgPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICBleHRlbmRzX2NsaWVudCA9ICIgZXh0ZW5kcyAiICsgZXh0ZW5kcyArICIuQ2xpZW50IjsKKyAgfQorCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIHN0YXRpYyBjbGFzcyBDbGllbnQiIDw8IGV4dGVuZHNfY2xpZW50CisgICAgICAgICAgICAgICAgICAgICA8PCAiIGltcGxlbWVudHMgVFNlcnZpY2VDbGllbnQsIElmYWNlIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIENsaWVudChUUHJvdG9jb2wgcHJvdCkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInRoaXMocHJvdCwgcHJvdCk7IiA8PCBlbmRsOworICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgQ2xpZW50KFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpcHJvdF8gPSBpcHJvdDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90XyA9IG9wcm90OyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJzdXBlcihpcHJvdCwgb3Byb3QpOyIgPDwgZW5kbDsKKyAgfQorICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInByb3RlY3RlZCBUUHJvdG9jb2wgaXByb3RfOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgInByb3RlY3RlZCBUUHJvdG9jb2wgb3Byb3RfOyIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAicHJvdGVjdGVkIGludCBzZXFpZF87IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBUUHJvdG9jb2wgZ2V0SW5wdXRQcm90b2NvbCgpIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIHRoaXMuaXByb3RfOyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIFRQcm90b2NvbCBnZXRPdXRwdXRQcm90b2NvbCgpIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIHRoaXMub3Byb3RfOyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgfQorCisgIC8vIEdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworCisgICAgLy8gT3BlbiBmdW5jdGlvbgorICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJzZW5kXyIgPDwgZnVubmFtZSA8PCAiKCI7CisKKyAgICAvLyBHZXQgdGhlIHN0cnVjdCBvZiBmdW5jdGlvbiBjYWxsIHBhcmFtcworICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworCisgICAgLy8gRGVjbGFyZSB0aGUgZnVuY3Rpb24gYXJndW1lbnRzCisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIH0KKyAgICBmX3NlcnZpY2VfIDw8ICIpOyIgPDwgZW5kbDsKKworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKKyAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAicmV0dXJuICI7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfIDw8ICJyZWN2XyIgPDwgZnVubmFtZSA8PCAiKCk7IiA8PCBlbmRsOworICAgIH0KKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAgIHRfZnVuY3Rpb24gc2VuZF9mdW5jdGlvbihnX3R5cGVfdm9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJzZW5kXyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF9hcmdsaXN0KCkpOworCisgICAgc3RyaW5nIGFyZ3NuYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKKworICAgIC8vIE9wZW4gZnVuY3Rpb24KKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmc2VuZF9mdW5jdGlvbikgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVxdWVzdAorICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90Xy53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UoXCIiIDw8IGZ1bm5hbWUgPDwgIlwiLCAiCisgICAgICAgICAgICAgICA8PCAoKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSA/ICJUTWVzc2FnZVR5cGUuT05FV0FZIiA6ICJUTWVzc2FnZVR5cGUuQ0FMTCIpCisgICAgICAgICAgICAgICA8PCAiLCArK3NlcWlkXykpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBhcmdzbmFtZSA8PCAiIGFyZ3MgPSBuZXcgIiA8PCBhcmdzbmFtZQorICAgICAgICAgICAgICAgPDwgIigpOyIgPDwgZW5kbDsKKworICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJhcmdzLnNldCIgPDwgZ2V0X2NhcF9uYW1lKCgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKCIKKyAgICAgICAgICAgICAgICAgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIik7IiA8PCBlbmRsOworICAgIH0KKworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImFyZ3Mud3JpdGUob3Byb3RfKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICJvcHJvdF8ud3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAib3Byb3RfLmdldFRyYW5zcG9ydCgpLmZsdXNoKCk7IiA8PCBlbmRsOworCisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIHN0cmluZyByZXN1bHRuYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOworCisgICAgICB0X3N0cnVjdCBub2FyZ3MocHJvZ3JhbV8pOworICAgICAgdF9mdW5jdGlvbiByZWN2X2Z1bmN0aW9uKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInJlY3ZfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5vYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKSk7CisgICAgICAvLyBPcGVuIGZ1bmN0aW9uCisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmcmVjdl9mdW5jdGlvbikgPDwgZW5kbDsKKyAgICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJUTWVzc2FnZSBtc2cgPSBpcHJvdF8ucmVhZE1lc3NhZ2VCZWdpbigpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAiaWYgKG1zZy50eXBlID09IFRNZXNzYWdlVHlwZS5FWENFUFRJT04pIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgPDwgIiAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHggPSBUQXBwbGljYXRpb25FeGNlcHRpb24ucmVhZChpcHJvdF8pOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICBpcHJvdF8ucmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgdGhyb3cgeDsiCisgICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlmIChtc2cuc2VxaWQgIT0gc2VxaWRfKSB7IgorICAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgIDw8ICIgIHRocm93IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkJBRF9TRVFVRU5DRV9JRCwgXCIiCisgICAgICAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZhaWxlZDogb3V0IG9mIHNlcXVlbmNlIHJlc3BvbnNlXCIpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCByZXN1bHRuYW1lIDw8ICIgcmVzdWx0ID0gbmV3ICIKKyAgICAgICAgICAgICAgICAgPDwgcmVzdWx0bmFtZSA8PCAiKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXN1bHQucmVhZChpcHJvdF8pOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaXByb3RfLnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOworCisgICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KKyAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKHJlc3VsdC4iIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKCJzdWNjZXNzIikgPDwgIikgeyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiByZXN1bHQuc3VjY2VzczsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOworICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKyAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChyZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiAhPSBudWxsKSB7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgdGhyb3cgcmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIC8vIElmIHlvdSBnZXQgaGVyZSBpdCdzIGFuIGV4Y2VwdGlvbiwgdW5sZXNzIGEgdm9pZCBmdW5jdGlvbgorICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgICA8PCAidGhyb3cgbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uTUlTU0lOR19SRVNVTFQsIFwiIgorICAgICAgICAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZhaWxlZDogdW5rbm93biByZXN1bHRcIik7IiA8PCBlbmRsOworICAgICAgfQorCisgICAgICAvLyBDbG9zZSBmdW5jdGlvbgorICAgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgorICovCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICAvLyBHZW5lcmF0ZSB0aGUgZGlzcGF0Y2ggbWV0aG9kcworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKworICAvLyBFeHRlbmRzIHN0dWZmCisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX3Byb2Nlc3NvciA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgIGV4dGVuZHNfcHJvY2Vzc29yID0gIiBleHRlbmRzICIgKyBleHRlbmRzICsgIi5Qcm9jZXNzb3IiOworICB9CisKKyAgLy8gR2VuZXJhdGUgdGhlIGhlYWRlciBwb3J0aW9uCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIHN0YXRpYyBjbGFzcyBQcm9jZXNzb3IiIDw8IGV4dGVuZHNfcHJvY2Vzc29yCisgICAgICAgICAgICAgICAgICAgICA8PCAiIGltcGxlbWVudHMgVFByb2Nlc3NvciB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBQcm9jZXNzb3IoSWZhY2UgaWZhY2UpIiA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgaWYgKCFleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJzdXBlcihpZmFjZSk7IiA8PCBlbmRsOworICB9CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmYWNlXyA9IGlmYWNlOyIgPDwgZW5kbDsKKworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInByb2Nlc3NNYXBfLnB1dChcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIiwgbmV3ICIKKyAgICAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCkpOyIgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl9zZXJ2aWNlXworICAgICAgICA8PCBpbmRlbnQoKSA8PCAicHJvdGVjdGVkIHN0YXRpYyBpbnRlcmZhY2UgUHJvY2Vzc0Z1bmN0aW9uIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgIiAgcHVibGljIHZvaWQgcHJvY2VzcyhpbnQgc2VxaWQsIFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KSB0aHJvd3MgVEV4Y2VwdGlvbjsiCisgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInByaXZhdGUgSWZhY2UgaWZhY2VfOyIgPDwgZW5kbDsKKworICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicHJvdGVjdGVkIGZpbmFsIEhhc2h0YWJsZSBwcm9jZXNzTWFwXyA9IG5ldyBIYXNodGFibGUoKTsiIDw8IGVuZGw7CisgIH0KKworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHNlcnZlciBpbXBsZW1lbnRhdGlvbgorICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBib29sZWFuIHByb2Nlc3MoVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QpIHRocm93cyBURXhjZXB0aW9uIgorICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiVE1lc3NhZ2UgbXNnID0gaXByb3QucmVhZE1lc3NhZ2VCZWdpbigpOyIgPDwgZW5kbDsKKworICAvLyBUT0RPKG1jc2xlZSk6IHZhbGlkYXRlIG1lc3NhZ2UsIHdhcyB0aGUgc2VxaWQgZXRjLiBsZWdpdD8KKworICBmX3NlcnZpY2VfCisgICAgICA8PCBpbmRlbnQoKSA8PCAiUHJvY2Vzc0Z1bmN0aW9uIGZuID0gKFByb2Nlc3NGdW5jdGlvbilwcm9jZXNzTWFwXy5nZXQobXNnLm5hbWUpOyIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgImlmIChmbiA9PSBudWxsKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIFRUeXBlLlNUUlVDVCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiICBpcHJvdC5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIiAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHggPSBuZXcgIgorICAgICAgICAgIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uVU5LTk9XTl9NRVRIT0QsIFwiSW52YWxpZCBtZXRob2QgbmFtZTogIgorICAgICAgICAgIidcIittc2cubmFtZStcIidcIik7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiICBvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UobXNnLm5hbWUsIFRNZXNzYWdlVHlwZS5FWENFUFRJT04sIG1zZy5zZXFpZCkpOyIKKyAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgeC53cml0ZShvcHJvdCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIG9wcm90LndyaXRlTWVzc2FnZUVuZCgpOyIKKyAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgb3Byb3QuZ2V0VHJhbnNwb3J0KCkuZmx1c2goKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICIgIHJldHVybiB0cnVlOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgImZuLnByb2Nlc3MobXNnLnNlcWlkLCBpcHJvdCwgb3Byb3QpOyIgPDwgZW5kbDsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gdHJ1ZTsiIDw8IGVuZGw7CisKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzIHN1YmZ1bmN0aW9ucworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odHNlcnZpY2UsICpmX2l0ZXIpOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGFuZCBoZWxwZXJzIGZvciBhIGZ1bmN0aW9uLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uCisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIHJldHVybjsKKyAgfQorCisgIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKKyAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKKyAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOworICB9CisKKyAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgcmVzdWx0LmFwcGVuZCgqZl9pdGVyKTsKKyAgfQorCisgIGdlbmVyYXRlX2phdmFfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgJnJlc3VsdCwgZmFsc2UsIHRydWUsIHRydWUpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHByb2Nlc3MgZnVuY3Rpb24gZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byB3cml0ZSBhIGRpc3BhdGNoZXIgZm9yCisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICAodm9pZCl0c2VydmljZTsKKyAgLy8gT3BlbiBjbGFzcworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInByaXZhdGUgY2xhc3MgIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIiBpbXBsZW1lbnRzIFByb2Nlc3NGdW5jdGlvbiB7IgorICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gT3BlbiBmdW5jdGlvbgorICBpbmRlbnQoZl9zZXJ2aWNlXykKKyAgICAgIDw8ICJwdWJsaWMgdm9pZCBwcm9jZXNzKGludCBzZXFpZCwgVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QpIHRocm93cyBURXhjZXB0aW9uIgorICAgICAgPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisKKyAgc3RyaW5nIGFyZ3NuYW1lID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKKyAgc3RyaW5nIHJlc3VsdG5hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBhcmdzbmFtZSA8PCAiIGFyZ3MgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgInRyeSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiYXJncy5yZWFkKGlwcm90KTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0gY2F0Y2ggKFRQcm90b2NvbEV4Y2VwdGlvbiBlKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaXByb3QucmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHggPSBuZXcgIgorICAgICAgICAgICAgICAgICJUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLlBST1RPQ09MX0VSUk9SLCBlLmdldE1lc3NhZ2UoKSk7IgorICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShcIiIKKyAgICAgICAgICAgICA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIlwiLCBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OLCBzZXFpZCkpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICJ4LndyaXRlKG9wcm90KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJvcHJvdC5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuOyIKKyAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpcHJvdC5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKKworICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworCisgIC8vIERlY2xhcmUgcmVzdWx0IGZvciBub24gb25ld2F5IGZ1bmN0aW9uCisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgcmVzdWx0bmFtZSA8PCAiIHJlc3VsdCA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIigpOyIgPDwgZW5kbDsKKyAgfQorCisgIC8vIFRyeSBibG9jayBmb3IgYSBmdW5jdGlvbiB3aXRoIGV4Y2VwdGlvbnMKKyAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidHJ5IHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgIH0KKworICAvLyBHZW5lcmF0ZSB0aGUgZnVuY3Rpb24gY2FsbAorICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgIGZfc2VydmljZV8gPDwgInJlc3VsdC5zdWNjZXNzID0gIjsKKyAgfQorICBmX3NlcnZpY2VfIDw8ICJpZmFjZV8uIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCAiYXJncy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgfQorICBmX3NlcnZpY2VfIDw8ICIpOyIgPDwgZW5kbDsKKworICAvLyBTZXQgaXNzZXQgb24gc3VjY2VzcyBmaWVsZAorICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpCisgICAgICAmJiAhdHlwZV9jYW5fYmVfbnVsbCh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LnNldCIgPDwgZ2V0X2NhcF9uYW1lKCJzdWNjZXNzIikgPDwgZ2V0X2NhcF9uYW1lKCJpc1NldCIpCisgICAgICAgICAgICAgICA8PCAiKHRydWUpOyIgPDwgZW5kbDsKKyAgfQorCisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiB4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgeworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSI7CisgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgIiBjYXRjaCAoIiA8PCB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UpIDw8ICIgIgorICAgICAgICAgICAgICAgICA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIikgeyIgPDwgZW5kbDsKKyAgICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiCisgICAgICAgICAgICAgICAgICAgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgIn0iOworICAgICAgfQorICAgIH0KKyAgICBmX3NlcnZpY2VfIDw8ICIgY2F0Y2ggKFRocm93YWJsZSB0aCkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJUQXBwbGljYXRpb25FeGNlcHRpb24geCA9IG5ldyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5JTlRFUk5BTF9FUlJPUiwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiSW50ZXJuYWwgZXJyb3IgcHJvY2Vzc2luZyAiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCIpOyIKKyAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShcIiIKKyAgICAgICAgICAgICAgIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCIsIFRNZXNzYWdlVHlwZS5FWENFUFRJT04sIHNlcWlkKSk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieC53cml0ZShvcHJvdCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKTsiCisgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgInJldHVybjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9CisKKyAgLy8gU2hvcnRjdXQgb3V0IGhlcmUgZm9yIG9uZXdheSBmdW5jdGlvbnMKKyAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisKKyAgICAvLyBDbG9zZSBjbGFzcworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgIHJldHVybjsKKyAgfQorCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgPDwgIlwiLCBUTWVzc2FnZVR5cGUuUkVQTFksIHNlcWlkKSk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXN1bHQud3JpdGUob3Byb3QpOyIKKyAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAib3Byb3QuZ2V0VHJhbnNwb3J0KCkuZmx1c2goKTsiIDw8IGVuZGw7CisKKyAgLy8gQ2xvc2UgZnVuY3Rpb24KKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIC8vIENsb3NlIGNsYXNzCisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBEZXNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KKyAqCisgKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZAorICogQHBhcmFtIHByZWZpeCBUaGUgdmFyaWFibGUgbmFtZSBvciBjb250YWluZXIgZm9yIHRoaXMgZmllbGQKKyAqLwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdHJpbmcgcHJlZml4KSB7CisgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKworICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgIH0KKworICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIiA9IGlwcm90LiI7CisKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgaWYgKCF0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICBvdXQgPDwgInJlYWRTdHJpbmcoKTsiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0IDw8ICJyZWFkQmluYXJ5KCk7IjsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIG91dCA8PCAicmVhZEJvb2woKTsiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIG91dCA8PCAicmVhZEJ5dGUoKTsiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICBvdXQgPDwgInJlYWRJMTYoKTsiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICBvdXQgPDwgInJlYWRJMzIoKTsiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICBvdXQgPDwgInJlYWRJNjQoKTsiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICBvdXQgPDwgInJlYWREb3VibGUoKTsiOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gSmF2YSBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgfQorICAgIG91dCA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIiA9ICIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpLCB0cnVlLCBmYWxzZSkgKyAiLmZpbmRCeVZhbHVlKGlwcm90LnJlYWRJMzIoKSk7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gREVTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCisgICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYW4gdW5zZXJpYWxpemVyIGZvciBhIHN0cnVjdCwgaW52b2tlcyByZWFkKCkKKyAqLwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7CisgIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCBwcmVmaXggPDwgIi5yZWFkKGlwcm90KTsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogRGVzZXJpYWxpemVzIGEgY29udGFpbmVyIGJ5IHJlYWRpbmcgaXRzIHNpemUgYW5kIHRoZW4gaXRlcmF0aW5nCisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgc3RyaW5nIG9iajsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgb2JqID0gdG1wKCJfbWFwIik7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgb2JqID0gdG1wKCJfc2V0Iik7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIG9iaiA9IHRtcCgiX2xpc3QiKTsKKyAgfQorCisgIC8vIERlY2xhcmUgdmFyaWFibGVzLCByZWFkIGhlYWRlcgorICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIlRNYXAgIiA8PCBvYmogPDwgIiA9IGlwcm90LnJlYWRNYXBCZWdpbigpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiVFNldCAiIDw8IG9iaiA8PCAiID0gaXByb3QucmVhZFNldEJlZ2luKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiVExpc3QgIiA8PCBvYmogPDwgIiA9IGlwcm90LnJlYWRMaXN0QmVnaW4oKTsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpCisgICAgICAgICAgICAgIC8vIHNpemUgdGhlIGNvbGxlY3Rpb24gY29ycmVjdGx5CisgICAgICAgICAgICAgIDw8ICIoIiA8PCAodHR5cGUtPmlzX2xpc3QoKSA/ICIiIDogIjIqIikgPDwgb2JqIDw8ICIuc2l6ZSIKKyAgICAgICAgICAgICAgPDwgIik7IiA8PCBlbmRsOworCisgIC8vIEZvciBsb29wIGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMKKyAgc3RyaW5nIGkgPSB0bXAoIl9pIik7CisgIGluZGVudChvdXQpIDw8ICJmb3IgKGludCAiIDw8IGkgPDwgIiA9IDA7ICIgPDwgaSA8PCAiIDwgIiA8PCBvYmogPDwgIi5zaXplIgorICAgICAgICAgICAgICA8PCAiOyAiCisgICAgICAgICAgICAgIDw8ICIrKyIgPDwgaSA8PCAiKSIgPDwgZW5kbDsKKworICBzY29wZV91cChvdXQpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIHByZWZpeCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBwcmVmaXgpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgcHJlZml4KTsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICAvLyBSZWFkIGNvbnRhaW5lciBlbmQKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkTWFwRW5kKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkU2V0RW5kKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZExpc3RFbmQoKTsiIDw8IGVuZGw7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGNvZGUgdG8gZGVzZXJpYWxpemUgYSBtYXAKKyAqLwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7CisgIHN0cmluZyBrZXkgPSB0bXAoIl9rZXkiKTsKKyAgc3RyaW5nIHZhbCA9IHRtcCgiX3ZhbCIpOworICB0X2ZpZWxkIGZrZXkodG1hcC0+Z2V0X2tleV90eXBlKCksIGtleSk7CisgIHRfZmllbGQgZnZhbCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdmFsKTsKKworICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZma2V5KSA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZmdmFsKSA8PCBlbmRsOworCisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZrZXkpOworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmdmFsKTsKKworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi5wdXQoIiA8PCBib3hfdHlwZSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KSA8PCAiLCAiCisgICAgICAgICAgICAgIDw8IGJveF90eXBlKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2YWwpIDw8ICIpOyIgPDwgZW5kbDsKK30KKworLyoqCisgKiBEZXNlcmlhbGl6ZXMgYSBzZXQgZWxlbWVudAorICovCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0c2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7CisgIHRfZmllbGQgZmVsZW0odHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKKworICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZmZWxlbSkgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIucHV0KCIgPDwgYm94X3R5cGUodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKSA8PCAiLCAiCisgICAgICAgICAgICAgIDw8IGJveF90eXBlKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSkgPDwgIik7IiA8PCBlbmRsOworfQorCisvKioKKyAqIERlc2VyaWFsaXplcyBhIGxpc3QgZWxlbWVudAorICovCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgeworICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKKyAgdF9maWVsZCBmZWxlbSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKKworICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZmZWxlbSkgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIuYWRkRWxlbWVudCgiIDw8IGJveF90eXBlKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pIDw8ICIpOyIgPDwgZW5kbDsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCisgKgorICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQgdG8gc2VyaWFsaXplCisgKiBAcGFyYW0gcHJlZml4IE5hbWUgdG8gcHJlcGVuZCB0byBmaWVsZCBuYW1lCisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBwcmVmaXgpIHsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworCisgIC8vIERvIG5vdGhpbmcgZm9yIHZvaWQgdHlwZXMKKyAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgfQorCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUkzMigiIDw8IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiLmdldFZhbHVlKCkpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHN0cmluZyBuYW1lID0gcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC4iOworCisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgICAgb3V0IDw8ICJ3cml0ZUJpbmFyeSgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgPDwgIndyaXRlU3RyaW5nKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICBvdXQgPDwgIndyaXRlQm9vbCgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICBvdXQgPDwgIndyaXRlQnl0ZSgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUkxNigiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUkzMigiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUk2NCgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgb3V0IDw8ICJ3cml0ZURvdWJsZSgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEphdmEgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICBvdXQgPDwgIndyaXRlSTMyKCIgPDwgbmFtZSA8PCAiKTsiOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgRklFTEQgJyVzJXMnIFRZUEUgJyVzJ1xuIiwKKyAgICAgICAgICAgcHJlZml4LmNfc3RyKCksCisgICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7CisgIH0KK30KKworLyoqCisgKiBTZXJpYWxpemVzIGFsbCB0aGUgbWVtYmVycyBvZiBhIHN0cnVjdC4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IHRvIHNlcmlhbGl6ZQorICogQHBhcmFtIHByZWZpeCAgU3RyaW5nIHByZWZpeCB0byBhdHRhY2ggdG8gYWxsIGZpZWxkcworICovCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgKHZvaWQpdHN0cnVjdDsKKyAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiLndyaXRlKG9wcm90KTsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhIGNvbnRhaW5lciBieSB3cml0aW5nIGl0cyBzaXplIHRoZW4gdGhlIGVsZW1lbnRzLgorICoKKyAqIEBwYXJhbSB0dHlwZSAgVGhlIHR5cGUgb2YgY29udGFpbmVyCisgKiBAcGFyYW0gcHJlZml4IFN0cmluZyBwcmVmaXggZm9yIGZpZWxkcworICovCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgpIHsKKyAgc2NvcGVfdXAob3V0KTsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlTWFwQmVnaW4obmV3IFRNYXAoIiA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkKKyAgICAgICAgICAgICAgICA8PCAiLCAiIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSA8PCAiLCAiIDw8IHByZWZpeAorICAgICAgICAgICAgICAgIDw8ICIuc2l6ZSgpKSk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZVNldEJlZ2luKG5ldyBUU2V0KCIgPDwgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKQorICAgICAgICAgICAgICAgIDw8ICIsICIgPDwgcHJlZml4IDw8ICIuc2l6ZSgpKSk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVMaXN0QmVnaW4obmV3IFRMaXN0KCIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiIDw8IHByZWZpeCA8PCAiLnNpemUoKSkpOyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICB9CisKKyAgc3RyaW5nIGl0ZXIgPSB0bXAoIl9pdGVyIik7CisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBzdHJpbmcgZW51bWVyID0gaXRlciArICJfZW51bSI7CisgICAgc3RyaW5nIGtleV90eXBlID0gdHlwZV9uYW1lKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCksIHRydWUsIGZhbHNlKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yIChFbnVtZXJhdGlvbiAiIDw8IGVudW1lciA8PCAiID0gIiA8PCBwcmVmaXggPDwgIi5rZXlzKCk7ICIgPDwgZW51bWVyCisgICAgICAgICAgICAgICAgPDwgIi5oYXNNb3JlRWxlbWVudHMoKTsgKSAiOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgaW5kZW50KG91dCkgPDwga2V5X3R5cGUgPDwgIiAiIDw8IGl0ZXIgPDwgIiA9ICgiIDw8IGtleV90eXBlIDw8ICIpIiA8PCBlbnVtZXIKKyAgICAgICAgICAgICAgICA8PCAiLm5leHRFbGVtZW50KCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIHN0cmluZyBlbnVtZXIgPSBpdGVyICsgIl9lbnVtIjsKKyAgICBzdHJpbmcgZWxlX3R5cGUgPSB0eXBlX25hbWUoKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpLCB0cnVlKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yIChFbnVtZXJhdGlvbiAiIDw8IGVudW1lciA8PCAiID0gIiA8PCBwcmVmaXggPDwgIi5rZXlzKCk7ICIgPDwgZW51bWVyCisgICAgICAgICAgICAgICAgPDwgIi5oYXNNb3JlRWxlbWVudHMoKTsgKSAiOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgaW5kZW50KG91dCkgPDwgZWxlX3R5cGUgPDwgIiAiIDw8IGl0ZXIgPDwgIiA9ICgiIDw8IGVsZV90eXBlIDw8ICIpIiA8PCBlbnVtZXIKKyAgICAgICAgICAgICAgICA8PCAiLm5leHRFbGVtZW50KCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBzdHJpbmcgZW51bWVyID0gaXRlciArICJfZW51bSI7CisgICAgaW5kZW50KG91dCkgPDwgImZvciAoRW51bWVyYXRpb24gIiA8PCBlbnVtZXIgPDwgIiA9ICIgPDwgcHJlZml4IDw8ICIuZWxlbWVudHMoKTsgIiA8PCBlbnVtZXIKKyAgICAgICAgICAgICAgICA8PCAiLmhhc01vcmVFbGVtZW50cygpOyApICI7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBzdHJpbmcgZWxlX3R5cGUgPSB0eXBlX25hbWUoKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpLCB0cnVlKTsKKyAgICBpbmRlbnQob3V0KSA8PCBlbGVfdHlwZSA8PCAiICIgPDwgaXRlciA8PCAiID0gKCIgPDwgZWxlX3R5cGUgPDwgIikiIDw8IGVudW1lcgorICAgICAgICAgICAgICAgIDw8ICIubmV4dEVsZW1lbnQoKTsiIDw8IGVuZGw7CisgIH0KKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgaXRlciwgcHJlZml4KTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBpdGVyKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBpdGVyKTsKKyAgfQorICBzY29wZV9kb3duKG91dCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZU1hcEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTZXRFbmQoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUxpc3RFbmQoKTsiIDw8IGVuZGw7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIG1hcC4KKyAqLwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG1hcCkgeworICB0X2ZpZWxkIGtmaWVsZCh0bWFwLT5nZXRfa2V5X3R5cGUoKSwgaXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZrZmllbGQsICIiKTsKKyAgc3RyaW5nIHZhbF90eXBlID0gdHlwZV9uYW1lKHRtYXAtPmdldF92YWxfdHlwZSgpLCB0cnVlLCBmYWxzZSk7CisgIHRfZmllbGQgdmZpZWxkKHRtYXAtPmdldF92YWxfdHlwZSgpLCAiKCgiICsgdmFsX3R5cGUgKyAiKSIgKyBtYXAgKyAiLmdldCgiICsgaXRlciArICIpKSIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmdmZpZWxkLCAiIik7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIHNldC4KKyAqLwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgaXRlcikgeworICB0X2ZpZWxkIGVmaWVsZCh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIik7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIGxpc3QuCisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlcikgeworICB0X2ZpZWxkIGVmaWVsZCh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIpOworfQorCisvKioKKyAqIFJldHVybnMgYSBKYXZhIHR5cGUgbmFtZQorICoKKyAqIEBwYXJhbSB0dHlwZSBUaGUgdHlwZQorICogQHBhcmFtIGNvbnRhaW5lciBJcyB0aGUgdHlwZSBnb2luZyBpbnNpZGUgYSBjb250YWluZXI/CisgKiBAcmV0dXJuIEphdmEgdHlwZSBuYW1lLCBpLmUuIFZlY3RvcgorICovCitzdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2NvbnRhaW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2luaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBza2lwX2dlbmVyaWMpIHsKKyAgKHZvaWQpaW5faW5pdDsKKyAgKHZvaWQpc2tpcF9nZW5lcmljOworICAvLyBJbiBKYXZhIHR5cGVkZWZzIGFyZSBqdXN0IHJlc29sdmVkIHRvIHRoZWlyIHJlYWwgdHlwZQorICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOworICBzdHJpbmcgcHJlZml4OworCisgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICByZXR1cm4gYmFzZV90eXBlX25hbWUoKHRfYmFzZV90eXBlKil0dHlwZSwgaW5fY29udGFpbmVyKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gIkhhc2h0YWJsZSI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICJIYXNodGFibGUiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gIlZlY3RvciI7CisgIH0KKworICAvLyBDaGVjayBmb3IgbmFtZXNwYWNpbmcKKyAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHR5cGUtPmdldF9wcm9ncmFtKCk7CisgIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgeworICAgIHN0cmluZyBwYWNrYWdlID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiamF2YSIpOworICAgIGlmICghcGFja2FnZS5lbXB0eSgpKSB7CisgICAgICByZXR1cm4gcGFja2FnZSArICIuIiArIHR0eXBlLT5nZXRfbmFtZSgpOworICAgIH0KKyAgfQorCisgIHJldHVybiB0dHlwZS0+Z2V0X25hbWUoKTsKK30KKworLyoqCisgKiBSZXR1cm5zIHRoZSBDKysgdHlwZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSB0aHJpZnQgdHlwZS4KKyAqCisgKiBAcGFyYW0gdGJhc2UgVGhlIGJhc2UgdHlwZQorICogQHBhcmFtIGNvbnRhaW5lciBJcyBpdCBnb2luZyBpbiBhIEphdmEgY29udGFpbmVyPworICovCitzdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjpiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZSogdHlwZSwgYm9vbCBpbl9jb250YWluZXIpIHsKKyAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9IHR5cGUtPmdldF9iYXNlKCk7CisKKyAgc3dpdGNoICh0YmFzZSkgeworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgcmV0dXJuICJ2b2lkIjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgaWYgKCF0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgcmV0dXJuICJTdHJpbmciOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gImJ5dGVbXSI7CisgICAgfQorICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgcmV0dXJuIChpbl9jb250YWluZXIgPyAiQm9vbGVhbiIgOiAiYm9vbGVhbiIpOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIHJldHVybiAoaW5fY29udGFpbmVyID8gIkJ5dGUiIDogImJ5dGUiKTsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgcmV0dXJuIChpbl9jb250YWluZXIgPyAiU2hvcnQiIDogInNob3J0Iik7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgIHJldHVybiAoaW5fY29udGFpbmVyID8gIkludGVnZXIiIDogImludCIpOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICByZXR1cm4gKGluX2NvbnRhaW5lciA/ICJMb25nIiA6ICJsb25nIik7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgIHJldHVybiAoaW5fY29udGFpbmVyID8gIkRvdWJsZSIgOiAiZG91YmxlIik7CisgIGRlZmF1bHQ6CisgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBKYXZhIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgfQorfQorCisvKioKKyAqIERlY2xhcmVzIGEgZmllbGQsIHdoaWNoIG1heSBpbmNsdWRlIGluaXRpYWxpemF0aW9uIGFzIG5lY2Vzc2FyeS4KKyAqCisgKiBAcGFyYW0gdHR5cGUgVGhlIHR5cGUKKyAqLworc3RyaW5nIHRfamF2YW1lX2dlbmVyYXRvcjo6ZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdCkgeworICAvLyBUT0RPKG1jc2xlZSk6IGRvIHdlIGV2ZXIgbmVlZCB0byBpbml0aWFsaXplIHRoZSBmaWVsZD8KKyAgc3RyaW5nIHJlc3VsdCA9IHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCkpICsgIiAiICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICBpZiAoaW5pdCkgeworICAgIHRfdHlwZSogdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisgICAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiB0ZmllbGQtPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKKyAgICAgIHN0ZDo6b2ZzdHJlYW0gZHVtbXk7CisgICAgICByZXN1bHQgKz0gIiA9ICIgKyByZW5kZXJfY29uc3RfdmFsdWUoZHVtbXksIHRmaWVsZC0+Z2V0X25hbWUoKSwgdHR5cGUsIHRmaWVsZC0+Z2V0X3ZhbHVlKCkpOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgcmVzdWx0ICs9ICIgPSBudWxsIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIHJlc3VsdCArPSAiID0gZmFsc2UiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIHJlc3VsdCArPSAiID0gMCI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIHJlc3VsdCArPSAiID0gKGRvdWJsZSkwIjsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIHJlc3VsdCArPSAiID0gMCI7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICAgIHJlc3VsdCArPSAiID0gbmV3ICIgKyB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlKSArICIoKSI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdCArPSAiID0gbmV3ICIgKyB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlKSArICIoKSI7CisgICAgICA7CisgICAgfQorICB9CisgIHJldHVybiByZXN1bHQgKyAiOyI7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAndHlwZSBuYW1lKGFyZ3MpJworICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgorICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgorICovCitzdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdHJpbmcgcHJlZml4KSB7CisgIHRfdHlwZSogdHR5cGUgPSB0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCk7CisgIHN0ZDo6c3RyaW5nIHJlc3VsdCA9IHR5cGVfbmFtZSh0dHlwZSkgKyAiICIgKyBwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiKCIKKyAgICAgICAgICAgICAgICAgICAgICAgKyBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSkgKyAiKSB0aHJvd3MgIjsKKyAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKyAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICByZXN1bHQgKz0gdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlKSArICIsICI7CisgIH0KKyAgcmVzdWx0ICs9ICJURXhjZXB0aW9uIjsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgY29tbWEgc2VwYXJhdGVkIGZpZWxkIGxpc3QsIHdpdGggdHlwZSBuYW1lcworICovCitzdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGluY2x1ZGVfdHlwZXMpIHsKKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgKz0gIiwgIjsKKyAgICB9CisgICAgaWYgKGluY2x1ZGVfdHlwZXMpIHsKKyAgICAgIHJlc3VsdCArPSB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSArICIgIjsKKyAgICB9CisgICAgcmVzdWx0ICs9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgQysrIGVudW0gc3RyaW5nIGZvciB0aGUgZ2l2ZW4gdHlwZS4KKyAqLworc3RyaW5nIHRfamF2YW1lX2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAiVFR5cGUuU1RSSU5HIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gIlRUeXBlLkJPT0wiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZXR1cm4gIlRUeXBlLkJZVEUiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmV0dXJuICJUVHlwZS5JMTYiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmV0dXJuICJUVHlwZS5JMzIiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICJUVHlwZS5JNjQiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICJUVHlwZS5ET1VCTEUiOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLkkzMiI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiAiVFR5cGUuU1RSVUNUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAiVFR5cGUuTUFQIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAiVFR5cGUuU0VUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLkxJU1QiOworICB9CisKKyAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworfQorCisvKioKKyAqIEFwcGxpZXMgdGhlIGNvcnJlY3Qgc3R5bGUgdG8gYSBzdHJpbmcgYmFzZWQgb24gdGhlIHZhbHVlIG9mIG5vY2FtZWxfc3R5bGVfCisgKi8KK3N0ZDo6c3RyaW5nIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2V0X2NhcF9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpIHsKKyAgbmFtZVswXSA9IHRvdXBwZXIobmFtZVswXSk7CisgIHJldHVybiBuYW1lOworfQorCitzdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjpjb25zdGFudF9uYW1lKHN0cmluZyBuYW1lKSB7CisgIHN0cmluZyBjb25zdGFudF9uYW1lOworCisgIGJvb2wgaXNfZmlyc3QgPSB0cnVlOworICBib29sIHdhc19wcmV2aW91c19jaGFyX3VwcGVyID0gZmFsc2U7CisgIGZvciAoc3RyaW5nOjppdGVyYXRvciBpdGVyID0gbmFtZS5iZWdpbigpOyBpdGVyICE9IG5hbWUuZW5kKCk7ICsraXRlcikgeworICAgIHN0cmluZzo6dmFsdWVfdHlwZSBjaGFyYWN0ZXIgPSAoKml0ZXIpOworCisgICAgYm9vbCBpc191cHBlciA9IGlzdXBwZXIoY2hhcmFjdGVyKTsKKworICAgIGlmIChpc191cHBlciAmJiAhaXNfZmlyc3QgJiYgIXdhc19wcmV2aW91c19jaGFyX3VwcGVyKSB7CisgICAgICBjb25zdGFudF9uYW1lICs9ICdfJzsKKyAgICB9CisgICAgY29uc3RhbnRfbmFtZSArPSB0b3VwcGVyKGNoYXJhY3Rlcik7CisKKyAgICBpc19maXJzdCA9IGZhbHNlOworICAgIHdhc19wcmV2aW91c19jaGFyX3VwcGVyID0gaXNfdXBwZXI7CisgIH0KKworICByZXR1cm4gY29uc3RhbnRfbmFtZTsKK30KKwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfZG9jc3RyaW5nX2NvbW1lbnQob3N0cmVhbSYgb3V0LCBzdHJpbmcgY29udGVudHMpIHsKKyAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCAiLyoqXG4iLCAiICogIiwgY29udGVudHMsICIgKi9cbiIpOworfQorCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9kb2Mob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiBmaWVsZCkgeworICBpZiAoZmllbGQtPmdldF90eXBlKCktPmlzX2VudW0oKSkgeworICAgIHN0cmluZyBjb21iaW5lZF9tZXNzYWdlID0gZmllbGQtPmdldF9kb2MoKSArICJcbkBzZWUgIiArIGdldF9lbnVtX2NsYXNzX25hbWUoZmllbGQtPmdldF90eXBlKCkpOworICAgIGdlbmVyYXRlX2phdmFfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCBjb21iaW5lZF9tZXNzYWdlKTsKKyAgfSBlbHNlIHsKKyAgICBnZW5lcmF0ZV9qYXZhX2RvYyhvdXQsICh0X2RvYyopZmllbGQpOworICB9Cit9CisKKy8qKgorICogRW1pdHMgYSBKYXZhRG9jIGNvbW1lbnQgaWYgdGhlIHByb3ZpZGVkIG9iamVjdCBoYXMgYSBkb2MgaW4gVGhyaWZ0CisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX2RvYyhvc3RyZWFtJiBvdXQsIHRfZG9jKiB0ZG9jKSB7CisgIGlmICh0ZG9jLT5oYXNfZG9jKCkpIHsKKyAgICBnZW5lcmF0ZV9qYXZhX2RvY3N0cmluZ19jb21tZW50KG91dCwgdGRvYy0+Z2V0X2RvYygpKTsKKyAgfQorfQorCisvKioKKyAqIEVtaXRzIGEgSmF2YURvYyBjb21tZW50IGlmIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBvYmplY3QgaGFzIGEgZG9jIGluIFRocmlmdAorICovCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9kb2Mob3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgaWYgKHRmdW5jdGlvbi0+aGFzX2RvYygpKSB7CisgICAgc3RyaW5nc3RyZWFtIHNzOworICAgIHNzIDw8IHRmdW5jdGlvbi0+Z2V0X2RvYygpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBwX2l0ZXI7CisgICAgZm9yIChwX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgcF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytwX2l0ZXIpIHsKKyAgICAgIHRfZmllbGQqIHAgPSAqcF9pdGVyOworICAgICAgc3MgPDwgIlxuQHBhcmFtICIgPDwgcC0+Z2V0X25hbWUoKTsKKyAgICAgIGlmIChwLT5oYXNfZG9jKCkpIHsKKyAgICAgICAgc3MgPDwgIiAiIDw8IHAtPmdldF9kb2MoKTsKKyAgICAgIH0KKyAgICB9CisgICAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCAiLyoqXG4iLCAiICogIiwgc3Muc3RyKCksICIgKi9cbiIpOworICB9Cit9CisKK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWVwX2NvcHlfY29udGFpbmVyKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHNvdXJjZV9uYW1lX3AxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgc291cmNlX25hbWVfcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyByZXN1bHRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSkgeworCisgIHRfY29udGFpbmVyKiBjb250YWluZXIgPSAodF9jb250YWluZXIqKXR5cGU7CisgIHN0ZDo6c3RyaW5nIHNvdXJjZV9uYW1lOworICBpZiAoc291cmNlX25hbWVfcDIgPT0gIiIpCisgICAgc291cmNlX25hbWUgPSBzb3VyY2VfbmFtZV9wMTsKKyAgZWxzZQorICAgIHNvdXJjZV9uYW1lID0gc291cmNlX25hbWVfcDEgKyAiLiIgKyBzb3VyY2VfbmFtZV9wMjsKKworICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUodHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCByZXN1bHRfbmFtZSA8PCAiID0gbmV3ICIKKyAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKGNvbnRhaW5lciwgZmFsc2UsIHRydWUpIDw8ICIoKTsiIDw8IGVuZGw7CisKKyAgc3RkOjpzdHJpbmcgaXRlcmF0b3JfZWxlbWVudF9uYW1lID0gc291cmNlX25hbWVfcDEgKyAiX2VsZW1lbnQiOworICBzdGQ6OnN0cmluZyBlbnVtZXJhdGlvbl9uYW1lID0gc291cmNlX25hbWVfcDEgKyAiX2VudW0iOworICBzdGQ6OnN0cmluZyByZXN1bHRfZWxlbWVudF9uYW1lID0gcmVzdWx0X25hbWUgKyAiX2NvcHkiOworCisgIGlmIChjb250YWluZXItPmlzX21hcCgpKSB7CisgICAgdF90eXBlKiBrZXlfdHlwZSA9ICgodF9tYXAqKWNvbnRhaW5lciktPmdldF9rZXlfdHlwZSgpOworICAgIHRfdHlwZSogdmFsX3R5cGUgPSAoKHRfbWFwKiljb250YWluZXIpLT5nZXRfdmFsX3R5cGUoKTsKKworICAgIGluZGVudChvdXQpIDw8ICJmb3IgKEVudW1lcmF0aW9uICIgPDwgZW51bWVyYXRpb25fbmFtZSA8PCAiID0gIiA8PCBzb3VyY2VfbmFtZSA8PCAiLmtleXMoKTsgIgorICAgICAgICAgICAgICAgIDw8IGVudW1lcmF0aW9uX25hbWUgPDwgIi5oYXNNb3JlRWxlbWVudHMoKTsgKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgb3V0IDw8IGVuZGw7CisKKyAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUoa2V5X3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgaXRlcmF0b3JfZWxlbWVudF9uYW1lIDw8ICJfa2V5ID0gKCIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX25hbWUoa2V5X3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiKSIgPDwgZW51bWVyYXRpb25fbmFtZSA8PCAiLm5leHRFbGVtZW50KCk7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKHZhbF90eXBlLCB0cnVlLCBmYWxzZSkgPDwgIiAiIDw8IGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSA8PCAiX3ZhbHVlID0gKCIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX25hbWUodmFsX3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiKSIgPDwgc291cmNlX25hbWUgPDwgIi5nZXQoIgorICAgICAgICAgICAgICAgIDw8IGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSA8PCAiX2tleSk7IiA8PCBlbmRsOworCisgICAgb3V0IDw8IGVuZGw7CisKKyAgICBpZiAoa2V5X3R5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfY29udGFpbmVyKG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3JfZWxlbWVudF9uYW1lICsgIl9rZXkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0X2VsZW1lbnRfbmFtZSArICJfa2V5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X3R5cGUpOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUoa2V5X3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgcmVzdWx0X2VsZW1lbnRfbmFtZSA8PCAiX2tleSA9ICI7CisgICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfbm9uX2NvbnRhaW5lcihvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcl9lbGVtZW50X25hbWUgKyAiX2tleSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRfZWxlbWVudF9uYW1lICsgIl9rZXkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X3R5cGUpOworICAgICAgb3V0IDw8ICI7IiA8PCBlbmRsOworICAgIH0KKworICAgIG91dCA8PCBlbmRsOworCisgICAgaWYgKHZhbF90eXBlLT5pc19jb250YWluZXIoKSkgeworICAgICAgZ2VuZXJhdGVfZGVlcF9jb3B5X2NvbnRhaW5lcihvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSArICJfdmFsdWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0X2VsZW1lbnRfbmFtZSArICJfdmFsdWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxfdHlwZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZSh2YWxfdHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCByZXN1bHRfZWxlbWVudF9uYW1lIDw8ICJfdmFsdWUgPSAiOworICAgICAgZ2VuZXJhdGVfZGVlcF9jb3B5X25vbl9jb250YWluZXIob3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3JfZWxlbWVudF9uYW1lICsgIl92YWx1ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRfZWxlbWVudF9uYW1lICsgIl92YWx1ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxfdHlwZSk7CisgICAgICBvdXQgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorCisgICAgb3V0IDw8IGVuZGw7CisKKyAgICBpbmRlbnQob3V0KSA8PCByZXN1bHRfbmFtZSA8PCAiLnB1dCgiIDw8IHJlc3VsdF9lbGVtZW50X25hbWUgPDwgIl9rZXksICIgPDwgcmVzdWx0X2VsZW1lbnRfbmFtZQorICAgICAgICAgICAgICAgIDw8ICJfdmFsdWUpOyIgPDwgZW5kbDsKKworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgfSBlbHNlIHsKKyAgICB0X3R5cGUqIGVsZW1fdHlwZTsKKworICAgIGlmIChjb250YWluZXItPmlzX3NldCgpKSB7CisgICAgICBlbGVtX3R5cGUgPSAoKHRfc2V0Kiljb250YWluZXIpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGVsZW1fdHlwZSA9ICgodF9saXN0Kiljb250YWluZXIpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfQorCisgICAgaW5kZW50KG91dCkgPDwgImZvciAoRW51bWVyYXRpb24gIiA8PCBlbnVtZXJhdGlvbl9uYW1lIDw8ICIgPSAiIDw8IHNvdXJjZV9uYW1lCisgICAgICAgICAgICAgICAgPDwgIi5lbGVtZW50cygpOyAiIDw8IGVudW1lcmF0aW9uX25hbWUgPDwgIi5oYXNNb3JlRWxlbWVudHMoKTsgKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZShlbGVtX3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgaXRlcmF0b3JfZWxlbWVudF9uYW1lIDw8ICIgPSAoIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZShlbGVtX3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiKSIgPDwgZW51bWVyYXRpb25fbmFtZSA8PCAiLm5leHRFbGVtZW50KCk7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaWYgKGVsZW1fdHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICAgIC8vIHJlY3Vyc2l2ZSBkZWVwIGNvcHkKKyAgICAgIGdlbmVyYXRlX2RlZXBfY29weV9jb250YWluZXIob3V0LCBpdGVyYXRvcl9lbGVtZW50X25hbWUsICIiLCByZXN1bHRfZWxlbWVudF9uYW1lLCBlbGVtX3R5cGUpOworICAgICAgaWYgKGVsZW1fdHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8IHJlc3VsdF9uYW1lIDw8ICIuYWRkRWxlbWVudCgiIDw8IHJlc3VsdF9lbGVtZW50X25hbWUgPDwgIik7IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgcmVzdWx0X25hbWUgPDwgIi5wdXQoIiA8PCByZXN1bHRfZWxlbWVudF9uYW1lIDw8ICIsICIgPDwgcmVzdWx0X2VsZW1lbnRfbmFtZQorICAgICAgICAgICAgICAgICAgICA8PCAiKTsiIDw8IGVuZGw7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIGl0ZXJhdGl2ZSBjb3B5CisgICAgICBpZiAoZWxlbV90eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUoZWxlbV90eXBlLCB0cnVlLCBmYWxzZSkgPDwgIiB0ZW1wX2JpbmFyeV9lbGVtZW50ID0gIjsKKyAgICAgICAgZ2VuZXJhdGVfZGVlcF9jb3B5X25vbl9jb250YWluZXIob3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcl9lbGVtZW50X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZW1wX2JpbmFyeV9lbGVtZW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbV90eXBlKTsKKyAgICAgICAgb3V0IDw8ICI7IiA8PCBlbmRsOworICAgICAgICBpZiAoZWxlbV90eXBlLT5pc19saXN0KCkpIHsKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCByZXN1bHRfbmFtZSA8PCAiLmFkZEVsZW1lbnQodGVtcF9iaW5hcnlfZWxlbWVudCk7IiA8PCBlbmRsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGluZGVudChvdXQpIDw8IHJlc3VsdF9uYW1lIDw8ICIucHV0KHRlbXBfYmluYXJ5X2VsZW1lbnQsIHRlbXBfYmluYXJ5X2VsZW1lbnQpOyIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgcmVzdWx0X25hbWUgPDwgIi5hZGRFbGVtZW50KCI7CisgICAgICAgIGdlbmVyYXRlX2RlZXBfY29weV9ub25fY29udGFpbmVyKG91dCwgaXRlcmF0b3JfZWxlbWVudF9uYW1lLCByZXN1bHRfbmFtZSwgZWxlbV90eXBlKTsKKyAgICAgICAgb3V0IDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworCisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KK30KKwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlZXBfY29weV9ub25fY29udGFpbmVyKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBzb3VyY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBkZXN0X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlKSB7CisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkgfHwgdHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgLy8gYmluYXJ5IGZpZWxkcyBuZWVkIHRvIGJlIGNvcGllZCB3aXRoIFN5c3RlbS5hcnJheWNvcHkKKyAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgIG91dCA8PCAibmV3IGJ5dGVbIiA8PCBzb3VyY2VfbmFtZSA8PCAiLmxlbmd0aF07IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIlN5c3RlbS5hcnJheWNvcHkoIiA8PCBzb3VyY2VfbmFtZSA8PCAiLCAwLCAiIDw8IGRlc3RfbmFtZSA8PCAiLCAwLCAiCisgICAgICAgICAgICAgICAgICA8PCBzb3VyY2VfbmFtZSA8PCAiLmxlbmd0aCkiOworICAgIH0KKyAgICAvLyBldmVyeXRoaW5nIGVsc2UgY2FuIGJlIGNvcGllZCBkaXJlY3RseQorICAgIGVsc2UKKyAgICAgIG91dCA8PCBzb3VyY2VfbmFtZTsKKyAgfSBlbHNlIHsKKyAgICBvdXQgPDwgIm5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCB0cnVlLCB0cnVlKSA8PCAiKCIgPDwgc291cmNlX25hbWUgPDwgIikiOworICB9Cit9CisKK3N0ZDo6c3RyaW5nIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaXNzZXRfY2hlY2sodF9maWVsZCogZmllbGQpIHsKKyAgcmV0dXJuIGdlbmVyYXRlX2lzc2V0X2NoZWNrKGZpZWxkLT5nZXRfbmFtZSgpKTsKK30KKworc3RkOjpzdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjppc3NldF9maWVsZF9pZCh0X2ZpZWxkKiBmaWVsZCkgeworICByZXR1cm4gIl9fIiArIHVwY2FzZV9zdHJpbmcoZmllbGQtPmdldF9uYW1lKCkgKyAiX2lzc2V0X2lkIik7Cit9CisKK3N0ZDo6c3RyaW5nIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaXNzZXRfY2hlY2soc3RkOjpzdHJpbmcgZmllbGRfbmFtZSkgeworICByZXR1cm4gImlzIiArIGdldF9jYXBfbmFtZSgic2V0IikgKyBnZXRfY2FwX25hbWUoZmllbGRfbmFtZSkgKyAiKCkiOworfQorCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaXNzZXRfc2V0KG9zdHJlYW0mIG91dCwgdF9maWVsZCogZmllbGQpIHsKKyAgaWYgKCF0eXBlX2Nhbl9iZV9udWxsKGZpZWxkLT5nZXRfdHlwZSgpKSkgeworICAgIGluZGVudChvdXQpIDw8ICJzZXQiIDw8IGdldF9jYXBfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgZ2V0X2NhcF9uYW1lKCJpc1NldCIpIDw8ICIodHJ1ZSk7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIH0KK30KKworc3RkOjpzdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZXRfZW51bV9jbGFzc19uYW1lKHRfdHlwZSogdHlwZSkgeworICBzdHJpbmcgcGFja2FnZSA9ICIiOworICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0eXBlLT5nZXRfcHJvZ3JhbSgpOworICBpZiAocHJvZ3JhbSAhPSBOVUxMICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pIHsKKyAgICBwYWNrYWdlID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiamF2YSIpICsgIi4iOworICB9CisgIHJldHVybiBwYWNrYWdlICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdF9kZXNjKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgc3RhdGljIGZpbmFsIFRTdHJ1Y3QgU1RSVUNUX0RFU0MgPSBuZXcgVFN0cnVjdChcIiIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICA8PCAiXCIpOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2ZpZWxkX2Rlc2NzKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgc3RhdGljIGZpbmFsIFRGaWVsZCAiIDw8IGNvbnN0YW50X25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgIDw8ICJfRklFTERfREVTQyA9IG5ldyBURmllbGQoXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIsICIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgPDwgIihzaG9ydCkiIDw8ICgqbV9pdGVyKS0+Z2V0X2tleSgpIDw8ICIpOyIgPDwgZW5kbDsKKyAgfQorfQorCitib29sIHRfamF2YW1lX2dlbmVyYXRvcjo6aGFzX2JpdF92ZWN0b3IodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgaWYgKCF0eXBlX2Nhbl9iZV9udWxsKGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSkpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF9jbGVhcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyB2b2lkIGNsZWFyKCkgeyIgPDwgZW5kbDsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGluZGVudF91cCgpOworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOworICAgIGlmICgoKm1faXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKKyAgICAgIHByaW50X2NvbnN0X3ZhbHVlKG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzLiIgKyAoKm1faXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICB0LAorICAgICAgICAgICAgICAgICAgICAgICAgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKHR5cGVfY2FuX2JlX251bGwodCkpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9IG51bGw7IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gbXVzdCBiZSBhIGJhc2UgdHlwZQorICAgICAgICAvLyBtZWFucyBpdCBhbHNvIG5lZWRzIHRvIGJlIGV4cGxpY2l0bHkgdW5zZXQKKyAgICAgICAgaW5kZW50KG91dCkgPDwgInNldCIgPDwgZ2V0X2NhcF9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgZ2V0X2NhcF9uYW1lKCJpc1NldCIpCisgICAgICAgICAgICAgICAgICAgIDw8ICIoZmFsc2UpOyIgPDwgZW5kbDsKKyAgICAgICAgc3dpdGNoICgoKHRfYmFzZV90eXBlKil0KS0+Z2V0X2Jhc2UoKSkgeworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAwOyIgPDwgZW5kbDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9IDAuMDsiIDw8IGVuZGw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gZmFsc2U7IiA8PCBlbmRsOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OiAvLyBwcmV2ZW50IGdjYyBjb21waWxlciB3YXJuaW5nCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCitUSFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKGphdmFtZSwgIkphdmEgTUUiLCAiIikKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfanNfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9qc19nZW5lcmF0b3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE3ODJiOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfanNfZ2VuZXJhdG9yLmNjCkBAIC0wLDAgKzEsMjcyMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvbWFuaXA+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPGNhc3NlcnQ+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSAidGhyaWZ0L3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidGhyaWZ0L3ZlcnNpb24uaCIKKwordXNpbmcgc3RkOjptYXA7Cit1c2luZyBzdGQ6Om9zdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjp2ZWN0b3I7CisKK3N0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKKworI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaCIKKworCisvKioKKyAqIEpTIGNvZGUgZ2VuZXJhdG9yLgorICovCitjbGFzcyB0X2pzX2dlbmVyYXRvciA6IHB1YmxpYyB0X29vcF9nZW5lcmF0b3IgeworcHVibGljOgorICB0X2pzX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAorICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKKyAgICA6IHRfb29wX2dlbmVyYXRvcihwcm9ncmFtKSB7CisgICAgKHZvaWQpb3B0aW9uX3N0cmluZzsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworCisgICAgZ2VuX25vZGVfID0gZmFsc2U7CisgICAgZ2VuX2pxdWVyeV8gPSBmYWxzZTsKKyAgICBnZW5fdHNfID0gZmFsc2U7CisgICAgZ2VuX2VzNl8gPSBmYWxzZTsKKworICAgIGJvb2wgd2l0aF9uc18gPSBmYWxzZTsKKworICAgIGZvciAoaXRlciA9IHBhcnNlZF9vcHRpb25zLmJlZ2luKCk7IGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCk7ICsraXRlcikgeworICAgICAgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoIm5vZGUiKSA9PSAwKSB7CisgICAgICAgIGdlbl9ub2RlXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImpxdWVyeSIpID09IDApIHsKKyAgICAgICAgZ2VuX2pxdWVyeV8gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJ0cyIpID09IDApIHsKKyAgICAgICAgZ2VuX3RzXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoIndpdGhfbnMiKSA9PSAwKSB7CisgICAgICAgIHdpdGhfbnNfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgiZXM2IikgPT0gMCkgeworICAgICAgICBnZW5fZXM2XyA9IHRydWU7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24ganM6IiArIGl0ZXItPmZpcnN0OworICAgICAgfQorICAgIH0KKworICAgIGlmIChnZW5fZXM2XyAmJiBnZW5fanF1ZXJ5XykgeworICAgICAgdGhyb3cgIkludmFsaWQgc3dpdGNoOiBbLWdlbiBqczplczYsanF1ZXJ5XSBvcHRpb25zIG5vdCBjb21wYXRpYmxlIjsKKyAgICB9CisKKyAgICBpZiAoZ2VuX25vZGVfICYmIGdlbl9qcXVlcnlfKSB7CisgICAgICB0aHJvdyAiSW52YWxpZCBzd2l0Y2g6IFstZ2VuIGpzOm5vZGUsanF1ZXJ5XSBvcHRpb25zIG5vdCBjb21wYXRpYmxlLCB0cnk6IFstZ2VuIGpzOm5vZGUgLWdlbiAiCisgICAgICAgICAgICAianM6anF1ZXJ5XSI7CisgICAgfQorCisgICAgaWYgKCFnZW5fbm9kZV8gJiYgd2l0aF9uc18pIHsKKyAgICAgIHRocm93ICJJbnZhbGlkIHN3aXRjaDogWy1nZW4ganM6d2l0aF9uc10gaXMgb25seSB2YWxpZCB3aGVuIHVzaW5nIG5vZGUuanMiOworICAgIH0KKworICAgIC8vIERlcGVuZGluZyBvbiB0aGUgcHJvY2Vzc2luZyBmbGFncywgd2Ugd2lsbCB1cGRhdGUgdGhlc2UgdG8gYmUgRVM2IGNvbXBhdGlibGUKKyAgICBqc19jb25zdF90eXBlXyA9ICJ2YXIgIjsKKyAgICBqc19sZXRfdHlwZV8gPSAidmFyICI7CisgICAganNfdmFyX3R5cGVfID0gInZhciAiOworICAgIGlmIChnZW5fZXM2XykgeworICAgICAganNfY29uc3RfdHlwZV8gPSAiY29uc3QgIjsKKyAgICAgIGpzX2xldF90eXBlXyA9ICJsZXQgIjsKKyAgICB9CisKKyAgICBpZiAoZ2VuX25vZGVfKSB7CisgICAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1ub2RlanMiOworICAgICAgbm9fbnNfID0gIXdpdGhfbnNfOworICAgIH0gZWxzZSB7CisgICAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1qcyI7CisgICAgICBub19uc18gPSBmYWxzZTsKKyAgICB9CisKKyAgICBlc2NhcGVfWydcJyddID0gIlxcJyI7CisgIH0KKworICAvKioKKyAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcworICAgKi8KKworICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7CisgIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7CisKKyAgLyoqCisgICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpOworICB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSk7CisgIHZvaWQgZ2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX3JlY3ZfdGhyb3coc3RkOjpzdHJpbmcgdmFyKTsKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX3JlY3ZfcmV0dXJuKHN0ZDo6c3RyaW5nIHZhcik7CisKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOworCisgIC8qKgorICAgKiBTdHJ1Y3RzIQorICAgKi8KKyAgdm9pZCBnZW5lcmF0ZV9qc19zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9qc19zdHJ1Y3RfZGVmaW5pdGlvbihzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leHBvcnRlZCA9IHRydWUpOworICB2b2lkIGdlbmVyYXRlX2pzX3N0cnVjdF9yZWFkZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9qc19zdHJ1Y3Rfd3JpdGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfanNfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworCisgIC8qKgorICAgKiBTZXJ2aWNlLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3Jlc3QodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3IodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworCisgIC8qKgorICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsYXNzID0gZmFsc2UpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGtpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB2aXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2V0KiB0bWFwLCBzdGQ6OnN0cmluZyBpdGVyKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0ZDo6c3RyaW5nIGl0ZXIpOworCisgIC8qKgorICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucworICAgKi8KKworICBzdGQ6OnN0cmluZyBqc19pbmNsdWRlcygpOworICBzdGQ6OnN0cmluZyB0c19pbmNsdWRlcygpOworICBzdGQ6OnN0cmluZyByZW5kZXJfaW5jbHVkZXMoKTsKKyAgc3RkOjpzdHJpbmcgZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdCA9IGZhbHNlLCBib29sIG9iaiA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsdWRlX2NhbGxiYWNrID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGluY2x1ZGVfY2FsbGJhY2sgPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIHR5cGVfdG9fZW51bSh0X3R5cGUqIHR0eXBlKTsKKyAgc3RkOjpzdHJpbmcgbWFrZV92YWxpZF9ub2RlSnNfaWRlbnRpZmllcihzdGQ6OnN0cmluZyBjb25zdCYgbmFtZSk7CisKKyAgc3RkOjpzdHJpbmcgYXV0b2dlbl9jb21tZW50KCkgeworICAgIHJldHVybiBzdGQ6OnN0cmluZygiLy9cbiIpICsgIi8vIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgiICsgVEhSSUZUX1ZFUlNJT04gKyAiKVxuIgorICAgICAgICAgICArICIvL1xuIiArICIvLyBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HXG4iCisgICAgICAgICAgICsgIi8vXG4iOworICB9CisKKyAgdF90eXBlKiBnZXRfY29udGFpbmVkX3R5cGUodF90eXBlKiB0KTsKKworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4ganNfbmFtZXNwYWNlX3BpZWNlcyh0X3Byb2dyYW0qIHApIHsKKyAgICBzdGQ6OnN0cmluZyBucyA9IHAtPmdldF9uYW1lc3BhY2UoImpzIik7CisKKyAgICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIGxvYzsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcGllY2VzOworCisgICAgaWYgKG5vX25zXykgeworICAgICAgcmV0dXJuIHBpZWNlczsKKyAgICB9CisKKyAgICBpZiAobnMuc2l6ZSgpID4gMCkgeworICAgICAgd2hpbGUgKChsb2MgPSBucy5maW5kKCIuIikpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgIHBpZWNlcy5wdXNoX2JhY2sobnMuc3Vic3RyKDAsIGxvYykpOworICAgICAgICBucyA9IG5zLnN1YnN0cihsb2MgKyAxKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobnMuc2l6ZSgpID4gMCkgeworICAgICAgcGllY2VzLnB1c2hfYmFjayhucyk7CisgICAgfQorCisgICAgcmV0dXJuIHBpZWNlczsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIGpzX3R5cGVfbmFtZXNwYWNlKHRfcHJvZ3JhbSogcCkgeworICAgIGlmIChnZW5fbm9kZV8pIHsKKyAgICAgIGlmIChwICE9IE5VTEwgJiYgcCAhPSBwcm9ncmFtXykgeworICAgICAgICByZXR1cm4gbWFrZV92YWxpZF9ub2RlSnNfaWRlbnRpZmllcihwLT5nZXRfbmFtZSgpKSArICJfdHR5cGVzLiI7CisgICAgICB9CisgICAgICByZXR1cm4gInR0eXBlcy4iOworICAgIH0KKyAgICByZXR1cm4ganNfbmFtZXNwYWNlKHApOworICB9CisKKyAgc3RkOjpzdHJpbmcganNfZXhwb3J0X25hbWVzcGFjZSh0X3Byb2dyYW0qIHApIHsKKyAgICBpZiAoZ2VuX25vZGVfKSB7CisgICAgICByZXR1cm4gImV4cG9ydHMuIjsKKyAgICB9CisgICAgcmV0dXJuIGpzX25hbWVzcGFjZShwKTsKKyAgfQorCisgIGJvb2wgaGFzX2pzX25hbWVzcGFjZSh0X3Byb2dyYW0qIHApIHsKKyAgICBpZiAobm9fbnNfKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHN0ZDo6c3RyaW5nIG5zID0gcC0+Z2V0X25hbWVzcGFjZSgianMiKTsKKyAgICByZXR1cm4gKG5zLnNpemUoKSA+IDApOworICB9CisKKyAgc3RkOjpzdHJpbmcganNfbmFtZXNwYWNlKHRfcHJvZ3JhbSogcCkgeworICAgIGlmIChub19uc18pIHsKKyAgICAgIHJldHVybiAiIjsKKyAgICB9CisgICAgc3RkOjpzdHJpbmcgbnMgPSBwLT5nZXRfbmFtZXNwYWNlKCJqcyIpOworICAgIGlmIChucy5zaXplKCkgPiAwKSB7CisgICAgICBucyArPSAiLiI7CisgICAgfQorCisgICAgcmV0dXJuIG5zOworICB9CisKKyAgLyoqCisgICAqIFR5cGVTY3JpcHQgRGVmaW5pdGlvbiBGaWxlIGhlbHBlciBmdW5jdGlvbnMKKyAgICovCisKKyAgc3RyaW5nIHRzX2Z1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIGJvb2wgaW5jbHVkZV9jYWxsYmFjaywgYm9vbCBvcHRpb25hbF9jYWxsYmFjayk7CisgIHN0cmluZyB0c19nZXRfdHlwZSh0X3R5cGUqIHR5cGUpOworCisgIC8qKgorICAgKiBTcGVjaWFsIGluZGVudGF0aW9uIGZvciBUeXBlU2NyaXB0IERlZmluaXRpb25zIGJlY2F1c2Ugb2YgdGhlIG1vZHVsZS4KKyAgICogUmV0dXJucyB0aGUgbm9ybWFsIGluZGVudGF0aW9uICsgIiAgIiBpZiBhIG1vZHVsZSB3YXMgZGVmaW5lZC4KKyAgICogQHJldHVybiBzdHJpbmcKKyAgICovCisgIHN0cmluZyB0c19pbmRlbnQoKSB7IHJldHVybiBpbmRlbnQoKSArICghdHNfbW9kdWxlXy5lbXB0eSgpID8gIiAgIiA6ICIiKTsgfQorCisgIC8qKgorICAgKiBSZXR1cm5zICJkZWNsYXJlICIgaWYgbm8gbW9kdWxlIHdhcyBkZWZpbmVkLgorICAgKiBAcmV0dXJuIHN0cmluZworICAgKi8KKyAgc3RyaW5nIHRzX2RlY2xhcmUoKSB7IHJldHVybiAodHNfbW9kdWxlXy5lbXB0eSgpID8gImRlY2xhcmUgIiA6ICIiKTsgfQorCisgIC8qKgorICAgKiBSZXR1cm5zICI/IiBpZiB0aGUgZ2l2ZW4gZmllbGQgaXMgb3B0aW9uYWwgb3IgaGFzIGEgZGVmYXVsdCB2YWx1ZS4KKyAgICogQHBhcmFtIHRfZmllbGQgVGhlIGZpZWxkIHRvIGNoZWNrCisgICAqIEByZXR1cm4gc3RyaW5nCisgICAqLworICBzdHJpbmcgdHNfZ2V0X3JlcSh0X2ZpZWxkKiBmaWVsZCkge3JldHVybiAoZmllbGQtPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMIHx8IGZpZWxkLT5nZXRfdmFsdWUoKSAhPSBOVUxMID8gIj8iIDogIiIpOyB9CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIGRvY3VtZW50YXRpb24sIGlmIHRoZSBwcm92aWRlZCBkb2N1bWVudGFibGUgb2JqZWN0IGhhcyBvbmUuCisgICAqIEBwYXJhbSB0X2RvYyBUaGUgb2JqZWN0IHRvIGdldCB0aGUgZG9jdW1lbnRhdGlvbiBmcm9tCisgICAqIEByZXR1cm4gc3RyaW5nIFRoZSBkb2N1bWVudGF0aW9uCisgICAqLworICBzdHJpbmcgdHNfcHJpbnRfZG9jKHRfZG9jKiB0ZG9jKSB7CisgICAgc3RyaW5nIHJlc3VsdCA9IGVuZGw7CisKKyAgICBpZiAodGRvYy0+aGFzX2RvYygpKSB7CisgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBkb2ModGRvYy0+Z2V0X2RvYygpKTsKKyAgICAgIHN0cmluZyBpdGVtOworCisgICAgICByZXN1bHQgKz0gdHNfaW5kZW50KCkgKyAiLyoqIiArIGVuZGw7CisgICAgICB3aGlsZSAoc3RkOjpnZXRsaW5lKGRvYywgaXRlbSkpIHsKKyAgICAgICAgcmVzdWx0ICs9IHRzX2luZGVudCgpICsgIiAqICIgKyBpdGVtICsgZW5kbDsKKyAgICAgIH0KKyAgICAgIHJlc3VsdCArPSB0c19pbmRlbnQoKSArICIgKi8iICsgZW5kbDsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCitwcml2YXRlOgorICAvKioKKyAgICogVHJ1ZSBpZiB3ZSBzaG91bGQgZ2VuZXJhdGUgTm9kZUpTLWZyaWVuZGx5IFJQQyBzZXJ2aWNlcy4KKyAgICovCisgIGJvb2wgZ2VuX25vZGVfOworCisgIC8qKgorICAgKiBUcnVlIGlmIHdlIHNob3VsZCBnZW5lcmF0ZSBzZXJ2aWNlcyB0aGF0IHVzZSBqUXVlcnkgYWpheCAoYXN5bmMvc3luYykuCisgICAqLworICBib29sIGdlbl9qcXVlcnlfOworCisgIC8qKgorICAgKiBUcnVlIGlmIHdlIHNob3VsZCBnZW5lcmF0ZSBhIFR5cGVTY3JpcHQgRGVmaW5pdGlvbiBGaWxlIGZvciBlYWNoIHNlcnZpY2UuCisgICAqLworICBib29sIGdlbl90c187CisKKyAgLyoqCisgICAqIFRydWUgaWYgd2Ugc2hvdWxkIGdlbmVyYXRlIEVTNiBjb2RlLCBpLmUuIHdpdGggUHJvbWlzZXMKKyAgICovCisgIGJvb2wgZ2VuX2VzNl87CisKKyAgLyoqCisgICAqIFRoZSBuYW1lIG9mIHRoZSBkZWZpbmVkIG1vZHVsZShzKSwgZm9yIFR5cGVTY3JpcHQgRGVmaW5pdGlvbiBGaWxlcy4KKyAgICovCisgIHN0cmluZyB0c19tb2R1bGVfOworCisgIC8qKgorICAgKiBUcnVlIGlmIHdlIHNob3VsZCBub3QgZ2VuZXJhdGUgbmFtZXNwYWNlIG9iamVjdHMgZm9yIG5vZGUuCisgICAqLworICBib29sIG5vX25zXzsKKworICAvKioKKyAgICogVGhlIHZhcmlhYmxlIGRlY29yYXRvciBmb3IgImNvbnN0IiB2YXJpYWJsZXMuIFdpbGwgZGVmYXVsdCB0byAidmFyIiBpZiBpbiBhbiBpbmNvbXBhdGlibGUgbGFuZ3VhZ2UuCisgICAqLworICBzdHJpbmcganNfY29uc3RfdHlwZV87CisKKyAgIC8qKgorICAgKiBUaGUgdmFyaWFibGUgZGVjb3JhdG9yIGZvciAibGV0IiB2YXJpYWJsZXMuIFdpbGwgZGVmYXVsdCB0byAidmFyIiBpZiBpbiBhbiBpbmNvbXBhdGlibGUgbGFuZ3VhZ2UuCisgICAqLworICBzdHJpbmcganNfbGV0X3R5cGVfOworCisgICAvKioKKyAgICogVGhlIGRlZmF1bHQgdmFyaWFibGUgZGVjb3JhdG9yLiBTdXBwb3J0cyBhbGwgamF2YXNjcmlwdCBsYW5ndWFnZXMsIGJ1dCBpcyBub3Qgc2NvcGVkIHRvIGZ1bmN0aW9ucyBvciBjbG9zdXJlcy4KKyAgICovCisgIHN0cmluZyBqc192YXJfdHlwZV87CisKKyAgLyoqCisgICAqIEZpbGUgc3RyZWFtcworICAgKi8KKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3R5cGVzXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3NlcnZpY2VfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfdHlwZXNfdHNfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc2VydmljZV90c187Cit9OworCisvKioKKyAqIFByZXBhcmVzIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0CisgKiBzdHJlYW1zLgorICoKKyAqIEBwYXJhbSB0cHJvZ3JhbSBUaGUgcHJvZ3JhbSB0byBnZW5lcmF0ZQorICovCit2b2lkIHRfanNfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKKyAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5CisgIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7CisKKyAgc3RyaW5nIG91dGRpciA9IGdldF9vdXRfZGlyKCk7CisKKyAgLy8gTWFrZSBvdXRwdXQgZmlsZShzKQorICBzdHJpbmcgZl90eXBlc19uYW1lID0gb3V0ZGlyICsgcHJvZ3JhbV8tPmdldF9uYW1lKCkgKyAiX3R5cGVzLmpzIjsKKyAgZl90eXBlc18ub3BlbihmX3R5cGVzX25hbWUuY19zdHIoKSk7CisKKyAgaWYgKGdlbl90c18pIHsKKyAgICBzdHJpbmcgZl90eXBlc190c19uYW1lID0gb3V0ZGlyICsgcHJvZ3JhbV8tPmdldF9uYW1lKCkgKyAiX3R5cGVzLmQudHMiOworICAgIGZfdHlwZXNfdHNfLm9wZW4oZl90eXBlc190c19uYW1lLmNfc3RyKCkpOworICB9CisKKyAgLy8gUHJpbnQgaGVhZGVyCisgIGZfdHlwZXNfIDw8IGF1dG9nZW5fY29tbWVudCgpOworCisgIGlmICgoZ2VuX25vZGVfIHx8IGdlbl9lczZfKSAmJiBub19uc18pIHsKKyAgICBmX3R5cGVzXyA8PCAiXCJ1c2Ugc3RyaWN0XCI7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKworICBmX3R5cGVzXyA8PCBqc19pbmNsdWRlcygpIDw8IGVuZGwgPDwgcmVuZGVyX2luY2x1ZGVzKCkgPDwgZW5kbDsKKworICBpZiAoZ2VuX3RzXykgeworICAgIGZfdHlwZXNfdHNfIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IHRzX2luY2x1ZGVzKCkgPDwgZW5kbDsKKyAgfQorCisgIGlmIChnZW5fbm9kZV8pIHsKKyAgICBmX3R5cGVzXyA8PCBqc19jb25zdF90eXBlXyA8PCAidHR5cGVzID0gbW9kdWxlLmV4cG9ydHMgPSB7fTsiIDw8IGVuZGw7CisgIH0KKworICBzdHJpbmcgcG5zOworCisgIC8vIHNldHVwIHRoZSBuYW1lc3BhY2UKKyAgLy8gVE9ETyBzaG91bGQgdGhlIG5hbWVzcGFjZSBqdXN0IGJlIGluIHRoZSBkaXJlY3Rvcnkgc3RydWN0dXJlIGZvciBub2RlPworICB2ZWN0b3I8c3RyaW5nPiBuc19waWVjZXMgPSBqc19uYW1lc3BhY2VfcGllY2VzKHByb2dyYW1fKTsKKyAgaWYgKG5zX3BpZWNlcy5zaXplKCkgPiAwKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuc19waWVjZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgIHBucyArPSAoKGkgPT0gMCkgPyAiIiA6ICIuIikgKyBuc19waWVjZXNbaV07CisgICAgICBmX3R5cGVzXyA8PCAiaWYgKHR5cGVvZiAiIDw8IHBucyA8PCAiID09PSAndW5kZWZpbmVkJykgeyIgPDwgZW5kbDsKKyAgICAgIGZfdHlwZXNfIDw8ICIgICIgPDwgcG5zIDw8ICIgPSB7fTsiIDw8IGVuZGw7CisgICAgICBmX3R5cGVzXyA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgICAgaWYgKGdlbl90c18pIHsKKyAgICAgIHRzX21vZHVsZV8gPSBwbnM7CisgICAgICBmX3R5cGVzX3RzXyA8PCAiZGVjbGFyZSBtb2R1bGUgIiA8PCB0c19tb2R1bGVfIDw8ICIgeyI7CisgICAgfQorICB9Cit9CisKKy8qKgorICogUHJpbnRzIHN0YW5kYXJkIGpzIGltcG9ydHMKKyAqLworc3RyaW5nIHRfanNfZ2VuZXJhdG9yOjpqc19pbmNsdWRlcygpIHsKKyAgaWYgKGdlbl9ub2RlXykgeworICAgIHN0cmluZyByZXN1bHQgPSBqc19jb25zdF90eXBlXyArICJ0aHJpZnQgPSByZXF1aXJlKCd0aHJpZnQnKTtcbiIKKyAgICAgICAgKyBqc19jb25zdF90eXBlXyArICJUaHJpZnQgPSB0aHJpZnQuVGhyaWZ0O1xuIjsKKyAgICBpZiAoIWdlbl9lczZfKSB7CisgICAgICByZXN1bHQgKz0ganNfY29uc3RfdHlwZV8gKyAiUSA9IHRocmlmdC5RO1xuIjsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHJldHVybiAiIjsKK30KKworLyoqCisgKiBQcmludHMgc3RhbmRhcmQgdHMgaW1wb3J0cworICovCitzdHJpbmcgdF9qc19nZW5lcmF0b3I6OnRzX2luY2x1ZGVzKCkgeworICBpZiAoZ2VuX25vZGVfKSB7CisgICAgcmV0dXJuIHN0cmluZygKKyAgICAgICAgImltcG9ydCB0aHJpZnQgPSByZXF1aXJlKCd0aHJpZnQnKTtcbiIKKyAgICAgICAgImltcG9ydCBUaHJpZnQgPSB0aHJpZnQuVGhyaWZ0O1xuIgorICAgICAgICAiaW1wb3J0IFEgPSB0aHJpZnQuUTtcbiIpOworICB9CisKKyAgcmV0dXJuICIiOworfQorCisvKioKKyAqIFJlbmRlcnMgYWxsIHRoZSBpbXBvcnRzIG5lY2Vzc2FyeSBmb3IgaW5jbHVkaW5nIGFub3RoZXIgVGhyaWZ0IHByb2dyYW0KKyAqLworc3RyaW5nIHRfanNfZ2VuZXJhdG9yOjpyZW5kZXJfaW5jbHVkZXMoKSB7CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKworICBpZiAoZ2VuX25vZGVfKSB7CisgICAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+JiBpbmNsdWRlcyA9IHByb2dyYW1fLT5nZXRfaW5jbHVkZXMoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluY2x1ZGVzLnNpemUoKTsgKytpKSB7CisgICAgICByZXN1bHQgKz0ganNfY29uc3RfdHlwZV8gKyBtYWtlX3ZhbGlkX25vZGVKc19pZGVudGlmaWVyKGluY2x1ZGVzW2ldLT5nZXRfbmFtZSgpKSArICJfdHR5cGVzID0gcmVxdWlyZSgnLi8iICsgaW5jbHVkZXNbaV0tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICArICJfdHlwZXMnKTtcbiI7CisgICAgfQorICAgIGlmIChpbmNsdWRlcy5zaXplKCkgPiAwKSB7CisgICAgICByZXN1bHQgKz0gIlxuIjsKKyAgICB9CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIENsb3NlIHVwIChvciBkb3duKSBzb21lIGZpbGV6LgorICovCit2b2lkIHRfanNfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7CisgIC8vIENsb3NlIHR5cGVzIGZpbGUocykKKworICBmX3R5cGVzXy5jbG9zZSgpOworCisgIGlmIChnZW5fdHNfKSB7CisgICAgaWYgKCF0c19tb2R1bGVfLmVtcHR5KCkpIHsKKyAgICAgIGZfdHlwZXNfdHNfIDw8ICJ9IjsKKyAgICB9CisgICAgZl90eXBlc190c18uY2xvc2UoKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIFRoaXMgaXMgbm90IGRvbmUgaW4gSlMsIHR5cGVzIGFyZSBhbGwgaW1wbGljaXQuCisgKgorICogQHBhcmFtIHR0eXBlZGVmIFRoZSB0eXBlIGRlZmluaXRpb24KKyAqLwordm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7CisgICh2b2lkKXR0eXBlZGVmOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBjb2RlIGZvciBhbiBlbnVtZXJhdGVkIHR5cGUuIFNpbmNlIGRlZmluZSBpcyBleHBlbnNpdmUgdG8gbG9va3VwCisgKiBpbiBKUywgd2UgdXNlIGEgZ2xvYmFsIGFycmF5IGZvciB0aGlzLgorICoKKyAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KKyAqLwordm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7CisgIGZfdHlwZXNfIDw8IGpzX3R5cGVfbmFtZXNwYWNlKHRlbnVtLT5nZXRfcHJvZ3JhbSgpKSA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiID0geyIgPDwgZW5kbDsKKworICBpZiAoZ2VuX3RzXykgeworICAgIGZfdHlwZXNfdHNfIDw8IHRzX3ByaW50X2RvYyh0ZW51bSkgPDwgdHNfaW5kZW50KCkgPDwgdHNfZGVjbGFyZSgpIDw8ICJlbnVtICIKKyAgICAgICAgICAgICAgICA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiIHsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfdXAoKTsKKworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3QmIGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3IgY19pdGVyOworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgICAgaWYgKGdlbl90c18pIHsKKyAgICAgIGZfdHlwZXNfdHNfIDw8IHRzX2luZGVudCgpIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCB2YWx1ZSA8PCAiLCIgPDwgZW5kbDsKKyAgICAgIC8vIGFkZCAndmFsdWU6IGtleScgaW4gYWRkaXRpb24gdG8gJ2tleTogdmFsdWUnIGZvciBUeXBlU2NyaXB0IGVudW1zCisgICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiJyIgPDwgdmFsdWUgPDwgIicgOiAnIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIicsIiA8PCBlbmRsOworICAgIH0KKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiJyIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInIDogIiA8PCB2YWx1ZTsKKyAgICBpZiAoY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKSAtIDEpIHsKKyAgICAgIGZfdHlwZXNfIDw8ICIsIjsKKyAgICB9CisgICAgZl90eXBlc18gPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisKKyAgZl90eXBlc18gPDwgIn07IiA8PCBlbmRsOworCisgIGlmIChnZW5fdHNfKSB7CisgICAgZl90eXBlc190c18gPDwgdHNfaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZSBhIGNvbnN0YW50IHZhbHVlCisgKi8KK3ZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCkgeworICB0X3R5cGUqIHR5cGUgPSB0Y29uc3QtPmdldF90eXBlKCk7CisgIHN0cmluZyBuYW1lID0gdGNvbnN0LT5nZXRfbmFtZSgpOworICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSA9IHRjb25zdC0+Z2V0X3ZhbHVlKCk7CisKKyAgZl90eXBlc18gPDwganNfdHlwZV9uYW1lc3BhY2UocHJvZ3JhbV8pIDw8IG5hbWUgPDwgIiA9ICI7CisgIGZfdHlwZXNfIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0eXBlLCB2YWx1ZSkgPDwgIjsiIDw8IGVuZGw7CisKKyAgaWYgKGdlbl90c18pIHsKKyAgICBmX3R5cGVzX3RzXyA8PCB0c19wcmludF9kb2ModGNvbnN0KSA8PCB0c19pbmRlbnQoKSA8PCB0c19kZWNsYXJlKCkgPDwganNfY29uc3RfdHlwZV8gPDwgbmFtZSA8PCAiOiAiCisgICAgICAgICAgICAgICAgPDwgdHNfZ2V0X3R5cGUodHlwZSkgPDwgIjsiIDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBQcmludHMgdGhlIHZhbHVlIG9mIGEgY29uc3RhbnQgd2l0aCB0aGUgZ2l2ZW4gdHlwZS4gTm90ZSB0aGF0IHR5cGUgY2hlY2tpbmcKKyAqIGlzIE5PVCBwZXJmb3JtZWQgaW4gdGhpcyBmdW5jdGlvbiBhcyBpdCBpcyBhbHdheXMgcnVuIGJlZm9yZWhhbmQgdXNpbmcgdGhlCisgKiB2YWxpZGF0ZV90eXBlcyBtZXRob2QgaW4gbWFpbi5jYworICovCitzdHJpbmcgdF9qc19nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7CisKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIG91dCA8PCAiJyIgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAiJyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICBvdXQgPDwgKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKKyAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0IDw8IGVtaXRfZG91YmxlX2FzX3N0cmluZyh2YWx1ZS0+Z2V0X2RvdWJsZSgpKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBvdXQgPDwgIm5ldyAiIDw8IGpzX3R5cGVfbmFtZXNwYWNlKHR5cGUtPmdldF9wcm9ncmFtKCkpIDw8IHR5cGUtPmdldF9uYW1lKCkgPDwgIih7IjsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKKyAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7CisgICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgeworICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOworICAgICAgfQorICAgICAgaWYgKHZfaXRlciAhPSB2YWwuYmVnaW4oKSkKKyAgICAgICAgb3V0IDw8ICIsIjsKKyAgICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8IHJlbmRlcl9jb25zdF92YWx1ZShnX3R5cGVfc3RyaW5nLCB2X2l0ZXItPmZpcnN0KTsKKyAgICAgIG91dCA8PCAiIDogIjsKKyAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9KSI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworCisgICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICBvdXQgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBpZiAodl9pdGVyICE9IHZhbC5iZWdpbigpKQorICAgICAgICBvdXQgPDwgIiwiIDw8IGVuZGw7CisKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCByZW5kZXJfY29uc3RfdmFsdWUoa3R5cGUsIHZfaXRlci0+Zmlyc3QpOworCisgICAgICBvdXQgPDwgIiA6ICI7CisgICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHZ0eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkgeworICAgIHRfdHlwZSogZXR5cGU7CisgICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9IGVsc2UgeworICAgICAgZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIH0KKyAgICBvdXQgPDwgIlsiOworICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOworICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgaWYgKHZfaXRlciAhPSB2YWwuYmVnaW4oKSkKKyAgICAgICAgb3V0IDw8ICIsIjsKKyAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZXR5cGUsICp2X2l0ZXIpOworICAgIH0KKyAgICBvdXQgPDwgIl0iOworICB9CisgIHJldHVybiBvdXQuc3RyKCk7Cit9CisKKy8qKgorICogTWFrZSBhIHN0cnVjdAorICovCit2b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgZ2VuZXJhdGVfanNfc3RydWN0KHRzdHJ1Y3QsIGZhbHNlKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZXhjZXB0aW9uLiBCYXNpY2FsbHkgdGhlIHNhbWUKKyAqIGFzIGEgc3RydWN0IGJ1dCBleHRlbmRzIHRoZSBFeGNlcHRpb24gY2xhc3MuCisgKgorICogQHBhcmFtIHR4Y2VwdGlvbiBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgeworICBnZW5lcmF0ZV9qc19zdHJ1Y3QodHhjZXB0aW9uLCB0cnVlKTsKK30KKworLyoqCisgKiBTdHJ1Y3RzIGNhbiBiZSBub3JtYWwgb3IgZXhjZXB0aW9ucy4KKyAqLwordm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfanNfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbikgeworICBnZW5lcmF0ZV9qc19zdHJ1Y3RfZGVmaW5pdGlvbihmX3R5cGVzXywgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKK30KKworLyoqCisgKiBSZXR1cm4gdHlwZSBvZiBjb250YWluZWQgZWxlbWVudHMgZm9yIGEgY29udGFpbmVyIHR5cGUuIEZvciBtYXBzCisgKiB0aGlzIGlzIHR5cGUgb2YgdmFsdWUgKGtleXMgYXJlIGFsd2F5cyBzdHJpbmdzIGluIGpzKQorICovCit0X3R5cGUqIHRfanNfZ2VuZXJhdG9yOjpnZXRfY29udGFpbmVkX3R5cGUodF90eXBlKiB0KSB7CisgIHRfdHlwZSogZXR5cGU7CisgIGlmICh0LT5pc19saXN0KCkpIHsKKyAgICBldHlwZSA9ICgodF9saXN0Kil0KS0+Z2V0X2VsZW1fdHlwZSgpOworICB9IGVsc2UgaWYgKHQtPmlzX3NldCgpKSB7CisgICAgZXR5cGUgPSAoKHRfc2V0Kil0KS0+Z2V0X2VsZW1fdHlwZSgpOworICB9IGVsc2UgeworICAgIGV0eXBlID0gKCh0X21hcCopdCktPmdldF92YWxfdHlwZSgpOworICB9CisgIHJldHVybiBldHlwZTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZGF0YSB0eXBlLiBUaGlzIGlzIG5vdGhpbmcgaW4gSlMKKyAqIHdoZXJlIHRoZSBvYmplY3RzIGFyZSBhbGwganVzdCBhc3NvY2lhdGl2ZSBhcnJheXMgKHVubGVzcyBvZiBjb3Vyc2Ugd2UKKyAqIGRlY2lkZSB0byBzdGFydCB1c2luZyBvYmplY3RzIGZvciB0aGVtLi4uKQorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qc19zdHJ1Y3RfZGVmaW5pdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leHBvcnRlZCkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGlmIChnZW5fbm9kZV8pIHsKKyAgICBzdHJpbmcgcHJlZml4ID0gaGFzX2pzX25hbWVzcGFjZSh0c3RydWN0LT5nZXRfcHJvZ3JhbSgpKSA/IGpzX25hbWVzcGFjZSh0c3RydWN0LT5nZXRfcHJvZ3JhbSgpKSA6IGpzX2NvbnN0X3R5cGVfOworICAgIG91dCA8PCBwcmVmaXggPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PAorICAgICAgKGlzX2V4cG9ydGVkID8gIiA9IG1vZHVsZS5leHBvcnRzLiIgKyB0c3RydWN0LT5nZXRfbmFtZSgpIDogIiIpOworICAgIGlmIChnZW5fdHNfKSB7CisgICAgICBmX3R5cGVzX3RzXyA8PCB0c19wcmludF9kb2ModHN0cnVjdCkgPDwgdHNfaW5kZW50KCkgPDwgdHNfZGVjbGFyZSgpIDw8ICJjbGFzcyAiCisgICAgICAgICAgICAgICAgICA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8IChpc19leGNlcHRpb24gPyAiIGV4dGVuZHMgVGhyaWZ0LlRFeGNlcHRpb24iIDogIiIpCisgICAgICAgICAgICAgICAgICA8PCAiIHsiIDw8IGVuZGw7CisgICAgfQorICB9IGVsc2UgeworICAgIG91dCA8PCBqc19uYW1lc3BhY2UodHN0cnVjdC0+Z2V0X3Byb2dyYW0oKSkgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKTsKKyAgICBpZiAoZ2VuX3RzXykgeworICAgICAgZl90eXBlc190c18gPDwgdHNfcHJpbnRfZG9jKHRzdHJ1Y3QpIDw8IHRzX2luZGVudCgpIDw8IHRzX2RlY2xhcmUoKSA8PCAiY2xhc3MgIgorICAgICAgICAgICAgICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAoaXNfZXhjZXB0aW9uID8gIiBleHRlbmRzIFRocmlmdC5URXhjZXB0aW9uIiA6ICIiKQorICAgICAgICAgICAgICAgICAgPDwgIiB7IiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIGlmIChnZW5fZXM2XykgeworICAgIGlmIChnZW5fbm9kZV8gJiYgaXNfZXhjZXB0aW9uKSB7CisgICAgICBvdXQgPDwgIiA9IGNsYXNzIGV4dGVuZHMgVGhyaWZ0LlRFeGNlcHRpb24geyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8ICIgPSBjbGFzcyB7IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiY29uc3RydWN0b3IoYXJncykgeyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBvdXQgPDwgIiA9IGZ1bmN0aW9uKGFyZ3MpIHsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfdXAoKTsKKworICAvLyBDYWxsIHN1cGVyKCkgbWV0aG9kIG9uIGluaGVyaXRlZCBFcnJvciBjbGFzcworICBpZiAoZ2VuX25vZGVfICYmIGlzX2V4Y2VwdGlvbikgeworICAgIGlmIChnZW5fZXM2XykgeworICAgICAgaW5kZW50KG91dCkgPDwgInN1cGVyKGFyZ3MpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgIlRocmlmdC5URXhjZXB0aW9uLmNhbGwodGhpcywgXCIiIDw8IGpzX25hbWVzcGFjZSh0c3RydWN0LT5nZXRfcHJvZ3JhbSgpKQorICAgICAgICA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICJcIik7IiA8PCBlbmRsOworICAgIH0KKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRoaXMubmFtZSA9IFwiIiA8PCBqc19uYW1lc3BhY2UodHN0cnVjdC0+Z2V0X3Byb2dyYW0oKSkKKyAgICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiXCI7IiA8PCBlbmRsOworICB9CisKKyAgLy8gbWVtYmVycyB3aXRoIGFyZ3VtZW50cworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgc3RyaW5nIGR2YWwgPSBkZWNsYXJlX2ZpZWxkKCptX2l0ZXIsIGZhbHNlLCB0cnVlKTsKKyAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCAmJiAhKHQtPmlzX3N0cnVjdCgpIHx8IHQtPmlzX3hjZXB0aW9uKCkpKSB7CisgICAgICBkdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSwgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSk7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRoaXMuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgZHZhbCA8PCAiOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8IGR2YWwgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICAgIGlmIChnZW5fdHNfKSB7CisgICAgICBpZiAoZ2VuX25vZGVfKSB7CisgICAgICAgIGZfdHlwZXNfdHNfIDw8IHRzX2luZGVudCgpIDw8ICJwdWJsaWMgIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIjogIgorICAgICAgICAgICAgICAgICAgICA8PCB0c19nZXRfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpIDw8ICI7IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl90eXBlc190c18gPDwgdHNfaW5kZW50KCkgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI6ICIKKyAgICAgICAgICAgICAgICAgICAgPDwgdHNfZ2V0X3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIAorICAgIH0KKyAgfQorCisgIC8vIEdlbmVyYXRlIGNvbnN0cnVjdG9yIGZyb20gYXJyYXkKKyAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgeworCisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOworICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCAmJiAodC0+aXNfc3RydWN0KCkgfHwgdC0+aXNfeGNlcHRpb24oKSkpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIKKyAgICAgICAgICAgICAgICAgICAgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHQsICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkpIDw8ICI7IiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKworICAgIC8vIEVhcmx5IHJldHVybnMgZm9yIGV4Y2VwdGlvbnMKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgICBpZiAodC0+aXNfeGNlcHRpb24oKSkgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChhcmdzIGluc3RhbmNlb2YgIiA8PCBqc190eXBlX25hbWVzcGFjZSh0LT5nZXRfcHJvZ3JhbSgpKQorICAgICAgICAgICAgPDwgdC0+Z2V0X25hbWUoKSA8PCAiKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IGluZGVudCgpIDw8ICJ0aGlzLiIKKyAgICAgICAgICAgIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gYXJnczsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgaW5kZW50KCkgPDwgInJldHVybjsiCisgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKworICAgIGluZGVudChvdXQpIDw8ICJpZiAoYXJncykgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpZiAoZ2VuX3RzXykgeworICAgICAgZl90eXBlc190c18gPDwgZW5kbCA8PCB0c19pbmRlbnQoKSA8PCAiY29uc3RydWN0b3IoYXJncz86IHsgIjsKKyAgICB9CisKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKGFyZ3MuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiAhPT0gdW5kZWZpbmVkICYmIGFyZ3MuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiAhPT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCk7CisKKyAgICAgIGlmICh0LT5pc19zdHJ1Y3QoKSkgeworICAgICAgICBvdXQgPDwgKCIgPSBuZXcgIiArIGpzX3R5cGVfbmFtZXNwYWNlKHQtPmdldF9wcm9ncmFtKCkpICsgdC0+Z2V0X25hbWUoKSArCisgICAgICAgICAgICAgICAgIihhcmdzLiIrKCptX2l0ZXIpLT5nZXRfbmFtZSgpICsiKTsiKTsKKyAgICAgICAgb3V0IDw8IGVuZGw7CisgICAgICB9IGVsc2UgaWYgKHQtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgICAgIHRfdHlwZSogZXR5cGUgPSBnZXRfY29udGFpbmVkX3R5cGUodCk7CisgICAgICAgIHN0cmluZyBjb3B5RnVuYyA9IHQtPmlzX21hcCgpID8gIlRocmlmdC5jb3B5TWFwIiA6ICJUaHJpZnQuY29weUxpc3QiOworICAgICAgICBzdHJpbmcgdHlwZV9saXN0ID0gIiI7CisKKyAgICAgICAgd2hpbGUgKGV0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgICAgICAgIGlmICh0eXBlX2xpc3QubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICB0eXBlX2xpc3QgKz0gIiwgIjsKKyAgICAgICAgICB9CisgICAgICAgICAgdHlwZV9saXN0ICs9IGV0eXBlLT5pc19tYXAoKSA/ICJUaHJpZnQuY29weU1hcCIgOiAiVGhyaWZ0LmNvcHlMaXN0IjsKKyAgICAgICAgICBldHlwZSA9IGdldF9jb250YWluZWRfdHlwZShldHlwZSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZXR5cGUtPmlzX3N0cnVjdCgpKSB7CisgICAgICAgICAgaWYgKHR5cGVfbGlzdC5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgIHR5cGVfbGlzdCArPSAiLCAiOworICAgICAgICAgIH0KKyAgICAgICAgICB0eXBlX2xpc3QgKz0ganNfdHlwZV9uYW1lc3BhY2UoZXR5cGUtPmdldF9wcm9ncmFtKCkpICsgZXR5cGUtPmdldF9uYW1lKCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgaWYgKHR5cGVfbGlzdC5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgIHR5cGVfbGlzdCArPSAiLCAiOworICAgICAgICAgIH0KKyAgICAgICAgICB0eXBlX2xpc3QgKz0gIm51bGwiOworICAgICAgICB9CisKKyAgICAgICAgb3V0IDw8ICgiID0gIiArIGNvcHlGdW5jICsgIihhcmdzLiIgKyAoKm1faXRlciktPmdldF9uYW1lKCkgKworICAgICAgICAgICAgICAgICIsIFsiICsgdHlwZV9saXN0ICsgIl0pOyIpOworICAgICAgICBvdXQgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCAiID0gYXJncy4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGlmICghKCptX2l0ZXIpLT5nZXRfcmVxKCkpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICAgICAgICAgaW5kZW50KG91dCkKKyAgICAgICAgICAgIDw8ICIgIHRocm93IG5ldyBUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uKFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb25UeXBlLlVOS05PV04sICIKKyAgICAgICAgICAgICAgICInUmVxdWlyZWQgZmllbGQgIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiBpcyB1bnNldCEnKTsiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIGlmIChnZW5fdHNfKSB7CisgICAgICAgIGZfdHlwZXNfdHNfIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCB0c19nZXRfcmVxKCptX2l0ZXIpIDw8ICI6ICIKKyAgICAgICAgICAgICAgICAgICAgPDwgdHNfZ2V0X3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiOyAiOworICAgICAgfQorICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICBpZiAoZ2VuX3RzXykgeworICAgICAgZl90eXBlc190c18gPDwgIn0pOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICAvLyBEb25lIHdpdGggY29uc3RydWN0b3IKKyAgaW5kZW50X2Rvd24oKTsKKyAgaWYgKGdlbl9lczZfKSB7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCAifTsiIDw8IGVuZGw7CisgIH0KKworICBpZiAoZ2VuX3RzXykgeworICAgIGZfdHlwZXNfdHNfIDw8IHRzX2luZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9CisKKyAgaWYgKCFnZW5fZXM2XykgeworICAgIGlmIChpc19leGNlcHRpb24pIHsKKyAgICAgIG91dCA8PCAiVGhyaWZ0LmluaGVyaXRzKCIgPDwganNfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkKKyAgICAgICAgICA8PCAiLCBUaHJpZnQuVEV4Y2VwdGlvbik7IiA8PCBlbmRsOworICAgICAgb3V0IDw8IGpzX25hbWVzcGFjZSh0c3RydWN0LT5nZXRfcHJvZ3JhbSgpKSA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIucHJvdG90eXBlLm5hbWUgPSAnIgorICAgICAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIic7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICAvLyBpbml0IHByb3RvdHlwZSBtYW51YWxseSBpZiB3ZSBhcmVuJ3QgdXNpbmcgZXM2CisgICAgICBvdXQgPDwganNfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIi5wcm90b3R5cGUgPSB7fTsiCisgICAgICAgICAgPDwgZW5kbDsKKyAgICB9CisKKyAgfQorCisgIGdlbmVyYXRlX2pzX3N0cnVjdF9yZWFkZXIob3V0LCB0c3RydWN0KTsKKyAgZ2VuZXJhdGVfanNfc3RydWN0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOworCisgIC8vIENsb3NlIG91dCB0aGUgY2xhc3MgZGVmaW5pdGlvbgorICBpZiAoZ2VuX2VzNl8pIHsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9OyIgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyB0aGUgcmVhZCgpIG1ldGhvZCBmb3IgYSBzdHJ1Y3QKKyAqLwordm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfanNfc3RydWN0X3JlYWRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBpZiAoZ2VuX2VzNl8pIHsKKyAgICBpbmRlbnQob3V0KSA8PCAicmVhZCAoaW5wdXQpIHsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwganNfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkKKyAgICAgICAgPDwgIi5wcm90b3R5cGUucmVhZCA9IGZ1bmN0aW9uKGlucHV0KSB7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KG91dCkgPDwgImlucHV0LnJlYWRTdHJ1Y3RCZWdpbigpOyIgPDwgZW5kbDsKKworICAvLyBMb29wIG92ZXIgcmVhZGluZyBpbiBmaWVsZHMKKyAgaW5kZW50KG91dCkgPDwgIndoaWxlICh0cnVlKSB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIGluZGVudChvdXQpIDw8IGpzX2NvbnN0X3R5cGVfIDw8ICJyZXQgPSBpbnB1dC5yZWFkRmllbGRCZWdpbigpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwganNfY29uc3RfdHlwZV8gPDwgImZ0eXBlID0gcmV0LmZ0eXBlOyIgPDwgZW5kbDsKKyAgaWYgKCFmaWVsZHMuZW1wdHkoKSkgeworICAgIGluZGVudChvdXQpIDw8IGpzX2NvbnN0X3R5cGVfIDw8ICJmaWQgPSByZXQuZmlkOyIgPDwgZW5kbDsKKyAgfQorCisgIC8vIENoZWNrIGZvciBmaWVsZCBTVE9QIG1hcmtlciBhbmQgYnJlYWsKKyAgaW5kZW50KG91dCkgPDwgImlmIChmdHlwZSA9PSBUaHJpZnQuVHlwZS5TVE9QKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIGlmICghZmllbGRzLmVtcHR5KCkpIHsKKyAgICAvLyBTd2l0Y2ggc3RhdGVtZW50IG9uIHRoZSBmaWVsZCB3ZSBhcmUgcmVhZGluZworICAgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKGZpZCkgeyIgPDwgZW5kbDsKKworICAgIGluZGVudF91cCgpOworCisgICAgLy8gR2VuZXJhdGUgZGVzZXJpYWxpemF0aW9uIGNvZGUgZm9yIGtub3duIGNhc2VzCisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKworICAgICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOiIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoZnR5cGUgPT0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiKSB7IiA8PCBlbmRsOworCisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMuIik7CisgICAgICBpbmRlbnRfZG93bigpOworCisgICAgICBpbmRlbnQob3V0KSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisKKyAgICAgIGluZGVudChvdXQpIDw8ICIgIGlucHV0LnNraXAoZnR5cGUpOyIgPDwgZW5kbDsKKworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgICAgfQorICAgIGlmIChmaWVsZHMuc2l6ZSgpID09IDEpIHsKKyAgICAgIC8vIHBzZXVkbyBjYXNlIHRvIG1ha2UganNsaW50IGhhcHB5CisgICAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAwOiIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgIGlucHV0LnNraXAoZnR5cGUpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgIGJyZWFrOyIgPDwgZW5kbDsKKyAgICB9CisgICAgLy8gSW4gdGhlIGRlZmF1bHQgY2FzZSB3ZSBza2lwIHRoZSBmaWVsZAorICAgIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICBpbnB1dC5za2lwKGZ0eXBlKTsiIDw8IGVuZGw7CisKKyAgICBzY29wZV9kb3duKG91dCk7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgImlucHV0LnNraXAoZnR5cGUpOyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudChvdXQpIDw8ICJpbnB1dC5yZWFkRmllbGRFbmQoKTsiIDw8IGVuZGw7CisKKyAgc2NvcGVfZG93bihvdXQpOworCisgIGluZGVudChvdXQpIDw8ICJpbnB1dC5yZWFkU3RydWN0RW5kKCk7IiA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJyZXR1cm47IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisKKyAgaWYgKGdlbl9lczZfKSB7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCAifTsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyB0aGUgd3JpdGUoKSBtZXRob2QgZm9yIGEgc3RydWN0CisgKi8KK3ZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX2pzX3N0cnVjdF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBpZiAoZ2VuX2VzNl8pIHsKKyAgICBpbmRlbnQob3V0KSA8PCAid3JpdGUgKG91dHB1dCkgeyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCBqc19uYW1lc3BhY2UodHN0cnVjdC0+Z2V0X3Byb2dyYW0oKSkgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKQorICAgICAgICA8PCAiLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKG91dHB1dCkgeyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF91cCgpOworCisgIGluZGVudChvdXQpIDw8ICJvdXRwdXQud3JpdGVTdHJ1Y3RCZWdpbignIiA8PCBuYW1lIDw8ICInKTsiIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICh0aGlzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIT09IG51bGwgJiYgdGhpcy4iCisgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9PSB1bmRlZmluZWQpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBpbmRlbnQob3V0KSA8PCAib3V0cHV0LndyaXRlRmllbGRCZWdpbigiCisgICAgICAgICAgICAgICAgPDwgIiciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJywgIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKQorICAgICAgICAgICAgICAgIDw8ICIsICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIik7IiA8PCBlbmRsOworCisgICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAidGhpcy4iKTsKKworICAgIGluZGVudChvdXQpIDw8ICJvdXRwdXQud3JpdGVGaWVsZEVuZCgpOyIgPDwgZW5kbDsKKworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKworICBvdXQgPDwgaW5kZW50KCkgPDwgIm91dHB1dC53cml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3V0cHV0LndyaXRlU3RydWN0RW5kKCk7IgorICAgICAgPDwgZW5kbDsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaWYgKGdlbl9lczZfKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9OyIgPDwgZW5kbCA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdGhyaWZ0IHNlcnZpY2UuCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGRlZmluaXRpb24KKyAqLwordm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBmX3NlcnZpY2VfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBzZXJ2aWNlX25hbWVfICsgIi5qcyI7CisgIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKKworICBpZiAoZ2VuX3RzXykgeworICAgIHN0cmluZyBmX3NlcnZpY2VfdHNfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBzZXJ2aWNlX25hbWVfICsgIi5kLnRzIjsKKyAgICBmX3NlcnZpY2VfdHNfLm9wZW4oZl9zZXJ2aWNlX3RzX25hbWUuY19zdHIoKSk7CisgIH0KKworICBmX3NlcnZpY2VfIDw8IGF1dG9nZW5fY29tbWVudCgpOworCisgIGlmICgoZ2VuX25vZGVfIHx8IGdlbl9lczZfKSAmJiBub19uc18pIHsKKyAgICBmX3NlcnZpY2VfIDw8ICJcInVzZSBzdHJpY3RcIjsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIGZfc2VydmljZV8gPDwganNfaW5jbHVkZXMoKSA8PCBlbmRsIDw8IHJlbmRlcl9pbmNsdWRlcygpIDw8IGVuZGw7CisKKyAgaWYgKGdlbl90c18pIHsKKyAgICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgICAgZl9zZXJ2aWNlX3RzXyA8PCAiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIiIgPDwgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgPDwgIi5kLnRzXCIgLz4iIDw8IGVuZGw7CisgICAgfQorICAgIGZfc2VydmljZV90c18gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbDsKKyAgICBpZiAoZ2VuX25vZGVfKSB7CisgICAgICBmX3NlcnZpY2VfdHNfIDw8IHRzX2luY2x1ZGVzKCkgPDwgZW5kbDsKKyAgICAgIGZfc2VydmljZV90c18gPDwgImltcG9ydCB0dHlwZXMgPSByZXF1aXJlKCcuLyIgKyBwcm9ncmFtXy0+Z2V0X25hbWUoKSArICJfdHlwZXMnKTsiIDw8IGVuZGw7CisgICAgICAvLyBHZW5lcmF0ZSB0eXBlIGFsaWFzZXMKKyAgICAgIC8vIGVudW0KKyAgICAgIHZlY3Rvcjx0X2VudW0qPiBjb25zdCYgZW51bXMgPSBwcm9ncmFtXy0+Z2V0X2VudW1zKCk7CisgICAgICB2ZWN0b3I8dF9lbnVtKj46OmNvbnN0X2l0ZXJhdG9yIGVfaXRlcjsKKyAgICAgIGZvciAoZV9pdGVyID0gZW51bXMuYmVnaW4oKTsgZV9pdGVyICE9IGVudW1zLmVuZCgpOyArK2VfaXRlcikgeworICAgICAgICBmX3NlcnZpY2VfdHNfIDw8ICJpbXBvcnQgIiA8PCAoKmVfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IHR0eXBlcy4iCisgICAgICAgICAgICAgICAgICA8PCBqc19uYW1lc3BhY2UocHJvZ3JhbV8pIDw8ICgqZV9pdGVyKS0+Z2V0X25hbWUoKSA8PCBlbmRsOworICAgICAgfQorICAgICAgLy8gY29uc3QKKyAgICAgIHZlY3Rvcjx0X2NvbnN0Kj4gY29uc3QmIGNvbnN0cyA9IHByb2dyYW1fLT5nZXRfY29uc3RzKCk7CisgICAgICB2ZWN0b3I8dF9jb25zdCo+Ojpjb25zdF9pdGVyYXRvciBjX2l0ZXI7CisgICAgICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgeworICAgICAgICBmX3NlcnZpY2VfdHNfIDw8ICJpbXBvcnQgIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IHR0eXBlcy4iCisgICAgICAgICAgICAgICAgICA8PCBqc19uYW1lc3BhY2UocHJvZ3JhbV8pIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCBlbmRsOworICAgICAgfQorICAgICAgLy8gZXhjZXB0aW9uCisgICAgICB2ZWN0b3I8dF9zdHJ1Y3QqPiBjb25zdCYgZXhjZXB0aW9ucyA9IHByb2dyYW1fLT5nZXRfeGNlcHRpb25zKCk7CisgICAgICB2ZWN0b3I8dF9zdHJ1Y3QqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworICAgICAgZm9yICh4X2l0ZXIgPSBleGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSBleGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgICBmX3NlcnZpY2VfdHNfIDw8ICJpbXBvcnQgIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IHR0eXBlcy4iCisgICAgICAgICAgICAgICAgICA8PCBqc19uYW1lc3BhY2UocHJvZ3JhbV8pIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCBlbmRsOworICAgICAgfQorICAgICAgLy8gc3RydWN0cworICAgICAgdmVjdG9yPHRfc3RydWN0Kj4gY29uc3QmIHN0cnVjdHMgPSBwcm9ncmFtXy0+Z2V0X3N0cnVjdHMoKTsKKyAgICAgIHZlY3Rvcjx0X3N0cnVjdCo+Ojpjb25zdF9pdGVyYXRvciBzX2l0ZXI7CisgICAgICBmb3IgKHNfaXRlciA9IHN0cnVjdHMuYmVnaW4oKTsgc19pdGVyICE9IHN0cnVjdHMuZW5kKCk7ICsrc19pdGVyKSB7CisgICAgICAgIGZfc2VydmljZV90c18gPDwgImltcG9ydCAiIDw8ICgqc19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gdHR5cGVzLiIKKyAgICAgICAgICAgICAgICAgIDw8IGpzX25hbWVzcGFjZShwcm9ncmFtXykgPDwgKCpzX2l0ZXIpLT5nZXRfbmFtZSgpIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorICAgIGlmICghdHNfbW9kdWxlXy5lbXB0eSgpKSB7CisgICAgICBmX3NlcnZpY2VfdHNfIDw8ICJkZWNsYXJlIG1vZHVsZSAiIDw8IHRzX21vZHVsZV8gPDwgIiB7IjsKKyAgICB9CisgIH0KKworICBpZiAoZ2VuX25vZGVfKSB7CisgICAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICAgIGZfc2VydmljZV8gPDwganNfY29uc3RfdHlwZV8gPDwgIHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpIDw8ICIgPSByZXF1aXJlKCcuLyIKKyAgICAgICAgICAgICAgICAgPDwgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkgPDwgIicpOyIgPDwgZW5kbCA8PCBqc19jb25zdF90eXBlXworICAgICAgICAgICAgICAgICA8PCB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICA8PCAiQ2xpZW50ID0gIiA8PCB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSA8PCAiLkNsaWVudDsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwganNfY29uc3RfdHlwZV8gPDwgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgPDwgIlByb2Nlc3NvciA9ICIgPDwgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkgPDwgIi5Qcm9jZXNzb3I7IiA8PCBlbmRsOworICAgIH0KKworICAgIGZfc2VydmljZV8gPDwganNfY29uc3RfdHlwZV8gPDwgInR0eXBlcyA9IHJlcXVpcmUoJy4vIiArIHByb2dyYW1fLT5nZXRfbmFtZSgpICsgIl90eXBlcycpOyIgPDwgZW5kbDsKKyAgfQorCisgIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UpOworCisgIGlmIChnZW5fbm9kZV8pIHsKKyAgICBnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3Nvcih0c2VydmljZSk7CisgIH0KKworICBmX3NlcnZpY2VfLmNsb3NlKCk7CisgIGlmIChnZW5fdHNfKSB7CisgICAgaWYgKCF0c19tb2R1bGVfLmVtcHR5KCkpIHsKKyAgICAgIGZfc2VydmljZV90c18gPDwgIn0iOworICAgIH0KKyAgICBmX3NlcnZpY2VfdHNfLmNsb3NlKCk7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIHNlcnZlciBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCisgKi8KK3ZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfcHJvY2Vzc29yKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgaWYgKGdlbl9ub2RlXykgeworICAgIHN0cmluZyBwcmVmaXggPSBoYXNfanNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSA/IGpzX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgOiBqc19jb25zdF90eXBlXzsKKyAgICBmX3NlcnZpY2VfIDw8IHByZWZpeCA8PCBzZXJ2aWNlX25hbWVfIDw8ICJQcm9jZXNzb3IgPSAiIDw8ICJleHBvcnRzLlByb2Nlc3NvciI7CisgICAgaWYgKGdlbl90c18pIHsKKyAgICAgIGZfc2VydmljZV90c18gPDwgZW5kbCA8PCAiZGVjbGFyZSBjbGFzcyBQcm9jZXNzb3IgIjsKKyAgICAgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgICAgIGZfc2VydmljZV90c18gPDwgImV4dGVuZHMgIiA8PCB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSA8PCAiUHJvY2Vzc29yICI7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfdHNfIDw8ICJ7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3NlcnZpY2VfdHNfIDw8IHRzX2luZGVudCgpIDw8ICJwcml2YXRlIF9oYW5kbGVyOiBPYmplY3Q7IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgICBmX3NlcnZpY2VfdHNfIDw8IHRzX2luZGVudCgpIDw8ICJjb25zdHJ1Y3RvcihoYW5kbGVyOiBPYmplY3QpOyIgPDwgZW5kbDsKKyAgICAgIGZfc2VydmljZV90c18gPDwgdHNfaW5kZW50KCkgPDwgInByb2Nlc3MoaW5wdXQ6IFRocmlmdC5USlNPTlByb3RvY29sLCBvdXRwdXQ6IFRocmlmdC5USlNPTlByb3RvY29sKTogdm9pZDsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBmX3NlcnZpY2VfIDw8IGpzX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgPDwgc2VydmljZV9uYW1lXyA8PCAiUHJvY2Vzc29yID0gIgorICAgICAgICAgICAgIDw8ICJleHBvcnRzLlByb2Nlc3NvciI7CisgIH0KKworICBib29sIGlzX3N1YmNsYXNzX3NlcnZpY2UgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMOworCisgIC8vIEVTNiBDb25zdHJ1Y3RvcgorICBpZiAoZ2VuX2VzNl8pIHsKKyAgICBpZiAoaXNfc3ViY2xhc3Nfc2VydmljZSkgeworICAgICAgZl9zZXJ2aWNlXyA8PCAiID0gY2xhc3MgZXh0ZW5kcyAiIDw8IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpIDw8ICJQcm9jZXNzb3IgeyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgZl9zZXJ2aWNlXyA8PCAiID0gY2xhc3MgeyIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJjb25zdHJ1Y3RvcihoYW5kbGVyKSB7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGZfc2VydmljZV8gPDwgIiA9IGZ1bmN0aW9uKGhhbmRsZXIpIHsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfdXAoKTsKKyAgaWYgKGdlbl9lczZfICYmIGlzX3N1YmNsYXNzX3NlcnZpY2UpIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInN1cGVyKGhhbmRsZXIpOyIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInRoaXMuX2hhbmRsZXIgPSBoYW5kbGVyOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKworICAvLyBEb25lIHdpdGggY29uc3RydWN0b3IKKyAgaWYgKGdlbl9lczZfKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifTsiIDw8IGVuZGw7CisgIH0KKworICAvLyBFUzUgc2VydmljZSBpbmhlcml0YW5jZQorICBpZiAoIWdlbl9lczZfICYmIGlzX3N1YmNsYXNzX3NlcnZpY2UpIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlRocmlmdC5pbmhlcml0cygiIDw8IGpzX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lXyA8PCAiUHJvY2Vzc29yLCAiIDw8IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICJQcm9jZXNzb3IpOyIgPDwgZW5kbDsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHRoZSBzZXJ2ZXIgaW1wbGVtZW50YXRpb24KKyAgaWYgKGdlbl9lczZfKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwcm9jZXNzIChpbnB1dCwgb3V0cHV0KSB7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpIDw8IHNlcnZpY2VfbmFtZV8KKyAgICAgICAgICAgICAgICAgICAgICA8PCAiUHJvY2Vzc29yLnByb3RvdHlwZS5wcm9jZXNzID0gZnVuY3Rpb24oaW5wdXQsIG91dHB1dCkgeyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF91cCgpOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCBqc19jb25zdF90eXBlXyA8PCAiciA9IGlucHV0LnJlYWRNZXNzYWdlQmVnaW4oKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAiaWYgKHRoaXNbJ3Byb2Nlc3NfJyArIHIuZm5hbWVdKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgIiAgcmV0dXJuIHRoaXNbJ3Byb2Nlc3NfJyArIHIuZm5hbWVdLmNhbGwodGhpcywgci5yc2VxaWQsIGlucHV0LCBvdXRwdXQpOyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBpbnB1dC5za2lwKFRocmlmdC5UeXBlLlNUUlVDVCk7IgorICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgaW5wdXQucmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAiICAiIDw8IGpzX2NvbnN0X3R5cGVfIDw8ICJ4ID0gbmV3ICIKKyAgICAgICAgICAgICAgICAiVGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUaHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uVHlwZS5VTktOT1dOX01FVEhPRCwgIgorICAgICAgICAgICAgICAgICInVW5rbm93biBmdW5jdGlvbiAnICsgci5mbmFtZSk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgIiAgb3V0cHV0LndyaXRlTWVzc2FnZUJlZ2luKHIuZm5hbWUsIFRocmlmdC5NZXNzYWdlVHlwZS5FWENFUFRJT04sIHIucnNlcWlkKTsiCisgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICB4LndyaXRlKG91dHB1dCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgIiAgb3V0cHV0LndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBvdXRwdXQuZmx1c2goKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpZiAoZ2VuX2VzNl8pIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9OyIgPDwgZW5kbDsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzIHN1YmZ1bmN0aW9ucworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odHNlcnZpY2UsICpmX2l0ZXIpOworICB9CisKKyAgLy8gQ2xvc2Ugb2ZmIHRoZSBwcm9jZXNzb3IgY2xhc3MgZGVmaW5pdGlvbgorICBpZiAoZ2VuX2VzNl8pIHsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifTsiIDw8IGVuZGw7CisgIH0KKyAgaWYgKGdlbl9ub2RlXyAmJiBnZW5fdHNfKSB7CisgICAgZl9zZXJ2aWNlX3RzXyA8PCAifSIgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHByb2Nlc3MgZnVuY3Rpb24gZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byB3cml0ZSBhIGRpc3BhdGNoZXIgZm9yCisgKi8KK3ZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIGlmIChnZW5fZXM2XykgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJvY2Vzc18iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIiAoc2VxaWQsIGlucHV0LCBvdXRwdXQpIHsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGpzX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgPDwgc2VydmljZV9uYW1lXworICAgICAgICAgICAgICAgICAgICAgIDw8ICJQcm9jZXNzb3IucHJvdG90eXBlLnByb2Nlc3NfIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICArICIgPSBmdW5jdGlvbihzZXFpZCwgaW5wdXQsIG91dHB1dCkgeyIgPDwgZW5kbDsKKyAgfQorICBpZiAoZ2VuX3RzXykgeworICAgIGluZGVudF91cCgpOworICAgIGZfc2VydmljZV90c18gPDwgdHNfaW5kZW50KCkgPDwgInByb2Nlc3NfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIihzZXFpZDogbnVtYmVyLCBpbnB1dDogVGhyaWZ0LlRKU09OUHJvdG9jb2wsIG91dHB1dDogVGhyaWZ0LlRKU09OUHJvdG9jb2wpOiB2b2lkOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgaW5kZW50X3VwKCk7CisKKyAgc3RyaW5nIGFyZ3NuYW1lID0ganNfbmFtZXNwYWNlKHByb2dyYW1fKSArIHNlcnZpY2VfbmFtZV8gKyAiXyIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX2FyZ3MiOworICBzdHJpbmcgcmVzdWx0bmFtZSA9IGpzX25hbWVzcGFjZShwcm9ncmFtXykgKyBzZXJ2aWNlX25hbWVfICsgIl8iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgKyAiX3Jlc3VsdCI7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8IGpzX2NvbnN0X3R5cGVfIDw8ICJhcmdzID0gbmV3ICIgPDwgYXJnc25hbWUgPDwgIigpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICJhcmdzLnJlYWQoaW5wdXQpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaW5wdXQucmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIGZ1bmN0aW9uIGNhbGwKKyAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIC8vIFNob3J0Y3V0IG91dCBoZXJlIGZvciBvbmV3YXkgZnVuY3Rpb25zCisgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ0aGlzLl9oYW5kbGVyLiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIjsKKworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKKyAgICAgIH0KKyAgICAgIGZfc2VydmljZV8gPDwgImFyZ3MuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgICAgfQorCisgICAgZl9zZXJ2aWNlXyA8PCAiKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKworICAgIGlmIChnZW5fZXM2XykgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn07IiA8PCBlbmRsOworICAgIH0KKyAgICByZXR1cm47CisgIH0KKworICAvLyBQcm9taXNlIHN0eWxlIGludm9jYXRpb24KKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpZiAodGhpcy5faGFuZGxlci4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgIDw8ICIubGVuZ3RoID09PSAiIDw8IGZpZWxkcy5zaXplKCkgPDwgIikgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaWYgKGdlbl9lczZfKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJQcm9taXNlLnJlc29sdmUodGhpcy5faGFuZGxlci4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiLmJpbmQodGhpcy5faGFuZGxlcikoIiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHN0cmluZyBtYXliZUNvbW1hID0gKGZpZWxkcy5zaXplKCkgPiAwID8gIiwiIDogIiIpOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiUS5mY2FsbCh0aGlzLl9oYW5kbGVyLiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIuYmluZCh0aGlzLl9oYW5kbGVyKSIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgbWF5YmVDb21tYSA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X3VwKCk7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgc3RyaW5nIG1heWJlQ29tbWEgPSAoZl9pdGVyICE9IGZpZWxkcy5lbmQoKSAtIDEgPyAiLCIgOiAiIik7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJhcmdzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8IG1heWJlQ29tbWEgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bigpOworCisgIGlmIChnZW5fZXM2XykgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiKSkudGhlbihyZXN1bHQgPT4geyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIikudGhlbihmdW5jdGlvbihyZXN1bHQpIHsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfdXAoKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBqc19jb25zdF90eXBlXyA8PCAicmVzdWx0X29iaiA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIih7c3VjY2VzczogcmVzdWx0fSk7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm91dHB1dC53cml0ZU1lc3NhZ2VCZWdpbihcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgPDwgIlwiLCBUaHJpZnQuTWVzc2FnZVR5cGUuUkVQTFksIHNlcWlkKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAicmVzdWx0X29iai53cml0ZShvdXRwdXQpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3V0cHV0LndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJvdXRwdXQuZmx1c2goKTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisKKyAgaWYgKGdlbl9lczZfKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9KS5jYXRjaChlcnIgPT4geyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHsiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCBqc19sZXRfdHlwZV8gPDwgInJlc3VsdDsiIDw8IGVuZGw7CisKKyAgYm9vbCBoYXNfZXhjZXB0aW9uID0gZmFsc2U7CisgIHRfc3RydWN0KiBleGNlcHRpb25zID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGlmIChleGNlcHRpb25zKSB7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IGV4Y2VwdGlvbnMtPmdldF9tZW1iZXJzKCk7CisgICAgZm9yICh2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1lbWJlcnMuYmVnaW4oKTsgaXQgIT0gbWVtYmVycy5lbmQoKTsgKytpdCkgeworICAgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKml0KS0+Z2V0X3R5cGUoKSk7CisgICAgICBpZiAodC0+aXNfeGNlcHRpb24oKSkgeworICAgICAgICBpZiAoIWhhc19leGNlcHRpb24pIHsKKyAgICAgICAgICBoYXNfZXhjZXB0aW9uID0gdHJ1ZTsKKyAgICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImlmIChlcnIgaW5zdGFuY2VvZiAiIDw8IGpzX3R5cGVfbmFtZXNwYWNlKHQtPmdldF9wcm9ncmFtKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHQtPmdldF9uYW1lKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCAiIHx8IGVyciBpbnN0YW5jZW9mICIgPDwganNfdHlwZV9uYW1lc3BhY2UodC0+Z2V0X3Byb2dyYW0oKSkKKyAgICAgICAgICAgICAgICAgICAgIDw8IHQtPmdldF9uYW1lKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAoaGFzX2V4Y2VwdGlvbikgeworICAgIGZfc2VydmljZV8gPDwgIikgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIoZXJyKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICJvdXRwdXQud3JpdGVNZXNzYWdlQmVnaW4oXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgPDwgIlwiLCBUaHJpZnQuTWVzc2FnZVR5cGUuUkVQTFksIHNlcWlkKTsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgIH0KKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQgPSBuZXcgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb25UeXBlLlVOS05PV04sIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZXJyLm1lc3NhZ2UpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3V0cHV0LndyaXRlTWVzc2FnZUJlZ2luKFwiIgorICAgICAgICAgICAgIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCIsIFRocmlmdC5NZXNzYWdlVHlwZS5FWENFUFRJT04sIHNlcWlkKTsiIDw8IGVuZGw7CisKKyAgaWYgKGhhc19leGNlcHRpb24pIHsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKKyAgfQorCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJlc3VsdC53cml0ZShvdXRwdXQpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICJvdXRwdXQud3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvdXRwdXQuZmx1c2goKTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSk7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICAvLyBFbmQgcHJvbWlzZSBzdHlsZSBpbnZvY2F0aW9uCisKKyAgLy8gQ2FsbGJhY2sgc3R5bGUgaW52b2NhdGlvbgorICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ0aGlzLl9oYW5kbGVyLiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIjsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGZfc2VydmljZV8gPDwgImFyZ3MuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiwgIjsKKyAgfQorCisgIGlmIChnZW5fZXM2XykgeworICAgIGZfc2VydmljZV8gPDwgIihlcnIsIHJlc3VsdCkgPT4geyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBmX3NlcnZpY2VfIDw8ICJmdW5jdGlvbiAoZXJyLCByZXN1bHQpIHsiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCBqc19sZXRfdHlwZV8gPDwgInJlc3VsdF9vYmo7IiA8PCBlbmRsOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaWYgKChlcnIgPT09IG51bGwgfHwgdHlwZW9mIGVyciA9PT0gJ3VuZGVmaW5lZCcpIjsKKyAgaWYgKGhhc19leGNlcHRpb24pIHsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gZXhjZXB0aW9ucy0+Z2V0X21lbWJlcnMoKTsKKyAgICBmb3IgKHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbWVtYmVycy5iZWdpbigpOyBpdCAhPSBtZW1iZXJzLmVuZCgpOyArK2l0KSB7CisgICAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqaXQpLT5nZXRfdHlwZSgpKTsKKyAgICAgIGlmICh0LT5pc194Y2VwdGlvbigpKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgIiB8fCBlcnIgaW5zdGFuY2VvZiAiIDw8IGpzX3R5cGVfbmFtZXNwYWNlKHQtPmdldF9wcm9ncmFtKCkpIDw8IHQtPmdldF9uYW1lKCk7CisgICAgICB9CisgICAgfQorICB9CisgIGZfc2VydmljZV8gPDwgIikgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJlc3VsdF9vYmogPSBuZXcgIiA8PCByZXN1bHRuYW1lCisgICAgICAgICAgICAgPDwgIigoZXJyICE9PSBudWxsIHx8IHR5cGVvZiBlcnIgPT09ICd1bmRlZmluZWQnKSA/IGVyciA6IHtzdWNjZXNzOiByZXN1bHR9KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAib3V0cHV0LndyaXRlTWVzc2FnZUJlZ2luKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICA8PCAiXCIsIFRocmlmdC5NZXNzYWdlVHlwZS5SRVBMWSwgc2VxaWQpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJlc3VsdF9vYmogPSBuZXcgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb25UeXBlLlVOS05PV04sIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZXJyLm1lc3NhZ2UpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3V0cHV0LndyaXRlTWVzc2FnZUJlZ2luKFwiIgorICAgICAgICAgICAgIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCIsIFRocmlmdC5NZXNzYWdlVHlwZS5FWENFUFRJT04sIHNlcWlkKTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJlc3VsdF9vYmoud3JpdGUob3V0cHV0KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAib3V0cHV0LndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3V0cHV0LmZsdXNoKCk7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSk7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7CisgIC8vIEVuZCBjYWxsYmFjayBzdHlsZSBpbnZvY2F0aW9uCisKKyAgaW5kZW50X2Rvd24oKTsKKworICBpZiAoZ2VuX2VzNl8pIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9OyIgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBoZWxwZXIgZnVuY3Rpb25zIGZvciBhIHNlcnZpY2UuCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCisgKi8KK3ZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIC8vIERvIG5vdCBnZW5lcmF0ZSBUUyBkZWZpbml0aW9ucyBmb3IgaGVscGVyIGZ1bmN0aW9ucworICBib29sIGdlbl90c190bXAgPSBnZW5fdHNfOworICBnZW5fdHNfID0gZmFsc2U7CisKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgZl9zZXJ2aWNlXyA8PCAiLy9IRUxQRVIgRlVOQ1RJT05TIEFORCBTVFJVQ1RVUkVTIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X3N0cnVjdCogdHMgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgc3RyaW5nIG5hbWUgPSB0cy0+Z2V0X25hbWUoKTsKKyAgICB0cy0+c2V0X25hbWUoc2VydmljZV9uYW1lXyArICJfIiArIG5hbWUpOworICAgIGdlbmVyYXRlX2pzX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sIHRzLCBmYWxzZSwgZmFsc2UpOworICAgIGdlbmVyYXRlX2pzX2Z1bmN0aW9uX2hlbHBlcnMoKmZfaXRlcik7CisgICAgdHMtPnNldF9uYW1lKG5hbWUpOworICB9CisKKyAgZ2VuX3RzXyA9IGdlbl90c190bXA7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGFuZCBoZWxwZXJzIGZvciBhIGZ1bmN0aW9uLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uCisgKi8KK3ZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX2pzX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgc2VydmljZV9uYW1lXyArICJfIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7CisgIHRfZmllbGQgc3VjY2Vzcyh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksICJzdWNjZXNzIiwgMCk7CisgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKKyAgfQorCisgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHJlc3VsdC5hcHBlbmQoKmZfaXRlcik7CisgIH0KKworICBnZW5lcmF0ZV9qc19zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCAmcmVzdWx0LCBmYWxzZSwgZmFsc2UpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgaW50ZXJmYWNlIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCisgKi8KK3ZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgKHZvaWQpdHNlcnZpY2U7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgUkVTVCBpbnRlcmZhY2UKKyAqLwordm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9yZXN0KHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgKHZvaWQpdHNlcnZpY2U7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgorICovCit2b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisKKyAgYm9vbCBpc19zdWJjbGFzc19zZXJ2aWNlID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTDsKKworICBpZiAoZ2VuX25vZGVfKSB7CisgICAgc3RyaW5nIHByZWZpeCA9IGhhc19qc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpID8ganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSA6IGpzX2NvbnN0X3R5cGVfOworICAgIGZfc2VydmljZV8gPDwgcHJlZml4IDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudCA9ICIgPDwgImV4cG9ydHMuQ2xpZW50IjsKKyAgICBpZiAoZ2VuX3RzXykgeworICAgICAgZl9zZXJ2aWNlX3RzXyA8PCB0c19wcmludF9kb2ModHNlcnZpY2UpIDw8IHRzX2luZGVudCgpIDw8IHRzX2RlY2xhcmUoKSA8PCAiY2xhc3MgIgorICAgICAgICAgICAgICAgICAgICA8PCAiQ2xpZW50ICI7CisgICAgICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgICAgICBmX3NlcnZpY2VfdHNfIDw8ICJleHRlbmRzICIgPDwgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkgPDwgIkNsaWVudCAiOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlX3RzXyA8PCAieyIgPDwgZW5kbDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZl9zZXJ2aWNlXyA8PCBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpIDw8IHNlcnZpY2VfbmFtZV8KKyAgICAgICAgICAgICAgIDw8ICJDbGllbnQiOworICAgIGlmIChnZW5fdHNfKSB7CisgICAgICBmX3NlcnZpY2VfdHNfIDw8IHRzX3ByaW50X2RvYyh0c2VydmljZSkgPDwgdHNfaW5kZW50KCkgPDwgdHNfZGVjbGFyZSgpIDw8ICJjbGFzcyAiCisgICAgICAgICAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudCAiOworICAgICAgaWYgKGlzX3N1YmNsYXNzX3NlcnZpY2UpIHsKKyAgICAgICAgZl9zZXJ2aWNlX3RzXyA8PCAiZXh0ZW5kcyAiIDw8IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpIDw8ICJDbGllbnQgIjsKKyAgICAgIH0KKyAgICAgIGZfc2VydmljZV90c18gPDwgInsiIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgLy8gRVM2IENvbnN0cnVjdG9yCisgIGlmIChnZW5fZXM2XykgeworICAgIGlmIChpc19zdWJjbGFzc19zZXJ2aWNlKSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICIgPSBjbGFzcyBleHRlbmRzICIgPDwganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfcHJvZ3JhbSgpKQorICAgICAgICAgICAgICAgICAgICAgICA8PCB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSA8PCAiQ2xpZW50IHsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfc2VydmljZV8gPDwgIiA9IGNsYXNzIHsiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF91cCgpOworICAgIGlmIChnZW5fbm9kZV8pIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiY29uc3RydWN0b3Iob3V0cHV0LCBwQ2xhc3MpIHsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiY29uc3RydWN0b3IoaW5wdXQsIG91dHB1dCkgeyIgPDwgZW5kbDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKGdlbl9ub2RlXykgeworICAgICAgZl9zZXJ2aWNlXyA8PCAiID0gZnVuY3Rpb24ob3V0cHV0LCBwQ2xhc3MpIHsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfc2VydmljZV8gPDwgIiA9IGZ1bmN0aW9uKGlucHV0LCBvdXRwdXQpIHsiIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgaW5kZW50X3VwKCk7CisKKyAgaWYgKGdlbl9ub2RlXykgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidGhpcy5vdXRwdXQgPSBvdXRwdXQ7IiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidGhpcy5wQ2xhc3MgPSBwQ2xhc3M7IiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidGhpcy5fc2VxaWQgPSAwOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInRoaXMuX3JlcXMgPSB7fTsiIDw8IGVuZGw7CisgICAgaWYgKGdlbl90c18pIHsKKyAgICAgIGZfc2VydmljZV90c18gPDwgdHNfaW5kZW50KCkgPDwgInByaXZhdGUgaW5wdXQ6IFRocmlmdC5USlNPTlByb3RvY29sOyIgPDwgZW5kbCA8PCB0c19pbmRlbnQoKQorICAgICAgICAgICAgICAgICAgICA8PCAicHJpdmF0ZSBvdXRwdXQ6IFRocmlmdC5USlNPTlByb3RvY29sOyIgPDwgZW5kbCA8PCB0c19pbmRlbnQoKSA8PCAicHJpdmF0ZSBzZXFpZDogbnVtYmVyOyIKKyAgICAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBlbmRsIDw8IHRzX2luZGVudCgpCisgICAgICAgICAgICAgICAgICAgIDw8ICJjb25zdHJ1Y3RvcihpbnB1dDogVGhyaWZ0LlRKU09OUHJvdG9jb2wsIG91dHB1dD86IFRocmlmdC5USlNPTlByb3RvY29sKTsiCisgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfQorICB9IGVsc2UgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidGhpcy5pbnB1dCA9IGlucHV0OyIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInRoaXMub3V0cHV0ID0gKCFvdXRwdXQpID8gaW5wdXQgOiBvdXRwdXQ7IiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidGhpcy5zZXFpZCA9IDA7IiA8PCBlbmRsOworICAgIGlmIChnZW5fdHNfKSB7CisgICAgICBmX3NlcnZpY2VfdHNfIDw8IHRzX2luZGVudCgpIDw8ICJpbnB1dDogVGhyaWZ0LlRKU09OUHJvdG9jb2w7IiA8PCBlbmRsIDw8IHRzX2luZGVudCgpCisgICAgICAgICAgICAgICAgICAgIDw8ICJvdXRwdXQ6IFRocmlmdC5USlNPTlByb3RvY29sOyIgPDwgZW5kbCA8PCB0c19pbmRlbnQoKSA8PCAic2VxaWQ6IG51bWJlcjsiCisgICAgICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgZW5kbCA8PCB0c19pbmRlbnQoKQorICAgICAgICAgICAgICAgICAgICA8PCAiY29uc3RydWN0b3IoaW5wdXQ6IFRocmlmdC5USlNPTlByb3RvY29sLCBvdXRwdXQ/OiBUaHJpZnQuVEpTT05Qcm90b2NvbCk7IgorICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIGluZGVudF9kb3duKCk7CisKKyAgaWYgKGdlbl9lczZfKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifTsiIDw8IGVuZGw7CisgICAgaWYgKGlzX3N1YmNsYXNzX3NlcnZpY2UpIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiVGhyaWZ0LmluaGVyaXRzKCIgPDwganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50LCAiCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9wcm9ncmFtKCkpCisgICAgICAgICAgICAgICAgICAgICAgICA8PCB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSA8PCAiQ2xpZW50KTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIGluaXQgcHJvdG90eXBlCisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSA8PCBzZXJ2aWNlX25hbWVfCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAiQ2xpZW50LnByb3RvdHlwZSA9IHt9OyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICAvLyB1dGlscyBmb3IgbXVsdGlwbGV4ZWQgc2VydmljZXMKKyAgaWYgKGdlbl9ub2RlXykgeworICAgIGlmIChnZW5fZXM2XykgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJzZXFpZCAoKSB7IHJldHVybiB0aGlzLl9zZXFpZDsgfSIgPDwgZW5kbDsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAibmV3X3NlcWlkICgpIHsgcmV0dXJuIHRoaXMuX3NlcWlkICs9IDE7IH0iIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpIDw8IHNlcnZpY2VfbmFtZV8KKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJDbGllbnQucHJvdG90eXBlLnNlcWlkID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl9zZXFpZDsgfTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IGpzX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgPDwgc2VydmljZV9uYW1lXworICAgICAgICAgICAgICAgICAgICAgICAgPDwgIkNsaWVudC5wcm90b3R5cGUubmV3X3NlcWlkID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl9zZXFpZCArPSAxOyB9OyIKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgLy8gR2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKKyAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICBzdHJpbmcgYXJnbGlzdCA9IGFyZ3VtZW50X2xpc3QoYXJnX3N0cnVjdCk7CisKKyAgICAvLyBPcGVuIGZ1bmN0aW9uCisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworICAgIGlmIChnZW5fZXM2XykgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGZ1bm5hbWUgPDwgIiAoIiA8PCBhcmdsaXN0IDw8ICIpIHsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudC5wcm90b3R5cGUuIgorICAgICAgICAgICAgICAgIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCAiIiwgIWdlbl9lczZfKSA8PCAiIHsiIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50X3VwKCk7CisKKyAgICBpZiAoZ2VuX3RzXykgeworICAgICAgLy8gZnVuY3Rpb24gZGVmaW5pdGlvbiB3aXRob3V0IGNhbGxiYWNrCisgICAgICBmX3NlcnZpY2VfdHNfIDw8IHRzX3ByaW50X2RvYygqZl9pdGVyKSA8PCB0c19pbmRlbnQoKSA8PCB0c19mdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlciwgZmFsc2UsIGZhbHNlKSA8PCBlbmRsOworICAgICAgaWYgKCFnZW5fZXM2XykgeworICAgICAgICAvLyBvdmVybG9hZCB3aXRoIGNhbGxiYWNrCisgICAgICAgIGZfc2VydmljZV90c18gPDwgdHNfcHJpbnRfZG9jKCpmX2l0ZXIpIDw8IHRzX2luZGVudCgpIDw8IHRzX2Z1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCB0cnVlLCBmYWxzZSkgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIG92ZXJsb2FkIHdpdGggY2FsbGJhY2sKKyAgICAgICAgZl9zZXJ2aWNlX3RzXyA8PCB0c19wcmludF9kb2MoKmZfaXRlcikgPDwgdHNfaW5kZW50KCkgPDwgdHNfZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIsIHRydWUsIHRydWUpIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGdlbl9lczZfICYmIGdlbl9ub2RlXykgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ0aGlzLl9zZXFpZCA9IHRoaXMubmV3X3NlcWlkKCk7IiA8PCBlbmRsOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGpzX2NvbnN0X3R5cGVfIDw8ICJzZWxmID0gdGhpczsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgPDwgInJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInNlbGYuX3JlcXNbc2VsZi5zZXFpZCgpXSA9IChlcnJvciwgcmVzdWx0KSA9PiB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybiBlcnJvciA/IHJlamVjdChlcnJvcikgOiByZXNvbHZlKHJlc3VsdCk7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInNlbGYuc2VuZF8iIDw8IGZ1bm5hbWUgPDwgIigiIDw8IGFyZ2xpc3QgPDwgIik7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSk7IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAoZ2VuX25vZGVfKSB7IC8vIE5vZGUuanMgb3V0cHV0ICAgICAgLi9nZW4tbm9kZWpzCisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0aGlzLl9zZXFpZCA9IHRoaXMubmV3X3NlcWlkKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgIDw8ICJpZiAoY2FsbGJhY2sgPT09IHVuZGVmaW5lZCkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBqc19jb25zdF90eXBlXyA8PCAiX2RlZmVyID0gUS5kZWZlcigpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAidGhpcy5fcmVxc1t0aGlzLnNlcWlkKCldID0gZnVuY3Rpb24oZXJyb3IsIHJlc3VsdCkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpZiAoZXJyb3IpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiX2RlZmVyLnJlamVjdChlcnJvcik7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiX2RlZmVyLnJlc29sdmUocmVzdWx0KTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifTsiIDw8IGVuZGw7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0aGlzLnNlbmRfIiA8PCBmdW5uYW1lIDw8ICIoIiA8PCBhcmdsaXN0IDw8ICIpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIF9kZWZlci5wcm9taXNlOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0aGlzLl9yZXFzW3RoaXMuc2VxaWQoKV0gPSBjYWxsYmFjazsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgPDwgInRoaXMuc2VuZF8iIDw8IGZ1bm5hbWUgPDwgIigiIDw8IGFyZ2xpc3QgPDwgIik7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKGdlbl9lczZfKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGpzX2NvbnN0X3R5cGVfIDw8ICJzZWxmID0gdGhpczsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgPDwgInJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJzZWxmLnNlbmRfIiA8PCBmdW5uYW1lIDw8ICIoIiA8PCBhcmdsaXN0CisgICAgICAgICAgICAgICAgIDw8IChhcmdsaXN0LmVtcHR5KCkgPyAiIiA6ICIsICIpIDw8ICIoZXJyb3IsIHJlc3VsdCkgPT4geyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gZXJyb3IgPyByZWplY3QoZXJyb3IpIDogcmVzb2x2ZShyZXN1bHQpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9KTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSk7IiA8PCBlbmRsOworCisgICAgfSBlbHNlIGlmIChnZW5fanF1ZXJ5XykgeyAvLyBqUXVlcnkgb3V0cHV0ICAgICAgIC4vZ2VuLWpzCisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAoY2FsbGJhY2sgPT09IHVuZGVmaW5lZCkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidGhpcy5zZW5kXyIgPDwgZnVubmFtZSA8PCAiKCIgPDwgYXJnbGlzdCA8PCAiKTsiIDw8IGVuZGw7CisgICAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKKyAgICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICAgIGZfc2VydmljZV8gPDwgInJldHVybiAiOworICAgICAgICB9CisgICAgICAgIGZfc2VydmljZV8gPDwgInRoaXMucmVjdl8iIDw8IGZ1bm5hbWUgPDwgIigpOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBqc19jb25zdF90eXBlXyA8PCAicG9zdERhdGEgPSB0aGlzLnNlbmRfIiA8PCBmdW5uYW1lIDw8ICIoIiA8PCBhcmdsaXN0CisgICAgICAgICAgICAgICAgIDw8IChhcmdsaXN0LmVtcHR5KCkgPyAiIiA6ICIsICIpIDw8ICJ0cnVlKTsiIDw8IGVuZGw7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gdGhpcy5vdXRwdXQuZ2V0VHJhbnNwb3J0KCkiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIi5qcVJlcXVlc3QodGhpcywgcG9zdERhdGEsIGFyZ3VtZW50cywgdGhpcy5yZWN2XyIgPDwgZnVubmFtZQorICAgICAgICAgICAgICAgICA8PCAiKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfSBlbHNlIHsgLy8gU3RhbmRhcmQgSmF2YVNjcmlwdCAuL2dlbi1qcworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidGhpcy5zZW5kXyIgPDwgZnVubmFtZSA8PCAiKCIgPDwgYXJnbGlzdAorICAgICAgICAgICAgICAgICA8PCAoYXJnbGlzdC5lbXB0eSgpID8gIiIgOiAiLCAiKSA8PCAiY2FsbGJhY2spOyAiIDw8IGVuZGw7CisgICAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKCFjYWxsYmFjaykgeyIgPDwgZW5kbDsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKKyAgICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICAgIGZfc2VydmljZV8gPDwgIiAgcmV0dXJuICI7CisgICAgICAgIH0KKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAidGhpcy5yZWN2XyIgPDwgZnVubmFtZSA8PCAiKCk7IiA8PCBlbmRsOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisKKyAgICBpZiAoZ2VuX2VzNl8pIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn07IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgfQorCisgICAgLy8gU2VuZCBmdW5jdGlvbgorICAgIGlmIChnZW5fZXM2XykgeworICAgICAgaWYgKGdlbl9ub2RlXykgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInNlbmRfIiA8PCBmdW5uYW1lIDw8ICIgKCIgPDwgYXJnbGlzdCA8PCAiKSB7IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gRVM2IGpzIHN0aWxsIHVzZXMgY2FsbGJhY2tzIGhlcmUuIFNob3VsZCByZWZhY3RvciB0aGlzIHRvIHByb21pc2Ugc3R5bGUgbGF0ZXIuLgorICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInNlbmRfIiA8PCBmdW5uYW1lIDw8ICIgKCIgPDwgYXJndW1lbnRfbGlzdChhcmdfc3RydWN0LCB0cnVlKSA8PCAiKSB7IiA8PCBlbmRsOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJDbGllbnQucHJvdG90eXBlLnNlbmRfIgorICAgICAgICAgICAgICAgIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCAiIiwgIWdlbl9ub2RlXykgPDwgIiB7IiA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudF91cCgpOworCisgICAgc3RkOjpzdHJpbmcgb3V0cHV0VmFyOworICAgIGlmIChnZW5fbm9kZV8pIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwganNfY29uc3RfdHlwZV8gPDwgIm91dHB1dCA9IG5ldyB0aGlzLnBDbGFzcyh0aGlzLm91dHB1dCk7IiA8PCBlbmRsOworICAgICAgb3V0cHV0VmFyID0gIm91dHB1dCI7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dHB1dFZhciA9ICJ0aGlzLm91dHB1dCI7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgYXJnc25hbWUgPSBqc19uYW1lc3BhY2UocHJvZ3JhbV8pICsgc2VydmljZV9uYW1lXyArICJfIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiX2FyZ3MiOworCisgICAgc3RkOjpzdHJpbmcgbWVzc2FnZVR5cGUgPSAoKmZfaXRlciktPmlzX29uZXdheSgpID8gIlRocmlmdC5NZXNzYWdlVHlwZS5PTkVXQVkiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIlRocmlmdC5NZXNzYWdlVHlwZS5DQUxMIjsKKyAgICAvLyBCdWlsZCBhcmdzCisgICAgaWYgKGZpZWxkcy5zaXplKCkgPiAwKXsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwganNfY29uc3RfdHlwZV8gPDwgInBhcmFtcyA9IHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOiAiIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgICBpZiAoZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpLTEpIHsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8ICIsIiA8PCBlbmRsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwganNfY29uc3RfdHlwZV8gPDwgImFyZ3MgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiKHBhcmFtcyk7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwganNfY29uc3RfdHlwZV8gPDwgImFyZ3MgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiKCk7IiA8PCBlbmRsOworICAgIH0KKworCisgICAgLy8gU2VyaWFsaXplIHRoZSByZXF1ZXN0IGhlYWRlciB3aXRoaW4gdHJ5L2NhdGNoCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ0cnkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGlmIChnZW5fbm9kZV8pIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgb3V0cHV0VmFyIDw8ICIud3JpdGVNZXNzYWdlQmVnaW4oJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgIDw8ICInLCAiIDw8IG1lc3NhZ2VUeXBlIDw8ICIsIHRoaXMuc2VxaWQoKSk7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IG91dHB1dFZhciA8PCAiLndyaXRlTWVzc2FnZUJlZ2luKCciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICA8PCAiJywgIiA8PCBtZXNzYWdlVHlwZSA8PCAiLCB0aGlzLnNlcWlkKTsiIDw8IGVuZGw7CisgICAgfQorCisKKyAgICAvLyBXcml0ZSB0byB0aGUgc3RyZWFtCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiYXJncy53cml0ZSgiIDw8IG91dHB1dFZhciA8PCAiKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgb3V0cHV0VmFyCisgICAgICAgICAgICAgICA8PCAiLndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKKworICAgIGlmIChnZW5fbm9kZV8pIHsKKyAgICAgIGlmKCgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidGhpcy5vdXRwdXQuZmx1c2goKTsiIDw8IGVuZGw7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwganNfY29uc3RfdHlwZV8gPDwgImNhbGxiYWNrID0gdGhpcy5fcmVxc1t0aGlzLnNlcWlkKCldIHx8IGZ1bmN0aW9uKCkge307IiA8PCBlbmRsOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJkZWxldGUgdGhpcy5fcmVxc1t0aGlzLnNlcWlkKCldOyIgPDwgZW5kbDsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiY2FsbGJhY2sobnVsbCk7IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHRoaXMub3V0cHV0LmZsdXNoKCk7IiA8PCBlbmRsOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAoZ2VuX2pxdWVyeV8pIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHRoaXMub3V0cHV0LmdldFRyYW5zcG9ydCgpLmZsdXNoKGNhbGxiYWNrKTsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgaWYgKGdlbl9lczZfKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwganNfY29uc3RfdHlwZV8gPDwgInNlbGYgPSB0aGlzOyIgPDwgZW5kbDsKKyAgICAgICAgaWYoKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRoaXMub3V0cHV0LmdldFRyYW5zcG9ydCgpLmZsdXNoKHRydWUsIG51bGwpOyIgPDwgZW5kbDsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJjYWxsYmFjaygpOyIgPDwgZW5kbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0aGlzLm91dHB1dC5nZXRUcmFuc3BvcnQoKS5mbHVzaCh0cnVlLCAoKSA9PiB7IiA8PCBlbmRsOworICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwganNfbGV0X3R5cGVfIDw8ICJlcnJvciA9IG51bGwsIHJlc3VsdCA9IG51bGw7IiA8PCBlbmRsOworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRyeSB7IiA8PCBlbmRsOworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgcmVzdWx0ID0gc2VsZi5yZWN2XyIgPDwgZnVubmFtZSA8PCAiKCk7IiA8PCBlbmRsOworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0gY2F0Y2ggKGUpIHsiIDw8IGVuZGw7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICBlcnJvciA9IGU7IiA8PCBlbmRsOworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiY2FsbGJhY2soZXJyb3IsIHJlc3VsdCk7IiA8PCBlbmRsOworICAgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSk7IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAoY2FsbGJhY2spIHsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBpZigoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidGhpcy5vdXRwdXQuZ2V0VHJhbnNwb3J0KCkuZmx1c2godHJ1ZSwgbnVsbCk7IiA8PCBlbmRsOworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImNhbGxiYWNrKCk7IiA8PCBlbmRsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwganNfY29uc3RfdHlwZV8gPDwgInNlbGYgPSB0aGlzOyIgPDwgZW5kbDsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0aGlzLm91dHB1dC5nZXRUcmFuc3BvcnQoKS5mbHVzaCh0cnVlLCBmdW5jdGlvbigpIHsiIDw8IGVuZGw7CisgICAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBqc19sZXRfdHlwZV8gPDwgInJlc3VsdCA9IG51bGw7IiA8PCBlbmRsOworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRyeSB7IiA8PCBlbmRsOworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgcmVzdWx0ID0gc2VsZi5yZWN2XyIgPDwgZnVubmFtZSA8PCAiKCk7IiA8PCBlbmRsOworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0gY2F0Y2ggKGUpIHsiIDw8IGVuZGw7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICByZXN1bHQgPSBlOyIgPDwgZW5kbDsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImNhbGxiYWNrKHJlc3VsdCk7IiA8PCBlbmRsOworICAgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSk7IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0aGlzLm91dHB1dC5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOyIgPDwgZW5kbDsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgICAvLyBSZXNldCB0aGUgdHJhbnNwb3J0IGFuZCBkZWxldGUgcmVnaXN0ZXJlZCBjYWxsYmFjayBpZiB0aGVyZSB3YXMgYSBzZXJpYWxpemF0aW9uIGVycm9yCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiY2F0Y2ggKGUpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaWYgKGdlbl9ub2RlXykgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZGVsZXRlIHRoaXMuX3JlcXNbdGhpcy5zZXFpZCgpXTsiIDw8IGVuZGw7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAodHlwZW9mICIgPDwgb3V0cHV0VmFyIDw8ICIucmVzZXQgPT09ICdmdW5jdGlvbicpIHsiIDw8IGVuZGw7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgICIgPDwgb3V0cHV0VmFyIDw8ICIucmVzZXQoKTsiIDw8IGVuZGw7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAodHlwZW9mICIgPDwgb3V0cHV0VmFyIDw8ICIuZ2V0VHJhbnNwb3J0KCkucmVzZXQgPT09ICdmdW5jdGlvbicpIHsiIDw8IGVuZGw7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgICIgPDwgb3V0cHV0VmFyIDw8ICIuZ2V0VHJhbnNwb3J0KCkucmVzZXQoKTsiIDw8IGVuZGw7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0aHJvdyBlOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfZG93bigpOworCisgICAgLy8gQ2xvc2Ugc2VuZCBmdW5jdGlvbgorICAgIGlmIChnZW5fZXM2XykgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn07IiA8PCBlbmRsOworICAgIH0KKworICAgIC8vIFJlY2VpdmUgZnVuY3Rpb24KKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIHN0ZDo6c3RyaW5nIHJlc3VsdG5hbWUgPSBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpICsgc2VydmljZV9uYW1lXyArICJfIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOworCisgICAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisgICAgICAvLyBPcGVuIHJlY2VpdmUgZnVuY3Rpb24KKyAgICAgIGlmIChnZW5fbm9kZV8pIHsKKyAgICAgICAgaWYgKGdlbl9lczZfKSB7CisgICAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZWN2XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgKGlucHV0LCBtdHlwZSwgcnNlcWlkKSB7IiA8PCBlbmRsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpIDw8IHNlcnZpY2VfbmFtZV8KKyAgICAgICAgICAgICAgICAgICAgICA8PCAiQ2xpZW50LnByb3RvdHlwZS5yZWN2XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgPDwgIiA9IGZ1bmN0aW9uKGlucHV0LG10eXBlLHJzZXFpZCkgeyIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGdlbl9lczZfKSB7CisgICAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZWN2XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgKCkgeyIgPDwgZW5kbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0X3N0cnVjdCBub2FyZ3MocHJvZ3JhbV8pOworCisgICAgICAgICAgdF9mdW5jdGlvbiByZWN2X2Z1bmN0aW9uKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInJlY3ZfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5vYXJncyk7CisgICAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGpzX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgPDwgc2VydmljZV9uYW1lXworICAgICAgICAgICAgICAgICAgICA8PCAiQ2xpZW50LnByb3RvdHlwZS4iIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmcmVjdl9mdW5jdGlvbikgPDwgIiB7IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGluZGVudF91cCgpOworCisgICAgICBzdGQ6OnN0cmluZyBpbnB1dFZhcjsKKyAgICAgIGlmIChnZW5fbm9kZV8pIHsKKyAgICAgICAgaW5wdXRWYXIgPSAiaW5wdXQiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5wdXRWYXIgPSAidGhpcy5pbnB1dCI7CisgICAgICB9CisKKyAgICAgIGlmIChnZW5fbm9kZV8pIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBqc19jb25zdF90eXBlXyA8PCAiY2FsbGJhY2sgPSB0aGlzLl9yZXFzW3JzZXFpZF0gfHwgZnVuY3Rpb24oKSB7fTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZGVsZXRlIHRoaXMuX3JlcXNbcnNlcWlkXTsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGpzX2NvbnN0X3R5cGVfIDw8ICJyZXQgPSB0aGlzLmlucHV0LnJlYWRNZXNzYWdlQmVnaW4oKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBqc19jb25zdF90eXBlXyA8PCAibXR5cGUgPSByZXQubXR5cGU7IiA8PCBlbmRsOworICAgICAgfQorCisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAobXR5cGUgPT0gVGhyaWZ0Lk1lc3NhZ2VUeXBlLkVYQ0VQVElPTikgeyIgPDwgZW5kbDsKKworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGpzX2NvbnN0X3R5cGVfIDw8ICJ4ID0gbmV3IFRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24oKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIngucmVhZCgiIDw8IGlucHV0VmFyIDw8ICIpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbnB1dFZhciA8PCAiLnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IHJlbmRlcl9yZWN2X3Rocm93KCJ4IikgPDwgZW5kbDsKKyAgICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwganNfY29uc3RfdHlwZV8gPDwgInJlc3VsdCA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIigpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAicmVzdWx0LnJlYWQoIiA8PCBpbnB1dFZhciA8PCAiKTsiIDw8IGVuZGw7CisKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgaW5wdXRWYXIgPDwgIi5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgICB0X3N0cnVjdCogeHMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKKyAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAobnVsbCAhPT0gcmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIHsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICAiIDw8IHJlbmRlcl9yZWN2X3Rocm93KCJyZXN1bHQuIiArICgqeF9pdGVyKS0+Z2V0X25hbWUoKSkKKyAgICAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgfQorCisgICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiByZXN1bHQgaWYgbm90IGEgdm9pZCBmdW5jdGlvbgorICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAobnVsbCAhPT0gcmVzdWx0LnN1Y2Nlc3MpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgIgorICAgICAgICAgICAgICAgICAgIDw8IHJlbmRlcl9yZWN2X3JldHVybigicmVzdWx0LnN1Y2Nlc3MiKSA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgICAgPDwgcmVuZGVyX3JlY3ZfdGhyb3coIiciICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIiBmYWlsZWQ6IHVua25vd24gcmVzdWx0JyIpCisgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChnZW5fbm9kZV8pIHsKKyAgICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImNhbGxiYWNrKG51bGwpOyIgPDwgZW5kbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybjsiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLy8gQ2xvc2UgcmVjZWl2ZSBmdW5jdGlvbgorICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGlmIChnZW5fZXM2XykgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn07IiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIEZpbmlzaCBjbGFzcyBkZWZpbml0aW9ucworICBpZiAoZ2VuX3RzXykgeworICAgIGZfc2VydmljZV90c18gPDwgdHNfaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKyAgaWYgKGdlbl9lczZfKSB7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3NlcnZpY2VfIDw8ICJ9OyIgPDwgZW5kbDsKKyAgfQorfQorCitzdGQ6OnN0cmluZyB0X2pzX2dlbmVyYXRvcjo6cmVuZGVyX3JlY3ZfdGhyb3coc3RkOjpzdHJpbmcgdmFyKSB7CisgIGlmIChnZW5fbm9kZV8pIHsKKyAgICByZXR1cm4gInJldHVybiBjYWxsYmFjaygiICsgdmFyICsgIik7IjsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gInRocm93ICIgKyB2YXIgKyAiOyI7CisgIH0KK30KKworc3RkOjpzdHJpbmcgdF9qc19nZW5lcmF0b3I6OnJlbmRlcl9yZWN2X3JldHVybihzdGQ6OnN0cmluZyB2YXIpIHsKKyAgaWYgKGdlbl9ub2RlXykgeworICAgIHJldHVybiAicmV0dXJuIGNhbGxiYWNrKG51bGwsICIgKyB2YXIgKyAiKTsiOworICB9IGVsc2UgeworICAgIHJldHVybiAicmV0dXJuICIgKyB2YXIgKyAiOyI7CisgIH0KK30KKworLyoqCisgKiBEZXNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KKyAqLwordm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbGFzcykgeworICAodm9pZClpbmNsYXNzOworICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisKKyAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgREVTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICB9CisKKyAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIG5hbWUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiID0gaW5wdXQuIjsKKworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIG91dCA8PCAodHlwZS0+aXNfYmluYXJ5KCkgPyAicmVhZEJpbmFyeSgpIiA6ICJyZWFkU3RyaW5nKCkiKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIG91dCA8PCAicmVhZEJvb2woKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgb3V0IDw8ICJyZWFkQnl0ZSgpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgb3V0IDw8ICJyZWFkSTE2KCkiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBvdXQgPDwgInJlYWRJMzIoKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIG91dCA8PCAicmVhZEk2NCgpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgb3V0IDw8ICJyZWFkRG91YmxlKCkiOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gSlMgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICBvdXQgPDwgInJlYWRJMzIoKSI7CisgICAgfQorCisgICAgaWYgKCFnZW5fbm9kZV8pIHsKKyAgICAgIG91dCA8PCAiLnZhbHVlIjsKKyAgICB9CisKKyAgICBvdXQgPDwgIjsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gREVTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCisgICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICB0eXBlLT5nZXRfbmFtZSgpLmNfc3RyKCkpOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGFuIHVuc2VyaWFsaXplciBmb3IgYSB2YXJpYWJsZS4gVGhpcyBtYWtlcyB0d28ga2V5IGFzc3VtcHRpb25zLAorICogZmlyc3QgdGhhdCB0aGVyZSBpcyBhIGNvbnN0IGNoYXIqIHZhcmlhYmxlIG5hbWVkIGRhdGEgdGhhdCBwb2ludHMgdG8gdGhlCisgKiBidWZmZXIgZm9yIGRlc2VyaWFsaXphdGlvbiwgYW5kIHRoYXQgdGhlcmUgaXMgYSB2YXJpYWJsZSBwcm90b2NvbCB3aGljaAorICogaXMgYSByZWZlcmVuY2UgdG8gYSBUUHJvdG9jb2wgc2VyaWFsaXphdGlvbiBvYmplY3QuCisgKi8KK3ZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4KSB7CisgIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIiA9IG5ldyAiIDw8IGpzX3R5cGVfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpCisgICAgICA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIucmVhZChpbnB1dCk7IiA8PCBlbmRsOworfQorCit2b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4KSB7CisgIHN0cmluZyBzaXplID0gdG1wKCJfc2l6ZSIpOworICBzdHJpbmcgcnRtcDMgPSB0bXAoIl9ydG1wMyIpOworCisgIHRfZmllbGQgZnNpemUoZ190eXBlX2kzMiwgc2l6ZSk7CisKKyAgLy8gRGVjbGFyZSB2YXJpYWJsZXMsIHJlYWQgaGVhZGVyCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIgPSB7fTsiIDw8IGVuZGw7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwganNfY29uc3RfdHlwZV8gPDwgcnRtcDMgPDwgIiA9IGlucHV0LnJlYWRNYXBCZWdpbigpOyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwganNfY29uc3RfdHlwZV8gPDwgc2l6ZSA8PCAiID0gIiA8PCBydG1wMyA8PCAiLnNpemUgfHwgMDsiIDw8IGVuZGw7CisKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIiA9IFtdOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCBqc19jb25zdF90eXBlXyA8PCBydG1wMyA8PCAiID0gaW5wdXQucmVhZFNldEJlZ2luKCk7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8IGpzX2NvbnN0X3R5cGVfIDw8IHNpemUgPDwgIiA9ICIgPDwgcnRtcDMgPDwgIi5zaXplIHx8IDA7IiA8PCBlbmRsOworCisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworCisgICAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gW107IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8IGpzX2NvbnN0X3R5cGVfIDw8IHJ0bXAzIDw8ICIgPSBpbnB1dC5yZWFkTGlzdEJlZ2luKCk7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8IGpzX2NvbnN0X3R5cGVfIDw8IHNpemUgPDwgIiA9ICIgPDwgcnRtcDMgPDwgIi5zaXplIHx8IDA7IiA8PCBlbmRsOworICB9CisKKyAgLy8gRm9yIGxvb3AgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cworICBzdHJpbmcgaSA9IHRtcCgiX2kiKTsKKyAgaW5kZW50KG91dCkgPDwgImZvciAoIiA8PCBqc19sZXRfdHlwZV8gPDwgaSA8PCAiID0gMDsgIiA8PCBpIDw8ICIgPCAiIDw8IHNpemUgPDwgIjsgKysiIDw8IGkgPDwgIikgeyIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaWYgKCFnZW5fbm9kZV8pIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCIgPDwgaSA8PCAiID4gMCApIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAiICBpZiAoaW5wdXQucnN0YWNrLmxlbmd0aCA+IGlucHV0LnJwb3NbaW5wdXQucnBvcy5sZW5ndGggLTFdICsgMSkgeyIgPDwgZW5kbAorICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgICAgaW5wdXQucnN0YWNrLnBvcCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorCisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBwcmVmaXgpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgcHJlZml4KTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIHByZWZpeCk7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7CisKKyAgLy8gUmVhZCBjb250YWluZXIgZW5kCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaW5wdXQucmVhZE1hcEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaW5wdXQucmVhZFNldEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlucHV0LnJlYWRMaXN0RW5kKCk7IiA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGNvZGUgdG8gZGVzZXJpYWxpemUgYSBtYXAKKyAqLwordm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RyaW5nIHByZWZpeCkgeworICBzdHJpbmcga2V5ID0gdG1wKCJrZXkiKTsKKyAgc3RyaW5nIHZhbCA9IHRtcCgidmFsIik7CisgIHRfZmllbGQgZmtleSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KTsKKyAgdF9maWVsZCBmdmFsKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2YWwpOworCisgIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZrZXksIGZhbHNlLCBmYWxzZSkgPDwgIjsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZ2YWwsIGZhbHNlLCBmYWxzZSkgPDwgIjsiIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmtleSk7CisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZ2YWwpOworCisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiWyIgPDwga2V5IDw8ICJdID0gIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIGVsZW0gPSB0bXAoImVsZW0iKTsKKyAgdF9maWVsZCBmZWxlbSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOworCisgIGluZGVudChvdXQpIDw8IGpzX2xldF90eXBlXyA8PCBlbGVtIDw8ICIgPSBudWxsOyIgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIucHVzaCgiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOworfQorCit2b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgeworICBzdHJpbmcgZWxlbSA9IHRtcCgiZWxlbSIpOworICB0X2ZpZWxkIGZlbGVtKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOworCisgIGluZGVudChvdXQpIDw8IGpzX2xldF90eXBlXyA8PCBlbGVtIDw8ICIgPSBudWxsOyIgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIucHVzaCgiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KKyAqCisgKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCB0byBzZXJpYWxpemUKKyAqIEBwYXJhbSBwcmVmaXggTmFtZSB0byBwcmVwZW5kIHRvIGZpZWxkIG5hbWUKKyAqLwordm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdHJpbmcgcHJlZml4KSB7CisgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKworICAvLyBEbyBub3RoaW5nIGZvciB2b2lkIHR5cGVzCisgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIFNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgIH0KKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKKworICAgIHN0cmluZyBuYW1lID0gdGZpZWxkLT5nZXRfbmFtZSgpOworCisgICAgLy8gSGFjayBmb3Igd2hlbiBwcmVmaXggaXMgZGVmaW5lZCAoYWx3YXlzIGEgaGFzaCByZWYpCisgICAgaWYgKCFwcmVmaXguZW1wdHkoKSkKKyAgICAgIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisKKyAgICBpbmRlbnQob3V0KSA8PCAib3V0cHV0LiI7CisKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICBvdXQgPDwgKHR5cGUtPmlzX2JpbmFyeSgpID8gIndyaXRlQmluYXJ5KCIgOiAid3JpdGVTdHJpbmcoIikgPDwgbmFtZSA8PCAiKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICBvdXQgPDwgIndyaXRlQm9vbCgiIDw8IG5hbWUgPDwgIikiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIG91dCA8PCAid3JpdGVCeXRlKCIgPDwgbmFtZSA8PCAiKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgIG91dCA8PCAid3JpdGVJMTYoIiA8PCBuYW1lIDw8ICIpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUkzMigiIDw8IG5hbWUgPDwgIikiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICBvdXQgPDwgIndyaXRlSTY0KCIgPDwgbmFtZSA8PCAiKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIG91dCA8PCAid3JpdGVEb3VibGUoIiA8PCBuYW1lIDw8ICIpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEpTIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgb3V0IDw8ICJ3cml0ZUkzMigiIDw8IG5hbWUgPDwgIikiOworICAgIH0KKyAgICBvdXQgPDwgIjsiIDw8IGVuZGw7CisKKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgRklFTEQgJyVzJXMnIFRZUEUgJyVzJ1xuIiwKKyAgICAgICAgICAgcHJlZml4LmNfc3RyKCksCisgICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICB0eXBlLT5nZXRfbmFtZSgpLmNfc3RyKCkpOworICB9Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhbGwgdGhlIG1lbWJlcnMgb2YgYSBzdHJ1Y3QuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCB0byBzZXJpYWxpemUKKyAqIEBwYXJhbSBwcmVmaXggIFN0cmluZyBwcmVmaXggdG8gYXR0YWNoIHRvIGFsbCBmaWVsZHMKKyAqLwordm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4KSB7CisgICh2b2lkKXRzdHJ1Y3Q7CisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLndyaXRlKG91dHB1dCk7IiA8PCBlbmRsOworfQorCisvKioKKyAqIFdyaXRlcyBvdXQgYSBjb250YWluZXIKKyAqLwordm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgpIHsKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvdXRwdXQud3JpdGVNYXBCZWdpbigiIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpIDw8ICIsICIKKyAgICAgICAgICAgICAgICA8PCAiVGhyaWZ0Lm9iamVjdExlbmd0aCgiIDw8IHByZWZpeCA8PCAiKSk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvdXRwdXQud3JpdGVTZXRCZWdpbigiIDw8IHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgIgorICAgICAgICAgICAgICAgIDw8IHByZWZpeCA8PCAiLmxlbmd0aCk7IiA8PCBlbmRsOworCisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworCisgICAgaW5kZW50KG91dCkgPDwgIm91dHB1dC53cml0ZUxpc3RCZWdpbigiIDw8IHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpCisgICAgICAgICAgICAgICAgPDwgIiwgIiA8PCBwcmVmaXggPDwgIi5sZW5ndGgpOyIgPDwgZW5kbDsKKyAgfQorCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBzdHJpbmcga2l0ZXIgPSB0bXAoImtpdGVyIik7CisgICAgc3RyaW5nIHZpdGVyID0gdG1wKCJ2aXRlciIpOworICAgIGluZGVudChvdXQpIDw8ICJmb3IgKCIgPDwganNfbGV0X3R5cGVfIDw8IGtpdGVyIDw8ICIgaW4gIiA8PCBwcmVmaXggPDwgIikgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgcHJlZml4IDw8ICIuaGFzT3duUHJvcGVydHkoIiA8PCBraXRlciA8PCAiKSkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCBqc19sZXRfdHlwZV8gPDwgdml0ZXIgPDwgIiA9ICIgPDwgcHJlZml4IDw8ICJbIiA8PCBraXRlciA8PCAiXTsiIDw8IGVuZGw7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwga2l0ZXIsIHZpdGVyKTsKKyAgICBzY29wZV9kb3duKG91dCk7CisgICAgc2NvcGVfZG93bihvdXQpOworCisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgc3RyaW5nIGl0ZXIgPSB0bXAoIml0ZXIiKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yICgiIDw8IGpzX2xldF90eXBlXyA8PCBpdGVyIDw8ICIgaW4gIiA8PCBwcmVmaXggPDwgIikgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgcHJlZml4IDw8ICIuaGFzT3duUHJvcGVydHkoIiA8PCBpdGVyIDw8ICIpKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8IGl0ZXIgPDwgIiA9ICIgPDwgcHJlZml4IDw8ICJbIiA8PCBpdGVyIDw8ICJdOyIgPDwgZW5kbDsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBpdGVyKTsKKyAgICBzY29wZV9kb3duKG91dCk7CisgICAgc2NvcGVfZG93bihvdXQpOworCisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHN0cmluZyBpdGVyID0gdG1wKCJpdGVyIik7CisgICAgaW5kZW50KG91dCkgPDwgImZvciAoIiA8PCBqc19sZXRfdHlwZV8gPDwgaXRlciA8PCAiIGluICIgPDwgcHJlZml4IDw8ICIpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IHByZWZpeCA8PCAiLmhhc093blByb3BlcnR5KCIgPDwgaXRlciA8PCAiKSkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCBpdGVyIDw8ICIgPSAiIDw8IHByZWZpeCA8PCAiWyIgPDwgaXRlciA8PCAiXTsiIDw8IGVuZGw7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBpdGVyKTsKKyAgICBzY29wZV9kb3duKG91dCk7CisgICAgc2NvcGVfZG93bihvdXQpOworICB9CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvdXRwdXQud3JpdGVNYXBFbmQoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm91dHB1dC53cml0ZVNldEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm91dHB1dC53cml0ZUxpc3RFbmQoKTsiIDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbWFwLgorICoKKyAqLwordm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcga2l0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHZpdGVyKSB7CisgIHRfZmllbGQga2ZpZWxkKHRtYXAtPmdldF9rZXlfdHlwZSgpLCBraXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZrZmllbGQpOworCisgIHRfZmllbGQgdmZpZWxkKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2aXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZ2ZmllbGQpOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBzZXQuCisgKi8KK3ZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgaXRlcikgeworICB0X2ZpZWxkIGVmaWVsZCh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkKTsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbGlzdC4KKyAqLwordm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0cmluZyBpdGVyKSB7CisgIHRfZmllbGQgZWZpZWxkKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkKTsKK30KKworLyoqCisgKiBEZWNsYXJlcyBhIGZpZWxkLCB3aGljaCBtYXkgaW5jbHVkZSBpbml0aWFsaXphdGlvbiBhcyBuZWNlc3NhcnkuCisgKgorICogQHBhcmFtIHR0eXBlIFRoZSB0eXBlCisgKi8KK3N0cmluZyB0X2pzX2dlbmVyYXRvcjo6ZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdCwgYm9vbCBvYmopIHsKKyAgc3RyaW5nIHJlc3VsdCA9ICJ0aGlzLiIgKyB0ZmllbGQtPmdldF9uYW1lKCk7CisKKyAgaWYgKCFvYmopIHsKKyAgICByZXN1bHQgPSBqc19sZXRfdHlwZV8gKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgIH0KKworICBpZiAoaW5pdCkgeworICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgcmVzdWx0ICs9ICIgPSBudWxsIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEpTIGluaXRpYWxpemVyIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIHJlc3VsdCArPSAiID0gbnVsbCI7CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgICAgcmVzdWx0ICs9ICIgPSBudWxsIjsKKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgICByZXN1bHQgKz0gIiA9IG51bGwiOworICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgICAgaWYgKG9iaikgeworICAgICAgICByZXN1bHQgKz0gIiA9IG5ldyAiICsganNfdHlwZV9uYW1lc3BhY2UodHlwZS0+Z2V0X3Byb2dyYW0oKSkgKyB0eXBlLT5nZXRfbmFtZSgpICsgIigpIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdCArPSAiID0gbnVsbCI7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIHJlc3VsdCArPSAiID0gbnVsbCI7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd0eXBlIG5hbWUoYXJncyknCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCisgKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCisgKi8KK3N0cmluZyB0X2pzX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2x1ZGVfY2FsbGJhY2spIHsKKworICBzdHJpbmcgc3RyOworCisgIHN0ciA9IHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICIgPSBmdW5jdGlvbigiOworCisgIHN0ciArPSBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSwgaW5jbHVkZV9jYWxsYmFjayk7CisKKyAgc3RyICs9ICIpIjsKKyAgcmV0dXJuIHN0cjsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgZmllbGQgbGlzdAorICovCitzdHJpbmcgdF9qc19nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaW5jbHVkZV9jYWxsYmFjaykgeworICBzdHJpbmcgcmVzdWx0ID0gIiI7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdCArPSAiLCAiOworICAgIH0KKyAgICByZXN1bHQgKz0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICB9CisKKyAgaWYgKGluY2x1ZGVfY2FsbGJhY2spIHsKKyAgICBpZiAoIWZpZWxkcy5lbXB0eSgpKSB7CisgICAgICByZXN1bHQgKz0gIiwgIjsKKyAgICB9CisgICAgcmVzdWx0ICs9ICJjYWxsYmFjayI7CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgQysrIGVudW0gc3RyaW5nIGZvciB0aGUgZ2l2ZW4gdHlwZS4KKyAqLworc3RyaW5nIHRfanNfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICJUaHJpZnQuVHlwZS5TVFJJTkciOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiVGhyaWZ0LlR5cGUuQk9PTCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiVGhyaWZ0LlR5cGUuQllURSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gIlRocmlmdC5UeXBlLkkxNiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gIlRocmlmdC5UeXBlLkkzMiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIlRocmlmdC5UeXBlLkk2NCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIlRocmlmdC5UeXBlLkRPVUJMRSI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiVGhyaWZ0LlR5cGUuSTMyIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICJUaHJpZnQuVHlwZS5TVFJVQ1QiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICJUaHJpZnQuVHlwZS5NQVAiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICJUaHJpZnQuVHlwZS5TRVQiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAiVGhyaWZ0LlR5cGUuTElTVCI7CisgIH0KKworICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Cit9CisKKy8qKgorICogQ29udmVydHMgYSB0X3R5cGUgdG8gYSBUeXBlU2NyaXB0IHR5cGUgKHN0cmluZykuCisgKiBAcGFyYW0gdF90eXBlIFR5cGUgdG8gY29udmVydCB0byBUeXBlU2NyaXB0CisgKiBAcmV0dXJuIFN0cmluZyBUeXBlU2NyaXB0IHR5cGUKKyAqLworc3RyaW5nIHRfanNfZ2VuZXJhdG9yOjp0c19nZXRfdHlwZSh0X3R5cGUqIHR5cGUpIHsKKyAgc3RkOjpzdHJpbmcgdHNfdHlwZTsKKworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgdHNfdHlwZSA9ICJzdHJpbmciOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgdHNfdHlwZSA9ICJib29sZWFuIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICB0c190eXBlID0gImFueSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHRzX3R5cGUgPSAibnVtYmVyIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHRzX3R5cGUgPSAidm9pZCI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSB8fCB0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgc3RkOjpzdHJpbmcgdHlwZV9uYW1lOworICAgIGlmICh0eXBlLT5nZXRfcHJvZ3JhbSgpKSB7CisgICAgICB0eXBlX25hbWUgPSBqc19uYW1lc3BhY2UodHlwZS0+Z2V0X3Byb2dyYW0oKSk7CisgICAgfQorICAgIHR5cGVfbmFtZS5hcHBlbmQodHlwZS0+Z2V0X25hbWUoKSk7CisgICAgdHNfdHlwZSA9IHR5cGVfbmFtZTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3R5cGUqIGV0eXBlOworCisgICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9IGVsc2UgeworICAgICAgZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIH0KKworICAgIHRzX3R5cGUgPSB0c19nZXRfdHlwZShldHlwZSkgKyAiW10iOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgc3RyaW5nIGt0eXBlID0gdHNfZ2V0X3R5cGUoKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpKTsKKyAgICBzdHJpbmcgdnR5cGUgPSB0c19nZXRfdHlwZSgoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpOworCisKKyAgICBpZiAoa3R5cGUgPT0gIm51bWJlciIgfHwga3R5cGUgPT0gInN0cmluZyIgKSB7CisgICAgICB0c190eXBlID0gInsgW2s6ICIgKyBrdHlwZSArICJdOiAiICsgdnR5cGUgKyAiOyB9IjsKKyAgICB9IGVsc2UgaWYgKCgoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCkpLT5pc19lbnVtKCkpIHsKKyAgICAgIC8vIE5vdCB5ZXQgc3VwcG9ydGVkIChlbnVtIG1hcCk6IGh0dHBzOi8vZ2l0aHViLmNvbS9NaWNyb3NvZnQvVHlwZVNjcmlwdC9wdWxsLzI2NTIKKyAgICAgIC8vdHNfdHlwZSA9ICJ7IFtrOiAiICsga3R5cGUgKyAiXTogIiArIHZ0eXBlICsgIjsgfSI7CisgICAgICB0c190eXBlID0gInsgW2s6IG51bWJlciAvKiIgKyBrdHlwZSArICIqL106ICIgKyB2dHlwZSArICI7IH0iOworICAgIH0gZWxzZSB7CisgICAgICB0c190eXBlID0gImFueSI7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHRzX3R5cGU7Cit9CisKKy8qKgorICogUmVuZGVycyBhIFR5cGVTY3JpcHQgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICduYW1lKGFyZ3M6IHR5cGVzKTogdHlwZTsnCisgKgorICogQHBhcmFtIHRfZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgorICogQHBhcmFtIGJvb2wgaW4tL2V4Y2x1ZGUgdGhlIGNhbGxiYWNrIGFyZ3VtZW50CisgKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCisgKi8KK3N0ZDo6c3RyaW5nIHRfanNfZ2VuZXJhdG9yOjp0c19mdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBib29sIGluY2x1ZGVfY2FsbGJhY2ssIGJvb2wgb3B0aW9uYWxfY2FsbGJhY2spIHsKKyAgc3RyaW5nIHN0cjsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgc3RyID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIigiOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgc3RyICs9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArIHRzX2dldF9yZXEoKmZfaXRlcikgKyAiOiAiICsgdHNfZ2V0X3R5cGUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKworICAgIGlmIChmX2l0ZXIgKyAxICE9IGZpZWxkcy5lbmQoKSB8fCAoaW5jbHVkZV9jYWxsYmFjayAmJiBmaWVsZHMuc2l6ZSgpID4gMCkpIHsKKyAgICAgIHN0ciArPSAiLCAiOworICAgIH0KKyAgfQorCisgIGlmIChpbmNsdWRlX2NhbGxiYWNrKSB7CisgICAgc3RyaW5nIGNhbGxiYWNrX29wdGlvbmFsX3N0cmluZyA9IG9wdGlvbmFsX2NhbGxiYWNrID8gIj8iIDogIiI7CisgICAgaWYgKGdlbl9ub2RlXykgeworICAgICAgdF9zdHJ1Y3QqIGV4Y2VwdGlvbnMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgICAgIHN0cmluZyBleGNlcHRpb25fdHlwZXM7CisgICAgICBpZiAoZXhjZXB0aW9ucykgeworICAgICAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gZXhjZXB0aW9ucy0+Z2V0X21lbWJlcnMoKTsKKyAgICAgICAgZm9yICh2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1lbWJlcnMuYmVnaW4oKTsgaXQgIT0gbWVtYmVycy5lbmQoKTsgKytpdCkgeworICAgICAgICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCppdCktPmdldF90eXBlKCkpOworICAgICAgICAgIGlmIChpdCA9PSBtZW1iZXJzLmJlZ2luKCkpIHsKKyAgICAgICAgICAgIGV4Y2VwdGlvbl90eXBlcyA9IHQtPmdldF9uYW1lKCk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGV4Y2VwdGlvbl90eXBlcyArPSAiIHwgIiArIHQtPmdldF9uYW1lKCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoZXhjZXB0aW9uX3R5cGVzID09ICIiKSB7CisgICAgICAgIHN0ciArPSAiY2FsbGJhY2siICsgY2FsbGJhY2tfb3B0aW9uYWxfc3RyaW5nICsgIjogKGVycm9yOiB2b2lkLCByZXNwb25zZTogIiArIHRzX2dldF90eXBlKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSkgKyAiKT0+dm9pZCk6ICI7CisgICAgICB9IGVsc2UgeworICAgICAgICBzdHIgKz0gImNhbGxiYWNrIiArIGNhbGxiYWNrX29wdGlvbmFsX3N0cmluZyArICI6IChlcnJvcjogIiArIGV4Y2VwdGlvbl90eXBlcyArICIsIHJlc3BvbnNlOiAiICsgdHNfZ2V0X3R5cGUodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKSArICIpPT52b2lkKTogIjsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgc3RyICs9ICJjYWxsYmFjayIgKyBjYWxsYmFja19vcHRpb25hbF9zdHJpbmcgKyAiOiAoZGF0YTogIiArIHRzX2dldF90eXBlKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSkgKyAiKT0+dm9pZCk6ICI7CisgICAgfQorCisgICAgaWYgKGdlbl9qcXVlcnlfKSB7CisgICAgICBzdHIgKz0gIkpRdWVyeVByb21pc2U8IiArIHRzX2dldF90eXBlKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSkgKyI+OyI7CisgICAgfSBlbHNlIHsKKyAgICAgIHN0ciArPSAidm9pZDsiOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoZ2VuX2VzNl8pIHsKKyAgICAgIHN0ciArPSAiKTogUHJvbWlzZTwiICsgdHNfZ2V0X3R5cGUodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKSArICI+OyI7CisgICAgfQorICAgIGVsc2UgeworICAgICAgc3RyICs9ICIpOiAiICsgdHNfZ2V0X3R5cGUodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKSArICI7IjsKKyAgICB9CisgIH0KKworICByZXR1cm4gc3RyOworfQorCisvKioKKyAqIFRha2VzIGEgbmFtZSBhbmQgcHJvZHVjZXMgYSB2YWxpZCBOb2RlSlMgaWRlbnRpZmllciBmcm9tIGl0CisgKgorICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgd2hpY2ggc2hhbGwgYmVjb21lIGEgdmFsaWQgTm9kZUpTIGlkZW50aWZpZXIKKyAqIEByZXR1cm4gVGhlIG1vZGlmaWVkIG5hbWUgd2l0aCB0aGUgdXBkYXRlZCBpZGVudGlmaWVyCisgKi8KK3N0ZDo6c3RyaW5nIHRfanNfZ2VuZXJhdG9yOjptYWtlX3ZhbGlkX25vZGVKc19pZGVudGlmaWVyKHN0ZDo6c3RyaW5nIGNvbnN0JiBuYW1lKSB7CisgIHN0ZDo6c3RyaW5nIHN0ciA9IG5hbWU7CisgIGlmIChzdHIuZW1wdHkoKSkgeworICAgIHJldHVybiBzdHI7CisgIH0KKworICAvLyB0ZXN0cyByZWx5IG9uIHRoaXMKKyAgYXNzZXJ0KCgnQScgPCAnWicpICYmICgnYScgPCAneicpICYmICgnMCcgPCAnOScpKTsKKworICAvLyBpZiB0aGUgZmlyc3QgbGV0dGVyIGlzIGEgbnVtYmVyLCB3ZSBhZGQgYW4gYWRkaXRpb25hbCB1bmRlcnNjb3JlIGluIGZyb250IG9mIGl0CisgIGNoYXIgYyA9IHN0ci5hdCgwKTsKKyAgaWYgKCgnMCcgPD0gYykgJiYgKGMgPD0gJzknKSkgeworICAgIHN0ciA9ICJfIiArIHN0cjsKKyAgfQorCisgIC8vIGZvbGxvd2luZyBjaGFyczogbGV0dGVyLCBudW1iZXIgb3IgdW5kZXJzY29yZQorICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN0ci5zaXplKCk7ICsraSkgeworICAgIGMgPSBzdHIuYXQoaSk7CisgICAgaWYgKCgoJ0EnID4gYykgfHwgKGMgPiAnWicpKSAmJiAoKCdhJyA+IGMpIHx8IChjID4gJ3onKSkgJiYgKCgnMCcgPiBjKSB8fCAoYyA+ICc5JykpCisgICAgICAgICYmICgnXycgIT0gYykgJiYgKCckJyAhPSBjKSkgeworICAgICAgc3RyLnJlcGxhY2UoaSwgMSwgIl8iKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gc3RyOworfQorCitUSFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKGpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiSmF2YXNjcmlwdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAganF1ZXJ5OiAgICAgICAgICBHZW5lcmF0ZSBqUXVlcnkgY29tcGF0aWJsZSBjb2RlLlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIG5vZGU6ICAgICAgICAgICAgR2VuZXJhdGUgbm9kZS5qcyBjb21wYXRpYmxlIGNvZGUuXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgdHM6ICAgICAgICAgICAgICBHZW5lcmF0ZSBUeXBlU2NyaXB0IGRlZmluaXRpb24gZmlsZXMuXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgd2l0aF9uczogICAgICAgICBDcmVhdGUgZ2xvYmFsIG5hbWVzcGFjZSBvYmplY3RzIHdoZW4gdXNpbmcgbm9kZS5qc1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIGVzNjogICAgICAgICAgICAgQ3JlYXRlIEVTNiBjb2RlIHdpdGggUHJvbWlzZXNcbiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2pzb25fZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9qc29uX2dlbmVyYXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDUzNjEyCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9qc29uX2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDc5MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgorICogUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKKyAqIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxsaW1pdHM+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHNzdHJlYW0+CisKKyNpbmNsdWRlICJ0aHJpZnQvcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuaCIKKwordXNpbmcgc3RkOjptYXA7Cit1c2luZyBzdGQ6Om9mc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6dmVjdG9yOwordXNpbmcgc3RkOjpzdGFjazsKKworc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsID0gIlxuIjsKK3N0YXRpYyBjb25zdCBzdHJpbmcgcXVvdCA9ICJcIiI7CitzdGF0aWMgY29uc3QgYm9vbCBOT19JTkRFTlQgPSBmYWxzZTsKK3N0YXRpYyBjb25zdCBib29sIEZPUkNFX1NUUklORyA9IHRydWU7CisKK2NsYXNzIHRfanNvbl9nZW5lcmF0b3IgOiBwdWJsaWMgdF9nZW5lcmF0b3IgeworcHVibGljOgorICB0X2pzb25fZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKKyAgICA6IHRfZ2VuZXJhdG9yKHByb2dyYW0pIHsKKyAgICAodm9pZClvcHRpb25fc3RyaW5nOworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7CisKKyAgICBzaG91bGRfbWVyZ2VfaW5jbHVkZXNfID0gZmFsc2U7CisgICAgZm9yKCBpdGVyID0gcGFyc2VkX29wdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKTsgKytpdGVyKSB7CisgICAgICBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgibWVyZ2UiKSA9PSAwKSB7CisgICAgICAgIHNob3VsZF9tZXJnZV9pbmNsdWRlc18gPSB0cnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgInVua25vd24gb3B0aW9uIGpzb246IiArIGl0ZXItPmZpcnN0OworICAgICAgfQorICAgIH0KKworICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLWpzb24iOworICB9CisKKyAgdmlydHVhbCB+dF9qc29uX2dlbmVyYXRvcigpIHt9CisKKyAgLyoqCisgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcworICAqLworCisgIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKKyAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKKworICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZik7CisgIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKTsKKyAgdm9pZCBnZW5lcmF0ZV9wcm9ncmFtKCk7CisgIHZvaWQgZ2VuZXJhdGVfZnVuY3Rpb24odF9mdW5jdGlvbiogdGZ1bmMpOworICB2b2lkIGdlbmVyYXRlX2ZpZWxkKHRfZmllbGQqIGZpZWxkKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KTsKKworcHJpdmF0ZToKKyAgYm9vbCBzaG91bGRfbWVyZ2VfaW5jbHVkZXNfOworCisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9qc29uXzsKKyAgc3RkOjpzdGFjazxib29sPiBjb21tYV9uZWVkZWRfOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBzdHJpbmcgbnVtYmVyX3RvX3N0cmluZyhUIHQpIHsKKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OworICAgIG91dC5pbWJ1ZShzdGQ6OmxvY2FsZTo6Y2xhc3NpYygpKTsKKyAgICBvdXQucHJlY2lzaW9uKHN0ZDo6bnVtZXJpY19saW1pdHM8VD46OmRpZ2l0czEwKTsKKyAgICBvdXQgPDwgdDsKKyAgICByZXR1cm4gb3V0LnN0cigpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIHZvaWQgd3JpdGVfbnVtYmVyKFQgbikgeworICAgIGZfanNvbl8gPDwgbnVtYmVyX3RvX3N0cmluZyhuKTsKKyAgfQorCisgIHN0cmluZyBnZXRfdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpOworICBzdHJpbmcgZ2V0X3F1YWxpZmllZF9uYW1lKHRfdHlwZSogdHR5cGUpOworCisgIHZvaWQgc3RhcnRfb2JqZWN0KGJvb2wgc2hvdWxkX2luZGVudCA9IHRydWUpOworICB2b2lkIHN0YXJ0X2FycmF5KCk7CisgIHZvaWQgZW5kX29iamVjdCgpOworICB2b2lkIGVuZF9hcnJheSgpOworICB2b2lkIHdyaXRlX2NvbW1hX2lmX25lZWRlZCgpOworICB2b2lkIGluZGljYXRlX2NvbW1hX25lZWRlZCgpOworICBzdHJpbmcgZXNjYXBlX2pzb25fc3RyaW5nKGNvbnN0IHN0cmluZyYgaW5wdXQpOworICBzdHJpbmcganNvbl9zdHIoY29uc3Qgc3RyaW5nJiBzdHIpOworICB2b2lkIG1lcmdlX2luY2x1ZGVzKHRfcHJvZ3JhbSopOworCisgIHZvaWQgZ2VuZXJhdGVfY29uc3RhbnQodF9jb25zdCogY29uKTsKKworICB2b2lkIHdyaXRlX3R5cGVfc3BlY19lbnRyeShjb25zdCBjaGFyKiBuYW1lLCB0X3R5cGUqIHR0eXBlKTsKKyAgdm9pZCB3cml0ZV90eXBlX3NwZWNfb2JqZWN0KGNvbnN0IGNoYXIqIG5hbWUsIHRfdHlwZSogdHR5cGUpOworICB2b2lkIHdyaXRlX3R5cGVfc3BlYyh0X3R5cGUqIHR0eXBlKTsKKyAgdm9pZCB3cml0ZV9zdHJpbmcoY29uc3Qgc3RyaW5nJiB2YWx1ZSk7CisgIHZvaWQgd3JpdGVfdmFsdWUodF90eXBlKiB0dmFsdWUpOworICB2b2lkIHdyaXRlX2NvbnN0X3ZhbHVlKHRfY29uc3RfdmFsdWUqIHZhbHVlLCBib29sIGZvcmNlX3N0cmluZyA9IGZhbHNlKTsKKyAgdm9pZCB3cml0ZV9rZXlfYW5kKHN0cmluZyBrZXkpOworICB2b2lkIHdyaXRlX2tleV9hbmRfc3RyaW5nKHN0cmluZyBrZXksIHN0cmluZyB2YWwpOworICB2b2lkIHdyaXRlX2tleV9hbmRfaW50ZWdlcihzdHJpbmcga2V5LCBpbnQgdmFsKTsKKyAgdm9pZCB3cml0ZV9rZXlfYW5kX2Jvb2woc3RyaW5nIGtleSwgYm9vbCB2YWwpOworfTsKKwordm9pZCB0X2pzb25fZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKKyAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKKworICBzdHJpbmcgZl9qc29uX25hbWUgPSBnZXRfb3V0X2RpcigpICsgcHJvZ3JhbV8tPmdldF9uYW1lKCkgKyAiLmpzb24iOworICBmX2pzb25fLm9wZW4oZl9qc29uX25hbWUuY19zdHIoKSk7CisKKyAgLy8gTWVyZ2UgYWxsIGluY2x1ZGVkIHByb2dyYW1zIGludG8gdGhpcyBvbmUgc28gd2UgY2FuIG91dHB1dCBvbmUgYmlnIGZpbGUuCisgIGlmIChzaG91bGRfbWVyZ2VfaW5jbHVkZXNfKSB7CisgICAgbWVyZ2VfaW5jbHVkZXMocHJvZ3JhbV8pOworICB9Cit9CisKK3N0cmluZyB0X2pzb25fZ2VuZXJhdG9yOjplc2NhcGVfanNvbl9zdHJpbmcoY29uc3Qgc3RyaW5nJiBpbnB1dCkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gc3M7CisgIGZvciAoc3RkOjpzdHJpbmc6OmNvbnN0X2l0ZXJhdG9yIGl0ZXIgPSBpbnB1dC5iZWdpbigpOyBpdGVyICE9IGlucHV0LmVuZCgpOyBpdGVyKyspIHsKKyAgICBzd2l0Y2ggKCppdGVyKSB7CisgICAgY2FzZSAnXFwnOgorICAgICAgc3MgPDwgIlxcXFwiOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnIic6CisgICAgICBzcyA8PCAiXFxcIiI7CisgICAgICBicmVhazsKKyAgICBjYXNlICcvJzoKKyAgICAgIHNzIDw8ICJcXC8iOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnXGInOgorICAgICAgc3MgPDwgIlxcYiI7CisgICAgICBicmVhazsKKyAgICBjYXNlICdcZic6CisgICAgICBzcyA8PCAiXFxmIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ1xuJzoKKyAgICAgIHNzIDw8ICJcXG4iOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnXHInOgorICAgICAgc3MgPDwgIlxcciI7CisgICAgICBicmVhazsKKyAgICBjYXNlICdcdCc6CisgICAgICBzcyA8PCAiXFx0IjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBzcyA8PCAqaXRlcjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gc3Muc3RyKCk7Cit9CisKK3ZvaWQgdF9qc29uX2dlbmVyYXRvcjo6c3RhcnRfb2JqZWN0KGJvb2wgc2hvdWxkX2luZGVudCkgeworICBmX2pzb25fIDw8IChzaG91bGRfaW5kZW50ID8gaW5kZW50KCkgOiAiIikgPDwgInsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBjb21tYV9uZWVkZWRfLnB1c2goZmFsc2UpOworfQorCit2b2lkIHRfanNvbl9nZW5lcmF0b3I6OnN0YXJ0X2FycmF5KCkgeworICBmX2pzb25fIDw8ICJbIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgY29tbWFfbmVlZGVkXy5wdXNoKGZhbHNlKTsKK30KKwordm9pZCB0X2pzb25fZ2VuZXJhdG9yOjp3cml0ZV9jb21tYV9pZl9uZWVkZWQoKSB7CisgIGlmIChjb21tYV9uZWVkZWRfLnRvcCgpKSB7CisgICAgZl9qc29uXyA8PCAiLCIgPDwgZW5kbDsKKyAgfQorfQorCit2b2lkIHRfanNvbl9nZW5lcmF0b3I6OmluZGljYXRlX2NvbW1hX25lZWRlZCgpIHsKKyAgY29tbWFfbmVlZGVkXy5wb3AoKTsKKyAgY29tbWFfbmVlZGVkXy5wdXNoKHRydWUpOworfQorCit2b2lkIHRfanNvbl9nZW5lcmF0b3I6OndyaXRlX2tleV9hbmQoc3RyaW5nIGtleSkgeworICB3cml0ZV9jb21tYV9pZl9uZWVkZWQoKTsKKyAgaW5kZW50KGZfanNvbl8pIDw8IGpzb25fc3RyKGtleSkgPDwgIjogIjsKKyAgaW5kaWNhdGVfY29tbWFfbmVlZGVkKCk7Cit9CisKK3ZvaWQgdF9qc29uX2dlbmVyYXRvcjo6d3JpdGVfa2V5X2FuZF9pbnRlZ2VyKHN0cmluZyBrZXksIGludCB2YWwpIHsKKyAgd3JpdGVfY29tbWFfaWZfbmVlZGVkKCk7CisgIGluZGVudChmX2pzb25fKSA8PCBqc29uX3N0cihrZXkpIDw8ICI6ICIgPDwgbnVtYmVyX3RvX3N0cmluZyh2YWwpOworICBpbmRpY2F0ZV9jb21tYV9uZWVkZWQoKTsKK30KKwordm9pZCB0X2pzb25fZ2VuZXJhdG9yOjp3cml0ZV9rZXlfYW5kX3N0cmluZyhzdHJpbmcga2V5LCBzdHJpbmcgdmFsKSB7CisgIHdyaXRlX2NvbW1hX2lmX25lZWRlZCgpOworICBpbmRlbnQoZl9qc29uXykgPDwganNvbl9zdHIoa2V5KSA8PCAiOiAiIDw8IGpzb25fc3RyKHZhbCk7CisgIGluZGljYXRlX2NvbW1hX25lZWRlZCgpOworfQorCit2b2lkIHRfanNvbl9nZW5lcmF0b3I6OndyaXRlX2tleV9hbmRfYm9vbChzdHJpbmcga2V5LCBib29sIHZhbCkgeworICB3cml0ZV9jb21tYV9pZl9uZWVkZWQoKTsKKyAgaW5kZW50KGZfanNvbl8pIDw8IGpzb25fc3RyKGtleSkgPDwgIjogIiA8PCAodmFsID8gInRydWUiIDogImZhbHNlIik7CisgIGluZGljYXRlX2NvbW1hX25lZWRlZCgpOworfQorCit2b2lkIHRfanNvbl9nZW5lcmF0b3I6OmVuZF9vYmplY3QoKSB7CisgIGluZGVudF9kb3duKCk7CisgIGZfanNvbl8gPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSI7CisgIGNvbW1hX25lZWRlZF8ucG9wKCk7Cit9CisKK3ZvaWQgdF9qc29uX2dlbmVyYXRvcjo6ZW5kX2FycmF5KCkgeworICBpbmRlbnRfZG93bigpOworICBpZiAoY29tbWFfbmVlZGVkXy50b3AoKSkgeworICAgIGZfanNvbl8gPDwgZW5kbDsKKyAgfQorICBpbmRlbnQoZl9qc29uXykgPDwgIl0iOworICBjb21tYV9uZWVkZWRfLnBvcCgpOworfQorCit2b2lkIHRfanNvbl9nZW5lcmF0b3I6OndyaXRlX3R5cGVfc3BlY19vYmplY3QoY29uc3QgY2hhciogbmFtZSwgdF90eXBlKiB0dHlwZSkgeworICB0dHlwZSA9IHR0eXBlLT5nZXRfdHJ1ZV90eXBlKCk7CisgIGlmICh0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkgfHwgdHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgd3JpdGVfa2V5X2FuZChuYW1lKTsKKyAgICBzdGFydF9vYmplY3QoTk9fSU5ERU5UKTsKKyAgICB3cml0ZV9rZXlfYW5kKCJ0eXBlSWQiKTsKKyAgICB3cml0ZV90eXBlX3NwZWModHR5cGUpOworICAgIGVuZF9vYmplY3QoKTsKKyAgfQorfQorCit2b2lkIHRfanNvbl9nZW5lcmF0b3I6OndyaXRlX3R5cGVfc3BlY19lbnRyeShjb25zdCBjaGFyKiBuYW1lLCB0X3R5cGUqIHR0eXBlKSB7CisgIHdyaXRlX2tleV9hbmQobmFtZSk7CisgIHdyaXRlX3R5cGVfc3BlYyh0dHlwZSk7Cit9CisKK3ZvaWQgdF9qc29uX2dlbmVyYXRvcjo6d3JpdGVfdHlwZV9zcGVjKHRfdHlwZSogdHR5cGUpIHsKKyAgdHR5cGUgPSB0dHlwZS0+Z2V0X3RydWVfdHlwZSgpOworCisgIHdyaXRlX3N0cmluZyhnZXRfdHlwZV9uYW1lKHR0eXBlKSk7CisKKyAgaWYgKHR0eXBlLT5hbm5vdGF0aW9uc18uc2l6ZSgpID4gMCkgeworICAgIHdyaXRlX2tleV9hbmQoImFubm90YXRpb25zIik7CisgICAgc3RhcnRfb2JqZWN0KCk7CisgICAgZm9yIChtYXA8c3RyaW5nLCBzdHJpbmc+OjppdGVyYXRvciBpdCA9IHR0eXBlLT5hbm5vdGF0aW9uc18uYmVnaW4oKTsgaXQgIT0gdHR5cGUtPmFubm90YXRpb25zXy5lbmQoKTsgKytpdCkgeworICAgICAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoaXQtPmZpcnN0LCBpdC0+c2Vjb25kKTsKKyAgICB9CisgICAgZW5kX29iamVjdCgpOworICB9CisKKyAgaWYgKHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHdyaXRlX2tleV9hbmRfc3RyaW5nKCJjbGFzcyIsIGdldF9xdWFsaWZpZWRfbmFtZSh0dHlwZSkpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpOworICAgIHdyaXRlX2tleV9hbmRfc3RyaW5nKCJrZXlUeXBlSWQiLCBnZXRfdHlwZV9uYW1lKGt0eXBlKSk7CisgICAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoInZhbHVlVHlwZUlkIiwgZ2V0X3R5cGVfbmFtZSh2dHlwZSkpOworICAgIHdyaXRlX3R5cGVfc3BlY19vYmplY3QoImtleVR5cGUiLCBrdHlwZSk7CisgICAgd3JpdGVfdHlwZV9zcGVjX29iamVjdCgidmFsdWVUeXBlIiwgdnR5cGUpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICB0X3R5cGUqIGV0eXBlID0gKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIHdyaXRlX2tleV9hbmRfc3RyaW5nKCJlbGVtVHlwZUlkIiwgZ2V0X3R5cGVfbmFtZShldHlwZSkpOworICAgIHdyaXRlX3R5cGVfc3BlY19vYmplY3QoImVsZW1UeXBlIiwgZXR5cGUpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB3cml0ZV9rZXlfYW5kX3N0cmluZygiZWxlbVR5cGVJZCIsIGdldF90eXBlX25hbWUoZXR5cGUpKTsKKyAgICB3cml0ZV90eXBlX3NwZWNfb2JqZWN0KCJlbGVtVHlwZSIsIGV0eXBlKTsKKyAgfQorfQorCit2b2lkIHRfanNvbl9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKKyAgZl9qc29uXyA8PCBlbmRsOworICBmX2pzb25fLmNsb3NlKCk7Cit9CisKK3ZvaWQgdF9qc29uX2dlbmVyYXRvcjo6bWVyZ2VfaW5jbHVkZXModF9wcm9ncmFtKiBwcm9ncmFtKSB7CisgIHZlY3Rvcjx0X3Byb2dyYW0qPiBpbmNsdWRlcyA9IHByb2dyYW0tPmdldF9pbmNsdWRlcygpOworICB2ZWN0b3I8dF9wcm9ncmFtKj46Oml0ZXJhdG9yIGluY19pdGVyOworICBmb3IgKGluY19pdGVyID0gaW5jbHVkZXMuYmVnaW4oKTsgaW5jX2l0ZXIgIT0gaW5jbHVkZXMuZW5kKCk7ICsraW5jX2l0ZXIpIHsKKyAgICB0X3Byb2dyYW0qIGluY2x1ZGUgPSAqaW5jX2l0ZXI7CisgICAgLy8gcmVjdXJzZSBpbiBjYXNlIHdlIGdldCBjcmF6eQorICAgIG1lcmdlX2luY2x1ZGVzKGluY2x1ZGUpOworICAgIC8vIG1lcmdlIGVudW1zCisgICAgdmVjdG9yPHRfZW51bSo+IGVudW1zID0gaW5jbHVkZS0+Z2V0X2VudW1zKCk7CisgICAgdmVjdG9yPHRfZW51bSo+OjppdGVyYXRvciBlbl9pdGVyOworICAgIGZvciAoZW5faXRlciA9IGVudW1zLmJlZ2luKCk7IGVuX2l0ZXIgIT0gZW51bXMuZW5kKCk7ICsrZW5faXRlcikgeworICAgICAgcHJvZ3JhbS0+YWRkX2VudW0oKmVuX2l0ZXIpOworICAgIH0KKyAgICAvLyBtZXJnZSB0eXBlZGVmcworICAgIHZlY3Rvcjx0X3R5cGVkZWYqPiB0eXBlZGVmcyA9IGluY2x1ZGUtPmdldF90eXBlZGVmcygpOworICAgIHZlY3Rvcjx0X3R5cGVkZWYqPjo6aXRlcmF0b3IgdGRfaXRlcjsKKyAgICBmb3IgKHRkX2l0ZXIgPSB0eXBlZGVmcy5iZWdpbigpOyB0ZF9pdGVyICE9IHR5cGVkZWZzLmVuZCgpOyArK3RkX2l0ZXIpIHsKKyAgICAgIHByb2dyYW0tPmFkZF90eXBlZGVmKCp0ZF9pdGVyKTsKKyAgICB9CisgICAgLy8gbWVyZ2Ugc3RydWN0cworICAgIHZlY3Rvcjx0X3N0cnVjdCo+IG9iamVjdHMgPSBpbmNsdWRlLT5nZXRfb2JqZWN0cygpOworICAgIHZlY3Rvcjx0X3N0cnVjdCo+OjppdGVyYXRvciBvX2l0ZXI7CisgICAgZm9yIChvX2l0ZXIgPSBvYmplY3RzLmJlZ2luKCk7IG9faXRlciAhPSBvYmplY3RzLmVuZCgpOyArK29faXRlcikgeworICAgICAgcHJvZ3JhbS0+YWRkX3N0cnVjdCgqb19pdGVyKTsKKyAgICB9CisgICAgLy8gbWVyZ2UgY29uc3RhbnRzCisgICAgdmVjdG9yPHRfY29uc3QqPiBjb25zdHMgPSBpbmNsdWRlLT5nZXRfY29uc3RzKCk7CisgICAgdmVjdG9yPHRfY29uc3QqPjo6aXRlcmF0b3IgY19pdGVyOworICAgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgICBwcm9ncmFtLT5hZGRfY29uc3QoKmNfaXRlcik7CisgICAgfQorCisgICAgLy8gbWVyZ2Ugc2VydmljZXMKKyAgICB2ZWN0b3I8dF9zZXJ2aWNlKj4gc2VydmljZXMgPSBpbmNsdWRlLT5nZXRfc2VydmljZXMoKTsKKyAgICB2ZWN0b3I8dF9zZXJ2aWNlKj46Oml0ZXJhdG9yIHN2X2l0ZXI7CisgICAgZm9yIChzdl9pdGVyID0gc2VydmljZXMuYmVnaW4oKTsgc3ZfaXRlciAhPSBzZXJ2aWNlcy5lbmQoKTsgKytzdl9pdGVyKSB7CisgICAgICBwcm9ncmFtLT5hZGRfc2VydmljZSgqc3ZfaXRlcik7CisgICAgfQorICB9Cit9CisKK3ZvaWQgdF9qc29uX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvZ3JhbSgpIHsKKworICBpbml0X2dlbmVyYXRvcigpOworCisgIHN0YXJ0X29iamVjdCgpOworICB3cml0ZV9rZXlfYW5kX3N0cmluZygibmFtZSIsIHByb2dyYW1fLT5nZXRfbmFtZSgpKTsKKyAgaWYgKHByb2dyYW1fLT5oYXNfZG9jKCkpIHsKKyAgICB3cml0ZV9rZXlfYW5kX3N0cmluZygiZG9jIiwgcHJvZ3JhbV8tPmdldF9kb2MoKSk7CisgIH0KKworICAvLyBXaGVuIG1lcmdpbmcgaW5jbHVkZXMsIHRoZSAibmFtZXNwYWNlcyIgYW5kICJpbmNsdWRlcyIgc2VjdGlvbnMKKyAgLy8gYmVjb21lIGFtYmlndW91cywgc28ganVzdCBza2lwIHRoZW0uCisgIGlmICghc2hvdWxkX21lcmdlX2luY2x1ZGVzXykgeworICAgIC8vIEdlbmVyYXRlIG5hbWVzcGFjZXMKKyAgICB3cml0ZV9rZXlfYW5kKCJuYW1lc3BhY2VzIik7CisgICAgc3RhcnRfb2JqZWN0KE5PX0lOREVOVCk7CisgICAgY29uc3QgbWFwPHN0cmluZywgc3RyaW5nPiYgbmFtZXNwYWNlcyA9IHByb2dyYW1fLT5nZXRfbmFtZXNwYWNlcygpOworICAgIG1hcDxzdHJpbmcsIHN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIG5zX2l0OworICAgIGZvciAobnNfaXQgPSBuYW1lc3BhY2VzLmJlZ2luKCk7IG5zX2l0ICE9IG5hbWVzcGFjZXMuZW5kKCk7ICsrbnNfaXQpIHsKKyAgICAgIHdyaXRlX2tleV9hbmRfc3RyaW5nKG5zX2l0LT5maXJzdCwgbnNfaXQtPnNlY29uZCk7CisgICAgICBpbmRpY2F0ZV9jb21tYV9uZWVkZWQoKTsKKyAgICB9CisgICAgZW5kX29iamVjdCgpOworCisgICAgLy8gR2VuZXJhdGUgaW5jbHVkZXMKKyAgICB3cml0ZV9rZXlfYW5kKCJpbmNsdWRlcyIpOworICAgIHN0YXJ0X2FycmF5KCk7CisgICAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+IGluY2x1ZGVzID0gcHJvZ3JhbV8tPmdldF9pbmNsdWRlcygpOworICAgIHZlY3Rvcjx0X3Byb2dyYW0qPjo6Y29uc3RfaXRlcmF0b3IgaW5jX2l0OworICAgIGZvciAoaW5jX2l0ID0gaW5jbHVkZXMuYmVnaW4oKTsgaW5jX2l0ICE9IGluY2x1ZGVzLmVuZCgpOyArK2luY19pdCkgeworICAgICAgd3JpdGVfY29tbWFfaWZfbmVlZGVkKCk7CisgICAgICB3cml0ZV9zdHJpbmcoKCppbmNfaXQpLT5nZXRfbmFtZSgpKTsKKyAgICAgIGluZGljYXRlX2NvbW1hX25lZWRlZCgpOworICAgIH0KKyAgICBlbmRfYXJyYXkoKTsKKyAgfQorCisgIC8vIEdlbmVyYXRlIGVudW1zCisgIHdyaXRlX2tleV9hbmQoImVudW1zIik7CisgIHN0YXJ0X2FycmF5KCk7CisgIHZlY3Rvcjx0X2VudW0qPiBlbnVtcyA9IHByb2dyYW1fLT5nZXRfZW51bXMoKTsKKyAgdmVjdG9yPHRfZW51bSo+OjppdGVyYXRvciBlbl9pdGVyOworICBmb3IgKGVuX2l0ZXIgPSBlbnVtcy5iZWdpbigpOyBlbl9pdGVyICE9IGVudW1zLmVuZCgpOyArK2VuX2l0ZXIpIHsKKyAgICB3cml0ZV9jb21tYV9pZl9uZWVkZWQoKTsKKyAgICBnZW5lcmF0ZV9lbnVtKCplbl9pdGVyKTsKKyAgICBpbmRpY2F0ZV9jb21tYV9uZWVkZWQoKTsKKyAgfQorICBlbmRfYXJyYXkoKTsKKworICAvLyBHZW5lcmF0ZSB0eXBlZGVmcworICB3cml0ZV9rZXlfYW5kKCJ0eXBlZGVmcyIpOworICBzdGFydF9hcnJheSgpOworICB2ZWN0b3I8dF90eXBlZGVmKj4gdHlwZWRlZnMgPSBwcm9ncmFtXy0+Z2V0X3R5cGVkZWZzKCk7CisgIHZlY3Rvcjx0X3R5cGVkZWYqPjo6aXRlcmF0b3IgdGRfaXRlcjsKKyAgZm9yICh0ZF9pdGVyID0gdHlwZWRlZnMuYmVnaW4oKTsgdGRfaXRlciAhPSB0eXBlZGVmcy5lbmQoKTsgKyt0ZF9pdGVyKSB7CisgICAgd3JpdGVfY29tbWFfaWZfbmVlZGVkKCk7CisgICAgZ2VuZXJhdGVfdHlwZWRlZigqdGRfaXRlcik7CisgICAgaW5kaWNhdGVfY29tbWFfbmVlZGVkKCk7CisgIH0KKyAgZW5kX2FycmF5KCk7CisKKyAgLy8gR2VuZXJhdGUgc3RydWN0cywgZXhjZXB0aW9ucywgYW5kIHVuaW9ucyBpbiBkZWNsYXJlZCBvcmRlcgorICB3cml0ZV9rZXlfYW5kKCJzdHJ1Y3RzIik7CisgIHN0YXJ0X2FycmF5KCk7CisgIHZlY3Rvcjx0X3N0cnVjdCo+IG9iamVjdHMgPSBwcm9ncmFtXy0+Z2V0X29iamVjdHMoKTsKKyAgdmVjdG9yPHRfc3RydWN0Kj46Oml0ZXJhdG9yIG9faXRlcjsKKyAgZm9yIChvX2l0ZXIgPSBvYmplY3RzLmJlZ2luKCk7IG9faXRlciAhPSBvYmplY3RzLmVuZCgpOyArK29faXRlcikgeworICAgIHdyaXRlX2NvbW1hX2lmX25lZWRlZCgpOworICAgIGlmICgoKm9faXRlciktPmlzX3hjZXB0aW9uKCkpIHsKKyAgICAgIGdlbmVyYXRlX3hjZXB0aW9uKCpvX2l0ZXIpOworICAgIH0gZWxzZSB7CisgICAgICBnZW5lcmF0ZV9zdHJ1Y3QoKm9faXRlcik7CisgICAgfQorICAgIGluZGljYXRlX2NvbW1hX25lZWRlZCgpOworICB9CisgIGVuZF9hcnJheSgpOworCisgIC8vIEdlbmVyYXRlIGNvbnN0YW50cworICB3cml0ZV9rZXlfYW5kKCJjb25zdGFudHMiKTsKKyAgc3RhcnRfYXJyYXkoKTsKKyAgdmVjdG9yPHRfY29uc3QqPiBjb25zdHMgPSBwcm9ncmFtXy0+Z2V0X2NvbnN0cygpOworICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7CisgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgd3JpdGVfY29tbWFfaWZfbmVlZGVkKCk7CisgICAgZ2VuZXJhdGVfY29uc3RhbnQoKmNfaXRlcik7CisgICAgaW5kaWNhdGVfY29tbWFfbmVlZGVkKCk7CisgIH0KKyAgZW5kX2FycmF5KCk7CisKKyAgLy8gR2VuZXJhdGUgc2VydmljZXMKKyAgd3JpdGVfa2V5X2FuZCgic2VydmljZXMiKTsKKyAgc3RhcnRfYXJyYXkoKTsKKyAgdmVjdG9yPHRfc2VydmljZSo+IHNlcnZpY2VzID0gcHJvZ3JhbV8tPmdldF9zZXJ2aWNlcygpOworICB2ZWN0b3I8dF9zZXJ2aWNlKj46Oml0ZXJhdG9yIHN2X2l0ZXI7CisgIGZvciAoc3ZfaXRlciA9IHNlcnZpY2VzLmJlZ2luKCk7IHN2X2l0ZXIgIT0gc2VydmljZXMuZW5kKCk7ICsrc3ZfaXRlcikgeworICAgIHdyaXRlX2NvbW1hX2lmX25lZWRlZCgpOworICAgIGdlbmVyYXRlX3NlcnZpY2UoKnN2X2l0ZXIpOworICAgIGluZGljYXRlX2NvbW1hX25lZWRlZCgpOworICB9CisgIGVuZF9hcnJheSgpOworCisgIGVuZF9vYmplY3QoKTsKKworICAvLyBDbG9zZSB0aGUgZ2VuZXJhdG9yCisgIGNsb3NlX2dlbmVyYXRvcigpOworfQorCit2b2lkIHRfanNvbl9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgeworICBzdGFydF9vYmplY3QoKTsKKyAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoIm5hbWUiLCBnZXRfcXVhbGlmaWVkX25hbWUodHR5cGVkZWYpKTsKKyAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoInR5cGVJZCIsIGdldF90eXBlX25hbWUodHR5cGVkZWYtPmdldF90cnVlX3R5cGUoKSkpOworICB3cml0ZV90eXBlX3NwZWNfb2JqZWN0KCJ0eXBlIiwgdHR5cGVkZWYtPmdldF90cnVlX3R5cGUoKSk7CisgIGlmICh0dHlwZWRlZi0+aGFzX2RvYygpKSB7CisgICAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoImRvYyIsIHR0eXBlZGVmLT5nZXRfZG9jKCkpOworICB9CisgIGlmICh0dHlwZWRlZi0+YW5ub3RhdGlvbnNfLnNpemUoKSA+IDApIHsKKyAgICB3cml0ZV9rZXlfYW5kKCJhbm5vdGF0aW9ucyIpOworICAgIHN0YXJ0X29iamVjdCgpOworICAgIGZvciAobWFwPHN0cmluZywgc3RyaW5nPjo6aXRlcmF0b3IgaXQgPSB0dHlwZWRlZi0+YW5ub3RhdGlvbnNfLmJlZ2luKCk7IGl0ICE9IHR0eXBlZGVmLT5hbm5vdGF0aW9uc18uZW5kKCk7ICsraXQpIHsKKyAgICAgIHdyaXRlX2tleV9hbmRfc3RyaW5nKGl0LT5maXJzdCwgaXQtPnNlY29uZCk7CisgICAgfQorICAgIGVuZF9vYmplY3QoKTsKKyAgfQorICBlbmRfb2JqZWN0KCk7Cit9CisKK3ZvaWQgdF9qc29uX2dlbmVyYXRvcjo6d3JpdGVfc3RyaW5nKGNvbnN0IHN0cmluZyYgdmFsdWUpIHsKKyAgZl9qc29uXyA8PCBxdW90IDw8IGVzY2FwZV9qc29uX3N0cmluZyh2YWx1ZSkgPDwgcXVvdDsKK30KKwordm9pZCB0X2pzb25fZ2VuZXJhdG9yOjp3cml0ZV9jb25zdF92YWx1ZSh0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwgYm9vbCBzaG91bGRfZm9yY2Vfc3RyaW5nKSB7CisKKyAgc3dpdGNoICh2YWx1ZS0+Z2V0X3R5cGUoKSkgeworCisgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfSURFTlRJRklFUjoKKyAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSOgorICAgIGlmIChzaG91bGRfZm9yY2Vfc3RyaW5nKSB7CisgICAgICB3cml0ZV9zdHJpbmcobnVtYmVyX3RvX3N0cmluZyh2YWx1ZS0+Z2V0X2ludGVnZXIoKSkpOworICAgIH0gZWxzZSB7CisgICAgICB3cml0ZV9udW1iZXIodmFsdWUtPmdldF9pbnRlZ2VyKCkpOworICAgIH0KKyAgICBicmVhazsKKworICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX0RPVUJMRToKKyAgICBpZiAoc2hvdWxkX2ZvcmNlX3N0cmluZykgeworICAgICAgd3JpdGVfc3RyaW5nKG51bWJlcl90b19zdHJpbmcodmFsdWUtPmdldF9kb3VibGUoKSkpOworICAgIH0gZWxzZSB7CisgICAgICB3cml0ZV9udW1iZXIodmFsdWUtPmdldF9kb3VibGUoKSk7CisgICAgfQorICAgIGJyZWFrOworCisgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfU1RSSU5HOgorICAgIHdyaXRlX3N0cmluZyh2YWx1ZS0+Z2V0X3N0cmluZygpKTsKKyAgICBicmVhazsKKworICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX0xJU1Q6IHsKKyAgICBzdGFydF9hcnJheSgpOworICAgIHN0ZDo6dmVjdG9yPHRfY29uc3RfdmFsdWUqPiBsaXN0ID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgc3RkOjp2ZWN0b3I8dF9jb25zdF92YWx1ZSo+OjppdGVyYXRvciBsaXQ7CisgICAgZm9yIChsaXQgPSBsaXN0LmJlZ2luKCk7IGxpdCAhPSBsaXN0LmVuZCgpOyArK2xpdCkgeworICAgICAgd3JpdGVfY29tbWFfaWZfbmVlZGVkKCk7CisgICAgICBmX2pzb25fIDw8IGluZGVudCgpOworICAgICAgd3JpdGVfY29uc3RfdmFsdWUoKmxpdCk7CisgICAgICBpbmRpY2F0ZV9jb21tYV9uZWVkZWQoKTsKKyAgICB9CisgICAgZW5kX2FycmF5KCk7CisgICAgYnJlYWs7CisgIH0KKworICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX01BUDogeworICAgIHN0YXJ0X29iamVjdChOT19JTkRFTlQpOworICAgIHN0ZDo6bWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4gbWFwID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBzdGQ6Om1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+OjppdGVyYXRvciBtaXQ7CisgICAgZm9yIChtaXQgPSBtYXAuYmVnaW4oKTsgbWl0ICE9IG1hcC5lbmQoKTsgKyttaXQpIHsKKyAgICAgIHdyaXRlX2NvbW1hX2lmX25lZWRlZCgpOworICAgICAgZl9qc29uXyA8PCBpbmRlbnQoKTsKKyAgICAgIC8vIEpTT04gb2JqZWN0cyBvbmx5IGFsbG93IHN0cmluZyBrZXlzCisgICAgICB3cml0ZV9jb25zdF92YWx1ZShtaXQtPmZpcnN0LCBGT1JDRV9TVFJJTkcpOworICAgICAgZl9qc29uXyA8PCAiOiAiOworICAgICAgd3JpdGVfY29uc3RfdmFsdWUobWl0LT5zZWNvbmQpOworICAgICAgaW5kaWNhdGVfY29tbWFfbmVlZGVkKCk7CisgICAgfQorICAgIGVuZF9vYmplY3QoKTsKKyAgICBicmVhazsKKyAgfQorCisgIGRlZmF1bHQ6CisgICAgZl9qc29uXyA8PCAibnVsbCI7CisgICAgYnJlYWs7CisgIH0KK30KKworc3RyaW5nIHRfanNvbl9nZW5lcmF0b3I6Ompzb25fc3RyKGNvbnN0IHN0cmluZyYgc3RyKSB7CisgIHJldHVybiBxdW90ICsgZXNjYXBlX2pzb25fc3RyaW5nKHN0cikgKyBxdW90OworfQorCit2b2lkIHRfanNvbl9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0YW50KHRfY29uc3QqIGNvbikgeworICBzdGFydF9vYmplY3QoKTsKKworICB3cml0ZV9rZXlfYW5kX3N0cmluZygibmFtZSIsIGNvbi0+Z2V0X25hbWUoKSk7CisgIHdyaXRlX2tleV9hbmRfc3RyaW5nKCJ0eXBlSWQiLCBnZXRfdHlwZV9uYW1lKGNvbi0+Z2V0X3R5cGUoKSkpOworICB3cml0ZV90eXBlX3NwZWNfb2JqZWN0KCJ0eXBlIiwgY29uLT5nZXRfdHlwZSgpKTsKKworICBpZiAoY29uLT5oYXNfZG9jKCkpIHsKKyAgICB3cml0ZV9rZXlfYW5kX3N0cmluZygiZG9jIiwgY29uLT5nZXRfZG9jKCkpOworICB9CisKKyAgd3JpdGVfa2V5X2FuZCgidmFsdWUiKTsKKyAgd3JpdGVfY29uc3RfdmFsdWUoY29uLT5nZXRfdmFsdWUoKSk7CisKKyAgZW5kX29iamVjdCgpOworfQorCit2b2lkIHRfanNvbl9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgeworICBzdGFydF9vYmplY3QoKTsKKworICB3cml0ZV9rZXlfYW5kX3N0cmluZygibmFtZSIsIHRlbnVtLT5nZXRfbmFtZSgpKTsKKworICBpZiAodGVudW0tPmhhc19kb2MoKSkgeworICAgIHdyaXRlX2tleV9hbmRfc3RyaW5nKCJkb2MiLCB0ZW51bS0+Z2V0X2RvYygpKTsKKyAgfQorCisgIGlmICh0ZW51bS0+YW5ub3RhdGlvbnNfLnNpemUoKSA+IDApIHsKKyAgICAgIHdyaXRlX2tleV9hbmQoImFubm90YXRpb25zIik7CisgICAgICBzdGFydF9vYmplY3QoKTsKKyAgICAgIGZvciAobWFwPHN0cmluZywgc3RyaW5nPjo6aXRlcmF0b3IgaXQgPSB0ZW51bS0+YW5ub3RhdGlvbnNfLmJlZ2luKCk7IGl0ICE9IHRlbnVtLT5hbm5vdGF0aW9uc18uZW5kKCk7ICsraXQpIHsKKyAgICAgICAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoaXQtPmZpcnN0LCBpdC0+c2Vjb25kKTsKKyAgICAgIH0KKyAgICAgIGVuZF9vYmplY3QoKTsKKyAgfQorCisgIHdyaXRlX2tleV9hbmQoIm1lbWJlcnMiKTsKKyAgc3RhcnRfYXJyYXkoKTsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IHZhbHVlcyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgdmFsX2l0ZXI7CisgIGZvciAodmFsX2l0ZXIgPSB2YWx1ZXMuYmVnaW4oKTsgdmFsX2l0ZXIgIT0gdmFsdWVzLmVuZCgpOyArK3ZhbF9pdGVyKSB7CisgICAgd3JpdGVfY29tbWFfaWZfbmVlZGVkKCk7CisgICAgdF9lbnVtX3ZhbHVlKiB2YWwgPSAoKnZhbF9pdGVyKTsKKyAgICBzdGFydF9vYmplY3QoKTsKKyAgICB3cml0ZV9rZXlfYW5kX3N0cmluZygibmFtZSIsIHZhbC0+Z2V0X25hbWUoKSk7CisgICAgd3JpdGVfa2V5X2FuZF9pbnRlZ2VyKCJ2YWx1ZSIsIHZhbC0+Z2V0X3ZhbHVlKCkpOworICAgIGlmICh2YWwtPmhhc19kb2MoKSkgeworICAgICAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoImRvYyIsIHZhbC0+Z2V0X2RvYygpKTsKKyAgICB9CisgICAgZW5kX29iamVjdCgpOworICAgIGluZGljYXRlX2NvbW1hX25lZWRlZCgpOworICB9CisgIGVuZF9hcnJheSgpOworCisgIGVuZF9vYmplY3QoKTsKK30KKwordm9pZCB0X2pzb25fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgc3RhcnRfb2JqZWN0KCk7CisKKyAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoIm5hbWUiLCB0c3RydWN0LT5nZXRfbmFtZSgpKTsKKworICBpZiAodHN0cnVjdC0+aGFzX2RvYygpKSB7CisgICAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoImRvYyIsIHRzdHJ1Y3QtPmdldF9kb2MoKSk7CisgIH0KKworICBpZiAodHN0cnVjdC0+YW5ub3RhdGlvbnNfLnNpemUoKSA+IDApIHsKKyAgICB3cml0ZV9rZXlfYW5kKCJhbm5vdGF0aW9ucyIpOworICAgIHN0YXJ0X29iamVjdCgpOworICAgIGZvciAobWFwPHN0cmluZywgc3RyaW5nPjo6aXRlcmF0b3IgaXQgPSB0c3RydWN0LT5hbm5vdGF0aW9uc18uYmVnaW4oKTsgaXQgIT0gdHN0cnVjdC0+YW5ub3RhdGlvbnNfLmVuZCgpOyArK2l0KSB7CisgICAgICB3cml0ZV9rZXlfYW5kX3N0cmluZyhpdC0+Zmlyc3QsIGl0LT5zZWNvbmQpOworICAgIH0KKyAgICBlbmRfb2JqZWN0KCk7CisgIH0KKworICB3cml0ZV9rZXlfYW5kX2Jvb2woImlzRXhjZXB0aW9uIiwgdHN0cnVjdC0+aXNfeGNlcHRpb24oKSk7CisKKyAgd3JpdGVfa2V5X2FuZF9ib29sKCJpc1VuaW9uIiwgdHN0cnVjdC0+aXNfdW5pb24oKSk7CisKKyAgd3JpdGVfa2V5X2FuZCgiZmllbGRzIik7CisgIHN0YXJ0X2FycmF5KCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj4gbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46Oml0ZXJhdG9yIG1lbV9pdGVyOworICBmb3IgKG1lbV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtZW1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyBtZW1faXRlcisrKSB7CisgICAgd3JpdGVfY29tbWFfaWZfbmVlZGVkKCk7CisgICAgZ2VuZXJhdGVfZmllbGQoKm1lbV9pdGVyKTsKKyAgICBpbmRpY2F0ZV9jb21tYV9uZWVkZWQoKTsKKyAgfQorICBlbmRfYXJyYXkoKTsKKworICBlbmRfb2JqZWN0KCk7Cit9CisKK3ZvaWQgdF9qc29uX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0YXJ0X29iamVjdCgpOworCisgIHdyaXRlX2tleV9hbmRfc3RyaW5nKCJuYW1lIiwgZ2V0X3F1YWxpZmllZF9uYW1lKHRzZXJ2aWNlKSk7CisKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKSB7CisgICAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoImV4dGVuZHMiLCBnZXRfcXVhbGlmaWVkX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpKTsKKyAgfQorCisgIGlmICh0c2VydmljZS0+aGFzX2RvYygpKSB7CisgICAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoImRvYyIsIHRzZXJ2aWNlLT5nZXRfZG9jKCkpOworICB9CisKKyAgaWYgKHRzZXJ2aWNlLT5hbm5vdGF0aW9uc18uc2l6ZSgpID4gMCkgeworICAgIHdyaXRlX2tleV9hbmQoImFubm90YXRpb25zIik7CisgICAgc3RhcnRfb2JqZWN0KCk7CisgICAgZm9yIChtYXA8c3RyaW5nLCBzdHJpbmc+OjppdGVyYXRvciBpdCA9IHRzZXJ2aWNlLT5hbm5vdGF0aW9uc18uYmVnaW4oKTsgaXQgIT0gdHNlcnZpY2UtPmFubm90YXRpb25zXy5lbmQoKTsgKytpdCkgeworICAgICAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoaXQtPmZpcnN0LCBpdC0+c2Vjb25kKTsKKyAgICB9CisgICAgZW5kX29iamVjdCgpOworICB9CisKKyAgd3JpdGVfa2V5X2FuZCgiZnVuY3Rpb25zIik7CisgIHN0YXJ0X2FycmF5KCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZm5faXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOworICBmb3IgKDsgZm5faXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7IGZuX2l0ZXIrKykgeworICAgIHdyaXRlX2NvbW1hX2lmX25lZWRlZCgpOworICAgIGdlbmVyYXRlX2Z1bmN0aW9uKCpmbl9pdGVyKTsKKyAgICBpbmRpY2F0ZV9jb21tYV9uZWVkZWQoKTsKKyAgfQorICBlbmRfYXJyYXkoKTsKKworICBlbmRfb2JqZWN0KCk7Cit9CisKK3ZvaWQgdF9qc29uX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZnVuY3Rpb24odF9mdW5jdGlvbiogdGZ1bmMpIHsKKyAgc3RhcnRfb2JqZWN0KCk7CisKKyAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoIm5hbWUiLCB0ZnVuYy0+Z2V0X25hbWUoKSk7CisKKyAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoInJldHVyblR5cGVJZCIsIGdldF90eXBlX25hbWUodGZ1bmMtPmdldF9yZXR1cm50eXBlKCkpKTsKKyAgd3JpdGVfdHlwZV9zcGVjX29iamVjdCgicmV0dXJuVHlwZSIsIHRmdW5jLT5nZXRfcmV0dXJudHlwZSgpKTsKKworICB3cml0ZV9rZXlfYW5kX2Jvb2woIm9uZXdheSIsIHRmdW5jLT5pc19vbmV3YXkoKSk7CisKKyAgaWYgKHRmdW5jLT5oYXNfZG9jKCkpIHsKKyAgICB3cml0ZV9rZXlfYW5kX3N0cmluZygiZG9jIiwgdGZ1bmMtPmdldF9kb2MoKSk7CisgIH0KKworICBpZiAodGZ1bmMtPmFubm90YXRpb25zXy5zaXplKCkgPiAwKSB7CisgICAgd3JpdGVfa2V5X2FuZCgiYW5ub3RhdGlvbnMiKTsKKyAgICBzdGFydF9vYmplY3QoKTsKKyAgICBmb3IgKG1hcDxzdHJpbmcsIHN0cmluZz46Oml0ZXJhdG9yIGl0ID0gdGZ1bmMtPmFubm90YXRpb25zXy5iZWdpbigpOyBpdCAhPSB0ZnVuYy0+YW5ub3RhdGlvbnNfLmVuZCgpOyArK2l0KSB7CisgICAgICB3cml0ZV9rZXlfYW5kX3N0cmluZyhpdC0+Zmlyc3QsIGl0LT5zZWNvbmQpOworICAgIH0KKyAgICBlbmRfb2JqZWN0KCk7CisgIH0KKworICB3cml0ZV9rZXlfYW5kKCJhcmd1bWVudHMiKTsKKyAgc3RhcnRfYXJyYXkoKTsKKyAgdmVjdG9yPHRfZmllbGQqPiBtZW1iZXJzID0gdGZ1bmMtPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46Oml0ZXJhdG9yIG1lbV9pdGVyID0gbWVtYmVycy5iZWdpbigpOworICBmb3IgKDsgbWVtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgbWVtX2l0ZXIrKykgeworICAgIHdyaXRlX2NvbW1hX2lmX25lZWRlZCgpOworICAgIGdlbmVyYXRlX2ZpZWxkKCptZW1faXRlcik7CisgICAgaW5kaWNhdGVfY29tbWFfbmVlZGVkKCk7CisgIH0KKyAgZW5kX2FycmF5KCk7CisKKyAgd3JpdGVfa2V5X2FuZCgiZXhjZXB0aW9ucyIpOworICBzdGFydF9hcnJheSgpOworICB2ZWN0b3I8dF9maWVsZCo+IGV4Y2VwdHMgPSB0ZnVuYy0+Z2V0X3hjZXB0aW9ucygpLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+OjppdGVyYXRvciBleF9pdGVyID0gZXhjZXB0cy5iZWdpbigpOworICBmb3IgKDsgZXhfaXRlciAhPSBleGNlcHRzLmVuZCgpOyBleF9pdGVyKyspIHsKKyAgICB3cml0ZV9jb21tYV9pZl9uZWVkZWQoKTsKKyAgICBnZW5lcmF0ZV9maWVsZCgqZXhfaXRlcik7CisgICAgaW5kaWNhdGVfY29tbWFfbmVlZGVkKCk7CisgIH0KKyAgZW5kX2FycmF5KCk7CisKKyAgZW5kX29iamVjdCgpOworfQorCit2b2lkIHRfanNvbl9nZW5lcmF0b3I6OmdlbmVyYXRlX2ZpZWxkKHRfZmllbGQqIGZpZWxkKSB7CisgIHN0YXJ0X29iamVjdCgpOworCisgIHdyaXRlX2tleV9hbmRfaW50ZWdlcigia2V5IiwgZmllbGQtPmdldF9rZXkoKSk7CisgIHdyaXRlX2tleV9hbmRfc3RyaW5nKCJuYW1lIiwgZmllbGQtPmdldF9uYW1lKCkpOworICB3cml0ZV9rZXlfYW5kX3N0cmluZygidHlwZUlkIiwgZ2V0X3R5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSkpOworICB3cml0ZV90eXBlX3NwZWNfb2JqZWN0KCJ0eXBlIiwgZmllbGQtPmdldF90eXBlKCkpOworCisgIGlmIChmaWVsZC0+aGFzX2RvYygpKSB7CisgICAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoImRvYyIsIGZpZWxkLT5nZXRfZG9jKCkpOworICB9CisKKyAgaWYgKGZpZWxkLT5hbm5vdGF0aW9uc18uc2l6ZSgpID4gMCkgeworICAgIHdyaXRlX2tleV9hbmQoImFubm90YXRpb25zIik7CisgICAgc3RhcnRfb2JqZWN0KCk7CisgICAgZm9yIChtYXA8c3RyaW5nLCBzdHJpbmc+OjppdGVyYXRvciBpdCA9IGZpZWxkLT5hbm5vdGF0aW9uc18uYmVnaW4oKTsgaXQgIT0gZmllbGQtPmFubm90YXRpb25zXy5lbmQoKTsgKytpdCkgeworICAgICAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoaXQtPmZpcnN0LCBpdC0+c2Vjb25kKTsKKyAgICB9CisgICAgZW5kX29iamVjdCgpOworICB9CisKKyAgd3JpdGVfa2V5X2FuZCgicmVxdWlyZWQiKTsKKyAgc3dpdGNoIChmaWVsZC0+Z2V0X3JlcSgpKSB7CisgIGNhc2UgdF9maWVsZDo6VF9SRVFVSVJFRDoKKyAgICB3cml0ZV9zdHJpbmcoInJlcXVpcmVkIik7CisgICAgYnJlYWs7CisgIGNhc2UgdF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVDoKKyAgICB3cml0ZV9zdHJpbmcoInJlcV9vdXQiKTsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICB3cml0ZV9zdHJpbmcoIm9wdGlvbmFsIik7CisgICAgYnJlYWs7CisgIH0KKworICBpZiAoZmllbGQtPmdldF92YWx1ZSgpKSB7CisgICAgd3JpdGVfa2V5X2FuZCgiZGVmYXVsdCIpOworICAgIHdyaXRlX2NvbnN0X3ZhbHVlKGZpZWxkLT5nZXRfdmFsdWUoKSk7CisgIH0KKworICBlbmRfb2JqZWN0KCk7Cit9CisKK3N0cmluZyB0X2pzb25fZ2VuZXJhdG9yOjpnZXRfdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpIHsKKyAgdHR5cGUgPSB0dHlwZS0+Z2V0X3RydWVfdHlwZSgpOworICBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAibGlzdCI7CisgIH0KKyAgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAic2V0IjsKKyAgfQorICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICJtYXAiOworICB9CisgIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJpMzIiOworICB9CisgIGlmICh0dHlwZS0+aXNfc3RydWN0KCkpIHsKKyAgICByZXR1cm4gKCh0X3N0cnVjdCopdHR5cGUpLT5pc191bmlvbigpID8gInVuaW9uIiA6ICJzdHJ1Y3QiOworICB9CisgIGlmICh0dHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiAiZXhjZXB0aW9uIjsKKyAgfQorICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGUqIHRiYXNldHlwZSA9ICh0X2Jhc2VfdHlwZSopdHR5cGU7CisgICAgcmV0dXJuIHRiYXNldHlwZS0+aXNfYmluYXJ5KCkgPyAiYmluYXJ5IiA6IHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZXR5cGUtPmdldF9iYXNlKCkpOworICB9CisKKyAgcmV0dXJuICIodW5rbm93bikiOworfQorCitzdHJpbmcgdF9qc29uX2dlbmVyYXRvcjo6Z2V0X3F1YWxpZmllZF9uYW1lKHRfdHlwZSogdHR5cGUpIHsKKyAgaWYgKHNob3VsZF9tZXJnZV9pbmNsdWRlc18gfHwgdHR5cGUtPmdldF9wcm9ncmFtKCkgPT0gcHJvZ3JhbV8pIHsKKyAgICByZXR1cm4gdHR5cGUtPmdldF9uYW1lKCk7CisgIH0KKyAgcmV0dXJuIHR0eXBlLT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZSgpICsgIi4iICsgdHR5cGUtPmdldF9uYW1lKCk7Cit9CisKK1RIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoanNvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkpTT04iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIG1lcmdlOiAgICAgICAgICAgR2VuZXJhdGUgb3V0cHV0IHdpdGggaW5jbHVkZWQgZmlsZXMgbWVyZ2VkXG4iKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9sdWFfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9sdWFfZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkZWU4OTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2x1YV9nZW5lcmF0b3IuY2MKQEAgLTAsMCArMSwxMTM4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgInRocmlmdC9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaCIKKwordXNpbmcgc3RkOjpvc3RyZWFtOwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnZlY3RvcjsKK3VzaW5nIHN0ZDo6bWFwOworCitzdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCisKKy8qKgorICogTFVBIGNvZGUgZ2VuZXJhdG9yLgorICoKKyAqLworY2xhc3MgdF9sdWFfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7CitwdWJsaWM6CisgIHRfbHVhX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQorICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pIHsKKyAgICAodm9pZClvcHRpb25fc3RyaW5nOworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7CisKKyAgICBnZW5fcmVxdWlyZXNfID0gdHJ1ZTsKKyAgICBmb3IoIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5iZWdpbigpOyBpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJvbWl0X3JlcXVpcmVzIikgPT0gMCkgeworICAgICAgICBnZW5fcmVxdWlyZXNfID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24gbHVhOiIgKyBpdGVyLT5maXJzdDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1sdWEiOworICB9CisKKyAgLyoqCisgICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKKyAgICovCisgIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKKyAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKKworICAvKioKKyAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKyAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpOworICB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSk7CisgIHZvaWQgZ2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOworCitwcml2YXRlOgorICAvKioKKyAgICogVHJ1ZSBpZmYgd2Ugc2hvdWxkIGdlbmVyYXRlIGx1YSByZXF1aXJlIHN0YXRlbWVudHMuCisgICAqLworICBib29sIGdlbl9yZXF1aXJlc187CisKKyAgLyoqCisgICAqIFN0cnVjdC1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKyAgdm9pZCBnZW5lcmF0ZV9sdWFfc3RydWN0X2RlZmluaXRpb24oc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uID0gZmFsc2UpOworICB2b2lkIGdlbmVyYXRlX2x1YV9zdHJ1Y3RfcmVhZGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfbHVhX3N0cnVjdF93cml0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKworICAvKioKKyAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2Uoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfcHJvY2Vzc29yKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyhvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnMob3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworCisgIC8qKgorICAgKiBEZXNlcmlhbGl6YXRpb24gKFJlYWQpCisgICAqLworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGxvY2FsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbG9jYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBsb2NhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIC8qKgorICAgKiBTZXJpYWxpemF0aW9uIChXcml0ZSkKKyAgICovCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBraXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgdml0ZXIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NldCogdG1hcCwgc3RkOjpzdHJpbmcgaXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdGQ6OnN0cmluZyBpdGVyKTsKKworICAvKioKKyAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKKyAgICovCisgIHN0ZDo6c3RyaW5nIGx1YV9pbmNsdWRlcygpOworICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOworICBzdGF0aWMgc3RkOjpzdHJpbmcgZ2V0X25hbWVzcGFjZShjb25zdCB0X3Byb2dyYW0qIHByb2dyYW0pOworCisgIHN0ZDo6c3RyaW5nIGF1dG9nZW5fY29tbWVudCgpIHsKKyAgICByZXR1cm4gc3RkOjpzdHJpbmcoIi0tXG4iKSArICItLSBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdFxuIiArICItLVxuIgorICAgICAgICAgICArICItLSBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HXG4iICsgIi0tIEAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2VuZXJhdGVkXG4iCisgICAgICAgICAgICsgIi0tXG4iOworICB9CisKKyAgLyoqCisgICAqIEZpbGUgc3RyZWFtcworICAgKi8KKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3R5cGVzXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2NvbnN0c187CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9zZXJ2aWNlXzsKK307CisKKy8qKgorICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcworICovCit2b2lkIHRfbHVhX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7CisgIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQorICBzdHJpbmcgb3V0ZGlyID0gZ2V0X291dF9kaXIoKTsKKyAgTUtESVIob3V0ZGlyLmNfc3RyKCkpOworCisgIC8vIE1ha2Ugb3V0cHV0IGZpbGVzCisgIHN0cmluZyBjdXJfbmFtZXNwYWNlID0gZ2V0X25hbWVzcGFjZShwcm9ncmFtXyk7CisgIHN0cmluZyBmX2NvbnN0c19uYW1lID0gb3V0ZGlyICsgY3VyX25hbWVzcGFjZSArICJjb25zdGFudHMubHVhIjsKKyAgZl9jb25zdHNfLm9wZW4oZl9jb25zdHNfbmFtZS5jX3N0cigpKTsKKyAgc3RyaW5nIGZfdHlwZXNfbmFtZSA9IG91dGRpciArIGN1cl9uYW1lc3BhY2UgKyAidHR5cGVzLmx1YSI7CisgIGZfdHlwZXNfLm9wZW4oZl90eXBlc19uYW1lLmNfc3RyKCkpOworCisgIC8vIEFkZCBoZWFkZXJzCisgIGZfY29uc3RzXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBsdWFfaW5jbHVkZXMoKTsKKyAgZl90eXBlc18gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgbHVhX2luY2x1ZGVzKCk7CisgIGlmIChnZW5fcmVxdWlyZXNfKSB7CisgICAgZl90eXBlc18gPDwgZW5kbCA8PCAicmVxdWlyZSAnIiA8PCBjdXJfbmFtZXNwYWNlIDw8ICJjb25zdGFudHMnIjsKKyAgfQorfQorCit2b2lkIHRfbHVhX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgeworICAvLyBDbG9zZSB0eXBlcyBmaWxlCisgIGZfdHlwZXNfLmNsb3NlKCk7CisgIGZfY29uc3RzXy5jbG9zZSgpOworfQorCisvKioKKyAqIEdlbmVyYXRlIGEgdHlwZWRlZiAoZXNzZW50aWFsbHkgYSBjb25zdGFudCkKKyAqLwordm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgeworICBmX3R5cGVzXyA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgdHR5cGVkZWYtPmdldF9zeW1ib2xpYygpIDw8ICIgPSAiCisgICAgICAgICAgIDw8IHR0eXBlZGVmLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBjb2RlIGZvciBhbiBlbnVtZXJhdGVkIHR5cGUgKHRhYmxlKQorICovCit2b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7CisgIGZfdHlwZXNfIDw8IGVuZGwgPDwgZW5kbCA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiID0geyIgPDwgZW5kbDsKKworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7CisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7KSB7CisgICAgaW50MzJfdCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7CisKKyAgICBmX3R5cGVzXyA8PCAiICAiIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCB2YWx1ZTsKKyAgICArK2NfaXRlcjsKKyAgICBpZiAoY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKSkgeworICAgICAgZl90eXBlc18gPDwgIiwiOworICAgIH0KKyAgICBmX3R5cGVzXyA8PCBlbmRsOworICB9CisgIGZfdHlwZXNfIDw8ICJ9IjsKK30KKworLyoqCisgKiBHZW5lcmF0ZSBhIGNvbnN0YW50IChub24tbG9jYWwpIHZhbHVlCisgKi8KK3ZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpIHsKKyAgdF90eXBlKiB0eXBlID0gdGNvbnN0LT5nZXRfdHlwZSgpOworICBzdHJpbmcgbmFtZSA9IHRjb25zdC0+Z2V0X25hbWUoKTsKKyAgdF9jb25zdF92YWx1ZSogdmFsdWUgPSB0Y29uc3QtPmdldF92YWx1ZSgpOworCisgIGZfY29uc3RzXyA8PCBlbmRsIDw8IGVuZGwgPDwgbmFtZSA8PCAiID0gIjsKKyAgZl9jb25zdHNfIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0eXBlLCB2YWx1ZSk7Cit9CisKKy8qKgorICogUHJpbnRzIHRoZSB2YWx1ZSBvZiBhIGNvbnN0YW50IHdpdGggdGhlIGdpdmVuIHR5cGUuCisgKi8KK3N0cmluZyB0X2x1YV9nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7CisKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICBvdXQgPDwgIiciIDw8IHZhbHVlLT5nZXRfc3RyaW5nKCkgPDwgIiciOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgb3V0IDw8ICh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDAgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIG91dCA8PCAibHVhbG9uZ251bWJlci5uZXcoJyIgPDwgdmFsdWUtPmdldF9zdHJpbmcoKSA8PCAiJykiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgeworICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBvdXQgPDwgdHlwZS0+Z2V0X25hbWUoKSA8PCAiID0geyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7KSB7CisgICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOworICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKKyAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisgICAgICB9CisKKyAgICAgIGluZGVudChvdXQpOworICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShnX3R5cGVfc3RyaW5nLCB2X2l0ZXItPmZpcnN0KTsKKyAgICAgIG91dCA8PCAiID0gIjsKKyAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgICAgKyt2X2l0ZXI7CisgICAgICBpZiAodl9pdGVyICE9IHZhbC5lbmQoKSkgeworICAgICAgICBvdXQgPDwgIiwiOworICAgICAgfQorICAgIH0KKworICAgIG91dCA8PCAifSI7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIG91dCA8PCB0eXBlLT5nZXRfbmFtZSgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOworCisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOykgeworICAgICAgaW5kZW50KG91dCkgPDwgIlsiIDw8IHJlbmRlcl9jb25zdF92YWx1ZShrdHlwZSwgdl9pdGVyLT5maXJzdCkKKyAgICAgICAgICAgICAgICAgIDw8ICJdID0gIiA8PCByZW5kZXJfY29uc3RfdmFsdWUodnR5cGUsIHZfaXRlci0+c2Vjb25kKTsKKyAgICAgICsrdl9pdGVyOworICAgICAgaWYgKHZfaXRlciAhPSB2YWwuZW5kKCkpIHsKKyAgICAgICAgb3V0IDw8ICIsIjsKKyAgICAgIH0KKyAgICAgIG91dCA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3R5cGUqIGV0eXBlOworICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9CisgICAgb3V0IDw8IHR5cGUtPmdldF9uYW1lKCkgPDwgIiA9IHsiIDw8IGVuZGw7CisgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7KSB7CisgICAgICBpbmRlbnQob3V0KTsKKyAgICAgIG91dCA8PCAiWyIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGV0eXBlLCAqdl9pdGVyKSA8PCAiXSI7CisgICAgICBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgICAgb3V0IDw8ICIgPSB0cnVlIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCAiID0gZmFsc2UiOworICAgICAgfQorICAgICAgKyt2X2l0ZXI7CisgICAgICBpZiAodl9pdGVyICE9IHZhbC5lbmQoKSkgeworICAgICAgICBvdXQgPDwgIiwiIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorICAgIG91dCA8PCAifSI7CisgIH0KKyAgcmV0dXJuIG91dC5zdHIoKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZSBhIHRocmlmdCBzdHJ1Y3QKKyAqLwordm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBnZW5lcmF0ZV9sdWFfc3RydWN0X2RlZmluaXRpb24oZl90eXBlc18sIHRzdHJ1Y3QsIGZhbHNlKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZSBhIHRocmlmdCBleGNlcHRpb24KKyAqLwordm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKKyAgZ2VuZXJhdGVfbHVhX3N0cnVjdF9kZWZpbml0aW9uKGZfdHlwZXNfLCB0eGNlcHRpb24sIHRydWUpOworfQorCisvKioKKyAqIEdlbmVyYXRlIGEgdGhyaWZ0IHN0cnVjdCBvciBleGNlcHRpb24gKGx1YSB0YWJsZSkKKyAqLwordm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2x1YV9zdHJ1Y3RfZGVmaW5pdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgeworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworCisgIGluZGVudChvdXQpIDw8IGVuZGwgPDwgZW5kbCA8PCB0c3RydWN0LT5nZXRfbmFtZSgpOworICBpZiAoaXNfZXhjZXB0aW9uKSB7CisgICAgb3V0IDw8ICIgPSBURXhjZXB0aW9uOm5ld3siIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgX190eXBlID0gJyIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiJyI7CisgICAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgeworICAgICAgb3V0IDw8ICIsIjsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgb3V0IDw8ICIgPSBfX1RPYmplY3Q6bmV3eyIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfdXAoKTsKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOykgeworICAgIGluZGVudChvdXQpOworICAgIG91dCA8PCAoKm1faXRlciktPmdldF9uYW1lKCk7CisgICAgKyttX2l0ZXI7CisgICAgaWYgKG1faXRlciAhPSBtZW1iZXJzLmVuZCgpKSB7CisgICAgICBvdXQgPDwgIiwiIDw8IGVuZGw7CisgICAgfQorICB9CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpOworICBvdXQgPDwgZW5kbCA8PCAifSI7CisKKyAgZ2VuZXJhdGVfbHVhX3N0cnVjdF9yZWFkZXIob3V0LCB0c3RydWN0KTsKKyAgZ2VuZXJhdGVfbHVhX3N0cnVjdF93cml0ZXIob3V0LCB0c3RydWN0KTsKK30KKworLyoqCisgKiBHZW5lcmF0ZSBhIHN0cnVjdC9leGNlcHRpb24gcmVhZGVyCisgKi8KK3ZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9sdWFfc3RydWN0X3JlYWRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAvLyBmdW5jdGlvbgorICBpbmRlbnQob3V0KSA8PCBlbmRsIDw8IGVuZGwgPDwgImZ1bmN0aW9uICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiOnJlYWQoaXByb3QpIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQob3V0KSA8PCAiaXByb3Q6cmVhZFN0cnVjdEJlZ2luKCkiIDw8IGVuZGw7CisKKyAgLy8gd2hpbGU6IFJlYWQgaW4gZmllbGRzCisgIGluZGVudChvdXQpIDw8ICJ3aGlsZSB0cnVlIGRvIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICAvLyBpZjogQ2hlY2sgd2hhdCB0byByZWFkCisgIGluZGVudChvdXQpIDw8ICJsb2NhbCBmbmFtZSwgZnR5cGUsIGZpZCA9IGlwcm90OnJlYWRGaWVsZEJlZ2luKCkiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJpZiBmdHlwZSA9PSBUVHlwZS5TVE9QIHRoZW4iIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAiYnJlYWsiIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJlbHNlaWYgZmlkID09ICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIiB0aGVuIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJpZiBmdHlwZSA9PSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIgdGhlbiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIC8vIFJlYWQgZmllbGQgY29udGVudHMKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsIGZhbHNlLCAic2VsZi4iKTsKKworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgImVsc2UiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgaXByb3Q6c2tpcChmdHlwZSkiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgImVuZCIgPDwgZW5kbDsKKyAgfQorCisgIC8vIGVuZCBpZgorICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAiZWxzZSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgaXByb3Q6c2tpcChmdHlwZSkiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJlbmQiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJpcHJvdDpyZWFkRmllbGRFbmQoKSIgPDwgZW5kbDsKKworICAvLyBlbmQgd2hpbGUKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgImVuZCIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgImlwcm90OnJlYWRTdHJ1Y3RFbmQoKSIgPDwgZW5kbDsKKworICAvLyBlbmQgZnVuY3Rpb24KKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCk7CisgIG91dCA8PCAiZW5kIjsKK30KKworLyoqCisgKiBHZW5lcmF0ZSBhIHN0cnVjdC9leGNlcHRpb24gd3JpdGVyCisgKi8KK3ZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9sdWFfc3RydWN0X3dyaXRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAvLyBmdW5jdGlvbgorICBpbmRlbnQob3V0KSA8PCBlbmRsIDw8IGVuZGwgPDwgImZ1bmN0aW9uICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiOndyaXRlKG9wcm90KSIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KG91dCkgPDwgIm9wcm90OndyaXRlU3RydWN0QmVnaW4oJyIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiJykiIDw8IGVuZGw7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgLy8gVG8gY2hlY2sgZWxlbWVudCBvZiBzZWxmIHdoZXRoZXIgbmlsIG9yIG5vdC4KKyAgICAvLyBhdm9pZCB0aGUgdmFsdWUoZmFsc2UpIG9mIEJPT0wgaXMgbG9zdC4KKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgc2VsZi4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIH49IG5pbCB0aGVuIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdDp3cml0ZUZpZWxkQmVnaW4oJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInLCAiCisgICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiwgIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiKSIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworCisgICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAic2VsZi4iKTsKKworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdDp3cml0ZUZpZWxkRW5kKCkiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiZW5kIiA8PCBlbmRsOworICB9CisgIGluZGVudChvdXQpIDw8ICJvcHJvdDp3cml0ZUZpZWxkU3RvcCgpIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAib3Byb3Q6d3JpdGVTdHJ1Y3RFbmQoKSIgPDwgZW5kbDsKKworICAvLyBlbmQgZnVuY3Rpb24KKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCk7CisgIG91dCA8PCAiZW5kIjsKK30KKworLyoqCisgKiBHZW5lcmF0ZSBhIHRocmlmdCBzZXJ2aWNlCisgKi8KK3ZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgLy8gR2V0IG91dHB1dCBkaXJlY3RvcnkKKyAgc3RyaW5nIG91dGRpciA9IGdldF9vdXRfZGlyKCk7CisKKyAgLy8gT3BlbiB0aGUgZmlsZSBmb3Igd3JpdGluZworICBzdHJpbmcgY3VyX25zID0gZ2V0X25hbWVzcGFjZShwcm9ncmFtXyk7CisgIHN0cmluZyBmX3NlcnZpY2VfbmFtZSA9IG91dGRpciArIGN1cl9ucyArIHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIi5sdWEiOworICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7CisKKyAgLy8gSGVhZGVycworICBmX3NlcnZpY2VfIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGx1YV9pbmNsdWRlcygpOworICBpZiAoZ2VuX3JlcXVpcmVzXykgeworICAgIGZfc2VydmljZV8gPDwgZW5kbCA8PCAicmVxdWlyZSAnIiA8PCBjdXJfbnMgPDwgInR0eXBlcyciIDw8IGVuZGw7CisKKyAgICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgICAgZl9zZXJ2aWNlXyA8PCAicmVxdWlyZSAnIiA8PCBnZXRfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfcHJvZ3JhbSgpKQorICAgICAgICAgICAgICAgICA8PCB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSA8PCAiJyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQoZl9zZXJ2aWNlXywgdHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZShmX3NlcnZpY2VfLCB0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfcHJvY2Vzc29yKGZfc2VydmljZV8sIHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKGZfc2VydmljZV8sIHRzZXJ2aWNlKTsKKworICAvLyBDbG9zZSB0aGUgZmlsZQorICBmX3NlcnZpY2VfLmNsb3NlKCk7Cit9CisKK3ZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZShvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGNsYXNzbmFtZSA9IHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIklmYWNlIjsKKyAgdF9zZXJ2aWNlKiBleHRlbmRzX3MgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKKworICAvLyBJbnRlcmZhY2Ugb2JqZWN0IGRlZmluaXRpb24KKyAgb3V0IDw8IGNsYXNzbmFtZSA8PCAiID0gIjsKKyAgaWYgKGV4dGVuZHNfcykgeworICAgIG91dCA8PCBleHRlbmRzX3MtPmdldF9uYW1lKCkgPDwgIklmYWNlOm5ld3siIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgb3V0IDw8ICJfX1RPYmplY3Q6bmV3eyIgPDwgZW5kbDsKKyAgfQorICBvdXQgPDwgIiAgX190eXBlID0gJyIgPDwgY2xhc3NuYW1lIDw8ICInIiA8PCBlbmRsIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudChvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGNsYXNzbmFtZSA9IHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIkNsaWVudCI7CisgIHRfc2VydmljZSogZXh0ZW5kc19zID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7CisKKyAgLy8gQ2xpZW50IG9iamVjdCBkZWZpbml0aW9uCisgIG91dCA8PCBjbGFzc25hbWUgPDwgIiA9IF9fVE9iamVjdC5uZXcoIjsKKyAgaWYgKGV4dGVuZHNfcyAhPSBOVUxMKSB7CisgICAgb3V0IDw8IGV4dGVuZHNfcy0+Z2V0X25hbWUoKSA8PCAiQ2xpZW50IjsKKyAgfSBlbHNlIHsKKyAgICBvdXQgPDwgIl9fVENsaWVudCI7CisgIH0KKyAgb3V0IDw8ICIsIHsiIDw8IGVuZGwgPDwgIiAgX190eXBlID0gJyIgPDwgY2xhc3NuYW1lIDw8ICInIiA8PCBlbmRsIDw8ICJ9KSIgPDwgZW5kbDsKKworICAvLyBTZW5kL1JlY3YgZnVuY3Rpb25zCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHN0cmluZyBzaWcgPSBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcik7CisgICAgc3RyaW5nIGZ1bmNuYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworCisgICAgLy8gV3JhcHBlciBmdW5jdGlvbgorICAgIGluZGVudChvdXQpIDw8IGVuZGwgPDwgImZ1bmN0aW9uICIgPDwgY2xhc3NuYW1lIDw8ICI6IiA8PCBzaWcgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGluZGVudChvdXQpIDw8ICJzZWxmOnNlbmRfIiA8PCBzaWcgPDwgZW5kbCA8PCBpbmRlbnQoKTsKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgb3V0IDw8ICJyZXR1cm4gIjsKKyAgICAgIH0KKyAgICAgIG91dCA8PCAic2VsZjpyZWN2XyIgPDwgc2lnIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiZW5kIiA8PCBlbmRsOworCisgICAgLy8gU2VuZCBmdW5jdGlvbgorICAgIGluZGVudChvdXQpIDw8IGVuZGwgPDwgImZ1bmN0aW9uICIgPDwgY2xhc3NuYW1lIDw8ICI6c2VuZF8iIDw8IHNpZyA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgaW5kZW50KG91dCkgPDwgInNlbGYub3Byb3Q6d3JpdGVNZXNzYWdlQmVnaW4oJyIgPDwgZnVuY25hbWUgPDwgIicsICIKKyAgICAgICAgICAgICAgICA8PCAoKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSA/ICJUTWVzc2FnZVR5cGUuT05FV0FZIiA6ICJUTWVzc2FnZVR5cGUuQ0FMTCIpCisgICAgICAgICAgICAgICAgPDwgIiwgc2VsZi5fc2VxaWQpIiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJsb2NhbCBhcmdzID0gIiA8PCBmdW5jbmFtZSA8PCAiX2FyZ3M6bmV3e30iIDw8IGVuZGw7CisKKyAgICAvLyBTZXQgdGhlIGFyZ3MKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBhcmdzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOworICAgIGZvciAoZmxkX2l0ZXIgPSBhcmdzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGFyZ3MuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICAgIHN0ZDo6c3RyaW5nIGFyZ25hbWUgPSAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJhcmdzLiIgPDwgYXJnbmFtZSA8PCAiID0gIiA8PCBhcmduYW1lIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50KG91dCkgPDwgImFyZ3M6d3JpdGUoc2VsZi5vcHJvdCkiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgInNlbGYub3Byb3Q6d3JpdGVNZXNzYWdlRW5kKCkiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgInNlbGYub3Byb3QudHJhbnM6Zmx1c2goKSIgPDwgZW5kbDsKKworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgImVuZCIgPDwgZW5kbDsKKworICAgIC8vIFJlY3YgZnVuY3Rpb24KKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8IGVuZGwgPDwgImZ1bmN0aW9uICIgPDwgY2xhc3NuYW1lIDw8ICI6cmVjdl8iIDw8IHNpZyA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAibG9jYWwgZm5hbWUsIG10eXBlLCByc2VxaWQgPSBzZWxmLmlwcm90OiIKKyAgICAgICAgICA8PCAicmVhZE1lc3NhZ2VCZWdpbigpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpZiBtdHlwZSA9PSBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OIHRoZW4iCisgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBsb2NhbCB4ID0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uOm5ld3t9IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIiAgeDpyZWFkKHNlbGYuaXByb3QpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHNlbGYuaXByb3Q6cmVhZE1lc3NhZ2VFbmQoKSIgPDwgZW5kbAorICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIGVycm9yKHgpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJlbmQiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAibG9jYWwgcmVzdWx0ID0gIiA8PCBmdW5jbmFtZSA8PCAiX3Jlc3VsdDpuZXd7fSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICJyZXN1bHQ6cmVhZChzZWxmLmlwcm90KSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAic2VsZi5pcHJvdDpyZWFkTWVzc2FnZUVuZCgpIiA8PCBlbmRsOworCisgICAgICAvLyBSZXR1cm4gdGhlIHJlc3VsdCBpZiBpdCdzIG5vdCBhIHZvaWQgZnVuY3Rpb24KKyAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiByZXN1bHQuc3VjY2VzcyB+PSBuaWwgdGhlbiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gcmVzdWx0LnN1Y2Nlc3MiCisgICAgICAgICAgICA8PCBlbmRsOworCisgICAgICAgIC8vIFRocm93IGN1c3RvbSBleGNlcHRpb25zCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGYgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKS0+Z2V0X21lbWJlcnMoKTsKKyAgICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworICAgICAgICBmb3IgKHhfaXRlciA9IHhmLmJlZ2luKCk7IHhfaXRlciAhPSB4Zi5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImVsc2VpZiByZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiB0aGVuIiA8PCBlbmRsCisgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIGVycm9yKHJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSIgPDwgZW5kbDsKKyAgICAgICAgfQorCisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZW5kIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICA8PCAiZXJyb3IoVEFwcGxpY2F0aW9uRXhjZXB0aW9uOm5ld3tlcnJvckNvZGUgPSAiCisgICAgICAgICAgICA8PCAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uLk1JU1NJTkdfUkVTVUxUfSkiIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAiZW5kIiA8PCBlbmRsOworICAgIH0KKyAgfQorfQorCit2b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3Iob3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBjbGFzc25hbWUgPSB0c2VydmljZS0+Z2V0X25hbWUoKSArICJQcm9jZXNzb3IiOworICB0X3NlcnZpY2UqIGV4dGVuZHNfcyA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworCisgIC8vIERlZmluZSBwcm9jZXNzb3IgdGFibGUKKyAgb3V0IDw8IGVuZGwgPDwgY2xhc3NuYW1lIDw8ICIgPSBfX1RPYmplY3QubmV3KCI7CisgIGlmIChleHRlbmRzX3MgIT0gTlVMTCkgeworICAgIG91dCA8PCBleHRlbmRzX3MtPmdldF9uYW1lKCkgPDwgIlByb2Nlc3NvciIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBvdXQgPDwgIl9fVFByb2Nlc3NvciIgPDwgZW5kbDsKKyAgfQorICBvdXQgPDwgIiwgeyIgPDwgZW5kbCA8PCAiIF9fdHlwZSA9ICciIDw8IGNsYXNzbmFtZSA8PCAiJyIgPDwgZW5kbCA8PCAifSkiIDw8IGVuZGw7CisKKyAgLy8gUHJvY2VzcyBmdW5jdGlvbgorICBpbmRlbnQob3V0KSA8PCBlbmRsIDw8ICJmdW5jdGlvbiAiIDw8IGNsYXNzbmFtZSA8PCAiOnByb2Nlc3MoaXByb3QsIG9wcm90LCBzZXJ2ZXJfY3R4KSIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KG91dCkgPDwgImxvY2FsIG5hbWUsIG10eXBlLCBzZXFpZCA9IGlwcm90OnJlYWRNZXNzYWdlQmVnaW4oKSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgImxvY2FsIGZ1bmNfbmFtZSA9ICdwcm9jZXNzXycgLi4gbmFtZSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgImlmIG5vdCBzZWxmW2Z1bmNfbmFtZV0gb3IgdHR5cGUoc2VsZltmdW5jX25hbWVdKSB+PSAnZnVuY3Rpb24nIHRoZW4iOworICBpbmRlbnRfdXAoKTsKKyAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlwcm90OnNraXAoVFR5cGUuU1RSVUNUKSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgImlwcm90OnJlYWRNZXNzYWdlRW5kKCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInggPSBUQXBwbGljYXRpb25FeGNlcHRpb246bmV3eyIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgIiAgZXJyb3JDb2RlID0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uLlVOS05PV05fTUVUSE9EIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IgorICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3Q6d3JpdGVNZXNzYWdlQmVnaW4obmFtZSwgVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiwgIgorICAgICAgPDwgInNlcWlkKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAieDp3cml0ZShvcHJvdCkiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJvcHJvdDp3cml0ZU1lc3NhZ2VFbmQoKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3QudHJhbnM6Zmx1c2goKSIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgImVsc2UiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgPDwgIiAgc2VsZltmdW5jX25hbWVdKHNlbGYsIHNlcWlkLCBpcHJvdCwgb3Byb3QsIHNlcnZlcl9jdHgpIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgIDw8ICJlbmQiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgImVuZCIgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2VzcyBzdWJmdW5jdGlvbnMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbihvdXQsIHRzZXJ2aWNlLCAqZl9pdGVyKTsKKyAgfQorfQorCit2b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NlcnZpY2UqIHRzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIHN0cmluZyBjbGFzc25hbWUgPSB0c2VydmljZS0+Z2V0X25hbWUoKSArICJQcm9jZXNzb3IiOworICBzdHJpbmcgYXJnc25hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX2FyZ3MiOworICBzdHJpbmcgcmVzdWx0bmFtZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKKyAgc3RyaW5nIGZuX25hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCk7CisKKyAgaW5kZW50KG91dCkgPDwgZW5kbCA8PCAiZnVuY3Rpb24gIiA8PCBjbGFzc25hbWUgPDwgIjpwcm9jZXNzXyIgPDwgZm5fbmFtZQorICAgICAgICAgICAgICA8PCAiKHNlcWlkLCBpcHJvdCwgb3Byb3QsIHNlcnZlcl9jdHgpIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICAvLyBSZWFkIHRoZSByZXF1ZXN0CisgIG91dCA8PCBpbmRlbnQoKSA8PCAibG9jYWwgYXJncyA9ICIgPDwgYXJnc25hbWUgPDwgIjpuZXd7fSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgImxvY2FsIHJlcGx5X3R5cGUgPSBUTWVzc2FnZVR5cGUuUkVQTFkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImFyZ3M6cmVhZChpcHJvdCkiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICJpcHJvdDpyZWFkTWVzc2FnZUVuZCgpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJsb2NhbCByZXN1bHQgPSAiIDw8IHJlc3VsdG5hbWUKKyAgICAgIDw8ICI6bmV3e30iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImxvY2FsIHN0YXR1cywgcmVzID0gcGNhbGwoc2VsZi5oYW5kbGVyLiIgPDwgZm5fbmFtZQorICAgICAgPDwgIiwgc2VsZi5oYW5kbGVyIjsKKworICAvLyBQcmludCBhcmd1bWVudHMKKyAgdF9zdHJ1Y3QqIGFyZ3MgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisgIGlmIChhcmdzLT5nZXRfbWVtYmVycygpLnNpemUoKSA+IDApIHsKKyAgICBvdXQgPDwgIiwgIiA8PCBhcmd1bWVudF9saXN0KGFyZ3MsICJhcmdzLiIpOworICB9CisKKyAgLy8gQ2hlY2sgZm9yIGVycm9ycworICBvdXQgPDwgIikiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlmIG5vdCBzdGF0dXMgdGhlbiIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIiAgcmVwbHlfdHlwZSA9IFRNZXNzYWdlVHlwZS5FWENFUFRJT04iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICIgIHJlc3VsdCA9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjpuZXd7bWVzc2FnZSA9IHJlc30iIDw8IGVuZGw7CisKKyAgLy8gSGFuZGxlIGN1c3RvbSBleGNlcHRpb25zCisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGYgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKS0+Z2V0X21lbWJlcnMoKTsKKyAgaWYgKHhmLnNpemUoKSA+IDApIHsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgICAgZm9yICh4X2l0ZXIgPSB4Zi5iZWdpbigpOyB4X2l0ZXIgIT0geGYuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImVsc2VpZiB0dHlwZShyZXMpID09ICciIDw8ICgqeF9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X25hbWUoKSA8PCAiJyB0aGVuIgorICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSByZXMiIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgLy8gU2V0IHRoZSByZXN1bHQgYW5kIHdyaXRlIHRoZSByZXBseQorICBvdXQgPDwgaW5kZW50KCkgPDwgImVsc2UiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmVzdWx0LnN1Y2Nlc3MgPSByZXMiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJlbmQiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90OndyaXRlTWVzc2FnZUJlZ2luKCciIDw8IGZuX25hbWUgPDwgIicsIHJlcGx5X3R5cGUsICIKKyAgICAgIDw8ICJzZXFpZCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJlc3VsdDp3cml0ZShvcHJvdCkiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJvcHJvdDp3cml0ZU1lc3NhZ2VFbmQoKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3QudHJhbnM6Zmx1c2goKSIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAiZW5kIiA8PCBlbmRsOworfQorCisvLyBTZXJ2aWNlIGhlbHBlcnMKK3ZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnMob3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworCisgIG91dCA8PCBlbmRsIDw8ICItLSBIRUxQRVIgRlVOQ1RJT05TIEFORCBTVFJVQ1RVUkVTIjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X3N0cnVjdCogdHMgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgZ2VuZXJhdGVfbHVhX3N0cnVjdF9kZWZpbml0aW9uKG91dCwgdHMsIGZhbHNlKTsKKyAgICBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKG91dCwgKmZfaXRlcik7CisgIH0KK30KKwordm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnMob3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOworICAgIHRfZmllbGQgc3VjY2Vzcyh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksICJzdWNjZXNzIiwgMCk7CisgICAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7CisgICAgfQorCisgICAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICByZXN1bHQuYXBwZW5kKCpmX2l0ZXIpOworICAgIH0KKyAgICBnZW5lcmF0ZV9sdWFfc3RydWN0X2RlZmluaXRpb24ob3V0LCAmcmVzdWx0LCBmYWxzZSk7CisgIH0KK30KKworLyoqCisgKiBEZXNlcmlhbGl6ZSAoUmVhZCkKKyAqLwordm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBsb2NhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7CisgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKworICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgIH0KKworICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbG9jYWwsIG5hbWUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbG9jYWwsIG5hbWUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgeworICAgIGluZGVudChvdXQpIDw8IChsb2NhbCA/ICJsb2NhbCAiIDogIiIpIDw8IG5hbWUgPDwgIiA9IGlwcm90OiI7CisKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICBvdXQgPDwgInJlYWRTdHJpbmcoKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICBvdXQgPDwgInJlYWRCb29sKCkiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIG91dCA8PCAicmVhZEJ5dGUoKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgIG91dCA8PCAicmVhZEkxNigpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgb3V0IDw8ICJyZWFkSTMyKCkiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICBvdXQgPDwgInJlYWRJNjQoKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIG91dCA8PCAicmVhZERvdWJsZSgpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIFBIUCBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIG91dCA8PCAicmVhZEkzMigpIjsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisKKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBERVNFUklBTElaRSBGSUVMRCAnJXMnIFRZUEUgJyVzJ1xuIiwKKyAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgIHR5cGUtPmdldF9uYW1lKCkuY19zdHIoKSk7CisgIH0KK30KKwordm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGxvY2FsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7CisgIGluZGVudChvdXQpIDw8IChsb2NhbCA/ICJsb2NhbCAiIDogIiIpIDw8IHByZWZpeCA8PCAiID0gIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICI6bmV3e30iCisgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICI6cmVhZChpcHJvdCkiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGxvY2FsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7CisgIHN0cmluZyBzaXplID0gdG1wKCJfc2l6ZSIpOworICBzdHJpbmcga3R5cGUgPSB0bXAoIl9rdHlwZSIpOworICBzdHJpbmcgdnR5cGUgPSB0bXAoIl92dHlwZSIpOworICBzdHJpbmcgZXR5cGUgPSB0bXAoIl9ldHlwZSIpOworCisgIHRfZmllbGQgZnNpemUoZ190eXBlX2kzMiwgc2l6ZSk7CisgIHRfZmllbGQgZmt0eXBlKGdfdHlwZV9pOCwga3R5cGUpOworICB0X2ZpZWxkIGZ2dHlwZShnX3R5cGVfaTgsIHZ0eXBlKTsKKyAgdF9maWVsZCBmZXR5cGUoZ190eXBlX2k4LCBldHlwZSk7CisKKyAgLy8gRGVjbGFyZSB2YXJpYWJsZXMsIHJlYWQgaGVhZGVyCisgIGluZGVudChvdXQpIDw8IChsb2NhbCA/ICJsb2NhbCAiIDogIiIpIDw8IHByZWZpeCA8PCAiID0ge30iIDw8IGVuZGw7CisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAibG9jYWwgIiA8PCBrdHlwZSA8PCAiLCAiIDw8IHZ0eXBlIDw8ICIsICIgPDwgc2l6ZSA8PCAiID0gaXByb3Q6cmVhZE1hcEJlZ2luKCkgIgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImxvY2FsICIgPDwgZXR5cGUgPDwgIiwgIiA8PCBzaXplIDw8ICIgPSBpcHJvdDpyZWFkU2V0QmVnaW4oKSIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImxvY2FsICIgPDwgZXR5cGUgPDwgIiwgIiA8PCBzaXplIDw8ICIgPSBpcHJvdDpyZWFkTGlzdEJlZ2luKCkiIDw8IGVuZGw7CisgIH0KKworICAvLyBEZXNlcmlhbGl6ZQorICBpbmRlbnQob3V0KSA8PCAiZm9yIF9pPTEsIiA8PCBzaXplIDw8ICIgZG8iIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIHByZWZpeCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBwcmVmaXgpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgcHJlZml4KTsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJlbmQiIDw8IGVuZGw7CisKKyAgLy8gUmVhZCBjb250YWluZXIgZW5kCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaXByb3Q6cmVhZE1hcEVuZCgpIiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpcHJvdDpyZWFkU2V0RW5kKCkiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpcHJvdDpyZWFkTGlzdEVuZCgpIiA8PCBlbmRsOworICB9Cit9CisKK3ZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdHJpbmcgcHJlZml4KSB7CisgIC8vIEEgbWFwIGlzIHJlcHJlc2VudGVkIGJ5IGEgdGFibGUgaW5kZXhhYmxlIGJ5IGFueSBsdWEgdHlwZQorICBzdHJpbmcga2V5ID0gdG1wKCJfa2V5Iik7CisgIHN0cmluZyB2YWwgPSB0bXAoIl92YWwiKTsKKyAgdF9maWVsZCBma2V5KHRtYXAtPmdldF9rZXlfdHlwZSgpLCBrZXkpOworICB0X2ZpZWxkIGZ2YWwodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZhbCk7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmtleSwgdHJ1ZSk7CisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZ2YWwsIHRydWUpOworCisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiWyIgPDwga2V5IDw8ICJdID0gIiA8PCB2YWwgPDwgZW5kbDsKK30KKwordm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBwcmVmaXgpIHsKKyAgLy8gQSBzZXQgaXMgcmVwcmVzZW50ZWQgYnkgYSB0YWJsZSBpbmRleGVkIGJ5IHRoZSB2YWx1ZQorICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKKyAgdF9maWVsZCBmZWxlbSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOworCisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtLCB0cnVlKTsKKworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIlsiIDw8IGVsZW0gPDwgIl0gPSAiIDw8IGVsZW0gPDwgZW5kbDsKK30KKwordm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgLy8gQSBsaXN0IGlzIHJlcHJlc2VudGVkIGJ5IGEgdGFibGUgaW5kZXhlZCBieSBpbnRlZ2VyIHZhbHVlcworICAvLyBMVUEgbmF0aXZlbHkgcHJvdmlkZXMgYWxsIG9mIHRoZSBmdW5jdGlvbnMgcmVxdWlyZWQgdG8gbWFpbnRhaW4gYSBsaXN0CisgIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOworICB0X2ZpZWxkIGZlbGVtKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOworCisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtLCB0cnVlKTsKKworICBpbmRlbnQob3V0KSA8PCAidGFibGUuaW5zZXJ0KCIgPDwgcHJlZml4IDw8ICIsICIgPDwgZWxlbSA8PCAiKSIgPDwgZW5kbDsKK30KKworLyoqCisgKiBTZXJpYWxpemUgKFdyaXRlKQorICovCit2b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdHJpbmcgcHJlZml4KSB7CisgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisKKyAgLy8gRG8gbm90aGluZyBmb3Igdm9pZCB0eXBlcworICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgbmFtZTsKKyAgfQorCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90OiI7CisKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICBvdXQgPDwgIndyaXRlU3RyaW5nKCIgPDwgbmFtZSA8PCAiKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICBvdXQgPDwgIndyaXRlQm9vbCgiIDw8IG5hbWUgPDwgIikiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIG91dCA8PCAid3JpdGVCeXRlKCIgPDwgbmFtZSA8PCAiKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgIG91dCA8PCAid3JpdGVJMTYoIiA8PCBuYW1lIDw8ICIpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUkzMigiIDw8IG5hbWUgPDwgIikiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICBvdXQgPDwgIndyaXRlSTY0KCIgPDwgbmFtZSA8PCAiKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIG91dCA8PCAid3JpdGVEb3VibGUoIiA8PCBuYW1lIDw8ICIpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIFBIUCBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIG91dCA8PCAid3JpdGVJMzIoIiA8PCBuYW1lIDw8ICIpIjsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gU0VSSUFMSVpFIEZJRUxEICclcycgVFlQRSAnJXMnXG4iLAorICAgICAgICAgICBuYW1lLmNfc3RyKCksCisgICAgICAgICAgIHR5cGUtPmdldF9uYW1lKCkuY19zdHIoKSk7CisgIH0KK30KKwordm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCkgeworICAodm9pZCl0c3RydWN0OworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIjp3cml0ZShvcHJvdCkiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkgeworICAvLyBCZWdpbiB3cml0aW5nCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Q6d3JpdGVNYXBCZWdpbigiIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpIDw8ICIsICIKKyAgICAgICAgICAgICAgICA8PCAidHRhYmxlX3NpemUoIiA8PCBwcmVmaXggPDwgIikpIiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdDp3cml0ZVNldEJlZ2luKCIgPDwgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgPDwgInR0YWJsZV9zaXplKCIgPDwgcHJlZml4IDw8ICIpKSIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90OndyaXRlTGlzdEJlZ2luKCIgPDwgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkKKyAgICAgICAgICAgICAgICA8PCAiLCAiCisgICAgICAgICAgICAgICAgPDwgIiMiIDw8IHByZWZpeCA8PCAiKSIgPDwgZW5kbDsKKyAgfQorCisgIC8vIFNlcmlhbGl6ZQorICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgc3RyaW5nIGtpdGVyID0gdG1wKCJraXRlciIpOworICAgIHN0cmluZyB2aXRlciA9IHRtcCgidml0ZXIiKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yICIgPDwga2l0ZXIgPDwgIiwiIDw8IHZpdGVyIDw8ICIgaW4gcGFpcnMoIiA8PCBwcmVmaXggPDwgIikgZG8iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwga2l0ZXIsIHZpdGVyKTsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJlbmQiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgc3RyaW5nIGl0ZXIgPSB0bXAoIml0ZXIiKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yICIgPDwgaXRlciA8PCAiLF8gaW4gcGFpcnMoIiA8PCBwcmVmaXggPDwgIikgZG8iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgaXRlcik7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiZW5kIiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBzdHJpbmcgaXRlciA9IHRtcCgiaXRlciIpOworICAgIGluZGVudChvdXQpIDw8ICJmb3IgXywiIDw8IGl0ZXIgPDwgIiBpbiBpcGFpcnMoIiA8PCBwcmVmaXggPDwgIikgZG8iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBpdGVyKTsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJlbmQiIDw8IGVuZGw7CisgIH0KKworICAvLyBGaW5pc2ggd3JpdGluZworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90OndyaXRlTWFwRW5kKCkiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90OndyaXRlU2V0RW5kKCkiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdDp3cml0ZUxpc3RFbmQoKSIgPDwgZW5kbDsKKyAgfQorfQorCit2b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBraXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHZpdGVyKSB7CisgIHRfZmllbGQga2ZpZWxkKHRtYXAtPmdldF9rZXlfdHlwZSgpLCBraXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZrZmllbGQsICIiKTsKKworICB0X2ZpZWxkIHZmaWVsZCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdml0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmdmZpZWxkLCAiIik7Cit9CisKK3ZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIGl0ZXIpIHsKKyAgdF9maWVsZCBlZmllbGQodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIpOworfQorCit2b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0cmluZyBpdGVyKSB7CisgIHRfZmllbGQgZWZpZWxkKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIik7Cit9CisKKy8qKgorICogIEhlbHBlciByZW5kZXJpbmcgZnVuY3Rpb25zCisgKi8KK3N0cmluZyB0X2x1YV9nZW5lcmF0b3I6Omx1YV9pbmNsdWRlcygpIHsKKyAgaWYgKGdlbl9yZXF1aXJlc18pIHsKKyAgICByZXR1cm4gIlxuXG5yZXF1aXJlICdUaHJpZnQnIjsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gIiI7CisgIH0KK30KKworc3RyaW5nIHRfbHVhX2dlbmVyYXRvcjo6Z2V0X25hbWVzcGFjZShjb25zdCB0X3Byb2dyYW0qIHByb2dyYW0pIHsKKyAgc3RkOjpzdHJpbmcgcmVhbF9tb2R1bGUgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJsdWEiKTsKKyAgaWYgKHJlYWxfbW9kdWxlLmVtcHR5KCkpIHsKKyAgICByZXR1cm4gcHJvZ3JhbS0+Z2V0X25hbWUoKSArICJfIjsKKyAgfQorICByZXR1cm4gcmVhbF9tb2R1bGUgKyAiXyI7Cit9CisKK3N0cmluZyB0X2x1YV9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0cmluZyBwcmVmaXgpIHsKKyAgKHZvaWQpcHJlZml4OworICBzdGQ6OnN0cmluZyByZXQgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiKCIgKyBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSkgKyAiKSI7CisgIHJldHVybiByZXQ7Cit9CisKK3N0cmluZyB0X2x1YV9nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcmVmaXgpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7CisgIHN0ZDo6c3RyaW5nIHJldCA9ICIiOworICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTspIHsKKyAgICByZXQgKz0gcHJlZml4ICsgKCpmbGRfaXRlciktPmdldF9uYW1lKCk7CisgICAgKytmbGRfaXRlcjsKKyAgICBpZiAoZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpKSB7CisgICAgICByZXQgKz0gIiwgIjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKworc3RyaW5nIHRfbHVhX2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAiVFR5cGUuU1RSSU5HIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gIlRUeXBlLkJPT0wiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZXR1cm4gIlRUeXBlLkJZVEUiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmV0dXJuICJUVHlwZS5JMTYiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmV0dXJuICJUVHlwZS5JMzIiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICJUVHlwZS5JNjQiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICJUVHlwZS5ET1VCTEUiOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLkkzMiI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiAiVFR5cGUuU1RSVUNUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAiVFR5cGUuTUFQIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAiVFR5cGUuU0VUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLkxJU1QiOworICB9CisKKyAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworfQorCitUSFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKAorICAgIGx1YSwKKyAgICAiTHVhIiwKKyAgICAiICAgIG9taXRfcmVxdWlyZXM6ICAgU3VwcHJlc3MgZ2VuZXJhdGlvbiBvZiByZXF1aXJlICdzb21lZmlsZScuXG4iKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9uZXRjb3JlX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfbmV0Y29yZV9nZW5lcmF0b3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJlN2RhMAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfbmV0Y29yZV9nZW5lcmF0b3IuY2MKQEAgLTAsMCArMSwzMTE3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCisgKiBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgorICogZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8Y2Fzc2VydD4KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxjY3R5cGU+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHNzdHJlYW0+CisKKyNpbmNsdWRlICJ0aHJpZnQvcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9vb3BfZ2VuZXJhdG9yLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3RfbmV0Y29yZV9nZW5lcmF0b3IuaCIKKwordXNpbmcgc3RkOjptYXA7Cit1c2luZyBzdGQ6Om9zdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjp2ZWN0b3I7CisKKy8vVE9ETzogY2hlY2sgZm9yIGluZGVudGF0aW9uCisvL1RPRE86IERvIHdlIG5lZWQgc2VxSWRfIGluIGdlbmVyYXRpb24/CisKK3RfbmV0Y29yZV9nZW5lcmF0b3I6OnRfbmV0Y29yZV9nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLCBjb25zdCBtYXA8c3RyaW5nLCBzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywgY29uc3Qgc3RyaW5nJiBvcHRpb25fc3RyaW5nKQorICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pCit7CisgICAgKHZvaWQpb3B0aW9uX3N0cmluZzsKKworICAgIG51bGxhYmxlXyA9IGZhbHNlOworICAgIGhhc2hjb2RlXyA9IGZhbHNlOworICAgIHVuaW9uXyA9IGZhbHNlOworICAgIHNlcmlhbGl6ZV8gPSBmYWxzZTsKKyAgICB3Y2ZfID0gZmFsc2U7CisgICAgd2NmX25hbWVzcGFjZV8uY2xlYXIoKTsKKworICAgIG1hcDxzdHJpbmcsIHN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7CisKKyAgICBmb3IgKGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5iZWdpbigpOyBpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpOyArK2l0ZXIpCisgICAgeworICAgICAgICBpZiAoaXRlci0+Zmlyc3QuY29tcGFyZSgibnVsbGFibGUiKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBudWxsYWJsZV8gPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGl0ZXItPmZpcnN0LmNvbXBhcmUoImhhc2hjb2RlIikgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgaGFzaGNvZGVfID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChpdGVyLT5maXJzdC5jb21wYXJlKCJ1bmlvbiIpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHVuaW9uXyA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoaXRlci0+Zmlyc3QuY29tcGFyZSgic2VyaWFsIikgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgc2VyaWFsaXplXyA9IHRydWU7CisgICAgICAgICAgICB3Y2ZfbmFtZXNwYWNlXyA9IGl0ZXItPnNlY29uZDsgLy8gc2luY2UgdGhlcmUgY2FuIGJlIG9ubHkgb25lIG5hbWVzcGFjZQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGl0ZXItPmZpcnN0LmNvbXBhcmUoIndjZiIpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHdjZl8gPSB0cnVlOworICAgICAgICAgICAgd2NmX25hbWVzcGFjZV8gPSBpdGVyLT5zZWNvbmQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24gbmV0Y29yZToiICsgaXRlci0+Zmlyc3Q7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1uZXRjb3JlIjsKK30KKworc3RhdGljIHN0cmluZyBjb3JyZWN0X2Z1bmN0aW9uX25hbWVfZm9yX2FzeW5jKHN0cmluZyBjb25zdCYgZnVuY3Rpb25fbmFtZSkKK3sKKyAgICBzdHJpbmcgY29uc3QgYXN5bmNfZW5kID0gIkFzeW5jIjsKKyAgICBzaXplX3QgaSA9IGZ1bmN0aW9uX25hbWUuZmluZChhc3luY19lbmQpOworICAgIGlmIChpICE9IHN0cmluZzo6bnBvcykKKyAgICB7CisgICAgICAgIHJldHVybiBmdW5jdGlvbl9uYW1lICsgYXN5bmNfZW5kOworICAgIH0KKworICAgIHJldHVybiBmdW5jdGlvbl9uYW1lOworfQorCisvKioKKyogXGJyaWVmIFNlYXJjaCBhbmQgcmVwbGFjZSAiX2FyZ3MiIHN1YnN0cmluZyBpbiBzdHJ1Y3QgbmFtZSBpZiBleGlzdCAoZm9yIEMjIGNsYXNzIG5hbWluZykKKyogXHBhcmFtIHN0cnVjdF9uYW1lCisqIFxyZXR1cm4gTW9kaWZpZWQgc3RydWN0IG5hbWUgKCJTdHJ1Y3RfYXJncyIgLT4gIlN0cnVjdEFyZ3MiKSBvciBvcmlnaW5hbCBuYW1lCisqLworc3RhdGljIHN0cmluZyBjaGVja19hbmRfY29ycmVjdF9zdHJ1Y3RfbmFtZShjb25zdCBzdHJpbmcmIHN0cnVjdF9uYW1lKQoreworICAgIHN0cmluZyBhcmdzX2VuZCA9ICJfYXJncyI7CisgICAgc2l6ZV90IGkgPSBzdHJ1Y3RfbmFtZS5maW5kKGFyZ3NfZW5kKTsKKyAgICBpZiAoaSAhPSBzdHJpbmc6Om5wb3MpCisgICAgeworICAgICAgICBzdHJpbmcgbmV3X3N0cnVjdF9uYW1lID0gc3RydWN0X25hbWU7CisgICAgICAgIG5ld19zdHJ1Y3RfbmFtZS5yZXBsYWNlKGksIGFyZ3NfZW5kLmxlbmd0aCgpLCAiQXJncyIpOworICAgICAgICByZXR1cm4gbmV3X3N0cnVjdF9uYW1lOworICAgIH0KKworICAgIHN0cmluZyByZXN1bHRfZW5kID0gIl9yZXN1bHQiOworICAgIHNpemVfdCBqID0gc3RydWN0X25hbWUuZmluZChyZXN1bHRfZW5kKTsKKyAgICBpZiAoaiAhPSBzdHJpbmc6Om5wb3MpCisgICAgeworICAgICAgICBzdHJpbmcgbmV3X3N0cnVjdF9uYW1lID0gc3RydWN0X25hbWU7CisgICAgICAgIG5ld19zdHJ1Y3RfbmFtZS5yZXBsYWNlKGosIHJlc3VsdF9lbmQubGVuZ3RoKCksICJSZXN1bHQiKTsKKyAgICAgICAgcmV0dXJuIG5ld19zdHJ1Y3RfbmFtZTsKKyAgICB9CisKKyAgICByZXR1cm4gc3RydWN0X25hbWU7Cit9CisKK3N0YXRpYyBib29sIGZpZWxkX2hhc19kZWZhdWx0KHRfZmllbGQqIHRmaWVsZCkgeyByZXR1cm4gdGZpZWxkLT5nZXRfdmFsdWUoKSAhPSBOVUxMOyB9CisKK3N0YXRpYyBib29sIGZpZWxkX2lzX3JlcXVpcmVkKHRfZmllbGQqIHRmaWVsZCkgeyByZXR1cm4gdGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRDsgfQorCitzdGF0aWMgYm9vbCB0eXBlX2Nhbl9iZV9udWxsKHRfdHlwZSogdHR5cGUpCit7CisgICAgd2hpbGUgKHR0eXBlLT5pc190eXBlZGVmKCkpCisgICAgeworICAgICAgICB0dHlwZSA9IHN0YXRpY19jYXN0PHRfdHlwZWRlZio+KHR0eXBlKS0+Z2V0X3R5cGUoKTsKKyAgICB9CisKKyAgICByZXR1cm4gdHR5cGUtPmlzX2NvbnRhaW5lcigpIHx8IHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKSB8fCB0dHlwZS0+aXNfc3RyaW5nKCk7Cit9CisKK2Jvb2wgdF9uZXRjb3JlX2dlbmVyYXRvcjo6aXNfd2NmX2VuYWJsZWQoKSBjb25zdCB7IHJldHVybiB3Y2ZfOyB9CisKK2Jvb2wgdF9uZXRjb3JlX2dlbmVyYXRvcjo6aXNfbnVsbGFibGVfZW5hYmxlZCgpIGNvbnN0IHsgcmV0dXJuIG51bGxhYmxlXzsgfQorCitib29sIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmlzX2hhc2hjb2RlX2VuYWJsZWQoKSBjb25zdCB7IHJldHVybiBoYXNoY29kZV87IH0KKworYm9vbCB0X25ldGNvcmVfZ2VuZXJhdG9yOjppc19zZXJpYWxpemVfZW5hYmxlZCgpIGNvbnN0IHsgcmV0dXJuIHNlcmlhbGl6ZV87IH0KKworYm9vbCB0X25ldGNvcmVfZ2VuZXJhdG9yOjppc191bmlvbl9lbmFibGVkKCkgY29uc3QgeyByZXR1cm4gdW5pb25fOyB9CisKK21hcDxzdHJpbmcsIGludD4gdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2V0X2tleXdvcmRzX2xpc3QoKSBjb25zdAoreworICAgIHJldHVybiBuZXRjb3JlX2tleXdvcmRzOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkKK3sKKyAgICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOworCisgICAgLy8gZm9yIHVzYWdlIG9mIGNzaGFycCBuYW1lc3BhY2VzIGluIHRocmlmdCBmaWxlcyAoZnJvbSBmaWxlcyBmb3IgY3NoYXJwKQorICAgIG5hbWVzcGFjZV9uYW1lXyA9IHByb2dyYW1fLT5nZXRfbmFtZXNwYWNlKCJuZXRjb3JlIik7CisgICAgaWYgKG5hbWVzcGFjZV9uYW1lXy5lbXB0eSgpKQorICAgIHsKKyAgICAgICAgbmFtZXNwYWNlX25hbWVfID0gcHJvZ3JhbV8tPmdldF9uYW1lc3BhY2UoIm5ldGNvcmUiKTsKKyAgICB9CisKKyAgICBzdHJpbmcgZGlyID0gbmFtZXNwYWNlX25hbWVfOworICAgIHN0cmluZyBzdWJkaXIgPSBnZXRfb3V0X2RpcigpLmNfc3RyKCk7CisgICAgc3RyaW5nOjpzaXplX3R5cGUgbG9jOworCisgICAgd2hpbGUgKChsb2MgPSBkaXIuZmluZCgiLiIpKSAhPSBzdHJpbmc6Om5wb3MpCisgICAgeworICAgICAgICBzdWJkaXIgPSBzdWJkaXIgKyAiLyIgKyBkaXIuc3Vic3RyKDAsIGxvYyk7CisgICAgICAgIE1LRElSKHN1YmRpci5jX3N0cigpKTsKKyAgICAgICAgZGlyID0gZGlyLnN1YnN0cihsb2MgKyAxKTsKKyAgICB9CisgICAgaWYgKGRpci5zaXplKCkgPiAwKQorICAgIHsKKyAgICAgICAgc3ViZGlyID0gc3ViZGlyICsgIi8iICsgZGlyOworICAgICAgICBNS0RJUihzdWJkaXIuY19zdHIoKSk7CisgICAgfQorCisgICAgbmFtZXNwYWNlX2Rpcl8gPSBzdWJkaXI7CisgICAgaW5pdF9rZXl3b3JkcygpOworCisgICAgd2hpbGUgKCFtZW1iZXJfbWFwcGluZ19zY29wZXMuZW1wdHkoKSkKKyAgICB7CisgICAgICAgIGNsZWFudXBfbWVtYmVyX25hbWVfbWFwcGluZyhtZW1iZXJfbWFwcGluZ19zY29wZXMuYmFjaygpLnNjb3BlX21lbWJlcik7CisgICAgfQorCisgICAgcHZlcmJvc2UoIi5ORVQgQ29yZSBvcHRpb25zOlxuIik7CisgICAgcHZlcmJvc2UoIi0gbnVsbGFibGUgLi4uICVzXG4iLCAobnVsbGFibGVfID8gIk9OIiA6ICJvZmYiKSk7CisgICAgcHZlcmJvc2UoIi0gdW5pb24gLi4uLi4uICVzXG4iLCAodW5pb25fID8gIk9OIiA6ICJvZmYiKSk7CisgICAgcHZlcmJvc2UoIi0gaGFzaGNvZGUgLi4uICVzXG4iLCAoaGFzaGNvZGVfID8gIk9OIiA6ICJvZmYiKSk7CisgICAgcHZlcmJvc2UoIi0gc2VyaWFsaXplIC4uICVzXG4iLCAoc2VyaWFsaXplXyA/ICJPTiIgOiAib2ZmIikpOworICAgIHB2ZXJib3NlKCItIHdjZiAuLi4uLi4uLiAlc1xuIiwgKHdjZl8gPyAiT04iIDogIm9mZiIpKTsKK30KKworc3RyaW5nIHRfbmV0Y29yZV9nZW5lcmF0b3I6Om5vcm1hbGl6ZV9uYW1lKHN0cmluZyBuYW1lKQoreworICAgIHN0cmluZyB0bXAobmFtZSk7CisgICAgdHJhbnNmb3JtKHRtcC5iZWdpbigpLCB0bXAuZW5kKCksIHRtcC5iZWdpbigpLCBzdGF0aWNfY2FzdDxpbnQoKikoaW50KT4odG9sb3dlcikpOworCisgICAgLy8gdW4tY29uZmxpY3Qga2V5d29yZHMgYnkgcHJlZml4aW5nIHdpdGggIkAiCisgICAgaWYgKG5ldGNvcmVfa2V5d29yZHMuZmluZCh0bXApICE9IG5ldGNvcmVfa2V5d29yZHMuZW5kKCkpCisgICAgeworICAgICAgICByZXR1cm4gIkAiICsgbmFtZTsKKyAgICB9CisKKyAgICAvLyBubyBjaGFuZ2VzIG5lY2Vzc2FyeQorICAgIHJldHVybiBuYW1lOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmluaXRfa2V5d29yZHMoKQoreworICAgIG5ldGNvcmVfa2V5d29yZHMuY2xlYXIoKTsKKworICAgIC8vIEMjIGtleXdvcmRzCisgICAgbmV0Y29yZV9rZXl3b3Jkc1siYWJzdHJhY3QiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siYXMiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siYmFzZSJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJib29sIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImJyZWFrIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImJ5dGUiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siY2FzZSJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJjYXRjaCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJjaGFyIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImNoZWNrZWQiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siY2xhc3MiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siY29uc3QiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siY29udGludWUiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siZGVjaW1hbCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJkZWZhdWx0Il0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImRlbGVnYXRlIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImRvIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImRvdWJsZSJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJlbHNlIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImVudW0iXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siZXZlbnQiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siZXhwbGljaXQiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siZXh0ZXJuIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImZhbHNlIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImZpbmFsbHkiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siZml4ZWQiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siZmxvYXQiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siZm9yIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImZvcmVhY2giXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siZ290byJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJpZiJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJpbXBsaWNpdCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJpbiJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJpbnQiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siaW50ZXJmYWNlIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImludGVybmFsIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImlzIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImxvY2siXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sibG9uZyJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJuYW1lc3BhY2UiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sibmV3Il0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbIm51bGwiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sib2JqZWN0Il0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbIm9wZXJhdG9yIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbIm91dCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJvdmVycmlkZSJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJwYXJhbXMiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sicHJpdmF0ZSJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJwcm90ZWN0ZWQiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sicHVibGljIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInJlYWRvbmx5Il0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInJlZiJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJyZXR1cm4iXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sic2J5dGUiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sic2VhbGVkIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInNob3J0Il0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInNpemVvZiJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJzdGFja2FsbG9jIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInN0YXRpYyJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJzdHJpbmciXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sic3RydWN0Il0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInN3aXRjaCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJ0aGlzIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInRocm93Il0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInRydWUiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sidHJ5Il0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInR5cGVvZiJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJ1aW50Il0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInVsb25nIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInVuY2hlY2tlZCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJ1bnNhZmUiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sidXNob3J0Il0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInVzaW5nIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInZpcnR1YWwiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sidm9pZCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJ2b2xhdGlsZSJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJ3aGlsZSJdID0gMTsKKworICAgIC8vIEMjIGNvbnRleHR1YWwga2V5d29yZHMKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJhZGQiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siYWxpYXMiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siYXNjZW5kaW5nIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImFzeW5jIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImF3YWl0Il0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImRlc2NlbmRpbmciXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siZHluYW1pYyJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJmcm9tIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImdldCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJnbG9iYWwiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siZ3JvdXAiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siaW50byJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJqb2luIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImxldCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJvcmRlcmJ5Il0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInBhcnRpYWwiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sicmVtb3ZlIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInNlbGVjdCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJzZXQiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sidmFsdWUiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sidmFyIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbIndoZXJlIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInlpZWxkIl0gPSAxOworCisJbmV0Y29yZV9rZXl3b3Jkc1sid2hlbiJdID0gMTsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpzdGFydF9uZXRjb3JlX25hbWVzcGFjZShvc3RyZWFtJiBvdXQpCit7CisgICAgaWYgKCFuYW1lc3BhY2VfbmFtZV8uZW1wdHkoKSkKKyAgICB7CisgICAgICAgIG91dCA8PCAibmFtZXNwYWNlICIgPDwgbmFtZXNwYWNlX25hbWVfIDw8IGVuZGw7CisgICAgICAgIHNjb3BlX3VwKG91dCk7CisgICAgfQorfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmVuZF9uZXRjb3JlX25hbWVzcGFjZShvc3RyZWFtJiBvdXQpCit7CisgICAgaWYgKCFuYW1lc3BhY2VfbmFtZV8uZW1wdHkoKSkKKyAgICB7CisgICAgICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICB9Cit9CisKK3N0cmluZyB0X25ldGNvcmVfZ2VuZXJhdG9yOjpuZXRjb3JlX3R5cGVfdXNpbmdzKCkgY29uc3QKK3sKKyAgICBzdHJpbmcgbmFtZXNwYWNlcyA9CisgICAgICAgICJ1c2luZyBTeXN0ZW07XG4iCisgICAgICAgICJ1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnM7XG4iCisgICAgICAgICJ1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYztcbiIKKyAgICAgICAgInVzaW5nIFN5c3RlbS5UZXh0O1xuIgorICAgICAgICAidXNpbmcgU3lzdGVtLklPO1xuIgorICAgICAgICAidXNpbmcgU3lzdGVtLlRocmVhZGluZztcbiIKKyAgICAgICAgInVzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7XG4iCisgICAgICAgICJ1c2luZyBUaHJpZnQ7XG4iCisgICAgICAgICJ1c2luZyBUaHJpZnQuQ29sbGVjdGlvbnM7XG4iOworCisgICAgaWYgKHdjZl8pCisgICAgeworICAgICAgICBuYW1lc3BhY2VzICs9ICJ1c2luZyBTeXN0ZW0uU2VydmljZU1vZGVsO1xuIjsKKyAgICAgICAgbmFtZXNwYWNlcyArPSAidXNpbmcgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbjtcbiI7CisgICAgfQorCisgICAgcmV0dXJuIG5hbWVzcGFjZXMgKyBlbmRsOworfQorCitzdHJpbmcgdF9uZXRjb3JlX2dlbmVyYXRvcjo6bmV0Y29yZV90aHJpZnRfdXNpbmdzKCkgY29uc3QKK3sKKyAgICBzdHJpbmcgbmFtZXNwYWNlcyA9CisgICAgICAgICJ1c2luZyBUaHJpZnQuUHJvdG9jb2xzO1xuIgorICAgICAgICAidXNpbmcgVGhyaWZ0LlByb3RvY29scy5FbnRpdGllcztcbiIKKyAgICAgICAgInVzaW5nIFRocmlmdC5Qcm90b2NvbHMuVXRpbGl0aWVzO1xuIgorICAgICAgICAidXNpbmcgVGhyaWZ0LlRyYW5zcG9ydHM7XG4iCisgICAgICAgICJ1c2luZyBUaHJpZnQuVHJhbnNwb3J0cy5DbGllbnQ7XG4iCisgICAgICAgICJ1c2luZyBUaHJpZnQuVHJhbnNwb3J0cy5TZXJ2ZXI7XG4iOworCisgICAgcmV0dXJuIG5hbWVzcGFjZXMgKyBlbmRsOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpCit7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKQoreworICAgICh2b2lkKXR0eXBlZGVmOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkKK3sKKwlpbnQgaWMgPSBpbmRlbnRfY291bnQoKTsKKyAgICBzdHJpbmcgZl9lbnVtX25hbWUgPSBuYW1lc3BhY2VfZGlyXyArICIvIiArIHRlbnVtLT5nZXRfbmFtZSgpICsgIi5jcyI7CisKKyAgICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfZW51bTsKKyAgICBmX2VudW0ub3BlbihmX2VudW1fbmFtZS5jX3N0cigpKTsKKworCWdlbmVyYXRlX2VudW0oZl9lbnVtLCB0ZW51bSk7CisKKyAgICBmX2VudW0uY2xvc2UoKTsKKwlpbmRlbnRfdmFsaWRhdGUoaWMsICJnZW5lcmF0ZV9lbnVtIik7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bShvc3RyZWFtJiBvdXQsIHRfZW51bSogdGVudW0pCit7CisJb3V0IDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGVuZGw7CisKKwlzdGFydF9uZXRjb3JlX25hbWVzcGFjZShvdXQpOworCWdlbmVyYXRlX25ldGNvcmVfZG9jKG91dCwgdGVudW0pOworCisJb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgZW51bSAiIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8IGVuZGw7CisJc2NvcGVfdXAob3V0KTsKKworCXZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOworCXZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOworCisJZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpCisJeworCQlnZW5lcmF0ZV9uZXRjb3JlX2RvYyhvdXQsICpjX2l0ZXIpOworCQlpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOworCQlvdXQgPDwgaW5kZW50KCkgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8IHZhbHVlIDw8ICIsIiA8PCBlbmRsOworCX0KKworCXNjb3BlX2Rvd24ob3V0KTsKKwllbmRfbmV0Y29yZV9uYW1lc3BhY2Uob3V0KTsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdHModmVjdG9yPHRfY29uc3QqPiBjb25zdHMpCit7CisgICAgaWYgKGNvbnN0cy5lbXB0eSgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN0cmluZyBmX2NvbnN0c19uYW1lID0gbmFtZXNwYWNlX2Rpcl8gKyAnLycgKyBwcm9ncmFtX25hbWVfICsgIi5Db25zdGFudHMuY3MiOworICAgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9jb25zdHM7CisgICAgZl9jb25zdHMub3BlbihmX2NvbnN0c19uYW1lLmNfc3RyKCkpOworCisgICAgZ2VuZXJhdGVfY29uc3RzKGZfY29uc3RzLCBjb25zdHMpOworCisgICAgZl9jb25zdHMuY2xvc2UoKTsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdHMob3N0cmVhbSYgb3V0LCB2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykKK3sKKyAgICBpZiAoY29uc3RzLmVtcHR5KCkpCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgb3V0IDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IG5ldGNvcmVfdHlwZV91c2luZ3MoKSA8PCBlbmRsOworCisgICAgc3RhcnRfbmV0Y29yZV9uYW1lc3BhY2Uob3V0KTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIHN0YXRpYyBjbGFzcyAiIDw8IG1ha2VfdmFsaWRfY3NoYXJwX2lkZW50aWZpZXIocHJvZ3JhbV9uYW1lXykgPDwgIkNvbnN0YW50cyIgPDwgZW5kbDsKKworICAgIHNjb3BlX3VwKG91dCk7CisKKyAgICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7CisgICAgYm9vbCBuZWVkX3N0YXRpY19jb25zdHJ1Y3RvciA9IGZhbHNlOworICAgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKQorICAgIHsKKyAgICAgICAgZ2VuZXJhdGVfbmV0Y29yZV9kb2Mob3V0LCAqY19pdGVyKTsKKyAgICAgICAgaWYgKHByaW50X2NvbnN0X3ZhbHVlKG91dCwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpLCAoKmNfaXRlciktPmdldF90eXBlKCksICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCksIGZhbHNlKSkKKyAgICAgICAgeworICAgICAgICAgICAgbmVlZF9zdGF0aWNfY29uc3RydWN0b3IgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG5lZWRfc3RhdGljX2NvbnN0cnVjdG9yKQorICAgIHsKKyAgICAgICAgcHJpbnRfY29uc3RfY29uc3RydWN0b3Iob3V0LCBjb25zdHMpOworICAgIH0KKworICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICBlbmRfbmV0Y29yZV9uYW1lc3BhY2Uob3V0KTsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpwcmludF9jb25zdF9kZWZfdmFsdWUob3N0cmVhbSYgb3V0LCBzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkKK3sKKyAgICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkKKyAgICB7CisgICAgICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHN0YXRpY19jYXN0PHRfc3RydWN0Kj4odHlwZSktPmdldF9tZW1iZXJzKCk7CisgICAgICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgICAgICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgICAgIHByZXBhcmVfbWVtYmVyX25hbWVfbWFwcGluZyhzdGF0aWNfY2FzdDx0X3N0cnVjdCo+KHR5cGUpKTsKKworICAgICAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikKKyAgICAgICAgeworICAgICAgICAgICAgdF9maWVsZCogZmllbGQgPSBOVUxMOworCisgICAgICAgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZpZWxkID0gKmZfaXRlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmaWVsZCA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IGZpZWxkLT5nZXRfdHlwZSgpOworCisgICAgICAgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8IG5hbWUgPDwgIi4iIDw8IHByb3BfbmFtZShmaWVsZCkgPDwgIiA9ICIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOworICAgICAgICB9CisKKyAgICAgICAgY2xlYW51cF9tZW1iZXJfbmFtZV9tYXBwaW5nKHN0YXRpY19jYXN0PHRfc3RydWN0Kj4odHlwZSkpOworICAgIH0KKyAgICBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkKKyAgICB7CisgICAgICAgIHRfdHlwZSoga3R5cGUgPSBzdGF0aWNfY2FzdDx0X21hcCo+KHR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICAgICAgdF90eXBlKiB2dHlwZSA9IHN0YXRpY19jYXN0PHRfbWFwKj4odHlwZSktPmdldF92YWxfdHlwZSgpOworICAgICAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICAgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICAgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyBrZXkgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBrdHlwZSwgdl9pdGVyLT5maXJzdCk7CisgICAgICAgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgdnR5cGUsIHZfaXRlci0+c2Vjb25kKTsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCBuYW1lIDw8ICJbIiA8PCBrZXkgPDwgIl0iIDw8ICIgPSAiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpCisgICAgeworICAgICAgICB0X3R5cGUqIGV0eXBlOworICAgICAgICBpZiAodHlwZS0+aXNfbGlzdCgpKQorICAgICAgICB7CisgICAgICAgICAgICBldHlwZSA9IHN0YXRpY19jYXN0PHRfbGlzdCo+KHR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBldHlwZSA9IHN0YXRpY19jYXN0PHRfc2V0Kj4odHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOworICAgICAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgZXR5cGUsICp2X2l0ZXIpOworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8IG5hbWUgPDwgIi5BZGQoIiA8PCB2YWwgPDwgIik7IiA8PCBlbmRsOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OnByaW50X2NvbnN0X2NvbnN0cnVjdG9yKG9zdHJlYW0mIG91dCwgdmVjdG9yPHRfY29uc3QqPiBjb25zdHMpCit7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJzdGF0aWMgIiA8PCBtYWtlX3ZhbGlkX2NzaGFycF9pZGVudGlmaWVyKHByb2dyYW1fbmFtZV8pLmNfc3RyKCkgPDwgIkNvbnN0YW50cygpIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisKKyAgICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7CisgICAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpCisgICAgeworICAgICAgICBzdHJpbmcgbmFtZSA9ICgqY19pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgICAgdF90eXBlKiB0eXBlID0gKCpjX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7CisKKyAgICAgICAgcHJpbnRfY29uc3RfZGVmX3ZhbHVlKG91dCwgbmFtZSwgdHlwZSwgdmFsdWUpOworICAgIH0KKyAgICBzY29wZV9kb3duKG91dCk7Cit9CisKK2Jvb2wgdF9uZXRjb3JlX2dlbmVyYXRvcjo6cHJpbnRfY29uc3RfdmFsdWUob3N0cmVhbSYgb3V0LCBzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwgYm9vbCBpbl9zdGF0aWMsIGJvb2wgZGVmdmFsLCBib29sIG5lZWR0eXBlKQoreworICAgIG91dCA8PCBpbmRlbnQoKTsKKyAgICBib29sIG5lZWRfc3RhdGljX2NvbnN0cnVjdGlvbiA9ICFpbl9zdGF0aWM7CisgICAgd2hpbGUgKHR5cGUtPmlzX3R5cGVkZWYoKSkKKyAgICB7CisgICAgICAgIHR5cGUgPSBzdGF0aWNfY2FzdDx0X3R5cGVkZWYqPih0eXBlKS0+Z2V0X3R5cGUoKTsKKyAgICB9CisKKyAgICBpZiAoIWRlZnZhbCB8fCBuZWVkdHlwZSkKKyAgICB7CisgICAgICAgIG91dCA8PCAoaW5fc3RhdGljID8gIiIgOiB0eXBlLT5pc19iYXNlX3R5cGUoKSA/ICJwdWJsaWMgY29uc3QgIiA6ICJwdWJsaWMgc3RhdGljICIpIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiICI7CisgICAgfQorCisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKQorICAgIHsKKyAgICAgICAgc3RyaW5nIHYyID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgdHlwZSwgdmFsdWUpOworICAgICAgICBvdXQgPDwgbm9ybWFsaXplX25hbWUobmFtZSkgPDwgIiA9ICIgPDwgdjIgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgIG5lZWRfc3RhdGljX2NvbnN0cnVjdGlvbiA9IGZhbHNlOworICAgIH0KKyAgICBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpCisgICAgeworICAgICAgICBvdXQgPDwgbmFtZSA8PCAiID0gIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8ICIuIiA8PCB2YWx1ZS0+Z2V0X2lkZW50aWZpZXJfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOworICAgICAgICBuZWVkX3N0YXRpY19jb25zdHJ1Y3Rpb24gPSBmYWxzZTsKKyAgICB9CisgICAgZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkKKyAgICB7CisgICAgICAgIG91dCA8PCBuYW1lIDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIigpOyIgPDwgZW5kbDsKKyAgICB9CisgICAgZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpCisgICAgeworICAgICAgICBvdXQgPDwgbmFtZSA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIHRydWUsIHRydWUpIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgfQorICAgIGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkKKyAgICB7CisgICAgICAgIG91dCA8PCBuYW1lIDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIigpOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpZiAoZGVmdmFsICYmICF0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiAhdHlwZS0+aXNfZW51bSgpKQorICAgIHsKKyAgICAgICAgcHJpbnRfY29uc3RfZGVmX3ZhbHVlKG91dCwgbmFtZSwgdHlwZSwgdmFsdWUpOworICAgIH0KKworICAgIHJldHVybiBuZWVkX3N0YXRpY19jb25zdHJ1Y3Rpb247Cit9CisKK3N0cmluZyB0X25ldGNvcmVfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUob3N0cmVhbSYgb3V0LCBzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkKK3sKKyAgICAodm9pZCluYW1lOworICAgIG9zdHJpbmdzdHJlYW0gcmVuZGVyOworCisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKQorICAgIHsKKyAgICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9IHN0YXRpY19jYXN0PHRfYmFzZV90eXBlKj4odHlwZSktPmdldF9iYXNlKCk7CisgICAgICAgIHN3aXRjaCAodGJhc2UpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgICAgICByZW5kZXIgPDwgJyInIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgICAgIHJlbmRlciA8PCAoKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpCisgICAgeworICAgICAgICByZW5kZXIgPDwgdHlwZS0+Z2V0X25hbWUoKSA8PCAiLiIgPDwgdmFsdWUtPmdldF9pZGVudGlmaWVyX25hbWUoKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc3RyaW5nIHQgPSB0bXAoInRtcCIpOworICAgICAgICBwcmludF9jb25zdF92YWx1ZShvdXQsIHQsIHR5cGUsIHZhbHVlLCB0cnVlLCB0cnVlLCB0cnVlKTsKKyAgICAgICAgcmVuZGVyIDw8IHQ7CisgICAgfQorCisgICAgcmV0dXJuIHJlbmRlci5zdHIoKTsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpCit7CisgICAgaWYgKHVuaW9uXyAmJiB0c3RydWN0LT5pc191bmlvbigpKQorICAgIHsKKyAgICAgICAgZ2VuZXJhdGVfbmV0Y29yZV91bmlvbih0c3RydWN0KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZ2VuZXJhdGVfbmV0Y29yZV9zdHJ1Y3QodHN0cnVjdCwgZmFsc2UpOworICAgIH0KK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKQoreworICAgIGdlbmVyYXRlX25ldGNvcmVfc3RydWN0KHR4Y2VwdGlvbiwgdHJ1ZSk7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbmV0Y29yZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKQoreworICAgIGludCBpYyA9IGluZGVudF9jb3VudCgpOworCisgICAgc3RyaW5nIGZfc3RydWN0X25hbWUgPSBuYW1lc3BhY2VfZGlyXyArICIvIiArICh0c3RydWN0LT5nZXRfbmFtZSgpKSArICIuY3MiOworICAgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9zdHJ1Y3Q7CisKKyAgICBmX3N0cnVjdC5vcGVuKGZfc3RydWN0X25hbWUuY19zdHIoKSk7CisKKyAgICBmX3N0cnVjdCA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBuZXRjb3JlX3R5cGVfdXNpbmdzKCkgPDwgbmV0Y29yZV90aHJpZnRfdXNpbmdzKCkgPDwgZW5kbDsKKworICAgIGdlbmVyYXRlX25ldGNvcmVfc3RydWN0X2RlZmluaXRpb24oZl9zdHJ1Y3QsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7CisKKyAgICBmX3N0cnVjdC5jbG9zZSgpOworCisgICAgaW5kZW50X3ZhbGlkYXRlKGljLCAiZ2VuZXJhdGVfbmV0Y29yZV9zdHJ1Y3QiKTsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9uZXRjb3JlX3N0cnVjdF9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uLCBib29sIGluX2NsYXNzLCBib29sIGlzX3Jlc3VsdCkKK3sKKyAgICBpZiAoIWluX2NsYXNzKQorICAgIHsKKyAgICAgICAgc3RhcnRfbmV0Y29yZV9uYW1lc3BhY2Uob3V0KTsKKyAgICB9CisKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIGdlbmVyYXRlX25ldGNvcmVfZG9jKG91dCwgdHN0cnVjdCk7CisgICAgcHJlcGFyZV9tZW1iZXJfbmFtZV9tYXBwaW5nKHRzdHJ1Y3QpOworCisgICAgaWYgKChzZXJpYWxpemVfIHx8IHdjZl8pICYmICFpc19leGNlcHRpb24pCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltEYXRhQ29udHJhY3QoTmFtZXNwYWNlPVwiIiA8PCB3Y2ZfbmFtZXNwYWNlXyA8PCAiXCIpXSIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBib29sIGlzX2ZpbmFsID0gdHN0cnVjdC0+YW5ub3RhdGlvbnNfLmZpbmQoImZpbmFsIikgIT0gdHN0cnVjdC0+YW5ub3RhdGlvbnNfLmVuZCgpOworCisgICAgc3RyaW5nIHNoYXJwX3N0cnVjdF9uYW1lID0gY2hlY2tfYW5kX2NvcnJlY3Rfc3RydWN0X25hbWUobm9ybWFsaXplX25hbWUodHN0cnVjdC0+Z2V0X25hbWUoKSkpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgIiA8PCAoaXNfZmluYWwgPyAic2VhbGVkICIgOiAiIikgPDwgInBhcnRpYWwgY2xhc3MgIiA8PCBzaGFycF9zdHJ1Y3RfbmFtZSA8PCAiIDogIjsKKworICAgIGlmIChpc19leGNlcHRpb24pCisgICAgeworICAgICAgICBvdXQgPDwgIlRFeGNlcHRpb24sICI7CisgICAgfQorCisgICAgb3V0IDw8ICJUQmFzZSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICAgIC8vIG1ha2UgcHJpdmF0ZSBtZW1iZXJzIHdpdGggcHVibGljIFByb3BlcnRpZXMKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKQorICAgIHsKKyAgICAgICAgLy8gaWYgdGhlIGZpZWxkIGlzIHJlcXVpZWQsIHRoZW4gd2UgdXNlIGF1dG8tcHJvcGVydGllcworICAgICAgICBpZiAoIWZpZWxkX2lzX3JlcXVpcmVkKCgqbV9pdGVyKSkgJiYgKCFudWxsYWJsZV8gfHwgZmllbGRfaGFzX2RlZmF1bHQoKCptX2l0ZXIpKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHJpdmF0ZSAiIDw8IGRlY2xhcmVfZmllbGQoKm1faXRlciwgZmFsc2UsICJfIikgPDwgZW5kbDsKKyAgICAgICAgfQorICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKworICAgIGJvb2wgaGFzX25vbl9yZXF1aXJlZF9maWVsZHMgPSBmYWxzZTsKKyAgICBib29sIGhhc19ub25fcmVxdWlyZWRfZGVmYXVsdF92YWx1ZV9maWVsZHMgPSBmYWxzZTsKKyAgICBib29sIGhhc19yZXF1aXJlZF9maWVsZHMgPSBmYWxzZTsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKQorICAgIHsKKyAgICAgICAgZ2VuZXJhdGVfbmV0Y29yZV9kb2Mob3V0LCAqbV9pdGVyKTsKKyAgICAgICAgZ2VuZXJhdGVfcHJvcGVydHkob3V0LCAqbV9pdGVyLCB0cnVlLCB0cnVlKTsKKyAgICAgICAgYm9vbCBpc19yZXF1aXJlZCA9IGZpZWxkX2lzX3JlcXVpcmVkKCgqbV9pdGVyKSk7CisgICAgICAgIGJvb2wgaGFzX2RlZmF1bHQgPSBmaWVsZF9oYXNfZGVmYXVsdCgoKm1faXRlcikpOworICAgICAgICBpZiAoaXNfcmVxdWlyZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGhhc19yZXF1aXJlZF9maWVsZHMgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGhhc19kZWZhdWx0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGhhc19ub25fcmVxdWlyZWRfZGVmYXVsdF92YWx1ZV9maWVsZHMgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaGFzX25vbl9yZXF1aXJlZF9maWVsZHMgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgYm9vbCBnZW5lcmF0ZV9pc3NldCA9IChudWxsYWJsZV8gJiYgaGFzX25vbl9yZXF1aXJlZF9kZWZhdWx0X3ZhbHVlX2ZpZWxkcykgfHwgKCFudWxsYWJsZV8gJiYgaGFzX25vbl9yZXF1aXJlZF9maWVsZHMpOworICAgIGlmIChnZW5lcmF0ZV9pc3NldCkKKyAgICB7CisgICAgICAgIG91dCA8PCBlbmRsOworICAgICAgICBpZiAoc2VyaWFsaXplXyB8fCB3Y2ZfKQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltEYXRhTWVtYmVyKE9yZGVyID0gMSldIiA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIElzc2V0IF9faXNzZXQ7IiA8PCBlbmRsOworICAgICAgICBpZiAoc2VyaWFsaXplXyB8fCB3Y2ZfKQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltEYXRhQ29udHJhY3RdIiA8PCBlbmRsOworICAgICAgICB9CisKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgc3RydWN0IElzc2V0IiA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikKKyAgICAgICAgeworICAgICAgICAgICAgYm9vbCBpc19yZXF1aXJlZCA9IGZpZWxkX2lzX3JlcXVpcmVkKCgqbV9pdGVyKSk7CisgICAgICAgICAgICBib29sIGhhc19kZWZhdWx0ID0gZmllbGRfaGFzX2RlZmF1bHQoKCptX2l0ZXIpKTsKKyAgICAgICAgICAgIC8vIGlmIGl0IGlzIHJlcXVpcmVkLCBkb24ndCBuZWVkIElzc2V0IGZvciB0aGF0IHZhcmlhYmxlCisgICAgICAgICAgICAvLyBpZiBpdCBpcyBub3QgcmVxdWlyZWQsIGlmIGl0IGhhcyBhIGRlZmF1bHQgdmFsdWUsIHdlIG5lZWQgdG8gZ2VuZXJhdGUgSXNzZXQKKyAgICAgICAgICAgIC8vIGlmIHdlIGFyZSBub3QgbnVsbGFibGUsIHRoZW4gd2UgZ2VuZXJhdGUgSXNzZXQKKyAgICAgICAgICAgIGlmICghaXNfcmVxdWlyZWQgJiYgKCFudWxsYWJsZV8gfHwgaGFzX2RlZmF1bHQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChzZXJpYWxpemVfIHx8IHdjZl8pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltEYXRhTWVtYmVyXSIgPDwgZW5kbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgYm9vbCAiIDw8IG5vcm1hbGl6ZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgICAgICBpZiAoZ2VuZXJhdGVfaXNzZXQgJiYgKHNlcmlhbGl6ZV8gfHwgd2NmXykpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiI3JlZ2lvbiBYbWxTZXJpYWxpemVyIHN1cHBvcnQiIDw8IGVuZGwgPDwgZW5kbDsKKworICAgICAgICAgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBib29sIGlzX3JlcXVpcmVkID0gZmllbGRfaXNfcmVxdWlyZWQoKm1faXRlcik7CisgICAgICAgICAgICAgICAgYm9vbCBoYXNfZGVmYXVsdCA9IGZpZWxkX2hhc19kZWZhdWx0KCptX2l0ZXIpOworICAgICAgICAgICAgICAgIC8vIGlmIGl0IGlzIHJlcXVpcmVkLCBkb24ndCBuZWVkIElzc2V0IGZvciB0aGF0IHZhcmlhYmxlCisgICAgICAgICAgICAgICAgLy8gaWYgaXQgaXMgbm90IHJlcXVpcmVkLCBpZiBpdCBoYXMgYSBkZWZhdWx0IHZhbHVlLCB3ZSBuZWVkIHRvIGdlbmVyYXRlIElzc2V0CisgICAgICAgICAgICAgICAgLy8gaWYgd2UgYXJlIG5vdCBudWxsYWJsZSwgdGhlbiB3ZSBnZW5lcmF0ZSBJc3NldAorICAgICAgICAgICAgICAgIGlmICghaXNfcmVxdWlyZWQgJiYgKCFudWxsYWJsZV8gfHwgaGFzX2RlZmF1bHQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgYm9vbCBTaG91bGRTZXJpYWxpemUiIDw8IHByb3BfbmFtZSgqbV9pdGVyKSA8PCAiKCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICAgICAgICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gX19pc3NldC4iIDw8IG5vcm1hbGl6ZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIjZW5kcmVnaW9uIFhtbFNlcmlhbGl6ZXIgc3VwcG9ydCIgPDwgZW5kbCA8PCBlbmRsOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gV2UgYWx3YXlzIHdhbnQgYSBkZWZhdWx0LCBubyBhcmd1bWVudCBjb25zdHJ1Y3RvciBmb3IgUmVhZGluZworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljICIgPDwgc2hhcnBfc3RydWN0X25hbWUgPDwgIigpIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikKKyAgICB7CisgICAgICAgIHRfdHlwZSogdCA9ICgqbV9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICAgICAgd2hpbGUgKHQtPmlzX3R5cGVkZWYoKSkKKyAgICAgICAgeworICAgICAgICAgICAgdCA9IHN0YXRpY19jYXN0PHRfdHlwZWRlZio+KHQpLT5nZXRfdHlwZSgpOworICAgICAgICB9CisgICAgICAgIGlmICgoKm1faXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChmaWVsZF9pc19yZXF1aXJlZCgoKm1faXRlcikpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByaW50X2NvbnN0X3ZhbHVlKG91dCwgInRoaXMuIiArIHByb3BfbmFtZSgqbV9pdGVyKSwgdCwgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSwgdHJ1ZSwgdHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LCAidGhpcy5fIiArICgqbV9pdGVyKS0+Z2V0X25hbWUoKSwgdCwgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSwgdHJ1ZSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgLy8gT3B0aW9uYWxzIHdpdGggZGVmYXVsdHMgYXJlIG1hcmtlZCBzZXQKKyAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRoaXMuX19pc3NldC4iIDw8IG5vcm1hbGl6ZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiA9IHRydWU7IiA8PCBlbmRsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICBpZiAoaGFzX3JlcXVpcmVkX2ZpZWxkcykKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljICIgPDwgc2hhcnBfc3RydWN0X25hbWUgPDwgIigiOworICAgICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGZpZWxkX2lzX3JlcXVpcmVkKCptX2l0ZXIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG91dCA8PCAiLCAiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvdXQgPDwgdHlwZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBvdXQgPDwgIikgOiB0aGlzKCkiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKworICAgICAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZmllbGRfaXNfcmVxdWlyZWQoKm1faXRlcikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0aGlzLiIgPDwgcHJvcF9uYW1lKCptX2l0ZXIpIDw8ICIgPSAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgIH0KKworICAgIGdlbmVyYXRlX25ldGNvcmVfc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QpOworICAgIGlmIChpc19yZXN1bHQpCisgICAgeworICAgICAgICBnZW5lcmF0ZV9uZXRjb3JlX3N0cnVjdF9yZXN1bHRfd3JpdGVyKG91dCwgdHN0cnVjdCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGdlbmVyYXRlX25ldGNvcmVfc3RydWN0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOworICAgIH0KKyAgICBpZiAoaGFzaGNvZGVfKQorICAgIHsKKyAgICAgICAgZ2VuZXJhdGVfbmV0Y29yZV9zdHJ1Y3RfZXF1YWxzKG91dCwgdHN0cnVjdCk7CisgICAgICAgIGdlbmVyYXRlX25ldGNvcmVfc3RydWN0X2hhc2hjb2RlKG91dCwgdHN0cnVjdCk7CisgICAgfQorICAgIGdlbmVyYXRlX25ldGNvcmVfc3RydWN0X3Rvc3RyaW5nKG91dCwgdHN0cnVjdCk7CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgLy8gZ2VuZXJhdGUgYSBjb3JyZXNwb25kaW5nIFdDRiBmYXVsdCB0byB3cmFwIHRoZSBleGNlcHRpb24KKyAgICBpZiAoKHNlcmlhbGl6ZV8gfHwgd2NmXykgJiYgaXNfZXhjZXB0aW9uKQorICAgIHsKKyAgICAgICAgZ2VuZXJhdGVfbmV0Y29yZV93Y2ZmYXVsdChvdXQsIHRzdHJ1Y3QpOworICAgIH0KKworICAgIGNsZWFudXBfbWVtYmVyX25hbWVfbWFwcGluZyh0c3RydWN0KTsKKyAgICBpZiAoIWluX2NsYXNzKQorICAgIHsKKyAgICAgICAgZW5kX25ldGNvcmVfbmFtZXNwYWNlKG91dCk7CisgICAgfQorfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX25ldGNvcmVfd2NmZmF1bHQob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkKK3sKKyAgICBvdXQgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltEYXRhQ29udHJhY3RdIiA8PCBlbmRsOworCisgICAgYm9vbCBpc19maW5hbCA9IHRzdHJ1Y3QtPmFubm90YXRpb25zXy5maW5kKCJmaW5hbCIpICE9IHRzdHJ1Y3QtPmFubm90YXRpb25zXy5lbmQoKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljICIgPDwgKGlzX2ZpbmFsID8gInNlYWxlZCAiIDogIiIpIDw8ICJwYXJ0aWFsIGNsYXNzICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiRmF1bHQiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgICAvLyBtYWtlIHByaXZhdGUgbWVtYmVycyB3aXRoIHB1YmxpYyBQcm9wZXJ0aWVzCisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHJpdmF0ZSAiIDw8IGRlY2xhcmVfZmllbGQoKm1faXRlciwgZmFsc2UsICJfIikgPDwgZW5kbDsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKQorICAgIHsKKyAgICAgICAgZ2VuZXJhdGVfcHJvcGVydHkob3V0LCAqbV9pdGVyLCB0cnVlLCBmYWxzZSk7CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9uZXRjb3JlX3N0cnVjdF9yZWFkZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkKK3sKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBhc3luYyBUYXNrIFJlYWRBc3luYyhUUHJvdG9jb2wgaXByb3QsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlwcm90LkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ0cnkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAgIC8vIFJlcXVpcmVkIHZhcmlhYmxlcyBhcmVuJ3QgaW4gX19pc3NldCwgc28gd2UgbmVlZCB0bXAgdmFycyB0byBjaGVjayB0aGVtCisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpCisgICAgeworICAgICAgICBpZiAoZmllbGRfaXNfcmVxdWlyZWQoKmZfaXRlcikpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYm9vbCBpc3NldF8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gZmFsc2U7IiA8PCBlbmRsOworICAgICAgICB9CisgICAgfQorCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJURmllbGQgZmllbGQ7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCBpcHJvdC5SZWFkU3RydWN0QmVnaW5Bc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ3aGlsZSAodHJ1ZSkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJmaWVsZCA9IGF3YWl0IGlwcm90LlJlYWRGaWVsZEJlZ2luQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKGZpZWxkLlR5cGUgPT0gVFR5cGUuU3RvcCkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAic3dpdGNoIChmaWVsZC5JRCkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikKKyAgICB7CisgICAgICAgIGJvb2wgaXNfcmVxdWlyZWQgPSBmaWVsZF9pc19yZXF1aXJlZCgqZl9pdGVyKTsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJjYXNlICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjoiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChmaWVsZC5UeXBlID09ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIikiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKworICAgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIpOworICAgICAgICBpZiAoaXNfcmVxdWlyZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaXNzZXRfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IHRydWU7IiA8PCBlbmRsOworICAgICAgICB9CisKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZWxzZSIgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImF3YWl0IFRQcm90b2NvbFV0aWwuU2tpcEFzeW5jKGlwcm90LCBmaWVsZC5UeXBlLCBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgfQorCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJkZWZhdWx0OiAiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhd2FpdCBUUHJvdG9jb2xVdGlsLlNraXBBc3luYyhpcHJvdCwgZmllbGQuVHlwZSwgY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgaXByb3QuUmVhZEZpZWxkRW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCBpcHJvdC5SZWFkU3RydWN0RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKQorICAgIHsKKyAgICAgICAgaWYgKGZpZWxkX2lzX3JlcXVpcmVkKCgqZl9pdGVyKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCFpc3NldF8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSk7IiA8PCBlbmRsOworICAgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZmluYWxseSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlwcm90LkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbmV0Y29yZV9zdHJ1Y3Rfd3JpdGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpCit7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgYXN5bmMgVGFzayBXcml0ZUFzeW5jKFRQcm90b2NvbCBvcHJvdCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJvcHJvdC5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAidHJ5IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidmFyIHN0cnVjID0gbmV3IFRTdHJ1Y3QoXCIiIDw8IG5hbWUgPDwgIlwiKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LldyaXRlU3RydWN0QmVnaW5Bc3luYyhzdHJ1YywgY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKworICAgIGlmIChmaWVsZHMuc2l6ZSgpID4gMCkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidmFyIGZpZWxkID0gbmV3IFRGaWVsZCgpOyIgPDwgZW5kbDsKKyAgICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJvb2wgaXNfcmVxdWlyZWQgPSBmaWVsZF9pc19yZXF1aXJlZCgqZl9pdGVyKTsKKyAgICAgICAgICAgIGJvb2wgaGFzX2RlZmF1bHQgPSBmaWVsZF9oYXNfZGVmYXVsdCgqZl9pdGVyKTsKKyAgICAgICAgICAgIGlmIChudWxsYWJsZV8gJiYgIWhhc19kZWZhdWx0ICYmICFpc19yZXF1aXJlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgiIDw8IHByb3BfbmFtZSgqZl9pdGVyKSA8PCAiICE9IG51bGwpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIWlzX3JlcXVpcmVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJvb2wgbnVsbF9hbGxvd2VkID0gdHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpOworICAgICAgICAgICAgICAgIGlmIChudWxsX2FsbG93ZWQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgiIDw8IHByb3BfbmFtZSgqZl9pdGVyKSA8PCAiICE9IG51bGwgJiYgX19pc3NldC4iIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIikiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICAgICAgICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoX19pc3NldC4iIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIikiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICAgICAgICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImZpZWxkLk5hbWUgPSBcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIjsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZmllbGQuVHlwZSA9ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIjsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZmllbGQuSUQgPSAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICI7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LldyaXRlRmllbGRCZWdpbkFzeW5jKGZpZWxkLCBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworCisgICAgICAgICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyKTsKKworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhd2FpdCBvcHJvdC5Xcml0ZUZpZWxkRW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKyAgICAgICAgICAgIGlmICghaXNfcmVxdWlyZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LldyaXRlRmllbGRTdG9wQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuV3JpdGVTdHJ1Y3RFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJmaW5hbGx5IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAib3Byb3QuRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9uZXRjb3JlX3N0cnVjdF9yZXN1bHRfd3JpdGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpCit7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgYXN5bmMgVGFzayBXcml0ZUFzeW5jKFRQcm90b2NvbCBvcHJvdCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJvcHJvdC5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAidHJ5IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidmFyIHN0cnVjID0gbmV3IFRTdHJ1Y3QoXCIiIDw8IG5hbWUgPDwgIlwiKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LldyaXRlU3RydWN0QmVnaW5Bc3luYyhzdHJ1YywgY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKworICAgIGlmIChmaWVsZHMuc2l6ZSgpID4gMCkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidmFyIGZpZWxkID0gbmV3IFRGaWVsZCgpOyIgPDwgZW5kbDsKKyAgICAgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaWYiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZWxzZSBpZiI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChudWxsYWJsZV8pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3V0IDw8ICIodGhpcy4iIDw8IHByb3BfbmFtZSgoKmZfaXRlcikpIDw8ICIgIT0gbnVsbCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3V0IDw8ICIodGhpcy5fX2lzc2V0LiIgPDwgbm9ybWFsaXplX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGluZGVudF91cCgpOworCisgICAgICAgICAgICBib29sIG51bGxfYWxsb3dlZCA9ICFudWxsYWJsZV8gJiYgdHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpOworICAgICAgICAgICAgaWYgKG51bGxfYWxsb3dlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgiIDw8IHByb3BfbmFtZSgqZl9pdGVyKSA8PCAiICE9IG51bGwpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImZpZWxkLk5hbWUgPSBcIiIgPDwgcHJvcF9uYW1lKCpmX2l0ZXIpIDw8ICJcIjsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZmllbGQuVHlwZSA9ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIjsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZmllbGQuSUQgPSAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICI7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LldyaXRlRmllbGRCZWdpbkFzeW5jKGZpZWxkLCBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworCisgICAgICAgICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyKTsKKworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhd2FpdCBvcHJvdC5Xcml0ZUZpZWxkRW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKworICAgICAgICAgICAgaWYgKG51bGxfYWxsb3dlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuV3JpdGVGaWVsZFN0b3BBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCBvcHJvdC5Xcml0ZVN0cnVjdEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImZpbmFsbHkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJvcHJvdC5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX25ldGNvcmVfc3RydWN0X3Rvc3RyaW5nKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpCit7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihcIiIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKFwiKTsiIDw8IGVuZGw7CisKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAgIGJvb2wgdXNlRmlyc3RGbGFnID0gZmFsc2U7CisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpCisgICAgeworICAgICAgICBpZiAoIWZpZWxkX2lzX3JlcXVpcmVkKCgqZl9pdGVyKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYm9vbCBfX2ZpcnN0ID0gdHJ1ZTsiIDw8IGVuZGw7CisgICAgICAgICAgICB1c2VGaXJzdEZsYWcgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGJvb2wgaGFkX3JlcXVpcmVkID0gZmFsc2U7IC8vIHNldCB0byB0cnVlIGFmdGVyIGZpcnN0IHJlcXVpcmVkIGZpZWxkIGhhcyBiZWVuIHByb2Nlc3NlZAorCisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpCisgICAgeworICAgICAgICBib29sIGlzX3JlcXVpcmVkID0gZmllbGRfaXNfcmVxdWlyZWQoKCpmX2l0ZXIpKTsKKyAgICAgICAgYm9vbCBoYXNfZGVmYXVsdCA9IGZpZWxkX2hhc19kZWZhdWx0KCgqZl9pdGVyKSk7CisgICAgICAgIGlmIChudWxsYWJsZV8gJiYgIWhhc19kZWZhdWx0ICYmICFpc19yZXF1aXJlZCkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKSA8PCAiICE9IG51bGwpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICghaXNfcmVxdWlyZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJvb2wgbnVsbF9hbGxvd2VkID0gdHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpOworICAgICAgICAgICAgaWYgKG51bGxfYWxsb3dlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgiIDw8IHByb3BfbmFtZSgoKmZfaXRlcikpIDw8ICIgIT0gbnVsbCAmJiBfX2lzc2V0LiIgPDwgbm9ybWFsaXplX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgICAgICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChfX2lzc2V0LiIgPDwgbm9ybWFsaXplX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgICAgICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICh1c2VGaXJzdEZsYWcgJiYgKCFoYWRfcmVxdWlyZWQpKQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmKCFfX2ZpcnN0KSB7IHNiLkFwcGVuZChcIiwgXCIpOyB9IiA8PCBlbmRsOworICAgICAgICAgICAgaWYgKCFpc19yZXF1aXJlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIl9fZmlyc3QgPSBmYWxzZTsiIDw8IGVuZGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInNiLkFwcGVuZChcIiIgPDwgcHJvcF9uYW1lKCpmX2l0ZXIpIDw8ICI6IFwiKTsiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInNiLkFwcGVuZChcIiwgIiA8PCBwcm9wX25hbWUoKmZfaXRlcikgPDwgIjogXCIpOyIgPDwgZW5kbDsKKyAgICAgICAgfQorCisgICAgICAgIHRfdHlwZSogdHR5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgICAgIGlmICh0dHlwZS0+aXNfeGNlcHRpb24oKSB8fCB0dHlwZS0+aXNfc3RydWN0KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAic2IuQXBwZW5kKCIgPDwgcHJvcF9uYW1lKCpmX2l0ZXIpIDw8ICI9PSBudWxsID8gXCI8bnVsbD5cIiA6ICIgPDwgcHJvcF9uYW1lKCpmX2l0ZXIpIDw8ICIuVG9TdHJpbmcoKSk7IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJzYi5BcHBlbmQoIiA8PCBwcm9wX25hbWUoKmZfaXRlcikgPDwgIik7IiA8PCBlbmRsOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFpc19yZXF1aXJlZCkKKyAgICAgICAgeworICAgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGhhZF9yZXF1aXJlZCA9IHRydWU7IC8vIG5vdyBfX2ZpcnN0IG11c3QgYmUgZmFsc2UsIHNvIHdlIGRvbid0IG5lZWQgdG8gY2hlY2sgaXQgYW55bW9yZQorICAgICAgICB9CisgICAgfQorCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJzYi5BcHBlbmQoXCIpXCIpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHNiLlRvU3RyaW5nKCk7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX25ldGNvcmVfdW5pb24odF9zdHJ1Y3QqIHR1bmlvbikKK3sKKyAgICBpbnQgaWMgPSBpbmRlbnRfY291bnQoKTsKKworICAgIHN0cmluZyBmX3VuaW9uX25hbWUgPSBuYW1lc3BhY2VfZGlyXyArICIvIiArICh0dW5pb24tPmdldF9uYW1lKCkpICsgIi5jcyI7CisgICAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3VuaW9uOworCisgICAgZl91bmlvbi5vcGVuKGZfdW5pb25fbmFtZS5jX3N0cigpKTsKKworICAgIGZfdW5pb24gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgbmV0Y29yZV90eXBlX3VzaW5ncygpIDw8IG5ldGNvcmVfdGhyaWZ0X3VzaW5ncygpIDw8IGVuZGw7CisKKyAgICBnZW5lcmF0ZV9uZXRjb3JlX3VuaW9uX2RlZmluaXRpb24oZl91bmlvbiwgdHVuaW9uKTsKKworICAgIGZfdW5pb24uY2xvc2UoKTsKKworICAgIGluZGVudF92YWxpZGF0ZShpYywgImdlbmVyYXRlX25ldGNvcmVfdW5pb24uIik7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbmV0Y29yZV91bmlvbl9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHR1bmlvbikKK3sKKyAgICAvLyBMZXQncyBkZWZpbmUgdGhlIGNsYXNzIGZpcnN0CisgICAgc3RhcnRfbmV0Y29yZV9uYW1lc3BhY2Uob3V0KTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGFic3RyYWN0IHBhcnRpYWwgY2xhc3MgIiA8PCB0dW5pb24tPmdldF9uYW1lKCkgPDwgIiA6IFRBYnN0cmFjdEJhc2UiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBhYnN0cmFjdCBUYXNrIFdyaXRlQXN5bmMoVFByb3RvY29sIHRQcm90b2NvbCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAicHVibGljIHJlYWRvbmx5IGJvb2wgSXNzZXQ7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgYWJzdHJhY3Qgb2JqZWN0IERhdGEgeyBnZXQ7IH0iIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInByb3RlY3RlZCAiIDw8IHR1bmlvbi0+Z2V0X25hbWUoKSA8PCAiKGJvb2wgaXNzZXQpIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiSXNzZXQgPSBpc3NldDsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGNsYXNzIF9fX3VuZGVmaW5lZCA6ICIgPDwgdHVuaW9uLT5nZXRfbmFtZSgpIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBvdmVycmlkZSBvYmplY3QgRGF0YSB7IGdldCB7IHJldHVybiBudWxsOyB9IH0iIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBfX191bmRlZmluZWQoKSA6IGJhc2UoZmFsc2UpIHt9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBvdmVycmlkZSBUYXNrIFdyaXRlQXN5bmMoVFByb3RvY29sIG9wcm90LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCBUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLCBcIkNhbm5vdCBwZXJzaXN0IGFuIHVuaW9uIHR5cGUgd2hpY2ggaXMgbm90IHNldC5cIik7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHR1bmlvbi0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikKKyAgICB7CisgICAgICAgIGdlbmVyYXRlX25ldGNvcmVfdW5pb25fY2xhc3Mob3V0LCB0dW5pb24sICgqZl9pdGVyKSk7CisgICAgfQorCisgICAgZ2VuZXJhdGVfbmV0Y29yZV91bmlvbl9yZWFkZXIob3V0LCB0dW5pb24pOworCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIGVuZF9uZXRjb3JlX25hbWVzcGFjZShvdXQpOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX25ldGNvcmVfdW5pb25fY2xhc3Mob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHVuaW9uLCB0X2ZpZWxkKiB0ZmllbGQpCit7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgY2xhc3MgIiA8PCB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIiA6ICIgPDwgdHVuaW9uLT5nZXRfbmFtZSgpIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInByaXZhdGUgIiA8PCB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpKSA8PCAiIF9kYXRhOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAicHVibGljIG92ZXJyaWRlIG9iamVjdCBEYXRhIHsgZ2V0IHsgcmV0dXJuIF9kYXRhOyB9IH0iIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInB1YmxpYyAiIDw8IHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiKCIgPDwgdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSkgPDwgIiBkYXRhKSA6IGJhc2UodHJ1ZSkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0aGlzLl9kYXRhID0gZGF0YTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlQXN5bmMoVFByb3RvY29sIG9wcm90LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAib3Byb3QuSW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInRyeSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidmFyIHN0cnVjID0gbmV3IFRTdHJ1Y3QoXCIiIDw8IHR1bmlvbi0+Z2V0X25hbWUoKSA8PCAiXCIpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuV3JpdGVTdHJ1Y3RCZWdpbkFzeW5jKHN0cnVjLCBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YXIgZmllbGQgPSBuZXcgVEZpZWxkKCk7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJmaWVsZC5OYW1lID0gXCIiIDw8IHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiXCI7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJmaWVsZC5UeXBlID0gIiA8PCB0eXBlX3RvX2VudW0odGZpZWxkLT5nZXRfdHlwZSgpKSA8PCAiOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZmllbGQuSUQgPSAiIDw8IHRmaWVsZC0+Z2V0X2tleSgpIDw8ICI7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCBvcHJvdC5Xcml0ZUZpZWxkQmVnaW5Bc3luYyhmaWVsZCwgY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsIHRmaWVsZCwgIl9kYXRhIiwgdHJ1ZSwgdHJ1ZSk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LldyaXRlRmllbGRFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCBvcHJvdC5Xcml0ZUZpZWxkU3RvcEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LldyaXRlU3RydWN0RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZmluYWxseSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIm9wcm90LkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX25ldGNvcmVfc3RydWN0X2VxdWFscyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KQoreworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIG92ZXJyaWRlIGJvb2wgRXF1YWxzKG9iamVjdCB0aGF0KSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInZhciBvdGhlciA9IHRoYXQgYXMgIiA8PCBjaGVja19hbmRfY29ycmVjdF9zdHJ1Y3RfbmFtZShub3JtYWxpemVfbmFtZSh0c3RydWN0LT5nZXRfbmFtZSgpKSkgPDwgIjsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmIChvdGhlciA9PSBudWxsKSByZXR1cm4gZmFsc2U7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoUmVmZXJlbmNlRXF1YWxzKHRoaXMsIG90aGVyKSkgcmV0dXJuIHRydWU7IiA8PCBlbmRsOworCisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKQorICAgIHsKKyAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICB7CisgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gIjsKKyAgICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8IGVuZGw7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiYmICI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFmaWVsZF9pc19yZXF1aXJlZCgoKmZfaXRlcikpICYmICEobnVsbGFibGVfICYmICFmaWVsZF9oYXNfZGVmYXVsdCgoKmZfaXRlcikpKSkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8ICIoKF9faXNzZXQuIiA8PCBub3JtYWxpemVfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIgPT0gb3RoZXIuX19pc3NldC4iCisgICAgICAgICAgICAgICAgPDwgbm9ybWFsaXplX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKSAmJiAoKCFfX2lzc2V0LiIKKyAgICAgICAgICAgICAgICA8PCBub3JtYWxpemVfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIpIHx8ICgiOworICAgICAgICB9CisgICAgICAgIHRfdHlwZSogdHR5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgICAgIGlmICh0dHlwZS0+aXNfY29udGFpbmVyKCkgfHwgdHR5cGUtPmlzX2JpbmFyeSgpKQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgIlRDb2xsZWN0aW9ucy5FcXVhbHMoIjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCAiU3lzdGVtLk9iamVjdC5FcXVhbHMoIjsKKyAgICAgICAgfQorICAgICAgICBvdXQgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIiwgb3RoZXIuIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKSA8PCAiKSI7CisgICAgICAgIGlmICghZmllbGRfaXNfcmVxdWlyZWQoKCpmX2l0ZXIpKSAmJiAhKG51bGxhYmxlXyAmJiAhZmllbGRfaGFzX2RlZmF1bHQoKCpmX2l0ZXIpKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCAiKSkpIjsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoZmlyc3QpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiB0cnVlOyIgPDwgZW5kbDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgb3V0IDw8ICI7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbmV0Y29yZV9zdHJ1Y3RfaGFzaGNvZGUob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkKK3sKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBvdmVycmlkZSBpbnQgR2V0SGFzaENvZGUoKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpbnQgaGFzaGNvZGUgPSAwOyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInVuY2hlY2tlZCB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikKKyAgICB7CisgICAgICAgIHRfdHlwZSogdHR5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaGFzaGNvZGUgPSAoaGFzaGNvZGUgKiAzOTcpIF4gIjsKKyAgICAgICAgaWYgKGZpZWxkX2lzX3JlcXVpcmVkKCgqZl9pdGVyKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCAiKCI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAobnVsbGFibGVfKQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgIigiIDw8IHByb3BfbmFtZSgoKmZfaXRlcikpIDw8ICIgPT0gbnVsbCA/IDAgOiAiOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8ICIoIV9faXNzZXQuIiA8PCBub3JtYWxpemVfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIgPyAwIDogIjsKKyAgICAgICAgfQorICAgICAgICBpZiAodHR5cGUtPmlzX2NvbnRhaW5lcigpKQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgIihUQ29sbGVjdGlvbnMuR2V0SGFzaENvZGUoIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKSA8PCAiKSkiOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8ICIoIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKSA8PCAiLkdldEhhc2hDb2RlKCkpIjsKKyAgICAgICAgfQorICAgICAgICBvdXQgPDwgIik7IiA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGhhc2hjb2RlOyIgPDwgZW5kbDsKKworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKQoreworICAgIGludCBpYyA9IGluZGVudF9jb3VudCgpOworCisgICAgc3RyaW5nIGZfc2VydmljZV9uYW1lID0gbmFtZXNwYWNlX2Rpcl8gKyAiLyIgKyBzZXJ2aWNlX25hbWVfICsgIi5jcyI7CisgICAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3NlcnZpY2U7CisgICAgZl9zZXJ2aWNlLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7CisKKyAgICBmX3NlcnZpY2UgPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgbmV0Y29yZV90eXBlX3VzaW5ncygpIDw8IG5ldGNvcmVfdGhyaWZ0X3VzaW5ncygpIDw8IGVuZGw7CisKKyAgICBzdGFydF9uZXRjb3JlX25hbWVzcGFjZShmX3NlcnZpY2UpOworCisgICAgZl9zZXJ2aWNlIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgcGFydGlhbCBjbGFzcyAiIDw8IG5vcm1hbGl6ZV9uYW1lKHNlcnZpY2VfbmFtZV8pIDw8IGVuZGwKKyAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZShmX3NlcnZpY2UsIHRzZXJ2aWNlKTsKKyAgICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudChmX3NlcnZpY2UsIHRzZXJ2aWNlKTsKKyAgICBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcihmX3NlcnZpY2UsIHRzZXJ2aWNlKTsKKyAgICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnMoZl9zZXJ2aWNlLCB0c2VydmljZSk7CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfc2VydmljZSA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICAgIGVuZF9uZXRjb3JlX25hbWVzcGFjZShmX3NlcnZpY2UpOworICAgIGZfc2VydmljZS5jbG9zZSgpOworCisgICAgaW5kZW50X3ZhbGlkYXRlKGljLCAiZ2VuZXJhdGVfc2VydmljZS4iKTsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZShvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpCit7CisgICAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgICBzdHJpbmcgZXh0ZW5kc19pZmFjZSA9ICIiOworICAgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7CisgICAgICAgIGV4dGVuZHNfaWZhY2UgPSAiIDogIiArIGV4dGVuZHMgKyAiLklBc3luYyI7CisgICAgfQorCisgICAgLy9vdXQgPDwgZW5kbCA8PCBlbmRsOworCisgICAgZ2VuZXJhdGVfbmV0Y29yZV9kb2Mob3V0LCB0c2VydmljZSk7CisKKyAgICBpZiAod2NmXykKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW1NlcnZpY2VDb250cmFjdChOYW1lc3BhY2U9XCIiIDw8IHdjZl9uYW1lc3BhY2VfIDw8ICJcIildIiA8PCBlbmRsOworICAgIH0KKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGludGVyZmFjZSBJQXN5bmMiIDw8IGV4dGVuZHNfaWZhY2UgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKworICAgIGluZGVudF91cCgpOworICAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgICAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpCisgICAgeworICAgICAgICBnZW5lcmF0ZV9uZXRjb3JlX2RvYyhvdXQsICpmX2l0ZXIpOworCisgICAgICAgIC8vIGlmIHdlJ3JlIHVzaW5nIFdDRiwgYWRkIHRoZSBjb3JyZXNwb25kaW5nIGF0dHJpYnV0ZXMKKyAgICAgICAgaWYgKHdjZl8pCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW09wZXJhdGlvbkNvbnRyYWN0XSIgPDwgZW5kbDsKKworICAgICAgICAgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCktPmdldF9tZW1iZXJzKCk7CisgICAgICAgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgICAgICAgICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltGYXVsdENvbnRyYWN0KHR5cGVvZigiICsgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlKSArICJGYXVsdCkpXSIgPDwgZW5kbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCBmdW5jdGlvbl9zaWduYXR1cmVfYXN5bmMoKmZfaXRlcikgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnMob3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKQoreworICAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikKKyAgICB7CisgICAgICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICAgICAgZ2VuZXJhdGVfbmV0Y29yZV9zdHJ1Y3RfZGVmaW5pdGlvbihvdXQsIHRzLCBmYWxzZSwgdHJ1ZSk7CisgICAgICAgIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnMob3V0LCAqZl9pdGVyKTsKKyAgICB9Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9jbGllbnQob3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKQoreworICAgIHN0cmluZyBleHRlbmRzID0gIiI7CisgICAgc3RyaW5nIGV4dGVuZHNfY2xpZW50ID0gIiI7CisgICAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpCisgICAgeworICAgICAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICAgICAgZXh0ZW5kc19jbGllbnQgPSBleHRlbmRzICsgIi5DbGllbnQsICI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGV4dGVuZHNfY2xpZW50ID0gIlRCYXNlQ2xpZW50LCBJRGlzcG9zYWJsZSwgIjsKKyAgICB9CisKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIGdlbmVyYXRlX25ldGNvcmVfZG9jKG91dCwgdHNlcnZpY2UpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgY2xhc3MgQ2xpZW50IDogIiA8PCBleHRlbmRzX2NsaWVudCA8PCAiSUFzeW5jIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgQ2xpZW50KFRQcm90b2NvbCBwcm90b2NvbCkgOiB0aGlzKHByb3RvY29sLCBwcm90b2NvbCkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAicHVibGljIENsaWVudChUUHJvdG9jb2wgaW5wdXRQcm90b2NvbCwgVFByb3RvY29sIG91dHB1dFByb3RvY29sKSA6IGJhc2UoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpIgorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmdW5jdGlvbnNfaXRlcmF0b3I7CisKKyAgICBmb3IgKGZ1bmN0aW9uc19pdGVyYXRvciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmdW5jdGlvbnNfaXRlcmF0b3IgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2Z1bmN0aW9uc19pdGVyYXRvcikKKyAgICB7CisgICAgICAgIHN0cmluZyBmdW5jdGlvbl9uYW1lID0gY29ycmVjdF9mdW5jdGlvbl9uYW1lX2Zvcl9hc3luYygoKmZ1bmN0aW9uc19pdGVyYXRvciktPmdldF9uYW1lKCkpOworCisgICAgICAgIC8vIGFzeW5jCisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGFzeW5jICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlX2FzeW5jKCpmdW5jdGlvbnNfaXRlcmF0b3IsICIiKSA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgICAgc3RyaW5nIGFyZ3NuYW1lID0gKCpmdW5jdGlvbnNfaXRlcmF0b3IpLT5nZXRfbmFtZSgpICsgIkFyZ3MiOworCisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgT3V0cHV0UHJvdG9jb2wuV3JpdGVNZXNzYWdlQmVnaW5Bc3luYyhuZXcgVE1lc3NhZ2UoXCIiIDw8IGZ1bmN0aW9uX25hbWUKKyAgICAgICAgICAgIDw8ICJcIiwgIiA8PCAoKCpmdW5jdGlvbnNfaXRlcmF0b3IpLT5pc19vbmV3YXkoKSA/ICJUTWVzc2FnZVR5cGUuT25ld2F5IiA6ICJUTWVzc2FnZVR5cGUuQ2FsbCIpIDw8ICIsIFNlcUlkKSwgY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInZhciBhcmdzID0gbmV3ICIgPDwgYXJnc25hbWUgPDwgIigpOyIgPDwgZW5kbDsKKworICAgICAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZnVuY3Rpb25zX2l0ZXJhdG9yKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICAgICAgcHJlcGFyZV9tZW1iZXJfbmFtZV9tYXBwaW5nKGFyZ19zdHJ1Y3QpOworICAgICAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICAgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKKworICAgICAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhcmdzLiIgPDwgcHJvcF9uYW1lKCpmbGRfaXRlcikgPDwgIiA9ICIgPDwgbm9ybWFsaXplX25hbWUoKCpmbGRfaXRlciktPmdldF9uYW1lKCkpIDw8ICI7IiA8PCBlbmRsOworICAgICAgICB9CisKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCBhcmdzLldyaXRlQXN5bmMoT3V0cHV0UHJvdG9jb2wsIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCBPdXRwdXRQcm90b2NvbC5Xcml0ZU1lc3NhZ2VFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgT3V0cHV0UHJvdG9jb2wuVHJhbnNwb3J0LkZsdXNoQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKworICAgICAgICBpZiAoISgqZnVuY3Rpb25zX2l0ZXJhdG9yKS0+aXNfb25ld2F5KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyByZXN1bHRuYW1lID0gKCpmdW5jdGlvbnNfaXRlcmF0b3IpLT5nZXRfbmFtZSgpICsgIlJlc3VsdCI7CisgICAgICAgICAgICB0X3N0cnVjdCBub2FyZ3MocHJvZ3JhbV8pOworICAgICAgICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmdW5jdGlvbnNfaXRlcmF0b3IpLT5nZXRfeGNlcHRpb25zKCk7CisgICAgICAgICAgICBwcmVwYXJlX21lbWJlcl9uYW1lX21hcHBpbmcoeHMsIHhzLT5nZXRfbWVtYmVycygpLCByZXN1bHRuYW1lKTsKKworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAidmFyIG1zZyA9IGF3YWl0IElucHV0UHJvdG9jb2wuUmVhZE1lc3NhZ2VCZWdpbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKG1zZy5UeXBlID09IFRNZXNzYWdlVHlwZS5FeGNlcHRpb24pIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgICAgICBpbmRlbnRfdXAoKTsKKworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YXIgeCA9IGF3YWl0IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5SZWFkQXN5bmMoSW5wdXRQcm90b2NvbCwgY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCBJbnB1dFByb3RvY29sLlJlYWRNZXNzYWdlRW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ0aHJvdyB4OyIgPDwgZW5kbDsKKyAgICAgICAgICAgIGluZGVudF9kb3duKCk7CisKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAidmFyIHJlc3VsdCA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIigpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCByZXN1bHQuUmVhZEFzeW5jKElucHV0UHJvdG9jb2wsIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgSW5wdXRQcm90b2NvbC5SZWFkTWVzc2FnZUVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisKKyAgICAgICAgICAgIGlmICghKCpmdW5jdGlvbnNfaXRlcmF0b3IpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKG51bGxhYmxlXykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKCgqZnVuY3Rpb25zX2l0ZXJhdG9yKS0+Z2V0X3JldHVybnR5cGUoKSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKHJlc3VsdC5TdWNjZXNzICE9IG51bGwpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHJlc3VsdC5TdWNjZXNzOyIgPDwgZW5kbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChyZXN1bHQuU3VjY2Vzcy5IYXNWYWx1ZSkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gcmVzdWx0LlN1Y2Nlc3MuVmFsdWU7IiA8PCBlbmRsOworICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChyZXN1bHQuX19pc3NldC5zdWNjZXNzKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiByZXN1bHQuU3VjY2VzczsiIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICAgICAgICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworICAgICAgICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKG51bGxhYmxlXykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKHJlc3VsdC4iIDw8IHByb3BfbmFtZSgqeF9pdGVyKSA8PCAiICE9IG51bGwpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgICAgICAgICAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGhyb3cgcmVzdWx0LiIgPDwgcHJvcF9uYW1lKCp4X2l0ZXIpIDw8ICI7IiA8PCBlbmRsOworICAgICAgICAgICAgICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKHJlc3VsdC5fX2lzc2V0LiIgPDwgbm9ybWFsaXplX25hbWUoKCp4X2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRocm93IHJlc3VsdC4iIDw8IHByb3BfbmFtZSgqeF9pdGVyKSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgICAgICAgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCgqZnVuY3Rpb25zX2l0ZXJhdG9yKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRocm93IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTWlzc2luZ1Jlc3VsdCwgXCIiCisgICAgICAgICAgICAgICAgICAgIDw8IGZ1bmN0aW9uX25hbWUgPDwgIiBmYWlsZWQ6IHVua25vd24gcmVzdWx0XCIpOyIgPDwgZW5kbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xlYW51cF9tZW1iZXJfbmFtZV9tYXBwaW5nKCgqZnVuY3Rpb25zX2l0ZXJhdG9yKS0+Z2V0X3hjZXB0aW9ucygpKTsKKyAgICAgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSkKK3sKKyAgICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgICAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworCisgICAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgICBzdHJpbmcgZXh0ZW5kc19wcm9jZXNzb3IgPSAiIjsKKyAgICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgICAgICBleHRlbmRzX3Byb2Nlc3NvciA9IGV4dGVuZHMgKyAiLkFzeW5jUHJvY2Vzc29yLCAiOworICAgIH0KKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGNsYXNzIEFzeW5jUHJvY2Vzc29yIDogIiA8PCBleHRlbmRzX3Byb2Nlc3NvciA8PCAiSVRBc3luY1Byb2Nlc3NvciIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKworICAgIGluZGVudF91cCgpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwcml2YXRlIElBc3luYyBfaUFzeW5jOyIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgQXN5bmNQcm9jZXNzb3IoSUFzeW5jIGlBc3luYykiOworCisgICAgaWYgKCFleHRlbmRzLmVtcHR5KCkpCisgICAgeworICAgICAgICBvdXQgPDwgIiA6IGJhc2UoaUFzeW5jKSI7CisgICAgfQorCisgICAgb3V0IDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChpQXN5bmMgPT0gbnVsbCkgdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbihuYW1lb2YoaUFzeW5jKSk7IiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIl9pQXN5bmMgPSBpQXN5bmM7IiA8PCBlbmRsOworCisgICAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpCisgICAgeworICAgICAgICBzdHJpbmcgZnVuY3Rpb25fbmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwcm9jZXNzTWFwX1tcIiIgPDwgY29ycmVjdF9mdW5jdGlvbl9uYW1lX2Zvcl9hc3luYyhmdW5jdGlvbl9uYW1lKSA8PCAiXCJdID0gIiA8PCBmdW5jdGlvbl9uYW1lIDw8ICJfUHJvY2Vzc0FzeW5jOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsOworCisgICAgaWYgKGV4dGVuZHMuZW1wdHkoKSkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHJvdGVjdGVkIGRlbGVnYXRlIFRhc2sgUHJvY2Vzc0Z1bmN0aW9uKGludCBzZXFpZCwgVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgaWYgKGV4dGVuZHMuZW1wdHkoKSkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHJvdGVjdGVkIERpY3Rpb25hcnk8c3RyaW5nLCBQcm9jZXNzRnVuY3Rpb24+IHByb2Nlc3NNYXBfID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBQcm9jZXNzRnVuY3Rpb24+KCk7IiA8PCBlbmRsOworICAgIH0KKworICAgIG91dCA8PCBlbmRsOworCisgICAgaWYgKGV4dGVuZHMuZW1wdHkoKSkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGFzeW5jIFRhc2s8Ym9vbD4gUHJvY2Vzc0FzeW5jKFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KSIgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBhd2FpdCBQcm9jZXNzQXN5bmMoaXByb3QsIG9wcm90LCBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGFzeW5jIFRhc2s8Ym9vbD4gUHJvY2Vzc0FzeW5jKFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikiIDw8IGVuZGw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIG5ldyBhc3luYyBUYXNrPGJvb2w+IFByb2Nlc3NBc3luYyhUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCkiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gYXdhaXQgUHJvY2Vzc0FzeW5jKGlwcm90LCBvcHJvdCwgQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBuZXcgYXN5bmMgVGFzazxib29sPiBQcm9jZXNzQXN5bmMoVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKSIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0cnkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YXIgbXNnID0gYXdhaXQgaXByb3QuUmVhZE1lc3NhZ2VCZWdpbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiUHJvY2Vzc0Z1bmN0aW9uIGZuOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAicHJvY2Vzc01hcF8uVHJ5R2V0VmFsdWUobXNnLk5hbWUsIG91dCBmbik7IiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmIChmbiA9PSBudWxsKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImF3YWl0IFRQcm90b2NvbFV0aWwuU2tpcEFzeW5jKGlwcm90LCBUVHlwZS5TdHJ1Y3QsIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IGlwcm90LlJlYWRNZXNzYWdlRW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAidmFyIHggPSBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIChUQXBwbGljYXRpb25FeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Vbmtub3duTWV0aG9kLCBcIkludmFsaWQgbWV0aG9kIG5hbWU6ICdcIiArIG1zZy5OYW1lICsgXCInXCIpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuV3JpdGVNZXNzYWdlQmVnaW5Bc3luYyhuZXcgVE1lc3NhZ2UobXNnLk5hbWUsIFRNZXNzYWdlVHlwZS5FeGNlcHRpb24sIG1zZy5TZXFJRCksIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IHguV3JpdGVBc3luYyhvcHJvdCwgY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuV3JpdGVNZXNzYWdlRW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuVHJhbnNwb3J0LkZsdXNoQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHRydWU7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IGZuKG1zZy5TZXFJRCwgaXByb3QsIG9wcm90LCBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJjYXRjaCAoSU9FeGNlcHRpb24pIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGZhbHNlOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gdHJ1ZTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKQorICAgIHsKKyAgICAgICAgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbl9hc3luYyhvdXQsIHRzZXJ2aWNlLCAqZl9pdGVyKTsKKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnMob3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pCit7CisgICAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOworICAgIHRfZmllbGQgc3VjY2Vzcyh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksICJzdWNjZXNzIiwgMCk7CisgICAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkKKyAgICB7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOworICAgIH0KKworICAgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikKKyAgICB7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoKmZfaXRlcik7CisgICAgfQorCisgICAgZ2VuZXJhdGVfbmV0Y29yZV9zdHJ1Y3RfZGVmaW5pdGlvbihvdXQsICZyZXN1bHQsIGZhbHNlLCB0cnVlLCB0cnVlKTsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uX2FzeW5jKG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKQoreworICAgICh2b2lkKXRzZXJ2aWNlOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGFzeW5jIFRhc2sgIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgPDwgIl9Qcm9jZXNzQXN5bmMoaW50IHNlcWlkLCBUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgc3RyaW5nIGFyZ3NuYW1lID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIkFyZ3MiOworICAgIHN0cmluZyByZXN1bHRuYW1lID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIlJlc3VsdCI7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInZhciBhcmdzID0gbmV3ICIgPDwgYXJnc25hbWUgPDwgIigpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgYXJncy5SZWFkQXN5bmMoaXByb3QsIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IGlwcm90LlJlYWRNZXNzYWdlRW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKworICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidmFyIHJlc3VsdCA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIigpOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRyeSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworCisgICAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0cnkiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICB9CisKKyAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAgIG91dCA8PCBpbmRlbnQoKTsKKyAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8ICJyZXN1bHQuU3VjY2VzcyA9ICI7CisgICAgfQorCisgICAgb3V0IDw8ICJhd2FpdCBfaUFzeW5jLiIgPDwgbm9ybWFsaXplX25hbWUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSA8PCAiQXN5bmMoIjsKKworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIHByZXBhcmVfbWVtYmVyX25hbWVfbWFwcGluZyhhcmdfc3RydWN0KTsKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikKKyAgICB7CisgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgeworICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCAiLCAiOworICAgICAgICB9CisKKyAgICAgICAgb3V0IDw8ICJhcmdzLiIgPDwgcHJvcF9uYW1lKCpmX2l0ZXIpOworICAgICAgICBpZiAobnVsbGFibGVfICYmICF0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCAiLlZhbHVlIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsZWFudXBfbWVtYmVyX25hbWVfbWFwcGluZyhhcmdfc3RydWN0KTsKKworICAgIGlmICghZmlyc3QpCisgICAgeworICAgICAgICBvdXQgPDwgIiwgIjsKKyAgICB9CisKKyAgICBvdXQgPDwgImNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisKKyAgICBwcmVwYXJlX21lbWJlcl9uYW1lX21hcHBpbmcoeHMsIHhzLT5nZXRfbWVtYmVycygpLCByZXN1bHRuYW1lKTsKKyAgICBpZiAoeGNlcHRpb25zLnNpemUoKSA+IDApCisgICAgeworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiY2F0Y2ggKCIgPDwgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlKSA8PCAiICIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisKKyAgICAgICAgICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJlc3VsdC4iIDw8IHByb3BfbmFtZSgqeF9pdGVyKSA8PCAiID0gIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuV3JpdGVNZXNzYWdlQmVnaW5Bc3luYyhuZXcgVE1lc3NhZ2UoXCIiCisgICAgICAgICAgICAgICAgPDwgY29ycmVjdF9mdW5jdGlvbl9uYW1lX2Zvcl9hc3luYyh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpIDw8ICJcIiwgVE1lc3NhZ2VUeXBlLlJlcGx5LCBzZXFpZCksIGNhbmNlbGxhdGlvblRva2VuKTsgIiA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgcmVzdWx0LldyaXRlQXN5bmMob3Byb3QsIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisKKyAgICBjbGVhbnVwX21lbWJlcl9uYW1lX21hcHBpbmcoeHMpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbikiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgdGhyb3c7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJjYXRjaCAoRXhjZXB0aW9uIGV4KSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiQ29uc29sZS5FcnJvci5Xcml0ZUxpbmUoXCJFcnJvciBvY2N1cnJlZCBpbiBwcm9jZXNzb3I6XCIpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiQ29uc29sZS5FcnJvci5Xcml0ZUxpbmUoZXguVG9TdHJpbmcoKSk7IiA8PCBlbmRsOworCisgICAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpCisgICAgeworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidmFyIHggPSBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkludGVybmFsRXJyb3IsXCIgSW50ZXJuYWwgZXJyb3IuXCIpOyIgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LldyaXRlTWVzc2FnZUJlZ2luQXN5bmMobmV3IFRNZXNzYWdlKFwiIiA8PCBjb3JyZWN0X2Z1bmN0aW9uX25hbWVfZm9yX2FzeW5jKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkKKyAgICAgICAgICAgIDw8ICJcIiwgVE1lc3NhZ2VUeXBlLkV4Y2VwdGlvbiwgc2VxaWQpLCBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgeC5Xcml0ZUFzeW5jKG9wcm90LCBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworCisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LldyaXRlTWVzc2FnZUVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCBvcHJvdC5UcmFuc3BvcnQuRmx1c2hBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbmV0Y29yZV91bmlvbl9yZWFkZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHVuaW9uKQoreworICAgIC8vIFRoYW5rcyB0byBUSFJJRlQtMTc2OCwgd2UgZG9uJ3QgbmVlZCB0byBjaGVjayBmb3IgcmVxdWlyZWQgZmllbGRzIGluIHRoZSB1bmlvbgorICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHR1bmlvbi0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBzdGF0aWMgYXN5bmMgVGFzazwiIDw8IHR1bmlvbi0+Z2V0X25hbWUoKSA8PCAiPiBSZWFkQXN5bmMoVFByb3RvY29sIGlwcm90LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaXByb3QuSW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0cnkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCB0dW5pb24tPmdldF9uYW1lKCkgPDwgIiByZXR2YWw7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgaXByb3QuUmVhZFN0cnVjdEJlZ2luQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIlRGaWVsZCBmaWVsZCA9IGF3YWl0IGlwcm90LlJlYWRGaWVsZEJlZ2luQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKyAgICAvLyB3ZSBjYW5ub3QgaGF2ZSB0aGUgZmlyc3QgZmllbGQgYmUgYSBzdG9wIC0tIHdlIG11c3QgaGF2ZSBhIHNpbmdsZSBmaWVsZCBkZWZpbmVkCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoZmllbGQuVHlwZSA9PSBUVHlwZS5TdG9wKSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChvdXQpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgaXByb3QuUmVhZEZpZWxkRW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHZhbCA9IG5ldyBfX191bmRlZmluZWQoKTsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihvdXQpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZWxzZSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChvdXQpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAic3dpdGNoIChmaWVsZC5JRCkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJjYXNlICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjoiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChmaWVsZC5UeXBlID09ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIikgeyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIgdGVtcDsiIDw8IGVuZGw7CisgICAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKCpmX2l0ZXIpLCAidGVtcCIsIHRydWUpOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHZhbCA9IG5ldyAiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKHRlbXApOyIgPDwgZW5kbDsKKworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7ICIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiIGF3YWl0IFRQcm90b2NvbFV0aWwuU2tpcEFzeW5jKGlwcm90LCBmaWVsZC5UeXBlLCBjYW5jZWxsYXRpb25Ub2tlbik7IgorICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR2YWwgPSBuZXcgX19fdW5kZWZpbmVkKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgIH0KKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZGVmYXVsdDogIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgVFByb3RvY29sVXRpbC5Ta2lwQXN5bmMoaXByb3QsIGZpZWxkLlR5cGUsIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgInJldHZhbCA9IG5ldyBfX191bmRlZmluZWQoKTsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKworICAgIHNjb3BlX2Rvd24ob3V0KTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgaXByb3QuUmVhZEZpZWxkRW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKChhd2FpdCBpcHJvdC5SZWFkRmllbGRCZWdpbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKSkuVHlwZSAhPSBUVHlwZS5TdG9wKSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChvdXQpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBKTsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihvdXQpOworCisgICAgLy8gZW5kIG9mIGVsc2UgZm9yIFRTdG9wCisgICAgc2NvcGVfZG93bihvdXQpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgaXByb3QuUmVhZFN0cnVjdEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gcmV0dmFsOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworCisgICAgc2NvcGVfZG93bihvdXQpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZmluYWxseSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChvdXQpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaXByb3QuRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihvdXQpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBwcmVmaXgsIGJvb2wgaXNfcHJvcGVydHlsZXNzKQoreworICAgIHRfdHlwZSogdHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKKyAgICB3aGlsZSAodHlwZS0+aXNfdHlwZWRlZigpKQorICAgIHsKKyAgICAgICAgdHlwZSA9IHN0YXRpY19jYXN0PHRfdHlwZWRlZio+KHR5cGUpLT5nZXRfdHlwZSgpOworICAgIH0KKworICAgIGlmICh0eXBlLT5pc192b2lkKCkpCisgICAgeworICAgICAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIERFU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgICB9CisKKyAgICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIChpc19wcm9wZXJ0eWxlc3MgPyAiIiA6IHByb3BfbmFtZSh0ZmllbGQpKTsKKworICAgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKQorICAgIHsKKyAgICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG91dCwgc3RhdGljX2Nhc3Q8dF9zdHJ1Y3QqPih0eXBlKSwgbmFtZSk7CisgICAgfQorICAgIGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKQorICAgIHsKKyAgICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbmFtZSk7CisgICAgfQorICAgIGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCBuYW1lIDw8ICIgPSAiOworCisgICAgICAgIGlmICh0eXBlLT5pc19lbnVtKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCAiKCIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlKSA8PCAiKSI7CisgICAgICAgIH0KKworICAgICAgICBvdXQgPDwgImF3YWl0IGlwcm90LiI7CisKKyAgICAgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKQorICAgICAgICB7CisgICAgICAgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gc3RhdGljX2Nhc3Q8dF9iYXNlX3R5cGUqPih0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgICAgICAgIHN3aXRjaCAodGJhc2UpCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgICAgICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0IDw8ICJSZWFkQmluYXJ5QXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG91dCA8PCAiUmVhZFN0cmluZ0FzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgICAgICAgICBvdXQgPDwgIlJlYWRCb29sQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICAgICAgICAgIG91dCA8PCAiUmVhZEJ5dGVBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICAgICAgICAgIG91dCA8PCAiUmVhZEkxNkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgICAgICAgICAgb3V0IDw8ICJSZWFkSTMyQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgICAgICAgICBvdXQgPDwgIlJlYWRJNjRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICAgICAgICAgIG91dCA8PCAiUmVhZERvdWJsZUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEMjIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCAiUmVhZEkzMkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiOworICAgICAgICB9CisgICAgICAgIG91dCA8PCBlbmRsOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBERVNFUklBTElaRSBGSUVMRCAnJXMnIFRZUEUgJyVzJ1xuIiwgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksIHR5cGVfbmFtZSh0eXBlKS5jX3N0cigpKTsKKyAgICB9Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcmVmaXgpCit7CisgICAgaWYgKHVuaW9uXyAmJiB0c3RydWN0LT5pc191bmlvbigpKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gYXdhaXQgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIi5SZWFkQXN5bmMoaXByb3QsIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiKCk7IiA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgIiA8PCBwcmVmaXggPDwgIi5SZWFkQXN5bmMoaXByb3QsIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisgICAgfQorfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgpCit7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgc3RyaW5nIG9iajsKKworICAgIGlmICh0dHlwZS0+aXNfbWFwKCkpCisgICAgeworICAgICAgICBvYmogPSB0bXAoIl9tYXAiKTsKKyAgICB9CisgICAgZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKQorICAgIHsKKyAgICAgICAgb2JqID0gdG1wKCJfc2V0Iik7CisgICAgfQorICAgIGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpCisgICAgeworICAgICAgICBvYmogPSB0bXAoIl9saXN0Iik7CisgICAgfQorCisgICAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKKyAgICBpZiAodHR5cGUtPmlzX21hcCgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJUTWFwICIgPDwgb2JqIDw8ICIgPSBhd2FpdCBpcHJvdC5SZWFkTWFwQmVnaW5Bc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworICAgIH0KKyAgICBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIlRTZXQgIiA8PCBvYmogPDwgIiA9IGF3YWl0IGlwcm90LlJlYWRTZXRCZWdpbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisgICAgfQorICAgIGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIlRMaXN0ICIgPDwgb2JqIDw8ICIgPSBhd2FpdCBpcHJvdC5SZWFkTGlzdEJlZ2luQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBzdHJpbmcgaSA9IHRtcCgiX2kiKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImZvcihpbnQgIiA8PCBpIDw8ICIgPSAwOyAiIDw8IGkgPDwgIiA8ICIgPDwgb2JqIDw8ICIuQ291bnQ7ICsrIiA8PCBpIDw8ICIpIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgaWYgKHR0eXBlLT5pc19tYXAoKSkKKyAgICB7CisgICAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgc3RhdGljX2Nhc3Q8dF9tYXAqPih0dHlwZSksIHByZWZpeCk7CisgICAgfQorICAgIGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkKKyAgICB7CisgICAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgc3RhdGljX2Nhc3Q8dF9zZXQqPih0dHlwZSksIHByZWZpeCk7CisgICAgfQorICAgIGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpCisgICAgeworICAgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCBzdGF0aWNfY2FzdDx0X2xpc3QqPih0dHlwZSksIHByZWZpeCk7CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgICBpZiAodHR5cGUtPmlzX21hcCgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhd2FpdCBpcHJvdC5SZWFkTWFwRW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKyAgICB9CisgICAgZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhd2FpdCBpcHJvdC5SZWFkU2V0RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKyAgICB9CisgICAgZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgaXByb3QuUmVhZExpc3RFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0cmluZyBwcmVmaXgpCit7CisgICAgc3RyaW5nIGtleSA9IHRtcCgiX2tleSIpOworICAgIHN0cmluZyB2YWwgPSB0bXAoIl92YWwiKTsKKworICAgIHRfZmllbGQgZmtleSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KTsKKyAgICB0X2ZpZWxkIGZ2YWwodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZhbCk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgZGVjbGFyZV9maWVsZCgmZmtleSkgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgZGVjbGFyZV9maWVsZCgmZnZhbCkgPDwgZW5kbDsKKworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZrZXkpOworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZ2YWwpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiWyIgPDwga2V5IDw8ICJdID0gIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIHByZWZpeCkKK3sKKyAgICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKKyAgICB0X2ZpZWxkIGZlbGVtKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgZGVjbGFyZV9maWVsZCgmZmVsZW0pIDw8IGVuZGw7CisKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIuQWRkKCIgPDwgZWxlbSA8PCAiKTsiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RyaW5nIHByZWZpeCkKK3sKKyAgICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKKyAgICB0X2ZpZWxkIGZlbGVtKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8IGRlY2xhcmVfZmllbGQoJmZlbGVtKSA8PCBlbmRsOworCisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiLkFkZCgiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RyaW5nIHByZWZpeCwgYm9vbCBpc19lbGVtZW50LCBib29sIGlzX3Byb3BlcnR5bGVzcykKK3sKKyAgICB0X3R5cGUqIHR5cGUgPSB0ZmllbGQtPmdldF90eXBlKCk7CisgICAgd2hpbGUgKHR5cGUtPmlzX3R5cGVkZWYoKSkKKyAgICB7CisgICAgICAgIHR5cGUgPSBzdGF0aWNfY2FzdDx0X3R5cGVkZWYqPih0eXBlKS0+Z2V0X3R5cGUoKTsKKyAgICB9CisKKyAgICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIChpc19wcm9wZXJ0eWxlc3MgPyAiIiA6IHByb3BfbmFtZSh0ZmllbGQpKTsKKworICAgIGlmICh0eXBlLT5pc192b2lkKCkpCisgICAgeworICAgICAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIFNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBuYW1lOworICAgIH0KKworICAgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKQorICAgIHsKKyAgICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsIHN0YXRpY19jYXN0PHRfc3RydWN0Kj4odHlwZSksIG5hbWUpOworICAgIH0KKyAgICBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkKKyAgICB7CisgICAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lKTsKKyAgICB9CisgICAgZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhd2FpdCBvcHJvdC4iOworCisgICAgICAgIHN0cmluZyBudWxsYWJsZV9uYW1lID0gbnVsbGFibGVfICYmICFpc19lbGVtZW50ICYmICFmaWVsZF9pc19yZXF1aXJlZCh0ZmllbGQpID8gbmFtZSArICIuVmFsdWUiIDogbmFtZTsKKworICAgICAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSBzdGF0aWNfY2FzdDx0X2Jhc2VfdHlwZSo+KHR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgICAgICAgc3dpdGNoICh0YmFzZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CisgICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgICAgICAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvdXQgPDwgIldyaXRlQmluYXJ5QXN5bmMoIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0IDw8ICJXcml0ZVN0cmluZ0FzeW5jKCI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG91dCA8PCBuYW1lIDw8ICIsIGNhbmNlbGxhdGlvblRva2VuKTsiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICAgICAgICAgIG91dCA8PCAiV3JpdGVCb29sQXN5bmMoIiA8PCBudWxsYWJsZV9uYW1lIDw8ICIsIGNhbmNlbGxhdGlvblRva2VuKTsiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgICAgICAgICBvdXQgPDwgIldyaXRlQnl0ZUFzeW5jKCIgPDwgbnVsbGFibGVfbmFtZSA8PCAiLCBjYW5jZWxsYXRpb25Ub2tlbik7IjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICAgICAgICAgIG91dCA8PCAiV3JpdGVJMTZBc3luYygiIDw8IG51bGxhYmxlX25hbWUgPDwgIiwgY2FuY2VsbGF0aW9uVG9rZW4pOyI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgICAgICAgICBvdXQgPDwgIldyaXRlSTMyQXN5bmMoIiA8PCBudWxsYWJsZV9uYW1lIDw8ICIsIGNhbmNlbGxhdGlvblRva2VuKTsiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgICAgICAgICAgb3V0IDw8ICJXcml0ZUk2NEFzeW5jKCIgPDwgbnVsbGFibGVfbmFtZSA8PCAiLCBjYW5jZWxsYXRpb25Ub2tlbik7IjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICAgICAgICAgIG91dCA8PCAiV3JpdGVEb3VibGVBc3luYygiIDw8IG51bGxhYmxlX25hbWUgPDwgIiwgY2FuY2VsbGF0aW9uVG9rZW4pOyI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gQyMgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8ICJXcml0ZUkzMkFzeW5jKChpbnQpIiA8PCBudWxsYWJsZV9uYW1lIDw8ICIsIGNhbmNlbGxhdGlvblRva2VuKTsiOworICAgICAgICB9CisgICAgICAgIG91dCA8PCBlbmRsOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgJyVzJXMnIFRZUEUgJyVzJ1xuIiwgcHJlZml4LmNfc3RyKCksIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLCB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7CisgICAgfQorfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCkKK3sKKyAgICAodm9pZCl0c3RydWN0OworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgIiA8PCBwcmVmaXggPDwgIi5Xcml0ZUFzeW5jKG9wcm90LCBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4KQoreworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGlmICh0dHlwZS0+aXNfbWFwKCkpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LldyaXRlTWFwQmVnaW5Bc3luYyhuZXcgVE1hcCgiIDw8IHR5cGVfdG9fZW51bShzdGF0aWNfY2FzdDx0X21hcCo+KHR0eXBlKS0+Z2V0X2tleV90eXBlKCkpCisgICAgICAgICAgICA8PCAiLCAiIDw8IHR5cGVfdG9fZW51bShzdGF0aWNfY2FzdDx0X21hcCo+KHR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpIDw8ICIsICIgPDwgcHJlZml4CisgICAgICAgICAgICA8PCAiLkNvdW50KSwgY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKyAgICB9CisgICAgZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhd2FpdCBvcHJvdC5Xcml0ZVNldEJlZ2luQXN5bmMobmV3IFRTZXQoIiA8PCB0eXBlX3RvX2VudW0oc3RhdGljX2Nhc3Q8dF9zZXQqPih0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkKKyAgICAgICAgICAgIDw8ICIsICIgPDwgcHJlZml4IDw8ICIuQ291bnQpLCBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworICAgIH0KKyAgICBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhd2FpdCBvcHJvdC5Xcml0ZUxpc3RCZWdpbkFzeW5jKG5ldyBUTGlzdCgiCisgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oc3RhdGljX2Nhc3Q8dF9saXN0Kj4odHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIgPDwgcHJlZml4IDw8ICIuQ291bnQpLCBjYW5jZWxsYXRpb25Ub2tlbik7IgorICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB9CisKKyAgICBzdHJpbmcgaXRlciA9IHRtcCgiX2l0ZXIiKTsKKyAgICBpZiAodHR5cGUtPmlzX21hcCgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJmb3JlYWNoICgiIDw8IHR5cGVfbmFtZShzdGF0aWNfY2FzdDx0X21hcCo+KHR0eXBlKS0+Z2V0X2tleV90eXBlKCkpIDw8ICIgIiA8PCBpdGVyCisgICAgICAgICAgICA8PCAiIGluICIgPDwgcHJlZml4IDw8ICIuS2V5cykiOworICAgIH0KKyAgICBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImZvcmVhY2ggKCIgPDwgdHlwZV9uYW1lKHN0YXRpY19jYXN0PHRfc2V0Kj4odHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIgIiA8PCBpdGVyCisgICAgICAgICAgICA8PCAiIGluICIgPDwgcHJlZml4IDw8ICIpIjsKKyAgICB9CisgICAgZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZm9yZWFjaCAoIiA8PCB0eXBlX25hbWUoc3RhdGljX2Nhc3Q8dF9saXN0Kj4odHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIgIiA8PCBpdGVyCisgICAgICAgICAgICA8PCAiIGluICIgPDwgcHJlZml4IDw8ICIpIjsKKyAgICB9CisKKyAgICBvdXQgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBpZiAodHR5cGUtPmlzX21hcCgpKQorICAgIHsKKyAgICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgc3RhdGljX2Nhc3Q8dF9tYXAqPih0dHlwZSksIGl0ZXIsIHByZWZpeCk7CisgICAgfQorICAgIGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkKKyAgICB7CisgICAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsIHN0YXRpY19jYXN0PHRfc2V0Kj4odHR5cGUpLCBpdGVyKTsKKyAgICB9CisgICAgZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkKKyAgICB7CisgICAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCBzdGF0aWNfY2FzdDx0X2xpc3QqPih0dHlwZSksIGl0ZXIpOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgICAgaWYgKHR0eXBlLT5pc19tYXAoKSkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuV3JpdGVNYXBFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworICAgIH0KKyAgICBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LldyaXRlU2V0RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKyAgICB9CisgICAgZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuV3JpdGVMaXN0RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RyaW5nIGl0ZXIsIHN0cmluZyBtYXApCit7CisgICAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksIGl0ZXIpOworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZrZmllbGQsICIiLCB0cnVlKTsKKyAgICB0X2ZpZWxkIHZmaWVsZCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgbWFwICsgIlsiICsgaXRlciArICJdIik7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJnZmaWVsZCwgIiIsIHRydWUpOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgaXRlcikKK3sKKyAgICB0X2ZpZWxkIGVmaWVsZCh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiLCB0cnVlKTsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RyaW5nIGl0ZXIpCit7CisgICAgdF9maWVsZCBlZmllbGQodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIsIHRydWUpOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb3BlcnR5KG9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBib29sIGlzUHVibGljLCBib29sIGdlbmVyYXRlSXNzZXQpCit7CisgICAgZ2VuZXJhdGVfbmV0Y29yZV9wcm9wZXJ0eShvdXQsIHRmaWVsZCwgaXNQdWJsaWMsIGdlbmVyYXRlSXNzZXQsICJfIik7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbmV0Y29yZV9wcm9wZXJ0eShvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpc1B1YmxpYywgYm9vbCBnZW5lcmF0ZUlzc2V0LCBzdHJpbmcgZmllbGRQcmVmaXgpCit7CisgICAgaWYgKChzZXJpYWxpemVfIHx8IHdjZl8pICYmIGlzUHVibGljKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJbRGF0YU1lbWJlcihPcmRlciA9IDApXSIgPDwgZW5kbDsKKyAgICB9CisgICAgYm9vbCBoYXNfZGVmYXVsdCA9IGZpZWxkX2hhc19kZWZhdWx0KHRmaWVsZCk7CisgICAgYm9vbCBpc19yZXF1aXJlZCA9IGZpZWxkX2lzX3JlcXVpcmVkKHRmaWVsZCk7CisgICAgaWYgKChudWxsYWJsZV8gJiYgIWhhc19kZWZhdWx0KSB8fCBpc19yZXF1aXJlZCkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAoaXNQdWJsaWMgPyAicHVibGljICIgOiAicHJpdmF0ZSAiKSA8PCB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UsIHRydWUsIGlzX3JlcXVpcmVkKSA8PCAiICIgPDwgcHJvcF9uYW1lKHRmaWVsZCkgPDwgIiB7IGdldDsgc2V0OyB9IiA8PCBlbmRsOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgKGlzUHVibGljID8gInB1YmxpYyAiIDogInByaXZhdGUgIikgIDw8IHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCksIGZhbHNlLCBmYWxzZSwgdHJ1ZSkgPDwgIiAiIDw8IHByb3BfbmFtZSh0ZmllbGQpIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImdldCIgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworCisgICAgICAgIGJvb2wgdXNlX251bGxhYmxlID0gZmFsc2U7CisgICAgICAgIGlmIChudWxsYWJsZV8pCisgICAgICAgIHsKKyAgICAgICAgICAgIHRfdHlwZSogdHR5cGUgPSB0ZmllbGQtPmdldF90eXBlKCk7CisgICAgICAgICAgICB3aGlsZSAodHR5cGUtPmlzX3R5cGVkZWYoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0dHlwZSA9IHN0YXRpY19jYXN0PHRfdHlwZWRlZio+KHR0eXBlKS0+Z2V0X3R5cGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdXNlX251bGxhYmxlID0gc3RhdGljX2Nhc3Q8dF9iYXNlX3R5cGUqPih0dHlwZSktPmdldF9iYXNlKCkgIT0gdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gIiA8PCBmaWVsZFByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAic2V0IiA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgICAgaWYgKHVzZV9udWxsYWJsZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGdlbmVyYXRlSXNzZXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJfX2lzc2V0LiIgPDwgbm9ybWFsaXplX25hbWUodGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiID0gdmFsdWUuSGFzVmFsdWU7IiA8PCBlbmRsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAodmFsdWUuSGFzVmFsdWUpIHRoaXMuIiA8PCBmaWVsZFByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiID0gdmFsdWUuVmFsdWU7IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGdlbmVyYXRlSXNzZXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJfX2lzc2V0LiIgPDwgbm9ybWFsaXplX25hbWUodGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiID0gdHJ1ZTsiIDw8IGVuZGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRoaXMuIiA8PCBmaWVsZFByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiID0gdmFsdWU7IiA8PCBlbmRsOworICAgICAgICB9CisKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICAgIG91dCA8PCBlbmRsOworfQorCitzdHJpbmcgdF9uZXRjb3JlX2dlbmVyYXRvcjo6bWFrZV92YWxpZF9jc2hhcnBfaWRlbnRpZmllcihzdHJpbmcgY29uc3QmIGZyb21OYW1lKQoreworICAgIHN0cmluZyBzdHIgPSBmcm9tTmFtZTsKKyAgICBpZiAoc3RyLmVtcHR5KCkpCisgICAgeworICAgICAgICByZXR1cm4gc3RyOworICAgIH0KKworICAgIC8vIHRlc3RzIHJlbHkgb24gdGhpcworICAgIGFzc2VydCgoJ0EnIDwgJ1onKSAmJiAoJ2EnIDwgJ3onKSAmJiAoJzAnIDwgJzknKSk7CisKKyAgICAvLyBpZiB0aGUgZmlyc3QgbGV0dGVyIGlzIGEgbnVtYmVyLCB3ZSBhZGQgYW4gYWRkaXRpb25hbCB1bmRlcnNjb3JlIGluIGZyb250IG9mIGl0CisgICAgY2hhciBjID0gc3RyLmF0KDApOworICAgIGlmICgoJzAnIDw9IGMpICYmIChjIDw9ICc5JykpCisgICAgeworICAgICAgICBzdHIgPSAiXyIgKyBzdHI7CisgICAgfQorCisgICAgLy8gZm9sbG93aW5nIGNoYXJzOiBsZXR0ZXIsIG51bWJlciBvciB1bmRlcnNjb3JlCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdHIuc2l6ZSgpOyArK2kpCisgICAgeworICAgICAgICBjID0gc3RyLmF0KGkpOworICAgICAgICBpZiAoKCdBJyA+IGMgfHwgYyA+ICdaJykgJiYgKCdhJyA+IGMgfHwgYyA+ICd6JykgJiYgKCcwJyA+IGMgfHwgYyA+ICc5JykgJiYgJ18nICE9IGMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0ci5yZXBsYWNlKGksIDEsICJfIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc3RyOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmNsZWFudXBfbWVtYmVyX25hbWVfbWFwcGluZyh2b2lkKiBzY29wZSkKK3sKKyAgICBpZiAobWVtYmVyX21hcHBpbmdfc2NvcGVzLmVtcHR5KCkpCisgICAgeworICAgICAgICB0aHJvdyAiaW50ZXJuYWwgZXJyb3I6IGNsZWFudXBfbWVtYmVyX25hbWVfbWFwcGluZygpIG5vIHNjb3BlIGFjdGl2ZSI7CisgICAgfQorCisgICAgbWVtYmVyX21hcHBpbmdfc2NvcGUmIGFjdGl2ZSA9IG1lbWJlcl9tYXBwaW5nX3Njb3Blcy5iYWNrKCk7CisgICAgaWYgKGFjdGl2ZS5zY29wZV9tZW1iZXIgIT0gc2NvcGUpCisgICAgeworICAgICAgICB0aHJvdyAiaW50ZXJuYWwgZXJyb3I6IGNsZWFudXBfbWVtYmVyX25hbWVfbWFwcGluZygpIGNhbGxlZCBmb3Igd3Jvbmcgc3RydWN0IjsKKyAgICB9CisKKyAgICBtZW1iZXJfbWFwcGluZ19zY29wZXMucG9wX2JhY2soKTsKK30KKworc3RyaW5nIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdldF9tYXBwZWRfbWVtYmVyX25hbWUoc3RyaW5nIG5hbWUpCit7CisgICAgaWYgKCFtZW1iZXJfbWFwcGluZ19zY29wZXMuZW1wdHkoKSkKKyAgICB7CisgICAgICAgIG1lbWJlcl9tYXBwaW5nX3Njb3BlJiBhY3RpdmUgPSBtZW1iZXJfbWFwcGluZ19zY29wZXMuYmFjaygpOworICAgICAgICBtYXA8c3RyaW5nLCBzdHJpbmc+OjppdGVyYXRvciBpdGVyID0gYWN0aXZlLm1hcHBpbmdfdGFibGUuZmluZChuYW1lKTsKKyAgICAgICAgaWYgKGFjdGl2ZS5tYXBwaW5nX3RhYmxlLmVuZCgpICE9IGl0ZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBpdGVyLT5zZWNvbmQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdmVyYm9zZSgibm8gbWFwcGluZyBmb3IgbWVtYmVyICVzXG4iLCBuYW1lLmNfc3RyKCkpOworICAgIHJldHVybiBuYW1lOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OnByZXBhcmVfbWVtYmVyX25hbWVfbWFwcGluZyh0X3N0cnVjdCogdHN0cnVjdCkKK3sKKyAgICBwcmVwYXJlX21lbWJlcl9uYW1lX21hcHBpbmcodHN0cnVjdCwgdHN0cnVjdC0+Z2V0X21lbWJlcnMoKSwgdHN0cnVjdC0+Z2V0X25hbWUoKSk7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6cHJlcGFyZV9tZW1iZXJfbmFtZV9tYXBwaW5nKHZvaWQqIHNjb3BlLCBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzLCBjb25zdCBzdHJpbmcmIHN0cnVjdG5hbWUpCit7CisgICAgLy8gYmVnaW4gbmV3IHNjb3BlCisgICAgbWVtYmVyX21hcHBpbmdfc2NvcGVzLnB1c2hfYmFjayhtZW1iZXJfbWFwcGluZ19zY29wZSgpKTsKKyAgICBtZW1iZXJfbWFwcGluZ19zY29wZSYgYWN0aXZlID0gbWVtYmVyX21hcHBpbmdfc2NvcGVzLmJhY2soKTsKKyAgICBhY3RpdmUuc2NvcGVfbWVtYmVyID0gc2NvcGU7CisKKyAgICAvLyBjdXJyZW50IEMjIGdlbmVyYXRvciBwb2xpY3k6CisgICAgLy8gLSBwcm9wIG5hbWVzIGFyZSBhbHdheXMgcmVuZGVyZWQgd2l0aCBhbiBVcHBlcmNhc2UgZmlyc3QgbGV0dGVyCisgICAgLy8gLSBzdHJ1Y3QgbmFtZXMgYXJlIHVzZWQgYXMgZ2l2ZW4KKyAgICBzdGQ6OnNldDxzdHJpbmc+IHVzZWRfbWVtYmVyX25hbWVzOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7CisKKyAgICAvLyBwcmV2ZW50IG5hbWUgY29uZmxpY3RzIHdpdGggc3RydWN0IChDUzA1NDIgZXJyb3IpCisgICAgdXNlZF9tZW1iZXJfbmFtZXMuaW5zZXJ0KHN0cnVjdG5hbWUpOworCisgICAgLy8gcHJldmVudCBuYW1lIGNvbmZsaWN0cyB3aXRoIGtub3duIG1ldGhvZHMgKFRIUklGVC0yOTQyKQorICAgIHVzZWRfbWVtYmVyX25hbWVzLmluc2VydCgiUmVhZCIpOworICAgIHVzZWRfbWVtYmVyX25hbWVzLmluc2VydCgiV3JpdGUiKTsKKworICAgIGZvciAoaXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgaXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK2l0ZXIpCisgICAgeworICAgICAgICBzdHJpbmcgb2xkbmFtZSA9ICgqaXRlciktPmdldF9uYW1lKCk7CisgICAgICAgIHN0cmluZyBuZXduYW1lID0gcHJvcF9uYW1lKCppdGVyLCB0cnVlKTsKKyAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIG5ldyBuYW1lIGNvbmZsaWN0cyB3aXRoIGFub3RoZXIgbWVtYmVyCisgICAgICAgICAgICBpZiAodXNlZF9tZW1iZXJfbmFtZXMuZmluZChuZXduYW1lKSAhPSB1c2VkX21lbWJlcl9uYW1lcy5lbmQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwdmVyYm9zZSgic3RydWN0ICVzOiBtZW1iZXIgJXMgY29uZmxpY3RzIHdpdGggYW5vdGhlciBtZW1iZXJcbiIsIHN0cnVjdG5hbWUuY19zdHIoKSwgbmV3bmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBuZXduYW1lICs9ICdfJzsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gYWRkIGFsd2F5cywgdGhpcyBoZWxwcyB1cyB0byBkZXRlY3QgZWRnZSBjYXNlcyBsaWtlCisgICAgICAgICAgICAvLyBkaWZmZXJlbnQgc3BlbGxpbmdzICgiZm9vIiBhbmQgIkZvbyIpIHdpdGhpbiB0aGUgc2FtZSBzdHJ1Y3QKKyAgICAgICAgICAgIHB2ZXJib3NlKCJzdHJ1Y3QgJXM6IG1lbWJlciBtYXBwaW5nICVzID0+ICVzXG4iLCBzdHJ1Y3RuYW1lLmNfc3RyKCksIG9sZG5hbWUuY19zdHIoKSwgbmV3bmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgIGFjdGl2ZS5tYXBwaW5nX3RhYmxlW29sZG5hbWVdID0gbmV3bmFtZTsKKyAgICAgICAgICAgIHVzZWRfbWVtYmVyX25hbWVzLmluc2VydChuZXduYW1lKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCitzdHJpbmcgdF9uZXRjb3JlX2dlbmVyYXRvcjo6cHJvcF9uYW1lKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBzdXBwcmVzc19tYXBwaW5nKQoreworICAgIHN0cmluZyBuYW1lKHRmaWVsZC0+Z2V0X25hbWUoKSk7CisgICAgaWYgKHN1cHByZXNzX21hcHBpbmcpCisgICAgeworICAgICAgICBuYW1lWzBdID0gdG91cHBlcihuYW1lWzBdKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgbmFtZSA9IGdldF9tYXBwZWRfbWVtYmVyX25hbWUobmFtZSk7CisgICAgfQorICAgIHJldHVybiBuYW1lOworfQorCitzdHJpbmcgdF9uZXRjb3JlX2dlbmVyYXRvcjo6dHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsIGJvb2wgaW5fY29udGFpbmVyLCBib29sIGluX2luaXQsIGJvb2wgaW5fcGFyYW0sIGJvb2wgaXNfcmVxdWlyZWQpCit7CisgICAgKHZvaWQpaW5faW5pdDsKKworICAgIHdoaWxlICh0dHlwZS0+aXNfdHlwZWRlZigpKQorICAgIHsKKyAgICAgICAgdHR5cGUgPSBzdGF0aWNfY2FzdDx0X3R5cGVkZWYqPih0dHlwZSktPmdldF90eXBlKCk7CisgICAgfQorCisgICAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBiYXNlX3R5cGVfbmFtZShzdGF0aWNfY2FzdDx0X2Jhc2VfdHlwZSo+KHR0eXBlKSwgaW5fY29udGFpbmVyLCBpbl9wYXJhbSwgaXNfcmVxdWlyZWQpOworICAgIH0KKworICAgIGlmICh0dHlwZS0+aXNfbWFwKCkpCisgICAgeworICAgICAgICB0X21hcCogdG1hcCA9IHN0YXRpY19jYXN0PHRfbWFwKj4odHR5cGUpOworICAgICAgICByZXR1cm4gIkRpY3Rpb25hcnk8IiArIHR5cGVfbmFtZSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwgdHJ1ZSkgKyAiLCAiICsgdHlwZV9uYW1lKHRtYXAtPmdldF92YWxfdHlwZSgpLCB0cnVlKSArICI+IjsKKyAgICB9CisKKyAgICBpZiAodHR5cGUtPmlzX3NldCgpKQorICAgIHsKKyAgICAgICAgdF9zZXQqIHRzZXQgPSBzdGF0aWNfY2FzdDx0X3NldCo+KHR0eXBlKTsKKyAgICAgICAgcmV0dXJuICJUSGFzaFNldDwiICsgdHlwZV9uYW1lKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgdHJ1ZSkgKyAiPiI7CisgICAgfQorCisgICAgaWYgKHR0eXBlLT5pc19saXN0KCkpCisgICAgeworICAgICAgICB0X2xpc3QqIHRsaXN0ID0gc3RhdGljX2Nhc3Q8dF9saXN0Kj4odHR5cGUpOworICAgICAgICByZXR1cm4gIkxpc3Q8IiArIHR5cGVfbmFtZSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCB0cnVlKSArICI+IjsKKyAgICB9CisKKyAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKTsKKyAgICBzdHJpbmcgcG9zdGZpeCA9ICghaXNfcmVxdWlyZWQgJiYgbnVsbGFibGVfICYmIGluX3BhcmFtICYmIHR0eXBlLT5pc19lbnVtKCkpID8gIj8iIDogIiI7CisgICAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKQorICAgIHsKKyAgICAgICAgc3RyaW5nIG5zID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgibmV0Y29yZSIpOworICAgICAgICBpZiAoIW5zLmVtcHR5KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBucyArICIuIiArIG5vcm1hbGl6ZV9uYW1lKHR0eXBlLT5nZXRfbmFtZSgpKSArIHBvc3RmaXg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbm9ybWFsaXplX25hbWUodHR5cGUtPmdldF9uYW1lKCkpICsgcG9zdGZpeDsKK30KKworc3RyaW5nIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlKiB0YmFzZSwgYm9vbCBpbl9jb250YWluZXIsIGJvb2wgaW5fcGFyYW0sIGJvb2wgaXNfcmVxdWlyZWQpCit7CisgICAgKHZvaWQpaW5fY29udGFpbmVyOworICAgIHN0cmluZyBwb3N0Zml4ID0gKCFpc19yZXF1aXJlZCAmJiBudWxsYWJsZV8gJiYgaW5fcGFyYW0pID8gIj8iIDogIiI7CisgICAgc3dpdGNoICh0YmFzZS0+Z2V0X2Jhc2UoKSkKKyAgICB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICByZXR1cm4gInZvaWQiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAodGJhc2UtPmlzX2JpbmFyeSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAiYnl0ZVtdIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAic3RyaW5nIjsKKyAgICAgICAgfQorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgcmV0dXJuICJib29sIiArIHBvc3RmaXg7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgcmV0dXJuICJzYnl0ZSIgKyBwb3N0Zml4OworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICByZXR1cm4gInNob3J0IiArIHBvc3RmaXg7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgIHJldHVybiAiaW50IiArIHBvc3RmaXg7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIHJldHVybiAibG9uZyIgKyBwb3N0Zml4OworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICByZXR1cm4gImRvdWJsZSIgKyBwb3N0Zml4OworICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gQyMgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UtPmdldF9iYXNlKCkpOworICAgIH0KK30KKworc3RyaW5nIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluaXQsIHN0cmluZyBwcmVmaXgpCit7CisgICAgc3RyaW5nIHJlc3VsdCA9IHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCkpICsgIiAiICsgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICAgIGlmIChpbml0KQorICAgIHsKKyAgICAgICAgdF90eXBlKiB0dHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKKyAgICAgICAgd2hpbGUgKHR0eXBlLT5pc190eXBlZGVmKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHR0eXBlID0gc3RhdGljX2Nhc3Q8dF90eXBlZGVmKj4odHR5cGUpLT5nZXRfdHlwZSgpOworICAgICAgICB9CisgICAgICAgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgZmllbGRfaGFzX2RlZmF1bHQodGZpZWxkKSkKKyAgICAgICAgeworICAgICAgICAgICAgc3RkOjpvZnN0cmVhbSBkdW1teTsKKyAgICAgICAgICAgIHJlc3VsdCArPSAiID0gIiArIHJlbmRlcl9jb25zdF92YWx1ZShkdW1teSwgdGZpZWxkLT5nZXRfbmFtZSgpLCB0dHlwZSwgdGZpZWxkLT5nZXRfdmFsdWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKQorICAgICAgICB7CisgICAgICAgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gc3RhdGljX2Nhc3Q8dF9iYXNlX3R5cGUqPih0dHlwZSktPmdldF9iYXNlKCk7CisgICAgICAgICAgICBzd2l0Y2ggKHRiYXNlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICAgICAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKKyAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICAgICAgICAgIHJlc3VsdCArPSAiID0gbnVsbCI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICIgPSBmYWxzZSI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICAgICAgICAgIHJlc3VsdCArPSAiID0gMCI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgICAgICAgICByZXN1bHQgKz0gIiA9IChkb3VibGUpMCI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ICs9ICIgPSAoIiArIHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpICsgIikwIjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh0dHlwZS0+aXNfY29udGFpbmVyKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCArPSAiID0gbmV3ICIgKyB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlKSArICIoKSI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgKz0gIiA9IG5ldyAiICsgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSkgKyAiKCkiOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQgKyAiOyI7Cit9CisKK3N0cmluZyB0X25ldGNvcmVfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdHJpbmcgcHJlZml4KQoreworICAgIHRfdHlwZSogdHR5cGUgPSB0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCk7CisgICAgcmV0dXJuIHR5cGVfbmFtZSh0dHlwZSkgKyAiICIgKyBub3JtYWxpemVfbmFtZShwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkpICsgIigiICsgYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpICsgIikiOworfQorCitzdHJpbmcgdF9uZXRjb3JlX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlX2FzeW5jKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RyaW5nIHByZWZpeCkKK3sKKyAgICB0X3R5cGUqIHR0eXBlID0gdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpOworICAgIHN0cmluZyB0YXNrID0gIlRhc2siOworICAgIGlmICghdHR5cGUtPmlzX3ZvaWQoKSkKKyAgICB7CisgICAgICAgIHRhc2sgKz0gIjwiICsgdHlwZV9uYW1lKHR0eXBlKSArICI+IjsKKyAgICB9CisKKyAgICBzdHJpbmcgcmVzdWx0ID0gdGFzayArICIgIiArIG5vcm1hbGl6ZV9uYW1lKHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgKyAiQXN5bmMoIjsKKyAgICBzdHJpbmcgYXJncyA9IGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKTsKKyAgICByZXN1bHQgKz0gYXJnczsKKyAgICBpZiAoIWFyZ3MuZW1wdHkoKSkKKyAgICB7CisgICAgICAgIHJlc3VsdCArPSAiLCAiOworICAgIH0KKyAgICByZXN1bHQgKz0gIkNhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKSI7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdHJpbmcgdF9uZXRjb3JlX2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCkKK3sKKyAgICBzdHJpbmcgcmVzdWx0ID0gIiI7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpCisgICAgeworICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgKz0gIiwgIjsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQgKz0gdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgKyAiICIgKyBub3JtYWxpemVfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdHJpbmcgdF9uZXRjb3JlX2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkKK3sKKyAgICB3aGlsZSAodHlwZS0+aXNfdHlwZWRlZigpKQorICAgIHsKKyAgICAgICAgdHlwZSA9IHN0YXRpY19jYXN0PHRfdHlwZWRlZio+KHR5cGUpLT5nZXRfdHlwZSgpOworICAgIH0KKworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkKKyAgICB7CisgICAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSBzdGF0aWNfY2FzdDx0X2Jhc2VfdHlwZSo+KHR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgICBzd2l0Y2ggKHRiYXNlKQorICAgICAgICB7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgICAgICByZXR1cm4gIlRUeXBlLlN0cmluZyI7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgICAgIHJldHVybiAiVFR5cGUuQm9vbCI7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgICAgICByZXR1cm4gIlRUeXBlLkJ5dGUiOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgICAgIHJldHVybiAiVFR5cGUuSTE2IjsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgICAgICByZXR1cm4gIlRUeXBlLkkzMiI7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICAgICAgcmV0dXJuICJUVHlwZS5JNjQiOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgICAgIHJldHVybiAiVFR5cGUuRG91YmxlIjsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpCisgICAgeworICAgICAgICByZXR1cm4gIlRUeXBlLkkzMiI7CisgICAgfQorICAgIGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpCisgICAgeworICAgICAgICByZXR1cm4gIlRUeXBlLlN0cnVjdCI7CisgICAgfQorICAgIGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuICJUVHlwZS5NYXAiOworICAgIH0KKyAgICBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkKKyAgICB7CisgICAgICAgIHJldHVybiAiVFR5cGUuU2V0IjsKKyAgICB9CisgICAgZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuICJUVHlwZS5MaXN0IjsKKyAgICB9CisKKyAgICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbmV0Y29yZV9kb2NzdHJpbmdfY29tbWVudChvc3RyZWFtJiBvdXQsIHN0cmluZyBjb250ZW50cykKK3sKKyAgICBkb2NzdHJpbmdfY29tbWVudChvdXQsICIvLy8gPHN1bW1hcnk+IiArIGVuZGwsICIvLy8gIiwgY29udGVudHMsICIvLy8gPC9zdW1tYXJ5PiIgKyBlbmRsKTsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9uZXRjb3JlX2RvYyhvc3RyZWFtJiBvdXQsIHRfZmllbGQqIGZpZWxkKQoreworICAgIGlmIChmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfZW51bSgpKQorICAgIHsKKyAgICAgICAgc3RyaW5nIGNvbWJpbmVkX21lc3NhZ2UgPSBmaWVsZC0+Z2V0X2RvYygpICsgZW5kbCArICI8c2VlYWxzbyBjcmVmPVwiIiArIGdldF9lbnVtX2NsYXNzX25hbWUoZmllbGQtPmdldF90eXBlKCkpICsgIlwiLz4iOworICAgICAgICBnZW5lcmF0ZV9uZXRjb3JlX2RvY3N0cmluZ19jb21tZW50KG91dCwgY29tYmluZWRfbWVzc2FnZSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGdlbmVyYXRlX25ldGNvcmVfZG9jKG91dCwgc3RhdGljX2Nhc3Q8dF9kb2MqPihmaWVsZCkpOworICAgIH0KK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9uZXRjb3JlX2RvYyhvc3RyZWFtJiBvdXQsIHRfZG9jKiB0ZG9jKQoreworICAgIGlmICh0ZG9jLT5oYXNfZG9jKCkpCisgICAgeworICAgICAgICBnZW5lcmF0ZV9uZXRjb3JlX2RvY3N0cmluZ19jb21tZW50KG91dCwgdGRvYy0+Z2V0X2RvYygpKTsKKyAgICB9Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbmV0Y29yZV9kb2Mob3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pCit7CisgICAgaWYgKHRmdW5jdGlvbi0+aGFzX2RvYygpKQorICAgIHsKKyAgICAgICAgc3RyaW5nc3RyZWFtIHBzOworICAgICAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7CisgICAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHBfaXRlcjsKKyAgICAgICAgZm9yIChwX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgcF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytwX2l0ZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRfZmllbGQqIHAgPSAqcF9pdGVyOworICAgICAgICAgICAgcHMgPDwgZW5kbCA8PCAiPHBhcmFtIG5hbWU9XCIiIDw8IHAtPmdldF9uYW1lKCkgPDwgIlwiPiI7CisgICAgICAgICAgICBpZiAocC0+aGFzX2RvYygpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0cmluZyBzdHIgPSBwLT5nZXRfZG9jKCk7CisgICAgICAgICAgICAgICAgc3RyLmVyYXNlKHJlbW92ZShzdHIuYmVnaW4oKSwgc3RyLmVuZCgpLCAnXG4nKSwgc3RyLmVuZCgpKTsKKyAgICAgICAgICAgICAgICBwcyA8PCBzdHI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcyA8PCAiPC9wYXJhbT4iOworICAgICAgICB9CisKKyAgICAgICAgZG9jc3RyaW5nX2NvbW1lbnQob3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8vLyAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPHN1bW1hcnk+IiArIGVuZGwgKyB0ZnVuY3Rpb24tPmdldF9kb2MoKSArICI8L3N1bW1hcnk+IiArIHBzLnN0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIik7CisgICAgfQorfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmRvY3N0cmluZ19jb21tZW50KG9zdHJlYW0mIG91dCwgY29uc3Qgc3RyaW5nJiBjb21tZW50X3N0YXJ0LCBjb25zdCBzdHJpbmcmIGxpbmVfcHJlZml4LCBjb25zdCBzdHJpbmcmIGNvbnRlbnRzLCBjb25zdCBzdHJpbmcmIGNvbW1lbnRfZW5kKQoreworICAgIGlmIChjb21tZW50X3N0YXJ0ICE9ICIiKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8IGNvbW1lbnRfc3RhcnQ7CisgICAgfQorCisgICAgc3RyaW5nc3RyZWFtIGRvY3MoY29udGVudHMsIHN0ZDo6aW9zX2Jhc2U6OmluKTsKKworICAgIHdoaWxlICghKGRvY3MuZW9mKCkgfHwgZG9jcy5mYWlsKCkpKQorICAgIHsKKyAgICAgICAgY2hhciBsaW5lWzEwMjRdOworICAgICAgICBkb2NzLmdldGxpbmUobGluZSwgMTAyNCk7CisKKyAgICAgICAgLy8gSnVzdCBwcm50IGEgbmV3bGluZSB3aGVuIHRoZSBsaW5lICYgcHJlZml4IGFyZSBlbXB0eS4KKyAgICAgICAgaWYgKHN0cmxlbihsaW5lKSA9PSAwICYmIGxpbmVfcHJlZml4ID09ICIiICYmICFkb2NzLmVvZigpKQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChzdHJsZW4obGluZSkgPiAwIHx8ICFkb2NzLmVvZigpKQorICAgICAgICB7IC8vIHNraXAgdGhlIGVtcHR5IGxhc3QgbGluZQorICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8IGxpbmVfcHJlZml4IDw8IGxpbmUgPDwgZW5kbDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoY29tbWVudF9lbmQgIT0gIiIpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgY29tbWVudF9lbmQ7CisgICAgfQorfQorCitzdHJpbmcgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2V0X2VudW1fY2xhc3NfbmFtZSh0X3R5cGUqIHR5cGUpCit7CisgICAgc3RyaW5nIHBhY2thZ2UgPSAiIjsKKyAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0eXBlLT5nZXRfcHJvZ3JhbSgpOworICAgIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykKKyAgICB7CisgICAgICAgIHBhY2thZ2UgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJuZXRjb3JlIikgKyAiLiI7CisgICAgfQorICAgIHJldHVybiBwYWNrYWdlICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKworVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUigKKyAgICBuZXRjb3JlLAorICAgICJDIyIsCisgICAgIiAgICB3Y2Y6ICAgICAgICAgICAgIEFkZHMgYmluZGluZ3MgZm9yIFdDRiB0byBnZW5lcmF0ZWQgY2xhc3Nlcy5cbiIKKyAgICAiICAgIHNlcmlhbDogICAgICAgICAgQWRkIHNlcmlhbGl6YXRpb24gc3VwcG9ydCB0byBnZW5lcmF0ZWQgY2xhc3Nlcy5cbiIKKyAgICAiICAgIG51bGxhYmxlOiAgICAgICAgVXNlIG51bGxhYmxlIHR5cGVzIGZvciBwcm9wZXJ0aWVzLlxuIgorICAgICIgICAgaGFzaGNvZGU6ICAgICAgICBHZW5lcmF0ZSBhIGhhc2hjb2RlIGFuZCBlcXVhbHMgaW1wbGVtZW50YXRpb24gZm9yIGNsYXNzZXMuXG4iCisgICAgIiAgICB1bmlvbjogICAgICAgICAgIFVzZSBuZXcgdW5pb24gdHlwaW5nLCB3aGljaCBpbmNsdWRlcyBhIHN0YXRpYyByZWFkIGZ1bmN0aW9uIGZvciB1bmlvbiB0eXBlcy5cbiIKKykKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfbmV0Y29yZV9nZW5lcmF0b3IuaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfbmV0Y29yZV9nZW5lcmF0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWZjOTIyCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9uZXRjb3JlX2dlbmVyYXRvci5oCkBAIC0wLDAgKzEsMTM3IEBACisjaW5jbHVkZSA8Y2Fzc2VydD4KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxjY3R5cGU+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHNzdHJlYW0+CisKKyNpbmNsdWRlICJ0aHJpZnQvcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9vb3BfZ2VuZXJhdG9yLmgiCisKK3VzaW5nIHN0ZDo6bWFwOwordXNpbmcgc3RkOjpvc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6dmVjdG9yOworCitzdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCisKK2NsYXNzIHRfbmV0Y29yZV9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yCit7CisKKyAgICBzdHJ1Y3QgbWVtYmVyX21hcHBpbmdfc2NvcGUKKyAgICB7CisgICAgcHVibGljOgorICAgICAgICBtZW1iZXJfbWFwcGluZ19zY29wZSgpIDogc2NvcGVfbWVtYmVyKDApIHsgfQorICAgICAgICB2b2lkKiBzY29wZV9tZW1iZXI7CisgICAgICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gbWFwcGluZ190YWJsZTsKKyAgICB9OworCitwdWJsaWM6CisgICAgdF9uZXRjb3JlX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sIGNvbnN0IG1hcDxzdHJpbmcsIHN0cmluZz4mIHBhcnNlZF9vcHRpb25zLCBjb25zdCBzdHJpbmcmIG9wdGlvbl9zdHJpbmcpOworCisgICAgYm9vbCBpc193Y2ZfZW5hYmxlZCgpIGNvbnN0OworICAgIGJvb2wgaXNfbnVsbGFibGVfZW5hYmxlZCgpIGNvbnN0OworICAgIGJvb2wgaXNfaGFzaGNvZGVfZW5hYmxlZCgpIGNvbnN0OworICAgIGJvb2wgaXNfc2VyaWFsaXplX2VuYWJsZWQoKSBjb25zdDsKKyAgICBib29sIGlzX3VuaW9uX2VuYWJsZWQoKSBjb25zdDsKKyAgICBtYXA8c3RyaW5nLCBpbnQ+IGdldF9rZXl3b3Jkc19saXN0KCkgY29uc3Q7CisKKyAgICAvLyBvdmVycmlkZXMKKyAgICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7CisgICAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKKyAgICB2b2lkIGdlbmVyYXRlX2NvbnN0cyh2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyk7CisgICAgdm9pZCBnZW5lcmF0ZV9jb25zdHMob3N0cmVhbSYgb3V0LCB2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyk7CisgICAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpOworICAgIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKTsKKyAgICB2b2lkIGdlbmVyYXRlX2VudW0ob3N0cmVhbSYgb3V0LCB0X2VudW0qIHRlbnVtKTsKKyAgICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgICAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKTsKKyAgICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisKKyAgICB2b2lkIGdlbmVyYXRlX3Byb3BlcnR5KG9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBib29sIGlzUHVibGljLCBib29sIGdlbmVyYXRlSXNzZXQpOworICAgIHZvaWQgZ2VuZXJhdGVfbmV0Y29yZV9wcm9wZXJ0eShvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpc1B1YmxpYywgYm9vbCBpbmNsdWRlSXNzZXQgPSB0cnVlLCBzdHJpbmcgZmllbGRQcmVmaXggPSAiIik7CisgICAgYm9vbCBwcmludF9jb25zdF92YWx1ZShvc3RyZWFtJiBvdXQsIHN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlLCBib29sIGluX3N0YXRpYywgYm9vbCBkZWZ2YWwgPSBmYWxzZSwgYm9vbCBuZWVkdHlwZSA9IGZhbHNlKTsKKyAgICBzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKG9zdHJlYW0mIG91dCwgc3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOworICAgIHZvaWQgcHJpbnRfY29uc3RfY29uc3RydWN0b3Iob3N0cmVhbSYgb3V0LCB2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyk7CisgICAgdm9pZCBwcmludF9jb25zdF9kZWZfdmFsdWUob3N0cmVhbSYgb3V0LCBzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisgICAgdm9pZCBnZW5lcmF0ZV9uZXRjb3JlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOworICAgIHZvaWQgZ2VuZXJhdGVfbmV0Y29yZV91bmlvbih0X3N0cnVjdCogdHVuaW9uKTsKKyAgICB2b2lkIGdlbmVyYXRlX25ldGNvcmVfc3RydWN0X2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc194Y2VwdGlvbiA9IGZhbHNlLCBib29sIGluX2NsYXNzID0gZmFsc2UsIGJvb2wgaXNfcmVzdWx0ID0gZmFsc2UpOworICAgIHZvaWQgZ2VuZXJhdGVfbmV0Y29yZV91bmlvbl9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHR1bmlvbik7CisgICAgdm9pZCBnZW5lcmF0ZV9uZXRjb3JlX3VuaW9uX2NsYXNzKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHR1bmlvbiwgdF9maWVsZCogdGZpZWxkKTsKKyAgICB2b2lkIGdlbmVyYXRlX25ldGNvcmVfd2NmZmF1bHQob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgICAgdm9pZCBnZW5lcmF0ZV9uZXRjb3JlX3N0cnVjdF9yZWFkZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgICAgdm9pZCBnZW5lcmF0ZV9uZXRjb3JlX3N0cnVjdF9yZXN1bHRfd3JpdGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICAgIHZvaWQgZ2VuZXJhdGVfbmV0Y29yZV9zdHJ1Y3Rfd3JpdGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICAgIHZvaWQgZ2VuZXJhdGVfbmV0Y29yZV9zdHJ1Y3RfdG9zdHJpbmcob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgICAgdm9pZCBnZW5lcmF0ZV9uZXRjb3JlX3N0cnVjdF9lcXVhbHMob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgICAgdm9pZCBnZW5lcmF0ZV9uZXRjb3JlX3N0cnVjdF9oYXNoY29kZShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgICB2b2lkIGdlbmVyYXRlX25ldGNvcmVfdW5pb25fcmVhZGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHR1bmlvbik7CisgICAgdm9pZCBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKG9zdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7CisgICAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnMob3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7CisgICAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcihvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOworICAgIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbl9hc3luYyhvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIGZ1bmN0aW9uKTsKKyAgICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdHJpbmcgcHJlZml4ID0gIiIsIGJvb2wgaXNfcHJvcGVydHlsZXNzID0gZmFsc2UpOworICAgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcmVmaXggPSAiIik7CisgICAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4ID0gIiIpOworICAgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0cmluZyBwcmVmaXggPSAiIik7CisgICAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X2xpc3QqIGxpc3QsIHN0cmluZyBwcmVmaXggPSAiIik7CisgICAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBwcmVmaXggPSAiIiwgYm9vbCBpc19lbGVtZW50ID0gZmFsc2UsIGJvb2wgaXNfcHJvcGVydHlsZXNzID0gZmFsc2UpOworICAgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4ID0gIiIpOworICAgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXggPSAiIik7CisgICAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RyaW5nIGl0ZXIsIHN0cmluZyBtYXApOworICAgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9zZXQqIHRtYXAsIHN0cmluZyBpdGVyKTsKKyAgICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdHJpbmcgaXRlcik7CisgICAgdm9pZCBnZW5lcmF0ZV9uZXRjb3JlX2RvYyhvc3RyZWFtJiBvdXQsIHRfZmllbGQqIGZpZWxkKTsKKyAgICB2b2lkIGdlbmVyYXRlX25ldGNvcmVfZG9jKG9zdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpOworICAgIHZvaWQgZ2VuZXJhdGVfbmV0Y29yZV9kb2Mob3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZG9jKTsKKyAgICB2b2lkIGdlbmVyYXRlX25ldGNvcmVfZG9jc3RyaW5nX2NvbW1lbnQob3N0cmVhbSYgb3V0LCBzdHJpbmcgY29udGVudHMpOworICAgIHZvaWQgZG9jc3RyaW5nX2NvbW1lbnQob3N0cmVhbSYgb3V0LCBjb25zdCBzdHJpbmcmIGNvbW1lbnRfc3RhcnQsIGNvbnN0IHN0cmluZyYgbGluZV9wcmVmaXgsIGNvbnN0IHN0cmluZyYgY29udGVudHMsIGNvbnN0IHN0cmluZyYgY29tbWVudF9lbmQpOworICAgIHZvaWQgc3RhcnRfbmV0Y29yZV9uYW1lc3BhY2Uob3N0cmVhbSYgb3V0KTsKKyAgICB2b2lkIGVuZF9uZXRjb3JlX25hbWVzcGFjZShvc3RyZWFtJiBvdXQpOworCisgICAgc3RyaW5nIG5ldGNvcmVfdHlwZV91c2luZ3MoKSBjb25zdDsKKyAgICBzdHJpbmcgbmV0Y29yZV90aHJpZnRfdXNpbmdzKCkgY29uc3Q7CisKKyAgICBzdHJpbmcgdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsIGJvb2wgaW5fY291bnRhaW5lciA9IGZhbHNlLCBib29sIGluX2luaXQgPSBmYWxzZSwgYm9vbCBpbl9wYXJhbSA9IGZhbHNlLCBib29sIGlzX3JlcXVpcmVkID0gZmFsc2UpOworICAgIHN0cmluZyBiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZSogdGJhc2UsIGJvb2wgaW5fY29udGFpbmVyID0gZmFsc2UsIGJvb2wgaW5fcGFyYW0gPSBmYWxzZSwgYm9vbCBpc19yZXF1aXJlZCA9IGZhbHNlKTsKKyAgICBzdHJpbmcgZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdCA9IGZhbHNlLCBzdHJpbmcgcHJlZml4ID0gIiIpOworICAgIHN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmVfYXN5bmModF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdHJpbmcgcHJlZml4ID0gIiIpOworICAgIHN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdHJpbmcgcHJlZml4ID0gIiIpOworICAgIHN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KTsKKyAgICBzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOworICAgIHN0cmluZyBwcm9wX25hbWUodF9maWVsZCogdGZpZWxkLCBib29sIHN1cHByZXNzX21hcHBpbmcgPSBmYWxzZSk7CisgICAgc3RyaW5nIGdldF9lbnVtX2NsYXNzX25hbWUodF90eXBlKiB0eXBlKTsKKworcHJpdmF0ZToKKyAgICBzdHJpbmcgbmFtZXNwYWNlX25hbWVfOworICAgIHN0cmluZyBuYW1lc3BhY2VfZGlyXzsKKworICAgIGJvb2wgbnVsbGFibGVfOworICAgIGJvb2wgdW5pb25fOworICAgIGJvb2wgaGFzaGNvZGVfOworICAgIGJvb2wgc2VyaWFsaXplXzsKKyAgICBib29sIHdjZl87CisKKyAgICBzdHJpbmcgd2NmX25hbWVzcGFjZV87CisgICAgbWFwPHN0cmluZywgaW50PiBuZXRjb3JlX2tleXdvcmRzOworICAgIHZlY3RvcjxtZW1iZXJfbWFwcGluZ19zY29wZT4gbWVtYmVyX21hcHBpbmdfc2NvcGVzOworCisgICAgdm9pZCBpbml0X2tleXdvcmRzKCk7CisgICAgc3RyaW5nIG5vcm1hbGl6ZV9uYW1lKHN0cmluZyBuYW1lKTsKKyAgICBzdHJpbmcgbWFrZV92YWxpZF9jc2hhcnBfaWRlbnRpZmllcihzdHJpbmcgY29uc3QmIGZyb21OYW1lKTsKKyAgICB2b2lkIHByZXBhcmVfbWVtYmVyX25hbWVfbWFwcGluZyh0X3N0cnVjdCogdHN0cnVjdCk7CisgICAgdm9pZCBwcmVwYXJlX21lbWJlcl9uYW1lX21hcHBpbmcodm9pZCogc2NvcGUsIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMsIGNvbnN0IHN0cmluZyYgc3RydWN0bmFtZSk7CisgICAgdm9pZCBjbGVhbnVwX21lbWJlcl9uYW1lX21hcHBpbmcodm9pZCogc2NvcGUpOworICAgIHN0cmluZyBnZXRfbWFwcGVkX21lbWJlcl9uYW1lKHN0cmluZyBvbGRuYW1lKTsKK307CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X29jYW1sX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3Rfb2NhbWxfZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlYzgxYmEKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X29jYW1sX2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDE3NjIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlICJ0aHJpZnQvcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ0aHJpZnQvdmVyc2lvbi5oIgorI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaCIKKwordXNpbmcgc3RkOjppb3M7Cit1c2luZyBzdGQ6Om1hcDsKK3VzaW5nIHN0ZDo6b3N0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnZlY3RvcjsKKworc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsID0gIlxuIjsgLy8gYXZvaWQgb3N0cmVhbSA8PCBzdGQ6OmVuZGwgZmx1c2hlcworCisvKioKKyAqIE9DYW1sIGNvZGUgZ2VuZXJhdG9yLgorICoKKyAqLworY2xhc3MgdF9vY2FtbF9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgdF9vY2FtbF9nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCisgICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkgeworICAgICh2b2lkKW9wdGlvbl9zdHJpbmc7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKworICAgIC8qIG5vIG9wdGlvbnMgeWV0ICovCisgICAgZm9yKCBpdGVyID0gcGFyc2VkX29wdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKTsgKytpdGVyKSB7CisgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24gb2NhbWw6IiArIGl0ZXItPmZpcnN0OworICAgIH0KKworICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLW9jYW1sIjsKKyAgfQorCisgIC8qKgorICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCisgICAqLworCisgIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKKyAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKKworICAvKioKKyAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKyAgdm9pZCBnZW5lcmF0ZV9wcm9ncmFtKCk7CisgIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pOworICB2b2lkIGdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworCisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKKyAgYm9vbCBzdHJ1Y3RfbWVtYmVyX3BlcnNpc3RlbnQodF9maWVsZCogdG1lbWJlcik7CisgIGJvb2wgc3RydWN0X21lbWJlcl9vbWl0YWJsZSh0X2ZpZWxkKiB0bWVtYmVyKTsKKyAgYm9vbCBzdHJ1Y3RfbWVtYmVyX2RlZmF1bHRfY2hlYXBseV9jb21wYXJhYmxlKHRfZmllbGQqIHRtZW1iZXIpOworICBzdGQ6OnN0cmluZyBzdHJ1Y3RfbWVtYmVyX2NvcHlfb2YodF90eXBlKiB0eXBlLCBzdHJpbmcgd2hhdCk7CisKKyAgLyoqCisgICAqIFN0cnVjdCBnZW5lcmF0aW9uIGNvZGUKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3RfZGVmaW5pdGlvbihzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uID0gZmFsc2UpOworICB2b2lkIGdlbmVyYXRlX29jYW1sX3N0cnVjdF9tZW1iZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHN0cmluZyB0bmFtZSwgdF9maWVsZCogdG1lbWJlcik7CisgIHZvaWQgZ2VuZXJhdGVfb2NhbWxfc3RydWN0X3NpZyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3RfcmVhZGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfb2NhbWxfc3RydWN0X3dyaXRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX29jYW1sX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9vY2FtbF9tZXRob2RfY29weShzdGQ6Om9zdHJlYW0mIG91dCwgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyk7CisgIHZvaWQgZ2VuZXJhdGVfb2NhbWxfbWVtYmVyX2NvcHkoc3RkOjpvc3RyZWFtJiBvdXQsIHRfZmllbGQqIG1lbWJlcik7CisKKyAgLyoqCisgICAqIFNlcnZpY2UtbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworCisgIC8qKgorICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdGQ6OnN0cmluZyBwcmVmaXgpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0KTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3R5cGUoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RkOjpzdHJpbmcgbmFtZSA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBraXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgdml0ZXIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NldCogdG1hcCwgc3RkOjpzdHJpbmcgaXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdGQ6OnN0cmluZyBpdGVyKTsKKworICAvKioKKyAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKKyAgICovCisKKyAgc3RkOjpzdHJpbmcgb2NhbWxfYXV0b2dlbl9jb21tZW50KCk7CisgIHN0ZDo6c3RyaW5nIG9jYW1sX2ltcG9ydHMoKTsKKyAgc3RkOjpzdHJpbmcgdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpOworICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3R5cGUodF9mdW5jdGlvbiogdGZ1bmMsIGJvb2wgbWV0aG9kID0gZmFsc2UsIGJvb2wgb3B0aW9ucyA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgIHN0ZDo6c3RyaW5nIHR5cGVfdG9fZW51bSh0X3R5cGUqIHR0eXBlKTsKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX29jYW1sX3R5cGUodF90eXBlKiB0eXBlKTsKKworcHJpdmF0ZToKKyAgLyoqCisgICAqIEZpbGUgc3RyZWFtcworICAgKi8KKworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfdHlwZXNfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfY29uc3RzXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3NlcnZpY2VfOworCisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl90eXBlc19pXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3NlcnZpY2VfaV87Cit9OworCisvKgorICogVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSB3ZSB3YW50IHR5cGVkZWZzIHRvIGFwcGVhciBsYXRlciwKKyAqIGFmdGVyIGFsbCB0aGUgdHlwZXMgaGF2ZSBiZWVuIGRlY2xhcmVkLgorICovCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9ncmFtKCkgeworICAvLyBJbml0aWFsaXplIHRoZSBnZW5lcmF0b3IKKyAgaW5pdF9nZW5lcmF0b3IoKTsKKworICAvLyBHZW5lcmF0ZSBlbnVtcworICB2ZWN0b3I8dF9lbnVtKj4gZW51bXMgPSBwcm9ncmFtXy0+Z2V0X2VudW1zKCk7CisgIHZlY3Rvcjx0X2VudW0qPjo6aXRlcmF0b3IgZW5faXRlcjsKKyAgZm9yIChlbl9pdGVyID0gZW51bXMuYmVnaW4oKTsgZW5faXRlciAhPSBlbnVtcy5lbmQoKTsgKytlbl9pdGVyKSB7CisgICAgZ2VuZXJhdGVfZW51bSgqZW5faXRlcik7CisgIH0KKworICAvLyBHZW5lcmF0ZSBzdHJ1Y3RzCisgIHZlY3Rvcjx0X3N0cnVjdCo+IHN0cnVjdHMgPSBwcm9ncmFtXy0+Z2V0X3N0cnVjdHMoKTsKKyAgdmVjdG9yPHRfc3RydWN0Kj46Oml0ZXJhdG9yIHN0X2l0ZXI7CisgIGZvciAoc3RfaXRlciA9IHN0cnVjdHMuYmVnaW4oKTsgc3RfaXRlciAhPSBzdHJ1Y3RzLmVuZCgpOyArK3N0X2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9zdHJ1Y3QoKnN0X2l0ZXIpOworICB9CisKKyAgLy8gR2VuZXJhdGUgeGNlcHRpb25zCisgIHZlY3Rvcjx0X3N0cnVjdCo+IHhjZXB0aW9ucyA9IHByb2dyYW1fLT5nZXRfeGNlcHRpb25zKCk7CisgIHZlY3Rvcjx0X3N0cnVjdCo+OjppdGVyYXRvciB4X2l0ZXI7CisgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgZ2VuZXJhdGVfeGNlcHRpb24oKnhfaXRlcik7CisgIH0KKworICAvLyBHZW5lcmF0ZSB0eXBlZGVmcworICB2ZWN0b3I8dF90eXBlZGVmKj4gdHlwZWRlZnMgPSBwcm9ncmFtXy0+Z2V0X3R5cGVkZWZzKCk7CisgIHZlY3Rvcjx0X3R5cGVkZWYqPjo6aXRlcmF0b3IgdGRfaXRlcjsKKyAgZm9yICh0ZF9pdGVyID0gdHlwZWRlZnMuYmVnaW4oKTsgdGRfaXRlciAhPSB0eXBlZGVmcy5lbmQoKTsgKyt0ZF9pdGVyKSB7CisgICAgZ2VuZXJhdGVfdHlwZWRlZigqdGRfaXRlcik7CisgIH0KKworICAvLyBHZW5lcmF0ZSBzZXJ2aWNlcworICB2ZWN0b3I8dF9zZXJ2aWNlKj4gc2VydmljZXMgPSBwcm9ncmFtXy0+Z2V0X3NlcnZpY2VzKCk7CisgIHZlY3Rvcjx0X3NlcnZpY2UqPjo6aXRlcmF0b3Igc3ZfaXRlcjsKKyAgZm9yIChzdl9pdGVyID0gc2VydmljZXMuYmVnaW4oKTsgc3ZfaXRlciAhPSBzZXJ2aWNlcy5lbmQoKTsgKytzdl9pdGVyKSB7CisgICAgc2VydmljZV9uYW1lXyA9IGdldF9zZXJ2aWNlX25hbWUoKnN2X2l0ZXIpOworICAgIGdlbmVyYXRlX3NlcnZpY2UoKnN2X2l0ZXIpOworICB9CisKKyAgLy8gR2VuZXJhdGUgY29uc3RhbnRzCisgIHZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzID0gcHJvZ3JhbV8tPmdldF9jb25zdHMoKTsKKyAgZ2VuZXJhdGVfY29uc3RzKGNvbnN0cyk7CisKKyAgLy8gQ2xvc2UgdGhlIGdlbmVyYXRvcgorICBjbG9zZV9nZW5lcmF0b3IoKTsKK30KKworLyoqCisgKiBQcmVwYXJlcyBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAorICogc3RyZWFtcy4KKyAqCisgKiBAcGFyYW0gdHByb2dyYW0gVGhlIHByb2dyYW0gdG8gZ2VuZXJhdGUKKyAqLwordm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7CisgIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQorICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOworCisgIC8vIE1ha2Ugb3V0cHV0IGZpbGUKKyAgc3RyaW5nIGZfdHlwZXNfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBwcm9ncmFtX25hbWVfICsgIl90eXBlcy5tbCI7CisgIGZfdHlwZXNfLm9wZW4oZl90eXBlc19uYW1lLmNfc3RyKCkpOworICBzdHJpbmcgZl90eXBlc19pX25hbWUgPSBnZXRfb3V0X2RpcigpICsgcHJvZ3JhbV9uYW1lXyArICJfdHlwZXMubWxpIjsKKyAgZl90eXBlc19pXy5vcGVuKGZfdHlwZXNfaV9uYW1lLmNfc3RyKCkpOworCisgIHN0cmluZyBmX2NvbnN0c19uYW1lID0gZ2V0X291dF9kaXIoKSArIHByb2dyYW1fbmFtZV8gKyAiX2NvbnN0cy5tbCI7CisgIGZfY29uc3RzXy5vcGVuKGZfY29uc3RzX25hbWUuY19zdHIoKSk7CisKKyAgLy8gUHJpbnQgaGVhZGVyCisgIGZfdHlwZXNfIDw8IG9jYW1sX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGwgPDwgb2NhbWxfaW1wb3J0cygpIDw8IGVuZGw7CisgIGZfdHlwZXNfaV8gPDwgb2NhbWxfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbCA8PCBvY2FtbF9pbXBvcnRzKCkgPDwgZW5kbDsKKyAgZl9jb25zdHNfIDw8IG9jYW1sX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGwgPDwgb2NhbWxfaW1wb3J0cygpIDw8IGVuZGwgPDwgIm9wZW4gIgorICAgICAgICAgICAgPDwgY2FwaXRhbGl6ZShwcm9ncmFtX25hbWVfKSA8PCAiX3R5cGVzIiA8PCBlbmRsOworfQorCisvKioKKyAqIEF1dG9nZW4nZCBjb21tZW50CisgKi8KK3N0cmluZyB0X29jYW1sX2dlbmVyYXRvcjo6b2NhbWxfYXV0b2dlbl9jb21tZW50KCkgeworICByZXR1cm4gc3RkOjpzdHJpbmcoIigqXG4iKSArICIgQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKCIgKyBUSFJJRlRfVkVSU0lPTiArICIpXG4iICsgIlxuIgorICAgICAgICAgKyAiIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HXG4iICsgIiopXG4iOworfQorCisvKioKKyAqIFByaW50cyBzdGFuZGFyZCB0aHJpZnQgaW1wb3J0cworICovCitzdHJpbmcgdF9vY2FtbF9nZW5lcmF0b3I6Om9jYW1sX2ltcG9ydHMoKSB7CisgIHJldHVybiAib3BlbiBUaHJpZnQiOworfQorCisvKioKKyAqIENsb3NlcyB0aGUgdHlwZSBmaWxlcworICovCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7CisgIC8vIENsb3NlIHR5cGVzIGZpbGUKKyAgZl90eXBlc18uY2xvc2UoKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSB0eXBlZGVmLiBFei4KKyAqCisgKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgorICovCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInR5cGUgIiA8PCBkZWNhcGl0YWxpemUodHR5cGVkZWYtPmdldF9zeW1ib2xpYygpKSA8PCAiID0gIgorICAgICAgICAgICA8PCByZW5kZXJfb2NhbWxfdHlwZSh0dHlwZWRlZi0+Z2V0X3R5cGUoKSkgPDwgZW5kbCA8PCBlbmRsOworICBmX3R5cGVzX2lfIDw8IGluZGVudCgpIDw8ICJ0eXBlICIgPDwgZGVjYXBpdGFsaXplKHR0eXBlZGVmLT5nZXRfc3ltYm9saWMoKSkgPDwgIiA9ICIKKyAgICAgICAgICAgICA8PCByZW5kZXJfb2NhbWxfdHlwZSh0dHlwZWRlZi0+Z2V0X3R5cGUoKSkgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBjb2RlIGZvciBhbiBlbnVtZXJhdGVkIHR5cGUuCisgKiB0aGUgdmFsdWVzLgorICoKKyAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KKyAqLwordm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7CisgIGluZGVudChmX3R5cGVzXykgPDwgIm1vZHVsZSAiIDw8IGNhcGl0YWxpemUodGVudW0tPmdldF9uYW1lKCkpIDw8ICIgPSAiIDw8IGVuZGwgPDwgInN0cnVjdCIKKyAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnQoZl90eXBlc19pXykgPDwgIm1vZHVsZSAiIDw8IGNhcGl0YWxpemUodGVudW0tPmdldF9uYW1lKCkpIDw8ICIgOiAiIDw8IGVuZGwgPDwgInNpZyIKKyAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQoZl90eXBlc18pIDw8ICJ0eXBlIHQgPSAiIDw8IGVuZGw7CisgIGluZGVudChmX3R5cGVzX2lfKSA8PCAidHlwZSB0ID0gIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIHN0cmluZyBuYW1lID0gY2FwaXRhbGl6ZSgoKmNfaXRlciktPmdldF9uYW1lKCkpOworICAgIGluZGVudChmX3R5cGVzXykgPDwgInwgIiA8PCBuYW1lIDw8IGVuZGw7CisgICAgaW5kZW50KGZfdHlwZXNfaV8pIDw8ICJ8ICIgPDwgbmFtZSA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7CisKKyAgaW5kZW50KGZfdHlwZXNfKSA8PCAibGV0IHRvX2kgPSBmdW5jdGlvbiIgPDwgZW5kbDsKKyAgaW5kZW50KGZfdHlwZXNfaV8pIDw8ICJ2YWwgdG9faSA6IHQgLT4gSW50MzIudCIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgICBzdHJpbmcgbmFtZSA9IGNhcGl0YWxpemUoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICBpbmRlbnQoZl90eXBlc18pIDw8ICJ8ICIgPDwgbmFtZSA8PCAiIC0+ICIgPDwgdmFsdWUgPDwgImwiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKworICBpbmRlbnQoZl90eXBlc18pIDw8ICJsZXQgb2ZfaSA9IGZ1bmN0aW9uIiA8PCBlbmRsOworICBpbmRlbnQoZl90eXBlc19pXykgPDwgInZhbCBvZl9pIDogSW50MzIudCAtPiB0IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOworICAgIHN0cmluZyBuYW1lID0gY2FwaXRhbGl6ZSgoKmNfaXRlciktPmdldF9uYW1lKCkpOworICAgIGluZGVudChmX3R5cGVzXykgPDwgInwgIiA8PCB2YWx1ZSA8PCAibCAtPiAiIDw8IG5hbWUgPDwgZW5kbDsKKyAgfQorICBpbmRlbnQoZl90eXBlc18pIDw8ICJ8IF8gLT4gcmFpc2UgVGhyaWZ0X2Vycm9yIiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl90eXBlc18pIDw8ICJlbmQiIDw8IGVuZGw7CisgIGluZGVudChmX3R5cGVzX2lfKSA8PCAiZW5kIiA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlIGEgY29uc3RhbnQgdmFsdWUKKyAqLwordm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KSB7CisgIHRfdHlwZSogdHlwZSA9IHRjb25zdC0+Z2V0X3R5cGUoKTsKKyAgc3RyaW5nIG5hbWUgPSBkZWNhcGl0YWxpemUodGNvbnN0LT5nZXRfbmFtZSgpKTsKKyAgdF9jb25zdF92YWx1ZSogdmFsdWUgPSB0Y29uc3QtPmdldF92YWx1ZSgpOworCisgIGluZGVudChmX2NvbnN0c18pIDw8ICJsZXQgIiA8PCBuYW1lIDw8ICIgPSAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0eXBlLCB2YWx1ZSkgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIFByaW50cyB0aGUgdmFsdWUgb2YgYSBjb25zdGFudCB3aXRoIHRoZSBnaXZlbiB0eXBlLiBOb3RlIHRoYXQgdHlwZSBjaGVja2luZworICogaXMgTk9UIHBlcmZvcm1lZCBpbiB0aGlzIGZ1bmN0aW9uIGFzIGl0IGlzIGFsd2F5cyBydW4gYmVmb3JlaGFuZCB1c2luZyB0aGUKKyAqIHZhbGlkYXRlX3R5cGVzIG1ldGhvZCBpbiBtYWluLmNjCisgKi8KK3N0cmluZyB0X29jYW1sX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7CisgIC8vIE9DYW1sIHJlcXVpcmVzIGFsbCBmbG9hdGluZyBwb2ludCBudW1iZXJzIGNvbnRhaW4gYSBkZWNpbWFsIHBvaW50CisgIG91dC5zZXRmKGlvczo6c2hvd3BvaW50KTsKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIG91dCA8PCAnIicgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICBvdXQgPDwgKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICJsIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICJMIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKKyAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICIuMCI7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgdF9lbnVtKiB0ZW51bSA9ICh0X2VudW0qKXR5cGU7CisgICAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CisgICAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7CisgICAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICAgIGludCB2YWwgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOworICAgICAgaWYgKHZhbCA9PSB2YWx1ZS0+Z2V0X2ludGVnZXIoKSkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCBjYXBpdGFsaXplKHRlbnVtLT5nZXRfbmFtZSgpKSA8PCAiLiIgPDwgY2FwaXRhbGl6ZSgoKmNfaXRlciktPmdldF9uYW1lKCkpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHN0cmluZyBjbmFtZSA9IHR5cGVfbmFtZSh0eXBlKTsKKyAgICBzdHJpbmcgY3QgPSB0bXAoIl9jIik7CisgICAgb3V0IDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgIihsZXQgIiA8PCBjdCA8PCAiID0gbmV3ICIgPDwgY25hbWUgPDwgIiBpbiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKKyAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7CisgICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgeworICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOworICAgICAgfQorICAgICAgc3RyaW5nIGZuYW1lID0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOworICAgICAgb3V0IDw8IGluZGVudCgpOworICAgICAgb3V0IDw8IGN0IDw8ICIjc2V0XyIgPDwgZm5hbWUgPDwgIiAiOworICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgICBvdXQgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudChvdXQpIDw8IGN0IDw8ICIpIjsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudF9kb3duKCk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBzdHJpbmcgaG0gPSB0bXAoIl9obSIpOworICAgIG91dCA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICIobGV0ICIgPDwgaG0gPDwgIiA9IEhhc2h0YmwuY3JlYXRlICIgPDwgdmFsLnNpemUoKSA8PCAiIGluIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBzdHJpbmcga2V5ID0gcmVuZGVyX2NvbnN0X3ZhbHVlKGt0eXBlLCB2X2l0ZXItPmZpcnN0KTsKKyAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUodnR5cGUsIHZfaXRlci0+c2Vjb25kKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJIYXNodGJsLmFkZCAiIDw8IGhtIDw8ICIgIiA8PCBrZXkgPDwgIiAiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50KG91dCkgPDwgaG0gPDwgIikiOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICB0X3R5cGUqIGV0eXBlOworICAgIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgb3V0IDw8ICJbIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOworICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgb3V0IDw8IGluZGVudCgpOworICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShldHlwZSwgKnZfaXRlcik7CisgICAgICBvdXQgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIl0iOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgdF90eXBlKiBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIHN0cmluZyBobSA9IHRtcCgiX2htIik7CisgICAgaW5kZW50KG91dCkgPDwgIihsZXQgIiA8PCBobSA8PCAiID0gSGFzaHRibC5jcmVhdGUgIiA8PCB2YWwuc2l6ZSgpIDw8ICIgaW4iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUoZXR5cGUsICp2X2l0ZXIpOworICAgICAgaW5kZW50KG91dCkgPDwgIkhhc2h0YmwuYWRkICIgPDwgaG0gPDwgIiAiIDw8IHZhbCA8PCAiIHRydWU7IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnQob3V0KSA8PCBobSA8PCAiKSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgQ09OU1RBTlQgRk9SIFRZUEU6ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworICB9CisgIHJldHVybiBvdXQuc3RyKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgInN0cnVjdCIKKyAqLwordm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGdlbmVyYXRlX29jYW1sX3N0cnVjdCh0c3RydWN0LCBmYWxzZSk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGV4Y2VwdGlvbi4gQmFzaWNhbGx5IHRoZSBzYW1lCisgKiBhcyBhIHN0cnVjdCwgYnV0IGFsc28gaGFzIGFuIGV4Y2VwdGlvbiBkZWNsYXJhdGlvbi4KKyAqCisgKiBAcGFyYW0gdHhjZXB0aW9uIFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7CisgIGdlbmVyYXRlX29jYW1sX3N0cnVjdCh0eGNlcHRpb24sIHRydWUpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhbiBPQ2FtbCBzdHJ1Y3QKKyAqLwordm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfb2NhbWxfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbikgeworICBnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3RfZGVmaW5pdGlvbihmX3R5cGVzXywgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKKyAgZ2VuZXJhdGVfb2NhbWxfc3RydWN0X3NpZyhmX3R5cGVzX2lfLCB0c3RydWN0LCBpc19leGNlcHRpb24pOworfQorCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9vY2FtbF9tZXRob2RfY29weShvc3RyZWFtJiBvdXQsIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMpIHsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIC8qIENyZWF0ZSBhIGNvcHkgb2YgdGhlIGN1cnJlbnQgb2JqZWN0ICovCisgIGluZGVudChvdXQpIDw8ICJtZXRob2QgY29weSA9IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJsZXQgX25ldyA9IE9vLmNvcHkgc2VsZiBpbiIgPDwgZW5kbDsKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikKKyAgICBnZW5lcmF0ZV9vY2FtbF9tZW1iZXJfY29weShvdXQsICptX2l0ZXIpOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJfbmV3IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworfQorCitzdHJpbmcgdF9vY2FtbF9nZW5lcmF0b3I6OnN0cnVjdF9tZW1iZXJfY29weV9vZih0X3R5cGUqIHR5cGUsIHN0cmluZyB3aGF0KSB7CisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuIHdoYXQgKyBzdHJpbmcoIiNjb3B5Iik7CisgIH0KKyAgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgc3RyaW5nIGNvcHlfb2ZfayA9IHN0cnVjdF9tZW1iZXJfY29weV9vZigoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCksICJrIik7CisgICAgc3RyaW5nIGNvcHlfb2ZfdiA9IHN0cnVjdF9tZW1iZXJfY29weV9vZigoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCksICJ2Iik7CisKKyAgICBpZiAoY29weV9vZl9rID09ICJrIiAmJiBjb3B5X29mX3YgPT0gInYiKSB7CisgICAgICByZXR1cm4gc3RyaW5nKCIoSGFzaHRibC5jb3B5ICIpICsgd2hhdCArIHN0cmluZygiKSIpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gc3RyaW5nKAorICAgICAgICAgICAgICAgICAiKChmdW4gb2ggLT4gbGV0IG5oID0gSGFzaHRibC5jcmVhdGUgKEhhc2h0YmwubGVuZ3RoIG9oKSBpbiBIYXNodGJsLml0ZXIgKGZ1biBrIHYgIgorICAgICAgICAgICAgICAgICAiLT4gSGFzaHRibC5hZGQgbmggIikgKyBjb3B5X29mX2sgKyBzdHJpbmcoIiAiKSArIGNvcHlfb2ZfdiArIHN0cmluZygiKSBvaDsgbmgpICIpCisgICAgICAgICAgICAgKyB3aGF0ICsgIikiOworICAgIH0KKyAgfQorICBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICBzdHJpbmcgY29weV9vZiA9IHN0cnVjdF9tZW1iZXJfY29weV9vZigoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpLCAiayIpOworCisgICAgaWYgKGNvcHlfb2YgPT0gImsiKSB7CisgICAgICByZXR1cm4gc3RyaW5nKCIoSGFzaHRibC5jb3B5ICIpICsgd2hhdCArIHN0cmluZygiKSIpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gc3RyaW5nKAorICAgICAgICAgICAgICAgICAiKChmdW4gb2ggLT4gbGV0IG5oID0gSGFzaHRibC5jcmVhdGUgKEhhc2h0YmwubGVuZ3RoIG9oKSBpbiBIYXNodGJsLml0ZXIgKGZ1biBrIHYgIgorICAgICAgICAgICAgICAgICAiLT4gSGFzaHRibC5hZGQgbmggIikgKyBjb3B5X29mICsgc3RyaW5nKCIgdHJ1ZSIpICsgc3RyaW5nKCIpIG9oOyBuaCkgIikgKyB3aGF0CisgICAgICAgICAgICAgKyAiKSI7CisgICAgfQorICB9CisgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICBzdHJpbmcgY29weV9vZiA9IHN0cnVjdF9tZW1iZXJfY29weV9vZigoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKSwgIngiKTsKKyAgICBpZiAoY29weV9vZiAhPSAieCIpIHsKKyAgICAgIHJldHVybiBzdHJpbmcoIihMaXN0Lm1hcCAoZnVuIHggLT4gIikgKyBjb3B5X29mICsgc3RyaW5nKCIpICIpICsgd2hhdCArIHN0cmluZygiKSIpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gd2hhdDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHdoYXQ7Cit9CisKK3ZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX29jYW1sX21lbWJlcl9jb3B5KG9zdHJlYW0mIG91dCwgdF9maWVsZCogdG1lbWJlcikgeworICBzdHJpbmcgbW5hbWUgPSBkZWNhcGl0YWxpemUodG1lbWJlci0+Z2V0X25hbWUoKSk7CisgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodG1lbWJlci0+Z2V0X3R5cGUoKSk7CisKKyAgc3RyaW5nIGdyYWJfZmllbGQgPSBzdHJpbmcoInNlbGYjZ3JhYl8iKSArIG1uYW1lOworICBzdHJpbmcgY29weV9vZiA9IHN0cnVjdF9tZW1iZXJfY29weV9vZih0eXBlLCBncmFiX2ZpZWxkKTsKKyAgaWYgKGNvcHlfb2YgIT0gZ3JhYl9maWVsZCkgeworICAgIGluZGVudChvdXQpOworICAgIGlmICghc3RydWN0X21lbWJlcl9wZXJzaXN0ZW50KHRtZW1iZXIpKSB7CisgICAgICBvdXQgPDwgImlmIF8iIDw8IG1uYW1lIDw8ICIgPD4gTm9uZSB0aGVuIiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIiAgIjsKKyAgICB9CisgICAgb3V0IDw8ICJfbmV3I3NldF8iIDw8IG1uYW1lIDw8ICIgIiA8PCBjb3B5X29mIDw8ICI7IiA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGRhdGEgdHlwZS4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfb2NhbWxfc3RydWN0X2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworICBzdHJpbmcgdG5hbWUgPSB0eXBlX25hbWUodHN0cnVjdCk7CisgIGluZGVudChvdXQpIDw8ICJjbGFzcyAiIDw8IHRuYW1lIDw8ICIgPSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIm9iamVjdCAoc2VsZikiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisKKyAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgeworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIGdlbmVyYXRlX29jYW1sX3N0cnVjdF9tZW1iZXIob3V0LCB0bmFtZSwgKCptX2l0ZXIpKTsKKyAgICAgIG91dCA8PCBlbmRsOworICAgIH0KKyAgfQorICBnZW5lcmF0ZV9vY2FtbF9tZXRob2RfY29weShvdXQsIG1lbWJlcnMpOworICBnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCk7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJlbmQiIDw8IGVuZGw7CisKKyAgaWYgKGlzX2V4Y2VwdGlvbikgeworICAgIGluZGVudChvdXQpIDw8ICJleGNlcHRpb24gIiA8PCBjYXBpdGFsaXplKHRuYW1lKSA8PCAiIG9mICIgPDwgdG5hbWUgPDwgZW5kbDsKKyAgfQorCisgIGdlbmVyYXRlX29jYW1sX3N0cnVjdF9yZWFkZXIob3V0LCB0c3RydWN0KTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3R1cmUgbWVtYmVyIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuCisgKgorICogQHBhcmFtIHRuYW1lIE5hbWUgb2YgdGhlIHBhcmVudCBzdHJ1Y3R1cmUgZm9yIHRoZSBtZW1iZXIKKyAqIEBwYXJhbSB0bWVtYmVyIE1lbWJlciBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX29jYW1sX3N0cnVjdF9tZW1iZXIob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRtZW1iZXIpIHsKKyAgc3RyaW5nIHggPSB0bXAoIl94Iik7CisgIHN0cmluZyBtbmFtZSA9IGRlY2FwaXRhbGl6ZSh0bWVtYmVyLT5nZXRfbmFtZSgpKTsKKworICBpbmRlbnQob3V0KSA8PCAidmFsIG11dGFibGUgXyIgPDwgbW5hbWUgPDwgIiA6ICIgPDwgcmVuZGVyX29jYW1sX3R5cGUodG1lbWJlci0+Z2V0X3R5cGUoKSk7CisgIHRfY29uc3RfdmFsdWUqIHZhbCA9IHRtZW1iZXItPmdldF92YWx1ZSgpOworICBpZiAodmFsKSB7CisgICAgaWYgKHN0cnVjdF9tZW1iZXJfcGVyc2lzdGVudCh0bWVtYmVyKSkKKyAgICAgIG91dCA8PCAiID0gIiA8PCByZW5kZXJfY29uc3RfdmFsdWUodG1lbWJlci0+Z2V0X3R5cGUoKSwgdG1lbWJlci0+Z2V0X3ZhbHVlKCkpIDw8IGVuZGw7CisgICAgZWxzZQorICAgICAgb3V0IDw8ICIgb3B0aW9uID0gU29tZSAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0bWVtYmVyLT5nZXRfdHlwZSgpLCB0bWVtYmVyLT5nZXRfdmFsdWUoKSkKKyAgICAgICAgICA8PCBlbmRsOworICB9IGVsc2UgeworICAgIC8vIGFzc2VydCghc3RydWN0X21lbWJlcl9wZXJzaXN0ZW50KHRtZW1iZXIpKQorICAgIG91dCA8PCAiIG9wdGlvbiA9IE5vbmUiIDw8IGVuZGw7CisgIH0KKworICBpZiAoc3RydWN0X21lbWJlcl9wZXJzaXN0ZW50KHRtZW1iZXIpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm1ldGhvZCBnZXRfIiA8PCBtbmFtZSA8PCAiID0gU29tZSBfIiA8PCBtbmFtZSA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJtZXRob2QgZ3JhYl8iIDw8IG1uYW1lIDw8ICIgPSBfIiA8PCBtbmFtZSA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJtZXRob2Qgc2V0XyIgPDwgbW5hbWUgPDwgIiAiIDw8IHggPDwgIiA9IF8iIDw8IG1uYW1lIDw8ICIgPC0gIiA8PCB4IDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgIm1ldGhvZCBnZXRfIiA8PCBtbmFtZSA8PCAiID0gXyIgPDwgbW5hbWUgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAibWV0aG9kIGdyYWJfIiA8PCBtbmFtZSA8PCAiID0gbWF0Y2ggXyIgPDwgbW5hbWUKKyAgICAgICAgICAgICAgICA8PCAiIHdpdGggTm9uZS0+cmFpc2UgKEZpZWxkX2VtcHR5IFwiIiA8PCB0bmFtZSA8PCAiLiIgPDwgbW5hbWUgPDwgIlwiKSB8IFNvbWUgIgorICAgICAgICAgICAgICAgIDw8IHggPDwgIiAtPiAiIDw8IHggPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAibWV0aG9kIHNldF8iIDw8IG1uYW1lIDw8ICIgIiA8PCB4IDw8ICIgPSBfIiA8PCBtbmFtZSA8PCAiIDwtIFNvbWUgIiA8PCB4CisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAibWV0aG9kIHVuc2V0XyIgPDwgbW5hbWUgPDwgIiA9IF8iIDw8IG1uYW1lIDw8ICIgPC0gTm9uZSIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudChvdXQpIDw8ICJtZXRob2QgcmVzZXRfIiA8PCBtbmFtZSA8PCAiID0gXyIgPDwgbW5hbWUgPDwgIiA8LSAiOworICBpZiAodmFsKSB7CisgICAgaWYgKHN0cnVjdF9tZW1iZXJfcGVyc2lzdGVudCh0bWVtYmVyKSkKKyAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUodG1lbWJlci0+Z2V0X3R5cGUoKSwgdG1lbWJlci0+Z2V0X3ZhbHVlKCkpIDw8IGVuZGw7CisgICAgZWxzZQorICAgICAgb3V0IDw8ICJTb21lICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHRtZW1iZXItPmdldF90eXBlKCksIHRtZW1iZXItPmdldF92YWx1ZSgpKSA8PCBlbmRsOworICB9IGVsc2UgeworICAgIG91dCA8PCAiTm9uZSIgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIENoZWNrIHdoZXRoZXIgYSBtZW1iZXIgb2YgdGhlIHN0cnVjdHVyZSBjYW4gbm90IGhhdmUgdW5kZWZpbmVkIHZhbHVlCisgKgorICogQHBhcmFtIHRtZW1iZXIgTWVtYmVyIGRlZmluaXRpb24KKyAqLworYm9vbCB0X29jYW1sX2dlbmVyYXRvcjo6c3RydWN0X21lbWJlcl9wZXJzaXN0ZW50KHRfZmllbGQqIHRtZW1iZXIpIHsKKyAgdF9jb25zdF92YWx1ZSogdmFsID0gdG1lbWJlci0+Z2V0X3ZhbHVlKCk7CisgIHJldHVybiAodmFsID8gdHJ1ZSA6IGZhbHNlKTsKK30KKworLyoqCisgKiBDaGVjayB3aGV0aGVyIGEgbWVtYmVyIG9mIHRoZSBzdHJ1Y3R1cmUgY2FuIGJlIHNraXBwZWQgZHVyaW5nIGVuY29kaW5nCisgKgorICogQHBhcmFtIHRtZW1iZXIgTWVtYmVyIGRlZmluaXRpb24KKyAqLworYm9vbCB0X29jYW1sX2dlbmVyYXRvcjo6c3RydWN0X21lbWJlcl9vbWl0YWJsZSh0X2ZpZWxkKiB0bWVtYmVyKSB7CisgIHJldHVybiAodG1lbWJlci0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpOworfQorCisvKioKKyAqIEZpZ3VyZSBvdXQgd2hldGhlciBhIG1lbWJlciBvZiB0aGUgc3RydWN0dXJlIGhhcworICogYSBjaGVhcGx5IGNvbXBhcmFibGUgZGVmYXVsdCB2YWx1ZS4KKyAqCisgKiBAcGFyYW0gdG1lbWJlciBNZW1iZXIgZGVmaW5pdGlvbgorICovCitib29sIHRfb2NhbWxfZ2VuZXJhdG9yOjpzdHJ1Y3RfbWVtYmVyX2RlZmF1bHRfY2hlYXBseV9jb21wYXJhYmxlKHRfZmllbGQqIHRtZW1iZXIpIHsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0bWVtYmVyLT5nZXRfdHlwZSgpKTsKKyAgdF9jb25zdF92YWx1ZSogdmFsID0gdG1lbWJlci0+Z2V0X3ZhbHVlKCk7CisgIGlmICghdmFsKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgLy8gQmFzZSB0eXBlcyBhcmUgZ2VuZXJhbGx5IGNoZWFwbHkgY29tcGFyZWQgZm9yIHN0cnVjdHVyYWwgZXF1aXZhbGVuY2UuCisgICAgc3dpdGNoICgoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgaWYgKHZhbC0+Z2V0X2RvdWJsZSgpID09IDAuMCkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIC8vIEVtcHR5IGxpc3RzIGFyZSBjaGVhcGx5IGNvbXBhcmVkIGZvciBzdHJ1Y3R1cmFsIGVxdWl2YWxlbmNlLgorICAgIC8vIElzIGVtcHR5IGxpc3Q/CisgICAgaWYgKHZhbC0+Z2V0X2xpc3QoKS5zaXplKCkgPT0gMCkKKyAgICAgIHJldHVybiB0cnVlOworICAgIGVsc2UKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZGF0YSB0eXBlLgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3Rfc2lnKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisgIHN0cmluZyB0bmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0KTsKKyAgaW5kZW50KG91dCkgPDwgImNsYXNzICIgPDwgdG5hbWUgPDwgIiA6IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAib2JqZWN0ICgnYSkiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisKKyAgc3RyaW5nIHggPSB0bXAoIl94Iik7CisgIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBzdHJpbmcgbW5hbWUgPSBkZWNhcGl0YWxpemUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICAgIHN0cmluZyB0eXBlID0gcmVuZGVyX29jYW1sX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJtZXRob2QgZ2V0XyIgPDwgbW5hbWUgPDwgIiA6ICIgPDwgdHlwZSA8PCAiIG9wdGlvbiIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJtZXRob2QgZ3JhYl8iIDw8IG1uYW1lIDw8ICIgOiAiIDw8IHR5cGUgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJtZXRob2Qgc2V0XyIgPDwgbW5hbWUgPDwgIiA6ICIgPDwgdHlwZSA8PCAiIC0+IHVuaXQiIDw8IGVuZGw7CisgICAgICBpZiAoIXN0cnVjdF9tZW1iZXJfcGVyc2lzdGVudCgqbV9pdGVyKSkKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIm1ldGhvZCB1bnNldF8iIDw8IG1uYW1lIDw8ICIgOiB1bml0IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIm1ldGhvZCByZXNldF8iIDw8IG1uYW1lIDw8ICIgOiB1bml0IiA8PCBlbmRsOworICAgIH0KKyAgfQorICBpbmRlbnQob3V0KSA8PCAibWV0aG9kIGNvcHkgOiAnYSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIm1ldGhvZCB3cml0ZSA6IFByb3RvY29sLnQgLT4gdW5pdCIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgImVuZCIgPDwgZW5kbDsKKworICBpZiAoaXNfZXhjZXB0aW9uKSB7CisgICAgaW5kZW50KG91dCkgPDwgImV4Y2VwdGlvbiAiIDw8IGNhcGl0YWxpemUodG5hbWUpIDw8ICIgb2YgIiA8PCB0bmFtZSA8PCBlbmRsOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgInZhbCByZWFkXyIgPDwgdG5hbWUgPDwgIiA6IFByb3RvY29sLnQgLT4gIiA8PCB0bmFtZSA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyB0aGUgcmVhZCBtZXRob2QgZm9yIGEgc3RydWN0CisgKi8KK3ZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX29jYW1sX3N0cnVjdF9yZWFkZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIHN0cmluZyBzbmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0KTsKKyAgc3RyaW5nIHN0ciA9IHRtcCgiX3N0ciIpOworICBzdHJpbmcgdCA9IHRtcCgiX3QiKTsKKyAgc3RyaW5nIGlkID0gdG1wKCJfaWQiKTsKKyAgaW5kZW50KG91dCkgPDwgImxldCByZWMgcmVhZF8iIDw8IHNuYW1lIDw8ICIgKGlwcm90IDogUHJvdG9jb2wudCkgPSIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJsZXQgIiA8PCBzdHIgPDwgIiA9IG5ldyAiIDw8IHNuYW1lIDw8ICIgaW4iIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAiaWdub3JlKGlwcm90I3JlYWRTdHJ1Y3RCZWdpbik7IiA8PCBlbmRsOworCisgIC8vIExvb3Agb3ZlciByZWFkaW5nIGluIGZpZWxkcworICBpbmRlbnQob3V0KSA8PCAiKHRyeSB3aGlsZSB0cnVlIGRvIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gUmVhZCBiZWdpbm5pbmcgZmllbGQgbWFya2VyCisgIGluZGVudChvdXQpIDw8ICJsZXQgKF8sIiA8PCB0IDw8ICIsIiA8PCBpZCA8PCAiKSA9IGlwcm90I3JlYWRGaWVsZEJlZ2luIGluIiA8PCBlbmRsOworCisgIC8vIENoZWNrIGZvciBmaWVsZCBTVE9QIG1hcmtlciBhbmQgYnJlYWsKKyAgaW5kZW50KG91dCkgPDwgImlmICIgPDwgdCA8PCAiID0gUHJvdG9jb2wuVF9TVE9QIHRoZW4iIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAicmFpc2UgQnJlYWsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJlbHNlICgpOyIgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAiKG1hdGNoICIgPDwgaWQgPDwgIiB3aXRoICIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIC8vIEdlbmVyYXRlIGRlc2VyaWFsaXphdGlvbiBjb2RlIGZvciBrbm93biBjYXNlcworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGluZGVudChvdXQpIDw8ICJ8ICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIiAtPiAoIjsKKyAgICBvdXQgPDwgImlmICIgPDwgdCA8PCAiID0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiIHRoZW4iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50X3VwKCk7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCBzdHIpOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJlbHNlIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIGlwcm90I3NraXAgIiA8PCB0IDw8ICIpIiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICAvLyBJbiB0aGUgZGVmYXVsdCBjYXNlIHdlIHNraXAgdGhlIGZpZWxkCisgIG91dCA8PCBpbmRlbnQoKSA8PCAifCBfIC0+ICIKKyAgICAgIDw8ICJpcHJvdCNza2lwICIgPDwgdCA8PCAiKTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIC8vIFJlYWQgZmllbGQgZW5kIG1hcmtlcgorICBpbmRlbnQob3V0KSA8PCAiaXByb3QjcmVhZEZpZWxkRW5kOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgImRvbmU7ICgpIiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAid2l0aCBCcmVhayAtPiAoKSk7IiA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJpcHJvdCNyZWFkU3RydWN0RW5kOyIgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCBzdHIgPDwgZW5kbCA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnRfZG93bigpOworfQorCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3Rfd3JpdGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBzdHJpbmcgc3RyID0gdG1wKCJfc3RyIik7CisgIHN0cmluZyBmID0gdG1wKCJfZiIpOworCisgIGluZGVudChvdXQpIDw8ICJtZXRob2Qgd3JpdGUgKG9wcm90IDogUHJvdG9jb2wudCkgPSIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJvcHJvdCN3cml0ZVN0cnVjdEJlZ2luIFwiIiA8PCBuYW1lIDw8ICJcIjsiIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiB0bWVtYmVyID0gKCpmX2l0ZXIpOworICAgIHN0cmluZyBtbmFtZSA9ICJfIiArIGRlY2FwaXRhbGl6ZSh0bWVtYmVyLT5nZXRfbmFtZSgpKTsKKyAgICBzdHJpbmcgX3Y7CisKKyAgICBpZiAoc3RydWN0X21lbWJlcl9wZXJzaXN0ZW50KHRtZW1iZXIpKSB7CisKKyAgICAgIGlmIChzdHJ1Y3RfbWVtYmVyX29taXRhYmxlKHRtZW1iZXIpICYmIHN0cnVjdF9tZW1iZXJfZGVmYXVsdF9jaGVhcGx5X2NvbXBhcmFibGUodG1lbWJlcikpIHsKKyAgICAgICAgX3YgPSAiX3YiOworICAgICAgICAvLyBBdm9pZCByZWR1bmRhbnQgZW5jb2Rpbmcgb2YgbWVtYmVycyBoYXZpbmcgZGVmYXVsdCB2YWx1ZXMuCisgICAgICAgIGluZGVudChvdXQpIDw8ICIobWF0Y2ggIiA8PCBtbmFtZSA8PCAiIHdpdGggIgorICAgICAgICAgICAgICAgICAgICA8PCByZW5kZXJfY29uc3RfdmFsdWUodG1lbWJlci0+Z2V0X3R5cGUoKSwgdG1lbWJlci0+Z2V0X3ZhbHVlKCkpIDw8ICIgLT4gKCkgfCAiCisgICAgICAgICAgICAgICAgICAgIDw8IF92IDw8ICIgLT4gIiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgX3YgPSBtbmFtZTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIigiIDw8IGVuZGw7CisgICAgICB9CisKKyAgICB9IGVsc2UgeworCisgICAgICBpbmRlbnQob3V0KSA8PCAiKG1hdGNoICIgPDwgbW5hbWUgPDwgIiB3aXRoICI7CisKKyAgICAgIGlmIChzdHJ1Y3RfbWVtYmVyX29taXRhYmxlKHRtZW1iZXIpKSB7CisgICAgICAgIG91dCA8PCAiTm9uZSAtPiAoKSI7CisKKyAgICAgICAgaWYgKHN0cnVjdF9tZW1iZXJfZGVmYXVsdF9jaGVhcGx5X2NvbXBhcmFibGUodG1lbWJlcikpIHsKKyAgICAgICAgICAvLyBBdm9pZCByZWR1bmRhbnQgZW5jb2Rpbmcgb2YgbWVtYmVycyBoYXZpbmcgZGVmYXVsdCB2YWx1ZXMuCisgICAgICAgICAgb3V0IDw8ICIgfCBTb21lICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHRtZW1iZXItPmdldF90eXBlKCksIHRtZW1iZXItPmdldF92YWx1ZSgpKQorICAgICAgICAgICAgICA8PCAiIC0+ICgpIjsKKyAgICAgICAgfQorICAgICAgICBvdXQgPDwgIiB8IFNvbWUgX3YgLT4gIiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0IDw8IGVuZGw7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJ8IE5vbmUgLT4gcmFpc2UgKEZpZWxkX2VtcHR5IFwiIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIi4iIDw8IG1uYW1lCisgICAgICAgICAgICAgICAgICAgIDw8ICJcIikiIDw8IGVuZGw7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJ8IFNvbWUgX3YgLT4gIiA8PCBlbmRsOworICAgICAgfQorCisgICAgICBfdiA9ICJfdiI7CisgICAgfQorICAgIGluZGVudF91cCgpOworICAgIC8vIFdyaXRlIGZpZWxkIGhlYWRlcgorICAgIGluZGVudChvdXQpIDw8ICJvcHJvdCN3cml0ZUZpZWxkQmVnaW4oXCIiIDw8IHRtZW1iZXItPmdldF9uYW1lKCkgPDwgIlwiLCIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0odG1lbWJlci0+Z2V0X3R5cGUoKSkgPDwgIiwiIDw8IHRtZW1iZXItPmdldF9rZXkoKSA8PCAiKTsiIDw8IGVuZGw7CisKKyAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsIHRtZW1iZXIsIF92KTsKKworICAgIC8vIFdyaXRlIGZpZWxkIGNsb3NlcgorICAgIGluZGVudChvdXQpIDw8ICJvcHJvdCN3cml0ZUZpZWxkRW5kIiA8PCBlbmRsOworCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiKTsiIDw8IGVuZGw7CisgIH0KKworICAvLyBXcml0ZSB0aGUgc3RydWN0IG1hcAorICBvdXQgPDwgaW5kZW50KCkgPDwgIm9wcm90I3dyaXRlRmllbGRTdG9wOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qjd3JpdGVTdHJ1Y3RFbmQiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSB0aHJpZnQgc2VydmljZS4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgorICovCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGZfc2VydmljZV9uYW1lID0gZ2V0X291dF9kaXIoKSArIGNhcGl0YWxpemUoc2VydmljZV9uYW1lXykgKyAiLm1sIjsKKyAgZl9zZXJ2aWNlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOworICBzdHJpbmcgZl9zZXJ2aWNlX2lfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBjYXBpdGFsaXplKHNlcnZpY2VfbmFtZV8pICsgIi5tbGkiOworICBmX3NlcnZpY2VfaV8ub3BlbihmX3NlcnZpY2VfaV9uYW1lLmNfc3RyKCkpOworCisgIGZfc2VydmljZV8gPDwgb2NhbWxfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbCA8PCBvY2FtbF9pbXBvcnRzKCkgPDwgZW5kbDsKKyAgZl9zZXJ2aWNlX2lfIDw8IG9jYW1sX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGwgPDwgb2NhbWxfaW1wb3J0cygpIDw8IGVuZGw7CisKKyAgLyogaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBmX3NlcnZpY2VfIDw8CisgICAgICAib3BlbiAiIDw8IGNhcGl0YWxpemUodHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkpIDw8IGVuZGw7CisgICAgZl9zZXJ2aWNlX2lfIDw8CisgICAgICAib3BlbiAiIDw8IGNhcGl0YWxpemUodHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkpIDw8IGVuZGw7CisgIH0KKyAgKi8KKyAgZl9zZXJ2aWNlXyA8PCAib3BlbiAiIDw8IGNhcGl0YWxpemUocHJvZ3JhbV9uYW1lXykgPDwgIl90eXBlcyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGZfc2VydmljZV9pXyA8PCAib3BlbiAiIDw8IGNhcGl0YWxpemUocHJvZ3JhbV9uYW1lXykgPDwgIl90eXBlcyIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSB0aHJlZSBtYWluIHBhcnRzIG9mIHRoZSBzZXJ2aWNlCisgIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0c2VydmljZSk7CisKKyAgLy8gQ2xvc2Ugc2VydmljZSBmaWxlCisgIGZfc2VydmljZV8uY2xvc2UoKTsKKyAgZl9zZXJ2aWNlX2lfLmNsb3NlKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGhlbHBlciBmdW5jdGlvbnMgZm9yIGEgc2VydmljZS4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKKyAqLwordm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIoKiBIRUxQRVIgRlVOQ1RJT05TIEFORCBTVFJVQ1RVUkVTICopIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X3N0cnVjdCogdHMgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgZ2VuZXJhdGVfb2NhbWxfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgdHMsIGZhbHNlKTsKKyAgICBnZW5lcmF0ZV9vY2FtbF9mdW5jdGlvbl9oZWxwZXJzKCpmX2l0ZXIpOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGFuZCBoZWxwZXJzIGZvciBhIGZ1bmN0aW9uLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uCisgKi8KK3ZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX29jYW1sX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgZGVjYXBpdGFsaXplKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgKyAiX3Jlc3VsdCIpOworICB0X2ZpZWxkIHN1Y2Nlc3ModGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOworICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7CisgIH0KKworICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICByZXN1bHQuYXBwZW5kKCpmX2l0ZXIpOworICB9CisgIGdlbmVyYXRlX29jYW1sX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sICZyZXN1bHQsIGZhbHNlKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGludGVyZmFjZSBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgorICovCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImNsYXNzIHZpcnR1YWwgaWZhY2UgPSIgPDwgZW5kbCA8PCAib2JqZWN0IChzZWxmKSIgPDwgZW5kbDsKKyAgZl9zZXJ2aWNlX2lfIDw8IGluZGVudCgpIDw8ICJjbGFzcyB2aXJ0dWFsIGlmYWNlIDoiIDw8IGVuZGwgPDwgIm9iamVjdCIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIHN0cmluZyBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImluaGVyaXQgIiA8PCBleHRlbmRzIDw8ICIuaWZhY2UiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV9pXykgPDwgImluaGVyaXQgIiA8PCBleHRlbmRzIDw8ICIuaWZhY2UiIDw8IGVuZGw7CisgIH0KKworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBzdHJpbmcgZnQgPSBmdW5jdGlvbl90eXBlKCpmX2l0ZXIsIHRydWUsIHRydWUpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm1ldGhvZCB2aXJ0dWFsICIgPDwgZGVjYXBpdGFsaXplKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiA6ICIKKyAgICAgICAgICAgICAgIDw8IGZ0IDw8IGVuZGw7CisgICAgZl9zZXJ2aWNlX2lfIDw8IGluZGVudCgpIDw8ICJtZXRob2QgdmlydHVhbCAiIDw8IGRlY2FwaXRhbGl6ZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIgOiAiCisgICAgICAgICAgICAgICAgIDw8IGZ0IDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJlbmQiIDw8IGVuZGwgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV9pXykgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGRlZmluaXRpb24uIE5vdGUgdGhhdCBpbiBPQ2FtbCwgdGhlIGNsaWVudCBkb2Vzbid0IGltcGxlbWVudCBpZmFjZS4KKyAqVGhpcyBpcyBiZWNhdXNlCisgKiBUaGUgY2xpZW50IGRvZXMgbm90IChhbmQgc2hvdWxkIG5vdCBoYXZlIHRvKSBkZWFsIHdpdGggYXJndW1lbnRzIGJlaW5nIE5vbmUuCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KKyAqLwordm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImNsYXNzIGNsaWVudCAoaXByb3QgOiBQcm90b2NvbC50KSAob3Byb3QgOiBQcm90b2NvbC50KSA9IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICA8PCAib2JqZWN0IChzZWxmKSIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV9pXykgPDwgImNsYXNzIGNsaWVudCA6IFByb3RvY29sLnQgLT4gUHJvdG9jb2wudCAtPiAiIDw8IGVuZGwgPDwgIm9iamVjdCIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImluaGVyaXQgIiA8PCBleHRlbmRzIDw8ICIuY2xpZW50IGlwcm90IG9wcm90IGFzIHN1cGVyIiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfaV8pIDw8ICJpbmhlcml0ICIgPDwgZXh0ZW5kcyA8PCAiLmNsaWVudCIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInZhbCBtdXRhYmxlIHNlcWlkID0gMCIgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSBjbGllbnQgbWV0aG9kIGltcGxlbWVudGF0aW9ucworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOworICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworCisgICAgLy8gT3BlbiBmdW5jdGlvbgorICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAibWV0aG9kICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8ICIgPSAiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV9pXykgPDwgIm1ldGhvZCAiIDw8IGRlY2FwaXRhbGl6ZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIgOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZnVuY3Rpb25fdHlwZSgqZl9pdGVyLCB0cnVlLCBmYWxzZSkgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInNlbGYjc2VuZF8iIDw8IGZ1bm5hbWU7CisKKyAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgICAgZl9zZXJ2aWNlXyA8PCAiICIgPDwgZGVjYXBpdGFsaXplKCgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCAiOyIgPDwgZW5kbDsKKworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKKyAgICAgIGZfc2VydmljZV8gPDwgInNlbGYjcmVjdl8iIDw8IGZ1bm5hbWUgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAibWV0aG9kIHByaXZhdGUgc2VuZF8iIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCAiID0gIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgc3RkOjpzdHJpbmcgYXJnc25hbWUgPSBkZWNhcGl0YWxpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9hcmdzIik7CisKKyAgICAvLyBTZXJpYWxpemUgdGhlIHJlcXVlc3QgaGVhZGVyCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAib3Byb3Qjd3JpdGVNZXNzYWdlQmVnaW4gKFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiLCAiCisgICAgICAgICAgICAgICA8PCAoKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSA/ICJQcm90b2NvbC5PTkVXQVkiIDogIlByb3RvY29sLkNBTEwiKSA8PCAiLCBzZXFpZCk7IgorICAgICAgICAgICAgICAgPDwgZW5kbDsKKworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImxldCBhcmdzID0gbmV3ICIgPDwgYXJnc25hbWUgPDwgIiBpbiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJhcmdzI3NldF8iIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIgorICAgICAgICAgICAgICAgICA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICAvLyBXcml0ZSB0byB0aGUgc3RyZWFtCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiYXJncyN3cml0ZSBvcHJvdDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90I3dyaXRlTWVzc2FnZUVuZDsiCisgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdCNnZXRUcmFuc3BvcnQjZmx1c2giIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudF9kb3duKCk7CisKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIHN0ZDo6c3RyaW5nIHJlc3VsdG5hbWUgPSBkZWNhcGl0YWxpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKKyAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7CisKKyAgICAgIHRfZnVuY3Rpb24gcmVjdl9mdW5jdGlvbigoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJyZWN2XyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZub2FyZ3MpOworICAgICAgLy8gT3BlbiBmdW5jdGlvbgorICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAibWV0aG9kIHByaXZhdGUgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnJlY3ZfZnVuY3Rpb24pIDw8ICIgPSIKKyAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworCisgICAgICAvLyBUT0RPKG1jc2xlZSk6IFZhbGlkYXRlIG1lc3NhZ2UgcmVwbHkgaGVyZSwgc2VxIGlkcyBldGMuCisKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImxldCAoZm5hbWUsIG10eXBlLCByc2VxaWQpID0gaXByb3QjcmVhZE1lc3NhZ2VCZWdpbiBpbiIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiKGlmIG10eXBlID0gUHJvdG9jb2wuRVhDRVBUSU9OIHRoZW4iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgPDwgIiAgbGV0IHggPSBBcHBsaWNhdGlvbl9FeG4ucmVhZCBpcHJvdCBpbiIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICAoaXByb3QjcmVhZE1lc3NhZ2VFbmQ7IiA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAiICAgcmFpc2UgKEFwcGxpY2F0aW9uX0V4bi5FIHgpKSIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJlbHNlICgpKTsiIDw8IGVuZGw7CisgICAgICBzdHJpbmcgcmVzID0gIl8iOworCisgICAgICB0X3N0cnVjdCogeHMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKKyAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisKKyAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkgfHwgeGNlcHRpb25zLnNpemUoKSA+IDApIHsKKyAgICAgICAgcmVzID0gInJlc3VsdCI7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJsZXQgIiA8PCByZXMgPDwgIiA9IHJlYWRfIiA8PCByZXN1bHRuYW1lIDw8ICIgaXByb3QgaW4iIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlwcm90I3JlYWRNZXNzYWdlRW5kOyIgPDwgZW5kbDsKKworICAgICAgLy8gQ2FyZWZ1bCwgb25seSByZXR1cm4gX3Jlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCisgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm1hdGNoIHJlc3VsdCNnZXRfc3VjY2VzcyB3aXRoIFNvbWUgdiAtPiB2IHwgTm9uZSAtPiAoIiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIH0KKworICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiKG1hdGNoIHJlc3VsdCNnZXRfIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICA8PCAiIHdpdGggTm9uZSAtPiAoKSB8IFNvbWUgX3YgLT4iIDw8IGVuZGw7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICByYWlzZSAoIiA8PCBjYXBpdGFsaXplKHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBfdikpOyIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgLy8gQ2FyZWZ1bCwgb25seSByZXR1cm4gX3Jlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCisgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIoKSIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfc2VydmljZV8KKyAgICAgICAgICAgIDw8IGluZGVudCgpCisgICAgICAgICAgICA8PCAicmFpc2UgKEFwcGxpY2F0aW9uX0V4bi5FIChBcHBsaWNhdGlvbl9FeG4uY3JlYXRlIEFwcGxpY2F0aW9uX0V4bi5NSVNTSU5HX1JFU1VMVCBcIiIKKyAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZhaWxlZDogdW5rbm93biByZXN1bHRcIikpKSIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIH0KKworICAgICAgLy8gQ2xvc2UgZnVuY3Rpb24KKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICB9CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlX2lfKSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgorICovCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIC8vIEdlbmVyYXRlIHRoZSBkaXNwYXRjaCBtZXRob2RzCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworCisgIC8vIEdlbmVyYXRlIHRoZSBoZWFkZXIgcG9ydGlvbgorICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImNsYXNzIHByb2Nlc3NvciAoaGFuZGxlciA6IGlmYWNlKSA9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvYmplY3QgKHNlbGYpIgorICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV9pXykgPDwgImNsYXNzIHByb2Nlc3NvciA6IGlmYWNlIC0+IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvYmplY3QiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImluaGVyaXQgUHJvY2Vzc29yLnQiIDw8IGVuZGwgPDwgZW5kbDsKKyAgZl9zZXJ2aWNlX2lfIDw8IGluZGVudCgpIDw8ICJpbmhlcml0IFByb2Nlc3Nvci50IiA8PCBlbmRsIDw8IGVuZGw7CisgIHN0cmluZyBleHRlbmRzID0gIiI7CisKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImluaGVyaXQgIiArIGV4dGVuZHMgKyAiLnByb2Nlc3NvciAoaGFuZGxlciA6PiAiICsgZXh0ZW5kcyArICIuaWZhY2UpIgorICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfaV8pIDw8ICJpbmhlcml0ICIgKyBleHRlbmRzICsgIi5wcm9jZXNzb3IiIDw8IGVuZGw7CisgIH0KKworICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ2YWwgcHJvY2Vzc01hcCA9IEhhc2h0YmwuY3JlYXRlICIgPDwgZnVuY3Rpb25zLnNpemUoKSA8PCBlbmRsOworICB9CisgIGluZGVudChmX3NlcnZpY2VfaV8pCisgICAgICA8PCAidmFsIHByb2Nlc3NNYXAgOiAoc3RyaW5nLCBpbnQgKiBQcm90b2NvbC50ICogUHJvdG9jb2wudCAtPiB1bml0KSBIYXNodGJsLnQiIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHNlcnZlciBpbXBsZW1lbnRhdGlvbgorICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIm1ldGhvZCBwcm9jZXNzIGlwcm90IG9wcm90ID0iIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfaV8pIDw8ICJtZXRob2QgcHJvY2VzcyA6IFByb3RvY29sLnQgLT4gUHJvdG9jb2wudCAtPiBib29sIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJsZXQgKG5hbWUsIHR5cCwgc2VxaWQpICA9IGlwcm90I3JlYWRNZXNzYWdlQmVnaW4gaW4iIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICAvLyBUT0RPKG1jc2xlZSk6IHZhbGlkYXRlIG1lc3NhZ2UKKworICAvLyBIT1Q6IGRpY3Rpb25hcnkgZnVuY3Rpb24gbG9va3VwCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIEhhc2h0YmwubWVtIHByb2Nlc3NNYXAgbmFtZSB0aGVuIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgIiAgKEhhc2h0YmwuZmluZCBwcm9jZXNzTWFwIG5hbWUpIChzZXFpZCwgaXByb3QsIG9wcm90KSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICJlbHNlICgiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgaXByb3Qjc2tpcChQcm90b2NvbC5UX1NUUlVDVCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgaXByb3QjcmVhZE1lc3NhZ2VFbmQ7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgIiAgbGV0IHggPSBBcHBsaWNhdGlvbl9FeG4uY3JlYXRlIEFwcGxpY2F0aW9uX0V4bi5VTktOT1dOX01FVEhPRCAoXCJVbmtub3duICIKKyAgICAgICAgICAgICAgICAiZnVuY3Rpb24gXCJebmFtZSkgaW4iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAiICAgIG9wcm90I3dyaXRlTWVzc2FnZUJlZ2luKG5hbWUsIFByb3RvY29sLkVYQ0VQVElPTiwgc2VxaWQpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICIgICAgeCN3cml0ZSBvcHJvdDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgICBvcHJvdCN3cml0ZU1lc3NhZ2VFbmQ7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgICBvcHJvdCNnZXRUcmFuc3BvcnQjZmx1c2giIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIik7IiA8PCBlbmRsOworCisgIC8vIFJlYWQgZW5kIG9mIGFyZ3MgZmllbGQsIHRoZSBUX1NUT1AsIGFuZCB0aGUgc3RydWN0IGNsb3NlCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRydWUiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudF9kb3duKCk7CisgIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzIHN1YmZ1bmN0aW9ucworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odHNlcnZpY2UsICpmX2l0ZXIpOworICB9CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpbml0aWFsaXplciIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiSGFzaHRibC5hZGQgcHJvY2Vzc01hcCBcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICA8PCAiXCIgc2VsZiNwcm9jZXNzXyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJlbmQiIDw8IGVuZGwgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV9pXykgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHByb2Nlc3MgZnVuY3Rpb24gZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byB3cml0ZSBhIGRpc3BhdGNoZXIgZm9yCisgKi8KK3ZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgICh2b2lkKXRzZXJ2aWNlOworICAvLyBPcGVuIGZ1bmN0aW9uCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAibWV0aG9kIHByaXZhdGUgcHJvY2Vzc18iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgPDwgIiAoc2VxaWQsIGlwcm90LCBvcHJvdCkgPSIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgc3RyaW5nIGFyZ3NuYW1lID0gZGVjYXBpdGFsaXplKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgKyAiX2FyZ3MiOworICBzdHJpbmcgcmVzdWx0bmFtZSA9IGRlY2FwaXRhbGl6ZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpICsgIl9yZXN1bHQiOworCisgIC8vIEdlbmVyYXRlIHRoZSBmdW5jdGlvbiBjYWxsCisgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBzdHJpbmcgYXJncyA9ICJhcmdzIjsKKyAgaWYgKGZpZWxkcy5zaXplKCkgPT0gMCkgeworICAgIGFyZ3MgPSAiXyI7CisgIH0KKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJsZXQgIiA8PCBhcmdzIDw8ICIgPSByZWFkXyIgPDwgYXJnc25hbWUgPDwgIiBpcHJvdCBpbiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlwcm90I3JlYWRNZXNzYWdlRW5kOyIgPDwgZW5kbDsKKworICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworCisgIC8vIERlY2xhcmUgcmVzdWx0IGZvciBub24gb25ld2F5IGZ1bmN0aW9uCisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImxldCByZXN1bHQgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIgaW4iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgIH0KKworICAvLyBUcnkgYmxvY2sgZm9yIGEgZnVuY3Rpb24gd2l0aCBleGNlcHRpb25zCisgIGlmICh4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIih0cnkiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgIH0KKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAicmVzdWx0I3NldF9zdWNjZXNzICI7CisgIH0KKyAgZl9zZXJ2aWNlXyA8PCAiKGhhbmRsZXIjIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCk7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAiIGFyZ3MjZ2V0XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICB9CisgIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOworCisgIGlmICh4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgeworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ3aXRoIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ8ICIgPDwgY2FwaXRhbGl6ZSh0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpKSkgPDwgIiAiCisgICAgICAgICAgICAgICAgIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIC0+ICIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0I3NldF8iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICIKKyAgICAgICAgICAgICAgICAgICA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiKCkiOworICAgICAgfQorICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiKTsiIDw8IGVuZGw7CisgIH0KKworICAvLyBTaG9ydGN1dCBvdXQgaGVyZSBmb3Igb25ld2F5IGZ1bmN0aW9ucworICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIigpIiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICByZXR1cm47CisgIH0KKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJvcHJvdCN3cml0ZU1lc3NhZ2VCZWdpbiAoXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgIDw8ICJcIiwgUHJvdG9jb2wuUkVQTFksIHNlcWlkKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJlc3VsdCN3cml0ZSBvcHJvdDsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAib3Byb3Qjd3JpdGVNZXNzYWdlRW5kOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICJvcHJvdCNnZXRUcmFuc3BvcnQjZmx1c2giIDw8IGVuZGw7CisKKyAgLy8gQ2xvc2UgZnVuY3Rpb24KKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50X2Rvd24oKTsKK30KKworLyoqCisgKiBEZXNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KKyAqLwordm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBwcmVmaXgpIHsKKyAgdF90eXBlKiB0eXBlID0gdGZpZWxkLT5nZXRfdHlwZSgpOworCisgIHN0cmluZyBuYW1lID0gZGVjYXBpdGFsaXplKHRmaWVsZC0+Z2V0X25hbWUoKSk7CisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiI3NldF8iIDw8IG5hbWUgPDwgIiAiOworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV90eXBlKG91dCwgdHlwZSk7CisgIG91dCA8PCBlbmRsOworfQorCisvKioKKyAqIERlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgorICovCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV90eXBlKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIERFU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRSI7CisgIH0KKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIG91dCA8PCAiaXByb3QjIjsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgb3V0IDw8ICJyZWFkU3RyaW5nIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIG91dCA8PCAicmVhZEJvb2wiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIG91dCA8PCAicmVhZEJ5dGUiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICBvdXQgPDwgInJlYWRJMTYiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICBvdXQgPDwgInJlYWRJMzIiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICBvdXQgPDwgInJlYWRJNjQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICBvdXQgPDwgInJlYWREb3VibGUiOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gb2NhbWwgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBzdHJpbmcgZW5hbWUgPSBjYXBpdGFsaXplKHR5cGUtPmdldF9uYW1lKCkpOworICAgIG91dCA8PCAiKCIgPDwgZW5hbWUgPDwgIi5vZl9pIGlwcm90I3JlYWRJMzIpIjsKKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBERVNFUklBTElaRSBUWVBFICclcydcbiIsIHR5cGUtPmdldF9uYW1lKCkuY19zdHIoKSk7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYW4gdW5zZXJpYWxpemVyIGZvciBhIHN0cnVjdCwgY2FsbGluZyByZWFkKCkKKyAqLwordm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgc3RyaW5nIHByZWZpeCA9ICIiOworICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0c3RydWN0LT5nZXRfcHJvZ3JhbSgpOworICBpZiAocHJvZ3JhbSAhPSBOVUxMICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pIHsKKyAgICBwcmVmaXggPSBjYXBpdGFsaXplKHByb2dyYW0tPmdldF9uYW1lKCkpICsgIl90eXBlcy4iOworICB9CisgIHN0cmluZyBuYW1lID0gZGVjYXBpdGFsaXplKHRzdHJ1Y3QtPmdldF9uYW1lKCkpOworICBvdXQgPDwgIigiIDw8IHByZWZpeCA8PCAicmVhZF8iIDw8IG5hbWUgPDwgIiBpcHJvdCkiOworfQorCisvKioKKyAqIFNlcmlhbGl6ZSBhIGNvbnRhaW5lciBieSB3cml0aW5nIG91dCB0aGUgaGVhZGVyIGZvbGxvd2VkIGJ5CisgKiBkYXRhIGFuZCB0aGVuIGEgZm9vdGVyLgorICovCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlKSB7CisgIHN0cmluZyBzaXplID0gdG1wKCJfc2l6ZSIpOworICBzdHJpbmcga3R5cGUgPSB0bXAoIl9rdHlwZSIpOworICBzdHJpbmcgdnR5cGUgPSB0bXAoIl92dHlwZSIpOworICBzdHJpbmcgZXR5cGUgPSB0bXAoIl9ldHlwZSIpOworICBzdHJpbmcgY29uID0gdG1wKCJfY29uIik7CisKKyAgdF9maWVsZCBmc2l6ZShnX3R5cGVfaTMyLCBzaXplKTsKKyAgdF9maWVsZCBma3R5cGUoZ190eXBlX2k4LCBrdHlwZSk7CisgIHRfZmllbGQgZnZ0eXBlKGdfdHlwZV9pOCwgdnR5cGUpOworICB0X2ZpZWxkIGZldHlwZShnX3R5cGVfaTgsIGV0eXBlKTsKKworICBvdXQgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIC8vIERlY2xhcmUgdmFyaWFibGVzLCByZWFkIGhlYWRlcgorICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIihsZXQgKCIgPDwga3R5cGUgPDwgIiwiIDw8IHZ0eXBlIDw8ICIsIiA8PCBzaXplIDw8ICIpID0gaXByb3QjcmVhZE1hcEJlZ2luIGluIgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgImxldCAiIDw8IGNvbiA8PCAiID0gSGFzaHRibC5jcmVhdGUgIiA8PCBzaXplIDw8ICIgaW4iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgImZvciBpID0gMSB0byAiIDw8IHNpemUgPDwgIiBkbyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAibGV0IF9rID0gIjsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV90eXBlKG91dCwgKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSk7CisgICAgb3V0IDw8ICIgaW4iIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgImxldCBfdiA9ICI7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfdHlwZShvdXQsICgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpOworICAgIG91dCA8PCAiIGluIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJIYXNodGJsLmFkZCAiIDw8IGNvbiA8PCAiIF9rIF92IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiZG9uZTsgaXByb3QjcmVhZE1hcEVuZDsgIiA8PCBjb24gPDwgIikiOworICAgIGluZGVudF9kb3duKCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIihsZXQgKCIgPDwgZXR5cGUgPDwgIiwiIDw8IHNpemUgPDwgIikgPSBpcHJvdCNyZWFkU2V0QmVnaW4gaW4iIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgImxldCAiIDw8IGNvbiA8PCAiID0gSGFzaHRibC5jcmVhdGUgIiA8PCBzaXplIDw8ICIgaW4iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgImZvciBpID0gMSB0byAiIDw8IHNpemUgPDwgIiBkbyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiSGFzaHRibC5hZGQgIiA8PCBjb24gPDwgIiAiOworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3R5cGUob3V0LCAoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSk7CisgICAgb3V0IDw8ICIgdHJ1ZSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJkb25lOyBpcHJvdCNyZWFkU2V0RW5kOyAiIDw8IGNvbiA8PCAiKSI7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIihsZXQgKCIgPDwgZXR5cGUgPDwgIiwiIDw8IHNpemUgPDwgIikgPSBpcHJvdCNyZWFkTGlzdEJlZ2luIGluIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJsZXQgIiA8PCBjb24gPDwgIiA9IChBcnJheS50b19saXN0IChBcnJheS5pbml0ICIgPDwgc2l6ZSA8PCAiIChmdW4gXyAtPiAiOworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3R5cGUob3V0LCAoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpOworICAgIG91dCA8PCAiKSkpIGluIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJpcHJvdCNyZWFkTGlzdEVuZDsgIiA8PCBjb24gPDwgIikiOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorICBpbmRlbnRfZG93bigpOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KKyAqCisgKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCB0byBzZXJpYWxpemUKKyAqIEBwYXJhbSBwcmVmaXggTmFtZSB0byBwcmVwZW5kIHRvIGZpZWxkIG5hbWUKKyAqLwordm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdHJpbmcgbmFtZSkgeworICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisKKyAgLy8gRG8gbm90aGluZyBmb3Igdm9pZCB0eXBlcworICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICB9CisKKyAgaWYgKG5hbWUubGVuZ3RoKCkgPT0gMCkgeworICAgIG5hbWUgPSBkZWNhcGl0YWxpemUodGZpZWxkLT5nZXRfbmFtZSgpKTsKKyAgfQorCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7CisKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3QjIjsKKworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIG91dCA8PCAid3JpdGVTdHJpbmcoIiA8PCBuYW1lIDw8ICIpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIG91dCA8PCAid3JpdGVCb29sKCIgPDwgbmFtZSA8PCAiKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUJ5dGUoIiA8PCBuYW1lIDw8ICIpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUkxNigiIDw8IG5hbWUgPDwgIikiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBvdXQgPDwgIndyaXRlSTMyKCIgPDwgbmFtZSA8PCAiKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIG91dCA8PCAid3JpdGVJNjQoIiA8PCBuYW1lIDw8ICIpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgb3V0IDw8ICJ3cml0ZURvdWJsZSgiIDw8IG5hbWUgPDwgIikiOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gb2NhbWwgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICBzdHJpbmcgZW5hbWUgPSBjYXBpdGFsaXplKHR5cGUtPmdldF9uYW1lKCkpOworICAgICAgb3V0IDw8ICJ3cml0ZUkzMigiIDw8IGVuYW1lIDw8ICIudG9faSAiIDw8IG5hbWUgPDwgIikiOworICAgIH0KKworICB9IGVsc2UgeworICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIFNFUklBTElaRSBGSUVMRCAnJXMnIFRZUEUgJyVzJ1xuIiwKKyAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgIHR5cGUtPmdldF9uYW1lKCkuY19zdHIoKSk7CisgIH0KKyAgb3V0IDw8ICI7IiA8PCBlbmRsOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgYWxsIHRoZSBtZW1iZXJzIG9mIGEgc3RydWN0LgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgdG8gc2VyaWFsaXplCisgKiBAcGFyYW0gcHJlZml4ICBTdHJpbmcgcHJlZml4IHRvIGF0dGFjaCB0byBhbGwgZmllbGRzCisgKi8KK3ZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCkgeworICAodm9pZCl0c3RydWN0OworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiN3cml0ZShvcHJvdCkiOworfQorCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkgeworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90I3dyaXRlTWFwQmVnaW4oIiA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgPDwgIiwiOworICAgIG91dCA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwiOworICAgIG91dCA8PCAiSGFzaHRibC5sZW5ndGggIiA8PCBwcmVmaXggPDwgIik7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdCN3cml0ZVNldEJlZ2luKCIgPDwgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCI7CisgICAgb3V0IDw8ICJIYXNodGJsLmxlbmd0aCAiIDw8IHByZWZpeCA8PCAiKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdCN3cml0ZUxpc3RCZWdpbigiIDw8IHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpCisgICAgICAgICAgICAgICAgPDwgIiwiOworICAgIG91dCA8PCAiTGlzdC5sZW5ndGggIiA8PCBwcmVmaXggPDwgIik7IiA8PCBlbmRsOworICB9CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHN0cmluZyBraXRlciA9IHRtcCgiX2tpdGVyIik7CisgICAgc3RyaW5nIHZpdGVyID0gdG1wKCJfdml0ZXIiKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiSGFzaHRibC5pdGVyIChmdW4gIiA8PCBraXRlciA8PCAiIC0+IGZ1biAiIDw8IHZpdGVyIDw8ICIgLT4gIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIGtpdGVyLCB2aXRlcik7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiKSAiIDw8IHByZWZpeCA8PCAiOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBzdHJpbmcgaXRlciA9IHRtcCgiX2l0ZXIiKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiSGFzaHRibC5pdGVyIChmdW4gIiA8PCBpdGVyIDw8ICIgLT4gZnVuIF8gLT4gIjsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBpdGVyKTsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICIpICIgPDwgcHJlZml4IDw8ICI7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBzdHJpbmcgaXRlciA9IHRtcCgiX2l0ZXIiKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiTGlzdC5pdGVyIChmdW4gIiA8PCBpdGVyIDw8ICIgLT4gIjsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIGl0ZXIpOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIikgIiA8PCBwcmVmaXggPDwgIjsiIDw8IGVuZGw7CisgIH0KKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90I3dyaXRlTWFwRW5kIjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qjd3JpdGVTZXRFbmQiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qjd3JpdGVMaXN0RW5kIjsKKyAgfQorfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBtYXAuCisgKgorICovCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBraXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdml0ZXIpIHsKKyAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksIGtpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmtmaWVsZCk7CisKKyAgdF9maWVsZCB2ZmllbGQodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJnZmaWVsZCk7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIHNldC4KKyAqLwordm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBpdGVyKSB7CisgIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQpOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBsaXN0LgorICovCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RyaW5nIGl0ZXIpIHsKKyAgdF9maWVsZCBlZmllbGQodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQpOworfQorCisvKioKKyAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGZvcm0gJ25hbWUgYXJncycKKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KKyAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KKyAqLworc3RyaW5nIHRfb2NhbWxfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdHJpbmcgcHJlZml4KSB7CisgIHJldHVybiBwcmVmaXggKyBkZWNhcGl0YWxpemUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSArICIgIgorICAgICAgICAgKyBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSk7Cit9CisKK3N0cmluZyB0X29jYW1sX2dlbmVyYXRvcjo6ZnVuY3Rpb25fdHlwZSh0X2Z1bmN0aW9uKiB0ZnVuYywgYm9vbCBtZXRob2QsIGJvb2wgb3B0aW9ucykgeworICBzdHJpbmcgcmVzdWx0ID0gIiI7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdGZ1bmMtPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICByZXN1bHQgKz0gcmVuZGVyX29jYW1sX3R5cGUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICBpZiAob3B0aW9ucykKKyAgICAgIHJlc3VsdCArPSAiIG9wdGlvbiI7CisgICAgcmVzdWx0ICs9ICIgLT4gIjsKKyAgfQorICBpZiAoZmllbGRzLmVtcHR5KCkgJiYgIW1ldGhvZCkgeworICAgIHJlc3VsdCArPSAidW5pdCAtPiAiOworICB9CisgIHJlc3VsdCArPSByZW5kZXJfb2NhbWxfdHlwZSh0ZnVuYy0+Z2V0X3JldHVybnR5cGUoKSk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZpZWxkIGxpc3QKKyAqLworc3RyaW5nIHRfb2NhbWxfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ICs9ICIgIjsKKyAgICB9CisgICAgcmVzdWx0ICs9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCitzdHJpbmcgdF9vY2FtbF9nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlKSB7CisgIHN0cmluZyBwcmVmaXggPSAiIjsKKyAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHR5cGUtPmdldF9wcm9ncmFtKCk7CisgIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgeworICAgIGlmICghdHR5cGUtPmlzX3NlcnZpY2UoKSkgeworICAgICAgcHJlZml4ID0gY2FwaXRhbGl6ZShwcm9ncmFtLT5nZXRfbmFtZSgpKSArICJfdHlwZXMuIjsKKyAgICB9CisgIH0KKworICBzdHJpbmcgbmFtZSA9IHR0eXBlLT5nZXRfbmFtZSgpOworICBpZiAodHR5cGUtPmlzX3NlcnZpY2UoKSkgeworICAgIG5hbWUgPSBjYXBpdGFsaXplKG5hbWUpOworICB9IGVsc2UgeworICAgIG5hbWUgPSBkZWNhcGl0YWxpemUobmFtZSk7CisgIH0KKyAgcmV0dXJuIHByZWZpeCArIG5hbWU7Cit9CisKKy8qKgorICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBQcm90b2NvbC50X3R5cGUgZW51bQorICovCitzdHJpbmcgdF9vY2FtbF9nZW5lcmF0b3I6OnR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICByZXR1cm4gIlByb3RvY29sLlRfVk9JRCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gIlByb3RvY29sLlRfU1RSSU5HIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gIlByb3RvY29sLlRfQk9PTCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiUHJvdG9jb2wuVF9CWVRFIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAiUHJvdG9jb2wuVF9JMTYiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmV0dXJuICJQcm90b2NvbC5UX0kzMiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIlByb3RvY29sLlRfSTY0IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiUHJvdG9jb2wuVF9ET1VCTEUiOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gIlByb3RvY29sLlRfSTMyIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICJQcm90b2NvbC5UX1NUUlVDVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gIlByb3RvY29sLlRfTUFQIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAiUHJvdG9jb2wuVF9TRVQiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAiUHJvdG9jb2wuVF9MSVNUIjsKKyAgfQorCisgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKworLyoqCisgKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhbiBvY2FtbCB0eXBlCisgKi8KK3N0cmluZyB0X29jYW1sX2dlbmVyYXRvcjo6cmVuZGVyX29jYW1sX3R5cGUodF90eXBlKiB0eXBlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgcmV0dXJuICJ1bml0IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAic3RyaW5nIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gImJvb2wiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZXR1cm4gImludCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gImludCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gIkludDMyLnQiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICJJbnQ2NC50IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiZmxvYXQiOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gY2FwaXRhbGl6ZSgoKHRfZW51bSopdHlwZSktPmdldF9uYW1lKCkpICsgIi50IjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuIHR5cGVfbmFtZSgodF9zdHJ1Y3QqKXR5cGUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOworICAgIHJldHVybiAiKCIgKyByZW5kZXJfb2NhbWxfdHlwZShrdHlwZSkgKyAiLCIgKyByZW5kZXJfb2NhbWxfdHlwZSh2dHlwZSkgKyAiKSBIYXNodGJsLnQiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgdF90eXBlKiBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgcmV0dXJuICIoIiArIHJlbmRlcl9vY2FtbF90eXBlKGV0eXBlKSArICIsYm9vbCkgSGFzaHRibC50IjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICB0X3R5cGUqIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgcmV0dXJuIHJlbmRlcl9vY2FtbF90eXBlKGV0eXBlKSArICIgbGlzdCI7CisgIH0KKworICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Cit9CisKK1RIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1Iob2NhbWwsICJPQ2FtbCIsICIiKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9vb3BfZ2VuZXJhdG9yLmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGRhNTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9vb3BfZ2VuZXJhdG9yLmgKQEAgLTAsMCArMSwxMTIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUX09PUF9HRU5FUkFUT1JfSAorI2RlZmluZSBUX09PUF9HRU5FUkFUT1JfSAorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorCisjaW5jbHVkZSAidGhyaWZ0L2NvbW1vbi5oIgorI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvci5oIgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCisvKioKKyAqIENsYXNzIHdpdGggdXRpbGl0eSBtZXRob2RzIHNoYXJlZCBhY3Jvc3MgY29tbW9uIG9iamVjdCBvcmllbnRlZCBsYW5ndWFnZXMuCisgKiBTcGVjaWZpY2FsbHksIG1vc3Qgb2YgdGhpcyBzdHVmZiBpcyBmb3IgQysrL0phdmEuCisgKgorICovCitjbGFzcyB0X29vcF9nZW5lcmF0b3IgOiBwdWJsaWMgdF9nZW5lcmF0b3IgeworcHVibGljOgorICB0X29vcF9nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtKSA6IHRfZ2VuZXJhdG9yKHByb2dyYW0pIHt9CisKKyAgLyoqCisgICAqIFNjb3BpbmcsIHVzaW5nIGN1cmx5IGJyYWNlcyEKKyAgICovCisKKyAgdm9pZCBzY29wZV91cChzdGQ6Om9zdHJlYW0mIG91dCkgeworICAgIGluZGVudChvdXQpIDw8ICJ7IiA8PCBzdGQ6OmVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgIH0KKworICB2b2lkIHNjb3BlX2Rvd24oc3RkOjpvc3RyZWFtJiBvdXQpIHsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBzdGQ6OmVuZGw7CisgIH0KKworICBzdGQ6OnN0cmluZyB1cGNhc2Vfc3RyaW5nKHN0ZDo6c3RyaW5nIG9yaWdpbmFsKSB7CisgICAgc3RkOjp0cmFuc2Zvcm0ob3JpZ2luYWwuYmVnaW4oKSwgb3JpZ2luYWwuZW5kKCksIG9yaWdpbmFsLmJlZ2luKCksIChpbnQgKCopKGludCkpdG91cHBlcik7CisgICAgcmV0dXJuIG9yaWdpbmFsOworICB9CisKKyAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXRfZW51bV9jbGFzc19uYW1lKHRfdHlwZSogdHlwZSkgeworICAgIHN0ZDo6c3RyaW5nIHBhY2thZ2UgPSAiIjsKKyAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0eXBlLT5nZXRfcHJvZ3JhbSgpOworICAgIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgeworICAgICAgcGFja2FnZSA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2UoImphdmEiKSArICIuIjsKKyAgICB9CisgICAgcmV0dXJuIHBhY2thZ2UgKyB0eXBlLT5nZXRfbmFtZSgpOworICB9CisKKyAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX2phdmFfZG9jc3RyaW5nX2NvbW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIGNvbnRlbnRzKSB7CisgICAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCAiLyoqXG4iLCAiICogIiwgY29udGVudHMsICIgKi9cbiIpOworICB9CisKKyAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX2phdmFfZG9jKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiBmaWVsZCkgeworICAgIGlmIChmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfZW51bSgpKSB7CisgICAgICBzdGQ6OnN0cmluZyBjb21iaW5lZF9tZXNzYWdlID0gZmllbGQtPmdldF9kb2MoKSArICJcbkBzZWUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZ2V0X2VudW1fY2xhc3NfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSk7CisgICAgICBnZW5lcmF0ZV9qYXZhX2RvY3N0cmluZ19jb21tZW50KG91dCwgY29tYmluZWRfbWVzc2FnZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGdlbmVyYXRlX2phdmFfZG9jKG91dCwgKHRfZG9jKilmaWVsZCk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEVtaXRzIGEgSmF2YURvYyBjb21tZW50IGlmIHRoZSBwcm92aWRlZCBvYmplY3QgaGFzIGEgZG9jIGluIFRocmlmdAorICAgKi8KKyAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX2phdmFfZG9jKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2RvYyogdGRvYykgeworICAgIGlmICh0ZG9jLT5oYXNfZG9jKCkpIHsKKyAgICAgIGdlbmVyYXRlX2phdmFfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCB0ZG9jLT5nZXRfZG9jKCkpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBFbWl0cyBhIEphdmFEb2MgY29tbWVudCBpZiB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gb2JqZWN0IGhhcyBhIGRvYyBpbiBUaHJpZnQKKyAgICovCisgIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV9qYXZhX2RvYyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgICAgaWYgKHRmdW5jdGlvbi0+aGFzX2RvYygpKSB7CisgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgICAgIHNzIDw8IHRmdW5jdGlvbi0+Z2V0X2RvYygpOworICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7CisgICAgICBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHBfaXRlcjsKKyAgICAgIGZvciAocF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IHBfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrcF9pdGVyKSB7CisgICAgICAgIHRfZmllbGQqIHAgPSAqcF9pdGVyOworICAgICAgICBzcyA8PCAiXG5AcGFyYW0gIiA8PCBwLT5nZXRfbmFtZSgpOworICAgICAgICBpZiAocC0+aGFzX2RvYygpKSB7CisgICAgICAgICAgc3MgPDwgIiAiIDw8IHAtPmdldF9kb2MoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCAiLyoqXG4iLCAiICogIiwgc3Muc3RyKCksICIgKi9cbiIpOworICAgIH0KKyAgfQorfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X3BlcmxfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9wZXJsX2dlbmVyYXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTI0YTc2Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9wZXJsX2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDE2ODMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxsaXN0PgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgInRocmlmdC9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInRocmlmdC92ZXJzaW9uLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oIgorCit1c2luZyBzdGQ6Om1hcDsKK3VzaW5nIHN0ZDo6b3N0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnZlY3RvcjsKKworc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsID0gIlxuIjsgLy8gYXZvaWQgb3N0cmVhbSA8PCBzdGQ6OmVuZGwgZmx1c2hlcworCisvKioKKyAqIFBFUkwgY29kZSBnZW5lcmF0b3IuCisgKgorICovCitjbGFzcyB0X3BlcmxfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7CitwdWJsaWM6CisgIHRfcGVybF9nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQorICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pLCBmX3R5cGVzX3VzZV9pbmNsdWRlc19lbWl0dGVkXyhmYWxzZSkgeworICAgICh2b2lkKW9wdGlvbl9zdHJpbmc7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKworICAgIC8qIG5vIG9wdGlvbnMgeWV0ICovCisgICAgZm9yKCBpdGVyID0gcGFyc2VkX29wdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKTsgKytpdGVyKSB7CisgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24gcGVybDoiICsgaXRlci0+Zmlyc3Q7CisgICAgfQorCisgICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tcGVybCI7CisgICAgZXNjYXBlX1snJCddID0gIlxcJCI7CisgICAgZXNjYXBlX1snQCddID0gIlxcQCI7CisgIH0KKworICAvKioKKyAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcworICAgKi8KKworICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7CisgIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7CisKKyAgLyoqCisgICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpOworICB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSk7CisgIHZvaWQgZ2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOworCisgIC8qKgorICAgKiBTdHJ1Y3RzIQorICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3Blcmxfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfcGVybF9zdHJ1Y3RfZGVmaW5pdGlvbihzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiA9IGZhbHNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9wZXJsX3N0cnVjdF9yZWFkZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9wZXJsX3N0cnVjdF93cml0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9wZXJsX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKworICAvKioKKyAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3Jlc3QodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3IodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICB2b2lkIGdlbmVyYXRlX3VzZV9pbmNsdWRlcyhzdGQ6Om9zdHJlYW0mIG9zLCBib29sJiBkb25lLCB0X3R5cGUgKnR5cGUsIGJvb2wgc2VsZmlzaCk7CisKKyAgLyoqCisgICAqIFNlcmlhbGl6YXRpb24gY29uc3RydWN0cworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2xhc3MgPSBmYWxzZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcga2l0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHZpdGVyKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXQqIHRtYXAsIHN0ZDo6c3RyaW5nIGl0ZXIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RkOjpzdHJpbmcgaXRlcik7CisKKyAgLyoqCisgICAqIEhlbHBlciByZW5kZXJpbmcgZnVuY3Rpb25zCisgICAqLworCisgIHN0ZDo6c3RyaW5nIHBlcmxfaW5jbHVkZXMoKTsKKyAgc3RkOjpzdHJpbmcgZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdCA9IGZhbHNlLCBib29sIG9iaiA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KTsKKyAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOworCisgIHN0ZDo6c3RyaW5nIGF1dG9nZW5fY29tbWVudCgpIHsKKyAgICByZXR1cm4gc3RkOjpzdHJpbmcoIiNcbiIpICsgIiMgQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKCIgKyBUSFJJRlRfVkVSU0lPTiArICIpXG4iCisgICAgICAgICAgICsgIiNcbiIgKyAiIyBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HXG4iICsgIiNcbiI7CisgIH0KKworICB2b2lkIHBlcmxfbmFtZXNwYWNlX2RpcnModF9wcm9ncmFtKiBwLCBzdGQ6Omxpc3Q8c3RkOjpzdHJpbmc+JiBkaXJzKSB7CisgICAgc3RkOjpzdHJpbmcgbnMgPSBwLT5nZXRfbmFtZXNwYWNlKCJwZXJsIik7CisgICAgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBsb2M7CisKKyAgICBpZiAobnMuc2l6ZSgpID4gMCkgeworICAgICAgd2hpbGUgKChsb2MgPSBucy5maW5kKCIuIikpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgIGRpcnMucHVzaF9iYWNrKG5zLnN1YnN0cigwLCBsb2MpKTsKKyAgICAgICAgbnMgPSBucy5zdWJzdHIobG9jICsgMSk7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKG5zLnNpemUoKSA+IDApIHsKKyAgICAgIGRpcnMucHVzaF9iYWNrKG5zKTsKKyAgICB9CisgIH0KKworICBzdGQ6OnN0cmluZyBwZXJsX25hbWVzcGFjZSh0X3Byb2dyYW0qIHApIHsKKyAgICBzdGQ6OnN0cmluZyBucyA9IHAtPmdldF9uYW1lc3BhY2UoInBlcmwiKTsKKyAgICBzdGQ6OnN0cmluZyByZXN1bHQgPSAiIjsKKyAgICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIGxvYzsKKworICAgIGlmIChucy5zaXplKCkgPiAwKSB7CisgICAgICB3aGlsZSAoKGxvYyA9IG5zLmZpbmQoIi4iKSkgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgcmVzdWx0ICs9IG5zLnN1YnN0cigwLCBsb2MpOworICAgICAgICByZXN1bHQgKz0gIjo6IjsKKyAgICAgICAgbnMgPSBucy5zdWJzdHIobG9jICsgMSk7CisgICAgICB9CisKKyAgICAgIGlmIChucy5zaXplKCkgPiAwKSB7CisgICAgICAgIHJlc3VsdCArPSBucyArICI6OiI7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIGdldF9uYW1lc3BhY2Vfb3V0X2RpcigpIHsKKyAgICBzdGQ6OnN0cmluZyBvdXRkaXIgPSBnZXRfb3V0X2RpcigpOworICAgIHN0ZDo6bGlzdDxzdGQ6OnN0cmluZz4gZGlyczsKKyAgICBwZXJsX25hbWVzcGFjZV9kaXJzKHByb2dyYW1fLCBkaXJzKTsKKyAgICBzdGQ6Omxpc3Q8c3RkOjpzdHJpbmc+OjppdGVyYXRvciBpdDsKKyAgICBmb3IgKGl0ID0gZGlycy5iZWdpbigpOyBpdCAhPSBkaXJzLmVuZCgpOyBpdCsrKSB7CisgICAgICBvdXRkaXIgKz0gKml0ICsgIi8iOworICAgIH0KKyAgICByZXR1cm4gb3V0ZGlyOworICB9CisKK3ByaXZhdGU6CisgIC8qKgorICAgKiBGaWxlIHN0cmVhbXMKKyAgICovCisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl90eXBlc187CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9jb25zdHNfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfaGVscGVyc187CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9zZXJ2aWNlXzsKKworICBib29sIGZfdHlwZXNfdXNlX2luY2x1ZGVzX2VtaXR0ZWRfOworfTsKKworLyoqCisgKiBQcmVwYXJlcyBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAorICogc3RyZWFtcy4KKyAqCisgKiBAcGFyYW0gdHByb2dyYW0gVGhlIHByb2dyYW0gdG8gZ2VuZXJhdGUKKyAqLwordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKKyAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5CisgIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7CisKKyAgc3RyaW5nIG91dGRpciA9IGdldF9vdXRfZGlyKCk7CisgIHN0ZDo6bGlzdDxzdGQ6OnN0cmluZz4gZGlyczsKKyAgcGVybF9uYW1lc3BhY2VfZGlycyhwcm9ncmFtXywgZGlycyk7CisgIHN0ZDo6bGlzdDxzdGQ6OnN0cmluZz46Oml0ZXJhdG9yIGl0OworICBmb3IgKGl0ID0gZGlycy5iZWdpbigpOyBpdCAhPSBkaXJzLmVuZCgpOyBpdCsrKSB7CisgICAgb3V0ZGlyICs9ICppdCArICIvIjsKKyAgICBNS0RJUihvdXRkaXIuY19zdHIoKSk7CisgIH0KKworICAvLyBNYWtlIG91dHB1dCBmaWxlCisgIHN0cmluZyBmX3R5cGVzX25hbWUgPSBvdXRkaXIgKyAiVHlwZXMucG0iOworICBmX3R5cGVzXy5vcGVuKGZfdHlwZXNfbmFtZS5jX3N0cigpKTsKKyAgc3RyaW5nIGZfY29uc3RzX25hbWUgPSBvdXRkaXIgKyAiQ29uc3RhbnRzLnBtIjsKKyAgZl9jb25zdHNfLm9wZW4oZl9jb25zdHNfbmFtZS5jX3N0cigpKTsKKworICAvLyBQcmludCBoZWFkZXIKKyAgZl90eXBlc18gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgcGVybF9pbmNsdWRlcygpOworCisgIC8vIFByaW50IGhlYWRlcgorICBmX2NvbnN0c18gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgInBhY2thZ2UgIiA8PCBwZXJsX25hbWVzcGFjZShwcm9ncmFtXykgPDwgIkNvbnN0YW50czsiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IHBlcmxfaW5jbHVkZXMoKSA8PCBlbmRsOworfQorCisvKioKKyAqIFByaW50cyBzdGFuZGFyZCBqYXZhIGltcG9ydHMKKyAqLworc3RyaW5nIHRfcGVybF9nZW5lcmF0b3I6OnBlcmxfaW5jbHVkZXMoKSB7CisgIHN0cmluZyBpbmM7CisKKyAgaW5jICA9ICJ1c2UgNS4xMC4wO1xuIjsKKyAgaW5jICs9ICJ1c2Ugc3RyaWN0O1xuIjsKKyAgaW5jICs9ICJ1c2Ugd2FybmluZ3M7XG4iOworICBpbmMgKz0gInVzZSBUaHJpZnQ6OkV4Y2VwdGlvbjtcbiI7CisgIGluYyArPSAidXNlIFRocmlmdDo6TWVzc2FnZVR5cGU7XG4iOworICBpbmMgKz0gInVzZSBUaHJpZnQ6OlR5cGU7XG5cbiI7CisKKyAgcmV0dXJuIGluYzsKK30KKworLyoqCisgKiBDbG9zZSB1cCAob3IgZG93bikgc29tZSBmaWxlei4KKyAqLwordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7CisgIC8vIENsb3NlIHR5cGVzIGZpbGUKKyAgZl90eXBlc18gPDwgIjE7IiA8PCBlbmRsOworICBmX3R5cGVzXy5jbG9zZSgpOworCisgIGZfY29uc3RzXyA8PCAiMTsiIDw8IGVuZGw7CisgIGZfY29uc3RzXy5jbG9zZSgpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIFRoaXMgaXMgbm90IGRvbmUgaW4gUEVSTCwgdHlwZXMgYXJlIGFsbCBpbXBsaWNpdC4KKyAqCisgKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgorICovCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgeworICAodm9pZCl0dHlwZWRlZjsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgY29kZSBmb3IgYW4gZW51bWVyYXRlZCB0eXBlLiBTaW5jZSBkZWZpbmUgaXMgZXhwZW5zaXZlIHRvIGxvb2t1cAorICogaW4gUEVSTCwgd2UgdXNlIGEgZ2xvYmFsIGFycmF5IGZvciB0aGlzLgorICoKKyAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KKyAqLwordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKKyAgZl90eXBlc18gPDwgInBhY2thZ2UgIiA8PCBwZXJsX25hbWVzcGFjZShwcm9ncmFtXykgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgICAgZl90eXBlc18gPDwgInVzZSBjb25zdGFudCAiIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0+ICIgPDwgdmFsdWUgPDwgIjsiIDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZSBhIGNvbnN0YW50IHZhbHVlCisgKi8KK3ZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KSB7CisgIHRfdHlwZSogdHlwZSA9IHRjb25zdC0+Z2V0X3R5cGUoKTsKKyAgc3RyaW5nIG5hbWUgPSB0Y29uc3QtPmdldF9uYW1lKCk7CisgIHRfY29uc3RfdmFsdWUqIHZhbHVlID0gdGNvbnN0LT5nZXRfdmFsdWUoKTsKKworICBmX2NvbnN0c18gPDwgInVzZSBjb25zdGFudCAiIDw8IG5hbWUgPDwgIiA9PiAiOworICBmX2NvbnN0c18gPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHR5cGUsIHZhbHVlKTsKKyAgZl9jb25zdHNfIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogUHJpbnRzIHRoZSB2YWx1ZSBvZiBhIGNvbnN0YW50IHdpdGggdGhlIGdpdmVuIHR5cGUuIE5vdGUgdGhhdCB0eXBlIGNoZWNraW5nCisgKiBpcyBOT1QgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24gYXMgaXQgaXMgYWx3YXlzIHJ1biBiZWZvcmVoYW5kIHVzaW5nIHRoZQorICogdmFsaWRhdGVfdHlwZXMgbWV0aG9kIGluIG1haW4uY2MKKyAqLworc3RyaW5nIHRfcGVybF9nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7CisKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIG91dCA8PCAnIicgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICBvdXQgPDwgKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCA/ICIxIiA6ICIwIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgeworICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBvdXQgPDwgcGVybF9uYW1lc3BhY2UodHlwZS0+Z2V0X3Byb2dyYW0oKSkgPDwgdHlwZS0+Z2V0X25hbWUoKSA8PCAiLT5uZXcoeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOworICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKKyAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisgICAgICB9CisgICAgICBpbmRlbnQob3V0KSA8PCByZW5kZXJfY29uc3RfdmFsdWUoZ190eXBlX3N0cmluZywgdl9pdGVyLT5maXJzdCk7CisgICAgICBvdXQgPDwgIiA9PiAiOworICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgICBvdXQgPDwgIiwiOworICAgICAgb3V0IDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0pIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICBvdXQgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCByZW5kZXJfY29uc3RfdmFsdWUoa3R5cGUsIHZfaXRlci0+Zmlyc3QpOworICAgICAgb3V0IDw8ICIgPT4gIjsKKyAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUodnR5cGUsIHZfaXRlci0+c2Vjb25kKTsKKyAgICAgIG91dCA8PCAiLCIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKSB7CisgICAgdF90eXBlKiBldHlwZTsKKyAgICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIH0gZWxzZSB7CisgICAgICBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfQorICAgIG91dCA8PCAiWyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOworICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworCisgICAgICBpbmRlbnQob3V0KSA8PCByZW5kZXJfY29uc3RfdmFsdWUoZXR5cGUsICp2X2l0ZXIpOworICAgICAgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgICAgIG91dCA8PCAiID0+IDEiOworICAgICAgfQorICAgICAgb3V0IDw8ICIsIiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJdIjsKKyAgfQorICByZXR1cm4gb3V0LnN0cigpOworfQorCisvKioKKyAqIE1ha2UgYSBzdHJ1Y3QKKyAqLwordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgZ2VuZXJhdGVfcGVybF9zdHJ1Y3QodHN0cnVjdCwgZmFsc2UpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBleGNlcHRpb24uIEJhc2ljYWxseSB0aGUgc2FtZQorICogYXMgYSBzdHJ1Y3QgYnV0IGV4dGVuZHMgdGhlIEV4Y2VwdGlvbiBjbGFzcy4KKyAqCisgKiBAcGFyYW0gdHhjZXB0aW9uIFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKKyAgZ2VuZXJhdGVfcGVybF9zdHJ1Y3QodHhjZXB0aW9uLCB0cnVlKTsKK30KKworLyoqCisgKiBTdHJ1Y3RzIGNhbiBiZSBub3JtYWwgb3IgZXhjZXB0aW9ucy4KKyAqLwordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wZXJsX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pIHsKKyAgZ2VuZXJhdGVfdXNlX2luY2x1ZGVzKGZfdHlwZXNfLCBmX3R5cGVzX3VzZV9pbmNsdWRlc19lbWl0dGVkXywgdHN0cnVjdCwgZmFsc2UpOworICBnZW5lcmF0ZV9wZXJsX3N0cnVjdF9kZWZpbml0aW9uKGZfdHlwZXNfLCB0c3RydWN0LCBpc19leGNlcHRpb24pOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuIFRoaXMgaXMgbm90aGluZyBpbiBQRVJMCisgKiB3aGVyZSB0aGUgb2JqZWN0cyBhcmUgYWxsIGp1c3QgYXNzb2NpYXRpdmUgYXJyYXlzICh1bmxlc3Mgb2YgY291cnNlIHdlCisgKiBkZWNpZGUgdG8gc3RhcnQgdXNpbmcgb2JqZWN0cyBmb3IgdGhlbS4uLikKKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wZXJsX3N0cnVjdF9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIG91dCA8PCAicGFja2FnZSAiIDw8IHBlcmxfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIjtcbiI7CisgIGlmIChpc19leGNlcHRpb24pIHsKKyAgICBvdXQgPDwgInVzZSBiYXNlIHF3KFRocmlmdDo6VEV4Y2VwdGlvbik7XG4iOworICB9CisKKyAgLy8gQ3JlYXRlIHNpbXBsZSBhY2Vzc29yIG1ldGhvZHMKKyAgb3V0IDw8ICJ1c2UgYmFzZSBxdyhDbGFzczo6QWNjZXNzb3IpO1xuIjsKKworICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7CisgICAgb3V0IDw8IHBlcmxfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIi0+bWtfYWNjZXNzb3JzKCBxdyggIjsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgICBpZiAoIXQtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICAgICAgb3V0IDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICI7CisgICAgICB9CisgICAgfQorCisgICAgb3V0IDw8ICIpICk7XG4iOworICB9CisKKyAgb3V0IDw8IGVuZGw7CisKKyAgLy8gbmV3KCkKKyAgaW5kZW50X3VwKCk7CisgIG91dCA8PCAic3ViIG5ldyB7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJteSAkY2xhc3NuYW1lID0gc2hpZnQ7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAibXkgJHNlbGYgICAgICA9IHt9OyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAibXkgJHZhbHMgICAgICA9IHNoaWZ0IHx8IHt9OyIgPDwgZW5kbDsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgc3RyaW5nIGR2YWwgPSAidW5kZWYiOworICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICBpZiAoKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSAhPSBOVUxMICYmICEodC0+aXNfc3RydWN0KCkgfHwgdC0+aXNfeGNlcHRpb24oKSkpIHsKKyAgICAgIGR2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpLCAoKm1faXRlciktPmdldF92YWx1ZSgpKTsKKyAgICB9CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkc2VsZi0+eyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJ9ID0gIiA8PCBkdmFsIDw8ICI7IiA8PCBlbmRsOworICB9CisKKyAgLy8gR2VuZXJhdGUgY29uc3RydWN0b3IgZnJvbSBhcnJheQorICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7CisKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSAhPSBOVUxMICYmICh0LT5pc19zdHJ1Y3QoKSB8fCB0LT5pc194Y2VwdGlvbigpKSkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiJHNlbGYtPnsiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICA8PCAifSA9ICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHQsICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkpIDw8ICI7IiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKFVOSVZFUlNBTDo6aXNhKCR2YWxzLCdIQVNIJykpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoZGVmaW5lZCAkdmFscy0+eyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJ9KSB7IiA8PCBlbmRsCisgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgJHNlbGYtPnsiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAifSA9ICR2YWxzLT57IgorICAgICAgICAgIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAifTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gYmxlc3MgKCRzZWxmLCAkY2xhc3NuYW1lKTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCAifVxuXG4iOworCisgIG91dCA8PCAic3ViIGdldE5hbWUgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gJyIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiJzsiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfcGVybF9zdHJ1Y3RfcmVhZGVyKG91dCwgdHN0cnVjdCk7CisgIGdlbmVyYXRlX3Blcmxfc3RydWN0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyB0aGUgcmVhZCgpIG1ldGhvZCBmb3IgYSBzdHJ1Y3QKKyAqLwordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wZXJsX3N0cnVjdF9yZWFkZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgb3V0IDw8ICJzdWIgcmVhZCB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAibXkgKCRzZWxmLCAkaW5wdXQpID0gQF87IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJteSAkeGZlciAgPSAwOyIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgIm15ICRmbmFtZTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm15ICRmdHlwZSA9IDA7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAibXkgJGZpZCAgID0gMDsiIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZFN0cnVjdEJlZ2luKFxcJGZuYW1lKTsiIDw8IGVuZGw7CisKKyAgLy8gTG9vcCBvdmVyIHJlYWRpbmcgaW4gZmllbGRzCisgIGluZGVudChvdXQpIDw8ICJ3aGlsZSAoMSkiIDw8IGVuZGw7CisKKyAgc2NvcGVfdXAob3V0KTsKKworICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJGlucHV0LT5yZWFkRmllbGRCZWdpbihcXCRmbmFtZSwgXFwkZnR5cGUsIFxcJGZpZCk7IiA8PCBlbmRsOworCisgIC8vIENoZWNrIGZvciBmaWVsZCBTVE9QIG1hcmtlciBhbmQgYnJlYWsKKyAgaW5kZW50KG91dCkgPDwgImlmICgkZnR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6U1RPUCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJsYXN0OyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgLy8gU3dpdGNoIHN0YXRlbWVudCBvbiB0aGUgZmllbGQgd2UgYXJlIHJlYWRpbmcKKyAgaW5kZW50KG91dCkgPDwgIlNXSVRDSDogZm9yKCRmaWQpIiA8PCBlbmRsOworCisgIHNjb3BlX3VwKG91dCk7CisKKyAgLy8gR2VuZXJhdGUgZGVzZXJpYWxpemF0aW9uIGNvZGUgZm9yIGtub3duIGNhc2VzCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisKKyAgICBpbmRlbnQob3V0KSA8PCAiL14iIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICIkLyAmJiBkb3siOworICAgIGluZGVudChvdXQpIDw8ICJpZiAoJGZ0eXBlID09ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIikgeyIgPDwgZW5kbDsKKworICAgIGluZGVudF91cCgpOworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInNlbGYtPiIpOworICAgIGluZGVudF9kb3duKCk7CisKKyAgICBpbmRlbnQob3V0KSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnQob3V0KSA8PCAiICAkeGZlciArPSAkaW5wdXQtPnNraXAoJGZ0eXBlKTsiIDw8IGVuZGw7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImxhc3Q7IH07IiA8PCBlbmRsOworICB9CisgIC8vIEluIHRoZSBkZWZhdWx0IGNhc2Ugd2Ugc2tpcCB0aGUgZmllbGQKKworICBpbmRlbnQob3V0KSA8PCAiICAkeGZlciArPSAkaW5wdXQtPnNraXAoJGZ0eXBlKTsiIDw8IGVuZGw7CisKKyAgc2NvcGVfZG93bihvdXQpOworCisgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkaW5wdXQtPnJlYWRGaWVsZEVuZCgpOyIgPDwgZW5kbDsKKworICBzY29wZV9kb3duKG91dCk7CisKKyAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZFN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAicmV0dXJuICR4ZmVyOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgdGhlIHdyaXRlKCkgbWV0aG9kIGZvciBhIHN0cnVjdAorICovCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Blcmxfc3RydWN0X3dyaXRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBvdXQgPDwgInN1YiB3cml0ZSB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAibXkgKCRzZWxmLCAkb3V0cHV0KSA9IEBfOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIm15ICR4ZmVyICAgPSAwOyIgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTdHJ1Y3RCZWdpbignIiA8PCBuYW1lIDw8ICInKTsiIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChkZWZpbmVkICRzZWxmLT57IiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIn0pIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZEJlZ2luKCIKKyAgICAgICAgICAgICAgICA8PCAiJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInLCAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpCisgICAgICAgICAgICAgICAgPDwgIiwgIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiKTsiIDw8IGVuZGw7CisKKyAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJzZWxmLT4iKTsKKworICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOworCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgfQorCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZFN0b3AoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICIkeGZlciArPSAkb3V0cHV0LT53cml0ZVN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiAkeGZlcjsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHVzZSBjbGF1c2VzIGZvciBpbmNsdWRlZCBlbnRpdGllcworICoKKyAqIEBwYXJhbSAgb3MgICAgICAgVGhlIG91dHB1dCBzdHJlYW0KKyAqIEBwYXJhbSAgZG9uZSAgICAgQSBmbGFnIHJlZmVyZW5jZSB0byBkZWJvdW5jZSB0aGUgYWN0aW9uCisgKiBAcGFyYW0gIHR5cGUgICAgIFRoZSB0eXBlIGJlaW5nIHByb2Nlc3NlZAorICogQHBhcmFtICBzZWxmaXNoICBGbGFnIHRvIGluZGljYXRlIGlmIHRoZSBjdXJyZW50IG5hbWVzcGFjZSB0eXBlcyBzaG91bGQgYmUgInVzZSJkIGFzIHdlbGwuCisgKi8KK3ZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdXNlX2luY2x1ZGVzKHN0ZDo6b3N0cmVhbSYgb3MsIGJvb2wmIGRvbmUsIHRfdHlwZSAqdHlwZSwgYm9vbCBzZWxmaXNoKSB7CisgIHRfcHJvZ3JhbSAqY3VycmVudCA9IHR5cGUtPmdldF9wcm9ncmFtKCk7CisgIGlmIChjdXJyZW50ICYmICFkb25lKSB7CisgICAgc3RkOjp2ZWN0b3I8dF9wcm9ncmFtKj4mIGN1cnJJbmMgPSBjdXJyZW50LT5nZXRfaW5jbHVkZXMoKTsKKyAgICBzdGQ6OnZlY3Rvcjx0X3Byb2dyYW0qPjo6c2l6ZV90eXBlIG51bUluYyA9IGN1cnJJbmMuc2l6ZSgpOworICAgIGlmIChzZWxmaXNoKSB7CisgICAgICBvcyA8PCAidXNlICIgPDwgcGVybF9uYW1lc3BhY2UoY3VycmVudCkgPDwgIlR5cGVzOyIgPDwgZW5kbDsKKyAgICB9CisgICAgZm9yIChzdGQ6OnZlY3Rvcjx0X3Byb2dyYW0qPjo6c2l6ZV90eXBlIGkgPSAwOyBpIDwgbnVtSW5jOyArK2kpIHsKKyAgICAgIHRfcHJvZ3JhbSogaW5jUHJvZ3JhbSA9IGN1cnJJbmMuYXQoaSk7CisgICAgICBvcyA8PCAidXNlICIgPDwgcGVybF9uYW1lc3BhY2UoaW5jUHJvZ3JhbSkgPDwgIlR5cGVzOyIgPDwgZW5kbDsKKyAgICB9CisgICAgb3MgPDwgZW5kbDsKKyAgICBkb25lID0gdHJ1ZTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHRocmlmdCBzZXJ2aWNlLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBmX3NlcnZpY2VfbmFtZSA9IGdldF9uYW1lc3BhY2Vfb3V0X2RpcigpICsgc2VydmljZV9uYW1lXyArICIucG0iOworICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7CisKKyAgZl9zZXJ2aWNlXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBwZXJsX2luY2x1ZGVzKCk7CisKKyAgYm9vbCBkb25lID0gZmFsc2U7CisgIGdlbmVyYXRlX3VzZV9pbmNsdWRlcyhmX3NlcnZpY2VfLCBkb25lLCB0c2VydmljZSwgdHJ1ZSk7CisKKyAgdF9zZXJ2aWNlKiBleHRlbmRzX3MgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKKyAgaWYgKGV4dGVuZHNfcyAhPSBOVUxMKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAidXNlICIgPDwgcGVybF9uYW1lc3BhY2UoZXh0ZW5kc19zLT5nZXRfcHJvZ3JhbSgpKSA8PCBleHRlbmRzX3MtPmdldF9uYW1lKCkgPDwgIjsiCisgICAgICAgICAgICAgICA8PCBlbmRsOworICB9CisKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSB0aHJlZSBtYWluIHBhcnRzIG9mIHRoZSBzZXJ2aWNlICh3ZWxsLCB0d28gZm9yIG5vdyBpbiBQRVJMKQorICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfcmVzdCh0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3IodHNlcnZpY2UpOworCisgIC8vIENsb3NlIHNlcnZpY2UgZmlsZQorICBmX3NlcnZpY2VfIDw8ICIxOyIgPDwgZW5kbDsKKyAgZl9zZXJ2aWNlXy5jbG9zZSgpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2Ugc2VydmVyIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KKyAqLwordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3Nvcih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIC8vIEdlbmVyYXRlIHRoZSBkaXNwYXRjaCBtZXRob2RzCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworCisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX3Byb2Nlc3NvciA9ICIiOworICB0X3NlcnZpY2UqIGV4dGVuZHNfcyA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworICBpZiAoZXh0ZW5kc19zICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gcGVybF9uYW1lc3BhY2UoZXh0ZW5kc19zLT5nZXRfcHJvZ3JhbSgpKSArIGV4dGVuZHNfcy0+Z2V0X25hbWUoKTsKKyAgICBleHRlbmRzX3Byb2Nlc3NvciA9ICJ1c2UgYmFzZSBxdygiICsgZXh0ZW5kcyArICJQcm9jZXNzb3IpOyI7CisgIH0KKworICBpbmRlbnRfdXAoKTsKKworICAvLyBHZW5lcmF0ZSB0aGUgaGVhZGVyIHBvcnRpb24KKyAgZl9zZXJ2aWNlXyA8PCAicGFja2FnZSAiIDw8IHBlcmxfbmFtZXNwYWNlKHByb2dyYW1fKSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJQcm9jZXNzb3I7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgZW5kbCA8PCAidXNlIHN0cmljdDsiIDw8IGVuZGwgPDwgZXh0ZW5kc19wcm9jZXNzb3IgPDwgZW5kbCA8PCBlbmRsOworCisgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8ICJzdWIgbmV3IHsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm15ICgkY2xhc3NuYW1lLCAkaGFuZGxlcikgPSBAXzsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICJteSAkc2VsZiAgICAgID0ge307IiA8PCBlbmRsOworCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiJHNlbGYtPntoYW5kbGVyfSA9ICRoYW5kbGVyOyIgPDwgZW5kbDsKKworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybiBibGVzcyAoJHNlbGYsICRjbGFzc25hbWUpOyIgPDwgZW5kbDsKKworICAgIGluZGVudF9kb3duKCk7CisKKyAgICBmX3NlcnZpY2VfIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKworICAvLyBHZW5lcmF0ZSB0aGUgc2VydmVyIGltcGxlbWVudGF0aW9uCisgIGZfc2VydmljZV8gPDwgInN1YiBwcm9jZXNzIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm15ICgkc2VsZiwgJGlucHV0LCAkb3V0cHV0KSA9IEBfOyIgPDwgZW5kbDsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJteSAkcnNlcWlkID0gMDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm15ICRmbmFtZSAgPSB1bmRlZjsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAibXkgJG10eXBlICA9IDA7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiJGlucHV0LT5yZWFkTWVzc2FnZUJlZ2luKFxcJGZuYW1lLCBcXCRtdHlwZSwgXFwkcnNlcWlkKTsiIDw8IGVuZGw7CisKKyAgLy8gSE9UOiBjaGVjayBmb3IgbWV0aG9kIGltcGxlbWVudGF0aW9uCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm15ICRtZXRob2RuYW1lID0gJ3Byb2Nlc3NfJy4kZm5hbWU7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgImlmICghJHNlbGYtPmNhbigkbWV0aG9kbmFtZSkpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiRpbnB1dC0+c2tpcChUaHJpZnQ6OlRUeXBlOjpTVFJVQ1QpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICIkaW5wdXQtPnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgIm15ICR4ID0gVGhyaWZ0OjpUQXBwbGljYXRpb25FeGNlcHRpb24tPm5ldygnRnVuY3Rpb24gJy4kZm5hbWUuJyBub3QgaW1wbGVtZW50ZWQuJywgIgorICAgICAgICAgICAgICAgICJUaHJpZnQ6OlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6VU5LTk9XTl9NRVRIT0QpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICIkb3V0cHV0LT53cml0ZU1lc3NhZ2VCZWdpbigkZm5hbWUsIFRocmlmdDo6VE1lc3NhZ2VUeXBlOjpFWENFUFRJT04sICRyc2VxaWQpOyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIkeC0+d3JpdGUoJG91dHB1dCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgIiRvdXRwdXQtPndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICIkb3V0cHV0LT5nZXRUcmFuc3BvcnQoKS0+Zmx1c2goKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICIkc2VsZi0+JG1ldGhvZG5hbWUoJHJzZXFpZCwgJGlucHV0LCAkb3V0cHV0KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJldHVybiAxOyIKKyAgICAgICAgICAgICA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisKKyAgZl9zZXJ2aWNlXyA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzIHN1YmZ1bmN0aW9ucworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odHNlcnZpY2UsICpmX2l0ZXIpOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgcHJvY2VzcyBmdW5jdGlvbiBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHdyaXRlIGEgZGlzcGF0Y2hlciBmb3IKKyAqLwordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICAvLyBPcGVuIGZ1bmN0aW9uCisgIGZfc2VydmljZV8gPDwgInN1YiBwcm9jZXNzXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIgeyIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJteSAoJHNlbGYsICRzZXFpZCwgJGlucHV0LCAkb3V0cHV0KSA9IEBfOyIgPDwgZW5kbDsKKworICBzdHJpbmcgYXJnc25hbWUgPSBwZXJsX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgKyBzZXJ2aWNlX25hbWVfICsgIl8iCisgICAgICAgICAgICAgICAgICAgICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKKyAgc3RyaW5nIHJlc3VsdG5hbWUgPSBwZXJsX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgKyBzZXJ2aWNlX25hbWVfICsgIl8iCisgICAgICAgICAgICAgICAgICAgICAgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAibXkgJGFyZ3MgPSAiIDw8IGFyZ3NuYW1lIDw8ICItPm5ldygpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICIkYXJncy0+cmVhZCgkaW5wdXQpOyIgPDwgZW5kbDsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIkaW5wdXQtPnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOworCisgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisKKyAgLy8gRGVjbGFyZSByZXN1bHQgZm9yIG5vbiBvbmV3YXkgZnVuY3Rpb24KKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAibXkgJHJlc3VsdCA9ICIgPDwgcmVzdWx0bmFtZSA8PCAiLT5uZXcoKTsiIDw8IGVuZGw7CisgIH0KKworICAvLyBUcnkgYmxvY2sgZm9yIGEgZnVuY3Rpb24gd2l0aCBleGNlcHRpb25zCisgIGlmICh4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImV2YWwgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHRoZSBmdW5jdGlvbiBjYWxsCisgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAiJHJlc3VsdC0+e3N1Y2Nlc3N9ID0gIjsKKyAgfQorICBmX3NlcnZpY2VfIDw8ICIkc2VsZi0+e2hhbmRsZXJ9LT4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOworICAgIH0KKyAgICBmX3NlcnZpY2VfIDw8ICIkYXJncy0+IiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgIH0KKyAgZl9zZXJ2aWNlXyA8PCAiKTsiIDw8IGVuZGw7CisKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmIHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifTsgaWYoIFVOSVZFUlNBTDo6aXNhKCRALCciCisgICAgICAgICAgICAgICAgIDw8IHBlcmxfbmFtZXNwYWNlKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X3Byb2dyYW0oKSkKKyAgICAgICAgICAgICAgICAgPDwgKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpIDw8ICInKSApeyAiIDw8IGVuZGw7CisKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiJHJlc3VsdC0+eyIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJ9ID0gJEA7IiA8PCBlbmRsOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiJEAgPSB1bmRlZjsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCAifSIgPDwgZW5kbDsKKworICAgIC8vIGNhdGNoLWFsbCBmb3IgdW5leHBlY3RlZCBleGNlcHRpb25zIChUSFJJRlQtMzE5MSkKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAoJEApIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiJEAgPX4gcy9eXFxzK3xcXHMrJC8vZzsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJteSAkZXJyID0gVGhyaWZ0OjpUQXBwbGljYXRpb25FeGNlcHRpb24tPm5ldyhcIlVuZXhwZWN0ZWQgRXhjZXB0aW9uOiBcIiAuICRALCBUaHJpZnQ6OlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6SU5URVJOQUxfRVJST1IpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiRvdXRwdXQtPndyaXRlTWVzc2FnZUJlZ2luKCciIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiJywgVGhyaWZ0OjpUTWVzc2FnZVR5cGU6OkVYQ0VQVElPTiwgJHNlcWlkKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIkZXJyLT53cml0ZSgkb3V0cHV0KTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIkb3V0cHV0LT53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIkb3V0cHV0LT5nZXRUcmFuc3BvcnQoKS0+Zmx1c2goKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIkQCA9IHVuZGVmOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9CisKKyAgLy8gU2hvcnRjdXQgb3V0IGhlcmUgZm9yIG9uZXdheSBmdW5jdGlvbnMKKyAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9zZXJ2aWNlXyA8PCAifSIgPDwgZW5kbDsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBTZXJpYWxpemUgdGhlIHJlcGx5CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiRvdXRwdXQtPndyaXRlTWVzc2FnZUJlZ2luKCciIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiJywgVGhyaWZ0OjpUTWVzc2FnZVR5cGU6OlJFUExZLCAkc2VxaWQpOyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIkcmVzdWx0LT53cml0ZSgkb3V0cHV0KTsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiJG91dHB1dC0+d3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiRvdXRwdXQtPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOyIgPDwgZW5kbDsKKworICAvLyBDbG9zZSBmdW5jdGlvbgorICBpbmRlbnRfZG93bigpOworICBmX3NlcnZpY2VfIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGhlbHBlciBmdW5jdGlvbnMgZm9yIGEgc2VydmljZS4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKKyAqLwordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSkgeworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKworICBmX3NlcnZpY2VfIDw8ICIjIEhFTFBFUiBGVU5DVElPTlMgQU5EIFNUUlVDVFVSRVMiIDw8IGVuZGwgPDwgZW5kbDsKKworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBzdHJpbmcgbmFtZSA9IHRzLT5nZXRfbmFtZSgpOworICAgIHRzLT5zZXRfbmFtZShzZXJ2aWNlX25hbWVfICsgIl8iICsgbmFtZSk7CisgICAgZ2VuZXJhdGVfcGVybF9zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCB0cywgZmFsc2UpOworICAgIGdlbmVyYXRlX3BlcmxfZnVuY3Rpb25faGVscGVycygqZl9pdGVyKTsKKyAgICB0cy0+c2V0X25hbWUobmFtZSk7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgYW5kIGhlbHBlcnMgZm9yIGEgZnVuY3Rpb24uCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24KKyAqLwordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wZXJsX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgc2VydmljZV9uYW1lXyArICJfIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7CisgIHRfZmllbGQgc3VjY2Vzcyh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksICJzdWNjZXNzIiwgMCk7CisgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKKyAgfQorCisgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHJlc3VsdC5hcHBlbmQoKmZfaXRlcik7CisgIH0KKworICBnZW5lcmF0ZV9wZXJsX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sICZyZXN1bHQsIGZhbHNlKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGludGVyZmFjZSBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgorICovCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGV4dGVuZHNfaWYgPSAiIjsKKyAgdF9zZXJ2aWNlKiBleHRlbmRzX3MgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKKyAgaWYgKGV4dGVuZHNfcyAhPSBOVUxMKSB7CisgICAgZXh0ZW5kc19pZiA9ICJ1c2UgYmFzZSBxdygiICsgcGVybF9uYW1lc3BhY2UoZXh0ZW5kc19zLT5nZXRfcHJvZ3JhbSgpKSArIGV4dGVuZHNfcy0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICArICJJZik7IjsKKyAgfQorCisgIGZfc2VydmljZV8gPDwgInBhY2thZ2UgIiA8PCBwZXJsX25hbWVzcGFjZShwcm9ncmFtXykgPDwgc2VydmljZV9uYW1lXyA8PCAiSWY7IiA8PCBlbmRsIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAidXNlIHN0cmljdDsiIDw8IGVuZGwgPDwgZXh0ZW5kc19pZiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGZfc2VydmljZV8gPDwgInN1YiAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCBlbmRsIDw8ICIgIGRpZSAnaW1wbGVtZW50IGludGVyZmFjZSc7XG59IgorICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgUkVTVCBpbnRlcmZhY2UKKyAqLwordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3Jlc3QodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19pZiA9ICIiOworICB0X3NlcnZpY2UqIGV4dGVuZHNfcyA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworICBpZiAoZXh0ZW5kc19zICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gZXh0ZW5kc19zLT5nZXRfbmFtZSgpOworICAgIGV4dGVuZHNfaWYgPSAidXNlIGJhc2UgcXcoIiArIHBlcmxfbmFtZXNwYWNlKGV4dGVuZHNfcy0+Z2V0X3Byb2dyYW0oKSkgKyBleHRlbmRzX3MtPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgKyAiUmVzdCk7IjsKKyAgfQorICBmX3NlcnZpY2VfIDw8ICJwYWNrYWdlICIgPDwgcGVybF9uYW1lc3BhY2UocHJvZ3JhbV8pIDw8IHNlcnZpY2VfbmFtZV8gPDwgIlJlc3Q7IiA8PCBlbmRsIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAidXNlIHN0cmljdDsiIDw8IGVuZGwgPDwgZXh0ZW5kc19pZiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgeworICAgIGZfc2VydmljZV8gPDwgInN1YiBuZXcgeyIgPDwgZW5kbDsKKworICAgIGluZGVudF91cCgpOworCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAibXkgKCRjbGFzc25hbWUsICRpbXBsKSA9IEBfOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgIm15ICRzZWxmICAgICA9eyBpbXBsID0+ICRpbXBsIH07IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICJyZXR1cm4gYmxlc3MoJHNlbGYsJGNsYXNzbmFtZSk7IiA8PCBlbmRsOworCisgICAgaW5kZW50X2Rvd24oKTsKKworICAgIGZfc2VydmljZV8gPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGZfc2VydmljZV8gPDwgInN1YiAiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAieyIgPDwgZW5kbDsKKworICAgIGluZGVudF91cCgpOworCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAibXkgKCRzZWxmLCAkcmVxdWVzdCkgPSBAXzsiIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGFyZ3MgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgYV9pdGVyOworICAgIGZvciAoYV9pdGVyID0gYXJncy5iZWdpbigpOyBhX2l0ZXIgIT0gYXJncy5lbmQoKTsgKythX2l0ZXIpIHsKKyAgICAgIHRfdHlwZSogYXR5cGUgPSBnZXRfdHJ1ZV90eXBlKCgqYV9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgICBzdHJpbmcgcmVxID0gIiRyZXF1ZXN0LT57JyIgKyAoKmFfaXRlciktPmdldF9uYW1lKCkgKyAiJ30iOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAibXkgJCIgPDwgKCphX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAoIiA8PCByZXEgPDwgIikgPyAiIDw8IHJlcQorICAgICAgICAgICAgICAgICA8PCAiIDogdW5kZWY7IiA8PCBlbmRsOworICAgICAgaWYgKGF0eXBlLT5pc19zdHJpbmcoKSAmJiAoKHRfYmFzZV90eXBlKilhdHlwZSktPmlzX3N0cmluZ19saXN0KCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAibXkgQCIgPDwgKCphX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSBzcGxpdCgvLC8sICQiCisgICAgICAgICAgICAgICAgICAgPDwgKCphX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiJCIKKyAgICAgICAgICAgICAgICAgICA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IFxcQCIgPDwgKCphX2l0ZXIpLT5nZXRfbmFtZSgpIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybiAkc2VsZi0+e2ltcGx9LT4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCIKKyAgICAgICAgICAgICAgIDw8IGFyZ3VtZW50X2xpc3QoKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpKSA8PCAiKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KKyAqLwordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX2NsaWVudCA9ICIiOworICB0X3NlcnZpY2UqIGV4dGVuZHNfcyA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworICBpZiAoZXh0ZW5kc19zICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gcGVybF9uYW1lc3BhY2UoZXh0ZW5kc19zLT5nZXRfcHJvZ3JhbSgpKSArIGV4dGVuZHNfcy0+Z2V0X25hbWUoKTsKKyAgICBleHRlbmRzX2NsaWVudCA9ICJ1c2UgYmFzZSBxdygiICsgZXh0ZW5kcyArICJDbGllbnQpOyI7CisgIH0KKworICBmX3NlcnZpY2VfIDw8ICJwYWNrYWdlICIgPDwgcGVybF9uYW1lc3BhY2UocHJvZ3JhbV8pIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudDsiIDw8IGVuZGwgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGV4dGVuZHNfY2xpZW50IDw8IGVuZGwgPDwgInVzZSBiYXNlIHF3KCIgPDwgcGVybF9uYW1lc3BhY2UocHJvZ3JhbV8pCisgICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lXyA8PCAiSWYpOyIgPDwgZW5kbDsKKworICAvLyBDb25zdHJ1Y3RvciBmdW5jdGlvbgorICBmX3NlcnZpY2VfIDw8ICJzdWIgbmV3IHsiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAibXkgKCRjbGFzc25hbWUsICRpbnB1dCwgJG91dHB1dCkgPSBAXzsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAibXkgJHNlbGYgICAgICA9IHt9OyIgPDwgZW5kbDsKKworICBpZiAoIWV4dGVuZHMuZW1wdHkoKSkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiRzZWxmID0gJGNsYXNzbmFtZS0+U1VQRVI6Om5ldygkaW5wdXQsICRvdXRwdXQpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIkc2VsZi0+e2lucHV0fSAgPSAkaW5wdXQ7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAiJHNlbGYtPntvdXRwdXR9ID0gZGVmaW5lZCAkb3V0cHV0ID8gJG91dHB1dCA6ICRpbnB1dDsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICIkc2VsZi0+e3NlcWlkfSAgPSAwOyIgPDwgZW5kbDsKKyAgfQorCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybiBibGVzcygkc2VsZiwkY2xhc3NuYW1lKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKworICBmX3NlcnZpY2VfIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKKyAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKworICAgIC8vIE9wZW4gZnVuY3Rpb24KKyAgICBmX3NlcnZpY2VfIDw8ICJzdWIgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgZW5kbDsKKworICAgIGluZGVudF91cCgpOworCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGluZGVudCgpIDw8ICIkc2VsZi0+c2VuZF8iIDw8IGZ1bm5hbWUgPDwgIigiOworCisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlXyA8PCAiJCIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCk7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOworCisgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOworICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBmX3NlcnZpY2VfIDw8ICJyZXR1cm4gIjsKKyAgICAgIH0KKyAgICAgIGZfc2VydmljZV8gPDwgIiRzZWxmLT5yZWN2XyIgPDwgZnVubmFtZSA8PCAiKCk7IiA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisKKyAgICBmX3NlcnZpY2VfIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICBmX3NlcnZpY2VfIDw8ICJzdWIgc2VuZF8iIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCBlbmRsOworCisgICAgaW5kZW50X3VwKCk7CisKKyAgICBzdGQ6OnN0cmluZyBhcmdzbmFtZSA9IHBlcmxfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSArIHNlcnZpY2VfbmFtZV8gKyAiXyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKKworICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVxdWVzdCBoZWFkZXIKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIkc2VsZi0+e291dHB1dH0tPndyaXRlTWVzc2FnZUJlZ2luKCciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgPDwgIicsICIgPDwgKCgqZl9pdGVyKS0+aXNfb25ld2F5KCkgPyAiVGhyaWZ0OjpUTWVzc2FnZVR5cGU6Ok9ORVdBWSIgOiAiVGhyaWZ0OjpUTWVzc2FnZVR5cGU6OkNBTEwiKQorICAgICAgICAgICAgICAgPDwgIiwgJHNlbGYtPntzZXFpZH0pOyIgPDwgZW5kbDsKKworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm15ICRhcmdzID0gIiA8PCBhcmdzbmFtZSA8PCAiLT5uZXcoKTsiIDw8IGVuZGw7CisKKyAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiJGFyZ3MtPnsiIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJ9ID0gJCIKKyAgICAgICAgICAgICAgICAgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorCisgICAgLy8gV3JpdGUgdG8gdGhlIHN0cmVhbQorICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiRhcmdzLT53cml0ZSgkc2VsZi0+e291dHB1dH0pOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgIiRzZWxmLT57b3V0cHV0fS0+d3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAiJHNlbGYtPntvdXRwdXR9LT5nZXRUcmFuc3BvcnQoKS0+Zmx1c2goKTsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfZG93bigpOworCisgICAgZl9zZXJ2aWNlXyA8PCAifSIgPDwgZW5kbDsKKworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgc3RkOjpzdHJpbmcgcmVzdWx0bmFtZSA9IHBlcmxfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSArIHNlcnZpY2VfbmFtZV8gKyAiXyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKKyAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7CisKKyAgICAgIHRfZnVuY3Rpb24gcmVjdl9mdW5jdGlvbigoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJyZWN2XyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZub2FyZ3MpOworICAgICAgLy8gT3BlbiBmdW5jdGlvbgorICAgICAgZl9zZXJ2aWNlXyA8PCBlbmRsIDw8ICJzdWIgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnJlY3ZfZnVuY3Rpb24pIDw8IGVuZGw7CisKKyAgICAgIGluZGVudF91cCgpOworCisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJteSAkcnNlcWlkID0gMDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm15ICRmbmFtZTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm15ICRtdHlwZSA9IDA7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiRzZWxmLT57aW5wdXR9LT5yZWFkTWVzc2FnZUJlZ2luKFxcJGZuYW1lLCBcXCRtdHlwZSwgXFwkcnNlcWlkKTsiCisgICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlmICgkbXR5cGUgPT0gVGhyaWZ0OjpUTWVzc2FnZVR5cGU6OkVYQ0VQVElPTikgeyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICBteSAkeCA9IFRocmlmdDo6VEFwcGxpY2F0aW9uRXhjZXB0aW9uLT5uZXcoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgPDwgIiAgJHgtPnJlYWQoJHNlbGYtPntpbnB1dH0pOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAiICAkc2VsZi0+e2lucHV0fS0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgZGllICR4OyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAibXkgJHJlc3VsdCA9ICIgPDwgcmVzdWx0bmFtZSA8PCAiLT5uZXcoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgPDwgIiRyZXN1bHQtPnJlYWQoJHNlbGYtPntpbnB1dH0pOyIgPDwgZW5kbDsKKworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiJHNlbGYtPntpbnB1dH0tPnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAgIC8vIENhcmVmdWwsIG9ubHkgcmV0dXJuIHJlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCisgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChkZWZpbmVkICRyZXN1bHQtPntzdWNjZXNzfSApIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgICA8PCAiICByZXR1cm4gJHJlc3VsdC0+e3N1Y2Nlc3N9OyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7CisgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKGRlZmluZWQgJHJlc3VsdC0+eyIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJ9KSB7IgorICAgICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgZGllICRyZXN1bHQtPnsiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAifTsiCisgICAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgLy8gQ2FyZWZ1bCwgb25seSByZXR1cm4gX3Jlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCisgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZGllIFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiBmYWlsZWQ6IHVua25vd24gcmVzdWx0XCI7IgorICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIC8vIENsb3NlIGZ1bmN0aW9uCisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgZl9zZXJ2aWNlXyA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgIH0KK30KKworLyoqCisgKiBEZXNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KKyAqLwordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsYXNzKSB7CisgICh2b2lkKWluY2xhc3M7CisgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKworICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgIH0KKworICBzdHJpbmcgbmFtZSA9IHRmaWVsZC0+Z2V0X25hbWUoKTsKKworICAvLyBIYWNrIGZvciB3aGVuIHByZWZpeCBpcyBkZWZpbmVkIChhbHdheXMgYSBoYXNoIHJlZikKKyAgaWYgKCFwcmVmaXguZW1wdHkoKSkgeworICAgIG5hbWUgPSBwcmVmaXggKyAieyIgKyB0ZmllbGQtPmdldF9uYW1lKCkgKyAifSI7CisgIH0KKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJGlucHV0LT4iOworCisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgb3V0IDw8ICJyZWFkU3RyaW5nKFxcJCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgb3V0IDw8ICJyZWFkQm9vbChcXCQiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICBvdXQgPDwgInJlYWRCeXRlKFxcJCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICBvdXQgPDwgInJlYWRJMTYoXFwkIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgIG91dCA8PCAicmVhZEkzMihcXCQiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgb3V0IDw8ICJyZWFkSTY0KFxcJCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICBvdXQgPDwgInJlYWREb3VibGUoXFwkIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBQRVJMIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgb3V0IDw8ICJyZWFkSTMyKFxcJCIgPDwgbmFtZSA8PCAiKTsiOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKworICB9IGVsc2UgeworICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIERFU0VSSUFMSVpFIEZJRUxEICclcycgVFlQRSAnJXMnXG4iLAorICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgdHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhbiB1bnNlcmlhbGl6ZXIgZm9yIGEgdmFyaWFibGUuIFRoaXMgbWFrZXMgdHdvIGtleSBhc3N1bXB0aW9ucywKKyAqIGZpcnN0IHRoYXQgdGhlcmUgaXMgYSBjb25zdCBjaGFyKiB2YXJpYWJsZSBuYW1lZCBkYXRhIHRoYXQgcG9pbnRzIHRvIHRoZQorICogYnVmZmVyIGZvciBkZXNlcmlhbGl6YXRpb24sIGFuZCB0aGF0IHRoZXJlIGlzIGEgdmFyaWFibGUgcHJvdG9jb2wgd2hpY2gKKyAqIGlzIGEgcmVmZXJlbmNlIHRvIGEgVFByb3RvY29sIHNlcmlhbGl6YXRpb24gb2JqZWN0LgorICovCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIkIiA8PCBwcmVmaXggPDwgIiA9ICIgPDwgcGVybF9uYW1lc3BhY2UodHN0cnVjdC0+Z2V0X3Byb2dyYW0oKSkKKyAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIi0+bmV3KCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkeGZlciArPSAkIiA8PCBwcmVmaXgKKyAgICAgIDw8ICItPnJlYWQoJGlucHV0KTsiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkgeworICBzY29wZV91cChvdXQpOworCisgIHN0cmluZyBzaXplID0gdG1wKCJfc2l6ZSIpOworICBzdHJpbmcga3R5cGUgPSB0bXAoIl9rdHlwZSIpOworICBzdHJpbmcgdnR5cGUgPSB0bXAoIl92dHlwZSIpOworICBzdHJpbmcgZXR5cGUgPSB0bXAoIl9ldHlwZSIpOworCisgIHRfZmllbGQgZnNpemUoZ190eXBlX2kzMiwgc2l6ZSk7CisgIHRfZmllbGQgZmt0eXBlKGdfdHlwZV9pOCwga3R5cGUpOworICB0X2ZpZWxkIGZ2dHlwZShnX3R5cGVfaTgsIHZ0eXBlKTsKKyAgdF9maWVsZCBmZXR5cGUoZ190eXBlX2k4LCBldHlwZSk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJteSAkIiA8PCBzaXplIDw8ICIgPSAwOyIgPDwgZW5kbDsKKworICAvLyBEZWNsYXJlIHZhcmlhYmxlcywgcmVhZCBoZWFkZXIKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJCIgPDwgcHJlZml4IDw8ICIgPSB7fTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm15ICQiIDw8IGt0eXBlIDw8ICIgPSAwOyIKKyAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAibXkgJCIgPDwgdnR5cGUgPDwgIiA9IDA7IiA8PCBlbmRsOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkeGZlciArPSAkaW5wdXQtPnJlYWRNYXBCZWdpbigiCisgICAgICAgIDw8ICJcXCQiIDw8IGt0eXBlIDw8ICIsIFxcJCIgPDwgdnR5cGUgPDwgIiwgXFwkIiA8PCBzaXplIDw8ICIpOyIgPDwgZW5kbDsKKworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkIiA8PCBwcmVmaXggPDwgIiA9IHt9OyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAibXkgJCIgPDwgZXR5cGUgPDwgIiA9IDA7IgorICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkeGZlciArPSAkaW5wdXQtPnJlYWRTZXRCZWdpbigiCisgICAgICAgIDw8ICJcXCQiIDw8IGV0eXBlIDw8ICIsIFxcJCIgPDwgc2l6ZSA8PCAiKTsiIDw8IGVuZGw7CisKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiQiIDw8IHByZWZpeCA8PCAiID0gW107IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJteSAkIiA8PCBldHlwZSA8PCAiID0gMDsiCisgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZExpc3RCZWdpbigiCisgICAgICAgIDw8ICJcXCQiIDw8IGV0eXBlIDw8ICIsIFxcJCIgPDwgc2l6ZSA8PCAiKTsiIDw8IGVuZGw7CisgIH0KKworICAvLyBGb3IgbG9vcCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzCisgIHN0cmluZyBpID0gdG1wKCJfaSIpOworICBpbmRlbnQob3V0KSA8PCAiZm9yIChteSAkIiA8PCBpIDw8ICIgPSAwOyAkIiA8PCBpIDw8ICIgPCAkIiA8PCBzaXplIDw8ICI7ICsrJCIgPDwgaSA8PCAiKSIKKyAgICAgICAgICAgICAgPDwgZW5kbDsKKworICBzY29wZV91cChvdXQpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIHByZWZpeCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBwcmVmaXgpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgcHJlZml4KTsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICAvLyBSZWFkIGNvbnRhaW5lciBlbmQKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkaW5wdXQtPnJlYWRNYXBFbmQoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZFNldEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZExpc3RFbmQoKTsiIDw8IGVuZGw7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGNvZGUgdG8gZGVzZXJpYWxpemUgYSBtYXAKKyAqLwordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdHJpbmcgcHJlZml4KSB7CisgIHN0cmluZyBrZXkgPSB0bXAoImtleSIpOworICBzdHJpbmcgdmFsID0gdG1wKCJ2YWwiKTsKKyAgdF9maWVsZCBma2V5KHRtYXAtPmdldF9rZXlfdHlwZSgpLCBrZXkpOworICB0X2ZpZWxkIGZ2YWwodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZhbCk7CisKKyAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZmtleSwgdHJ1ZSwgdHJ1ZSkgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZnZhbCwgdHJ1ZSwgdHJ1ZSkgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZma2V5KTsKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnZhbCk7CisKKyAgaW5kZW50KG91dCkgPDwgIiQiIDw8IHByZWZpeCA8PCAiLT57JCIgPDwga2V5IDw8ICJ9ID0gJCIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOworfQorCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIGVsZW0gPSB0bXAoImVsZW0iKTsKKyAgdF9maWVsZCBmZWxlbSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOworCisgIGluZGVudChvdXQpIDw8ICJteSAkIiA8PCBlbGVtIDw8ICIgPSB1bmRlZjsiIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOworCisgIGluZGVudChvdXQpIDw8ICIkIiA8PCBwcmVmaXggPDwgIi0+eyQiIDw8IGVsZW0gPDwgIn0gPSAxOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIGVsZW0gPSB0bXAoImVsZW0iKTsKKyAgdF9maWVsZCBmZWxlbSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKKworICBpbmRlbnQob3V0KSA8PCAibXkgJCIgPDwgZWxlbSA8PCAiID0gdW5kZWY7IiA8PCBlbmRsOworCisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKKworICBpbmRlbnQob3V0KSA8PCAicHVzaChAeyQiIDw8IHByZWZpeCA8PCAifSwkIiA8PCBlbGVtIDw8ICIpOyIgPDwgZW5kbDsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCisgKgorICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQgdG8gc2VyaWFsaXplCisgKiBAcGFyYW0gcHJlZml4IE5hbWUgdG8gcHJlcGVuZCB0byBmaWVsZCBuYW1lCisgKi8KK3ZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdHJpbmcgcHJlZml4KSB7CisgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKworICAvLyBEbyBub3RoaW5nIGZvciB2b2lkIHR5cGVzCisgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIFNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgIH0KKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIHByZWZpeCArICJ7IiArIHRmaWVsZC0+Z2V0X25hbWUoKSArICJ9Iik7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgcHJlZml4ICsgInsiICsgdGZpZWxkLT5nZXRfbmFtZSgpICsgIn0iKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKKworICAgIHN0cmluZyBuYW1lID0gdGZpZWxkLT5nZXRfbmFtZSgpOworCisgICAgLy8gSGFjayBmb3Igd2hlbiBwcmVmaXggaXMgZGVmaW5lZCAoYWx3YXlzIGEgaGFzaCByZWYpCisgICAgaWYgKCFwcmVmaXguZW1wdHkoKSkKKyAgICAgIG5hbWUgPSBwcmVmaXggKyAieyIgKyB0ZmllbGQtPmdldF9uYW1lKCkgKyAifSI7CisKKyAgICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJG91dHB1dC0+IjsKKworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIG91dCA8PCAid3JpdGVTdHJpbmcoJCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUJvb2woJCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIG91dCA8PCAid3JpdGVCeXRlKCQiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUkxNigkIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgIG91dCA8PCAid3JpdGVJMzIoJCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICBvdXQgPDwgIndyaXRlSTY0KCQiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgb3V0IDw8ICJ3cml0ZURvdWJsZSgkIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBQRVJMIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgb3V0IDw8ICJ3cml0ZUkzMigkIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgfQorICAgIG91dCA8PCBlbmRsOworCisgIH0gZWxzZSB7CisgICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gU0VSSUFMSVpFIEZJRUxEICclcyVzJyBUWVBFICclcydcbiIsCisgICAgICAgICAgIHByZWZpeC5jX3N0cigpLAorICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgdHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKKyAgfQorfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgYWxsIHRoZSBtZW1iZXJzIG9mIGEgc3RydWN0LgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgdG8gc2VyaWFsaXplCisgKiBAcGFyYW0gcHJlZml4ICBTdHJpbmcgcHJlZml4IHRvIGF0dGFjaCB0byBhbGwgZmllbGRzCisgKi8KK3ZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4KSB7CisgICh2b2lkKXRzdHJ1Y3Q7CisgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkIiA8PCBwcmVmaXggPDwgIi0+d3JpdGUoJG91dHB1dCk7IiA8PCBlbmRsOworfQorCisvKioKKyAqIFdyaXRlcyBvdXQgYSBjb250YWluZXIKKyAqLwordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkgeworICBzY29wZV91cChvdXQpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVNYXBCZWdpbigiCisgICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpIDw8ICIsICIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwgIgorICAgICAgICAgICAgICAgIDw8ICJzY2FsYXIoa2V5cyAleyQiIDw8IHByZWZpeCA8PCAifSkpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTZXRCZWdpbigiCisgICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgPDwgInNjYWxhcihAeyQiIDw8IHByZWZpeCA8PCAifSkpOyIgPDwgZW5kbDsKKworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKworICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkb3V0cHV0LT53cml0ZUxpc3RCZWdpbigiCisgICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgIgorICAgICAgICAgICAgICAgIDw8ICJzY2FsYXIoQHskIiA8PCBwcmVmaXggPDwgIn0pKTsiIDw8IGVuZGw7CisgIH0KKworICBzY29wZV91cChvdXQpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBzdHJpbmcga2l0ZXIgPSB0bXAoImtpdGVyIik7CisgICAgc3RyaW5nIHZpdGVyID0gdG1wKCJ2aXRlciIpOworICAgIGluZGVudChvdXQpIDw8ICJ3aGlsZSggbXkgKCQiIDw8IGtpdGVyIDw8ICIsJCIgPDwgdml0ZXIgPDwgIikgPSBlYWNoICV7JCIgPDwgcHJlZml4IDw8ICJ9KSAiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKworICAgIHNjb3BlX3VwKG91dCk7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwga2l0ZXIsIHZpdGVyKTsKKyAgICBzY29wZV9kb3duKG91dCk7CisKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBzdHJpbmcgaXRlciA9IHRtcCgiaXRlciIpOworICAgIGluZGVudChvdXQpIDw8ICJmb3JlYWNoIG15ICQiIDw8IGl0ZXIgPDwgIiAoQHskIiA8PCBwcmVmaXggPDwgIn0pIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgaXRlcik7CisgICAgc2NvcGVfZG93bihvdXQpOworCisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHN0cmluZyBpdGVyID0gdG1wKCJpdGVyIik7CisgICAgaW5kZW50KG91dCkgPDwgImZvcmVhY2ggbXkgJCIgPDwgaXRlciA8PCAiIChAeyQiIDw8IHByZWZpeCA8PCAifSkgIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBpdGVyKTsKKyAgICBzY29wZV9kb3duKG91dCk7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkb3V0cHV0LT53cml0ZU1hcEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTZXRFbmQoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkb3V0cHV0LT53cml0ZUxpc3RFbmQoKTsiIDw8IGVuZGw7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIG1hcC4KKyAqCisgKi8KK3ZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGtpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHZpdGVyKSB7CisgIHRfZmllbGQga2ZpZWxkKHRtYXAtPmdldF9rZXlfdHlwZSgpLCBraXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZrZmllbGQpOworCisgIHRfZmllbGQgdmZpZWxkKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2aXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZ2ZmllbGQpOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBzZXQuCisgKi8KK3ZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBpdGVyKSB7CisgIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQpOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBsaXN0LgorICovCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdHJpbmcgaXRlcikgeworICB0X2ZpZWxkIGVmaWVsZCh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCk7Cit9CisKKy8qKgorICogRGVjbGFyZXMgYSBmaWVsZCwgd2hpY2ggbWF5IGluY2x1ZGUgaW5pdGlhbGl6YXRpb24gYXMgbmVjZXNzYXJ5LgorICoKKyAqIEBwYXJhbSB0dHlwZSBUaGUgdHlwZQorICovCitzdHJpbmcgdF9wZXJsX2dlbmVyYXRvcjo6ZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdCwgYm9vbCBvYmopIHsKKyAgc3RyaW5nIHJlc3VsdCA9ICJteSAkIiArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgaWYgKGluaXQpIHsKKyAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIHJlc3VsdCArPSAiID0gJyciOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgcmVzdWx0ICs9ICIgPSAwIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICByZXN1bHQgKz0gIiA9IDAiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICByZXN1bHQgKz0gIiA9IDAuMCI7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBQRVJMIGluaXRpYWxpemVyIGZvciBiYXNlIHR5cGUgIgorICAgICAgICAgICAgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICByZXN1bHQgKz0gIiA9IDAiOworICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICAgIHJlc3VsdCArPSAiID0gW10iOworICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgICAgaWYgKG9iaikgeworICAgICAgICByZXN1bHQgKz0gIiA9ICIgKyBwZXJsX25hbWVzcGFjZSh0eXBlLT5nZXRfcHJvZ3JhbSgpKSArIHR5cGUtPmdldF9uYW1lKCkgKyAiLT5uZXcoKSI7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQgKz0gIiA9IHVuZGVmIjsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlc3VsdCArICI7IjsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd0eXBlIG5hbWUoYXJncyknCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCisgKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCisgKi8KK3N0cmluZyB0X3BlcmxfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdHJpbmcgcHJlZml4KSB7CisKKyAgc3RyaW5nIHN0cjsKKworICBzdHIgPSBwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAie1xuIjsKKyAgc3RyICs9ICIgIG15ICRzZWxmID0gc2hpZnQ7XG4iOworCisgIC8vIE5lZWQgdG8gY3JlYXRlIHBlcmwgZnVuY3Rpb24gYXJnIGlucHV0cworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHN0ciArPSAiICBteSAkIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICIgPSBzaGlmdDtcbiI7CisgIH0KKworICByZXR1cm4gc3RyOworfQorCisvKioKKyAqIFJlbmRlcnMgYSBmaWVsZCBsaXN0CisgKi8KK3N0cmluZyB0X3BlcmxfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ICs9ICIsICI7CisgICAgfQorICAgIHJlc3VsdCArPSAiJCIgKyAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhIEMrKyBlbnVtIHN0cmluZyBmb3IgdGhlIGdpdmVuIHR5cGUuCisgKi8KK3N0cmluZyB0X3BlcmxfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICJUaHJpZnQ6OlRUeXBlOjpTVFJJTkciOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiVGhyaWZ0OjpUVHlwZTo6Qk9PTCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiVGhyaWZ0OjpUVHlwZTo6QllURSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gIlRocmlmdDo6VFR5cGU6OkkxNiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gIlRocmlmdDo6VFR5cGU6OkkzMiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIlRocmlmdDo6VFR5cGU6Okk2NCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIlRocmlmdDo6VFR5cGU6OkRPVUJMRSI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiVGhyaWZ0OjpUVHlwZTo6STMyIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICJUaHJpZnQ6OlRUeXBlOjpTVFJVQ1QiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICJUaHJpZnQ6OlRUeXBlOjpNQVAiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICJUaHJpZnQ6OlRUeXBlOjpTRVQiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAiVGhyaWZ0OjpUVHlwZTo6TElTVCI7CisgIH0KKworICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Cit9CisKK1RIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IocGVybCwgIlBlcmwiLCAiIikKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfcGhwX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfcGhwX2dlbmVyYXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGE0NDE1Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9waHBfZ2VuZXJhdG9yLmNjCkBAIC0wLDAgKzEsMjc4NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgInRocmlmdC9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaCIKKwordXNpbmcgc3RkOjptYXA7Cit1c2luZyBzdGQ6Om9zdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjp2ZWN0b3I7CisKK3N0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKKworI2RlZmluZSBOU0dMT0JBTCAobnNnbG9iYWxfLnNpemUoKSA/IG5zZ2xvYmFsXyA6ICIiKQorI2RlZmluZSBOU0dMT0JBTF9BICgiXFwiICsgTlNHTE9CQUwpCisjZGVmaW5lIE5TR0xPQkFMX0IgKE5TR0xPQkFMICsgIlxcIikKKyNkZWZpbmUgTlNHTE9CQUxfQUIgKCJcXCIgKyBOU0dMT0JBTCArICJcXCIpCisKKy8qKgorICogUEhQIGNvZGUgZ2VuZXJhdG9yLgorICoKKyAqLworY2xhc3MgdF9waHBfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7CitwdWJsaWM6CisgIHRfcGhwX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQorICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pIHsKKyAgICAodm9pZClvcHRpb25fc3RyaW5nOworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7CisKKyAgICBiaW5hcnlfaW5saW5lXyA9IGZhbHNlOworICAgIHJlc3RfID0gZmFsc2U7CisgICAgcGhwc18gPSBmYWxzZTsKKyAgICBvb3BfID0gZmFsc2U7CisgICAgdmFsaWRhdGVfID0gZmFsc2U7CisgICAganNvbl9zZXJpYWxpemFibGVfID0gZmFsc2U7CisgICAgbnNnbG9iYWxfID0gIiI7IC8vIGJ5IGRlZmF1bHQgZ2xvYmFsIG5hbWVzcGFjZSBpcyBlbXB0eQorICAgIGNsYXNzbWFwXyA9IGZhbHNlOworICAgIGZvciAoaXRlciA9IHBhcnNlZF9vcHRpb25zLmJlZ2luKCk7IGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCk7ICsraXRlcikgeworICAgICAgaWYgKGl0ZXItPmZpcnN0LmNvbXBhcmUoImlubGluZWQiKSA9PSAwKSB7CisgICAgICAgIGJpbmFyeV9pbmxpbmVfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiAoaXRlci0+Zmlyc3QuY29tcGFyZSgicmVzdCIpID09IDApIHsKKyAgICAgICAgcmVzdF8gPSB0cnVlOworICAgICAgfSBlbHNlIGlmIChpdGVyLT5maXJzdC5jb21wYXJlKCJzZXJ2ZXIiKSA9PSAwKSB7CisgICAgICAgIHBocHNfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiAoaXRlci0+Zmlyc3QuY29tcGFyZSgib29wIikgPT0gMCkgeworICAgICAgICBvb3BfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiAoaXRlci0+Zmlyc3QuY29tcGFyZSgidmFsaWRhdGUiKSA9PSAwKSB7CisgICAgICAgIHZhbGlkYXRlXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYgKGl0ZXItPmZpcnN0LmNvbXBhcmUoImpzb24iKSA9PSAwKSB7CisgICAgICAgIGpzb25fc2VyaWFsaXphYmxlXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYgKGl0ZXItPmZpcnN0LmNvbXBhcmUoIm5zZ2xvYmFsIikgPT0gMCkgeworICAgICAgICBuc2dsb2JhbF8gPSBpdGVyLT5zZWNvbmQ7CisgICAgICB9IGVsc2UgaWYgKGl0ZXItPmZpcnN0LmNvbXBhcmUoImNsYXNzbWFwIikgPT0gMCkgeworICAgICAgICBjbGFzc21hcF8gPSB0cnVlOworICAgICAgfSBlbHNlIGlmIChpdGVyLT5maXJzdC5jb21wYXJlKCJwc3I0IikgPT0gMCkgeworICAgICAgICBpZihjbGFzc21hcF8peworICAgICAgICAgIHRocm93ICJwc3I0IGFuZCBjbGFzc21hcCBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLiI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcHdhcm5pbmcoMCwgInBzcjQgaXMgZGVmYXVsdCBvcHRpb24hIG5lZWRuJ3QgYWRkIHBzcjQgb3B0aW9uIVxuIik7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93ICJ1bmtub3duIG9wdGlvbiBwaHA6IiArIGl0ZXItPmZpcnN0OworICAgICAgfQorICAgIH0KKworICAgIGlmIChvb3BfICYmIGJpbmFyeV9pbmxpbmVfKSB7CisgICAgICB0aHJvdyAib29wIGFuZCBpbmxpbmVkIGFyZSBtdXR1YWxseSBleGNsdXNpdmUuIjsKKyAgICB9CisKKyAgICBvdXRfZGlyX2Jhc2VfID0gKGJpbmFyeV9pbmxpbmVfID8gImdlbi1waHBpIiA6ICJnZW4tcGhwIik7CisgICAgZXNjYXBlX1snJCddID0gIlxcJCI7CisgIH0KKworICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGluZGVudF9zdHIoKSBjb25zdCB7CisgICAgcmV0dXJuICIgICAgIjsKKyAgfQorCisgIHN0YXRpYyBib29sIGlzX3ZhbGlkX25hbWVzcGFjZShjb25zdCBzdGQ6OnN0cmluZyYgc3ViX25hbWVzcGFjZSk7CisKKyAgLyoqCisgICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKKyAgICovCisKKyAgdm9pZCBpbml0X2dlbmVyYXRvcigpOworICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOworCisgIC8qKgorICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pOworICB2b2lkIGdlbmVyYXRlX2NvbnN0cyh2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworCisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKKworICAvKioKKyAgICogU3RydWN0cyEKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9waHBfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfcGhwX3N0cnVjdF9kZWZpbml0aW9uKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCA9IGZhbHNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9waHBfc3RydWN0X3JlYWRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfcmVzdWx0KTsKKyAgdm9pZCBnZW5lcmF0ZV9waHBfc3RydWN0X3dyaXRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfcmVzdWx0KTsKKyAgdm9pZCBnZW5lcmF0ZV9waHBfZnVuY3Rpb25faGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICB2b2lkIGdlbmVyYXRlX3BocF9zdHJ1Y3RfcmVxdWlyZWRfdmFsaWRhdG9yKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBtZXRob2RfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHdyaXRlX21vZGUpOworICB2b2lkIGdlbmVyYXRlX3BocF9zdHJ1Y3RfcmVhZF92YWxpZGF0b3Iob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfcGhwX3N0cnVjdF93cml0ZV92YWxpZGF0b3Iob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfcGhwX3N0cnVjdF9qc29uX3NlcmlhbGl6ZShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX3Jlc3VsdCk7CisgIGJvb2wgbmVlZHNfcGhwX3dyaXRlX3ZhbGlkYXRvcih0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19yZXN1bHQpOworICBib29sIG5lZWRzX3BocF9yZWFkX3ZhbGlkYXRvcih0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19yZXN1bHQpOworICBpbnQgZ2V0X3BocF9udW1fcmVxdWlyZWRfZmllbGRzKGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcywgYm9vbCB3cml0ZV9tb2RlKTsKKworICB2b2lkIGdlbmVyYXRlX3BocF90eXBlX3NwZWMoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdCk7CisgIHZvaWQgZ2VuZXJhdGVfcGhwX3N0cnVjdF9zcGVjKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgLyoqCisgICAqIFNlcnZpY2UtbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9yZXN0KHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfcHJvY2Vzc29yKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24oc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oZWFkZXIodF9zZXJ2aWNlKiB0c2VydmljZSwgc3RkOjpvc3RyZWFtJiBmaWxlKTsKKyAgdm9pZCBnZW5lcmF0ZV9wcm9ncmFtX2hlYWRlcihzdGQ6Om9zdHJlYW0mIGZpbGUpOworCisgIC8qKgorICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsYXNzID0gZmFsc2UpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGtpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB2aXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2V0KiB0bWFwLCBzdGQ6OnN0cmluZyBpdGVyKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0ZDo6c3RyaW5nIGl0ZXIpOworCisgIHZvaWQgZ2VuZXJhdGVfcGhwX2RvYyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpOworCisgIHZvaWQgZ2VuZXJhdGVfcGhwX2RvYyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkKTsKKworICB2b2lkIGdlbmVyYXRlX3BocF9kb2Moc3RkOjpvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisKKyAgdm9pZCBnZW5lcmF0ZV9waHBfZG9jc3RyaW5nX2NvbW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHN0cmluZyBjb250ZW50cyk7CisKKyAgLyoqCisgICAqIEhlbHBlciByZW5kZXJpbmcgZnVuY3Rpb25zCisgICAqLworCisgIHN0ZDo6c3RyaW5nIHBocF9pbmNsdWRlcygpOworICBzdGQ6OnN0cmluZyBkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0ID0gZmFsc2UsIGJvb2wgb2JqID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgYWRkVHlwZUhpbnRzID0gdHJ1ZSk7CisgIHN0ZDo6c3RyaW5nIHR5cGVfdG9fY2FzdCh0X3R5cGUqIHR0eXBlKTsKKyAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOworICBzdGQ6OnN0cmluZyB0eXBlX3RvX3BocGRvYyh0X3R5cGUqIHR0eXBlKTsKKworICBib29sIHBocF9pc19zY2FsYXIodF90eXBlICp0dHlwZSkgeworICAgIHR0eXBlID0gdHR5cGUtPmdldF90cnVlX3R5cGUoKTsKKyAgICBpZih0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSBpZih0dHlwZS0+aXNfZW51bSgpKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgIHN0ZDo6c3RyaW5nIHBocF9uYW1lc3BhY2VfYmFzZShjb25zdCB0X3Byb2dyYW0qIHApIHsKKyAgICBzdGQ6OnN0cmluZyBucyA9IHAtPmdldF9uYW1lc3BhY2UoInBocCIpOworICAgIGNvbnN0IGNoYXIqIGRlbGltaXRlciA9ICJcXCI7CisgICAgc2l6ZV90IHBvc2l0aW9uID0gbnMuZmluZCgnLicpOworICAgIHdoaWxlIChwb3NpdGlvbiAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICAgIG5zLnJlcGxhY2UocG9zaXRpb24sIDEsIGRlbGltaXRlcik7CisgICAgICBwb3NpdGlvbiA9IG5zLmZpbmQoJy4nLCBwb3NpdGlvbiArIDEpOworICAgIH0KKyAgICByZXR1cm4gbnM7CisgIH0KKworICAvLyBnZW5lcmFsIHVzZSBuYW1lc3BhY2UgcHJlZml4aW5nOiBcbXlcbmFtZXNwYWNlXCBvciBteV9uYW1lc3BhY2VfCisgIHN0cmluZyBwaHBfbmFtZXNwYWNlKGNvbnN0IHRfcHJvZ3JhbSogcCkgeworICAgIHN0cmluZyBucyA9IHBocF9uYW1lc3BhY2VfYmFzZShwKTsKKyAgICByZXR1cm4gKG5zZ2xvYmFsXy5zaXplKCkgPyBOU0dMT0JBTF9BQiA6IE5TR0xPQkFMX0IpICsgKG5zLnNpemUoKSA/IChucyArICJcXCIpIDogIiIpOworICB9CisKKyAgLy8gcmV0dXJuIHRoZSBuYW1lc3BhY2Ugb2YgYSBmaWxlOgorICAvLyBnbG9iYWxcbnNcc3ViXG5zIG9yIGdsb2JhbFxucyBvciBzdWJcbnMKKyAgc3RyaW5nIHBocF9uYW1lc3BhY2Vfc3VmZml4KGNvbnN0IHRfcHJvZ3JhbSogcCkgeworICAgIHN0cmluZyBucyA9IHBocF9uYW1lc3BhY2VfYmFzZShwKTsKKworICAgIHJldHVybiBOU0dMT0JBTAorICAgICAgKyAobnMuc2l6ZSgpICYmIE5TR0xPQkFMLnNpemUoKSA/ICJcXCIgOiAiIikKKyAgICAgICsgbnM7CisgIH0KKworICAvLyBhZGQgYSBkaXJlY3RvcnkgdG8gYWxyZWFkeSBleGlzdGluZyBuYW1lc3BhY2UKKyAgc3RyaW5nIHBocF9uYW1lc3BhY2VfZGlyZWN0b3J5KHN0cmluZyBkaXJlY3RvcnksIGJvb2wgZW5kID0gdHJ1ZSkgeworICAgICh2b2lkKWRpcmVjdG9yeTsKKyAgICBpZiAoZW5kKSB7CisgICAgICByZXR1cm4gIjsiOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gIiI7CisgICAgfQorICB9CisKKyAgLy8gd3JpdGluZyBhbiBhdXRsb2FkIGlkZW50aWZpZXIgaW50byBnbG9iYTtsczogbXlcbmFtZXNwYWNlXCBvciBteV9uYW1lc3BhY2VfCisgIHN0cmluZyBwaHBfbmFtZXNwYWNlX2F1dG9sb2FkKGNvbnN0IHRfcHJvZ3JhbSogcCkgeworICAgIHN0ZDo6c3RyaW5nIG5zID0gcGhwX25hbWVzcGFjZV9iYXNlKHApOworICAgIHJldHVybiAobnNnbG9iYWxfLnNpemUoKSA/IE5TR0xPQkFMX0IgOiBOU0dMT0JBTCkgKyAobnMuc2l6ZSgpID8gKG5zICsgIlxcIikgOiAiIik7CisgIH0KKworICAvLyBkZWNsYXJpbmcgYSB0eXBlOiB0eXBlbmFtZSBvciBteV9uYW1lc3BhY2VfdHlwZW5hbWUKKyAgc3RyaW5nIHBocF9uYW1lc3BhY2VfZGVjbGFyYXRpb24odF90eXBlKiB0KSB7IHJldHVybiB0LT5nZXRfbmFtZSgpOyB9CisKKyAgc3RkOjpzdHJpbmcgcGhwX3BhdGgodF9wcm9ncmFtKiBwKSB7CisgICAgc3RkOjpzdHJpbmcgbnMgPSBwLT5nZXRfbmFtZXNwYWNlKCJwaHAucGF0aCIpOworICAgIGlmIChucy5lbXB0eSgpKSB7CisgICAgICByZXR1cm4gcC0+Z2V0X25hbWUoKTsKKyAgICB9CisKKyAgICAvLyBUcmFuc2Zvcm0gdGhlIGphdmEtc3R5bGUgbmFtZXNwYWNlIGludG8gYSBwYXRoLgorICAgIGZvciAoc3RkOjpzdHJpbmc6Oml0ZXJhdG9yIGl0ID0gbnMuYmVnaW4oKTsgaXQgIT0gbnMuZW5kKCk7ICsraXQpIHsKKyAgICAgIGlmICgqaXQgPT0gJy4nKSB7CisgICAgICAgICppdCA9ICcvJzsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbnMgKyAnLyc7CisgIH0KKworICAvKioKKyAgICogVHJhbnNmb3JtIGNsYXNzX21ldGhvZCBpbnRvIENsYXNzTWV0aG9kCisgICAqCisgICAqIEBwYXJhbSBzdHIKKyAgICogQHJldHVybiBzdGlybmcKKyAgICovCisgIHN0cmluZyBjbGFzc2lmeShzdHJpbmcgc3RyKSB7CisgICAgc3RyaW5nIGNsYXNzZSA9ICIiOworCisgICAgdmVjdG9yPHN0cmluZz4geCA9IHNwbGl0KHN0ciwgJ18nKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgeC5zaXplKCk7ICsraSkgeworICAgICAgY2xhc3NlID0gY2xhc3NlICsgY2FwaXRhbGl6ZSh4W2ldKTsKKyAgICB9CisKKyAgICByZXR1cm4gY2xhc3NlOworICB9CisKKyAgLyoqCisgICAqIFNwbGl0IG1ldGhvZAorICAgKiBAcGFyYW0gcworICAgKiBAcGFyYW0gZGVsaW0KKyAgICogQHBhcmFtIGVsZW1zCisgICAqIEByZXR1cm4KKyAgICovCisgIHZlY3RvcjxzdHJpbmc+JiBzcGxpdChjb25zdCBzdHJpbmcmIHMsIGNoYXIgZGVsaW0sIHZlY3RvcjxzdHJpbmc+JiBlbGVtcykgeworICAgIHN0cmluZ3N0cmVhbSBzcyhzKTsKKyAgICBzdHJpbmcgaXRlbTsKKworICAgIHdoaWxlIChnZXRsaW5lKHNzLCBpdGVtLCBkZWxpbSkpIHsKKyAgICAgIGVsZW1zLnB1c2hfYmFjayhpdGVtKTsKKyAgICB9CisKKyAgICByZXR1cm4gZWxlbXM7CisgIH0KKworICB2ZWN0b3I8c3RyaW5nPiBzcGxpdChjb25zdCBzdHJpbmcmIHMsIGNoYXIgZGVsaW0pIHsKKyAgICB2ZWN0b3I8c3RyaW5nPiBlbGVtczsKKworICAgIHJldHVybiBzcGxpdChzLCBkZWxpbSwgZWxlbXMpOworICB9CisKKyAgLyoqCisgICAqIENhcGl0YWxpemUgbWV0aG9kCisgICAqIEBwYXJhbSBzdHIKKyAgICogQHJldHVybgorICAgKi8KKyAgc3RyaW5nIGNhcGl0YWxpemUoc3RyaW5nIHN0cikgeworICAgIHN0cmluZzo6aXRlcmF0b3IgaXQoc3RyLmJlZ2luKCkpOworCisgICAgaWYgKGl0ICE9IHN0ci5lbmQoKSkKKyAgICAgIHN0clswXSA9IHRvdXBwZXIoKHVuc2lnbmVkIGNoYXIpc3RyWzBdKTsKKworICAgIC8vICAgIHdoaWxlKCsraXQgIT0gc3RyLmVuZCgpKQorICAgIC8vICAgIHsKKyAgICAvLyAgICAgICppdCA9IHRvbG93ZXIoKHVuc2lnbmVkIGNoYXIpKml0KTsKKyAgICAvLyAgICB9CisgICAgcmV0dXJuIHN0cjsKKyAgfQorCitwcml2YXRlOgorICAvKioKKyAgICogRmlsZSBzdHJlYW1zCisgICAqLworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfdHlwZXNfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc2VydmljZV87CisKKyAgc3RkOjpzdHJpbmcgcGFja2FnZV9kaXJfOworICAvKioKKyAgICogR2VuZXJhdGUgcHJvdG9jb2wtaW5kZXBlbmRlbnQgdGVtcGxhdGU/IE9yIEJpbmFyeSBpbmxpbmUgY29kZT8KKyAgICovCisgIGJvb2wgYmluYXJ5X2lubGluZV87CisKKyAgLyoqCisgICAqIEdlbmVyYXRlIGEgUkVTVCBoYW5kbGVyIGNsYXNzCisgICAqLworICBib29sIHJlc3RfOworCisgIC8qKgorICAgKiBHZW5lcmF0ZSBzdHVicyBmb3IgYSBQSFAgc2VydmVyCisgICAqLworICBib29sIHBocHNfOworCisgIC8qKgorICAgKiBXaGV0aGVyIHRvIHVzZSBPT1AgYmFzZSBjbGFzcyBUQmFzZQorICAgKi8KKyAgYm9vbCBvb3BfOworCisgIC8qKgorICAgKiBXaGV0aGVyIHRvIGdlbmVyYXRlIG9sZC1zdHlsZSBQSFAgZmlsZSB0byB1c2UgY2xhc3NtYXAgYXV0b2xvYWRpbmcKKyAgICovCisgIGJvb2wgY2xhc3NtYXBfOworCisgIC8qKgorICAgKiBXaGV0aGVyIHRvIGdlbmVyYXRlIHZhbGlkYXRvciBjb2RlCisgICAqLworICBib29sIHZhbGlkYXRlXzsKKworICAvKioKKyAgICogV2hldGhlciB0byBnZW5lcmF0ZSBKc29uU2VyaWFsaXphYmxlIGNsYXNzZXMKKyAgICovCisgIGJvb2wganNvbl9zZXJpYWxpemFibGVfOworCisgIC8qKgorICAgKiBHbG9iYWwgbmFtZXNwYWNlIGZvciBQSFAgNS4zCisgICAqLworICBzdGQ6OnN0cmluZyBuc2dsb2JhbF87Cit9OworCitib29sIHRfcGhwX2dlbmVyYXRvcjo6aXNfdmFsaWRfbmFtZXNwYWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdWJfbmFtZXNwYWNlKSB7CisgIHJldHVybiBzdWJfbmFtZXNwYWNlID09ICJwYXRoIjsKK30KKworLyoqCisgKiBQcmVwYXJlcyBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAorICogc3RyZWFtcy4KKyAqCisgKiBAcGFyYW0gdHByb2dyYW0gVGhlIHByb2dyYW0gdG8gZ2VuZXJhdGUKKyAqLwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgeworICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKKyAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKKworICAvLyBDcmVhdGUgUmVhbCBkaXJlY3RvcnkgTmFtZXNwYWNlcworICB2ZWN0b3I8c3RyaW5nPiBOU3ggPSBzcGxpdChwaHBfbmFtZXNwYWNlX3N1ZmZpeChnZXRfcHJvZ3JhbSgpKSwgJ1xcJyk7CisgIHBhY2thZ2VfZGlyXyA9IGdldF9vdXRfZGlyKCk7CisKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBOU3guc2l6ZSgpOyArK2kpIHsKKyAgICBwYWNrYWdlX2Rpcl8gPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyBOU3hbaV0gKyAiLyI7CisgICAgTUtESVIocGFja2FnZV9kaXJfLmNfc3RyKCkpOworICB9CisKKyAgLy8gUHJlcGFyZSBvdXRwdXQgZmlsZSBmb3IgYWxsIHRoZSB0eXBlcyBpbiBjbGFzc21hcCBtb2RlCisgIGlmIChjbGFzc21hcF8pIHsKKyAgICAvLyBNYWtlIG91dHB1dCBmaWxlCisgICAgc3RyaW5nIGZfdHlwZXNfbmFtZSA9IHBhY2thZ2VfZGlyXyArICJUeXBlcy5waHAiOworICAgIGZfdHlwZXNfLm9wZW4oZl90eXBlc19uYW1lLmNfc3RyKCkpOworICAgIGdlbmVyYXRlX3Byb2dyYW1faGVhZGVyKGZfdHlwZXNfKTsKKyAgfQorfQorCisvKioKKyAqIFByaW50cyBzdGFuZGFyZCBwaHAgaW5jbHVkZXMKKyAqLworc3RyaW5nIHRfcGhwX2dlbmVyYXRvcjo6cGhwX2luY2x1ZGVzKCkgeworICBzdHJpbmcgaW5jbHVkZXMgPSAidXNlIFRocmlmdFxcQmFzZVxcVEJhc2U7XG4iCisgICAgICAgICAgICAgICAgICAgICJ1c2UgVGhyaWZ0XFxUeXBlXFxUVHlwZTtcbiIKKyAgICAgICAgICAgICAgICAgICAgInVzZSBUaHJpZnRcXFR5cGVcXFRNZXNzYWdlVHlwZTtcbiIKKyAgICAgICAgICAgICAgICAgICAgInVzZSBUaHJpZnRcXEV4Y2VwdGlvblxcVEV4Y2VwdGlvbjtcbiIKKyAgICAgICAgICAgICAgICAgICAgInVzZSBUaHJpZnRcXEV4Y2VwdGlvblxcVFByb3RvY29sRXhjZXB0aW9uO1xuIgorICAgICAgICAgICAgICAgICAgICAidXNlIFRocmlmdFxcUHJvdG9jb2xcXFRQcm90b2NvbDtcbiIKKyAgICAgICAgICAgICAgICAgICAgInVzZSBUaHJpZnRcXFByb3RvY29sXFxUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZDtcbiIKKyAgICAgICAgICAgICAgICAgICAgInVzZSBUaHJpZnRcXEV4Y2VwdGlvblxcVEFwcGxpY2F0aW9uRXhjZXB0aW9uO1xuIjsKKworICBpZiAoanNvbl9zZXJpYWxpemFibGVfKSB7CisgICAgaW5jbHVkZXMgKz0gInVzZSBKc29uU2VyaWFsaXphYmxlO1xuIgorICAgICAgICAgICAgICAgICJ1c2Ugc3RkQ2xhc3M7XG4iOworICB9CisKKyAgcmV0dXJuIGluY2x1ZGVzOworfQorCisvKioKKyAqIENsb3NlIHVwIChvciBkb3duKSBzb21lIGZpbGV6LgorICovCit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgeworICBpZiAoY2xhc3NtYXBfKSB7CisgICAgLy8gQ2xvc2UgdHlwZXMgZmlsZQorICAgIGZfdHlwZXNfLmNsb3NlKCk7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSB0eXBlZGVmLiBUaGlzIGlzIG5vdCBkb25lIGluIFBIUCwgdHlwZXMgYXJlIGFsbCBpbXBsaWNpdC4KKyAqCisgKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgorICovCit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7CisgICh2b2lkKXR0eXBlZGVmOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBzZXJ2aWNlIGhlYWRlciBjb250YWlucyBuYW1lc3BhY2Ugc3VmZml4IGFuZCBpbmNsdWRlcyBpbnNpZGUgZmlsZSBzcGVjaWZpZWQKKyAqLwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVhZGVyKHRfc2VydmljZSogdHNlcnZpY2UsIHN0ZDo6b3N0cmVhbSYgZmlsZSkgeworICBmaWxlIDw8ICI8P3BocCIgPDwgZW5kbDsKKyAgaWYgKCFwaHBfbmFtZXNwYWNlX3N1ZmZpeCh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkuZW1wdHkoKSkgeworICAgIGZpbGUgPDwgIm5hbWVzcGFjZSAiIDw8IHBocF9uYW1lc3BhY2Vfc3VmZml4KHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSA8PCAiOyIgPDwgZW5kbAorICAgICAgICAgPDwgZW5kbDsKKyAgfQorICBmaWxlIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IHBocF9pbmNsdWRlcygpOworCisgIGZpbGUgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgcHJvZ3JhbSBoZWFkZXIgY29udGFpbnMgbmFtZXNwYWNlIHN1ZmZpeCBhbmQgaW5jbHVkZXMgaW5zaWRlIGZpbGUgc3BlY2lmaWVkCisgKi8KK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9ncmFtX2hlYWRlcihzdGQ6Om9zdHJlYW0mIGZpbGUpIHsKKyAgZmlsZSA8PCAiPD9waHAiIDw8IGVuZGw7CisgIGlmICghcGhwX25hbWVzcGFjZV9zdWZmaXgoZ2V0X3Byb2dyYW0oKSkuZW1wdHkoKSkgeworICAgIGZpbGUgPDwgIm5hbWVzcGFjZSAiIDw8IHBocF9uYW1lc3BhY2Vfc3VmZml4KGdldF9wcm9ncmFtKCkpIDw8ICI7IiA8PCBlbmRsCisgICAgICAgICA8PCBlbmRsOworICB9CisgIGZpbGUgPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgcGhwX2luY2x1ZGVzKCk7CisKKyAgZmlsZSA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBjb2RlIGZvciBhbiBlbnVtZXJhdGVkIHR5cGUuIFNpbmNlIGRlZmluZSBpcyBleHBlbnNpdmUgdG8gbG9va3VwCisgKiBpbiBQSFAsIHdlIHVzZSBhIGdsb2JhbCBhcnJheSBmb3IgdGhpcy4KKyAqCisgKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCisgKi8KK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSYgZl9lbnVtID0gZl90eXBlc187CisgIGlmICghY2xhc3NtYXBfKSB7CisgICAgc3RyaW5nIGZfZW51bV9uYW1lID0gcGFja2FnZV9kaXJfICsgdGVudW0tPmdldF9uYW1lKCkgKyAiLnBocCI7CisgICAgZl9lbnVtLm9wZW4oZl9lbnVtX25hbWUuY19zdHIoKSk7CisgICAgZ2VuZXJhdGVfcHJvZ3JhbV9oZWFkZXIoZl9lbnVtKTsKKyAgfQorCisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKKworICAvLyBXZSdyZSBhbHNvIGRvaW5nIGl0IHRoaXMgd2F5IHRvIHNlZSBob3cgaXQgcGVyZm9ybXMuIEl0J3MgbW9yZSBsZWdpYmxlCisgIC8vIGNvZGUgYnV0IHlvdSBjYW4ndCBkbyB0aGluZ3MgbGlrZSBhbiAnZXh0cmFjdCcgb24gaXQsIHdoaWNoIGlzIGEgYml0IG9mCisgIC8vIGEgZG93bmVyLgorICBnZW5lcmF0ZV9waHBfZG9jKGZfZW51bSwgdGVudW0pOworICBmX2VudW0gPDwgImZpbmFsIGNsYXNzICIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgZW5kbAorICAgICAgICAgPDwgInsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgICBnZW5lcmF0ZV9waHBfZG9jKGZfZW51bSwgKmNfaXRlcik7CisgICAgaW5kZW50KGZfZW51bSkgPDwgImNvbnN0ICIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8IHZhbHVlIDw8ICI7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudChmX2VudW0pIDw8ICJzdGF0aWMgcHVibGljICRfX25hbWVzID0gYXJyYXkoIiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgICAgaW5kZW50KGZfZW51bSkgPDwgdmFsdWUgPDwgIiA9PiAnIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIicsIiA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX2VudW0pIDw8ICIpOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworCisgIGZfZW51bSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICBpZiAoIWNsYXNzbWFwXykgeworICAgIGZfZW51bS5jbG9zZSgpOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGUgY29uc3RhbnQgY2xhc3MKKyAqCisgKiBPdmVycmlkZSB0aGUgb25lIGZyb20gdF9nZW5lcmF0b3IKKyAqLwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0cyh2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykgeworICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7CisKKyAgLy8gQ3JlYXRlIGNsYXNzIG9ubHkgaWYgbmVlZGVkCisgIGlmIChjb25zdHMuc2l6ZSgpID4gMCkgeworCisgICAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSYgZl9jb25zdHMgPSBmX3R5cGVzXzsKKyAgICBpZiAoIWNsYXNzbWFwXykgeworICAgICAgc3RyaW5nIGZfY29uc3RzX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiQ29uc3RhbnQucGhwIjsKKyAgICAgIGZfY29uc3RzLm9wZW4oZl9jb25zdHNfbmFtZS5jX3N0cigpKTsKKyAgICAgIGdlbmVyYXRlX3Byb2dyYW1faGVhZGVyKGZfY29uc3RzKTsKKyAgICB9CisgICAgZl9jb25zdHMgPDwgImZpbmFsIGNsYXNzIENvbnN0YW50IGV4dGVuZHMgXFxUaHJpZnRcXFR5cGVcXFRDb25zdGFudCI8PCBlbmRsCisgICAgICAgICAgICAgPDwgInsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIC8vIENyZWF0ZSBzdGF0aWMgcHJvcGVydHkKKyAgICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgeworICAgICAgc3RyaW5nIG5hbWUgPSAoKmNfaXRlciktPmdldF9uYW1lKCk7CisKKyAgICAgIGluZGVudChmX2NvbnN0cykgPDwgInN0YXRpYyBwcm90ZWN0ZWQgJCIgPDwgbmFtZSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICAvLyBDcmVhdGUgaW5pdCBmdW5jdGlvbgorICAgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgICBzdHJpbmcgbmFtZSA9ICgqY19pdGVyKS0+Z2V0X25hbWUoKTsKKworICAgICAgZl9jb25zdHMgPDwgZW5kbDsKKworICAgICAgZl9jb25zdHMgPDwgaW5kZW50KCkgPDwgInByb3RlY3RlZCBzdGF0aWMgZnVuY3Rpb24gaW5pdF8iIDw8IG5hbWUgPDwgIigpIiA8PGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgIGluZGVudChmX2NvbnN0cykgPDwgInJldHVybiAiOworICAgICAgZ2VuZXJhdGVfcGhwX2RvYyhmX2NvbnN0cywgKmNfaXRlcik7CisgICAgICBmX2NvbnN0cyA8PCByZW5kZXJfY29uc3RfdmFsdWUoKCpjX2l0ZXIpLT5nZXRfdHlwZSgpLCAoKmNfaXRlciktPmdldF92YWx1ZSgpKTsKKyAgICAgIGZfY29uc3RzIDw8ICI7IiA8PCBlbmRsOworCisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KGZfY29uc3RzKSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfY29uc3RzIDw8ICJ9IiA8PCBlbmRsOworICAgIGlmICghY2xhc3NtYXBfKSB7CisgICAgICBmX2NvbnN0cy5jbG9zZSgpOworICAgIH0KKyAgfQorfQorCisvKioKKyAqIFByaW50cyB0aGUgdmFsdWUgb2YgYSBjb25zdGFudCB3aXRoIHRoZSBnaXZlbiB0eXBlLiBOb3RlIHRoYXQgdHlwZSBjaGVja2luZworICogaXMgTk9UIHBlcmZvcm1lZCBpbiB0aGlzIGZ1bmN0aW9uIGFzIGl0IGlzIGFsd2F5cyBydW4gYmVmb3JlaGFuZCB1c2luZyB0aGUKKyAqIHZhbGlkYXRlX3R5cGVzIG1ldGhvZCBpbiBtYWluLmNjCisgKi8KK3N0cmluZyB0X3BocF9nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgb3V0IDw8ICciJyA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICciJzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIG91dCA8PCAodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwID8gInRydWUiIDogImZhbHNlIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgeworICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIG91dCA8PCAibmV3ICIgPDwgcGhwX25hbWVzcGFjZSh0eXBlLT5nZXRfcHJvZ3JhbSgpKSA8PCB0eXBlLT5nZXRfbmFtZSgpIDw8ICIoYXJyYXkoIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOworICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKKyAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisgICAgICB9CisgICAgICBvdXQgPDwgaW5kZW50KCk7CisgICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGdfdHlwZV9zdHJpbmcsIHZfaXRlci0+Zmlyc3QpOworICAgICAgb3V0IDw8ICIgPT4gIjsKKyAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgICAgb3V0IDw8ICIsIiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICIpKSI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisgICAgb3V0IDw8ICJhcnJheSgiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgb3V0IDw8IGluZGVudCgpOworICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShrdHlwZSwgdl9pdGVyLT5maXJzdCk7CisgICAgICBvdXQgPDwgIiA9PiAiOworICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZSh2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgICAgb3V0IDw8ICIsIiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICIpIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3R5cGUqIGV0eXBlOworICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9CisgICAgb3V0IDw8ICJhcnJheSgiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCk7CisgICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGV0eXBlLCAqdl9pdGVyKTsKKyAgICAgIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgICAgICBvdXQgPDwgIiA9PiB0cnVlIjsKKyAgICAgIH0KKyAgICAgIG91dCA8PCAiLCIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiKSI7CisgIH0KKyAgcmV0dXJuIG91dC5zdHIoKTsKK30KKworLyoqCisgKiBNYWtlIGEgc3RydWN0CisgKi8KK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgZ2VuZXJhdGVfcGhwX3N0cnVjdCh0c3RydWN0LCBmYWxzZSk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGV4Y2VwdGlvbi4gQmFzaWNhbGx5IHRoZSBzYW1lCisgKiBhcyBhIHN0cnVjdCBidXQgZXh0ZW5kcyB0aGUgRXhjZXB0aW9uIGNsYXNzLgorICoKKyAqIEBwYXJhbSB0eGNlcHRpb24gVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7CisgIGdlbmVyYXRlX3BocF9zdHJ1Y3QodHhjZXB0aW9uLCB0cnVlKTsKK30KKworLyoqCisgKiBTdHJ1Y3RzIGNhbiBiZSBub3JtYWwgb3IgZXhjZXB0aW9ucy4KKyAqLwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3BocF9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUmIGZfc3RydWN0ID0gZl90eXBlc187CisgIGlmICghY2xhc3NtYXBfKSB7CisgICAgc3RyaW5nIGZfc3RydWN0X25hbWUgPSBwYWNrYWdlX2Rpcl8gKyB0c3RydWN0LT5nZXRfbmFtZSgpICsgIi5waHAiOworICAgIGZfc3RydWN0Lm9wZW4oZl9zdHJ1Y3RfbmFtZS5jX3N0cigpKTsKKyAgICBnZW5lcmF0ZV9wcm9ncmFtX2hlYWRlcihmX3N0cnVjdCk7CisgIH0KKyAgZ2VuZXJhdGVfcGhwX3N0cnVjdF9kZWZpbml0aW9uKGZfc3RydWN0LCB0c3RydWN0LCBpc19leGNlcHRpb24pOworICBpZiAoIWNsYXNzbWFwXykgeworICAgIGZfc3RydWN0LmNsb3NlKCk7CisgIH0KK30KKwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3BocF90eXBlX3NwZWMob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHQpIHsKKyAgdCA9IGdldF90cnVlX3R5cGUodCk7CisgIGluZGVudChvdXQpIDw8ICIndHlwZScgPT4gIiA8PCB0eXBlX3RvX2VudW0odCkgPDwgIiwiIDw8IGVuZGw7CisKKyAgaWYgKHQtPmlzX2Jhc2VfdHlwZSgpIHx8IHQtPmlzX2VudW0oKSkgeworICAgIC8vIE5vb3AsIHR5cGUgaXMgYWxsIHdlIG5lZWQKKyAgfSBlbHNlIGlmICh0LT5pc19zdHJ1Y3QoKSB8fCB0LT5pc194Y2VwdGlvbigpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIidjbGFzcycgPT4gJyIgPDwgcGhwX25hbWVzcGFjZSh0LT5nZXRfcHJvZ3JhbSgpKSA8PCB0LT5nZXRfbmFtZSgpIDw8ICInLCIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICB9IGVsc2UgaWYgKHQtPmlzX21hcCgpKSB7CisgICAgdF90eXBlKiBrdHlwZSA9IGdldF90cnVlX3R5cGUoKCh0X21hcCopdCktPmdldF9rZXlfdHlwZSgpKTsKKyAgICB0X3R5cGUqIHZ0eXBlID0gZ2V0X3RydWVfdHlwZSgoKHRfbWFwKil0KS0+Z2V0X3ZhbF90eXBlKCkpOworICAgIGluZGVudChvdXQpIDw8ICIna3R5cGUnID0+ICIgPDwgdHlwZV90b19lbnVtKGt0eXBlKSA8PCAiLCIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiJ3Z0eXBlJyA9PiAiIDw8IHR5cGVfdG9fZW51bSh2dHlwZSkgPDwgIiwiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIidrZXknID0+IGFycmF5KCIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBnZW5lcmF0ZV9waHBfdHlwZV9zcGVjKG91dCwga3R5cGUpOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIiksIiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIndmFsJyA9PiBhcnJheSgiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZ2VuZXJhdGVfcGhwX3R5cGVfc3BlYyhvdXQsIHZ0eXBlKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiKSwiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfSBlbHNlIGlmICh0LT5pc19saXN0KCkgfHwgdC0+aXNfc2V0KCkpIHsKKyAgICB0X3R5cGUqIGV0eXBlOworICAgIGlmICh0LT5pc19saXN0KCkpIHsKKyAgICAgIGV0eXBlID0gZ2V0X3RydWVfdHlwZSgoKHRfbGlzdCopdCktPmdldF9lbGVtX3R5cGUoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGV0eXBlID0gZ2V0X3RydWVfdHlwZSgoKHRfc2V0Kil0KS0+Z2V0X2VsZW1fdHlwZSgpKTsKKyAgICB9CisgICAgaW5kZW50KG91dCkgPDwgIidldHlwZScgPT4gIiA8PCB0eXBlX3RvX2VudW0oZXR5cGUpIDw8ICIsIiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICInZWxlbScgPT4gYXJyYXkoIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGdlbmVyYXRlX3BocF90eXBlX3NwZWMob3V0LCBldHlwZSk7CisgICAgaW5kZW50KG91dCkgPDwgIiksIiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyB0eXBlIGZvciBwaHAgc3RydWN0IHNwZWMgZmllbGQiOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHRoZSBzdHJ1Y3Qgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUsIHdoaWNoIGZ1bGx5IHF1YWxpZmllcyBlbm91Z2gKKyAqIHR5cGUgaW5mb3JtYXRpb24gdG8gZ2VuZXJhbGl6ZSBzZXJpYWxpemF0aW9uIHJvdXRpbmVzLgorICovCit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGhwX3N0cnVjdF9zcGVjKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgInN0YXRpYyBwdWJsaWMgJF9UU1BFQyA9IGFycmF5KCIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICBpbmRlbnQob3V0KSA8PCAoKm1faXRlciktPmdldF9rZXkoKSA8PCAiID0+IGFycmF5KCIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIid2YXInID0+ICciIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJywiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICInaXNSZXF1aXJlZCcgPT4gIiA8PCAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCA/ICJ0cnVlIiA6ICJmYWxzZSIpIDw8ICIsIiA8PCBlbmRsOworICAgIGdlbmVyYXRlX3BocF90eXBlX3NwZWMob3V0LCB0KTsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICIpLCIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICIpOyIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuIFRoaXMgaXMgbm90aGluZyBpbiBQSFAKKyAqIHdoZXJlIHRoZSBvYmplY3RzIGFyZSBhbGwganVzdCBhc3NvY2lhdGl2ZSBhcnJheXMgKHVubGVzcyBvZiBjb3Vyc2Ugd2UKKyAqIGRlY2lkZSB0byBzdGFydCB1c2luZyBvYmplY3RzIGZvciB0aGVtLi4uKQorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGhwX3N0cnVjdF9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGdlbmVyYXRlX3BocF9kb2Mob3V0LCB0c3RydWN0KTsKKyAgb3V0IDw8ICJjbGFzcyAiIDw8IHBocF9uYW1lc3BhY2VfZGVjbGFyYXRpb24odHN0cnVjdCk7CisgIGlmIChpc19leGNlcHRpb24pIHsKKyAgICBvdXQgPDwgIiBleHRlbmRzICIKKyAgICAgICAgPDwgIlRFeGNlcHRpb24iOworICB9IGVsc2UgaWYgKG9vcF8pIHsKKyAgICBvdXQgPDwgIiBleHRlbmRzICIKKyAgICAgICAgPDwgIlRCYXNlIjsKKyAgfQorICBpZiAoanNvbl9zZXJpYWxpemFibGVfKSB7CisgICAgb3V0IDw8ICIgaW1wbGVtZW50cyBKc29uU2VyaWFsaXphYmxlIjsKKyAgfQorICBvdXQgPDwgZW5kbAorICAgICAgPDwgInsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAic3RhdGljIHB1YmxpYyAkaXNWYWxpZGF0ZSA9ICIgPDwgKHZhbGlkYXRlXyA/ICJ0cnVlIiA6ICJmYWxzZSIpIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfcGhwX3N0cnVjdF9zcGVjKG91dCwgdHN0cnVjdCk7CisKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIHN0cmluZyBkdmFsID0gIm51bGwiOworICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICBpZiAoKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSAhPSBOVUxMICYmICEodC0+aXNfc3RydWN0KCkgfHwgdC0+aXNfeGNlcHRpb24oKSkpIHsKKyAgICAgIGR2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpLCAoKm1faXRlciktPmdldF92YWx1ZSgpKTsKKyAgICB9CisgICAgZ2VuZXJhdGVfcGhwX2RvYyhvdXQsICptX2l0ZXIpOworICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgJCIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8IGR2YWwgPDwgIjsiIDw8IGVuZGw7CisgIH0KKworICBvdXQgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSBjb25zdHJ1Y3RvciBmcm9tIGFycmF5CisgIHN0cmluZyBwYXJhbSA9IChtZW1iZXJzLnNpemUoKSA+IDApID8gIiR2YWxzID0gbnVsbCIgOiAiIjsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoIiA8PCBwYXJhbSA8PCAiKSI8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgeworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICAgIGlmICgoKm1faXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwgJiYgKHQtPmlzX3N0cnVjdCgpIHx8IHQtPmlzX3hjZXB0aW9uKCkpKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICIkdGhpcy0+IiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIKKyAgICAgICAgICAgICAgICAgICAgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHQsICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkpIDw8ICI7IiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChpc19hcnJheSgkdmFscykpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaWYgKG9vcF8pIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicGFyZW50OjpfX2NvbnN0cnVjdChzZWxmOjokX1RTUEVDLCAkdmFscyk7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKGlzc2V0KCR2YWxzWyciIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJ10pKSB7IiA8PCBlbmRsOworCisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiR0aGlzLT4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gJHZhbHNbJyIKKyAgICAgICAgICAgIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJ107IiA8PCBlbmRsOworCisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKyAgc2NvcGVfZG93bihvdXQpOworICBvdXQgPDwgZW5kbDsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBmdW5jdGlvbiBnZXROYW1lKCkiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiAnIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICInOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBvdXQgPDwgZW5kbDsKKyAgZ2VuZXJhdGVfcGhwX3N0cnVjdF9yZWFkZXIob3V0LCB0c3RydWN0LCBpc19yZXN1bHQpOworICBvdXQgPDwgZW5kbDsKKyAgZ2VuZXJhdGVfcGhwX3N0cnVjdF93cml0ZXIob3V0LCB0c3RydWN0LCBpc19yZXN1bHQpOworICBpZiAobmVlZHNfcGhwX3JlYWRfdmFsaWRhdG9yKHRzdHJ1Y3QsIGlzX3Jlc3VsdCkpIHsKKyAgICBvdXQgPDwgZW5kbDsKKyAgICBnZW5lcmF0ZV9waHBfc3RydWN0X3JlYWRfdmFsaWRhdG9yKG91dCwgdHN0cnVjdCk7CisgIH0KKyAgaWYgKG5lZWRzX3BocF93cml0ZV92YWxpZGF0b3IodHN0cnVjdCwgaXNfcmVzdWx0KSkgeworICAgIG91dCA8PCBlbmRsOworICAgIGdlbmVyYXRlX3BocF9zdHJ1Y3Rfd3JpdGVfdmFsaWRhdG9yKG91dCwgdHN0cnVjdCk7CisgIH0KKyAgaWYgKGpzb25fc2VyaWFsaXphYmxlXykgeworICAgIG91dCA8PCBlbmRsOworICAgIGdlbmVyYXRlX3BocF9zdHJ1Y3RfanNvbl9zZXJpYWxpemUob3V0LCB0c3RydWN0LCBpc19yZXN1bHQpOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyB0aGUgcmVhZCgpIG1ldGhvZCBmb3IgYSBzdHJ1Y3QKKyAqLwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3BocF9zdHJ1Y3RfcmVhZGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfcmVzdWx0KSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIHJlYWQoJGlucHV0KSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKworICBpZiAob29wXykgeworICAgIGlmIChuZWVkc19waHBfcmVhZF92YWxpZGF0b3IodHN0cnVjdCwgaXNfcmVzdWx0KSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIiR0bXAgPSAkdGhpcy0+X3JlYWQoJyIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiJywgc2VsZjo6JF9UU1BFQywgJGlucHV0KTsiCisgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIiR0aGlzLT5fdmFsaWRhdGVGb3JSZWFkKCk7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiAkdG1wOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiAkdGhpcy0+X3JlYWQoJyIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiJywgc2VsZjo6JF9UU1BFQywgJGlucHV0KTsiCisgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIH0KKyAgICBzY29wZV9kb3duKG91dCk7CisgICAgb3V0IDw8IGVuZGw7CisgICAgcmV0dXJuOworICB9CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIkeGZlciA9IDA7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkZm5hbWUgPSBudWxsOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIiRmdHlwZSA9IDA7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkZmlkID0gMDsiIDw8IGVuZGw7CisKKyAgLy8gRGVjbGFyZSBzdGFjayB0bXAgdmFyaWFibGVzCisgIGlmICghYmluYXJ5X2lubGluZV8pIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJGlucHV0LT5yZWFkU3RydWN0QmVnaW4oJGZuYW1lKTsiIDw8IGVuZGw7CisgIH0KKworICAvLyBMb29wIG92ZXIgcmVhZGluZyBpbiBmaWVsZHMKKyAgaW5kZW50KG91dCkgPDwgIndoaWxlICh0cnVlKSB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIC8vIFJlYWQgYmVnaW5uaW5nIGZpZWxkIG1hcmtlcgorICBpZiAoYmluYXJ5X2lubGluZV8pIHsKKyAgICB0X2ZpZWxkIGZmdHlwZShnX3R5cGVfaTgsICJmdHlwZSIpOworICAgIHRfZmllbGQgZmZpZChnX3R5cGVfaTE2LCAiZmlkIik7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmZ0eXBlKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgkZnR5cGUgPT0gIgorICAgICAgICA8PCAiVFR5cGU6OlNUT1ApIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgYnJlYWs7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZmaWQpOworICB9IGVsc2UgeworICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkaW5wdXQtPnJlYWRGaWVsZEJlZ2luKCRmbmFtZSwgJGZ0eXBlLCAkZmlkKTsiIDw8IGVuZGw7CisgICAgLy8gQ2hlY2sgZm9yIGZpZWxkIFNUT1AgbWFya2VyIGFuZCBicmVhaworICAgIGluZGVudChvdXQpIDw8ICJpZiAoJGZ0eXBlID09ICIKKyAgICAgICAgICAgICAgICA8PCAiVFR5cGU6OlNUT1ApIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICB9CisKKyAgLy8gU3dpdGNoIHN0YXRlbWVudCBvbiB0aGUgZmllbGQgd2UgYXJlIHJlYWRpbmcKKyAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoJGZpZCkgeyIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKworICAvLyBHZW5lcmF0ZSBkZXNlcmlhbGl6YXRpb24gY29kZSBmb3Iga25vd24gY2FzZXMKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICI6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJpZiAoJGZ0eXBlID09ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIikgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJ0aGlzLT4iKTsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpZiAoYmluYXJ5X2lubGluZV8pIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSBUUHJvdG9jb2w6OnNraXBCaW5hcnkoJGlucHV0LCAkZnR5cGUpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+c2tpcCgkZnR5cGUpOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICAvLyBJbiB0aGUgZGVmYXVsdCBjYXNlIHdlIHNraXAgdGhlIGZpZWxkCisgIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKyAgaWYgKGJpbmFyeV9pbmxpbmVfKSB7CisgICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICIKKyAgICAgICAgICAgICAgICA8PCAiVFByb3RvY29sOjpza2lwQmluYXJ5KCRpbnB1dCwgJGZ0eXBlKTsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+c2tpcCgkZnR5cGUpOyIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnQob3V0KSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICBpZiAoIWJpbmFyeV9pbmxpbmVfKSB7CisgICAgLy8gUmVhZCBmaWVsZCBlbmQgbWFya2VyCisgICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZEZpZWxkRW5kKCk7IiA8PCBlbmRsOworICB9CisKKyAgc2NvcGVfZG93bihvdXQpOworCisgIGlmICghYmluYXJ5X2lubGluZV8pIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJGlucHV0LT5yZWFkU3RydWN0RW5kKCk7IiA8PCBlbmRsOworICB9CisKKyAgaWYgKG5lZWRzX3BocF9yZWFkX3ZhbGlkYXRvcih0c3RydWN0LCBpc19yZXN1bHQpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIiR0aGlzLT5fdmFsaWRhdGVGb3JSZWFkKCk7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgInJldHVybiAkeGZlcjsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyB0aGUgd3JpdGUoKSBtZXRob2QgZm9yIGEgc3RydWN0CisgKi8KK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9waHBfc3RydWN0X3dyaXRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX3Jlc3VsdCkgeworICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgaWYgKGJpbmFyeV9pbmxpbmVfKSB7CisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jdGlvbiB3cml0ZSgmJG91dHB1dCkiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jdGlvbiB3cml0ZSgkb3V0cHV0KSIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnQob3V0KSA8PCAieyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaWYgKG5lZWRzX3BocF93cml0ZV92YWxpZGF0b3IodHN0cnVjdCwgaXNfcmVzdWx0KSkgeworICAgIGluZGVudChvdXQpIDw8ICIkdGhpcy0+X3ZhbGlkYXRlRm9yV3JpdGUoKTsiIDw8IGVuZGw7CisgIH0KKworICBpZiAob29wXykgeworICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gJHRoaXMtPl93cml0ZSgnIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICInLCBzZWxmOjokX1RTUEVDLCAkb3V0cHV0KTsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKG91dCk7CisgICAgb3V0IDw8IGVuZGw7CisgICAgcmV0dXJuOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgIiR4ZmVyID0gMDsiIDw8IGVuZGw7CisKKyAgaWYgKCFiaW5hcnlfaW5saW5lXykgeworICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkb3V0cHV0LT53cml0ZVN0cnVjdEJlZ2luKCciIDw8IG5hbWUgPDwgIicpOyIgPDwgZW5kbDsKKyAgfQorCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoJHRoaXMtPiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIT09IG51bGwpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgc3RyaW5nIGV4cGVjdDsKKyAgICBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICAgIGV4cGVjdCA9ICJhcnJheSI7CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSkgeworICAgICAgZXhwZWN0ID0gIm9iamVjdCI7CisgICAgfQorICAgIGlmICghZXhwZWN0LmVtcHR5KCkpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCFpc18iIDw8IGV4cGVjdCA8PCAiKCR0aGlzLT4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSkgeyIKKyAgICAgICAgICA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRocm93IG5ldyAiCisgICAgICAgICAgPDwgIlRQcm90b2NvbEV4Y2VwdGlvbignQmFkIHR5cGUgaW4gc3RydWN0dXJlLicsICIKKyAgICAgICAgICA8PCAiVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEpOyIgPDwgZW5kbDsKKyAgICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICB9CisKKyAgICAvLyBXcml0ZSBmaWVsZCBoZWFkZXIKKyAgICBpZiAoYmluYXJ5X2lubGluZV8pIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJG91dHB1dCAuPSBwYWNrKCdjJywgIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiKTsiCisgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiJG91dHB1dCAuPSBwYWNrKCduJywgIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkQmVnaW4oIgorICAgICAgICAgICAgICAgICAgPDwgIiciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJywgIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKQorICAgICAgICAgICAgICAgICAgPDwgIiwgIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiKTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAidGhpcy0+Iik7CisKKyAgICAvLyBXcml0ZSBmaWVsZCBjbG9zZXIKKyAgICBpZiAoIWJpbmFyeV9pbmxpbmVfKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZEVuZCgpOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICB9CisKKyAgaWYgKGJpbmFyeV9pbmxpbmVfKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHBhY2soJ2MnLCAiCisgICAgICAgIDw8ICJUVHlwZTo6U1RPUCk7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZFN0b3AoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgIiR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU3RydWN0RW5kKCk7IiA8PCBlbmRsOworICB9CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gJHhmZXI7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3BocF9zdHJ1Y3RfcmVhZF92YWxpZGF0b3Iob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBnZW5lcmF0ZV9waHBfc3RydWN0X3JlcXVpcmVkX3ZhbGlkYXRvcihvdXQsIHRzdHJ1Y3QsICJfdmFsaWRhdGVGb3JSZWFkIiwgZmFsc2UpOworfQorCit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGhwX3N0cnVjdF93cml0ZV92YWxpZGF0b3Iob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBnZW5lcmF0ZV9waHBfc3RydWN0X3JlcXVpcmVkX3ZhbGlkYXRvcihvdXQsIHRzdHJ1Y3QsICJfdmFsaWRhdGVGb3JXcml0ZSIsIHRydWUpOworfQorCit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGhwX3N0cnVjdF9yZXF1aXJlZF92YWxpZGF0b3Iob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG1ldGhvZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgd3JpdGVfbW9kZSkgeworICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBmdW5jdGlvbiAiIDw8IG1ldGhvZF9uYW1lIDw8ICIoKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworCisgIGlmIChmaWVsZHMuc2l6ZSgpID4gMCkgeworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqZl9pdGVyKTsKKyAgICAgIGlmIChmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQKKyAgICAgICAgICB8fCAoZmllbGQtPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVF9JTl9SRVFfT1VUICYmIHdyaXRlX21vZGUpKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoJHRoaXMtPiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiA9PT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJ0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCdSZXF1aXJlZCBmaWVsZCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIi4iCisgICAgICAgICAgICAgICAgICAgIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgaXMgdW5zZXQhJyk7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3BocF9zdHJ1Y3RfanNvbl9zZXJpYWxpemUob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCkgeworICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIGpzb25TZXJpYWxpemUoKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpZiAobmVlZHNfcGhwX3dyaXRlX3ZhbGlkYXRvcih0c3RydWN0LCBpc19yZXN1bHQpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIiR0aGlzLT5fdmFsaWRhdGVGb3JXcml0ZSgpOyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudChvdXQpIDw8ICIkanNvbiA9IG5ldyBzdGRDbGFzczsiIDw8IGVuZGw7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKworICBpZiAoZmllbGRzLnNpemUoKSA+IDApIHsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIHRfZmllbGQqIGZpZWxkID0gKCpmX2l0ZXIpOworICAgICAgdF90eXBlKiB0eXBlID0gZmllbGQtPmdldF90eXBlKCk7CisgICAgICBjb25zdCBzdHJpbmcmIG5hbWUgPSBmaWVsZC0+Z2V0X25hbWUoKTsKKyAgICAgIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgICAgICB0X3R5cGUqIGtleV90eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgICAgICBpZiAoIShrZXlfdHlwZS0+aXNfYmFzZV90eXBlKCkgfHwga2V5X3R5cGUtPmlzX2VudW0oKSkpIHsKKyAgICAgICAgICAvLyBKU09OIG9iamVjdCBrZXlzIG11c3QgYmUgc3RyaW5ncy4gUEhQJ3MganNvbl9lbmNvZGUoKQorICAgICAgICAgIC8vIGZ1bmN0aW9uIHdpbGwgY29udmVydCBhbnkgc2NhbGFyIGtleSB0byBzdHJpbmdzLCBidXQKKyAgICAgICAgICAvLyB3ZSBza2lwIHRocmlmdCBtYXBzIHdpdGggbm9uLXNjYWxhciBrZXlzLgorICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICB9CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCR0aGlzLT4iIDw8IG5hbWUgPDwgIiAhPT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50KG91dCkgPDwgIiRqc29uLT4iIDw8IG5hbWUgPDwgIiA9ICI7CisgICAgICBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICAgICAgb3V0IDw8ICIob2JqZWN0KSI7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgdHlwZV90b19jYXN0KHR5cGUpOworICAgICAgfQorICAgICAgb3V0IDw8ICIkdGhpcy0+IiA8PCBuYW1lIDw8ICI7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gJGpzb247IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworCisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworfQorCitpbnQgdF9waHBfZ2VuZXJhdG9yOjpnZXRfcGhwX251bV9yZXF1aXJlZF9maWVsZHMoY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzLCBib29sIHdyaXRlX21vZGUpIHsKKyAgaW50IG51bV9yZXEgPSAwOworCisgIGlmIChmaWVsZHMuc2l6ZSgpID4gMCkgeworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQKKyAgICAgICAgICB8fCAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVCAmJiB3cml0ZV9tb2RlKSkgeworICAgICAgICArK251bV9yZXE7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBudW1fcmVxOworfQorCitib29sIHRfcGhwX2dlbmVyYXRvcjo6bmVlZHNfcGhwX3dyaXRlX3ZhbGlkYXRvcih0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19yZXN1bHQpIHsKKyAgcmV0dXJuICh2YWxpZGF0ZV8gJiYgIWlzX3Jlc3VsdCAmJiAhdHN0cnVjdC0+aXNfdW5pb24oKQorICAgICAgICAgICYmIGdldF9waHBfbnVtX3JlcXVpcmVkX2ZpZWxkcyh0c3RydWN0LT5nZXRfbWVtYmVycygpLCB0cnVlKSA+IDApOworfQorCitib29sIHRfcGhwX2dlbmVyYXRvcjo6bmVlZHNfcGhwX3JlYWRfdmFsaWRhdG9yKHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX3Jlc3VsdCkgeworICByZXR1cm4gKHZhbGlkYXRlXyAmJiAhaXNfcmVzdWx0CisgICAgICAgICAgJiYgKGdldF9waHBfbnVtX3JlcXVpcmVkX2ZpZWxkcyh0c3RydWN0LT5nZXRfbWVtYmVycygpLCBmYWxzZSkgPiAwKSk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdGhyaWZ0IHNlcnZpY2UuCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGRlZmluaXRpb24KKyAqLwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBpZihjbGFzc21hcF8pIHsKKyAgICBzdHJpbmcgZl9zZXJ2aWNlX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyBzZXJ2aWNlX25hbWVfICsgIi5waHAiOworICAgIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKKyAgICBnZW5lcmF0ZV9zZXJ2aWNlX2hlYWRlcih0c2VydmljZSwgZl9zZXJ2aWNlXyk7CisgIH0KKworICAvLyBHZW5lcmF0ZSB0aGUgdGhyZWUgbWFpbiBwYXJ0cyBvZiB0aGUgc2VydmljZSAod2VsbCwgdHdvIGZvciBub3cgaW4gUEhQKQorICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSk7CisgIGlmIChyZXN0XykgeworICAgIGdlbmVyYXRlX3NlcnZpY2VfcmVzdCh0c2VydmljZSk7CisgIH0KKyAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOworICBpZiAocGhwc18pIHsKKyAgICBnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3Nvcih0c2VydmljZSk7CisgIH0KKworICBpZihjbGFzc21hcF8pIHsKKyAgICAvLyBDbG9zZSBzZXJ2aWNlIGZpbGUKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisgICAgZl9zZXJ2aWNlXy5jbG9zZSgpOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgorICovCit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3IodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlJiBmX3NlcnZpY2VfcHJvY2Vzc29yID0gZl9zZXJ2aWNlXzsKKyAgaWYgKCFjbGFzc21hcF8pIHsKKyAgICBzdHJpbmcgZl9zZXJ2aWNlX3Byb2Nlc3Nvcl9uYW1lID0gcGFja2FnZV9kaXJfICsgc2VydmljZV9uYW1lXyArICJQcm9jZXNzb3IucGhwIjsKKyAgICBmX3NlcnZpY2VfcHJvY2Vzc29yLm9wZW4oZl9zZXJ2aWNlX3Byb2Nlc3Nvcl9uYW1lLmNfc3RyKCkpOworICAgIGdlbmVyYXRlX3NlcnZpY2VfaGVhZGVyKHRzZXJ2aWNlLCBmX3NlcnZpY2VfcHJvY2Vzc29yKTsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHRoZSBkaXNwYXRjaCBtZXRob2RzCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworCisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX3Byb2Nlc3NvciA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKTsKKyAgICBleHRlbmRzX3Byb2Nlc3NvciA9ICIgZXh0ZW5kcyAiICsgcGhwX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X3Byb2dyYW0oKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICsgZXh0ZW5kcyArICJQcm9jZXNzb3IiOworICB9CisKKyAgLy8gR2VuZXJhdGUgdGhlIGhlYWRlciBwb3J0aW9uCisgIGZfc2VydmljZV9wcm9jZXNzb3IgPDwgImNsYXNzICIgPDwgc2VydmljZV9uYW1lXyA8PCAiUHJvY2Vzc29yIiA8PCBleHRlbmRzX3Byb2Nlc3NvciA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICAgPDwgInsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBmX3NlcnZpY2VfcHJvY2Vzc29yIDw8IGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgJGhhbmRsZXJfID0gbnVsbDsiIDw8IGVuZGw7CisgIH0KKworICBmX3NlcnZpY2VfcHJvY2Vzc29yIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGhhbmRsZXIpIjw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKyAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgeworICAgIGZfc2VydmljZV9wcm9jZXNzb3IgPDwgaW5kZW50KCkgPDwgIiR0aGlzLT5oYW5kbGVyXyA9ICRoYW5kbGVyOyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBmX3NlcnZpY2VfcHJvY2Vzc29yIDw8IGluZGVudCgpIDw8ICJwYXJlbnQ6Ol9fY29uc3RydWN0KCRoYW5kbGVyKTsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBmX3NlcnZpY2VfcHJvY2Vzc29yIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHNlcnZlciBpbXBsZW1lbnRhdGlvbgorICBmX3NlcnZpY2VfcHJvY2Vzc29yIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgZnVuY3Rpb24gcHJvY2VzcygkaW5wdXQsICRvdXRwdXQpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZfc2VydmljZV9wcm9jZXNzb3IgPDwgaW5kZW50KCkgPDwgIiRyc2VxaWQgPSAwOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiJGZuYW1lID0gbnVsbDsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiJG10eXBlID0gMDsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBpZiAoYmluYXJ5X2lubGluZV8pIHsKKyAgICB0X2ZpZWxkIGZmbmFtZShnX3R5cGVfc3RyaW5nLCAiZm5hbWUiKTsKKyAgICB0X2ZpZWxkIGZtdHlwZShnX3R5cGVfaTgsICJtdHlwZSIpOworICAgIHRfZmllbGQgZnNlcWlkKGdfdHlwZV9pMzIsICJyc2VxaWQiKTsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChmX3NlcnZpY2VfcHJvY2Vzc29yLCAmZmZuYW1lLCAiIiwgdHJ1ZSk7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQoZl9zZXJ2aWNlX3Byb2Nlc3NvciwgJmZtdHlwZSwgIiIsIHRydWUpOworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKGZfc2VydmljZV9wcm9jZXNzb3IsICZmc2VxaWQsICIiLCB0cnVlKTsKKyAgfSBlbHNlIHsKKyAgICBmX3NlcnZpY2VfcHJvY2Vzc29yIDw8IGluZGVudCgpIDw8ICIkaW5wdXQtPnJlYWRNZXNzYWdlQmVnaW4oJGZuYW1lLCAkbXR5cGUsICRyc2VxaWQpOyIgPDwgZW5kbDsKKyAgfQorCisgIC8vIEhPVDogY2hlY2sgZm9yIG1ldGhvZCBpbXBsZW1lbnRhdGlvbgorICBmX3NlcnZpY2VfcHJvY2Vzc29yIDw8IGluZGVudCgpIDw8ICIkbWV0aG9kbmFtZSA9ICdwcm9jZXNzXycuJGZuYW1lOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoIW1ldGhvZF9leGlzdHMoJHRoaXMsICRtZXRob2RuYW1lKSkgeyIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKyAgaWYgKGJpbmFyeV9pbmxpbmVfKSB7CisgICAgZl9zZXJ2aWNlX3Byb2Nlc3NvciA8PCBpbmRlbnQoKSA8PCAidGhyb3cgbmV3IFxcRXhjZXB0aW9uKCdGdW5jdGlvbiAnLiRmbmFtZS4nIG5vdCBpbXBsZW1lbnRlZC4nKTsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgZl9zZXJ2aWNlX3Byb2Nlc3NvciA8PCBpbmRlbnQoKSA8PCAiICAkaW5wdXQtPnNraXAoIgorICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlRUeXBlOjpTVFJVQ1QpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICAkaW5wdXQtPnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICAkeCA9IG5ldyAiCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uKCdGdW5jdGlvbiAnLiRmbmFtZS4nIG5vdCBpbXBsZW1lbnRlZC4nLCAiCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uOjpVTktOT1dOX01FVEhPRCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAiICAkb3V0cHV0LT53cml0ZU1lc3NhZ2VCZWdpbigkZm5hbWUsICIKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJUTWVzc2FnZVR5cGU6OkVYQ0VQVElPTiwgJHJzZXFpZCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAiICAkeC0+d3JpdGUoJG91dHB1dCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgICRvdXRwdXQtPndyaXRlTWVzc2FnZUVuZCgpOyIKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgJG91dHB1dC0+Z2V0VHJhbnNwb3J0KCktPmZsdXNoKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAiICByZXR1cm47IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlX3Byb2Nlc3NvciA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIkdGhpcy0+JG1ldGhvZG5hbWUoJHJzZXFpZCwgJGlucHV0LCAkb3V0cHV0KTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHRydWU7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV9wcm9jZXNzb3IgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2VzcyBzdWJmdW5jdGlvbnMKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKGZfc2VydmljZV9wcm9jZXNzb3IsIHRzZXJ2aWNlLCAqZl9pdGVyKTsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV9wcm9jZXNzb3IgPDwgIn0iIDw8IGVuZGw7CisKKyAgaWYgKCFjbGFzc21hcF8pIHsKKyAgICBmX3NlcnZpY2VfcHJvY2Vzc29yLmNsb3NlKCk7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBwcm9jZXNzIGZ1bmN0aW9uIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24gdG8gd3JpdGUgYSBkaXNwYXRjaGVyIGZvcgorICovCit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIC8vIE9wZW4gZnVuY3Rpb24KKyAgb3V0IDw8IGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgZnVuY3Rpb24gcHJvY2Vzc18iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCRzZXFpZCwgJGlucHV0LCAkb3V0cHV0KSIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIHN0cmluZyBhcmdzbmFtZSA9IHBocF9uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpICsgc2VydmljZV9uYW1lXyArICJfIgorICAgICAgICAgICAgICAgICAgICArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfYXJncyI7CisgIHN0cmluZyByZXN1bHRuYW1lID0gcGhwX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgKyBzZXJ2aWNlX25hbWVfICsgIl8iCisgICAgICAgICAgICAgICAgICAgICAgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIkYmluX2FjY2VsID0gKCRpbnB1dCBpbnN0YW5jZW9mICIKKyAgICAgICAgICAgICA8PCAiVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQpICYmIGZ1bmN0aW9uX2V4aXN0cygndGhyaWZ0X3Byb3RvY29sX3JlYWRfYmluYXJ5X2FmdGVyX21lc3NhZ2VfYmVnaW4nKTsiCisgICAgICAgICAgICAgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoJGJpbl9hY2NlbCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIkYXJncyA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2JpbmFyeV9hZnRlcl9tZXNzYWdlX2JlZ2luKCIgPDxlbmRsOworCisgIGluZGVudF91cCgpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiRpbnB1dCwiPDxlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAiJyIgPDwgYXJnc25hbWUgPDwgIicsIiA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAiJGlucHV0LT5pc1N0cmljdFJlYWQoKSIgPDxlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCIpOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiRhcmdzID0gbmV3ICIgPDwgYXJnc25hbWUgPDwgIigpOyIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgIiRhcmdzLT5yZWFkKCRpbnB1dCk7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICBpZiAoIWJpbmFyeV9pbmxpbmVfKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkaW5wdXQtPnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOworICB9CisKKyAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKworICAvLyBEZWNsYXJlIHJlc3VsdCBmb3Igbm9uIG9uZXdheSBmdW5jdGlvbgorICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiRyZXN1bHQgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIoKTsiIDw8IGVuZGw7CisgIH0KKworICAvLyBUcnkgYmxvY2sgZm9yIGEgZnVuY3Rpb24gd2l0aCBleGNlcHRpb25zCisgIGlmICh4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidHJ5IHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgIH0KKworICAvLyBHZW5lcmF0ZSB0aGUgZnVuY3Rpb24gY2FsbAorICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgb3V0IDw8IGluZGVudCgpOworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgb3V0IDw8ICIkcmVzdWx0LT5zdWNjZXNzID0gIjsKKyAgfQorICBvdXQgPDwgIiR0aGlzLT5oYW5kbGVyXy0+IiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCAiLCAiOworICAgIH0KKyAgICBvdXQgPDwgIiRhcmdzLT4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgfQorICBvdXQgPDwgIik7IiA8PCBlbmRsOworCisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiB4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgeworICAgIGluZGVudF9kb3duKCk7CisgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSBjYXRjaCAoIgorICAgICAgICAgICAgICAgICA8PCBwaHBfbmFtZXNwYWNlKGdldF90cnVlX3R5cGUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpKS0+Z2V0X3Byb2dyYW0oKSkKKyAgICAgICAgICAgICAgICAgPDwgKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpIDw8ICIgJCIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIHsiCisgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJHJlc3VsdC0+IiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICQiCisgICAgICAgICAgICAgICAgICAgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBvdXQgPDwgaW5kZW50KCk7CisgICAgICB9CisgICAgfQorICAgIG91dCA8PCAifSIgPDwgZW5kbDsKKyAgfQorCisgIC8vIFNob3J0Y3V0IG91dCBoZXJlIGZvciBvbmV3YXkgZnVuY3Rpb25zCisgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIHJldHVybjsKKyAgfQorCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiJGJpbl9hY2NlbCA9ICgkb3V0cHV0IGluc3RhbmNlb2YgIgorICAgICAgICAgICAgIDw8ICJUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCkgJiYgZnVuY3Rpb25fZXhpc3RzKCd0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYmluYXJ5Jyk7IgorICAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoJGJpbl9hY2NlbCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYmluYXJ5KCIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIkb3V0cHV0LCI8PGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICInIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCk8PCAiJywiIDw8ZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgIlRNZXNzYWdlVHlwZTo6UkVQTFksIjw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICIkcmVzdWx0LCIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgIiRzZXFpZCwiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICIkb3V0cHV0LT5pc1N0cmljdFdyaXRlKCkiPDxlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gU2VyaWFsaXplIHRoZSByZXF1ZXN0IGhlYWRlcgorICBpZiAoYmluYXJ5X2lubGluZV8pIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiRidWZmID0gcGFjaygnTicsICgweDgwMDEwMDAwIHwgIgorICAgICAgICA8PCAiVE1lc3NhZ2VUeXBlOjpSRVBMWSkpOyAiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiRidWZmIC49IHBhY2soJ04nLCBzdHJsZW4oJyIKKyAgICAgICAgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICInKSk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkYnVmZiAuPSAnIgorICAgICAgICA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIic7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkYnVmZiAuPSBwYWNrKCdOJywgJHNlcWlkKTsiCisgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiRyZXN1bHQtPndyaXRlKCRidWZmKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgIiRvdXRwdXQtPndyaXRlKCRidWZmKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiRvdXRwdXQtPmZsdXNoKCk7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJG91dHB1dC0+d3JpdGVNZXNzYWdlQmVnaW4oJyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICInLCAiCisgICAgICAgIDw8ICJUTWVzc2FnZVR5cGU6OlJFUExZLCAkc2VxaWQpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiJHJlc3VsdC0+d3JpdGUoJG91dHB1dCk7IgorICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkb3V0cHV0LT53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgIiRvdXRwdXQtPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOyIgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICAvLyBDbG9zZSBmdW5jdGlvbgorICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGhlbHBlciBmdW5jdGlvbnMgZm9yIGEgc2VydmljZS4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKKyAqLwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworCisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUmIGZfc3RydWN0X2RlZmluaXRpb24gPSBmX3NlcnZpY2VfOworICBpZiAoY2xhc3NtYXBfKSB7CisgICAgZl9zdHJ1Y3RfZGVmaW5pdGlvbiA8PCAiLy8gSEVMUEVSIEZVTkNUSU9OUyBBTkQgU1RSVUNUVVJFUyIgPDwgZW5kbCA8PCBlbmRsOworICB9CisKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X3N0cnVjdCogdHMgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgc3RyaW5nIG5hbWUgPSB0cy0+Z2V0X25hbWUoKTsKKyAgICB0cy0+c2V0X25hbWUoc2VydmljZV9uYW1lXyArICJfIiArIG5hbWUpOworCisgICAgaWYgKCFjbGFzc21hcF8pIHsKKyAgICAgIHN0cmluZyBmX3N0cnVjdF9kZWZpbml0aW9uX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyBzZXJ2aWNlX25hbWVfICsgIl8iICsgbmFtZSArICIucGhwIjsKKyAgICAgIGZfc3RydWN0X2RlZmluaXRpb24ub3BlbihmX3N0cnVjdF9kZWZpbml0aW9uX25hbWUuY19zdHIoKSk7CisgICAgICBnZW5lcmF0ZV9zZXJ2aWNlX2hlYWRlcih0c2VydmljZSwgZl9zdHJ1Y3RfZGVmaW5pdGlvbik7CisgICAgfQorCisgICAgZ2VuZXJhdGVfcGhwX3N0cnVjdF9kZWZpbml0aW9uKGZfc3RydWN0X2RlZmluaXRpb24sIHRzKTsKKyAgICBpZiAoIWNsYXNzbWFwXykgeworICAgICAgZl9zdHJ1Y3RfZGVmaW5pdGlvbi5jbG9zZSgpOworICAgIH0KKworICAgIGdlbmVyYXRlX3BocF9mdW5jdGlvbl9oZWxwZXJzKHRzZXJ2aWNlLCAqZl9pdGVyKTsKKyAgICB0cy0+c2V0X25hbWUobmFtZSk7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgYW5kIGhlbHBlcnMgZm9yIGEgZnVuY3Rpb24uCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24KKyAqLwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3BocF9mdW5jdGlvbl9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sIHNlcnZpY2VfbmFtZV8gKyAiXyIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOworICAgIHRfZmllbGQgc3VjY2Vzcyh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksICJzdWNjZXNzIiwgMCk7CisgICAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7CisgICAgfQorCisgICAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICByZXN1bHQuYXBwZW5kKCpmX2l0ZXIpOworICAgIH0KKworICAgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUmIGZfc3RydWN0X2hlbHBlciA9IGZfc2VydmljZV87CisgICAgaWYgKCFjbGFzc21hcF8pIHsKKyAgICAgIHN0cmluZyBmX3N0cnVjdF9oZWxwZXJfbmFtZSA9IHBhY2thZ2VfZGlyXyArIHJlc3VsdC5nZXRfbmFtZSgpICsgIi5waHAiOworICAgICAgZl9zdHJ1Y3RfaGVscGVyLm9wZW4oZl9zdHJ1Y3RfaGVscGVyX25hbWUuY19zdHIoKSk7CisgICAgICBnZW5lcmF0ZV9zZXJ2aWNlX2hlYWRlcih0c2VydmljZSwgZl9zdHJ1Y3RfaGVscGVyKTsKKyAgICB9CisgICAgZ2VuZXJhdGVfcGhwX3N0cnVjdF9kZWZpbml0aW9uKGZfc3RydWN0X2hlbHBlciwgJnJlc3VsdCwgZmFsc2UsIHRydWUpOworICAgIGlmICghY2xhc3NtYXBfKSB7CisgICAgICBmX3N0cnVjdF9oZWxwZXIuY2xvc2UoKTsKKyAgICB9CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGludGVyZmFjZSBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgorICovCit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlJiBmX3NlcnZpY2VfaW50ZXJmYWNlID0gZl9zZXJ2aWNlXzsKKyAgaWYgKCFjbGFzc21hcF8pIHsKKyAgICBzdHJpbmcgZl9zZXJ2aWNlX2ludGVyZmFjZV9uYW1lID0gcGFja2FnZV9kaXJfICsgc2VydmljZV9uYW1lXyArICJJZi5waHAiOworICAgIGZfc2VydmljZV9pbnRlcmZhY2Uub3BlbihmX3NlcnZpY2VfaW50ZXJmYWNlX25hbWUuY19zdHIoKSk7CisgICAgZ2VuZXJhdGVfc2VydmljZV9oZWFkZXIodHNlcnZpY2UsIGZfc2VydmljZV9pbnRlcmZhY2UpOworICB9CisKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfaWYgPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gIiBleHRlbmRzICIgKyBwaHBfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfcHJvZ3JhbSgpKQorICAgICAgICAgICAgICArIHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpOworICAgIGV4dGVuZHNfaWYgPSAiIGV4dGVuZHMgIiArIHBocF9uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9wcm9ncmFtKCkpCisgICAgICAgICAgICAgICAgICsgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkgKyAiSWYiOworICB9CisgIGdlbmVyYXRlX3BocF9kb2MoZl9zZXJ2aWNlX2ludGVyZmFjZSwgdHNlcnZpY2UpOworICBmX3NlcnZpY2VfaW50ZXJmYWNlIDw8ICJpbnRlcmZhY2UgIiA8PCBwaHBfbmFtZXNwYWNlX2RlY2xhcmF0aW9uKHRzZXJ2aWNlKSA8PCAiSWYiIDw8IGV4dGVuZHNfaWYgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgIDw8ICJ7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9waHBfZG9jKGZfc2VydmljZV9pbnRlcmZhY2UsICpmX2l0ZXIpOworICAgIGluZGVudChmX3NlcnZpY2VfaW50ZXJmYWNlKSA8PCAicHVibGljIGZ1bmN0aW9uICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8ICI7IiA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV9pbnRlcmZhY2UgPDwgIn0iIDw8IGVuZGw7CisKKyAgLy8gQ2xvc2Ugc2VydmljZSBpbnRlcmZhY2UgZmlsZQorICBpZiAoIWNsYXNzbWFwXykgeworICAgIGZfc2VydmljZV9pbnRlcmZhY2UuY2xvc2UoKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIFJFU1QgaW50ZXJmYWNlCisgKi8KK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3Jlc3QodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlJiBmX3NlcnZpY2VfcmVzdCA9IGZfc2VydmljZV87CisgIGlmICghY2xhc3NtYXBfKSB7CisgICAgc3RyaW5nIGZfc2VydmljZV9yZXN0X25hbWUgPSBwYWNrYWdlX2Rpcl8gKyBzZXJ2aWNlX25hbWVfICsgIlJlc3QucGhwIjsKKyAgICBmX3NlcnZpY2VfcmVzdC5vcGVuKGZfc2VydmljZV9yZXN0X25hbWUuY19zdHIoKSk7CisgICAgZ2VuZXJhdGVfc2VydmljZV9oZWFkZXIodHNlcnZpY2UsIGZfc2VydmljZV9yZXN0KTsKKyAgfQorCisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX2lmID0gIiI7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kcyA9ICIgZXh0ZW5kcyAiICsgcGhwX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X3Byb2dyYW0oKSkKKyAgICAgICAgICAgICAgKyB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKTsKKyAgICBleHRlbmRzX2lmID0gIiBleHRlbmRzICIgKyBwaHBfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfcHJvZ3JhbSgpKQorICAgICAgICAgICAgICAgICArIHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpICsgIlJlc3QiOworICB9CisgIGZfc2VydmljZV9yZXN0IDw8ICJjbGFzcyAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIlJlc3QiIDw8IGV4dGVuZHNfaWYgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCAieyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgeworICAgIGZfc2VydmljZV9yZXN0IDw8IGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgJGltcGxfOyIgPDwgZW5kbCA8PCBlbmRsOworICB9CisKKyAgZl9zZXJ2aWNlX3Jlc3QgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkaW1wbCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICIgICR0aGlzLT5pbXBsXyA9ICRpbXBsOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGluZGVudChmX3NlcnZpY2VfcmVzdCkgPDwgInB1YmxpYyBmdW5jdGlvbiAiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCRyZXF1ZXN0KSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGFyZ3MgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgYV9pdGVyOworICAgIGZvciAoYV9pdGVyID0gYXJncy5iZWdpbigpOyBhX2l0ZXIgIT0gYXJncy5lbmQoKTsgKythX2l0ZXIpIHsKKyAgICAgIHRfdHlwZSogYXR5cGUgPSBnZXRfdHJ1ZV90eXBlKCgqYV9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgICBzdHJpbmcgY2FzdCA9IHR5cGVfdG9fY2FzdChhdHlwZSk7CisgICAgICBzdHJpbmcgcmVxID0gIiRyZXF1ZXN0WyciICsgKCphX2l0ZXIpLT5nZXRfbmFtZSgpICsgIiddIjsKKyAgICAgIGlmIChhdHlwZS0+aXNfYm9vbCgpKSB7CisgICAgICAgIGZfc2VydmljZV9yZXN0IDw8IGluZGVudCgpIDw8ICIkIiA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgY2FzdCA8PCAiKCFlbXB0eSgiIDw8IHJlcQorICAgICAgICAgICAgICAgICAgIDw8ICIpICYmICgiIDw8IHJlcSA8PCAiICE9PSAnZmFsc2UnKSk7IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlX3Jlc3QgPDwgaW5kZW50KCkgPDwgIiQiIDw8ICgqYV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gaXNzZXQoIiA8PCByZXEgPDwgIikgPyAiCisgICAgICAgICAgICAgICAgICAgPDwgY2FzdCA8PCByZXEgPDwgIiA6IG51bGw7IiA8PCBlbmRsOworICAgICAgfQorICAgICAgaWYgKGF0eXBlLT5pc19zdHJpbmcoKSAmJiAoKHRfYmFzZV90eXBlKilhdHlwZSktPmlzX3N0cmluZ19saXN0KCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlX3Jlc3QgPDwgaW5kZW50KCkgPDwgIiQiIDw8ICgqYV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gZXhwbG9kZSgnLCcsICQiCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICgqYV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgaWYgKGF0eXBlLT5pc19tYXAoKSB8fCBhdHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICAgIGZfc2VydmljZV9yZXN0IDw8IGluZGVudCgpIDw8ICIkIiA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IGpzb25fZGVjb2RlKCQiCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICgqYV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiLCB0cnVlKTsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgaWYgKGF0eXBlLT5pc19zZXQoKSkgeworICAgICAgICBmX3NlcnZpY2VfcmVzdCA8PCBpbmRlbnQoKSA8PCAiJCIgPDwgKCphX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSBhcnJheV9maWxsX2tleXMoanNvbl9kZWNvZGUoJCIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgKCphX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIsIHRydWUpLCAxKTsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgaWYgKGF0eXBlLT5pc19zdHJ1Y3QoKSB8fCBhdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgICAgICBmX3NlcnZpY2VfcmVzdCA8PCBpbmRlbnQoKSA8PCAiaWYgKCQiIDw8ICgqYV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9PSBudWxsKSB7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgICQiIDw8ICgqYV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gbmV3ICIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgcGhwX25hbWVzcGFjZShhdHlwZS0+Z2V0X3Byb2dyYW0oKSkgPDwgYXR5cGUtPmdldF9uYW1lKCkgPDwgIihqc29uX2RlY29kZSgkIgorICAgICAgICAgICAgICAgICAgICAgICA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgIiwgdHJ1ZSkpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgICAgZl9zZXJ2aWNlX3Jlc3QgPDwgaW5kZW50KCkgPDwgInJldHVybiAkdGhpcy0+aW1wbF8tPiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoIgorICAgICAgICAgICAgICAgPDwgYXJndW1lbnRfbGlzdCgoKmZfaXRlciktPmdldF9hcmdsaXN0KCksIGZhbHNlKSA8PCAiKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlX3Jlc3QpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlX3Jlc3QgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBDbG9zZSBzZXJ2aWNlIHJlc3QgZmlsZQorICBmX3NlcnZpY2VfcmVzdCA8PCBlbmRsOworICBpZiAoIWNsYXNzbWFwXykgeworICAgIGZfc2VydmljZV9yZXN0LmNsb3NlKCk7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGNsaWVudCBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCisgKi8KK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUmIGZfc2VydmljZV9jbGllbnQgPSBmX3NlcnZpY2VfOworICBpZiAoIWNsYXNzbWFwXykgeworICAgIHN0cmluZyBmX3NlcnZpY2VfY2xpZW50X25hbWUgPSBwYWNrYWdlX2Rpcl8gKyBzZXJ2aWNlX25hbWVfICsgIkNsaWVudC5waHAiOworICAgIGZfc2VydmljZV9jbGllbnQub3BlbihmX3NlcnZpY2VfY2xpZW50X25hbWUuY19zdHIoKSk7CisgICAgZ2VuZXJhdGVfc2VydmljZV9oZWFkZXIodHNlcnZpY2UsIGZfc2VydmljZV9jbGllbnQpOworICB9CisKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfY2xpZW50ID0gIiI7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kcyA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpOworICAgIGV4dGVuZHNfY2xpZW50ID0gIiBleHRlbmRzICIgKyBwaHBfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfcHJvZ3JhbSgpKSArIGV4dGVuZHMKKyAgICAgICAgICAgICAgICAgICAgICsgIkNsaWVudCI7CisgIH0KKworICBmX3NlcnZpY2VfY2xpZW50IDw8ICJjbGFzcyAiIDw8IHBocF9uYW1lc3BhY2VfZGVjbGFyYXRpb24odHNlcnZpY2UpIDw8ICJDbGllbnQiIDw8IGV4dGVuZHNfY2xpZW50CisgICAgICAgICAgICAgPDwgIiBpbXBsZW1lbnRzICIgPDwgcGhwX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgPDwgc2VydmljZV9uYW1lXyA8PCAiSWYiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCJ7Ijw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIC8vIFByaXZhdGUgbWVtYmVycworICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCBpbmRlbnQoKSA8PCAicHJvdGVjdGVkICRpbnB1dF8gPSBudWxsOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgInByb3RlY3RlZCAkb3V0cHV0XyA9IG51bGw7IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCBpbmRlbnQoKSA8PCAicHJvdGVjdGVkICRzZXFpZF8gPSAwOyIgPDwgZW5kbCA8PCBlbmRsOworICB9CisKKyAgLy8gQ29uc3RydWN0b3IgZnVuY3Rpb24KKyAgZl9zZXJ2aWNlX2NsaWVudCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRpbnB1dCwgJG91dHB1dCA9IG51bGwpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisgIGlmICghZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCBpbmRlbnQoKSA8PCAicGFyZW50OjpfX2NvbnN0cnVjdCgkaW5wdXQsICRvdXRwdXQpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICIkdGhpcy0+aW5wdXRfID0gJGlucHV0OyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiR0aGlzLT5vdXRwdXRfID0gJG91dHB1dCA/ICRvdXRwdXQgOiAkaW5wdXQ7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlX2NsaWVudCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7CisgICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisKKyAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGVuZGw7CisKKyAgICAvLyBPcGVuIGZ1bmN0aW9uCisgICAgaW5kZW50KGZfc2VydmljZV9jbGllbnQpIDw8ICJwdWJsaWMgZnVuY3Rpb24gIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfY2xpZW50KTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlX2NsaWVudCkgPDwgIiR0aGlzLT5zZW5kXyIgPDwgZnVubmFtZSA8PCAiKCI7CisKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3NlcnZpY2VfY2xpZW50IDw8ICIsICI7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfY2xpZW50IDw8ICIkIiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICB9CisgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCAiKTsiIDw8IGVuZGw7CisKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCk7CisgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGZfc2VydmljZV9jbGllbnQgPDwgInJldHVybiAiOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCAiJHRoaXMtPnJlY3ZfIiA8PCBmdW5uYW1lIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgfQorICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlX2NsaWVudCk7CisgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCBlbmRsOworCisgICAgaW5kZW50KGZfc2VydmljZV9jbGllbnQpIDw8ICJwdWJsaWMgZnVuY3Rpb24gc2VuZF8iIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfc2VydmljZV9jbGllbnQpOworCisgICAgc3RkOjpzdHJpbmcgYXJnc25hbWUgPSBwaHBfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSArIHNlcnZpY2VfbmFtZV8gKyAiXyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKKworICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgIiRhcmdzID0gbmV3ICIgPDwgYXJnc25hbWUgPDwgIigpOyIgPDwgZW5kbDsKKworICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICIkYXJncy0+IiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gJCIKKyAgICAgICAgICAgICAgICAgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorCisgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCBpbmRlbnQoKSA8PCAiJGJpbl9hY2NlbCA9ICgkdGhpcy0+b3V0cHV0XyBpbnN0YW5jZW9mICIKKyAgICAgICAgICAgICAgIDw8ICJUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCkgJiYgZnVuY3Rpb25fZXhpc3RzKCd0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYmluYXJ5Jyk7IgorICAgICAgICAgICAgICAgPDwgZW5kbDsKKworICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgImlmICgkYmluX2FjY2VsKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgc3RyaW5nIG1lc3NhZ2VUeXBlID0gKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSA/ICJUTWVzc2FnZVR5cGU6Ok9ORVdBWSIgOiAiVE1lc3NhZ2VUeXBlOjpDQUxMIjsKKworICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgInRocmlmdF9wcm90b2NvbF93cml0ZV9iaW5hcnkoIiA8PCBlbmRsOworCisgICAgaW5kZW50X3VwKCk7CisgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCBpbmRlbnQoKSA8PCAiJHRoaXMtPm91dHB1dF8sIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgbWVzc2FnZVR5cGUgPDwgIiwiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIkYXJncywiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIkdGhpcy0+c2VxaWRfLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiR0aGlzLT5vdXRwdXRfLT5pc1N0cmljdFdyaXRlKCkiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgIik7IiA8PCBlbmRsOworCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVxdWVzdCBoZWFkZXIKKyAgICBpZiAoYmluYXJ5X2lubGluZV8pIHsKKyAgICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgIiRidWZmID0gcGFjaygnTicsICgweDgwMDEwMDAwIHwgIiA8PCBtZXNzYWdlVHlwZSA8PCAiKSk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIkYnVmZiAuPSBwYWNrKCdOJywgc3RybGVuKCciIDw8IGZ1bm5hbWUgPDwgIicpKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiRidWZmIC49ICciIDw8IGZ1bm5hbWUgPDwgIic7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICIkYnVmZiAuPSBwYWNrKCdOJywgJHRoaXMtPnNlcWlkXyk7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICIkdGhpcy0+b3V0cHV0Xy0+d3JpdGVNZXNzYWdlQmVnaW4oJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICInLCAiIDw8IG1lc3NhZ2VUeXBlIDw8ICIsICR0aGlzLT5zZXFpZF8pOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICAvLyBXcml0ZSB0byB0aGUgc3RyZWFtCisgICAgaWYgKGJpbmFyeV9pbmxpbmVfKSB7CisgICAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICIkYXJncy0+d3JpdGUoJGJ1ZmYpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICAgICAgICA8PCAiJHRoaXMtPm91dHB1dF8tPndyaXRlKCRidWZmKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIiR0aGlzLT5vdXRwdXRfLT5mbHVzaCgpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCBpbmRlbnQoKSA8PCAiJGFyZ3MtPndyaXRlKCR0aGlzLT5vdXRwdXRfKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIiR0aGlzLT5vdXRwdXRfLT53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIiR0aGlzLT5vdXRwdXRfLT5nZXRUcmFuc3BvcnQoKS0+Zmx1c2goKTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfY2xpZW50KTsKKworICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlX2NsaWVudCk7CisKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIHN0ZDo6c3RyaW5nIHJlc3VsdG5hbWUgPSBwaHBfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSArIHNlcnZpY2VfbmFtZV8gKyAiXyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKKyAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7CisKKyAgICAgIHRfZnVuY3Rpb24gcmVjdl9mdW5jdGlvbigoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJyZWN2XyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZub2FyZ3MpOworICAgICAgLy8gT3BlbiBmdW5jdGlvbgorICAgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgZnVuY3Rpb24gIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnJlY3ZfZnVuY3Rpb24pCisgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICBzY29wZV91cChmX3NlcnZpY2VfY2xpZW50KTsKKworICAgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCBpbmRlbnQoKSA8PCAiJGJpbl9hY2NlbCA9ICgkdGhpcy0+aW5wdXRfIGluc3RhbmNlb2YgIgorICAgICAgICAgICAgICAgICAgICAgICA8PCAiVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQpIgorICAgICAgICAgICAgICAgICAgICAgICA8PCAiICYmIGZ1bmN0aW9uX2V4aXN0cygndGhyaWZ0X3Byb3RvY29sX3JlYWRfYmluYXJ5Jyk7IiA8PCBlbmRsOworCisgICAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICJpZiAoJGJpbl9hY2NlbCkgeyIgPDwgZW5kbDsKKworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICIkcmVzdWx0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfYmluYXJ5KCIgPDwgZW5kbDsKKworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICIkdGhpcy0+aW5wdXRfLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiJyIgPDwgcmVzdWx0bmFtZSA8PCAiJywiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiR0aGlzLT5pbnB1dF8tPmlzU3RyaWN0UmVhZCgpIiA8PCBlbmRsOworCisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCBpbmRlbnQoKSA8PCAiKTsiIDw8IGVuZGw7CisKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICIkcnNlcWlkID0gMDsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiRmbmFtZSA9IG51bGw7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIkbXR5cGUgPSAwOyIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgICBpZiAoYmluYXJ5X2lubGluZV8pIHsKKyAgICAgICAgdF9maWVsZCBmZm5hbWUoZ190eXBlX3N0cmluZywgImZuYW1lIik7CisgICAgICAgIHRfZmllbGQgZnNlcWlkKGdfdHlwZV9pMzIsICJyc2VxaWQiKTsKKyAgICAgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCBpbmRlbnQoKSA8PCAiJHZlciA9IHVucGFjaygnTicsICR0aGlzLT5pbnB1dF8tPnJlYWRBbGwoNCkpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIkdmVyID0gJHZlclsxXTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiRtdHlwZSA9ICR2ZXIgJiAweGZmOyIKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkdmVyID0gJHZlciAmIDB4ZmZmZjAwMDA7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgImlmICgkdmVyICE9IDB4ODAwMTAwMDApIHRocm93IG5ldyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlRQcm90b2NvbEV4Y2VwdGlvbignQmFkIHZlcnNpb24gaWRlbnRpZmllcjogJy4kdmVyLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlRQcm90b2NvbEV4Y2VwdGlvbjo6QkFEX1ZFUlNJT04pOyIgPDwgZW5kbDsKKyAgICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQoZl9zZXJ2aWNlX2NsaWVudCwgJmZmbmFtZSwgIiIsIHRydWUpOworICAgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChmX3NlcnZpY2VfY2xpZW50LCAmZnNlcWlkLCAiIiwgdHJ1ZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICIkdGhpcy0+aW5wdXRfLT5yZWFkTWVzc2FnZUJlZ2luKCRmbmFtZSwgJG10eXBlLCAkcnNlcWlkKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKCRtdHlwZSA9PSBUTWVzc2FnZVR5cGU6OkVYQ0VQVElPTikgeyIgPDwgZW5kbDsKKworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCBpbmRlbnQoKSA8PCAiJHggPSBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiR4LT5yZWFkKCR0aGlzLT5pbnB1dF8pOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIkdGhpcy0+aW5wdXRfLT5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ0aHJvdyAkeDsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgIiRyZXN1bHQgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIoKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiRyZXN1bHQtPnJlYWQoJHRoaXMtPmlucHV0Xyk7IiA8PCBlbmRsOworCisgICAgICBpZiAoIWJpbmFyeV9pbmxpbmVfKSB7CisgICAgICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgIiR0aGlzLT5pbnB1dF8tPnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOworICAgICAgfQorCisgICAgICBzY29wZV9kb3duKGZfc2VydmljZV9jbGllbnQpOworCisgICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiByZXN1bHQgaWYgbm90IGEgdm9pZCBmdW5jdGlvbgorICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICJpZiAoJHJlc3VsdC0+c3VjY2VzcyAhPT0gbnVsbCkgeyIgPDwgZW5kbDsKKworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuICRyZXN1bHQtPnN1Y2Nlc3M7IiA8PCBlbmRsOworCisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOworICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKyAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgImlmICgkcmVzdWx0LT4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9PSBudWxsKSB7IiA8PCBlbmRsOworCisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICJ0aHJvdyAkcmVzdWx0LT4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKKworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgfQorCisgICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KKyAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlX2NsaWVudCkgPDwgInJldHVybjsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICJ0aHJvdyBuZXcgXFxFeGNlcHRpb24oXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgZmFpbGVkOiB1bmtub3duIHJlc3VsdFwiKTsiIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIC8vIENsb3NlIGZ1bmN0aW9uCisgICAgICBzY29wZV9kb3duKGZfc2VydmljZV9jbGllbnQpOworICAgIH0KKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV9jbGllbnQgPDwgIn0iIDw8IGVuZGw7CisKKyAgLy8gQ2xvc2Ugc2VydmljZSBjbGllbnQgZmlsZQorICBpZiAoIWNsYXNzbWFwXykgeworICAgIGZfc2VydmljZV9jbGllbnQuY2xvc2UoKTsKKyAgfQorfQorCisvKioKKyAqIERlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgorICovCit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbGFzcykgeworICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisKKyAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgREVTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICB9CisKKyAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIG5hbWUpOworICB9IGVsc2UgeworCisgICAgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lKTsKKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgeworCisgICAgICBpZiAoYmluYXJ5X2lubGluZV8pIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgaXRyYW5zID0gKGluY2xhc3MgPyAiJHRoaXMtPmlucHV0XyIgOiAiJGlucHV0Iik7CisKKyAgICAgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJGxlbiA9IHVucGFjaygnTicsICIgPDwgaXRyYW5zIDw8ICItPnJlYWRBbGwoNCkpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIkbGVuID0gJGxlblsxXTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlmICgkbGVuID4gMHg3ZmZmZmZmZikgeyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgICRsZW4gPSAwIC0gKCgkbGVuIC0gMSkgXiAweGZmZmZmZmZmKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiJCIgPDwgbmFtZSA8PCAiID0gIiA8PCBpdHJhbnMgPDwgIi0+cmVhZEFsbCgkbGVuKTsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJCIgPDwgbmFtZSA8PCAiID0gdW5wYWNrKCdjJywgIiA8PCBpdHJhbnMgPDwgIi0+cmVhZEFsbCgxKSk7IgorICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiQiIDw8IG5hbWUgPDwgIiA9IChib29sKSQiIDw8IG5hbWUgPDwgIlsxXTsiIDw8IGVuZGw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkIiA8PCBuYW1lIDw8ICIgPSB1bnBhY2soJ2MnLCAiIDw8IGl0cmFucyA8PCAiLT5yZWFkQWxsKDEpKTsiCisgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiJCIgPDwgbmFtZSA8PCAiID0gJCIgPDwgbmFtZSA8PCAiWzFdOyIgPDwgZW5kbDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkdmFsID0gdW5wYWNrKCduJywgIiA8PCBpdHJhbnMgPDwgIi0+cmVhZEFsbCgyKSk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiR2YWwgPSAkdmFsWzFdOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaWYgKCR2YWwgPiAweDdmZmYpIHsiCisgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICAkdmFsID0gMCAtICgoJHZhbCAtIDEpIF4gMHhmZmZmKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiJCIgPDwgbmFtZSA8PCAiID0gJHZhbDsiIDw8IGVuZGw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJHZhbCA9IHVucGFjaygnTicsICIgPDwgaXRyYW5zIDw8ICItPnJlYWRBbGwoNCkpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIkdmFsID0gJHZhbFsxXTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlmICgkdmFsID4gMHg3ZmZmZmZmZikgeyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgICR2YWwgPSAwIC0gKCgkdmFsIC0gMSkgXiAweGZmZmZmZmZmKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiJCIgPDwgbmFtZSA8PCAiID0gJHZhbDsiIDw8IGVuZGw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJGFyciA9IHVucGFjaygnTjInLCAiIDw8IGl0cmFucyA8PCAiLT5yZWFkQWxsKDgpKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKCRhcnJbMV0gJiAweDgwMDAwMDAwKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgPDwgIiAgJGFyclsxXSA9ICRhcnJbMV0gXiAweEZGRkZGRkZGOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgIDw8ICIgICRhcnJbMl0gPSAkYXJyWzJdIF4gMHhGRkZGRkZGRjsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgJCIgPDwgbmFtZQorICAgICAgICAgICAgICAgIDw8ICIgPSAwIC0gJGFyclsxXSo0Mjk0OTY3Mjk2IC0gJGFyclsyXSAtIDE7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgICQiIDw8IG5hbWUgPDwgIiA9ICRhcnJbMV0qNDI5NDk2NzI5NiArICRhcnJbMl07IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJGFyciA9IHVucGFjaygnZCcsIHN0cnJldigiIDw8IGl0cmFucyA8PCAiLT5yZWFkQWxsKDgpKSk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiQiIDw8IG5hbWUgPDwgIiA9ICRhcnJbMV07IiA8PCBlbmRsOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gUEhQIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKQorICAgICAgICAgICAgICAgICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiR2YWwgPSB1bnBhY2soJ04nLCAiIDw8IGl0cmFucyA8PCAiLT5yZWFkQWxsKDQpKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgPDwgIiR2YWwgPSAkdmFsWzFdOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaWYgKCR2YWwgPiAweDdmZmZmZmZmKSB7IiA8PCBlbmRsCisgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgICR2YWwgPSAwIC0gKCgkdmFsIC0gMSkgXiAweGZmZmZmZmZmKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iCisgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiQiIDw8IG5hbWUgPDwgIiA9ICR2YWw7IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworCisgICAgICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkaW5wdXQtPiI7CisKKyAgICAgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgICAgIG91dCA8PCAicmVhZFN0cmluZygkIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgICAgICBvdXQgPDwgInJlYWRCb29sKCQiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgICAgICBvdXQgPDwgInJlYWRCeXRlKCQiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICAgICAgb3V0IDw8ICJyZWFkSTE2KCQiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICAgICAgb3V0IDw8ICJyZWFkSTMyKCQiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICAgICAgb3V0IDw8ICJyZWFkSTY0KCQiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICAgICAgb3V0IDw8ICJyZWFkRG91YmxlKCQiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIFBIUCBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgICAgIG91dCA8PCAicmVhZEkzMigkIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIH0KKyAgICAgICAgb3V0IDw8IGVuZGw7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIERFU0VSSUFMSVpFIEZJRUxEICclcycgVFlQRSAnJXMnXG4iLAorICAgICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICAgIHR5cGUtPmdldF9uYW1lKCkuY19zdHIoKSk7CisgICAgfQorICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGFuIHVuc2VyaWFsaXplciBmb3IgYSB2YXJpYWJsZS4gVGhpcyBtYWtlcyB0d28ga2V5IGFzc3VtcHRpb25zLAorICogZmlyc3QgdGhhdCB0aGVyZSBpcyBhIGNvbnN0IGNoYXIqIHZhcmlhYmxlIG5hbWVkIGRhdGEgdGhhdCBwb2ludHMgdG8gdGhlCisgKiBidWZmZXIgZm9yIGRlc2VyaWFsaXphdGlvbiwgYW5kIHRoYXQgdGhlcmUgaXMgYSB2YXJpYWJsZSBwcm90b2NvbCB3aGljaAorICogaXMgYSByZWZlcmVuY2UgdG8gYSBUUHJvdG9jb2wgc2VyaWFsaXphdGlvbiBvYmplY3QuCisgKi8KK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCkgeworICBvdXQgPDwgaW5kZW50KCkgPDwgIiQiIDw8IHByZWZpeCA8PCAiID0gbmV3ICIgPDwgcGhwX25hbWVzcGFjZSh0c3RydWN0LT5nZXRfcHJvZ3JhbSgpKQorICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkeGZlciArPSAkIiA8PCBwcmVmaXgKKyAgICAgIDw8ICItPnJlYWQoJGlucHV0KTsiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4KSB7CisgIHN0cmluZyBzaXplID0gdG1wKCJfc2l6ZSIpOworICBzdHJpbmcga3R5cGUgPSB0bXAoIl9rdHlwZSIpOworICBzdHJpbmcgdnR5cGUgPSB0bXAoIl92dHlwZSIpOworICBzdHJpbmcgZXR5cGUgPSB0bXAoIl9ldHlwZSIpOworCisgIHRfZmllbGQgZnNpemUoZ190eXBlX2kzMiwgc2l6ZSk7CisgIHRfZmllbGQgZmt0eXBlKGdfdHlwZV9pOCwga3R5cGUpOworICB0X2ZpZWxkIGZ2dHlwZShnX3R5cGVfaTgsIHZ0eXBlKTsKKyAgdF9maWVsZCBmZXR5cGUoZ190eXBlX2k4LCBldHlwZSk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIkIiA8PCBwcmVmaXggPDwgIiA9IGFycmF5KCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkIiA8PCBzaXplIDw8ICIgPSAwOyIKKyAgICAgIDw8IGVuZGw7CisKKyAgLy8gRGVjbGFyZSB2YXJpYWJsZXMsIHJlYWQgaGVhZGVyCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiQiIDw8IGt0eXBlIDw8ICIgPSAwOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiJCIgPDwgdnR5cGUgPDwgIiA9IDA7IgorICAgICAgICA8PCBlbmRsOworICAgIGlmIChiaW5hcnlfaW5saW5lXykgeworICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmt0eXBlKTsKKyAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZ2dHlwZSk7CisgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmc2l6ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJHhmZXIgKz0gJGlucHV0LT5yZWFkTWFwQmVnaW4oIgorICAgICAgICAgIDw8ICIkIiA8PCBrdHlwZSA8PCAiLCAkIiA8PCB2dHlwZSA8PCAiLCAkIiA8PCBzaXplIDw8ICIpOyIgPDwgZW5kbDsKKyAgICB9CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaWYgKGJpbmFyeV9pbmxpbmVfKSB7CisgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZXR5cGUpOworICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnNpemUpOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiQiIDw8IGV0eXBlIDw8ICIgPSAwOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICIkeGZlciArPSAkaW5wdXQtPnJlYWRTZXRCZWdpbigiCisgICAgICAgICAgPDwgIiQiIDw8IGV0eXBlIDw8ICIsICQiIDw8IHNpemUgPDwgIik7IiA8PCBlbmRsOworICAgIH0KKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaWYgKGJpbmFyeV9pbmxpbmVfKSB7CisgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZXR5cGUpOworICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnNpemUpOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiQiIDw8IGV0eXBlIDw8ICIgPSAwOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICIkeGZlciArPSAkaW5wdXQtPnJlYWRMaXN0QmVnaW4oIgorICAgICAgICAgIDw8ICIkIiA8PCBldHlwZSA8PCAiLCAkIiA8PCBzaXplIDw8ICIpOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICAvLyBGb3IgbG9vcCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzCisgIHN0cmluZyBpID0gdG1wKCJfaSIpOworICBpbmRlbnQob3V0KSA8PCAiZm9yICgkIiA8PCBpIDw8ICIgPSAwOyAkIiA8PCBpIDw8ICIgPCAkIiA8PCBzaXplIDw8ICI7ICsrJCIgPDwgaSA8PCAiKSB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIHByZWZpeCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBwcmVmaXgpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgcHJlZml4KTsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICBpZiAoIWJpbmFyeV9pbmxpbmVfKSB7CisgICAgLy8gUmVhZCBjb250YWluZXIgZW5kCisgICAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZE1hcEVuZCgpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZFNldEVuZCgpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkaW5wdXQtPnJlYWRMaXN0RW5kKCk7IiA8PCBlbmRsOworICAgIH0KKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBjb2RlIHRvIGRlc2VyaWFsaXplIGEgbWFwCisgKi8KK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdHJpbmcgcHJlZml4KSB7CisgIHN0cmluZyBrZXkgPSB0bXAoImtleSIpOworICBzdHJpbmcgdmFsID0gdG1wKCJ2YWwiKTsKKyAgdF9maWVsZCBma2V5KHRtYXAtPmdldF9rZXlfdHlwZSgpLCBrZXkpOworICB0X2ZpZWxkIGZ2YWwodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZhbCk7CisKKyAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZmtleSwgdHJ1ZSwgdHJ1ZSkgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZnZhbCwgdHJ1ZSwgdHJ1ZSkgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZma2V5KTsKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnZhbCk7CisKKyAgaW5kZW50KG91dCkgPDwgIiQiIDw8IHByZWZpeCA8PCAiWyQiIDw8IGtleSA8PCAiXSA9ICQiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIGVsZW0gPSB0bXAoImVsZW0iKTsKKyAgdF9maWVsZCBmZWxlbSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOworCisgIGluZGVudChvdXQpIDw8ICIkIiA8PCBlbGVtIDw8ICIgPSBudWxsOyIgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7CisKKyAgdF90eXBlKiBlbGVtX3R5cGUgPSB0c2V0LT5nZXRfZWxlbV90eXBlKCk7CisgIGlmKHBocF9pc19zY2FsYXIoZWxlbV90eXBlKSkgeworICAgIGluZGVudChvdXQpIDw8ICIkIiA8PCBwcmVmaXggPDwgIlskIiA8PCBlbGVtIDw8ICJdID0gdHJ1ZTsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgIiQiIDw8IHByZWZpeCA8PCAiW10gPSAkIiA8PCBlbGVtIDw8ICI7IiA8PCBlbmRsOworICB9Cit9CisKK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7CisgIHN0cmluZyBlbGVtID0gdG1wKCJlbGVtIik7CisgIHRfZmllbGQgZmVsZW0odGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgIiQiIDw8IGVsZW0gPDwgIiA9IG51bGw7IiA8PCBlbmRsOworCisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKKworICBpbmRlbnQob3V0KSA8PCAiJCIgPDwgcHJlZml4IDw8ICIgW109ICQiIDw8IGVsZW0gPDwgIjsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgorICoKKyAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkIHRvIHNlcmlhbGl6ZQorICogQHBhcmFtIHByZWZpeCBOYW1lIHRvIHByZXBlbmQgdG8gZmllbGQgbmFtZQorICovCit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdHJpbmcgcHJlZml4KSB7CisgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKworICAvLyBEbyBub3RoaW5nIGZvciB2b2lkIHR5cGVzCisgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIFNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgIH0KKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKKworICAgIHN0cmluZyBuYW1lID0gcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOworCisgICAgaWYgKGJpbmFyeV9pbmxpbmVfKSB7CisgICAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJG91dHB1dCAuPSBwYWNrKCdOJywgc3RybGVuKCQiIDw8IG5hbWUgPDwgIikpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICA8PCAiJG91dHB1dCAuPSAkIiA8PCBuYW1lIDw8ICI7IiA8PCBlbmRsOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHBhY2soJ2MnLCAkIiA8PCBuYW1lIDw8ICIgPyAxIDogMCk7IiA8PCBlbmRsOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJG91dHB1dCAuPSBwYWNrKCdjJywgJCIgPDwgbmFtZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJG91dHB1dCAuPSBwYWNrKCduJywgJCIgPDwgbmFtZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJG91dHB1dCAuPSBwYWNrKCdOJywgJCIgPDwgbmFtZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJG91dHB1dCAuPSBwYWNrKCdOMicsICQiIDw8IG5hbWUgPDwgIiA+PiAzMiwgJCIgPDwgbmFtZQorICAgICAgICAgICAgICA8PCAiICYgMHhGRkZGRkZGRik7IiA8PCBlbmRsOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiRvdXRwdXQgLj0gc3RycmV2KHBhY2soJ2QnLCAkIiA8PCBuYW1lIDw8ICIpKTsiIDw8IGVuZGw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBQSFAgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiRvdXRwdXQgLj0gcGFjaygnTicsICQiIDw8IG5hbWUgPDwgIik7IiA8PCBlbmRsOworICAgICAgfQorICAgIH0gZWxzZSB7CisKKyAgICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkb3V0cHV0LT4iOworCisgICAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICAgIG91dCA8PCAid3JpdGVTdHJpbmcoJCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgICAgb3V0IDw8ICJ3cml0ZUJvb2woJCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICAgIG91dCA8PCAid3JpdGVCeXRlKCQiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgICAgb3V0IDw8ICJ3cml0ZUkxNigkIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICAgIG91dCA8PCAid3JpdGVJMzIoJCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgICBvdXQgPDwgIndyaXRlSTY0KCQiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgICAgb3V0IDw8ICJ3cml0ZURvdWJsZSgkIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBQSFAgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgICBvdXQgPDwgIndyaXRlSTMyKCQiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgIH0KKyAgICAgIG91dCA8PCBlbmRsOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgRklFTEQgJyVzJXMnIFRZUEUgJyVzJ1xuIiwKKyAgICAgICAgICAgcHJlZml4LmNfc3RyKCksCisgICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICB0eXBlLT5nZXRfbmFtZSgpLmNfc3RyKCkpOworICB9Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhbGwgdGhlIG1lbWJlcnMgb2YgYSBzdHJ1Y3QuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCB0byBzZXJpYWxpemUKKyAqIEBwYXJhbSBwcmVmaXggIFN0cmluZyBwcmVmaXggdG8gYXR0YWNoIHRvIGFsbCBmaWVsZHMKKyAqLwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCkgeworICAodm9pZCl0c3RydWN0OworICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJCIgPDwgcHJlZml4IDw8ICItPndyaXRlKCRvdXRwdXQpOyIgPDwgZW5kbDsKK30KKworLyoqCisgKiBXcml0ZXMgb3V0IGEgY29udGFpbmVyCisgKi8KK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkgeworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaWYgKGJpbmFyeV9pbmxpbmVfKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiRvdXRwdXQgLj0gcGFjaygnYycsICIgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpCisgICAgICAgICAgPDwgIik7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHBhY2soJ2MnLCAiCisgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpIDw8ICIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICIkb3V0cHV0IC49IHN0cnJldihwYWNrKCdsJywgY291bnQoJCIgPDwgcHJlZml4IDw8ICIpKSk7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiJG91dHB1dC0+d3JpdGVNYXBCZWdpbigiIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKQorICAgICAgICAgICAgICAgICAgPDwgIiwgIiA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwgIgorICAgICAgICAgICAgICAgICAgPDwgImNvdW50KCQiIDw8IHByZWZpeCA8PCAiKSk7IiA8PCBlbmRsOworICAgIH0KKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpZiAoYmluYXJ5X2lubGluZV8pIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJG91dHB1dCAuPSBwYWNrKCdjJywgIiA8PCB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpCisgICAgICAgICAgPDwgIik7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHN0cnJldihwYWNrKCdsJywgY291bnQoJCIgPDwgcHJlZml4IDw8ICIpKSk7IgorICAgICAgICAgIDw8IGVuZGw7CisKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgIiRvdXRwdXQtPndyaXRlU2V0QmVnaW4oIiA8PCB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpCisgICAgICAgICAgICAgICAgICA8PCAiLCAiCisgICAgICAgICAgICAgICAgICA8PCAiY291bnQoJCIgPDwgcHJlZml4IDw8ICIpKTsiIDw8IGVuZGw7CisgICAgfQorICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpZiAoYmluYXJ5X2lubGluZV8pIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJG91dHB1dCAuPSBwYWNrKCdjJywgIiA8PCB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKQorICAgICAgICAgIDw8ICIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiJG91dHB1dCAuPSBzdHJyZXYocGFjaygnbCcsIGNvdW50KCQiIDw8IHByZWZpeCA8PCAiKSkpOyIKKyAgICAgICAgICA8PCBlbmRsOworCisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICIkb3V0cHV0LT53cml0ZUxpc3RCZWdpbigiIDw8IHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpCisgICAgICAgICAgICAgICAgICA8PCAiLCAiCisgICAgICAgICAgICAgICAgICA8PCAiY291bnQoJCIgPDwgcHJlZml4IDw8ICIpKTsiIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHN0cmluZyBraXRlciA9IHRtcCgia2l0ZXIiKTsKKyAgICBzdHJpbmcgdml0ZXIgPSB0bXAoInZpdGVyIik7CisgICAgaW5kZW50KG91dCkgPDwgImZvcmVhY2ggKCQiIDw8IHByZWZpeCA8PCAiIGFzICIKKyAgICAgICAgICAgICAgICA8PCAiJCIgPDwga2l0ZXIgPDwgIiA9PiAkIiA8PCB2aXRlciA8PCAiKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIGtpdGVyLCB2aXRlcik7CisgICAgc2NvcGVfZG93bihvdXQpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIHN0cmluZyBpdGVyID0gdG1wKCJpdGVyIik7CisgICAgc3RyaW5nIGl0ZXJfdmFsID0gdG1wKCJpdGVyIik7CisgICAgaW5kZW50KG91dCkgPDwgImZvcmVhY2ggKCQiIDw8IHByZWZpeCA8PCAiIGFzICQiIDw8IGl0ZXIgPDwgIiA9PiAkIiA8PCBpdGVyX3ZhbCA8PCAiKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgdF90eXBlKiBlbGVtX3R5cGUgPSAoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICBpZihwaHBfaXNfc2NhbGFyKGVsZW1fdHlwZSkpIHsKKyAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIGl0ZXIpOworICAgIH0gZWxzZSB7CisgICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBpdGVyX3ZhbCk7CisgICAgfQorICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgc3RyaW5nIGl0ZXIgPSB0bXAoIml0ZXIiKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yZWFjaCAoJCIgPDwgcHJlZml4IDw8ICIgYXMgJCIgPDwgaXRlciA8PCAiKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgaXRlcik7CisgICAgc2NvcGVfZG93bihvdXQpOworICB9CisKKyAgaWYgKCFiaW5hcnlfaW5saW5lXykgeworICAgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICIkb3V0cHV0LT53cml0ZU1hcEVuZCgpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIiRvdXRwdXQtPndyaXRlU2V0RW5kKCk7IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIiRvdXRwdXQtPndyaXRlTGlzdEVuZCgpOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KK30KKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbWFwLgorICoKKyAqLwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcga2l0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB2aXRlcikgeworICB0X2ZpZWxkIGtmaWVsZCh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2l0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAma2ZpZWxkLCAiIik7CisKKyAgdF9maWVsZCB2ZmllbGQodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJnZmaWVsZCwgIiIpOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBzZXQuCisgKi8KK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIGl0ZXIpIHsKKyAgdF9maWVsZCBlZmllbGQodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIpOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBsaXN0LgorICovCit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0cmluZyBpdGVyKSB7CisgIHRfZmllbGQgZWZpZWxkKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIik7Cit9CisKKy8qKgorICogRW1pdHMgYSBQSFBEb2MgY29tbWVudCBmb3IgdGhlIGdpdmVuIGNvbnRlbnRzCisgKi8KK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9waHBfZG9jc3RyaW5nX2NvbW1lbnQob3N0cmVhbSYgb3V0LCBzdHJpbmcgY29udGVudHMpIHsKKyAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCAiLyoqXG4iLCAiICogIiwgY29udGVudHMsICIgKi9cbiIpOworfQorCisvKioKKyAqIEVtaXRzIGEgUEhQRG9jIGNvbW1lbnQgaWYgdGhlIHByb3ZpZGVkIG9iamVjdCBoYXMgYSBkb2MgaW4gVGhyaWZ0CisgKi8KK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9waHBfZG9jKG9zdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpIHsKKyAgaWYgKHRkb2MtPmhhc19kb2MoKSkgeworICAgIGdlbmVyYXRlX3BocF9kb2NzdHJpbmdfY29tbWVudChvdXQsIHRkb2MtPmdldF9kb2MoKSk7CisgIH0KK30KKworLyoqCisgKiBFbWl0cyBhIFBIUERvYyBjb21tZW50IGZvciBhIGZpZWxkCisgKi8KK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9waHBfZG9jKG9zdHJlYW0mIG91dCwgdF9maWVsZCogZmllbGQpIHsKKyAgc3RyaW5nc3RyZWFtIHNzOworCisgIC8vIHByZXBlbmQgZnJlZS1zdHlsZSBkb2MgaWYgYXZhaWxhYmxlCisgIGlmIChmaWVsZC0+aGFzX2RvYygpKSB7CisgICAgc3MgPDwgZmllbGQtPmdldF9kb2MoKSA8PCBlbmRsOworICB9CisKKyAgLy8gYXBwZW5kIEB2YXIgdGFnCisgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUoZmllbGQtPmdldF90eXBlKCkpOworICBzcyA8PCAiQHZhciAiIDw8IHR5cGVfdG9fcGhwZG9jKHR5cGUpIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfcGhwX2RvY3N0cmluZ19jb21tZW50KG91dCwgc3Muc3RyKCkpOworfQorCisvKioKKyAqIEVtaXRzIGEgUEhQRG9jIGNvbW1lbnQgZm9yIGEgZnVuY3Rpb24KKyAqLwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3BocF9kb2Mob3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiBmdW5jdGlvbikgeworICBzdHJpbmdzdHJlYW0gc3M7CisgIGlmIChmdW5jdGlvbi0+aGFzX2RvYygpKSB7CisgICAgc3MgPDwgZnVuY3Rpb24tPmdldF9kb2MoKSA8PCBlbmRsOworICB9CisKKyAgLy8gZ2VuZXJhdGUgcGFyYW1ldGVyIHR5cGVzIGRvYworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBhcmdzID0gZnVuY3Rpb24tPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGFfaXRlcjsKKyAgZm9yIChhX2l0ZXIgPSBhcmdzLmJlZ2luKCk7IGFfaXRlciAhPSBhcmdzLmVuZCgpOyArK2FfaXRlcikgeworICAgIHRfZmllbGQqIGFyZyA9ICphX2l0ZXI7CisgICAgc3MgPDwgIkBwYXJhbSAiIDw8IHR5cGVfdG9fcGhwZG9jKGFyZy0+Z2V0X3R5cGUoKSkgPDwgIiAkIiA8PCBhcmctPmdldF9uYW1lKCk7CisgICAgaWYgKGFyZy0+aGFzX2RvYygpKSB7CisgICAgICBzcyA8PCAiICIgPDwgYXJnLT5nZXRfZG9jKCk7CisgICAgfQorICAgIHNzIDw8IGVuZGw7CisgIH0KKworICAvLyBnZW5lcmF0ZSByZXR1cm4gdHlwZSBkb2MKKyAgdF90eXBlKiByZXRfdHlwZSA9IGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpOworICBpZiAoIXJldF90eXBlLT5pc192b2lkKCkgfHwgcmV0X3R5cGUtPmhhc19kb2MoKSkgeworICAgIHNzIDw8ICJAcmV0dXJuICIgPDwgdHlwZV90b19waHBkb2MocmV0X3R5cGUpOworICAgIGlmIChyZXRfdHlwZS0+aGFzX2RvYygpKSB7CisgICAgICBzcyA8PCAiICIgPDwgcmV0X3R5cGUtPmdldF9kb2MoKTsKKyAgICB9CisgICAgc3MgPDwgZW5kbDsKKyAgfQorCisgIC8vIGdlbmVyYXRlIGV4Y2VwdGlvbnMgZG9jCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGV4Y3MgPSBmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBlX2l0ZXI7CisgIGZvciAoZV9pdGVyID0gZXhjcy5iZWdpbigpOyBlX2l0ZXIgIT0gZXhjcy5lbmQoKTsgKytlX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBleGMgPSAqZV9pdGVyOworICAgIHNzIDw8ICJAdGhyb3dzICIgPDwgdHlwZV90b19waHBkb2MoZXhjLT5nZXRfdHlwZSgpKTsKKyAgICBpZiAoZXhjLT5oYXNfZG9jKCkpIHsKKyAgICAgIHNzIDw8ICIgIiA8PCBleGMtPmdldF9kb2MoKTsKKyAgICB9CisgICAgc3MgPDwgZW5kbDsKKyAgfQorCisgIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KG91dCwgIi8qKlxuIiwgIiAqICIsIHNzLnN0cigpLCAiICovXG4iKTsKK30KKworLyoqCisgKiBEZWNsYXJlcyBhIGZpZWxkLCB3aGljaCBtYXkgaW5jbHVkZSBpbml0aWFsaXphdGlvbiBhcyBuZWNlc3NhcnkuCisgKgorICogQHBhcmFtIHR0eXBlIFRoZSB0eXBlCisgKi8KK3N0cmluZyB0X3BocF9nZW5lcmF0b3I6OmRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluaXQsIGJvb2wgb2JqKSB7CisgIHN0cmluZyByZXN1bHQgPSAiJCIgKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgIGlmIChpbml0KSB7CisgICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICByZXN1bHQgKz0gIiA9ICcnIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIHJlc3VsdCArPSAiID0gZmFsc2UiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIHJlc3VsdCArPSAiID0gMCI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIHJlc3VsdCArPSAiID0gMC4wIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIFBIUCBpbml0aWFsaXplciBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICByZXN1bHQgKz0gIiA9IDAiOworICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICAgIHJlc3VsdCArPSAiID0gYXJyYXkoKSI7CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgICBpZiAob2JqKSB7CisgICAgICAgIHJlc3VsdCArPSAiID0gbmV3ICIgKyBwaHBfbmFtZXNwYWNlKHR5cGUtPmdldF9wcm9ncmFtKCkpICsgdHlwZS0+Z2V0X25hbWUoKSArICIoKSI7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQgKz0gIiA9IG51bGwiOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gcmVzdWx0ICsgIjsiOworfQorCisvKioKKyAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGZvcm0gJ3R5cGUgbmFtZShhcmdzKScKKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KKyAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KKyAqLworc3RyaW5nIHRfcGhwX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RyaW5nIHByZWZpeCkgeworICByZXR1cm4gcHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIigiICsgYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpICsgIikiOworfQorCisvKioKKyAqIFJlbmRlcnMgYSBmaWVsZCBsaXN0CisgKi8KK3N0cmluZyB0X3BocF9nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgYWRkVHlwZUhpbnRzKSB7CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ICs9ICIsICI7CisgICAgfQorCisgICAgdF90eXBlKiB0eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOworCisgICAgLy8gU2V0IHR5cGUgbmFtZQorICAgIGlmIChhZGRUeXBlSGludHMpIHsKKyAgICAgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSkgeworICAgICAgICBzdHJpbmcgY2xhc3NOYW1lID0gcGhwX25hbWVzcGFjZSh0eXBlLT5nZXRfcHJvZ3JhbSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwaHBfbmFtZXNwYWNlX2RpcmVjdG9yeSgiRGVmaW5pdGlvbiIsIGZhbHNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjbGFzc2lmeSh0eXBlLT5nZXRfbmFtZSgpKTsKKworICAgICAgICByZXN1bHQgKz0gY2xhc3NOYW1lICsgIiAiOworICAgICAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgICAgICByZXN1bHQgKz0gImFycmF5ICI7CisgICAgICB9CisgICAgfQorCisgICAgcmVzdWx0ICs9ICIkIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIEdldHMgYSB0eXBlY2FzdCBzdHJpbmcgZm9yIGEgcGFydGljdWxhciB0eXBlLgorICovCitzdHJpbmcgdF9waHBfZ2VuZXJhdG9yOjp0eXBlX3RvX2Nhc3QodF90eXBlKiB0eXBlKSB7CisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlKiBidHlwZSA9ICh0X2Jhc2VfdHlwZSopdHlwZTsKKyAgICBzd2l0Y2ggKGJ0eXBlLT5nZXRfYmFzZSgpKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICIoYm9vbCkiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIihpbnQpIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiKGRvdWJsZSkiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICIoc3RyaW5nKSI7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAiIjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICIoaW50KSI7CisgIH0KKyAgcmV0dXJuICIiOworfQorCisvKioKKyAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgQysrIGVudW0gc3RyaW5nIGZvciB0aGUgZ2l2ZW4gdHlwZS4KKyAqLworc3RyaW5nIHRfcGhwX2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAiVFR5cGU6OlNUUklORyI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICJUVHlwZTo6Qk9PTCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiVFR5cGU6OkJZVEUiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmV0dXJuICJUVHlwZTo6STE2IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAiVFR5cGU6OkkzMiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIlRUeXBlOjpJNjQiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICJUVHlwZTo6RE9VQkxFIjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJUVHlwZTo6STMyIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICJUVHlwZTo6U1RSVUNUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAiVFR5cGU6Ok1BUCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIlRUeXBlOjpTRVQiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAiVFR5cGU6OkxTVCI7CisgIH0KKworICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Cit9CisKKy8qKgorICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBQSFBEb2Mgc3RyaW5nIGZvciB0aGUgZ2l2ZW4gdHlwZS4KKyAqLworc3RyaW5nIHRfcGhwX2dlbmVyYXRvcjo6dHlwZV90b19waHBkb2ModF90eXBlKiB0eXBlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgcmV0dXJuICJ2b2lkIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAic3RyaW5nIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gImJvb2wiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZXR1cm4gImludCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gImludCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gImludCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gImludCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gImRvdWJsZSI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiaW50IjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuIHBocF9uYW1lc3BhY2UodHlwZS0+Z2V0X3Byb2dyYW0oKSkgKyB0eXBlLT5nZXRfbmFtZSgpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICJhcnJheSI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3NldCogdHNldCA9IHN0YXRpY19jYXN0PHRfc2V0Kj4odHlwZSk7CisgICAgdF90eXBlKiB0X2VsZW0gPSB0c2V0LT5nZXRfZWxlbV90eXBlKCk7CisgICAgaWYgKHRfZWxlbS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICAgIHJldHVybiAiKCIgKyB0eXBlX3RvX3BocGRvYyh0X2VsZW0pICsgIilbXSI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiB0eXBlX3RvX3BocGRvYyh0X2VsZW0pICsgIltdIjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgdF9saXN0KiB0bGlzdCA9IHN0YXRpY19jYXN0PHRfbGlzdCo+KHR5cGUpOworICAgIHRfdHlwZSogdF9lbGVtID0gdGxpc3QtPmdldF9lbGVtX3R5cGUoKTsKKyAgICBpZiAodF9lbGVtLT5pc19jb250YWluZXIoKSkgeworICAgICAgcmV0dXJuICIoIiArIHR5cGVfdG9fcGhwZG9jKHRfZWxlbSkgKyAiKVtdIjsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIHR5cGVfdG9fcGhwZG9jKHRfZWxlbSkgKyAiW10iOworICAgIH0KKyAgfQorCisgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKworVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUigKKyAgICBwaHAsCisgICAgIlBIUCIsCisgICAgIiAgICBpbmxpbmVkOiAgICAgICAgIEdlbmVyYXRlIFBIUCBpbmxpbmVkIGZpbGVzXG4iCisgICAgIiAgICBzZXJ2ZXI6ICAgICAgICAgIEdlbmVyYXRlIFBIUCBzZXJ2ZXIgc3R1YnNcbiIKKyAgICAiICAgIG9vcDogICAgICAgICAgICAgR2VuZXJhdGUgUEhQIHdpdGggb2JqZWN0IG9yaWVudGVkIHN1YmNsYXNzZXNcbiIKKyAgICAiICAgIGNsYXNzbWFwOiAgICAgICAgR2VuZXJhdGUgb2xkLXN0eWxlIFBIUCBmaWxlcyAodXNlIGNsYXNzbWFwIGF1dG9sb2FkaW5nKVxuIgorICAgICIgICAgcmVzdDogICAgICAgICAgICBHZW5lcmF0ZSBQSFAgUkVTVCBwcm9jZXNzb3JzXG4iCisgICAgIiAgICBuc2dsb2JhbD1OQU1FOiAgIFNldCBnbG9iYWwgbmFtZXNwYWNlXG4iCisgICAgIiAgICB2YWxpZGF0ZTogICAgICAgIEdlbmVyYXRlIFBIUCB2YWxpZGF0b3IgbWV0aG9kc1xuIgorICAgICIgICAganNvbjogICAgICAgICAgICBHZW5lcmF0ZSBKc29uU2VyaWFsaXphYmxlIGNsYXNzZXMgKHJlcXVpcmVzIFBIUCA+PSA1LjQpXG4iKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9weV9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X3B5X2dlbmVyYXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDYyMDdhCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9weV9nZW5lcmF0b3IuY2MKQEAgLTAsMCArMSwyNzY3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb21hbmlwPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgInRocmlmdC9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInRocmlmdC92ZXJzaW9uLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmgiCisKK3VzaW5nIHN0ZDo6bWFwOwordXNpbmcgc3RkOjpvc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6dmVjdG9yOworCitzdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCisKKy8qKgorICogUHl0aG9uIGNvZGUgZ2VuZXJhdG9yLgorICoKKyAqLworY2xhc3MgdF9weV9nZW5lcmF0b3IgOiBwdWJsaWMgdF9nZW5lcmF0b3IgeworcHVibGljOgorICB0X3B5X2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAorICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKKyAgICA6IHRfZ2VuZXJhdG9yIChwcm9ncmFtKSB7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKworICAgIGdlbl9uZXdzdHlsZV8gPSB0cnVlOworICAgIGdlbl91dGY4c3RyaW5nc18gPSB0cnVlOworICAgIGdlbl9keW5iYXNlXyA9IGZhbHNlOworICAgIGdlbl9zbG90c18gPSBmYWxzZTsKKyAgICBnZW5fdG9ybmFkb18gPSBmYWxzZTsKKyAgICBnZW5fem9wZV9pbnRlcmZhY2VfID0gZmFsc2U7CisgICAgZ2VuX3R3aXN0ZWRfID0gZmFsc2U7CisgICAgZ2VuX2R5bmFtaWNfID0gZmFsc2U7CisgICAgY29kaW5nXyA9ICIiOworICAgIGdlbl9keW5iYXNlY2xhc3NfID0gIiI7CisgICAgZ2VuX2R5bmJhc2VjbGFzc19leGNfID0gIiI7CisgICAgZ2VuX2R5bmJhc2VjbGFzc19mcm96ZW5fID0gIiI7CisgICAgaW1wb3J0X2R5bmJhc2VfID0gIiI7CisgICAgcGFja2FnZV9wcmVmaXhfID0gIiI7CisgICAgZm9yKCBpdGVyID0gcGFyc2VkX29wdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKTsgKytpdGVyKSB7CisgICAgICBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgibmV3X3N0eWxlIikgPT0gMCkgeworICAgICAgICBwd2FybmluZygwLCAibmV3X3N0eWxlIGlzIGVuYWJsZWQgYnkgZGVmYXVsdCwgc28gdGhlIG9wdGlvbiB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5lYXIgZnV0dXJlLlxuIik7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoIm9sZF9zdHlsZSIpID09IDApIHsKKyAgICAgICAgZ2VuX25ld3N0eWxlXyA9IGZhbHNlOworICAgICAgICBwd2FybmluZygwLCAib2xkX3N0eWxlIGlzIGRlcHJlY2F0ZWQgYW5kIG1heSBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUuXG4iKTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgidXRmOHN0cmluZ3MiKSA9PSAwKSB7CisgICAgICAgIHB3YXJuaW5nKDAsICJ1dGY4c3RyaW5ncyBpcyBlbmFibGVkIGJ5IGRlZmF1bHQsIHNvIHRoZSBvcHRpb24gd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZWFyIGZ1dHVyZS5cbiIpOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJub191dGY4c3RyaW5ncyIpID09IDApIHsKKyAgICAgICAgZ2VuX3V0ZjhzdHJpbmdzXyA9IGZhbHNlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJzbG90cyIpID09IDApIHsKKyAgICAgICAgZ2VuX3Nsb3RzXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoInBhY2thZ2VfcHJlZml4IikgPT0gMCkgeworICAgICAgICBwYWNrYWdlX3ByZWZpeF8gPSBpdGVyLT5zZWNvbmQ7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImR5bmFtaWMiKSA9PSAwKSB7CisgICAgICAgIGdlbl9keW5hbWljXyA9IHRydWU7CisgICAgICAgIGdlbl9uZXdzdHlsZV8gPSBmYWxzZTsgLy8gZHluYW1pYyBpcyBuZXdzdHlsZQorICAgICAgICBpZiggZ2VuX2R5bmJhc2VjbGFzc18uZW1wdHkoKSkgeworICAgICAgICAgIGdlbl9keW5iYXNlY2xhc3NfID0gIlRCYXNlIjsKKyAgICAgICAgfQorICAgICAgICBpZiggZ2VuX2R5bmJhc2VjbGFzc19mcm96ZW5fLmVtcHR5KCkpIHsKKyAgICAgICAgICBnZW5fZHluYmFzZWNsYXNzX2Zyb3plbl8gPSAiVEZyb3plbkJhc2UiOworICAgICAgICB9CisgICAgICAgIGlmKCBnZW5fZHluYmFzZWNsYXNzX2V4Y18uZW1wdHkoKSkgeworICAgICAgICAgIGdlbl9keW5iYXNlY2xhc3NfZXhjXyA9ICJURXhjZXB0aW9uQmFzZSI7CisgICAgICAgIH0KKyAgICAgICAgaWYoIGltcG9ydF9keW5iYXNlXy5lbXB0eSgpKSB7CisgICAgICAgICAgaW1wb3J0X2R5bmJhc2VfID0gImZyb20gdGhyaWZ0LnByb3RvY29sLlRCYXNlIGltcG9ydCBUQmFzZSwgVEZyb3plbkJhc2UsIFRFeGNlcHRpb25CYXNlLCBUVHJhbnNwb3J0XG4iOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImR5bmJhc2UiKSA9PSAwKSB7CisgICAgICAgIGdlbl9keW5iYXNlXyA9IHRydWU7CisgICAgICAgIGdlbl9keW5iYXNlY2xhc3NfID0gKGl0ZXItPnNlY29uZCk7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImR5bmZyb3plbiIpID09IDApIHsKKyAgICAgICAgZ2VuX2R5bmJhc2VjbGFzc19mcm96ZW5fID0gKGl0ZXItPnNlY29uZCk7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImR5bmV4YyIpID09IDApIHsKKyAgICAgICAgZ2VuX2R5bmJhc2VjbGFzc19leGNfID0gKGl0ZXItPnNlY29uZCk7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImR5bmltcG9ydCIpID09IDApIHsKKyAgICAgICAgZ2VuX2R5bmJhc2VfID0gdHJ1ZTsKKyAgICAgICAgaW1wb3J0X2R5bmJhc2VfID0gKGl0ZXItPnNlY29uZCk7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoInpvcGUuaW50ZXJmYWNlIikgPT0gMCkgeworICAgICAgICBnZW5fem9wZV9pbnRlcmZhY2VfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgidHdpc3RlZCIpID09IDApIHsKKyAgICAgICAgZ2VuX3R3aXN0ZWRfID0gdHJ1ZTsKKyAgICAgICAgZ2VuX3pvcGVfaW50ZXJmYWNlXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoInRvcm5hZG8iKSA9PSAwKSB7CisgICAgICAgIGdlbl90b3JuYWRvXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImNvZGluZyIpID09IDApIHsKKyAgICAgICAgY29kaW5nXyA9IGl0ZXItPnNlY29uZDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93ICJ1bmtub3duIG9wdGlvbiBweToiICsgaXRlci0+Zmlyc3Q7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGdlbl90d2lzdGVkXyAmJiBnZW5fdG9ybmFkb18pIHsKKyAgICAgIHRocm93ICJhdCBtb3N0IG9uZSBvZiAndHdpc3RlZCcgYW5kICd0b3JuYWRvJyBhcmUgYWxsb3dlZCI7CisgICAgfQorCisgICAgY29weV9vcHRpb25zXyA9IG9wdGlvbl9zdHJpbmc7CisKKyAgICBpZiAoZ2VuX3R3aXN0ZWRfKSB7CisgICAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1weS50d2lzdGVkIjsKKyAgICB9IGVsc2UgaWYgKGdlbl90b3JuYWRvXykgeworICAgICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tcHkudG9ybmFkbyI7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLXB5IjsKKyAgICB9CisgIH0KKworICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGluZGVudF9zdHIoKSBjb25zdCB7CisgICAgcmV0dXJuICIgICAgIjsKKyAgfQorCisgIC8qKgorICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCisgICAqLworCisgIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKKyAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKKworICAvKioKKyAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZik7CisgIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZm9yd2FyZF9kZWNsYXJhdGlvbih0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisKKyAgLyoqCisgICAqIFN0cnVjdCBnZW5lcmF0aW9uIGNvZGUKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9weV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9weV90aHJpZnRfc3BlYyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9weV9zdHJ1Y3RfZGVmaW5pdGlvbihzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uID0gZmFsc2UpOworICB2b2lkIGdlbmVyYXRlX3B5X3N0cnVjdF9yZWFkZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9weV9zdHJ1Y3Rfd3JpdGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfcHlfc3RydWN0X3JlcXVpcmVkX3ZhbGlkYXRvcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3B5X2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKworICAvKioKKyAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3JlbW90ZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisKKyAgLyoqCisgICAqIFNlcmlhbGl6YXRpb24gY29uc3RydWN0cworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcga2l0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHZpdGVyKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXQqIHRtYXAsIHN0ZDo6c3RyaW5nIGl0ZXIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RkOjpzdHJpbmcgaXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworCisgIHZvaWQgZ2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyhzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZG9jKiB0ZG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzdWJoZWFkZXIpOworCisgIHZvaWQgZ2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpOworCisgIC8qKgorICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucworICAgKi8KKworICBzdGQ6OnN0cmluZyBweV9hdXRvZ2VuX2NvbW1lbnQoKTsKKyAgc3RkOjpzdHJpbmcgcHlfaW1wb3J0cygpOworICBzdGQ6OnN0cmluZyByZW5kZXJfaW5jbHVkZXMoKTsKKyAgc3RkOjpzdHJpbmcgZGVjbGFyZV9hcmd1bWVudCh0X2ZpZWxkKiB0ZmllbGQpOworICBzdGQ6OnN0cmluZyByZW5kZXJfZmllbGRfZGVmYXVsdF92YWx1ZSh0X2ZpZWxkKiB0ZmllbGQpOworICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSk7CisgIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIGJvb2wgaW50ZXJmYWNlID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogcHJlID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIHBvc3QgPSBOVUxMKTsKKyAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOworICBzdGQ6OnN0cmluZyB0eXBlX3RvX3NwZWNfYXJncyh0X3R5cGUqIHR0eXBlKTsKKworICBzdGF0aWMgYm9vbCBpc192YWxpZF9uYW1lc3BhY2UoY29uc3Qgc3RkOjpzdHJpbmcmIHN1Yl9uYW1lc3BhY2UpIHsKKyAgICByZXR1cm4gc3ViX25hbWVzcGFjZSA9PSAidHdpc3RlZCI7CisgIH0KKworICBzdGF0aWMgc3RkOjpzdHJpbmcgZ2V0X3JlYWxfcHlfbW9kdWxlKGNvbnN0IHRfcHJvZ3JhbSogcHJvZ3JhbSwgYm9vbCBnZW5fdHdpc3RlZCwgc3RkOjpzdHJpbmcgcGFja2FnZV9kaXI9IiIpIHsKKyAgICBpZiAoZ2VuX3R3aXN0ZWQpIHsKKyAgICAgIHN0ZDo6c3RyaW5nIHR3aXN0ZWRfbW9kdWxlID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgicHkudHdpc3RlZCIpOworICAgICAgaWYgKCF0d2lzdGVkX21vZHVsZS5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybiB0d2lzdGVkX21vZHVsZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyByZWFsX21vZHVsZSA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2UoInB5Iik7CisgICAgaWYgKHJlYWxfbW9kdWxlLmVtcHR5KCkpIHsKKyAgICAgIHJldHVybiBwcm9ncmFtLT5nZXRfbmFtZSgpOworICAgIH0KKyAgICByZXR1cm4gcGFja2FnZV9kaXIgKyByZWFsX21vZHVsZTsKKyAgfQorCisgIHN0YXRpYyBib29sIGlzX2ltbXV0YWJsZSh0X3R5cGUqIHR0eXBlKSB7CisgICAgcmV0dXJuIHR0eXBlLT5hbm5vdGF0aW9uc18uZmluZCgicHl0aG9uLmltbXV0YWJsZSIpICE9IHR0eXBlLT5hbm5vdGF0aW9uc18uZW5kKCk7CisgIH0KKworcHJpdmF0ZToKKworICAvKioKKyAgICogVHJ1ZSBpZiB3ZSBzaG91bGQgZ2VuZXJhdGUgbmV3LXN0eWxlIGNsYXNzZXMuCisgICAqLworICBib29sIGdlbl9uZXdzdHlsZV87CisKKyAgLyoqCisgICogVHJ1ZSBpZiB3ZSBzaG91bGQgZ2VuZXJhdGUgZHluYW1pYyBzdHlsZSBjbGFzc2VzLgorICAqLworICBib29sIGdlbl9keW5hbWljXzsKKworICBib29sIGdlbl9keW5iYXNlXzsKKyAgc3RkOjpzdHJpbmcgZ2VuX2R5bmJhc2VjbGFzc187CisgIHN0ZDo6c3RyaW5nIGdlbl9keW5iYXNlY2xhc3NfZnJvemVuXzsKKyAgc3RkOjpzdHJpbmcgZ2VuX2R5bmJhc2VjbGFzc19leGNfOworCisgIHN0ZDo6c3RyaW5nIGltcG9ydF9keW5iYXNlXzsKKworICBib29sIGdlbl9zbG90c187CisKKyAgc3RkOjpzdHJpbmcgY29weV9vcHRpb25zXzsKKworICAvKioKKyAgICogVHJ1ZSBpZiB3ZSBzaG91bGQgZ2VuZXJhdGUgY29kZSBmb3IgdXNlIHdpdGggem9wZS5pbnRlcmZhY2UuCisgICAqLworICBib29sIGdlbl96b3BlX2ludGVyZmFjZV87CisKKyAgLyoqCisgICAqIFRydWUgaWYgd2Ugc2hvdWxkIGdlbmVyYXRlIFR3aXN0ZWQtZnJpZW5kbHkgUlBDIHNlcnZpY2VzLgorICAgKi8KKyAgYm9vbCBnZW5fdHdpc3RlZF87CisKKyAgLyoqCisgICAqIFRydWUgaWYgd2Ugc2hvdWxkIGdlbmVyYXRlIGNvZGUgZm9yIHVzZSB3aXRoIFRvcm5hZG8KKyAgICovCisgIGJvb2wgZ2VuX3Rvcm5hZG9fOworCisgIC8qKgorICAgKiBUcnVlIGlmIHN0cmluZ3Mgc2hvdWxkIGJlIGVuY29kZWQgdXNpbmcgdXRmLTguCisgICAqLworICBib29sIGdlbl91dGY4c3RyaW5nc187CisKKyAgLyoqCisgICAqIHNwZWNpZnkgZ2VuZXJhdGVkIGZpbGUgZW5jb2RpbmcKKyAgICogZWcuICMgLSotIGNvZGluZzogdXRmLTggLSotCisgICAqLworICBzdHJpbmcgY29kaW5nXzsKKworICBzdHJpbmcgcGFja2FnZV9wcmVmaXhfOworCisgIC8qKgorICAgKiBGaWxlIHN0cmVhbXMKKyAgICovCisKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3R5cGVzXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2NvbnN0c187CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9zZXJ2aWNlXzsKKworICBzdGQ6OnN0cmluZyBwYWNrYWdlX2Rpcl87CisgIHN0ZDo6c3RyaW5nIG1vZHVsZV87CisKK3Byb3RlY3RlZDoKKyAgdmlydHVhbCBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gbGFuZ19rZXl3b3JkcygpIGNvbnN0IHsKKyAgICBzdGQ6OnN0cmluZyBrZXl3b3Jkc1tdID0geyAiRmFsc2UiLCAiTm9uZSIsICJUcnVlIiwgImFuZCIsICJhcyIsICJhc3NlcnQiLCAiYnJlYWsiLCAiY2xhc3MiLAorICAgICAgICAgICJjb250aW51ZSIsICJkZWYiLCAiZGVsIiwgImVsaWYiLCAiZWxzZSIsICJleGNlcHQiLCAiZXhlYyIsICJmaW5hbGx5IiwgImZvciIsICJmcm9tIiwKKyAgICAgICAgICAiZ2xvYmFsIiwgImlmIiwgImltcG9ydCIsICJpbiIsICJpcyIsICJsYW1iZGEiLCAibm9ubG9jYWwiLCAibm90IiwgIm9yIiwgInBhc3MiLCAicHJpbnQiLAorICAgICAgICAgICJyYWlzZSIsICJyZXR1cm4iLCAidHJ5IiwgIndoaWxlIiwgIndpdGgiLCAieWllbGQiIH07CisgICAgcmV0dXJuIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPihrZXl3b3Jkcywga2V5d29yZHMgKyBzaXplb2Yoa2V5d29yZHMpL3NpemVvZihrZXl3b3Jkc1swXSkgKTsKKyAgfQorfTsKKworLyoqCisgKiBQcmVwYXJlcyBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAorICogc3RyZWFtcy4KKyAqCisgKiBAcGFyYW0gdHByb2dyYW0gVGhlIHByb2dyYW0gdG8gZ2VuZXJhdGUKKyAqLwordm9pZCB0X3B5X2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7CisgIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQorICBzdHJpbmcgbW9kdWxlID0gZ2V0X3JlYWxfcHlfbW9kdWxlKHByb2dyYW1fLCBnZW5fdHdpc3RlZF8pOworICBwYWNrYWdlX2Rpcl8gPSBnZXRfb3V0X2RpcigpOworICBtb2R1bGVfID0gbW9kdWxlOworICB3aGlsZSAodHJ1ZSkgeworICAgIC8vIFRPRE86IERvIGJldHRlciBlcnJvciBjaGVja2luZyBoZXJlLgorICAgIE1LRElSKHBhY2thZ2VfZGlyXy5jX3N0cigpKTsKKyAgICBzdGQ6Om9mc3RyZWFtIGluaXRfcHkoKHBhY2thZ2VfZGlyXyArICIvX19pbml0X18ucHkiKS5jX3N0cigpLCBzdGQ6Omlvc19iYXNlOjphcHApOworICAgIGluaXRfcHkuY2xvc2UoKTsKKyAgICBpZiAobW9kdWxlLmVtcHR5KCkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBzdHJpbmc6OnNpemVfdHlwZSBwb3MgPSBtb2R1bGUuZmluZCgnLicpOworICAgIGlmIChwb3MgPT0gc3RyaW5nOjpucG9zKSB7CisgICAgICBwYWNrYWdlX2Rpcl8gKz0gIi8iOworICAgICAgcGFja2FnZV9kaXJfICs9IG1vZHVsZTsKKyAgICAgIG1vZHVsZS5jbGVhcigpOworICAgIH0gZWxzZSB7CisgICAgICBwYWNrYWdlX2Rpcl8gKz0gIi8iOworICAgICAgcGFja2FnZV9kaXJfICs9IG1vZHVsZS5zdWJzdHIoMCwgcG9zKTsKKyAgICAgIG1vZHVsZS5lcmFzZSgwLCBwb3MgKyAxKTsKKyAgICB9CisgIH0KKworICAvLyBNYWtlIG91dHB1dCBmaWxlCisgIHN0cmluZyBmX3R5cGVzX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyAidHR5cGVzLnB5IjsKKyAgZl90eXBlc18ub3BlbihmX3R5cGVzX25hbWUuY19zdHIoKSk7CisKKyAgc3RyaW5nIGZfY29uc3RzX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyAiY29uc3RhbnRzLnB5IjsKKyAgZl9jb25zdHNfLm9wZW4oZl9jb25zdHNfbmFtZS5jX3N0cigpKTsKKworICBzdHJpbmcgZl9pbml0X25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiL19faW5pdF9fLnB5IjsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2luaXQ7CisgIGZfaW5pdC5vcGVuKGZfaW5pdF9uYW1lLmNfc3RyKCkpOworICBmX2luaXQgPDwgIl9fYWxsX18gPSBbJ3R0eXBlcycsICdjb25zdGFudHMnIjsKKyAgdmVjdG9yPHRfc2VydmljZSo+IHNlcnZpY2VzID0gcHJvZ3JhbV8tPmdldF9zZXJ2aWNlcygpOworICB2ZWN0b3I8dF9zZXJ2aWNlKj46Oml0ZXJhdG9yIHN2X2l0ZXI7CisgIGZvciAoc3ZfaXRlciA9IHNlcnZpY2VzLmJlZ2luKCk7IHN2X2l0ZXIgIT0gc2VydmljZXMuZW5kKCk7ICsrc3ZfaXRlcikgeworICAgIGZfaW5pdCA8PCAiLCAnIiA8PCAoKnN2X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInIjsKKyAgfQorICBmX2luaXQgPDwgIl0iIDw8IGVuZGw7CisgIGZfaW5pdC5jbG9zZSgpOworCisgIC8vIFByaW50IGhlYWRlcgorICBmX3R5cGVzXyA8PCBweV9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsCisgICAgICAgICAgIDw8IHB5X2ltcG9ydHMoKSA8PCBlbmRsCisgICAgICAgICAgIDw8IHJlbmRlcl9pbmNsdWRlcygpIDw8IGVuZGwKKyAgICAgICAgICAgPDwgImZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydCIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbXBvcnRfZHluYmFzZV87CisKKyAgZl90eXBlc18gPDwgImFsbF9zdHJ1Y3RzID0gW10iIDw8IGVuZGw7CisKKyAgZl9jb25zdHNfIDw8CisgICAgcHlfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbCA8PAorICAgIHB5X2ltcG9ydHMoKSA8PCBlbmRsIDw8CisgICAgImZyb20gLnR0eXBlcyBpbXBvcnQgKiIgPDwgZW5kbDsKK30KKworLyoqCisgKiBSZW5kZXJzIGFsbCB0aGUgaW1wb3J0cyBuZWNlc3NhcnkgZm9yIGluY2x1ZGluZyBhbm90aGVyIFRocmlmdCBwcm9ncmFtCisgKi8KK3N0cmluZyB0X3B5X2dlbmVyYXRvcjo6cmVuZGVyX2luY2x1ZGVzKCkgeworICBjb25zdCB2ZWN0b3I8dF9wcm9ncmFtKj4mIGluY2x1ZGVzID0gcHJvZ3JhbV8tPmdldF9pbmNsdWRlcygpOworICBzdHJpbmcgcmVzdWx0ID0gIiI7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5jbHVkZXMuc2l6ZSgpOyArK2kpIHsKKyAgICByZXN1bHQgKz0gImltcG9ydCAiICsgZ2V0X3JlYWxfcHlfbW9kdWxlKGluY2x1ZGVzW2ldLCBnZW5fdHdpc3RlZF8sIHBhY2thZ2VfcHJlZml4XykgKyAiLnR0eXBlc1xuIjsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIEF1dG9nZW4nZCBjb21tZW50CisgKi8KK3N0cmluZyB0X3B5X2dlbmVyYXRvcjo6cHlfYXV0b2dlbl9jb21tZW50KCkgeworICBzdHJpbmcgY29kaW5nOworICBpZiAoIWNvZGluZ18uZW1wdHkoKSkgeworICAgICAgY29kaW5nID0gIiMgLSotIGNvZGluZzogIiArIGNvZGluZ18gKyAiIC0qLVxuIjsKKyAgfQorICByZXR1cm4gY29kaW5nICsgc3RkOjpzdHJpbmcoIiNcbiIpICsgIiMgQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKCIgKyBUSFJJRlRfVkVSU0lPTiArICIpXG4iCisgICAgICAgICArICIjXG4iICsgIiMgRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lOR1xuIiArICIjXG4iCisgICAgICAgICArICIjICBvcHRpb25zIHN0cmluZzogIiArIGNvcHlfb3B0aW9uc18gKyAiXG4iICsgIiNcbiI7Cit9CisKKy8qKgorICogUHJpbnRzIHN0YW5kYXJkIHRocmlmdCBpbXBvcnRzCisgKi8KK3N0cmluZyB0X3B5X2dlbmVyYXRvcjo6cHlfaW1wb3J0cygpIHsKKyAgb3N0cmluZ3N0cmVhbSBzczsKKyAgc3MgPDwgImZyb20gdGhyaWZ0LlRocmlmdCBpbXBvcnQgVFR5cGUsIFRNZXNzYWdlVHlwZSwgVEZyb3plbkRpY3QsIFRFeGNlcHRpb24sICIKKyAgICAgICAgIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiIKKyAgICAgPDwgZW5kbAorICAgICA8PCAiZnJvbSB0aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIGltcG9ydCBUUHJvdG9jb2xFeGNlcHRpb24iCisgICAgIDw8IGVuZGwKKyAgICAgPDwgImZyb20gdGhyaWZ0LlRSZWN1cnNpdmUgaW1wb3J0IGZpeF9zcGVjIgorICAgICA8PCBlbmRsOworCisgIGlmIChnZW5fdXRmOHN0cmluZ3NfKSB7CisgICAgc3MgPDwgZW5kbCA8PCAiaW1wb3J0IHN5cyI7CisgIH0KKyAgcmV0dXJuIHNzLnN0cigpOworfQorCisvKioKKyAqIENsb3NlcyB0aGUgdHlwZSBmaWxlcworICovCit2b2lkIHRfcHlfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7CisKKyAgLy8gRml4IHRocmlmdF9zcGVjIGRlZmluaXRpb25zIGZvciByZWN1cnNpdmUgc3RydWN0cy4KKyAgZl90eXBlc18gPDwgImZpeF9zcGVjKGFsbF9zdHJ1Y3RzKSIgPDwgZW5kbDsKKyAgZl90eXBlc18gPDwgImRlbCBhbGxfc3RydWN0cyIgPDwgZW5kbDsKKworICAvLyBDbG9zZSB0eXBlcyBmaWxlCisgIGZfdHlwZXNfLmNsb3NlKCk7CisgIGZfY29uc3RzXy5jbG9zZSgpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIFRoaXMgaXMgbm90IGRvbmUgaW4gUHl0aG9uLCB0eXBlcyBhcmUgYWxsIGltcGxpY2l0LgorICoKKyAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgeworICAodm9pZCl0dHlwZWRlZjsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgY29kZSBmb3IgYW4gZW51bWVyYXRlZCB0eXBlLiBEb25lIHVzaW5nIGEgY2xhc3MgdG8gc2NvcGUKKyAqIHRoZSB2YWx1ZXMuCisgKgorICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgorICovCit2b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHRvX3N0cmluZ19tYXBwaW5nLCBmcm9tX3N0cmluZ19tYXBwaW5nOworCisgIGZfdHlwZXNfIDw8IGVuZGwgPDwgZW5kbCA8PCAiY2xhc3MgIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAoZ2VuX25ld3N0eWxlXyA/ICIob2JqZWN0KSIgOiAiIikKKyAgICAgICAgICAgPDwgKGdlbl9keW5hbWljXyA/ICIoIiArIGdlbl9keW5iYXNlY2xhc3NfICsgIikiIDogIiIpIDw8ICI6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZ2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyhmX3R5cGVzXywgdGVudW0pOworCisgIHRvX3N0cmluZ19tYXBwaW5nIDw8IGluZGVudCgpIDw8ICJfVkFMVUVTX1RPX05BTUVTID0geyIgPDwgZW5kbDsKKyAgZnJvbV9zdHJpbmdfbWFwcGluZyA8PCBpbmRlbnQoKSA8PCAiX05BTUVTX1RPX1ZBTFVFUyA9IHsiIDw8IGVuZGw7CisKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgICAgaW5kZW50KGZfdHlwZXNfKSA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgdmFsdWUgPDwgZW5kbDsKKworICAgIC8vIERpY3Rpb25hcmllcyB0by9mcm9tIHN0cmluZyBuYW1lcyBvZiBlbnVtcworICAgIHRvX3N0cmluZ19tYXBwaW5nIDw8IGluZGVudCgpIDw8IGluZGVudCgpIDw8IHZhbHVlIDw8ICI6IFwiIgorICAgICAgICAgICAgICAgICAgICAgIDw8IGVzY2FwZV9zdHJpbmcoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiXCIsIiA8PCBlbmRsOworICAgIGZyb21fc3RyaW5nX21hcHBpbmcgPDwgaW5kZW50KCkgPDwgaW5kZW50KCkgPDwgJyInIDw8IGVzY2FwZV9zdHJpbmcoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlwiOiAiIDw8IHZhbHVlIDw8ICcsJyA8PCBlbmRsOworICB9CisgIHRvX3N0cmluZ19tYXBwaW5nIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBmcm9tX3N0cmluZ19tYXBwaW5nIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGZfdHlwZXNfIDw8IGVuZGw7CisgIGZfdHlwZXNfIDw8IHRvX3N0cmluZ19tYXBwaW5nLnN0cigpIDw8IGVuZGwgPDwgZnJvbV9zdHJpbmdfbWFwcGluZy5zdHIoKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZSBhIGNvbnN0YW50IHZhbHVlCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCkgeworICB0X3R5cGUqIHR5cGUgPSB0Y29uc3QtPmdldF90eXBlKCk7CisgIHN0cmluZyBuYW1lID0gdGNvbnN0LT5nZXRfbmFtZSgpOworICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSA9IHRjb25zdC0+Z2V0X3ZhbHVlKCk7CisKKyAgaW5kZW50KGZfY29uc3RzXykgPDwgbmFtZSA8PCAiID0gIiA8PCByZW5kZXJfY29uc3RfdmFsdWUodHlwZSwgdmFsdWUpOworICBmX2NvbnN0c18gPDwgZW5kbDsKK30KKworLyoqCisgKiBQcmludHMgdGhlIHZhbHVlIG9mIGEgY29uc3RhbnQgd2l0aCB0aGUgZ2l2ZW4gdHlwZS4gTm90ZSB0aGF0IHR5cGUgY2hlY2tpbmcKKyAqIGlzIE5PVCBwZXJmb3JtZWQgaW4gdGhpcyBmdW5jdGlvbiBhcyBpdCBpcyBhbHdheXMgcnVuIGJlZm9yZWhhbmQgdXNpbmcgdGhlCisgKiB2YWxpZGF0ZV90eXBlcyBtZXRob2QgaW4gbWFpbi5jYworICovCitzdHJpbmcgdF9weV9nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICBvdXQgPDwgJyInIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgb3V0IDw8ICh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDAgPyAiVHJ1ZSIgOiAiRmFsc2UiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7CisgICAgICAgIG91dCA8PCAiZmxvYXQoIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiKSI7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgZW1pdF9kb3VibGVfYXNfc3RyaW5nKHZhbHVlLT5nZXRfZG91YmxlKCkpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIG91dCA8PCB0eXBlX25hbWUodHlwZSkgPDwgIigqKnsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7CisgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgeworICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKKyAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKKyAgICAgIH0KKyAgICAgIGluZGVudChvdXQpIDw8IHJlbmRlcl9jb25zdF92YWx1ZShnX3R5cGVfc3RyaW5nLCB2X2l0ZXItPmZpcnN0KSA8PCAiOiAiCisgICAgICAgICAgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKSA8PCAiLCIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSkiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOworICAgIGlmIChpc19pbW11dGFibGUodHlwZSkpIHsKKyAgICAgIG91dCA8PCAiVEZyb3plbkRpY3QoIjsKKyAgICB9CisgICAgb3V0IDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIGluZGVudChvdXQpIDw8IHJlbmRlcl9jb25zdF92YWx1ZShrdHlwZSwgdl9pdGVyLT5maXJzdCkgPDwgIjogIgorICAgICAgICAgIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh2dHlwZSwgdl9pdGVyLT5zZWNvbmQpIDw8ICIsIiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IjsKKyAgICBpZiAoaXNfaW1tdXRhYmxlKHR5cGUpKSB7CisgICAgICBvdXQgPDwgIikiOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3R5cGUqIGV0eXBlOworICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9CisgICAgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgICBpZiAoaXNfaW1tdXRhYmxlKHR5cGUpKSB7CisgICAgICAgIG91dCA8PCAiZnJvemVuIjsKKyAgICAgIH0KKyAgICAgIG91dCA8PCAic2V0KCI7CisgICAgfQorICAgIGlmIChpc19pbW11dGFibGUodHlwZSkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgIG91dCA8PCAiKCIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8ICJbIiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfdXAoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIGluZGVudChvdXQpIDw8IHJlbmRlcl9jb25zdF92YWx1ZShldHlwZSwgKnZfaXRlcikgPDwgIiwiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgaWYgKGlzX2ltbXV0YWJsZSh0eXBlKSB8fCB0eXBlLT5pc19zZXQoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIikiOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiXSI7CisgICAgfQorICAgIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgICAgb3V0IDw8ICIpIjsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBDT05TVEFOVCBGT1IgVFlQRTogIiArIHR5cGUtPmdldF9uYW1lKCk7CisgIH0KKworICByZXR1cm4gb3V0LnN0cigpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyB0aGUgImZvcndhcmQgZGVjbGFyYXRpb25zIiBmb3IgcHl0aG9uIHN0cnVjdHMuCisgKiBUaGVzZSBhcmUgYWN0dWFsbHkgZnVsbCBjbGFzcyBkZWZpbml0aW9ucyBzbyB0aGF0IGNhbGxzIHRvIGdlbmVyYXRlX3N0cnVjdAorICogY2FuIGFkZCB0aGUgdGhyaWZ0X3NwZWMgZmllbGQuICBUaGlzIGlzIG5lZWRlZCBzbyB0aGF0IGFsbCB0aHJpZnRfc3BlYworICogZGVmaW5pdGlvbnMgYXJlIGdyb3VwZWQgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSB0byBlbmFibGUgY28tcmVjdXJzaXZlIHN0cnVjdHMuCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX2ZvcndhcmRfZGVjbGFyYXRpb24odF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgICBnZW5lcmF0ZV9weV9zdHJ1Y3QodHN0cnVjdCwgdHN0cnVjdC0+aXNfeGNlcHRpb24oKSk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgcHl0aG9uIHN0cnVjdAorICovCit2b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgZ2VuZXJhdGVfcHlfdGhyaWZ0X3NwZWMoZl90eXBlc18sIHRzdHJ1Y3QsIGZhbHNlKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZXhjZXB0aW9uLiBCYXNpY2FsbHkgdGhlIHNhbWUKKyAqIGFzIGEgc3RydWN0IGJ1dCBleHRlbmRzIHRoZSBFeGNlcHRpb24gY2xhc3MuCisgKgorICogQHBhcmFtIHR4Y2VwdGlvbiBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgeworICBnZW5lcmF0ZV9weV90aHJpZnRfc3BlYyhmX3R5cGVzXywgdHhjZXB0aW9uLCB0cnVlKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBweXRob24gc3RydWN0CisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3B5X3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pIHsKKyAgZ2VuZXJhdGVfcHlfc3RydWN0X2RlZmluaXRpb24oZl90eXBlc18sIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7Cit9CisKKworLyoqCisgKiBHZW5lcmF0ZSB0aGUgdGhyaWZ0X3NwZWMgZm9yIGEgc3RydWN0CisgKiBGb3IgZXhhbXBsZSwKKyAqICAgYWxsX3N0cnVjdHMuYXBwZW5kKFJlY3Vyc2l2ZSkKKyAqICAgUmVjdXJzaXZlLnRocmlmdF9zcGVjID0gKAorICogICAgICAgTm9uZSwgICMgMAorICogICAgICAgKDEsIFRUeXBlLkxJU1QsICdDaGlsZHJlbicsIChUVHlwZS5TVFJVQ1QsIChSZWN1cnNpdmUsIE5vbmUpLCBGYWxzZSksIE5vbmUsICksICAjIDEKKyAqICAgKQorICovCit2b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9weV90aHJpZnRfc3BlYyhvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgLyppc19leGNlcHRpb24qLykgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBzb3J0ZWRfbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgLy8gQWRkIHN0cnVjdCBkZWZpbml0aW9uIHRvIGxpc3Qgc28gdGhyaWZ0X3NwZWMgY2FuIGJlIGZpeGVkIGZvciByZWN1cnNpdmUgc3RydWN0dXJlcy4KKyAgaW5kZW50KG91dCkgPDwgImFsbF9zdHJ1Y3RzLmFwcGVuZCgiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIikiIDw8IGVuZGw7CisKKyAgaWYgKHNvcnRlZF9tZW1iZXJzLmVtcHR5KCkgfHwgKHNvcnRlZF9tZW1iZXJzWzBdLT5nZXRfa2V5KCkgPj0gMCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIudGhyaWZ0X3NwZWMgPSAoIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgaW50IHNvcnRlZF9rZXlzX3BvcyA9IDA7CisgICAgZm9yIChtX2l0ZXIgPSBzb3J0ZWRfbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gc29ydGVkX21lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisKKyAgICAgIGZvciAoOyBzb3J0ZWRfa2V5c19wb3MgIT0gKCptX2l0ZXIpLT5nZXRfa2V5KCk7IHNvcnRlZF9rZXlzX3BvcysrKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJOb25lLCAgIyAiIDw8IHNvcnRlZF9rZXlzX3BvcyA8PCBlbmRsOworICAgICAgfQorCisgICAgICBpbmRlbnQob3V0KSA8PCAiKCIgPDwgKCptX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIiwgIiA8PCB0eXBlX3RvX2VudW0oKCptX2l0ZXIpLT5nZXRfdHlwZSgpKQorICAgICAgICAgICAgICAgICAgPDwgIiwgIgorICAgICAgICAgICAgICAgICAgPDwgIiciIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJyIKKyAgICAgICAgICAgICAgICAgIDw8ICIsICIgPDwgdHlwZV90b19zcGVjX2FyZ3MoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgICA8PCByZW5kZXJfZmllbGRfZGVmYXVsdF92YWx1ZSgqbV9pdGVyKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgICA8PCAiKSwiCisgICAgICAgICAgICAgICAgICA8PCAiICAjICIgPDwgc29ydGVkX2tleXNfcG9zIDw8IGVuZGw7CisKKyAgICAgIHNvcnRlZF9rZXlzX3BvcysrOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIikiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiLnRocmlmdF9zcGVjID0gKCkiIDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZGF0YSB0eXBlLgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9weV9zdHJ1Y3RfZGVmaW5pdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBzb3J0ZWRfbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgb3V0IDw8IGVuZGwgPDwgZW5kbCA8PCAiY2xhc3MgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpOworICBpZiAoaXNfZXhjZXB0aW9uKSB7CisgICAgaWYgKGdlbl9keW5hbWljXykgeworICAgICAgb3V0IDw8ICIoIiA8PCBnZW5fZHluYmFzZWNsYXNzX2V4Y18gPDwgIikiOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgIihURXhjZXB0aW9uKSI7CisgICAgfQorICB9IGVsc2UgaWYgKGdlbl9keW5hbWljXykgeworICAgIGlmIChpc19pbW11dGFibGUodHN0cnVjdCkpIHsKKyAgICAgIG91dCA8PCAiKCIgPDwgZ2VuX2R5bmJhc2VjbGFzc19mcm96ZW5fIDw8ICIpIjsKKyAgICB9IGVsc2UgIHsKKyAgICAgIG91dCA8PCAiKCIgPDwgZ2VuX2R5bmJhc2VjbGFzc18gPDwgIikiOworICAgIH0KKyAgfSBlbHNlIGlmIChnZW5fbmV3c3R5bGVfKSB7CisgICAgb3V0IDw8ICIob2JqZWN0KSI7CisgIH0KKyAgb3V0IDw8ICI6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZ2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyhvdXQsIHRzdHJ1Y3QpOworCisgIG91dCA8PCBlbmRsOworCisgIC8qCisgICAgIEhlcmUgd2UgZ2VuZXJhdGUgdGhlIHN0cnVjdHVyZSBzcGVjaWZpY2F0aW9uIGZvciB0aGUgZmFzdGJpbmFyeSBjb2RlYy4KKyAgICAgVGhlc2Ugc3BlY2lmaWNhdGlvbnMgaGF2ZSB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZToKKyAgICAgdGhyaWZ0X3NwZWMgLT4gdHVwbGUgb2YgaXRlbV9zcGVjCisgICAgIGl0ZW1fc3BlYyAtPiBOb25lIHwgKHRhZywgdHlwZV9lbnVtLCBuYW1lLCBzcGVjX2FyZ3MsIGRlZmF1bHQpCisgICAgIHRhZyAtPiBpbnRlZ2VyCisgICAgIHR5cGVfZW51bSAtPiBUVHlwZS5JMzIgfCBUVHlwZS5TVFJJTkcgfCBUVHlwZS5TVFJVQ1QgfCAuLi4KKyAgICAgbmFtZSAtPiBzdHJpbmdfbGl0ZXJhbAorICAgICBkZWZhdWx0IC0+IE5vbmUgICMgSGFuZGxlZCBieSBfX2luaXRfXworICAgICBzcGVjX2FyZ3MgLT4gTm9uZSAgIyBGb3Igc2ltcGxlIHR5cGVzCisgICAgICAgICAgICAgICAgfCAodHlwZV9lbnVtLCBzcGVjX2FyZ3MpICAjIFZhbHVlIHR5cGUgZm9yIGxpc3Qvc2V0CisgICAgICAgICAgICAgICAgfCAodHlwZV9lbnVtLCBzcGVjX2FyZ3MsIHR5cGVfZW51bSwgc3BlY19hcmdzKQorICAgICAgICAgICAgICAgICAgIyBLZXkgYW5kIHZhbHVlIGZvciBtYXAKKyAgICAgICAgICAgICAgICB8IChjbGFzc19uYW1lLCBzcGVjX2FyZ3NfcHRyKSAjIEZvciBzdHJ1Y3QvZXhjZXB0aW9uCisgICAgIGNsYXNzX25hbWUgLT4gaWRlbnRpZmllciAgIyBCYXNpY2FsbHkgYSBwb2ludGVyIHRvIHRoZSBjbGFzcworICAgICBzcGVjX2FyZ3NfcHRyIC0+IGV4cHJlc3Npb24gICMganVzdCBjbGFzc19uYW1lLnNwZWNfYXJncworCisgICAgIFRPRE8oZHJlaXNzKTogQ29uc2lkZXIgbWFraW5nIHRoaXMgd29yayBmb3Igc3RydWN0cyB3aXRoIG5lZ2F0aXZlIHRhZ3MuCisgICovCisKKyAgaWYgKGdlbl9zbG90c18pIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiX19zbG90c19fID0gKCIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmb3IgKG1faXRlciA9IHNvcnRlZF9tZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBzb3J0ZWRfbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICInIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIicsIiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICIpIiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKworICAvLyBUT0RPKGRyZWlzcyk6IExvb2sgaW50byBnZW5lcmF0aW5nIGFuIGVtcHR5IHR1cGxlIGluc3RlYWQgb2YgTm9uZQorICAvLyBmb3Igc3RydWN0dXJlcyB3aXRoIG5vIG1lbWJlcnMuCisgIC8vIFRPRE8oZHJlaXNzKTogVGVzdCBlbmNvZGluZyBvZiBzdHJ1Y3RzIHdoZXJlIHNvbWUgaW5uZXIgc3RydWN0cworICAvLyBkb24ndCBoYXZlIHRocmlmdF9zcGVjLgorCisgIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKKyAgICBvdXQgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImRlZiBfX2luaXRfXyhzZWxmLCI7CisKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBvdXQgPDwgIiAiIDw8IGRlY2xhcmVfYXJndW1lbnQoKm1faXRlcikgPDwgIiwiOworICAgIH0KKyAgICBvdXQgPDwgIik6IiA8PCBlbmRsOworCisgICAgaW5kZW50X3VwKCk7CisKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICAvLyBJbml0aWFsaXplIGZpZWxkcworICAgICAgdF90eXBlKiB0eXBlID0gKCptX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgaWYgKCF0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiAhdHlwZS0+aXNfZW51bSgpICYmICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiBpcyAiCisgICAgICAgICAgICAgICAgICAgIDw8ICJzZWxmLnRocmlmdF9zcGVjWyIgPDwgKCptX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIl1bNF06IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8IHJlbmRlcl9maWVsZF9kZWZhdWx0X3ZhbHVlKCptX2l0ZXIpCisgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICB9CisKKyAgICAgIGlmIChpc19pbW11dGFibGUodHN0cnVjdCkpIHsKKyAgICAgICAgaWYgKGdlbl9uZXdzdHlsZV8gfHwgZ2VuX2R5bmFtaWNfKSB7CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgInN1cGVyKCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiLCBzZWxmKS5fX3NldGF0dHJfXygnIgorICAgICAgICAgICAgICAgICAgICAgIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJywgIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIikiIDw8IGVuZGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgInNlbGYuX19kaWN0X19bJyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgPDwgIiddID0gIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgInNlbGYuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIGlmIChpc19pbW11dGFibGUodHN0cnVjdCkpIHsKKyAgICBvdXQgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImRlZiBfX3NldGF0dHJfXyhzZWxmLCAqYXJncyk6IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAicmFpc2UgVHlwZUVycm9yKFwiY2FuJ3QgbW9kaWZ5IGltbXV0YWJsZSBpbnN0YW5jZVwiKSIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZGVmIF9fZGVsYXR0cl9fKHNlbGYsICphcmdzKToiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJyYWlzZSBUeXBlRXJyb3IoXCJjYW4ndCBtb2RpZnkgaW1tdXRhYmxlIGluc3RhbmNlXCIpIiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGw7CisKKyAgICAvLyBIYXNoIGFsbCBvZiB0aGUgbWVtYmVycyBpbiBvcmRlciwgYW5kIGFsc28gaGFzaCBpbiB0aGUgY2xhc3MKKyAgICAvLyB0byBhdm9pZCBjb2xsaXNpb25zIGZvciBzdHVmZiBsaWtlIHNpbmdsZS1maWVsZCBzdHJ1Y3R1cmVzLgorICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZGVmIF9faGFzaF9fKHNlbGYpOiIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInJldHVybiBoYXNoKHNlbGYuX19jbGFzc19fKSBeIGhhc2goKCI7CisKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBvdXQgPDwgInNlbGYuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiwgIjsKKyAgICB9CisKKyAgICBvdXQgPDwgIikpIiA8PCBlbmRsOworICB9CisKKyAgaWYgKCFnZW5fZHluYW1pY18pIHsKKyAgICBvdXQgPDwgZW5kbDsKKyAgICBnZW5lcmF0ZV9weV9zdHJ1Y3RfcmVhZGVyKG91dCwgdHN0cnVjdCk7CisgICAgZ2VuZXJhdGVfcHlfc3RydWN0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOworICB9CisKKyAgLy8gRm9yIGV4Y2VwdGlvbnMgb25seSwgZ2VuZXJhdGUgYSBfX3N0cl9fIG1ldGhvZC4gVGhpcyBpcworICAvLyBiZWNhdXNlIHdoZW4gcmFpc2VkIGV4Y2VwdGlvbnMgYXJlIHByaW50ZWQgdG8gdGhlIGNvbnNvbGUsIF9fcmVwcl9fCisgIC8vIGlzbid0IHVzZWQuIFNlZSBweXRob24gYnVnICM1ODgyCisgIGlmIChpc19leGNlcHRpb24pIHsKKyAgICBvdXQgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImRlZiBfX3N0cl9fKHNlbGYpOiIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInJldHVybiByZXByKHNlbGYpIiA8PCBlbmRsOworICB9CisKKyAgaWYgKCFnZW5fc2xvdHNfKSB7CisgICAgb3V0IDw8IGVuZGw7CisgICAgLy8gUHJpbnRpbmcgdXRpbGl0aWVzIHNvIHRoYXQgb24gdGhlIGNvbW1hbmQgbGluZSB0aHJpZnQKKyAgICAvLyBzdHJ1Y3RzIGxvb2sgcHJldHR5IGxpa2UgZGljdGlvbmFyaWVzCisgICAgaW5kZW50KG91dCkgPDwgImRlZiBfX3JlcHJfXyhzZWxmKToiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJMID0gWyclcz0lcicgJSAoa2V5LCB2YWx1ZSkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgICAgZm9yIGtleSwgdmFsdWUgaW4gc2VsZi5fX2RpY3RfXy5pdGVtcygpXSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAicmV0dXJuICclcyglcyknICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCAnLCAnLmpvaW4oTCkpIiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKworICAgIC8vIEVxdWFsaXR5IGFuZCBpbmVxdWFsaXR5IG1ldGhvZHMgdGhhdCBjb21wYXJlIGJ5IHZhbHVlCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJkZWYgX19lcV9fKHNlbGYsIG90aGVyKToiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pIGFuZCAiCisgICAgICAgICAgICAgICAgICAgICAgICJzZWxmLl9fZGljdF9fID09IG90aGVyLl9fZGljdF9fIiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGVuZGw7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImRlZiBfX25lX18oc2VsZiwgb3RoZXIpOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIG5vdCAoc2VsZiA9PSBvdGhlcikiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfSBlbHNlIGlmICghZ2VuX2R5bmFtaWNfKSB7CisgICAgb3V0IDw8IGVuZGw7CisgICAgLy8gbm8gYmFzZSBjbGFzcyBhdmFpbGFibGUgdG8gaW1wbGVtZW50IF9fZXFfXyBhbmQgX19yZXByX18gYW5kIF9fbmVfXyBmb3IgdXMKKyAgICAvLyBzbyB3ZSBtdXN0IHByb3ZpZGUgb25lIHRoYXQgdXNlcyBfX3Nsb3RzX18KKyAgICBpbmRlbnQob3V0KSA8PCAiZGVmIF9fcmVwcl9fKHNlbGYpOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIkwgPSBbJyVzPSVyJyAlIChrZXksIGdldGF0dHIoc2VsZiwga2V5KSkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgICAgZm9yIGtleSBpbiBzZWxmLl9fc2xvdHNfX10iIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInJldHVybiAnJXMoJXMpJyAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgJywgJy5qb2luKEwpKSIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisKKyAgICAvLyBFcXVhbGl0eSBtZXRob2QgdGhhdCBjb21wYXJlcyBlYWNoIGF0dHJpYnV0ZSBieSB2YWx1ZSBhbmQgdHlwZSwgd2Fsa2luZyBfX3Nsb3RzX18KKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBzZWxmLl9fY2xhc3NfXyk6IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAicmV0dXJuIEZhbHNlIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJmb3IgYXR0ciBpbiBzZWxmLl9fc2xvdHNfXzoiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJteV92YWwgPSBnZXRhdHRyKHNlbGYsIGF0dHIpIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAib3RoZXJfdmFsID0gZ2V0YXR0cihvdGhlciwgYXR0cikiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJpZiBteV92YWwgIT0gb3RoZXJfdmFsOiIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgaW5kZW50X3N0cigpIDw8ICJyZXR1cm4gRmFsc2UiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInJldHVybiBUcnVlIiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAicmV0dXJuIG5vdCAoc2VsZiA9PSBvdGhlcikiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgdGhlIHJlYWQgbWV0aG9kIGZvciBhIHN0cnVjdAorICovCit2b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9weV9zdHJ1Y3RfcmVhZGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGlmIChpc19pbW11dGFibGUodHN0cnVjdCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIkBjbGFzc21ldGhvZCIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiZGVmIHJlYWQoY2xzLCBpcHJvdCk6IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChvdXQpIDw8ICJkZWYgcmVhZChzZWxmLCBpcHJvdCk6IiA8PCBlbmRsOworICB9CisgIGluZGVudF91cCgpOworCisgIGNvbnN0IGNoYXIqIGlkID0gaXNfaW1tdXRhYmxlKHRzdHJ1Y3QpID8gImNscyIgOiAic2VsZiI7CisKKyAgaW5kZW50KG91dCkgPDwgImlmIGlwcm90Ll9mYXN0X2RlY29kZSBpcyBub3QgTm9uZSAiCisgICAgICAgICAgICAgICAgICJhbmQgaXNpbnN0YW5jZShpcHJvdC50cmFucywgVFRyYW5zcG9ydC5DUmVhZGFibGVUcmFuc3BvcnQpICIKKyAgICAgICAgICAgICAgICAgImFuZCAiCisgICAgICAgICAgICAgIDw8IGlkIDw8ICIudGhyaWZ0X3NwZWMgaXMgbm90IE5vbmU6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpZiAoaXNfaW1tdXRhYmxlKHRzdHJ1Y3QpKSB7CisgICAgaW5kZW50KG91dCkgPDwgInJldHVybiBpcHJvdC5fZmFzdF9kZWNvZGUoTm9uZSwgaXByb3QsIFtjbHMsIGNscy50aHJpZnRfc3BlY10pIiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5fZmFzdF9kZWNvZGUoc2VsZiwgaXByb3QsIFtzZWxmLl9fY2xhc3NfXywgc2VsZi50aHJpZnRfc3BlY10pIiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4iIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKworICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZFN0cnVjdEJlZ2luKCkiIDw8IGVuZGw7CisgIAorICBpZiAoaXNfaW1tdXRhYmxlKHRzdHJ1Y3QpKSB7CisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIHRfZmllbGQqIHRmaWVsZCA9ICpmX2l0ZXI7CisgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gcmVzdWx0OworICAgICAgcmVzdWx0IDw8IHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiID0gIjsKKyAgICAgIGlmICh0ZmllbGQtPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKKyAgICAgICAgcmVzdWx0IDw8IHJlbmRlcl9maWVsZF9kZWZhdWx0X3ZhbHVlKHRmaWVsZCk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQgPDwgIk5vbmUiOworICAgICAgfQorICAgICAgaW5kZW50KG91dCkgPDwgcmVzdWx0LnN0cigpIDw8IGVuZGw7CisgICAgIH0KKyAgfQorCisgIC8vIExvb3Agb3ZlciByZWFkaW5nIGluIGZpZWxkcworICBpbmRlbnQob3V0KSA8PCAid2hpbGUgVHJ1ZToiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIC8vIFJlYWQgYmVnaW5uaW5nIGZpZWxkIG1hcmtlcgorICBpbmRlbnQob3V0KSA8PCAiKGZuYW1lLCBmdHlwZSwgZmlkKSA9IGlwcm90LnJlYWRGaWVsZEJlZ2luKCkiIDw8IGVuZGw7CisKKyAgLy8gQ2hlY2sgZm9yIGZpZWxkIFNUT1AgbWFya2VyIGFuZCBicmVhaworICBpbmRlbnQob3V0KSA8PCAiaWYgZnR5cGUgPT0gVFR5cGUuU1RPUDoiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAiYnJlYWsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisKKyAgLy8gU3dpdGNoIHN0YXRlbWVudCBvbiB0aGUgZmllbGQgd2UgYXJlIHJlYWRpbmcKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisKKyAgLy8gR2VuZXJhdGUgZGVzZXJpYWxpemF0aW9uIGNvZGUgZm9yIGtub3duIGNhc2VzCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAiOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImVsaWYgIjsKKyAgICB9CisgICAgb3V0IDw8ICJmaWQgPT0gIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgZnR5cGUgPT0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpZiAoaXNfaW1tdXRhYmxlKHRzdHJ1Y3QpKSB7CisgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIpOworICAgIH0gZWxzZSB7CisgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJzZWxmLiIpOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZWxzZToiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJpcHJvdC5za2lwKGZ0eXBlKSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgLy8gSW4gdGhlIGRlZmF1bHQgY2FzZSB3ZSBza2lwIHRoZSBmaWVsZAorICBvdXQgPDwgaW5kZW50KCkgPDwgImVsc2U6IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAiaXByb3Quc2tpcChmdHlwZSkiIDw8IGVuZGw7CisKKyAgLy8gUmVhZCBmaWVsZCBlbmQgbWFya2VyCisgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkRmllbGRFbmQoKSIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworCisgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkU3RydWN0RW5kKCkiIDw8IGVuZGw7CisKKyAgaWYgKGlzX2ltbXV0YWJsZSh0c3RydWN0KSkgeworICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gY2xzKCIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgaW5kZW50KG91dCkgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI9IiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiwiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIikiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgZW5kbDsKK30KKwordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHlfc3RydWN0X3dyaXRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBpbmRlbnQob3V0KSA8PCAiZGVmIHdyaXRlKHNlbGYsIG9wcm90KToiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGluZGVudChvdXQpIDw8ICJpZiBvcHJvdC5fZmFzdF9lbmNvZGUgaXMgbm90IE5vbmUgYW5kIHNlbGYudGhyaWZ0X3NwZWMgaXMgbm90IE5vbmU6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQob3V0KQorICAgICAgPDwgIm9wcm90LnRyYW5zLndyaXRlKG9wcm90Ll9mYXN0X2VuY29kZShzZWxmLCBbc2VsZi5fX2NsYXNzX18sIHNlbGYudGhyaWZ0X3NwZWNdKSkiCisgICAgICA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworCisgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZVN0cnVjdEJlZ2luKCciIDw8IG5hbWUgPDwgIicpIiA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgLy8gV3JpdGUgZmllbGQgaGVhZGVyCisgICAgaW5kZW50KG91dCkgPDwgImlmIHNlbGYuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiBpcyBub3QgTm9uZToiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlRmllbGRCZWdpbigiCisgICAgICAgICAgICAgICAgPDwgIiciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJywgIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKQorICAgICAgICAgICAgICAgIDw8ICIsICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIikiIDw8IGVuZGw7CisKKyAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJzZWxmLiIpOworCisgICAgLy8gV3JpdGUgZmllbGQgY2xvc2VyCisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlRmllbGRFbmQoKSIgPDwgZW5kbDsKKworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICAvLyBXcml0ZSB0aGUgc3RydWN0IG1hcAorICBvdXQgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlRmllbGRTdG9wKCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlU3RydWN0RW5kKCkiCisgICAgICA8PCBlbmRsOworCisgIG91dCA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGdlbmVyYXRlX3B5X3N0cnVjdF9yZXF1aXJlZF92YWxpZGF0b3Iob3V0LCB0c3RydWN0KTsKK30KKwordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHlfc3RydWN0X3JlcXVpcmVkX3ZhbGlkYXRvcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGluZGVudChvdXQpIDw8ICJkZWYgdmFsaWRhdGUoc2VsZik6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworCisgIGlmIChmaWVsZHMuc2l6ZSgpID4gMCkgeworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqZl9pdGVyKTsKKyAgICAgIGlmIChmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgImlmIHNlbGYuIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiIGlzIE5vbmU6IiA8PCBlbmRsOworICAgICAgICBpbmRlbnQob3V0KSA8PCBpbmRlbnRfc3RyKCkgPDwgInJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbihtZXNzYWdlPSdSZXF1aXJlZCBmaWVsZCAiCisgICAgICAgICAgICAgICAgICAgIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgaXMgdW5zZXQhJykiIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaW5kZW50KG91dCkgPDwgInJldHVybiIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSB0aHJpZnQgc2VydmljZS4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgorICovCit2b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGZfc2VydmljZV9uYW1lID0gcGFja2FnZV9kaXJfICsgIi8iICsgc2VydmljZV9uYW1lXyArICIucHkiOworICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7CisKKyAgZl9zZXJ2aWNlXyA8PCBweV9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsIDw8IHB5X2ltcG9ydHMoKSA8PCBlbmRsOworCisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAiaW1wb3J0ICIKKyAgICAgICAgICAgICAgIDw8IGdldF9yZWFsX3B5X21vZHVsZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X3Byb2dyYW0oKSwgZ2VuX3R3aXN0ZWRfLCBwYWNrYWdlX3ByZWZpeF8pIDw8ICIuIgorICAgICAgICAgICAgICAgPDwgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkgPDwgZW5kbDsKKyAgfQorCisgIGZfc2VydmljZV8gPDwgImltcG9ydCBsb2dnaW5nIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgImZyb20gLnR0eXBlcyBpbXBvcnQgKiIgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICJmcm9tIHRocmlmdC5UaHJpZnQgaW1wb3J0IFRQcm9jZXNzb3IiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAiZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW1wb3J0X2R5bmJhc2VfOworICBpZiAoZ2VuX3pvcGVfaW50ZXJmYWNlXykgeworICAgIGZfc2VydmljZV8gPDwgImZyb20gem9wZS5pbnRlcmZhY2UgaW1wb3J0IEludGVyZmFjZSwgaW1wbGVtZW50ZXIiIDw8IGVuZGw7CisgIH0KKworICBpZiAoZ2VuX3R3aXN0ZWRfKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAiZnJvbSB0d2lzdGVkLmludGVybmV0IGltcG9ydCBkZWZlciIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgImZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFR3aXN0ZWQiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAoZ2VuX3Rvcm5hZG9fKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAiZnJvbSB0b3JuYWRvIGltcG9ydCBnZW4iIDw8IGVuZGw7CisgICAgZl9zZXJ2aWNlXyA8PCAiZnJvbSB0b3JuYWRvIGltcG9ydCBjb25jdXJyZW50IiA8PCBlbmRsOworICB9CisKKyAgZl9zZXJ2aWNlXyA8PCAiYWxsX3N0cnVjdHMgPSBbXSIgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgdGhyZWUgbWFpbiBwYXJ0cyBvZiB0aGUgc2VydmljZQorICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX3JlbW90ZSh0c2VydmljZSk7CisKKyAgLy8gQ2xvc2Ugc2VydmljZSBmaWxlCisgIGZfc2VydmljZV8gPDwgImZpeF9zcGVjKGFsbF9zdHJ1Y3RzKSIgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICJkZWwgYWxsX3N0cnVjdHMiIDw8IGVuZGwgPDwgZW5kbDsKKyAgZl9zZXJ2aWNlXy5jbG9zZSgpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBoZWxwZXIgZnVuY3Rpb25zIGZvciBhIHNlcnZpY2UuCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworCisgIGZfc2VydmljZV8gPDwgZW5kbCA8PCAiIyBIRUxQRVIgRlVOQ1RJT05TIEFORCBTVFJVQ1RVUkVTIiA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9zdHJ1Y3QqIHRzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIGdlbmVyYXRlX3B5X3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sIHRzLCBmYWxzZSk7CisgICAgZ2VuZXJhdGVfcHlfdGhyaWZ0X3NwZWMoZl9zZXJ2aWNlXywgdHMsIGZhbHNlKTsKKyAgICBnZW5lcmF0ZV9weV9mdW5jdGlvbl9oZWxwZXJzKCpmX2l0ZXIpOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGFuZCBoZWxwZXJzIGZvciBhIGZ1bmN0aW9uLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3B5X2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKKyAgICB0X2ZpZWxkIHN1Y2Nlc3ModGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOworICAgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOworICAgIH0KKworICAgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgcmVzdWx0LmFwcGVuZCgqZl9pdGVyKTsKKyAgICB9CisgICAgZ2VuZXJhdGVfcHlfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgJnJlc3VsdCwgZmFsc2UpOworICAgIGdlbmVyYXRlX3B5X3RocmlmdF9zcGVjKGZfc2VydmljZV8sICZyZXN1bHQsIGZhbHNlKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgaW50ZXJmYWNlIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfaWYgPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICBleHRlbmRzX2lmID0gIigiICsgZXh0ZW5kcyArICIuSWZhY2UpIjsKKyAgfSBlbHNlIHsKKyAgICBpZiAoZ2VuX3pvcGVfaW50ZXJmYWNlXykgeworICAgICAgZXh0ZW5kc19pZiA9ICIoSW50ZXJmYWNlKSI7CisgICAgfSBlbHNlIGlmIChnZW5fbmV3c3R5bGVfIHx8IGdlbl9keW5hbWljXyB8fCBnZW5fdG9ybmFkb18pIHsKKyAgICAgIGV4dGVuZHNfaWYgPSAiKG9iamVjdCkiOworICAgIH0KKyAgfQorCisgIGZfc2VydmljZV8gPDwgZW5kbCA8PCBlbmRsIDw8ICJjbGFzcyBJZmFjZSIgPDwgZXh0ZW5kc19pZiA8PCAiOiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGdlbmVyYXRlX3B5dGhvbl9kb2NzdHJpbmcoZl9zZXJ2aWNlXywgdHNlcnZpY2UpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIGlmIChmdW5jdGlvbnMuZW1wdHkoKSkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInBhc3MiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImRlZiAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCB0cnVlKSA8PCAiOiIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZ2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyhmX3NlcnZpY2VfLCAoKmZfaXRlcikpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicGFzcyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgfQorICB9CisKKyAgaW5kZW50X2Rvd24oKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGNsaWVudCBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfY2xpZW50ID0gIiI7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7CisgICAgaWYgKGdlbl96b3BlX2ludGVyZmFjZV8pIHsKKyAgICAgIGV4dGVuZHNfY2xpZW50ID0gIigiICsgZXh0ZW5kcyArICIuQ2xpZW50KSI7CisgICAgfSBlbHNlIHsKKyAgICAgIGV4dGVuZHNfY2xpZW50ID0gZXh0ZW5kcyArICIuQ2xpZW50LCAiOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoZ2VuX3pvcGVfaW50ZXJmYWNlXyAmJiAoZ2VuX25ld3N0eWxlXyB8fCBnZW5fZHluYW1pY18pKSB7CisgICAgICBleHRlbmRzX2NsaWVudCA9ICIob2JqZWN0KSI7CisgICAgfQorICB9CisKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaWYgKGdlbl96b3BlX2ludGVyZmFjZV8pIHsKKyAgICBmX3NlcnZpY2VfIDw8ICJAaW1wbGVtZW50ZXIoSWZhY2UpIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCAiY2xhc3MgQ2xpZW50IiA8PCBleHRlbmRzX2NsaWVudCA8PCAiOiIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBmX3NlcnZpY2VfIDw8ICJjbGFzcyBDbGllbnQoIiA8PCBleHRlbmRzX2NsaWVudCA8PCAiSWZhY2UpOiIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfdXAoKTsKKyAgZ2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyhmX3NlcnZpY2VfLCB0c2VydmljZSk7CisKKyAgLy8gQ29uc3RydWN0b3IgZnVuY3Rpb24KKyAgaWYgKGdlbl90d2lzdGVkXykgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImRlZiBfX2luaXRfXyhzZWxmLCB0cmFuc3BvcnQsIG9wcm90X2ZhY3RvcnkpOiIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmIChnZW5fdG9ybmFkb18pIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAiZGVmIF9faW5pdF9fKHNlbGYsIHRyYW5zcG9ydCwgaXByb3RfZmFjdG9yeSwgb3Byb3RfZmFjdG9yeT1Ob25lKToiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZGVmIF9faW5pdF9fKHNlbGYsIGlwcm90LCBvcHJvdD1Ob25lKToiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X3VwKCk7CisgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBpZiAoZ2VuX3R3aXN0ZWRfKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJzZWxmLl90cmFuc3BvcnQgPSB0cmFuc3BvcnQiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInNlbGYuX29wcm90X2ZhY3RvcnkgPSBvcHJvdF9mYWN0b3J5IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJzZWxmLl9zZXFpZCA9IDAiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInNlbGYuX3JlcXMgPSB7fSIgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKGdlbl90b3JuYWRvXykgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAic2VsZi5fdHJhbnNwb3J0ID0gdHJhbnNwb3J0IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJzZWxmLl9pcHJvdF9mYWN0b3J5ID0gaXByb3RfZmFjdG9yeSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAic2VsZi5fb3Byb3RfZmFjdG9yeSA9IChvcHJvdF9mYWN0b3J5IGlmIG9wcm90X2ZhY3RvcnkgaXMgbm90IE5vbmUiCisgICAgICAgICAgICAgICAgIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpcHJvdF9mYWN0b3J5KSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAic2VsZi5fc2VxaWQgPSAwIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJzZWxmLl9yZXFzID0ge30iIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInNlbGYuX3RyYW5zcG9ydC5pb19sb29wLnNwYXduX2NhbGxiYWNrKHNlbGYuX3N0YXJ0X3JlY2VpdmluZykiCisgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInNlbGYuX2lwcm90ID0gc2VsZi5fb3Byb3QgPSBpcHJvdCIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgb3Byb3QgaXMgbm90IE5vbmU6IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAic2VsZi5fb3Byb3QgPSBvcHJvdCIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAic2VsZi5fc2VxaWQgPSAwIiA8PCBlbmRsOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoZ2VuX3R3aXN0ZWRfKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGV4dGVuZHMKKyAgICAgICAgICAgICAgICAgPDwgIi5DbGllbnQuX19pbml0X18oc2VsZiwgdHJhbnNwb3J0LCBvcHJvdF9mYWN0b3J5KSIgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKGdlbl90b3JuYWRvXykgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBleHRlbmRzCisgICAgICAgICAgICAgICAgIDw8ICIuQ2xpZW50Ll9faW5pdF9fKHNlbGYsIHRyYW5zcG9ydCwgaXByb3RfZmFjdG9yeSwgb3Byb3RfZmFjdG9yeSkiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgZXh0ZW5kcyA8PCAiLkNsaWVudC5fX2luaXRfXyhzZWxmLCBpcHJvdCwgb3Byb3QpIiA8PCBlbmRsOworICAgIH0KKyAgfQorICBpbmRlbnRfZG93bigpOworCisgIGlmIChnZW5fdG9ybmFkb18gJiYgZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsIDw8CisgICAgICBpbmRlbnQoKSA8PCAiQGdlbi5lbmdpbmUiIDw8IGVuZGwgPDwKKyAgICAgIGluZGVudCgpIDw8ICJkZWYgX3N0YXJ0X3JlY2VpdmluZyhzZWxmKToiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ3aGlsZSBUcnVlOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0cnk6IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgImZyYW1lID0geWllbGQgc2VsZi5fdHJhbnNwb3J0LnJlYWRGcmFtZSgpIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZXhjZXB0IFRUcmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbiBhcyBlOiIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJmb3IgZnV0dXJlIGluIHNlbGYuX3JlcXMudmFsdWVzKCk6IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgaW5kZW50X3N0cigpIDw8ICJmdXR1cmUuc2V0X2V4Y2VwdGlvbihlKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJzZWxmLl9yZXFzID0ge30iIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAicmV0dXJuIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAidHIgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoZnJhbWUpIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaXByb3QgPSBzZWxmLl9pcHJvdF9mYWN0b3J5LmdldFByb3RvY29sKHRyKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIihmbmFtZSwgbXR5cGUsIHJzZXFpZCkgPSBpcHJvdC5yZWFkTWVzc2FnZUJlZ2luKCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJtZXRob2QgPSBnZXRhdHRyKHNlbGYsICdyZWN2XycgKyBmbmFtZSkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJmdXR1cmUgPSBzZWxmLl9yZXFzLnBvcChyc2VxaWQsIE5vbmUpIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgbm90IGZ1dHVyZToiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAiIyBmdXR1cmUgaGFzIGFscmVhZHkgYmVlbiBkaXNjYXJkZWQiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAiY29udGludWUiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ0cnk6IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInJlc3VsdCA9IG1ldGhvZChpcHJvdCwgbXR5cGUsIHJzZXFpZCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJleGNlcHQgRXhjZXB0aW9uIGFzIGU6IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgImZ1dHVyZS5zZXRfZXhjZXB0aW9uKGUpIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZWxzZToiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAiZnV0dXJlLnNldF9yZXN1bHQocmVzdWx0KSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICAvLyBHZW5lcmF0ZSBjbGllbnQgbWV0aG9kIGltcGxlbWVudGF0aW9ucworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOworICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworCisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworICAgIC8vIE9wZW4gZnVuY3Rpb24KKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImRlZiAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCBmYWxzZSkgPDwgIjoiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZ2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyhmX3NlcnZpY2VfLCAoKmZfaXRlcikpOworICAgIGlmIChnZW5fdHdpc3RlZF8pIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAic2VxaWQgPSBzZWxmLl9zZXFpZCA9IHNlbGYuX3NlcWlkICsgMSIgPDwgZW5kbDsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAic2VsZi5fcmVxc1tzZXFpZF0gPSBkZWZlci5EZWZlcnJlZCgpIiA8PCBlbmRsIDw8IGVuZGw7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImQgPSBkZWZlci5tYXliZURlZmVycmVkKHNlbGYuc2VuZF8iIDw8IGZ1bm5hbWU7CisKKyAgICB9IGVsc2UgaWYgKGdlbl90b3JuYWRvXykgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJzZWxmLl9zZXFpZCArPSAxIiA8PCBlbmRsOworICAgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZnV0dXJlID0gc2VsZi5fcmVxc1tzZWxmLl9zZXFpZF0gPSBjb25jdXJyZW50LkZ1dHVyZSgpIiA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJzZWxmLnNlbmRfIiA8PCBmdW5uYW1lIDw8ICIoIjsKKworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInNlbGYuc2VuZF8iIDw8IGZ1bm5hbWUgPDwgIigiOworICAgIH0KKworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGlmIChnZW5fdHdpc3RlZF8pIHsKKyAgICAgIC8vIHdlIG5lZWQgYSBsZWFkaW5nIGNvbW1hIGlmIHRoZXJlIGFyZSBhcmdzLCBzaW5jZSBpdCdzIGNhbGxlZCBhcyBtYXliZURlZmVycmVkKGZ1bmNuYW1lLAorICAgICAgLy8gYXJnKQorICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9CisgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlXyA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICB9CisKKyAgICBmX3NlcnZpY2VfIDw8ICIpIiA8PCBlbmRsOworCisgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBpZiAoZ2VuX3R3aXN0ZWRfKSB7CisgICAgICAgIC8vIG5vdGhpbmcuIFNlZSB0aGUgbmV4dCBibG9jay4KKyAgICAgIH0gZWxzZSBpZiAoZ2VuX3Rvcm5hZG9fKSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIGZ1dHVyZSIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7CisgICAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8ICJyZXR1cm4gIjsKKyAgICAgICAgfQorICAgICAgICBmX3NlcnZpY2VfIDw8ICJzZWxmLnJlY3ZfIiA8PCBmdW5uYW1lIDw8ICIoKSIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKworICAgIGlmIChnZW5fdHdpc3RlZF8pIHsKKyAgICAgIC8vIFRoaXMgYmxvY2sgaW5qZWN0cyB0aGUgYm9keSBvZiB0aGUgc2VuZF88PiBtZXRob2QgZm9yIHR3aXN0ZWQgKGFuZCBhIGNiL2ViIHBhaXIpCisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZC5hZGRDYWxsYmFja3MoIiA8PCBlbmRsOworCisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImNhbGxiYWNrPXNlbGYuY2Jfc2VuZF8iIDw8IGZ1bm5hbWUgPDwgIiwiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgPDwgImNhbGxiYWNrQXJncz0oc2VxaWQsKSwiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImVycmJhY2s9c2VsZi5lYl9zZW5kXyIKKyAgICAgICAgICAgICAgICAgPDwgZnVubmFtZSA8PCAiLCIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiZXJyYmFja0FyZ3M9KHNlcWlkLCkpIiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gZCIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZGVmIGNiX3NlbmRfIiA8PCBmdW5uYW1lIDw8ICIoc2VsZiwgXywgc2VxaWQpOiIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaWYgKCgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgICAgLy8gaWYgb25lLXdheSwgZmlyZSB0aGUgZGVmZXJyZWQgJiByZW1vdmUgaXQgZnJvbSBfcmVxcworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJkID0gc2VsZi5fcmVxcy5wb3Aoc2VxaWQpIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgICAgPDwgImQuY2FsbGJhY2soTm9uZSkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJldHVybiBkIiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHNlbGYuX3JlcXNbc2VxaWRdIiA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAgICAgLy8gYWRkIGFuIGVycmJhY2sgdG8gZmFpbCB0aGUgcmVxdWVzdCBpZiB0aGUgY2FsbCB0byBzZW5kXzw+IHJhaXNlZCBhbiBleGNlcHRpb24KKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZGVmIGViX3NlbmRfIiA8PCBmdW5uYW1lIDw8ICIoc2VsZiwgZiwgc2VxaWQpOiIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZCA9IHNlbGYuX3JlcXMucG9wKHNlcWlkKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiZC5lcnJiYWNrKGYpIgorICAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gZCIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgfQorCisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZGVmIHNlbmRfIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlciwgZmFsc2UpIDw8ICI6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgc3RkOjpzdHJpbmcgYXJnc25hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX2FyZ3MiOworICAgIHN0ZDo6c3RyaW5nIG1lc3NhZ2VUeXBlID0gKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSA/ICJUTWVzc2FnZVR5cGUuT05FV0FZIiA6ICJUTWVzc2FnZVR5cGUuQ0FMTCI7CisKKyAgICAvLyBTZXJpYWxpemUgdGhlIHJlcXVlc3QgaGVhZGVyCisgICAgaWYgKGdlbl90d2lzdGVkXyB8fCBnZW5fdG9ybmFkb18pIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90ID0gc2VsZi5fb3Byb3RfZmFjdG9yeS5nZXRQcm90b2NvbChzZWxmLl90cmFuc3BvcnQpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbignIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIicsICIKKyAgICAgICAgICAgICAgICAgPDwgbWVzc2FnZVR5cGUgPDwgIiwgc2VsZi5fc2VxaWQpIiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJzZWxmLl9vcHJvdC53cml0ZU1lc3NhZ2VCZWdpbignIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIicsICIKKyAgICAgICAgICAgICAgICAgPDwgbWVzc2FnZVR5cGUgPDwgIiwgc2VsZi5fc2VxaWQpIiA8PCBlbmRsOworICAgIH0KKworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImFyZ3MgPSAiIDw8IGFyZ3NuYW1lIDw8ICIoKSIgPDwgZW5kbDsKKworICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJhcmdzLiIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIKKyAgICAgICAgICAgICAgICAgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgZW5kbDsKKyAgICB9CisKKyAgICAvLyBXcml0ZSB0byB0aGUgc3RyZWFtCisgICAgaWYgKGdlbl90d2lzdGVkXyB8fCBnZW5fdG9ybmFkb18pIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImFyZ3Mud3JpdGUob3Byb3QpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKSIKKyAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3QudHJhbnMuZmx1c2goKSIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiYXJncy53cml0ZShzZWxmLl9vcHJvdCkiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgPDwgInNlbGYuX29wcm90LndyaXRlTWVzc2FnZUVuZCgpIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgIDw8ICJzZWxmLl9vcHJvdC50cmFucy5mbHVzaCgpIiA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIHN0ZDo6c3RyaW5nIHJlc3VsdG5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7CisgICAgICAvLyBPcGVuIGZ1bmN0aW9uCisgICAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisgICAgICBpZiAoZ2VuX3R3aXN0ZWRfIHx8IGdlbl90b3JuYWRvXykgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJkZWYgcmVjdl8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgIDw8ICIoc2VsZiwgaXByb3QsIG10eXBlLCByc2VxaWQpOiIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7CisgICAgICAgIHRfZnVuY3Rpb24gcmVjdl9mdW5jdGlvbigoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInJlY3ZfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbm9hcmdzKTsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZGVmICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZyZWN2X2Z1bmN0aW9uKSA8PCAiOiIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGluZGVudF91cCgpOworCisgICAgICAvLyBUT0RPKG1jc2xlZSk6IFZhbGlkYXRlIG1lc3NhZ2UgcmVwbHkgaGVyZSwgc2VxIGlkcyBldGMuCisKKyAgICAgIGlmIChnZW5fdHdpc3RlZF8pIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZCA9IHNlbGYuX3JlcXMucG9wKHJzZXFpZCkiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgaWYgKGdlbl90b3JuYWRvXykgeworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaXByb3QgPSBzZWxmLl9pcHJvdCIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICAgIDw8ICIoZm5hbWUsIG10eXBlLCByc2VxaWQpID0gaXByb3QucmVhZE1lc3NhZ2VCZWdpbigpIiA8PCBlbmRsOworICAgICAgfQorCisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiBtdHlwZSA9PSBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OOiIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInggPSBUQXBwbGljYXRpb25FeGNlcHRpb24oKSIgPDwgZW5kbDsKKworICAgICAgaWYgKGdlbl90d2lzdGVkXykgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAieC5yZWFkKGlwcm90KSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAiaXByb3QucmVhZE1lc3NhZ2VFbmQoKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInJldHVybiBkLmVycmJhY2soeCkiCisgICAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmVzdWx0ID0gIiA8PCByZXN1bHRuYW1lIDw8ICIoKSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICAgIDw8ICJyZXN1bHQucmVhZChpcHJvdCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlwcm90LnJlYWRNZXNzYWdlRW5kKCkiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAieC5yZWFkKGlwcm90KSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAiaXByb3QucmVhZE1lc3NhZ2VFbmQoKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInJhaXNlIHgiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAicmVzdWx0ID0gIiA8PCByZXN1bHRuYW1lIDw8ICIoKSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICAgIDw8ICJyZXN1bHQucmVhZChpcHJvdCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlwcm90LnJlYWRNZXNzYWdlRW5kKCkiIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIC8vIENhcmVmdWwsIG9ubHkgcmV0dXJuIF9yZXN1bHQgaWYgbm90IGEgdm9pZCBmdW5jdGlvbgorICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiByZXN1bHQuc3VjY2VzcyBpcyBub3QgTm9uZToiIDw8IGVuZGw7CisgICAgICAgIGlmIChnZW5fdHdpc3RlZF8pIHsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAicmV0dXJuIGQuY2FsbGJhY2socmVzdWx0LnN1Y2Nlc3MpIiA8PCBlbmRsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJyZXR1cm4gcmVzdWx0LnN1Y2Nlc3MiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7CisgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgICAgY29uc3Qgc3RyaW5nJiB4bmFtZSA9ICgqeF9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgcmVzdWx0LiIgPDwgeG5hbWUgPDwgIiBpcyBub3QgTm9uZToiIDw8IGVuZGw7CisgICAgICAgIGlmIChnZW5fdHdpc3RlZF8pIHsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAicmV0dXJuIGQuZXJyYmFjayhyZXN1bHQuIiA8PCB4bmFtZSA8PCAiKSIKKyAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInJhaXNlIHJlc3VsdC4iIDw8IHhuYW1lIDw8ICIiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLy8gQ2FyZWZ1bCwgb25seSByZXR1cm4gX3Jlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCisgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgaWYgKGdlbl90d2lzdGVkXykgeworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybiBkLmNhbGxiYWNrKE5vbmUpIiA8PCBlbmRsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybiIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGdlbl90d2lzdGVkXykgeworICAgICAgICAgIGZfc2VydmljZV8KKyAgICAgICAgICAgICAgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgPDwgInJldHVybiBkLmVycmJhY2soVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5NSVNTSU5HX1JFU1VMVCwgXCIiCisgICAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZhaWxlZDogdW5rbm93biByZXN1bHRcIikpIiA8PCBlbmRsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgICAgIDw8ICJyYWlzZSBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLk1JU1NJTkdfUkVTVUxULCBcIiIKKyAgICAgICAgICAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZhaWxlZDogdW5rbm93biByZXN1bHRcIikiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLy8gQ2xvc2UgZnVuY3Rpb24KKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgfQorICB9CisKKyAgaW5kZW50X2Rvd24oKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBjb21tYW5kIGxpbmUgdG9vbCBmb3IgbWFraW5nIHJlbW90ZSByZXF1ZXN0cworICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHJlbW90ZSBmb3IuCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfcmVtb3RlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICAvLyBHZXQgYWxsIGZ1bmN0aW9uIGZyb20gcGFyZW50cworICB0X3NlcnZpY2UqIHBhcmVudCA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworICB3aGlsZSAocGFyZW50ICE9IE5VTEwpIHsKKyAgICB2ZWN0b3I8dF9mdW5jdGlvbio+IHBfZnVuY3Rpb25zID0gcGFyZW50LT5nZXRfZnVuY3Rpb25zKCk7CisgICAgZnVuY3Rpb25zLmluc2VydChmdW5jdGlvbnMuZW5kKCksIHBfZnVuY3Rpb25zLmJlZ2luKCksIHBfZnVuY3Rpb25zLmVuZCgpKTsKKyAgICBwYXJlbnQgPSBwYXJlbnQtPmdldF9leHRlbmRzKCk7CisgIH0KKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworCisgIHN0cmluZyBmX3JlbW90ZV9uYW1lID0gcGFja2FnZV9kaXJfICsgIi8iICsgc2VydmljZV9uYW1lXyArICItcmVtb3RlIjsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3JlbW90ZTsKKyAgZl9yZW1vdGUub3BlbihmX3JlbW90ZV9uYW1lLmNfc3RyKCkpOworCisgIGZfcmVtb3RlIDw8CisgICAgIiMhL3Vzci9iaW4vZW52IHB5dGhvbiIgPDwgZW5kbCA8PAorICAgIHB5X2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGwgPDwKKyAgICAiaW1wb3J0IHN5cyIgPDwgZW5kbCA8PAorICAgICJpbXBvcnQgcHByaW50IiA8PCBlbmRsIDw8CisgICAgImlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPiAyOiIgPDwgZW5kbCA8PAorICAgIGluZGVudF9zdHIoKSA8PCAiZnJvbSB1cmxsaWIucGFyc2UgaW1wb3J0IHVybHBhcnNlIiA8PCBlbmRsIDw8CisgICAgImVsc2U6IiA8PCBlbmRsIDw8CisgICAgaW5kZW50X3N0cigpIDw8ICJmcm9tIHVybHBhcnNlIGltcG9ydCB1cmxwYXJzZSIgPDwgZW5kbCA8PAorICAgICJmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQsIFRTb2NrZXQsIFRTU0xTb2NrZXQsIFRIdHRwQ2xpZW50IiA8PCBlbmRsIDw8CisgICAgImZyb20gdGhyaWZ0LnByb3RvY29sLlRCaW5hcnlQcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sIiA8PCBlbmRsIDw8CisgICAgZW5kbDsKKworICBmX3JlbW90ZSA8PAorICAgICJmcm9tICIgPDwgbW9kdWxlXyA8PCAiIGltcG9ydCAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgZW5kbCA8PAorICAgICJmcm9tICIgPDwgbW9kdWxlXyA8PCAiLnR0eXBlcyBpbXBvcnQgKiIgPDwgZW5kbCA8PAorICAgIGVuZGw7CisKKyAgZl9yZW1vdGUgPDwKKyAgICAiaWYgbGVuKHN5cy5hcmd2KSA8PSAxIG9yIHN5cy5hcmd2WzFdID09ICctLWhlbHAnOiIgPDwgZW5kbCA8PAorICAgIGluZGVudF9zdHIoKSA8PCAicHJpbnQoJycpIiA8PCBlbmRsIDw8CisgICAgaW5kZW50X3N0cigpIDw8ICJwcmludCgnVXNhZ2U6ICcgKyBzeXMuYXJndlswXSArICcgWy1oIGhvc3RbOnBvcnRdXSBbLXUgdXJsXSBbLWZbcmFtZWRdXSBbLXNbc2xdXSBbLW5vdmFsaWRhdGVdIFstY2FfY2VydHMgY2VydHNdIFsta2V5ZmlsZSBrZXlmaWxlXSBbLWNlcnRmaWxlIGNlcnRmaWxlXSBmdW5jdGlvbiBbYXJnMSBbYXJnMi4uLl1dJykiIDw8IGVuZGwgPDwKKyAgICBpbmRlbnRfc3RyKCkgPDwgInByaW50KCcnKSIgPDwgZW5kbCA8PAorICAgIGluZGVudF9zdHIoKSA8PCAicHJpbnQoJ0Z1bmN0aW9uczonKSIgPDwgZW5kbDsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBmX3JlbW90ZSA8PCBpbmRlbnRfc3RyKCkgPDwgInByaW50KCcgICIgPDwgKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5nZXRfbmFtZSgpIDw8ICIgIgorICAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCI7CisgICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBhcmdzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj46OnNpemVfdHlwZSBudW1fYXJncyA9IGFyZ3Muc2l6ZSgpOworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGZvciAoc3RkOjp2ZWN0b3I8dF9maWVsZCo+OjpzaXplX3R5cGUgaSA9IDA7IGkgPCBudW1fYXJnczsgKytpKSB7CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfcmVtb3RlIDw8ICIsICI7CisgICAgICB9CisgICAgICBmX3JlbW90ZSA8PCBhcmdzW2ldLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpIDw8ICIgIiA8PCBhcmdzW2ldLT5nZXRfbmFtZSgpOworICAgIH0KKyAgICBmX3JlbW90ZSA8PCAiKScpIiA8PCBlbmRsOworICB9CisgIGZfcmVtb3RlIDw8IGluZGVudF9zdHIoKSA8PCAicHJpbnQoJycpIiA8PCBlbmRsIDw8IGluZGVudF9zdHIoKSA8PCAic3lzLmV4aXQoMCkiIDw8IGVuZGwgPDwgZW5kbDsKKworICBmX3JlbW90ZSA8PCAicHAgPSBwcHJpbnQuUHJldHR5UHJpbnRlcihpbmRlbnQ9MikiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgImhvc3QgPSAnbG9jYWxob3N0JyIgPDwgZW5kbAorICAgICAgICAgICA8PCAicG9ydCA9IDkwOTAiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgInVyaSA9ICcnIiA8PCBlbmRsCisgICAgICAgICAgIDw8ICJmcmFtZWQgPSBGYWxzZSIgPDwgZW5kbAorICAgICAgICAgICA8PCAic3NsID0gRmFsc2UiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgInZhbGlkYXRlID0gVHJ1ZSIgPDwgZW5kbAorICAgICAgICAgICA8PCAiY2FfY2VydHMgPSBOb25lIiA8PCBlbmRsCisgICAgICAgICAgIDw8ICJrZXlmaWxlID0gTm9uZSIgPDwgZW5kbAorICAgICAgICAgICA8PCAiY2VydGZpbGUgPSBOb25lIiA8PCBlbmRsCisgICAgICAgICAgIDw8ICJodHRwID0gRmFsc2UiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgImFyZ2kgPSAxIiA8PCBlbmRsCisgICAgICAgICAgIDw8IGVuZGwKKyAgICAgICAgICAgPDwgImlmIHN5cy5hcmd2W2FyZ2ldID09ICctaCc6IiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAicGFydHMgPSBzeXMuYXJndlthcmdpICsgMV0uc3BsaXQoJzonKSIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgImhvc3QgPSBwYXJ0c1swXSIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgImlmIGxlbihwYXJ0cykgPiAxOiIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgaW5kZW50X3N0cigpIDw8ICJwb3J0ID0gaW50KHBhcnRzWzFdKSIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgImFyZ2kgKz0gMiIgPDwgZW5kbAorICAgICAgICAgICA8PCBlbmRsCisgICAgICAgICAgIDw8ICJpZiBzeXMuYXJndlthcmdpXSA9PSAnLXUnOiIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgInVybCA9IHVybHBhcnNlKHN5cy5hcmd2W2FyZ2kgKyAxXSkiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8ICJwYXJ0cyA9IHVybFsxXS5zcGxpdCgnOicpIiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAiaG9zdCA9IHBhcnRzWzBdIiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAiaWYgbGVuKHBhcnRzKSA+IDE6IiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInBvcnQgPSBpbnQocGFydHNbMV0pIiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAiZWxzZToiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8IGluZGVudF9zdHIoKSA8PCAicG9ydCA9IDgwIiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAidXJpID0gdXJsWzJdIiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAiaWYgdXJsWzRdOiIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgaW5kZW50X3N0cigpIDw8ICJ1cmkgKz0gJz8lcycgJSB1cmxbNF0iIDw8IGVuZGwKKyAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8ICJodHRwID0gVHJ1ZSIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgImFyZ2kgKz0gMiIgPDwgZW5kbAorICAgICAgICAgICA8PCBlbmRsCisgICAgICAgICAgIDw8ICJpZiBzeXMuYXJndlthcmdpXSA9PSAnLWYnIG9yIHN5cy5hcmd2W2FyZ2ldID09ICctZnJhbWVkJzoiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8ICJmcmFtZWQgPSBUcnVlIiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAiYXJnaSArPSAxIiA8PCBlbmRsCisgICAgICAgICAgIDw8IGVuZGwKKyAgICAgICAgICAgPDwgImlmIHN5cy5hcmd2W2FyZ2ldID09ICctcycgb3Igc3lzLmFyZ3ZbYXJnaV0gPT0gJy1zc2wnOiIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgInNzbCA9IFRydWUiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8ICJhcmdpICs9IDEiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgZW5kbAorICAgICAgICAgICA8PCAiaWYgc3lzLmFyZ3ZbYXJnaV0gPT0gJy1ub3ZhbGlkYXRlJzoiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8ICJ2YWxpZGF0ZSA9IEZhbHNlIiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAiYXJnaSArPSAxIiA8PCBlbmRsCisgICAgICAgICAgIDw8IGVuZGwKKyAgICAgICAgICAgPDwgImlmIHN5cy5hcmd2W2FyZ2ldID09ICctY2FfY2VydHMnOiIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgImNhX2NlcnRzID0gc3lzLmFyZ3ZbYXJnaSsxXSIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgImFyZ2kgKz0gMiIgPDwgZW5kbAorICAgICAgICAgICA8PCBlbmRsCisgICAgICAgICAgIDw8ICJpZiBzeXMuYXJndlthcmdpXSA9PSAnLWtleWZpbGUnOiIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgImtleWZpbGUgPSBzeXMuYXJndlthcmdpKzFdIiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAiYXJnaSArPSAyIiA8PCBlbmRsCisgICAgICAgICAgIDw8IGVuZGwKKyAgICAgICAgICAgPDwgImlmIHN5cy5hcmd2W2FyZ2ldID09ICctY2VydGZpbGUnOiIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgImNlcnRmaWxlID0gc3lzLmFyZ3ZbYXJnaSsxXSIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgImFyZ2kgKz0gMiIgPDwgZW5kbAorICAgICAgICAgICA8PCBlbmRsCisgICAgICAgICAgIDw8ICJjbWQgPSBzeXMuYXJndlthcmdpXSIgPDwgZW5kbAorICAgICAgICAgICA8PCAiYXJncyA9IHN5cy5hcmd2W2FyZ2kgKyAxOl0iIDw8IGVuZGwKKyAgICAgICAgICAgPDwgZW5kbAorICAgICAgICAgICA8PCAiaWYgaHR0cDoiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8ICJ0cmFuc3BvcnQgPSBUSHR0cENsaWVudC5USHR0cENsaWVudChob3N0LCBwb3J0LCB1cmkpIiA8PCBlbmRsCisgICAgICAgICAgIDw8ICJlbHNlOiIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgImlmIHNzbDoiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8IGluZGVudF9zdHIoKSA8PCAic29ja2V0ID0gVFNTTFNvY2tldC5UU1NMU29ja2V0KGhvc3QsIHBvcnQsICIKKyAgICAgICAgICAgICAgInZhbGlkYXRlPXZhbGlkYXRlLCBjYV9jZXJ0cz1jYV9jZXJ0cywga2V5ZmlsZT1rZXlmaWxlLCBjZXJ0ZmlsZT1jZXJ0ZmlsZSkiCisgICAgICAgICAgIDw8IGVuZGwKKyAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8ICJlbHNlOiIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgaW5kZW50X3N0cigpIDw8ICJzb2NrZXQgPSBUU29ja2V0LlRTb2NrZXQoaG9zdCwgcG9ydCkiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8ICJpZiBmcmFtZWQ6IiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInRyYW5zcG9ydCA9IFRUcmFuc3BvcnQuVEZyYW1lZFRyYW5zcG9ydChzb2NrZXQpIiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAiZWxzZToiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8IGluZGVudF9zdHIoKSA8PCAidHJhbnNwb3J0ID0gVFRyYW5zcG9ydC5UQnVmZmVyZWRUcmFuc3BvcnQoc29ja2V0KSIgPDwgZW5kbAorICAgICAgICAgICA8PCAicHJvdG9jb2wgPSBUQmluYXJ5UHJvdG9jb2wodHJhbnNwb3J0KSIgPDwgZW5kbAorICAgICAgICAgICA8PCAiY2xpZW50ID0gIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICIuQ2xpZW50KHByb3RvY29sKSIgPDwgZW5kbAorICAgICAgICAgICA8PCAidHJhbnNwb3J0Lm9wZW4oKSIgPDwgZW5kbAorICAgICAgICAgICA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSBkaXNwYXRjaCBtZXRob2RzCisgIGJvb2wgZmlyc3QgPSB0cnVlOworCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBmX3JlbW90ZSA8PCAiZWwiOworICAgIH0KKworICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgYXJncyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgc3RkOjp2ZWN0b3I8dF9maWVsZCo+OjpzaXplX3R5cGUgbnVtX2FyZ3MgPSBhcmdzLnNpemUoKTsKKworICAgIGZfcmVtb3RlIDw8ICJpZiBjbWQgPT0gJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiaWYgbGVuKGFyZ3MpICE9ICIgPDwgbnVtX2FyZ3MgPDwgIjoiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInByaW50KCciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIHJlcXVpcmVzICIgPDwgbnVtX2FyZ3MKKyAgICAgICAgICAgICA8PCAiIGFyZ3MnKSIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAic3lzLmV4aXQoMSkiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAicHAucHByaW50KGNsaWVudC4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCI7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBib29sIGZpcnN0X2FyZyA9IHRydWU7CisgICAgZm9yIChzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj46OnNpemVfdHlwZSBpID0gMDsgaSA8IG51bV9hcmdzOyArK2kpIHsKKyAgICAgIGlmIChmaXJzdF9hcmcpCisgICAgICAgIGZpcnN0X2FyZyA9IGZhbHNlOworICAgICAgZWxzZQorICAgICAgICBmX3JlbW90ZSA8PCAiICI7CisgICAgICBpZiAoYXJnc1tpXS0+Z2V0X3R5cGUoKS0+aXNfc3RyaW5nKCkpIHsKKyAgICAgICAgZl9yZW1vdGUgPDwgImFyZ3NbIiA8PCBpIDw8ICJdLCI7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3JlbW90ZSA8PCAiZXZhbChhcmdzWyIgPDwgaSA8PCAiXSksIjsKKyAgICAgIH0KKyAgICB9CisgICAgZl9yZW1vdGUgPDwgIikpIiA8PCBlbmRsOworCisgICAgZl9yZW1vdGUgPDwgZW5kbDsKKyAgfQorCisgIGlmIChmdW5jdGlvbnMuc2l6ZSgpID4gMCkgeworICAgIGZfcmVtb3RlIDw8ICJlbHNlOiIgPDwgZW5kbDsKKyAgICBmX3JlbW90ZSA8PCBpbmRlbnRfc3RyKCkgPDwgInByaW50KCdVbnJlY29nbml6ZWQgbWV0aG9kICVzJyAlIGNtZCkiIDw8IGVuZGw7CisgICAgZl9yZW1vdGUgPDwgaW5kZW50X3N0cigpIDw8ICJzeXMuZXhpdCgxKSIgPDwgZW5kbDsKKyAgICBmX3JlbW90ZSA8PCBlbmRsOworICB9CisKKyAgZl9yZW1vdGUgPDwgInRyYW5zcG9ydC5jbG9zZSgpIiA8PCBlbmRsOworCisgIC8vIENsb3NlIHNlcnZpY2UgZmlsZQorICBmX3JlbW90ZS5jbG9zZSgpOworCisjaWZuZGVmIF9NU0NfVkVSCisKKyAgLy8gTWFrZSBmaWxlIGV4ZWN1dGFibGUsIGxvdmUgdGhhdCBiaXR3aXNlIE9SIGFjdGlvbgorICBjaG1vZChmX3JlbW90ZV9uYW1lLmNfc3RyKCksCisgICAgICAgIFNfSVJVU1IgfCBTX0lXVVNSIHwgU19JWFVTUgorI2lmbmRlZiBfV0lOMzIKKyAgICAgICAgfCBTX0lSR1JQIHwgU19JWEdSUCB8IFNfSVJPVEggfCBTX0lYT1RICisjZW5kaWYKKyAgICAgICAgKTsKKworI2VuZGlmIC8vIF9NU0NfVkVSCit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgorICovCit2b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIC8vIEdlbmVyYXRlIHRoZSBkaXNwYXRjaCBtZXRob2RzCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworCisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX3Byb2Nlc3NvciA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgIGV4dGVuZHNfcHJvY2Vzc29yID0gZXh0ZW5kcyArICIuUHJvY2Vzc29yLCAiOworICB9CisKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIGhlYWRlciBwb3J0aW9uCisgIGlmIChnZW5fem9wZV9pbnRlcmZhY2VfKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAiQGltcGxlbWVudGVyKElmYWNlKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgImNsYXNzIFByb2Nlc3NvcigiIDw8IGV4dGVuZHNfcHJvY2Vzc29yIDw8ICJUUHJvY2Vzc29yKToiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgZl9zZXJ2aWNlXyA8PCAiY2xhc3MgUHJvY2Vzc29yKCIgPDwgZXh0ZW5kc19wcm9jZXNzb3IgPDwgIklmYWNlLCBUUHJvY2Vzc29yKToiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImRlZiBfX2luaXRfXyhzZWxmLCBoYW5kbGVyKToiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgaWYgKGdlbl96b3BlX2ludGVyZmFjZV8pIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInNlbGYuX2hhbmRsZXIgPSBJZmFjZShoYW5kbGVyKSIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAic2VsZi5faGFuZGxlciA9IGhhbmRsZXIiIDw8IGVuZGw7CisgICAgfQorCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAic2VsZi5fcHJvY2Vzc01hcCA9IHt9IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGlmIChnZW5fem9wZV9pbnRlcmZhY2VfKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGV4dGVuZHMgPDwgIi5Qcm9jZXNzb3IuX19pbml0X18oc2VsZiwgSWZhY2UoaGFuZGxlcikpIiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGV4dGVuZHMgPDwgIi5Qcm9jZXNzb3IuX19pbml0X18oc2VsZiwgaGFuZGxlcikiIDw8IGVuZGw7CisgICAgfQorICB9CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAic2VsZi5fcHJvY2Vzc01hcFtcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICA8PCAiXCJdID0gUHJvY2Vzc29yLnByb2Nlc3NfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bigpOworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHNlcnZlciBpbXBsZW1lbnRhdGlvbgorICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJkZWYgcHJvY2VzcyhzZWxmLCBpcHJvdCwgb3Byb3QpOiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiKG5hbWUsIHR5cGUsIHNlcWlkKSA9IGlwcm90LnJlYWRNZXNzYWdlQmVnaW4oKSIgPDwgZW5kbDsKKworICAvLyBUT0RPKG1jc2xlZSk6IHZhbGlkYXRlIG1lc3NhZ2UKKworICAvLyBIT1Q6IGRpY3Rpb25hcnkgZnVuY3Rpb24gbG9va3VwCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIG5hbWUgbm90IGluIHNlbGYuX3Byb2Nlc3NNYXA6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaXByb3Quc2tpcChUVHlwZS5TVFJVQ1QpIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImlwcm90LnJlYWRNZXNzYWdlRW5kKCkiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICJ4ID0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5VTktOT1dOX01FVEhPRCwgJ1Vua25vd24gIgorICAgICAgICAgICAgICAgICJmdW5jdGlvbiAlcycgJSAobmFtZSkpIgorICAgICAgICAgICAgIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4obmFtZSwgVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiwgc2VxaWQpIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIngud3JpdGUob3Byb3QpIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUVuZCgpIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm9wcm90LnRyYW5zLmZsdXNoKCkiIDw8IGVuZGw7CisKKyAgaWYgKGdlbl90d2lzdGVkXykgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybiBkZWZlci5zdWNjZWVkKE5vbmUpIiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybiIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bigpOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImVsc2U6IiA8PCBlbmRsOworCisgIGlmIChnZW5fdHdpc3RlZF8gfHwgZ2VuX3Rvcm5hZG9fKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkKKyAgICAgICAgICAgICAgIDw8ICJyZXR1cm4gc2VsZi5fcHJvY2Vzc01hcFtuYW1lXShzZWxmLCBzZXFpZCwgaXByb3QsIG9wcm90KSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAic2VsZi5fcHJvY2Vzc01hcFtuYW1lXShzZWxmLCBzZXFpZCwgaXByb3QsIG9wcm90KSIKKyAgICAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgICAvLyBSZWFkIGVuZCBvZiBhcmdzIGZpZWxkLCB0aGUgVF9TVE9QLCBhbmQgdGhlIHN0cnVjdCBjbG9zZQorICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybiBUcnVlIiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKworICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2VzcyBzdWJmdW5jdGlvbnMKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisgICAgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0c2VydmljZSwgKmZfaXRlcik7CisgIH0KKworICBpbmRlbnRfZG93bigpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHByb2Nlc3MgZnVuY3Rpb24gZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byB3cml0ZSBhIGRpc3BhdGNoZXIgZm9yCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgICh2b2lkKXRzZXJ2aWNlOworICAvLyBPcGVuIGZ1bmN0aW9uCisgIGlmIChnZW5fdG9ybmFkb18pIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJAZ2VuLmNvcm91dGluZSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiZGVmIHByb2Nlc3NfIgorICAgICAgICAgICAgICAgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoc2VsZiwgc2VxaWQsIGlwcm90LCBvcHJvdCk6IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImRlZiBwcm9jZXNzXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICA8PCAiKHNlbGYsIHNlcWlkLCBpcHJvdCwgb3Byb3QpOiIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF91cCgpOworCisgIHN0cmluZyBhcmdzbmFtZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfYXJncyI7CisgIHN0cmluZyByZXN1bHRuYW1lID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImFyZ3MgPSAiIDw8IGFyZ3NuYW1lIDw8ICIoKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiYXJncy5yZWFkKGlwcm90KSIKKyAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpcHJvdC5yZWFkTWVzc2FnZUVuZCgpIiA8PCBlbmRsOworCisgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisKKyAgLy8gRGVjbGFyZSByZXN1bHQgZm9yIG5vbiBvbmV3YXkgZnVuY3Rpb24KKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0ID0gIiA8PCByZXN1bHRuYW1lIDw8ICIoKSIgPDwgZW5kbDsKKyAgfQorCisgIGlmIChnZW5fdHdpc3RlZF8pIHsKKyAgICAvLyBHZW5lcmF0ZSB0aGUgZnVuY3Rpb24gY2FsbAorICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJkID0gZGVmZXIubWF5YmVEZWZlcnJlZChzZWxmLl9oYW5kbGVyLiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICA8PCAiLCAiOworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKKyAgICAgIH0KKyAgICAgIGZfc2VydmljZV8gPDwgImFyZ3MuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgIikiIDw8IGVuZGw7CisKKyAgICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZC5hZGRFcnJiYWNrKHNlbGYuaGFuZGxlX2V4Y2VwdGlvbl8iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICA8PCAiLCBzZXFpZCkiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImQuYWRkQ2FsbGJhY2soc2VsZi53cml0ZV9yZXN1bHRzX3N1Y2Nlc3NfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgPDwgIiwgcmVzdWx0LCBzZXFpZCwgb3Byb3QpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJkLmFkZEVycmJhY2soc2VsZi53cml0ZV9yZXN1bHRzX2V4Y2VwdGlvbl8iCisgICAgICAgICAgICAgICAgIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiLCByZXN1bHQsIHNlcWlkLCBvcHJvdCkiIDw8IGVuZGw7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybiBkIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfZG93bigpOworCisgICAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZGVmIGhhbmRsZV9leGNlcHRpb25fIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiKHNlbGYsIGVycm9yLCBzZXFpZCk6IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImRlZiB3cml0ZV9yZXN1bHRzX3N1Y2Nlc3NfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiKHNlbGYsIHN1Y2Nlc3MsIHJlc3VsdCwgc2VxaWQsIG9wcm90KToiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LnN1Y2Nlc3MgPSBzdWNjZXNzIiA8PCBlbmRsOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4oXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICA8PCAiXCIsIFRNZXNzYWdlVHlwZS5SRVBMWSwgc2VxaWQpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJyZXN1bHQud3JpdGUob3Byb3QpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAib3Byb3QudHJhbnMuZmx1c2goKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJkZWYgd3JpdGVfcmVzdWx0c19leGNlcHRpb25fIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiKHNlbGYsIGVycm9yLCByZXN1bHQsIHNlcWlkLCBvcHJvdCk6IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm1zZ190eXBlID0gVE1lc3NhZ2VUeXBlLlJFUExZIiA8PCBlbmRsOworICAgIH0KKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0cnk6IiA8PCBlbmRsOworCisgICAgLy8gS2luZGEgYWJzdXJkCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgImVycm9yLnJhaXNlRXhjZXB0aW9uKCkiIDw8IGVuZGw7CisgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgICBjb25zdCBzdHJpbmcmIHhuYW1lID0gKCp4X2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJleGNlcHQgIiA8PCB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiIGFzICIgPDwgeG5hbWUKKyAgICAgICAgICAgICAgICAgICA8PCAiOiIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJlc3VsdC4iIDw8IHhuYW1lIDw8ICIgPSAiIDw8IHhuYW1lIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICB9CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImV4Y2VwdCBUVHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb246IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInJhaXNlIiA8PCBlbmRsOworICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZXhjZXB0IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBhcyBleDoiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpCisgICAgICAgICAgICAgICAgIDw8ICJsb2dnaW5nLmV4Y2VwdGlvbignVEFwcGxpY2F0aW9uIGV4Y2VwdGlvbiBpbiBoYW5kbGVyJykiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJtc2dfdHlwZSA9IFRNZXNzYWdlVHlwZS5FWENFUFRJT04iIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJyZXN1bHQgPSBleCIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZXhjZXB0IEV4Y2VwdGlvbjoiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpCisgICAgICAgICAgICAgICAgIDw8ICJsb2dnaW5nLmV4Y2VwdGlvbignVW5leHBlY3RlZCBleGNlcHRpb24gaW4gaGFuZGxlcicpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAibXNnX3R5cGUgPSBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKQorICAgICAgICAgICAgICAgICA8PCAicmVzdWx0ID0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5JTlRFUk5BTF9FUlJPUiwgIgorICAgICAgICAgICAgICAgICAgICAiJ0ludGVybmFsIGVycm9yJykiCisgICAgICAgICAgICAgICAgIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUJlZ2luKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgPDwgIlwiLCBtc2dfdHlwZSwgc2VxaWQpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJyZXN1bHQud3JpdGUob3Byb3QpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAib3Byb3QudHJhbnMuZmx1c2goKSIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZXhjZXB0IEV4Y2VwdGlvbjoiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpCisgICAgICAgICAgICAgICAgIDw8ICJsb2dnaW5nLmV4Y2VwdGlvbignRXhjZXB0aW9uIGluIG9uZXdheSBoYW5kbGVyJykiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisKKyAgfSBlbHNlIGlmIChnZW5fdG9ybmFkb18pIHsKKyAgICAvLyBHZW5lcmF0ZSB0aGUgZnVuY3Rpb24gY2FsbAorICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAibXNnX3R5cGUgPSBUTWVzc2FnZVR5cGUuUkVQTFkiIDw8IGVuZGw7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRyeToiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKKyAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICJyZXN1bHQuc3VjY2VzcyA9ICI7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgInlpZWxkIGdlbi5tYXliZV9mdXR1cmUoc2VsZi5faGFuZGxlci4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCI7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlXyA8PCAiYXJncy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCAiKSkiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgICAgY29uc3Qgc3RyaW5nJiB4bmFtZSA9ICgqeF9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZXhjZXB0ICIgPDwgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiBhcyAiIDw8IHhuYW1lCisgICAgICAgICAgICAgICAgICAgPDwgIjoiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInJlc3VsdC4iIDw8IHhuYW1lIDw8ICIgPSAiIDw8IHhuYW1lIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImV4Y2VwdCBUVHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb246IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInJhaXNlIiA8PCBlbmRsOworICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZXhjZXB0IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBhcyBleDoiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpCisgICAgICAgICAgICAgICAgIDw8ICJsb2dnaW5nLmV4Y2VwdGlvbignVEFwcGxpY2F0aW9uIGV4Y2VwdGlvbiBpbiBoYW5kbGVyJykiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJtc2dfdHlwZSA9IFRNZXNzYWdlVHlwZS5FWENFUFRJT04iIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJyZXN1bHQgPSBleCIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZXhjZXB0IEV4Y2VwdGlvbjoiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpCisgICAgICAgICAgICAgICAgIDw8ICJsb2dnaW5nLmV4Y2VwdGlvbignVW5leHBlY3RlZCBleGNlcHRpb24gaW4gaGFuZGxlcicpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAibXNnX3R5cGUgPSBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKQorICAgICAgICAgICAgICAgICA8PCAicmVzdWx0ID0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5JTlRFUk5BTF9FUlJPUiwgIgorICAgICAgICAgICAgICAgICAgICAiJ0ludGVybmFsIGVycm9yJykiCisgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImV4Y2VwdCBFeGNlcHRpb246IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKQorICAgICAgICAgICAgICAgICA8PCAibG9nZ2luZy5leGNlcHRpb24oJ0V4Y2VwdGlvbiBpbiBvbmV3YXkgaGFuZGxlcicpIiA8PCBlbmRsOworICAgIH0KKworICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4oXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICA8PCAiXCIsIG1zZ190eXBlLCBzZXFpZCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInJlc3VsdC53cml0ZShvcHJvdCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUVuZCgpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJvcHJvdC50cmFucy5mbHVzaCgpIiA8PCBlbmRsOworICAgIH0KKworICAgIC8vIENsb3NlIGZ1bmN0aW9uCisgICAgaW5kZW50X2Rvd24oKTsKKworICB9IGVsc2UgeyAvLyBweQorICAgIC8vIFRyeSBibG9jayBmb3IgYSBmdW5jdGlvbiB3aXRoIGV4Y2VwdGlvbnMKKyAgICAvLyBJdCBhbHNvIGNhdGNoZXMgYXJiaXRyYXJ5IGV4Y2VwdGlvbnMgcmFpc2VkIGJ5IGhhbmRsZXIgbWV0aG9kIHRvIHByb3BhZ2F0ZSB0aGVtIHRvIHRoZSBjbGllbnQKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0cnk6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgLy8gR2VuZXJhdGUgdGhlIGZ1bmN0aW9uIGNhbGwKKyAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKKyAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICJyZXN1bHQuc3VjY2VzcyA9ICI7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgInNlbGYuX2hhbmRsZXIuIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiOworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKKyAgICAgIH0KKyAgICAgIGZfc2VydmljZV8gPDwgImFyZ3MuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgIikiIDw8IGVuZGw7CisgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJtc2dfdHlwZSA9IFRNZXNzYWdlVHlwZS5SRVBMWSIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICJleGNlcHQgVFRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uOiIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJyYWlzZSIgPDwgZW5kbDsKKworICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgICAgY29uc3Qgc3RyaW5nJiB4bmFtZSA9ICgqeF9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZXhjZXB0ICIgPDwgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiBhcyAiIDw8IHhuYW1lCisgICAgICAgICAgICAgICAgICAgPDwgIjoiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJtc2dfdHlwZSA9IFRNZXNzYWdlVHlwZS5SRVBMWSIgPDwgZW5kbDsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LiIgPDwgeG5hbWUgPDwgIiA9ICIgPDwgeG5hbWUgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIH0KKworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZXhjZXB0IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBhcyBleDoiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpCisgICAgICAgICAgICAgICAgIDw8ICJsb2dnaW5nLmV4Y2VwdGlvbignVEFwcGxpY2F0aW9uIGV4Y2VwdGlvbiBpbiBoYW5kbGVyJykiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJtc2dfdHlwZSA9IFRNZXNzYWdlVHlwZS5FWENFUFRJT04iIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJyZXN1bHQgPSBleCIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZXhjZXB0IEV4Y2VwdGlvbjoiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpCisgICAgICAgICAgICAgICAgIDw8ICJsb2dnaW5nLmV4Y2VwdGlvbignVW5leHBlY3RlZCBleGNlcHRpb24gaW4gaGFuZGxlcicpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAibXNnX3R5cGUgPSBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKQorICAgICAgICAgICAgICAgICA8PCAicmVzdWx0ID0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5JTlRFUk5BTF9FUlJPUiwgIgorICAgICAgICAgICAgICAgICAgICAiJ0ludGVybmFsIGVycm9yJykiCisgICAgICAgICAgICAgICAgIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUJlZ2luKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgPDwgIlwiLCBtc2dfdHlwZSwgc2VxaWQpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJyZXN1bHQud3JpdGUob3Byb3QpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAib3Byb3QudHJhbnMuZmx1c2goKSIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZXhjZXB0IEV4Y2VwdGlvbjoiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJsb2dnaW5nLmV4Y2VwdGlvbignRXhjZXB0aW9uIGluIG9uZXdheSBoYW5kbGVyJykiIDw8IGVuZGw7CisgICAgfQorCisgICAgLy8gQ2xvc2UgZnVuY3Rpb24KKyAgICBpbmRlbnRfZG93bigpOworICB9Cit9CisKKy8qKgorICogRGVzZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworCisgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIERFU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgfQorCisgIHN0cmluZyBuYW1lID0gcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOworCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBuYW1lKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIG5hbWUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgeworICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIiA9IGlwcm90LiI7CisKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICAgIG91dCA8PCAicmVhZEJpbmFyeSgpIjsKKyAgICAgICAgfSBlbHNlIGlmKCFnZW5fdXRmOHN0cmluZ3NfKSB7CisgICAgICAgICAgb3V0IDw8ICJyZWFkU3RyaW5nKCkiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG91dCA8PCAicmVhZFN0cmluZygpLmRlY29kZSgndXRmLTgnKSBpZiBzeXMudmVyc2lvbl9pbmZvWzBdID09IDIgZWxzZSBpcHJvdC5yZWFkU3RyaW5nKCkiOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICBvdXQgPDwgInJlYWRCb29sKCkiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIG91dCA8PCAicmVhZEJ5dGUoKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgIG91dCA8PCAicmVhZEkxNigpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgb3V0IDw8ICJyZWFkSTMyKCkiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICBvdXQgPDwgInJlYWRJNjQoKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIG91dCA8PCAicmVhZERvdWJsZSgpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIFB5dGhvbiBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIG91dCA8PCAicmVhZEkzMigpIjsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisKKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBERVNFUklBTElaRSBGSUVMRCAnJXMnIFRZUEUgJyVzJ1xuIiwKKyAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgIHR5cGUtPmdldF9uYW1lKCkuY19zdHIoKSk7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYW4gdW5zZXJpYWxpemVyIGZvciBhIHN0cnVjdCwgY2FsbGluZyByZWFkKCkKKyAqLwordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcmVmaXgpIHsKKyAgaWYgKGlzX2ltbXV0YWJsZSh0c3RydWN0KSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIiA9ICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIucmVhZChpcHJvdCkiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIigpIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiLnJlYWQoaXByb3QpIiA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogU2VyaWFsaXplIGEgY29udGFpbmVyIGJ5IHdyaXRpbmcgb3V0IHRoZSBoZWFkZXIgZm9sbG93ZWQgYnkKKyAqIGRhdGEgYW5kIHRoZW4gYSBmb290ZXIuCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIHNpemUgPSB0bXAoIl9zaXplIik7CisgIHN0cmluZyBrdHlwZSA9IHRtcCgiX2t0eXBlIik7CisgIHN0cmluZyB2dHlwZSA9IHRtcCgiX3Z0eXBlIik7CisgIHN0cmluZyBldHlwZSA9IHRtcCgiX2V0eXBlIik7CisKKyAgdF9maWVsZCBmc2l6ZShnX3R5cGVfaTMyLCBzaXplKTsKKyAgdF9maWVsZCBma3R5cGUoZ190eXBlX2k4LCBrdHlwZSk7CisgIHRfZmllbGQgZnZ0eXBlKGdfdHlwZV9pOCwgdnR5cGUpOworICB0X2ZpZWxkIGZldHlwZShnX3R5cGVfaTgsIGV0eXBlKTsKKworICAvLyBEZWNsYXJlIHZhcmlhYmxlcywgcmVhZCBoZWFkZXIKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIiA9IHt9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIoIiA8PCBrdHlwZSA8PCAiLCAiIDw8IHZ0eXBlCisgICAgICAgIDw8ICIsICIgPDwgc2l6ZSA8PCAiKSA9IGlwcm90LnJlYWRNYXBCZWdpbigpIiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIiA9IHNldCgpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIoIiA8PCBldHlwZSA8PCAiLCAiIDw8IHNpemUKKyAgICAgICAgPDwgIikgPSBpcHJvdC5yZWFkU2V0QmVnaW4oKSIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gW10iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIigiIDw8IGV0eXBlIDw8ICIsICIgPDwgc2l6ZQorICAgICAgICA8PCAiKSA9IGlwcm90LnJlYWRMaXN0QmVnaW4oKSIgPDwgZW5kbDsKKyAgfQorCisgIC8vIEZvciBsb29wIGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMKKyAgc3RyaW5nIGkgPSB0bXAoIl9pIik7CisgIGluZGVudChvdXQpIDw8CisgICAgImZvciAiIDw8IGkgPDwgIiBpbiByYW5nZSgiIDw8IHNpemUgPDwgIik6IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIHByZWZpeCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBwcmVmaXgpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgcHJlZml4KTsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisKKyAgLy8gUmVhZCBjb250YWluZXIgZW5kCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZE1hcEVuZCgpIiA8PCBlbmRsOworICAgIGlmIChpc19pbW11dGFibGUodHR5cGUpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiA9IFRGcm96ZW5EaWN0KCIgPDwgcHJlZml4IDw8ICIpIiA8PCBlbmRsOworICAgIH0KKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZFNldEVuZCgpIiA8PCBlbmRsOworICAgIGlmIChpc19pbW11dGFibGUodHR5cGUpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiA9IGZyb3plbnNldCgiIDw8IHByZWZpeCA8PCAiKSIgPDwgZW5kbDsKKyAgICB9CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGlmIChpc19pbW11dGFibGUodHR5cGUpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiA9IHR1cGxlKCIgPDwgcHJlZml4IDw8ICIpIiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZExpc3RFbmQoKSIgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBjb2RlIHRvIGRlc2VyaWFsaXplIGEgbWFwCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIGtleSA9IHRtcCgiX2tleSIpOworICBzdHJpbmcgdmFsID0gdG1wKCJfdmFsIik7CisgIHRfZmllbGQgZmtleSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KTsKKyAgdF9maWVsZCBmdmFsKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2YWwpOworCisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZrZXkpOworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmdmFsKTsKKworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIlsiIDw8IGtleSA8PCAiXSA9ICIgPDwgdmFsIDw8IGVuZGw7Cit9CisKKy8qKgorICogV3JpdGUgYSBzZXQgZWxlbWVudAorICovCit2b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgcHJlZml4KSB7CisgIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOworICB0X2ZpZWxkIGZlbGVtKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOworCisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLmFkZCgiIDw8IGVsZW0gPDwgIikiIDw8IGVuZGw7Cit9CisKKy8qKgorICogV3JpdGUgYSBsaXN0IGVsZW1lbnQKKyAqLwordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7CisgIHRfZmllbGQgZmVsZW0odGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOworCisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLmFwcGVuZCgiIDw8IGVsZW0gPDwgIikiIDw8IGVuZGw7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgorICoKKyAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkIHRvIHNlcmlhbGl6ZQorICogQHBhcmFtIHByZWZpeCBOYW1lIHRvIHByZXBlbmQgdG8gZmllbGQgbmFtZQorICovCit2b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBwcmVmaXgpIHsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworCisgIC8vIERvIG5vdGhpbmcgZm9yIHZvaWQgdHlwZXMKKyAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgfQorCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgeworCisgICAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3QuIjsKKworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICAgIG91dCA8PCAid3JpdGVCaW5hcnkoIiA8PCBuYW1lIDw8ICIpIjsKKyAgICAgICAgfSBlbHNlIGlmICghZ2VuX3V0ZjhzdHJpbmdzXykgeworICAgICAgICAgIG91dCA8PCAid3JpdGVTdHJpbmcoIiA8PCBuYW1lIDw8ICIpIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgPDwgIndyaXRlU3RyaW5nKCIgPDwgbmFtZSA8PCAiLmVuY29kZSgndXRmLTgnKSBpZiBzeXMudmVyc2lvbl9pbmZvWzBdID09IDIgZWxzZSAiIDw8IG5hbWUgPDwgIikiOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICBvdXQgPDwgIndyaXRlQm9vbCgiIDw8IG5hbWUgPDwgIikiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIG91dCA8PCAid3JpdGVCeXRlKCIgPDwgbmFtZSA8PCAiKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgIG91dCA8PCAid3JpdGVJMTYoIiA8PCBuYW1lIDw8ICIpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUkzMigiIDw8IG5hbWUgPDwgIikiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICBvdXQgPDwgIndyaXRlSTY0KCIgPDwgbmFtZSA8PCAiKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIG91dCA8PCAid3JpdGVEb3VibGUoIiA8PCBuYW1lIDw8ICIpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIFB5dGhvbiBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIG91dCA8PCAid3JpdGVJMzIoIiA8PCBuYW1lIDw8ICIpIjsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gU0VSSUFMSVpFIEZJRUxEICclcyVzJyBUWVBFICclcydcbiIsCisgICAgICAgICAgIHByZWZpeC5jX3N0cigpLAorICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgdHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKKyAgfQorfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgYWxsIHRoZSBtZW1iZXJzIG9mIGEgc3RydWN0LgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgdG8gc2VyaWFsaXplCisgKiBAcGFyYW0gcHJlZml4ICBTdHJpbmcgcHJlZml4IHRvIGF0dGFjaCB0byBhbGwgZmllbGRzCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCkgeworICAodm9pZCl0c3RydWN0OworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi53cml0ZShvcHJvdCkiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4KSB7CisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVNYXBCZWdpbigiIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpIDw8ICIsICIKKyAgICAgICAgICAgICAgICA8PCAibGVuKCIgPDwgcHJlZml4IDw8ICIpKSIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTZXRCZWdpbigiIDw8IHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgIgorICAgICAgICAgICAgICAgIDw8ICJsZW4oIiA8PCBwcmVmaXggPDwgIikpIiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVMaXN0QmVnaW4oIiA8PCB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKQorICAgICAgICAgICAgICAgIDw8ICIsICIKKyAgICAgICAgICAgICAgICA8PCAibGVuKCIgPDwgcHJlZml4IDw8ICIpKSIgPDwgZW5kbDsKKyAgfQorCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBzdHJpbmcga2l0ZXIgPSB0bXAoImtpdGVyIik7CisgICAgc3RyaW5nIHZpdGVyID0gdG1wKCJ2aXRlciIpOworICAgIGluZGVudChvdXQpIDw8ICJmb3IgIiA8PCBraXRlciA8PCAiLCAiIDw8IHZpdGVyIDw8ICIgaW4gIiA8PCBwcmVmaXggPDwgIi5pdGVtcygpOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBraXRlciwgdml0ZXIpOworICAgIGluZGVudF9kb3duKCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgc3RyaW5nIGl0ZXIgPSB0bXAoIml0ZXIiKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yICIgPDwgaXRlciA8PCAiIGluICIgPDwgcHJlZml4IDw8ICI6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIGl0ZXIpOworICAgIGluZGVudF9kb3duKCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHN0cmluZyBpdGVyID0gdG1wKCJpdGVyIik7CisgICAgaW5kZW50KG91dCkgPDwgImZvciAiIDw8IGl0ZXIgPDwgIiBpbiAiIDw8IHByZWZpeCA8PCAiOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIGl0ZXIpOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlTWFwRW5kKCkiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlU2V0RW5kKCkiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUxpc3RFbmQoKSIgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBtYXAuCisgKgorICovCit2b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBraXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdml0ZXIpIHsKKyAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksIGtpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmtmaWVsZCwgIiIpOworCisgIHRfZmllbGQgdmZpZWxkKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2aXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZ2ZmllbGQsICIiKTsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgc2V0LgorICovCit2b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIGl0ZXIpIHsKKyAgdF9maWVsZCBlZmllbGQodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIpOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBsaXN0LgorICovCit2b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RyaW5nIGl0ZXIpIHsKKyAgdF9maWVsZCBlZmllbGQodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgdGhlIGRvY3N0cmluZyBmb3IgYSBnaXZlbiBzdHJ1Y3QuCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3B5dGhvbl9kb2NzdHJpbmcob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nKG91dCwgdHN0cnVjdCwgdHN0cnVjdCwgIkF0dHJpYnV0ZXMiKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgdGhlIGRvY3N0cmluZyBmb3IgYSBnaXZlbiBmdW5jdGlvbi4KKyAqLwordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyhvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICBnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nKG91dCwgdGZ1bmN0aW9uLCB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCksICJQYXJhbWV0ZXJzIik7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHRoZSBkb2NzdHJpbmcgZm9yIGEgc3RydWN0IG9yIGZ1bmN0aW9uLgorICovCit2b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9kb2MqIHRkb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzdWJoZWFkZXIpIHsKKyAgYm9vbCBoYXNfZG9jID0gZmFsc2U7CisgIHN0cmluZ3N0cmVhbSBzczsKKyAgaWYgKHRkb2MtPmhhc19kb2MoKSkgeworICAgIGhhc19kb2MgPSB0cnVlOworICAgIHNzIDw8IHRkb2MtPmdldF9kb2MoKTsKKyAgfQorCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIGlmIChmaWVsZHMuc2l6ZSgpID4gMCkgeworICAgIGlmIChoYXNfZG9jKSB7CisgICAgICBzcyA8PCBlbmRsOworICAgIH0KKyAgICBoYXNfZG9jID0gdHJ1ZTsKKyAgICBzcyA8PCBzdWJoZWFkZXIgPDwgIjpcbiI7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgcF9pdGVyOworICAgIGZvciAocF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IHBfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrcF9pdGVyKSB7CisgICAgICB0X2ZpZWxkKiBwID0gKnBfaXRlcjsKKyAgICAgIHNzIDw8ICIgLSAiIDw8IHAtPmdldF9uYW1lKCk7CisgICAgICBpZiAocC0+aGFzX2RvYygpKSB7CisgICAgICAgIHNzIDw8ICI6ICIgPDwgcC0+Z2V0X2RvYygpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc3MgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAoaGFzX2RvYykgeworICAgIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KG91dCwgIlwiXCJcIlxuIiwgIiIsIHNzLnN0cigpLCAiXCJcIlwiXG4iKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyB0aGUgZG9jc3RyaW5nIGZvciBhIGdlbmVyaWMgb2JqZWN0LgorICovCit2b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nKG9zdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpIHsKKyAgaWYgKHRkb2MtPmhhc19kb2MoKSkgeworICAgIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KG91dCwgIlwiXCJcIlxuIiwgIiIsIHRkb2MtPmdldF9kb2MoKSwgIlwiXCJcIlxuIik7CisgIH0KK30KKworLyoqCisgKiBEZWNsYXJlcyBhbiBhcmd1bWVudCwgd2hpY2ggbWF5IGluY2x1ZGUgaW5pdGlhbGl6YXRpb24gYXMgbmVjZXNzYXJ5LgorICoKKyAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkCisgKi8KK3N0cmluZyB0X3B5X2dlbmVyYXRvcjo6ZGVjbGFyZV9hcmd1bWVudCh0X2ZpZWxkKiB0ZmllbGQpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHJlc3VsdDsKKyAgcmVzdWx0IDw8IHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiPSI7CisgIGlmICh0ZmllbGQtPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKKyAgICByZXN1bHQgPDwgcmVuZGVyX2ZpZWxkX2RlZmF1bHRfdmFsdWUodGZpZWxkKTsKKyAgfSBlbHNlIHsKKyAgICByZXN1bHQgPDwgIk5vbmUiOworICB9CisgIHJldHVybiByZXN1bHQuc3RyKCk7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZpZWxkIGRlZmF1bHQgdmFsdWUsIHJldHVybnMgTm9uZSBvdGhlcndpc2UuCisgKgorICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQKKyAqLworc3RyaW5nIHRfcHlfZ2VuZXJhdG9yOjpyZW5kZXJfZmllbGRfZGVmYXVsdF92YWx1ZSh0X2ZpZWxkKiB0ZmllbGQpIHsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworICBpZiAodGZpZWxkLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7CisgICAgcmV0dXJuIHJlbmRlcl9jb25zdF92YWx1ZSh0eXBlLCB0ZmllbGQtPmdldF92YWx1ZSgpKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gIk5vbmUiOworICB9Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAndHlwZSBuYW1lKGFyZ3MpJworICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgorICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgorICovCitzdHJpbmcgdF9weV9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIGJvb2wgaW50ZXJmYWNlKSB7CisgIHZlY3RvcjxzdHJpbmc+IHByZTsKKyAgdmVjdG9yPHN0cmluZz4gcG9zdDsKKyAgc3RyaW5nIHNpZ25hdHVyZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICIoIjsKKworICBpZiAoIShnZW5fem9wZV9pbnRlcmZhY2VfICYmIGludGVyZmFjZSkpIHsKKyAgICBwcmUucHVzaF9iYWNrKCJzZWxmIik7CisgIH0KKworICBzaWduYXR1cmUgKz0gYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCksICZwcmUsICZwb3N0KSArICIpIjsKKyAgcmV0dXJuIHNpZ25hdHVyZTsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgZmllbGQgbGlzdAorICovCitzdHJpbmcgdF9weV9nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIHZlY3RvcjxzdHJpbmc+KiBwcmUsIHZlY3RvcjxzdHJpbmc+KiBwb3N0KSB7CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIHZlY3RvcjxzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBzX2l0ZXI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBpZiAocHJlKSB7CisgICAgZm9yIChzX2l0ZXIgPSBwcmUtPmJlZ2luKCk7IHNfaXRlciAhPSBwcmUtPmVuZCgpOyArK3NfaXRlcikgeworICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQgKz0gIiwgIjsKKyAgICAgIH0KKyAgICAgIHJlc3VsdCArPSAqc19pdGVyOworICAgIH0KKyAgfQorICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ICs9ICIsICI7CisgICAgfQorICAgIHJlc3VsdCArPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgIH0KKyAgaWYgKHBvc3QpIHsKKyAgICBmb3IgKHNfaXRlciA9IHBvc3QtPmJlZ2luKCk7IHNfaXRlciAhPSBwb3N0LT5lbmQoKTsgKytzX2l0ZXIpIHsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzdWx0ICs9ICIsICI7CisgICAgICB9CisgICAgICByZXN1bHQgKz0gKnNfaXRlcjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RyaW5nIHRfcHlfZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSkgeworICB3aGlsZSAodHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHR0eXBlID0gKCh0X3R5cGVkZWYqKXR0eXBlKS0+Z2V0X3R5cGUoKTsKKyAgfQorCisgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR0eXBlLT5nZXRfcHJvZ3JhbSgpOworICBpZiAodHR5cGUtPmlzX3NlcnZpY2UoKSkgeworICAgIHJldHVybiBnZXRfcmVhbF9weV9tb2R1bGUocHJvZ3JhbSwgZ2VuX3R3aXN0ZWRfLCBwYWNrYWdlX3ByZWZpeF8pICsgIi4iICsgdHR5cGUtPmdldF9uYW1lKCk7CisgIH0KKyAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7CisgICAgcmV0dXJuIGdldF9yZWFsX3B5X21vZHVsZShwcm9ncmFtLCBnZW5fdHdpc3RlZF8sIHBhY2thZ2VfcHJlZml4XykgKyAiLnR0eXBlcy4iICsgdHR5cGUtPmdldF9uYW1lKCk7CisgIH0KKyAgcmV0dXJuIHR0eXBlLT5nZXRfbmFtZSgpOworfQorCisvKioKKyAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgUHl0aG9uIHR5b2UKKyAqLworc3RyaW5nIHRfcHlfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICJUVHlwZS5TVFJJTkciOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiVFR5cGUuQk9PTCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiVFR5cGUuQllURSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gIlRUeXBlLkkxNiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gIlRUeXBlLkkzMiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIlRUeXBlLkk2NCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIlRUeXBlLkRPVUJMRSI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiVFR5cGUuSTMyIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICJUVHlwZS5TVFJVQ1QiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5NQVAiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5TRVQiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAiVFR5cGUuTElTVCI7CisgIH0KKworICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Cit9CisKKy8qKiBTZWUgdGhlIGNvbW1lbnQgaW5zaWRlIGdlbmVyYXRlX3B5X3N0cnVjdF9kZWZpbml0aW9uIGZvciB3aGF0IHRoaXMgaXMuICovCitzdHJpbmcgdF9weV9nZW5lcmF0b3I6OnR5cGVfdG9fc3BlY19hcmdzKHRfdHlwZSogdHR5cGUpIHsKKyAgd2hpbGUgKHR0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICB0dHlwZSA9ICgodF90eXBlZGVmKil0dHlwZSktPmdldF90eXBlKCk7CisgIH0KKworICBpZiAodHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgcmV0dXJuICAiJ0JJTkFSWSciOworICB9IGVsc2UgaWYgKGdlbl91dGY4c3RyaW5nc18gJiYgdHR5cGUtPmlzX2Jhc2VfdHlwZSgpCisgICAgICAgICAgICAgJiYgcmVpbnRlcnByZXRfY2FzdDx0X2Jhc2VfdHlwZSo+KHR0eXBlKS0+aXNfc3RyaW5nKCkpIHsKKyAgICByZXR1cm4gIidVVEY4JyI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gICJOb25lIjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIlsiICsgdHlwZV9uYW1lKHR0eXBlKSArICIsIE5vbmVdIjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gIigiICsgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpICsgIiwgIgorICAgICAgICAgICArIHR5cGVfdG9fc3BlY19hcmdzKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpICsgIiwgIgorICAgICAgICAgICArIHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSArICIsICIKKyAgICAgICAgICAgKyB0eXBlX3RvX3NwZWNfYXJncygoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSArICIsICIKKyAgICAgICAgICAgKyAoaXNfaW1tdXRhYmxlKHR0eXBlKSA/ICJUcnVlIiA6ICJGYWxzZSIpICsgIikiOworCisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICIoIiArIHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgKyAiLCAiCisgICAgICAgICAgICsgdHlwZV90b19zcGVjX2FyZ3MoKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpICsgIiwgIgorICAgICAgICAgICArIChpc19pbW11dGFibGUodHR5cGUpID8gIlRydWUiIDogIkZhbHNlIikgKyAiKSI7CisKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICIoIiArIHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpICsgIiwgIgorICAgICAgICAgICArIHR5cGVfdG9fc3BlY19hcmdzKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgKyAiLCAiCisgICAgICAgICAgICsgKGlzX2ltbXV0YWJsZSh0dHlwZSkgPyAiVHJ1ZSIgOiAiRmFsc2UiKSArICIpIjsKKyAgfQorCisgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19zcGVjX2FyZ3M6ICIgKyB0dHlwZS0+Z2V0X25hbWUoKTsKK30KKworVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUigKKyAgICBweSwKKyAgICAiUHl0aG9uIiwKKyAgICAiICAgIHpvcGUuaW50ZXJmYWNlOiAgR2VuZXJhdGUgY29kZSBmb3IgdXNlIHdpdGggem9wZS5pbnRlcmZhY2UuXG4iCisgICAgIiAgICB0d2lzdGVkOiAgICAgICAgIEdlbmVyYXRlIFR3aXN0ZWQtZnJpZW5kbHkgUlBDIHNlcnZpY2VzLlxuIgorICAgICIgICAgdG9ybmFkbzogICAgICAgICBHZW5lcmF0ZSBjb2RlIGZvciB1c2Ugd2l0aCBUb3JuYWRvLlxuIgorICAgICIgICAgbm9fdXRmOHN0cmluZ3M6ICBEbyBub3QgRW5jb2RlL2RlY29kZSBzdHJpbmdzIHVzaW5nIHV0ZjggaW4gdGhlIGdlbmVyYXRlZCBjb2RlLiBCYXNpY2FsbHkgbm8gZWZmZWN0IGZvciBQeXRob24gMy5cbiIKKyAgICAiICAgIGNvZGluZz1DT0RJTkc6ICAgQWRkIGZpbGUgZW5jb2RpbmcgZGVjbGFyZSBpbiBnZW5lcmF0ZWQgZmlsZS5cbiIKKyAgICAiICAgIHNsb3RzOiAgICAgICAgICAgR2VuZXJhdGUgY29kZSB1c2luZyBzbG90cyBmb3IgaW5zdGFuY2UgbWVtYmVycy5cbiIKKyAgICAiICAgIGR5bmFtaWM6ICAgICAgICAgR2VuZXJhdGUgZHluYW1pYyBjb2RlLCBsZXNzIGNvZGUgZ2VuZXJhdGVkIGJ1dCBzbG93ZXIuXG4iCisgICAgIiAgICBkeW5iYXNlPUNMUyAgICAgIERlcml2ZSBnZW5lcmF0ZWQgY2xhc3NlcyBmcm9tIGNsYXNzIENMUyBpbnN0ZWFkIG9mIFRCYXNlLlxuIgorICAgICIgICAgZHluZnJvemVuPUNMUyAgICBEZXJpdmUgZ2VuZXJhdGVkIGltbXV0YWJsZSBjbGFzc2VzIGZyb20gY2xhc3MgQ0xTIGluc3RlYWQgb2YgVEZyb3plbkJhc2UuXG4iCisgICAgIiAgICBkeW5leGM9Q0xTICAgICAgIERlcml2ZSBnZW5lcmF0ZWQgZXhjZXB0aW9ucyBmcm9tIENMUyBpbnN0ZWFkIG9mIFRFeGNlcHRpb25CYXNlLlxuIgorICAgICIgICAgZHluaW1wb3J0PSdmcm9tIGZvby5iYXIgaW1wb3J0IENMUydcbiIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgQWRkIGFuIGltcG9ydCBsaW5lIHRvIGdlbmVyYXRlZCBjb2RlIHRvIGZpbmQgdGhlIGR5bmJhc2UgY2xhc3MuXG4iCisgICAgIiAgICBwYWNrYWdlX3ByZWZpeD0ndG9wLnBhY2thZ2UuJ1xuIgorICAgICIgICAgICAgICAgICAgICAgICAgICBQYWNrYWdlIHByZWZpeCBmb3IgZ2VuZXJhdGVkIGZpbGVzLlxuIgorICAgICIgICAgb2xkX3N0eWxlOiAgICAgICBEZXByZWNhdGVkLiBHZW5lcmF0ZSBvbGQtc3R5bGUgY2xhc3Nlcy5cbiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X3JiX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfcmJfZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzZWEyNDkKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X3JiX2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDEyODggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KKyAqIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCisgKiBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorCisjaW5jbHVkZSAidGhyaWZ0L3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidGhyaWZ0L3ZlcnNpb24uaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9vb3BfZ2VuZXJhdG9yLmgiCisKK3VzaW5nIHN0ZDo6bWFwOwordXNpbmcgc3RkOjpvZnN0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnZlY3RvcjsKKworc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsID0gIlxuIjsgLy8gYXZvaWQgb3N0cmVhbSA8PCBzdGQ6OmVuZGwgZmx1c2hlcworCisvKioKKyAqIEEgc3ViY2xhc3Mgb2Ygc3RkOjpvZnN0cmVhbSB0aGF0IGluY2x1ZGVzIGluZGVudGluZyBmdW5jdGlvbmFsaXR5LgorICovCitjbGFzcyB0X3JiX29mc3RyZWFtIDogcHVibGljIHN0ZDo6b2ZzdHJlYW0geworcHJpdmF0ZToKKyAgaW50IGluZGVudF87CisKK3B1YmxpYzoKKyAgdF9yYl9vZnN0cmVhbSgpIDogc3RkOjpvZnN0cmVhbSgpLCBpbmRlbnRfKDApIHt9CisgIGV4cGxpY2l0IHRfcmJfb2ZzdHJlYW0oY29uc3QgY2hhciogZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Om9wZW5tb2RlIG1vZGUgPSBpb3NfYmFzZTo6b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRlbnQgPSAwKQorICAgIDogc3RkOjpvZnN0cmVhbShmaWxlbmFtZSwgbW9kZSksIGluZGVudF8oaW5kZW50KSB7fQorCisgIHRfcmJfb2ZzdHJlYW0mIGluZGVudCgpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGluZGVudF87ICsraSkgeworICAgICAgKnRoaXMgPDwgIiAgIjsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgdm9pZCBpbmRlbnRfdXAoKSB7IGluZGVudF8rKzsgfQorICB2b2lkIGluZGVudF9kb3duKCkgeyBpbmRlbnRfLS07IH0KK307CisKKy8qKgorICogUnVieSBjb2RlIGdlbmVyYXRvci4KKyAqCisgKi8KK2NsYXNzIHRfcmJfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7CitwdWJsaWM6CisgIHRfcmJfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQorICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pIHsKKyAgICAodm9pZClvcHRpb25fc3RyaW5nOworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7CisKKyAgICByZXF1aXJlX3J1YnlnZW1zXyA9IGZhbHNlOworICAgIG5hbWVzcGFjZWRfID0gZmFsc2U7CisgICAgZm9yKCBpdGVyID0gcGFyc2VkX29wdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKTsgKytpdGVyKSB7CisgICAgICBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgicnVieWdlbXMiKSA9PSAwKSB7CisgICAgICAgIHJlcXVpcmVfcnVieWdlbXNfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgibmFtZXNwYWNlZCIpID09IDApIHsKKyAgICAgICAgbmFtZXNwYWNlZF8gPSB0cnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgInVua25vd24gb3B0aW9uIHJ1Ynk6IiArIGl0ZXItPmZpcnN0OworICAgICAgfQorICAgIH0KKworICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLXJiIjsKKyAgfQorCisgIC8qKgorICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCisgICAqLworCisgIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKKyAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKKworICAvKioKKyAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZik7CisgIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZm9yd2FyZF9kZWNsYXJhdGlvbih0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfdW5pb24odF9zdHJ1Y3QqIHR1bmlvbik7CisgIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworICB0X3JiX29mc3RyZWFtJiByZW5kZXJfY29uc3RfdmFsdWUodF9yYl9vZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKKworICAvKioKKyAgICogU3RydWN0IGdlbmVyYXRpb24gY29kZQorICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3JiX3N0cnVjdF9kZWNsYXJhdGlvbih0X3JiX29mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfcmJfc3RydWN0KHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9yYl9zdHJ1Y3RfcmVxdWlyZWRfdmFsaWRhdG9yKHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3JiX3VuaW9uKHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9yYl91bmlvbl92YWxpZGF0b3IodF9yYl9vZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfcmJfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICB2b2lkIGdlbmVyYXRlX3JiX3NpbXBsZV9jb25zdHJ1Y3Rvcih0X3JiX29mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9yYl9zaW1wbGVfZXhjZXB0aW9uX2NvbnN0cnVjdG9yKHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2ZpZWxkX2NvbnN0YW50cyh0X3JiX29mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9maWVsZF9jb25zdHJ1Y3RvcnModF9yYl9vZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZmllbGRfZGVmbnModF9yYl9vZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZmllbGRfZGF0YSh0X3JiX29mc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIGZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIGZpZWxkX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBvcHRpb25hbCk7CisKKyAgLyoqCisgICAqIFNlcnZpY2UtbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworCisgIC8qKgorICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZCh0X3JiX29mc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbGFzcyA9IGZhbHNlKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdCh0X3JiX29mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIodF9yYl9vZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudCh0X3JiX29mc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudCh0X3JiX29mc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQodF9yYl9vZnN0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQodF9yYl9vZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3QodF9yYl9vZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcih0X3JiX29mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudCh0X3JiX29mc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBraXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgdml0ZXIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9zZXQqIHRtYXAsIHN0ZDo6c3RyaW5nIGl0ZXIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudCh0X3JiX29mc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0ZDo6c3RyaW5nIGl0ZXIpOworCisgIHZvaWQgZ2VuZXJhdGVfcmRvYyh0X3JiX29mc3RyZWFtJiBvdXQsIHRfZG9jKiB0ZG9jKTsKKworICAvKioKKyAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKKyAgICovCisKKyAgc3RkOjpzdHJpbmcgcmJfYXV0b2dlbl9jb21tZW50KCk7CisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9yZXF1aXJlX3RocmlmdCgpOworICBzdGQ6OnN0cmluZyByZW5kZXJfaW5jbHVkZXMoKTsKKyAgc3RkOjpzdHJpbmcgZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQpOworICBzdGQ6OnN0cmluZyB0eXBlX25hbWUoY29uc3QgdF90eXBlKiB0dHlwZSk7CisgIHN0ZDo6c3RyaW5nIGZ1bGxfdHlwZV9uYW1lKGNvbnN0IHRfdHlwZSogdHR5cGUpOworICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7CisgIHN0ZDo6c3RyaW5nIHJiX25hbWVzcGFjZV90b19wYXRoX3ByZWZpeChzdGQ6OnN0cmluZyByYl9uYW1lc3BhY2UpOworCisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBydWJ5X21vZHVsZXMoY29uc3QgdF9wcm9ncmFtKiBwKSB7CisgICAgc3RkOjpzdHJpbmcgbnMgPSBwLT5nZXRfbmFtZXNwYWNlKCJyYiIpOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBtb2R1bGVzOworICAgIGlmIChucy5lbXB0eSgpKSB7CisgICAgICByZXR1cm4gbW9kdWxlczsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZzo6aXRlcmF0b3IgcG9zID0gbnMuYmVnaW4oKTsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgc3RkOjpzdHJpbmc6Oml0ZXJhdG9yIGRlbGltID0gc3RkOjpmaW5kKHBvcywgbnMuZW5kKCksICcuJyk7CisgICAgICBtb2R1bGVzLnB1c2hfYmFjayhjYXBpdGFsaXplKHN0ZDo6c3RyaW5nKHBvcywgZGVsaW0pKSk7CisgICAgICBwb3MgPSBkZWxpbTsKKyAgICAgIGlmIChwb3MgPT0gbnMuZW5kKCkpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICArK3BvczsKKyAgICB9CisKKyAgICByZXR1cm4gbW9kdWxlczsKKyAgfQorCisgIHZvaWQgYmVnaW5fbmFtZXNwYWNlKHRfcmJfb2ZzdHJlYW0mLCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4pOworICB2b2lkIGVuZF9uYW1lc3BhY2UodF9yYl9vZnN0cmVhbSYsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPik7CisKK3ByaXZhdGU6CisgIC8qKgorICAgKiBGaWxlIHN0cmVhbXMKKyAgICovCisKKyAgdF9yYl9vZnN0cmVhbSBmX3R5cGVzXzsKKyAgdF9yYl9vZnN0cmVhbSBmX2NvbnN0c187CisgIHRfcmJfb2ZzdHJlYW0gZl9zZXJ2aWNlXzsKKworICBzdGQ6OnN0cmluZyBuYW1lc3BhY2VfZGlyXzsKKyAgc3RkOjpzdHJpbmcgcmVxdWlyZV9wcmVmaXhfOworCisgIC8qKiBJZiB0cnVlLCBhZGQgYSAicmVxdWlyZSAncnVieWdlbXMnIiBsaW5lIHRvIHRoZSB0b3Agb2YgZWFjaCBnZW4tcmIgZmlsZS4gKi8KKyAgYm9vbCByZXF1aXJlX3J1YnlnZW1zXzsKKworICAvKiogSWYgdHJ1ZSwgZ2VuZXJhdGUgZmlsZXMgaW4gaWRpb21hdGljIG5hbWVzcGFjZWQgZGlyZWN0b3JpZXMuICovCisgIGJvb2wgbmFtZXNwYWNlZF87Cit9OworCisvKioKKyAqIFByZXBhcmVzIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0CisgKiBzdHJlYW1zLgorICoKKyAqIEBwYXJhbSB0cHJvZ3JhbSBUaGUgcHJvZ3JhbSB0byBnZW5lcmF0ZQorICovCit2b2lkIHRfcmJfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKKyAgc3RyaW5nIHN1YmRpciA9IGdldF9vdXRfZGlyKCk7CisKKyAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5CisgIE1LRElSKHN1YmRpci5jX3N0cigpKTsKKworICBpZiAobmFtZXNwYWNlZF8pIHsKKyAgICByZXF1aXJlX3ByZWZpeF8gPSByYl9uYW1lc3BhY2VfdG9fcGF0aF9wcmVmaXgocHJvZ3JhbV8tPmdldF9uYW1lc3BhY2UoInJiIikpOworCisgICAgc3RyaW5nIGRpciA9IHJlcXVpcmVfcHJlZml4XzsKKyAgICBzdHJpbmc6OnNpemVfdHlwZSBsb2M7CisKKyAgICB3aGlsZSAoKGxvYyA9IGRpci5maW5kKCIvIikpICE9IHN0cmluZzo6bnBvcykgeworICAgICAgc3ViZGlyID0gc3ViZGlyICsgZGlyLnN1YnN0cigwLCBsb2MpICsgIi8iOworICAgICAgTUtESVIoc3ViZGlyLmNfc3RyKCkpOworICAgICAgZGlyID0gZGlyLnN1YnN0cihsb2MgKyAxKTsKKyAgICB9CisgIH0KKworICBuYW1lc3BhY2VfZGlyXyA9IHN1YmRpcjsKKworICAvLyBNYWtlIG91dHB1dCBmaWxlCisgIHN0cmluZyBmX3R5cGVzX25hbWUgPSBuYW1lc3BhY2VfZGlyXyArIHVuZGVyc2NvcmUocHJvZ3JhbV9uYW1lXykgKyAiX3R5cGVzLnJiIjsKKyAgZl90eXBlc18ub3BlbihmX3R5cGVzX25hbWUuY19zdHIoKSk7CisKKyAgc3RyaW5nIGZfY29uc3RzX25hbWUgPSBuYW1lc3BhY2VfZGlyXyArIHVuZGVyc2NvcmUocHJvZ3JhbV9uYW1lXykgKyAiX2NvbnN0YW50cy5yYiI7CisgIGZfY29uc3RzXy5vcGVuKGZfY29uc3RzX25hbWUuY19zdHIoKSk7CisKKyAgLy8gUHJpbnQgaGVhZGVyCisgIGZfdHlwZXNfIDw8IHJiX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGwgPDwgcmVuZGVyX3JlcXVpcmVfdGhyaWZ0KCkgPDwgcmVuZGVyX2luY2x1ZGVzKCkgPDwgZW5kbDsKKyAgYmVnaW5fbmFtZXNwYWNlKGZfdHlwZXNfLCBydWJ5X21vZHVsZXMocHJvZ3JhbV8pKTsKKworICBmX2NvbnN0c18gPDwgcmJfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbCA8PCByZW5kZXJfcmVxdWlyZV90aHJpZnQoKSA8PCAicmVxdWlyZSAnIgorICAgICAgICAgICAgPDwgcmVxdWlyZV9wcmVmaXhfIDw8IHVuZGVyc2NvcmUocHJvZ3JhbV9uYW1lXykgPDwgIl90eXBlcyciIDw8IGVuZGwgPDwgZW5kbDsKKyAgYmVnaW5fbmFtZXNwYWNlKGZfY29uc3RzXywgcnVieV9tb2R1bGVzKHByb2dyYW1fKSk7Cit9CisKKy8qKgorICogUmVuZGVycyB0aGUgcmVxdWlyZSBvZiB0aHJpZnQgaXRzZWxmLCBhbmQgcG9zc2libHkgb2YgdGhlIHJ1YnlnZW1zIGRlcGVuZGVuY3kuCisgKi8KK3N0cmluZyB0X3JiX2dlbmVyYXRvcjo6cmVuZGVyX3JlcXVpcmVfdGhyaWZ0KCkgeworICBpZiAocmVxdWlyZV9ydWJ5Z2Vtc18pIHsKKyAgICByZXR1cm4gInJlcXVpcmUgJ3J1YnlnZW1zJ1xucmVxdWlyZSAndGhyaWZ0J1xuIjsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gInJlcXVpcmUgJ3RocmlmdCdcbiI7CisgIH0KK30KKworLyoqCisgKiBSZW5kZXJzIGFsbCB0aGUgaW1wb3J0cyBuZWNlc3NhcnkgZm9yIGluY2x1ZGluZyBhbm90aGVyIFRocmlmdCBwcm9ncmFtCisgKi8KK3N0cmluZyB0X3JiX2dlbmVyYXRvcjo6cmVuZGVyX2luY2x1ZGVzKCkgeworICBjb25zdCB2ZWN0b3I8dF9wcm9ncmFtKj4mIGluY2x1ZGVzID0gcHJvZ3JhbV8tPmdldF9pbmNsdWRlcygpOworICBzdHJpbmcgcmVzdWx0ID0gIiI7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5jbHVkZXMuc2l6ZSgpOyArK2kpIHsKKyAgICBpZiAobmFtZXNwYWNlZF8pIHsKKyAgICAgIHRfcHJvZ3JhbSogaW5jbHVkZWQgPSBpbmNsdWRlc1tpXTsKKyAgICAgIHN0ZDo6c3RyaW5nIGluY2x1ZGVkX3JlcXVpcmVfcHJlZml4CisgICAgICAgICAgPSByYl9uYW1lc3BhY2VfdG9fcGF0aF9wcmVmaXgoaW5jbHVkZWQtPmdldF9uYW1lc3BhY2UoInJiIikpOworICAgICAgc3RkOjpzdHJpbmcgaW5jbHVkZWRfbmFtZSA9IGluY2x1ZGVkLT5nZXRfbmFtZSgpOworICAgICAgcmVzdWx0ICs9ICJyZXF1aXJlICciICsgaW5jbHVkZWRfcmVxdWlyZV9wcmVmaXggKyB1bmRlcnNjb3JlKGluY2x1ZGVkX25hbWUpICsgIl90eXBlcydcbiI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdCArPSAicmVxdWlyZSAnIiArIHVuZGVyc2NvcmUoaW5jbHVkZXNbaV0tPmdldF9uYW1lKCkpICsgIl90eXBlcydcbiI7CisgICAgfQorICB9CisgIGlmIChpbmNsdWRlcy5zaXplKCkgPiAwKSB7CisgICAgcmVzdWx0ICs9ICJcbiI7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBBdXRvZ2VuJ2QgY29tbWVudAorICovCitzdHJpbmcgdF9yYl9nZW5lcmF0b3I6OnJiX2F1dG9nZW5fY29tbWVudCgpIHsKKyAgcmV0dXJuIHN0ZDo6c3RyaW5nKCIjXG4iKSArICIjIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgiICsgVEhSSUZUX1ZFUlNJT04gKyAiKVxuIgorICAgICAgICAgKyAiI1xuIiArICIjIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkdcbiIgKyAiI1xuIjsKK30KKworLyoqCisgKiBDbG9zZXMgdGhlIHR5cGUgZmlsZXMKKyAqLwordm9pZCB0X3JiX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgeworICAvLyBDbG9zZSB0eXBlcyBmaWxlCisgIGVuZF9uYW1lc3BhY2UoZl90eXBlc18sIHJ1YnlfbW9kdWxlcyhwcm9ncmFtXykpOworICBlbmRfbmFtZXNwYWNlKGZfY29uc3RzXywgcnVieV9tb2R1bGVzKHByb2dyYW1fKSk7CisgIGZfdHlwZXNfLmNsb3NlKCk7CisgIGZfY29uc3RzXy5jbG9zZSgpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIFRoaXMgaXMgbm90IGRvbmUgaW4gUnVieSwgdHlwZXMgYXJlIGFsbCBpbXBsaWNpdC4KKyAqCisgKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgorICovCit2b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKKyAgKHZvaWQpdHR5cGVkZWY7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGNvZGUgZm9yIGFuIGVudW1lcmF0ZWQgdHlwZS4gRG9uZSB1c2luZyBhIGNsYXNzIHRvIHNjb3BlCisgKiB0aGUgdmFsdWVzLgorICoKKyAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KKyAqLwordm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7CisgIGZfdHlwZXNfLmluZGVudCgpIDw8ICJtb2R1bGUgIiA8PCBjYXBpdGFsaXplKHRlbnVtLT5nZXRfbmFtZSgpKSA8PCBlbmRsOworICBmX3R5cGVzXy5pbmRlbnRfdXAoKTsKKworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7CisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKworICAgIC8vIFJ1YnkgY2xhc3MgY29uc3RhbnRzIGhhdmUgdG8gYmUgY2FwaXRhbGl6ZWQuLi4gb21nIGkgYW0gc28gb24gdGhlIGZlbmNlCisgICAgLy8gYWJvdXQgbGFuZ3VhZ2VzIHN0cmljdGx5IGVuZm9yY2luZyBjYXBpdGFsaXphdGlvbiB3aHkgY2FuJ3Qgd2UganVzdCBhbGwKKyAgICAvLyBhZ3JlZSBhbmQgcGxheSBuaWNlLgorICAgIHN0cmluZyBuYW1lID0gY2FwaXRhbGl6ZSgoKmNfaXRlciktPmdldF9uYW1lKCkpOworCisgICAgZ2VuZXJhdGVfcmRvYyhmX3R5cGVzXywgKmNfaXRlcik7CisgICAgZl90eXBlc18uaW5kZW50KCkgPDwgbmFtZSA8PCAiID0gIiA8PCB2YWx1ZSA8PCBlbmRsOworICB9CisKKyAgLy8gQ3JlYXRlIGEgaGFzaCBtYXBwaW5nIHZhbHVlcyBiYWNrIHRvIHRoZWlyIG5hbWVzIChhcyBzdHJpbmdzKSBzaW5jZSBydWJ5IGhhcyBubyBuYXRpdmUgZW51bQorICAvLyB0eXBlCisgIGZfdHlwZXNfLmluZGVudCgpIDw8ICJWQUxVRV9NQVAgPSB7IjsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICAvLyBQb3B1bGF0ZSB0aGUgaGFzaAorICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgICAgaWYgKGNfaXRlciAhPSBjb25zdGFudHMuYmVnaW4oKSkKKyAgICAgIGZfdHlwZXNfIDw8ICIsICI7CisgICAgZl90eXBlc18gPDwgdmFsdWUgPDwgIiA9PiBcIiIgPDwgY2FwaXRhbGl6ZSgoKmNfaXRlciktPmdldF9uYW1lKCkpIDw8ICJcIiI7CisgIH0KKyAgZl90eXBlc18gPDwgIn0iIDw8IGVuZGw7CisKKyAgLy8gQ3JlYXRlIGEgc2V0IHdpdGggdmFsaWQgdmFsdWVzIGZvciB0aGlzIGVudW0KKyAgZl90eXBlc18uaW5kZW50KCkgPDwgIlZBTElEX1ZBTFVFUyA9IFNldC5uZXcoWyI7CisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgLy8gUG9wdWxhdGUgdGhlIHNldAorICAgIGlmIChjX2l0ZXIgIT0gY29uc3RhbnRzLmJlZ2luKCkpCisgICAgICBmX3R5cGVzXyA8PCAiLCAiOworICAgIGZfdHlwZXNfIDw8IGNhcGl0YWxpemUoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgfQorICBmX3R5cGVzXyA8PCAiXSkuZnJlZXplIiA8PCBlbmRsOworCisgIGZfdHlwZXNfLmluZGVudF9kb3duKCk7CisgIGZfdHlwZXNfLmluZGVudCgpIDw8ICJlbmQiIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZSBhIGNvbnN0YW50IHZhbHVlCisgKi8KK3ZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCkgeworICB0X3R5cGUqIHR5cGUgPSB0Y29uc3QtPmdldF90eXBlKCk7CisgIHN0cmluZyBuYW1lID0gdGNvbnN0LT5nZXRfbmFtZSgpOworICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSA9IHRjb25zdC0+Z2V0X3ZhbHVlKCk7CisKKyAgbmFtZVswXSA9IHRvdXBwZXIobmFtZVswXSk7CisKKyAgZl9jb25zdHNfLmluZGVudCgpIDw8IG5hbWUgPDwgIiA9ICI7CisgIHJlbmRlcl9jb25zdF92YWx1ZShmX2NvbnN0c18sIHR5cGUsIHZhbHVlKSA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogUHJpbnRzIHRoZSB2YWx1ZSBvZiBhIGNvbnN0YW50IHdpdGggdGhlIGdpdmVuIHR5cGUuIE5vdGUgdGhhdCB0eXBlIGNoZWNraW5nCisgKiBpcyBOT1QgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24gYXMgaXQgaXMgYWx3YXlzIHJ1biBiZWZvcmVoYW5kIHVzaW5nIHRoZQorICogdmFsaWRhdGVfdHlwZXMgbWV0aG9kIGluIG1haW4uY2MKKyAqLwordF9yYl9vZnN0cmVhbSYgdF9yYl9nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZSh0X3JiX29mc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICBvdXQgPDwgIiVxXCIiIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgb3V0IDw8ICh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDAgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7CisgICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBvdXQuaW5kZW50KCkgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIG91dCA8PCBmdWxsX3R5cGVfbmFtZSh0eXBlKSA8PCAiLm5ldyh7IiA8PCBlbmRsOworICAgIG91dC5pbmRlbnRfdXAoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKKyAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7CisgICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgeworICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOworICAgICAgfQorICAgICAgb3V0LmluZGVudCgpOworICAgICAgcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgZ190eXBlX3N0cmluZywgdl9pdGVyLT5maXJzdCkgPDwgIiA9PiAiOworICAgICAgcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpIDw8ICIsIiA8PCBlbmRsOworICAgIH0KKyAgICBvdXQuaW5kZW50X2Rvd24oKTsKKyAgICBvdXQuaW5kZW50KCkgPDwgIn0pIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICBvdXQgPDwgInsiIDw8IGVuZGw7CisgICAgb3V0LmluZGVudF91cCgpOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIG91dC5pbmRlbnQoKTsKKyAgICAgIHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIGt0eXBlLCB2X2l0ZXItPmZpcnN0KSA8PCAiID0+ICI7CisgICAgICByZW5kZXJfY29uc3RfdmFsdWUob3V0LCB2dHlwZSwgdl9pdGVyLT5zZWNvbmQpIDw8ICIsIiA8PCBlbmRsOworICAgIH0KKyAgICBvdXQuaW5kZW50X2Rvd24oKTsKKyAgICBvdXQuaW5kZW50KCkgPDwgIn0iOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkgeworICAgIHRfdHlwZSogZXR5cGU7CisgICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9IGVsc2UgeworICAgICAgZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIH0KKyAgICBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgIG91dCA8PCAiU2V0Lm5ldyhbIiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgIlsiIDw8IGVuZGw7CisgICAgfQorICAgIG91dC5pbmRlbnRfdXAoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIG91dC5pbmRlbnQoKTsKKyAgICAgIHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIGV0eXBlLCAqdl9pdGVyKSA8PCAiLCIgPDwgZW5kbDsKKyAgICB9CisgICAgb3V0LmluZGVudF9kb3duKCk7CisgICAgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgICBvdXQuaW5kZW50KCkgPDwgIl0pIjsKKyAgICB9IGVsc2UgeworICAgICAgb3V0LmluZGVudCgpIDw8ICJdIjsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBDT05TVEFOVCBGT1IgVFlQRTogIiArIHR5cGUtPmdldF9uYW1lKCk7CisgIH0KKyAgcmV0dXJuIG91dDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBydWJ5IHN0cnVjdAorICovCit2b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaWYgKHRzdHJ1Y3QtPmlzX3VuaW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9yYl91bmlvbihmX3R5cGVzXywgdHN0cnVjdCwgZmFsc2UpOworICB9IGVsc2UgeworICAgIGdlbmVyYXRlX3JiX3N0cnVjdChmX3R5cGVzXywgdHN0cnVjdCwgZmFsc2UpOworICB9Cit9CisKKworLyoqCisgKiBHZW5lcmF0ZXMgdGhlICJmb3J3YXJkIGRlY2xhcmF0aW9ucyIgZm9yIHJ1Ynkgc3RydWN0cy4KKyAqIFRoZXNlIGFyZSBzaW1wbHkgYSBkZWNsYXJhdGlvbiBvZiBlYWNoIGNsYXNzIHdpdGggcHJvcGVyIGluaGVyaXRhbmNlLgorICogVGhlIHJlc3Qgb2YgdGhlIHN0cnVjdCBpcyBzdGlsbCBnZW5lcmF0ZWQgaW4gZ2VuZXJhdGVfc3RydWN0IGFzIGhhcworICogYWx3YXlzIGJlZW4gdGhlIGNhc2UuIFRoZXNlIGRlY2xhcmF0aW9ucyBhbGxvdyB0aHJpZnQgdG8gZ2VuZXJhdGUgdmFsaWQKKyAqIHJ1YnkgaW4gY2FzZXMgd2hlcmUgdGhyaWZ0IHN0cnVjdHMgcmVseSBvbiByZWN1cnNpdmUgZGVmaW5pdGlvbnMuCisgKi8KK3ZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX2ZvcndhcmRfZGVjbGFyYXRpb24odF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgZ2VuZXJhdGVfcmJfc3RydWN0X2RlY2xhcmF0aW9uKGZfdHlwZXNfLCB0c3RydWN0LCB0c3RydWN0LT5pc194Y2VwdGlvbigpKTsKK30KKwordm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcmJfc3RydWN0X2RlY2xhcmF0aW9uKHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisgIG91dC5pbmRlbnQoKSA8PCAiY2xhc3MgIiA8PCB0eXBlX25hbWUodHN0cnVjdCk7CisgIGlmICh0c3RydWN0LT5pc191bmlvbigpKSB7CisgICAgb3V0IDw8ICIgPCA6OlRocmlmdDo6VW5pb24iOworICB9CisgIGlmIChpc19leGNlcHRpb24pIHsKKyAgICBvdXQgPDwgIiA8IDo6VGhyaWZ0OjpFeGNlcHRpb24iOworICB9CisgIG91dCA8PCAiOyBlbmQiIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZXhjZXB0aW9uLiBCYXNpY2FsbHkgdGhlIHNhbWUKKyAqIGFzIGEgc3RydWN0IGJ1dCBleHRlbmRzIHRoZSBFeGNlcHRpb24gY2xhc3MuCisgKgorICogQHBhcmFtIHR4Y2VwdGlvbiBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgeworICBnZW5lcmF0ZV9yYl9zdHJ1Y3QoZl90eXBlc18sIHR4Y2VwdGlvbiwgdHJ1ZSk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgcnVieSBzdHJ1Y3QKKyAqLwordm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcmJfc3RydWN0KHRfcmJfb2ZzdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiA9IGZhbHNlKSB7CisgIGdlbmVyYXRlX3Jkb2Mob3V0LCB0c3RydWN0KTsKKyAgb3V0LmluZGVudCgpIDw8ICJjbGFzcyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KTsKKyAgaWYgKGlzX2V4Y2VwdGlvbikgeworICAgIG91dCA8PCAiIDwgOjpUaHJpZnQ6OkV4Y2VwdGlvbiI7CisgIH0KKyAgb3V0IDw8IGVuZGw7CisKKyAgb3V0LmluZGVudF91cCgpOworICBvdXQuaW5kZW50KCkgPDwgImluY2x1ZGUgOjpUaHJpZnQ6OlN0cnVjdCwgOjpUaHJpZnQ6OlN0cnVjdF9VbmlvbiIgPDwgZW5kbDsKKworICBpZiAoaXNfZXhjZXB0aW9uKSB7CisgICAgZ2VuZXJhdGVfcmJfc2ltcGxlX2V4Y2VwdGlvbl9jb25zdHJ1Y3RvcihvdXQsIHRzdHJ1Y3QpOworICB9CisKKyAgZ2VuZXJhdGVfZmllbGRfY29uc3RhbnRzKG91dCwgdHN0cnVjdCk7CisgIGdlbmVyYXRlX2ZpZWxkX2RlZm5zKG91dCwgdHN0cnVjdCk7CisgIGdlbmVyYXRlX3JiX3N0cnVjdF9yZXF1aXJlZF92YWxpZGF0b3Iob3V0LCB0c3RydWN0KTsKKworICBvdXQuaW5kZW50KCkgPDwgIjo6VGhyaWZ0OjpTdHJ1Y3QuZ2VuZXJhdGVfYWNjZXNzb3JzIHNlbGYiIDw8IGVuZGw7CisKKyAgb3V0LmluZGVudF9kb3duKCk7CisgIG91dC5pbmRlbnQoKSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgcnVieSB1bmlvbgorICovCit2b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yYl91bmlvbih0X3JiX29mc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uID0gZmFsc2UpIHsKKyAgKHZvaWQpaXNfZXhjZXB0aW9uOworICBnZW5lcmF0ZV9yZG9jKG91dCwgdHN0cnVjdCk7CisgIG91dC5pbmRlbnQoKSA8PCAiY2xhc3MgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIiA8IDo6VGhyaWZ0OjpVbmlvbiIgPDwgZW5kbDsKKworICBvdXQuaW5kZW50X3VwKCk7CisgIG91dC5pbmRlbnQoKSA8PCAiaW5jbHVkZSA6OlRocmlmdDo6U3RydWN0X1VuaW9uIiA8PCBlbmRsOworCisgIGdlbmVyYXRlX2ZpZWxkX2NvbnN0cnVjdG9ycyhvdXQsIHRzdHJ1Y3QpOworCisgIGdlbmVyYXRlX2ZpZWxkX2NvbnN0YW50cyhvdXQsIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9maWVsZF9kZWZucyhvdXQsIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9yYl91bmlvbl92YWxpZGF0b3Iob3V0LCB0c3RydWN0KTsKKworICBvdXQuaW5kZW50KCkgPDwgIjo6VGhyaWZ0OjpVbmlvbi5nZW5lcmF0ZV9hY2Nlc3NvcnMgc2VsZiIgPDwgZW5kbDsKKworICBvdXQuaW5kZW50X2Rvd24oKTsKKyAgb3V0LmluZGVudCgpIDw8ICJlbmQiIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZmllbGRfY29uc3RydWN0b3JzKHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKworICBvdXQuaW5kZW50KCkgPDwgImNsYXNzIDw8IHNlbGYiIDw8IGVuZGw7CisgIG91dC5pbmRlbnRfdXAoKTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZl9pdGVyICE9IGZpZWxkcy5iZWdpbigpKSB7CisgICAgICBvdXQgPDwgZW5kbDsKKyAgICB9CisgICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKworICAgIG91dC5pbmRlbnQoKSA8PCAiZGVmICIgPDwgZmllbGRfbmFtZSA8PCAiKHZhbCkiIDw8IGVuZGw7CisgICAgb3V0LmluZGVudCgpIDw8ICIgICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiLm5ldyg6IiA8PCBmaWVsZF9uYW1lIDw8ICIsIHZhbCkiIDw8IGVuZGw7CisgICAgb3V0LmluZGVudCgpIDw8ICJlbmQiIDw8IGVuZGw7CisgIH0KKworICBvdXQuaW5kZW50X2Rvd24oKTsKKyAgb3V0LmluZGVudCgpIDw8ICJlbmQiIDw8IGVuZGw7CisKKyAgb3V0IDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3JiX3NpbXBsZV9leGNlcHRpb25fY29uc3RydWN0b3IodF9yYl9vZnN0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKworICBpZiAobWVtYmVycy5zaXplKCkgPT0gMSkgeworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsKKworICAgIGlmICgoKm1faXRlciktPmdldF90eXBlKCktPmlzX3N0cmluZygpKSB7CisgICAgICBzdHJpbmcgbmFtZSA9ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKKworICAgICAgb3V0LmluZGVudCgpIDw8ICJkZWYgaW5pdGlhbGl6ZShtZXNzYWdlPW5pbCkiIDw8IGVuZGw7CisgICAgICBvdXQuaW5kZW50X3VwKCk7CisgICAgICBvdXQuaW5kZW50KCkgPDwgInN1cGVyKCkiIDw8IGVuZGw7CisgICAgICBvdXQuaW5kZW50KCkgPDwgInNlbGYuIiA8PCBuYW1lIDw8ICIgPSBtZXNzYWdlIiA8PCBlbmRsOworICAgICAgb3V0LmluZGVudF9kb3duKCk7CisgICAgICBvdXQuaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgICBpZiAobmFtZSAhPSAibWVzc2FnZSIpIHsKKyAgICAgICAgb3V0LmluZGVudCgpIDw8ICJkZWYgbWVzc2FnZTsgIiA8PCBuYW1lIDw8ICIgZW5kIiA8PCBlbmRsIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3ZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX2ZpZWxkX2NvbnN0YW50cyh0X3JiX29mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgICAgc3RkOjpzdHJpbmcgY2FwX2ZpZWxkX25hbWUgPSB1cGNhc2Vfc3RyaW5nKGZpZWxkX25hbWUpOworCisgICAgb3V0LmluZGVudCgpIDw8IGNhcF9maWVsZF9uYW1lIDw8ICIgPSAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8IGVuZGw7CisgIH0KKyAgb3V0IDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX2ZpZWxkX2RlZm5zKHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIG91dC5pbmRlbnQoKSA8PCAiRklFTERTID0geyIgPDwgZW5kbDsKKyAgb3V0LmluZGVudF91cCgpOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmX2l0ZXIgIT0gZmllbGRzLmJlZ2luKCkpIHsKKyAgICAgIG91dCA8PCAiLCIgPDwgZW5kbDsKKyAgICB9CisKKyAgICAvLyBnZW5lcmF0ZSB0aGUgZmllbGQgZG9jc3RyaW5ncyB3aXRoaW4gdGhlIEZJRUxEUyBjb25zdGFudC4gbm8gcmVhbCBiZXR0ZXIgcGxhY2UuLi4KKyAgICBnZW5lcmF0ZV9yZG9jKG91dCwgKmZfaXRlcik7CisKKyAgICBvdXQuaW5kZW50KCkgPDwgdXBjYXNlX3N0cmluZygoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIgPT4gIjsKKworICAgIGdlbmVyYXRlX2ZpZWxkX2RhdGEob3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfdHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfdmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwpOworICB9CisgIG91dC5pbmRlbnRfZG93bigpOworICBvdXQgPDwgZW5kbDsKKyAgb3V0LmluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgb3V0LmluZGVudCgpIDw8ICJkZWYgc3RydWN0X2ZpZWxkczsgRklFTERTOyBlbmQiIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZmllbGRfZGF0YSh0X3JiX29mc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZpZWxkX25hbWUgPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogZmllbGRfdmFsdWUgPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG9wdGlvbmFsID0gZmFsc2UpIHsKKyAgZmllbGRfdHlwZSA9IGdldF90cnVlX3R5cGUoZmllbGRfdHlwZSk7CisKKyAgLy8gQmVnaW4gdGhpcyBmaWVsZCdzIGRlZm4KKyAgb3V0IDw8ICJ7OnR5cGUgPT4gIiA8PCB0eXBlX3RvX2VudW0oZmllbGRfdHlwZSk7CisKKyAgaWYgKCFmaWVsZF9uYW1lLmVtcHR5KCkpIHsKKyAgICBvdXQgPDwgIiwgOm5hbWUgPT4gJyIgPDwgZmllbGRfbmFtZSA8PCAiJyI7CisgIH0KKworICBpZiAoZmllbGRfdmFsdWUgIT0gTlVMTCkgeworICAgIG91dCA8PCAiLCA6ZGVmYXVsdCA9PiAiOworICAgIHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIGZpZWxkX3R5cGUsIGZpZWxkX3ZhbHVlKTsKKyAgfQorCisgIGlmICghZmllbGRfdHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICBpZiAoZmllbGRfdHlwZS0+aXNfc3RydWN0KCkgfHwgZmllbGRfdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgICAgb3V0IDw8ICIsIDpjbGFzcyA9PiAiIDw8IGZ1bGxfdHlwZV9uYW1lKCh0X3N0cnVjdCopZmllbGRfdHlwZSk7CisgICAgfSBlbHNlIGlmIChmaWVsZF90eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIG91dCA8PCAiLCA6ZWxlbWVudCA9PiAiOworICAgICAgZ2VuZXJhdGVfZmllbGRfZGF0YShvdXQsICgodF9saXN0KilmaWVsZF90eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKTsKKyAgICB9IGVsc2UgaWYgKGZpZWxkX3R5cGUtPmlzX21hcCgpKSB7CisgICAgICBvdXQgPDwgIiwgOmtleSA9PiAiOworICAgICAgZ2VuZXJhdGVfZmllbGRfZGF0YShvdXQsICgodF9tYXAqKWZpZWxkX3R5cGUpLT5nZXRfa2V5X3R5cGUoKSk7CisgICAgICBvdXQgPDwgIiwgOnZhbHVlID0+ICI7CisgICAgICBnZW5lcmF0ZV9maWVsZF9kYXRhKG91dCwgKCh0X21hcCopZmllbGRfdHlwZSktPmdldF92YWxfdHlwZSgpKTsKKyAgICB9IGVsc2UgaWYgKGZpZWxkX3R5cGUtPmlzX3NldCgpKSB7CisgICAgICBvdXQgPDwgIiwgOmVsZW1lbnQgPT4gIjsKKyAgICAgIGdlbmVyYXRlX2ZpZWxkX2RhdGEob3V0LCAoKHRfc2V0KilmaWVsZF90eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKCgodF9iYXNlX3R5cGUqKWZpZWxkX3R5cGUpLT5pc19iaW5hcnkoKSkgeworICAgICAgb3V0IDw8ICIsIDpiaW5hcnkgPT4gdHJ1ZSI7CisgICAgfQorICB9CisKKyAgaWYgKG9wdGlvbmFsKSB7CisgICAgb3V0IDw8ICIsIDpvcHRpb25hbCA9PiB0cnVlIjsKKyAgfQorCisgIGlmIChmaWVsZF90eXBlLT5pc19lbnVtKCkpIHsKKyAgICBvdXQgPDwgIiwgOmVudW1fY2xhc3MgPT4gIiA8PCBmdWxsX3R5cGVfbmFtZShmaWVsZF90eXBlKTsKKyAgfQorCisgIC8vIEVuZCBvZiB0aGlzIGZpZWxkJ3MgZGVmbgorICBvdXQgPDwgIn0iOworfQorCit2b2lkIHRfcmJfZ2VuZXJhdG9yOjpiZWdpbl9uYW1lc3BhY2UodF9yYl9vZnN0cmVhbSYgb3V0LCB2ZWN0b3I8c3RkOjpzdHJpbmc+IG1vZHVsZXMpIHsKKyAgZm9yICh2ZWN0b3I8c3RkOjpzdHJpbmc+OjppdGVyYXRvciBtX2l0ZXIgPSBtb2R1bGVzLmJlZ2luKCk7IG1faXRlciAhPSBtb2R1bGVzLmVuZCgpOyArK21faXRlcikgeworICAgIG91dC5pbmRlbnQoKSA8PCAibW9kdWxlICIgPDwgKm1faXRlciA8PCBlbmRsOworICAgIG91dC5pbmRlbnRfdXAoKTsKKyAgfQorfQorCit2b2lkIHRfcmJfZ2VuZXJhdG9yOjplbmRfbmFtZXNwYWNlKHRfcmJfb2ZzdHJlYW0mIG91dCwgdmVjdG9yPHN0ZDo6c3RyaW5nPiBtb2R1bGVzKSB7CisgIGZvciAodmVjdG9yPHN0ZDo6c3RyaW5nPjo6cmV2ZXJzZV9pdGVyYXRvciBtX2l0ZXIgPSBtb2R1bGVzLnJiZWdpbigpOyBtX2l0ZXIgIT0gbW9kdWxlcy5yZW5kKCk7CisgICAgICAgKyttX2l0ZXIpIHsKKyAgICBvdXQuaW5kZW50X2Rvd24oKTsKKyAgICBvdXQuaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHRocmlmdCBzZXJ2aWNlLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZl9zZXJ2aWNlX25hbWUgPSBuYW1lc3BhY2VfZGlyXyArIHVuZGVyc2NvcmUoc2VydmljZV9uYW1lXykgKyAiLnJiIjsKKyAgZl9zZXJ2aWNlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOworCisgIGZfc2VydmljZV8gPDwgcmJfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbCA8PCByZW5kZXJfcmVxdWlyZV90aHJpZnQoKTsKKworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGlmIChuYW1lc3BhY2VkXykgeworICAgICAgZl9zZXJ2aWNlXyA8PCAicmVxdWlyZSAnIiA8PCByYl9uYW1lc3BhY2VfdG9fcGF0aF9wcmVmaXgoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWVzcGFjZSgicmIiKSkKKyAgICAgICAgICAgICAgICAgPDwgdW5kZXJzY29yZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSkgPDwgIiciIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfc2VydmljZV8gPDwgInJlcXVpcmUgJyIgPDwgcmVxdWlyZV9wcmVmaXhfCisgICAgICAgICAgICAgICAgIDw8IHVuZGVyc2NvcmUodHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkpIDw8ICInIiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIGZfc2VydmljZV8gPDwgInJlcXVpcmUgJyIgPDwgcmVxdWlyZV9wcmVmaXhfIDw8IHVuZGVyc2NvcmUocHJvZ3JhbV9uYW1lXykgPDwgIl90eXBlcyciIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBlbmRsOworCisgIGJlZ2luX25hbWVzcGFjZShmX3NlcnZpY2VfLCBydWJ5X21vZHVsZXModHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpKTsKKworICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJtb2R1bGUgIiA8PCBjYXBpdGFsaXplKHRzZXJ2aWNlLT5nZXRfbmFtZSgpKSA8PCBlbmRsOworICBmX3NlcnZpY2VfLmluZGVudF91cCgpOworCisgIC8vIEdlbmVyYXRlIHRoZSB0aHJlZSBtYWluIHBhcnRzIG9mIHRoZSBzZXJ2aWNlICh3ZWxsLCB0d28gZm9yIG5vdyBpbiBQSFApCisgIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOworCisgIGZfc2VydmljZV8uaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZW5kX25hbWVzcGFjZShmX3NlcnZpY2VfLCBydWJ5X21vZHVsZXModHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpKTsKKworICAvLyBDbG9zZSBzZXJ2aWNlIGZpbGUKKyAgZl9zZXJ2aWNlXy5jbG9zZSgpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBoZWxwZXIgZnVuY3Rpb25zIGZvciBhIHNlcnZpY2UuCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCisgKi8KK3ZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworCisgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgIiMgSEVMUEVSIEZVTkNUSU9OUyBBTkQgU1RSVUNUVVJFUyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9zdHJ1Y3QqIHRzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIGdlbmVyYXRlX3JiX3N0cnVjdChmX3NlcnZpY2VfLCB0cyk7CisgICAgZ2VuZXJhdGVfcmJfZnVuY3Rpb25faGVscGVycygqZl9pdGVyKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBhbmQgaGVscGVycyBmb3IgYSBmdW5jdGlvbi4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbgorICovCit2b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yYl9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7CisgIHRfZmllbGQgc3VjY2Vzcyh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksICJzdWNjZXNzIiwgMCk7CisgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKKyAgfQorCisgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHJlc3VsdC5hcHBlbmQoKmZfaXRlcik7CisgIH0KKyAgZ2VuZXJhdGVfcmJfc3RydWN0KGZfc2VydmljZV8sICZyZXN1bHQpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KKyAqLwordm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19jbGllbnQgPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gZnVsbF90eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgIGV4dGVuZHNfY2xpZW50ID0gIiA8ICIgKyBleHRlbmRzICsgIjo6Q2xpZW50ICI7CisgIH0KKworICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJjbGFzcyBDbGllbnQiIDw8IGV4dGVuZHNfY2xpZW50IDw8IGVuZGw7CisgIGZfc2VydmljZV8uaW5kZW50X3VwKCk7CisKKyAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAiaW5jbHVkZSA6OlRocmlmdDo6Q2xpZW50IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKKyAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKworICAgIC8vIE9wZW4gZnVuY3Rpb24KKyAgICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJkZWYgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgZW5kbDsKKyAgICBmX3NlcnZpY2VfLmluZGVudF91cCgpOworICAgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgInNlbmRfIiA8PCBmdW5uYW1lIDw8ICIoIjsKKworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKKyAgICAgIH0KKyAgICAgIGZfc2VydmljZV8gPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCk7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgIikiIDw8IGVuZGw7CisKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGZfc2VydmljZV8uaW5kZW50KCk7CisgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgInJldHVybiAiOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlXyA8PCAicmVjdl8iIDw8IGZ1bm5hbWUgPDwgIigpIiA8PCBlbmRsOworICAgIH0KKyAgICBmX3NlcnZpY2VfLmluZGVudF9kb3duKCk7CisgICAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAiZW5kIiA8PCBlbmRsOworICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgImRlZiBzZW5kXyIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8IGVuZGw7CisgICAgZl9zZXJ2aWNlXy5pbmRlbnRfdXAoKTsKKworICAgIHN0ZDo6c3RyaW5nIGFyZ3NuYW1lID0gY2FwaXRhbGl6ZSgoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX2FyZ3MiKTsKKyAgICBzdGQ6OnN0cmluZyBtZXNzYWdlU2VuZFByb2MgPSAoKmZfaXRlciktPmlzX29uZXdheSgpID8gInNlbmRfb25ld2F5X21lc3NhZ2UiIDogInNlbmRfbWVzc2FnZSI7CisKKyAgICBmX3NlcnZpY2VfLmluZGVudCgpIDw8IG1lc3NhZ2VTZW5kUHJvYyA8PCAiKCciIDw8IGZ1bm5hbWUgPDwgIicsICIgPDwgYXJnc25hbWU7CisKKyAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgICAgZl9zZXJ2aWNlXyA8PCAiLCA6IiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0+ICIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCk7CisgICAgfQorCisgICAgZl9zZXJ2aWNlXyA8PCAiKSIgPDwgZW5kbDsKKworICAgIGZfc2VydmljZV8uaW5kZW50X2Rvd24oKTsKKyAgICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJlbmQiIDw8IGVuZGw7CisKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIHN0ZDo6c3RyaW5nIHJlc3VsdG5hbWUgPSBjYXBpdGFsaXplKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7CisgICAgICB0X3N0cnVjdCBub2FyZ3MocHJvZ3JhbV8pOworCisgICAgICB0X2Z1bmN0aW9uIHJlY3ZfZnVuY3Rpb24oKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygicmVjdl8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbm9hcmdzKTsKKyAgICAgIC8vIE9wZW4gZnVuY3Rpb24KKyAgICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgICAgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgImRlZiAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmcmVjdl9mdW5jdGlvbikgPDwgZW5kbDsKKyAgICAgIGZfc2VydmljZV8uaW5kZW50X3VwKCk7CisKKyAgICAgIC8vIFRPRE8obWNzbGVlKTogVmFsaWRhdGUgbWVzc2FnZSByZXBseSBoZXJlLCBzZXEgaWRzIGV0Yy4KKworICAgICAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAicmVzdWx0ID0gcmVjZWl2ZV9tZXNzYWdlKCIgPDwgcmVzdWx0bmFtZSA8PCAiKSIgPDwgZW5kbDsKKworICAgICAgLy8gQ2FyZWZ1bCwgb25seSByZXR1cm4gX3Jlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCisgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgInJldHVybiByZXN1bHQuc3VjY2VzcyB1bmxlc3MgcmVzdWx0LnN1Y2Nlc3MubmlsPyIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7CisgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgICAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAicmFpc2UgcmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgdW5sZXNzIHJlc3VsdC4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIubmlsPyIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgLy8gQ2FyZWZ1bCwgb25seSByZXR1cm4gX3Jlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCisgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAicmV0dXJuIiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAicmFpc2UgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI6OlRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb24ubmV3KDo6VGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNSVNTSU5HX1JFU1VMVCwgJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBmYWlsZWQ6IHVua25vd24gcmVzdWx0JykiIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIC8vIENsb3NlIGZ1bmN0aW9uCisgICAgICBmX3NlcnZpY2VfLmluZGVudF9kb3duKCk7CisgICAgICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJlbmQiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBmX3NlcnZpY2VfLmluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2Ugc2VydmVyIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KKyAqLwordm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICAvLyBHZW5lcmF0ZSB0aGUgZGlzcGF0Y2ggbWV0aG9kcworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19wcm9jZXNzb3IgPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gZnVsbF90eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgIGV4dGVuZHNfcHJvY2Vzc29yID0gIiA8ICIgKyBleHRlbmRzICsgIjo6UHJvY2Vzc29yICI7CisgIH0KKworICAvLyBHZW5lcmF0ZSB0aGUgaGVhZGVyIHBvcnRpb24KKyAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAiY2xhc3MgUHJvY2Vzc29yIiA8PCBleHRlbmRzX3Byb2Nlc3NvciA8PCBlbmRsOworICBmX3NlcnZpY2VfLmluZGVudF91cCgpOworCisgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgImluY2x1ZGUgOjpUaHJpZnQ6OlByb2Nlc3NvciIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzIHN1YmZ1bmN0aW9ucworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odHNlcnZpY2UsICpmX2l0ZXIpOworICB9CisKKyAgZl9zZXJ2aWNlXy5pbmRlbnRfZG93bigpOworICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJlbmQiIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBwcm9jZXNzIGZ1bmN0aW9uIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24gdG8gd3JpdGUgYSBkaXNwYXRjaGVyIGZvcgorICovCit2b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICAodm9pZCl0c2VydmljZTsKKyAgLy8gT3BlbiBmdW5jdGlvbgorICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJkZWYgcHJvY2Vzc18iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKHNlcWlkLCBpcHJvdCwgb3Byb3QpIiA8PCBlbmRsOworICBmX3NlcnZpY2VfLmluZGVudF91cCgpOworCisgIHN0cmluZyBhcmdzbmFtZSA9IGNhcGl0YWxpemUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSArICJfYXJncyI7CisgIHN0cmluZyByZXN1bHRuYW1lID0gY2FwaXRhbGl6ZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpICsgIl9yZXN1bHQiOworCisgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgImFyZ3MgPSByZWFkX2FyZ3MoaXByb3QsICIgPDwgYXJnc25hbWUgPDwgIikiIDw8IGVuZGw7CisKKyAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKworICAvLyBEZWNsYXJlIHJlc3VsdCBmb3Igbm9uIG9uZXdheSBmdW5jdGlvbgorICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJyZXN1bHQgPSAiIDw8IHJlc3VsdG5hbWUgPDwgIi5uZXcoKSIgPDwgZW5kbDsKKyAgfQorCisgIC8vIFRyeSBibG9jayBmb3IgYSBmdW5jdGlvbiB3aXRoIGV4Y2VwdGlvbnMKKyAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgICAgZl9zZXJ2aWNlXy5pbmRlbnRfdXAoKTsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHRoZSBmdW5jdGlvbiBjYWxsCisgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBmX3NlcnZpY2VfLmluZGVudCgpOworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAicmVzdWx0LnN1Y2Nlc3MgPSAiOworICB9CisgIGZfc2VydmljZV8gPDwgIkBoYW5kbGVyLiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgImFyZ3MuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgIH0KKyAgZl9zZXJ2aWNlXyA8PCAiKSIgPDwgZW5kbDsKKworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgeGNlcHRpb25zLnNpemUoKSA+IDApIHsKKyAgICBmX3NlcnZpY2VfLmluZGVudF9kb3duKCk7CisgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgInJlc2N1ZSAiIDw8IGZ1bGxfdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiA9PiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCBlbmRsOworICAgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICAgIGZfc2VydmljZV8uaW5kZW50X3VwKCk7CisgICAgICAgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgInJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICBmX3NlcnZpY2VfLmluZGVudF9kb3duKCk7CisgICAgICB9CisgICAgfQorICAgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbDsKKyAgfQorCisgIC8vIFNob3J0Y3V0IG91dCBoZXJlIGZvciBvbmV3YXkgZnVuY3Rpb25zCisgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAicmV0dXJuIiA8PCBlbmRsOworICAgIGZfc2VydmljZV8uaW5kZW50X2Rvd24oKTsKKyAgICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJlbmQiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICByZXR1cm47CisgIH0KKworICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJ3cml0ZV9yZXN1bHQocmVzdWx0LCBvcHJvdCwgJyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICInLCBzZXFpZCkiCisgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKworICAvLyBDbG9zZSBmdW5jdGlvbgorICBmX3NlcnZpY2VfLmluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGZvcm0gJ3R5cGUgbmFtZShhcmdzKScKKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KKyAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KKyAqLworc3RyaW5nIHRfcmJfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdHJpbmcgcHJlZml4KSB7CisgIC8vIFRPRE8obWNzbGVlKTogTml0cGlja3ksIG5vICcsJyBpZiBhcmd1bWVudF9saXN0IGlzIGVtcHR5CisgIHJldHVybiBwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiKCIgKyBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSkgKyAiKSI7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZpZWxkIGxpc3QKKyAqLworc3RyaW5nIHRfcmJfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ICs9ICIsICI7CisgICAgfQorICAgIHJlc3VsdCArPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RyaW5nIHRfcmJfZ2VuZXJhdG9yOjp0eXBlX25hbWUoY29uc3QgdF90eXBlKiB0dHlwZSkgeworICBzdHJpbmcgcHJlZml4ID0gIiI7CisKKyAgc3RyaW5nIG5hbWUgPSB0dHlwZS0+Z2V0X25hbWUoKTsKKyAgaWYgKHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKSB8fCB0dHlwZS0+aXNfZW51bSgpKSB7CisgICAgbmFtZSA9IGNhcGl0YWxpemUodHR5cGUtPmdldF9uYW1lKCkpOworICB9CisKKyAgcmV0dXJuIHByZWZpeCArIG5hbWU7Cit9CisKK3N0cmluZyB0X3JiX2dlbmVyYXRvcjo6ZnVsbF90eXBlX25hbWUoY29uc3QgdF90eXBlKiB0dHlwZSkgeworICBzdHJpbmcgcHJlZml4ID0gIjo6IjsKKyAgdmVjdG9yPHN0ZDo6c3RyaW5nPiBtb2R1bGVzID0gcnVieV9tb2R1bGVzKHR0eXBlLT5nZXRfcHJvZ3JhbSgpKTsKKyAgZm9yICh2ZWN0b3I8c3RkOjpzdHJpbmc+OjppdGVyYXRvciBtX2l0ZXIgPSBtb2R1bGVzLmJlZ2luKCk7IG1faXRlciAhPSBtb2R1bGVzLmVuZCgpOyArK21faXRlcikgeworICAgIHByZWZpeCArPSAqbV9pdGVyICsgIjo6IjsKKyAgfQorICByZXR1cm4gcHJlZml4ICsgdHlwZV9uYW1lKHR0eXBlKTsKK30KKworLyoqCisgKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhIFJ1YnkgdHlvZQorICovCitzdHJpbmcgdF9yYl9nZW5lcmF0b3I6OnR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gIjo6VGhyaWZ0OjpUeXBlczo6U1RSSU5HIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gIjo6VGhyaWZ0OjpUeXBlczo6Qk9PTCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiOjpUaHJpZnQ6OlR5cGVzOjpCWVRFIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAiOjpUaHJpZnQ6OlR5cGVzOjpJMTYiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmV0dXJuICI6OlRocmlmdDo6VHlwZXM6OkkzMiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIjo6VGhyaWZ0OjpUeXBlczo6STY0IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiOjpUaHJpZnQ6OlR5cGVzOjpET1VCTEUiOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gIjo6VGhyaWZ0OjpUeXBlczo6STMyIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICI6OlRocmlmdDo6VHlwZXM6OlNUUlVDVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gIjo6VGhyaWZ0OjpUeXBlczo6TUFQIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAiOjpUaHJpZnQ6OlR5cGVzOjpTRVQiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAiOjpUaHJpZnQ6OlR5cGVzOjpMSVNUIjsKKyAgfQorCisgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKworc3RyaW5nIHRfcmJfZ2VuZXJhdG9yOjpyYl9uYW1lc3BhY2VfdG9fcGF0aF9wcmVmaXgoc3RyaW5nIHJiX25hbWVzcGFjZSkgeworICBzdHJpbmcgbmFtZXNwYWNlc19sZWZ0ID0gcmJfbmFtZXNwYWNlOworICBzdHJpbmc6OnNpemVfdHlwZSBsb2M7CisKKyAgc3RyaW5nIHBhdGhfcHJlZml4ID0gIiI7CisKKyAgd2hpbGUgKChsb2MgPSBuYW1lc3BhY2VzX2xlZnQuZmluZCgiLiIpKSAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICBwYXRoX3ByZWZpeCA9IHBhdGhfcHJlZml4ICsgdW5kZXJzY29yZShuYW1lc3BhY2VzX2xlZnQuc3Vic3RyKDAsIGxvYykpICsgIi8iOworICAgIG5hbWVzcGFjZXNfbGVmdCA9IG5hbWVzcGFjZXNfbGVmdC5zdWJzdHIobG9jICsgMSk7CisgIH0KKyAgaWYgKG5hbWVzcGFjZXNfbGVmdC5zaXplKCkgPiAwKSB7CisgICAgcGF0aF9wcmVmaXggPSBwYXRoX3ByZWZpeCArIHVuZGVyc2NvcmUobmFtZXNwYWNlc19sZWZ0KSArICIvIjsKKyAgfQorICByZXR1cm4gcGF0aF9wcmVmaXg7Cit9CisKK3ZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3Jkb2ModF9yYl9vZnN0cmVhbSYgb3V0LCB0X2RvYyogdGRvYykgeworICBpZiAodGRvYy0+aGFzX2RvYygpKSB7CisgICAgb3V0LmluZGVudCgpOworICAgIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KG91dCwgIiIsICIjICIsIHRkb2MtPmdldF9kb2MoKSwgIiIpOworICB9Cit9CisKK3ZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3JiX3N0cnVjdF9yZXF1aXJlZF92YWxpZGF0b3IodF9yYl9vZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBvdXQuaW5kZW50KCkgPDwgImRlZiB2YWxpZGF0ZSIgPDwgZW5kbDsKKyAgb3V0LmluZGVudF91cCgpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfZmllbGQqIGZpZWxkID0gKCpmX2l0ZXIpOworICAgIGlmIChmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgIG91dC5pbmRlbnQoKSA8PCAicmFpc2UgOjpUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uLm5ldyg6OlRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb246OlVOS05PV04sICIKKyAgICAgICAgICAgICAgICAgICAgICAiJ1JlcXVpcmVkIGZpZWxkICIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiBpcyB1bnNldCEnKSI7CisgICAgICBpZiAoZmllbGQtPmdldF90eXBlKCktPmlzX2Jvb2woKSkgeworICAgICAgICBvdXQgPDwgIiBpZiBAIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiLm5pbD8iOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0IDw8ICIgdW5sZXNzIEAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpOworICAgICAgfQorICAgICAgb3V0IDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgLy8gaWYgZmllbGQgaXMgYW4gZW51bSwgY2hlY2sgdGhhdCBpdHMgdmFsdWUgaXMgdmFsaWQKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqZl9pdGVyKTsKKworICAgIGlmIChmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfZW51bSgpKSB7CisgICAgICBvdXQuaW5kZW50KCkgPDwgInVubGVzcyBAIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiLm5pbD8gfHwgIgorICAgICAgICAgICAgICAgICAgIDw8IGZ1bGxfdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpKSA8PCAiOjpWQUxJRF9WQUxVRVMuaW5jbHVkZT8oQCIKKyAgICAgICAgICAgICAgICAgICA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiKSIgPDwgZW5kbDsKKyAgICAgIG91dC5pbmRlbnRfdXAoKTsKKyAgICAgIG91dC5pbmRlbnQoKSA8PCAicmFpc2UgOjpUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uLm5ldyg6OlRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb246OlVOS05PV04sICIKKyAgICAgICAgICAgICAgICAgICAgICAiJ0ludmFsaWQgdmFsdWUgb2YgZmllbGQgIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiIScpIiA8PCBlbmRsOworICAgICAgb3V0LmluZGVudF9kb3duKCk7CisgICAgICBvdXQuaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBvdXQuaW5kZW50X2Rvd24oKTsKKyAgb3V0LmluZGVudCgpIDw8ICJlbmQiIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcmJfdW5pb25fdmFsaWRhdG9yKHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgb3V0LmluZGVudCgpIDw8ICJkZWYgdmFsaWRhdGUiIDw8IGVuZGw7CisgIG91dC5pbmRlbnRfdXAoKTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgb3V0LmluZGVudCgpCisgICAgICA8PCAicmFpc2UoU3RhbmRhcmRFcnJvciwgJ1VuaW9uIGZpZWxkcyBhcmUgbm90IHNldC4nKSBpZiBnZXRfc2V0X2ZpZWxkLm5pbD8gfHwgZ2V0X3ZhbHVlLm5pbD8iCisgICAgICA8PCBlbmRsOworCisgIC8vIGlmIGZpZWxkIGlzIGFuIGVudW0sIGNoZWNrIHRoYXQgaXRzIHZhbHVlIGlzIHZhbGlkCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgY29uc3QgdF9maWVsZCogZmllbGQgPSAoKmZfaXRlcik7CisKKyAgICBpZiAoZmllbGQtPmdldF90eXBlKCktPmlzX2VudW0oKSkgeworICAgICAgb3V0LmluZGVudCgpIDw8ICJpZiBnZXRfc2V0X2ZpZWxkID09IDoiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8IGVuZGw7CisgICAgICBvdXQuaW5kZW50KCkgPDwgIiAgcmFpc2UgIgorICAgICAgICAgICAgICAgICAgICAgICI6OlRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb24ubmV3KDo6VGhyaWZ0OjpQcm90b2NvbEV4Y2VwdGlvbjo6VU5LTk9XTiwgIgorICAgICAgICAgICAgICAgICAgICAgICInSW52YWxpZCB2YWx1ZSBvZiBmaWVsZCAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIhJykgdW5sZXNzICIKKyAgICAgICAgICAgICAgICAgICA8PCBmdWxsX3R5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSkgPDwgIjo6VkFMSURfVkFMVUVTLmluY2x1ZGU/KGdldF92YWx1ZSkiCisgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIG91dC5pbmRlbnQoKSA8PCAiZW5kIiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIG91dC5pbmRlbnRfZG93bigpOworICBvdXQuaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOworfQorCitUSFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKAorICAgIHJiLAorICAgICJSdWJ5IiwKKyAgICAiICAgIHJ1YnlnZW1zOiAgICAgICAgQWRkIGEgXCJyZXF1aXJlICdydWJ5Z2VtcydcIiBsaW5lIHRvIHRoZSB0b3Agb2YgZWFjaCBnZW5lcmF0ZWQgZmlsZS5cbiIKKyAgICAiICAgIG5hbWVzcGFjZWQ6ICAgICAgR2VuZXJhdGUgZmlsZXMgaW4gaWRpb21hdGljIG5hbWVzcGFjZWQgZGlyZWN0b3JpZXMuXG4iKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9yc19nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X3JzX2dlbmVyYXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODQzZDdhCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9yc19nZW5lcmF0b3IuY2MKQEAgLTAsMCArMSwzMzM5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKworI2luY2x1ZGUgInRocmlmdC9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvci5oIgorCit1c2luZyBzdGQ6Om1hcDsKK3VzaW5nIHN0ZDo6b2ZzdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6dmVjdG9yOwordXNpbmcgc3RkOjpzZXQ7CisKK3N0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCgiXG4iKTsgLy8gYXZvaWQgb3N0cmVhbSA8PCBzdGQ6OmVuZGwgZmx1c2hlcworc3RhdGljIGNvbnN0IHN0cmluZyBTRVJWSUNFX1JFU1VMVF9WQVJJQUJMRSgicmVzdWx0X3ZhbHVlIik7CitzdGF0aWMgY29uc3Qgc3RyaW5nIFJFU1VMVF9TVFJVQ1RfU1VGRklYKCJSZXN1bHQiKTsKK3N0YXRpYyBjb25zdCBzdHJpbmcgUlVTVF9SRVNFUlZFRF9XT1JEU1tdID0geworICAiYWJzdHJhY3QiLCAiYWxpZ25vZiIsICJhcyIsICJiZWNvbWUiLAorICAiYm94IiwgImJyZWFrIiwgImNvbnN0IiwgImNvbnRpbnVlIiwKKyAgImNyYXRlIiwgImRvIiwgImVsc2UiLCAiZW51bSIsCisgICJleHRlcm4iLCAiZmFsc2UiLCAiZmluYWwiLCAiZm4iLAorICAiZm9yIiwgImlmIiwgImltcGwiLCAiaW4iLAorICAibGV0IiwgImxvb3AiLCAibWFjcm8iLCAibWF0Y2giLAorICAibW9kIiwgIm1vdmUiLCAibXV0IiwgIm9mZnNldG9mIiwKKyAgIm92ZXJyaWRlIiwgInByaXYiLCAicHJvYyIsICJwdWIiLAorICAicHVyZSIsICJyZWYiLCAicmV0dXJuIiwgIlNlbGYiLAorICAic2VsZiIsICJzaXplb2YiLCAic3RhdGljIiwgInN0cnVjdCIsCisgICJzdXBlciIsICJ0cmFpdCIsICJ0cnVlIiwgInR5cGUiLAorICAidHlwZW9mIiwgInVuc2FmZSIsICJ1bnNpemVkIiwgInVzZSIsCisgICJ2aXJ0dWFsIiwgIndoZXJlIiwgIndoaWxlIiwgInlpZWxkIgorfTsKK2NvbnN0IHNldDxzdHJpbmc+IFJVU1RfUkVTRVJWRURfV09SRFNfU0VUKAorICBSVVNUX1JFU0VSVkVEX1dPUkRTLAorICBSVVNUX1JFU0VSVkVEX1dPUkRTICsgc2l6ZW9mKFJVU1RfUkVTRVJWRURfV09SRFMpL3NpemVvZihSVVNUX1JFU0VSVkVEX1dPUkRTWzBdKQorKTsKKworc3RhdGljIGNvbnN0IHN0cmluZyBTWU5DX0NMSUVOVF9HRU5FUklDX0JPVU5EX1ZBUlMoIjxJUCwgT1A+Iik7CitzdGF0aWMgY29uc3Qgc3RyaW5nIFNZTkNfQ0xJRU5UX0dFTkVSSUNfQk9VTkRTKCJ3aGVyZSBJUDogVElucHV0UHJvdG9jb2wsIE9QOiBUT3V0cHV0UHJvdG9jb2wiKTsKKworLy8gRklYTUU6IGV4dHJhY3QgY29tbW9uIFRNZXNzYWdlSWRlbnRpZmllciBmdW5jdGlvbgorLy8gRklYTUU6IGhhdmUgdG9fcnVzdF90eXBlIGRlYWwgd2l0aCBPcHRpb24KKworY2xhc3MgdF9yc19nZW5lcmF0b3IgOiBwdWJsaWMgdF9nZW5lcmF0b3IgeworcHVibGljOgorICB0X3JzX2dlbmVyYXRvcigKKyAgICB0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYsCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmCisgICkgOiB0X2dlbmVyYXRvcihwcm9ncmFtKSB7CisgICAgZ2VuX2Rpcl8gPSBnZXRfb3V0X2RpcigpOworICB9CisKKyAgLyoqCisgICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKKyAgICovCisKKyAgdm9pZCBpbml0X2dlbmVyYXRvcigpOworICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOworCisgIC8qKgorICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pOworICB2b2lkIGdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworCitwcml2YXRlOgorICAvLyBzdHJ1Y3QgdHlwZQorICAvLyBUX1JFR1VMQVI6IHVzZXItZGVmaW5lZCBzdHJ1Y3QgaW4gdGhlIElETAorICAvLyBUX0FSR1M6IHN0cnVjdCB1c2VkIHRvIGhvbGQgYWxsIHNlcnZpY2UtY2FsbCBwYXJhbWV0ZXJzCisgIC8vIFRfUkVTVUxUOiBzdHJ1Y3QgdXNlZCB0byBob2xkIGFsbCBzZXJ2aWNlLWNhbGwgcmV0dXJucyBhbmQgZXhjZXB0aW9ucworICAvLyBUX0VYQ0VQVElPTjogdXNlci1kZWZpbmVkIGV4Y2VwdGlvbiBpbiB0aGUgSURMCisgIGVudW0gZV9zdHJ1Y3RfdHlwZSB7IFRfUkVHVUxBUiwgVF9BUkdTLCBUX1JFU1VMVCwgVF9FWENFUFRJT04gfTsKKworICAvLyBEaXJlY3RvcnkgdG8gd2hpY2ggZ2VuZXJhdGVkIGNvZGUgaXMgd3JpdHRlbi4KKyAgc3RyaW5nIGdlbl9kaXJfOworCisgIC8vIEZpbGUgdG8gd2hpY2ggZ2VuZXJhdGVkIGNvZGUgaXMgd3JpdHRlbi4KKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2dlbl87CisKKyAgLy8gV3JpdGUgdGhlIGNvbW1vbiBjb21waWxlciBhdHRyaWJ1dGVzIGFuZCBtb2R1bGUgaW5jbHVkZXMgdG8gdGhlIHRvcCBvZiB0aGUgYXV0by1nZW5lcmF0ZWQgZmlsZS4KKyAgdm9pZCByZW5kZXJfYXR0cmlidXRlc19hbmRfaW5jbHVkZXMoKTsKKworICAvLyBDcmVhdGUgdGhlIGNsb3N1cmUgb2YgUnVzdCBtb2R1bGVzIHJlZmVyZW5jZWQgYnkgdGhpcyBzZXJ2aWNlLgorICB2b2lkIGNvbXB1dGVfc2VydmljZV9yZWZlcmVuY2VkX21vZHVsZXModF9zZXJ2aWNlICp0c2VydmljZSwgc2V0PHN0cmluZz4gJnJlZmVyZW5jZWRfbW9kdWxlcyk7CisKKyAgLy8gV3JpdGUgdGhlIHJ1c3QgcmVwcmVzZW50YXRpb24gb2YgYW4gZW51bS4KKyAgdm9pZCByZW5kZXJfZW51bV9kZWZpbml0aW9uKHRfZW51bSogdGVudW0sIGNvbnN0IHN0cmluZyYgZW51bV9uYW1lKTsKKworICAvLyBXcml0ZSB0aGUgaW1wbCBibG9ja3MgYXNzb2NpYXRlZCB3aXRoIHRoZSB0cmFpdHMgbmVjZXNzYXJ5IHRvIGNvbnZlcnQgYW4gZW51bSB0by9mcm9tIGFuIGkzMi4KKyAgdm9pZCByZW5kZXJfZW51bV9jb252ZXJzaW9uKHRfZW51bSogdGVudW0sIGNvbnN0IHN0cmluZyYgZW51bV9uYW1lKTsKKworICAvLyBXcml0ZSB0aGUgaW1wbCBibG9jayBhc3NvY2lhdGVkIHdpdGggdGhlIHJ1c3QgcmVwcmVzZW50YXRpb24gb2YgYW4gZW51bS4gVGhpcyBpbmNsdWRlcyBtZXRob2RzCisgIC8vIHRvIHdyaXRlIHRoZSBlbnVtIHRvIGEgcHJvdG9jb2wsIHJlYWQgaXQgZnJvbSBhIHByb3RvY29sLCBldGMuCisgIHZvaWQgcmVuZGVyX2VudW1faW1wbChjb25zdCBzdHJpbmcmIGVudW1fbmFtZSk7CisKKyAgLy8gV3JpdGUgYSBzaW1wbGUgcnVzdCBjb25zdCB2YWx1ZSAoaWUuIGBwdWIgY29uc3QgRk9POiBmb28uLi5gKS4KKyAgdm9pZCByZW5kZXJfY29uc3RfdmFsdWUoY29uc3Qgc3RyaW5nJiBuYW1lLCB0X3R5cGUqIHR0eXBlLCB0X2NvbnN0X3ZhbHVlKiB0dmFsdWUpOworCisgIC8vIFdyaXRlIGEgY29uc3RhbnQgbGlzdCwgc2V0LCBtYXAgb3Igc3RydWN0LiBUaGVzZSBjb25zdGFudHMgcmVxdWlyZSBhbGxvY2F0aW9uIGFuZCBjYW5ub3QgYmUgZGVmaW5lZAorICAvLyB1c2luZyBhICdwdWIgY29uc3QnLiBBcyBhIHJlc3VsdCwgSSBjcmVhdGUgYSBob2xkZXIgc3RydWN0IHdpdGggYSBzaW5nbGUgYGNvbnN0X3ZhbHVlYCBtZXRob2QgdGhhdAorICAvLyByZXR1cm5zIHRoZSBpbml0aWFsaXplZCBpbnN0YW5jZS4KKyAgdm9pZCByZW5kZXJfY29uc3RfdmFsdWVfaG9sZGVyKGNvbnN0IHN0cmluZyYgbmFtZSwgdF90eXBlKiB0dHlwZSwgdF9jb25zdF92YWx1ZSogdHZhbHVlKTsKKworICAvLyBXcml0ZSB0aGUgYWN0dWFsIGNvbnN0IHZhbHVlIC0gdGhlIHJpZ2h0IHNpZGUgb2YgYSBjb25zdCBkZWZpbml0aW9uLgorICB2b2lkIHJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR0eXBlLCB0X2NvbnN0X3ZhbHVlKiB0dmFsdWUsIGJvb2wgaXNfb3duZWQgPSB0cnVlKTsKKworICAvLyBXcml0ZSBhIGNvbnN0IHN0cnVjdCAocmV0dXJuZWQgZnJvbSBgY29uc3RfdmFsdWVgIG1ldGhvZCkuCisgIHZvaWQgcmVuZGVyX2NvbnN0X3N0cnVjdCh0X3R5cGUqIHR0eXBlLCB0X2NvbnN0X3ZhbHVlKiB0dmFsdWUpOworCisgIC8vIFdyaXRlIGEgY29uc3QgbGlzdCAocmV0dXJuZWQgZnJvbSBgY29uc3RfdmFsdWVgIG1ldGhvZCkuCisgIHZvaWQgcmVuZGVyX2NvbnN0X2xpc3QodF90eXBlKiB0dHlwZSwgdF9jb25zdF92YWx1ZSogdHZhbHVlKTsKKworICAvLyBXcml0ZSBhIGNvbnN0IHNldCAocmV0dXJuZWQgZnJvbSBgY29uc3RfdmFsdWVgIG1ldGhvZCkuCisgIHZvaWQgcmVuZGVyX2NvbnN0X3NldCh0X3R5cGUqIHR0eXBlLCB0X2NvbnN0X3ZhbHVlKiB0dmFsdWUpOworCisgIC8vIFdyaXRlIGEgY29uc3QgbWFwIChyZXR1cm5lZCBmcm9tIGBjb25zdF92YWx1ZWAgbWV0aG9kKS4KKyAgdm9pZCByZW5kZXJfY29uc3RfbWFwKHRfdHlwZSogdHR5cGUsIHRfY29uc3RfdmFsdWUqIHR2YWx1ZSk7CisKKyAgLy8gV3JpdGUgdGhlIGNvZGUgdG8gaW5zZXJ0IGNvbnN0YW50IHZhbHVlcyBpbnRvIGEgcnVzdCB2ZWMgb3Igc2V0LiBUaGUKKyAgLy8gYGluc2VydF9mdW5jdGlvbmAgaXMgdGhlIHJ1c3QgZnVuY3Rpb24gdGhhdCB3ZSdsbCB1c2UgdG8gaW5zZXJ0IHRoZSBlbGVtZW50cy4KKyAgdm9pZCByZW5kZXJfY29udGFpbmVyX2NvbnN0X3ZhbHVlKAorICAgIGNvbnN0IHN0cmluZyYgaW5zZXJ0X2Z1bmN0aW9uLAorICAgIHRfdHlwZSogdHR5cGUsCisgICAgdF9jb25zdF92YWx1ZSogdHZhbHVlCisgICk7CisKKyAgLy8gV3JpdGUgdGhlIHJ1c3QgcmVwcmVzZW50YXRpb24gb2YgYSB0aHJpZnQgc3RydWN0IHRvIHRoZSBnZW5lcmF0ZWQgZmlsZS4gU2V0IGBzdHJ1Y3RfdHlwZWAgdG8gYFRfQVJHU2AKKyAgLy8gaWYgcmVuZGVyaW5nIHRoZSBzdHJ1Y3QgdXNlZCB0byBwYWNrIGFyZ3VtZW50cyBmb3IgYSBzZXJ2aWNlIGNhbGwuIFdoZW4gYHN0cnVjdF90eXBlYCBpcyBgVF9BUkdTYCB0aGUKKyAgLy8gc3RydWN0IGFuZCBpdHMgbWVtYmVycyBoYXZlIG1vZHVsZSB2aXNpYmlsaXR5LCBhbmQgYWxsIGZpZWxkcyBhcmUgcmVxdWlyZWQuIFdoZW4gYHN0cnVjdF90eXBlYCBpcworICAvLyBhbnl0aGluZyBlbHNlIHRoZSBzdHJ1Y3QgYW5kIGl0cyBtZW1iZXJzIGhhdmUgcHVibGljIHZpc2liaWxpdHkgYW5kIGZpZWxkcyBoYXZlIHRoZSB2aXNpYmlsaXR5IHNldAorICAvLyBpbiB0aGVpciBkZWZpbml0aW9uLgorICB2b2lkIHJlbmRlcl9zdHJ1Y3QoY29uc3Qgc3RyaW5nJiBzdHJ1Y3RfbmFtZSwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHRfcnNfZ2VuZXJhdG9yOjplX3N0cnVjdF90eXBlIHN0cnVjdF90eXBlKTsKKworICAvLyBXcml0ZSB0aGUgY29tbWVudCBibG9jayBwcmVjZWRpbmcgYSB0eXBlIGRlZmluaXRpb24gKGFuZCBpbXBsZW1lbnRhdGlvbikuCisgIHZvaWQgcmVuZGVyX3R5cGVfY29tbWVudChjb25zdCBzdHJpbmcmIHN0cnVjdF9uYW1lKTsKKworICAvLyBXcml0ZSB0aGUgcnVzdCByZXByZXNlbnRhdGlvbiBvZiBhIHRocmlmdCBzdHJ1Y3QuIFN1cHBvcnRzIGFyZ3VtZW50IHN0cnVjdHMsIHJlc3VsdCBzdHJ1Y3RzLAorICAvLyB1c2VyLWRlZmluZWQgc3RydWN0cyBhbmQgZXhjZXB0aW9uIHN0cnVjdHMuIFRoZSBleGFjdCBzdHJ1Y3QgdHlwZSB0byBiZSBnZW5lcmF0ZWQgaXMgY29udHJvbGxlZAorICAvLyBieSB0aGUgYHN0cnVjdF90eXBlYCBwYXJhbWV0ZXIsIHdoaWNoIChhbW9uZyBvdGhlciB0aGluZ3MpIG1vZGlmaWVzIHRoZSB2aXNpYmlsaXR5IG9mIHRoZQorICAvLyB3cml0dGVuIHN0cnVjdCBhbmQgbWVtYmVycywgY29udHJvbHMgd2hpY2ggdHJhaXQgaW1wbGVtZW50YXRpb25zIGFyZSBnZW5lcmF0ZWQuCisgIHZvaWQgcmVuZGVyX3N0cnVjdF9kZWZpbml0aW9uKAorICAgIGNvbnN0IHN0cmluZyYgc3RydWN0X25hbWUsCisgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgdF9yc19nZW5lcmF0b3I6OmVfc3RydWN0X3R5cGUgc3RydWN0X3R5cGUKKyAgKTsKKworICAvLyBXcml0ZXMgdGhlIGltcGwgYmxvY2sgYXNzb2NpYXRlZCB3aXRoIHRoZSBydXN0IHJlcHJlc2VudGF0aW9uIG9mIGEgc3RydWN0LiBBdCBtaW5pbXVtIHRoaXMKKyAgLy8gY29udGFpbnMgdGhlIG1ldGhvZHMgdG8gcmVhZCBmcm9tIGEgcHJvdG9jb2wgYW5kIHdyaXRlIHRvIGEgcHJvdG9jb2wuIEFkZGl0aW9uYWwgbWV0aG9kcyBtYXkKKyAgLy8gYmUgZ2VuZXJhdGVkIGRlcGVuZGluZyBvbiBgc3RydWN0X3R5cGVgLgorICB2b2lkIHJlbmRlcl9zdHJ1Y3RfaW1wbCgKKyAgICBjb25zdCBzdHJpbmcmIHN0cnVjdF9uYW1lLAorICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgIHRfcnNfZ2VuZXJhdG9yOjplX3N0cnVjdF90eXBlIHN0cnVjdF90eXBlCisgICk7CisKKyAgLy8gR2VuZXJhdGUgYSBgZm4gbmV3KC4uLilgIGZvciBhIHN0cnVjdCB3aXRoIG5hbWUgYHN0cnVjdF9uYW1lYCBhbmQgdHlwZSBgdF9zdHJ1Y3RgLiBUaGUgYXV0by1nZW5lcmF0ZWQKKyAgLy8gY29kZSBtYXkgaW5jbHVkZSBnZW5lcmljIHR5cGUgcGFyYW1ldGVycyB0byBtYWtlIHRoZSBjb25zdHJ1Y3RvciBtb3JlIGVyZ29ub21pYy4gYHN0cnVjdF90eXBlYCBjb250cm9scworICAvLyB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgZ2VuZXJhdGVkIGNvbnN0cnVjdG9yLgorICB2b2lkIHJlbmRlcl9zdHJ1Y3RfY29uc3RydWN0b3IoCisgICAgY29uc3Qgc3RyaW5nJiBzdHJ1Y3RfbmFtZSwKKyAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICB0X3JzX2dlbmVyYXRvcjo6ZV9zdHJ1Y3RfdHlwZSBzdHJ1Y3RfdHlwZQorICApOworCisgIC8vIFdyaXRlIHRoZSBgb2tfb3JgIG1ldGhvZCBhZGRlZCB0byBhbGwgVGhyaWZ0IHNlcnZpY2UgY2FsbCByZXN1bHQgc3RydWN0cy4gWW91IGNhbiB1c2UgdGhpcyBtZXRob2QKKyAgLy8gdG8gY29udmVydCBhIHN0cnVjdCBpbnRvIGEgYFJlc3VsdGAgYW5kIHVzZSBpdCBpbiBhIGB0cnkhYCBvciBjb21iaW5hdG9yIGNoYWluLgorICB2b2lkIHJlbmRlcl9yZXN1bHRfc3RydWN0X3RvX3Jlc3VsdF9tZXRob2QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIC8vIFdyaXRlIHRoZSBpbXBsZW1lbnRhdGlvbnMgZm9yIHRoZSBgRXJyb3JgIGFuZCBgRGVidWdgIHRyYWl0cy4gVGhlc2UgdHJhaXRzIGFyZSBuZWNlc3NhcnkgZm9yIGEKKyAgLy8gdXNlci1kZWZpbmVkIGV4Y2VwdGlvbiB0byBiZSBwcm9wZXJseSBoYW5kbGVkIGFzIFJ1c3QgZXJyb3JzLgorICB2b2lkIHJlbmRlcl9leGNlcHRpb25fc3RydWN0X2Vycm9yX3RyYWl0X2ltcGxzKGNvbnN0IHN0cmluZyYgc3RydWN0X25hbWUsIHRfc3RydWN0KiB0c3RydWN0KTsKKworICAvLyBXcml0ZSB0aGUgaW1wbGVtZW50YXRpb25zIGZvciB0aGUgYERlZmF1bHRgLiBUaGlzIHRyYWl0IGFsbG93cyB5b3UgdG8gc3BlY2lmeSBvbmx5IHRoZSBmaWVsZHMgeW91IHdhbnQKKyAgLy8gYW5kIHVzZSBgLi5EZWZhdWx0OjpkZWZhdWx0KClgIHRvIGZpbGwgaW4gdGhlIHJlc3QuCisgIHZvaWQgcmVuZGVyX3N0cnVjdF9kZWZhdWx0X3RyYWl0X2ltcGwoY29uc3Qgc3RyaW5nJiBzdHJ1Y3RfbmFtZSwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIC8vIFdyaXRlIHRoZSBmdW5jdGlvbiB0aGF0IHNlcmlhbGl6ZXMgYSBzdHJ1Y3QgdG8gaXRzIHdpcmUgcmVwcmVzZW50YXRpb24uIElmIGBzdHJ1Y3RfdHlwZWAgaXMgYFRfQVJHU2AKKyAgLy8gdGhlbiBhbGwgZmllbGRzIGFyZSBjb25zaWRlcmVkICJyZXF1aXJlZCIsIGlmIG5vdCwgdGhlIGRlZmF1bHQgb3B0aW9uYWxpdHkgaXMgdXNlZC4KKyAgdm9pZCByZW5kZXJfc3RydWN0X3N5bmNfd3JpdGUodF9zdHJ1Y3QgKnRzdHJ1Y3QsIHRfcnNfZ2VuZXJhdG9yOjplX3N0cnVjdF90eXBlIHN0cnVjdF90eXBlKTsKKworICAvLyBIZWxwZXIgZnVuY3Rpb24gdGhhdCBzZXJpYWxpemVzIGEgc2luZ2xlIHN0cnVjdCBmaWVsZCB0byBpdHMgd2lyZSByZXByZXNlbnRhdGlvbi4gVW5wYWNrcyB0aGUKKyAgLy8gdmFyaWFibGUgKHNpbmNlIGl0IG1heSBiZSBvcHRpb25hbCkgYW5kIHNlcmlhbGl6ZXMgYWNjb3JkaW5nIHRvIHRoZSBvcHRpb25hbGl0eSBydWxlcyByZXF1aXJlZCBieSBgcmVxYC4KKyAgLy8gVmFyaWFibGVzIGluIGF1dG8tZ2VuZXJhdGVkIGNvZGUgYXJlIHBhc3NlZCBieSByZWZlcmVuY2UuIFNpbmNlIHRoaXMgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCBpbgorICAvLyBjb250ZXh0cyB3aGVyZSB0aGUgdmFyaWFibGUgaXMgKmFscmVhZHkqIGEgcmVmZXJlbmNlIHlvdSBjYW4gc2V0IGBmaWVsZF92YXJfaXNfcmVmYCB0byBgdHJ1ZWAgdG8gYXZvaWQKKyAgLy8gZ2VuZXJhdGluZyBhbiBleHRyYSwgdW5uZWNlc3NhcnkgYCZgIHRoYXQgdGhlIGNvbXBpbGVyIHdpbGwgaGF2ZSB0byBhdXRvbWF0aWNhbGx5IGRlcmVmZXJlbmNlLgorICB2b2lkIHJlbmRlcl9zdHJ1Y3RfZmllbGRfc3luY193cml0ZSgKKyAgICBjb25zdCBzdHJpbmcgJmZpZWxkX3ZhciwKKyAgICBib29sIGZpZWxkX3Zhcl9pc19yZWYsCisgICAgdF9maWVsZCAqdGZpZWxkLAorICAgIHRfZmllbGQ6OmVfcmVxIHJlcSk7CisKKyAgLy8gV3JpdGUgdGhlIHJ1c3QgZnVuY3Rpb24gdGhhdCBzZXJpYWxpemVzIGEgc2luZ2xlIHR5cGUgKGkuZS4gYSBpMzIgZXRjLikgdG8gaXRzIHdpcmUgcmVwcmVzZW50YXRpb24uCisgIC8vIFZhcmlhYmxlcyBpbiBhdXRvLWdlbmVyYXRlZCBjb2RlIGFyZSBwYXNzZWQgYnkgcmVmZXJlbmNlLiBTaW5jZSB0aGlzIGZ1bmN0aW9uIG1heSBiZSBjYWxsZWQgaW4KKyAgLy8gY29udGV4dHMgd2hlcmUgdGhlIHZhcmlhYmxlIGlzICphbHJlYWR5KiBhIHJlZmVyZW5jZSB5b3UgY2FuIHNldCBgdHlwZV92YXJfaXNfcmVmYCB0byBgdHJ1ZWAgdG8gYXZvaWQKKyAgLy8gZ2VuZXJhdGluZyBhbiBleHRyYSwgdW5uZWNlc3NhcnkgYCZgIHRoYXQgdGhlIGNvbXBpbGVyIHdpbGwgaGF2ZSB0byBhdXRvbWF0aWNhbGx5IGRlcmVmZXJlbmNlLgorICB2b2lkIHJlbmRlcl90eXBlX3N5bmNfd3JpdGUoY29uc3Qgc3RyaW5nICZ0eXBlX3ZhciwgYm9vbCB0eXBlX3Zhcl9pc19yZWYsIHRfdHlwZSAqdHR5cGUpOworCisgIC8vIFdyaXRlIGEgbGlzdCB0byB0aGUgb3V0cHV0IHByb3RvY29sLiBgbGlzdF92YXJpYWJsZWAgaXMgdGhlIHZhcmlhYmxlIGNvbnRhaW5pbmcgdGhlIGxpc3QKKyAgLy8gdGhhdCB3aWxsIGJlIHdyaXR0ZW4gdG8gdGhlIG91dHB1dCBwcm90b2NvbC4KKyAgLy8gVmFyaWFibGVzIGluIGF1dG8tZ2VuZXJhdGVkIGNvZGUgYXJlIHBhc3NlZCBieSByZWZlcmVuY2UuIFNpbmNlIHRoaXMgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCBpbgorICAvLyBjb250ZXh0cyB3aGVyZSB0aGUgdmFyaWFibGUgaXMgKmFscmVhZHkqIGEgcmVmZXJlbmNlIHlvdSBjYW4gc2V0IGBsaXN0X3Zhcl9pc19yZWZgIHRvIGB0cnVlYCB0byBhdm9pZAorICAvLyBnZW5lcmF0aW5nIGFuIGV4dHJhLCB1bm5lY2Vzc2FyeSBgJmAgdGhhdCB0aGUgY29tcGlsZXIgd2lsbCBoYXZlIHRvIGF1dG9tYXRpY2FsbHkgZGVyZWZlcmVuY2UuCisgIHZvaWQgcmVuZGVyX2xpc3Rfc3luY193cml0ZShjb25zdCBzdHJpbmcgJmxpc3RfdmFyLCBib29sIGxpc3RfdmFyX2lzX3JlZiwgdF9saXN0ICp0bGlzdCk7CisKKyAgLy8gV3JpdGUgYSBzZXQgdG8gdGhlIG91dHB1dCBwcm90b2NvbC4gYHNldF92YXJpYWJsZWAgaXMgdGhlIHZhcmlhYmxlIGNvbnRhaW5pbmcgdGhlIHNldCB0aGF0IHdpbGwKKyAgLy8gYmUgd3JpdHRlbiB0byB0aGUgb3V0cHV0IHByb3RvY29sLgorICAvLyBWYXJpYWJsZXMgaW4gYXV0by1nZW5lcmF0ZWQgY29kZSBhcmUgcGFzc2VkIGJ5IHJlZmVyZW5jZS4gU2luY2UgdGhpcyBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIGluCisgIC8vIGNvbnRleHRzIHdoZXJlIHRoZSB2YXJpYWJsZSBpcyAqYWxyZWFkeSogYSByZWZlcmVuY2UgeW91IGNhbiBzZXQgYHNldF92YXJfaXNfcmVmYCB0byBgdHJ1ZWAgdG8gYXZvaWQKKyAgLy8gZ2VuZXJhdGluZyBhbiBleHRyYSwgdW5uZWNlc3NhcnkgYCZgIHRoYXQgdGhlIGNvbXBpbGVyIHdpbGwgaGF2ZSB0byBhdXRvbWF0aWNhbGx5IGRlcmVmZXJlbmNlLgorICB2b2lkIHJlbmRlcl9zZXRfc3luY193cml0ZShjb25zdCBzdHJpbmcgJnNldF92YXIsIGJvb2wgc2V0X3Zhcl9pc19yZWYsIHRfc2V0ICp0c2V0KTsKKworICAvLyBXcml0ZSBhIG1hcCB0byB0aGUgb3V0cHV0IHByb3RvY29sLiBgbWFwX3ZhcmlhYmxlYCBpcyB0aGUgdmFyaWFibGUgY29udGFpbmluZyB0aGUgbWFwIHRoYXQgd2lsbAorICAvLyBiZSB3cml0dGVuIHRvIHRoZSBvdXRwdXQgcHJvdG9jb2wuCisgIC8vIFZhcmlhYmxlcyBpbiBhdXRvLWdlbmVyYXRlZCBjb2RlIGFyZSBwYXNzZWQgYnkgcmVmZXJlbmNlLiBTaW5jZSB0aGlzIGZ1bmN0aW9uIG1heSBiZSBjYWxsZWQgaW4KKyAgLy8gY29udGV4dHMgd2hlcmUgdGhlIHZhcmlhYmxlIGlzICphbHJlYWR5KiBhIHJlZmVyZW5jZSB5b3UgY2FuIHNldCBgbWFwX3Zhcl9pc19yZWZgIHRvIGB0cnVlYCB0byBhdm9pZAorICAvLyBnZW5lcmF0aW5nIGFuIGV4dHJhLCB1bm5lY2Vzc2FyeSBgJmAgdGhhdCB0aGUgY29tcGlsZXIgd2lsbCBoYXZlIHRvIGF1dG9tYXRpY2FsbHkgZGVyZWZlcmVuY2UuCisgIHZvaWQgcmVuZGVyX21hcF9zeW5jX3dyaXRlKGNvbnN0IHN0cmluZyAmbWFwX3ZhciwgYm9vbCBtYXBfdmFyX2lzX3JlZiwgdF9tYXAgKnRzZXQpOworCisgIC8vIFJldHVybiBgdHJ1ZWAgaWYgd2UgbmVlZCB0byBkZXJlZmVyZW5jZSB0aHMgdHlwZSB3aGVuIHdyaXRpbmcgYW4gZWxlbWVudCBmcm9tIGEgY29udGFpbmVyLgorICAvLyBJdGVyYXRpb25zIG9uIHJ1c3QgY29udGFpbmVycyBhcmUgcGVyZm9ybWVkIGFzIGZvbGxvd3M6IGBmb3IgdiBpbiAmdmFsdWVzIHsgLi4uIH1gCisgIC8vIHdoZXJlIGB2YCBoYXMgdHlwZSBgJlJVU1RfVFlQRWAgQWxsIGRlZmluZWQgZnVuY3Rpb25zIHRha2UgcHJpbWl0aXZlcyBieSB2YWx1ZSwgc28sIGlmIHRoZQorICAvLyByZW5kZXJlZCBjb2RlIGlzIGNhbGxpbmcgc3VjaCBhIGZ1bmN0aW9uIGl0IGhhcyB0byBkZXJlZmVyZW5jZSBgdmAuCisgIGJvb2wgbmVlZHNfZGVyZWZfb25fY29udGFpbmVyX3dyaXRlKHRfdHlwZSogdHR5cGUpOworCisgIC8vIFJldHVybiB0aGUgdmFyaWFibGUgKGluY2x1ZGluZyBhbGwgZGVyZWZlcmVuY2VzKSByZXF1aXJlZCB0byB3cml0ZSB2YWx1ZXMgZnJvbSBhIHJ1c3QgY29udGFpbmVyCisgIC8vIHRvIHRoZSBvdXRwdXQgcHJvdG9jb2wuIEZvciBleGFtcGxlLCBpZiB5b3Ugd2VyZSBpdGVyYXRpbmcgdGhyb3VnaCBhIGNvbnRhaW5lciBhbmQgdXNpbmcgdGhlIHRlbXAKKyAgLy8gdmFyaWFibGUgYHZgIHRvIHJlcHJlc2VudCBlYWNoIGVsZW1lbnQsIHRoZW4gYHR0eXBlYCBpcyB0aGUgdHlwZSBzdG9yZWQgaW4gdGhlIGNvbnRhaW5lciBhbmQKKyAgLy8gYGJhc2VfdmFyYCBpcyAidiIuIFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIGFjdHVhbCBzdHJpbmcgeW91IHdpbGwgaGF2ZSB0byB1c2UgdG8gcHJvcGVybHkgcmVmZXJlbmNlCisgIC8vIHRoZSB0ZW1wIHZhcmlhYmxlIGZvciB3cml0aW5nIHRvIHRoZSBvdXRwdXQgcHJvdG9jb2wuCisgIHN0cmluZyBzdHJpbmdfY29udGFpbmVyX3dyaXRlX3ZhcmlhYmxlKHRfdHlwZSogdHR5cGUsIGNvbnN0IHN0cmluZyYgYmFzZV92YXIpOworCisgIC8vIFdyaXRlIHRoZSBjb2RlIHRvIHJlYWQgYnl0ZXMgZnJvbSB0aGUgd2lyZSBpbnRvIHRoZSBnaXZlbiBgdF9zdHJ1Y3RgLiBgc3RydWN0X25hbWVgIGlzIHRoZQorICAvLyBhY3R1YWwgUnVzdCBuYW1lIG9mIHRoZSBgdF9zdHJ1Y3RgLiBJZiBgc3RydWN0X3R5cGVgIGlzIGBUX0FSR1NgIHRoZW4gYWxsIHN0cnVjdCBmaWVsZHMgYXJlCisgIC8vIG5lY2Vzc2FyeS4gT3RoZXJ3aXNlLCB0aGUgZmllbGQncyBkZWZhdWx0IG9wdGlvbmFsaXR5IGlzIHVzZWQuCisgIHZvaWQgcmVuZGVyX3N0cnVjdF9zeW5jX3JlYWQoY29uc3Qgc3RyaW5nICZzdHJ1Y3RfbmFtZSwgdF9zdHJ1Y3QgKnRzdHJ1Y3QsIHRfcnNfZ2VuZXJhdG9yOjplX3N0cnVjdF90eXBlIHN0cnVjdF90eXBlKTsKKworICAvLyBXcml0ZSB0aGUgcnVzdCBmdW5jdGlvbiB0aGF0IGRlc2VyaWFsaXplcyBhIHNpbmdsZSB0eXBlIChpLmUuIGkzMiBldGMuKSBmcm9tIGl0cyB3aXJlIHJlcHJlc2VudGF0aW9uLgorICAvLyBTZXQgYGlzX2JveGVkYCB0byBgdHJ1ZWAgaWYgdGhlIHJlc3VsdGluZyB2YWx1ZSBzaG91bGQgYmUgd3JhcHBlZCBpbiBhIGBCb3g6Om5ldyguLi4pYC4KKyAgdm9pZCByZW5kZXJfdHlwZV9zeW5jX3JlYWQoY29uc3Qgc3RyaW5nICZ0eXBlX3ZhciwgdF90eXBlICp0dHlwZSwgYm9vbCBpc19ib3hlZCA9IGZhbHNlKTsKKworICAvLyBSZWFkIHRoZSB3aXJlIHJlcHJlc2VudGF0aW9uIG9mIGEgbGlzdCBhbmQgY29udmVydCBpdCB0byBpdHMgY29ycmVzcG9uZGluZyBydXN0IGltcGxlbWVudGF0aW9uLgorICAvLyBUaGUgZGVzZXJpYWxpemVkIGxpc3QgaXMgc3RvcmVkIGluIGBsaXN0X3ZhcmlhYmxlYC4KKyAgdm9pZCByZW5kZXJfbGlzdF9zeW5jX3JlYWQodF9saXN0ICp0bGlzdCwgY29uc3Qgc3RyaW5nICZsaXN0X3ZhcmlhYmxlKTsKKworICAvLyBSZWFkIHRoZSB3aXJlIHJlcHJlc2VudGF0aW9uIG9mIGEgc2V0IGFuZCBjb252ZXJ0IGl0IHRvIGl0cyBjb3JyZXNwb25kaW5nIHJ1c3QgaW1wbGVtZW50YXRpb24uCisgIC8vIFRoZSBkZXNlcmlhbGl6ZWQgc2V0IGlzIHN0b3JlZCBpbiBgc2V0X3ZhcmlhYmxlYC4KKyAgdm9pZCByZW5kZXJfc2V0X3N5bmNfcmVhZCh0X3NldCAqdHNldCwgY29uc3Qgc3RyaW5nICZzZXRfdmFyaWFibGUpOworCisgIC8vIFJlYWQgdGhlIHdpcmUgcmVwcmVzZW50YXRpb24gb2YgYSBtYXAgYW5kIGNvbnZlcnQgaXQgdG8gaXRzIGNvcnJlc3BvbmRpbmcgcnVzdCBpbXBsZW1lbnRhdGlvbi4KKyAgLy8gVGhlIGRlc2VyaWFsaXplZCBtYXAgaXMgc3RvcmVkIGluIGBtYXBfdmFyaWFibGVgLgorICB2b2lkIHJlbmRlcl9tYXBfc3luY19yZWFkKHRfbWFwICp0bWFwLCBjb25zdCBzdHJpbmcgJm1hcF92YXJpYWJsZSk7CisKKyAgLy8gUmV0dXJuIGEgdGVtcG9yYXJ5IHZhcmlhYmxlIHVzZWQgdG8gc3RvcmUgdmFsdWVzIHdoZW4gZGVzZXJpYWxpemluZyBuZXN0ZWQgY29udGFpbmVycy4KKyAgc3RyaW5nIHN0cnVjdF9maWVsZF9yZWFkX3RlbXBfdmFyaWFibGUodF9maWVsZCogdGZpZWxkKTsKKworICAvLyBUb3AtbGV2ZWwgZnVuY3Rpb24gdGhhdCBjYWxscyB0aGUgdmFyaW91cyByZW5kZXIgZnVuY3Rpb25zIG5lY2Vzc2FyeSB0byB3cml0ZSB0aGUgcnVzdCByZXByZXNlbnRhdGlvbgorICAvLyBvZiBhIHRocmlmdCB1bmlvbiAoaS5lLiBhbiBlbnVtKS4KKyAgdm9pZCByZW5kZXJfdW5pb24odF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIC8vIFdyaXRlIHRoZSBlbnVtIGNvcnJlc3BvbmRpbmcgdG8gdGhlIFRocmlmdCB1bmlvbi4KKyAgdm9pZCByZW5kZXJfdW5pb25fZGVmaW5pdGlvbihjb25zdCBzdHJpbmcmIHVuaW9uX25hbWUsIHRfc3RydWN0KiB0c3RydWN0KTsKKworICAvLyBXcml0ZSB0aGUgZW51bSBpbXBsICh3aXRoIHJlYWQvd3JpdGUgZnVuY3Rpb25zKSBmb3IgdGhlIFRocmlmdCB1bmlvbi4KKyAgdm9pZCByZW5kZXJfdW5pb25faW1wbChjb25zdCBzdHJpbmcmIHVuaW9uX25hbWUsIHRfc3RydWN0KiB0c3RydWN0KTsKKworICAvLyBXcml0ZSB0aGUgYEVOVU06OndyaXRlX3RvX291dF9wcm90b2NvbGAgZnVuY3Rpb24uCisgIHZvaWQgcmVuZGVyX3VuaW9uX3N5bmNfd3JpdGUoY29uc3Qgc3RyaW5nICZ1bmlvbl9uYW1lLCB0X3N0cnVjdCAqdHN0cnVjdCk7CisKKyAgLy8gV3JpdGUgdGhlIGBFTlVNOjpyZWFkX2Zyb21faW5fcHJvdG9jb2xgIGZ1bmN0aW9uLgorICB2b2lkIHJlbmRlcl91bmlvbl9zeW5jX3JlYWQoY29uc3Qgc3RyaW5nICZ1bmlvbl9uYW1lLCB0X3N0cnVjdCAqdHN0cnVjdCk7CisKKyAgLy8gVG9wLWxldmVsIGZ1bmN0aW9uIHRoYXQgY2FsbHMgdGhlIHZhcmlvdXMgcmVuZGVyIGZ1bmN0aW9ucyBuZWNlc3NhcnkgdG8gd3JpdGUgdGhlIHJ1c3QgcmVwcmVzZW50YXRpb24KKyAgLy8gb2YgYSBUaHJpZnQgY2xpZW50LgorICB2b2lkIHJlbmRlcl9zeW5jX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworICAvLyBXcml0ZSB0aGUgdHJhaXQgd2l0aCB0aGUgc2VydmljZS1jYWxsIG1ldGhvZHMgZm9yIGB0c2VydmljZWAuCisgIHZvaWQgcmVuZGVyX3N5bmNfY2xpZW50X3RyYWl0KHRfc2VydmljZSAqdHNlcnZpY2UpOworCisgIC8vIFdyaXRlIHRoZSB0cmFpdCB0byBiZSBpbXBsZW1lbnRlZCBieSB0aGUgY2xpZW50IGltcGwgaWYgZW5kIHVzZXJzIGNhbiB1c2UgaXQgdG8gbWFrZSBzZXJ2aWNlIGNhbGxzLgorICB2b2lkIHJlbmRlcl9zeW5jX2NsaWVudF9tYXJrZXJfdHJhaXQodF9zZXJ2aWNlICp0c2VydmljZSk7CisKKyAgLy8gV3JpdGUgdGhlIGNvZGUgdG8gY3JlYXRlIHRoZSBUaHJpZnQgc2VydmljZSBzeW5jIGNsaWVudCBzdHJ1Y3QgYW5kIGl0cyBtYXRjaGluZyAnaW1wbCcgYmxvY2suCisgIHZvaWQgcmVuZGVyX3N5bmNfY2xpZW50X2RlZmluaXRpb25fYW5kX2ltcGwoY29uc3Qgc3RyaW5nJiBjbGllbnRfaW1wbF9uYW1lKTsKKworICAvLyBXcml0ZSB0aGUgY29kZSB0byBjcmVhdGUgdGhlIGBTeW5jQ2xpZW50OjpuZXdgIGZ1bmN0aW9ucyBhcyB3ZWxsIGFzIGFueSBvdGhlciBmdW5jdGlvbnMKKyAgLy8gY2FsbGVycyB3b3VsZCBsaWtlIHRvIHVzZSBvbiB0aGUgVGhyaWZ0IHNlcnZpY2Ugc3luYyBjbGllbnQuCisgIHZvaWQgcmVuZGVyX3N5bmNfY2xpZW50X2xpZmVjeWNsZV9mdW5jdGlvbnMoY29uc3Qgc3RyaW5nJiBjbGllbnRfc3RydWN0KTsKKworICAvLyBXcml0ZSB0aGUgY29kZSB0byBjcmVhdGUgdGhlIGltcGwgYmxvY2sgZm9yIHRoZSBgVFRocmlmdENsaWVudGAgdHJhaXQuIFNpbmNlIGdlbmVyYXRlZAorICAvLyBSdXN0IFRocmlmdCBjbGllbnRzIHBlcmZvcm0gYWxsIHRoZWlyIG9wZXJhdGlvbnMgdXNpbmcgbWV0aG9kcyBkZWZpbmVkIGluIHRoaXMgdHJhaXQsIHdlCisgIC8vIGhhdmUgdG8gaW1wbGVtZW50IGl0IGZvciB0aGUgY2xpZW50IHN0cnVjdHMuCisgIHZvaWQgcmVuZGVyX3N5bmNfY2xpZW50X3R0aHJpZnRjbGllbnRfaW1wbChjb25zdCBzdHJpbmcgJmNsaWVudF9pbXBsX25hbWUpOworCisgIC8vIFdyaXRlIHRoZSBtYXJrZXIgdHJhaXRzIGZvciBhbnkgc2VydmljZShzKSBiZWluZyBleHRlbmRlZCwgaW5jbHVkaW5nIHRoZSBvbmUgZm9yIHRoZSBjdXJyZW50CisgIC8vIHNlcnZpY2UgaXRzZWxmIChpLmUuIGB0c2VydmljZWApCisgIHZvaWQgcmVuZGVyX3N5bmNfY2xpZW50X21hcmtlcl90cmFpdF9pbXBscyh0X3NlcnZpY2UgKnRzZXJ2aWNlLCBjb25zdCBzdHJpbmcgJmltcGxfc3RydWN0X25hbWUpOworCisgIC8vIEdlbmVyYXRlIGEgbGlzdCBvZiBhbGwgdGhlIHRyYWl0cyB0aGlzIFRocmlmdCBjbGllbnQgc3RydWN0IGV4dGVuZHMuCisgIHN0cmluZyBzeW5jX2NsaWVudF9tYXJrZXJfdHJhaXRzX2Zvcl9leHRlbnNpb24odF9zZXJ2aWNlICp0c2VydmljZSk7CisKKyAgLy8gVG9wLWxldmVsIGZ1bmN0aW9uIHRoYXQgd3JpdGVzIHRoZSBjb2RlIHRvIG1ha2UgdGhlIFRocmlmdCBzZXJ2aWNlIGNhbGxzLgorICB2b2lkIHJlbmRlcl9zeW5jX2NsaWVudF9wcm9jZXNzX2ltcGwodF9zZXJ2aWNlKiB0c2VydmljZSk7CisKKyAgLy8gV3JpdGUgdGhlIGFjdHVhbCBmdW5jdGlvbiB0aGF0IGNhbGxzIG91dCB0byB0aGUgcmVtb3RlIHNlcnZpY2UgYW5kIHByb2Nlc3NlcyBpdHMgcmVzcG9uc2UuCisgIHZvaWQgcmVuZGVyX3N5bmNfc2VuZF9yZWN2X3dyYXBwZXIodF9mdW5jdGlvbiogdGZ1bmMpOworCisgIC8vIFdyaXRlIHRoZSBgc2VuZGAgZnVuY3Rpb25hbGl0eSBmb3IgYSBUaHJpZnQgc2VydmljZSBjYWxsIHJlcHJlc2VudGVkIGJ5IGEgYHRfc2VydmljZS0+dF9mdW5jdGlvbmAuCisgIHZvaWQgcmVuZGVyX3N5bmNfc2VuZCh0X2Z1bmN0aW9uKiB0ZnVuYyk7CisKKyAgLy8gV3JpdGUgdGhlIGByZWN2YCBmdW5jdGlvbmFsaXR5IGZvciBhIFRocmlmdCBzZXJ2aWNlIGNhbGwgcmVwcmVzZW50ZWQgYnkgYSBgdF9zZXJ2aWNlLT50X2Z1bmN0aW9uYC4KKyAgLy8gVGhpcyBtZXRob2QgaXMgb25seSByZW5kZXJlZCBpZiB0aGUgZnVuY3Rpb24gaXMgKm5vdCogb25ld2F5LgorICB2b2lkIHJlbmRlcl9zeW5jX3JlY3YodF9mdW5jdGlvbiogdGZ1bmMpOworCisgIHZvaWQgcmVuZGVyX3N5bmNfcHJvY2Vzc29yKHRfc2VydmljZSAqdHNlcnZpY2UpOworCisgIHZvaWQgcmVuZGVyX3N5bmNfaGFuZGxlcl90cmFpdCh0X3NlcnZpY2UgKnRzZXJ2aWNlKTsKKyAgdm9pZCByZW5kZXJfc3luY19wcm9jZXNzb3JfZGVmaW5pdGlvbl9hbmRfaW1wbCh0X3NlcnZpY2UgKnRzZXJ2aWNlKTsKKyAgdm9pZCByZW5kZXJfc3luY19wcm9jZXNzX2RlbGVnYXRpb25fZnVuY3Rpb25zKHRfc2VydmljZSAqdHNlcnZpY2UpOworICB2b2lkIHJlbmRlcl9zeW5jX3Byb2Nlc3NfZnVuY3Rpb24odF9mdW5jdGlvbiAqdGZ1bmMsIGNvbnN0IHN0cmluZyAmaGFuZGxlcl90eXBlKTsKKyAgdm9pZCByZW5kZXJfcHJvY2Vzc19tYXRjaF9zdGF0ZW1lbnRzKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIHJlbmRlcl9zeW5jX2hhbmRsZXJfc3VjY2VlZGVkKHRfZnVuY3Rpb24gKnRmdW5jKTsKKyAgdm9pZCByZW5kZXJfc3luY19oYW5kbGVyX2ZhaWxlZCh0X2Z1bmN0aW9uICp0ZnVuYyk7CisgIHZvaWQgcmVuZGVyX3N5bmNfaGFuZGxlcl9mYWlsZWRfdXNlcl9leGNlcHRpb25fYnJhbmNoKHRfZnVuY3Rpb24gKnRmdW5jKTsKKyAgdm9pZCByZW5kZXJfc3luY19oYW5kbGVyX2ZhaWxlZF9hcHBsaWNhdGlvbl9leGNlcHRpb25fYnJhbmNoKHRfZnVuY3Rpb24gKnRmdW5jLCBjb25zdCBzdHJpbmcgJmFwcF9lcnJfdmFyKTsKKyAgdm9pZCByZW5kZXJfc3luY19oYW5kbGVyX2ZhaWxlZF9kZWZhdWx0X2V4Y2VwdGlvbl9icmFuY2godF9mdW5jdGlvbiAqdGZ1bmMpOworICB2b2lkIHJlbmRlcl9zeW5jX2hhbmRsZXJfc2VuZF9leGNlcHRpb25fcmVzcG9uc2UodF9mdW5jdGlvbiAqdGZ1bmMsIGNvbnN0IHN0cmluZyAmZXJyX3Zhcik7CisgIHZvaWQgcmVuZGVyX3NlcnZpY2VfY2FsbF9zdHJ1Y3RzKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIHJlbmRlcl9zZXJ2aWNlX2NhbGxfYXJnc19zdHJ1Y3QodF9mdW5jdGlvbiogdGZ1bmMpOworICB2b2lkIHJlbmRlcl9zZXJ2aWNlX2NhbGxfcmVzdWx0X3ZhbHVlX3N0cnVjdCh0X2Z1bmN0aW9uKiB0ZnVuYyk7CisKKyAgc3RyaW5nIGhhbmRsZXJfc3VjY2Vzc2Z1bF9yZXR1cm5fc3RydWN0KHRfZnVuY3Rpb24qIHRmdW5jKTsKKworICAvLyBXcml0ZXMgdGhlIHJlc3VsdCBvZiBgcmVuZGVyX3RocmlmdF9lcnJvcl9zdHJ1Y3RgIHdyYXBwZWQgaW4gYW4gYEVycih0aHJpZnQ6OkVycm9yKC4uLikpYC4KKyAgdm9pZCByZW5kZXJfdGhyaWZ0X2Vycm9yKAorICAgIGNvbnN0IHN0cmluZyYgZXJyb3Jfa2luZCwKKyAgICBjb25zdCBzdHJpbmcmIGVycm9yX3N0cnVjdCwKKyAgICBjb25zdCBzdHJpbmcmIHN1Yl9lcnJvcl9raW5kLAorICAgIGNvbnN0IHN0cmluZyYgZXJyb3JfbWVzc2FnZQorICApOworCisgIC8vIFdyaXRlIGEgdGhyaWZ0OjpFcnJvciB2YXJpYW50IHN0cnVjdC4gRXJyb3Igc3RydWN0cyB0YWtlIHRoZSBmb3JtOgorICAvLyBgYGAKKyAgLy8gcHViIHN0cnVjdCBlcnJvcl9zdHJ1Y3QgeworICAvLyAgIGtpbmQ6IHN1Yl9lcnJvcl9raW5kLAorICAvLyAgIG1lc3NhZ2U6IGVycm9yX21lc3NhZ2UsCisgIC8vIH0KKyAgLy8gYGBgCisgIC8vIEEgY29uY3JldGUgZXhhbXBsZSBpczoKKyAgLy8gYGBgCisgIC8vICBwdWIgc3RydWN0IEFwcGxpY2F0aW9uRXJyb3IgeworICAvLyAgICBraW5kOiBBcHBsaWNhdGlvbkVycm9yS2luZDo6VW5rbm93biwKKyAgLy8gICAgbWVzc2FnZTogIlRoaXMgaXMgc29tZSBlcnJvciBtZXNzYWdlIiwKKyAgLy8gIH0KKyAgLy8gYGBgCisgIHZvaWQgcmVuZGVyX3RocmlmdF9lcnJvcl9zdHJ1Y3QoCisgICAgY29uc3Qgc3RyaW5nJiBlcnJvcl9zdHJ1Y3QsCisgICAgY29uc3Qgc3RyaW5nJiBzdWJfZXJyb3Jfa2luZCwKKyAgICBjb25zdCBzdHJpbmcmIGVycm9yX21lc3NhZ2UKKyAgKTsKKworICAvLyBSZXR1cm4gYSBzdHJpbmcgY29udGFpbmluZyBhbGwgdGhlIHVucGFja2VkIHNlcnZpY2UgY2FsbCBhcmdzIGdpdmVuIGEgc2VydmljZSBjYWxsIGZ1bmN0aW9uCisgIC8vIGB0X2Z1bmN0aW9uYC4gUHJlcGVuZHMgdGhlIGFyZ3Mgd2l0aCBlaXRoZXIgYCZtdXQgc2VsZmAgb3IgYCZzZWxmYCBhbmQgaW5jbHVkZXMgdGhlIGFyZyB0eXBlcworICAvLyBpbiB0aGUgcmV0dXJuZWQgc3RyaW5nLCBmb3IgZXhhbXBsZToKKyAgLy8gYGZuIGZvbygmbXV0IHNlbGYsIGZpZWxkXzA6IFN0cmluZylgLgorICBzdHJpbmcgcnVzdF9zeW5jX3NlcnZpY2VfY2FsbF9kZWNsYXJhdGlvbih0X2Z1bmN0aW9uKiB0ZnVuYywgYm9vbCBzZWxmX2lzX211dGFibGUpOworCisgIC8vIFJldHVybiBhIHN0cmluZyBjb250YWluaW5nIGFsbCB0aGUgdW5wYWNrZWQgc2VydmljZSBjYWxsIGFyZ3MgZ2l2ZW4gYSBzZXJ2aWNlIGNhbGwgZnVuY3Rpb24KKyAgLy8gYHRfZnVuY3Rpb25gLiBPbmx5IGluY2x1ZGVzIHRoZSBhcmcgbmFtZXMsIGVhY2ggb2Ygd2hpY2ggaXMgcHJlZml4ZWQgd2l0aCB0aGUgb3B0aW9uYWwgcHJlZml4CisgIC8vIGBmaWVsZF9wcmVmaXhgLCBmb3IgZXhhbXBsZTogYHNlbGYuZmllbGRfMGAuCisgIHN0cmluZyBydXN0X3N5bmNfc2VydmljZV9jYWxsX2ludm9jYXRpb24odF9mdW5jdGlvbiogdGZ1bmMsIGNvbnN0IHN0cmluZyYgZmllbGRfcHJlZml4ID0gIiIpOworCisgIC8vIFJldHVybiBhIHN0cmluZyBjb250YWluaW5nIGFsbCBmaWVsZHMgaW4gdGhlIHN0cnVjdCBgdHN0cnVjdGAgZm9yIHVzZSBpbiBhIGZ1bmN0aW9uIGRlY2xhcmF0aW9uLgorICAvLyBFYWNoIGZpZWxkIGlzIGZvbGxvd2VkIGJ5IGl0cyB0eXBlLCBmb3IgZXhhbXBsZTogYGZpZWxkXzA6IFN0cmluZ2AuCisgIHN0cmluZyBzdHJ1Y3RfdG9fZGVjbGFyYXRpb24odF9zdHJ1Y3QqIHRzdHJ1Y3QsIHRfcnNfZ2VuZXJhdG9yOjplX3N0cnVjdF90eXBlIHN0cnVjdF90eXBlKTsKKworICAvLyBSZXR1cm4gYSBzdHJpbmcgY29udGFpbmluZyBhbGwgZmllbGRzIGluIHRoZSBzdHJ1Y3QgYHRzdHJ1Y3RgIGZvciB1c2UgaW4gYSBmdW5jdGlvbiBjYWxsLAorICAvLyBmb3IgZXhhbXBsZTogYGZpZWxkXzA6IFN0cmluZ2AuCisgIHN0cmluZyBzdHJ1Y3RfdG9faW52b2NhdGlvbih0X3N0cnVjdCogdHN0cnVjdCwgY29uc3Qgc3RyaW5nJiBmaWVsZF9wcmVmaXggPSAiIik7CisKKyAgLy8gV3JpdGUgdGhlIGRvY3VtZW50YXRpb24gZm9yIGEgc3RydWN0LCBzZXJ2aWNlLWNhbGwgb3Igb3RoZXIgZG9jdW1lbnRhdGlvbi1hbm5vdGF0ZWQgZWxlbWVudC4KKyAgdm9pZCByZW5kZXJfcnVzdGRvYyh0X2RvYyogdGRvYyk7CisKKyAgLy8gUmV0dXJuIGB0cnVlYCBpZiB0aGUgdHJ1ZSB0eXBlIG9mIGB0dHlwZWAgaXMgYSB0aHJpZnQgZG91YmxlLCBgZmFsc2VgIG90aGVyd2lzZS4KKyAgYm9vbCBpc19kb3VibGUodF90eXBlKiB0dHlwZSk7CisKKyAgLy8gUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgcnVzdCB0eXBlIGdpdmVuIGEgYHRfdHlwZWAuCisgIHN0cmluZyB0b19ydXN0X3R5cGUodF90eXBlKiB0dHlwZSwgYm9vbCBvcmRlcmVkX2Zsb2F0ID0gdHJ1ZSk7CisKKyAgLy8gUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgYGNvbnN0YCBydXN0IHR5cGUgZ2l2ZW4gYSBgdF90eXBlYAorICBzdHJpbmcgdG9fcnVzdF9jb25zdF90eXBlKHRfdHlwZSogdHR5cGUsIGJvb2wgb3JkZXJlZF9mbG9hdCA9IHRydWUpOworCisgIC8vIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHJpZnQgYHByb3RvY29sOjpUVHlwZWAgZ2l2ZW4gYSBgdF90eXBlYC4KKyAgc3RyaW5nIHRvX3J1c3RfZmllbGRfdHlwZV9lbnVtKHRfdHlwZSogdHR5cGUpOworCisgIC8vIFJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZSB0byBiZSB1c2VkIHdoZW4gaW5pdGlhbGl6aW5nIGEgc3RydWN0IGZpZWxkIHdoaWNoIGhhcyBgT1BUX0lOX1JFUV9PVVRgCisgIC8vIG9wdGlvbmFsaXR5LgorICBzdHJpbmcgb3B0X2luX3JlcV9vdXRfdmFsdWUodF90eXBlKiB0dHlwZSk7CisKKyAgLy8gUmV0dXJuIGB0cnVlYCBpZiB3ZSBjYW4gd3JpdGUgYSBjb25zdCBvZiB0aGUgZm9ybSBgcHViIGNvbnN0IEZPTzogLi4uYC4KKyAgYm9vbCBjYW5fZ2VuZXJhdGVfc2ltcGxlX2NvbnN0KHRfdHlwZSogdHR5cGUpOworCisgIC8vIFJldHVybiBgdHJ1ZWAgaWYgd2UgY2Fubm90IHdyaXRlIGEgc3RhbmRhcmQgUnVzdCBjb25zdGFudCAoYmVjYXVzZSB0aGUgdHlwZSBuZWVkcyBzb21lIGFsbG9jYXRpb24pLgorICBib29sIGNhbl9nZW5lcmF0ZV9jb25zdF9ob2xkZXIodF90eXBlKiB0dHlwZSk7CisKKyAgLy8gUmV0dXJuIGB0cnVlYCBpZiB0aGlzIHR5cGUgaXMgYSB2b2lkLCBhbmQgc2hvdWxkIGJlIHJlcHJlc2VudGVkIGJ5IHRoZSBydXN0IGAoKWAgdHlwZS4KKyAgYm9vbCBpc192b2lkKHRfdHlwZSogdHR5cGUpOworCisgIHRfZmllbGQ6OmVfcmVxIGFjdHVhbF9maWVsZF9yZXEodF9maWVsZCogdGZpZWxkLCB0X3JzX2dlbmVyYXRvcjo6ZV9zdHJ1Y3RfdHlwZSBzdHJ1Y3RfdHlwZSk7CisKKyAgLy8gUmV0dXJuIGB0cnVlYCBpZiB0aGlzIGB0X2ZpZWxkOjplX3JlcWAgaXMgZWl0aGVyIGB0X2ZpZWxkOjpUX09QVElPTkFMYCBvciBgdF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVGAKKyAgLy8gYW5kIG5lZWRzIHRvIGJlIHdyYXBwZWQgYnkgYW4gYE9wdGlvbjxUWVBFX05BTUU+YCwgYGZhbHNlYCBvdGhlcndpc2UuCisgIGJvb2wgaXNfb3B0aW9uYWwodF9maWVsZDo6ZV9yZXEgcmVxKTsKKworICAvLyBSZXR1cm4gYHRydWVgIGlmIHRoZSBzZXJ2aWNlIGNhbGwgaGFzIGFyZ3VtZW50cywgYGZhbHNlYCBvdGhlcndpc2UuCisgIGJvb2wgaGFzX2FyZ3ModF9mdW5jdGlvbiogdGZ1bmMpOworCisgIC8vIFJldHVybiBgdHJ1ZWAgaWYgYSBzZXJ2aWNlIGNhbGwgaGFzIG5vbi1gKClgIGFyZ3VtZW50cywgYGZhbHNlYCBvdGhlcndpc2UuCisgIGJvb2wgaGFzX25vbl92b2lkX2FyZ3ModF9mdW5jdGlvbiogdGZ1bmMpOworCisgIC8vIFJldHVybiBgcHViIGAgKG5vdGljZSB0cmFpbGluZyB3aGl0ZXNwYWNlISkgaWYgdGhlIHN0cnVjdCBzaG91bGQgYmUgcHVibGljLCBgYCAoZW1wdHkgc3RyaW5nKSBvdGhlcndpc2UuCisgIHN0cmluZyB2aXNpYmlsaXR5X3F1YWxpZmllcih0X3JzX2dlbmVyYXRvcjo6ZV9zdHJ1Y3RfdHlwZSBzdHJ1Y3RfdHlwZSk7CisKKyAgLy8gUmV0dXJucyB0aGUgbmFtZXNwYWNlIHByZWZpeCBmb3IgYSBnaXZlbiBUaHJpZnQgc2VydmljZS4gSWYgdGhlIHR5cGUgaXMgZGVmaW5lZCBpbiB0aGUgcHJlc2VudGx5LWNvbXB1dGVkCisgIC8vIFRocmlmdCBwcm9ncmFtLCB0aGVuIGFuIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZC4KKyAgc3RyaW5nIHJ1c3RfbmFtZXNwYWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworCisgIC8vIFJldHVybnMgdGhlIG5hbWVzcGFjZSBwcmVmaXggZm9yIGEgZ2l2ZW4gVGhyaWZ0IHR5cGUuIElmIHRoZSB0eXBlIGlzIGRlZmluZWQgaW4gdGhlIHByZXNlbnRseS1jb21wdXRlZAorICAvLyBUaHJpZnQgcHJvZ3JhbSwgdGhlbiBhbiBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQuCisgIHN0cmluZyBydXN0X25hbWVzcGFjZSh0X3R5cGUqIHR0eXBlKTsKKworICAvLyBSZXR1cm5zIHRoZSBjYW1lbC1jYXNlZCBuYW1lIGZvciBhIFJ1c3Qgc3RydWN0IHR5cGUuIEhhbmRsZXMgdGhlIGNhc2Ugd2hlcmUgYHRzdHJ1Y3QtPmdldF9uYW1lKClgIGlzCisgIC8vIGEgcmVzZXJ2ZWQgd29yZC4KKyAgc3RyaW5nIHJ1c3Rfc3RydWN0X25hbWUodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIC8vIFJldHVybnMgdGhlIHNuYWtlLWNhc2VkIG5hbWUgZm9yIGEgUnVzdCBmaWVsZCBvciBsb2NhbCB2YXJpYWJsZS4gSGFuZGxlcyB0aGUgY2FzZSB3aGVyZQorICAvLyBgdGZpZWxkLT5nZXRfbmFtZSgpYCBpcyBhIHJlc2VydmVkIHdvcmQuCisgIHN0cmluZyBydXN0X2ZpZWxkX25hbWUodF9maWVsZCogdHN0cnVjdCk7CisKKyAgLy8gUmV0dXJucyB0aGUgY2FtZWwtY2FzZWQgbmFtZSBmb3IgYSBSdXN0IHVuaW9uIHR5cGUuIEhhbmRsZXMgdGhlIGNhc2Ugd2hlcmUgYHRzdHJ1Y3QtPmdldF9uYW1lKClgIGlzCisgIC8vIGEgcmVzZXJ2ZWQgd29yZC4KKyAgc3RyaW5nIHJ1c3RfdW5pb25fZmllbGRfbmFtZSh0X2ZpZWxkKiB0c3RydWN0KTsKKworICAvLyBDb252ZXJ0cyBhbnkgdmFyaWFibGUgbmFtZSBpbnRvIGEgJ3NhZmUnIHZhcmlhbnQgdGhhdCBkb2VzIG5vdCBjbGFzaCB3aXRoIGFueSBSdXN0IHJlc2VydmVkIGtleXdvcmRzLgorICBzdHJpbmcgcnVzdF9zYWZlX25hbWUoY29uc3Qgc3RyaW5nJiBuYW1lKTsKKworICAvLyBSZXR1cm4gYHRydWVgIGlmIHRoZSBuYW1lIGlzIGEgcmVzZXJ2ZWQgUnVzdCBrZXl3b3JkLCBgZmFsc2VgIG90aGVyd2lzZS4KKyAgYm9vbCBpc19yZXNlcnZlZChjb25zdCBzdHJpbmcmIG5hbWUpOworCisgIC8vIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gdGhhdCB1c2VycyB3aWxsIGludm9rZSB0byBtYWtlIG91dGdvaW5nIHNlcnZpY2UgY2FsbHMuCisgIHN0cmluZyBzZXJ2aWNlX2NhbGxfY2xpZW50X2Z1bmN0aW9uX25hbWUodF9mdW5jdGlvbiogdGZ1bmMpOworCisgIC8vIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gdGhhdCB1c2VycyB3aWxsIGhhdmUgdG8gaW1wbGVtZW50IHRvIGhhbmRsZSBpbmNvbWluZyBzZXJ2aWNlIGNhbGxzLgorICBzdHJpbmcgc2VydmljZV9jYWxsX2hhbmRsZXJfZnVuY3Rpb25fbmFtZSh0X2Z1bmN0aW9uKiB0ZnVuYyk7CisKKyAgLy8gUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBzdHJ1Y3QgdXNlZCB0byBwYWNrIHRoZSBhcmd1bWVudHMgZm9yIHRoZSB0aHJpZnQgc2VydmljZSBjYWxsLgorICBzdHJpbmcgc2VydmljZV9jYWxsX2FyZ3Nfc3RydWN0X25hbWUodF9mdW5jdGlvbiogdGZ1bmMpOworCisgIC8vIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgc3RydWN0IHVzZWQgdG8gcGFjayB0aGUgcmV0dXJuIHZhbHVlCisgIC8vIGFuZCB1c2VyLWRlZmluZWQgZXhjZXB0aW9ucyBmb3IgdGhlIHRocmlmdCBzZXJ2aWNlIGNhbGwuCisgIHN0cmluZyBzZXJ2aWNlX2NhbGxfcmVzdWx0X3N0cnVjdF9uYW1lKHRfZnVuY3Rpb24qIHRmdW5jKTsKKworICBzdHJpbmcgcnVzdF9zeW5jX2NsaWVudF9tYXJrZXJfdHJhaXRfbmFtZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworICAvLyBSZXR1cm4gdGhlIHRyYWl0IG5hbWUgZm9yIHRoZSBzeW5jIHNlcnZpY2UgY2xpZW50IGdpdmVuIGEgYHRfc2VydmljZWAuCisgIHN0cmluZyBydXN0X3N5bmNfY2xpZW50X3RyYWl0X25hbWUodF9zZXJ2aWNlKiB0c2VydmljZSk7CisKKyAgLy8gUmV0dXJuIHRoZSBuYW1lIGZvciB0aGUgc3luYyBzZXJ2aWNlIGNsaWVudCBzdHJ1Y3QgZ2l2ZW4gYSBgdF9zZXJ2aWNlYC4KKyAgc3RyaW5nIHJ1c3Rfc3luY19jbGllbnRfaW1wbF9uYW1lKHRfc2VydmljZSogdHNlcnZpY2UpOworCisgIC8vIFJldHVybiB0aGUgdHJhaXQgbmFtZSB0aGF0IHVzZXJzIHdpbGwgaGF2ZSB0byBpbXBsZW1lbnQgZm9yIHRoZSBzZXJ2ZXIgaGFsZiBvZiBhIFRocmlmdCBzZXJ2aWNlLgorICBzdHJpbmcgcnVzdF9zeW5jX2hhbmRsZXJfdHJhaXRfbmFtZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworICAvLyBSZXR1cm4gdGhlIHN0cnVjdCBuYW1lIGZvciB0aGUgIHNlcnZlciBoYWxmIG9mIGEgVGhyaWZ0IHNlcnZpY2UuCisgIHN0cmluZyBydXN0X3N5bmNfcHJvY2Vzc29yX25hbWUodF9zZXJ2aWNlKiB0c2VydmljZSk7CisKKyAgLy8gUmV0dXJuIHRoZSBzdHJ1Y3QgbmFtZSBmb3IgdGhlIHN0cnVjdCB0aGF0IGNvbnRhaW5zIGFsbCB0aGUgc2VydmljZS1jYWxsIGltcGxlbWVudGF0aW9ucyBmb3IKKyAgLy8gdGhlIHNlcnZlciBoYWxmIG9mIGEgVGhyaWZ0IHNlcnZpY2UuCisgIHN0cmluZyBydXN0X3N5bmNfcHJvY2Vzc29yX2ltcGxfbmFtZSh0X3NlcnZpY2UgKnRzZXJ2aWNlKTsKKworICAvLyBSZXR1cm4gdGhlIHZhcmlhbnQgbmFtZSBmb3IgYW4gZW51bSB2YXJpYW50CisgIHN0cmluZyBydXN0X2VudW1fdmFyaWFudF9uYW1lKGNvbnN0IHN0cmluZyYgbmFtZSk7CisKKyAgLy8gUHJvcGVybHkgdXBwZXJjYXNlIG5hbWVzIGZvciB1c2UgaW4gUnVzdC4KKyAgc3RyaW5nIHJ1c3RfdXBwZXJfY2FzZShjb25zdCBzdHJpbmcmIG5hbWUpOworCisgIC8vIFNuYWtlLWNhc2UgZmllbGQsIHBhcmFtZXRlciBhbmQgZnVuY3Rpb24gbmFtZXMgYW5kIG1ha2UgdGhlbSBSdXN0IGZyaWVuZGx5LgorICBzdHJpbmcgcnVzdF9zbmFrZV9jYXNlKGNvbnN0IHN0cmluZyYgbmFtZSk7CisKKyAgLy8gQ2FtZWwtY2FzZSB0eXBlL3ZhcmlhbnQgbmFtZXMgYW5kIG1ha2UgdGhlbSBSdXN0IGZyaWVuZGx5LgorICBzdHJpbmcgcnVzdF9jYW1lbF9jYXNlKGNvbnN0IHN0cmluZyYgbmFtZSk7CisKKyAgLy8gUmVwbGFjZSBhbGwgaW5zdGFuY2VzIG9mIGBzZWFyY2hfc3RyaW5nYCB3aXRoIGByZXBsYWNlX3N0cmluZ2AgaW4gYHRhcmdldGAuCisgIHZvaWQgc3RyaW5nX3JlcGxhY2Uoc3RyaW5nJiB0YXJnZXQsIGNvbnN0IHN0cmluZyYgc2VhcmNoX3N0cmluZywgY29uc3Qgc3RyaW5nJiByZXBsYWNlX3N0cmluZyk7Cit9OworCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKKyAgLy8gbWFrZSBvdXRwdXQgZGlyZWN0b3J5IGZvciB0aGlzIHRocmlmdCBwcm9ncmFtCisgIE1LRElSKGdlbl9kaXJfLmNfc3RyKCkpOworCisgIC8vIGNyZWF0ZSB0aGUgZmlsZSBpbnRvIHdoaWNoIHdlJ3JlIGdvaW5nIHRvIHdyaXRlIHRoZSBnZW5lcmF0ZWQgY29kZQorICBzdHJpbmcgZl9nZW5fbmFtZSA9IGdlbl9kaXJfICsgIi8iICsgcnVzdF9zbmFrZV9jYXNlKGdldF9wcm9ncmFtKCktPmdldF9uYW1lKCkpICsgIi5ycyI7CisgIGZfZ2VuXy5vcGVuKGZfZ2VuX25hbWUuY19zdHIoKSk7CisKKyAgLy8gaGVhZGVyIGNvbW1lbnQKKyAgZl9nZW5fIDw8ICIvLyAiIDw8IGF1dG9nZW5fc3VtbWFyeSgpIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCAiLy8gRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lORyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7CisKKyAgcmVuZGVyX2F0dHJpYnV0ZXNfYW5kX2luY2x1ZGVzKCk7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9hdHRyaWJ1dGVzX2FuZF9pbmNsdWRlcygpIHsKKyAgLy8gdHVybiBvZmYgc29tZSBjb21waWxlci9jbGlwcHkgd2FybmluZ3MKKworICAvLyBjb2RlIGFsd2F5cyBpbmNsdWRlcyBCVHJlZU1hcC9CVHJlZVNldC9PcmRlcmVkRmxvYXQKKyAgZl9nZW5fIDw8ICIjIVthbGxvdyh1bnVzZWRfaW1wb3J0cyldIiA8PCBlbmRsOworICAvLyBjb2RlIG1pZ2h0IG5vdCBpbmNsdWRlIGltcG9ydHMgZnJvbSBjcmF0ZXMKKyAgZl9nZW5fIDw8ICIjIVthbGxvdyh1bnVzZWRfZXh0ZXJuX2NyYXRlcyldIiA8PCBlbmRsOworICAvLyBjb25zdHJ1Y3RvcnMgdGFrZSAqYWxsKiBzdHJ1Y3QgcGFyYW1ldGVycywgd2hpY2ggY2FuIHRyaWdnZXIgdGhlICJ0b28gbWFueSBhcmd1bWVudHMiIHdhcm5pbmcKKyAgLy8gc29tZSBhdXRvLWdlbidkIHR5cGVzIGNhbiBiZSBkZWVwbHkgbmVzdGVkLiBjbGlwcHkgcmVjb21tZW5kcyBmYWN0b3JpbmcgdGhlbSBvdXQgd2hpY2ggaXMgaGFyZCB0byBhdXRvZ2VuCisgIGZfZ2VuXyA8PCAiIyFbY2ZnX2F0dHIoZmVhdHVyZSA9IFwiY2FyZ28tY2xpcHB5XCIsIGFsbG93KHRvb19tYW55X2FyZ3VtZW50cywgdHlwZV9jb21wbGV4aXR5KSldIiA8PCBlbmRsOworICAvLyBwcmV2ZW50IHJ1c3RmbXQgZnJvbSBydW5uaW5nIGFnYWluc3QgdGhpcyBmaWxlCisgIC8vIGxpbmVzIGFyZSB0b28gbG9uZywgY29kZSBpcyAodGhhbmtmdWxseSEpIG5vdCB2aXN1YWwtaW5kZW50ZWQsIGV0Yy4KKyAgZl9nZW5fIDw8ICIjIVtjZmdfYXR0cihydXN0Zm10LCBydXN0Zm10X3NraXApXSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7CisKKyAgLy8gYWRkIHN0YW5kYXJkIGluY2x1ZGVzCisgIGZfZ2VuXyA8PCAiZXh0ZXJuIGNyYXRlIG9yZGVyZWRfZmxvYXQ7IiA8PCBlbmRsOworICBmX2dlbl8gPDwgImV4dGVybiBjcmF0ZSB0aHJpZnQ7IiA8PCBlbmRsOworICBmX2dlbl8gPDwgImV4dGVybiBjcmF0ZSB0cnlfZnJvbTsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBlbmRsOworICBmX2dlbl8gPDwgInVzZSBvcmRlcmVkX2Zsb2F0OjpPcmRlcmVkRmxvYXQ7IiA8PCBlbmRsOworICBmX2dlbl8gPDwgInVzZSBzdGQ6OmNlbGw6OlJlZkNlbGw7IiA8PCBlbmRsOworICBmX2dlbl8gPDwgInVzZSBzdGQ6OmNvbGxlY3Rpb25zOjp7QlRyZWVNYXAsIEJUcmVlU2V0fTsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCAidXNlIHN0ZDo6Y29udmVydDo6RnJvbTsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCAidXNlIHN0ZDo6ZGVmYXVsdDo6RGVmYXVsdDsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCAidXNlIHN0ZDo6ZXJyb3I6OkVycm9yOyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8ICJ1c2Ugc3RkOjpmbXQ7IiA8PCBlbmRsOworICBmX2dlbl8gPDwgInVzZSBzdGQ6OmZtdDo6e0Rpc3BsYXksIEZvcm1hdHRlcn07IiA8PCBlbmRsOworICBmX2dlbl8gPDwgInVzZSBzdGQ6OnJjOjpSYzsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCAidXNlIHRyeV9mcm9tOjpUcnlGcm9tOyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCAidXNlIHRocmlmdDo6e0FwcGxpY2F0aW9uRXJyb3IsIEFwcGxpY2F0aW9uRXJyb3JLaW5kLCBQcm90b2NvbEVycm9yLCBQcm90b2NvbEVycm9yS2luZCwgVFRocmlmdENsaWVudH07IiA8PCBlbmRsOworICBmX2dlbl8gPDwgInVzZSB0aHJpZnQ6OnByb3RvY29sOjp7VEZpZWxkSWRlbnRpZmllciwgVExpc3RJZGVudGlmaWVyLCBUTWFwSWRlbnRpZmllciwgVE1lc3NhZ2VJZGVudGlmaWVyLCBUTWVzc2FnZVR5cGUsIFRJbnB1dFByb3RvY29sLCBUT3V0cHV0UHJvdG9jb2wsIFRTZXRJZGVudGlmaWVyLCBUU3RydWN0SWRlbnRpZmllciwgVFR5cGV9OyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8ICJ1c2UgdGhyaWZ0Ojpwcm90b2NvbDo6ZmllbGRfaWQ7IiA8PCBlbmRsOworICBmX2dlbl8gPDwgInVzZSB0aHJpZnQ6OnByb3RvY29sOjp2ZXJpZnlfZXhwZWN0ZWRfbWVzc2FnZV90eXBlOyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8ICJ1c2UgdGhyaWZ0Ojpwcm90b2NvbDo6dmVyaWZ5X2V4cGVjdGVkX3NlcXVlbmNlX251bWJlcjsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCAidXNlIHRocmlmdDo6cHJvdG9jb2w6OnZlcmlmeV9leHBlY3RlZF9zZXJ2aWNlX2NhbGw7IiA8PCBlbmRsOworICBmX2dlbl8gPDwgInVzZSB0aHJpZnQ6OnByb3RvY29sOjp2ZXJpZnlfcmVxdWlyZWRfZmllbGRfZXhpc3RzOyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8ICJ1c2UgdGhyaWZ0OjpzZXJ2ZXI6OlRQcm9jZXNzb3I7IiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKKworICAvLyBhZGQgYWxsIHRoZSBwcm9ncmFtIGluY2x1ZGVzCisgIC8vIE5PVEU6IHRoaXMgaXMgbW9yZSBpbnZvbHZlZCB0aGFuIHlvdSB3b3VsZCBleHBlY3QgYmVjYXVzZSBvZiBzZXJ2aWNlIGV4dGVuc2lvbgorICAvLyBCYXNpY2FsbHksIEkgaGF2ZSB0byBmaW5kIHRoZSBjbG9zdXJlIG9mIGFsbCB0aGUgc2VydmljZXMgYW5kIGluY2x1ZGUgdGhlaXIgbW9kdWxlcyBhdCB0aGUgdG9wLWxldmVsCisKKyAgc2V0PHN0cmluZz4gcmVmZXJlbmNlZF9tb2R1bGVzOworCisgIC8vIGZpcnN0LCBzdGFydCBieSBhZGRpbmcgZXhwbGljaXQgdGhyaWZ0IGluY2x1ZGVzCisgIGNvbnN0IHZlY3Rvcjx0X3Byb2dyYW0qPiBpbmNsdWRlcyA9IGdldF9wcm9ncmFtKCktPmdldF9pbmNsdWRlcygpOworICB2ZWN0b3I8dF9wcm9ncmFtKj46OmNvbnN0X2l0ZXJhdG9yIGluY2x1ZGVzX2l0ZXI7CisgIGZvcihpbmNsdWRlc19pdGVyID0gaW5jbHVkZXMuYmVnaW4oKTsgaW5jbHVkZXNfaXRlciAhPSBpbmNsdWRlcy5lbmQoKTsgKytpbmNsdWRlc19pdGVyKSB7CisgICAgcmVmZXJlbmNlZF9tb2R1bGVzLmluc2VydCgoKmluY2x1ZGVzX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgfQorCisgIC8vIG5leHQsIHJlY3Vyc2l2ZWx5IGl0ZXJhdGUgdGhyb3VnaCBhbGwgdGhlIHNlcnZpY2VzIGFuZCBhZGQgdGhlIG5hbWVzIG9mIGFueSBwcm9ncmFtcyB0aGV5IHJlZmVyZW5jZQorICBjb25zdCB2ZWN0b3I8dF9zZXJ2aWNlKj4gc2VydmljZXMgPSBnZXRfcHJvZ3JhbSgpLT5nZXRfc2VydmljZXMoKTsKKyAgdmVjdG9yPHRfc2VydmljZSo+Ojpjb25zdF9pdGVyYXRvciBzZXJ2aWNlX2l0ZXI7CisgIGZvciAoc2VydmljZV9pdGVyID0gc2VydmljZXMuYmVnaW4oKTsgc2VydmljZV9pdGVyICE9IHNlcnZpY2VzLmVuZCgpOyArK3NlcnZpY2VfaXRlcikgeworICAgIGNvbXB1dGVfc2VydmljZV9yZWZlcmVuY2VkX21vZHVsZXMoKnNlcnZpY2VfaXRlciwgcmVmZXJlbmNlZF9tb2R1bGVzKTsKKyAgfQorCisgIC8vIGZpbmFsbHksIHdyaXRlIGFsbCB0aGUgInB1YiB1c2UuLi4iIGRlY2xhcmF0aW9ucworICBpZiAoIXJlZmVyZW5jZWRfbW9kdWxlcy5lbXB0eSgpKSB7CisgICAgc2V0PHN0cmluZz46Oml0ZXJhdG9yIG1vZHVsZV9pdGVyOworICAgIGZvciAobW9kdWxlX2l0ZXIgPSByZWZlcmVuY2VkX21vZHVsZXMuYmVnaW4oKTsgbW9kdWxlX2l0ZXIgIT0gcmVmZXJlbmNlZF9tb2R1bGVzLmVuZCgpOyArK21vZHVsZV9pdGVyKSB7CisgICAgICBmX2dlbl8gPDwgInVzZSAiIDw8IHJ1c3Rfc25ha2VfY2FzZSgqbW9kdWxlX2l0ZXIpIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKyAgICBmX2dlbl8gPDwgZW5kbDsKKyAgfQorfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpjb21wdXRlX3NlcnZpY2VfcmVmZXJlbmNlZF9tb2R1bGVzKAorICB0X3NlcnZpY2UgKnRzZXJ2aWNlLAorICBzZXQ8c3RyaW5nPiAmcmVmZXJlbmNlZF9tb2R1bGVzCispIHsKKyAgdF9zZXJ2aWNlKiBleHRlbmRzID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7CisgIGlmIChleHRlbmRzKSB7CisgICAgaWYgKGV4dGVuZHMtPmdldF9wcm9ncmFtKCkgIT0gZ2V0X3Byb2dyYW0oKSkgeworICAgICAgcmVmZXJlbmNlZF9tb2R1bGVzLmluc2VydChleHRlbmRzLT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZSgpKTsKKyAgICB9CisgICAgY29tcHV0ZV9zZXJ2aWNlX3JlZmVyZW5jZWRfbW9kdWxlcyhleHRlbmRzLCByZWZlcmVuY2VkX21vZHVsZXMpOworICB9Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKKyAgZl9nZW5fLmNsb3NlKCk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBDb25zdHMKKy8vCisvLyBOT1RFOiBjb25zaWRlciB1c2luZyBtYWNyb3MgdG8gZ2VuZXJhdGUgY29uc3RhbnRzCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBUaGlzIGlzIHdvcnNlIHRoYW4gaXQgc2hvdWxkIGJlIGJlY2F1c2UgY29uc3RhbnRzCisvLyBhcmVuJ3QgKHNlbnNpYmx5KSBsaW1pdGVkIHRvIHNjYWxhciB0eXBlcwordm9pZCB0X3JzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KSB7CisgIHN0cmluZyBuYW1lID0gdGNvbnN0LT5nZXRfbmFtZSgpOworICB0X3R5cGUqIHR0eXBlID0gdGNvbnN0LT5nZXRfdHlwZSgpOworICB0X2NvbnN0X3ZhbHVlKiB0dmFsdWUgPSB0Y29uc3QtPmdldF92YWx1ZSgpOworCisgIGlmIChjYW5fZ2VuZXJhdGVfc2ltcGxlX2NvbnN0KHR0eXBlKSkgeworICAgIHJlbmRlcl9jb25zdF92YWx1ZShuYW1lLCB0dHlwZSwgdHZhbHVlKTsKKyAgfSBlbHNlIGlmIChjYW5fZ2VuZXJhdGVfY29uc3RfaG9sZGVyKHR0eXBlKSkgeworICAgIHJlbmRlcl9jb25zdF92YWx1ZV9ob2xkZXIobmFtZSwgdHR5cGUsIHR2YWx1ZSk7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgImNhbm5vdCBnZW5lcmF0ZSBjb25zdCBmb3IgIiArIG5hbWU7CisgIH0KK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKGNvbnN0IHN0cmluZyYgbmFtZSwgdF90eXBlKiB0dHlwZSwgdF9jb25zdF92YWx1ZSogdHZhbHVlKSB7CisgIGlmICghY2FuX2dlbmVyYXRlX3NpbXBsZV9jb25zdCh0dHlwZSkpIHsKKyAgICB0aHJvdyAiY2Fubm90IGdlbmVyYXRlIHNpbXBsZSBydXN0IGNvbnN0YW50IGZvciAiICsgdHR5cGUtPmdldF9uYW1lKCk7CisgIH0KKworICBmX2dlbl8gPDwgInB1YiBjb25zdCAiIDw8IHJ1c3RfdXBwZXJfY2FzZShuYW1lKSA8PCAiOiAiIDw8IHRvX3J1c3RfY29uc3RfdHlwZSh0dHlwZSkgPDwgIiA9ICI7CisgIHJlbmRlcl9jb25zdF92YWx1ZSh0dHlwZSwgdHZhbHVlLCBmYWxzZSk7CisgIGZfZ2VuXyA8PCAiOyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZV9ob2xkZXIoY29uc3Qgc3RyaW5nJiBuYW1lLCB0X3R5cGUqIHR0eXBlLCB0X2NvbnN0X3ZhbHVlKiB0dmFsdWUpIHsKKyAgaWYgKCFjYW5fZ2VuZXJhdGVfY29uc3RfaG9sZGVyKHR0eXBlKSkgeworICAgIHRocm93ICJjYW5ub3QgZ2VuZXJhdGUgY29uc3RhbnQgaG9sZGVyIGZvciAiICsgdHR5cGUtPmdldF9uYW1lKCk7CisgIH0KKworICBzdHJpbmcgaG9sZGVyX25hbWUoIkNvbnN0IiArIHJ1c3RfY2FtZWxfY2FzZShuYW1lKSk7CisKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJwdWIgc3RydWN0ICIgPDwgaG9sZGVyX25hbWUgPDwgIjsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiaW1wbCAiIDw8IGhvbGRlcl9uYW1lIDw8ICIgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJwdWIgZm4gY29uc3RfdmFsdWUoKSAtPiAiIDw8IHRvX3J1c3RfdHlwZSh0dHlwZSkgPDwgIiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgcmVuZGVyX2NvbnN0X3ZhbHVlKHR0eXBlLCB0dmFsdWUpOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHR5cGUsIHRfY29uc3RfdmFsdWUqIHR2YWx1ZSwgYm9vbCBpc19vd25lZCkgeworICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGUqIHRiYXNlX3R5cGUgPSAodF9iYXNlX3R5cGUqKXR0eXBlOworICAgIHN3aXRjaCAodGJhc2VfdHlwZS0+Z2V0X2Jhc2UoKSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgaWYgKHRiYXNlX3R5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgIGlmIChpc19vd25lZCkgeworICAgICAgICAgIGZfZ2VuXyA8PCAiXCIiIDw8IHR2YWx1ZS0+Z2V0X3N0cmluZygpIDw8ICJcIiI8PCAgIi50b19vd25lZCgpLmludG9fYnl0ZXMoKSI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZl9nZW5fIDw8ICJiXCIiIDw8IHR2YWx1ZS0+Z2V0X3N0cmluZygpIDw8ICJcIiI7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfZ2VuXyA8PCAiXCIiIDw8IHR2YWx1ZS0+Z2V0X3N0cmluZygpIDw8ICJcIiI7CisgICAgICAgIGlmIChpc19vd25lZCkgeworICAgICAgICAgIGZfZ2VuXyA8PCAiLnRvX293bmVkKCkiOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICBmX2dlbl8gPDwgKHR2YWx1ZS0+Z2V0X2ludGVnZXIoKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIGZfZ2VuXyA8PCB0dmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIGZfZ2VuXyA8PCAiT3JkZXJlZEZsb2F0Ojpmcm9tKCIgPDwgdHZhbHVlLT5nZXRfZG91YmxlKCkgPDwgIiBhcyBmNjQpIjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAiY2Fubm90IGdlbmVyYXRlIGNvbnN0IHZhbHVlIGZvciAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlX3R5cGUtPmdldF9iYXNlKCkpOworICAgIH0KKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgcmVuZGVyX2NvbnN0X3ZhbHVlKGdldF90cnVlX3R5cGUodHR5cGUpLCB0dmFsdWUpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZl9nZW5fCisgICAgICA8PCBpbmRlbnQoKQorICAgICAgPDwgdG9fcnVzdF90eXBlKHR0eXBlKQorICAgICAgPDwgIjo6dHJ5X2Zyb20oIgorICAgICAgPDwgdHZhbHVlLT5nZXRfaW50ZWdlcigpCisgICAgICA8PCAiKS5leHBlY3QoXCJleHBlY3RpbmcgdmFsaWQgY29uc3QgdmFsdWVcIikiCisgICAgICA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJlbmRlcl9jb25zdF9zdHJ1Y3QodHR5cGUsIHR2YWx1ZSk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIHJlbmRlcl9jb25zdF9saXN0KHR0eXBlLCB0dmFsdWUpOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgICByZW5kZXJfY29uc3Rfc2V0KHR0eXBlLCB0dmFsdWUpOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgICByZW5kZXJfY29uc3RfbWFwKHR0eXBlLCB0dmFsdWUpOworICAgIH0gZWxzZSB7CisgICAgICB0aHJvdyAiY2Fubm90IGdlbmVyYXRlIGNvbnN0IGNvbnRhaW5lciB2YWx1ZSBmb3IgIiArIHR0eXBlLT5nZXRfbmFtZSgpOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHRocm93ICJjYW5ub3QgZ2VuZXJhdGUgY29uc3QgdmFsdWUgZm9yICIgKyB0dHlwZS0+Z2V0X25hbWUoKTsKKyAgfQorfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3Rfc3RydWN0KHRfdHlwZSogdHR5cGUsIHRfY29uc3RfdmFsdWUqKSB7CisgIGlmICgoKHRfc3RydWN0Kil0dHlwZSktPmlzX3VuaW9uKCkpIHsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ1bmltcGxlbWVudGVkISgpIiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInVuaW1wbGVtZW50ZWQhKCkiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X2xpc3QodF90eXBlKiB0dHlwZSwgdF9jb25zdF92YWx1ZSogdHZhbHVlKSB7CisgIHRfdHlwZSogZWxlbV90eXBlID0gKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCBtdXQgbDogVmVjPCIgPDwgdG9fcnVzdF90eXBlKGVsZW1fdHlwZSkgPDwgIj4gPSBWZWM6Om5ldygpOyIgPDwgZW5kbDsKKyAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgZWxlbXMgPSB0dmFsdWUtPmdldF9saXN0KCk7CisgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIGVsZW1faXRlcjsKKyAgZm9yKGVsZW1faXRlciA9IGVsZW1zLmJlZ2luKCk7IGVsZW1faXRlciAhPSBlbGVtcy5lbmQoKTsgKytlbGVtX2l0ZXIpIHsKKyAgICB0X2NvbnN0X3ZhbHVlKiBlbGVtX3ZhbHVlID0gKCplbGVtX2l0ZXIpOworICAgIHJlbmRlcl9jb250YWluZXJfY29uc3RfdmFsdWUoImwucHVzaCIsIGVsZW1fdHlwZSwgZWxlbV92YWx1ZSk7CisgIH0KKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsIiA8PCBlbmRsOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3Rfc2V0KHRfdHlwZSogdHR5cGUsIHRfY29uc3RfdmFsdWUqIHR2YWx1ZSkgeworICB0X3R5cGUqIGVsZW1fdHlwZSA9ICgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCBtdXQgczogQlRyZWVTZXQ8IiA8PCB0b19ydXN0X3R5cGUoZWxlbV90eXBlKSA8PCAiPiA9IEJUcmVlU2V0OjpuZXcoKTsiIDw8IGVuZGw7CisgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIGVsZW1zID0gdHZhbHVlLT5nZXRfbGlzdCgpOworICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciBlbGVtX2l0ZXI7CisgIGZvcihlbGVtX2l0ZXIgPSBlbGVtcy5iZWdpbigpOyBlbGVtX2l0ZXIgIT0gZWxlbXMuZW5kKCk7ICsrZWxlbV9pdGVyKSB7CisgICAgdF9jb25zdF92YWx1ZSogZWxlbV92YWx1ZSA9ICgqZWxlbV9pdGVyKTsKKyAgICByZW5kZXJfY29udGFpbmVyX2NvbnN0X3ZhbHVlKCJzLmluc2VydCIsIGVsZW1fdHlwZSwgZWxlbV92YWx1ZSk7CisgIH0KKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJzIiA8PCBlbmRsOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfbWFwKHRfdHlwZSogdHR5cGUsIHRfY29uc3RfdmFsdWUqIHR2YWx1ZSkgeworICB0X3R5cGUqIGtleV90eXBlID0gKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgdF90eXBlKiB2YWxfdHlwZSA9ICgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisgIGZfZ2VuXworICAgIDw8IGluZGVudCgpCisgICAgPDwgImxldCBtdXQgbTogQlRyZWVNYXA8IgorICAgIDw8IHRvX3J1c3RfdHlwZShrZXlfdHlwZSkgPDwgIiwgIiA8PCB0b19ydXN0X3R5cGUodmFsX3R5cGUpCisgICAgPDwgIj4gPSBCVHJlZU1hcDo6bmV3KCk7IgorICAgIDw8IGVuZGw7CisgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiBlbGVtcyA9IHR2YWx1ZS0+Z2V0X21hcCgpOworICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3IgZWxlbV9pdGVyOworICBmb3IgKGVsZW1faXRlciA9IGVsZW1zLmJlZ2luKCk7IGVsZW1faXRlciAhPSBlbGVtcy5lbmQoKTsgKytlbGVtX2l0ZXIpIHsKKyAgICB0X2NvbnN0X3ZhbHVlKiBrZXlfdmFsdWUgPSBlbGVtX2l0ZXItPmZpcnN0OworICAgIHRfY29uc3RfdmFsdWUqIHZhbF92YWx1ZSA9IGVsZW1faXRlci0+c2Vjb25kOworICAgIGlmIChnZXRfdHJ1ZV90eXBlKGtleV90eXBlKS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0IGsgPSAiOworICAgICAgcmVuZGVyX2NvbnN0X3ZhbHVlKGtleV90eXBlLCBrZXlfdmFsdWUpOworICAgICAgZl9nZW5fIDw8ICI7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCBrID0geyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgcmVuZGVyX2NvbnN0X3ZhbHVlKGtleV90eXBlLCBrZXlfdmFsdWUpOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifTsiIDw8IGVuZGw7CisgICAgfQorICAgIGlmIChnZXRfdHJ1ZV90eXBlKHZhbF90eXBlKS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0IHYgPSAiOworICAgICAgcmVuZGVyX2NvbnN0X3ZhbHVlKHZhbF90eXBlLCB2YWxfdmFsdWUpOworICAgICAgZl9nZW5fIDw8ICI7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCB2ID0geyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgcmVuZGVyX2NvbnN0X3ZhbHVlKHZhbF90eXBlLCB2YWxfdmFsdWUpOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifTsiIDw8IGVuZGw7CisgICAgfQorICAgIGZfZ2VuXyA8PCAgaW5kZW50KCkgPDwgIm0uaW5zZXJ0KGssIHYpOyIgPDwgZW5kbDsKKyAgfQorICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm0iIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9jb250YWluZXJfY29uc3RfdmFsdWUoCisgIGNvbnN0IHN0cmluZyYgaW5zZXJ0X2Z1bmN0aW9uLAorICB0X3R5cGUqIHR0eXBlLAorICB0X2NvbnN0X3ZhbHVlKiB0dmFsdWUKKykgeworICBpZiAoZ2V0X3RydWVfdHlwZSh0dHlwZSktPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8IGluc2VydF9mdW5jdGlvbiA8PCAiKCI7CisgICAgcmVuZGVyX2NvbnN0X3ZhbHVlKHR0eXBlLCB0dmFsdWUpOworICAgIGZfZ2VuXyA8PCAiKTsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8IGluc2VydF9mdW5jdGlvbiA8PCAiKCIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICByZW5kZXJfY29uc3RfdmFsdWUodHR5cGUsIHR2YWx1ZSk7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIik7IiA8PCBlbmRsOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBUeXBlZGVmcworLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7CisgIHN0ZDo6c3RyaW5nIGFjdHVhbF90eXBlID0gdG9fcnVzdF90eXBlKHR0eXBlZGVmLT5nZXRfdHlwZSgpKTsKKyAgZl9nZW5fIDw8ICJwdWIgdHlwZSAiIDw8IHJ1c3Rfc2FmZV9uYW1lKHR0eXBlZGVmLT5nZXRfc3ltYm9saWMoKSkgPDwgIiA9ICIgPDwgYWN0dWFsX3R5cGUgPDwgIjsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBlbmRsOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRW51bXMKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgeworICBzdHJpbmcgZW51bV9uYW1lKHJ1c3RfY2FtZWxfY2FzZSh0ZW51bS0+Z2V0X25hbWUoKSkpOworICByZW5kZXJfZW51bV9kZWZpbml0aW9uKHRlbnVtLCBlbnVtX25hbWUpOworICByZW5kZXJfZW51bV9pbXBsKGVudW1fbmFtZSk7CisgIHJlbmRlcl9lbnVtX2NvbnZlcnNpb24odGVudW0sIGVudW1fbmFtZSk7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9lbnVtX2RlZmluaXRpb24odF9lbnVtKiB0ZW51bSwgY29uc3Qgc3RyaW5nJiBlbnVtX25hbWUpIHsKKyAgcmVuZGVyX3J1c3Rkb2MoKHRfZG9jKikgdGVudW0pOworICBmX2dlbl8gPDwgIiNbZGVyaXZlKENvcHksIENsb25lLCBEZWJ1ZywgRXEsIEhhc2gsIE9yZCwgUGFydGlhbEVxLCBQYXJ0aWFsT3JkKV0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCAicHViIGVudW0gIiA8PCBlbnVtX25hbWUgPDwgIiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjb25zdGFudHNfaXRlcjsKKyAgZm9yIChjb25zdGFudHNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjb25zdGFudHNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY29uc3RhbnRzX2l0ZXIpIHsKKyAgICB0X2VudW1fdmFsdWUqIHZhbCA9ICgqY29uc3RhbnRzX2l0ZXIpOworICAgIHJlbmRlcl9ydXN0ZG9jKCh0X2RvYyopIHZhbCk7CisgICAgZl9nZW5fCisgICAgICA8PCBpbmRlbnQoKQorICAgICAgPDwgcnVzdF9lbnVtX3ZhcmlhbnRfbmFtZSh2YWwtPmdldF9uYW1lKCkpCisgICAgICA8PCAiID0gIgorICAgICAgPDwgdmFsLT5nZXRfdmFsdWUoKQorICAgICAgPDwgIiwiCisgICAgICA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8ICJ9IiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX2VudW1faW1wbChjb25zdCBzdHJpbmcmIGVudW1fbmFtZSkgeworICBmX2dlbl8gPDwgImltcGwgIiA8PCBlbnVtX25hbWUgPDwgIiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBmX2dlbl8KKyAgICA8PCBpbmRlbnQoKQorICAgIDw8ICJwdWIgZm4gd3JpdGVfdG9fb3V0X3Byb3RvY29sKCZzZWxmLCBvX3Byb3Q6ICZtdXQgVE91dHB1dFByb3RvY29sKSAtPiB0aHJpZnQ6OlJlc3VsdDwoKT4geyIKKyAgICA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3Qud3JpdGVfaTMyKCpzZWxmIGFzIGkzMikiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICBmX2dlbl8KKyAgICA8PCBpbmRlbnQoKQorICAgIDw8ICJwdWIgZm4gcmVhZF9mcm9tX2luX3Byb3RvY29sKGlfcHJvdDogJm11dCBUSW5wdXRQcm90b2NvbCkgLT4gdGhyaWZ0OjpSZXN1bHQ8IiA8PCBlbnVtX25hbWUgPDwgIj4geyIKKyAgICA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCBlbnVtX3ZhbHVlID0gaV9wcm90LnJlYWRfaTMyKCk/OyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8IGVudW1fbmFtZSA8PCAiOjp0cnlfZnJvbShlbnVtX3ZhbHVlKSI7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCAifSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9lbnVtX2NvbnZlcnNpb24odF9lbnVtKiB0ZW51bSwgY29uc3Qgc3RyaW5nJiBlbnVtX25hbWUpIHsKKyAgZl9nZW5fIDw8ICJpbXBsIFRyeUZyb208aTMyPiBmb3IgIiA8PCBlbnVtX25hbWUgPDwgIiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInR5cGUgRXJyID0gdGhyaWZ0OjpFcnJvcjsiOworCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiZm4gdHJ5X2Zyb20oaTogaTMyKSAtPiBSZXN1bHQ8U2VsZiwgU2VsZjo6RXJyPiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm1hdGNoIGkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY29uc3RhbnRzX2l0ZXI7CisgIGZvciAoY29uc3RhbnRzX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY29uc3RhbnRzX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NvbnN0YW50c19pdGVyKSB7CisgICAgdF9lbnVtX3ZhbHVlKiB2YWwgPSAoKmNvbnN0YW50c19pdGVyKTsKKyAgICBmX2dlbl8KKyAgICAgIDw8IGluZGVudCgpCisgICAgICA8PCB2YWwtPmdldF92YWx1ZSgpCisgICAgICA8PCAiID0+IE9rKCIgPDwgZW51bV9uYW1lIDw8ICI6OiIgPDwgcnVzdF9lbnVtX3ZhcmlhbnRfbmFtZSh2YWwtPmdldF9uYW1lKCkpIDw8ICIpLCIKKyAgICAgIDw8IGVuZGw7CisgIH0KKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJfID0+IHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICByZW5kZXJfdGhyaWZ0X2Vycm9yKAorICAgICJQcm90b2NvbCIsCisgICAgIlByb3RvY29sRXJyb3IiLAorICAgICJQcm90b2NvbEVycm9yS2luZDo6SW52YWxpZERhdGEiLAorICAgICJmb3JtYXQhKFwiY2Fubm90IGNvbnZlcnQgZW51bSBjb25zdGFudCB7fSB0byAiICsgZW51bV9uYW1lICsgIlwiLCBpKSIKKyAgKTsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9LCIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCAifSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBTdHJ1Y3RzLCBVbmlvbnMgYW5kIEV4Y2VwdGlvbnMKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKKyAgcmVuZGVyX3N0cnVjdChydXN0X3N0cnVjdF9uYW1lKHR4Y2VwdGlvbiksIHR4Y2VwdGlvbiwgdF9yc19nZW5lcmF0b3I6OlRfRVhDRVBUSU9OKTsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGlmICh0c3RydWN0LT5pc191bmlvbigpKSB7CisgICAgcmVuZGVyX3VuaW9uKHRzdHJ1Y3QpOworICB9IGVsc2UgaWYgKHRzdHJ1Y3QtPmlzX3N0cnVjdCgpKSB7CisgICAgcmVuZGVyX3N0cnVjdChydXN0X3N0cnVjdF9uYW1lKHRzdHJ1Y3QpLCB0c3RydWN0LCB0X3JzX2dlbmVyYXRvcjo6VF9SRUdVTEFSKTsKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyAiY2Fubm90IGdlbmVyYXRlIHN0cnVjdCBmb3IgZXhjZXB0aW9uIjsKKyAgfQorfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc3RydWN0KAorICBjb25zdCBzdHJpbmcmIHN0cnVjdF9uYW1lLAorICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgdF9yc19nZW5lcmF0b3I6OmVfc3RydWN0X3R5cGUgc3RydWN0X3R5cGUKKykgeworICByZW5kZXJfdHlwZV9jb21tZW50KHN0cnVjdF9uYW1lKTsKKyAgcmVuZGVyX3N0cnVjdF9kZWZpbml0aW9uKHN0cnVjdF9uYW1lLCB0c3RydWN0LCBzdHJ1Y3RfdHlwZSk7CisgIHJlbmRlcl9zdHJ1Y3RfaW1wbChzdHJ1Y3RfbmFtZSwgdHN0cnVjdCwgc3RydWN0X3R5cGUpOworICBpZiAoc3RydWN0X3R5cGUgPT0gdF9yc19nZW5lcmF0b3I6OlRfUkVHVUxBUiB8fCBzdHJ1Y3RfdHlwZSA9PSB0X3JzX2dlbmVyYXRvcjo6VF9FWENFUFRJT04pIHsKKyAgICByZW5kZXJfc3RydWN0X2RlZmF1bHRfdHJhaXRfaW1wbChzdHJ1Y3RfbmFtZSwgdHN0cnVjdCk7CisgIH0KKyAgaWYgKHN0cnVjdF90eXBlID09IHRfcnNfZ2VuZXJhdG9yOjpUX0VYQ0VQVElPTikgeworICAgIHJlbmRlcl9leGNlcHRpb25fc3RydWN0X2Vycm9yX3RyYWl0X2ltcGxzKHN0cnVjdF9uYW1lLCB0c3RydWN0KTsKKyAgfQorfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc3RydWN0X2RlZmluaXRpb24oCisgIGNvbnN0IHN0cmluZyYgc3RydWN0X25hbWUsCisgIHRfc3RydWN0KiB0c3RydWN0LAorICB0X3JzX2dlbmVyYXRvcjo6ZV9zdHJ1Y3RfdHlwZSBzdHJ1Y3RfdHlwZQorKSB7CisgIHJlbmRlcl9ydXN0ZG9jKCh0X2RvYyopIHRzdHJ1Y3QpOworICBmX2dlbl8gPDwgIiNbZGVyaXZlKENsb25lLCBEZWJ1ZywgRXEsIEhhc2gsIE9yZCwgUGFydGlhbEVxLCBQYXJ0aWFsT3JkKV0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCB2aXNpYmlsaXR5X3F1YWxpZmllcihzdHJ1Y3RfdHlwZSkgPDwgInN0cnVjdCAiIDw8IHN0cnVjdF9uYW1lIDw8ICIgeyIgPDwgZW5kbDsKKworICAvLyByZW5kZXIgdGhlIG1lbWJlcnMKKyAgdmVjdG9yPHRfZmllbGQqPiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIGlmICghbWVtYmVycy5lbXB0eSgpKSB7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICB2ZWN0b3I8dF9maWVsZCo+OjppdGVyYXRvciBtZW1iZXJzX2l0ZXI7CisgICAgZm9yKG1lbWJlcnNfaXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbWVtYmVyc19pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbWVtYmVyc19pdGVyKSB7CisgICAgICB0X2ZpZWxkKiBtZW1iZXIgPSAoKm1lbWJlcnNfaXRlcik7CisgICAgICB0X2ZpZWxkOjplX3JlcSBtZW1iZXJfcmVxID0gYWN0dWFsX2ZpZWxkX3JlcShtZW1iZXIsIHN0cnVjdF90eXBlKTsKKworICAgICAgc3RyaW5nIHJ1c3RfdHlwZSA9IHRvX3J1c3RfdHlwZShtZW1iZXItPmdldF90eXBlKCkpOworICAgICAgcnVzdF90eXBlID0gaXNfb3B0aW9uYWwobWVtYmVyX3JlcSkgPyAiT3B0aW9uPCIgKyBydXN0X3R5cGUgKyAiPiIgOiBydXN0X3R5cGU7CisKKyAgICAgIHJlbmRlcl9ydXN0ZG9jKCh0X2RvYyopIG1lbWJlcik7CisgICAgICBmX2dlbl8KKyAgICAgICAgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgdmlzaWJpbGl0eV9xdWFsaWZpZXIoc3RydWN0X3R5cGUpCisgICAgICAgIDw8IHJ1c3RfZmllbGRfbmFtZShtZW1iZXIpIDw8ICI6ICIgPDwgcnVzdF90eXBlIDw8ICIsIgorICAgICAgICA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICBmX2dlbl8gPDwgIn0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBlbmRsOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfZXhjZXB0aW9uX3N0cnVjdF9lcnJvcl90cmFpdF9pbXBscyhjb25zdCBzdHJpbmcmIHN0cnVjdF9uYW1lLCB0X3N0cnVjdCogdHN0cnVjdCkgeworICAvLyBlcnJvcjo6RXJyb3IgdHJhaXQKKyAgZl9nZW5fIDw8ICJpbXBsIEVycm9yIGZvciAiIDw8IHN0cnVjdF9uYW1lIDw8ICIgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiZm4gZGVzY3JpcHRpb24oJnNlbGYpIC0+ICZzdHIgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiXCIiIDw8ICJyZW1vdGUgc2VydmljZSB0aHJldyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIlwiIiA8PCBlbmRsOyAvLyB1c2UgKm9yaWdpbmFsKiBuYW1lCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8ICJ9IiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKKworICAvLyBjb252ZXJ0OjpGcm9tIHRyYWl0CisgIGZfZ2VuXyA8PCAiaW1wbCBGcm9tPCIgPDwgc3RydWN0X25hbWUgPDwgIj4gZm9yIHRocmlmdDo6RXJyb3IgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiZm4gZnJvbShlOiAiIDw8IHN0cnVjdF9uYW1lIDw8ICIpIC0+IFNlbGYgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAidGhyaWZ0OjpFcnJvcjo6VXNlcihCb3g6Om5ldyhlKSkiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8ICJ9IiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKKworICAvLyBmbXQ6OkRpc3BsYXkgdHJhaXQKKyAgZl9nZW5fIDw8ICJpbXBsIERpc3BsYXkgZm9yICIgPDwgc3RydWN0X25hbWUgPDwgIiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJmbiBmbXQoJnNlbGYsIGY6ICZtdXQgRm9ybWF0dGVyKSAtPiBmbXQ6OlJlc3VsdCB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJzZWxmLmRlc2NyaXB0aW9uKCkuZm10KGYpIiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCAifSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zdHJ1Y3RfZGVmYXVsdF90cmFpdF9pbXBsKGNvbnN0IHN0cmluZyYgc3RydWN0X25hbWUsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGJvb2wgaGFzX3JlcXVpcmVkX2ZpZWxkID0gZmFsc2U7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtZW1iZXJzX2l0ZXI7CisgIGZvciAobWVtYmVyc19pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtZW1iZXJzX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttZW1iZXJzX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBtZW1iZXIgPSAqbWVtYmVyc19pdGVyOworICAgIGlmICghaXNfb3B0aW9uYWwobWVtYmVyLT5nZXRfcmVxKCkpKSB7CisgICAgICBoYXNfcmVxdWlyZWRfZmllbGQgPSB0cnVlOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgaWYgKGhhc19yZXF1aXJlZF9maWVsZCkgeworICAgIHJldHVybjsKKyAgfQorCisgIGZfZ2VuXyA8PCAiaW1wbCBEZWZhdWx0IGZvciAiIDw8IHN0cnVjdF9uYW1lIDw8ICIgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiZm4gZGVmYXVsdCgpIC0+IFNlbGYgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaWYgKG1lbWJlcnMuZW1wdHkoKSkgeworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCBzdHJ1Y3RfbmFtZSA8PCAie30iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8IHN0cnVjdF9uYW1lIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZvciAobWVtYmVyc19pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtZW1iZXJzX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttZW1iZXJzX2l0ZXIpIHsKKyAgICAgIHRfZmllbGQgKm1lbWJlciA9ICgqbWVtYmVyc19pdGVyKTsKKyAgICAgIHN0cmluZyBtZW1iZXJfbmFtZShydXN0X2ZpZWxkX25hbWUobWVtYmVyKSk7CisgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgbWVtYmVyX25hbWUgPDwgIjogIiA8PCBvcHRfaW5fcmVxX291dF92YWx1ZShtZW1iZXItPmdldF90eXBlKCkpIDw8ICIsIiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8ICJ9IiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3N0cnVjdF9pbXBsKAorICBjb25zdCBzdHJpbmcmIHN0cnVjdF9uYW1lLAorICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgdF9yc19nZW5lcmF0b3I6OmVfc3RydWN0X3R5cGUgc3RydWN0X3R5cGUKKykgeworICBmX2dlbl8gPDwgImltcGwgIiA8PCBzdHJ1Y3RfbmFtZSA8PCAiIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGlmIChzdHJ1Y3RfdHlwZSA9PSB0X3JzX2dlbmVyYXRvcjo6VF9SRUdVTEFSIHx8IHN0cnVjdF90eXBlID09IHRfcnNfZ2VuZXJhdG9yOjpUX0VYQ0VQVElPTikgeworICAgIHJlbmRlcl9zdHJ1Y3RfY29uc3RydWN0b3Ioc3RydWN0X25hbWUsIHRzdHJ1Y3QsIHN0cnVjdF90eXBlKTsKKyAgfQorCisgIHJlbmRlcl9zdHJ1Y3Rfc3luY19yZWFkKHN0cnVjdF9uYW1lLCB0c3RydWN0LCBzdHJ1Y3RfdHlwZSk7CisgIHJlbmRlcl9zdHJ1Y3Rfc3luY193cml0ZSh0c3RydWN0LCBzdHJ1Y3RfdHlwZSk7CisKKyAgaWYgKHN0cnVjdF90eXBlID09IHRfcnNfZ2VuZXJhdG9yOjpUX1JFU1VMVCkgeworICAgIHJlbmRlcl9yZXN1bHRfc3RydWN0X3RvX3Jlc3VsdF9tZXRob2QodHN0cnVjdCk7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgIn0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBlbmRsOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc3RydWN0X2NvbnN0cnVjdG9yKAorICBjb25zdCBzdHJpbmcmIHN0cnVjdF9uYW1lLAorICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgdF9yc19nZW5lcmF0b3I6OmVfc3RydWN0X3R5cGUgc3RydWN0X3R5cGUKKykgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1lbWJlcnNfaXRlcjsKKworICAvLyBidWlsZCB0aGUgY29udmVuaWVuY2UgdHlwZSBwYXJhbWV0ZXJzIHRoYXQgYWxsb3dzIHVzIHRvIHBhc3MgdW53cmFwcGVkIHZhbHVlcyB0byBhIGNvbnN0cnVjdG9yIGFuZAorICAvLyBoYXZlIHRoZW0gYXV0b21hdGljYWxseSBjb252ZXJ0ZWQgaW50byBPcHRpb248dmFsdWU+CisgIGJvb2wgZmlyc3RfYXJnID0gdHJ1ZTsKKworICBvc3RyaW5nc3RyZWFtIGdlbmVyaWNfdHlwZV9wYXJhbWV0ZXJzOworICBvc3RyaW5nc3RyZWFtIGdlbmVyaWNfdHlwZV9xdWFsaWZpZXJzOworICBmb3IobWVtYmVyc19pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtZW1iZXJzX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttZW1iZXJzX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBtZW1iZXIgPSAoKm1lbWJlcnNfaXRlcik7CisgICAgdF9maWVsZDo6ZV9yZXEgbWVtYmVyX3JlcSA9IGFjdHVhbF9maWVsZF9yZXEobWVtYmVyLCBzdHJ1Y3RfdHlwZSk7CisKKyAgICBpZiAoaXNfb3B0aW9uYWwobWVtYmVyX3JlcSkpIHsKKyAgICAgIGlmIChmaXJzdF9hcmcpIHsKKyAgICAgICAgZmlyc3RfYXJnID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBnZW5lcmljX3R5cGVfcGFyYW1ldGVycyA8PCAiLCAiOworICAgICAgICBnZW5lcmljX3R5cGVfcXVhbGlmaWVycyA8PCAiLCAiOworICAgICAgfQorICAgICAgZ2VuZXJpY190eXBlX3BhcmFtZXRlcnMgPDwgIkYiIDw8IG1lbWJlci0+Z2V0X2tleSgpOworICAgICAgZ2VuZXJpY190eXBlX3F1YWxpZmllcnMgPDwgIkYiIDw8IG1lbWJlci0+Z2V0X2tleSgpIDw8ICI6IEludG88T3B0aW9uPCIgPDwgdG9fcnVzdF90eXBlKG1lbWJlci0+Z2V0X3R5cGUoKSkgPDwgIj4+IjsKKyAgICB9CisgIH0KKworICBzdHJpbmcgdHlwZV9wYXJhbWV0ZXJfc3RyaW5nID0gZ2VuZXJpY190eXBlX3BhcmFtZXRlcnMuc3RyKCk7CisgIGlmICh0eXBlX3BhcmFtZXRlcl9zdHJpbmcubGVuZ3RoKCkgIT0gMCkgeworICAgIHR5cGVfcGFyYW1ldGVyX3N0cmluZyA9ICI8IiArIHR5cGVfcGFyYW1ldGVyX3N0cmluZyArICI+IjsKKyAgfQorCisgIHN0cmluZyB0eXBlX3F1YWxpZmllcl9zdHJpbmcgPSBnZW5lcmljX3R5cGVfcXVhbGlmaWVycy5zdHIoKTsKKyAgaWYgKHR5cGVfcXVhbGlmaWVyX3N0cmluZy5sZW5ndGgoKSAhPSAwKSB7CisgICAgdHlwZV9xdWFsaWZpZXJfc3RyaW5nID0gIndoZXJlICIgKyB0eXBlX3F1YWxpZmllcl9zdHJpbmcgKyAiICI7CisgIH0KKworICAvLyBub3cgYnVpbGQgdGhlIGFjdHVhbCBjb25zdHJ1Y3RvciBhcmcgbGlzdAorICAvLyB3aGVuIHdlJ3JlIGJ1aWxkaW5nIHRoaXMgbGlzdCB3ZSBoYXZlIHRvIHVzZSB0aGUgdHlwZSBwYXJhbWV0ZXJzIGluIHBsYWNlIG9mIHRoZSBhY3R1YWwgdHlwZSBuYW1lcworICAvLyBpZiBuZWNlc3NhcnkKKyAgb3N0cmluZ3N0cmVhbSBhcmdzOworICBmaXJzdF9hcmcgPSB0cnVlOworICBmb3IobWVtYmVyc19pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtZW1iZXJzX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttZW1iZXJzX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBtZW1iZXIgPSAoKm1lbWJlcnNfaXRlcik7CisgICAgdF9maWVsZDo6ZV9yZXEgbWVtYmVyX3JlcSA9IGFjdHVhbF9maWVsZF9yZXEobWVtYmVyLCBzdHJ1Y3RfdHlwZSk7CisgICAgc3RyaW5nIG1lbWJlcl9uYW1lKHJ1c3RfZmllbGRfbmFtZShtZW1iZXIpKTsKKworICAgIGlmIChmaXJzdF9hcmcpIHsKKyAgICAgIGZpcnN0X2FyZyA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBhcmdzIDw8ICIsICI7CisgICAgfQorCisgICAgaWYgKGlzX29wdGlvbmFsKG1lbWJlcl9yZXEpKSB7CisgICAgICBhcmdzIDw8IG1lbWJlcl9uYW1lIDw8ICI6ICIgPDwgIkYiIDw8IG1lbWJlci0+Z2V0X2tleSgpOworICAgIH0gZWxzZSB7CisgICAgICBhcmdzIDw8IG1lbWJlcl9uYW1lIDw8ICI6ICIgPDwgdG9fcnVzdF90eXBlKG1lbWJlci0+Z2V0X3R5cGUoKSk7CisgICAgfQorICB9CisKKyAgc3RyaW5nIGFyZ19zdHJpbmcgPSBhcmdzLnN0cigpOworCisgIHN0cmluZyB2aXNpYmlsaXR5KHZpc2liaWxpdHlfcXVhbGlmaWVyKHN0cnVjdF90eXBlKSk7CisgIGZfZ2VuXworICAgIDw8IGluZGVudCgpCisgICAgPDwgdmlzaWJpbGl0eQorICAgIDw8ICJmbiBuZXciCisgICAgPDwgdHlwZV9wYXJhbWV0ZXJfc3RyaW5nCisgICAgPDwgIigiCisgICAgPDwgYXJnX3N0cmluZworICAgIDw8ICIpIC0+ICIKKyAgICA8PCBzdHJ1Y3RfbmFtZQorICAgIDw8ICIgIgorICAgIDw8IHR5cGVfcXVhbGlmaWVyX3N0cmluZworICAgIDw8ICJ7IgorICAgIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGlmIChtZW1iZXJzLnNpemUoKSA9PSAwKSB7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8IHN0cnVjdF9uYW1lIDw8ICIge30iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8IHN0cnVjdF9uYW1lIDw8ICIgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGZvcihtZW1iZXJzX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1lbWJlcnNfaXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21lbWJlcnNfaXRlcikgeworICAgICAgdF9maWVsZCogbWVtYmVyID0gKCptZW1iZXJzX2l0ZXIpOworICAgICAgdF9maWVsZDo6ZV9yZXEgbWVtYmVyX3JlcSA9IGFjdHVhbF9maWVsZF9yZXEobWVtYmVyLCBzdHJ1Y3RfdHlwZSk7CisgICAgICBzdHJpbmcgbWVtYmVyX25hbWUocnVzdF9maWVsZF9uYW1lKG1lbWJlcikpOworCisgICAgICBpZiAoaXNfb3B0aW9uYWwobWVtYmVyX3JlcSkpIHsKKyAgICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8IG1lbWJlcl9uYW1lIDw8ICI6ICIgPDwgbWVtYmVyX25hbWUgPDwgIi5pbnRvKCksIiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8IG1lbWJlcl9uYW1lIDw8ICI6ICIgPDwgbWVtYmVyX25hbWUgPDwgIiwiIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9yZXN1bHRfc3RydWN0X3RvX3Jlc3VsdF9tZXRob2QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgLy8gd2UgZG9uJ3QgdXNlIHRoZSBydXN0IHN0cnVjdCBuYW1lIGluIHRoaXMgbWV0aG9kLCBqdXN0IHRoZSBzZXJ2aWNlIGNhbGwgbmFtZQorICBzdHJpbmcgc2VydmljZV9jYWxsX25hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworCisgIC8vIGNoZWNrIHRoYXQgd2UgYWN0dWFsbHkgaGF2ZSBhIHJlc3VsdAorICBzaXplX3QgaW5kZXggPSBzZXJ2aWNlX2NhbGxfbmFtZS5maW5kKFJFU1VMVF9TVFJVQ1RfU1VGRklYLCAwKTsKKyAgaWYgKGluZGV4ID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgdGhyb3cgInJlc3VsdCBzdHJ1Y3QgIiArIHNlcnZpY2VfY2FsbF9uYW1lICsgIiBtaXNzaW5nIHJlc3VsdCBzdWZmaXgiOworICB9IGVsc2UgeworICAgICBzZXJ2aWNlX2NhbGxfbmFtZS5yZXBsYWNlKGluZGV4LCA2LCAiIik7CisgIH0KKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1lbWJlcnNfaXRlcjsKKworICAvLyBmaW5kIG91dCB3aGF0IHRoZSBjYWxsJ3MgZXhwZWN0ZWQgcmV0dXJuIHR5cGUgd2FzCisgIHN0cmluZyBydXN0X3JldHVybl90eXBlID0gIigpIjsKKyAgZm9yKG1lbWJlcnNfaXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbWVtYmVyc19pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbWVtYmVyc19pdGVyKSB7CisgICAgdF9maWVsZCogbWVtYmVyID0gKCptZW1iZXJzX2l0ZXIpOworICAgIGlmIChtZW1iZXItPmdldF9uYW1lKCkgPT0gU0VSVklDRV9SRVNVTFRfVkFSSUFCTEUpIHsgLy8gZG9uJ3QgaGF2ZSB0byBjaGVjayBzYWZlIG5hbWUgaGVyZQorICAgICAgcnVzdF9yZXR1cm5fdHlwZSA9IHRvX3J1c3RfdHlwZShtZW1iZXItPmdldF90eXBlKCkpOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgLy8gTk9URTogaWRlYWxseSBJIHdvdWxkIGdlbmVyYXRlIHRoZSBicmFuY2hlcyBhbmQgcmVuZGVyIHRoZW0gc2VwYXJhdGVseQorICAvLyBJIHRyaWVkIHRoaXMgaG93ZXZlciwgYW5kIHRoZSByZXN1bHRpbmcgY29kZSB3YXMgaGFyZGVyIHRvIHVuZGVyc3RhbmQKKyAgLy8gbWFpbnRhaW5pbmcgYSByZW5kZXJlZCBicmFuY2ggY291bnQgKHdoaWxlIGEgbGl0dGxlIHVnbHkpIGdvdCBtZSB0aGUKKyAgLy8gcmVuZGVyaW5nIEkgd2FudGVkIHdpdGggY29kZSB0aGF0IHdhcyByZWFzb25hYmx5IHVuZGVyc3RhbmRhYmxlCisKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJmbiBva19vcihzZWxmKSAtPiB0aHJpZnQ6OlJlc3VsdDwiIDw8IHJ1c3RfcmV0dXJuX3R5cGUgPDwgIj4geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaW50IHJlbmRlcmVkX2JyYW5jaF9jb3VudCA9IDA7CisKKyAgLy8gcmVuZGVyIHRoZSBleGNlcHRpb24gYnJhbmNoZXMKKyAgZm9yKG1lbWJlcnNfaXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbWVtYmVyc19pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbWVtYmVyc19pdGVyKSB7CisgICAgdF9maWVsZCogdGZpZWxkID0gKCptZW1iZXJzX2l0ZXIpOworICAgIGlmICh0ZmllbGQtPmdldF9uYW1lKCkgIT0gU0VSVklDRV9SRVNVTFRfVkFSSUFCTEUpIHsgLy8gZG9uJ3QgaGF2ZSB0byBjaGVjayBzYWZlIG5hbWUgaGVyZQorICAgICAgc3RyaW5nIGZpZWxkX25hbWUoInNlbGYuIiArIHJ1c3RfZmllbGRfbmFtZSh0ZmllbGQpKTsKKyAgICAgIHN0cmluZyBicmFuY2hfc3RhdGVtZW50ID0gcmVuZGVyZWRfYnJhbmNoX2NvdW50ID09IDAgPyAiaWYiIDogIn0gZWxzZSBpZiI7CisKKyAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCBicmFuY2hfc3RhdGVtZW50IDw8ICIgIiA8PCBmaWVsZF9uYW1lIDw8ICIuaXNfc29tZSgpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiRXJyKHRocmlmdDo6RXJyb3I6OlVzZXIoQm94OjpuZXcoIiA8PCBmaWVsZF9uYW1lIDw8ICIudW53cmFwKCkpKSkiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworCisgICAgICByZW5kZXJlZF9icmFuY2hfY291bnQrKzsKKyAgICB9CisgIH0KKworICAvLyByZW5kZXIgdGhlIHJldHVybiB2YWx1ZSBicmFuY2hlcworICBpZiAocnVzdF9yZXR1cm5fdHlwZSA9PSAiKCkiKSB7CisgICAgaWYgKHJlbmRlcmVkX2JyYW5jaF9jb3VudCA9PSAwKSB7CisgICAgICAvLyB3ZSBoYXZlIHRoZSB1bml0IHJldHVybiBhbmQgdGhpcyBzZXJ2aWNlIGNhbGwgaGFzIG5vIHVzZXItZGVmaW5lZAorICAgICAgLy8gZXhjZXB0aW9ucy4gdGhpcyBtZWFucyB0aGF0IHdlJ3ZlIGEgdHJpdmlhbCByZXR1cm4gKGhhcHBlbnMgd2l0aCBvbmV3YXlzKQorICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJPaygoKSkiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIHdlIGhhdmUgdGhlIHVuaXQgcmV0dXJuLCBidXQgdGhlcmUgYXJlIHVzZXItZGVmaW5lZCBleGNlcHRpb25zCisgICAgICAvLyBpZiB3ZSd2ZSBnb3R0ZW4gdGhpcyBmYXIgdGhlbiB3ZSBoYXZlIHRoZSBkZWZhdWx0IHJldHVybiAoaS5lLiBjYWxsIHN1Y2Nlc3NmdWwpCisgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIk9rKCgpKSIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICB9IGVsc2UgeworICAgIHN0cmluZyBicmFuY2hfc3RhdGVtZW50ID0gcmVuZGVyZWRfYnJhbmNoX2NvdW50ID09IDAgPyAiaWYiIDogIn0gZWxzZSBpZiI7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8IGJyYW5jaF9zdGF0ZW1lbnQgPDwgIiBzZWxmLiIgPDwgU0VSVklDRV9SRVNVTFRfVkFSSUFCTEUgPDwgIi5pc19zb21lKCkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIk9rKHNlbGYuIiA8PCBTRVJWSUNFX1JFU1VMVF9WQVJJQUJMRSA8PCAiLnVud3JhcCgpKSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgLy8gaWYgd2UgaGF2ZW4ndCBmb3VuZCBhIHZhbGlkIHJldHVybiB2YWx1ZSAqb3IqIGEgdXNlciBleGNlcHRpb24KKyAgICAvLyB0aGVuIHdlJ3JlIGluIHRyb3VibGU7IHJldHVybiBhIGRlZmF1bHQgZXJyb3IKKyAgICByZW5kZXJfdGhyaWZ0X2Vycm9yKAorICAgICAgIkFwcGxpY2F0aW9uIiwKKyAgICAgICJBcHBsaWNhdGlvbkVycm9yIiwKKyAgICAgICJBcHBsaWNhdGlvbkVycm9yS2luZDo6TWlzc2luZ1Jlc3VsdCIsCisgICAgICAiXCJubyByZXN1bHQgcmVjZWl2ZWQgZm9yICIgKyBzZXJ2aWNlX2NhbGxfbmFtZSArICJcIiIKKyAgICApOworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfdW5pb24odF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgc3RyaW5nIHVuaW9uX25hbWUocnVzdF9zdHJ1Y3RfbmFtZSh0c3RydWN0KSk7CisgIHJlbmRlcl90eXBlX2NvbW1lbnQodW5pb25fbmFtZSk7CisgIHJlbmRlcl91bmlvbl9kZWZpbml0aW9uKHVuaW9uX25hbWUsIHRzdHJ1Y3QpOworICByZW5kZXJfdW5pb25faW1wbCh1bmlvbl9uYW1lLCB0c3RydWN0KTsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3VuaW9uX2RlZmluaXRpb24oY29uc3Qgc3RyaW5nJiB1bmlvbl9uYW1lLCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIGlmIChtZW1iZXJzLmVtcHR5KCkpIHsKKyAgICB0aHJvdyAiY2Fubm90IGdlbmVyYXRlIHJ1c3QgZW51bSB3aXRoIDAgbWVtYmVycyI7IC8vIG1heSBiZSB2YWxpZCB0aHJpZnQsIGJ1dCBpdCdzIGludmFsaWQgcnVzdAorICB9CisKKyAgZl9nZW5fIDw8ICIjW2Rlcml2ZShDbG9uZSwgRGVidWcsIEVxLCBIYXNoLCBPcmQsIFBhcnRpYWxFcSwgUGFydGlhbE9yZCldIiA8PCBlbmRsOworICBmX2dlbl8gPDwgInB1YiBlbnVtICIgPDwgdW5pb25fbmFtZSA8PCAiIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1lbWJlcl9pdGVyOworICBmb3IobWVtYmVyX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1lbWJlcl9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbWVtYmVyX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiB0ZmllbGQgPSAoKm1lbWJlcl9pdGVyKTsKKyAgICBmX2dlbl8KKyAgICAgIDw8IGluZGVudCgpCisgICAgICA8PCBydXN0X3VuaW9uX2ZpZWxkX25hbWUodGZpZWxkKQorICAgICAgPDwgIigiIDw8IHRvX3J1c3RfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpIDw8ICIpLCIKKyAgICAgIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgIn0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBlbmRsOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfdW5pb25faW1wbChjb25zdCBzdHJpbmcmIHVuaW9uX25hbWUsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGZfZ2VuXyA8PCAiaW1wbCAiIDw8IHVuaW9uX25hbWUgPDwgIiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICByZW5kZXJfdW5pb25fc3luY19yZWFkKHVuaW9uX25hbWUsIHRzdHJ1Y3QpOworICByZW5kZXJfdW5pb25fc3luY193cml0ZSh1bmlvbl9uYW1lLCB0c3RydWN0KTsKKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgIn0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBlbmRsOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gU3luYyBTdHJ1Y3QgV3JpdGUKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zdHJ1Y3Rfc3luY193cml0ZSgKKyAgICB0X3N0cnVjdCAqdHN0cnVjdCwKKyAgICB0X3JzX2dlbmVyYXRvcjo6ZV9zdHJ1Y3RfdHlwZSBzdHJ1Y3RfdHlwZQorKSB7CisgIGZfZ2VuXworICAgIDw8IGluZGVudCgpCisgICAgPDwgdmlzaWJpbGl0eV9xdWFsaWZpZXIoc3RydWN0X3R5cGUpCisgICAgPDwgImZuIHdyaXRlX3RvX291dF9wcm90b2NvbCgmc2VsZiwgb19wcm90OiAmbXV0IFRPdXRwdXRQcm90b2NvbCkgLT4gdGhyaWZ0OjpSZXN1bHQ8KCk+IHsiCisgICAgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gd3JpdGUgc3RydWN0IGhlYWRlciB0byBvdXRwdXQgcHJvdG9jb2wKKyAgLy8gbm90ZTogdXNlIHRoZSAqb3JpZ2luYWwqIHN0cnVjdCBuYW1lIGhlcmUKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgc3RydWN0X2lkZW50ID0gVFN0cnVjdElkZW50aWZpZXI6Om5ldyhcIiIgKyB0c3RydWN0LT5nZXRfbmFtZSgpICsgIlwiKTsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LndyaXRlX3N0cnVjdF9iZWdpbigmc3RydWN0X2lkZW50KT87IiA8PCBlbmRsOworCisgIC8vIHdyaXRlIHN0cnVjdCBtZW1iZXJzIHRvIG91dHB1dCBwcm90b2NvbAorICB2ZWN0b3I8dF9maWVsZCo+IG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgaWYgKCFtZW1iZXJzLmVtcHR5KCkpIHsKKyAgICB2ZWN0b3I8dF9maWVsZCo+OjppdGVyYXRvciBtZW1iZXJzX2l0ZXI7CisgICAgZm9yKG1lbWJlcnNfaXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbWVtYmVyc19pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbWVtYmVyc19pdGVyKSB7CisgICAgICB0X2ZpZWxkKiBtZW1iZXIgPSAoKm1lbWJlcnNfaXRlcik7CisgICAgICB0X2ZpZWxkOjplX3JlcSBtZW1iZXJfcmVxID0gYWN0dWFsX2ZpZWxkX3JlcShtZW1iZXIsIHN0cnVjdF90eXBlKTsKKyAgICAgIHN0cmluZyBtZW1iZXJfdmFyKCJzZWxmLiIgKyBydXN0X2ZpZWxkX25hbWUobWVtYmVyKSk7CisgICAgICByZW5kZXJfc3RydWN0X2ZpZWxkX3N5bmNfd3JpdGUobWVtYmVyX3ZhciwgZmFsc2UsIG1lbWJlciwgbWVtYmVyX3JlcSk7CisgICAgfQorICB9CisKKyAgLy8gd3JpdGUgc3RydWN0IGZvb3RlciB0byBvdXRwdXQgcHJvdG9jb2wKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3Qud3JpdGVfZmllbGRfc3RvcCgpPzsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LndyaXRlX3N0cnVjdF9lbmQoKSIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl91bmlvbl9zeW5jX3dyaXRlKGNvbnN0IHN0cmluZyAmdW5pb25fbmFtZSwgdF9zdHJ1Y3QgKnRzdHJ1Y3QpIHsKKyAgZl9nZW5fCisgICAgPDwgaW5kZW50KCkKKyAgICA8PCAicHViIGZuIHdyaXRlX3RvX291dF9wcm90b2NvbCgmc2VsZiwgb19wcm90OiAmbXV0IFRPdXRwdXRQcm90b2NvbCkgLT4gdGhyaWZ0OjpSZXN1bHQ8KCk+IHsiCisgICAgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gd3JpdGUgc3RydWN0IGhlYWRlciB0byBvdXRwdXQgcHJvdG9jb2wKKyAgLy8gbm90ZTogdXNlIHRoZSAqb3JpZ2luYWwqIHN0cnVjdCBuYW1lIGhlcmUKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgc3RydWN0X2lkZW50ID0gVFN0cnVjdElkZW50aWZpZXI6Om5ldyhcIiIgKyB0c3RydWN0LT5nZXRfbmFtZSgpICsgIlwiKTsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LndyaXRlX3N0cnVjdF9iZWdpbigmc3RydWN0X2lkZW50KT87IiA8PCBlbmRsOworCisgIC8vIHdyaXRlIHRoZSBlbnVtIGZpZWxkIHRvIHRoZSBvdXRwdXQgcHJvdG9jb2wKKyAgdmVjdG9yPHRfZmllbGQqPiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIGlmICghbWVtYmVycy5lbXB0eSgpKSB7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJtYXRjaCAqc2VsZiB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46Oml0ZXJhdG9yIG1lbWJlcnNfaXRlcjsKKyAgICBmb3IobWVtYmVyc19pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtZW1iZXJzX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttZW1iZXJzX2l0ZXIpIHsKKyAgICAgIHRfZmllbGQqIG1lbWJlciA9ICgqbWVtYmVyc19pdGVyKTsKKyAgICAgIHRfZmllbGQ6OmVfcmVxIG1lbWJlcl9yZXEgPSB0X2ZpZWxkOjpUX1JFUVVJUkVEOworICAgICAgdF90eXBlKiB0dHlwZSA9IG1lbWJlci0+Z2V0X3R5cGUoKTsKKyAgICAgIHN0cmluZyBtYXRjaF92YXIoKHR0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiAhdHR5cGUtPmlzX3N0cmluZygpKSA/ICJmIiA6ICJyZWYgZiIpOworICAgICAgZl9nZW5fCisgICAgICAgIDw8IGluZGVudCgpCisgICAgICAgIDw8IHVuaW9uX25hbWUgPDwgIjo6IiA8PCBydXN0X3VuaW9uX2ZpZWxkX25hbWUobWVtYmVyKQorICAgICAgICA8PCAiKCIgPDwgbWF0Y2hfdmFyIDw8ICIpID0+IHsiCisgICAgICAgIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIHJlbmRlcl9zdHJ1Y3RfZmllbGRfc3luY193cml0ZSgiZiIsIHRydWUsIG1lbWJlciwgbWVtYmVyX3JlcSk7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9LCIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKworICAvLyB3cml0ZSBzdHJ1Y3QgZm9vdGVyIHRvIG91dHB1dCBwcm90b2NvbAorICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC53cml0ZV9maWVsZF9zdG9wKCk/OyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3Qud3JpdGVfc3RydWN0X2VuZCgpIiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3N0cnVjdF9maWVsZF9zeW5jX3dyaXRlKAorICBjb25zdCBzdHJpbmcgJmZpZWxkX3ZhciwKKyAgYm9vbCBmaWVsZF92YXJfaXNfcmVmLAorICB0X2ZpZWxkICp0ZmllbGQsCisgIHRfZmllbGQ6OmVfcmVxIHJlcQorKSB7CisgIHRfdHlwZSogZmllbGRfdHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKKyAgdF90eXBlKiBhY3R1YWxfdHlwZSA9IGdldF90cnVlX3R5cGUoZmllbGRfdHlwZSk7CisKKyAgb3N0cmluZ3N0cmVhbSBmaWVsZF9zdHJlYW07CisgIGZpZWxkX3N0cmVhbQorICAgIDw8ICJURmllbGRJZGVudGlmaWVyOjpuZXcoIgorICAgIDw8ICJcIiIgPDwgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICJcIiIgPDwgIiwgIiAvLyBub3RlOiB1c2UgKm9yaWdpbmFsKiBuYW1lCisgICAgPDwgdG9fcnVzdF9maWVsZF90eXBlX2VudW0oZmllbGRfdHlwZSkgPDwgIiwgIgorICAgIDw8IHRmaWVsZC0+Z2V0X2tleSgpIDw8ICIpIjsKKyAgc3RyaW5nIGZpZWxkX2lkZW50X3N0cmluZyA9IGZpZWxkX3N0cmVhbS5zdHIoKTsKKworICBpZiAoaXNfb3B0aW9uYWwocmVxKSkgeworICAgIHN0cmluZyBsZXRfdmFyKChhY3R1YWxfdHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgIWFjdHVhbF90eXBlLT5pc19zdHJpbmcoKSkgPyAiZmxkX3ZhciIgOiAicmVmIGZsZF92YXIiKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImlmIGxldCBTb21lKCIgPDwgbGV0X3ZhciA8PCAiKSA9ICIgPDwgZmllbGRfdmFyIDw8ICIgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmIiA8PCBmaWVsZF9pZGVudF9zdHJpbmcgPDwgIik/OyIgPDwgZW5kbDsKKyAgICByZW5kZXJfdHlwZV9zeW5jX3dyaXRlKCJmbGRfdmFyIiwgdHJ1ZSwgZmllbGRfdHlwZSk7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCk/OyIgPDwgZW5kbDsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIigpIiA8PCBlbmRsOyAvLyBGSVhNRTogcmVtb3ZlIHRoaXMgZXh0cmFuZW91cyAnKCknCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOyAvLyBGSVhNRTogcmVtb3ZlIGVsc2UgYnJhbmNoCisgICAgaW5kZW50X3VwKCk7CisgICAgLyogRklYTUU6IHJldGhpbmsgaG93IEkgZGVhbCB3aXRoIE9QVF9JTl9SRVFfT1VUCisgICAgaWYgKHJlcSA9PSB0X2ZpZWxkOjpUX09QVF9JTl9SRVFfT1VUKSB7CisgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCBmaWVsZF9pZGVudCA9ICIgPDwgZmllbGRfaWRlbnRfc3RyaW5nIDw8ICI7IiA8PCBlbmRsOworICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50KT87IiA8PCBlbmRsOworICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCk/OyIgPDwgZW5kbDsKKyAgICB9Ki8KKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIigpIiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCYiIDw8IGZpZWxkX2lkZW50X3N0cmluZyA8PCAiKT87IiA8PCBlbmRsOworICAgIHJlbmRlcl90eXBlX3N5bmNfd3JpdGUoZmllbGRfdmFyLCBmaWVsZF92YXJfaXNfcmVmLCB0ZmllbGQtPmdldF90eXBlKCkpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LndyaXRlX2ZpZWxkX2VuZCgpPzsiIDw8IGVuZGw7CisgIH0KK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3R5cGVfc3luY193cml0ZShjb25zdCBzdHJpbmcgJnR5cGVfdmFyLCBib29sIHR5cGVfdmFyX2lzX3JlZiwgdF90eXBlICp0dHlwZSkgeworICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGUqIHRiYXNlX3R5cGUgPSAodF9iYXNlX3R5cGUqKXR0eXBlOworICAgIHN3aXRjaCAodGJhc2VfdHlwZS0+Z2V0X2Jhc2UoKSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHRocm93ICJjYW5ub3Qgd3JpdGUgZmllbGQgb2YgdHlwZSBUWVBFX1ZPSUQgdG8gb3V0cHV0IHByb3RvY29sIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzogeworICAgICAgc3RyaW5nIHJlZih0eXBlX3Zhcl9pc19yZWYgPyAiIiA6ICImIik7CisgICAgICBpZiAodGJhc2VfdHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3Qud3JpdGVfYnl0ZXMoIiArIHJlZiArIHR5cGVfdmFyICsgIik/OyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LndyaXRlX3N0cmluZygiICsgcmVmICsgdHlwZV92YXIgKyAiKT87IiA8PCBlbmRsOworICAgICAgfQorICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC53cml0ZV9ib29sKCIgKyB0eXBlX3ZhciArICIpPzsiIDw8IGVuZGw7CisgICAgICByZXR1cm47CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LndyaXRlX2k4KCIgKyB0eXBlX3ZhciArICIpPzsiIDw8IGVuZGw7CisgICAgICByZXR1cm47CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC53cml0ZV9pMTYoIiArIHR5cGVfdmFyICsgIik/OyIgPDwgZW5kbDsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LndyaXRlX2kzMigiICsgdHlwZV92YXIgKyAiKT87IiA8PCBlbmRsOworICAgICAgcmV0dXJuOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3Qud3JpdGVfaTY0KCIgKyB0eXBlX3ZhciArICIpPzsiIDw8IGVuZGw7CisgICAgICByZXR1cm47CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC53cml0ZV9kb3VibGUoIiArIHR5cGVfdmFyICsgIi5pbnRvKCkpPzsiIDw8IGVuZGw7CisgICAgICByZXR1cm47CisgICAgfQorICB9IGVsc2UgaWYgKHR0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICB0X3R5cGVkZWYqIHR0eXBlZGVmID0gKHRfdHlwZWRlZiopIHR0eXBlOworICAgIHJlbmRlcl90eXBlX3N5bmNfd3JpdGUodHlwZV92YXIsIHR5cGVfdmFyX2lzX3JlZiwgdHR5cGVkZWYtPmdldF90eXBlKCkpOworICAgIHJldHVybjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpIHx8IHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCB0eXBlX3ZhciArICIud3JpdGVfdG9fb3V0X3Byb3RvY29sKG9fcHJvdCk/OyIgPDwgZW5kbDsKKyAgICByZXR1cm47CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmVuZGVyX21hcF9zeW5jX3dyaXRlKHR5cGVfdmFyLCB0eXBlX3Zhcl9pc19yZWYsICh0X21hcCAqKSB0dHlwZSk7CisgICAgcmV0dXJuOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIHJlbmRlcl9zZXRfc3luY193cml0ZSh0eXBlX3ZhciwgdHlwZV92YXJfaXNfcmVmLCAodF9zZXQgKikgdHR5cGUpOworICAgIHJldHVybjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmVuZGVyX2xpc3Rfc3luY193cml0ZSh0eXBlX3ZhciwgdHlwZV92YXJfaXNfcmVmLCAodF9saXN0ICopIHR0eXBlKTsKKyAgICByZXR1cm47CisgIH0KKworICB0aHJvdyAiY2Fubm90IHdyaXRlIHVuc3VwcG9ydGVkIHR5cGUgIiArIHR0eXBlLT5nZXRfbmFtZSgpOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfbGlzdF9zeW5jX3dyaXRlKGNvbnN0IHN0cmluZyAmbGlzdF92YXIsIGJvb2wgbGlzdF92YXJfaXNfcmVmLCB0X2xpc3QgKnRsaXN0KSB7CisgIHRfdHlwZSogZWxlbV90eXBlID0gdGxpc3QtPmdldF9lbGVtX3R5cGUoKTsKKworICBmX2dlbl8KKyAgICA8PCBpbmRlbnQoKQorICAgIDw8ICJvX3Byb3Qud3JpdGVfbGlzdF9iZWdpbigiCisgICAgPDwgIiZUTGlzdElkZW50aWZpZXI6Om5ldygiCisgICAgPDwgdG9fcnVzdF9maWVsZF90eXBlX2VudW0oZWxlbV90eXBlKSA8PCAiLCAiCisgICAgPDwgbGlzdF92YXIgPDwgIi5sZW4oKSBhcyBpMzIiIDw8ICIpIgorICAgIDw8ICIpPzsiCisgICAgPDwgZW5kbDsKKworICBzdHJpbmcgcmVmKGxpc3RfdmFyX2lzX3JlZiA/ICIiIDogIiYiKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJmb3IgZSBpbiAiIDw8IHJlZiA8PCBsaXN0X3ZhciA8PCAiIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICByZW5kZXJfdHlwZV9zeW5jX3dyaXRlKHN0cmluZ19jb250YWluZXJfd3JpdGVfdmFyaWFibGUoZWxlbV90eXBlLCAiZSIpLCB0cnVlLCBlbGVtX3R5cGUpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC53cml0ZV9saXN0X2VuZCgpPzsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3NldF9zeW5jX3dyaXRlKGNvbnN0IHN0cmluZyAmc2V0X3ZhciwgYm9vbCBzZXRfdmFyX2lzX3JlZiwgdF9zZXQgKnRzZXQpIHsKKyAgdF90eXBlKiBlbGVtX3R5cGUgPSB0c2V0LT5nZXRfZWxlbV90eXBlKCk7CisKKyAgZl9nZW5fCisgICAgPDwgaW5kZW50KCkKKyAgICA8PCAib19wcm90LndyaXRlX3NldF9iZWdpbigiCisgICAgPDwgIiZUU2V0SWRlbnRpZmllcjo6bmV3KCIKKyAgICA8PCB0b19ydXN0X2ZpZWxkX3R5cGVfZW51bShlbGVtX3R5cGUpIDw8ICIsICIKKyAgICA8PCBzZXRfdmFyIDw8ICIubGVuKCkgYXMgaTMyIiA8PCAiKSIKKyAgICA8PCAiKT87IgorICAgIDw8IGVuZGw7CisKKyAgc3RyaW5nIHJlZihzZXRfdmFyX2lzX3JlZiA/ICIiIDogIiYiKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJmb3IgZSBpbiAiIDw8IHJlZiA8PCBzZXRfdmFyIDw8ICIgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIHJlbmRlcl90eXBlX3N5bmNfd3JpdGUoc3RyaW5nX2NvbnRhaW5lcl93cml0ZV92YXJpYWJsZShlbGVtX3R5cGUsICJlIiksIHRydWUsIGVsZW1fdHlwZSk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LndyaXRlX3NldF9lbmQoKT87IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9tYXBfc3luY193cml0ZShjb25zdCBzdHJpbmcgJm1hcF92YXIsIGJvb2wgbWFwX3Zhcl9pc19yZWYsIHRfbWFwICp0bWFwKSB7CisgIHRfdHlwZSoga2V5X3R5cGUgPSB0bWFwLT5nZXRfa2V5X3R5cGUoKTsKKyAgdF90eXBlKiB2YWxfdHlwZSA9IHRtYXAtPmdldF92YWxfdHlwZSgpOworCisgIGZfZ2VuXworICAgIDw8IGluZGVudCgpCisgICAgPDwgIm9fcHJvdC53cml0ZV9tYXBfYmVnaW4oIgorICAgIDw8ICImVE1hcElkZW50aWZpZXI6Om5ldygiCisgICAgPDwgdG9fcnVzdF9maWVsZF90eXBlX2VudW0oa2V5X3R5cGUpIDw8ICIsICIKKyAgICA8PCB0b19ydXN0X2ZpZWxkX3R5cGVfZW51bSh2YWxfdHlwZSkgPDwgIiwgIgorICAgIDw8IG1hcF92YXIgPDwgIi5sZW4oKSBhcyBpMzIpIgorICAgIDw8ICIpPzsiCisgICAgPDwgZW5kbDsKKworICBzdHJpbmcgcmVmKG1hcF92YXJfaXNfcmVmID8gIiIgOiAiJiIpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImZvciAoaywgdikgaW4gIiA8PCByZWYgPDwgbWFwX3ZhciA8PCAiIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICByZW5kZXJfdHlwZV9zeW5jX3dyaXRlKHN0cmluZ19jb250YWluZXJfd3JpdGVfdmFyaWFibGUoa2V5X3R5cGUsICJrIiksIHRydWUsIGtleV90eXBlKTsKKyAgcmVuZGVyX3R5cGVfc3luY193cml0ZShzdHJpbmdfY29udGFpbmVyX3dyaXRlX3ZhcmlhYmxlKHZhbF90eXBlLCAidiIpLCB0cnVlLCB2YWxfdHlwZSk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LndyaXRlX21hcF9lbmQoKT87IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6c3RyaW5nX2NvbnRhaW5lcl93cml0ZV92YXJpYWJsZSh0X3R5cGUqIHR0eXBlLCBjb25zdCBzdHJpbmcmIGJhc2VfdmFyKSB7CisgIGJvb2wgdHlwZV9uZWVkc19kZXJlZiA9IG5lZWRzX2RlcmVmX29uX2NvbnRhaW5lcl93cml0ZSh0dHlwZSk7CisgIGJvb2wgdHlwZV9pc19kb3VibGUgPSBpc19kb3VibGUodHR5cGUpOworCisgIHN0cmluZyB3cml0ZV92YXJpYWJsZTsKKworICBpZiAodHlwZV9pc19kb3VibGUgJiYgdHlwZV9uZWVkc19kZXJlZikgeworICAgIHdyaXRlX3ZhcmlhYmxlID0gIigqIiArIGJhc2VfdmFyICsgIikiOworICB9IGVsc2UgaWYgKHR5cGVfbmVlZHNfZGVyZWYpIHsKKyAgICB3cml0ZV92YXJpYWJsZSA9ICIqIiArIGJhc2VfdmFyOworICB9IGVsc2UgeworICAgIHdyaXRlX3ZhcmlhYmxlID0gYmFzZV92YXI7CisgIH0KKworICByZXR1cm4gd3JpdGVfdmFyaWFibGU7Cit9CisKK2Jvb2wgdF9yc19nZW5lcmF0b3I6Om5lZWRzX2RlcmVmX29uX2NvbnRhaW5lcl93cml0ZSh0X3R5cGUqIHR0eXBlKSB7CisgIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7CisgIHJldHVybiB0dHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgIXR0eXBlLT5pc19zdHJpbmcoKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFN5bmMgU3RydWN0IFJlYWQKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zdHJ1Y3Rfc3luY19yZWFkKAorICAgIGNvbnN0IHN0cmluZyAmc3RydWN0X25hbWUsCisgICAgdF9zdHJ1Y3QgKnRzdHJ1Y3QsIHRfcnNfZ2VuZXJhdG9yOjplX3N0cnVjdF90eXBlIHN0cnVjdF90eXBlCispIHsKKyAgZl9nZW5fCisgICAgPDwgaW5kZW50KCkKKyAgICA8PCB2aXNpYmlsaXR5X3F1YWxpZmllcihzdHJ1Y3RfdHlwZSkKKyAgICA8PCAiZm4gcmVhZF9mcm9tX2luX3Byb3RvY29sKGlfcHJvdDogJm11dCBUSW5wdXRQcm90b2NvbCkgLT4gdGhyaWZ0OjpSZXN1bHQ8IiA8PCBzdHJ1Y3RfbmFtZSA8PCAiPiB7IgorICAgIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJpX3Byb3QucmVhZF9zdHJ1Y3RfYmVnaW4oKT87IiA8PCBlbmRsOworCisgIC8vIGNyZWF0ZSB0ZW1wb3JhcnkgdmFyaWFibGVzOiBvbmUgZm9yIGVhY2ggZmllbGQgaW4gdGhlIHN0cnVjdAorICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+IG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbWVtYmVyc19pdGVyOworICBmb3IgKG1lbWJlcnNfaXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbWVtYmVyc19pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbWVtYmVyc19pdGVyKSB7CisgICAgdF9maWVsZCogbWVtYmVyID0gKCptZW1iZXJzX2l0ZXIpOworICAgIHRfZmllbGQ6OmVfcmVxIG1lbWJlcl9yZXEgPSBhY3R1YWxfZmllbGRfcmVxKG1lbWJlciwgc3RydWN0X3R5cGUpOworCisgICAgZl9nZW5fCisgICAgICA8PCBpbmRlbnQoKQorICAgICAgPDwgImxldCBtdXQgIiA8PCBzdHJ1Y3RfZmllbGRfcmVhZF90ZW1wX3ZhcmlhYmxlKG1lbWJlcikKKyAgICAgIDw8ICI6IE9wdGlvbjwiIDw8IHRvX3J1c3RfdHlwZShtZW1iZXItPmdldF90eXBlKCkpIDw8ICI+ID0gIjsKKyAgICAgIGlmIChtZW1iZXJfcmVxID09IHRfZmllbGQ6OlRfT1BUX0lOX1JFUV9PVVQpIHsKKyAgICAgICAgZl9nZW5fIDw8IG9wdF9pbl9yZXFfb3V0X3ZhbHVlKG1lbWJlci0+Z2V0X3R5cGUoKSkgPDwgIjsiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9nZW5fIDw8ICJOb25lOyI7CisgICAgICB9CisgICAgICBmX2dlbl8gPDwgZW5kbDsKKyAgfQorCisgIC8vIG5vdyBsb29wIHRocm91Z2ggdGhlIGZpZWxkcyB3ZSd2ZSByZWNlaXZlZAorICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxvb3AgeyIgPDwgZW5kbDsgLy8gc3RhcnQgbG9vcAorICBpbmRlbnRfdXAoKTsKKworICAvLyBicmVhayBvdXQgaWYgeW91J3ZlIGZvdW5kIHRoZSBTdG9wIGZpZWxkCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0IGZpZWxkX2lkZW50ID0gaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKT87IiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImlmIGZpZWxkX2lkZW50LmZpZWxkX3R5cGUgPT0gVFR5cGU6OlN0b3AgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgLy8gbm93IHJlYWQgYWxsIHRoZSBmaWVsZHMgZm91bmQKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgZmllbGRfaWQgPSBmaWVsZF9pZCgmZmllbGRfaWRlbnQpPzsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibWF0Y2ggZmllbGRfaWQgeyIgPDwgZW5kbDsgLy8gc3RhcnQgbWF0Y2gKKyAgaW5kZW50X3VwKCk7CisKKyAgZm9yIChtZW1iZXJzX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1lbWJlcnNfaXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21lbWJlcnNfaXRlcikgeworICAgIHRfZmllbGQqIHRmaWVsZCA9ICgqbWVtYmVyc19pdGVyKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgdGZpZWxkLT5nZXRfa2V5KCkgPDwgIiA9PiB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIHJlbmRlcl90eXBlX3N5bmNfcmVhZCgidmFsIiwgdGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgc3RydWN0X2ZpZWxkX3JlYWRfdGVtcF92YXJpYWJsZSh0ZmllbGQpIDw8ICIgPSBTb21lKHZhbCk7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9LCIgPDwgZW5kbDsKKyAgfQorCisgIC8vIGRlZmF1bHQgY2FzZSAoc2tpcCBmaWVsZHMpCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiXyA9PiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJpX3Byb3Quc2tpcChmaWVsZF9pZGVudC5maWVsZF90eXBlKT87IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0sIiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifTsiIDw8IGVuZGw7IC8vIGZpbmlzaCBtYXRjaAorICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpPzsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsgLy8gZmluaXNoIGxvb3AKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJpX3Byb3QucmVhZF9zdHJ1Y3RfZW5kKCk/OyIgPDwgZW5kbDsgLy8gcmVhZCBtZXNzYWdlIGZvb3RlciBmcm9tIHRoZSB3aXJlCisKKyAgLy8gdmVyaWZ5IHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBleGlzdAorICBmb3IgKG1lbWJlcnNfaXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbWVtYmVyc19pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbWVtYmVyc19pdGVyKSB7CisgICAgdF9maWVsZCogdGZpZWxkID0gKCptZW1iZXJzX2l0ZXIpOworICAgIHRfZmllbGQ6OmVfcmVxIHJlcSA9IGFjdHVhbF9maWVsZF9yZXEodGZpZWxkLCBzdHJ1Y3RfdHlwZSk7CisgICAgaWYgKCFpc19vcHRpb25hbChyZXEpKSB7CisgICAgICBmX2dlbl8KKyAgICAgICAgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgInZlcmlmeV9yZXF1aXJlZF9maWVsZF9leGlzdHMoIgorICAgICAgICA8PCAiXCIiIDw8IHN0cnVjdF9uYW1lIDw8ICIuIiA8PCBydXN0X2ZpZWxkX25hbWUodGZpZWxkKSA8PCAiXCIiCisgICAgICAgIDw8ICIsICIKKyAgICAgICAgPDwgIiYiIDw8IHN0cnVjdF9maWVsZF9yZWFkX3RlbXBfdmFyaWFibGUodGZpZWxkKQorICAgICAgICA8PCAiKT87IiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIC8vIGNvbnN0cnVjdCB0aGUgc3RydWN0CisgIGlmIChtZW1iZXJzLnNpemUoKSA9PSAwKSB7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgcmV0ID0gIiA8PCBzdHJ1Y3RfbmFtZSA8PCAiIHt9OyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCByZXQgPSAiIDw8IHN0cnVjdF9uYW1lIDw8ICIgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGZvciAobWVtYmVyc19pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtZW1iZXJzX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttZW1iZXJzX2l0ZXIpIHsKKyAgICAgIHRfZmllbGQqIHRmaWVsZCA9ICgqbWVtYmVyc19pdGVyKTsKKyAgICAgIHRfZmllbGQ6OmVfcmVxIHJlcSA9IGFjdHVhbF9maWVsZF9yZXEodGZpZWxkLCBzdHJ1Y3RfdHlwZSk7CisgICAgICBzdHJpbmcgZmllbGRfbmFtZShydXN0X2ZpZWxkX25hbWUodGZpZWxkKSk7CisgICAgICBzdHJpbmcgZmllbGRfa2V5ID0gc3RydWN0X2ZpZWxkX3JlYWRfdGVtcF92YXJpYWJsZSh0ZmllbGQpOworICAgICAgaWYgKGlzX29wdGlvbmFsKHJlcSkpIHsKKyAgICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8IGZpZWxkX25hbWUgPDwgIjogIiA8PCBmaWVsZF9rZXkgPDwgIiwiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX2dlbl8KKyAgICAgICAgICA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8IGZpZWxkX25hbWUKKyAgICAgICAgICA8PCAiOiAiCisgICAgICAgICAgPDwgZmllbGRfa2V5CisgICAgICAgICAgPDwgIi5leHBlY3QoXCJhdXRvLWdlbmVyYXRlZCBjb2RlIHNob3VsZCBoYXZlIGNoZWNrZWQgZm9yIHByZXNlbmNlIG9mIHJlcXVpcmVkIGZpZWxkc1wiKSIKKyAgICAgICAgICA8PCAiLCIKKyAgICAgICAgICA8PCBlbmRsOworICAgICAgfQorICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9OyIgPDwgZW5kbDsKKyAgfQorCisgIC8vIHJldHVybiB0aGUgY29uc3RydWN0ZWQgdmFsdWUKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJPayhyZXQpIiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3VuaW9uX3N5bmNfcmVhZChjb25zdCBzdHJpbmcgJnVuaW9uX25hbWUsIHRfc3RydWN0ICp0c3RydWN0KSB7CisgIGZfZ2VuXworICAgIDw8IGluZGVudCgpCisgICAgPDwgInB1YiBmbiByZWFkX2Zyb21faW5fcHJvdG9jb2woaV9wcm90OiAmbXV0IFRJbnB1dFByb3RvY29sKSAtPiB0aHJpZnQ6OlJlc3VsdDwiIDw8IHVuaW9uX25hbWUgPDwgIj4geyIKKyAgICA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICAvLyBjcmVhdGUgdGVtcG9yYXJ5IHZhcmlhYmxlcyB0byBob2xkIHRoZQorICAvLyBjb21wbGV0ZWQgdW5pb24gYXMgd2VsbCBhcyBhIGNvdW50IG9mIGZpZWxkcyByZWFkCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0IG11dCByZXQ6IE9wdGlvbjwiIDw8IHVuaW9uX25hbWUgPDwgIj4gPSBOb25lOyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgbXV0IHJlY2VpdmVkX2ZpZWxkX2NvdW50ID0gMDsiIDw8IGVuZGw7CisKKyAgLy8gcmVhZCB0aGUgc3RydWN0IHByZWFtYmxlCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiaV9wcm90LnJlYWRfc3RydWN0X2JlZ2luKCk/OyIgPDwgZW5kbDsKKworICAvLyBub3cgbG9vcCB0aHJvdWdoIHRoZSBmaWVsZHMgd2UndmUgcmVjZWl2ZWQKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsb29wIHsiIDw8IGVuZGw7IC8vIHN0YXJ0IGxvb3AKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gYnJlYWsgb3V0IGlmIHlvdSd2ZSBmb3VuZCB0aGUgU3RvcCBmaWVsZAorICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCBmaWVsZF9pZGVudCA9IGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCk/OyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJpZiBmaWVsZF9pZGVudC5maWVsZF90eXBlID09IFRUeXBlOjpTdG9wIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgIC8vIG5vdyByZWFkIGFsbCB0aGUgZmllbGRzIGZvdW5kCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0IGZpZWxkX2lkID0gZmllbGRfaWQoJmZpZWxkX2lkZW50KT87IiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm1hdGNoIGZpZWxkX2lkIHsiIDw8IGVuZGw7IC8vIHN0YXJ0IG1hdGNoCisgIGluZGVudF91cCgpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4gbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtZW1iZXJzX2l0ZXI7CisgIGZvciAobWVtYmVyc19pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtZW1iZXJzX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttZW1iZXJzX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBtZW1iZXIgPSAoKm1lbWJlcnNfaXRlcik7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8IG1lbWJlci0+Z2V0X2tleSgpIDw8ICIgPT4geyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICByZW5kZXJfdHlwZV9zeW5jX3JlYWQoInZhbCIsIG1lbWJlci0+Z2V0X3R5cGUoKSk7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJpZiByZXQuaXNfbm9uZSgpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZl9nZW5fCisgICAgICA8PCBpbmRlbnQoKQorICAgICAgPDwgInJldCA9IFNvbWUoIiA8PCB1bmlvbl9uYW1lIDw8ICI6OiIgPDwgcnVzdF91bmlvbl9maWVsZF9uYW1lKG1lbWJlcikgPDwgIih2YWwpKTsiCisgICAgICA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAicmVjZWl2ZWRfZmllbGRfY291bnQgKz0gMTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0sIiA8PCBlbmRsOworICB9CisKKyAgLy8gZGVmYXVsdCBjYXNlIChza2lwIGZpZWxkcykKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJfID0+IHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImlfcHJvdC5za2lwKGZpZWxkX2lkZW50LmZpZWxkX3R5cGUpPzsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAicmVjZWl2ZWRfZmllbGRfY291bnQgKz0gMTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSwiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9OyIgPDwgZW5kbDsgLy8gZmluaXNoIG1hdGNoCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiaV9wcm90LnJlYWRfZmllbGRfZW5kKCk/OyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOyAvLyBmaW5pc2ggbG9vcAorICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImlfcHJvdC5yZWFkX3N0cnVjdF9lbmQoKT87IiA8PCBlbmRsOyAvLyBmaW5pc2ggcmVhZGluZyBtZXNzYWdlIGZyb20gd2lyZQorCisgIC8vIHJldHVybiB0aGUgdmFsdWUgb3IgYW4gZXJyb3IKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJpZiByZWNlaXZlZF9maWVsZF9jb3VudCA9PSAwIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICByZW5kZXJfdGhyaWZ0X2Vycm9yKAorICAgICJQcm90b2NvbCIsCisgICAgIlByb3RvY29sRXJyb3IiLAorICAgICJQcm90b2NvbEVycm9yS2luZDo6SW52YWxpZERhdGEiLAorICAgICJcInJlY2VpdmVkIGVtcHR5IHVuaW9uIGZyb20gcmVtb3RlICIgKyB1bmlvbl9uYW1lICsgIlwiIgorICApOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0gZWxzZSBpZiByZWNlaXZlZF9maWVsZF9jb3VudCA+IDEgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIHJlbmRlcl90aHJpZnRfZXJyb3IoCisgICAgIlByb3RvY29sIiwKKyAgICAiUHJvdG9jb2xFcnJvciIsCisgICAgIlByb3RvY29sRXJyb3JLaW5kOjpJbnZhbGlkRGF0YSIsCisgICAgIlwicmVjZWl2ZWQgbXVsdGlwbGUgZmllbGRzIGZvciB1bmlvbiBmcm9tIHJlbW90ZSAiICsgdW5pb25fbmFtZSArICJcIiIKKyAgKTsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiT2socmV0LmV4cGVjdChcInJldHVybiB2YWx1ZSBzaG91bGQgaGF2ZSBiZWVuIGNvbnN0cnVjdGVkXCIpKSIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKK30KKworLy8gQ29uc3RydWN0IHRoZSBydXN0IHJlcHJlc2VudGF0aW9uIG9mIGFsbCBzdXBwb3J0ZWQgdHlwZXMgZnJvbSB0aGUgd2lyZS4KK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl90eXBlX3N5bmNfcmVhZChjb25zdCBzdHJpbmcgJnR5cGVfdmFyLCB0X3R5cGUgKnR0eXBlLCBib29sIGlzX2JveGVkKSB7CisgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZSogdGJhc2VfdHlwZSA9ICh0X2Jhc2VfdHlwZSopdHR5cGU7CisgICAgc3dpdGNoICh0YmFzZV90eXBlLT5nZXRfYmFzZSgpKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgImNhbm5vdCByZWFkIGZpZWxkIG9mIHR5cGUgVFlQRV9WT0lEIGZyb20gaW5wdXQgcHJvdG9jb2wiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgaWYgKHRiYXNlX3R5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0ICIgPDwgdHlwZV92YXIgPDwgIiA9IGlfcHJvdC5yZWFkX2J5dGVzKCk/OyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0ICIgPDwgdHlwZV92YXIgPDwgIiA9IGlfcHJvdC5yZWFkX3N0cmluZygpPzsiIDw8IGVuZGw7CisgICAgICB9CisgICAgICByZXR1cm47CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgIiA8PCB0eXBlX3ZhciA8PCAiID0gaV9wcm90LnJlYWRfYm9vbCgpPzsiIDw8IGVuZGw7CisgICAgICByZXR1cm47CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0ICIgPDwgdHlwZV92YXIgPDwgIiA9IGlfcHJvdC5yZWFkX2k4KCk/OyIgPDwgZW5kbDsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0ICIgPDwgdHlwZV92YXIgPDwgIiA9IGlfcHJvdC5yZWFkX2kxNigpPzsiIDw8IGVuZGw7CisgICAgICByZXR1cm47CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCAiIDw8IHR5cGVfdmFyIDw8ICIgPSBpX3Byb3QucmVhZF9pMzIoKT87IiA8PCBlbmRsOworICAgICAgcmV0dXJuOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgIiA8PCB0eXBlX3ZhciA8PCAiID0gaV9wcm90LnJlYWRfaTY0KCk/OyIgPDwgZW5kbDsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0ICIgPDwgdHlwZV92YXIgPDwgIiA9IE9yZGVyZWRGbG9hdDo6ZnJvbShpX3Byb3QucmVhZF9kb3VibGUoKT8pOyIgPDwgZW5kbDsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIC8vIEZJWE1FOiBub3QgYSBmYW4gb2Ygc2VwYXJhdGUgYGlzX2JveGVkYCBwYXJhbWV0ZXIKKyAgICAvLyBUaGlzIGlzIHByb2JsZW1hdGljIGJlY2F1c2UgaXQncyBhbiBvcHRpb25hbCBwYXJhbWV0ZXIsIGFuZCBvbmx5IGNvbWVzCisgICAgLy8gaW50byBwbGF5IG9uY2UuIFRoZSBjb3JlIGlzc3VlIGlzIHRoYXQgSSBsb3NlIGFuIGltcG9ydGFudCBwaWVjZSBvZiB0eXBlCisgICAgLy8gaW5mb3JtYXRpb24gKHdoZXRoZXIgdGhlIHR5cGUgaXMgYSBmd2QgcmVmKSBieSB1bndyYXBwaW5nIHRoZSB0eXBlZGVmJ2QKKyAgICAvLyB0eXBlIGFuZCBtYWtpbmcgdGhlIHJlY3Vyc2l2ZSBjYWxsIHVzaW5nIGl0LiBJIGNhbid0IG1vZGlmeSBvciB3cmFwIHRoZQorICAgIC8vIGdlbmVyYXRlZCBzdHJpbmcgYWZ0ZXIgdGhlIGZhY3QgYmVjYXVzZSBpdCdzIHdyaXR0ZW4gZGlyZWN0bHkgaW50byB0aGUgZmlsZSwKKyAgICAvLyBzbyBJIGhhdmUgdG8gcGFzcyB0aGlzIHBhcmFtZXRlciBhbG9uZy4gR29pbmcgd2l0aCB0aGlzIGFwcHJvYWNoIGJlY2F1c2UgaXQKKyAgICAvLyBzZWVtcyBsaWtlIHRoZSBsb3dlc3QtY29zdCBvcHRpb24gdG8gZWFzaWx5IHN1cHBvcnQgcmVjdXJzaXZlIHR5cGVzLgorICAgIHRfdHlwZWRlZiogdHR5cGVkZWYgPSAodF90eXBlZGVmKil0dHlwZTsKKyAgICByZW5kZXJfdHlwZV9zeW5jX3JlYWQodHlwZV92YXIsIHR0eXBlZGVmLT5nZXRfdHlwZSgpLCB0dHlwZWRlZi0+aXNfZm9yd2FyZF90eXBlZGVmKCkpOworICAgIHJldHVybjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpIHx8IHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHN0cmluZyByZWFkX2NhbGwodG9fcnVzdF90eXBlKHR0eXBlKSArICI6OnJlYWRfZnJvbV9pbl9wcm90b2NvbChpX3Byb3QpPyIpOworICAgIHJlYWRfY2FsbCA9IGlzX2JveGVkID8gIkJveDo6bmV3KCIgKyByZWFkX2NhbGwgKyAiKSIgOiByZWFkX2NhbGw7CisgICAgZl9nZW5fCisgICAgICA8PCBpbmRlbnQoKQorICAgICAgPDwgImxldCAiIDw8IHR5cGVfdmFyIDw8ICIgPSAiIDw8ICByZWFkX2NhbGwgPDwgIjsiCisgICAgICA8PCBlbmRsOworICAgIHJldHVybjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZW5kZXJfbWFwX3N5bmNfcmVhZCgodF9tYXAgKikgdHR5cGUsIHR5cGVfdmFyKTsKKyAgICByZXR1cm47CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmVuZGVyX3NldF9zeW5jX3JlYWQoKHRfc2V0ICopIHR0eXBlLCB0eXBlX3Zhcik7CisgICAgcmV0dXJuOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZW5kZXJfbGlzdF9zeW5jX3JlYWQoKHRfbGlzdCAqKSB0dHlwZSwgdHlwZV92YXIpOworICAgIHJldHVybjsKKyAgfQorCisgIHRocm93ICJjYW5ub3QgcmVhZCB1bnN1cHBvcnRlZCB0eXBlICIgKyB0dHlwZS0+Z2V0X25hbWUoKTsKK30KKworLy8gQ29uc3RydWN0IHRoZSBydXN0IHJlcHJlc2VudGF0aW9uIG9mIGEgbGlzdCBmcm9tIHRoZSB3aXJlLgordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX2xpc3Rfc3luY19yZWFkKHRfbGlzdCAqdGxpc3QsIGNvbnN0IHN0cmluZyAmbGlzdF92YXIpIHsKKyAgdF90eXBlKiBlbGVtX3R5cGUgPSB0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpOworCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0IGxpc3RfaWRlbnQgPSBpX3Byb3QucmVhZF9saXN0X2JlZ2luKCk/OyIgPDwgZW5kbDsKKyAgZl9nZW5fCisgICAgPDwgaW5kZW50KCkKKyAgICA8PCAibGV0IG11dCAiIDw8IGxpc3RfdmFyIDw8ICI6ICIgPDwgdG9fcnVzdF90eXBlKCh0X3R5cGUqKSB0bGlzdCkKKyAgICA8PCAiID0gVmVjOjp3aXRoX2NhcGFjaXR5KGxpc3RfaWRlbnQuc2l6ZSBhcyB1c2l6ZSk7IgorICAgIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiZm9yIF8gaW4gMC4ubGlzdF9pZGVudC5zaXplIHsiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisKKyAgc3RyaW5nIGxpc3RfZWxlbV92YXIgPSB0bXAoImxpc3RfZWxlbV8iKTsKKyAgcmVuZGVyX3R5cGVfc3luY19yZWFkKGxpc3RfZWxlbV92YXIsIGVsZW1fdHlwZSk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCBsaXN0X3ZhciA8PCAiLnB1c2goIiA8PCBsaXN0X2VsZW1fdmFyIDw8ICIpOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJpX3Byb3QucmVhZF9saXN0X2VuZCgpPzsiIDw8IGVuZGw7Cit9CisKKy8vIENvbnN0cnVjdCB0aGUgcnVzdCByZXByZXNlbnRhdGlvbiBvZiBhIHNldCBmcm9tIHRoZSB3aXJlLgordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3NldF9zeW5jX3JlYWQodF9zZXQgKnRzZXQsIGNvbnN0IHN0cmluZyAmc2V0X3ZhcikgeworICB0X3R5cGUqIGVsZW1fdHlwZSA9IHRzZXQtPmdldF9lbGVtX3R5cGUoKTsKKworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCBzZXRfaWRlbnQgPSBpX3Byb3QucmVhZF9zZXRfYmVnaW4oKT87IiA8PCBlbmRsOworICBmX2dlbl8KKyAgICA8PCBpbmRlbnQoKQorICAgIDw8ICJsZXQgbXV0ICIgPDwgc2V0X3ZhciA8PCAiOiAiIDw8IHRvX3J1c3RfdHlwZSgodF90eXBlKikgdHNldCkKKyAgICA8PCAiID0gQlRyZWVTZXQ6Om5ldygpOyIKKyAgICA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImZvciBfIGluIDAuLnNldF9pZGVudC5zaXplIHsiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisKKyAgc3RyaW5nIHNldF9lbGVtX3ZhciA9IHRtcCgic2V0X2VsZW1fIik7CisgIHJlbmRlcl90eXBlX3N5bmNfcmVhZChzZXRfZWxlbV92YXIsIGVsZW1fdHlwZSk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCBzZXRfdmFyIDw8ICIuaW5zZXJ0KCIgPDwgc2V0X2VsZW1fdmFyIDw8ICIpOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJpX3Byb3QucmVhZF9zZXRfZW5kKCk/OyIgPDwgZW5kbDsKK30KKworLy8gQ29uc3RydWN0IHRoZSBydXN0IHJlcHJlc2VudGF0aW9uIG9mIGEgbWFwIGZyb20gdGhlIHdpcmUuCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfbWFwX3N5bmNfcmVhZCh0X21hcCAqdG1hcCwgY29uc3Qgc3RyaW5nICZtYXBfdmFyKSB7CisgIHRfdHlwZSoga2V5X3R5cGUgPSB0bWFwLT5nZXRfa2V5X3R5cGUoKTsKKyAgdF90eXBlKiB2YWxfdHlwZSA9IHRtYXAtPmdldF92YWxfdHlwZSgpOworCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0IG1hcF9pZGVudCA9IGlfcHJvdC5yZWFkX21hcF9iZWdpbigpPzsiIDw8IGVuZGw7CisgIGZfZ2VuXworICAgIDw8IGluZGVudCgpCisgICAgPDwgImxldCBtdXQgIiA8PCBtYXBfdmFyIDw8ICI6ICIgPDwgdG9fcnVzdF90eXBlKCh0X3R5cGUqKSB0bWFwKQorICAgIDw8ICIgPSBCVHJlZU1hcDo6bmV3KCk7IgorICAgIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiZm9yIF8gaW4gMC4ubWFwX2lkZW50LnNpemUgeyIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKworICBzdHJpbmcga2V5X2VsZW1fdmFyID0gdG1wKCJtYXBfa2V5XyIpOworICByZW5kZXJfdHlwZV9zeW5jX3JlYWQoa2V5X2VsZW1fdmFyLCBrZXlfdHlwZSk7CisgIHN0cmluZyB2YWxfZWxlbV92YXIgPSB0bXAoIm1hcF92YWxfIik7CisgIHJlbmRlcl90eXBlX3N5bmNfcmVhZCh2YWxfZWxlbV92YXIsIHZhbF90eXBlKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8IG1hcF92YXIgPDwgIi5pbnNlcnQoIiA8PCBrZXlfZWxlbV92YXIgPDwgIiwgIiA8PCB2YWxfZWxlbV92YXIgPDwgIik7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImlfcHJvdC5yZWFkX21hcF9lbmQoKT87IiA8PCBlbmRsOworfQorCitzdHJpbmcgdF9yc19nZW5lcmF0b3I6OnN0cnVjdF9maWVsZF9yZWFkX3RlbXBfdmFyaWFibGUodF9maWVsZCogdGZpZWxkKSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBmb3NzOworICBmb3NzIDw8ICJmXyIgPDwgdGZpZWxkLT5nZXRfa2V5KCk7CisgIHJldHVybiBmb3NzLnN0cigpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gU3luYyBDbGllbnQKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICByZW5kZXJfc3luY19jbGllbnQodHNlcnZpY2UpOworICByZW5kZXJfc3luY19wcm9jZXNzb3IodHNlcnZpY2UpOworICByZW5kZXJfc2VydmljZV9jYWxsX3N0cnVjdHModHNlcnZpY2UpOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc2VydmljZV9jYWxsX3N0cnVjdHModF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgc3RkOjp2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmdW5jX2l0ZXI7CisKKyAgLy8gdGhyaWZ0IGFyZ3MgZm9yIHNlcnZpY2UgY2FsbHMgYXJlIHBhY2tlZAorICAvLyBpbnRvIGEgc3RydWN0IHRoYXQncyB0cmFuc21pdHRlZCBvdmVyIHRoZSB3aXJlLCBzbworICAvLyBnZW5lcmF0ZSBzdHJ1Y3RzIGZvciB0aG9zZSB0b28KKyAgLy8KKyAgLy8gdGhyaWZ0IHJldHVybnMgYXJlICphbHNvKiBwYWNrZWQgaW50byBhIHN0cnVjdAorICAvLyB0aGF0J3MgcGFzc2VkIG92ZXIgdGhlIHdpcmUsIHNvLCBnZW5lcmF0ZSB0aGUgc3RydWN0CisgIC8vIGZvciB0aGF0IHRvby4gTm90ZSB0aGF0IHRoaXMgcmVzdWx0IHN0cnVjdCAqYWxzbyoKKyAgLy8gY29udGFpbnMgdGhlIGV4Y2VwdGlvbnMgYXMgd2VsbAorICBmb3IoZnVuY19pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZ1bmNfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZnVuY19pdGVyKSB7CisgICAgdF9mdW5jdGlvbiogdGZ1bmMgPSAoKmZ1bmNfaXRlcik7CisgICAgcmVuZGVyX3NlcnZpY2VfY2FsbF9hcmdzX3N0cnVjdCh0ZnVuYyk7CisgICAgaWYgKCF0ZnVuYy0+aXNfb25ld2F5KCkpIHsKKyAgICAgIHJlbmRlcl9zZXJ2aWNlX2NhbGxfcmVzdWx0X3ZhbHVlX3N0cnVjdCh0ZnVuYyk7CisgICAgfQorICB9Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zeW5jX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBjbGllbnRfaW1wbF9uYW1lKHJ1c3Rfc3luY19jbGllbnRfaW1wbF9uYW1lKHRzZXJ2aWNlKSk7CisKKyAgcmVuZGVyX3R5cGVfY29tbWVudCh0c2VydmljZS0+Z2V0X25hbWUoKSArICIgc2VydmljZSBjbGllbnQiKTsgLy8gbm90ZTogdXNlICpvcmlnaW5hbCogbmFtZQorICByZW5kZXJfc3luY19jbGllbnRfdHJhaXQodHNlcnZpY2UpOworICByZW5kZXJfc3luY19jbGllbnRfbWFya2VyX3RyYWl0KHRzZXJ2aWNlKTsKKyAgcmVuZGVyX3N5bmNfY2xpZW50X2RlZmluaXRpb25fYW5kX2ltcGwoY2xpZW50X2ltcGxfbmFtZSk7CisgIHJlbmRlcl9zeW5jX2NsaWVudF90dGhyaWZ0Y2xpZW50X2ltcGwoY2xpZW50X2ltcGxfbmFtZSk7CisgIHJlbmRlcl9zeW5jX2NsaWVudF9tYXJrZXJfdHJhaXRfaW1wbHModHNlcnZpY2UsIGNsaWVudF9pbXBsX25hbWUpOyBmX2dlbl8gPDwgZW5kbDsKKyAgcmVuZGVyX3N5bmNfY2xpZW50X3Byb2Nlc3NfaW1wbCh0c2VydmljZSk7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zeW5jX2NsaWVudF90cmFpdCh0X3NlcnZpY2UgKnRzZXJ2aWNlKSB7CisgIHN0cmluZyBleHRlbnNpb24gPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKSB7CisgICAgdF9zZXJ2aWNlKiBleHRlbmRzID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7CisgICAgZXh0ZW5zaW9uID0gIiA6ICIgKyBydXN0X25hbWVzcGFjZShleHRlbmRzKSArIHJ1c3Rfc3luY19jbGllbnRfdHJhaXRfbmFtZShleHRlbmRzKTsKKyAgfQorCisgIHJlbmRlcl9ydXN0ZG9jKCh0X2RvYyopIHRzZXJ2aWNlKTsKKyAgZl9nZW5fIDw8ICJwdWIgdHJhaXQgIiA8PCBydXN0X3N5bmNfY2xpZW50X3RyYWl0X25hbWUodHNlcnZpY2UpIDw8IGV4dGVuc2lvbiA8PCAiIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICBzdGQ6OnZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZ1bmNfaXRlcjsKKyAgZm9yKGZ1bmNfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmdW5jX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2Z1bmNfaXRlcikgeworICAgIHRfZnVuY3Rpb24qIHRmdW5jID0gKCpmdW5jX2l0ZXIpOworICAgIHN0cmluZyBmdW5jX25hbWUgPSBzZXJ2aWNlX2NhbGxfY2xpZW50X2Z1bmN0aW9uX25hbWUodGZ1bmMpOworICAgIHN0cmluZyBmdW5jX2FyZ3MgPSBydXN0X3N5bmNfc2VydmljZV9jYWxsX2RlY2xhcmF0aW9uKHRmdW5jLCB0cnVlKTsKKyAgICBzdHJpbmcgZnVuY19yZXR1cm4gPSB0b19ydXN0X3R5cGUodGZ1bmMtPmdldF9yZXR1cm50eXBlKCkpOworICAgIHJlbmRlcl9ydXN0ZG9jKCh0X2RvYyopIHRmdW5jKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImZuICIgPDwgZnVuY19uYW1lIDw8ICBmdW5jX2FyZ3MgPDwgIiAtPiB0aHJpZnQ6OlJlc3VsdDwiIDw8IGZ1bmNfcmV0dXJuIDw8ICI+OyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zeW5jX2NsaWVudF9tYXJrZXJfdHJhaXQodF9zZXJ2aWNlICp0c2VydmljZSkgeworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInB1YiB0cmFpdCAiIDw8IHJ1c3Rfc3luY19jbGllbnRfbWFya2VyX3RyYWl0X25hbWUodHNlcnZpY2UpIDw8ICIge30iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBlbmRsOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc3luY19jbGllbnRfbWFya2VyX3RyYWl0X2ltcGxzKHRfc2VydmljZSAqdHNlcnZpY2UsIGNvbnN0IHN0cmluZyAmaW1wbF9zdHJ1Y3RfbmFtZSkgeworICBmX2dlbl8KKyAgICA8PCBpbmRlbnQoKQorICAgIDw8ICJpbXBsICIKKyAgICA8PCBTWU5DX0NMSUVOVF9HRU5FUklDX0JPVU5EX1ZBUlMKKyAgICA8PCAiICIKKyAgICA8PCBydXN0X25hbWVzcGFjZSh0c2VydmljZSkgPDwgcnVzdF9zeW5jX2NsaWVudF9tYXJrZXJfdHJhaXRfbmFtZSh0c2VydmljZSkKKyAgICA8PCAiIGZvciAiCisgICAgPDwgaW1wbF9zdHJ1Y3RfbmFtZSA8PCBTWU5DX0NMSUVOVF9HRU5FUklDX0JPVU5EX1ZBUlMKKyAgICA8PCAiICIKKyAgICA8PCBTWU5DX0NMSUVOVF9HRU5FUklDX0JPVU5EUworICAgIDw8ICIge30iCisgICAgPDwgZW5kbDsKKworICB0X3NlcnZpY2UqIGV4dGVuZHMgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKKyAgaWYgKGV4dGVuZHMpIHsKKyAgICByZW5kZXJfc3luY19jbGllbnRfbWFya2VyX3RyYWl0X2ltcGxzKGV4dGVuZHMsIGltcGxfc3RydWN0X25hbWUpOworICB9Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zeW5jX2NsaWVudF9kZWZpbml0aW9uX2FuZF9pbXBsKGNvbnN0IHN0cmluZyYgY2xpZW50X2ltcGxfbmFtZSkgeworCisgIC8vIHJlbmRlciB0aGUgZGVmaW5pdGlvbiBmb3IgdGhlIGNsaWVudCBzdHJ1Y3QKKyAgZl9nZW5fCisgICAgPDwgInB1YiBzdHJ1Y3QgIgorICAgIDw8IGNsaWVudF9pbXBsX25hbWUKKyAgICA8PCBTWU5DX0NMSUVOVF9HRU5FUklDX0JPVU5EX1ZBUlMKKyAgICA8PCAiICIKKyAgICA8PCBTWU5DX0NMSUVOVF9HRU5FUklDX0JPVU5EUworICAgIDw8ICIgeyIKKyAgICA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJfaV9wcm90OiBJUCwiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiX29fcHJvdDogT1AsIiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIl9zZXF1ZW5jZV9udW1iZXI6IGkzMiwiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCAifSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7CisKKyAgLy8gcmVuZGVyIHRoZSBzdHJ1Y3QgaW1wbGVtZW50YXRpb24KKyAgLy8gdGhpcyBpbmNsdWRlcyB0aGUgbmV3KCkgZnVuY3Rpb24gYXMgd2VsbCBhcyB0aGUgaGVscGVyIHNlbmQvcmVjdiBtZXRob2RzIGZvciBlYWNoIHNlcnZpY2UgY2FsbAorICBmX2dlbl8KKyAgICA8PCAiaW1wbCAiCisgICAgPDwgU1lOQ19DTElFTlRfR0VORVJJQ19CT1VORF9WQVJTCisgICAgPDwgIiAiCisgICAgPDwgY2xpZW50X2ltcGxfbmFtZQorICAgIDw8IFNZTkNfQ0xJRU5UX0dFTkVSSUNfQk9VTkRfVkFSUworICAgIDw8ICIgIgorICAgIDw8IFNZTkNfQ0xJRU5UX0dFTkVSSUNfQk9VTkRTCisgICAgPDwgIiB7IgorICAgIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICByZW5kZXJfc3luY19jbGllbnRfbGlmZWN5Y2xlX2Z1bmN0aW9ucyhjbGllbnRfaW1wbF9uYW1lKTsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8ICJ9IiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3N5bmNfY2xpZW50X2xpZmVjeWNsZV9mdW5jdGlvbnMoY29uc3Qgc3RyaW5nJiBjbGllbnRfc3RydWN0KSB7CisgIGZfZ2VuXworICAgIDw8IGluZGVudCgpCisgICAgPDwgInB1YiBmbiBuZXcoaW5wdXRfcHJvdG9jb2w6IElQLCBvdXRwdXRfcHJvdG9jb2w6IE9QKSAtPiAiCisgICAgPDwgY2xpZW50X3N0cnVjdAorICAgIDw8IFNZTkNfQ0xJRU5UX0dFTkVSSUNfQk9VTkRfVkFSUworICAgIDw8ICIgeyIKKyAgICA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBmX2dlbl8KKyAgICA8PCBpbmRlbnQoKQorICAgIDw8IGNsaWVudF9zdHJ1Y3QKKyAgICA8PCAiIHsgX2lfcHJvdDogaW5wdXRfcHJvdG9jb2wsIF9vX3Byb3Q6IG91dHB1dF9wcm90b2NvbCwgX3NlcXVlbmNlX251bWJlcjogMCB9IgorICAgIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc3luY19jbGllbnRfdHRocmlmdGNsaWVudF9pbXBsKGNvbnN0IHN0cmluZyAmY2xpZW50X2ltcGxfbmFtZSkgeworICBmX2dlbl8KKyAgICA8PCBpbmRlbnQoKQorICAgIDw8ICJpbXBsICIKKyAgICA8PCBTWU5DX0NMSUVOVF9HRU5FUklDX0JPVU5EX1ZBUlMKKyAgICA8PCAiIFRUaHJpZnRDbGllbnQgZm9yICIKKyAgICA8PCBjbGllbnRfaW1wbF9uYW1lCisgICAgPDwgU1lOQ19DTElFTlRfR0VORVJJQ19CT1VORF9WQVJTCisgICAgPDwgIiAiCisgICAgPDwgU1lOQ19DTElFTlRfR0VORVJJQ19CT1VORFMKKyAgICA8PCAiIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiZm4gaV9wcm90X211dCgmbXV0IHNlbGYpIC0+ICZtdXQgVElucHV0UHJvdG9jb2wgeyAmbXV0IHNlbGYuX2lfcHJvdCB9IiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImZuIG9fcHJvdF9tdXQoJm11dCBzZWxmKSAtPiAmbXV0IFRPdXRwdXRQcm90b2NvbCB7ICZtdXQgc2VsZi5fb19wcm90IH0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiZm4gc2VxdWVuY2VfbnVtYmVyKCZzZWxmKSAtPiBpMzIgeyBzZWxmLl9zZXF1ZW5jZV9udW1iZXIgfSIgPDwgZW5kbDsKKyAgZl9nZW5fCisgICAgPDwgaW5kZW50KCkKKyAgICA8PCAiZm4gaW5jcmVtZW50X3NlcXVlbmNlX251bWJlcigmbXV0IHNlbGYpIC0+IGkzMiB7IHNlbGYuX3NlcXVlbmNlX251bWJlciArPSAxOyBzZWxmLl9zZXF1ZW5jZV9udW1iZXIgfSIKKyAgICA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zeW5jX2NsaWVudF9wcm9jZXNzX2ltcGwodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgbWFya2VyX2V4dGVuc2lvbiA9ICIiICsgc3luY19jbGllbnRfbWFya2VyX3RyYWl0c19mb3JfZXh0ZW5zaW9uKHRzZXJ2aWNlKTsKKworICBmX2dlbl8KKyAgICA8PCAiaW1wbCA8QzogVFRocmlmdENsaWVudCArICIgPDwgcnVzdF9zeW5jX2NsaWVudF9tYXJrZXJfdHJhaXRfbmFtZSh0c2VydmljZSkgPDwgbWFya2VyX2V4dGVuc2lvbiA8PCAiPiAiCisgICAgPDwgcnVzdF9zeW5jX2NsaWVudF90cmFpdF9uYW1lKHRzZXJ2aWNlKQorICAgIDw8ICIgZm9yIEMgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHN0ZDo6dmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZnVuY19pdGVyOworICBmb3IoZnVuY19pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZ1bmNfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZnVuY19pdGVyKSB7CisgICAgdF9mdW5jdGlvbiogZnVuYyA9ICgqZnVuY19pdGVyKTsKKyAgICByZW5kZXJfc3luY19zZW5kX3JlY3Zfd3JhcHBlcihmdW5jKTsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCAifSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6c3luY19jbGllbnRfbWFya2VyX3RyYWl0c19mb3JfZXh0ZW5zaW9uKHRfc2VydmljZSAqdHNlcnZpY2UpIHsKKyAgc3RyaW5nIG1hcmtlcl9leHRlbnNpb247CisKKyAgdF9zZXJ2aWNlKiBleHRlbmRzID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7CisgIGlmIChleHRlbmRzKSB7CisgICAgbWFya2VyX2V4dGVuc2lvbiA9ICIgKyAiICsgcnVzdF9uYW1lc3BhY2UoZXh0ZW5kcykgKyBydXN0X3N5bmNfY2xpZW50X21hcmtlcl90cmFpdF9uYW1lKGV4dGVuZHMpOworICAgIG1hcmtlcl9leHRlbnNpb24gPSBtYXJrZXJfZXh0ZW5zaW9uICsgc3luY19jbGllbnRfbWFya2VyX3RyYWl0c19mb3JfZXh0ZW5zaW9uKGV4dGVuZHMpOworICB9CisKKyAgcmV0dXJuIG1hcmtlcl9leHRlbnNpb247Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zeW5jX3NlbmRfcmVjdl93cmFwcGVyKHRfZnVuY3Rpb24qIHRmdW5jKSB7CisgIHN0cmluZyBmdW5jX25hbWUgPSBzZXJ2aWNlX2NhbGxfY2xpZW50X2Z1bmN0aW9uX25hbWUodGZ1bmMpOworICBzdHJpbmcgZnVuY19kZWNsX2FyZ3MgPSBydXN0X3N5bmNfc2VydmljZV9jYWxsX2RlY2xhcmF0aW9uKHRmdW5jLCB0cnVlKTsKKyAgc3RyaW5nIGZ1bmNfY2FsbF9hcmdzID0gcnVzdF9zeW5jX3NlcnZpY2VfY2FsbF9pbnZvY2F0aW9uKHRmdW5jKTsKKyAgc3RyaW5nIGZ1bmNfcmV0dXJuID0gdG9fcnVzdF90eXBlKHRmdW5jLT5nZXRfcmV0dXJudHlwZSgpKTsKKworICBmX2dlbl8KKyAgICA8PCBpbmRlbnQoKQorICAgIDw8ICJmbiAiIDw8IGZ1bmNfbmFtZSA8PCAgZnVuY19kZWNsX2FyZ3MgPDwgIiAtPiB0aHJpZnQ6OlJlc3VsdDwiIDw8IGZ1bmNfcmV0dXJuCisgICAgPDwgIj4geyIKKyAgICA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIigiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICByZW5kZXJfc3luY19zZW5kKHRmdW5jKTsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICIpPzsiIDw8IGVuZGw7CisgIGlmICh0ZnVuYy0+aXNfb25ld2F5KCkpIHsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIk9rKCgpKSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICByZW5kZXJfc3luY19yZWN2KHRmdW5jKTsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3N5bmNfc2VuZCh0X2Z1bmN0aW9uKiB0ZnVuYykgeworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIC8vIGluY3JlbWVudCB0aGUgc2VxdWVuY2UgbnVtYmVyIGFuZCBnZW5lcmF0ZSB0aGUgY2FsbCBoZWFkZXIKKyAgc3RyaW5nIG1lc3NhZ2VfdHlwZSA9IHRmdW5jLT5pc19vbmV3YXkoKSA/ICJUTWVzc2FnZVR5cGU6Ok9uZVdheSIgOiAiVE1lc3NhZ2VUeXBlOjpDYWxsIjsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJzZWxmLmluY3JlbWVudF9zZXF1ZW5jZV9udW1iZXIoKTsiIDw8IGVuZGw7CisgIGZfZ2VuXworICAgIDw8IGluZGVudCgpCisgICAgPDwgImxldCBtZXNzYWdlX2lkZW50ID0gIgorICAgIDw8ICJUTWVzc2FnZUlkZW50aWZpZXI6Om5ldyhcIiIgPDwgdGZ1bmMtPmdldF9uYW1lKCkgPDwgIlwiLCAiIC8vIG5vdGU6IHVzZSAqb3JpZ2luYWwqIG5hbWUKKyAgICA8PCBtZXNzYWdlX3R5cGUgPDwgIiwgIgorICAgIDw8ICJzZWxmLnNlcXVlbmNlX251bWJlcigpKTsiCisgICAgPDwgZW5kbDsKKyAgLy8gcGFjayB0aGUgYXJndW1lbnRzIGludG8gdGhlIGNvbnRhaW5pbmcgc3RydWN0IHRoYXQgd2UnbGwgd3JpdGUgb3V0IG92ZXIgdGhlIHdpcmUKKyAgLy8gbm90ZSB0aGF0IHRoaXMgc3RydWN0IGlzIGdlbmVyYXRlZCBldmVuIGlmIHdlIGhhdmUgMCBhcmdzCisgIG9zdHJpbmdzdHJlYW0gc3RydWN0X2RlZmluaXRpb247CisgIHZlY3Rvcjx0X2ZpZWxkKj4gbWVtYmVycyA9IHRmdW5jLT5nZXRfYXJnbGlzdCgpLT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6aXRlcmF0b3IgbWVtYmVyc19pdGVyOworICBmb3IgKG1lbWJlcnNfaXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbWVtYmVyc19pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbWVtYmVyc19pdGVyKSB7CisgICAgdF9maWVsZCogbWVtYmVyID0gKCptZW1iZXJzX2l0ZXIpOworICAgIHN0cmluZyBtZW1iZXJfbmFtZShydXN0X2ZpZWxkX25hbWUobWVtYmVyKSk7CisgICAgc3RydWN0X2RlZmluaXRpb24gPDwgbWVtYmVyX25hbWUgPDwgIjogIiA8PCBtZW1iZXJfbmFtZSA8PCAiLCAiOworICB9CisgIHN0cmluZyBzdHJ1Y3RfZmllbGRzID0gc3RydWN0X2RlZmluaXRpb24uc3RyKCk7CisgIGlmIChzdHJ1Y3RfZmllbGRzLnNpemUoKSA+IDApIHsKKyAgICBzdHJ1Y3RfZmllbGRzID0gc3RydWN0X2ZpZWxkcy5zdWJzdHIoMCwgc3RydWN0X2ZpZWxkcy5zaXplKCkgLSAyKTsgLy8gc3RyaXAgdHJhaWxpbmcgY29tbWEKKyAgfQorICBmX2dlbl8KKyAgICA8PCBpbmRlbnQoKQorICAgIDw8ICJsZXQgY2FsbF9hcmdzID0gIgorICAgIDw8IHNlcnZpY2VfY2FsbF9hcmdzX3N0cnVjdF9uYW1lKHRmdW5jKQorICAgIDw8ICIgeyAiCisgICAgPDwgc3RydWN0X2ZpZWxkcworICAgIDw8ICIgfTsiCisgICAgPDwgZW5kbDsKKyAgLy8gd3JpdGUgZXZlcnl0aGluZyBvdmVyIHRoZSB3aXJlCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAic2VsZi5vX3Byb3RfbXV0KCkud3JpdGVfbWVzc2FnZV9iZWdpbigmbWVzc2FnZV9pZGVudCk/OyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJjYWxsX2FyZ3Mud3JpdGVfdG9fb3V0X3Byb3RvY29sKHNlbGYub19wcm90X211dCgpKT87IiA8PCBlbmRsOyAvLyB3cml0dGVuIGV2ZW4gaWYgd2UgaGF2ZSAwIGFyZ3MKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJzZWxmLm9fcHJvdF9tdXQoKS53cml0ZV9tZXNzYWdlX2VuZCgpPzsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAic2VsZi5vX3Byb3RfbXV0KCkuZmx1c2goKSIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zeW5jX3JlY3YodF9mdW5jdGlvbiogdGZ1bmMpIHsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCBtZXNzYWdlX2lkZW50ID0gc2VsZi5pX3Byb3RfbXV0KCkucmVhZF9tZXNzYWdlX2JlZ2luKCk/OyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ2ZXJpZnlfZXhwZWN0ZWRfc2VxdWVuY2VfbnVtYmVyKHNlbGYuc2VxdWVuY2VfbnVtYmVyKCksIG1lc3NhZ2VfaWRlbnQuc2VxdWVuY2VfbnVtYmVyKT87IiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInZlcmlmeV9leHBlY3RlZF9zZXJ2aWNlX2NhbGwoXCIiIDw8IHRmdW5jLT5nZXRfbmFtZSgpIDw8IlwiLCAmbWVzc2FnZV9pZGVudC5uYW1lKT87IiA8PCBlbmRsOyAvLyBub3RlOiB1c2UgKm9yaWdpbmFsKiBuYW1lCisgIC8vIEZJWE1FOiByZXBsYWNlIHdpdGggYSAidHJ5IiBibG9jaworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImlmIG1lc3NhZ2VfaWRlbnQubWVzc2FnZV90eXBlID09IFRNZXNzYWdlVHlwZTo6RXhjZXB0aW9uIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCByZW1vdGVfZXJyb3IgPSB0aHJpZnQ6OkVycm9yOjpyZWFkX2FwcGxpY2F0aW9uX2Vycm9yX2Zyb21faW5fcHJvdG9jb2woc2VsZi5pX3Byb3RfbXV0KCkpPzsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAic2VsZi5pX3Byb3RfbXV0KCkucmVhZF9tZXNzYWdlX2VuZCgpPzsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIEVycih0aHJpZnQ6OkVycm9yOjpBcHBsaWNhdGlvbihyZW1vdGVfZXJyb3IpKSIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInZlcmlmeV9leHBlY3RlZF9tZXNzYWdlX3R5cGUoVE1lc3NhZ2VUeXBlOjpSZXBseSwgbWVzc2FnZV9pZGVudC5tZXNzYWdlX3R5cGUpPzsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0IHJlc3VsdCA9ICIgPDwgc2VydmljZV9jYWxsX3Jlc3VsdF9zdHJ1Y3RfbmFtZSh0ZnVuYykgPDwgIjo6cmVhZF9mcm9tX2luX3Byb3RvY29sKHNlbGYuaV9wcm90X211dCgpKT87IiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInNlbGYuaV9wcm90X211dCgpLnJlYWRfbWVzc2FnZV9lbmQoKT87IiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInJlc3VsdC5va19vcigpIiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjpydXN0X3N5bmNfc2VydmljZV9jYWxsX2RlY2xhcmF0aW9uKHRfZnVuY3Rpb24qIHRmdW5jLCBib29sIHNlbGZfaXNfbXV0YWJsZSkgeworICBvc3RyaW5nc3RyZWFtIGZ1bmNfYXJnczsKKworICBpZiAoc2VsZl9pc19tdXRhYmxlKSB7CisgICAgZnVuY19hcmdzIDw8ICIoJm11dCBzZWxmIjsKKyAgfSBlbHNlIHsKKyAgICBmdW5jX2FyZ3MgPDwgIigmc2VsZiI7CisgIH0KKworICBpZiAoaGFzX2FyZ3ModGZ1bmMpKSB7CisgICAgZnVuY19hcmdzIDw8ICIsICI7IC8vIHB1dCBjb21tYSBhZnRlciAic2VsZiIKKyAgICBmdW5jX2FyZ3MgPDwgc3RydWN0X3RvX2RlY2xhcmF0aW9uKHRmdW5jLT5nZXRfYXJnbGlzdCgpLCBUX0FSR1MpOworICB9CisKKyAgZnVuY19hcmdzIDw8ICIpIjsKKyAgcmV0dXJuIGZ1bmNfYXJncy5zdHIoKTsKK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjpydXN0X3N5bmNfc2VydmljZV9jYWxsX2ludm9jYXRpb24odF9mdW5jdGlvbiogdGZ1bmMsIGNvbnN0IHN0cmluZyYgZmllbGRfcHJlZml4KSB7CisgIG9zdHJpbmdzdHJlYW0gZnVuY19hcmdzOworICBmdW5jX2FyZ3MgPDwgIigiOworCisgIGlmIChoYXNfYXJncyh0ZnVuYykpIHsKKyAgICBmdW5jX2FyZ3MgPDwgc3RydWN0X3RvX2ludm9jYXRpb24odGZ1bmMtPmdldF9hcmdsaXN0KCksIGZpZWxkX3ByZWZpeCk7CisgIH0KKworICBmdW5jX2FyZ3MgPDwgIikiOworICByZXR1cm4gZnVuY19hcmdzLnN0cigpOworfQorCitzdHJpbmcgdF9yc19nZW5lcmF0b3I6OnN0cnVjdF90b19kZWNsYXJhdGlvbih0X3N0cnVjdCogdHN0cnVjdCwgdF9yc19nZW5lcmF0b3I6OmVfc3RydWN0X3R5cGUgc3RydWN0X3R5cGUpIHsKKyAgb3N0cmluZ3N0cmVhbSBhcmdzOworCisgIGJvb2wgZmlyc3RfYXJnID0gdHJ1ZTsKKyAgc3RkOjp2ZWN0b3I8dF9maWVsZCo+IGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj46Oml0ZXJhdG9yIGZpZWxkX2l0ZXI7CisgIGZvciAoZmllbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmaWVsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmaWVsZF9pdGVyKSB7CisgICAgdF9maWVsZCogdGZpZWxkID0gKCpmaWVsZF9pdGVyKTsKKyAgICB0X2ZpZWxkOjplX3JlcSBmaWVsZF9yZXEgPSBhY3R1YWxfZmllbGRfcmVxKHRmaWVsZCwgc3RydWN0X3R5cGUpOworICAgIHN0cmluZyBydXN0X3R5cGUgPSB0b19ydXN0X3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgICBydXN0X3R5cGUgPSBpc19vcHRpb25hbChmaWVsZF9yZXEpID8gIk9wdGlvbjwiICsgcnVzdF90eXBlICsgIj4iIDogcnVzdF90eXBlOworCisgICAgaWYgKGZpcnN0X2FyZykgeworICAgICAgZmlyc3RfYXJnID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIGFyZ3MgPDwgIiwgIjsKKyAgICB9CisKKyAgICBhcmdzIDw8IHJ1c3RfZmllbGRfbmFtZSh0ZmllbGQpIDw8ICI6ICIgPDwgcnVzdF90eXBlOworICB9CisKKyAgcmV0dXJuIGFyZ3Muc3RyKCk7Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6c3RydWN0X3RvX2ludm9jYXRpb24odF9zdHJ1Y3QqIHRzdHJ1Y3QsIGNvbnN0IHN0cmluZyYgZmllbGRfcHJlZml4KSB7CisgIG9zdHJpbmdzdHJlYW0gYXJnczsKKworICBib29sIGZpcnN0X2FyZyA9IHRydWU7CisgIHN0ZDo6dmVjdG9yPHRfZmllbGQqPiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgc3RkOjp2ZWN0b3I8dF9maWVsZCo+OjppdGVyYXRvciBmaWVsZF9pdGVyOworICBmb3IgKGZpZWxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmllbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmllbGRfaXRlcikgeworICAgIHRfZmllbGQqIHRmaWVsZCA9ICgqZmllbGRfaXRlcik7CisKKyAgICBpZiAoZmlyc3RfYXJnKSB7CisgICAgICBmaXJzdF9hcmcgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgYXJncyA8PCAiLCAiOworICAgIH0KKworICAgIGFyZ3MgPDwgZmllbGRfcHJlZml4IDw8IHJ1c3RfZmllbGRfbmFtZSh0ZmllbGQpOworICB9CisKKyAgcmV0dXJuIGFyZ3Muc3RyKCk7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zZXJ2aWNlX2NhbGxfYXJnc19zdHJ1Y3QodF9mdW5jdGlvbiogdGZ1bmMpIHsKKyAgICBzdHJpbmcgYXJnc19zdHJ1Y3RfbmFtZShzZXJ2aWNlX2NhbGxfYXJnc19zdHJ1Y3RfbmFtZSh0ZnVuYykpOworICAgIHJlbmRlcl9zdHJ1Y3QoYXJnc19zdHJ1Y3RfbmFtZSwgdGZ1bmMtPmdldF9hcmdsaXN0KCksIHRfcnNfZ2VuZXJhdG9yOjpUX0FSR1MpOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc2VydmljZV9jYWxsX3Jlc3VsdF92YWx1ZV9zdHJ1Y3QodF9mdW5jdGlvbiogdGZ1bmMpIHsKKyAgc3RyaW5nIHJlc3VsdF9zdHJ1Y3RfbmFtZSA9IHNlcnZpY2VfY2FsbF9yZXN1bHRfc3RydWN0X25hbWUodGZ1bmMpOworICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sIHJlc3VsdF9zdHJ1Y3RfbmFtZSk7CisKKyAgdF9maWVsZCByZXR1cm5fdmFsdWUodGZ1bmMtPmdldF9yZXR1cm50eXBlKCksIFNFUlZJQ0VfUkVTVUxUX1ZBUklBQkxFLCAwKTsKKyAgcmV0dXJuX3ZhbHVlLnNldF9yZXEodF9maWVsZDo6VF9PUFRJT05BTCk7CisgIGlmICghdGZ1bmMtPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgIHJlc3VsdC5hcHBlbmQoJnJldHVybl92YWx1ZSk7CisgIH0KKworICB0X3N0cnVjdCogZXhjZXB0aW9ucyA9IHRmdW5jLT5nZXRfeGNlcHRpb25zKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGV4Y2VwdGlvbl90eXBlcyA9IGV4Y2VwdGlvbnMtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGV4Y2VwdGlvbl9pdGVyOworICBmb3IoZXhjZXB0aW9uX2l0ZXIgPSBleGNlcHRpb25fdHlwZXMuYmVnaW4oKTsgZXhjZXB0aW9uX2l0ZXIgIT0gZXhjZXB0aW9uX3R5cGVzLmVuZCgpOyArK2V4Y2VwdGlvbl9pdGVyKSB7CisgICAgdF9maWVsZCogZXhjZXB0aW9uX3R5cGUgPSAqZXhjZXB0aW9uX2l0ZXI7CisgICAgZXhjZXB0aW9uX3R5cGUtPnNldF9yZXEodF9maWVsZDo6VF9PUFRJT05BTCk7CisgICAgcmVzdWx0LmFwcGVuZChleGNlcHRpb25fdHlwZSk7CisgIH0KKworICByZW5kZXJfc3RydWN0KHJlc3VsdF9zdHJ1Y3RfbmFtZSwgJnJlc3VsdCwgdF9yc19nZW5lcmF0b3I6OlRfUkVTVUxUKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFN5bmMgUHJvY2Vzc29yCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc3luY19wcm9jZXNzb3IodF9zZXJ2aWNlICp0c2VydmljZSkgeworICByZW5kZXJfdHlwZV9jb21tZW50KHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIiBzZXJ2aWNlIHByb2Nlc3NvciIpOyAvLyBub3RlOiB1c2UgKm9yaWdpbmFsKiBuYW1lCisgIHJlbmRlcl9zeW5jX2hhbmRsZXJfdHJhaXQodHNlcnZpY2UpOworICByZW5kZXJfc3luY19wcm9jZXNzb3JfZGVmaW5pdGlvbl9hbmRfaW1wbCh0c2VydmljZSk7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zeW5jX2hhbmRsZXJfdHJhaXQodF9zZXJ2aWNlICp0c2VydmljZSkgeworICBzdHJpbmcgZXh0ZW5zaW9uID0gIiI7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgdF9zZXJ2aWNlKiBleHRlbmRzID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7CisgICAgZXh0ZW5zaW9uID0gIiA6ICIgKyBydXN0X25hbWVzcGFjZShleHRlbmRzKSArIHJ1c3Rfc3luY19oYW5kbGVyX3RyYWl0X25hbWUoZXh0ZW5kcyk7CisgIH0KKworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgc3RkOjp2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmdW5jX2l0ZXI7CisKKyAgcmVuZGVyX3J1c3Rkb2MoKHRfZG9jKikgdHNlcnZpY2UpOworICBmX2dlbl8gPDwgInB1YiB0cmFpdCAiIDw8IHJ1c3Rfc3luY19oYW5kbGVyX3RyYWl0X25hbWUodHNlcnZpY2UpIDw8IGV4dGVuc2lvbiA8PCAiIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmb3IoZnVuY19pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZ1bmNfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZnVuY19pdGVyKSB7CisgICAgdF9mdW5jdGlvbiogdGZ1bmMgPSAoKmZ1bmNfaXRlcik7CisgICAgc3RyaW5nIGZ1bmNfbmFtZSA9IHNlcnZpY2VfY2FsbF9oYW5kbGVyX2Z1bmN0aW9uX25hbWUodGZ1bmMpOworICAgIHN0cmluZyBmdW5jX2FyZ3MgPSBydXN0X3N5bmNfc2VydmljZV9jYWxsX2RlY2xhcmF0aW9uKHRmdW5jLCBmYWxzZSk7CisgICAgc3RyaW5nIGZ1bmNfcmV0dXJuID0gdG9fcnVzdF90eXBlKHRmdW5jLT5nZXRfcmV0dXJudHlwZSgpKTsKKyAgICByZW5kZXJfcnVzdGRvYygodF9kb2MqKSB0ZnVuYyk7CisgICAgZl9nZW5fCisgICAgICA8PCBpbmRlbnQoKQorICAgICAgPDwgImZuICIKKyAgICAgIDw8IGZ1bmNfbmFtZSA8PCAgZnVuY19hcmdzCisgICAgICA8PCAiIC0+IHRocmlmdDo6UmVzdWx0PCIgPDwgZnVuY19yZXR1cm4gPDwgIj47IgorICAgICAgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBlbmRsOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc3luY19wcm9jZXNzb3JfZGVmaW5pdGlvbl9hbmRfaW1wbCh0X3NlcnZpY2UgKnRzZXJ2aWNlKSB7CisgIHN0cmluZyBzZXJ2aWNlX3Byb2Nlc3Nvcl9uYW1lID0gcnVzdF9zeW5jX3Byb2Nlc3Nvcl9uYW1lKHRzZXJ2aWNlKTsKKyAgc3RyaW5nIGhhbmRsZXJfdHJhaXRfbmFtZSA9IHJ1c3Rfc3luY19oYW5kbGVyX3RyYWl0X25hbWUodHNlcnZpY2UpOworCisgIC8vIHN0cnVjdAorICBmX2dlbl8KKyAgICA8PCBpbmRlbnQoKQorICAgIDw8ICJwdWIgc3RydWN0ICIgPDwgc2VydmljZV9wcm9jZXNzb3JfbmFtZQorICAgIDw8ICI8SDogIiA8PCBoYW5kbGVyX3RyYWl0X25hbWUKKyAgICA8PCAiPiB7IgorICAgIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImhhbmRsZXI6IEgsIiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBlbmRsOworCisgIC8vIGRlbGVnYXRpbmcgaW1wbAorICBmX2dlbl8KKyAgICA8PCBpbmRlbnQoKQorICAgIDw8ICJpbXBsIDxIOiAiIDw8IGhhbmRsZXJfdHJhaXRfbmFtZSA8PCAiPiAiCisgICAgPDwgc2VydmljZV9wcm9jZXNzb3JfbmFtZQorICAgIDw8ICI8SD4geyIKKyAgICA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJwdWIgZm4gbmV3KGhhbmRsZXI6IEgpIC0+ICIgPDwgc2VydmljZV9wcm9jZXNzb3JfbmFtZSA8PCAiPEg+IHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgc2VydmljZV9wcm9jZXNzb3JfbmFtZSA8PCAiIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImhhbmRsZXIsIiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgcmVuZGVyX3N5bmNfcHJvY2Vzc19kZWxlZ2F0aW9uX2Z1bmN0aW9ucyh0c2VydmljZSk7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7CisKKyAgLy8gYWN0dWFsIGltcGwKKyAgc3RyaW5nIHNlcnZpY2VfYWN0dWFsX3Byb2Nlc3Nvcl9uYW1lID0gcnVzdF9zeW5jX3Byb2Nlc3Nvcl9pbXBsX25hbWUodHNlcnZpY2UpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInB1YiBzdHJ1Y3QgIiA8PCBzZXJ2aWNlX2FjdHVhbF9wcm9jZXNzb3JfbmFtZSA8PCAiOyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiaW1wbCAiIDw8IHNlcnZpY2VfYWN0dWFsX3Byb2Nlc3Nvcl9uYW1lIDw8ICIgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmdW5jX2l0ZXI7CisgIGZvcihmdW5jX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZnVuY19pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmdW5jX2l0ZXIpIHsKKyAgICB0X2Z1bmN0aW9uKiB0ZnVuYyA9ICgqZnVuY19pdGVyKTsKKyAgICByZW5kZXJfc3luY19wcm9jZXNzX2Z1bmN0aW9uKHRmdW5jLCBoYW5kbGVyX3RyYWl0X25hbWUpOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKKworICAvLyBwcm9jZXNzb3IgaW1wbAorICBmX2dlbl8KKyAgICA8PCBpbmRlbnQoKQorICAgIDw8ICJpbXBsIDxIOiAiCisgICAgPDwgaGFuZGxlcl90cmFpdF9uYW1lIDw8ICI+IFRQcm9jZXNzb3IgZm9yICIKKyAgICA8PCBzZXJ2aWNlX3Byb2Nlc3Nvcl9uYW1lCisgICAgPDwgIjxIPiB7IgorICAgIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZfZ2VuXworICAgIDw8IGluZGVudCgpCisgICAgPDwgImZuIHByb2Nlc3MoJnNlbGYsIGlfcHJvdDogJm11dCBUSW5wdXRQcm90b2NvbCwgb19wcm90OiAmbXV0IFRPdXRwdXRQcm90b2NvbCkgLT4gdGhyaWZ0OjpSZXN1bHQ8KCk+IHsiCisgICAgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgbWVzc2FnZV9pZGVudCA9IGlfcHJvdC5yZWFkX21lc3NhZ2VfYmVnaW4oKT87IiA8PCBlbmRsOworCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0IHJlcyA9IG1hdGNoICYqbWVzc2FnZV9pZGVudC5uYW1lIHsiIDw8IGVuZGw7IC8vIFtzaWdoXSBleHBsaWNpdCBkZXJlZiBjb2VyY2lvbgorICBpbmRlbnRfdXAoKTsKKyAgcmVuZGVyX3Byb2Nlc3NfbWF0Y2hfc3RhdGVtZW50cyh0c2VydmljZSk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibWV0aG9kID0+IHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICByZW5kZXJfdGhyaWZ0X2Vycm9yKAorICAgICJBcHBsaWNhdGlvbiIsCisgICAgIkFwcGxpY2F0aW9uRXJyb3IiLAorICAgICJBcHBsaWNhdGlvbkVycm9yS2luZDo6VW5rbm93bk1ldGhvZCIsCisgICAgImZvcm1hdCEoXCJ1bmtub3duIG1ldGhvZCB7fVwiLCBtZXRob2QpIgorICApOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0sIiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifTsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAidGhyaWZ0OjpzZXJ2ZXI6OmhhbmRsZV9wcm9jZXNzX3Jlc3VsdCgmbWVzc2FnZV9pZGVudCwgcmVzLCBvX3Byb3QpIiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBlbmRsOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc3luY19wcm9jZXNzX2RlbGVnYXRpb25fZnVuY3Rpb25zKHRfc2VydmljZSAqdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGFjdHVhbF9wcm9jZXNzb3IocnVzdF9uYW1lc3BhY2UodHNlcnZpY2UpICsgcnVzdF9zeW5jX3Byb2Nlc3Nvcl9pbXBsX25hbWUodHNlcnZpY2UpKTsKKworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZ1bmNfaXRlcjsKKyAgZm9yKGZ1bmNfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmdW5jX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2Z1bmNfaXRlcikgeworICAgIHRfZnVuY3Rpb24qIHRmdW5jID0gKCpmdW5jX2l0ZXIpOworICAgIHN0cmluZyBmdW5jdGlvbl9uYW1lKCJwcm9jZXNzXyIgKyBydXN0X3NuYWtlX2Nhc2UodGZ1bmMtPmdldF9uYW1lKCkpKTsKKyAgICBmX2dlbl8KKyAgICAgIDw8IGluZGVudCgpCisgICAgICA8PCAiZm4gIiA8PCBmdW5jdGlvbl9uYW1lCisgICAgICA8PCAiKCZzZWxmLCAiCisgICAgICA8PCAiaW5jb21pbmdfc2VxdWVuY2VfbnVtYmVyOiBpMzIsICIKKyAgICAgIDw8ICJpX3Byb3Q6ICZtdXQgVElucHV0UHJvdG9jb2wsICIKKyAgICAgIDw8ICJvX3Byb3Q6ICZtdXQgVE91dHB1dFByb3RvY29sKSAiCisgICAgICA8PCAiLT4gdGhyaWZ0OjpSZXN1bHQ8KCk+IHsiCisgICAgICA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgZl9nZW5fCisgICAgICA8PCBpbmRlbnQoKQorICAgICAgPDwgYWN0dWFsX3Byb2Nlc3NvcgorICAgICAgPDwgIjo6IiA8PCBmdW5jdGlvbl9uYW1lCisgICAgICA8PCAiKCIKKyAgICAgIDw8ICImc2VsZi5oYW5kbGVyLCAiCisgICAgICA8PCAiaW5jb21pbmdfc2VxdWVuY2VfbnVtYmVyLCAiCisgICAgICA8PCAiaV9wcm90LCAiCisgICAgICA8PCAib19wcm90IgorICAgICAgPDwgIikiCisgICAgICA8PCBlbmRsOworCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKworICB0X3NlcnZpY2UqIGV4dGVuZHMgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKKyAgaWYgKGV4dGVuZHMpIHsKKyAgICByZW5kZXJfc3luY19wcm9jZXNzX2RlbGVnYXRpb25fZnVuY3Rpb25zKGV4dGVuZHMpOworICB9Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9wcm9jZXNzX21hdGNoX3N0YXRlbWVudHModF9zZXJ2aWNlKiB0c2VydmljZSkgeworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZ1bmNfaXRlcjsKKyAgZm9yKGZ1bmNfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmdW5jX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2Z1bmNfaXRlcikgeworICAgIHRfZnVuY3Rpb24qIHRmdW5jID0gKCpmdW5jX2l0ZXIpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiXCIiIDw8IHRmdW5jLT5nZXRfbmFtZSgpIDw8ICJcIiIgPDwgIiA9PiB7IiA8PCBlbmRsOyAvLyBub3RlOiB1c2UgKm9yaWdpbmFsKiBuYW1lCisgICAgaW5kZW50X3VwKCk7CisgICAgZl9nZW5fCisgICAgICA8PCBpbmRlbnQoKQorICAgICAgPDwgInNlbGYucHJvY2Vzc18iIDw8IHJ1c3Rfc25ha2VfY2FzZSh0ZnVuYy0+Z2V0X25hbWUoKSkKKyAgICAgIDw8ICIobWVzc2FnZV9pZGVudC5zZXF1ZW5jZV9udW1iZXIsIGlfcHJvdCwgb19wcm90KSIKKyAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0sIiA8PCBlbmRsOworICB9CisKKyAgdF9zZXJ2aWNlKiBleHRlbmRzID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7CisgIGlmIChleHRlbmRzKSB7CisgICAgcmVuZGVyX3Byb2Nlc3NfbWF0Y2hfc3RhdGVtZW50cyhleHRlbmRzKTsKKyAgfQorfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc3luY19wcm9jZXNzX2Z1bmN0aW9uKHRfZnVuY3Rpb24gKnRmdW5jLCBjb25zdCBzdHJpbmcgJmhhbmRsZXJfdHlwZSkgeworICBzdHJpbmcgc2VxdWVuY2VfbnVtYmVyX3BhcmFtKCJpbmNvbWluZ19zZXF1ZW5jZV9udW1iZXIiKTsKKyAgc3RyaW5nIG91dHB1dF9wcm90b2NvbF9wYXJhbSgib19wcm90Iik7CisKKyAgaWYgKHRmdW5jLT5pc19vbmV3YXkoKSkgeworICAgIHNlcXVlbmNlX251bWJlcl9wYXJhbSA9ICJfIjsKKyAgICBvdXRwdXRfcHJvdG9jb2xfcGFyYW0gPSAiXyI7CisgIH0KKworICBmX2dlbl8KKyAgICA8PCBpbmRlbnQoKQorICAgIDw8ICJwdWIgZm4gcHJvY2Vzc18iIDw8IHJ1c3Rfc25ha2VfY2FzZSh0ZnVuYy0+Z2V0X25hbWUoKSkKKyAgICA8PCAiPEg6ICIgPDwgaGFuZGxlcl90eXBlIDw8ICI+IgorICAgIDw8ICIoaGFuZGxlcjogJkgsICIKKyAgICA8PCBzZXF1ZW5jZV9udW1iZXJfcGFyYW0gPDwgIjogaTMyLCAiCisgICAgPDwgImlfcHJvdDogJm11dCBUSW5wdXRQcm90b2NvbCwgIgorICAgIDw8IG91dHB1dF9wcm90b2NvbF9wYXJhbSA8PCAiOiAmbXV0IFRPdXRwdXRQcm90b2NvbCkgIgorICAgIDw8ICItPiB0aHJpZnQ6OlJlc3VsdDwoKT4geyIKKyAgICA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIC8vICphbHdheXMqIHJlYWQgYXJndW1lbnRzIGZyb20gdGhlIGlucHV0IHByb3RvY29sCisgIGZfZ2VuXworICAgIDw8IGluZGVudCgpCisgICAgPDwgImxldCAiCisgICAgPDwgKGhhc19ub25fdm9pZF9hcmdzKHRmdW5jKSA/ICJhcmdzIiA6ICJfIikKKyAgICA8PCAiID0gIgorICAgIDw8IHNlcnZpY2VfY2FsbF9hcmdzX3N0cnVjdF9uYW1lKHRmdW5jKQorICAgIDw8ICI6OnJlYWRfZnJvbV9pbl9wcm90b2NvbChpX3Byb3QpPzsiCisgICAgPDwgZW5kbDsKKworICBmX2dlbl8KKyAgICA8PCBpbmRlbnQoKQorICAgIDw8ICJtYXRjaCBoYW5kbGVyLiIKKyAgICA8PCBzZXJ2aWNlX2NhbGxfaGFuZGxlcl9mdW5jdGlvbl9uYW1lKHRmdW5jKQorICAgIDw8IHJ1c3Rfc3luY19zZXJ2aWNlX2NhbGxfaW52b2NhdGlvbih0ZnVuYywgImFyZ3MuIikKKyAgICA8PCAiIHsiCisgICAgPDwgZW5kbDsgLy8gc3RhcnQgbWF0Y2gKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gaGFuZGxlciBzdWNjZWVkZWQKKyAgc3RyaW5nIGhhbmRsZXJfcmV0dXJuX3ZhcmlhYmxlID0gdGZ1bmMtPmlzX29uZXdheSgpIHx8IHRmdW5jLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkgPyAiXyIgOiAiaGFuZGxlcl9yZXR1cm4iOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIk9rKCIgPDwgaGFuZGxlcl9yZXR1cm5fdmFyaWFibGUgPDwgIikgPT4geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIHJlbmRlcl9zeW5jX2hhbmRsZXJfc3VjY2VlZGVkKHRmdW5jKTsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9LCIgPDwgZW5kbDsKKyAgLy8gaGFuZGxlciBmYWlsZWQKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJFcnIoZSkgPT4geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIHJlbmRlcl9zeW5jX2hhbmRsZXJfZmFpbGVkKHRmdW5jKTsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9LCIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7IC8vIGVuZCBtYXRjaAorCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsgLy8gZW5kIGZ1bmN0aW9uCit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zeW5jX2hhbmRsZXJfc3VjY2VlZGVkKHRfZnVuY3Rpb24gKnRmdW5jKSB7CisgIGlmICh0ZnVuYy0+aXNfb25ld2F5KCkpIHsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIk9rKCgpKSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBmX2dlbl8KKyAgICAgIDw8IGluZGVudCgpCisgICAgICA8PCAibGV0IG1lc3NhZ2VfaWRlbnQgPSBUTWVzc2FnZUlkZW50aWZpZXI6Om5ldygiCisgICAgICA8PCAiXCIiIDw8IHRmdW5jLT5nZXRfbmFtZSgpIDw8ICJcIiwgIiAvLyBub3RlOiB1c2UgKm9yaWdpbmFsKiBuYW1lCisgICAgICA8PCAiVE1lc3NhZ2VUeXBlOjpSZXBseSwgIgorICAgICAgPDwgImluY29taW5nX3NlcXVlbmNlX251bWJlcik7IgorICAgICAgPDwgZW5kbDsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC53cml0ZV9tZXNzYWdlX2JlZ2luKCZtZXNzYWdlX2lkZW50KT87IiA8PCBlbmRsOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0IHJldCA9ICIgPDwgaGFuZGxlcl9zdWNjZXNzZnVsX3JldHVybl9zdHJ1Y3QodGZ1bmMpIDw8IjsiIDw8IGVuZGw7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJyZXQud3JpdGVfdG9fb3V0X3Byb3RvY29sKG9fcHJvdCk/OyIgPDwgZW5kbDsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC53cml0ZV9tZXNzYWdlX2VuZCgpPzsiIDw8IGVuZGw7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3QuZmx1c2goKSIgPDwgZW5kbDsKKyAgfQorfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc3luY19oYW5kbGVyX2ZhaWxlZCh0X2Z1bmN0aW9uICp0ZnVuYykgeworICBzdHJpbmcgZXJyX3ZhcigiZSIpOworCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibWF0Y2ggIiA8PCBlcnJfdmFyIDw8ICIgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gaWYgdGhlcmUgYXJlIGFueSB1c2VyLWRlZmluZWQgZXhjZXB0aW9ucyBmb3IgdGhpcyBzZXJ2aWNlIGNhbGwgaGFuZGxlIHRoZW0gZmlyc3QKKyAgaWYgKHRmdW5jLT5nZXRfeGNlcHRpb25zKCkgIT0gTlVMTCAmJiB0ZnVuYy0+Z2V0X3hjZXB0aW9ucygpLT5nZXRfc29ydGVkX21lbWJlcnMoKS5zaXplKCkgPiAwKSB7CisgICAgc3RyaW5nIHVzZXJfZXJyX3ZhcigidXNyX2VyciIpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAidGhyaWZ0OjpFcnJvcjo6VXNlcigiIDw8IHVzZXJfZXJyX3ZhciA8PCAiKSA9PiB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIHJlbmRlcl9zeW5jX2hhbmRsZXJfZmFpbGVkX3VzZXJfZXhjZXB0aW9uX2JyYW5jaCh0ZnVuYyk7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0sIiA8PCBlbmRsOworICB9CisKKyAgLy8gYXBwbGljYXRpb24gZXJyb3IKKyAgc3RyaW5nIGFwcF9lcnJfdmFyKCJhcHBfZXJyIik7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAidGhyaWZ0OjpFcnJvcjo6QXBwbGljYXRpb24oIiA8PCBhcHBfZXJyX3ZhciA8PCAiKSA9PiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgcmVuZGVyX3N5bmNfaGFuZGxlcl9mYWlsZWRfYXBwbGljYXRpb25fZXhjZXB0aW9uX2JyYW5jaCh0ZnVuYywgYXBwX2Vycl92YXIpOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0sIiA8PCBlbmRsOworCisgIC8vIGRlZmF1bHQgY2FzZQorICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIl8gPT4geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIHJlbmRlcl9zeW5jX2hhbmRsZXJfZmFpbGVkX2RlZmF1bHRfZXhjZXB0aW9uX2JyYW5jaCh0ZnVuYyk7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSwiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc3luY19oYW5kbGVyX2ZhaWxlZF91c2VyX2V4Y2VwdGlvbl9icmFuY2godF9mdW5jdGlvbiAqdGZ1bmMpIHsKKyAgaWYgKHRmdW5jLT5nZXRfeGNlcHRpb25zKCkgPT0gTlVMTCB8fCB0ZnVuYy0+Z2V0X3hjZXB0aW9ucygpLT5nZXRfc29ydGVkX21lbWJlcnMoKS5lbXB0eSgpKSB7CisgICAgdGhyb3cgImNhbm5vdCByZW5kZXIgdXNlciBleGNlcHRpb24gYnJhbmNoZXMgaWYgbm8gdXNlciBleGNlcHRpb25zIGRlZmluZWQiOworICB9CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiB0eGNlcHRpb25zID0gdGZ1bmMtPmdldF94Y2VwdGlvbnMoKS0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhjZXB0aW9uX2l0ZXI7CisgIGludCBicmFuY2hlc19yZW5kZXJlZCA9IDA7CisKKyAgLy8gcnVuIHRocm91Z2ggYWxsIHVzZXItZGVmaW5lZCBleGNlcHRpb25zCisgIGZvciAoeGNlcHRpb25faXRlciA9IHR4Y2VwdGlvbnMuYmVnaW4oKTsgeGNlcHRpb25faXRlciAhPSB0eGNlcHRpb25zLmVuZCgpOyArK3hjZXB0aW9uX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiB4Y2VwdGlvbl9maWVsZCA9ICgqeGNlcHRpb25faXRlcik7CisKKyAgICBzdHJpbmcgaWZfc3RhdGVtZW50KGJyYW5jaGVzX3JlbmRlcmVkID09IDAgPyAiaWYgdXNyX2VyciIgOiAifSBlbHNlIGlmIHVzcl9lcnIiKTsKKyAgICBzdHJpbmcgZXhjZXB0aW9uX3R5cGUodG9fcnVzdF90eXBlKHhjZXB0aW9uX2ZpZWxkLT5nZXRfdHlwZSgpKSk7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8IGlmX3N0YXRlbWVudCA8PCAiLmRvd25jYXN0X3JlZjo6PCIgPDwgZXhjZXB0aW9uX3R5cGUgPDwgIj4oKS5pc19zb21lKCkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGZfZ2VuXworICAgICAgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJsZXQgZXJyID0gdXNyX2Vyci5kb3duY2FzdDo6PCIgPDwgZXhjZXB0aW9uX3R5cGUgPDwgIj4oKS5leHBlY3QoXCJkb3duY2FzdCBhbHJlYWR5IGNoZWNrZWRcIik7IgorICAgICAgPDwgZW5kbDsKKworICAgIC8vIHJlbmRlciB0aGUgbWVtYmVycyBvZiB0aGUgcmV0dXJuIHN0cnVjdAorICAgIG9zdHJpbmdzdHJlYW0gbWVtYmVyczsKKworICAgIGJvb2wgaGFzX3Jlc3VsdF92YXJpYWJsZSA9ICEodGZ1bmMtPmlzX29uZXdheSgpIHx8IHRmdW5jLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpOworICAgIGlmIChoYXNfcmVzdWx0X3ZhcmlhYmxlKSB7CisgICAgICBtZW1iZXJzIDw8IFNFUlZJQ0VfUkVTVUxUX1ZBUklBQkxFIDw8ICI6IE5vbmUsICI7CisgICAgfQorCisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeGNlcHRpb25fbWVtYmVyc19pdGVyOworICAgIGZvcih4Y2VwdGlvbl9tZW1iZXJzX2l0ZXIgPSB0eGNlcHRpb25zLmJlZ2luKCk7IHhjZXB0aW9uX21lbWJlcnNfaXRlciAhPSB0eGNlcHRpb25zLmVuZCgpOyArK3hjZXB0aW9uX21lbWJlcnNfaXRlcikgeworICAgICAgdF9maWVsZCogbWVtYmVyID0gKCp4Y2VwdGlvbl9tZW1iZXJzX2l0ZXIpOworICAgICAgc3RyaW5nIG1lbWJlcl9uYW1lKHJ1c3RfZmllbGRfbmFtZShtZW1iZXIpKTsKKyAgICAgIGlmIChtZW1iZXIgPT0geGNlcHRpb25fZmllbGQpIHsKKyAgICAgICAgbWVtYmVycyA8PCBtZW1iZXJfbmFtZSA8PCAiOiBTb21lKCplcnIpLCAiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbWVtYmVycyA8PCBtZW1iZXJfbmFtZSA8PCAiOiBOb25lLCAiOworICAgICAgfQorICAgIH0KKworICAgIHN0cmluZyBtZW1iZXJfc3RyaW5nID0gbWVtYmVycy5zdHIoKTsKKyAgICBtZW1iZXJfc3RyaW5nLnJlcGxhY2UobWVtYmVyX3N0cmluZy5zaXplKCkgLSAyLCAyLCAiICIpOyAvLyB0cmltIHRyYWlsaW5nIGNvbW1hCisKKyAgICAvLyBub3cgd3JpdGUgb3V0IHRoZSByZXR1cm4gc3RydWN0CisgICAgZl9nZW5fCisgICAgICA8PCBpbmRlbnQoKQorICAgICAgPDwgImxldCByZXRfZXJyID0gIgorICAgICAgPDwgc2VydmljZV9jYWxsX3Jlc3VsdF9zdHJ1Y3RfbmFtZSh0ZnVuYykKKyAgICAgIDw8ICJ7ICIgPDwgbWVtYmVyX3N0cmluZyA8PCAifTsiCisgICAgICA8PCBlbmRsOworCisgICAgZl9nZW5fCisgICAgICA8PCBpbmRlbnQoKQorICAgICAgPDwgImxldCBtZXNzYWdlX2lkZW50ID0gIgorICAgICAgPDwgIlRNZXNzYWdlSWRlbnRpZmllcjo6bmV3KCIKKyAgICAgIDw8ICJcIiIgPDwgdGZ1bmMtPmdldF9uYW1lKCkgPDwgIlwiLCAiIC8vIG5vdGU6IHVzZSAqb3JpZ2luYWwqIG5hbWUKKyAgICAgIDw8ICJUTWVzc2FnZVR5cGU6OlJlcGx5LCAiCisgICAgICA8PCAiaW5jb21pbmdfc2VxdWVuY2VfbnVtYmVyKTsiCisgICAgICA8PCBlbmRsOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LndyaXRlX21lc3NhZ2VfYmVnaW4oJm1lc3NhZ2VfaWRlbnQpPzsiIDw8IGVuZGw7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJyZXRfZXJyLndyaXRlX3RvX291dF9wcm90b2NvbChvX3Byb3QpPzsiIDw8IGVuZGw7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3Qud3JpdGVfbWVzc2FnZV9lbmQoKT87IiA8PCBlbmRsOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LmZsdXNoKCkiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfZG93bigpOworCisgICAgYnJhbmNoZXNfcmVuZGVyZWQrKzsKKyAgfQorCisgIC8vIHRoZSBjYXRjaCBhbGwsIGlmIHNvbWVob3cgaXQgd2FzIGEgdXNlciBleGNlcHRpb24gdGhhdCB3ZSBkb24ndCBzdXBwb3J0CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIC8vIEZJWE1FOiBzYW1lIGFzIGRlZmF1bHQgYmxvY2sgYmVsb3cKKworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCByZXRfZXJyID0geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIHJlbmRlcl90aHJpZnRfZXJyb3Jfc3RydWN0KCJBcHBsaWNhdGlvbkVycm9yIiwgIkFwcGxpY2F0aW9uRXJyb3JLaW5kOjpVbmtub3duIiwgInVzcl9lcnIuZGVzY3JpcHRpb24oKSIpOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn07IiA8PCBlbmRsOworICByZW5kZXJfc3luY19oYW5kbGVyX3NlbmRfZXhjZXB0aW9uX3Jlc3BvbnNlKHRmdW5jLCAicmV0X2VyciIpOworCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3N5bmNfaGFuZGxlcl9mYWlsZWRfYXBwbGljYXRpb25fZXhjZXB0aW9uX2JyYW5jaCgKKyAgICB0X2Z1bmN0aW9uICp0ZnVuYywKKyAgICBjb25zdCBzdHJpbmcgJmFwcF9lcnJfdmFyCispIHsKKyAgaWYgKHRmdW5jLT5pc19vbmV3YXkoKSkgeworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiRXJyKHRocmlmdDo6RXJyb3I6OkFwcGxpY2F0aW9uKCIgPDwgYXBwX2Vycl92YXIgPDwgIikpIiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHJlbmRlcl9zeW5jX2hhbmRsZXJfc2VuZF9leGNlcHRpb25fcmVzcG9uc2UodGZ1bmMsIGFwcF9lcnJfdmFyKTsKKyAgfQorfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc3luY19oYW5kbGVyX2ZhaWxlZF9kZWZhdWx0X2V4Y2VwdGlvbl9icmFuY2godF9mdW5jdGlvbiAqdGZ1bmMpIHsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgcmV0X2VyciA9IHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICByZW5kZXJfdGhyaWZ0X2Vycm9yX3N0cnVjdCgiQXBwbGljYXRpb25FcnJvciIsICJBcHBsaWNhdGlvbkVycm9yS2luZDo6VW5rbm93biIsICJlLmRlc2NyaXB0aW9uKCkiKTsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9OyIgPDwgZW5kbDsKKyAgaWYgKHRmdW5jLT5pc19vbmV3YXkoKSkgeworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiRXJyKHRocmlmdDo6RXJyb3I6OkFwcGxpY2F0aW9uKHJldF9lcnIpKSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICByZW5kZXJfc3luY19oYW5kbGVyX3NlbmRfZXhjZXB0aW9uX3Jlc3BvbnNlKHRmdW5jLCAicmV0X2VyciIpOworICB9Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zeW5jX2hhbmRsZXJfc2VuZF9leGNlcHRpb25fcmVzcG9uc2UodF9mdW5jdGlvbiAqdGZ1bmMsIGNvbnN0IHN0cmluZyAmZXJyX3ZhcikgeworICBmX2dlbl8KKyAgICAgIDw8IGluZGVudCgpCisgICAgICA8PCAibGV0IG1lc3NhZ2VfaWRlbnQgPSBUTWVzc2FnZUlkZW50aWZpZXI6Om5ldygiCisgICAgICA8PCAiXCIiIDw8IHRmdW5jLT5nZXRfbmFtZSgpIDw8ICJcIiwgIiAvLyBub3RlOiB1c2UgKm9yaWdpbmFsKiBuYW1lCisgICAgICA8PCAiVE1lc3NhZ2VUeXBlOjpFeGNlcHRpb24sICIKKyAgICAgIDw8ICJpbmNvbWluZ19zZXF1ZW5jZV9udW1iZXIpOyIKKyAgICAgIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LndyaXRlX21lc3NhZ2VfYmVnaW4oJm1lc3NhZ2VfaWRlbnQpPzsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAidGhyaWZ0OjpFcnJvcjo6d3JpdGVfYXBwbGljYXRpb25fZXJyb3JfdG9fb3V0X3Byb3RvY29sKCYiIDw8IGVycl92YXIgPDwgIiwgb19wcm90KT87IiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC53cml0ZV9tZXNzYWdlX2VuZCgpPzsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LmZsdXNoKCkiIDw8IGVuZGw7Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6aGFuZGxlcl9zdWNjZXNzZnVsX3JldHVybl9zdHJ1Y3QodF9mdW5jdGlvbiogdGZ1bmMpIHsKKyAgaW50IG1lbWJlcl9jb3VudCA9IDA7CisgIG9zdHJpbmdzdHJlYW0gcmV0dXJuX3N0cnVjdDsKKworICByZXR1cm5fc3RydWN0IDw8IHNlcnZpY2VfY2FsbF9yZXN1bHRfc3RydWN0X25hbWUodGZ1bmMpIDw8ICIgeyAiOworCisgIC8vIGFjdHVhbCByZXR1cm4KKyAgaWYgKCF0ZnVuYy0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgcmV0dXJuX3N0cnVjdCA8PCAicmVzdWx0X3ZhbHVlOiBTb21lKGhhbmRsZXJfcmV0dXJuKSI7CisgICAgbWVtYmVyX2NvdW50Kys7CisgIH0KKworICAvLyBhbnkgdXNlci1kZWZpbmVkIGV4Y2VwdGlvbnMKKyAgaWYgKHRmdW5jLT5nZXRfeGNlcHRpb25zKCkgIT0gTlVMTCkgeworICAgIHRfc3RydWN0KiB0eGNlcHRpb25zID0gdGZ1bmMtPmdldF94Y2VwdGlvbnMoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+IG1lbWJlcnMgPSB0eGNlcHRpb25zLT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtZW1iZXJzX2l0ZXI7CisgICAgZm9yIChtZW1iZXJzX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1lbWJlcnNfaXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21lbWJlcnNfaXRlcikgeworICAgICAgdF9maWVsZCogeGNlcHRpb25fZmllbGQgPSAoKm1lbWJlcnNfaXRlcik7CisgICAgICBpZiAobWVtYmVyX2NvdW50ID4gMCkgeyByZXR1cm5fc3RydWN0IDw8ICIsICI7IH0KKyAgICAgIHJldHVybl9zdHJ1Y3QgPDwgcnVzdF9maWVsZF9uYW1lKHhjZXB0aW9uX2ZpZWxkKSA8PCAiOiBOb25lIjsKKyAgICAgIG1lbWJlcl9jb3VudCsrOworICAgIH0KKyAgfQorCisgIHJldHVybl9zdHJ1Y3QgPDwgIiB9IjsKKworICByZXR1cm4gIHJldHVybl9zdHJ1Y3Quc3RyKCk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBVdGlsaXR5CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfdHlwZV9jb21tZW50KGNvbnN0IHN0cmluZyYgdHlwZV9uYW1lKSB7CisgIGZfZ2VuXyA8PCAiLy8iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCAiLy8gIiA8PCB0eXBlX25hbWUgPDwgZW5kbDsKKyAgZl9nZW5fIDw8ICIvLyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7Cit9CisKKy8vIE5PVEU6IGRvICpub3QqIHB1dCBpbiBhbiBleHRyYSBuZXdsaW5lIGFmdGVyIGRvYyBpcyBnZW5lcmF0ZWQuCisvLyBUaGlzIGlzIGJlY2F1c2UgcnVzdCBkb2NzIGhhdmUgdG8gYWJ1dCB0aGUgbGluZSB0aGV5J3JlIGRvY3VtZW50aW5nLgordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3J1c3Rkb2ModF9kb2MqIHRkb2MpIHsKKyAgaWYgKCF0ZG9jLT5oYXNfZG9jKCkpIHsKKyAgICByZXR1cm47CisgIH0KKworICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChmX2dlbl8sICIiLCAiLy8vICIsIHRkb2MtPmdldF9kb2MoKSwgIiIpOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfdGhyaWZ0X2Vycm9yKAorICBjb25zdCBzdHJpbmcmIGVycm9yX2tpbmQsCisgIGNvbnN0IHN0cmluZyYgZXJyb3Jfc3RydWN0LAorICBjb25zdCBzdHJpbmcmIHN1Yl9lcnJvcl9raW5kLAorICBjb25zdCBzdHJpbmcmIGVycm9yX21lc3NhZ2UKKykgeworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIkVycigiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInRocmlmdDo6RXJyb3I6OiIgPDwgZXJyb3Jfa2luZCA8PCAiKCIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIHJlbmRlcl90aHJpZnRfZXJyb3Jfc3RydWN0KGVycm9yX3N0cnVjdCwgc3ViX2Vycm9yX2tpbmQsIGVycm9yX21lc3NhZ2UpOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIikiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiKSIgPDwgZW5kbDsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3RocmlmdF9lcnJvcl9zdHJ1Y3QoCisgIGNvbnN0IHN0cmluZyYgZXJyb3Jfc3RydWN0LAorICBjb25zdCBzdHJpbmcmIHN1Yl9lcnJvcl9raW5kLAorICBjb25zdCBzdHJpbmcmIGVycm9yX21lc3NhZ2UKKykgeworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgZXJyb3Jfc3RydWN0IDw8ICI6Om5ldygiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgc3ViX2Vycm9yX2tpbmQgPDwgIiwiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCBlcnJvcl9tZXNzYWdlIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiKSIgPDwgZW5kbDsKK30KKworYm9vbCB0X3JzX2dlbmVyYXRvcjo6aXNfZG91YmxlKHRfdHlwZSogdHR5cGUpIHsKKyAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKKyAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCk7CisgICAgaWYgKHRiYXNlID09IHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRSkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9CisKKyAgcmV0dXJuIGZhbHNlOworfQorCitzdHJpbmcgdF9yc19nZW5lcmF0b3I6OnRvX3J1c3RfdHlwZSh0X3R5cGUqIHR0eXBlLCBib29sIG9yZGVyZWRfZmxvYXQpIHsKKyAgLy8gdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsgPC0tIHJlY3Vyc2VzIHRocm91Z2ggYXMgbWFueSB0eXBlZGVmIGxheWVycyBhcyBuZWNlc3NhcnkKKyAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlKiB0YmFzZV90eXBlID0gKCh0X2Jhc2VfdHlwZSopdHR5cGUpOworICAgIHN3aXRjaCAodGJhc2VfdHlwZS0+Z2V0X2Jhc2UoKSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHJldHVybiAiKCkiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgaWYgKHRiYXNlX3R5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgIHJldHVybiAiVmVjPHU4PiI7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gIlN0cmluZyI7CisgICAgICB9CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICJib29sIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmV0dXJuICJpOCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gImkxNiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gImkzMiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gImk2NCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICBpZiAob3JkZXJlZF9mbG9hdCkgeworICAgICAgICByZXR1cm4gIk9yZGVyZWRGbG9hdDxmNjQ+IjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAiZjY0IjsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHRfdHlwZWRlZiogdHR5cGVkZWYgPSAodF90eXBlZGVmKil0dHlwZTsKKyAgICBzdHJpbmcgcnVzdF90eXBlID0gcnVzdF9uYW1lc3BhY2UodHR5cGUpICsgdHR5cGVkZWYtPmdldF9zeW1ib2xpYygpOworICAgIHJ1c3RfdHlwZSA9ICB0dHlwZWRlZi0+aXNfZm9yd2FyZF90eXBlZGVmKCkgPyAiQm94PCIgKyBydXN0X3R5cGUgKyAiPiIgOiBydXN0X3R5cGU7CisgICAgcmV0dXJuIHJ1c3RfdHlwZTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuIHJ1c3RfbmFtZXNwYWNlKHR0eXBlKSArIHJ1c3RfY2FtZWxfY2FzZSh0dHlwZS0+Z2V0X25hbWUoKSk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuIHJ1c3RfbmFtZXNwYWNlKHR0eXBlKSArIHJ1c3RfY2FtZWxfY2FzZSh0dHlwZS0+Z2V0X25hbWUoKSk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgdF9tYXAqIHRtYXAgPSAodF9tYXAqKXR0eXBlOworICAgIHJldHVybiAiQlRyZWVNYXA8IiArIHRvX3J1c3RfdHlwZSh0bWFwLT5nZXRfa2V5X3R5cGUoKSkgKyAiLCAiICsgdG9fcnVzdF90eXBlKHRtYXAtPmdldF92YWxfdHlwZSgpKSArICI+IjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3NldCogdHNldCA9ICh0X3NldCopdHR5cGU7CisgICAgcmV0dXJuICJCVHJlZVNldDwiICsgdG9fcnVzdF90eXBlKHRzZXQtPmdldF9lbGVtX3R5cGUoKSkgKyAiPiI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHRfbGlzdCogdGxpc3QgPSAodF9saXN0Kil0dHlwZTsKKyAgICByZXR1cm4gIlZlYzwiICsgdG9fcnVzdF90eXBlKHRsaXN0LT5nZXRfZWxlbV90eXBlKCkpICsgIj4iOworICB9CisKKyAgdGhyb3cgImNhbm5vdCBmaW5kIHJ1c3QgdHlwZSBmb3IgIiArIHR0eXBlLT5nZXRfbmFtZSgpOworfQorCitzdHJpbmcgdF9yc19nZW5lcmF0b3I6OnRvX3J1c3RfY29uc3RfdHlwZSh0X3R5cGUqIHR0eXBlLCBib29sIG9yZGVyZWRfZmxvYXQpIHsKKyAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlKiB0YmFzZV90eXBlID0gKCh0X2Jhc2VfdHlwZSopdHR5cGUpOworICAgIGlmICh0YmFzZV90eXBlLT5nZXRfYmFzZSgpID09IHRfYmFzZV90eXBlOjpUWVBFX1NUUklORykgeworICAgICAgaWYgKHRiYXNlX3R5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgIHJldHVybiAiJlt1OF0iOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuICImc3RyIjsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gdG9fcnVzdF90eXBlKHR0eXBlLCBvcmRlcmVkX2Zsb2F0KTsKK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjp0b19ydXN0X2ZpZWxkX3R5cGVfZW51bSh0X3R5cGUqIHR0eXBlKSB7CisgIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7CisgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICB0aHJvdyAid2lsbCBub3QgZ2VuZXJhdGUgcHJvdG9jb2w6OlRUeXBlIGZvciBUWVBFX1ZPSUQiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOiAvLyBib3RoIHN0cmluZ3MgYW5kIGJpbmFyeSBhcmUgYWN0dWFsbHkgZW5jb2RlZCBhcyBUVHlwZTo6U3RyaW5nCisgICAgICByZXR1cm4gIlRUeXBlOjpTdHJpbmciOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiVFR5cGU6OkJvb2wiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZXR1cm4gIlRUeXBlOjpJMDgiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmV0dXJuICJUVHlwZTo6STE2IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAiVFR5cGU6OkkzMiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIlRUeXBlOjpJNjQiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICJUVHlwZTo6RG91YmxlIjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiVFR5cGU6OkkzMiI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICJUVHlwZTo6U3RydWN0IjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlOjpNYXAiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAiVFR5cGU6OlNldCI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAiVFR5cGU6Okxpc3QiOworICB9CisKKyAgdGhyb3cgImNhbm5vdCBmaW5kIFRUeXBlIGZvciAiICsgdHR5cGUtPmdldF9uYW1lKCk7Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6b3B0X2luX3JlcV9vdXRfdmFsdWUodF90eXBlKiB0dHlwZSkgeworICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOworICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGUqIHRiYXNlX3R5cGUgPSAoKHRfYmFzZV90eXBlKil0dHlwZSk7CisgICAgc3dpdGNoICh0YmFzZV90eXBlLT5nZXRfYmFzZSgpKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgImNhbm5vdCBnZW5lcmF0ZSBPUFRfSU5fUkVRX09VVCB2YWx1ZSBmb3Igdm9pZCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICBpZiAodGJhc2VfdHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgcmV0dXJuICJTb21lKFZlYzo6bmV3KCkpIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAiU29tZShcIlwiLnRvX293bmVkKCkpIjsKKyAgICAgIH0KKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gIlNvbWUoZmFsc2UpIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICJTb21lKDApIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiU29tZShPcmRlcmVkRmxvYXQ6OmZyb20oMC4wKSkiOworICAgIH0KKworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkgfHwgdHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICJOb25lIjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJTb21lKFZlYzo6bmV3KCkpIjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIlNvbWUoQlRyZWVTZXQ6Om5ldygpKSI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICJTb21lKEJUcmVlTWFwOjpuZXcoKSkiOworICB9CisKKyAgdGhyb3cgImNhbm5vdCBnZW5lcmF0ZSBvcHQtaW4tcmVxLW91dCB2YWx1ZSBmb3IgdHlwZSAiICsgdHR5cGUtPmdldF9uYW1lKCk7Cit9CisKK2Jvb2wgdF9yc19nZW5lcmF0b3I6OmNhbl9nZW5lcmF0ZV9zaW1wbGVfY29uc3QodF90eXBlKiB0dHlwZSkgeworICB0X3R5cGUqIGFjdHVhbF90eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7CisgIGlmIChhY3R1YWxfdHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZSogdGJhc2VfdHlwZSA9ICh0X2Jhc2VfdHlwZSopYWN0dWFsX3R5cGU7CisgICAgcmV0dXJuICEodGJhc2VfdHlwZS0+Z2V0X2Jhc2UoKSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEUpOworICB9IGVsc2UgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCitib29sIHRfcnNfZ2VuZXJhdG9yOjpjYW5fZ2VuZXJhdGVfY29uc3RfaG9sZGVyKHRfdHlwZSogdHR5cGUpIHsKKyAgdF90eXBlKiBhY3R1YWxfdHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOworICByZXR1cm4gIWNhbl9nZW5lcmF0ZV9zaW1wbGVfY29uc3QoYWN0dWFsX3R5cGUpICYmICFhY3R1YWxfdHlwZS0+aXNfc2VydmljZSgpOworfQorCitib29sIHRfcnNfZ2VuZXJhdG9yOjppc192b2lkKHRfdHlwZSogdHR5cGUpIHsKKyAgcmV0dXJuIHR0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiAoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCkgPT0gdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDsKK30KKworYm9vbCB0X3JzX2dlbmVyYXRvcjo6aXNfb3B0aW9uYWwodF9maWVsZDo6ZV9yZXEgcmVxKSB7CisgIHJldHVybiByZXEgPT0gdF9maWVsZDo6VF9PUFRJT05BTCB8fCByZXEgPT0gdF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVDsKK30KKwordF9maWVsZDo6ZV9yZXEgdF9yc19nZW5lcmF0b3I6OmFjdHVhbF9maWVsZF9yZXEodF9maWVsZCogdGZpZWxkLCB0X3JzX2dlbmVyYXRvcjo6ZV9zdHJ1Y3RfdHlwZSBzdHJ1Y3RfdHlwZSkgeworICByZXR1cm4gc3RydWN0X3R5cGUgPT0gdF9yc19nZW5lcmF0b3I6OlRfQVJHUyA/IHRfZmllbGQ6OlRfUkVRVUlSRUQgOiB0ZmllbGQtPmdldF9yZXEoKTsKK30KKworYm9vbCB0X3JzX2dlbmVyYXRvcjo6aGFzX2FyZ3ModF9mdW5jdGlvbiogdGZ1bmMpIHsKKyAgcmV0dXJuIHRmdW5jLT5nZXRfYXJnbGlzdCgpICE9IE5VTEwgJiYgIXRmdW5jLT5nZXRfYXJnbGlzdCgpLT5nZXRfc29ydGVkX21lbWJlcnMoKS5lbXB0eSgpOworfQorCitib29sIHRfcnNfZ2VuZXJhdG9yOjpoYXNfbm9uX3ZvaWRfYXJncyh0X2Z1bmN0aW9uKiB0ZnVuYykgeworICBib29sIGhhc19ub25fdm9pZF9hcmdzID0gZmFsc2U7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiBhcmdzID0gdGZ1bmMtPmdldF9hcmdsaXN0KCktPmdldF9zb3J0ZWRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBhcmdzX2l0ZXI7CisgIGZvciAoYXJnc19pdGVyID0gYXJncy5iZWdpbigpOyBhcmdzX2l0ZXIgIT0gYXJncy5lbmQoKTsgKythcmdzX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiB0ZmllbGQgPSAoKmFyZ3NfaXRlcik7CisgICAgaWYgKCF0ZmllbGQtPmdldF90eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgaGFzX25vbl92b2lkX2FyZ3MgPSB0cnVlOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgcmV0dXJuIGhhc19ub25fdm9pZF9hcmdzOworfQorCitzdHJpbmcgdF9yc19nZW5lcmF0b3I6OnZpc2liaWxpdHlfcXVhbGlmaWVyKHRfcnNfZ2VuZXJhdG9yOjplX3N0cnVjdF90eXBlIHN0cnVjdF90eXBlKSB7CisgIHN3aXRjaChzdHJ1Y3RfdHlwZSkgeworICBjYXNlIHRfcnNfZ2VuZXJhdG9yOjpUX0FSR1M6CisgIGNhc2UgdF9yc19nZW5lcmF0b3I6OlRfUkVTVUxUOgorICAgIHJldHVybiAiIjsKKyAgZGVmYXVsdDoKKyAgICByZXR1cm4gInB1YiAiOworICB9Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6cnVzdF9uYW1lc3BhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBpZiAodHNlcnZpY2UtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lKCkgIT0gZ2V0X3Byb2dyYW0oKS0+Z2V0X25hbWUoKSkgeworICAgIHJldHVybiBydXN0X3NuYWtlX2Nhc2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lKCkpICsgIjo6IjsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gIiI7CisgIH0KK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjpydXN0X25hbWVzcGFjZSh0X3R5cGUqIHR0eXBlKSB7CisgIGlmICh0dHlwZS0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWUoKSAhPSBnZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZSgpKSB7CisgICAgcmV0dXJuIHJ1c3Rfc25ha2VfY2FzZSh0dHlwZS0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWUoKSkgKyAiOjoiOworICB9IGVsc2UgeworICAgIHJldHVybiAiIjsKKyAgfQorfQorCitib29sIHRfcnNfZ2VuZXJhdG9yOjppc19yZXNlcnZlZChjb25zdCBzdHJpbmcmIG5hbWUpIHsKKyAgcmV0dXJuIFJVU1RfUkVTRVJWRURfV09SRFNfU0VULmZpbmQobmFtZSkgIT0gUlVTVF9SRVNFUlZFRF9XT1JEU19TRVQuZW5kKCk7Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6cnVzdF9zdHJ1Y3RfbmFtZSh0X3N0cnVjdCogdHN0cnVjdCkgeworICBzdHJpbmcgYmFzZV9zdHJ1Y3RfbmFtZShydXN0X2NhbWVsX2Nhc2UodHN0cnVjdC0+Z2V0X25hbWUoKSkpOworICByZXR1cm4gcnVzdF9zYWZlX25hbWUoYmFzZV9zdHJ1Y3RfbmFtZSk7Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6cnVzdF9maWVsZF9uYW1lKHRfZmllbGQqIHRmaWVsZCkgeworICBzdHJpbmcgYmFzZV9maWVsZF9uYW1lKHJ1c3Rfc25ha2VfY2FzZSh0ZmllbGQtPmdldF9uYW1lKCkpKTsKKyAgcmV0dXJuIHJ1c3Rfc2FmZV9uYW1lKGJhc2VfZmllbGRfbmFtZSk7Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6cnVzdF91bmlvbl9maWVsZF9uYW1lKHRfZmllbGQqIHRmaWVsZCkgeworICBzdHJpbmcgYmFzZV9maWVsZF9uYW1lKHJ1c3RfY2FtZWxfY2FzZSh0ZmllbGQtPmdldF9uYW1lKCkpKTsKKyAgcmV0dXJuIHJ1c3Rfc2FmZV9uYW1lKGJhc2VfZmllbGRfbmFtZSk7Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6cnVzdF9zYWZlX25hbWUoY29uc3Qgc3RyaW5nJiBuYW1lKSB7CisgIGlmIChpc19yZXNlcnZlZChuYW1lKSkgeworICAgIHJldHVybiBuYW1lICsgIl8iOworICB9IGVsc2UgeworICAgIHJldHVybiBuYW1lOworICB9Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6c2VydmljZV9jYWxsX2NsaWVudF9mdW5jdGlvbl9uYW1lKHRfZnVuY3Rpb24qIHRmdW5jKSB7CisgIHJldHVybiBydXN0X3NuYWtlX2Nhc2UodGZ1bmMtPmdldF9uYW1lKCkpOworfQorCitzdHJpbmcgdF9yc19nZW5lcmF0b3I6OnNlcnZpY2VfY2FsbF9oYW5kbGVyX2Z1bmN0aW9uX25hbWUodF9mdW5jdGlvbiogdGZ1bmMpIHsKKyAgcmV0dXJuICJoYW5kbGVfIiArIHJ1c3Rfc25ha2VfY2FzZSh0ZnVuYy0+Z2V0X25hbWUoKSk7Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6c2VydmljZV9jYWxsX2FyZ3Nfc3RydWN0X25hbWUodF9mdW5jdGlvbiogdGZ1bmMpIHsKKyAgLy8gVGhyaWZ0IGF1dG9tYXRpY2FsbHkgYXBwZW5kcyBgQXJnc2AgdG8gdGhlIGFyZ2xpc3QgbmFtZS4gTm8gbmVlZCB0byBkbyBpdCBoZXJlLgorICByZXR1cm4gcnVzdF9jYW1lbF9jYXNlKHNlcnZpY2VfbmFtZV8pICsgcnVzdF9jYW1lbF9jYXNlKHRmdW5jLT5nZXRfYXJnbGlzdCgpLT5nZXRfbmFtZSgpKTsKK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjpzZXJ2aWNlX2NhbGxfcmVzdWx0X3N0cnVjdF9uYW1lKHRfZnVuY3Rpb24qIHRmdW5jKSB7CisgIHJldHVybiBydXN0X2NhbWVsX2Nhc2Uoc2VydmljZV9uYW1lXykgKyBydXN0X2NhbWVsX2Nhc2UodGZ1bmMtPmdldF9uYW1lKCkpICsgUkVTVUxUX1NUUlVDVF9TVUZGSVg7Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6cnVzdF9zeW5jX2NsaWVudF9tYXJrZXJfdHJhaXRfbmFtZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHJldHVybiAiVCIgKyBydXN0X2NhbWVsX2Nhc2UodHNlcnZpY2UtPmdldF9uYW1lKCkpICsgIlN5bmNDbGllbnRNYXJrZXIiOworfQorCitzdHJpbmcgdF9yc19nZW5lcmF0b3I6OnJ1c3Rfc3luY19jbGllbnRfdHJhaXRfbmFtZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHJldHVybiAiVCIgKyBydXN0X2NhbWVsX2Nhc2UodHNlcnZpY2UtPmdldF9uYW1lKCkpICsgIlN5bmNDbGllbnQiOworfQorCitzdHJpbmcgdF9yc19nZW5lcmF0b3I6OnJ1c3Rfc3luY19jbGllbnRfaW1wbF9uYW1lKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgcmV0dXJuIHJ1c3RfY2FtZWxfY2FzZSh0c2VydmljZS0+Z2V0X25hbWUoKSkgKyAiU3luY0NsaWVudCI7Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6cnVzdF9zeW5jX2hhbmRsZXJfdHJhaXRfbmFtZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHJldHVybiBydXN0X2NhbWVsX2Nhc2UodHNlcnZpY2UtPmdldF9uYW1lKCkpICsgIlN5bmNIYW5kbGVyIjsKK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjpydXN0X3N5bmNfcHJvY2Vzc29yX25hbWUodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICByZXR1cm4gcnVzdF9jYW1lbF9jYXNlKHRzZXJ2aWNlLT5nZXRfbmFtZSgpKSArICJTeW5jUHJvY2Vzc29yIjsKK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjpydXN0X3N5bmNfcHJvY2Vzc29yX2ltcGxfbmFtZSh0X3NlcnZpY2UgKnRzZXJ2aWNlKSB7CisgIHJldHVybiAiVCIgKyBydXN0X2NhbWVsX2Nhc2UodHNlcnZpY2UtPmdldF9uYW1lKCkpICsgIlByb2Nlc3NGdW5jdGlvbnMiOworfQorCitzdHJpbmcgdF9yc19nZW5lcmF0b3I6OnJ1c3RfZW51bV92YXJpYW50X25hbWUoY29uc3Qgc3RyaW5nICZuYW1lKSB7CisgIGJvb2wgYWxsX3VwcGVyY2FzZSA9IHRydWU7CisKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuYW1lLnNpemUoKTsgaSsrKSB7CisgICAgaWYgKGlzYWxudW0obmFtZVtpXSkgJiYgaXNsb3dlcihuYW1lW2ldKSkgeworICAgICAgYWxsX3VwcGVyY2FzZSA9IGZhbHNlOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgaWYgKGFsbF91cHBlcmNhc2UpIHsKKyAgICByZXR1cm4gY2FwaXRhbGl6ZShjYW1lbGNhc2UobG93ZXJjYXNlKG5hbWUpKSk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIGNhcGl0YWxpemUoY2FtZWxjYXNlKG5hbWUpKTsKKyAgfQorfQorCitzdHJpbmcgdF9yc19nZW5lcmF0b3I6OnJ1c3RfdXBwZXJfY2FzZShjb25zdCBzdHJpbmcmIG5hbWUpIHsKKyAgc3RyaW5nIHN0cih1cHBlcmNhc2UodW5kZXJzY29yZShuYW1lKSkpOworICBzdHJpbmdfcmVwbGFjZShzdHIsICJfXyIsICJfIik7CisgIHJldHVybiBzdHI7Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6cnVzdF9zbmFrZV9jYXNlKGNvbnN0IHN0cmluZyYgbmFtZSkgeworICBzdHJpbmcgc3RyKGRlY2FwaXRhbGl6ZSh1bmRlcnNjb3JlKG5hbWUpKSk7CisgIHN0cmluZ19yZXBsYWNlKHN0ciwgIl9fIiwgIl8iKTsKKyAgcmV0dXJuIHN0cjsKK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjpydXN0X2NhbWVsX2Nhc2UoY29uc3Qgc3RyaW5nJiBuYW1lKSB7CisgIHN0cmluZyBzdHIoY2FwaXRhbGl6ZShjYW1lbGNhc2UobmFtZSkpKTsKKyAgc3RyaW5nX3JlcGxhY2Uoc3RyLCAiXyIsICIiKTsKKyAgcmV0dXJuIHN0cjsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6c3RyaW5nX3JlcGxhY2Uoc3RyaW5nJiB0YXJnZXQsIGNvbnN0IHN0cmluZyYgc2VhcmNoX3N0cmluZywgY29uc3Qgc3RyaW5nJiByZXBsYWNlX3N0cmluZykgeworICBpZiAodGFyZ2V0LmVtcHR5KCkpIHsKKyAgICByZXR1cm47CisgIH0KKworICBzaXplX3QgbWF0Y2hfbGVuID0gc2VhcmNoX3N0cmluZy5sZW5ndGgoKTsKKyAgc2l6ZV90IHJlcGxhY2VfbGVuID0gcmVwbGFjZV9zdHJpbmcubGVuZ3RoKCk7CisKKyAgc2l6ZV90IHNlYXJjaF9pZHggPSAwOworICBzaXplX3QgbWF0Y2hfaWR4OworICB3aGlsZSAoKG1hdGNoX2lkeCA9IHRhcmdldC5maW5kKHNlYXJjaF9zdHJpbmcsIHNlYXJjaF9pZHgpKSAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICB0YXJnZXQucmVwbGFjZShtYXRjaF9pZHgsIG1hdGNoX2xlbiwgcmVwbGFjZV9zdHJpbmcpOworICAgIHNlYXJjaF9pZHggPSBtYXRjaF9pZHggKyByZXBsYWNlX2xlbjsKKyAgfQorfQorCitUSFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKAorICBycywKKyAgIlJ1c3QiLAorICAiXG4iKSAvLyBubyBSdXN0LWdlbmVyYXRvci1zcGVjaWZpYyBvcHRpb25zCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X3N0X2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3Rfc3RfZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5NWE5NDkKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X3N0X2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDEwNTYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KKyAqIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCisgKiBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorCisjaW5jbHVkZSAidGhyaWZ0L3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidGhyaWZ0L3ZlcnNpb24uaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9vb3BfZ2VuZXJhdG9yLmgiCisKK3VzaW5nIHN0ZDo6bWFwOwordXNpbmcgc3RkOjpvZnN0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnZlY3RvcjsKKworc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsID0gIlxuIjsgLy8gYXZvaWQgb3N0cmVhbSA8PCBzdGQ6OmVuZGwgZmx1c2hlcworCisvKioKKyAqIFNtYWxsdGFsayBjb2RlIGdlbmVyYXRvci4KKyAqCisgKi8KK2NsYXNzIHRfc3RfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7CitwdWJsaWM6CisgIHRfc3RfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQorICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pIHsKKyAgICAodm9pZClvcHRpb25fc3RyaW5nOworICAgIHRlbXBvcmFyeV92YXIgPSAwOworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7CisKKyAgICAvKiBubyBvcHRpb25zIHlldCAqLworICAgIGZvciggaXRlciA9IHBhcnNlZF9vcHRpb25zLmJlZ2luKCk7IGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCk7ICsraXRlcikgeworICAgICAgdGhyb3cgInVua25vd24gb3B0aW9uIHN0OiIgKyBpdGVyLT5maXJzdDsKKyAgICB9CisKKyAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1zdCI7CisgIH0KKworICAvKioKKyAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcworICAgKi8KKworICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7CisgIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7CisKKyAgLyoqCisgICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpOworICB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSk7CisgIHZvaWQgZ2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfY2xhc3Nfc2lkZV9kZWZpbml0aW9uKCk7CisgIHZvaWQgZ2VuZXJhdGVfZm9yY2VfY29uc3RzKCk7CisKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOworCisgIC8qKgorICAgKiBTdHJ1Y3QgZ2VuZXJhdGlvbiBjb2RlCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfc3Rfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX2FjY2Vzc29ycyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIC8qKgorICAgKiBTZXJ2aWNlLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZW5kX21ldGhvZCh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICB2b2lkIGdlbmVyYXRlX3JlY3ZfbWV0aG9kKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisKKyAgc3RkOjpzdHJpbmcgbWFwX3JlYWRlcih0X21hcCogdG1hcCk7CisgIHN0ZDo6c3RyaW5nIGxpc3RfcmVhZGVyKHRfbGlzdCogdGxpc3QpOworICBzdGQ6OnN0cmluZyBzZXRfcmVhZGVyKHRfc2V0KiB0c2V0KTsKKyAgc3RkOjpzdHJpbmcgc3RydWN0X3JlYWRlcih0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgY2xzTmFtZSk7CisKKyAgc3RkOjpzdHJpbmcgbWFwX3dyaXRlcih0X21hcCogdG1hcCwgc3RkOjpzdHJpbmcgbmFtZSk7CisgIHN0ZDo6c3RyaW5nIGxpc3Rfd3JpdGVyKHRfbGlzdCogdGxpc3QsIHN0ZDo6c3RyaW5nIG5hbWUpOworICBzdGQ6OnN0cmluZyBzZXRfd3JpdGVyKHRfc2V0KiB0c2V0LCBzdGQ6OnN0cmluZyBuYW1lKTsKKyAgc3RkOjpzdHJpbmcgc3RydWN0X3dyaXRlcih0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgZm5hbWUpOworCisgIHN0ZDo6c3RyaW5nIHdyaXRlX3ZhbCh0X3R5cGUqIHQsIHN0ZDo6c3RyaW5nIGZuYW1lKTsKKyAgc3RkOjpzdHJpbmcgcmVhZF92YWwodF90eXBlKiB0KTsKKworICAvKioKKyAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKKyAgICovCisKKyAgc3RkOjpzdHJpbmcgc3RfYXV0b2dlbl9jb21tZW50KCk7CisKKyAgdm9pZCBzdF9jbGFzc19kZWYoc3RkOjpvc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIG5hbWUpOworICB2b2lkIHN0X21ldGhvZChzdGQ6Om9zdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgY2xzLCBzdGQ6OnN0cmluZyBuYW1lKTsKKyAgdm9pZCBzdF9tZXRob2Qoc3RkOjpvc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIGNscywgc3RkOjpzdHJpbmcgbmFtZSwgc3RkOjpzdHJpbmcgY2F0ZWdvcnkpOworICB2b2lkIHN0X2Nsb3NlX21ldGhvZChzdGQ6Om9zdHJlYW0mIG91dCk7CisgIHZvaWQgc3RfY2xhc3NfbWV0aG9kKHN0ZDo6b3N0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBjbHMsIHN0ZDo6c3RyaW5nIG5hbWUpOworICB2b2lkIHN0X2NsYXNzX21ldGhvZChzdGQ6Om9zdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgY2xzLCBzdGQ6OnN0cmluZyBuYW1lLCBzdGQ6OnN0cmluZyBjYXRlZ29yeSk7CisgIHZvaWQgc3Rfc2V0dGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBjbHMsIHN0ZDo6c3RyaW5nIG5hbWUsIHN0ZDo6c3RyaW5nIHR5cGUpOworICB2b2lkIHN0X2dldHRlcihzdGQ6Om9zdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgY2xzLCBzdGQ6OnN0cmluZyBuYW1lKTsKKyAgdm9pZCBzdF9hY2Nlc3NvcnMoc3RkOjpvc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIGNscywgc3RkOjpzdHJpbmcgbmFtZSwgc3RkOjpzdHJpbmcgdHlwZSk7CisKKyAgc3RkOjpzdHJpbmcgY2xhc3NfbmFtZSgpOworICBzdGF0aWMgYm9vbCBpc192YWxpZF9uYW1lc3BhY2UoY29uc3Qgc3RkOjpzdHJpbmcmIHN1Yl9uYW1lc3BhY2UpOworICBzdGQ6OnN0cmluZyBjbGllbnRfY2xhc3NfbmFtZSgpOworICBzdGQ6OnN0cmluZyBwcmVmaXgoc3RkOjpzdHJpbmcgbmFtZSk7CisgIHN0ZDo6c3RyaW5nIGRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkKTsKKyAgc3RkOjpzdHJpbmcgdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpOworCisgIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KTsKKyAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fdHlwZXNfY29tbWVudCh0X2Z1bmN0aW9uKiBmbik7CisKKyAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOworICBzdGQ6OnN0cmluZyBhX3R5cGUodF90eXBlKiB0eXBlKTsKKyAgYm9vbCBpc192b3dlbChjaGFyIGMpOworICBzdGQ6OnN0cmluZyB0ZW1wX25hbWUoKTsKKyAgc3RkOjpzdHJpbmcgZ2VuZXJhdGVkX2NhdGVnb3J5KCk7CisKK3ByaXZhdGU6CisgIC8qKgorICAgKiBGaWxlIHN0cmVhbXMKKyAgICovCisgIGludCB0ZW1wb3JhcnlfdmFyOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfOworfTsKKworLyoqCisgKiBQcmVwYXJlcyBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAorICogc3RyZWFtcy4KKyAqCisgKiBAcGFyYW0gdHByb2dyYW0gVGhlIHByb2dyYW0gdG8gZ2VuZXJhdGUKKyAqLwordm9pZCB0X3N0X2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7CisgIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQorICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOworCisgIHRlbXBvcmFyeV92YXIgPSAwOworCisgIC8vIE1ha2Ugb3V0cHV0IGZpbGUKKyAgc3RyaW5nIGZfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyAiLyIgKyBwcm9ncmFtX25hbWVfICsgIi5zdCI7CisgIGZfLm9wZW4oZl9uYW1lLmNfc3RyKCkpOworCisgIC8vIFByaW50IGhlYWRlcgorICBmXyA8PCBzdF9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsOworCisgIHN0X2NsYXNzX2RlZihmXywgcHJvZ3JhbV9uYW1lXyk7CisgIGdlbmVyYXRlX2NsYXNzX3NpZGVfZGVmaW5pdGlvbigpOworCisgIC8vIEdlbmVyYXRlIGVudW1zCisgIHZlY3Rvcjx0X2VudW0qPiBlbnVtcyA9IHByb2dyYW1fLT5nZXRfZW51bXMoKTsKKyAgdmVjdG9yPHRfZW51bSo+OjppdGVyYXRvciBlbl9pdGVyOworICBmb3IgKGVuX2l0ZXIgPSBlbnVtcy5iZWdpbigpOyBlbl9pdGVyICE9IGVudW1zLmVuZCgpOyArK2VuX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9lbnVtKCplbl9pdGVyKTsKKyAgfQorfQorCitzdHJpbmcgdF9zdF9nZW5lcmF0b3I6OmNsYXNzX25hbWUoKSB7CisgIHJldHVybiBjYXBpdGFsaXplKHByb2dyYW1fbmFtZV8pOworfQorCitib29sIHRfc3RfZ2VuZXJhdG9yOjppc192YWxpZF9uYW1lc3BhY2UoY29uc3Qgc3RkOjpzdHJpbmcmIHN1Yl9uYW1lc3BhY2UpIHsKKyAgcmV0dXJuIHN1Yl9uYW1lc3BhY2UgPT0gInByZWZpeCIgfHwgc3ViX25hbWVzcGFjZSA9PSAiY2F0ZWdvcnkiOworfQorCitzdHJpbmcgdF9zdF9nZW5lcmF0b3I6OnByZWZpeChzdHJpbmcgY2xhc3NfbmFtZSkgeworICBzdHJpbmcgcHJlZml4ID0gcHJvZ3JhbV8tPmdldF9uYW1lc3BhY2UoInNtYWxsdGFsay5wcmVmaXgiKTsKKyAgc3RyaW5nIG5hbWUgPSBjYXBpdGFsaXplKGNsYXNzX25hbWUpOworICBuYW1lID0gcHJlZml4LmVtcHR5KCkgPyBuYW1lIDogKHByZWZpeCArIG5hbWUpOworICByZXR1cm4gbmFtZTsKK30KKworc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjpjbGllbnRfY2xhc3NfbmFtZSgpIHsKKyAgcmV0dXJuIGNhcGl0YWxpemUoc2VydmljZV9uYW1lXykgKyAiQ2xpZW50IjsKK30KKworLyoqCisgKiBBdXRvZ2VuJ2QgY29tbWVudAorICovCitzdHJpbmcgdF9zdF9nZW5lcmF0b3I6OnN0X2F1dG9nZW5fY29tbWVudCgpIHsKKyAgcmV0dXJuIHN0ZDo6c3RyaW5nKCInIikgKyAiQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKCIgKyBUSFJJRlRfVkVSU0lPTiArICIpXG4iICsgIlxuIgorICAgICAgICAgKyAiRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lOR1xuIiArICInIVxuIjsKK30KKwordm9pZCB0X3N0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZm9yY2VfY29uc3RzKCkgeworICBmXyA8PCBwcmVmaXgoY2xhc3NfbmFtZSgpKSA8PCAiIGVudW1zIGtleXNBbmRWYWx1ZXNEbzogWzprIDp2IHwgIiA8PCBwcmVmaXgoY2xhc3NfbmFtZSgpKQorICAgICA8PCAiIGVudW1zIGF0OiBrIHB1dDogdiB2YWx1ZV0uISIgPDwgZW5kbDsKKworICBmXyA8PCBwcmVmaXgoY2xhc3NfbmFtZSgpKSA8PCAiIGNvbnN0YW50cyBrZXlzQW5kVmFsdWVzRG86IFs6ayA6diB8ICIgPDwgcHJlZml4KGNsYXNzX25hbWUoKSkKKyAgICAgPDwgIiBjb25zdGFudHMgYXQ6IGsgcHV0OiB2IHZhbHVlXS4hIiA8PCBlbmRsOworfQorCit2b2lkIHRfc3RfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7CisgIGdlbmVyYXRlX2ZvcmNlX2NvbnN0cygpOworICBmXy5jbG9zZSgpOworfQorCitzdHJpbmcgdF9zdF9nZW5lcmF0b3I6OmdlbmVyYXRlZF9jYXRlZ29yeSgpIHsKKyAgc3RyaW5nIGNhdCA9IHByb2dyYW1fLT5nZXRfbmFtZXNwYWNlKCJzbWFsbHRhbGsuY2F0ZWdvcnkiKTsKKyAgLy8gRm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgVGhyaWZ0IGdyYW1tYXIsIHRoZSBjYXRlZ29yeSBtdXN0CisgIC8vIGJlIHB1bmN0dWF0ZWQgYnkgZG90cy4gIFJlcGxhY2VzIHRoZW0gd2l0aCBkYXNoZXMgaGVyZS4KKyAgZm9yIChzdHJpbmc6Oml0ZXJhdG9yIGl0ZXIgPSBjYXQuYmVnaW4oKTsgaXRlciAhPSBjYXQuZW5kKCk7ICsraXRlcikgeworICAgIGlmICgqaXRlciA9PSAnLicpIHsKKyAgICAgICppdGVyID0gJy0nOworICAgIH0KKyAgfQorICByZXR1cm4gY2F0LnNpemUoKSA/IGNhdCA6ICJHZW5lcmF0ZWQtIiArIGNsYXNzX25hbWUoKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSB0eXBlZGVmLiBUaGlzIGlzIG5vdCBkb25lIGluIFNtYWxsdGFsaywgdHlwZXMgYXJlIGFsbCBpbXBsaWNpdC4KKyAqCisgKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgorICovCit2b2lkIHRfc3RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKKyAgKHZvaWQpdHR5cGVkZWY7Cit9CisKK3ZvaWQgdF9zdF9nZW5lcmF0b3I6OnN0X2NsYXNzX2RlZihzdGQ6Om9zdHJlYW0mIG91dCwgc3RyaW5nIG5hbWUpIHsKKyAgb3V0IDw8ICJPYmplY3Qgc3ViY2xhc3M6ICMiIDw8IHByZWZpeChuYW1lKSA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpbnN0YW5jZVZhcmlhYmxlTmFtZXM6ICcnIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJjbGFzc1ZhcmlhYmxlTmFtZXM6ICcnIgorICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicG9vbERpY3Rpb25hcmllczogJyciIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImNhdGVnb3J5OiAnIgorICAgICAgPDwgZ2VuZXJhdGVkX2NhdGVnb3J5KCkgPDwgIichIiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9zdF9nZW5lcmF0b3I6OnN0X21ldGhvZChzdGQ6Om9zdHJlYW0mIG91dCwgc3RyaW5nIGNscywgc3RyaW5nIG5hbWUpIHsKKyAgc3RfbWV0aG9kKG91dCwgY2xzLCBuYW1lLCAiYXMgeWV0IHVuY2F0ZWdvcml6ZWQiKTsKK30KKwordm9pZCB0X3N0X2dlbmVyYXRvcjo6c3RfY2xhc3NfbWV0aG9kKHN0ZDo6b3N0cmVhbSYgb3V0LCBzdHJpbmcgY2xzLCBzdHJpbmcgbmFtZSkgeworICBzdF9tZXRob2Qob3V0LCBjbHMgKyAiIGNsYXNzIiwgbmFtZSk7Cit9CisKK3ZvaWQgdF9zdF9nZW5lcmF0b3I6OnN0X2NsYXNzX21ldGhvZChzdGQ6Om9zdHJlYW0mIG91dCwgc3RyaW5nIGNscywgc3RyaW5nIG5hbWUsIHN0cmluZyBjYXRlZ29yeSkgeworICBzdF9tZXRob2Qob3V0LCBjbHMsIG5hbWUsIGNhdGVnb3J5KTsKK30KKwordm9pZCB0X3N0X2dlbmVyYXRvcjo6c3RfbWV0aG9kKHN0ZDo6b3N0cmVhbSYgb3V0LCBzdHJpbmcgY2xzLCBzdHJpbmcgbmFtZSwgc3RyaW5nIGNhdGVnb3J5KSB7CisgIGNoYXIgdGltZXN0cls1MF07CisgIHRpbWVfdCByYXd0aW1lOworICBzdHJ1Y3QgdG0qIHRpbmZvOworCisgIHRpbWUoJnJhd3RpbWUpOworICB0aW5mbyA9IGxvY2FsdGltZSgmcmF3dGltZSk7CisgIHN0cmZ0aW1lKHRpbWVzdHIsIDUwLCAiJW0vJWQvJVkgJUg6JU0iLCB0aW5mbyk7CisKKyAgb3V0IDw8ICIhIiA8PCBwcmVmaXgoY2xzKSA8PCAiIG1ldGhvZHNGb3I6ICciICsgY2F0ZWdvcnkgKyAiJyBzdGFtcDogJ3RocmlmdCAiIDw8IHRpbWVzdHIKKyAgICAgIDw8ICInIVxuIiA8PCBuYW1lIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisgIG91dCA8PCBpbmRlbnQoKTsKK30KKwordm9pZCB0X3N0X2dlbmVyYXRvcjo6c3RfY2xvc2VfbWV0aG9kKHN0ZDo6b3N0cmVhbSYgb3V0KSB7CisgIG91dCA8PCAiISAhIiA8PCBlbmRsIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7Cit9CisKK3ZvaWQgdF9zdF9nZW5lcmF0b3I6OnN0X3NldHRlcihzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY2xzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB0eXBlID0gImFuT2JqZWN0IikgeworICBzdF9tZXRob2Qob3V0LCBjbHMsIG5hbWUgKyAiOiAiICsgdHlwZSk7CisgIG91dCA8PCBuYW1lIDw8ICIgOj0gIiArIHR5cGU7CisgIHN0X2Nsb3NlX21ldGhvZChvdXQpOworfQorCit2b2lkIHRfc3RfZ2VuZXJhdG9yOjpzdF9nZXR0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHN0cmluZyBjbHMsIHN0cmluZyBuYW1lKSB7CisgIHN0X21ldGhvZChvdXQsIGNscywgbmFtZSArICIiKTsKKyAgb3V0IDw8ICJeICIgPDwgbmFtZTsKKyAgc3RfY2xvc2VfbWV0aG9kKG91dCk7Cit9CisKK3ZvaWQgdF9zdF9nZW5lcmF0b3I6OnN0X2FjY2Vzc29ycyhzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY2xzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB0eXBlID0gImFuT2JqZWN0IikgeworICBzdF9zZXR0ZXIob3V0LCBjbHMsIG5hbWUsIHR5cGUpOworICBzdF9nZXR0ZXIob3V0LCBjbHMsIG5hbWUpOworfQorCit2b2lkIHRfc3RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jbGFzc19zaWRlX2RlZmluaXRpb24oKSB7CisgIGZfIDw8IHByZWZpeChjbGFzc19uYW1lKCkpIDw8ICIgY2xhc3MiIDw8IGVuZGwgPDwgIlx0aW5zdGFuY2VWYXJpYWJsZU5hbWVzOiAnY29uc3RhbnRzIGVudW1zJyEiCisgICAgIDw8IGVuZGwgPDwgZW5kbDsKKworICBzdF9hY2Nlc3NvcnMoZl8sIGNsYXNzX25hbWUoKSArICIgY2xhc3MiLCAiZW51bXMiKTsKKyAgc3RfYWNjZXNzb3JzKGZfLCBjbGFzc19uYW1lKCkgKyAiIGNsYXNzIiwgImNvbnN0YW50cyIpOworCisgIGZfIDw8IHByZWZpeChjbGFzc19uYW1lKCkpIDw8ICIgZW51bXM6IERpY3Rpb25hcnkgbmV3ISIgPDwgZW5kbDsKKyAgZl8gPDwgcHJlZml4KGNsYXNzX25hbWUoKSkgPDwgIiBjb25zdGFudHM6IERpY3Rpb25hcnkgbmV3ISIgPDwgZW5kbDsKKworICBmXyA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBjb2RlIGZvciBhbiBlbnVtZXJhdGVkIHR5cGUuIERvbmUgdXNpbmcgYSBjbGFzcyB0byBzY29wZQorICogdGhlIHZhbHVlcy4KKyAqCisgKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCisgKi8KK3ZvaWQgdF9zdF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgeworICBzdHJpbmcgY2xzX25hbWUgPSBwcm9ncmFtX25hbWVfICsgY2FwaXRhbGl6ZSh0ZW51bS0+Z2V0X25hbWUoKSk7CisKKyAgZl8gPDwgcHJlZml4KGNsYXNzX25hbWUoKSkgPDwgIiBlbnVtcyBhdDogJyIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIicgcHV0OiBbIgorICAgICA8PCAiKERpY3Rpb25hcnkgbmV3ICIgPDwgZW5kbDsKKworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7CisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgICBmXyA8PCAiXHRhdDogJyIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInIHB1dDogIiA8PCB2YWx1ZSA8PCAiOyIgPDwgZW5kbDsKKyAgfQorCisgIGZfIDw8ICJcdHlvdXJzZWxmKV0hIiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGUgYSBjb25zdGFudCB2YWx1ZQorICovCit2b2lkIHRfc3RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpIHsKKyAgdF90eXBlKiB0eXBlID0gdGNvbnN0LT5nZXRfdHlwZSgpOworICBzdHJpbmcgbmFtZSA9IHRjb25zdC0+Z2V0X25hbWUoKTsKKyAgdF9jb25zdF92YWx1ZSogdmFsdWUgPSB0Y29uc3QtPmdldF92YWx1ZSgpOworCisgIGZfIDw8IHByZWZpeChjbGFzc19uYW1lKCkpIDw8ICIgY29uc3RhbnRzIGF0OiAnIiA8PCBuYW1lIDw8ICInIHB1dDogWyIKKyAgICAgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHR5cGUsIHZhbHVlKSA8PCAiXSEiIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBQcmludHMgdGhlIHZhbHVlIG9mIGEgY29uc3RhbnQgd2l0aCB0aGUgZ2l2ZW4gdHlwZS4gTm90ZSB0aGF0IHR5cGUgY2hlY2tpbmcKKyAqIGlzIE5PVCBwZXJmb3JtZWQgaW4gdGhpcyBmdW5jdGlvbiBhcyBpdCBpcyBhbHdheXMgcnVuIGJlZm9yZWhhbmQgdXNpbmcgdGhlCisgKiB2YWxpZGF0ZV90eXBlcyBtZXRob2QgaW4gbWFpbi5jYworICovCitzdHJpbmcgdF9zdF9nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgb3V0IDw8ICciJyA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICciJzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIG91dCA8PCAodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwID8gInRydWUiIDogImZhbHNlIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgeworICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIG91dCA8PCAiKCIgPDwgY2FwaXRhbGl6ZSh0eXBlLT5nZXRfbmFtZSgpKSA8PCAiIG5ldyAiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOworICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKKyAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisgICAgICB9CisKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkgPDwgIjogIgorICAgICAgICAgIDw8IHJlbmRlcl9jb25zdF92YWx1ZShmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCkgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICAgIG91dCA8PCBpbmRlbnQoKSA8PCAieW91cnNlbGYpIjsKKworICAgIGluZGVudF9kb3duKCk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisgICAgb3V0IDw8ICIoRGljdGlvbmFyeSBuZXciIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50X3VwKCk7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8IGluZGVudCgpOworICAgICAgb3V0IDw8ICJhdDogIiA8PCByZW5kZXJfY29uc3RfdmFsdWUoa3R5cGUsIHZfaXRlci0+Zmlyc3QpOworICAgICAgb3V0IDw8ICIgcHV0OiAiOworICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZSh2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgICAgb3V0IDw8ICI7IiA8PCBlbmRsOworICAgIH0KKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgaW5kZW50KCkgPDwgInlvdXJzZWxmKSI7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnRfZG93bigpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkgeworICAgIHRfdHlwZSogZXR5cGU7CisgICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9IGVsc2UgeworICAgICAgZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIH0KKyAgICBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgIG91dCA8PCAiKFNldCBuZXciIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCAiKE9yZGVyZWRDb2xsZWN0aW9uIG5ldyIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50X3VwKCk7CisgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgaW5kZW50KCk7CisgICAgICBvdXQgPDwgImFkZDogIiA8PCByZW5kZXJfY29uc3RfdmFsdWUoZXR5cGUsICp2X2l0ZXIpOworICAgICAgb3V0IDw8ICI7IiA8PCBlbmRsOworICAgIH0KKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgaW5kZW50KCkgPDwgInlvdXJzZWxmKSI7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnRfZG93bigpOworICB9IGVsc2UgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgQ09OU1RBTlQgRk9SIFRZUEU6ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworICB9CisgIHJldHVybiBvdXQuc3RyKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgU21hbGx0YWxrIHN0cnVjdAorICovCit2b2lkIHRfc3RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgZ2VuZXJhdGVfc3Rfc3RydWN0KGZfLCB0c3RydWN0LCBmYWxzZSk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGV4Y2VwdGlvbi4gQmFzaWNhbGx5IHRoZSBzYW1lCisgKiBhcyBhIHN0cnVjdCBidXQgZXh0ZW5kcyB0aGUgRXhjZXB0aW9uIGNsYXNzLgorICoKKyAqIEBwYXJhbSB0eGNlcHRpb24gVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9zdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKKyAgZ2VuZXJhdGVfc3Rfc3RydWN0KGZfLCB0eGNlcHRpb24sIHRydWUpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNtYWxsdGFsayBjbGFzcyB0byByZXByZXNlbnQgYSBzdHJ1Y3QKKyAqLwordm9pZCB0X3N0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3Rfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uID0gZmFsc2UpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBpZiAoaXNfZXhjZXB0aW9uKQorICAgIG91dCA8PCAiRXJyb3IiOworICBlbHNlCisgICAgb3V0IDw8ICJPYmplY3QiOworCisgIG91dCA8PCAiIHN1YmNsYXNzOiAjIiA8PCBwcmVmaXgodHlwZV9uYW1lKHRzdHJ1Y3QpKSA8PCBlbmRsIDw8ICJcdGluc3RhbmNlVmFyaWFibGVOYW1lczogJyI7CisKKyAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgeworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIGlmIChtX2l0ZXIgIT0gbWVtYmVycy5iZWdpbigpKQorICAgICAgICBvdXQgPDwgIiAiOworICAgICAgb3V0IDw8IGNhbWVsY2FzZSgoKm1faXRlciktPmdldF9uYW1lKCkpOworICAgIH0KKyAgfQorCisgIG91dCA8PCAiJ1xuIgorICAgICAgPDwgIlx0Y2xhc3NWYXJpYWJsZU5hbWVzOiAnJ1xuIgorICAgICAgPDwgIlx0cG9vbERpY3Rpb25hcmllczogJydcbiIKKyAgICAgIDw8ICJcdGNhdGVnb3J5OiAnIiA8PCBnZW5lcmF0ZWRfY2F0ZWdvcnkoKSA8PCAiJyFcblxuIjsKKworICBnZW5lcmF0ZV9hY2Nlc3NvcnMob3V0LCB0c3RydWN0KTsKK30KKworYm9vbCB0X3N0X2dlbmVyYXRvcjo6aXNfdm93ZWwoY2hhciBjKSB7CisgIHN3aXRjaCAodG9sb3dlcihjKSkgeworICBjYXNlICdhJzoKKyAgY2FzZSAnZSc6CisgIGNhc2UgJ2knOgorICBjYXNlICdvJzoKKyAgY2FzZSAndSc6CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCitzdHJpbmcgdF9zdF9nZW5lcmF0b3I6OmFfdHlwZSh0X3R5cGUqIHR5cGUpIHsKKyAgc3RyaW5nIHByZWZpeDsKKworICBpZiAoaXNfdm93ZWwodHlwZV9uYW1lKHR5cGUpWzBdKSkKKyAgICBwcmVmaXggPSAiYW4iOworICBlbHNlCisgICAgcHJlZml4ID0gImEiOworCisgIHJldHVybiBwcmVmaXggKyBjYXBpdGFsaXplKHR5cGVfbmFtZSh0eXBlKSk7Cit9CisKK3ZvaWQgdF9zdF9nZW5lcmF0b3I6OmdlbmVyYXRlX2FjY2Vzc29ycyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKyAgc3RyaW5nIHR5cGU7CisgIHN0cmluZyBwcmVmaXg7CisKKyAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgeworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIHN0X2FjY2Vzc29ycyhvdXQsCisgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZSh0eXBlX25hbWUodHN0cnVjdCkpLAorICAgICAgICAgICAgICAgICAgIGNhbWVsY2FzZSgoKm1faXRlciktPmdldF9uYW1lKCkpLAorICAgICAgICAgICAgICAgICAgIGFfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpKTsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSB0aHJpZnQgc2VydmljZS4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgorICovCit2b2lkIHRfc3RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UpOworICAvLyBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0c2VydmljZSk7Cit9CisKK3N0cmluZyB0X3N0X2dlbmVyYXRvcjo6dGVtcF9uYW1lKCkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OworICBvdXQgPDwgInRlbXAiIDw8IHRlbXBvcmFyeV92YXIrKzsKKyAgcmV0dXJuIG91dC5zdHIoKTsKK30KKworc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjptYXBfd3JpdGVyKHRfbWFwKiB0bWFwLCBzdHJpbmcgZm5hbWUpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKKyAgc3RyaW5nIGtleSA9IHRlbXBfbmFtZSgpOworICBzdHJpbmcgdmFsID0gdGVtcF9uYW1lKCk7CisKKyAgb3V0IDw8ICJbb3Byb3Qgd3JpdGVNYXBCZWdpbjogKFRNYXAgbmV3IGtleVR5cGU6ICIgPDwgdHlwZV90b19lbnVtKHRtYXAtPmdldF9rZXlfdHlwZSgpKQorICAgICAgPDwgIjsgdmFsdWVUeXBlOiAiIDw8IHR5cGVfdG9fZW51bSh0bWFwLT5nZXRfdmFsX3R5cGUoKSkgPDwgIjsgc2l6ZTogIiA8PCBmbmFtZSA8PCAiIHNpemUpLiIKKyAgICAgIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCBmbmFtZSA8PCAiIGtleXNBbmRWYWx1ZXNEbzogWzoiIDw8IGtleSA8PCAiIDoiIDw8IHZhbCA8PCAiIHwiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCB3cml0ZV92YWwodG1hcC0+Z2V0X2tleV90eXBlKCksIGtleSkgPDwgIi4iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8IHdyaXRlX3ZhbCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdmFsKTsKKyAgaW5kZW50X2Rvd24oKTsKKworICBvdXQgPDwgIl0uIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdCB3cml0ZU1hcEVuZF0gdmFsdWUiOworICBpbmRlbnRfZG93bigpOworCisgIHJldHVybiBvdXQuc3RyKCk7Cit9CisKK3N0cmluZyB0X3N0X2dlbmVyYXRvcjo6bWFwX3JlYWRlcih0X21hcCogdG1hcCkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OworICBzdHJpbmcgZGVzYyA9IHRlbXBfbmFtZSgpOworICBzdHJpbmcgdmFsID0gdGVtcF9uYW1lKCk7CisKKyAgb3V0IDw8ICJbfCIgPDwgZGVzYyA8PCAiICIgPDwgdmFsIDw8ICJ8ICIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8IGRlc2MgPDwgIiA6PSBpcHJvdCByZWFkTWFwQmVnaW4uIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IHZhbAorICAgICAgPDwgIiA6PSBEaWN0aW9uYXJ5IG5ldy4iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgZGVzYyA8PCAiIHNpemUgdGltZXNSZXBlYXQ6IFsiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCB2YWwgPDwgIiBhdDogIiA8PCByZWFkX3ZhbCh0bWFwLT5nZXRfa2V5X3R5cGUoKSkKKyAgICAgIDw8ICIgcHV0OiAiIDw8IHJlYWRfdmFsKHRtYXAtPmdldF92YWxfdHlwZSgpKTsKKyAgaW5kZW50X2Rvd24oKTsKKworICBvdXQgPDwgIl0uIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpcHJvdCByZWFkTWFwRW5kLiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCB2YWwgPDwgIl0gdmFsdWUiOworICBpbmRlbnRfZG93bigpOworCisgIHJldHVybiBvdXQuc3RyKCk7Cit9CisKK3N0cmluZyB0X3N0X2dlbmVyYXRvcjo6bGlzdF93cml0ZXIodF9saXN0KiB0bGlzdCwgc3RyaW5nIGZuYW1lKSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7CisgIHN0cmluZyB2YWwgPSB0ZW1wX25hbWUoKTsKKworICBvdXQgPDwgIltvcHJvdCB3cml0ZUxpc3RCZWdpbjogKFRMaXN0IG5ldyBlbGVtVHlwZTogIiA8PCB0eXBlX3RvX2VudW0odGxpc3QtPmdldF9lbGVtX3R5cGUoKSkKKyAgICAgIDw8ICI7IHNpemU6ICIgPDwgZm5hbWUgPDwgIiBzaXplKS4iIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCBmbmFtZSA8PCAiIGRvOiBbOiIgPDwgdmFsIDw8ICJ8IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgd3JpdGVfdmFsKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIHZhbCkgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKworICBvdXQgPDwgIl0uIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdCB3cml0ZUxpc3RFbmRdIHZhbHVlIjsKKyAgaW5kZW50X2Rvd24oKTsKKworICByZXR1cm4gb3V0LnN0cigpOworfQorCitzdHJpbmcgdF9zdF9nZW5lcmF0b3I6Omxpc3RfcmVhZGVyKHRfbGlzdCogdGxpc3QpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKKyAgc3RyaW5nIGRlc2MgPSB0ZW1wX25hbWUoKTsKKyAgc3RyaW5nIHZhbCA9IHRlbXBfbmFtZSgpOworCisgIG91dCA8PCAiW3wiIDw8IGRlc2MgPDwgIiAiIDw8IHZhbCA8PCAifCAiIDw8IGRlc2MgPDwgIiA6PSBpcHJvdCByZWFkTGlzdEJlZ2luLiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8IHZhbCA8PCAiIDo9IE9yZGVyZWRDb2xsZWN0aW9uIG5ldy4iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgZGVzYworICAgICAgPDwgIiBzaXplIHRpbWVzUmVwZWF0OiBbIiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworICBvdXQgPDwgaW5kZW50KCkgPDwgdmFsIDw8ICIgYWRkOiAiIDw8IHJlYWRfdmFsKHRsaXN0LT5nZXRfZWxlbV90eXBlKCkpOworICBpbmRlbnRfZG93bigpOworCisgIG91dCA8PCAiXS4iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlwcm90IHJlYWRMaXN0RW5kLiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCB2YWwgPDwgIl0gdmFsdWUiOworICBpbmRlbnRfZG93bigpOworCisgIHJldHVybiBvdXQuc3RyKCk7Cit9CisKK3N0cmluZyB0X3N0X2dlbmVyYXRvcjo6c2V0X3dyaXRlcih0X3NldCogdHNldCwgc3RyaW5nIGZuYW1lKSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7CisgIHN0cmluZyB2YWwgPSB0ZW1wX25hbWUoKTsKKworICBvdXQgPDwgIltvcHJvdCB3cml0ZVNldEJlZ2luOiAoVFNldCBuZXcgZWxlbVR5cGU6ICIgPDwgdHlwZV90b19lbnVtKHRzZXQtPmdldF9lbGVtX3R5cGUoKSkKKyAgICAgIDw8ICI7IHNpemU6ICIgPDwgZm5hbWUgPDwgIiBzaXplKS4iIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCBmbmFtZSA8PCAiIGRvOiBbOiIgPDwgdmFsIDw8ICJ8IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgd3JpdGVfdmFsKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgdmFsKSA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworCisgIG91dCA8PCAiXS4iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90IHdyaXRlU2V0RW5kXSB2YWx1ZSI7CisgIGluZGVudF9kb3duKCk7CisKKyAgcmV0dXJuIG91dC5zdHIoKTsKK30KKworc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjpzZXRfcmVhZGVyKHRfc2V0KiB0c2V0KSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7CisgIHN0cmluZyBkZXNjID0gdGVtcF9uYW1lKCk7CisgIHN0cmluZyB2YWwgPSB0ZW1wX25hbWUoKTsKKworICBvdXQgPDwgIlt8IiA8PCBkZXNjIDw8ICIgIiA8PCB2YWwgPDwgInwgIiA8PCBkZXNjIDw8ICIgOj0gaXByb3QgcmVhZFNldEJlZ2luLiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8IHZhbCA8PCAiIDo9IFNldCBuZXcuIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IGRlc2MgPDwgIiBzaXplIHRpbWVzUmVwZWF0OiBbIgorICAgICAgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8IHZhbCA8PCAiIGFkZDogIiA8PCByZWFkX3ZhbCh0c2V0LT5nZXRfZWxlbV90eXBlKCkpOworICBpbmRlbnRfZG93bigpOworCisgIG91dCA8PCAiXS4iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlwcm90IHJlYWRTZXRFbmQuIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IHZhbCA8PCAiXSB2YWx1ZSI7CisgIGluZGVudF9kb3duKCk7CisKKyAgcmV0dXJuIG91dC5zdHIoKTsKK30KKworc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjpzdHJ1Y3Rfd3JpdGVyKHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgc25hbWUpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOworCisgIG91dCA8PCAiW29wcm90IHdyaXRlU3RydWN0QmVnaW46ICIKKyAgICAgIDw8ICIoVFN0cnVjdCBuZXcgbmFtZTogJyIgKyB0c3RydWN0LT5nZXRfbmFtZSgpICsgIicpLiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICBib29sIG9wdGlvbmFsID0gKCpmbGRfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMOworICAgIHN0cmluZyBmbmFtZSA9IGNhbWVsY2FzZSgoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgc3RyaW5nIGFjY2Vzc29yID0gc25hbWUgKyAiICIgKyBjYW1lbGNhc2UoZm5hbWUpOworCisgICAgaWYgKG9wdGlvbmFsKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgYWNjZXNzb3IgPDwgIiBpZk5vdE5pbDogWyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qgd3JpdGVGaWVsZEJlZ2luOiAoVEZpZWxkIG5ldyBuYW1lOiAnIiA8PCBmbmFtZQorICAgICAgICA8PCAiJzsgdHlwZTogIiA8PCB0eXBlX3RvX2VudW0oKCpmbGRfaXRlciktPmdldF90eXBlKCkpCisgICAgICAgIDw8ICI7IGlkOiAiIDw8ICgqZmxkX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIikuIiA8PCBlbmRsOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8IHdyaXRlX3ZhbCgoKmZsZF9pdGVyKS0+Z2V0X3R5cGUoKSwgYWNjZXNzb3IpIDw8ICIuIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICJvcHJvdCB3cml0ZUZpZWxkRW5kIjsKKworICAgIGlmIChvcHRpb25hbCkgeworICAgICAgb3V0IDw8ICJdIjsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgfQorCisgICAgb3V0IDw8ICIuIiA8PCBlbmRsOworICB9CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJvcHJvdCB3cml0ZUZpZWxkU3RvcDsgd3JpdGVTdHJ1Y3RFbmRdIHZhbHVlIjsKKyAgaW5kZW50X2Rvd24oKTsKKworICByZXR1cm4gb3V0LnN0cigpOworfQorCitzdHJpbmcgdF9zdF9nZW5lcmF0b3I6OnN0cnVjdF9yZWFkZXIodF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBjbHNOYW1lID0gIiIpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7CisgIHN0cmluZyB2YWwgPSB0ZW1wX25hbWUoKTsKKyAgc3RyaW5nIGRlc2MgPSB0ZW1wX25hbWUoKTsKKyAgc3RyaW5nIGZvdW5kID0gdGVtcF9uYW1lKCk7CisKKyAgaWYgKGNsc05hbWUuc2l6ZSgpID09IDApIHsKKyAgICBjbHNOYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKKyAgfQorCisgIG91dCA8PCAiW3wiIDw8IGRlc2MgPDwgIiAiIDw8IHZhbCA8PCAifCIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gVGhpcyBpcyBuYXN0eSwgYnV0IHdpdGhvdXQgaXQgd2UnbGwgYnJlYWsgdGhpbmdzIGJ5IHByZWZpeGluZyBUUmVzdWx0LgorICBzdHJpbmcgbmFtZSA9ICgoY2FwaXRhbGl6ZShjbHNOYW1lKSA9PSAiVFJlc3VsdCIpID8gY2FwaXRhbGl6ZShjbHNOYW1lKSA6IHByZWZpeChjbHNOYW1lKSk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCB2YWwgPDwgIiA6PSAiIDw8IG5hbWUgPDwgIiBuZXcuIiA8PCBlbmRsOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaXByb3QgcmVhZFN0cnVjdEJlZ2luLiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiWyIgPDwgZGVzYworICAgICAgPDwgIiA6PSBpcHJvdCByZWFkRmllbGRCZWdpbi4iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgZGVzYworICAgICAgPDwgIiB0eXBlID0gVFR5cGUgc3RvcF0gd2hpbGVGYWxzZTogW3wiIDw8IGZvdW5kIDw8ICJ8IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCBkZXNjIDw8ICIgaWQgPSAiIDw8ICgqZmxkX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIiBpZlRydWU6IFsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgZm91bmQgPDwgIiA6PSB0cnVlLiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCB2YWwgPDwgIiAiCisgICAgICAgIDw8IGNhbWVsY2FzZSgoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIjogIiA8PCByZWFkX3ZhbCgoKmZsZF9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgaW5kZW50X2Rvd24oKTsKKworICAgIG91dCA8PCAiXS4iIDw8IGVuZGw7CisgIH0KKworICBvdXQgPDwgaW5kZW50KCkgPDwgZm91bmQgPDwgIiBpZk5pbDogW2lwcm90IHNraXA6ICIgPDwgZGVzYyA8PCAiIHR5cGVdXS4iIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJvcHJvdCByZWFkU3RydWN0RW5kLiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCB2YWwgPDwgIl0gdmFsdWUiOworICBpbmRlbnRfZG93bigpOworCisgIHJldHVybiBvdXQuc3RyKCk7Cit9CisKK3N0cmluZyB0X3N0X2dlbmVyYXRvcjo6d3JpdGVfdmFsKHRfdHlwZSogdCwgc3RyaW5nIGZuYW1lKSB7CisgIHQgPSBnZXRfdHJ1ZV90eXBlKHQpOworCisgIGlmICh0LT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0KS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gImlwcm90IHdyaXRlRG91YmxlOiAiICsgZm5hbWUgKyAiIGFzRmxvYXQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiaXByb3Qgd3JpdGUiICsgY2FwaXRhbGl6ZSh0eXBlX25hbWUodCkpICsgIjogIiArIGZuYW1lICsgIiBhc0ludGVnZXIiOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gImlwcm90IHdyaXRlIiArIGNhcGl0YWxpemUodHlwZV9uYW1lKHQpKSArICI6ICIgKyBmbmFtZTsKKyAgICB9CisgIH0gZWxzZSBpZiAodC0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gbWFwX3dyaXRlcigodF9tYXAqKXQsIGZuYW1lKTsKKyAgfSBlbHNlIGlmICh0LT5pc19zdHJ1Y3QoKSB8fCB0LT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuIHN0cnVjdF93cml0ZXIoKHRfc3RydWN0Kil0LCBmbmFtZSk7CisgIH0gZWxzZSBpZiAodC0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuIGxpc3Rfd3JpdGVyKCh0X2xpc3QqKXQsIGZuYW1lKTsKKyAgfSBlbHNlIGlmICh0LT5pc19zZXQoKSkgeworICAgIHJldHVybiBzZXRfd3JpdGVyKCh0X3NldCopdCwgZm5hbWUpOworICB9IGVsc2UgaWYgKHQtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiaXByb3Qgd3JpdGVJMzI6ICIgKyBmbmFtZTsKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyAiU29ycnksIEkgZG9uJ3Qga25vdyBob3cgdG8gd3JpdGUgdGhpczogIiArIHR5cGVfbmFtZSh0KTsKKyAgfQorfQorCitzdHJpbmcgdF9zdF9nZW5lcmF0b3I6OnJlYWRfdmFsKHRfdHlwZSogdCkgeworICB0ID0gZ2V0X3RydWVfdHlwZSh0KTsKKworICBpZiAodC0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICByZXR1cm4gImlwcm90IHJlYWQiICsgY2FwaXRhbGl6ZSh0eXBlX25hbWUodCkpOworICB9IGVsc2UgaWYgKHQtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuIG1hcF9yZWFkZXIoKHRfbWFwKil0KTsKKyAgfSBlbHNlIGlmICh0LT5pc19zdHJ1Y3QoKSB8fCB0LT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuIHN0cnVjdF9yZWFkZXIoKHRfc3RydWN0Kil0KTsKKyAgfSBlbHNlIGlmICh0LT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gbGlzdF9yZWFkZXIoKHRfbGlzdCopdCk7CisgIH0gZWxzZSBpZiAodC0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gc2V0X3JlYWRlcigodF9zZXQqKXQpOworICB9IGVsc2UgaWYgKHQtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiaXByb3QgcmVhZEkzMiI7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgIlNvcnJ5LCBJIGRvbid0IGtub3cgaG93IHRvIHJlYWQgdGhpczogIiArIHR5cGVfbmFtZSh0KTsKKyAgfQorfQorCit2b2lkIHRfc3RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZW5kX21ldGhvZCh0X2Z1bmN0aW9uKiBmdW5jdGlvbikgeworICBzdHJpbmcgZnVubmFtZSA9IGZ1bmN0aW9uLT5nZXRfbmFtZSgpOworICBzdHJpbmcgc2lnbmF0dXJlID0gZnVuY3Rpb25fc2lnbmF0dXJlKGZ1bmN0aW9uKTsKKyAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSBmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7CisKKyAgc3RfbWV0aG9kKGZfLCBjbGllbnRfY2xhc3NfbmFtZSgpLCAic2VuZCIgKyBjYXBpdGFsaXplKHNpZ25hdHVyZSkpOworICBmXyA8PCAib3Byb3Qgd3JpdGVNZXNzYWdlQmVnaW46IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBmXyA8PCBpbmRlbnQoKSA8PCAiKFRDYWxsTWVzc2FnZSBuZXciIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZfIDw8IGluZGVudCgpIDw8ICJuYW1lOiAnIiA8PCBmdW5uYW1lIDw8ICInOyAiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInNlcWlkOiBzZWxmIG5leHRTZXFpZCkuIgorICAgICA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnRfZG93bigpOworCisgIGZfIDw8IGluZGVudCgpIDw8ICJvcHJvdCB3cml0ZVN0cnVjdEJlZ2luOiAiCisgICAgIDw8ICIoVFN0cnVjdCBuZXcgbmFtZTogJyIgKyBjYXBpdGFsaXplKGNhbWVsY2FzZShmdW5uYW1lKSkgKyAiX2FyZ3MnKS4iIDw8IGVuZGw7CisKKyAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICBzdHJpbmcgZm5hbWUgPSBjYW1lbGNhc2UoKCpmbGRfaXRlciktPmdldF9uYW1lKCkpOworCisgICAgZl8gPDwgaW5kZW50KCkgPDwgIm9wcm90IHdyaXRlRmllbGRCZWdpbjogKFRGaWVsZCBuZXcgbmFtZTogJyIgPDwgZm5hbWUKKyAgICAgICA8PCAiJzsgdHlwZTogIiA8PCB0eXBlX3RvX2VudW0oKCpmbGRfaXRlciktPmdldF90eXBlKCkpIDw8ICI7IGlkOiAiIDw8ICgqZmxkX2l0ZXIpLT5nZXRfa2V5KCkKKyAgICAgICA8PCAiKS4iIDw8IGVuZGw7CisKKyAgICBmXyA8PCBpbmRlbnQoKSA8PCB3cml0ZV92YWwoKCpmbGRfaXRlciktPmdldF90eXBlKCksIGZuYW1lKSA8PCAiLiIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgIDw8ICJvcHJvdCB3cml0ZUZpZWxkRW5kLiIgPDwgZW5kbDsKKyAgfQorCisgIGZfIDw8IGluZGVudCgpIDw8ICJvcHJvdCB3cml0ZUZpZWxkU3RvcDsgd3JpdGVTdHJ1Y3RFbmQ7IHdyaXRlTWVzc2FnZUVuZC4iIDw8IGVuZGw7CisgIGZfIDw8IGluZGVudCgpIDw8ICJvcHJvdCB0cmFuc3BvcnQgZmx1c2giOworCisgIHN0X2Nsb3NlX21ldGhvZChmXyk7Cit9CisKKy8vIFdlIG9ubHkgc3VwcG9ydCByZWNlaXZpbmcgVFJlc3VsdCBzdHJ1Y3R1cmVzIChzbyB0aGlzIHdvbid0IHdvcmsgb24gdGhlIHNlcnZlciBzaWRlKQordm9pZCB0X3N0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfcmVjdl9tZXRob2QodF9mdW5jdGlvbiogZnVuY3Rpb24pIHsKKyAgc3RyaW5nIGZ1bm5hbWUgPSBjYW1lbGNhc2UoZnVuY3Rpb24tPmdldF9uYW1lKCkpOworICBzdHJpbmcgc2lnbmF0dXJlID0gZnVuY3Rpb25fc2lnbmF0dXJlKGZ1bmN0aW9uKTsKKworICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sICJUUmVzdWx0Iik7CisgIHRfZmllbGQgc3VjY2VzcyhmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKKyAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7CisKKyAgdF9zdHJ1Y3QqIHhzID0gZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAvLyBkdXBsaWNhdGUgdGhlIGZpZWxkLCBidXQgY2FsbCBpdCAiZXhjZXB0aW9uIi4uLiB3ZSBkb24ndCBuZWVkIGEgZHluYW1pYyBuYW1lCisgICAgdF9maWVsZCogZXhjZXB0aW9uID0gbmV3IHRfZmllbGQoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpLCAiZXhjZXB0aW9uIiwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkpOworICAgIHJlc3VsdC5hcHBlbmQoZXhjZXB0aW9uKTsKKyAgfQorCisgIHN0X21ldGhvZChmXywgY2xpZW50X2NsYXNzX25hbWUoKSwgInJlY3YiICsgY2FwaXRhbGl6ZShmdW5uYW1lKSk7CisgIGZfIDw8ICJ8IGYgbXNnIHJlcyB8ICIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAibXNnIDo9IG9wcm90IHJlYWRNZXNzYWdlQmVnaW4uIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgIDw8ICJzZWxmIHZhbGlkYXRlUmVtb3RlTWVzc2FnZTogbXNnLiIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICA8PCAicmVzIDo9ICIgPDwgc3RydWN0X3JlYWRlcigmcmVzdWx0KSA8PCAiLiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3QgcmVhZE1lc3NhZ2VFbmQuIgorICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdCB0cmFuc3BvcnQgZmx1c2guIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgIDw8ICJyZXMgZXhjZXB0aW9uIGlmTm90TmlsOiBbcmVzIGV4Y2VwdGlvbiBzaWduYWxdLiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiXiByZXMiOworICBzdF9jbG9zZV9tZXRob2QoZl8pOworfQorCitzdHJpbmcgdF9zdF9nZW5lcmF0b3I6OmZ1bmN0aW9uX3R5cGVzX2NvbW1lbnQodF9mdW5jdGlvbiogZm4pIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gZm4tPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBvdXQgPDwgIlwiIjsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIG91dCA8PCBjYW1lbGNhc2UoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiOiAiIDw8IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF90eXBlKCkpOworICAgIGlmICgoZl9pdGVyICsgMSkgIT0gZmllbGRzLmVuZCgpKSB7CisgICAgICBvdXQgPDwgIiwgIjsKKyAgICB9CisgIH0KKworICBvdXQgPDwgIlwiIjsKKworICByZXR1cm4gb3V0LnN0cigpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KKyAqLwordm9pZCB0X3N0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19jbGllbnQgPSAiVENsaWVudCI7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworCisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7CisgICAgZXh0ZW5kc19jbGllbnQgPSBleHRlbmRzICsgIkNsaWVudCI7CisgIH0KKworICBmXyA8PCBleHRlbmRzX2NsaWVudCA8PCAiIHN1YmNsYXNzOiAjIiA8PCBwcmVmaXgoY2xpZW50X2NsYXNzX25hbWUoKSkgPDwgZW5kbAorICAgICA8PCAiXHRpbnN0YW5jZVZhcmlhYmxlTmFtZXM6ICcnXG4iCisgICAgIDw8ICJcdGNsYXNzVmFyaWFibGVOYW1lczogJydcbiIKKyAgICAgPDwgIlx0cG9vbERpY3Rpb25hcmllczogJydcbiIKKyAgICAgPDwgIlx0Y2F0ZWdvcnk6ICciIDw8IGdlbmVyYXRlZF9jYXRlZ29yeSgpIDw8ICInIVxuXG4iOworCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgc3RyaW5nIGZ1bm5hbWUgPSBjYW1lbGNhc2UoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICBzdHJpbmcgc2lnbmF0dXJlID0gZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpOworCisgICAgc3RfbWV0aG9kKGZfLCBjbGllbnRfY2xhc3NfbmFtZSgpLCBzaWduYXR1cmUpOworICAgIGZfIDw8IGZ1bmN0aW9uX3R5cGVzX2NvbW1lbnQoKmZfaXRlcikgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAic2VsZiBzZW5kIgorICAgICAgIDw8IGNhcGl0YWxpemUoc2lnbmF0dXJlKSA8PCAiLiIgPDwgZW5kbDsKKworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgZl8gPDwgaW5kZW50KCkgPDwgIl4gc2VsZiByZWN2IiA8PCBjYXBpdGFsaXplKGZ1bm5hbWUpIDw8ICIgc3VjY2VzcyAiIDw8IGVuZGw7CisgICAgfQorCisgICAgc3RfY2xvc2VfbWV0aG9kKGZfKTsKKworICAgIGdlbmVyYXRlX3NlbmRfbWV0aG9kKCpmX2l0ZXIpOworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgZ2VuZXJhdGVfcmVjdl9tZXRob2QoKmZfaXRlcik7CisgICAgfQorICB9Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAndHlwZSBuYW1lKGFyZ3MpJworICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgorICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgorICovCitzdHJpbmcgdF9zdF9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgcmV0dXJuIGNhbWVsY2FzZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpICsgY2FwaXRhbGl6ZShhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSkpOworfQorCisvKioKKyAqIFJlbmRlcnMgYSBmaWVsZCBsaXN0CisgKi8KK3N0cmluZyB0X3N0X2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBzdHJpbmcgcmVzdWx0ID0gIiI7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdCArPSAiICI7CisgICAgfQorICAgIHN0cmluZyBuYW1lID0gY2FtZWxjYXNlKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgcmVzdWx0ICs9IG5hbWUgKyAiOiAiICsgbmFtZTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCitzdHJpbmcgdF9zdF9nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlKSB7CisgIHN0cmluZyBwcmVmaXggPSAiIjsKKyAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHR5cGUtPmdldF9wcm9ncmFtKCk7CisgIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgeworICAgIGlmICghdHR5cGUtPmlzX3NlcnZpY2UoKSkgeworICAgICAgcHJlZml4ID0gcHJvZ3JhbS0+Z2V0X25hbWUoKSArICJfdHlwZXMuIjsKKyAgICB9CisgIH0KKworICBzdHJpbmcgbmFtZSA9IHR0eXBlLT5nZXRfbmFtZSgpOworICBpZiAodHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgbmFtZSA9IGNhcGl0YWxpemUodHR5cGUtPmdldF9uYW1lKCkpOworICB9CisKKyAgcmV0dXJuIHByZWZpeCArIG5hbWU7Cit9CisKKy8qIENvbnZlcnQgdF90eXBlIHRvIFNtYWxsdGFsayB0eXBlIGNvZGUgKi8KK3N0cmluZyB0X3N0X2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAiVFR5cGUgc3RyaW5nIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gIlRUeXBlIGJvb2wiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZXR1cm4gIlRUeXBlIGJ5dGUiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmV0dXJuICJUVHlwZSBpMTYiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmV0dXJuICJUVHlwZSBpMzIiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICJUVHlwZSBpNjQiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICJUVHlwZSBkb3VibGUiOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlIGkzMiI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiAiVFR5cGUgc3RydWN0IjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAiVFR5cGUgbWFwIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAiVFR5cGUgc2V0IjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gIlRUeXBlIGxpc3QiOworICB9CisKKyAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworfQorCitUSFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKHN0LCAiU21hbGx0YWxrIiwgIiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X3N3aWZ0X2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3Rfc3dpZnRfZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxZGIwNGQKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X3N3aWZ0X2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDMxOTkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxzZXQ+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSAidGhyaWZ0L3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oIgorCit1c2luZyBzdGQ6Om1hcDsKK3VzaW5nIHN0ZDo6b3N0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6c2V0OwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6dmVjdG9yOworCitzdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCisKKy8qKgorICogU3dpZnQgMyBjb2RlIGdlbmVyYXRvci4KKyAqCisgKiBEZXNpZ25lZCBmcm9tIHRoZSBTd2lmdC9Db2NvYSBjb2RlIGdlbmVyYXRvcihzKQorICovCitjbGFzcyB0X3N3aWZ0X2dlbmVyYXRvciA6IHB1YmxpYyB0X29vcF9nZW5lcmF0b3IgeworcHVibGljOgorICB0X3N3aWZ0X2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hcDxzdHJpbmcsIHN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCisgICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkgeworICAgICh2b2lkKW9wdGlvbl9zdHJpbmc7CisgICAgbWFwPHN0cmluZywgc3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKworICAgIGxvZ191bmV4cGVjdGVkXyA9IGZhbHNlOworICAgIGFzeW5jX2NsaWVudHNfID0gZmFsc2U7CisgICAgZGVidWdfZGVzY3JpcHRpb25zXyA9IGZhbHNlOworICAgIG5vX3N0cmljdF8gPSBmYWxzZTsKKyAgICBuYW1lc3BhY2VkXyA9IGZhbHNlOworICAgIGdlbl9jb2NvYV8gPSBmYWxzZTsKKyAgICBwcm9taXNlX2tpdF8gPSBmYWxzZTsKKyAgICBzYWZlX2VudW1zXyA9IGZhbHNlOworCisgICAgZm9yKCBpdGVyID0gcGFyc2VkX29wdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKTsgKytpdGVyKSB7CisgICAgICBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgibG9nX3VuZXhwZWN0ZWQiKSA9PSAwKSB7CisgICAgICAgIGxvZ191bmV4cGVjdGVkXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImFzeW5jX2NsaWVudHMiKSA9PSAwKSB7CisgICAgICAgIGFzeW5jX2NsaWVudHNfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgibm9fc3RyaWN0IikgPT0gMCkgeworICAgICAgICBub19zdHJpY3RfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgiZGVidWdfZGVzY3JpcHRpb25zIikgPT0gMCkgeworICAgICAgICBkZWJ1Z19kZXNjcmlwdGlvbnNfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgibmFtZXNwYWNlZCIpID09IDApIHsKKyAgICAgICAgbmFtZXNwYWNlZF8gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJjb2NvYSIpID09IDApIHsKKyAgICAgICAgZ2VuX2NvY29hXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoInNhZmVfZW51bXMiKSA9PSAwKSB7CisgICAgICAgIHNhZmVfZW51bXNfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgicHJvbWlzZV9raXQiKSA9PSAwKSB7CisgICAgICAgIGlmIChnZW5fY29jb2FfID09IGZhbHNlKSB7CisgICAgICAgICAgdGhyb3cgIlByb21pc2VLaXQgb25seSBhdmFpbGFibGUgd2l0aCBTd2lmdCAyLngsIHVzZSBgY29jb2FgIG9wdGlvbiIgKyBpdGVyLT5maXJzdDsKKyAgICAgICAgfQorICAgICAgICBwcm9taXNlX2tpdF8gPSB0cnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgInVua25vd24gb3B0aW9uIHN3aWZ0OiIgKyBpdGVyLT5maXJzdDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1zd2lmdCI7CisgIH0KKworICAvKioKKyAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcworICAgKi8KKworICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7CisgIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9jb25zdHModmVjdG9yPHRfY29uc3QqPiBjb25zdHMpOworCisgIC8qKgorICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworCisgIHZvaWQgcmVuZGVyX2NvbnN0X3ZhbHVlKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9zd2lmdF9zdHJ1Y3Qob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19wcml2YXRlKTsKKworICB2b2lkIGdlbmVyYXRlX3N3aWZ0X3N0cnVjdF9pbml0KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGFsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3ByaXZhdGUpOworCisgIHZvaWQgZ2VuZXJhdGVfc3dpZnRfc3RydWN0X2ltcGxlbWVudGF0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3ByaXZhdGUpOworICB2b2lkIGdlbmVyYXRlX3N3aWZ0X3N0cnVjdF9oYXNoYWJsZV9leHRlbnNpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3ByaXZhdGUpOworICB2b2lkIGdlbmVyYXRlX3N3aWZ0X3N0cnVjdF9lcXVhdGFibGVfZXh0ZW5zaW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3ByaXZhdGUpOworICB2b2lkIGdlbmVyYXRlX3N3aWZ0X3N0cnVjdF90aHJpZnRfZXh0ZW5zaW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3ByaXZhdGUpOworICB2b2lkIGdlbmVyYXRlX3N3aWZ0X3N0cnVjdF9yZWFkZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19wcml2YXRlKTsKKworCisgIHZvaWQgZ2VuZXJhdGVfc3dpZnRfc3RydWN0X3ByaW50YWJsZV9leHRlbnNpb24ob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfc3dpZnRfdW5pb25fcmVhZGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIHN0cmluZyBmdW5jdGlvbl9yZXN1bHRfaGVscGVyX3N0cnVjdF90eXBlKHRfc2VydmljZSAqdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHN0cmluZyBmdW5jdGlvbl9hcmdzX2hlbHBlcl9zdHJ1Y3RfdHlwZSh0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICB2b2lkIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModF9zZXJ2aWNlICp0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKworICAvKioKKyAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfcHJvdG9jb2wob3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX3Byb3RvY29sX2FzeW5jKG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2NsaWVudChvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfY2xpZW50X2FzeW5jKG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2NsaWVudF9zZW5kX2Z1bmN0aW9uX2ltcGxlbWVudGF0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2VydmljZSogdHNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG5lZWRzX3Byb3RvY29sKTsKKyAgdm9pZCBnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2NsaWVudF9zZW5kX2Z1bmN0aW9uX2ludm9jYXRpb24ob3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICB2b2lkIGdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfY2xpZW50X3NlbmRfYXN5bmNfZnVuY3Rpb25faW52b2NhdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfc3dpZnRfc2VydmljZV9jbGllbnRfcmVjdl9mdW5jdGlvbl9pbXBsZW1lbnRhdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NlcnZpY2UqIHRzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBuZWVkc19wcm90b2NvbCk7CisgIHZvaWQgZ2VuZXJhdGVfc3dpZnRfc2VydmljZV9jbGllbnRfaW1wbGVtZW50YXRpb24ob3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2NsaWVudF9hc3luY19pbXBsZW1lbnRhdGlvbihvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOworCisgIHZvaWQgZ2VuZXJhdGVfc3dpZnRfc2VydmljZV9zZXJ2ZXIob3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX3NlcnZlcl9pbXBsZW1lbnRhdGlvbihvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworICAvKioKKyAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKKyAgICovCisKKyAgc3RyaW5nIHN3aWZ0X2ltcG9ydHMoKTsKKyAgc3RyaW5nIHN3aWZ0X3RocmlmdF9pbXBvcnRzKCk7CisgIHN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBpc19vcHRpb25hbD1mYWxzZSwgYm9vbCBpc19mb3JjZWQ9ZmFsc2UpOworICBzdHJpbmcgYmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGUqIHRiYXNlKTsKKyAgc3RyaW5nIGRlY2xhcmVfcHJvcGVydHkodF9maWVsZCogdGZpZWxkLCBib29sIGlzX3ByaXZhdGUpOworICBzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHN0cmluZyBhc3luY19mdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKworCisgIHN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJvdG9jb2xfbmFtZSwgYm9vbCBpc19pbnRlcm5hbCk7CisgIHN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSwgYm9vbCBxdWFsaWZpZWQ9ZmFsc2UpOworICBzdHJpbmcgbWF5YmVfZXNjYXBlX2lkZW50aWZpZXIoY29uc3Qgc3RyaW5nJiBpZGVudGlmaWVyKTsKKyAgdm9pZCBwb3B1bGF0ZV9yZXNlcnZlZF93b3JkcygpOworICAvKiogU3dpZnQgMyBzcGVjaWZpYyAqLworICBzdHJpbmcgZW51bV9jYXNlX25hbWUodF9lbnVtX3ZhbHVlKiB0ZW51bV9jYXNlLCBib29sIGRlY2xhcmF0aW9uKTsKKyAgc3RyaW5nIGVudW1fY29uc3RfbmFtZShzdHJpbmcgZW51bV9pZGVudGlmaWVyKTsKKyAgdm9pZCBmdW5jdGlvbl9kb2NzdHJpbmcob3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICB2b2lkIGFzeW5jX2Z1bmN0aW9uX2RvY3N0cmluZyhvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfZG9jc3RyaW5nKG9zdHJlYW0mIG91dCwgc3RyaW5nJiBkb2MpOworCisgIC8qKiBTd2lmdCAyL0NvY29hIGNhcnJ5b3ZlciAqLworICBzdHJpbmcgcHJvbWlzZV9mdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgc3RyaW5nIGZ1bmN0aW9uX25hbWUodF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9vbGRfc3dpZnRfc3RydWN0X3dyaXRlcihvc3RyZWFtJiBvdXQsdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfcHJpdmF0ZSk7CisgIHZvaWQgZ2VuZXJhdGVfb2xkX3N3aWZ0X3N0cnVjdF9yZXN1bHRfd3JpdGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIC8qKiBTd2lmdCAyL0NvY29hIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5Ki8KKyAgdm9pZCBnZW5lcmF0ZV9vbGRfZW51bSh0X2VudW0qIHRlbnVtKTsKKyAgdm9pZCBnZW5lcmF0ZV9vbGRfc3dpZnRfc3RydWN0KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19wcml2YXRlKTsKKyAgdm9pZCBnZW5lcmF0ZV9vbGRfc3dpZnRfc2VydmljZV9jbGllbnRfYXN5bmNfaW1wbGVtZW50YXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworICBzdGF0aWMgc3RkOjpzdHJpbmcgZ2V0X3JlYWxfc3dpZnRfbW9kdWxlKGNvbnN0IHRfcHJvZ3JhbSogcHJvZ3JhbSkgeworICAgIHN0ZDo6c3RyaW5nIHJlYWxfbW9kdWxlID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgic3dpZnQiKTsKKyAgICBpZiAocmVhbF9tb2R1bGUuZW1wdHkoKSkgeworICAgICAgcmV0dXJuIHByb2dyYW0tPmdldF9uYW1lKCk7CisgICAgfQorICAgIHJldHVybiByZWFsX21vZHVsZTsKKyAgfQorcHJpdmF0ZToKKworICB2b2lkIGJsb2NrX29wZW4ob3N0cmVhbSYgb3V0KSB7CisgICAgb3V0IDw8ICIgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgfQorCisgIHZvaWQgYmxvY2tfY2xvc2Uob3N0cmVhbSYgb3V0LCBib29sIGVuZF9saW5lPXRydWUpIHsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IjsKKyAgICBpZiAoZW5kX2xpbmUpIG91dCA8PCBlbmRsOworICB9CisKKyAgYm9vbCBmaWVsZF9pc19vcHRpb25hbCh0X2ZpZWxkKiB0ZmllbGQpIHsKKyAgICBib29sIG9wdCA9IHRmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUw7CisgICAgaWYgKHRmaWVsZC0+YW5ub3RhdGlvbnNfLmZpbmQoInN3aWZ0Lm51bGxhYmxlIikgIT0gdGZpZWxkLT5hbm5vdGF0aW9uc18uZW5kKCkgJiYgdGZpZWxkLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgb3B0ID0gdHJ1ZTsKKyAgICB9CisgICAgaWYgKGdlbl9jb2NvYV8pIHsgLy8gQmFja3dhcmRzIGNvbXBhdGliaWxpdHksIG9ubHkgaWYgaXRzIGFjdHVhbGx5ICJvcHRpb25hbCIKKyAgICAgIG9wdCA9IHRmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUw7CisgICAgfQorICAgIHJldHVybiBvcHQ7CisgIH0KKworICBib29sIHN0cnVjdF9oYXNfcmVxdWlyZWRfZmllbGRzKHRfc3RydWN0KiB0c3RydWN0KSB7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIGlmICghZmllbGRfaXNfb3B0aW9uYWwoKm1faXRlcikpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGJvb2wgc3RydWN0X2hhc19vcHRpb25hbF9maWVsZHModF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgaWYgKGZpZWxkX2lzX29wdGlvbmFsKCptX2l0ZXIpKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBzdHJpbmcgY29uc3RhbnRzX2RlY2xhcmF0aW9uc187CisKKyAgLyoqCisgICAqIEZpbGUgc3RyZWFtcworICAgKi8KKworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfZGVjbF87CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9pbXBsXzsKKworICBib29sIGxvZ191bmV4cGVjdGVkXzsKKyAgYm9vbCBhc3luY19jbGllbnRzXzsKKworICBib29sIGRlYnVnX2Rlc2NyaXB0aW9uc187CisgIGJvb2wgbm9fc3RyaWN0XzsKKyAgYm9vbCBuYW1lc3BhY2VkXzsKKyAgYm9vbCBzYWZlX2VudW1zXzsKKyAgc2V0PHN0cmluZz4gc3dpZnRfcmVzZXJ2ZWRfd29yZHNfOworCisgIC8qKiBTd2lmdCAyL0NvY29hIGNvbXBhdGliaWxpdHkgKi8KKyAgYm9vbCBnZW5fY29jb2FfOworICBib29sIHByb21pc2Vfa2l0XzsKKworfTsKKworLyoqCisgKiBQcmVwYXJlcyBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAorICogc3RyZWFtcy4KKyAqLwordm9pZCB0X3N3aWZ0X2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7CisgIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQorICBzdHJpbmcgbW9kdWxlID0gZ2V0X3JlYWxfc3dpZnRfbW9kdWxlKHByb2dyYW1fKTsKKyAgc3RyaW5nIG91dF9kaXIgPSBnZXRfb3V0X2RpcigpOworICBzdHJpbmcgbW9kdWxlX3BhdGggPSBvdXRfZGlyOworICBzdHJpbmcgbmFtZSA9IHByb2dyYW1fbmFtZV87CisgIGlmIChuYW1lc3BhY2VkXyAmJiAhbW9kdWxlLmVtcHR5KCkpIHsKKyAgICBtb2R1bGVfcGF0aCA9IG1vZHVsZV9wYXRoICsgIi8iICsgbW9kdWxlOworICAgIG5hbWUgPSBtb2R1bGU7CisgIH0KKyAgTUtESVIobW9kdWxlX3BhdGguY19zdHIoKSk7CisKKyAgcG9wdWxhdGVfcmVzZXJ2ZWRfd29yZHMoKTsKKworICAvLyB3ZSBoYXZlIGEgLnN3aWZ0IGRlY2xhcmF0aW9ucyBmaWxlLi4uCisgIHN0cmluZyBmX2RlY2xfbmFtZSA9IG5hbWUgKyAiLnN3aWZ0IjsKKyAgc3RyaW5nIGZfZGVjbF9mdWxsbmFtZSA9IG1vZHVsZV9wYXRoICsgIi8iICsgZl9kZWNsX25hbWU7CisgIGZfZGVjbF8ub3BlbihmX2RlY2xfZnVsbG5hbWUuY19zdHIoKSk7CisKKyAgZl9kZWNsXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsOworCisgIGZfZGVjbF8gPDwgc3dpZnRfaW1wb3J0cygpIDw8IHN3aWZ0X3RocmlmdF9pbXBvcnRzKCkgPDwgZW5kbDsKKworICAvLyAuLi5hbmQgYSAuc3dpZnQgaW1wbGVtZW50YXRpb24gZXh0ZW5zaW9ucyBmaWxlCisgIHN0cmluZyBmX2ltcGxfbmFtZSA9IG5hbWUgKyAiK0V4dHMuc3dpZnQiOworICBzdHJpbmcgZl9pbXBsX2Z1bGxuYW1lID0gbW9kdWxlX3BhdGggKyAiLyIgKyBmX2ltcGxfbmFtZTsKKyAgZl9pbXBsXy5vcGVuKGZfaW1wbF9mdWxsbmFtZS5jX3N0cigpKTsKKworICBmX2ltcGxfIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGVuZGw7CisKKyAgZl9pbXBsXyA8PCBzd2lmdF9pbXBvcnRzKCkgPDwgc3dpZnRfdGhyaWZ0X2ltcG9ydHMoKSA8PCBlbmRsOworCit9CisKKy8qKgorICogUHJpbnRzIHN0YW5kYXJkIENvY29hIGltcG9ydHMKKyAqCisgKiBAcmV0dXJuIExpc3Qgb2YgaW1wb3J0cyBmb3IgQ29jb2EgbGlicmFyaWVzCisgKi8KK3N0cmluZyB0X3N3aWZ0X2dlbmVyYXRvcjo6c3dpZnRfaW1wb3J0cygpIHsKKworICB2ZWN0b3I8c3RyaW5nPiBpbmNsdWRlc19saXN0OworICBpbmNsdWRlc19saXN0LnB1c2hfYmFjaygiRm91bmRhdGlvbiIpOworCisgIG9zdHJpbmdzdHJlYW0gaW5jbHVkZXM7CisKKyAgdmVjdG9yPHN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGlfaXRlcjsKKyAgZm9yIChpX2l0ZXI9aW5jbHVkZXNfbGlzdC5iZWdpbigpOyBpX2l0ZXIhPWluY2x1ZGVzX2xpc3QuZW5kKCk7ICsraV9pdGVyKSB7CisgICAgaW5jbHVkZXMgPDwgImltcG9ydCAiIDw8ICppX2l0ZXIgPDwgZW5kbDsKKyAgfQorCisgIGlmIChuYW1lc3BhY2VkXykgeworICAgIGNvbnN0IHZlY3Rvcjx0X3Byb2dyYW0qPiYgcHJvZ3JhbV9pbmNsdWRlcyA9IHByb2dyYW1fLT5nZXRfaW5jbHVkZXMoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHByb2dyYW1faW5jbHVkZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgIGluY2x1ZGVzIDw8ICgiaW1wb3J0ICIgKyBnZXRfcmVhbF9zd2lmdF9tb2R1bGUocHJvZ3JhbV9pbmNsdWRlc1tpXSkpIDw8IGVuZGw7CisgICAgfQorICB9CisgIGluY2x1ZGVzIDw8IGVuZGw7CisKKyAgcmV0dXJuIGluY2x1ZGVzLnN0cigpOworfQorCisvKioKKyAqIFByaW50cyBUaHJpZnQgcnVudGltZSBpbXBvcnRzCisgKgorICogQHJldHVybiBMaXN0IG9mIGltcG9ydHMgbmVjZXNzYXJ5IGZvciBUaHJpZnQgcnVudGltZQorICovCitzdHJpbmcgdF9zd2lmdF9nZW5lcmF0b3I6OnN3aWZ0X3RocmlmdF9pbXBvcnRzKCkgeworCisgIHZlY3RvcjxzdHJpbmc+IGluY2x1ZGVzX2xpc3Q7CisgIGluY2x1ZGVzX2xpc3QucHVzaF9iYWNrKCJUaHJpZnQiKTsKKworICBpZiAoZ2VuX2NvY29hXyAmJiBwcm9taXNlX2tpdF8pIHsKKyAgICBpbmNsdWRlc19saXN0LnB1c2hfYmFjaygiUHJvbWlzZUtpdCIpOworICB9CisKKyAgb3N0cmluZ3N0cmVhbSBpbmNsdWRlczsKKworICB2ZWN0b3I8c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaV9pdGVyOworICBmb3IgKGlfaXRlcj1pbmNsdWRlc19saXN0LmJlZ2luKCk7IGlfaXRlciE9aW5jbHVkZXNfbGlzdC5lbmQoKTsgKytpX2l0ZXIpIHsKKyAgICBpbmNsdWRlcyA8PCAiaW1wb3J0ICIgPDwgKmlfaXRlciA8PCBlbmRsOworICB9CisKKyAgaW5jbHVkZXMgPDwgZW5kbDsKKworICByZXR1cm4gaW5jbHVkZXMuc3RyKCk7Cit9CisKKy8qKgorICogRmluaXNoIHVwIGdlbmVyYXRpb24uCisgKi8KK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKKyAgLy8gc3RpY2sgb3VyIGNvbnN0YW50cyBkZWNsYXJhdGlvbnMgYXQgdGhlIGVuZCBvZiB0aGUgaGVhZGVyIGZpbGUKKyAgLy8gc2luY2UgdGhleSByZWZlciB0byB0aGluZ3Mgd2UgYXJlIGRlZmluaW5nLgorICBmX2RlY2xfIDw8IGNvbnN0YW50c19kZWNsYXJhdGlvbnNfIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdHlwZWRlZi4gVGhpcyBpcyBqdXN0IGEgc2ltcGxlIDEtbGluZXIgaW4gU3dpZnQKKyAqCisgKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKKyAgZl9kZWNsXyA8PCBpbmRlbnQoKSA8PCAicHVibGljIHR5cGVhbGlhcyAiIDw8IHR0eXBlZGVmLT5nZXRfc3ltYm9saWMoKQorICAgICAgICAgIDw8ICIgPSAiIDw8IHR5cGVfbmFtZSh0dHlwZWRlZi0+Z2V0X3R5cGUoKSkgPDwgZW5kbDsKKyAgZl9kZWNsXyA8PCBlbmRsOworfQorCisKKy8qKgorICogR2VuZXJhdGVzIGNvZGUgZm9yIGFuIGVudW1lcmF0ZWQgdHlwZS4gSW4gU3dpZnQsIHRoaXMgaXMKKyAqIGVzc2VudGlhbGx5IHRoZSBzYW1lIGFzIHRoZSB0aHJpZnQgZGVmaW5pdGlvbiBpdHNlbGYsIHVzaW5nCisgKiBTd2lmdCBzeW50YXguICBDb25mb3JtcyB0byBURW51bSB3aGljaAorICogaW1wbGVtZW50ZXMgcmVhZC93cml0ZS4KKyAqCisgKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCisgKi8KK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgeworICBpZiAoZ2VuX2NvY29hXykgeworICAgIGdlbmVyYXRlX29sZF9lbnVtKHRlbnVtKTsKKyAgICByZXR1cm47CisgIH0KKyAgZl9kZWNsXyA8PCBpbmRlbnQoKSA8PCAicHVibGljIGVudW0gIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiIDogVEVudW0iOworICBibG9ja19vcGVuKGZfZGVjbF8pOworCisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKKworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGZfZGVjbF8gPDwgaW5kZW50KCkgPDwgImNhc2UgIiA8PCBlbnVtX2Nhc2VfbmFtZSgoKmNfaXRlciksIHRydWUpIDw8IGVuZGw7CisgIH0KKworICAvLyB1bmtub3duIGFzc29jaWF0ZWQgdmFsdWUgY2FzZSBmb3Igc2FmZXR5IGFuZCBzaW1pbGFyIGJlaGF2aW9yIHRvIG90aGVyIGxhbmd1YWdlcworICBpZiAoc2FmZV9lbnVtc18pIHsKKyAgICBmX2RlY2xfIDw8IGluZGVudCgpIDw8ICJjYXNlIHVua25vd24oSW50MzIpIiA8PCBlbmRsOworICB9CisgIGZfZGVjbF8gPDwgZW5kbDsKKworICAvLyBUU2VyaWFsaXphYmxlIHJlYWQoZnJvbTopCisgIGZfZGVjbF8gPDwgaW5kZW50KCkgPDwgInB1YmxpYyBzdGF0aWMgZnVuYyByZWFkKGZyb20gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIC0+ICIKKyAgICAgICAgICA8PCB0ZW51bS0+Z2V0X25hbWUoKTsKKyAgYmxvY2tfb3BlbihmX2RlY2xfKTsKKyAgZl9kZWNsXyA8PCBpbmRlbnQoKSA8PCAibGV0IHJhdzogSW50MzIgPSB0cnkgcHJvdG8ucmVhZCgpIiA8PCBlbmRsOworICBmX2RlY2xfIDw8IGluZGVudCgpIDw8ICJsZXQgbmV3ID0gIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiKHJhd1ZhbHVlOiByYXcpIiA8PCBlbmRsOworCisgIGZfZGVjbF8gPDwgaW5kZW50KCkgPDwgImlmIGxldCB1bndyYXBwZWQgPSBuZXcgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfZGVjbF8gPDwgaW5kZW50KCkgPDwgInJldHVybiB1bndyYXBwZWQiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfZGVjbF8gPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9kZWNsXyA8PCBpbmRlbnQoKSA8PCAidGhyb3cgVFByb3RvY29sRXJyb3IoZXJyb3I6IC5pbnZhbGlkRGF0YSwiIDw8IGVuZGw7CisgIGZfZGVjbF8gPDwgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IFwiSW52YWxpZCBlbnVtIHZhbHVlIChcXChyYXcpKSBmb3IgXFwoIgorICAgICAgICAgIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICIuc2VsZilcIikiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfZGVjbF8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIGJsb2NrX2Nsb3NlKGZfZGVjbF8pOworCisgIC8vIGVtcHR5IGluaXQgZm9yIFRTZXJpYWxpemFibGUKKyAgZl9kZWNsXyA8PCBlbmRsOworICBmX2RlY2xfIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgaW5pdCgpIjsKKyAgYmxvY2tfb3BlbihmX2RlY2xfKTsKKworICBmX2RlY2xfIDw8IGluZGVudCgpIDw8ICJzZWxmID0gLiIgPDwgZW51bV9jYXNlX25hbWUoY29uc3RhbnRzLmZyb250KCksIGZhbHNlKSA8PCBlbmRsOworICBibG9ja19jbG9zZShmX2RlY2xfKTsKKyAgZl9kZWNsXyA8PCBlbmRsOworCisgIC8vIHJhd1ZhbHVlIGdldHRlcgorICBmX2RlY2xfIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgdmFyIHJhd1ZhbHVlOiBJbnQzMiI7CisgIGJsb2NrX29wZW4oZl9kZWNsXyk7CisgIGZfZGVjbF8gPDwgaW5kZW50KCkgPDwgInN3aXRjaCBzZWxmIHsiIDw8IGVuZGw7CisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgZl9kZWNsXyA8PCBpbmRlbnQoKSA8PCAiY2FzZSAuIiA8PCBlbnVtX2Nhc2VfbmFtZSgoKmNfaXRlciksIHRydWUpCisgICAgICAgICAgICA8PCAiOiByZXR1cm4gIiA8PCAoKmNfaXRlciktPmdldF92YWx1ZSgpIDw8IGVuZGw7CisgIH0KKyAgaWYgKHNhZmVfZW51bXNfKSB7CisgICAgZl9kZWNsXyA8PCBpbmRlbnQoKSA8PCAiY2FzZSAudW5rbm93bihsZXQgdmFsdWUpOiByZXR1cm4gdmFsdWUiIDw8IGVuZGw7CisgIH0KKyAgZl9kZWNsXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgYmxvY2tfY2xvc2UoZl9kZWNsXyk7CisgIGZfZGVjbF8gPDwgZW5kbDsKKworICAvLyBjb252ZW5pZW5jZSByYXdWYWx1ZSBpbml0YWxpemVyCisgIGZfZGVjbF8gPDwgaW5kZW50KCkgPDwgInB1YmxpYyBpbml0PyhyYXdWYWx1ZTogSW50MzIpIjsKKyAgYmxvY2tfb3BlbihmX2RlY2xfKTsKKyAgZl9kZWNsXyA8PCBpbmRlbnQoKSA8PCAic3dpdGNoIHJhd1ZhbHVlIHsiIDw8IGVuZGw7OworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGZfZGVjbF8gPDwgaW5kZW50KCkgPDwgImNhc2UgIiA8PCAoKmNfaXRlciktPmdldF92YWx1ZSgpCisgICAgICAgICAgICA8PCAiOiBzZWxmID0gLiIgPDwgZW51bV9jYXNlX25hbWUoKCpjX2l0ZXIpLCB0cnVlKSA8PCBlbmRsOworICB9CisgIGlmICghc2FmZV9lbnVtc18pIHsKKyAgICBmX2RlY2xfIDw8IGluZGVudCgpIDw8ICJkZWZhdWx0OiByZXR1cm4gbmlsIiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGZfZGVjbF8gPDwgaW5kZW50KCkgPDwgImRlZmF1bHQ6IHNlbGYgPSAudW5rbm93bihyYXdWYWx1ZSkiIDw8IGVuZGw7CisgIH0KKyAgZl9kZWNsXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgYmxvY2tfY2xvc2UoZl9kZWNsXyk7CisKKworCisKKyAgYmxvY2tfY2xvc2UoZl9kZWNsXyk7CisgIGZfZGVjbF8gPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgY29kZSBmb3IgYW4gZW51bWVyYXRlZCB0eXBlLiBUaGlzIGlzIGZvciBTd2lmdCAyLngvQ29jb2EKKyAqIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CisgKgorICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9vbGRfZW51bSh0X2VudW0qIHRlbnVtKSB7CisgIGZfZGVjbF8gPDwgaW5kZW50KCkgPDwgInB1YmxpYyBlbnVtICIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIiA6IEludDMyIjsKKyAgYmxvY2tfb3BlbihmX2RlY2xfKTsKKworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7CisKKyAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBmX2RlY2xfIDw8IGluZGVudCgpIDw8ICJjYXNlICIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICA8PCAiID0gIiA8PCAoKmNfaXRlciktPmdldF92YWx1ZSgpIDw8IGVuZGw7CisgIH0KKworICBmX2RlY2xfIDw8IGVuZGw7CisgIGZfZGVjbF8gPDwgaW5kZW50KCkgPDwgInB1YmxpYyBpbml0KCkgeyBzZWxmLmluaXQocmF3VmFsdWU6ICIgPDwgY29uc3RhbnRzLmZyb250KCktPmdldF92YWx1ZSgpIDw8ICIpISB9IiA8PCBlbmRsOworCisgIGJsb2NrX2Nsb3NlKGZfZGVjbF8pOworICBmX2RlY2xfIDw8IGVuZGw7CisKKyAgZl9pbXBsXyA8PCBpbmRlbnQoKSA8PCAiZXh0ZW5zaW9uICIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIiA6IFRFbnVtIjsKKyAgYmxvY2tfb3BlbihmX2ltcGxfKTsKKworICBmX2ltcGxfIDw8IGVuZGw7CisKKyAgZl9pbXBsXyA8PCBpbmRlbnQoKSA8PCAicHVibGljIHN0YXRpYyBmdW5jIHJlYWRWYWx1ZUZyb21Qcm90b2NvbChwcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gIiA8PCB0ZW51bS0+Z2V0X25hbWUoKTsKKyAgYmxvY2tfb3BlbihmX2ltcGxfKTsKKyAgZl9pbXBsXyA8PCBpbmRlbnQoKSA8PCAidmFyIHJhdyA9IEludDMyKCkiIDw8IGVuZGwKKyAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAidHJ5IHByb3RvLnJlYWRJMzIoJnJhdykiIDw8IGVuZGwKKyAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAicmV0dXJuICIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIihyYXdWYWx1ZTogcmF3KSEiIDw8IGVuZGw7CisgIGJsb2NrX2Nsb3NlKGZfaW1wbF8pOworICBmX2ltcGxfIDw8IGVuZGw7CisKKyAgZl9pbXBsXyA8PCBpbmRlbnQoKSA8PCAicHVibGljIHN0YXRpYyBmdW5jIHdyaXRlVmFsdWUodmFsdWU6ICIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIiwgdG9Qcm90b2NvbCBwcm90bzogVFByb3RvY29sKSB0aHJvd3MiOworICBibG9ja19vcGVuKGZfaW1wbF8pOworICBmX2ltcGxfIDw8IGluZGVudCgpIDw8ICJ0cnkgcHJvdG8ud3JpdGVJMzIodmFsdWUucmF3VmFsdWUpIiA8PCBlbmRsOworICBibG9ja19jbG9zZShmX2ltcGxfKTsKKyAgZl9pbXBsXyA8PCBlbmRsOworCisgIGJsb2NrX2Nsb3NlKGZfaW1wbF8pOworICBmX2ltcGxfIDw8IGVuZGw7Cit9CisKK3N0cmluZyB0X3N3aWZ0X2dlbmVyYXRvcjo6ZW51bV9jYXNlX25hbWUodF9lbnVtX3ZhbHVlKiB0ZW51bV9jYXNlLCBib29sIGRlY2xhcmF0aW9uKSB7CisgIHN0cmluZyBuYW1lID0gdGVudW1fY2FzZS0+Z2V0X25hbWUoKTsKKyAgLy8gZm9yY2UgdG8gbG93ZXJjYXNlIGZvciBTd2lmdCBzdHlsZSwgbWF5YmUgZXNjYXBlIGlmIGl0cyBhIGtleXdvcmQKKyAgc3RkOjp0cmFuc2Zvcm0obmFtZS5iZWdpbigpLCBuYW1lLmVuZCgpLCBuYW1lLmJlZ2luKCksIDo6dG9sb3dlcik7CisgIGlmIChkZWNsYXJhdGlvbikgeworICAgIG5hbWUgPSBtYXliZV9lc2NhcGVfaWRlbnRpZmllcihuYW1lKTsKKyAgfQorICByZXR1cm4gbmFtZTsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgY29uc3RhbnQgZW51bSB2YWx1ZSBieSB0cmFuc2Zvcm1pbmcgdGhlIHZhbHVlIHBvcnRpb24gdG8gbG93ZXJjYXNlCisgKiBmb3IgU3dpZnQgc3R5bGUuCisgKi8KK3N0cmluZyB0X3N3aWZ0X2dlbmVyYXRvcjo6ZW51bV9jb25zdF9uYW1lKHN0cmluZyBlbnVtX2lkZW50aWZpZXIpIHsKKyAgc3RyaW5nOjppdGVyYXRvciBpdDsKKyAgZm9yIChpdCA9IGVudW1faWRlbnRpZmllci5iZWdpbigpOyBpdCA8IGVudW1faWRlbnRpZmllci5lbmQoKTsgKytpdCkgeworICAgIGlmICgoKml0KSA9PSAnLicpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBzdGQ6OnRyYW5zZm9ybShpdCwgZW51bV9pZGVudGlmaWVyLmVuZCgpLCBpdCwgOjp0b2xvd2VyKTsKKyAgcmV0dXJuIGVudW1faWRlbnRpZmllcjsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgcHVibGljIGNvbnN0YW50cyBmb3IgYWxsIFRocmlmdCBjb25zdGFudHMuCisgKgorICogQHBhcmFtIGNvbnN0cyBDb25zdGFudHMgdG8gZ2VuZXJhdGUKKyAqLwordm9pZCB0X3N3aWZ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3RzKHZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKSB7CisKKyAgb3N0cmluZ3N0cmVhbSBjb25zdF9pbnRlcmZhY2U7CisKKyAgLy8gUHVibGljIGNvbnN0YW50cyBmb3IgYmFzZSB0eXBlcyAmIHN0cmluZ3MKKyAgdmVjdG9yPHRfY29uc3QqPjo6aXRlcmF0b3IgY19pdGVyOworICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgeworICAgIHRfdHlwZSogdHlwZSA9ICgqY19pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICBjb25zdF9pbnRlcmZhY2UgPDwgInB1YmxpYyBsZXQgIiA8PCBjYXBpdGFsaXplKCgqY19pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiA6ICIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgPSAiOworICAgIHJlbmRlcl9jb25zdF92YWx1ZShjb25zdF9pbnRlcmZhY2UsIHR5cGUsICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCkpOworICAgIGNvbnN0X2ludGVyZmFjZSA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKworICAvLyB0aGlzIGdldHMgc3BpdCBpbnRvIHRoZSBoZWFkZXIgZmlsZSBpbiA6OmNsb3NlX2dlbmVyYXRvcgorICBjb25zdGFudHNfZGVjbGFyYXRpb25zXyA9IGNvbnN0X2ludGVyZmFjZS5zdHIoKTsKKworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuIFRoaXMgaXMgYSBzdHJ1Y3QKKyAqIHdpdGggcHVibGljIG1lbWJlcnMuIE9wdGlvbmFsIHR5cGVzIGFyZSB1c2VkIGZvciBvcHRpb25hbCBwcm9wZXJ0aWVzIHRvCisgKiBhbGxvdyB0aGVtIHRvIGJlIHRlc3RlZCBmb3IgYXZhaWxhYmlsaXR5LiBTZXBhcmF0ZSBpbml0cyBhcmUgaW5jbHVkZWQgZm9yCisgKiByZXF1aXJlZCBwcm9wZXJ0aWVzICYgYWxsIHByb3BlcnRpZXMuCisgKgorICogR2VuZXJhdGVzIGV4dGVuc2lvbnMgdG8gcHJvdmlkZSBjb25mb3JtYW5jZSB0byBUU3RydWN0LCBUU2VyaWFsaXphYmxlLAorICogSGFzaGFibGUgJiBFcXVhdGFibGUKKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X3N3aWZ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGdlbmVyYXRlX3N3aWZ0X3N0cnVjdChmX2RlY2xfLCB0c3RydWN0LCBmYWxzZSk7CisgIGdlbmVyYXRlX3N3aWZ0X3N0cnVjdF9pbXBsZW1lbnRhdGlvbihmX2ltcGxfLCB0c3RydWN0LCBmYWxzZSwgZmFsc2UpOworfQorCisvKioKKyAqIEV4Y2VwdGlvbnMgYXJlIHN0cnVjdHMsIGJ1dCB0aGV5IGNvbmZvcm0gdG8gRXJyb3IKKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X3N3aWZ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgeworICBnZW5lcmF0ZV9zd2lmdF9zdHJ1Y3QoZl9kZWNsXywgdHhjZXB0aW9uLCBmYWxzZSk7CisgIGdlbmVyYXRlX3N3aWZ0X3N0cnVjdF9pbXBsZW1lbnRhdGlvbihmX2ltcGxfLCB0eGNlcHRpb24sIGZhbHNlLCBmYWxzZSk7Cit9CisKK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX2RvY3N0cmluZyhvc3RyZWFtJiBvdXQsIHN0cmluZyYgZG9jKSB7CisgIGlmIChkb2MgIT0gIiIpIHsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gc3RyaW5nczsKKworICAgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgcG9zID0gMDsKKyAgICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIHByZXYgPSAwOworICAgIHdoaWxlICgoKHBvcyA9IGRvYy5maW5kKCJcbiIsIHByZXYpKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykKKyAgICAgICAgfHwgKChwb3MgPSBkb2MuZmluZCgiXHIiLCBwcmV2KSkgIT0gc3RkOjpzdHJpbmc6Om5wb3MpCisgICAgICAgIHx8ICgocG9zID0gZG9jLmZpbmQoIlxyXG4iLCBwcmV2KSkgIT0gc3RkOjpzdHJpbmc6Om5wb3MpKQorICAgIHsKKyAgICAgICAgc3RyaW5ncy5wdXNoX2JhY2soZG9jLnN1YnN0cihwcmV2LCBwb3MgLSBwcmV2KSk7CisgICAgICAgIHByZXYgPSBwb3MgKyAxOworICAgIH0KKworICAgIC8vIFRvIGdldCB0aGUgbGFzdCBzdWJzdHJpbmcgKG9yIG9ubHksIGlmIGRlbGltaXRlciBpcyBub3QgZm91bmQpCisgICAgc3RyaW5ncy5wdXNoX2JhY2soZG9jLnN1YnN0cihwcmV2KSk7CisKKyAgICB2ZWN0b3I8c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgZF9pdGVyOworICAgIGZvciAoZF9pdGVyID0gc3RyaW5ncy5iZWdpbigpOyBkX2l0ZXIgIT0gc3RyaW5ncy5lbmQoKTsgKytkX2l0ZXIpIHsKKyAgICAgIGlmICgoKmRfaXRlcikgIT0gIiIpIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIvLy8gIiA8PCAoKmRfaXRlcikgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworCisKKy8qKgorICogR2VuZXJhdGUgdGhlIGludGVyZmFjZSBmb3IgYSBzdHJ1Y3QuIE9ubHkgcHJvcGVydGllcyBhbmQKKyAqIGluaXQgbWV0aG9kcyBhcmUgaW5jbHVkZWQuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKiBAcGFyYW0gaXNfcHJpdmF0ZQorICogICAgICAgICAgICAgICAgSXMgdGhlIHN0cnVjdCBwdWJsaWMgb3IgcHJpdmF0ZQorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zd2lmdF9zdHJ1Y3Qob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcHJpdmF0ZSkgeworCisgIGlmIChnZW5fY29jb2FfKSB7CisgICAgZ2VuZXJhdGVfb2xkX3N3aWZ0X3N0cnVjdChvdXQsIHRzdHJ1Y3QsIGlzX3ByaXZhdGUpOworICAgIHJldHVybjsKKyAgfQorICBzdHJpbmcgZG9jID0gdHN0cnVjdC0+Z2V0X2RvYygpOworICBnZW5lcmF0ZV9kb2NzdHJpbmcob3V0LCBkb2MpOworCisKKyAgLy8gcHJvcGVydGllcworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisKKyAgaWYgKHRzdHJ1Y3QtPmlzX3VuaW9uKCkpIHsKKyAgICAvLyBzcGVjaWFsLCB1bmlvbnMKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBlbnVtICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKTsKKyAgICBibG9ja19vcGVuKG91dCk7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgb3V0IDw8IGVuZGw7CisgICAgICBzdHJpbmcgZG9jID0gKCptX2l0ZXIpLT5nZXRfZG9jKCk7CisgICAgICBnZW5lcmF0ZV9kb2NzdHJpbmcob3V0LCBkb2MpOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJjYXNlICIKKyAgICAgICAgICA8PCBtYXliZV9lc2NhcGVfaWRlbnRpZmllcigoKm1faXRlciktPmdldF9uYW1lKCkpIDw8ICIodmFsOiAiCisgICAgICAgICAgPDwgdHlwZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UpIDw8ICIpIiA8PCBlbmRsOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvLyBOb3JtYWwgc3RydWN0cworCisgICAgc3RyaW5nIHZpc2liaWxpdHkgPSBpc19wcml2YXRlID8gKGdlbl9jb2NvYV8gPyAicHJpdmF0ZSIgOiAiZmlsZXByaXZhdGUiKSA6ICJwdWJsaWMiOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8IHZpc2liaWxpdHkgPDwgIiBmaW5hbCBjbGFzcyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisKKyAgICBpZiAodHN0cnVjdC0+aXNfeGNlcHRpb24oKSkgeworICAgICAgb3V0IDw8ICIgOiBTd2lmdC5FcnJvciI7IC8vIEVycm9yIHNlZW1zIHRvIGJlIGEgY29tbW9uIGV4Y2VwdGlvbiBuYW1lIGluIHRocmlmdAorICAgIH0KKworICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBvdXQgPDwgZW5kbDsKKyAgICAgIC8vIFRPRE86IERlZmF1bHRzCisKKyAgICAgIHN0cmluZyBkb2MgPSAoKm1faXRlciktPmdldF9kb2MoKTsKKyAgICAgIGdlbmVyYXRlX2RvY3N0cmluZyhvdXQsIGRvYyk7CisKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCBkZWNsYXJlX3Byb3BlcnR5KCptX2l0ZXIsIGlzX3ByaXZhdGUpIDw8IGVuZGw7CisgICAgfQorCisgICAgb3V0IDw8IGVuZGw7CisgICAgb3V0IDw8IGVuZGw7CisKKyAgICBpZiAoIXN0cnVjdF9oYXNfcmVxdWlyZWRfZmllbGRzKHRzdHJ1Y3QpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCB2aXNpYmlsaXR5IDw8ICIgaW5pdCgpIHsgfSIgPDwgZW5kbDsKKyAgICB9CisgICAgaWYgKHN0cnVjdF9oYXNfcmVxdWlyZWRfZmllbGRzKHRzdHJ1Y3QpKSB7CisgICAgICBnZW5lcmF0ZV9zd2lmdF9zdHJ1Y3RfaW5pdChvdXQsIHRzdHJ1Y3QsIGZhbHNlLCBpc19wcml2YXRlKTsKKyAgICB9CisgICAgaWYgKHN0cnVjdF9oYXNfb3B0aW9uYWxfZmllbGRzKHRzdHJ1Y3QpKSB7CisgICAgICBnZW5lcmF0ZV9zd2lmdF9zdHJ1Y3RfaW5pdChvdXQsIHRzdHJ1Y3QsIHRydWUsIGlzX3ByaXZhdGUpOworICAgIH0KKyAgfQorCisgIGJsb2NrX2Nsb3NlKG91dCk7CisKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogTGVnYWN5IFN3aWZ0Mi9Db2NvYSBnZW5lcmF0b3IKKyAqCisgKiBAcGFyYW0gdHN0cnVjdAorICogQHBhcmFtIGlzX3ByaXZhdGUKKyAqLworCisKK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX29sZF9zd2lmdF9zdHJ1Y3Qob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19wcml2YXRlKSB7CisgIHN0cmluZyB2aXNpYmlsaXR5ID0gaXNfcHJpdmF0ZSA/ICJwcml2YXRlIiA6ICJwdWJsaWMiOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCB2aXNpYmlsaXR5IDw8ICIgZmluYWwgY2xhc3MgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpOworCisgIGlmICh0c3RydWN0LT5pc194Y2VwdGlvbigpKSB7CisgICAgb3V0IDw8ICIgOiBFcnJvclR5cGUiOworICB9CisKKyAgYmxvY2tfb3BlbihvdXQpOworCisgIC8vIHByb3BlcnRpZXMKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgb3V0IDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8IGRlY2xhcmVfcHJvcGVydHkoKm1faXRlciwgaXNfcHJpdmF0ZSkgPDwgZW5kbDsKKyAgfQorCisgIG91dCA8PCBlbmRsOworCisgIC8vIGluaXQKKworICBpbmRlbnQob3V0KSA8PCB2aXNpYmlsaXR5IDw8ICIgaW5pdCgpIjsKKyAgYmxvY2tfb3BlbihvdXQpOworICBibG9ja19jbG9zZShvdXQpOworCisgIG91dCA8PCBlbmRsOworCisgIGlmIChzdHJ1Y3RfaGFzX3JlcXVpcmVkX2ZpZWxkcyh0c3RydWN0KSkgeworICAgIGdlbmVyYXRlX3N3aWZ0X3N0cnVjdF9pbml0KG91dCwgdHN0cnVjdCwgZmFsc2UsIGlzX3ByaXZhdGUpOworICB9CisgIGlmIChzdHJ1Y3RfaGFzX29wdGlvbmFsX2ZpZWxkcyh0c3RydWN0KSkgeworICAgIGdlbmVyYXRlX3N3aWZ0X3N0cnVjdF9pbml0KG91dCwgdHN0cnVjdCwgdHJ1ZSwgaXNfcHJpdmF0ZSk7CisgIH0KKworICBibG9ja19jbG9zZShvdXQpOworCisgIG91dCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlIHN0cnVjdCBpbml0IGZvciBwcm9wZXJ0aWVzCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgKiBAcGFyYW0gYWxsICAgICBHZW5lcmF0ZSBpbml0IHdpdGggYWxsIG9yIGp1c3QgcmVxdWlyZWQgcHJvcGVydGllcworICogQHBhcmFtIGlzX3ByaXZhdGUKKyAqICAgICAgICAgICAgICAgIElzIHRoZSBpbml0aWFsaXplciBwdWJsaWMgb3IgcHJpdmF0ZQorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zd2lmdF9zdHJ1Y3RfaW5pdChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19wcml2YXRlKSB7CisKKyAgc3RyaW5nIHZpc2liaWxpdHkgPSBpc19wcml2YXRlID8gKGdlbl9jb2NvYV8gPyAicHJpdmF0ZSIgOiAiZmlsZXByaXZhdGUiKSA6ICJwdWJsaWMiOworCisgIGluZGVudChvdXQpIDw8IHZpc2liaWxpdHkgPDwgIiBpbml0KCI7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBib29sIGZpcnN0PXRydWU7CisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTspIHsKKyAgICBpZiAoYWxsIHx8ICFmaWVsZF9pc19vcHRpb25hbCgqbV9pdGVyKSkgeworICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgb3V0IDw8ICIsICI7CisgICAgICB9CisgICAgICBvdXQgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI6ICIKKyAgICAgICAgICA8PCBtYXliZV9lc2NhcGVfaWRlbnRpZmllcih0eXBlX25hbWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpLCBmaWVsZF9pc19vcHRpb25hbCgqbV9pdGVyKSkpOworICAgIH0KKyAgICArK21faXRlcjsKKyAgfQorICBvdXQgPDwgIikiOworCisgIGJsb2NrX29wZW4ob3V0KTsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgaWYgKCFnZW5fY29jb2FfKSB7CisgICAgICBib29sIHNob3VsZF9zZXQgPSBhbGw7CisgICAgICBzaG91bGRfc2V0ID0gc2hvdWxkX3NldCB8fCAhZmllbGRfaXNfb3B0aW9uYWwoKCptX2l0ZXIpKTsKKyAgICAgIGlmIChzaG91bGRfc2V0KSB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAic2VsZi4iIDw8IG1heWJlX2VzY2FwZV9pZGVudGlmaWVyKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiA9ICIKKyAgICAgICAgICAgIDw8IG1heWJlX2VzY2FwZV9pZGVudGlmaWVyKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgLyoqIGxlZ2FjeSBTd2lmdDIvQ29jb2EgKi8KKyAgICAgIGlmIChhbGwgfHwgKCptX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCB8fCAoKm1faXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVF9JTl9SRVFfT1VUKSB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAic2VsZi4iIDw8IG1heWJlX2VzY2FwZV9pZGVudGlmaWVyKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiA9ICIKKyAgICAgICAgICAgIDw8IG1heWJlX2VzY2FwZV9pZGVudGlmaWVyKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBibG9ja19jbG9zZShvdXQpOworCisgIG91dCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlIHRoZSBoYXNoYWJsZSBwcm90b2NvbCBpbXBsbWVudGF0aW9uCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgKiBAcGFyYW0gaXNfcHJpdmF0ZQorICogICAgICAgICAgICAgICAgSXMgdGhlIHN0cnVjdCBwdWJsaWMgb3IgcHJpdmF0ZQorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zd2lmdF9zdHJ1Y3RfaGFzaGFibGVfZXh0ZW5zaW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcHJpdmF0ZSkgeworCisgIHN0cmluZyB2aXNpYmlsaXR5ID0gaXNfcHJpdmF0ZSA/IChnZW5fY29jb2FfID8gInByaXZhdGUiIDogImZpbGVwcml2YXRlIikgOiAicHVibGljIjsKKyAgaW5kZW50KG91dCkgPDwgImV4dGVuc2lvbiAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiA6IEhhc2hhYmxlIjsKKyAgYmxvY2tfb3BlbihvdXQpOworICBvdXQgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgdmlzaWJpbGl0eSA8PCAiIHZhciBoYXNoVmFsdWUgOiBJbnQiOworICBibG9ja19vcGVuKG91dCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBpZiAoIW1lbWJlcnMuZW1wdHkoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJsZXQgcHJpbWUgPSAzMSIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAidmFyIHJlc3VsdCA9IDEiIDw8IGVuZGw7CisgICAgaWYgKCF0c3RydWN0LT5pc191bmlvbigpKSB7CisgICAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICAgIHRfZmllbGQqIHRmaWVsZCA9ICptX2l0ZXI7CisgICAgICAgIHN0cmluZyBhY2Nlc3NvciA9IGZpZWxkX2lzX29wdGlvbmFsKHRmaWVsZCkgPyAiPy4iIDogIi4iOworICAgICAgICBzdHJpbmcgZGVmYXVsdG9yID0gZmllbGRfaXNfb3B0aW9uYWwodGZpZWxkKSA/ICIgPz8gMCIgOiAiIjsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgInJlc3VsdCA9IHByaW1lICYqIHJlc3VsdCAmKyAoIiA8PCBtYXliZV9lc2NhcGVfaWRlbnRpZmllcih0ZmllbGQtPmdldF9uYW1lKCkpIDw8IGFjY2Vzc29yCisgICAgICAgICAgICAgICAgICAgIDw8ICAiaGFzaFZhbHVlIiA8PCBkZWZhdWx0b3IgPDwgIikiIDw8IGVuZGw7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggc2VsZiB7IiA8PCBlbmRsOworICAgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyBtX2l0ZXIrKykgeworICAgICAgICB0X2ZpZWxkICp0ZmllbGQgPSAqbV9pdGVyOworICAgICAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAuIiA8PCB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIihsZXQgdmFsKTogcmVzdWx0ID0gcHJpbWUgJiogdmFsLmhhc2hWYWx1ZSIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gcmVzdWx0IiA8PCBlbmRsOworICB9CisgIGVsc2UgeworICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gMzEiIDw8IGVuZGw7CisgIH0KKworICBibG9ja19jbG9zZShvdXQpOworICBvdXQgPDwgZW5kbDsKKyAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGUgdGhlIGVxdWF0YWJsZSBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICogQHBhcmFtIGlzX3ByaXZhdGUKKyAqICAgICAgICAgICAgICAgIElzIHRoZSBzdHJ1Y3QgcHVibGljIG9yIHByaXZhdGUKKyAqLwordm9pZCB0X3N3aWZ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3dpZnRfc3RydWN0X2VxdWF0YWJsZV9leHRlbnNpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3ByaXZhdGUpIHsKKworICBzdHJpbmcgdmlzaWJpbGl0eSA9IGlzX3ByaXZhdGUgPyAoZ2VuX2NvY29hXyA/ICJwcml2YXRlIiA6ICJmaWxlcHJpdmF0ZSIpIDogInB1YmxpYyI7CisKKyAgaW5kZW50KG91dCkgPDwgdmlzaWJpbGl0eSA8PCAiIGZ1bmMgPT0obGhzOiAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiLCByaHM6ICIKKyAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIpIC0+IEJvb2wiOworICBibG9ja19vcGVuKG91dCk7CisgIGluZGVudChvdXQpIDw8ICJyZXR1cm4iOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgaWYgKG1lbWJlcnMuc2l6ZSgpKSB7CisgICAgaWYgKCF0c3RydWN0LT5pc191bmlvbigpKSB7CisgICAgICBvdXQgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworCisgICAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7KSB7CisgICAgICAgIHRfZmllbGQqIHRmaWVsZCA9ICptX2l0ZXI7CisgICAgICAgIGluZGVudChvdXQpIDw8ICIobGhzLiIgPDwgbWF5YmVfZXNjYXBlX2lkZW50aWZpZXIodGZpZWxkLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgICAgICA8PCAoZ2VuX2NvY29hXyA/ICIgPyIgOiAiICIpIDw8ICI9PSByaHMuIiA8PCBtYXliZV9lc2NhcGVfaWRlbnRpZmllcih0ZmllbGQtPmdldF9uYW1lKCkpIDw8ICIpIjsgLy8gc3dpZnQgMiA/PT0gb3BlcmF0b3Igbm90IGluIDM/CisgICAgICAgIGlmICgrK21faXRlciAhPSBtZW1iZXJzLmVuZCgpKSB7CisgICAgICAgICAgb3V0IDw8ICIgJiYiOworICAgICAgICB9CisgICAgICAgIG91dCA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICB9IGVsc2UgeworICAgICAgYmxvY2tfb3BlbihvdXQpOworICAgICAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAobGhzLCByaHMpIHsiIDw8IGVuZGw7CisgICAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICAgIHRfZmllbGQqIHRmaWVsZCA9ICptX2l0ZXI7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJjYXNlICguIiA8PCB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIihsZXQgbHZhbCksIC4iCisgICAgICAgICAgICAgICAgICAgIDw8IHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiKGxldCBydmFsKSk6IHJldHVybiBsdmFsID09IHJ2YWwiCisgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICB9CisgICAgICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDogcmV0dXJuIGZhbHNlIiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0oKSIgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgZWxzZSB7CisgICAgb3V0IDw8ICIgdHJ1ZSIgPDwgZW5kbDsKKyAgfQorCisgIGJsb2NrX2Nsb3NlKG91dCk7CisgIG91dCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlIHN0cnVjdCBpbXBsZW1lbnRhdGlvbi4gUHJvZHVjZXMgZXh0ZW5zaW9ucyB0aGF0CisgKiBmdWxmaWxsIHRoZSByZXF1aXNpdGUgcHJvdG9jb2xzIHRvIGNvbXBsZXRlIHRoZSB2YWx1ZS4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqIEBwYXJhbSBpc19yZXN1bHQKKyAqICAgICAgICAgICAgICAgIElmIHRoaXMgaXMgYSByZXN1bHQgaXQgbmVlZHMgYSBkaWZmZXJlbnQgd3JpdGVyCisgKiBAcGFyYW0gaXNfcHJpdmF0ZQorICogICAgICAgICAgICAgICAgSXMgdGhlIHN0cnVjdCBwdWJsaWMgb3IgcHJpdmF0ZQorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zd2lmdF9zdHJ1Y3RfaW1wbGVtZW50YXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcHJpdmF0ZSkgeworCisgIGdlbmVyYXRlX3N3aWZ0X3N0cnVjdF9lcXVhdGFibGVfZXh0ZW5zaW9uKG91dCwgdHN0cnVjdCwgaXNfcHJpdmF0ZSk7CisKKyAgaWYgKCFpc19wcml2YXRlICYmICFpc19yZXN1bHQgJiYgIWdlbl9jb2NvYV8pIHsgIC8vIG9sZCBjb21waWxlciBkaWRuJ3QgdXNlIGRlYnVnX2Rlc2NyaXB0aW9ucywgT1IgaXQgd2l0aCBnZW5fY29jb2FfIHNvIHRoZSBmbGFnIGRvZXNuJ3QgbWF0dGVyIHcvIGNvY29hCisgICAgZ2VuZXJhdGVfc3dpZnRfc3RydWN0X3ByaW50YWJsZV9leHRlbnNpb24ob3V0LCB0c3RydWN0KTsKKyAgfQorCisgIGdlbmVyYXRlX3N3aWZ0X3N0cnVjdF9oYXNoYWJsZV9leHRlbnNpb24ob3V0LCB0c3RydWN0LCBpc19wcml2YXRlKTsKKyAgZ2VuZXJhdGVfc3dpZnRfc3RydWN0X3RocmlmdF9leHRlbnNpb24ob3V0LCB0c3RydWN0LCBpc19yZXN1bHQsIGlzX3ByaXZhdGUpOworCisgIG91dCA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGUgdGhlIFRTdHJ1Y3QgcHJvdG9jb2wgaW1wbGVtZW50YXRpb24uCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgKiBAcGFyYW0gaXNfcmVzdWx0CisgKiAgICAgICAgICAgICAgICBJcyB0aGUgc3RydWN0IGEgcmVzdWx0IHZhbHVlCisgKiBAcGFyYW0gaXNfcHJpdmF0ZQorICogICAgICAgICAgICAgICAgSXMgdGhlIHN0cnVjdCBwdWJsaWMgb3IgcHJpdmF0ZQorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zd2lmdF9zdHJ1Y3RfdGhyaWZ0X2V4dGVuc2lvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19wcml2YXRlKSB7CisKKyAgaW5kZW50KG91dCkgPDwgImV4dGVuc2lvbiAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiA6IFRTdHJ1Y3QiOworCisgIGJsb2NrX29wZW4ob3V0KTsKKworICBvdXQgPDwgZW5kbDsKKyAgaWYgKCFnZW5fY29jb2FfKSB7CisgICAgLyoqIFN3aWZ0IDMsIG5vIHdyaXRlciB3ZSBqdXN0IHdyaXRlIGZpZWxkIElEJ3MgKi8KKyAgICBzdHJpbmcgYWNjZXNzID0gKGlzX3ByaXZhdGUpID8gKGdlbl9jb2NvYV8gPyAicHJpdmF0ZSIgOiAiZmlsZXByaXZhdGUiKSA6ICJwdWJsaWMiOworICAgIC8vIGdlbmVyYXRlIGZpZWxkSUQncyBkaWN0aW9uYXJ5CisgICAgb3V0IDw8IGluZGVudCgpIDw8IGFjY2VzcyA8PCAiIHN0YXRpYyB2YXIgZmllbGRJZHM6IFtTdHJpbmc6IEludDMyXSI7CisgICAgYmxvY2tfb3BlbihvdXQpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIFsiOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICAgIGJvb2wgd3JvdGUgPSBmYWxzZTsKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgd3JvdGUgPSB0cnVlOworICAgICAgb3V0IDw8ICJcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIjogIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiLCAiOworICAgIH0KKyAgICBpZiAoIXdyb3RlKSB7CisgICAgICAvLyBwYWQgYSBjb2xvbgorICAgICAgb3V0IDw8ICI6IjsKKyAgICB9CisgICAgb3V0IDw8ICJdIiA8PCBlbmRsOworICAgIGJsb2NrX2Nsb3NlKG91dCk7CisgICAgb3V0IDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8IGFjY2VzcyA8PCAiIHN0YXRpYyB2YXIgc3RydWN0TmFtZTogU3RyaW5nIHsgcmV0dXJuIFwiIgorICAgICAgICA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICJcIiB9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICBpZiAodHN0cnVjdC0+aXNfdW5pb24oKSkgeworICAgICAgZ2VuZXJhdGVfc3dpZnRfdW5pb25fcmVhZGVyKG91dCwgdHN0cnVjdCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGdlbmVyYXRlX3N3aWZ0X3N0cnVjdF9yZWFkZXIob3V0LCB0c3RydWN0LCBpc19wcml2YXRlKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgLyoqIExlZ2FjeSBTd2lmdDIvQ29jb2EgKi8KKworICAgIGdlbmVyYXRlX3N3aWZ0X3N0cnVjdF9yZWFkZXIob3V0LCB0c3RydWN0LCBpc19wcml2YXRlKTsKKworICAgIGlmIChpc19yZXN1bHQpIHsKKyAgICAgIGdlbmVyYXRlX29sZF9zd2lmdF9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIGdlbmVyYXRlX29sZF9zd2lmdF9zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCwgaXNfcHJpdmF0ZSk7CisgICAgfQorICB9CisKKyAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N3aWZ0X3VuaW9uX3JlYWRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgc3RhdGljIGZ1bmMgcmVhZChmcm9tIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyAtPiAiCisgICAgICAgICAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgIGJsb2NrX29wZW4ob3V0KTsKKyAgaW5kZW50KG91dCkgPDwgIl8gPSB0cnkgcHJvdG8ucmVhZFN0cnVjdEJlZ2luKCkiIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgInZhciByZXQ6ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiPyI7CisgIG91dCA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiZmllbGRzOiB3aGlsZSB0cnVlIjsKKyAgYmxvY2tfb3BlbihvdXQpOworICBvdXQgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgImxldCAoXywgZmllbGRUeXBlLCBmaWVsZElEKSA9IHRyeSBwcm90by5yZWFkRmllbGRCZWdpbigpIiA8PCBlbmRsIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKGZpZWxkSUQsIGZpZWxkVHlwZSkiOworICBibG9ja19vcGVuKG91dCk7CisgIGluZGVudChvdXQpIDw8ICJjYXNlIChfLCAuc3RvcCk6ICAgICAgICAgICAgYnJlYWsgZmllbGRzIiA8PCBlbmRsOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAoIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiLCAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIpOiI7CisgICAgc3RyaW5nIHBhZGRpbmcgPSAiIjsKKworICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICAgIHBhZGRpbmcgPSAiICAgICAgICAgICAiOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgICBwYWRkaW5nID0gIiAgICAgICAgICAgICI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgICAgcGFkZGluZyA9ICIgICAgICAgICAgICAgIjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkgfHwgdHlwZS0+aXNfc2V0KCkgfHwgdHlwZS0+aXNfbWFwKCkpIHsKKyAgICAgIHBhZGRpbmcgPSAiICAgICAgICAgICAgICI7CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgICBwYWRkaW5nID0gIiAgICAgICAgICAgIjsKKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgcGFkZGluZyA9ICIgICAgICAgICAgICAiOworICAgIH0KKworICAgIGluZGVudChvdXQpIDw8IHBhZGRpbmcgPDwgInJldCA9ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiLiIKKyAgICAgICAgICAgICAgICA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIih2YWw6ICIgPDwgInRyeSAiCisgICAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlKQorICAgICAgICAgICAgICAgIDw8ICIucmVhZChmcm9tOiBwcm90bykpIiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgImNhc2UgbGV0IChfLCB1bmtub3duVHlwZSk6ICB0cnkgcHJvdG8uc2tpcCh0eXBlOiB1bmtub3duVHlwZSkiIDw8IGVuZGw7CisKKyAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgaW5kZW50KG91dCkgPDwgInRyeSBwcm90by5yZWFkRmllbGRFbmQoKSIgPDwgZW5kbDsKKworICBibG9ja19jbG9zZShvdXQpOworICBvdXQgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAidHJ5IHByb3RvLnJlYWRTdHJ1Y3RFbmQoKSIgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAiaWYgbGV0IHJldCA9IHJldCI7CisgIGJsb2NrX29wZW4ob3V0KTsKKyAgaW5kZW50KG91dCkgPDwgInJldHVybiByZXQiIDw8IGVuZGw7CisgIGJsb2NrX2Nsb3NlKG91dCk7CisgIG91dCA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAidGhyb3cgVFByb3RvY29sRXJyb3IoZXJyb3I6IC51bmtub3duLCBtZXNzYWdlOiBcIk1pc3NpbmcgcmVxdWlyZWQgdmFsdWUgZm9yIHR5cGU6ICIKKyAgICAgICAgICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiXCIpIjsKKyAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgb3V0IDw8IGVuZGw7CisKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbiB0byByZWFkIGEgc3RydWN0IGZyb20KKyAqIGZyb20gYSBwcm90b2NvbC4gKFRTdHJ1Y3QgY29tcGxpYW5jZSkKKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0dXJlIGRlZmluaXRpb24KKyAqIEBwYXJhbSBpc19wcml2YXRlCisgKiAgICAgICAgICAgICAgICBJcyB0aGUgc3RydWN0IHB1YmxpYyBvciBwcml2YXRlCisgKi8KK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N3aWZ0X3N0cnVjdF9yZWFkZXIob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19wcml2YXRlKSB7CisKKyAgaWYgKCFnZW5fY29jb2FfKSB7CisgICAgLyoqIFN3aWZ0IDMgY2FzZSAqLworICAgIHN0cmluZyB2aXNpYmlsaXR5ID0gaXNfcHJpdmF0ZSA/ICJmaWxlcHJpdmF0ZSIgOiAicHVibGljIjsKKworICAgIGluZGVudChvdXQpIDw8IHZpc2liaWxpdHkgPDwgIiBzdGF0aWMgZnVuYyByZWFkKGZyb20gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIC0+ICIKKyAgICAgICAgICAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisKKyAgICBibG9ja19vcGVuKG91dCk7CisgICAgaW5kZW50KG91dCkgPDwgIl8gPSB0cnkgcHJvdG8ucmVhZFN0cnVjdEJlZ2luKCkiIDw8IGVuZGw7CisKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICBib29sIG9wdGlvbmFsID0gZmllbGRfaXNfb3B0aW9uYWwoKmZfaXRlcik7CisgICAgICBpbmRlbnQob3V0KSA8PCAidmFyICIgPDwgbWF5YmVfZXNjYXBlX2lkZW50aWZpZXIoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiOiAiCisgICAgICAgICAgICAgICAgICA8PCB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpLCBvcHRpb25hbCwgIW9wdGlvbmFsKSA8PCBlbmRsOworICAgIH0KKworICAgIG91dCA8PCBlbmRsOworCisgICAgLy8gTG9vcCBvdmVyIHJlYWRpbmcgaW4gZmllbGRzCisgICAgaW5kZW50KG91dCkgPDwgImZpZWxkczogd2hpbGUgdHJ1ZSI7CisgICAgYmxvY2tfb3BlbihvdXQpOworICAgIG91dCA8PCBlbmRsOworCisgICAgaW5kZW50KG91dCkgPDwgImxldCAoXywgZmllbGRUeXBlLCBmaWVsZElEKSA9IHRyeSBwcm90by5yZWFkRmllbGRCZWdpbigpIiA8PCBlbmRsIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmllbGRJRCwgZmllbGRUeXBlKSI7CisgICAgYmxvY2tfb3BlbihvdXQpOworICAgIGluZGVudChvdXQpIDw8ICJjYXNlIChfLCAuc3RvcCk6ICAgICAgICAgICAgYnJlYWsgZmllbGRzIiA8PCBlbmRsOworCisKKyAgICAvLyBHZW5lcmF0ZSBkZXNlcmlhbGl6YXRpb24gY29kZSBmb3Iga25vd24gY2FzZXMKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgaW5kZW50KG91dCkgPDwgImNhc2UgKCIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIiwgIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiKToiOworICAgICAgc3RyaW5nIHBhZGRpbmcgPSAiIjsKKworICAgICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSgoKmZfaXRlciktPmdldF90eXBlKCkpOworICAgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICAgICAgcGFkZGluZyA9ICIgICAgICAgICAgICI7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgICAgIHBhZGRpbmcgPSAiICAgICAgICAgICAgIjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgICAgIHBhZGRpbmcgPSAiICAgICAgICAgICAgICI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpIHx8IHR5cGUtPmlzX3NldCgpIHx8IHR5cGUtPmlzX21hcCgpKSB7CisgICAgICAgIHBhZGRpbmcgPSAiICAgICAgICAgICAgICI7CisgICAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICAgICAgcGFkZGluZyA9ICIgICAgICAgICAgICI7CisgICAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgICBwYWRkaW5nID0gIiAgICAgICAgICAgICI7CisgICAgICB9CisKKyAgICAgIG91dCA8PCBwYWRkaW5nIDw8IG1heWJlX2VzY2FwZV9pZGVudGlmaWVyKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiA9IHRyeSAiCisgICAgICAgICAgPDwgdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlKSA8PCAiLnJlYWQoZnJvbTogcHJvdG8pIiA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudChvdXQpIDw8ICJjYXNlIGxldCAoXywgdW5rbm93blR5cGUpOiAgdHJ5IHByb3RvLnNraXAodHlwZTogdW5rbm93blR5cGUpIiA8PCBlbmRsOworICAgIGJsb2NrX2Nsb3NlKG91dCk7CisgICAgb3V0IDw8IGVuZGw7CisKKyAgICAvLyBSZWFkIGZpZWxkIGVuZCBtYXJrZXIKKyAgICBpbmRlbnQob3V0KSA8PCAidHJ5IHByb3RvLnJlYWRGaWVsZEVuZCgpIiA8PCBlbmRsOworICAgIGJsb2NrX2Nsb3NlKG91dCk7CisgICAgb3V0IDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgInRyeSBwcm90by5yZWFkU3RydWN0RW5kKCkiIDw8IGVuZGw7CisKKyAgICBpZiAoc3RydWN0X2hhc19yZXF1aXJlZF9maWVsZHModHN0cnVjdCkpIHsKKyAgICAgIC8vIHBlcmZvcm1zIHZhcmlvdXMgY2hlY2tzIChlLmcuIGNoZWNrIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgc2V0KQorICAgICAgaW5kZW50KG91dCkgPDwgIi8vIFJlcXVpcmVkIGZpZWxkcyIgPDwgZW5kbDsKKworICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgICAgaWYgKGZpZWxkX2lzX29wdGlvbmFsKCpmX2l0ZXIpKSB7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaW5kZW50KG91dCkgPDwgInRyeSBwcm90by52YWxpZGF0ZVZhbHVlKCIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIsICIKKyAgICAgICAgICAgICAgICAgICAgPDwgIm5hbWVkOiBcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIikiIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorCisgICAgb3V0IDw8IGVuZGw7CisKKyAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKCI7CisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTspIHsKKyAgICAgIG91dCA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIjogIiA8PCBtYXliZV9lc2NhcGVfaWRlbnRpZmllcigoKmZfaXRlciktPmdldF9uYW1lKCkpOworICAgICAgaWYgKCsrZl9pdGVyICE9IGZpZWxkcy5lbmQoKSkgeworICAgICAgICBvdXQgPDwgIiwgIjsKKyAgICAgIH0KKyAgICB9CisKKyAgfSBlbHNlIHsKKyAgICAvKiogTGVnYWN5IFN3aWYyL0NvY29hIGNhc2UgKi8KKyAgICBzdHJpbmcgdmlzaWJpbGl0eSA9IGlzX3ByaXZhdGUgPyAicHJpdmF0ZSIgOiAicHVibGljIjsKKworICAgIGluZGVudChvdXQpIDw8IHZpc2liaWxpdHkgPDwgIiBzdGF0aWMgZnVuYyByZWFkVmFsdWVGcm9tUHJvdG9jb2woX19wcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gIgorICAgICAgICAgICAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisKKyAgICBibG9ja19vcGVuKG91dCk7CisgICAgb3V0IDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgInRyeSBfX3Byb3RvLnJlYWRTdHJ1Y3RCZWdpbigpIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICBib29sIG9wdGlvbmFsID0gZmllbGRfaXNfb3B0aW9uYWwoKmZfaXRlcik7CisgICAgICBpbmRlbnQob3V0KSA8PCAidmFyICIgPDwgbWF5YmVfZXNjYXBlX2lkZW50aWZpZXIoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiIDogIgorICAgICAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSwgb3B0aW9uYWwsICFvcHRpb25hbCkgPDwgZW5kbDsKKyAgICB9CisKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIC8vIExvb3Agb3ZlciByZWFkaW5nIGluIGZpZWxkcworICAgIGluZGVudChvdXQpIDw8ICJmaWVsZHM6IHdoaWxlIHRydWUiOworICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIGluZGVudChvdXQpIDw8ICJsZXQgKF8sIGZpZWxkVHlwZSwgZmllbGRJRCkgPSB0cnkgX19wcm90by5yZWFkRmllbGRCZWdpbigpIiA8PCBlbmRsIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmllbGRJRCwgZmllbGRUeXBlKSI7CisKKyAgICBibG9ja19vcGVuKG91dCk7CisKKyAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAoXywgLlNUT1ApOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiYnJlYWsgZmllbGRzIiA8PCBlbmRsIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKworICAgIC8vIEdlbmVyYXRlIGRlc2VyaWFsaXphdGlvbiBjb2RlIGZvciBrbm93biBjYXNlcworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisKKyAgICAgIGluZGVudChvdXQpIDw8ICJjYXNlICgiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICIsICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIik6IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCBtYXliZV9lc2NhcGVfaWRlbnRpZmllcigoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIgPSB0cnkgX19wcm90by5yZWFkVmFsdWUoKSBhcyAiCisgICAgICAgICAgICAgICAgICA8PCB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCBlbmRsIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworCisgICAgfQorCisgICAgaW5kZW50KG91dCkgPDwgImNhc2UgbGV0IChfLCB1bmtub3duVHlwZSk6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJ0cnkgX19wcm90by5za2lwVHlwZSh1bmtub3duVHlwZSkiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBibG9ja19jbG9zZShvdXQpOworICAgIG91dCA8PCBlbmRsOworCisgICAgLy8gUmVhZCBmaWVsZCBlbmQgbWFya2VyCisgICAgaW5kZW50KG91dCkgPDwgInRyeSBfX3Byb3RvLnJlYWRGaWVsZEVuZCgpIiA8PCBlbmRsOworCisgICAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgICBvdXQgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAidHJ5IF9fcHJvdG8ucmVhZFN0cnVjdEVuZCgpIiA8PCBlbmRsOworICAgIG91dCA8PCBlbmRsOworCisgICAgaWYgKHN0cnVjdF9oYXNfcmVxdWlyZWRfZmllbGRzKHRzdHJ1Y3QpKSB7CisgICAgICAvLyBwZXJmb3JtcyB2YXJpb3VzIGNoZWNrcyAoZS5nLiBjaGVjayB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHNldCkKKyAgICAgIGluZGVudChvdXQpIDw8ICIvLyBSZXF1aXJlZCBmaWVsZHMiIDw8IGVuZGw7CisKKyAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICAgIGlmIChmaWVsZF9pc19vcHRpb25hbCgqZl9pdGVyKSkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGluZGVudChvdXQpIDw8ICJ0cnkgX19wcm90by52YWxpZGF0ZVZhbHVlKCIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIsICIKKyAgICAgICAgICAgICAgICAgICAgPDwgIm5hbWVkOiBcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIikiIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorCisgICAgb3V0IDw8IGVuZGw7CisKKyAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKCI7CisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTspIHsKKyAgICAgIG91dCA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIjogIiA8PCBtYXliZV9lc2NhcGVfaWRlbnRpZmllcigoKmZfaXRlciktPmdldF9uYW1lKCkpOworICAgICAgaWYgKCsrZl9pdGVyICE9IGZpZWxkcy5lbmQoKSkgeworICAgICAgICBvdXQgPDwgIiwgIjsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgb3V0IDw8ICIpIiA8PCBlbmRsOworCisgIGJsb2NrX2Nsb3NlKG91dCk7CisKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gd3JpdGUgYSBzdHJ1Y3QgdG8KKyAqIGEgcHJvdG9jb2wuIChUU3RydWN0IGNvbXBsaWFuY2UpIE9OTFkgRk9SIFNXSUZUMi9DT0NPQQorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICogQHBhcmFtIGlzX3ByaXZhdGUKKyAqICAgICAgICAgICAgICAgIElzIHRoZSBzdHJ1Y3QgcHVibGljIG9yIHByaXZhdGUKKyAqLwordm9pZCB0X3N3aWZ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfb2xkX3N3aWZ0X3N0cnVjdF93cml0ZXIob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3ByaXZhdGUpIHsKKworICBzdHJpbmcgdmlzaWJpbGl0eSA9IGlzX3ByaXZhdGUgPyAicHJpdmF0ZSIgOiAicHVibGljIjsKKworICBpbmRlbnQob3V0KSA8PCB2aXNpYmlsaXR5IDw8ICIgc3RhdGljIGZ1bmMgd3JpdGVWYWx1ZShfX3ZhbHVlOiAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgPDwgIiwgdG9Qcm90b2NvbCBfX3Byb3RvOiBUUHJvdG9jb2wpIHRocm93cyI7CisgIGJsb2NrX29wZW4ob3V0KTsKKyAgb3V0IDw8IGVuZGw7CisKKyAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgaW5kZW50KG91dCkgPDwgInRyeSBfX3Byb3RvLndyaXRlU3RydWN0QmVnaW5XaXRoTmFtZShcIiIgPDwgbmFtZSA8PCAiXCIpIiA8PCBlbmRsOworICBvdXQgPDwgZW5kbDsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfZmllbGQgKnRmaWVsZCA9ICpmX2l0ZXI7CisKKyAgICBib29sIG9wdGlvbmFsID0gZmllbGRfaXNfb3B0aW9uYWwodGZpZWxkKTsKKyAgICBpZiAob3B0aW9uYWwpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiBsZXQgIiA8PCBtYXliZV9lc2NhcGVfaWRlbnRpZmllcih0ZmllbGQtPmdldF9uYW1lKCkpCisgICAgICAgICAgICAgICAgICA8PCAiID0gX192YWx1ZS4iIDw8IG1heWJlX2VzY2FwZV9pZGVudGlmaWVyKHRmaWVsZC0+Z2V0X25hbWUoKSk7CisgICAgICBibG9ja19vcGVuKG91dCk7CisgICAgfQorCisgICAgaW5kZW50KG91dCkgPDwgInRyeSBfX3Byb3RvLndyaXRlRmllbGRWYWx1ZSgiCisgICAgICAgICAgICAgICAgPDwgKG9wdGlvbmFsID8gIiIgOiAiX192YWx1ZS4iKSA8PCBtYXliZV9lc2NhcGVfaWRlbnRpZmllcih0ZmllbGQtPmdldF9uYW1lKCkpIDw8ICIsICIKKyAgICAgICAgICAgICAgICA8PCAibmFtZTogXCIiIDw8IHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiXCIsICIKKyAgICAgICAgICAgICAgICA8PCAidHlwZTogIiA8PCB0eXBlX3RvX2VudW0odGZpZWxkLT5nZXRfdHlwZSgpKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgPDwgImlkOiAiIDw8IHRmaWVsZC0+Z2V0X2tleSgpIDw8ICIpIiA8PCBlbmRsOworCisgICAgaWYgKG9wdGlvbmFsKSB7CisgICAgICBibG9ja19jbG9zZShvdXQpOworICAgIH0KKworICAgIG91dCA8PCBlbmRsOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgInRyeSBfX3Byb3RvLndyaXRlRmllbGRTdG9wKCkiIDw8IGVuZGwgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInRyeSBfX3Byb3RvLndyaXRlU3RydWN0RW5kKCkiIDw8IGVuZGw7CisgIGJsb2NrX2Nsb3NlKG91dCk7CisgIG91dCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGZ1bmN0aW9uIHRvIHJlYWQgYSBzdHJ1Y3QgZnJvbQorICogZnJvbSBhIHByb3RvY29sLiAoVFN0cnVjdCBjb21wbGlhbmNlKSAgT05MWSBGT1IgU1dJRlQgMi9DT0NPQQorICoKKyAqIFRoaXMgaXMgc3BlY2lmaWNhbGx5IGEgZnVuY3Rpb24gcmVzdWx0LiBPbmx5CisgKiB0aGUgZmlyc3QgYXZhaWxhYmxlIGZpZWxkIGlzIHdyaXR0ZW4uCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX29sZF9zd2lmdF9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisKKyAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgc3RhdGljIGZ1bmMgd3JpdGVWYWx1ZShfX3ZhbHVlOiAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgPDwgIiwgdG9Qcm90b2NvbCBfX3Byb3RvOiBUUHJvdG9jb2wpIHRocm93cyI7CisgIGJsb2NrX29wZW4ob3V0KTsKKyAgb3V0IDw8IGVuZGw7CisgIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBpbmRlbnQob3V0KSA8PCAidHJ5IF9fcHJvdG8ud3JpdGVTdHJ1Y3RCZWdpbldpdGhOYW1lKFwiIiA8PCBuYW1lIDw8ICJcIikiIDw8IGVuZGw7CisgIG91dCA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9maWVsZCAqdGZpZWxkID0gKmZfaXRlcjsKKworICAgIGluZGVudChvdXQpIDw8ICJpZiBsZXQgcmVzdWx0ID0gX192YWx1ZS4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKworICAgIGJsb2NrX29wZW4ob3V0KTsKKworICAgIGluZGVudChvdXQpIDw8ICJ0cnkgX19wcm90by53cml0ZUZpZWxkVmFsdWUocmVzdWx0LCAiCisgICAgICAgICAgICAgICAgPDwgIm5hbWU6IFwiIiA8PCB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIlwiLCAiCisgICAgICAgICAgICAgICAgPDwgInR5cGU6ICIgPDwgdHlwZV90b19lbnVtKHRmaWVsZC0+Z2V0X3R5cGUoKSkgPDwgIiwgIgorICAgICAgICAgICAgICAgIDw8ICJpZDogIiA8PCB0ZmllbGQtPmdldF9rZXkoKSA8PCAiKSIgPDwgZW5kbDsKKworICAgIGJsb2NrX2Nsb3NlKG91dCk7CisgIH0KKyAgLy8gV3JpdGUgdGhlIHN0cnVjdCBtYXAKKyAgaW5kZW50KG91dCkgPDwgInRyeSBfX3Byb3RvLndyaXRlRmllbGRTdG9wKCkiIDw8IGVuZGwgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInRyeSBfX3Byb3RvLndyaXRlU3RydWN0RW5kKCkiIDw8IGVuZGw7CisgIGJsb2NrX2Nsb3NlKG91dCk7CisgIG91dCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGRlc2NyaXB0aW9uIG1ldGhvZCBmb3IgdGhlIGdpdmVuIHN0cnVjdAorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zd2lmdF9zdHJ1Y3RfcHJpbnRhYmxlX2V4dGVuc2lvbihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisKKyAgLy8gQWxsb3cgdXNlIG9mIGRlYnVnRGVzY3JpcHRpb24gc28gdGhlIGFwcCBjYW4gYWRkIGRlc2NyaXB0aW9uIHZpYSBhIGNhdGVvZ29yeS9leHRlbnNpb24KKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgaW5kZW50KG91dCkgPDwgImV4dGVuc2lvbiAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiA6ICIKKyAgICAgICAgICAgICAgPDwgKGRlYnVnX2Rlc2NyaXB0aW9uc18gPyAiQ3VzdG9tRGVidWdTdHJpbmdDb252ZXJ0aWJsZSIgOiAiQ3VzdG9tU3RyaW5nQ29udmVydGlibGUiKTsKKworICBibG9ja19vcGVuKG91dCk7CisgIG91dCA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZhciBkZXNjcmlwdGlvbiA6IFN0cmluZyI7CisgIGJsb2NrX29wZW4ob3V0KTsKKyAgaW5kZW50KG91dCkgPDwgInZhciBkZXNjID0gXCIiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisKKyAgaWYgKCFnZW5fY29jb2FfKSB7CisgICAgaWYgKCF0c3RydWN0LT5pc191bmlvbigpKSB7CisgICAgICBvdXQgPDwgIihcIiIgPDwgZW5kbDsKKyAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7KSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJkZXNjICs9IFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgPDwgIj1cXChTdHJpbmcoZGVzY3JpYmluZzogc2VsZi4iIDw8IG1heWJlX2VzY2FwZV9pZGVudGlmaWVyKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIikpIjsKKyAgICAgICAgaWYgKCsrZl9pdGVyICE9IGZpZWxkcy5lbmQoKSkgeworICAgICAgICAgIG91dCA8PCAiLCAiOworICAgICAgICB9CisgICAgICAgIG91dCA8PCAiXCIiIDw8IGVuZGw7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCAiLlwiIiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgInN3aXRjaCBzZWxmIHsiIDw8IGVuZGw7CisgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpO2ZfaXRlcisrKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJjYXNlIC4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKGxldCB2YWwpOiAiCisgICAgICAgICAgICAgICAgICAgIDw8ICJkZXNjICs9IFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIih2YWw6IFxcKHZhbCkpXCIiCisgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICB9CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgb3V0IDw8ICIoXCIiIDw8IGVuZGw7CisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTspIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJkZXNjICs9IFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgIDw8ICI9XFwoc2VsZi4iIDw8IG1heWJlX2VzY2FwZV9pZGVudGlmaWVyKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIikiOworICAgICAgaWYgKCsrZl9pdGVyICE9IGZpZWxkcy5lbmQoKSkgeworICAgICAgICBvdXQgPDwgIiwgIjsKKyAgICAgIH0KKyAgICAgIG91dCA8PCAiXCIiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudChvdXQpIDw8ICJkZXNjICs9IFwiKVwiIiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgInJldHVybiBkZXNjIiA8PCBlbmRsOworICBibG9ja19jbG9zZShvdXQpOworICBvdXQgPDwgZW5kbDsKKyAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdGhyaWZ0IHNlcnZpY2UuICBJbiBTd2lmdCB0aGlzIGNvbnNpc3RzIG9mIGEKKyAqIHByb3RvY29sIGRlZmluaXRpb24gYW5kIGEgY2xpZW50ICh3aXRoIGl0J3MgaW1wbGVtZW50YXRpb24KKyAqIHNlcGFyYXRlZCBpbnRvIGV4dHMgZmlsZSkuCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGRlZmluaXRpb24KKyAqLwordm9pZCB0X3N3aWZ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisKKyAgZ2VuZXJhdGVfc3dpZnRfc2VydmljZV9wcm90b2NvbChmX2RlY2xfLCB0c2VydmljZSk7CisgIGdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfY2xpZW50KGZfZGVjbF8sIHRzZXJ2aWNlKTsKKyAgaWYgKGFzeW5jX2NsaWVudHNfKSB7CisgICAgZ2VuZXJhdGVfc3dpZnRfc2VydmljZV9wcm90b2NvbF9hc3luYyhmX2RlY2xfLCB0c2VydmljZSk7CisgICAgZ2VuZXJhdGVfc3dpZnRfc2VydmljZV9jbGllbnRfYXN5bmMoZl9kZWNsXywgdHNlcnZpY2UpOworICB9CisgIGdlbmVyYXRlX3N3aWZ0X3NlcnZpY2Vfc2VydmVyKGZfZGVjbF8sIHRzZXJ2aWNlKTsKKworICBnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOworCisgIGdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfY2xpZW50X2ltcGxlbWVudGF0aW9uKGZfaW1wbF8sIHRzZXJ2aWNlKTsKKyAgaWYgKGFzeW5jX2NsaWVudHNfKSB7CisgICAgZ2VuZXJhdGVfc3dpZnRfc2VydmljZV9jbGllbnRfYXN5bmNfaW1wbGVtZW50YXRpb24oZl9pbXBsXywgdHNlcnZpY2UpOworICB9CisgIGdlbmVyYXRlX3N3aWZ0X3NlcnZpY2Vfc2VydmVyX2ltcGxlbWVudGF0aW9uKGZfaW1wbF8sIHRzZXJ2aWNlKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgc3RydWN0cyBmb3IgYWxsIHRoZSBzZXJ2aWNlIHJldHVybiB0eXBlcworICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZQorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSkgeworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKworICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKworICAgIHN0cmluZyBxbmFtZSA9IGZ1bmN0aW9uX2FyZ3NfaGVscGVyX3N0cnVjdF90eXBlKHRzZXJ2aWNlLCAqZl9pdGVyKTsKKworICAgIHRfc3RydWN0IHFuYW1lX3RzID0gdF9zdHJ1Y3QodHMtPmdldF9wcm9ncmFtKCksIHFuYW1lKTsKKworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0cy0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgcW5hbWVfdHMuYXBwZW5kKCptX2l0ZXIpOworICAgIH0KKworICAgIGdlbmVyYXRlX3N3aWZ0X3N0cnVjdChmX2ltcGxfLCAmcW5hbWVfdHMsIHRydWUpOworICAgIGdlbmVyYXRlX3N3aWZ0X3N0cnVjdF9pbXBsZW1lbnRhdGlvbihmX2ltcGxfLCAmcW5hbWVfdHMsIGZhbHNlLCB0cnVlKTsKKyAgICBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRzZXJ2aWNlLCAqZl9pdGVyKTsKKyAgfQorfQorCitzdHJpbmcgdF9zd2lmdF9nZW5lcmF0b3I6OmZ1bmN0aW9uX3Jlc3VsdF9oZWxwZXJfc3RydWN0X3R5cGUodF9zZXJ2aWNlICp0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgcmV0dXJuIHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIl8iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpOworICB9IGVsc2UgeworICAgIHJldHVybiB0c2VydmljZS0+Z2V0X25hbWUoKSArICJfIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKKyAgfQorfQorCitzdHJpbmcgdF9zd2lmdF9nZW5lcmF0b3I6OmZ1bmN0aW9uX2FyZ3NfaGVscGVyX3N0cnVjdF90eXBlKHRfc2VydmljZSAqdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICByZXR1cm4gdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiXyIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX2FyZ3MiOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBhbmQgaGVscGVycyBmb3IgYSBmdW5jdGlvbi4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbgorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRfc2VydmljZSAqdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIHJldHVybjsKKyAgfQorCisgIC8vIGNyZWF0ZSBhIHJlc3VsdCBzdHJ1Y3Qgd2l0aCBhIHN1Y2Nlc3MgZmllbGQgb2YgdGhlIHJldHVybiB0eXBlLAorICAvLyBhbmQgYSBmaWVsZCBmb3IgZWFjaCB0eXBlIG9mIGV4Y2VwdGlvbiB0aHJvd24KKyAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCBmdW5jdGlvbl9yZXN1bHRfaGVscGVyX3N0cnVjdF90eXBlKHRzZXJ2aWNlLCB0ZnVuY3Rpb24pKTsKKyAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgIHRfZmllbGQqIHN1Y2Nlc3MgPSBuZXcgdF9maWVsZCh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksICJzdWNjZXNzIiwgMCk7CisgICAgc3VjY2Vzcy0+c2V0X3JlcSh0X2ZpZWxkOjpUX09QVElPTkFMKTsKKyAgICByZXN1bHQuYXBwZW5kKHN1Y2Nlc3MpOworICB9CisKKyAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9maWVsZCAqeCA9ICpmX2l0ZXI7CisgICAgdF9maWVsZCAqb3ggPSBuZXcgdF9maWVsZCh4LT5nZXRfdHlwZSgpLCB4LT5nZXRfbmFtZSgpLCB4LT5nZXRfa2V5KCkpOworICAgIG94LT5zZXRfcmVxKHRfZmllbGQ6OlRfT1BUSU9OQUwpOworICAgIHJlc3VsdC5hcHBlbmQob3gpOworICB9CisKKyAgLy8gZ2VuZXJhdGUgdGhlIHJlc3VsdCBzdHJ1Y3QKKyAgZ2VuZXJhdGVfc3dpZnRfc3RydWN0KGZfaW1wbF8sICZyZXN1bHQsIHRydWUpOworICBnZW5lcmF0ZV9zd2lmdF9zdHJ1Y3RfaW1wbGVtZW50YXRpb24oZl9pbXBsXywgJnJlc3VsdCwgdHJ1ZSwgdHJ1ZSk7CisKKyAgZm9yIChmX2l0ZXIgPSByZXN1bHQuZ2V0X21lbWJlcnMoKS5iZWdpbigpOyBmX2l0ZXIgIT0gcmVzdWx0LmdldF9tZW1iZXJzKCkuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZGVsZXRlICpmX2l0ZXI7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIHByb3RvY29sIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgcHJvdG9jb2wgZGVmaW5pdGlvbiBmb3IKKyAqLwordm9pZCB0X3N3aWZ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3dpZnRfc2VydmljZV9wcm90b2NvbChvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgaWYgKCFnZW5fY29jb2FfKSB7CisgICAgc3RyaW5nIGRvYyA9IHRzZXJ2aWNlLT5nZXRfZG9jKCk7CisgICAgZ2VuZXJhdGVfZG9jc3RyaW5nKG91dCwgZG9jKTsKKworICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgcHJvdG9jb2wgIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKTsKKyAgICB0X3NlcnZpY2UqIHBhcmVudCA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworICAgIGlmIChwYXJlbnQgIT0gTlVMTCkgeworICAgICAgb3V0IDw8ICIgOiAiIDw8IHBhcmVudC0+Z2V0X25hbWUoKTsKKyAgICB9CisgICAgYmxvY2tfb3BlbihvdXQpOworICAgIG91dCA8PCBlbmRsOworCisgICAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKworICAgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICBmdW5jdGlvbl9kb2NzdHJpbmcob3V0LCAqZl9pdGVyKTsKKyAgICAgIGluZGVudChvdXQpIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCBlbmRsIDw8IGVuZGw7CisgICAgfQorCisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBwcm90b2NvbCAiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpOworICAgIGJsb2NrX29wZW4ob3V0KTsKKworICAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgb3V0IDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgIiAgLy8gZXhjZXB0aW9uczogIjsKKyAgICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOworICAgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgICBvdXQgPDwgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSkgKyAiLCAiOworICAgICAgfQorICAgICAgb3V0IDw8IGVuZGw7CisgICAgfQorICB9CisgIGJsb2NrX2Nsb3NlKG91dCk7CisgIG91dCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhbiBhc3luY2hyb25vdXMgc2VydmljZSBwcm90b2NvbCBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHByb3RvY29sIGRlZmluaXRpb24gZm9yCisgKi8KK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfcHJvdG9jb2xfYXN5bmMob3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIGlmICghZ2VuX2NvY29hXykgeworICAgIHN0cmluZyBkb2MgPSB0c2VydmljZS0+Z2V0X2RvYygpOworICAgIGdlbmVyYXRlX2RvY3N0cmluZyhvdXQsIGRvYyk7CisgIH0KKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBwcm90b2NvbCAiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICJBc3luYyI7CisKKyAgYmxvY2tfb3BlbihvdXQpOworICBpZiAoIWdlbl9jb2NvYV8pIHsgIG91dCA8PCBlbmRsOyB9CisKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgaWYgKCFnZW5fY29jb2FfKSB7CisgICAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIGFzeW5jX2Z1bmN0aW9uX2RvY3N0cmluZyhvdXQsICpmX2l0ZXIpOworICAgICAgaW5kZW50KG91dCkgPDwgYXN5bmNfZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8IGVuZGwgPDwgZW5kbDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIG91dCA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgYXN5bmNfZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8IGVuZGw7CisgICAgICBpZiAocHJvbWlzZV9raXRfKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8IHByb21pc2VfZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8IGVuZGw7CisgICAgICB9IC8vCisgICAgICBvdXQgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgaW50ZXJmYWNlIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgY2xpZW50IGludGVyZmFjZSBkZWZpbml0aW9uIGZvcgorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2NsaWVudChvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgaWYgKCFnZW5fY29jb2FfKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wZW4gY2xhc3MgIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiQ2xpZW50IjsvLyA6ICIKKworICAgIC8vIEluaGVyaXQgZnJvbSBQYXJlbnRDbGllbnQKKyAgICB0X3NlcnZpY2UqIHBhcmVudCA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworICAgIG91dCA8PCAiIDogIiA8PCAoKHBhcmVudCA9PSBOVUxMKSA/ICJUQ2xpZW50IiA6IHBhcmVudC0+Z2V0X25hbWUoKSArICJDbGllbnQiKTsKKyAgICBvdXQgPDwgICIgLyogLCAiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICIgKi8iOworICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICAvLyBhCisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBjbGFzcyAiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICJDbGllbnQgLyogOiAiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICIgKi8iOworICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIGluZGVudChvdXQpIDw8ICJsZXQgX19pblByb3RvY29sIDogVFByb3RvY29sIiA8PCBlbmRsIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgImxldCBfX291dFByb3RvY29sIDogVFByb3RvY29sIiA8PCBlbmRsIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBpbml0KGlub3V0UHJvdG9jb2w6IFRQcm90b2NvbCkiOworICAgIGJsb2NrX29wZW4ob3V0KTsKKworICAgIGluZGVudChvdXQpIDw8ICJfX2luUHJvdG9jb2wgPSBpbm91dFByb3RvY29sIiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJfX291dFByb3RvY29sID0gaW5vdXRQcm90b2NvbCIgPDwgZW5kbDsKKyAgICBibG9ja19jbG9zZShvdXQpOworICAgIG91dCA8PCBlbmRsOworCisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBpbml0KGluUHJvdG9jb2w6IFRQcm90b2NvbCwgb3V0UHJvdG9jb2w6IFRQcm90b2NvbCkiOworICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICBpbmRlbnQob3V0KSA8PCAiX19pblByb3RvY29sID0gaW5Qcm90b2NvbCIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiX19vdXRQcm90b2NvbCA9IG91dFByb3RvY29sIiA8PCBlbmRsOworICAgIGJsb2NrX2Nsb3NlKG91dCk7CisgICAgb3V0IDw8IGVuZGw7CisgIH0KKworICBibG9ja19jbG9zZShvdXQpOworICBvdXQgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGNsaWVudCBpbnRlcmZhY2UgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBjbGllbnQgaW50ZXJmYWNlIGRlZmluaXRpb24gZm9yCisgKi8KK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfY2xpZW50X2FzeW5jKG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBpZiAoIWdlbl9jb2NvYV8pIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3BlbiBjbGFzcyAiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgPDwgIkFzeW5jQ2xpZW50PFByb3RvY29sOiBUUHJvdG9jb2wsIEZhY3Rvcnk6IFRBc3luY1RyYW5zcG9ydEZhY3Rvcnk+IjsvLyA6ICIKKworICAgIC8vIEluaGVyaXQgZnJvbSBQYXJlbnRDbGllbnQKKyAgICB0X3NlcnZpY2UqIHBhcmVudCA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworCisgICAgb3V0IDw8ICIgOiAiIDw8ICgocGFyZW50ID09IE5VTEwpID8gIlQiIDogIHBhcmVudC0+Z2V0X25hbWUoKSkgKyAiQXN5bmNDbGllbnQ8UHJvdG9jb2wsIEZhY3Rvcnk+IjsKKyAgICBvdXQgPDwgICIgLyogLCAiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICIgKi8iOworCisgICAgYmxvY2tfb3BlbihvdXQpOworICAgIG91dCA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgY2xhc3MgIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiQXN5bmNDbGllbnQgLyogOiAiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICIgKi8iOworICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIGluZGVudChvdXQpIDw8ICJsZXQgX19wcm90b2NvbEZhY3RvcnkgOiBUUHJvdG9jb2xGYWN0b3J5IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgImxldCBfX3RyYW5zcG9ydEZhY3RvcnkgOiBUQXN5bmNUcmFuc3BvcnRGYWN0b3J5IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBpbml0KHByb3RvY29sRmFjdG9yeTogVFByb3RvY29sRmFjdG9yeSwgdHJhbnNwb3J0RmFjdG9yeTogVEFzeW5jVHJhbnNwb3J0RmFjdG9yeSkiOworICAgIGJsb2NrX29wZW4ob3V0KTsKKworICAgIGluZGVudChvdXQpIDw8ICJfX3Byb3RvY29sRmFjdG9yeSA9IHByb3RvY29sRmFjdG9yeSIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiX190cmFuc3BvcnRGYWN0b3J5ID0gdHJhbnNwb3J0RmFjdG9yeSIgPDwgZW5kbDsKKyAgICBibG9ja19jbG9zZShvdXQpOworICAgIG91dCA8PCBlbmRsOworICB9CisgIGJsb2NrX2Nsb3NlKG91dCk7CisgIG91dCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2Ugc2VydmVyIGludGVyZmFjZSBkZWZpbml0aW9uLiBJbiBvdGhlciB3b3JkcywKKyAqIHRoZSBUUHJvY2VzcyBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIHNlcnZpY2UgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBjbGllbnQgaW50ZXJmYWNlIGRlZmluaXRpb24gZm9yCisgKi8KK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N3aWZ0X3NlcnZpY2Vfc2VydmVyKG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBpZiAoIWdlbl9jb2NvYV8pIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3BlbiBjbGFzcyAiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICJQcm9jZXNzb3IgLyogIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiICovIjsKKworICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICBvdXQgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInR5cGVhbGlhcyBQcm9jZXNzb3JIYW5kbGVyRGljdGlvbmFyeSA9ICIKKyAgICAgICAgPDwgIltTdHJpbmc6IChJbnQzMiwgVFByb3RvY29sLCBUUHJvdG9jb2wsICIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIikgdGhyb3dzIC0+IFZvaWRdIiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInB1YmxpYyB2YXIgc2VydmljZTogIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCBlbmRsCisgICAgICAgIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInB1YmxpYyByZXF1aXJlZCBpbml0KHNlcnZpY2U6ICIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIikiOworICB9IGVsc2UgeworICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgY2xhc3MgIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiUHJvY2Vzc29yIDogTlNPYmplY3QgLyogIgorICAgICAgICAgICAgICAgIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICIgKi8iOworICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidHlwZWFsaWFzIFByb2Nlc3NvckhhbmRsZXJEaWN0aW9uYXJ5ID0gIgorICAgICAgICA8PCAiW1N0cmluZzogKEludCwgVFByb3RvY29sLCBUUHJvdG9jb2wsICIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIikgdGhyb3dzIC0+IFZvaWRdIiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImxldCBzZXJ2aWNlIDogIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCBlbmRsCisgICAgICAgIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBpbml0KHNlcnZpY2U6ICIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIikiOworICB9CisKKyAgYmxvY2tfb3BlbihvdXQpOworICBpbmRlbnQob3V0KSA8PCAic2VsZi5zZXJ2aWNlID0gc2VydmljZSIgPDwgZW5kbDsKKyAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgb3V0IDw8IGVuZGw7CisKKyAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdGhhdCB3aWxsIHNlbmQgdGhlIGFyZ3VtZW50cworICogZm9yIGEgc2VydmljZSBmdW5jdGlvbiB2aWEgYSBwcm90b2NvbC4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byBnZW5lcmF0ZQorICogQHBhcmFtIG5lZWRzX3Byb3RvY29sCisgKiAgICAgICAgICAgICAgICAgIFdldGhlciB0aGUgZmlyc3QgcGFyYW1ldGVyIG11c3QgYmUgYSBwcm90b2NvbCBvciBpZgorICogICAgICAgICAgICAgICAgICB0aGUgcHJvdG9jb2wgaXMgdG8gYmUgYXNzdW1lZAorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2NsaWVudF9zZW5kX2Z1bmN0aW9uX2ltcGxlbWVudGF0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXJ2aWNlICp0c2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG5lZWRzX3Byb3RvY29sKSB7CisKKyAgc3RyaW5nIGZ1bm5hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCk7CisKKyAgdF9mdW5jdGlvbiBzZW5kX2Z1bmN0aW9uKGdfdHlwZV9ib29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlbmRfIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSk7CisKKyAgc3RyaW5nIGFyZ3NuYW1lID0gZnVuY3Rpb25fYXJnc19oZWxwZXJfc3RydWN0X3R5cGUodHNlcnZpY2UsIHRmdW5jdGlvbik7CisgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOworCisgIHN0cmluZyBwcm90byA9IG5lZWRzX3Byb3RvY29sID8gKGdlbl9jb2NvYV8gPyAiX19vdXRQcm90b2NvbCIgOiAib24gb3V0UHJvdG9jb2wiKSA6ICIiOworICAvLyBPcGVuIGZ1bmN0aW9uCisgIGluZGVudChvdXQpIDw8ICJwcml2YXRlIGZ1bmMgIiA8PCBzZW5kX2Z1bmN0aW9uLmdldF9uYW1lKCkgPDwgIigiCisgICAgICAgICAgICAgIDw8IGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLCBwcm90bywgdHJ1ZSkKKyAgICAgICAgICAgICAgPDwgIikgdGhyb3dzIjsKKyAgYmxvY2tfb3BlbihvdXQpOworICBpZiAoIWdlbl9jb2NvYV8pIHsKKyAgICAvLyBTZXJpYWxpemUgdGhlIHJlcXVlc3QKKyAgICBpbmRlbnQob3V0KSA8PCAidHJ5IG91dFByb3RvY29sLndyaXRlTWVzc2FnZUJlZ2luKG5hbWU6IFwiIiA8PCBmdW5uYW1lIDw8ICJcIiwgIgorICAgICAgICAgICAgICAgIDw8ICJ0eXBlOiAiIDw8ICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpID8gIi5vbmV3YXkiIDogIi5jYWxsIikgPDwgIiwgIgorICAgICAgICAgICAgICAgIDw8ICJzZXF1ZW5jZUlEOiAwKSIgPDwgZW5kbDsKKworICAgIGluZGVudChvdXQpIDw8ICJsZXQgYXJncyA9ICIgPDwgYXJnc25hbWUgPDwgIigiOworCisgICAgLy8gd3JpdGUgb3V0IGZ1bmN0aW9uIHBhcmFtZXRlcnMKKworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTspIHsKKyAgICAgIHRfZmllbGQgKnRmaWVsZCA9ICgqZl9pdGVyKTsKKyAgICAgIG91dCA8PCB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIjogIiA8PCB0ZmllbGQtPmdldF9uYW1lKCk7CisgICAgICBpZiAoKytmX2l0ZXIgIT0gZmllbGRzLmVuZCgpKSB7CisgICAgICAgIG91dCA8PCAiLCAiOworICAgICAgfQorICAgIH0KKyAgICBvdXQgPDwgIikiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgInRyeSBhcmdzLndyaXRlKHRvOiBvdXRQcm90b2NvbCkiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgInRyeSBvdXRQcm90b2NvbC53cml0ZU1lc3NhZ2VFbmQoKSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVxdWVzdAorICAgIGluZGVudChvdXQpIDw8ICJ0cnkgX19vdXRQcm90b2NvbC53cml0ZU1lc3NhZ2VCZWdpbldpdGhOYW1lKFwiIiA8PCBmdW5uYW1lIDw8ICJcIiwgIgorICAgICAgICAgICAgICAgIDw8ICJ0eXBlOiAiIDw8ICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpID8gIi5PTkVXQVkiIDogIi5DQUxMIikgPDwgIiwgIgorICAgICAgICAgICAgICAgIDw8ICJzZXF1ZW5jZUlEOiAwKSIgPDwgZW5kbDsKKworICAgIG91dCA8PCBlbmRsOworCisgICAgaW5kZW50KG91dCkgPDwgImxldCBfX2FyZ3MgPSAiIDw8IGFyZ3NuYW1lIDw8ICIoIjsKKworICAgIC8vIHdyaXRlIG91dCBmdW5jdGlvbiBwYXJhbWV0ZXJzCisKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7KSB7CisgICAgICB0X2ZpZWxkICp0ZmllbGQgPSAoKmZfaXRlcik7CisgICAgICBvdXQgPDwgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICI6ICIgPDwgdGZpZWxkLT5nZXRfbmFtZSgpOworICAgICAgaWYgKCsrZl9pdGVyICE9IGZpZWxkcy5lbmQoKSkgeworICAgICAgICBvdXQgPDwgIiwgIjsKKyAgICAgIH0KKyAgICB9CisgICAgb3V0IDw8ICIpIiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJ0cnkgIiA8PCBhcmdzbmFtZSA8PCAiLndyaXRlVmFsdWUoX19hcmdzLCB0b1Byb3RvY29sOiBfX291dFByb3RvY29sKSIgPDwgZW5kbCA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJ0cnkgX19vdXRQcm90b2NvbC53cml0ZU1lc3NhZ2VFbmQoKSIgPDwgZW5kbDsKKyAgfQorCisgIGJsb2NrX2Nsb3NlKG91dCk7CisgIG91dCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGZ1bmN0aW9uIHRoYXQgd2lsbCByZWN2IHRoZSByZXN1bHQgZm9yIGEKKyAqIHNlcnZpY2UgZnVuY3Rpb24gdmlhIGEgcHJvdG9jb2wuCisgKgorICogQHBhcmFtIHRzZXJ2aWNlICBUaGUgc2VydmljZSB0byBnZW5lcmF0ZQorICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24gdG8gZ2VuZXJhdGUKKyAqIEBwYXJhbSBuZWVkc19wcm90b2NvbAorICogICAgICAgICAgICAgICAgICBXZXRoZXIgdGhlIGZpcnN0IHBhcmFtZXRlciBtdXN0IGJlIGEgcHJvdG9jb2wgb3IgaWYKKyAqICAgICAgICAgICAgICAgICAgdGhlIHByb3RvY29sIGlzIHRvIGJlIGFzc3VtZWQKKyAqLwordm9pZCB0X3N3aWZ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3dpZnRfc2VydmljZV9jbGllbnRfcmVjdl9mdW5jdGlvbl9pbXBsZW1lbnRhdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2VydmljZSogdHNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBuZWVkc19wcm90b2NvbCkgeworCisgIC8vIE9wZW4gZnVuY3Rpb24KKyAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgZnVuYyByZWN2XyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIjsKKyAgaWYgKCFnZW5fY29jb2FfKSB7CisgICAgaWYgKG5lZWRzX3Byb3RvY29sKSB7CisgICAgICBvdXQgPDwgIm9uIGluUHJvdG9jb2w6IFRQcm90b2NvbCI7CisgICAgfQorICAgIG91dCA8PCAiKSB0aHJvd3MiOworICAgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgIG91dCA8PCAiIC0+ICIgPDwgdHlwZV9uYW1lKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSk7CisgICAgfQorCisgICAgYmxvY2tfb3BlbihvdXQpOworCisgICAgLy8gY2hlY2sgZm9yIGFuIGV4Y2VwdGlvbgorCisgICAgaW5kZW50KG91dCkgPDwgInRyeSBpblByb3RvY29sLnJlYWRSZXN1bHRNZXNzYWdlQmVnaW4oKSAiIDw8IGVuZGw7CisKKyAgICBzdHJpbmcgcmVzdWx0bmFtZSA9IGZ1bmN0aW9uX3Jlc3VsdF9oZWxwZXJfc3RydWN0X3R5cGUodHNlcnZpY2UsIHRmdW5jdGlvbik7CisgICAgaW5kZW50KG91dCk7CisgICAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSB8fCAhdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCktPmdldF9tZW1iZXJzKCkuZW1wdHkoKSkgeworICAgICAgb3V0IDw8ICJsZXQgcmVzdWx0ID0gIjsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8ICJfID0gIjsKKyAgICB9CisKKyAgICBzdHJpbmcgcmV0dXJuX3R5cGVfbmFtZSA9IHR5cGVfbmFtZSh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpOworICAgIG91dCA8PCAidHJ5ICIgPDwgcmVzdWx0bmFtZSA8PCAiLnJlYWQoZnJvbTogaW5Qcm90b2NvbCkiIDw8IGVuZGw7CisKKyAgICBpbmRlbnQob3V0KSA8PCAidHJ5IGluUHJvdG9jb2wucmVhZE1lc3NhZ2VFbmQoKSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgLy8gQ2FyZWZ1bCwgb25seSByZXR1cm4gX3Jlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCisgICAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgImlmIGxldCBzdWNjZXNzID0gcmVzdWx0LnN1Y2Nlc3MiOworICAgICAgYmxvY2tfb3BlbihvdXQpOworICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiBzdWNjZXNzIiA8PCBlbmRsOworICAgICAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgICB9CisKKyAgICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisKKyAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgaW5kZW50KG91dCkgPDwgImlmIGxldCAiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gcmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgYmxvY2tfb3BlbihvdXQpOworICAgICAgaW5kZW50KG91dCkgPDwgInRocm93ICIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8IGVuZGw7CisgICAgICBibG9ja19jbG9zZShvdXQpOworICAgIH0KKworICAgIC8vIElmIHlvdSBnZXQgaGVyZSBpdCdzIGFuIGV4Y2VwdGlvbiwgdW5sZXNzIGEgdm9pZCBmdW5jdGlvbgorICAgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ0aHJvdyBUQXBwbGljYXRpb25FcnJvcihlcnJvcjogLm1pc3NpbmdSZXN1bHQobWV0aG9kTmFtZTogXCIiCisgICAgICAgICAgICAgICAgICA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIlwiKSkiIDw8IGVuZGw7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmIChuZWVkc19wcm90b2NvbCkgeworICAgICAgb3V0IDw8ICJfX2luUHJvdG9jb2w6IFRQcm90b2NvbCI7CisgICAgfQorCisgICAgb3V0IDw8ICIpIHRocm93cyI7CisKKyAgICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICBvdXQgPDwgIiAtPiAiIDw8IHR5cGVfbmFtZSh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpOworICAgIH0KKworICAgIGJsb2NrX29wZW4ob3V0KTsKKworICAgIC8vIGNoZWNrIGZvciBhbiBleGNlcHRpb24KKyAgICBvdXQgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAidHJ5IF9faW5Qcm90b2NvbC5yZWFkUmVzdWx0TWVzc2FnZUJlZ2luKCkgIiA8PCBlbmRsIDw8IGVuZGw7CisgICAgc3RyaW5nIHJlc3VsdG5hbWUgPSBmdW5jdGlvbl9yZXN1bHRfaGVscGVyX3N0cnVjdF90eXBlKHRzZXJ2aWNlLCB0ZnVuY3Rpb24pOworICAgIGluZGVudChvdXQpOworICAgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkgfHwgIXRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpLT5nZXRfbWVtYmVycygpLmVtcHR5KCkpIHsKKyAgICAgIG91dCA8PCAibGV0IF9fcmVzdWx0ID0gIjsKKyAgICB9CisgICAgb3V0IDw8ICJ0cnkgIiA8PCByZXN1bHRuYW1lIDw8ICIucmVhZFZhbHVlRnJvbVByb3RvY29sKF9faW5Qcm90b2NvbCkiIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIGluZGVudChvdXQpIDw8ICJ0cnkgX19pblByb3RvY29sLnJlYWRNZXNzYWdlRW5kKCkiIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIC8vIENhcmVmdWwsIG9ubHkgcmV0dXJuIF9yZXN1bHQgaWYgbm90IGEgdm9pZCBmdW5jdGlvbgorICAgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiBsZXQgX19zdWNjZXNzID0gX19yZXN1bHQuc3VjY2VzcyI7CisgICAgICBibG9ja19vcGVuKG91dCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIF9fc3VjY2VzcyIgPDwgZW5kbDsKKyAgICAgIGJsb2NrX2Nsb3NlKG91dCk7CisgICAgfQorCisgICAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworCisgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiBsZXQgIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IF9fcmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgYmxvY2tfb3BlbihvdXQpOworICAgICAgaW5kZW50KG91dCkgPDwgInRocm93ICIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8IGVuZGw7CisgICAgICBibG9ja19jbG9zZShvdXQpOworICAgIH0KKworICAgIC8vIElmIHlvdSBnZXQgaGVyZSBpdCdzIGFuIGV4Y2VwdGlvbiwgdW5sZXNzIGEgdm9pZCBmdW5jdGlvbgorICAgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ0aHJvdyBOU0Vycm9yKCIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50KG91dCkgPDwgImRvbWFpbjogVEFwcGxpY2F0aW9uRXJyb3JEb21haW4sICIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJjb2RlOiBJbnQoVEFwcGxpY2F0aW9uRXJyb3IuTWlzc2luZ1Jlc3VsdC5yYXdWYWx1ZSksIiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgInVzZXJJbmZvOiBbVEFwcGxpY2F0aW9uRXJyb3JNZXRob2RLZXk6IFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIlwiXSkiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgIH0KKyAgfQorCisgIC8vIENsb3NlIGZ1bmN0aW9uCisgIGJsb2NrX2Nsb3NlKG91dCk7CisgIG91dCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhbiBpbnZvY2F0aW9uIG9mIGEgZ2l2ZW4gdGhlIHNlbmQgZnVuY3Rpb24gZm9yIHRoZQorICogc2VydmljZSBmdW5jdGlvbi4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGFuIGltcGxlbWVudGF0aW9uIGZvcgorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2NsaWVudF9zZW5kX2Z1bmN0aW9uX2ludm9jYXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworCisgIGluZGVudChvdXQpIDw8ICJ0cnkgc2VuZF8iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCI7CisKKyAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7KSB7CisgICAgb3V0IDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOiAiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICBpZiAoKytmX2l0ZXIgIT0gZmllbGRzLmVuZCgpKSB7CisgICAgICBvdXQgPDwgIiwgIjsKKyAgICB9CisgIH0KKworICBvdXQgPDwgIikiIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGFuIGludm9jYXRpb24gb2YgYSBnaXZlbiB0aGUgc2VuZCBmdW5jdGlvbiBmb3IgdGhlCisgKiBzZXJ2aWNlIGZ1bmN0aW9uLiBUaGlzIGlzIGZvciBhc3luY2hyb25vdXMgcHJvdG9jb2xzLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYW4gaW1wbGVtZW50YXRpb24gZm9yCisgKi8KK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfY2xpZW50X3NlbmRfYXN5bmNfZnVuY3Rpb25faW52b2NhdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisKKyAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBpZiAoIWdlbl9jb2NvYV8pIHsKKyAgICBpbmRlbnQob3V0KSA8PCAidHJ5IHNlbmRfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIihvbjogcHJvdG8iOworICB9IGVsc2UgeworICAgIGluZGVudChvdXQpIDw8ICJ0cnkgc2VuZF8iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKF9fcHJvdG9jb2wiOyAvLworICB9CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBvdXQgPDwgIiwgIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIjogIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgIH0KKworICBvdXQgPDwgIikiIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gdmlhIGV4dGVuc2lvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYW4gaW1wbGVtZW50YXRpb24gZm9yCisgKi8KK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfY2xpZW50X2ltcGxlbWVudGF0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2VydmljZSogdHNlcnZpY2UpIHsKKworICBzdHJpbmcgbmFtZSA9IHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIkNsaWVudCI7CisgIGluZGVudChvdXQpIDw8ICJleHRlbnNpb24gIiA8PCBuYW1lIDw8ICIgOiAiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpOworICBibG9ja19vcGVuKG91dCk7CisgIG91dCA8PCBlbmRsOworCisgIC8vIGdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworCisgICAgZ2VuZXJhdGVfc3dpZnRfc2VydmljZV9jbGllbnRfc2VuZF9mdW5jdGlvbl9pbXBsZW1lbnRhdGlvbihvdXQsIHRzZXJ2aWNlLCAqZl9pdGVyLCBmYWxzZSk7CisKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfY2xpZW50X3JlY3ZfZnVuY3Rpb25faW1wbGVtZW50YXRpb24ob3V0LCB0c2VydmljZSwgKmZfaXRlciwgZmFsc2UpOworICAgIH0KKworICAgIC8vIE9wZW4gZnVuY3Rpb24KKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpOworICAgIGJsb2NrX29wZW4ob3V0KTsKKworICAgIGlmIChnZW5fY29jb2FfKSB7IG91dCA8PCBlbmRsOyB9CisKKyAgICBnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2NsaWVudF9zZW5kX2Z1bmN0aW9uX2ludm9jYXRpb24ob3V0LCAqZl9pdGVyKTsKKyAgICBpZiAoIWdlbl9jb2NvYV8pIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ0cnkgb3V0UHJvdG9jb2wudHJhbnNwb3J0LmZsdXNoKCkiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgInRyeSBfX291dFByb3RvY29sLnRyYW5zcG9ydCgpLmZsdXNoKCkiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAidHJ5IHJlY3ZfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIigpIiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiB0cnkgcmVjdl8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCkiIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorICAgIGJsb2NrX2Nsb3NlKG91dCk7CisgICAgb3V0IDw8IGVuZGw7CisgIH0KKyAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBhc3luY2hyb25vdXMgY2xpZW50IHByb3RvY29sIGltcGxlbWVudGF0aW9uIHZpYSBleHRlbnNpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGFuIGltcGxlbWVudGF0aW9uIGZvcgorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2NsaWVudF9hc3luY19pbXBsZW1lbnRhdGlvbihvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgaWYgKGdlbl9jb2NvYV8pIHsKKyAgICBnZW5lcmF0ZV9vbGRfc3dpZnRfc2VydmljZV9jbGllbnRfYXN5bmNfaW1wbGVtZW50YXRpb24ob3V0LCB0c2VydmljZSk7CisgICAgcmV0dXJuOworICB9CisgIHN0cmluZyBuYW1lID0gdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiQXN5bmNDbGllbnQiOworICBzdHJpbmcgcHJvdG9jb2xfbmFtZSA9IHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIkFzeW5jIjsKKworICBpbmRlbnQob3V0KSA8PCAiZXh0ZW5zaW9uICIgPDwgbmFtZSA8PCAiIDogIiA8PCBwcm90b2NvbF9uYW1lOworICBibG9ja19vcGVuKG91dCk7CisgIG91dCA8PCBlbmRsOworCisgIC8vIGdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworCisgICAgZ2VuZXJhdGVfc3dpZnRfc2VydmljZV9jbGllbnRfc2VuZF9mdW5jdGlvbl9pbXBsZW1lbnRhdGlvbihvdXQsIHRzZXJ2aWNlLCAqZl9pdGVyLCB0cnVlKTsKKworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgZ2VuZXJhdGVfc3dpZnRfc2VydmljZV9jbGllbnRfcmVjdl9mdW5jdGlvbl9pbXBsZW1lbnRhdGlvbihvdXQsIHRzZXJ2aWNlLCAqZl9pdGVyLCB0cnVlKTsKKyAgICB9CisKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgYXN5bmNfZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpOworICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICBvdXQgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImxldCB0cmFuc3BvcnQgICA9IGZhY3RvcnkubmV3VHJhbnNwb3J0KCkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImxldCBwcm90byA9IFByb3RvY29sKG9uOiB0cmFuc3BvcnQpIiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGw7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImRvIjsKKyAgICBibG9ja19vcGVuKG91dCk7CisKKyAgICBnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2NsaWVudF9zZW5kX2FzeW5jX2Z1bmN0aW9uX2ludm9jYXRpb24ob3V0LCAqZl9pdGVyKTsKKworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IGNhdGNoIGxldCBlcnJvciB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiY29tcGxldGlvbiguZXJyb3IoZXJyb3IpKSIgPDwgZW5kbDsKKyAgICBibG9ja19jbG9zZShvdXQpOworCisgICAgb3V0IDw8IGVuZGw7CisKKyAgICBib29sIHJldF9pc192b2lkID0gKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCk7CisgICAgYm9vbCBpc19vbmV3YXkgPSAoKmZfaXRlciktPmlzX29uZXdheSgpOworCisgICAgc3RyaW5nIGVycm9yX2NvbXBsZXRpb25fY2FsbCA9ICJjb21wbGV0aW9uKC5lcnJvcihlcnJvcikpIjsKKyAgICBpbmRlbnQob3V0KSA8PCAidHJhbnNwb3J0LmZsdXNoIjsKKyAgICBibG9ja19vcGVuKG91dCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIodHJhbnMsIGVycm9yKSBpbiIgPDwgZW5kbCA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgbGV0IGVycm9yID0gZXJyb3IiOworICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgZXJyb3JfY29tcGxldGlvbl9jYWxsIDw8IGVuZGw7CisgICAgYmxvY2tfY2xvc2Uob3V0KTsKKworICAgIGlmICghaXNfb25ld2F5KSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImRvIjsKKyAgICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICAgIGluZGVudChvdXQpOworICAgICAgaWYgKCFyZXRfaXNfdm9pZCkgeworICAgICAgICBvdXQgPDwgImxldCByZXN1bHQgPSAiOworICAgICAgfQorICAgICAgb3V0IDw8ICJ0cnkgc2VsZi5yZWN2XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIob246IHByb3RvKSIgPDwgZW5kbDsKKworICAgICAgb3V0IDw8IGluZGVudCgpIDw8IChyZXRfaXNfdm9pZCA/ICJjb21wbGV0aW9uKC5zdWNjZXNzKFZvaWQoKSkpIiA6ICJjb21wbGV0aW9uKC5zdWNjZXNzKHJlc3VsdCkpIikgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0gY2F0Y2ggbGV0IGVycm9yIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCBlcnJvcl9jb21wbGV0aW9uX2NhbGwgPDwgZW5kbDsKKworICAgICAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJjb21wbGV0aW9uKC5zdWNjZXNzKFZvaWQoKSkpIiA8PCBlbmRsOworICAgIH0KKyAgICBibG9ja19jbG9zZShvdXQpOworICAgIGJsb2NrX2Nsb3NlKG91dCk7CisKKyAgfQorICBibG9ja19jbG9zZShvdXQpOworICBvdXQgPDwgZW5kbDsKK30KKwordm9pZCB0X3N3aWZ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfb2xkX3N3aWZ0X3NlcnZpY2VfY2xpZW50X2FzeW5jX2ltcGxlbWVudGF0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisKKyAgc3RyaW5nIG5hbWUgPSB0c2VydmljZS0+Z2V0X25hbWUoKSArICJBc3luY0NsaWVudCI7CisgIHN0cmluZyBwcm90b2NvbF9uYW1lID0gdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiQXN5bmMiOworCisgIGluZGVudChvdXQpIDw8ICJleHRlbnNpb24gIiA8PCBuYW1lIDw8ICIgOiAiIDw8IHByb3RvY29sX25hbWU7CisgIGJsb2NrX29wZW4ob3V0KTsKKyAgb3V0IDw8IGVuZGw7CisKKyAgLy8gZ2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisKKyAgICBnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2NsaWVudF9zZW5kX2Z1bmN0aW9uX2ltcGxlbWVudGF0aW9uKG91dCwgdHNlcnZpY2UsICpmX2l0ZXIsIHRydWUpOworCisgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2NsaWVudF9yZWN2X2Z1bmN0aW9uX2ltcGxlbWVudGF0aW9uKG91dCwgdHNlcnZpY2UsICpmX2l0ZXIsIHRydWUpOworICAgIH0KKworICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCBhc3luY19mdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcik7CisgICAgYmxvY2tfb3BlbihvdXQpOworICAgIG91dCA8PCBlbmRsOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJsZXQgX190cmFuc3BvcnQgPSBfX3RyYW5zcG9ydEZhY3RvcnkubmV3VHJhbnNwb3J0KCkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImxldCBfX3Byb3RvY29sID0gX19wcm90b2NvbEZhY3RvcnkubmV3UHJvdG9jb2xPblRyYW5zcG9ydChfX3RyYW5zcG9ydCkiIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbDsKKworICAgIGdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfY2xpZW50X3NlbmRfYXN5bmNfZnVuY3Rpb25faW52b2NhdGlvbihvdXQsICpmX2l0ZXIpOworICAgIG91dCA8PCBlbmRsOworCisgICAgaW5kZW50KG91dCkgPDwgIl9fdHJhbnNwb3J0LmZsdXNoV2l0aENvbXBsZXRpb24oIjsKKworICAgIGlmICgoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBvdXQgPDwgInN1Y2Nlc3MsIGZhaWx1cmU6IGZhaWx1cmUpIiA8PCBlbmRsOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJkbyI7CisgICAgICBibG9ja19vcGVuKG91dCk7CisKKyAgICAgIGluZGVudChvdXQpOworICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBvdXQgPDwgImxldCByZXN1bHQgPSAiOworICAgICAgfQorICAgICAgb3V0IDw8ICJ0cnkgc2VsZi5yZWN2XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoX19wcm90b2NvbCkiIDw8IGVuZGw7CisKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAic3VjY2VzcygiOworICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBvdXQgPDwgInJlc3VsdCI7CisgICAgICB9CisgICAgICBvdXQgPDwgIikiIDw8IGVuZGw7CisKKyAgICAgIGJsb2NrX2Nsb3NlKG91dCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAiY2F0Y2ggbGV0IGVycm9yIjsKKyAgICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJmYWlsdXJlKGVycm9yIGFzIE5TRXJyb3IpIiA8PCBlbmRsOworICAgICAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgICAgIGJsb2NrX2Nsb3NlKG91dCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAiLCBmYWlsdXJlOiBmYWlsdXJlKSIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBibG9ja19jbG9zZShvdXQpOworICAgIG91dCA8PCBlbmRsOworCisgICAgLy8gUHJvbWlzZSBmdW5jdGlvbgorICAgIGlmIChwcm9taXNlX2tpdF8pIHsKKworICAgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHByb21pc2VfZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpOworICAgICAgYmxvY2tfb3BlbihvdXQpOworCisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImxldCAoX19wcm9taXNlLCBfX2Z1bGZpbGwsIF9fcmVqZWN0KSA9IFByb21pc2U8IiA8PCB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpKSA8PCAiPi5wZW5kaW5nUHJvbWlzZSgpIiA8PCBlbmRsIDw8IGVuZGwKKyAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAibGV0IF9fdHJhbnNwb3J0ID0gX190cmFuc3BvcnRGYWN0b3J5Lm5ld1RyYW5zcG9ydCgpIiA8PCBlbmRsCisgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImxldCBfX3Byb3RvY29sID0gX19wcm90b2NvbEZhY3RvcnkubmV3UHJvdG9jb2xPblRyYW5zcG9ydChfX3RyYW5zcG9ydCkiIDw8IGVuZGwKKyAgICAgICAgICA8PCBlbmRsOworCisgICAgICBnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2NsaWVudF9zZW5kX2FzeW5jX2Z1bmN0aW9uX2ludm9jYXRpb24ob3V0LCAqZl9pdGVyKTsKKyAgICAgIG91dCA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIl9fdHJhbnNwb3J0LmZsdXNoV2l0aENvbXBsZXRpb24oIjsKKworICAgICAgaWYgKCgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgICAgb3V0IDw8ICJ7IF9fZnVsZmlsbCgpIH0sIGZhaWx1cmU6IHsgX19yZWplY3QoJDApIH0pIiA8PCBlbmRsOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgImRvIjsKKyAgICAgICAgYmxvY2tfb3BlbihvdXQpOworCisgICAgICAgIGluZGVudChvdXQpOworICAgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgICAgb3V0IDw8ICJsZXQgcmVzdWx0ID0gIjsKKyAgICAgICAgfQorICAgICAgICBvdXQgPDwgInRyeSBzZWxmLnJlY3ZfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIihfX3Byb3RvY29sKSIgPDwgZW5kbDsKKworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIl9fZnVsZmlsbCgiOworICAgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgICAgb3V0IDw8ICJyZXN1bHQiOworICAgICAgICB9CisgICAgICAgIG91dCA8PCAiKSIgPDwgZW5kbDsKKworICAgICAgICBibG9ja19jbG9zZShvdXQpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAiY2F0Y2ggbGV0IGVycm9yIjsKKyAgICAgICAgYmxvY2tfb3BlbihvdXQpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAiX19yZWplY3QoZXJyb3IpIiA8PCBlbmRsOworICAgICAgICBibG9ja19jbG9zZShvdXQpOworICAgICAgICBibG9ja19jbG9zZShvdXQpOworCisgICAgICAgIGluZGVudChvdXQpIDw8ICIsIGZhaWx1cmU6IHsgZXJyb3IgaW4gIiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIl9fcmVqZWN0KGVycm9yKSIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIn0pIiA8PCBlbmRsOworICAgICAgfQorCisgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIF9fcHJvbWlzZSIgPDwgZW5kbDsKKyAgICAgIGJsb2NrX2Nsb3NlKG91dCk7CisgICAgICBvdXQgPDwgZW5kbDsKKworICAgIH0KKworICB9CisgIGJsb2NrX2Nsb3NlKG91dCk7CisgIG91dCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2Ugc2VydmVyIGltcGxlbWVudGF0aW9uLgorICoKKyAqIEltcGxlbWVudGVkIGJ5IGdlbmVyYXRpbmcgYSBibG9jayBmb3IgZWFjaCBzZXJ2aWNlIGZ1bmN0aW9uIHRoYXQKKyAqIGhhbmRsZXMgdGhlIHByb2Nlc3Npbmcgb2YgdGhhdCBmdW5jdGlvbi4gVGhlIGJsb2NrcyBhcmUgc3RvcmVkIGluCisgKiBhIG1hcCBhbmQgbG9va2VkIHVwIHZpYSBmdW5jdGlvbi9tZXNzYWdlIG5hbWUuCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGFuIGltcGxlbWVudGF0aW9uIGZvcgorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX3NlcnZlcl9pbXBsZW1lbnRhdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisKKyAgc3RyaW5nIG5hbWUgPSB0c2VydmljZS0+Z2V0X25hbWUoKSArICJQcm9jZXNzb3IiOworCisgIGluZGVudChvdXQpIDw8ICJleHRlbnNpb24gIiA8PCBuYW1lIDw8ICIgOiBUUHJvY2Vzc29yIjsKKyAgYmxvY2tfb3BlbihvdXQpOworICBvdXQgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInN0YXRpYyBsZXQgcHJvY2Vzc29ySGFuZGxlcnMiIDw8IChnZW5fY29jb2FfID8gIiAiIDogIiIpIDw8ICI6IFByb2Nlc3NvckhhbmRsZXJEaWN0aW9uYXJ5ID0iOworICBibG9ja19vcGVuKG91dCk7CisKKyAgb3V0IDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAidmFyIHByb2Nlc3NvckhhbmRsZXJzID0gUHJvY2Vzc29ySGFuZGxlckRpY3Rpb25hcnkoKSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIGdlbmVyYXRlIG1ldGhvZCBtYXAgZm9yIHJvdXRpbmcgaW5jb21pbmcgY2FsbHMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisKKyAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24gPSAqZl9pdGVyOworCisgICAgc3RyaW5nIGFyZ3NfdHlwZSA9IGZ1bmN0aW9uX2FyZ3NfaGVscGVyX3N0cnVjdF90eXBlKHRzZXJ2aWNlLCAqZl9pdGVyKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHJvY2Vzc29ySGFuZGxlcnNbXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCJdID0geyBzZXF1ZW5jZUlELCBpblByb3RvY29sLCBvdXRQcm90b2NvbCwgaGFuZGxlciBpbiIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsOworCisgICAgaW5kZW50X3VwKCk7CisgICAgaWYgKCFnZW5fY29jb2FfKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImxldCBhcmdzID0gdHJ5ICIgPDwgYXJnc190eXBlIDw8ICIucmVhZChmcm9tOiBpblByb3RvY29sKSIgPDwgZW5kbAorICAgICAgICAgIDw8IGVuZGwKKyAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAidHJ5IGluUHJvdG9jb2wucmVhZE1lc3NhZ2VFbmQoKSIgPDwgZW5kbAorICAgICAgICAgIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAibGV0IGFyZ3MgPSB0cnkgIiA8PCBhcmdzX3R5cGUgPDwgIi5yZWFkVmFsdWVGcm9tUHJvdG9jb2woaW5Qcm90b2NvbCkiIDw8IGVuZGwKKyAgICAgICAgICA8PCBlbmRsCisgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInRyeSBpblByb3RvY29sLnJlYWRNZXNzYWdlRW5kKCkiIDw8IGVuZGwKKyAgICAgICAgICA8PCBlbmRsOworICAgIH0KKworICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSApIHsKKyAgICAgIHN0cmluZyByZXN1bHRfdHlwZSA9IGZ1bmN0aW9uX3Jlc3VsdF9oZWxwZXJfc3RydWN0X3R5cGUodHNlcnZpY2UsIHRmdW5jdGlvbik7CisgICAgICBpbmRlbnQob3V0KSA8PCAidmFyIHJlc3VsdCA9ICIgPDwgcmVzdWx0X3R5cGUgPDwgIigpIiA8PCBlbmRsOworCisgICAgICBpbmRlbnQob3V0KSA8PCAiZG8iOworICAgICAgYmxvY2tfb3BlbihvdXQpOworCisgICAgICBpbmRlbnQob3V0KTsKKyAgICAgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgb3V0IDw8ICJyZXN1bHQuc3VjY2VzcyA9ICI7CisgICAgICB9CisgICAgICBvdXQgPDwgInRyeSBoYW5kbGVyLiIgPDwgKGdlbl9jb2NvYV8gPyBmdW5jdGlvbl9uYW1lKHRmdW5jdGlvbikgOiB0ZnVuY3Rpb24tPmdldF9uYW1lKCkpIDw8ICIoIjsKKworICAgICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisgICAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOykgeworICAgICAgICBzdHJpbmcgZmllbGROYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgICBpZiAoIWdlbl9jb2NvYV8gfHwgZl9pdGVyICE9IGZpZWxkcy5iZWdpbigpKSB7CisgICAgICAgICAgb3V0IDw8IGZpZWxkTmFtZSA8PCAiOiAiOworICAgICAgICB9CisKKyAgICAgICAgb3V0IDw8ICJhcmdzLiIgPDwgZmllbGROYW1lOworICAgICAgICBpZiAoKytmX2l0ZXIgIT0gZmllbGRzLmVuZCgpKSB7CisgICAgICAgICAgb3V0IDw8ICIsICI7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgb3V0IDw8ICIpIiA8PCBlbmRsOworICAgICAgYmxvY2tfY2xvc2Uob3V0KTsKKworICAgICAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgICAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiB4ZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7CisgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisKKyAgICAgIGlmICghZ2VuX2NvY29hXykgeworICAgICAgICBmb3IgKHhfaXRlciA9IHhmaWVsZHMuYmVnaW4oKTsgeF9pdGVyICE9IHhmaWVsZHMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgImNhdGNoIGxldCBlcnJvciBhcyAiOworCisgICAgICAgICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfcHJvZ3JhbSgpOworICAgICAgICAgIGlmICgoKnhfaXRlciktPmdldF90eXBlKCktPmdldF9uYW1lKCkgPT0gIkVycm9yIiAmJiBuYW1lc3BhY2VkXyAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7CisgICAgICAgICAgICBvdXQgPDwgZ2V0X3JlYWxfc3dpZnRfbW9kdWxlKHByb2dyYW0pIDw8ICIuIjsKKyAgICAgICAgICB9CisgICAgICAgICAgb3V0IDw8ICgqeF9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X25hbWUoKTsKKworICAgICAgICAgIG91dCA8PCAiIHsgcmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSBlcnJvciB9IiA8PCBlbmRsOworICAgICAgICB9CisKKyAgICAgICAgaW5kZW50KG91dCkgPDwgImNhdGNoIGxldCBlcnJvciB7IHRocm93IGVycm9yIH0iIDw8IGVuZGw7CisgICAgICAgIG91dCA8PCBlbmRsOworCisgICAgICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidHJ5IG91dFByb3RvY29sLndyaXRlTWVzc2FnZUJlZ2luKG5hbWU6IFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIlwiLCB0eXBlOiAucmVwbHksIHNlcXVlbmNlSUQ6IHNlcXVlbmNlSUQpIiA8PCBlbmRsCisgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ0cnkgcmVzdWx0LndyaXRlKHRvOiBvdXRQcm90b2NvbCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInRyeSBvdXRQcm90b2NvbC53cml0ZU1lc3NhZ2VFbmQoKSIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yICh4X2l0ZXIgPSB4ZmllbGRzLmJlZ2luKCk7IHhfaXRlciAhPSB4ZmllbGRzLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgICAgIGluZGVudChvdXQpIDw8ICJjYXRjaCBsZXQgZXJyb3IgYXMgIiA8PCAoKnhfaXRlciktPmdldF90eXBlKCktPmdldF9uYW1lKCk7CisgICAgICAgICAgYmxvY2tfb3BlbihvdXQpOworICAgICAgICAgIGluZGVudChvdXQpIDw8ICJyZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IGVycm9yIiA8PCBlbmRsOworICAgICAgICAgIGJsb2NrX2Nsb3NlKG91dCk7CisgICAgICAgIH0KKworICAgICAgICBpbmRlbnQob3V0KSA8PCAiY2F0Y2ggbGV0IGVycm9yIjsKKyAgICAgICAgYmxvY2tfb3BlbihvdXQpOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRocm93IGVycm9yIiA8PCBlbmRsOworICAgICAgICBibG9ja19jbG9zZShvdXQpOworCisgICAgICAgIG91dCA8PCBlbmRsOworCisgICAgICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidHJ5IG91dFByb3RvY29sLndyaXRlTWVzc2FnZUJlZ2luV2l0aE5hbWUoXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCIsIHR5cGU6IC5SRVBMWSwgc2VxdWVuY2VJRDogc2VxdWVuY2VJRCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInRyeSAiIDw8IHJlc3VsdF90eXBlIDw8ICIud3JpdGVWYWx1ZShyZXN1bHQsIHRvUHJvdG9jb2w6IG91dFByb3RvY29sKSIgPDwgZW5kbAorICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAidHJ5IG91dFByb3RvY29sLndyaXRlTWVzc2FnZUVuZCgpIiA8PCBlbmRsOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGJsb2NrX2Nsb3NlKG91dCk7CisKKyAgfQorCisgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gcHJvY2Vzc29ySGFuZGxlcnMiIDw8IGVuZGw7CisKKyAgYmxvY2tfY2xvc2Uob3V0LGZhbHNlKTsKKyAgb3V0IDw8ICIoKSIgPDwgZW5kbDsKKyAgb3V0IDw8IGVuZGw7CisKKyAgaWYgKCFnZW5fY29jb2FfKSB7CisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jIHByb2Nlc3Mob24gaW5Qcm90b2NvbDogVFByb3RvY29sLCBvdXRQcm90b2NvbDogVFByb3RvY29sKSB0aHJvd3MiOworICB9IGVsc2UgeworICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuYyBwcm9jZXNzT25JbnB1dFByb3RvY29sKGluUHJvdG9jb2w6IFRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wgb3V0UHJvdG9jb2w6IFRQcm90b2NvbCkgdGhyb3dzIjsKKyAgfQorICBibG9ja19vcGVuKG91dCk7CisKKyAgb3V0IDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAibGV0IChtZXNzYWdlTmFtZSwgXywgc2VxdWVuY2VJRCkgPSB0cnkgaW5Qcm90b2NvbC5yZWFkTWVzc2FnZUJlZ2luKCkiIDw8IGVuZGwKKyAgICAgIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICJpZiBsZXQgcHJvY2Vzc29ySGFuZGxlciA9ICIgPDwgbmFtZSA8PCAiLnByb2Nlc3NvckhhbmRsZXJzW21lc3NhZ2VOYW1lXSI7CisgIGJsb2NrX29wZW4ob3V0KTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJkbyI7CisgIGJsb2NrX29wZW4ob3V0KTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ0cnkgcHJvY2Vzc29ySGFuZGxlcihzZXF1ZW5jZUlELCBpblByb3RvY29sLCBvdXRQcm90b2NvbCwgc2VydmljZSkiIDw8IGVuZGw7CisgIGJsb2NrX2Nsb3NlKG91dCk7CisgIGlmICghZ2VuX2NvY29hXykgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiY2F0Y2ggbGV0IGVycm9yIGFzIFRBcHBsaWNhdGlvbkVycm9yIjsKKyAgICBibG9ja19vcGVuKG91dCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0cnkgb3V0UHJvdG9jb2wud3JpdGVFeGNlcHRpb24obWVzc2FnZU5hbWU6IG1lc3NhZ2VOYW1lLCBzZXF1ZW5jZUlEOiBzZXF1ZW5jZUlELCBleDogZXJyb3IpIiA8PCBlbmRsOworICAgIGJsb2NrX2Nsb3NlKG91dCk7CisgICAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImVsc2UiOworICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRyeSBpblByb3RvY29sLnNraXAodHlwZTogLnN0cnVjdCkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInRyeSBpblByb3RvY29sLnJlYWRNZXNzYWdlRW5kKCkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImxldCBleCA9IFRBcHBsaWNhdGlvbkVycm9yKGVycm9yOiAudW5rbm93bk1ldGhvZChtZXRob2ROYW1lOiBtZXNzYWdlTmFtZSkpIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ0cnkgb3V0UHJvdG9jb2wud3JpdGVFeGNlcHRpb24obWVzc2FnZU5hbWU6IG1lc3NhZ2VOYW1lLCAiCisgICAgICAgIDw8ICJzZXF1ZW5jZUlEOiBzZXF1ZW5jZUlELCBleDogZXgpIiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiY2F0Y2ggbGV0IGVycm9yIGFzIE5TRXJyb3IiOworICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRyeSBvdXRQcm90b2NvbC53cml0ZUV4Y2VwdGlvbkZvck1lc3NhZ2VOYW1lKG1lc3NhZ2VOYW1lLCBzZXF1ZW5jZUlEOiBzZXF1ZW5jZUlELCBleDogZXJyb3IpIiA8PCBlbmRsOworICAgIGJsb2NrX2Nsb3NlKG91dCk7CisgICAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImVsc2UiOworICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRyeSBpblByb3RvY29sLnNraXBUeXBlKC5TVFJVQ1QpIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ0cnkgaW5Qcm90b2NvbC5yZWFkTWVzc2FnZUVuZCgpIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ0cnkgb3V0UHJvdG9jb2wud3JpdGVFeGNlcHRpb25Gb3JNZXNzYWdlTmFtZShtZXNzYWdlTmFtZSwiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJzZXF1ZW5jZUlEOiBzZXF1ZW5jZUlELCIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZXg6IE5TRXJyb3IoIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZG9tYWluOiBUQXBwbGljYXRpb25FcnJvckRvbWFpbiwgIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJjb2RlOiBJbnQoVEFwcGxpY2F0aW9uRXJyb3IuVW5rbm93bk1ldGhvZC5yYXdWYWx1ZSksICIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAidXNlckluZm86IFtUQXBwbGljYXRpb25FcnJvck1ldGhvZEtleTogbWVzc2FnZU5hbWVdKSkiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogUmV0dXJucyBhbiBTd2lmdCBuYW1lCisgKgorICogQHBhcmFtIHR0eXBlIFRoZSB0eXBlCisgKiBAcGFyYW0gY2xhc3NfcmVmIERvIHdlIHdhbnQgYSBDbGFzcyByZWZlcmVuY2UgaXN0ZWFkIG9mIGEgdHlwZSByZWZlcmVuY2U/CisgKiBAcmV0dXJuIFN3aWZ0IHR5cGUgbmFtZSwgaS5lLiBEaWN0aW9uYXJ5PEtleSxWYWx1ZT4KKyAqLworc3RyaW5nIHRfc3dpZnRfZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBpc19vcHRpb25hbCwgYm9vbCBpc19mb3JjZWQpIHsKKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworCisgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICByZXN1bHQgKz0gYmFzZV90eXBlX25hbWUoKHRfYmFzZV90eXBlKil0dHlwZSk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgdF9tYXAgKm1hcCA9ICh0X21hcCAqKXR0eXBlOworICAgIHJlc3VsdCArPSAiVE1hcDwiICsgdHlwZV9uYW1lKG1hcC0+Z2V0X2tleV90eXBlKCkpICsgIiwgIiArIHR5cGVfbmFtZShtYXAtPmdldF92YWxfdHlwZSgpKSArICI+IjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3NldCAqc2V0ID0gKHRfc2V0ICopdHR5cGU7CisgICAgcmVzdWx0ICs9ICJUU2V0PCIgKyB0eXBlX25hbWUoc2V0LT5nZXRfZWxlbV90eXBlKCkpICsgIj4iOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICB0X2xpc3QgKmxpc3QgPSAodF9saXN0ICopdHR5cGU7CisgICAgcmVzdWx0ICs9ICJUTGlzdDwiICsgdHlwZV9uYW1lKGxpc3QtPmdldF9lbGVtX3R5cGUoKSkgKyAiPiI7CisgIH0KKyAgZWxzZSB7CisgICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHR5cGUtPmdldF9wcm9ncmFtKCk7CisgICAgaWYgKG5hbWVzcGFjZWRfICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pIHsKKyAgICAgIHJlc3VsdCArPSBnZXRfcmVhbF9zd2lmdF9tb2R1bGUocHJvZ3JhbSkgKyAiLiI7CisgICAgfQorICAgIHJlc3VsdCArPSB0dHlwZS0+Z2V0X25hbWUoKTsKKyAgfQorCisgIGlmIChpc19vcHRpb25hbCkgeworICAgIHJlc3VsdCArPSAiPyI7CisgIH0KKyAgaWYgKGlzX2ZvcmNlZCkgeworICAgIHJlc3VsdCArPSAiISI7CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIFJldHVybnMgdGhlIFN3aWZ0IHR5cGUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgdGhyaWZ0IHR5cGUuCisgKgorICogQHBhcmFtIHRiYXNlIFRoZSBiYXNlIHR5cGUKKyAqLworc3RyaW5nIHRfc3dpZnRfZ2VuZXJhdG9yOjpiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZSogdHlwZSkgeworICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gdHlwZS0+Z2V0X2Jhc2UoKTsKKworICBzd2l0Y2ggKHRiYXNlKSB7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICByZXR1cm4gIlZvaWQiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgIHJldHVybiBnZW5fY29jb2FfID8gIlRCaW5hcnkiIDogIkRhdGEiOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gIlN0cmluZyI7CisgICAgfQorICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgcmV0dXJuICJCb29sIjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICByZXR1cm4gIkludDgiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICByZXR1cm4gIkludDE2IjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgcmV0dXJuICJJbnQzMiI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgIHJldHVybiAiSW50NjQiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICByZXR1cm4gIkRvdWJsZSI7CisgIGRlZmF1bHQ6CisgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBTd2lmdCBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgIH0KK30KKworLyoqCisgKiBSZW5kZXJzIGZ1bGwgY29uc3RhbnQgdmFsdWUgKGFzIHdvdWxkIGJlIHNlZW4gYWZ0ZXIgYW4gJz0nKQorICoKKyAqLwordm9pZCB0X3N3aWZ0X2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIG91dCA8PCAiXCIiIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgIlwiIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIG91dCA8PCAoKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICBvdXQgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIoIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiKSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIG91dCA8PCB0eXBlX25hbWUodHlwZSkgPDwgIigiOworICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKKyAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7CisgICAgICB9CisgICAgICBvdXQgPDwgIikiOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBvdXQgPDwgKGdlbl9jb2NvYV8gPyB2YWx1ZS0+Z2V0X2lkZW50aWZpZXIoKSA6IGVudW1fY29uc3RfbmFtZSh2YWx1ZS0+Z2V0X2lkZW50aWZpZXIoKSkpOyAvLyBTd2lmdDIvQ29jb2EgY29tcGF0aWJpbGl0eQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKworICAgIG91dCA8PCB0eXBlX25hbWUodHlwZSkgPDwgIigiOworCisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7KSB7CisgICAgICB0X2ZpZWxkKiB0ZmllbGQgPSAqZl9pdGVyOworICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUgPSBOVUxMOworICAgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgICAgaWYgKHRmaWVsZC0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKKyAgICAgICAgICB2YWx1ZSA9IHZfaXRlci0+c2Vjb25kOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmICh2YWx1ZSkgeworICAgICAgICBvdXQgPDwgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICI6ICI7CisgICAgICAgIHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIHRmaWVsZC0+Z2V0X3R5cGUoKSwgdmFsdWUpOworICAgICAgfQorICAgICAgZWxzZSBpZiAoIWZpZWxkX2lzX29wdGlvbmFsKHRmaWVsZCkpIHsKKyAgICAgICAgdGhyb3cgImNvbnN0YW50IGVycm9yOiByZXF1aXJlZCBmaWVsZCAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIuIiArIHRmaWVsZC0+Z2V0X25hbWUoKSArICIgaGFzIG5vIHZhbHVlIjsKKyAgICAgIH0KKworICAgICAgaWYgKCsrZl9pdGVyICE9IGZpZWxkcy5lbmQoKSkgeworICAgICAgICBvdXQgPDwgIiwgIjsKKyAgICAgIH0KKyAgICB9CisKKyAgICBvdXQgPDwgIikiOworCisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKworICAgIG91dCA8PCAiWyI7CisKKyAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworCisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTspIHsKKworICAgICAgcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwga3R5cGUsIHZfaXRlci0+Zmlyc3QpOworICAgICAgb3V0IDw8ICI6ICI7CisgICAgICByZW5kZXJfY29uc3RfdmFsdWUob3V0LCB2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOworCisgICAgICBpZiAoKyt2X2l0ZXIgIT0gdmFsLmVuZCgpKSB7CisgICAgICAgIG91dCA8PCAiLCAiOworICAgICAgfQorICAgIH0KKworICAgIG91dCA8PCAiXSI7CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKworICAgIG91dCA8PCAiWyI7CisKKyAgICB0X3R5cGUqIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworCisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTspIHsKKworICAgICAgcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgZXR5cGUsIHZfaXRlci0+Zmlyc3QpOworCisgICAgICBpZiAoKyt2X2l0ZXIgIT0gdmFsLmVuZCgpKSB7CisgICAgICAgIG91dCA8PCAiLCAiOworICAgICAgfQorICAgIH0KKworICAgIG91dCA8PCAiXSI7CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworCisgICAgb3V0IDw8ICJbIjsKKworICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworCisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7KSB7CisKKyAgICAgIHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIGV0eXBlLCB2X2l0ZXItPmZpcnN0KTsKKworICAgICAgaWYgKCsrdl9pdGVyICE9IHZhbC5lbmQoKSkgeworICAgICAgICBvdXQgPDwgIiwgIjsKKyAgICAgIH0KKyAgICB9CisKKyAgICBvdXQgPDwgIl0iOworCisgIH0gZWxzZSB7CisgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiB0eXBlICIgKyB0eXBlLT5nZXRfbmFtZSgpOworICB9CisKK30KKworLyoqCisgKiBEZWNsYXJlcyBhbiBTd2lmdCBwcm9wZXJ0eS4KKyAqCisgKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCB0byBkZWNsYXJlIGEgcHJvcGVydHkgZm9yCisgKi8KK3N0cmluZyB0X3N3aWZ0X2dlbmVyYXRvcjo6ZGVjbGFyZV9wcm9wZXJ0eSh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaXNfcHJpdmF0ZSkgeworCisgIHN0cmluZyB2aXNpYmlsaXR5ID0gaXNfcHJpdmF0ZSA/IChnZW5fY29jb2FfID8gInByaXZhdGUiIDogImZpbGVwcml2YXRlIikgOiAicHVibGljIjsKKworICBvc3RyaW5nc3RyZWFtIHJlbmRlcjsKKworICByZW5kZXIgPDwgdmlzaWJpbGl0eSA8PCAiIHZhciAiIDw8IG1heWJlX2VzY2FwZV9pZGVudGlmaWVyKHRmaWVsZC0+Z2V0X25hbWUoKSk7CisKKyAgaWYgKGZpZWxkX2lzX29wdGlvbmFsKHRmaWVsZCkpIHsKKyAgICByZW5kZXIgPDwgKGdlbl9jb2NvYV8gPyAiICIgOiAiIikgPDwgIjogIiA8PCB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpLCB0cnVlKTsKKyAgfQorICBlbHNlIHsKKyAgICBpZiAoIWdlbl9jb2NvYV8pIHsKKyAgICAgIHJlbmRlciA8PCAiOiAiIDw8IHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCksIGZhbHNlKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gU3dpZnQyL0NvY29hIGJhY2t3YXJkIGNvbXBhdCwgQmFkLCBkZWZhdWx0IGluaXQKKyAgICAgIHJlbmRlciA8PCAiID0gIiA8PCB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpLCBmYWxzZSkgPDwgIigpIjsKKyAgICB9CisgIH0KKworICByZXR1cm4gcmVuZGVyLnN0cigpOworfQorCisvKioKKyAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUKKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KKyAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KKyAqLworc3RyaW5nIHRfc3dpZnRfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisKKyAgc3RyaW5nIHJlc3VsdCA9ICJmdW5jICIgKyAoZ2VuX2NvY29hXyA/IGZ1bmN0aW9uX25hbWUodGZ1bmN0aW9uKSA6IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSk7CisKKyAgcmVzdWx0ICs9ICIoIiArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLCAiIiwgZmFsc2UpICsgIikgdGhyb3dzIjsgLy8vIGFyZ3NyZXZpZXcKKworICB0X3R5cGUqIHR0eXBlID0gdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpOworICBpZiAoIXR0eXBlLT5pc192b2lkKCkpIHsKKyAgICByZXN1bHQgKz0gIiAtPiAiICsgdHlwZV9uYW1lKHR0eXBlKTsKKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZ1bmN0aW9uIGRvY3N0cmluZworICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgorICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpmdW5jdGlvbl9kb2NzdHJpbmcob3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKworICAgIC8vIEdlbmVyYXRlIGRvY3N0cmluZyB3aXRoIGZvbGxvd2luZyBmb3JtYXQ6CisgICAgLy8gLy8vIDxEZXNjcmlwdGlvbj4KKyAgICAvLyAvLy8gPGVtcHR5IGxpbmU+CisgICAgLy8gLy8vIC0gUGFyYW1ldGVyczoKKyAgICAvLyAvLy8gICAtIDxwYXJhbWV0ZXI+OiA8cGFyYW1ldGVyIGRvY3N0cmluZz4KKyAgICAvLyAvLy8gLSBSZXR1cm5zOiA8cmV0dXJuIHR5cGU+IChUaHJpZnQgaGFzIG5vIGRvY3N0cmluZyBvbiByZXR1cm4gdmFsKQorICAgIC8vIC8vLyAtIFRocm93czogPGV4Y2VwdGlvbiB0eXBlcz4KKworICAgIC8vIERlc2NyaXB0aW9uCisgICAgc3RyaW5nIGRvYyA9IHRmdW5jdGlvbi0+Z2V0X2RvYygpOworICAgIGdlbmVyYXRlX2RvY3N0cmluZyhvdXQsIGRvYyk7CisgICAgaW5kZW50KG91dCkgPDwgIi8vLyIgPDwgZW5kbDsKKworICAgIC8vIFBhcmFtZXRlcnMKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICAgIGlmICghZmllbGRzLmVtcHR5KCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICIvLy8gLSBQYXJhbWV0ZXJzOiIgPDwgZW5kbDsKKyAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICIvLy8gICAtICIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI6ICI7CisgICAgICAgIHN0cmluZyBkb2MgPSAoKmZfaXRlciktPmdldF9kb2MoKTsKKyAgICAgICAgaWYgKCFkb2MuZW1wdHkoKSAmJiBkb2NbZG9jLmxlbmd0aCgpLTFdID09ICdcbicpIHsKKyAgICAgICAgICAgIGRvYy5lcmFzZShkb2MubGVuZ3RoKCktMSk7CisgICAgICAgIH0KKyAgICAgICAgb3V0IDw8IGRvYyA8PCBlbmRsOworICAgICAgfQorICAgIH0KKworICAgIC8vIFJldHVybnMKKyAgICB0X3R5cGUqIHR0eXBlID0gdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpOworICAgIGlmICghdHR5cGUtPmlzX3ZvaWQoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIi8vLyAtIFJldHVybnM6ICIgPDwgdHlwZV9uYW1lKHR0eXBlKSA8PCBlbmRsOworICAgIH0KKworICAgIC8vIFRocm93cworICAgIGluZGVudChvdXQpIDw8ICIvLy8gLSBUaHJvd3M6ICI7CisgICAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICBvdXQgPDwgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgICBpZiAoKnhfaXRlciAhPSB4Y2VwdGlvbnMuYmFjaygpKSB7CisgICAgICAgIG91dCA8PCAiLCAiOworICAgICAgfSAgICB9CisgICAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZ1bmN0aW9uIGRvY3N0cmluZworICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgorICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjphc3luY19mdW5jdGlvbl9kb2NzdHJpbmcob3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgICAvLyBHZW5lcmF0ZSBkb2NzdHJpbmcgd2l0aCBmb2xsb3dpbmcgZm9ybWF0OgorICAgIC8vIC8vLyA8RGVzY3JpcHRpb24+CisgICAgLy8gLy8vIDxlbXB0eSBsaW5lPgorICAgIC8vIC8vLyAtIFBhcmFtZXRlcnM6CisgICAgLy8gLy8vICAgLSA8cGFyYW1ldGVyPjogPHBhcmFtZXRlciBkb2NzdHJpbmc+CisgICAgLy8gLy8vICAgLSBjYWxsYmFjazogPGNhbGxiYWNrIHR5cGVzPgorCisgICAgLy8gRGVzY3JpcHRpb24KKyAgICBzdHJpbmcgZG9jID0gdGZ1bmN0aW9uLT5nZXRfZG9jKCk7CisgICAgZ2VuZXJhdGVfZG9jc3RyaW5nKG91dCwgZG9jKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiLy8vIiA8PCBlbmRsOworCisgICAgLy8gUGFyYW1ldGVycworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgICAgaWYgKCFmaWVsZHMuZW1wdHkoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIi8vLyAtIFBhcmFtZXRlcnM6IiA8PCBlbmRsOworICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIi8vLyAgIC0gIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIjogIjsKKyAgICAgICAgc3RyaW5nIGRvYyA9ICgqZl9pdGVyKS0+Z2V0X2RvYygpOworICAgICAgICBpZiAoIWRvYy5lbXB0eSgpICYmIGRvY1tkb2MubGVuZ3RoKCktMV0gPT0gJ1xuJykgeworICAgICAgICAgICAgZG9jLmVyYXNlKGRvYy5sZW5ndGgoKS0xKTsKKyAgICAgICAgfQorICAgICAgICBvdXQgPDwgZG9jIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorCisgICAgLy8gY29tcGxldGlvbgorICAgIGluZGVudChvdXQpIDw8ICIvLy8gICAtIGNvbXBsZXRpb246IFRBc3luY1Jlc3VsdDwiIDw8IHR5cGVfbmFtZSh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpCisgICAgICAgICAgICAgICAgPDwgIj4gd3JhcHBpbmcgcmV0dXJuIGFuZCBmb2xsb3dpbmcgRXhjZXB0aW9uczogIjsKKyAgICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgIG91dCA8PCB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICAgIGlmICgqeF9pdGVyICE9IHhjZXB0aW9ucy5iYWNrKCkpIHsKKyAgICAgICAgb3V0IDw8ICIsICI7CisgICAgICB9CisgICAgfQorICAgIG91dCA8PCBlbmRsOworfQorCisvKioKKyAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgdGhhdCByZXR1cm5zIGFzeW5jaHJvbm91c2x5IHZpYSBibG9ja3MuCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCisgKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCisgKi8KK3N0cmluZyB0X3N3aWZ0X2dlbmVyYXRvcjo6YXN5bmNfZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICB0X3R5cGUqIHR0eXBlID0gdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpOworICB0X3N0cnVjdCogdGFyZ2xpc3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisgIHN0cmluZyByZXN1bHQgPSAiZnVuYyAiICsgKGdlbl9jb2NvYV8gPyBmdW5jdGlvbl9uYW1lKHRmdW5jdGlvbikgOiB0ZnVuY3Rpb24tPmdldF9uYW1lKCkpOworCisgIGlmICghZ2VuX2NvY29hXykgeworICAgIHN0cmluZyByZXNwb25zZV9zdHJpbmcgPSAiKFRBc3luY1Jlc3VsdDwiOworICAgIHJlc3BvbnNlX3N0cmluZyArPSAodHR5cGUtPmlzX3ZvaWQoKSkgPyAiVm9pZCIgOiB0eXBlX25hbWUodHR5cGUpOworICAgIHJlc3BvbnNlX3N0cmluZyArPSAiPikgLT4gVm9pZCI7CisgICAgcmVzdWx0ICs9ICIoIiArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLCAiIiwgZmFsc2UpCisgICAgICAgICAgICArICh0YXJnbGlzdC0+Z2V0X21lbWJlcnMoKS5zaXplKCkgPyAiLCAiIDogIiIpCisgICAgICAgICAgICArICJjb21wbGV0aW9uOiBAZXNjYXBpbmcgIiArIHJlc3BvbnNlX3N0cmluZyArICIpIjsKKyAgfSBlbHNlIHsKKyAgICBzdHJpbmcgcmVzcG9uc2VfcGFyYW0gPSAiKCIgKyAoKHR0eXBlLT5pc192b2lkKCkpID8gIiIgOiB0eXBlX25hbWUodHR5cGUpKSArICIpIC0+IFZvaWQiOworICAgIHJlc3VsdCArPSAiKCIgKyBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSwgIiIsIGZhbHNlKQorICAgICAgICAgICAgKyAodGFyZ2xpc3QtPmdldF9tZW1iZXJzKCkuc2l6ZSgpID8gIiwgIiA6ICIiKQorICAgICAgICAgICAgKyAic3VjY2VzczogIiArIHJlc3BvbnNlX3BhcmFtICsgIiwgIgorICAgICAgICAgICAgKyAiZmFpbHVyZTogKE5TRXJyb3IpIC0+IFZvaWQpIHRocm93cyI7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIHRoYXQgcmV0dXJucyBhc3luY2hyb25vdXNseSB2aWEgcHJvbWlzZXMuCisgKiBPTkxZIEZPUiBTd2lmdDIvQ29jb2EgQkFDS1dBUkRTIENPTVBBVElCSUxJVFkKKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KKyAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KKyAqLworc3RyaW5nIHRfc3dpZnRfZ2VuZXJhdG9yOjpwcm9taXNlX2Z1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgcmV0dXJuICJmdW5jICIgKyBmdW5jdGlvbl9uYW1lKHRmdW5jdGlvbikgKyAiKCIgKyBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSwgIiIsIGZhbHNlKSArICIpIHRocm93cyAiCisgICAgICAgICArICItPiBQcm9taXNlPCIgKyB0eXBlX25hbWUodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKSArICI+IjsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgdmVyYm9zZSBmdW5jdGlvbiBuYW1lIHN1aXRhYmxlIGZvciBhIFN3aWZ0IG1ldGhvZC4gIE9OTFkgRk9SIFN3aWZ0Mi9Db2NvYSBCQUNLV0FSRFMgQ09NUEFUSUJJTElUWQorICovCitzdHJpbmcgdF9zd2lmdF9nZW5lcmF0b3I6OmZ1bmN0aW9uX25hbWUodF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIHN0cmluZyBuYW1lID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpOworICBpZiAoIXRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKS5lbXB0eSgpKSB7CisgICAgc3RyaW5nIGZpcnN0X2FyZyA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKS5mcm9udCgpLT5nZXRfbmFtZSgpOworICAgIGlmIChuYW1lLnNpemUoKSA8IGZpcnN0X2FyZy5zaXplKCkgfHwKKyAgICAgICAgbG93ZXJjYXNlKG5hbWUuc3Vic3RyKG5hbWUuc2l6ZSgpLWZpcnN0X2FyZy5zaXplKCkpKSAhPSBsb3dlcmNhc2UoZmlyc3RfYXJnKSkgeworICAgICAgbmFtZSArPSAiV2l0aCIgKyBjYXBpdGFsaXplKHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKVswXS0+Z2V0X25hbWUoKSk7CisgICAgfQorICB9CisgIHJldHVybiBuYW1lOworfQorCisvKioKKyAqIFJlbmRlcnMgYSBTd2lmdCBtZXRob2QgYXJndW1lbnQgbGlzdAorICovCitzdHJpbmcgdF9zd2lmdF9nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcm90b2NvbF9uYW1lLCBib29sIGlzX2ludGVybmFsKSB7CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKyAgYm9vbCBpbmNsdWRlX3Byb3RvY29sID0gIXByb3RvY29sX25hbWUuZW1wdHkoKTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgaWYgKGluY2x1ZGVfcHJvdG9jb2wpIHsKKyAgICByZXN1bHQgKz0gcHJvdG9jb2xfbmFtZSArICI6IFRQcm90b2NvbCI7CisgICAgaWYgKCFmaWVsZHMuZW1wdHkoKSkgeworICAgICAgcmVzdWx0ICs9ICIsICI7CisgICAgfQorICB9IGVsc2UgaWYgKCFmaWVsZHMuZW1wdHkoKSAmJiBpc19pbnRlcm5hbCAmJiBnZW5fY29jb2FfKSB7CisgICAgLy8gRm9yY2UgZmlyc3QgYXJndW1lbnQgdG8gYmUgbmFtZWQsIFN3aWZ0Mi9Db2NvYSBiYWNrd2FyZHMgY29tcGF0CisgICAgcmVzdWx0ICs9IGZpZWxkcy5mcm9udCgpLT5nZXRfbmFtZSgpICsgIiAiOworICB9CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTspIHsKKyAgICB0X2ZpZWxkKiBhcmcgPSAqZl9pdGVyOworCisgICAgaWYgKCFnZW5fY29jb2FfKSB7CisgICAgICAvLyBvcHRpb25hbCBhcmdzIG5vdCB1c3VhbGx5IHBlcm1pdHRlZCBmb3Igc29tZSByZWFzb24sIGV2ZW4gdGhvdWdoIGR5bmFtaWMgbGFuZ3MgaGFuZGxlIGl0CisgICAgICAvLyB1c2UgYW5ub3RhdGlvbiAic3dpZnQubnVsbGFibGUiIHRvIGFjaGlldmUKKyAgICAgIHJlc3VsdCArPSBhcmctPmdldF9uYW1lKCkgKyAiOiAiICsgdHlwZV9uYW1lKGFyZy0+Z2V0X3R5cGUoKSwgZmllbGRfaXNfb3B0aW9uYWwoYXJnKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdCArPSBhcmctPmdldF9uYW1lKCkgKyAiOiAiICsgdHlwZV9uYW1lKGFyZy0+Z2V0X3R5cGUoKSk7CisgICAgfQorCisgICAgaWYgKCsrZl9pdGVyICE9IGZpZWxkcy5lbmQoKSkgeworICAgICAgcmVzdWx0ICs9ICIsICI7CisgICAgfQorICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogaHR0cHM6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL2xpYnJhcnkvaW9zL2RvY3VtZW50YXRpb24vU3dpZnQvQ29uY2VwdHVhbC9Td2lmdF9Qcm9ncmFtbWluZ19MYW5ndWFnZS9MZXhpY2FsU3RydWN0dXJlLmh0bWwKKyAqCisgKi8KKwordm9pZCB0X3N3aWZ0X2dlbmVyYXRvcjo6cG9wdWxhdGVfcmVzZXJ2ZWRfd29yZHMoKSB7CisgIGlmICghZ2VuX2NvY29hXykgeworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoIl9fQ09MVU1OX18iKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJfX0ZJTEVfXyIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoIl9fRlVOQ1RJT05fXyIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoIl9fTElORV9fIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiQW55Iik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiYXMiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJhc3NvY2lhdGVkdHlwZSIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImFzc29jaWF0aXZpdHkiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJicmVhayIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImNhc2UiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJjYXRjaCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImNsYXNzIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiY29udGludWUiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJjb252ZW5pZW5jZSIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImRlZmF1bHQiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJkZWZlciIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImRlaW5pdCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImRpZFNldCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImRvIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiZHluYW1pYyIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImR5bmFtaWNUeXBlIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiZWxzZSIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImVudW0iKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJleHRlbnNpb24iKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJmYWxsdGhyb3VnaCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImZhbHNlIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiZmlsZXByaXZhdGUiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJmaW5hbCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImZvciIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImZ1bmMiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJnZXQiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJndWFyZCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImlmIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiaW1wb3J0Iik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiaW4iKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJpbmRpcmVjdCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImluZml4Iik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiaW5pdCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImlub3V0Iik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiaW50ZXJuYWwiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJpcyIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImxhenkiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJsZWZ0Iik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgibGV0Iik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgibXV0YXRpbmciKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJuaWwiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJub25lIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgibm9ubXV0YXRpbmciKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJvcGVuIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgib3BlcmF0b3IiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJvcHRpb25hbCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoIm92ZXJyaWRlIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgicG9zdGZpeCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoInByZWNlZGVuY2UiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJwcmVmaXgiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJwcml2YXRlIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgicHJvdG9jb2wiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJQcm90b2NvbCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoInB1YmxpYyIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoInJlcGVhdCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoInJlcXVpcmVkIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgicmV0aHJvd3MiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJyZXR1cm4iKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJyaWdodCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoInNlbGYiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJTZWxmIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgic2V0Iik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgic3RhdGljIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgic3RydWN0Iik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgic3Vic2NyaXB0Iik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgic3VwZXIiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJzd2l0Y2giKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJ0aHJvdyIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoInRocm93cyIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoInRydWUiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJ0cnkiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJUeXBlIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgidHlwZWFsaWFzIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgidW5vd25lZCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoInZhciIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoIndlYWsiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJ3aGVyZSIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoIndoaWxlIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgid2lsbFNldCIpOworICB9IGVsc2UgeworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoIlNlbGYiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJhc3NvY2lhdGVkdHlwZSIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImRlZmVyIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiZGVpbml0Iik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiZHluYW1pY1R5cGUiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJlbnVtIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiZXh0ZW5zaW9uIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiZmFsbHRocm91Z2giKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJmYWxzZSIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImZ1bmMiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJndWFyZCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImluaXQiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJpbm91dCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImludGVybmFsIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgibGV0Iik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgib3BlcmF0b3IiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJwcm90b2NvbCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoInJlcGVhdCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoInJldGhyb3dzIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgic3RydWN0Iik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgic3Vic2NyaXB0Iik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgidGhyb3dzIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgidHJ1ZSIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoInR5cGVhbGlhcyIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoIndoZXJlIik7CisgIH0KK30KKworc3RyaW5nIHRfc3dpZnRfZ2VuZXJhdG9yOjptYXliZV9lc2NhcGVfaWRlbnRpZmllcihjb25zdCBzdHJpbmcmIGlkZW50aWZpZXIpIHsKKyAgaWYgKHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5maW5kKGlkZW50aWZpZXIpICE9IHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5lbmQoKSkgeworICAgIHJldHVybiAiYCIgKyBpZGVudGlmaWVyICsgImAiOworICB9CisgIHJldHVybiBpZGVudGlmaWVyOworfQorCisvKioKKyAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgU3dpZnQgVFR5cGUgZW51bWVyYXRpb24uCisgKi8KK3N0cmluZyB0X3N3aWZ0X2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSwgYm9vbCBxdWFsaWZpZWQpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisKKyAgc3RyaW5nIHJlc3VsdCA9IHF1YWxpZmllZCA/ICJUVHlwZS4iIDogIi4iOworICBpZiAoIWdlbl9jb2NvYV8pIHsKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICJzdHJpbmciOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICJib29sIjsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgImk4IjsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICJpMTYiOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgImkzMiI7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICAgIHJldHVybiByZXN1bHQgKyAiaTY0IjsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICJkb3VibGUiOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICByZXR1cm4gcmVzdWx0ICsgImkzMiI7CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgICByZXR1cm4gcmVzdWx0ICsgInN0cnVjdCI7CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgICAgcmV0dXJuIHJlc3VsdCArICJtYXAiOworICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgIHJldHVybiByZXN1bHQgKyAic2V0IjsKKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgcmV0dXJuIHJlc3VsdCArICJsaXN0IjsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICAgIHJldHVybiByZXN1bHQgKyAiU1RSSU5HIjsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICAgIHJldHVybiByZXN1bHQgKyAiQk9PTCI7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICJCWVRFIjsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICJJMTYiOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgIkkzMiI7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICAgIHJldHVybiByZXN1bHQgKyAiSTY0IjsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICJET1VCTEUiOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICByZXR1cm4gcmVzdWx0ICsgIkkzMiI7CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgICByZXR1cm4gcmVzdWx0ICsgIlNUUlVDVCI7CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgICAgcmV0dXJuIHJlc3VsdCArICJNQVAiOworICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgIHJldHVybiByZXN1bHQgKyAiU0VUIjsKKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgcmV0dXJuIHJlc3VsdCArICJMSVNUIjsKKyAgICB9CisgIH0KKworICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Cit9CisKKworVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUigKKyAgICBzd2lmdCwKKyAgICAiU3dpZnQgMy4wIiwKKyAgICAiICAgIGxvZ191bmV4cGVjdGVkOiAgTG9nIGV2ZXJ5IHRpbWUgYW4gdW5leHBlY3RlZCBmaWVsZCBJRCBvciB0eXBlIGlzIGVuY291bnRlcmVkLlxuIgorICAgICIgICAgZGVidWdfZGVzY3JpcHRpb25zOlxuIgorICAgICIgICAgICAgICAgICAgICAgICAgICBBbGxvdyB1c2Ugb2YgZGVidWdEZXNjcmlwdGlvbiBzbyB0aGUgYXBwIGNhbiBhZGQgZGVzY3JpcHRpb24gdmlhIGEgY2F0ZW9nb3J5L2V4dGVuc2lvblxuIgorICAgICIgICAgYXN5bmNfY2xpZW50czogICBHZW5lcmF0ZSBjbGllbnRzIHdoaWNoIGludm9rZSBhc3luY2hyb25vdXNseSB2aWEgYmxvY2sgc3ludGF4LlxuIgorICAgICIgICAgbmFtZXNwYWNlZDogICAgICBHZW5lcmF0ZSBzb3VyY2UgaW4gTW9kdWxlIHNjb3BlZCBvdXRwdXQgZGlyZWN0b3JpZXMgZm9yIFN3aWZ0IE5hbWVzcGFjaW5nLlxuIgorICAgICIgICAgY29jb2E6ICAgICAgICAgICBHZW5lcmF0ZSBTd2lmdCAyLnggY29kZSBjb21wYXRpYmxlIHdpdGggdGhlIFRocmlmdC9Db2NvYSBsaWJyYXJ5XG4iCisgICAgIiAgICBwcm9taXNlX2tpdDogICAgIEdlbmVyYXRlIGNsaWVudHMgd2hpY2ggaW52b2tlIGFzeW5jaHJvbm91c2x5IHZpYSBwcm9taXNlcyAob25seSB1c2Ugd2l0aCBjb2NvYSBmbGFnKVxuIgorICAgICIgICAgc2FmZV9lbnVtczogICAgICBHZW5lcmF0ZSBlbnVtIHR5cGVzIHdpdGggYW4gdW5rbm93biBjYXNlIHRvIGhhbmRsZSB1bnNwZWNpZmllZCB2YWx1ZXMgcmF0aGVyIHRoYW4gdGhyb3cgYSBzZXJpYWxpemF0aW9uIGVycm9yXG4iKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF94bWxfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF94bWxfZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1ZmVkMTQKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X3htbF9nZW5lcmF0b3IuY2MKQEAgLTAsMCArMSw2OTIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxsaW1pdHM+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHNzdHJlYW0+CisKKyNpbmNsdWRlICJ0aHJpZnQvcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuaCIKKwordXNpbmcgc3RkOjptYXA7Cit1c2luZyBzdGQ6Om9mc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6dmVjdG9yOwordXNpbmcgc3RkOjpzdGFjazsKK3VzaW5nIHN0ZDo6c2V0OworCitzdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOworc3RhdGljIGNvbnN0IHN0cmluZyBxdW90ID0gIlwiIjsKKworc3RhdGljIGNvbnN0IHN0cmluZyBkZWZhdWx0X25zX3ByZWZpeCA9ICJodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcveG1sL25zLyI7CisKKy8qKgorICogVGhpcyBnZW5lcmF0b3IgY3JlYXRlcyBhbiBYTUwgbW9kZWwgb2YgdGhlIHBhcnNlZCBJREwgdHJlZSwgYW5kIGlzIGRlc2lnbmVkCisgKiB0byBtYWtlIGl0IGVhc3kgdG8gdXNlIHRoaXMgZmlsZSBhcyB0aGUgaW5wdXQgZm9yIG90aGVyIHRlbXBsYXRlIGVuZ2luZXMsCisgKiBzdWNoIGFzIFhTTFQuICBUbyB0aGlzIGVuZCwgdGhlIGdlbmVyYXRlZCBYTUwgaXMgc2xpZ2h0bHkgbW9yZSB2ZXJib3NlIHRoYW4KKyAqIHlvdSBtaWdodCBleHBlY3QuLi4gZm9yIGV4YW1wbGUsIHJlZmVyZW5jZXMgdG8gImlkIiB0eXBlcyAoc3VjaCBhcyBzdHJ1Y3RzLAorICogdW5pb25zLCBldGMpIGFsd2F5cyBzcGVjaWZ5IHRoZSBuYW1lIG9mIHRoZSBJREwgZG9jdW1lbnQsIGV2ZW4gaWYgdGhlIHR5cGUKKyAqIGlzIGRlZmluZWQgaW4gdGhlIHNhbWUgZG9jdW1lbnQgYXMgdGhlIHJlZmVyZW5jZS4KKyAqLworY2xhc3MgdF94bWxfZ2VuZXJhdG9yIDogcHVibGljIHRfZ2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgdF94bWxfZ2VuZXJhdG9yKCB0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCisgICAgOiB0X2dlbmVyYXRvcihwcm9ncmFtKSB7CisgICAgKHZvaWQpb3B0aW9uX3N0cmluZzsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworCisgICAgc2hvdWxkX21lcmdlX2luY2x1ZGVzXyA9IGZhbHNlOworICAgIHNob3VsZF91c2VfZGVmYXVsdF9uc18gPSB0cnVlOworICAgIHNob3VsZF91c2VfbmFtZXNwYWNlc18gPSB0cnVlOworICAgIGZvciggaXRlciA9IHBhcnNlZF9vcHRpb25zLmJlZ2luKCk7IGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCk7ICsraXRlcikgeworICAgICAgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoIm1lcmdlIikgPT0gMCkgeworICAgICAgICBzaG91bGRfbWVyZ2VfaW5jbHVkZXNfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgibm9fZGVmYXVsdF9ucyIpID09IDApIHsKKyAgICAgICAgc2hvdWxkX3VzZV9kZWZhdWx0X25zXyA9IGZhbHNlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJub19uYW1lc3BhY2VzIikgPT0gMCkgeworICAgICAgICBzaG91bGRfdXNlX25hbWVzcGFjZXNfID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24geG1sOiIgKyBpdGVyLT5maXJzdDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi14bWwiOworICB9CisKKyAgdmlydHVhbCB+dF94bWxfZ2VuZXJhdG9yKCkge30KKworICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7CisgIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7CisgIHZvaWQgZ2VuZXJhdGVfcHJvZ3JhbSgpOworCisgIHZvaWQgaXRlcmF0ZV9wcm9ncmFtKHRfcHJvZ3JhbSogcHJvZ3JhbSk7CisgIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pOworICB2b2lkIGdlbmVyYXRlX2Z1bmN0aW9uKHRfZnVuY3Rpb24qIHRmdW5jKTsKKyAgdm9pZCBnZW5lcmF0ZV9maWVsZCh0X2ZpZWxkKiBmaWVsZCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9hbm5vdGF0aW9ucyhzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IGFubm90YXRpb25zKTsKKworcHJpdmF0ZToKKyAgYm9vbCBzaG91bGRfbWVyZ2VfaW5jbHVkZXNfOworICBib29sIHNob3VsZF91c2VfZGVmYXVsdF9uc187CisgIGJvb2wgc2hvdWxkX3VzZV9uYW1lc3BhY2VzXzsKKworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfeG1sXzsKKworICBzdGQ6OnNldDxzdHJpbmc+IHByb2dyYW1zXzsKKyAgc3RkOjpzdGFjazxzdHJpbmc+IGVsZW1lbnRzXzsKKyAgYm9vbCB0b3BfZWxlbWVudF9pc19lbXB0eTsKKyAgYm9vbCB0b3BfZWxlbWVudF9pc19vcGVuOworCisgIHN0cmluZyB0YXJnZXRfbmFtZXNwYWNlKHRfcHJvZ3JhbSogcHJvZ3JhbSk7CisgIHZvaWQgd3JpdGVfZWxlbWVudF9zdGFydChjb25zdCBzdHJpbmcgbmFtZSk7CisgIHZvaWQgY2xvc2VfdG9wX2VsZW1lbnQoKTsKKyAgdm9pZCB3cml0ZV9lbGVtZW50X2VuZCgpOworICB2b2lkIHdyaXRlX2F0dHJpYnV0ZShzdHJpbmcga2V5LCBzdHJpbmcgdmFsKTsKKyAgdm9pZCB3cml0ZV9pbnRfYXR0cmlidXRlKHN0cmluZyBrZXksIGludCB2YWwpOworICBzdHJpbmcgZXNjYXBlX3htbF9zdHJpbmcoY29uc3Qgc3RyaW5nJiBpbnB1dCk7CisKKyAgdm9pZCB3cml0ZV94bWxfY29tbWVudChzdHJpbmcgbXNnKTsKKworICB2b2lkIHdyaXRlX3R5cGUodF90eXBlKiB0dHlwZSk7CisgIHZvaWQgd3JpdGVfZG9jKHRfZG9jKiB0ZG9jKTsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgc3RyaW5nIG51bWJlcl90b19zdHJpbmcoVCB0KSB7CisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKKyAgICBvdXQuaW1idWUoc3RkOjpsb2NhbGU6OmNsYXNzaWMoKSk7CisgICAgb3V0LnByZWNpc2lvbihzdGQ6Om51bWVyaWNfbGltaXRzPFQ+OjpkaWdpdHMxMCk7CisgICAgb3V0IDw8IHQ7CisgICAgcmV0dXJuIG91dC5zdHIoKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICB2b2lkIHdyaXRlX251bWJlcihUIG4pIHsKKyAgICBmX3htbF8gPDwgbnVtYmVyX3RvX3N0cmluZyhuKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICB2b2lkIHdyaXRlX2VsZW1lbnRfbnVtYmVyKHN0cmluZyBuYW1lLCBUIG4pIHsKKyAgICB3cml0ZV9lbGVtZW50X3N0cmluZyhuYW1lLCBudW1iZXJfdG9fc3RyaW5nKG4pKTsKKyAgfQorCisgIHN0cmluZyBnZXRfdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpOworCisgIHZvaWQgZ2VuZXJhdGVfY29uc3RhbnQodF9jb25zdCogY29uKTsKKworICB2b2lkIHdyaXRlX2VsZW1lbnRfc3RyaW5nKHN0cmluZyBuYW1lLCBzdHJpbmcgdmFsdWUpOworICB2b2lkIHdyaXRlX3ZhbHVlKHRfdHlwZSogdHZhbHVlKTsKKyAgdm9pZCB3cml0ZV9jb25zdF92YWx1ZSh0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisgIHZpcnR1YWwgc3RkOjpzdHJpbmcgeG1sX2F1dG9nZW5fY29tbWVudCgpIHsKKyAgICByZXR1cm4gc3RkOjpzdHJpbmcoIlxuIikgKyAiICogQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKCIgKyBUSFJJRlRfVkVSU0lPTiArICIpXG4iCisgICAgICAgICAgICsgIiAqXG4iICsgIiAqIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkdcbiI7CisgIH0KK307CisKK3ZvaWQgdF94bWxfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKKyAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKKworICBzdHJpbmcgZl94bWxfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBwcm9ncmFtXy0+Z2V0X25hbWUoKSArICIueG1sIjsKKyAgZl94bWxfLm9wZW4oZl94bWxfbmFtZS5jX3N0cigpKTsKKworICB0b3BfZWxlbWVudF9pc19vcGVuID0gZmFsc2U7Cit9CisKK3N0cmluZyB0X3htbF9nZW5lcmF0b3I6OnRhcmdldF9uYW1lc3BhY2UodF9wcm9ncmFtKiBwcm9ncmFtKSB7CisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gbWFwOworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+OjppdGVyYXRvciBpdGVyOworICBtYXAgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlX2Fubm90YXRpb25zKCJ4bWwiKTsKKyAgaWYgKChpdGVyID0gbWFwLmZpbmQoInRhcmdldE5hbWVzcGFjZSIpKSAhPSBtYXAuZW5kKCkpIHsKKyAgICByZXR1cm4gaXRlci0+c2Vjb25kOworICB9CisgIG1hcCA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2VzKCk7CisgIGlmICgoaXRlciA9IG1hcC5maW5kKCJ4bWwiKSkgIT0gbWFwLmVuZCgpKSB7CisgICAgcmV0dXJuIGRlZmF1bHRfbnNfcHJlZml4ICsgaXRlci0+c2Vjb25kOworICB9CisgIG1hcCA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2VfYW5ub3RhdGlvbnMoIioiKTsKKyAgaWYgKChpdGVyID0gbWFwLmZpbmQoInhtbC50YXJnZXROYW1lc3BhY2UiKSkgIT0gbWFwLmVuZCgpKSB7CisgICAgcmV0dXJuIGl0ZXItPnNlY29uZDsKKyAgfQorICBtYXAgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlcygpOworICBpZiAoKGl0ZXIgPSBtYXAuZmluZCgiKiIpKSAhPSBtYXAuZW5kKCkpIHsKKyAgICByZXR1cm4gZGVmYXVsdF9uc19wcmVmaXggKyBpdGVyLT5zZWNvbmQ7CisgIH0KKyAgcmV0dXJuIGRlZmF1bHRfbnNfcHJlZml4ICsgcHJvZ3JhbS0+Z2V0X25hbWUoKTsKK30KKwordm9pZCB0X3htbF9nZW5lcmF0b3I6OndyaXRlX3htbF9jb21tZW50KHN0cmluZyBtc2cpIHsKKyAgY2xvc2VfdG9wX2VsZW1lbnQoKTsKKyAgLy8gVE9ETzogaW5kZW50IGFueSBFT0xzIHRoYXQgbWF5IG9jY3VyIHdpdGggbXNnCisgIC8vIFRPRE86IHByb3BlciBtc2cgZXNjYXBpbmcgbmVlZGVkPworICBmX3htbF8gPDwgaW5kZW50KCkgPDwgIjwhLS0gIiA8PCBtc2cgPDwgIiAtLT4iICA8PCBlbmRsOworICB0b3BfZWxlbWVudF9pc19lbXB0eSA9IGZhbHNlOworfQorCit2b2lkIHRfeG1sX2dlbmVyYXRvcjo6Y2xvc2VfdG9wX2VsZW1lbnQoKSB7CisgIGlmKCB0b3BfZWxlbWVudF9pc19vcGVuKSB7CisgICAgdG9wX2VsZW1lbnRfaXNfb3BlbiA9IGZhbHNlOworICAgIGlmIChlbGVtZW50c18uc2l6ZSgpID4gMCAmJiB0b3BfZWxlbWVudF9pc19lbXB0eSkgeworICAgICAgZl94bWxfIDw8ICI+IiA8PCBlbmRsOworICAgIH0KKyAgfQorfQorCit2b2lkIHRfeG1sX2dlbmVyYXRvcjo6d3JpdGVfZWxlbWVudF9zdGFydChzdHJpbmcgbmFtZSkgeworICBpZiAoc2hvdWxkX3VzZV9uYW1lc3BhY2VzXyAmJiAhc2hvdWxkX3VzZV9kZWZhdWx0X25zXykgeworICAgIG5hbWUgPSAiaWRsOiIgKyBuYW1lOworICB9CisgIGNsb3NlX3RvcF9lbGVtZW50KCk7CisgIGZfeG1sXyA8PCBpbmRlbnQoKSA8PCAiPCIgPDwgbmFtZTsKKyAgZWxlbWVudHNfLnB1c2gobmFtZSk7CisgIHRvcF9lbGVtZW50X2lzX2VtcHR5ID0gdHJ1ZTsKKyAgdG9wX2VsZW1lbnRfaXNfb3BlbiA9IHRydWU7CisgIGluZGVudF91cCgpOworfQorCit2b2lkIHRfeG1sX2dlbmVyYXRvcjo6d3JpdGVfZWxlbWVudF9lbmQoKSB7CisgIGluZGVudF9kb3duKCk7CisgIGlmICh0b3BfZWxlbWVudF9pc19lbXB0eSAmJiB0b3BfZWxlbWVudF9pc19vcGVuKSB7CisgICAgZl94bWxfIDw8ICIgLz4iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgZl94bWxfIDw8IGluZGVudCgpIDw8ICI8LyIgPDwgZWxlbWVudHNfLnRvcCgpIDw8ICI+IiA8PCBlbmRsOworICB9CisgIHRvcF9lbGVtZW50X2lzX2VtcHR5ID0gZmFsc2U7CisgIGVsZW1lbnRzXy5wb3AoKTsKK30KKwordm9pZCB0X3htbF9nZW5lcmF0b3I6OndyaXRlX2F0dHJpYnV0ZShzdHJpbmcga2V5LCBzdHJpbmcgdmFsKSB7CisgIGZfeG1sXyA8PCAiICIgPDwga2V5IDw8ICI9XCIiIDw8IGVzY2FwZV94bWxfc3RyaW5nKHZhbCkgPDwgIlwiIjsKK30KKwordm9pZCB0X3htbF9nZW5lcmF0b3I6OndyaXRlX2ludF9hdHRyaWJ1dGUoc3RyaW5nIGtleSwgaW50IHZhbCkgeworICB3cml0ZV9hdHRyaWJ1dGUoa2V5LCBudW1iZXJfdG9fc3RyaW5nKHZhbCkpOworfQorCit2b2lkIHRfeG1sX2dlbmVyYXRvcjo6d3JpdGVfZWxlbWVudF9zdHJpbmcoc3RyaW5nIG5hbWUsIHN0cmluZyB2YWwpIHsKKyAgaWYgKHNob3VsZF91c2VfbmFtZXNwYWNlc18gJiYgIXNob3VsZF91c2VfZGVmYXVsdF9uc18pIHsKKyAgICBuYW1lID0gImlkbDoiICsgbmFtZTsKKyAgfQorICBjbG9zZV90b3BfZWxlbWVudCgpOworICB0b3BfZWxlbWVudF9pc19lbXB0eSA9IGZhbHNlOworICBmX3htbF8gPDwgaW5kZW50KCkKKyAgICA8PCAiPCIgPDwgbmFtZSA8PCAiPiIgPDwgZXNjYXBlX3htbF9zdHJpbmcodmFsKSA8PCAiPC8iIDw8IG5hbWUgPDwgIj4iCisgICAgPDwgZW5kbDsKK30KKworc3RyaW5nIHRfeG1sX2dlbmVyYXRvcjo6ZXNjYXBlX3htbF9zdHJpbmcoY29uc3Qgc3RyaW5nJiBpbnB1dCkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gc3M7CisgIGZvciAoc3RkOjpzdHJpbmc6OmNvbnN0X2l0ZXJhdG9yIGl0ZXIgPSBpbnB1dC5iZWdpbigpOyBpdGVyICE9IGlucHV0LmVuZCgpOyBpdGVyKyspIHsKKyAgICBzd2l0Y2ggKCppdGVyKSB7CisgICAgY2FzZSAnJic6CisgICAgICBzcyA8PCAiJmFtcDsiOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnIic6CisgICAgICBzcyA8PCAiJnF1b3Q7IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ1wnJzoKKyAgICAgIHNzIDw8ICImYXBvczsiOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnPCc6CisgICAgICBzcyA8PCAiJmx0OyI7CisgICAgICBicmVhazsKKyAgICBjYXNlICc+JzoKKyAgICAgIHNzIDw8ICImZ3Q7IjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBzcyA8PCAqaXRlcjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gc3Muc3RyKCk7Cit9CisKK3ZvaWQgdF94bWxfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7CisgIGZfeG1sXy5jbG9zZSgpOworfQorCit2b2lkIHRfeG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvZ3JhbSgpIHsKKworICBpbml0X2dlbmVyYXRvcigpOworCisgIHdyaXRlX2VsZW1lbnRfc3RhcnQoImlkbCIpOworICBpZiAoc2hvdWxkX3VzZV9uYW1lc3BhY2VzXykgeworICAgIGlmIChzaG91bGRfdXNlX2RlZmF1bHRfbnNfKSB7CisgICAgICB3cml0ZV9hdHRyaWJ1dGUoInhtbG5zIiwgImh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZy94bWwvaWRsIik7CisgICAgfQorICAgIHdyaXRlX2F0dHJpYnV0ZSgieG1sbnM6aWRsIiwgImh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZy94bWwvaWRsIik7CisgIH0KKworICB3cml0ZV94bWxfY29tbWVudCggeG1sX2F1dG9nZW5fY29tbWVudCgpKTsKKworICBpdGVyYXRlX3Byb2dyYW0ocHJvZ3JhbV8pOworCisgIHdyaXRlX2VsZW1lbnRfZW5kKCk7CisKKyAgY2xvc2VfZ2VuZXJhdG9yKCk7CisKK30KKwordm9pZCB0X3htbF9nZW5lcmF0b3I6Oml0ZXJhdGVfcHJvZ3JhbSh0X3Byb2dyYW0qIHByb2dyYW0pIHsKKworICB3cml0ZV9lbGVtZW50X3N0YXJ0KCJkb2N1bWVudCIpOworICB3cml0ZV9hdHRyaWJ1dGUoIm5hbWUiLCBwcm9ncmFtLT5nZXRfbmFtZSgpKTsKKyAgaWYgKHNob3VsZF91c2VfbmFtZXNwYWNlc18pIHsKKyAgICBjb25zdCBzdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gdGFyZ2V0X25hbWVzcGFjZShwcm9ncmFtKTsKKyAgICB3cml0ZV9hdHRyaWJ1dGUoInRhcmdldE5hbWVzcGFjZSIsIHRhcmdldE5hbWVzcGFjZSk7CisgICAgd3JpdGVfYXR0cmlidXRlKCJ4bWxuczoiICsgcHJvZ3JhbS0+Z2V0X25hbWUoKSwgdGFyZ2V0TmFtZXNwYWNlKTsKKyAgfQorICB3cml0ZV9kb2MocHJvZ3JhbSk7CisKKyAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+IGluY2x1ZGVzID0gcHJvZ3JhbS0+Z2V0X2luY2x1ZGVzKCk7CisgIHZlY3Rvcjx0X3Byb2dyYW0qPjo6Y29uc3RfaXRlcmF0b3IgaW5jX2l0OworICBmb3IgKGluY19pdCA9IGluY2x1ZGVzLmJlZ2luKCk7IGluY19pdCAhPSBpbmNsdWRlcy5lbmQoKTsgKytpbmNfaXQpIHsKKyAgICB3cml0ZV9lbGVtZW50X3N0YXJ0KCJpbmNsdWRlIik7CisgICAgd3JpdGVfYXR0cmlidXRlKCJuYW1lIiwgKCppbmNfaXQpLT5nZXRfbmFtZSgpKTsKKyAgICB3cml0ZV9lbGVtZW50X2VuZCgpOworICB9CisKKyAgY29uc3QgbWFwPHN0cmluZywgc3RyaW5nPiYgbmFtZXNwYWNlcyA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2VzKCk7CisgIG1hcDxzdHJpbmcsIHN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIG5zX2l0OworICBmb3IgKG5zX2l0ID0gbmFtZXNwYWNlcy5iZWdpbigpOyBuc19pdCAhPSBuYW1lc3BhY2VzLmVuZCgpOyArK25zX2l0KSB7CisgICAgd3JpdGVfZWxlbWVudF9zdGFydCgibmFtZXNwYWNlIik7CisgICAgd3JpdGVfYXR0cmlidXRlKCJuYW1lIiwgbnNfaXQtPmZpcnN0KTsKKyAgICB3cml0ZV9hdHRyaWJ1dGUoInZhbHVlIiwgbnNfaXQtPnNlY29uZCk7CisgICAgZ2VuZXJhdGVfYW5ub3RhdGlvbnMocHJvZ3JhbS0+Z2V0X25hbWVzcGFjZV9hbm5vdGF0aW9ucyhuc19pdC0+Zmlyc3QpKTsKKyAgICB3cml0ZV9lbGVtZW50X2VuZCgpOworICB9CisKKyAgLy8gVE9ETzogY2FuIGNvbnN0YW50cyBoYXZlIGFubm90YXRpb25zPworICB2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyA9IHByb2dyYW0tPmdldF9jb25zdHMoKTsKKyAgdmVjdG9yPHRfY29uc3QqPjo6aXRlcmF0b3IgY19pdGVyOworICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGdlbmVyYXRlX2NvbnN0YW50KCpjX2l0ZXIpOworICB9CisKKyAgdmVjdG9yPHRfdHlwZWRlZio+IHR5cGVkZWZzID0gcHJvZ3JhbS0+Z2V0X3R5cGVkZWZzKCk7CisgIHZlY3Rvcjx0X3R5cGVkZWYqPjo6aXRlcmF0b3IgdGRfaXRlcjsKKyAgZm9yICh0ZF9pdGVyID0gdHlwZWRlZnMuYmVnaW4oKTsgdGRfaXRlciAhPSB0eXBlZGVmcy5lbmQoKTsgKyt0ZF9pdGVyKSB7CisgICAgZ2VuZXJhdGVfdHlwZWRlZigqdGRfaXRlcik7CisgIH0KKworICB2ZWN0b3I8dF9lbnVtKj4gZW51bXMgPSBwcm9ncmFtLT5nZXRfZW51bXMoKTsKKyAgdmVjdG9yPHRfZW51bSo+OjppdGVyYXRvciBlbl9pdGVyOworICBmb3IgKGVuX2l0ZXIgPSBlbnVtcy5iZWdpbigpOyBlbl9pdGVyICE9IGVudW1zLmVuZCgpOyArK2VuX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9lbnVtKCplbl9pdGVyKTsKKyAgfQorCisgIHZlY3Rvcjx0X3N0cnVjdCo+IG9iamVjdHMgPSBwcm9ncmFtLT5nZXRfb2JqZWN0cygpOworICB2ZWN0b3I8dF9zdHJ1Y3QqPjo6aXRlcmF0b3Igb19pdGVyOworICBmb3IgKG9faXRlciA9IG9iamVjdHMuYmVnaW4oKTsgb19pdGVyICE9IG9iamVjdHMuZW5kKCk7ICsrb19pdGVyKSB7CisgICAgaWYgKCgqb19pdGVyKS0+aXNfeGNlcHRpb24oKSkgeworICAgICAgZ2VuZXJhdGVfeGNlcHRpb24oKm9faXRlcik7CisgICAgfSBlbHNlIHsKKyAgICAgIGdlbmVyYXRlX3N0cnVjdCgqb19pdGVyKTsKKyAgICB9CisgIH0KKworICB2ZWN0b3I8dF9zZXJ2aWNlKj4gc2VydmljZXMgPSBwcm9ncmFtLT5nZXRfc2VydmljZXMoKTsKKyAgdmVjdG9yPHRfc2VydmljZSo+OjppdGVyYXRvciBzdl9pdGVyOworICBmb3IgKHN2X2l0ZXIgPSBzZXJ2aWNlcy5iZWdpbigpOyBzdl9pdGVyICE9IHNlcnZpY2VzLmVuZCgpOyArK3N2X2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9zZXJ2aWNlKCpzdl9pdGVyKTsKKyAgfQorCisgIHdyaXRlX2VsZW1lbnRfZW5kKCk7CisKKyAgaWYgKHNob3VsZF9tZXJnZV9pbmNsdWRlc18pIHsKKyAgICBwcm9ncmFtc18uaW5zZXJ0KHByb2dyYW0tPmdldF9uYW1lKCkpOworICAgIGNvbnN0IHZlY3Rvcjx0X3Byb2dyYW0qPiBwcm9ncmFtcyA9IHByb2dyYW0tPmdldF9pbmNsdWRlcygpOworICAgIHZlY3Rvcjx0X3Byb2dyYW0qPjo6Y29uc3RfaXRlcmF0b3IgcHJvZ19pdDsKKyAgICBmb3IgKHByb2dfaXQgPSBwcm9ncmFtcy5iZWdpbigpOyBwcm9nX2l0ICE9IHByb2dyYW1zLmVuZCgpOyArK3Byb2dfaXQpIHsKKyAgICAgIGlmICghcHJvZ3JhbXNfLmNvdW50KCgqcHJvZ19pdCktPmdldF9uYW1lKCkpKSB7CisgICAgICAgIGl0ZXJhdGVfcHJvZ3JhbSgqcHJvZ19pdCk7CisgICAgICB9CisgICAgfQorICB9CisKK30KKwordm9pZCB0X3htbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgeworICB3cml0ZV9lbGVtZW50X3N0YXJ0KCJ0eXBlZGVmIik7CisgIHdyaXRlX2F0dHJpYnV0ZSgibmFtZSIsIHR0eXBlZGVmLT5nZXRfbmFtZSgpKTsKKyAgd3JpdGVfZG9jKHR0eXBlZGVmKTsKKyAgd3JpdGVfdHlwZSh0dHlwZWRlZi0+Z2V0X3RydWVfdHlwZSgpKTsKKyAgZ2VuZXJhdGVfYW5ub3RhdGlvbnModHR5cGVkZWYtPmFubm90YXRpb25zXyk7CisgIHdyaXRlX2VsZW1lbnRfZW5kKCk7CisgIHJldHVybjsKK30KKwordm9pZCB0X3htbF9nZW5lcmF0b3I6OndyaXRlX3R5cGUodF90eXBlKiB0dHlwZSkgeworICBjb25zdCBzdHJpbmcgdHlwZSA9IGdldF90eXBlX25hbWUodHR5cGUpOworICB3cml0ZV9hdHRyaWJ1dGUoInR5cGUiLCB0eXBlKTsKKyAgaWYgKHR5cGUgPT0gImlkIikgeworICAgIHdyaXRlX2F0dHJpYnV0ZSgidHlwZS1tb2R1bGUiLCB0dHlwZS0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWUoKSk7CisgICAgd3JpdGVfYXR0cmlidXRlKCJ0eXBlLWlkIiwgdHR5cGUtPmdldF9uYW1lKCkpOworICB9IGVsc2UgaWYgKHR5cGUgPT0gImxpc3QiKSB7CisgICAgdF90eXBlKiBldHlwZSA9ICgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB3cml0ZV9lbGVtZW50X3N0YXJ0KCJlbGVtVHlwZSIpOworICAgIHdyaXRlX3R5cGUoZXR5cGUpOworICAgIHdyaXRlX2VsZW1lbnRfZW5kKCk7CisgIH0gZWxzZSBpZiAodHlwZSA9PSAic2V0IikgeworICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB3cml0ZV9lbGVtZW50X3N0YXJ0KCJlbGVtVHlwZSIpOworICAgIHdyaXRlX3R5cGUoZXR5cGUpOworICAgIHdyaXRlX2VsZW1lbnRfZW5kKCk7CisgIH0gZWxzZSBpZiAodHlwZSA9PSAibWFwIikgeworICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgIHdyaXRlX2VsZW1lbnRfc3RhcnQoImtleVR5cGUiKTsKKyAgICB3cml0ZV90eXBlKGt0eXBlKTsKKyAgICB3cml0ZV9lbGVtZW50X2VuZCgpOworICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpOworICAgIHdyaXRlX2VsZW1lbnRfc3RhcnQoInZhbHVlVHlwZSIpOworICAgIHdyaXRlX3R5cGUodnR5cGUpOworICAgIHdyaXRlX2VsZW1lbnRfZW5kKCk7CisgIH0KK30KKwordm9pZCB0X3htbF9nZW5lcmF0b3I6OndyaXRlX2RvYyh0X2RvYyogdGRvYykgeworICBpZiAodGRvYy0+aGFzX2RvYygpKSB7CisgICAgc3RyaW5nIGRvYyA9IHRkb2MtPmdldF9kb2MoKTsKKyAgICAvLyBmb3Igc29tZSByZWFzb24gdGhlcmUgYWx3YXlzIHNlZW1zIHRvIGJlIGEgdHJhaWxpbmcgbmV3bGluZSBvbiBkb2MKKyAgICAvLyBjb21tZW50czsgbG9vcCBiZWxvdyBuYWl2ZWx5IHRyaWVzIHRvIHN0cmlwIG9mZiB0cmFpbGluZyBjci9sZgorICAgIGludCBuID0gMDsKKyAgICBmb3IgKHN0cmluZzo6cmV2ZXJzZV9pdGVyYXRvciBpID0gZG9jLnJiZWdpbigpOyBpICE9IGRvYy5yZW5kKCk7IGkrKyxuKyspIHsKKyAgICAgIGlmICgqaSAhPSAnXG4nIHx8ICppID09ICdccicpIHsKKyAgICAgICAgaWYgKG4gPiAwKSB7CisgICAgICAgICAgZG9jLmVyYXNlKGRvYy5sZW5ndGgoKSAtIG4pOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICB3cml0ZV9hdHRyaWJ1dGUoImRvYyIsIGRvYyk7CisgIH0KK30KKwordm9pZCB0X3htbF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Fubm90YXRpb25zKAorICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gYW5ub3RhdGlvbnMpIHsKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6aXRlcmF0b3IgaXRlcjsKKyAgZm9yIChpdGVyID0gYW5ub3RhdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBhbm5vdGF0aW9ucy5lbmQoKTsgKytpdGVyKSB7CisgICAgd3JpdGVfZWxlbWVudF9zdGFydCgiYW5ub3RhdGlvbiIpOworICAgIHdyaXRlX2F0dHJpYnV0ZSgia2V5IiwgaXRlci0+Zmlyc3QpOworICAgIHdyaXRlX2F0dHJpYnV0ZSgidmFsdWUiLCBpdGVyLT5zZWNvbmQpOworICAgIHdyaXRlX2VsZW1lbnRfZW5kKCk7CisgIH0KK30KKwordm9pZCB0X3htbF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0YW50KHRfY29uc3QqIGNvbikgeworICB3cml0ZV9lbGVtZW50X3N0YXJ0KCJjb25zdCIpOworICB3cml0ZV9hdHRyaWJ1dGUoIm5hbWUiLCBjb24tPmdldF9uYW1lKCkpOworICB3cml0ZV9kb2MoY29uKTsKKyAgd3JpdGVfdHlwZShjb24tPmdldF90eXBlKCkpOworICB3cml0ZV9jb25zdF92YWx1ZShjb24tPmdldF92YWx1ZSgpKTsKKyAgd3JpdGVfZWxlbWVudF9lbmQoKTsKK30KKwordm9pZCB0X3htbF9nZW5lcmF0b3I6OndyaXRlX2NvbnN0X3ZhbHVlKHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7CisKKyAgc3dpdGNoICh2YWx1ZS0+Z2V0X3R5cGUoKSkgeworCisgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfSURFTlRJRklFUjoKKyAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSOgorICAgIHdyaXRlX2VsZW1lbnRfbnVtYmVyKCJpbnQiLCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSk7CisgICAgYnJlYWs7CisKKyAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9ET1VCTEU6CisgICAgd3JpdGVfZWxlbWVudF9udW1iZXIoImRvdWJsZSIsIHZhbHVlLT5nZXRfZG91YmxlKCkpOworICAgIGJyZWFrOworCisgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfU1RSSU5HOgorICAgIHdyaXRlX2VsZW1lbnRfc3RyaW5nKCJzdHJpbmciLCB2YWx1ZS0+Z2V0X3N0cmluZygpKTsKKyAgICBicmVhazsKKworICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX0xJU1Q6IHsKKyAgICB3cml0ZV9lbGVtZW50X3N0YXJ0KCJsaXN0Iik7CisgICAgc3RkOjp2ZWN0b3I8dF9jb25zdF92YWx1ZSo+IGxpc3QgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICBzdGQ6OnZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46Oml0ZXJhdG9yIGxpdDsKKyAgICBmb3IgKGxpdCA9IGxpc3QuYmVnaW4oKTsgbGl0ICE9IGxpc3QuZW5kKCk7ICsrbGl0KSB7CisgICAgICB3cml0ZV9lbGVtZW50X3N0YXJ0KCJlbnRyeSIpOworICAgICAgd3JpdGVfY29uc3RfdmFsdWUoKmxpdCk7CisgICAgICB3cml0ZV9lbGVtZW50X2VuZCgpOworICAgIH0KKyAgICB3cml0ZV9lbGVtZW50X2VuZCgpOworICAgIGJyZWFrOworICB9CisKKyAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9NQVA6IHsKKyAgICB3cml0ZV9lbGVtZW50X3N0YXJ0KCJtYXAiKTsKKyAgICBzdGQ6Om1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+IG1hcCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgc3RkOjptYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6aXRlcmF0b3IgbWl0OworICAgIGZvciAobWl0ID0gbWFwLmJlZ2luKCk7IG1pdCAhPSBtYXAuZW5kKCk7ICsrbWl0KSB7CisgICAgICB3cml0ZV9lbGVtZW50X3N0YXJ0KCJlbnRyeSIpOworICAgICAgd3JpdGVfZWxlbWVudF9zdGFydCgia2V5Iik7CisgICAgICB3cml0ZV9jb25zdF92YWx1ZShtaXQtPmZpcnN0KTsKKyAgICAgIHdyaXRlX2VsZW1lbnRfZW5kKCk7CisgICAgICB3cml0ZV9lbGVtZW50X3N0YXJ0KCJ2YWx1ZSIpOworICAgICAgd3JpdGVfY29uc3RfdmFsdWUobWl0LT5zZWNvbmQpOworICAgICAgd3JpdGVfZWxlbWVudF9lbmQoKTsKKyAgICAgIHdyaXRlX2VsZW1lbnRfZW5kKCk7CisgICAgfQorICAgIHdyaXRlX2VsZW1lbnRfZW5kKCk7CisgICAgYnJlYWs7CisgIH0KKworICBkZWZhdWx0OgorICAgIGluZGVudF91cCgpOworICAgIGZfeG1sXyA8PCBpbmRlbnQoKSA8PCAiPG51bGwgLz4iIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBicmVhazsKKyAgfQorCit9CisKK3ZvaWQgdF94bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKKworICB3cml0ZV9lbGVtZW50X3N0YXJ0KCJlbnVtIik7CisgIHdyaXRlX2F0dHJpYnV0ZSgibmFtZSIsIHRlbnVtLT5nZXRfbmFtZSgpKTsKKyAgd3JpdGVfZG9jKHRlbnVtKTsKKworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gdmFsdWVzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciB2YWxfaXRlcjsKKyAgZm9yICh2YWxfaXRlciA9IHZhbHVlcy5iZWdpbigpOyB2YWxfaXRlciAhPSB2YWx1ZXMuZW5kKCk7ICsrdmFsX2l0ZXIpIHsKKyAgICB0X2VudW1fdmFsdWUqIHZhbCA9ICgqdmFsX2l0ZXIpOworICAgIHdyaXRlX2VsZW1lbnRfc3RhcnQoIm1lbWJlciIpOworICAgIHdyaXRlX2F0dHJpYnV0ZSgibmFtZSIsIHZhbC0+Z2V0X25hbWUoKSk7CisgICAgd3JpdGVfaW50X2F0dHJpYnV0ZSgidmFsdWUiLCB2YWwtPmdldF92YWx1ZSgpKTsKKyAgICB3cml0ZV9kb2ModmFsKTsKKyAgICBnZW5lcmF0ZV9hbm5vdGF0aW9ucyh2YWwtPmFubm90YXRpb25zXyk7CisgICAgd3JpdGVfZWxlbWVudF9lbmQoKTsKKyAgfQorCisgIGdlbmVyYXRlX2Fubm90YXRpb25zKHRlbnVtLT5hbm5vdGF0aW9uc18pOworCisgIHdyaXRlX2VsZW1lbnRfZW5kKCk7CisKK30KKwordm9pZCB0X3htbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgeworCisgIHN0cmluZyB0YWduYW1lID0gInN0cnVjdCI7CisgIGlmICh0c3RydWN0LT5pc191bmlvbigpKSB7CisgICAgdGFnbmFtZSA9ICJ1bmlvbiI7CisgIH0gZWxzZSBpZiAodHN0cnVjdC0+aXNfeGNlcHRpb24oKSkgeworICAgIHRhZ25hbWUgPSAiZXhjZXB0aW9uIjsKKyAgfQorCisgIHdyaXRlX2VsZW1lbnRfc3RhcnQodGFnbmFtZSk7CisgIHdyaXRlX2F0dHJpYnV0ZSgibmFtZSIsIHRzdHJ1Y3QtPmdldF9uYW1lKCkpOworICB3cml0ZV9kb2ModHN0cnVjdCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj4gbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46Oml0ZXJhdG9yIG1lbV9pdGVyOworICBmb3IgKG1lbV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtZW1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyBtZW1faXRlcisrKSB7CisgICAgd3JpdGVfZWxlbWVudF9zdGFydCgiZmllbGQiKTsKKyAgICBnZW5lcmF0ZV9maWVsZCgqbWVtX2l0ZXIpOworICAgIHdyaXRlX2VsZW1lbnRfZW5kKCk7CisgIH0KKworICBnZW5lcmF0ZV9hbm5vdGF0aW9ucyh0c3RydWN0LT5hbm5vdGF0aW9uc18pOworCisgIHdyaXRlX2VsZW1lbnRfZW5kKCk7CisKK30KKwordm9pZCB0X3htbF9nZW5lcmF0b3I6OmdlbmVyYXRlX2ZpZWxkKHRfZmllbGQqIGZpZWxkKSB7CisgIHdyaXRlX2F0dHJpYnV0ZSgibmFtZSIsIGZpZWxkLT5nZXRfbmFtZSgpKTsKKyAgd3JpdGVfaW50X2F0dHJpYnV0ZSgiZmllbGQtaWQiLCBmaWVsZC0+Z2V0X2tleSgpKTsKKyAgd3JpdGVfZG9jKGZpZWxkKTsKKyAgc3RyaW5nIHJlcXVpcmVkbmVzczsKKyAgc3dpdGNoIChmaWVsZC0+Z2V0X3JlcSgpKSB7CisgIGNhc2UgdF9maWVsZDo6VF9SRVFVSVJFRDoKKyAgICByZXF1aXJlZG5lc3MgPSAicmVxdWlyZWQiOworICAgIGJyZWFrOworICBjYXNlIHRfZmllbGQ6OlRfT1BUSU9OQUw6CisgICAgcmVxdWlyZWRuZXNzID0gIm9wdGlvbmFsIjsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICByZXF1aXJlZG5lc3MgPSAiIjsKKyAgICBicmVhazsKKyAgfQorICBpZiAocmVxdWlyZWRuZXNzICE9ICIiKSB7CisgICAgd3JpdGVfYXR0cmlidXRlKCJyZXF1aXJlZCIsIHJlcXVpcmVkbmVzcyk7CisgIH0KKyAgd3JpdGVfdHlwZShmaWVsZC0+Z2V0X3R5cGUoKSk7CisgIGlmIChmaWVsZC0+Z2V0X3ZhbHVlKCkpIHsKKyAgICB3cml0ZV9lbGVtZW50X3N0YXJ0KCJkZWZhdWx0Iik7CisgICAgd3JpdGVfY29uc3RfdmFsdWUoZmllbGQtPmdldF92YWx1ZSgpKTsKKyAgICB3cml0ZV9lbGVtZW50X2VuZCgpOworICB9CisgIGdlbmVyYXRlX2Fubm90YXRpb25zKGZpZWxkLT5hbm5vdGF0aW9uc18pOworfQorCit2b2lkIHRfeG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisKKyAgd3JpdGVfZWxlbWVudF9zdGFydCgic2VydmljZSIpOworICB3cml0ZV9hdHRyaWJ1dGUoIm5hbWUiLCB0c2VydmljZS0+Z2V0X25hbWUoKSk7CisKKyAgaWYgKHNob3VsZF91c2VfbmFtZXNwYWNlc18pIHsKKyAgICBzdHJpbmcgcHJvZ19ucyA9IHRhcmdldF9uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpOworICAgIGlmICgqcHJvZ19ucy5yYmVnaW4oKSAhPSAnLycpIHsKKyAgICAgIHByb2dfbnMucHVzaF9iYWNrKCcvJyk7CisgICAgfQorICAgIGNvbnN0IHN0cmluZyB0bnMgPSBwcm9nX25zICsgdHNlcnZpY2UtPmdldF9uYW1lKCk7CisgICAgd3JpdGVfYXR0cmlidXRlKCJ0YXJnZXROYW1lc3BhY2UiLCB0bnMpOworICAgIHdyaXRlX2F0dHJpYnV0ZSgieG1sbnM6dG5zIiwgdG5zKTsKKyAgfQorCisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSkgeworICAgIGNvbnN0IHRfc2VydmljZSogZXh0ZW5kcyA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworICAgIHdyaXRlX2F0dHJpYnV0ZSgicGFyZW50LW1vZHVsZSIsIGV4dGVuZHMtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lKCkpOworICAgIHdyaXRlX2F0dHJpYnV0ZSgicGFyZW50LWlkIiwgZXh0ZW5kcy0+Z2V0X25hbWUoKSk7CisgIH0KKworICB3cml0ZV9kb2ModHNlcnZpY2UpOworCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZm5faXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOworICBmb3IgKDsgZm5faXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7IGZuX2l0ZXIrKykgeworICAgIGdlbmVyYXRlX2Z1bmN0aW9uKCpmbl9pdGVyKTsKKyAgfQorCisgIGdlbmVyYXRlX2Fubm90YXRpb25zKHRzZXJ2aWNlLT5hbm5vdGF0aW9uc18pOworCisgIHdyaXRlX2VsZW1lbnRfZW5kKCk7CisKK30KKwordm9pZCB0X3htbF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Z1bmN0aW9uKHRfZnVuY3Rpb24qIHRmdW5jKSB7CisKKyAgd3JpdGVfZWxlbWVudF9zdGFydCgibWV0aG9kIik7CisKKyAgd3JpdGVfYXR0cmlidXRlKCJuYW1lIiwgdGZ1bmMtPmdldF9uYW1lKCkpOworICBpZiAodGZ1bmMtPmlzX29uZXdheSgpKSB7CisgICAgd3JpdGVfYXR0cmlidXRlKCJvbmV3YXkiLCAidHJ1ZSIpOworICB9CisKKyAgd3JpdGVfZG9jKHRmdW5jKTsKKworICB3cml0ZV9lbGVtZW50X3N0YXJ0KCJyZXR1cm5zIik7CisgIHdyaXRlX3R5cGUodGZ1bmMtPmdldF9yZXR1cm50eXBlKCkpOworICB3cml0ZV9lbGVtZW50X2VuZCgpOworCisgIHZlY3Rvcjx0X2ZpZWxkKj4gbWVtYmVycyA9IHRmdW5jLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+OjppdGVyYXRvciBtZW1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsKKyAgZm9yICg7IG1lbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7IG1lbV9pdGVyKyspIHsKKyAgICB3cml0ZV9lbGVtZW50X3N0YXJ0KCJhcmciKTsKKyAgICBnZW5lcmF0ZV9maWVsZCgqbWVtX2l0ZXIpOworICAgIHdyaXRlX2VsZW1lbnRfZW5kKCk7CisgIH0KKworICB2ZWN0b3I8dF9maWVsZCo+IGV4Y2VwdHMgPSB0ZnVuYy0+Z2V0X3hjZXB0aW9ucygpLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+OjppdGVyYXRvciBleF9pdGVyID0gZXhjZXB0cy5iZWdpbigpOworICBmb3IgKDsgZXhfaXRlciAhPSBleGNlcHRzLmVuZCgpOyBleF9pdGVyKyspIHsKKyAgICB3cml0ZV9lbGVtZW50X3N0YXJ0KCJ0aHJvd3MiKTsKKyAgICBnZW5lcmF0ZV9maWVsZCgqZXhfaXRlcik7CisgICAgd3JpdGVfZWxlbWVudF9lbmQoKTsKKyAgfQorCisgIGdlbmVyYXRlX2Fubm90YXRpb25zKHRmdW5jLT5hbm5vdGF0aW9uc18pOworCisgIHdyaXRlX2VsZW1lbnRfZW5kKCk7CisKK30KKworc3RyaW5nIHRfeG1sX2dlbmVyYXRvcjo6Z2V0X3R5cGVfbmFtZSh0X3R5cGUqIHR0eXBlKSB7CisgIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJsaXN0IjsKKyAgfQorICBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICJzZXQiOworICB9CisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gIm1hcCI7CisgIH0KKyAgaWYgKCh0dHlwZS0+aXNfZW51bSgpICAgICl8fAorICAgICAgKHR0eXBlLT5pc19zdHJ1Y3QoKSAgKXx8CisgICAgICAodHR5cGUtPmlzX3R5cGVkZWYoKSApfHwKKyAgICAgICh0dHlwZS0+aXNfeGNlcHRpb24oKSkpeworICAgIHJldHVybiAiaWQiOworICB9CisgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZSogdGJhc2V0eXBlID0gKHRfYmFzZV90eXBlKil0dHlwZTsKKyAgICBpZiAodGJhc2V0eXBlLT5pc19iaW5hcnkoKSApIHsKKyAgICAgIHJldHVybiAiYmluYXJ5IjsKKyAgICB9CisgICAgcmV0dXJuIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZXR5cGUtPmdldF9iYXNlKCkpOworICB9CisgIHJldHVybiAiKHVua25vd24pIjsKK30KKworVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUigKKyAgeG1sLAorICAiWE1MIiwKKyAgIiAgICBtZXJnZTogICAgICAgICAgIEdlbmVyYXRlIG91dHB1dCB3aXRoIGluY2x1ZGVkIGZpbGVzIG1lcmdlZFxuIgorICAiICAgIG5vX2RlZmF1bHRfbnM6ICAgT21pdCBkZWZhdWx0IHhtbG5zIGFuZCBhZGQgaWRsOiBwcmVmaXggdG8gYWxsIGVsZW1lbnRzXG4iCisgICIgICAgbm9fbmFtZXNwYWNlczogICBEbyBub3QgYWRkIG5hbWVzcGFjZSBkZWZpbml0aW9ucyB0byB0aGUgWE1MIG1vZGVsXG4iKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF94c2RfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF94c2RfZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0ODdmZmMKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X3hzZF9nZW5lcmF0b3IuY2MKQEAgLTAsMCArMSwzNzYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8c3N0cmVhbT4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlICJ0aHJpZnQvdmVyc2lvbi5oIgorI2luY2x1ZGUgInRocmlmdC9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvci5oIgorCit1c2luZyBzdGQ6Om1hcDsKK3VzaW5nIHN0ZDo6b2ZzdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjp2ZWN0b3I7CisKK3N0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKKworLyoqCisgKiBYU0QgZ2VuZXJhdG9yLCBjcmVhdGVzIGFuIFhTRCBmb3IgdGhlIGJhc2UgdHlwZXMgZXRjLgorICoKKyAqLworY2xhc3MgdF94c2RfZ2VuZXJhdG9yIDogcHVibGljIHRfZ2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgdF94c2RfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAorICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCisgICAgOiB0X2dlbmVyYXRvcihwcm9ncmFtKSB7CisgICAgKHZvaWQpb3B0aW9uX3N0cmluZzsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworCisgICAgLyogbm8gb3B0aW9ucyB5ZXQgKi8KKyAgICBmb3IoIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5iZWdpbigpOyBpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgIHRocm93ICJ1bmtub3duIG9wdGlvbiB4c2Q6IiArIGl0ZXItPmZpcnN0OworICAgIH0KKworICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLXhzZCI7CisgIH0KKworICB2aXJ0dWFsIH50X3hzZF9nZW5lcmF0b3IoKSB7fQorCisgIC8qKgorICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCisgICAqLworCisgIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKKyAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKKworICAvKioKKyAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZik7CisgIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7ICh2b2lkKXRlbnVtOyB9CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCk7CisKK3ByaXZhdGU6CisgIHZvaWQgZ2VuZXJhdGVfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIGF0dHJzID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgb3B0aW9uYWwgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbmlsbGFibGUgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbGlzdF9lbGVtZW50ID0gZmFsc2UpOworCisgIHN0ZDo6c3RyaW5nIG5zKHN0ZDo6c3RyaW5nIGluLCBzdGQ6OnN0cmluZyBucykgeyByZXR1cm4gbnMgKyAiOiIgKyBpbjsgfQorCisgIHN0ZDo6c3RyaW5nIHhzZChzdGQ6OnN0cmluZyBpbikgeyByZXR1cm4gbnMoaW4sICJ4c2QiKTsgfQorCisgIHN0ZDo6c3RyaW5nIHR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlKTsKKyAgc3RkOjpzdHJpbmcgYmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSk7CisKKyAgdmlydHVhbCBzdGQ6OnN0cmluZyB4bWxfYXV0b2dlbl9jb21tZW50KCkgeworICAgIHJldHVybiBzdGQ6OnN0cmluZygiPCEtLVxuIikgKyAiICogQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKCIgKyBUSFJJRlRfVkVSU0lPTiArICIpXG4iCisgICAgICAgICAgICsgIiAqXG4iICsgIiAqIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkdcbiIKKyAgICAgICAgICAgKyAiIC0tPlxuIjsKKyAgfQorCisgIC8qKgorICAgKiBPdXRwdXQgeHNkL3BocCBmaWxlCisgICAqLworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfeHNkXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3BocF87CisKKyAgLyoqCisgICAqIE91dHB1dCBzdHJpbmcgc3RyZWFtCisgICAqLworICBzdGQ6Om9zdHJpbmdzdHJlYW0gc194c2RfdHlwZXNfOworfTsKKwordm9pZCB0X3hzZF9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgeworICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKKyAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKKworICAvLyBNYWtlIG91dHB1dCBmaWxlCisgIHN0cmluZyBmX3BocF9uYW1lID0gZ2V0X291dF9kaXIoKSArIHByb2dyYW1fLT5nZXRfbmFtZSgpICsgIl94c2QucGhwIjsKKyAgZl9waHBfLm9wZW4oZl9waHBfbmFtZS5jX3N0cigpKTsKKworICBmX3BocF8gPDwgIjw/cGhwIiA8PCBlbmRsCisgICAgICAgICA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsOworfQorCit2b2lkIHRfeHNkX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgeworICBmX3BocF8gPDwgIj8+IiA8PCBlbmRsOworICBmX3BocF8uY2xvc2UoKTsKK30KKwordm9pZCB0X3hzZF9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgeworICBpbmRlbnQoc194c2RfdHlwZXNfKSA8PCAiPHhzZDpzaW1wbGVUeXBlIG5hbWU9XCIiIDw8IHR0eXBlZGVmLT5nZXRfbmFtZSgpIDw8ICJcIj4iIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpZiAodHR5cGVkZWYtPmdldF90eXBlKCktPmlzX3N0cmluZygpICYmICgodF9iYXNlX3R5cGUqKXR0eXBlZGVmLT5nZXRfdHlwZSgpKS0+aXNfc3RyaW5nX2VudW0oKSkgeworICAgIGluZGVudChzX3hzZF90eXBlc18pIDw8ICI8eHNkOnJlc3RyaWN0aW9uIGJhc2U9XCIiIDw8IHR5cGVfbmFtZSh0dHlwZWRlZi0+Z2V0X3R5cGUoKSkgPDwgIlwiPiIKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGNvbnN0IHZlY3RvcjxzdHJpbmc+JiB2YWx1ZXMgPSAoKHRfYmFzZV90eXBlKil0dHlwZWRlZi0+Z2V0X3R5cGUoKSktPmdldF9zdHJpbmdfZW51bV92YWxzKCk7CisgICAgdmVjdG9yPHN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbHVlcy5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsdWVzLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgaW5kZW50KHNfeHNkX3R5cGVzXykgPDwgIjx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9XCIiIDw8ICgqdl9pdGVyKSA8PCAiXCIgLz4iIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KHNfeHNkX3R5cGVzXykgPDwgIjwveHNkOnJlc3RyaWN0aW9uPiIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQoc194c2RfdHlwZXNfKSA8PCAiPHhzZDpyZXN0cmljdGlvbiBiYXNlPVwiIiA8PCB0eXBlX25hbWUodHR5cGVkZWYtPmdldF90eXBlKCkpIDw8ICJcIiAvPiIKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChzX3hzZF90eXBlc18pIDw8ICI8L3hzZDpzaW1wbGVUeXBlPiIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfeHNkX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIGJvb2wgeHNkX2FsbCA9IHRzdHJ1Y3QtPmdldF94c2RfYWxsKCk7CisKKyAgaW5kZW50KHNfeHNkX3R5cGVzXykgPDwgIjx4c2Q6Y29tcGxleFR5cGUgbmFtZT1cIiIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiXCI+IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaWYgKHhzZF9hbGwpIHsKKyAgICBpbmRlbnQoc194c2RfdHlwZXNfKSA8PCAiPHhzZDphbGw+IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChzX3hzZF90eXBlc18pIDw8ICI8eHNkOnNlcXVlbmNlPiIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfdXAoKTsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgZ2VuZXJhdGVfZWxlbWVudChzX3hzZF90eXBlc18sCisgICAgICAgICAgICAgICAgICAgICAoKm1faXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAoKm1faXRlciktPmdldF90eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAoKm1faXRlciktPmdldF94c2RfYXR0cnMoKSwKKyAgICAgICAgICAgICAgICAgICAgICgqbV9pdGVyKS0+Z2V0X3hzZF9vcHRpb25hbCgpIHx8IHhzZF9hbGwsCisgICAgICAgICAgICAgICAgICAgICAoKm1faXRlciktPmdldF94c2RfbmlsbGFibGUoKSk7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBpZiAoeHNkX2FsbCkgeworICAgIGluZGVudChzX3hzZF90eXBlc18pIDw8ICI8L3hzZDphbGw+IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChzX3hzZF90eXBlc18pIDw8ICI8L3hzZDpzZXF1ZW5jZT4iIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KHNfeHNkX3R5cGVzXykgPDwgIjwveHNkOmNvbXBsZXhUeXBlPiIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfeHNkX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogYXR0cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG9wdGlvbmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBuaWxsYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbGlzdF9lbGVtZW50KSB7CisgIHN0cmluZyBzbWluT2NjdXJzID0gKG9wdGlvbmFsIHx8IGxpc3RfZWxlbWVudCkgPyAiIG1pbk9jY3Vycz1cIjBcIiIgOiAiIjsKKyAgc3RyaW5nIHNtYXhPY2N1cnMgPSBsaXN0X2VsZW1lbnQgPyAiIG1heE9jY3Vycz1cInVuYm91bmRlZFwiIiA6ICIiOworICBzdHJpbmcgc29wdGlvbmFsID0gc21pbk9jY3VycyArIHNtYXhPY2N1cnM7CisgIHN0cmluZyBzbmlsbGFibGUgPSBuaWxsYWJsZSA/ICIgbmlsbGFibGU9XCJ0cnVlXCIiIDogIiI7CisKKyAgaWYgKHR0eXBlLT5pc192b2lkKCkgfHwgdHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICI8eHNkOmVsZW1lbnQgbmFtZT1cIiIgPDwgbmFtZSA8PCAiXCIiIDw8IHNvcHRpb25hbCA8PCBzbmlsbGFibGUgPDwgIj4iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaWYgKGF0dHJzID09IE5VTEwgJiYgdHR5cGUtPmlzX3ZvaWQoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIjx4c2Q6Y29tcGxleFR5cGUgLz4iIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICI8eHNkOmNvbXBsZXhUeXBlPiIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIjx4c2Q6c2VxdWVuY2UgbWluT2NjdXJzPVwiMFwiIG1heE9jY3Vycz1cInVuYm91bmRlZFwiPiIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIHN0cmluZyBzdWJuYW1lOworICAgICAgICB0X3R5cGUqIHN1YnR5cGUgPSAoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgICAgIGlmIChzdWJ0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCBzdWJ0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgICAgICAgIHN1Ym5hbWUgPSBuYW1lICsgIl9lbHQiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHN1Ym5hbWUgPSB0eXBlX25hbWUoc3VidHlwZSk7CisgICAgICAgIH0KKyAgICAgICAgZl9waHBfIDw8ICIkR0xPQkFMU1snIiA8PCBwcm9ncmFtXy0+Z2V0X25hbWUoKSA8PCAiX3hzZF9lbHRfIiA8PCBuYW1lIDw8ICInXSA9ICciIDw8IHN1Ym5hbWUKKyAgICAgICAgICAgICAgIDw8ICInOyIgPDwgZW5kbDsKKyAgICAgICAgZ2VuZXJhdGVfZWxlbWVudChvdXQsIHN1Ym5hbWUsIHN1YnR5cGUsIE5VTEwsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICI8L3hzZDpzZXF1ZW5jZT4iIDw8IGVuZGw7CisgICAgICAgIGluZGVudChvdXQpIDw8ICI8eHNkOmF0dHJpYnV0ZSBuYW1lPVwibGlzdFwiIHR5cGU9XCJ4c2Q6Ym9vbGVhblwiIC8+IiA8PCBlbmRsOworICAgICAgfQorICAgICAgaWYgKGF0dHJzICE9IE5VTEwpIHsKKyAgICAgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IGF0dHJzLT5nZXRfbWVtYmVycygpOworICAgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBhX2l0ZXI7CisgICAgICAgIGZvciAoYV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBhX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKythX2l0ZXIpIHsKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAiPHhzZDphdHRyaWJ1dGUgbmFtZT1cIiIgPDwgKCphX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIiB0eXBlPVwiIgorICAgICAgICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZSgoKmFfaXRlciktPmdldF90eXBlKCkpIDw8ICJcIiAvPiIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICI8L3hzZDpjb21wbGV4VHlwZT4iIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIjwveHNkOmVsZW1lbnQ+IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGlmIChhdHRycyA9PSBOVUxMKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiPHhzZDplbGVtZW50IG5hbWU9XCIiIDw8IG5hbWUgPDwgIlwiIgorICAgICAgICAgICAgICAgICAgPDwgIiB0eXBlPVwiIiA8PCB0eXBlX25hbWUodHR5cGUpIDw8ICJcIiIgPDwgc29wdGlvbmFsIDw8IHNuaWxsYWJsZSA8PCAiIC8+IgorICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgLy8gV293LCBhbGwgdGhpcyB3b3JrIGZvciBhIFNJTVBMRSBUWVBFIHdpdGggYXR0cmlidXRlcz8hPyE/IQorICAgICAgaW5kZW50KG91dCkgPDwgIjx4c2Q6ZWxlbWVudCBuYW1lPVwiIiA8PCBuYW1lIDw8ICJcIiIgPDwgc29wdGlvbmFsIDw8IHNuaWxsYWJsZSA8PCAiPiIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICI8eHNkOmNvbXBsZXhUeXBlPiIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50KG91dCkgPDwgIjx4c2Q6Y29tcGxleENvbnRlbnQ+IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAiPHhzZDpleHRlbnNpb24gYmFzZT1cIiIgPDwgdHlwZV9uYW1lKHR0eXBlKSA8PCAiXCI+IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gYXR0cnMtPmdldF9tZW1iZXJzKCk7CisgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBhX2l0ZXI7CisgICAgICBmb3IgKGFfaXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgYV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrYV9pdGVyKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICI8eHNkOmF0dHJpYnV0ZSBuYW1lPVwiIiA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiIHR5cGU9XCIiCisgICAgICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZSgoKmFfaXRlciktPmdldF90eXBlKCkpIDw8ICJcIiAvPiIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAiPC94c2Q6ZXh0ZW5zaW9uPiIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAiPC94c2Q6Y29tcGxleENvbnRlbnQ+IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICI8L3hzZDpjb21wbGV4VHlwZT4iIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIjwveHNkOmVsZW1lbnQ+IiA8PCBlbmRsOworICAgIH0KKyAgfQorfQorCisKK3ZvaWQgdF94c2RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgLy8gTWFrZSBvdXRwdXQgZmlsZQorICBzdHJpbmcgZl94c2RfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyB0c2VydmljZS0+Z2V0X25hbWUoKSArICIueHNkIjsKKyAgZl94c2RfLm9wZW4oZl94c2RfbmFtZS5jX3N0cigpKTsKKworICBzdHJpbmcgbnMgPSBwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgieHNkIik7CisgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gYW5ub3QgPSBwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZV9hbm5vdGF0aW9ucygieHNkIik7CisgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIHVyaSA9IGFubm90LmZpbmQoInVyaSIpOworICBpZiAodXJpICE9IGFubm90LmVuZCgpKSB7CisgICAgbnMgPSB1cmktPnNlY29uZDsKKyAgfQorICBpZiAobnMuc2l6ZSgpID4gMCkgeworICAgIG5zID0gIiB0YXJnZXROYW1lc3BhY2U9XCIiICsgbnMgKyAiXCIgeG1sbnM9XCIiICsgbnMgKyAiXCIgIgorICAgICAgICAgKyAiZWxlbWVudEZvcm1EZWZhdWx0PVwicXVhbGlmaWVkXCIiOworICB9CisKKyAgLy8gUHJpbnQgdGhlIFhTRCBoZWFkZXIKKyAgZl94c2RfIDw8ICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiID8+IiA8PCBlbmRsCisgICAgICAgICA8PCAiPHhzZDpzY2hlbWEgeG1sbnM6eHNkPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWFcIiIgPDwgbnMgPDwgIj4iIDw8IGVuZGwKKyAgICAgICAgIDw8IHhtbF9hdXRvZ2VuX2NvbW1lbnQoKQorICAgICAgICAgPDwgZW5kbDsKKworICAvLyBQcmludCBvdXQgdGhlIHR5cGUgZGVmaW5pdGlvbnMKKyAgaW5kZW50KGZfeHNkXykgPDwgc194c2RfdHlwZXNfLnN0cigpOworCisgIC8vIEtlZXAgYSBsaXN0IG9mIGFsbCB0aGUgcG9zc2libGUgZXhjZXB0aW9ucyB0aGF0IG1pZ2h0IGdldCB0aHJvd24KKyAgbWFwPHN0cmluZywgdF9zdHJ1Y3QqPiBhbGxfeGNlcHRpb25zOworCisgIC8vIExpc3QgdGhlIGVsZW1lbnRzIHRoYXQgeW91IG1pZ2h0IGFjdHVhbGx5IGdldAorICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBzdHJpbmcgZWxlbW5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3Jlc3BvbnNlIjsKKyAgICB0X3R5cGUqIHJldHVybnR5cGUgPSAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCk7CisgICAgZ2VuZXJhdGVfZWxlbWVudChmX3hzZF8sIGVsZW1uYW1lLCByZXR1cm50eXBlKTsKKyAgICBmX3hzZF8gPDwgZW5kbDsKKworICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICBhbGxfeGNlcHRpb25zWygqeF9pdGVyKS0+Z2V0X25hbWUoKV0gPSAodF9zdHJ1Y3QqKSgoKnhfaXRlciktPmdldF90eXBlKCkpOworICAgIH0KKyAgfQorCisgIG1hcDxzdHJpbmcsIHRfc3RydWN0Kj46Oml0ZXJhdG9yIGF4X2l0ZXI7CisgIGZvciAoYXhfaXRlciA9IGFsbF94Y2VwdGlvbnMuYmVnaW4oKTsgYXhfaXRlciAhPSBhbGxfeGNlcHRpb25zLmVuZCgpOyArK2F4X2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9lbGVtZW50KGZfeHNkXywgYXhfaXRlci0+Zmlyc3QsIGF4X2l0ZXItPnNlY29uZCk7CisgIH0KKworICAvLyBDbG9zZSB0aGUgWFNEIGRvY3VtZW50CisgIGZfeHNkXyA8PCBlbmRsIDw8ICI8L3hzZDpzY2hlbWE+IiA8PCBlbmRsOworICBmX3hzZF8uY2xvc2UoKTsKK30KKworc3RyaW5nIHRfeHNkX2dlbmVyYXRvcjo6dHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpIHsKKyAgaWYgKHR0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICByZXR1cm4gdHR5cGUtPmdldF9uYW1lKCk7CisgIH0KKworICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgcmV0dXJuIHhzZChiYXNlX3R5cGVfbmFtZSgoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCkpKTsKKyAgfQorCisgIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuIHhzZCgiaW50Iik7CisgIH0KKworICBpZiAodHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuIHR0eXBlLT5nZXRfbmFtZSgpOworICB9CisKKyAgcmV0dXJuICJjb250YWluZXIiOworfQorCisvKioKKyAqIFJldHVybnMgdGhlIFhTRCB0eXBlIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHRocmlmdCB0eXBlLgorICoKKyAqIEBwYXJhbSB0YmFzZSBUaGUgYmFzZSB0eXBlCisgKiBAcmV0dXJuIEV4cGxpY2l0IFhTRCB0eXBlLCBpLmUuIHhzZDpzdHJpbmcKKyAqLworc3RyaW5nIHRfeHNkX2dlbmVyYXRvcjo6YmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSkgeworICBzd2l0Y2ggKHRiYXNlKSB7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICByZXR1cm4gInZvaWQiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICByZXR1cm4gInN0cmluZyI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICByZXR1cm4gImJvb2xlYW4iOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIHJldHVybiAiYnl0ZSI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIHJldHVybiAic2hvcnQiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICByZXR1cm4gImludCI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgIHJldHVybiAibG9uZyI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgIHJldHVybiAiZGVjaW1hbCI7CisgIGRlZmF1bHQ6CisgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBYU0QgYmFzZSB0eXBlIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgfQorfQorCitUSFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKHhzZCwgIlhTRCIsICIiKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdGhyaWZ0LXRfcGhwX2dlbmVyYXRvci5vLWE2MGEzOGU5IGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdGhyaWZ0LXRfcGhwX2dlbmVyYXRvci5vLWE2MGEzOGU5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90aHJpZnQtdF9waHBfZ2VuZXJhdG9yLm8tYTYwYTM4ZTkKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dsb2JhbHMuaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dsb2JhbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjFjNmVmCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2xvYmFscy5oCkBAIC0wLDAgKzEsMTQxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVF9HTE9CQUxTX0gKKyNkZWZpbmUgVF9HTE9CQUxTX0gKKworI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxxdWV1ZT4KKyNpbmNsdWRlIDxzdGFjaz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8c3RyaW5nPgorCisvKioKKyAqIFRoaXMgbW9kdWxlIGNvbnRhaW5zIGFsbCB0aGUgZ2xvYmFsIHZhcmlhYmxlcyAoc2xhcCBvbiB0aGUgd3Jpc3QpIHRoYXQgYXJlCisgKiBzaGFyZWQgdGhyb3VnaG91dCB0aGUgcHJvZ3JhbS4gVGhlIHJlYXNvbiBmb3IgdGhpcyBpcyB0byBmYWNpbGl0YXRlIHNpbXBsZQorICogaW50ZXJhY3Rpb24gYmV0d2VlbiB0aGUgcGFyc2VyIGFuZCB0aGUgcmVzdCBvZiB0aGUgcHJvZ3JhbS4gQmVmb3JlIGNhbGxpbmcKKyAqIHl5cGFyc2UoKSwgdGhlIG1haW4uY2MgcHJvZ3JhbSB3aWxsIG1ha2UgbmVjZXNzYXJ5IGFkanVzdG1lbnRzIHRvIHRoZXNlCisgKiBnbG9iYWwgdmFyaWFibGVzIHN1Y2ggdGhhdCB0aGUgcGFyc2VyIGRvZXMgdGhlIHJpZ2h0IHRoaW5nIGFuZCBwdXRzIGVudHJpZXMKKyAqIGludG8gdGhlIHJpZ2h0IGNvbnRhaW5lcnMsIGV0Yy4KKyAqCisgKi8KKworLyoqCisgKiBIb29yYXkgZm9yIGZvcndhcmQgZGVjbGFyYXRpb24gb2YgdHlwZXMhCisgKi8KKworY2xhc3MgdF9wcm9ncmFtOworY2xhc3MgdF9zY29wZTsKK2NsYXNzIHRfdHlwZTsKKworLyoqCisgKiBQYXJzaW5nIG1vZGUsIHR3byBwYXNzZXMgdXAgaW4gdGhpcyBnaW4gcnVtbXkhCisgKi8KKworZW51bSBQQVJTRV9NT0RFIHsgSU5DTFVERVMgPSAxLCBQUk9HUkFNID0gMiB9OworCisvKioKKyAqIFN0cmljdG5lc3MgbGV2ZWwKKyAqLworZXh0ZXJuIGludCBnX3N0cmljdDsKKworLyoqCisgKiBUaGUgbWFzdGVyIHByb2dyYW0gcGFyc2UgdHJlZS4gVGhpcyBpcyBhY2Nlc3NlZCBmcm9tIHdpdGhpbiB0aGUgcGFyc2VyIGNvZGUKKyAqIHRvIGJ1aWxkIHVwIHRoZSBwcm9ncmFtIGVsZW1lbnRzLgorICovCitleHRlcm4gdF9wcm9ncmFtKiBnX3Byb2dyYW07CisKKy8qKgorICogVGhlIHNjb3BlIHRoYXQgd2UgYXJlIGN1cnJlbnRseSBwYXJzaW5nIGludG8KKyAqLworZXh0ZXJuIHRfc2NvcGUqIGdfc2NvcGU7CisKKy8qKgorICogVGhlIHBhcmVudCBzY29wZSB0byBhbHNvIGxvYWQgc3ltYm9scyBpbnRvCisgKi8KK2V4dGVybiB0X3Njb3BlKiBnX3BhcmVudF9zY29wZTsKKworLyoqCisgKiBUaGUgcHJlZml4IGZvciB0aGUgcGFyZW50IHNjb3BlIGVudHJpZXMKKyAqLworZXh0ZXJuIHN0ZDo6c3RyaW5nIGdfcGFyZW50X3ByZWZpeDsKKworLyoqCisgKiBUaGUgcGFyc2luZyBwYXNzIHRoYXQgd2UgYXJlIG9uLiBXZSBkbyBkaWZmZXJlbnQgdGhpbmdzIG9uIGVhY2ggcGFzcy4KKyAqLworZXh0ZXJuIFBBUlNFX01PREUgZ19wYXJzZV9tb2RlOworCisvKioKKyAqIEdsb2JhbCB0aW1lIHN0cmluZywgdXNlZCBpbiBmb3JtYXR0aW5nIGVycm9yIG1lc3NhZ2VzIGV0Yy4KKyAqLworZXh0ZXJuIGNoYXIqIGdfdGltZV9zdHI7CisKKy8qKgorICogVGhlIGxhc3QgcGFyc2VkIGRvY3RleHQgY29tbWVudC4KKyAqLworZXh0ZXJuIGNoYXIqIGdfZG9jdGV4dDsKKworLyoqCisgKiBUaGUgbG9jYXRpb24gb2YgdGhlIGxhc3QgcGFyc2VkIGRvY3RleHQgY29tbWVudC4KKyAqLworZXh0ZXJuIGludCBnX2RvY3RleHRfbGluZW5vOworCisvKioKKyAqIFN0YXR1cyBvZiBwcm9ncmFtIGxldmVsIGRvY3RleHQgY2FuZGlkYXRlCisgKi8KK2VudW0gUFJPR0RPQ1RFWFRfU1RBVFVTIHsKKyAgSU5WQUxJRCA9IDAsCisgIFNUSUxMX0NBTkRJREFURSA9IDEsICAgLy8gdGhlIHRleHQgbWF5IG9yIG1heSBub3QgYmUgdGhlIHByb2dyYW0gZG9jdGV4dAorICBBTFJFQURZX1BST0NFU1NFRCA9IDIsIC8vIGRvY3RleHQgaGFzIGJlZW4gdXNlZCBhbmQgaXMgbm8gbG9uZ2VyIGF2YWlsYWJsZQorICBBQlNPTFVURUxZX1NVUkUgPSAzLCAgIC8vIHRoaXMgaXMgdGhlIHByb2dyYW0gZG9jdGV4dAorICBOT19QUk9HUkFNX0RPQ1RFWFQgPSA0IC8vIHRoZXJlIGlzIG5vIHByb2dyYW0gZG9jdGV4dAorfTsKKworLyoqCisgKiBUaGUgcHJvZ3JhbSBsZXZlbCBkb2N0ZXh0LiBTdG9yZWQgc2VwYXJhdGVseSB0byBtYWtlIHBhcnNpbmcgZWFzaWVyLgorICovCitleHRlcm4gY2hhciogZ19wcm9ncmFtX2RvY3RleHRfY2FuZGlkYXRlOworZXh0ZXJuIGludCBnX3Byb2dyYW1fZG9jdGV4dF9saW5lbm87CitleHRlcm4gUFJPR0RPQ1RFWFRfU1RBVFVTIGdfcHJvZ3JhbV9kb2N0ZXh0X3N0YXR1czsKKworLyoqCisgKiBXaGV0aGVyIG9yIG5vdCBuZWdhdGl2ZSBmaWVsZCBrZXlzIGFyZSBhY2NlcHRlZC4KKyAqCisgKiBXaGVuIGEgZmllbGQgZG9lcyBub3QgaGF2ZSBhIHVzZXItc3BlY2lmaWVkIGtleSwgdGhyaWZ0IGF1dG9tYXRpY2FsbHkKKyAqIGFzc2lnbnMgYSBuZWdhdGl2ZSB2YWx1ZS4gIEhvd2V2ZXIsIHRoaXMgaXMgZnJhZ2lsZSBzaW5jZSBjaGFuZ2VzIHRvIHRoZQorICogZmlsZSBtYXkgdW5pbnRlbnRpb25hbGx5IGNoYW5nZSB0aGUga2V5IG51bWJlcmluZywgcmVzdWx0aW5nIGluIGEgbmV3CisgKiBwcm90b2NvbCB0aGF0IGlzIG5vdCBiYWNrd2FyZHMgY29tcGF0aWJsZS4KKyAqCisgKiBXaGVuIGdfYWxsb3dfbmVnX2ZpZWxkX2tleXMgaXMgZW5hYmxlZCwgdXNlcnMgY2FuIGV4cGxpY2l0bHkgc3BlY2lmeQorICogbmVnYXRpdmUga2V5cy4gIFRoaXMgd2F5IHRoZXkgY2FuIHdyaXRlIGEgLnRocmlmdCBmaWxlIHdpdGggZXhwbGljaXRseQorICogc3BlY2lmaWVkIGtleXMgdGhhdCBpcyBzdGlsbCBiYWNrd2FyZHMgY29tcGF0aWJsZSB3aXRoIG9sZGVyIC50aHJpZnQgZmlsZXMKKyAqIHRoYXQgZGlkIG5vdCBzcGVjaWZ5IGtleSB2YWx1ZXMuCisgKi8KK2V4dGVybiBpbnQgZ19hbGxvd19uZWdfZmllbGRfa2V5czsKKworLyoqCisgKiBXaGV0aGVyIG9yIG5vdCA2NC1iaXQgY29uc3RhbnRzIHdpbGwgZ2VuZXJhdGUgYSB3YXJuaW5nLgorICoKKyAqIFNvbWUgbGFuZ3VhZ2VzIGRvbid0IHN1cHBvcnQgNjQtYml0IGNvbnN0YW50cywgYnV0IG1hbnkgZG8sIHNvIHdlIGNhbgorICogc3VwcHJlc3MgdGhpcyB3YXJuaW5nIGZvciBwcm9qZWN0cyB0aGF0IGRvbid0IHVzZSBhbnkgbm9uLTY0LWJpdC1zYWZlCisgKiBsYW5ndWFnZXMuCisgKi8KK2V4dGVybiBpbnQgZ19hbGxvd182NGJpdF9jb25zdHM7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvbG9nZ2luZy5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2xvZ2dpbmcuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgyMWY1ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2xvZ2dpbmcuY2MKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyAqIExvZ2dpbmcgZnVuY3Rpb25zIGNvcGllZCBmcm9tIG1haW4uY2MgdG8gYXZvaWQgbGluayBlcnJvcnMgZm9yIHBsdWdpbnMKKyAqLworCisjaW5jbHVkZSAidGhyaWZ0L2xvZ2dpbmcuaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2xvYmFscy5oIgorI2luY2x1ZGUgPGNzdGRhcmc+CisjaW5jbHVkZSA8Y3N0ZGlvPgorI2luY2x1ZGUgPGNzdGRsaWI+CisKKy8vIFRPRE86IG1ha2UgcGx1Z2lucyBhY2NlcHQgbG9nIG9wdGlvbnMgZnJvbSBtYWluIGNvbXBpbGVyCitpbnQgZ19kZWJ1ZyA9IDA7CitpbnQgZ193YXJuID0gMTsKK2ludCBnX3ZlcmJvc2UgPSAwOworCit2b2lkIHBkZWJ1Zyhjb25zdCBjaGFyKiBmbXQsIC4uLikgeworICBpZiAoZ19kZWJ1ZyA9PSAwKSB7CisgICAgcmV0dXJuOworICB9CisgIHZhX2xpc3QgYXJnczsKKyAgLy8gcHJpbnRmKCJbUEFSU0U6JWRdICIsIHl5bGluZW5vKTsKKyAgdmFfc3RhcnQoYXJncywgZm10KTsKKyAgdnByaW50ZihmbXQsIGFyZ3MpOworICB2YV9lbmQoYXJncyk7CisgIHByaW50ZigiXG4iKTsKK30KKwordm9pZCBwdmVyYm9zZShjb25zdCBjaGFyKiBmbXQsIC4uLikgeworICBpZiAoZ192ZXJib3NlID09IDApIHsKKyAgICByZXR1cm47CisgIH0KKyAgdmFfbGlzdCBhcmdzOworICB2YV9zdGFydChhcmdzLCBmbXQpOworICB2cHJpbnRmKGZtdCwgYXJncyk7CisgIHZhX2VuZChhcmdzKTsKK30KKwordm9pZCBwd2FybmluZyhpbnQgbGV2ZWwsIGNvbnN0IGNoYXIqIGZtdCwgLi4uKSB7CisgIGlmIChnX3dhcm4gPCBsZXZlbCkgeworICAgIHJldHVybjsKKyAgfQorICB2YV9saXN0IGFyZ3M7CisgIC8vIHByaW50ZigiW1dBUk5JTkc6JXM6JWRdICIsIGdfY3VycGF0aC5jX3N0cigpLCB5eWxpbmVubyk7CisgIHZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisgIHZwcmludGYoZm10LCBhcmdzKTsKKyAgdmFfZW5kKGFyZ3MpOworICBwcmludGYoIlxuIik7Cit9CisKK3ZvaWQgZmFpbHVyZShjb25zdCBjaGFyKiBmbXQsIC4uLikgeworICB2YV9saXN0IGFyZ3M7CisgIC8vIGZwcmludGYoc3RkZXJyLCAiW0ZBSUxVUkU6JXM6JWRdICIsIGdfY3VycGF0aC5jX3N0cigpLCB5eWxpbmVubyk7CisgIHZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisgIHZmcHJpbnRmKHN0ZGVyciwgZm10LCBhcmdzKTsKKyAgdmFfZW5kKGFyZ3MpOworICBwcmludGYoIlxuIik7CisgIGV4aXQoMSk7Cit9CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9sb2dnaW5nLmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9sb2dnaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJlZmJmMgotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2xvZ2dpbmcuaApAQCAtMCwwICsxLDQ3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVF9MT0dHSU5HX0gKKyNkZWZpbmUgVF9MT0dHSU5HX0gKKworZXh0ZXJuIGludCBnX2RlYnVnOworZXh0ZXJuIGludCBnX3dhcm47CitleHRlcm4gaW50IGdfdmVyYm9zZTsKKworLyoqCisgKiBQYXJzZSBkZWJ1Z2dpbmcgb3V0cHV0LCB1c2VkIHRvIHByaW50IGhlbHBmdWwgaW5mbworICovCit2b2lkIHBkZWJ1Zyhjb25zdCBjaGFyKiBmbXQsIC4uLik7CisKKy8qKgorICogUGFyc2VyIHdhcm5pbmcKKyAqLwordm9pZCBwd2FybmluZyhpbnQgbGV2ZWwsIGNvbnN0IGNoYXIqIGZtdCwgLi4uKTsKKworLyoqCisgKiBQcmludCB2ZXJib3NlIG91dHB1dCBtZXNzYWdlCisgKi8KK3ZvaWQgcHZlcmJvc2UoY29uc3QgY2hhciogZm10LCAuLi4pOworCisvKioKKyAqIEZhaWx1cmUhCisgKi8KK3ZvaWQgZmFpbHVyZShjb25zdCBjaGFyKiBmbXQsIC4uLik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvbWFpbi5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L21haW4uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RjMTcxYwotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L21haW4uY2MKQEAgLTAsMCArMSwxMzA4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorICogdGhyaWZ0IC0gYSBsaWdodHdlaWdodCBjcm9zcy1sYW5ndWFnZSBycGMvc2VyaWFsaXphdGlvbiB0b29sCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBtYWluIGNvbXBpbGVyIGVuZ2luZSBmb3IgVGhyaWZ0LCB3aGljaCBpbnZva2VzIHRoZQorICogc2Nhbm5lci9wYXJzZXIgdG8gYnVpbGQgdGhlIHRocmlmdCBvYmplY3QgdHJlZS4gVGhlIGludGVyZmFjZSBnZW5lcmF0aW9uCisgKiBjb2RlIGZvciBlYWNoIGxhbmd1YWdlIGxpdmVzIGluIGEgZmlsZSBieSB0aGUgbGFuZ3VhZ2UgbmFtZSB1bmRlciB0aGUKKyAqIGdlbmVyYXRlLyBmb2xkZXIsIGFuZCBhbGwgcGFyc2Ugc3RydWN0dXJlcyBsaXZlIGluIHBhcnNlLworICoKKyAqLworCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKworI2lmZGVmIF9XSU4zMgorI2luY2x1ZGUgPHdpbmRvd3MuaD4gLyogZm9yIEdldEZ1bGxQYXRoTmFtZSAqLworI2VuZGlmCisKKy8vIENhcmVmdWw6IG11c3QgaW5jbHVkZSBnbG9iYWxzIGZpcnN0IGZvciBleHRlcm4gZGVmaW5pdGlvbnMKKyNpbmNsdWRlICJ0aHJpZnQvY29tbW9uLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dsb2JhbHMuaCIKKworI2luY2x1ZGUgInRocmlmdC9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInRocmlmdC9tYWluLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfcHJvZ3JhbS5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3Njb3BlLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmgiCisjaW5jbHVkZSAidGhyaWZ0L2F1ZGl0L3RfYXVkaXQuaCIKKyNpZmRlZiBUSFJJRlRfRU5BQkxFX1BMVUdJTgorI2luY2x1ZGUgInRocmlmdC9wbHVnaW4vcGx1Z2luX291dHB1dC5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJ0aHJpZnQvdmVyc2lvbi5oIgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCisvKioKKyAqIEdsb2JhbCBwcm9ncmFtIHRyZWUKKyAqLwordF9wcm9ncmFtKiBnX3Byb2dyYW07CisKKy8qKgorICogR2xvYmFsIHNjb3BlCisgKi8KK3Rfc2NvcGUqIGdfc2NvcGU7CisKKy8qKgorICogUGFyZW50IHNjb3BlIHRvIGFsc28gcGFyc2UgdHlwZXMKKyAqLwordF9zY29wZSogZ19wYXJlbnRfc2NvcGU7CisKKy8qKgorICogUHJlZml4IGZvciBwdXR0aW5nIHR5cGVzIGluIHBhcmVudCBzY29wZQorICovCitzdHJpbmcgZ19wYXJlbnRfcHJlZml4OworCisvKioKKyAqIFBhcnNpbmcgcGFzcworICovCitQQVJTRV9NT0RFIGdfcGFyc2VfbW9kZTsKKworLyoqCisgKiBDdXJyZW50IGRpcmVjdG9yeSBvZiBmaWxlIGJlaW5nIHBhcnNlZAorICovCitzdHJpbmcgZ19jdXJkaXI7CisKKy8qKgorICogQ3VycmVudCBmaWxlIGJlaW5nIHBhcnNlZAorICovCitzdHJpbmcgZ19jdXJwYXRoOworCisvKioKKyAqIFNlYXJjaCBwYXRoIGZvciBpbmNsdXNpb25zCisgKi8KK3ZlY3RvcjxzdHJpbmc+IGdfaW5jbF9zZWFyY2hwYXRoOworCisvKioKKyAqIEdsb2JhbCBkZWJ1ZyBzdGF0ZQorICovCitpbnQgZ19kZWJ1ZyA9IDA7CisKKy8qKgorICogU3RyaWN0bmVzcyBsZXZlbAorICovCitpbnQgZ19zdHJpY3QgPSAxMjc7CisKKy8qKgorICogV2FybmluZyBsZXZlbAorICovCitpbnQgZ193YXJuID0gMTsKKworLyoqCisgKiBWZXJib3NlIG91dHB1dAorICovCitpbnQgZ192ZXJib3NlID0gMDsKKworLyoqCisgKiBHbG9iYWwgdGltZSBzdHJpbmcKKyAqLworY2hhciogZ190aW1lX3N0cjsKKworLyoqCisgKiBUaGUgbGFzdCBwYXJzZWQgZG9jdGV4dCBjb21tZW50LgorICovCitjaGFyKiBnX2RvY3RleHQ7CisKKy8qKgorICogVGhlIEZpcnN0IGRvY3RleHQgY29tbWVudAorICovCitjaGFyKiBnX3Byb2dyYW1fZG9jdGV4dF9jYW5kaWRhdGU7CisKKy8qKgorICogV2hldGhlciBvciBub3QgbmVnYXRpdmUgZmllbGQga2V5cyBhcmUgYWNjZXB0ZWQuCisgKi8KK2ludCBnX2FsbG93X25lZ19maWVsZF9rZXlzOworCisvKioKKyAqIFdoZXRoZXIgb3Igbm90IDY0LWJpdCBjb25zdGFudHMgd2lsbCBnZW5lcmF0ZSBhIHdhcm5pbmcuCisgKi8KK2ludCBnX2FsbG93XzY0Yml0X2NvbnN0cyA9IDA7CisKKy8qKgorICogRmxhZ3MgdG8gY29udHJvbCBjb2RlIGdlbmVyYXRpb24KKyAqLworYm9vbCBnZW5fcmVjdXJzZSA9IGZhbHNlOworCisvKioKKyAqIEZsYWdzIHRvIGNvbnRyb2wgdGhyaWZ0IGF1ZGl0CisgKi8KK2Jvb2wgZ19hdWRpdCA9IGZhbHNlOworCisvKioKKyAqIEZsYWcgdG8gY29udHJvbCByZXR1cm4gc3RhdHVzCisgKi8KK2Jvb2wgZ19yZXR1cm5fZmFpbHVyZSA9IGZhbHNlOworYm9vbCBnX2F1ZGl0X2ZhdGFsID0gdHJ1ZTsKK2Jvb2wgZ19nZW5lcmF0b3JfZmFpbHVyZSA9IGZhbHNlOworCisvKioKKyAqIFdpbjMyIGRvZXNuJ3QgaGF2ZSByZWFscGF0aCwgc28gdXNlIGZhbGxiYWNrIGltcGxlbWVudGF0aW9uIGluIHRoYXQgY2FzZSwKKyAqIG90aGVyd2lzZSB0aGlzIGp1c3QgY2FsbHMgdGhyb3VnaCB0byByZWFscGF0aAorICovCitjaGFyKiBzYWZlcmVhbHBhdGgoY29uc3QgY2hhciogcGF0aCwgY2hhciogcmVzb2x2ZWRfcGF0aCkgeworI2lmZGVmIF9XSU4zMgorICBjaGFyIGJ1ZltNQVhfUEFUSF07CisgIGNoYXIqIGJhc2VuYW1lOworICBEV09SRCBsZW4gPSBHZXRGdWxsUGF0aE5hbWUocGF0aCwgTUFYX1BBVEgsIGJ1ZiwgJmJhc2VuYW1lKTsKKyAgaWYgKGxlbiA9PSAwIHx8IGxlbiA+IE1BWF9QQVRIIC0gMSkgeworICAgIHN0cmNweShyZXNvbHZlZF9wYXRoLCBwYXRoKTsKKyAgfSBlbHNlIHsKKyAgICBzdHJjcHkocmVzb2x2ZWRfcGF0aCwgYnVmKTsKKyAgfQorCisgIC8vIFJlcGxhY2UgYmFja3NsYXNoZXMgd2l0aCBmb3J3YXJkIHNsYXNoZXMgc28gdGhlCisgIC8vIHJlc3Qgb2YgdGhlIGNvZGUgYmVoYXZlcyBjb3JyZWN0bHkuCisgIHNpemVfdCByZXNvbHZlZF9sZW4gPSBzdHJsZW4ocmVzb2x2ZWRfcGF0aCk7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVzb2x2ZWRfbGVuOyBpKyspIHsKKyAgICBpZiAocmVzb2x2ZWRfcGF0aFtpXSA9PSAnXFwnKSB7CisgICAgICByZXNvbHZlZF9wYXRoW2ldID0gJy8nOworICAgIH0KKyAgfQorICByZXR1cm4gcmVzb2x2ZWRfcGF0aDsKKyNlbHNlCisgIHJldHVybiByZWFscGF0aChwYXRoLCByZXNvbHZlZF9wYXRoKTsKKyNlbmRpZgorfQorCitib29sIGNoZWNrX2lzX2RpcmVjdG9yeShjb25zdCBjaGFyKiBkaXJfbmFtZSkgeworI2lmZGVmIF9XSU4zMgorICBEV09SRCBhdHRyaWJ1dGVzID0gOjpHZXRGaWxlQXR0cmlidXRlc0EoZGlyX25hbWUpOworICBpZiAoYXR0cmlidXRlcyA9PSBJTlZBTElEX0ZJTEVfQVRUUklCVVRFUykgeworICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgIk91dHB1dCBkaXJlY3RvcnkgJXMgaXMgdW51c2FibGU6IEdldExhc3RFcnJvcigpID0gJWxkXG4iLAorICAgICAgICAgICAgZGlyX25hbWUsCisgICAgICAgICAgICBHZXRMYXN0RXJyb3IoKSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICgoYXR0cmlidXRlcyAmIEZJTEVfQVRUUklCVVRFX0RJUkVDVE9SWSkgIT0gRklMRV9BVFRSSUJVVEVfRElSRUNUT1JZKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJPdXRwdXQgZGlyZWN0b3J5ICVzIGV4aXN0cyBidXQgaXMgbm90IGEgZGlyZWN0b3J5XG4iLCBkaXJfbmFtZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworI2Vsc2UKKyAgc3RydWN0IHN0YXQgc2I7CisgIGlmIChzdGF0KGRpcl9uYW1lLCAmc2IpIDwgMCkgeworICAgIGZwcmludGYoc3RkZXJyLCAiT3V0cHV0IGRpcmVjdG9yeSAlcyBpcyB1bnVzYWJsZTogJXNcbiIsIGRpcl9uYW1lLCBzdHJlcnJvcihlcnJubykpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIVNfSVNESVIoc2Iuc3RfbW9kZSkpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIk91dHB1dCBkaXJlY3RvcnkgJXMgZXhpc3RzIGJ1dCBpcyBub3QgYSBkaXJlY3RvcnlcbiIsIGRpcl9uYW1lKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7CisjZW5kaWYKK30KKworLyoqCisgKiBSZXBvcnQgYW4gZXJyb3IgdG8gdGhlIHVzZXIuIFRoaXMgaXMgY2FsbGVkIHl5ZXJyb3IgZm9yIGhpc3RvcmljYWwKKyAqIHJlYXNvbnMgKGxleCBhbmQgeWFjYyBleHBlY3QgdGhlIGVycm9yIHJlcG9ydGluZyByb3V0aW5lIHRvIGJlIGNhbGxlZAorICogdGhpcykuIENhbGwgdGhpcyBmdW5jdGlvbiB0byByZXBvcnQgYW55IGVycm9ycyB0byB0aGUgdXNlci4KKyAqIHl5ZXJyb3IgdGFrZXMgcHJpbnRmIHN0eWxlIGFyZ3VtZW50cy4KKyAqCisgKiBAcGFyYW0gZm10IEMgZm9ybWF0IHN0cmluZyBmb2xsb3dlZCBieSBhZGRpdGlvbmFsIGFyZ3VtZW50cworICovCit2b2lkIHl5ZXJyb3IoY29uc3QgY2hhciogZm10LCAuLi4pIHsKKyAgdmFfbGlzdCBhcmdzOworICBmcHJpbnRmKHN0ZGVyciwgIltFUlJPUjolczolZF0gKGxhc3QgdG9rZW4gd2FzICclcycpXG4iLCBnX2N1cnBhdGguY19zdHIoKSwgeXlsaW5lbm8sIHl5dGV4dCk7CisKKyAgdmFfc3RhcnQoYXJncywgZm10KTsKKyAgdmZwcmludGYoc3RkZXJyLCBmbXQsIGFyZ3MpOworICB2YV9lbmQoYXJncyk7CisKKyAgZnByaW50ZihzdGRlcnIsICJcbiIpOworfQorCisvKioKKyAqIFByaW50cyBhIGRlYnVnIG1lc3NhZ2UgZnJvbSB0aGUgcGFyc2VyLgorICoKKyAqIEBwYXJhbSBmbXQgQyBmb3JtYXQgc3RyaW5nIGZvbGxvd2VkIGJ5IGFkZGl0aW9uYWwgYXJndW1lbnRzCisgKi8KK3ZvaWQgcGRlYnVnKGNvbnN0IGNoYXIqIGZtdCwgLi4uKSB7CisgIGlmIChnX2RlYnVnID09IDApIHsKKyAgICByZXR1cm47CisgIH0KKyAgdmFfbGlzdCBhcmdzOworICBwcmludGYoIltQQVJTRTolZF0gIiwgeXlsaW5lbm8pOworICB2YV9zdGFydChhcmdzLCBmbXQpOworICB2cHJpbnRmKGZtdCwgYXJncyk7CisgIHZhX2VuZChhcmdzKTsKKyAgcHJpbnRmKCJcbiIpOworfQorCisvKioKKyAqIFByaW50cyBhIHZlcmJvc2Ugb3V0cHV0IG1vZGUgbWVzc2FnZQorICoKKyAqIEBwYXJhbSBmbXQgQyBmb3JtYXQgc3RyaW5nIGZvbGxvd2VkIGJ5IGFkZGl0aW9uYWwgYXJndW1lbnRzCisgKi8KK3ZvaWQgcHZlcmJvc2UoY29uc3QgY2hhciogZm10LCAuLi4pIHsKKyAgaWYgKGdfdmVyYm9zZSA9PSAwKSB7CisgICAgcmV0dXJuOworICB9CisgIHZhX2xpc3QgYXJnczsKKyAgdmFfc3RhcnQoYXJncywgZm10KTsKKyAgdnByaW50ZihmbXQsIGFyZ3MpOworICB2YV9lbmQoYXJncyk7Cit9CisKKy8qKgorICogUHJpbnRzIGEgd2FybmluZyBtZXNzYWdlCisgKgorICogQHBhcmFtIGZtdCBDIGZvcm1hdCBzdHJpbmcgZm9sbG93ZWQgYnkgYWRkaXRpb25hbCBhcmd1bWVudHMKKyAqLwordm9pZCBwd2FybmluZyhpbnQgbGV2ZWwsIGNvbnN0IGNoYXIqIGZtdCwgLi4uKSB7CisgIGlmIChnX3dhcm4gPCBsZXZlbCkgeworICAgIHJldHVybjsKKyAgfQorICB2YV9saXN0IGFyZ3M7CisgIHByaW50ZigiW1dBUk5JTkc6JXM6JWRdICIsIGdfY3VycGF0aC5jX3N0cigpLCB5eWxpbmVubyk7CisgIHZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisgIHZwcmludGYoZm10LCBhcmdzKTsKKyAgdmFfZW5kKGFyZ3MpOworICBwcmludGYoIlxuIik7Cit9CisKKy8qKgorICogUHJpbnRzIGEgZmFpbHVyZSBtZXNzYWdlIGFuZCBleGl0cworICoKKyAqIEBwYXJhbSBmbXQgQyBmb3JtYXQgc3RyaW5nIGZvbGxvd2VkIGJ5IGFkZGl0aW9uYWwgYXJndW1lbnRzCisgKi8KK3ZvaWQgZmFpbHVyZShjb25zdCBjaGFyKiBmbXQsIC4uLikgeworICB2YV9saXN0IGFyZ3M7CisgIGZwcmludGYoc3RkZXJyLCAiW0ZBSUxVUkU6JXM6JWRdICIsIGdfY3VycGF0aC5jX3N0cigpLCB5eWxpbmVubyk7CisgIHZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisgIHZmcHJpbnRmKHN0ZGVyciwgZm10LCBhcmdzKTsKKyAgdmFfZW5kKGFyZ3MpOworICBwcmludGYoIlxuIik7CisgIGV4aXQoMSk7Cit9CisKKy8qKgorICogQ29udmVydHMgYSBzdHJpbmcgZmlsZW5hbWUgaW50byBhIHRocmlmdCBwcm9ncmFtIG5hbWUKKyAqLworc3RyaW5nIHByb2dyYW1fbmFtZShzdHJpbmcgZmlsZW5hbWUpIHsKKyAgc3RyaW5nOjpzaXplX3R5cGUgc2xhc2ggPSBmaWxlbmFtZS5yZmluZCgiLyIpOworICBpZiAoc2xhc2ggIT0gc3RyaW5nOjpucG9zKSB7CisgICAgZmlsZW5hbWUgPSBmaWxlbmFtZS5zdWJzdHIoc2xhc2ggKyAxKTsKKyAgfQorICBzdHJpbmc6OnNpemVfdHlwZSBkb3QgPSBmaWxlbmFtZS5yZmluZCgiLiIpOworICBpZiAoZG90ICE9IHN0cmluZzo6bnBvcykgeworICAgIGZpbGVuYW1lID0gZmlsZW5hbWUuc3Vic3RyKDAsIGRvdCk7CisgIH0KKyAgcmV0dXJuIGZpbGVuYW1lOworfQorCisvKioKKyAqIEdldHMgdGhlIGRpcmVjdG9yeSBwYXRoIG9mIGEgZmlsZW5hbWUKKyAqLworc3RyaW5nIGRpcmVjdG9yeV9uYW1lKHN0cmluZyBmaWxlbmFtZSkgeworICBzdHJpbmc6OnNpemVfdHlwZSBzbGFzaCA9IGZpbGVuYW1lLnJmaW5kKCIvIik7CisgIC8vIE5vIHNsYXNoLCBqdXN0IHVzZSB0aGUgY3VycmVudCBkaXJlY3RvcnkKKyAgaWYgKHNsYXNoID09IHN0cmluZzo6bnBvcykgeworICAgIHJldHVybiAiLiI7CisgIH0KKyAgcmV0dXJuIGZpbGVuYW1lLnN1YnN0cigwLCBzbGFzaCk7Cit9CisKKy8qKgorICogRmluZHMgdGhlIGFwcHJvcHJpYXRlIGZpbGUgcGF0aCBmb3IgdGhlIGdpdmVuIGZpbGVuYW1lCisgKi8KK3N0cmluZyBpbmNsdWRlX2ZpbGUoc3RyaW5nIGZpbGVuYW1lKSB7CisgIC8vIEFic29sdXRlIHBhdGg/IEp1c3QgdHJ5IHRoYXQKKyAgaWYgKGZpbGVuYW1lWzBdID09ICcvJykgeworICAgIC8vIFJlYWxwYXRoIQorICAgIGNoYXIgcnBbVEhSSUZUX1BBVEhfTUFYXTsKKyAgICAvLyBjcHBjaGVjay1zdXBwcmVzcyB1bmluaXR2YXIKKyAgICBpZiAoc2FmZXJlYWxwYXRoKGZpbGVuYW1lLmNfc3RyKCksIHJwKSA9PSBOVUxMKSB7CisgICAgICBwd2FybmluZygwLCAiQ2Fubm90IG9wZW4gaW5jbHVkZSBmaWxlICVzXG4iLCBmaWxlbmFtZS5jX3N0cigpKTsKKyAgICAgIHJldHVybiBzdGQ6OnN0cmluZygpOworICAgIH0KKworICAgIC8vIFN0YXQgdGhpcyBmaWxlCisgICAgc3RydWN0IHN0YXQgZmluZm87CisgICAgaWYgKHN0YXQocnAsICZmaW5mbykgPT0gMCkgeworICAgICAgcmV0dXJuIHJwOworICAgIH0KKyAgfSBlbHNlIHsgLy8gcmVsYXRpdmUgcGF0aCwgc3RhcnQgc2VhcmNoaW5nCisgICAgLy8gbmV3IHNlYXJjaCBwYXRoIHdpdGggY3VycmVudCBkaXIgZ2xvYmFsCisgICAgdmVjdG9yPHN0cmluZz4gc3AgPSBnX2luY2xfc2VhcmNocGF0aDsKKyAgICBzcC5pbnNlcnQoc3AuYmVnaW4oKSwgZ19jdXJkaXIpOworCisgICAgLy8gaXRlcmF0ZSB0aHJvdWdoIHBhdGhzCisgICAgdmVjdG9yPHN0cmluZz46Oml0ZXJhdG9yIGl0OworICAgIGZvciAoaXQgPSBzcC5iZWdpbigpOyBpdCAhPSBzcC5lbmQoKTsgaXQrKykgeworICAgICAgc3RyaW5nIHNmaWxlbmFtZSA9ICooaXQpICsgIi8iICsgZmlsZW5hbWU7CisKKyAgICAgIC8vIFJlYWxwYXRoIQorICAgICAgY2hhciBycFtUSFJJRlRfUEFUSF9NQVhdOworICAgICAgLy8gY3BwY2hlY2stc3VwcHJlc3MgdW5pbml0dmFyCisgICAgICBpZiAoc2FmZXJlYWxwYXRoKHNmaWxlbmFtZS5jX3N0cigpLCBycCkgPT0gTlVMTCkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgLy8gU3RhdCB0aGlzIGZpbGVzCisgICAgICBzdHJ1Y3Qgc3RhdCBmaW5mbzsKKyAgICAgIGlmIChzdGF0KHJwLCAmZmluZm8pID09IDApIHsKKyAgICAgICAgcmV0dXJuIHJwOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIFVoIG9oCisgIHB3YXJuaW5nKDAsICJDb3VsZCBub3QgZmluZCBpbmNsdWRlIGZpbGUgJXNcbiIsIGZpbGVuYW1lLmNfc3RyKCkpOworICByZXR1cm4gc3RkOjpzdHJpbmcoKTsKK30KKworLyoqCisgKiBDbGVhcnMgYW55IHByZXZpb3VzbHkgc3RvcmVkIGRvY3RleHQgc3RyaW5nLgorICogQWxzbyBwcmludHMgYSB3YXJuaW5nIGlmIHdlIGFyZSBkaXNjYXJkaW5nIGluZm9ybWF0aW9uLgorICovCit2b2lkIGNsZWFyX2RvY3RleHQoKSB7CisgIGlmIChnX2RvY3RleHQgIT0gTlVMTCkgeworICAgIHB3YXJuaW5nKDIsICJVbmNhcHR1cmVkIGRvY3RleHQgYXQgb24gbGluZSAlZC4iLCBnX2RvY3RleHRfbGluZW5vKTsKKyAgfQorICBmcmVlKGdfZG9jdGV4dCk7CisgIGdfZG9jdGV4dCA9IE5VTEw7Cit9CisKKy8qKgorICogUmVzZXQgcHJvZ3JhbSBkb2N0ZXh0IGluZm9ybWF0aW9uIGFmdGVyIHByb2Nlc3NpbmcgYSBmaWxlCisgKi8KK3ZvaWQgcmVzZXRfcHJvZ3JhbV9kb2N0ZXh0X2luZm8oKSB7CisgIGlmIChnX3Byb2dyYW1fZG9jdGV4dF9jYW5kaWRhdGUgIT0gTlVMTCkgeworICAgIGZyZWUoZ19wcm9ncmFtX2RvY3RleHRfY2FuZGlkYXRlKTsKKyAgICBnX3Byb2dyYW1fZG9jdGV4dF9jYW5kaWRhdGUgPSBOVUxMOworICB9CisgIGdfcHJvZ3JhbV9kb2N0ZXh0X2xpbmVubyA9IDA7CisgIGdfcHJvZ3JhbV9kb2N0ZXh0X3N0YXR1cyA9IElOVkFMSUQ7CisgIHBkZWJ1ZygiJXMiLCAicHJvZ3JhbSBkb2N0ZXh0IHNldCB0byBJTlZBTElEIik7Cit9CisKKy8qKgorICogV2UgYXJlIHN1cmUgdGhlIHByb2dyYW0gZG9jdGV4dCBjYW5kaWRhdGUgaXMgcmVhbGx5IHRoZSBwcm9ncmFtIGRvY3RleHQuCisgKi8KK3ZvaWQgZGVjbGFyZV92YWxpZF9wcm9ncmFtX2RvY3RleHQoKSB7CisgIGlmICgoZ19wcm9ncmFtX2RvY3RleHRfY2FuZGlkYXRlICE9IE5VTEwpICYmIChnX3Byb2dyYW1fZG9jdGV4dF9zdGF0dXMgPT0gU1RJTExfQ0FORElEQVRFKSkgeworICAgIGdfcHJvZ3JhbV9kb2N0ZXh0X3N0YXR1cyA9IEFCU09MVVRFTFlfU1VSRTsKKyAgICBwZGVidWcoIiVzIiwgInByb2dyYW0gZG9jdGV4dCBzZXQgdG8gQUJTT0xVVEVMWV9TVVJFIik7CisgIH0gZWxzZSB7CisgICAgZ19wcm9ncmFtX2RvY3RleHRfc3RhdHVzID0gTk9fUFJPR1JBTV9ET0NURVhUOworICAgIHBkZWJ1ZygiJXMiLCAicHJvZ3JhbSBkb2N0ZXh0IHNldCB0byBOT19QUk9HUkFNX0RPQ1RFWFQiKTsKKyAgfQorfQorCisvKioKKyAqIENsZWFucyB1cCB0ZXh0IGNvbW1vbmx5IGZvdW5kIGluIGRveHlnZW4tbGlrZSBjb21tZW50cworICoKKyAqIFdhcm5pbmc6IGlmIHlvdSBtaXggdGFicyBhbmQgc3BhY2VzIGluIGEgbm9uLXVuaWZvcm0gd2F5LAorICogeW91IHdpbGwgZ2V0IHdoYXQgeW91IGRlc2VydmUuCisgKi8KK2NoYXIqIGNsZWFuX3VwX2RvY3RleHQoY2hhciogZG9jdGV4dCkgeworICAvLyBDb252ZXJ0IHRvIEMrKyBzdHJpbmcsIGFuZCByZW1vdmUgV2luZG93cydzIGNhcnJpYWdlIHJldHVybnMuCisgIHN0cmluZyBkb2NzdHJpbmcgPSBkb2N0ZXh0OworICBkb2NzdHJpbmcuZXJhc2UocmVtb3ZlKGRvY3N0cmluZy5iZWdpbigpLCBkb2NzdHJpbmcuZW5kKCksICdccicpLCBkb2NzdHJpbmcuZW5kKCkpOworCisgIC8vIFNlcGFyYXRlIGludG8gbGluZXMuCisgIHZlY3RvcjxzdHJpbmc+IGxpbmVzOworICBzdHJpbmc6OnNpemVfdHlwZSBwb3MgPSBzdHJpbmc6Om5wb3M7CisgIHN0cmluZzo6c2l6ZV90eXBlIGxhc3Q7CisgIHdoaWxlICh0cnVlKSB7CisgICAgbGFzdCA9IChwb3MgPT0gc3RyaW5nOjpucG9zKSA/IDAgOiBwb3MgKyAxOworICAgIHBvcyA9IGRvY3N0cmluZy5maW5kKCdcbicsIGxhc3QpOworICAgIGlmIChwb3MgPT0gc3RyaW5nOjpucG9zKSB7CisgICAgICAvLyBGaXJzdCBiaXQgb2YgY2xlYW5pbmcuICBJZiB0aGUgbGFzdCBsaW5lIGlzIG9ubHkgd2hpdGVzcGFjZSwgZHJvcCBpdC4KKyAgICAgIHN0cmluZzo6c2l6ZV90eXBlIG5vbndoaXRlID0gZG9jc3RyaW5nLmZpbmRfZmlyc3Rfbm90X29mKCIgXHQiLCBsYXN0KTsKKyAgICAgIGlmIChub253aGl0ZSAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgbGluZXMucHVzaF9iYWNrKGRvY3N0cmluZy5zdWJzdHIobGFzdCkpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGxpbmVzLnB1c2hfYmFjayhkb2NzdHJpbmcuc3Vic3RyKGxhc3QsIHBvcyAtIGxhc3QpKTsKKyAgfQorCisgIC8vIEEgdmVyeSBwcm9mb3VuZCBkb2NzdHJpbmcuCisgIGlmIChsaW5lcy5lbXB0eSgpKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICAvLyBDbGVhciBsZWFkaW5nIHdoaXRlc3BhY2UgZnJvbSB0aGUgZmlyc3QgbGluZS4KKyAgcG9zID0gbGluZXMuZnJvbnQoKS5maW5kX2ZpcnN0X25vdF9vZigiIFx0Iik7CisgIGxpbmVzLmZyb250KCkuZXJhc2UoMCwgcG9zKTsKKworICAvLyBJZiBldmVyeSBub25ibGFuayBsaW5lIGFmdGVyIHRoZSBmaXJzdCBoYXMgdGhlIHNhbWUgbnVtYmVyIG9mIHNwYWNlcy90YWJzLAorICAvLyB0aGVuIGEgc3RhciwgcmVtb3ZlIHRoZW0uCisgIGJvb2wgaGF2ZV9wcmVmaXggPSB0cnVlOworICBib29sIGZvdW5kX3ByZWZpeCA9IGZhbHNlOworICBzdHJpbmc6OnNpemVfdHlwZSBwcmVmaXhfbGVuID0gMDsKKyAgdmVjdG9yPHN0cmluZz46Oml0ZXJhdG9yIGxfaXRlcjsKKyAgZm9yIChsX2l0ZXIgPSBsaW5lcy5iZWdpbigpICsgMTsgbF9pdGVyICE9IGxpbmVzLmVuZCgpOyArK2xfaXRlcikgeworICAgIGlmIChsX2l0ZXItPmVtcHR5KCkpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIHBvcyA9IGxfaXRlci0+ZmluZF9maXJzdF9ub3Rfb2YoIiBcdCIpOworICAgIGlmICghZm91bmRfcHJlZml4KSB7CisgICAgICBpZiAocG9zICE9IHN0cmluZzo6bnBvcykgeworICAgICAgICBpZiAobF9pdGVyLT5hdChwb3MpID09ICcqJykgeworICAgICAgICAgIGZvdW5kX3ByZWZpeCA9IHRydWU7CisgICAgICAgICAgcHJlZml4X2xlbiA9IHBvczsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBoYXZlX3ByZWZpeCA9IGZhbHNlOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBXaGl0ZXNwYWNlLW9ubHkgbGluZS4gIFRydW5jYXRlIGl0LgorICAgICAgICBsX2l0ZXItPmNsZWFyKCk7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChsX2l0ZXItPnNpemUoKSA+IHBvcyAmJiBsX2l0ZXItPmF0KHBvcykgPT0gJyonICYmIHBvcyA9PSBwcmVmaXhfbGVuKSB7CisgICAgICAvLyBCdXNpbmVzcyBhcyB1c3VhbC4KKyAgICB9IGVsc2UgaWYgKHBvcyA9PSBzdHJpbmc6Om5wb3MpIHsKKyAgICAgIC8vIFdoaXRlc3BhY2Utb25seSBsaW5lLiAgTGV0J3MgdHJ1bmNhdGUgaXQgZm9yIHRoZW0uCisgICAgICBsX2l0ZXItPmNsZWFyKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFRoZSBwYXR0ZXJuIGhhcyBiZWVuIGJyb2tlbi4KKyAgICAgIGhhdmVfcHJlZml4ID0gZmFsc2U7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICAvLyBJZiBvdXIgcHJlZml4IHN1cnZpdmVkLCBkZWxldGUgaXQgZnJvbSBldmVyeSBsaW5lLgorICBpZiAoaGF2ZV9wcmVmaXgpIHsKKyAgICAvLyBHZXQgdGhlIHN0YXIgdG9vLgorICAgIHByZWZpeF9sZW4rKzsKKyAgICBmb3IgKGxfaXRlciA9IGxpbmVzLmJlZ2luKCkgKyAxOyBsX2l0ZXIgIT0gbGluZXMuZW5kKCk7ICsrbF9pdGVyKSB7CisgICAgICBsX2l0ZXItPmVyYXNlKDAsIHByZWZpeF9sZW4pOworICAgIH0KKyAgfQorCisgIC8vIE5vdyBkZWxldGUgdGhlIG1pbmltdW0gYW1vdW50IG9mIGxlYWRpbmcgd2hpdGVzcGFjZSBmcm9tIGVhY2ggbGluZS4KKyAgcHJlZml4X2xlbiA9IHN0cmluZzo6bnBvczsKKyAgZm9yIChsX2l0ZXIgPSBsaW5lcy5iZWdpbigpICsgMTsgbF9pdGVyICE9IGxpbmVzLmVuZCgpOyArK2xfaXRlcikgeworICAgIGlmIChsX2l0ZXItPmVtcHR5KCkpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBwb3MgPSBsX2l0ZXItPmZpbmRfZmlyc3Rfbm90X29mKCIgXHQiKTsKKyAgICBpZiAocG9zICE9IHN0cmluZzo6bnBvcyAmJiAocHJlZml4X2xlbiA9PSBzdHJpbmc6Om5wb3MgfHwgcG9zIDwgcHJlZml4X2xlbikpIHsKKyAgICAgIHByZWZpeF9sZW4gPSBwb3M7CisgICAgfQorICB9CisKKyAgLy8gSWYgb3VyIHByZWZpeCBzdXJ2aXZlZCwgZGVsZXRlIGl0IGZyb20gZXZlcnkgbGluZS4KKyAgaWYgKHByZWZpeF9sZW4gIT0gc3RyaW5nOjpucG9zKSB7CisgICAgZm9yIChsX2l0ZXIgPSBsaW5lcy5iZWdpbigpICsgMTsgbF9pdGVyICE9IGxpbmVzLmVuZCgpOyArK2xfaXRlcikgeworICAgICAgbF9pdGVyLT5lcmFzZSgwLCBwcmVmaXhfbGVuKTsKKyAgICB9CisgIH0KKworICAvLyBSZW1vdmUgdHJhaWxpbmcgd2hpdGVzcGFjZSBmcm9tIGV2ZXJ5IGxpbmUuCisgIGZvciAobF9pdGVyID0gbGluZXMuYmVnaW4oKTsgbF9pdGVyICE9IGxpbmVzLmVuZCgpOyArK2xfaXRlcikgeworICAgIHBvcyA9IGxfaXRlci0+ZmluZF9sYXN0X25vdF9vZigiIFx0Iik7CisgICAgaWYgKHBvcyAhPSBzdHJpbmc6Om5wb3MgJiYgcG9zICE9IGxfaXRlci0+bGVuZ3RoKCkgLSAxKSB7CisgICAgICBsX2l0ZXItPmVyYXNlKHBvcyArIDEpOworICAgIH0KKyAgfQorCisgIC8vIElmIHRoZSBmaXJzdCBsaW5lIGlzIGVtcHR5LCByZW1vdmUgaXQuCisgIC8vIERvbid0IGRvIHRoaXMgZWFybGllciBiZWNhdXNlIGEgbG90IG9mIHN0ZXBzIHNraXAgdGhlIGZpcnN0IGxpbmUuCisgIGlmIChsaW5lcy5mcm9udCgpLmVtcHR5KCkpIHsKKyAgICBsaW5lcy5lcmFzZShsaW5lcy5iZWdpbigpKTsKKyAgfQorCisgIC8vIE5vdyByZWpvaW4gdGhlIGxpbmVzIGFuZCBjb3B5IHRoZW0gYmFjayBpbnRvIGRvY3RleHQuCisgIGRvY3N0cmluZy5jbGVhcigpOworICBmb3IgKGxfaXRlciA9IGxpbmVzLmJlZ2luKCk7IGxfaXRlciAhPSBsaW5lcy5lbmQoKTsgKytsX2l0ZXIpIHsKKyAgICBkb2NzdHJpbmcgKz0gKmxfaXRlcjsKKyAgICBkb2NzdHJpbmcgKz0gJ1xuJzsKKyAgfQorCisgIC8vIGFzc2VydChkb2NzdHJpbmcubGVuZ3RoKCkgPD0gc3RybGVuKGRvY3RleHQpKTsgIG1heSBoYXBwZW4sIHNlZSBUSFJJRlQtMTc1NQorICBpZiAoZG9jc3RyaW5nLmxlbmd0aCgpIDw9IHN0cmxlbihkb2N0ZXh0KSkgeworICAgIHN0cmNweShkb2N0ZXh0LCBkb2NzdHJpbmcuY19zdHIoKSk7CisgIH0gZWxzZSB7CisgICAgZnJlZShkb2N0ZXh0KTsgLy8gdG9vIHNob3J0CisgICAgZG9jdGV4dCA9IHN0cmR1cChkb2NzdHJpbmcuY19zdHIoKSk7CisgIH0KKyAgcmV0dXJuIGRvY3RleHQ7Cit9CisKKy8qKiBTZXQgdG8gdHJ1ZSB0byBkZWJ1ZyBkb2NzdHJpbmcgcGFyc2luZyAqLworc3RhdGljIGJvb2wgZHVtcF9kb2NzID0gZmFsc2U7CisKKy8qKgorICogRHVtcHMgZG9jc3RyaW5ncyB0byBzdGRvdXQKKyAqIE9ubHkgd29ya3MgZm9yIHRvcC1sZXZlbCBkZWZpbml0aW9ucyBhbmQgdGhlIHdob2xlIHByb2dyYW0gZG9jCisgKiAoaS5lLiwgbm90IGVudW0gY29uc3RhbnRzLCBzdHJ1Y3QgZmllbGRzLCBvciBmdW5jdGlvbnMuCisgKi8KK3ZvaWQgZHVtcF9kb2NzdHJpbmdzKHRfcHJvZ3JhbSogcHJvZ3JhbSkgeworICBzdHJpbmcgcHJvZ2RvYyA9IHByb2dyYW0tPmdldF9kb2MoKTsKKyAgaWYgKCFwcm9nZG9jLmVtcHR5KCkpIHsKKyAgICBwcmludGYoIldob2xlIHByb2dyYW0gZG9jOlxuJXNcbiIsIHByb2dkb2MuY19zdHIoKSk7CisgIH0KKyAgY29uc3QgdmVjdG9yPHRfdHlwZWRlZio+JiB0eXBlZGVmcyA9IHByb2dyYW0tPmdldF90eXBlZGVmcygpOworICB2ZWN0b3I8dF90eXBlZGVmKj46OmNvbnN0X2l0ZXJhdG9yIHRfaXRlcjsKKyAgZm9yICh0X2l0ZXIgPSB0eXBlZGVmcy5iZWdpbigpOyB0X2l0ZXIgIT0gdHlwZWRlZnMuZW5kKCk7ICsrdF9pdGVyKSB7CisgICAgdF90eXBlZGVmKiB0ZCA9ICp0X2l0ZXI7CisgICAgaWYgKHRkLT5oYXNfZG9jKCkpIHsKKyAgICAgIHByaW50ZigidHlwZWRlZiAlczpcbiVzXG4iLCB0ZC0+Z2V0X25hbWUoKS5jX3N0cigpLCB0ZC0+Z2V0X2RvYygpLmNfc3RyKCkpOworICAgIH0KKyAgfQorICBjb25zdCB2ZWN0b3I8dF9lbnVtKj4mIGVudW1zID0gcHJvZ3JhbS0+Z2V0X2VudW1zKCk7CisgIHZlY3Rvcjx0X2VudW0qPjo6Y29uc3RfaXRlcmF0b3IgZV9pdGVyOworICBmb3IgKGVfaXRlciA9IGVudW1zLmJlZ2luKCk7IGVfaXRlciAhPSBlbnVtcy5lbmQoKTsgKytlX2l0ZXIpIHsKKyAgICB0X2VudW0qIGVuID0gKmVfaXRlcjsKKyAgICBpZiAoZW4tPmhhc19kb2MoKSkgeworICAgICAgcHJpbnRmKCJlbnVtICVzOlxuJXNcbiIsIGVuLT5nZXRfbmFtZSgpLmNfc3RyKCksIGVuLT5nZXRfZG9jKCkuY19zdHIoKSk7CisgICAgfQorICB9CisgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0Kj4mIGNvbnN0cyA9IHByb2dyYW0tPmdldF9jb25zdHMoKTsKKyAgdmVjdG9yPHRfY29uc3QqPjo6Y29uc3RfaXRlcmF0b3IgY19pdGVyOworICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgeworICAgIHRfY29uc3QqIGNvID0gKmNfaXRlcjsKKyAgICBpZiAoY28tPmhhc19kb2MoKSkgeworICAgICAgcHJpbnRmKCJjb25zdCAlczpcbiVzXG4iLCBjby0+Z2V0X25hbWUoKS5jX3N0cigpLCBjby0+Z2V0X2RvYygpLmNfc3RyKCkpOworICAgIH0KKyAgfQorICBjb25zdCB2ZWN0b3I8dF9zdHJ1Y3QqPiYgc3RydWN0cyA9IHByb2dyYW0tPmdldF9zdHJ1Y3RzKCk7CisgIHZlY3Rvcjx0X3N0cnVjdCo+Ojpjb25zdF9pdGVyYXRvciBzX2l0ZXI7CisgIGZvciAoc19pdGVyID0gc3RydWN0cy5iZWdpbigpOyBzX2l0ZXIgIT0gc3RydWN0cy5lbmQoKTsgKytzX2l0ZXIpIHsKKyAgICB0X3N0cnVjdCogc3QgPSAqc19pdGVyOworICAgIGlmIChzdC0+aGFzX2RvYygpKSB7CisgICAgICBwcmludGYoInN0cnVjdCAlczpcbiVzXG4iLCBzdC0+Z2V0X25hbWUoKS5jX3N0cigpLCBzdC0+Z2V0X2RvYygpLmNfc3RyKCkpOworICAgIH0KKyAgfQorICBjb25zdCB2ZWN0b3I8dF9zdHJ1Y3QqPiYgeGNlcHRpb25zID0gcHJvZ3JhbS0+Z2V0X3hjZXB0aW9ucygpOworICB2ZWN0b3I8dF9zdHJ1Y3QqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgIHRfc3RydWN0KiB4biA9ICp4X2l0ZXI7CisgICAgaWYgKHhuLT5oYXNfZG9jKCkpIHsKKyAgICAgIHByaW50ZigieGNlcHRpb24gJXM6XG4lc1xuIiwgeG4tPmdldF9uYW1lKCkuY19zdHIoKSwgeG4tPmdldF9kb2MoKS5jX3N0cigpKTsKKyAgICB9CisgIH0KKyAgY29uc3QgdmVjdG9yPHRfc2VydmljZSo+JiBzZXJ2aWNlcyA9IHByb2dyYW0tPmdldF9zZXJ2aWNlcygpOworICB2ZWN0b3I8dF9zZXJ2aWNlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgZm9yICh2X2l0ZXIgPSBzZXJ2aWNlcy5iZWdpbigpOyB2X2l0ZXIgIT0gc2VydmljZXMuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgdF9zZXJ2aWNlKiBzdiA9ICp2X2l0ZXI7CisgICAgaWYgKHN2LT5oYXNfZG9jKCkpIHsKKyAgICAgIHByaW50Zigic2VydmljZSAlczpcbiVzXG4iLCBzdi0+Z2V0X25hbWUoKS5jX3N0cigpLCBzdi0+Z2V0X2RvYygpLmNfc3RyKCkpOworICAgIH0KKyAgfQorfQorCisvKioKKyAqIEVtaXRzIGEgd2FybmluZyBvbiBsaXN0PGJ5dGU+LCBiaW5hcnkgdHlwZSBpcyB0eXBpY2FsbHkgYSBtdWNoIGJldHRlciBjaG9pY2UuCisgKi8KK3ZvaWQgY2hlY2tfZm9yX2xpc3Rfb2ZfYnl0ZXModF90eXBlKiBsaXN0X2VsZW1fdHlwZSkgeworICBpZiAoKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSAmJiAobGlzdF9lbGVtX3R5cGUgIT0gTlVMTCkgJiYgbGlzdF9lbGVtX3R5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGUqIHRiYXNlID0gKHRfYmFzZV90eXBlKilsaXN0X2VsZW1fdHlwZTsKKyAgICBpZiAodGJhc2UtPmdldF9iYXNlKCkgPT0gdF9iYXNlX3R5cGU6OlRZUEVfSTgpIHsKKyAgICAgIHB3YXJuaW5nKDEsICJDb25zaWRlciB1c2luZyB0aGUgbW9yZSBlZmZpY2llbnQgXCJiaW5hcnlcIiB0eXBlIGluc3RlYWQgb2YgXCJsaXN0PGJ5dGU+XCIuIik7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyBib29sIGdfYnl0ZV93YXJuaW5nX2VtaXR0ZWQgPSBmYWxzZTsKKworLyoqCisgKiBFbWl0cyBhIG9uZS10aW1lIHdhcm5pbmcgb24gYnl0ZSB0eXBlLCBwcm9tb3RpbmcgdGhlIG5ldyBpOCB0eXBlIGluc3RlYWQKKyAqLwordm9pZCBlbWl0X2J5dGVfdHlwZV93YXJuaW5nKCkgeworICBpZiAoIWdfYnl0ZV93YXJuaW5nX2VtaXR0ZWQpIHsKKyAgICBwd2FybmluZygxLAorICAgICAgICAgICAgICJUaGUgXCJieXRlXCIgdHlwZSBpcyBhIGNvbXBhdGliaWxpdHkgYWxpYXMgZm9yIFwiaThcIi4gVXNlIFwiaThcIiB0byBlbXBoYXNpemUgdGhlICIKKyAgICAgICAgICAgICAic2lnbmVkbmVzcyBvZiB0aGlzIHR5cGUuXG4iKTsKKyAgICBnX2J5dGVfd2FybmluZ19lbWl0dGVkID0gdHJ1ZTsKKyAgfQorfQorCisvKioKKyAqIFByaW50cyBkZXByZWNhdGlvbiBub3RpY2UgZm9yIG9sZCBOUyBkZWNsYXJhdGlvbnMgdGhhdCBhcmUgbm8gbG9uZ2VyIHN1cHBvcnRlZAorICogSWYgbmV3X2Zvcm0gaXMgTlVMTCwgb2xkX2Zvcm0gaXMgYXNzdW1lZCB0byBiZSBhIGxhbmd1YWdlIGlkZW50aWZpZXIsIHN1Y2ggYXMgImNwcCIKKyAqIElmIG5ld19mb3JtIGlzIG5vdCBOVUxMLCBib3RoIGFyZ3VtZW50cyBhcmUgdXNlZCBleGFjdGx5IGFzIGdpdmVuCisgKi8KK3ZvaWQgZXJyb3JfdW5zdXBwb3J0ZWRfbmFtZXNwYWNlX2RlY2woY29uc3QgY2hhciogb2xkX2Zvcm0sIGNvbnN0IGNoYXIqIG5ld19mb3JtKSB7CisgIGNvbnN0IGNoYXIqIHJlbWFpbmRlciA9ICIiOworICBpZiggbmV3X2Zvcm0gPT0gTlVMTCkgeworICAgIG5ld19mb3JtID0gb2xkX2Zvcm07CisgICAgcmVtYWluZGVyID0gIl9uYW1lc3BhY2UiOworICB9CisgIGZhaWx1cmUoIlVuc3VwcG9ydGVkIGRlY2xhcmF0aW9uICclcyVzJy4gVXNlICduYW1lc3BhY2UgJXMnIGluc3RlYWQuIiwgb2xkX2Zvcm0sIHJlbWFpbmRlciwgbmV3X2Zvcm0pOworfQorCisvKioKKyAqIFByaW50cyB0aGUgdmVyc2lvbiBudW1iZXIKKyAqLwordm9pZCB2ZXJzaW9uKCkgeworICBwcmludGYoIlRocmlmdCB2ZXJzaW9uICVzXG4iLCBUSFJJRlRfVkVSU0lPTik7Cit9CisKKy8qKgorICogRGlzcGxheSB0aGUgdXNhZ2UgbWVzc2FnZSBhbmQgdGhlbiBleGl0IHdpdGggYW4gZXJyb3IgY29kZS4KKyAqLwordm9pZCB1c2FnZSgpIHsKKyAgZnByaW50ZihzdGRlcnIsICJVc2FnZTogdGhyaWZ0IFtvcHRpb25zXSBmaWxlXG5cbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIlVzZSB0aHJpZnQgLWhlbHAgZm9yIGEgbGlzdCBvZiBvcHRpb25zXG4iKTsKKyAgZXhpdCgxKTsKK30KKworLyoqCisgKiBEaXBsYXlzIHRoZSBoZWxwIG1lc3NhZ2UgYW5kIHRoZW4gZXhpdHMgd2l0aCBhbiBlcnJvciBjb2RlLgorICovCit2b2lkIGhlbHAoKSB7CisgIGZwcmludGYoc3RkZXJyLCAiVXNhZ2U6IHRocmlmdCBbb3B0aW9uc10gZmlsZVxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiT3B0aW9uczpcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgLXZlcnNpb24gICAgUHJpbnQgdGhlIGNvbXBpbGVyIHZlcnNpb25cbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgLW8gZGlyICAgICAgU2V0IHRoZSBvdXRwdXQgZGlyZWN0b3J5IGZvciBnZW4tKiBwYWNrYWdlc1xuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICAgICAgKGRlZmF1bHQ6IGN1cnJlbnQgZGlyZWN0b3J5KVxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAtb3V0IGRpciAgICBTZXQgdGhlIG91cHV0IGxvY2F0aW9uIGZvciBnZW5lcmF0ZWQgZmlsZXMuXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICAgICAobm8gZ2VuLSogZm9sZGVyIHdpbGwgYmUgY3JlYXRlZClcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgLUkgZGlyICAgICAgQWRkIGEgZGlyZWN0b3J5IHRvIHRoZSBsaXN0IG9mIGRpcmVjdG9yaWVzXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICAgICAgc2VhcmNoZWQgZm9yIGluY2x1ZGUgZGlyZWN0aXZlc1xuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAtbm93YXJuICAgICBTdXBwcmVzcyBhbGwgY29tcGlsZXIgd2FybmluZ3MgKEJBRCEpXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgIC1zdHJpY3QgICAgIFN0cmljdCBjb21waWxlciB3YXJuaW5ncyBvblxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAtdltlcmJvc2VdICBWZXJib3NlIG1vZGVcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgLXJbZWN1cnNlXSAgQWxzbyBnZW5lcmF0ZSBpbmNsdWRlZCBmaWxlc1xuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAtZGVidWcgICAgICBQYXJzZSBkZWJ1ZyB0cmFjZSB0byBzdGRvdXRcbiIpOworICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAiICAtLWFsbG93LW5lZy1rZXlzICBBbGxvdyBuZWdhdGl2ZSBmaWVsZCBrZXlzIChVc2VkIHRvICIKKyAgICAgICAgICAicHJlc2VydmUgcHJvdG9jb2xcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgICBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgLnRocmlmdCBmaWxlcylcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgLS1hbGxvdy02NGJpdC1jb25zdHMgIERvIG5vdCBwcmludCB3YXJuaW5ncyBhYm91dCB1c2luZyA2NC1iaXQgY29uc3RhbnRzXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgIC0tZ2VuIFNUUiAgIEdlbmVyYXRlIGNvZGUgd2l0aCBhIGR5bmFtaWNhbGx5LXJlZ2lzdGVyZWQgZ2VuZXJhdG9yLlxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICAgICAgIFNUUiBoYXMgdGhlIGZvcm0gbGFuZ3VhZ2VbOmtleTE9dmFsMVssa2V5Mlssa2V5Mz12YWwzXV1dLlxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICAgICAgIEtleXMgYW5kIHZhbHVlcyBhcmUgb3B0aW9ucyBwYXNzZWQgdG8gdGhlIGdlbmVyYXRvci5cbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgICBNYW55IG9wdGlvbnMgd2lsbCBub3QgcmVxdWlyZSB2YWx1ZXMuXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICJcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIk9wdGlvbnMgcmVsYXRlZCB0byBhdWRpdCBvcGVyYXRpb25cbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgIC0tYXVkaXQgT2xkRmlsZSAgIE9sZCBUaHJpZnQgZmlsZSB0byBiZSBhdWRpdGVkIHdpdGggJ2ZpbGUnXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgIC1Jb2xkIGRpciAgICBBZGQgYSBkaXJlY3RvcnkgdG8gdGhlIGxpc3Qgb2YgZGlyZWN0b3JpZXNcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgICBzZWFyY2hlZCBmb3IgaW5jbHVkZSBkaXJlY3RpdmVzIGZvciBvbGQgdGhyaWZ0IGZpbGVcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgLUluZXcgZGlyICAgIEFkZCBhIGRpcmVjdG9yeSB0byB0aGUgbGlzdCBvZiBkaXJlY3Rvcmllc1xuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICAgICAgIHNlYXJjaGVkIGZvciBpbmNsdWRlIGRpcmVjdGl2ZXMgZm9yIG5ldyB0aHJpZnQgZmlsZVxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICJBdmFpbGFibGUgZ2VuZXJhdG9ycyAoYW5kIG9wdGlvbnMpOlxuIik7CisKKyAgdF9nZW5lcmF0b3JfcmVnaXN0cnk6Omdlbl9tYXBfdCBnZW5fbWFwID0gdF9nZW5lcmF0b3JfcmVnaXN0cnk6OmdldF9nZW5lcmF0b3JfbWFwKCk7CisgIHRfZ2VuZXJhdG9yX3JlZ2lzdHJ5OjpnZW5fbWFwX3Q6Oml0ZXJhdG9yIGl0ZXI7CisgIGZvciAoaXRlciA9IGdlbl9tYXAuYmVnaW4oKTsgaXRlciAhPSBnZW5fbWFwLmVuZCgpOyArK2l0ZXIpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICIgICVzICglcyk6XG4iLAorICAgICAgICAgICAgaXRlci0+c2Vjb25kLT5nZXRfc2hvcnRfbmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgICBpdGVyLT5zZWNvbmQtPmdldF9sb25nX25hbWUoKS5jX3N0cigpKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiVzIiwgaXRlci0+c2Vjb25kLT5nZXRfZG9jdW1lbnRhdGlvbigpLmNfc3RyKCkpOworICB9CisgIGV4aXQoMSk7Cit9CisKKy8qKgorICogWW91IGtub3csIHdoZW4gSSBzdGFydGVkIHdvcmtpbmcgb24gVGhyaWZ0IEkgcmVhbGx5IHRob3VnaHQgaXQgd2Fzbid0IGdvaW5nCisgKiB0byBiZWNvbWUgYSBwcm9ncmFtbWluZyBsYW5ndWFnZSBiZWNhdXNlIGl0IHdhcyBqdXN0IGEgZ2VuZXJhdG9yIGFuZCBpdAorICogd291bGRuJ3QgbmVlZCBydW50aW1lIHR5cGUgaW5mb3JtYXRpb24gYW5kIGFsbCB0aGF0IGphenouIEJ1dCB0aGVuIHdlCisgKiBkZWNpZGVkIHRvIGFkZCBjb25zdGFudHMsIGFuZCBhbGwgb2YgYSBzdWRkZW4gdGhhdCBtZWFucyBydW50aW1lIHR5cGUKKyAqIHZhbGlkYXRpb24gYW5kIGluZmVyZW5jZSwgZXhjZXB0IHRoZSAicnVudGltZSIgaXMgdGhlIGNvZGUgZ2VuZXJhdG9yCisgKiBydW50aW1lLgorICovCit2b2lkIHZhbGlkYXRlX2NvbnN0X3JlYyhzdGQ6OnN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7CisgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyAidHlwZSBlcnJvcjogY2Fubm90IGRlY2xhcmUgYSB2b2lkIGNvbnN0OiAiICsgbmFtZTsKKyAgfQorCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgIT0gdF9jb25zdF92YWx1ZTo6Q1ZfU1RSSU5HKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiBjb25zdCBcIiIgKyBuYW1lICsgIlwiIHdhcyBkZWNsYXJlZCBhcyBzdHJpbmciOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpICE9IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKKyAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6IGNvbnN0IFwiIiArIG5hbWUgKyAiXCIgd2FzIGRlY2xhcmVkIGFzIGJvb2wiOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSAhPSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiBjb25zdCBcIiIgKyBuYW1lICsgIlwiIHdhcyBkZWNsYXJlZCBhcyBieXRlIjsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpICE9IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKKyAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6IGNvbnN0IFwiIiArIG5hbWUgKyAiXCIgd2FzIGRlY2xhcmVkIGFzIGkxNiI7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSAhPSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiBjb25zdCBcIiIgKyBuYW1lICsgIlwiIHdhcyBkZWNsYXJlZCBhcyBpMzIiOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgIT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgeworICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogY29uc3QgXCIiICsgbmFtZSArICJcIiB3YXMgZGVjbGFyZWQgYXMgaTY0IjsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpICE9IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIKKyAgICAgICAgICAmJiB2YWx1ZS0+Z2V0X3R5cGUoKSAhPSB0X2NvbnN0X3ZhbHVlOjpDVl9ET1VCTEUpIHsKKyAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6IGNvbnN0IFwiIiArIG5hbWUgKyAiXCIgd2FzIGRlY2xhcmVkIGFzIGRvdWJsZSI7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSkgKyBuYW1lOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgIT0gdF9jb25zdF92YWx1ZTo6Q1ZfSURFTlRJRklFUikgeworICAgICAgdGhyb3cgInR5cGUgZXJyb3I6IGNvbnN0IFwiIiArIG5hbWUgKyAiXCIgd2FzIGRlY2xhcmVkIGFzIGVudW0iOworICAgIH0KKworICAgIC8vIHNlZSBpZiB0aGVyZSdzIGEgZG90IGluIHRoZSBpZGVudGlmaWVyCisgICAgc3RkOjpzdHJpbmcgbmFtZV9wb3J0aW9uID0gdmFsdWUtPmdldF9pZGVudGlmaWVyX25hbWUoKTsKKworICAgIGNvbnN0IHZlY3Rvcjx0X2VudW1fdmFsdWUqPiYgZW51bV92YWx1ZXMgPSAoKHRfZW51bSopdHlwZSktPmdldF9jb25zdGFudHMoKTsKKyAgICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIGNfaXRlcjsKKyAgICBib29sIGZvdW5kID0gZmFsc2U7CisKKyAgICBmb3IgKGNfaXRlciA9IGVudW1fdmFsdWVzLmJlZ2luKCk7IGNfaXRlciAhPSBlbnVtX3ZhbHVlcy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICAgIGlmICgoKmNfaXRlciktPmdldF9uYW1lKCkgPT0gbmFtZV9wb3J0aW9uKSB7CisgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIGlmICghZm91bmQpIHsKKyAgICAgIHRocm93ICJ0eXBlIGVycm9yOiBjb25zdCAiICsgbmFtZSArICIgd2FzIGRlY2xhcmVkIGFzIHR5cGUgIiArIHR5cGUtPmdldF9uYW1lKCkKKyAgICAgICAgICArICIgd2hpY2ggaXMgYW4gZW51bSwgYnV0ICIgKyB2YWx1ZS0+Z2V0X2lkZW50aWZpZXIoKQorICAgICAgICAgICsgIiBpcyBub3QgYSB2YWxpZCB2YWx1ZSBmb3IgdGhhdCBlbnVtIjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSAhPSB0X2NvbnN0X3ZhbHVlOjpDVl9NQVApIHsKKyAgICAgIHRocm93ICJ0eXBlIGVycm9yOiBjb25zdCBcIiIgKyBuYW1lICsgIlwiIHdhcyBkZWNsYXJlZCBhcyBzdHJ1Y3QveGNlcHRpb24iOworICAgIH0KKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBpZiAodl9pdGVyLT5maXJzdC0+Z2V0X3R5cGUoKSAhPSB0X2NvbnN0X3ZhbHVlOjpDVl9TVFJJTkcpIHsKKyAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyBuYW1lICsgIiBzdHJ1Y3Qga2V5IG11c3QgYmUgc3RyaW5nIjsKKyAgICAgIH0KKyAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7CisgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgeworICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKKyAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKKyAgICAgIH0KKworICAgICAgdmFsaWRhdGVfY29uc3RfcmVjKG5hbWUgKyAiLiIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCksIGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICB0X3R5cGUqIGtfdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICB0X3R5cGUqIHZfdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICB2YWxpZGF0ZV9jb25zdF9yZWMobmFtZSArICI8a2V5PiIsIGtfdHlwZSwgdl9pdGVyLT5maXJzdCk7CisgICAgICB2YWxpZGF0ZV9jb25zdF9yZWMobmFtZSArICI8dmFsPiIsIHZfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3R5cGUqIGVfdHlwZTsKKyAgICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICBlX3R5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9IGVsc2UgeworICAgICAgZV90eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9CisgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICB2YWxpZGF0ZV9jb25zdF9yZWMobmFtZSArICI8ZWxlbT4iLCBlX3R5cGUsICp2X2l0ZXIpOworICAgIH0KKyAgfQorfQorCisvKioKKyAqIENoZWNrIHNpbXBsZSBpZGVudGlmaWVyIG5hbWVzCisgKiBJdCdzIGVhc2llciB0byBkbyBpdCB0aGlzIHdheSBpbnN0ZWFkIG9mIHJld3JpdGluZyB0aGUgd2hvbGUgZ3JhbW1hciBldGMuCisgKi8KK3ZvaWQgdmFsaWRhdGVfc2ltcGxlX2lkZW50aWZpZXIoY29uc3QgY2hhciogaWRlbnRpZmllcikgeworICBzdHJpbmcgbmFtZShpZGVudGlmaWVyKTsKKyAgaWYgKG5hbWUuZmluZCgiLiIpICE9IHN0cmluZzo6bnBvcykgeworICAgIHl5ZXJyb3IoIklkZW50aWZpZXIgJXMgY2FuJ3QgaGF2ZSBhIGRvdC4iLCBpZGVudGlmaWVyKTsKKyAgICBleGl0KDEpOworICB9Cit9CisKKy8qKgorICogQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHBhcnNlZCBjb25zdCBpbmZvcm1hdGlvbiBhZ2FpbnN0IGl0cyBkZWNsYXJlZCB0eXBlCisgKi8KK3ZvaWQgdmFsaWRhdGVfY29uc3RfdHlwZSh0X2NvbnN0KiBjKSB7CisgIHZhbGlkYXRlX2NvbnN0X3JlYyhjLT5nZXRfbmFtZSgpLCBjLT5nZXRfdHlwZSgpLCBjLT5nZXRfdmFsdWUoKSk7Cit9CisKKy8qKgorICogQ2hlY2sgdGhlIHR5cGUgb2YgYSBkZWZhdWx0IHZhbHVlIGFzc2lnbmVkIHRvIGEgZmllbGQuCisgKi8KK3ZvaWQgdmFsaWRhdGVfZmllbGRfdmFsdWUodF9maWVsZCogZmllbGQsIHRfY29uc3RfdmFsdWUqIGN2KSB7CisgIHZhbGlkYXRlX2NvbnN0X3JlYyhmaWVsZC0+Z2V0X25hbWUoKSwgZmllbGQtPmdldF90eXBlKCksIGN2KTsKK30KKworLyoqCisgKiBDaGVjayB0aGF0IGFsbCB0aGUgZWxlbWVudHMgb2YgYSB0aHJvd3MgYmxvY2sgYXJlIGFjdHVhbGx5IGV4Y2VwdGlvbnMuCisgKi8KK2Jvb2wgdmFsaWRhdGVfdGhyb3dzKHRfc3RydWN0KiB0aHJvd3MpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRocm93cy0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgaWYgKCF0X2dlbmVyYXRvcjo6Z2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpLT5pc194Y2VwdGlvbigpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworfQorCisvKioKKyAqIFNraXBzIFVURi04IEJPTSBpZiB0aGVyZSBpcyBvbmUKKyAqLworYm9vbCBza2lwX3V0ZjhfYm9tKEZJTEUqIGYpIHsKKworICAvLyBwcmV0dHkgc3RyYWlnaHRmb3J3YXJkLCBidXQgd29ya3MKKyAgaWYgKGZnZXRjKGYpID09IDB4RUYpIHsKKyAgICBpZiAoZmdldGMoZikgPT0gMHhCQikgeworICAgICAgaWYgKGZnZXRjKGYpID09IDB4QkYpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV3aW5kKGYpOworICByZXR1cm4gZmFsc2U7Cit9CisKKy8qKgorICogUGFyc2VzIGEgcHJvZ3JhbQorICovCit2b2lkIHBhcnNlKHRfcHJvZ3JhbSogcHJvZ3JhbSwgdF9wcm9ncmFtKiBwYXJlbnRfcHJvZ3JhbSkgeworICAvLyBHZXQgc2NvcGUgZmlsZSBwYXRoCisgIHN0cmluZyBwYXRoID0gcHJvZ3JhbS0+Z2V0X3BhdGgoKTsKKworICAvLyBTZXQgY3VycmVudCBkaXIgZ2xvYmFsLCB3aGljaCBpcyB1c2VkIGluIHRoZSBpbmNsdWRlX2ZpbGUgZnVuY3Rpb24KKyAgZ19jdXJkaXIgPSBkaXJlY3RvcnlfbmFtZShwYXRoKTsKKyAgZ19jdXJwYXRoID0gcGF0aDsKKworICAvLyBPcGVuIHRoZSBmaWxlCisgIC8vIHNraXAgVVRGLTggQk9NIGlmIHRoZXJlIGlzIG9uZQorICB5eWluID0gZm9wZW4ocGF0aC5jX3N0cigpLCAiciIpOworICBpZiAoeXlpbiA9PSAwKSB7CisgICAgZmFpbHVyZSgiQ291bGQgbm90IG9wZW4gaW5wdXQgZmlsZTogXCIlc1wiIiwgcGF0aC5jX3N0cigpKTsKKyAgfQorICBpZiAoc2tpcF91dGY4X2JvbSh5eWluKSkKKyAgICBwdmVyYm9zZSgiU2tpcHBlZCBVVEYtOCBCT00gYXQgJXNcbiIsIHBhdGguY19zdHIoKSk7CisKKyAgLy8gQ3JlYXRlIG5ldyBzY29wZSBhbmQgc2NhbiBmb3IgaW5jbHVkZXMKKyAgcHZlcmJvc2UoIlNjYW5uaW5nICVzIGZvciBpbmNsdWRlc1xuIiwgcGF0aC5jX3N0cigpKTsKKyAgZ19wYXJzZV9tb2RlID0gSU5DTFVERVM7CisgIGdfcHJvZ3JhbSA9IHByb2dyYW07CisgIGdfc2NvcGUgPSBwcm9ncmFtLT5zY29wZSgpOworICB0cnkgeworICAgIHl5bGluZW5vID0gMTsKKyAgICBpZiAoeXlwYXJzZSgpICE9IDApIHsKKyAgICAgIGZhaWx1cmUoIlBhcnNlciBlcnJvciBkdXJpbmcgaW5jbHVkZSBwYXNzLiIpOworICAgIH0KKyAgfSBjYXRjaCAoc3RyaW5nIHgpIHsKKyAgICBmYWlsdXJlKHguY19zdHIoKSk7CisgIH0KKyAgZmNsb3NlKHl5aW4pOworCisgIC8vIFJlY3Vyc2l2ZWx5IHBhcnNlIGFsbCB0aGUgaW5jbHVkZSBwcm9ncmFtcworICB2ZWN0b3I8dF9wcm9ncmFtKj4mIGluY2x1ZGVzID0gcHJvZ3JhbS0+Z2V0X2luY2x1ZGVzKCk7CisgIHZlY3Rvcjx0X3Byb2dyYW0qPjo6aXRlcmF0b3IgaXRlcjsKKyAgZm9yIChpdGVyID0gaW5jbHVkZXMuYmVnaW4oKTsgaXRlciAhPSBpbmNsdWRlcy5lbmQoKTsgKytpdGVyKSB7CisgICAgcGFyc2UoKml0ZXIsIHByb2dyYW0pOworICB9CisKKyAgLy8gcmVzZXQgcHJvZ3JhbSBkb2N0ZXh0IHN0YXR1cyBiZWZvcmUgcGFyc2luZyBhIG5ldyBmaWxlCisgIHJlc2V0X3Byb2dyYW1fZG9jdGV4dF9pbmZvKCk7CisKKyAgLy8gUGFyc2UgdGhlIHByb2dyYW0gZmlsZQorICBnX3BhcnNlX21vZGUgPSBQUk9HUkFNOworICBnX3Byb2dyYW0gPSBwcm9ncmFtOworICBnX3Njb3BlID0gcHJvZ3JhbS0+c2NvcGUoKTsKKyAgZ19wYXJlbnRfc2NvcGUgPSAocGFyZW50X3Byb2dyYW0gIT0gTlVMTCkgPyBwYXJlbnRfcHJvZ3JhbS0+c2NvcGUoKSA6IE5VTEw7CisgIGdfcGFyZW50X3ByZWZpeCA9IHByb2dyYW0tPmdldF9uYW1lKCkgKyAiLiI7CisgIGdfY3VycGF0aCA9IHBhdGg7CisKKyAgLy8gT3BlbiB0aGUgZmlsZQorICAvLyBza2lwIFVURi04IEJPTSBpZiB0aGVyZSBpcyBvbmUKKyAgeXlpbiA9IGZvcGVuKHBhdGguY19zdHIoKSwgInIiKTsKKyAgaWYgKHl5aW4gPT0gMCkgeworICAgIGZhaWx1cmUoIkNvdWxkIG5vdCBvcGVuIGlucHV0IGZpbGU6IFwiJXNcIiIsIHBhdGguY19zdHIoKSk7CisgIH0KKyAgaWYgKHNraXBfdXRmOF9ib20oeXlpbikpCisgICAgcHZlcmJvc2UoIlNraXBwZWQgVVRGLTggQk9NIGF0ICVzXG4iLCBwYXRoLmNfc3RyKCkpOworCisgIHB2ZXJib3NlKCJQYXJzaW5nICVzIGZvciB0eXBlc1xuIiwgcGF0aC5jX3N0cigpKTsKKyAgeXlsaW5lbm8gPSAxOworICB0cnkgeworICAgIGlmICh5eXBhcnNlKCkgIT0gMCkgeworICAgICAgZmFpbHVyZSgiUGFyc2VyIGVycm9yIGR1cmluZyB0eXBlcyBwYXNzLiIpOworICAgIH0KKyAgfSBjYXRjaCAoc3RyaW5nIHgpIHsKKyAgICBmYWlsdXJlKHguY19zdHIoKSk7CisgIH0KKyAgZmNsb3NlKHl5aW4pOworfQorCisvKioKKyAqIEdlbmVyYXRlIGNvZGUKKyAqLwordm9pZCBnZW5lcmF0ZSh0X3Byb2dyYW0qIHByb2dyYW0sIGNvbnN0IHZlY3RvcjxzdHJpbmc+JiBnZW5lcmF0b3Jfc3RyaW5ncykgeworICAvLyBPb29vaGgsIHJlY3Vyc2l2ZSBjb2RlIGdlbmVyYXRpb24sIGhvdCEhCisgIGlmIChnZW5fcmVjdXJzZSkgeworICAgIGNvbnN0IHZlY3Rvcjx0X3Byb2dyYW0qPiYgaW5jbHVkZXMgPSBwcm9ncmFtLT5nZXRfaW5jbHVkZXMoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluY2x1ZGVzLnNpemUoKTsgKytpKSB7CisgICAgICAvLyBQcm9wYWdhdGUgb3V0cHV0IHBhdGggZnJvbSBwYXJlbnQgdG8gY2hpbGQgcHJvZ3JhbXMKKyAgICAgIGluY2x1ZGVzW2ldLT5zZXRfb3V0X3BhdGgocHJvZ3JhbS0+Z2V0X291dF9wYXRoKCksIHByb2dyYW0tPmlzX291dF9wYXRoX2Fic29sdXRlKCkpOworCisgICAgICBnZW5lcmF0ZShpbmNsdWRlc1tpXSwgZ2VuZXJhdG9yX3N0cmluZ3MpOworICAgIH0KKyAgfQorCisgIC8vIEdlbmVyYXRlIGNvZGUhCisgIHRyeSB7CisgICAgcHZlcmJvc2UoIlByb2dyYW06ICVzXG4iLCBwcm9ncmFtLT5nZXRfcGF0aCgpLmNfc3RyKCkpOworCisgICAgaWYgKGR1bXBfZG9jcykgeworICAgICAgZHVtcF9kb2NzdHJpbmdzKHByb2dyYW0pOworICAgIH0KKworICAgIHZlY3RvcjxzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworICAgIGZvciAoaXRlciA9IGdlbmVyYXRvcl9zdHJpbmdzLmJlZ2luKCk7IGl0ZXIgIT0gZ2VuZXJhdG9yX3N0cmluZ3MuZW5kKCk7ICsraXRlcikgeworICAgICAgdF9nZW5lcmF0b3IqIGdlbmVyYXRvciA9IHRfZ2VuZXJhdG9yX3JlZ2lzdHJ5OjpnZXRfZ2VuZXJhdG9yKHByb2dyYW0sICppdGVyKTsKKworICAgICAgaWYgKGdlbmVyYXRvciA9PSBOVUxMKSB7CisjaWZkZWYgVEhSSUZUX0VOQUJMRV9QTFVHSU4KKyAgICAgICAgc3dpdGNoIChwbHVnaW5fb3V0cHV0OjpkZWxlZ2F0ZVRvUGx1Z2luKHByb2dyYW0sICppdGVyKSkgeworICAgICAgICAgIGNhc2UgcGx1Z2luX291dHB1dDo6UExVR0lOX05PVF9GT1VORDoKKyAgICAgICAgICAgIHB3YXJuaW5nKDEsICJVbmFibGUgdG8gZ2V0IGEgZ2VuZXJhdG9yIGZvciBcIiVzXCIuXG4iLCBpdGVyLT5jX3N0cigpKTsKKyAgICAgICAgICAgIGdfZ2VuZXJhdG9yX2ZhaWx1cmUgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBwbHVnaW5fb3V0cHV0OjpQTFVHSU5fRkFJTFVSRToKKyAgICAgICAgICAgIHB3YXJuaW5nKDEsICJQbHVnaW4gZ2VuZXJhdG9yIGZvciBcIiVzXCIgZmFpbGVkLlxuIiwgaXRlci0+Y19zdHIoKSk7CisgICAgICAgICAgICBnX2dlbmVyYXRvcl9mYWlsdXJlID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgcGx1Z2luX291dHB1dDo6UExVR0lOX1NVQ0NFRVNTOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGFzc2VydChmYWxzZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgcHdhcm5pbmcoMSwgIlVuYWJsZSB0byBnZXQgYSBnZW5lcmF0b3IgZm9yIFwiJXNcIi5cbiIsIGl0ZXItPmNfc3RyKCkpOworICAgICAgICBnX2dlbmVyYXRvcl9mYWlsdXJlID0gdHJ1ZTsKKyNlbmRpZgorICAgICAgfSBlbHNlIGlmIChnZW5lcmF0b3IpIHsKKyAgICAgICAgZ2VuZXJhdG9yLT52YWxpZGF0ZV9pbnB1dCgpOworICAgICAgICBwdmVyYm9zZSgiR2VuZXJhdGluZyBcIiVzXCJcbiIsIGl0ZXItPmNfc3RyKCkpOworICAgICAgICBnZW5lcmF0b3ItPmdlbmVyYXRlX3Byb2dyYW0oKTsKKyAgICAgICAgZGVsZXRlIGdlbmVyYXRvcjsKKyAgICAgIH0KKyAgICB9CisgIH0gY2F0Y2ggKHN0cmluZyBzKSB7CisgICAgZmFpbHVyZSgiRXJyb3I6ICVzXG4iLCBzLmNfc3RyKCkpOworICB9IGNhdGNoIChjb25zdCBjaGFyKiBleGMpIHsKKyAgICBmYWlsdXJlKCJFcnJvcjogJXNcbiIsIGV4Yyk7CisgIH0KK30KKwordm9pZCBhdWRpdCh0X3Byb2dyYW0qIG5ld19wcm9ncmFtLAorICAgICAgICAgICB0X3Byb2dyYW0qIG9sZF9wcm9ncmFtLAorICAgICAgICAgICBzdHJpbmcgbmV3X3RocmlmdF9pbmNsdWRlX3BhdGgsCisgICAgICAgICAgIHN0cmluZyBvbGRfdGhyaWZ0X2luY2x1ZGVfcGF0aCkgeworICB2ZWN0b3I8c3RyaW5nPiB0ZW1wX2luY2xfc2VhcmNocGF0aCA9IGdfaW5jbF9zZWFyY2hwYXRoOworICBpZiAoIW9sZF90aHJpZnRfaW5jbHVkZV9wYXRoLmVtcHR5KCkpIHsKKyAgICBnX2luY2xfc2VhcmNocGF0aC5wdXNoX2JhY2sob2xkX3RocmlmdF9pbmNsdWRlX3BhdGgpOworICB9CisKKyAgcGFyc2Uob2xkX3Byb2dyYW0sIE5VTEwpOworCisgIGdfaW5jbF9zZWFyY2hwYXRoID0gdGVtcF9pbmNsX3NlYXJjaHBhdGg7CisgIGlmICghbmV3X3RocmlmdF9pbmNsdWRlX3BhdGguZW1wdHkoKSkgeworICAgIGdfaW5jbF9zZWFyY2hwYXRoLnB1c2hfYmFjayhuZXdfdGhyaWZ0X2luY2x1ZGVfcGF0aCk7CisgIH0KKworICBwYXJzZShuZXdfcHJvZ3JhbSwgTlVMTCk7CisKKyAgY29tcGFyZV9uYW1lc3BhY2UobmV3X3Byb2dyYW0sIG9sZF9wcm9ncmFtKTsKKyAgY29tcGFyZV9zZXJ2aWNlcyhuZXdfcHJvZ3JhbS0+Z2V0X3NlcnZpY2VzKCksIG9sZF9wcm9ncmFtLT5nZXRfc2VydmljZXMoKSk7CisgIGNvbXBhcmVfZW51bXMobmV3X3Byb2dyYW0tPmdldF9lbnVtcygpLCBvbGRfcHJvZ3JhbS0+Z2V0X2VudW1zKCkpOworICBjb21wYXJlX3N0cnVjdHMobmV3X3Byb2dyYW0tPmdldF9zdHJ1Y3RzKCksIG9sZF9wcm9ncmFtLT5nZXRfc3RydWN0cygpKTsKKyAgY29tcGFyZV9zdHJ1Y3RzKG5ld19wcm9ncmFtLT5nZXRfeGNlcHRpb25zKCksIG9sZF9wcm9ncmFtLT5nZXRfeGNlcHRpb25zKCkpOworICBjb21wYXJlX2NvbnN0cyhuZXdfcHJvZ3JhbS0+Z2V0X2NvbnN0cygpLCBvbGRfcHJvZ3JhbS0+Z2V0X2NvbnN0cygpKTsKK30KKworLyoqCisgKiBQYXJzZSBpdCB1cC4uIHRoZW4gc3BpdCBpdCBiYWNrIG91dCwgaW4gcHJldHR5IG11Y2ggZXZlcnkgbGFuZ3VhZ2UuIEFscmlnaHQKKyAqIG5vdCB0aGF0IG1hbnkgbGFuZ3VhZ2VzLCBidXQgdGhlIGNvb2wgb25lcyB0aGF0IHdlIGNhcmUgYWJvdXQuCisgKi8KK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICBpbnQgaTsKKyAgc3RkOjpzdHJpbmcgb3V0X3BhdGg7CisgIGJvb2wgb3V0X3BhdGhfaXNfYWJzb2x1dGUgPSBmYWxzZTsKKworICAvLyBTZXR1cCB0aW1lIHN0cmluZworICB0aW1lX3Qgbm93ID0gdGltZShOVUxMKTsKKyAgZ190aW1lX3N0ciA9IGN0aW1lKCZub3cpOworCisgIC8vIENoZWNrIGZvciBuZWNlc3NhcnkgYXJndW1lbnRzLCB5b3UgZ290dGEgaGF2ZSBhdCBsZWFzdCBhIGZpbGVuYW1lIGFuZAorICAvLyBhbiBvdXRwdXQgbGFuZ3VhZ2UgZmxhZworICBpZiAoYXJnYyA8IDIpIHsKKyAgICB1c2FnZSgpOworICB9CisKKyAgdmVjdG9yPHN0cmluZz4gZ2VuZXJhdG9yX3N0cmluZ3M7CisgIHN0cmluZyBvbGRfdGhyaWZ0X2luY2x1ZGVfcGF0aDsKKyAgc3RyaW5nIG5ld190aHJpZnRfaW5jbHVkZV9wYXRoOworICBzdHJpbmcgb2xkX2lucHV0X2ZpbGU7CisKKyAgLy8gU2V0IHRoZSBjdXJyZW50IHBhdGggdG8gYSBkdW1teSB2YWx1ZSB0byBtYWtlIHdhcm5pbmcgbWVzc2FnZXMgY2xlYXJlci4KKyAgZ19jdXJwYXRoID0gImFyZ3VtZW50cyI7CisKKyAgLy8gSGFja3kgcGFyYW1ldGVyIGhhbmRsaW5nLi4uIEkgZGlkbid0IGZlZWwgbGlrZSB1c2luZyBhIGxpYnJhcnkgc29ycnkhCisgIGZvciAoaSA9IDE7IGkgPCBhcmdjIC0gMTsgaSsrKSB7CisgICAgY2hhciogYXJnOworCisgICAgYXJnID0gc3RydG9rKGFyZ3ZbaV0sICIgIik7CisgICAgd2hpbGUgKGFyZyAhPSBOVUxMKSB7CisgICAgICAvLyBUcmVhdCBkb3VibGUgZGFzaGVzIGFzIHNpbmdsZSBkYXNoZXMKKyAgICAgIGlmIChhcmdbMF0gPT0gJy0nICYmIGFyZ1sxXSA9PSAnLScpIHsKKyAgICAgICAgKythcmc7CisgICAgICB9CisKKyAgICAgIGlmIChzdHJjbXAoYXJnLCAiLWhlbHAiKSA9PSAwKSB7CisgICAgICAgIGhlbHAoKTsKKyAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi12ZXJzaW9uIikgPT0gMCkgeworICAgICAgICB2ZXJzaW9uKCk7CisgICAgICAgIGV4aXQoMCk7CisgICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItZGVidWciKSA9PSAwKSB7CisgICAgICAgIGdfZGVidWcgPSAxOworICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLW5vd2FybiIpID09IDApIHsKKyAgICAgICAgZ193YXJuID0gMDsKKyAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1zdHJpY3QiKSA9PSAwKSB7CisgICAgICAgIGdfc3RyaWN0ID0gMjU1OworICAgICAgICBnX3dhcm4gPSAyOworICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLXYiKSA9PSAwIHx8IHN0cmNtcChhcmcsICItdmVyYm9zZSIpID09IDApIHsKKyAgICAgICAgZ192ZXJib3NlID0gMTsKKyAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1yIikgPT0gMCB8fCBzdHJjbXAoYXJnLCAiLXJlY3Vyc2UiKSA9PSAwKSB7CisgICAgICAgIGdlbl9yZWN1cnNlID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1hbGxvdy1uZWcta2V5cyIpID09IDApIHsKKyAgICAgICAgZ19hbGxvd19uZWdfZmllbGRfa2V5cyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItYWxsb3ctNjRiaXQtY29uc3RzIikgPT0gMCkgeworICAgICAgICBnX2FsbG93XzY0Yml0X2NvbnN0cyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItZ2VuIikgPT0gMCkgeworICAgICAgICBhcmcgPSBhcmd2WysraV07CisgICAgICAgIGlmIChhcmcgPT0gTlVMTCkgeworICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiTWlzc2luZyBnZW5lcmF0b3Igc3BlY2lmaWNhdGlvblxuIik7CisgICAgICAgICAgdXNhZ2UoKTsKKyAgICAgICAgfQorICAgICAgICBnZW5lcmF0b3Jfc3RyaW5ncy5wdXNoX2JhY2soYXJnKTsKKyAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1JIikgPT0gMCkgeworICAgICAgICAvLyBBbiBhcmd1bWVudCBvZiAiLUlcIGFzZGYiIGlzIGludmFsaWQgYW5kIGhhcyB1bmtub3duIHJlc3VsdHMKKyAgICAgICAgYXJnID0gYXJndlsrK2ldOworCisgICAgICAgIGlmIChhcmcgPT0gTlVMTCkgeworICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiTWlzc2luZyBJbmNsdWRlIGRpcmVjdG9yeVxuIik7CisgICAgICAgICAgdXNhZ2UoKTsKKyAgICAgICAgfQorICAgICAgICBnX2luY2xfc2VhcmNocGF0aC5wdXNoX2JhY2soYXJnKTsKKyAgICAgIH0gZWxzZSBpZiAoKHN0cmNtcChhcmcsICItbyIpID09IDApIHx8IChzdHJjbXAoYXJnLCAiLW91dCIpID09IDApKSB7CisgICAgICAgIG91dF9wYXRoX2lzX2Fic29sdXRlID0gKHN0cmNtcChhcmcsICItb3V0IikgPT0gMCkgPyB0cnVlIDogZmFsc2U7CisgICAgICAgIGFyZyA9IGFyZ3ZbKytpXTsKKyAgICAgICAgaWYgKGFyZyA9PSBOVUxMKSB7CisgICAgICAgICAgZnByaW50ZihzdGRlcnIsICItbzogbWlzc2luZyBvdXRwdXQgZGlyZWN0b3J5XG4iKTsKKyAgICAgICAgICB1c2FnZSgpOworICAgICAgICB9CisgICAgICAgIG91dF9wYXRoID0gYXJnOworCisjaWZkZWYgX1dJTjMyCisgICAgICAgIC8vIHN0cmlwIG91dCB0cmFpbGluZyBcIG9uIFdpbmRvd3MKKyAgICAgICAgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBsYXN0ID0gb3V0X3BhdGgubGVuZ3RoKCkgLSAxOworICAgICAgICBpZiAob3V0X3BhdGhbbGFzdF0gPT0gJ1xcJykgeworICAgICAgICAgIG91dF9wYXRoLmVyYXNlKGxhc3QpOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgaWYgKCFjaGVja19pc19kaXJlY3Rvcnkob3V0X3BhdGguY19zdHIoKSkpCisgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLWF1ZGl0IikgPT0gMCkgeworICAgICAgICBnX2F1ZGl0ID0gdHJ1ZTsKKyAgICAgICAgYXJnID0gYXJndlsrK2ldOworICAgICAgICBpZiAoYXJnID09IE5VTEwpIHsKKyAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIk1pc3Npbmcgb2xkIHRocmlmdCBmaWxlIG5hbWUgZm9yIGF1ZGl0IG9wZXJhdGlvblxuIik7CisgICAgICAgICAgdXNhZ2UoKTsKKyAgICAgICAgfQorICAgICAgICBjaGFyIG9sZF90aHJpZnRfZmlsZV9ycFtUSFJJRlRfUEFUSF9NQVhdOworCisgICAgICAgIC8vIGNwcGNoZWNrLXN1cHByZXNzIHVuaW5pdHZhcgorICAgICAgICBpZiAoc2FmZXJlYWxwYXRoKGFyZywgb2xkX3RocmlmdF9maWxlX3JwKSA9PSBOVUxMKSB7CisgICAgICAgICAgZmFpbHVyZSgiQ291bGQgbm90IG9wZW4gaW5wdXQgZmlsZSB3aXRoIHJlYWxwYXRoOiAlcyIsIGFyZyk7CisgICAgICAgIH0KKyAgICAgICAgb2xkX2lucHV0X2ZpbGUgPSBzdHJpbmcob2xkX3RocmlmdF9maWxlX3JwKTsKKyAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1hdWRpdC1ub2ZhdGFsIikgPT0gMCkgeworICAgICAgICBnX2F1ZGl0X2ZhdGFsID0gZmFsc2U7CisgICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItSW9sZCIpID09IDApIHsKKyAgICAgICAgYXJnID0gYXJndlsrK2ldOworICAgICAgICBpZiAoYXJnID09IE5VTEwpIHsKKyAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIk1pc3NpbmcgSW5jbHVkZSBkaXJlY3RvcnkgZm9yIG9sZCB0aHJpZnQgZmlsZVxuIik7CisgICAgICAgICAgdXNhZ2UoKTsKKyAgICAgICAgfQorICAgICAgICBvbGRfdGhyaWZ0X2luY2x1ZGVfcGF0aCA9IHN0cmluZyhhcmcpOworICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLUluZXciKSA9PSAwKSB7CisgICAgICAgIGFyZyA9IGFyZ3ZbKytpXTsKKyAgICAgICAgaWYgKGFyZyA9PSBOVUxMKSB7CisgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJNaXNzaW5nIEluY2x1ZGUgZGlyZWN0b3J5IGZvciBuZXcgdGhyaWZ0IGZpbGVcbiIpOworICAgICAgICAgIHVzYWdlKCk7CisgICAgICAgIH0KKyAgICAgICAgbmV3X3RocmlmdF9pbmNsdWRlX3BhdGggPSBzdHJpbmcoYXJnKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVW5yZWNvZ25pemVkIG9wdGlvbjogJXNcbiIsIGFyZyk7CisgICAgICAgIHVzYWdlKCk7CisgICAgICB9CisKKyAgICAgIC8vIFRva2VuaXplIG1vcmUKKyAgICAgIGFyZyA9IHN0cnRvayhOVUxMLCAiICIpOworICAgIH0KKyAgfQorCisgIC8vIGRpc3BsYXkgaGVscAorICBpZiAoKHN0cmNtcChhcmd2W2FyZ2MgLSAxXSwgIi1oZWxwIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2W2FyZ2MgLSAxXSwgIi0taGVscCIpID09IDApKSB7CisgICAgaGVscCgpOworICB9CisKKyAgLy8gaWYgeW91J3JlIGFza2luZyBmb3IgdmVyc2lvbiwgeW91IGhhdmUgYSByaWdodCBub3QgdG8gcGFzcyBhIGZpbGUKKyAgaWYgKChzdHJjbXAoYXJndlthcmdjIC0gMV0sICItdmVyc2lvbiIpID09IDApIHx8IChzdHJjbXAoYXJndlthcmdjIC0gMV0sICItLXZlcnNpb24iKSA9PSAwKSkgeworICAgIHZlcnNpb24oKTsKKyAgICBleGl0KDApOworICB9CisKKyAgLy8gSW5pdGlhbGl6ZSBnbG9iYWwgdHlwZXMKKyAgaW5pdEdsb2JhbHMoKTsKKworICBpZiAoZ19hdWRpdCkgeworICAgIC8vIEF1ZGl0IG9wZXJhdGlvbgorCisgICAgaWYgKG9sZF9pbnB1dF9maWxlLmVtcHR5KCkpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiTWlzc2luZyBmaWxlIG5hbWUgb2Ygb2xkIHRocmlmdCBmaWxlIGZvciBhdWRpdFxuIik7CisgICAgICB1c2FnZSgpOworICAgIH0KKworICAgIGNoYXIgbmV3X3RocmlmdF9maWxlX3JwW1RIUklGVF9QQVRIX01BWF07CisgICAgaWYgKGFyZ3ZbaV0gPT0gTlVMTCkgeworICAgICAgZnByaW50ZihzdGRlcnIsICJNaXNzaW5nIGZpbGUgbmFtZSBvZiBuZXcgdGhyaWZ0IGZpbGUgZm9yIGF1ZGl0XG4iKTsKKyAgICAgIHVzYWdlKCk7CisgICAgfQorICAgIC8vIGNwcGNoZWNrLXN1cHByZXNzIHVuaW5pdHZhcgorICAgIGlmIChzYWZlcmVhbHBhdGgoYXJndltpXSwgbmV3X3RocmlmdF9maWxlX3JwKSA9PSBOVUxMKSB7CisgICAgICBmYWlsdXJlKCJDb3VsZCBub3Qgb3BlbiBpbnB1dCBmaWxlIHdpdGggcmVhbHBhdGg6ICVzIiwgYXJndltpXSk7CisgICAgfQorICAgIHN0cmluZyBuZXdfaW5wdXRfZmlsZShuZXdfdGhyaWZ0X2ZpbGVfcnApOworCisgICAgdF9wcm9ncmFtIG5ld19wcm9ncmFtKG5ld19pbnB1dF9maWxlKTsKKyAgICB0X3Byb2dyYW0gb2xkX3Byb2dyYW0ob2xkX2lucHV0X2ZpbGUpOworCisgICAgYXVkaXQoJm5ld19wcm9ncmFtLCAmb2xkX3Byb2dyYW0sIG5ld190aHJpZnRfaW5jbHVkZV9wYXRoLCBvbGRfdGhyaWZ0X2luY2x1ZGVfcGF0aCk7CisKKyAgfSBlbHNlIHsKKyAgICAvLyBHZW5lcmF0ZSBvcHRpb25zCisKKyAgICAvLyBZb3UgZ290dGEgZ2VuZXJhdGUgc29tZXRoaW5nIQorICAgIGlmIChnZW5lcmF0b3Jfc3RyaW5ncy5lbXB0eSgpKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIk5vIG91dHB1dCBsYW5ndWFnZShzKSBzcGVjaWZpZWRcbiIpOworICAgICAgdXNhZ2UoKTsKKyAgICB9CisKKyAgICAvLyBSZWFsLXBhdGhpZnkgaXQKKyAgICBjaGFyIHJwW1RIUklGVF9QQVRIX01BWF07CisgICAgaWYgKGFyZ3ZbaV0gPT0gTlVMTCkgeworICAgICAgZnByaW50ZihzdGRlcnIsICJNaXNzaW5nIGZpbGUgbmFtZVxuIik7CisgICAgICB1c2FnZSgpOworICAgIH0KKyAgICAvLyBjcHBjaGVjay1zdXBwcmVzcyB1bmluaXR2YXIKKyAgICBpZiAoc2FmZXJlYWxwYXRoKGFyZ3ZbaV0sIHJwKSA9PSBOVUxMKSB7CisgICAgICBmYWlsdXJlKCJDb3VsZCBub3Qgb3BlbiBpbnB1dCBmaWxlIHdpdGggcmVhbHBhdGg6ICVzIiwgYXJndltpXSk7CisgICAgfQorICAgIHN0cmluZyBpbnB1dF9maWxlKHJwKTsKKworICAgIC8vIEluc3RhbmNlIG9mIHRoZSBnbG9iYWwgcGFyc2UgdHJlZQorICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IG5ldyB0X3Byb2dyYW0oaW5wdXRfZmlsZSk7CisgICAgaWYgKG91dF9wYXRoLnNpemUoKSkgeworICAgICAgcHJvZ3JhbS0+c2V0X291dF9wYXRoKG91dF9wYXRoLCBvdXRfcGF0aF9pc19hYnNvbHV0ZSk7CisgICAgfQorCisgICAgLy8gQ29tcHV0ZSB0aGUgY3BwIGluY2x1ZGUgcHJlZml4LgorICAgIC8vIGluZmVyIHRoaXMgZnJvbSB0aGUgZmlsZW5hbWUgcGFzc2VkIGluCisgICAgc3RyaW5nIGlucHV0X2ZpbGVuYW1lID0gYXJndltpXTsKKyAgICBzdHJpbmcgaW5jbHVkZV9wcmVmaXg7CisKKyAgICBzdHJpbmc6OnNpemVfdHlwZSBsYXN0X3NsYXNoID0gc3RyaW5nOjpucG9zOworICAgIGlmICgobGFzdF9zbGFzaCA9IGlucHV0X2ZpbGVuYW1lLnJmaW5kKCIvIikpICE9IHN0cmluZzo6bnBvcykgeworICAgICAgaW5jbHVkZV9wcmVmaXggPSBpbnB1dF9maWxlbmFtZS5zdWJzdHIoMCwgbGFzdF9zbGFzaCk7CisgICAgfQorCisgICAgcHJvZ3JhbS0+c2V0X2luY2x1ZGVfcHJlZml4KGluY2x1ZGVfcHJlZml4KTsKKworICAgIC8vIFBhcnNlIGl0IQorICAgIHBhcnNlKHByb2dyYW0sIE5VTEwpOworCisgICAgLy8gVGhlIGN1cnJlbnQgcGF0aCBpcyBub3QgcmVhbGx5IHJlbGV2YW50IHdoZW4gd2UgYXJlIGRvaW5nIGdlbmVyYXRpb24uCisgICAgLy8gUmVzZXQgdGhlIHZhcmlhYmxlIHRvIG1ha2Ugd2FybmluZyBtZXNzYWdlcyBjbGVhcmVyLgorICAgIGdfY3VycGF0aCA9ICJnZW5lcmF0aW9uIjsKKyAgICAvLyBSZXNldCB5eWxpbmVubyBmb3IgdGhlIGhlY2sgb2YgaXQuICBVc2UgMSBpbnN0ZWFkIG9mIDAgYmVjYXVzZQorICAgIC8vIFRoYXQgaXMgd2hhdCBzaG93cyB1cCBkdXJpbmcgYXJndW1lbnQgcGFyc2luZy4KKyAgICB5eWxpbmVubyA9IDE7CisKKyAgICAvLyBHZW5lcmF0ZSBpdCEKKyAgICBnZW5lcmF0ZShwcm9ncmFtLCBnZW5lcmF0b3Jfc3RyaW5ncyk7CisgICAgZGVsZXRlIHByb2dyYW07CisgIH0KKworICAvLyBDbGVhbiB1cC4gV2hvIGFtIEkga2lkZGluZy4uLiB0aGlzIHByb2dyYW0gcHJvYmFibHkgb3JwaGFucyBoZWFwIG1lbW9yeQorICAvLyBhbGwgb3ZlciB0aGUgcGxhY2UsIGJ1dCB3aG8gY2FyZXMgYmVjYXVzZSBpdCBpcyBhYm91dCB0byBleGl0IGFuZCBpdCBpcworICAvLyBhbGwgcmVmZXJlbmNlZCBhbmQgdXNlZCBieSB0aGlzIHdhY2t5IHBhcnNlIHRyZWUgdXAgdW50aWwgbm93IGFueXdheXMuCisgIGNsZWFyR2xvYmFscygpOworCisgIC8vIEZpbmlzaGVkCisgIGlmIChnX3JldHVybl9mYWlsdXJlICYmIGdfYXVkaXRfZmF0YWwpIHsKKyAgICBleGl0KDIpOworICB9CisgIGlmIChnX2dlbmVyYXRvcl9mYWlsdXJlKSB7CisgICAgZXhpdCgzKTsKKyAgfQorICAvLyBGaW5pc2hlZAorICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L21haW4uaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L21haW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGFiYjAzCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvbWFpbi5oCkBAIC0wLDAgKzEsMTE5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVF9NQUlOX0gKKyNkZWZpbmUgVF9NQUlOX0gKKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxjc3RkaW8+CisKKyNpbmNsdWRlICJ0aHJpZnQvbG9nZ2luZy5oIgorCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfY29uc3QuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9maWVsZC5oIgorCisvKioKKyAqIERlZmluZWQgaW4gdGhlIGZsZXggbGlicmFyeQorICovCisKK2V4dGVybiAiQyIgeyBpbnQgeXlsZXgodm9pZCk7IH0KKworaW50IHl5cGFyc2Uodm9pZCk7CisKKy8qKgorICogRXhwZWN0ZWQgdG8gYmUgZGVmaW5lZCBieSBGbGV4L0Jpc29uCisgKi8KK3ZvaWQgeXllcnJvcihjb25zdCBjaGFyKiBmbXQsIC4uLik7CisKKy8qKgorICogQ2hlY2sgc2ltcGxlIGlkZW50aWZpZXIgbmFtZXMKKyAqLwordm9pZCB2YWxpZGF0ZV9zaW1wbGVfaWRlbnRpZmllcihjb25zdCBjaGFyKiBpZGVudGlmaWVyKTsKKworLyoqCisgKiBDaGVjayBjb25zdGFudCB0eXBlcworICovCit2b2lkIHZhbGlkYXRlX2NvbnN0X3R5cGUodF9jb25zdCogYyk7CisKKy8qKgorICogQ2hlY2sgY29uc3RhbnQgdHlwZXMKKyAqLwordm9pZCB2YWxpZGF0ZV9maWVsZF92YWx1ZSh0X2ZpZWxkKiBmaWVsZCwgdF9jb25zdF92YWx1ZSogY3YpOworCisvKioKKyAqIENoZWNrIG1lbWJlcnMgb2YgYSB0aHJvd3MgYmxvY2sKKyAqLworYm9vbCB2YWxpZGF0ZV90aHJvd3ModF9zdHJ1Y3QqIHRocm93cyk7CisKKy8qKgorICogQ29udmVydHMgYSBzdHJpbmcgZmlsZW5hbWUgaW50byBhIHRocmlmdCBwcm9ncmFtIG5hbWUKKyAqLworc3RkOjpzdHJpbmcgcHJvZ3JhbV9uYW1lKHN0ZDo6c3RyaW5nIGZpbGVuYW1lKTsKKworLyoqCisgKiBHZXRzIHRoZSBkaXJlY3RvcnkgcGF0aCBvZiBhIGZpbGVuYW1lCisgKi8KK3N0ZDo6c3RyaW5nIGRpcmVjdG9yeV9uYW1lKHN0ZDo6c3RyaW5nIGZpbGVuYW1lKTsKKworLyoqCisgKiBHZXQgdGhlIGFic29sdXRlIHBhdGggZm9yIGFuIGluY2x1ZGUgZmlsZQorICovCitzdGQ6OnN0cmluZyBpbmNsdWRlX2ZpbGUoc3RkOjpzdHJpbmcgZmlsZW5hbWUpOworCisvKioKKyAqIENsZWFycyBhbnkgcHJldmlvdXNseSBzdG9yZWQgZG9jdGV4dCBzdHJpbmcuCisgKi8KK3ZvaWQgY2xlYXJfZG9jdGV4dCgpOworCisvKioKKyAqIENsZWFucyB1cCB0ZXh0IGNvbW1vbmx5IGZvdW5kIGluIGRveHlnZW4tbGlrZSBjb21tZW50cworICovCitjaGFyKiBjbGVhbl91cF9kb2N0ZXh0KGNoYXIqIGRvY3RleHQpOworCisvKioKKyAqIFdlIGFyZSBzdXJlIHRoZSBwcm9ncmFtIGRvY3RleHQgY2FuZGlkYXRlIGlzIHJlYWxseSB0aGUgcHJvZ3JhbSBkb2N0ZXh0LgorICovCit2b2lkIGRlY2xhcmVfdmFsaWRfcHJvZ3JhbV9kb2N0ZXh0KCk7CisKKy8qKgorICogRW1pdHMgYSB3YXJuaW5nIG9uIGxpc3Q8Ynl0ZT4sIGJpbmFyeSB0eXBlIGlzIHR5cGljYWxseSBhIG11Y2ggYmV0dGVyIGNob2ljZS4KKyAqLwordm9pZCBjaGVja19mb3JfbGlzdF9vZl9ieXRlcyh0X3R5cGUqIGxpc3RfZWxlbV90eXBlKTsKKworLyoqCisgKiBFbWl0cyBhIG9uZS10aW1lIHdhcm5pbmcgb24gYnl0ZSB0eXBlLCBwcm9tb3RpbmcgdGhlIG5ldyBpOCB0eXBlIGluc3RlYWQKKyAqLwordm9pZCBlbWl0X2J5dGVfdHlwZV93YXJuaW5nKCk7CisKKy8qKgorICogUHJpbnRzIGRlcHJlY2F0aW9uIG5vdGljZSBmb3Igb2xkIE5TIGRlY2xhcmF0aW9ucyB0aGF0IGFyZSBubyBsb25nZXIgc3VwcG9ydGVkCisgKiBJZiBuZXdfZm9ybSBpcyBOVUxMLCBvbGRfZm9ybSBpcyBhc3N1bWVkIHRvIGJlIGEgbGFuZ3VhZ2UgaWRlbnRpZmllciwgc3VjaCBhcyAiY3BwIgorICogSWYgbmV3X2Zvcm0gaXMgbm90IE5VTEwsIGJvdGggYXJndW1lbnRzIGFyZSB1c2VkIGV4YWN0bHkgYXMgZ2l2ZW4KKyAqLwordm9pZCBlcnJvcl91bnN1cHBvcnRlZF9uYW1lc3BhY2VfZGVjbChjb25zdCBjaGFyKiBvbGRfZm9ybSwgY29uc3QgY2hhciogbmV3X2Zvcm0gPSBOVUxMKTsKKworLyoqCisgKiBGbGV4IHV0aWxpdGllcworICovCisKK2V4dGVybiBpbnQgeXlsaW5lbm87CitleHRlcm4gY2hhciB5eXRleHRbXTsKK2V4dGVybiBzdGQ6OkZJTEUqIHl5aW47CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvcGFyc2UuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS9wYXJzZS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWY3NjM3Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvcGFyc2UuY2MKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfdHlwZS5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3R5cGVkZWYuaCIKKworI2luY2x1ZGUgInRocmlmdC9tYWluLmgiCisKK3RfdHlwZSogdF90eXBlOjpnZXRfdHJ1ZV90eXBlKCkgeworICB0X3R5cGUqIHR5cGUgPSB0aGlzOworICB3aGlsZSAodHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgdHlwZSA9ICgodF90eXBlZGVmKil0eXBlKS0+Z2V0X3R5cGUoKTsKKyAgfQorICByZXR1cm4gdHlwZTsKK30KKworY29uc3QgdF90eXBlKiB0X3R5cGU6OmdldF90cnVlX3R5cGUoKSBjb25zdCB7CisgIGNvbnN0IHRfdHlwZSogdHlwZSA9IHRoaXM7CisgIHdoaWxlICh0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICB0eXBlID0gKCh0X3R5cGVkZWYqKXR5cGUpLT5nZXRfdHlwZSgpOworICB9CisgIHJldHVybiB0eXBlOworfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9iYXNlX3R5cGUuaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfYmFzZV90eXBlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzEzOThiYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfYmFzZV90eXBlLmgKQEAgLTAsMCArMSwxMTcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUX0JBU0VfVFlQRV9ICisjZGVmaW5lIFRfQkFTRV9UWVBFX0gKKworI2luY2x1ZGUgPGNzdGRsaWI+CisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfdHlwZS5oIgorCisvKioKKyAqIEEgdGhyaWZ0IGJhc2UgdHlwZSwgd2hpY2ggbXVzdCBiZSBvbmUgb2YgdGhlIGRlZmluZWQgZW51bWVyYXRlZCB0eXBlcyBpbnNpZGUKKyAqIHRoaXMgZGVmaW5pdGlvbi4KKyAqCisgKi8KK2NsYXNzIHRfYmFzZV90eXBlIDogcHVibGljIHRfdHlwZSB7CitwdWJsaWM6CisgIC8qKgorICAgKiBFbnVtZXJhdGlvbiBvZiB0aHJpZnQgYmFzZSB0eXBlcworICAgKi8KKyAgZW51bSB0X2Jhc2UgeworICAgIFRZUEVfVk9JRCwKKyAgICBUWVBFX1NUUklORywKKyAgICBUWVBFX0JPT0wsCisgICAgVFlQRV9JOCwKKyAgICBUWVBFX0kxNiwKKyAgICBUWVBFX0kzMiwKKyAgICBUWVBFX0k2NCwKKyAgICBUWVBFX0RPVUJMRQorICB9OworCisgIHRfYmFzZV90eXBlKHN0ZDo6c3RyaW5nIG5hbWUsIHRfYmFzZSBiYXNlKQorICAgIDogdF90eXBlKG5hbWUpLCBiYXNlXyhiYXNlKSwgc3RyaW5nX2xpc3RfKGZhbHNlKSwgYmluYXJ5XyhmYWxzZSksIHN0cmluZ19lbnVtXyhmYWxzZSkge30KKworICB0X2Jhc2UgZ2V0X2Jhc2UoKSBjb25zdCB7IHJldHVybiBiYXNlXzsgfQorCisgIGJvb2wgaXNfdm9pZCgpIGNvbnN0IHsgcmV0dXJuIGJhc2VfID09IFRZUEVfVk9JRDsgfQorCisgIGJvb2wgaXNfc3RyaW5nKCkgY29uc3QgeyByZXR1cm4gYmFzZV8gPT0gVFlQRV9TVFJJTkc7IH0KKworICBib29sIGlzX2Jvb2woKSBjb25zdCB7IHJldHVybiBiYXNlXyA9PSBUWVBFX0JPT0w7IH0KKworICB2b2lkIHNldF9zdHJpbmdfbGlzdChib29sIHZhbCkgeyBzdHJpbmdfbGlzdF8gPSB2YWw7IH0KKworICBib29sIGlzX3N0cmluZ19saXN0KCkgY29uc3QgeyByZXR1cm4gc3RyaW5nX2xpc3RfICYmIChiYXNlXyA9PSBUWVBFX1NUUklORyk7IH0KKworICB2b2lkIHNldF9iaW5hcnkoYm9vbCB2YWwpIHsgYmluYXJ5XyA9IHZhbDsgfQorCisgIGJvb2wgaXNfYmluYXJ5KCkgY29uc3QgeyByZXR1cm4gYmluYXJ5XyAmJiAoYmFzZV8gPT0gVFlQRV9TVFJJTkcpOyB9CisKKyAgdm9pZCBzZXRfc3RyaW5nX2VudW0oYm9vbCB2YWwpIHsgc3RyaW5nX2VudW1fID0gdmFsOyB9CisKKyAgYm9vbCBpc19zdHJpbmdfZW51bSgpIGNvbnN0IHsgcmV0dXJuIHN0cmluZ19lbnVtXyAmJiBiYXNlXyA9PSBUWVBFX1NUUklORzsgfQorCisgIHZvaWQgYWRkX3N0cmluZ19lbnVtX3ZhbChzdGQ6OnN0cmluZyB2YWwpIHsgc3RyaW5nX2VudW1fdmFsc18ucHVzaF9iYWNrKHZhbCk7IH0KKworICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGdldF9zdHJpbmdfZW51bV92YWxzKCkgY29uc3QgeyByZXR1cm4gc3RyaW5nX2VudW1fdmFsc187IH0KKworICBib29sIGlzX2Jhc2VfdHlwZSgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKworICBzdGF0aWMgc3RkOjpzdHJpbmcgdF9iYXNlX25hbWUodF9iYXNlIHRiYXNlKSB7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgVFlQRV9WT0lEOgorICAgICAgcmV0dXJuICJ2b2lkIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gInN0cmluZyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiYm9vbCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRZUEVfSTg6CisgICAgICByZXR1cm4gImk4IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVFlQRV9JMTY6CisgICAgICByZXR1cm4gImkxNiI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRZUEVfSTMyOgorICAgICAgcmV0dXJuICJpMzIiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiaTY0IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gImRvdWJsZSI7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuICIodW5rbm93bikiOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKK3ByaXZhdGU6CisgIHRfYmFzZSBiYXNlXzsKKworICBib29sIHN0cmluZ19saXN0XzsKKyAgYm9vbCBiaW5hcnlfOworICBib29sIHN0cmluZ19lbnVtXzsKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHN0cmluZ19lbnVtX3ZhbHNfOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X2NvbnN0LmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X2NvbnN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2MwOGUwZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfY29uc3QuaApAQCAtMCwwICsxLDUwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVF9DT05TVF9ICisjZGVmaW5lIFRfQ09OU1RfSAorCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfdHlwZS5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X2NvbnN0X3ZhbHVlLmgiCisKKy8qKgorICogQSBjb25zdCBpcyBhIGNvbnN0YW50IHZhbHVlIGRlZmluZWQgYWNyb3NzIGxhbmd1YWdlcyB0aGF0IGhhcyBhIHR5cGUgYW5kCisgKiBhIHZhbHVlLiBUaGUgdHJpY2sgaGVyZSBpcyB0aGF0IHRoZSBkZWNsYXJlZCB0eXBlIG1pZ2h0IG5vdCBtYXRjaCB0aGUgdHlwZQorICogb2YgdGhlIHZhbHVlIG9iamVjdCwgc2luY2UgdGhhdCBpcyBub3QgZGV0ZXJtaW5lZCB1bnRpbCBhZnRlciBwYXJzaW5nIHRoZQorICogd2hvbGUgdGhpbmcgb3V0LgorICoKKyAqLworY2xhc3MgdF9jb25zdCA6IHB1YmxpYyB0X2RvYyB7CitwdWJsaWM6CisgIHRfY29uc3QodF90eXBlKiB0eXBlLCBzdGQ6OnN0cmluZyBuYW1lLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkKKyAgICA6IHR5cGVfKHR5cGUpLCBuYW1lXyhuYW1lKSwgdmFsdWVfKHZhbHVlKSB7fQorCisgIHRfdHlwZSogZ2V0X3R5cGUoKSBjb25zdCB7IHJldHVybiB0eXBlXzsgfQorCisgIHN0ZDo6c3RyaW5nIGdldF9uYW1lKCkgY29uc3QgeyByZXR1cm4gbmFtZV87IH0KKworICB0X2NvbnN0X3ZhbHVlKiBnZXRfdmFsdWUoKSBjb25zdCB7IHJldHVybiB2YWx1ZV87IH0KKworcHJpdmF0ZToKKyAgdF90eXBlKiB0eXBlXzsKKyAgc3RkOjpzdHJpbmcgbmFtZV87CisgIHRfY29uc3RfdmFsdWUqIHZhbHVlXzsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9jb25zdF92YWx1ZS5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9jb25zdF92YWx1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhMTE0Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X2NvbnN0X3ZhbHVlLmgKQEAgLTAsMCArMSwyMTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUX0NPTlNUX1ZBTFVFX0gKKyNkZWZpbmUgVF9DT05TVF9WQUxVRV9ICisKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9lbnVtLmgiCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBwbHVnaW5fb3V0cHV0IHsKK3RlbXBsYXRlIDx0eXBlbmFtZSBGcm9tLCB0eXBlbmFtZSBUbz4KK3ZvaWQgY29udmVydChGcm9tKiwgVG8mKTsKK30KKworLyoqCisgKiBBIGNvbnN0IHZhbHVlIGlzIHNvbWV0aGluZyBwYXJzZWQgdGhhdCBjb3VsZCBiZSBhIG1hcCwgc2V0LCBsaXN0LCBzdHJ1Y3QKKyAqIG9yIHdoYXRldmVyLgorICoKKyAqLworY2xhc3MgdF9jb25zdF92YWx1ZSB7CitwdWJsaWM6CisgIC8qKgorICAgKiBDb21wYXJhdG9yIHRvIHNvcnQgZmllbGRzIGluIGFzY2VuZGluZyBvcmRlciBieSBrZXkuCisgICAqIE1ha2UgdGhpcyBhIGZ1bmN0b3IgaW5zdGVhZCBvZiBhIGZ1bmN0aW9uIHRvIGhlbHAgR0NDIGlubGluZSBpdC4KKyAgICovCisgIHN0cnVjdCB2YWx1ZV9jb21wYXJlIHsKKyAgcHVibGljOgorICAgIGJvb2wgb3BlcmF0b3IoKSh0X2NvbnN0X3ZhbHVlIGNvbnN0KiBjb25zdCYgbGVmdCwgdF9jb25zdF92YWx1ZSBjb25zdCogY29uc3QmIHJpZ2h0KSBjb25zdCB7CisgICAgICByZXR1cm4gKmxlZnQgPCAqcmlnaHQ7CisgICAgfQorICB9OworCisgIGVudW0gdF9jb25zdF92YWx1ZV90eXBlIHsgQ1ZfSU5URUdFUiwgQ1ZfRE9VQkxFLCBDVl9TVFJJTkcsIENWX01BUCwgQ1ZfTElTVCwgQ1ZfSURFTlRJRklFUiwgQ1ZfVU5LTk9XTiB9OworCisgIHRfY29uc3RfdmFsdWUoKSA6IGludFZhbF8oMCksIGRvdWJsZVZhbF8oMC4wZiksIGVudW1fKCh0X2VudW0qKTApLCB2YWxUeXBlXyhDVl9VTktOT1dOKSB7fQorCisgIHRfY29uc3RfdmFsdWUoaW50NjRfdCB2YWwpIDogZG91YmxlVmFsXygwLjBmKSwgZW51bV8oKHRfZW51bSopMCksIHZhbFR5cGVfKENWX1VOS05PV04pIHsgc2V0X2ludGVnZXIodmFsKTsgfQorCisgIHRfY29uc3RfdmFsdWUoc3RkOjpzdHJpbmcgdmFsKSA6IGludFZhbF8oMCksIGRvdWJsZVZhbF8oMC4wZiksIGVudW1fKCh0X2VudW0qKTApLCB2YWxUeXBlXyhDVl9VTktOT1dOKSB7IHNldF9zdHJpbmcodmFsKTsgfQorCisgIHZvaWQgc2V0X3N0cmluZyhzdGQ6OnN0cmluZyB2YWwpIHsKKyAgICB2YWxUeXBlXyA9IENWX1NUUklORzsKKyAgICBzdHJpbmdWYWxfID0gdmFsOworICB9CisKKyAgc3RkOjpzdHJpbmcgZ2V0X3N0cmluZygpIGNvbnN0IHsgcmV0dXJuIHN0cmluZ1ZhbF87IH0KKworICB2b2lkIHNldF9pbnRlZ2VyKGludDY0X3QgdmFsKSB7CisgICAgdmFsVHlwZV8gPSBDVl9JTlRFR0VSOworICAgIGludFZhbF8gPSB2YWw7CisgIH0KKworICBpbnQ2NF90IGdldF9pbnRlZ2VyKCkgY29uc3QgeworICAgIGlmICh2YWxUeXBlXyA9PSBDVl9JREVOVElGSUVSKSB7CisgICAgICBpZiAoZW51bV8gPT0gTlVMTCkgeworICAgICAgICB0aHJvdyAiaGF2ZSBpZGVudGlmaWVyIFwiIiArIGdldF9pZGVudGlmaWVyKCkgKyAiXCIsIGJ1dCB1bnNldCBlbnVtIG9uIGxpbmUhIjsKKyAgICAgIH0KKyAgICAgIHN0ZDo6c3RyaW5nIGlkZW50aWZpZXIgPSBnZXRfaWRlbnRpZmllcigpOworICAgICAgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBkb3QgPSBpZGVudGlmaWVyLnJmaW5kKCcuJyk7CisgICAgICBpZiAoZG90ICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgIGlkZW50aWZpZXIgPSBpZGVudGlmaWVyLnN1YnN0cihkb3QgKyAxKTsKKyAgICAgIH0KKyAgICAgIHRfZW51bV92YWx1ZSogdmFsID0gZW51bV8tPmdldF9jb25zdGFudF9ieV9uYW1lKGlkZW50aWZpZXIpOworICAgICAgaWYgKHZhbCA9PSBOVUxMKSB7CisgICAgICAgIHRocm93ICJVbmFibGUgdG8gZmluZCBlbnVtIHZhbHVlIFwiIiArIGlkZW50aWZpZXIgKyAiXCIgaW4gZW51bSBcIiIgKyBlbnVtXy0+Z2V0X25hbWUoKQorICAgICAgICAgICAgKyAiXCIiOworICAgICAgfQorICAgICAgcmV0dXJuIHZhbC0+Z2V0X3ZhbHVlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBpbnRWYWxfOworICAgIH0KKyAgfQorCisgIHZvaWQgc2V0X2RvdWJsZShkb3VibGUgdmFsKSB7CisgICAgdmFsVHlwZV8gPSBDVl9ET1VCTEU7CisgICAgZG91YmxlVmFsXyA9IHZhbDsKKyAgfQorCisgIGRvdWJsZSBnZXRfZG91YmxlKCkgY29uc3QgeyByZXR1cm4gZG91YmxlVmFsXzsgfQorCisgIHZvaWQgc2V0X21hcCgpIHsgdmFsVHlwZV8gPSBDVl9NQVA7IH0KKworICB2b2lkIGFkZF9tYXAodF9jb25zdF92YWx1ZSoga2V5LCB0X2NvbnN0X3ZhbHVlKiB2YWwpIHsgbWFwVmFsX1trZXldID0gdmFsOyB9CisKKyAgY29uc3Qgc3RkOjptYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgZ2V0X21hcCgpIGNvbnN0IHsgcmV0dXJuIG1hcFZhbF87IH0KKworICB2b2lkIHNldF9saXN0KCkgeyB2YWxUeXBlXyA9IENWX0xJU1Q7IH0KKworICB2b2lkIGFkZF9saXN0KHRfY29uc3RfdmFsdWUqIHZhbCkgeyBsaXN0VmFsXy5wdXNoX2JhY2sodmFsKTsgfQorCisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgZ2V0X2xpc3QoKSBjb25zdCB7IHJldHVybiBsaXN0VmFsXzsgfQorCisgIHZvaWQgc2V0X2lkZW50aWZpZXIoc3RkOjpzdHJpbmcgdmFsKSB7CisgICAgdmFsVHlwZV8gPSBDVl9JREVOVElGSUVSOworICAgIGlkZW50aWZpZXJWYWxfID0gdmFsOworICB9CisKKyAgc3RkOjpzdHJpbmcgZ2V0X2lkZW50aWZpZXIoKSBjb25zdCB7IHJldHVybiBpZGVudGlmaWVyVmFsXzsgfQorCisgIHN0ZDo6c3RyaW5nIGdldF9pZGVudGlmaWVyX25hbWUoKSBjb25zdCB7CisgICAgc3RkOjpzdHJpbmcgcmV0ID0gZ2V0X2lkZW50aWZpZXIoKTsKKyAgICBzaXplX3QgcyA9IHJldC5maW5kKCcuJyk7CisgICAgaWYgKHMgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgIHRocm93ICJlcnJvcjogaWRlbnRpZmllciAiICsgcmV0ICsgIiBpcyB1bnF1YWxpZmllZCEiOworICAgIH0KKyAgICByZXQgPSByZXQuc3Vic3RyKHMgKyAxKTsKKyAgICBzID0gcmV0LmZpbmQoJy4nKTsKKyAgICBpZiAocyAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgcmV0ID0gcmV0LnN1YnN0cihzICsgMSk7CisgICAgfQorICAgIHJldHVybiByZXQ7CisgIH0KKworICBzdGQ6OnN0cmluZyBnZXRfaWRlbnRpZmllcl93aXRoX3BhcmVudCgpIGNvbnN0IHsKKyAgICBzdGQ6OnN0cmluZyByZXQgPSBnZXRfaWRlbnRpZmllcigpOworICAgIHNpemVfdCBzID0gcmV0LmZpbmQoJy4nKTsKKyAgICBpZiAocyA9PSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgdGhyb3cgImVycm9yOiBpZGVudGlmaWVyICIgKyByZXQgKyAiIGlzIHVucXVhbGlmaWVkISI7CisgICAgfQorICAgIHNpemVfdCBzMiA9IHJldC5maW5kKCcuJywgcyArIDEpOworICAgIGlmIChzMiAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgcmV0ID0gcmV0LnN1YnN0cihzICsgMSk7CisgICAgfQorICAgIHJldHVybiByZXQ7CisgIH0KKworICB2b2lkIHNldF9lbnVtKHRfZW51bSogdGVudW0pIHsgZW51bV8gPSB0ZW51bTsgfQorCisgIHRfY29uc3RfdmFsdWVfdHlwZSBnZXRfdHlwZSgpIGNvbnN0IHsgaWYgKHZhbFR5cGVfID09IENWX1VOS05PV04pIHsgdGhyb3cgc3RkOjpzdHJpbmcoInVua25vd24gdF9jb25zdF92YWx1ZSIpOyB9IHJldHVybiB2YWxUeXBlXzsgfQorCisgIC8qKgorICAgKiBDb21wYXJhdG9yIHRvIHNvcnQgbWFwIGZpZWxkcyBpbiBhc2NlbmRpbmcgb3JkZXIgYnkga2V5IGFuZCB0aGVuIHZhbHVlLgorICAgKiBUaGlzIGlzIHVzZWQgZm9yIG1hcCBjb21wYXJpc29uIGluIGxleGljb2dyYXBoaWMgb3JkZXIuCisgICAqLworICBzdHJ1Y3QgbWFwX2VudHJ5X2NvbXBhcmUgeworICBwcml2YXRlOgorICAgIHR5cGVkZWYgc3RkOjpwYWlyPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4gQ29uc3RQYWlyOworICBwdWJsaWM6CisgICAgYm9vbCBvcGVyYXRvcigpKENvbnN0UGFpciBsZWZ0LCBDb25zdFBhaXIgcmlnaHQpIGNvbnN0IHsKKyAgICAgIGlmICgqKGxlZnQuZmlyc3QpIDwgKihyaWdodC5maXJzdCkpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoKihyaWdodC5maXJzdCkgPCAqKGxlZnQuZmlyc3QpKSB7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJldHVybiAqKGxlZnQuc2Vjb25kKSA8ICoocmlnaHQuc2Vjb25kKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfTsKKworICBib29sIG9wZXJhdG9yIDwgKGNvbnN0IHRfY29uc3RfdmFsdWUmIHRoYXQpIGNvbnN0IHsKKyAgICA6OnRfY29uc3RfdmFsdWU6OnRfY29uc3RfdmFsdWVfdHlwZSB0MSA9IGdldF90eXBlKCk7CisgICAgOjp0X2NvbnN0X3ZhbHVlOjp0X2NvbnN0X3ZhbHVlX3R5cGUgdDIgPSB0aGF0LmdldF90eXBlKCk7CisgICAgaWYgKHQxICE9IHQyKQorICAgICAgcmV0dXJuIHQxIDwgdDI7CisgICAgc3dpdGNoICh0MSkgeworICAgIGNhc2UgOjp0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSOgorICAgICAgcmV0dXJuIGludFZhbF8gPCB0aGF0LmludFZhbF87CisgICAgY2FzZSA6OnRfY29uc3RfdmFsdWU6OkNWX0RPVUJMRToKKyAgICAgIHJldHVybiBkb3VibGVWYWxfIDwgdGhhdC5kb3VibGVWYWxfOworICAgIGNhc2UgOjp0X2NvbnN0X3ZhbHVlOjpDVl9TVFJJTkc6CisgICAgICByZXR1cm4gc3RyaW5nVmFsXyA8IHRoYXQuc3RyaW5nVmFsXzsKKyAgICBjYXNlIDo6dF9jb25zdF92YWx1ZTo6Q1ZfSURFTlRJRklFUjoKKyAgICAgIHJldHVybiBpZGVudGlmaWVyVmFsXyA8IHRoYXQuaWRlbnRpZmllclZhbF87CisgICAgY2FzZSA6OnRfY29uc3RfdmFsdWU6OkNWX01BUDoKKyAgICAgIHJldHVybiBzdGQ6OmxleGljb2dyYXBoaWNhbF9jb21wYXJlKAorICAgICAgICAgIG1hcFZhbF8uYmVnaW4oKSwgbWFwVmFsXy5lbmQoKSwgdGhhdC5tYXBWYWxfLmJlZ2luKCksIHRoYXQubWFwVmFsXy5lbmQoKSwgbWFwX2VudHJ5X2NvbXBhcmUoKSk7CisgICAgY2FzZSA6OnRfY29uc3RfdmFsdWU6OkNWX0xJU1Q6CisgICAgICByZXR1cm4gc3RkOjpsZXhpY29ncmFwaGljYWxfY29tcGFyZSgKKyAgICAgICAgICBsaXN0VmFsXy5iZWdpbigpLCBsaXN0VmFsXy5lbmQoKSwgdGhhdC5saXN0VmFsXy5iZWdpbigpLCB0aGF0Lmxpc3RWYWxfLmVuZCgpLCB2YWx1ZV9jb21wYXJlKCkpOworICAgIGNhc2UgOjp0X2NvbnN0X3ZhbHVlOjpDVl9VTktOT1dOOgorICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAidW5rbm93biB2YWx1ZSB0eXBlIjsKKyAgICB9CisgIH0KKworcHJpdmF0ZToKKyAgc3RkOjptYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB2YWx1ZV9jb21wYXJlPiBtYXBWYWxfOworICBzdGQ6OnZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4gbGlzdFZhbF87CisgIHN0ZDo6c3RyaW5nIHN0cmluZ1ZhbF87CisgIGludDY0X3QgaW50VmFsXzsKKyAgZG91YmxlIGRvdWJsZVZhbF87CisgIHN0ZDo6c3RyaW5nIGlkZW50aWZpZXJWYWxfOworICB0X2VudW0qIGVudW1fOworCisgIHRfY29uc3RfdmFsdWVfdHlwZSB2YWxUeXBlXzsKKworICAvLyB0byByZWFkIGVudW1fCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBGcm9tLCB0eXBlbmFtZSBUbz4KKyAgZnJpZW5kIHZvaWQgcGx1Z2luX291dHB1dDo6Y29udmVydChGcm9tKiwgVG8mKTsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9jb250YWluZXIuaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfY29udGFpbmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJkYWI3MAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfY29udGFpbmVyLmgKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRfQ09OVEFJTkVSX0gKKyNkZWZpbmUgVF9DT05UQUlORVJfSAorCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfdHlwZS5oIgorCitjbGFzcyB0X2NvbnRhaW5lciA6IHB1YmxpYyB0X3R5cGUgeworcHVibGljOgorICB0X2NvbnRhaW5lcigpIDogY3BwX25hbWVfKCksIGhhc19jcHBfbmFtZV8oZmFsc2UpIHt9CisKKyAgdmlydHVhbCB+dF9jb250YWluZXIoKSB7fQorCisgIHZvaWQgc2V0X2NwcF9uYW1lKHN0ZDo6c3RyaW5nIGNwcF9uYW1lKSB7CisgICAgY3BwX25hbWVfID0gY3BwX25hbWU7CisgICAgaGFzX2NwcF9uYW1lXyA9IHRydWU7CisgIH0KKworICBib29sIGhhc19jcHBfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIGhhc19jcHBfbmFtZV87IH0KKworICBzdGQ6OnN0cmluZyBnZXRfY3BwX25hbWUoKSBjb25zdCB7IHJldHVybiBjcHBfbmFtZV87IH0KKworICBib29sIGlzX2NvbnRhaW5lcigpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKworcHJpdmF0ZToKKyAgc3RkOjpzdHJpbmcgY3BwX25hbWVfOworICBib29sIGhhc19jcHBfbmFtZV87Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfZG9jLmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X2RvYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiY2I4ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X2RvYy5oCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUX0RPQ19ICisjZGVmaW5lIFRfRE9DX0gKKworI2luY2x1ZGUgInRocmlmdC9nbG9iYWxzLmgiCisjaW5jbHVkZSAidGhyaWZ0L2xvZ2dpbmcuaCIKKworLyoqCisgKiBEb2N1bWVudGF0aW9uIHN0dWJzCisgKgorICovCitjbGFzcyB0X2RvYyB7CisKK3B1YmxpYzoKKyAgdF9kb2MoKSA6IGhhc19kb2NfKGZhbHNlKSB7fQorICB2aXJ0dWFsIH50X2RvYygpIHt9CisKKyAgdm9pZCBzZXRfZG9jKGNvbnN0IHN0ZDo6c3RyaW5nJiBkb2MpIHsKKyAgICBkb2NfID0gZG9jOworICAgIGhhc19kb2NfID0gdHJ1ZTsKKyAgICBpZiAoKGdfcHJvZ3JhbV9kb2N0ZXh0X2xpbmVubyA9PSBnX2RvY3RleHRfbGluZW5vKQorICAgICAgICAmJiAoZ19wcm9ncmFtX2RvY3RleHRfc3RhdHVzID09IFNUSUxMX0NBTkRJREFURSkpIHsKKyAgICAgIGdfcHJvZ3JhbV9kb2N0ZXh0X3N0YXR1cyA9IEFMUkVBRFlfUFJPQ0VTU0VEOworICAgICAgcGRlYnVnKCIlcyIsICJwcm9ncmFtIGRvY3RleHQgc2V0IHRvIEFMUkVBRFlfUFJPQ0VTU0VEIik7CisgICAgfQorICB9CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldF9kb2MoKSBjb25zdCB7IHJldHVybiBkb2NfOyB9CisKKyAgYm9vbCBoYXNfZG9jKCkgeyByZXR1cm4gaGFzX2RvY187IH0KKworcHJpdmF0ZToKKyAgc3RkOjpzdHJpbmcgZG9jXzsKKyAgYm9vbCBoYXNfZG9jXzsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9lbnVtLmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X2VudW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTIzNzgwCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9lbnVtLmgKQEAgLTAsMCArMSwxMTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUX0VOVU1fSAorI2RlZmluZSBUX0VOVU1fSAorCisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfZW51bV92YWx1ZS5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3R5cGUuaCIKKworLyoqCisgKiBBbiBlbnVtZXJhdGVkIHR5cGUuIEEgbGlzdCBvZiBjb25zdGFudCBvYmplY3RzIHdpdGggYSBuYW1lIGZvciB0aGUgdHlwZS4KKyAqCisgKi8KK2NsYXNzIHRfZW51bSA6IHB1YmxpYyB0X3R5cGUgeworcHVibGljOgorICB0X2VudW0odF9wcm9ncmFtKiBwcm9ncmFtKSA6IHRfdHlwZShwcm9ncmFtKSB7fQorCisgIHZvaWQgc2V0X25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIHsgbmFtZV8gPSBuYW1lOyB9CisKKyAgdm9pZCBhcHBlbmQodF9lbnVtX3ZhbHVlKiBjb25zdGFudCkgeyBjb25zdGFudHNfLnB1c2hfYmFjayhjb25zdGFudCk7IH0KKworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2VudW1fdmFsdWUqPiYgZ2V0X2NvbnN0YW50cygpIGNvbnN0IHsgcmV0dXJuIGNvbnN0YW50c187IH0KKworICB0X2VudW1fdmFsdWUqIGdldF9jb25zdGFudF9ieV9uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSB7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4mIGVudW1fdmFsdWVzID0gZ2V0X2NvbnN0YW50cygpOworICAgIHN0ZDo6dmVjdG9yPHRfZW51bV92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciBjX2l0ZXI7CisgICAgZm9yIChjX2l0ZXIgPSBlbnVtX3ZhbHVlcy5iZWdpbigpOyBjX2l0ZXIgIT0gZW51bV92YWx1ZXMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgICBpZiAoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpID09IG5hbWUpIHsKKyAgICAgICAgcmV0dXJuICpjX2l0ZXI7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBOVUxMOworICB9CisKKyAgdF9lbnVtX3ZhbHVlKiBnZXRfY29uc3RhbnRfYnlfdmFsdWUoaW50NjRfdCB2YWx1ZSkgeworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZW51bV92YWx1ZSo+JiBlbnVtX3ZhbHVlcyA9IGdldF9jb25zdGFudHMoKTsKKyAgICBzdGQ6OnZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3IgY19pdGVyOworICAgIGZvciAoY19pdGVyID0gZW51bV92YWx1ZXMuYmVnaW4oKTsgY19pdGVyICE9IGVudW1fdmFsdWVzLmVuZCgpOyArK2NfaXRlcikgeworICAgICAgaWYgKCgqY19pdGVyKS0+Z2V0X3ZhbHVlKCkgPT0gdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuICpjX2l0ZXI7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBOVUxMOworICB9CisKKyAgdF9lbnVtX3ZhbHVlKiBnZXRfbWluX3ZhbHVlKCkgeworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZW51bV92YWx1ZSo+JiBlbnVtX3ZhbHVlcyA9IGdldF9jb25zdGFudHMoKTsKKyAgICBzdGQ6OnZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3IgY19pdGVyOworICAgIHRfZW51bV92YWx1ZSogbWluX3ZhbHVlOworICAgIGlmIChlbnVtX3ZhbHVlcy5zaXplKCkgPT0gMCkgeworICAgICAgbWluX3ZhbHVlID0gTlVMTDsKKyAgICB9IGVsc2UgeworICAgICAgaW50IG1pbl92YWx1ZV92YWx1ZTsKKyAgICAgIG1pbl92YWx1ZSA9IGVudW1fdmFsdWVzLmZyb250KCk7CisgICAgICBtaW5fdmFsdWVfdmFsdWUgPSBtaW5fdmFsdWUtPmdldF92YWx1ZSgpOworICAgICAgZm9yIChjX2l0ZXIgPSBlbnVtX3ZhbHVlcy5iZWdpbigpOyBjX2l0ZXIgIT0gZW51bV92YWx1ZXMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgICAgIGlmICgoKmNfaXRlciktPmdldF92YWx1ZSgpIDwgbWluX3ZhbHVlX3ZhbHVlKSB7CisgICAgICAgICAgbWluX3ZhbHVlID0gKCpjX2l0ZXIpOworICAgICAgICAgIG1pbl92YWx1ZV92YWx1ZSA9IG1pbl92YWx1ZS0+Z2V0X3ZhbHVlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG1pbl92YWx1ZTsKKyAgfQorCisgIHRfZW51bV92YWx1ZSogZ2V0X21heF92YWx1ZSgpIHsKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2VudW1fdmFsdWUqPiYgZW51bV92YWx1ZXMgPSBnZXRfY29uc3RhbnRzKCk7CisgICAgc3RkOjp2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIGNfaXRlcjsKKyAgICB0X2VudW1fdmFsdWUqIG1heF92YWx1ZTsKKyAgICBpZiAoZW51bV92YWx1ZXMuc2l6ZSgpID09IDApIHsKKyAgICAgIG1heF92YWx1ZSA9IE5VTEw7CisgICAgfSBlbHNlIHsKKyAgICAgIGludCBtYXhfdmFsdWVfdmFsdWU7CisgICAgICBtYXhfdmFsdWUgPSBlbnVtX3ZhbHVlcy5iYWNrKCk7CisgICAgICBtYXhfdmFsdWVfdmFsdWUgPSBtYXhfdmFsdWUtPmdldF92YWx1ZSgpOworICAgICAgZm9yIChjX2l0ZXIgPSBlbnVtX3ZhbHVlcy5iZWdpbigpOyBjX2l0ZXIgIT0gZW51bV92YWx1ZXMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgICAgIGlmICgoKmNfaXRlciktPmdldF92YWx1ZSgpID4gbWF4X3ZhbHVlX3ZhbHVlKSB7CisgICAgICAgICAgbWF4X3ZhbHVlID0gKCpjX2l0ZXIpOworICAgICAgICAgIG1heF92YWx1ZV92YWx1ZSA9IG1heF92YWx1ZS0+Z2V0X3ZhbHVlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG1heF92YWx1ZTsKKyAgfQorCisgIGJvb2wgaXNfZW51bSgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKworcHJpdmF0ZToKKyAgc3RkOjp2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzXzsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9lbnVtX3ZhbHVlLmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X2VudW1fdmFsdWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGJmM2FkCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9lbnVtX3ZhbHVlLmgKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRfRU5VTV9WQUxVRV9ICisjZGVmaW5lIFRfRU5VTV9WQUxVRV9ICisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X2RvYy5oIgorCisvKioKKyAqIEEgY29uc3RhbnQuIFRoZXNlIGFyZSB1c2VkIGluc2lkZSBvZiBlbnVtIGRlZmluaXRpb25zLiBDb25zdGFudHMgYXJlIGp1c3QKKyAqIHN5bWJvbCBpZGVudGlmaWVycyB0aGF0IG1heSBvciBtYXkgbm90IGhhdmUgYW4gZXhwbGljaXQgdmFsdWUgYXNzb2NpYXRlZAorICogd2l0aCB0aGVtLgorICoKKyAqLworY2xhc3MgdF9lbnVtX3ZhbHVlIDogcHVibGljIHRfZG9jIHsKK3B1YmxpYzoKKyAgdF9lbnVtX3ZhbHVlKHN0ZDo6c3RyaW5nIG5hbWUsIGludCB2YWx1ZSkgOiBuYW1lXyhuYW1lKSwgdmFsdWVfKHZhbHVlKSB7fQorCisgIH50X2VudW1fdmFsdWUoKSB7fQorCisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIG5hbWVfOyB9CisKKyAgaW50IGdldF92YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIHZhbHVlXzsgfQorCisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gYW5ub3RhdGlvbnNfOworCitwcml2YXRlOgorICBzdGQ6OnN0cmluZyBuYW1lXzsKKyAgaW50IHZhbHVlXzsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9maWVsZC5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9maWVsZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1ZjFmODAKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X2ZpZWxkLmgKQEAgLTAsMCArMSwxMzQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUX0ZJRUxEX0gKKyNkZWZpbmUgVF9GSUVMRF9ICisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHNzdHJlYW0+CisKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9kb2MuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF90eXBlLmgiCisKKy8vIEZvcndhcmQgZGVjbGFyZSBmb3IgeHNkX2F0dHJzCitjbGFzcyB0X3N0cnVjdDsKKworLyoqCisgKiBDbGFzcyB0byByZXByZXNlbnQgYSBmaWVsZCBpbiBhIHRocmlmdCBzdHJ1Y3R1cmUuIEEgZmllbGQgaGFzIGEgZGF0YSB0eXBlLAorICogYSBzeW1ib2xpYyBuYW1lLCBhbmQgYSBudW1lcmljIGlkZW50aWZpZXIuCisgKgorICovCitjbGFzcyB0X2ZpZWxkIDogcHVibGljIHRfZG9jIHsKK3B1YmxpYzoKKyAgdF9maWVsZCh0X3R5cGUqIHR5cGUsIHN0ZDo6c3RyaW5nIG5hbWUpCisgICAgOiB0eXBlXyh0eXBlKSwKKyAgICAgIG5hbWVfKG5hbWUpLAorICAgICAga2V5XygwKSwKKyAgICAgIHZhbHVlXyhOVUxMKSwKKyAgICAgIHhzZF9vcHRpb25hbF8oZmFsc2UpLAorICAgICAgeHNkX25pbGxhYmxlXyhmYWxzZSksCisgICAgICB4c2RfYXR0cnNfKE5VTEwpLAorICAgICAgcmVmZXJlbmNlXyhmYWxzZSkge30KKworICB0X2ZpZWxkKHRfdHlwZSogdHlwZSwgc3RkOjpzdHJpbmcgbmFtZSwgaW50MzJfdCBrZXkpCisgICAgOiB0eXBlXyh0eXBlKSwKKyAgICAgIG5hbWVfKG5hbWUpLAorICAgICAga2V5XyhrZXkpLAorICAgICAgcmVxXyhUX09QVF9JTl9SRVFfT1VUKSwKKyAgICAgIHZhbHVlXyhOVUxMKSwKKyAgICAgIHhzZF9vcHRpb25hbF8oZmFsc2UpLAorICAgICAgeHNkX25pbGxhYmxlXyhmYWxzZSksCisgICAgICB4c2RfYXR0cnNfKE5VTEwpLAorICAgICAgcmVmZXJlbmNlXyhmYWxzZSkge30KKworICB+dF9maWVsZCgpIHt9CisKKyAgdF90eXBlKiBnZXRfdHlwZSgpIHsgcmV0dXJuIHR5cGVfOyB9CisKKyAgY29uc3QgdF90eXBlKiBnZXRfdHlwZSgpIGNvbnN0IHsgcmV0dXJuIHR5cGVfOyB9CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldF9uYW1lKCkgY29uc3QgeyByZXR1cm4gbmFtZV87IH0KKworICBpbnQzMl90IGdldF9rZXkoKSBjb25zdCB7IHJldHVybiBrZXlfOyB9CisKKyAgZW51bSBlX3JlcSB7IFRfUkVRVUlSRUQsIFRfT1BUSU9OQUwsIFRfT1BUX0lOX1JFUV9PVVQgfTsKKworICB2b2lkIHNldF9yZXEoZV9yZXEgcmVxKSB7IHJlcV8gPSByZXE7IH0KKworICBlX3JlcSBnZXRfcmVxKCkgY29uc3QgeyByZXR1cm4gcmVxXzsgfQorCisgIHZvaWQgc2V0X3ZhbHVlKHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7IHZhbHVlXyA9IHZhbHVlOyB9CisKKyAgdF9jb25zdF92YWx1ZSogZ2V0X3ZhbHVlKCkgeyByZXR1cm4gdmFsdWVfOyB9CisKKyAgY29uc3QgdF9jb25zdF92YWx1ZSogZ2V0X3ZhbHVlKCkgY29uc3QgeyByZXR1cm4gdmFsdWVfOyB9CisKKyAgdm9pZCBzZXRfeHNkX29wdGlvbmFsKGJvb2wgeHNkX29wdGlvbmFsKSB7IHhzZF9vcHRpb25hbF8gPSB4c2Rfb3B0aW9uYWw7IH0KKworICBib29sIGdldF94c2Rfb3B0aW9uYWwoKSBjb25zdCB7IHJldHVybiB4c2Rfb3B0aW9uYWxfOyB9CisKKyAgdm9pZCBzZXRfeHNkX25pbGxhYmxlKGJvb2wgeHNkX25pbGxhYmxlKSB7IHhzZF9uaWxsYWJsZV8gPSB4c2RfbmlsbGFibGU7IH0KKworICBib29sIGdldF94c2RfbmlsbGFibGUoKSBjb25zdCB7IHJldHVybiB4c2RfbmlsbGFibGVfOyB9CisKKyAgdm9pZCBzZXRfeHNkX2F0dHJzKHRfc3RydWN0KiB4c2RfYXR0cnMpIHsgeHNkX2F0dHJzXyA9IHhzZF9hdHRyczsgfQorCisgIHRfc3RydWN0KiBnZXRfeHNkX2F0dHJzKCkgeyByZXR1cm4geHNkX2F0dHJzXzsgfQorCisgIC8qKgorICAgKiBDb21wYXJhdG9yIHRvIHNvcnQgZmllbGRzIGluIGFzY2VuZGluZyBvcmRlciBieSBrZXkuCisgICAqIE1ha2UgdGhpcyBhIGZ1bmN0b3IgaW5zdGVhZCBvZiBhIGZ1bmN0aW9uIHRvIGhlbHAgR0NDIGlubGluZSBpdC4KKyAgICogVGhlIGFyZ3VtZW50cyBhcmUgKGNvbnN0KSByZWZlcmVuY2VzIHRvIGNvbnN0IHBvaW50ZXJzIHRvIGNvbnN0IHRfZmllbGRzLgorICAgKi8KKyAgc3RydWN0IGtleV9jb21wYXJlIHsKKyAgICBib29sIG9wZXJhdG9yKCkodF9maWVsZCBjb25zdCogY29uc3QmIGEsIHRfZmllbGQgY29uc3QqIGNvbnN0JiBiKSB7CisgICAgICByZXR1cm4gYS0+Z2V0X2tleSgpIDwgYi0+Z2V0X2tleSgpOworICAgIH0KKyAgfTsKKworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IGFubm90YXRpb25zXzsKKworICBib29sIGdldF9yZWZlcmVuY2UoKSB7IHJldHVybiByZWZlcmVuY2VfOyB9CisKKyAgdm9pZCBzZXRfcmVmZXJlbmNlKGJvb2wgcmVmZXJlbmNlKSB7IHJlZmVyZW5jZV8gPSByZWZlcmVuY2U7IH0KKworcHJpdmF0ZToKKyAgdF90eXBlKiB0eXBlXzsKKyAgc3RkOjpzdHJpbmcgbmFtZV87CisgIGludDMyX3Qga2V5XzsKKyAgZV9yZXEgcmVxXzsKKyAgdF9jb25zdF92YWx1ZSogdmFsdWVfOworCisgIGJvb2wgeHNkX29wdGlvbmFsXzsKKyAgYm9vbCB4c2RfbmlsbGFibGVfOworICB0X3N0cnVjdCogeHNkX2F0dHJzXzsKKyAgYm9vbCByZWZlcmVuY2VfOworfTsKKworLyoqCisgKiBBIHNpbXBsZSBzdHJ1Y3QgZm9yIHRoZSBwYXJzZXIgdG8gdXNlIHRvIHN0b3JlIGEgZmllbGQgSUQsIGFuZCB3aGV0aGVyIG9yCisgKiBub3QgaXQgd2FzIHNwZWNpZmllZCBieSB0aGUgdXNlciBvciBhdXRvbWF0aWNhbGx5IGNob3Nlbi4KKyAqLworc3RydWN0IHRfZmllbGRfaWQgeworICBpbnQzMl90IHZhbHVlOworICBib29sIGF1dG9fYXNzaWduZWQ7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfZnVuY3Rpb24uaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfZnVuY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmQyNjA5Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9mdW5jdGlvbi5oCkBAIC0wLDAgKzEsOTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUX0ZVTkNUSU9OX0gKKyNkZWZpbmUgVF9GVU5DVElPTl9ICisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfdHlwZS5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3N0cnVjdC5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X2RvYy5oIgorCisvKioKKyAqIFJlcHJlc2VudGF0aW9uIG9mIGEgZnVuY3Rpb24uIEtleSBwYXJ0cyBhcmUgcmV0dXJuIHR5cGUsIGZ1bmN0aW9uIG5hbWUsCisgKiBvcHRpb25hbCBtb2RpZmllcnMsIGFuZCBhbiBhcmd1bWVudCBsaXN0LCB3aGljaCBpcyBpbXBsZW1lbnRlZCBhcyBhIHRocmlmdAorICogc3RydWN0LgorICoKKyAqLworY2xhc3MgdF9mdW5jdGlvbiA6IHB1YmxpYyB0X2RvYyB7CitwdWJsaWM6CisgIHRfZnVuY3Rpb24odF90eXBlKiByZXR1cm50eXBlLCBzdGQ6OnN0cmluZyBuYW1lLCB0X3N0cnVjdCogYXJnbGlzdCwgYm9vbCBvbmV3YXkgPSBmYWxzZSkKKyAgICA6IHJldHVybnR5cGVfKHJldHVybnR5cGUpLAorICAgICAgbmFtZV8obmFtZSksCisgICAgICBhcmdsaXN0XyhhcmdsaXN0KSwKKyAgICAgIHhjZXB0aW9uc18obmV3IHRfc3RydWN0KE5VTEwpKSwKKyAgICAgIG93bl94Y2VwdGlvbnNfKHRydWUpLAorICAgICAgb25ld2F5XyhvbmV3YXkpIHsKKyAgICBpZiAob25ld2F5XyAmJiAoIXJldHVybnR5cGVfLT5pc192b2lkKCkpKSB7CisgICAgICBwd2FybmluZygxLCAiT25ld2F5IG1ldGhvZHMgc2hvdWxkIHJldHVybiB2b2lkLlxuIik7CisgICAgfQorICB9CisKKyAgdF9mdW5jdGlvbih0X3R5cGUqIHJldHVybnR5cGUsCisgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICB0X3N0cnVjdCogYXJnbGlzdCwKKyAgICAgICAgICAgICB0X3N0cnVjdCogeGNlcHRpb25zLAorICAgICAgICAgICAgIGJvb2wgb25ld2F5ID0gZmFsc2UpCisgICAgOiByZXR1cm50eXBlXyhyZXR1cm50eXBlKSwKKyAgICAgIG5hbWVfKG5hbWUpLAorICAgICAgYXJnbGlzdF8oYXJnbGlzdCksCisgICAgICB4Y2VwdGlvbnNfKHhjZXB0aW9ucyksCisgICAgICBvd25feGNlcHRpb25zXyhmYWxzZSksCisgICAgICBvbmV3YXlfKG9uZXdheSkgeworICAgIGlmIChvbmV3YXlfICYmICF4Y2VwdGlvbnNfLT5nZXRfbWVtYmVycygpLmVtcHR5KCkpIHsKKyAgICAgIHRocm93IHN0ZDo6c3RyaW5nKCJPbmV3YXkgbWV0aG9kcyBjYW4ndCB0aHJvdyBleGNlcHRpb25zLiIpOworICAgIH0KKyAgICBpZiAob25ld2F5XyAmJiAoIXJldHVybnR5cGVfLT5pc192b2lkKCkpKSB7CisgICAgICBwd2FybmluZygxLCAiT25ld2F5IG1ldGhvZHMgc2hvdWxkIHJldHVybiB2b2lkLlxuIik7CisgICAgfQorICB9CisKKyAgfnRfZnVuY3Rpb24oKSB7CisgICAgaWYgKG93bl94Y2VwdGlvbnNfKQorICAgICAgZGVsZXRlIHhjZXB0aW9uc187CisgIH0KKworICB0X3R5cGUqIGdldF9yZXR1cm50eXBlKCkgY29uc3QgeyByZXR1cm4gcmV0dXJudHlwZV87IH0KKworICBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0X25hbWUoKSBjb25zdCB7IHJldHVybiBuYW1lXzsgfQorCisgIHRfc3RydWN0KiBnZXRfYXJnbGlzdCgpIGNvbnN0IHsgcmV0dXJuIGFyZ2xpc3RfOyB9CisKKyAgdF9zdHJ1Y3QqIGdldF94Y2VwdGlvbnMoKSBjb25zdCB7IHJldHVybiB4Y2VwdGlvbnNfOyB9CisKKyAgYm9vbCBpc19vbmV3YXkoKSBjb25zdCB7IHJldHVybiBvbmV3YXlfOyB9CisKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBhbm5vdGF0aW9uc187CisKK3ByaXZhdGU6CisgIHRfdHlwZSogcmV0dXJudHlwZV87CisgIHN0ZDo6c3RyaW5nIG5hbWVfOworICB0X3N0cnVjdCogYXJnbGlzdF87CisgIHRfc3RydWN0KiB4Y2VwdGlvbnNfOworICBib29sIG93bl94Y2VwdGlvbnNfOworICBib29sIG9uZXdheV87Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfbGlzdC5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9saXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNmNjg2NQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfbGlzdC5oCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUX0xJU1RfSAorI2RlZmluZSBUX0xJU1RfSAorCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfY29udGFpbmVyLmgiCisKKy8qKgorICogQSBsaXN0IGlzIGEgbGlnaHR3ZWlnaHQgY29udGFpbmVyIHR5cGUgdGhhdCBqdXN0IHdyYXBzIGFub3RoZXIgZGF0YSB0eXBlLgorICoKKyAqLworY2xhc3MgdF9saXN0IDogcHVibGljIHRfY29udGFpbmVyIHsKK3B1YmxpYzoKKyAgdF9saXN0KHRfdHlwZSogZWxlbV90eXBlKSA6IGVsZW1fdHlwZV8oZWxlbV90eXBlKSB7fQorCisgIHRfdHlwZSogZ2V0X2VsZW1fdHlwZSgpIGNvbnN0IHsgcmV0dXJuIGVsZW1fdHlwZV87IH0KKworICBib29sIGlzX2xpc3QoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisKK3ByaXZhdGU6CisgIHRfdHlwZSogZWxlbV90eXBlXzsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9tYXAuaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfbWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQzZjA4OQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfbWFwLmgKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRfTUFQX0gKKyNkZWZpbmUgVF9NQVBfSAorCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfY29udGFpbmVyLmgiCisKKy8qKgorICogQSBtYXAgaXMgYSBsaWdodHdlaWdodCBjb250YWluZXIgdHlwZSB0aGF0IGp1c3Qgd3JhcHMgYW5vdGhlciB0d28gZGF0YQorICogdHlwZXMuCisgKgorICovCitjbGFzcyB0X21hcCA6IHB1YmxpYyB0X2NvbnRhaW5lciB7CitwdWJsaWM6CisgIHRfbWFwKHRfdHlwZSoga2V5X3R5cGUsIHRfdHlwZSogdmFsX3R5cGUpIDoga2V5X3R5cGVfKGtleV90eXBlKSwgdmFsX3R5cGVfKHZhbF90eXBlKSB7fQorCisgIHRfdHlwZSogZ2V0X2tleV90eXBlKCkgY29uc3QgeyByZXR1cm4ga2V5X3R5cGVfOyB9CisKKyAgdF90eXBlKiBnZXRfdmFsX3R5cGUoKSBjb25zdCB7IHJldHVybiB2YWxfdHlwZV87IH0KKworICBib29sIGlzX21hcCgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKworcHJpdmF0ZToKKyAgdF90eXBlKiBrZXlfdHlwZV87CisgIHRfdHlwZSogdmFsX3R5cGVfOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X3Byb2dyYW0uaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfcHJvZ3JhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzZGQ0NWEKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X3Byb2dyYW0uaApAQCAtMCwwICsxLDM5NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRfUFJPR1JBTV9ICisjZGVmaW5lIFRfUFJPR1JBTV9ICisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworLy8gRm9yIHByb2dyYW1fbmFtZSgpCisjaW5jbHVkZSAidGhyaWZ0L21haW4uaCIKKworI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X2RvYy5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3Njb3BlLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfYmFzZV90eXBlLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfdHlwZWRlZi5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X2VudW0uaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9jb25zdC5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3N0cnVjdC5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3NlcnZpY2UuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9saXN0LmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfbWFwLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3Rfc2V0LmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yX3JlZ2lzdHJ5LmgiCisvLyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9kb2MuaCIKKworLyoqCisgKiBUb3AgbGV2ZWwgY2xhc3MgcmVwcmVzZW50aW5nIGFuIGVudGlyZSB0aHJpZnQgcHJvZ3JhbS4gQSBwcm9ncmFtIGNvbnNpc3RzCisgKiBmdW5kYW1lbnRhbGx5IG9mIHRoZSBmb2xsb3dpbmc6CisgKgorICogICBUeXBlZGVmcworICogICBFbnVtZXJhdGlvbnMKKyAqICAgQ29uc3RhbnRzCisgKiAgIFN0cnVjdHMKKyAqICAgRXhjZXB0aW9ucworICogICBTZXJ2aWNlcworICoKKyAqIFRoZSBwcm9ncmFtIG1vZHVsZSBhbHNvIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9ucyBvZiB0aGUgYmFzZSB0eXBlcy4KKyAqCisgKi8KK2NsYXNzIHRfcHJvZ3JhbSA6IHB1YmxpYyB0X2RvYyB7CitwdWJsaWM6CisgIHRfcHJvZ3JhbShzdGQ6OnN0cmluZyBwYXRoLCBzdGQ6OnN0cmluZyBuYW1lKQorICAgIDogcGF0aF8ocGF0aCksIG5hbWVfKG5hbWUpLCBvdXRfcGF0aF8oIi4vIiksIG91dF9wYXRoX2lzX2Fic29sdXRlXyhmYWxzZSksIHNjb3BlXyhuZXcgdF9zY29wZSkge30KKworICB0X3Byb2dyYW0oc3RkOjpzdHJpbmcgcGF0aCkgOiBwYXRoXyhwYXRoKSwgb3V0X3BhdGhfKCIuLyIpLCBvdXRfcGF0aF9pc19hYnNvbHV0ZV8oZmFsc2UpIHsKKyAgICBuYW1lXyA9IHByb2dyYW1fbmFtZShwYXRoKTsKKyAgICBzY29wZV8gPSBuZXcgdF9zY29wZSgpOworICB9CisKKyAgfnRfcHJvZ3JhbSgpIHsKKyAgICBpZiAoc2NvcGVfKSB7CisgICAgICBkZWxldGUgc2NvcGVfOworICAgICAgc2NvcGVfID0gTlVMTDsKKyAgICB9CisgIH0KKworICAvLyBQYXRoIGFjY2Vzc29yCisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRfcGF0aCgpIGNvbnN0IHsgcmV0dXJuIHBhdGhfOyB9CisKKyAgLy8gT3V0cHV0IHBhdGggYWNjZXNzb3IKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldF9vdXRfcGF0aCgpIGNvbnN0IHsgcmV0dXJuIG91dF9wYXRoXzsgfQorCisgIC8vIENyZWF0ZSBnZW4tKiBkaXIgYWNjZXNzb3IKKyAgYm9vbCBpc19vdXRfcGF0aF9hYnNvbHV0ZSgpIGNvbnN0IHsgcmV0dXJuIG91dF9wYXRoX2lzX2Fic29sdXRlXzsgfQorCisgIC8vIE5hbWUgYWNjZXNzb3IKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldF9uYW1lKCkgY29uc3QgeyByZXR1cm4gbmFtZV87IH0KKworICAvLyBOYW1lc3BhY2UKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldF9uYW1lc3BhY2UoKSBjb25zdCB7IHJldHVybiBuYW1lc3BhY2VfOyB9CisKKyAgLy8gSW5jbHVkZSBwcmVmaXggYWNjZXNzb3IKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldF9pbmNsdWRlX3ByZWZpeCgpIGNvbnN0IHsgcmV0dXJuIGluY2x1ZGVfcHJlZml4XzsgfQorCisgIC8vIEFjY2Vzc29ycyBmb3IgcHJvZ3JhbSBlbGVtZW50cworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X3R5cGVkZWYqPiYgZ2V0X3R5cGVkZWZzKCkgY29uc3QgeyByZXR1cm4gdHlwZWRlZnNfOyB9CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZW51bSo+JiBnZXRfZW51bXMoKSBjb25zdCB7IHJldHVybiBlbnVtc187IH0KKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9jb25zdCo+JiBnZXRfY29uc3RzKCkgY29uc3QgeyByZXR1cm4gY29uc3RzXzsgfQorICBjb25zdCBzdGQ6OnZlY3Rvcjx0X3N0cnVjdCo+JiBnZXRfc3RydWN0cygpIGNvbnN0IHsgcmV0dXJuIHN0cnVjdHNfOyB9CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfc3RydWN0Kj4mIGdldF94Y2VwdGlvbnMoKSBjb25zdCB7IHJldHVybiB4Y2VwdGlvbnNfOyB9CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfc3RydWN0Kj4mIGdldF9vYmplY3RzKCkgY29uc3QgeyByZXR1cm4gb2JqZWN0c187IH0KKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9zZXJ2aWNlKj4mIGdldF9zZXJ2aWNlcygpIGNvbnN0IHsgcmV0dXJuIHNlcnZpY2VzXzsgfQorICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBnZXRfbmFtZXNwYWNlcygpIGNvbnN0IHsgcmV0dXJuIG5hbWVzcGFjZXNfOyB9CisKKyAgLy8gUHJvZ3JhbSBlbGVtZW50cworICB2b2lkIGFkZF90eXBlZGVmKHRfdHlwZWRlZiogdGQpIHsgdHlwZWRlZnNfLnB1c2hfYmFjayh0ZCk7IH0KKyAgdm9pZCBhZGRfZW51bSh0X2VudW0qIHRlKSB7IGVudW1zXy5wdXNoX2JhY2sodGUpOyB9CisgIHZvaWQgYWRkX2NvbnN0KHRfY29uc3QqIHRjKSB7IGNvbnN0c18ucHVzaF9iYWNrKHRjKTsgfQorICB2b2lkIGFkZF9zdHJ1Y3QodF9zdHJ1Y3QqIHRzKSB7CisgICAgb2JqZWN0c18ucHVzaF9iYWNrKHRzKTsKKyAgICBzdHJ1Y3RzXy5wdXNoX2JhY2sodHMpOworICB9CisgIHZvaWQgYWRkX3hjZXB0aW9uKHRfc3RydWN0KiB0eCkgeworICAgIG9iamVjdHNfLnB1c2hfYmFjayh0eCk7CisgICAgeGNlcHRpb25zXy5wdXNoX2JhY2sodHgpOworICB9CisgIHZvaWQgYWRkX3NlcnZpY2UodF9zZXJ2aWNlKiB0cykgeyBzZXJ2aWNlc18ucHVzaF9iYWNrKHRzKTsgfQorCisgIC8vIFByb2dyYW1zIHRvIGluY2x1ZGUKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9wcm9ncmFtKj4mIGdldF9pbmNsdWRlcygpIGNvbnN0IHsgcmV0dXJuIGluY2x1ZGVzXzsgfQorCisgIHZvaWQgc2V0X291dF9wYXRoKHN0ZDo6c3RyaW5nIG91dF9wYXRoLCBib29sIG91dF9wYXRoX2lzX2Fic29sdXRlKSB7CisgICAgb3V0X3BhdGhfID0gb3V0X3BhdGg7CisgICAgb3V0X3BhdGhfaXNfYWJzb2x1dGVfID0gb3V0X3BhdGhfaXNfYWJzb2x1dGU7CisgICAgLy8gRW5zdXJlIHRoYXQgaXQgZW5kcyB3aXRoIGEgdHJhaWxpbmcgJy8nIChvciAnXCcgZm9yIHdpbmRvd3MgbWFjaGluZXMpCisgICAgY2hhciBjID0gb3V0X3BhdGhfLmF0KG91dF9wYXRoXy5zaXplKCkgLSAxKTsKKyAgICBpZiAoIShjID09ICcvJyB8fCBjID09ICdcXCcpKSB7CisgICAgICBvdXRfcGF0aF8ucHVzaF9iYWNrKCcvJyk7CisgICAgfQorICB9CisKKyAgLy8gVHlwZW5hbWUgY29sbGlzaW9uIGRldGVjdGlvbgorICAvKioKKyAgICogU2VhcmNoIGZvciB0eXBlbmFtZSBjb2xsaXNpb25zCisgICAqIEBwYXJhbSB0ICAgIHRoZSB0eXBlIHRvIHRlc3QgZm9yIGNvbGxpc2lvbnMKKyAgICogQHJldHVybiAgICAgdHJ1ZSBpZiBhIGNlcnRhaW4gY29sbGlzaW9uIHdhcyBmb3VuZCwgb3RoZXJ3aXNlIGZhbHNlCisgICAqLworICBib29sIGlzX3VuaXF1ZV90eXBlbmFtZSh0X3R5cGUqIHQpIHsKKyAgICBpbnQgb2NjdXJyZW5jZXMgPSBwcm9ncmFtX3R5cGVuYW1lX2NvdW50KHRoaXMsIHQpOworICAgIGZvciAoc3RkOjp2ZWN0b3I8dF9wcm9ncmFtKj46Oml0ZXJhdG9yIGl0ID0gaW5jbHVkZXNfLmJlZ2luKCk7IGl0ICE9IGluY2x1ZGVzXy5lbmQoKTsgKytpdCkgeworICAgICAgb2NjdXJyZW5jZXMgKz0gcHJvZ3JhbV90eXBlbmFtZV9jb3VudCgqaXQsIHQpOworICAgIH0KKyAgICByZXR1cm4gMCA9PSBvY2N1cnJlbmNlczsKKyAgfQorCisgIC8qKgorICAgKiBTZWFyY2ggYWxsIHR5cGUgY29sbGVjdGlvbnMgZm9yIGR1cGxpY2F0ZSB0eXBlbmFtZXMKKyAgICogQHBhcmFtIHByb2cgdGhlIHByb2dyYW0gdG8gc2VhcmNoCisgICAqIEBwYXJhbSB0ICAgIHRoZSB0eXBlIHRvIHRlc3QgZm9yIGNvbGxpc2lvbnMKKyAgICogQHJldHVybiAgICAgdGhlIG51bWJlciBvZiBjZXJ0YWluIHR5cGVuYW1lIGNvbGxpc2lvbnMKKyAgICovCisgIGludCBwcm9ncmFtX3R5cGVuYW1lX2NvdW50KHRfcHJvZ3JhbSogcHJvZywgdF90eXBlKiB0KSB7CisgICAgaW50IG9jY3VycmVuY2VzID0gMDsKKyAgICBvY2N1cnJlbmNlcyArPSBjb2xsZWN0aW9uX3R5cGVuYW1lX2NvdW50KHByb2csIHByb2ctPnR5cGVkZWZzXywgdCk7CisgICAgb2NjdXJyZW5jZXMgKz0gY29sbGVjdGlvbl90eXBlbmFtZV9jb3VudChwcm9nLCBwcm9nLT5lbnVtc18sIHQpOworICAgIG9jY3VycmVuY2VzICs9IGNvbGxlY3Rpb25fdHlwZW5hbWVfY291bnQocHJvZywgcHJvZy0+b2JqZWN0c18sIHQpOworICAgIG9jY3VycmVuY2VzICs9IGNvbGxlY3Rpb25fdHlwZW5hbWVfY291bnQocHJvZywgcHJvZy0+c2VydmljZXNfLCB0KTsKKyAgICByZXR1cm4gb2NjdXJyZW5jZXM7CisgIH0KKworICAvKioKKyAgICogU2VhcmNoIGEgdHlwZSBjb2xsZWN0aW9uIGZvciBkdXBsaWNhdGUgdHlwZW5hbWVzCisgICAqIEBwYXJhbSBwcm9nICAgICAgICAgICAgdGhlIHByb2dyYW0gdG8gc2VhcmNoCisgICAqIEBwYXJhbSB0eXBlX2NvbGxlY3Rpb24gdGhlIHR5cGUgY29sbGVjdGlvbiB0byBzZWFyY2gKKyAgICogQHBhcmFtIHQgICAgICAgICAgICAgICB0aGUgdHlwZSB0byB0ZXN0IGZvciBjb2xsaXNpb25zCisgICAqIEByZXR1cm4gICAgICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjZXJ0YWluIHR5cGVuYW1lIGNvbGxpc2lvbnMKKyAgICovCisgIHRlbXBsYXRlIDxjbGFzcyBUPgorICBpbnQgY29sbGVjdGlvbl90eXBlbmFtZV9jb3VudCh0X3Byb2dyYW0qIHByb2csIFQgdHlwZV9jb2xsZWN0aW9uLCB0X3R5cGUqIHQpIHsKKyAgICBpbnQgb2NjdXJyZW5jZXMgPSAwOworICAgIGZvciAodHlwZW5hbWUgVDo6aXRlcmF0b3IgaXQgPSB0eXBlX2NvbGxlY3Rpb24uYmVnaW4oKTsgaXQgIT0gdHlwZV9jb2xsZWN0aW9uLmVuZCgpOyArK2l0KQorICAgICAgaWYgKHQgIT0gKml0ICYmIDAgPT0gdC0+Z2V0X25hbWUoKS5jb21wYXJlKCgqaXQpLT5nZXRfbmFtZSgpKSAmJiBpc19jb21tb25fbmFtZXNwYWNlKHByb2csIHQpKQorICAgICAgICArK29jY3VycmVuY2VzOworICAgIHJldHVybiBvY2N1cnJlbmNlczsKKyAgfQorCisgIC8qKgorICAgKiBEZXRlcm1pbmUgd2hldGhlciBpZGVudGljYWwgdHlwZW5hbWVzIHdpbGwgY29sbGlkZSBiYXNlZCBvbiBuYW1lc3BhY2VzLgorICAgKgorICAgKiBCZWNhdXNlIHdlIGRvIG5vdCBrbm93IHdoaWNoIGxhbmd1YWdlcyB0aGUgdXNlciB3aWxsIGdlbmVyYXRlIGNvZGUgZm9yLAorICAgKiBjb2xsaXNpb25zIHdpdGhpbiBwcm9ncmFtcyAoSURMIGZpbGVzKSBoYXZpbmcgbmFtZXNwYWNlIGRlY2xhcmF0aW9ucyBjYW4gYmUKKyAgICogZGlmZmljdWx0IHRvIGRldGVybWluZS4gT25seSBndWFyYW50ZWVkIGNvbGxpc2lvbnMgcmV0dXJuIHRydWUgKGNhdXNlIGFuIGVycm9yKS4KKyAgICogUG9zc2libGUgY29sbGlzaW9ucyBpbnZvbHZpbmcgZXhwbGljaXQgbmFtZXNwYWNlIGRlY2xhcmF0aW9ucyBwcm9kdWNlIGEgd2FybmluZy4KKyAgICogT3RoZXIgcG9zc2libGUgY29sbGlzaW9ucyBnbyB1bnJlcG9ydGVkLgorICAgKiBAcGFyYW0gcHJvZyB0aGUgcHJvZ3JhbSBjb250YWluaW5nIHRoZSBwcmVleGlzdGluZyB0eXBlbmFtZQorICAgKiBAcGFyYW0gdCAgICB0aGUgdHlwZSBjb250YWluaW5nIHRoZSB0eXBlbmFtZSBtYXRjaAorICAgKiBAcmV0dXJuICAgICB0cnVlIGlmIGEgY29sbGlzaW9uIHdpdGhpbiBuYW1lc3BhY2VzIGlzIGZvdW5kLCBvdGhlcndpc2UgZmFsc2UKKyAgICovCisgIGJvb2wgaXNfY29tbW9uX25hbWVzcGFjZSh0X3Byb2dyYW0qIHByb2csIHRfdHlwZSogdCkgeworICAgIC8vIENhc2UgMTogVHlwZW5hbWVzIGFyZSBpbiB0aGUgc2FtZSBwcm9ncmFtIFtjb2xsaXNpb25dCisgICAgaWYgKHByb2cgPT0gdC0+Z2V0X3Byb2dyYW0oKSkgeworICAgICAgcHdhcm5pbmcoMSwKKyAgICAgICAgICAgICAgICJEdXBsaWNhdGUgdHlwZW5hbWUgJXMgZm91bmQgaW4gJXMiLAorICAgICAgICAgICAgICAgdC0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICAgICAgdC0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIENhc2UgMjogQm90aCBwcm9ncmFtcyBoYXZlIGlkZW50aWNhbCBuYW1lc3BhY2Ugc2NvcGUvbmFtZSBkZWNsYXJhdGlvbnMgW2NvbGxpc2lvbl0KKyAgICBib29sIG1hdGNoID0gdHJ1ZTsKKyAgICBmb3IgKHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46Oml0ZXJhdG9yIGl0ID0gcHJvZy0+bmFtZXNwYWNlc18uYmVnaW4oKTsKKyAgICAgICAgIGl0ICE9IHByb2ctPm5hbWVzcGFjZXNfLmVuZCgpOworICAgICAgICAgKytpdCkgeworICAgICAgaWYgKDAgPT0gaXQtPnNlY29uZC5jb21wYXJlKHQtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lc3BhY2UoaXQtPmZpcnN0KSkpIHsKKyAgICAgICAgcHdhcm5pbmcoMSwKKyAgICAgICAgICAgICAgICAgIkR1cGxpY2F0ZSB0eXBlbmFtZSAlcyBmb3VuZCBpbiAlcywlcywlcyBhbmQgJXMsJXMsJXMgW2ZpbGUsc2NvcGUsbnNdIiwKKyAgICAgICAgICAgICAgICAgdC0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICB0LT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgIGl0LT5maXJzdC5jX3N0cigpLAorICAgICAgICAgICAgICAgICBpdC0+c2Vjb25kLmNfc3RyKCksCisgICAgICAgICAgICAgICAgIHByb2ctPmdldF9uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgaXQtPmZpcnN0LmNfc3RyKCksCisgICAgICAgICAgICAgICAgIGl0LT5zZWNvbmQuY19zdHIoKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBtYXRjaCA9IGZhbHNlOworICAgICAgfQorICAgIH0KKyAgICBmb3IgKHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46Oml0ZXJhdG9yIGl0ID0gdC0+Z2V0X3Byb2dyYW0oKS0+bmFtZXNwYWNlc18uYmVnaW4oKTsKKyAgICAgICAgIGl0ICE9IHQtPmdldF9wcm9ncmFtKCktPm5hbWVzcGFjZXNfLmVuZCgpOworICAgICAgICAgKytpdCkgeworICAgICAgaWYgKDAgPT0gaXQtPnNlY29uZC5jb21wYXJlKHByb2ctPmdldF9uYW1lc3BhY2UoaXQtPmZpcnN0KSkpIHsKKyAgICAgICAgcHdhcm5pbmcoMSwKKyAgICAgICAgICAgICAgICAgIkR1cGxpY2F0ZSB0eXBlbmFtZSAlcyBmb3VuZCBpbiAlcywlcywlcyBhbmQgJXMsJXMsJXMgW2ZpbGUsc2NvcGUsbnNdIiwKKyAgICAgICAgICAgICAgICAgdC0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICB0LT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgIGl0LT5maXJzdC5jX3N0cigpLAorICAgICAgICAgICAgICAgICBpdC0+c2Vjb25kLmNfc3RyKCksCisgICAgICAgICAgICAgICAgIHByb2ctPmdldF9uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgaXQtPmZpcnN0LmNfc3RyKCksCisgICAgICAgICAgICAgICAgIGl0LT5zZWNvbmQuY19zdHIoKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBtYXRjaCA9IGZhbHNlOworICAgICAgfQorICAgIH0KKyAgICBpZiAoMCA9PSBwcm9nLT5uYW1lc3BhY2VzXy5zaXplKCkgJiYgMCA9PSB0LT5nZXRfcHJvZ3JhbSgpLT5uYW1lc3BhY2VzXy5zaXplKCkpIHsKKyAgICAgIHB3YXJuaW5nKDEsCisgICAgICAgICAgICAgICAiRHVwbGljYXRlIHR5cGVuYW1lICVzIGZvdW5kIGluICVzIGFuZCAlcyIsCisgICAgICAgICAgICAgICB0LT5nZXRfbmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgICAgICB0LT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgICAgICBwcm9nLT5nZXRfbmFtZSgpLmNfc3RyKCkpOworICAgIH0KKyAgICByZXR1cm4gbWF0Y2g7CisgIH0KKworICAvLyBTY29waW5nIGFuZCBuYW1lc3BhY2luZworICB2b2lkIHNldF9uYW1lc3BhY2Uoc3RkOjpzdHJpbmcgbmFtZSkgeyBuYW1lc3BhY2VfID0gbmFtZTsgfQorCisgIC8vIFNjb3BlIGFjY2Vzc29yCisgIHRfc2NvcGUqIHNjb3BlKCkgY29uc3QgeyByZXR1cm4gc2NvcGVfOyB9CisKKyAgLy8gSW5jbHVkZXMKKworICB2b2lkIGFkZF9pbmNsdWRlKHRfcHJvZ3JhbSogcHJvZ3JhbSkgeworICAgIGluY2x1ZGVzXy5wdXNoX2JhY2socHJvZ3JhbSk7CisgIH0KKworICB2b2lkIGFkZF9pbmNsdWRlKHN0ZDo6c3RyaW5nIHBhdGgsIHN0ZDo6c3RyaW5nIGluY2x1ZGVfc2l0ZSkgeworICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IG5ldyB0X3Byb2dyYW0ocGF0aCk7CisKKyAgICAvLyBpbmNsdWRlIHByZWZpeCBmb3IgdGhpcyBwcm9ncmFtIGlzIHRoZSBzaXRlIGF0IHdoaWNoIGl0IHdhcyBpbmNsdWRlZAorICAgIC8vIChtaW51cyB0aGUgZmlsZW5hbWUpCisgICAgc3RkOjpzdHJpbmcgaW5jbHVkZV9wcmVmaXg7CisgICAgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBsYXN0X3NsYXNoID0gc3RkOjpzdHJpbmc6Om5wb3M7CisgICAgaWYgKChsYXN0X3NsYXNoID0gaW5jbHVkZV9zaXRlLnJmaW5kKCIvIikpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICBpbmNsdWRlX3ByZWZpeCA9IGluY2x1ZGVfc2l0ZS5zdWJzdHIoMCwgbGFzdF9zbGFzaCk7CisgICAgfQorCisgICAgcHJvZ3JhbS0+c2V0X2luY2x1ZGVfcHJlZml4KGluY2x1ZGVfcHJlZml4KTsKKyAgICBpbmNsdWRlc18ucHVzaF9iYWNrKHByb2dyYW0pOworICB9CisKKyAgc3RkOjp2ZWN0b3I8dF9wcm9ncmFtKj4mIGdldF9pbmNsdWRlcygpIHsgcmV0dXJuIGluY2x1ZGVzXzsgfQorCisgIHZvaWQgc2V0X2luY2x1ZGVfcHJlZml4KHN0ZDo6c3RyaW5nIGluY2x1ZGVfcHJlZml4KSB7CisgICAgaW5jbHVkZV9wcmVmaXhfID0gaW5jbHVkZV9wcmVmaXg7CisKKyAgICAvLyB0aGlzIGlzIGludGVuZGVkIHRvIGJlIGEgZGlyZWN0b3J5OyBhZGQgYSB0cmFpbGluZyBzbGFzaCBpZiBuZWNlc3NhcnkKKyAgICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIGxlbiA9IGluY2x1ZGVfcHJlZml4Xy5zaXplKCk7CisgICAgaWYgKGxlbiA+IDAgJiYgaW5jbHVkZV9wcmVmaXhfW2xlbiAtIDFdICE9ICcvJykgeworICAgICAgaW5jbHVkZV9wcmVmaXhfICs9ICcvJzsKKyAgICB9CisgIH0KKworICAvLyBMYW5ndWFnZSBuZXV0cmFsIG5hbWVzcGFjZSAvIHBhY2thZ2luZworICB2b2lkIHNldF9uYW1lc3BhY2Uoc3RkOjpzdHJpbmcgbGFuZ3VhZ2UsIHN0ZDo6c3RyaW5nIG5hbWVfc3BhY2UpIHsKKyAgICBpZiAobGFuZ3VhZ2UgIT0gIioiKSB7CisgICAgICBzaXplX3Qgc3ViX2luZGV4ID0gbGFuZ3VhZ2UuZmluZCgnLicpOworICAgICAgc3RkOjpzdHJpbmcgYmFzZV9sYW5ndWFnZSA9IGxhbmd1YWdlLnN1YnN0cigwLCBzdWJfaW5kZXgpOworICAgICAgc3RkOjpzdHJpbmcgc3ViX25hbWVzcGFjZTsKKworICAgICAgaWYgKGJhc2VfbGFuZ3VhZ2UgPT0gInNtYWxsdGFsayIpIHsKKyAgICAgICAgcHdhcm5pbmcoMSwgIk5hbWVzcGFjZSAnc21hbGx0YWxrJyBpcyBkZXByZWNhdGVkLiBVc2UgJ3N0JyBpbnN0ZWFkIik7CisgICAgICAgIGJhc2VfbGFuZ3VhZ2UgPSAic3QiOworICAgICAgfQorCisgICAgICB0X2dlbmVyYXRvcl9yZWdpc3RyeTo6Z2VuX21hcF90IG15X2NvcHkgPSB0X2dlbmVyYXRvcl9yZWdpc3RyeTo6Z2V0X2dlbmVyYXRvcl9tYXAoKTsKKworICAgICAgdF9nZW5lcmF0b3JfcmVnaXN0cnk6Omdlbl9tYXBfdDo6aXRlcmF0b3IgaXQ7CisgICAgICBpdCA9IG15X2NvcHkuZmluZChiYXNlX2xhbmd1YWdlKTsKKworICAgICAgaWYgKGl0ID09IG15X2NvcHkuZW5kKCkpIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgd2FybmluZyA9ICJObyBnZW5lcmF0b3IgbmFtZWQgJyIgKyBiYXNlX2xhbmd1YWdlICsgIicgY291bGQgYmUgZm91bmQhIjsKKyAgICAgICAgcHdhcm5pbmcoMSwgd2FybmluZy5jX3N0cigpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChzdWJfaW5kZXggIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICBzdGQ6OnN0cmluZyBzdWJfbmFtZXNwYWNlID0gbGFuZ3VhZ2Uuc3Vic3RyKHN1Yl9pbmRleCArIDEpOworICAgICAgICAgIGlmICghaXQtPnNlY29uZC0+aXNfdmFsaWRfbmFtZXNwYWNlKHN1Yl9uYW1lc3BhY2UpKSB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyB3YXJuaW5nID0gYmFzZV9sYW5ndWFnZSArICIgZ2VuZXJhdG9yIGRvZXMgbm90IGFjY2VwdCAnIiArIHN1Yl9uYW1lc3BhY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICInIGFzIHN1Yi1uYW1lc3BhY2UhIjsKKyAgICAgICAgICAgIHB3YXJuaW5nKDEsIHdhcm5pbmcuY19zdHIoKSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgbmFtZXNwYWNlc19bbGFuZ3VhZ2VdID0gbmFtZV9zcGFjZTsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIGdldF9uYW1lc3BhY2Uoc3RkOjpzdHJpbmcgbGFuZ3VhZ2UpIGNvbnN0IHsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworICAgIGlmICgoaXRlciA9IG5hbWVzcGFjZXNfLmZpbmQobGFuZ3VhZ2UpKSAhPSBuYW1lc3BhY2VzXy5lbmQoKQorICAgICAgICB8fCAoaXRlciA9IG5hbWVzcGFjZXNfLmZpbmQoIioiKSkgIT0gbmFtZXNwYWNlc18uZW5kKCkpIHsKKyAgICAgIHJldHVybiBpdGVyLT5zZWNvbmQ7CisgICAgfQorICAgIHJldHVybiBzdGQ6OnN0cmluZygpOworICB9CisKKyAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgZ2V0X2FsbF9uYW1lc3BhY2VzKCl7CisgICAgIHJldHVybiBuYW1lc3BhY2VzXzsKKyAgfQorCisgIHZvaWQgc2V0X25hbWVzcGFjZV9hbm5vdGF0aW9ucyhzdGQ6OnN0cmluZyBsYW5ndWFnZSwgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBhbm5vdGF0aW9ucykgeworICAgIG5hbWVzcGFjZV9hbm5vdGF0aW9uc19bbGFuZ3VhZ2VdID0gYW5ub3RhdGlvbnM7CisgIH0KKworICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBnZXRfbmFtZXNwYWNlX2Fubm90YXRpb25zKHN0ZDo6c3RyaW5nIGxhbmd1YWdlKSB7CisgICAgcmV0dXJuIG5hbWVzcGFjZV9hbm5vdGF0aW9uc19bbGFuZ3VhZ2VdOworICB9CisKKyAgLy8gTGFuZ3VhZ2Ugc3BlY2lmaWMgbmFtZXNwYWNlIC8gcGFja2FnaW5nCisKKyAgdm9pZCBhZGRfY3BwX2luY2x1ZGUoc3RkOjpzdHJpbmcgcGF0aCkgeyBjcHBfaW5jbHVkZXNfLnB1c2hfYmFjayhwYXRoKTsgfQorCisgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgZ2V0X2NwcF9pbmNsdWRlcygpIHsgcmV0dXJuIGNwcF9pbmNsdWRlc187IH0KKworICB2b2lkIGFkZF9jX2luY2x1ZGUoc3RkOjpzdHJpbmcgcGF0aCkgeyBjX2luY2x1ZGVzXy5wdXNoX2JhY2socGF0aCk7IH0KKworICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGdldF9jX2luY2x1ZGVzKCkgeyByZXR1cm4gY19pbmNsdWRlc187IH0KKworcHJpdmF0ZToKKyAgLy8gRmlsZSBwYXRoCisgIHN0ZDo6c3RyaW5nIHBhdGhfOworCisgIC8vIE5hbWUKKyAgc3RkOjpzdHJpbmcgbmFtZV87CisKKyAgLy8gT3V0cHV0IGRpcmVjdG9yeQorICBzdGQ6OnN0cmluZyBvdXRfcGF0aF87CisKKyAgLy8gT3V0cHV0IGRpcmVjdG9yeSBpcyBhYnNvbHV0ZSBsb2NhdGlvbiBmb3IgZ2VuZXJhdGVkIHNvdXJjZSAobm8gZ2VuLSopCisgIGJvb2wgb3V0X3BhdGhfaXNfYWJzb2x1dGVfOworCisgIC8vIE5hbWVzcGFjZQorICBzdGQ6OnN0cmluZyBuYW1lc3BhY2VfOworCisgIC8vIEluY2x1ZGVkIHByb2dyYW1zCisgIHN0ZDo6dmVjdG9yPHRfcHJvZ3JhbSo+IGluY2x1ZGVzXzsKKworICAvLyBJbmNsdWRlIHByZWZpeCBmb3IgdGhpcyBwcm9ncmFtLCBpZiBhbnkKKyAgc3RkOjpzdHJpbmcgaW5jbHVkZV9wcmVmaXhfOworCisgIC8vIElkZW50aWZpZXIgbG9va3VwIHNjb3BlCisgIHRfc2NvcGUqIHNjb3BlXzsKKworICAvLyBDb21wb25lbnRzIHRvIGdlbmVyYXRlIGNvZGUgZm9yCisgIHN0ZDo6dmVjdG9yPHRfdHlwZWRlZio+IHR5cGVkZWZzXzsKKyAgc3RkOjp2ZWN0b3I8dF9lbnVtKj4gZW51bXNfOworICBzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzXzsKKyAgc3RkOjp2ZWN0b3I8dF9zdHJ1Y3QqPiBvYmplY3RzXzsKKyAgc3RkOjp2ZWN0b3I8dF9zdHJ1Y3QqPiBzdHJ1Y3RzXzsKKyAgc3RkOjp2ZWN0b3I8dF9zdHJ1Y3QqPiB4Y2VwdGlvbnNfOworICBzdGQ6OnZlY3Rvcjx0X3NlcnZpY2UqPiBzZXJ2aWNlc187CisKKyAgLy8gRHluYW1pYyBuYW1lc3BhY2VzCisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gbmFtZXNwYWNlc187CisKKyAgLy8gQW5ub3RhdGlvbnMgZm9yIGR5bmFtaWMgbmFtZXNwYWNlcworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiA+IG5hbWVzcGFjZV9hbm5vdGF0aW9uc187CisKKyAgLy8gQysrIGV4dHJhIGluY2x1ZGVzCisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBjcHBfaW5jbHVkZXNfOworCisgIC8vIEMgZXh0cmEgaW5jbHVkZXMKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGNfaW5jbHVkZXNfOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X3Njb3BlLmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X3Njb3BlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmYxNjBhNQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3Rfc2NvcGUuaApAQCAtMCwwICsxLDE4OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRfU0NPUEVfSAorI2RlZmluZSBUX1NDT1BFX0gKKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8c3N0cmVhbT4KKworI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3R5cGUuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9zZXJ2aWNlLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfY29uc3QuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9jb25zdF92YWx1ZS5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X2Jhc2VfdHlwZS5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X21hcC5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X2xpc3QuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9zZXQuaCIKKworbmFtZXNwYWNlIHBsdWdpbl9vdXRwdXQgewordGVtcGxhdGUgPHR5cGVuYW1lIEZyb20sIHR5cGVuYW1lIFRvPgordm9pZCBjb252ZXJ0KEZyb20qLCBUbyYpOworfQorCisvKioKKyAqIFRoaXMgcmVwcmVzZW50cyBhIHZhcmlhYmxlIHNjb3BlIHVzZWQgZm9yIGxvb2tpbmcgdXAgcHJlZGVmaW5lZCB0eXBlcyBhbmQKKyAqIHNlcnZpY2VzLiBUeXBpY2FsbHksIGEgc2NvcGUgaXMgYXNzb2NpYXRlZCB3aXRoIGEgdF9wcm9ncmFtLiBTY29wZXMgYXJlIG5vdAorICogdXNlZCB0byBkZXRlcm1pbmUgY29kZSBnZW5lcmF0aW9uLCBidXQgcmF0aGVyIHRvIHJlc29sdmUgaWRlbnRpZmllcnMgYXQKKyAqIHBhcnNlIHRpbWUuCisgKgorICovCitjbGFzcyB0X3Njb3BlIHsKK3B1YmxpYzoKKyAgdF9zY29wZSgpIHt9CisKKyAgdm9pZCBhZGRfdHlwZShzdGQ6OnN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUpIHsgdHlwZXNfW25hbWVdID0gdHlwZTsgfQorCisgIHRfdHlwZSogZ2V0X3R5cGUoc3RkOjpzdHJpbmcgbmFtZSkgeyByZXR1cm4gdHlwZXNfW25hbWVdOyB9CisKKyAgdm9pZCBhZGRfc2VydmljZShzdGQ6OnN0cmluZyBuYW1lLCB0X3NlcnZpY2UqIHNlcnZpY2UpIHsgc2VydmljZXNfW25hbWVdID0gc2VydmljZTsgfQorCisgIHRfc2VydmljZSogZ2V0X3NlcnZpY2Uoc3RkOjpzdHJpbmcgbmFtZSkgeyByZXR1cm4gc2VydmljZXNfW25hbWVdOyB9CisKKyAgdm9pZCBhZGRfY29uc3RhbnQoc3RkOjpzdHJpbmcgbmFtZSwgdF9jb25zdCogY29uc3RhbnQpIHsKKyAgICBpZiAoY29uc3RhbnRzXy5maW5kKG5hbWUpICE9IGNvbnN0YW50c18uZW5kKCkpIHsKKyAgICAgIHRocm93ICJFbnVtICIgKyBuYW1lICsgIiBpcyBhbHJlYWR5IGRlZmluZWQhIjsKKyAgICB9IGVsc2UgeworICAgICAgY29uc3RhbnRzX1tuYW1lXSA9IGNvbnN0YW50OworICAgIH0KKyAgfQorCisgIHRfY29uc3QqIGdldF9jb25zdGFudChzdGQ6OnN0cmluZyBuYW1lKSB7IHJldHVybiBjb25zdGFudHNfW25hbWVdOyB9CisKKyAgdm9pZCBwcmludCgpIHsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgdF90eXBlKj46Oml0ZXJhdG9yIGl0ZXI7CisgICAgZm9yIChpdGVyID0gdHlwZXNfLmJlZ2luKCk7IGl0ZXIgIT0gdHlwZXNfLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgIHByaW50ZigiJXMgPT4gJXNcbiIsIGl0ZXItPmZpcnN0LmNfc3RyKCksIGl0ZXItPnNlY29uZC0+Z2V0X25hbWUoKS5jX3N0cigpKTsKKyAgICB9CisgIH0KKworICB2b2lkIHJlc29sdmVfY29uc3RfdmFsdWUodF9jb25zdF92YWx1ZSogY29uc3RfdmFsLCB0X3R5cGUqIHR0eXBlKSB7CisgICAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgICAgY29uc3Qgc3RkOjptYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgbWFwID0gY29uc3RfdmFsLT5nZXRfbWFwKCk7CisgICAgICBzdGQ6Om1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgICBmb3IgKHZfaXRlciA9IG1hcC5iZWdpbigpOyB2X2l0ZXIgIT0gbWFwLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgICByZXNvbHZlX2NvbnN0X3ZhbHVlKHZfaXRlci0+Zmlyc3QsICgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpOworICAgICAgICByZXNvbHZlX2NvbnN0X3ZhbHVlKHZfaXRlci0+c2Vjb25kLCAoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gY29uc3RfdmFsLT5nZXRfbGlzdCgpOworICAgICAgc3RkOjp2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgICByZXNvbHZlX2NvbnN0X3ZhbHVlKCgqdl9pdGVyKSwgKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSBjb25zdF92YWwtPmdldF9saXN0KCk7CisgICAgICBzdGQ6OnZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICAgIHJlc29sdmVfY29uc3RfdmFsdWUoKCp2X2l0ZXIpLCAoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc3RydWN0KCkpIHsKKyAgICAgIHRfc3RydWN0KiB0c3RydWN0ID0gKHRfc3RydWN0Kil0dHlwZTsKKyAgICAgIGNvbnN0IHN0ZDo6bWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIG1hcCA9IGNvbnN0X3ZhbC0+Z2V0X21hcCgpOworICAgICAgc3RkOjptYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgICAgZm9yICh2X2l0ZXIgPSBtYXAuYmVnaW4oKTsgdl9pdGVyICE9IG1hcC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgICAgdF9maWVsZCogZmllbGQgPSB0c3RydWN0LT5nZXRfZmllbGRfYnlfbmFtZSh2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpOworICAgICAgICBpZiAoZmllbGQgPT0gTlVMTCkgeworICAgICAgICAgIHRocm93ICJObyBmaWVsZCBuYW1lZCBcIiIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkKKyAgICAgICAgICAgICAgKyAiXCIgd2FzIGZvdW5kIGluIHN0cnVjdCBvZiB0eXBlIFwiIiArIHRzdHJ1Y3QtPmdldF9uYW1lKCkgKyAiXCIiOworICAgICAgICB9CisgICAgICAgIHJlc29sdmVfY29uc3RfdmFsdWUodl9pdGVyLT5zZWNvbmQsIGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGNvbnN0X3ZhbC0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JREVOVElGSUVSKSB7CisgICAgICBpZiAodHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgICBjb25zdF92YWwtPnNldF9lbnVtKCh0X2VudW0qKXR0eXBlKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRfY29uc3QqIGNvbnN0YW50ID0gZ2V0X2NvbnN0YW50KGNvbnN0X3ZhbC0+Z2V0X2lkZW50aWZpZXIoKSk7CisgICAgICAgIGlmIChjb25zdGFudCA9PSBOVUxMKSB7CisgICAgICAgICAgdGhyb3cgIk5vIGVudW0gdmFsdWUgb3IgY29uc3RhbnQgZm91bmQgbmFtZWQgXCIiICsgY29uc3RfdmFsLT5nZXRfaWRlbnRpZmllcigpICsgIlwiISI7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXNvbHZlIHR5cGVkZWZzIHRvIHRoZSB1bmRlcmx5aW5nIHR5cGUKKyAgICAgICAgdF90eXBlKiBjb25zdF90eXBlID0gY29uc3RhbnQtPmdldF90eXBlKCktPmdldF90cnVlX3R5cGUoKTsKKworICAgICAgICBpZiAoY29uc3RfdHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgICAgICBzd2l0Y2ggKCgodF9iYXNlX3R5cGUqKWNvbnN0X3R5cGUpLT5nZXRfYmFzZSgpKSB7CisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgICAgICBjb25zdF92YWwtPnNldF9pbnRlZ2VyKGNvbnN0YW50LT5nZXRfdmFsdWUoKS0+Z2V0X2ludGVnZXIoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgICAgIGNvbnN0X3ZhbC0+c2V0X3N0cmluZyhjb25zdGFudC0+Z2V0X3ZhbHVlKCktPmdldF9zdHJpbmcoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgICAgIGNvbnN0X3ZhbC0+c2V0X2RvdWJsZShjb25zdGFudC0+Z2V0X3ZhbHVlKCktPmdldF9kb3VibGUoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgICAgICB0aHJvdyAiQ29uc3RhbnRzIGNhbm5vdCBiZSBvZiB0eXBlIFZPSUQiOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChjb25zdF90eXBlLT5pc19tYXAoKSkgeworICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIG1hcCA9IGNvbnN0YW50LT5nZXRfdmFsdWUoKS0+Z2V0X21hcCgpOworICAgICAgICAgIHN0ZDo6bWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKworICAgICAgICAgIGNvbnN0X3ZhbC0+c2V0X21hcCgpOworICAgICAgICAgIGZvciAodl9pdGVyID0gbWFwLmJlZ2luKCk7IHZfaXRlciAhPSBtYXAuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICAgICAgICBjb25zdF92YWwtPmFkZF9tYXAodl9pdGVyLT5maXJzdCwgdl9pdGVyLT5zZWNvbmQpOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChjb25zdF90eXBlLT5pc19saXN0KCkpIHsKKyAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IGNvbnN0YW50LT5nZXRfdmFsdWUoKS0+Z2V0X2xpc3QoKTsKKyAgICAgICAgICBzdGQ6OnZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKworICAgICAgICAgIGNvbnN0X3ZhbC0+c2V0X2xpc3QoKTsKKyAgICAgICAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgICAgICAgY29uc3RfdmFsLT5hZGRfbGlzdCgqdl9pdGVyKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIC8vIGVudW0gY29uc3RhbnQgd2l0aCBub24taWRlbnRpZmllciB2YWx1ZS4gc2V0IHRoZSBlbnVtIGFuZCBmaW5kIHRoZQorICAgICAgLy8gdmFsdWUncyBuYW1lLgorICAgICAgdF9lbnVtKiB0ZW51bSA9ICh0X2VudW0qKXR0eXBlOworICAgICAgdF9lbnVtX3ZhbHVlKiBlbnVtX3ZhbHVlID0gdGVudW0tPmdldF9jb25zdGFudF9ieV92YWx1ZShjb25zdF92YWwtPmdldF9pbnRlZ2VyKCkpOworICAgICAgaWYgKGVudW1fdmFsdWUgPT0gTlVMTCkgeworICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gdmFsc3RtOworICAgICAgICB2YWxzdG0gPDwgY29uc3RfdmFsLT5nZXRfaW50ZWdlcigpOworICAgICAgICB0aHJvdyAiQ291bGRuJ3QgZmluZCBhIG5hbWVkIHZhbHVlIGluIGVudW0gIiArIHRlbnVtLT5nZXRfbmFtZSgpICsgIiBmb3IgdmFsdWUgIgorICAgICAgICAgICAgKyB2YWxzdG0uc3RyKCk7CisgICAgICB9CisgICAgICBjb25zdF92YWwtPnNldF9pZGVudGlmaWVyKHRlbnVtLT5nZXRfbmFtZSgpICsgIi4iICsgZW51bV92YWx1ZS0+Z2V0X25hbWUoKSk7CisgICAgICBjb25zdF92YWwtPnNldF9lbnVtKHRlbnVtKTsKKyAgICB9CisgIH0KKworcHJpdmF0ZToKKyAgLy8gTWFwIG9mIG5hbWVzIHRvIHR5cGVzCisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCB0X3R5cGUqPiB0eXBlc187CisKKyAgLy8gTWFwIG9mIG5hbWVzIHRvIGNvbnN0YW50cworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgdF9jb25zdCo+IGNvbnN0YW50c187CisKKyAgLy8gTWFwIG9mIG5hbWVzIHRvIHNlcnZpY2VzCisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCB0X3NlcnZpY2UqPiBzZXJ2aWNlc187CisKKyAgLy8gdG8gbGlzdCBtYXAgZW50cmllcworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnJvbSwgdHlwZW5hbWUgVG8+CisgICAgZnJpZW5kIHZvaWQgcGx1Z2luX291dHB1dDo6Y29udmVydChGcm9tKiwgVG8mKTsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9zZXJ2aWNlLmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X3NlcnZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjIwNGNhCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9zZXJ2aWNlLmgKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRfU0VSVklDRV9ICisjZGVmaW5lIFRfU0VSVklDRV9ICisKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9mdW5jdGlvbi5oIgorI2luY2x1ZGUgPHZlY3Rvcj4KKworY2xhc3MgdF9wcm9ncmFtOworCisvKioKKyAqIEEgc2VydmljZSBjb25zaXN0cyBvZiBhIHNldCBvZiBmdW5jdGlvbnMuCisgKgorICovCitjbGFzcyB0X3NlcnZpY2UgOiBwdWJsaWMgdF90eXBlIHsKK3B1YmxpYzoKKyAgdF9zZXJ2aWNlKHRfcHJvZ3JhbSogcHJvZ3JhbSkgOiB0X3R5cGUocHJvZ3JhbSksIGV4dGVuZHNfKE5VTEwpIHt9CisKKyAgYm9vbCBpc19zZXJ2aWNlKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorCisgIHZvaWQgc2V0X2V4dGVuZHModF9zZXJ2aWNlKiBleHRlbmRzKSB7IGV4dGVuZHNfID0gZXh0ZW5kczsgfQorCisgIHZvaWQgYWRkX2Z1bmN0aW9uKHRfZnVuY3Rpb24qIGZ1bmMpIHsKKyAgICBzdGQ6OnZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7CisgICAgZm9yIChpdGVyID0gZnVuY3Rpb25zXy5iZWdpbigpOyBpdGVyICE9IGZ1bmN0aW9uc18uZW5kKCk7ICsraXRlcikgeworICAgICAgaWYgKGZ1bmMtPmdldF9uYW1lKCkgPT0gKCppdGVyKS0+Z2V0X25hbWUoKSkgeworICAgICAgICB0aHJvdyAiRnVuY3Rpb24gIiArIGZ1bmMtPmdldF9uYW1lKCkgKyAiIGlzIGFscmVhZHkgZGVmaW5lZCI7CisgICAgICB9CisgICAgfQorICAgIGZ1bmN0aW9uc18ucHVzaF9iYWNrKGZ1bmMpOworICB9CisKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9mdW5jdGlvbio+JiBnZXRfZnVuY3Rpb25zKCkgY29uc3QgeyByZXR1cm4gZnVuY3Rpb25zXzsgfQorCisgIHRfc2VydmljZSogZ2V0X2V4dGVuZHMoKSB7IHJldHVybiBleHRlbmRzXzsgfQorCisgIGNvbnN0IHRfc2VydmljZSogZ2V0X2V4dGVuZHMoKSBjb25zdCB7IHJldHVybiBleHRlbmRzXzsgfQorCitwcml2YXRlOgorICBzdGQ6OnZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zXzsKKyAgdF9zZXJ2aWNlKiBleHRlbmRzXzsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9zZXQuaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3Rfc2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkxM2JlNAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3Rfc2V0LmgKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRfU0VUX0gKKyNkZWZpbmUgVF9TRVRfSAorCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfY29udGFpbmVyLmgiCisKKy8qKgorICogQSBzZXQgaXMgYSBsaWdodHdlaWdodCBjb250YWluZXIgdHlwZSB0aGF0IGp1c3Qgd3JhcHMgYW5vdGhlciBkYXRhIHR5cGUuCisgKgorICovCitjbGFzcyB0X3NldCA6IHB1YmxpYyB0X2NvbnRhaW5lciB7CitwdWJsaWM6CisgIHRfc2V0KHRfdHlwZSogZWxlbV90eXBlKSA6IGVsZW1fdHlwZV8oZWxlbV90eXBlKSB7fQorCisgIHRfdHlwZSogZ2V0X2VsZW1fdHlwZSgpIGNvbnN0IHsgcmV0dXJuIGVsZW1fdHlwZV87IH0KKworICBib29sIGlzX3NldCgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKworcHJpdmF0ZToKKyAgdF90eXBlKiBlbGVtX3R5cGVfOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X3N0cnVjdC5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9zdHJ1Y3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTAyZGE3Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9zdHJ1Y3QuaApAQCAtMCwwICsxLDE3MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRfU1RSVUNUX0gKKyNkZWZpbmUgVF9TVFJVQ1RfSAorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3R5cGUuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9maWVsZC5oIgorCisvLyBGb3J3YXJkIGRlY2xhcmUgdGhhdCBwdXBweQorY2xhc3MgdF9wcm9ncmFtOworCisvKioKKyAqIEEgc3RydWN0IGlzIGEgY29udGFpbmVyIGZvciBhIHNldCBvZiBtZW1iZXIgZmllbGRzIHRoYXQgaGFzIGEgbmFtZS4gU3RydWN0cworICogYXJlIGFsc28gdXNlZCB0byBpbXBsZW1lbnQgZXhjZXB0aW9uIHR5cGVzLgorICoKKyAqLworY2xhc3MgdF9zdHJ1Y3QgOiBwdWJsaWMgdF90eXBlIHsKK3B1YmxpYzoKKyAgdHlwZWRlZiBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4gbWVtYmVyc190eXBlOworCisgIHRfc3RydWN0KHRfcHJvZ3JhbSogcHJvZ3JhbSkKKyAgICA6IHRfdHlwZShwcm9ncmFtKSwKKyAgICAgIGlzX3hjZXB0aW9uXyhmYWxzZSksCisgICAgICBpc191bmlvbl8oZmFsc2UpLAorICAgICAgbWVtYmVyc192YWxpZGF0ZWQoZmFsc2UpLAorICAgICAgbWVtYmVyc193aXRoX3ZhbHVlKDApLAorICAgICAgeHNkX2FsbF8oZmFsc2UpIHt9CisKKyAgdF9zdHJ1Y3QodF9wcm9ncmFtKiBwcm9ncmFtLCBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkKKyAgICA6IHRfdHlwZShwcm9ncmFtLCBuYW1lKSwKKyAgICAgIGlzX3hjZXB0aW9uXyhmYWxzZSksCisgICAgICBpc191bmlvbl8oZmFsc2UpLAorICAgICAgbWVtYmVyc192YWxpZGF0ZWQoZmFsc2UpLAorICAgICAgbWVtYmVyc193aXRoX3ZhbHVlKDApLAorICAgICAgeHNkX2FsbF8oZmFsc2UpIHt9CisKKyAgdm9pZCBzZXRfbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgeworICAgIG5hbWVfID0gbmFtZTsKKyAgICB2YWxpZGF0ZV91bmlvbl9tZW1iZXJzKCk7CisgIH0KKworICB2b2lkIHNldF94Y2VwdGlvbihib29sIGlzX3hjZXB0aW9uKSB7IGlzX3hjZXB0aW9uXyA9IGlzX3hjZXB0aW9uOyB9CisKKyAgdm9pZCB2YWxpZGF0ZV91bmlvbl9tZW1iZXIodF9maWVsZCogZmllbGQpIHsKKyAgICBpZiAoaXNfdW5pb25fICYmICghbmFtZV8uZW1wdHkoKSkpIHsKKworICAgICAgLy8gMSkgdW5pb25zIGNhbid0IGhhdmUgcmVxdWlyZWQgZmllbGRzCisgICAgICAvLyAyKSB1bmlvbiBtZW1iZXJzIGFyZSBpbXBsaWNpdGx5IG9wdGlvbmFsLCBvdGhlcndpc2UgYnVncyBsaWtlIFRIUklGVC0zNjUwIHdhaXQgdG8gaGFwcGVuCisgICAgICBpZiAoZmllbGQtPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX09QVElPTkFMKSB7CisgICAgICAgIC8vIG5vIHdhcm5pbmcgb24gZGVmYXVsdCByZXF1aXJlZG5lc3MsIGJ1dCBkbyB3YXJuIG9uIGFueXRoaW5nIGVsc2UgdGhhdCBpcyBleHBsaWNpdGx5IGFza2VkIGZvcgorICAgICAgICBpZihmaWVsZC0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfT1BUX0lOX1JFUV9PVVQpIHsKKyAgICAgICAgICBwd2FybmluZygxLAorICAgICAgICAgICAgICAgICAgICJVbmlvbiAlcyBmaWVsZCAlczogdW5pb24gbWVtYmVycyBtdXN0IGJlIG9wdGlvbmFsLCBpZ25vcmluZyBzcGVjaWZpZWQgcmVxdWlyZWRuZXNzLlxuIiwKKyAgICAgICAgICAgICAgICAgICBuYW1lXy5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgIGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCkpOworICAgICAgICB9CisgICAgICAgIGZpZWxkLT5zZXRfcmVxKHRfZmllbGQ6OlRfT1BUSU9OQUwpOworICAgICAgfQorCisgICAgICAvLyB1bmlvbnMgbWF5IGhhdmUgdXAgdG8gb25lIG1lbWJlciBkZWZhdWx0ZWQsIGJ1dCBub3QgbW9yZQorICAgICAgaWYgKGZpZWxkLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7CisgICAgICAgIGlmICgxIDwgKyttZW1iZXJzX3dpdGhfdmFsdWUpIHsKKyAgICAgICAgICB0aHJvdyAiRXJyb3I6IEZpZWxkICIgKyBmaWVsZC0+Z2V0X25hbWUoKSArICIgcHJvdmlkZXMgYW5vdGhlciBkZWZhdWx0IHZhbHVlIGZvciB1bmlvbiAiCisgICAgICAgICAgICAgICsgbmFtZV87CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICB2b2lkIHZhbGlkYXRlX3VuaW9uX21lbWJlcnMoKSB7CisgICAgaWYgKGlzX3VuaW9uXyAmJiAoIW5hbWVfLmVtcHR5KCkpICYmICghbWVtYmVyc192YWxpZGF0ZWQpKSB7CisgICAgICBtZW1iZXJzX3R5cGU6OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKyAgICAgIGZvciAobV9pdGVyID0gbWVtYmVyc19pbl9pZF9vcmRlcl8uYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnNfaW5faWRfb3JkZXJfLmVuZCgpOyArK21faXRlcikgeworICAgICAgICB2YWxpZGF0ZV91bmlvbl9tZW1iZXIoKm1faXRlcik7CisgICAgICB9CisgICAgICBtZW1iZXJzX3ZhbGlkYXRlZCA9IHRydWU7CisgICAgfQorICB9CisKKyAgdm9pZCBzZXRfdW5pb24oYm9vbCBpc191bmlvbikgeworICAgIGlzX3VuaW9uXyA9IGlzX3VuaW9uOworICAgIHZhbGlkYXRlX3VuaW9uX21lbWJlcnMoKTsKKyAgfQorCisgIHZvaWQgc2V0X3hzZF9hbGwoYm9vbCB4c2RfYWxsKSB7IHhzZF9hbGxfID0geHNkX2FsbDsgfQorCisgIGJvb2wgZ2V0X3hzZF9hbGwoKSBjb25zdCB7IHJldHVybiB4c2RfYWxsXzsgfQorCisgIGJvb2wgYXBwZW5kKHRfZmllbGQqIGVsZW0pIHsKKyAgICB0eXBlZGVmIG1lbWJlcnNfdHlwZTo6aXRlcmF0b3IgaXRlcl90eXBlOworICAgIHN0ZDo6cGFpcjxpdGVyX3R5cGUsIGl0ZXJfdHlwZT4gYm91bmRzID0gc3RkOjplcXVhbF9yYW5nZShtZW1iZXJzX2luX2lkX29yZGVyXy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXJzX2luX2lkX29yZGVyXy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZDo6a2V5X2NvbXBhcmUoKSk7CisgICAgaWYgKGJvdW5kcy5maXJzdCAhPSBib3VuZHMuc2Vjb25kKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIC8vIHJldHVybnMgZmFsc2Ugd2hlbiB0aGVyZSBpcyBhIGNvbmZsaWN0IG9mIGZpZWxkIG5hbWVzCisgICAgaWYgKGdldF9maWVsZF9ieV9uYW1lKGVsZW0tPmdldF9uYW1lKCkpICE9IE5VTEwpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgbWVtYmVyc18ucHVzaF9iYWNrKGVsZW0pOworICAgIG1lbWJlcnNfaW5faWRfb3JkZXJfLmluc2VydChib3VuZHMuc2Vjb25kLCBlbGVtKTsKKyAgICB2YWxpZGF0ZV91bmlvbl9tZW1iZXIoZWxlbSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBjb25zdCBtZW1iZXJzX3R5cGUmIGdldF9tZW1iZXJzKCkgY29uc3QgeyByZXR1cm4gbWVtYmVyc187IH0KKworICBjb25zdCBtZW1iZXJzX3R5cGUmIGdldF9zb3J0ZWRfbWVtYmVycygpIHsgcmV0dXJuIG1lbWJlcnNfaW5faWRfb3JkZXJfOyB9CisKKyAgYm9vbCBpc19zdHJ1Y3QoKSBjb25zdCB7IHJldHVybiAhaXNfeGNlcHRpb25fOyB9CisKKyAgYm9vbCBpc194Y2VwdGlvbigpIGNvbnN0IHsgcmV0dXJuIGlzX3hjZXB0aW9uXzsgfQorCisgIGJvb2wgaXNfdW5pb24oKSBjb25zdCB7IHJldHVybiBpc191bmlvbl87IH0KKworICB0X2ZpZWxkKiBnZXRfZmllbGRfYnlfbmFtZShzdGQ6OnN0cmluZyBmaWVsZF9uYW1lKSB7CisgICAgbWVtYmVyc190eXBlOjpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzX2luX2lkX29yZGVyXy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVyc19pbl9pZF9vcmRlcl8uZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfbmFtZSgpID09IGZpZWxkX25hbWUpIHsKKyAgICAgICAgcmV0dXJuICptX2l0ZXI7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBOVUxMOworICB9CisKKyAgY29uc3QgdF9maWVsZCogZ2V0X2ZpZWxkX2J5X25hbWUoc3RkOjpzdHJpbmcgZmllbGRfbmFtZSkgY29uc3QgeworICAgIG1lbWJlcnNfdHlwZTo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworICAgIGZvciAobV9pdGVyID0gbWVtYmVyc19pbl9pZF9vcmRlcl8uYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnNfaW5faWRfb3JkZXJfLmVuZCgpOyArK21faXRlcikgeworICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSA9PSBmaWVsZF9uYW1lKSB7CisgICAgICAgIHJldHVybiAqbV9pdGVyOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCitwcml2YXRlOgorICBtZW1iZXJzX3R5cGUgbWVtYmVyc187CisgIG1lbWJlcnNfdHlwZSBtZW1iZXJzX2luX2lkX29yZGVyXzsKKyAgYm9vbCBpc194Y2VwdGlvbl87CisgIGJvb2wgaXNfdW5pb25fOworICBib29sIG1lbWJlcnNfdmFsaWRhdGVkOworICBpbnQgbWVtYmVyc193aXRoX3ZhbHVlOworCisgIGJvb2wgeHNkX2FsbF87Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfdHlwZS5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF90eXBlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E2ZDFlMAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfdHlwZS5oCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVF9UWVBFX0gKKyNkZWZpbmUgVF9UWVBFX0gKKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9kb2MuaCIKKworY2xhc3MgdF9wcm9ncmFtOworCisvKioKKyAqIEdlbmVyaWMgcmVwcmVzZW50YXRpb24gb2YgYSB0aHJpZnQgdHlwZS4gVGhlc2Ugb2JqZWN0cyBhcmUgdXNlZCBieSB0aGUKKyAqIHBhcnNlciBtb2R1bGUgdG8gYnVpbGQgdXAgYSB0cmVlIG9mIG9iamVjdCB0aGF0IGFyZSBhbGwgZXhwbGljaXRseSB0eXBlZC4KKyAqIFRoZSBnZW5lcmljIHRfdHlwZSBjbGFzcyBleHBvcnRzIGEgdmFyaWV0eSBvZiB1c2VmdWwgbWV0aG9kcyB0aGF0IGFyZQorICogdXNlZCBieSB0aGUgY29kZSBnZW5lcmF0b3IgdG8gYnJhbmNoIGJhc2VkIHVwb24gZGlmZmVyZW50IGhhbmRsaW5nIGZvciB0aGUKKyAqIHZhcmlvdXMgdHlwZXMuCisgKgorICovCitjbGFzcyB0X3R5cGUgOiBwdWJsaWMgdF9kb2MgeworcHVibGljOgorICB2aXJ0dWFsIH50X3R5cGUoKSB7fQorCisgIHZpcnR1YWwgdm9pZCBzZXRfbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgeyBuYW1lXyA9IG5hbWU7IH0KKworICB2aXJ0dWFsIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIG5hbWVfOyB9CisKKyAgdmlydHVhbCBib29sIGlzX3ZvaWQoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICB2aXJ0dWFsIGJvb2wgaXNfYmFzZV90eXBlKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgdmlydHVhbCBib29sIGlzX3N0cmluZygpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgIHZpcnR1YWwgYm9vbCBpc19iaW5hcnkoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICB2aXJ0dWFsIGJvb2wgaXNfYm9vbCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgIHZpcnR1YWwgYm9vbCBpc190eXBlZGVmKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgdmlydHVhbCBib29sIGlzX2VudW0oKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICB2aXJ0dWFsIGJvb2wgaXNfc3RydWN0KCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgdmlydHVhbCBib29sIGlzX3hjZXB0aW9uKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgdmlydHVhbCBib29sIGlzX2NvbnRhaW5lcigpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgIHZpcnR1YWwgYm9vbCBpc19saXN0KCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgdmlydHVhbCBib29sIGlzX3NldCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgIHZpcnR1YWwgYm9vbCBpc19tYXAoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICB2aXJ0dWFsIGJvb2wgaXNfc2VydmljZSgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgdF9wcm9ncmFtKiBnZXRfcHJvZ3JhbSgpIHsgcmV0dXJuIHByb2dyYW1fOyB9CisKKyAgY29uc3QgdF9wcm9ncmFtKiBnZXRfcHJvZ3JhbSgpIGNvbnN0IHsgcmV0dXJuIHByb2dyYW1fOyB9CisKKyAgdF90eXBlKiBnZXRfdHJ1ZV90eXBlKCk7CisgIGNvbnN0IHRfdHlwZSogZ2V0X3RydWVfdHlwZSgpIGNvbnN0OworCisgIC8vIFRoaXMgZnVuY3Rpb24gd2lsbCBicmVhayAobWF5YmUgYmFkbHkpIHVubGVzcyAwIDw9IG51bSA8PSAxNi4KKyAgc3RhdGljIGNoYXIgbnliYmxlX3RvX3hkaWdpdChpbnQgbnVtKSB7CisgICAgaWYgKG51bSA8IDEwKSB7CisgICAgICByZXR1cm4gJzAnICsgbnVtOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gJ0EnICsgbnVtIC0gMTA7CisgICAgfQorICB9CisKKyAgc3RhdGljIHN0ZDo6c3RyaW5nIGJ5dGVfdG9faGV4KHVpbnQ4X3QgYnl0ZSkgeworICAgIHN0ZDo6c3RyaW5nIHJ2OworICAgIHJ2ICs9IG55YmJsZV90b194ZGlnaXQoYnl0ZSA+PiA0KTsKKyAgICBydiArPSBueWJibGVfdG9feGRpZ2l0KGJ5dGUgJiAweDBmKTsKKyAgICByZXR1cm4gcnY7CisgIH0KKworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IGFubm90YXRpb25zXzsKKworcHJvdGVjdGVkOgorICB0X3R5cGUoKSA6IHByb2dyYW1fKE5VTEwpIHsgOyB9CisKKyAgdF90eXBlKHRfcHJvZ3JhbSogcHJvZ3JhbSkgOiBwcm9ncmFtXyhwcm9ncmFtKSB7IDsgfQorCisgIHRfdHlwZSh0X3Byb2dyYW0qIHByb2dyYW0sIHN0ZDo6c3RyaW5nIG5hbWUpIDogcHJvZ3JhbV8ocHJvZ3JhbSksIG5hbWVfKG5hbWUpIHsgOyB9CisKKyAgdF90eXBlKHN0ZDo6c3RyaW5nIG5hbWUpIDogcHJvZ3JhbV8oTlVMTCksIG5hbWVfKG5hbWUpIHsgOyB9CisKKyAgdF9wcm9ncmFtKiBwcm9ncmFtXzsKKyAgc3RkOjpzdHJpbmcgbmFtZV87Cit9OworCisvKioKKyAqIFBsYWNlaG9sZGVyIHN0cnVjdCBmb3IgcmV0dXJuaW5nIHRoZSBrZXkgYW5kIHZhbHVlIG9mIGFuIGFubm90YXRpb24KKyAqIGR1cmluZyBwYXJzaW5nLgorICovCitzdHJ1Y3QgdF9hbm5vdGF0aW9uIHsKKyAgc3RkOjpzdHJpbmcga2V5OworICBzdGQ6OnN0cmluZyB2YWw7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfdHlwZWRlZi5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfdHlwZWRlZi5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWZmZGI4Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF90eXBlZGVmLmNjCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpbmNsdWRlIDxjc3RkaW8+CisKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF90eXBlZGVmLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfcHJvZ3JhbS5oIgorCit0X3R5cGUqIHRfdHlwZWRlZjo6Z2V0X3R5cGUoKSBjb25zdCB7CisgIGlmICh0eXBlXyA9PSBOVUxMKSB7CisgICAgdF90eXBlKiB0eXBlID0gZ2V0X3Byb2dyYW0oKS0+c2NvcGUoKS0+Z2V0X3R5cGUoc3ltYm9saWNfKTsKKyAgICBpZiAodHlwZSA9PSBOVUxMKSB7CisgICAgICBwcmludGYoIlR5cGUgXCIlc1wiIG5vdCBkZWZpbmVkXG4iLCBzeW1ib2xpY18uY19zdHIoKSk7CisgICAgICBleGl0KDEpOworICAgIH0KKyAgICByZXR1cm4gdHlwZTsKKyAgfQorICByZXR1cm4gdHlwZV87Cit9CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X3R5cGVkZWYuaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfdHlwZWRlZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhZDNhNTAKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X3R5cGVkZWYuaApAQCAtMCwwICsxLDY2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVF9UWVBFREVGX0gKKyNkZWZpbmUgVF9UWVBFREVGX0gKKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF90eXBlLmgiCisKKy8qKgorICogQSB0eXBlZGVmIGlzIGEgbWFwcGluZyBmcm9tIGEgc3ltYm9saWMgbmFtZSB0byBhbm90aGVyIHR5cGUuIEluIGR5bWFuaWNhbGx5CisgKiB0eXBlZCBsYW5ndWFnZXMgKGkuZS4gcGhwL3B5dGhvbikgdGhlIGNvZGUgZ2VuZXJhdG9yIGNhbiBhY3R1YWxseSB1c3VhbGx5CisgKiBpZ25vcmUgdHlwZWRlZnMgYW5kIGp1c3QgdXNlIHRoZSB1bmRlcmx5aW5nIHR5cGUgZGlyZWN0bHksIHRob3VnaCBpbiBDKysKKyAqIHRoZSBzeW1ib2xpYyBuYW1pbmcgY2FuIGJlIHF1aXRlIHVzZWZ1bCBmb3IgY29kZSBjbGFyaXR5LgorICoKKyAqLworY2xhc3MgdF90eXBlZGVmIDogcHVibGljIHRfdHlwZSB7CitwdWJsaWM6CisgIHRfdHlwZWRlZih0X3Byb2dyYW0qIHByb2dyYW0sIHRfdHlwZSogdHlwZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHN5bWJvbGljKQorICAgIDogdF90eXBlKHByb2dyYW0sIHN5bWJvbGljKSwgdHlwZV8odHlwZSksIHN5bWJvbGljXyhzeW1ib2xpYyksIGZvcndhcmRfKGZhbHNlKSB7fQorCisgIC8qKgorICAgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWQgdG8gcmVmZXIgdG8gYSB0eXBlIHRoYXQgaXMgbGF6aWx5CisgICAqIHJlc29sdmVkIGF0IGEgbGF0ZXIgdGltZSwgbGlrZSBmb3IgZm9yd2FyZCBkZWNsYXJhdGlvbnMgb3IKKyAgICogcmVjdXJzaXZlIHR5cGVzLgorICAgKi8KKyAgdF90eXBlZGVmKHRfcHJvZ3JhbSogcHJvZ3JhbSwgY29uc3Qgc3RkOjpzdHJpbmcmIHN5bWJvbGljLCBib29sIGZvcndhcmQpCisgICAgOiB0X3R5cGUocHJvZ3JhbSwgc3ltYm9saWMpLAorICAgICAgdHlwZV8oTlVMTCksCisgICAgICBzeW1ib2xpY18oc3ltYm9saWMpLAorICAgICAgZm9yd2FyZF8oZm9yd2FyZCkKKyAge30KKworICB+dF90eXBlZGVmKCkge30KKworICB0X3R5cGUqIGdldF90eXBlKCkgY29uc3Q7CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldF9zeW1ib2xpYygpIGNvbnN0IHsgcmV0dXJuIHN5bWJvbGljXzsgfQorCisgIGJvb2wgaXNfZm9yd2FyZF90eXBlZGVmKCkgY29uc3QgeyByZXR1cm4gZm9yd2FyZF87IH0KKworICBib29sIGlzX3R5cGVkZWYoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisKK3ByaXZhdGU6CisgIHRfdHlwZSogdHlwZV87CisgIHN0ZDo6c3RyaW5nIHN5bWJvbGljXzsKKyAgYm9vbCBmb3J3YXJkXzsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGxhdGZvcm0uaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BsYXRmb3JtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ5YWRiOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BsYXRmb3JtLmgKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyAqIGRlZmluZSBmb3IgbWtkaXIsc2luY2UgdGhlIG1ldGhvZCBzaWduYXR1cmUKKyAqIGlzIGRpZmZlcmVudCBmb3IgdGhlIG5vbi1QT1NJWCBNaW5HVworICovCisKKyNpZmRlZiBfTVNDX1ZFUgorI2luY2x1ZGUgInRocmlmdC93aW5kb3dzL2NvbmZpZy5oIgorI2VuZGlmCisKKyNpZmRlZiBfV0lOMzIKKyNpbmNsdWRlIDxkaXJlY3QuaD4KKyNpbmNsdWRlIDxpby5oPgorI2Vsc2UKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxjZXJybm8+CisKKy8vIGlnbm9yZSBFRVhJU1QsIHRocm93IG9uIGFueSBvdGhlciBlcnJvcgorI2lmZGVmIF9XSU4zMgorI2RlZmluZSBNS0RJUih4KSB7IGludCByID0gX21rZGlyKHgpOyBpZiAociA9PSAtMSAmJiBlcnJubyAhPSBFRVhJU1QpIHsgdGhyb3cgKHN0ZDo6c3RyaW5nKHgpICsgIjogIikgKyBzdHJlcnJvcihlcnJubyk7IH0gfQorI2Vsc2UKKyNkZWZpbmUgTUtESVIoeCkgeyBpbnQgciA9IG1rZGlyKHgsIFNfSVJXWFUgfCBTX0lSV1hHIHwgU19JUldYTyk7IGlmIChyID09IC0xICYmIGVycm5vICE9IEVFWElTVCkgeyB0aHJvdyAoc3RkOjpzdHJpbmcoeCkgKyAiOiAiKSArIHN0cmVycm9yKGVycm5vKTsgfSB9CisjZW5kaWYKKworI2lmZGVmIFBBVEhfTUFYCisjZGVmaW5lIFRIUklGVF9QQVRIX01BWCBQQVRIX01BWAorI2Vsc2UKKyNkZWZpbmUgVEhSSUZUX1BBVEhfTUFYIE1BWF9QQVRICisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BsdWdpbi9NYWtlZmlsZS5hbSBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BsdWdpbi9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODRjZGJkCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGx1Z2luL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNDcgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIworIyBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgorIyBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgorIyBkZXRhaWxzLgorCitBVVRPTUFLRV9PUFRJT05TID0gc3ViZGlyLW9iamVjdHMKKworaWYgV0lUSF9QTFVHSU4KK3BsdWdpbl9nZW4gPSBwbHVnaW5fdHlwZXMuaCBcCisgICAgICAgICAgICAgcGx1Z2luX3R5cGVzLmNwcCBcCisgICAgICAgICAgICAgcGx1Z2luX2NvbnN0YW50cy5oIFwKKyAgICAgICAgICAgICBwbHVnaW5fY29uc3RhbnRzLmNwcAorCitCVUlMVF9TT1VSQ0VTID0gJChwbHVnaW5fZ2VuKQorZ2VuLnN0YW1wOiBwbHVnaW4udGhyaWZ0ICQodG9wX2J1aWxkZGlyKS9jb21waWxlci9jcHAvc3JjL3RocmlmdC90aHJpZnQtYm9vdHN0cmFwCisJQCQoUk0pIC1mIGdlbi50bXAKKwlAdG91Y2ggZ2VuLnRtcAorCSQodG9wX2J1aWxkZGlyKS9jb21waWxlci9jcHAvc3JjL3RocmlmdC90aHJpZnQtYm9vdHN0cmFwIC1nZW4gY3BwIC1vdXQgLiAkPAorCUBtdiAtZiBnZW4udG1wICRACisKKyQocGx1Z2luX2dlbik6IGdlbi5zdGFtcAorCUBpZiB0ZXN0IC1mICRAOyB0aGVuIDo7IGVsc2UgXAorCSQoUk0pIC1mIGdlbi5zdGFtcDsgXAorCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGdlbi5zdGFtcDsgXAorCWZpCisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIHZlcnNpb24uaCB3aW5kb3dzL3ZlcnNpb24uaCAkKHBsdWdpbl9nZW4pCitlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGx1Z2luL3BsdWdpbi5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW4uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M0YzQzMgotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW4uY2MKQEAgLTAsMCArMSw1MTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgInRocmlmdC9wbHVnaW4vcGx1Z2luLmgiCisKKyNpZmRlZiBfV0lOMzIKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGlvLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpbmNsdWRlIDxib29zdC9yYW5nZS9hZGFwdG9yL21hcC5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvcmFuZ2UvYWxnb3JpdGhtL2Zvcl9lYWNoLmhwcD4KKworI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvci5oIgorI2luY2x1ZGUgInRocmlmdC9wbHVnaW4vdHlwZV91dGlsLmgiCisjaW5jbHVkZSAidGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oIgorI2luY2x1ZGUgInRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaCIKKyNpbmNsdWRlICJ0aHJpZnQvdHJhbnNwb3J0L1RGRFRyYW5zcG9ydC5oIgorI2luY2x1ZGUgInRocmlmdC9wbHVnaW4vcGx1Z2luX3R5cGVzLmgiCisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgcGx1Z2luIHsKKwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUQmluYXJ5UHJvdG9jb2w7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpURkRUcmFuc3BvcnQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpURnJhbWVkVHJhbnNwb3J0OworCisjZGVmaW5lIFRIUklGVF9DT05WRVJUX0ZPUldBUkQoZnJvbV90eXBlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlIDw+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHR5cGVuYW1lIFRvVHlwZTxmcm9tX3R5cGU+Ojp0eXBlKiBjb252ZXJ0X2ZvcndhcmQ8ZnJvbV90eXBlPihjb25zdCBmcm9tX3R5cGUmIGZyb20pCisKKyNkZWZpbmUgVEhSSUZUX0NPTlZFUlRfQ09NUExFVEVfREVDTChmcm9tX3R5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGUgPD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdm9pZCBjb252ZXJ0KGNvbnN0IGZyb21fdHlwZSYgZnJvbSwgVG9UeXBlPGZyb21fdHlwZT46OnR5cGUqIHRvKQorCisjZGVmaW5lIFRIUklGVF9DT05WRVJUX1VOQVJZX0RFQ0woZnJvbV90eXBlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlIDw+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHR5cGVuYW1lIFRvVHlwZTxmcm9tX3R5cGU+Ojp0eXBlKiBjb252ZXJ0PGZyb21fdHlwZT4oY29uc3QgZnJvbV90eXBlJiBmcm9tKQorCisjZGVmaW5lIFRIUklGVF9DT05WRVJTSU9OX0RFQ0woZnJvbV90eXBlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFRIUklGVF9DT05WRVJUX0ZPUldBUkQoZnJvbV90eXBlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFRIUklGVF9DT05WRVJUX0NPTVBMRVRFX0RFQ0woZnJvbV90eXBlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFRIUklGVF9DT05WRVJUX1VOQVJZX0RFQ0woZnJvbV90eXBlKQorCisjZGVmaW5lIFRIUklGVF9DT05WRVJUX0NPTVBMRVRFKGZyb21fdHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFRIUklGVF9DT05WRVJTSU9OX0RFQ0woZnJvbV90eXBlKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVG9UeXBlPGZyb21fdHlwZT46OnR5cGUqIHRvID0gY29udmVydF9mb3J3YXJkKGZyb20pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29udmVydChmcm9tLCB0byk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIHRvOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFRIUklGVF9DT05WRVJUX0NPTVBMRVRFX0RFQ0woZnJvbV90eXBlKQorCisjZGVmaW5lIFRIUklGVF9DT05WRVJTSU9OKGZyb21fdHlwZSwgLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFRIUklGVF9DT05WRVJUX0ZPUldBUkQoZnJvbV90eXBlKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKHZvaWQpZnJvbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIG5ldyBUb1R5cGU8ZnJvbV90eXBlPjo6dHlwZShfX1ZBX0FSR1NfXyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFRIUklGVF9DT05WRVJUX0NPTVBMRVRFKGZyb21fdHlwZSkKKworI2RlZmluZSBUSFJJRlRfQVNTSUdOX0RPQygpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChmcm9tLl9faXNzZXQuZG9jKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdG8tPnNldF9kb2MoZnJvbS5kb2MpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIFRIUklGVF9BU1NJR05fQU5OT1RBVElPTlMoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFRIUklGVF9BU1NJR05fRE9DKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGZyb20uX19pc3NldC5hbm5vdGF0aW9ucykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB0by0+YW5ub3RhdGlvbnNfID0gZnJvbS5hbm5vdGF0aW9uczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgVEhSSUZUX0FTU0lHTl9NRVRBREFUQSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0by0+c2V0X25hbWUoZnJvbS5tZXRhZGF0YS5uYW1lKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoZnJvbS5tZXRhZGF0YS5fX2lzc2V0LmRvYykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHRvLT5zZXRfZG9jKGZyb20ubWV0YWRhdGEuZG9jKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoZnJvbS5tZXRhZGF0YS5fX2lzc2V0LmFubm90YXRpb25zKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHRvLT5hbm5vdGF0aW9uc18gPSBmcm9tLm1ldGFkYXRhLmFubm90YXRpb25zOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworOjp0X3Byb2dyYW0qIGdfcHJvZ3JhbSA9IDA7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBDLCB0eXBlbmFtZSBTPgorc3RydWN0IFR5cGVDYWNoZSB7CisgIEMqIG9wZXJhdG9yW10oY29uc3QgaW50NjRfdCYgaykgeworICAgIHR5cGVuYW1lIHN0ZDo6bWFwPGludDY0X3QsIEMqPjo6aXRlcmF0b3IgaXQgPSBjYWNoZS5maW5kKGspOworICAgIGlmIChpdCAhPSBjYWNoZS5lbmQoKSkgeworICAgICAgcmV0dXJuIGl0LT5zZWNvbmQ7CisgICAgfSBlbHNlIHsKKyAgICAgIHR5cGVuYW1lIHN0ZDo6bWFwPGludDY0X3QsIFM+Ojpjb25zdF9pdGVyYXRvciBjaXQgPSBzb3VyY2UtPmZpbmQoayk7CisgICAgICBpZiAoY2l0ID09IHNvdXJjZS0+ZW5kKCkpIHsKKyAgICAgICAgdGhyb3cgVGhyaWZ0UGx1Z2luRXJyb3IoIlR5cGUgbm90IGZvdW5kIik7CisgICAgICB9CisgICAgICByZXR1cm4gKGNhY2hlKVtrXSA9IGNvbnZlcnRfZm9yd2FyZChjaXQtPnNlY29uZCk7CisgICAgfQorICB9CisKKyAgdm9pZCBjb21waWxlQWxsKCkgeworICAgIGJvb3N0Ojpmb3JfZWFjaCgqc291cmNlIHwgYm9vc3Q6OmFkYXB0b3JzOjptYXBfa2V5cywKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpiaW5kKCZUeXBlQ2FjaGU6OmNvbXBpbGUsIHRoaXMsIHN0ZDo6cGxhY2Vob2xkZXJzOjpfMSkpOworICB9CisKKyAgc3RkOjptYXA8aW50NjRfdCwgUz4gY29uc3QqIHNvdXJjZTsKKworICB2b2lkIGNsZWFyKCkgeworICAgIHNvdXJjZSA9IG51bGxwdHIgOworICAgIGNhY2hlLmNsZWFyKCkgOworICB9CisKK3Byb3RlY3RlZDoKKyAgc3RkOjptYXA8aW50NjRfdCwgQyo+IGNhY2hlOworCitwcml2YXRlOgorICB2b2lkIGNvbXBpbGUoY29uc3QgaW50NjRfdCYgaykgeworICAgIHR5cGVuYW1lIHN0ZDo6bWFwPGludDY0X3QsIFM+Ojpjb25zdF9pdGVyYXRvciBjaXQgPSBzb3VyY2UtPmZpbmQoayk7CisgICAgaWYgKGNpdCA9PSBzb3VyY2UtPmVuZCgpKSB7CisgICAgICB0aHJvdyBUaHJpZnRQbHVnaW5FcnJvcigiVHlwZSBub3QgZm91bmQgIik7CisgICAgfQorICAgIGNvbnZlcnQoY2l0LT5zZWNvbmQsICgqdGhpcylba10pOworICB9Cit9Oworc3RkOjptYXA8aW50NjRfdCwgOjp0X3Byb2dyYW0qPiBnX3Byb2dyYW1fY2FjaGU7CitUeXBlQ2FjaGU8IDo6dF90eXBlLCB0X3R5cGU+IGdfdHlwZV9jYWNoZTsKK1R5cGVDYWNoZTwgOjp0X2NvbnN0LCB0X2NvbnN0PiBnX2NvbnN0X2NhY2hlOworVHlwZUNhY2hlPCA6OnRfc2VydmljZSwgdF9zZXJ2aWNlPiBnX3NlcnZpY2VfY2FjaGU7CisKK3ZvaWQgY2xlYXJfZ2xvYmFsX2NhY2hlKCkgeworICBnX3R5cGVfY2FjaGUuY2xlYXIoKTsKKyAgZ19jb25zdF9jYWNoZS5jbGVhcigpOworICBnX3NlcnZpY2VfY2FjaGUuY2xlYXIoKTsKK30KKwordm9pZCBzZXRfZ2xvYmFsX2NhY2hlKGNvbnN0IFR5cGVSZWdpc3RyeSYgZnJvbSkgeworICBnX3R5cGVfY2FjaGUuc291cmNlID0gJmZyb20udHlwZXM7CisgIGdfY29uc3RfY2FjaGUuc291cmNlID0gJmZyb20uY29uc3RhbnRzOworICBnX3NlcnZpY2VfY2FjaGUuc291cmNlID0gJmZyb20uc2VydmljZXM7CisKKyAgZ190eXBlX2NhY2hlLmNvbXBpbGVBbGwoKTsKKyAgZ19jb25zdF9jYWNoZS5jb21waWxlQWxsKCk7CisgIGdfc2VydmljZV9jYWNoZS5jb21waWxlQWxsKCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorVCogcmVzb2x2ZV90eXBlKGludDY0X3QgbmFtZSkgeworICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxUKj4oZ190eXBlX2NhY2hlW25hbWVdKTsKK30KKworOjp0X2NvbnN0KiByZXNvbHZlX2NvbnN0KGludDY0X3QgbmFtZSkgeworICByZXR1cm4gZ19jb25zdF9jYWNoZVtuYW1lXTsKK30KKworOjp0X3NlcnZpY2UqIHJlc29sdmVfc2VydmljZShpbnQ2NF90IG5hbWUpIHsKKyAgcmV0dXJuIGdfc2VydmljZV9jYWNoZVtuYW1lXTsKK30KKworVEhSSUZUX0NPTlZFUlRfRk9SV0FSRCh0X2Jhc2VfdHlwZSkgeworI2RlZmluZSBUX0JBU0VUWVBFX0NBU0UodHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjYXNlIHRfYmFzZTo6VFlQRV8jI3R5cGU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHQgPSA6OnRfYmFzZV90eXBlOjpUWVBFXyMjdHlwZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGJyZWFrCisKKyAgOjp0X2Jhc2VfdHlwZTo6dF9iYXNlIHQgPSA6OnRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ7CisgIGJvb2wgaXNfYmluYXJ5ID0gZmFsc2U7CisgIHN3aXRjaCAoZnJvbS52YWx1ZSkgeworICAgIFRfQkFTRVRZUEVfQ0FTRShWT0lEKTsKKyAgICBUX0JBU0VUWVBFX0NBU0UoU1RSSU5HKTsKKyAgICBUX0JBU0VUWVBFX0NBU0UoQk9PTCk7CisgICAgVF9CQVNFVFlQRV9DQVNFKEk4KTsKKyAgICBUX0JBU0VUWVBFX0NBU0UoSTE2KTsKKyAgICBUX0JBU0VUWVBFX0NBU0UoSTMyKTsKKyAgICBUX0JBU0VUWVBFX0NBU0UoSTY0KTsKKyAgICBUX0JBU0VUWVBFX0NBU0UoRE9VQkxFKTsKKyAgY2FzZSB0X2Jhc2U6OlRZUEVfQklOQVJZOgorICAgIHQgPSA6OnRfYmFzZV90eXBlOjpUWVBFX1NUUklORzsKKyAgICBpc19iaW5hcnkgPSB0cnVlOworICAgIGJyZWFrOworICB9CisgIDo6dF9iYXNlX3R5cGUqIHRvID0gbmV3IDo6dF9iYXNlX3R5cGUoZnJvbS5tZXRhZGF0YS5uYW1lLCB0KTsKKyAgdG8tPnNldF9iaW5hcnkoaXNfYmluYXJ5KTsKKyAgcmV0dXJuIHRvOworI3VuZGVmIFRfQkFTRVRZUEVfQ0FTRQorfQorVEhSSUZUX0NPTlZFUlRfQ09NUExFVEUodF9iYXNlX3R5cGUpIHsKKyAgVEhSSUZUX0FTU0lHTl9NRVRBREFUQSgpOworfQorCitUSFJJRlRfQ09OVkVSVF9GT1JXQVJEKHRfdHlwZWRlZikgeworICA6OnRfdHlwZWRlZiogdG87CisgIGlmIChmcm9tLmZvcndhcmQpIHsKKyAgICB0byA9IG5ldyA6OnRfdHlwZWRlZihnX3Byb2dyYW1fY2FjaGVbZnJvbS5tZXRhZGF0YS5wcm9ncmFtX2lkXSwgZnJvbS5zeW1ib2xpYywgdHJ1ZSk7CisgIH0gZWxzZSB7CisgICAgdG8gPSBuZXcgOjp0X3R5cGVkZWYoZ19wcm9ncmFtX2NhY2hlW2Zyb20ubWV0YWRhdGEucHJvZ3JhbV9pZF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZV90eXBlPCA6OnRfdHlwZT4oZnJvbS50eXBlKSwgZnJvbS5zeW1ib2xpYyk7CisgIH0KKyAgcmV0dXJuIHRvOworfQorVEhSSUZUX0NPTlZFUlRfQ09NUExFVEUodF90eXBlZGVmKSB7CisgIFRIUklGVF9BU1NJR05fTUVUQURBVEEoKTsKK30KK1RIUklGVF9DT05WRVJTSU9OKHRfZW51bV92YWx1ZSwgZnJvbS5uYW1lLCBmcm9tLnZhbHVlKSB7CisgIGFzc2VydCh0byk7CisgIFRIUklGVF9BU1NJR05fQU5OT1RBVElPTlMoKTsKK30KK1RIUklGVF9DT05WRVJTSU9OKHRfZW51bSwgZ19wcm9ncmFtX2NhY2hlW2Zyb20ubWV0YWRhdGEucHJvZ3JhbV9pZF0pIHsKKyAgYXNzZXJ0KHRvKTsKKyAgVEhSSUZUX0FTU0lHTl9NRVRBREFUQSgpOworICBib29zdDo6Zm9yX2VhY2goZnJvbS5jb25zdGFudHMgfCBib29zdDo6YWRhcHRvcnM6OnRyYW5zZm9ybWVkKGNvbnZlcnQ8dF9lbnVtX3ZhbHVlPiksCisgICAgICAgICAgICAgICAgICBzdGQ6OmJpbmQoJjo6dF9lbnVtOjphcHBlbmQsIHRvLCBzdGQ6OnBsYWNlaG9sZGVyczo6XzEpKTsKK30KK1RIUklGVF9DT05WRVJTSU9OKHRfbGlzdCwgcmVzb2x2ZV90eXBlPCA6OnRfdHlwZT4oZnJvbS5lbGVtX3R5cGUpKSB7CisgIGFzc2VydCh0byk7CisgIFRIUklGVF9BU1NJR05fTUVUQURBVEEoKTsKKyAgaWYgKGZyb20uX19pc3NldC5jcHBfbmFtZSkKKyAgICB0by0+c2V0X2NwcF9uYW1lKGZyb20uY3BwX25hbWUpOworfQorVEhSSUZUX0NPTlZFUlNJT04odF9zZXQsIHJlc29sdmVfdHlwZTwgOjp0X3R5cGU+KGZyb20uZWxlbV90eXBlKSkgeworICBhc3NlcnQodG8pOworICBUSFJJRlRfQVNTSUdOX01FVEFEQVRBKCk7CisgIGlmIChmcm9tLl9faXNzZXQuY3BwX25hbWUpCisgICAgdG8tPnNldF9jcHBfbmFtZShmcm9tLmNwcF9uYW1lKTsKK30KK1RIUklGVF9DT05WRVJTSU9OKHRfbWFwLAorICAgICAgICAgICAgICAgICAgcmVzb2x2ZV90eXBlPCA6OnRfdHlwZT4oZnJvbS5rZXlfdHlwZSksCisgICAgICAgICAgICAgICAgICByZXNvbHZlX3R5cGU8IDo6dF90eXBlPihmcm9tLnZhbF90eXBlKSkgeworICBhc3NlcnQodG8pOworICBUSFJJRlRfQVNTSUdOX01FVEFEQVRBKCk7CisgIGlmIChmcm9tLl9faXNzZXQuY3BwX25hbWUpCisgICAgdG8tPnNldF9jcHBfbmFtZShmcm9tLmNwcF9uYW1lKTsKK30KK1RIUklGVF9DT05WRVJTSU9OKHRfY29uc3RfdmFsdWUsICkgeworI2RlZmluZSBUX0NPTlNUX1ZBTFVFX0NBU0UodHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoZnJvbS5fX2lzc2V0LnR5cGUjI192YWwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0by0+c2V0XyMjdHlwZShmcm9tLnR5cGUjI192YWwpCisKKyAgYXNzZXJ0KHRvKTsKKyAgaWYgKGZyb20uX19pc3NldC5tYXBfdmFsKSB7CisgICAgdG8tPnNldF9tYXAoKTsKKyAgICBmb3IgKHN0ZDo6bWFwPHRfY29uc3RfdmFsdWUsIHRfY29uc3RfdmFsdWU+Ojpjb25zdF9pdGVyYXRvciBpdCA9IGZyb20ubWFwX3ZhbC5iZWdpbigpOworICAgICAgICAgaXQgIT0gZnJvbS5tYXBfdmFsLmVuZCgpOyBpdCsrKSB7CisgICAgICB0by0+YWRkX21hcChjb252ZXJ0KGl0LT5maXJzdCksIGNvbnZlcnQoaXQtPnNlY29uZCkpOworICAgIH0KKyAgfSBlbHNlIGlmIChmcm9tLl9faXNzZXQubGlzdF92YWwpIHsKKyAgICB0by0+c2V0X2xpc3QoKTsKKyAgICBib29zdDo6Zm9yX2VhY2goZnJvbS5saXN0X3ZhbCB8IGJvb3N0OjphZGFwdG9yczo6dHJhbnNmb3JtZWQoJmNvbnZlcnQ8dF9jb25zdF92YWx1ZT4pLAorICAgICAgICAgICAgICAgICAgICBzdGQ6OmJpbmQoJjo6dF9jb25zdF92YWx1ZTo6YWRkX2xpc3QsIHRvLCBzdGQ6OnBsYWNlaG9sZGVyczo6XzEpKTsKKyAgfSBlbHNlCisgICAgVF9DT05TVF9WQUxVRV9DQVNFKHN0cmluZyk7CisgIGVsc2UgVF9DT05TVF9WQUxVRV9DQVNFKGludGVnZXIpOworICBlbHNlIFRfQ09OU1RfVkFMVUVfQ0FTRShkb3VibGUpOworICBlbHNlIGlmIChmcm9tLl9faXNzZXQuY29uc3RfaWRlbnRpZmllcl92YWwpIHsKKyAgICB0by0+c2V0X2lkZW50aWZpZXIoZnJvbS5jb25zdF9pZGVudGlmaWVyX3ZhbC5pZGVudGlmaWVyX3ZhbCkgOworICAgIHRvLT5zZXRfZW51bShyZXNvbHZlX3R5cGU8IDo6dF9lbnVtPihmcm9tLmNvbnN0X2lkZW50aWZpZXJfdmFsLmVudW1fdmFsKSkgOworICB9CisKKyN1bmRlZiBUX0NPTlNUX1ZBTFVFX0NBU0UKK30KK1RIUklGVF9DT05WRVJTSU9OKHRfZmllbGQsIHJlc29sdmVfdHlwZTwgOjp0X3R5cGU+KGZyb20udHlwZSksIGZyb20ubmFtZSwgZnJvbS5rZXkpIHsKKyAgYXNzZXJ0KHRvKTsKKyAgVEhSSUZUX0FTU0lHTl9BTk5PVEFUSU9OUygpOworICB0by0+c2V0X3JlZmVyZW5jZShmcm9tLnJlZmVyZW5jZSk7CisgIHRvLT5zZXRfcmVxKHN0YXRpY19jYXN0PCA6OnRfZmllbGQ6OmVfcmVxPihmcm9tLnJlcSkpOworICBpZiAoZnJvbS5fX2lzc2V0LnZhbHVlKSB7CisgICAgdG8tPnNldF92YWx1ZShjb252ZXJ0KGZyb20udmFsdWUpKTsKKyAgfQorfQorVEhSSUZUX0NPTlZFUlNJT04odF9zdHJ1Y3QsIGdfcHJvZ3JhbV9jYWNoZVtmcm9tLm1ldGFkYXRhLnByb2dyYW1faWRdKSB7CisgIGFzc2VydCh0byk7CisgIFRIUklGVF9BU1NJR05fTUVUQURBVEEoKTsKKyAgdG8tPnNldF91bmlvbihmcm9tLmlzX3VuaW9uKTsKKyAgdG8tPnNldF94Y2VwdGlvbihmcm9tLmlzX3hjZXB0aW9uKTsKKyAgYm9vc3Q6OmZvcl9lYWNoKGZyb20ubWVtYmVycyB8IGJvb3N0OjphZGFwdG9yczo6dHJhbnNmb3JtZWQoY29udmVydDx0X2ZpZWxkPiksCisgICAgICAgICAgICAgICAgICBzdGQ6OmJpbmQoJjo6dF9zdHJ1Y3Q6OmFwcGVuZCwgdG8sIHN0ZDo6cGxhY2Vob2xkZXJzOjpfMSkpOworfQorVEhSSUZUX0NPTlZFUlNJT04odF9jb25zdCwKKyAgICAgICAgICAgICAgICAgIHJlc29sdmVfdHlwZTwgOjp0X3R5cGU+KGZyb20udHlwZSksCisgICAgICAgICAgICAgICAgICBmcm9tLm5hbWUsCisgICAgICAgICAgICAgICAgICBjb252ZXJ0PHRfY29uc3RfdmFsdWU+KGZyb20udmFsdWUpKSB7CisgIGFzc2VydCh0byk7CisgIFRIUklGVF9BU1NJR05fRE9DKCk7Cit9CisKK1RIUklGVF9DT05WRVJTSU9OKHRfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICByZXNvbHZlX3R5cGU8IDo6dF90eXBlPihmcm9tLnJldHVybnR5cGUpLAorICAgICAgICAgICAgICAgICAgZnJvbS5uYW1lLAorICAgICAgICAgICAgICAgICAgcmVzb2x2ZV90eXBlPCA6OnRfc3RydWN0Pihmcm9tLmFyZ2xpc3QpLAorICAgICAgICAgICAgICAgICAgcmVzb2x2ZV90eXBlPCA6OnRfc3RydWN0Pihmcm9tLnhjZXB0aW9ucyksCisgICAgICAgICAgICAgICAgICBmcm9tLmlzX29uZXdheSkgeworICBhc3NlcnQodG8pOworICBUSFJJRlRfQVNTSUdOX0RPQygpOworfQorCitUSFJJRlRfQ09OVkVSU0lPTih0X3NlcnZpY2UsIGdfcHJvZ3JhbV9jYWNoZVtmcm9tLm1ldGFkYXRhLnByb2dyYW1faWRdKSB7CisgIGFzc2VydCh0byk7CisgIGFzc2VydChmcm9tLm1ldGFkYXRhLnByb2dyYW1faWQpOworICBhc3NlcnQoZ19wcm9ncmFtX2NhY2hlW2Zyb20ubWV0YWRhdGEucHJvZ3JhbV9pZF0pOworICBUSFJJRlRfQVNTSUdOX01FVEFEQVRBKCk7CisKKyAgYm9vc3Q6OmZvcl9lYWNoKGZyb20uZnVuY3Rpb25zIHwgYm9vc3Q6OmFkYXB0b3JzOjp0cmFuc2Zvcm1lZChjb252ZXJ0PHRfZnVuY3Rpb24+KSwKKyAgICAgICAgICAgICAgICAgIHN0ZDo6YmluZCgmOjp0X3NlcnZpY2U6OmFkZF9mdW5jdGlvbiwgdG8sIHN0ZDo6cGxhY2Vob2xkZXJzOjpfMSkpOworCisgIGlmIChmcm9tLl9faXNzZXQuZXh0ZW5kc18pCisgICAgdG8tPnNldF9leHRlbmRzKHJlc29sdmVfc2VydmljZShmcm9tLmV4dGVuZHNfKSk7Cit9CisKK1RIUklGVF9DT05WRVJUX0ZPUldBUkQodF90eXBlKSB7CisjZGVmaW5lIFRfVFlQRV9DQVNFX0ZXX1QoY2FzZSwgdHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmIChmcm9tLl9faXNzZXQuY2FzZSMjX3ZhbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHJldHVybiBjb252ZXJ0X2ZvcndhcmQ8dHlwZT4oZnJvbS5jYXNlIyNfdmFsKQorI2RlZmluZSBUX1RZUEVfQ0FTRV9GVyhjYXNlKSBUX1RZUEVfQ0FTRV9GV19UKGNhc2UsIHRfIyNjYXNlKQorCisgIFRfVFlQRV9DQVNFX0ZXKGJhc2VfdHlwZSk7CisgIFRfVFlQRV9DQVNFX0ZXKHR5cGVkZWYpOworICBUX1RZUEVfQ0FTRV9GVyhlbnVtKTsKKyAgVF9UWVBFX0NBU0VfRlcoc3RydWN0KTsKKyAgVF9UWVBFX0NBU0VfRldfVCh4Y2VwdGlvbiwgdF9zdHJ1Y3QpOworICBUX1RZUEVfQ0FTRV9GVyhsaXN0KTsKKyAgVF9UWVBFX0NBU0VfRlcoc2V0KTsKKyAgVF9UWVBFX0NBU0VfRlcobWFwKTsKKyAgVF9UWVBFX0NBU0VfRlcoc2VydmljZSk7CisgIHRocm93IFRocmlmdFBsdWdpbkVycm9yKCJJbnZhbGlkIGRhdGE6IFR5cGUgdW5pb24gaGFzIG5vIHZhbHVlLiIpOworI3VuZGVmIFRfVFlQRV9DQVNFX0ZXX1QKKyN1bmRlZiBUX1RZUEVfQ0FTRV9GVworfQorVEhSSUZUX0NPTlZFUlRfQ09NUExFVEUodF90eXBlKSB7CisjZGVmaW5lIFRfVFlQRV9DQVNFX1QoY2FzZSwgdHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGVsc2UgaWYgKGZyb20uX19pc3NldC5jYXNlIyNfdmFsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBjb252ZXJ0PHR5cGUsIDo6dHlwZT4oZnJvbS5jYXNlIyNfdmFsLCByZWludGVycHJldF9jYXN0PCA6OnR5cGUqPih0bykpCisjZGVmaW5lIFRfVFlQRV9DQVNFKGNhc2UpIFRfVFlQRV9DQVNFX1QoY2FzZSwgdF8jI2Nhc2UpCisKKyAgaWYgKGZhbHNlKSB7CisgIH0KKyAgVF9UWVBFX0NBU0UoYmFzZV90eXBlKTsKKyAgVF9UWVBFX0NBU0UodHlwZWRlZik7CisgIFRfVFlQRV9DQVNFKGVudW0pOworICBUX1RZUEVfQ0FTRShzdHJ1Y3QpOworICBUX1RZUEVfQ0FTRV9UKHhjZXB0aW9uLCB0X3N0cnVjdCk7CisgIFRfVFlQRV9DQVNFKGxpc3QpOworICBUX1RZUEVfQ0FTRShzZXQpOworICBUX1RZUEVfQ0FTRShtYXApOworICBUX1RZUEVfQ0FTRShzZXJ2aWNlKTsKKyAgZWxzZSB7CisgICAgdGhyb3cgVGhyaWZ0UGx1Z2luRXJyb3IoIkludmFsaWQgZGF0YTogVHlwZSB1bmlvbiBoYXMgbm8gdmFsdWUuIik7CisgIH0KKyN1bmRlZiBUX1RZUEVfQ0FTRV9UCisjdW5kZWYgVF9UWVBFX0NBU0UKK30KKworVEhSSUZUX0NPTlZFUlNJT04odF9zY29wZSwgKSB7CisgIGFzc2VydCh0byk7CisjZGVmaW5lIFRfU0NPUEVfUkVTT0xWRSh0eXBlLCBuYW1lLCBhKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGZvciAoc3RkOjp2ZWN0b3I8aW50NjRfdD46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gZnJvbS5uYW1lIyNzLmJlZ2luKCk7IGl0ICE9IGZyb20ubmFtZSMjcy5lbmQoKTsgICBcCisgICAgICAgaXQrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgOjp0XyMjdHlwZSogdCA9IHJlc29sdmVfIyN0eXBlIGEoKml0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdG8tPmFkZF8jI25hbWUodC0+Z2V0X25hbWUoKSwgdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKyAgVF9TQ09QRV9SRVNPTFZFKHR5cGUsIHR5cGUsIDwgOjp0X3R5cGU+KTsKKyAgVF9TQ09QRV9SRVNPTFZFKGNvbnN0LCBjb25zdGFudCwgKTsKKyAgVF9TQ09QRV9SRVNPTFZFKHNlcnZpY2UsIHNlcnZpY2UsICk7CisjdW5kZWYgVF9TQ09QRV9SRVNPTFZFCit9CisKK1RIUklGVF9DT05WRVJUX0ZPUldBUkQodF9wcm9ncmFtKSB7CisgIDo6dF9wcm9ncmFtKiB0byA9IG5ldyA6OnRfcHJvZ3JhbShmcm9tLnBhdGgsIGZyb20ubmFtZSk7CisgIGZvciAoc3RkOjp2ZWN0b3I8dF9wcm9ncmFtPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBmcm9tLmluY2x1ZGVzLmJlZ2luKCk7IGl0ICE9IGZyb20uaW5jbHVkZXMuZW5kKCk7CisgICAgICAgaXQrKykgeworICAgIHRvLT5hZGRfaW5jbHVkZShjb252ZXJ0X2ZvcndhcmQoKml0KSk7CisgIH0KKyAgZ19wcm9ncmFtX2NhY2hlW2Zyb20ucHJvZ3JhbV9pZF0gPSB0bzsKKyAgcmV0dXJuIHRvOworfQorVEhSSUZUX0NPTlZFUlRfQ09NUExFVEUodF9wcm9ncmFtKSB7CisgIGFzc2VydCh0byk7CisgIGdfcHJvZ3JhbSA9IHRvOworICBjb252ZXJ0PHRfc2NvcGUsIDo6dF9zY29wZT4oZnJvbS5zY29wZSwgdG8tPnNjb3BlKCkpOworICBUSFJJRlRfQVNTSUdOX0RPQygpOworCisgIHRvLT5zZXRfb3V0X3BhdGgoZnJvbS5vdXRfcGF0aCwgZnJvbS5vdXRfcGF0aF9pc19hYnNvbHV0ZSk7CisKKyAgYm9vc3Q6OmZvcl9lYWNoKGZyb20udHlwZWRlZnMgfCBib29zdDo6YWRhcHRvcnM6OnRyYW5zZm9ybWVkKCZyZXNvbHZlX3R5cGU8IDo6dF90eXBlZGVmPiksCisgICAgICAgICAgICAgICAgICBzdGQ6OmJpbmQoJjo6dF9wcm9ncmFtOjphZGRfdHlwZWRlZiwgdG8sIHN0ZDo6cGxhY2Vob2xkZXJzOjpfMSkpOworICBib29zdDo6Zm9yX2VhY2goZnJvbS5lbnVtcyB8IGJvb3N0OjphZGFwdG9yczo6dHJhbnNmb3JtZWQoJnJlc29sdmVfdHlwZTwgOjp0X2VudW0+KSwKKyAgICAgICAgICAgICAgICAgIHN0ZDo6YmluZCgmOjp0X3Byb2dyYW06OmFkZF9lbnVtLCB0bywgc3RkOjpwbGFjZWhvbGRlcnM6Ol8xKSk7CisgIGZvciAoc3RkOjp2ZWN0b3I8aW50NjRfdD46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gZnJvbS5vYmplY3RzLmJlZ2luKCk7IGl0ICE9IGZyb20ub2JqZWN0cy5lbmQoKTsKKyAgICAgICBpdCsrKSB7CisgICAgOjp0X3N0cnVjdCogdDIgPSByZXNvbHZlX3R5cGU8IDo6dF9zdHJ1Y3Q+KCppdCk7CisgICAgaWYgKHQyLT5pc194Y2VwdGlvbigpKSB7CisgICAgICB0by0+YWRkX3hjZXB0aW9uKHQyKTsKKyAgICB9IGVsc2UgeworICAgICAgdG8tPmFkZF9zdHJ1Y3QodDIpOworICAgIH0KKyAgfQorICBib29zdDo6Zm9yX2VhY2goZnJvbS5jb25zdHMgfCBib29zdDo6YWRhcHRvcnM6OnRyYW5zZm9ybWVkKCZyZXNvbHZlX2NvbnN0KSwKKyAgICAgICAgICAgICAgICAgIHN0ZDo6YmluZCgmOjp0X3Byb2dyYW06OmFkZF9jb25zdCwgdG8sIHN0ZDo6cGxhY2Vob2xkZXJzOjpfMSkpOworICBib29zdDo6Zm9yX2VhY2goZnJvbS5zZXJ2aWNlcyB8IGJvb3N0OjphZGFwdG9yczo6dHJhbnNmb3JtZWQoJnJlc29sdmVfc2VydmljZSksCisgICAgICAgICAgICAgICAgICBzdGQ6OmJpbmQoJjo6dF9wcm9ncmFtOjphZGRfc2VydmljZSwgdG8sIHN0ZDo6cGxhY2Vob2xkZXJzOjpfMSkpOworCisgIGZvciAoc3RkOjp2ZWN0b3I8dF9wcm9ncmFtPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBmcm9tLmluY2x1ZGVzLmJlZ2luKCk7IGl0ICE9IGZyb20uaW5jbHVkZXMuZW5kKCk7CisgICAgICAgaXQrKykgeworICAgIGNvbnZlcnQoKml0LCBnX3Byb2dyYW1fY2FjaGVbaXQtPnByb2dyYW1faWRdKTsKKyAgfQorICBzdGQ6OmZvcl9lYWNoKGZyb20uY19pbmNsdWRlcy5iZWdpbigpLCBmcm9tLmNfaW5jbHVkZXMuZW5kKCksCisgICAgICAgICAgICAgICAgc3RkOjpiaW5kKCY6OnRfcHJvZ3JhbTo6YWRkX2NfaW5jbHVkZSwgdG8sIHN0ZDo6cGxhY2Vob2xkZXJzOjpfMSkpOworICBzdGQ6OmZvcl9lYWNoKGZyb20uY3BwX2luY2x1ZGVzLmJlZ2luKCksIGZyb20uY3BwX2luY2x1ZGVzLmVuZCgpLAorICAgICAgICAgICAgICAgIHN0ZDo6YmluZCgmOjp0X3Byb2dyYW06OmFkZF9jcHBfaW5jbHVkZSwgdG8sIHN0ZDo6cGxhY2Vob2xkZXJzOjpfMSkpOworICBmb3IgKHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gZnJvbS5uYW1lc3BhY2VzLmJlZ2luKCk7CisgICAgICAgaXQgIT0gZnJvbS5uYW1lc3BhY2VzLmVuZCgpOyBpdCsrKSB7CisgICAgdG8tPnNldF9uYW1lc3BhY2UoaXQtPmZpcnN0LCBpdC0+c2Vjb25kKTsKKyAgfQorCisgIHRvLT5zZXRfaW5jbHVkZV9wcmVmaXgoZnJvbS5pbmNsdWRlX3ByZWZpeCk7CisgIHRvLT5zZXRfbmFtZXNwYWNlKGZyb20ubmFtZXNwYWNlXyk7Cit9CisKK2ludCBHZW5lcmF0b3JQbHVnaW46OmV4ZWMoaW50LCBjaGFyKiBbXSkgeworI2lmZGVmIF9XSU4zMgorICBfc2V0bW9kZShmaWxlbm8oc3RkaW4pLCBfT19CSU5BUlkpOworI2VuZGlmCisgIHN0ZDo6c2hhcmVkX3B0cjxURnJhbWVkVHJhbnNwb3J0PiB0cmFuc3BvcnQoCisgICAgICBuZXcgVEZyYW1lZFRyYW5zcG9ydChzdGQ6Om1ha2Vfc2hhcmVkPFRGRFRyYW5zcG9ydD4oZmlsZW5vKHN0ZGluKSkpKTsKKyAgVEJpbmFyeVByb3RvY29sIHByb3RvKHRyYW5zcG9ydCk7CisgIEdlbmVyYXRvcklucHV0IGlucHV0OworICB0cnkgeworICAgIGlucHV0LnJlYWQoJnByb3RvKTsKKyAgfSBjYXRjaCAoc3RkOjpleGNlcHRpb24mIGVycikgeworICAgIHN0ZDo6Y2VyciA8PCAiRXJyb3Igd2hpbGUgcmVjZWl2aW5nIHBsdWdpbiBkYXRhOiAiIDw8IGVyci53aGF0KCkgPDwgc3RkOjplbmRsOworICAgIHJldHVybiAtMTsKKyAgfQorICBpbml0R2xvYmFscygpOworICA6OnRfcHJvZ3JhbSogcCA9IGdfcHJvZ3JhbSA9IGNvbnZlcnRfZm9yd2FyZChpbnB1dC5wcm9ncmFtKTsKKyAgc2V0X2dsb2JhbF9jYWNoZShpbnB1dC50eXBlX3JlZ2lzdHJ5KTsKKyAgY29udmVydChpbnB1dC5wcm9ncmFtLCBwKTsKKworICBpbnQgcmV0ID0gZ2VuZXJhdGUocCwgaW5wdXQucGFyc2VkX29wdGlvbnMpOworICBjbGVhckdsb2JhbHMoKTsKKworICByZXR1cm4gcmV0OworfQorCis6OnRfY29uc3RfdmFsdWU6OnRfY29uc3RfdmFsdWVfdHlwZSBjb25zdF92YWx1ZV9jYXNlKGNvbnN0IHRfY29uc3RfdmFsdWUmIHYpIHsKKyAgaWYgKHYuX19pc3NldC5tYXBfdmFsKQorICAgIHJldHVybiA6OnRfY29uc3RfdmFsdWU6OkNWX01BUDsKKyAgaWYgKHYuX19pc3NldC5saXN0X3ZhbCkKKyAgICByZXR1cm4gOjp0X2NvbnN0X3ZhbHVlOjpDVl9MSVNUOworICBpZiAodi5fX2lzc2V0LnN0cmluZ192YWwpCisgICAgcmV0dXJuIDo6dF9jb25zdF92YWx1ZTo6Q1ZfU1RSSU5HOworICBpZiAodi5fX2lzc2V0LmludGVnZXJfdmFsKQorICAgIHJldHVybiA6OnRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVI7CisgIGlmICh2Ll9faXNzZXQuZG91YmxlX3ZhbCkKKyAgICByZXR1cm4gOjp0X2NvbnN0X3ZhbHVlOjpDVl9ET1VCTEU7CisgIGlmICh2Ll9faXNzZXQuY29uc3RfaWRlbnRpZmllcl92YWwpCisgICAgcmV0dXJuIDo6dF9jb25zdF92YWx1ZTo6Q1ZfSURFTlRJRklFUjsKKyAgdGhyb3cgVGhyaWZ0UGx1Z2luRXJyb3IoIlVua25vd24gY29uc3QgdmFsdWUgdHlwZSIpOworfQorCitib29sIHRfY29uc3RfdmFsdWU6Om9wZXJhdG9yPChjb25zdCB0X2NvbnN0X3ZhbHVlJiB0aGF0KSBjb25zdCB7CisgIDo6dF9jb25zdF92YWx1ZTo6dF9jb25zdF92YWx1ZV90eXBlIHQxID0gY29uc3RfdmFsdWVfY2FzZSgqdGhpcyk7CisgIDo6dF9jb25zdF92YWx1ZTo6dF9jb25zdF92YWx1ZV90eXBlIHQyID0gY29uc3RfdmFsdWVfY2FzZSh0aGF0KTsKKyAgaWYgKHQxICE9IHQyKQorICAgIHJldHVybiB0MSA8IHQyOworICBzd2l0Y2ggKHQxKSB7CisgIGNhc2UgOjp0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSOgorICAgIHJldHVybiBpbnRlZ2VyX3ZhbCA8IHRoYXQuaW50ZWdlcl92YWw7CisgIGNhc2UgOjp0X2NvbnN0X3ZhbHVlOjpDVl9ET1VCTEU6CisgICAgcmV0dXJuIGRvdWJsZV92YWwgPCB0aGF0LmRvdWJsZV92YWw7CisgIGNhc2UgOjp0X2NvbnN0X3ZhbHVlOjpDVl9TVFJJTkc6CisgICAgcmV0dXJuIHN0cmluZ192YWwgPCB0aGF0LnN0cmluZ192YWw7CisgIGNhc2UgOjp0X2NvbnN0X3ZhbHVlOjpDVl9NQVA6CisgICAgaWYgKHRoYXQubWFwX3ZhbC5lbXB0eSgpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGVsc2UgaWYgKG1hcF92YWwuZW1wdHkoKSkKKyAgICAgIHJldHVybiB0cnVlOworICAgIGVsc2UKKyAgICAgIHJldHVybiBtYXBfdmFsLmJlZ2luKCktPmZpcnN0IDwgdGhhdC5tYXBfdmFsLmJlZ2luKCktPmZpcnN0OworICBjYXNlIDo6dF9jb25zdF92YWx1ZTo6Q1ZfTElTVDoKKyAgICBpZiAodGhhdC5saXN0X3ZhbC5lbXB0eSgpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGVsc2UgaWYgKGxpc3RfdmFsLmVtcHR5KCkpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gbGlzdF92YWwuZnJvbnQoKSA8IHRoYXQubGlzdF92YWwuZnJvbnQoKTsKKyAgY2FzZSA6OnRfY29uc3RfdmFsdWU6OkNWX0lERU5USUZJRVI6CisgICAgcmV0dXJuIGludGVnZXJfdmFsIDwgdGhhdC5pbnRlZ2VyX3ZhbDsKKyAgfQorICB0aHJvdyBUaHJpZnRQbHVnaW5FcnJvcigiVW5rbm93biBjb25zdCB2YWx1ZSB0eXBlIik7Cit9Cit9Cit9Cit9CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wbHVnaW4vcGx1Z2luLmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wbHVnaW4vcGx1Z2luLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA1Y2Q0MQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW4uaApAQCAtMCwwICsxLDQ0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVF9QTFVHSU5fUExVR0lOX0gKKyNkZWZpbmUgVF9QTFVHSU5fUExVR0lOX0gKKworI2luY2x1ZGUgInRocmlmdC9UaHJpZnQuaCIKKworY2xhc3MgdF9wcm9ncmFtOworCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHBsdWdpbiB7CisKK3N0cnVjdCBUaHJpZnRQbHVnaW5FcnJvciA6IHB1YmxpYyBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbiB7CisgIFRocmlmdFBsdWdpbkVycm9yKGNvbnN0IHN0ZDo6c3RyaW5nJiBtc2cpIDogYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24obXNnKSB7fQorfTsKKworY2xhc3MgR2VuZXJhdG9yUGx1Z2luIHsKK3B1YmxpYzoKKyAgaW50IGV4ZWMoaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSk7CisgIHZpcnR1YWwgaW50IGdlbmVyYXRlKDo6dF9wcm9ncmFtKiwgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYpID0gMDsKK307Cit9Cit9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGx1Z2luL3BsdWdpbi50aHJpZnQgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wbHVnaW4vcGx1Z2luLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDk4Zjk5Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGx1Z2luL3BsdWdpbi50aHJpZnQKQEAgLTAsMCArMSwyMDcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworbmFtZXNwYWNlIGFzMyBvcmcuYXBhY2hlLnRocmlmdC5wbHVnaW4KK25hbWVzcGFjZSBjcHAgYXBhY2hlLnRocmlmdC5wbHVnaW4KK25hbWVzcGFjZSBjc2hhcnAgVGhyaWZ0LlBsdWdpbgorbmFtZXNwYWNlIGQgdGhyaWZ0LnBsdWdpbgorbmFtZXNwYWNlIGRlbHBoaSBUaHJpZnQuUGx1Z2luCituYW1lc3BhY2UgZXJsIHRocmlmdC5wbHVnaW4KK25hbWVzcGFjZSBnbyB0aHJpZnQKK25hbWVzcGFjZSBoYXhlIG9yZy5hcGFjaGUudGhyaWZ0LnBsdWdpbgorbmFtZXNwYWNlIGhzIFRocmlmdC5QbHVnaW4KK25hbWVzcGFjZSBqYXZhIG9yZy5hcGFjaGUudGhyaWZ0LnBsdWdpbgorbmFtZXNwYWNlIG9jYW1sIFRocmlmdAorbmFtZXNwYWNlIHBlcmwgVGhyaWZ0LlBsdWdpbgorbmFtZXNwYWNlIHBocCB0aHJpZnQucGx1Z2luCituYW1lc3BhY2UgcHkgdGhyaWZ0LnBsdWdpbgorbmFtZXNwYWNlIHJiIFRocmlmdAorCit0eXBlZGVmIGk2NCB0X3Byb2dyYW1faWQKK3R5cGVkZWYgaTY0IHRfdHlwZV9pZAordHlwZWRlZiBpNjQgdF9jb25zdF9pZAordHlwZWRlZiBpNjQgdF9zZXJ2aWNlX2lkCisKK2VudW0gdF9iYXNlIHsKKyAgICBUWVBFX1ZPSUQKKyAgICBUWVBFX1NUUklORworICAgIFRZUEVfQk9PTAorICAgIFRZUEVfSTgKKyAgICBUWVBFX0kxNgorICAgIFRZUEVfSTMyCisgICAgVFlQRV9JNjQKKyAgICBUWVBFX0RPVUJMRQorICAgIFRZUEVfQklOQVJZCit9CisKK3N0cnVjdCBUeXBlTWV0YWRhdGEgeworICAxOiByZXF1aXJlZCBzdHJpbmcgbmFtZQorICAyOiByZXF1aXJlZCB0X3Byb2dyYW1faWQgcHJvZ3JhbV9pZAorICA5OTogb3B0aW9uYWwgbWFwPHN0cmluZywgc3RyaW5nPiBhbm5vdGF0aW9ucworICAxMDA6IG9wdGlvbmFsIHN0cmluZyBkb2MKK30KKworc3RydWN0IHRfYmFzZV90eXBlIHsKKyAgMTogcmVxdWlyZWQgVHlwZU1ldGFkYXRhIG1ldGFkYXRhCisgIDI6IHJlcXVpcmVkIHRfYmFzZSB2YWx1ZQorfQorCitzdHJ1Y3QgdF9saXN0IHsKKyAgMTogcmVxdWlyZWQgVHlwZU1ldGFkYXRhIG1ldGFkYXRhCisgIDI6IG9wdGlvbmFsIHN0cmluZyBjcHBfbmFtZQorICAzOiByZXF1aXJlZCB0X3R5cGVfaWQgZWxlbV90eXBlCit9CisKK3N0cnVjdCB0X3NldCB7CisgIDE6IHJlcXVpcmVkIFR5cGVNZXRhZGF0YSBtZXRhZGF0YQorICAyOiBvcHRpb25hbCBzdHJpbmcgY3BwX25hbWUKKyAgMzogcmVxdWlyZWQgdF90eXBlX2lkIGVsZW1fdHlwZQorfQorCitzdHJ1Y3QgdF9tYXAgeworICAxOiByZXF1aXJlZCBUeXBlTWV0YWRhdGEgbWV0YWRhdGEKKyAgMjogb3B0aW9uYWwgc3RyaW5nIGNwcF9uYW1lCisgIDM6IHJlcXVpcmVkIHRfdHlwZV9pZCBrZXlfdHlwZQorICA0OiByZXF1aXJlZCB0X3R5cGVfaWQgdmFsX3R5cGUKK30KKworc3RydWN0IHRfdHlwZWRlZiB7CisgIDE6IHJlcXVpcmVkIFR5cGVNZXRhZGF0YSBtZXRhZGF0YQorICAyOiByZXF1aXJlZCB0X3R5cGVfaWQgdHlwZQorICAzOiByZXF1aXJlZCBzdHJpbmcgc3ltYm9saWMKKyAgNDogcmVxdWlyZWQgYm9vbCBmb3J3YXJkCit9CisKK3N0cnVjdCB0X2VudW1fdmFsdWUgeworICAxOiByZXF1aXJlZCBzdHJpbmcgbmFtZQorICAyOiByZXF1aXJlZCBpMzIgdmFsdWUKKyAgOTk6IG9wdGlvbmFsIG1hcDxzdHJpbmcsIHN0cmluZz4gYW5ub3RhdGlvbnMKKyAgMTAwOiBvcHRpb25hbCBzdHJpbmcgZG9jCit9CitzdHJ1Y3QgdF9lbnVtIHsKKyAgMTogcmVxdWlyZWQgVHlwZU1ldGFkYXRhIG1ldGFkYXRhCisgIDI6IHJlcXVpcmVkIGxpc3Q8dF9lbnVtX3ZhbHVlPiBjb25zdGFudHMKK30KKworZW51bSBSZXF1aXJlZG5lc3MgeworICBUX1JFUVVJUkVEID0gMAorICBUX09QVElPTkFMID0gMQorICBUX09QVF9JTl9SRVFfT1VUID0gMgorfQorCitzdHJ1Y3QgdF9jb25zdF9pZGVudGlmaWVyX3ZhbHVlIHsKKyAgMTogcmVxdWlyZWQgc3RyaW5nIGlkZW50aWZpZXJfdmFsCisgIDI6IHJlcXVpcmVkIHRfdHlwZV9pZCBlbnVtX3ZhbAorfQorCit1bmlvbiB0X2NvbnN0X3ZhbHVlIHsKKyAgMTogb3B0aW9uYWwgbWFwPHRfY29uc3RfdmFsdWUsIHRfY29uc3RfdmFsdWU+IG1hcF92YWwKKyAgMjogb3B0aW9uYWwgbGlzdDx0X2NvbnN0X3ZhbHVlPiBsaXN0X3ZhbAorICAzOiBvcHRpb25hbCBzdHJpbmcgc3RyaW5nX3ZhbAorICA0OiBvcHRpb25hbCBpNjQgaW50ZWdlcl92YWwKKyAgNTogb3B0aW9uYWwgZG91YmxlIGRvdWJsZV92YWwKKyAgODogb3B0aW9uYWwgdF9jb25zdF9pZGVudGlmaWVyX3ZhbHVlIGNvbnN0X2lkZW50aWZpZXJfdmFsCit9CisKK3N0cnVjdCB0X2NvbnN0IHsKKyAgMTogcmVxdWlyZWQgc3RyaW5nIG5hbWUKKyAgMjogcmVxdWlyZWQgdF90eXBlX2lkIHR5cGUKKyAgMzogcmVxdWlyZWQgdF9jb25zdF92YWx1ZSB2YWx1ZQorICAxMDA6IG9wdGlvbmFsIHN0cmluZyBkb2MKK30KK3N0cnVjdCB0X2ZpZWxkIHsKKyAgMTogcmVxdWlyZWQgc3RyaW5nIG5hbWUKKyAgMjogcmVxdWlyZWQgdF90eXBlX2lkIHR5cGUKKyAgMzogcmVxdWlyZWQgaTMyIGtleQorICA0OiByZXF1aXJlZCBSZXF1aXJlZG5lc3MgcmVxCisgIDU6IG9wdGlvbmFsIHRfY29uc3RfdmFsdWUgdmFsdWUKKyAgMTA6IHJlcXVpcmVkIGJvb2wgcmVmZXJlbmNlCisgIDk5OiBvcHRpb25hbCBtYXA8c3RyaW5nLCBzdHJpbmc+IGFubm90YXRpb25zCisgIDEwMDogb3B0aW9uYWwgc3RyaW5nIGRvYworfQorc3RydWN0IHRfc3RydWN0IHsKKyAgMTogcmVxdWlyZWQgVHlwZU1ldGFkYXRhIG1ldGFkYXRhCisgIDI6IHJlcXVpcmVkIGxpc3Q8dF9maWVsZD4gbWVtYmVycworICAzOiByZXF1aXJlZCBib29sIGlzX3VuaW9uCisgIDQ6IHJlcXVpcmVkIGJvb2wgaXNfeGNlcHRpb24KK30KK3N0cnVjdCB0X2Z1bmN0aW9uIHsKKyAgMTogcmVxdWlyZWQgc3RyaW5nIG5hbWUKKyAgMjogcmVxdWlyZWQgdF90eXBlX2lkIHJldHVybnR5cGUKKyAgMzogcmVxdWlyZWQgdF90eXBlX2lkIGFyZ2xpc3QKKyAgNDogcmVxdWlyZWQgdF90eXBlX2lkIHhjZXB0aW9ucworICA1OiByZXF1aXJlZCBib29sIGlzX29uZXdheQorICAxMDA6IG9wdGlvbmFsIHN0cmluZyBkb2MKK30KK3N0cnVjdCB0X3NlcnZpY2UgeworICAxOiByZXF1aXJlZCBUeXBlTWV0YWRhdGEgbWV0YWRhdGEKKyAgMjogcmVxdWlyZWQgbGlzdDx0X2Z1bmN0aW9uPiBmdW5jdGlvbnMKKyAgMzogb3B0aW9uYWwgdF9zZXJ2aWNlX2lkIGV4dGVuZHNfCit9Cit1bmlvbiB0X3R5cGUgeworICAxOiBvcHRpb25hbCB0X2Jhc2VfdHlwZSBiYXNlX3R5cGVfdmFsCisgIDI6IG9wdGlvbmFsIHRfdHlwZWRlZiB0eXBlZGVmX3ZhbAorICAzOiBvcHRpb25hbCB0X2VudW0gZW51bV92YWwKKyAgNDogb3B0aW9uYWwgdF9zdHJ1Y3Qgc3RydWN0X3ZhbAorICA1OiBvcHRpb25hbCB0X3N0cnVjdCB4Y2VwdGlvbl92YWwKKyAgNjogb3B0aW9uYWwgdF9saXN0IGxpc3RfdmFsCisgIDc6IG9wdGlvbmFsIHRfc2V0IHNldF92YWwKKyAgODogb3B0aW9uYWwgdF9tYXAgbWFwX3ZhbAorICA5OiBvcHRpb25hbCB0X3NlcnZpY2Ugc2VydmljZV92YWwKK30KK3N0cnVjdCB0X3Njb3BlIHsKKyAgMTogcmVxdWlyZWQgbGlzdDx0X3R5cGVfaWQ+IHR5cGVzCisgIDI6IHJlcXVpcmVkIGxpc3Q8dF9jb25zdF9pZD4gY29uc3RhbnRzCisgIDM6IHJlcXVpcmVkIGxpc3Q8dF9zZXJ2aWNlX2lkPiBzZXJ2aWNlcworfQorCitzdHJ1Y3QgVHlwZVJlZ2lzdHJ5IHsKKyAgMTogcmVxdWlyZWQgbWFwPHRfdHlwZV9pZCwgdF90eXBlPiB0eXBlcworICAyOiByZXF1aXJlZCBtYXA8dF9jb25zdF9pZCwgdF9jb25zdD4gY29uc3RhbnRzCisgIDM6IHJlcXVpcmVkIG1hcDx0X3NlcnZpY2VfaWQsIHRfc2VydmljZT4gc2VydmljZXMKK30KKworc3RydWN0IHRfcHJvZ3JhbSB7CisgIDE6IHJlcXVpcmVkIHN0cmluZyBuYW1lCisgIDI6IHJlcXVpcmVkIHRfcHJvZ3JhbV9pZCBwcm9ncmFtX2lkCisgIDM6IHJlcXVpcmVkIHN0cmluZyBwYXRoCisgIDQ6IHJlcXVpcmVkIHN0cmluZyBuYW1lc3BhY2VfCisgIDU6IHJlcXVpcmVkIHN0cmluZyBvdXRfcGF0aAorICA2OiByZXF1aXJlZCBib29sIG91dF9wYXRoX2lzX2Fic29sdXRlCisgIDg6IHJlcXVpcmVkIGxpc3Q8dF9wcm9ncmFtPiBpbmNsdWRlcworICA5OiByZXF1aXJlZCBzdHJpbmcgaW5jbHVkZV9wcmVmaXgKKyAgMTA6IHJlcXVpcmVkIHRfc2NvcGUgc2NvcGUKKworICAxMTogcmVxdWlyZWQgbGlzdDx0X3R5cGVfaWQ+IHR5cGVkZWZzCisgIDEyOiByZXF1aXJlZCBsaXN0PHRfdHlwZV9pZD4gZW51bXMKKyAgMTM6IHJlcXVpcmVkIGxpc3Q8dF9jb25zdF9pZD4gY29uc3RzCisgIDE0OiByZXF1aXJlZCBsaXN0PHRfdHlwZV9pZD4gb2JqZWN0cworICAxNTogcmVxdWlyZWQgbGlzdDx0X3NlcnZpY2VfaWQ+IHNlcnZpY2VzCisKKyAgMTY6IHJlcXVpcmVkIG1hcDxzdHJpbmcsIHN0cmluZz4gbmFtZXNwYWNlcworICAxNzogcmVxdWlyZWQgbGlzdDxzdHJpbmc+IGNwcF9pbmNsdWRlcworICAxODogcmVxdWlyZWQgbGlzdDxzdHJpbmc+IGNfaW5jbHVkZXMKKyAgMTAwOiBvcHRpb25hbCBzdHJpbmcgZG9jCit9CisKK3N0cnVjdCBHZW5lcmF0b3JJbnB1dCB7CisgIDE6IHJlcXVpcmVkIHRfcHJvZ3JhbSBwcm9ncmFtCisgIDI6IHJlcXVpcmVkIFR5cGVSZWdpc3RyeSB0eXBlX3JlZ2lzdHJ5CisgIDM6IHJlcXVpcmVkIG1hcDxzdHJpbmcsIHN0cmluZz4gcGFyc2VkX29wdGlvbnMKK30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW5fb3V0cHV0LmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGx1Z2luL3BsdWdpbl9vdXRwdXQuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgyMjNkZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW5fb3V0cHV0LmNjCkBAIC0wLDAgKzEsNDU1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZmRlZiBfV0lOMzIKKyNpbmNsdWRlIDxjc3RkaW8+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxpby5oPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2RlZmluZSBUSFJJRlRfUE9QRU4oY21kKSBfcG9wZW4oY21kLCAid2IiKQorI2RlZmluZSBUSFJJRlRfUENMT1NFIF9wY2xvc2UKKyNlbHNlCisjZGVmaW5lIFRIUklGVF9QT1BFTihjbWQpIHBvcGVuKGNtZCwgInciKQorI2RlZmluZSBUSFJJRlRfUENMT1NFIHBjbG9zZQorI2VuZGlmCisKKyNpbmNsdWRlICJ0aHJpZnQvcGx1Z2luL3BsdWdpbl9vdXRwdXQuaCIKKworI2luY2x1ZGUgPGJvb3N0L3JhbmdlL2FkYXB0b3IvbWFwLmhwcD4KKyNpbmNsdWRlIDxib29zdC9yYW5nZS9hbGdvcml0aG0vY29weS5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvcmFuZ2UvYWxnb3JpdGhtL3RyYW5zZm9ybS5ocHA+CisKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGx1Z2luL3BsdWdpbi5oIgorI2luY2x1ZGUgInRocmlmdC9wbHVnaW4vdHlwZV91dGlsLmgiCisjaW5jbHVkZSAidGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oIgorI2luY2x1ZGUgInRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaCIKKyNpbmNsdWRlICJ0aHJpZnQvdHJhbnNwb3J0L1RGRFRyYW5zcG9ydC5oIgorCisjaW5jbHVkZSAidGhyaWZ0L3BsdWdpbi9wbHVnaW5fdHlwZXMuaCIKKworI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIHBsdWdpbl9vdXRwdXQgeworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRnJvbT4KK3R5cGVuYW1lIGFwYWNoZTo6dGhyaWZ0OjpwbHVnaW46OlRvVHlwZTxGcm9tPjo6dHlwZSBjb252ZXJ0KEZyb20qIGZyb20pIHsKKyAgdHlwZW5hbWUgYXBhY2hlOjp0aHJpZnQ6OnBsdWdpbjo6VG9UeXBlPEZyb20+Ojp0eXBlIHRvOworICBjb252ZXJ0KGZyb20sIHRvKTsKKyAgcmV0dXJuIHRvOworfQorCit1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRCaW5hcnlQcm90b2NvbDsKK3VzaW5nIHN0ZDo6bWFrZV9zaGFyZWQ7Cit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpURkRUcmFuc3BvcnQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpURnJhbWVkVHJhbnNwb3J0OworCit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ7CisKKyNkZWZpbmUgVEhSSUZUX0NPTlZFUlNJT05fTihmcm9tX3R5cGUsIHRvX3R5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGUgPD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdm9pZCBjb252ZXJ0PGZyb21fdHlwZSwgdG9fdHlwZT4oZnJvbV90eXBlICogZnJvbSwgdG9fdHlwZSAmIHRvKQorI2RlZmluZSBUSFJJRlRfQ09OVkVSU0lPTih0eXBlKSBUSFJJRlRfQ09OVkVSU0lPTl9OKDo6dHlwZSwgcGx1Z2luOjp0eXBlKQorCisjZGVmaW5lIFRIUklGVF9BU1NJR05fTihmcm9tX25hbWUsIHRvX25hbWUsIHByZWZpeCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGZyb20pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB0by5fX3NldF8jI3RvX25hbWUocHJlZml4KGZyb20tPmZyb21fbmFtZSkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgVEhSSUZUX0FTU0lHTihuYW1lKSBUSFJJRlRfQVNTSUdOX04oZ2V0XyMjbmFtZSgpLCBuYW1lLCApCisjZGVmaW5lIFRIUklGVF9BU1NJR05fQ09OVkVSVCh0eXBlLCBmcm9tX25hbWUsIHRvX25hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGZyb20gJiYgZnJvbS0+ZnJvbV9uYW1lKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB0by5fX3NldF8jI3RvX25hbWUoY29udmVydChmcm9tLT5mcm9tX25hbWUpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgVEhSSUZUX0FTU0lHTl9PUFQobmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoZnJvbS0+aGFzXyMjbmFtZSgpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIFRIUklGVF9BU1NJR04obmFtZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBUSFJJRlRfQVNTSUdOX0xJU1RfTih0eXBlLCBmcm9tX25hbWUsIHRvX25hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChmcm9tICYmICFmcm9tLT5mcm9tX25hbWUuZW1wdHkoKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgc3RkOjp0cmFuc2Zvcm0oZnJvbS0+ZnJvbV9uYW1lLmJlZ2luKCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgZnJvbS0+ZnJvbV9uYW1lLmVuZCgpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgc3RkOjpiYWNrX2luc2VydGVyKHRvLnRvX25hbWUpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgY29udmVydDwgOjp0eXBlPik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIFRIUklGVF9BU1NJR05fTUVUQURBVEEoKSBjb252ZXJ0KHJlaW50ZXJwcmV0X2Nhc3Q8dF90eXBlKj4oZnJvbSksIHRvLm1ldGFkYXRhKQorCisvLyBhIGdlbmVyYXRvciBvZiBzZXF1ZW50aWFsIHVuaXF1ZSBpZGVudGlmaWVycyBmb3IgYWRkcmVzc2VzIC0tIHNvCisvLyB0aGF0IHRoZSBUeXBlQ2FjaGUgYmVsb3cgY2FuIHVzZSB0aG9zZSBJRHMgaW5zdGVhZCBvZgorLy8gYWRkcmVzc2VzLiBUaGlzIGFsbG93cyBHZW5lcmF0b3JJbnB1dCdzIHZhcmlvdXMKKy8vIHRfe3Byb2dyYW0sdHlwZSxldGN9X2lkIHR5cGVzIHRvIGJlIGRlbnNlIGNvbnNlY3V0aXZlbHktbnVtYmVyZWQKKy8vIGludGVnZXJzLCBpbnN0ZWFkIG9mIGxhcmdlIHJhbmRvbS1zZWVtaW5nIGludGVnZXJzLgorLy8KKy8vIEZ1cnRoZXJtb3JlLCB0aGlzIGFsbG93cyBHZW5lcmF0b3JJbnB1dCB0byBiZSBkZXRlcm1pbmlzdGljIChubworLy8gYWRkcmVzc2VzLCBzbyBubyBwc2V1ZG8tcmFuZG9tbmVzcykgYW5kIHRoYXQgbWVhbnMgcmVwcm9kdWNpYmlsaXR5CisvLyBvZiBvdXRwdXQuCitjb25zdCBpbnQ2NF90IE9ORV9NSUxMSU9OID0gMTAwMCAqIDEwMDA7CitjbGFzcyBpZF9nZW5lcmF0b3IgeworcHVibGljOgorICBpZF9nZW5lcmF0b3IoKSA6IGFkZHIyaWRfKCksIG5leHRfaWRfKE9ORV9NSUxMSU9OKSB7fQorCisgIHZvaWQgY2xlYXIoKSB7CisgICAgYWRkcjJpZF8uY2xlYXIoKSA7CisgICAgbmV4dF9pZF8gPSBPTkVfTUlMTElPTiA7CisgIH0KKworICBpbnQ2NF90IGdlbnN5bShjb25zdCBpbnQ2NF90IGFkZHIpIHsKKyAgICBpZiAoIWFkZHIpIHJldHVybiAwTCA7CisgICAgc3RkOjptYXA8aW50NjRfdCwgaW50NjRfdD46Oml0ZXJhdG9yIGl0ID0gYWRkcjJpZF8uZmluZChhZGRyKTsKKyAgICBpZiAoaXQgIT0gYWRkcjJpZF8uZW5kKCkpIHJldHVybiBpdC0+c2Vjb25kIDsKKyAgICBpbnQ2NF90IGlkID0gbmV4dF9pZF8rKyA7CisgICAgYWRkcjJpZF8uaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGFkZHIsIGlkKSkgOworICAgIHJldHVybiBpZCA7CisgIH0KKworICBzdGQ6Om1hcDxpbnQ2NF90LCBpbnQ2NF90PiBhZGRyMmlkXyA7CisgIGludDY0X3QgbmV4dF9pZF8gOworfSA7CisKKy8vIFRvIGF2b2lkIG11bHRpcGxlIGluc3RhbmNlcyBvZiBzYW1lIHR5cGUsIHRfdHlwZSwgdF9jb25zdCBhbmQgdF9zZXJ2aWNlIGFyZSBzdG9yZWQgaW4gb25lIHBsYWNlCisvLyBhbmQgcmVmZXJlbmNlZCBieSBJRC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IFR5cGVDYWNoZSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgcGx1Z2luOjpUb1R5cGU8VD46OnR5cGUgdG9fdHlwZTsKKyAgaWRfZ2VuZXJhdG9yIGlkZ2VuIDsKKyAgc3RkOjptYXA8aW50NjRfdCwgdG9fdHlwZT4gY2FjaGU7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQyPgorICBpbnQ2NF90IHN0b3JlKFQyKiB0KSB7CisgICAgaW50cHRyX3QgYWRkciA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KHQpOworICAgIGlmICghYWRkcikgcmV0dXJuIDBMIDsKKworICAgIGludDY0X3QgaWQgPSBpZGdlbi5nZW5zeW0oYWRkcikgOworICAgIGlmIChjYWNoZS5lbmQoKSAhPSBjYWNoZS5maW5kKGlkKSkgcmV0dXJuIGlkIDsKKworICAgIC8vIEhBQ0s6IGZha2UgcmVzb2x2ZSBmb3IgcmVjdXJzaXZlIHR5cGUKKyAgICBjYWNoZS5pbnNlcnQoc3RkOjptYWtlX3BhaXIoaWQsIHRvX3R5cGUoKSkpOworICAgIC8vIG92ZXJ3cml0ZSB3aXRoIHRydWUgdmFsdWUKKyAgICBjYWNoZVtpZF0gPSBjb252ZXJ0KHQpOworICAgIHJldHVybiBpZCA7CisgIH0KKworICB2b2lkIGNsZWFyKCkgeyBjYWNoZS5jbGVhcigpIDsgaWRnZW4uY2xlYXIoKTsgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitpbnQ2NF90IHN0b3JlX3R5cGUoVCogdCk7CisKKyNkZWZpbmUgVF9TVE9SRSh0eXBlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVHlwZUNhY2hlPHRfIyN0eXBlPiB0eXBlIyNfY2FjaGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGUgPD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcGx1Z2luOjp0XyMjdHlwZSMjX2lkIHN0b3JlX3R5cGU8dF8jI3R5cGU+KHRfIyN0eXBlICogdCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gdHlwZSMjX2NhY2hlLnN0b3JlPHRfIyN0eXBlPih0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorVF9TVE9SRSh0eXBlKQorVF9TVE9SRShjb25zdCkKK1RfU1RPUkUoc2VydmljZSkKKyN1bmRlZiBUX1NUT1JFCisvLyB0aGlzIGlkX2dlbmVyYXRvciBpcyBmb3IgZ2Vuc3ltbS1pbmcgdF9wcm9ncmFtX2lkCitpZF9nZW5lcmF0b3IgcHJvZ3JhbV9jYWNoZSA7CisKKyNkZWZpbmUgVEhSSUZUX0FTU0lHTl9JRF9OKHQsIGZyb21fbmFtZSwgdG9fbmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoZnJvbSAmJiBmcm9tLT5mcm9tX25hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHRvLl9fc2V0XyMjdG9fbmFtZShzdG9yZV90eXBlPHQ+KGZyb20tPmZyb21fbmFtZSkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBUSFJJRlRfQVNTSUdOX0lEKG5hbWUpIFRIUklGVF9BU1NJR05fSURfTih0X3R5cGUsIGdldF8jI25hbWUoKSwgbmFtZSkKKworI2RlZmluZSBUSFJJRlRfQVNTSUdOX0xJU1RfSUQodCwgbmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChmcm9tICYmICFmcm9tLT5nZXRfIyNuYW1lIyNzKCkuZW1wdHkoKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgc3RkOjp0cmFuc2Zvcm0oZnJvbS0+Z2V0XyMjbmFtZSMjcygpLmJlZ2luKCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgZnJvbS0+Z2V0XyMjbmFtZSMjcygpLmVuZCgpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgc3RkOjpiYWNrX2luc2VydGVyKHRvLm5hbWUjI3MpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgJnN0b3JlX3R5cGU8dD4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCitUSFJJRlRfQ09OVkVSU0lPTl9OKDo6dF90eXBlLCBwbHVnaW46OlR5cGVNZXRhZGF0YSkgeworICB0by5wcm9ncmFtX2lkID0gcHJvZ3JhbV9jYWNoZS5nZW5zeW0ocmVpbnRlcnByZXRfY2FzdDxpbnQ2NF90Pihmcm9tLT5nZXRfcHJvZ3JhbSgpKSk7CisgIFRIUklGVF9BU1NJR05fTihhbm5vdGF0aW9uc18sIGFubm90YXRpb25zLCApOworICBpZiAoZnJvbS0+aGFzX2RvYygpKSB7CisgICAgdG8uX19zZXRfZG9jKGZyb20tPmdldF9kb2MoKSk7CisgIH0KKyAgVEhSSUZUX0FTU0lHTihuYW1lKTsKK30KKworVEhSSUZUX0NPTlZFUlNJT04odF90eXBlZGVmKSB7CisgIFRIUklGVF9BU1NJR05fTUVUQURBVEEoKTsKKyAgVEhSSUZUX0FTU0lHTl9JRCh0eXBlKTsKKyAgVEhSSUZUX0FTU0lHTihzeW1ib2xpYyk7CisgIFRIUklGVF9BU1NJR05fTihpc19mb3J3YXJkX3R5cGVkZWYoKSwgZm9yd2FyZCwgKTsKK30KKworVEhSSUZUX0NPTlZFUlNJT04odF9lbnVtX3ZhbHVlKSB7CisgIFRIUklGVF9BU1NJR05fT1BUKGRvYyk7CisgIFRIUklGVF9BU1NJR04obmFtZSk7CisgIFRIUklGVF9BU1NJR04odmFsdWUpOworfQorCitUSFJJRlRfQ09OVkVSU0lPTih0X2VudW0pIHsKKyAgVEhSSUZUX0FTU0lHTl9NRVRBREFUQSgpOworICBUSFJJRlRfQVNTSUdOX0xJU1RfTih0X2VudW1fdmFsdWUsIGdldF9jb25zdGFudHMoKSwgY29uc3RhbnRzKTsKK30KKworVEhSSUZUX0NPTlZFUlNJT04odF9jb25zdF92YWx1ZSkgeworICBzd2l0Y2ggKGZyb20tPmdldF90eXBlKCkpIHsKKyAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSOgorICAgIFRIUklGVF9BU1NJR05fTihnZXRfaW50ZWdlcigpLCBpbnRlZ2VyX3ZhbCwgKTsKKyAgICBicmVhazsKKyAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9ET1VCTEU6CisgICAgVEhSSUZUX0FTU0lHTl9OKGdldF9kb3VibGUoKSwgZG91YmxlX3ZhbCwgKTsKKyAgICBicmVhazsKKyAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9TVFJJTkc6CisgICAgVEhSSUZUX0FTU0lHTl9OKGdldF9zdHJpbmcoKSwgc3RyaW5nX3ZhbCwgKTsKKyAgICBicmVhazsKKyAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9JREVOVElGSUVSOgorICAgIGlmIChmcm9tKSB7CisgICAgICBhcGFjaGU6OnRocmlmdDo6cGx1Z2luOjp0X2NvbnN0X2lkZW50aWZpZXJfdmFsdWUgY2lkdmFsIDsKKyAgICAgIGlmIChmcm9tLT5lbnVtXykKKwljaWR2YWwuX19zZXRfZW51bV92YWwoc3RvcmVfdHlwZTx0X3R5cGU+KGZyb20tPmVudW1fKSk7CisgICAgICBjaWR2YWwuX19zZXRfaWRlbnRpZmllcl92YWwoZnJvbS0+Z2V0X2lkZW50aWZpZXIoKSk7CisgICAgICB0by5fX3NldF9jb25zdF9pZGVudGlmaWVyX3ZhbChjaWR2YWwpIDsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfTUFQOgorICAgIHRvLl9faXNzZXQubWFwX3ZhbCA9IHRydWU7CisgICAgaWYgKGZyb20gJiYgIWZyb20tPmdldF9tYXAoKS5lbXB0eSgpKSB7CisgICAgICBmb3IgKHN0ZDo6bWFwPCA6OnRfY29uc3RfdmFsdWUqLCA6OnRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3IgaXQKKyAgICAgICAgICAgPSBmcm9tLT5nZXRfbWFwKCkuYmVnaW4oKTsKKyAgICAgICAgICAgaXQgIT0gZnJvbS0+Z2V0X21hcCgpLmVuZCgpOworICAgICAgICAgICBpdCsrKSB7CisgICAgICAgIHRvLm1hcF92YWwuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGNvbnZlcnQoaXQtPmZpcnN0KSwgY29udmVydChpdC0+c2Vjb25kKSkpOworICAgICAgfQorICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9MSVNUOgorICAgIHRvLl9faXNzZXQubGlzdF92YWwgPSB0cnVlOworICAgIFRIUklGVF9BU1NJR05fTElTVF9OKHRfY29uc3RfdmFsdWUsIGdldF9saXN0KCksIGxpc3RfdmFsKTsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICB0aHJvdyBwbHVnaW46OlRocmlmdFBsdWdpbkVycm9yKCJjb25zdCB2YWx1ZSBoYXMgbm8gdmFsdWUiKTsKKyAgfQorfQorVEhSSUZUX0NPTlZFUlNJT04odF9jb25zdCkgeworICBUSFJJRlRfQVNTSUdOX09QVChkb2MpOworICBUSFJJRlRfQVNTSUdOKG5hbWUpOworICBUSFJJRlRfQVNTSUdOX0lEKHR5cGUpOworICBUSFJJRlRfQVNTSUdOX0NPTlZFUlQodF9jb25zdF92YWx1ZSwgZ2V0X3ZhbHVlKCksIHZhbHVlKTsKK30KK1RIUklGVF9DT05WRVJTSU9OKHRfZmllbGQpIHsKKyAgVEhSSUZUX0FTU0lHTl9PUFQoZG9jKTsKKyAgVEhSSUZUX0FTU0lHTihuYW1lKTsKKyAgVEhSSUZUX0FTU0lHTihrZXkpOworICBUSFJJRlRfQVNTSUdOX04oZ2V0X3JlcSgpLCByZXEsIChwbHVnaW46OlJlcXVpcmVkbmVzczo6dHlwZSkpOworICBUSFJJRlRfQVNTSUdOKHJlZmVyZW5jZSk7CisgIFRIUklGVF9BU1NJR05fSUQodHlwZSk7CisgIFRIUklGVF9BU1NJR05fQ09OVkVSVCh0X2NvbnN0X3ZhbHVlLCBnZXRfdmFsdWUoKSwgdmFsdWUpOworfQorVEhSSUZUX0NPTlZFUlNJT04odF9zdHJ1Y3QpIHsKKyAgVEhSSUZUX0FTU0lHTl9NRVRBREFUQSgpOworICBUSFJJRlRfQVNTSUdOX0xJU1RfTih0X2ZpZWxkLCBnZXRfbWVtYmVycygpLCBtZW1iZXJzKTsKKyAgVEhSSUZUX0FTU0lHTl9OKGlzX3VuaW9uKCksIGlzX3VuaW9uLCApOworICBUSFJJRlRfQVNTSUdOX04oaXNfeGNlcHRpb24oKSwgaXNfeGNlcHRpb24sICk7Cit9CitUSFJJRlRfQ09OVkVSU0lPTih0X2Z1bmN0aW9uKSB7CisgIFRIUklGVF9BU1NJR05fT1BUKGRvYyk7CisgIFRIUklGVF9BU1NJR04obmFtZSk7CisgIFRIUklGVF9BU1NJR05fSUQocmV0dXJudHlwZSk7CisgIFRIUklGVF9BU1NJR05fTihpc19vbmV3YXkoKSwgaXNfb25ld2F5LCApOworICBUSFJJRlRfQVNTSUdOX0lEKGFyZ2xpc3QpOworICBUSFJJRlRfQVNTSUdOX0lEKHhjZXB0aW9ucyk7Cit9CisKK1RIUklGVF9DT05WRVJTSU9OKHRfbGlzdCkgeworICBUSFJJRlRfQVNTSUdOX01FVEFEQVRBKCk7CisgIFRIUklGVF9BU1NJR05fT1BUKGNwcF9uYW1lKTsKKyAgVEhSSUZUX0FTU0lHTl9JRChlbGVtX3R5cGUpOworfQorVEhSSUZUX0NPTlZFUlNJT04odF9zZXQpIHsKKyAgVEhSSUZUX0FTU0lHTl9NRVRBREFUQSgpOworICBUSFJJRlRfQVNTSUdOX09QVChjcHBfbmFtZSk7CisgIFRIUklGVF9BU1NJR05fSUQoZWxlbV90eXBlKTsKK30KK1RIUklGVF9DT05WRVJTSU9OKHRfbWFwKSB7CisgIFRIUklGVF9BU1NJR05fTUVUQURBVEEoKTsKKyAgVEhSSUZUX0FTU0lHTl9PUFQoY3BwX25hbWUpOworICBUSFJJRlRfQVNTSUdOX0lEKGtleV90eXBlKTsKKyAgVEhSSUZUX0FTU0lHTl9JRCh2YWxfdHlwZSk7Cit9CisKK1RIUklGVF9DT05WRVJTSU9OKHRfc2VydmljZSkgeworICBUSFJJRlRfQVNTSUdOX01FVEFEQVRBKCk7CisgIFRIUklGVF9BU1NJR05fTElTVF9OKHRfZnVuY3Rpb24sIGdldF9mdW5jdGlvbnMoKSwgZnVuY3Rpb25zKTsKKyAgVEhSSUZUX0FTU0lHTl9JRF9OKHRfc2VydmljZSwgZ2V0X2V4dGVuZHMoKSwgZXh0ZW5kc18pOworfQorCitUSFJJRlRfQ09OVkVSU0lPTih0X2Jhc2VfdHlwZSkgeworICBUSFJJRlRfQVNTSUdOX01FVEFEQVRBKCk7CisgIGlmIChmcm9tLT5pc19iaW5hcnkoKSkgeworICAgIHRvLnZhbHVlID0gcGx1Z2luOjp0X2Jhc2U6OlRZUEVfQklOQVJZOworICB9IGVsc2UgeworICAgIHN3aXRjaCAoZnJvbS0+Z2V0X2Jhc2UoKSkgeworI2RlZmluZSBUX0JBU0VUWVBFX0NBU0UobmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFXyMjbmFtZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRvLnZhbHVlID0gcGx1Z2luOjp0X2Jhc2U6OlRZUEVfIyNuYW1lOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGJyZWFrCisgICAgICBUX0JBU0VUWVBFX0NBU0UoVk9JRCk7CisgICAgICBUX0JBU0VUWVBFX0NBU0UoU1RSSU5HKTsKKyAgICAgIFRfQkFTRVRZUEVfQ0FTRShCT09MKTsKKyAgICAgIFRfQkFTRVRZUEVfQ0FTRShJOCk7CisgICAgICBUX0JBU0VUWVBFX0NBU0UoSTE2KTsKKyAgICAgIFRfQkFTRVRZUEVfQ0FTRShJMzIpOworICAgICAgVF9CQVNFVFlQRV9DQVNFKEk2NCk7CisgICAgICBUX0JBU0VUWVBFX0NBU0UoRE9VQkxFKTsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgcGx1Z2luOjpUaHJpZnRQbHVnaW5FcnJvcigiQmFzZSB0eXBlIHVuaW9uIGhhcyBubyB2YWx1ZSIpOworICAgICAgYnJlYWs7CisjdW5kZWYgVF9CQVNFVFlQRV9DQVNFCisgICAgfQorICB9Cit9CitUSFJJRlRfQ09OVkVSU0lPTih0X3R5cGUpIHsKKyNkZWZpbmUgVF9DT05WRVJUX1VOSU9OX04obmFtZSwgdHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZWxzZSBpZiAoZnJvbS0+aXNfIyNuYW1lKCkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0by5fX2lzc2V0Lm5hbWUjI192YWwgPSB0cnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb252ZXJ0KHJlaW50ZXJwcmV0X2Nhc3Q8IDo6dHlwZSo+KGZyb20pLCB0by5uYW1lIyNfdmFsKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorI2RlZmluZSBUX0NPTlZFUlRfVU5JT04obmFtZSkgVF9DT05WRVJUX1VOSU9OX04obmFtZSwgdF8jI25hbWUpCisgIGlmIChmYWxzZSkgeworICB9CisgIFRfQ09OVkVSVF9VTklPTihiYXNlX3R5cGUpCisgIFRfQ09OVkVSVF9VTklPTih0eXBlZGVmKQorICBUX0NPTlZFUlRfVU5JT04oZW51bSkKKyAgVF9DT05WRVJUX1VOSU9OKHN0cnVjdCkKKyAgVF9DT05WRVJUX1VOSU9OX04oeGNlcHRpb24sIHRfc3RydWN0KQorICBUX0NPTlZFUlRfVU5JT04obGlzdCkKKyAgVF9DT05WRVJUX1VOSU9OKHNldCkKKyAgVF9DT05WRVJUX1VOSU9OKG1hcCkKKyAgVF9DT05WRVJUX1VOSU9OKHNlcnZpY2UpCisgIGVsc2UgeworICAgIHRocm93IHBsdWdpbjo6VGhyaWZ0UGx1Z2luRXJyb3IoIlR5cGUgdW5pb24gaGFzIG5vIHZhbHVlIik7CisgIH0KKyN1bmRlZiBUX0NPTlZFUlRfVU5JT05fTgorI3VuZGVmIFRfQ09OVkVSVF9VTklPTgorfQorCitUSFJJRlRfQ09OVkVSU0lPTih0X3Njb3BlKSB7CisjZGVmaW5lIFRfU0NPUEVfQVNTSUdOKG5hbWUsIHR5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGJvb3N0Ojpjb3B5KGZyb20tPm5hbWUjI3NfIHwgYm9vc3Q6OmFkYXB0b3JzOjptYXBfdmFsdWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIHwgYm9vc3Q6OmFkYXB0b3JzOjp0cmFuc2Zvcm1lZCgmc3RvcmVfdHlwZTx0eXBlPiksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIHN0ZDo6YmFja19pbnNlcnRlcih0by5uYW1lIyNzKSkKKyAgVF9TQ09QRV9BU1NJR04odHlwZSwgdF90eXBlKTsKKyAgVF9TQ09QRV9BU1NJR04oY29uc3RhbnQsIHRfY29uc3QpOworICBUX1NDT1BFX0FTU0lHTihzZXJ2aWNlLCB0X3NlcnZpY2UpOworI3VuZGVmIFRfU0NPUEVfQVNTSUdOCit9CisKK3ZvaWQgZ2V0X2dsb2JhbF9jYWNoZShwbHVnaW46OlR5cGVSZWdpc3RyeSYgcmVnKSB7CisgIHJlZy50eXBlcyA9IHR5cGVfY2FjaGUuY2FjaGU7CisgIHJlZy5jb25zdGFudHMgPSBjb25zdF9jYWNoZS5jYWNoZTsKKyAgcmVnLnNlcnZpY2VzID0gc2VydmljZV9jYWNoZS5jYWNoZTsKK30KKwordm9pZCBjbGVhcl9nbG9iYWxfY2FjaGUoKSB7CisgIHR5cGVfY2FjaGUuY2xlYXIoKTsKKyAgY29uc3RfY2FjaGUuY2xlYXIoKTsKKyAgc2VydmljZV9jYWNoZS5jbGVhcigpOworICBwcm9ncmFtX2NhY2hlLmNsZWFyKCkgOworfQorCitUSFJJRlRfQ09OVkVSU0lPTih0X3Byb2dyYW0pIHsKKyAgVEhSSUZUX0FTU0lHTl9DT05WRVJUKHRfc2NvcGUsIHNjb3BlKCksIHNjb3BlKTsKKyAgVEhSSUZUX0FTU0lHTihwYXRoKTsKKyAgVEhSSUZUX0FTU0lHTihvdXRfcGF0aCk7CisgIFRIUklGVF9BU1NJR04obmFtZSk7CisgIFRIUklGVF9BU1NJR04oaW5jbHVkZV9wcmVmaXgpOworICBUSFJJRlRfQVNTSUdOKGNwcF9pbmNsdWRlcyk7CisgIFRIUklGVF9BU1NJR04oY19pbmNsdWRlcyk7CisgIFRIUklGVF9BU1NJR04obmFtZXNwYWNlcyk7CisgIFRIUklGVF9BU1NJR05fTihpc19vdXRfcGF0aF9hYnNvbHV0ZSgpLCBvdXRfcGF0aF9pc19hYnNvbHV0ZSwgKTsKKyAgVEhSSUZUX0FTU0lHTl9OKGdldF9uYW1lc3BhY2UoKSwgbmFtZXNwYWNlXywgKTsKKyAgVEhSSUZUX0FTU0lHTl9MSVNUX0lEKHRfdHlwZSwgdHlwZWRlZik7CisgIFRIUklGVF9BU1NJR05fTElTVF9JRCh0X3R5cGUsIGVudW0pOworICBUSFJJRlRfQVNTSUdOX0xJU1RfSUQodF90eXBlLCBvYmplY3QpOworICBUSFJJRlRfQVNTSUdOX0xJU1RfSUQodF9jb25zdCwgY29uc3QpOworICBUSFJJRlRfQVNTSUdOX0xJU1RfSUQodF9zZXJ2aWNlLCBzZXJ2aWNlKTsKKyAgVEhSSUZUX0FTU0lHTl9MSVNUX04odF9wcm9ncmFtLCBnZXRfaW5jbHVkZXMoKSwgaW5jbHVkZXMpOworICB0by5wcm9ncmFtX2lkID0gcHJvZ3JhbV9jYWNoZS5nZW5zeW0ocmVpbnRlcnByZXRfY2FzdDxwbHVnaW46OnRfcHJvZ3JhbV9pZD4oZnJvbSkpOworfQorCitQbHVnaW5EZWxlZ2F0ZVJlc3VsdCBkZWxlZ2F0ZVRvUGx1Z2luKHRfcHJvZ3JhbSogcHJvZ3JhbSwgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbnMpIHsKKyAgc3RkOjpzdHJpbmcgbGFuZ3VhZ2U7CisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gcGFyc2VkX29wdGlvbnM7CisgIHRfZ2VuZXJhdG9yOjpwYXJzZV9vcHRpb25zKG9wdGlvbnMsIGxhbmd1YWdlLCBwYXJzZWRfb3B0aW9ucyk7CisgIHN0ZDo6c3RyaW5nIGNtZCA9ICJ0aHJpZnQtZ2VuLSI7CisgIGlmIChsYW5ndWFnZS5maW5kX2ZpcnN0X25vdF9vZigiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl8tMDEyMzQ1Njc4OSIpCisgICAgICAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgIHN0ZDo6Y2VyciA8PCAiSW52YWxpZCBsYW5ndWFnZSBuYW1lIiA8PCBzdGQ6OmVuZGw7CisgICAgcmV0dXJuIFBMVUdJTl9GQUlMVVJFOworICB9CisgIGNtZC5hcHBlbmQobGFuZ3VhZ2UpOworICBGSUxFKiBmZCA9IFRIUklGVF9QT1BFTihjbWQuY19zdHIoKSk7CisgIGlmIChmZCkgeworI2lmZGVmIF9XSU4zMgorICAgIF9zZXRtb2RlKGZpbGVubyhmZCksIF9PX0JJTkFSWSk7CisjZW5kaWYKKyAgICBzaGFyZWRfcHRyPFRGcmFtZWRUcmFuc3BvcnQ+IHRyYW5zcG9ydCgKKyAgICAgICAgbmV3IFRGcmFtZWRUcmFuc3BvcnQobWFrZV9zaGFyZWQ8VEZEVHJhbnNwb3J0PihmaWxlbm8oZmQpKSkpOworICAgIFRCaW5hcnlQcm90b2NvbCBwcm90byh0cmFuc3BvcnQpOworCisgICAgcGx1Z2luOjpHZW5lcmF0b3JJbnB1dCBpbnB1dDsKKyAgICBpbnB1dC5fX3NldF9wYXJzZWRfb3B0aW9ucyhwYXJzZWRfb3B0aW9ucyk7CisgICAgY2xlYXJfZ2xvYmFsX2NhY2hlKCk7CisgICAgY29udmVydChwcm9ncmFtLCBpbnB1dC5wcm9ncmFtKTsKKyAgICBnZXRfZ2xvYmFsX2NhY2hlKGlucHV0LnR5cGVfcmVnaXN0cnkpOworICAgIHRyeSB7CisgICAgICBpbnB1dC53cml0ZSgmcHJvdG8pOworICAgICAgdHJhbnNwb3J0LT5mbHVzaCgpOworICAgIH0gY2F0Y2ggKHN0ZDo6ZXhjZXB0aW9uJiBlcnIpIHsKKyAgICAgIHN0ZDo6Y2VyciA8PCAiRXJyb3Igd2hpbGUgc2VuZGluZyBkYXRhIHRvIHBsdWdpbjogIiA8PCBlcnIud2hhdCgpIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIFRIUklGVF9QQ0xPU0UoZmQpOworICAgICAgcmV0dXJuIFBMVUdJTl9GQUlMVVJFOworICAgIH0KKworICAgIC8vIFRPRE86IGJlIHByZXBhcmVkIGZvciBoYW5nIG9yIGNyYXNoIG9mIGNoaWxkIHByb2Nlc3MKKyAgICBpbnQgcmV0ID0gVEhSSUZUX1BDTE9TRShmZCk7CisgICAgaWYgKCFyZXQpIHsKKyAgICAgIHJldHVybiBQTFVHSU5fU1VDQ0VFU1M7CisgICAgfSBlbHNlIHsKKyAgICAgIHN0ZDo6Y2VyciA8PCAicGx1Z2luIHByb2Nlc3MgcmV0dXJuZWQgbm9uIHplcm8gZXhpdCBjb2RlOiAiIDw8IHJldCA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gUExVR0lOX0ZBSUxVUkU7CisgICAgfQorICB9CisgIGNsZWFyX2dsb2JhbF9jYWNoZSgpOworICByZXR1cm4gUExVR0lOX05PVF9GT1VORDsKK30KK30KKwpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGx1Z2luL3BsdWdpbl9vdXRwdXQuaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW5fb3V0cHV0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFiMmQxYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW5fb3V0cHV0LmgKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRfUExVR0lOX1BMVUdJTl9PVVRQVVRfSAorI2RlZmluZSBUX1BMVUdJTl9QTFVHSU5fT1VUUFVUX0gKKworI2luY2x1ZGUgPHN0cmluZz4KKworY2xhc3MgdF9wcm9ncmFtOworCituYW1lc3BhY2UgcGx1Z2luX291dHB1dCB7CisKK2VudW0gUGx1Z2luRGVsZWdhdGVSZXN1bHQgeworICBQTFVHSU5fTk9UX0ZPVU5ELAorICBQTFVHSU5fRkFJTFVSRSwKKyAgUExVR0lOX1NVQ0NFRVNTLAorfTsKKworUGx1Z2luRGVsZWdhdGVSZXN1bHQgZGVsZWdhdGVUb1BsdWdpbih0X3Byb2dyYW0qIHByb2dyYW0sIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25zKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wbHVnaW4vdHlwZV91dGlsLmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wbHVnaW4vdHlwZV91dGlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk2YjVjNgotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BsdWdpbi90eXBlX3V0aWwuaApAQCAtMCwwICsxLDk1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVF9QTFVHSU5fVFlQRV9VVElMX0gKKyNkZWZpbmUgVF9QTFVHSU5fVFlQRV9VVElMX0gKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBwbHVnaW4geworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRnJvbT4KK3N0cnVjdCBUb1R5cGUge307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBGcm9tPgordHlwZW5hbWUgVG9UeXBlPEZyb20+Ojp0eXBlKiBjb252ZXJ0X2ZvcndhcmQoY29uc3QgRnJvbSYpOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRnJvbSwgdHlwZW5hbWUgVG8+Cit2b2lkIGNvbnZlcnQoY29uc3QgRnJvbSYsIFRvKik7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBGcm9tPgordHlwZW5hbWUgVG9UeXBlPEZyb20+Ojp0eXBlKiBjb252ZXJ0KGNvbnN0IEZyb20mIGZyb20pOworCitjbGFzcyBUeXBlUmVnaXN0cnk7Cit2b2lkIHNldF9nbG9iYWxfY2FjaGUoY29uc3QgVHlwZVJlZ2lzdHJ5Jik7Cit2b2lkIGNsZWFyX2dsb2JhbF9jYWNoZSgpOworfQorfQorfQorCisvLyBjb252ZXJzaW9uIGZyb20gcmF3IGNvbXBpbGVyIHR5cGVzIHRvIHBsdWdpbiB3aXJlIHR5cGUKK25hbWVzcGFjZSBwbHVnaW5fb3V0cHV0IHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEZyb20sIHR5cGVuYW1lIFRvPgordm9pZCBjb252ZXJ0KEZyb20qIGZyb20sIFRvJiB0byk7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBGcm9tPgordHlwZW5hbWUgYXBhY2hlOjp0aHJpZnQ6OnBsdWdpbjo6VG9UeXBlPEZyb20+Ojp0eXBlIGNvbnZlcnQoRnJvbSogZnJvbSk7CisKK3ZvaWQgZ2V0X2dsb2JhbF9jYWNoZShhcGFjaGU6OnRocmlmdDo6cGx1Z2luOjpUeXBlUmVnaXN0cnkmKTsKK3ZvaWQgY2xlYXJfZ2xvYmFsX2NhY2hlKCk7Cit9CisKKyNkZWZpbmUgVEhSSUZUX1RZUEVfTUFQUElORyhUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY2xhc3MgVFlQRTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgbmFtZXNwYWNlIGFwYWNoZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgbmFtZXNwYWNlIHRocmlmdCB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgbmFtZXNwYWNlIHBsdWdpbiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY2xhc3MgVFlQRTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGUgPD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc3RydWN0IFRvVHlwZTwgOjpUWVBFPiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0eXBlZGVmIFRZUEUgdHlwZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGUgPD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc3RydWN0IFRvVHlwZTxUWVBFPiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0eXBlZGVmIDo6VFlQRSB0eXBlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorVEhSSUZUX1RZUEVfTUFQUElORyh0X2Jhc2VfdHlwZSkKK1RIUklGVF9UWVBFX01BUFBJTkcodF9jb25zdCkKK1RIUklGVF9UWVBFX01BUFBJTkcodF9jb25zdF92YWx1ZSkKK1RIUklGVF9UWVBFX01BUFBJTkcodF9jb250YWluZXIpCitUSFJJRlRfVFlQRV9NQVBQSU5HKHRfZG9jKQorVEhSSUZUX1RZUEVfTUFQUElORyh0X2VudW0pCitUSFJJRlRfVFlQRV9NQVBQSU5HKHRfZW51bV92YWx1ZSkKK1RIUklGVF9UWVBFX01BUFBJTkcodF9maWVsZCkKK1RIUklGVF9UWVBFX01BUFBJTkcodF9mdW5jdGlvbikKK1RIUklGVF9UWVBFX01BUFBJTkcodF9saXN0KQorVEhSSUZUX1RZUEVfTUFQUElORyh0X21hcCkKK1RIUklGVF9UWVBFX01BUFBJTkcodF9wcm9ncmFtKQorVEhSSUZUX1RZUEVfTUFQUElORyh0X3Njb3BlKQorVEhSSUZUX1RZUEVfTUFQUElORyh0X3NlcnZpY2UpCitUSFJJRlRfVFlQRV9NQVBQSU5HKHRfc2V0KQorVEhSSUZUX1RZUEVfTUFQUElORyh0X3N0cnVjdCkKK1RIUklGVF9UWVBFX01BUFBJTkcodF90eXBlKQorVEhSSUZUX1RZUEVfTUFQUElORyh0X3R5cGVkZWYpCisjdW5kZWYgVEhSSUZUX1RZUEVfTUFQUElORworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC90aHJpZnRsLmxsIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvdGhyaWZ0bC5sbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Zjc4M2JlCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvdGhyaWZ0bC5sbApAQCAtMCwwICsxLDM2MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyAqIFRocmlmdCBzY2FubmVyLgorICoKKyAqIFRva2VuaXplcyBhIHRocmlmdCBkZWZpbml0aW9uIGZpbGUuCisgKi8KKworJXsKKworLyogVGhpcyBpcyByZWR1bmRhbnQgd2l0aCBzb21lIG9mIHRoZSBmbGFncyBpbiBNYWtlZmlsZS5hbSwgYnV0IGl0IHdvcmtzCisgKiB3aGVuIHBlb3BsZSBvdmVycmlkZSBDWFhGTEFHUyB3aXRob3V0IGJlaW5nIGNhcmVmdWwuIFRoZSBwcmFnbWFzIGFyZQorICogdGhlICdyaWdodCcgd2F5IHRvIGRvIGl0LCBidXQgZG9uJ3Qgd29yayBvbiBvbGQtZW5vdWdoIEdDQyAoaW4gcGFydGljdWxhcgorICogdGhlIEdDQyB0aGF0IHNoaXAgb24gTWFjIE9TIFggMTAuNi41LCAqY291bnRlciogdG8gd2hhdCB0aGUgR05VIGRvY3Mgc2F5KQorICoKKyAqIFdlIHNob3VsZCByZXZlcnQgdGhlIE1ha2VmaWxlLmFtIGNoYW5nZXMgb25jZSBBcHBsZSBzaGlwcyBhIHJlYXNvbmFibGUKKyAqIEdDQy4KKyAqLworI2lmZGVmIF9fR05VQ19fCisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XdW51c2VkLWZ1bmN0aW9uIgorI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBpZ25vcmVkICItV3VudXNlZC1sYWJlbCIKKyNlbmRpZgorCisjaWZkZWYgX01TQ19WRVIKKyNwcmFnbWEgd2FybmluZyggcHVzaCApCisKKy8vIHdhcm5pbmcgQzQxMDI6ICdmaW5kX3J1bGUnIDogdW5yZWZlcmVuY2VkIGxhYmVsCisjcHJhZ21hIHdhcm5pbmcoIGRpc2FibGUgOiA0MTAyICkKKworLy8gd2FybmluZyBDNDI2NzogJ2FyZ3VtZW50JyA6IGNvbnZlcnNpb24gZnJvbSAnc2l6ZV90JyB0byAnaW50JywgcG9zc2libGUgbG9zcyBvZiBkYXRhCisjcHJhZ21hIHdhcm5pbmcoIGRpc2FibGUgOiA0MjY3ICkKKworLy8gYXZvaWQgaXNhdHR5IHJlZGVmaW5pdGlvbgorI2RlZmluZSBZWV9ORVZFUl9JTlRFUkFDVElWRSAxCisKKyNkZWZpbmUgWVlfTk9fVU5JU1REX0ggMQorI2VuZGlmCisKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaWZkZWYgX01TQ19WRVIKKyNpbmNsdWRlICJ0aHJpZnQvd2luZG93cy9jb25maWcuaCIKKyNlbmRpZgorI2luY2x1ZGUgInRocmlmdC9tYWluLmgiCisjaW5jbHVkZSAidGhyaWZ0L2NvbW1vbi5oIgorI2luY2x1ZGUgInRocmlmdC9nbG9iYWxzLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfcHJvZ3JhbS5oIgorCisvKioKKyAqIE11c3QgYmUgaW5jbHVkZWQgQUZURVIgcGFyc2UvdF9wcm9ncmFtLmgsIGJ1dCBJIGNhbid0IHJlbWVtYmVyIHdoeSBhbnltb3JlCisgKiBiZWNhdXNlIEkgd3JvdGUgdGhpcyBhIHdoaWxlIGFnby4KKyAqLworI2lmIGRlZmluZWQoQklTT05fVVNFX1BBUlNFUl9IX0VYVEVOU0lPTikKKyNpbmNsdWRlICJ0aHJpZnQvdGhyaWZ0eS5oIgorI2Vsc2UKKyNpbmNsdWRlICJ0aHJpZnQvdGhyaWZ0eS5oaCIKKyNlbmRpZgorCit2b2lkIGludGVnZXJfb3ZlcmZsb3coY2hhciogdGV4dCkgeworICB5eWVycm9yKCJUaGlzIGludGVnZXIgaXMgdG9vIGJpZzogXCIlc1wiXG4iLCB0ZXh0KTsKKyAgZXhpdCgxKTsKK30KKwordm9pZCB1bmV4cGVjdGVkX3Rva2VuKGNoYXIqIHRleHQpIHsKKyAgeXllcnJvcigiVW5leHBlY3RlZCB0b2tlbiBpbiBpbnB1dDogXCIlc1wiXG4iLCB0ZXh0KTsKKyAgZXhpdCgxKTsKK30KKworJX0KKworLyoqCisgKiBQcm92aWRlcyB0aGUgeXlsaW5lbm8gZ2xvYmFsLCB1c2VmdWwgZm9yIGRlYnVnZ2luZyBvdXRwdXQKKyAqLworJW9wdGlvbiBsZXgtY29tcGF0CisKKy8qKgorICogT3VyIGlucHV0cyBhcmUgYWxsIHNpbmdsZSBmaWxlcywgc28gbm8gbmVlZCBmb3IgeXl3cmFwCisgKi8KKyVvcHRpb24gbm95eXdyYXAKKworLyoqCisgKiBXZSBkb24ndCB1c2UgaXQsIGFuZCBpdCBmaXJlcyB1cCB3YXJuaW5ncyBhdCAtV2FsbAorICovCislb3B0aW9uIG5vdW5wdXQKKworLyoqCisgKiBIZWxwZXIgZGVmaW5pdGlvbnMsIGNvbW1lbnRzLCBjb25zdGFudHMsIGFuZCB3aGF0bm90CisgKi8KKworaW50Y29uc3RhbnQgICAoWystXT9bMC05XSspCitoZXhjb25zdGFudCAgIChbKy1dPyIweCJbMC05QS1GYS1mXSspCitkdWJjb25zdGFudCAgIChbKy1dP1swLTldKihcLlswLTldKyk/KFtlRV1bKy1dP1swLTldKyk/KQoraWRlbnRpZmllciAgICAoW2EtekEtWl9dKFwuW2EtekEtWl8wLTldfFthLXpBLVpfMC05XSkqKQord2hpdGVzcGFjZSAgICAoWyBcdFxyXG5dKikKK3NpbGx5Y29tbSAgICAgKCIvKiIiKiIqIiovIikKK211bHRpY21fYmVnaW4gKCIvKiIpCitkb2N0ZXh0X2JlZ2luICgiLyoqIikKK2NvbW1lbnQgICAgICAgKCIvLyJbXlxuXSopCit1bml4Y29tbWVudCAgICgiIyJbXlxuXSopCitzeW1ib2wgICAgICAgIChbOjtcLFx7XH1cKFwpXD08PlxbXF1dKQorbGl0ZXJhbF9iZWdpbiAoWydcIl0pCisKKyUlCisKK3t3aGl0ZXNwYWNlfSAgICAgICAgIHsgLyogZG8gbm90aGluZyAqLyAgICAgICAgICAgICAgICAgfQore3NpbGx5Y29tbX0gICAgICAgICAgeyAvKiBkbyBub3RoaW5nICovICAgICAgICAgICAgICAgICB9CisKK3tkb2N0ZXh0X2JlZ2lufSB7CisgIHN0ZDo6c3RyaW5nIHBhcnNlZCgiLyoqIik7CisgIGludCBzdGF0ZSA9IDA7ICAvLyAwID0gbm9ybWFsLCAxID0gIioiIHNlZW4sICIqLyIgc2VlbgorICB3aGlsZShzdGF0ZSA8IDIpCisgIHsKKyAgICBpbnQgY2ggPSB5eWlucHV0KCk7CisgICAgcGFyc2VkLnB1c2hfYmFjayhjaCk7CisgICAgc3dpdGNoIChjaCkgeworICAgICAgY2FzZSBFT0Y6CisgICAgICAgIHl5ZXJyb3IoIlVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUgaW4gZG9jLWNvbW1lbnQgYXQgJWRcbiIsIHl5bGluZW5vKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICAgIGNhc2UgJyonOgorICAgICAgICBzdGF0ZSA9IDE7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnLyc6CisgICAgICAgIHN0YXRlID0gKHN0YXRlID09IDEpID8gMiA6IDA7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgc3RhdGUgPSAwOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcGRlYnVnKCJkb2N0ZXh0ID0gXCIlc1wiXG4iLHBhcnNlZC5jX3N0cigpKTsKKworIC8qIFRoaXMgZG9lcyBub3Qgc2hvdyB1cCBpbiB0aGUgcGFyc2UgdHJlZS4gKi8KKyAvKiBSYXRoZXIsIHRoZSBwYXJzZXIgd2lsbCBncmFiIGl0IG91dCBvZiB0aGUgZ2xvYmFsLiAqLworICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKKyAgICBjbGVhcl9kb2N0ZXh0KCk7CisgICAgZ19kb2N0ZXh0ID0gc3RyZHVwKHBhcnNlZC5jX3N0cigpICsgMyk7CisgICAgYXNzZXJ0KHN0cmxlbihnX2RvY3RleHQpID49IDIpOworICAgIGdfZG9jdGV4dFtzdHJsZW4oZ19kb2N0ZXh0KSAtIDJdID0gJyAnOworICAgIGdfZG9jdGV4dFtzdHJsZW4oZ19kb2N0ZXh0KSAtIDFdID0gJ1wwJzsKKyAgICBnX2RvY3RleHQgPSBjbGVhbl91cF9kb2N0ZXh0KGdfZG9jdGV4dCk7CisgICAgZ19kb2N0ZXh0X2xpbmVubyA9IHl5bGluZW5vOworICAgIGlmKCAoZ19wcm9ncmFtX2RvY3RleHRfY2FuZGlkYXRlID09IE5VTEwpICYmIChnX3Byb2dyYW1fZG9jdGV4dF9zdGF0dXMgPT0gSU5WQUxJRCkpeworICAgICAgZ19wcm9ncmFtX2RvY3RleHRfY2FuZGlkYXRlID0gc3RyZHVwKGdfZG9jdGV4dCk7CisgICAgICBnX3Byb2dyYW1fZG9jdGV4dF9saW5lbm8gPSBnX2RvY3RleHRfbGluZW5vOworICAgICAgZ19wcm9ncmFtX2RvY3RleHRfc3RhdHVzID0gU1RJTExfQ0FORElEQVRFOworICAgICAgcGRlYnVnKCIlcyIsInByb2dyYW0gZG9jdGV4dCBzZXQgdG8gU1RJTExfQ0FORElEQVRFIik7CisgICAgfQorICB9Cit9CisKK3ttdWx0aWNtX2JlZ2lufSAgeyAvKiBwYXJzZWQsIGJ1dCB0aHJvd24gYXdheSAqLworICBzdGQ6OnN0cmluZyBwYXJzZWQoIi8qIik7CisgIGludCBzdGF0ZSA9IDA7ICAvLyAwID0gbm9ybWFsLCAxID0gIioiIHNlZW4sICIqLyIgc2VlbgorICB3aGlsZShzdGF0ZSA8IDIpCisgIHsKKyAgICBpbnQgY2ggPSB5eWlucHV0KCk7CisgICAgcGFyc2VkLnB1c2hfYmFjayhjaCk7CisgICAgc3dpdGNoIChjaCkgeworICAgICAgY2FzZSBFT0Y6CisgICAgICAgIHl5ZXJyb3IoIlVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUgaW4gbXVsdGlsaW5lIGNvbW1lbnQgYXQgJWRcbiIsIHl5bGluZW5vKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICAgIGNhc2UgJyonOgorICAgICAgICBzdGF0ZSA9IDE7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnLyc6CisgICAgICAgIHN0YXRlID0gKHN0YXRlID09IDEpID8gMiA6IDA7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgc3RhdGUgPSAwOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcGRlYnVnKCJtdWx0aV9jb21tID0gXCIlc1wiXG4iLHBhcnNlZC5jX3N0cigpKTsKK30KKwore2NvbW1lbnR9ICAgICAgICAgICAgeyAvKiBkbyBub3RoaW5nICovICAgICAgICAgICAgICAgICB9Cit7dW5peGNvbW1lbnR9ICAgICAgICB7IC8qIGRvIG5vdGhpbmcgKi8gICAgICAgICAgICAgICAgIH0KKwore3N5bWJvbH0gICAgICAgICAgICAgeyByZXR1cm4geXl0ZXh0WzBdOyAgICAgICAgICAgICAgICB9CisiKiIgICAgICAgICAgICAgICAgICB7IHJldHVybiB5eXRleHRbMF07ICAgICAgICAgICAgICAgIH0KKworImZhbHNlIiAgICAgICAgICAgICAgeyB5eWx2YWwuaWNvbnN0PTA7IHJldHVybiB0b2tfaW50X2NvbnN0YW50OyB9CisidHJ1ZSIgICAgICAgICAgICAgICB7IHl5bHZhbC5pY29uc3Q9MTsgcmV0dXJuIHRva19pbnRfY29uc3RhbnQ7IH0KKworIm5hbWVzcGFjZSIgICAgICAgICAgeyByZXR1cm4gdG9rX25hbWVzcGFjZTsgICAgICAgICAgICB9CisiY3BwX25hbWVzcGFjZSIgICAgICB7IGVycm9yX3Vuc3VwcG9ydGVkX25hbWVzcGFjZV9kZWNsKCJjcHAiKTsgLyogZG8gbm90aGluZyAqLyB9CisiY3BwX2luY2x1ZGUiICAgICAgICB7IHJldHVybiB0b2tfY3BwX2luY2x1ZGU7ICAgICAgICAgIH0KKyJjcHBfdHlwZSIgICAgICAgICAgIHsgcmV0dXJuIHRva19jcHBfdHlwZTsgICAgICAgICAgICAgfQorImphdmFfcGFja2FnZSIgICAgICAgeyBlcnJvcl91bnN1cHBvcnRlZF9uYW1lc3BhY2VfZGVjbCgiamF2YV9wYWNrYWdlIiwgImphdmEiKTsgLyogZG8gbm90aGluZyAqLyB9CisiY29jb2FfcHJlZml4IiAgICAgICB7IGVycm9yX3Vuc3VwcG9ydGVkX25hbWVzcGFjZV9kZWNsKCJjb2NvYV9wcmVmaXgiLCAiY29jb2EiKTsgLyogZG8gbm90aGluZyAqLyB9CisiY3NoYXJwX25hbWVzcGFjZSIgICB7IGVycm9yX3Vuc3VwcG9ydGVkX25hbWVzcGFjZV9kZWNsKCJjc2hhcnAiKTsgLyogZG8gbm90aGluZyAqLyB9CisiZGVscGhpX25hbWVzcGFjZSIgICB7IGVycm9yX3Vuc3VwcG9ydGVkX25hbWVzcGFjZV9kZWNsKCJkZWxwaGkiKTsgLyogZG8gbm90aGluZyAqLyB9CisicGhwX25hbWVzcGFjZSIgICAgICB7IGVycm9yX3Vuc3VwcG9ydGVkX25hbWVzcGFjZV9kZWNsKCJwaHAiKTsgLyogZG8gbm90aGluZyAqLyB9CisicHlfbW9kdWxlIiAgICAgICAgICB7IGVycm9yX3Vuc3VwcG9ydGVkX25hbWVzcGFjZV9kZWNsKCJweV9tb2R1bGUiLCAicHkiKTsgLyogZG8gbm90aGluZyAqLyB9CisicGVybF9wYWNrYWdlIiAgICAgICB7IGVycm9yX3Vuc3VwcG9ydGVkX25hbWVzcGFjZV9kZWNsKCJwZXJsX3BhY2thZ2UiLCAicGVybCIpOyAvKiBkbyBub3RoaW5nICovIH0KKyJydWJ5X25hbWVzcGFjZSIgICAgIHsgZXJyb3JfdW5zdXBwb3J0ZWRfbmFtZXNwYWNlX2RlY2woInJ1YnkiKTsgLyogZG8gbm90aGluZyAqLyB9Cisic21hbGx0YWxrX2NhdGVnb3J5IiB7IGVycm9yX3Vuc3VwcG9ydGVkX25hbWVzcGFjZV9kZWNsKCJzbWFsbHRhbGtfY2F0ZWdvcnkiLCAic21hbGx0YWxrLmNhdGVnb3J5Iik7IC8qIGRvIG5vdGhpbmcgKi8gfQorInNtYWxsdGFsa19wcmVmaXgiICAgeyBlcnJvcl91bnN1cHBvcnRlZF9uYW1lc3BhY2VfZGVjbCgic21hbGx0YWxrX2NhdGVnb3J5IiwgInNtYWxsdGFsay5jYXRlZ29yeSIpOyAvKiBkbyBub3RoaW5nICovIH0KKyJ4c2RfYWxsIiAgICAgICAgICAgIHsgcmV0dXJuIHRva194c2RfYWxsOyAgICAgICAgICAgICAgfQorInhzZF9vcHRpb25hbCIgICAgICAgeyByZXR1cm4gdG9rX3hzZF9vcHRpb25hbDsgICAgICAgICB9CisieHNkX25pbGxhYmxlIiAgICAgICB7IHJldHVybiB0b2tfeHNkX25pbGxhYmxlOyAgICAgICAgIH0KKyJ4c2RfbmFtZXNwYWNlIiAgICAgIHsgZXJyb3JfdW5zdXBwb3J0ZWRfbmFtZXNwYWNlX2RlY2woInhzZCIpOyAvKiBkbyBub3RoaW5nICovIH0KKyJ4c2RfYXR0cnMiICAgICAgICAgIHsgcmV0dXJuIHRva194c2RfYXR0cnM7ICAgICAgICAgICAgfQorImluY2x1ZGUiICAgICAgICAgICAgeyByZXR1cm4gdG9rX2luY2x1ZGU7ICAgICAgICAgICAgICB9Cisidm9pZCIgICAgICAgICAgICAgICB7IHJldHVybiB0b2tfdm9pZDsgICAgICAgICAgICAgICAgIH0KKyJib29sIiAgICAgICAgICAgICAgIHsgcmV0dXJuIHRva19ib29sOyAgICAgICAgICAgICAgICAgfQorImJ5dGUiICAgICAgICAgICAgICAgeworICBlbWl0X2J5dGVfdHlwZV93YXJuaW5nKCk7CisgIHJldHVybiB0b2tfaTg7Cit9CisiaTgiICAgICAgICAgICAgICAgICB7IHJldHVybiB0b2tfaTg7ICAgICAgICAgICAgICAgICAgIH0KKyJpMTYiICAgICAgICAgICAgICAgIHsgcmV0dXJuIHRva19pMTY7ICAgICAgICAgICAgICAgICAgfQorImkzMiIgICAgICAgICAgICAgICAgeyByZXR1cm4gdG9rX2kzMjsgICAgICAgICAgICAgICAgICB9CisiaTY0IiAgICAgICAgICAgICAgICB7IHJldHVybiB0b2tfaTY0OyAgICAgICAgICAgICAgICAgIH0KKyJkb3VibGUiICAgICAgICAgICAgIHsgcmV0dXJuIHRva19kb3VibGU7ICAgICAgICAgICAgICAgfQorInN0cmluZyIgICAgICAgICAgICAgeyByZXR1cm4gdG9rX3N0cmluZzsgICAgICAgICAgICAgICB9CisiYmluYXJ5IiAgICAgICAgICAgICB7IHJldHVybiB0b2tfYmluYXJ5OyAgICAgICAgICAgICAgIH0KKyJzbGlzdCIgeworICBwd2FybmluZygwLCAiXCJzbGlzdFwiIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSBjb21waWxlciB2ZXJzaW9uLiAgVGhpcyB0eXBlIHNob3VsZCBiZSByZXBsYWNlZCB3aXRoIFwic3RyaW5nXCIuXG4iKTsKKyAgcmV0dXJuIHRva19zbGlzdDsKK30KKyJzZW51bSIgeworICBwd2FybmluZygwLCAiXCJzZW51bVwiIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSBjb21waWxlciB2ZXJzaW9uLiAgVGhpcyB0eXBlIHNob3VsZCBiZSByZXBsYWNlZCB3aXRoIFwic3RyaW5nXCIuXG4iKTsKKyAgcmV0dXJuIHRva19zZW51bTsKK30KKyJtYXAiICAgICAgICAgICAgICAgIHsgcmV0dXJuIHRva19tYXA7ICAgICAgICAgICAgICAgICAgfQorImxpc3QiICAgICAgICAgICAgICAgeyByZXR1cm4gdG9rX2xpc3Q7ICAgICAgICAgICAgICAgICB9Cisic2V0IiAgICAgICAgICAgICAgICB7IHJldHVybiB0b2tfc2V0OyAgICAgICAgICAgICAgICAgIH0KKyJvbmV3YXkiICAgICAgICAgICAgIHsgcmV0dXJuIHRva19vbmV3YXk7ICAgICAgICAgICAgICAgfQorInR5cGVkZWYiICAgICAgICAgICAgeyByZXR1cm4gdG9rX3R5cGVkZWY7ICAgICAgICAgICAgICB9Cisic3RydWN0IiAgICAgICAgICAgICB7IHJldHVybiB0b2tfc3RydWN0OyAgICAgICAgICAgICAgIH0KKyJ1bmlvbiIgICAgICAgICAgICAgIHsgcmV0dXJuIHRva191bmlvbjsgICAgICAgICAgICAgICAgfQorImV4Y2VwdGlvbiIgICAgICAgICAgeyByZXR1cm4gdG9rX3hjZXB0aW9uOyAgICAgICAgICAgICB9CisiZXh0ZW5kcyIgICAgICAgICAgICB7IHJldHVybiB0b2tfZXh0ZW5kczsgICAgICAgICAgICAgIH0KKyJ0aHJvd3MiICAgICAgICAgICAgIHsgcmV0dXJuIHRva190aHJvd3M7ICAgICAgICAgICAgICAgfQorInNlcnZpY2UiICAgICAgICAgICAgeyByZXR1cm4gdG9rX3NlcnZpY2U7ICAgICAgICAgICAgICB9CisiZW51bSIgICAgICAgICAgICAgICB7IHJldHVybiB0b2tfZW51bTsgICAgICAgICAgICAgICAgIH0KKyJjb25zdCIgICAgICAgICAgICAgIHsgcmV0dXJuIHRva19jb25zdDsgICAgICAgICAgICAgICAgfQorInJlcXVpcmVkIiAgICAgICAgICAgeyByZXR1cm4gdG9rX3JlcXVpcmVkOyAgICAgICAgICAgICB9Cisib3B0aW9uYWwiICAgICAgICAgICB7IHJldHVybiB0b2tfb3B0aW9uYWw7ICAgICAgICAgICAgIH0KKyJhc3luYyIgeworICBwd2FybmluZygwLCAiXCJhc3luY1wiIGlzIGRlcHJlY2F0ZWQuICBJdCBpcyBjYWxsZWQgXCJvbmV3YXlcIiBub3cuXG4iKTsKKyAgcmV0dXJuIHRva19vbmV3YXk7Cit9CisiJiIgICAgICAgICAgICAgICAgICB7IHJldHVybiB0b2tfcmVmZXJlbmNlOyAgICAgICAgICAgIH0KKwore2ludGNvbnN0YW50fSB7CisgIGVycm5vID0gMDsKKyAgeXlsdmFsLmljb25zdCA9IHN0cnRvbGwoeXl0ZXh0LCBOVUxMLCAxMCk7CisgIGlmIChlcnJubyA9PSBFUkFOR0UpIHsKKyAgICBpbnRlZ2VyX292ZXJmbG93KHl5dGV4dCk7CisgIH0KKyAgcmV0dXJuIHRva19pbnRfY29uc3RhbnQ7Cit9CisKK3toZXhjb25zdGFudH0geworICBlcnJubyA9IDA7CisgIGNoYXIgc2lnbiA9IHl5dGV4dFswXTsKKyAgaW50IHNoaWZ0ID0gc2lnbiA9PSAnMCcgPyAyIDogMzsKKyAgeXlsdmFsLmljb25zdCA9IHN0cnRvbGwoeXl0ZXh0K3NoaWZ0LCBOVUxMLCAxNik7CisgIGlmIChzaWduID09ICctJykgeworICAgIHl5bHZhbC5pY29uc3QgPSAteXlsdmFsLmljb25zdDsKKyAgfQorICBpZiAoZXJybm8gPT0gRVJBTkdFKSB7CisgICAgaW50ZWdlcl9vdmVyZmxvdyh5eXRleHQpOworICB9CisgIHJldHVybiB0b2tfaW50X2NvbnN0YW50OworfQorCit7aWRlbnRpZmllcn0geworICB5eWx2YWwuaWQgPSBzdHJkdXAoeXl0ZXh0KTsKKyAgcmV0dXJuIHRva19pZGVudGlmaWVyOworfQorCit7ZHViY29uc3RhbnR9IHsKKyAvKiBEZWxpYmVyYXRlbHkgcGxhY2VkIGFmdGVyIGlkZW50aWZpZXIsIHNpbmNlICJlMTAiIGlzIE5PVCBhIGRvdWJsZSBsaXRlcmFsIChUSFJJRlQtMzQ3NykgKi8KKyAgeXlsdmFsLmRjb25zdCA9IGF0b2YoeXl0ZXh0KTsKKyAgcmV0dXJuIHRva19kdWJfY29uc3RhbnQ7Cit9CisKK3tsaXRlcmFsX2JlZ2lufSB7CisgIGNoYXIgbWFyayA9IHl5dGV4dFswXTsKKyAgc3RkOjpzdHJpbmcgcmVzdWx0OworICBmb3IoOzspCisgIHsKKyAgICBpbnQgY2ggPSB5eWlucHV0KCk7CisgICAgc3dpdGNoIChjaCkgeworICAgICAgY2FzZSBFT0Y6CisgICAgICAgIHl5ZXJyb3IoIkVuZCBvZiBmaWxlIHdoaWxlIHJlYWQgc3RyaW5nIGF0ICVkXG4iLCB5eWxpbmVubyk7CisgICAgICAgIGV4aXQoMSk7CisgICAgICBjYXNlICdcbic6CisgICAgICAgIHl5ZXJyb3IoIkVuZCBvZiBsaW5lIHdoaWxlIHJlYWQgc3RyaW5nIGF0ICVkXG4iLCB5eWxpbmVubyAtIDEpOworICAgICAgICBleGl0KDEpOworICAgICAgY2FzZSAnXFwnOgorICAgICAgICBjaCA9IHl5aW5wdXQoKTsKKyAgICAgICAgc3dpdGNoIChjaCkgeworICAgICAgICAgIGNhc2UgJ3InOgorICAgICAgICAgICAgcmVzdWx0LnB1c2hfYmFjaygnXHInKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIGNhc2UgJ24nOgorICAgICAgICAgICAgcmVzdWx0LnB1c2hfYmFjaygnXG4nKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIGNhc2UgJ3QnOgorICAgICAgICAgICAgcmVzdWx0LnB1c2hfYmFjaygnXHQnKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIGNhc2UgJyInOgorICAgICAgICAgICAgcmVzdWx0LnB1c2hfYmFjaygnIicpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgY2FzZSAnXCcnOgorICAgICAgICAgICAgcmVzdWx0LnB1c2hfYmFjaygnXCcnKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIGNhc2UgJ1xcJzoKKyAgICAgICAgICAgIHJlc3VsdC5wdXNoX2JhY2soJ1xcJyk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeXllcnJvcigiQmFkIGVzY2FwZSBjaGFyYWN0ZXJcbiIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgaWYgKGNoID09IG1hcmspIHsKKyAgICAgICAgICB5eWx2YWwuaWQgPSBzdHJkdXAocmVzdWx0LmNfc3RyKCkpOworICAgICAgICAgIHJldHVybiB0b2tfbGl0ZXJhbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByZXN1bHQucHVzaF9iYWNrKGNoKTsKKyAgICAgICAgfQorICAgIH0KKyAgfQorfQorCisKKy4geworICB1bmV4cGVjdGVkX3Rva2VuKHl5dGV4dCk7Cit9CisKKyUlCisKKyNpZmRlZiBfTVNDX1ZFUgorI3ByYWdtYSB3YXJuaW5nKCBwb3AgKQorI2VuZGlmCisKKy8qIHZpbTogZmlsZXR5cGU9bGV4CisqLwpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvdGhyaWZ0eS55eSBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3RocmlmdHkueXkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGYzNGFkZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3RocmlmdHkueXkKQEAgLTAsMCArMSwxMjAxIEBACislY29kZSByZXF1aXJlcyB7CisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfcHJvZ3JhbS5oIgorfQorJXsKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisgKiBUaHJpZnQgcGFyc2VyLgorICoKKyAqIFRoaXMgcGFyc2VyIGlzIHVzZWQgb24gYSB0aHJpZnQgZGVmaW5pdGlvbiBmaWxlLgorICoKKyAqLworCisjaWZuZGVmIF9fU1REQ19MSU1JVF9NQUNST1MKKyNkZWZpbmUgX19TVERDX0xJTUlUX01BQ1JPUworI2VuZGlmCisjaWZuZGVmIF9fU1REQ19GT1JNQVRfTUFDUk9TCisjZGVmaW5lIF9fU1REQ19GT1JNQVRfTUFDUk9TCisjZW5kaWYKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2lmbmRlZiBfTVNDX1ZFUgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjZWxzZQorI2luY2x1ZGUgPHN0ZGludC5oPgorI2VuZGlmCisjaW5jbHVkZSA8bGltaXRzLmg+CisjaWZkZWYgX01TQ19WRVIKKyNpbmNsdWRlICJ0aHJpZnQvd2luZG93cy9jb25maWcuaCIKKyNlbmRpZgorI2luY2x1ZGUgInRocmlmdC9tYWluLmgiCisjaW5jbHVkZSAidGhyaWZ0L2NvbW1vbi5oIgorI2luY2x1ZGUgInRocmlmdC9nbG9iYWxzLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfcHJvZ3JhbS5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3Njb3BlLmgiCisKKyNpZmRlZiBfTVNDX1ZFUgorLy93YXJuaW5nIEM0MDY1OiBzd2l0Y2ggc3RhdGVtZW50IGNvbnRhaW5zICdkZWZhdWx0JyBidXQgbm8gJ2Nhc2UnIGxhYmVscworI3ByYWdtYSB3YXJuaW5nKGRpc2FibGU6NDA2NSkKKyNlbmRpZgorCisvKioKKyAqIFRoaXMgZ2xvYmFsIHZhcmlhYmxlIGlzIHVzZWQgZm9yIGF1dG9tYXRpYyBudW1iZXJpbmcgb2YgZmllbGQgaW5kaWNlcyBldGMuCisgKiB3aGVuIHBhcnNpbmcgdGhlIG1lbWJlcnMgb2YgYSBzdHJ1Y3QuIEZpZWxkIHZhbHVlcyBhcmUgYXV0b21hdGljYWxseQorICogYXNzaWduZWQgc3RhcnRpbmcgZnJvbSAtMSBhbmQgd29ya2luZyB0aGVpciB3YXkgZG93bi4KKyAqLworaW50IHlfZmllbGRfdmFsID0gLTE7CisvKioKKyAqIFRoaXMgZ2xvYmFsIHZhcmlhYmxlIGlzIHVzZWQgZm9yIGF1dG9tYXRpYyBudW1iZXJpbmcgb2YgZW51bSB2YWx1ZXMuCisgKiB5X2VudW1fdmFsIGlzIHRoZSBsYXN0IHZhbHVlIGFzc2lnbmVkOyB0aGUgbmV4dCBhdXRvLWFzc2lnbmVkIHZhbHVlIHdpbGwgYmUKKyAqIHlfZW51bV92YWwrMSwgYW5kIHRoZW4gaXQgY29udGludWVzIHdvcmtpbmcgdXB3YXJkcy4gIEV4cGxpY2l0bHkgc3BlY2lmaWVkCisgKiBlbnVtIHZhbHVlcyByZXNldCB5X2VudW1fdmFsIHRvIHRoYXQgdmFsdWUuCisgKi8KK2ludDMyX3QgeV9lbnVtX3ZhbCA9IC0xOworaW50IGdfYXJnbGlzdCA9IDA7Citjb25zdCBpbnQgc3RydWN0X2lzX3N0cnVjdCA9IDA7Citjb25zdCBpbnQgc3RydWN0X2lzX3VuaW9uID0gMTsKKworJX0KKworLyoqCisgKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGJ5IHRoZSBwYXJzZXIgdG8gaG9sZCB0aGUgZGF0YSB0eXBlcyBhc3NvY2lhdGVkIHdpdGgKKyAqIHZhcmlvdXMgcGFyc2Ugbm9kZXMuCisgKi8KKyV1bmlvbiB7CisgIGNoYXIqICAgICAgICAgIGlkOworICBpbnQ2NF90ICAgICAgICBpY29uc3Q7CisgIGRvdWJsZSAgICAgICAgIGRjb25zdDsKKyAgYm9vbCAgICAgICAgICAgdGJvb2w7CisgIHRfZG9jKiAgICAgICAgIHRkb2M7CisgIHRfdHlwZSogICAgICAgIHR0eXBlOworICB0X2Jhc2VfdHlwZSogICB0YmFzZTsKKyAgdF90eXBlZGVmKiAgICAgdHR5cGVkZWY7CisgIHRfZW51bSogICAgICAgIHRlbnVtOworICB0X2VudW1fdmFsdWUqICB0ZW51bXY7CisgIHRfY29uc3QqICAgICAgIHRjb25zdDsKKyAgdF9jb25zdF92YWx1ZSogdGNvbnN0djsKKyAgdF9zdHJ1Y3QqICAgICAgdHN0cnVjdDsKKyAgdF9zZXJ2aWNlKiAgICAgdHNlcnZpY2U7CisgIHRfZnVuY3Rpb24qICAgIHRmdW5jdGlvbjsKKyAgdF9maWVsZCogICAgICAgdGZpZWxkOworICBjaGFyKiAgICAgICAgICBkdGV4dDsKKyAgdF9maWVsZDo6ZV9yZXEgZXJlcTsKKyAgdF9hbm5vdGF0aW9uKiAgdGFubm90OworICB0X2ZpZWxkX2lkICAgICB0ZmllbGRpZDsKK30KKworLyoqCisgKiBTdHJpbmdzIGlkZW50aWZpZXIKKyAqLworJXRva2VuPGlkPiAgICAgdG9rX2lkZW50aWZpZXIKKyV0b2tlbjxpZD4gICAgIHRva19saXRlcmFsCisldG9rZW48ZHRleHQ+ICB0b2tfZG9jdGV4dAorCisvKioKKyAqIENvbnN0YW50IHZhbHVlcworICovCisldG9rZW48aWNvbnN0PiB0b2tfaW50X2NvbnN0YW50CisldG9rZW48ZGNvbnN0PiB0b2tfZHViX2NvbnN0YW50CisKKy8qKgorICogSGVhZGVyIGtleXdvcmRzCisgKi8KKyV0b2tlbiB0b2tfaW5jbHVkZQorJXRva2VuIHRva19uYW1lc3BhY2UKKyV0b2tlbiB0b2tfY3BwX2luY2x1ZGUKKyV0b2tlbiB0b2tfY3BwX3R5cGUKKyV0b2tlbiB0b2tfeHNkX2FsbAorJXRva2VuIHRva194c2Rfb3B0aW9uYWwKKyV0b2tlbiB0b2tfeHNkX25pbGxhYmxlCisldG9rZW4gdG9rX3hzZF9hdHRycworCisvKioKKyAqIEJhc2UgZGF0YXR5cGUga2V5d29yZHMKKyAqLworJXRva2VuIHRva192b2lkCisldG9rZW4gdG9rX2Jvb2wKKyV0b2tlbiB0b2tfc3RyaW5nCisldG9rZW4gdG9rX2JpbmFyeQorJXRva2VuIHRva19zbGlzdAorJXRva2VuIHRva19zZW51bQorJXRva2VuIHRva19pOAorJXRva2VuIHRva19pMTYKKyV0b2tlbiB0b2tfaTMyCisldG9rZW4gdG9rX2k2NAorJXRva2VuIHRva19kb3VibGUKKworLyoqCisgKiBDb21wbGV4IHR5cGUga2V5d29yZHMKKyAqLworJXRva2VuIHRva19tYXAKKyV0b2tlbiB0b2tfbGlzdAorJXRva2VuIHRva19zZXQKKworLyoqCisgKiBGdW5jdGlvbiBtb2RpZmllcnMKKyAqLworJXRva2VuIHRva19vbmV3YXkKKworLyoqCisgKiBUaHJpZnQgbGFuZ3VhZ2Uga2V5d29yZHMKKyAqLworJXRva2VuIHRva190eXBlZGVmCisldG9rZW4gdG9rX3N0cnVjdAorJXRva2VuIHRva194Y2VwdGlvbgorJXRva2VuIHRva190aHJvd3MKKyV0b2tlbiB0b2tfZXh0ZW5kcworJXRva2VuIHRva19zZXJ2aWNlCisldG9rZW4gdG9rX2VudW0KKyV0b2tlbiB0b2tfY29uc3QKKyV0b2tlbiB0b2tfcmVxdWlyZWQKKyV0b2tlbiB0b2tfb3B0aW9uYWwKKyV0b2tlbiB0b2tfdW5pb24KKyV0b2tlbiB0b2tfcmVmZXJlbmNlCisKKy8qKgorICogR3JhbW1hciBub2RlcworICovCisKKyV0eXBlPHR0eXBlPiAgICAgQmFzZVR5cGUKKyV0eXBlPHR0eXBlPiAgICAgU2ltcGxlQmFzZVR5cGUKKyV0eXBlPHR0eXBlPiAgICAgQ29udGFpbmVyVHlwZQorJXR5cGU8dHR5cGU+ICAgICBTaW1wbGVDb250YWluZXJUeXBlCisldHlwZTx0dHlwZT4gICAgIE1hcFR5cGUKKyV0eXBlPHR0eXBlPiAgICAgU2V0VHlwZQorJXR5cGU8dHR5cGU+ICAgICBMaXN0VHlwZQorCisldHlwZTx0ZG9jPiAgICAgIERlZmluaXRpb24KKyV0eXBlPHR0eXBlPiAgICAgVHlwZURlZmluaXRpb24KKworJXR5cGU8dHR5cGVkZWY+ICBUeXBlZGVmCisKKyV0eXBlPHR0eXBlPiAgICAgVHlwZUFubm90YXRpb25zCisldHlwZTx0dHlwZT4gICAgIFR5cGVBbm5vdGF0aW9uTGlzdAorJXR5cGU8dGFubm90PiAgICBUeXBlQW5ub3RhdGlvbgorJXR5cGU8aWQ+ICAgICAgICBUeXBlQW5ub3RhdGlvblZhbHVlCisKKyV0eXBlPHRmaWVsZD4gICAgRmllbGQKKyV0eXBlPHRmaWVsZGlkPiAgRmllbGRJZGVudGlmaWVyCisldHlwZTxlcmVxPiAgICAgIEZpZWxkUmVxdWlyZWRuZXNzCisldHlwZTx0dHlwZT4gICAgIEZpZWxkVHlwZQorJXR5cGU8dGNvbnN0dj4gICBGaWVsZFZhbHVlCisldHlwZTx0c3RydWN0PiAgIEZpZWxkTGlzdAorJXR5cGU8dGJvb2w+ICAgICBGaWVsZFJlZmVyZW5jZQorCisldHlwZTx0ZW51bT4gICAgIEVudW0KKyV0eXBlPHRlbnVtPiAgICAgRW51bURlZkxpc3QKKyV0eXBlPHRlbnVtdj4gICAgRW51bURlZgorJXR5cGU8dGVudW12PiAgICBFbnVtVmFsdWUKKworJXR5cGU8dHR5cGVkZWY+ICBTZW51bQorJXR5cGU8dGJhc2U+ICAgICBTZW51bURlZkxpc3QKKyV0eXBlPGlkPiAgICAgICAgU2VudW1EZWYKKworJXR5cGU8dGNvbnN0PiAgICBDb25zdAorJXR5cGU8dGNvbnN0dj4gICBDb25zdFZhbHVlCisldHlwZTx0Y29uc3R2PiAgIENvbnN0TGlzdAorJXR5cGU8dGNvbnN0dj4gICBDb25zdExpc3RDb250ZW50cworJXR5cGU8dGNvbnN0dj4gICBDb25zdE1hcAorJXR5cGU8dGNvbnN0dj4gICBDb25zdE1hcENvbnRlbnRzCisKKyV0eXBlPGljb25zdD4gICAgU3RydWN0SGVhZAorJXR5cGU8dHN0cnVjdD4gICBTdHJ1Y3QKKyV0eXBlPHRzdHJ1Y3Q+ICAgWGNlcHRpb24KKyV0eXBlPHRzZXJ2aWNlPiAgU2VydmljZQorCisldHlwZTx0ZnVuY3Rpb24+IEZ1bmN0aW9uCisldHlwZTx0dHlwZT4gICAgIEZ1bmN0aW9uVHlwZQorJXR5cGU8dHNlcnZpY2U+ICBGdW5jdGlvbkxpc3QKKworJXR5cGU8dHN0cnVjdD4gICBUaHJvd3MKKyV0eXBlPHRzZXJ2aWNlPiAgRXh0ZW5kcworJXR5cGU8dGJvb2w+ICAgICBPbmV3YXkKKyV0eXBlPHRib29sPiAgICAgWHNkQWxsCisldHlwZTx0Ym9vbD4gICAgIFhzZE9wdGlvbmFsCisldHlwZTx0Ym9vbD4gICAgIFhzZE5pbGxhYmxlCisldHlwZTx0c3RydWN0PiAgIFhzZEF0dHJpYnV0ZXMKKyV0eXBlPGlkPiAgICAgICAgQ3BwVHlwZQorCisldHlwZTxkdGV4dD4gICAgIENhcHR1cmVEb2NUZXh0CisKKyUlCisKKy8qKgorICogVGhyaWZ0IEdyYW1tYXIgSW1wbGVtZW50YXRpb24uCisgKgorICogRm9yIHRoZSBtb3N0IHBhcnQgdGhpcyBzb3VyY2UgZmlsZSB3b3JrcyBpdHMgd2F5IHRvcCBkb3duIGZyb20gd2hhdCB5b3UKKyAqIG1pZ2h0IGV4cGVjdCB0byBmaW5kIGluIGEgdHlwaWNhbCAudGhyaWZ0IGZpbGUsIGkuZS4gdHlwZSBkZWZpbml0aW9ucyBhbmQKKyAqIG5hbWVzcGFjZXMgdXAgdG9wIGZvbGxvd2VkIGJ5IHNlcnZpY2UgZGVmaW5pdGlvbnMgdXNpbmcgdGhvc2UgdHlwZXMuCisgKi8KKworUHJvZ3JhbToKKyAgSGVhZGVyTGlzdCBEZWZpbml0aW9uTGlzdAorICAgIHsKKyAgICAgIHBkZWJ1ZygiUHJvZ3JhbSAtPiBIZWFkZXJzIERlZmluaXRpb25MaXN0Iik7CisgICAgICBpZigoZ19wcm9ncmFtX2RvY3RleHRfY2FuZGlkYXRlICE9IE5VTEwpICYmIChnX3Byb2dyYW1fZG9jdGV4dF9zdGF0dXMgIT0gQUxSRUFEWV9QUk9DRVNTRUQpKQorICAgICAgeworICAgICAgICBnX3Byb2dyYW0tPnNldF9kb2MoZ19wcm9ncmFtX2RvY3RleHRfY2FuZGlkYXRlKTsKKyAgICAgICAgZ19wcm9ncmFtX2RvY3RleHRfc3RhdHVzID0gQUxSRUFEWV9QUk9DRVNTRUQ7CisgICAgICB9CisgICAgICBjbGVhcl9kb2N0ZXh0KCk7CisgICAgfQorCitDYXB0dXJlRG9jVGV4dDoKKyAgICB7CisgICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKKyAgICAgICAgJCQgPSBnX2RvY3RleHQ7CisgICAgICAgIGdfZG9jdGV4dCA9IE5VTEw7CisgICAgICB9IGVsc2UgeworICAgICAgICAkJCA9IE5VTEw7CisgICAgICB9CisgICAgfQorCisvKiBUT0RPKGRyZWlzcyk6IFRyeSB0byBEZXN0cm95RG9jVGV4dCBpbiBhbGwgc29ydHMgb3IgcmFuZG9tIHBsYWNlcy4gKi8KK0Rlc3Ryb3lEb2NUZXh0OgorICAgIHsKKyAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgeworICAgICAgICBjbGVhcl9kb2N0ZXh0KCk7CisgICAgICB9CisgICAgfQorCisvKiBXZSBoYXZlIHRvIERlc3Ryb3lEb2NUZXh0IGhlcmUsIG90aGVyd2lzZSBpdCBjYXRjaGVzIHRoZSBkb2N0ZXh0CisgICBvbiB0aGUgZmlyc3QgcmVhbCBlbGVtZW50LiAqLworSGVhZGVyTGlzdDoKKyAgSGVhZGVyTGlzdCBEZXN0cm95RG9jVGV4dCBIZWFkZXIKKyAgICB7CisgICAgICBwZGVidWcoIkhlYWRlckxpc3QgLT4gSGVhZGVyTGlzdCBIZWFkZXIiKTsKKyAgICB9Cit8CisgICAgeworICAgICAgcGRlYnVnKCJIZWFkZXJMaXN0IC0+ICIpOworICAgIH0KKworSGVhZGVyOgorICBJbmNsdWRlCisgICAgeworICAgICAgcGRlYnVnKCJIZWFkZXIgLT4gSW5jbHVkZSIpOworICAgIH0KK3wgdG9rX25hbWVzcGFjZSB0b2tfaWRlbnRpZmllciB0b2tfaWRlbnRpZmllciBUeXBlQW5ub3RhdGlvbnMKKyAgICB7CisgICAgICBwZGVidWcoIkhlYWRlciAtPiB0b2tfbmFtZXNwYWNlIHRva19pZGVudGlmaWVyIHRva19pZGVudGlmaWVyIik7CisgICAgICBkZWNsYXJlX3ZhbGlkX3Byb2dyYW1fZG9jdGV4dCgpOworICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7CisgICAgICAgIGdfcHJvZ3JhbS0+c2V0X25hbWVzcGFjZSgkMiwgJDMpOworICAgICAgfQorICAgICAgaWYgKCQ0ICE9IE5VTEwpIHsKKyAgICAgICAgZ19wcm9ncmFtLT5zZXRfbmFtZXNwYWNlX2Fubm90YXRpb25zKCQyLCAkNC0+YW5ub3RhdGlvbnNfKTsKKyAgICAgICAgZGVsZXRlICQ0OworICAgICAgfQorICAgIH0KK3wgdG9rX25hbWVzcGFjZSAnKicgdG9rX2lkZW50aWZpZXIKKyAgICB7CisgICAgICBwZGVidWcoIkhlYWRlciAtPiB0b2tfbmFtZXNwYWNlICogdG9rX2lkZW50aWZpZXIiKTsKKyAgICAgIGRlY2xhcmVfdmFsaWRfcHJvZ3JhbV9kb2N0ZXh0KCk7CisgICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKKyAgICAgICAgZ19wcm9ncmFtLT5zZXRfbmFtZXNwYWNlKCIqIiwgJDMpOworICAgICAgfQorICAgIH0KK3wgdG9rX2NwcF9pbmNsdWRlIHRva19saXRlcmFsCisgICAgeworICAgICAgcGRlYnVnKCJIZWFkZXIgLT4gdG9rX2NwcF9pbmNsdWRlIHRva19saXRlcmFsIik7CisgICAgICBkZWNsYXJlX3ZhbGlkX3Byb2dyYW1fZG9jdGV4dCgpOworICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7CisgICAgICAgIGdfcHJvZ3JhbS0+YWRkX2NwcF9pbmNsdWRlKCQyKTsKKyAgICAgIH0KKyAgICB9CisKK0luY2x1ZGU6CisgIHRva19pbmNsdWRlIHRva19saXRlcmFsCisgICAgeworICAgICAgcGRlYnVnKCJJbmNsdWRlIC0+IHRva19pbmNsdWRlIHRva19saXRlcmFsIik7CisgICAgICBkZWNsYXJlX3ZhbGlkX3Byb2dyYW1fZG9jdGV4dCgpOworICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBJTkNMVURFUykgeworICAgICAgICBzdGQ6OnN0cmluZyBwYXRoID0gaW5jbHVkZV9maWxlKHN0ZDo6c3RyaW5nKCQyKSk7CisgICAgICAgIGlmICghcGF0aC5lbXB0eSgpKSB7CisgICAgICAgICAgZ19wcm9ncmFtLT5hZGRfaW5jbHVkZShwYXRoLCBzdGQ6OnN0cmluZygkMikpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCitEZWZpbml0aW9uTGlzdDoKKyAgRGVmaW5pdGlvbkxpc3QgQ2FwdHVyZURvY1RleHQgRGVmaW5pdGlvbgorICAgIHsKKyAgICAgIHBkZWJ1ZygiRGVmaW5pdGlvbkxpc3QgLT4gRGVmaW5pdGlvbkxpc3QgRGVmaW5pdGlvbiIpOworICAgICAgaWYgKCQyICE9IE5VTEwgJiYgJDMgIT0gTlVMTCkgeworICAgICAgICAkMy0+c2V0X2RvYygkMik7CisgICAgICB9CisgICAgfQorfAorICAgIHsKKyAgICAgIHBkZWJ1ZygiRGVmaW5pdGlvbkxpc3QgLT4gIik7CisgICAgfQorCitEZWZpbml0aW9uOgorICBDb25zdAorICAgIHsKKyAgICAgIHBkZWJ1ZygiRGVmaW5pdGlvbiAtPiBDb25zdCIpOworICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7CisgICAgICAgIGdfcHJvZ3JhbS0+YWRkX2NvbnN0KCQxKTsKKyAgICAgIH0KKyAgICAgICQkID0gJDE7CisgICAgfQorfCBUeXBlRGVmaW5pdGlvbgorICAgIHsKKyAgICAgIHBkZWJ1ZygiRGVmaW5pdGlvbiAtPiBUeXBlRGVmaW5pdGlvbiIpOworICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7CisgICAgICAgIGdfc2NvcGUtPmFkZF90eXBlKCQxLT5nZXRfbmFtZSgpLCAkMSk7CisgICAgICAgIGlmIChnX3BhcmVudF9zY29wZSAhPSBOVUxMKSB7CisgICAgICAgICAgZ19wYXJlbnRfc2NvcGUtPmFkZF90eXBlKGdfcGFyZW50X3ByZWZpeCArICQxLT5nZXRfbmFtZSgpLCAkMSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCEgZ19wcm9ncmFtLT5pc191bmlxdWVfdHlwZW5hbWUoJDEpKSB7CisgICAgICAgICAgeXllcnJvcigiVHlwZSBcIiVzXCIgaXMgYWxyZWFkeSBkZWZpbmVkLiIsICQxLT5nZXRfbmFtZSgpLmNfc3RyKCkpOworICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgICQkID0gJDE7CisgICAgfQorfCBTZXJ2aWNlCisgICAgeworICAgICAgcGRlYnVnKCJEZWZpbml0aW9uIC0+IFNlcnZpY2UiKTsKKyAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgeworICAgICAgICBnX3Njb3BlLT5hZGRfc2VydmljZSgkMS0+Z2V0X25hbWUoKSwgJDEpOworICAgICAgICBpZiAoZ19wYXJlbnRfc2NvcGUgIT0gTlVMTCkgeworICAgICAgICAgIGdfcGFyZW50X3Njb3BlLT5hZGRfc2VydmljZShnX3BhcmVudF9wcmVmaXggKyAkMS0+Z2V0X25hbWUoKSwgJDEpOworICAgICAgICB9CisgICAgICAgIGdfcHJvZ3JhbS0+YWRkX3NlcnZpY2UoJDEpOworICAgICAgICBpZiAoISBnX3Byb2dyYW0tPmlzX3VuaXF1ZV90eXBlbmFtZSgkMSkpIHsKKyAgICAgICAgICB5eWVycm9yKCJUeXBlIFwiJXNcIiBpcyBhbHJlYWR5IGRlZmluZWQuIiwgJDEtPmdldF9uYW1lKCkuY19zdHIoKSk7CisgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgJCQgPSAkMTsKKyAgICB9CisKK1R5cGVEZWZpbml0aW9uOgorICBUeXBlZGVmCisgICAgeworICAgICAgcGRlYnVnKCJUeXBlRGVmaW5pdGlvbiAtPiBUeXBlZGVmIik7CisgICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKKyAgICAgICAgZ19wcm9ncmFtLT5hZGRfdHlwZWRlZigkMSk7CisgICAgICB9CisgICAgfQorfCBFbnVtCisgICAgeworICAgICAgcGRlYnVnKCJUeXBlRGVmaW5pdGlvbiAtPiBFbnVtIik7CisgICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKKyAgICAgICAgZ19wcm9ncmFtLT5hZGRfZW51bSgkMSk7CisgICAgICB9CisgICAgfQorfCBTZW51bQorICAgIHsKKyAgICAgIHBkZWJ1ZygiVHlwZURlZmluaXRpb24gLT4gU2VudW0iKTsKKyAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgeworICAgICAgICBnX3Byb2dyYW0tPmFkZF90eXBlZGVmKCQxKTsKKyAgICAgIH0KKyAgICB9Cit8IFN0cnVjdAorICAgIHsKKyAgICAgIHBkZWJ1ZygiVHlwZURlZmluaXRpb24gLT4gU3RydWN0Iik7CisgICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKKyAgICAgICAgZ19wcm9ncmFtLT5hZGRfc3RydWN0KCQxKTsKKyAgICAgIH0KKyAgICB9Cit8IFhjZXB0aW9uCisgICAgeworICAgICAgcGRlYnVnKCJUeXBlRGVmaW5pdGlvbiAtPiBYY2VwdGlvbiIpOworICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7CisgICAgICAgIGdfcHJvZ3JhbS0+YWRkX3hjZXB0aW9uKCQxKTsKKyAgICAgIH0KKyAgICB9CisKK0NvbW1hT3JTZW1pY29sb25PcHRpb25hbDoKKyAgJywnCisgICAge30KK3wgJzsnCisgICAge30KK3wKKyAgICB7fQorCitUeXBlZGVmOgorICB0b2tfdHlwZWRlZiBGaWVsZFR5cGUgdG9rX2lkZW50aWZpZXIgVHlwZUFubm90YXRpb25zIENvbW1hT3JTZW1pY29sb25PcHRpb25hbAorICAgIHsKKyAgICAgIHBkZWJ1ZygiVHlwZURlZiAtPiB0b2tfdHlwZWRlZiBGaWVsZFR5cGUgdG9rX2lkZW50aWZpZXIiKTsKKyAgICAgIHZhbGlkYXRlX3NpbXBsZV9pZGVudGlmaWVyKCAkMyk7CisgICAgICB0X3R5cGVkZWYgKnRkID0gbmV3IHRfdHlwZWRlZihnX3Byb2dyYW0sICQyLCAkMyk7CisgICAgICAkJCA9IHRkOworICAgICAgaWYgKCQ0ICE9IE5VTEwpIHsKKyAgICAgICAgJCQtPmFubm90YXRpb25zXyA9ICQ0LT5hbm5vdGF0aW9uc187CisgICAgICAgIGRlbGV0ZSAkNDsKKyAgICAgIH0KKyAgICB9CisKK0VudW06CisgIHRva19lbnVtIHRva19pZGVudGlmaWVyICd7JyBFbnVtRGVmTGlzdCAnfScgVHlwZUFubm90YXRpb25zCisgICAgeworICAgICAgcGRlYnVnKCJFbnVtIC0+IHRva19lbnVtIHRva19pZGVudGlmaWVyIHsgRW51bURlZkxpc3QgfSIpOworICAgICAgJCQgPSAkNDsKKyAgICAgIHZhbGlkYXRlX3NpbXBsZV9pZGVudGlmaWVyKCAkMik7CisgICAgICAkJC0+c2V0X25hbWUoJDIpOworICAgICAgaWYgKCQ2ICE9IE5VTEwpIHsKKyAgICAgICAgJCQtPmFubm90YXRpb25zXyA9ICQ2LT5hbm5vdGF0aW9uc187CisgICAgICAgIGRlbGV0ZSAkNjsKKyAgICAgIH0KKworICAgICAgLy8gbWFrZSBjb25zdGFudHMgZm9yIGFsbCB0aGUgZW51bSB2YWx1ZXMKKyAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgeworICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2VudW1fdmFsdWUqPiYgZW51bV92YWx1ZXMgPSAkJC0+Z2V0X2NvbnN0YW50cygpOworICAgICAgICBzdGQ6OnZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3IgY19pdGVyOworICAgICAgICBmb3IgKGNfaXRlciA9IGVudW1fdmFsdWVzLmJlZ2luKCk7IGNfaXRlciAhPSBlbnVtX3ZhbHVlcy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdF9uYW1lID0gJCQtPmdldF9uYW1lKCkgKyAiLiIgKyAoKmNfaXRlciktPmdldF9uYW1lKCk7CisgICAgICAgICAgdF9jb25zdF92YWx1ZSogY29uc3RfdmFsID0gbmV3IHRfY29uc3RfdmFsdWUoKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSk7CisgICAgICAgICAgY29uc3RfdmFsLT5zZXRfZW51bSgkJCk7CisgICAgICAgICAgZ19zY29wZS0+YWRkX2NvbnN0YW50KGNvbnN0X25hbWUsIG5ldyB0X2NvbnN0KGdfdHlwZV9pMzIsICgqY19pdGVyKS0+Z2V0X25hbWUoKSwgY29uc3RfdmFsKSk7CisgICAgICAgICAgaWYgKGdfcGFyZW50X3Njb3BlICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGdfcGFyZW50X3Njb3BlLT5hZGRfY29uc3RhbnQoZ19wYXJlbnRfcHJlZml4ICsgY29uc3RfbmFtZSwgbmV3IHRfY29uc3QoZ190eXBlX2kzMiwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpLCBjb25zdF92YWwpKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKK0VudW1EZWZMaXN0OgorICBFbnVtRGVmTGlzdCBFbnVtRGVmCisgICAgeworICAgICAgcGRlYnVnKCJFbnVtRGVmTGlzdCAtPiBFbnVtRGVmTGlzdCBFbnVtRGVmIik7CisgICAgICAkJCA9ICQxOworICAgICAgJCQtPmFwcGVuZCgkMik7CisgICAgfQorfAorICAgIHsKKyAgICAgIHBkZWJ1ZygiRW51bURlZkxpc3QgLT4gIik7CisgICAgICAkJCA9IG5ldyB0X2VudW0oZ19wcm9ncmFtKTsKKyAgICAgIHlfZW51bV92YWwgPSAtMTsKKyAgICB9CisKK0VudW1EZWY6CisgIENhcHR1cmVEb2NUZXh0IEVudW1WYWx1ZSBUeXBlQW5ub3RhdGlvbnMgQ29tbWFPclNlbWljb2xvbk9wdGlvbmFsCisgICAgeworICAgICAgcGRlYnVnKCJFbnVtRGVmIC0+IEVudW1WYWx1ZSIpOworICAgICAgJCQgPSAkMjsKKyAgICAgIGlmICgkMSAhPSBOVUxMKSB7CisgICAgICAgICQkLT5zZXRfZG9jKCQxKTsKKyAgICAgIH0KKwkgIGlmICgkMyAhPSBOVUxMKSB7CisgICAgICAgICQkLT5hbm5vdGF0aW9uc18gPSAkMy0+YW5ub3RhdGlvbnNfOworICAgICAgICBkZWxldGUgJDM7CisgICAgICB9CisgICAgfQorCitFbnVtVmFsdWU6CisgIHRva19pZGVudGlmaWVyICc9JyB0b2tfaW50X2NvbnN0YW50CisgICAgeworICAgICAgcGRlYnVnKCJFbnVtVmFsdWUgLT4gdG9rX2lkZW50aWZpZXIgPSB0b2tfaW50X2NvbnN0YW50Iik7CisgICAgICBpZiAoJDMgPCBJTlQzMl9NSU4gfHwgJDMgPiBJTlQzMl9NQVgpIHsKKyAgICAgICAgLy8gTm90ZTogdGhpcyB1c2VkIHRvIGJlIGp1c3QgYSB3YXJuaW5nLiAgSG93ZXZlciwgc2luY2UgdGhyaWZ0IGFsd2F5cworICAgICAgICAvLyB0cmVhdHMgZW51bXMgYXMgaTMyIHZhbHVlcywgSSdtIGNoYW5naW5nIGl0IHRvIGEgZmF0YWwgZXJyb3IuCisgICAgICAgIC8vIEkgZG91YnQgdGhpcyB3aWxsIGFmZmVjdCBtYW55IHBlb3BsZSwgYnV0IHVzZXJzIHdobyBydW4gaW50byB0aGlzCisgICAgICAgIC8vIHdpbGwgaGF2ZSB0byB1cGRhdGUgdGhlaXIgdGhyaWZ0IGZpbGVzIHRvIG1hbnVhbGx5IHNwZWNpZnkgdGhlCisgICAgICAgIC8vIHRydW5jYXRlZCBpMzIgdmFsdWUgdGhhdCB0aHJpZnQgaGFzIGFsd2F5cyBiZWVuIHVzaW5nIGFueXdheS4KKyAgICAgICAgZmFpbHVyZSgiNjQtYml0IHZhbHVlIHN1cHBsaWVkIGZvciBlbnVtICVzIHdpbGwgYmUgdHJ1bmNhdGVkLiIsICQxKTsKKyAgICAgIH0KKyAgICAgIHlfZW51bV92YWwgPSBzdGF0aWNfY2FzdDxpbnQzMl90PigkMyk7CisgICAgICAkJCA9IG5ldyB0X2VudW1fdmFsdWUoJDEsIHlfZW51bV92YWwpOworICAgIH0KKyB8CisgIHRva19pZGVudGlmaWVyCisgICAgeworICAgICAgcGRlYnVnKCJFbnVtVmFsdWUgLT4gdG9rX2lkZW50aWZpZXIiKTsKKyAgICAgIHZhbGlkYXRlX3NpbXBsZV9pZGVudGlmaWVyKCAkMSk7CisgICAgICBpZiAoeV9lbnVtX3ZhbCA9PSBJTlQzMl9NQVgpIHsKKyAgICAgICAgZmFpbHVyZSgiZW51bSB2YWx1ZSBvdmVyZmxvdyBhdCBlbnVtICVzIiwgJDEpOworICAgICAgfQorICAgICAgKyt5X2VudW1fdmFsOworICAgICAgJCQgPSBuZXcgdF9lbnVtX3ZhbHVlKCQxLCB5X2VudW1fdmFsKTsKKyAgICB9CisKK1NlbnVtOgorICB0b2tfc2VudW0gdG9rX2lkZW50aWZpZXIgJ3snIFNlbnVtRGVmTGlzdCAnfScgVHlwZUFubm90YXRpb25zCisgICAgeworICAgICAgcGRlYnVnKCJTZW51bSAtPiB0b2tfc2VudW0gdG9rX2lkZW50aWZpZXIgeyBTZW51bURlZkxpc3QgfSIpOworICAgICAgdmFsaWRhdGVfc2ltcGxlX2lkZW50aWZpZXIoICQyKTsKKyAgICAgICQkID0gbmV3IHRfdHlwZWRlZihnX3Byb2dyYW0sICQ0LCAkMik7CisgICAgICBpZiAoJDYgIT0gTlVMTCkgeworICAgICAgICAkJC0+YW5ub3RhdGlvbnNfID0gJDYtPmFubm90YXRpb25zXzsKKyAgICAgICAgZGVsZXRlICQ2OworICAgICAgfQorICAgIH0KKworU2VudW1EZWZMaXN0OgorICBTZW51bURlZkxpc3QgU2VudW1EZWYKKyAgICB7CisgICAgICBwZGVidWcoIlNlbnVtRGVmTGlzdCAtPiBTZW51bURlZkxpc3QgU2VudW1EZWYiKTsKKyAgICAgICQkID0gJDE7CisgICAgICAkJC0+YWRkX3N0cmluZ19lbnVtX3ZhbCgkMik7CisgICAgfQorfAorICAgIHsKKyAgICAgIHBkZWJ1ZygiU2VudW1EZWZMaXN0IC0+ICIpOworICAgICAgJCQgPSBuZXcgdF9iYXNlX3R5cGUoInN0cmluZyIsIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORyk7CisgICAgICAkJC0+c2V0X3N0cmluZ19lbnVtKHRydWUpOworICAgIH0KKworU2VudW1EZWY6CisgIHRva19saXRlcmFsIENvbW1hT3JTZW1pY29sb25PcHRpb25hbAorICAgIHsKKyAgICAgIHBkZWJ1ZygiU2VudW1EZWYgLT4gdG9rX2xpdGVyYWwiKTsKKyAgICAgICQkID0gJDE7CisgICAgfQorCitDb25zdDoKKyAgdG9rX2NvbnN0IEZpZWxkVHlwZSB0b2tfaWRlbnRpZmllciAnPScgQ29uc3RWYWx1ZSBDb21tYU9yU2VtaWNvbG9uT3B0aW9uYWwKKyAgICB7CisgICAgICBwZGVidWcoIkNvbnN0IC0+IHRva19jb25zdCBGaWVsZFR5cGUgdG9rX2lkZW50aWZpZXIgPSBDb25zdFZhbHVlIik7CisgICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKKyAgICAgICAgdmFsaWRhdGVfc2ltcGxlX2lkZW50aWZpZXIoICQzKTsKKyAgICAgICAgZ19zY29wZS0+cmVzb2x2ZV9jb25zdF92YWx1ZSgkNSwgJDIpOworICAgICAgICAkJCA9IG5ldyB0X2NvbnN0KCQyLCAkMywgJDUpOworICAgICAgICB2YWxpZGF0ZV9jb25zdF90eXBlKCQkKTsKKworICAgICAgICBnX3Njb3BlLT5hZGRfY29uc3RhbnQoJDMsICQkKTsKKyAgICAgICAgaWYgKGdfcGFyZW50X3Njb3BlICE9IE5VTEwpIHsKKyAgICAgICAgICBnX3BhcmVudF9zY29wZS0+YWRkX2NvbnN0YW50KGdfcGFyZW50X3ByZWZpeCArICQzLCAkJCk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgICQkID0gTlVMTDsKKyAgICAgIH0KKyAgICB9CisKK0NvbnN0VmFsdWU6CisgIHRva19pbnRfY29uc3RhbnQKKyAgICB7CisgICAgICBwZGVidWcoIkNvbnN0VmFsdWUgPT4gdG9rX2ludF9jb25zdGFudCIpOworICAgICAgJCQgPSBuZXcgdF9jb25zdF92YWx1ZSgpOworICAgICAgJCQtPnNldF9pbnRlZ2VyKCQxKTsKKyAgICAgIGlmICghZ19hbGxvd182NGJpdF9jb25zdHMgJiYgKCQxIDwgSU5UMzJfTUlOIHx8ICQxID4gSU5UMzJfTUFYKSkgeworICAgICAgICBwd2FybmluZygxLCAiNjQtYml0IGNvbnN0YW50IFwiJSIgUFJJaTY0IlwiIG1heSBub3Qgd29yayBpbiBhbGwgbGFuZ3VhZ2VzLlxuIiwgJDEpOworICAgICAgfQorICAgIH0KK3wgdG9rX2R1Yl9jb25zdGFudAorICAgIHsKKyAgICAgIHBkZWJ1ZygiQ29uc3RWYWx1ZSA9PiB0b2tfZHViX2NvbnN0YW50Iik7CisgICAgICAkJCA9IG5ldyB0X2NvbnN0X3ZhbHVlKCk7CisgICAgICAkJC0+c2V0X2RvdWJsZSgkMSk7CisgICAgfQorfCB0b2tfbGl0ZXJhbAorICAgIHsKKyAgICAgIHBkZWJ1ZygiQ29uc3RWYWx1ZSA9PiB0b2tfbGl0ZXJhbCIpOworICAgICAgJCQgPSBuZXcgdF9jb25zdF92YWx1ZSgkMSk7CisgICAgfQorfCB0b2tfaWRlbnRpZmllcgorICAgIHsKKyAgICAgIHBkZWJ1ZygiQ29uc3RWYWx1ZSA9PiB0b2tfaWRlbnRpZmllciIpOworICAgICAgJCQgPSBuZXcgdF9jb25zdF92YWx1ZSgpOworICAgICAgJCQtPnNldF9pZGVudGlmaWVyKCQxKTsKKyAgICB9Cit8IENvbnN0TGlzdAorICAgIHsKKyAgICAgIHBkZWJ1ZygiQ29uc3RWYWx1ZSA9PiBDb25zdExpc3QiKTsKKyAgICAgICQkID0gJDE7CisgICAgfQorfCBDb25zdE1hcAorICAgIHsKKyAgICAgIHBkZWJ1ZygiQ29uc3RWYWx1ZSA9PiBDb25zdE1hcCIpOworICAgICAgJCQgPSAkMTsKKyAgICB9CisKK0NvbnN0TGlzdDoKKyAgJ1snIENvbnN0TGlzdENvbnRlbnRzICddJworICAgIHsKKyAgICAgIHBkZWJ1ZygiQ29uc3RMaXN0ID0+IFsgQ29uc3RMaXN0Q29udGVudHMgXSIpOworICAgICAgJCQgPSAkMjsKKyAgICB9CisKK0NvbnN0TGlzdENvbnRlbnRzOgorICBDb25zdExpc3RDb250ZW50cyBDb25zdFZhbHVlIENvbW1hT3JTZW1pY29sb25PcHRpb25hbAorICAgIHsKKyAgICAgIHBkZWJ1ZygiQ29uc3RMaXN0Q29udGVudHMgPT4gQ29uc3RMaXN0Q29udGVudHMgQ29uc3RWYWx1ZSBDb21tYU9yU2VtaWNvbG9uT3B0aW9uYWwiKTsKKyAgICAgICQkID0gJDE7CisgICAgICAkJC0+YWRkX2xpc3QoJDIpOworICAgIH0KK3wKKyAgICB7CisgICAgICBwZGVidWcoIkNvbnN0TGlzdENvbnRlbnRzID0+Iik7CisgICAgICAkJCA9IG5ldyB0X2NvbnN0X3ZhbHVlKCk7CisgICAgICAkJC0+c2V0X2xpc3QoKTsKKyAgICB9CisKK0NvbnN0TWFwOgorICAneycgQ29uc3RNYXBDb250ZW50cyAnfScKKyAgICB7CisgICAgICBwZGVidWcoIkNvbnN0TWFwID0+IHsgQ29uc3RNYXBDb250ZW50cyB9Iik7CisgICAgICAkJCA9ICQyOworICAgIH0KKworQ29uc3RNYXBDb250ZW50czoKKyAgQ29uc3RNYXBDb250ZW50cyBDb25zdFZhbHVlICc6JyBDb25zdFZhbHVlIENvbW1hT3JTZW1pY29sb25PcHRpb25hbAorICAgIHsKKyAgICAgIHBkZWJ1ZygiQ29uc3RNYXBDb250ZW50cyA9PiBDb25zdE1hcENvbnRlbnRzIENvbnN0VmFsdWUgQ29tbWFPclNlbWljb2xvbk9wdGlvbmFsIik7CisgICAgICAkJCA9ICQxOworICAgICAgJCQtPmFkZF9tYXAoJDIsICQ0KTsKKyAgICB9Cit8CisgICAgeworICAgICAgcGRlYnVnKCJDb25zdE1hcENvbnRlbnRzID0+Iik7CisgICAgICAkJCA9IG5ldyB0X2NvbnN0X3ZhbHVlKCk7CisgICAgICAkJC0+c2V0X21hcCgpOworICAgIH0KKworU3RydWN0SGVhZDoKKyAgdG9rX3N0cnVjdAorICAgIHsKKyAgICAgICQkID0gc3RydWN0X2lzX3N0cnVjdDsKKyAgICB9Cit8IHRva191bmlvbgorICAgIHsKKyAgICAgICQkID0gc3RydWN0X2lzX3VuaW9uOworICAgIH0KKworU3RydWN0OgorICBTdHJ1Y3RIZWFkIHRva19pZGVudGlmaWVyIFhzZEFsbCAneycgRmllbGRMaXN0ICd9JyBUeXBlQW5ub3RhdGlvbnMKKyAgICB7CisgICAgICBwZGVidWcoIlN0cnVjdCAtPiB0b2tfc3RydWN0IHRva19pZGVudGlmaWVyIHsgRmllbGRMaXN0IH0iKTsKKyAgICAgIHZhbGlkYXRlX3NpbXBsZV9pZGVudGlmaWVyKCAkMik7CisgICAgICAkNS0+c2V0X3hzZF9hbGwoJDMpOworICAgICAgJDUtPnNldF91bmlvbigkMSA9PSBzdHJ1Y3RfaXNfdW5pb24pOworICAgICAgJCQgPSAkNTsKKyAgICAgICQkLT5zZXRfbmFtZSgkMik7CisgICAgICBpZiAoJDcgIT0gTlVMTCkgeworICAgICAgICAkJC0+YW5ub3RhdGlvbnNfID0gJDctPmFubm90YXRpb25zXzsKKyAgICAgICAgZGVsZXRlICQ3OworICAgICAgfQorICAgIH0KKworWHNkQWxsOgorICB0b2tfeHNkX2FsbAorICAgIHsKKyAgICAgICQkID0gdHJ1ZTsKKyAgICB9Cit8CisgICAgeworICAgICAgJCQgPSBmYWxzZTsKKyAgICB9CisKK1hzZE9wdGlvbmFsOgorICB0b2tfeHNkX29wdGlvbmFsCisgICAgeworICAgICAgJCQgPSB0cnVlOworICAgIH0KK3wKKyAgICB7CisgICAgICAkJCA9IGZhbHNlOworICAgIH0KKworWHNkTmlsbGFibGU6CisgIHRva194c2RfbmlsbGFibGUKKyAgICB7CisgICAgICAkJCA9IHRydWU7CisgICAgfQorfAorICAgIHsKKyAgICAgICQkID0gZmFsc2U7CisgICAgfQorCitYc2RBdHRyaWJ1dGVzOgorICB0b2tfeHNkX2F0dHJzICd7JyBGaWVsZExpc3QgJ30nCisgICAgeworICAgICAgJCQgPSAkMzsKKyAgICB9Cit8CisgICAgeworICAgICAgJCQgPSBOVUxMOworICAgIH0KKworWGNlcHRpb246CisgIHRva194Y2VwdGlvbiB0b2tfaWRlbnRpZmllciAneycgRmllbGRMaXN0ICd9JyBUeXBlQW5ub3RhdGlvbnMKKyAgICB7CisgICAgICBwZGVidWcoIlhjZXB0aW9uIC0+IHRva194Y2VwdGlvbiB0b2tfaWRlbnRpZmllciB7IEZpZWxkTGlzdCB9Iik7CisgICAgICB2YWxpZGF0ZV9zaW1wbGVfaWRlbnRpZmllciggJDIpOworICAgICAgJDQtPnNldF9uYW1lKCQyKTsKKyAgICAgICQ0LT5zZXRfeGNlcHRpb24odHJ1ZSk7CisgICAgICAkJCA9ICQ0OworICAgICAgaWYgKCQ2ICE9IE5VTEwpIHsKKyAgICAgICAgJCQtPmFubm90YXRpb25zXyA9ICQ2LT5hbm5vdGF0aW9uc187CisgICAgICAgIGRlbGV0ZSAkNjsKKyAgICAgIH0KKyAgICB9CisKK1NlcnZpY2U6CisgIHRva19zZXJ2aWNlIHRva19pZGVudGlmaWVyIEV4dGVuZHMgJ3snIEZsYWdBcmdzIEZ1bmN0aW9uTGlzdCBVbmZsYWdBcmdzICd9JyBUeXBlQW5ub3RhdGlvbnMKKyAgICB7CisgICAgICBwZGVidWcoIlNlcnZpY2UgLT4gdG9rX3NlcnZpY2UgdG9rX2lkZW50aWZpZXIgeyBGdW5jdGlvbkxpc3QgfSIpOworICAgICAgdmFsaWRhdGVfc2ltcGxlX2lkZW50aWZpZXIoICQyKTsKKyAgICAgICQkID0gJDY7CisgICAgICAkJC0+c2V0X25hbWUoJDIpOworICAgICAgJCQtPnNldF9leHRlbmRzKCQzKTsKKyAgICAgIGlmICgkOSAhPSBOVUxMKSB7CisgICAgICAgICQkLT5hbm5vdGF0aW9uc18gPSAkOS0+YW5ub3RhdGlvbnNfOworICAgICAgICBkZWxldGUgJDk7CisgICAgICB9CisgICAgfQorCitGbGFnQXJnczoKKyAgICB7CisgICAgICAgZ19hcmdsaXN0ID0gMTsKKyAgICB9CisKK1VuZmxhZ0FyZ3M6CisgICAgeworICAgICAgIGdfYXJnbGlzdCA9IDA7CisgICAgfQorCitFeHRlbmRzOgorICB0b2tfZXh0ZW5kcyB0b2tfaWRlbnRpZmllcgorICAgIHsKKyAgICAgIHBkZWJ1ZygiRXh0ZW5kcyAtPiB0b2tfZXh0ZW5kcyB0b2tfaWRlbnRpZmllciIpOworICAgICAgJCQgPSBOVUxMOworICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7CisgICAgICAgICQkID0gZ19zY29wZS0+Z2V0X3NlcnZpY2UoJDIpOworICAgICAgICBpZiAoJCQgPT0gTlVMTCkgeworICAgICAgICAgIHl5ZXJyb3IoIlNlcnZpY2UgXCIlc1wiIGhhcyBub3QgYmVlbiBkZWZpbmVkLiIsICQyKTsKKyAgICAgICAgICBleGl0KDEpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorfAorICAgIHsKKyAgICAgICQkID0gTlVMTDsKKyAgICB9CisKK0Z1bmN0aW9uTGlzdDoKKyAgRnVuY3Rpb25MaXN0IEZ1bmN0aW9uCisgICAgeworICAgICAgcGRlYnVnKCJGdW5jdGlvbkxpc3QgLT4gRnVuY3Rpb25MaXN0IEZ1bmN0aW9uIik7CisgICAgICAkJCA9ICQxOworICAgICAgJDEtPmFkZF9mdW5jdGlvbigkMik7CisgICAgfQorfAorICAgIHsKKyAgICAgIHBkZWJ1ZygiRnVuY3Rpb25MaXN0IC0+ICIpOworICAgICAgJCQgPSBuZXcgdF9zZXJ2aWNlKGdfcHJvZ3JhbSk7CisgICAgfQorCitGdW5jdGlvbjoKKyAgQ2FwdHVyZURvY1RleHQgT25ld2F5IEZ1bmN0aW9uVHlwZSB0b2tfaWRlbnRpZmllciAnKCcgRmllbGRMaXN0ICcpJyBUaHJvd3MgVHlwZUFubm90YXRpb25zIENvbW1hT3JTZW1pY29sb25PcHRpb25hbAorICAgIHsKKyAgICAgIHZhbGlkYXRlX3NpbXBsZV9pZGVudGlmaWVyKCAkNCk7CisgICAgICAkNi0+c2V0X25hbWUoc3RkOjpzdHJpbmcoJDQpICsgIl9hcmdzIik7CisgICAgICAkJCA9IG5ldyB0X2Z1bmN0aW9uKCQzLCAkNCwgJDYsICQ4LCAkMik7CisgICAgICBpZiAoJDEgIT0gTlVMTCkgeworICAgICAgICAkJC0+c2V0X2RvYygkMSk7CisgICAgICB9CisgICAgICBpZiAoJDkgIT0gTlVMTCkgeworICAgICAgICAkJC0+YW5ub3RhdGlvbnNfID0gJDktPmFubm90YXRpb25zXzsKKyAgICAgICAgZGVsZXRlICQ5OworICAgICAgfQorICAgIH0KKworT25ld2F5OgorICB0b2tfb25ld2F5CisgICAgeworICAgICAgJCQgPSB0cnVlOworICAgIH0KK3wKKyAgICB7CisgICAgICAkJCA9IGZhbHNlOworICAgIH0KKworVGhyb3dzOgorICB0b2tfdGhyb3dzICcoJyBGaWVsZExpc3QgJyknCisgICAgeworICAgICAgcGRlYnVnKCJUaHJvd3MgLT4gdG9rX3Rocm93cyAoIEZpZWxkTGlzdCApIik7CisgICAgICAkJCA9ICQzOworICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNICYmICF2YWxpZGF0ZV90aHJvd3MoJCQpKSB7CisgICAgICAgIHl5ZXJyb3IoIlRocm93cyBjbGF1c2UgbWF5IG5vdCBjb250YWluIG5vbi1leGNlcHRpb24gdHlwZXMiKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICAgIH0KKyAgICB9Cit8CisgICAgeworICAgICAgJCQgPSBuZXcgdF9zdHJ1Y3QoZ19wcm9ncmFtKTsKKyAgICB9CisKK0ZpZWxkTGlzdDoKKyAgRmllbGRMaXN0IEZpZWxkCisgICAgeworICAgICAgcGRlYnVnKCJGaWVsZExpc3QgLT4gRmllbGRMaXN0ICwgRmllbGQiKTsKKyAgICAgICQkID0gJDE7CisgICAgICBpZiAoISgkJC0+YXBwZW5kKCQyKSkpIHsKKyAgICAgICAgeXllcnJvcigiXCIlZDogJXNcIiAtIGZpZWxkIGlkZW50aWZpZXIvbmFtZSBoYXMgYWxyZWFkeSBiZWVuIHVzZWQiLCAkMi0+Z2V0X2tleSgpLCAkMi0+Z2V0X25hbWUoKS5jX3N0cigpKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICAgIH0KKyAgICB9Cit8CisgICAgeworICAgICAgcGRlYnVnKCJGaWVsZExpc3QgLT4gIik7CisgICAgICB5X2ZpZWxkX3ZhbCA9IC0xOworICAgICAgJCQgPSBuZXcgdF9zdHJ1Y3QoZ19wcm9ncmFtKTsKKyAgICB9CisKK0ZpZWxkOgorICBDYXB0dXJlRG9jVGV4dCBGaWVsZElkZW50aWZpZXIgRmllbGRSZXF1aXJlZG5lc3MgRmllbGRUeXBlIEZpZWxkUmVmZXJlbmNlIHRva19pZGVudGlmaWVyIEZpZWxkVmFsdWUgWHNkT3B0aW9uYWwgWHNkTmlsbGFibGUgWHNkQXR0cmlidXRlcyBUeXBlQW5ub3RhdGlvbnMgQ29tbWFPclNlbWljb2xvbk9wdGlvbmFsCisgICAgeworICAgICAgcGRlYnVnKCJ0b2tfaW50X2NvbnN0YW50IDogRmllbGQgLT4gRmllbGRUeXBlIHRva19pZGVudGlmaWVyIik7CisgICAgICBpZiAoJDIuYXV0b19hc3NpZ25lZCkgeworICAgICAgICBwd2FybmluZygxLCAiTm8gZmllbGQga2V5IHNwZWNpZmllZCBmb3IgJXMsIHJlc3VsdGluZyBwcm90b2NvbCBtYXkgaGF2ZSBjb25mbGljdHMgb3Igbm90IGJlIGJhY2t3YXJkcyBjb21wYXRpYmxlIVxuIiwgJDYpOworICAgICAgICBpZiAoZ19zdHJpY3QgPj0gMTkyKSB7CisgICAgICAgICAgeXllcnJvcigiSW1wbGljaXQgZmllbGQga2V5cyBhcmUgZGVwcmVjYXRlZCBhbmQgbm90IGFsbG93ZWQgd2l0aCAtc3RyaWN0Iik7CisgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgdmFsaWRhdGVfc2ltcGxlX2lkZW50aWZpZXIoJDYpOworICAgICAgJCQgPSBuZXcgdF9maWVsZCgkNCwgJDYsICQyLnZhbHVlKTsKKyAgICAgICQkLT5zZXRfcmVmZXJlbmNlKCQ1KTsKKyAgICAgICQkLT5zZXRfcmVxKCQzKTsKKyAgICAgIGlmICgkNyAhPSBOVUxMKSB7CisgICAgICAgIGdfc2NvcGUtPnJlc29sdmVfY29uc3RfdmFsdWUoJDcsICQ0KTsKKyAgICAgICAgdmFsaWRhdGVfZmllbGRfdmFsdWUoJCQsICQ3KTsKKyAgICAgICAgJCQtPnNldF92YWx1ZSgkNyk7CisgICAgICB9CisgICAgICAkJC0+c2V0X3hzZF9vcHRpb25hbCgkOCk7CisgICAgICAkJC0+c2V0X3hzZF9uaWxsYWJsZSgkOSk7CisgICAgICBpZiAoJDEgIT0gTlVMTCkgeworICAgICAgICAkJC0+c2V0X2RvYygkMSk7CisgICAgICB9CisgICAgICBpZiAoJDEwICE9IE5VTEwpIHsKKyAgICAgICAgJCQtPnNldF94c2RfYXR0cnMoJDEwKTsKKyAgICAgIH0KKyAgICAgIGlmICgkMTEgIT0gTlVMTCkgeworICAgICAgICAkJC0+YW5ub3RhdGlvbnNfID0gJDExLT5hbm5vdGF0aW9uc187CisgICAgICAgIGRlbGV0ZSAkMTE7CisgICAgICB9CisgICAgfQorCitGaWVsZElkZW50aWZpZXI6CisgIHRva19pbnRfY29uc3RhbnQgJzonCisgICAgeworICAgICAgaWYgKCQxIDw9IDApIHsKKyAgICAgICAgaWYgKGdfYWxsb3dfbmVnX2ZpZWxkX2tleXMpIHsKKyAgICAgICAgICAvKgorICAgICAgICAgICAqIGdfYWxsb3dfbmVnX2ZpZWxkX2tleXMgZXhpc3RzIHRvIGFsbG93IHVzZXJzIHRvIGFkZCBleHBsaWNpdGx5CisgICAgICAgICAgICogc3BlY2lmaWVkIGtleSB2YWx1ZXMgdG8gb2xkIC50aHJpZnQgZmlsZXMgd2l0aG91dCBicmVha2luZworICAgICAgICAgICAqIHByb3RvY29sIGNvbXBhdGliaWxpdHkuCisgICAgICAgICAgICovCisgICAgICAgICAgaWYgKCQxICE9IHlfZmllbGRfdmFsKSB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogd2FybiBpZiB0aGUgdXNlci1zcGVjaWZpZWQgbmVnYXRpdmUgdmFsdWUgaXNuJ3Qgd2hhdAorICAgICAgICAgICAgICogdGhyaWZ0IHdvdWxkIGhhdmUgYXV0by1hc3NpZ25lZC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcHdhcm5pbmcoMSwgIk5vbnBvc2l0aXZlIGZpZWxkIGtleSAoJSIgUFJJaTY0IikgZGlmZmVycyBmcm9tIHdoYXQgd291bGQgYmUgIgorICAgICAgICAgICAgICAgICAgICAgImF1dG8tYXNzaWduZWQgYnkgdGhyaWZ0ICglZCkuXG4iLCAkMSwgeV9maWVsZF92YWwpOworICAgICAgICAgIH0KKyAgICAgICAgICAvKgorICAgICAgICAgICAqIExlYXZlICQxIGFzLWlzLCBhbmQgdXBkYXRlIHlfZmllbGRfdmFsIHRvIGJlIG9uZSBsZXNzIHRoYW4gJDEuCisgICAgICAgICAgICogVGhlIEZpZWxkTGlzdCBwYXJzaW5nIHdpbGwgY2F0Y2ggYW55IGR1cGxpY2F0ZSBrZXkgdmFsdWVzLgorICAgICAgICAgICAqLworICAgICAgICAgIHlfZmllbGRfdmFsID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oJDEgLSAxKTsKKyAgICAgICAgICAkJC52YWx1ZSA9IHN0YXRpY19jYXN0PGludDMyX3Q+KCQxKTsKKyAgICAgICAgICAkJC5hdXRvX2Fzc2lnbmVkID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcHdhcm5pbmcoMSwgIk5vbnBvc2l0aXZlIHZhbHVlICglZCkgbm90IGFsbG93ZWQgYXMgYSBmaWVsZCBrZXkuXG4iLAorICAgICAgICAgICAgICAgICAgICQxKTsKKyAgICAgICAgICAkJC52YWx1ZSA9IHlfZmllbGRfdmFsLS07CisgICAgICAgICAgJCQuYXV0b19hc3NpZ25lZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgICQkLnZhbHVlID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oJDEpOworICAgICAgICAkJC5hdXRvX2Fzc2lnbmVkID0gZmFsc2U7CisgICAgICB9CisgICAgICBpZiggKFNIUlRfTUlOID4gJCQudmFsdWUpIHx8ICgkJC52YWx1ZSA+IFNIUlRfTUFYKSkgeworICAgICAgICBwd2FybmluZygxLCAiRmllbGQga2V5ICglZCkgZXhjZWVkcyBhbGxvd2VkIHJhbmdlICglZC4uJWQpLlxuIiwKKyAgICAgICAgICAgICAgICAgJCQudmFsdWUsIFNIUlRfTUlOLCBTSFJUX01BWCk7CisgICAgICB9CisgICAgfQorfAorICAgIHsKKyAgICAgICQkLnZhbHVlID0geV9maWVsZF92YWwtLTsKKyAgICAgICQkLmF1dG9fYXNzaWduZWQgPSB0cnVlOworICAgICAgaWYoIChTSFJUX01JTiA+ICQkLnZhbHVlKSB8fCAoJCQudmFsdWUgPiBTSFJUX01BWCkpIHsKKyAgICAgICAgcHdhcm5pbmcoMSwgIkZpZWxkIGtleSAoJWQpIGV4Y2VlZHMgYWxsb3dlZCByYW5nZSAoJWQuLiVkKS5cbiIsCisgICAgICAgICAgICAgICAgICQkLnZhbHVlLCBTSFJUX01JTiwgU0hSVF9NQVgpOworICAgICAgfQorICAgIH0KKworRmllbGRSZWZlcmVuY2U6CisgIHRva19yZWZlcmVuY2UKKyAgICB7CisgICAgICAkJCA9IHRydWU7CisgICAgfQorfAorICAgeworICAgICAkJCA9IGZhbHNlOworICAgfQorCitGaWVsZFJlcXVpcmVkbmVzczoKKyAgdG9rX3JlcXVpcmVkCisgICAgeworICAgICAgJCQgPSB0X2ZpZWxkOjpUX1JFUVVJUkVEOworICAgIH0KK3wgdG9rX29wdGlvbmFsCisgICAgeworICAgICAgaWYgKGdfYXJnbGlzdCkgeworICAgICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKKyAgICAgICAgICBwd2FybmluZygxLCAib3B0aW9uYWwga2V5d29yZCBpcyBpZ25vcmVkIGluIGFyZ3VtZW50IGxpc3RzLlxuIik7CisgICAgICAgIH0KKyAgICAgICAgJCQgPSB0X2ZpZWxkOjpUX09QVF9JTl9SRVFfT1VUOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgJCQgPSB0X2ZpZWxkOjpUX09QVElPTkFMOworICAgICAgfQorICAgIH0KK3wKKyAgICB7CisgICAgICAkJCA9IHRfZmllbGQ6OlRfT1BUX0lOX1JFUV9PVVQ7CisgICAgfQorCitGaWVsZFZhbHVlOgorICAnPScgQ29uc3RWYWx1ZQorICAgIHsKKyAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgeworICAgICAgICAkJCA9ICQyOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgJCQgPSBOVUxMOworICAgICAgfQorICAgIH0KK3wKKyAgICB7CisgICAgICAkJCA9IE5VTEw7CisgICAgfQorCitGdW5jdGlvblR5cGU6CisgIEZpZWxkVHlwZQorICAgIHsKKyAgICAgIHBkZWJ1ZygiRnVuY3Rpb25UeXBlIC0+IEZpZWxkVHlwZSIpOworICAgICAgJCQgPSAkMTsKKyAgICB9Cit8IHRva192b2lkCisgICAgeworICAgICAgcGRlYnVnKCJGdW5jdGlvblR5cGUgLT4gdG9rX3ZvaWQiKTsKKyAgICAgICQkID0gZ190eXBlX3ZvaWQ7CisgICAgfQorCitGaWVsZFR5cGU6CisgIHRva19pZGVudGlmaWVyCisgICAgeworICAgICAgcGRlYnVnKCJGaWVsZFR5cGUgLT4gdG9rX2lkZW50aWZpZXIiKTsKKyAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gSU5DTFVERVMpIHsKKyAgICAgICAgLy8gSWdub3JlIGlkZW50aWZpZXJzIGluIGluY2x1ZGUgbW9kZQorICAgICAgICAkJCA9IE5VTEw7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBMb29rdXAgdGhlIGlkZW50aWZpZXIgaW4gdGhlIGN1cnJlbnQgc2NvcGUKKyAgICAgICAgJCQgPSBnX3Njb3BlLT5nZXRfdHlwZSgkMSk7CisgICAgICAgIGlmICgkJCA9PSBOVUxMKSB7CisgICAgICAgICAgLyoKKyAgICAgICAgICAgKiBFaXRoZXIgdGhpcyB0eXBlIGlzbid0IHlldCBkZWNsYXJlZCwgb3IgaXQncyBuZXZlcgorICAgICAgICAgICAgIGRlY2xhcmVkLiAgRWl0aGVyIHdheSBhbGxvdyBpdCBhbmQgd2UnbGwgZmlndXJlIGl0IG91dAorICAgICAgICAgICAgIGR1cmluZyBnZW5lcmF0aW9uLgorICAgICAgICAgICAqLworICAgICAgICAgICQkID0gbmV3IHRfdHlwZWRlZihnX3Byb2dyYW0sICQxLCB0cnVlKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KK3wgQmFzZVR5cGUKKyAgICB7CisgICAgICBwZGVidWcoIkZpZWxkVHlwZSAtPiBCYXNlVHlwZSIpOworICAgICAgJCQgPSAkMTsKKyAgICB9Cit8IENvbnRhaW5lclR5cGUKKyAgICB7CisgICAgICBwZGVidWcoIkZpZWxkVHlwZSAtPiBDb250YWluZXJUeXBlIik7CisgICAgICAkJCA9ICQxOworICAgIH0KKworQmFzZVR5cGU6IFNpbXBsZUJhc2VUeXBlIFR5cGVBbm5vdGF0aW9ucworICAgIHsKKyAgICAgIHBkZWJ1ZygiQmFzZVR5cGUgLT4gU2ltcGxlQmFzZVR5cGUgVHlwZUFubm90YXRpb25zIik7CisgICAgICBpZiAoJDIgIT0gTlVMTCkgeworICAgICAgICAkJCA9IG5ldyB0X2Jhc2VfdHlwZSgqc3RhdGljX2Nhc3Q8dF9iYXNlX3R5cGUqPigkMSkpOworICAgICAgICAkJC0+YW5ub3RhdGlvbnNfID0gJDItPmFubm90YXRpb25zXzsKKyAgICAgICAgZGVsZXRlICQyOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgJCQgPSAkMTsKKyAgICAgIH0KKyAgICB9CisKK1NpbXBsZUJhc2VUeXBlOgorICB0b2tfc3RyaW5nCisgICAgeworICAgICAgcGRlYnVnKCJCYXNlVHlwZSAtPiB0b2tfc3RyaW5nIik7CisgICAgICAkJCA9IGdfdHlwZV9zdHJpbmc7CisgICAgfQorfCB0b2tfYmluYXJ5CisgICAgeworICAgICAgcGRlYnVnKCJCYXNlVHlwZSAtPiB0b2tfYmluYXJ5Iik7CisgICAgICAkJCA9IGdfdHlwZV9iaW5hcnk7CisgICAgfQorfCB0b2tfc2xpc3QKKyAgICB7CisgICAgICBwZGVidWcoIkJhc2VUeXBlIC0+IHRva19zbGlzdCIpOworICAgICAgJCQgPSBnX3R5cGVfc2xpc3Q7CisgICAgfQorfCB0b2tfYm9vbAorICAgIHsKKyAgICAgIHBkZWJ1ZygiQmFzZVR5cGUgLT4gdG9rX2Jvb2wiKTsKKyAgICAgICQkID0gZ190eXBlX2Jvb2w7CisgICAgfQorfCB0b2tfaTgKKyAgICB7CisgICAgICBwZGVidWcoIkJhc2VUeXBlIC0+IHRva19pOCIpOworICAgICAgJCQgPSBnX3R5cGVfaTg7CisgICAgfQorfCB0b2tfaTE2CisgICAgeworICAgICAgcGRlYnVnKCJCYXNlVHlwZSAtPiB0b2tfaTE2Iik7CisgICAgICAkJCA9IGdfdHlwZV9pMTY7CisgICAgfQorfCB0b2tfaTMyCisgICAgeworICAgICAgcGRlYnVnKCJCYXNlVHlwZSAtPiB0b2tfaTMyIik7CisgICAgICAkJCA9IGdfdHlwZV9pMzI7CisgICAgfQorfCB0b2tfaTY0CisgICAgeworICAgICAgcGRlYnVnKCJCYXNlVHlwZSAtPiB0b2tfaTY0Iik7CisgICAgICAkJCA9IGdfdHlwZV9pNjQ7CisgICAgfQorfCB0b2tfZG91YmxlCisgICAgeworICAgICAgcGRlYnVnKCJCYXNlVHlwZSAtPiB0b2tfZG91YmxlIik7CisgICAgICAkJCA9IGdfdHlwZV9kb3VibGU7CisgICAgfQorCitDb250YWluZXJUeXBlOiBTaW1wbGVDb250YWluZXJUeXBlIFR5cGVBbm5vdGF0aW9ucworICAgIHsKKyAgICAgIHBkZWJ1ZygiQ29udGFpbmVyVHlwZSAtPiBTaW1wbGVDb250YWluZXJUeXBlIFR5cGVBbm5vdGF0aW9ucyIpOworICAgICAgJCQgPSAkMTsKKyAgICAgIGlmICgkMiAhPSBOVUxMKSB7CisgICAgICAgICQkLT5hbm5vdGF0aW9uc18gPSAkMi0+YW5ub3RhdGlvbnNfOworICAgICAgICBkZWxldGUgJDI7CisgICAgICB9CisgICAgfQorCitTaW1wbGVDb250YWluZXJUeXBlOgorICBNYXBUeXBlCisgICAgeworICAgICAgcGRlYnVnKCJTaW1wbGVDb250YWluZXJUeXBlIC0+IE1hcFR5cGUiKTsKKyAgICAgICQkID0gJDE7CisgICAgfQorfCBTZXRUeXBlCisgICAgeworICAgICAgcGRlYnVnKCJTaW1wbGVDb250YWluZXJUeXBlIC0+IFNldFR5cGUiKTsKKyAgICAgICQkID0gJDE7CisgICAgfQorfCBMaXN0VHlwZQorICAgIHsKKyAgICAgIHBkZWJ1ZygiU2ltcGxlQ29udGFpbmVyVHlwZSAtPiBMaXN0VHlwZSIpOworICAgICAgJCQgPSAkMTsKKyAgICB9CisKK01hcFR5cGU6CisgIHRva19tYXAgQ3BwVHlwZSAnPCcgRmllbGRUeXBlICcsJyBGaWVsZFR5cGUgJz4nCisgICAgeworICAgICAgcGRlYnVnKCJNYXBUeXBlIC0+IHRva19tYXAgPEZpZWxkVHlwZSwgRmllbGRUeXBlPiIpOworICAgICAgJCQgPSBuZXcgdF9tYXAoJDQsICQ2KTsKKyAgICAgIGlmICgkMiAhPSBOVUxMKSB7CisgICAgICAgICgodF9jb250YWluZXIqKSQkKS0+c2V0X2NwcF9uYW1lKHN0ZDo6c3RyaW5nKCQyKSk7CisgICAgICB9CisgICAgfQorCitTZXRUeXBlOgorICB0b2tfc2V0IENwcFR5cGUgJzwnIEZpZWxkVHlwZSAnPicKKyAgICB7CisgICAgICBwZGVidWcoIlNldFR5cGUgLT4gdG9rX3NldDxGaWVsZFR5cGU+Iik7CisgICAgICAkJCA9IG5ldyB0X3NldCgkNCk7CisgICAgICBpZiAoJDIgIT0gTlVMTCkgeworICAgICAgICAoKHRfY29udGFpbmVyKikkJCktPnNldF9jcHBfbmFtZShzdGQ6OnN0cmluZygkMikpOworICAgICAgfQorICAgIH0KKworTGlzdFR5cGU6CisgIHRva19saXN0ICc8JyBGaWVsZFR5cGUgJz4nIENwcFR5cGUKKyAgICB7CisgICAgICBwZGVidWcoIkxpc3RUeXBlIC0+IHRva19saXN0PEZpZWxkVHlwZT4iKTsKKyAgICAgIGNoZWNrX2Zvcl9saXN0X29mX2J5dGVzKCQzKTsKKyAgICAgICQkID0gbmV3IHRfbGlzdCgkMyk7CisgICAgICBpZiAoJDUgIT0gTlVMTCkgeworICAgICAgICAoKHRfY29udGFpbmVyKikkJCktPnNldF9jcHBfbmFtZShzdGQ6OnN0cmluZygkNSkpOworICAgICAgfQorICAgIH0KKworQ3BwVHlwZToKKyAgdG9rX2NwcF90eXBlIHRva19saXRlcmFsCisgICAgeworICAgICAgJCQgPSAkMjsKKyAgICB9Cit8CisgICAgeworICAgICAgJCQgPSBOVUxMOworICAgIH0KKworVHlwZUFubm90YXRpb25zOgorICAnKCcgVHlwZUFubm90YXRpb25MaXN0ICcpJworICAgIHsKKyAgICAgIHBkZWJ1ZygiVHlwZUFubm90YXRpb25zIC0+ICggVHlwZUFubm90YXRpb25MaXN0ICkiKTsKKyAgICAgICQkID0gJDI7CisgICAgfQorfAorICAgIHsKKyAgICAgICQkID0gTlVMTDsKKyAgICB9CisKK1R5cGVBbm5vdGF0aW9uTGlzdDoKKyAgVHlwZUFubm90YXRpb25MaXN0IFR5cGVBbm5vdGF0aW9uCisgICAgeworICAgICAgcGRlYnVnKCJUeXBlQW5ub3RhdGlvbkxpc3QgLT4gVHlwZUFubm90YXRpb25MaXN0ICwgVHlwZUFubm90YXRpb24iKTsKKyAgICAgICQkID0gJDE7CisgICAgICAkJC0+YW5ub3RhdGlvbnNfWyQyLT5rZXldID0gJDItPnZhbDsKKyAgICAgIGRlbGV0ZSAkMjsKKyAgICB9Cit8CisgICAgeworICAgICAgLyogSnVzdCB1c2UgYSBkdW1teSBzdHJ1Y3R1cmUgdG8gaG9sZCB0aGUgYW5ub3RhdGlvbnMuICovCisgICAgICAkJCA9IG5ldyB0X3N0cnVjdChnX3Byb2dyYW0pOworICAgIH0KKworVHlwZUFubm90YXRpb246CisgIHRva19pZGVudGlmaWVyIFR5cGVBbm5vdGF0aW9uVmFsdWUgQ29tbWFPclNlbWljb2xvbk9wdGlvbmFsCisgICAgeworICAgICAgcGRlYnVnKCJUeXBlQW5ub3RhdGlvbiAtPiBUeXBlQW5ub3RhdGlvblZhbHVlIik7CisgICAgICAkJCA9IG5ldyB0X2Fubm90YXRpb247CisgICAgICAkJC0+a2V5ID0gJDE7CisgICAgICAkJC0+dmFsID0gJDI7CisgICAgfQorCitUeXBlQW5ub3RhdGlvblZhbHVlOgorICAnPScgdG9rX2xpdGVyYWwKKyAgICB7CisgICAgICBwZGVidWcoIlR5cGVBbm5vdGF0aW9uVmFsdWUgLT4gPSB0b2tfbGl0ZXJhbCIpOworICAgICAgJCQgPSAkMjsKKyAgICB9Cit8CisgICAgeworICAgICAgcGRlYnVnKCJUeXBlQW5ub3RhdGlvblZhbHVlIC0+Iik7CisgICAgICAkJCA9IHN0cmR1cCgiMSIpOworICAgIH0KKworJSUKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3ZlcnNpb24uaC5pbiBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3ZlcnNpb24uaC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWYwNzZmCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvdmVyc2lvbi5oLmluCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1ZFUlNJT05fSF8KKyNkZWZpbmUgX1RIUklGVF9WRVJTSU9OX0hfIDEKKworI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+IDEyMDApCisjcHJhZ21hIG9uY2UKKyNlbmRpZiAvLyBfTVNDX1ZFUgorCisjZGVmaW5lIFRIUklGVF9WRVJTSU9OICJAUEFDS0FHRV9WRVJTSU9OQCIKKworI2VuZGlmIC8vIF9USFJJRlRfVkVSU0lPTl9IXwpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9jb25maWcuaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIyNjljZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvY29uZmlnLmgKQEAgLTAsMCArMSw3MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfV0lORE9XU19DT05GSUdfSF8KKyNkZWZpbmUgX1RIUklGVF9XSU5ET1dTX0NPTkZJR19IXyAxCisKKyNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPiAxMjAwKQorI3ByYWdtYSBvbmNlCisjZW5kaWYgLy8gX01TQ19WRVIKKworI2lmbmRlZiBfV0lOMzIKKyNlcnJvciAiVGhpcyBpcyBhIFdpbmRvd3MgaGVhZGVyIG9ubHkiCisjZW5kaWYKKworI2luY2x1ZGUgPGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZGlyZWN0Lmg+CisKKyNkZWZpbmUgc3RydG9sbChiZWdpbl9wdHIsIGVuZF9wdHIsIGxlbmd0aCkgX3N0cnRvaTY0KGJlZ2luX3B0ciwgZW5kX3B0ciwgbGVuZ3RoKQorCisjaWZuZGVmIFBSSXU2NAorI2RlZmluZSBQUkl1NjQgIkk2NHUiCisjZW5kaWYKKworI2lmbmRlZiBQUklpNjQKKyNkZWZpbmUgUFJJaTY0ICJJNjRpIgorI2VuZGlmCisvLyBzcXVlbGNoIGRlcHJlY2F0aW9uIHdhcm5pbmdzCisjcHJhZ21hIHdhcm5pbmcoZGlzYWJsZSA6IDQ5OTYpCisvLyBzcXVlbGNoIGJvb2wgY29udmVyc2lvbiBwZXJmb3JtYW5jZSB3YXJuaW5nCisjcHJhZ21hIHdhcm5pbmcoZGlzYWJsZSA6IDQ4MDApCisKKy8vIE1TVkMxMCAoMjAxMCkgb3IgbGF0ZXIgaGFzIHN0ZGludC5oCisjaWYgX01TQ19WRVIgPj0gMTYwMAorI2RlZmluZSBIQVZFX1NURElOVF9IIDEKKyNlbmRpZgorCisvLyBNdXN0IGJlIHVzaW5nIFZTMjAxMCBvciBsYXRlciwgb3IgYm9vc3QsIHNvIHRoYXQgQzk5IHR5cGVzIGFyZSBkZWZpbmVkIGluIHRoZSBnbG9iYWwgbmFtZXNwYWNlCisjaWZkZWYgSEFWRV9TVERJTlRfSAorI2luY2x1ZGUgPHN0ZGludC5oPgorI2Vsc2UKKyNpbmNsdWRlIDxib29zdC9jc3RkaW50LmhwcD4KKwordHlwZWRlZiBib29zdDo6aW50NjRfdCBpbnQ2NF90OwordHlwZWRlZiBib29zdDo6dWludDY0X3QgdWludDY0X3Q7Cit0eXBlZGVmIGJvb3N0OjppbnQzMl90IGludDMyX3Q7Cit0eXBlZGVmIGJvb3N0Ojp1aW50MzJfdCB1aW50MzJfdDsKK3R5cGVkZWYgYm9vc3Q6OmludDE2X3QgaW50MTZfdDsKK3R5cGVkZWYgYm9vc3Q6OnVpbnQxNl90IHVpbnQxNl90OwordHlwZWRlZiBib29zdDo6aW50OF90IGludDhfdDsKK3R5cGVkZWYgYm9vc3Q6OnVpbnQ4X3QgdWludDhfdDsKKyNlbmRpZgorCisjZW5kaWYgLy8gX1RIUklGVF9XSU5ET1dTX0NPTkZJR19IXwpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnRsLmxsIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnRsLmxsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWZjNjAxLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0bC5sbAorKysgL2Rldi9udWxsCkBAIC0xLDQxNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogVGhyaWZ0IHNjYW5uZXIuCi0gKgotICogVG9rZW5pemVzIGEgdGhyaWZ0IGRlZmluaXRpb24gZmlsZS4KLSAqLwotCi0lewotCi0vKiBUaGlzIGlzIHJlZHVuZGFudCB3aXRoIHNvbWUgb2YgdGhlIGZsYWdzIGluIE1ha2VmaWxlLmFtLCBidXQgaXQgd29ya3MKLSAqIHdoZW4gcGVvcGxlIG92ZXJyaWRlIENYWEZMQUdTIHdpdGhvdXQgYmVpbmcgY2FyZWZ1bC4gVGhlIHByYWdtYXMgYXJlCi0gKiB0aGUgJ3JpZ2h0JyB3YXkgdG8gZG8gaXQsIGJ1dCBkb24ndCB3b3JrIG9uIG9sZC1lbm91Z2ggR0NDIChpbiBwYXJ0aWN1bGFyCi0gKiB0aGUgR0NDIHRoYXQgc2hpcCBvbiBNYWMgT1MgWCAxMC42LjUsICpjb3VudGVyKiB0byB3aGF0IHRoZSBHTlUgZG9jcyBzYXkpCi0gKgotICogV2Ugc2hvdWxkIHJldmVydCB0aGUgTWFrZWZpbGUuYW0gY2hhbmdlcyBvbmNlIEFwcGxlIHNoaXBzIGEgcmVhc29uYWJsZQotICogR0NDLgotICovCi0jaWZkZWYgX19HTlVDX18KLSNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVd1bnVzZWQtZnVuY3Rpb24iCi0jcHJhZ21hIEdDQyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XdW51c2VkLWxhYmVsIgotI2VuZGlmCi0KLSNpZmRlZiBfTVNDX1ZFUgotLy93YXJuaW5nIEM0MTAyOiAnZmluZF9ydWxlJyA6IHVucmVmZXJlbmNlZCBsYWJlbAotI3ByYWdtYSB3YXJuaW5nKGRpc2FibGU6NDEwMikKLS8vYXZvaWQgaXNhdHR5IHJlZGVmaW5pdGlvbgotI2RlZmluZSBZWV9ORVZFUl9JTlRFUkFDVElWRSAxCi0jZW5kaWYKLQotI2luY2x1ZGUgPGNhc3NlcnQ+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLSNpZmRlZiBfTVNDX1ZFUgotI2luY2x1ZGUgIndpbmRvd3MvY29uZmlnLmgiCi0jZW5kaWYKLSNpbmNsdWRlICJtYWluLmgiCi0jaW5jbHVkZSAiZ2xvYmFscy5oIgotI2luY2x1ZGUgInBhcnNlL3RfcHJvZ3JhbS5oIgotCi0vKioKLSAqIE11c3QgYmUgaW5jbHVkZWQgQUZURVIgcGFyc2UvdF9wcm9ncmFtLmgsIGJ1dCBJIGNhbid0IHJlbWVtYmVyIHdoeSBhbnltb3JlCi0gKiBiZWNhdXNlIEkgd3JvdGUgdGhpcyBhIHdoaWxlIGFnby4KLSAqLwotI2lmIGRlZmluZWQoQklTT05fVVNFX1BBUlNFUl9IX0VYVEVOU0lPTikKLSNpbmNsdWRlICJ0aHJpZnR5LmgiCi0jZWxzZQotI2luY2x1ZGUgInRocmlmdHkuaGgiCi0jZW5kaWYKLQotdm9pZCB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZChjaGFyKiBrZXl3b3JkKSB7Ci0gIHl5ZXJyb3IoIkNhbm5vdCB1c2UgcmVzZXJ2ZWQgbGFuZ3VhZ2Uga2V5d29yZDogXCIlc1wiXG4iLCBrZXl3b3JkKTsKLSAgZXhpdCgxKTsKLX0KLQotdm9pZCBpbnRlZ2VyX292ZXJmbG93KGNoYXIqIHRleHQpIHsKLSAgeXllcnJvcigiVGhpcyBpbnRlZ2VyIGlzIHRvbyBiaWc6IFwiJXNcIlxuIiwgdGV4dCk7Ci0gIGV4aXQoMSk7Ci19Ci0KLXZvaWQgdW5leHBlY3RlZF90b2tlbihjaGFyKiB0ZXh0KSB7Ci0gIHl5ZXJyb3IoIlVuZXhwZWN0ZWQgdG9rZW4gaW4gaW5wdXQ6IFwiJXNcIlxuIiwgdGV4dCk7Ci0gIGV4aXQoMSk7Ci19Ci0KLSV9Ci0KLS8qKgotICogUHJvdmlkZXMgdGhlIHl5bGluZW5vIGdsb2JhbCwgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgb3V0cHV0Ci0gKi8KLSVvcHRpb24gbGV4LWNvbXBhdAotCi0vKioKLSAqIE91ciBpbnB1dHMgYXJlIGFsbCBzaW5nbGUgZmlsZXMsIHNvIG5vIG5lZWQgZm9yIHl5d3JhcAotICovCi0lb3B0aW9uIG5veXl3cmFwCi0KLS8qKgotICogV2UgZG9uJ3QgdXNlIGl0LCBhbmQgaXQgZmlyZXMgdXAgd2FybmluZ3MgYXQgLVdhbGwKLSAqLwotJW9wdGlvbiBub3VucHV0Ci0KLS8qKgotICogSGVscGVyIGRlZmluaXRpb25zLCBjb21tZW50cywgY29uc3RhbnRzLCBhbmQgd2hhdG5vdAotICovCi0KLWludGNvbnN0YW50ICAgKFsrLV0/WzAtOV0rKQotaGV4Y29uc3RhbnQgICAoIjB4IlswLTlBLUZhLWZdKykKLWR1YmNvbnN0YW50ICAgKFsrLV0/WzAtOV0qKFwuWzAtOV0rKT8oW2VFXVsrLV0/WzAtOV0rKT8pCi1pZGVudGlmaWVyICAgIChbYS16QS1aX10oXC5bYS16QS1aXzAtOV18W2EtekEtWl8wLTldKSopCi13aGl0ZXNwYWNlICAgIChbIFx0XHJcbl0qKQotc2lsbHljb21tICAgICAoIi8qIiIqIioiKi8iKQotbXVsdGljb21tICAgICAoIi8qIlteKl0iLyIqKFteKi9dfFteKl0iLyJ8IioiW14vXSkqIioiKiIqLyIpCi1kb2N0ZXh0ICAgICAgICgiLyoqIihbXiovXXxbXipdIi8ifCIqIlteL10pKiIqIioiKi8iKQotY29tbWVudCAgICAgICAoIi8vIlteXG5dKikKLXVuaXhjb21tZW50ICAgKCIjIlteXG5dKikKLXN5bWJvbCAgICAgICAgKFs6O1wsXHtcfVwoXClcPTw+XFtcXV0pCi1zdF9pZGVudGlmaWVyIChbYS16QS1aLV0oXC5bYS16QS1aXzAtOS1dfFthLXpBLVpfMC05LV0pKikKLWxpdGVyYWxfYmVnaW4gKFsnXCJdKQotCi0lJQotCi17d2hpdGVzcGFjZX0gICAgICAgICB7IC8qIGRvIG5vdGhpbmcgKi8gICAgICAgICAgICAgICAgIH0KLXtzaWxseWNvbW19ICAgICAgICAgIHsgLyogZG8gbm90aGluZyAqLyAgICAgICAgICAgICAgICAgfQote211bHRpY29tbX0gICAgICAgICAgeyAvKiBkbyBub3RoaW5nICovICAgICAgICAgICAgICAgICB9Ci17Y29tbWVudH0gICAgICAgICAgICB7IC8qIGRvIG5vdGhpbmcgKi8gICAgICAgICAgICAgICAgIH0KLXt1bml4Y29tbWVudH0gICAgICAgIHsgLyogZG8gbm90aGluZyAqLyAgICAgICAgICAgICAgICAgfQotCi17c3ltYm9sfSAgICAgICAgICAgICB7IHJldHVybiB5eXRleHRbMF07ICAgICAgICAgICAgICAgIH0KLSIqIiAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIHl5dGV4dFswXTsgICAgICAgICAgICAgICAgfQotCi0iZmFsc2UiICAgICAgICAgICAgICB7IHl5bHZhbC5pY29uc3Q9MDsgcmV0dXJuIHRva19pbnRfY29uc3RhbnQ7IH0KLSJ0cnVlIiAgICAgICAgICAgICAgIHsgeXlsdmFsLmljb25zdD0xOyByZXR1cm4gdG9rX2ludF9jb25zdGFudDsgfQotCi0ibmFtZXNwYWNlIiAgICAgICAgICB7IHJldHVybiB0b2tfbmFtZXNwYWNlOyAgICAgICAgICAgIH0KLSJjcHBfbmFtZXNwYWNlIiAgICAgIHsgcmV0dXJuIHRva19jcHBfbmFtZXNwYWNlOyAgICAgICAgfQotImNwcF9pbmNsdWRlIiAgICAgICAgeyByZXR1cm4gdG9rX2NwcF9pbmNsdWRlOyAgICAgICAgICB9Ci0iY3BwX3R5cGUiICAgICAgICAgICB7IHJldHVybiB0b2tfY3BwX3R5cGU7ICAgICAgICAgICAgIH0KLSJqYXZhX3BhY2thZ2UiICAgICAgIHsgcmV0dXJuIHRva19qYXZhX3BhY2thZ2U7ICAgICAgICAgfQotImNvY29hX3ByZWZpeCIgICAgICAgeyByZXR1cm4gdG9rX2NvY29hX3ByZWZpeDsgICAgICAgICB9Ci0iY3NoYXJwX25hbWVzcGFjZSIgICB7IHJldHVybiB0b2tfY3NoYXJwX25hbWVzcGFjZTsgICAgIH0KLSJkZWxwaGlfbmFtZXNwYWNlIiAgIHsgcmV0dXJuIHRva19kZWxwaGlfbmFtZXNwYWNlOyAgICAgfQotInBocF9uYW1lc3BhY2UiICAgICAgeyByZXR1cm4gdG9rX3BocF9uYW1lc3BhY2U7ICAgICAgICB9Ci0icHlfbW9kdWxlIiAgICAgICAgICB7IHJldHVybiB0b2tfcHlfbW9kdWxlOyAgICAgICAgICAgIH0KLSJwZXJsX3BhY2thZ2UiICAgICAgIHsgcmV0dXJuIHRva19wZXJsX3BhY2thZ2U7ICAgICAgICAgfQotInJ1YnlfbmFtZXNwYWNlIiAgICAgeyByZXR1cm4gdG9rX3J1YnlfbmFtZXNwYWNlOyAgICAgICB9Ci0ic21hbGx0YWxrX2NhdGVnb3J5IiB7IHJldHVybiB0b2tfc21hbGx0YWxrX2NhdGVnb3J5OyAgIH0KLSJzbWFsbHRhbGtfcHJlZml4IiAgIHsgcmV0dXJuIHRva19zbWFsbHRhbGtfcHJlZml4OyAgICAgfQotInhzZF9hbGwiICAgICAgICAgICAgeyByZXR1cm4gdG9rX3hzZF9hbGw7ICAgICAgICAgICAgICB9Ci0ieHNkX29wdGlvbmFsIiAgICAgICB7IHJldHVybiB0b2tfeHNkX29wdGlvbmFsOyAgICAgICAgIH0KLSJ4c2RfbmlsbGFibGUiICAgICAgIHsgcmV0dXJuIHRva194c2RfbmlsbGFibGU7ICAgICAgICAgfQotInhzZF9uYW1lc3BhY2UiICAgICAgeyByZXR1cm4gdG9rX3hzZF9uYW1lc3BhY2U7ICAgICAgICB9Ci0ieHNkX2F0dHJzIiAgICAgICAgICB7IHJldHVybiB0b2tfeHNkX2F0dHJzOyAgICAgICAgICAgIH0KLSJpbmNsdWRlIiAgICAgICAgICAgIHsgcmV0dXJuIHRva19pbmNsdWRlOyAgICAgICAgICAgICAgfQotInZvaWQiICAgICAgICAgICAgICAgeyByZXR1cm4gdG9rX3ZvaWQ7ICAgICAgICAgICAgICAgICB9Ci0iYm9vbCIgICAgICAgICAgICAgICB7IHJldHVybiB0b2tfYm9vbDsgICAgICAgICAgICAgICAgIH0KLSJieXRlIiAgICAgICAgICAgICAgIHsgcmV0dXJuIHRva19ieXRlOyAgICAgICAgICAgICAgICAgfQotImkxNiIgICAgICAgICAgICAgICAgeyByZXR1cm4gdG9rX2kxNjsgICAgICAgICAgICAgICAgICB9Ci0iaTMyIiAgICAgICAgICAgICAgICB7IHJldHVybiB0b2tfaTMyOyAgICAgICAgICAgICAgICAgIH0KLSJpNjQiICAgICAgICAgICAgICAgIHsgcmV0dXJuIHRva19pNjQ7ICAgICAgICAgICAgICAgICAgfQotImRvdWJsZSIgICAgICAgICAgICAgeyByZXR1cm4gdG9rX2RvdWJsZTsgICAgICAgICAgICAgICB9Ci0ic3RyaW5nIiAgICAgICAgICAgICB7IHJldHVybiB0b2tfc3RyaW5nOyAgICAgICAgICAgICAgIH0KLSJiaW5hcnkiICAgICAgICAgICAgIHsgcmV0dXJuIHRva19iaW5hcnk7ICAgICAgICAgICAgICAgfQotInNsaXN0IiB7Ci0gIHB3YXJuaW5nKDAsICJcInNsaXN0XCIgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIGNvbXBpbGVyIHZlcnNpb24uICBUaGlzIHR5cGUgc2hvdWxkIGJlIHJlcGxhY2VkIHdpdGggXCJzdHJpbmdcIi5cbiIpOwotICByZXR1cm4gdG9rX3NsaXN0OwotfQotInNlbnVtIiB7Ci0gIHB3YXJuaW5nKDAsICJcInNlbnVtXCIgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIGNvbXBpbGVyIHZlcnNpb24uICBUaGlzIHR5cGUgc2hvdWxkIGJlIHJlcGxhY2VkIHdpdGggXCJzdHJpbmdcIi5cbiIpOwotICByZXR1cm4gdG9rX3NlbnVtOwotfQotIm1hcCIgICAgICAgICAgICAgICAgeyByZXR1cm4gdG9rX21hcDsgICAgICAgICAgICAgICAgICB9Ci0ibGlzdCIgICAgICAgICAgICAgICB7IHJldHVybiB0b2tfbGlzdDsgICAgICAgICAgICAgICAgIH0KLSJzZXQiICAgICAgICAgICAgICAgIHsgcmV0dXJuIHRva19zZXQ7ICAgICAgICAgICAgICAgICAgfQotIm9uZXdheSIgICAgICAgICAgICAgeyByZXR1cm4gdG9rX29uZXdheTsgICAgICAgICAgICAgICB9Ci0idHlwZWRlZiIgICAgICAgICAgICB7IHJldHVybiB0b2tfdHlwZWRlZjsgICAgICAgICAgICAgIH0KLSJzdHJ1Y3QiICAgICAgICAgICAgIHsgcmV0dXJuIHRva19zdHJ1Y3Q7ICAgICAgICAgICAgICAgfQotInVuaW9uIiAgICAgICAgICAgICAgeyByZXR1cm4gdG9rX3VuaW9uOyAgICAgICAgICAgICAgICB9Ci0iZXhjZXB0aW9uIiAgICAgICAgICB7IHJldHVybiB0b2tfeGNlcHRpb247ICAgICAgICAgICAgIH0KLSJleHRlbmRzIiAgICAgICAgICAgIHsgcmV0dXJuIHRva19leHRlbmRzOyAgICAgICAgICAgICAgfQotInRocm93cyIgICAgICAgICAgICAgeyByZXR1cm4gdG9rX3Rocm93czsgICAgICAgICAgICAgICB9Ci0ic2VydmljZSIgICAgICAgICAgICB7IHJldHVybiB0b2tfc2VydmljZTsgICAgICAgICAgICAgIH0KLSJlbnVtIiAgICAgICAgICAgICAgIHsgcmV0dXJuIHRva19lbnVtOyAgICAgICAgICAgICAgICAgfQotImNvbnN0IiAgICAgICAgICAgICAgeyByZXR1cm4gdG9rX2NvbnN0OyAgICAgICAgICAgICAgICB9Ci0icmVxdWlyZWQiICAgICAgICAgICB7IHJldHVybiB0b2tfcmVxdWlyZWQ7ICAgICAgICAgICAgIH0KLSJvcHRpb25hbCIgICAgICAgICAgIHsgcmV0dXJuIHRva19vcHRpb25hbDsgICAgICAgICAgICAgfQotImFzeW5jIiB7Ci0gIHB3YXJuaW5nKDAsICJcImFzeW5jXCIgaXMgZGVwcmVjYXRlZC4gIEl0IGlzIGNhbGxlZCBcIm9uZXdheVwiIG5vdy5cbiIpOwotICByZXR1cm4gdG9rX29uZXdheTsKLX0KLSImIiAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIHRva19yZWZlcmVuY2U7ICAgICAgICAgICAgfQotCi0KLSJCRUdJTiIgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotIkVORCIgICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iX19DTEFTU19fIiAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJfX0RJUl9fIiAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotIl9fRklMRV9fIiAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iX19GVU5DVElPTl9fIiAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJfX0xJTkVfXyIgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotIl9fTUVUSE9EX18iICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iX19OQU1FU1BBQ0VfXyIgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJhYnN0cmFjdCIgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImFsaWFzIiAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iYW5kIiAgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJhcmdzIiAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImFzIiAgICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iYXNzZXJ0IiAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJiZWdpbiIgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImJyZWFrIiAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iY2FzZSIgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJjYXRjaCIgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImNsYXNzIiAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iY2xvbmUiICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJjb250aW51ZSIgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImRlY2xhcmUiICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZGVmIiAgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJkZWZhdWx0IiAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImRlbCIgICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZGVsZXRlIiAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJkbyIgICAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImR5bmFtaWMiICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZWxpZiIgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJlbHNlIiAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImVsc2VpZiIgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZWxzaWYiICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJlbmQiICAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImVuZGRlY2xhcmUiICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZW5kZm9yIiAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJlbmRmb3JlYWNoIiAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImVuZGlmIiAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZW5kc3dpdGNoIiAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJlbmR3aGlsZSIgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImVuc3VyZSIgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZXhjZXB0IiAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJleGVjIiAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImZpbmFsbHkiICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZmxvYXQiICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJmb3IiICAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImZvcmVhY2giICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZnVuY3Rpb24iICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJnbG9iYWwiICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImdvdG8iICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iaWYiICAgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJpbXBsZW1lbnRzIiAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImltcG9ydCIgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iaW4iICAgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJpbmxpbmUiICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImluc3RhbmNlb2YiICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iaW50ZXJmYWNlIiAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJpcyIgICAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImxhbWJkYSIgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0ibW9kdWxlIiAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJuYXRpdmUiICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotIm5ldyIgICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0ibmV4dCIgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJuaWwiICAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotIm5vdCIgICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0ib3IiICAgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJwYXNzIiAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInB1YmxpYyIgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0icHJpbnQiICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJwcml2YXRlIiAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInByb3RlY3RlZCIgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0icHVibGljIiAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJyYWlzZSIgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInJlZG8iICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0icmVzY3VlIiAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJyZXRyeSIgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInJlZ2lzdGVyIiAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0icmV0dXJuIiAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJzZWxmIiAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInNpemVvZiIgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0ic3RhdGljIiAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJzdXBlciIgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInN3aXRjaCIgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0ic3luY2hyb25pemVkIiAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJ0aGVuIiAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInRoaXMiICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0idGhyb3ciICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJ0cmFuc2llbnQiICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInRyeSIgICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0idW5kZWYiICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJ1bmlvbiIgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInVubGVzcyIgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0idW5zaWduZWQiICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJ1bnRpbCIgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInVzZSIgICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0idmFyIiAgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJ2aXJ0dWFsIiAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInZvbGF0aWxlIiAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0id2hlbiIgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJ3aGlsZSIgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotIndpdGgiICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0ieG9yIiAgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJ5aWVsZCIgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotCi17aW50Y29uc3RhbnR9IHsKLSAgZXJybm8gPSAwOwotICB5eWx2YWwuaWNvbnN0ID0gc3RydG9sbCh5eXRleHQsIE5VTEwsIDEwKTsKLSAgaWYgKGVycm5vID09IEVSQU5HRSkgewotICAgIGludGVnZXJfb3ZlcmZsb3coeXl0ZXh0KTsKLSAgfQotICByZXR1cm4gdG9rX2ludF9jb25zdGFudDsKLX0KLQote2hleGNvbnN0YW50fSB7Ci0gIGVycm5vID0gMDsKLSAgeXlsdmFsLmljb25zdCA9IHN0cnRvbGwoeXl0ZXh0KzIsIE5VTEwsIDE2KTsKLSAgaWYgKGVycm5vID09IEVSQU5HRSkgewotICAgIGludGVnZXJfb3ZlcmZsb3coeXl0ZXh0KTsKLSAgfQotICByZXR1cm4gdG9rX2ludF9jb25zdGFudDsKLX0KLQote2R1YmNvbnN0YW50fSB7Ci0gIHl5bHZhbC5kY29uc3QgPSBhdG9mKHl5dGV4dCk7Ci0gIHJldHVybiB0b2tfZHViX2NvbnN0YW50OwotfQotCi17aWRlbnRpZmllcn0gewotICB5eWx2YWwuaWQgPSBzdHJkdXAoeXl0ZXh0KTsKLSAgcmV0dXJuIHRva19pZGVudGlmaWVyOwotfQotCi17c3RfaWRlbnRpZmllcn0gewotICB5eWx2YWwuaWQgPSBzdHJkdXAoeXl0ZXh0KTsKLSAgcmV0dXJuIHRva19zdF9pZGVudGlmaWVyOwotfQotCi17bGl0ZXJhbF9iZWdpbn0gewotICBjaGFyIG1hcmsgPSB5eXRleHRbMF07Ci0gIHN0ZDo6c3RyaW5nIHJlc3VsdDsKLSAgZm9yKDs7KQotICB7Ci0gICAgaW50IGNoID0geXlpbnB1dCgpOwotICAgIHN3aXRjaCAoY2gpIHsKLSAgICAgIGNhc2UgRU9GOgotICAgICAgICB5eWVycm9yKCJFbmQgb2YgZmlsZSB3aGlsZSByZWFkIHN0cmluZyBhdCAlZFxuIiwgeXlsaW5lbm8pOwotICAgICAgICBleGl0KDEpOwotICAgICAgY2FzZSAnXG4nOgotICAgICAgICB5eWVycm9yKCJFbmQgb2YgbGluZSB3aGlsZSByZWFkIHN0cmluZyBhdCAlZFxuIiwgeXlsaW5lbm8gLSAxKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICAgIGNhc2UgJ1xcJzoKLSAgICAgICAgY2ggPSB5eWlucHV0KCk7Ci0gICAgICAgIHN3aXRjaCAoY2gpIHsKLSAgICAgICAgICBjYXNlICdyJzoKLSAgICAgICAgICAgIHJlc3VsdC5wdXNoX2JhY2soJ1xyJyk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICBjYXNlICduJzoKLSAgICAgICAgICAgIHJlc3VsdC5wdXNoX2JhY2soJ1xuJyk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICBjYXNlICd0JzoKLSAgICAgICAgICAgIHJlc3VsdC5wdXNoX2JhY2soJ1x0Jyk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICBjYXNlICciJzoKLSAgICAgICAgICAgIHJlc3VsdC5wdXNoX2JhY2soJyInKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgIGNhc2UgJ1wnJzoKLSAgICAgICAgICAgIHJlc3VsdC5wdXNoX2JhY2soJ1wnJyk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICBjYXNlICdcXCc6Ci0gICAgICAgICAgICByZXN1bHQucHVzaF9iYWNrKCdcXCcpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHl5ZXJyb3IoIkJhZCBlc2NhcGUgY2hhcmFjdGVyXG4iKTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGlmIChjaCA9PSBtYXJrKSB7Ci0gICAgICAgICAgeXlsdmFsLmlkID0gc3RyZHVwKHJlc3VsdC5jX3N0cigpKTsKLSAgICAgICAgICByZXR1cm4gdG9rX2xpdGVyYWw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgcmVzdWx0LnB1c2hfYmFjayhjaCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotCi17ZG9jdGV4dH0gewotIC8qIFRoaXMgZG9lcyBub3Qgc2hvdyB1cCBpbiB0aGUgcGFyc2UgdHJlZS4gKi8KLSAvKiBSYXRoZXIsIHRoZSBwYXJzZXIgd2lsbCBncmFiIGl0IG91dCBvZiB0aGUgZ2xvYmFsLiAqLwotICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICBjbGVhcl9kb2N0ZXh0KCk7Ci0gICAgZ19kb2N0ZXh0ID0gc3RyZHVwKHl5dGV4dCArIDMpOwotICAgIGFzc2VydChzdHJsZW4oZ19kb2N0ZXh0KSA+PSAyKTsKLSAgICBnX2RvY3RleHRbc3RybGVuKGdfZG9jdGV4dCkgLSAyXSA9ICcgJzsKLSAgICBnX2RvY3RleHRbc3RybGVuKGdfZG9jdGV4dCkgLSAxXSA9ICdcMCc7Ci0gICAgZ19kb2N0ZXh0ID0gY2xlYW5fdXBfZG9jdGV4dChnX2RvY3RleHQpOwotICAgIGdfZG9jdGV4dF9saW5lbm8gPSB5eWxpbmVubzsKLSAgICBpZiggKGdfcHJvZ3JhbV9kb2N0ZXh0X2NhbmRpZGF0ZSA9PSBOVUxMKSAmJiAoZ19wcm9ncmFtX2RvY3RleHRfc3RhdHVzID09IElOVkFMSUQpKXsKLSAgICAgIGdfcHJvZ3JhbV9kb2N0ZXh0X2NhbmRpZGF0ZSA9IHN0cmR1cChnX2RvY3RleHQpOwotICAgICAgZ19wcm9ncmFtX2RvY3RleHRfbGluZW5vID0gZ19kb2N0ZXh0X2xpbmVubzsKLSAgICAgIGdfcHJvZ3JhbV9kb2N0ZXh0X3N0YXR1cyA9IFNUSUxMX0NBTkRJREFURTsKLSAgICAgIHBkZWJ1ZygiJXMiLCJwcm9ncmFtIGRvY3RleHQgc2V0IHRvIFNUSUxMX0NBTkRJREFURSIpOwotICAgIH0KLSAgfQotfQotCi0uIHsKLSAgdW5leHBlY3RlZF90b2tlbih5eXRleHQpOwotfQotCi0KLS4gewotICAvKiBDYXRjaC1hbGwgdG8gbGV0IHVzIGNhdGNoICIqIiBpbiB0aGUgcGFyc2VyLiAqLwotICByZXR1cm4gKGludCkgeXl0ZXh0WzBdOwotfQotCi0lJQotCi0vKiB2aW06IGZpbGV0eXBlPWxleAotKi8KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0eS55eSBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0eS55eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY3ZGM2NC4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL3RocmlmdHkueXkKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEyICswLDAgQEAKLSV7Ci0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogVGhyaWZ0IHBhcnNlci4KLSAqCi0gKiBUaGlzIHBhcnNlciBpcyB1c2VkIG9uIGEgdGhyaWZ0IGRlZmluaXRpb24gZmlsZS4KLSAqCi0gKi8KLQotI2RlZmluZSBfX1NURENfTElNSVRfTUFDUk9TCi0jZGVmaW5lIF9fU1REQ19GT1JNQVRfTUFDUk9TCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpZm5kZWYgX01TQ19WRVIKLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotI2Vsc2UKLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNlbmRpZgotI2luY2x1ZGUgPGxpbWl0cy5oPgotI2lmZGVmIF9NU0NfVkVSCi0jaW5jbHVkZSAid2luZG93cy9jb25maWcuaCIKLSNlbmRpZgotI2luY2x1ZGUgIm1haW4uaCIKLSNpbmNsdWRlICJnbG9iYWxzLmgiCi0jaW5jbHVkZSAicGFyc2UvdF9wcm9ncmFtLmgiCi0jaW5jbHVkZSAicGFyc2UvdF9zY29wZS5oIgotCi0jaWZkZWYgX01TQ19WRVIKLS8vd2FybmluZyBDNDA2NTogc3dpdGNoIHN0YXRlbWVudCBjb250YWlucyAnZGVmYXVsdCcgYnV0IG5vICdjYXNlJyBsYWJlbHMKLSNwcmFnbWEgd2FybmluZyhkaXNhYmxlOjQwNjUpCi0jZW5kaWYKLQotLyoqCi0gKiBUaGlzIGdsb2JhbCB2YXJpYWJsZSBpcyB1c2VkIGZvciBhdXRvbWF0aWMgbnVtYmVyaW5nIG9mIGZpZWxkIGluZGljZXMgZXRjLgotICogd2hlbiBwYXJzaW5nIHRoZSBtZW1iZXJzIG9mIGEgc3RydWN0LiBGaWVsZCB2YWx1ZXMgYXJlIGF1dG9tYXRpY2FsbHkKLSAqIGFzc2lnbmVkIHN0YXJ0aW5nIGZyb20gLTEgYW5kIHdvcmtpbmcgdGhlaXIgd2F5IGRvd24uCi0gKi8KLWludCB5X2ZpZWxkX3ZhbCA9IC0xOwotLyoqCi0gKiBUaGlzIGdsb2JhbCB2YXJpYWJsZSBpcyB1c2VkIGZvciBhdXRvbWF0aWMgbnVtYmVyaW5nIG9mIGVudW0gdmFsdWVzLgotICogeV9lbnVtX3ZhbCBpcyB0aGUgbGFzdCB2YWx1ZSBhc3NpZ25lZDsgdGhlIG5leHQgYXV0by1hc3NpZ25lZCB2YWx1ZSB3aWxsIGJlCi0gKiB5X2VudW1fdmFsKzEsIGFuZCB0aGVuIGl0IGNvbnRpbnVlcyB3b3JraW5nIHVwd2FyZHMuICBFeHBsaWNpdGx5IHNwZWNpZmllZAotICogZW51bSB2YWx1ZXMgcmVzZXQgeV9lbnVtX3ZhbCB0byB0aGF0IHZhbHVlLgotICovCi1pbnQzMl90IHlfZW51bV92YWwgPSAtMTsKLWludCBnX2FyZ2xpc3QgPSAwOwotY29uc3QgaW50IHN0cnVjdF9pc19zdHJ1Y3QgPSAwOwotY29uc3QgaW50IHN0cnVjdF9pc191bmlvbiA9IDE7Ci0KLSV9Ci0KLS8qKgotICogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBieSB0aGUgcGFyc2VyIHRvIGhvbGQgdGhlIGRhdGEgdHlwZXMgYXNzb2NpYXRlZCB3aXRoCi0gKiB2YXJpb3VzIHBhcnNlIG5vZGVzLgotICovCi0ldW5pb24gewotICBjaGFyKiAgICAgICAgICBpZDsKLSAgaW50NjRfdCAgICAgICAgaWNvbnN0OwotICBkb3VibGUgICAgICAgICBkY29uc3Q7Ci0gIGJvb2wgICAgICAgICAgIHRib29sOwotICB0X2RvYyogICAgICAgICB0ZG9jOwotICB0X3R5cGUqICAgICAgICB0dHlwZTsKLSAgdF9iYXNlX3R5cGUqICAgdGJhc2U7Ci0gIHRfdHlwZWRlZiogICAgIHR0eXBlZGVmOwotICB0X2VudW0qICAgICAgICB0ZW51bTsKLSAgdF9lbnVtX3ZhbHVlKiAgdGVudW12OwotICB0X2NvbnN0KiAgICAgICB0Y29uc3Q7Ci0gIHRfY29uc3RfdmFsdWUqIHRjb25zdHY7Ci0gIHRfc3RydWN0KiAgICAgIHRzdHJ1Y3Q7Ci0gIHRfc2VydmljZSogICAgIHRzZXJ2aWNlOwotICB0X2Z1bmN0aW9uKiAgICB0ZnVuY3Rpb247Ci0gIHRfZmllbGQqICAgICAgIHRmaWVsZDsKLSAgY2hhciogICAgICAgICAgZHRleHQ7Ci0gIHRfZmllbGQ6OmVfcmVxIGVyZXE7Ci0gIHRfYW5ub3RhdGlvbiogIHRhbm5vdDsKLSAgdF9maWVsZF9pZCAgICAgdGZpZWxkaWQ7Ci19Ci0KLS8qKgotICogU3RyaW5ncyBpZGVudGlmaWVyCi0gKi8KLSV0b2tlbjxpZD4gICAgIHRva19pZGVudGlmaWVyCi0ldG9rZW48aWQ+ICAgICB0b2tfbGl0ZXJhbAotJXRva2VuPGR0ZXh0PiAgdG9rX2RvY3RleHQKLSV0b2tlbjxpZD4gICAgIHRva19zdF9pZGVudGlmaWVyCi0KLS8qKgotICogQ29uc3RhbnQgdmFsdWVzCi0gKi8KLSV0b2tlbjxpY29uc3Q+IHRva19pbnRfY29uc3RhbnQKLSV0b2tlbjxkY29uc3Q+IHRva19kdWJfY29uc3RhbnQKLQotLyoqCi0gKiBIZWFkZXIga2V5d29yZHMKLSAqLwotJXRva2VuIHRva19pbmNsdWRlCi0ldG9rZW4gdG9rX25hbWVzcGFjZQotJXRva2VuIHRva19jcHBfbmFtZXNwYWNlCi0ldG9rZW4gdG9rX2NwcF9pbmNsdWRlCi0ldG9rZW4gdG9rX2NwcF90eXBlCi0ldG9rZW4gdG9rX3BocF9uYW1lc3BhY2UKLSV0b2tlbiB0b2tfcHlfbW9kdWxlCi0ldG9rZW4gdG9rX3BlcmxfcGFja2FnZQotJXRva2VuIHRva19qYXZhX3BhY2thZ2UKLSV0b2tlbiB0b2tfeHNkX2FsbAotJXRva2VuIHRva194c2Rfb3B0aW9uYWwKLSV0b2tlbiB0b2tfeHNkX25pbGxhYmxlCi0ldG9rZW4gdG9rX3hzZF9uYW1lc3BhY2UKLSV0b2tlbiB0b2tfeHNkX2F0dHJzCi0ldG9rZW4gdG9rX3J1YnlfbmFtZXNwYWNlCi0ldG9rZW4gdG9rX3NtYWxsdGFsa19jYXRlZ29yeQotJXRva2VuIHRva19zbWFsbHRhbGtfcHJlZml4Ci0ldG9rZW4gdG9rX2NvY29hX3ByZWZpeAotJXRva2VuIHRva19jc2hhcnBfbmFtZXNwYWNlCi0ldG9rZW4gdG9rX2RlbHBoaV9uYW1lc3BhY2UKLQotLyoqCi0gKiBCYXNlIGRhdGF0eXBlIGtleXdvcmRzCi0gKi8KLSV0b2tlbiB0b2tfdm9pZAotJXRva2VuIHRva19ib29sCi0ldG9rZW4gdG9rX2J5dGUKLSV0b2tlbiB0b2tfc3RyaW5nCi0ldG9rZW4gdG9rX2JpbmFyeQotJXRva2VuIHRva19zbGlzdAotJXRva2VuIHRva19zZW51bQotJXRva2VuIHRva19pMTYKLSV0b2tlbiB0b2tfaTMyCi0ldG9rZW4gdG9rX2k2NAotJXRva2VuIHRva19kb3VibGUKLQotLyoqCi0gKiBDb21wbGV4IHR5cGUga2V5d29yZHMKLSAqLwotJXRva2VuIHRva19tYXAKLSV0b2tlbiB0b2tfbGlzdAotJXRva2VuIHRva19zZXQKLQotLyoqCi0gKiBGdW5jdGlvbiBtb2RpZmllcnMKLSAqLwotJXRva2VuIHRva19vbmV3YXkKLQotLyoqCi0gKiBUaHJpZnQgbGFuZ3VhZ2Uga2V5d29yZHMKLSAqLwotJXRva2VuIHRva190eXBlZGVmCi0ldG9rZW4gdG9rX3N0cnVjdAotJXRva2VuIHRva194Y2VwdGlvbgotJXRva2VuIHRva190aHJvd3MKLSV0b2tlbiB0b2tfZXh0ZW5kcwotJXRva2VuIHRva19zZXJ2aWNlCi0ldG9rZW4gdG9rX2VudW0KLSV0b2tlbiB0b2tfY29uc3QKLSV0b2tlbiB0b2tfcmVxdWlyZWQKLSV0b2tlbiB0b2tfb3B0aW9uYWwKLSV0b2tlbiB0b2tfdW5pb24KLSV0b2tlbiB0b2tfcmVmZXJlbmNlCi0KLS8qKgotICogR3JhbW1hciBub2RlcwotICovCi0KLSV0eXBlPHR0eXBlPiAgICAgQmFzZVR5cGUKLSV0eXBlPHR0eXBlPiAgICAgU2ltcGxlQmFzZVR5cGUKLSV0eXBlPHR0eXBlPiAgICAgQ29udGFpbmVyVHlwZQotJXR5cGU8dHR5cGU+ICAgICBTaW1wbGVDb250YWluZXJUeXBlCi0ldHlwZTx0dHlwZT4gICAgIE1hcFR5cGUKLSV0eXBlPHR0eXBlPiAgICAgU2V0VHlwZQotJXR5cGU8dHR5cGU+ICAgICBMaXN0VHlwZQotCi0ldHlwZTx0ZG9jPiAgICAgIERlZmluaXRpb24KLSV0eXBlPHR0eXBlPiAgICAgVHlwZURlZmluaXRpb24KLQotJXR5cGU8dHR5cGVkZWY+ICBUeXBlZGVmCi0KLSV0eXBlPHR0eXBlPiAgICAgVHlwZUFubm90YXRpb25zCi0ldHlwZTx0dHlwZT4gICAgIFR5cGVBbm5vdGF0aW9uTGlzdAotJXR5cGU8dGFubm90PiAgICBUeXBlQW5ub3RhdGlvbgotJXR5cGU8aWQ+ICAgICAgICBUeXBlQW5ub3RhdGlvblZhbHVlCi0KLSV0eXBlPHRmaWVsZD4gICAgRmllbGQKLSV0eXBlPHRmaWVsZGlkPiAgRmllbGRJZGVudGlmaWVyCi0ldHlwZTxlcmVxPiAgICAgIEZpZWxkUmVxdWlyZWRuZXNzCi0ldHlwZTx0dHlwZT4gICAgIEZpZWxkVHlwZQotJXR5cGU8dGNvbnN0dj4gICBGaWVsZFZhbHVlCi0ldHlwZTx0c3RydWN0PiAgIEZpZWxkTGlzdAotJXR5cGU8dGJvb2w+ICAgICBGaWVsZFJlZmVyZW5jZQotCi0ldHlwZTx0ZW51bT4gICAgIEVudW0KLSV0eXBlPHRlbnVtPiAgICAgRW51bURlZkxpc3QKLSV0eXBlPHRlbnVtdj4gICAgRW51bURlZgotJXR5cGU8dGVudW12PiAgICBFbnVtVmFsdWUKLQotJXR5cGU8dHR5cGVkZWY+ICBTZW51bQotJXR5cGU8dGJhc2U+ICAgICBTZW51bURlZkxpc3QKLSV0eXBlPGlkPiAgICAgICAgU2VudW1EZWYKLQotJXR5cGU8dGNvbnN0PiAgICBDb25zdAotJXR5cGU8dGNvbnN0dj4gICBDb25zdFZhbHVlCi0ldHlwZTx0Y29uc3R2PiAgIENvbnN0TGlzdAotJXR5cGU8dGNvbnN0dj4gICBDb25zdExpc3RDb250ZW50cwotJXR5cGU8dGNvbnN0dj4gICBDb25zdE1hcAotJXR5cGU8dGNvbnN0dj4gICBDb25zdE1hcENvbnRlbnRzCi0KLSV0eXBlPGljb25zdD4gICAgU3RydWN0SGVhZAotJXR5cGU8dHN0cnVjdD4gICBTdHJ1Y3QKLSV0eXBlPHRzdHJ1Y3Q+ICAgWGNlcHRpb24KLSV0eXBlPHRzZXJ2aWNlPiAgU2VydmljZQotCi0ldHlwZTx0ZnVuY3Rpb24+IEZ1bmN0aW9uCi0ldHlwZTx0dHlwZT4gICAgIEZ1bmN0aW9uVHlwZQotJXR5cGU8dHNlcnZpY2U+ICBGdW5jdGlvbkxpc3QKLQotJXR5cGU8dHN0cnVjdD4gICBUaHJvd3MKLSV0eXBlPHRzZXJ2aWNlPiAgRXh0ZW5kcwotJXR5cGU8dGJvb2w+ICAgICBPbmV3YXkKLSV0eXBlPHRib29sPiAgICAgWHNkQWxsCi0ldHlwZTx0Ym9vbD4gICAgIFhzZE9wdGlvbmFsCi0ldHlwZTx0Ym9vbD4gICAgIFhzZE5pbGxhYmxlCi0ldHlwZTx0c3RydWN0PiAgIFhzZEF0dHJpYnV0ZXMKLSV0eXBlPGlkPiAgICAgICAgQ3BwVHlwZQotCi0ldHlwZTxkdGV4dD4gICAgIENhcHR1cmVEb2NUZXh0Ci0KLSUlCi0KLS8qKgotICogVGhyaWZ0IEdyYW1tYXIgSW1wbGVtZW50YXRpb24uCi0gKgotICogRm9yIHRoZSBtb3N0IHBhcnQgdGhpcyBzb3VyY2UgZmlsZSB3b3JrcyBpdHMgd2F5IHRvcCBkb3duIGZyb20gd2hhdCB5b3UKLSAqIG1pZ2h0IGV4cGVjdCB0byBmaW5kIGluIGEgdHlwaWNhbCAudGhyaWZ0IGZpbGUsIGkuZS4gdHlwZSBkZWZpbml0aW9ucyBhbmQKLSAqIG5hbWVzcGFjZXMgdXAgdG9wIGZvbGxvd2VkIGJ5IHNlcnZpY2UgZGVmaW5pdGlvbnMgdXNpbmcgdGhvc2UgdHlwZXMuCi0gKi8KLQotUHJvZ3JhbToKLSAgSGVhZGVyTGlzdCBEZWZpbml0aW9uTGlzdAotICAgIHsKLSAgICAgIHBkZWJ1ZygiUHJvZ3JhbSAtPiBIZWFkZXJzIERlZmluaXRpb25MaXN0Iik7Ci0gICAgICBpZigoZ19wcm9ncmFtX2RvY3RleHRfY2FuZGlkYXRlICE9IE5VTEwpICYmIChnX3Byb2dyYW1fZG9jdGV4dF9zdGF0dXMgIT0gQUxSRUFEWV9QUk9DRVNTRUQpKQotICAgICAgewotICAgICAgICBnX3Byb2dyYW0tPnNldF9kb2MoZ19wcm9ncmFtX2RvY3RleHRfY2FuZGlkYXRlKTsKLSAgICAgICAgZ19wcm9ncmFtX2RvY3RleHRfc3RhdHVzID0gQUxSRUFEWV9QUk9DRVNTRUQ7Ci0gICAgICB9Ci0gICAgICBjbGVhcl9kb2N0ZXh0KCk7Ci0gICAgfQotCi1DYXB0dXJlRG9jVGV4dDoKLSAgICB7Ci0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICAgICAgJCQgPSBnX2RvY3RleHQ7Ci0gICAgICAgIGdfZG9jdGV4dCA9IE5VTEw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAkJCA9IE5VTEw7Ci0gICAgICB9Ci0gICAgfQotCi0vKiBUT0RPKGRyZWlzcyk6IFRyeSB0byBEZXN0cm95RG9jVGV4dCBpbiBhbGwgc29ydHMgb3IgcmFuZG9tIHBsYWNlcy4gKi8KLURlc3Ryb3lEb2NUZXh0OgotICAgIHsKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgICBjbGVhcl9kb2N0ZXh0KCk7Ci0gICAgICB9Ci0gICAgfQotCi0vKiBXZSBoYXZlIHRvIERlc3Ryb3lEb2NUZXh0IGhlcmUsIG90aGVyd2lzZSBpdCBjYXRjaGVzIHRoZSBkb2N0ZXh0Ci0gICBvbiB0aGUgZmlyc3QgcmVhbCBlbGVtZW50LiAqLwotSGVhZGVyTGlzdDoKLSAgSGVhZGVyTGlzdCBEZXN0cm95RG9jVGV4dCBIZWFkZXIKLSAgICB7Ci0gICAgICBwZGVidWcoIkhlYWRlckxpc3QgLT4gSGVhZGVyTGlzdCBIZWFkZXIiKTsKLSAgICB9Ci18Ci0gICAgewotICAgICAgcGRlYnVnKCJIZWFkZXJMaXN0IC0+ICIpOwotICAgIH0KLQotSGVhZGVyOgotICBJbmNsdWRlCi0gICAgewotICAgICAgcGRlYnVnKCJIZWFkZXIgLT4gSW5jbHVkZSIpOwotICAgIH0KLXwgdG9rX25hbWVzcGFjZSB0b2tfaWRlbnRpZmllciB0b2tfaWRlbnRpZmllcgotICAgIHsKLSAgICAgIHBkZWJ1ZygiSGVhZGVyIC0+IHRva19uYW1lc3BhY2UgdG9rX2lkZW50aWZpZXIgdG9rX2lkZW50aWZpZXIiKTsKLSAgICAgIGRlY2xhcmVfdmFsaWRfcHJvZ3JhbV9kb2N0ZXh0KCk7ICAKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgICBnX3Byb2dyYW0tPnNldF9uYW1lc3BhY2UoJDIsICQzKTsKLSAgICAgIH0KLSAgICB9Ci18IHRva19uYW1lc3BhY2UgJyonIHRva19pZGVudGlmaWVyCi0gICAgewotICAgICAgcGRlYnVnKCJIZWFkZXIgLT4gdG9rX25hbWVzcGFjZSAqIHRva19pZGVudGlmaWVyIik7Ci0gICAgICBkZWNsYXJlX3ZhbGlkX3Byb2dyYW1fZG9jdGV4dCgpOyAgCi0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICAgICAgZ19wcm9ncmFtLT5zZXRfbmFtZXNwYWNlKCIqIiwgJDMpOwotICAgICAgfQotICAgIH0KLS8qIFRPRE8oZHJlaXNzKTogR2V0IHJpZCBvZiB0aGlzIG9uY2UgZXZlcnlvbmUgaXMgdXNpbmcgdGhlIG5ldyBob3RuZXNzLiAqLwotfCB0b2tfY3BwX25hbWVzcGFjZSB0b2tfaWRlbnRpZmllcgotICAgIHsKLSAgICAgIHB3YXJuaW5nKDEsICInY3BwX25hbWVzcGFjZScgaXMgZGVwcmVjYXRlZC4gVXNlICduYW1lc3BhY2UgY3BwJyBpbnN0ZWFkIik7Ci0gICAgICBwZGVidWcoIkhlYWRlciAtPiB0b2tfY3BwX25hbWVzcGFjZSB0b2tfaWRlbnRpZmllciIpOwotICAgICAgZGVjbGFyZV92YWxpZF9wcm9ncmFtX2RvY3RleHQoKTsgIAotICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7Ci0gICAgICAgIGdfcHJvZ3JhbS0+c2V0X25hbWVzcGFjZSgiY3BwIiwgJDIpOwotICAgICAgfQotICAgIH0KLXwgdG9rX2NwcF9pbmNsdWRlIHRva19saXRlcmFsCi0gICAgewotICAgICAgcGRlYnVnKCJIZWFkZXIgLT4gdG9rX2NwcF9pbmNsdWRlIHRva19saXRlcmFsIik7Ci0gICAgICBkZWNsYXJlX3ZhbGlkX3Byb2dyYW1fZG9jdGV4dCgpOyAgCi0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICAgICAgZ19wcm9ncmFtLT5hZGRfY3BwX2luY2x1ZGUoJDIpOwotICAgICAgfQotICAgIH0KLXwgdG9rX3BocF9uYW1lc3BhY2UgdG9rX2lkZW50aWZpZXIKLSAgICB7Ci0gICAgICBwd2FybmluZygxLCAiJ3BocF9uYW1lc3BhY2UnIGlzIGRlcHJlY2F0ZWQuIFVzZSAnbmFtZXNwYWNlIHBocCcgaW5zdGVhZCIpOwotICAgICAgcGRlYnVnKCJIZWFkZXIgLT4gdG9rX3BocF9uYW1lc3BhY2UgdG9rX2lkZW50aWZpZXIiKTsKLSAgICAgIGRlY2xhcmVfdmFsaWRfcHJvZ3JhbV9kb2N0ZXh0KCk7ICAKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgICBnX3Byb2dyYW0tPnNldF9uYW1lc3BhY2UoInBocCIsICQyKTsKLSAgICAgIH0KLSAgICB9Ci0vKiBUT0RPKGRyZWlzcyk6IEdldCByaWQgb2YgdGhpcyBvbmNlIGV2ZXJ5b25lIGlzIHVzaW5nIHRoZSBuZXcgaG90bmVzcy4gKi8KLXwgdG9rX3B5X21vZHVsZSB0b2tfaWRlbnRpZmllcgotICAgIHsKLSAgICAgIHB3YXJuaW5nKDEsICIncHlfbW9kdWxlJyBpcyBkZXByZWNhdGVkLiBVc2UgJ25hbWVzcGFjZSBweScgaW5zdGVhZCIpOwotICAgICAgcGRlYnVnKCJIZWFkZXIgLT4gdG9rX3B5X21vZHVsZSB0b2tfaWRlbnRpZmllciIpOwotICAgICAgZGVjbGFyZV92YWxpZF9wcm9ncmFtX2RvY3RleHQoKTsgIAotICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7Ci0gICAgICAgIGdfcHJvZ3JhbS0+c2V0X25hbWVzcGFjZSgicHkiLCAkMik7Ci0gICAgICB9Ci0gICAgfQotLyogVE9ETyhkcmVpc3MpOiBHZXQgcmlkIG9mIHRoaXMgb25jZSBldmVyeW9uZSBpcyB1c2luZyB0aGUgbmV3IGhvdG5lc3MuICovCi18IHRva19wZXJsX3BhY2thZ2UgdG9rX2lkZW50aWZpZXIKLSAgICB7Ci0gICAgICBwd2FybmluZygxLCAiJ3BlcmxfcGFja2FnZScgaXMgZGVwcmVjYXRlZC4gVXNlICduYW1lc3BhY2UgcGVybCcgaW5zdGVhZCIpOwotICAgICAgcGRlYnVnKCJIZWFkZXIgLT4gdG9rX3BlcmxfbmFtZXNwYWNlIHRva19pZGVudGlmaWVyIik7Ci0gICAgICBkZWNsYXJlX3ZhbGlkX3Byb2dyYW1fZG9jdGV4dCgpOyAgCi0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICAgICAgZ19wcm9ncmFtLT5zZXRfbmFtZXNwYWNlKCJwZXJsIiwgJDIpOwotICAgICAgfQotICAgIH0KLS8qIFRPRE8oZHJlaXNzKTogR2V0IHJpZCBvZiB0aGlzIG9uY2UgZXZlcnlvbmUgaXMgdXNpbmcgdGhlIG5ldyBob3RuZXNzLiAqLwotfCB0b2tfcnVieV9uYW1lc3BhY2UgdG9rX2lkZW50aWZpZXIKLSAgICB7Ci0gICAgICBwd2FybmluZygxLCAiJ3J1YnlfbmFtZXNwYWNlJyBpcyBkZXByZWNhdGVkLiBVc2UgJ25hbWVzcGFjZSByYicgaW5zdGVhZCIpOwotICAgICAgcGRlYnVnKCJIZWFkZXIgLT4gdG9rX3J1YnlfbmFtZXNwYWNlIHRva19pZGVudGlmaWVyIik7Ci0gICAgICBkZWNsYXJlX3ZhbGlkX3Byb2dyYW1fZG9jdGV4dCgpOyAgCi0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICAgICAgZ19wcm9ncmFtLT5zZXRfbmFtZXNwYWNlKCJyYiIsICQyKTsKLSAgICAgIH0KLSAgICB9Ci0vKiBUT0RPKGRyZWlzcyk6IEdldCByaWQgb2YgdGhpcyBvbmNlIGV2ZXJ5b25lIGlzIHVzaW5nIHRoZSBuZXcgaG90bmVzcy4gKi8KLXwgdG9rX3NtYWxsdGFsa19jYXRlZ29yeSB0b2tfc3RfaWRlbnRpZmllcgotICAgIHsKLSAgICAgIHB3YXJuaW5nKDEsICInc21hbGx0YWxrX2NhdGVnb3J5JyBpcyBkZXByZWNhdGVkLiBVc2UgJ25hbWVzcGFjZSBzbWFsbHRhbGsuY2F0ZWdvcnknIGluc3RlYWQiKTsKLSAgICAgIHBkZWJ1ZygiSGVhZGVyIC0+IHRva19zbWFsbHRhbGtfY2F0ZWdvcnkgdG9rX3N0X2lkZW50aWZpZXIiKTsKLSAgICAgIGRlY2xhcmVfdmFsaWRfcHJvZ3JhbV9kb2N0ZXh0KCk7ICAKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgICBnX3Byb2dyYW0tPnNldF9uYW1lc3BhY2UoInNtYWxsdGFsay5jYXRlZ29yeSIsICQyKTsKLSAgICAgIH0KLSAgICB9Ci0vKiBUT0RPKGRyZWlzcyk6IEdldCByaWQgb2YgdGhpcyBvbmNlIGV2ZXJ5b25lIGlzIHVzaW5nIHRoZSBuZXcgaG90bmVzcy4gKi8KLXwgdG9rX3NtYWxsdGFsa19wcmVmaXggdG9rX2lkZW50aWZpZXIKLSAgICB7Ci0gICAgICBwd2FybmluZygxLCAiJ3NtYWxsdGFsa19wcmVmaXgnIGlzIGRlcHJlY2F0ZWQuIFVzZSAnbmFtZXNwYWNlIHNtYWxsdGFsay5wcmVmaXgnIGluc3RlYWQiKTsKLSAgICAgIHBkZWJ1ZygiSGVhZGVyIC0+IHRva19zbWFsbHRhbGtfcHJlZml4IHRva19pZGVudGlmaWVyIik7Ci0gICAgICBkZWNsYXJlX3ZhbGlkX3Byb2dyYW1fZG9jdGV4dCgpOyAgCi0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICAgICAgZ19wcm9ncmFtLT5zZXRfbmFtZXNwYWNlKCJzbWFsbHRhbGsucHJlZml4IiwgJDIpOwotICAgICAgfQotICAgIH0KLS8qIFRPRE8oZHJlaXNzKTogR2V0IHJpZCBvZiB0aGlzIG9uY2UgZXZlcnlvbmUgaXMgdXNpbmcgdGhlIG5ldyBob3RuZXNzLiAqLwotfCB0b2tfamF2YV9wYWNrYWdlIHRva19pZGVudGlmaWVyCi0gICAgewotICAgICAgcHdhcm5pbmcoMSwgIidqYXZhX3BhY2thZ2UnIGlzIGRlcHJlY2F0ZWQuIFVzZSAnbmFtZXNwYWNlIGphdmEnIGluc3RlYWQiKTsKLSAgICAgIHBkZWJ1ZygiSGVhZGVyIC0+IHRva19qYXZhX3BhY2thZ2UgdG9rX2lkZW50aWZpZXIiKTsKLSAgICAgIGRlY2xhcmVfdmFsaWRfcHJvZ3JhbV9kb2N0ZXh0KCk7ICAKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgICBnX3Byb2dyYW0tPnNldF9uYW1lc3BhY2UoImphdmEiLCAkMik7Ci0gICAgICB9Ci0gICAgfQotLyogVE9ETyhkcmVpc3MpOiBHZXQgcmlkIG9mIHRoaXMgb25jZSBldmVyeW9uZSBpcyB1c2luZyB0aGUgbmV3IGhvdG5lc3MuICovCi18IHRva19jb2NvYV9wcmVmaXggdG9rX2lkZW50aWZpZXIKLSAgICB7Ci0gICAgICBwd2FybmluZygxLCAiJ2NvY29hX3ByZWZpeCcgaXMgZGVwcmVjYXRlZC4gVXNlICduYW1lc3BhY2UgY29jb2EnIGluc3RlYWQiKTsKLSAgICAgIHBkZWJ1ZygiSGVhZGVyIC0+IHRva19jb2NvYV9wcmVmaXggdG9rX2lkZW50aWZpZXIiKTsKLSAgICAgIGRlY2xhcmVfdmFsaWRfcHJvZ3JhbV9kb2N0ZXh0KCk7ICAKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgICBnX3Byb2dyYW0tPnNldF9uYW1lc3BhY2UoImNvY29hIiwgJDIpOwotICAgICAgfQotICAgIH0KLS8qIFRPRE8oZHJlaXNzKTogR2V0IHJpZCBvZiB0aGlzIG9uY2UgZXZlcnlvbmUgaXMgdXNpbmcgdGhlIG5ldyBob3RuZXNzLiAqLwotfCB0b2tfeHNkX25hbWVzcGFjZSB0b2tfbGl0ZXJhbAotICAgIHsKLSAgICAgIHB3YXJuaW5nKDEsICIneHNkX25hbWVzcGFjZScgaXMgZGVwcmVjYXRlZC4gVXNlICduYW1lc3BhY2UgeHNkJyBpbnN0ZWFkIik7Ci0gICAgICBwZGVidWcoIkhlYWRlciAtPiB0b2tfeHNkX25hbWVzcGFjZSB0b2tfbGl0ZXJhbCIpOwotICAgICAgZGVjbGFyZV92YWxpZF9wcm9ncmFtX2RvY3RleHQoKTsgIAotICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7Ci0gICAgICAgIGdfcHJvZ3JhbS0+c2V0X25hbWVzcGFjZSgiY29jb2EiLCAkMik7Ci0gICAgICB9Ci0gICAgfQotLyogVE9ETyhkcmVpc3MpOiBHZXQgcmlkIG9mIHRoaXMgb25jZSBldmVyeW9uZSBpcyB1c2luZyB0aGUgbmV3IGhvdG5lc3MuICovCi18IHRva19jc2hhcnBfbmFtZXNwYWNlIHRva19pZGVudGlmaWVyCi0gICB7Ci0gICAgIHB3YXJuaW5nKDEsICInY3NoYXJwX25hbWVzcGFjZScgaXMgZGVwcmVjYXRlZC4gVXNlICduYW1lc3BhY2UgY3NoYXJwJyBpbnN0ZWFkIik7Ci0gICAgIHBkZWJ1ZygiSGVhZGVyIC0+IHRva19jc2hhcnBfbmFtZXNwYWNlIHRva19pZGVudGlmaWVyIik7Ci0gICAgIGRlY2xhcmVfdmFsaWRfcHJvZ3JhbV9kb2N0ZXh0KCk7ICAKLSAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7Ci0gICAgICAgZ19wcm9ncmFtLT5zZXRfbmFtZXNwYWNlKCJjc2hhcnAiLCAkMik7Ci0gICAgIH0KLSAgIH0KLS8qIFRPRE8oZHJlaXNzKTogR2V0IHJpZCBvZiB0aGlzIG9uY2UgZXZlcnlvbmUgaXMgdXNpbmcgdGhlIG5ldyBob3RuZXNzLiAqLwotfCB0b2tfZGVscGhpX25hbWVzcGFjZSB0b2tfaWRlbnRpZmllcgotICAgewotICAgICBwd2FybmluZygxLCAiJ2RlbHBoaV9uYW1lc3BhY2UnIGlzIGRlcHJlY2F0ZWQuIFVzZSAnbmFtZXNwYWNlIGRlbHBoaScgaW5zdGVhZCIpOwotICAgICBwZGVidWcoIkhlYWRlciAtPiB0b2tfZGVscGhpX25hbWVzcGFjZSB0b2tfaWRlbnRpZmllciIpOwotICAgICBkZWNsYXJlX3ZhbGlkX3Byb2dyYW1fZG9jdGV4dCgpOyAgCi0gICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgIGdfcHJvZ3JhbS0+c2V0X25hbWVzcGFjZSgiZGVscGhpIiwgJDIpOwotICAgICB9Ci0gICB9Ci0KLUluY2x1ZGU6Ci0gIHRva19pbmNsdWRlIHRva19saXRlcmFsCi0gICAgewotICAgICAgcGRlYnVnKCJJbmNsdWRlIC0+IHRva19pbmNsdWRlIHRva19saXRlcmFsIik7Ci0gICAgICBkZWNsYXJlX3ZhbGlkX3Byb2dyYW1fZG9jdGV4dCgpOyAgCi0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IElOQ0xVREVTKSB7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIHBhdGggPSBpbmNsdWRlX2ZpbGUoc3RkOjpzdHJpbmcoJDIpKTsKLSAgICAgICAgaWYgKCFwYXRoLmVtcHR5KCkpIHsKLSAgICAgICAgICBnX3Byb2dyYW0tPmFkZF9pbmNsdWRlKHBhdGgsIHN0ZDo6c3RyaW5nKCQyKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLURlZmluaXRpb25MaXN0OgotICBEZWZpbml0aW9uTGlzdCBDYXB0dXJlRG9jVGV4dCBEZWZpbml0aW9uCi0gICAgewotICAgICAgcGRlYnVnKCJEZWZpbml0aW9uTGlzdCAtPiBEZWZpbml0aW9uTGlzdCBEZWZpbml0aW9uIik7Ci0gICAgICBpZiAoJDIgIT0gTlVMTCAmJiAkMyAhPSBOVUxMKSB7Ci0gICAgICAgICQzLT5zZXRfZG9jKCQyKTsKLSAgICAgIH0KLSAgICB9Ci18Ci0gICAgewotICAgICAgcGRlYnVnKCJEZWZpbml0aW9uTGlzdCAtPiAiKTsKLSAgICB9Ci0KLURlZmluaXRpb246Ci0gIENvbnN0Ci0gICAgewotICAgICAgcGRlYnVnKCJEZWZpbml0aW9uIC0+IENvbnN0Iik7Ci0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICAgICAgZ19wcm9ncmFtLT5hZGRfY29uc3QoJDEpOwotICAgICAgfQotICAgICAgJCQgPSAkMTsKLSAgICB9Ci18IFR5cGVEZWZpbml0aW9uCi0gICAgewotICAgICAgcGRlYnVnKCJEZWZpbml0aW9uIC0+IFR5cGVEZWZpbml0aW9uIik7Ci0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICAgICAgZ19zY29wZS0+YWRkX3R5cGUoJDEtPmdldF9uYW1lKCksICQxKTsKLSAgICAgICAgaWYgKGdfcGFyZW50X3Njb3BlICE9IE5VTEwpIHsKLSAgICAgICAgICBnX3BhcmVudF9zY29wZS0+YWRkX3R5cGUoZ19wYXJlbnRfcHJlZml4ICsgJDEtPmdldF9uYW1lKCksICQxKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoISBnX3Byb2dyYW0tPmlzX3VuaXF1ZV90eXBlbmFtZSgkMSkpIHsKLSAgICAgICAgICB5eWVycm9yKCJUeXBlIFwiJXNcIiBpcyBhbHJlYWR5IGRlZmluZWQuIiwgJDEtPmdldF9uYW1lKCkuY19zdHIoKSk7Ci0gICAgICAgICAgZXhpdCgxKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgJCQgPSAkMTsKLSAgICB9Ci18IFNlcnZpY2UKLSAgICB7Ci0gICAgICBwZGVidWcoIkRlZmluaXRpb24gLT4gU2VydmljZSIpOwotICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7Ci0gICAgICAgIGdfc2NvcGUtPmFkZF9zZXJ2aWNlKCQxLT5nZXRfbmFtZSgpLCAkMSk7Ci0gICAgICAgIGlmIChnX3BhcmVudF9zY29wZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgZ19wYXJlbnRfc2NvcGUtPmFkZF9zZXJ2aWNlKGdfcGFyZW50X3ByZWZpeCArICQxLT5nZXRfbmFtZSgpLCAkMSk7Ci0gICAgICAgIH0KLSAgICAgICAgZ19wcm9ncmFtLT5hZGRfc2VydmljZSgkMSk7Ci0gICAgICAgIGlmICghIGdfcHJvZ3JhbS0+aXNfdW5pcXVlX3R5cGVuYW1lKCQxKSkgewotICAgICAgICAgIHl5ZXJyb3IoIlR5cGUgXCIlc1wiIGlzIGFscmVhZHkgZGVmaW5lZC4iLCAkMS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKLSAgICAgICAgICBleGl0KDEpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAkJCA9ICQxOwotICAgIH0KLQotVHlwZURlZmluaXRpb246Ci0gIFR5cGVkZWYKLSAgICB7Ci0gICAgICBwZGVidWcoIlR5cGVEZWZpbml0aW9uIC0+IFR5cGVkZWYiKTsKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgICBnX3Byb2dyYW0tPmFkZF90eXBlZGVmKCQxKTsKLSAgICAgIH0KLSAgICB9Ci18IEVudW0KLSAgICB7Ci0gICAgICBwZGVidWcoIlR5cGVEZWZpbml0aW9uIC0+IEVudW0iKTsKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgICBnX3Byb2dyYW0tPmFkZF9lbnVtKCQxKTsKLSAgICAgIH0KLSAgICB9Ci18IFNlbnVtCi0gICAgewotICAgICAgcGRlYnVnKCJUeXBlRGVmaW5pdGlvbiAtPiBTZW51bSIpOwotICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7Ci0gICAgICAgIGdfcHJvZ3JhbS0+YWRkX3R5cGVkZWYoJDEpOwotICAgICAgfQotICAgIH0KLXwgU3RydWN0Ci0gICAgewotICAgICAgcGRlYnVnKCJUeXBlRGVmaW5pdGlvbiAtPiBTdHJ1Y3QiKTsKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgICBnX3Byb2dyYW0tPmFkZF9zdHJ1Y3QoJDEpOwotICAgICAgfQotICAgIH0KLXwgWGNlcHRpb24KLSAgICB7Ci0gICAgICBwZGVidWcoIlR5cGVEZWZpbml0aW9uIC0+IFhjZXB0aW9uIik7Ci0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICAgICAgZ19wcm9ncmFtLT5hZGRfeGNlcHRpb24oJDEpOwotICAgICAgfQotICAgIH0KLQotQ29tbWFPclNlbWljb2xvbk9wdGlvbmFsOgotICAnLCcKLSAgICB7fQotfCAnOycKLSAgICB7fQotfAotICAgIHt9Ci0KLVR5cGVkZWY6Ci0gIHRva190eXBlZGVmIEZpZWxkVHlwZSB0b2tfaWRlbnRpZmllciBUeXBlQW5ub3RhdGlvbnMgQ29tbWFPclNlbWljb2xvbk9wdGlvbmFsCi0gICAgewotICAgICAgcGRlYnVnKCJUeXBlRGVmIC0+IHRva190eXBlZGVmIEZpZWxkVHlwZSB0b2tfaWRlbnRpZmllciIpOwotICAgICAgdmFsaWRhdGVfc2ltcGxlX2lkZW50aWZpZXIoICQzKTsKLSAgICAgIHRfdHlwZWRlZiAqdGQgPSBuZXcgdF90eXBlZGVmKGdfcHJvZ3JhbSwgJDIsICQzKTsKLSAgICAgICQkID0gdGQ7Ci0gICAgICBpZiAoJDQgIT0gTlVMTCkgewotICAgICAgICAkJC0+YW5ub3RhdGlvbnNfID0gJDQtPmFubm90YXRpb25zXzsKLSAgICAgICAgZGVsZXRlICQ0OwotICAgICAgfQotICAgIH0KLQotRW51bToKLSAgdG9rX2VudW0gdG9rX2lkZW50aWZpZXIgJ3snIEVudW1EZWZMaXN0ICd9JyBUeXBlQW5ub3RhdGlvbnMKLSAgICB7Ci0gICAgICBwZGVidWcoIkVudW0gLT4gdG9rX2VudW0gdG9rX2lkZW50aWZpZXIgeyBFbnVtRGVmTGlzdCB9Iik7Ci0gICAgICAkJCA9ICQ0OwotICAgICAgdmFsaWRhdGVfc2ltcGxlX2lkZW50aWZpZXIoICQyKTsKLSAgICAgICQkLT5zZXRfbmFtZSgkMik7Ci0gICAgICBpZiAoJDYgIT0gTlVMTCkgewotICAgICAgICAkJC0+YW5ub3RhdGlvbnNfID0gJDYtPmFubm90YXRpb25zXzsKLSAgICAgICAgZGVsZXRlICQ2OwotICAgICAgfQotCi0gICAgICAvLyBtYWtlIGNvbnN0YW50cyBmb3IgYWxsIHRoZSBlbnVtIHZhbHVlcwotICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7Ci0gICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZW51bV92YWx1ZSo+JiBlbnVtX3ZhbHVlcyA9ICQkLT5nZXRfY29uc3RhbnRzKCk7Ci0gICAgICAgIHN0ZDo6dmVjdG9yPHRfZW51bV92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciBjX2l0ZXI7Ci0gICAgICAgIGZvciAoY19pdGVyID0gZW51bV92YWx1ZXMuYmVnaW4oKTsgY19pdGVyICE9IGVudW1fdmFsdWVzLmVuZCgpOyArK2NfaXRlcikgewotICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0X25hbWUgPSAkJC0+Z2V0X25hbWUoKSArICIuIiArICgqY19pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiBjb25zdF92YWwgPSBuZXcgdF9jb25zdF92YWx1ZSgoKmNfaXRlciktPmdldF92YWx1ZSgpKTsKLSAgICAgICAgICBjb25zdF92YWwtPnNldF9lbnVtKCQkKTsKLSAgICAgICAgICBnX3Njb3BlLT5hZGRfY29uc3RhbnQoY29uc3RfbmFtZSwgbmV3IHRfY29uc3QoZ190eXBlX2kzMiwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpLCBjb25zdF92YWwpKTsKLSAgICAgICAgICBpZiAoZ19wYXJlbnRfc2NvcGUgIT0gTlVMTCkgewotICAgICAgICAgICAgZ19wYXJlbnRfc2NvcGUtPmFkZF9jb25zdGFudChnX3BhcmVudF9wcmVmaXggKyBjb25zdF9uYW1lLCBuZXcgdF9jb25zdChnX3R5cGVfaTMyLCAoKmNfaXRlciktPmdldF9uYW1lKCksIGNvbnN0X3ZhbCkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotRW51bURlZkxpc3Q6Ci0gIEVudW1EZWZMaXN0IEVudW1EZWYKLSAgICB7Ci0gICAgICBwZGVidWcoIkVudW1EZWZMaXN0IC0+IEVudW1EZWZMaXN0IEVudW1EZWYiKTsKLSAgICAgICQkID0gJDE7Ci0gICAgICAkJC0+YXBwZW5kKCQyKTsKLSAgICB9Ci18Ci0gICAgewotICAgICAgcGRlYnVnKCJFbnVtRGVmTGlzdCAtPiAiKTsKLSAgICAgICQkID0gbmV3IHRfZW51bShnX3Byb2dyYW0pOwotICAgICAgeV9lbnVtX3ZhbCA9IC0xOwotICAgIH0KLQotRW51bURlZjoKLSAgQ2FwdHVyZURvY1RleHQgRW51bVZhbHVlIFR5cGVBbm5vdGF0aW9ucyBDb21tYU9yU2VtaWNvbG9uT3B0aW9uYWwKLSAgICB7Ci0gICAgICBwZGVidWcoIkVudW1EZWYgLT4gRW51bVZhbHVlIik7Ci0gICAgICAkJCA9ICQyOwotICAgICAgaWYgKCQxICE9IE5VTEwpIHsKLSAgICAgICAgJCQtPnNldF9kb2MoJDEpOwotICAgICAgfQotCSAgaWYgKCQzICE9IE5VTEwpIHsKLSAgICAgICAgJCQtPmFubm90YXRpb25zXyA9ICQzLT5hbm5vdGF0aW9uc187Ci0gICAgICAgIGRlbGV0ZSAkMzsKLSAgICAgIH0KLSAgICB9Ci0KLUVudW1WYWx1ZToKLSAgdG9rX2lkZW50aWZpZXIgJz0nIHRva19pbnRfY29uc3RhbnQKLSAgICB7Ci0gICAgICBwZGVidWcoIkVudW1WYWx1ZSAtPiB0b2tfaWRlbnRpZmllciA9IHRva19pbnRfY29uc3RhbnQiKTsKLSAgICAgIGlmICgkMyA8IElOVDMyX01JTiB8fCAkMyA+IElOVDMyX01BWCkgewotICAgICAgICAvLyBOb3RlOiB0aGlzIHVzZWQgdG8gYmUganVzdCBhIHdhcm5pbmcuICBIb3dldmVyLCBzaW5jZSB0aHJpZnQgYWx3YXlzCi0gICAgICAgIC8vIHRyZWF0cyBlbnVtcyBhcyBpMzIgdmFsdWVzLCBJJ20gY2hhbmdpbmcgaXQgdG8gYSBmYXRhbCBlcnJvci4KLSAgICAgICAgLy8gSSBkb3VidCB0aGlzIHdpbGwgYWZmZWN0IG1hbnkgcGVvcGxlLCBidXQgdXNlcnMgd2hvIHJ1biBpbnRvIHRoaXMKLSAgICAgICAgLy8gd2lsbCBoYXZlIHRvIHVwZGF0ZSB0aGVpciB0aHJpZnQgZmlsZXMgdG8gbWFudWFsbHkgc3BlY2lmeSB0aGUKLSAgICAgICAgLy8gdHJ1bmNhdGVkIGkzMiB2YWx1ZSB0aGF0IHRocmlmdCBoYXMgYWx3YXlzIGJlZW4gdXNpbmcgYW55d2F5LgotICAgICAgICBmYWlsdXJlKCI2NC1iaXQgdmFsdWUgc3VwcGxpZWQgZm9yIGVudW0gJXMgd2lsbCBiZSB0cnVuY2F0ZWQuIiwgJDEpOwotICAgICAgfQotICAgICAgeV9lbnVtX3ZhbCA9IHN0YXRpY19jYXN0PGludDMyX3Q+KCQzKTsKLSAgICAgICQkID0gbmV3IHRfZW51bV92YWx1ZSgkMSwgeV9lbnVtX3ZhbCk7Ci0gICAgfQotIHwKLSAgdG9rX2lkZW50aWZpZXIKLSAgICB7Ci0gICAgICBwZGVidWcoIkVudW1WYWx1ZSAtPiB0b2tfaWRlbnRpZmllciIpOwotICAgICAgdmFsaWRhdGVfc2ltcGxlX2lkZW50aWZpZXIoICQxKTsKLSAgICAgIGlmICh5X2VudW1fdmFsID09IElOVDMyX01BWCkgewotICAgICAgICBmYWlsdXJlKCJlbnVtIHZhbHVlIG92ZXJmbG93IGF0IGVudW0gJXMiLCAkMSk7Ci0gICAgICB9Ci0gICAgICArK3lfZW51bV92YWw7Ci0gICAgICAkJCA9IG5ldyB0X2VudW1fdmFsdWUoJDEsIHlfZW51bV92YWwpOwotICAgIH0KLQotU2VudW06Ci0gIHRva19zZW51bSB0b2tfaWRlbnRpZmllciAneycgU2VudW1EZWZMaXN0ICd9JyBUeXBlQW5ub3RhdGlvbnMKLSAgICB7Ci0gICAgICBwZGVidWcoIlNlbnVtIC0+IHRva19zZW51bSB0b2tfaWRlbnRpZmllciB7IFNlbnVtRGVmTGlzdCB9Iik7Ci0gICAgICB2YWxpZGF0ZV9zaW1wbGVfaWRlbnRpZmllciggJDIpOwotICAgICAgJCQgPSBuZXcgdF90eXBlZGVmKGdfcHJvZ3JhbSwgJDQsICQyKTsKLSAgICAgIGlmICgkNiAhPSBOVUxMKSB7Ci0gICAgICAgICQkLT5hbm5vdGF0aW9uc18gPSAkNi0+YW5ub3RhdGlvbnNfOwotICAgICAgICBkZWxldGUgJDY7Ci0gICAgICB9Ci0gICAgfQotCi1TZW51bURlZkxpc3Q6Ci0gIFNlbnVtRGVmTGlzdCBTZW51bURlZgotICAgIHsKLSAgICAgIHBkZWJ1ZygiU2VudW1EZWZMaXN0IC0+IFNlbnVtRGVmTGlzdCBTZW51bURlZiIpOwotICAgICAgJCQgPSAkMTsKLSAgICAgICQkLT5hZGRfc3RyaW5nX2VudW1fdmFsKCQyKTsKLSAgICB9Ci18Ci0gICAgewotICAgICAgcGRlYnVnKCJTZW51bURlZkxpc3QgLT4gIik7Ci0gICAgICAkJCA9IG5ldyB0X2Jhc2VfdHlwZSgic3RyaW5nIiwgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HKTsKLSAgICAgICQkLT5zZXRfc3RyaW5nX2VudW0odHJ1ZSk7Ci0gICAgfQotCi1TZW51bURlZjoKLSAgdG9rX2xpdGVyYWwgQ29tbWFPclNlbWljb2xvbk9wdGlvbmFsCi0gICAgewotICAgICAgcGRlYnVnKCJTZW51bURlZiAtPiB0b2tfbGl0ZXJhbCIpOwotICAgICAgJCQgPSAkMTsKLSAgICB9Ci0KLUNvbnN0OgotICB0b2tfY29uc3QgRmllbGRUeXBlIHRva19pZGVudGlmaWVyICc9JyBDb25zdFZhbHVlIENvbW1hT3JTZW1pY29sb25PcHRpb25hbAotICAgIHsKLSAgICAgIHBkZWJ1ZygiQ29uc3QgLT4gdG9rX2NvbnN0IEZpZWxkVHlwZSB0b2tfaWRlbnRpZmllciA9IENvbnN0VmFsdWUiKTsKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgICB2YWxpZGF0ZV9zaW1wbGVfaWRlbnRpZmllciggJDMpOwotICAgICAgICBnX3Njb3BlLT5yZXNvbHZlX2NvbnN0X3ZhbHVlKCQ1LCAkMik7Ci0gICAgICAgICQkID0gbmV3IHRfY29uc3QoJDIsICQzLCAkNSk7Ci0gICAgICAgIHZhbGlkYXRlX2NvbnN0X3R5cGUoJCQpOwotCi0gICAgICAgIGdfc2NvcGUtPmFkZF9jb25zdGFudCgkMywgJCQpOwotICAgICAgICBpZiAoZ19wYXJlbnRfc2NvcGUgIT0gTlVMTCkgewotICAgICAgICAgIGdfcGFyZW50X3Njb3BlLT5hZGRfY29uc3RhbnQoZ19wYXJlbnRfcHJlZml4ICsgJDMsICQkKTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgJCQgPSBOVUxMOwotICAgICAgfQotICAgIH0KLQotQ29uc3RWYWx1ZToKLSAgdG9rX2ludF9jb25zdGFudAotICAgIHsKLSAgICAgIHBkZWJ1ZygiQ29uc3RWYWx1ZSA9PiB0b2tfaW50X2NvbnN0YW50Iik7Ci0gICAgICAkJCA9IG5ldyB0X2NvbnN0X3ZhbHVlKCk7Ci0gICAgICAkJC0+c2V0X2ludGVnZXIoJDEpOwotICAgICAgaWYgKCFnX2FsbG93XzY0Yml0X2NvbnN0cyAmJiAoJDEgPCBJTlQzMl9NSU4gfHwgJDEgPiBJTlQzMl9NQVgpKSB7Ci0gICAgICAgIHB3YXJuaW5nKDEsICI2NC1iaXQgY29uc3RhbnQgXCIlIiBQUklpNjQiXCIgbWF5IG5vdCB3b3JrIGluIGFsbCBsYW5ndWFnZXMuXG4iLCAkMSk7Ci0gICAgICB9Ci0gICAgfQotfCB0b2tfZHViX2NvbnN0YW50Ci0gICAgewotICAgICAgcGRlYnVnKCJDb25zdFZhbHVlID0+IHRva19kdWJfY29uc3RhbnQiKTsKLSAgICAgICQkID0gbmV3IHRfY29uc3RfdmFsdWUoKTsKLSAgICAgICQkLT5zZXRfZG91YmxlKCQxKTsKLSAgICB9Ci18IHRva19saXRlcmFsCi0gICAgewotICAgICAgcGRlYnVnKCJDb25zdFZhbHVlID0+IHRva19saXRlcmFsIik7Ci0gICAgICAkJCA9IG5ldyB0X2NvbnN0X3ZhbHVlKCQxKTsKLSAgICB9Ci18IHRva19pZGVudGlmaWVyCi0gICAgewotICAgICAgcGRlYnVnKCJDb25zdFZhbHVlID0+IHRva19pZGVudGlmaWVyIik7Ci0gICAgICAkJCA9IG5ldyB0X2NvbnN0X3ZhbHVlKCk7Ci0gICAgICAkJC0+c2V0X2lkZW50aWZpZXIoJDEpOwotICAgIH0KLXwgQ29uc3RMaXN0Ci0gICAgewotICAgICAgcGRlYnVnKCJDb25zdFZhbHVlID0+IENvbnN0TGlzdCIpOwotICAgICAgJCQgPSAkMTsKLSAgICB9Ci18IENvbnN0TWFwCi0gICAgewotICAgICAgcGRlYnVnKCJDb25zdFZhbHVlID0+IENvbnN0TWFwIik7Ci0gICAgICAkJCA9ICQxOwotICAgIH0KLQotQ29uc3RMaXN0OgotICAnWycgQ29uc3RMaXN0Q29udGVudHMgJ10nCi0gICAgewotICAgICAgcGRlYnVnKCJDb25zdExpc3QgPT4gWyBDb25zdExpc3RDb250ZW50cyBdIik7Ci0gICAgICAkJCA9ICQyOwotICAgIH0KLQotQ29uc3RMaXN0Q29udGVudHM6Ci0gIENvbnN0TGlzdENvbnRlbnRzIENvbnN0VmFsdWUgQ29tbWFPclNlbWljb2xvbk9wdGlvbmFsCi0gICAgewotICAgICAgcGRlYnVnKCJDb25zdExpc3RDb250ZW50cyA9PiBDb25zdExpc3RDb250ZW50cyBDb25zdFZhbHVlIENvbW1hT3JTZW1pY29sb25PcHRpb25hbCIpOwotICAgICAgJCQgPSAkMTsKLSAgICAgICQkLT5hZGRfbGlzdCgkMik7Ci0gICAgfQotfAotICAgIHsKLSAgICAgIHBkZWJ1ZygiQ29uc3RMaXN0Q29udGVudHMgPT4iKTsKLSAgICAgICQkID0gbmV3IHRfY29uc3RfdmFsdWUoKTsKLSAgICAgICQkLT5zZXRfbGlzdCgpOwotICAgIH0KLQotQ29uc3RNYXA6Ci0gICd7JyBDb25zdE1hcENvbnRlbnRzICd9JwotICAgIHsKLSAgICAgIHBkZWJ1ZygiQ29uc3RNYXAgPT4geyBDb25zdE1hcENvbnRlbnRzIH0iKTsKLSAgICAgICQkID0gJDI7Ci0gICAgfQotCi1Db25zdE1hcENvbnRlbnRzOgotICBDb25zdE1hcENvbnRlbnRzIENvbnN0VmFsdWUgJzonIENvbnN0VmFsdWUgQ29tbWFPclNlbWljb2xvbk9wdGlvbmFsCi0gICAgewotICAgICAgcGRlYnVnKCJDb25zdE1hcENvbnRlbnRzID0+IENvbnN0TWFwQ29udGVudHMgQ29uc3RWYWx1ZSBDb21tYU9yU2VtaWNvbG9uT3B0aW9uYWwiKTsKLSAgICAgICQkID0gJDE7Ci0gICAgICAkJC0+YWRkX21hcCgkMiwgJDQpOwotICAgIH0KLXwKLSAgICB7Ci0gICAgICBwZGVidWcoIkNvbnN0TWFwQ29udGVudHMgPT4iKTsKLSAgICAgICQkID0gbmV3IHRfY29uc3RfdmFsdWUoKTsKLSAgICAgICQkLT5zZXRfbWFwKCk7Ci0gICAgfQotCi1TdHJ1Y3RIZWFkOgotICB0b2tfc3RydWN0Ci0gICAgewotICAgICAgJCQgPSBzdHJ1Y3RfaXNfc3RydWN0OwotICAgIH0KLXwgdG9rX3VuaW9uCi0gICAgewotICAgICAgJCQgPSBzdHJ1Y3RfaXNfdW5pb247Ci0gICAgfQotCi1TdHJ1Y3Q6Ci0gIFN0cnVjdEhlYWQgdG9rX2lkZW50aWZpZXIgWHNkQWxsICd7JyBGaWVsZExpc3QgJ30nIFR5cGVBbm5vdGF0aW9ucwotICAgIHsKLSAgICAgIHBkZWJ1ZygiU3RydWN0IC0+IHRva19zdHJ1Y3QgdG9rX2lkZW50aWZpZXIgeyBGaWVsZExpc3QgfSIpOwotICAgICAgdmFsaWRhdGVfc2ltcGxlX2lkZW50aWZpZXIoICQyKTsKLSAgICAgICQ1LT5zZXRfeHNkX2FsbCgkMyk7Ci0gICAgICAkNS0+c2V0X3VuaW9uKCQxID09IHN0cnVjdF9pc191bmlvbik7Ci0gICAgICAkJCA9ICQ1OwotICAgICAgJCQtPnNldF9uYW1lKCQyKTsKLSAgICAgIGlmICgkNyAhPSBOVUxMKSB7Ci0gICAgICAgICQkLT5hbm5vdGF0aW9uc18gPSAkNy0+YW5ub3RhdGlvbnNfOwotICAgICAgICBkZWxldGUgJDc7Ci0gICAgICB9Ci0gICAgfQotCi1Yc2RBbGw6Ci0gIHRva194c2RfYWxsCi0gICAgewotICAgICAgJCQgPSB0cnVlOwotICAgIH0KLXwKLSAgICB7Ci0gICAgICAkJCA9IGZhbHNlOwotICAgIH0KLQotWHNkT3B0aW9uYWw6Ci0gIHRva194c2Rfb3B0aW9uYWwKLSAgICB7Ci0gICAgICAkJCA9IHRydWU7Ci0gICAgfQotfAotICAgIHsKLSAgICAgICQkID0gZmFsc2U7Ci0gICAgfQotCi1Yc2ROaWxsYWJsZToKLSAgdG9rX3hzZF9uaWxsYWJsZQotICAgIHsKLSAgICAgICQkID0gdHJ1ZTsKLSAgICB9Ci18Ci0gICAgewotICAgICAgJCQgPSBmYWxzZTsKLSAgICB9Ci0KLVhzZEF0dHJpYnV0ZXM6Ci0gIHRva194c2RfYXR0cnMgJ3snIEZpZWxkTGlzdCAnfScKLSAgICB7Ci0gICAgICAkJCA9ICQzOwotICAgIH0KLXwKLSAgICB7Ci0gICAgICAkJCA9IE5VTEw7Ci0gICAgfQotCi1YY2VwdGlvbjoKLSAgdG9rX3hjZXB0aW9uIHRva19pZGVudGlmaWVyICd7JyBGaWVsZExpc3QgJ30nIFR5cGVBbm5vdGF0aW9ucwotICAgIHsKLSAgICAgIHBkZWJ1ZygiWGNlcHRpb24gLT4gdG9rX3hjZXB0aW9uIHRva19pZGVudGlmaWVyIHsgRmllbGRMaXN0IH0iKTsKLSAgICAgIHZhbGlkYXRlX3NpbXBsZV9pZGVudGlmaWVyKCAkMik7Ci0gICAgICAkNC0+c2V0X25hbWUoJDIpOwotICAgICAgJDQtPnNldF94Y2VwdGlvbih0cnVlKTsKLSAgICAgICQkID0gJDQ7Ci0gICAgICBpZiAoJDYgIT0gTlVMTCkgewotICAgICAgICAkJC0+YW5ub3RhdGlvbnNfID0gJDYtPmFubm90YXRpb25zXzsKLSAgICAgICAgZGVsZXRlICQ2OwotICAgICAgfQotICAgIH0KLQotU2VydmljZToKLSAgdG9rX3NlcnZpY2UgdG9rX2lkZW50aWZpZXIgRXh0ZW5kcyAneycgRmxhZ0FyZ3MgRnVuY3Rpb25MaXN0IFVuZmxhZ0FyZ3MgJ30nIFR5cGVBbm5vdGF0aW9ucwotICAgIHsKLSAgICAgIHBkZWJ1ZygiU2VydmljZSAtPiB0b2tfc2VydmljZSB0b2tfaWRlbnRpZmllciB7IEZ1bmN0aW9uTGlzdCB9Iik7Ci0gICAgICB2YWxpZGF0ZV9zaW1wbGVfaWRlbnRpZmllciggJDIpOwotICAgICAgJCQgPSAkNjsKLSAgICAgICQkLT5zZXRfbmFtZSgkMik7Ci0gICAgICAkJC0+c2V0X2V4dGVuZHMoJDMpOwotICAgICAgaWYgKCQ5ICE9IE5VTEwpIHsKLSAgICAgICAgJCQtPmFubm90YXRpb25zXyA9ICQ5LT5hbm5vdGF0aW9uc187Ci0gICAgICAgIGRlbGV0ZSAkOTsKLSAgICAgIH0KLSAgICB9Ci0KLUZsYWdBcmdzOgotICAgIHsKLSAgICAgICBnX2FyZ2xpc3QgPSAxOwotICAgIH0KLQotVW5mbGFnQXJnczoKLSAgICB7Ci0gICAgICAgZ19hcmdsaXN0ID0gMDsKLSAgICB9Ci0KLUV4dGVuZHM6Ci0gIHRva19leHRlbmRzIHRva19pZGVudGlmaWVyCi0gICAgewotICAgICAgcGRlYnVnKCJFeHRlbmRzIC0+IHRva19leHRlbmRzIHRva19pZGVudGlmaWVyIik7Ci0gICAgICAkJCA9IE5VTEw7Ci0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICAgICAgJCQgPSBnX3Njb3BlLT5nZXRfc2VydmljZSgkMik7Ci0gICAgICAgIGlmICgkJCA9PSBOVUxMKSB7Ci0gICAgICAgICAgeXllcnJvcigiU2VydmljZSBcIiVzXCIgaGFzIG5vdCBiZWVuIGRlZmluZWQuIiwgJDIpOwotICAgICAgICAgIGV4aXQoMSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci18Ci0gICAgewotICAgICAgJCQgPSBOVUxMOwotICAgIH0KLQotRnVuY3Rpb25MaXN0OgotICBGdW5jdGlvbkxpc3QgRnVuY3Rpb24KLSAgICB7Ci0gICAgICBwZGVidWcoIkZ1bmN0aW9uTGlzdCAtPiBGdW5jdGlvbkxpc3QgRnVuY3Rpb24iKTsKLSAgICAgICQkID0gJDE7Ci0gICAgICAkMS0+YWRkX2Z1bmN0aW9uKCQyKTsKLSAgICB9Ci18Ci0gICAgewotICAgICAgcGRlYnVnKCJGdW5jdGlvbkxpc3QgLT4gIik7Ci0gICAgICAkJCA9IG5ldyB0X3NlcnZpY2UoZ19wcm9ncmFtKTsKLSAgICB9Ci0KLUZ1bmN0aW9uOgotICBDYXB0dXJlRG9jVGV4dCBPbmV3YXkgRnVuY3Rpb25UeXBlIHRva19pZGVudGlmaWVyICcoJyBGaWVsZExpc3QgJyknIFRocm93cyBUeXBlQW5ub3RhdGlvbnMgQ29tbWFPclNlbWljb2xvbk9wdGlvbmFsCi0gICAgewotICAgICAgdmFsaWRhdGVfc2ltcGxlX2lkZW50aWZpZXIoICQ0KTsKLSAgICAgICQ2LT5zZXRfbmFtZShzdGQ6OnN0cmluZygkNCkgKyAiX2FyZ3MiKTsKLSAgICAgICQkID0gbmV3IHRfZnVuY3Rpb24oJDMsICQ0LCAkNiwgJDgsICQyKTsKLSAgICAgIGlmICgkMSAhPSBOVUxMKSB7Ci0gICAgICAgICQkLT5zZXRfZG9jKCQxKTsKLSAgICAgIH0KLSAgICAgIGlmICgkOSAhPSBOVUxMKSB7Ci0gICAgICAgICQkLT5hbm5vdGF0aW9uc18gPSAkOS0+YW5ub3RhdGlvbnNfOwotICAgICAgICBkZWxldGUgJDk7Ci0gICAgICB9Ci0gICAgfQotCi1PbmV3YXk6Ci0gIHRva19vbmV3YXkKLSAgICB7Ci0gICAgICAkJCA9IHRydWU7Ci0gICAgfQotfAotICAgIHsKLSAgICAgICQkID0gZmFsc2U7Ci0gICAgfQotCi1UaHJvd3M6Ci0gIHRva190aHJvd3MgJygnIEZpZWxkTGlzdCAnKScKLSAgICB7Ci0gICAgICBwZGVidWcoIlRocm93cyAtPiB0b2tfdGhyb3dzICggRmllbGRMaXN0ICkiKTsKLSAgICAgICQkID0gJDM7Ci0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0gJiYgIXZhbGlkYXRlX3Rocm93cygkJCkpIHsKLSAgICAgICAgeXllcnJvcigiVGhyb3dzIGNsYXVzZSBtYXkgbm90IGNvbnRhaW4gbm9uLWV4Y2VwdGlvbiB0eXBlcyIpOwotICAgICAgICBleGl0KDEpOwotICAgICAgfQotICAgIH0KLXwKLSAgICB7Ci0gICAgICAkJCA9IG5ldyB0X3N0cnVjdChnX3Byb2dyYW0pOwotICAgIH0KLQotRmllbGRMaXN0OgotICBGaWVsZExpc3QgRmllbGQKLSAgICB7Ci0gICAgICBwZGVidWcoIkZpZWxkTGlzdCAtPiBGaWVsZExpc3QgLCBGaWVsZCIpOwotICAgICAgJCQgPSAkMTsKLSAgICAgIGlmICghKCQkLT5hcHBlbmQoJDIpKSkgewotICAgICAgICB5eWVycm9yKCJcIiVkOiAlc1wiIC0gZmllbGQgaWRlbnRpZmllci9uYW1lIGhhcyBhbHJlYWR5IGJlZW4gdXNlZCIsICQyLT5nZXRfa2V5KCksICQyLT5nZXRfbmFtZSgpLmNfc3RyKCkpOwotICAgICAgICBleGl0KDEpOwotICAgICAgfQotICAgIH0KLXwKLSAgICB7Ci0gICAgICBwZGVidWcoIkZpZWxkTGlzdCAtPiAiKTsKLSAgICAgIHlfZmllbGRfdmFsID0gLTE7Ci0gICAgICAkJCA9IG5ldyB0X3N0cnVjdChnX3Byb2dyYW0pOwotICAgIH0KLQotRmllbGQ6Ci0gIENhcHR1cmVEb2NUZXh0IEZpZWxkSWRlbnRpZmllciBGaWVsZFJlcXVpcmVkbmVzcyBGaWVsZFR5cGUgRmllbGRSZWZlcmVuY2UgdG9rX2lkZW50aWZpZXIgRmllbGRWYWx1ZSBYc2RPcHRpb25hbCBYc2ROaWxsYWJsZSBYc2RBdHRyaWJ1dGVzIFR5cGVBbm5vdGF0aW9ucyBDb21tYU9yU2VtaWNvbG9uT3B0aW9uYWwKLSAgICB7Ci0gICAgICBwZGVidWcoInRva19pbnRfY29uc3RhbnQgOiBGaWVsZCAtPiBGaWVsZFR5cGUgdG9rX2lkZW50aWZpZXIiKTsKLSAgICAgIGlmICgkMi5hdXRvX2Fzc2lnbmVkKSB7Ci0gICAgICAgIHB3YXJuaW5nKDEsICJObyBmaWVsZCBrZXkgc3BlY2lmaWVkIGZvciAlcywgcmVzdWx0aW5nIHByb3RvY29sIG1heSBoYXZlIGNvbmZsaWN0cyBvciBub3QgYmUgYmFja3dhcmRzIGNvbXBhdGlibGUhXG4iLCAkNik7Ci0gICAgICAgIGlmIChnX3N0cmljdCA+PSAxOTIpIHsKLSAgICAgICAgICB5eWVycm9yKCJJbXBsaWNpdCBmaWVsZCBrZXlzIGFyZSBkZXByZWNhdGVkIGFuZCBub3QgYWxsb3dlZCB3aXRoIC1zdHJpY3QiKTsKLSAgICAgICAgICBleGl0KDEpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICB2YWxpZGF0ZV9zaW1wbGVfaWRlbnRpZmllcigkNik7Ci0gICAgICAkJCA9IG5ldyB0X2ZpZWxkKCQ0LCAkNiwgJDIudmFsdWUpOwotICAgICAgJCQtPnNldF9yZWZlcmVuY2UoJDUpOwotICAgICAgJCQtPnNldF9yZXEoJDMpOwotICAgICAgaWYgKCQ3ICE9IE5VTEwpIHsKLSAgICAgICAgZ19zY29wZS0+cmVzb2x2ZV9jb25zdF92YWx1ZSgkNywgJDQpOwotICAgICAgICB2YWxpZGF0ZV9maWVsZF92YWx1ZSgkJCwgJDcpOwotICAgICAgICAkJC0+c2V0X3ZhbHVlKCQ3KTsKLSAgICAgIH0KLSAgICAgICQkLT5zZXRfeHNkX29wdGlvbmFsKCQ4KTsKLSAgICAgICQkLT5zZXRfeHNkX25pbGxhYmxlKCQ5KTsKLSAgICAgIGlmICgkMSAhPSBOVUxMKSB7Ci0gICAgICAgICQkLT5zZXRfZG9jKCQxKTsKLSAgICAgIH0KLSAgICAgIGlmICgkMTAgIT0gTlVMTCkgewotICAgICAgICAkJC0+c2V0X3hzZF9hdHRycygkMTApOwotICAgICAgfQotICAgICAgaWYgKCQxMSAhPSBOVUxMKSB7Ci0gICAgICAgICQkLT5hbm5vdGF0aW9uc18gPSAkMTEtPmFubm90YXRpb25zXzsKLSAgICAgICAgZGVsZXRlICQxMTsKLSAgICAgIH0KLSAgICB9Ci0KLUZpZWxkSWRlbnRpZmllcjoKLSAgdG9rX2ludF9jb25zdGFudCAnOicKLSAgICB7Ci0gICAgICBpZiAoJDEgPD0gMCkgewotICAgICAgICBpZiAoZ19hbGxvd19uZWdfZmllbGRfa2V5cykgewotICAgICAgICAgIC8qCi0gICAgICAgICAgICogZ19hbGxvd19uZWdfZmllbGRfa2V5cyBleGlzdHMgdG8gYWxsb3cgdXNlcnMgdG8gYWRkIGV4cGxpY2l0bHkKLSAgICAgICAgICAgKiBzcGVjaWZpZWQga2V5IHZhbHVlcyB0byBvbGQgLnRocmlmdCBmaWxlcyB3aXRob3V0IGJyZWFraW5nCi0gICAgICAgICAgICogcHJvdG9jb2wgY29tcGF0aWJpbGl0eS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBpZiAoJDEgIT0geV9maWVsZF92YWwpIHsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiB3YXJuIGlmIHRoZSB1c2VyLXNwZWNpZmllZCBuZWdhdGl2ZSB2YWx1ZSBpc24ndCB3aGF0Ci0gICAgICAgICAgICAgKiB0aHJpZnQgd291bGQgaGF2ZSBhdXRvLWFzc2lnbmVkLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwd2FybmluZygxLCAiTm9ucG9zaXRpdmUgZmllbGQga2V5ICglIiBQUklpNjQiKSBkaWZmZXJzIGZyb20gd2hhdCB3b3VsZCBiZSAiCi0gICAgICAgICAgICAgICAgICAgICAiYXV0by1hc3NpZ25lZCBieSB0aHJpZnQgKCVkKS5cbiIsICQxLCB5X2ZpZWxkX3ZhbCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIC8qCi0gICAgICAgICAgICogTGVhdmUgJDEgYXMtaXMsIGFuZCB1cGRhdGUgeV9maWVsZF92YWwgdG8gYmUgb25lIGxlc3MgdGhhbiAkMS4KLSAgICAgICAgICAgKiBUaGUgRmllbGRMaXN0IHBhcnNpbmcgd2lsbCBjYXRjaCBhbnkgZHVwbGljYXRlIGtleSB2YWx1ZXMuCi0gICAgICAgICAgICovCi0gICAgICAgICAgeV9maWVsZF92YWwgPSBzdGF0aWNfY2FzdDxpbnQzMl90PigkMSAtIDEpOwotICAgICAgICAgICQkLnZhbHVlID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oJDEpOwotICAgICAgICAgICQkLmF1dG9fYXNzaWduZWQgPSBmYWxzZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBwd2FybmluZygxLCAiTm9ucG9zaXRpdmUgdmFsdWUgKCVkKSBub3QgYWxsb3dlZCBhcyBhIGZpZWxkIGtleS5cbiIsCi0gICAgICAgICAgICAgICAgICAgJDEpOwotICAgICAgICAgICQkLnZhbHVlID0geV9maWVsZF92YWwtLTsKLSAgICAgICAgICAkJC5hdXRvX2Fzc2lnbmVkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgJCQudmFsdWUgPSBzdGF0aWNfY2FzdDxpbnQzMl90PigkMSk7Ci0gICAgICAgICQkLmF1dG9fYXNzaWduZWQgPSBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci18Ci0gICAgewotICAgICAgJCQudmFsdWUgPSB5X2ZpZWxkX3ZhbC0tOwotICAgICAgJCQuYXV0b19hc3NpZ25lZCA9IHRydWU7Ci0gICAgfQotCi1GaWVsZFJlZmVyZW5jZToKLSAgdG9rX3JlZmVyZW5jZQotICAgIHsKLSAgICAgICQkID0gdHJ1ZTsKLSAgICB9Ci18Ci0gICB7Ci0gICAgICQkID0gZmFsc2U7Ci0gICB9Ci0KLUZpZWxkUmVxdWlyZWRuZXNzOgotICB0b2tfcmVxdWlyZWQKLSAgICB7Ci0gICAgICAkJCA9IHRfZmllbGQ6OlRfUkVRVUlSRUQ7Ci0gICAgfQotfCB0b2tfb3B0aW9uYWwKLSAgICB7Ci0gICAgICBpZiAoZ19hcmdsaXN0KSB7Ci0gICAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgICAgIHB3YXJuaW5nKDEsICJvcHRpb25hbCBrZXl3b3JkIGlzIGlnbm9yZWQgaW4gYXJndW1lbnQgbGlzdHMuXG4iKTsKLSAgICAgICAgfQotICAgICAgICAkJCA9IHRfZmllbGQ6OlRfT1BUX0lOX1JFUV9PVVQ7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAkJCA9IHRfZmllbGQ6OlRfT1BUSU9OQUw7Ci0gICAgICB9Ci0gICAgfQotfAotICAgIHsKLSAgICAgICQkID0gdF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVDsKLSAgICB9Ci0KLUZpZWxkVmFsdWU6Ci0gICc9JyBDb25zdFZhbHVlCi0gICAgewotICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7Ci0gICAgICAgICQkID0gJDI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAkJCA9IE5VTEw7Ci0gICAgICB9Ci0gICAgfQotfAotICAgIHsKLSAgICAgICQkID0gTlVMTDsKLSAgICB9Ci0KLUZ1bmN0aW9uVHlwZToKLSAgRmllbGRUeXBlCi0gICAgewotICAgICAgcGRlYnVnKCJGdW5jdGlvblR5cGUgLT4gRmllbGRUeXBlIik7Ci0gICAgICAkJCA9ICQxOwotICAgIH0KLXwgdG9rX3ZvaWQKLSAgICB7Ci0gICAgICBwZGVidWcoIkZ1bmN0aW9uVHlwZSAtPiB0b2tfdm9pZCIpOwotICAgICAgJCQgPSBnX3R5cGVfdm9pZDsKLSAgICB9Ci0KLUZpZWxkVHlwZToKLSAgdG9rX2lkZW50aWZpZXIKLSAgICB7Ci0gICAgICBwZGVidWcoIkZpZWxkVHlwZSAtPiB0b2tfaWRlbnRpZmllciIpOwotICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBJTkNMVURFUykgewotICAgICAgICAvLyBJZ25vcmUgaWRlbnRpZmllcnMgaW4gaW5jbHVkZSBtb2RlCi0gICAgICAgICQkID0gTlVMTDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIExvb2t1cCB0aGUgaWRlbnRpZmllciBpbiB0aGUgY3VycmVudCBzY29wZQotICAgICAgICAkJCA9IGdfc2NvcGUtPmdldF90eXBlKCQxKTsKLSAgICAgICAgaWYgKCQkID09IE5VTEwpIHsKLSAgICAgICAgICAvKgotICAgICAgICAgICAqIEVpdGhlciB0aGlzIHR5cGUgaXNuJ3QgeWV0IGRlY2xhcmVkLCBvciBpdCdzIG5ldmVyCi0gICAgICAgICAgICAgZGVjbGFyZWQuICBFaXRoZXIgd2F5IGFsbG93IGl0IGFuZCB3ZSdsbCBmaWd1cmUgaXQgb3V0Ci0gICAgICAgICAgICAgZHVyaW5nIGdlbmVyYXRpb24uCi0gICAgICAgICAgICovCi0gICAgICAgICAgJCQgPSBuZXcgdF90eXBlZGVmKGdfcHJvZ3JhbSwgJDEsIHRydWUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotfCBCYXNlVHlwZQotICAgIHsKLSAgICAgIHBkZWJ1ZygiRmllbGRUeXBlIC0+IEJhc2VUeXBlIik7Ci0gICAgICAkJCA9ICQxOwotICAgIH0KLXwgQ29udGFpbmVyVHlwZQotICAgIHsKLSAgICAgIHBkZWJ1ZygiRmllbGRUeXBlIC0+IENvbnRhaW5lclR5cGUiKTsKLSAgICAgICQkID0gJDE7Ci0gICAgfQotCi1CYXNlVHlwZTogU2ltcGxlQmFzZVR5cGUgVHlwZUFubm90YXRpb25zCi0gICAgewotICAgICAgcGRlYnVnKCJCYXNlVHlwZSAtPiBTaW1wbGVCYXNlVHlwZSBUeXBlQW5ub3RhdGlvbnMiKTsKLSAgICAgIGlmICgkMiAhPSBOVUxMKSB7Ci0gICAgICAgICQkID0gbmV3IHRfYmFzZV90eXBlKCpzdGF0aWNfY2FzdDx0X2Jhc2VfdHlwZSo+KCQxKSk7Ci0gICAgICAgICQkLT5hbm5vdGF0aW9uc18gPSAkMi0+YW5ub3RhdGlvbnNfOwotICAgICAgICBkZWxldGUgJDI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAkJCA9ICQxOwotICAgICAgfQotICAgIH0KLQotU2ltcGxlQmFzZVR5cGU6Ci0gIHRva19zdHJpbmcKLSAgICB7Ci0gICAgICBwZGVidWcoIkJhc2VUeXBlIC0+IHRva19zdHJpbmciKTsKLSAgICAgICQkID0gZ190eXBlX3N0cmluZzsKLSAgICB9Ci18IHRva19iaW5hcnkKLSAgICB7Ci0gICAgICBwZGVidWcoIkJhc2VUeXBlIC0+IHRva19iaW5hcnkiKTsKLSAgICAgICQkID0gZ190eXBlX2JpbmFyeTsKLSAgICB9Ci18IHRva19zbGlzdAotICAgIHsKLSAgICAgIHBkZWJ1ZygiQmFzZVR5cGUgLT4gdG9rX3NsaXN0Iik7Ci0gICAgICAkJCA9IGdfdHlwZV9zbGlzdDsKLSAgICB9Ci18IHRva19ib29sCi0gICAgewotICAgICAgcGRlYnVnKCJCYXNlVHlwZSAtPiB0b2tfYm9vbCIpOwotICAgICAgJCQgPSBnX3R5cGVfYm9vbDsKLSAgICB9Ci18IHRva19ieXRlCi0gICAgewotICAgICAgcGRlYnVnKCJCYXNlVHlwZSAtPiB0b2tfYnl0ZSIpOwotICAgICAgJCQgPSBnX3R5cGVfYnl0ZTsKLSAgICB9Ci18IHRva19pMTYKLSAgICB7Ci0gICAgICBwZGVidWcoIkJhc2VUeXBlIC0+IHRva19pMTYiKTsKLSAgICAgICQkID0gZ190eXBlX2kxNjsKLSAgICB9Ci18IHRva19pMzIKLSAgICB7Ci0gICAgICBwZGVidWcoIkJhc2VUeXBlIC0+IHRva19pMzIiKTsKLSAgICAgICQkID0gZ190eXBlX2kzMjsKLSAgICB9Ci18IHRva19pNjQKLSAgICB7Ci0gICAgICBwZGVidWcoIkJhc2VUeXBlIC0+IHRva19pNjQiKTsKLSAgICAgICQkID0gZ190eXBlX2k2NDsKLSAgICB9Ci18IHRva19kb3VibGUKLSAgICB7Ci0gICAgICBwZGVidWcoIkJhc2VUeXBlIC0+IHRva19kb3VibGUiKTsKLSAgICAgICQkID0gZ190eXBlX2RvdWJsZTsKLSAgICB9Ci0KLUNvbnRhaW5lclR5cGU6IFNpbXBsZUNvbnRhaW5lclR5cGUgVHlwZUFubm90YXRpb25zCi0gICAgewotICAgICAgcGRlYnVnKCJDb250YWluZXJUeXBlIC0+IFNpbXBsZUNvbnRhaW5lclR5cGUgVHlwZUFubm90YXRpb25zIik7Ci0gICAgICAkJCA9ICQxOwotICAgICAgaWYgKCQyICE9IE5VTEwpIHsKLSAgICAgICAgJCQtPmFubm90YXRpb25zXyA9ICQyLT5hbm5vdGF0aW9uc187Ci0gICAgICAgIGRlbGV0ZSAkMjsKLSAgICAgIH0KLSAgICB9Ci0KLVNpbXBsZUNvbnRhaW5lclR5cGU6Ci0gIE1hcFR5cGUKLSAgICB7Ci0gICAgICBwZGVidWcoIlNpbXBsZUNvbnRhaW5lclR5cGUgLT4gTWFwVHlwZSIpOwotICAgICAgJCQgPSAkMTsKLSAgICB9Ci18IFNldFR5cGUKLSAgICB7Ci0gICAgICBwZGVidWcoIlNpbXBsZUNvbnRhaW5lclR5cGUgLT4gU2V0VHlwZSIpOwotICAgICAgJCQgPSAkMTsKLSAgICB9Ci18IExpc3RUeXBlCi0gICAgewotICAgICAgcGRlYnVnKCJTaW1wbGVDb250YWluZXJUeXBlIC0+IExpc3RUeXBlIik7Ci0gICAgICAkJCA9ICQxOwotICAgIH0KLQotTWFwVHlwZToKLSAgdG9rX21hcCBDcHBUeXBlICc8JyBGaWVsZFR5cGUgJywnIEZpZWxkVHlwZSAnPicKLSAgICB7Ci0gICAgICBwZGVidWcoIk1hcFR5cGUgLT4gdG9rX21hcCA8RmllbGRUeXBlLCBGaWVsZFR5cGU+Iik7Ci0gICAgICAkJCA9IG5ldyB0X21hcCgkNCwgJDYpOwotICAgICAgaWYgKCQyICE9IE5VTEwpIHsKLSAgICAgICAgKCh0X2NvbnRhaW5lciopJCQpLT5zZXRfY3BwX25hbWUoc3RkOjpzdHJpbmcoJDIpKTsKLSAgICAgIH0KLSAgICB9Ci0KLVNldFR5cGU6Ci0gIHRva19zZXQgQ3BwVHlwZSAnPCcgRmllbGRUeXBlICc+JwotICAgIHsKLSAgICAgIHBkZWJ1ZygiU2V0VHlwZSAtPiB0b2tfc2V0PEZpZWxkVHlwZT4iKTsKLSAgICAgICQkID0gbmV3IHRfc2V0KCQ0KTsKLSAgICAgIGlmICgkMiAhPSBOVUxMKSB7Ci0gICAgICAgICgodF9jb250YWluZXIqKSQkKS0+c2V0X2NwcF9uYW1lKHN0ZDo6c3RyaW5nKCQyKSk7Ci0gICAgICB9Ci0gICAgfQotCi1MaXN0VHlwZToKLSAgdG9rX2xpc3QgJzwnIEZpZWxkVHlwZSAnPicgQ3BwVHlwZQotICAgIHsKLSAgICAgIHBkZWJ1ZygiTGlzdFR5cGUgLT4gdG9rX2xpc3Q8RmllbGRUeXBlPiIpOwotICAgICAgY2hlY2tfZm9yX2xpc3Rfb2ZfYnl0ZXMoJDMpOwotICAgICAgJCQgPSBuZXcgdF9saXN0KCQzKTsKLSAgICAgIGlmICgkNSAhPSBOVUxMKSB7Ci0gICAgICAgICgodF9jb250YWluZXIqKSQkKS0+c2V0X2NwcF9uYW1lKHN0ZDo6c3RyaW5nKCQ1KSk7Ci0gICAgICB9Ci0gICAgfQotCi1DcHBUeXBlOgotICB0b2tfY3BwX3R5cGUgdG9rX2xpdGVyYWwKLSAgICB7Ci0gICAgICAkJCA9ICQyOwotICAgIH0KLXwKLSAgICB7Ci0gICAgICAkJCA9IE5VTEw7Ci0gICAgfQotCi1UeXBlQW5ub3RhdGlvbnM6Ci0gICcoJyBUeXBlQW5ub3RhdGlvbkxpc3QgJyknCi0gICAgewotICAgICAgcGRlYnVnKCJUeXBlQW5ub3RhdGlvbnMgLT4gKCBUeXBlQW5ub3RhdGlvbkxpc3QgKSIpOwotICAgICAgJCQgPSAkMjsKLSAgICB9Ci18Ci0gICAgewotICAgICAgJCQgPSBOVUxMOwotICAgIH0KLQotVHlwZUFubm90YXRpb25MaXN0OgotICBUeXBlQW5ub3RhdGlvbkxpc3QgVHlwZUFubm90YXRpb24KLSAgICB7Ci0gICAgICBwZGVidWcoIlR5cGVBbm5vdGF0aW9uTGlzdCAtPiBUeXBlQW5ub3RhdGlvbkxpc3QgLCBUeXBlQW5ub3RhdGlvbiIpOwotICAgICAgJCQgPSAkMTsKLSAgICAgICQkLT5hbm5vdGF0aW9uc19bJDItPmtleV0gPSAkMi0+dmFsOwotICAgICAgZGVsZXRlICQyOwotICAgIH0KLXwKLSAgICB7Ci0gICAgICAvKiBKdXN0IHVzZSBhIGR1bW15IHN0cnVjdHVyZSB0byBob2xkIHRoZSBhbm5vdGF0aW9ucy4gKi8KLSAgICAgICQkID0gbmV3IHRfc3RydWN0KGdfcHJvZ3JhbSk7Ci0gICAgfQotCi1UeXBlQW5ub3RhdGlvbjoKLSAgdG9rX2lkZW50aWZpZXIgVHlwZUFubm90YXRpb25WYWx1ZSBDb21tYU9yU2VtaWNvbG9uT3B0aW9uYWwKLSAgICB7Ci0gICAgICBwZGVidWcoIlR5cGVBbm5vdGF0aW9uIC0+IFR5cGVBbm5vdGF0aW9uVmFsdWUiKTsKLSAgICAgICQkID0gbmV3IHRfYW5ub3RhdGlvbjsKLSAgICAgICQkLT5rZXkgPSAkMTsKLSAgICAgICQkLT52YWwgPSAkMjsKLSAgICB9Ci0KLVR5cGVBbm5vdGF0aW9uVmFsdWU6Ci0gICc9JyB0b2tfbGl0ZXJhbAotICAgIHsKLSAgICAgIHBkZWJ1ZygiVHlwZUFubm90YXRpb25WYWx1ZSAtPiA9IHRva19saXRlcmFsIik7Ci0gICAgICAkJCA9ICQyOwotICAgIH0KLXwKLSAgICB7Ci0gICAgICBwZGVidWcoIlR5cGVBbm5vdGF0aW9uVmFsdWUgLT4iKTsKLSAgICAgICQkID0gc3RyZHVwKCIxIik7Ci0gICAgfQotCi0lJQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy93aW5kb3dzL2NvbmZpZy5oIGIvY29tcGlsZXIvY3BwL3NyYy93aW5kb3dzL2NvbmZpZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDk1NjcyLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvd2luZG93cy9jb25maWcuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX1dJTkRPV1NfQ09ORklHX0hfCi0jZGVmaW5lIF9USFJJRlRfV0lORE9XU19DT05GSUdfSF8gMQotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID4gMTIwMCkKLSNwcmFnbWEgb25jZQotI2VuZGlmIC8vIF9NU0NfVkVSCi0KLSNpZm5kZWYgX1dJTjMyCi0jZXJyb3IgIlRoaXMgaXMgYSBXaW5kb3dzIGhlYWRlciBvbmx5IgotI2VuZGlmCi0KLSNpbmNsdWRlIDxpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPGRpcmVjdC5oPgotCi0jZGVmaW5lIHN0cnRvbGwoYmVnaW5fcHRyLCBlbmRfcHRyLCBsZW5ndGgpIF9zdHJ0b2k2NChiZWdpbl9wdHIsIGVuZF9wdHIsIGxlbmd0aCkKLQotI2RlZmluZSBQUkl1NjQgIkk2NGQiCi0jZGVmaW5lIFBSSWk2NCAiSTY0ZCIKLQotLy8gc3F1ZWxjaCBkZXByZWNhdGlvbiB3YXJuaW5ncwotI3ByYWdtYSB3YXJuaW5nKGRpc2FibGU6NDk5NikKLS8vIHNxdWVsY2ggYm9vbCBjb252ZXJzaW9uIHBlcmZvcm1hbmNlIHdhcm5pbmcKLSNwcmFnbWEgd2FybmluZyhkaXNhYmxlOjQ4MDApCi0KLQotI2VuZGlmIC8vIF9USFJJRlRfV0lORE9XU19DT05GSUdfSF8KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvd2luZG93cy92ZXJzaW9uLmguaW4gYi9jb21waWxlci9jcHAvc3JjL3dpbmRvd3MvdmVyc2lvbi5oLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGViY2E2Li4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvd2luZG93cy92ZXJzaW9uLmguaW4KKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9XSU5ET1dTX1ZFUlNJT05fSF8KLSNkZWZpbmUgX1RIUklGVF9XSU5ET1dTX1ZFUlNJT05fSF8gMQotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID4gMTIwMCkKLSNwcmFnbWEgb25jZQotI2VuZGlmIC8vIF9NU0NfVkVSCi0KLSNpZm5kZWYgX1dJTjMyCi0jZXJyb3IgIlRoaXMgaXMgYSBXaW5kb3dzIGhlYWRlciBvbmx5IgotI2VuZGlmCi0KLSNkZWZpbmUgVEhSSUZUX1ZFUlNJT04gIkBQQUNLQUdFX1ZFUlNJT05AIgotCi0jZW5kaWYgLy8gX1RIUklGVF9XSU5ET1dTX1ZFUlNJT05fSF8KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0L0NNYWtlTGlzdHMudHh0IGIvY29tcGlsZXIvY3BwL3Rlc3QvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA5ZjIzZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0L0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsOTIgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisKK2lmKCR7V0lUSF9QTFVHSU59KQorICAgIGluY2x1ZGVfZGlyZWN0b3JpZXMoU1lTVEVNICIke0Jvb3N0X0lOQ0xVREVfRElSU30iKQorCisgICAgIyBNYWtlIHN1cmUgZ2VuLWNwcCBmaWxlcyBjYW4gYmUgaW5jbHVkZWQKKyAgICBpbmNsdWRlX2RpcmVjdG9yaWVzKCIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0iKQorCisgICAgc2V0KHBsdWdpbnRlc3RfU09VUkNFUworICAgICAgICBwbHVnaW4vY29udmVyc2lvbl90ZXN0LmNjCisgICAgKQorICAgIGFkZF9leGVjdXRhYmxlKHBsdWdpbnRlc3QgJHtwbHVnaW50ZXN0X1NPVVJDRVN9KQorICAgIGlmKFdJVEhfU0hBUkVEX0xJQiBBTkQgTk9UIE1TVkMpCisgICAgICAgIHRhcmdldF9saW5rX2xpYnJhcmllcyhwbHVnaW50ZXN0CisgICAgICAgICAgICB0aHJpZnRjCisgICAgICAgICAgICAke0Jvb3N0X0xJQlJBUklFU30KKyAgICAgICAgKQorICAgIGVsc2UoKQorICAgICAgICB0YXJnZXRfbGlua19saWJyYXJpZXMocGx1Z2ludGVzdAorICAgICAgICAgICAgdGhyaWZ0Y19zdGF0aWMKKyAgICAgICAgICAgIHRocmlmdF9zdGF0aWMKKyAgICAgICAgICAgICR7Qm9vc3RfTElCUkFSSUVTfQorICAgICAgICApCisgICAgZW5kaWYoKQorICAgIGFkZF90ZXN0KE5BTUUgUGx1Z2luVW5pdFRlc3QgQ09NTUFORCBwbHVnaW50ZXN0KQorCisgICAgc2V0KHRocmlmdC1nZW4tbXljcHBfU09VUkNFUworICAgICAgICAuLi9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfY3BwX2dlbmVyYXRvci5jYworICAgICAgICBwbHVnaW4vY3BwX3BsdWdpbi5jYworICAgICkKKyAgICBhZGRfZXhlY3V0YWJsZSh0aHJpZnQtZ2VuLW15Y3BwICR7dGhyaWZ0LWdlbi1teWNwcF9TT1VSQ0VTfSkKKyAgICBpZihXSVRIX1NIQVJFRF9MSUIgQU5EIE5PVCBNU1ZDKQorICAgICAgICB0YXJnZXRfbGlua19saWJyYXJpZXModGhyaWZ0LWdlbi1teWNwcCB0aHJpZnRjKQorICAgIGVsc2UoKQorICAgICAgICB0YXJnZXRfbGlua19saWJyYXJpZXModGhyaWZ0LWdlbi1teWNwcCB0aHJpZnRjX3N0YXRpYyB0aHJpZnRfc3RhdGljKQorICAgIGVuZGlmKCkKKworICAgIGlmKENNQUtFX0JVSUxEX1RZUEUgU1RSRVFVQUwgIkRlYnVnIikKKyAgICAgICAgc2V0KEJVSUxEVFlQRSAiRGVidWciKQorICAgIGVsc2UoKQorICAgICAgICAjIFJlbFdpdGhEZWJJbmZvIGdlbmVyYXRlcyBiaW5hcmllcyBpbiAiUmVsZWFzZSIgZGlyZWN0b3J5IHRvbworICAgICAgICBzZXQoQlVJTERUWVBFICJSZWxlYXNlIikKKyAgICBlbmRpZigpCisKKyAgICBzZXRfZGlyZWN0b3J5X3Byb3BlcnRpZXMoUFJPUEVSVElFUworICAgICAgICBBRERJVElPTkFMX01BS0VfQ0xFQU5fRklMRVMgZ2VuLWNwcAorICAgICAgICBBRERJVElPTkFMX01BS0VfQ0xFQU5fRklMRVMgZ2VuLW15Y3BwKQorCisgICAgZmlsZShNQUtFX0RJUkVDVE9SWSAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWNwcCkKKyAgICBmaWxlKE1BS0VfRElSRUNUT1JZICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4tbXljcHApCisgICAgYWRkX3Rlc3QoTkFNRSBQbHVnaW5JbnRlZ3JhdGlvblRlc3QKKyAgICAgICAgICAgICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0KKyAgICAgICAgICAgICAgICAgLURUSFJJRlRfQ09NUElMRVI9JHtUSFJJRlRfQ09NUElMRVJ9CisgICAgICAgICAgICAgICAgIC1EQklORElSPSR7Q01BS0VfUlVOVElNRV9PVVRQVVRfRElSRUNUT1JZfQorICAgICAgICAgICAgICAgICAtREJVSUxEVFlQRT0ke0JVSUxEVFlQRX0KKyAgICAgICAgICAgICAgICAgLURDVVJESVI9JHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9CisgICAgICAgICAgICAgICAgIC1EU1JDRElSPSR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfQorICAgICAgICAgICAgICAgICAtUCAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vY3BwX3BsdWdpbl90ZXN0LmNtYWtlKQorZW5kaWYoKQorCitmaWxlKEdMT0IgS0VZV09SRF9TQU1QTEVTICIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0va2V5d29yZC1zYW1wbGVzLyoudGhyaWZ0IikKK2ZvcmVhY2goTEFORyAke3RocmlmdF9jb21waWxlcl9MQU5HU30pCisgICAgZm9yZWFjaChTQU1QTEUgJHtLRVlXT1JEX1NBTVBMRVN9KQorICAgICAgICBnZXRfZmlsZW5hbWVfY29tcG9uZW50KEZJTEVOQU1FICR7U0FNUExFfSBOQU1FX1dFKQorICAgICAgICBhZGRfdGVzdChOQU1FICIke0xBTkd9XyR7RklMRU5BTUV9IgorICAgICAgICAgICAgQ09NTUFORCB0aHJpZnQtY29tcGlsZXIgLS1nZW4gJHtMQU5HfSAke1NBTVBMRX0pCisgICAgICAgIHNldF90ZXN0c19wcm9wZXJ0aWVzKCIke0xBTkd9XyR7RklMRU5BTUV9IiBQUk9QRVJUSUVTCisgICAgICAgICAgICBQQVNTX1JFR1VMQVJfRVhQUkVTU0lPTiAiQ2Fubm90IHVzZSByZXNlcnZlZCBsYW5ndWFnZSBrZXl3b3JkIikKKyAgICBlbmRmb3JlYWNoKCkKK2VuZGZvcmVhY2goKQorCisKK2ZpbmRfcGFja2FnZShQeXRob25JbnRlcnAgUkVRVUlSRUQpCithZGRfdGVzdChOQU1FIFN0YWxlbmVzc0NoZWNrVGVzdCBDT01NQU5EICR7UFlUSE9OX0VYRUNVVEFCTEV9ICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9jb21waWxlci9zdGFsZW5lc3NfY2hlY2sucHkgJHtUSFJJRlRfQ09NUElMRVJ9KQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3QvTWFrZWZpbGUuYW0gYi9jb21waWxlci9jcHAvdGVzdC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2ZjOTFkCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3QvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw2MCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisjCisjIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCisjIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCisjIGRldGFpbHMuCisKK0FVVE9NQUtFX09QVElPTlMgPSBzdWJkaXItb2JqZWN0cyBzZXJpYWwtdGVzdHMKKworQU1fQ1BQRkxBR1MgPSAkKEJPT1NUX0NQUEZMQUdTKSAtSSQodG9wX3NyY2RpcikvY29tcGlsZXIvY3BwL3NyYworQU1fTERGTEFHUyA9ICQoQk9PU1RfTERGTEFHUykKK0FNX0NYWEZMQUdTID0gLVdhbGwgLVdleHRyYSAtcGVkYW50aWMKKworaWYgV0lUSF9QTFVHSU4KK2NoZWNrX1BST0dSQU1TID0gcGx1Z2ludGVzdAorCitub2luc3RfUFJPR1JBTVMgPSB0aHJpZnQtZ2VuLW15Y3BwCisKK2FsbC1sb2NhbDogdGhyaWZ0LWdlbi1iaW5jYXQKKworQU1fQ1BQRkxBR1MgKz0gLUkkKHRvcF9zcmNkaXIpL2xpYi9jcHAvc3JjIC1JJCh0b3BfYnVpbGRkaXIpL2xpYi9jcHAvc3JjCisKK3BsdWdpbnRlc3RfU09VUkNFUyA9IHBsdWdpbi9jb252ZXJzaW9uX3Rlc3QuY2MKK3BsdWdpbnRlc3RfTERBREQgPSAkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL2xpYnRocmlmdGMubGEKKwordGhyaWZ0X2dlbl9teWNwcF9TT1VSQ0VTID0gcGx1Z2luL2NwcF9wbHVnaW4uY2MgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luL3RfY3BwX2dlbmVyYXRvci5jYwordGhyaWZ0X2dlbl9teWNwcF9DUFBGTEFHUyA9ICQoQU1fQ1BQRkxBR1MpIC1JJCh0b3Bfc3JjZGlyKS9jb21waWxlci9jcHAgLUkkKHRvcF9zcmNkaXIpL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUKK3RocmlmdF9nZW5fbXljcHBfTERBREQgPSAkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL2xpYnRocmlmdGMubGEKKworY3BwX3BsdWdpbl90ZXN0LnNoOiB0aHJpZnQtZ2VuLW15Y3BwCisKK3RocmlmdC1nZW4tYmluY2F0OgorCWNwIGJpbmNhdC5zaCAkQAorCWNobW9kIDc1NSAkQAorCitwbHVnaW5fc3RhYmlsaXR5X3Rlc3Quc2g6IHRocmlmdC1nZW4tYmluY2F0CisKK1RFU1RTID0gJChjaGVja19QUk9HUkFNUykgY3BwX3BsdWdpbl90ZXN0LnNoIHBsdWdpbl9zdGFiaWxpdHlfdGVzdC5zaAorCitjbGVhbi1sb2NhbDoKKwkkKFJNKSAtcmYgZ2VuLWNwcCBnZW4tbXljcHAgZ2VuLWJpbmNhdCB0aHJpZnQtZ2VuLWJpbmNhdAorCitlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3QvYmluY2F0LnNoIGIvY29tcGlsZXIvY3BwL3Rlc3QvYmluY2F0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmM3ZjkwNzgKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdC9iaW5jYXQuc2gKQEAgLTAsMCArMSwzIEBACisjIS9iaW4vYmFzaAorCitleGVjIC9iaW4vY2F0CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdC9jb21waWxlci9JbmNsdWRlZC50aHJpZnQgYi9jb21waWxlci9jcHAvdGVzdC9jb21waWxlci9JbmNsdWRlZC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U4NGFiNgotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0L2NvbXBpbGVyL0luY2x1ZGVkLnRocmlmdApAQCAtMCwwICsxLDE4IEBACitjb25zdCBzdHJpbmcgZm9vID0gImJhciIKKworc3RydWN0IGFfc3RydWN0IHsKKyAgMTogYm9vbCBpbV90cnVlLAorICAyOiBib29sIGltX2ZhbHNlLAorICAzOiBpOCBhX2JpdGUsCisgIDQ6IGkxNiBpbnRlZ2VyMTYsCisgIDU6IGkzMiBpbnRlZ2VyMzIsCisgIDY6IGk2NCBpbnRlZ2VyNjQsCisgIDc6IGRvdWJsZSBkb3VibGVfcHJlY2lzaW9uLAorICA4OiBzdHJpbmcgc29tZV9jaGFyYWN0ZXJzLAorICA5OiBzdHJpbmcgem9tZ191bmljb2RlLAorICAxMDogYm9vbCB3aGF0X3dobywKK30KKworc2VydmljZSBBU2VydmljZSB7CisgIGkzMiBhX3Byb2NlZHVyZSgxOiBpMzIgYXJnKQorfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3QvY29tcGlsZXIvSW5jbHVkaW5nLnRocmlmdCBiL2NvbXBpbGVyL2NwcC90ZXN0L2NvbXBpbGVyL0luY2x1ZGluZy50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc3YWY3YgotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0L2NvbXBpbGVyL0luY2x1ZGluZy50aHJpZnQKQEAgLTAsMCArMSw3IEBACitpbmNsdWRlICJJbmNsdWRlZC50aHJpZnQiCisKK2NvbnN0IHN0cmluZyBzID0gInN0cmluZyIKKworc3RydWN0IEJTdHJ1Y3QgeworICAxOiBJbmNsdWRlZC5hX3N0cnVjdCBvbmVfb2ZfZWFjaAorfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3QvY29tcGlsZXIvU2luZ2xlLnRocmlmdCBiL2NvbXBpbGVyL2NwcC90ZXN0L2NvbXBpbGVyL1NpbmdsZS50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmVjMzAxZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0L2NvbXBpbGVyL1NpbmdsZS50aHJpZnQKQEAgLTAsMCArMSBAQAorY29uc3Qgc3RyaW5nIGZvbyA9ICJiYXIiCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdC9jb21waWxlci9zdGFsZW5lc3NfY2hlY2sucHkgYi9jb21waWxlci9jcHAvdGVzdC9jb21waWxlci9zdGFsZW5lc3NfY2hlY2sucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNWIxMWRmZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0L2NvbXBpbGVyL3N0YWxlbmVzc19jaGVjay5weQpAQCAtMCwwICsxLDE0MiBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uMworIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCitpbXBvcnQgb3MKK2ltcG9ydCBzaHV0aWwKK2ltcG9ydCBzdWJwcm9jZXNzCitpbXBvcnQgc3lzCitpbXBvcnQgdGVtcGZpbGUKK2ltcG9ydCB0aW1lCitpbXBvcnQgdW5pdHRlc3QKKworCitjbGFzcyBUZXN0U3RhbGVuZXNzQ2hlY2sodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgQ1VSUkVOVF9ESVJfUEFUSCA9IG9zLnBhdGguZGlybmFtZShvcy5wYXRoLnJlYWxwYXRoKF9fZmlsZV9fKSkKKyAgICBUSFJJRlRfRVhFQ1VUQUJMRV9QQVRIID0gTm9uZQorICAgIFNJTkdMRV9USFJJRlRfRklMRV9QQVRIID0gb3MucGF0aC5qb2luKENVUlJFTlRfRElSX1BBVEgsICJTaW5nbGUudGhyaWZ0IikKKyAgICBJTkNMVURJTkdfVEhSSUZUX0ZJTEVfUEFUSCA9IG9zLnBhdGguam9pbihDVVJSRU5UX0RJUl9QQVRILCAiSW5jbHVkaW5nLnRocmlmdCIpCisgICAgSU5DTFVERURfVEhSSUZUX0ZJTEVfUEFUSCA9IG9zLnBhdGguam9pbihDVVJSRU5UX0RJUl9QQVRILCAiSW5jbHVkZWQudGhyaWZ0IikKKworICAgIGRlZiB0ZXN0X3N0YWxlbmVzc19jaGVja19vZl9zaW5nbGVfdGhyaWZ0X2ZpbGVfd2l0aG91dF9jaGFuZ2VkX291dHB1dChzZWxmKToKKyAgICAgICAgdGVtcF9kaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKGRpcj1UZXN0U3RhbGVuZXNzQ2hlY2suQ1VSUkVOVF9ESVJfUEFUSCkKKworICAgICAgICBjb21tYW5kID0gW1Rlc3RTdGFsZW5lc3NDaGVjay5USFJJRlRfRVhFQ1VUQUJMRV9QQVRILCAiLWdlbiIsICJjcHAiLCAiLW8iLCB0ZW1wX2Rpcl0KKyAgICAgICAgY29tbWFuZCArPSBbVGVzdFN0YWxlbmVzc0NoZWNrLlNJTkdMRV9USFJJRlRfRklMRV9QQVRIXQorICAgICAgICBzdWJwcm9jZXNzLmNhbGwoY29tbWFuZCkKKworICAgICAgICB1c2VkX2ZpbGVfcGF0aCA9IG9zLnBhdGguam9pbih0ZW1wX2RpciwgImdlbi1jcHAiLCAiU2luZ2xlX2NvbnN0YW50cy5jcHAiKQorCisgICAgICAgIGZpcnN0X21vZGlmaWNhdGlvbl90aW1lID0gb3MucGF0aC5nZXRtdGltZShvcy5wYXRoLmpvaW4odXNlZF9maWxlX3BhdGgpKQorCisgICAgICAgIHRpbWUuc2xlZXAoMC4xKQorCisgICAgICAgIHN1YnByb2Nlc3MuY2FsbChjb21tYW5kKQorCisgICAgICAgIHNlY29uZF9tb2RpZmljYXRpb25fdGltZSA9IG9zLnBhdGguZ2V0bXRpbWUodXNlZF9maWxlX3BhdGgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWNvbmRfbW9kaWZpY2F0aW9uX3RpbWUsIGZpcnN0X21vZGlmaWNhdGlvbl90aW1lKQorCisgICAgICAgIHNodXRpbC5ybXRyZWUodGVtcF9kaXIsIGlnbm9yZV9lcnJvcnM9VHJ1ZSkKKworICAgIGRlZiB0ZXN0X3N0YWxlbmVzc19jaGVja19vZl9zaW5nbGVfdGhyaWZ0X2ZpbGVfd2l0aF9jaGFuZ2VkX291dHB1dChzZWxmKToKKyAgICAgICAgdGVtcF9kaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKGRpcj1UZXN0U3RhbGVuZXNzQ2hlY2suQ1VSUkVOVF9ESVJfUEFUSCkKKworICAgICAgICBjb21tYW5kID0gW1Rlc3RTdGFsZW5lc3NDaGVjay5USFJJRlRfRVhFQ1VUQUJMRV9QQVRILCAiLWdlbiIsICJjcHAiLCAiLW8iLCB0ZW1wX2Rpcl0KKyAgICAgICAgY29tbWFuZCArPSBbVGVzdFN0YWxlbmVzc0NoZWNrLlNJTkdMRV9USFJJRlRfRklMRV9QQVRIXQorICAgICAgICBzdWJwcm9jZXNzLmNhbGwoY29tbWFuZCkKKworICAgICAgICB1c2VkX2ZpbGVfcGF0aCA9IG9zLnBhdGguam9pbih0ZW1wX2RpciwgImdlbi1jcHAiLCAiU2luZ2xlX2NvbnN0YW50cy5jcHAiKQorCisgICAgICAgIGZpcnN0X21vZGlmaWNhdGlvbl90aW1lID0gb3MucGF0aC5nZXRtdGltZShvcy5wYXRoLmpvaW4odXNlZF9maWxlX3BhdGgpKQorICAgICAgICB1c2VkX2ZpbGUgPSBvcGVuKHVzZWRfZmlsZV9wYXRoLCAiciIpCisgICAgICAgIGZpcnN0X2NvbnRlbnRzID0gdXNlZF9maWxlLnJlYWQoKQorICAgICAgICB1c2VkX2ZpbGUuY2xvc2UoKQorCisgICAgICAgIHVzZWRfZmlsZSA9IG9wZW4odXNlZF9maWxlX3BhdGgsICJhIikKKyAgICAgICAgdXNlZF9maWxlLndyaXRlKCJcbi8qIFRoaXMgaXMgYSBjb21tZW50ICovXG4iKQorICAgICAgICB1c2VkX2ZpbGUuY2xvc2UoKQorCisgICAgICAgIHRpbWUuc2xlZXAoMC4xKQorCisgICAgICAgIHN1YnByb2Nlc3MuY2FsbChjb21tYW5kKQorCisgICAgICAgIHNlY29uZF9tb2RpZmljYXRpb25fdGltZSA9IG9zLnBhdGguZ2V0bXRpbWUodXNlZF9maWxlX3BhdGgpCisgICAgICAgIHVzZWRfZmlsZSA9IG9wZW4odXNlZF9maWxlX3BhdGgsICJyIikKKyAgICAgICAgc2Vjb25kX2NvbnRlbnRzID0gdXNlZF9maWxlLnJlYWQoKQorICAgICAgICB1c2VkX2ZpbGUuY2xvc2UoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0R3JlYXRlcihzZWNvbmRfbW9kaWZpY2F0aW9uX3RpbWUsIGZpcnN0X21vZGlmaWNhdGlvbl90aW1lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpcnN0X2NvbnRlbnRzLCBzZWNvbmRfY29udGVudHMpCisKKyAgICAgICAgc2h1dGlsLnJtdHJlZSh0ZW1wX2RpciwgaWdub3JlX2Vycm9ycz1UcnVlKQorCisgICAgZGVmIHRlc3Rfc3RhbGVuZXNzX2NoZWNrX29mX2luY2x1ZGVkX2ZpbGUoc2VsZik6CisgICAgICAgIHRlbXBfZGlyID0gdGVtcGZpbGUubWtkdGVtcChkaXI9VGVzdFN0YWxlbmVzc0NoZWNrLkNVUlJFTlRfRElSX1BBVEgpCisKKyAgICAgICAgdGVtcF9pbmNsdWRlZF9maWxlX3BhdGggPSBvcy5wYXRoLmpvaW4odGVtcF9kaXIsICJJbmNsdWRlZC50aHJpZnQiKQorICAgICAgICB0ZW1wX2luY2x1ZGluZ19maWxlX3BhdGggPSBvcy5wYXRoLmpvaW4odGVtcF9kaXIsICJJbmNsdWRpbmcudGhyaWZ0IikKKworICAgICAgICBzaHV0aWwuY29weTIoVGVzdFN0YWxlbmVzc0NoZWNrLklOQ0xVREVEX1RIUklGVF9GSUxFX1BBVEgsIHRlbXBfaW5jbHVkZWRfZmlsZV9wYXRoKQorICAgICAgICBzaHV0aWwuY29weTIoVGVzdFN0YWxlbmVzc0NoZWNrLklOQ0xVRElOR19USFJJRlRfRklMRV9QQVRILCB0ZW1wX2luY2x1ZGluZ19maWxlX3BhdGgpCisKKyAgICAgICAgY29tbWFuZCA9IFtUZXN0U3RhbGVuZXNzQ2hlY2suVEhSSUZUX0VYRUNVVEFCTEVfUEFUSCwgIi1nZW4iLCAiY3BwIiwgIi1yZWN1cnNlIiwgIi1vIiwgdGVtcF9kaXJdCisgICAgICAgIGNvbW1hbmQgKz0gW3RlbXBfaW5jbHVkaW5nX2ZpbGVfcGF0aF0KKworICAgICAgICBzdWJwcm9jZXNzLmNhbGwoY29tbWFuZCkKKworICAgICAgICBpbmNsdWRlZF9jb25zdGFudHNfY3BwX2ZpbGVfcGF0aCA9IG9zLnBhdGguam9pbih0ZW1wX2RpciwgImdlbi1jcHAiLCAiSW5jbHVkZWRfY29uc3RhbnRzLmNwcCIpCisgICAgICAgIGluY2x1ZGluZ19jb25zdGFudHNfY3BwX2ZpbGVfcGF0aCA9IG9zLnBhdGguam9pbih0ZW1wX2RpciwgImdlbi1jcHAiLCAiSW5jbHVkaW5nX2NvbnN0YW50cy5jcHAiKQorCisgICAgICAgIGluY2x1ZGVkX2NvbnN0YW50c19jcHBfZmlyc3RfbW9kaWZpY2F0aW9uX3RpbWUgPSBvcy5wYXRoLmdldG10aW1lKGluY2x1ZGVkX2NvbnN0YW50c19jcHBfZmlsZV9wYXRoKQorICAgICAgICBpbmNsdWRpbmdfY29uc3RhbnRzX2NwcF9maXJzdF9tb2RpZmljYXRpb25fdGltZSA9IG9zLnBhdGguZ2V0bXRpbWUoaW5jbHVkaW5nX2NvbnN0YW50c19jcHBfZmlsZV9wYXRoKQorCisgICAgICAgIHRlbXBfaW5jbHVkZWRfZmlsZSA9IG9wZW4odGVtcF9pbmNsdWRlZF9maWxlX3BhdGgsICJhIikKKyAgICAgICAgdGVtcF9pbmNsdWRlZF9maWxlLndyaXRlKCJcbmNvbnN0IGkzMiBhbl9pbnRlZ2VyID0gNDJcbiIpCisgICAgICAgIHRlbXBfaW5jbHVkZWRfZmlsZS5jbG9zZSgpCisKKyAgICAgICAgdGltZS5zbGVlcCgwLjEpCisKKyAgICAgICAgc3VicHJvY2Vzcy5jYWxsKGNvbW1hbmQpCisKKyAgICAgICAgaW5jbHVkZWRfY29uc3RhbnRzX2NwcF9zZWNvbmRfbW9kaWZpY2F0aW9uX3RpbWUgPSBvcy5wYXRoLmdldG10aW1lKGluY2x1ZGVkX2NvbnN0YW50c19jcHBfZmlsZV9wYXRoKQorICAgICAgICBpbmNsdWRpbmdfY29uc3RhbnRzX2NwcF9zZWNvbmRfbW9kaWZpY2F0aW9uX3RpbWUgPSBvcy5wYXRoLmdldG10aW1lKGluY2x1ZGluZ19jb25zdGFudHNfY3BwX2ZpbGVfcGF0aCkKKworICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXIoCisgICAgICAgICAgICBpbmNsdWRlZF9jb25zdGFudHNfY3BwX3NlY29uZF9tb2RpZmljYXRpb25fdGltZSwgaW5jbHVkZWRfY29uc3RhbnRzX2NwcF9maXJzdF9tb2RpZmljYXRpb25fdGltZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGluY2x1ZGluZ19jb25zdGFudHNfY3BwX2ZpcnN0X21vZGlmaWNhdGlvbl90aW1lLCBpbmNsdWRpbmdfY29uc3RhbnRzX2NwcF9zZWNvbmRfbW9kaWZpY2F0aW9uX3RpbWUpCisKKyAgICAgICAgc2h1dGlsLnJtdHJlZSh0ZW1wX2RpciwgaWdub3JlX2Vycm9ycz1UcnVlKQorCisKK2RlZiBzdWl0ZSgpOgorICAgIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKKyAgICBsb2FkZXIgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkKKyAgICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoVGVzdFN0YWxlbmVzc0NoZWNrKSkKKyAgICByZXR1cm4gc3VpdGUKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgICMgVGhlIHBhdGggb2YgVGhyaWZ0IGNvbXBpbGVyICBpcyAgcGFzc2VkIGFzIGFuIGFyZ3VtZW50IHRvIHRoZSB0ZXN0IHNjcmlwdC4KKyAgICAjIFJlbW92ZSBpdCB0byBub3QgY29uZnVzZSB0aGUgdW5pdCB0ZXN0aW5nIGZyYW1ld29yaworICAgIFRlc3RTdGFsZW5lc3NDaGVjay5USFJJRlRfRVhFQ1VUQUJMRV9QQVRIID0gc3lzLmFyZ3ZbLTFdCisgICAgZGVsIHN5cy5hcmd2Wy0xXQorICAgIHVuaXR0ZXN0Lm1haW4oZGVmYXVsdFRlc3Q9InN1aXRlIiwgdGVzdFJ1bm5lcj11bml0dGVzdC5UZXh0VGVzdFJ1bm5lcih2ZXJib3NpdHk9MikpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdC9jcHBfcGx1Z2luX3Rlc3QuY21ha2UgYi9jb21waWxlci9jcHAvdGVzdC9jcHBfcGx1Z2luX3Rlc3QuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQxODI4MQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0L2NwcF9wbHVnaW5fdGVzdC5jbWFrZQpAQCAtMCwwICsxLDQ1IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworZmlsZShNQUtFX0RJUkVDVE9SWSAke0NVUkRJUn0vZ2VuLWNwcCkKK2V4ZWN1dGVfcHJvY2VzcyhDT01NQU5EICR7VEhSSUZUX0NPTVBJTEVSfSAtciAtb3V0ICR7Q1VSRElSfS9nZW4tY3BwIC1nZW4gY3BwICR7U1JDRElSfS8uLi8uLi8uLi90ZXN0L0luY2x1ZGUudGhyaWZ0KQoraWYoRVhJVENPREUpCisgIG1lc3NhZ2UoRkFUQUxfRVJST1IgIkZBSUxFRDogXCIke0FSR1Z9XCI6IFwiJHtFWElUQ09ERX1cIiIpCitlbmRpZigpCitpZihXSU4zMikKKyAgICBzZXQoRU5We1BBVEh9ICIke0JJTkRJUn0vJHtCVUlMRFRZUEV9OyR7QklORElSfTskRU5We1BBVEh9IikKK2Vsc2UoKQorICAgIHNldChFTlZ7UEFUSH0gIiR7QklORElSfTokRU5We1BBVEh9IikKK2VuZGlmKCkKKworZmlsZShNQUtFX0RJUkVDVE9SWSAke0NVUkRJUn0vZ2VuLW15Y3BwKQorZXhlY3V0ZV9wcm9jZXNzKENPTU1BTkQgJHtUSFJJRlRfQ09NUElMRVJ9IC1yIC1vdXQgJHtDVVJESVJ9L2dlbi1teWNwcCAtZ2VuIG15Y3BwICR7U1JDRElSfS8uLi8uLi8uLi90ZXN0L0luY2x1ZGUudGhyaWZ0IFJFU1VMVF9WQVJJQUJMRSBFWElUQ09ERSkKK2lmKEVYSVRDT0RFKQorICBtZXNzYWdlKEZBVEFMX0VSUk9SICJGQUlMRUQ6IFwiJHtFWElUQ09ERX1cIiIpCitlbmRpZigpCisKK2ZpbmRfcHJvZ3JhbShESUZGIGRpZmYpCitpZihESUZGKQorICBleGVjdXRlX3Byb2Nlc3MoQ09NTUFORCAke0RJRkZ9IC11ck4gZ2VuLWNwcCBnZW4tbXljcHAgUkVTVUxUX1ZBUklBQkxFIEVYSVRDT0RFKQorICBpZihFWElUQ09ERSkKKyAgICBtZXNzYWdlKEZBVEFMX0VSUk9SICJGQUlMRUQ6IFwiJHtFWElUQ09ERX1cIiIpCisgIGVuZGlmKCkKK2Vsc2UoKQorICAgIG1lc3NhZ2UoV0FSTklORyAiZGlmZiBleGVjdXRhYmxlIGlzIG5vdCBhdmFpbGFibGUuIE5vdCB2YWxpZGF0aW5nIHBsdWdpbi1nZW5lcmF0ZWQgY29kZS4iKQorZW5kaWYoKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3QvY3BwX3BsdWdpbl90ZXN0LnNoIGIvY29tcGlsZXIvY3BwL3Rlc3QvY3BwX3BsdWdpbl90ZXN0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmRkYjJlMGEKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdC9jcHBfcGx1Z2luX3Rlc3Quc2gKQEAgLTAsMCArMSwyNyBAQAorIyEvYmluL3NoCisKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjIHRoaXMgZmlsZSBpcyBpbnRlbmRlZCB0byBiZSBpbnZva2VkIGJ5IG1ha2UuCitzZXQgLWUKK21rZGlyIC1wIGdlbi1jcHAgZ2VuLW15Y3BwCitQQVRIPS46IiRQQVRIIiAuLi90aHJpZnQgLXIgLW91dCBnZW4tY3BwIC1nZW4gY3BwIC4uLy4uLy4uL3Rlc3QvSW5jbHVkZS50aHJpZnQKK1BBVEg9LjoiJFBBVEgiIC4uL3RocmlmdCAtciAtb3V0IGdlbi1teWNwcCAtZ2VuIG15Y3BwIC4uLy4uLy4uL3Rlc3QvSW5jbHVkZS50aHJpZnQKK2RpZmYgLXVyTiBnZW4tY3BwIGdlbi1teWNwcApkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL2NvbnN0MV9yZXR1cm4udGhyaWZ0IGIvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL2NvbnN0MV9yZXR1cm4udGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczNWU0YWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvY29uc3QxX3JldHVybi50aHJpZnQKQEAgLTAsMCArMSBAQAorY29uc3QgYm9vbCByZXR1cm4gPSAwCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvZW51bTFfcmV0dXJuLnRocmlmdCBiL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9lbnVtMV9yZXR1cm4udGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkODM0ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvZW51bTFfcmV0dXJuLnRocmlmdApAQCAtMCwwICsxLDIgQEAKK2VudW0gcmV0dXJuIHsKK30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9lbnVtMl9yZXR1cm4udGhyaWZ0IGIvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL2VudW0yX3JldHVybi50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJjYWE4ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9lbnVtMl9yZXR1cm4udGhyaWZ0CkBAIC0wLDAgKzEsMyBAQAorZW51bSBlbnVtX25hbWUgeworICByZXR1cm4KK30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9leGNlcHRpb24xX3JldHVybi50aHJpZnQgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvZXhjZXB0aW9uMV9yZXR1cm4udGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhZGIzMzgKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvZXhjZXB0aW9uMV9yZXR1cm4udGhyaWZ0CkBAIC0wLDAgKzEgQEAKK2V4Y2VwdGlvbiByZXR1cm4ge30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9leGNlcHRpb24yX3JldHVybi50aHJpZnQgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvZXhjZXB0aW9uMl9yZXR1cm4udGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5M2MzNTIKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvZXhjZXB0aW9uMl9yZXR1cm4udGhyaWZ0CkBAIC0wLDAgKzEsMyBAQAorZXhjZXB0aW9uIGV4Y2VwdGlvbl9uYW1lIHsKKyAgMTogcmVxdWlyZWQgaTggcmV0dXJuCit9CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvc2VydmljZTFfcmV0dXJuLnRocmlmdCBiL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9zZXJ2aWNlMV9yZXR1cm4udGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyODZhMzYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvc2VydmljZTFfcmV0dXJuLnRocmlmdApAQCAtMCwwICsxIEBACitzZXJ2aWNlIHJldHVybiB7fQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL3NlcnZpY2UyX3JldHVybi50aHJpZnQgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvc2VydmljZTJfcmV0dXJuLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjczMzFkCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL3NlcnZpY2UyX3JldHVybi50aHJpZnQKQEAgLTAsMCArMSwzIEBACitzZXJ2aWNlIHNlcnZpY2VfbmFtZSB7CisgIGJvb2wgZnVuY3Rpb25fbmFtZSgxOiBpMzIgcmV0dXJuKQorfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL3NlcnZpY2UzX3JldHVybi50aHJpZnQgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvc2VydmljZTNfcmV0dXJuLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmRkOTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL3NlcnZpY2UzX3JldHVybi50aHJpZnQKQEAgLTAsMCArMSwzIEBACitzZXJ2aWNlIHNlcnZpY2VfbmFtZSB7CisgIHZvaWQgcmV0dXJuKCkKK30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9zZXJ2aWNlNF9yZXR1cm4udGhyaWZ0IGIvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL3NlcnZpY2U0X3JldHVybi50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA3ODdkZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9zZXJ2aWNlNF9yZXR1cm4udGhyaWZ0CkBAIC0wLDAgKzEsNSBAQAorZXhjZXB0aW9uIGV4Y2VwdGlvbl9uYW1lIHt9CisKK3NlcnZpY2Ugc2VydmljZV9uYW1lIHsKKyAgdm9pZCBmdW5jdGlvbl9uYW1lKCkgdGhyb3dzICggMTogZXhjZXB0aW9uX25hbWUgcmV0dXJuKQorfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL3N0cnVjdDFfcmV0dXJuLnRocmlmdCBiL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9zdHJ1Y3QxX3JldHVybi50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzgyYjhiOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9zdHJ1Y3QxX3JldHVybi50aHJpZnQKQEAgLTAsMCArMSBAQAorc3RydWN0IHJldHVybiB7fQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL3N0cnVjdDJfcmV0dXJuLnRocmlmdCBiL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9zdHJ1Y3QyX3JldHVybi50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA3MDBkMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9zdHJ1Y3QyX3JldHVybi50aHJpZnQKQEAgLTAsMCArMSwzIEBACitzdHJ1Y3Qgc3RydWN0X25hbWUgeworICAxOiByZXF1aXJlZCBib29sIHJldHVybiA9IDEKK30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy90eXBlZGVmMV9yZXR1cm4udGhyaWZ0IGIvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL3R5cGVkZWYxX3JldHVybi50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE1OWJiOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy90eXBlZGVmMV9yZXR1cm4udGhyaWZ0CkBAIC0wLDAgKzEgQEAKK3R5cGVkZWYgYm9vbCByZXR1cm4KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy91bmlvbjFfcmV0dXJuLnRocmlmdCBiL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy91bmlvbjFfcmV0dXJuLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjhkZjEzCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL3VuaW9uMV9yZXR1cm4udGhyaWZ0CkBAIC0wLDAgKzEgQEAKK3VuaW9uIHJldHVybiB7fQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL3VuaW9uMl9yZXR1cm4udGhyaWZ0IGIvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL3VuaW9uMl9yZXR1cm4udGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3MTlkMWUKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvdW5pb24yX3JldHVybi50aHJpZnQKQEAgLTAsMCArMSwzIEBACit1bmlvbiB1bmlvbl9uYW1lIHsKKyAgMTogb3B0aW9uYWwgYm9vbCByZXR1cm49MQorfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3QvcGx1Z2luL2NvbnZlcnNpb25fdGVzdC5jYyBiL2NvbXBpbGVyL2NwcC90ZXN0L3BsdWdpbi9jb252ZXJzaW9uX3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M4ZDgxMgotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0L3BsdWdpbi9jb252ZXJzaW9uX3Rlc3QuY2MKQEAgLTAsMCArMSw0OTggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3Byb2dyYW0uaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGx1Z2luL3R5cGVfdXRpbC5oIgorI2luY2x1ZGUgInRocmlmdC9wbHVnaW4vcGx1Z2luX3R5cGVzLmgiCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8Ym9vc3QvcHJlcHJvY2Vzc29yLmhwcD4KKyNpbmNsdWRlIDxib29zdC90ZXN0L2luY2x1ZGVkL3VuaXRfdGVzdC5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvdGVzdC9wYXJhbWV0ZXJpemVkX3Rlc3QuaHBwPgorCit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ7Cit1c2luZyBuYW1lc3BhY2UgYm9vc3Q6OnVuaXRfdGVzdDsKKworbmFtZXNwYWNlIHRlc3RfZGF0YSB7CisjZGVmaW5lIFRfVEVTVF9UWVBFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEJPT1NUX1BQX1RVUExFX1RPX0xJU1QoMTQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKHByb2dyYW0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VfdHlwZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1fdmFsdWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X3ZhbHVlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVkZWYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UpKQorI2RlZmluZSBUX0RFTEVURV9URVNUREFUQShyLCBkLCBlbGVtKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBmb3IgKHN0ZDo6dmVjdG9yPHRfIyNlbGVtKj46OnJldmVyc2VfaXRlcmF0b3IgaXQgPSBlbGVtIyNzLnJiZWdpbigpOyBpdCAhPSBlbGVtIyNzLnJlbmQoKTsgaXQrKykgXAorICAgIGRlbGV0ZSAqaXQ7CisjZGVmaW5lIFRfREVDTF9URVNUREFUQShyLCBkLCBlbGVtKSBzdGF0aWMgc3RkOjp2ZWN0b3I8IDo6dF8jI2VsZW0qPiBlbGVtIyNzOworQk9PU1RfUFBfTElTVF9GT1JfRUFDSChUX0RFQ0xfVEVTVERBVEEsIF8sIFRfVEVTVF9UWVBFUykKKyN1bmRlZiBUX0RFQ0xfVEVTVERBVEEKKworYm9vbCBoYXNfZGF0YSA9IGZhbHNlOwordm9pZCBjbGVhbnVwKCkgeworICBpZiAoaGFzX2RhdGEpIHsKKyAgICBoYXNfZGF0YSA9IGZhbHNlOworICAgIEJPT1NUX1BQX0xJU1RfRk9SX0VBQ0goVF9ERUxFVEVfVEVTVERBVEEsIF8sIFRfVEVTVF9UWVBFUykKKyAgfQorfQorCit2b2lkIGluaXRfcHJvZ3JhbXMoKSB7CisgIHByb2dyYW1zLnB1c2hfYmFjayhuZXcgdF9wcm9ncmFtKCJwcm9nIHBhdGgiLCAicHJvZ19uYW1lIikpOworfQorCit2b2lkIGluaXRfYmFzZV90eXBlcygpIHsKKyAgYmFzZV90eXBlcy5wdXNoX2JhY2sobmV3IDo6dF9iYXNlX3R5cGUoIm5hbWUwIiwgOjp0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEKSk7CisgIGJhc2VfdHlwZXMucHVzaF9iYWNrKG5ldyA6OnRfYmFzZV90eXBlKCJuYW1lMSIsIDo6dF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HKSk7CisgIGJhc2VfdHlwZXMucHVzaF9iYWNrKG5ldyA6OnRfYmFzZV90eXBlKCJuYW1lMiIsIDo6dF9iYXNlX3R5cGU6OlRZUEVfQk9PTCkpOworICBiYXNlX3R5cGVzLnB1c2hfYmFjayhuZXcgOjp0X2Jhc2VfdHlwZSgibmFtZTMiLCA6OnRfYmFzZV90eXBlOjpUWVBFX0k4KSk7CisgIGJhc2VfdHlwZXMucHVzaF9iYWNrKG5ldyA6OnRfYmFzZV90eXBlKCJuYW1lNCIsIDo6dF9iYXNlX3R5cGU6OlRZUEVfSTE2KSk7CisgIGJhc2VfdHlwZXMucHVzaF9iYWNrKG5ldyA6OnRfYmFzZV90eXBlKCJuYW1lNSIsIDo6dF9iYXNlX3R5cGU6OlRZUEVfSTMyKSk7CisgIGJhc2VfdHlwZXMucHVzaF9iYWNrKG5ldyA6OnRfYmFzZV90eXBlKCJuYW1lNiIsIDo6dF9iYXNlX3R5cGU6OlRZUEVfSTY0KSk7CisgIGJhc2VfdHlwZXMucHVzaF9iYWNrKG5ldyA6OnRfYmFzZV90eXBlKCJuYW1lNyIsIDo6dF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFKSk7Cit9CisKK3ZvaWQgaW5pdF9jb25zdF92YWx1ZXMoKSB7CisgIGNvbnN0X3ZhbHVlcy5wdXNoX2JhY2sobmV3IHRfY29uc3RfdmFsdWUoNDIpKTsKKyAgY29uc3RfdmFsdWVzLnB1c2hfYmFjayhuZXcgdF9jb25zdF92YWx1ZSgiZm9vIikpOworICB7CisgICAgdF9jb25zdF92YWx1ZSogeCA9IG5ldyB0X2NvbnN0X3ZhbHVlOworICAgIHgtPnNldF9kb3VibGUoMy4xNDE1KTsKKyAgICBjb25zdF92YWx1ZXMucHVzaF9iYWNrKHgpOworICB9CisgIHsKKyAgICB0X2NvbnN0X3ZhbHVlKiB4ID0gbmV3IHRfY29uc3RfdmFsdWU7CisgICAgeC0+c2V0X2lkZW50aWZpZXIoImJhciIpOworICAgIHgtPnNldF9lbnVtKGVudW1zWzBdKTsKKyAgICBjb25zdF92YWx1ZXMucHVzaF9iYWNrKHgpOworICB9CisgIHsKKyAgICB0X2NvbnN0X3ZhbHVlKiB4ID0gbmV3IHRfY29uc3RfdmFsdWU7CisgICAgeC0+c2V0X21hcCgpOworICAgIHgtPmFkZF9tYXAoY29uc3RfdmFsdWVzWzBdLCBjb25zdF92YWx1ZXNbMV0pOworICAgIHgtPmFkZF9tYXAoY29uc3RfdmFsdWVzWzFdLCBjb25zdF92YWx1ZXNbMF0pOworICAgIGNvbnN0X3ZhbHVlcy5wdXNoX2JhY2soeCk7CisgIH0KKyAgeworICAgIHRfY29uc3RfdmFsdWUqIHggPSBuZXcgdF9jb25zdF92YWx1ZTsKKyAgICB4LT5zZXRfbGlzdCgpOworICAgIHgtPmFkZF9saXN0KGNvbnN0X3ZhbHVlc1swXSk7CisgICAgeC0+YWRkX2xpc3QoY29uc3RfdmFsdWVzWzFdKTsKKyAgICBjb25zdF92YWx1ZXMucHVzaF9iYWNrKHgpOworICB9Cit9CisKK3ZvaWQgaW5pdF9jb25zdHMoKSB7CisgIC8vIGJhc2VfdHlwZS9lbnVtIGluZGV4ZXMgZm9yIHRoaXMgYW5kIG90aGVyIHRlc3RzIGFyZSBhcmJpdHJhcnkKKyAgY29uc3RzLnB1c2hfYmFjayhuZXcgdF9jb25zdChiYXNlX3R5cGVzWzJdLCAiYWFhIiwgY29uc3RfdmFsdWVzWzBdKSk7CisgIGNvbnN0cy5iYWNrKCktPnNldF9kb2MoInNvZW0gZG9jIik7CisgIGNvbnN0cy5wdXNoX2JhY2sobmV3IHRfY29uc3QoYmFzZV90eXBlc1szXSwgImJiYiIsIGNvbnN0X3ZhbHVlc1sxXSkpOworfQorCit2b2lkIGluaXRfZW51bV92YWx1ZXMoKSB7CisgIGVudW1fdmFsdWVzLnB1c2hfYmFjayhuZXcgdF9lbnVtX3ZhbHVlKCJWQUwxIiwgMTEpKTsKKyAgZW51bV92YWx1ZXMuYmFjaygpLT5zZXRfZG9jKCJlbnVtIGRvYyAxIik7CisgIGVudW1fdmFsdWVzLmJhY2soKS0+YW5ub3RhdGlvbnNfLmluc2VydChzdGQ6Om1ha2VfcGFpcigiYW5ubzEiLCAidmFsMSIpKTsKKworICBlbnVtX3ZhbHVlcy5wdXNoX2JhY2sobmV3IHRfZW51bV92YWx1ZSgiVkFMMiIsIDIyKSk7Cit9CisKK3ZvaWQgaW5pdF9lbnVtcygpIHsKKyAgZW51bXMucHVzaF9iYWNrKG5ldyB0X2VudW0ocHJvZ3JhbXNbMF0pKTsKKyAgZW51bXMuYmFjaygpLT5zZXRfZG9jKCJlbnVtIGRvYyAxIik7CisgIGVudW1zLmJhY2soKS0+YW5ub3RhdGlvbnNfLmluc2VydChzdGQ6Om1ha2VfcGFpcigiYW5ubzEiLCAidmFsMSIpKTsKKyAgZW51bXMuYmFjaygpLT5zZXRfbmFtZSgiZm9vbyIpOworICBlbnVtcy5iYWNrKCktPmFwcGVuZChlbnVtX3ZhbHVlc1swXSk7CisgIGVudW1zLmJhY2soKS0+YXBwZW5kKGVudW1fdmFsdWVzWzFdKTsKK30KKwordm9pZCBpbml0X2xpc3RzKCkgeworICBsaXN0cy5wdXNoX2JhY2sobmV3IHRfbGlzdChlbnVtc1swXSkpOworICBsaXN0cy5wdXNoX2JhY2sobmV3IHRfbGlzdChiYXNlX3R5cGVzWzVdKSk7CisgIGxpc3RzLmJhY2soKS0+c2V0X2NwcF9uYW1lKCJsaXN0X2NwcF9uYW1lXzEiKTsKK30KK3ZvaWQgaW5pdF9zZXRzKCkgeworICBzZXRzLnB1c2hfYmFjayhuZXcgdF9zZXQoYmFzZV90eXBlc1s0XSkpOworICBzZXRzLnB1c2hfYmFjayhuZXcgdF9zZXQoZW51bXNbMF0pKTsKKyAgc2V0cy5iYWNrKCktPnNldF9jcHBfbmFtZSgic2V0X2NwcF9uYW1lXzEiKTsKK30KK3ZvaWQgaW5pdF9tYXBzKCkgeworICBtYXBzLnB1c2hfYmFjayhuZXcgdF9tYXAoYmFzZV90eXBlc1s0XSwgYmFzZV90eXBlc1sxXSkpOworICBtYXBzLnB1c2hfYmFjayhuZXcgdF9tYXAoYmFzZV90eXBlc1s1XSwgZW51bXNbMF0pKTsKKyAgbWFwcy5iYWNrKCktPnNldF9jcHBfbmFtZSgibWFwX2NwcF9uYW1lXzEiKTsKK30KKwordm9pZCBpbml0X3R5cGVkZWZzKCkgeworICB0eXBlZGVmcy5wdXNoX2JhY2sobmV3IHRfdHlwZWRlZihwcm9ncmFtc1swXSwgYmFzZV90eXBlc1szXSwgIlZBTDEiKSk7Cit9Cit2b2lkIGluaXRfZmllbGRzKCkgeworICBmaWVsZHMucHVzaF9iYWNrKG5ldyB0X2ZpZWxkKGJhc2VfdHlwZXNbMV0sICJmMSIpKTsKKyAgZmllbGRzLmJhY2soKS0+c2V0X3JlZmVyZW5jZShmYWxzZSk7CisgIGZpZWxkcy5iYWNrKCktPnNldF9yZXEodF9maWVsZDo6VF9PUFRJT05BTCk7CisgIGZpZWxkcy5wdXNoX2JhY2sobmV3IHRfZmllbGQoYmFzZV90eXBlc1syXSwgImYyIiwgOSkpOworICBmaWVsZHMuYmFjaygpLT5zZXRfcmVmZXJlbmNlKHRydWUpOworICBmaWVsZHMucHVzaF9iYWNrKG5ldyB0X2ZpZWxkKGJhc2VfdHlwZXNbM10sICJmMyIsIDExKSk7CisgIGZpZWxkcy5iYWNrKCktPnNldF9yZXEodF9maWVsZDo6VF9SRVFVSVJFRCk7CisgIGZpZWxkcy5iYWNrKCktPnNldF92YWx1ZShjb25zdF92YWx1ZXNbMF0pOworfQordm9pZCBpbml0X3N0cnVjdHMoKSB7CisgIHN0cnVjdHMucHVzaF9iYWNrKG5ldyB0X3N0cnVjdChwcm9ncmFtc1swXSwgInN0cnVjdDEiKSk7CisgIHN0cnVjdHMuYmFjaygpLT5hcHBlbmQoZmllbGRzWzBdKTsKKyAgc3RydWN0cy5iYWNrKCktPmFwcGVuZChmaWVsZHNbMV0pOworICBzdHJ1Y3RzLnB1c2hfYmFjayhuZXcgdF9zdHJ1Y3QocHJvZ3JhbXNbMF0sICJ1bmlvbjEiKSk7CisgIHN0cnVjdHMuYmFjaygpLT5hcHBlbmQoZmllbGRzWzBdKTsKKyAgc3RydWN0cy5iYWNrKCktPmFwcGVuZChmaWVsZHNbMV0pOworICBzdHJ1Y3RzLmJhY2soKS0+c2V0X3VuaW9uKHRydWUpOworICBzdHJ1Y3RzLnB1c2hfYmFjayhuZXcgdF9zdHJ1Y3QocHJvZ3JhbXNbMF0sICJ4Y2VwdDEiKSk7CisgIHN0cnVjdHMuYmFjaygpLT5zZXRfeGNlcHRpb24odHJ1ZSk7Cit9Cit2b2lkIGluaXRfZnVuY3Rpb25zKCkgeworICBzdHJ1Y3RzLnB1c2hfYmFjayhuZXcgdF9zdHJ1Y3QocHJvZ3JhbXNbMF0sICJlcnJzMSIpKTsKKyAgdF9zdHJ1Y3QqIGVycm9ycyA9IHN0cnVjdHMuYmFjaygpOworICBzdHJ1Y3RzLnB1c2hfYmFjayhuZXcgdF9zdHJ1Y3QocHJvZ3JhbXNbMF0sICJhcmdzMSIpKTsKKyAgdF9zdHJ1Y3QqIGFyZ2xpc3QgPSBzdHJ1Y3RzLmJhY2soKTsKKyAgZnVuY3Rpb25zLnB1c2hfYmFjayhuZXcgdF9mdW5jdGlvbihiYXNlX3R5cGVzWzBdLCAiZnVuYzEiLCBlcnJvcnMsIGFyZ2xpc3QsIGZhbHNlKSk7CisgIGZ1bmN0aW9ucy5wdXNoX2JhY2sobmV3IHRfZnVuY3Rpb24oYmFzZV90eXBlc1swXSwgImZ1bmMyIiwgZXJyb3JzLCBhcmdsaXN0LCB0cnVlKSk7Cit9Cit2b2lkIGluaXRfc2VydmljZXMoKSB7CisgIHNlcnZpY2VzLnB1c2hfYmFjayhuZXcgdF9zZXJ2aWNlKHByb2dyYW1zWzBdKSk7CisgIHNlcnZpY2VzLmJhY2soKS0+c2V0X2RvYygic3J2MSBkb2MiKTsKKyAgc2VydmljZXMuYmFjaygpLT5zZXRfbmFtZSgic3J2MSIpOworICBzZXJ2aWNlcy5iYWNrKCktPmFkZF9mdW5jdGlvbihmdW5jdGlvbnNbMF0pOworICBzZXJ2aWNlcy5iYWNrKCktPmFkZF9mdW5jdGlvbihmdW5jdGlvbnNbMV0pOworCisgIHNlcnZpY2VzLnB1c2hfYmFjayhuZXcgdF9zZXJ2aWNlKHByb2dyYW1zWzBdKSk7CisgIHNlcnZpY2VzLmJhY2soKS0+c2V0X25hbWUoInNydjIiKTsKKyAgc2VydmljZXMuYmFjaygpLT5zZXRfZXh0ZW5kcyhzZXJ2aWNlc1swXSk7Cit9CisKK3N0ZDo6dmVjdG9yPHRfdHlwZSo+IHR5cGVzOwordm9pZCBpbml0X3R5cGVzKCkgeworI2RlZmluZSBUX0NPUFlfVFlQRVModHlwZSkgc3RkOjpjb3B5KHR5cGUjI3MuYmVnaW4oKSwgdHlwZSMjcy5lbmQoKSwgc3RkOjpiYWNrX2luc2VydGVyKHR5cGVzKSkKKyAgVF9DT1BZX1RZUEVTKGJhc2VfdHlwZSk7CisgIFRfQ09QWV9UWVBFUyhlbnVtKTsKKyAgVF9DT1BZX1RZUEVTKHR5cGVkZWYpOworICBUX0NPUFlfVFlQRVMoc3RydWN0KTsKKyAgVF9DT1BZX1RZUEVTKGxpc3QpOworICBUX0NPUFlfVFlQRVMoc2V0KTsKKyAgVF9DT1BZX1RZUEVTKG1hcCk7CisvLyBUX0NPUFlfVFlQRVMoc2VydmljZSk7CisjdW5kZWYgVF9DT1BZX1RZUEVTCit9CisKK3ZvaWQgaW5pdCgpIHsKKyAgaWYgKCFoYXNfZGF0YSkgeworICAgIGhhc19kYXRhID0gdHJ1ZTsKKyNkZWZpbmUgVF9JTklUX1RFU1REQVRBKHIsIGQsIGVsZW0pIGluaXRfIyNlbGVtIyNzKCk7CisgICAgQk9PU1RfUFBfTElTVF9GT1JfRUFDSChUX0lOSVRfVEVTVERBVEEsIF8sIFRfVEVTVF9UWVBFUykKKyAgICBpbml0X3R5cGVzKCk7CisjdW5kZWYgVF9JTklUX1RFU1REQVRBCisgIH0KK30KK30KK3N0cnVjdCBHbG9iYWxGaXh0dXJlIHsKKyAgfkdsb2JhbEZpeHR1cmUoKSB7IHRlc3RfZGF0YTo6Y2xlYW51cCgpOyB9Cit9OworI2lmIChCT09TVF9WRVJTSU9OID49IDEwNTkwMCkKK0JPT1NUX0dMT0JBTF9GSVhUVVJFKEdsb2JhbEZpeHR1cmUpOworI2Vsc2UKK0JPT1NUX0dMT0JBTF9GSVhUVVJFKEdsb2JhbEZpeHR1cmUpCisjZW5kaWYKKwordm9pZCBtaWdyYXRlX2dsb2JhbF9jYWNoZSgpIHsKKyAgcGx1Z2luOjpUeXBlUmVnaXN0cnkgcmVnOworICBwbHVnaW5fb3V0cHV0OjpnZXRfZ2xvYmFsX2NhY2hlKHJlZyk7CisgIHBsdWdpbjo6c2V0X2dsb2JhbF9jYWNoZShyZWcpOworICBwbHVnaW5fb3V0cHV0OjpjbGVhcl9nbG9iYWxfY2FjaGUoKTsKK30KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorVCogcm91bmRfdHJpcChUKiB0KSB7CisgIHR5cGVuYW1lIHBsdWdpbjo6VG9UeXBlPFQ+Ojp0eXBlIHA7CisgIHBsdWdpbjo6Y2xlYXJfZ2xvYmFsX2NhY2hlKCk7CisgIHBsdWdpbl9vdXRwdXQ6OmNsZWFyX2dsb2JhbF9jYWNoZSgpOworICBwbHVnaW5fb3V0cHV0Ojpjb252ZXJ0KHQsIHApOworICBtaWdyYXRlX2dsb2JhbF9jYWNoZSgpOworICByZXR1cm4gcGx1Z2luOjpjb252ZXJ0KHApOworfQorCit2b2lkIHRlc3RfYmFzZV90eXBlKDo6dF9iYXNlX3R5cGUqIHN1dCkgeworICBwbHVnaW46OnRfYmFzZV90eXBlIHA7CisgIHBsdWdpbl9vdXRwdXQ6OmNvbnZlcnQoc3V0LCBwKTsKKyAgYm9vc3Q6OnNjb3BlZF9wdHI8IDo6dF9iYXNlX3R5cGU+IHN1dDIocGx1Z2luOjpjb252ZXJ0KHApKTsKKworI2RlZmluZSBUSFJJRlRfQ0hFQ0sociwgZGF0YSwgZWxlbSkgQk9PU1RfUFBfRVhQQU5EKEJPT1NUX0NIRUNLX0VRVUFMKGRhdGEgZWxlbSwgc3V0Mi0+ZWxlbSkpOworICBCT09TVF9QUF9MSVNUX0ZPUl9FQUNIKFRIUklGVF9DSEVDSywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdXQtPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBCT09TVF9QUF9UVVBMRV9UT19MSVNUKDcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXNfdm9pZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX3N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2Jvb2woKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19zdHJpbmdfbGlzdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2JpbmFyeSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX3N0cmluZ19lbnVtKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfYmFzZV90eXBlKCkpKSkKK30KKwordm9pZCB0ZXN0X2NvbnN0X3ZhbHVlKHRfY29uc3RfdmFsdWUqIHN1dCkgeworICBib29zdDo6c2NvcGVkX3B0cjx0X2NvbnN0X3ZhbHVlPiBzdXQyKHJvdW5kX3RyaXAoc3V0KSk7CisKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoc3V0LT5nZXRfdHlwZSgpLCBzdXQyLT5nZXRfdHlwZSgpKTsKKyAgc3dpdGNoIChzdXQtPmdldF90eXBlKCkpIHsKKyNkZWZpbmUgVF9DT05TVF9WQUxVRV9DQVNFKHR5cGUsIG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY2FzZSB0X2NvbnN0X3ZhbHVlOjp0eXBlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBCT09TVF9DSEVDS19FUVVBTChzdXQtPmdldF8jI25hbWUoKSwgc3V0Mi0+Z2V0XyMjbmFtZSgpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBicmVhaworICAgIFRfQ09OU1RfVkFMVUVfQ0FTRShDVl9JTlRFR0VSLCBpbnRlZ2VyKTsKKyAgICBUX0NPTlNUX1ZBTFVFX0NBU0UoQ1ZfRE9VQkxFLCBkb3VibGUpOworICAgIFRfQ09OU1RfVkFMVUVfQ0FTRShDVl9TVFJJTkcsIHN0cmluZyk7CisgICAgVF9DT05TVF9WQUxVRV9DQVNFKENWX0lERU5USUZJRVIsIGlkZW50aWZpZXIpOworI3VuZGVmIFRfQ09OU1RfVkFMVUVfQ0FTRQorICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX01BUDoKKyAgICBCT09TVF9DSEVDS19FUVVBTChzdXQtPmdldF9tYXAoKS5zaXplKCksIHN1dDItPmdldF9tYXAoKS5zaXplKCkpOworICAgIHsKKyAgICAgIHN0ZDo6bWFwPHRfY29uc3RfdmFsdWU6OnRfY29uc3RfdmFsdWVfdHlwZSwgdF9jb25zdF92YWx1ZTo6dF9jb25zdF92YWx1ZV90eXBlPiBzdXRfdmFsdWVzOworICAgICAgZm9yIChzdGQ6Om1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciBpdCA9IHN1dC0+Z2V0X21hcCgpLmJlZ2luKCk7CisgICAgICAgICAgIGl0ICE9IHN1dC0+Z2V0X21hcCgpLmVuZCgpOyBpdCsrKSB7CisgICAgICAgIHN1dF92YWx1ZXNbaXQtPmZpcnN0LT5nZXRfdHlwZSgpXSA9IGl0LT5zZWNvbmQtPmdldF90eXBlKCk7CisgICAgICB9CisgICAgICBzdGQ6Om1hcDx0X2NvbnN0X3ZhbHVlOjp0X2NvbnN0X3ZhbHVlX3R5cGUsIHRfY29uc3RfdmFsdWU6OnRfY29uc3RfdmFsdWVfdHlwZT4gc3V0Ml92YWx1ZXM7CisgICAgICBmb3IgKHN0ZDo6bWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gc3V0Mi0+Z2V0X21hcCgpLmJlZ2luKCk7CisgICAgICAgICAgIGl0ICE9IHN1dDItPmdldF9tYXAoKS5lbmQoKTsgaXQrKykgeworICAgICAgICBzdXQyX3ZhbHVlc1tpdC0+Zmlyc3QtPmdldF90eXBlKCldID0gaXQtPnNlY29uZC0+Z2V0X3R5cGUoKTsKKyAgICAgIH0KKyAgICAgIEJPT1NUX0NIRUNLX0VRVUFMKHN1dF92YWx1ZXMuYmVnaW4oKS0+Zmlyc3QsIHN1dDJfdmFsdWVzLmJlZ2luKCktPmZpcnN0KTsKKyAgICAgIEJPT1NUX0NIRUNLX0VRVUFMKHN1dF92YWx1ZXMuYmVnaW4oKS0+c2Vjb25kLCBzdXQyX3ZhbHVlcy5iZWdpbigpLT5zZWNvbmQpOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9MSVNUOgorICAgIEJPT1NUX0NIRUNLX0VRVUFMKHN1dC0+Z2V0X2xpc3QoKS5zaXplKCksIHN1dDItPmdldF9saXN0KCkuc2l6ZSgpKTsKKyAgICBCT09TVF9DSEVDS19FUVVBTChzdXQtPmdldF9saXN0KCkuZnJvbnQoKS0+Z2V0X3R5cGUoKSwgc3V0Mi0+Z2V0X2xpc3QoKS5mcm9udCgpLT5nZXRfdHlwZSgpKTsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBCT09TVF9BU1NFUlQoZmFsc2UpOworICAgIGJyZWFrOworICB9Cit9CisKK3ZvaWQgdGVzdF9jb25zdCh0X2NvbnN0KiBzdXQpIHsKKyAgYm9vc3Q6OnNjb3BlZF9wdHI8IDo6dF9jb25zdD4gc3V0Mihyb3VuZF90cmlwKHN1dCkpOworCisgIEJPT1NUX1BQX0xJU1RfRk9SX0VBQ0goVEhSSUZUX0NIRUNLLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN1dC0+LAorICAgICAgICAgICAgICAgICAgICAgICAgIEJPT1NUX1BQX1RVUExFX1RPX0xJU1QoNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnZXRfdHlwZSgpLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X3ZhbHVlKCktPmdldF90eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2RvYygpKSkpCit9CisKK3ZvaWQgdGVzdF9lbnVtX3ZhbHVlKHRfZW51bV92YWx1ZSogc3V0KSB7CisgIGJvb3N0OjpzY29wZWRfcHRyPHRfZW51bV92YWx1ZT4gc3V0Mihyb3VuZF90cmlwKHN1dCkpOworCisgIEJPT1NUX1BQX0xJU1RfRk9SX0VBQ0goVEhSSUZUX0NIRUNLLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN1dC0+LAorICAgICAgICAgICAgICAgICAgICAgICAgIEJPT1NUX1BQX1RVUExFX1RPX0xJU1QoMywgKGdldF9uYW1lKCksIGdldF92YWx1ZSgpLCBnZXRfZG9jKCkpKSkKK30KKwordm9pZCB0ZXN0X2VudW0odF9lbnVtKiBzdXQpIHsKKyAgYm9vc3Q6OnNjb3BlZF9wdHI8IDo6dF9lbnVtPiBzdXQyKHJvdW5kX3RyaXAoc3V0KSk7CisKKyAgQk9PU1RfUFBfTElTVF9GT1JfRUFDSChUSFJJRlRfQ0hFQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgc3V0LT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgQk9PU1RfUFBfVFVQTEVfVE9fTElTVCg2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X21pbl92YWx1ZSgpLT5nZXRfdmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfbWF4X3ZhbHVlKCktPmdldF92YWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9jb25zdGFudF9ieV92YWx1ZSgxMSktPmdldF92YWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9jb25zdGFudF9ieV9uYW1lKCJWQUwxIiktPmdldF92YWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9kb2MoKSkpKQorfQorCit2b2lkIHRlc3RfbGlzdCh0X2xpc3QqIHN1dCkgeworICBib29zdDo6c2NvcGVkX3B0cjx0X2xpc3Q+IHN1dDIocm91bmRfdHJpcChzdXQpKTsKKworICBCT09TVF9QUF9MSVNUX0ZPUl9FQUNIKFRIUklGVF9DSEVDSywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdXQtPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBCT09TVF9QUF9UVVBMRV9UT19MSVNUKDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2V0X2VsZW1fdHlwZSgpLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc19jcHBfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9kb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfbmFtZSgpKSkpCisgIGlmIChzdXQtPmhhc19jcHBfbmFtZSgpKQorICAgIEJPT1NUX0NIRUNLX0VRVUFMKHN1dC0+Z2V0X2NwcF9uYW1lKCksIHN1dDItPmdldF9jcHBfbmFtZSgpKTsKK30KK3ZvaWQgdGVzdF9zZXQodF9zZXQqIHN1dCkgeworICBib29zdDo6c2NvcGVkX3B0cjx0X3NldD4gc3V0Mihyb3VuZF90cmlwKHN1dCkpOworCisgIEJPT1NUX1BQX0xJU1RfRk9SX0VBQ0goVEhSSUZUX0NIRUNLLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN1dC0+LAorICAgICAgICAgICAgICAgICAgICAgICAgIEJPT1NUX1BQX1RVUExFX1RPX0xJU1QoNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnZXRfZWxlbV90eXBlKCktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzX2NwcF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2RvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9uYW1lKCkpKSkKKyAgaWYgKHN1dC0+aGFzX2NwcF9uYW1lKCkpCisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoc3V0LT5nZXRfY3BwX25hbWUoKSwgc3V0Mi0+Z2V0X2NwcF9uYW1lKCkpOworfQordm9pZCB0ZXN0X21hcCh0X21hcCogc3V0KSB7CisgIGJvb3N0OjpzY29wZWRfcHRyPHRfbWFwPiBzdXQyKHJvdW5kX3RyaXAoc3V0KSk7CisKKyAgQk9PU1RfUFBfTElTVF9GT1JfRUFDSChUSFJJRlRfQ0hFQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgc3V0LT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgQk9PU1RfUFBfVFVQTEVfVE9fTElTVCg1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdldF9rZXlfdHlwZSgpLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF92YWxfdHlwZSgpLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc19jcHBfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9kb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfbmFtZSgpKSkpCisgIGlmIChzdXQtPmhhc19jcHBfbmFtZSgpKQorICAgIEJPT1NUX0NIRUNLX0VRVUFMKHN1dC0+Z2V0X2NwcF9uYW1lKCksIHN1dDItPmdldF9jcHBfbmFtZSgpKTsKK30KKwordm9pZCB0ZXN0X3R5cGVkZWYodF90eXBlZGVmKiBzdXQpIHsKKyAgYm9vc3Q6OnNjb3BlZF9wdHI8dF90eXBlZGVmPiBzdXQyKHJvdW5kX3RyaXAoc3V0KSk7CisKKyAgQk9PU1RfUFBfTElTVF9GT1JfRUFDSChUSFJJRlRfQ0hFQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgc3V0LT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgQk9PU1RfUFBfVFVQTEVfVE9fTElTVCg0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdldF9kb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9zeW1ib2xpYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2ZvcndhcmRfdHlwZWRlZigpKSkpCit9CisKK3ZvaWQgdGVzdF90eXBlKHRfdHlwZSogc3V0KSB7CisgIGJvb3N0OjpzY29wZWRfcHRyPHRfdHlwZT4gc3V0Mihyb3VuZF90cmlwKHN1dCkpOworCisgIEJPT1NUX1BQX0xJU1RfRk9SX0VBQ0goVEhSSUZUX0NIRUNLLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN1dC0+LAorICAgICAgICAgICAgICAgICAgICAgICAgIEJPT1NUX1BQX1RVUExFX1RPX0xJU1QoMTUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXNfdm9pZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2Jhc2VfdHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX3N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2Jvb2woKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc190eXBlZGVmKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfZW51bSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX3N0cnVjdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX3hjZXB0aW9uKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfY29udGFpbmVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfbGlzdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX3NldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX21hcCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX3NlcnZpY2UoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfZG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X25hbWUoKSkpKQorfQorCit2b2lkIHRlc3RfZmllbGQodF9maWVsZCogc3V0KSB7CisgIGJvb3N0OjpzY29wZWRfcHRyPHRfZmllbGQ+IHN1dDIocm91bmRfdHJpcChzdXQpKTsKKworICBCT09TVF9QUF9MSVNUX0ZPUl9FQUNIKFRIUklGVF9DSEVDSywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdXQtPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBCT09TVF9QUF9UVVBMRV9UT19MSVNUKDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2V0X3JlcSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9yZWZlcmVuY2UoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfa2V5KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2RvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9uYW1lKCkpKSkKKyAgaWYgKHN1dC0+Z2V0X3ZhbHVlKCkpIHsKKyAgICBUSFJJRlRfQ0hFQ0soLCBzdXQtPiwgZ2V0X3ZhbHVlKCktPmdldF90eXBlKCkpOworICB9IGVsc2UgeworICAgIEJPT1NUX0NIRUNLKCFzdXQyLT5nZXRfdmFsdWUoKSk7CisgIH0KKyAgaWYgKHN1dC0+Z2V0X3R5cGUoKSkgeworICAgIFRIUklGVF9DSEVDSygsIHN1dC0+LCBnZXRfdHlwZSgpLT5nZXRfbmFtZSgpKTsKKyAgfSBlbHNlIHsKKyAgICBCT09TVF9DSEVDSyghc3V0Mi0+Z2V0X3R5cGUoKSk7CisgIH0KK30KK3ZvaWQgdGVzdF9zdHJ1Y3QodF9zdHJ1Y3QqIHN1dCkgeworICBib29zdDo6c2NvcGVkX3B0cjx0X3N0cnVjdD4gc3V0Mihyb3VuZF90cmlwKHN1dCkpOworCisgIEJPT1NUX1BQX0xJU1RfRk9SX0VBQ0goVEhSSUZUX0NIRUNLLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN1dC0+LAorICAgICAgICAgICAgICAgICAgICAgICAgIEJPT1NUX1BQX1RVUExFX1RPX0xJU1QoNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpc191bmlvbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX3hjZXB0aW9uKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfc3RydWN0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2RvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9uYW1lKCkpKSkKK30KKwordm9pZCB0ZXN0X2Z1bmN0aW9uKHRfZnVuY3Rpb24qIHN1dCkgeworICBib29zdDo6c2NvcGVkX3B0cjx0X2Z1bmN0aW9uPiBzdXQyKHJvdW5kX3RyaXAoc3V0KSk7CisKKyAgQk9PU1RfUFBfTElTVF9GT1JfRUFDSCgKKyAgICAgIFRIUklGVF9DSEVDSywKKyAgICAgIHN1dC0+LAorICAgICAgQk9PU1RfUFBfVFVQTEVfVE9fTElTVCg0LCAoZ2V0X2RvYygpLCBnZXRfbmFtZSgpLCBnZXRfcmV0dXJudHlwZSgpLT5nZXRfbmFtZSgpLCBpc19vbmV3YXkoKSkpKQorfQordm9pZCB0ZXN0X3NlcnZpY2UodF9zZXJ2aWNlKiBzdXQpIHsKKyAgYm9vc3Q6OnNjb3BlZF9wdHI8dF9zZXJ2aWNlPiBzdXQyKHJvdW5kX3RyaXAoc3V0KSk7CisKKyAgQk9PU1RfUFBfTElTVF9GT1JfRUFDSChUSFJJRlRfQ0hFQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgc3V0LT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgQk9PU1RfUFBfVFVQTEVfVE9fTElTVCgzLCAoZ2V0X2RvYygpLCBnZXRfbmFtZSgpLCBnZXRfZnVuY3Rpb25zKCkuc2l6ZSgpKSkpCisgIGlmIChzdXQtPmdldF9leHRlbmRzKCkpIHsKKyAgICBUSFJJRlRfQ0hFQ0soLCBzdXQtPiwgZ2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSk7CisgIH0gZWxzZSB7CisgICAgQk9PU1RfQ0hFQ0soIXN1dDItPmdldF9leHRlbmRzKCkpOworICB9Cit9CisKK3ZvaWQgdGVzdF9wcm9ncmFtKHRfcHJvZ3JhbSogc3V0KSB7CisgIGJvb3N0OjpzY29wZWRfcHRyPHRfcHJvZ3JhbT4gc3V0Mihyb3VuZF90cmlwKHN1dCkpOworCisgIEJPT1NUX1BQX0xJU1RfRk9SX0VBQ0goVEhSSUZUX0NIRUNLLCBzdXQtPiwgQk9PU1RfUFBfVFVQTEVfVE9fTElTVCgyLCAoZ2V0X2RvYygpLCBnZXRfbmFtZSgpKSkpCit9Citib29zdDo6dW5pdF90ZXN0Ojp0ZXN0X3N1aXRlKiBkb19pbml0X3VuaXRfdGVzdF9zdWl0ZSgpIHsKKyAgdGVzdF9kYXRhOjppbml0KCk7CisgIHRlc3Rfc3VpdGUqIHRzID0gQk9PU1RfVEVTVF9TVUlURSgiUGx1Z2luQ29udmVyc2lvblRlc3QiKTsKKworI2RlZmluZSBUX1RFU1RfQ0FTRShyLCBkLCB0eXBlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0cy0+YWRkKEJPT1NUX1BBUkFNX1RFU1RfQ0FTRSh0ZXN0XyMjdHlwZSwgdGVzdF9kYXRhOjp0eXBlIyNzLmJlZ2luKCksIHRlc3RfZGF0YTo6dHlwZSMjcy5lbmQoKSkpOworICBCT09TVF9QUF9MSVNUX0ZPUl9FQUNIKFRfVEVTVF9DQVNFLCBfLCBUX1RFU1RfVFlQRVMpCisgIFRfVEVTVF9DQVNFKF8sIF8sIHR5cGUpCisjdW5kZWYgVF9URVNUX0NBU0UKKyAgcmV0dXJuIHRzOworfQorCisjaWZkZWYgQk9PU1RfVEVTVF9EWU5fTElOSworYm9vbCBpbml0X3VuaXRfdGVzdF9zdWl0ZSgpIHsKKyAgZnJhbWV3b3JrOjptYXN0ZXJfdGVzdF9zdWl0ZSgpLmFkZChkb19pbml0X3VuaXRfdGVzdF9zdWl0ZSgpKTsKKyAgcmV0dXJuIHRydWU7Cit9CitpbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKSB7CisgIHJldHVybiA6OmJvb3N0Ojp1bml0X3Rlc3Q6OnVuaXRfdGVzdF9tYWluKCZpbml0X3VuaXRfdGVzdF9zdWl0ZSwgYXJnYywgYXJndik7Cit9CisjZWxzZQorYm9vc3Q6OnVuaXRfdGVzdDo6dGVzdF9zdWl0ZSogaW5pdF91bml0X3Rlc3Rfc3VpdGUoaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgeworICByZXR1cm4gZG9faW5pdF91bml0X3Rlc3Rfc3VpdGUoKTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3QvcGx1Z2luL2NwcF9wbHVnaW4uY2MgYi9jb21waWxlci9jcHAvdGVzdC9wbHVnaW4vY3BwX3BsdWdpbi5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2MxOWYyCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3QvcGx1Z2luL2NwcF9wbHVnaW4uY2MKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAidGhyaWZ0L3BsdWdpbi9wbHVnaW4uaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuaCIKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBwbHVnaW4geworCitjbGFzcyBNeUNwcEdlbmVyYXRvciA6IHB1YmxpYyBHZW5lcmF0b3JQbHVnaW4geworICB2aXJ0dWFsIGludCBnZW5lcmF0ZSg6OnRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMpIHsKKyAgICB0X2dlbmVyYXRvciogZ2VuID0gdF9nZW5lcmF0b3JfcmVnaXN0cnk6OmdldF9nZW5lcmF0b3IocHJvZ3JhbSwgImNwcCIsIHBhcnNlZF9vcHRpb25zLCAiIik7CisgICAgZ2VuLT5nZW5lcmF0ZV9wcm9ncmFtKCk7CisgICAgZGVsZXRlIGdlbjsKKyAgICByZXR1cm4gMDsKKyAgfQorfTsKK30KK30KK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgeworICBhcGFjaGU6OnRocmlmdDo6cGx1Z2luOjpNeUNwcEdlbmVyYXRvciBwOworICByZXR1cm4gcC5leGVjKGFyZ2MsIGFyZ3YpOworfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3QvcGx1Z2luX3N0YWJpbGl0eV90ZXN0LnNoIGIvY29tcGlsZXIvY3BwL3Rlc3QvcGx1Z2luX3N0YWJpbGl0eV90ZXN0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmViN2M5M2QKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdC9wbHVnaW5fc3RhYmlsaXR5X3Rlc3Quc2gKQEAgLTAsMCArMSwzMiBAQAorIyEvYmluL3NoCisKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjIHRoaXMgZmlsZSBpcyBpbnRlbmRlZCB0byBiZSBpbnZva2VkIGJ5IG1ha2UuCisjCisjIFRoaXMgZmlsZSBydW5zIHRoZSBjb21waWxlciB0d2ljZSwgdXNpbmcgYSBwbHVnaW4gdGhhdCBqdXN0IGludm9rZXMKKyMgL2Jpbi9jYXQsIGFuZCBjb21wYXJlcyB0aGUgb3V0cHV0LiAgSWYgR2VuZXJhdG9ySW5wdXQgaXMKKyMgbm9uZGV0ZXJtaW5zaXRpYywgeW91J2QgZXhwZWN0IHRoZSBvdXRwdXQgdG8gZGlmZmVyIGZyb20gcnVuLXRvLXJ1bi4KKyMgU28gdGhpcyB0ZXN0cyB0aGF0IGluIGZhY3QsIHRoZSBvdXRwdXQgaXMgc3RhYmxlIGZyb20gcnVuLXRvLXJ1bi4KK3NldCAtZQorbWtkaXIgLXAgZ2VuLWJpbmNhdAorUEFUSD0uOiIkUEFUSCIgLi4vdGhyaWZ0IC1yIC1nZW4gYmluY2F0IC4uLy4uLy4uL3Rlc3QvSW5jbHVkZS50aHJpZnQgPiBnZW4tYmluY2F0LzEuc2VyCitQQVRIPS46IiRQQVRIIiAuLi90aHJpZnQgLXIgLWdlbiBiaW5jYXQgLi4vLi4vLi4vdGVzdC9JbmNsdWRlLnRocmlmdCA+IGdlbi1iaW5jYXQvMi5zZXIKK2RpZmYgLS1iaW5hcnkgZ2VuLWJpbmNhdC8xLnNlciBnZW4tYmluY2F0LzIuc2VyCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdHMvQ01ha2VMaXN0cy50eHQgYi9jb21waWxlci9jcHAvdGVzdHMvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJiMTAwYwotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0cy9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDE1MyBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCitjbWFrZV9taW5pbXVtX3JlcXVpcmVkKFZFUlNJT04gMi44LjEyKQorCitwcm9qZWN0KHRocmlmdF9jb21waWxlcl90ZXN0cykKKworc2V0KFRIUklGVF9DT01QSUxFUl9TT1VSQ0VfRElSCisgICAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9Ly4uCispCisKKyMgZG9uJ3QgZ2VuZXJhdGUgWkVST19DSEVDSworc2V0KENNQUtFX1NVUFBSRVNTX1JFR0VORVJBVElPTiB0cnVlKQorCitjb25maWd1cmVfZmlsZSgke1RIUklGVF9DT01QSUxFUl9TT1VSQ0VfRElSfS9zcmMvdGhyaWZ0L3ZlcnNpb24uaC5pbiAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdGhyaWZ0L3ZlcnNpb24uaCkKK2lmKE1TVkMpCisgICAgIyBUaGUgd2luZmxleGJpc29uIGdlbmVyYXRvciBvdXRwdXRzIHNvbWUgbWFjcm9zIHRoYXQgY29uZmxpY3Qgd2l0aCB0aGUgVmlzdWFsIFN0dWRpbyAyMDEwIGNvcHkgb2Ygc3RkaW50LmgKKyAgICAjIFRoaXMgbWlnaHQgYmUgZml4ZWQgaW4gbGF0ZXIgdmVyc2lvbnMgb2YgVmlzdWFsIFN0dWRpbywgYnV0IGFuIGVhc3kgc29sdXRpb24gaXMgdG8gaW5jbHVkZSBzdGRpbnQuaCBmaXJzdAorICAgIGlmKEhBVkVfU1RESU5UX0gpCisgICAgICAgIGFkZF9kZWZpbml0aW9ucygtRF9fU1REQ19MSU1JVF9NQUNST1MpCisgICAgICAgIGFkZF9kZWZpbml0aW9ucygvRkkic3RkaW50LmgiKQorICAgIGVuZGlmKEhBVkVfU1RESU5UX0gpCitlbmRpZigpCisKK2ZpbmRfcGFja2FnZShGTEVYIFJFUVVJUkVEKQorZmluZF9wYWNrYWdlKEJJU09OIFJFUVVJUkVEKQorCisjIGNyZWF0ZSBkaXJlY3RvcnkgZm9yIHRocmlmdHkgYW5kIHRocmlmdGwKK2ZpbGUoTUFLRV9ESVJFQ1RPUlkgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3RocmlmdC8pCisKKyMgQ3JlYXRlIGZsZXggYW5kIGJpc29uIGZpbGVzIGFuZCBidWlsZCB0aGUgbGliIHBhcnNlIHN0YXRpYyBsaWJyYXJ5CitCSVNPTl9UQVJHRVQodGhyaWZ0eSAke1RIUklGVF9DT01QSUxFUl9TT1VSQ0VfRElSfS9zcmMvdGhyaWZ0L3RocmlmdHkueXkgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3RocmlmdC90aHJpZnR5LmNjKQorRkxFWF9UQVJHRVQodGhyaWZ0bCAke1RIUklGVF9DT01QSUxFUl9TT1VSQ0VfRElSfS9zcmMvdGhyaWZ0L3RocmlmdGwubGwgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3RocmlmdC90aHJpZnRsLmNjKQorQUREX0ZMRVhfQklTT05fREVQRU5ERU5DWSh0aHJpZnRsIHRocmlmdHkpCisKK3NldChwYXJzZV9TT1VSQ0VTCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3RocmlmdC90aHJpZnR5LmNjCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3RocmlmdC90aHJpZnRsLmNjCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3RocmlmdC90aHJpZnR5LmhoCispCisKK2FkZF9saWJyYXJ5KHBhcnNlIFNUQVRJQyAke3BhcnNlX1NPVVJDRVN9KQorCisjIFRocmlmdCBjb21waWxlciB0ZXN0cworc2V0KHRocmlmdF9jb21waWxlcl90ZXN0cworKQorCisjIHlvdSBjYW4gYWRkIHNvbWUgZmlsZXMgbWFudWFsbHkgdGhlcmUgCitzZXQodGhyaWZ0X2NvbXBpbGVyX3Rlc3RzX21hbnVhbF9TT1VSQ0VTCisgICAgIyB0ZXN0cyBmaWxlIHRvIGF2b2lkIG1haW4gaW4gZXZlcnkgdGVzdCBmaWxlCisgICAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3Rlc3RzX21haW4uY2MKKykKKworIyBzZXQgdmFyaWFibGUgZm9yIHRlc3RzIHNvdXJjZXMgLSB3aWxsIGJlIGZpbGxlZCBsYXRlcgorc2V0KHRocmlmdF9jb21waWxlcl90ZXN0c19TT1VSQ0VTCispCisKK3NldCh0aHJpZnRfY29tcGlsZXJfU09VUkNFUworICAgICR7VEhSSUZUX0NPTVBJTEVSX1NPVVJDRV9ESVJ9L3NyYy90aHJpZnQvbG9nZ2luZy5jYyAjIHdlIHVzZSBsb2dnaW5nIGluc3RlYWQgb2YgbWFpbiB0byBhdm9pZCBicmVha2luZyBjb21waWxsYXRpb24gKDIgbWFpbiB2KQorICAgICR7VEhSSUZUX0NPTVBJTEVSX1NPVVJDRV9ESVJ9L3NyYy90aHJpZnQvYXVkaXQvdF9hdWRpdC5jcHAKKyAgICAke1RIUklGVF9DT01QSUxFUl9TT1VSQ0VfRElSfS9zcmMvdGhyaWZ0L2NvbW1vbi5jYworICAgICR7VEhSSUZUX0NPTVBJTEVSX1NPVVJDRV9ESVJ9L3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuY2MKKyAgICAke1RIUklGVF9DT01QSUxFUl9TT1VSQ0VfRElSfS9zcmMvdGhyaWZ0L3BhcnNlL3RfdHlwZWRlZi5jYworICAgICR7VEhSSUZUX0NPTVBJTEVSX1NPVVJDRV9ESVJ9L3NyYy90aHJpZnQvcGFyc2UvcGFyc2UuY2MKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdGhyaWZ0L3ZlcnNpb24uaAorKQorCisjIFRoaXMgbWFjcm8gYWRkcyBhbiBvcHRpb24gVEhSSUZUX0NPTVBJTEVSXyR7TkFNRX0KKyMgdGhhdCBhbGxvd3MgZW5hYmxpbmcgb3IgZGlzYWJsaW5nIGNlcnRhaW4gbGFuZ3VhZ2VzCittYWNybyhUSFJJRlRfQUREX0NPTVBJTEVSIG5hbWUgZGVzY3JpcHRpb24gaW5pdGlhbCkKKyAgICBzdHJpbmcoVE9VUFBFUiAiVEhSSUZUX0NPTVBJTEVSXyR7bmFtZX0iIGVuYWJsZXIpCisgICAgc2V0KHNyYyAiJHtUSFJJRlRfQ09NUElMRVJfU09VUkNFX0RJUn0vc3JjL3RocmlmdC9nZW5lcmF0ZS90XyR7bmFtZX1fZ2VuZXJhdG9yLmNjIikKKyAgICBvcHRpb24oJHtlbmFibGVyfSAke2Rlc2NyaXB0aW9ufSAke2luaXRpYWx9KQorICAgIGlmKCR7ZW5hYmxlcn0pCisgICAgICAgIGxpc3QoQVBQRU5EIHRocmlmdF9jb21waWxlcl9TT1VSQ0VTICR7c3JjfSkKKyAgICAgICAgZmlsZShHTE9CIHRocmlmdF9jb21waWxlcl90ZXN0c19TT1VSQ0VTCisgICAgICAgICAgICAiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9LyR7bmFtZX0vKi5jKiIKKyAgICAgICAgICAgICIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vJHtuYW1lfS8qLnRocmlmdCIKKyAgICAgICAgKQorICAgIGVuZGlmKCkKK2VuZG1hY3JvKCkKKworIyBUaGUgZm9sbG93aW5nIGNvbXBpbGVyIHdpdGggdW5pdCB0ZXN0cyBjYW4gYmUgZW5hYmxlZCBvciBkaXNhYmxlZAorVEhSSUZUX0FERF9DT01QSUxFUihjX2dsaWIgICJFbmFibGUgY29tcGlsZXIgZm9yIEMgd2l0aCBHbGliIiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKGNwcCAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgQysrIiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKGphdmEgICAgIkVuYWJsZSBjb21waWxlciBmb3IgSmF2YSIgICBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKGFzMyAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgQWN0aW9uU2NyaXB0IDMiIE9GRikKK1RIUklGVF9BRERfQ09NUElMRVIoZGFydCAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBEYXJ0IiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKGhheGUgICAgIkVuYWJsZSBjb21waWxlciBmb3IgSGF4ZSIgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUihjc2hhcnAgICJFbmFibGUgY29tcGlsZXIgZm9yIEMjIiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKG5ldGNvcmUgIkVuYWJsZSBjb21waWxlciBmb3IgLk5FVCBDb3JlIiBPTikKK1RIUklGVF9BRERfQ09NUElMRVIocHkgICAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBQeXRob24gMi4wIiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKHJiICAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgUnVieSIgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUihwZXJsICAgICJFbmFibGUgY29tcGlsZXIgZm9yIFBlcmwiIE9GRikKK1RIUklGVF9BRERfQ09NUElMRVIocGhwICAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBQSFAiIE9GRikKK1RIUklGVF9BRERfQ09NUElMRVIoZXJsICAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBFcmxhbmciIE9GRikKK1RIUklGVF9BRERfQ09NUElMRVIoY29jb2EgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBDb2NvYSBPYmplY3RpdmUtQyIgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUihzd2lmdCAgICJFbmFibGUgY29tcGlsZXIgZm9yIENvY29hIFN3aWZ0IiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKHN0ICAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgU21hbGx0YWxrIiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKG9jYW1sICAgIkVuYWJsZSBjb21waWxlciBmb3IgT0NhbWwiIE9GRikKK1RIUklGVF9BRERfQ09NUElMRVIoaHMgICAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBIYXNrZWxsIiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKHhzZCAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgWFNEIiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKGh0bWwgICAgIkVuYWJsZSBjb21waWxlciBmb3IgSFRNTCBEb2N1bWVudGF0aW9uIiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKGpzICAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgSmF2YVNjcmlwdCIgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUihqc29uICAgICJFbmFibGUgY29tcGlsZXIgZm9yIEpTT04iIE9GRikKK1RIUklGVF9BRERfQ09NUElMRVIoamF2YW1lICAiRW5hYmxlIGNvbXBpbGVyIGZvciBKYXZhIE1FIiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKGRlbHBoaSAgIkVuYWJsZSBjb21waWxlciBmb3IgRGVscGhpIiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKGdvICAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgR28iIE9GRikKK1RIUklGVF9BRERfQ09NUElMRVIoZCAgICAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBEIiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKGx1YSAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgTHVhIiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKGd2ICAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgR3JhcGhWaXoiIE9GRikKK1RIUklGVF9BRERfQ09NUElMRVIocnMgICAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBSdXN0IiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKHhtbCAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgWE1MIiBPRkYpCisKKyMgVGhyaWZ0IGlzIGxvb2tpbmcgZm9yIGluY2x1ZGUgZmlsZXMgaW4gdGhlIHNyYyBkaXJlY3RvcnkKKyMgd2UgYWxzbyBhZGQgdGhlIGN1cnJlbnQgYmluYXJ5IGRpcmVjdG9yeSBmb3IgZ2VuZXJhdGVkIGZpbGVzCitpbmNsdWRlX2RpcmVjdG9yaWVzKCR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfSAke1RIUklGVF9DT01QSUxFUl9TT1VSQ0VfRElSfS9zcmMgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2NhdGNoKQorCithZGRfbGlicmFyeSh0aHJpZnRfY29tcGlsZXIgJHt0aHJpZnRfY29tcGlsZXJfU09VUkNFU30pCisKKyNsaW5rIHBhcnNlIGxpYiB0byB0aHJpZnRfY29tcGlsZXIgbGliCit0YXJnZXRfbGlua19saWJyYXJpZXModGhyaWZ0X2NvbXBpbGVyIHBhcnNlKQorCisjIGFkZCB0ZXN0cyBleGVjdXRhYmxlCithZGRfZXhlY3V0YWJsZSh0aHJpZnRfY29tcGlsZXJfdGVzdHMgJHt0aHJpZnRfY29tcGlsZXJfdGVzdHNfbWFudWFsX1NPVVJDRVN9ICR7dGhyaWZ0X2NvbXBpbGVyX3Rlc3RzX1NPVVJDRVN9KQorCisjIGlmIGdlbmVyYXRlcyBmb3IgVmlzdWFsIFN0dWRpbyBzZXQgdGhyaWZ0X2NvbXBpbGVyX3Rlc3RzIGFzIGRlZmF1bHQgcHJvamVjdAoraWYoTVNWQykKKyAgICBzZXRfcHJvcGVydHkoVEFSR0VUIHRocmlmdF9jb21waWxlcl90ZXN0cyBQUk9QRVJUWSBWU19TVEFSVFVQX1BST0pFQ1QgdGhyaWZ0X2NvbXBpbGVyX3Rlc3RzKQorZW5kaWYoKQorCitzZXRfdGFyZ2V0X3Byb3BlcnRpZXModGhyaWZ0X2NvbXBpbGVyX3Rlc3RzIFBST1BFUlRJRVMgUlVOVElNRV9PVVRQVVRfRElSRUNUT1JZIGJpbi8pCitzZXRfdGFyZ2V0X3Byb3BlcnRpZXModGhyaWZ0X2NvbXBpbGVyX3Rlc3RzIFBST1BFUlRJRVMgT1VUUFVUX05BTUUgdGhyaWZ0X2NvbXBpbGVyX3Rlc3RzKQorCit0YXJnZXRfbGlua19saWJyYXJpZXModGhyaWZ0X2NvbXBpbGVyX3Rlc3RzIHRocmlmdF9jb21waWxlcikKKworZW5hYmxlX3Rlc3RpbmcoKQorYWRkX3Rlc3QoTkFNRSBUaHJpZnRUZXN0cyBDT01NQU5EIHRocmlmdF9jb21waWxlcl90ZXN0cykKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdHMvUkVBRE1FLm1kIGIvY29tcGlsZXIvY3BwL3Rlc3RzL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2JlNDkxCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3RzL1JFQURNRS5tZApAQCAtMCwwICsxLDg4IEBACisjIEJ1aWxkIGFuZCBydW4gY29tcGlsZXIgdGVzdHMgdXNpbmcgQ01ha2UKKworPCEtLSBUT0MgLS0+CisKKy0gW0J1aWxkIGFuZCBydW4gY29tcGlsZXIgdGVzdHMgdXNpbmcgQ01ha2VdKCNidWlsZC1hbmQtcnVuLWNvbXBpbGVyLXRlc3RzLXVzaW5nLWNtYWtlKQorICAgIC0gW0dlbmVyYWwgaW5mb3JtYXRpb25dKCNnZW5lcmFsLWluZm9ybWF0aW9uKQorICAgIC0gW0hvdyB0byBhZGQgeW91ciB0ZXN0c10oI2hvdy10by1hZGQteW91ci10ZXN0cykKKyAgICAtIFtCdWlsZCBhbmQgcnVuIHRlc3RzIG9uIFVuaXgtbGlrZSBzeXN0ZW1zXSgjYnVpbGQtYW5kLXJ1bi10ZXN0cy1vbi11bml4LWxpa2Utc3lzdGVtcykKKyAgICAgICAgLSBbUHJlcmVxdWlzaXRlczpdKCNwcmVyZXF1aXNpdGVzKQorICAgICAgICAtIFtCdWlsZCBhbmQgcnVuIHRlc3Qgd2l0aCBDTWFrZV0oI2J1aWxkLWFuZC1ydW4tdGVzdC13aXRoLWNtYWtlKQorICAgIC0gW0J1aWxkIGFuZCBydW4gdGVzdHMgb24gV2luZG93c10oI2J1aWxkLWFuZC1ydW4tdGVzdHMtb24td2luZG93cykKKyAgICAgICAgLSBbUHJlcmVxdWlzaXRlczpdKCNwcmVyZXF1aXNpdGVzLTEpCisgICAgICAgIC0gW0dlbmVyYXRpb24gb2YgVlMgcHJvamVjdCB3aXRoIENNYWtlLCBidWlsZCBhbmQgcnVuIG9uIFdpbmRvd3NdKCNnZW5lcmF0aW9uLW9mLXZzLXByb2plY3Qtd2l0aC1jbWFrZS1idWlsZC1hbmQtcnVuLW9uLXdpbmRvd3MpCisKKzwhLS0gL1RPQyAtLT4KKworIyMgR2VuZXJhbCBpbmZvcm1hdGlvbiAKKworQWRkZWQgZ2VuZXJpYyB3YXkgdG8gY292ZXIgY29kZSBieSB0ZXN0cyBmb3IgbWFueSBsYW5ndWFnZXMgKHlvdSBqdXN0IG5lZWQgdG8gbWFrZSBhIGNvcnJlY3QgaGVhZGVyIGZpbGUgZm9yIGdlbmVyYXRvciBmb3IgeW91ciBsYW5ndWFnZSAtIGV4YW1wbGUgaW4gKipuZXRjb3JlKiogaW1wbGVtZW50YXRpb24pCisKK0F0IGN1cnJlbnQgbW9tZW50IHRoZXNlIHRlc3RzIHVzZSBmcmVlIENhdGNoIGxpYnJhcnkgKGh0dHBzOi8vZ2l0aHViLmNvbS9jYXRjaG9yZy9DYXRjaDIvdHJlZS9DYXRjaDEueCkgZm9yIGVhc3kgdGVzdCBjcmVhdGlvbiBhbmQgdXNhZ2UuCitEZWNpc2lvbiB0byB1c2UgaXQgd2FzIGJlY2F1c2Ugb2Ygc2ltcGxpY2l0eSwgZWFzeSB1c2FnZSwgb25lIGhlYWRlciBmaWxlIHRvIHVzZSwgc3RhYmxlIGNvbW11bml0eSBhbmQgZ3Jvd2luZyBpbnRlcmVzdCAgKGh0dHBzOi8vY3BwLmxpYmh1bnQuY29tL3Byb2plY3QvZ29vZ2xldGVzdC1nb29nbGUvdnMvY2F0Y2g/cmVsPWNtcC1jbXApCisKK0Fsc28sIG1heWJlLCBsYXRlciBpdCB3aWxsIGJlIG1pZ3JhdGVkIHRvIENhdGNoMiAoaHR0cHM6Ly9naXRodWIuY29tL3BoaWxzcXVhcmVkL0NhdGNoKSAtIGRlcGVuZHMgb24gbmVlZCB0byBzdXBwb3J0IGxlZ2FjeSBjb21waWxlcnMgKGMrKzk4KQorCisjIyBIb3cgdG8gYWRkIHlvdXIgdGVzdHMKKworLSBPcGVuICoqQ01ha2VMaXN0cy50eHQqKgorLSBTZXQgKipPbioqIHRvIGNhbGwgb2YgKipUSFJJRlRfQUREX0NPTVBJTEVSKiogZm9yIHlvdXIgbGFuZ3VhZ2UKKworYGBgIGNtYWtlIAorVEhSSUZUX0FERF9DT01QSUxFUihuZXRjb3JlICJFbmFibGUgY29tcGlsZXIgZm9yIC5ORVQgQ29yZSIgT04pCitgYGAKKworLSBDcmVhdGUgZm9sZGVyIHdpdGggbmFtZSBzcGVjaWZpZWQgaW4gbGlzdCBvZiBsYW5ndWFnZXMgaW4gKipDTWFrZUxpc3RzLnR4dCoqCistIENyZWF0ZSB0ZXN0cyBpbiBmb2xkZXIgZm9yIHlvdXIgbGFuZ3VhZ2UgKHdpdGggZXh0ZW5zaW9ucyBsaWtlICouYyogLSBjYywgY3BwLCBldGMpCisgIC0gRG9uJ3QgZm9yZ2V0IHRvIGFkZCBpbmNsdWRlIG9mIGNhdGNoLmhwcCBpbiB5b3VyIHRlc3QgZmlsZQorICBgYGAgQworICAjaW5jbHVkZSAiLi4vY2F0Y2gvY2F0Y2guaHBwIgorICBgYGAKKworLSBJZiB5b3UgbmVlZCAtIGFkZCBmaWxlcyBtYW51YWxseSB0byAqKnRocmlmdF9jb21waWxlcl90ZXN0c19tYW51YWxfU09VUkNFUyoqIGluICoqQ01ha2VMaXN0cy50eHQqKiBzaW1pbGFyIHRvIAorCitgYGAgY21ha2UKKyMgeW91IGNhbiBhZGQgc29tZSBmaWxlcyBtYW51YWxseSB0aGVyZSAKK3NldCh0aHJpZnRfY29tcGlsZXJfdGVzdHNfbWFudWFsX1NPVVJDRVMKKyAgICAjIHRlc3RzIGZpbGUgdG8gYXZvaWQgbWFpbiBpbiBldmVyeSB0ZXN0IGZpbGUKKyAgICAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vdGVzdHNfbWFpbi5jYworKQorYGBgCisKKy0gUnVuICoqY21ha2UqKiB3aXRoIGFyZ3VtZW50cyBmb3IgeW91ciBlbnZpcm9ubWVudCBhbmQgY29tcGlsZXIgCistIEVuam95CisKKyMjIEJ1aWxkIGFuZCBydW4gdGVzdHMgb24gVW5peC1saWtlIHN5c3RlbXMKKworIyMjIFByZXJlcXVpc2l0ZXM6CistIEluc3RhbGwgQ01ha2UgLSA8aHR0cHM6Ly9jbWFrZS5vcmcvZG93bmxvYWQvPgorLSBJbnN0YWxsIHdpbmZsZXhiaXNvbiAtIDxodHRwczovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy93aW5mbGV4Ymlzb24vPgorCisjIyMgQnVpbGQgYW5kIHJ1biB0ZXN0IHdpdGggQ01ha2UKKworLSBSdW4gY29tbWFuZHMgaW4gY29tbWFuZCBsaW5lIGluIGN1cnJlbnQgZGlyZWN0b3J5OgorCitgYGAKK21rZGlyIGNtYWtlLXZzICYmIGNkIGNtYWtlLXZzCitjbWFrZSAuLgorY21ha2UgLS1idWlsZCAuCitjdGVzdCAtQyBEZWJ1ZyAtVgorYGBgCisKKyMjIEJ1aWxkIGFuZCBydW4gdGVzdHMgb24gV2luZG93cworCisjIyMgUHJlcmVxdWlzaXRlczoKKy0gSW5zdGFsbCBDTWFrZSAtIDxodHRwczovL2NtYWtlLm9yZy9kb3dubG9hZC8+CistIEluc3RhbGwgd2luZmxleGJpc29uIC0gPGh0dHBzOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL3dpbmZsZXhiaXNvbi8+CistIEluc3RhbGwgVlMyMDE3IENvbW11bml0eSBFZGl0aW9uIC0gPGh0dHBzOi8vd3d3LnZpc3VhbHN0dWRpby5jb20vdnMvd2hhdHNuZXcvPiAoZW5zdXJlIHRoYXQgeW91IGluc3RhbGxlZCB3b3JrbG9hZCAiRGVza3RvcCBEZXZlbG9wbWVudCB3aXRoIEMrKyIgZm9yIFZTMjAxNykKKworIyMjIEdlbmVyYXRpb24gb2YgVlMgcHJvamVjdCB3aXRoIENNYWtlLCBidWlsZCBhbmQgcnVuIG9uIFdpbmRvd3MKKy0gUnVuIGNvbW1hbmRzIGluIGNvbW1hbmQgbGluZSBpbiBjdXJyZW50IGRpcmVjdG9yeSAoZW5zdXJlIHRoYXQgVlMgaW5zdGFsbGVkKToKKworYGBgCitta2RpciBjbWFrZS12cworY2QgY21ha2UtdnMKK2NtYWtlIC4uCitjbWFrZSAtLWJ1aWxkIC4KK2N0ZXN0IC1DIERlYnVnIC1WCitgYGAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdHMvY2F0Y2gvY2F0Y2guaHBwIGIvY29tcGlsZXIvY3BwL3Rlc3RzL2NhdGNoL2NhdGNoLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2QwMzdlCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3RzL2NhdGNoL2NhdGNoLmhwcApAQCAtMCwwICsxLDExNTA4IEBACisvKgorICogIENhdGNoIHYxLjkuNAorICogIEdlbmVyYXRlZDogMjAxNy0wNS0xNiAxMzo1MTo1NS41MDY1MTkKKyAqICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgVGhpcyBmaWxlIGhhcyBiZWVuIG1lcmdlZCBmcm9tIG11bHRpcGxlIGhlYWRlcnMuIFBsZWFzZSBkb24ndCBlZGl0IGl0IGRpcmVjdGx5CisgKiAgQ29weXJpZ2h0IChjKSAyMDEyIFR3byBCbHVlIEN1YmVzIEx0ZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZworICogIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorICovCisjaWZuZGVmIFRXT0JMVUVDVUJFU19TSU5HTEVfSU5DTFVERV9DQVRDSF9IUFBfSU5DTFVERUQKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX1NJTkdMRV9JTkNMVURFX0NBVENIX0hQUF9JTkNMVURFRAorCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9IUFBfSU5DTFVERUQKKworI2lmZGVmIF9fY2xhbmdfXworIyAgICBwcmFnbWEgY2xhbmcgc3lzdGVtX2hlYWRlcgorI2VsaWYgZGVmaW5lZCBfX0dOVUNfXworIyAgICBwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKyNlbmRpZgorCisvLyAjaW5jbHVkZWQgZnJvbTogaW50ZXJuYWwvY2F0Y2hfc3VwcHJlc3Nfd2FybmluZ3MuaAorCisjaWZkZWYgX19jbGFuZ19fCisjICAgaWZkZWYgX19JQ0MgLy8gaWNwYyBkZWZpbmVzIHRoZSBfX2NsYW5nX18gbWFjcm8KKyMgICAgICAgcHJhZ21hIHdhcm5pbmcocHVzaCkKKyMgICAgICAgcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTogMTYxIDE2ODIpCisjICAgZWxzZSAvLyBfX0lDQworIyAgICAgICBwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV2dsb2JhbC1jb25zdHJ1Y3RvcnMiCisjICAgICAgIHByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XdmFyaWFkaWMtbWFjcm9zIgorIyAgICAgICBwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV2M5OS1leHRlbnNpb25zIgorIyAgICAgICBwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV3VudXNlZC12YXJpYWJsZSIKKyMgICAgICAgcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaAorIyAgICAgICBwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV3BhZGRlZCIKKyMgICAgICAgcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdjKys5OC1jb21wYXQiCisjICAgICAgIHByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XYysrOTgtY29tcGF0LXBlZGFudGljIgorIyAgICAgICBwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV3N3aXRjaC1lbnVtIgorIyAgICAgICBwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV2NvdmVyZWQtc3dpdGNoLWRlZmF1bHQiCisjICAgIGVuZGlmCisjZWxpZiBkZWZpbmVkIF9fR05VQ19fCisjICAgIHByYWdtYSBHQ0MgZGlhZ25vc3RpYyBpZ25vcmVkICItV3ZhcmlhZGljLW1hY3JvcyIKKyMgICAgcHJhZ21hIEdDQyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XdW51c2VkLXZhcmlhYmxlIgorIyAgICBwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVdwYXJlbnRoZXNlcyIKKworIyAgICBwcmFnbWEgR0NDIGRpYWdub3N0aWMgcHVzaAorIyAgICBwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVdwYWRkZWQiCisjZW5kaWYKKyNpZiBkZWZpbmVkKENBVENIX0NPTkZJR19NQUlOKSB8fCBkZWZpbmVkKENBVENIX0NPTkZJR19SVU5ORVIpCisjICBkZWZpbmUgQ0FUQ0hfSU1QTAorI2VuZGlmCisKKyNpZmRlZiBDQVRDSF9JTVBMCisjICBpZm5kZWYgQ0xBUkFfQ09ORklHX01BSU4KKyMgICAgZGVmaW5lIENMQVJBX0NPTkZJR19NQUlOX05PVF9ERUZJTkVECisjICAgIGRlZmluZSBDTEFSQV9DT05GSUdfTUFJTgorIyAgZW5kaWYKKyNlbmRpZgorCisvLyAjaW5jbHVkZWQgZnJvbTogaW50ZXJuYWwvY2F0Y2hfbm90aW1wbGVtZW50ZWRfZXhjZXB0aW9uLmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX05PVElNUExFTUVOVEVEX0VYQ0VQVElPTl9IX0lOQ0xVREVECisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9jb21tb24uaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfQ09NTU9OX0hfSU5DTFVERUQKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX2NvbXBpbGVyX2NhcGFiaWxpdGllcy5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9DT01QSUxFUl9DQVBBQklMSVRJRVNfSFBQX0lOQ0xVREVECisKKy8vIERldGVjdCBhIG51bWJlciBvZiBjb21waWxlciBmZWF0dXJlcyAtIG1vc3RseSBDKysxMS8xNCBjb25mb3JtYW5jZSAtIGJ5IGNvbXBpbGVyCisvLyBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBkZWZpbmVkOgorLy8KKy8vIENBVENIX0NPTkZJR19DUFAxMV9OVUxMUFRSIDogaXMgbnVsbHB0ciBzdXBwb3J0ZWQ/CisvLyBDQVRDSF9DT05GSUdfQ1BQMTFfTk9FWENFUFQgOiBpcyBub2V4Y2VwdCBzdXBwb3J0ZWQ/CisvLyBDQVRDSF9DT05GSUdfQ1BQMTFfR0VORVJBVEVEX01FVEhPRFMgOiBUaGUgZGVsZXRlIGFuZCBkZWZhdWx0IGtleXdvcmRzIGZvciBjb21waWxlciBnZW5lcmF0ZWQgbWV0aG9kcworLy8gQ0FUQ0hfQ09ORklHX0NQUDExX0lTX0VOVU0gOiBzdGQ6OmlzX2VudW0gaXMgc3VwcG9ydGVkPworLy8gQ0FUQ0hfQ09ORklHX0NQUDExX1RVUExFIDogc3RkOjp0dXBsZSBpcyBzdXBwb3J0ZWQKKy8vIENBVENIX0NPTkZJR19DUFAxMV9MT05HX0xPTkcgOiBpcyBsb25nIGxvbmcgc3VwcG9ydGVkPworLy8gQ0FUQ0hfQ09ORklHX0NQUDExX09WRVJSSURFIDogaXMgb3ZlcnJpZGUgc3VwcG9ydGVkPworLy8gQ0FUQ0hfQ09ORklHX0NQUDExX1VOSVFVRV9QVFIgOiBpcyB1bmlxdWVfcHRyIHN1cHBvcnRlZCAob3RoZXJ3aXNlIHVzZSBhdXRvX3B0cikKKy8vIENBVENIX0NPTkZJR19DUFAxMV9TSFVGRkxFIDogaXMgc3RkOjpzaHVmZmxlIHN1cHBvcnRlZD8KKy8vIENBVENIX0NPTkZJR19DUFAxMV9UWVBFX1RSQUlUUyA6IGFyZSB0eXBlX3RyYWl0cyBhbmQgZW5hYmxlX2lmIHN1cHBvcnRlZD8KKworLy8gQ0FUQ0hfQ09ORklHX0NQUDExX09SX0dSRUFURVIgOiBJcyBDKysxMSBzdXBwb3J0ZWQ/CisKKy8vIENBVENIX0NPTkZJR19WQVJJQURJQ19NQUNST1MgOiBhcmUgdmFyaWFkaWMgbWFjcm9zIHN1cHBvcnRlZD8KKy8vIENBVENIX0NPTkZJR19DT1VOVEVSIDogaXMgdGhlIF9fQ09VTlRFUl9fIG1hY3JvIHN1cHBvcnRlZD8KKy8vIENBVENIX0NPTkZJR19XSU5ET1dTX1NFSCA6IGlzIFdpbmRvd3MgU0VIIHN1cHBvcnRlZD8KKy8vIENBVENIX0NPTkZJR19QT1NJWF9TSUdOQUxTIDogYXJlIFBPU0lYIHNpZ25hbHMgc3VwcG9ydGVkPworLy8gKioqKioqKioqKioqKioqKgorLy8gTm90ZSB0byBtYWludGFpbmVyczogaWYgbmV3IHRvZ2dsZXMgYXJlIGFkZGVkIHBsZWFzZSBkb2N1bWVudCB0aGVtCisvLyBpbiBjb25maWd1cmF0aW9uLm1kLCB0b28KKy8vICoqKioqKioqKioqKioqKioKKworLy8gSW4gZ2VuZXJhbCBlYWNoIG1hY3JvIGhhcyBhIF9OT188ZmVhdHVyZSBuYW1lPiBmb3JtCisvLyAoZS5nLiBDQVRDSF9DT05GSUdfQ1BQMTFfTk9fTlVMTFBUUikgd2hpY2ggZGlzYWJsZXMgdGhlIGZlYXR1cmUuCisvLyBNYW55IGZlYXR1cmVzLCBhdCBwb2ludCBvZiBkZXRlY3Rpb24sIGRlZmluZSBhbiBfSU5URVJOQUxfIG1hY3JvLCBzbyB0aGV5CisvLyBjYW4gYmUgY29tYmluZWQsIGVuLW1hc3MsIHdpdGggdGhlIF9OT18gZm9ybXMgbGF0ZXIuCisKKy8vIEFsbCB0aGUgQysrMTEgZmVhdHVyZXMgY2FuIGJlIGRpc2FibGVkIHdpdGggQ0FUQ0hfQ09ORklHX05PX0NQUDExCisKKyNpZmRlZiBfX2NwbHVzcGx1cworCisjICBpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisjICAgIGRlZmluZSBDQVRDSF9DUFAxMV9PUl9HUkVBVEVSCisjICBlbmRpZgorCisjICBpZiBfX2NwbHVzcGx1cyA+PSAyMDE0MDJMCisjICAgIGRlZmluZSBDQVRDSF9DUFAxNF9PUl9HUkVBVEVSCisjICBlbmRpZgorCisjZW5kaWYKKworI2lmZGVmIF9fY2xhbmdfXworCisjICBpZiBfX2hhc19mZWF0dXJlKGN4eF9udWxscHRyKQorIyAgICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX05VTExQVFIKKyMgIGVuZGlmCisKKyMgIGlmIF9faGFzX2ZlYXR1cmUoY3h4X25vZXhjZXB0KQorIyAgICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX05PRVhDRVBUCisjICBlbmRpZgorCisjICAgaWYgZGVmaW5lZChDQVRDSF9DUFAxMV9PUl9HUkVBVEVSKQorIyAgICAgICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfU1VQUFJFU1NfRVREX1dBUk5JTkdTIFwKKyAgICAgICAgICAgIF9QcmFnbWEoICJjbGFuZyBkaWFnbm9zdGljIHB1c2giICkgXAorICAgICAgICAgICAgX1ByYWdtYSggImNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCBcIi1XZXhpdC10aW1lLWRlc3RydWN0b3JzXCIiICkKKyMgICAgICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX1VOU1VQUFJFU1NfRVREX1dBUk5JTkdTIFwKKyAgICAgICAgICAgIF9QcmFnbWEoICJjbGFuZyBkaWFnbm9zdGljIHBvcCIgKQorCisjICAgICAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9TVVBQUkVTU19QQVJFTlRIRVNFU19XQVJOSU5HUyBcCisgICAgICAgICAgICBfUHJhZ21hKCAiY2xhbmcgZGlhZ25vc3RpYyBwdXNoIiApIFwKKyAgICAgICAgICAgIF9QcmFnbWEoICJjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgXCItV3BhcmVudGhlc2VzXCIiICkKKyMgICAgICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX1VOU1VQUFJFU1NfUEFSRU5USEVTRVNfV0FSTklOR1MgXAorICAgICAgICAgICAgX1ByYWdtYSggImNsYW5nIGRpYWdub3N0aWMgcG9wIiApCisjICAgZW5kaWYKKworI2VuZGlmIC8vIF9fY2xhbmdfXworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gV2Uga25vdyBzb21lIGVudmlyb25tZW50cyBub3QgdG8gc3VwcG9ydCBmdWxsIFBPU0lYIHNpZ25hbHMKKyNpZiBkZWZpbmVkKF9fQ1lHV0lOX18pIHx8IGRlZmluZWQoX19RTlhfXykKKworIyAgIGlmICFkZWZpbmVkKENBVENIX0NPTkZJR19QT1NJWF9TSUdOQUxTKQorIyAgICAgICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX05PX1BPU0lYX1NJR05BTFMKKyMgICBlbmRpZgorCisjZW5kaWYKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEN5Z3dpbgorI2lmZGVmIF9fQ1lHV0lOX18KKworLy8gUmVxdWlyZWQgZm9yIHNvbWUgdmVyc2lvbnMgb2YgQ3lnd2luIHRvIGRlY2xhcmUgZ2V0dGltZW9mZGF5CisvLyBzZWU6IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzY5MDE4MDMvZ2V0dGltZW9mZGF5LW5vdC1kZWNsYXJlZC1pbi10aGlzLXNjb3BlLWN5Z3dpbgorIyAgIGRlZmluZSBfQlNEX1NPVVJDRQorCisjZW5kaWYgLy8gX19DWUdXSU5fXworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQm9ybGFuZAorI2lmZGVmIF9fQk9STEFORENfXworCisjZW5kaWYgLy8gX19CT1JMQU5EQ19fCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBFREcKKyNpZmRlZiBfX0VER19WRVJTSU9OX18KKworI2VuZGlmIC8vIF9fRURHX1ZFUlNJT05fXworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gRGlnaXRhbCBNYXJzCisjaWZkZWYgX19ETUNfXworCisjZW5kaWYgLy8gX19ETUNfXworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gR0NDCisjaWZkZWYgX19HTlVDX18KKworIyAgIGlmIF9fR05VQ19fID09IDQgJiYgX19HTlVDX01JTk9SX18gPj0gNiAmJiBkZWZpbmVkKF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fKQorIyAgICAgICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX05VTExQVFIKKyMgICBlbmRpZgorCisvLyAtIG90aGVyd2lzZSBtb3JlIHJlY2VudCB2ZXJzaW9ucyBkZWZpbmUgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorLy8gYW5kIHdpbGwgZ2V0IHBpY2tlZCB1cCBiZWxvdworCisjZW5kaWYgLy8gX19HTlVDX18KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFZpc3VhbCBDKysKKyNpZmRlZiBfTVNDX1ZFUgorCisjZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJR19XSU5ET1dTX1NFSAorCisjaWYgKF9NU0NfVkVSID49IDE2MDApCisjICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9OVUxMUFRSCisjICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9VTklRVUVfUFRSCisjZW5kaWYKKworI2lmIChfTVNDX1ZFUiA+PSAxOTAwICkgLy8gKFZDKysgMTMgKFZTMjAxNSkpCisjZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9OT0VYQ0VQVAorI2RlZmluZSBDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfR0VORVJBVEVEX01FVEhPRFMKKyNkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX1NIVUZGTEUKKyNkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX1RZUEVfVFJBSVRTCisjZW5kaWYKKworI2VuZGlmIC8vIF9NU0NfVkVSCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vIFVzZSB2YXJpYWRpYyBtYWNyb3MgaWYgdGhlIGNvbXBpbGVyIHN1cHBvcnRzIHRoZW0KKyNpZiAoIGRlZmluZWQgX01TQ19WRVIgJiYgX01TQ19WRVIgPiAxNDAwICYmICFkZWZpbmVkIF9fRURHRV9fKSB8fCBcCisgICAgKCBkZWZpbmVkIF9fV0FWRV9fICYmIF9fV0FWRV9IQVNfVkFSSUFESUNTICkgfHwgXAorICAgICggZGVmaW5lZCBfX0dOVUNfXyAmJiBfX0dOVUNfXyA+PSAzICkgfHwgXAorICAgICggIWRlZmluZWQgX19jcGx1c3BsdXMgJiYgX19TVERDX1ZFUlNJT05fXyA+PSAxOTk5MDFMIHx8IF9fY3BsdXNwbHVzID49IDIwMTEwM0wgKQorCisjZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJR19WQVJJQURJQ19NQUNST1MKKworI2VuZGlmCisKKy8vIFVzZSBfX0NPVU5URVJfXyBpZiB0aGUgY29tcGlsZXIgc3VwcG9ydHMgaXQKKyNpZiAoIGRlZmluZWQgX01TQ19WRVIgJiYgX01TQ19WRVIgPj0gMTMwMCApIHx8IFwKKyAgICAoIGRlZmluZWQgX19HTlVDX18gICYmIF9fR05VQ19fID49IDQgJiYgX19HTlVDX01JTk9SX18gPj0gMyApIHx8IFwKKyAgICAoIGRlZmluZWQgX19jbGFuZ19fICYmIF9fY2xhbmdfbWFqb3JfXyA+PSAzICkKKworI2RlZmluZSBDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ09VTlRFUgorCisjZW5kaWYKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEMrKyBsYW5ndWFnZSBmZWF0dXJlIHN1cHBvcnQKKworLy8gY2F0Y2ggYWxsIHN1cHBvcnQgZm9yIEMrKzExCisjaWYgZGVmaW5lZChDQVRDSF9DUFAxMV9PUl9HUkVBVEVSKQorCisjICBpZiAhZGVmaW5lZChDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfTlVMTFBUUikKKyMgICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9OVUxMUFRSCisjICBlbmRpZgorCisjICBpZm5kZWYgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX05PRVhDRVBUCisjICAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfTk9FWENFUFQKKyMgIGVuZGlmCisKKyMgIGlmbmRlZiBDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfR0VORVJBVEVEX01FVEhPRFMKKyMgICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9HRU5FUkFURURfTUVUSE9EUworIyAgZW5kaWYKKworIyAgaWZuZGVmIENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9JU19FTlVNCisjICAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfSVNfRU5VTQorIyAgZW5kaWYKKworIyAgaWZuZGVmIENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9UVVBMRQorIyAgICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX1RVUExFCisjICBlbmRpZgorCisjICBpZm5kZWYgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX1ZBUklBRElDX01BQ1JPUworIyAgICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX1ZBUklBRElDX01BQ1JPUworIyAgZW5kaWYKKworIyAgaWYgIWRlZmluZWQoQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX0xPTkdfTE9ORykKKyMgICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9MT05HX0xPTkcKKyMgIGVuZGlmCisKKyMgIGlmICFkZWZpbmVkKENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9PVkVSUklERSkKKyMgICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9PVkVSUklERQorIyAgZW5kaWYKKyMgIGlmICFkZWZpbmVkKENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9VTklRVUVfUFRSKQorIyAgICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX1VOSVFVRV9QVFIKKyMgIGVuZGlmCisjIGlmICFkZWZpbmVkKENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9TSFVGRkxFKQorIyAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfU0hVRkZMRQorIyAgZW5kaWYKKyMgaWYgIWRlZmluZWQoQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX1RZUEVfVFJBSVRTKQorIyAgZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9UWVBFX1RSQUlUUworIyBlbmRpZgorCisjZW5kaWYgLy8gX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorCisvLyBOb3cgc2V0IHRoZSBhY3R1YWwgZGVmaW5lcyBiYXNlZCBvbiB0aGUgYWJvdmUgKyBhbnl0aGluZyB0aGUgdXNlciBoYXMgY29uZmlndXJlZAorI2lmIGRlZmluZWQoQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX05VTExQVFIpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19DUFAxMV9OT19OVUxMUFRSKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfQ1BQMTFfTlVMTFBUUikgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX05PX0NQUDExKQorIyAgIGRlZmluZSBDQVRDSF9DT05GSUdfQ1BQMTFfTlVMTFBUUgorI2VuZGlmCisjaWYgZGVmaW5lZChDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfTk9FWENFUFQpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19DUFAxMV9OT19OT0VYQ0VQVCkgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX0NQUDExX05PRVhDRVBUKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfTk9fQ1BQMTEpCisjICAgZGVmaW5lIENBVENIX0NPTkZJR19DUFAxMV9OT0VYQ0VQVAorI2VuZGlmCisjaWYgZGVmaW5lZChDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfR0VORVJBVEVEX01FVEhPRFMpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19DUFAxMV9OT19HRU5FUkFURURfTUVUSE9EUykgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX0NQUDExX0dFTkVSQVRFRF9NRVRIT0RTKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfTk9fQ1BQMTEpCisjICAgZGVmaW5lIENBVENIX0NPTkZJR19DUFAxMV9HRU5FUkFURURfTUVUSE9EUworI2VuZGlmCisjaWYgZGVmaW5lZChDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfSVNfRU5VTSkgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX0NQUDExX05PX0lTX0VOVU0pICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19DUFAxMV9JU19FTlVNKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfTk9fQ1BQMTEpCisjICAgZGVmaW5lIENBVENIX0NPTkZJR19DUFAxMV9JU19FTlVNCisjZW5kaWYKKyNpZiBkZWZpbmVkKENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9UVVBMRSkgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX0NQUDExX05PX1RVUExFKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfQ1BQMTFfVFVQTEUpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19OT19DUFAxMSkKKyMgICBkZWZpbmUgQ0FUQ0hfQ09ORklHX0NQUDExX1RVUExFCisjZW5kaWYKKyNpZiBkZWZpbmVkKENBVENIX0lOVEVSTkFMX0NPTkZJR19WQVJJQURJQ19NQUNST1MpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19OT19WQVJJQURJQ19NQUNST1MpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19WQVJJQURJQ19NQUNST1MpCisjICAgZGVmaW5lIENBVENIX0NPTkZJR19WQVJJQURJQ19NQUNST1MKKyNlbmRpZgorI2lmIGRlZmluZWQoQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX0xPTkdfTE9ORykgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX0NQUDExX05PX0xPTkdfTE9ORykgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX0NQUDExX0xPTkdfTE9ORykgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX05PX0NQUDExKQorIyAgIGRlZmluZSBDQVRDSF9DT05GSUdfQ1BQMTFfTE9OR19MT05HCisjZW5kaWYKKyNpZiBkZWZpbmVkKENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9PVkVSUklERSkgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX0NQUDExX05PX09WRVJSSURFKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfQ1BQMTFfT1ZFUlJJREUpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19OT19DUFAxMSkKKyMgICBkZWZpbmUgQ0FUQ0hfQ09ORklHX0NQUDExX09WRVJSSURFCisjZW5kaWYKKyNpZiBkZWZpbmVkKENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9VTklRVUVfUFRSKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfQ1BQMTFfTk9fVU5JUVVFX1BUUikgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX0NQUDExX1VOSVFVRV9QVFIpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19OT19DUFAxMSkKKyMgICBkZWZpbmUgQ0FUQ0hfQ09ORklHX0NQUDExX1VOSVFVRV9QVFIKKyNlbmRpZgorLy8gVXNlIG9mIF9fQ09VTlRFUl9fIGlzIHN1cHByZXNzZWQgaWYgX19KRVRCUkFJTlNfSURFX18gaXMgI2RlZmluZWQgKG1lYW5pbmcgd2UncmUgYmVpbmcgcGFyc2VkIGJ5IGEgSmV0QnJhaW5zIElERSBmb3IKKy8vIGFuYWx5dGljcykgYmVjYXVzZSwgYXQgdGltZSBvZiB3cml0aW5nLCBfX0NPVU5URVJfXyBpcyBub3QgcHJvcGVybHkgaGFuZGxlZCBieSBpdC4KKy8vIFRoaXMgZG9lcyBub3QgYWZmZWN0IGNvbXBpbGF0aW9uCisjaWYgZGVmaW5lZChDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ09VTlRFUikgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX05PX0NPVU5URVIpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19DT1VOVEVSKSAmJiAhZGVmaW5lZChfX0pFVEJSQUlOU19JREVfXykKKyMgICBkZWZpbmUgQ0FUQ0hfQ09ORklHX0NPVU5URVIKKyNlbmRpZgorI2lmIGRlZmluZWQoQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX1NIVUZGTEUpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19DUFAxMV9OT19TSFVGRkxFKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfQ1BQMTFfU0hVRkZMRSkgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX05PX0NQUDExKQorIyAgIGRlZmluZSBDQVRDSF9DT05GSUdfQ1BQMTFfU0hVRkZMRQorI2VuZGlmCisjIGlmIGRlZmluZWQoQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX1RZUEVfVFJBSVRTKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfQ1BQMTFfTk9fVFlQRV9UUkFJVFMpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19DUFAxMV9UWVBFX1RSQUlUUykgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX05PX0NQUDExKQorIyAgZGVmaW5lIENBVENIX0NPTkZJR19DUFAxMV9UWVBFX1RSQUlUUworIyBlbmRpZgorI2lmIGRlZmluZWQoQ0FUQ0hfSU5URVJOQUxfQ09ORklHX1dJTkRPV1NfU0VIKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfTk9fV0lORE9XU19TRUgpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19XSU5ET1dTX1NFSCkKKyMgICBkZWZpbmUgQ0FUQ0hfQ09ORklHX1dJTkRPV1NfU0VICisjZW5kaWYKKy8vIFRoaXMgaXMgc2V0IGJ5IGRlZmF1bHQsIGJlY2F1c2Ugd2UgYXNzdW1lIHRoYXQgdW5peCBjb21waWxlcnMgYXJlIHBvc2l4LXNpZ25hbC1jb21wYXRpYmxlIGJ5IGRlZmF1bHQuCisjaWYgIWRlZmluZWQoQ0FUQ0hfSU5URVJOQUxfQ09ORklHX05PX1BPU0lYX1NJR05BTFMpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19OT19QT1NJWF9TSUdOQUxTKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfUE9TSVhfU0lHTkFMUykKKyMgICBkZWZpbmUgQ0FUQ0hfQ09ORklHX1BPU0lYX1NJR05BTFMKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoQ0FUQ0hfSU5URVJOQUxfU1VQUFJFU1NfUEFSRU5USEVTRVNfV0FSTklOR1MpCisjICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX1NVUFBSRVNTX1BBUkVOVEhFU0VTX1dBUk5JTkdTCisjICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX1VOU1VQUFJFU1NfUEFSRU5USEVTRVNfV0FSTklOR1MKKyNlbmRpZgorI2lmICFkZWZpbmVkKENBVENIX0lOVEVSTkFMX1NVUFBSRVNTX0VURF9XQVJOSU5HUykKKyMgICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfU1VQUFJFU1NfRVREX1dBUk5JTkdTCisjICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX1VOU1VQUFJFU1NfRVREX1dBUk5JTkdTCisjZW5kaWYKKworLy8gbm9leGNlcHQgc3VwcG9ydDoKKyNpZiBkZWZpbmVkKENBVENIX0NPTkZJR19DUFAxMV9OT0VYQ0VQVCkgJiYgIWRlZmluZWQoQ0FUQ0hfTk9FWENFUFQpCisjICBkZWZpbmUgQ0FUQ0hfTk9FWENFUFQgbm9leGNlcHQKKyMgIGRlZmluZSBDQVRDSF9OT0VYQ0VQVF9JUyh4KSBub2V4Y2VwdCh4KQorI2Vsc2UKKyMgIGRlZmluZSBDQVRDSF9OT0VYQ0VQVCB0aHJvdygpCisjICBkZWZpbmUgQ0FUQ0hfTk9FWENFUFRfSVMoeCkKKyNlbmRpZgorCisvLyBudWxscHRyIHN1cHBvcnQKKyNpZmRlZiBDQVRDSF9DT05GSUdfQ1BQMTFfTlVMTFBUUgorIyAgIGRlZmluZSBDQVRDSF9OVUxMIG51bGxwdHIKKyNlbHNlCisjICAgZGVmaW5lIENBVENIX05VTEwgTlVMTAorI2VuZGlmCisKKy8vIG92ZXJyaWRlIHN1cHBvcnQKKyNpZmRlZiBDQVRDSF9DT05GSUdfQ1BQMTFfT1ZFUlJJREUKKyMgICBkZWZpbmUgQ0FUQ0hfT1ZFUlJJREUgb3ZlcnJpZGUKKyNlbHNlCisjICAgZGVmaW5lIENBVENIX09WRVJSSURFCisjZW5kaWYKKworLy8gdW5pcXVlX3B0ciBzdXBwb3J0CisjaWZkZWYgQ0FUQ0hfQ09ORklHX0NQUDExX1VOSVFVRV9QVFIKKyMgICBkZWZpbmUgQ0FUQ0hfQVVUT19QVFIoIFQgKSBzdGQ6OnVuaXF1ZV9wdHI8VD4KKyNlbHNlCisjICAgZGVmaW5lIENBVENIX0FVVE9fUFRSKCBUICkgc3RkOjphdXRvX3B0cjxUPgorI2VuZGlmCisKKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUVfTElORTIoIG5hbWUsIGxpbmUgKSBuYW1lIyNsaW5lCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FX0xJTkUoIG5hbWUsIGxpbmUgKSBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRV9MSU5FMiggbmFtZSwgbGluZSApCisjaWZkZWYgQ0FUQ0hfQ09ORklHX0NPVU5URVIKKyMgIGRlZmluZSBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggbmFtZSApIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FX0xJTkUoIG5hbWUsIF9fQ09VTlRFUl9fICkKKyNlbHNlCisjICBkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIG5hbWUgKSBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRV9MSU5FKCBuYW1lLCBfX0xJTkVfXyApCisjZW5kaWYKKworI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9TVFJJTkdJRlkyKCBleHByICkgI2V4cHIKKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfU1RSSU5HSUZZKCBleHByICkgSU5URVJOQUxfQ0FUQ0hfU1RSSU5HSUZZMiggZXhwciApCisKKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIHN0cnVjdCBJQ29uZmlnOworCisgICAgc3RydWN0IENhc2VTZW5zaXRpdmUgeyBlbnVtIENob2ljZSB7CisgICAgICAgIFllcywKKyAgICAgICAgTm8KKyAgICB9OyB9OworCisgICAgY2xhc3MgTm9uQ29weWFibGUgeworI2lmZGVmIENBVENIX0NPTkZJR19DUFAxMV9HRU5FUkFURURfTUVUSE9EUworICAgICAgICBOb25Db3B5YWJsZSggTm9uQ29weWFibGUgY29uc3QmICkgICAgICAgICAgICAgID0gZGVsZXRlOworICAgICAgICBOb25Db3B5YWJsZSggTm9uQ29weWFibGUgJiYgKSAgICAgICAgICAgICAgICAgID0gZGVsZXRlOworICAgICAgICBOb25Db3B5YWJsZSYgb3BlcmF0b3IgPSAoIE5vbkNvcHlhYmxlIGNvbnN0JiApID0gZGVsZXRlOworICAgICAgICBOb25Db3B5YWJsZSYgb3BlcmF0b3IgPSAoIE5vbkNvcHlhYmxlICYmICkgICAgID0gZGVsZXRlOworI2Vsc2UKKyAgICAgICAgTm9uQ29weWFibGUoIE5vbkNvcHlhYmxlIGNvbnN0JiBpbmZvICk7CisgICAgICAgIE5vbkNvcHlhYmxlJiBvcGVyYXRvciA9ICggTm9uQ29weWFibGUgY29uc3QmICk7CisjZW5kaWYKKworICAgIHByb3RlY3RlZDoKKyAgICAgICAgTm9uQ29weWFibGUoKSB7fQorICAgICAgICB2aXJ0dWFsIH5Ob25Db3B5YWJsZSgpOworICAgIH07CisKKyAgICBjbGFzcyBTYWZlQm9vbCB7CisgICAgcHVibGljOgorICAgICAgICB0eXBlZGVmIHZvaWQgKFNhZmVCb29sOjoqdHlwZSkoKSBjb25zdDsKKworICAgICAgICBzdGF0aWMgdHlwZSBtYWtlU2FmZSggYm9vbCB2YWx1ZSApIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZSA/ICZTYWZlQm9vbDo6dHJ1ZVZhbHVlIDogMDsKKyAgICAgICAgfQorICAgIHByaXZhdGU6CisgICAgICAgIHZvaWQgdHJ1ZVZhbHVlKCkgY29uc3Qge30KKyAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQ29udGFpbmVyVD4KKyAgICBpbmxpbmUgdm9pZCBkZWxldGVBbGwoIENvbnRhaW5lclQmIGNvbnRhaW5lciApIHsKKyAgICAgICAgdHlwZW5hbWUgQ29udGFpbmVyVDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBjb250YWluZXIuYmVnaW4oKTsKKyAgICAgICAgdHlwZW5hbWUgQ29udGFpbmVyVDo6Y29uc3RfaXRlcmF0b3IgaXRFbmQgPSBjb250YWluZXIuZW5kKCk7CisgICAgICAgIGZvcig7IGl0ICE9IGl0RW5kOyArK2l0ICkKKyAgICAgICAgICAgIGRlbGV0ZSAqaXQ7CisgICAgfQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEFzc29jaWF0aXZlQ29udGFpbmVyVD4KKyAgICBpbmxpbmUgdm9pZCBkZWxldGVBbGxWYWx1ZXMoIEFzc29jaWF0aXZlQ29udGFpbmVyVCYgY29udGFpbmVyICkgeworICAgICAgICB0eXBlbmFtZSBBc3NvY2lhdGl2ZUNvbnRhaW5lclQ6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gY29udGFpbmVyLmJlZ2luKCk7CisgICAgICAgIHR5cGVuYW1lIEFzc29jaWF0aXZlQ29udGFpbmVyVDo6Y29uc3RfaXRlcmF0b3IgaXRFbmQgPSBjb250YWluZXIuZW5kKCk7CisgICAgICAgIGZvcig7IGl0ICE9IGl0RW5kOyArK2l0ICkKKyAgICAgICAgICAgIGRlbGV0ZSBpdC0+c2Vjb25kOworICAgIH0KKworICAgIGJvb2wgc3RhcnRzV2l0aCggc3RkOjpzdHJpbmcgY29uc3QmIHMsIHN0ZDo6c3RyaW5nIGNvbnN0JiBwcmVmaXggKTsKKyAgICBib29sIHN0YXJ0c1dpdGgoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzLCBjaGFyIHByZWZpeCApOworICAgIGJvb2wgZW5kc1dpdGgoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzLCBzdGQ6OnN0cmluZyBjb25zdCYgc3VmZml4ICk7CisgICAgYm9vbCBlbmRzV2l0aCggc3RkOjpzdHJpbmcgY29uc3QmIHMsIGNoYXIgc3VmZml4ICk7CisgICAgYm9vbCBjb250YWlucyggc3RkOjpzdHJpbmcgY29uc3QmIHMsIHN0ZDo6c3RyaW5nIGNvbnN0JiBpbmZpeCApOworICAgIHZvaWQgdG9Mb3dlckluUGxhY2UoIHN0ZDo6c3RyaW5nJiBzICk7CisgICAgc3RkOjpzdHJpbmcgdG9Mb3dlciggc3RkOjpzdHJpbmcgY29uc3QmIHMgKTsKKyAgICBzdGQ6OnN0cmluZyB0cmltKCBzdGQ6OnN0cmluZyBjb25zdCYgc3RyICk7CisgICAgYm9vbCByZXBsYWNlSW5QbGFjZSggc3RkOjpzdHJpbmcmIHN0ciwgc3RkOjpzdHJpbmcgY29uc3QmIHJlcGxhY2VUaGlzLCBzdGQ6OnN0cmluZyBjb25zdCYgd2l0aFRoaXMgKTsKKworICAgIHN0cnVjdCBwbHVyYWxpc2UgeworICAgICAgICBwbHVyYWxpc2UoIHN0ZDo6c2l6ZV90IGNvdW50LCBzdGQ6OnN0cmluZyBjb25zdCYgbGFiZWwgKTsKKworICAgICAgICBmcmllbmQgc3RkOjpvc3RyZWFtJiBvcGVyYXRvciA8PCAoIHN0ZDo6b3N0cmVhbSYgb3MsIHBsdXJhbGlzZSBjb25zdCYgcGx1cmFsaXNlciApOworCisgICAgICAgIHN0ZDo6c2l6ZV90IG1fY291bnQ7CisgICAgICAgIHN0ZDo6c3RyaW5nIG1fbGFiZWw7CisgICAgfTsKKworICAgIHN0cnVjdCBTb3VyY2VMaW5lSW5mbyB7CisKKyAgICAgICAgU291cmNlTGluZUluZm8oKTsKKyAgICAgICAgU291cmNlTGluZUluZm8oIGNoYXIgY29uc3QqIF9maWxlLCBzdGQ6OnNpemVfdCBfbGluZSApOworIyAgaWZkZWYgQ0FUQ0hfQ09ORklHX0NQUDExX0dFTkVSQVRFRF9NRVRIT0RTCisgICAgICAgIFNvdXJjZUxpbmVJbmZvKFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBvdGhlcikgICAgICAgICAgPSBkZWZhdWx0OworICAgICAgICBTb3VyY2VMaW5lSW5mbyggU291cmNlTGluZUluZm8gJiYgKSAgICAgICAgICAgICAgICAgID0gZGVmYXVsdDsKKyAgICAgICAgU291cmNlTGluZUluZm8mIG9wZXJhdG9yID0gKCBTb3VyY2VMaW5lSW5mbyBjb25zdCYgKSA9IGRlZmF1bHQ7CisgICAgICAgIFNvdXJjZUxpbmVJbmZvJiBvcGVyYXRvciA9ICggU291cmNlTGluZUluZm8gJiYgKSAgICAgPSBkZWZhdWx0OworIyAgZW5kaWYKKyAgICAgICAgYm9vbCBlbXB0eSgpIGNvbnN0OworICAgICAgICBib29sIG9wZXJhdG9yID09ICggU291cmNlTGluZUluZm8gY29uc3QmIG90aGVyICkgY29uc3Q7CisgICAgICAgIGJvb2wgb3BlcmF0b3IgPCAoIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBvdGhlciApIGNvbnN0OworCisgICAgICAgIGNoYXIgY29uc3QqIGZpbGU7CisgICAgICAgIHN0ZDo6c2l6ZV90IGxpbmU7CisgICAgfTsKKworICAgIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3IgPDwgKCBzdGQ6Om9zdHJlYW0mIG9zLCBTb3VyY2VMaW5lSW5mbyBjb25zdCYgaW5mbyApOworCisgICAgLy8gVGhpcyBpcyBqdXN0IGhlcmUgdG8gYXZvaWQgY29tcGlsZXIgd2FybmluZ3Mgd2l0aCBtYWNybyBjb25zdGFudHMgYW5kIGJvb2xlYW4gbGl0ZXJhbHMKKyAgICBpbmxpbmUgYm9vbCBpc1RydWUoIGJvb2wgdmFsdWUgKXsgcmV0dXJuIHZhbHVlOyB9CisgICAgaW5saW5lIGJvb2wgYWx3YXlzVHJ1ZSgpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBpbmxpbmUgYm9vbCBhbHdheXNGYWxzZSgpIHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgICB2b2lkIHRocm93TG9naWNFcnJvciggc3RkOjpzdHJpbmcgY29uc3QmIG1lc3NhZ2UsIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBsb2NhdGlvbkluZm8gKTsKKworICAgIHZvaWQgc2VlZFJuZyggSUNvbmZpZyBjb25zdCYgY29uZmlnICk7CisgICAgdW5zaWduZWQgaW50IHJuZ1NlZWQoKTsKKworICAgIC8vIFVzZSB0aGlzIGluIHZhcmlhZGljIHN0cmVhbWluZyBtYWNyb3MgdG8gYWxsb3cKKyAgICAvLyAgICA+PiArU3RyZWFtRW5kU3RvcAorICAgIC8vIGFzIHdlbGwgYXMKKyAgICAvLyAgICA+PiBzdHVmZiArU3RyZWFtRW5kU3RvcAorICAgIHN0cnVjdCBTdHJlYW1FbmRTdG9wIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgb3BlcmF0b3IrKCkgeworICAgICAgICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCk7CisgICAgICAgIH0KKyAgICB9OworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgVCBjb25zdCYgb3BlcmF0b3IgKyAoIFQgY29uc3QmIHZhbHVlLCBTdHJlYW1FbmRTdG9wICkgeworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorfQorCisjZGVmaW5lIENBVENIX0lOVEVSTkFMX0xJTkVJTkZPIDo6Q2F0Y2g6OlNvdXJjZUxpbmVJbmZvKCBfX0ZJTEVfXywgc3RhdGljX2Nhc3Q8c3RkOjpzaXplX3Q+KCBfX0xJTkVfXyApICkKKyNkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfRVJST1IoIG1zZyApIDo6Q2F0Y2g6OnRocm93TG9naWNFcnJvciggbXNnLCBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTyApOworCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgY2xhc3MgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24gOiBwdWJsaWMgc3RkOjpleGNlcHRpb24KKyAgICB7CisgICAgcHVibGljOgorICAgICAgICBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbiggU291cmNlTGluZUluZm8gY29uc3QmIGxpbmVJbmZvICk7CisgICAgICAgIE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbiBjb25zdCYgKSB7fQorCisgICAgICAgIHZpcnR1YWwgfk5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCkgQ0FUQ0hfTk9FWENFUFQge30KKworICAgICAgICB2aXJ0dWFsIGNvbnN0IGNoYXIqIHdoYXQoKSBjb25zdCBDQVRDSF9OT0VYQ0VQVDsKKworICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6c3RyaW5nIG1fd2hhdDsKKyAgICAgICAgU291cmNlTGluZUluZm8gbV9saW5lSW5mbzsKKyAgICB9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworI2RlZmluZSBDQVRDSF9OT1RfSU1QTEVNRU5URUQgdGhyb3cgQ2F0Y2g6Ok5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTyApCisKKy8vICNpbmNsdWRlZCBmcm9tOiBpbnRlcm5hbC9jYXRjaF9jb250ZXh0LmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0NPTlRFWFRfSF9JTkNMVURFRAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfaW50ZXJmYWNlc19nZW5lcmF0b3JzLmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0lOVEVSRkFDRVNfR0VORVJBVE9SU19IX0lOQ0xVREVECisKKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBzdHJ1Y3QgSUdlbmVyYXRvckluZm8geworICAgICAgICB2aXJ0dWFsIH5JR2VuZXJhdG9ySW5mbygpOworICAgICAgICB2aXJ0dWFsIGJvb2wgbW92ZU5leHQoKSA9IDA7CisgICAgICAgIHZpcnR1YWwgc3RkOjpzaXplX3QgZ2V0Q3VycmVudEluZGV4KCkgY29uc3QgPSAwOworICAgIH07CisKKyAgICBzdHJ1Y3QgSUdlbmVyYXRvcnNGb3JUZXN0IHsKKyAgICAgICAgdmlydHVhbCB+SUdlbmVyYXRvcnNGb3JUZXN0KCk7CisKKyAgICAgICAgdmlydHVhbCBJR2VuZXJhdG9ySW5mbyYgZ2V0R2VuZXJhdG9ySW5mbyggc3RkOjpzdHJpbmcgY29uc3QmIGZpbGVJbmZvLCBzdGQ6OnNpemVfdCBzaXplICkgPSAwOworICAgICAgICB2aXJ0dWFsIGJvb2wgbW92ZU5leHQoKSA9IDA7CisgICAgfTsKKworICAgIElHZW5lcmF0b3JzRm9yVGVzdCogY3JlYXRlR2VuZXJhdG9yc0ZvclRlc3QoKTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9wdHIuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9QVFJfSFBQX0lOQ0xVREVECisKKyNpZmRlZiBfX2NsYW5nX18KKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwdXNoCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdwYWRkZWQiCisjZW5kaWYKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIC8vIEFuIGludHJ1c2l2ZSByZWZlcmVuY2UgY291bnRpbmcgc21hcnQgcG9pbnRlci4KKyAgICAvLyBUIG11c3QgaW1wbGVtZW50IGFkZFJlZigpIGFuZCByZWxlYXNlKCkgbWV0aG9kcworICAgIC8vIHR5cGljYWxseSBpbXBsZW1lbnRpbmcgdGhlIElTaGFyZWQgaW50ZXJmYWNlCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBjbGFzcyBQdHIgeworICAgIHB1YmxpYzoKKyAgICAgICAgUHRyKCkgOiBtX3AoIENBVENIX05VTEwgKXt9CisgICAgICAgIFB0ciggVCogcCApIDogbV9wKCBwICl7CisgICAgICAgICAgICBpZiggbV9wICkKKyAgICAgICAgICAgICAgICBtX3AtPmFkZFJlZigpOworICAgICAgICB9CisgICAgICAgIFB0ciggUHRyIGNvbnN0JiBvdGhlciApIDogbV9wKCBvdGhlci5tX3AgKXsKKyAgICAgICAgICAgIGlmKCBtX3AgKQorICAgICAgICAgICAgICAgIG1fcC0+YWRkUmVmKCk7CisgICAgICAgIH0KKyAgICAgICAgflB0cigpeworICAgICAgICAgICAgaWYoIG1fcCApCisgICAgICAgICAgICAgICAgbV9wLT5yZWxlYXNlKCk7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCByZXNldCgpIHsKKyAgICAgICAgICAgIGlmKCBtX3AgKQorICAgICAgICAgICAgICAgIG1fcC0+cmVsZWFzZSgpOworICAgICAgICAgICAgbV9wID0gQ0FUQ0hfTlVMTDsKKyAgICAgICAgfQorICAgICAgICBQdHImIG9wZXJhdG9yID0gKCBUKiBwICl7CisgICAgICAgICAgICBQdHIgdGVtcCggcCApOworICAgICAgICAgICAgc3dhcCggdGVtcCApOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisgICAgICAgIFB0ciYgb3BlcmF0b3IgPSAoIFB0ciBjb25zdCYgb3RoZXIgKXsKKyAgICAgICAgICAgIFB0ciB0ZW1wKCBvdGhlciApOworICAgICAgICAgICAgc3dhcCggdGVtcCApOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisgICAgICAgIHZvaWQgc3dhcCggUHRyJiBvdGhlciApIHsgc3RkOjpzd2FwKCBtX3AsIG90aGVyLm1fcCApOyB9CisgICAgICAgIFQqIGdldCgpIGNvbnN0eyByZXR1cm4gbV9wOyB9CisgICAgICAgIFQmIG9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuICptX3A7IH0KKyAgICAgICAgVCogb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuIG1fcDsgfQorICAgICAgICBib29sIG9wZXJhdG9yICEoKSBjb25zdCB7IHJldHVybiBtX3AgPT0gQ0FUQ0hfTlVMTDsgfQorICAgICAgICBvcGVyYXRvciBTYWZlQm9vbDo6dHlwZSgpIGNvbnN0IHsgcmV0dXJuIFNhZmVCb29sOjptYWtlU2FmZSggbV9wICE9IENBVENIX05VTEwgKTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgVCogbV9wOworICAgIH07CisKKyAgICBzdHJ1Y3QgSVNoYXJlZCA6IE5vbkNvcHlhYmxlIHsKKyAgICAgICAgdmlydHVhbCB+SVNoYXJlZCgpOworICAgICAgICB2aXJ0dWFsIHZvaWQgYWRkUmVmKCkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZSgpIGNvbnN0ID0gMDsKKyAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCA9IElTaGFyZWQ+CisgICAgc3RydWN0IFNoYXJlZEltcGwgOiBUIHsKKworICAgICAgICBTaGFyZWRJbXBsKCkgOiBtX3JjKCAwICl7fQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBhZGRSZWYoKSBjb25zdCB7CisgICAgICAgICAgICArK21fcmM7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCB2b2lkIHJlbGVhc2UoKSBjb25zdCB7CisgICAgICAgICAgICBpZiggLS1tX3JjID09IDAgKQorICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgbXV0YWJsZSB1bnNpZ25lZCBpbnQgbV9yYzsKKyAgICB9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworI2lmZGVmIF9fY2xhbmdfXworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHBvcAorI2VuZGlmCisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBjbGFzcyBUZXN0Q2FzZTsKKyAgICBjbGFzcyBTdHJlYW07CisgICAgc3RydWN0IElSZXN1bHRDYXB0dXJlOworICAgIHN0cnVjdCBJUnVubmVyOworICAgIHN0cnVjdCBJR2VuZXJhdG9yc0ZvclRlc3Q7CisgICAgc3RydWN0IElDb25maWc7CisKKyAgICBzdHJ1Y3QgSUNvbnRleHQKKyAgICB7CisgICAgICAgIHZpcnR1YWwgfklDb250ZXh0KCk7CisKKyAgICAgICAgdmlydHVhbCBJUmVzdWx0Q2FwdHVyZSogZ2V0UmVzdWx0Q2FwdHVyZSgpID0gMDsKKyAgICAgICAgdmlydHVhbCBJUnVubmVyKiBnZXRSdW5uZXIoKSA9IDA7CisgICAgICAgIHZpcnR1YWwgc2l6ZV90IGdldEdlbmVyYXRvckluZGV4KCBzdGQ6OnN0cmluZyBjb25zdCYgZmlsZUluZm8sIHNpemVfdCB0b3RhbFNpemUgKSA9IDA7CisgICAgICAgIHZpcnR1YWwgYm9vbCBhZHZhbmNlR2VuZXJhdG9yc0ZvckN1cnJlbnRUZXN0KCkgPSAwOworICAgICAgICB2aXJ0dWFsIFB0cjxJQ29uZmlnIGNvbnN0PiBnZXRDb25maWcoKSBjb25zdCA9IDA7CisgICAgfTsKKworICAgIHN0cnVjdCBJTXV0YWJsZUNvbnRleHQgOiBJQ29udGV4dAorICAgIHsKKyAgICAgICAgdmlydHVhbCB+SU11dGFibGVDb250ZXh0KCk7CisgICAgICAgIHZpcnR1YWwgdm9pZCBzZXRSZXN1bHRDYXB0dXJlKCBJUmVzdWx0Q2FwdHVyZSogcmVzdWx0Q2FwdHVyZSApID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIHNldFJ1bm5lciggSVJ1bm5lciogcnVubmVyICkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0Q29uZmlnKCBQdHI8SUNvbmZpZyBjb25zdD4gY29uc3QmIGNvbmZpZyApID0gMDsKKyAgICB9OworCisgICAgSUNvbnRleHQmIGdldEN1cnJlbnRDb250ZXh0KCk7CisgICAgSU11dGFibGVDb250ZXh0JiBnZXRDdXJyZW50TXV0YWJsZUNvbnRleHQoKTsKKyAgICB2b2lkIGNsZWFuVXBDb250ZXh0KCk7CisgICAgU3RyZWFtIGNyZWF0ZVN0cmVhbSggc3RkOjpzdHJpbmcgY29uc3QmIHN0cmVhbU5hbWUgKTsKKworfQorCisvLyAjaW5jbHVkZWQgZnJvbTogaW50ZXJuYWwvY2F0Y2hfdGVzdF9yZWdpc3RyeS5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1RFU1RfUkVHSVNUUllfSFBQX0lOQ0xVREVECisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9pbnRlcmZhY2VzX3Rlc3RjYXNlLmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0lOVEVSRkFDRVNfVEVTVENBU0VfSF9JTkNMVURFRAorCisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgY2xhc3MgVGVzdFNwZWM7CisKKyAgICBzdHJ1Y3QgSVRlc3RDYXNlIDogSVNoYXJlZCB7CisgICAgICAgIHZpcnR1YWwgdm9pZCBpbnZva2UgKCkgY29uc3QgPSAwOworICAgIHByb3RlY3RlZDoKKyAgICAgICAgdmlydHVhbCB+SVRlc3RDYXNlKCk7CisgICAgfTsKKworICAgIGNsYXNzIFRlc3RDYXNlOworICAgIHN0cnVjdCBJQ29uZmlnOworCisgICAgc3RydWN0IElUZXN0Q2FzZVJlZ2lzdHJ5IHsKKyAgICAgICAgdmlydHVhbCB+SVRlc3RDYXNlUmVnaXN0cnkoKTsKKyAgICAgICAgdmlydHVhbCBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gY29uc3QmIGdldEFsbFRlc3RzKCkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPiBjb25zdCYgZ2V0QWxsVGVzdHNTb3J0ZWQoIElDb25maWcgY29uc3QmIGNvbmZpZyApIGNvbnN0ID0gMDsKKyAgICB9OworCisgICAgYm9vbCBtYXRjaFRlc3QoIFRlc3RDYXNlIGNvbnN0JiB0ZXN0Q2FzZSwgVGVzdFNwZWMgY29uc3QmIHRlc3RTcGVjLCBJQ29uZmlnIGNvbnN0JiBjb25maWcgKTsKKyAgICBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gZmlsdGVyVGVzdHMoIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPiBjb25zdCYgdGVzdENhc2VzLCBUZXN0U3BlYyBjb25zdCYgdGVzdFNwZWMsIElDb25maWcgY29uc3QmIGNvbmZpZyApOworICAgIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPiBjb25zdCYgZ2V0QWxsVGVzdENhc2VzU29ydGVkKCBJQ29uZmlnIGNvbnN0JiBjb25maWcgKTsKKworfQorCituYW1lc3BhY2UgQ2F0Y2ggeworCit0ZW1wbGF0ZTx0eXBlbmFtZSBDPgorY2xhc3MgTWV0aG9kVGVzdENhc2UgOiBwdWJsaWMgU2hhcmVkSW1wbDxJVGVzdENhc2U+IHsKKworcHVibGljOgorICAgIE1ldGhvZFRlc3RDYXNlKCB2b2lkIChDOjoqbWV0aG9kKSgpICkgOiBtX21ldGhvZCggbWV0aG9kICkge30KKworICAgIHZpcnR1YWwgdm9pZCBpbnZva2UoKSBjb25zdCB7CisgICAgICAgIEMgb2JqOworICAgICAgICAob2JqLiptX21ldGhvZCkoKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgdmlydHVhbCB+TWV0aG9kVGVzdENhc2UoKSB7fQorCisgICAgdm9pZCAoQzo6Km1fbWV0aG9kKSgpOworfTsKKwordHlwZWRlZiB2b2lkKCpUZXN0RnVuY3Rpb24pKCk7CisKK3N0cnVjdCBOYW1lQW5kRGVzYyB7CisgICAgTmFtZUFuZERlc2MoIGNvbnN0IGNoYXIqIF9uYW1lID0gIiIsIGNvbnN0IGNoYXIqIF9kZXNjcmlwdGlvbj0gIiIgKQorICAgIDogbmFtZSggX25hbWUgKSwgZGVzY3JpcHRpb24oIF9kZXNjcmlwdGlvbiApCisgICAge30KKworICAgIGNvbnN0IGNoYXIqIG5hbWU7CisgICAgY29uc3QgY2hhciogZGVzY3JpcHRpb247Cit9OworCit2b2lkIHJlZ2lzdGVyVGVzdENhc2UKKyAgICAoICAgSVRlc3RDYXNlKiB0ZXN0Q2FzZSwKKyAgICAgICAgY2hhciBjb25zdCogY2xhc3NOYW1lLAorICAgICAgICBOYW1lQW5kRGVzYyBjb25zdCYgbmFtZUFuZERlc2MsCisgICAgICAgIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBsaW5lSW5mbyApOworCitzdHJ1Y3QgQXV0b1JlZyB7CisKKyAgICBBdXRvUmVnCisgICAgICAgICggICBUZXN0RnVuY3Rpb24gZnVuY3Rpb24sCisgICAgICAgICAgICBTb3VyY2VMaW5lSW5mbyBjb25zdCYgbGluZUluZm8sCisgICAgICAgICAgICBOYW1lQW5kRGVzYyBjb25zdCYgbmFtZUFuZERlc2MgKTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEM+CisgICAgQXV0b1JlZworICAgICAgICAoICAgdm9pZCAoQzo6Km1ldGhvZCkoKSwKKyAgICAgICAgICAgIGNoYXIgY29uc3QqIGNsYXNzTmFtZSwKKyAgICAgICAgICAgIE5hbWVBbmREZXNjIGNvbnN0JiBuYW1lQW5kRGVzYywKKyAgICAgICAgICAgIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBsaW5lSW5mbyApIHsKKworICAgICAgICByZWdpc3RlclRlc3RDYXNlCisgICAgICAgICAgICAoICAgbmV3IE1ldGhvZFRlc3RDYXNlPEM+KCBtZXRob2QgKSwKKyAgICAgICAgICAgICAgICBjbGFzc05hbWUsCisgICAgICAgICAgICAgICAgbmFtZUFuZERlc2MsCisgICAgICAgICAgICAgICAgbGluZUluZm8gKTsKKyAgICB9CisKKyAgICB+QXV0b1JlZygpOworCitwcml2YXRlOgorICAgIEF1dG9SZWcoIEF1dG9SZWcgY29uc3QmICk7CisgICAgdm9pZCBvcGVyYXRvcj0gKCBBdXRvUmVnIGNvbnN0JiApOworfTsKKwordm9pZCByZWdpc3RlclRlc3RDYXNlRnVuY3Rpb24KKyAgICAoICAgVGVzdEZ1bmN0aW9uIGZ1bmN0aW9uLAorICAgICAgICBTb3VyY2VMaW5lSW5mbyBjb25zdCYgbGluZUluZm8sCisgICAgICAgIE5hbWVBbmREZXNjIGNvbnN0JiBuYW1lQW5kRGVzYyApOworCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworI2lmZGVmIENBVENIX0NPTkZJR19WQVJJQURJQ19NQUNST1MKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9URVNUQ0FTRTIoIFRlc3ROYW1lLCAuLi4gKSBcCisgICAgICAgIHN0YXRpYyB2b2lkIFRlc3ROYW1lKCk7IFwKKyAgICAgICAgQ0FUQ0hfSU5URVJOQUxfU1VQUFJFU1NfRVREX1dBUk5JTkdTIFwKKyAgICAgICAgbmFtZXNwYWNleyBDYXRjaDo6QXV0b1JlZyBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggYXV0b1JlZ2lzdHJhciApKCAmVGVzdE5hbWUsIENBVENIX0lOVEVSTkFMX0xJTkVJTkZPLCBDYXRjaDo6TmFtZUFuZERlc2MoIF9fVkFfQVJHU19fICkgKTsgfSBcCisgICAgICAgIENBVENIX0lOVEVSTkFMX1VOU1VQUFJFU1NfRVREX1dBUk5JTkdTIFwKKyAgICAgICAgc3RhdGljIHZvaWQgVGVzdE5hbWUoKQorICAgICNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfVEVTVENBU0UoIC4uLiApIFwKKyAgICAgICAgSU5URVJOQUxfQ0FUQ0hfVEVTVENBU0UyKCBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggX19fX0NfQV9UX0NfSF9fX19UX0VfU19UX19fXyApLCBfX1ZBX0FSR1NfXyApCisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9NRVRIT0RfQVNfVEVTVF9DQVNFKCBRdWFsaWZpZWRNZXRob2QsIC4uLiApIFwKKyAgICAgICAgQ0FUQ0hfSU5URVJOQUxfU1VQUFJFU1NfRVREX1dBUk5JTkdTIFwKKyAgICAgICAgbmFtZXNwYWNleyBDYXRjaDo6QXV0b1JlZyBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggYXV0b1JlZ2lzdHJhciApKCAmUXVhbGlmaWVkTWV0aG9kLCAiJiIgI1F1YWxpZmllZE1ldGhvZCwgQ2F0Y2g6Ok5hbWVBbmREZXNjKCBfX1ZBX0FSR1NfXyApLCBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTyApOyB9IFwKKyAgICAgICAgQ0FUQ0hfSU5URVJOQUxfVU5TVVBQUkVTU19FVERfV0FSTklOR1MKKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAjZGVmaW5lIElOVEVSTkFMX0NBVENIX1RFU1RfQ0FTRV9NRVRIT0QyKCBUZXN0TmFtZSwgQ2xhc3NOYW1lLCAuLi4gKVwKKyAgICAgICAgQ0FUQ0hfSU5URVJOQUxfU1VQUFJFU1NfRVREX1dBUk5JTkdTIFwKKyAgICAgICAgbmFtZXNwYWNleyBcCisgICAgICAgICAgICBzdHJ1Y3QgVGVzdE5hbWUgOiBDbGFzc05hbWV7IFwKKyAgICAgICAgICAgICAgICB2b2lkIHRlc3QoKTsgXAorICAgICAgICAgICAgfTsgXAorICAgICAgICAgICAgQ2F0Y2g6OkF1dG9SZWcgSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIGF1dG9SZWdpc3RyYXIgKSAoICZUZXN0TmFtZTo6dGVzdCwgI0NsYXNzTmFtZSwgQ2F0Y2g6Ok5hbWVBbmREZXNjKCBfX1ZBX0FSR1NfXyApLCBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTyApOyBcCisgICAgICAgIH0gXAorICAgICAgICBDQVRDSF9JTlRFUk5BTF9VTlNVUFBSRVNTX0VURF9XQVJOSU5HUyBcCisgICAgICAgIHZvaWQgVGVzdE5hbWU6OnRlc3QoKQorICAgICNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfVEVTVF9DQVNFX01FVEhPRCggQ2xhc3NOYW1lLCAuLi4gKSBcCisgICAgICAgIElOVEVSTkFMX0NBVENIX1RFU1RfQ0FTRV9NRVRIT0QyKCBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggX19fX0NfQV9UX0NfSF9fX19UX0VfU19UX19fXyApLCBDbGFzc05hbWUsIF9fVkFfQVJHU19fICkKKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAjZGVmaW5lIElOVEVSTkFMX0NBVENIX1JFR0lTVEVSX1RFU1RDQVNFKCBGdW5jdGlvbiwgLi4uICkgXAorICAgICAgICBDQVRDSF9JTlRFUk5BTF9TVVBQUkVTU19FVERfV0FSTklOR1MgXAorICAgICAgICBDYXRjaDo6QXV0b1JlZyggRnVuY3Rpb24sIENBVENIX0lOVEVSTkFMX0xJTkVJTkZPLCBDYXRjaDo6TmFtZUFuZERlc2MoIF9fVkFfQVJHU19fICkgKTsgXAorICAgICAgICBDQVRDSF9JTlRFUk5BTF9VTlNVUFBSRVNTX0VURF9XQVJOSU5HUworCisjZWxzZQorICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAjZGVmaW5lIElOVEVSTkFMX0NBVENIX1RFU1RDQVNFMiggVGVzdE5hbWUsIE5hbWUsIERlc2MgKSBcCisgICAgICAgIHN0YXRpYyB2b2lkIFRlc3ROYW1lKCk7IFwKKyAgICAgICAgQ0FUQ0hfSU5URVJOQUxfU1VQUFJFU1NfRVREX1dBUk5JTkdTIFwKKyAgICAgICAgbmFtZXNwYWNleyBDYXRjaDo6QXV0b1JlZyBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggYXV0b1JlZ2lzdHJhciApKCAmVGVzdE5hbWUsIENBVENIX0lOVEVSTkFMX0xJTkVJTkZPLCBDYXRjaDo6TmFtZUFuZERlc2MoIE5hbWUsIERlc2MgKSApOyB9XAorICAgICAgICBDQVRDSF9JTlRFUk5BTF9VTlNVUFBSRVNTX0VURF9XQVJOSU5HUyBcCisgICAgICAgIHN0YXRpYyB2b2lkIFRlc3ROYW1lKCkKKyAgICAjZGVmaW5lIElOVEVSTkFMX0NBVENIX1RFU1RDQVNFKCBOYW1lLCBEZXNjICkgXAorICAgICAgICBJTlRFUk5BTF9DQVRDSF9URVNUQ0FTRTIoIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBfX19fQ19BX1RfQ19IX19fX1RfRV9TX1RfX19fICksIE5hbWUsIERlc2MgKQorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfTUVUSE9EX0FTX1RFU1RfQ0FTRSggUXVhbGlmaWVkTWV0aG9kLCBOYW1lLCBEZXNjICkgXAorICAgICAgICBDQVRDSF9JTlRFUk5BTF9TVVBQUkVTU19FVERfV0FSTklOR1MgXAorICAgICAgICBuYW1lc3BhY2V7IENhdGNoOjpBdXRvUmVnIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBhdXRvUmVnaXN0cmFyICkoICZRdWFsaWZpZWRNZXRob2QsICImIiAjUXVhbGlmaWVkTWV0aG9kLCBDYXRjaDo6TmFtZUFuZERlc2MoIE5hbWUsIERlc2MgKSwgQ0FUQ0hfSU5URVJOQUxfTElORUlORk8gKTsgfSBcCisgICAgICAgIENBVENIX0lOVEVSTkFMX1VOU1VQUFJFU1NfRVREX1dBUk5JTkdTCisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9URVNUX0NBU0VfTUVUSE9EMiggVGVzdENhc2VOYW1lLCBDbGFzc05hbWUsIFRlc3ROYW1lLCBEZXNjIClcCisgICAgICAgIENBVENIX0lOVEVSTkFMX1NVUFBSRVNTX0VURF9XQVJOSU5HUyBcCisgICAgICAgIG5hbWVzcGFjZXsgXAorICAgICAgICAgICAgc3RydWN0IFRlc3RDYXNlTmFtZSA6IENsYXNzTmFtZXsgXAorICAgICAgICAgICAgICAgIHZvaWQgdGVzdCgpOyBcCisgICAgICAgICAgICB9OyBcCisgICAgICAgICAgICBDYXRjaDo6QXV0b1JlZyBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggYXV0b1JlZ2lzdHJhciApICggJlRlc3RDYXNlTmFtZTo6dGVzdCwgI0NsYXNzTmFtZSwgQ2F0Y2g6Ok5hbWVBbmREZXNjKCBUZXN0TmFtZSwgRGVzYyApLCBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTyApOyBcCisgICAgICAgIH0gXAorICAgICAgICBDQVRDSF9JTlRFUk5BTF9VTlNVUFBSRVNTX0VURF9XQVJOSU5HUyBcCisgICAgICAgIHZvaWQgVGVzdENhc2VOYW1lOjp0ZXN0KCkKKyAgICAjZGVmaW5lIElOVEVSTkFMX0NBVENIX1RFU1RfQ0FTRV9NRVRIT0QoIENsYXNzTmFtZSwgVGVzdE5hbWUsIERlc2MgKVwKKyAgICAgICAgSU5URVJOQUxfQ0FUQ0hfVEVTVF9DQVNFX01FVEhPRDIoIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBfX19fQ19BX1RfQ19IX19fX1RfRV9TX1RfX19fICksIENsYXNzTmFtZSwgVGVzdE5hbWUsIERlc2MgKQorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfUkVHSVNURVJfVEVTVENBU0UoIEZ1bmN0aW9uLCBOYW1lLCBEZXNjICkgXAorICAgICAgICBDQVRDSF9JTlRFUk5BTF9TVVBQUkVTU19FVERfV0FSTklOR1MgXAorICAgICAgICBDYXRjaDo6QXV0b1JlZyggRnVuY3Rpb24sIENBVENIX0lOVEVSTkFMX0xJTkVJTkZPLCBDYXRjaDo6TmFtZUFuZERlc2MoIE5hbWUsIERlc2MgKSApOyBcCisgICAgICAgIENBVENIX0lOVEVSTkFMX1VOU1VQUFJFU1NfRVREX1dBUk5JTkdTCisKKyNlbmRpZgorCisvLyAjaW5jbHVkZWQgZnJvbTogaW50ZXJuYWwvY2F0Y2hfY2FwdHVyZS5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0NBUFRVUkVfSFBQX0lOQ0xVREVECisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9yZXN1bHRfYnVpbGRlci5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9SRVNVTFRfQlVJTERFUl9IX0lOQ0xVREVECisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9yZXN1bHRfdHlwZS5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9SRVNVTFRfVFlQRV9IX0lOQ0xVREVECisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICAvLyBSZXN1bHRXYXM6Ok9mVHlwZSBlbnVtCisgICAgc3RydWN0IFJlc3VsdFdhcyB7IGVudW0gT2ZUeXBlIHsKKyAgICAgICAgVW5rbm93biA9IC0xLAorICAgICAgICBPayA9IDAsCisgICAgICAgIEluZm8gPSAxLAorICAgICAgICBXYXJuaW5nID0gMiwKKworICAgICAgICBGYWlsdXJlQml0ID0gMHgxMCwKKworICAgICAgICBFeHByZXNzaW9uRmFpbGVkID0gRmFpbHVyZUJpdCB8IDEsCisgICAgICAgIEV4cGxpY2l0RmFpbHVyZSA9IEZhaWx1cmVCaXQgfCAyLAorCisgICAgICAgIEV4Y2VwdGlvbiA9IDB4MTAwIHwgRmFpbHVyZUJpdCwKKworICAgICAgICBUaHJld0V4Y2VwdGlvbiA9IEV4Y2VwdGlvbiB8IDEsCisgICAgICAgIERpZG50VGhyb3dFeGNlcHRpb24gPSBFeGNlcHRpb24gfCAyLAorCisgICAgICAgIEZhdGFsRXJyb3JDb25kaXRpb24gPSAweDIwMCB8IEZhaWx1cmVCaXQKKworICAgIH07IH07CisKKyAgICBpbmxpbmUgYm9vbCBpc09rKCBSZXN1bHRXYXM6Ok9mVHlwZSByZXN1bHRUeXBlICkgeworICAgICAgICByZXR1cm4gKCByZXN1bHRUeXBlICYgUmVzdWx0V2FzOjpGYWlsdXJlQml0ICkgPT0gMDsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgaXNKdXN0SW5mbyggaW50IGZsYWdzICkgeworICAgICAgICByZXR1cm4gZmxhZ3MgPT0gUmVzdWx0V2FzOjpJbmZvOworICAgIH0KKworICAgIC8vIFJlc3VsdERpc3Bvc2l0aW9uOjpGbGFncyBlbnVtCisgICAgc3RydWN0IFJlc3VsdERpc3Bvc2l0aW9uIHsgZW51bSBGbGFncyB7CisgICAgICAgIE5vcm1hbCA9IDB4MDEsCisKKyAgICAgICAgQ29udGludWVPbkZhaWx1cmUgPSAweDAyLCAgIC8vIEZhaWx1cmVzIGZhaWwgdGVzdCwgYnV0IGV4ZWN1dGlvbiBjb250aW51ZXMKKyAgICAgICAgRmFsc2VUZXN0ID0gMHgwNCwgICAgICAgICAgIC8vIFByZWZpeCBleHByZXNzaW9uIHdpdGggIQorICAgICAgICBTdXBwcmVzc0ZhaWwgPSAweDA4ICAgICAgICAgLy8gRmFpbHVyZXMgYXJlIHJlcG9ydGVkIGJ1dCBkbyBub3QgZmFpbCB0aGUgdGVzdAorICAgIH07IH07CisKKyAgICBpbmxpbmUgUmVzdWx0RGlzcG9zaXRpb246OkZsYWdzIG9wZXJhdG9yIHwgKCBSZXN1bHREaXNwb3NpdGlvbjo6RmxhZ3MgbGhzLCBSZXN1bHREaXNwb3NpdGlvbjo6RmxhZ3MgcmhzICkgeworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVzdWx0RGlzcG9zaXRpb246OkZsYWdzPiggc3RhdGljX2Nhc3Q8aW50PiggbGhzICkgfCBzdGF0aWNfY2FzdDxpbnQ+KCByaHMgKSApOworICAgIH0KKworICAgIGlubGluZSBib29sIHNob3VsZENvbnRpbnVlT25GYWlsdXJlKCBpbnQgZmxhZ3MgKSAgICB7IHJldHVybiAoIGZsYWdzICYgUmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlICkgIT0gMDsgfQorICAgIGlubGluZSBib29sIGlzRmFsc2VUZXN0KCBpbnQgZmxhZ3MgKSAgICAgICAgICAgICAgICB7IHJldHVybiAoIGZsYWdzICYgUmVzdWx0RGlzcG9zaXRpb246OkZhbHNlVGVzdCApICE9IDA7IH0KKyAgICBpbmxpbmUgYm9vbCBzaG91bGRTdXBwcmVzc0ZhaWx1cmUoIGludCBmbGFncyApICAgICAgeyByZXR1cm4gKCBmbGFncyAmIFJlc3VsdERpc3Bvc2l0aW9uOjpTdXBwcmVzc0ZhaWwgKSAhPSAwOyB9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfYXNzZXJ0aW9ucmVzdWx0LmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0FTU0VSVElPTlJFU1VMVF9IX0lOQ0xVREVECisKKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBzdHJ1Y3QgU1RBVElDX0FTU0VSVF9FeHByZXNzaW9uX1Rvb19Db21wbGV4X1BsZWFzZV9SZXdyaXRlX0FzX0JpbmFyeV9Db21wYXJpc29uOworCisgICAgc3RydWN0IERlY29tcG9zZWRFeHByZXNzaW9uCisgICAgeworICAgICAgICB2aXJ0dWFsIH5EZWNvbXBvc2VkRXhwcmVzc2lvbigpIHt9CisgICAgICAgIHZpcnR1YWwgYm9vbCBpc0JpbmFyeUV4cHJlc3Npb24oKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCB2b2lkIHJlY29uc3RydWN0RXhwcmVzc2lvbiggc3RkOjpzdHJpbmcmIGRlc3QgKSBjb25zdCA9IDA7CisKKyAgICAgICAgLy8gT25seSBzaW1wbGUgYmluYXJ5IGNvbXBhcmlzb25zIGNhbiBiZSBkZWNvbXBvc2VkLgorICAgICAgICAvLyBJZiBtb3JlIGNvbXBsZXggY2hlY2sgaXMgcmVxdWlyZWQgdGhlbiB3cmFwIHN1Yi1leHByZXNzaW9ucyBpbiBwYXJlbnRoZXNlcy4KKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gU1RBVElDX0FTU0VSVF9FeHByZXNzaW9uX1Rvb19Db21wbGV4X1BsZWFzZV9SZXdyaXRlX0FzX0JpbmFyeV9Db21wYXJpc29uJiBvcGVyYXRvciArICggVCBjb25zdCYgKTsKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gU1RBVElDX0FTU0VSVF9FeHByZXNzaW9uX1Rvb19Db21wbGV4X1BsZWFzZV9SZXdyaXRlX0FzX0JpbmFyeV9Db21wYXJpc29uJiBvcGVyYXRvciAtICggVCBjb25zdCYgKTsKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gU1RBVElDX0FTU0VSVF9FeHByZXNzaW9uX1Rvb19Db21wbGV4X1BsZWFzZV9SZXdyaXRlX0FzX0JpbmFyeV9Db21wYXJpc29uJiBvcGVyYXRvciAqICggVCBjb25zdCYgKTsKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gU1RBVElDX0FTU0VSVF9FeHByZXNzaW9uX1Rvb19Db21wbGV4X1BsZWFzZV9SZXdyaXRlX0FzX0JpbmFyeV9Db21wYXJpc29uJiBvcGVyYXRvciAvICggVCBjb25zdCYgKTsKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gU1RBVElDX0FTU0VSVF9FeHByZXNzaW9uX1Rvb19Db21wbGV4X1BsZWFzZV9SZXdyaXRlX0FzX0JpbmFyeV9Db21wYXJpc29uJiBvcGVyYXRvciAlICggVCBjb25zdCYgKTsKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gU1RBVElDX0FTU0VSVF9FeHByZXNzaW9uX1Rvb19Db21wbGV4X1BsZWFzZV9SZXdyaXRlX0FzX0JpbmFyeV9Db21wYXJpc29uJiBvcGVyYXRvciAmJiAoIFQgY29uc3QmICk7CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IFNUQVRJQ19BU1NFUlRfRXhwcmVzc2lvbl9Ub29fQ29tcGxleF9QbGVhc2VfUmV3cml0ZV9Bc19CaW5hcnlfQ29tcGFyaXNvbiYgb3BlcmF0b3IgfHwgKCBUIGNvbnN0JiApOworCisJcHJpdmF0ZToKKwkJRGVjb21wb3NlZEV4cHJlc3Npb24mIG9wZXJhdG9yID0gKERlY29tcG9zZWRFeHByZXNzaW9uIGNvbnN0Jik7CisgICAgfTsKKworICAgIHN0cnVjdCBBc3NlcnRpb25JbmZvCisgICAgeworICAgICAgICBBc3NlcnRpb25JbmZvKCkge30KKyAgICAgICAgQXNzZXJ0aW9uSW5mbyggIHN0ZDo6c3RyaW5nIGNvbnN0JiBfbWFjcm9OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTGluZUluZm8gY29uc3QmIF9saW5lSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBfY2FwdHVyZWRFeHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgUmVzdWx0RGlzcG9zaXRpb246OkZsYWdzIF9yZXN1bHREaXNwb3NpdGlvbiApOworCisgICAgICAgIHN0ZDo6c3RyaW5nIG1hY3JvTmFtZTsKKyAgICAgICAgU291cmNlTGluZUluZm8gbGluZUluZm87CisgICAgICAgIHN0ZDo6c3RyaW5nIGNhcHR1cmVkRXhwcmVzc2lvbjsKKyAgICAgICAgUmVzdWx0RGlzcG9zaXRpb246OkZsYWdzIHJlc3VsdERpc3Bvc2l0aW9uOworICAgIH07CisKKyAgICBzdHJ1Y3QgQXNzZXJ0aW9uUmVzdWx0RGF0YQorICAgIHsKKyAgICAgICAgQXNzZXJ0aW9uUmVzdWx0RGF0YSgpIDogZGVjb21wb3NlZEV4cHJlc3Npb24oIENBVENIX05VTEwgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCByZXN1bHRUeXBlKCBSZXN1bHRXYXM6OlVua25vd24gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBuZWdhdGVkKCBmYWxzZSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIHBhcmVudGhlc2l6ZWQoIGZhbHNlICkge30KKworICAgICAgICB2b2lkIG5lZ2F0ZSggYm9vbCBwYXJlbnRoZXNpemUgKSB7CisgICAgICAgICAgICBuZWdhdGVkID0gIW5lZ2F0ZWQ7CisgICAgICAgICAgICBwYXJlbnRoZXNpemVkID0gcGFyZW50aGVzaXplOworICAgICAgICAgICAgaWYoIHJlc3VsdFR5cGUgPT0gUmVzdWx0V2FzOjpPayApCisgICAgICAgICAgICAgICAgcmVzdWx0VHlwZSA9IFJlc3VsdFdhczo6RXhwcmVzc2lvbkZhaWxlZDsKKyAgICAgICAgICAgIGVsc2UgaWYoIHJlc3VsdFR5cGUgPT0gUmVzdWx0V2FzOjpFeHByZXNzaW9uRmFpbGVkICkKKyAgICAgICAgICAgICAgICByZXN1bHRUeXBlID0gUmVzdWx0V2FzOjpPazsKKyAgICAgICAgfQorCisgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiByZWNvbnN0cnVjdEV4cHJlc3Npb24oKSBjb25zdCB7CisgICAgICAgICAgICBpZiggZGVjb21wb3NlZEV4cHJlc3Npb24gIT0gQ0FUQ0hfTlVMTCApIHsKKyAgICAgICAgICAgICAgICBkZWNvbXBvc2VkRXhwcmVzc2lvbi0+cmVjb25zdHJ1Y3RFeHByZXNzaW9uKCByZWNvbnN0cnVjdGVkRXhwcmVzc2lvbiApOworICAgICAgICAgICAgICAgIGlmKCBwYXJlbnRoZXNpemVkICkgeworICAgICAgICAgICAgICAgICAgICByZWNvbnN0cnVjdGVkRXhwcmVzc2lvbi5pbnNlcnQoIDAsIDEsICcoJyApOworICAgICAgICAgICAgICAgICAgICByZWNvbnN0cnVjdGVkRXhwcmVzc2lvbi5hcHBlbmQoIDEsICcpJyApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiggbmVnYXRlZCApIHsKKyAgICAgICAgICAgICAgICAgICAgcmVjb25zdHJ1Y3RlZEV4cHJlc3Npb24uaW5zZXJ0KCAwLCAxLCAnIScgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGVjb21wb3NlZEV4cHJlc3Npb24gPSBDQVRDSF9OVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJlY29uc3RydWN0ZWRFeHByZXNzaW9uOworICAgICAgICB9CisKKyAgICAgICAgbXV0YWJsZSBEZWNvbXBvc2VkRXhwcmVzc2lvbiBjb25zdCogZGVjb21wb3NlZEV4cHJlc3Npb247CisgICAgICAgIG11dGFibGUgc3RkOjpzdHJpbmcgcmVjb25zdHJ1Y3RlZEV4cHJlc3Npb247CisgICAgICAgIHN0ZDo6c3RyaW5nIG1lc3NhZ2U7CisgICAgICAgIFJlc3VsdFdhczo6T2ZUeXBlIHJlc3VsdFR5cGU7CisgICAgICAgIGJvb2wgbmVnYXRlZDsKKyAgICAgICAgYm9vbCBwYXJlbnRoZXNpemVkOworICAgIH07CisKKyAgICBjbGFzcyBBc3NlcnRpb25SZXN1bHQgeworICAgIHB1YmxpYzoKKyAgICAgICAgQXNzZXJ0aW9uUmVzdWx0KCk7CisgICAgICAgIEFzc2VydGlvblJlc3VsdCggQXNzZXJ0aW9uSW5mbyBjb25zdCYgaW5mbywgQXNzZXJ0aW9uUmVzdWx0RGF0YSBjb25zdCYgZGF0YSApOworICAgICAgICB+QXNzZXJ0aW9uUmVzdWx0KCk7CisjICBpZmRlZiBDQVRDSF9DT05GSUdfQ1BQMTFfR0VORVJBVEVEX01FVEhPRFMKKyAgICAgICAgIEFzc2VydGlvblJlc3VsdCggQXNzZXJ0aW9uUmVzdWx0IGNvbnN0JiApICAgICAgICAgICAgICA9IGRlZmF1bHQ7CisgICAgICAgICBBc3NlcnRpb25SZXN1bHQoIEFzc2VydGlvblJlc3VsdCAmJiApICAgICAgICAgICAgICAgICAgPSBkZWZhdWx0OworICAgICAgICAgQXNzZXJ0aW9uUmVzdWx0JiBvcGVyYXRvciA9ICggQXNzZXJ0aW9uUmVzdWx0IGNvbnN0JiApID0gZGVmYXVsdDsKKyAgICAgICAgIEFzc2VydGlvblJlc3VsdCYgb3BlcmF0b3IgPSAoIEFzc2VydGlvblJlc3VsdCAmJiApICAgICA9IGRlZmF1bHQ7CisjICBlbmRpZgorCisgICAgICAgIGJvb2wgaXNPaygpIGNvbnN0OworICAgICAgICBib29sIHN1Y2NlZWRlZCgpIGNvbnN0OworICAgICAgICBSZXN1bHRXYXM6Ok9mVHlwZSBnZXRSZXN1bHRUeXBlKCkgY29uc3Q7CisgICAgICAgIGJvb2wgaGFzRXhwcmVzc2lvbigpIGNvbnN0OworICAgICAgICBib29sIGhhc01lc3NhZ2UoKSBjb25zdDsKKyAgICAgICAgc3RkOjpzdHJpbmcgZ2V0RXhwcmVzc2lvbigpIGNvbnN0OworICAgICAgICBzdGQ6OnN0cmluZyBnZXRFeHByZXNzaW9uSW5NYWNybygpIGNvbnN0OworICAgICAgICBib29sIGhhc0V4cGFuZGVkRXhwcmVzc2lvbigpIGNvbnN0OworICAgICAgICBzdGQ6OnN0cmluZyBnZXRFeHBhbmRlZEV4cHJlc3Npb24oKSBjb25zdDsKKyAgICAgICAgc3RkOjpzdHJpbmcgZ2V0TWVzc2FnZSgpIGNvbnN0OworICAgICAgICBTb3VyY2VMaW5lSW5mbyBnZXRTb3VyY2VJbmZvKCkgY29uc3Q7CisgICAgICAgIHN0ZDo6c3RyaW5nIGdldFRlc3RNYWNyb05hbWUoKSBjb25zdDsKKyAgICAgICAgdm9pZCBkaXNjYXJkRGVjb21wb3NlZEV4cHJlc3Npb24oKSBjb25zdDsKKyAgICAgICAgdm9pZCBleHBhbmREZWNvbXBvc2VkRXhwcmVzc2lvbigpIGNvbnN0OworCisgICAgcHJvdGVjdGVkOgorICAgICAgICBBc3NlcnRpb25JbmZvIG1faW5mbzsKKyAgICAgICAgQXNzZXJ0aW9uUmVzdWx0RGF0YSBtX3Jlc3VsdERhdGE7CisgICAgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9tYXRjaGVycy5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX01BVENIRVJTX0hQUF9JTkNMVURFRAorCituYW1lc3BhY2UgQ2F0Y2ggeworbmFtZXNwYWNlIE1hdGNoZXJzIHsKKyAgICBuYW1lc3BhY2UgSW1wbCB7CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQXJnVD4gc3RydWN0IE1hdGNoQWxsT2Y7CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEFyZ1Q+IHN0cnVjdCBNYXRjaEFueU9mOworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBBcmdUPiBzdHJ1Y3QgTWF0Y2hOb3RPZjsKKworICAgICAgICBjbGFzcyBNYXRjaGVyVW50eXBlZEJhc2UgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBzdGQ6OnN0cmluZyB0b1N0cmluZygpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICBpZiggbV9jYWNoZWRUb1N0cmluZy5lbXB0eSgpICkKKyAgICAgICAgICAgICAgICAgICAgbV9jYWNoZWRUb1N0cmluZyA9IGRlc2NyaWJlKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1fY2FjaGVkVG9TdHJpbmc7CisgICAgICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkOgorICAgICAgICAgICAgdmlydHVhbCB+TWF0Y2hlclVudHlwZWRCYXNlKCk7CisgICAgICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGRlc2NyaWJlKCkgY29uc3QgPSAwOworICAgICAgICAgICAgbXV0YWJsZSBzdGQ6OnN0cmluZyBtX2NhY2hlZFRvU3RyaW5nOworICAgICAgICBwcml2YXRlOgorICAgICAgICAgICAgTWF0Y2hlclVudHlwZWRCYXNlJiBvcGVyYXRvciA9ICggTWF0Y2hlclVudHlwZWRCYXNlIGNvbnN0JiApOworICAgICAgICB9OworCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIE9iamVjdFQ+CisgICAgICAgIHN0cnVjdCBNYXRjaGVyTWV0aG9kIHsKKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBtYXRjaCggT2JqZWN0VCBjb25zdCYgYXJnICkgY29uc3QgPSAwOworICAgICAgICB9OworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBQdHJUPgorICAgICAgICBzdHJ1Y3QgTWF0Y2hlck1ldGhvZDxQdHJUKj4geworICAgICAgICAgICAgdmlydHVhbCBib29sIG1hdGNoKCBQdHJUKiBhcmcgKSBjb25zdCA9IDA7CisgICAgICAgIH07CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgT2JqZWN0VCwgdHlwZW5hbWUgQ29tcGFyYXRvclQgPSBPYmplY3RUPgorICAgICAgICBzdHJ1Y3QgTWF0Y2hlckJhc2UgOiBNYXRjaGVyVW50eXBlZEJhc2UsIE1hdGNoZXJNZXRob2Q8T2JqZWN0VD4geworCisgICAgICAgICAgICBNYXRjaEFsbE9mPENvbXBhcmF0b3JUPiBvcGVyYXRvciAmJiAoIE1hdGNoZXJCYXNlIGNvbnN0JiBvdGhlciApIGNvbnN0OworICAgICAgICAgICAgTWF0Y2hBbnlPZjxDb21wYXJhdG9yVD4gb3BlcmF0b3IgfHwgKCBNYXRjaGVyQmFzZSBjb25zdCYgb3RoZXIgKSBjb25zdDsKKyAgICAgICAgICAgIE1hdGNoTm90T2Y8Q29tcGFyYXRvclQ+IG9wZXJhdG9yICEgKCkgY29uc3Q7CisgICAgICAgIH07CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQXJnVD4KKyAgICAgICAgc3RydWN0IE1hdGNoQWxsT2YgOiBNYXRjaGVyQmFzZTxBcmdUPiB7CisgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgbWF0Y2goIEFyZ1QgY29uc3QmIGFyZyApIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgICAgICBmb3IoIHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgbV9tYXRjaGVycy5zaXplKCk7ICsraSApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFtX21hdGNoZXJzW2ldLT5tYXRjaChhcmcpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZGVzY3JpYmUoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZGVzY3JpcHRpb247CisgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24ucmVzZXJ2ZSggNCArIG1fbWF0Y2hlcnMuc2l6ZSgpKjMyICk7CisgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gKz0gIiggIjsKKyAgICAgICAgICAgICAgICBmb3IoIHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgbV9tYXRjaGVycy5zaXplKCk7ICsraSApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIGkgIT0gMCApCisgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiArPSAiIGFuZCAiOworICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiArPSBtX21hdGNoZXJzW2ldLT50b1N0cmluZygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiArPSAiICkiOworICAgICAgICAgICAgICAgIHJldHVybiBkZXNjcmlwdGlvbjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTWF0Y2hBbGxPZjxBcmdUPiYgb3BlcmF0b3IgJiYgKCBNYXRjaGVyQmFzZTxBcmdUPiBjb25zdCYgb3RoZXIgKSB7CisgICAgICAgICAgICAgICAgbV9tYXRjaGVycy5wdXNoX2JhY2soICZvdGhlciApOworICAgICAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8TWF0Y2hlckJhc2U8QXJnVD4gY29uc3QqPiBtX21hdGNoZXJzOworICAgICAgICB9OworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBBcmdUPgorICAgICAgICBzdHJ1Y3QgTWF0Y2hBbnlPZiA6IE1hdGNoZXJCYXNlPEFyZ1Q+IHsKKworICAgICAgICAgICAgdmlydHVhbCBib29sIG1hdGNoKCBBcmdUIGNvbnN0JiBhcmcgKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgZm9yKCBzdGQ6OnNpemVfdCBpID0gMDsgaSA8IG1fbWF0Y2hlcnMuc2l6ZSgpOyArK2kgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtX21hdGNoZXJzW2ldLT5tYXRjaChhcmcpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZGVzY3JpYmUoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZGVzY3JpcHRpb247CisgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24ucmVzZXJ2ZSggNCArIG1fbWF0Y2hlcnMuc2l6ZSgpKjMyICk7CisgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gKz0gIiggIjsKKyAgICAgICAgICAgICAgICBmb3IoIHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgbV9tYXRjaGVycy5zaXplKCk7ICsraSApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIGkgIT0gMCApCisgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiArPSAiIG9yICI7CisgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICs9IG1fbWF0Y2hlcnNbaV0tPnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICs9ICIgKSI7CisgICAgICAgICAgICAgICAgcmV0dXJuIGRlc2NyaXB0aW9uOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBNYXRjaEFueU9mPEFyZ1Q+JiBvcGVyYXRvciB8fCAoIE1hdGNoZXJCYXNlPEFyZ1Q+IGNvbnN0JiBvdGhlciApIHsKKyAgICAgICAgICAgICAgICBtX21hdGNoZXJzLnB1c2hfYmFjayggJm90aGVyICk7CisgICAgICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxNYXRjaGVyQmFzZTxBcmdUPiBjb25zdCo+IG1fbWF0Y2hlcnM7CisgICAgICAgIH07CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQXJnVD4KKyAgICAgICAgc3RydWN0IE1hdGNoTm90T2YgOiBNYXRjaGVyQmFzZTxBcmdUPiB7CisKKyAgICAgICAgICAgIE1hdGNoTm90T2YoIE1hdGNoZXJCYXNlPEFyZ1Q+IGNvbnN0JiB1bmRlcmx5aW5nTWF0Y2hlciApIDogbV91bmRlcmx5aW5nTWF0Y2hlciggdW5kZXJseWluZ01hdGNoZXIgKSB7fQorCisgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgbWF0Y2goIEFyZ1QgY29uc3QmIGFyZyApIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIW1fdW5kZXJseWluZ01hdGNoZXIubWF0Y2goIGFyZyApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGRlc2NyaWJlKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgIHJldHVybiAibm90ICIgKyBtX3VuZGVybHlpbmdNYXRjaGVyLnRvU3RyaW5nKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBNYXRjaGVyQmFzZTxBcmdUPiBjb25zdCYgbV91bmRlcmx5aW5nTWF0Y2hlcjsKKyAgICAgICAgfTsKKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPYmplY3RULCB0eXBlbmFtZSBDb21wYXJhdG9yVD4KKyAgICAgICAgTWF0Y2hBbGxPZjxDb21wYXJhdG9yVD4gTWF0Y2hlckJhc2U8T2JqZWN0VCwgQ29tcGFyYXRvclQ+OjpvcGVyYXRvciAmJiAoIE1hdGNoZXJCYXNlIGNvbnN0JiBvdGhlciApIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBNYXRjaEFsbE9mPENvbXBhcmF0b3JUPigpICYmICp0aGlzICYmIG90aGVyOworICAgICAgICB9CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIE9iamVjdFQsIHR5cGVuYW1lIENvbXBhcmF0b3JUPgorICAgICAgICBNYXRjaEFueU9mPENvbXBhcmF0b3JUPiBNYXRjaGVyQmFzZTxPYmplY3RULCBDb21wYXJhdG9yVD46Om9wZXJhdG9yIHx8ICggTWF0Y2hlckJhc2UgY29uc3QmIG90aGVyICkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIE1hdGNoQW55T2Y8Q29tcGFyYXRvclQ+KCkgfHwgKnRoaXMgfHwgb3RoZXI7CisgICAgICAgIH0KKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgT2JqZWN0VCwgdHlwZW5hbWUgQ29tcGFyYXRvclQ+CisgICAgICAgIE1hdGNoTm90T2Y8Q29tcGFyYXRvclQ+IE1hdGNoZXJCYXNlPE9iamVjdFQsIENvbXBhcmF0b3JUPjo6b3BlcmF0b3IgISAoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gTWF0Y2hOb3RPZjxDb21wYXJhdG9yVD4oICp0aGlzICk7CisgICAgICAgIH0KKworICAgIH0gLy8gbmFtZXNwYWNlIEltcGwKKworICAgIC8vIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGNyZWF0ZSB0aGUgYWN0dWFsIG1hdGNoZXIgb2JqZWN0cy4KKyAgICAvLyBUaGlzIGFsbG93cyB0aGUgdHlwZXMgdG8gYmUgaW5mZXJyZWQKKyAgICAvLyAtIGRlcHJlY2F0ZWQ6IHByZWZlciB8fCwgJiYgYW5kICEKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGlubGluZSBJbXBsOjpNYXRjaE5vdE9mPFQ+IE5vdCggSW1wbDo6TWF0Y2hlckJhc2U8VD4gY29uc3QmIHVuZGVybHlpbmdNYXRjaGVyICkgeworICAgICAgICByZXR1cm4gSW1wbDo6TWF0Y2hOb3RPZjxUPiggdW5kZXJseWluZ01hdGNoZXIgKTsKKyAgICB9CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBpbmxpbmUgSW1wbDo6TWF0Y2hBbGxPZjxUPiBBbGxPZiggSW1wbDo6TWF0Y2hlckJhc2U8VD4gY29uc3QmIG0xLCBJbXBsOjpNYXRjaGVyQmFzZTxUPiBjb25zdCYgbTIgKSB7CisgICAgICAgIHJldHVybiBJbXBsOjpNYXRjaEFsbE9mPFQ+KCkgJiYgbTEgJiYgbTI7CisgICAgfQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgaW5saW5lIEltcGw6Ok1hdGNoQWxsT2Y8VD4gQWxsT2YoIEltcGw6Ok1hdGNoZXJCYXNlPFQ+IGNvbnN0JiBtMSwgSW1wbDo6TWF0Y2hlckJhc2U8VD4gY29uc3QmIG0yLCBJbXBsOjpNYXRjaGVyQmFzZTxUPiBjb25zdCYgbTMgKSB7CisgICAgICAgIHJldHVybiBJbXBsOjpNYXRjaEFsbE9mPFQ+KCkgJiYgbTEgJiYgbTIgJiYgbTM7CisgICAgfQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgaW5saW5lIEltcGw6Ok1hdGNoQW55T2Y8VD4gQW55T2YoIEltcGw6Ok1hdGNoZXJCYXNlPFQ+IGNvbnN0JiBtMSwgSW1wbDo6TWF0Y2hlckJhc2U8VD4gY29uc3QmIG0yICkgeworICAgICAgICByZXR1cm4gSW1wbDo6TWF0Y2hBbnlPZjxUPigpIHx8IG0xIHx8IG0yOworICAgIH0KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGlubGluZSBJbXBsOjpNYXRjaEFueU9mPFQ+IEFueU9mKCBJbXBsOjpNYXRjaGVyQmFzZTxUPiBjb25zdCYgbTEsIEltcGw6Ok1hdGNoZXJCYXNlPFQ+IGNvbnN0JiBtMiwgSW1wbDo6TWF0Y2hlckJhc2U8VD4gY29uc3QmIG0zICkgeworICAgICAgICByZXR1cm4gSW1wbDo6TWF0Y2hBbnlPZjxUPigpIHx8IG0xIHx8IG0yIHx8IG0zOworICAgIH0KKworfSAvLyBuYW1lc3BhY2UgTWF0Y2hlcnMKKwordXNpbmcgbmFtZXNwYWNlIE1hdGNoZXJzOwordXNpbmcgTWF0Y2hlcnM6OkltcGw6Ok1hdGNoZXJCYXNlOworCit9IC8vIG5hbWVzcGFjZSBDYXRjaAorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgc3RydWN0IFRlc3RGYWlsdXJlRXhjZXB0aW9ue307CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjbGFzcyBFeHByZXNzaW9uTGhzOworCisgICAgc3RydWN0IENvcHlhYmxlU3RyZWFtIHsKKyAgICAgICAgQ29weWFibGVTdHJlYW0oKSB7fQorICAgICAgICBDb3B5YWJsZVN0cmVhbSggQ29weWFibGVTdHJlYW0gY29uc3QmIG90aGVyICkgeworICAgICAgICAgICAgb3NzIDw8IG90aGVyLm9zcy5zdHIoKTsKKyAgICAgICAgfQorICAgICAgICBDb3B5YWJsZVN0cmVhbSYgb3BlcmF0b3I9KCBDb3B5YWJsZVN0cmVhbSBjb25zdCYgb3RoZXIgKSB7CisgICAgICAgICAgICBvc3Muc3RyKHN0ZDo6c3RyaW5nKCkpOworICAgICAgICAgICAgb3NzIDw8IG90aGVyLm9zcy5zdHIoKTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICAgIH07CisKKyAgICBjbGFzcyBSZXN1bHRCdWlsZGVyIDogcHVibGljIERlY29tcG9zZWRFeHByZXNzaW9uIHsKKyAgICBwdWJsaWM6CisgICAgICAgIFJlc3VsdEJ1aWxkZXIoICBjaGFyIGNvbnN0KiBtYWNyb05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMaW5lSW5mbyBjb25zdCYgbGluZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGNvbnN0KiBjYXB0dXJlZEV4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICBSZXN1bHREaXNwb3NpdGlvbjo6RmxhZ3MgcmVzdWx0RGlzcG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGNvbnN0KiBzZWNvbmRBcmcgPSAiIiApOworICAgICAgICB+UmVzdWx0QnVpbGRlcigpOworCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgICAgIEV4cHJlc3Npb25MaHM8VCBjb25zdCY+IG9wZXJhdG9yIDw9ICggVCBjb25zdCYgb3BlcmFuZCApOworICAgICAgICBFeHByZXNzaW9uTGhzPGJvb2w+IG9wZXJhdG9yIDw9ICggYm9vbCB2YWx1ZSApOworCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgICAgIFJlc3VsdEJ1aWxkZXImIG9wZXJhdG9yIDw8ICggVCBjb25zdCYgdmFsdWUgKSB7CisgICAgICAgICAgICBtX3N0cmVhbS5vc3MgPDwgdmFsdWU7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICBSZXN1bHRCdWlsZGVyJiBzZXRSZXN1bHRUeXBlKCBSZXN1bHRXYXM6Ok9mVHlwZSByZXN1bHQgKTsKKyAgICAgICAgUmVzdWx0QnVpbGRlciYgc2V0UmVzdWx0VHlwZSggYm9vbCByZXN1bHQgKTsKKworICAgICAgICB2b2lkIGVuZEV4cHJlc3Npb24oIERlY29tcG9zZWRFeHByZXNzaW9uIGNvbnN0JiBleHByICk7CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHJlY29uc3RydWN0RXhwcmVzc2lvbiggc3RkOjpzdHJpbmcmIGRlc3QgKSBjb25zdCBDQVRDSF9PVkVSUklERTsKKworICAgICAgICBBc3NlcnRpb25SZXN1bHQgYnVpbGQoKSBjb25zdDsKKyAgICAgICAgQXNzZXJ0aW9uUmVzdWx0IGJ1aWxkKCBEZWNvbXBvc2VkRXhwcmVzc2lvbiBjb25zdCYgZXhwciApIGNvbnN0OworCisgICAgICAgIHZvaWQgdXNlQWN0aXZlRXhjZXB0aW9uKCBSZXN1bHREaXNwb3NpdGlvbjo6RmxhZ3MgcmVzdWx0RGlzcG9zaXRpb24gPSBSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsICk7CisgICAgICAgIHZvaWQgY2FwdHVyZVJlc3VsdCggUmVzdWx0V2FzOjpPZlR5cGUgcmVzdWx0VHlwZSApOworICAgICAgICB2b2lkIGNhcHR1cmVFeHByZXNzaW9uKCk7CisgICAgICAgIHZvaWQgY2FwdHVyZUV4cGVjdGVkRXhjZXB0aW9uKCBzdGQ6OnN0cmluZyBjb25zdCYgZXhwZWN0ZWRNZXNzYWdlICk7CisgICAgICAgIHZvaWQgY2FwdHVyZUV4cGVjdGVkRXhjZXB0aW9uKCBNYXRjaGVyczo6SW1wbDo6TWF0Y2hlckJhc2U8c3RkOjpzdHJpbmc+IGNvbnN0JiBtYXRjaGVyICk7CisgICAgICAgIHZvaWQgaGFuZGxlUmVzdWx0KCBBc3NlcnRpb25SZXN1bHQgY29uc3QmIHJlc3VsdCApOworICAgICAgICB2b2lkIHJlYWN0KCk7CisgICAgICAgIGJvb2wgc2hvdWxkRGVidWdCcmVhaygpIGNvbnN0OworICAgICAgICBib29sIGFsbG93VGhyb3dzKCkgY29uc3Q7CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQXJnVCwgdHlwZW5hbWUgTWF0Y2hlclQ+CisgICAgICAgIHZvaWQgY2FwdHVyZU1hdGNoKCBBcmdUIGNvbnN0JiBhcmcsIE1hdGNoZXJUIGNvbnN0JiBtYXRjaGVyLCBjaGFyIGNvbnN0KiBtYXRjaGVyU3RyaW5nICk7CisKKyAgICAgICAgdm9pZCBzZXRFeGNlcHRpb25HdWFyZCgpOworICAgICAgICB2b2lkIHVuc2V0RXhjZXB0aW9uR3VhcmQoKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIEFzc2VydGlvbkluZm8gbV9hc3NlcnRpb25JbmZvOworICAgICAgICBBc3NlcnRpb25SZXN1bHREYXRhIG1fZGF0YTsKKyAgICAgICAgQ29weWFibGVTdHJlYW0gbV9zdHJlYW07CisKKyAgICAgICAgYm9vbCBtX3Nob3VsZERlYnVnQnJlYWs7CisgICAgICAgIGJvb2wgbV9zaG91bGRUaHJvdzsKKyAgICAgICAgYm9vbCBtX2d1YXJkRXhjZXB0aW9uOworICAgIH07CisKK30gLy8gbmFtZXNwYWNlIENhdGNoCisKKy8vIEluY2x1ZGUgYWZ0ZXIgZHVlIHRvIGNpcmN1bGFyIGRlcGVuZGVuY3k6CisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfZXhwcmVzc2lvbl9saHMuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9FWFBSRVNTSU9OX0xIU19IUFBfSU5DTFVERUQKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX2V2YWx1YXRlLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfRVZBTFVBVEVfSFBQX0lOQ0xVREVECisKKyNpZmRlZiBfTVNDX1ZFUgorI3ByYWdtYSB3YXJuaW5nKHB1c2gpCisjcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTo0Mzg5KSAvLyAnPT0nIDogc2lnbmVkL3Vuc2lnbmVkIG1pc21hdGNoCisjcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTo0MzEyKSAvLyBDb252ZXJ0aW5nIGludCB0byBUKiB1c2luZyByZWludGVycHJldF9jYXN0IChpc3N1ZSBvbiB4NjQgcGxhdGZvcm0pCisjZW5kaWYKKworI2luY2x1ZGUgPGNzdGRkZWY+CisKK25hbWVzcGFjZSBDYXRjaCB7CituYW1lc3BhY2UgSW50ZXJuYWwgeworCisgICAgZW51bSBPcGVyYXRvciB7CisgICAgICAgIElzRXF1YWxUbywKKyAgICAgICAgSXNOb3RFcXVhbFRvLAorICAgICAgICBJc0xlc3NUaGFuLAorICAgICAgICBJc0dyZWF0ZXJUaGFuLAorICAgICAgICBJc0xlc3NUaGFuT3JFcXVhbFRvLAorICAgICAgICBJc0dyZWF0ZXJUaGFuT3JFcXVhbFRvCisgICAgfTsKKworICAgIHRlbXBsYXRlPE9wZXJhdG9yIE9wPiBzdHJ1Y3QgT3BlcmF0b3JUcmFpdHMgICAgICAgICAgICAgeyBzdGF0aWMgY29uc3QgY2hhciogZ2V0TmFtZSgpeyByZXR1cm4gIiplcnJvcioiOyB9IH07CisgICAgdGVtcGxhdGU8PiBzdHJ1Y3QgT3BlcmF0b3JUcmFpdHM8SXNFcXVhbFRvPiAgICAgICAgICAgICB7IHN0YXRpYyBjb25zdCBjaGFyKiBnZXROYW1lKCl7IHJldHVybiAiPT0iOyB9IH07CisgICAgdGVtcGxhdGU8PiBzdHJ1Y3QgT3BlcmF0b3JUcmFpdHM8SXNOb3RFcXVhbFRvPiAgICAgICAgICB7IHN0YXRpYyBjb25zdCBjaGFyKiBnZXROYW1lKCl7IHJldHVybiAiIT0iOyB9IH07CisgICAgdGVtcGxhdGU8PiBzdHJ1Y3QgT3BlcmF0b3JUcmFpdHM8SXNMZXNzVGhhbj4gICAgICAgICAgICB7IHN0YXRpYyBjb25zdCBjaGFyKiBnZXROYW1lKCl7IHJldHVybiAiPCI7IH0gfTsKKyAgICB0ZW1wbGF0ZTw+IHN0cnVjdCBPcGVyYXRvclRyYWl0czxJc0dyZWF0ZXJUaGFuPiAgICAgICAgIHsgc3RhdGljIGNvbnN0IGNoYXIqIGdldE5hbWUoKXsgcmV0dXJuICI+IjsgfSB9OworICAgIHRlbXBsYXRlPD4gc3RydWN0IE9wZXJhdG9yVHJhaXRzPElzTGVzc1RoYW5PckVxdWFsVG8+ICAgeyBzdGF0aWMgY29uc3QgY2hhciogZ2V0TmFtZSgpeyByZXR1cm4gIjw9IjsgfSB9OworICAgIHRlbXBsYXRlPD4gc3RydWN0IE9wZXJhdG9yVHJhaXRzPElzR3JlYXRlclRoYW5PckVxdWFsVG8+eyBzdGF0aWMgY29uc3QgY2hhciogZ2V0TmFtZSgpeyByZXR1cm4gIj49IjsgfSB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBpbmxpbmUgVCYgb3BDYXN0KFQgY29uc3QmIHQpIHsgcmV0dXJuIGNvbnN0X2Nhc3Q8VCY+KHQpOyB9CisKKy8vIG51bGxwdHJfdCBzdXBwb3J0IGJhc2VkIG9uIHB1bGwgcmVxdWVzdCAjMTU0IGZyb20gS29uc3RhbnRpbiBCYXVtYW5uCisjaWZkZWYgQ0FUQ0hfQ09ORklHX0NQUDExX05VTExQVFIKKyAgICBpbmxpbmUgc3RkOjpudWxscHRyX3Qgb3BDYXN0KHN0ZDo6bnVsbHB0cl90KSB7IHJldHVybiBudWxscHRyOyB9CisjZW5kaWYgLy8gQ0FUQ0hfQ09ORklHX0NQUDExX05VTExQVFIKKworICAgIC8vIFNvIHRoZSBjb21wYXJlIG92ZXJsb2FkcyBjYW4gYmUgb3BlcmF0b3IgYWdub3N0aWMgd2UgY29udmV5IHRoZSBvcGVyYXRvciBhcyBhIHRlbXBsYXRlCisgICAgLy8gZW51bSwgd2hpY2ggaXMgdXNlZCB0byBzcGVjaWFsaXNlIGFuIEV2YWx1YXRvciBmb3IgZG9pbmcgdGhlIGNvbXBhcmlzb24uCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCBPcGVyYXRvciBPcD4KKyAgICBjbGFzcyBFdmFsdWF0b3J7fTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KKyAgICBzdHJ1Y3QgRXZhbHVhdG9yPFQxLCBUMiwgSXNFcXVhbFRvPiB7CisgICAgICAgIHN0YXRpYyBib29sIGV2YWx1YXRlKCBUMSBjb25zdCYgbGhzLCBUMiBjb25zdCYgcmhzKSB7CisgICAgICAgICAgICByZXR1cm4gYm9vbCggb3BDYXN0KCBsaHMgKSA9PSAgb3BDYXN0KCByaHMgKSApOworICAgICAgICB9CisgICAgfTsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CisgICAgc3RydWN0IEV2YWx1YXRvcjxUMSwgVDIsIElzTm90RXF1YWxUbz4geworICAgICAgICBzdGF0aWMgYm9vbCBldmFsdWF0ZSggVDEgY29uc3QmIGxocywgVDIgY29uc3QmIHJocyApIHsKKyAgICAgICAgICAgIHJldHVybiBib29sKCBvcENhc3QoIGxocyApICE9IG9wQ2FzdCggcmhzICkgKTsKKyAgICAgICAgfQorICAgIH07CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorICAgIHN0cnVjdCBFdmFsdWF0b3I8VDEsIFQyLCBJc0xlc3NUaGFuPiB7CisgICAgICAgIHN0YXRpYyBib29sIGV2YWx1YXRlKCBUMSBjb25zdCYgbGhzLCBUMiBjb25zdCYgcmhzICkgeworICAgICAgICAgICAgcmV0dXJuIGJvb2woIG9wQ2FzdCggbGhzICkgPCBvcENhc3QoIHJocyApICk7CisgICAgICAgIH0KKyAgICB9OworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KKyAgICBzdHJ1Y3QgRXZhbHVhdG9yPFQxLCBUMiwgSXNHcmVhdGVyVGhhbj4geworICAgICAgICBzdGF0aWMgYm9vbCBldmFsdWF0ZSggVDEgY29uc3QmIGxocywgVDIgY29uc3QmIHJocyApIHsKKyAgICAgICAgICAgIHJldHVybiBib29sKCBvcENhc3QoIGxocyApID4gb3BDYXN0KCByaHMgKSApOworICAgICAgICB9CisgICAgfTsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CisgICAgc3RydWN0IEV2YWx1YXRvcjxUMSwgVDIsIElzR3JlYXRlclRoYW5PckVxdWFsVG8+IHsKKyAgICAgICAgc3RhdGljIGJvb2wgZXZhbHVhdGUoIFQxIGNvbnN0JiBsaHMsIFQyIGNvbnN0JiByaHMgKSB7CisgICAgICAgICAgICByZXR1cm4gYm9vbCggb3BDYXN0KCBsaHMgKSA+PSBvcENhc3QoIHJocyApICk7CisgICAgICAgIH0KKyAgICB9OworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KKyAgICBzdHJ1Y3QgRXZhbHVhdG9yPFQxLCBUMiwgSXNMZXNzVGhhbk9yRXF1YWxUbz4geworICAgICAgICBzdGF0aWMgYm9vbCBldmFsdWF0ZSggVDEgY29uc3QmIGxocywgVDIgY29uc3QmIHJocyApIHsKKyAgICAgICAgICAgIHJldHVybiBib29sKCBvcENhc3QoIGxocyApIDw9IG9wQ2FzdCggcmhzICkgKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcCwgdHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorICAgIGJvb2wgYXBwbHlFdmFsdWF0b3IoIFQxIGNvbnN0JiBsaHMsIFQyIGNvbnN0JiByaHMgKSB7CisgICAgICAgIHJldHVybiBFdmFsdWF0b3I8VDEsIFQyLCBPcD46OmV2YWx1YXRlKCBsaHMsIHJocyApOworICAgIH0KKworICAgIC8vIFRoaXMgbGV2ZWwgb2YgaW5kaXJlY3Rpb24gYWxsb3dzIHVzIHRvIHNwZWNpYWxpc2UgZm9yIGludGVnZXIgdHlwZXMKKyAgICAvLyB0byBhdm9pZCBzaWduZWQvIHVuc2lnbmVkIHdhcm5pbmdzCisKKyAgICAvLyAiYmFzZSIgb3ZlcmxvYWQKKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcCwgdHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorICAgIGJvb2wgY29tcGFyZSggVDEgY29uc3QmIGxocywgVDIgY29uc3QmIHJocyApIHsKKyAgICAgICAgcmV0dXJuIEV2YWx1YXRvcjxUMSwgVDIsIE9wPjo6ZXZhbHVhdGUoIGxocywgcmhzICk7CisgICAgfQorCisgICAgLy8gdW5zaWduZWQgWCB0byBpbnQKKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcD4gYm9vbCBjb21wYXJlKCB1bnNpZ25lZCBpbnQgbGhzLCBpbnQgcmhzICkgeworICAgICAgICByZXR1cm4gYXBwbHlFdmFsdWF0b3I8T3A+KCBsaHMsIHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oIHJocyApICk7CisgICAgfQorICAgIHRlbXBsYXRlPE9wZXJhdG9yIE9wPiBib29sIGNvbXBhcmUoIHVuc2lnbmVkIGxvbmcgbGhzLCBpbnQgcmhzICkgeworICAgICAgICByZXR1cm4gYXBwbHlFdmFsdWF0b3I8T3A+KCBsaHMsIHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oIHJocyApICk7CisgICAgfQorICAgIHRlbXBsYXRlPE9wZXJhdG9yIE9wPiBib29sIGNvbXBhcmUoIHVuc2lnbmVkIGNoYXIgbGhzLCBpbnQgcmhzICkgeworICAgICAgICByZXR1cm4gYXBwbHlFdmFsdWF0b3I8T3A+KCBsaHMsIHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oIHJocyApICk7CisgICAgfQorCisgICAgLy8gdW5zaWduZWQgWCB0byBsb25nCisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3A+IGJvb2wgY29tcGFyZSggdW5zaWduZWQgaW50IGxocywgbG9uZyByaHMgKSB7CisgICAgICAgIHJldHVybiBhcHBseUV2YWx1YXRvcjxPcD4oIGxocywgc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4oIHJocyApICk7CisgICAgfQorICAgIHRlbXBsYXRlPE9wZXJhdG9yIE9wPiBib29sIGNvbXBhcmUoIHVuc2lnbmVkIGxvbmcgbGhzLCBsb25nIHJocyApIHsKKyAgICAgICAgcmV0dXJuIGFwcGx5RXZhbHVhdG9yPE9wPiggbGhzLCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPiggcmhzICkgKTsKKyAgICB9CisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3A+IGJvb2wgY29tcGFyZSggdW5zaWduZWQgY2hhciBsaHMsIGxvbmcgcmhzICkgeworICAgICAgICByZXR1cm4gYXBwbHlFdmFsdWF0b3I8T3A+KCBsaHMsIHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KCByaHMgKSApOworICAgIH0KKworICAgIC8vIGludCB0byB1bnNpZ25lZCBYCisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3A+IGJvb2wgY29tcGFyZSggaW50IGxocywgdW5zaWduZWQgaW50IHJocyApIHsKKyAgICAgICAgcmV0dXJuIGFwcGx5RXZhbHVhdG9yPE9wPiggc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PiggbGhzICksIHJocyApOworICAgIH0KKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcD4gYm9vbCBjb21wYXJlKCBpbnQgbGhzLCB1bnNpZ25lZCBsb25nIHJocyApIHsKKyAgICAgICAgcmV0dXJuIGFwcGx5RXZhbHVhdG9yPE9wPiggc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PiggbGhzICksIHJocyApOworICAgIH0KKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcD4gYm9vbCBjb21wYXJlKCBpbnQgbGhzLCB1bnNpZ25lZCBjaGFyIHJocyApIHsKKyAgICAgICAgcmV0dXJuIGFwcGx5RXZhbHVhdG9yPE9wPiggc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PiggbGhzICksIHJocyApOworICAgIH0KKworICAgIC8vIGxvbmcgdG8gdW5zaWduZWQgWAorICAgIHRlbXBsYXRlPE9wZXJhdG9yIE9wPiBib29sIGNvbXBhcmUoIGxvbmcgbGhzLCB1bnNpZ25lZCBpbnQgcmhzICkgeworICAgICAgICByZXR1cm4gYXBwbHlFdmFsdWF0b3I8T3A+KCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPiggbGhzICksIHJocyApOworICAgIH0KKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcD4gYm9vbCBjb21wYXJlKCBsb25nIGxocywgdW5zaWduZWQgbG9uZyByaHMgKSB7CisgICAgICAgIHJldHVybiBhcHBseUV2YWx1YXRvcjxPcD4oIHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KCBsaHMgKSwgcmhzICk7CisgICAgfQorICAgIHRlbXBsYXRlPE9wZXJhdG9yIE9wPiBib29sIGNvbXBhcmUoIGxvbmcgbGhzLCB1bnNpZ25lZCBjaGFyIHJocyApIHsKKyAgICAgICAgcmV0dXJuIGFwcGx5RXZhbHVhdG9yPE9wPiggc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4oIGxocyApLCByaHMgKTsKKyAgICB9CisKKyAgICAvLyBwb2ludGVyIHRvIGxvbmcgKHdoZW4gY29tcGFyaW5nIGFnYWluc3QgTlVMTCkKKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcCwgdHlwZW5hbWUgVD4gYm9vbCBjb21wYXJlKCBsb25nIGxocywgVCogcmhzICkgeworICAgICAgICByZXR1cm4gRXZhbHVhdG9yPFQqLCBUKiwgT3A+OjpldmFsdWF0ZSggcmVpbnRlcnByZXRfY2FzdDxUKj4oIGxocyApLCByaHMgKTsKKyAgICB9CisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3AsIHR5cGVuYW1lIFQ+IGJvb2wgY29tcGFyZSggVCogbGhzLCBsb25nIHJocyApIHsKKyAgICAgICAgcmV0dXJuIEV2YWx1YXRvcjxUKiwgVCosIE9wPjo6ZXZhbHVhdGUoIGxocywgcmVpbnRlcnByZXRfY2FzdDxUKj4oIHJocyApICk7CisgICAgfQorCisgICAgLy8gcG9pbnRlciB0byBpbnQgKHdoZW4gY29tcGFyaW5nIGFnYWluc3QgTlVMTCkKKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcCwgdHlwZW5hbWUgVD4gYm9vbCBjb21wYXJlKCBpbnQgbGhzLCBUKiByaHMgKSB7CisgICAgICAgIHJldHVybiBFdmFsdWF0b3I8VCosIFQqLCBPcD46OmV2YWx1YXRlKCByZWludGVycHJldF9jYXN0PFQqPiggbGhzICksIHJocyApOworICAgIH0KKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcCwgdHlwZW5hbWUgVD4gYm9vbCBjb21wYXJlKCBUKiBsaHMsIGludCByaHMgKSB7CisgICAgICAgIHJldHVybiBFdmFsdWF0b3I8VCosIFQqLCBPcD46OmV2YWx1YXRlKCBsaHMsIHJlaW50ZXJwcmV0X2Nhc3Q8VCo+KCByaHMgKSApOworICAgIH0KKworI2lmZGVmIENBVENIX0NPTkZJR19DUFAxMV9MT05HX0xPTkcKKyAgICAvLyBsb25nIGxvbmcgdG8gdW5zaWduZWQgWAorICAgIHRlbXBsYXRlPE9wZXJhdG9yIE9wPiBib29sIGNvbXBhcmUoIGxvbmcgbG9uZyBsaHMsIHVuc2lnbmVkIGludCByaHMgKSB7CisgICAgICAgIHJldHVybiBhcHBseUV2YWx1YXRvcjxPcD4oIHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KCBsaHMgKSwgcmhzICk7CisgICAgfQorICAgIHRlbXBsYXRlPE9wZXJhdG9yIE9wPiBib29sIGNvbXBhcmUoIGxvbmcgbG9uZyBsaHMsIHVuc2lnbmVkIGxvbmcgcmhzICkgeworICAgICAgICByZXR1cm4gYXBwbHlFdmFsdWF0b3I8T3A+KCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPiggbGhzICksIHJocyApOworICAgIH0KKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcD4gYm9vbCBjb21wYXJlKCBsb25nIGxvbmcgbGhzLCB1bnNpZ25lZCBsb25nIGxvbmcgcmhzICkgeworICAgICAgICByZXR1cm4gYXBwbHlFdmFsdWF0b3I8T3A+KCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPiggbGhzICksIHJocyApOworICAgIH0KKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcD4gYm9vbCBjb21wYXJlKCBsb25nIGxvbmcgbGhzLCB1bnNpZ25lZCBjaGFyIHJocyApIHsKKyAgICAgICAgcmV0dXJuIGFwcGx5RXZhbHVhdG9yPE9wPiggc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4oIGxocyApLCByaHMgKTsKKyAgICB9CisKKyAgICAvLyB1bnNpZ25lZCBsb25nIGxvbmcgdG8gWAorICAgIHRlbXBsYXRlPE9wZXJhdG9yIE9wPiBib29sIGNvbXBhcmUoIHVuc2lnbmVkIGxvbmcgbG9uZyBsaHMsIGludCByaHMgKSB7CisgICAgICAgIHJldHVybiBhcHBseUV2YWx1YXRvcjxPcD4oIHN0YXRpY19jYXN0PGxvbmc+KCBsaHMgKSwgcmhzICk7CisgICAgfQorICAgIHRlbXBsYXRlPE9wZXJhdG9yIE9wPiBib29sIGNvbXBhcmUoIHVuc2lnbmVkIGxvbmcgbG9uZyBsaHMsIGxvbmcgcmhzICkgeworICAgICAgICByZXR1cm4gYXBwbHlFdmFsdWF0b3I8T3A+KCBzdGF0aWNfY2FzdDxsb25nPiggbGhzICksIHJocyApOworICAgIH0KKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcD4gYm9vbCBjb21wYXJlKCB1bnNpZ25lZCBsb25nIGxvbmcgbGhzLCBsb25nIGxvbmcgcmhzICkgeworICAgICAgICByZXR1cm4gYXBwbHlFdmFsdWF0b3I8T3A+KCBzdGF0aWNfY2FzdDxsb25nPiggbGhzICksIHJocyApOworICAgIH0KKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcD4gYm9vbCBjb21wYXJlKCB1bnNpZ25lZCBsb25nIGxvbmcgbGhzLCBjaGFyIHJocyApIHsKKyAgICAgICAgcmV0dXJuIGFwcGx5RXZhbHVhdG9yPE9wPiggc3RhdGljX2Nhc3Q8bG9uZz4oIGxocyApLCByaHMgKTsKKyAgICB9CisKKyAgICAvLyBwb2ludGVyIHRvIGxvbmcgbG9uZyAod2hlbiBjb21wYXJpbmcgYWdhaW5zdCBOVUxMKQorICAgIHRlbXBsYXRlPE9wZXJhdG9yIE9wLCB0eXBlbmFtZSBUPiBib29sIGNvbXBhcmUoIGxvbmcgbG9uZyBsaHMsIFQqIHJocyApIHsKKyAgICAgICAgcmV0dXJuIEV2YWx1YXRvcjxUKiwgVCosIE9wPjo6ZXZhbHVhdGUoIHJlaW50ZXJwcmV0X2Nhc3Q8VCo+KCBsaHMgKSwgcmhzICk7CisgICAgfQorICAgIHRlbXBsYXRlPE9wZXJhdG9yIE9wLCB0eXBlbmFtZSBUPiBib29sIGNvbXBhcmUoIFQqIGxocywgbG9uZyBsb25nIHJocyApIHsKKyAgICAgICAgcmV0dXJuIEV2YWx1YXRvcjxUKiwgVCosIE9wPjo6ZXZhbHVhdGUoIGxocywgcmVpbnRlcnByZXRfY2FzdDxUKj4oIHJocyApICk7CisgICAgfQorI2VuZGlmIC8vIENBVENIX0NPTkZJR19DUFAxMV9MT05HX0xPTkcKKworI2lmZGVmIENBVENIX0NPTkZJR19DUFAxMV9OVUxMUFRSCisgICAgLy8gcG9pbnRlciB0byBudWxscHRyX3QgKHdoZW4gY29tcGFyaW5nIGFnYWluc3QgbnVsbHB0cikKKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcCwgdHlwZW5hbWUgVD4gYm9vbCBjb21wYXJlKCBzdGQ6Om51bGxwdHJfdCwgVCogcmhzICkgeworICAgICAgICByZXR1cm4gRXZhbHVhdG9yPFQqLCBUKiwgT3A+OjpldmFsdWF0ZSggbnVsbHB0ciwgcmhzICk7CisgICAgfQorICAgIHRlbXBsYXRlPE9wZXJhdG9yIE9wLCB0eXBlbmFtZSBUPiBib29sIGNvbXBhcmUoIFQqIGxocywgc3RkOjpudWxscHRyX3QgKSB7CisgICAgICAgIHJldHVybiBFdmFsdWF0b3I8VCosIFQqLCBPcD46OmV2YWx1YXRlKCBsaHMsIG51bGxwdHIgKTsKKyAgICB9CisjZW5kaWYgLy8gQ0FUQ0hfQ09ORklHX0NQUDExX05VTExQVFIKKworfSAvLyBlbmQgb2YgbmFtZXNwYWNlIEludGVybmFsCit9IC8vIGVuZCBvZiBuYW1lc3BhY2UgQ2F0Y2gKKworI2lmZGVmIF9NU0NfVkVSCisjcHJhZ21hIHdhcm5pbmcocG9wKQorI2VuZGlmCisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF90b3N0cmluZy5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9UT1NUUklOR19IX0lOQ0xVREVECisKKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPGlvbWFuaXA+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxjc3RkZGVmPgorCisjaWZkZWYgX19PQkpDX18KKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9vYmpjX2FyYy5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX09CSkNfQVJDX0hQUF9JTkNMVURFRAorCisjaW1wb3J0IDxGb3VuZGF0aW9uL0ZvdW5kYXRpb24uaD4KKworI2lmZGVmIF9faGFzX2ZlYXR1cmUKKyNkZWZpbmUgQ0FUQ0hfQVJDX0VOQUJMRUQgX19oYXNfZmVhdHVyZShvYmpjX2FyYykKKyNlbHNlCisjZGVmaW5lIENBVENIX0FSQ19FTkFCTEVEIDAKKyNlbmRpZgorCit2b2lkIGFyY1NhZmVSZWxlYXNlKCBOU09iamVjdCogb2JqICk7CitpZCBwZXJmb3JtT3B0aW9uYWxTZWxlY3RvciggaWQgb2JqLCBTRUwgc2VsICk7CisKKyNpZiAhQ0FUQ0hfQVJDX0VOQUJMRUQKK2lubGluZSB2b2lkIGFyY1NhZmVSZWxlYXNlKCBOU09iamVjdCogb2JqICkgeworICAgIFtvYmogcmVsZWFzZV07Cit9CitpbmxpbmUgaWQgcGVyZm9ybU9wdGlvbmFsU2VsZWN0b3IoIGlkIG9iaiwgU0VMIHNlbCApIHsKKyAgICBpZiggW29iaiByZXNwb25kc1RvU2VsZWN0b3I6IHNlbF0gKQorICAgICAgICByZXR1cm4gW29iaiBwZXJmb3JtU2VsZWN0b3I6IHNlbF07CisgICAgcmV0dXJuIG5pbDsKK30KKyNkZWZpbmUgQ0FUQ0hfVU5TQUZFX1VOUkVUQUlORUQKKyNkZWZpbmUgQ0FUQ0hfQVJDX1NUUk9ORworI2Vsc2UKK2lubGluZSB2b2lkIGFyY1NhZmVSZWxlYXNlKCBOU09iamVjdCogKXt9CitpbmxpbmUgaWQgcGVyZm9ybU9wdGlvbmFsU2VsZWN0b3IoIGlkIG9iaiwgU0VMIHNlbCApIHsKKyNpZmRlZiBfX2NsYW5nX18KKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwdXNoCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdhcmMtcGVyZm9ybVNlbGVjdG9yLWxlYWtzIgorI2VuZGlmCisgICAgaWYoIFtvYmogcmVzcG9uZHNUb1NlbGVjdG9yOiBzZWxdICkKKyAgICAgICAgcmV0dXJuIFtvYmogcGVyZm9ybVNlbGVjdG9yOiBzZWxdOworI2lmZGVmIF9fY2xhbmdfXworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHBvcAorI2VuZGlmCisgICAgcmV0dXJuIG5pbDsKK30KKyNkZWZpbmUgQ0FUQ0hfVU5TQUZFX1VOUkVUQUlORUQgX191bnNhZmVfdW5yZXRhaW5lZAorI2RlZmluZSBDQVRDSF9BUkNfU1RST05HIF9fc3Ryb25nCisjZW5kaWYKKworI2VuZGlmCisKKyNpZmRlZiBDQVRDSF9DT05GSUdfQ1BQMTFfVFVQTEUKKyNpbmNsdWRlIDx0dXBsZT4KKyNlbmRpZgorCisjaWZkZWYgQ0FUQ0hfQ09ORklHX0NQUDExX0lTX0VOVU0KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKyNlbmRpZgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisvLyBXaHkgd2UncmUgaGVyZS4KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdGQ6OnN0cmluZyB0b1N0cmluZyggVCBjb25zdCYgdmFsdWUgKTsKKworLy8gQnVpbHQgaW4gb3ZlcmxvYWRzCisKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBzdGQ6OnN0cmluZyBjb25zdCYgdmFsdWUgKTsKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBzdGQ6OndzdHJpbmcgY29uc3QmIHZhbHVlICk7CitzdGQ6OnN0cmluZyB0b1N0cmluZyggY29uc3QgY2hhciogY29uc3QgdmFsdWUgKTsKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBjaGFyKiBjb25zdCB2YWx1ZSApOworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIGNvbnN0IHdjaGFyX3QqIGNvbnN0IHZhbHVlICk7CitzdGQ6OnN0cmluZyB0b1N0cmluZyggd2NoYXJfdCogY29uc3QgdmFsdWUgKTsKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBpbnQgdmFsdWUgKTsKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCB1bnNpZ25lZCBsb25nIHZhbHVlICk7CitzdGQ6OnN0cmluZyB0b1N0cmluZyggdW5zaWduZWQgaW50IHZhbHVlICk7CitzdGQ6OnN0cmluZyB0b1N0cmluZyggY29uc3QgZG91YmxlIHZhbHVlICk7CitzdGQ6OnN0cmluZyB0b1N0cmluZyggY29uc3QgZmxvYXQgdmFsdWUgKTsKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBib29sIHZhbHVlICk7CitzdGQ6OnN0cmluZyB0b1N0cmluZyggY2hhciB2YWx1ZSApOworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIHNpZ25lZCBjaGFyIHZhbHVlICk7CitzdGQ6OnN0cmluZyB0b1N0cmluZyggdW5zaWduZWQgY2hhciB2YWx1ZSApOworCisjaWZkZWYgQ0FUQ0hfQ09ORklHX0NQUDExX0xPTkdfTE9ORworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIGxvbmcgbG9uZyB2YWx1ZSApOworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIHVuc2lnbmVkIGxvbmcgbG9uZyB2YWx1ZSApOworI2VuZGlmCisKKyNpZmRlZiBDQVRDSF9DT05GSUdfQ1BQMTFfTlVMTFBUUgorc3RkOjpzdHJpbmcgdG9TdHJpbmcoIHN0ZDo6bnVsbHB0cl90ICk7CisjZW5kaWYKKworI2lmZGVmIF9fT0JKQ19fCisgICAgc3RkOjpzdHJpbmcgdG9TdHJpbmcoIE5TU3RyaW5nIGNvbnN0ICogY29uc3QmIG5zc3RyaW5nICk7CisgICAgc3RkOjpzdHJpbmcgdG9TdHJpbmcoIE5TU3RyaW5nICogQ0FUQ0hfQVJDX1NUUk9ORyBjb25zdCYgbnNzdHJpbmcgKTsKKyAgICBzdGQ6OnN0cmluZyB0b1N0cmluZyggTlNPYmplY3QqIGNvbnN0JiBuc09iamVjdCApOworI2VuZGlmCisKK25hbWVzcGFjZSBEZXRhaWwgeworCisgICAgZXh0ZXJuIGNvbnN0IHN0ZDo6c3RyaW5nIHVucHJpbnRhYmxlU3RyaW5nOworCisgI2lmICFkZWZpbmVkKENBVENIX0NPTkZJR19DUFAxMV9TVFJFQU1fSU5TRVJUQUJMRV9DSEVDSykKKyAgICBzdHJ1Y3QgQm9yZ1R5cGUgeworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBCb3JnVHlwZSggVCBjb25zdCYgKTsKKyAgICB9OworCisgICAgc3RydWN0IFRydWVUeXBlIHsgY2hhciBzaXplclsxXTsgfTsKKyAgICBzdHJ1Y3QgRmFsc2VUeXBlIHsgY2hhciBzaXplclsyXTsgfTsKKworICAgIFRydWVUeXBlJiB0ZXN0U3RyZWFtYWJsZSggc3RkOjpvc3RyZWFtJiApOworICAgIEZhbHNlVHlwZSB0ZXN0U3RyZWFtYWJsZSggRmFsc2VUeXBlICk7CisKKyAgICBGYWxzZVR5cGUgb3BlcmF0b3I8PCggc3RkOjpvc3RyZWFtIGNvbnN0JiwgQm9yZ1R5cGUgY29uc3QmICk7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIHN0cnVjdCBJc1N0cmVhbUluc2VydGFibGUgeworICAgICAgICBzdGF0aWMgc3RkOjpvc3RyZWFtICZzOworICAgICAgICBzdGF0aWMgVCAgY29uc3QmdDsKKyAgICAgICAgZW51bSB7IHZhbHVlID0gc2l6ZW9mKCB0ZXN0U3RyZWFtYWJsZShzIDw8IHQpICkgPT0gc2l6ZW9mKCBUcnVlVHlwZSApIH07CisgICAgfTsKKyNlbHNlCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBjbGFzcyBJc1N0cmVhbUluc2VydGFibGUgeworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBTUywgdHlwZW5hbWUgVFQ+CisgICAgICAgIHN0YXRpYyBhdXRvIHRlc3QoaW50KQorICAgICAgICAtPiBkZWNsdHlwZSggc3RkOjpkZWNsdmFsPFNTJj4oKSA8PCBzdGQ6OmRlY2x2YWw8VFQ+KCksIHN0ZDo6dHJ1ZV90eXBlKCkgKTsKKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSwgdHlwZW5hbWU+CisgICAgICAgIHN0YXRpYyBhdXRvIHRlc3QoLi4uKSAtPiBzdGQ6OmZhbHNlX3R5cGU7CisKKyAgICBwdWJsaWM6CisgICAgICAgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gZGVjbHR5cGUodGVzdDxzdGQ6Om9zdHJlYW0sY29uc3QgVCY+KDApKTo6dmFsdWU7CisgICAgfTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDQVRDSF9DT05GSUdfQ1BQMTFfSVNfRU5VTSkKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULAorICAgICAgICAgICAgIGJvb2wgSXNFbnVtID0gc3RkOjppc19lbnVtPFQ+Ojp2YWx1ZQorICAgICAgICAgICAgID4KKyAgICBzdHJ1Y3QgRW51bVN0cmluZ01ha2VyCisgICAgeworICAgICAgICBzdGF0aWMgc3RkOjpzdHJpbmcgY29udmVydCggVCBjb25zdCYgKSB7IHJldHVybiB1bnByaW50YWJsZVN0cmluZzsgfQorICAgIH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIHN0cnVjdCBFbnVtU3RyaW5nTWFrZXI8VCx0cnVlPgorICAgIHsKKyAgICAgICAgc3RhdGljIHN0ZDo6c3RyaW5nIGNvbnZlcnQoIFQgY29uc3QmIHYgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOjpDYXRjaDo6dG9TdHJpbmcoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dHlwZW5hbWUgc3RkOjp1bmRlcmx5aW5nX3R5cGU8VD46OnR5cGU+KHYpCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgIH07CisjZW5kaWYKKyAgICB0ZW1wbGF0ZTxib29sIEM+CisgICAgc3RydWN0IFN0cmluZ01ha2VyQmFzZSB7CisjaWYgZGVmaW5lZChDQVRDSF9DT05GSUdfQ1BQMTFfSVNfRU5VTSkKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICAgICAgc3RhdGljIHN0ZDo6c3RyaW5nIGNvbnZlcnQoIFQgY29uc3QmIHYgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gRW51bVN0cmluZ01ha2VyPFQ+Ojpjb252ZXJ0KCB2ICk7CisgICAgICAgIH0KKyNlbHNlCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBjb252ZXJ0KCBUIGNvbnN0JiApIHsgcmV0dXJuIHVucHJpbnRhYmxlU3RyaW5nOyB9CisjZW5kaWYKKyAgICB9OworCisgICAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBTdHJpbmdNYWtlckJhc2U8dHJ1ZT4geworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICBzdGF0aWMgc3RkOjpzdHJpbmcgY29udmVydCggVCBjb25zdCYgX3ZhbHVlICkgeworICAgICAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICAgICAgICAgIG9zcyA8PCBfdmFsdWU7CisgICAgICAgICAgICByZXR1cm4gb3NzLnN0cigpOworICAgICAgICB9CisgICAgfTsKKworICAgIHN0ZDo6c3RyaW5nIHJhd01lbW9yeVRvU3RyaW5nKCBjb25zdCB2b2lkICpvYmplY3QsIHN0ZDo6c2l6ZV90IHNpemUgKTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgaW5saW5lIHN0ZDo6c3RyaW5nIHJhd01lbW9yeVRvU3RyaW5nKCBjb25zdCBUJiBvYmplY3QgKSB7CisgICAgICByZXR1cm4gcmF3TWVtb3J5VG9TdHJpbmcoICZvYmplY3QsIHNpemVvZihvYmplY3QpICk7CisgICAgfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRGV0YWlsCisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgU3RyaW5nTWFrZXIgOgorICAgIERldGFpbDo6U3RyaW5nTWFrZXJCYXNlPERldGFpbDo6SXNTdHJlYW1JbnNlcnRhYmxlPFQ+Ojp2YWx1ZT4ge307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgU3RyaW5nTWFrZXI8VCo+IHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVPgorICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBjb252ZXJ0KCBVKiBwICkgeworICAgICAgICBpZiggIXAgKQorICAgICAgICAgICAgcmV0dXJuICJOVUxMIjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIERldGFpbDo6cmF3TWVtb3J5VG9TdHJpbmcoIHAgKTsKKyAgICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBSLCB0eXBlbmFtZSBDPgorc3RydWN0IFN0cmluZ01ha2VyPFIgQzo6Kj4geworICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBjb252ZXJ0KCBSIEM6OiogcCApIHsKKyAgICAgICAgaWYoICFwICkKKyAgICAgICAgICAgIHJldHVybiAiTlVMTCI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBEZXRhaWw6OnJhd01lbW9yeVRvU3RyaW5nKCBwICk7CisgICAgfQorfTsKKworbmFtZXNwYWNlIERldGFpbCB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgSW5wdXRJdGVyYXRvcj4KKyAgICBzdGQ6OnN0cmluZyByYW5nZVRvU3RyaW5nKCBJbnB1dEl0ZXJhdG9yIGZpcnN0LCBJbnB1dEl0ZXJhdG9yIGxhc3QgKTsKK30KKworLy90ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBBbGxvY2F0b3I+CisvL3N0cnVjdCBTdHJpbmdNYWtlcjxzdGQ6OnZlY3RvcjxULCBBbGxvY2F0b3I+ID4geworLy8gICAgc3RhdGljIHN0ZDo6c3RyaW5nIGNvbnZlcnQoIHN0ZDo6dmVjdG9yPFQsQWxsb2NhdG9yPiBjb25zdCYgdiApIHsKKy8vICAgICAgICByZXR1cm4gRGV0YWlsOjpyYW5nZVRvU3RyaW5nKCB2LmJlZ2luKCksIHYuZW5kKCkgKTsKKy8vICAgIH0KKy8vfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgQWxsb2NhdG9yPgorc3RkOjpzdHJpbmcgdG9TdHJpbmcoIHN0ZDo6dmVjdG9yPFQsQWxsb2NhdG9yPiBjb25zdCYgdiApIHsKKyAgICByZXR1cm4gRGV0YWlsOjpyYW5nZVRvU3RyaW5nKCB2LmJlZ2luKCksIHYuZW5kKCkgKTsKK30KKworI2lmZGVmIENBVENIX0NPTkZJR19DUFAxMV9UVVBMRQorCisvLyB0b1N0cmluZyBmb3IgdHVwbGVzCituYW1lc3BhY2UgVHVwbGVEZXRhaWwgeworICB0ZW1wbGF0ZTwKKyAgICAgIHR5cGVuYW1lIFR1cGxlLAorICAgICAgc3RkOjpzaXplX3QgTiA9IDAsCisgICAgICBib29sID0gKE4gPCBzdGQ6OnR1cGxlX3NpemU8VHVwbGU+Ojp2YWx1ZSkKKyAgICAgID4KKyAgc3RydWN0IEVsZW1lbnRQcmludGVyIHsKKyAgICAgIHN0YXRpYyB2b2lkIHByaW50KCBjb25zdCBUdXBsZSYgdHVwbGUsIHN0ZDo6b3N0cmVhbSYgb3MgKQorICAgICAgeworICAgICAgICAgIG9zIDw8ICggTiA/ICIsICIgOiAiICIgKQorICAgICAgICAgICAgIDw8IENhdGNoOjp0b1N0cmluZyhzdGQ6OmdldDxOPih0dXBsZSkpOworICAgICAgICAgIEVsZW1lbnRQcmludGVyPFR1cGxlLE4rMT46OnByaW50KHR1cGxlLG9zKTsKKyAgICAgIH0KKyAgfTsKKworICB0ZW1wbGF0ZTwKKyAgICAgIHR5cGVuYW1lIFR1cGxlLAorICAgICAgc3RkOjpzaXplX3QgTgorICAgICAgPgorICBzdHJ1Y3QgRWxlbWVudFByaW50ZXI8VHVwbGUsTixmYWxzZT4geworICAgICAgc3RhdGljIHZvaWQgcHJpbnQoIGNvbnN0IFR1cGxlJiwgc3RkOjpvc3RyZWFtJiApIHt9CisgIH07CisKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgLi4uVHlwZXM+CitzdHJ1Y3QgU3RyaW5nTWFrZXI8c3RkOjp0dXBsZTxUeXBlcy4uLj4+IHsKKworICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBjb252ZXJ0KCBjb25zdCBzdGQ6OnR1cGxlPFR5cGVzLi4uPiYgdHVwbGUgKQorICAgIHsKKyAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zOworICAgICAgICBvcyA8PCAneyc7CisgICAgICAgIFR1cGxlRGV0YWlsOjpFbGVtZW50UHJpbnRlcjxzdGQ6OnR1cGxlPFR5cGVzLi4uPj46OnByaW50KCB0dXBsZSwgb3MgKTsKKyAgICAgICAgb3MgPDwgIiB9IjsKKyAgICAgICAgcmV0dXJuIG9zLnN0cigpOworICAgIH0KK307CisjZW5kaWYgLy8gQ0FUQ0hfQ09ORklHX0NQUDExX1RVUExFCisKK25hbWVzcGFjZSBEZXRhaWwgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgc3RkOjpzdHJpbmcgbWFrZVN0cmluZyggVCBjb25zdCYgdmFsdWUgKSB7CisgICAgICAgIHJldHVybiBTdHJpbmdNYWtlcjxUPjo6Y29udmVydCggdmFsdWUgKTsKKyAgICB9Cit9IC8vIGVuZCBuYW1lc3BhY2UgRGV0YWlsCisKKy8vLyBcYnJpZWYgY29udmVydHMgYW55IHR5cGUgdG8gYSBzdHJpbmcKKy8vLworLy8vIFRoZSBkZWZhdWx0IHRlbXBsYXRlIGZvcndhcmRzIG9uIHRvIG9zdHJpbmdzdHJlYW0gLSBleGNlcHQgd2hlbiBhbgorLy8vIG9zdHJpbmdzdHJlYW0gb3ZlcmxvYWQgZG9lcyBub3QgZXhpc3QgLSBpbiB3aGljaCBjYXNlIGl0IGF0dGVtcHRzIHRvIGRldGVjdAorLy8vIHRoYXQgYW5kIHdyaXRlcyB7P30uCisvLy8gT3ZlcmxvYWQgKG5vdCBzcGVjaWFsaXNlKSB0aGlzIHRlbXBsYXRlIGZvciBjdXN0b20gdHlwcyB0aGF0IHlvdSBkb24ndCB3YW50CisvLy8gdG8gcHJvdmlkZSBhbiBvc3RyZWFtIG92ZXJsb2FkIGZvci4KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdGQ6OnN0cmluZyB0b1N0cmluZyggVCBjb25zdCYgdmFsdWUgKSB7CisgICAgcmV0dXJuIFN0cmluZ01ha2VyPFQ+Ojpjb252ZXJ0KCB2YWx1ZSApOworfQorCisgICAgbmFtZXNwYWNlIERldGFpbCB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgSW5wdXRJdGVyYXRvcj4KKyAgICBzdGQ6OnN0cmluZyByYW5nZVRvU3RyaW5nKCBJbnB1dEl0ZXJhdG9yIGZpcnN0LCBJbnB1dEl0ZXJhdG9yIGxhc3QgKSB7CisgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisgICAgICAgIG9zcyA8PCAieyAiOworICAgICAgICBpZiggZmlyc3QgIT0gbGFzdCApIHsKKyAgICAgICAgICAgIG9zcyA8PCBDYXRjaDo6dG9TdHJpbmcoICpmaXJzdCApOworICAgICAgICAgICAgZm9yKCArK2ZpcnN0IDsgZmlyc3QgIT0gbGFzdCA7ICsrZmlyc3QgKQorICAgICAgICAgICAgICAgIG9zcyA8PCAiLCAiIDw8IENhdGNoOjp0b1N0cmluZyggKmZpcnN0ICk7CisgICAgICAgIH0KKyAgICAgICAgb3NzIDw8ICIgfSI7CisgICAgICAgIHJldHVybiBvc3Muc3RyKCk7CisgICAgfQorfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworbmFtZXNwYWNlIENhdGNoIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgTGhzVCwgSW50ZXJuYWw6Ok9wZXJhdG9yIE9wLCB0eXBlbmFtZSBSaHNUPgorY2xhc3MgQmluYXJ5RXhwcmVzc2lvbjsKKwordGVtcGxhdGU8dHlwZW5hbWUgQXJnVCwgdHlwZW5hbWUgTWF0Y2hlclQ+CitjbGFzcyBNYXRjaEV4cHJlc3Npb247CisKKy8vIFdyYXBzIHRoZSBMSFMgb2YgYW4gZXhwcmVzc2lvbiBhbmQgb3ZlcmxvYWRzIGNvbXBhcmlzb24gb3BlcmF0b3JzCisvLyBmb3IgYWxzbyBjYXB0dXJpbmcgdGhvc2UgYW5kIFJIUyAoaWYgYW55KQordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NsYXNzIEV4cHJlc3Npb25MaHMgOiBwdWJsaWMgRGVjb21wb3NlZEV4cHJlc3Npb24geworcHVibGljOgorICAgIEV4cHJlc3Npb25MaHMoIFJlc3VsdEJ1aWxkZXImIHJiLCBUIGxocyApIDogbV9yYiggcmIgKSwgbV9saHMoIGxocyApLCBtX3RydXRoeShmYWxzZSkge30KKworICAgIEV4cHJlc3Npb25MaHMmIG9wZXJhdG9yID0gKCBjb25zdCBFeHByZXNzaW9uTGhzJiApOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUmhzVD4KKyAgICBCaW5hcnlFeHByZXNzaW9uPFQsIEludGVybmFsOjpJc0VxdWFsVG8sIFJoc1QgY29uc3QmPgorICAgIG9wZXJhdG9yID09ICggUmhzVCBjb25zdCYgcmhzICkgeworICAgICAgICByZXR1cm4gY2FwdHVyZUV4cHJlc3Npb248SW50ZXJuYWw6OklzRXF1YWxUbz4oIHJocyApOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFJoc1Q+CisgICAgQmluYXJ5RXhwcmVzc2lvbjxULCBJbnRlcm5hbDo6SXNOb3RFcXVhbFRvLCBSaHNUIGNvbnN0Jj4KKyAgICBvcGVyYXRvciAhPSAoIFJoc1QgY29uc3QmIHJocyApIHsKKyAgICAgICAgcmV0dXJuIGNhcHR1cmVFeHByZXNzaW9uPEludGVybmFsOjpJc05vdEVxdWFsVG8+KCByaHMgKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBSaHNUPgorICAgIEJpbmFyeUV4cHJlc3Npb248VCwgSW50ZXJuYWw6OklzTGVzc1RoYW4sIFJoc1QgY29uc3QmPgorICAgIG9wZXJhdG9yIDwgKCBSaHNUIGNvbnN0JiByaHMgKSB7CisgICAgICAgIHJldHVybiBjYXB0dXJlRXhwcmVzc2lvbjxJbnRlcm5hbDo6SXNMZXNzVGhhbj4oIHJocyApOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFJoc1Q+CisgICAgQmluYXJ5RXhwcmVzc2lvbjxULCBJbnRlcm5hbDo6SXNHcmVhdGVyVGhhbiwgUmhzVCBjb25zdCY+CisgICAgb3BlcmF0b3IgPiAoIFJoc1QgY29uc3QmIHJocyApIHsKKyAgICAgICAgcmV0dXJuIGNhcHR1cmVFeHByZXNzaW9uPEludGVybmFsOjpJc0dyZWF0ZXJUaGFuPiggcmhzICk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUmhzVD4KKyAgICBCaW5hcnlFeHByZXNzaW9uPFQsIEludGVybmFsOjpJc0xlc3NUaGFuT3JFcXVhbFRvLCBSaHNUIGNvbnN0Jj4KKyAgICBvcGVyYXRvciA8PSAoIFJoc1QgY29uc3QmIHJocyApIHsKKyAgICAgICAgcmV0dXJuIGNhcHR1cmVFeHByZXNzaW9uPEludGVybmFsOjpJc0xlc3NUaGFuT3JFcXVhbFRvPiggcmhzICk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUmhzVD4KKyAgICBCaW5hcnlFeHByZXNzaW9uPFQsIEludGVybmFsOjpJc0dyZWF0ZXJUaGFuT3JFcXVhbFRvLCBSaHNUIGNvbnN0Jj4KKyAgICBvcGVyYXRvciA+PSAoIFJoc1QgY29uc3QmIHJocyApIHsKKyAgICAgICAgcmV0dXJuIGNhcHR1cmVFeHByZXNzaW9uPEludGVybmFsOjpJc0dyZWF0ZXJUaGFuT3JFcXVhbFRvPiggcmhzICk7CisgICAgfQorCisgICAgQmluYXJ5RXhwcmVzc2lvbjxULCBJbnRlcm5hbDo6SXNFcXVhbFRvLCBib29sPiBvcGVyYXRvciA9PSAoIGJvb2wgcmhzICkgeworICAgICAgICByZXR1cm4gY2FwdHVyZUV4cHJlc3Npb248SW50ZXJuYWw6OklzRXF1YWxUbz4oIHJocyApOworICAgIH0KKworICAgIEJpbmFyeUV4cHJlc3Npb248VCwgSW50ZXJuYWw6OklzTm90RXF1YWxUbywgYm9vbD4gb3BlcmF0b3IgIT0gKCBib29sIHJocyApIHsKKyAgICAgICAgcmV0dXJuIGNhcHR1cmVFeHByZXNzaW9uPEludGVybmFsOjpJc05vdEVxdWFsVG8+KCByaHMgKTsKKyAgICB9CisKKyAgICB2b2lkIGVuZEV4cHJlc3Npb24oKSB7CisgICAgICAgIG1fdHJ1dGh5ID0gbV9saHMgPyB0cnVlIDogZmFsc2U7CisgICAgICAgIG1fcmIKKyAgICAgICAgICAgIC5zZXRSZXN1bHRUeXBlKCBtX3RydXRoeSApCisgICAgICAgICAgICAuZW5kRXhwcmVzc2lvbiggKnRoaXMgKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgcmVjb25zdHJ1Y3RFeHByZXNzaW9uKCBzdGQ6OnN0cmluZyYgZGVzdCApIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgZGVzdCA9IENhdGNoOjp0b1N0cmluZyggbV90cnV0aHkgKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgdGVtcGxhdGU8SW50ZXJuYWw6Ok9wZXJhdG9yIE9wLCB0eXBlbmFtZSBSaHNUPgorICAgIEJpbmFyeUV4cHJlc3Npb248VCwgT3AsIFJoc1QmPiBjYXB0dXJlRXhwcmVzc2lvbiggUmhzVCYgcmhzICkgY29uc3QgeworICAgICAgICByZXR1cm4gQmluYXJ5RXhwcmVzc2lvbjxULCBPcCwgUmhzVCY+KCBtX3JiLCBtX2xocywgcmhzICk7CisgICAgfQorCisgICAgdGVtcGxhdGU8SW50ZXJuYWw6Ok9wZXJhdG9yIE9wPgorICAgIEJpbmFyeUV4cHJlc3Npb248VCwgT3AsIGJvb2w+IGNhcHR1cmVFeHByZXNzaW9uKCBib29sIHJocyApIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIEJpbmFyeUV4cHJlc3Npb248VCwgT3AsIGJvb2w+KCBtX3JiLCBtX2xocywgcmhzICk7CisgICAgfQorCitwcml2YXRlOgorICAgIFJlc3VsdEJ1aWxkZXImIG1fcmI7CisgICAgVCBtX2xoczsKKyAgICBib29sIG1fdHJ1dGh5OworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTGhzVCwgSW50ZXJuYWw6Ok9wZXJhdG9yIE9wLCB0eXBlbmFtZSBSaHNUPgorY2xhc3MgQmluYXJ5RXhwcmVzc2lvbiA6IHB1YmxpYyBEZWNvbXBvc2VkRXhwcmVzc2lvbiB7CitwdWJsaWM6CisgICAgQmluYXJ5RXhwcmVzc2lvbiggUmVzdWx0QnVpbGRlciYgcmIsIExoc1QgbGhzLCBSaHNUIHJocyApCisgICAgICAgIDogbV9yYiggcmIgKSwgbV9saHMoIGxocyApLCBtX3JocyggcmhzICkge30KKworICAgIEJpbmFyeUV4cHJlc3Npb24mIG9wZXJhdG9yID0gKCBCaW5hcnlFeHByZXNzaW9uJiApOworCisgICAgdm9pZCBlbmRFeHByZXNzaW9uKCkgY29uc3QgeworICAgICAgICBtX3JiCisgICAgICAgICAgICAuc2V0UmVzdWx0VHlwZSggSW50ZXJuYWw6OmNvbXBhcmU8T3A+KCBtX2xocywgbV9yaHMgKSApCisgICAgICAgICAgICAuZW5kRXhwcmVzc2lvbiggKnRoaXMgKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgaXNCaW5hcnlFeHByZXNzaW9uKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgcmVjb25zdHJ1Y3RFeHByZXNzaW9uKCBzdGQ6OnN0cmluZyYgZGVzdCApIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgbGhzID0gQ2F0Y2g6OnRvU3RyaW5nKCBtX2xocyApOworICAgICAgICBzdGQ6OnN0cmluZyByaHMgPSBDYXRjaDo6dG9TdHJpbmcoIG1fcmhzICk7CisgICAgICAgIGNoYXIgZGVsaW0gPSBsaHMuc2l6ZSgpICsgcmhzLnNpemUoKSA8IDQwICYmCisgICAgICAgICAgICAgICAgICAgICBsaHMuZmluZCgnXG4nKSA9PSBzdGQ6OnN0cmluZzo6bnBvcyAmJgorICAgICAgICAgICAgICAgICAgICAgcmhzLmZpbmQoJ1xuJykgPT0gc3RkOjpzdHJpbmc6Om5wb3MgPyAnICcgOiAnXG4nOworICAgICAgICBkZXN0LnJlc2VydmUoIDcgKyBsaHMuc2l6ZSgpICsgcmhzLnNpemUoKSApOworICAgICAgICAgICAgICAgICAgIC8vIDIgZm9yIHNwYWNlcyBhcm91bmQgb3BlcmF0b3IKKyAgICAgICAgICAgICAgICAgICAvLyAyIGZvciBvcGVyYXRvcgorICAgICAgICAgICAgICAgICAgIC8vIDIgZm9yIHBhcmVudGhlc2VzIChjb25kaXRpb25hbGx5IGFkZGVkIGxhdGVyKQorICAgICAgICAgICAgICAgICAgIC8vIDEgZm9yIG5lZ2F0aW9uIChjb25kaXRpb25hbGx5IGFkZGVkIGxhdGVyKQorICAgICAgICBkZXN0ID0gbGhzOworICAgICAgICBkZXN0ICs9IGRlbGltOworICAgICAgICBkZXN0ICs9IEludGVybmFsOjpPcGVyYXRvclRyYWl0czxPcD46OmdldE5hbWUoKTsKKyAgICAgICAgZGVzdCArPSBkZWxpbTsKKyAgICAgICAgZGVzdCArPSByaHM7CisgICAgfQorCitwcml2YXRlOgorICAgIFJlc3VsdEJ1aWxkZXImIG1fcmI7CisgICAgTGhzVCBtX2xoczsKKyAgICBSaHNUIG1fcmhzOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgQXJnVCwgdHlwZW5hbWUgTWF0Y2hlclQ+CitjbGFzcyBNYXRjaEV4cHJlc3Npb24gOiBwdWJsaWMgRGVjb21wb3NlZEV4cHJlc3Npb24geworcHVibGljOgorICAgIE1hdGNoRXhwcmVzc2lvbiggQXJnVCBhcmcsIE1hdGNoZXJUIG1hdGNoZXIsIGNoYXIgY29uc3QqIG1hdGNoZXJTdHJpbmcgKQorICAgICAgICA6IG1fYXJnKCBhcmcgKSwgbV9tYXRjaGVyKCBtYXRjaGVyICksIG1fbWF0Y2hlclN0cmluZyggbWF0Y2hlclN0cmluZyApIHt9CisKKyAgICB2aXJ0dWFsIGJvb2wgaXNCaW5hcnlFeHByZXNzaW9uKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgcmVjb25zdHJ1Y3RFeHByZXNzaW9uKCBzdGQ6OnN0cmluZyYgZGVzdCApIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgbWF0Y2hlckFzU3RyaW5nID0gbV9tYXRjaGVyLnRvU3RyaW5nKCk7CisgICAgICAgIGRlc3QgPSBDYXRjaDo6dG9TdHJpbmcoIG1fYXJnICk7CisgICAgICAgIGRlc3QgKz0gJyAnOworICAgICAgICBpZiggbWF0Y2hlckFzU3RyaW5nID09IERldGFpbDo6dW5wcmludGFibGVTdHJpbmcgKQorICAgICAgICAgICAgZGVzdCArPSBtX21hdGNoZXJTdHJpbmc7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGRlc3QgKz0gbWF0Y2hlckFzU3RyaW5nOworICAgIH0KKworcHJpdmF0ZToKKyAgICBBcmdUIG1fYXJnOworICAgIE1hdGNoZXJUIG1fbWF0Y2hlcjsKKyAgICBjaGFyIGNvbnN0KiBtX21hdGNoZXJTdHJpbmc7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBpbmxpbmUgRXhwcmVzc2lvbkxoczxUIGNvbnN0Jj4gUmVzdWx0QnVpbGRlcjo6b3BlcmF0b3IgPD0gKCBUIGNvbnN0JiBvcGVyYW5kICkgeworICAgICAgICByZXR1cm4gRXhwcmVzc2lvbkxoczxUIGNvbnN0Jj4oICp0aGlzLCBvcGVyYW5kICk7CisgICAgfQorCisgICAgaW5saW5lIEV4cHJlc3Npb25MaHM8Ym9vbD4gUmVzdWx0QnVpbGRlcjo6b3BlcmF0b3IgPD0gKCBib29sIHZhbHVlICkgeworICAgICAgICByZXR1cm4gRXhwcmVzc2lvbkxoczxib29sPiggKnRoaXMsIHZhbHVlICk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQXJnVCwgdHlwZW5hbWUgTWF0Y2hlclQ+CisgICAgaW5saW5lIHZvaWQgUmVzdWx0QnVpbGRlcjo6Y2FwdHVyZU1hdGNoKCBBcmdUIGNvbnN0JiBhcmcsIE1hdGNoZXJUIGNvbnN0JiBtYXRjaGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBjb25zdCogbWF0Y2hlclN0cmluZyApIHsKKyAgICAgICAgTWF0Y2hFeHByZXNzaW9uPEFyZ1QgY29uc3QmLCBNYXRjaGVyVCBjb25zdCY+IGV4cHIoIGFyZywgbWF0Y2hlciwgbWF0Y2hlclN0cmluZyApOworICAgICAgICBzZXRSZXN1bHRUeXBlKCBtYXRjaGVyLm1hdGNoKCBhcmcgKSApOworICAgICAgICBlbmRFeHByZXNzaW9uKCBleHByICk7CisgICAgfQorCit9IC8vIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfbWVzc2FnZS5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9NRVNTQUdFX0hfSU5DTFVERUQKKworI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIHN0cnVjdCBNZXNzYWdlSW5mbyB7CisgICAgICAgIE1lc3NhZ2VJbmZvKCAgICBzdGQ6OnN0cmluZyBjb25zdCYgX21hY3JvTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBfbGluZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICBSZXN1bHRXYXM6Ok9mVHlwZSBfdHlwZSApOworCisgICAgICAgIHN0ZDo6c3RyaW5nIG1hY3JvTmFtZTsKKyAgICAgICAgU291cmNlTGluZUluZm8gbGluZUluZm87CisgICAgICAgIFJlc3VsdFdhczo6T2ZUeXBlIHR5cGU7CisgICAgICAgIHN0ZDo6c3RyaW5nIG1lc3NhZ2U7CisgICAgICAgIHVuc2lnbmVkIGludCBzZXF1ZW5jZTsKKworICAgICAgICBib29sIG9wZXJhdG9yID09ICggTWVzc2FnZUluZm8gY29uc3QmIG90aGVyICkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIHNlcXVlbmNlID09IG90aGVyLnNlcXVlbmNlOworICAgICAgICB9CisgICAgICAgIGJvb2wgb3BlcmF0b3IgPCAoIE1lc3NhZ2VJbmZvIGNvbnN0JiBvdGhlciApIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBzZXF1ZW5jZSA8IG90aGVyLnNlcXVlbmNlOworICAgICAgICB9CisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RhdGljIHVuc2lnbmVkIGludCBnbG9iYWxDb3VudDsKKyAgICB9OworCisgICAgc3RydWN0IE1lc3NhZ2VCdWlsZGVyIHsKKyAgICAgICAgTWVzc2FnZUJ1aWxkZXIoIHN0ZDo6c3RyaW5nIGNvbnN0JiBtYWNyb05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMaW5lSW5mbyBjb25zdCYgbGluZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICBSZXN1bHRXYXM6Ok9mVHlwZSB0eXBlICkKKyAgICAgICAgOiBtX2luZm8oIG1hY3JvTmFtZSwgbGluZUluZm8sIHR5cGUgKQorICAgICAgICB7fQorCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgICAgIE1lc3NhZ2VCdWlsZGVyJiBvcGVyYXRvciA8PCAoIFQgY29uc3QmIHZhbHVlICkgeworICAgICAgICAgICAgbV9zdHJlYW0gPDwgdmFsdWU7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICBNZXNzYWdlSW5mbyBtX2luZm87CisgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBtX3N0cmVhbTsKKyAgICB9OworCisgICAgY2xhc3MgU2NvcGVkTWVzc2FnZSB7CisgICAgcHVibGljOgorICAgICAgICBTY29wZWRNZXNzYWdlKCBNZXNzYWdlQnVpbGRlciBjb25zdCYgYnVpbGRlciApOworICAgICAgICBTY29wZWRNZXNzYWdlKCBTY29wZWRNZXNzYWdlIGNvbnN0JiBvdGhlciApOworICAgICAgICB+U2NvcGVkTWVzc2FnZSgpOworCisgICAgICAgIE1lc3NhZ2VJbmZvIG1faW5mbzsKKyAgICB9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX2ludGVyZmFjZXNfY2FwdHVyZS5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9JTlRFUkZBQ0VTX0NBUFRVUkVfSF9JTkNMVURFRAorCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgY2xhc3MgVGVzdENhc2U7CisgICAgY2xhc3MgQXNzZXJ0aW9uUmVzdWx0OworICAgIHN0cnVjdCBBc3NlcnRpb25JbmZvOworICAgIHN0cnVjdCBTZWN0aW9uSW5mbzsKKyAgICBzdHJ1Y3QgU2VjdGlvbkVuZEluZm87CisgICAgc3RydWN0IE1lc3NhZ2VJbmZvOworICAgIGNsYXNzIFNjb3BlZE1lc3NhZ2VCdWlsZGVyOworICAgIHN0cnVjdCBDb3VudHM7CisKKyAgICBzdHJ1Y3QgSVJlc3VsdENhcHR1cmUgeworCisgICAgICAgIHZpcnR1YWwgfklSZXN1bHRDYXB0dXJlKCk7CisKKyAgICAgICAgdmlydHVhbCB2b2lkIGFzc2VydGlvbkVuZGVkKCBBc3NlcnRpb25SZXN1bHQgY29uc3QmIHJlc3VsdCApID0gMDsKKyAgICAgICAgdmlydHVhbCBib29sIHNlY3Rpb25TdGFydGVkKCAgICBTZWN0aW9uSW5mbyBjb25zdCYgc2VjdGlvbkluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ291bnRzJiBhc3NlcnRpb25zICkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgc2VjdGlvbkVuZGVkKCBTZWN0aW9uRW5kSW5mbyBjb25zdCYgZW5kSW5mbyApID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIHNlY3Rpb25FbmRlZEVhcmx5KCBTZWN0aW9uRW5kSW5mbyBjb25zdCYgZW5kSW5mbyApID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIHB1c2hTY29wZWRNZXNzYWdlKCBNZXNzYWdlSW5mbyBjb25zdCYgbWVzc2FnZSApID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIHBvcFNjb3BlZE1lc3NhZ2UoIE1lc3NhZ2VJbmZvIGNvbnN0JiBtZXNzYWdlICkgPSAwOworCisgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0Q3VycmVudFRlc3ROYW1lKCkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIGNvbnN0IEFzc2VydGlvblJlc3VsdCogZ2V0TGFzdFJlc3VsdCgpIGNvbnN0ID0gMDsKKworICAgICAgICB2aXJ0dWFsIHZvaWQgZXhjZXB0aW9uRWFybHlSZXBvcnRlZCgpID0gMDsKKworICAgICAgICB2aXJ0dWFsIHZvaWQgaGFuZGxlRmF0YWxFcnJvckNvbmRpdGlvbiggc3RkOjpzdHJpbmcgY29uc3QmIG1lc3NhZ2UgKSA9IDA7CisgICAgfTsKKworICAgIElSZXN1bHRDYXB0dXJlJiBnZXRSZXN1bHRDYXB0dXJlKCk7Cit9CisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9kZWJ1Z2dlci5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9ERUJVR0dFUl9IX0lOQ0xVREVECisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9wbGF0Zm9ybS5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9QTEFURk9STV9IX0lOQ0xVREVECisKKyNpZiBkZWZpbmVkKF9fTUFDX09TX1hfVkVSU0lPTl9NSU5fUkVRVUlSRUQpCisjICBkZWZpbmUgQ0FUQ0hfUExBVEZPUk1fTUFDCisjZWxpZiAgZGVmaW5lZChfX0lQSE9ORV9PU19WRVJTSU9OX01JTl9SRVFVSVJFRCkKKyMgIGRlZmluZSBDQVRDSF9QTEFURk9STV9JUEhPTkUKKyNlbGlmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19saW51eCkgfHwgZGVmaW5lZChfX2xpbnV4X18pCisjICBkZWZpbmUgQ0FUQ0hfUExBVEZPUk1fTElOVVgKKyNlbGlmIGRlZmluZWQoV0lOMzIpIHx8IGRlZmluZWQoX19XSU4zMl9fKSB8fCBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfTVNDX1ZFUikKKyMgIGRlZmluZSBDQVRDSF9QTEFURk9STV9XSU5ET1dTCisjICBpZiAhZGVmaW5lZChOT01JTk1BWCkgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX05PX05PTUlOTUFYKQorIyAgICBkZWZpbmUgQ0FUQ0hfREVGSU5FU19OT01JTk1BWAorIyAgZW5kaWYKKyMgIGlmICFkZWZpbmVkKFdJTjMyX0xFQU5fQU5EX01FQU4pICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19OT19XSU4zMl9MRUFOX0FORF9NRUFOKQorIyAgICBkZWZpbmUgQ0FUQ0hfREVGSU5FU19XSU4zMl9MRUFOX0FORF9NRUFOCisjICBlbmRpZgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBDYXRjaHsKKworICAgIGJvb2wgaXNEZWJ1Z2dlckFjdGl2ZSgpOworICAgIHZvaWQgd3JpdGVUb0RlYnVnQ29uc29sZSggc3RkOjpzdHJpbmcgY29uc3QmIHRleHQgKTsKK30KKworI2lmZGVmIENBVENIX1BMQVRGT1JNX01BQworCisgICAgLy8gVGhlIGZvbGxvd2luZyBjb2RlIHNuaXBwZXQgYmFzZWQgb246CisgICAgLy8gaHR0cDovL2NvY29hd2l0aGxvdmUuY29tLzIwMDgvMDMvYnJlYWstaW50by1kZWJ1Z2dlci5odG1sCisgICAgI2lmIGRlZmluZWQoX19wcGM2NF9fKSB8fCBkZWZpbmVkKF9fcHBjX18pCisgICAgICAgICNkZWZpbmUgQ0FUQ0hfVFJBUCgpIFwKKyAgICAgICAgICAgICAgICBfX2FzbV9fKCJsaSByMCwgMjBcbnNjXG5ub3BcbmxpIHIwLCAzN1xubGkgcjQsIDJcbnNjXG5ub3BcbiIgXAorICAgICAgICAgICAgICAgIDogOiA6ICJtZW1vcnkiLCJyMCIsInIzIiwicjQiICkKKyAgICAjZWxzZQorICAgICAgICAjZGVmaW5lIENBVENIX1RSQVAoKSBfX2FzbV9fKCJpbnQgJDNcbiIgOiA6ICkKKyAgICAjZW5kaWYKKworI2VsaWYgZGVmaW5lZChDQVRDSF9QTEFURk9STV9MSU5VWCkKKyAgICAvLyBJZiB3ZSBjYW4gdXNlIGlubGluZSBhc3NlbWJsZXIsIGRvIGl0IGJlY2F1c2UgdGhpcyBhbGxvd3MgdXMgdG8gYnJlYWsKKyAgICAvLyBkaXJlY3RseSBhdCB0aGUgbG9jYXRpb24gb2YgdGhlIGZhaWxpbmcgY2hlY2sgaW5zdGVhZCBvZiBicmVha2luZyBpbnNpZGUKKyAgICAvLyByYWlzZSgpIGNhbGxlZCBmcm9tIGl0LCBpLmUuIG9uZSBzdGFjayBmcmFtZSBiZWxvdy4KKyAgICAjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKGRlZmluZWQoX19pMzg2KSB8fCBkZWZpbmVkKF9feDg2XzY0KSkKKyAgICAgICAgI2RlZmluZSBDQVRDSF9UUkFQKCkgYXNtIHZvbGF0aWxlICgiaW50ICQzIikKKyAgICAjZWxzZSAvLyBGYWxsIGJhY2sgdG8gdGhlIGdlbmVyaWMgd2F5LgorICAgICAgICAjaW5jbHVkZSA8c2lnbmFsLmg+CisKKyAgICAgICAgI2RlZmluZSBDQVRDSF9UUkFQKCkgcmFpc2UoU0lHVFJBUCkKKyAgICAjZW5kaWYKKyNlbGlmIGRlZmluZWQoX01TQ19WRVIpCisgICAgI2RlZmluZSBDQVRDSF9UUkFQKCkgX19kZWJ1Z2JyZWFrKCkKKyNlbGlmIGRlZmluZWQoX19NSU5HVzMyX18pCisgICAgZXh0ZXJuICJDIiBfX2RlY2xzcGVjKGRsbGltcG9ydCkgdm9pZCBfX3N0ZGNhbGwgRGVidWdCcmVhaygpOworICAgICNkZWZpbmUgQ0FUQ0hfVFJBUCgpIERlYnVnQnJlYWsoKQorI2VuZGlmCisKKyNpZmRlZiBDQVRDSF9UUkFQCisgICAgI2RlZmluZSBDQVRDSF9CUkVBS19JTlRPX0RFQlVHR0VSKCkgaWYoIENhdGNoOjppc0RlYnVnZ2VyQWN0aXZlKCkgKSB7IENBVENIX1RSQVAoKTsgfQorI2Vsc2UKKyAgICAjZGVmaW5lIENBVENIX0JSRUFLX0lOVE9fREVCVUdHRVIoKSBDYXRjaDo6YWx3YXlzVHJ1ZSgpOworI2VuZGlmCisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9pbnRlcmZhY2VzX3J1bm5lci5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9JTlRFUkZBQ0VTX1JVTk5FUl9IX0lOQ0xVREVECisKK25hbWVzcGFjZSBDYXRjaCB7CisgICAgY2xhc3MgVGVzdENhc2U7CisKKyAgICBzdHJ1Y3QgSVJ1bm5lciB7CisgICAgICAgIHZpcnR1YWwgfklSdW5uZXIoKTsKKyAgICAgICAgdmlydHVhbCBib29sIGFib3J0aW5nKCkgY29uc3QgPSAwOworICAgIH07Cit9CisKKyNpZiBkZWZpbmVkKENBVENIX0NPTkZJR19GQVNUX0NPTVBJTEUpCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBXZSBjYW4gc3BlZWR1cCBjb21waWxhdGlvbiBzaWduaWZpY2FudGx5IGJ5IGJyZWFraW5nIGludG8gZGVidWdnZXIgbG93ZXIgaW4KKy8vIHRoZSBjYWxsc3RhY2ssIGJlY2F1c2UgdGhlbiB3ZSBkb24ndCBoYXZlIHRvIGV4cGFuZCBDQVRDSF9CUkVBS19JTlRPX0RFQlVHR0VSCisvLyBtYWNybyBpbiBlYWNoIGFzc2VydGlvbgorI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9SRUFDVCggcmVzdWx0QnVpbGRlciApIFwKKyAgICByZXN1bHRCdWlsZGVyLnJlYWN0KCk7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEFub3RoZXIgd2F5IHRvIHNwZWVkLXVwIGNvbXBpbGF0aW9uIGlzIHRvIG9taXQgbG9jYWwgdHJ5LWNhdGNoIGZvciBSRVFVSVJFKgorLy8gbWFjcm9zLgorLy8gVGhpcyBjYW4gcG90ZW50aWFsbHkgY2F1c2UgZmFsc2UgbmVnYXRpdmUsIGlmIHRoZSB0ZXN0IGNvZGUgY2F0Y2hlcworLy8gdGhlIGV4Y2VwdGlvbiBiZWZvcmUgaXQgcHJvcGFnYXRlcyBiYWNrIHVwIHRvIHRoZSBydW5uZXIuCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX1RFU1RfTk9fVFJZKCBtYWNyb05hbWUsIHJlc3VsdERpc3Bvc2l0aW9uLCBleHByICkgXAorICAgIGRvIHsgXAorICAgICAgICBDYXRjaDo6UmVzdWx0QnVpbGRlciBfX2NhdGNoUmVzdWx0KCBtYWNyb05hbWUsIENBVENIX0lOVEVSTkFMX0xJTkVJTkZPLCAjZXhwciwgcmVzdWx0RGlzcG9zaXRpb24gKTsgXAorICAgICAgICBfX2NhdGNoUmVzdWx0LnNldEV4Y2VwdGlvbkd1YXJkKCk7IFwKKyAgICAgICAgQ0FUQ0hfSU5URVJOQUxfU1VQUFJFU1NfUEFSRU5USEVTRVNfV0FSTklOR1MgXAorICAgICAgICAoIF9fY2F0Y2hSZXN1bHQgPD0gZXhwciApLmVuZEV4cHJlc3Npb24oKTsgXAorICAgICAgICBDQVRDSF9JTlRFUk5BTF9VTlNVUFBSRVNTX1BBUkVOVEhFU0VTX1dBUk5JTkdTIFwKKyAgICAgICAgX19jYXRjaFJlc3VsdC51bnNldEV4Y2VwdGlvbkd1YXJkKCk7IFwKKyAgICAgICAgSU5URVJOQUxfQ0FUQ0hfUkVBQ1QoIF9fY2F0Y2hSZXN1bHQgKSBcCisgICAgfSB3aGlsZSggQ2F0Y2g6OmlzVHJ1ZSggZmFsc2UgJiYgc3RhdGljX2Nhc3Q8Ym9vbD4oICEhKGV4cHIpICkgKSApIC8vIGV4cHIgaGVyZSBpcyBuZXZlciBldmFsdWF0ZWQgYXQgcnVudGltZSBidXQgaXQgZm9yY2VzIHRoZSBjb21waWxlciB0byBnaXZlIGl0IGEgbG9vaworLy8gVGhlIGRvdWJsZSBuZWdhdGlvbiBzaWxlbmNlcyBNU1ZDJ3MgQzQ4MDAgd2FybmluZywgdGhlIHN0YXRpY19jYXN0IGZvcmNlcyBzaG9ydC1jaXJjdWl0IGV2YWx1YXRpb24gaWYgdGhlIHR5cGUgaGFzIG92ZXJsb2FkZWQgJiYuCisKKyNkZWZpbmUgSU5URVJOQUxfQ0hFQ0tfVEhBVF9OT19UUlkoIG1hY3JvTmFtZSwgbWF0Y2hlciwgcmVzdWx0RGlzcG9zaXRpb24sIGFyZyApIFwKKyAgICBkbyB7IFwKKyAgICAgICAgQ2F0Y2g6OlJlc3VsdEJ1aWxkZXIgX19jYXRjaFJlc3VsdCggbWFjcm9OYW1lLCBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTywgI2FyZyAiLCAiICNtYXRjaGVyLCByZXN1bHREaXNwb3NpdGlvbiApOyBcCisgICAgICAgIF9fY2F0Y2hSZXN1bHQuc2V0RXhjZXB0aW9uR3VhcmQoKTsgXAorICAgICAgICBfX2NhdGNoUmVzdWx0LmNhcHR1cmVNYXRjaCggYXJnLCBtYXRjaGVyLCAjbWF0Y2hlciApOyBcCisgICAgICAgIF9fY2F0Y2hSZXN1bHQudW5zZXRFeGNlcHRpb25HdWFyZCgpOyBcCisgICAgICAgIElOVEVSTkFMX0NBVENIX1JFQUNUKCBfX2NhdGNoUmVzdWx0ICkgXAorICAgIH0gd2hpbGUoIENhdGNoOjphbHdheXNGYWxzZSgpICkKKworI2Vsc2UKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEluIHRoZSBldmVudCBvZiBhIGZhaWx1cmUgd29ya3Mgb3V0IGlmIHRoZSBkZWJ1Z2dlciBuZWVkcyB0byBiZSBpbnZva2VkCisvLyBhbmQvb3IgYW4gZXhjZXB0aW9uIHRocm93biBhbmQgdGFrZXMgYXBwcm9wcmlhdGUgYWN0aW9uLgorLy8gVGhpcyBuZWVkcyB0byBiZSBkb25lIGFzIGEgbWFjcm8gc28gdGhlIGRlYnVnZ2VyIHdpbGwgc3RvcCBpbiB0aGUgdXNlcgorLy8gc291cmNlIGNvZGUgcmF0aGVyIHRoYW4gaW4gQ2F0Y2ggbGlicmFyeSBjb2RlCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX1JFQUNUKCByZXN1bHRCdWlsZGVyICkgXAorICAgIGlmKCByZXN1bHRCdWlsZGVyLnNob3VsZERlYnVnQnJlYWsoKSApIENBVENIX0JSRUFLX0lOVE9fREVCVUdHRVIoKTsgXAorICAgIHJlc3VsdEJ1aWxkZXIucmVhY3QoKTsKKyNlbmRpZgorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX1RFU1QoIG1hY3JvTmFtZSwgcmVzdWx0RGlzcG9zaXRpb24sIGV4cHIgKSBcCisgICAgZG8geyBcCisgICAgICAgIENhdGNoOjpSZXN1bHRCdWlsZGVyIF9fY2F0Y2hSZXN1bHQoIG1hY3JvTmFtZSwgQ0FUQ0hfSU5URVJOQUxfTElORUlORk8sICNleHByLCByZXN1bHREaXNwb3NpdGlvbiApOyBcCisgICAgICAgIHRyeSB7IFwKKyAgICAgICAgICAgIENBVENIX0lOVEVSTkFMX1NVUFBSRVNTX1BBUkVOVEhFU0VTX1dBUk5JTkdTIFwKKyAgICAgICAgICAgICggX19jYXRjaFJlc3VsdCA8PSBleHByICkuZW5kRXhwcmVzc2lvbigpOyBcCisgICAgICAgICAgICBDQVRDSF9JTlRFUk5BTF9VTlNVUFBSRVNTX1BBUkVOVEhFU0VTX1dBUk5JTkdTIFwKKyAgICAgICAgfSBcCisgICAgICAgIGNhdGNoKCAuLi4gKSB7IFwKKyAgICAgICAgICAgIF9fY2F0Y2hSZXN1bHQudXNlQWN0aXZlRXhjZXB0aW9uKCByZXN1bHREaXNwb3NpdGlvbiApOyBcCisgICAgICAgIH0gXAorICAgICAgICBJTlRFUk5BTF9DQVRDSF9SRUFDVCggX19jYXRjaFJlc3VsdCApIFwKKyAgICB9IHdoaWxlKCBDYXRjaDo6aXNUcnVlKCBmYWxzZSAmJiBzdGF0aWNfY2FzdDxib29sPiggISEoZXhwcikgKSApICkgLy8gZXhwciBoZXJlIGlzIG5ldmVyIGV2YWx1YXRlZCBhdCBydW50aW1lIGJ1dCBpdCBmb3JjZXMgdGhlIGNvbXBpbGVyIHRvIGdpdmUgaXQgYSBsb29rCisgICAgLy8gVGhlIGRvdWJsZSBuZWdhdGlvbiBzaWxlbmNlcyBNU1ZDJ3MgQzQ4MDAgd2FybmluZywgdGhlIHN0YXRpY19jYXN0IGZvcmNlcyBzaG9ydC1jaXJjdWl0IGV2YWx1YXRpb24gaWYgdGhlIHR5cGUgaGFzIG92ZXJsb2FkZWQgJiYuCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfSUYoIG1hY3JvTmFtZSwgcmVzdWx0RGlzcG9zaXRpb24sIGV4cHIgKSBcCisgICAgSU5URVJOQUxfQ0FUQ0hfVEVTVCggbWFjcm9OYW1lLCByZXN1bHREaXNwb3NpdGlvbiwgZXhwciApOyBcCisgICAgaWYoIENhdGNoOjpnZXRSZXN1bHRDYXB0dXJlKCkuZ2V0TGFzdFJlc3VsdCgpLT5zdWNjZWVkZWQoKSApCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfRUxTRSggbWFjcm9OYW1lLCByZXN1bHREaXNwb3NpdGlvbiwgZXhwciApIFwKKyAgICBJTlRFUk5BTF9DQVRDSF9URVNUKCBtYWNyb05hbWUsIHJlc3VsdERpc3Bvc2l0aW9uLCBleHByICk7IFwKKyAgICBpZiggIUNhdGNoOjpnZXRSZXN1bHRDYXB0dXJlKCkuZ2V0TGFzdFJlc3VsdCgpLT5zdWNjZWVkZWQoKSApCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfTk9fVEhST1coIG1hY3JvTmFtZSwgcmVzdWx0RGlzcG9zaXRpb24sIGV4cHIgKSBcCisgICAgZG8geyBcCisgICAgICAgIENhdGNoOjpSZXN1bHRCdWlsZGVyIF9fY2F0Y2hSZXN1bHQoIG1hY3JvTmFtZSwgQ0FUQ0hfSU5URVJOQUxfTElORUlORk8sICNleHByLCByZXN1bHREaXNwb3NpdGlvbiApOyBcCisgICAgICAgIHRyeSB7IFwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PHZvaWQ+KGV4cHIpOyBcCisgICAgICAgICAgICBfX2NhdGNoUmVzdWx0LmNhcHR1cmVSZXN1bHQoIENhdGNoOjpSZXN1bHRXYXM6Ok9rICk7IFwKKyAgICAgICAgfSBcCisgICAgICAgIGNhdGNoKCAuLi4gKSB7IFwKKyAgICAgICAgICAgIF9fY2F0Y2hSZXN1bHQudXNlQWN0aXZlRXhjZXB0aW9uKCByZXN1bHREaXNwb3NpdGlvbiApOyBcCisgICAgICAgIH0gXAorICAgICAgICBJTlRFUk5BTF9DQVRDSF9SRUFDVCggX19jYXRjaFJlc3VsdCApIFwKKyAgICB9IHdoaWxlKCBDYXRjaDo6YWx3YXlzRmFsc2UoKSApCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfVEhST1dTKCBtYWNyb05hbWUsIHJlc3VsdERpc3Bvc2l0aW9uLCBtYXRjaGVyLCBleHByICkgXAorICAgIGRvIHsgXAorICAgICAgICBDYXRjaDo6UmVzdWx0QnVpbGRlciBfX2NhdGNoUmVzdWx0KCBtYWNyb05hbWUsIENBVENIX0lOVEVSTkFMX0xJTkVJTkZPLCAjZXhwciwgcmVzdWx0RGlzcG9zaXRpb24sICNtYXRjaGVyICk7IFwKKyAgICAgICAgaWYoIF9fY2F0Y2hSZXN1bHQuYWxsb3dUaHJvd3MoKSApIFwKKyAgICAgICAgICAgIHRyeSB7IFwKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx2b2lkPihleHByKTsgXAorICAgICAgICAgICAgICAgIF9fY2F0Y2hSZXN1bHQuY2FwdHVyZVJlc3VsdCggQ2F0Y2g6OlJlc3VsdFdhczo6RGlkbnRUaHJvd0V4Y2VwdGlvbiApOyBcCisgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgIGNhdGNoKCAuLi4gKSB7IFwKKyAgICAgICAgICAgICAgICBfX2NhdGNoUmVzdWx0LmNhcHR1cmVFeHBlY3RlZEV4Y2VwdGlvbiggbWF0Y2hlciApOyBcCisgICAgICAgICAgICB9IFwKKyAgICAgICAgZWxzZSBcCisgICAgICAgICAgICBfX2NhdGNoUmVzdWx0LmNhcHR1cmVSZXN1bHQoIENhdGNoOjpSZXN1bHRXYXM6Ok9rICk7IFwKKyAgICAgICAgSU5URVJOQUxfQ0FUQ0hfUkVBQ1QoIF9fY2F0Y2hSZXN1bHQgKSBcCisgICAgfSB3aGlsZSggQ2F0Y2g6OmFsd2F5c0ZhbHNlKCkgKQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX1RIUk9XU19BUyggbWFjcm9OYW1lLCBleGNlcHRpb25UeXBlLCByZXN1bHREaXNwb3NpdGlvbiwgZXhwciApIFwKKyAgICBkbyB7IFwKKyAgICAgICAgQ2F0Y2g6OlJlc3VsdEJ1aWxkZXIgX19jYXRjaFJlc3VsdCggbWFjcm9OYW1lLCBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTywgI2V4cHIgIiwgIiAjZXhjZXB0aW9uVHlwZSwgcmVzdWx0RGlzcG9zaXRpb24gKTsgXAorICAgICAgICBpZiggX19jYXRjaFJlc3VsdC5hbGxvd1Rocm93cygpICkgXAorICAgICAgICAgICAgdHJ5IHsgXAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHZvaWQ+KGV4cHIpOyBcCisgICAgICAgICAgICAgICAgX19jYXRjaFJlc3VsdC5jYXB0dXJlUmVzdWx0KCBDYXRjaDo6UmVzdWx0V2FzOjpEaWRudFRocm93RXhjZXB0aW9uICk7IFwKKyAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgY2F0Y2goIGV4Y2VwdGlvblR5cGUgKSB7IFwKKyAgICAgICAgICAgICAgICBfX2NhdGNoUmVzdWx0LmNhcHR1cmVSZXN1bHQoIENhdGNoOjpSZXN1bHRXYXM6Ok9rICk7IFwKKyAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgY2F0Y2goIC4uLiApIHsgXAorICAgICAgICAgICAgICAgIF9fY2F0Y2hSZXN1bHQudXNlQWN0aXZlRXhjZXB0aW9uKCByZXN1bHREaXNwb3NpdGlvbiApOyBcCisgICAgICAgICAgICB9IFwKKyAgICAgICAgZWxzZSBcCisgICAgICAgICAgICBfX2NhdGNoUmVzdWx0LmNhcHR1cmVSZXN1bHQoIENhdGNoOjpSZXN1bHRXYXM6Ok9rICk7IFwKKyAgICAgICAgSU5URVJOQUxfQ0FUQ0hfUkVBQ1QoIF9fY2F0Y2hSZXN1bHQgKSBcCisgICAgfSB3aGlsZSggQ2F0Y2g6OmFsd2F5c0ZhbHNlKCkgKQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisjaWZkZWYgQ0FUQ0hfQ09ORklHX1ZBUklBRElDX01BQ1JPUworICAgICNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfTVNHKCBtYWNyb05hbWUsIG1lc3NhZ2VUeXBlLCByZXN1bHREaXNwb3NpdGlvbiwgLi4uICkgXAorICAgICAgICBkbyB7IFwKKyAgICAgICAgICAgIENhdGNoOjpSZXN1bHRCdWlsZGVyIF9fY2F0Y2hSZXN1bHQoIG1hY3JvTmFtZSwgQ0FUQ0hfSU5URVJOQUxfTElORUlORk8sICIiLCByZXN1bHREaXNwb3NpdGlvbiApOyBcCisgICAgICAgICAgICBfX2NhdGNoUmVzdWx0IDw8IF9fVkFfQVJHU19fICsgOjpDYXRjaDo6U3RyZWFtRW5kU3RvcCgpOyBcCisgICAgICAgICAgICBfX2NhdGNoUmVzdWx0LmNhcHR1cmVSZXN1bHQoIG1lc3NhZ2VUeXBlICk7IFwKKyAgICAgICAgICAgIElOVEVSTkFMX0NBVENIX1JFQUNUKCBfX2NhdGNoUmVzdWx0ICkgXAorICAgICAgICB9IHdoaWxlKCBDYXRjaDo6YWx3YXlzRmFsc2UoKSApCisjZWxzZQorICAgICNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfTVNHKCBtYWNyb05hbWUsIG1lc3NhZ2VUeXBlLCByZXN1bHREaXNwb3NpdGlvbiwgbG9nICkgXAorICAgICAgICBkbyB7IFwKKyAgICAgICAgICAgIENhdGNoOjpSZXN1bHRCdWlsZGVyIF9fY2F0Y2hSZXN1bHQoIG1hY3JvTmFtZSwgQ0FUQ0hfSU5URVJOQUxfTElORUlORk8sICIiLCByZXN1bHREaXNwb3NpdGlvbiApOyBcCisgICAgICAgICAgICBfX2NhdGNoUmVzdWx0IDw8IGxvZyArIDo6Q2F0Y2g6OlN0cmVhbUVuZFN0b3AoKTsgXAorICAgICAgICAgICAgX19jYXRjaFJlc3VsdC5jYXB0dXJlUmVzdWx0KCBtZXNzYWdlVHlwZSApOyBcCisgICAgICAgICAgICBJTlRFUk5BTF9DQVRDSF9SRUFDVCggX19jYXRjaFJlc3VsdCApIFwKKyAgICAgICAgfSB3aGlsZSggQ2F0Y2g6OmFsd2F5c0ZhbHNlKCkgKQorI2VuZGlmCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfSU5GTyggbWFjcm9OYW1lLCBsb2cgKSBcCisgICAgQ2F0Y2g6OlNjb3BlZE1lc3NhZ2UgSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIHNjb3BlZE1lc3NhZ2UgKSA9IENhdGNoOjpNZXNzYWdlQnVpbGRlciggbWFjcm9OYW1lLCBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTywgQ2F0Y2g6OlJlc3VsdFdhczo6SW5mbyApIDw8IGxvZzsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworI2RlZmluZSBJTlRFUk5BTF9DSEVDS19USEFUKCBtYWNyb05hbWUsIG1hdGNoZXIsIHJlc3VsdERpc3Bvc2l0aW9uLCBhcmcgKSBcCisgICAgZG8geyBcCisgICAgICAgIENhdGNoOjpSZXN1bHRCdWlsZGVyIF9fY2F0Y2hSZXN1bHQoIG1hY3JvTmFtZSwgQ0FUQ0hfSU5URVJOQUxfTElORUlORk8sICNhcmcgIiwgIiAjbWF0Y2hlciwgcmVzdWx0RGlzcG9zaXRpb24gKTsgXAorICAgICAgICB0cnkgeyBcCisgICAgICAgICAgICBfX2NhdGNoUmVzdWx0LmNhcHR1cmVNYXRjaCggYXJnLCBtYXRjaGVyLCAjbWF0Y2hlciApOyBcCisgICAgICAgIH0gY2F0Y2goIC4uLiApIHsgXAorICAgICAgICAgICAgX19jYXRjaFJlc3VsdC51c2VBY3RpdmVFeGNlcHRpb24oIHJlc3VsdERpc3Bvc2l0aW9uIHwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSApOyBcCisgICAgICAgIH0gXAorICAgICAgICBJTlRFUk5BTF9DQVRDSF9SRUFDVCggX19jYXRjaFJlc3VsdCApIFwKKyAgICB9IHdoaWxlKCBDYXRjaDo6YWx3YXlzRmFsc2UoKSApCisKKy8vICNpbmNsdWRlZCBmcm9tOiBpbnRlcm5hbC9jYXRjaF9zZWN0aW9uLmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1NFQ1RJT05fSF9JTkNMVURFRAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfc2VjdGlvbl9pbmZvLmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1NFQ1RJT05fSU5GT19IX0lOQ0xVREVECisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF90b3RhbHMuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9UT1RBTFNfSFBQX0lOQ0xVREVECisKKyNpbmNsdWRlIDxjc3RkZGVmPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgc3RydWN0IENvdW50cyB7CisgICAgICAgIENvdW50cygpIDogcGFzc2VkKCAwICksIGZhaWxlZCggMCApLCBmYWlsZWRCdXRPayggMCApIHt9CisKKyAgICAgICAgQ291bnRzIG9wZXJhdG9yIC0gKCBDb3VudHMgY29uc3QmIG90aGVyICkgY29uc3QgeworICAgICAgICAgICAgQ291bnRzIGRpZmY7CisgICAgICAgICAgICBkaWZmLnBhc3NlZCA9IHBhc3NlZCAtIG90aGVyLnBhc3NlZDsKKyAgICAgICAgICAgIGRpZmYuZmFpbGVkID0gZmFpbGVkIC0gb3RoZXIuZmFpbGVkOworICAgICAgICAgICAgZGlmZi5mYWlsZWRCdXRPayA9IGZhaWxlZEJ1dE9rIC0gb3RoZXIuZmFpbGVkQnV0T2s7CisgICAgICAgICAgICByZXR1cm4gZGlmZjsKKyAgICAgICAgfQorICAgICAgICBDb3VudHMmIG9wZXJhdG9yICs9ICggQ291bnRzIGNvbnN0JiBvdGhlciApIHsKKyAgICAgICAgICAgIHBhc3NlZCArPSBvdGhlci5wYXNzZWQ7CisgICAgICAgICAgICBmYWlsZWQgKz0gb3RoZXIuZmFpbGVkOworICAgICAgICAgICAgZmFpbGVkQnV0T2sgKz0gb3RoZXIuZmFpbGVkQnV0T2s7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICBzdGQ6OnNpemVfdCB0b3RhbCgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBwYXNzZWQgKyBmYWlsZWQgKyBmYWlsZWRCdXRPazsKKyAgICAgICAgfQorICAgICAgICBib29sIGFsbFBhc3NlZCgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBmYWlsZWQgPT0gMCAmJiBmYWlsZWRCdXRPayA9PSAwOworICAgICAgICB9CisgICAgICAgIGJvb2wgYWxsT2soKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gZmFpbGVkID09IDA7CisgICAgICAgIH0KKworICAgICAgICBzdGQ6OnNpemVfdCBwYXNzZWQ7CisgICAgICAgIHN0ZDo6c2l6ZV90IGZhaWxlZDsKKyAgICAgICAgc3RkOjpzaXplX3QgZmFpbGVkQnV0T2s7CisgICAgfTsKKworICAgIHN0cnVjdCBUb3RhbHMgeworCisgICAgICAgIFRvdGFscyBvcGVyYXRvciAtICggVG90YWxzIGNvbnN0JiBvdGhlciApIGNvbnN0IHsKKyAgICAgICAgICAgIFRvdGFscyBkaWZmOworICAgICAgICAgICAgZGlmZi5hc3NlcnRpb25zID0gYXNzZXJ0aW9ucyAtIG90aGVyLmFzc2VydGlvbnM7CisgICAgICAgICAgICBkaWZmLnRlc3RDYXNlcyA9IHRlc3RDYXNlcyAtIG90aGVyLnRlc3RDYXNlczsKKyAgICAgICAgICAgIHJldHVybiBkaWZmOworICAgICAgICB9CisKKyAgICAgICAgVG90YWxzIGRlbHRhKCBUb3RhbHMgY29uc3QmIHByZXZUb3RhbHMgKSBjb25zdCB7CisgICAgICAgICAgICBUb3RhbHMgZGlmZiA9ICp0aGlzIC0gcHJldlRvdGFsczsKKyAgICAgICAgICAgIGlmKCBkaWZmLmFzc2VydGlvbnMuZmFpbGVkID4gMCApCisgICAgICAgICAgICAgICAgKytkaWZmLnRlc3RDYXNlcy5mYWlsZWQ7CisgICAgICAgICAgICBlbHNlIGlmKCBkaWZmLmFzc2VydGlvbnMuZmFpbGVkQnV0T2sgPiAwICkKKyAgICAgICAgICAgICAgICArK2RpZmYudGVzdENhc2VzLmZhaWxlZEJ1dE9rOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICsrZGlmZi50ZXN0Q2FzZXMucGFzc2VkOworICAgICAgICAgICAgcmV0dXJuIGRpZmY7CisgICAgICAgIH0KKworICAgICAgICBUb3RhbHMmIG9wZXJhdG9yICs9ICggVG90YWxzIGNvbnN0JiBvdGhlciApIHsKKyAgICAgICAgICAgIGFzc2VydGlvbnMgKz0gb3RoZXIuYXNzZXJ0aW9uczsKKyAgICAgICAgICAgIHRlc3RDYXNlcyArPSBvdGhlci50ZXN0Q2FzZXM7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICBDb3VudHMgYXNzZXJ0aW9uczsKKyAgICAgICAgQ291bnRzIHRlc3RDYXNlczsKKyAgICB9OworfQorCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgc3RydWN0IFNlY3Rpb25JbmZvIHsKKyAgICAgICAgU2VjdGlvbkluZm8KKyAgICAgICAgICAgICggICBTb3VyY2VMaW5lSW5mbyBjb25zdCYgX2xpbmVJbmZvLAorICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBfbmFtZSwKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgX2Rlc2NyaXB0aW9uID0gc3RkOjpzdHJpbmcoKSApOworCisgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWU7CisgICAgICAgIHN0ZDo6c3RyaW5nIGRlc2NyaXB0aW9uOworICAgICAgICBTb3VyY2VMaW5lSW5mbyBsaW5lSW5mbzsKKyAgICB9OworCisgICAgc3RydWN0IFNlY3Rpb25FbmRJbmZvIHsKKyAgICAgICAgU2VjdGlvbkVuZEluZm8oIFNlY3Rpb25JbmZvIGNvbnN0JiBfc2VjdGlvbkluZm8sIENvdW50cyBjb25zdCYgX3ByZXZBc3NlcnRpb25zLCBkb3VibGUgX2R1cmF0aW9uSW5TZWNvbmRzICkKKyAgICAgICAgOiBzZWN0aW9uSW5mbyggX3NlY3Rpb25JbmZvICksIHByZXZBc3NlcnRpb25zKCBfcHJldkFzc2VydGlvbnMgKSwgZHVyYXRpb25JblNlY29uZHMoIF9kdXJhdGlvbkluU2Vjb25kcyApCisgICAgICAgIHt9CisKKyAgICAgICAgU2VjdGlvbkluZm8gc2VjdGlvbkluZm87CisgICAgICAgIENvdW50cyBwcmV2QXNzZXJ0aW9uczsKKyAgICAgICAgZG91YmxlIGR1cmF0aW9uSW5TZWNvbmRzOworICAgIH07CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfdGltZXIuaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfVElNRVJfSF9JTkNMVURFRAorCisjaWZkZWYgX01TQ19WRVIKKworbmFtZXNwYWNlIENhdGNoIHsKKyAgICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBVSW50NjQ7Cit9CisjZWxzZQorI2luY2x1ZGUgPHN0ZGludC5oPgorbmFtZXNwYWNlIENhdGNoIHsKKyAgICB0eXBlZGVmIHVpbnQ2NF90IFVJbnQ2NDsKK30KKyNlbmRpZgorCituYW1lc3BhY2UgQ2F0Y2ggeworICAgIGNsYXNzIFRpbWVyIHsKKyAgICBwdWJsaWM6CisgICAgICAgIFRpbWVyKCkgOiBtX3RpY2tzKCAwICkge30KKyAgICAgICAgdm9pZCBzdGFydCgpOworICAgICAgICB1bnNpZ25lZCBpbnQgZ2V0RWxhcHNlZE1pY3Jvc2Vjb25kcygpIGNvbnN0OworICAgICAgICB1bnNpZ25lZCBpbnQgZ2V0RWxhcHNlZE1pbGxpc2Vjb25kcygpIGNvbnN0OworICAgICAgICBkb3VibGUgZ2V0RWxhcHNlZFNlY29uZHMoKSBjb25zdDsKKworICAgIHByaXZhdGU6CisgICAgICAgIFVJbnQ2NCBtX3RpY2tzOworICAgIH07CisKK30gLy8gbmFtZXNwYWNlIENhdGNoCisKKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBjbGFzcyBTZWN0aW9uIDogTm9uQ29weWFibGUgeworICAgIHB1YmxpYzoKKyAgICAgICAgU2VjdGlvbiggU2VjdGlvbkluZm8gY29uc3QmIGluZm8gKTsKKyAgICAgICAgflNlY3Rpb24oKTsKKworICAgICAgICAvLyBUaGlzIGluZGljYXRlcyB3aGV0aGVyIHRoZSBzZWN0aW9uIHNob3VsZCBiZSBleGVjdXRlZCBvciBub3QKKyAgICAgICAgb3BlcmF0b3IgYm9vbCgpIGNvbnN0OworCisgICAgcHJpdmF0ZToKKyAgICAgICAgU2VjdGlvbkluZm8gbV9pbmZvOworCisgICAgICAgIHN0ZDo6c3RyaW5nIG1fbmFtZTsKKyAgICAgICAgQ291bnRzIG1fYXNzZXJ0aW9uczsKKyAgICAgICAgYm9vbCBtX3NlY3Rpb25JbmNsdWRlZDsKKyAgICAgICAgVGltZXIgbV90aW1lcjsKKyAgICB9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworI2lmZGVmIENBVENIX0NPTkZJR19WQVJJQURJQ19NQUNST1MKKyAgICAjZGVmaW5lIElOVEVSTkFMX0NBVENIX1NFQ1RJT04oIC4uLiApIFwKKyAgICAgICAgaWYoIENhdGNoOjpTZWN0aW9uIGNvbnN0JiBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggY2F0Y2hfaW50ZXJuYWxfU2VjdGlvbiApID0gQ2F0Y2g6OlNlY3Rpb25JbmZvKCBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTywgX19WQV9BUkdTX18gKSApCisjZWxzZQorICAgICNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfU0VDVElPTiggbmFtZSwgZGVzYyApIFwKKyAgICAgICAgaWYoIENhdGNoOjpTZWN0aW9uIGNvbnN0JiBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggY2F0Y2hfaW50ZXJuYWxfU2VjdGlvbiApID0gQ2F0Y2g6OlNlY3Rpb25JbmZvKCBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTywgbmFtZSwgZGVzYyApICkKKyNlbmRpZgorCisvLyAjaW5jbHVkZWQgZnJvbTogaW50ZXJuYWwvY2F0Y2hfZ2VuZXJhdG9ycy5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0dFTkVSQVRPUlNfSFBQX0lOQ0xVREVECisKKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IElHZW5lcmF0b3IgeworICAgIHZpcnR1YWwgfklHZW5lcmF0b3IoKSB7fQorICAgIHZpcnR1YWwgVCBnZXRWYWx1ZSggc3RkOjpzaXplX3QgaW5kZXggKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBzdGQ6OnNpemVfdCBzaXplICgpIGNvbnN0ID0gMDsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitjbGFzcyBCZXR3ZWVuR2VuZXJhdG9yIDogcHVibGljIElHZW5lcmF0b3I8VD4geworcHVibGljOgorICAgIEJldHdlZW5HZW5lcmF0b3IoIFQgZnJvbSwgVCB0byApIDogbV9mcm9tKCBmcm9tICksIG1fdG8oIHRvICl7fQorCisgICAgdmlydHVhbCBUIGdldFZhbHVlKCBzdGQ6OnNpemVfdCBpbmRleCApIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1fZnJvbStzdGF0aWNfY2FzdDxpbnQ+KCBpbmRleCApOworICAgIH0KKworICAgIHZpcnR1YWwgc3RkOjpzaXplX3Qgc2l6ZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHN0ZDo6c2l6ZV90PiggMSttX3RvLW1fZnJvbSApOworICAgIH0KKworcHJpdmF0ZToKKworICAgIFQgbV9mcm9tOworICAgIFQgbV90bzsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitjbGFzcyBWYWx1ZXNHZW5lcmF0b3IgOiBwdWJsaWMgSUdlbmVyYXRvcjxUPiB7CitwdWJsaWM6CisgICAgVmFsdWVzR2VuZXJhdG9yKCl7fQorCisgICAgdm9pZCBhZGQoIFQgdmFsdWUgKSB7CisgICAgICAgIG1fdmFsdWVzLnB1c2hfYmFjayggdmFsdWUgKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIFQgZ2V0VmFsdWUoIHN0ZDo6c2l6ZV90IGluZGV4ICkgY29uc3QgeworICAgICAgICByZXR1cm4gbV92YWx1ZXNbaW5kZXhdOworICAgIH0KKworICAgIHZpcnR1YWwgc3RkOjpzaXplX3Qgc2l6ZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1fdmFsdWVzLnNpemUoKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3RkOjp2ZWN0b3I8VD4gbV92YWx1ZXM7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY2xhc3MgQ29tcG9zaXRlR2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgICBDb21wb3NpdGVHZW5lcmF0b3IoKSA6IG1fdG90YWxTaXplKCAwICkge30KKworICAgIC8vICoqKiBNb3ZlIHNlbWFudGljcywgc2ltaWxhciB0byBhdXRvX3B0ciAqKioKKyAgICBDb21wb3NpdGVHZW5lcmF0b3IoIENvbXBvc2l0ZUdlbmVyYXRvciYgb3RoZXIgKQorICAgIDogICBtX2ZpbGVJbmZvKCBvdGhlci5tX2ZpbGVJbmZvICksCisgICAgICAgIG1fdG90YWxTaXplKCAwICkKKyAgICB7CisgICAgICAgIG1vdmUoIG90aGVyICk7CisgICAgfQorCisgICAgQ29tcG9zaXRlR2VuZXJhdG9yJiBzZXRGaWxlSW5mbyggY29uc3QgY2hhciogZmlsZUluZm8gKSB7CisgICAgICAgIG1fZmlsZUluZm8gPSBmaWxlSW5mbzsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIH5Db21wb3NpdGVHZW5lcmF0b3IoKSB7CisgICAgICAgIGRlbGV0ZUFsbCggbV9jb21wb3NlZCApOworICAgIH0KKworICAgIG9wZXJhdG9yIFQgKCkgY29uc3QgeworICAgICAgICBzaXplX3Qgb3ZlcmFsbEluZGV4ID0gZ2V0Q3VycmVudENvbnRleHQoKS5nZXRHZW5lcmF0b3JJbmRleCggbV9maWxlSW5mbywgbV90b3RhbFNpemUgKTsKKworICAgICAgICB0eXBlbmFtZSBzdGQ6OnZlY3Rvcjxjb25zdCBJR2VuZXJhdG9yPFQ+Kj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9jb21wb3NlZC5iZWdpbigpOworICAgICAgICB0eXBlbmFtZSBzdGQ6OnZlY3Rvcjxjb25zdCBJR2VuZXJhdG9yPFQ+Kj46OmNvbnN0X2l0ZXJhdG9yIGl0RW5kID0gbV9jb21wb3NlZC5lbmQoKTsKKyAgICAgICAgZm9yKCBzaXplX3QgaW5kZXggPSAwOyBpdCAhPSBpdEVuZDsgKytpdCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IElHZW5lcmF0b3I8VD4qIGdlbmVyYXRvciA9ICppdDsKKyAgICAgICAgICAgIGlmKCBvdmVyYWxsSW5kZXggPj0gaW5kZXggJiYgb3ZlcmFsbEluZGV4IDwgaW5kZXggKyBnZW5lcmF0b3ItPnNpemUoKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRvci0+Z2V0VmFsdWUoIG92ZXJhbGxJbmRleC1pbmRleCApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5kZXggKz0gZ2VuZXJhdG9yLT5zaXplKCk7CisgICAgICAgIH0KKyAgICAgICAgQ0FUQ0hfSU5URVJOQUxfRVJST1IoICJJbmRleGVkIHBhc3QgZW5kIG9mIGdlbmVyYXRlZCByYW5nZSIgKTsKKyAgICAgICAgcmV0dXJuIFQoKTsgLy8gU3VwcHJlc3Mgc3B1cmlvdXMgIm5vdCBhbGwgY29udHJvbCBwYXRocyByZXR1cm4gYSB2YWx1ZSIgd2FybmluZyBpbiBWaXN1YWwgU3R1ZGlvIC0gaWYgeW91IGtub3cgaG93IHRvIGZpeCB0aGlzIHBsZWFzZSBkbyBzbworICAgIH0KKworICAgIHZvaWQgYWRkKCBjb25zdCBJR2VuZXJhdG9yPFQ+KiBnZW5lcmF0b3IgKSB7CisgICAgICAgIG1fdG90YWxTaXplICs9IGdlbmVyYXRvci0+c2l6ZSgpOworICAgICAgICBtX2NvbXBvc2VkLnB1c2hfYmFjayggZ2VuZXJhdG9yICk7CisgICAgfQorCisgICAgQ29tcG9zaXRlR2VuZXJhdG9yJiB0aGVuKCBDb21wb3NpdGVHZW5lcmF0b3ImIG90aGVyICkgeworICAgICAgICBtb3ZlKCBvdGhlciApOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQ29tcG9zaXRlR2VuZXJhdG9yJiB0aGVuKCBUIHZhbHVlICkgeworICAgICAgICBWYWx1ZXNHZW5lcmF0b3I8VD4qIHZhbHVlc0dlbiA9IG5ldyBWYWx1ZXNHZW5lcmF0b3I8VD4oKTsKKyAgICAgICAgdmFsdWVzR2VuLT5hZGQoIHZhbHVlICk7CisgICAgICAgIGFkZCggdmFsdWVzR2VuICk7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKK3ByaXZhdGU6CisKKyAgICB2b2lkIG1vdmUoIENvbXBvc2l0ZUdlbmVyYXRvciYgb3RoZXIgKSB7CisgICAgICAgIG1fY29tcG9zZWQuaW5zZXJ0KCBtX2NvbXBvc2VkLmVuZCgpLCBvdGhlci5tX2NvbXBvc2VkLmJlZ2luKCksIG90aGVyLm1fY29tcG9zZWQuZW5kKCkgKTsKKyAgICAgICAgbV90b3RhbFNpemUgKz0gb3RoZXIubV90b3RhbFNpemU7CisgICAgICAgIG90aGVyLm1fY29tcG9zZWQuY2xlYXIoKTsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3Rvcjxjb25zdCBJR2VuZXJhdG9yPFQ+Kj4gbV9jb21wb3NlZDsKKyAgICBzdGQ6OnN0cmluZyBtX2ZpbGVJbmZvOworICAgIHNpemVfdCBtX3RvdGFsU2l6ZTsKK307CisKK25hbWVzcGFjZSBHZW5lcmF0b3JzCit7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBDb21wb3NpdGVHZW5lcmF0b3I8VD4gYmV0d2VlbiggVCBmcm9tLCBUIHRvICkgeworICAgICAgICBDb21wb3NpdGVHZW5lcmF0b3I8VD4gZ2VuZXJhdG9yczsKKyAgICAgICAgZ2VuZXJhdG9ycy5hZGQoIG5ldyBCZXR3ZWVuR2VuZXJhdG9yPFQ+KCBmcm9tLCB0byApICk7CisgICAgICAgIHJldHVybiBnZW5lcmF0b3JzOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgQ29tcG9zaXRlR2VuZXJhdG9yPFQ+IHZhbHVlcyggVCB2YWwxLCBUIHZhbDIgKSB7CisgICAgICAgIENvbXBvc2l0ZUdlbmVyYXRvcjxUPiBnZW5lcmF0b3JzOworICAgICAgICBWYWx1ZXNHZW5lcmF0b3I8VD4qIHZhbHVlc0dlbiA9IG5ldyBWYWx1ZXNHZW5lcmF0b3I8VD4oKTsKKyAgICAgICAgdmFsdWVzR2VuLT5hZGQoIHZhbDEgKTsKKyAgICAgICAgdmFsdWVzR2VuLT5hZGQoIHZhbDIgKTsKKyAgICAgICAgZ2VuZXJhdG9ycy5hZGQoIHZhbHVlc0dlbiApOworICAgICAgICByZXR1cm4gZ2VuZXJhdG9yczsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIENvbXBvc2l0ZUdlbmVyYXRvcjxUPiB2YWx1ZXMoIFQgdmFsMSwgVCB2YWwyLCBUIHZhbDMgKXsKKyAgICAgICAgQ29tcG9zaXRlR2VuZXJhdG9yPFQ+IGdlbmVyYXRvcnM7CisgICAgICAgIFZhbHVlc0dlbmVyYXRvcjxUPiogdmFsdWVzR2VuID0gbmV3IFZhbHVlc0dlbmVyYXRvcjxUPigpOworICAgICAgICB2YWx1ZXNHZW4tPmFkZCggdmFsMSApOworICAgICAgICB2YWx1ZXNHZW4tPmFkZCggdmFsMiApOworICAgICAgICB2YWx1ZXNHZW4tPmFkZCggdmFsMyApOworICAgICAgICBnZW5lcmF0b3JzLmFkZCggdmFsdWVzR2VuICk7CisgICAgICAgIHJldHVybiBnZW5lcmF0b3JzOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgQ29tcG9zaXRlR2VuZXJhdG9yPFQ+IHZhbHVlcyggVCB2YWwxLCBUIHZhbDIsIFQgdmFsMywgVCB2YWw0ICkgeworICAgICAgICBDb21wb3NpdGVHZW5lcmF0b3I8VD4gZ2VuZXJhdG9yczsKKyAgICAgICAgVmFsdWVzR2VuZXJhdG9yPFQ+KiB2YWx1ZXNHZW4gPSBuZXcgVmFsdWVzR2VuZXJhdG9yPFQ+KCk7CisgICAgICAgIHZhbHVlc0dlbi0+YWRkKCB2YWwxICk7CisgICAgICAgIHZhbHVlc0dlbi0+YWRkKCB2YWwyICk7CisgICAgICAgIHZhbHVlc0dlbi0+YWRkKCB2YWwzICk7CisgICAgICAgIHZhbHVlc0dlbi0+YWRkKCB2YWw0ICk7CisgICAgICAgIGdlbmVyYXRvcnMuYWRkKCB2YWx1ZXNHZW4gKTsKKyAgICAgICAgcmV0dXJuIGdlbmVyYXRvcnM7CisgICAgfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgR2VuZXJhdG9ycworCit1c2luZyBuYW1lc3BhY2UgR2VuZXJhdG9yczsKKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfTElORVNUUjIoIGxpbmUgKSAjbGluZQorI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9MSU5FU1RSKCBsaW5lICkgSU5URVJOQUxfQ0FUQ0hfTElORVNUUjIoIGxpbmUgKQorCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX0dFTkVSQVRFKCBleHByICkgZXhwci5zZXRGaWxlSW5mbyggX19GSUxFX18gIigiIElOVEVSTkFMX0NBVENIX0xJTkVTVFIoIF9fTElORV9fICkgIikiICkKKworLy8gI2luY2x1ZGVkIGZyb206IGludGVybmFsL2NhdGNoX2ludGVyZmFjZXNfZXhjZXB0aW9uLmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0lOVEVSRkFDRVNfRVhDRVBUSU9OX0hfSU5DTFVERUQKKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9pbnRlcmZhY2VzX3JlZ2lzdHJ5X2h1Yi5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9JTlRFUkZBQ0VTX1JFR0lTVFJZX0hVQl9IX0lOQ0xVREVECisKKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBjbGFzcyBUZXN0Q2FzZTsKKyAgICBzdHJ1Y3QgSVRlc3RDYXNlUmVnaXN0cnk7CisgICAgc3RydWN0IElFeGNlcHRpb25UcmFuc2xhdG9yUmVnaXN0cnk7CisgICAgc3RydWN0IElFeGNlcHRpb25UcmFuc2xhdG9yOworICAgIHN0cnVjdCBJUmVwb3J0ZXJSZWdpc3RyeTsKKyAgICBzdHJ1Y3QgSVJlcG9ydGVyRmFjdG9yeTsKKyAgICBzdHJ1Y3QgSVRhZ0FsaWFzUmVnaXN0cnk7CisKKyAgICBzdHJ1Y3QgSVJlZ2lzdHJ5SHViIHsKKyAgICAgICAgdmlydHVhbCB+SVJlZ2lzdHJ5SHViKCk7CisKKyAgICAgICAgdmlydHVhbCBJUmVwb3J0ZXJSZWdpc3RyeSBjb25zdCYgZ2V0UmVwb3J0ZXJSZWdpc3RyeSgpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBJVGVzdENhc2VSZWdpc3RyeSBjb25zdCYgZ2V0VGVzdENhc2VSZWdpc3RyeSgpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBJVGFnQWxpYXNSZWdpc3RyeSBjb25zdCYgZ2V0VGFnQWxpYXNSZWdpc3RyeSgpIGNvbnN0ID0gMDsKKworICAgICAgICB2aXJ0dWFsIElFeGNlcHRpb25UcmFuc2xhdG9yUmVnaXN0cnkmIGdldEV4Y2VwdGlvblRyYW5zbGF0b3JSZWdpc3RyeSgpID0gMDsKKyAgICB9OworCisgICAgc3RydWN0IElNdXRhYmxlUmVnaXN0cnlIdWIgeworICAgICAgICB2aXJ0dWFsIH5JTXV0YWJsZVJlZ2lzdHJ5SHViKCk7CisgICAgICAgIHZpcnR1YWwgdm9pZCByZWdpc3RlclJlcG9ydGVyKCBzdGQ6OnN0cmluZyBjb25zdCYgbmFtZSwgUHRyPElSZXBvcnRlckZhY3Rvcnk+IGNvbnN0JiBmYWN0b3J5ICkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgcmVnaXN0ZXJMaXN0ZW5lciggUHRyPElSZXBvcnRlckZhY3Rvcnk+IGNvbnN0JiBmYWN0b3J5ICkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgcmVnaXN0ZXJUZXN0KCBUZXN0Q2FzZSBjb25zdCYgdGVzdEluZm8gKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCByZWdpc3RlclRyYW5zbGF0b3IoIGNvbnN0IElFeGNlcHRpb25UcmFuc2xhdG9yKiB0cmFuc2xhdG9yICkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgcmVnaXN0ZXJUYWdBbGlhcyggc3RkOjpzdHJpbmcgY29uc3QmIGFsaWFzLCBzdGQ6OnN0cmluZyBjb25zdCYgdGFnLCBTb3VyY2VMaW5lSW5mbyBjb25zdCYgbGluZUluZm8gKSA9IDA7CisgICAgfTsKKworICAgIElSZWdpc3RyeUh1YiYgZ2V0UmVnaXN0cnlIdWIoKTsKKyAgICBJTXV0YWJsZVJlZ2lzdHJ5SHViJiBnZXRNdXRhYmxlUmVnaXN0cnlIdWIoKTsKKyAgICB2b2lkIGNsZWFuVXAoKTsKKyAgICBzdGQ6OnN0cmluZyB0cmFuc2xhdGVBY3RpdmVFeGNlcHRpb24oKTsKKworfQorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgdHlwZWRlZiBzdGQ6OnN0cmluZygqZXhjZXB0aW9uVHJhbnNsYXRlRnVuY3Rpb24pKCk7CisKKyAgICBzdHJ1Y3QgSUV4Y2VwdGlvblRyYW5zbGF0b3I7CisgICAgdHlwZWRlZiBzdGQ6OnZlY3Rvcjxjb25zdCBJRXhjZXB0aW9uVHJhbnNsYXRvcio+IEV4Y2VwdGlvblRyYW5zbGF0b3JzOworCisgICAgc3RydWN0IElFeGNlcHRpb25UcmFuc2xhdG9yIHsKKyAgICAgICAgdmlydHVhbCB+SUV4Y2VwdGlvblRyYW5zbGF0b3IoKTsKKyAgICAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyB0cmFuc2xhdGUoIEV4Y2VwdGlvblRyYW5zbGF0b3JzOjpjb25zdF9pdGVyYXRvciBpdCwgRXhjZXB0aW9uVHJhbnNsYXRvcnM6OmNvbnN0X2l0ZXJhdG9yIGl0RW5kICkgY29uc3QgPSAwOworICAgIH07CisKKyAgICBzdHJ1Y3QgSUV4Y2VwdGlvblRyYW5zbGF0b3JSZWdpc3RyeSB7CisgICAgICAgIHZpcnR1YWwgfklFeGNlcHRpb25UcmFuc2xhdG9yUmVnaXN0cnkoKTsKKworICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIHRyYW5zbGF0ZUFjdGl2ZUV4Y2VwdGlvbigpIGNvbnN0ID0gMDsKKyAgICB9OworCisgICAgY2xhc3MgRXhjZXB0aW9uVHJhbnNsYXRvclJlZ2lzdHJhciB7CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgICAgIGNsYXNzIEV4Y2VwdGlvblRyYW5zbGF0b3IgOiBwdWJsaWMgSUV4Y2VwdGlvblRyYW5zbGF0b3IgeworICAgICAgICBwdWJsaWM6CisKKyAgICAgICAgICAgIEV4Y2VwdGlvblRyYW5zbGF0b3IoIHN0ZDo6c3RyaW5nKCp0cmFuc2xhdGVGdW5jdGlvbikoIFQmICkgKQorICAgICAgICAgICAgOiBtX3RyYW5zbGF0ZUZ1bmN0aW9uKCB0cmFuc2xhdGVGdW5jdGlvbiApCisgICAgICAgICAgICB7fQorCisgICAgICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIHRyYW5zbGF0ZSggRXhjZXB0aW9uVHJhbnNsYXRvcnM6OmNvbnN0X2l0ZXJhdG9yIGl0LCBFeGNlcHRpb25UcmFuc2xhdG9yczo6Y29uc3RfaXRlcmF0b3IgaXRFbmQgKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIGl0ID09IGl0RW5kICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93OworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCppdCktPnRyYW5zbGF0ZSggaXQrMSwgaXRFbmQgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2goIFQmIGV4ICkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbV90cmFuc2xhdGVGdW5jdGlvbiggZXggKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkOgorICAgICAgICAgICAgc3RkOjpzdHJpbmcoKm1fdHJhbnNsYXRlRnVuY3Rpb24pKCBUJiApOworICAgICAgICB9OworCisgICAgcHVibGljOgorICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICBFeGNlcHRpb25UcmFuc2xhdG9yUmVnaXN0cmFyKCBzdGQ6OnN0cmluZygqdHJhbnNsYXRlRnVuY3Rpb24pKCBUJiApICkgeworICAgICAgICAgICAgZ2V0TXV0YWJsZVJlZ2lzdHJ5SHViKCkucmVnaXN0ZXJUcmFuc2xhdG9yCisgICAgICAgICAgICAgICAgKCBuZXcgRXhjZXB0aW9uVHJhbnNsYXRvcjxUPiggdHJhbnNsYXRlRnVuY3Rpb24gKSApOworICAgICAgICB9CisgICAgfTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9UUkFOU0xBVEVfRVhDRVBUSU9OMiggdHJhbnNsYXRvck5hbWUsIHNpZ25hdHVyZSApIFwKKyAgICBzdGF0aWMgc3RkOjpzdHJpbmcgdHJhbnNsYXRvck5hbWUoIHNpZ25hdHVyZSApOyBcCisgICAgbmFtZXNwYWNleyBDYXRjaDo6RXhjZXB0aW9uVHJhbnNsYXRvclJlZ2lzdHJhciBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggY2F0Y2hfaW50ZXJuYWxfRXhjZXB0aW9uUmVnaXN0cmFyICkoICZ0cmFuc2xhdG9yTmFtZSApOyB9XAorICAgIHN0YXRpYyBzdGQ6OnN0cmluZyB0cmFuc2xhdG9yTmFtZSggc2lnbmF0dXJlICkKKworI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9UUkFOU0xBVEVfRVhDRVBUSU9OKCBzaWduYXR1cmUgKSBJTlRFUk5BTF9DQVRDSF9UUkFOU0xBVEVfRVhDRVBUSU9OMiggSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIGNhdGNoX2ludGVybmFsX0V4Y2VwdGlvblRyYW5zbGF0b3IgKSwgc2lnbmF0dXJlICkKKworLy8gI2luY2x1ZGVkIGZyb206IGludGVybmFsL2NhdGNoX2FwcHJveC5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0FQUFJPWF9IUFBfSU5DTFVERUQKKworI2luY2x1ZGUgPGNtYXRoPgorI2luY2x1ZGUgPGxpbWl0cz4KKworI2lmIGRlZmluZWQoQ0FUQ0hfQ09ORklHX0NQUDExX1RZUEVfVFJBSVRTKQorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorI2VuZGlmCisKK25hbWVzcGFjZSBDYXRjaCB7CituYW1lc3BhY2UgRGV0YWlsIHsKKworICAgIGNsYXNzIEFwcHJveCB7CisgICAgcHVibGljOgorICAgICAgICBleHBsaWNpdCBBcHByb3ggKCBkb3VibGUgdmFsdWUgKQorICAgICAgICA6ICAgbV9lcHNpbG9uKCBzdGQ6Om51bWVyaWNfbGltaXRzPGZsb2F0Pjo6ZXBzaWxvbigpKjEwMCApLAorICAgICAgICAgICAgbV9tYXJnaW4oIDAuMCApLAorICAgICAgICAgICAgbV9zY2FsZSggMS4wICksCisgICAgICAgICAgICBtX3ZhbHVlKCB2YWx1ZSApCisgICAgICAgIHt9CisKKyAgICAgICAgQXBwcm94KCBBcHByb3ggY29uc3QmIG90aGVyICkKKyAgICAgICAgOiAgIG1fZXBzaWxvbiggb3RoZXIubV9lcHNpbG9uICksCisgICAgICAgICAgICBtX21hcmdpbiggb3RoZXIubV9tYXJnaW4gKSwKKyAgICAgICAgICAgIG1fc2NhbGUoIG90aGVyLm1fc2NhbGUgKSwKKyAgICAgICAgICAgIG1fdmFsdWUoIG90aGVyLm1fdmFsdWUgKQorICAgICAgICB7fQorCisgICAgICAgIHN0YXRpYyBBcHByb3ggY3VzdG9tKCkgeworICAgICAgICAgICAgcmV0dXJuIEFwcHJveCggMCApOworICAgICAgICB9CisKKyNpZiBkZWZpbmVkKENBVENIX0NPTkZJR19DUFAxMV9UWVBFX1RSQUlUUykKKworICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgPSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnN0cnVjdGlibGU8ZG91YmxlLCBUPjo6dmFsdWU+Ojp0eXBlPgorICAgICAgICBBcHByb3ggb3BlcmF0b3IoKSggVCB2YWx1ZSApIHsKKyAgICAgICAgICAgIEFwcHJveCBhcHByb3goIHN0YXRpY19jYXN0PGRvdWJsZT4odmFsdWUpICk7CisgICAgICAgICAgICBhcHByb3guZXBzaWxvbiggbV9lcHNpbG9uICk7CisgICAgICAgICAgICBhcHByb3gubWFyZ2luKCBtX21hcmdpbiApOworICAgICAgICAgICAgYXBwcm94LnNjYWxlKCBtX3NjYWxlICk7CisgICAgICAgICAgICByZXR1cm4gYXBwcm94OworICAgICAgICB9CisKKyAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb25zdHJ1Y3RpYmxlPGRvdWJsZSwgVD46OnZhbHVlPjo6dHlwZT4KKyAgICAgICAgZXhwbGljaXQgQXBwcm94KCBUIHZhbHVlICk6IEFwcHJveChzdGF0aWNfY2FzdDxkb3VibGU+KHZhbHVlKSkKKyAgICAgICAge30KKworICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgPSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnN0cnVjdGlibGU8ZG91YmxlLCBUPjo6dmFsdWU+Ojp0eXBlPgorICAgICAgICBmcmllbmQgYm9vbCBvcGVyYXRvciA9PSAoIGNvbnN0IFQmIGxocywgQXBwcm94IGNvbnN0JiByaHMgKSB7CisgICAgICAgICAgICAvLyBUaGFua3MgdG8gUmljaGFyZCBIYXJyaXMgZm9yIGhpcyBoZWxwIHJlZmluaW5nIHRoaXMgZm9ybXVsYQorICAgICAgICAgICAgYXV0byBsaHNfdiA9IGRvdWJsZShsaHMpOworICAgICAgICAgICAgYm9vbCByZWxhdGl2ZU9LID0gc3RkOjpmYWJzKGxoc192IC0gcmhzLm1fdmFsdWUpIDwgcmhzLm1fZXBzaWxvbiAqIChyaHMubV9zY2FsZSArIChzdGQ6Om1heCkoc3RkOjpmYWJzKGxoc192KSwgc3RkOjpmYWJzKHJocy5tX3ZhbHVlKSkpOworICAgICAgICAgICAgaWYgKHJlbGF0aXZlT0spIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzdGQ6OmZhYnMobGhzX3YgLSByaHMubV92YWx1ZSkgPCByaHMubV9tYXJnaW47CisgICAgICAgIH0KKworICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgPSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnN0cnVjdGlibGU8ZG91YmxlLCBUPjo6dmFsdWU+Ojp0eXBlPgorICAgICAgICBmcmllbmQgYm9vbCBvcGVyYXRvciA9PSAoIEFwcHJveCBjb25zdCYgbGhzLCBjb25zdCBUJiByaHMgKSB7CisgICAgICAgICAgICByZXR1cm4gb3BlcmF0b3I9PSggcmhzLCBsaHMgKTsKKyAgICAgICAgfQorCisgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSA9IHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29uc3RydWN0aWJsZTxkb3VibGUsIFQ+Ojp2YWx1ZT46OnR5cGU+CisgICAgICAgIGZyaWVuZCBib29sIG9wZXJhdG9yICE9ICggVCBsaHMsIEFwcHJveCBjb25zdCYgcmhzICkgeworICAgICAgICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCBsaHMsIHJocyApOworICAgICAgICB9CisKKyAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb25zdHJ1Y3RpYmxlPGRvdWJsZSwgVD46OnZhbHVlPjo6dHlwZT4KKyAgICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IgIT0gKCBBcHByb3ggY29uc3QmIGxocywgVCByaHMgKSB7CisgICAgICAgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocywgbGhzICk7CisgICAgICAgIH0KKworICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgPSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnN0cnVjdGlibGU8ZG91YmxlLCBUPjo6dmFsdWU+Ojp0eXBlPgorICAgICAgICBmcmllbmQgYm9vbCBvcGVyYXRvciA8PSAoIFQgbGhzLCBBcHByb3ggY29uc3QmIHJocyApIHsKKyAgICAgICAgICAgIHJldHVybiBkb3VibGUobGhzKSA8IHJocy5tX3ZhbHVlIHx8IGxocyA9PSByaHM7CisgICAgICAgIH0KKworICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgPSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnN0cnVjdGlibGU8ZG91YmxlLCBUPjo6dmFsdWU+Ojp0eXBlPgorICAgICAgICBmcmllbmQgYm9vbCBvcGVyYXRvciA8PSAoIEFwcHJveCBjb25zdCYgbGhzLCBUIHJocyApIHsKKyAgICAgICAgICAgIHJldHVybiBsaHMubV92YWx1ZSA8IGRvdWJsZShyaHMpIHx8IGxocyA9PSByaHM7CisgICAgICAgIH0KKworICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgPSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnN0cnVjdGlibGU8ZG91YmxlLCBUPjo6dmFsdWU+Ojp0eXBlPgorICAgICAgICBmcmllbmQgYm9vbCBvcGVyYXRvciA+PSAoIFQgbGhzLCBBcHByb3ggY29uc3QmIHJocyApIHsKKyAgICAgICAgICAgIHJldHVybiBkb3VibGUobGhzKSA+IHJocy5tX3ZhbHVlIHx8IGxocyA9PSByaHM7CisgICAgICAgIH0KKworICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgPSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnN0cnVjdGlibGU8ZG91YmxlLCBUPjo6dmFsdWU+Ojp0eXBlPgorICAgICAgICBmcmllbmQgYm9vbCBvcGVyYXRvciA+PSAoIEFwcHJveCBjb25zdCYgbGhzLCBUIHJocyApIHsKKyAgICAgICAgICAgIHJldHVybiBsaHMubV92YWx1ZSA+IGRvdWJsZShyaHMpIHx8IGxocyA9PSByaHM7CisgICAgICAgIH0KKworICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgPSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnN0cnVjdGlibGU8ZG91YmxlLCBUPjo6dmFsdWU+Ojp0eXBlPgorICAgICAgICBBcHByb3gmIGVwc2lsb24oIFQgbmV3RXBzaWxvbiApIHsKKyAgICAgICAgICAgIG1fZXBzaWxvbiA9IGRvdWJsZShuZXdFcHNpbG9uKTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSA9IHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29uc3RydWN0aWJsZTxkb3VibGUsIFQ+Ojp2YWx1ZT46OnR5cGU+CisgICAgICAgIEFwcHJveCYgbWFyZ2luKCBUIG5ld01hcmdpbiApIHsKKyAgICAgICAgICAgIG1fbWFyZ2luID0gZG91YmxlKG5ld01hcmdpbik7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgPSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnN0cnVjdGlibGU8ZG91YmxlLCBUPjo6dmFsdWU+Ojp0eXBlPgorICAgICAgICBBcHByb3gmIHNjYWxlKCBUIG5ld1NjYWxlICkgeworICAgICAgICAgICAgbV9zY2FsZSA9IGRvdWJsZShuZXdTY2FsZSk7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworI2Vsc2UKKworICAgICAgICBBcHByb3ggb3BlcmF0b3IoKSggZG91YmxlIHZhbHVlICkgeworICAgICAgICAgICAgQXBwcm94IGFwcHJveCggdmFsdWUgKTsKKyAgICAgICAgICAgIGFwcHJveC5lcHNpbG9uKCBtX2Vwc2lsb24gKTsKKyAgICAgICAgICAgIGFwcHJveC5tYXJnaW4oIG1fbWFyZ2luICk7CisgICAgICAgICAgICBhcHByb3guc2NhbGUoIG1fc2NhbGUgKTsKKyAgICAgICAgICAgIHJldHVybiBhcHByb3g7CisgICAgICAgIH0KKworICAgICAgICBmcmllbmQgYm9vbCBvcGVyYXRvciA9PSAoIGRvdWJsZSBsaHMsIEFwcHJveCBjb25zdCYgcmhzICkgeworICAgICAgICAgICAgLy8gVGhhbmtzIHRvIFJpY2hhcmQgSGFycmlzIGZvciBoaXMgaGVscCByZWZpbmluZyB0aGlzIGZvcm11bGEKKyAgICAgICAgICAgIGJvb2wgcmVsYXRpdmVPSyA9IHN0ZDo6ZmFicyggbGhzIC0gcmhzLm1fdmFsdWUgKSA8IHJocy5tX2Vwc2lsb24gKiAocmhzLm1fc2NhbGUgKyAoc3RkOjptYXgpKCBzdGQ6OmZhYnMobGhzKSwgc3RkOjpmYWJzKHJocy5tX3ZhbHVlKSApICk7CisgICAgICAgICAgICBpZiAocmVsYXRpdmVPSykgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHN0ZDo6ZmFicyhsaHMgLSByaHMubV92YWx1ZSkgPCByaHMubV9tYXJnaW47CisgICAgICAgIH0KKworICAgICAgICBmcmllbmQgYm9vbCBvcGVyYXRvciA9PSAoIEFwcHJveCBjb25zdCYgbGhzLCBkb3VibGUgcmhzICkgeworICAgICAgICAgICAgcmV0dXJuIG9wZXJhdG9yPT0oIHJocywgbGhzICk7CisgICAgICAgIH0KKworICAgICAgICBmcmllbmQgYm9vbCBvcGVyYXRvciAhPSAoIGRvdWJsZSBsaHMsIEFwcHJveCBjb25zdCYgcmhzICkgeworICAgICAgICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCBsaHMsIHJocyApOworICAgICAgICB9CisKKyAgICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IgIT0gKCBBcHByb3ggY29uc3QmIGxocywgZG91YmxlIHJocyApIHsKKyAgICAgICAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzLCBsaHMgKTsKKyAgICAgICAgfQorCisgICAgICAgIGZyaWVuZCBib29sIG9wZXJhdG9yIDw9ICggZG91YmxlIGxocywgQXBwcm94IGNvbnN0JiByaHMgKSB7CisgICAgICAgICAgICByZXR1cm4gbGhzIDwgcmhzLm1fdmFsdWUgfHwgbGhzID09IHJoczsKKyAgICAgICAgfQorCisgICAgICAgIGZyaWVuZCBib29sIG9wZXJhdG9yIDw9ICggQXBwcm94IGNvbnN0JiBsaHMsIGRvdWJsZSByaHMgKSB7CisgICAgICAgICAgICByZXR1cm4gbGhzLm1fdmFsdWUgPCByaHMgfHwgbGhzID09IHJoczsKKyAgICAgICAgfQorCisgICAgICAgIGZyaWVuZCBib29sIG9wZXJhdG9yID49ICggZG91YmxlIGxocywgQXBwcm94IGNvbnN0JiByaHMgKSB7CisgICAgICAgICAgICByZXR1cm4gbGhzID4gcmhzLm1fdmFsdWUgfHwgbGhzID09IHJoczsKKyAgICAgICAgfQorCisgICAgICAgIGZyaWVuZCBib29sIG9wZXJhdG9yID49ICggQXBwcm94IGNvbnN0JiBsaHMsIGRvdWJsZSByaHMgKSB7CisgICAgICAgICAgICByZXR1cm4gbGhzLm1fdmFsdWUgPiByaHMgfHwgbGhzID09IHJoczsKKyAgICAgICAgfQorCisgICAgICAgIEFwcHJveCYgZXBzaWxvbiggZG91YmxlIG5ld0Vwc2lsb24gKSB7CisgICAgICAgICAgICBtX2Vwc2lsb24gPSBuZXdFcHNpbG9uOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgQXBwcm94JiBtYXJnaW4oIGRvdWJsZSBuZXdNYXJnaW4gKSB7CisgICAgICAgICAgICBtX21hcmdpbiA9IG5ld01hcmdpbjsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIEFwcHJveCYgc2NhbGUoIGRvdWJsZSBuZXdTY2FsZSApIHsKKyAgICAgICAgICAgIG1fc2NhbGUgPSBuZXdTY2FsZTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdCB7CisgICAgICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICAgICAgICAgICAgb3NzIDw8ICJBcHByb3goICIgPDwgQ2F0Y2g6OnRvU3RyaW5nKCBtX3ZhbHVlICkgPDwgIiApIjsKKyAgICAgICAgICAgIHJldHVybiBvc3Muc3RyKCk7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIGRvdWJsZSBtX2Vwc2lsb247CisgICAgICAgIGRvdWJsZSBtX21hcmdpbjsKKyAgICAgICAgZG91YmxlIG1fc2NhbGU7CisgICAgICAgIGRvdWJsZSBtX3ZhbHVlOworICAgIH07Cit9CisKK3RlbXBsYXRlPD4KK2lubGluZSBzdGQ6OnN0cmluZyB0b1N0cmluZzxEZXRhaWw6OkFwcHJveD4oIERldGFpbDo6QXBwcm94IGNvbnN0JiB2YWx1ZSApIHsKKyAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiBpbnRlcm5hbC9jYXRjaF9tYXRjaGVyc19zdHJpbmcuaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfTUFUQ0hFUlNfU1RSSU5HX0hfSU5DTFVERUQKKworbmFtZXNwYWNlIENhdGNoIHsKK25hbWVzcGFjZSBNYXRjaGVycyB7CisKKyAgICBuYW1lc3BhY2UgU3RkU3RyaW5nIHsKKworICAgICAgICBzdHJ1Y3QgQ2FzZWRTdHJpbmcKKyAgICAgICAgeworICAgICAgICAgICAgQ2FzZWRTdHJpbmcoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIsIENhc2VTZW5zaXRpdmU6OkNob2ljZSBjYXNlU2Vuc2l0aXZpdHkgKTsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGFkanVzdFN0cmluZyggc3RkOjpzdHJpbmcgY29uc3QmIHN0ciApIGNvbnN0OworICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2FzZVNlbnNpdGl2aXR5U3VmZml4KCkgY29uc3Q7CisKKyAgICAgICAgICAgIENhc2VTZW5zaXRpdmU6OkNob2ljZSBtX2Nhc2VTZW5zaXRpdml0eTsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG1fc3RyOworICAgICAgICB9OworCisgICAgICAgIHN0cnVjdCBTdHJpbmdNYXRjaGVyQmFzZSA6IE1hdGNoZXJCYXNlPHN0ZDo6c3RyaW5nPiB7CisgICAgICAgICAgICBTdHJpbmdNYXRjaGVyQmFzZSggc3RkOjpzdHJpbmcgY29uc3QmIG9wZXJhdGlvbiwgQ2FzZWRTdHJpbmcgY29uc3QmIGNvbXBhcmF0b3IgKTsKKyAgICAgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZGVzY3JpYmUoKSBjb25zdCBDQVRDSF9PVkVSUklERTsKKworICAgICAgICAgICAgQ2FzZWRTdHJpbmcgbV9jb21wYXJhdG9yOworICAgICAgICAgICAgc3RkOjpzdHJpbmcgbV9vcGVyYXRpb247CisgICAgICAgIH07CisKKyAgICAgICAgc3RydWN0IEVxdWFsc01hdGNoZXIgOiBTdHJpbmdNYXRjaGVyQmFzZSB7CisgICAgICAgICAgICBFcXVhbHNNYXRjaGVyKCBDYXNlZFN0cmluZyBjb25zdCYgY29tcGFyYXRvciApOworICAgICAgICAgICAgdmlydHVhbCBib29sIG1hdGNoKCBzdGQ6OnN0cmluZyBjb25zdCYgc291cmNlICkgY29uc3QgQ0FUQ0hfT1ZFUlJJREU7CisgICAgICAgIH07CisgICAgICAgIHN0cnVjdCBDb250YWluc01hdGNoZXIgOiBTdHJpbmdNYXRjaGVyQmFzZSB7CisgICAgICAgICAgICBDb250YWluc01hdGNoZXIoIENhc2VkU3RyaW5nIGNvbnN0JiBjb21wYXJhdG9yICk7CisgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgbWF0Y2goIHN0ZDo6c3RyaW5nIGNvbnN0JiBzb3VyY2UgKSBjb25zdCBDQVRDSF9PVkVSUklERTsKKyAgICAgICAgfTsKKyAgICAgICAgc3RydWN0IFN0YXJ0c1dpdGhNYXRjaGVyIDogU3RyaW5nTWF0Y2hlckJhc2UgeworICAgICAgICAgICAgU3RhcnRzV2l0aE1hdGNoZXIoIENhc2VkU3RyaW5nIGNvbnN0JiBjb21wYXJhdG9yICk7CisgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgbWF0Y2goIHN0ZDo6c3RyaW5nIGNvbnN0JiBzb3VyY2UgKSBjb25zdCBDQVRDSF9PVkVSUklERTsKKyAgICAgICAgfTsKKyAgICAgICAgc3RydWN0IEVuZHNXaXRoTWF0Y2hlciA6IFN0cmluZ01hdGNoZXJCYXNlIHsKKyAgICAgICAgICAgIEVuZHNXaXRoTWF0Y2hlciggQ2FzZWRTdHJpbmcgY29uc3QmIGNvbXBhcmF0b3IgKTsKKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBtYXRjaCggc3RkOjpzdHJpbmcgY29uc3QmIHNvdXJjZSApIGNvbnN0IENBVENIX09WRVJSSURFOworICAgICAgICB9OworCisgICAgfSAvLyBuYW1lc3BhY2UgU3RkU3RyaW5nCisKKyAgICAvLyBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBjcmVhdGUgdGhlIGFjdHVhbCBtYXRjaGVyIG9iamVjdHMuCisgICAgLy8gVGhpcyBhbGxvd3MgdGhlIHR5cGVzIHRvIGJlIGluZmVycmVkCisKKyAgICBTdGRTdHJpbmc6OkVxdWFsc01hdGNoZXIgRXF1YWxzKCBzdGQ6OnN0cmluZyBjb25zdCYgc3RyLCBDYXNlU2Vuc2l0aXZlOjpDaG9pY2UgY2FzZVNlbnNpdGl2aXR5ID0gQ2FzZVNlbnNpdGl2ZTo6WWVzICk7CisgICAgU3RkU3RyaW5nOjpDb250YWluc01hdGNoZXIgQ29udGFpbnMoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIsIENhc2VTZW5zaXRpdmU6OkNob2ljZSBjYXNlU2Vuc2l0aXZpdHkgPSBDYXNlU2Vuc2l0aXZlOjpZZXMgKTsKKyAgICBTdGRTdHJpbmc6OkVuZHNXaXRoTWF0Y2hlciBFbmRzV2l0aCggc3RkOjpzdHJpbmcgY29uc3QmIHN0ciwgQ2FzZVNlbnNpdGl2ZTo6Q2hvaWNlIGNhc2VTZW5zaXRpdml0eSA9IENhc2VTZW5zaXRpdmU6OlllcyApOworICAgIFN0ZFN0cmluZzo6U3RhcnRzV2l0aE1hdGNoZXIgU3RhcnRzV2l0aCggc3RkOjpzdHJpbmcgY29uc3QmIHN0ciwgQ2FzZVNlbnNpdGl2ZTo6Q2hvaWNlIGNhc2VTZW5zaXRpdml0eSA9IENhc2VTZW5zaXRpdmU6OlllcyApOworCit9IC8vIG5hbWVzcGFjZSBNYXRjaGVycworfSAvLyBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IGludGVybmFsL2NhdGNoX21hdGNoZXJzX3ZlY3Rvci5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9NQVRDSEVSU19WRUNUT1JfSF9JTkNMVURFRAorCituYW1lc3BhY2UgQ2F0Y2ggeworbmFtZXNwYWNlIE1hdGNoZXJzIHsKKworICAgIG5hbWVzcGFjZSBWZWN0b3IgeworCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgICAgIHN0cnVjdCBDb250YWluc0VsZW1lbnRNYXRjaGVyIDogTWF0Y2hlckJhc2U8c3RkOjp2ZWN0b3I8VD4sIFQ+IHsKKworICAgICAgICAgICAgQ29udGFpbnNFbGVtZW50TWF0Y2hlcihUIGNvbnN0ICZjb21wYXJhdG9yKSA6IG1fY29tcGFyYXRvciggY29tcGFyYXRvcikge30KKworICAgICAgICAgICAgYm9vbCBtYXRjaChzdGQ6OnZlY3RvcjxUPiBjb25zdCAmdikgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGQ6OmZpbmQodi5iZWdpbigpLCB2LmVuZCgpLCBtX2NvbXBhcmF0b3IpICE9IHYuZW5kKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZGVzY3JpYmUoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICJDb250YWluczogIiArIENhdGNoOjp0b1N0cmluZyggbV9jb21wYXJhdG9yICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFQgY29uc3QmIG1fY29tcGFyYXRvcjsKKyAgICAgICAgfTsKKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICBzdHJ1Y3QgQ29udGFpbnNNYXRjaGVyIDogTWF0Y2hlckJhc2U8c3RkOjp2ZWN0b3I8VD4sIHN0ZDo6dmVjdG9yPFQ+ID4geworCisgICAgICAgICAgICBDb250YWluc01hdGNoZXIoc3RkOjp2ZWN0b3I8VD4gY29uc3QgJmNvbXBhcmF0b3IpIDogbV9jb21wYXJhdG9yKCBjb21wYXJhdG9yICkge30KKworICAgICAgICAgICAgYm9vbCBtYXRjaChzdGQ6OnZlY3RvcjxUPiBjb25zdCAmdikgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgIC8vICFUQkQ6IHNlZSBub3RlIGluIEVxdWFsc01hdGNoZXIKKyAgICAgICAgICAgICAgICBpZiAobV9jb21wYXJhdG9yLnNpemUoKSA+IHYuc2l6ZSgpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtX2NvbXBhcmF0b3Iuc2l6ZSgpOyArK2kpCisgICAgICAgICAgICAgICAgICAgIGlmIChzdGQ6OmZpbmQodi5iZWdpbigpLCB2LmVuZCgpLCBtX2NvbXBhcmF0b3JbaV0pID09IHYuZW5kKCkpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGRlc2NyaWJlKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgIHJldHVybiAiQ29udGFpbnM6ICIgKyBDYXRjaDo6dG9TdHJpbmcoIG1fY29tcGFyYXRvciApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxUPiBjb25zdCYgbV9jb21wYXJhdG9yOworICAgICAgICB9OworCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgICAgIHN0cnVjdCBFcXVhbHNNYXRjaGVyIDogTWF0Y2hlckJhc2U8c3RkOjp2ZWN0b3I8VD4sIHN0ZDo6dmVjdG9yPFQ+ID4geworCisgICAgICAgICAgICBFcXVhbHNNYXRjaGVyKHN0ZDo6dmVjdG9yPFQ+IGNvbnN0ICZjb21wYXJhdG9yKSA6IG1fY29tcGFyYXRvciggY29tcGFyYXRvciApIHt9CisKKyAgICAgICAgICAgIGJvb2wgbWF0Y2goc3RkOjp2ZWN0b3I8VD4gY29uc3QgJnYpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgICAgICAvLyAhVEJEOiBUaGlzIGN1cnJlbnRseSB3b3JrcyBpZiBhbGwgZWxlbWVudHMgY2FuIGJlIGNvbXBhcmVkIHVzaW5nICE9CisgICAgICAgICAgICAgICAgLy8gLSBhIG1vcmUgZ2VuZXJhbCBhcHByb2FjaCB3b3VsZCBiZSB2aWEgYSBjb21wYXJlIHRlbXBsYXRlIHRoYXQgZGVmYXVsdHMKKyAgICAgICAgICAgICAgICAvLyB0byB1c2luZyAhPS4gYnV0IGNvdWxkIGJlIHNwZWNpYWxpc2VkIGZvciwgZS5nLiBzdGQ6OnZlY3RvcjxUPiBldGMKKyAgICAgICAgICAgICAgICAvLyAtIHRoZW4ganVzdCBjYWxsIHRoYXQgZGlyZWN0bHkKKyAgICAgICAgICAgICAgICBpZiAobV9jb21wYXJhdG9yLnNpemUoKSAhPSB2LnNpemUoKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdi5zaXplKCk7ICsraSkKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fY29tcGFyYXRvcltpXSAhPSB2W2ldKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBkZXNjcmliZSgpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIkVxdWFsczogIiArIENhdGNoOjp0b1N0cmluZyggbV9jb21wYXJhdG9yICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxUPiBjb25zdCYgbV9jb21wYXJhdG9yOworICAgICAgICB9OworCisgICAgfSAvLyBuYW1lc3BhY2UgVmVjdG9yCisKKyAgICAvLyBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBjcmVhdGUgdGhlIGFjdHVhbCBtYXRjaGVyIG9iamVjdHMuCisgICAgLy8gVGhpcyBhbGxvd3MgdGhlIHR5cGVzIHRvIGJlIGluZmVycmVkCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIFZlY3Rvcjo6Q29udGFpbnNNYXRjaGVyPFQ+IENvbnRhaW5zKCBzdGQ6OnZlY3RvcjxUPiBjb25zdCYgY29tcGFyYXRvciApIHsKKyAgICAgICAgcmV0dXJuIFZlY3Rvcjo6Q29udGFpbnNNYXRjaGVyPFQ+KCBjb21wYXJhdG9yICk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBWZWN0b3I6OkNvbnRhaW5zRWxlbWVudE1hdGNoZXI8VD4gVmVjdG9yQ29udGFpbnMoIFQgY29uc3QmIGNvbXBhcmF0b3IgKSB7CisgICAgICAgIHJldHVybiBWZWN0b3I6OkNvbnRhaW5zRWxlbWVudE1hdGNoZXI8VD4oIGNvbXBhcmF0b3IgKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIFZlY3Rvcjo6RXF1YWxzTWF0Y2hlcjxUPiBFcXVhbHMoIHN0ZDo6dmVjdG9yPFQ+IGNvbnN0JiBjb21wYXJhdG9yICkgeworICAgICAgICByZXR1cm4gVmVjdG9yOjpFcXVhbHNNYXRjaGVyPFQ+KCBjb21wYXJhdG9yICk7CisgICAgfQorCit9IC8vIG5hbWVzcGFjZSBNYXRjaGVycworfSAvLyBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IGludGVybmFsL2NhdGNoX2ludGVyZmFjZXNfdGFnX2FsaWFzX3JlZ2lzdHJ5LmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0lOVEVSRkFDRVNfVEFHX0FMSUFTX1JFR0lTVFJZX0hfSU5DTFVERUQKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3RhZ19hbGlhcy5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9UQUdfQUxJQVNfSF9JTkNMVURFRAorCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgc3RydWN0IFRhZ0FsaWFzIHsKKyAgICAgICAgVGFnQWxpYXMoIHN0ZDo6c3RyaW5nIGNvbnN0JiBfdGFnLCBTb3VyY2VMaW5lSW5mbyBfbGluZUluZm8gKSA6IHRhZyggX3RhZyApLCBsaW5lSW5mbyggX2xpbmVJbmZvICkge30KKworICAgICAgICBzdGQ6OnN0cmluZyB0YWc7CisgICAgICAgIFNvdXJjZUxpbmVJbmZvIGxpbmVJbmZvOworICAgIH07CisKKyAgICBzdHJ1Y3QgUmVnaXN0cmFyRm9yVGFnQWxpYXNlcyB7CisgICAgICAgIFJlZ2lzdHJhckZvclRhZ0FsaWFzZXMoIGNoYXIgY29uc3QqIGFsaWFzLCBjaGFyIGNvbnN0KiB0YWcsIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBsaW5lSW5mbyApOworICAgIH07CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisjZGVmaW5lIENBVENIX1JFR0lTVEVSX1RBR19BTElBUyggYWxpYXMsIHNwZWMgKSBuYW1lc3BhY2V7IENhdGNoOjpSZWdpc3RyYXJGb3JUYWdBbGlhc2VzIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBBdXRvUmVnaXN0ZXJUYWdBbGlhcyApKCBhbGlhcywgc3BlYywgQ0FUQ0hfSU5URVJOQUxfTElORUlORk8gKTsgfQorLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX29wdGlvbi5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX09QVElPTl9IUFBfSU5DTFVERUQKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIC8vIEFuIG9wdGlvbmFsIHR5cGUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGNsYXNzIE9wdGlvbiB7CisgICAgcHVibGljOgorICAgICAgICBPcHRpb24oKSA6IG51bGxhYmxlVmFsdWUoIENBVENIX05VTEwgKSB7fQorICAgICAgICBPcHRpb24oIFQgY29uc3QmIF92YWx1ZSApCisgICAgICAgIDogbnVsbGFibGVWYWx1ZSggbmV3KCBzdG9yYWdlICkgVCggX3ZhbHVlICkgKQorICAgICAgICB7fQorICAgICAgICBPcHRpb24oIE9wdGlvbiBjb25zdCYgX290aGVyICkKKyAgICAgICAgOiBudWxsYWJsZVZhbHVlKCBfb3RoZXIgPyBuZXcoIHN0b3JhZ2UgKSBUKCAqX290aGVyICkgOiBDQVRDSF9OVUxMICkKKyAgICAgICAge30KKworICAgICAgICB+T3B0aW9uKCkgeworICAgICAgICAgICAgcmVzZXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIE9wdGlvbiYgb3BlcmF0b3I9ICggT3B0aW9uIGNvbnN0JiBfb3RoZXIgKSB7CisgICAgICAgICAgICBpZiggJl9vdGhlciAhPSB0aGlzICkgeworICAgICAgICAgICAgICAgIHJlc2V0KCk7CisgICAgICAgICAgICAgICAgaWYoIF9vdGhlciApCisgICAgICAgICAgICAgICAgICAgIG51bGxhYmxlVmFsdWUgPSBuZXcoIHN0b3JhZ2UgKSBUKCAqX290aGVyICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKyAgICAgICAgT3B0aW9uJiBvcGVyYXRvciA9ICggVCBjb25zdCYgX3ZhbHVlICkgeworICAgICAgICAgICAgcmVzZXQoKTsKKyAgICAgICAgICAgIG51bGxhYmxlVmFsdWUgPSBuZXcoIHN0b3JhZ2UgKSBUKCBfdmFsdWUgKTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgcmVzZXQoKSB7CisgICAgICAgICAgICBpZiggbnVsbGFibGVWYWx1ZSApCisgICAgICAgICAgICAgICAgbnVsbGFibGVWYWx1ZS0+flQoKTsKKyAgICAgICAgICAgIG51bGxhYmxlVmFsdWUgPSBDQVRDSF9OVUxMOworICAgICAgICB9CisKKyAgICAgICAgVCYgb3BlcmF0b3IqKCkgeyByZXR1cm4gKm51bGxhYmxlVmFsdWU7IH0KKyAgICAgICAgVCBjb25zdCYgb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gKm51bGxhYmxlVmFsdWU7IH0KKyAgICAgICAgVCogb3BlcmF0b3ItPigpIHsgcmV0dXJuIG51bGxhYmxlVmFsdWU7IH0KKyAgICAgICAgY29uc3QgVCogb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuIG51bGxhYmxlVmFsdWU7IH0KKworICAgICAgICBUIHZhbHVlT3IoIFQgY29uc3QmIGRlZmF1bHRWYWx1ZSApIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBudWxsYWJsZVZhbHVlID8gKm51bGxhYmxlVmFsdWUgOiBkZWZhdWx0VmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBib29sIHNvbWUoKSBjb25zdCB7IHJldHVybiBudWxsYWJsZVZhbHVlICE9IENBVENIX05VTEw7IH0KKyAgICAgICAgYm9vbCBub25lKCkgY29uc3QgeyByZXR1cm4gbnVsbGFibGVWYWx1ZSA9PSBDQVRDSF9OVUxMOyB9CisKKyAgICAgICAgYm9vbCBvcGVyYXRvciAhKCkgY29uc3QgeyByZXR1cm4gbnVsbGFibGVWYWx1ZSA9PSBDQVRDSF9OVUxMOyB9CisgICAgICAgIG9wZXJhdG9yIFNhZmVCb29sOjp0eXBlKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIFNhZmVCb29sOjptYWtlU2FmZSggc29tZSgpICk7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIFQgKm51bGxhYmxlVmFsdWU7CisgICAgICAgIHVuaW9uIHsKKyAgICAgICAgICAgIGNoYXIgc3RvcmFnZVtzaXplb2YoVCldOworCisgICAgICAgICAgICAvLyBUaGVzZSBhcmUgaGVyZSB0byBmb3JjZSBhbGlnbm1lbnQgZm9yIHRoZSBzdG9yYWdlCisgICAgICAgICAgICBsb25nIGRvdWJsZSBkdW1teTE7CisgICAgICAgICAgICB2b2lkICgqZHVtbXkyKSgpOworICAgICAgICAgICAgbG9uZyBkb3VibGUgZHVtbXkzOworI2lmZGVmIENBVENIX0NPTkZJR19DUFAxMV9MT05HX0xPTkcKKyAgICAgICAgICAgIGxvbmcgbG9uZyBkdW1teTQ7CisjZW5kaWYKKyAgICAgICAgfTsKKyAgICB9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIHN0cnVjdCBJVGFnQWxpYXNSZWdpc3RyeSB7CisgICAgICAgIHZpcnR1YWwgfklUYWdBbGlhc1JlZ2lzdHJ5KCk7CisgICAgICAgIHZpcnR1YWwgT3B0aW9uPFRhZ0FsaWFzPiBmaW5kKCBzdGQ6OnN0cmluZyBjb25zdCYgYWxpYXMgKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZXhwYW5kQWxpYXNlcyggc3RkOjpzdHJpbmcgY29uc3QmIHVuZXhwYW5kZWRUZXN0U3BlYyApIGNvbnN0ID0gMDsKKworICAgICAgICBzdGF0aWMgSVRhZ0FsaWFzUmVnaXN0cnkgY29uc3QmIGdldCgpOworICAgIH07CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyBUaGVzZSBmaWxlcyBhcmUgaW5jbHVkZWQgaGVyZSBzbyB0aGUgc2luZ2xlX2luY2x1ZGUgc2NyaXB0IGRvZXNuJ3QgcHV0IHRoZW0KKy8vIGluIHRoZSBjb25kaXRpb25hbGx5IGNvbXBpbGVkIHNlY3Rpb25zCisvLyAjaW5jbHVkZWQgZnJvbTogaW50ZXJuYWwvY2F0Y2hfdGVzdF9jYXNlX2luZm8uaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfVEVTVF9DQVNFX0lORk9fSF9JTkNMVURFRAorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHNldD4KKworI2lmZGVmIF9fY2xhbmdfXworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHB1c2gKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV3BhZGRlZCIKKyNlbmRpZgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgc3RydWN0IElUZXN0Q2FzZTsKKworICAgIHN0cnVjdCBUZXN0Q2FzZUluZm8geworICAgICAgICBlbnVtIFNwZWNpYWxQcm9wZXJ0aWVzeworICAgICAgICAgICAgTm9uZSA9IDAsCisgICAgICAgICAgICBJc0hpZGRlbiA9IDEgPDwgMSwKKyAgICAgICAgICAgIFNob3VsZEZhaWwgPSAxIDw8IDIsCisgICAgICAgICAgICBNYXlGYWlsID0gMSA8PCAzLAorICAgICAgICAgICAgVGhyb3dzID0gMSA8PCA0LAorICAgICAgICAgICAgTm9uUG9ydGFibGUgPSAxIDw8IDUKKyAgICAgICAgfTsKKworICAgICAgICBUZXN0Q2FzZUluZm8oICAgc3RkOjpzdHJpbmcgY29uc3QmIF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIF9jbGFzc05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgX2Rlc2NyaXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IGNvbnN0JiBfdGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBfbGluZUluZm8gKTsKKworICAgICAgICBUZXN0Q2FzZUluZm8oIFRlc3RDYXNlSW5mbyBjb25zdCYgb3RoZXIgKTsKKworICAgICAgICBmcmllbmQgdm9pZCBzZXRUYWdzKCBUZXN0Q2FzZUluZm8mIHRlc3RDYXNlSW5mbywgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IGNvbnN0JiB0YWdzICk7CisKKyAgICAgICAgYm9vbCBpc0hpZGRlbigpIGNvbnN0OworICAgICAgICBib29sIHRocm93cygpIGNvbnN0OworICAgICAgICBib29sIG9rVG9GYWlsKCkgY29uc3Q7CisgICAgICAgIGJvb2wgZXhwZWN0ZWRUb0ZhaWwoKSBjb25zdDsKKworICAgICAgICBzdGQ6OnN0cmluZyBuYW1lOworICAgICAgICBzdGQ6OnN0cmluZyBjbGFzc05hbWU7CisgICAgICAgIHN0ZDo6c3RyaW5nIGRlc2NyaXB0aW9uOworICAgICAgICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gdGFnczsKKyAgICAgICAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IGxjYXNlVGFnczsKKyAgICAgICAgc3RkOjpzdHJpbmcgdGFnc0FzU3RyaW5nOworICAgICAgICBTb3VyY2VMaW5lSW5mbyBsaW5lSW5mbzsKKyAgICAgICAgU3BlY2lhbFByb3BlcnRpZXMgcHJvcGVydGllczsKKyAgICB9OworCisgICAgY2xhc3MgVGVzdENhc2UgOiBwdWJsaWMgVGVzdENhc2VJbmZvIHsKKyAgICBwdWJsaWM6CisKKyAgICAgICAgVGVzdENhc2UoIElUZXN0Q2FzZSogdGVzdENhc2UsIFRlc3RDYXNlSW5mbyBjb25zdCYgaW5mbyApOworICAgICAgICBUZXN0Q2FzZSggVGVzdENhc2UgY29uc3QmIG90aGVyICk7CisKKyAgICAgICAgVGVzdENhc2Ugd2l0aE5hbWUoIHN0ZDo6c3RyaW5nIGNvbnN0JiBfbmV3TmFtZSApIGNvbnN0OworCisgICAgICAgIHZvaWQgaW52b2tlKCkgY29uc3Q7CisKKyAgICAgICAgVGVzdENhc2VJbmZvIGNvbnN0JiBnZXRUZXN0Q2FzZUluZm8oKSBjb25zdDsKKworICAgICAgICB2b2lkIHN3YXAoIFRlc3RDYXNlJiBvdGhlciApOworICAgICAgICBib29sIG9wZXJhdG9yID09ICggVGVzdENhc2UgY29uc3QmIG90aGVyICkgY29uc3Q7CisgICAgICAgIGJvb2wgb3BlcmF0b3IgPCAoIFRlc3RDYXNlIGNvbnN0JiBvdGhlciApIGNvbnN0OworICAgICAgICBUZXN0Q2FzZSYgb3BlcmF0b3IgPSAoIFRlc3RDYXNlIGNvbnN0JiBvdGhlciApOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgUHRyPElUZXN0Q2FzZT4gdGVzdDsKKyAgICB9OworCisgICAgVGVzdENhc2UgbWFrZVRlc3RDYXNlKCAgSVRlc3RDYXNlKiB0ZXN0Q2FzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgY2xhc3NOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBkZXNjcmlwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMaW5lSW5mbyBjb25zdCYgbGluZUluZm8gKTsKK30KKworI2lmZGVmIF9fY2xhbmdfXworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHBvcAorI2VuZGlmCisKKworI2lmZGVmIF9fT0JKQ19fCisvLyAjaW5jbHVkZWQgZnJvbTogaW50ZXJuYWwvY2F0Y2hfb2JqYy5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX09CSkNfSFBQX0lOQ0xVREVECisKKyNpbXBvcnQgPG9iamMvcnVudGltZS5oPgorCisjaW5jbHVkZSA8c3RyaW5nPgorCisvLyBOQi4gQW55IGdlbmVyYWwgY2F0Y2ggaGVhZGVycyBpbmNsdWRlZCBoZXJlIG11c3QgYmUgaW5jbHVkZWQKKy8vIGluIGNhdGNoLmhwcCBmaXJzdCB0byBtYWtlIHN1cmUgdGhleSBhcmUgaW5jbHVkZWQgYnkgdGhlIHNpbmdsZQorLy8gaGVhZGVyIGZvciBub24gb2JqLXVzYWdlCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFRoaXMgcHJvdG9jb2wgaXMgcmVhbGx5IG9ubHkgaGVyZSBmb3IgKHNlbGYpIGRvY3VtZW50aW5nIHB1cnBvc2VzLCBzaW5jZQorLy8gYWxsIGl0cyBtZXRob2RzIGFyZSBvcHRpb25hbC4KK0Bwcm90b2NvbCBPY0ZpeHR1cmUKKworQG9wdGlvbmFsCisKKy0odm9pZCkgc2V0VXA7CistKHZvaWQpIHRlYXJEb3duOworCitAZW5kCisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBjbGFzcyBPY01ldGhvZCA6IHB1YmxpYyBTaGFyZWRJbXBsPElUZXN0Q2FzZT4geworCisgICAgcHVibGljOgorICAgICAgICBPY01ldGhvZCggQ2xhc3MgY2xzLCBTRUwgc2VsICkgOiBtX2NscyggY2xzICksIG1fc2VsKCBzZWwgKSB7fQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBpbnZva2UoKSBjb25zdCB7CisgICAgICAgICAgICBpZCBvYmogPSBbW21fY2xzIGFsbG9jXSBpbml0XTsKKworICAgICAgICAgICAgcGVyZm9ybU9wdGlvbmFsU2VsZWN0b3IoIG9iaiwgQHNlbGVjdG9yKHNldFVwKSAgKTsKKyAgICAgICAgICAgIHBlcmZvcm1PcHRpb25hbFNlbGVjdG9yKCBvYmosIG1fc2VsICk7CisgICAgICAgICAgICBwZXJmb3JtT3B0aW9uYWxTZWxlY3Rvciggb2JqLCBAc2VsZWN0b3IodGVhckRvd24pICApOworCisgICAgICAgICAgICBhcmNTYWZlUmVsZWFzZSggb2JqICk7CisgICAgICAgIH0KKyAgICBwcml2YXRlOgorICAgICAgICB2aXJ0dWFsIH5PY01ldGhvZCgpIHt9CisKKyAgICAgICAgQ2xhc3MgbV9jbHM7CisgICAgICAgIFNFTCBtX3NlbDsKKyAgICB9OworCisgICAgbmFtZXNwYWNlIERldGFpbHsKKworICAgICAgICBpbmxpbmUgc3RkOjpzdHJpbmcgZ2V0QW5ub3RhdGlvbiggICBDbGFzcyBjbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBhbm5vdGF0aW9uTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIHRlc3RDYXNlTmFtZSApIHsKKyAgICAgICAgICAgIE5TU3RyaW5nKiBzZWxTdHIgPSBbW05TU3RyaW5nIGFsbG9jXSBpbml0V2l0aEZvcm1hdDpAIkNhdGNoXyVzXyVzIiwgYW5ub3RhdGlvbk5hbWUuY19zdHIoKSwgdGVzdENhc2VOYW1lLmNfc3RyKCldOworICAgICAgICAgICAgU0VMIHNlbCA9IE5TU2VsZWN0b3JGcm9tU3RyaW5nKCBzZWxTdHIgKTsKKyAgICAgICAgICAgIGFyY1NhZmVSZWxlYXNlKCBzZWxTdHIgKTsKKyAgICAgICAgICAgIGlkIHZhbHVlID0gcGVyZm9ybU9wdGlvbmFsU2VsZWN0b3IoIGNscywgc2VsICk7CisgICAgICAgICAgICBpZiggdmFsdWUgKQorICAgICAgICAgICAgICAgIHJldHVybiBbKE5TU3RyaW5nKil2YWx1ZSBVVEY4U3RyaW5nXTsKKyAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlubGluZSBzaXplX3QgcmVnaXN0ZXJUZXN0TWV0aG9kcygpIHsKKyAgICAgICAgc2l6ZV90IG5vVGVzdE1ldGhvZHMgPSAwOworICAgICAgICBpbnQgbm9DbGFzc2VzID0gb2JqY19nZXRDbGFzc0xpc3QoIENBVENIX05VTEwsIDAgKTsKKworICAgICAgICBDbGFzcyogY2xhc3NlcyA9IChDQVRDSF9VTlNBRkVfVU5SRVRBSU5FRCBDbGFzcyAqKW1hbGxvYyggc2l6ZW9mKENsYXNzKSAqIG5vQ2xhc3Nlcyk7CisgICAgICAgIG9iamNfZ2V0Q2xhc3NMaXN0KCBjbGFzc2VzLCBub0NsYXNzZXMgKTsKKworICAgICAgICBmb3IoIGludCBjID0gMDsgYyA8IG5vQ2xhc3NlczsgYysrICkgeworICAgICAgICAgICAgQ2xhc3MgY2xzID0gY2xhc3Nlc1tjXTsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1X2ludCBjb3VudDsKKyAgICAgICAgICAgICAgICBNZXRob2QqIG1ldGhvZHMgPSBjbGFzc19jb3B5TWV0aG9kTGlzdCggY2xzLCAmY291bnQgKTsKKyAgICAgICAgICAgICAgICBmb3IoIHVfaW50IG0gPSAwOyBtIDwgY291bnQgOyBtKysgKSB7CisgICAgICAgICAgICAgICAgICAgIFNFTCBzZWxlY3RvciA9IG1ldGhvZF9nZXROYW1lKG1ldGhvZHNbbV0pOworICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBtZXRob2ROYW1lID0gc2VsX2dldE5hbWUoc2VsZWN0b3IpOworICAgICAgICAgICAgICAgICAgICBpZiggc3RhcnRzV2l0aCggbWV0aG9kTmFtZSwgIkNhdGNoX1Rlc3RDYXNlXyIgKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHRlc3RDYXNlTmFtZSA9IG1ldGhvZE5hbWUuc3Vic3RyKCAxNSApOworICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSA9IERldGFpbDo6Z2V0QW5ub3RhdGlvbiggY2xzLCAiTmFtZSIsIHRlc3RDYXNlTmFtZSApOworICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZGVzYyA9IERldGFpbDo6Z2V0QW5ub3RhdGlvbiggY2xzLCAiRGVzY3JpcHRpb24iLCB0ZXN0Q2FzZU5hbWUgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNsYXNzTmFtZSA9IGNsYXNzX2dldE5hbWUoIGNscyApOworCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRNdXRhYmxlUmVnaXN0cnlIdWIoKS5yZWdpc3RlclRlc3QoIG1ha2VUZXN0Q2FzZSggbmV3IE9jTWV0aG9kKCBjbHMsIHNlbGVjdG9yICksIGNsYXNzTmFtZSwgbmFtZS5jX3N0cigpLCBkZXNjLmNfc3RyKCksIFNvdXJjZUxpbmVJbmZvKCkgKSApOworICAgICAgICAgICAgICAgICAgICAgICAgbm9UZXN0TWV0aG9kcysrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZyZWUobWV0aG9kcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5vVGVzdE1ldGhvZHM7CisgICAgfQorCisgICAgbmFtZXNwYWNlIE1hdGNoZXJzIHsKKyAgICAgICAgbmFtZXNwYWNlIEltcGwgeworICAgICAgICBuYW1lc3BhY2UgTlNTdHJpbmdNYXRjaGVycyB7CisKKyAgICAgICAgICAgIHN0cnVjdCBTdHJpbmdIb2xkZXIgOiBNYXRjaGVyQmFzZTxOU1N0cmluZyo+eworICAgICAgICAgICAgICAgIFN0cmluZ0hvbGRlciggTlNTdHJpbmcqIHN1YnN0ciApIDogbV9zdWJzdHIoIFtzdWJzdHIgY29weV0gKXt9CisgICAgICAgICAgICAgICAgU3RyaW5nSG9sZGVyKCBTdHJpbmdIb2xkZXIgY29uc3QmIG90aGVyICkgOiBtX3N1YnN0ciggW290aGVyLm1fc3Vic3RyIGNvcHldICl7fQorICAgICAgICAgICAgICAgIFN0cmluZ0hvbGRlcigpIHsKKyAgICAgICAgICAgICAgICAgICAgYXJjU2FmZVJlbGVhc2UoIG1fc3Vic3RyICk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdmlydHVhbCBib29sIG1hdGNoKCBOU1N0cmluZyogYXJnICkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgTlNTdHJpbmcqIG1fc3Vic3RyOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgc3RydWN0IEVxdWFscyA6IFN0cmluZ0hvbGRlciB7CisgICAgICAgICAgICAgICAgRXF1YWxzKCBOU1N0cmluZyogc3Vic3RyICkgOiBTdHJpbmdIb2xkZXIoIHN1YnN0ciApe30KKworICAgICAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBtYXRjaCggTlNTdHJpbmcqIHN0ciApIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICAoc3RyICE9IG5pbCB8fCBtX3N1YnN0ciA9PSBuaWwgKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHIgaXNFcXVhbFRvU3RyaW5nOm1fc3Vic3RyXTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGRlc2NyaWJlKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gImVxdWFscyBzdHJpbmc6ICIgKyBDYXRjaDo6dG9TdHJpbmcoIG1fc3Vic3RyICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgc3RydWN0IENvbnRhaW5zIDogU3RyaW5nSG9sZGVyIHsKKyAgICAgICAgICAgICAgICBDb250YWlucyggTlNTdHJpbmcqIHN1YnN0ciApIDogU3RyaW5nSG9sZGVyKCBzdWJzdHIgKXt9CisKKyAgICAgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgbWF0Y2goIE5TU3RyaW5nKiBzdHIgKSBjb25zdCB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAgKHN0ciAhPSBuaWwgfHwgbV9zdWJzdHIgPT0gbmlsICkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3RyIHJhbmdlT2ZTdHJpbmc6bV9zdWJzdHJdLmxvY2F0aW9uICE9IE5TTm90Rm91bmQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBkZXNjcmliZSgpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJjb250YWlucyBzdHJpbmc6ICIgKyBDYXRjaDo6dG9TdHJpbmcoIG1fc3Vic3RyICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgc3RydWN0IFN0YXJ0c1dpdGggOiBTdHJpbmdIb2xkZXIgeworICAgICAgICAgICAgICAgIFN0YXJ0c1dpdGgoIE5TU3RyaW5nKiBzdWJzdHIgKSA6IFN0cmluZ0hvbGRlciggc3Vic3RyICl7fQorCisgICAgICAgICAgICAgICAgdmlydHVhbCBib29sIG1hdGNoKCBOU1N0cmluZyogc3RyICkgY29uc3QgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gIChzdHIgIT0gbmlsIHx8IG1fc3Vic3RyID09IG5pbCApICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0ciByYW5nZU9mU3RyaW5nOm1fc3Vic3RyXS5sb2NhdGlvbiA9PSAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZGVzY3JpYmUoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAic3RhcnRzIHdpdGg6ICIgKyBDYXRjaDo6dG9TdHJpbmcoIG1fc3Vic3RyICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHN0cnVjdCBFbmRzV2l0aCA6IFN0cmluZ0hvbGRlciB7CisgICAgICAgICAgICAgICAgRW5kc1dpdGgoIE5TU3RyaW5nKiBzdWJzdHIgKSA6IFN0cmluZ0hvbGRlciggc3Vic3RyICl7fQorCisgICAgICAgICAgICAgICAgdmlydHVhbCBib29sIG1hdGNoKCBOU1N0cmluZyogc3RyICkgY29uc3QgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gIChzdHIgIT0gbmlsIHx8IG1fc3Vic3RyID09IG5pbCApICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0ciByYW5nZU9mU3RyaW5nOm1fc3Vic3RyXS5sb2NhdGlvbiA9PSBbc3RyIGxlbmd0aF0gLSBbbV9zdWJzdHIgbGVuZ3RoXTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGRlc2NyaWJlKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gImVuZHMgd2l0aDogIiArIENhdGNoOjp0b1N0cmluZyggbV9zdWJzdHIgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworCisgICAgICAgIH0gLy8gbmFtZXNwYWNlIE5TU3RyaW5nTWF0Y2hlcnMKKyAgICAgICAgfSAvLyBuYW1lc3BhY2UgSW1wbAorCisgICAgICAgIGlubGluZSBJbXBsOjpOU1N0cmluZ01hdGNoZXJzOjpFcXVhbHMKKyAgICAgICAgICAgIEVxdWFscyggTlNTdHJpbmcqIHN1YnN0ciApeyByZXR1cm4gSW1wbDo6TlNTdHJpbmdNYXRjaGVyczo6RXF1YWxzKCBzdWJzdHIgKTsgfQorCisgICAgICAgIGlubGluZSBJbXBsOjpOU1N0cmluZ01hdGNoZXJzOjpDb250YWlucworICAgICAgICAgICAgQ29udGFpbnMoIE5TU3RyaW5nKiBzdWJzdHIgKXsgcmV0dXJuIEltcGw6Ok5TU3RyaW5nTWF0Y2hlcnM6OkNvbnRhaW5zKCBzdWJzdHIgKTsgfQorCisgICAgICAgIGlubGluZSBJbXBsOjpOU1N0cmluZ01hdGNoZXJzOjpTdGFydHNXaXRoCisgICAgICAgICAgICBTdGFydHNXaXRoKCBOU1N0cmluZyogc3Vic3RyICl7IHJldHVybiBJbXBsOjpOU1N0cmluZ01hdGNoZXJzOjpTdGFydHNXaXRoKCBzdWJzdHIgKTsgfQorCisgICAgICAgIGlubGluZSBJbXBsOjpOU1N0cmluZ01hdGNoZXJzOjpFbmRzV2l0aAorICAgICAgICAgICAgRW5kc1dpdGgoIE5TU3RyaW5nKiBzdWJzdHIgKXsgcmV0dXJuIEltcGw6Ok5TU3RyaW5nTWF0Y2hlcnM6OkVuZHNXaXRoKCBzdWJzdHIgKTsgfQorCisgICAgfSAvLyBuYW1lc3BhY2UgTWF0Y2hlcnMKKworICAgIHVzaW5nIG5hbWVzcGFjZSBNYXRjaGVyczsKKworfSAvLyBuYW1lc3BhY2UgQ2F0Y2gKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworI2RlZmluZSBPQ19URVNUX0NBU0UoIG5hbWUsIGRlc2MgKVwKKysoTlNTdHJpbmcqKSBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggQ2F0Y2hfTmFtZV90ZXN0ICkgXAore1wKK3JldHVybiBAIG5hbWU7IFwKK31cCisrKE5TU3RyaW5nKikgSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIENhdGNoX0Rlc2NyaXB0aW9uX3Rlc3QgKSBcCit7IFwKK3JldHVybiBAIGRlc2M7IFwKK30gXAorLSh2b2lkKSBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggQ2F0Y2hfVGVzdENhc2VfdGVzdCApCisKKyNlbmRpZgorCisjaWZkZWYgQ0FUQ0hfSU1QTAorCisvLyAhVEJEOiBNb3ZlIHRoZSBsZWFrIGRldGVjdG9yIGNvZGUgaW50byBhIHNlcGFyYXRlIGhlYWRlcgorI2lmZGVmIENBVENIX0NPTkZJR19XSU5ET1dTX0NSVERCRworI2luY2x1ZGUgPGNydGRiZy5oPgorY2xhc3MgTGVha0RldGVjdG9yIHsKK3B1YmxpYzoKKwlMZWFrRGV0ZWN0b3IoKSB7CisJCWludCBmbGFnID0gX0NydFNldERiZ0ZsYWcoX0NSVERCR19SRVBPUlRfRkxBRyk7CisJCWZsYWcgfD0gX0NSVERCR19MRUFLX0NIRUNLX0RGOworCQlmbGFnIHw9IF9DUlREQkdfQUxMT0NfTUVNX0RGOworCQlfQ3J0U2V0RGJnRmxhZyhmbGFnKTsKKwkJX0NydFNldFJlcG9ydE1vZGUoX0NSVF9XQVJOLCBfQ1JUREJHX01PREVfRklMRSB8IF9DUlREQkdfTU9ERV9ERUJVRyk7CisJCV9DcnRTZXRSZXBvcnRGaWxlKF9DUlRfV0FSTiwgX0NSVERCR19GSUxFX1NUREVSUik7CisJCS8vIENoYW5nZSB0aGlzIHRvIGxlYWtpbmcgYWxsb2NhdGlvbidzIG51bWJlciB0byBicmVhayB0aGVyZQorCQlfQ3J0U2V0QnJlYWtBbGxvYygtMSk7CisJfQorfTsKKyNlbHNlCitjbGFzcyBMZWFrRGV0ZWN0b3Ige307CisjZW5kaWYKKworTGVha0RldGVjdG9yIGxlYWtEZXRlY3RvcjsKKworLy8gI2luY2x1ZGVkIGZyb206IGludGVybmFsL2NhdGNoX2ltcGwuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9JTVBMX0hQUF9JTkNMVURFRAorCisvLyBDb2xsZWN0IGFsbCB0aGUgaW1wbGVtZW50YXRpb24gZmlsZXMgdG9nZXRoZXIgaGVyZQorLy8gVGhlc2UgYXJlIHRoZSBlcXVpdmFsZW50IG9mIHdoYXQgd291bGQgdXN1YWxseSBiZSBjcHAgZmlsZXMKKworI2lmZGVmIF9fY2xhbmdfXworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHB1c2gKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV3dlYWstdnRhYmxlcyIKKyNlbmRpZgorCisvLyAjaW5jbHVkZWQgZnJvbTogLi4vY2F0Y2hfc2Vzc2lvbi5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1JVTk5FUl9IUFBfSU5DTFVERUQKKworLy8gI2luY2x1ZGVkIGZyb206IGludGVybmFsL2NhdGNoX2NvbW1hbmRsaW5lLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfQ09NTUFORExJTkVfSFBQX0lOQ0xVREVECisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9jb25maWcuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9DT05GSUdfSFBQX0lOQ0xVREVECisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF90ZXN0X3NwZWNfcGFyc2VyLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfVEVTVF9TUEVDX1BBUlNFUl9IUFBfSU5DTFVERUQKKworI2lmZGVmIF9fY2xhbmdfXworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHB1c2gKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV3BhZGRlZCIKKyNlbmRpZgorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfdGVzdF9zcGVjLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfVEVTVF9TUEVDX0hQUF9JTkNMVURFRAorCisjaWZkZWYgX19jbGFuZ19fCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaAorI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XcGFkZGVkIgorI2VuZGlmCisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF93aWxkY2FyZF9wYXR0ZXJuLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfV0lMRENBUkRfUEFUVEVSTl9IUFBfSU5DTFVERUQKKworI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKworbmFtZXNwYWNlIENhdGNoCit7CisgICAgY2xhc3MgV2lsZGNhcmRQYXR0ZXJuIHsKKyAgICAgICAgZW51bSBXaWxkY2FyZFBvc2l0aW9uIHsKKyAgICAgICAgICAgIE5vV2lsZGNhcmQgPSAwLAorICAgICAgICAgICAgV2lsZGNhcmRBdFN0YXJ0ID0gMSwKKyAgICAgICAgICAgIFdpbGRjYXJkQXRFbmQgPSAyLAorICAgICAgICAgICAgV2lsZGNhcmRBdEJvdGhFbmRzID0gV2lsZGNhcmRBdFN0YXJ0IHwgV2lsZGNhcmRBdEVuZAorICAgICAgICB9OworCisgICAgcHVibGljOgorCisgICAgICAgIFdpbGRjYXJkUGF0dGVybiggc3RkOjpzdHJpbmcgY29uc3QmIHBhdHRlcm4sIENhc2VTZW5zaXRpdmU6OkNob2ljZSBjYXNlU2Vuc2l0aXZpdHkgKQorICAgICAgICA6ICAgbV9jYXNlU2Vuc2l0aXZpdHkoIGNhc2VTZW5zaXRpdml0eSApLAorICAgICAgICAgICAgbV93aWxkY2FyZCggTm9XaWxkY2FyZCApLAorICAgICAgICAgICAgbV9wYXR0ZXJuKCBhZGp1c3RDYXNlKCBwYXR0ZXJuICkgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggc3RhcnRzV2l0aCggbV9wYXR0ZXJuLCAnKicgKSApIHsKKyAgICAgICAgICAgICAgICBtX3BhdHRlcm4gPSBtX3BhdHRlcm4uc3Vic3RyKCAxICk7CisgICAgICAgICAgICAgICAgbV93aWxkY2FyZCA9IFdpbGRjYXJkQXRTdGFydDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCBlbmRzV2l0aCggbV9wYXR0ZXJuLCAnKicgKSApIHsKKyAgICAgICAgICAgICAgICBtX3BhdHRlcm4gPSBtX3BhdHRlcm4uc3Vic3RyKCAwLCBtX3BhdHRlcm4uc2l6ZSgpLTEgKTsKKyAgICAgICAgICAgICAgICBtX3dpbGRjYXJkID0gc3RhdGljX2Nhc3Q8V2lsZGNhcmRQb3NpdGlvbj4oIG1fd2lsZGNhcmQgfCBXaWxkY2FyZEF0RW5kICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCB+V2lsZGNhcmRQYXR0ZXJuKCk7CisgICAgICAgIHZpcnR1YWwgYm9vbCBtYXRjaGVzKCBzdGQ6OnN0cmluZyBjb25zdCYgc3RyICkgY29uc3QgeworICAgICAgICAgICAgc3dpdGNoKCBtX3dpbGRjYXJkICkgeworICAgICAgICAgICAgICAgIGNhc2UgTm9XaWxkY2FyZDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1fcGF0dGVybiA9PSBhZGp1c3RDYXNlKCBzdHIgKTsKKyAgICAgICAgICAgICAgICBjYXNlIFdpbGRjYXJkQXRTdGFydDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVuZHNXaXRoKCBhZGp1c3RDYXNlKCBzdHIgKSwgbV9wYXR0ZXJuICk7CisgICAgICAgICAgICAgICAgY2FzZSBXaWxkY2FyZEF0RW5kOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhcnRzV2l0aCggYWRqdXN0Q2FzZSggc3RyICksIG1fcGF0dGVybiApOworICAgICAgICAgICAgICAgIGNhc2UgV2lsZGNhcmRBdEJvdGhFbmRzOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGFpbnMoIGFkanVzdENhc2UoIHN0ciApLCBtX3BhdHRlcm4gKTsKKyAgICAgICAgICAgIH0KKworI2lmZGVmIF9fY2xhbmdfXworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHB1c2gKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV3VucmVhY2hhYmxlLWNvZGUiCisjZW5kaWYKKyAgICAgICAgICAgIHRocm93IHN0ZDo6bG9naWNfZXJyb3IoICJVbmtub3duIGVudW0iICk7CisjaWZkZWYgX19jbGFuZ19fCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCisjZW5kaWYKKyAgICAgICAgfQorICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6c3RyaW5nIGFkanVzdENhc2UoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIgKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbV9jYXNlU2Vuc2l0aXZpdHkgPT0gQ2FzZVNlbnNpdGl2ZTo6Tm8gPyB0b0xvd2VyKCBzdHIgKSA6IHN0cjsKKyAgICAgICAgfQorICAgICAgICBDYXNlU2Vuc2l0aXZlOjpDaG9pY2UgbV9jYXNlU2Vuc2l0aXZpdHk7CisgICAgICAgIFdpbGRjYXJkUG9zaXRpb24gbV93aWxkY2FyZDsKKyAgICAgICAgc3RkOjpzdHJpbmcgbV9wYXR0ZXJuOworICAgIH07Cit9CisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgY2xhc3MgVGVzdFNwZWMgeworICAgICAgICBzdHJ1Y3QgUGF0dGVybiA6IFNoYXJlZEltcGw8PiB7CisgICAgICAgICAgICB2aXJ0dWFsIH5QYXR0ZXJuKCk7CisgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgbWF0Y2hlcyggVGVzdENhc2VJbmZvIGNvbnN0JiB0ZXN0Q2FzZSApIGNvbnN0ID0gMDsKKyAgICAgICAgfTsKKyAgICAgICAgY2xhc3MgTmFtZVBhdHRlcm4gOiBwdWJsaWMgUGF0dGVybiB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIE5hbWVQYXR0ZXJuKCBzdGQ6OnN0cmluZyBjb25zdCYgbmFtZSApCisgICAgICAgICAgICA6IG1fd2lsZGNhcmRQYXR0ZXJuKCB0b0xvd2VyKCBuYW1lICksIENhc2VTZW5zaXRpdmU6Ok5vICkKKyAgICAgICAgICAgIHt9CisgICAgICAgICAgICB2aXJ0dWFsIH5OYW1lUGF0dGVybigpOworICAgICAgICAgICAgdmlydHVhbCBib29sIG1hdGNoZXMoIFRlc3RDYXNlSW5mbyBjb25zdCYgdGVzdENhc2UgKSBjb25zdCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1fd2lsZGNhcmRQYXR0ZXJuLm1hdGNoZXMoIHRvTG93ZXIoIHRlc3RDYXNlLm5hbWUgKSApOworICAgICAgICAgICAgfQorICAgICAgICBwcml2YXRlOgorICAgICAgICAgICAgV2lsZGNhcmRQYXR0ZXJuIG1fd2lsZGNhcmRQYXR0ZXJuOworICAgICAgICB9OworCisgICAgICAgIGNsYXNzIFRhZ1BhdHRlcm4gOiBwdWJsaWMgUGF0dGVybiB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIFRhZ1BhdHRlcm4oIHN0ZDo6c3RyaW5nIGNvbnN0JiB0YWcgKSA6IG1fdGFnKCB0b0xvd2VyKCB0YWcgKSApIHt9CisgICAgICAgICAgICB2aXJ0dWFsIH5UYWdQYXR0ZXJuKCk7CisgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgbWF0Y2hlcyggVGVzdENhc2VJbmZvIGNvbnN0JiB0ZXN0Q2FzZSApIGNvbnN0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGVzdENhc2UubGNhc2VUYWdzLmZpbmQoIG1fdGFnICkgIT0gdGVzdENhc2UubGNhc2VUYWdzLmVuZCgpOworICAgICAgICAgICAgfQorICAgICAgICBwcml2YXRlOgorICAgICAgICAgICAgc3RkOjpzdHJpbmcgbV90YWc7CisgICAgICAgIH07CisKKyAgICAgICAgY2xhc3MgRXhjbHVkZWRQYXR0ZXJuIDogcHVibGljIFBhdHRlcm4geworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBFeGNsdWRlZFBhdHRlcm4oIFB0cjxQYXR0ZXJuPiBjb25zdCYgdW5kZXJseWluZ1BhdHRlcm4gKSA6IG1fdW5kZXJseWluZ1BhdHRlcm4oIHVuZGVybHlpbmdQYXR0ZXJuICkge30KKyAgICAgICAgICAgIHZpcnR1YWwgfkV4Y2x1ZGVkUGF0dGVybigpOworICAgICAgICAgICAgdmlydHVhbCBib29sIG1hdGNoZXMoIFRlc3RDYXNlSW5mbyBjb25zdCYgdGVzdENhc2UgKSBjb25zdCB7IHJldHVybiAhbV91bmRlcmx5aW5nUGF0dGVybi0+bWF0Y2hlcyggdGVzdENhc2UgKTsgfQorICAgICAgICBwcml2YXRlOgorICAgICAgICAgICAgUHRyPFBhdHRlcm4+IG1fdW5kZXJseWluZ1BhdHRlcm47CisgICAgICAgIH07CisKKyAgICAgICAgc3RydWN0IEZpbHRlciB7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxQdHI8UGF0dGVybj4gPiBtX3BhdHRlcm5zOworCisgICAgICAgICAgICBib29sIG1hdGNoZXMoIFRlc3RDYXNlSW5mbyBjb25zdCYgdGVzdENhc2UgKSBjb25zdCB7CisgICAgICAgICAgICAgICAgLy8gQWxsIHBhdHRlcm5zIGluIGEgZmlsdGVyIG11c3QgbWF0Y2ggZm9yIHRoZSBmaWx0ZXIgdG8gYmUgYSBtYXRjaAorICAgICAgICAgICAgICAgIGZvciggc3RkOjp2ZWN0b3I8UHRyPFBhdHRlcm4+ID46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9wYXR0ZXJucy5iZWdpbigpLCBpdEVuZCA9IG1fcGF0dGVybnMuZW5kKCk7IGl0ICE9IGl0RW5kOyArK2l0ICkgeworICAgICAgICAgICAgICAgICAgICBpZiggISgqaXQpLT5tYXRjaGVzKCB0ZXN0Q2FzZSApICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICBwdWJsaWM6CisgICAgICAgIGJvb2wgaGFzRmlsdGVycygpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiAhbV9maWx0ZXJzLmVtcHR5KCk7CisgICAgICAgIH0KKyAgICAgICAgYm9vbCBtYXRjaGVzKCBUZXN0Q2FzZUluZm8gY29uc3QmIHRlc3RDYXNlICkgY29uc3QgeworICAgICAgICAgICAgLy8gQSBUZXN0U3BlYyBtYXRjaGVzIGlmIGFueSBmaWx0ZXIgbWF0Y2hlcworICAgICAgICAgICAgZm9yKCBzdGQ6OnZlY3RvcjxGaWx0ZXI+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1fZmlsdGVycy5iZWdpbigpLCBpdEVuZCA9IG1fZmlsdGVycy5lbmQoKTsgaXQgIT0gaXRFbmQ7ICsraXQgKQorICAgICAgICAgICAgICAgIGlmKCBpdC0+bWF0Y2hlcyggdGVzdENhc2UgKSApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6OnZlY3RvcjxGaWx0ZXI+IG1fZmlsdGVyczsKKworICAgICAgICBmcmllbmQgY2xhc3MgVGVzdFNwZWNQYXJzZXI7CisgICAgfTsKK30KKworI2lmZGVmIF9fY2xhbmdfXworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHBvcAorI2VuZGlmCisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBjbGFzcyBUZXN0U3BlY1BhcnNlciB7CisgICAgICAgIGVudW0gTW9kZXsgTm9uZSwgTmFtZSwgUXVvdGVkTmFtZSwgVGFnLCBFc2NhcGVkTmFtZSB9OworICAgICAgICBNb2RlIG1fbW9kZTsKKyAgICAgICAgYm9vbCBtX2V4Y2x1c2lvbjsKKyAgICAgICAgc3RkOjpzaXplX3QgbV9zdGFydCwgbV9wb3M7CisgICAgICAgIHN0ZDo6c3RyaW5nIG1fYXJnOworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNpemVfdD4gbV9lc2NhcGVDaGFyczsKKyAgICAgICAgVGVzdFNwZWM6OkZpbHRlciBtX2N1cnJlbnRGaWx0ZXI7CisgICAgICAgIFRlc3RTcGVjIG1fdGVzdFNwZWM7CisgICAgICAgIElUYWdBbGlhc1JlZ2lzdHJ5IGNvbnN0KiBtX3RhZ0FsaWFzZXM7CisKKyAgICBwdWJsaWM6CisgICAgICAgIFRlc3RTcGVjUGFyc2VyKCBJVGFnQWxpYXNSZWdpc3RyeSBjb25zdCYgdGFnQWxpYXNlcyApIDogbV90YWdBbGlhc2VzKCAmdGFnQWxpYXNlcyApIHt9CisKKyAgICAgICAgVGVzdFNwZWNQYXJzZXImIHBhcnNlKCBzdGQ6OnN0cmluZyBjb25zdCYgYXJnICkgeworICAgICAgICAgICAgbV9tb2RlID0gTm9uZTsKKyAgICAgICAgICAgIG1fZXhjbHVzaW9uID0gZmFsc2U7CisgICAgICAgICAgICBtX3N0YXJ0ID0gc3RkOjpzdHJpbmc6Om5wb3M7CisgICAgICAgICAgICBtX2FyZyA9IG1fdGFnQWxpYXNlcy0+ZXhwYW5kQWxpYXNlcyggYXJnICk7CisgICAgICAgICAgICBtX2VzY2FwZUNoYXJzLmNsZWFyKCk7CisgICAgICAgICAgICBmb3IoIG1fcG9zID0gMDsgbV9wb3MgPCBtX2FyZy5zaXplKCk7ICsrbV9wb3MgKQorICAgICAgICAgICAgICAgIHZpc2l0Q2hhciggbV9hcmdbbV9wb3NdICk7CisgICAgICAgICAgICBpZiggbV9tb2RlID09IE5hbWUgKQorICAgICAgICAgICAgICAgIGFkZFBhdHRlcm48VGVzdFNwZWM6Ok5hbWVQYXR0ZXJuPigpOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisgICAgICAgIFRlc3RTcGVjIHRlc3RTcGVjKCkgeworICAgICAgICAgICAgYWRkRmlsdGVyKCk7CisgICAgICAgICAgICByZXR1cm4gbV90ZXN0U3BlYzsKKyAgICAgICAgfQorICAgIHByaXZhdGU6CisgICAgICAgIHZvaWQgdmlzaXRDaGFyKCBjaGFyIGMgKSB7CisgICAgICAgICAgICBpZiggbV9tb2RlID09IE5vbmUgKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoKCBjICkgeworICAgICAgICAgICAgICAgIGNhc2UgJyAnOiByZXR1cm47CisgICAgICAgICAgICAgICAgY2FzZSAnfic6IG1fZXhjbHVzaW9uID0gdHJ1ZTsgcmV0dXJuOworICAgICAgICAgICAgICAgIGNhc2UgJ1snOiByZXR1cm4gc3RhcnROZXdNb2RlKCBUYWcsICsrbV9wb3MgKTsKKyAgICAgICAgICAgICAgICBjYXNlICciJzogcmV0dXJuIHN0YXJ0TmV3TW9kZSggUXVvdGVkTmFtZSwgKyttX3BvcyApOworICAgICAgICAgICAgICAgIGNhc2UgJ1xcJzogcmV0dXJuIGVzY2FwZSgpOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHN0YXJ0TmV3TW9kZSggTmFtZSwgbV9wb3MgKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoIG1fbW9kZSA9PSBOYW1lICkgeworICAgICAgICAgICAgICAgIGlmKCBjID09ICcsJyApIHsKKyAgICAgICAgICAgICAgICAgICAgYWRkUGF0dGVybjxUZXN0U3BlYzo6TmFtZVBhdHRlcm4+KCk7CisgICAgICAgICAgICAgICAgICAgIGFkZEZpbHRlcigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmKCBjID09ICdbJyApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIHN1YlN0cmluZygpID09ICJleGNsdWRlOiIgKQorICAgICAgICAgICAgICAgICAgICAgICAgbV9leGNsdXNpb24gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBhZGRQYXR0ZXJuPFRlc3RTcGVjOjpOYW1lUGF0dGVybj4oKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhcnROZXdNb2RlKCBUYWcsICsrbV9wb3MgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiggYyA9PSAnXFwnICkKKyAgICAgICAgICAgICAgICAgICAgZXNjYXBlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKCBtX21vZGUgPT0gRXNjYXBlZE5hbWUgKQorICAgICAgICAgICAgICAgIG1fbW9kZSA9IE5hbWU7CisgICAgICAgICAgICBlbHNlIGlmKCBtX21vZGUgPT0gUXVvdGVkTmFtZSAmJiBjID09ICciJyApCisgICAgICAgICAgICAgICAgYWRkUGF0dGVybjxUZXN0U3BlYzo6TmFtZVBhdHRlcm4+KCk7CisgICAgICAgICAgICBlbHNlIGlmKCBtX21vZGUgPT0gVGFnICYmIGMgPT0gJ10nICkKKyAgICAgICAgICAgICAgICBhZGRQYXR0ZXJuPFRlc3RTcGVjOjpUYWdQYXR0ZXJuPigpOworICAgICAgICB9CisgICAgICAgIHZvaWQgc3RhcnROZXdNb2RlKCBNb2RlIG1vZGUsIHN0ZDo6c2l6ZV90IHN0YXJ0ICkgeworICAgICAgICAgICAgbV9tb2RlID0gbW9kZTsKKyAgICAgICAgICAgIG1fc3RhcnQgPSBzdGFydDsKKyAgICAgICAgfQorICAgICAgICB2b2lkIGVzY2FwZSgpIHsKKyAgICAgICAgICAgIGlmKCBtX21vZGUgPT0gTm9uZSApCisgICAgICAgICAgICAgICAgbV9zdGFydCA9IG1fcG9zOworICAgICAgICAgICAgbV9tb2RlID0gRXNjYXBlZE5hbWU7CisgICAgICAgICAgICBtX2VzY2FwZUNoYXJzLnB1c2hfYmFjayggbV9wb3MgKTsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnN0cmluZyBzdWJTdHJpbmcoKSBjb25zdCB7IHJldHVybiBtX2FyZy5zdWJzdHIoIG1fc3RhcnQsIG1fcG9zIC0gbV9zdGFydCApOyB9CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgICAgIHZvaWQgYWRkUGF0dGVybigpIHsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHRva2VuID0gc3ViU3RyaW5nKCk7CisgICAgICAgICAgICBmb3IoIHNpemVfdCBpID0gMDsgaSA8IG1fZXNjYXBlQ2hhcnMuc2l6ZSgpOyArK2kgKQorICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW4uc3Vic3RyKCAwLCBtX2VzY2FwZUNoYXJzW2ldLW1fc3RhcnQtaSApICsgdG9rZW4uc3Vic3RyKCBtX2VzY2FwZUNoYXJzW2ldLW1fc3RhcnQtaSsxICk7CisgICAgICAgICAgICBtX2VzY2FwZUNoYXJzLmNsZWFyKCk7CisgICAgICAgICAgICBpZiggc3RhcnRzV2l0aCggdG9rZW4sICJleGNsdWRlOiIgKSApIHsKKyAgICAgICAgICAgICAgICBtX2V4Y2x1c2lvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgdG9rZW4gPSB0b2tlbi5zdWJzdHIoIDggKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCAhdG9rZW4uZW1wdHkoKSApIHsKKyAgICAgICAgICAgICAgICBQdHI8VGVzdFNwZWM6OlBhdHRlcm4+IHBhdHRlcm4gPSBuZXcgVCggdG9rZW4gKTsKKyAgICAgICAgICAgICAgICBpZiggbV9leGNsdXNpb24gKQorICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuID0gbmV3IFRlc3RTcGVjOjpFeGNsdWRlZFBhdHRlcm4oIHBhdHRlcm4gKTsKKyAgICAgICAgICAgICAgICBtX2N1cnJlbnRGaWx0ZXIubV9wYXR0ZXJucy5wdXNoX2JhY2soIHBhdHRlcm4gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1fZXhjbHVzaW9uID0gZmFsc2U7CisgICAgICAgICAgICBtX21vZGUgPSBOb25lOworICAgICAgICB9CisgICAgICAgIHZvaWQgYWRkRmlsdGVyKCkgeworICAgICAgICAgICAgaWYoICFtX2N1cnJlbnRGaWx0ZXIubV9wYXR0ZXJucy5lbXB0eSgpICkgeworICAgICAgICAgICAgICAgIG1fdGVzdFNwZWMubV9maWx0ZXJzLnB1c2hfYmFjayggbV9jdXJyZW50RmlsdGVyICk7CisgICAgICAgICAgICAgICAgbV9jdXJyZW50RmlsdGVyID0gVGVzdFNwZWM6OkZpbHRlcigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKyAgICBpbmxpbmUgVGVzdFNwZWMgcGFyc2VUZXN0U3BlYyggc3RkOjpzdHJpbmcgY29uc3QmIGFyZyApIHsKKyAgICAgICAgcmV0dXJuIFRlc3RTcGVjUGFyc2VyKCBJVGFnQWxpYXNSZWdpc3RyeTo6Z2V0KCkgKS5wYXJzZSggYXJnICkudGVzdFNwZWMoKTsKKyAgICB9CisKK30gLy8gbmFtZXNwYWNlIENhdGNoCisKKyNpZmRlZiBfX2NsYW5nX18KKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKKyNlbmRpZgorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfaW50ZXJmYWNlc19jb25maWcuaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfSU5URVJGQUNFU19DT05GSUdfSF9JTkNMVURFRAorCisjaW5jbHVkZSA8aW9zZndkPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBzdHJ1Y3QgVmVyYm9zaXR5IHsgZW51bSBMZXZlbCB7CisgICAgICAgIE5vT3V0cHV0ID0gMCwKKyAgICAgICAgUXVpZXQsCisgICAgICAgIE5vcm1hbAorICAgIH07IH07CisKKyAgICBzdHJ1Y3QgV2FybkFib3V0IHsgZW51bSBXaGF0IHsKKyAgICAgICAgTm90aGluZyA9IDB4MDAsCisgICAgICAgIE5vQXNzZXJ0aW9ucyA9IDB4MDEKKyAgICB9OyB9OworCisgICAgc3RydWN0IFNob3dEdXJhdGlvbnMgeyBlbnVtIE9yTm90IHsKKyAgICAgICAgRGVmYXVsdEZvclJlcG9ydGVyLAorICAgICAgICBBbHdheXMsCisgICAgICAgIE5ldmVyCisgICAgfTsgfTsKKyAgICBzdHJ1Y3QgUnVuVGVzdHMgeyBlbnVtIEluV2hhdE9yZGVyIHsKKyAgICAgICAgSW5EZWNsYXJhdGlvbk9yZGVyLAorICAgICAgICBJbkxleGljb2dyYXBoaWNhbE9yZGVyLAorICAgICAgICBJblJhbmRvbU9yZGVyCisgICAgfTsgfTsKKyAgICBzdHJ1Y3QgVXNlQ29sb3VyIHsgZW51bSBZZXNPck5vIHsKKyAgICAgICAgQXV0bywKKyAgICAgICAgWWVzLAorICAgICAgICBObworICAgIH07IH07CisKKyAgICBjbGFzcyBUZXN0U3BlYzsKKworICAgIHN0cnVjdCBJQ29uZmlnIDogSVNoYXJlZCB7CisKKyAgICAgICAgdmlydHVhbCB+SUNvbmZpZygpOworCisgICAgICAgIHZpcnR1YWwgYm9vbCBhbGxvd1Rocm93cygpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBzdGQ6Om9zdHJlYW0mIHN0cmVhbSgpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBuYW1lKCkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIGJvb2wgaW5jbHVkZVN1Y2Nlc3NmdWxSZXN1bHRzKCkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIGJvb2wgc2hvdWxkRGVidWdCcmVhaygpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBib29sIHdhcm5BYm91dE1pc3NpbmdBc3NlcnRpb25zKCkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIGludCBhYm9ydEFmdGVyKCkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIGJvb2wgc2hvd0ludmlzaWJsZXMoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgU2hvd0R1cmF0aW9uczo6T3JOb3Qgc2hvd0R1cmF0aW9ucygpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBUZXN0U3BlYyBjb25zdCYgdGVzdFNwZWMoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgUnVuVGVzdHM6OkluV2hhdE9yZGVyIHJ1bk9yZGVyKCkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIHVuc2lnbmVkIGludCBybmdTZWVkKCkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIFVzZUNvbG91cjo6WWVzT3JObyB1c2VDb2xvdXIoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGNvbnN0JiBnZXRTZWN0aW9uc1RvUnVuKCkgY29uc3QgPSAwOworCisgICAgfTsKK30KKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3N0cmVhbS5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9TVFJFQU1fSF9JTkNMVURFRAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfc3RyZWFtYnVmLmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1NUUkVBTUJVRl9IX0lOQ0xVREVECisKKyNpbmNsdWRlIDxzdHJlYW1idWY+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBjbGFzcyBTdHJlYW1CdWZCYXNlIDogcHVibGljIHN0ZDo6c3RyZWFtYnVmIHsKKyAgICBwdWJsaWM6CisgICAgICAgIHZpcnR1YWwgflN0cmVhbUJ1ZkJhc2UoKSBDQVRDSF9OT0VYQ0VQVDsKKyAgICB9OworfQorCisjaW5jbHVkZSA8c3RyZWFtYnVmPgorI2luY2x1ZGUgPG9zdHJlYW0+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBzdGQ6Om9zdHJlYW0mIGNvdXQoKTsKKyAgICBzdGQ6Om9zdHJlYW0mIGNlcnIoKTsKKworICAgIHN0cnVjdCBJU3RyZWFtIHsKKyAgICAgICAgdmlydHVhbCB+SVN0cmVhbSgpIENBVENIX05PRVhDRVBUOworICAgICAgICB2aXJ0dWFsIHN0ZDo6b3N0cmVhbSYgc3RyZWFtKCkgY29uc3QgPSAwOworICAgIH07CisKKyAgICBjbGFzcyBGaWxlU3RyZWFtIDogcHVibGljIElTdHJlYW0geworICAgICAgICBtdXRhYmxlIHN0ZDo6b2ZzdHJlYW0gbV9vZnM7CisgICAgcHVibGljOgorICAgICAgICBGaWxlU3RyZWFtKCBzdGQ6OnN0cmluZyBjb25zdCYgZmlsZW5hbWUgKTsKKyAgICAgICAgdmlydHVhbCB+RmlsZVN0cmVhbSgpIENBVENIX05PRVhDRVBUOworICAgIHB1YmxpYzogLy8gSVN0cmVhbQorICAgICAgICB2aXJ0dWFsIHN0ZDo6b3N0cmVhbSYgc3RyZWFtKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREU7CisgICAgfTsKKworICAgIGNsYXNzIENvdXRTdHJlYW0gOiBwdWJsaWMgSVN0cmVhbSB7CisgICAgICAgIG11dGFibGUgc3RkOjpvc3RyZWFtIG1fb3M7CisgICAgcHVibGljOgorICAgICAgICBDb3V0U3RyZWFtKCk7CisgICAgICAgIHZpcnR1YWwgfkNvdXRTdHJlYW0oKSBDQVRDSF9OT0VYQ0VQVDsKKworICAgIHB1YmxpYzogLy8gSVN0cmVhbQorICAgICAgICB2aXJ0dWFsIHN0ZDo6b3N0cmVhbSYgc3RyZWFtKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREU7CisgICAgfTsKKworICAgIGNsYXNzIERlYnVnT3V0U3RyZWFtIDogcHVibGljIElTdHJlYW0geworICAgICAgICBDQVRDSF9BVVRPX1BUUiggU3RyZWFtQnVmQmFzZSApIG1fc3RyZWFtQnVmOworICAgICAgICBtdXRhYmxlIHN0ZDo6b3N0cmVhbSBtX29zOworICAgIHB1YmxpYzoKKyAgICAgICAgRGVidWdPdXRTdHJlYW0oKTsKKyAgICAgICAgdmlydHVhbCB+RGVidWdPdXRTdHJlYW0oKSBDQVRDSF9OT0VYQ0VQVDsKKworICAgIHB1YmxpYzogLy8gSVN0cmVhbQorICAgICAgICB2aXJ0dWFsIHN0ZDo6b3N0cmVhbSYgc3RyZWFtKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREU7CisgICAgfTsKK30KKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKworI2lmbmRlZiBDQVRDSF9DT05GSUdfQ09OU09MRV9XSURUSAorI2RlZmluZSBDQVRDSF9DT05GSUdfQ09OU09MRV9XSURUSCA4MAorI2VuZGlmCisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBzdHJ1Y3QgQ29uZmlnRGF0YSB7CisKKyAgICAgICAgQ29uZmlnRGF0YSgpCisgICAgICAgIDogICBsaXN0VGVzdHMoIGZhbHNlICksCisgICAgICAgICAgICBsaXN0VGFncyggZmFsc2UgKSwKKyAgICAgICAgICAgIGxpc3RSZXBvcnRlcnMoIGZhbHNlICksCisgICAgICAgICAgICBsaXN0VGVzdE5hbWVzT25seSggZmFsc2UgKSwKKyAgICAgICAgICAgIHNob3dTdWNjZXNzZnVsVGVzdHMoIGZhbHNlICksCisgICAgICAgICAgICBzaG91bGREZWJ1Z0JyZWFrKCBmYWxzZSApLAorICAgICAgICAgICAgbm9UaHJvdyggZmFsc2UgKSwKKyAgICAgICAgICAgIHNob3dIZWxwKCBmYWxzZSApLAorICAgICAgICAgICAgc2hvd0ludmlzaWJsZXMoIGZhbHNlICksCisgICAgICAgICAgICBmaWxlbmFtZXNBc1RhZ3MoIGZhbHNlICksCisgICAgICAgICAgICBhYm9ydEFmdGVyKCAtMSApLAorICAgICAgICAgICAgcm5nU2VlZCggMCApLAorICAgICAgICAgICAgdmVyYm9zaXR5KCBWZXJib3NpdHk6Ok5vcm1hbCApLAorICAgICAgICAgICAgd2FybmluZ3MoIFdhcm5BYm91dDo6Tm90aGluZyApLAorICAgICAgICAgICAgc2hvd0R1cmF0aW9ucyggU2hvd0R1cmF0aW9uczo6RGVmYXVsdEZvclJlcG9ydGVyICksCisgICAgICAgICAgICBydW5PcmRlciggUnVuVGVzdHM6OkluRGVjbGFyYXRpb25PcmRlciApLAorICAgICAgICAgICAgdXNlQ29sb3VyKCBVc2VDb2xvdXI6OkF1dG8gKQorICAgICAgICB7fQorCisgICAgICAgIGJvb2wgbGlzdFRlc3RzOworICAgICAgICBib29sIGxpc3RUYWdzOworICAgICAgICBib29sIGxpc3RSZXBvcnRlcnM7CisgICAgICAgIGJvb2wgbGlzdFRlc3ROYW1lc09ubHk7CisKKyAgICAgICAgYm9vbCBzaG93U3VjY2Vzc2Z1bFRlc3RzOworICAgICAgICBib29sIHNob3VsZERlYnVnQnJlYWs7CisgICAgICAgIGJvb2wgbm9UaHJvdzsKKyAgICAgICAgYm9vbCBzaG93SGVscDsKKyAgICAgICAgYm9vbCBzaG93SW52aXNpYmxlczsKKyAgICAgICAgYm9vbCBmaWxlbmFtZXNBc1RhZ3M7CisKKyAgICAgICAgaW50IGFib3J0QWZ0ZXI7CisgICAgICAgIHVuc2lnbmVkIGludCBybmdTZWVkOworCisgICAgICAgIFZlcmJvc2l0eTo6TGV2ZWwgdmVyYm9zaXR5OworICAgICAgICBXYXJuQWJvdXQ6OldoYXQgd2FybmluZ3M7CisgICAgICAgIFNob3dEdXJhdGlvbnM6Ok9yTm90IHNob3dEdXJhdGlvbnM7CisgICAgICAgIFJ1blRlc3RzOjpJbldoYXRPcmRlciBydW5PcmRlcjsKKyAgICAgICAgVXNlQ29sb3VyOjpZZXNPck5vIHVzZUNvbG91cjsKKworICAgICAgICBzdGQ6OnN0cmluZyBvdXRwdXRGaWxlbmFtZTsKKyAgICAgICAgc3RkOjpzdHJpbmcgbmFtZTsKKyAgICAgICAgc3RkOjpzdHJpbmcgcHJvY2Vzc05hbWU7CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHJlcG9ydGVyTmFtZXM7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiB0ZXN0c09yVGFnczsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHNlY3Rpb25zVG9SdW47CisgICAgfTsKKworICAgIGNsYXNzIENvbmZpZyA6IHB1YmxpYyBTaGFyZWRJbXBsPElDb25maWc+IHsKKyAgICBwcml2YXRlOgorICAgICAgICBDb25maWcoIENvbmZpZyBjb25zdCYgb3RoZXIgKTsKKyAgICAgICAgQ29uZmlnJiBvcGVyYXRvciA9ICggQ29uZmlnIGNvbnN0JiBvdGhlciApOworICAgICAgICB2aXJ0dWFsIHZvaWQgZHVtbXkoKTsKKyAgICBwdWJsaWM6CisKKyAgICAgICAgQ29uZmlnKCkKKyAgICAgICAge30KKworICAgICAgICBDb25maWcoIENvbmZpZ0RhdGEgY29uc3QmIGRhdGEgKQorICAgICAgICA6ICAgbV9kYXRhKCBkYXRhICksCisgICAgICAgICAgICBtX3N0cmVhbSggb3BlblN0cmVhbSgpICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoICFkYXRhLnRlc3RzT3JUYWdzLmVtcHR5KCkgKSB7CisgICAgICAgICAgICAgICAgVGVzdFNwZWNQYXJzZXIgcGFyc2VyKCBJVGFnQWxpYXNSZWdpc3RyeTo6Z2V0KCkgKTsKKyAgICAgICAgICAgICAgICBmb3IoIHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgZGF0YS50ZXN0c09yVGFncy5zaXplKCk7ICsraSApCisgICAgICAgICAgICAgICAgICAgIHBhcnNlci5wYXJzZSggZGF0YS50ZXN0c09yVGFnc1tpXSApOworICAgICAgICAgICAgICAgIG1fdGVzdFNwZWMgPSBwYXJzZXIudGVzdFNwZWMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgfkNvbmZpZygpIHt9CisKKyAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIGdldEZpbGVuYW1lKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1fZGF0YS5vdXRwdXRGaWxlbmFtZSA7CisgICAgICAgIH0KKworICAgICAgICBib29sIGxpc3RUZXN0cygpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YS5saXN0VGVzdHM7IH0KKyAgICAgICAgYm9vbCBsaXN0VGVzdE5hbWVzT25seSgpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YS5saXN0VGVzdE5hbWVzT25seTsgfQorICAgICAgICBib29sIGxpc3RUYWdzKCkgY29uc3QgeyByZXR1cm4gbV9kYXRhLmxpc3RUYWdzOyB9CisgICAgICAgIGJvb2wgbGlzdFJlcG9ydGVycygpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YS5saXN0UmVwb3J0ZXJzOyB9CisKKyAgICAgICAgc3RkOjpzdHJpbmcgZ2V0UHJvY2Vzc05hbWUoKSBjb25zdCB7IHJldHVybiBtX2RhdGEucHJvY2Vzc05hbWU7IH0KKworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gY29uc3QmIGdldFJlcG9ydGVyTmFtZXMoKSBjb25zdCB7IHJldHVybiBtX2RhdGEucmVwb3J0ZXJOYW1lczsgfQorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gY29uc3QmIGdldFNlY3Rpb25zVG9SdW4oKSBjb25zdCBDQVRDSF9PVkVSUklERSB7IHJldHVybiBtX2RhdGEuc2VjdGlvbnNUb1J1bjsgfQorCisgICAgICAgIHZpcnR1YWwgVGVzdFNwZWMgY29uc3QmIHRlc3RTcGVjKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeyByZXR1cm4gbV90ZXN0U3BlYzsgfQorCisgICAgICAgIGJvb2wgc2hvd0hlbHAoKSBjb25zdCB7IHJldHVybiBtX2RhdGEuc2hvd0hlbHA7IH0KKworICAgICAgICAvLyBJQ29uZmlnIGludGVyZmFjZQorICAgICAgICB2aXJ0dWFsIGJvb2wgYWxsb3dUaHJvd3MoKSBjb25zdCBDQVRDSF9PVkVSUklERSAgICAgICAgICAgICAgICAgeyByZXR1cm4gIW1fZGF0YS5ub1Rocm93OyB9CisgICAgICAgIHZpcnR1YWwgc3RkOjpvc3RyZWFtJiBzdHJlYW0oKSBjb25zdCBDQVRDSF9PVkVSUklERSAgICAgICAgICAgICB7IHJldHVybiBtX3N0cmVhbS0+c3RyZWFtKCk7IH0KKyAgICAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBuYW1lKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgICAgICAgICAgICAgICAgIHsgcmV0dXJuIG1fZGF0YS5uYW1lLmVtcHR5KCkgPyBtX2RhdGEucHJvY2Vzc05hbWUgOiBtX2RhdGEubmFtZTsgfQorICAgICAgICB2aXJ0dWFsIGJvb2wgaW5jbHVkZVN1Y2Nlc3NmdWxSZXN1bHRzKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgICAgeyByZXR1cm4gbV9kYXRhLnNob3dTdWNjZXNzZnVsVGVzdHM7IH0KKyAgICAgICAgdmlydHVhbCBib29sIHdhcm5BYm91dE1pc3NpbmdBc3NlcnRpb25zKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgIHsgcmV0dXJuIG1fZGF0YS53YXJuaW5ncyAmIFdhcm5BYm91dDo6Tm9Bc3NlcnRpb25zOyB9CisgICAgICAgIHZpcnR1YWwgU2hvd0R1cmF0aW9uczo6T3JOb3Qgc2hvd0R1cmF0aW9ucygpIGNvbnN0IENBVENIX09WRVJSSURFIHsgcmV0dXJuIG1fZGF0YS5zaG93RHVyYXRpb25zOyB9CisgICAgICAgIHZpcnR1YWwgUnVuVGVzdHM6OkluV2hhdE9yZGVyIHJ1bk9yZGVyKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgICB7IHJldHVybiBtX2RhdGEucnVuT3JkZXI7IH0KKyAgICAgICAgdmlydHVhbCB1bnNpZ25lZCBpbnQgcm5nU2VlZCgpIGNvbnN0IENBVENIX09WRVJSSURFICAgICAgICAgICAgIHsgcmV0dXJuIG1fZGF0YS5ybmdTZWVkOyB9CisgICAgICAgIHZpcnR1YWwgVXNlQ29sb3VyOjpZZXNPck5vIHVzZUNvbG91cigpIGNvbnN0IENBVENIX09WRVJSSURFICAgICB7IHJldHVybiBtX2RhdGEudXNlQ29sb3VyOyB9CisgICAgICAgIHZpcnR1YWwgYm9vbCBzaG91bGREZWJ1Z0JyZWFrKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeyByZXR1cm4gbV9kYXRhLnNob3VsZERlYnVnQnJlYWs7IH0KKyAgICAgICAgdmlydHVhbCBpbnQgYWJvcnRBZnRlcigpIGNvbnN0IENBVENIX09WRVJSSURFIHsgcmV0dXJuIG1fZGF0YS5hYm9ydEFmdGVyOyB9CisgICAgICAgIHZpcnR1YWwgYm9vbCBzaG93SW52aXNpYmxlcygpIGNvbnN0IENBVENIX09WRVJSSURFIHsgcmV0dXJuIG1fZGF0YS5zaG93SW52aXNpYmxlczsgfQorCisgICAgcHJpdmF0ZToKKworICAgICAgICBJU3RyZWFtIGNvbnN0KiBvcGVuU3RyZWFtKCkgeworICAgICAgICAgICAgaWYoIG1fZGF0YS5vdXRwdXRGaWxlbmFtZS5lbXB0eSgpICkKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIGVsc2UgaWYoIG1fZGF0YS5vdXRwdXRGaWxlbmFtZVswXSA9PSAnJScgKSB7CisgICAgICAgICAgICAgICAgaWYoIG1fZGF0YS5vdXRwdXRGaWxlbmFtZSA9PSAiJWRlYnVnIiApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRGVidWdPdXRTdHJlYW0oKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHRocm93IHN0ZDo6ZG9tYWluX2Vycm9yKCAiVW5yZWNvZ25pc2VkIHN0cmVhbTogIiArIG1fZGF0YS5vdXRwdXRGaWxlbmFtZSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRmlsZVN0cmVhbSggbV9kYXRhLm91dHB1dEZpbGVuYW1lICk7CisgICAgICAgIH0KKyAgICAgICAgQ29uZmlnRGF0YSBtX2RhdGE7CisKKyAgICAgICAgQ0FUQ0hfQVVUT19QVFIoIElTdHJlYW0gY29uc3QgKSBtX3N0cmVhbTsKKyAgICAgICAgVGVzdFNwZWMgbV90ZXN0U3BlYzsKKyAgICB9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX2NsYXJhLmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0NMQVJBX0hfSU5DTFVERUQKKworLy8gVXNlIENhdGNoJ3MgdmFsdWUgZm9yIGNvbnNvbGUgd2lkdGggKHN0b3JlIENsYXJhJ3Mgb2ZmIHRvIHRoZSBzaWRlLCBpZiBwcmVzZW50KQorI2lmZGVmIENMQVJBX0NPTkZJR19DT05TT0xFX1dJRFRICisjZGVmaW5lIENBVENIX1RFTVBfQ0xBUkFfQ09ORklHX0NPTlNPTEVfV0lEVEggQ0xBUkFfQ09ORklHX0NPTlNPTEVfV0lEVEgKKyN1bmRlZiBDTEFSQV9DT05GSUdfQ09OU09MRV9XSURUSAorI2VuZGlmCisjZGVmaW5lIENMQVJBX0NPTkZJR19DT05TT0xFX1dJRFRIIENBVENIX0NPTkZJR19DT05TT0xFX1dJRFRICisKKy8vIERlY2xhcmUgQ2xhcmEgaW5zaWRlIHRoZSBDYXRjaCBuYW1lc3BhY2UKKyNkZWZpbmUgU1RJVENIX0NMQVJBX09QRU5fTkFNRVNQQUNFIG5hbWVzcGFjZSBDYXRjaCB7CisvLyAjaW5jbHVkZWQgZnJvbTogLi4vZXh0ZXJuYWwvY2xhcmEuaAorCisvLyBWZXJzaW9uIDAuMC4yLjQKKworLy8gT25seSB1c2UgaGVhZGVyIGd1YXJkIGlmIHdlIGFyZSBub3QgdXNpbmcgYW4gb3V0ZXIgbmFtZXNwYWNlCisjaWYgIWRlZmluZWQoVFdPQkxVRUNVQkVTX0NMQVJBX0hfSU5DTFVERUQpIHx8IGRlZmluZWQoU1RJVENIX0NMQVJBX09QRU5fTkFNRVNQQUNFKQorCisjaWZuZGVmIFNUSVRDSF9DTEFSQV9PUEVOX05BTUVTUEFDRQorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0xBUkFfSF9JTkNMVURFRAorI2RlZmluZSBTVElUQ0hfQ0xBUkFfT1BFTl9OQU1FU1BBQ0UKKyNkZWZpbmUgU1RJVENIX0NMQVJBX0NMT1NFX05BTUVTUEFDRQorI2Vsc2UKKyNkZWZpbmUgU1RJVENIX0NMQVJBX0NMT1NFX05BTUVTUEFDRSB9CisjZW5kaWYKKworI2RlZmluZSBTVElUQ0hfVEJDX1RFWFRfRk9STUFUX09QRU5fTkFNRVNQQUNFIFNUSVRDSF9DTEFSQV9PUEVOX05BTUVTUEFDRQorCisvLyAtLS0tLS0tLS0tLSAjaW5jbHVkZWQgZnJvbSB0YmNfdGV4dF9mb3JtYXQuaCAtLS0tLS0tLS0tLQorCisvLyBPbmx5IHVzZSBoZWFkZXIgZ3VhcmQgaWYgd2UgYXJlIG5vdCB1c2luZyBhbiBvdXRlciBuYW1lc3BhY2UKKyNpZiAhZGVmaW5lZChUQkNfVEVYVF9GT1JNQVRfSF9JTkNMVURFRCkgfHwgZGVmaW5lZChTVElUQ0hfVEJDX1RFWFRfRk9STUFUX09VVEVSX05BTUVTUEFDRSkKKyNpZm5kZWYgU1RJVENIX1RCQ19URVhUX0ZPUk1BVF9PVVRFUl9OQU1FU1BBQ0UKKyNkZWZpbmUgVEJDX1RFWFRfRk9STUFUX0hfSU5DTFVERUQKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjY3R5cGU+CisKKy8vIFVzZSBvcHRpb25hbCBvdXRlciBuYW1lc3BhY2UKKyNpZmRlZiBTVElUQ0hfVEJDX1RFWFRfRk9STUFUX09VVEVSX05BTUVTUEFDRQorbmFtZXNwYWNlIFNUSVRDSF9UQkNfVEVYVF9GT1JNQVRfT1VURVJfTkFNRVNQQUNFIHsKKyNlbmRpZgorCituYW1lc3BhY2UgVGJjIHsKKworI2lmZGVmIFRCQ19URVhUX0ZPUk1BVF9DT05TT0xFX1dJRFRICisgICAgY29uc3QgdW5zaWduZWQgaW50IGNvbnNvbGVXaWR0aCA9IFRCQ19URVhUX0ZPUk1BVF9DT05TT0xFX1dJRFRIOworI2Vsc2UKKyAgICBjb25zdCB1bnNpZ25lZCBpbnQgY29uc29sZVdpZHRoID0gODA7CisjZW5kaWYKKworICAgIHN0cnVjdCBUZXh0QXR0cmlidXRlcyB7CisgICAgICAgIFRleHRBdHRyaWJ1dGVzKCkKKyAgICAgICAgOiAgIGluaXRpYWxJbmRlbnQoIHN0ZDo6c3RyaW5nOjpucG9zICksCisgICAgICAgICAgICBpbmRlbnQoIDAgKSwKKyAgICAgICAgICAgIHdpZHRoKCBjb25zb2xlV2lkdGgtMSApLAorICAgICAgICAgICAgdGFiQ2hhciggJ1x0JyApCisgICAgICAgIHt9CisKKyAgICAgICAgVGV4dEF0dHJpYnV0ZXMmIHNldEluaXRpYWxJbmRlbnQoIHN0ZDo6c2l6ZV90IF92YWx1ZSApICB7IGluaXRpYWxJbmRlbnQgPSBfdmFsdWU7IHJldHVybiAqdGhpczsgfQorICAgICAgICBUZXh0QXR0cmlidXRlcyYgc2V0SW5kZW50KCBzdGQ6OnNpemVfdCBfdmFsdWUgKSAgICAgICAgIHsgaW5kZW50ID0gX3ZhbHVlOyByZXR1cm4gKnRoaXM7IH0KKyAgICAgICAgVGV4dEF0dHJpYnV0ZXMmIHNldFdpZHRoKCBzdGQ6OnNpemVfdCBfdmFsdWUgKSAgICAgICAgICB7IHdpZHRoID0gX3ZhbHVlOyByZXR1cm4gKnRoaXM7IH0KKyAgICAgICAgVGV4dEF0dHJpYnV0ZXMmIHNldFRhYkNoYXIoIGNoYXIgX3ZhbHVlICkgICAgICAgICAgICAgICB7IHRhYkNoYXIgPSBfdmFsdWU7IHJldHVybiAqdGhpczsgfQorCisgICAgICAgIHN0ZDo6c2l6ZV90IGluaXRpYWxJbmRlbnQ7ICAvLyBpbmRlbnQgb2YgZmlyc3QgbGluZSwgb3IgbnBvcworICAgICAgICBzdGQ6OnNpemVfdCBpbmRlbnQ7ICAgICAgICAgLy8gaW5kZW50IG9mIHN1YnNlcXVlbnQgbGluZXMsIG9yIGFsbCBpZiBpbml0aWFsSW5kZW50IGlzIG5wb3MKKyAgICAgICAgc3RkOjpzaXplX3Qgd2lkdGg7ICAgICAgICAgIC8vIG1heGltdW0gd2lkdGggb2YgdGV4dCwgaW5jbHVkaW5nIGluZGVudC4gTG9uZ2VyIHRleHQgd2lsbCB3cmFwCisgICAgICAgIGNoYXIgdGFiQ2hhcjsgICAgICAgICAgICAgICAvLyBJZiB0aGlzIGNoYXIgaXMgc2VlbiB0aGUgaW5kZW50IGlzIGNoYW5nZWQgdG8gY3VycmVudCBwb3MKKyAgICB9OworCisgICAgY2xhc3MgVGV4dCB7CisgICAgcHVibGljOgorICAgICAgICBUZXh0KCBzdGQ6OnN0cmluZyBjb25zdCYgX3N0ciwgVGV4dEF0dHJpYnV0ZXMgY29uc3QmIF9hdHRyID0gVGV4dEF0dHJpYnV0ZXMoKSApCisgICAgICAgIDogYXR0ciggX2F0dHIgKQorICAgICAgICB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyB3cmFwcGFibGVDaGFycyA9ICIgWyh7LiwvfFxcLSI7CisgICAgICAgICAgICBzdGQ6OnNpemVfdCBpbmRlbnQgPSBfYXR0ci5pbml0aWFsSW5kZW50ICE9IHN0ZDo6c3RyaW5nOjpucG9zCisgICAgICAgICAgICAgICAgPyBfYXR0ci5pbml0aWFsSW5kZW50CisgICAgICAgICAgICAgICAgOiBfYXR0ci5pbmRlbnQ7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyByZW1haW5kZXIgPSBfc3RyOworCisgICAgICAgICAgICB3aGlsZSggIXJlbWFpbmRlci5lbXB0eSgpICkgeworICAgICAgICAgICAgICAgIGlmKCBsaW5lcy5zaXplKCkgPj0gMTAwMCApIHsKKyAgICAgICAgICAgICAgICAgICAgbGluZXMucHVzaF9iYWNrKCAiLi4uIG1lc3NhZ2UgdHJ1bmNhdGVkIGR1ZSB0byBleGNlc3NpdmUgc2l6ZSIgKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdGQ6OnNpemVfdCB0YWJQb3MgPSBzdGQ6OnN0cmluZzo6bnBvczsKKyAgICAgICAgICAgICAgICBzdGQ6OnNpemVfdCB3aWR0aCA9IChzdGQ6Om1pbikoIHJlbWFpbmRlci5zaXplKCksIF9hdHRyLndpZHRoIC0gaW5kZW50ICk7CisgICAgICAgICAgICAgICAgc3RkOjpzaXplX3QgcG9zID0gcmVtYWluZGVyLmZpbmRfZmlyc3Rfb2YoICdcbicgKTsKKyAgICAgICAgICAgICAgICBpZiggcG9zIDw9IHdpZHRoICkgeworICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IHBvczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcG9zID0gcmVtYWluZGVyLmZpbmRfbGFzdF9vZiggX2F0dHIudGFiQ2hhciwgd2lkdGggKTsKKyAgICAgICAgICAgICAgICBpZiggcG9zICE9IHN0ZDo6c3RyaW5nOjpucG9zICkgeworICAgICAgICAgICAgICAgICAgICB0YWJQb3MgPSBwb3M7CisgICAgICAgICAgICAgICAgICAgIGlmKCByZW1haW5kZXJbd2lkdGhdID09ICdcbicgKQorICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgtLTsKKyAgICAgICAgICAgICAgICAgICAgcmVtYWluZGVyID0gcmVtYWluZGVyLnN1YnN0ciggMCwgdGFiUG9zICkgKyByZW1haW5kZXIuc3Vic3RyKCB0YWJQb3MrMSApOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmKCB3aWR0aCA9PSByZW1haW5kZXIuc2l6ZSgpICkgeworICAgICAgICAgICAgICAgICAgICBzcGxpY2VMaW5lKCBpbmRlbnQsIHJlbWFpbmRlciwgd2lkdGggKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiggcmVtYWluZGVyW3dpZHRoXSA9PSAnXG4nICkgeworICAgICAgICAgICAgICAgICAgICBzcGxpY2VMaW5lKCBpbmRlbnQsIHJlbWFpbmRlciwgd2lkdGggKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoIHdpZHRoIDw9IDEgfHwgcmVtYWluZGVyLnNpemUoKSAhPSAxICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmRlciA9IHJlbWFpbmRlci5zdWJzdHIoIDEgKTsKKyAgICAgICAgICAgICAgICAgICAgaW5kZW50ID0gX2F0dHIuaW5kZW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcG9zID0gcmVtYWluZGVyLmZpbmRfbGFzdF9vZiggd3JhcHBhYmxlQ2hhcnMsIHdpZHRoICk7CisgICAgICAgICAgICAgICAgICAgIGlmKCBwb3MgIT0gc3RkOjpzdHJpbmc6Om5wb3MgJiYgcG9zID4gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwbGljZUxpbmUoIGluZGVudCwgcmVtYWluZGVyLCBwb3MgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCByZW1haW5kZXJbMF0gPT0gJyAnICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1haW5kZXIgPSByZW1haW5kZXIuc3Vic3RyKCAxICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzcGxpY2VMaW5lKCBpbmRlbnQsIHJlbWFpbmRlciwgd2lkdGgtMSApOworICAgICAgICAgICAgICAgICAgICAgICAgbGluZXMuYmFjaygpICs9ICItIjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiggbGluZXMuc2l6ZSgpID09IDEgKQorICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50ID0gX2F0dHIuaW5kZW50OworICAgICAgICAgICAgICAgICAgICBpZiggdGFiUG9zICE9IHN0ZDo6c3RyaW5nOjpucG9zICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudCArPSB0YWJQb3M7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdm9pZCBzcGxpY2VMaW5lKCBzdGQ6OnNpemVfdCBfaW5kZW50LCBzdGQ6OnN0cmluZyYgX3JlbWFpbmRlciwgc3RkOjpzaXplX3QgX3BvcyApIHsKKyAgICAgICAgICAgIGxpbmVzLnB1c2hfYmFjayggc3RkOjpzdHJpbmcoIF9pbmRlbnQsICcgJyApICsgX3JlbWFpbmRlci5zdWJzdHIoIDAsIF9wb3MgKSApOworICAgICAgICAgICAgX3JlbWFpbmRlciA9IF9yZW1haW5kZXIuc3Vic3RyKCBfcG9zICk7CisgICAgICAgIH0KKworICAgICAgICB0eXBlZGVmIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgY29uc3RfaXRlcmF0b3I7CisKKyAgICAgICAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBsaW5lcy5iZWdpbigpOyB9CisgICAgICAgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIGxpbmVzLmVuZCgpOyB9CisgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBsYXN0KCkgY29uc3QgeyByZXR1cm4gbGluZXMuYmFjaygpOyB9CisgICAgICAgIHN0ZDo6c2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBsaW5lcy5zaXplKCk7IH0KKyAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIG9wZXJhdG9yW10oIHN0ZDo6c2l6ZV90IF9pbmRleCApIGNvbnN0IHsgcmV0dXJuIGxpbmVzW19pbmRleF07IH0KKyAgICAgICAgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdCB7CisgICAgICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICAgICAgICAgICAgb3NzIDw8ICp0aGlzOworICAgICAgICAgICAgcmV0dXJuIG9zcy5zdHIoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlubGluZSBmcmllbmQgc3RkOjpvc3RyZWFtJiBvcGVyYXRvciA8PCAoIHN0ZDo6b3N0cmVhbSYgX3N0cmVhbSwgVGV4dCBjb25zdCYgX3RleHQgKSB7CisgICAgICAgICAgICBmb3IoIFRleHQ6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gX3RleHQuYmVnaW4oKSwgaXRFbmQgPSBfdGV4dC5lbmQoKTsKKyAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsgKytpdCApIHsKKyAgICAgICAgICAgICAgICBpZiggaXQgIT0gX3RleHQuYmVnaW4oKSApCisgICAgICAgICAgICAgICAgICAgIF9zdHJlYW0gPDwgIlxuIjsKKyAgICAgICAgICAgICAgICBfc3RyZWFtIDw8ICppdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBfc3RyZWFtOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6OnN0cmluZyBzdHI7CisgICAgICAgIFRleHRBdHRyaWJ1dGVzIGF0dHI7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBsaW5lczsKKyAgICB9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgVGJjCisKKyNpZmRlZiBTVElUQ0hfVEJDX1RFWFRfRk9STUFUX09VVEVSX05BTUVTUEFDRQorfSAvLyBlbmQgb3V0ZXIgbmFtZXNwYWNlCisjZW5kaWYKKworI2VuZGlmIC8vIFRCQ19URVhUX0ZPUk1BVF9IX0lOQ0xVREVECisKKy8vIC0tLS0tLS0tLS0tIGVuZCBvZiAjaW5jbHVkZSBmcm9tIHRiY190ZXh0X2Zvcm1hdC5oIC0tLS0tLS0tLS0tCisvLyAuLi4uLi4uLi4uLiBiYWNrIGluIGNsYXJhLmgKKworI3VuZGVmIFNUSVRDSF9UQkNfVEVYVF9GT1JNQVRfT1BFTl9OQU1FU1BBQ0UKKworLy8gLS0tLS0tLS0tLS0gI2luY2x1ZGVkIGZyb20gY2xhcmFfY29tcGlsZXJzLmggLS0tLS0tLS0tLS0KKworI2lmbmRlZiBUV09CTFVFQ1VCRVNfQ0xBUkFfQ09NUElMRVJTX0hfSU5DTFVERUQKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NMQVJBX0NPTVBJTEVSU19IX0lOQ0xVREVECisKKy8vIERldGVjdCBhIG51bWJlciBvZiBjb21waWxlciBmZWF0dXJlcyAtIG1vc3RseSBDKysxMS8xNCBjb25mb3JtYW5jZSAtIGJ5IGNvbXBpbGVyCisvLyBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBkZWZpbmVkOgorLy8KKy8vIENMQVJBX0NPTkZJR19DUFAxMV9OVUxMUFRSIDogaXMgbnVsbHB0ciBzdXBwb3J0ZWQ/CisvLyBDTEFSQV9DT05GSUdfQ1BQMTFfTk9FWENFUFQgOiBpcyBub2V4Y2VwdCBzdXBwb3J0ZWQ/CisvLyBDTEFSQV9DT05GSUdfQ1BQMTFfR0VORVJBVEVEX01FVEhPRFMgOiBUaGUgZGVsZXRlIGFuZCBkZWZhdWx0IGtleXdvcmRzIGZvciBjb21waWxlciBnZW5lcmF0ZWQgbWV0aG9kcworLy8gQ0xBUkFfQ09ORklHX0NQUDExX09WRVJSSURFIDogaXMgb3ZlcnJpZGUgc3VwcG9ydGVkPworLy8gQ0xBUkFfQ09ORklHX0NQUDExX1VOSVFVRV9QVFIgOiBpcyB1bmlxdWVfcHRyIHN1cHBvcnRlZCAob3RoZXJ3aXNlIHVzZSBhdXRvX3B0cikKKworLy8gQ0xBUkFfQ09ORklHX0NQUDExX09SX0dSRUFURVIgOiBJcyBDKysxMSBzdXBwb3J0ZWQ/CisKKy8vIENMQVJBX0NPTkZJR19WQVJJQURJQ19NQUNST1MgOiBhcmUgdmFyaWFkaWMgbWFjcm9zIHN1cHBvcnRlZD8KKworLy8gSW4gZ2VuZXJhbCBlYWNoIG1hY3JvIGhhcyBhIF9OT188ZmVhdHVyZSBuYW1lPiBmb3JtCisvLyAoZS5nLiBDTEFSQV9DT05GSUdfQ1BQMTFfTk9fTlVMTFBUUikgd2hpY2ggZGlzYWJsZXMgdGhlIGZlYXR1cmUuCisvLyBNYW55IGZlYXR1cmVzLCBhdCBwb2ludCBvZiBkZXRlY3Rpb24sIGRlZmluZSBhbiBfSU5URVJOQUxfIG1hY3JvLCBzbyB0aGV5CisvLyBjYW4gYmUgY29tYmluZWQsIGVuLW1hc3MsIHdpdGggdGhlIF9OT18gZm9ybXMgbGF0ZXIuCisKKy8vIEFsbCB0aGUgQysrMTEgZmVhdHVyZXMgY2FuIGJlIGRpc2FibGVkIHdpdGggQ0xBUkFfQ09ORklHX05PX0NQUDExCisKKyNpZmRlZiBfX2NsYW5nX18KKworI2lmIF9faGFzX2ZlYXR1cmUoY3h4X251bGxwdHIpCisjZGVmaW5lIENMQVJBX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9OVUxMUFRSCisjZW5kaWYKKworI2lmIF9faGFzX2ZlYXR1cmUoY3h4X25vZXhjZXB0KQorI2RlZmluZSBDTEFSQV9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfTk9FWENFUFQKKyNlbmRpZgorCisjZW5kaWYgLy8gX19jbGFuZ19fCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBHQ0MKKyNpZmRlZiBfX0dOVUNfXworCisjaWYgX19HTlVDX18gPT0gNCAmJiBfX0dOVUNfTUlOT1JfXyA+PSA2ICYmIGRlZmluZWQoX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18pCisjZGVmaW5lIENMQVJBX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9OVUxMUFRSCisjZW5kaWYKKworLy8gLSBvdGhlcndpc2UgbW9yZSByZWNlbnQgdmVyc2lvbnMgZGVmaW5lIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKy8vIGFuZCB3aWxsIGdldCBwaWNrZWQgdXAgYmVsb3cKKworI2VuZGlmIC8vIF9fR05VQ19fCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBWaXN1YWwgQysrCisjaWZkZWYgX01TQ19WRVIKKworI2lmIChfTVNDX1ZFUiA+PSAxNjAwKQorI2RlZmluZSBDTEFSQV9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfTlVMTFBUUgorI2RlZmluZSBDTEFSQV9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfVU5JUVVFX1BUUgorI2VuZGlmCisKKyNpZiAoX01TQ19WRVIgPj0gMTkwMCApIC8vIChWQysrIDEzIChWUzIwMTUpKQorI2RlZmluZSBDTEFSQV9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfTk9FWENFUFQKKyNkZWZpbmUgQ0xBUkFfSU5URVJOQUxfQ09ORklHX0NQUDExX0dFTkVSQVRFRF9NRVRIT0RTCisjZW5kaWYKKworI2VuZGlmIC8vIF9NU0NfVkVSCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDKysgbGFuZ3VhZ2UgZmVhdHVyZSBzdXBwb3J0CisKKy8vIGNhdGNoIGFsbCBzdXBwb3J0IGZvciBDKysxMQorI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpICYmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKworI2RlZmluZSBDTEFSQV9DUFAxMV9PUl9HUkVBVEVSCisKKyNpZiAhZGVmaW5lZChDTEFSQV9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfTlVMTFBUUikKKyNkZWZpbmUgQ0xBUkFfSU5URVJOQUxfQ09ORklHX0NQUDExX05VTExQVFIKKyNlbmRpZgorCisjaWZuZGVmIENMQVJBX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9OT0VYQ0VQVAorI2RlZmluZSBDTEFSQV9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfTk9FWENFUFQKKyNlbmRpZgorCisjaWZuZGVmIENMQVJBX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9HRU5FUkFURURfTUVUSE9EUworI2RlZmluZSBDTEFSQV9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfR0VORVJBVEVEX01FVEhPRFMKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoQ0xBUkFfSU5URVJOQUxfQ09ORklHX0NQUDExX09WRVJSSURFKQorI2RlZmluZSBDTEFSQV9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfT1ZFUlJJREUKKyNlbmRpZgorI2lmICFkZWZpbmVkKENMQVJBX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9VTklRVUVfUFRSKQorI2RlZmluZSBDTEFSQV9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfVU5JUVVFX1BUUgorI2VuZGlmCisKKyNlbmRpZiAvLyBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisKKy8vIE5vdyBzZXQgdGhlIGFjdHVhbCBkZWZpbmVzIGJhc2VkIG9uIHRoZSBhYm92ZSArIGFueXRoaW5nIHRoZSB1c2VyIGhhcyBjb25maWd1cmVkCisjaWYgZGVmaW5lZChDTEFSQV9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfTlVMTFBUUikgJiYgIWRlZmluZWQoQ0xBUkFfQ09ORklHX0NQUDExX05PX05VTExQVFIpICYmICFkZWZpbmVkKENMQVJBX0NPTkZJR19DUFAxMV9OVUxMUFRSKSAmJiAhZGVmaW5lZChDTEFSQV9DT05GSUdfTk9fQ1BQMTEpCisjZGVmaW5lIENMQVJBX0NPTkZJR19DUFAxMV9OVUxMUFRSCisjZW5kaWYKKyNpZiBkZWZpbmVkKENMQVJBX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9OT0VYQ0VQVCkgJiYgIWRlZmluZWQoQ0xBUkFfQ09ORklHX0NQUDExX05PX05PRVhDRVBUKSAmJiAhZGVmaW5lZChDTEFSQV9DT05GSUdfQ1BQMTFfTk9FWENFUFQpICYmICFkZWZpbmVkKENMQVJBX0NPTkZJR19OT19DUFAxMSkKKyNkZWZpbmUgQ0xBUkFfQ09ORklHX0NQUDExX05PRVhDRVBUCisjZW5kaWYKKyNpZiBkZWZpbmVkKENMQVJBX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9HRU5FUkFURURfTUVUSE9EUykgJiYgIWRlZmluZWQoQ0xBUkFfQ09ORklHX0NQUDExX05PX0dFTkVSQVRFRF9NRVRIT0RTKSAmJiAhZGVmaW5lZChDTEFSQV9DT05GSUdfQ1BQMTFfR0VORVJBVEVEX01FVEhPRFMpICYmICFkZWZpbmVkKENMQVJBX0NPTkZJR19OT19DUFAxMSkKKyNkZWZpbmUgQ0xBUkFfQ09ORklHX0NQUDExX0dFTkVSQVRFRF9NRVRIT0RTCisjZW5kaWYKKyNpZiBkZWZpbmVkKENMQVJBX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9PVkVSUklERSkgJiYgIWRlZmluZWQoQ0xBUkFfQ09ORklHX05PX09WRVJSSURFKSAmJiAhZGVmaW5lZChDTEFSQV9DT05GSUdfQ1BQMTFfT1ZFUlJJREUpICYmICFkZWZpbmVkKENMQVJBX0NPTkZJR19OT19DUFAxMSkKKyNkZWZpbmUgQ0xBUkFfQ09ORklHX0NQUDExX09WRVJSSURFCisjZW5kaWYKKyNpZiBkZWZpbmVkKENMQVJBX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9VTklRVUVfUFRSKSAmJiAhZGVmaW5lZChDTEFSQV9DT05GSUdfTk9fVU5JUVVFX1BUUikgJiYgIWRlZmluZWQoQ0xBUkFfQ09ORklHX0NQUDExX1VOSVFVRV9QVFIpICYmICFkZWZpbmVkKENMQVJBX0NPTkZJR19OT19DUFAxMSkKKyNkZWZpbmUgQ0xBUkFfQ09ORklHX0NQUDExX1VOSVFVRV9QVFIKKyNlbmRpZgorCisvLyBub2V4Y2VwdCBzdXBwb3J0OgorI2lmIGRlZmluZWQoQ0xBUkFfQ09ORklHX0NQUDExX05PRVhDRVBUKSAmJiAhZGVmaW5lZChDTEFSQV9OT0VYQ0VQVCkKKyNkZWZpbmUgQ0xBUkFfTk9FWENFUFQgbm9leGNlcHQKKyMgIGRlZmluZSBDTEFSQV9OT0VYQ0VQVF9JUyh4KSBub2V4Y2VwdCh4KQorI2Vsc2UKKyNkZWZpbmUgQ0xBUkFfTk9FWENFUFQgdGhyb3coKQorIyAgZGVmaW5lIENMQVJBX05PRVhDRVBUX0lTKHgpCisjZW5kaWYKKworLy8gbnVsbHB0ciBzdXBwb3J0CisjaWZkZWYgQ0xBUkFfQ09ORklHX0NQUDExX05VTExQVFIKKyNkZWZpbmUgQ0xBUkFfTlVMTCBudWxscHRyCisjZWxzZQorI2RlZmluZSBDTEFSQV9OVUxMIE5VTEwKKyNlbmRpZgorCisvLyBvdmVycmlkZSBzdXBwb3J0CisjaWZkZWYgQ0xBUkFfQ09ORklHX0NQUDExX09WRVJSSURFCisjZGVmaW5lIENMQVJBX09WRVJSSURFIG92ZXJyaWRlCisjZWxzZQorI2RlZmluZSBDTEFSQV9PVkVSUklERQorI2VuZGlmCisKKy8vIHVuaXF1ZV9wdHIgc3VwcG9ydAorI2lmZGVmIENMQVJBX0NPTkZJR19DUFAxMV9VTklRVUVfUFRSCisjICAgZGVmaW5lIENMQVJBX0FVVE9fUFRSKCBUICkgc3RkOjp1bmlxdWVfcHRyPFQ+CisjZWxzZQorIyAgIGRlZmluZSBDTEFSQV9BVVRPX1BUUiggVCApIHN0ZDo6YXV0b19wdHI8VD4KKyNlbmRpZgorCisjZW5kaWYgLy8gVFdPQkxVRUNVQkVTX0NMQVJBX0NPTVBJTEVSU19IX0lOQ0xVREVECisKKy8vIC0tLS0tLS0tLS0tIGVuZCBvZiAjaW5jbHVkZSBmcm9tIGNsYXJhX2NvbXBpbGVycy5oIC0tLS0tLS0tLS0tCisvLyAuLi4uLi4uLi4uLiBiYWNrIGluIGNsYXJhLmgKKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzdGRleGNlcHQ+CisjaW5jbHVkZSA8bWVtb3J5PgorCisjaWYgZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChfX1dJTjMyX18pIHx8IGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9NU0NfVkVSKQorI2RlZmluZSBDTEFSQV9QTEFURk9STV9XSU5ET1dTCisjZW5kaWYKKworLy8gVXNlIG9wdGlvbmFsIG91dGVyIG5hbWVzcGFjZQorI2lmZGVmIFNUSVRDSF9DTEFSQV9PUEVOX05BTUVTUEFDRQorU1RJVENIX0NMQVJBX09QRU5fTkFNRVNQQUNFCisjZW5kaWYKKworbmFtZXNwYWNlIENsYXJhIHsKKworICAgIHN0cnVjdCBVbnBvc2l0aW9uYWxUYWcge307CisKKyAgICBleHRlcm4gVW5wb3NpdGlvbmFsVGFnIF87CisKKyNpZmRlZiBDTEFSQV9DT05GSUdfTUFJTgorICAgIFVucG9zaXRpb25hbFRhZyBfOworI2VuZGlmCisKKyAgICBuYW1lc3BhY2UgRGV0YWlsIHsKKworI2lmZGVmIENMQVJBX0NPTlNPTEVfV0lEVEgKKyAgICBjb25zdCB1bnNpZ25lZCBpbnQgY29uc29sZVdpZHRoID0gQ0xBUkFfQ09ORklHX0NPTlNPTEVfV0lEVEg7CisjZWxzZQorICAgIGNvbnN0IHVuc2lnbmVkIGludCBjb25zb2xlV2lkdGggPSA4MDsKKyNlbmRpZgorCisgICAgICAgIHVzaW5nIG5hbWVzcGFjZSBUYmM7CisKKyAgICAgICAgaW5saW5lIGJvb2wgc3RhcnRzV2l0aCggc3RkOjpzdHJpbmcgY29uc3QmIHN0ciwgc3RkOjpzdHJpbmcgY29uc3QmIHByZWZpeCApIHsKKyAgICAgICAgICAgIHJldHVybiBzdHIuc2l6ZSgpID49IHByZWZpeC5zaXplKCkgJiYgc3RyLnN1YnN0ciggMCwgcHJlZml4LnNpemUoKSApID09IHByZWZpeDsKKyAgICAgICAgfQorCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBSZW1vdmVDb25zdFJlZnsgdHlwZWRlZiBUIHR5cGU7IH07CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBSZW1vdmVDb25zdFJlZjxUJj57IHR5cGVkZWYgVCB0eXBlOyB9OworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgUmVtb3ZlQ29uc3RSZWY8VCBjb25zdCY+eyB0eXBlZGVmIFQgdHlwZTsgfTsKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IFJlbW92ZUNvbnN0UmVmPFQgY29uc3Q+eyB0eXBlZGVmIFQgdHlwZTsgfTsKKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiAgICBzdHJ1Y3QgSXNCb29sICAgICAgIHsgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSBmYWxzZTsgfTsKKyAgICAgICAgdGVtcGxhdGU8PiAgICAgICAgICAgICAgc3RydWN0IElzQm9vbDxib29sPiB7IHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gdHJ1ZTsgfTsKKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICB2b2lkIGNvbnZlcnRJbnRvKCBzdGQ6OnN0cmluZyBjb25zdCYgX3NvdXJjZSwgVCYgX2Rlc3QgKSB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgICAgICAgICAgIHNzIDw8IF9zb3VyY2U7CisgICAgICAgICAgICBzcyA+PiBfZGVzdDsKKyAgICAgICAgICAgIGlmKCBzcy5mYWlsKCkgKQorICAgICAgICAgICAgICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvciggIlVuYWJsZSB0byBjb252ZXJ0ICIgKyBfc291cmNlICsgIiB0byBkZXN0aW5hdGlvbiB0eXBlIiApOworICAgICAgICB9CisgICAgICAgIGlubGluZSB2b2lkIGNvbnZlcnRJbnRvKCBzdGQ6OnN0cmluZyBjb25zdCYgX3NvdXJjZSwgc3RkOjpzdHJpbmcmIF9kZXN0ICkgeworICAgICAgICAgICAgX2Rlc3QgPSBfc291cmNlOworICAgICAgICB9CisgICAgICAgIGNoYXIgdG9Mb3dlckNoKGNoYXIgYykgeworICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGNoYXI+KCBzdGQ6OnRvbG93ZXIoIGMgKSApOworICAgICAgICB9CisgICAgICAgIGlubGluZSB2b2lkIGNvbnZlcnRJbnRvKCBzdGQ6OnN0cmluZyBjb25zdCYgX3NvdXJjZSwgYm9vbCYgX2Rlc3QgKSB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBzb3VyY2VMQyA9IF9zb3VyY2U7CisgICAgICAgICAgICBzdGQ6OnRyYW5zZm9ybSggc291cmNlTEMuYmVnaW4oKSwgc291cmNlTEMuZW5kKCksIHNvdXJjZUxDLmJlZ2luKCksIHRvTG93ZXJDaCApOworICAgICAgICAgICAgaWYoIHNvdXJjZUxDID09ICJ5IiB8fCBzb3VyY2VMQyA9PSAiMSIgfHwgc291cmNlTEMgPT0gInRydWUiIHx8IHNvdXJjZUxDID09ICJ5ZXMiIHx8IHNvdXJjZUxDID09ICJvbiIgKQorICAgICAgICAgICAgICAgIF9kZXN0ID0gdHJ1ZTsKKyAgICAgICAgICAgIGVsc2UgaWYoIHNvdXJjZUxDID09ICJuIiB8fCBzb3VyY2VMQyA9PSAiMCIgfHwgc291cmNlTEMgPT0gImZhbHNlIiB8fCBzb3VyY2VMQyA9PSAibm8iIHx8IHNvdXJjZUxDID09ICJvZmYiICkKKyAgICAgICAgICAgICAgICBfZGVzdCA9IGZhbHNlOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvciggIkV4cGVjdGVkIGEgYm9vbGVhbiB2YWx1ZSBidXQgZGlkIG5vdCByZWNvZ25pc2U6XG4gICciICsgX3NvdXJjZSArICInIiApOworICAgICAgICB9CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQ29uZmlnVD4KKyAgICAgICAgc3RydWN0IElBcmdGdW5jdGlvbiB7CisgICAgICAgICAgICB2aXJ0dWFsIH5JQXJnRnVuY3Rpb24oKSB7fQorI2lmZGVmIENMQVJBX0NPTkZJR19DUFAxMV9HRU5FUkFURURfTUVUSE9EUworICAgICAgICAgICAgSUFyZ0Z1bmN0aW9uKCkgICAgICAgICAgICAgICAgICAgICAgPSBkZWZhdWx0OworICAgICAgICAgICAgSUFyZ0Z1bmN0aW9uKCBJQXJnRnVuY3Rpb24gY29uc3QmICkgPSBkZWZhdWx0OworI2VuZGlmCisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0KCBDb25maWdUJiBjb25maWcsIHN0ZDo6c3RyaW5nIGNvbnN0JiB2YWx1ZSApIGNvbnN0ID0gMDsKKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCB0YWtlc0FyZygpIGNvbnN0ID0gMDsKKyAgICAgICAgICAgIHZpcnR1YWwgSUFyZ0Z1bmN0aW9uKiBjbG9uZSgpIGNvbnN0ID0gMDsKKyAgICAgICAgfTsKKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDb25maWdUPgorICAgICAgICBjbGFzcyBCb3VuZEFyZ0Z1bmN0aW9uIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgQm91bmRBcmdGdW5jdGlvbigpIDogZnVuY3Rpb25PYmooIENMQVJBX05VTEwgKSB7fQorICAgICAgICAgICAgQm91bmRBcmdGdW5jdGlvbiggSUFyZ0Z1bmN0aW9uPENvbmZpZ1Q+KiBfZnVuY3Rpb25PYmogKSA6IGZ1bmN0aW9uT2JqKCBfZnVuY3Rpb25PYmogKSB7fQorICAgICAgICAgICAgQm91bmRBcmdGdW5jdGlvbiggQm91bmRBcmdGdW5jdGlvbiBjb25zdCYgb3RoZXIgKSA6IGZ1bmN0aW9uT2JqKCBvdGhlci5mdW5jdGlvbk9iaiA/IG90aGVyLmZ1bmN0aW9uT2JqLT5jbG9uZSgpIDogQ0xBUkFfTlVMTCApIHt9CisgICAgICAgICAgICBCb3VuZEFyZ0Z1bmN0aW9uJiBvcGVyYXRvciA9ICggQm91bmRBcmdGdW5jdGlvbiBjb25zdCYgb3RoZXIgKSB7CisgICAgICAgICAgICAgICAgSUFyZ0Z1bmN0aW9uPENvbmZpZ1Q+KiBuZXdGdW5jdGlvbk9iaiA9IG90aGVyLmZ1bmN0aW9uT2JqID8gb3RoZXIuZnVuY3Rpb25PYmotPmNsb25lKCkgOiBDTEFSQV9OVUxMOworICAgICAgICAgICAgICAgIGRlbGV0ZSBmdW5jdGlvbk9iajsKKyAgICAgICAgICAgICAgICBmdW5jdGlvbk9iaiA9IG5ld0Z1bmN0aW9uT2JqOworICAgICAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH5Cb3VuZEFyZ0Z1bmN0aW9uKCkgeyBkZWxldGUgZnVuY3Rpb25PYmo7IH0KKworICAgICAgICAgICAgdm9pZCBzZXQoIENvbmZpZ1QmIGNvbmZpZywgc3RkOjpzdHJpbmcgY29uc3QmIHZhbHVlICkgY29uc3QgeworICAgICAgICAgICAgICAgIGZ1bmN0aW9uT2JqLT5zZXQoIGNvbmZpZywgdmFsdWUgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJvb2wgdGFrZXNBcmcoKSBjb25zdCB7IHJldHVybiBmdW5jdGlvbk9iai0+dGFrZXNBcmcoKTsgfQorCisgICAgICAgICAgICBib29sIGlzU2V0KCkgY29uc3QgeworICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbk9iaiAhPSBDTEFSQV9OVUxMOworICAgICAgICAgICAgfQorICAgICAgICBwcml2YXRlOgorICAgICAgICAgICAgSUFyZ0Z1bmN0aW9uPENvbmZpZ1Q+KiBmdW5jdGlvbk9iajsKKyAgICAgICAgfTsKKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDPgorICAgICAgICBzdHJ1Y3QgTnVsbEJpbmRlciA6IElBcmdGdW5jdGlvbjxDPnsKKyAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBzZXQoIEMmLCBzdGQ6OnN0cmluZyBjb25zdCYgKSBjb25zdCB7fQorICAgICAgICAgICAgdmlydHVhbCBib29sIHRha2VzQXJnKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorICAgICAgICAgICAgdmlydHVhbCBJQXJnRnVuY3Rpb248Qz4qIGNsb25lKCkgY29uc3QgeyByZXR1cm4gbmV3IE51bGxCaW5kZXIoICp0aGlzICk7IH0KKyAgICAgICAgfTsKKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDLCB0eXBlbmFtZSBNPgorICAgICAgICBzdHJ1Y3QgQm91bmREYXRhTWVtYmVyIDogSUFyZ0Z1bmN0aW9uPEM+eworICAgICAgICAgICAgQm91bmREYXRhTWVtYmVyKCBNIEM6OiogX21lbWJlciApIDogbWVtYmVyKCBfbWVtYmVyICkge30KKyAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBzZXQoIEMmIHAsIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHJpbmdWYWx1ZSApIGNvbnN0IHsKKyAgICAgICAgICAgICAgICBjb252ZXJ0SW50byggc3RyaW5nVmFsdWUsIHAuKm1lbWJlciApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmlydHVhbCBib29sIHRha2VzQXJnKCkgY29uc3QgeyByZXR1cm4gIUlzQm9vbDxNPjo6dmFsdWU7IH0KKyAgICAgICAgICAgIHZpcnR1YWwgSUFyZ0Z1bmN0aW9uPEM+KiBjbG9uZSgpIGNvbnN0IHsgcmV0dXJuIG5ldyBCb3VuZERhdGFNZW1iZXIoICp0aGlzICk7IH0KKyAgICAgICAgICAgIE0gQzo6KiBtZW1iZXI7CisgICAgICAgIH07CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEMsIHR5cGVuYW1lIE0+CisgICAgICAgIHN0cnVjdCBCb3VuZFVuYXJ5TWV0aG9kIDogSUFyZ0Z1bmN0aW9uPEM+eworICAgICAgICAgICAgQm91bmRVbmFyeU1ldGhvZCggdm9pZCAoQzo6Kl9tZW1iZXIpKCBNICkgKSA6IG1lbWJlciggX21lbWJlciApIHt9CisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0KCBDJiBwLCBzdGQ6OnN0cmluZyBjb25zdCYgc3RyaW5nVmFsdWUgKSBjb25zdCB7CisgICAgICAgICAgICAgICAgdHlwZW5hbWUgUmVtb3ZlQ29uc3RSZWY8TT46OnR5cGUgdmFsdWU7CisgICAgICAgICAgICAgICAgY29udmVydEludG8oIHN0cmluZ1ZhbHVlLCB2YWx1ZSApOworICAgICAgICAgICAgICAgIChwLiptZW1iZXIpKCB2YWx1ZSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmlydHVhbCBib29sIHRha2VzQXJnKCkgY29uc3QgeyByZXR1cm4gIUlzQm9vbDxNPjo6dmFsdWU7IH0KKyAgICAgICAgICAgIHZpcnR1YWwgSUFyZ0Z1bmN0aW9uPEM+KiBjbG9uZSgpIGNvbnN0IHsgcmV0dXJuIG5ldyBCb3VuZFVuYXJ5TWV0aG9kKCAqdGhpcyApOyB9CisgICAgICAgICAgICB2b2lkIChDOjoqbWVtYmVyKSggTSApOworICAgICAgICB9OworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDPgorICAgICAgICBzdHJ1Y3QgQm91bmROdWxsYXJ5TWV0aG9kIDogSUFyZ0Z1bmN0aW9uPEM+eworICAgICAgICAgICAgQm91bmROdWxsYXJ5TWV0aG9kKCB2b2lkIChDOjoqX21lbWJlcikoKSApIDogbWVtYmVyKCBfbWVtYmVyICkge30KKyAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBzZXQoIEMmIHAsIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHJpbmdWYWx1ZSApIGNvbnN0IHsKKyAgICAgICAgICAgICAgICBib29sIHZhbHVlOworICAgICAgICAgICAgICAgIGNvbnZlcnRJbnRvKCBzdHJpbmdWYWx1ZSwgdmFsdWUgKTsKKyAgICAgICAgICAgICAgICBpZiggdmFsdWUgKQorICAgICAgICAgICAgICAgICAgICAocC4qbWVtYmVyKSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmlydHVhbCBib29sIHRha2VzQXJnKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgICAgICAgICAgIHZpcnR1YWwgSUFyZ0Z1bmN0aW9uPEM+KiBjbG9uZSgpIGNvbnN0IHsgcmV0dXJuIG5ldyBCb3VuZE51bGxhcnlNZXRob2QoICp0aGlzICk7IH0KKyAgICAgICAgICAgIHZvaWQgKEM6OiptZW1iZXIpKCk7CisgICAgICAgIH07CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQz4KKyAgICAgICAgc3RydWN0IEJvdW5kVW5hcnlGdW5jdGlvbiA6IElBcmdGdW5jdGlvbjxDPnsKKyAgICAgICAgICAgIEJvdW5kVW5hcnlGdW5jdGlvbiggdm9pZCAoKl9mdW5jdGlvbikoIEMmICkgKSA6IGZ1bmN0aW9uKCBfZnVuY3Rpb24gKSB7fQorICAgICAgICAgICAgdmlydHVhbCB2b2lkIHNldCggQyYgb2JqLCBzdGQ6OnN0cmluZyBjb25zdCYgc3RyaW5nVmFsdWUgKSBjb25zdCB7CisgICAgICAgICAgICAgICAgYm9vbCB2YWx1ZTsKKyAgICAgICAgICAgICAgICBjb252ZXJ0SW50byggc3RyaW5nVmFsdWUsIHZhbHVlICk7CisgICAgICAgICAgICAgICAgaWYoIHZhbHVlICkKKyAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oIG9iaiApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmlydHVhbCBib29sIHRha2VzQXJnKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgICAgICAgICAgIHZpcnR1YWwgSUFyZ0Z1bmN0aW9uPEM+KiBjbG9uZSgpIGNvbnN0IHsgcmV0dXJuIG5ldyBCb3VuZFVuYXJ5RnVuY3Rpb24oICp0aGlzICk7IH0KKyAgICAgICAgICAgIHZvaWQgKCpmdW5jdGlvbikoIEMmICk7CisgICAgICAgIH07CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQywgdHlwZW5hbWUgVD4KKyAgICAgICAgc3RydWN0IEJvdW5kQmluYXJ5RnVuY3Rpb24gOiBJQXJnRnVuY3Rpb248Qz57CisgICAgICAgICAgICBCb3VuZEJpbmFyeUZ1bmN0aW9uKCB2b2lkICgqX2Z1bmN0aW9uKSggQyYsIFQgKSApIDogZnVuY3Rpb24oIF9mdW5jdGlvbiApIHt9CisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0KCBDJiBvYmosIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHJpbmdWYWx1ZSApIGNvbnN0IHsKKyAgICAgICAgICAgICAgICB0eXBlbmFtZSBSZW1vdmVDb25zdFJlZjxUPjo6dHlwZSB2YWx1ZTsKKyAgICAgICAgICAgICAgICBjb252ZXJ0SW50byggc3RyaW5nVmFsdWUsIHZhbHVlICk7CisgICAgICAgICAgICAgICAgZnVuY3Rpb24oIG9iaiwgdmFsdWUgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCB0YWtlc0FyZygpIGNvbnN0IHsgcmV0dXJuICFJc0Jvb2w8VD46OnZhbHVlOyB9CisgICAgICAgICAgICB2aXJ0dWFsIElBcmdGdW5jdGlvbjxDPiogY2xvbmUoKSBjb25zdCB7IHJldHVybiBuZXcgQm91bmRCaW5hcnlGdW5jdGlvbiggKnRoaXMgKTsgfQorICAgICAgICAgICAgdm9pZCAoKmZ1bmN0aW9uKSggQyYsIFQgKTsKKyAgICAgICAgfTsKKworICAgIH0gLy8gbmFtZXNwYWNlIERldGFpbAorCisgICAgaW5saW5lIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBhcmdzVG9WZWN0b3IoIGludCBhcmdjLCBjaGFyIGNvbnN0KiBjb25zdCogY29uc3QgYXJndiApIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGFyZ3MoIHN0YXRpY19jYXN0PHN0ZDo6c2l6ZV90PiggYXJnYyApICk7CisgICAgICAgIGZvciggc3RkOjpzaXplX3QgaSA9IDA7IGkgPCBzdGF0aWNfY2FzdDxzdGQ6OnNpemVfdD4oIGFyZ2MgKTsgKytpICkKKyAgICAgICAgICAgIGFyZ3NbaV0gPSBhcmd2W2ldOworCisgICAgICAgIHJldHVybiBhcmdzOworICAgIH0KKworICAgIGNsYXNzIFBhcnNlciB7CisgICAgICAgIGVudW0gTW9kZSB7IE5vbmUsIE1heWJlU2hvcnRPcHQsIFNsYXNoT3B0LCBTaG9ydE9wdCwgTG9uZ09wdCwgUG9zaXRpb25hbCB9OworICAgICAgICBNb2RlIG1vZGU7CisgICAgICAgIHN0ZDo6c2l6ZV90IGZyb207CisgICAgICAgIGJvb2wgaW5RdW90ZXM7CisgICAgcHVibGljOgorCisgICAgICAgIHN0cnVjdCBUb2tlbiB7CisgICAgICAgICAgICBlbnVtIFR5cGUgeyBQb3NpdGlvbmFsLCBTaG9ydE9wdCwgTG9uZ09wdCB9OworICAgICAgICAgICAgVG9rZW4oIFR5cGUgX3R5cGUsIHN0ZDo6c3RyaW5nIGNvbnN0JiBfZGF0YSApIDogdHlwZSggX3R5cGUgKSwgZGF0YSggX2RhdGEgKSB7fQorICAgICAgICAgICAgVHlwZSB0eXBlOworICAgICAgICAgICAgc3RkOjpzdHJpbmcgZGF0YTsKKyAgICAgICAgfTsKKworICAgICAgICBQYXJzZXIoKSA6IG1vZGUoIE5vbmUgKSwgZnJvbSggMCApLCBpblF1b3RlcyggZmFsc2UgKXt9CisKKyAgICAgICAgdm9pZCBwYXJzZUludG9Ub2tlbnMoIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBjb25zdCYgYXJncywgc3RkOjp2ZWN0b3I8VG9rZW4+JiB0b2tlbnMgKSB7CisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyBkb3VibGVEYXNoID0gIi0tIjsKKyAgICAgICAgICAgIGZvciggc3RkOjpzaXplX3QgaSA9IDE7IGkgPCBhcmdzLnNpemUoKSAmJiBhcmdzW2ldICE9IGRvdWJsZURhc2g7ICsraSApCisgICAgICAgICAgICAgICAgcGFyc2VJbnRvVG9rZW5zKCBhcmdzW2ldLCB0b2tlbnMpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBwYXJzZUludG9Ub2tlbnMoIHN0ZDo6c3RyaW5nIGNvbnN0JiBhcmcsIHN0ZDo6dmVjdG9yPFRva2VuPiYgdG9rZW5zICkgeworICAgICAgICAgICAgZm9yKCBzdGQ6OnNpemVfdCBpID0gMDsgaSA8IGFyZy5zaXplKCk7ICsraSApIHsKKyAgICAgICAgICAgICAgICBjaGFyIGMgPSBhcmdbaV07CisgICAgICAgICAgICAgICAgaWYoIGMgPT0gJyInICkKKyAgICAgICAgICAgICAgICAgICAgaW5RdW90ZXMgPSAhaW5RdW90ZXM7CisgICAgICAgICAgICAgICAgbW9kZSA9IGhhbmRsZU1vZGUoIGksIGMsIGFyZywgdG9rZW5zICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtb2RlID0gaGFuZGxlTW9kZSggYXJnLnNpemUoKSwgJ1wwJywgYXJnLCB0b2tlbnMgKTsKKyAgICAgICAgfQorICAgICAgICBNb2RlIGhhbmRsZU1vZGUoIHN0ZDo6c2l6ZV90IGksIGNoYXIgYywgc3RkOjpzdHJpbmcgY29uc3QmIGFyZywgc3RkOjp2ZWN0b3I8VG9rZW4+JiB0b2tlbnMgKSB7CisgICAgICAgICAgICBzd2l0Y2goIG1vZGUgKSB7CisgICAgICAgICAgICAgICAgY2FzZSBOb25lOiByZXR1cm4gaGFuZGxlTm9uZSggaSwgYyApOworICAgICAgICAgICAgICAgIGNhc2UgTWF5YmVTaG9ydE9wdDogcmV0dXJuIGhhbmRsZU1heWJlU2hvcnRPcHQoIGksIGMgKTsKKyAgICAgICAgICAgICAgICBjYXNlIFNob3J0T3B0OgorICAgICAgICAgICAgICAgIGNhc2UgTG9uZ09wdDoKKyAgICAgICAgICAgICAgICBjYXNlIFNsYXNoT3B0OiByZXR1cm4gaGFuZGxlT3B0KCBpLCBjLCBhcmcsIHRva2VucyApOworICAgICAgICAgICAgICAgIGNhc2UgUG9zaXRpb25hbDogcmV0dXJuIGhhbmRsZVBvc2l0aW9uYWwoIGksIGMsIGFyZywgdG9rZW5zICk7CisgICAgICAgICAgICAgICAgZGVmYXVsdDogdGhyb3cgc3RkOjpsb2dpY19lcnJvciggIlVua25vd24gbW9kZSIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIE1vZGUgaGFuZGxlTm9uZSggc3RkOjpzaXplX3QgaSwgY2hhciBjICkgeworICAgICAgICAgICAgaWYoIGluUXVvdGVzICkgeworICAgICAgICAgICAgICAgIGZyb20gPSBpOworICAgICAgICAgICAgICAgIHJldHVybiBQb3NpdGlvbmFsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3dpdGNoKCBjICkgeworICAgICAgICAgICAgICAgIGNhc2UgJy0nOiByZXR1cm4gTWF5YmVTaG9ydE9wdDsKKyNpZmRlZiBDTEFSQV9QTEFURk9STV9XSU5ET1dTCisgICAgICAgICAgICAgICAgY2FzZSAnLyc6IGZyb20gPSBpKzE7IHJldHVybiBTbGFzaE9wdDsKKyNlbmRpZgorICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGZyb20gPSBpOyByZXR1cm4gUG9zaXRpb25hbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBNb2RlIGhhbmRsZU1heWJlU2hvcnRPcHQoIHN0ZDo6c2l6ZV90IGksIGNoYXIgYyApIHsKKyAgICAgICAgICAgIHN3aXRjaCggYyApIHsKKyAgICAgICAgICAgICAgICBjYXNlICctJzogZnJvbSA9IGkrMTsgcmV0dXJuIExvbmdPcHQ7CisgICAgICAgICAgICAgICAgZGVmYXVsdDogZnJvbSA9IGk7IHJldHVybiBTaG9ydE9wdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIE1vZGUgaGFuZGxlT3B0KCBzdGQ6OnNpemVfdCBpLCBjaGFyIGMsIHN0ZDo6c3RyaW5nIGNvbnN0JiBhcmcsIHN0ZDo6dmVjdG9yPFRva2VuPiYgdG9rZW5zICkgeworICAgICAgICAgICAgaWYoIHN0ZDo6c3RyaW5nKCAiOj1cMCIsIDMgKS5maW5kKCBjICkgPT0gc3RkOjpzdHJpbmc6Om5wb3MgKQorICAgICAgICAgICAgICAgIHJldHVybiBtb2RlOworCisgICAgICAgICAgICBzdGQ6OnN0cmluZyBvcHROYW1lID0gYXJnLnN1YnN0ciggZnJvbSwgaS1mcm9tICk7CisgICAgICAgICAgICBpZiggbW9kZSA9PSBTaG9ydE9wdCApCisgICAgICAgICAgICAgICAgZm9yKCBzdGQ6OnNpemVfdCBqID0gMDsgaiA8IG9wdE5hbWUuc2l6ZSgpOyArK2ogKQorICAgICAgICAgICAgICAgICAgICB0b2tlbnMucHVzaF9iYWNrKCBUb2tlbiggVG9rZW46OlNob3J0T3B0LCBvcHROYW1lLnN1YnN0ciggaiwgMSApICkgKTsKKyAgICAgICAgICAgIGVsc2UgaWYoIG1vZGUgPT0gU2xhc2hPcHQgJiYgb3B0TmFtZS5zaXplKCkgPT0gMSApCisgICAgICAgICAgICAgICAgdG9rZW5zLnB1c2hfYmFjayggVG9rZW4oIFRva2VuOjpTaG9ydE9wdCwgb3B0TmFtZSApICk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdG9rZW5zLnB1c2hfYmFjayggVG9rZW4oIFRva2VuOjpMb25nT3B0LCBvcHROYW1lICkgKTsKKyAgICAgICAgICAgIHJldHVybiBOb25lOworICAgICAgICB9CisgICAgICAgIE1vZGUgaGFuZGxlUG9zaXRpb25hbCggc3RkOjpzaXplX3QgaSwgY2hhciBjLCBzdGQ6OnN0cmluZyBjb25zdCYgYXJnLCBzdGQ6OnZlY3RvcjxUb2tlbj4mIHRva2VucyApIHsKKyAgICAgICAgICAgIGlmKCBpblF1b3RlcyB8fCBzdGQ6OnN0cmluZyggIlwwIiwgMSApLmZpbmQoIGMgKSA9PSBzdGQ6OnN0cmluZzo6bnBvcyApCisgICAgICAgICAgICAgICAgcmV0dXJuIG1vZGU7CisKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGRhdGEgPSBhcmcuc3Vic3RyKCBmcm9tLCBpLWZyb20gKTsKKyAgICAgICAgICAgIHRva2Vucy5wdXNoX2JhY2soIFRva2VuKCBUb2tlbjo6UG9zaXRpb25hbCwgZGF0YSApICk7CisgICAgICAgICAgICByZXR1cm4gTm9uZTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDb25maWdUPgorICAgIHN0cnVjdCBDb21tb25BcmdQcm9wZXJ0aWVzIHsKKyAgICAgICAgQ29tbW9uQXJnUHJvcGVydGllcygpIHt9CisgICAgICAgIENvbW1vbkFyZ1Byb3BlcnRpZXMoIERldGFpbDo6Qm91bmRBcmdGdW5jdGlvbjxDb25maWdUPiBjb25zdCYgX2JvdW5kRmllbGQgKSA6IGJvdW5kRmllbGQoIF9ib3VuZEZpZWxkICkge30KKworICAgICAgICBEZXRhaWw6OkJvdW5kQXJnRnVuY3Rpb248Q29uZmlnVD4gYm91bmRGaWVsZDsKKyAgICAgICAgc3RkOjpzdHJpbmcgZGVzY3JpcHRpb247CisgICAgICAgIHN0ZDo6c3RyaW5nIGRldGFpbDsKKyAgICAgICAgc3RkOjpzdHJpbmcgcGxhY2Vob2xkZXI7IC8vIE9ubHkgdmFsdWUgaWYgYm91bmRGaWVsZCB0YWtlcyBhbiBhcmcKKworICAgICAgICBib29sIHRha2VzQXJnKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuICFwbGFjZWhvbGRlci5lbXB0eSgpOworICAgICAgICB9CisgICAgICAgIHZvaWQgdmFsaWRhdGUoKSBjb25zdCB7CisgICAgICAgICAgICBpZiggIWJvdW5kRmllbGQuaXNTZXQoKSApCisgICAgICAgICAgICAgICAgdGhyb3cgc3RkOjpsb2dpY19lcnJvciggIm9wdGlvbiBub3QgYm91bmQiICk7CisgICAgICAgIH0KKyAgICB9OworICAgIHN0cnVjdCBPcHRpb25BcmdQcm9wZXJ0aWVzIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHNob3J0TmFtZXM7CisgICAgICAgIHN0ZDo6c3RyaW5nIGxvbmdOYW1lOworCisgICAgICAgIGJvb2wgaGFzU2hvcnROYW1lKCBzdGQ6OnN0cmluZyBjb25zdCYgc2hvcnROYW1lICkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIHN0ZDo6ZmluZCggc2hvcnROYW1lcy5iZWdpbigpLCBzaG9ydE5hbWVzLmVuZCgpLCBzaG9ydE5hbWUgKSAhPSBzaG9ydE5hbWVzLmVuZCgpOworICAgICAgICB9CisgICAgICAgIGJvb2wgaGFzTG9uZ05hbWUoIHN0ZDo6c3RyaW5nIGNvbnN0JiBfbG9uZ05hbWUgKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gX2xvbmdOYW1lID09IGxvbmdOYW1lOworICAgICAgICB9CisgICAgfTsKKyAgICBzdHJ1Y3QgUG9zaXRpb25hbEFyZ1Byb3BlcnRpZXMgeworICAgICAgICBQb3NpdGlvbmFsQXJnUHJvcGVydGllcygpIDogcG9zaXRpb24oIC0xICkge30KKyAgICAgICAgaW50IHBvc2l0aW9uOyAvLyAtMSBtZWFucyBub24tcG9zaXRpb25hbCAoZmxvYXRpbmcpCisKKyAgICAgICAgYm9vbCBpc0ZpeGVkUG9zaXRpb25hbCgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBwb3NpdGlvbiAhPSAtMTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDb25maWdUPgorICAgIGNsYXNzIENvbW1hbmRMaW5lIHsKKworICAgICAgICBzdHJ1Y3QgQXJnIDogQ29tbW9uQXJnUHJvcGVydGllczxDb25maWdUPiwgT3B0aW9uQXJnUHJvcGVydGllcywgUG9zaXRpb25hbEFyZ1Byb3BlcnRpZXMgeworICAgICAgICAgICAgQXJnKCkge30KKyAgICAgICAgICAgIEFyZyggRGV0YWlsOjpCb3VuZEFyZ0Z1bmN0aW9uPENvbmZpZ1Q+IGNvbnN0JiBfYm91bmRGaWVsZCApIDogQ29tbW9uQXJnUHJvcGVydGllczxDb25maWdUPiggX2JvdW5kRmllbGQgKSB7fQorCisgICAgICAgICAgICB1c2luZyBDb21tb25BcmdQcm9wZXJ0aWVzPENvbmZpZ1Q+OjpwbGFjZWhvbGRlcjsgLy8gIVRCRAorCisgICAgICAgICAgICBzdGQ6OnN0cmluZyBkYmdOYW1lKCkgY29uc3QgeworICAgICAgICAgICAgICAgIGlmKCAhbG9uZ05hbWUuZW1wdHkoKSApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiLS0iICsgbG9uZ05hbWU7CisgICAgICAgICAgICAgICAgaWYoICFzaG9ydE5hbWVzLmVtcHR5KCkgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gIi0iICsgc2hvcnROYW1lc1swXTsKKyAgICAgICAgICAgICAgICByZXR1cm4gInBvc2l0aW9uYWwgYXJncyI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb21tYW5kcygpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICAgICAgICAgICAgICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBzaG9ydE5hbWVzLmJlZ2luKCksIGl0RW5kID0gc2hvcnROYW1lcy5lbmQoKTsKKyAgICAgICAgICAgICAgICBmb3IoOyBpdCAhPSBpdEVuZDsgKytpdCApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIGZpcnN0ICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIG9zcyA8PCAiLCAiOworICAgICAgICAgICAgICAgICAgICBvc3MgPDwgIi0iIDw8ICppdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYoICFsb25nTmFtZS5lbXB0eSgpICkgeworICAgICAgICAgICAgICAgICAgICBpZiggIWZpcnN0ICkKKyAgICAgICAgICAgICAgICAgICAgICAgIG9zcyA8PCAiLCAiOworICAgICAgICAgICAgICAgICAgICBvc3MgPDwgIi0tIiA8PCBsb25nTmFtZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYoICFwbGFjZWhvbGRlci5lbXB0eSgpICkKKyAgICAgICAgICAgICAgICAgICAgb3NzIDw8ICIgPCIgPDwgcGxhY2Vob2xkZXIgPDwgIj4iOworICAgICAgICAgICAgICAgIHJldHVybiBvc3Muc3RyKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgdHlwZWRlZiBDTEFSQV9BVVRPX1BUUiggQXJnICkgQXJnQXV0b1B0cjsKKworICAgICAgICBmcmllbmQgdm9pZCBhZGRPcHROYW1lKCBBcmcmIGFyZywgc3RkOjpzdHJpbmcgY29uc3QmIG9wdE5hbWUgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggb3B0TmFtZS5lbXB0eSgpICkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBpZiggRGV0YWlsOjpzdGFydHNXaXRoKCBvcHROYW1lLCAiLS0iICkgKSB7CisgICAgICAgICAgICAgICAgaWYoICFhcmcubG9uZ05hbWUuZW1wdHkoKSApCisgICAgICAgICAgICAgICAgICAgIHRocm93IHN0ZDo6bG9naWNfZXJyb3IoICJPbmx5IG9uZSBsb25nIG9wdCBtYXkgYmUgc3BlY2lmaWVkLiAnIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBhcmcubG9uZ05hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIicgYWxyZWFkeSBzcGVjaWZpZWQsIG5vdyBhdHRlbXB0aW5nIHRvIGFkZCAnIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBvcHROYW1lICsgIiciICk7CisgICAgICAgICAgICAgICAgYXJnLmxvbmdOYW1lID0gb3B0TmFtZS5zdWJzdHIoIDIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoIERldGFpbDo6c3RhcnRzV2l0aCggb3B0TmFtZSwgIi0iICkgKQorICAgICAgICAgICAgICAgIGFyZy5zaG9ydE5hbWVzLnB1c2hfYmFjayggb3B0TmFtZS5zdWJzdHIoIDEgKSApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHRocm93IHN0ZDo6bG9naWNfZXJyb3IoICJvcHRpb24gbXVzdCBiZWdpbiB3aXRoIC0gb3IgLS0uIE9wdGlvbiB3YXM6ICciICsgb3B0TmFtZSArICInIiApOworICAgICAgICB9CisgICAgICAgIGZyaWVuZCB2b2lkIHNldFBvc2l0aW9uYWxBcmcoIEFyZyYgYXJnLCBpbnQgcG9zaXRpb24gKQorICAgICAgICB7CisgICAgICAgICAgICBhcmcucG9zaXRpb24gPSBwb3NpdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIGNsYXNzIEFyZ0J1aWxkZXIgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBBcmdCdWlsZGVyKCBBcmcqIGFyZyApIDogbV9hcmcoIGFyZyApIHt9CisKKyAgICAgICAgICAgIC8vIEJpbmQgYSBub24tYm9vbGVhbiBkYXRhIG1lbWJlciAocmVxdWlyZXMgcGxhY2Vob2xkZXIgc3RyaW5nKQorICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQywgdHlwZW5hbWUgTT4KKyAgICAgICAgICAgIHZvaWQgYmluZCggTSBDOjoqIGZpZWxkLCBzdGQ6OnN0cmluZyBjb25zdCYgcGxhY2Vob2xkZXIgKSB7CisgICAgICAgICAgICAgICAgbV9hcmctPmJvdW5kRmllbGQgPSBuZXcgRGV0YWlsOjpCb3VuZERhdGFNZW1iZXI8QyxNPiggZmllbGQgKTsKKyAgICAgICAgICAgICAgICBtX2FyZy0+cGxhY2Vob2xkZXIgPSBwbGFjZWhvbGRlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEJpbmQgYSBib29sZWFuIGRhdGEgbWVtYmVyIChubyBwbGFjZWhvbGRlciByZXF1aXJlZCkKKyAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEM+CisgICAgICAgICAgICB2b2lkIGJpbmQoIGJvb2wgQzo6KiBmaWVsZCApIHsKKyAgICAgICAgICAgICAgICBtX2FyZy0+Ym91bmRGaWVsZCA9IG5ldyBEZXRhaWw6OkJvdW5kRGF0YU1lbWJlcjxDLGJvb2w+KCBmaWVsZCApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBCaW5kIGEgbWV0aG9kIHRha2luZyBhIHNpbmdsZSwgbm9uLWJvb2xlYW4gYXJndW1lbnQgKHJlcXVpcmVzIGEgcGxhY2Vob2xkZXIgc3RyaW5nKQorICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQywgdHlwZW5hbWUgTT4KKyAgICAgICAgICAgIHZvaWQgYmluZCggdm9pZCAoQzo6KiB1bmFyeU1ldGhvZCkoIE0gKSwgc3RkOjpzdHJpbmcgY29uc3QmIHBsYWNlaG9sZGVyICkgeworICAgICAgICAgICAgICAgIG1fYXJnLT5ib3VuZEZpZWxkID0gbmV3IERldGFpbDo6Qm91bmRVbmFyeU1ldGhvZDxDLE0+KCB1bmFyeU1ldGhvZCApOworICAgICAgICAgICAgICAgIG1fYXJnLT5wbGFjZWhvbGRlciA9IHBsYWNlaG9sZGVyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBCaW5kIGEgbWV0aG9kIHRha2luZyBhIHNpbmdsZSwgYm9vbGVhbiBhcmd1bWVudCAobm8gcGxhY2Vob2xkZXIgc3RyaW5nIHJlcXVpcmVkKQorICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQz4KKyAgICAgICAgICAgIHZvaWQgYmluZCggdm9pZCAoQzo6KiB1bmFyeU1ldGhvZCkoIGJvb2wgKSApIHsKKyAgICAgICAgICAgICAgICBtX2FyZy0+Ym91bmRGaWVsZCA9IG5ldyBEZXRhaWw6OkJvdW5kVW5hcnlNZXRob2Q8Qyxib29sPiggdW5hcnlNZXRob2QgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQmluZCBhIG1ldGhvZCB0aGF0IHRha2VzIG5vIGFyZ3VtZW50cyAod2lsbCBiZSBjYWxsZWQgaWYgb3B0IGlzIHByZXNlbnQpCisgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDPgorICAgICAgICAgICAgdm9pZCBiaW5kKCB2b2lkIChDOjoqIG51bGxhcnlNZXRob2QpKCkgKSB7CisgICAgICAgICAgICAgICAgbV9hcmctPmJvdW5kRmllbGQgPSBuZXcgRGV0YWlsOjpCb3VuZE51bGxhcnlNZXRob2Q8Qz4oIG51bGxhcnlNZXRob2QgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQmluZCBhIGZyZWUgZnVuY3Rpb24gdGFraW5nIGEgc2luZ2xlIGFyZ3VtZW50IC0gdGhlIG9iamVjdCB0byBvcGVyYXRlIG9uIChubyBwbGFjZWhvbGRlciBzdHJpbmcgcmVxdWlyZWQpCisgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDPgorICAgICAgICAgICAgdm9pZCBiaW5kKCB2b2lkICgqIHVuYXJ5RnVuY3Rpb24pKCBDJiApICkgeworICAgICAgICAgICAgICAgIG1fYXJnLT5ib3VuZEZpZWxkID0gbmV3IERldGFpbDo6Qm91bmRVbmFyeUZ1bmN0aW9uPEM+KCB1bmFyeUZ1bmN0aW9uICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEJpbmQgYSBmcmVlIGZ1bmN0aW9uIHRha2luZyBhIHNpbmdsZSBhcmd1bWVudCAtIHRoZSBvYmplY3QgdG8gb3BlcmF0ZSBvbiAocmVxdWlyZXMgYSBwbGFjZWhvbGRlciBzdHJpbmcpCisgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDLCB0eXBlbmFtZSBUPgorICAgICAgICAgICAgdm9pZCBiaW5kKCB2b2lkICgqIGJpbmFyeUZ1bmN0aW9uKSggQyYsIFQgKSwgc3RkOjpzdHJpbmcgY29uc3QmIHBsYWNlaG9sZGVyICkgeworICAgICAgICAgICAgICAgIG1fYXJnLT5ib3VuZEZpZWxkID0gbmV3IERldGFpbDo6Qm91bmRCaW5hcnlGdW5jdGlvbjxDLCBUPiggYmluYXJ5RnVuY3Rpb24gKTsKKyAgICAgICAgICAgICAgICBtX2FyZy0+cGxhY2Vob2xkZXIgPSBwbGFjZWhvbGRlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQXJnQnVpbGRlciYgZGVzY3JpYmUoIHN0ZDo6c3RyaW5nIGNvbnN0JiBkZXNjcmlwdGlvbiApIHsKKyAgICAgICAgICAgICAgICBtX2FyZy0+ZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKKyAgICAgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBcmdCdWlsZGVyJiBkZXRhaWwoIHN0ZDo6c3RyaW5nIGNvbnN0JiBkZXRhaWwgKSB7CisgICAgICAgICAgICAgICAgbV9hcmctPmRldGFpbCA9IGRldGFpbDsKKyAgICAgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkOgorICAgICAgICAgICAgQXJnKiBtX2FyZzsKKyAgICAgICAgfTsKKworICAgICAgICBjbGFzcyBPcHRCdWlsZGVyIDogcHVibGljIEFyZ0J1aWxkZXIgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBPcHRCdWlsZGVyKCBBcmcqIGFyZyApIDogQXJnQnVpbGRlciggYXJnICkge30KKyAgICAgICAgICAgIE9wdEJ1aWxkZXIoIE9wdEJ1aWxkZXImIG90aGVyICkgOiBBcmdCdWlsZGVyKCBvdGhlciApIHt9CisKKyAgICAgICAgICAgIE9wdEJ1aWxkZXImIG9wZXJhdG9yW10oIHN0ZDo6c3RyaW5nIGNvbnN0JiBvcHROYW1lICkgeworICAgICAgICAgICAgICAgIGFkZE9wdE5hbWUoICpBcmdCdWlsZGVyOjptX2FyZywgb3B0TmFtZSApOworICAgICAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgIHB1YmxpYzoKKworICAgICAgICBDb21tYW5kTGluZSgpCisgICAgICAgIDogICBtX2JvdW5kUHJvY2Vzc05hbWUoIG5ldyBEZXRhaWw6Ok51bGxCaW5kZXI8Q29uZmlnVD4oKSApLAorICAgICAgICAgICAgbV9oaWdoZXN0U3BlY2lmaWVkQXJnUG9zaXRpb24oIDAgKSwKKyAgICAgICAgICAgIG1fdGhyb3dPblVucmVjb2duaXNlZFRva2VucyggZmFsc2UgKQorICAgICAgICB7fQorICAgICAgICBDb21tYW5kTGluZSggQ29tbWFuZExpbmUgY29uc3QmIG90aGVyICkKKyAgICAgICAgOiAgIG1fYm91bmRQcm9jZXNzTmFtZSggb3RoZXIubV9ib3VuZFByb2Nlc3NOYW1lICksCisgICAgICAgICAgICBtX29wdGlvbnMgKCBvdGhlci5tX29wdGlvbnMgKSwKKyAgICAgICAgICAgIG1fcG9zaXRpb25hbEFyZ3MoIG90aGVyLm1fcG9zaXRpb25hbEFyZ3MgKSwKKyAgICAgICAgICAgIG1faGlnaGVzdFNwZWNpZmllZEFyZ1Bvc2l0aW9uKCBvdGhlci5tX2hpZ2hlc3RTcGVjaWZpZWRBcmdQb3NpdGlvbiApLAorICAgICAgICAgICAgbV90aHJvd09uVW5yZWNvZ25pc2VkVG9rZW5zKCBvdGhlci5tX3Rocm93T25VbnJlY29nbmlzZWRUb2tlbnMgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggb3RoZXIubV9mbG9hdGluZ0FyZy5nZXQoKSApCisgICAgICAgICAgICAgICAgbV9mbG9hdGluZ0FyZy5yZXNldCggbmV3IEFyZyggKm90aGVyLm1fZmxvYXRpbmdBcmcgKSApOworICAgICAgICB9CisKKyAgICAgICAgQ29tbWFuZExpbmUmIHNldFRocm93T25VbnJlY29nbmlzZWRUb2tlbnMoIGJvb2wgc2hvdWxkVGhyb3cgPSB0cnVlICkgeworICAgICAgICAgICAgbV90aHJvd09uVW5yZWNvZ25pc2VkVG9rZW5zID0gc2hvdWxkVGhyb3c7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICBPcHRCdWlsZGVyIG9wZXJhdG9yW10oIHN0ZDo6c3RyaW5nIGNvbnN0JiBvcHROYW1lICkgeworICAgICAgICAgICAgbV9vcHRpb25zLnB1c2hfYmFjayggQXJnKCkgKTsKKyAgICAgICAgICAgIGFkZE9wdE5hbWUoIG1fb3B0aW9ucy5iYWNrKCksIG9wdE5hbWUgKTsKKyAgICAgICAgICAgIE9wdEJ1aWxkZXIgYnVpbGRlciggJm1fb3B0aW9ucy5iYWNrKCkgKTsKKyAgICAgICAgICAgIHJldHVybiBidWlsZGVyOworICAgICAgICB9CisKKyAgICAgICAgQXJnQnVpbGRlciBvcGVyYXRvcltdKCBpbnQgcG9zaXRpb24gKSB7CisgICAgICAgICAgICBtX3Bvc2l0aW9uYWxBcmdzLmluc2VydCggc3RkOjptYWtlX3BhaXIoIHBvc2l0aW9uLCBBcmcoKSApICk7CisgICAgICAgICAgICBpZiggcG9zaXRpb24gPiBtX2hpZ2hlc3RTcGVjaWZpZWRBcmdQb3NpdGlvbiApCisgICAgICAgICAgICAgICAgbV9oaWdoZXN0U3BlY2lmaWVkQXJnUG9zaXRpb24gPSBwb3NpdGlvbjsKKyAgICAgICAgICAgIHNldFBvc2l0aW9uYWxBcmcoIG1fcG9zaXRpb25hbEFyZ3NbcG9zaXRpb25dLCBwb3NpdGlvbiApOworICAgICAgICAgICAgQXJnQnVpbGRlciBidWlsZGVyKCAmbV9wb3NpdGlvbmFsQXJnc1twb3NpdGlvbl0gKTsKKyAgICAgICAgICAgIHJldHVybiBidWlsZGVyOworICAgICAgICB9CisKKyAgICAgICAgLy8gSW52b2tlIHRoaXMgd2l0aCB0aGUgXyBpbnN0YW5jZQorICAgICAgICBBcmdCdWlsZGVyIG9wZXJhdG9yW10oIFVucG9zaXRpb25hbFRhZyApIHsKKyAgICAgICAgICAgIGlmKCBtX2Zsb2F0aW5nQXJnLmdldCgpICkKKyAgICAgICAgICAgICAgICB0aHJvdyBzdGQ6OmxvZ2ljX2Vycm9yKCAiT25seSBvbmUgdW5wb3NpdGlvbmFsIGFyZ3VtZW50IGNhbiBiZSBhZGRlZCIgKTsKKyAgICAgICAgICAgIG1fZmxvYXRpbmdBcmcucmVzZXQoIG5ldyBBcmcoKSApOworICAgICAgICAgICAgQXJnQnVpbGRlciBidWlsZGVyKCBtX2Zsb2F0aW5nQXJnLmdldCgpICk7CisgICAgICAgICAgICByZXR1cm4gYnVpbGRlcjsKKyAgICAgICAgfQorCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEMsIHR5cGVuYW1lIE0+CisgICAgICAgIHZvaWQgYmluZFByb2Nlc3NOYW1lKCBNIEM6OiogZmllbGQgKSB7CisgICAgICAgICAgICBtX2JvdW5kUHJvY2Vzc05hbWUgPSBuZXcgRGV0YWlsOjpCb3VuZERhdGFNZW1iZXI8QyxNPiggZmllbGQgKTsKKyAgICAgICAgfQorICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDLCB0eXBlbmFtZSBNPgorICAgICAgICB2b2lkIGJpbmRQcm9jZXNzTmFtZSggdm9pZCAoQzo6Kl91bmFyeU1ldGhvZCkoIE0gKSApIHsKKyAgICAgICAgICAgIG1fYm91bmRQcm9jZXNzTmFtZSA9IG5ldyBEZXRhaWw6OkJvdW5kVW5hcnlNZXRob2Q8QyxNPiggX3VuYXJ5TWV0aG9kICk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIG9wdFVzYWdlKCBzdGQ6Om9zdHJlYW0mIG9zLCBzdGQ6OnNpemVfdCBpbmRlbnQgPSAwLCBzdGQ6OnNpemVfdCB3aWR0aCA9IERldGFpbDo6Y29uc29sZVdpZHRoICkgY29uc3QgeworICAgICAgICAgICAgdHlwZW5hbWUgc3RkOjp2ZWN0b3I8QXJnPjo6Y29uc3RfaXRlcmF0b3IgaXRCZWdpbiA9IG1fb3B0aW9ucy5iZWdpbigpLCBpdEVuZCA9IG1fb3B0aW9ucy5lbmQoKSwgaXQ7CisgICAgICAgICAgICBzdGQ6OnNpemVfdCBtYXhXaWR0aCA9IDA7CisgICAgICAgICAgICBmb3IoIGl0ID0gaXRCZWdpbjsgaXQgIT0gaXRFbmQ7ICsraXQgKQorICAgICAgICAgICAgICAgIG1heFdpZHRoID0gKHN0ZDo6bWF4KSggbWF4V2lkdGgsIGl0LT5jb21tYW5kcygpLnNpemUoKSApOworCisgICAgICAgICAgICBmb3IoIGl0ID0gaXRCZWdpbjsgaXQgIT0gaXRFbmQ7ICsraXQgKSB7CisgICAgICAgICAgICAgICAgRGV0YWlsOjpUZXh0IHVzYWdlKCBpdC0+Y29tbWFuZHMoKSwgRGV0YWlsOjpUZXh0QXR0cmlidXRlcygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRXaWR0aCggbWF4V2lkdGgraW5kZW50ICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEluZGVudCggaW5kZW50ICkgKTsKKyAgICAgICAgICAgICAgICBEZXRhaWw6OlRleHQgZGVzYyggaXQtPmRlc2NyaXB0aW9uLCBEZXRhaWw6OlRleHRBdHRyaWJ1dGVzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFdpZHRoKCB3aWR0aCAtIG1heFdpZHRoIC0gMyApICk7CisKKyAgICAgICAgICAgICAgICBmb3IoIHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgKHN0ZDo6bWF4KSggdXNhZ2Uuc2l6ZSgpLCBkZXNjLnNpemUoKSApOyArK2kgKSB7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHVzYWdlQ29sID0gaSA8IHVzYWdlLnNpemUoKSA/IHVzYWdlW2ldIDogIiI7CisgICAgICAgICAgICAgICAgICAgIG9zIDw8IHVzYWdlQ29sOworCisgICAgICAgICAgICAgICAgICAgIGlmKCBpIDwgZGVzYy5zaXplKCkgJiYgIWRlc2NbaV0uZW1wdHkoKSApCisgICAgICAgICAgICAgICAgICAgICAgICBvcyAgPDwgc3RkOjpzdHJpbmcoIGluZGVudCArIDIgKyBtYXhXaWR0aCAtIHVzYWdlQ29sLnNpemUoKSwgJyAnICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBkZXNjW2ldOworICAgICAgICAgICAgICAgICAgICBvcyA8PCAiXG4iOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzdGQ6OnN0cmluZyBvcHRVc2FnZSgpIGNvbnN0IHsKKyAgICAgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisgICAgICAgICAgICBvcHRVc2FnZSggb3NzICk7CisgICAgICAgICAgICByZXR1cm4gb3NzLnN0cigpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBhcmdTeW5vcHNpcyggc3RkOjpvc3RyZWFtJiBvcyApIGNvbnN0IHsKKyAgICAgICAgICAgIGZvciggaW50IGkgPSAxOyBpIDw9IG1faGlnaGVzdFNwZWNpZmllZEFyZ1Bvc2l0aW9uOyArK2kgKSB7CisgICAgICAgICAgICAgICAgaWYoIGkgPiAxICkKKyAgICAgICAgICAgICAgICAgICAgb3MgPDwgIiAiOworICAgICAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6bWFwPGludCwgQXJnPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3Bvc2l0aW9uYWxBcmdzLmZpbmQoIGkgKTsKKyAgICAgICAgICAgICAgICBpZiggaXQgIT0gbV9wb3NpdGlvbmFsQXJncy5lbmQoKSApCisgICAgICAgICAgICAgICAgICAgIG9zIDw8ICI8IiA8PCBpdC0+c2Vjb25kLnBsYWNlaG9sZGVyIDw8ICI+IjsKKyAgICAgICAgICAgICAgICBlbHNlIGlmKCBtX2Zsb2F0aW5nQXJnLmdldCgpICkKKyAgICAgICAgICAgICAgICAgICAgb3MgPDwgIjwiIDw8IG1fZmxvYXRpbmdBcmctPnBsYWNlaG9sZGVyIDw8ICI+IjsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHRocm93IHN0ZDo6bG9naWNfZXJyb3IoICJub24gY29uc2VjdXRpdmUgcG9zaXRpb25hbCBhcmd1bWVudHMgd2l0aCBubyBmbG9hdGluZyBhcmdzIiApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gIVRCRCBObyBpbmRpY2F0aW9uIG9mIG1hbmRhdG9yeSBhcmdzCisgICAgICAgICAgICBpZiggbV9mbG9hdGluZ0FyZy5nZXQoKSApIHsKKyAgICAgICAgICAgICAgICBpZiggbV9oaWdoZXN0U3BlY2lmaWVkQXJnUG9zaXRpb24gPiAxICkKKyAgICAgICAgICAgICAgICAgICAgb3MgPDwgIiAiOworICAgICAgICAgICAgICAgIG9zIDw8ICJbPCIgPDwgbV9mbG9hdGluZ0FyZy0+cGxhY2Vob2xkZXIgPDwgIj4gLi4uXSI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3RkOjpzdHJpbmcgYXJnU3lub3BzaXMoKSBjb25zdCB7CisgICAgICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICAgICAgICAgICAgYXJnU3lub3BzaXMoIG9zcyApOworICAgICAgICAgICAgcmV0dXJuIG9zcy5zdHIoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgdXNhZ2UoIHN0ZDo6b3N0cmVhbSYgb3MsIHN0ZDo6c3RyaW5nIGNvbnN0JiBwcm9jTmFtZSApIGNvbnN0IHsKKyAgICAgICAgICAgIHZhbGlkYXRlKCk7CisgICAgICAgICAgICBvcyA8PCAidXNhZ2U6XG4gICIgPDwgcHJvY05hbWUgPDwgIiAiOworICAgICAgICAgICAgYXJnU3lub3BzaXMoIG9zICk7CisgICAgICAgICAgICBpZiggIW1fb3B0aW9ucy5lbXB0eSgpICkgeworICAgICAgICAgICAgICAgIG9zIDw8ICIgW29wdGlvbnNdXG5cbndoZXJlIG9wdGlvbnMgYXJlOiBcbiI7CisgICAgICAgICAgICAgICAgb3B0VXNhZ2UoIG9zLCAyICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvcyA8PCAiXG4iOworICAgICAgICB9CisgICAgICAgIHN0ZDo6c3RyaW5nIHVzYWdlKCBzdGQ6OnN0cmluZyBjb25zdCYgcHJvY05hbWUgKSBjb25zdCB7CisgICAgICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICAgICAgICAgICAgdXNhZ2UoIG9zcywgcHJvY05hbWUgKTsKKyAgICAgICAgICAgIHJldHVybiBvc3Muc3RyKCk7CisgICAgICAgIH0KKworICAgICAgICBDb25maWdUIHBhcnNlKCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gY29uc3QmIGFyZ3MgKSBjb25zdCB7CisgICAgICAgICAgICBDb25maWdUIGNvbmZpZzsKKyAgICAgICAgICAgIHBhcnNlSW50byggYXJncywgY29uZmlnICk7CisgICAgICAgICAgICByZXR1cm4gY29uZmlnOworICAgICAgICB9CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8UGFyc2VyOjpUb2tlbj4gcGFyc2VJbnRvKCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gY29uc3QmIGFyZ3MsIENvbmZpZ1QmIGNvbmZpZyApIGNvbnN0IHsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByb2Nlc3NOYW1lID0gYXJncy5lbXB0eSgpID8gc3RkOjpzdHJpbmcoKSA6IGFyZ3NbMF07CisgICAgICAgICAgICBzdGQ6OnNpemVfdCBsYXN0U2xhc2ggPSBwcm9jZXNzTmFtZS5maW5kX2xhc3Rfb2YoICIvXFwiICk7CisgICAgICAgICAgICBpZiggbGFzdFNsYXNoICE9IHN0ZDo6c3RyaW5nOjpucG9zICkKKyAgICAgICAgICAgICAgICBwcm9jZXNzTmFtZSA9IHByb2Nlc3NOYW1lLnN1YnN0ciggbGFzdFNsYXNoKzEgKTsKKyAgICAgICAgICAgIG1fYm91bmRQcm9jZXNzTmFtZS5zZXQoIGNvbmZpZywgcHJvY2Vzc05hbWUgKTsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFBhcnNlcjo6VG9rZW4+IHRva2VuczsKKyAgICAgICAgICAgIFBhcnNlciBwYXJzZXI7CisgICAgICAgICAgICBwYXJzZXIucGFyc2VJbnRvVG9rZW5zKCBhcmdzLCB0b2tlbnMgKTsKKyAgICAgICAgICAgIHJldHVybiBwb3B1bGF0ZSggdG9rZW5zLCBjb25maWcgKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0ZDo6dmVjdG9yPFBhcnNlcjo6VG9rZW4+IHBvcHVsYXRlKCBzdGQ6OnZlY3RvcjxQYXJzZXI6OlRva2VuPiBjb25zdCYgdG9rZW5zLCBDb25maWdUJiBjb25maWcgKSBjb25zdCB7CisgICAgICAgICAgICB2YWxpZGF0ZSgpOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8UGFyc2VyOjpUb2tlbj4gdW51c2VkVG9rZW5zID0gcG9wdWxhdGVPcHRpb25zKCB0b2tlbnMsIGNvbmZpZyApOworICAgICAgICAgICAgdW51c2VkVG9rZW5zID0gcG9wdWxhdGVGaXhlZEFyZ3MoIHVudXNlZFRva2VucywgY29uZmlnICk7CisgICAgICAgICAgICB1bnVzZWRUb2tlbnMgPSBwb3B1bGF0ZUZsb2F0aW5nQXJncyggdW51c2VkVG9rZW5zLCBjb25maWcgKTsKKyAgICAgICAgICAgIHJldHVybiB1bnVzZWRUb2tlbnM7CisgICAgICAgIH0KKworICAgICAgICBzdGQ6OnZlY3RvcjxQYXJzZXI6OlRva2VuPiBwb3B1bGF0ZU9wdGlvbnMoIHN0ZDo6dmVjdG9yPFBhcnNlcjo6VG9rZW4+IGNvbnN0JiB0b2tlbnMsIENvbmZpZ1QmIGNvbmZpZyApIGNvbnN0IHsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFBhcnNlcjo6VG9rZW4+IHVudXNlZFRva2VuczsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBlcnJvcnM7CisgICAgICAgICAgICBmb3IoIHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgdG9rZW5zLnNpemUoKTsgKytpICkgeworICAgICAgICAgICAgICAgIFBhcnNlcjo6VG9rZW4gY29uc3QmIHRva2VuID0gdG9rZW5zW2ldOworICAgICAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6dmVjdG9yPEFyZz46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9vcHRpb25zLmJlZ2luKCksIGl0RW5kID0gbV9vcHRpb25zLmVuZCgpOworICAgICAgICAgICAgICAgIGZvcig7IGl0ICE9IGl0RW5kOyArK2l0ICkgeworICAgICAgICAgICAgICAgICAgICBBcmcgY29uc3QmIGFyZyA9ICppdDsKKworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYoICggdG9rZW4udHlwZSA9PSBQYXJzZXI6OlRva2VuOjpTaG9ydE9wdCAmJiBhcmcuaGFzU2hvcnROYW1lKCB0b2tlbi5kYXRhICkgKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICggdG9rZW4udHlwZSA9PSBQYXJzZXI6OlRva2VuOjpMb25nT3B0ICYmIGFyZy5oYXNMb25nTmFtZSggdG9rZW4uZGF0YSApICkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGFyZy50YWtlc0FyZygpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggaSA9PSB0b2tlbnMuc2l6ZSgpLTEgfHwgdG9rZW5zW2krMV0udHlwZSAhPSBQYXJzZXI6OlRva2VuOjpQb3NpdGlvbmFsICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoX2JhY2soICJFeHBlY3RlZCBhcmd1bWVudCB0byBvcHRpb246ICIgKyB0b2tlbi5kYXRhICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZy5ib3VuZEZpZWxkLnNldCggY29uZmlnLCB0b2tlbnNbKytpXS5kYXRhICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcuYm91bmRGaWVsZC5zZXQoIGNvbmZpZywgInRydWUiICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoKCBzdGQ6OmV4Y2VwdGlvbiYgZXggKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaF9iYWNrKCBzdGQ6OnN0cmluZyggZXgud2hhdCgpICkgKyAiXG4tIHdoaWxlIHBhcnNpbmc6ICgiICsgYXJnLmNvbW1hbmRzKCkgKyAiKSIgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiggaXQgPT0gaXRFbmQgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmKCB0b2tlbi50eXBlID09IFBhcnNlcjo6VG9rZW46OlBvc2l0aW9uYWwgfHwgIW1fdGhyb3dPblVucmVjb2duaXNlZFRva2VucyApCisgICAgICAgICAgICAgICAgICAgICAgICB1bnVzZWRUb2tlbnMucHVzaF9iYWNrKCB0b2tlbiApOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBlcnJvcnMuZW1wdHkoKSAmJiBtX3Rocm93T25VbnJlY29nbmlzZWRUb2tlbnMgKQorICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2hfYmFjayggInVucmVjb2duaXNlZCBvcHRpb246ICIgKyB0b2tlbi5kYXRhICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoICFlcnJvcnMuZW1wdHkoKSApIHsKKyAgICAgICAgICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICAgICAgICAgICAgICAgIGZvciggc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdCA9IGVycm9ycy5iZWdpbigpLCBpdEVuZCA9IGVycm9ycy5lbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICAgICAgICAgKytpdCApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIGl0ICE9IGVycm9ycy5iZWdpbigpICkKKyAgICAgICAgICAgICAgICAgICAgICAgIG9zcyA8PCAiXG4iOworICAgICAgICAgICAgICAgICAgICBvc3MgPDwgKml0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoIG9zcy5zdHIoKSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHVudXNlZFRva2VuczsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnZlY3RvcjxQYXJzZXI6OlRva2VuPiBwb3B1bGF0ZUZpeGVkQXJncyggc3RkOjp2ZWN0b3I8UGFyc2VyOjpUb2tlbj4gY29uc3QmIHRva2VucywgQ29uZmlnVCYgY29uZmlnICkgY29uc3QgeworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8UGFyc2VyOjpUb2tlbj4gdW51c2VkVG9rZW5zOworICAgICAgICAgICAgaW50IHBvc2l0aW9uID0gMTsKKyAgICAgICAgICAgIGZvciggc3RkOjpzaXplX3QgaSA9IDA7IGkgPCB0b2tlbnMuc2l6ZSgpOyArK2kgKSB7CisgICAgICAgICAgICAgICAgUGFyc2VyOjpUb2tlbiBjb25zdCYgdG9rZW4gPSB0b2tlbnNbaV07CisgICAgICAgICAgICAgICAgdHlwZW5hbWUgc3RkOjptYXA8aW50LCBBcmc+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1fcG9zaXRpb25hbEFyZ3MuZmluZCggcG9zaXRpb24gKTsKKyAgICAgICAgICAgICAgICBpZiggaXQgIT0gbV9wb3NpdGlvbmFsQXJncy5lbmQoKSApCisgICAgICAgICAgICAgICAgICAgIGl0LT5zZWNvbmQuYm91bmRGaWVsZC5zZXQoIGNvbmZpZywgdG9rZW4uZGF0YSApOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdW51c2VkVG9rZW5zLnB1c2hfYmFjayggdG9rZW4gKTsKKyAgICAgICAgICAgICAgICBpZiggdG9rZW4udHlwZSA9PSBQYXJzZXI6OlRva2VuOjpQb3NpdGlvbmFsICkKKyAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24rKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB1bnVzZWRUb2tlbnM7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjp2ZWN0b3I8UGFyc2VyOjpUb2tlbj4gcG9wdWxhdGVGbG9hdGluZ0FyZ3MoIHN0ZDo6dmVjdG9yPFBhcnNlcjo6VG9rZW4+IGNvbnN0JiB0b2tlbnMsIENvbmZpZ1QmIGNvbmZpZyApIGNvbnN0IHsKKyAgICAgICAgICAgIGlmKCAhbV9mbG9hdGluZ0FyZy5nZXQoKSApCisgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuczsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFBhcnNlcjo6VG9rZW4+IHVudXNlZFRva2VuczsKKyAgICAgICAgICAgIGZvciggc3RkOjpzaXplX3QgaSA9IDA7IGkgPCB0b2tlbnMuc2l6ZSgpOyArK2kgKSB7CisgICAgICAgICAgICAgICAgUGFyc2VyOjpUb2tlbiBjb25zdCYgdG9rZW4gPSB0b2tlbnNbaV07CisgICAgICAgICAgICAgICAgaWYoIHRva2VuLnR5cGUgPT0gUGFyc2VyOjpUb2tlbjo6UG9zaXRpb25hbCApCisgICAgICAgICAgICAgICAgICAgIG1fZmxvYXRpbmdBcmctPmJvdW5kRmllbGQuc2V0KCBjb25maWcsIHRva2VuLmRhdGEgKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHVudXNlZFRva2Vucy5wdXNoX2JhY2soIHRva2VuICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdW51c2VkVG9rZW5zOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCB2YWxpZGF0ZSgpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBtX29wdGlvbnMuZW1wdHkoKSAmJiBtX3Bvc2l0aW9uYWxBcmdzLmVtcHR5KCkgJiYgIW1fZmxvYXRpbmdBcmcuZ2V0KCkgKQorICAgICAgICAgICAgICAgIHRocm93IHN0ZDo6bG9naWNfZXJyb3IoICJObyBvcHRpb25zIG9yIGFyZ3VtZW50cyBzcGVjaWZpZWQiICk7CisKKyAgICAgICAgICAgIGZvciggdHlwZW5hbWUgc3RkOjp2ZWN0b3I8QXJnPjo6Y29uc3RfaXRlcmF0b3IgIGl0ID0gbV9vcHRpb25zLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdEVuZCA9IG1fb3B0aW9ucy5lbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7ICsraXQgKQorICAgICAgICAgICAgICAgIGl0LT52YWxpZGF0ZSgpOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBEZXRhaWw6OkJvdW5kQXJnRnVuY3Rpb248Q29uZmlnVD4gbV9ib3VuZFByb2Nlc3NOYW1lOworICAgICAgICBzdGQ6OnZlY3RvcjxBcmc+IG1fb3B0aW9uczsKKyAgICAgICAgc3RkOjptYXA8aW50LCBBcmc+IG1fcG9zaXRpb25hbEFyZ3M7CisgICAgICAgIEFyZ0F1dG9QdHIgbV9mbG9hdGluZ0FyZzsKKyAgICAgICAgaW50IG1faGlnaGVzdFNwZWNpZmllZEFyZ1Bvc2l0aW9uOworICAgICAgICBib29sIG1fdGhyb3dPblVucmVjb2duaXNlZFRva2VuczsKKyAgICB9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2xhcmEKKworU1RJVENIX0NMQVJBX0NMT1NFX05BTUVTUEFDRQorI3VuZGVmIFNUSVRDSF9DTEFSQV9PUEVOX05BTUVTUEFDRQorI3VuZGVmIFNUSVRDSF9DTEFSQV9DTE9TRV9OQU1FU1BBQ0UKKworI2VuZGlmIC8vIFRXT0JMVUVDVUJFU19DTEFSQV9IX0lOQ0xVREVECisjdW5kZWYgU1RJVENIX0NMQVJBX09QRU5fTkFNRVNQQUNFCisKKy8vIFJlc3RvcmUgQ2xhcmEncyB2YWx1ZSBmb3IgY29uc29sZSB3aWR0aCwgaWYgcHJlc2VudAorI2lmZGVmIENBVENIX1RFTVBfQ0xBUkFfQ09ORklHX0NPTlNPTEVfV0lEVEgKKyNkZWZpbmUgQ0xBUkFfQ09ORklHX0NPTlNPTEVfV0lEVEggQ0FUQ0hfVEVNUF9DTEFSQV9DT05GSUdfQ09OU09MRV9XSURUSAorI3VuZGVmIENBVENIX1RFTVBfQ0xBUkFfQ09ORklHX0NPTlNPTEVfV0lEVEgKKyNlbmRpZgorCisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxjdGltZT4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIGlubGluZSB2b2lkIGFib3J0QWZ0ZXJGaXJzdCggQ29uZmlnRGF0YSYgY29uZmlnICkgeyBjb25maWcuYWJvcnRBZnRlciA9IDE7IH0KKyAgICBpbmxpbmUgdm9pZCBhYm9ydEFmdGVyWCggQ29uZmlnRGF0YSYgY29uZmlnLCBpbnQgeCApIHsKKyAgICAgICAgaWYoIHggPCAxICkKKyAgICAgICAgICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvciggIlZhbHVlIGFmdGVyIC14IG9yIC0tYWJvcnRBZnRlciBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvIiApOworICAgICAgICBjb25maWcuYWJvcnRBZnRlciA9IHg7CisgICAgfQorICAgIGlubGluZSB2b2lkIGFkZFRlc3RPclRhZ3MoIENvbmZpZ0RhdGEmIGNvbmZpZywgc3RkOjpzdHJpbmcgY29uc3QmIF90ZXN0U3BlYyApIHsgY29uZmlnLnRlc3RzT3JUYWdzLnB1c2hfYmFjayggX3Rlc3RTcGVjICk7IH0KKyAgICBpbmxpbmUgdm9pZCBhZGRTZWN0aW9uVG9SdW4oIENvbmZpZ0RhdGEmIGNvbmZpZywgc3RkOjpzdHJpbmcgY29uc3QmIHNlY3Rpb25OYW1lICkgeyBjb25maWcuc2VjdGlvbnNUb1J1bi5wdXNoX2JhY2soIHNlY3Rpb25OYW1lICk7IH0KKyAgICBpbmxpbmUgdm9pZCBhZGRSZXBvcnRlck5hbWUoIENvbmZpZ0RhdGEmIGNvbmZpZywgc3RkOjpzdHJpbmcgY29uc3QmIF9yZXBvcnRlck5hbWUgKSB7IGNvbmZpZy5yZXBvcnRlck5hbWVzLnB1c2hfYmFjayggX3JlcG9ydGVyTmFtZSApOyB9CisKKyAgICBpbmxpbmUgdm9pZCBhZGRXYXJuaW5nKCBDb25maWdEYXRhJiBjb25maWcsIHN0ZDo6c3RyaW5nIGNvbnN0JiBfd2FybmluZyApIHsKKyAgICAgICAgaWYoIF93YXJuaW5nID09ICJOb0Fzc2VydGlvbnMiICkKKyAgICAgICAgICAgIGNvbmZpZy53YXJuaW5ncyA9IHN0YXRpY19jYXN0PFdhcm5BYm91dDo6V2hhdD4oIGNvbmZpZy53YXJuaW5ncyB8IFdhcm5BYm91dDo6Tm9Bc3NlcnRpb25zICk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvciggIlVucmVjb2duaXNlZCB3YXJuaW5nOiAnIiArIF93YXJuaW5nICsgJ1wnJyApOworICAgIH0KKyAgICBpbmxpbmUgdm9pZCBzZXRPcmRlciggQ29uZmlnRGF0YSYgY29uZmlnLCBzdGQ6OnN0cmluZyBjb25zdCYgb3JkZXIgKSB7CisgICAgICAgIGlmKCBzdGFydHNXaXRoKCAiZGVjbGFyZWQiLCBvcmRlciApICkKKyAgICAgICAgICAgIGNvbmZpZy5ydW5PcmRlciA9IFJ1blRlc3RzOjpJbkRlY2xhcmF0aW9uT3JkZXI7CisgICAgICAgIGVsc2UgaWYoIHN0YXJ0c1dpdGgoICJsZXhpY2FsIiwgb3JkZXIgKSApCisgICAgICAgICAgICBjb25maWcucnVuT3JkZXIgPSBSdW5UZXN0czo6SW5MZXhpY29ncmFwaGljYWxPcmRlcjsKKyAgICAgICAgZWxzZSBpZiggc3RhcnRzV2l0aCggInJhbmRvbSIsIG9yZGVyICkgKQorICAgICAgICAgICAgY29uZmlnLnJ1bk9yZGVyID0gUnVuVGVzdHM6OkluUmFuZG9tT3JkZXI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvciggIlVucmVjb2duaXNlZCBvcmRlcmluZzogJyIgKyBvcmRlciArICdcJycgKTsKKyAgICB9CisgICAgaW5saW5lIHZvaWQgc2V0Um5nU2VlZCggQ29uZmlnRGF0YSYgY29uZmlnLCBzdGQ6OnN0cmluZyBjb25zdCYgc2VlZCApIHsKKyAgICAgICAgaWYoIHNlZWQgPT0gInRpbWUiICkgeworICAgICAgICAgICAgY29uZmlnLnJuZ1NlZWQgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KCBzdGQ6OnRpbWUoMCkgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICAgICAgICAgICAgc3MgPDwgc2VlZDsKKyAgICAgICAgICAgIHNzID4+IGNvbmZpZy5ybmdTZWVkOworICAgICAgICAgICAgaWYoIHNzLmZhaWwoKSApCisgICAgICAgICAgICAgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCAiQXJndW1lbnQgdG8gLS1ybmctc2VlZCBzaG91bGQgYmUgdGhlIHdvcmQgJ3RpbWUnIG9yIGEgbnVtYmVyIiApOworICAgICAgICB9CisgICAgfQorICAgIGlubGluZSB2b2lkIHNldFZlcmJvc2l0eSggQ29uZmlnRGF0YSYgY29uZmlnLCBpbnQgbGV2ZWwgKSB7CisgICAgICAgIC8vICFUQkQ6IGFjY2VwdCBzdHJpbmdzPworICAgICAgICBjb25maWcudmVyYm9zaXR5ID0gc3RhdGljX2Nhc3Q8VmVyYm9zaXR5OjpMZXZlbD4oIGxldmVsICk7CisgICAgfQorICAgIGlubGluZSB2b2lkIHNldFNob3dEdXJhdGlvbnMoIENvbmZpZ0RhdGEmIGNvbmZpZywgYm9vbCBfc2hvd0R1cmF0aW9ucyApIHsKKyAgICAgICAgY29uZmlnLnNob3dEdXJhdGlvbnMgPSBfc2hvd0R1cmF0aW9ucworICAgICAgICAgICAgPyBTaG93RHVyYXRpb25zOjpBbHdheXMKKyAgICAgICAgICAgIDogU2hvd0R1cmF0aW9uczo6TmV2ZXI7CisgICAgfQorICAgIGlubGluZSB2b2lkIHNldFVzZUNvbG91ciggQ29uZmlnRGF0YSYgY29uZmlnLCBzdGQ6OnN0cmluZyBjb25zdCYgdmFsdWUgKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIG1vZGUgPSB0b0xvd2VyKCB2YWx1ZSApOworCisgICAgICAgIGlmKCBtb2RlID09ICJ5ZXMiICkKKyAgICAgICAgICAgIGNvbmZpZy51c2VDb2xvdXIgPSBVc2VDb2xvdXI6OlllczsKKyAgICAgICAgZWxzZSBpZiggbW9kZSA9PSAibm8iICkKKyAgICAgICAgICAgIGNvbmZpZy51c2VDb2xvdXIgPSBVc2VDb2xvdXI6Ok5vOworICAgICAgICBlbHNlIGlmKCBtb2RlID09ICJhdXRvIiApCisgICAgICAgICAgICBjb25maWcudXNlQ29sb3VyID0gVXNlQ29sb3VyOjpBdXRvOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoICJjb2xvdXIgbW9kZSBtdXN0IGJlIG9uZSBvZjogYXV0bywgeWVzIG9yIG5vIiApOworICAgIH0KKyAgICBpbmxpbmUgdm9pZCBmb3JjZUNvbG91ciggQ29uZmlnRGF0YSYgY29uZmlnICkgeworICAgICAgICBjb25maWcudXNlQ29sb3VyID0gVXNlQ29sb3VyOjpZZXM7CisgICAgfQorICAgIGlubGluZSB2b2lkIGxvYWRUZXN0TmFtZXNGcm9tRmlsZSggQ29uZmlnRGF0YSYgY29uZmlnLCBzdGQ6OnN0cmluZyBjb25zdCYgX2ZpbGVuYW1lICkgeworICAgICAgICBzdGQ6Omlmc3RyZWFtIGYoIF9maWxlbmFtZS5jX3N0cigpICk7CisgICAgICAgIGlmKCAhZi5pc19vcGVuKCkgKQorICAgICAgICAgICAgdGhyb3cgc3RkOjpkb21haW5fZXJyb3IoICJVbmFibGUgdG8gbG9hZCBpbnB1dCBmaWxlOiAiICsgX2ZpbGVuYW1lICk7CisKKyAgICAgICAgc3RkOjpzdHJpbmcgbGluZTsKKyAgICAgICAgd2hpbGUoIHN0ZDo6Z2V0bGluZSggZiwgbGluZSApICkgeworICAgICAgICAgICAgbGluZSA9IHRyaW0obGluZSk7CisgICAgICAgICAgICBpZiggIWxpbmUuZW1wdHkoKSAmJiAhc3RhcnRzV2l0aCggbGluZSwgJyMnICkgKSB7CisgICAgICAgICAgICAgICAgaWYoICFzdGFydHNXaXRoKCBsaW5lLCAnIicgKSApCisgICAgICAgICAgICAgICAgICAgIGxpbmUgPSAnIicgKyBsaW5lICsgJyInOworICAgICAgICAgICAgICAgIGFkZFRlc3RPclRhZ3MoIGNvbmZpZywgbGluZSArICcsJyApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaW5saW5lIENsYXJhOjpDb21tYW5kTGluZTxDb25maWdEYXRhPiBtYWtlQ29tbWFuZExpbmVQYXJzZXIoKSB7CisKKyAgICAgICAgdXNpbmcgbmFtZXNwYWNlIENsYXJhOworICAgICAgICBDb21tYW5kTGluZTxDb25maWdEYXRhPiBjbGk7CisKKyAgICAgICAgY2xpLmJpbmRQcm9jZXNzTmFtZSggJkNvbmZpZ0RhdGE6OnByb2Nlc3NOYW1lICk7CisKKyAgICAgICAgY2xpWyItPyJdWyItaCJdWyItLWhlbHAiXQorICAgICAgICAgICAgLmRlc2NyaWJlKCAiZGlzcGxheSB1c2FnZSBpbmZvcm1hdGlvbiIgKQorICAgICAgICAgICAgLmJpbmQoICZDb25maWdEYXRhOjpzaG93SGVscCApOworCisgICAgICAgIGNsaVsiLWwiXVsiLS1saXN0LXRlc3RzIl0KKyAgICAgICAgICAgIC5kZXNjcmliZSggImxpc3QgYWxsL21hdGNoaW5nIHRlc3QgY2FzZXMiICkKKyAgICAgICAgICAgIC5iaW5kKCAmQ29uZmlnRGF0YTo6bGlzdFRlc3RzICk7CisKKyAgICAgICAgY2xpWyItdCJdWyItLWxpc3QtdGFncyJdCisgICAgICAgICAgICAuZGVzY3JpYmUoICJsaXN0IGFsbC9tYXRjaGluZyB0YWdzIiApCisgICAgICAgICAgICAuYmluZCggJkNvbmZpZ0RhdGE6Omxpc3RUYWdzICk7CisKKyAgICAgICAgY2xpWyItcyJdWyItLXN1Y2Nlc3MiXQorICAgICAgICAgICAgLmRlc2NyaWJlKCAiaW5jbHVkZSBzdWNjZXNzZnVsIHRlc3RzIGluIG91dHB1dCIgKQorICAgICAgICAgICAgLmJpbmQoICZDb25maWdEYXRhOjpzaG93U3VjY2Vzc2Z1bFRlc3RzICk7CisKKyAgICAgICAgY2xpWyItYiJdWyItLWJyZWFrIl0KKyAgICAgICAgICAgIC5kZXNjcmliZSggImJyZWFrIGludG8gZGVidWdnZXIgb24gZmFpbHVyZSIgKQorICAgICAgICAgICAgLmJpbmQoICZDb25maWdEYXRhOjpzaG91bGREZWJ1Z0JyZWFrICk7CisKKyAgICAgICAgY2xpWyItZSJdWyItLW5vdGhyb3ciXQorICAgICAgICAgICAgLmRlc2NyaWJlKCAic2tpcCBleGNlcHRpb24gdGVzdHMiICkKKyAgICAgICAgICAgIC5iaW5kKCAmQ29uZmlnRGF0YTo6bm9UaHJvdyApOworCisgICAgICAgIGNsaVsiLWkiXVsiLS1pbnZpc2libGVzIl0KKyAgICAgICAgICAgIC5kZXNjcmliZSggInNob3cgaW52aXNpYmxlcyAodGFicywgbmV3bGluZXMpIiApCisgICAgICAgICAgICAuYmluZCggJkNvbmZpZ0RhdGE6OnNob3dJbnZpc2libGVzICk7CisKKyAgICAgICAgY2xpWyItbyJdWyItLW91dCJdCisgICAgICAgICAgICAuZGVzY3JpYmUoICJvdXRwdXQgZmlsZW5hbWUiICkKKyAgICAgICAgICAgIC5iaW5kKCAmQ29uZmlnRGF0YTo6b3V0cHV0RmlsZW5hbWUsICJmaWxlbmFtZSIgKTsKKworICAgICAgICBjbGlbIi1yIl1bIi0tcmVwb3J0ZXIiXQorLy8gICAgICAgICAgICAucGxhY2Vob2xkZXIoICJuYW1lWzpmaWxlbmFtZV0iICkKKyAgICAgICAgICAgIC5kZXNjcmliZSggInJlcG9ydGVyIHRvIHVzZSAoZGVmYXVsdHMgdG8gY29uc29sZSkiICkKKyAgICAgICAgICAgIC5iaW5kKCAmYWRkUmVwb3J0ZXJOYW1lLCAibmFtZSIgKTsKKworICAgICAgICBjbGlbIi1uIl1bIi0tbmFtZSJdCisgICAgICAgICAgICAuZGVzY3JpYmUoICJzdWl0ZSBuYW1lIiApCisgICAgICAgICAgICAuYmluZCggJkNvbmZpZ0RhdGE6Om5hbWUsICJuYW1lIiApOworCisgICAgICAgIGNsaVsiLWEiXVsiLS1hYm9ydCJdCisgICAgICAgICAgICAuZGVzY3JpYmUoICJhYm9ydCBhdCBmaXJzdCBmYWlsdXJlIiApCisgICAgICAgICAgICAuYmluZCggJmFib3J0QWZ0ZXJGaXJzdCApOworCisgICAgICAgIGNsaVsiLXgiXVsiLS1hYm9ydHgiXQorICAgICAgICAgICAgLmRlc2NyaWJlKCAiYWJvcnQgYWZ0ZXIgeCBmYWlsdXJlcyIgKQorICAgICAgICAgICAgLmJpbmQoICZhYm9ydEFmdGVyWCwgIm5vLiBmYWlsdXJlcyIgKTsKKworICAgICAgICBjbGlbIi13Il1bIi0td2FybiJdCisgICAgICAgICAgICAuZGVzY3JpYmUoICJlbmFibGUgd2FybmluZ3MiICkKKyAgICAgICAgICAgIC5iaW5kKCAmYWRkV2FybmluZywgIndhcm5pbmcgbmFtZSIgKTsKKworLy8gLSBuZWVkcyB1cGRhdGluZyBpZiByZWluc3RhdGVkCisvLyAgICAgICAgY2xpLmludG8oICZzZXRWZXJib3NpdHkgKQorLy8gICAgICAgICAgICAuZGVzY3JpYmUoICJsZXZlbCBvZiB2ZXJib3NpdHkgKDA9bm8gb3V0cHV0KSIgKQorLy8gICAgICAgICAgICAuc2hvcnRPcHQoICJ2IikKKy8vICAgICAgICAgICAgLmxvbmdPcHQoICJ2ZXJib3NpdHkiICkKKy8vICAgICAgICAgICAgLnBsYWNlaG9sZGVyKCAibGV2ZWwiICk7CisKKyAgICAgICAgY2xpW19dCisgICAgICAgICAgICAuZGVzY3JpYmUoICJ3aGljaCB0ZXN0IG9yIHRlc3RzIHRvIHVzZSIgKQorICAgICAgICAgICAgLmJpbmQoICZhZGRUZXN0T3JUYWdzLCAidGVzdCBuYW1lLCBwYXR0ZXJuIG9yIHRhZ3MiICk7CisKKyAgICAgICAgY2xpWyItZCJdWyItLWR1cmF0aW9ucyJdCisgICAgICAgICAgICAuZGVzY3JpYmUoICJzaG93IHRlc3QgZHVyYXRpb25zIiApCisgICAgICAgICAgICAuYmluZCggJnNldFNob3dEdXJhdGlvbnMsICJ5ZXN8bm8iICk7CisKKyAgICAgICAgY2xpWyItZiJdWyItLWlucHV0LWZpbGUiXQorICAgICAgICAgICAgLmRlc2NyaWJlKCAibG9hZCB0ZXN0IG5hbWVzIHRvIHJ1biBmcm9tIGEgZmlsZSIgKQorICAgICAgICAgICAgLmJpbmQoICZsb2FkVGVzdE5hbWVzRnJvbUZpbGUsICJmaWxlbmFtZSIgKTsKKworICAgICAgICBjbGlbIi0jIl1bIi0tZmlsZW5hbWVzLWFzLXRhZ3MiXQorICAgICAgICAgICAgLmRlc2NyaWJlKCAiYWRkcyBhIHRhZyBmb3IgdGhlIGZpbGVuYW1lIiApCisgICAgICAgICAgICAuYmluZCggJkNvbmZpZ0RhdGE6OmZpbGVuYW1lc0FzVGFncyApOworCisgICAgICAgIGNsaVsiLWMiXVsiLS1zZWN0aW9uIl0KKyAgICAgICAgICAgICAgICAuZGVzY3JpYmUoICJzcGVjaWZ5IHNlY3Rpb24gdG8gcnVuIiApCisgICAgICAgICAgICAgICAgLmJpbmQoICZhZGRTZWN0aW9uVG9SdW4sICJzZWN0aW9uIG5hbWUiICk7CisKKyAgICAgICAgLy8gTGVzcyBjb21tb24gY29tbWFuZHMgd2hpY2ggZG9uJ3QgaGF2ZSBhIHNob3J0IGZvcm0KKyAgICAgICAgY2xpWyItLWxpc3QtdGVzdC1uYW1lcy1vbmx5Il0KKyAgICAgICAgICAgIC5kZXNjcmliZSggImxpc3QgYWxsL21hdGNoaW5nIHRlc3QgY2FzZXMgbmFtZXMgb25seSIgKQorICAgICAgICAgICAgLmJpbmQoICZDb25maWdEYXRhOjpsaXN0VGVzdE5hbWVzT25seSApOworCisgICAgICAgIGNsaVsiLS1saXN0LXJlcG9ydGVycyJdCisgICAgICAgICAgICAuZGVzY3JpYmUoICJsaXN0IGFsbCByZXBvcnRlcnMiICkKKyAgICAgICAgICAgIC5iaW5kKCAmQ29uZmlnRGF0YTo6bGlzdFJlcG9ydGVycyApOworCisgICAgICAgIGNsaVsiLS1vcmRlciJdCisgICAgICAgICAgICAuZGVzY3JpYmUoICJ0ZXN0IGNhc2Ugb3JkZXIgKGRlZmF1bHRzIHRvIGRlY2wpIiApCisgICAgICAgICAgICAuYmluZCggJnNldE9yZGVyLCAiZGVjbHxsZXh8cmFuZCIgKTsKKworICAgICAgICBjbGlbIi0tcm5nLXNlZWQiXQorICAgICAgICAgICAgLmRlc2NyaWJlKCAic2V0IGEgc3BlY2lmaWMgc2VlZCBmb3IgcmFuZG9tIG51bWJlcnMiICkKKyAgICAgICAgICAgIC5iaW5kKCAmc2V0Um5nU2VlZCwgIid0aW1lJ3xudW1iZXIiICk7CisKKyAgICAgICAgY2xpWyItLWZvcmNlLWNvbG91ciJdCisgICAgICAgICAgICAuZGVzY3JpYmUoICJmb3JjZSBjb2xvdXJpc2VkIG91dHB1dCAoZGVwcmVjYXRlZCkiICkKKyAgICAgICAgICAgIC5iaW5kKCAmZm9yY2VDb2xvdXIgKTsKKworICAgICAgICBjbGlbIi0tdXNlLWNvbG91ciJdCisgICAgICAgICAgICAuZGVzY3JpYmUoICJzaG91bGQgb3V0cHV0IGJlIGNvbG91cmlzZWQiICkKKyAgICAgICAgICAgIC5iaW5kKCAmc2V0VXNlQ29sb3VyLCAieWVzfG5vIiApOworCisgICAgICAgIHJldHVybiBjbGk7CisgICAgfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IGludGVybmFsL2NhdGNoX2xpc3QuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9MSVNUX0hQUF9JTkNMVURFRAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfdGV4dC5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9URVhUX0hfSU5DTFVERUQKKworI2RlZmluZSBUQkNfVEVYVF9GT1JNQVRfQ09OU09MRV9XSURUSCBDQVRDSF9DT05GSUdfQ09OU09MRV9XSURUSAorCisjZGVmaW5lIENMSUNIRV9UQkNfVEVYVF9GT1JNQVRfT1VURVJfTkFNRVNQQUNFIENhdGNoCisvLyAjaW5jbHVkZWQgZnJvbTogLi4vZXh0ZXJuYWwvdGJjX3RleHRfZm9ybWF0LmgKKy8vIE9ubHkgdXNlIGhlYWRlciBndWFyZCBpZiB3ZSBhcmUgbm90IHVzaW5nIGFuIG91dGVyIG5hbWVzcGFjZQorI2lmbmRlZiBDTElDSEVfVEJDX1RFWFRfRk9STUFUX09VVEVSX05BTUVTUEFDRQorIyBpZmRlZiBUV09CTFVFQ1VCRVNfVEVYVF9GT1JNQVRfSF9JTkNMVURFRAorIyAgaWZuZGVmIFRXT0JMVUVDVUJFU19URVhUX0ZPUk1BVF9IX0FMUkVBRFlfSU5DTFVERUQKKyMgICBkZWZpbmUgVFdPQkxVRUNVQkVTX1RFWFRfRk9STUFUX0hfQUxSRUFEWV9JTkNMVURFRAorIyAgZW5kaWYKKyMgZWxzZQorIyAgZGVmaW5lIFRXT0JMVUVDVUJFU19URVhUX0ZPUk1BVF9IX0lOQ0xVREVECisjIGVuZGlmCisjZW5kaWYKKyNpZm5kZWYgVFdPQkxVRUNVQkVTX1RFWFRfRk9STUFUX0hfQUxSRUFEWV9JTkNMVURFRAorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8c3N0cmVhbT4KKworLy8gVXNlIG9wdGlvbmFsIG91dGVyIG5hbWVzcGFjZQorI2lmZGVmIENMSUNIRV9UQkNfVEVYVF9GT1JNQVRfT1VURVJfTkFNRVNQQUNFCituYW1lc3BhY2UgQ0xJQ0hFX1RCQ19URVhUX0ZPUk1BVF9PVVRFUl9OQU1FU1BBQ0UgeworI2VuZGlmCisKK25hbWVzcGFjZSBUYmMgeworCisjaWZkZWYgVEJDX1RFWFRfRk9STUFUX0NPTlNPTEVfV0lEVEgKKyAgICBjb25zdCB1bnNpZ25lZCBpbnQgY29uc29sZVdpZHRoID0gVEJDX1RFWFRfRk9STUFUX0NPTlNPTEVfV0lEVEg7CisjZWxzZQorICAgIGNvbnN0IHVuc2lnbmVkIGludCBjb25zb2xlV2lkdGggPSA4MDsKKyNlbmRpZgorCisgICAgc3RydWN0IFRleHRBdHRyaWJ1dGVzIHsKKyAgICAgICAgVGV4dEF0dHJpYnV0ZXMoKQorICAgICAgICA6ICAgaW5pdGlhbEluZGVudCggc3RkOjpzdHJpbmc6Om5wb3MgKSwKKyAgICAgICAgICAgIGluZGVudCggMCApLAorICAgICAgICAgICAgd2lkdGgoIGNvbnNvbGVXaWR0aC0xICkKKyAgICAgICAge30KKworICAgICAgICBUZXh0QXR0cmlidXRlcyYgc2V0SW5pdGlhbEluZGVudCggc3RkOjpzaXplX3QgX3ZhbHVlICkgIHsgaW5pdGlhbEluZGVudCA9IF92YWx1ZTsgcmV0dXJuICp0aGlzOyB9CisgICAgICAgIFRleHRBdHRyaWJ1dGVzJiBzZXRJbmRlbnQoIHN0ZDo6c2l6ZV90IF92YWx1ZSApICAgICAgICAgeyBpbmRlbnQgPSBfdmFsdWU7IHJldHVybiAqdGhpczsgfQorICAgICAgICBUZXh0QXR0cmlidXRlcyYgc2V0V2lkdGgoIHN0ZDo6c2l6ZV90IF92YWx1ZSApICAgICAgICAgIHsgd2lkdGggPSBfdmFsdWU7IHJldHVybiAqdGhpczsgfQorCisgICAgICAgIHN0ZDo6c2l6ZV90IGluaXRpYWxJbmRlbnQ7ICAvLyBpbmRlbnQgb2YgZmlyc3QgbGluZSwgb3IgbnBvcworICAgICAgICBzdGQ6OnNpemVfdCBpbmRlbnQ7ICAgICAgICAgLy8gaW5kZW50IG9mIHN1YnNlcXVlbnQgbGluZXMsIG9yIGFsbCBpZiBpbml0aWFsSW5kZW50IGlzIG5wb3MKKyAgICAgICAgc3RkOjpzaXplX3Qgd2lkdGg7ICAgICAgICAgIC8vIG1heGltdW0gd2lkdGggb2YgdGV4dCwgaW5jbHVkaW5nIGluZGVudC4gTG9uZ2VyIHRleHQgd2lsbCB3cmFwCisgICAgfTsKKworICAgIGNsYXNzIFRleHQgeworICAgIHB1YmxpYzoKKyAgICAgICAgVGV4dCggc3RkOjpzdHJpbmcgY29uc3QmIF9zdHIsIFRleHRBdHRyaWJ1dGVzIGNvbnN0JiBfYXR0ciA9IFRleHRBdHRyaWJ1dGVzKCkgKQorICAgICAgICA6IGF0dHIoIF9hdHRyICkKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgd3JhcHBhYmxlQmVmb3JlQ2hhcnMgPSAiWyh7PFx0IjsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHdyYXBwYWJsZUFmdGVyQ2hhcnMgPSAiXSl9Pi0sLi98XFwiOworICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgd3JhcHBhYmxlSW5zdGVhZE9mQ2hhcnMgPSAiIFxuXHIiOworICAgICAgICAgICAgc3RkOjpzdHJpbmcgaW5kZW50ID0gX2F0dHIuaW5pdGlhbEluZGVudCAhPSBzdGQ6OnN0cmluZzo6bnBvcworICAgICAgICAgICAgICAgID8gc3RkOjpzdHJpbmcoIF9hdHRyLmluaXRpYWxJbmRlbnQsICcgJyApCisgICAgICAgICAgICAgICAgOiBzdGQ6OnN0cmluZyggX2F0dHIuaW5kZW50LCAnICcgKTsKKworICAgICAgICAgICAgdHlwZWRlZiBzdGQ6OnN0cmluZzo6Y29uc3RfaXRlcmF0b3IgaXRlcmF0b3I7CisgICAgICAgICAgICBpdGVyYXRvciBpdCA9IF9zdHIuYmVnaW4oKTsKKyAgICAgICAgICAgIGNvbnN0IGl0ZXJhdG9yIHN0ckVuZCA9IF9zdHIuZW5kKCk7CisKKyAgICAgICAgICAgIHdoaWxlKCBpdCAhPSBzdHJFbmQgKSB7CisKKyAgICAgICAgICAgICAgICBpZiggbGluZXMuc2l6ZSgpID49IDEwMDAgKSB7CisgICAgICAgICAgICAgICAgICAgIGxpbmVzLnB1c2hfYmFjayggIi4uLiBtZXNzYWdlIHRydW5jYXRlZCBkdWUgdG8gZXhjZXNzaXZlIHNpemUiICk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBzdWZmaXg7CisgICAgICAgICAgICAgICAgc3RkOjpzaXplX3Qgd2lkdGggPSAoc3RkOjptaW4pKCBzdGF0aWNfY2FzdDxzaXplX3Q+KCBzdHJFbmQtaXQgKSwgX2F0dHIud2lkdGgtc3RhdGljX2Nhc3Q8c2l6ZV90PiggaW5kZW50LnNpemUoKSApICk7CisgICAgICAgICAgICAgICAgaXRlcmF0b3IgaXRFbmQgPSBpdCt3aWR0aDsKKyAgICAgICAgICAgICAgICBpdGVyYXRvciBpdE5leHQgPSBfc3RyLmVuZCgpOworCisgICAgICAgICAgICAgICAgaXRlcmF0b3IgaXROZXdMaW5lID0gc3RkOjpmaW5kKCBpdCwgaXRFbmQsICdcbicgKTsKKyAgICAgICAgICAgICAgICBpZiggaXROZXdMaW5lICE9IGl0RW5kICkKKyAgICAgICAgICAgICAgICAgICAgaXRFbmQgPSBpdE5ld0xpbmU7CisKKyAgICAgICAgICAgICAgICBpZiggaXRFbmQgIT0gc3RyRW5kICApIHsKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3VuZFdyYXBQb2ludCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBpdGVyYXRvciBmaW5kSXQgPSBpdEVuZDsKKyAgICAgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHdyYXBwYWJsZUFmdGVyQ2hhcnMuZmluZCggKmZpbmRJdCApICE9IHN0ZDo6c3RyaW5nOjpucG9zICYmIGZpbmRJdCAhPSBpdEVuZCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdEVuZCA9IGZpbmRJdCsxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0TmV4dCA9IGZpbmRJdCsxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kV3JhcFBvaW50ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIGZpbmRJdCA+IGl0ICYmIHdyYXBwYWJsZUJlZm9yZUNoYXJzLmZpbmQoICpmaW5kSXQgKSAhPSBzdGQ6OnN0cmluZzo6bnBvcyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdEVuZCA9IGZpbmRJdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdE5leHQgPSBmaW5kSXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRXcmFwUG9pbnQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggd3JhcHBhYmxlSW5zdGVhZE9mQ2hhcnMuZmluZCggKmZpbmRJdCApICE9IHN0ZDo6c3RyaW5nOjpucG9zICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0TmV4dCA9IGZpbmRJdCsxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0RW5kID0gZmluZEl0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kV3JhcFBvaW50ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBmaW5kSXQgPT0gaXQgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tZmluZEl0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHdoaWxlKCAhZm91bmRXcmFwUG9pbnQgKTsKKworICAgICAgICAgICAgICAgICAgICBpZiggIWZvdW5kV3JhcFBvaW50ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm8gZ29vZCB3cmFwIGNoYXIsIHNvIHdlJ2xsIGJyZWFrIG1pZCB3b3JkIGFuZCBhZGQgYSBoeXBoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgIC0taXRFbmQ7CisgICAgICAgICAgICAgICAgICAgICAgICBpdE5leHQgPSBpdEVuZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1ZmZpeCA9ICItIjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlKCBpdEVuZCA+IGl0ICYmIHdyYXBwYWJsZUluc3RlYWRPZkNoYXJzLmZpbmQoICooaXRFbmQtMSkgKSAhPSBzdGQ6OnN0cmluZzo6bnBvcyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS1pdEVuZDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsaW5lcy5wdXNoX2JhY2soIGluZGVudCArIHN0ZDo6c3RyaW5nKCBpdCwgaXRFbmQgKSArIHN1ZmZpeCApOworCisgICAgICAgICAgICAgICAgaWYoIGluZGVudC5zaXplKCkgIT0gX2F0dHIuaW5kZW50ICkKKyAgICAgICAgICAgICAgICAgICAgaW5kZW50ID0gc3RkOjpzdHJpbmcoIF9hdHRyLmluZGVudCwgJyAnICk7CisgICAgICAgICAgICAgICAgaXQgPSBpdE5leHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB0eXBlZGVmIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgY29uc3RfaXRlcmF0b3I7CisKKyAgICAgICAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBsaW5lcy5iZWdpbigpOyB9CisgICAgICAgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIGxpbmVzLmVuZCgpOyB9CisgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBsYXN0KCkgY29uc3QgeyByZXR1cm4gbGluZXMuYmFjaygpOyB9CisgICAgICAgIHN0ZDo6c2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBsaW5lcy5zaXplKCk7IH0KKyAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIG9wZXJhdG9yW10oIHN0ZDo6c2l6ZV90IF9pbmRleCApIGNvbnN0IHsgcmV0dXJuIGxpbmVzW19pbmRleF07IH0KKyAgICAgICAgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdCB7CisgICAgICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICAgICAgICAgICAgb3NzIDw8ICp0aGlzOworICAgICAgICAgICAgcmV0dXJuIG9zcy5zdHIoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlubGluZSBmcmllbmQgc3RkOjpvc3RyZWFtJiBvcGVyYXRvciA8PCAoIHN0ZDo6b3N0cmVhbSYgX3N0cmVhbSwgVGV4dCBjb25zdCYgX3RleHQgKSB7CisgICAgICAgICAgICBmb3IoIFRleHQ6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gX3RleHQuYmVnaW4oKSwgaXRFbmQgPSBfdGV4dC5lbmQoKTsKKyAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsgKytpdCApIHsKKyAgICAgICAgICAgICAgICBpZiggaXQgIT0gX3RleHQuYmVnaW4oKSApCisgICAgICAgICAgICAgICAgICAgIF9zdHJlYW0gPDwgIlxuIjsKKyAgICAgICAgICAgICAgICBfc3RyZWFtIDw8ICppdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBfc3RyZWFtOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6OnN0cmluZyBzdHI7CisgICAgICAgIFRleHRBdHRyaWJ1dGVzIGF0dHI7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBsaW5lczsKKyAgICB9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgVGJjCisKKyNpZmRlZiBDTElDSEVfVEJDX1RFWFRfRk9STUFUX09VVEVSX05BTUVTUEFDRQorfSAvLyBlbmQgb3V0ZXIgbmFtZXNwYWNlCisjZW5kaWYKKworI2VuZGlmIC8vIFRXT0JMVUVDVUJFU19URVhUX0ZPUk1BVF9IX0FMUkVBRFlfSU5DTFVERUQKKyN1bmRlZiBDTElDSEVfVEJDX1RFWFRfRk9STUFUX09VVEVSX05BTUVTUEFDRQorCituYW1lc3BhY2UgQ2F0Y2ggeworICAgIHVzaW5nIFRiYzo6VGV4dDsKKyAgICB1c2luZyBUYmM6OlRleHRBdHRyaWJ1dGVzOworfQorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfY29uc29sZV9jb2xvdXIuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9DT05TT0xFX0NPTE9VUl9IUFBfSU5DTFVERUQKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIHN0cnVjdCBDb2xvdXIgeworICAgICAgICBlbnVtIENvZGUgeworICAgICAgICAgICAgTm9uZSA9IDAsCisKKyAgICAgICAgICAgIFdoaXRlLAorICAgICAgICAgICAgUmVkLAorICAgICAgICAgICAgR3JlZW4sCisgICAgICAgICAgICBCbHVlLAorICAgICAgICAgICAgQ3lhbiwKKyAgICAgICAgICAgIFllbGxvdywKKyAgICAgICAgICAgIEdyZXksCisKKyAgICAgICAgICAgIEJyaWdodCA9IDB4MTAsCisKKyAgICAgICAgICAgIEJyaWdodFJlZCA9IEJyaWdodCB8IFJlZCwKKyAgICAgICAgICAgIEJyaWdodEdyZWVuID0gQnJpZ2h0IHwgR3JlZW4sCisgICAgICAgICAgICBMaWdodEdyZXkgPSBCcmlnaHQgfCBHcmV5LAorICAgICAgICAgICAgQnJpZ2h0V2hpdGUgPSBCcmlnaHQgfCBXaGl0ZSwKKworICAgICAgICAgICAgLy8gQnkgaW50ZW50aW9uCisgICAgICAgICAgICBGaWxlTmFtZSA9IExpZ2h0R3JleSwKKyAgICAgICAgICAgIFdhcm5pbmcgPSBZZWxsb3csCisgICAgICAgICAgICBSZXN1bHRFcnJvciA9IEJyaWdodFJlZCwKKyAgICAgICAgICAgIFJlc3VsdFN1Y2Nlc3MgPSBCcmlnaHRHcmVlbiwKKyAgICAgICAgICAgIFJlc3VsdEV4cGVjdGVkRmFpbHVyZSA9IFdhcm5pbmcsCisKKyAgICAgICAgICAgIEVycm9yID0gQnJpZ2h0UmVkLAorICAgICAgICAgICAgU3VjY2VzcyA9IEdyZWVuLAorCisgICAgICAgICAgICBPcmlnaW5hbEV4cHJlc3Npb24gPSBDeWFuLAorICAgICAgICAgICAgUmVjb25zdHJ1Y3RlZEV4cHJlc3Npb24gPSBZZWxsb3csCisKKyAgICAgICAgICAgIFNlY29uZGFyeVRleHQgPSBMaWdodEdyZXksCisgICAgICAgICAgICBIZWFkZXJzID0gV2hpdGUKKyAgICAgICAgfTsKKworICAgICAgICAvLyBVc2UgY29uc3RydWN0ZWQgb2JqZWN0IGZvciBSQUlJIGd1YXJkCisgICAgICAgIENvbG91ciggQ29kZSBfY29sb3VyQ29kZSApOworICAgICAgICBDb2xvdXIoIENvbG91ciBjb25zdCYgb3RoZXIgKTsKKyAgICAgICAgfkNvbG91cigpOworCisgICAgICAgIC8vIFVzZSBzdGF0aWMgbWV0aG9kIGZvciBvbmUtc2hvdCBjaGFuZ2VzCisgICAgICAgIHN0YXRpYyB2b2lkIHVzZSggQ29kZSBfY29sb3VyQ29kZSApOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgYm9vbCBtX21vdmVkOworICAgIH07CisKKyAgICBpbmxpbmUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvciA8PCAoIHN0ZDo6b3N0cmVhbSYgb3MsIENvbG91ciBjb25zdCYgKSB7IHJldHVybiBvczsgfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX2ludGVyZmFjZXNfcmVwb3J0ZXIuaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfSU5URVJGQUNFU19SRVBPUlRFUl9IX0lOQ0xVREVECisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8b3N0cmVhbT4KKyNpbmNsdWRlIDxtYXA+CisKK25hbWVzcGFjZSBDYXRjaAoreworICAgIHN0cnVjdCBSZXBvcnRlckNvbmZpZyB7CisgICAgICAgIGV4cGxpY2l0IFJlcG9ydGVyQ29uZmlnKCBQdHI8SUNvbmZpZyBjb25zdD4gY29uc3QmIF9mdWxsQ29uZmlnICkKKyAgICAgICAgOiAgIG1fc3RyZWFtKCAmX2Z1bGxDb25maWctPnN0cmVhbSgpICksIG1fZnVsbENvbmZpZyggX2Z1bGxDb25maWcgKSB7fQorCisgICAgICAgIFJlcG9ydGVyQ29uZmlnKCBQdHI8SUNvbmZpZyBjb25zdD4gY29uc3QmIF9mdWxsQ29uZmlnLCBzdGQ6Om9zdHJlYW0mIF9zdHJlYW0gKQorICAgICAgICA6ICAgbV9zdHJlYW0oICZfc3RyZWFtICksIG1fZnVsbENvbmZpZyggX2Z1bGxDb25maWcgKSB7fQorCisgICAgICAgIHN0ZDo6b3N0cmVhbSYgc3RyZWFtKCkgY29uc3QgICAgeyByZXR1cm4gKm1fc3RyZWFtOyB9CisgICAgICAgIFB0cjxJQ29uZmlnIGNvbnN0PiBmdWxsQ29uZmlnKCkgY29uc3QgeyByZXR1cm4gbV9mdWxsQ29uZmlnOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6Om9zdHJlYW0qIG1fc3RyZWFtOworICAgICAgICBQdHI8SUNvbmZpZyBjb25zdD4gbV9mdWxsQ29uZmlnOworICAgIH07CisKKyAgICBzdHJ1Y3QgUmVwb3J0ZXJQcmVmZXJlbmNlcyB7CisgICAgICAgIFJlcG9ydGVyUHJlZmVyZW5jZXMoKQorICAgICAgICA6IHNob3VsZFJlZGlyZWN0U3RkT3V0KCBmYWxzZSApCisgICAgICAgIHt9CisKKyAgICAgICAgYm9vbCBzaG91bGRSZWRpcmVjdFN0ZE91dDsKKyAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBzdHJ1Y3QgTGF6eVN0YXQgOiBPcHRpb248VD4geworICAgICAgICBMYXp5U3RhdCgpIDogdXNlZCggZmFsc2UgKSB7fQorICAgICAgICBMYXp5U3RhdCYgb3BlcmF0b3I9KCBUIGNvbnN0JiBfdmFsdWUgKSB7CisgICAgICAgICAgICBPcHRpb248VD46Om9wZXJhdG9yPSggX3ZhbHVlICk7CisgICAgICAgICAgICB1c2VkID0gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCByZXNldCgpIHsKKyAgICAgICAgICAgIE9wdGlvbjxUPjo6cmVzZXQoKTsKKyAgICAgICAgICAgIHVzZWQgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBib29sIHVzZWQ7CisgICAgfTsKKworICAgIHN0cnVjdCBUZXN0UnVuSW5mbyB7CisgICAgICAgIFRlc3RSdW5JbmZvKCBzdGQ6OnN0cmluZyBjb25zdCYgX25hbWUgKSA6IG5hbWUoIF9uYW1lICkge30KKyAgICAgICAgc3RkOjpzdHJpbmcgbmFtZTsKKyAgICB9OworICAgIHN0cnVjdCBHcm91cEluZm8geworICAgICAgICBHcm91cEluZm8oICBzdGQ6OnN0cmluZyBjb25zdCYgX25hbWUsCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2l6ZV90IF9ncm91cEluZGV4LAorICAgICAgICAgICAgICAgICAgICBzdGQ6OnNpemVfdCBfZ3JvdXBzQ291bnQgKQorICAgICAgICA6ICAgbmFtZSggX25hbWUgKSwKKyAgICAgICAgICAgIGdyb3VwSW5kZXgoIF9ncm91cEluZGV4ICksCisgICAgICAgICAgICBncm91cHNDb3VudHMoIF9ncm91cHNDb3VudCApCisgICAgICAgIHt9CisKKyAgICAgICAgc3RkOjpzdHJpbmcgbmFtZTsKKyAgICAgICAgc3RkOjpzaXplX3QgZ3JvdXBJbmRleDsKKyAgICAgICAgc3RkOjpzaXplX3QgZ3JvdXBzQ291bnRzOworICAgIH07CisKKyAgICBzdHJ1Y3QgQXNzZXJ0aW9uU3RhdHMgeworICAgICAgICBBc3NlcnRpb25TdGF0cyggQXNzZXJ0aW9uUmVzdWx0IGNvbnN0JiBfYXNzZXJ0aW9uUmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8TWVzc2FnZUluZm8+IGNvbnN0JiBfaW5mb01lc3NhZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgVG90YWxzIGNvbnN0JiBfdG90YWxzICkKKyAgICAgICAgOiAgIGFzc2VydGlvblJlc3VsdCggX2Fzc2VydGlvblJlc3VsdCApLAorICAgICAgICAgICAgaW5mb01lc3NhZ2VzKCBfaW5mb01lc3NhZ2VzICksCisgICAgICAgICAgICB0b3RhbHMoIF90b3RhbHMgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggYXNzZXJ0aW9uUmVzdWx0Lmhhc01lc3NhZ2UoKSApIHsKKyAgICAgICAgICAgICAgICAvLyBDb3B5IG1lc3NhZ2UgaW50byBtZXNzYWdlcyBsaXN0LgorICAgICAgICAgICAgICAgIC8vICFUQkQgVGhpcyBzaG91bGQgaGF2ZSBiZWVuIGRvbmUgZWFybGllciwgc29tZXdoZXJlCisgICAgICAgICAgICAgICAgTWVzc2FnZUJ1aWxkZXIgYnVpbGRlciggYXNzZXJ0aW9uUmVzdWx0LmdldFRlc3RNYWNyb05hbWUoKSwgYXNzZXJ0aW9uUmVzdWx0LmdldFNvdXJjZUluZm8oKSwgYXNzZXJ0aW9uUmVzdWx0LmdldFJlc3VsdFR5cGUoKSApOworICAgICAgICAgICAgICAgIGJ1aWxkZXIgPDwgYXNzZXJ0aW9uUmVzdWx0LmdldE1lc3NhZ2UoKTsKKyAgICAgICAgICAgICAgICBidWlsZGVyLm1faW5mby5tZXNzYWdlID0gYnVpbGRlci5tX3N0cmVhbS5zdHIoKTsKKworICAgICAgICAgICAgICAgIGluZm9NZXNzYWdlcy5wdXNoX2JhY2soIGJ1aWxkZXIubV9pbmZvICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCB+QXNzZXJ0aW9uU3RhdHMoKTsKKworIyAgaWZkZWYgQ0FUQ0hfQ09ORklHX0NQUDExX0dFTkVSQVRFRF9NRVRIT0RTCisgICAgICAgIEFzc2VydGlvblN0YXRzKCBBc3NlcnRpb25TdGF0cyBjb25zdCYgKSAgICAgICAgICAgICAgPSBkZWZhdWx0OworICAgICAgICBBc3NlcnRpb25TdGF0cyggQXNzZXJ0aW9uU3RhdHMgJiYgKSAgICAgICAgICAgICAgICAgID0gZGVmYXVsdDsKKyAgICAgICAgQXNzZXJ0aW9uU3RhdHMmIG9wZXJhdG9yID0gKCBBc3NlcnRpb25TdGF0cyBjb25zdCYgKSA9IGRlZmF1bHQ7CisgICAgICAgIEFzc2VydGlvblN0YXRzJiBvcGVyYXRvciA9ICggQXNzZXJ0aW9uU3RhdHMgJiYgKSAgICAgPSBkZWZhdWx0OworIyAgZW5kaWYKKworICAgICAgICBBc3NlcnRpb25SZXN1bHQgYXNzZXJ0aW9uUmVzdWx0OworICAgICAgICBzdGQ6OnZlY3RvcjxNZXNzYWdlSW5mbz4gaW5mb01lc3NhZ2VzOworICAgICAgICBUb3RhbHMgdG90YWxzOworICAgIH07CisKKyAgICBzdHJ1Y3QgU2VjdGlvblN0YXRzIHsKKyAgICAgICAgU2VjdGlvblN0YXRzKCAgIFNlY3Rpb25JbmZvIGNvbnN0JiBfc2VjdGlvbkluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICBDb3VudHMgY29uc3QmIF9hc3NlcnRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIF9kdXJhdGlvbkluU2Vjb25kcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgX21pc3NpbmdBc3NlcnRpb25zICkKKyAgICAgICAgOiAgIHNlY3Rpb25JbmZvKCBfc2VjdGlvbkluZm8gKSwKKyAgICAgICAgICAgIGFzc2VydGlvbnMoIF9hc3NlcnRpb25zICksCisgICAgICAgICAgICBkdXJhdGlvbkluU2Vjb25kcyggX2R1cmF0aW9uSW5TZWNvbmRzICksCisgICAgICAgICAgICBtaXNzaW5nQXNzZXJ0aW9ucyggX21pc3NpbmdBc3NlcnRpb25zICkKKyAgICAgICAge30KKyAgICAgICAgdmlydHVhbCB+U2VjdGlvblN0YXRzKCk7CisjICBpZmRlZiBDQVRDSF9DT05GSUdfQ1BQMTFfR0VORVJBVEVEX01FVEhPRFMKKyAgICAgICAgU2VjdGlvblN0YXRzKCBTZWN0aW9uU3RhdHMgY29uc3QmICkgICAgICAgICAgICAgID0gZGVmYXVsdDsKKyAgICAgICAgU2VjdGlvblN0YXRzKCBTZWN0aW9uU3RhdHMgJiYgKSAgICAgICAgICAgICAgICAgID0gZGVmYXVsdDsKKyAgICAgICAgU2VjdGlvblN0YXRzJiBvcGVyYXRvciA9ICggU2VjdGlvblN0YXRzIGNvbnN0JiApID0gZGVmYXVsdDsKKyAgICAgICAgU2VjdGlvblN0YXRzJiBvcGVyYXRvciA9ICggU2VjdGlvblN0YXRzICYmICkgICAgID0gZGVmYXVsdDsKKyMgIGVuZGlmCisKKyAgICAgICAgU2VjdGlvbkluZm8gc2VjdGlvbkluZm87CisgICAgICAgIENvdW50cyBhc3NlcnRpb25zOworICAgICAgICBkb3VibGUgZHVyYXRpb25JblNlY29uZHM7CisgICAgICAgIGJvb2wgbWlzc2luZ0Fzc2VydGlvbnM7CisgICAgfTsKKworICAgIHN0cnVjdCBUZXN0Q2FzZVN0YXRzIHsKKyAgICAgICAgVGVzdENhc2VTdGF0cyggIFRlc3RDYXNlSW5mbyBjb25zdCYgX3Rlc3RJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgVG90YWxzIGNvbnN0JiBfdG90YWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIF9zdGRPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgX3N0ZEVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgX2Fib3J0aW5nICkKKyAgICAgICAgOiB0ZXN0SW5mbyggX3Rlc3RJbmZvICksCisgICAgICAgICAgICB0b3RhbHMoIF90b3RhbHMgKSwKKyAgICAgICAgICAgIHN0ZE91dCggX3N0ZE91dCApLAorICAgICAgICAgICAgc3RkRXJyKCBfc3RkRXJyICksCisgICAgICAgICAgICBhYm9ydGluZyggX2Fib3J0aW5nICkKKyAgICAgICAge30KKyAgICAgICAgdmlydHVhbCB+VGVzdENhc2VTdGF0cygpOworCisjICBpZmRlZiBDQVRDSF9DT05GSUdfQ1BQMTFfR0VORVJBVEVEX01FVEhPRFMKKyAgICAgICAgVGVzdENhc2VTdGF0cyggVGVzdENhc2VTdGF0cyBjb25zdCYgKSAgICAgICAgICAgICAgPSBkZWZhdWx0OworICAgICAgICBUZXN0Q2FzZVN0YXRzKCBUZXN0Q2FzZVN0YXRzICYmICkgICAgICAgICAgICAgICAgICA9IGRlZmF1bHQ7CisgICAgICAgIFRlc3RDYXNlU3RhdHMmIG9wZXJhdG9yID0gKCBUZXN0Q2FzZVN0YXRzIGNvbnN0JiApID0gZGVmYXVsdDsKKyAgICAgICAgVGVzdENhc2VTdGF0cyYgb3BlcmF0b3IgPSAoIFRlc3RDYXNlU3RhdHMgJiYgKSAgICAgPSBkZWZhdWx0OworIyAgZW5kaWYKKworICAgICAgICBUZXN0Q2FzZUluZm8gdGVzdEluZm87CisgICAgICAgIFRvdGFscyB0b3RhbHM7CisgICAgICAgIHN0ZDo6c3RyaW5nIHN0ZE91dDsKKyAgICAgICAgc3RkOjpzdHJpbmcgc3RkRXJyOworICAgICAgICBib29sIGFib3J0aW5nOworICAgIH07CisKKyAgICBzdHJ1Y3QgVGVzdEdyb3VwU3RhdHMgeworICAgICAgICBUZXN0R3JvdXBTdGF0cyggR3JvdXBJbmZvIGNvbnN0JiBfZ3JvdXBJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgVG90YWxzIGNvbnN0JiBfdG90YWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBfYWJvcnRpbmcgKQorICAgICAgICA6ICAgZ3JvdXBJbmZvKCBfZ3JvdXBJbmZvICksCisgICAgICAgICAgICB0b3RhbHMoIF90b3RhbHMgKSwKKyAgICAgICAgICAgIGFib3J0aW5nKCBfYWJvcnRpbmcgKQorICAgICAgICB7fQorICAgICAgICBUZXN0R3JvdXBTdGF0cyggR3JvdXBJbmZvIGNvbnN0JiBfZ3JvdXBJbmZvICkKKyAgICAgICAgOiAgIGdyb3VwSW5mbyggX2dyb3VwSW5mbyApLAorICAgICAgICAgICAgYWJvcnRpbmcoIGZhbHNlICkKKyAgICAgICAge30KKyAgICAgICAgdmlydHVhbCB+VGVzdEdyb3VwU3RhdHMoKTsKKworIyAgaWZkZWYgQ0FUQ0hfQ09ORklHX0NQUDExX0dFTkVSQVRFRF9NRVRIT0RTCisgICAgICAgIFRlc3RHcm91cFN0YXRzKCBUZXN0R3JvdXBTdGF0cyBjb25zdCYgKSAgICAgICAgICAgICAgPSBkZWZhdWx0OworICAgICAgICBUZXN0R3JvdXBTdGF0cyggVGVzdEdyb3VwU3RhdHMgJiYgKSAgICAgICAgICAgICAgICAgID0gZGVmYXVsdDsKKyAgICAgICAgVGVzdEdyb3VwU3RhdHMmIG9wZXJhdG9yID0gKCBUZXN0R3JvdXBTdGF0cyBjb25zdCYgKSA9IGRlZmF1bHQ7CisgICAgICAgIFRlc3RHcm91cFN0YXRzJiBvcGVyYXRvciA9ICggVGVzdEdyb3VwU3RhdHMgJiYgKSAgICAgPSBkZWZhdWx0OworIyAgZW5kaWYKKworICAgICAgICBHcm91cEluZm8gZ3JvdXBJbmZvOworICAgICAgICBUb3RhbHMgdG90YWxzOworICAgICAgICBib29sIGFib3J0aW5nOworICAgIH07CisKKyAgICBzdHJ1Y3QgVGVzdFJ1blN0YXRzIHsKKyAgICAgICAgVGVzdFJ1blN0YXRzKCAgIFRlc3RSdW5JbmZvIGNvbnN0JiBfcnVuSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgIFRvdGFscyBjb25zdCYgX3RvdGFscywKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgX2Fib3J0aW5nICkKKyAgICAgICAgOiAgIHJ1bkluZm8oIF9ydW5JbmZvICksCisgICAgICAgICAgICB0b3RhbHMoIF90b3RhbHMgKSwKKyAgICAgICAgICAgIGFib3J0aW5nKCBfYWJvcnRpbmcgKQorICAgICAgICB7fQorICAgICAgICB2aXJ0dWFsIH5UZXN0UnVuU3RhdHMoKTsKKworIyAgaWZuZGVmIENBVENIX0NPTkZJR19DUFAxMV9HRU5FUkFURURfTUVUSE9EUworICAgICAgICBUZXN0UnVuU3RhdHMoIFRlc3RSdW5TdGF0cyBjb25zdCYgX290aGVyICkKKyAgICAgICAgOiAgIHJ1bkluZm8oIF9vdGhlci5ydW5JbmZvICksCisgICAgICAgICAgICB0b3RhbHMoIF9vdGhlci50b3RhbHMgKSwKKyAgICAgICAgICAgIGFib3J0aW5nKCBfb3RoZXIuYWJvcnRpbmcgKQorICAgICAgICB7fQorIyAgZWxzZQorICAgICAgICBUZXN0UnVuU3RhdHMoIFRlc3RSdW5TdGF0cyBjb25zdCYgKSAgICAgICAgICAgICAgPSBkZWZhdWx0OworICAgICAgICBUZXN0UnVuU3RhdHMoIFRlc3RSdW5TdGF0cyAmJiApICAgICAgICAgICAgICAgICAgPSBkZWZhdWx0OworICAgICAgICBUZXN0UnVuU3RhdHMmIG9wZXJhdG9yID0gKCBUZXN0UnVuU3RhdHMgY29uc3QmICkgPSBkZWZhdWx0OworICAgICAgICBUZXN0UnVuU3RhdHMmIG9wZXJhdG9yID0gKCBUZXN0UnVuU3RhdHMgJiYgKSAgICAgPSBkZWZhdWx0OworIyAgZW5kaWYKKworICAgICAgICBUZXN0UnVuSW5mbyBydW5JbmZvOworICAgICAgICBUb3RhbHMgdG90YWxzOworICAgICAgICBib29sIGFib3J0aW5nOworICAgIH07CisKKyAgICBjbGFzcyBNdWx0aXBsZVJlcG9ydGVyczsKKworICAgIHN0cnVjdCBJU3RyZWFtaW5nUmVwb3J0ZXIgOiBJU2hhcmVkIHsKKyAgICAgICAgdmlydHVhbCB+SVN0cmVhbWluZ1JlcG9ydGVyKCk7CisKKyAgICAgICAgLy8gSW1wbGVtZW50aW5nIGNsYXNzIG11c3QgYWxzbyBwcm92aWRlIHRoZSBmb2xsb3dpbmcgc3RhdGljIG1ldGhvZDoKKyAgICAgICAgLy8gc3RhdGljIHN0ZDo6c3RyaW5nIGdldERlc2NyaXB0aW9uKCk7CisKKyAgICAgICAgdmlydHVhbCBSZXBvcnRlclByZWZlcmVuY2VzIGdldFByZWZlcmVuY2VzKCkgY29uc3QgPSAwOworCisgICAgICAgIHZpcnR1YWwgdm9pZCBub01hdGNoaW5nVGVzdENhc2VzKCBzdGQ6OnN0cmluZyBjb25zdCYgc3BlYyApID0gMDsKKworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdFJ1blN0YXJ0aW5nKCBUZXN0UnVuSW5mbyBjb25zdCYgdGVzdFJ1bkluZm8gKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0R3JvdXBTdGFydGluZyggR3JvdXBJbmZvIGNvbnN0JiBncm91cEluZm8gKSA9IDA7CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RDYXNlU3RhcnRpbmcoIFRlc3RDYXNlSW5mbyBjb25zdCYgdGVzdEluZm8gKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBzZWN0aW9uU3RhcnRpbmcoIFNlY3Rpb25JbmZvIGNvbnN0JiBzZWN0aW9uSW5mbyApID0gMDsKKworICAgICAgICB2aXJ0dWFsIHZvaWQgYXNzZXJ0aW9uU3RhcnRpbmcoIEFzc2VydGlvbkluZm8gY29uc3QmIGFzc2VydGlvbkluZm8gKSA9IDA7CisKKyAgICAgICAgLy8gVGhlIHJldHVybiB2YWx1ZSBpbmRpY2F0ZXMgaWYgdGhlIG1lc3NhZ2VzIGJ1ZmZlciBzaG91bGQgYmUgY2xlYXJlZDoKKyAgICAgICAgdmlydHVhbCBib29sIGFzc2VydGlvbkVuZGVkKCBBc3NlcnRpb25TdGF0cyBjb25zdCYgYXNzZXJ0aW9uU3RhdHMgKSA9IDA7CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHNlY3Rpb25FbmRlZCggU2VjdGlvblN0YXRzIGNvbnN0JiBzZWN0aW9uU3RhdHMgKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0Q2FzZUVuZGVkKCBUZXN0Q2FzZVN0YXRzIGNvbnN0JiB0ZXN0Q2FzZVN0YXRzICkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdEdyb3VwRW5kZWQoIFRlc3RHcm91cFN0YXRzIGNvbnN0JiB0ZXN0R3JvdXBTdGF0cyApID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RSdW5FbmRlZCggVGVzdFJ1blN0YXRzIGNvbnN0JiB0ZXN0UnVuU3RhdHMgKSA9IDA7CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHNraXBUZXN0KCBUZXN0Q2FzZUluZm8gY29uc3QmIHRlc3RJbmZvICkgPSAwOworCisgICAgICAgIHZpcnR1YWwgTXVsdGlwbGVSZXBvcnRlcnMqIHRyeUFzTXVsdGkoKSB7IHJldHVybiBDQVRDSF9OVUxMOyB9CisgICAgfTsKKworICAgIHN0cnVjdCBJUmVwb3J0ZXJGYWN0b3J5IDogSVNoYXJlZCB7CisgICAgICAgIHZpcnR1YWwgfklSZXBvcnRlckZhY3RvcnkoKTsKKyAgICAgICAgdmlydHVhbCBJU3RyZWFtaW5nUmVwb3J0ZXIqIGNyZWF0ZSggUmVwb3J0ZXJDb25maWcgY29uc3QmIGNvbmZpZyApIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXREZXNjcmlwdGlvbigpIGNvbnN0ID0gMDsKKyAgICB9OworCisgICAgc3RydWN0IElSZXBvcnRlclJlZ2lzdHJ5IHsKKyAgICAgICAgdHlwZWRlZiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgUHRyPElSZXBvcnRlckZhY3Rvcnk+ID4gRmFjdG9yeU1hcDsKKyAgICAgICAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxQdHI8SVJlcG9ydGVyRmFjdG9yeT4gPiBMaXN0ZW5lcnM7CisKKyAgICAgICAgdmlydHVhbCB+SVJlcG9ydGVyUmVnaXN0cnkoKTsKKyAgICAgICAgdmlydHVhbCBJU3RyZWFtaW5nUmVwb3J0ZXIqIGNyZWF0ZSggc3RkOjpzdHJpbmcgY29uc3QmIG5hbWUsIFB0cjxJQ29uZmlnIGNvbnN0PiBjb25zdCYgY29uZmlnICkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIEZhY3RvcnlNYXAgY29uc3QmIGdldEZhY3RvcmllcygpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBMaXN0ZW5lcnMgY29uc3QmIGdldExpc3RlbmVycygpIGNvbnN0ID0gMDsKKyAgICB9OworCisgICAgUHRyPElTdHJlYW1pbmdSZXBvcnRlcj4gYWRkUmVwb3J0ZXIoIFB0cjxJU3RyZWFtaW5nUmVwb3J0ZXI+IGNvbnN0JiBleGlzdGluZ1JlcG9ydGVyLCBQdHI8SVN0cmVhbWluZ1JlcG9ydGVyPiBjb25zdCYgYWRkaXRpb25hbFJlcG9ydGVyICk7CisKK30KKworI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBpbmxpbmUgc3RkOjpzaXplX3QgbGlzdFRlc3RzKCBDb25maWcgY29uc3QmIGNvbmZpZyApIHsKKworICAgICAgICBUZXN0U3BlYyB0ZXN0U3BlYyA9IGNvbmZpZy50ZXN0U3BlYygpOworICAgICAgICBpZiggY29uZmlnLnRlc3RTcGVjKCkuaGFzRmlsdGVycygpICkKKyAgICAgICAgICAgIENhdGNoOjpjb3V0KCkgPDwgIk1hdGNoaW5nIHRlc3QgY2FzZXM6XG4iOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIENhdGNoOjpjb3V0KCkgPDwgIkFsbCBhdmFpbGFibGUgdGVzdCBjYXNlczpcbiI7CisgICAgICAgICAgICB0ZXN0U3BlYyA9IFRlc3RTcGVjUGFyc2VyKCBJVGFnQWxpYXNSZWdpc3RyeTo6Z2V0KCkgKS5wYXJzZSggIioiICkudGVzdFNwZWMoKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0ZDo6c2l6ZV90IG1hdGNoZWRUZXN0cyA9IDA7CisgICAgICAgIFRleHRBdHRyaWJ1dGVzIG5hbWVBdHRyLCB0YWdzQXR0cjsKKyAgICAgICAgbmFtZUF0dHIuc2V0SW5pdGlhbEluZGVudCggMiApLnNldEluZGVudCggNCApOworICAgICAgICB0YWdzQXR0ci5zZXRJbmRlbnQoIDYgKTsKKworICAgICAgICBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gbWF0Y2hlZFRlc3RDYXNlcyA9IGZpbHRlclRlc3RzKCBnZXRBbGxUZXN0Q2FzZXNTb3J0ZWQoIGNvbmZpZyApLCB0ZXN0U3BlYywgY29uZmlnICk7CisgICAgICAgIGZvciggc3RkOjp2ZWN0b3I8VGVzdENhc2U+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1hdGNoZWRUZXN0Q2FzZXMuYmVnaW4oKSwgaXRFbmQgPSBtYXRjaGVkVGVzdENhc2VzLmVuZCgpOworICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICsraXQgKSB7CisgICAgICAgICAgICBtYXRjaGVkVGVzdHMrKzsKKyAgICAgICAgICAgIFRlc3RDYXNlSW5mbyBjb25zdCYgdGVzdENhc2VJbmZvID0gaXQtPmdldFRlc3RDYXNlSW5mbygpOworICAgICAgICAgICAgQ29sb3VyOjpDb2RlIGNvbG91ciA9IHRlc3RDYXNlSW5mby5pc0hpZGRlbigpCisgICAgICAgICAgICAgICAgPyBDb2xvdXI6OlNlY29uZGFyeVRleHQKKyAgICAgICAgICAgICAgICA6IENvbG91cjo6Tm9uZTsKKyAgICAgICAgICAgIENvbG91ciBjb2xvdXJHdWFyZCggY29sb3VyICk7CisKKyAgICAgICAgICAgIENhdGNoOjpjb3V0KCkgPDwgVGV4dCggdGVzdENhc2VJbmZvLm5hbWUsIG5hbWVBdHRyICkgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgaWYoICF0ZXN0Q2FzZUluZm8udGFncy5lbXB0eSgpICkKKyAgICAgICAgICAgICAgICBDYXRjaDo6Y291dCgpIDw8IFRleHQoIHRlc3RDYXNlSW5mby50YWdzQXNTdHJpbmcsIHRhZ3NBdHRyICkgPDwgc3RkOjplbmRsOworICAgICAgICB9CisKKyAgICAgICAgaWYoICFjb25maWcudGVzdFNwZWMoKS5oYXNGaWx0ZXJzKCkgKQorICAgICAgICAgICAgQ2F0Y2g6OmNvdXQoKSA8PCBwbHVyYWxpc2UoIG1hdGNoZWRUZXN0cywgInRlc3QgY2FzZSIgKSA8PCAnXG4nIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgQ2F0Y2g6OmNvdXQoKSA8PCBwbHVyYWxpc2UoIG1hdGNoZWRUZXN0cywgIm1hdGNoaW5nIHRlc3QgY2FzZSIgKSA8PCAnXG4nIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgcmV0dXJuIG1hdGNoZWRUZXN0czsKKyAgICB9CisKKyAgICBpbmxpbmUgc3RkOjpzaXplX3QgbGlzdFRlc3RzTmFtZXNPbmx5KCBDb25maWcgY29uc3QmIGNvbmZpZyApIHsKKyAgICAgICAgVGVzdFNwZWMgdGVzdFNwZWMgPSBjb25maWcudGVzdFNwZWMoKTsKKyAgICAgICAgaWYoICFjb25maWcudGVzdFNwZWMoKS5oYXNGaWx0ZXJzKCkgKQorICAgICAgICAgICAgdGVzdFNwZWMgPSBUZXN0U3BlY1BhcnNlciggSVRhZ0FsaWFzUmVnaXN0cnk6OmdldCgpICkucGFyc2UoICIqIiApLnRlc3RTcGVjKCk7CisgICAgICAgIHN0ZDo6c2l6ZV90IG1hdGNoZWRUZXN0cyA9IDA7CisgICAgICAgIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPiBtYXRjaGVkVGVzdENhc2VzID0gZmlsdGVyVGVzdHMoIGdldEFsbFRlc3RDYXNlc1NvcnRlZCggY29uZmlnICksIHRlc3RTcGVjLCBjb25maWcgKTsKKyAgICAgICAgZm9yKCBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbWF0Y2hlZFRlc3RDYXNlcy5iZWdpbigpLCBpdEVuZCA9IG1hdGNoZWRUZXN0Q2FzZXMuZW5kKCk7CisgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgKytpdCApIHsKKyAgICAgICAgICAgIG1hdGNoZWRUZXN0cysrOworICAgICAgICAgICAgVGVzdENhc2VJbmZvIGNvbnN0JiB0ZXN0Q2FzZUluZm8gPSBpdC0+Z2V0VGVzdENhc2VJbmZvKCk7CisgICAgICAgICAgICBpZiggc3RhcnRzV2l0aCggdGVzdENhc2VJbmZvLm5hbWUsICcjJyApICkKKyAgICAgICAgICAgICAgIENhdGNoOjpjb3V0KCkgPDwgJyInIDw8IHRlc3RDYXNlSW5mby5uYW1lIDw8ICciJyA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICBDYXRjaDo6Y291dCgpIDw8IHRlc3RDYXNlSW5mby5uYW1lIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbWF0Y2hlZFRlc3RzOworICAgIH0KKworICAgIHN0cnVjdCBUYWdJbmZvIHsKKyAgICAgICAgVGFnSW5mbygpIDogY291bnQgKCAwICkge30KKyAgICAgICAgdm9pZCBhZGQoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzcGVsbGluZyApIHsKKyAgICAgICAgICAgICsrY291bnQ7CisgICAgICAgICAgICBzcGVsbGluZ3MuaW5zZXJ0KCBzcGVsbGluZyApOworICAgICAgICB9CisgICAgICAgIHN0ZDo6c3RyaW5nIGFsbCgpIGNvbnN0IHsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG91dDsKKyAgICAgICAgICAgIGZvciggc3RkOjpzZXQ8c3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdCA9IHNwZWxsaW5ncy5iZWdpbigpLCBpdEVuZCA9IHNwZWxsaW5ncy5lbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICAgICAgICAgKytpdCApCisgICAgICAgICAgICAgICAgb3V0ICs9ICJbIiArICppdCArICJdIjsKKyAgICAgICAgICAgIHJldHVybiBvdXQ7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IHNwZWxsaW5nczsKKyAgICAgICAgc3RkOjpzaXplX3QgY291bnQ7CisgICAgfTsKKworICAgIGlubGluZSBzdGQ6OnNpemVfdCBsaXN0VGFncyggQ29uZmlnIGNvbnN0JiBjb25maWcgKSB7CisgICAgICAgIFRlc3RTcGVjIHRlc3RTcGVjID0gY29uZmlnLnRlc3RTcGVjKCk7CisgICAgICAgIGlmKCBjb25maWcudGVzdFNwZWMoKS5oYXNGaWx0ZXJzKCkgKQorICAgICAgICAgICAgQ2F0Y2g6OmNvdXQoKSA8PCAiVGFncyBmb3IgbWF0Y2hpbmcgdGVzdCBjYXNlczpcbiI7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgQ2F0Y2g6OmNvdXQoKSA8PCAiQWxsIGF2YWlsYWJsZSB0YWdzOlxuIjsKKyAgICAgICAgICAgIHRlc3RTcGVjID0gVGVzdFNwZWNQYXJzZXIoIElUYWdBbGlhc1JlZ2lzdHJ5OjpnZXQoKSApLnBhcnNlKCAiKiIgKS50ZXN0U3BlYygpOworICAgICAgICB9CisKKyAgICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIFRhZ0luZm8+IHRhZ0NvdW50czsKKworICAgICAgICBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gbWF0Y2hlZFRlc3RDYXNlcyA9IGZpbHRlclRlc3RzKCBnZXRBbGxUZXN0Q2FzZXNTb3J0ZWQoIGNvbmZpZyApLCB0ZXN0U3BlYywgY29uZmlnICk7CisgICAgICAgIGZvciggc3RkOjp2ZWN0b3I8VGVzdENhc2U+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1hdGNoZWRUZXN0Q2FzZXMuYmVnaW4oKSwgaXRFbmQgPSBtYXRjaGVkVGVzdENhc2VzLmVuZCgpOworICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICsraXQgKSB7CisgICAgICAgICAgICBmb3IoIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgIHRhZ0l0ID0gaXQtPmdldFRlc3RDYXNlSW5mbygpLnRhZ3MuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnSXRFbmQgPSBpdC0+Z2V0VGVzdENhc2VJbmZvKCkudGFncy5lbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgdGFnSXQgIT0gdGFnSXRFbmQ7CisgICAgICAgICAgICAgICAgICAgICsrdGFnSXQgKSB7CisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgdGFnTmFtZSA9ICp0YWdJdDsKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBsY2FzZVRhZ05hbWUgPSB0b0xvd2VyKCB0YWdOYW1lICk7CisgICAgICAgICAgICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIFRhZ0luZm8+OjppdGVyYXRvciBjb3VudEl0ID0gdGFnQ291bnRzLmZpbmQoIGxjYXNlVGFnTmFtZSApOworICAgICAgICAgICAgICAgIGlmKCBjb3VudEl0ID09IHRhZ0NvdW50cy5lbmQoKSApCisgICAgICAgICAgICAgICAgICAgIGNvdW50SXQgPSB0YWdDb3VudHMuaW5zZXJ0KCBzdGQ6Om1ha2VfcGFpciggbGNhc2VUYWdOYW1lLCBUYWdJbmZvKCkgKSApLmZpcnN0OworICAgICAgICAgICAgICAgIGNvdW50SXQtPnNlY29uZC5hZGQoIHRhZ05hbWUgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciggc3RkOjptYXA8c3RkOjpzdHJpbmcsIFRhZ0luZm8+Ojpjb25zdF9pdGVyYXRvciBjb3VudEl0ID0gdGFnQ291bnRzLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudEl0RW5kID0gdGFnQ291bnRzLmVuZCgpOworICAgICAgICAgICAgICAgIGNvdW50SXQgIT0gY291bnRJdEVuZDsKKyAgICAgICAgICAgICAgICArK2NvdW50SXQgKSB7CisgICAgICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICAgICAgICAgICAgb3NzIDw8ICIgICIgPDwgc3RkOjpzZXR3KDIpIDw8IGNvdW50SXQtPnNlY29uZC5jb3VudCA8PCAiICAiOworICAgICAgICAgICAgVGV4dCB3cmFwcGVyKCBjb3VudEl0LT5zZWNvbmQuYWxsKCksIFRleHRBdHRyaWJ1dGVzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0SW5pdGlhbEluZGVudCggMCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEluZGVudCggb3NzLnN0cigpLnNpemUoKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFdpZHRoKCBDQVRDSF9DT05GSUdfQ09OU09MRV9XSURUSC0xMCApICk7CisgICAgICAgICAgICBDYXRjaDo6Y291dCgpIDw8IG9zcy5zdHIoKSA8PCB3cmFwcGVyIDw8ICdcbic7CisgICAgICAgIH0KKyAgICAgICAgQ2F0Y2g6OmNvdXQoKSA8PCBwbHVyYWxpc2UoIHRhZ0NvdW50cy5zaXplKCksICJ0YWciICkgPDwgJ1xuJyA8PCBzdGQ6OmVuZGw7CisgICAgICAgIHJldHVybiB0YWdDb3VudHMuc2l6ZSgpOworICAgIH0KKworICAgIGlubGluZSBzdGQ6OnNpemVfdCBsaXN0UmVwb3J0ZXJzKCBDb25maWcgY29uc3QmIC8qY29uZmlnKi8gKSB7CisgICAgICAgIENhdGNoOjpjb3V0KCkgPDwgIkF2YWlsYWJsZSByZXBvcnRlcnM6XG4iOworICAgICAgICBJUmVwb3J0ZXJSZWdpc3RyeTo6RmFjdG9yeU1hcCBjb25zdCYgZmFjdG9yaWVzID0gZ2V0UmVnaXN0cnlIdWIoKS5nZXRSZXBvcnRlclJlZ2lzdHJ5KCkuZ2V0RmFjdG9yaWVzKCk7CisgICAgICAgIElSZXBvcnRlclJlZ2lzdHJ5OjpGYWN0b3J5TWFwOjpjb25zdF9pdGVyYXRvciBpdEJlZ2luID0gZmFjdG9yaWVzLmJlZ2luKCksIGl0RW5kID0gZmFjdG9yaWVzLmVuZCgpLCBpdDsKKyAgICAgICAgc3RkOjpzaXplX3QgbWF4TmFtZUxlbiA9IDA7CisgICAgICAgIGZvcihpdCA9IGl0QmVnaW47IGl0ICE9IGl0RW5kOyArK2l0ICkKKyAgICAgICAgICAgIG1heE5hbWVMZW4gPSAoc3RkOjptYXgpKCBtYXhOYW1lTGVuLCBpdC0+Zmlyc3Quc2l6ZSgpICk7CisKKyAgICAgICAgZm9yKGl0ID0gaXRCZWdpbjsgaXQgIT0gaXRFbmQ7ICsraXQgKSB7CisgICAgICAgICAgICBUZXh0IHdyYXBwZXIoIGl0LT5zZWNvbmQtPmdldERlc2NyaXB0aW9uKCksIFRleHRBdHRyaWJ1dGVzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEluaXRpYWxJbmRlbnQoIDAgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0SW5kZW50KCA3K21heE5hbWVMZW4gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0V2lkdGgoIENBVENIX0NPTkZJR19DT05TT0xFX1dJRFRIIC0gbWF4TmFtZUxlbi04ICkgKTsKKyAgICAgICAgICAgIENhdGNoOjpjb3V0KCkgPDwgIiAgIgorICAgICAgICAgICAgICAgICAgICA8PCBpdC0+Zmlyc3QKKyAgICAgICAgICAgICAgICAgICAgPDwgJzonCisgICAgICAgICAgICAgICAgICAgIDw8IHN0ZDo6c3RyaW5nKCBtYXhOYW1lTGVuIC0gaXQtPmZpcnN0LnNpemUoKSArIDIsICcgJyApCisgICAgICAgICAgICAgICAgICAgIDw8IHdyYXBwZXIgPDwgJ1xuJzsKKyAgICAgICAgfQorICAgICAgICBDYXRjaDo6Y291dCgpIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgcmV0dXJuIGZhY3Rvcmllcy5zaXplKCk7CisgICAgfQorCisgICAgaW5saW5lIE9wdGlvbjxzdGQ6OnNpemVfdD4gbGlzdCggQ29uZmlnIGNvbnN0JiBjb25maWcgKSB7CisgICAgICAgIE9wdGlvbjxzdGQ6OnNpemVfdD4gbGlzdGVkQ291bnQ7CisgICAgICAgIGlmKCBjb25maWcubGlzdFRlc3RzKCkgKQorICAgICAgICAgICAgbGlzdGVkQ291bnQgPSBsaXN0ZWRDb3VudC52YWx1ZU9yKDApICsgbGlzdFRlc3RzKCBjb25maWcgKTsKKyAgICAgICAgaWYoIGNvbmZpZy5saXN0VGVzdE5hbWVzT25seSgpICkKKyAgICAgICAgICAgIGxpc3RlZENvdW50ID0gbGlzdGVkQ291bnQudmFsdWVPcigwKSArIGxpc3RUZXN0c05hbWVzT25seSggY29uZmlnICk7CisgICAgICAgIGlmKCBjb25maWcubGlzdFRhZ3MoKSApCisgICAgICAgICAgICBsaXN0ZWRDb3VudCA9IGxpc3RlZENvdW50LnZhbHVlT3IoMCkgKyBsaXN0VGFncyggY29uZmlnICk7CisgICAgICAgIGlmKCBjb25maWcubGlzdFJlcG9ydGVycygpICkKKyAgICAgICAgICAgIGxpc3RlZENvdW50ID0gbGlzdGVkQ291bnQudmFsdWVPcigwKSArIGxpc3RSZXBvcnRlcnMoIGNvbmZpZyApOworICAgICAgICByZXR1cm4gbGlzdGVkQ291bnQ7CisgICAgfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IGludGVybmFsL2NhdGNoX3J1bl9jb250ZXh0LmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfUlVOTkVSX0lNUExfSFBQX0lOQ0xVREVECisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF90ZXN0X2Nhc2VfdHJhY2tlci5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1RFU1RfQ0FTRV9UUkFDS0VSX0hQUF9JTkNMVURFRAorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8c3RkZXhjZXB0PgorCitDQVRDSF9JTlRFUk5BTF9TVVBQUkVTU19FVERfV0FSTklOR1MKKworbmFtZXNwYWNlIENhdGNoIHsKK25hbWVzcGFjZSBUZXN0Q2FzZVRyYWNraW5nIHsKKworICAgIHN0cnVjdCBOYW1lQW5kTG9jYXRpb24geworICAgICAgICBzdGQ6OnN0cmluZyBuYW1lOworICAgICAgICBTb3VyY2VMaW5lSW5mbyBsb2NhdGlvbjsKKworICAgICAgICBOYW1lQW5kTG9jYXRpb24oIHN0ZDo6c3RyaW5nIGNvbnN0JiBfbmFtZSwgU291cmNlTGluZUluZm8gY29uc3QmIF9sb2NhdGlvbiApCisgICAgICAgIDogICBuYW1lKCBfbmFtZSApLAorICAgICAgICAgICAgbG9jYXRpb24oIF9sb2NhdGlvbiApCisgICAgICAgIHt9CisgICAgfTsKKworICAgIHN0cnVjdCBJVHJhY2tlciA6IFNoYXJlZEltcGw8PiB7CisgICAgICAgIHZpcnR1YWwgfklUcmFja2VyKCk7CisKKyAgICAgICAgLy8gc3RhdGljIHF1ZXJpZXMKKyAgICAgICAgdmlydHVhbCBOYW1lQW5kTG9jYXRpb24gY29uc3QmIG5hbWVBbmRMb2NhdGlvbigpIGNvbnN0ID0gMDsKKworICAgICAgICAvLyBkeW5hbWljIHF1ZXJpZXMKKyAgICAgICAgdmlydHVhbCBib29sIGlzQ29tcGxldGUoKSBjb25zdCA9IDA7IC8vIFN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQgb3IgZmFpbGVkCisgICAgICAgIHZpcnR1YWwgYm9vbCBpc1N1Y2Nlc3NmdWxseUNvbXBsZXRlZCgpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBib29sIGlzT3BlbigpIGNvbnN0ID0gMDsgLy8gU3RhcnRlZCBidXQgbm90IGNvbXBsZXRlCisgICAgICAgIHZpcnR1YWwgYm9vbCBoYXNDaGlsZHJlbigpIGNvbnN0ID0gMDsKKworICAgICAgICB2aXJ0dWFsIElUcmFja2VyJiBwYXJlbnQoKSA9IDA7CisKKyAgICAgICAgLy8gYWN0aW9ucworICAgICAgICB2aXJ0dWFsIHZvaWQgY2xvc2UoKSA9IDA7IC8vIFN1Y2Nlc3NmdWxseSBjb21wbGV0ZQorICAgICAgICB2aXJ0dWFsIHZvaWQgZmFpbCgpID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIG1hcmtBc05lZWRpbmdBbm90aGVyUnVuKCkgPSAwOworCisgICAgICAgIHZpcnR1YWwgdm9pZCBhZGRDaGlsZCggUHRyPElUcmFja2VyPiBjb25zdCYgY2hpbGQgKSA9IDA7CisgICAgICAgIHZpcnR1YWwgSVRyYWNrZXIqIGZpbmRDaGlsZCggTmFtZUFuZExvY2F0aW9uIGNvbnN0JiBuYW1lQW5kTG9jYXRpb24gKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBvcGVuQ2hpbGQoKSA9IDA7CisKKyAgICAgICAgLy8gRGVidWcvIGNoZWNraW5nCisgICAgICAgIHZpcnR1YWwgYm9vbCBpc1NlY3Rpb25UcmFja2VyKCkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIGJvb2wgaXNJbmRleFRyYWNrZXIoKSBjb25zdCA9IDA7CisgICAgfTsKKworICAgIGNsYXNzICBUcmFja2VyQ29udGV4dCB7CisKKyAgICAgICAgZW51bSBSdW5TdGF0ZSB7CisgICAgICAgICAgICBOb3RTdGFydGVkLAorICAgICAgICAgICAgRXhlY3V0aW5nLAorICAgICAgICAgICAgQ29tcGxldGVkQ3ljbGUKKyAgICAgICAgfTsKKworICAgICAgICBQdHI8SVRyYWNrZXI+IG1fcm9vdFRyYWNrZXI7CisgICAgICAgIElUcmFja2VyKiBtX2N1cnJlbnRUcmFja2VyOworICAgICAgICBSdW5TdGF0ZSBtX3J1blN0YXRlOworCisgICAgcHVibGljOgorCisgICAgICAgIHN0YXRpYyBUcmFja2VyQ29udGV4dCYgaW5zdGFuY2UoKSB7CisgICAgICAgICAgICBzdGF0aWMgVHJhY2tlckNvbnRleHQgc19pbnN0YW5jZTsKKyAgICAgICAgICAgIHJldHVybiBzX2luc3RhbmNlOworICAgICAgICB9CisKKyAgICAgICAgVHJhY2tlckNvbnRleHQoKQorICAgICAgICA6ICAgbV9jdXJyZW50VHJhY2tlciggQ0FUQ0hfTlVMTCApLAorICAgICAgICAgICAgbV9ydW5TdGF0ZSggTm90U3RhcnRlZCApCisgICAgICAgIHt9CisKKyAgICAgICAgSVRyYWNrZXImIHN0YXJ0UnVuKCk7CisKKyAgICAgICAgdm9pZCBlbmRSdW4oKSB7CisgICAgICAgICAgICBtX3Jvb3RUcmFja2VyLnJlc2V0KCk7CisgICAgICAgICAgICBtX2N1cnJlbnRUcmFja2VyID0gQ0FUQ0hfTlVMTDsKKyAgICAgICAgICAgIG1fcnVuU3RhdGUgPSBOb3RTdGFydGVkOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBzdGFydEN5Y2xlKCkgeworICAgICAgICAgICAgbV9jdXJyZW50VHJhY2tlciA9IG1fcm9vdFRyYWNrZXIuZ2V0KCk7CisgICAgICAgICAgICBtX3J1blN0YXRlID0gRXhlY3V0aW5nOworICAgICAgICB9CisgICAgICAgIHZvaWQgY29tcGxldGVDeWNsZSgpIHsKKyAgICAgICAgICAgIG1fcnVuU3RhdGUgPSBDb21wbGV0ZWRDeWNsZTsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgY29tcGxldGVkQ3ljbGUoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbV9ydW5TdGF0ZSA9PSBDb21wbGV0ZWRDeWNsZTsKKyAgICAgICAgfQorICAgICAgICBJVHJhY2tlciYgY3VycmVudFRyYWNrZXIoKSB7CisgICAgICAgICAgICByZXR1cm4gKm1fY3VycmVudFRyYWNrZXI7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCBzZXRDdXJyZW50VHJhY2tlciggSVRyYWNrZXIqIHRyYWNrZXIgKSB7CisgICAgICAgICAgICBtX2N1cnJlbnRUcmFja2VyID0gdHJhY2tlcjsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBjbGFzcyBUcmFja2VyQmFzZSA6IHB1YmxpYyBJVHJhY2tlciB7CisgICAgcHJvdGVjdGVkOgorICAgICAgICBlbnVtIEN5Y2xlU3RhdGUgeworICAgICAgICAgICAgTm90U3RhcnRlZCwKKyAgICAgICAgICAgIEV4ZWN1dGluZywKKyAgICAgICAgICAgIEV4ZWN1dGluZ0NoaWxkcmVuLAorICAgICAgICAgICAgTmVlZHNBbm90aGVyUnVuLAorICAgICAgICAgICAgQ29tcGxldGVkU3VjY2Vzc2Z1bGx5LAorICAgICAgICAgICAgRmFpbGVkCisgICAgICAgIH07CisgICAgICAgIGNsYXNzIFRyYWNrZXJIYXNOYW1lIHsKKyAgICAgICAgICAgIE5hbWVBbmRMb2NhdGlvbiBtX25hbWVBbmRMb2NhdGlvbjsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgVHJhY2tlckhhc05hbWUoIE5hbWVBbmRMb2NhdGlvbiBjb25zdCYgbmFtZUFuZExvY2F0aW9uICkgOiBtX25hbWVBbmRMb2NhdGlvbiggbmFtZUFuZExvY2F0aW9uICkge30KKyAgICAgICAgICAgIGJvb2wgb3BlcmF0b3IgKCkoIFB0cjxJVHJhY2tlcj4gY29uc3QmIHRyYWNrZXIgKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgICAgIHRyYWNrZXItPm5hbWVBbmRMb2NhdGlvbigpLm5hbWUgPT0gbV9uYW1lQW5kTG9jYXRpb24ubmFtZSAmJgorICAgICAgICAgICAgICAgICAgICB0cmFja2VyLT5uYW1lQW5kTG9jYXRpb24oKS5sb2NhdGlvbiA9PSBtX25hbWVBbmRMb2NhdGlvbi5sb2NhdGlvbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxQdHI8SVRyYWNrZXI+ID4gQ2hpbGRyZW47CisgICAgICAgIE5hbWVBbmRMb2NhdGlvbiBtX25hbWVBbmRMb2NhdGlvbjsKKyAgICAgICAgVHJhY2tlckNvbnRleHQmIG1fY3R4OworICAgICAgICBJVHJhY2tlciogbV9wYXJlbnQ7CisgICAgICAgIENoaWxkcmVuIG1fY2hpbGRyZW47CisgICAgICAgIEN5Y2xlU3RhdGUgbV9ydW5TdGF0ZTsKKyAgICBwdWJsaWM6CisgICAgICAgIFRyYWNrZXJCYXNlKCBOYW1lQW5kTG9jYXRpb24gY29uc3QmIG5hbWVBbmRMb2NhdGlvbiwgVHJhY2tlckNvbnRleHQmIGN0eCwgSVRyYWNrZXIqIHBhcmVudCApCisgICAgICAgIDogICBtX25hbWVBbmRMb2NhdGlvbiggbmFtZUFuZExvY2F0aW9uICksCisgICAgICAgICAgICBtX2N0eCggY3R4ICksCisgICAgICAgICAgICBtX3BhcmVudCggcGFyZW50ICksCisgICAgICAgICAgICBtX3J1blN0YXRlKCBOb3RTdGFydGVkICkKKyAgICAgICAge30KKyAgICAgICAgdmlydHVhbCB+VHJhY2tlckJhc2UoKTsKKworICAgICAgICB2aXJ0dWFsIE5hbWVBbmRMb2NhdGlvbiBjb25zdCYgbmFtZUFuZExvY2F0aW9uKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgcmV0dXJuIG1fbmFtZUFuZExvY2F0aW9uOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgYm9vbCBpc0NvbXBsZXRlKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgcmV0dXJuIG1fcnVuU3RhdGUgPT0gQ29tcGxldGVkU3VjY2Vzc2Z1bGx5IHx8IG1fcnVuU3RhdGUgPT0gRmFpbGVkOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgYm9vbCBpc1N1Y2Nlc3NmdWxseUNvbXBsZXRlZCgpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIHJldHVybiBtX3J1blN0YXRlID09IENvbXBsZXRlZFN1Y2Nlc3NmdWxseTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIGJvb2wgaXNPcGVuKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgcmV0dXJuIG1fcnVuU3RhdGUgIT0gTm90U3RhcnRlZCAmJiAhaXNDb21wbGV0ZSgpOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgYm9vbCBoYXNDaGlsZHJlbigpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIHJldHVybiAhbV9jaGlsZHJlbi5lbXB0eSgpOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIGFkZENoaWxkKCBQdHI8SVRyYWNrZXI+IGNvbnN0JiBjaGlsZCApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIG1fY2hpbGRyZW4ucHVzaF9iYWNrKCBjaGlsZCApOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCBJVHJhY2tlciogZmluZENoaWxkKCBOYW1lQW5kTG9jYXRpb24gY29uc3QmIG5hbWVBbmRMb2NhdGlvbiApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIENoaWxkcmVuOjpjb25zdF9pdGVyYXRvciBpdCA9IHN0ZDo6ZmluZF9pZiggbV9jaGlsZHJlbi5iZWdpbigpLCBtX2NoaWxkcmVuLmVuZCgpLCBUcmFja2VySGFzTmFtZSggbmFtZUFuZExvY2F0aW9uICkgKTsKKyAgICAgICAgICAgIHJldHVybiggaXQgIT0gbV9jaGlsZHJlbi5lbmQoKSApCisgICAgICAgICAgICAgICAgPyBpdC0+Z2V0KCkKKyAgICAgICAgICAgICAgICA6IENBVENIX05VTEw7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCBJVHJhY2tlciYgcGFyZW50KCkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgYXNzZXJ0KCBtX3BhcmVudCApOyAvLyBTaG91bGQgYWx3YXlzIGJlIG5vbi1udWxsIGV4Y2VwdCBmb3Igcm9vdAorICAgICAgICAgICAgcmV0dXJuICptX3BhcmVudDsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBvcGVuQ2hpbGQoKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBpZiggbV9ydW5TdGF0ZSAhPSBFeGVjdXRpbmdDaGlsZHJlbiApIHsKKyAgICAgICAgICAgICAgICBtX3J1blN0YXRlID0gRXhlY3V0aW5nQ2hpbGRyZW47CisgICAgICAgICAgICAgICAgaWYoIG1fcGFyZW50ICkKKyAgICAgICAgICAgICAgICAgICAgbV9wYXJlbnQtPm9wZW5DaGlsZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCBib29sIGlzU2VjdGlvblRyYWNrZXIoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7IHJldHVybiBmYWxzZTsgfQorICAgICAgICB2aXJ0dWFsIGJvb2wgaXNJbmRleFRyYWNrZXIoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7IHJldHVybiBmYWxzZTsgfQorCisgICAgICAgIHZvaWQgb3BlbigpIHsKKyAgICAgICAgICAgIG1fcnVuU3RhdGUgPSBFeGVjdXRpbmc7CisgICAgICAgICAgICBtb3ZlVG9UaGlzKCk7CisgICAgICAgICAgICBpZiggbV9wYXJlbnQgKQorICAgICAgICAgICAgICAgIG1fcGFyZW50LT5vcGVuQ2hpbGQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBjbG9zZSgpIENBVENIX09WRVJSSURFIHsKKworICAgICAgICAgICAgLy8gQ2xvc2UgYW55IHN0aWxsIG9wZW4gY2hpbGRyZW4gKGUuZy4gZ2VuZXJhdG9ycykKKyAgICAgICAgICAgIHdoaWxlKCAmbV9jdHguY3VycmVudFRyYWNrZXIoKSAhPSB0aGlzICkKKyAgICAgICAgICAgICAgICBtX2N0eC5jdXJyZW50VHJhY2tlcigpLmNsb3NlKCk7CisKKyAgICAgICAgICAgIHN3aXRjaCggbV9ydW5TdGF0ZSApIHsKKyAgICAgICAgICAgICAgICBjYXNlIE5vdFN0YXJ0ZWQ6CisgICAgICAgICAgICAgICAgY2FzZSBDb21wbGV0ZWRTdWNjZXNzZnVsbHk6CisgICAgICAgICAgICAgICAgY2FzZSBGYWlsZWQ6CisgICAgICAgICAgICAgICAgICAgIHRocm93IHN0ZDo6bG9naWNfZXJyb3IoICJJbGxvZ2ljYWwgc3RhdGUiICk7CisKKyAgICAgICAgICAgICAgICBjYXNlIE5lZWRzQW5vdGhlclJ1bjoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7OworCisgICAgICAgICAgICAgICAgY2FzZSBFeGVjdXRpbmc6CisgICAgICAgICAgICAgICAgICAgIG1fcnVuU3RhdGUgPSBDb21wbGV0ZWRTdWNjZXNzZnVsbHk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRXhlY3V0aW5nQ2hpbGRyZW46CisgICAgICAgICAgICAgICAgICAgIGlmKCBtX2NoaWxkcmVuLmVtcHR5KCkgfHwgbV9jaGlsZHJlbi5iYWNrKCktPmlzQ29tcGxldGUoKSApCisgICAgICAgICAgICAgICAgICAgICAgICBtX3J1blN0YXRlID0gQ29tcGxldGVkU3VjY2Vzc2Z1bGx5OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHRocm93IHN0ZDo6bG9naWNfZXJyb3IoICJVbmV4cGVjdGVkIHN0YXRlIiApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbW92ZVRvUGFyZW50KCk7CisgICAgICAgICAgICBtX2N0eC5jb21wbGV0ZUN5Y2xlKCk7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCB2b2lkIGZhaWwoKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBtX3J1blN0YXRlID0gRmFpbGVkOworICAgICAgICAgICAgaWYoIG1fcGFyZW50ICkKKyAgICAgICAgICAgICAgICBtX3BhcmVudC0+bWFya0FzTmVlZGluZ0Fub3RoZXJSdW4oKTsKKyAgICAgICAgICAgIG1vdmVUb1BhcmVudCgpOworICAgICAgICAgICAgbV9jdHguY29tcGxldGVDeWNsZSgpOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgdm9pZCBtYXJrQXNOZWVkaW5nQW5vdGhlclJ1bigpIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIG1fcnVuU3RhdGUgPSBOZWVkc0Fub3RoZXJSdW47CisgICAgICAgIH0KKyAgICBwcml2YXRlOgorICAgICAgICB2b2lkIG1vdmVUb1BhcmVudCgpIHsKKyAgICAgICAgICAgIGFzc2VydCggbV9wYXJlbnQgKTsKKyAgICAgICAgICAgIG1fY3R4LnNldEN1cnJlbnRUcmFja2VyKCBtX3BhcmVudCApOworICAgICAgICB9CisgICAgICAgIHZvaWQgbW92ZVRvVGhpcygpIHsKKyAgICAgICAgICAgIG1fY3R4LnNldEN1cnJlbnRUcmFja2VyKCB0aGlzICk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgY2xhc3MgU2VjdGlvblRyYWNrZXIgOiBwdWJsaWMgVHJhY2tlckJhc2UgeworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbV9maWx0ZXJzOworICAgIHB1YmxpYzoKKyAgICAgICAgU2VjdGlvblRyYWNrZXIoIE5hbWVBbmRMb2NhdGlvbiBjb25zdCYgbmFtZUFuZExvY2F0aW9uLCBUcmFja2VyQ29udGV4dCYgY3R4LCBJVHJhY2tlciogcGFyZW50ICkKKyAgICAgICAgOiAgIFRyYWNrZXJCYXNlKCBuYW1lQW5kTG9jYXRpb24sIGN0eCwgcGFyZW50ICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIHBhcmVudCApIHsKKyAgICAgICAgICAgICAgICB3aGlsZSggIXBhcmVudC0+aXNTZWN0aW9uVHJhY2tlcigpICkKKyAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gJnBhcmVudC0+cGFyZW50KCk7CisKKyAgICAgICAgICAgICAgICBTZWN0aW9uVHJhY2tlciYgcGFyZW50U2VjdGlvbiA9IHN0YXRpY19jYXN0PFNlY3Rpb25UcmFja2VyJj4oICpwYXJlbnQgKTsKKyAgICAgICAgICAgICAgICBhZGROZXh0RmlsdGVycyggcGFyZW50U2VjdGlvbi5tX2ZpbHRlcnMgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIH5TZWN0aW9uVHJhY2tlcigpOworCisgICAgICAgIHZpcnR1YWwgYm9vbCBpc1NlY3Rpb25UcmFja2VyKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeyByZXR1cm4gdHJ1ZTsgfQorCisgICAgICAgIHN0YXRpYyBTZWN0aW9uVHJhY2tlciYgYWNxdWlyZSggVHJhY2tlckNvbnRleHQmIGN0eCwgTmFtZUFuZExvY2F0aW9uIGNvbnN0JiBuYW1lQW5kTG9jYXRpb24gKSB7CisgICAgICAgICAgICBTZWN0aW9uVHJhY2tlciogc2VjdGlvbiA9IENBVENIX05VTEw7CisKKyAgICAgICAgICAgIElUcmFja2VyJiBjdXJyZW50VHJhY2tlciA9IGN0eC5jdXJyZW50VHJhY2tlcigpOworICAgICAgICAgICAgaWYoIElUcmFja2VyKiBjaGlsZFRyYWNrZXIgPSBjdXJyZW50VHJhY2tlci5maW5kQ2hpbGQoIG5hbWVBbmRMb2NhdGlvbiApICkgeworICAgICAgICAgICAgICAgIGFzc2VydCggY2hpbGRUcmFja2VyICk7CisgICAgICAgICAgICAgICAgYXNzZXJ0KCBjaGlsZFRyYWNrZXItPmlzU2VjdGlvblRyYWNrZXIoKSApOworICAgICAgICAgICAgICAgIHNlY3Rpb24gPSBzdGF0aWNfY2FzdDxTZWN0aW9uVHJhY2tlcio+KCBjaGlsZFRyYWNrZXIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHNlY3Rpb24gPSBuZXcgU2VjdGlvblRyYWNrZXIoIG5hbWVBbmRMb2NhdGlvbiwgY3R4LCAmY3VycmVudFRyYWNrZXIgKTsKKyAgICAgICAgICAgICAgICBjdXJyZW50VHJhY2tlci5hZGRDaGlsZCggc2VjdGlvbiApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoICFjdHguY29tcGxldGVkQ3ljbGUoKSApCisgICAgICAgICAgICAgICAgc2VjdGlvbi0+dHJ5T3BlbigpOworICAgICAgICAgICAgcmV0dXJuICpzZWN0aW9uOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCB0cnlPcGVuKCkgeworICAgICAgICAgICAgaWYoICFpc0NvbXBsZXRlKCkgJiYgKG1fZmlsdGVycy5lbXB0eSgpIHx8IG1fZmlsdGVyc1swXS5lbXB0eSgpIHx8ICBtX2ZpbHRlcnNbMF0gPT0gbV9uYW1lQW5kTG9jYXRpb24ubmFtZSApICkKKyAgICAgICAgICAgICAgICBvcGVuKCk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGFkZEluaXRpYWxGaWx0ZXJzKCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gY29uc3QmIGZpbHRlcnMgKSB7CisgICAgICAgICAgICBpZiggIWZpbHRlcnMuZW1wdHkoKSApIHsKKyAgICAgICAgICAgICAgICBtX2ZpbHRlcnMucHVzaF9iYWNrKCIiKTsgLy8gUm9vdCAtIHNob3VsZCBuZXZlciBiZSBjb25zdWx0ZWQKKyAgICAgICAgICAgICAgICBtX2ZpbHRlcnMucHVzaF9iYWNrKCIiKTsgLy8gVGVzdCBDYXNlIC0gbm90IGEgc2VjdGlvbiBmaWx0ZXIKKyAgICAgICAgICAgICAgICBtX2ZpbHRlcnMuaW5zZXJ0KCBtX2ZpbHRlcnMuZW5kKCksIGZpbHRlcnMuYmVnaW4oKSwgZmlsdGVycy5lbmQoKSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHZvaWQgYWRkTmV4dEZpbHRlcnMoIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBjb25zdCYgZmlsdGVycyApIHsKKyAgICAgICAgICAgIGlmKCBmaWx0ZXJzLnNpemUoKSA+IDEgKQorICAgICAgICAgICAgICAgIG1fZmlsdGVycy5pbnNlcnQoIG1fZmlsdGVycy5lbmQoKSwgKytmaWx0ZXJzLmJlZ2luKCksIGZpbHRlcnMuZW5kKCkgKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBjbGFzcyBJbmRleFRyYWNrZXIgOiBwdWJsaWMgVHJhY2tlckJhc2UgeworICAgICAgICBpbnQgbV9zaXplOworICAgICAgICBpbnQgbV9pbmRleDsKKyAgICBwdWJsaWM6CisgICAgICAgIEluZGV4VHJhY2tlciggTmFtZUFuZExvY2F0aW9uIGNvbnN0JiBuYW1lQW5kTG9jYXRpb24sIFRyYWNrZXJDb250ZXh0JiBjdHgsIElUcmFja2VyKiBwYXJlbnQsIGludCBzaXplICkKKyAgICAgICAgOiAgIFRyYWNrZXJCYXNlKCBuYW1lQW5kTG9jYXRpb24sIGN0eCwgcGFyZW50ICksCisgICAgICAgICAgICBtX3NpemUoIHNpemUgKSwKKyAgICAgICAgICAgIG1faW5kZXgoIC0xICkKKyAgICAgICAge30KKyAgICAgICAgdmlydHVhbCB+SW5kZXhUcmFja2VyKCk7CisKKyAgICAgICAgdmlydHVhbCBib29sIGlzSW5kZXhUcmFja2VyKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeyByZXR1cm4gdHJ1ZTsgfQorCisgICAgICAgIHN0YXRpYyBJbmRleFRyYWNrZXImIGFjcXVpcmUoIFRyYWNrZXJDb250ZXh0JiBjdHgsIE5hbWVBbmRMb2NhdGlvbiBjb25zdCYgbmFtZUFuZExvY2F0aW9uLCBpbnQgc2l6ZSApIHsKKyAgICAgICAgICAgIEluZGV4VHJhY2tlciogdHJhY2tlciA9IENBVENIX05VTEw7CisKKyAgICAgICAgICAgIElUcmFja2VyJiBjdXJyZW50VHJhY2tlciA9IGN0eC5jdXJyZW50VHJhY2tlcigpOworICAgICAgICAgICAgaWYoIElUcmFja2VyKiBjaGlsZFRyYWNrZXIgPSBjdXJyZW50VHJhY2tlci5maW5kQ2hpbGQoIG5hbWVBbmRMb2NhdGlvbiApICkgeworICAgICAgICAgICAgICAgIGFzc2VydCggY2hpbGRUcmFja2VyICk7CisgICAgICAgICAgICAgICAgYXNzZXJ0KCBjaGlsZFRyYWNrZXItPmlzSW5kZXhUcmFja2VyKCkgKTsKKyAgICAgICAgICAgICAgICB0cmFja2VyID0gc3RhdGljX2Nhc3Q8SW5kZXhUcmFja2VyKj4oIGNoaWxkVHJhY2tlciApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgdHJhY2tlciA9IG5ldyBJbmRleFRyYWNrZXIoIG5hbWVBbmRMb2NhdGlvbiwgY3R4LCAmY3VycmVudFRyYWNrZXIsIHNpemUgKTsKKyAgICAgICAgICAgICAgICBjdXJyZW50VHJhY2tlci5hZGRDaGlsZCggdHJhY2tlciApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiggIWN0eC5jb21wbGV0ZWRDeWNsZSgpICYmICF0cmFja2VyLT5pc0NvbXBsZXRlKCkgKSB7CisgICAgICAgICAgICAgICAgaWYoIHRyYWNrZXItPm1fcnVuU3RhdGUgIT0gRXhlY3V0aW5nQ2hpbGRyZW4gJiYgdHJhY2tlci0+bV9ydW5TdGF0ZSAhPSBOZWVkc0Fub3RoZXJSdW4gKQorICAgICAgICAgICAgICAgICAgICB0cmFja2VyLT5tb3ZlTmV4dCgpOworICAgICAgICAgICAgICAgIHRyYWNrZXItPm9wZW4oKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuICp0cmFja2VyOworICAgICAgICB9CisKKyAgICAgICAgaW50IGluZGV4KCkgY29uc3QgeyByZXR1cm4gbV9pbmRleDsgfQorCisgICAgICAgIHZvaWQgbW92ZU5leHQoKSB7CisgICAgICAgICAgICBtX2luZGV4Kys7CisgICAgICAgICAgICBtX2NoaWxkcmVuLmNsZWFyKCk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgY2xvc2UoKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBUcmFja2VyQmFzZTo6Y2xvc2UoKTsKKyAgICAgICAgICAgIGlmKCBtX3J1blN0YXRlID09IENvbXBsZXRlZFN1Y2Nlc3NmdWxseSAmJiBtX2luZGV4IDwgbV9zaXplLTEgKQorICAgICAgICAgICAgICAgIG1fcnVuU3RhdGUgPSBFeGVjdXRpbmc7CisgICAgICAgIH0KKyAgICB9OworCisgICAgaW5saW5lIElUcmFja2VyJiBUcmFja2VyQ29udGV4dDo6c3RhcnRSdW4oKSB7CisgICAgICAgIG1fcm9vdFRyYWNrZXIgPSBuZXcgU2VjdGlvblRyYWNrZXIoIE5hbWVBbmRMb2NhdGlvbiggIntyb290fSIsIENBVENIX0lOVEVSTkFMX0xJTkVJTkZPICksICp0aGlzLCBDQVRDSF9OVUxMICk7CisgICAgICAgIG1fY3VycmVudFRyYWNrZXIgPSBDQVRDSF9OVUxMOworICAgICAgICBtX3J1blN0YXRlID0gRXhlY3V0aW5nOworICAgICAgICByZXR1cm4gKm1fcm9vdFRyYWNrZXI7CisgICAgfQorCit9IC8vIG5hbWVzcGFjZSBUZXN0Q2FzZVRyYWNraW5nCisKK3VzaW5nIFRlc3RDYXNlVHJhY2tpbmc6OklUcmFja2VyOwordXNpbmcgVGVzdENhc2VUcmFja2luZzo6VHJhY2tlckNvbnRleHQ7Cit1c2luZyBUZXN0Q2FzZVRyYWNraW5nOjpTZWN0aW9uVHJhY2tlcjsKK3VzaW5nIFRlc3RDYXNlVHJhY2tpbmc6OkluZGV4VHJhY2tlcjsKKworfSAvLyBuYW1lc3BhY2UgQ2F0Y2gKKworQ0FUQ0hfSU5URVJOQUxfVU5TVVBQUkVTU19FVERfV0FSTklOR1MKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX2ZhdGFsX2NvbmRpdGlvbi5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0ZBVEFMX0NPTkRJVElPTl9IX0lOQ0xVREVECisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICAvLyBSZXBvcnQgdGhlIGVycm9yIGNvbmRpdGlvbgorICAgIGlubGluZSB2b2lkIHJlcG9ydEZhdGFsKCBzdGQ6OnN0cmluZyBjb25zdCYgbWVzc2FnZSApIHsKKyAgICAgICAgSUNvbnRleHQmIGNvbnRleHQgPSBDYXRjaDo6Z2V0Q3VycmVudENvbnRleHQoKTsKKyAgICAgICAgSVJlc3VsdENhcHR1cmUqIHJlc3VsdENhcHR1cmUgPSBjb250ZXh0LmdldFJlc3VsdENhcHR1cmUoKTsKKyAgICAgICAgcmVzdWx0Q2FwdHVyZS0+aGFuZGxlRmF0YWxFcnJvckNvbmRpdGlvbiggbWVzc2FnZSApOworICAgIH0KKworfSAvLyBuYW1lc3BhY2UgQ2F0Y2gKKworI2lmIGRlZmluZWQgKCBDQVRDSF9QTEFURk9STV9XSU5ET1dTICkgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF93aW5kb3dzX2hfcHJveHkuaAorCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9XSU5ET1dTX0hfUFJPWFlfSF9JTkNMVURFRAorCisjaWZkZWYgQ0FUQ0hfREVGSU5FU19OT01JTk1BWAorIyAgZGVmaW5lIE5PTUlOTUFYCisjZW5kaWYKKyNpZmRlZiBDQVRDSF9ERUZJTkVTX1dJTjMyX0xFQU5fQU5EX01FQU4KKyMgIGRlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCisjZW5kaWYKKworI2lmZGVmIF9fQUZYRExMCisjaW5jbHVkZSA8QWZ4V2luLmg+CisjZWxzZQorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNlbmRpZgorCisjaWZkZWYgQ0FUQ0hfREVGSU5FU19OT01JTk1BWAorIyAgdW5kZWYgTk9NSU5NQVgKKyNlbmRpZgorI2lmZGVmIENBVENIX0RFRklORVNfV0lOMzJfTEVBTl9BTkRfTUVBTgorIyAgdW5kZWYgV0lOMzJfTEVBTl9BTkRfTUVBTgorI2VuZGlmCisKKworIyAgaWYgIWRlZmluZWQgKCBDQVRDSF9DT05GSUdfV0lORE9XU19TRUggKQorCituYW1lc3BhY2UgQ2F0Y2ggeworICAgIHN0cnVjdCBGYXRhbENvbmRpdGlvbkhhbmRsZXIgeworICAgICAgICB2b2lkIHJlc2V0KCkge30KKyAgICB9OworfQorCisjICBlbHNlIC8vIENBVENIX0NPTkZJR19XSU5ET1dTX1NFSCBpcyBkZWZpbmVkCisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBzdHJ1Y3QgU2lnbmFsRGVmcyB7IERXT1JEIGlkOyBjb25zdCBjaGFyKiBuYW1lOyB9OworICAgIGV4dGVybiBTaWduYWxEZWZzIHNpZ25hbERlZnNbXTsKKyAgICAvLyBUaGVyZSBpcyBubyAxLTEgbWFwcGluZyBiZXR3ZWVuIHNpZ25hbHMgYW5kIHdpbmRvd3MgZXhjZXB0aW9ucy4KKyAgICAvLyBXaW5kb3dzIGNhbiBlYXNpbHkgZGlzdGluZ3Vpc2ggYmV0d2VlbiBTTyBhbmQgU2lnU2VnViwKKyAgICAvLyBidXQgU2lnSW50LCBTaWdUZXJtLCBldGMgYXJlIGhhbmRsZWQgZGlmZmVyZW50bHkuCisgICAgU2lnbmFsRGVmcyBzaWduYWxEZWZzW10gPSB7CisgICAgICAgIHsgRVhDRVBUSU9OX0lMTEVHQUxfSU5TVFJVQ1RJT04sICAiU0lHSUxMIC0gSWxsZWdhbCBpbnN0cnVjdGlvbiBzaWduYWwiIH0sCisgICAgICAgIHsgRVhDRVBUSU9OX1NUQUNLX09WRVJGTE9XLCAiU0lHU0VHViAtIFN0YWNrIG92ZXJmbG93IiB9LAorICAgICAgICB7IEVYQ0VQVElPTl9BQ0NFU1NfVklPTEFUSU9OLCAiU0lHU0VHViAtIFNlZ21lbnRhdGlvbiB2aW9sYXRpb24gc2lnbmFsIiB9LAorICAgICAgICB7IEVYQ0VQVElPTl9JTlRfRElWSURFX0JZX1pFUk8sICJEaXZpZGUgYnkgemVybyBlcnJvciIgfSwKKyAgICB9OworCisgICAgc3RydWN0IEZhdGFsQ29uZGl0aW9uSGFuZGxlciB7CisKKyAgICAgICAgc3RhdGljIExPTkcgQ0FMTEJBQ0sgaGFuZGxlVmVjdG9yZWRFeGNlcHRpb24oUEVYQ0VQVElPTl9QT0lOVEVSUyBFeGNlcHRpb25JbmZvKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemVvZihzaWduYWxEZWZzKSAvIHNpemVvZihTaWduYWxEZWZzKTsgKytpKSB7CisgICAgICAgICAgICAgICAgaWYgKEV4Y2VwdGlvbkluZm8tPkV4Y2VwdGlvblJlY29yZC0+RXhjZXB0aW9uQ29kZSA9PSBzaWduYWxEZWZzW2ldLmlkKSB7CisgICAgICAgICAgICAgICAgICAgIHJlcG9ydEZhdGFsKHNpZ25hbERlZnNbaV0ubmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gSWYgaXRzIG5vdCBhbiBleGNlcHRpb24gd2UgY2FyZSBhYm91dCwgcGFzcyBpdCBhbG9uZy4KKyAgICAgICAgICAgIC8vIFRoaXMgc3RvcHMgdXMgZnJvbSBlYXRpbmcgZGVidWdnZXIgYnJlYWtzIGV0Yy4KKyAgICAgICAgICAgIHJldHVybiBFWENFUFRJT05fQ09OVElOVUVfU0VBUkNIOworICAgICAgICB9CisKKyAgICAgICAgRmF0YWxDb25kaXRpb25IYW5kbGVyKCkgeworICAgICAgICAgICAgaXNTZXQgPSB0cnVlOworICAgICAgICAgICAgLy8gMzJrIHNlZW1zIGVub3VnaCBmb3IgQ2F0Y2ggdG8gaGFuZGxlIHN0YWNrIG92ZXJmbG93LAorICAgICAgICAgICAgLy8gYnV0IHRoZSB2YWx1ZSB3YXMgZm91bmQgZXhwZXJpbWVudGFsbHksIHNvIHRoZXJlIGlzIG5vIHN0cm9uZyBndWFyYW50ZWUKKyAgICAgICAgICAgIGd1YXJhbnRlZVNpemUgPSAzMiAqIDEwMjQ7CisgICAgICAgICAgICBleGNlcHRpb25IYW5kbGVySGFuZGxlID0gQ0FUQ0hfTlVMTDsKKyAgICAgICAgICAgIC8vIFJlZ2lzdGVyIGFzIGZpcnN0IGhhbmRsZXIgaW4gY3VycmVudCBjaGFpbgorICAgICAgICAgICAgZXhjZXB0aW9uSGFuZGxlckhhbmRsZSA9IEFkZFZlY3RvcmVkRXhjZXB0aW9uSGFuZGxlcigxLCBoYW5kbGVWZWN0b3JlZEV4Y2VwdGlvbik7CisgICAgICAgICAgICAvLyBQYXNzIGluIGd1YXJhbnRlZSBzaXplIHRvIGJlIGZpbGxlZAorICAgICAgICAgICAgU2V0VGhyZWFkU3RhY2tHdWFyYW50ZWUoJmd1YXJhbnRlZVNpemUpOworICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIHZvaWQgcmVzZXQoKSB7CisgICAgICAgICAgICBpZiAoaXNTZXQpIHsKKyAgICAgICAgICAgICAgICAvLyBVbnJlZ2lzdGVyIGhhbmRsZXIgYW5kIHJlc3RvcmUgdGhlIG9sZCBndWFyYW50ZWUKKyAgICAgICAgICAgICAgICBSZW1vdmVWZWN0b3JlZEV4Y2VwdGlvbkhhbmRsZXIoZXhjZXB0aW9uSGFuZGxlckhhbmRsZSk7CisgICAgICAgICAgICAgICAgU2V0VGhyZWFkU3RhY2tHdWFyYW50ZWUoJmd1YXJhbnRlZVNpemUpOworICAgICAgICAgICAgICAgIGV4Y2VwdGlvbkhhbmRsZXJIYW5kbGUgPSBDQVRDSF9OVUxMOworICAgICAgICAgICAgICAgIGlzU2V0ID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB+RmF0YWxDb25kaXRpb25IYW5kbGVyKCkgeworICAgICAgICAgICAgcmVzZXQoKTsKKyAgICAgICAgfQorICAgIHByaXZhdGU6CisgICAgICAgIHN0YXRpYyBib29sIGlzU2V0OworICAgICAgICBzdGF0aWMgVUxPTkcgZ3VhcmFudGVlU2l6ZTsKKyAgICAgICAgc3RhdGljIFBWT0lEIGV4Y2VwdGlvbkhhbmRsZXJIYW5kbGU7CisgICAgfTsKKworICAgIGJvb2wgRmF0YWxDb25kaXRpb25IYW5kbGVyOjppc1NldCA9IGZhbHNlOworICAgIFVMT05HIEZhdGFsQ29uZGl0aW9uSGFuZGxlcjo6Z3VhcmFudGVlU2l6ZSA9IDA7CisgICAgUFZPSUQgRmF0YWxDb25kaXRpb25IYW5kbGVyOjpleGNlcHRpb25IYW5kbGVySGFuZGxlID0gQ0FUQ0hfTlVMTDsKKworfSAvLyBuYW1lc3BhY2UgQ2F0Y2gKKworIyAgZW5kaWYgLy8gQ0FUQ0hfQ09ORklHX1dJTkRPV1NfU0VICisKKyNlbHNlIC8vIE5vdCBXaW5kb3dzIC0gYXNzdW1lZCB0byBiZSBQT1NJWCBjb21wYXRpYmxlIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyMgIGlmICFkZWZpbmVkKENBVENIX0NPTkZJR19QT1NJWF9TSUdOQUxTKQorCituYW1lc3BhY2UgQ2F0Y2ggeworICAgIHN0cnVjdCBGYXRhbENvbmRpdGlvbkhhbmRsZXIgeworICAgICAgICB2b2lkIHJlc2V0KCkge30KKyAgICB9OworfQorCisjICBlbHNlIC8vIENBVENIX0NPTkZJR19QT1NJWF9TSUdOQUxTIGlzIGRlZmluZWQKKworI2luY2x1ZGUgPHNpZ25hbC5oPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgc3RydWN0IFNpZ25hbERlZnMgeworICAgICAgICBpbnQgaWQ7CisgICAgICAgIGNvbnN0IGNoYXIqIG5hbWU7CisgICAgfTsKKyAgICBleHRlcm4gU2lnbmFsRGVmcyBzaWduYWxEZWZzW107CisgICAgU2lnbmFsRGVmcyBzaWduYWxEZWZzW10gPSB7CisgICAgICAgICAgICB7IFNJR0lOVCwgICJTSUdJTlQgLSBUZXJtaW5hbCBpbnRlcnJ1cHQgc2lnbmFsIiB9LAorICAgICAgICAgICAgeyBTSUdJTEwsICAiU0lHSUxMIC0gSWxsZWdhbCBpbnN0cnVjdGlvbiBzaWduYWwiIH0sCisgICAgICAgICAgICB7IFNJR0ZQRSwgICJTSUdGUEUgLSBGbG9hdGluZyBwb2ludCBlcnJvciBzaWduYWwiIH0sCisgICAgICAgICAgICB7IFNJR1NFR1YsICJTSUdTRUdWIC0gU2VnbWVudGF0aW9uIHZpb2xhdGlvbiBzaWduYWwiIH0sCisgICAgICAgICAgICB7IFNJR1RFUk0sICJTSUdURVJNIC0gVGVybWluYXRpb24gcmVxdWVzdCBzaWduYWwiIH0sCisgICAgICAgICAgICB7IFNJR0FCUlQsICJTSUdBQlJUIC0gQWJvcnQgKGFibm9ybWFsIHRlcm1pbmF0aW9uKSBzaWduYWwiIH0KKyAgICB9OworCisgICAgc3RydWN0IEZhdGFsQ29uZGl0aW9uSGFuZGxlciB7CisKKyAgICAgICAgc3RhdGljIGJvb2wgaXNTZXQ7CisgICAgICAgIHN0YXRpYyBzdHJ1Y3Qgc2lnYWN0aW9uIG9sZFNpZ0FjdGlvbnMgW3NpemVvZihzaWduYWxEZWZzKS9zaXplb2YoU2lnbmFsRGVmcyldOworICAgICAgICBzdGF0aWMgc3RhY2tfdCBvbGRTaWdTdGFjazsKKyAgICAgICAgc3RhdGljIGNoYXIgYWx0U3RhY2tNZW1bU0lHU1RLU1pdOworCisgICAgICAgIHN0YXRpYyB2b2lkIGhhbmRsZVNpZ25hbCggaW50IHNpZyApIHsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUgPSAiPHVua25vd24gc2lnbmFsPiI7CisgICAgICAgICAgICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgc2l6ZW9mKHNpZ25hbERlZnMpIC8gc2l6ZW9mKFNpZ25hbERlZnMpOyArK2kpIHsKKyAgICAgICAgICAgICAgICBTaWduYWxEZWZzICZkZWYgPSBzaWduYWxEZWZzW2ldOworICAgICAgICAgICAgICAgIGlmIChzaWcgPT0gZGVmLmlkKSB7CisgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBkZWYubmFtZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzZXQoKTsKKyAgICAgICAgICAgIHJlcG9ydEZhdGFsKG5hbWUpOworICAgICAgICAgICAgcmFpc2UoIHNpZyApOworICAgICAgICB9CisKKyAgICAgICAgRmF0YWxDb25kaXRpb25IYW5kbGVyKCkgeworICAgICAgICAgICAgaXNTZXQgPSB0cnVlOworICAgICAgICAgICAgc3RhY2tfdCBzaWdTdGFjazsKKyAgICAgICAgICAgIHNpZ1N0YWNrLnNzX3NwID0gYWx0U3RhY2tNZW07CisgICAgICAgICAgICBzaWdTdGFjay5zc19zaXplID0gU0lHU1RLU1o7CisgICAgICAgICAgICBzaWdTdGFjay5zc19mbGFncyA9IDA7CisgICAgICAgICAgICBzaWdhbHRzdGFjaygmc2lnU3RhY2ssICZvbGRTaWdTdGFjayk7CisgICAgICAgICAgICBzdHJ1Y3Qgc2lnYWN0aW9uIHNhID0geyAwIH07CisKKyAgICAgICAgICAgIHNhLnNhX2hhbmRsZXIgPSBoYW5kbGVTaWduYWw7CisgICAgICAgICAgICBzYS5zYV9mbGFncyA9IFNBX09OU1RBQ0s7CisgICAgICAgICAgICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgc2l6ZW9mKHNpZ25hbERlZnMpL3NpemVvZihTaWduYWxEZWZzKTsgKytpKSB7CisgICAgICAgICAgICAgICAgc2lnYWN0aW9uKHNpZ25hbERlZnNbaV0uaWQsICZzYSwgJm9sZFNpZ0FjdGlvbnNbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgfkZhdGFsQ29uZGl0aW9uSGFuZGxlcigpIHsKKyAgICAgICAgICAgIHJlc2V0KCk7CisgICAgICAgIH0KKyAgICAgICAgc3RhdGljIHZvaWQgcmVzZXQoKSB7CisgICAgICAgICAgICBpZiggaXNTZXQgKSB7CisgICAgICAgICAgICAgICAgLy8gU2V0IHNpZ25hbHMgYmFjayB0byBwcmV2aW91cyB2YWx1ZXMgLS0gaG9wZWZ1bGx5IG5vYm9keSBvdmVyd3JvdGUgdGhlbSBpbiB0aGUgbWVhbnRpbWUKKyAgICAgICAgICAgICAgICBmb3IoIHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgc2l6ZW9mKHNpZ25hbERlZnMpL3NpemVvZihTaWduYWxEZWZzKTsgKytpICkgeworICAgICAgICAgICAgICAgICAgICBzaWdhY3Rpb24oc2lnbmFsRGVmc1tpXS5pZCwgJm9sZFNpZ0FjdGlvbnNbaV0sIENBVENIX05VTEwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBSZXR1cm4gdGhlIG9sZCBzdGFjaworICAgICAgICAgICAgICAgIHNpZ2FsdHN0YWNrKCZvbGRTaWdTdGFjaywgQ0FUQ0hfTlVMTCk7CisgICAgICAgICAgICAgICAgaXNTZXQgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICBib29sIEZhdGFsQ29uZGl0aW9uSGFuZGxlcjo6aXNTZXQgPSBmYWxzZTsKKyAgICBzdHJ1Y3Qgc2lnYWN0aW9uIEZhdGFsQ29uZGl0aW9uSGFuZGxlcjo6b2xkU2lnQWN0aW9uc1tzaXplb2Yoc2lnbmFsRGVmcykvc2l6ZW9mKFNpZ25hbERlZnMpXSA9IHt9OworICAgIHN0YWNrX3QgRmF0YWxDb25kaXRpb25IYW5kbGVyOjpvbGRTaWdTdGFjayA9IHt9OworICAgIGNoYXIgRmF0YWxDb25kaXRpb25IYW5kbGVyOjphbHRTdGFja01lbVtTSUdTVEtTWl0gPSB7fTsKKworfSAvLyBuYW1lc3BhY2UgQ2F0Y2gKKworIyAgZW5kaWYgLy8gQ0FUQ0hfQ09ORklHX1BPU0lYX1NJR05BTFMKKworI2VuZGlmIC8vIG5vdCBXaW5kb3dzCisKKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgY2xhc3MgU3RyZWFtUmVkaXJlY3QgeworCisgICAgcHVibGljOgorICAgICAgICBTdHJlYW1SZWRpcmVjdCggc3RkOjpvc3RyZWFtJiBzdHJlYW0sIHN0ZDo6c3RyaW5nJiB0YXJnZXRTdHJpbmcgKQorICAgICAgICA6ICAgbV9zdHJlYW0oIHN0cmVhbSApLAorICAgICAgICAgICAgbV9wcmV2QnVmKCBzdHJlYW0ucmRidWYoKSApLAorICAgICAgICAgICAgbV90YXJnZXRTdHJpbmcoIHRhcmdldFN0cmluZyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmVhbS5yZGJ1ZiggbV9vc3MucmRidWYoKSApOworICAgICAgICB9CisKKyAgICAgICAgflN0cmVhbVJlZGlyZWN0KCkgeworICAgICAgICAgICAgbV90YXJnZXRTdHJpbmcgKz0gbV9vc3Muc3RyKCk7CisgICAgICAgICAgICBtX3N0cmVhbS5yZGJ1ZiggbV9wcmV2QnVmICk7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6b3N0cmVhbSYgbV9zdHJlYW07CisgICAgICAgIHN0ZDo6c3RyZWFtYnVmKiBtX3ByZXZCdWY7CisgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBtX29zczsKKyAgICAgICAgc3RkOjpzdHJpbmcmIG1fdGFyZ2V0U3RyaW5nOworICAgIH07CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIGNsYXNzIFJ1bkNvbnRleHQgOiBwdWJsaWMgSVJlc3VsdENhcHR1cmUsIHB1YmxpYyBJUnVubmVyIHsKKworICAgICAgICBSdW5Db250ZXh0KCBSdW5Db250ZXh0IGNvbnN0JiApOworICAgICAgICB2b2lkIG9wZXJhdG9yID0oIFJ1bkNvbnRleHQgY29uc3QmICk7CisKKyAgICBwdWJsaWM6CisKKyAgICAgICAgZXhwbGljaXQgUnVuQ29udGV4dCggUHRyPElDb25maWcgY29uc3Q+IGNvbnN0JiBfY29uZmlnLCBQdHI8SVN0cmVhbWluZ1JlcG9ydGVyPiBjb25zdCYgcmVwb3J0ZXIgKQorICAgICAgICA6ICAgbV9ydW5JbmZvKCBfY29uZmlnLT5uYW1lKCkgKSwKKyAgICAgICAgICAgIG1fY29udGV4dCggZ2V0Q3VycmVudE11dGFibGVDb250ZXh0KCkgKSwKKyAgICAgICAgICAgIG1fYWN0aXZlVGVzdENhc2UoIENBVENIX05VTEwgKSwKKyAgICAgICAgICAgIG1fY29uZmlnKCBfY29uZmlnICksCisgICAgICAgICAgICBtX3JlcG9ydGVyKCByZXBvcnRlciApLAorICAgICAgICAgICAgbV9zaG91bGRSZXBvcnRVbmV4cGVjdGVkICggdHJ1ZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIG1fY29udGV4dC5zZXRSdW5uZXIoIHRoaXMgKTsKKyAgICAgICAgICAgIG1fY29udGV4dC5zZXRDb25maWcoIG1fY29uZmlnICk7CisgICAgICAgICAgICBtX2NvbnRleHQuc2V0UmVzdWx0Q2FwdHVyZSggdGhpcyApOworICAgICAgICAgICAgbV9yZXBvcnRlci0+dGVzdFJ1blN0YXJ0aW5nKCBtX3J1bkluZm8gKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgflJ1bkNvbnRleHQoKSB7CisgICAgICAgICAgICBtX3JlcG9ydGVyLT50ZXN0UnVuRW5kZWQoIFRlc3RSdW5TdGF0cyggbV9ydW5JbmZvLCBtX3RvdGFscywgYWJvcnRpbmcoKSApICk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHRlc3RHcm91cFN0YXJ0aW5nKCBzdGQ6OnN0cmluZyBjb25zdCYgdGVzdFNwZWMsIHN0ZDo6c2l6ZV90IGdyb3VwSW5kZXgsIHN0ZDo6c2l6ZV90IGdyb3Vwc0NvdW50ICkgeworICAgICAgICAgICAgbV9yZXBvcnRlci0+dGVzdEdyb3VwU3RhcnRpbmcoIEdyb3VwSW5mbyggdGVzdFNwZWMsIGdyb3VwSW5kZXgsIGdyb3Vwc0NvdW50ICkgKTsKKyAgICAgICAgfQorICAgICAgICB2b2lkIHRlc3RHcm91cEVuZGVkKCBzdGQ6OnN0cmluZyBjb25zdCYgdGVzdFNwZWMsIFRvdGFscyBjb25zdCYgdG90YWxzLCBzdGQ6OnNpemVfdCBncm91cEluZGV4LCBzdGQ6OnNpemVfdCBncm91cHNDb3VudCApIHsKKyAgICAgICAgICAgIG1fcmVwb3J0ZXItPnRlc3RHcm91cEVuZGVkKCBUZXN0R3JvdXBTdGF0cyggR3JvdXBJbmZvKCB0ZXN0U3BlYywgZ3JvdXBJbmRleCwgZ3JvdXBzQ291bnQgKSwgdG90YWxzLCBhYm9ydGluZygpICkgKTsKKyAgICAgICAgfQorCisgICAgICAgIFRvdGFscyBydW5UZXN0KCBUZXN0Q2FzZSBjb25zdCYgdGVzdENhc2UgKSB7CisgICAgICAgICAgICBUb3RhbHMgcHJldlRvdGFscyA9IG1fdG90YWxzOworCisgICAgICAgICAgICBzdGQ6OnN0cmluZyByZWRpcmVjdGVkQ291dDsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHJlZGlyZWN0ZWRDZXJyOworCisgICAgICAgICAgICBUZXN0Q2FzZUluZm8gdGVzdEluZm8gPSB0ZXN0Q2FzZS5nZXRUZXN0Q2FzZUluZm8oKTsKKworICAgICAgICAgICAgbV9yZXBvcnRlci0+dGVzdENhc2VTdGFydGluZyggdGVzdEluZm8gKTsKKworICAgICAgICAgICAgbV9hY3RpdmVUZXN0Q2FzZSA9ICZ0ZXN0Q2FzZTsKKworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIElUcmFja2VyJiByb290VHJhY2tlciA9IG1fdHJhY2tlckNvbnRleHQuc3RhcnRSdW4oKTsKKyAgICAgICAgICAgICAgICBhc3NlcnQoIHJvb3RUcmFja2VyLmlzU2VjdGlvblRyYWNrZXIoKSApOworICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PFNlY3Rpb25UcmFja2VyJj4oIHJvb3RUcmFja2VyICkuYWRkSW5pdGlhbEZpbHRlcnMoIG1fY29uZmlnLT5nZXRTZWN0aW9uc1RvUnVuKCkgKTsKKyAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgIG1fdHJhY2tlckNvbnRleHQuc3RhcnRDeWNsZSgpOworICAgICAgICAgICAgICAgICAgICBtX3Rlc3RDYXNlVHJhY2tlciA9ICZTZWN0aW9uVHJhY2tlcjo6YWNxdWlyZSggbV90cmFja2VyQ29udGV4dCwgVGVzdENhc2VUcmFja2luZzo6TmFtZUFuZExvY2F0aW9uKCB0ZXN0SW5mby5uYW1lLCB0ZXN0SW5mby5saW5lSW5mbyApICk7CisgICAgICAgICAgICAgICAgICAgIHJ1bkN1cnJlbnRUZXN0KCByZWRpcmVjdGVkQ291dCwgcmVkaXJlY3RlZENlcnIgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd2hpbGUoICFtX3Rlc3RDYXNlVHJhY2tlci0+aXNTdWNjZXNzZnVsbHlDb21wbGV0ZWQoKSAmJiAhYWJvcnRpbmcoKSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gIVRCRDogZGVwcmVjYXRlZCAtIHRoaXMgd2lsbCBiZSByZXBsYWNlZCBieSBpbmRleGVkIHRyYWNrZXJzCisgICAgICAgICAgICB3aGlsZSggZ2V0Q3VycmVudENvbnRleHQoKS5hZHZhbmNlR2VuZXJhdG9yc0ZvckN1cnJlbnRUZXN0KCkgJiYgIWFib3J0aW5nKCkgKTsKKworICAgICAgICAgICAgVG90YWxzIGRlbHRhVG90YWxzID0gbV90b3RhbHMuZGVsdGEoIHByZXZUb3RhbHMgKTsKKyAgICAgICAgICAgIGlmKCB0ZXN0SW5mby5leHBlY3RlZFRvRmFpbCgpICYmIGRlbHRhVG90YWxzLnRlc3RDYXNlcy5wYXNzZWQgPiAwICkgeworICAgICAgICAgICAgICAgIGRlbHRhVG90YWxzLmFzc2VydGlvbnMuZmFpbGVkKys7CisgICAgICAgICAgICAgICAgZGVsdGFUb3RhbHMudGVzdENhc2VzLnBhc3NlZC0tOworICAgICAgICAgICAgICAgIGRlbHRhVG90YWxzLnRlc3RDYXNlcy5mYWlsZWQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1fdG90YWxzLnRlc3RDYXNlcyArPSBkZWx0YVRvdGFscy50ZXN0Q2FzZXM7CisgICAgICAgICAgICBtX3JlcG9ydGVyLT50ZXN0Q2FzZUVuZGVkKCBUZXN0Q2FzZVN0YXRzKCAgIHRlc3RJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YVRvdGFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3RlZENvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0ZWRDZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYm9ydGluZygpICkgKTsKKworICAgICAgICAgICAgbV9hY3RpdmVUZXN0Q2FzZSA9IENBVENIX05VTEw7CisgICAgICAgICAgICBtX3Rlc3RDYXNlVHJhY2tlciA9IENBVENIX05VTEw7CisKKyAgICAgICAgICAgIHJldHVybiBkZWx0YVRvdGFsczsKKyAgICAgICAgfQorCisgICAgICAgIFB0cjxJQ29uZmlnIGNvbnN0PiBjb25maWcoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbV9jb25maWc7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6IC8vIElSZXN1bHRDYXB0dXJlCisKKyAgICAgICAgdmlydHVhbCB2b2lkIGFzc2VydGlvbkVuZGVkKCBBc3NlcnRpb25SZXN1bHQgY29uc3QmIHJlc3VsdCApIHsKKyAgICAgICAgICAgIGlmKCByZXN1bHQuZ2V0UmVzdWx0VHlwZSgpID09IFJlc3VsdFdhczo6T2sgKSB7CisgICAgICAgICAgICAgICAgbV90b3RhbHMuYXNzZXJ0aW9ucy5wYXNzZWQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoICFyZXN1bHQuaXNPaygpICkgeworICAgICAgICAgICAgICAgIG1fdG90YWxzLmFzc2VydGlvbnMuZmFpbGVkKys7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFdlIGhhdmUgbm8gdXNlIGZvciB0aGUgcmV0dXJuIHZhbHVlICh3aGV0aGVyIG1lc3NhZ2VzIHNob3VsZCBiZSBjbGVhcmVkKSwgYmVjYXVzZSBtZXNzYWdlcyB3ZXJlIG1hZGUgc2NvcGVkCisgICAgICAgICAgICAvLyBhbmQgc2hvdWxkIGJlIGxldCB0byBjbGVhciB0aGVtc2VsdmVzIG91dC4KKyAgICAgICAgICAgIHN0YXRpY19jYXN0PHZvaWQ+KG1fcmVwb3J0ZXItPmFzc2VydGlvbkVuZGVkKEFzc2VydGlvblN0YXRzKHJlc3VsdCwgbV9tZXNzYWdlcywgbV90b3RhbHMpKSk7CisKKyAgICAgICAgICAgIC8vIFJlc2V0IHdvcmtpbmcgc3RhdGUKKyAgICAgICAgICAgIG1fbGFzdEFzc2VydGlvbkluZm8gPSBBc3NlcnRpb25JbmZvKCBzdGQ6OnN0cmluZygpLCBtX2xhc3RBc3NlcnRpb25JbmZvLmxpbmVJbmZvLCAie1Vua25vd24gZXhwcmVzc2lvbiBhZnRlciB0aGUgcmVwb3J0ZWQgbGluZX0iICwgbV9sYXN0QXNzZXJ0aW9uSW5mby5yZXN1bHREaXNwb3NpdGlvbiApOworICAgICAgICAgICAgbV9sYXN0UmVzdWx0ID0gcmVzdWx0OworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCBib29sIHNlY3Rpb25TdGFydGVkICgKKyAgICAgICAgICAgIFNlY3Rpb25JbmZvIGNvbnN0JiBzZWN0aW9uSW5mbywKKyAgICAgICAgICAgIENvdW50cyYgYXNzZXJ0aW9ucworICAgICAgICApCisgICAgICAgIHsKKyAgICAgICAgICAgIElUcmFja2VyJiBzZWN0aW9uVHJhY2tlciA9IFNlY3Rpb25UcmFja2VyOjphY3F1aXJlKCBtX3RyYWNrZXJDb250ZXh0LCBUZXN0Q2FzZVRyYWNraW5nOjpOYW1lQW5kTG9jYXRpb24oIHNlY3Rpb25JbmZvLm5hbWUsIHNlY3Rpb25JbmZvLmxpbmVJbmZvICkgKTsKKyAgICAgICAgICAgIGlmKCAhc2VjdGlvblRyYWNrZXIuaXNPcGVuKCkgKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIG1fYWN0aXZlU2VjdGlvbnMucHVzaF9iYWNrKCAmc2VjdGlvblRyYWNrZXIgKTsKKworICAgICAgICAgICAgbV9sYXN0QXNzZXJ0aW9uSW5mby5saW5lSW5mbyA9IHNlY3Rpb25JbmZvLmxpbmVJbmZvOworCisgICAgICAgICAgICBtX3JlcG9ydGVyLT5zZWN0aW9uU3RhcnRpbmcoIHNlY3Rpb25JbmZvICk7CisKKyAgICAgICAgICAgIGFzc2VydGlvbnMgPSBtX3RvdGFscy5hc3NlcnRpb25zOworCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBib29sIHRlc3RGb3JNaXNzaW5nQXNzZXJ0aW9ucyggQ291bnRzJiBhc3NlcnRpb25zICkgeworICAgICAgICAgICAgaWYoIGFzc2VydGlvbnMudG90YWwoKSAhPSAwICkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBpZiggIW1fY29uZmlnLT53YXJuQWJvdXRNaXNzaW5nQXNzZXJ0aW9ucygpICkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBpZiggbV90cmFja2VyQ29udGV4dC5jdXJyZW50VHJhY2tlcigpLmhhc0NoaWxkcmVuKCkgKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIG1fdG90YWxzLmFzc2VydGlvbnMuZmFpbGVkKys7CisgICAgICAgICAgICBhc3NlcnRpb25zLmZhaWxlZCsrOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgc2VjdGlvbkVuZGVkKCBTZWN0aW9uRW5kSW5mbyBjb25zdCYgZW5kSW5mbyApIHsKKyAgICAgICAgICAgIENvdW50cyBhc3NlcnRpb25zID0gbV90b3RhbHMuYXNzZXJ0aW9ucyAtIGVuZEluZm8ucHJldkFzc2VydGlvbnM7CisgICAgICAgICAgICBib29sIG1pc3NpbmdBc3NlcnRpb25zID0gdGVzdEZvck1pc3NpbmdBc3NlcnRpb25zKCBhc3NlcnRpb25zICk7CisKKyAgICAgICAgICAgIGlmKCAhbV9hY3RpdmVTZWN0aW9ucy5lbXB0eSgpICkgeworICAgICAgICAgICAgICAgIG1fYWN0aXZlU2VjdGlvbnMuYmFjaygpLT5jbG9zZSgpOworICAgICAgICAgICAgICAgIG1fYWN0aXZlU2VjdGlvbnMucG9wX2JhY2soKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbV9yZXBvcnRlci0+c2VjdGlvbkVuZGVkKCBTZWN0aW9uU3RhdHMoIGVuZEluZm8uc2VjdGlvbkluZm8sIGFzc2VydGlvbnMsIGVuZEluZm8uZHVyYXRpb25JblNlY29uZHMsIG1pc3NpbmdBc3NlcnRpb25zICkgKTsKKyAgICAgICAgICAgIG1fbWVzc2FnZXMuY2xlYXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBzZWN0aW9uRW5kZWRFYXJseSggU2VjdGlvbkVuZEluZm8gY29uc3QmIGVuZEluZm8gKSB7CisgICAgICAgICAgICBpZiggbV91bmZpbmlzaGVkU2VjdGlvbnMuZW1wdHkoKSApCisgICAgICAgICAgICAgICAgbV9hY3RpdmVTZWN0aW9ucy5iYWNrKCktPmZhaWwoKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBtX2FjdGl2ZVNlY3Rpb25zLmJhY2soKS0+Y2xvc2UoKTsKKyAgICAgICAgICAgIG1fYWN0aXZlU2VjdGlvbnMucG9wX2JhY2soKTsKKworICAgICAgICAgICAgbV91bmZpbmlzaGVkU2VjdGlvbnMucHVzaF9iYWNrKCBlbmRJbmZvICk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgcHVzaFNjb3BlZE1lc3NhZ2UoIE1lc3NhZ2VJbmZvIGNvbnN0JiBtZXNzYWdlICkgeworICAgICAgICAgICAgbV9tZXNzYWdlcy5wdXNoX2JhY2soIG1lc3NhZ2UgKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBwb3BTY29wZWRNZXNzYWdlKCBNZXNzYWdlSW5mbyBjb25zdCYgbWVzc2FnZSApIHsKKyAgICAgICAgICAgIG1fbWVzc2FnZXMuZXJhc2UoIHN0ZDo6cmVtb3ZlKCBtX21lc3NhZ2VzLmJlZ2luKCksIG1fbWVzc2FnZXMuZW5kKCksIG1lc3NhZ2UgKSwgbV9tZXNzYWdlcy5lbmQoKSApOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXRDdXJyZW50VGVzdE5hbWUoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbV9hY3RpdmVUZXN0Q2FzZQorICAgICAgICAgICAgICAgID8gbV9hY3RpdmVUZXN0Q2FzZS0+Z2V0VGVzdENhc2VJbmZvKCkubmFtZQorICAgICAgICAgICAgICAgIDogc3RkOjpzdHJpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgY29uc3QgQXNzZXJ0aW9uUmVzdWx0KiBnZXRMYXN0UmVzdWx0KCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuICZtX2xhc3RSZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgZXhjZXB0aW9uRWFybHlSZXBvcnRlZCgpIHsKKyAgICAgICAgICAgIG1fc2hvdWxkUmVwb3J0VW5leHBlY3RlZCA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIGhhbmRsZUZhdGFsRXJyb3JDb25kaXRpb24oIHN0ZDo6c3RyaW5nIGNvbnN0JiBtZXNzYWdlICkgeworICAgICAgICAgICAgLy8gRG9uJ3QgcmVidWlsZCB0aGUgcmVzdWx0IC0tIHRoZSBzdHJpbmdpZmljYXRpb24gaXRzZWxmIGNhbiBjYXVzZSBtb3JlIGZhdGFsIGVycm9ycworICAgICAgICAgICAgLy8gSW5zdGVhZCwgZmFrZSBhIHJlc3VsdCBkYXRhLgorICAgICAgICAgICAgQXNzZXJ0aW9uUmVzdWx0RGF0YSB0ZW1wUmVzdWx0OworICAgICAgICAgICAgdGVtcFJlc3VsdC5yZXN1bHRUeXBlID0gUmVzdWx0V2FzOjpGYXRhbEVycm9yQ29uZGl0aW9uOworICAgICAgICAgICAgdGVtcFJlc3VsdC5tZXNzYWdlID0gbWVzc2FnZTsKKyAgICAgICAgICAgIEFzc2VydGlvblJlc3VsdCByZXN1bHQobV9sYXN0QXNzZXJ0aW9uSW5mbywgdGVtcFJlc3VsdCk7CisKKyAgICAgICAgICAgIGdldFJlc3VsdENhcHR1cmUoKS5hc3NlcnRpb25FbmRlZChyZXN1bHQpOworCisgICAgICAgICAgICBoYW5kbGVVbmZpbmlzaGVkU2VjdGlvbnMoKTsKKworICAgICAgICAgICAgLy8gUmVjcmVhdGUgc2VjdGlvbiBmb3IgdGVzdCBjYXNlIChhcyB3ZSB3aWxsIGxvc2UgdGhlIG9uZSB0aGF0IHdhcyBpbiBzY29wZSkKKyAgICAgICAgICAgIFRlc3RDYXNlSW5mbyBjb25zdCYgdGVzdENhc2VJbmZvID0gbV9hY3RpdmVUZXN0Q2FzZS0+Z2V0VGVzdENhc2VJbmZvKCk7CisgICAgICAgICAgICBTZWN0aW9uSW5mbyB0ZXN0Q2FzZVNlY3Rpb24oIHRlc3RDYXNlSW5mby5saW5lSW5mbywgdGVzdENhc2VJbmZvLm5hbWUsIHRlc3RDYXNlSW5mby5kZXNjcmlwdGlvbiApOworCisgICAgICAgICAgICBDb3VudHMgYXNzZXJ0aW9uczsKKyAgICAgICAgICAgIGFzc2VydGlvbnMuZmFpbGVkID0gMTsKKyAgICAgICAgICAgIFNlY3Rpb25TdGF0cyB0ZXN0Q2FzZVNlY3Rpb25TdGF0cyggdGVzdENhc2VTZWN0aW9uLCBhc3NlcnRpb25zLCAwLCBmYWxzZSApOworICAgICAgICAgICAgbV9yZXBvcnRlci0+c2VjdGlvbkVuZGVkKCB0ZXN0Q2FzZVNlY3Rpb25TdGF0cyApOworCisgICAgICAgICAgICBUZXN0Q2FzZUluZm8gdGVzdEluZm8gPSBtX2FjdGl2ZVRlc3RDYXNlLT5nZXRUZXN0Q2FzZUluZm8oKTsKKworICAgICAgICAgICAgVG90YWxzIGRlbHRhVG90YWxzOworICAgICAgICAgICAgZGVsdGFUb3RhbHMudGVzdENhc2VzLmZhaWxlZCA9IDE7CisgICAgICAgICAgICBtX3JlcG9ydGVyLT50ZXN0Q2FzZUVuZGVkKCBUZXN0Q2FzZVN0YXRzKCAgIHRlc3RJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YVRvdGFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgKSApOworICAgICAgICAgICAgbV90b3RhbHMudGVzdENhc2VzLmZhaWxlZCsrOworICAgICAgICAgICAgdGVzdEdyb3VwRW5kZWQoIHN0ZDo6c3RyaW5nKCksIG1fdG90YWxzLCAxLCAxICk7CisgICAgICAgICAgICBtX3JlcG9ydGVyLT50ZXN0UnVuRW5kZWQoIFRlc3RSdW5TdGF0cyggbV9ydW5JbmZvLCBtX3RvdGFscywgZmFsc2UgKSApOworICAgICAgICB9CisKKyAgICBwdWJsaWM6CisgICAgICAgIC8vICFUQkQgV2UgbmVlZCB0byBkbyB0aGlzIGFub3RoZXIgd2F5IQorICAgICAgICBib29sIGFib3J0aW5nKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1fdG90YWxzLmFzc2VydGlvbnMuZmFpbGVkID09IHN0YXRpY19jYXN0PHN0ZDo6c2l6ZV90PiggbV9jb25maWctPmFib3J0QWZ0ZXIoKSApOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorCisgICAgICAgIHZvaWQgcnVuQ3VycmVudFRlc3QoIHN0ZDo6c3RyaW5nJiByZWRpcmVjdGVkQ291dCwgc3RkOjpzdHJpbmcmIHJlZGlyZWN0ZWRDZXJyICkgeworICAgICAgICAgICAgVGVzdENhc2VJbmZvIGNvbnN0JiB0ZXN0Q2FzZUluZm8gPSBtX2FjdGl2ZVRlc3RDYXNlLT5nZXRUZXN0Q2FzZUluZm8oKTsKKyAgICAgICAgICAgIFNlY3Rpb25JbmZvIHRlc3RDYXNlU2VjdGlvbiggdGVzdENhc2VJbmZvLmxpbmVJbmZvLCB0ZXN0Q2FzZUluZm8ubmFtZSwgdGVzdENhc2VJbmZvLmRlc2NyaXB0aW9uICk7CisgICAgICAgICAgICBtX3JlcG9ydGVyLT5zZWN0aW9uU3RhcnRpbmcoIHRlc3RDYXNlU2VjdGlvbiApOworICAgICAgICAgICAgQ291bnRzIHByZXZBc3NlcnRpb25zID0gbV90b3RhbHMuYXNzZXJ0aW9uczsKKyAgICAgICAgICAgIGRvdWJsZSBkdXJhdGlvbiA9IDA7CisgICAgICAgICAgICBtX3Nob3VsZFJlcG9ydFVuZXhwZWN0ZWQgPSB0cnVlOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtX2xhc3RBc3NlcnRpb25JbmZvID0gQXNzZXJ0aW9uSW5mbyggIlRFU1RfQ0FTRSIsIHRlc3RDYXNlSW5mby5saW5lSW5mbywgc3RkOjpzdHJpbmcoKSwgUmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCApOworCisgICAgICAgICAgICAgICAgc2VlZFJuZyggKm1fY29uZmlnICk7CisKKyAgICAgICAgICAgICAgICBUaW1lciB0aW1lcjsKKyAgICAgICAgICAgICAgICB0aW1lci5zdGFydCgpOworICAgICAgICAgICAgICAgIGlmKCBtX3JlcG9ydGVyLT5nZXRQcmVmZXJlbmNlcygpLnNob3VsZFJlZGlyZWN0U3RkT3V0ICkgeworICAgICAgICAgICAgICAgICAgICBTdHJlYW1SZWRpcmVjdCBjb3V0UmVkaXIoIENhdGNoOjpjb3V0KCksIHJlZGlyZWN0ZWRDb3V0ICk7CisgICAgICAgICAgICAgICAgICAgIFN0cmVhbVJlZGlyZWN0IGNlcnJSZWRpciggQ2F0Y2g6OmNlcnIoKSwgcmVkaXJlY3RlZENlcnIgKTsKKyAgICAgICAgICAgICAgICAgICAgaW52b2tlQWN0aXZlVGVzdENhc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGludm9rZUFjdGl2ZVRlc3RDYXNlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGR1cmF0aW9uID0gdGltZXIuZ2V0RWxhcHNlZFNlY29uZHMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoKCBUZXN0RmFpbHVyZUV4Y2VwdGlvbiYgKSB7CisgICAgICAgICAgICAgICAgLy8gVGhpcyBqdXN0IG1lYW5zIHRoZSB0ZXN0IHdhcyBhYm9ydGVkIGR1ZSB0byBmYWlsdXJlCisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCguLi4pIHsKKyAgICAgICAgICAgICAgICAvLyBVbmRlciBDQVRDSF9DT05GSUdfRkFTVF9DT01QSUxFLCB1bmV4cGVjdGVkIGV4Y2VwdGlvbnMgdW5kZXIgUkVRVUlSRSBhc3NlcnRpb25zCisgICAgICAgICAgICAgICAgLy8gYXJlIHJlcG9ydGVkIHdpdGhvdXQgdHJhbnNsYXRpb24gYXQgdGhlIHBvaW50IG9mIG9yaWdpbi4KKyAgICAgICAgICAgICAgICBpZiAobV9zaG91bGRSZXBvcnRVbmV4cGVjdGVkKSB7CisgICAgICAgICAgICAgICAgICAgIG1ha2VVbmV4cGVjdGVkUmVzdWx0QnVpbGRlcigpLnVzZUFjdGl2ZUV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1fdGVzdENhc2VUcmFja2VyLT5jbG9zZSgpOworICAgICAgICAgICAgaGFuZGxlVW5maW5pc2hlZFNlY3Rpb25zKCk7CisgICAgICAgICAgICBtX21lc3NhZ2VzLmNsZWFyKCk7CisKKyAgICAgICAgICAgIENvdW50cyBhc3NlcnRpb25zID0gbV90b3RhbHMuYXNzZXJ0aW9ucyAtIHByZXZBc3NlcnRpb25zOworICAgICAgICAgICAgYm9vbCBtaXNzaW5nQXNzZXJ0aW9ucyA9IHRlc3RGb3JNaXNzaW5nQXNzZXJ0aW9ucyggYXNzZXJ0aW9ucyApOworCisgICAgICAgICAgICBpZiggdGVzdENhc2VJbmZvLm9rVG9GYWlsKCkgKSB7CisgICAgICAgICAgICAgICAgc3RkOjpzd2FwKCBhc3NlcnRpb25zLmZhaWxlZEJ1dE9rLCBhc3NlcnRpb25zLmZhaWxlZCApOworICAgICAgICAgICAgICAgIG1fdG90YWxzLmFzc2VydGlvbnMuZmFpbGVkIC09IGFzc2VydGlvbnMuZmFpbGVkQnV0T2s7CisgICAgICAgICAgICAgICAgbV90b3RhbHMuYXNzZXJ0aW9ucy5mYWlsZWRCdXRPayArPSBhc3NlcnRpb25zLmZhaWxlZEJ1dE9rOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTZWN0aW9uU3RhdHMgdGVzdENhc2VTZWN0aW9uU3RhdHMoIHRlc3RDYXNlU2VjdGlvbiwgYXNzZXJ0aW9ucywgZHVyYXRpb24sIG1pc3NpbmdBc3NlcnRpb25zICk7CisgICAgICAgICAgICBtX3JlcG9ydGVyLT5zZWN0aW9uRW5kZWQoIHRlc3RDYXNlU2VjdGlvblN0YXRzICk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGludm9rZUFjdGl2ZVRlc3RDYXNlKCkgeworICAgICAgICAgICAgRmF0YWxDb25kaXRpb25IYW5kbGVyIGZhdGFsQ29uZGl0aW9uSGFuZGxlcjsgLy8gSGFuZGxlIHNpZ25hbHMKKyAgICAgICAgICAgIG1fYWN0aXZlVGVzdENhc2UtPmludm9rZSgpOworICAgICAgICAgICAgZmF0YWxDb25kaXRpb25IYW5kbGVyLnJlc2V0KCk7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisKKyAgICAgICAgUmVzdWx0QnVpbGRlciBtYWtlVW5leHBlY3RlZFJlc3VsdEJ1aWxkZXIoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gUmVzdWx0QnVpbGRlciggICBtX2xhc3RBc3NlcnRpb25JbmZvLm1hY3JvTmFtZS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9sYXN0QXNzZXJ0aW9uSW5mby5saW5lSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fbGFzdEFzc2VydGlvbkluZm8uY2FwdHVyZWRFeHByZXNzaW9uLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2xhc3RBc3NlcnRpb25JbmZvLnJlc3VsdERpc3Bvc2l0aW9uICk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGhhbmRsZVVuZmluaXNoZWRTZWN0aW9ucygpIHsKKyAgICAgICAgICAgIC8vIElmIHNlY3Rpb25zIGVuZGVkIHByZW1hdHVyZWx5IGR1ZSB0byBhbiBleGNlcHRpb24gd2Ugc3RvcmVkIHRoZWlyCisgICAgICAgICAgICAvLyBpbmZvcyBoZXJlIHNvIHdlIGNhbiB0ZWFyIHRoZW0gZG93biBvdXRzaWRlIHRoZSB1bndpbmQgcHJvY2Vzcy4KKyAgICAgICAgICAgIGZvciggc3RkOjp2ZWN0b3I8U2VjdGlvbkVuZEluZm8+Ojpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIGl0ID0gbV91bmZpbmlzaGVkU2VjdGlvbnMucmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICBpdEVuZCA9IG1fdW5maW5pc2hlZFNlY3Rpb25zLnJlbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgICAgICsraXQgKQorICAgICAgICAgICAgICAgIHNlY3Rpb25FbmRlZCggKml0ICk7CisgICAgICAgICAgICBtX3VuZmluaXNoZWRTZWN0aW9ucy5jbGVhcigpOworICAgICAgICB9CisKKyAgICAgICAgVGVzdFJ1bkluZm8gbV9ydW5JbmZvOworICAgICAgICBJTXV0YWJsZUNvbnRleHQmIG1fY29udGV4dDsKKyAgICAgICAgVGVzdENhc2UgY29uc3QqIG1fYWN0aXZlVGVzdENhc2U7CisgICAgICAgIElUcmFja2VyKiBtX3Rlc3RDYXNlVHJhY2tlcjsKKyAgICAgICAgSVRyYWNrZXIqIG1fY3VycmVudFNlY3Rpb25UcmFja2VyOworICAgICAgICBBc3NlcnRpb25SZXN1bHQgbV9sYXN0UmVzdWx0OworCisgICAgICAgIFB0cjxJQ29uZmlnIGNvbnN0PiBtX2NvbmZpZzsKKyAgICAgICAgVG90YWxzIG1fdG90YWxzOworICAgICAgICBQdHI8SVN0cmVhbWluZ1JlcG9ydGVyPiBtX3JlcG9ydGVyOworICAgICAgICBzdGQ6OnZlY3RvcjxNZXNzYWdlSW5mbz4gbV9tZXNzYWdlczsKKyAgICAgICAgQXNzZXJ0aW9uSW5mbyBtX2xhc3RBc3NlcnRpb25JbmZvOworICAgICAgICBzdGQ6OnZlY3RvcjxTZWN0aW9uRW5kSW5mbz4gbV91bmZpbmlzaGVkU2VjdGlvbnM7CisgICAgICAgIHN0ZDo6dmVjdG9yPElUcmFja2VyKj4gbV9hY3RpdmVTZWN0aW9uczsKKyAgICAgICAgVHJhY2tlckNvbnRleHQgbV90cmFja2VyQ29udGV4dDsKKyAgICAgICAgYm9vbCBtX3Nob3VsZFJlcG9ydFVuZXhwZWN0ZWQ7CisgICAgfTsKKworICAgIElSZXN1bHRDYXB0dXJlJiBnZXRSZXN1bHRDYXB0dXJlKCkgeworICAgICAgICBpZiggSVJlc3VsdENhcHR1cmUqIGNhcHR1cmUgPSBnZXRDdXJyZW50Q29udGV4dCgpLmdldFJlc3VsdENhcHR1cmUoKSApCisgICAgICAgICAgICByZXR1cm4gKmNhcHR1cmU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRocm93IHN0ZDo6bG9naWNfZXJyb3IoICJObyByZXN1bHQgY2FwdHVyZSBpbnN0YW5jZSIgKTsKKyAgICB9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogaW50ZXJuYWwvY2F0Y2hfdmVyc2lvbi5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9WRVJTSU9OX0hfSU5DTFVERUQKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIC8vIFZlcnNpb25pbmcgaW5mb3JtYXRpb24KKyAgICBzdHJ1Y3QgVmVyc2lvbiB7CisgICAgICAgIFZlcnNpb24oICAgIHVuc2lnbmVkIGludCBfbWFqb3JWZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgX21pbm9yVmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IF9wYXRjaE51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgY2hhciBjb25zdCAqIGNvbnN0IF9icmFuY2hOYW1lLAorICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgX2J1aWxkTnVtYmVyICk7CisKKyAgICAgICAgdW5zaWduZWQgaW50IGNvbnN0IG1ham9yVmVyc2lvbjsKKyAgICAgICAgdW5zaWduZWQgaW50IGNvbnN0IG1pbm9yVmVyc2lvbjsKKyAgICAgICAgdW5zaWduZWQgaW50IGNvbnN0IHBhdGNoTnVtYmVyOworCisgICAgICAgIC8vIGJ1aWxkTnVtYmVyIGlzIG9ubHkgdXNlZCBpZiBicmFuY2hOYW1lIGlzIG5vdCBudWxsCisgICAgICAgIGNoYXIgY29uc3QgKiBjb25zdCBicmFuY2hOYW1lOworICAgICAgICB1bnNpZ25lZCBpbnQgY29uc3QgYnVpbGROdW1iZXI7CisKKyAgICAgICAgZnJpZW5kIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3IgPDwgKCBzdGQ6Om9zdHJlYW0mIG9zLCBWZXJzaW9uIGNvbnN0JiB2ZXJzaW9uICk7CisKKyAgICBwcml2YXRlOgorICAgICAgICB2b2lkIG9wZXJhdG9yPSggVmVyc2lvbiBjb25zdCYgKTsKKyAgICB9OworCisgICAgaW5saW5lIFZlcnNpb24gbGlicmFyeVZlcnNpb24oKTsKK30KKworI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8bGltaXRzPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgUHRyPElTdHJlYW1pbmdSZXBvcnRlcj4gY3JlYXRlUmVwb3J0ZXIoIHN0ZDo6c3RyaW5nIGNvbnN0JiByZXBvcnRlck5hbWUsIFB0cjxDb25maWc+IGNvbnN0JiBjb25maWcgKSB7CisgICAgICAgIFB0cjxJU3RyZWFtaW5nUmVwb3J0ZXI+IHJlcG9ydGVyID0gZ2V0UmVnaXN0cnlIdWIoKS5nZXRSZXBvcnRlclJlZ2lzdHJ5KCkuY3JlYXRlKCByZXBvcnRlck5hbWUsIGNvbmZpZy5nZXQoKSApOworICAgICAgICBpZiggIXJlcG9ydGVyICkgeworICAgICAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICAgICAgICAgIG9zcyA8PCAiTm8gcmVwb3J0ZXIgcmVnaXN0ZXJlZCB3aXRoIG5hbWU6ICciIDw8IHJlcG9ydGVyTmFtZSA8PCAiJyI7CisgICAgICAgICAgICB0aHJvdyBzdGQ6OmRvbWFpbl9lcnJvciggb3NzLnN0cigpICk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlcG9ydGVyOworICAgIH0KKworICAgIFB0cjxJU3RyZWFtaW5nUmVwb3J0ZXI+IG1ha2VSZXBvcnRlciggUHRyPENvbmZpZz4gY29uc3QmIGNvbmZpZyApIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHJlcG9ydGVycyA9IGNvbmZpZy0+Z2V0UmVwb3J0ZXJOYW1lcygpOworICAgICAgICBpZiggcmVwb3J0ZXJzLmVtcHR5KCkgKQorICAgICAgICAgICAgcmVwb3J0ZXJzLnB1c2hfYmFjayggImNvbnNvbGUiICk7CisKKyAgICAgICAgUHRyPElTdHJlYW1pbmdSZXBvcnRlcj4gcmVwb3J0ZXI7CisgICAgICAgIGZvciggc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdCA9IHJlcG9ydGVycy5iZWdpbigpLCBpdEVuZCA9IHJlcG9ydGVycy5lbmQoKTsKKyAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICArK2l0ICkKKyAgICAgICAgICAgIHJlcG9ydGVyID0gYWRkUmVwb3J0ZXIoIHJlcG9ydGVyLCBjcmVhdGVSZXBvcnRlciggKml0LCBjb25maWcgKSApOworICAgICAgICByZXR1cm4gcmVwb3J0ZXI7CisgICAgfQorICAgIFB0cjxJU3RyZWFtaW5nUmVwb3J0ZXI+IGFkZExpc3RlbmVycyggUHRyPElDb25maWcgY29uc3Q+IGNvbnN0JiBjb25maWcsIFB0cjxJU3RyZWFtaW5nUmVwb3J0ZXI+IHJlcG9ydGVycyApIHsKKyAgICAgICAgSVJlcG9ydGVyUmVnaXN0cnk6Okxpc3RlbmVycyBsaXN0ZW5lcnMgPSBnZXRSZWdpc3RyeUh1YigpLmdldFJlcG9ydGVyUmVnaXN0cnkoKS5nZXRMaXN0ZW5lcnMoKTsKKyAgICAgICAgZm9yKCBJUmVwb3J0ZXJSZWdpc3RyeTo6TGlzdGVuZXJzOjpjb25zdF9pdGVyYXRvciBpdCA9IGxpc3RlbmVycy5iZWdpbigpLCBpdEVuZCA9IGxpc3RlbmVycy5lbmQoKTsKKyAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICArK2l0ICkKKyAgICAgICAgICAgIHJlcG9ydGVycyA9IGFkZFJlcG9ydGVyKHJlcG9ydGVycywgKCppdCktPmNyZWF0ZSggUmVwb3J0ZXJDb25maWcoIGNvbmZpZyApICkgKTsKKyAgICAgICAgcmV0dXJuIHJlcG9ydGVyczsKKyAgICB9CisKKyAgICBUb3RhbHMgcnVuVGVzdHMoIFB0cjxDb25maWc+IGNvbnN0JiBjb25maWcgKSB7CisKKyAgICAgICAgUHRyPElDb25maWcgY29uc3Q+IGljb25maWcgPSBjb25maWcuZ2V0KCk7CisKKyAgICAgICAgUHRyPElTdHJlYW1pbmdSZXBvcnRlcj4gcmVwb3J0ZXIgPSBtYWtlUmVwb3J0ZXIoIGNvbmZpZyApOworICAgICAgICByZXBvcnRlciA9IGFkZExpc3RlbmVycyggaWNvbmZpZywgcmVwb3J0ZXIgKTsKKworICAgICAgICBSdW5Db250ZXh0IGNvbnRleHQoIGljb25maWcsIHJlcG9ydGVyICk7CisKKyAgICAgICAgVG90YWxzIHRvdGFsczsKKworICAgICAgICBjb250ZXh0LnRlc3RHcm91cFN0YXJ0aW5nKCBjb25maWctPm5hbWUoKSwgMSwgMSApOworCisgICAgICAgIFRlc3RTcGVjIHRlc3RTcGVjID0gY29uZmlnLT50ZXN0U3BlYygpOworICAgICAgICBpZiggIXRlc3RTcGVjLmhhc0ZpbHRlcnMoKSApCisgICAgICAgICAgICB0ZXN0U3BlYyA9IFRlc3RTcGVjUGFyc2VyKCBJVGFnQWxpYXNSZWdpc3RyeTo6Z2V0KCkgKS5wYXJzZSggIn5bLl0iICkudGVzdFNwZWMoKTsgLy8gQWxsIG5vdCBoaWRkZW4gdGVzdHMKKworICAgICAgICBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gY29uc3QmIGFsbFRlc3RDYXNlcyA9IGdldEFsbFRlc3RDYXNlc1NvcnRlZCggKmljb25maWcgKTsKKyAgICAgICAgZm9yKCBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gYWxsVGVzdENhc2VzLmJlZ2luKCksIGl0RW5kID0gYWxsVGVzdENhc2VzLmVuZCgpOworICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICsraXQgKSB7CisgICAgICAgICAgICBpZiggIWNvbnRleHQuYWJvcnRpbmcoKSAmJiBtYXRjaFRlc3QoICppdCwgdGVzdFNwZWMsICppY29uZmlnICkgKQorICAgICAgICAgICAgICAgIHRvdGFscyArPSBjb250ZXh0LnJ1blRlc3QoICppdCApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJlcG9ydGVyLT5za2lwVGVzdCggKml0ICk7CisgICAgICAgIH0KKworICAgICAgICBjb250ZXh0LnRlc3RHcm91cEVuZGVkKCBpY29uZmlnLT5uYW1lKCksIHRvdGFscywgMSwgMSApOworICAgICAgICByZXR1cm4gdG90YWxzOworICAgIH0KKworICAgIHZvaWQgYXBwbHlGaWxlbmFtZXNBc1RhZ3MoIElDb25maWcgY29uc3QmIGNvbmZpZyApIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8VGVzdENhc2U+IGNvbnN0JiB0ZXN0cyA9IGdldEFsbFRlc3RDYXNlc1NvcnRlZCggY29uZmlnICk7CisgICAgICAgIGZvcihzdGQ6OnNpemVfdCBpID0gMDsgaSA8IHRlc3RzLnNpemUoKTsgKytpICkgeworICAgICAgICAgICAgVGVzdENhc2UmIHRlc3QgPSBjb25zdF9jYXN0PFRlc3RDYXNlJj4oIHRlc3RzW2ldICk7CisgICAgICAgICAgICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gdGFncyA9IHRlc3QudGFnczsKKworICAgICAgICAgICAgc3RkOjpzdHJpbmcgZmlsZW5hbWUgPSB0ZXN0LmxpbmVJbmZvLmZpbGU7CisgICAgICAgICAgICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIGxhc3RTbGFzaCA9IGZpbGVuYW1lLmZpbmRfbGFzdF9vZiggIlxcLyIgKTsKKyAgICAgICAgICAgIGlmKCBsYXN0U2xhc2ggIT0gc3RkOjpzdHJpbmc6Om5wb3MgKQorICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gZmlsZW5hbWUuc3Vic3RyKCBsYXN0U2xhc2grMSApOworCisgICAgICAgICAgICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIGxhc3REb3QgPSBmaWxlbmFtZS5maW5kX2xhc3Rfb2YoICIuIiApOworICAgICAgICAgICAgaWYoIGxhc3REb3QgIT0gc3RkOjpzdHJpbmc6Om5wb3MgKQorICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gZmlsZW5hbWUuc3Vic3RyKCAwLCBsYXN0RG90ICk7CisKKyAgICAgICAgICAgIHRhZ3MuaW5zZXJ0KCAiIyIgKyBmaWxlbmFtZSApOworICAgICAgICAgICAgc2V0VGFncyggdGVzdCwgdGFncyApOworICAgICAgICB9CisgICAgfQorCisgICAgY2xhc3MgU2Vzc2lvbiA6IE5vbkNvcHlhYmxlIHsKKyAgICAgICAgc3RhdGljIGJvb2wgYWxyZWFkeUluc3RhbnRpYXRlZDsKKworICAgIHB1YmxpYzoKKworICAgICAgICBzdHJ1Y3QgT25VbnVzZWRPcHRpb25zIHsgZW51bSBEb1doYXQgeyBJZ25vcmUsIEZhaWwgfTsgfTsKKworICAgICAgICBTZXNzaW9uKCkKKyAgICAgICAgOiBtX2NsaSggbWFrZUNvbW1hbmRMaW5lUGFyc2VyKCkgKSB7CisgICAgICAgICAgICBpZiggYWxyZWFkeUluc3RhbnRpYXRlZCApIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBtc2cgPSAiT25seSBvbmUgaW5zdGFuY2Ugb2YgQ2F0Y2g6OlNlc3Npb24gY2FuIGV2ZXIgYmUgdXNlZCI7CisgICAgICAgICAgICAgICAgQ2F0Y2g6OmNlcnIoKSA8PCBtc2cgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgICAgIHRocm93IHN0ZDo6bG9naWNfZXJyb3IoIG1zZyApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYWxyZWFkeUluc3RhbnRpYXRlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgflNlc3Npb24oKSB7CisgICAgICAgICAgICBDYXRjaDo6Y2xlYW5VcCgpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBzaG93SGVscCggc3RkOjpzdHJpbmcgY29uc3QmIHByb2Nlc3NOYW1lICkgeworICAgICAgICAgICAgQ2F0Y2g6OmNvdXQoKSA8PCAiXG5DYXRjaCB2IiA8PCBsaWJyYXJ5VmVyc2lvbigpIDw8ICJcbiI7CisKKyAgICAgICAgICAgIG1fY2xpLnVzYWdlKCBDYXRjaDo6Y291dCgpLCBwcm9jZXNzTmFtZSApOworICAgICAgICAgICAgQ2F0Y2g6OmNvdXQoKSA8PCAiRm9yIG1vcmUgZGV0YWlsIHVzYWdlIHBsZWFzZSBzZWUgdGhlIHByb2plY3QgZG9jc1xuIiA8PCBzdGQ6OmVuZGw7CisgICAgICAgIH0KKworICAgICAgICBpbnQgYXBwbHlDb21tYW5kTGluZSggaW50IGFyZ2MsIGNoYXIgY29uc3QqIGNvbnN0KiBjb25zdCBhcmd2LCBPblVudXNlZE9wdGlvbnM6OkRvV2hhdCB1bnVzZWRPcHRpb25CZWhhdmlvdXIgPSBPblVudXNlZE9wdGlvbnM6OkZhaWwgKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1fY2xpLnNldFRocm93T25VbnJlY29nbmlzZWRUb2tlbnMoIHVudXNlZE9wdGlvbkJlaGF2aW91ciA9PSBPblVudXNlZE9wdGlvbnM6OkZhaWwgKTsKKyAgICAgICAgICAgICAgICBtX3VudXNlZFRva2VucyA9IG1fY2xpLnBhcnNlSW50byggQ2xhcmE6OmFyZ3NUb1ZlY3RvciggYXJnYywgYXJndiApLCBtX2NvbmZpZ0RhdGEgKTsKKyAgICAgICAgICAgICAgICBpZiggbV9jb25maWdEYXRhLnNob3dIZWxwICkKKyAgICAgICAgICAgICAgICAgICAgc2hvd0hlbHAoIG1fY29uZmlnRGF0YS5wcm9jZXNzTmFtZSApOworICAgICAgICAgICAgICAgIG1fY29uZmlnLnJlc2V0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCggc3RkOjpleGNlcHRpb24mIGV4ICkgeworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29sb3VyIGNvbG91ckd1YXJkKCBDb2xvdXI6OlJlZCApOworICAgICAgICAgICAgICAgICAgICBDYXRjaDo6Y2VycigpCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAiXG5FcnJvcihzKSBpbiBpbnB1dDpcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IFRleHQoIGV4LndoYXQoKSwgVGV4dEF0dHJpYnV0ZXMoKS5zZXRJbmRlbnQoMikgKQorICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlxuXG4iOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtX2NsaS51c2FnZSggQ2F0Y2g6OmNvdXQoKSwgbV9jb25maWdEYXRhLnByb2Nlc3NOYW1lICk7CisgICAgICAgICAgICAgICAgcmV0dXJuIChzdGQ6Om51bWVyaWNfbGltaXRzPGludD46Om1heCkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCB1c2VDb25maWdEYXRhKCBDb25maWdEYXRhIGNvbnN0JiBfY29uZmlnRGF0YSApIHsKKyAgICAgICAgICAgIG1fY29uZmlnRGF0YSA9IF9jb25maWdEYXRhOworICAgICAgICAgICAgbV9jb25maWcucmVzZXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBydW4oIGludCBhcmdjLCBjaGFyIGNvbnN0KiBjb25zdCogY29uc3QgYXJndiApIHsKKworICAgICAgICAgICAgaW50IHJldHVybkNvZGUgPSBhcHBseUNvbW1hbmRMaW5lKCBhcmdjLCBhcmd2ICk7CisgICAgICAgICAgICBpZiggcmV0dXJuQ29kZSA9PSAwICkKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlID0gcnVuKCk7CisgICAgICAgICAgICByZXR1cm4gcmV0dXJuQ29kZTsKKyAgICAgICAgfQorCisgICAgI2lmIGRlZmluZWQoV0lOMzIpICYmIGRlZmluZWQoVU5JQ09ERSkKKyAgICAgICAgaW50IHJ1biggaW50IGFyZ2MsIHdjaGFyX3QgY29uc3QqIGNvbnN0KiBjb25zdCBhcmd2ICkgeworCisgICAgICAgICAgICBjaGFyICoqdXRmOEFyZ3YgPSBuZXcgY2hhciAqWyBhcmdjIF07CisKKyAgICAgICAgICAgIGZvciAoIGludCBpID0gMDsgaSA8IGFyZ2M7ICsraSApIHsKKyAgICAgICAgICAgICAgICBpbnQgYnVmU2l6ZSA9IFdpZGVDaGFyVG9NdWx0aUJ5dGUoIENQX1VURjgsIDAsIGFyZ3ZbaV0sIC0xLCBOVUxMLCAwLCBOVUxMLCBOVUxMICk7CisKKyAgICAgICAgICAgICAgICB1dGY4QXJndlsgaSBdID0gbmV3IGNoYXJbIGJ1ZlNpemUgXTsKKworICAgICAgICAgICAgICAgIFdpZGVDaGFyVG9NdWx0aUJ5dGUoIENQX1VURjgsIDAsIGFyZ3ZbaV0sIC0xLCB1dGY4QXJndltpXSwgYnVmU2l6ZSwgTlVMTCwgTlVMTCApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgcmV0dXJuQ29kZSA9IGFwcGx5Q29tbWFuZExpbmUoIGFyZ2MsIHV0ZjhBcmd2ICk7CisgICAgICAgICAgICBpZiggcmV0dXJuQ29kZSA9PSAwICkKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlID0gcnVuKCk7CisKKyAgICAgICAgICAgIGZvciAoIGludCBpID0gMDsgaSA8IGFyZ2M7ICsraSApCisgICAgICAgICAgICAgICAgZGVsZXRlIFtdIHV0ZjhBcmd2WyBpIF07CisKKyAgICAgICAgICAgIGRlbGV0ZSBbXSB1dGY4QXJndjsKKworICAgICAgICAgICAgcmV0dXJuIHJldHVybkNvZGU7CisgICAgICAgIH0KKyAgICAjZW5kaWYKKworICAgICAgICBpbnQgcnVuKCkgeworICAgICAgICAgICAgaWYoIG1fY29uZmlnRGF0YS5zaG93SGVscCApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbmZpZygpOyAvLyBGb3JjZSBjb25maWcgdG8gYmUgY29uc3RydWN0ZWQKKworICAgICAgICAgICAgICAgIHNlZWRSbmcoICptX2NvbmZpZyApOworCisgICAgICAgICAgICAgICAgaWYoIG1fY29uZmlnRGF0YS5maWxlbmFtZXNBc1RhZ3MgKQorICAgICAgICAgICAgICAgICAgICBhcHBseUZpbGVuYW1lc0FzVGFncyggKm1fY29uZmlnICk7CisKKyAgICAgICAgICAgICAgICAvLyBIYW5kbGUgbGlzdCByZXF1ZXN0CisgICAgICAgICAgICAgICAgaWYoIE9wdGlvbjxzdGQ6OnNpemVfdD4gbGlzdGVkID0gbGlzdCggY29uZmlnKCkgKSApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KCAqbGlzdGVkICk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PiggcnVuVGVzdHMoIG1fY29uZmlnICkuYXNzZXJ0aW9ucy5mYWlsZWQgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoKCBzdGQ6OmV4Y2VwdGlvbiYgZXggKSB7CisgICAgICAgICAgICAgICAgQ2F0Y2g6OmNlcnIoKSA8PCBleC53aGF0KCkgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgICAgIHJldHVybiAoc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptYXgpKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBDbGFyYTo6Q29tbWFuZExpbmU8Q29uZmlnRGF0YT4gY29uc3QmIGNsaSgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBtX2NsaTsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnZlY3RvcjxDbGFyYTo6UGFyc2VyOjpUb2tlbj4gY29uc3QmIHVudXNlZFRva2VucygpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBtX3VudXNlZFRva2VuczsKKyAgICAgICAgfQorICAgICAgICBDb25maWdEYXRhJiBjb25maWdEYXRhKCkgeworICAgICAgICAgICAgcmV0dXJuIG1fY29uZmlnRGF0YTsKKyAgICAgICAgfQorICAgICAgICBDb25maWcmIGNvbmZpZygpIHsKKyAgICAgICAgICAgIGlmKCAhbV9jb25maWcgKQorICAgICAgICAgICAgICAgIG1fY29uZmlnID0gbmV3IENvbmZpZyggbV9jb25maWdEYXRhICk7CisgICAgICAgICAgICByZXR1cm4gKm1fY29uZmlnOworICAgICAgICB9CisgICAgcHJpdmF0ZToKKyAgICAgICAgQ2xhcmE6OkNvbW1hbmRMaW5lPENvbmZpZ0RhdGE+IG1fY2xpOworICAgICAgICBzdGQ6OnZlY3RvcjxDbGFyYTo6UGFyc2VyOjpUb2tlbj4gbV91bnVzZWRUb2tlbnM7CisgICAgICAgIENvbmZpZ0RhdGEgbV9jb25maWdEYXRhOworICAgICAgICBQdHI8Q29uZmlnPiBtX2NvbmZpZzsKKyAgICB9OworCisgICAgYm9vbCBTZXNzaW9uOjphbHJlYWR5SW5zdGFudGlhdGVkID0gZmFsc2U7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfcmVnaXN0cnlfaHViLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfUkVHSVNUUllfSFVCX0hQUF9JTkNMVURFRAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfdGVzdF9jYXNlX3JlZ2lzdHJ5X2ltcGwuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9URVNUX0NBU0VfUkVHSVNUUllfSU1QTF9IUFBfSU5DTFVERUQKKworI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBzdHJ1Y3QgUmFuZG9tTnVtYmVyR2VuZXJhdG9yIHsKKyAgICAgICAgdHlwZWRlZiBzdGQ6OnB0cmRpZmZfdCByZXN1bHRfdHlwZTsKKworICAgICAgICByZXN1bHRfdHlwZSBvcGVyYXRvcigpKCByZXN1bHRfdHlwZSBuICkgY29uc3QgeyByZXR1cm4gc3RkOjpyYW5kKCkgJSBuOyB9CisKKyNpZmRlZiBDQVRDSF9DT05GSUdfQ1BQMTFfU0hVRkZMRQorICAgICAgICBzdGF0aWMgY29uc3RleHByIHJlc3VsdF90eXBlIG1pbigpIHsgcmV0dXJuIDA7IH0KKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciByZXN1bHRfdHlwZSBtYXgoKSB7IHJldHVybiAxMDAwMDAwOyB9CisgICAgICAgIHJlc3VsdF90eXBlIG9wZXJhdG9yKCkoKSBjb25zdCB7IHJldHVybiBzdGQ6OnJhbmQoKSAlIG1heCgpOyB9CisjZW5kaWYKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVj4KKyAgICAgICAgc3RhdGljIHZvaWQgc2h1ZmZsZSggViYgdmVjdG9yICkgeworICAgICAgICAgICAgUmFuZG9tTnVtYmVyR2VuZXJhdG9yIHJuZzsKKyNpZmRlZiBDQVRDSF9DT05GSUdfQ1BQMTFfU0hVRkZMRQorICAgICAgICAgICAgc3RkOjpzaHVmZmxlKCB2ZWN0b3IuYmVnaW4oKSwgdmVjdG9yLmVuZCgpLCBybmcgKTsKKyNlbHNlCisgICAgICAgICAgICBzdGQ6OnJhbmRvbV9zaHVmZmxlKCB2ZWN0b3IuYmVnaW4oKSwgdmVjdG9yLmVuZCgpLCBybmcgKTsKKyNlbmRpZgorICAgICAgICB9CisgICAgfTsKKworICAgIGlubGluZSBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gc29ydFRlc3RzKCBJQ29uZmlnIGNvbnN0JiBjb25maWcsIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPiBjb25zdCYgdW5zb3J0ZWRUZXN0Q2FzZXMgKSB7CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8VGVzdENhc2U+IHNvcnRlZCA9IHVuc29ydGVkVGVzdENhc2VzOworCisgICAgICAgIHN3aXRjaCggY29uZmlnLnJ1bk9yZGVyKCkgKSB7CisgICAgICAgICAgICBjYXNlIFJ1blRlc3RzOjpJbkxleGljb2dyYXBoaWNhbE9yZGVyOgorICAgICAgICAgICAgICAgIHN0ZDo6c29ydCggc29ydGVkLmJlZ2luKCksIHNvcnRlZC5lbmQoKSApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBSdW5UZXN0czo6SW5SYW5kb21PcmRlcjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNlZWRSbmcoIGNvbmZpZyApOworICAgICAgICAgICAgICAgICAgICBSYW5kb21OdW1iZXJHZW5lcmF0b3I6OnNodWZmbGUoIHNvcnRlZCApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUnVuVGVzdHM6OkluRGVjbGFyYXRpb25PcmRlcjoKKyAgICAgICAgICAgICAgICAvLyBhbHJlYWR5IGluIGRlY2xhcmF0aW9uIG9yZGVyCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNvcnRlZDsKKyAgICB9CisgICAgYm9vbCBtYXRjaFRlc3QoIFRlc3RDYXNlIGNvbnN0JiB0ZXN0Q2FzZSwgVGVzdFNwZWMgY29uc3QmIHRlc3RTcGVjLCBJQ29uZmlnIGNvbnN0JiBjb25maWcgKSB7CisgICAgICAgIHJldHVybiB0ZXN0U3BlYy5tYXRjaGVzKCB0ZXN0Q2FzZSApICYmICggY29uZmlnLmFsbG93VGhyb3dzKCkgfHwgIXRlc3RDYXNlLnRocm93cygpICk7CisgICAgfQorCisgICAgdm9pZCBlbmZvcmNlTm9EdXBsaWNhdGVUZXN0Q2FzZXMoIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPiBjb25zdCYgZnVuY3Rpb25zICkgeworICAgICAgICBzdGQ6OnNldDxUZXN0Q2FzZT4gc2VlbkZ1bmN0aW9uczsKKyAgICAgICAgZm9yKCBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gZnVuY3Rpb25zLmJlZ2luKCksIGl0RW5kID0gZnVuY3Rpb25zLmVuZCgpOworICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICArK2l0ICkgeworICAgICAgICAgICAgc3RkOjpwYWlyPHN0ZDo6c2V0PFRlc3RDYXNlPjo6Y29uc3RfaXRlcmF0b3IsIGJvb2w+IHByZXYgPSBzZWVuRnVuY3Rpb25zLmluc2VydCggKml0ICk7CisgICAgICAgICAgICBpZiggIXByZXYuc2Vjb25kICkgeworICAgICAgICAgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzczsKKworICAgICAgICAgICAgICAgIHNzICA8PCBDb2xvdXIoIENvbG91cjo6UmVkICkKKyAgICAgICAgICAgICAgICAgICAgPDwgImVycm9yOiBURVNUX0NBU0UoIFwiIiA8PCBpdC0+bmFtZSA8PCAiXCIgKSBhbHJlYWR5IGRlZmluZWQuXG4iCisgICAgICAgICAgICAgICAgICAgIDw8ICJcdEZpcnN0IHNlZW4gYXQgIiA8PCBwcmV2LmZpcnN0LT5nZXRUZXN0Q2FzZUluZm8oKS5saW5lSW5mbyA8PCAnXG4nCisgICAgICAgICAgICAgICAgICAgIDw8ICJcdFJlZGVmaW5lZCBhdCAiIDw8IGl0LT5nZXRUZXN0Q2FzZUluZm8oKS5saW5lSW5mbyA8PCBzdGQ6OmVuZGw7CisKKyAgICAgICAgICAgICAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3Ioc3Muc3RyKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8VGVzdENhc2U+IGZpbHRlclRlc3RzKCBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gY29uc3QmIHRlc3RDYXNlcywgVGVzdFNwZWMgY29uc3QmIHRlc3RTcGVjLCBJQ29uZmlnIGNvbnN0JiBjb25maWcgKSB7CisgICAgICAgIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPiBmaWx0ZXJlZDsKKyAgICAgICAgZmlsdGVyZWQucmVzZXJ2ZSggdGVzdENhc2VzLnNpemUoKSApOworICAgICAgICBmb3IoIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSB0ZXN0Q2FzZXMuYmVnaW4oKSwgaXRFbmQgPSB0ZXN0Q2FzZXMuZW5kKCk7CisgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgKytpdCApCisgICAgICAgICAgICBpZiggbWF0Y2hUZXN0KCAqaXQsIHRlc3RTcGVjLCBjb25maWcgKSApCisgICAgICAgICAgICAgICAgZmlsdGVyZWQucHVzaF9iYWNrKCAqaXQgKTsKKyAgICAgICAgcmV0dXJuIGZpbHRlcmVkOworICAgIH0KKyAgICBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gY29uc3QmIGdldEFsbFRlc3RDYXNlc1NvcnRlZCggSUNvbmZpZyBjb25zdCYgY29uZmlnICkgeworICAgICAgICByZXR1cm4gZ2V0UmVnaXN0cnlIdWIoKS5nZXRUZXN0Q2FzZVJlZ2lzdHJ5KCkuZ2V0QWxsVGVzdHNTb3J0ZWQoIGNvbmZpZyApOworICAgIH0KKworICAgIGNsYXNzIFRlc3RSZWdpc3RyeSA6IHB1YmxpYyBJVGVzdENhc2VSZWdpc3RyeSB7CisgICAgcHVibGljOgorICAgICAgICBUZXN0UmVnaXN0cnkoKQorICAgICAgICA6ICAgbV9jdXJyZW50U29ydE9yZGVyKCBSdW5UZXN0czo6SW5EZWNsYXJhdGlvbk9yZGVyICksCisgICAgICAgICAgICBtX3VubmFtZWRDb3VudCggMCApCisgICAgICAgIHt9CisgICAgICAgIHZpcnR1YWwgflRlc3RSZWdpc3RyeSgpOworCisgICAgICAgIHZpcnR1YWwgdm9pZCByZWdpc3RlclRlc3QoIFRlc3RDYXNlIGNvbnN0JiB0ZXN0Q2FzZSApIHsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUgPSB0ZXN0Q2FzZS5nZXRUZXN0Q2FzZUluZm8oKS5uYW1lOworICAgICAgICAgICAgaWYoIG5hbWUuZW1wdHkoKSApIHsKKyAgICAgICAgICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICAgICAgICAgICAgICAgIG9zcyA8PCAiQW5vbnltb3VzIHRlc3QgY2FzZSAiIDw8ICsrbV91bm5hbWVkQ291bnQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlZ2lzdGVyVGVzdCggdGVzdENhc2Uud2l0aE5hbWUoIG9zcy5zdHIoKSApICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtX2Z1bmN0aW9ucy5wdXNoX2JhY2soIHRlc3RDYXNlICk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPiBjb25zdCYgZ2V0QWxsVGVzdHMoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbV9mdW5jdGlvbnM7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gY29uc3QmIGdldEFsbFRlc3RzU29ydGVkKCBJQ29uZmlnIGNvbnN0JiBjb25maWcgKSBjb25zdCB7CisgICAgICAgICAgICBpZiggbV9zb3J0ZWRGdW5jdGlvbnMuZW1wdHkoKSApCisgICAgICAgICAgICAgICAgZW5mb3JjZU5vRHVwbGljYXRlVGVzdENhc2VzKCBtX2Z1bmN0aW9ucyApOworCisgICAgICAgICAgICBpZiggIG1fY3VycmVudFNvcnRPcmRlciAhPSBjb25maWcucnVuT3JkZXIoKSB8fCBtX3NvcnRlZEZ1bmN0aW9ucy5lbXB0eSgpICkgeworICAgICAgICAgICAgICAgIG1fc29ydGVkRnVuY3Rpb25zID0gc29ydFRlc3RzKCBjb25maWcsIG1fZnVuY3Rpb25zICk7CisgICAgICAgICAgICAgICAgbV9jdXJyZW50U29ydE9yZGVyID0gY29uZmlnLnJ1bk9yZGVyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbV9zb3J0ZWRGdW5jdGlvbnM7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPiBtX2Z1bmN0aW9uczsKKyAgICAgICAgbXV0YWJsZSBSdW5UZXN0czo6SW5XaGF0T3JkZXIgbV9jdXJyZW50U29ydE9yZGVyOworICAgICAgICBtdXRhYmxlIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPiBtX3NvcnRlZEZ1bmN0aW9uczsKKyAgICAgICAgc2l6ZV90IG1fdW5uYW1lZENvdW50OworICAgICAgICBzdGQ6Omlvc19iYXNlOjpJbml0IG1fb3N0cmVhbUluaXQ7IC8vIEZvcmNlcyBjb3V0LyBjZXJyIHRvIGJlIGluaXRpYWxpc2VkCisgICAgfTsKKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgY2xhc3MgRnJlZUZ1bmN0aW9uVGVzdENhc2UgOiBwdWJsaWMgU2hhcmVkSW1wbDxJVGVzdENhc2U+IHsKKyAgICBwdWJsaWM6CisKKyAgICAgICAgRnJlZUZ1bmN0aW9uVGVzdENhc2UoIFRlc3RGdW5jdGlvbiBmdW4gKSA6IG1fZnVuKCBmdW4gKSB7fQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBpbnZva2UoKSBjb25zdCB7CisgICAgICAgICAgICBtX2Z1bigpOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICB2aXJ0dWFsIH5GcmVlRnVuY3Rpb25UZXN0Q2FzZSgpOworCisgICAgICAgIFRlc3RGdW5jdGlvbiBtX2Z1bjsKKyAgICB9OworCisgICAgaW5saW5lIHN0ZDo6c3RyaW5nIGV4dHJhY3RDbGFzc05hbWUoIHN0ZDo6c3RyaW5nIGNvbnN0JiBjbGFzc09yUXVhbGlmaWVkTWV0aG9kTmFtZSApIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgY2xhc3NOYW1lID0gY2xhc3NPclF1YWxpZmllZE1ldGhvZE5hbWU7CisgICAgICAgIGlmKCBzdGFydHNXaXRoKCBjbGFzc05hbWUsICcmJyApICkKKyAgICAgICAgeworICAgICAgICAgICAgc3RkOjpzaXplX3QgbGFzdENvbG9ucyA9IGNsYXNzTmFtZS5yZmluZCggIjo6IiApOworICAgICAgICAgICAgc3RkOjpzaXplX3QgcGVudWx0aW1hdGVDb2xvbnMgPSBjbGFzc05hbWUucmZpbmQoICI6OiIsIGxhc3RDb2xvbnMtMSApOworICAgICAgICAgICAgaWYoIHBlbnVsdGltYXRlQ29sb25zID09IHN0ZDo6c3RyaW5nOjpucG9zICkKKyAgICAgICAgICAgICAgICBwZW51bHRpbWF0ZUNvbG9ucyA9IDE7CisgICAgICAgICAgICBjbGFzc05hbWUgPSBjbGFzc05hbWUuc3Vic3RyKCBwZW51bHRpbWF0ZUNvbG9ucywgbGFzdENvbG9ucy1wZW51bHRpbWF0ZUNvbG9ucyApOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjbGFzc05hbWU7CisgICAgfQorCisgICAgdm9pZCByZWdpc3RlclRlc3RDYXNlCisgICAgICAgICggICBJVGVzdENhc2UqIHRlc3RDYXNlLAorICAgICAgICAgICAgY2hhciBjb25zdCogY2xhc3NPclF1YWxpZmllZE1ldGhvZE5hbWUsCisgICAgICAgICAgICBOYW1lQW5kRGVzYyBjb25zdCYgbmFtZUFuZERlc2MsCisgICAgICAgICAgICBTb3VyY2VMaW5lSW5mbyBjb25zdCYgbGluZUluZm8gKSB7CisKKyAgICAgICAgZ2V0TXV0YWJsZVJlZ2lzdHJ5SHViKCkucmVnaXN0ZXJUZXN0CisgICAgICAgICAgICAoIG1ha2VUZXN0Q2FzZQorICAgICAgICAgICAgICAgICggICB0ZXN0Q2FzZSwKKyAgICAgICAgICAgICAgICAgICAgZXh0cmFjdENsYXNzTmFtZSggY2xhc3NPclF1YWxpZmllZE1ldGhvZE5hbWUgKSwKKyAgICAgICAgICAgICAgICAgICAgbmFtZUFuZERlc2MubmFtZSwKKyAgICAgICAgICAgICAgICAgICAgbmFtZUFuZERlc2MuZGVzY3JpcHRpb24sCisgICAgICAgICAgICAgICAgICAgIGxpbmVJbmZvICkgKTsKKyAgICB9CisgICAgdm9pZCByZWdpc3RlclRlc3RDYXNlRnVuY3Rpb24KKyAgICAgICAgKCAgIFRlc3RGdW5jdGlvbiBmdW5jdGlvbiwKKyAgICAgICAgICAgIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBsaW5lSW5mbywKKyAgICAgICAgICAgIE5hbWVBbmREZXNjIGNvbnN0JiBuYW1lQW5kRGVzYyApIHsKKyAgICAgICAgcmVnaXN0ZXJUZXN0Q2FzZSggbmV3IEZyZWVGdW5jdGlvblRlc3RDYXNlKCBmdW5jdGlvbiApLCAiIiwgbmFtZUFuZERlc2MsIGxpbmVJbmZvICk7CisgICAgfQorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBBdXRvUmVnOjpBdXRvUmVnCisgICAgICAgICggICBUZXN0RnVuY3Rpb24gZnVuY3Rpb24sCisgICAgICAgICAgICBTb3VyY2VMaW5lSW5mbyBjb25zdCYgbGluZUluZm8sCisgICAgICAgICAgICBOYW1lQW5kRGVzYyBjb25zdCYgbmFtZUFuZERlc2MgKSB7CisgICAgICAgIHJlZ2lzdGVyVGVzdENhc2VGdW5jdGlvbiggZnVuY3Rpb24sIGxpbmVJbmZvLCBuYW1lQW5kRGVzYyApOworICAgIH0KKworICAgIEF1dG9SZWc6On5BdXRvUmVnKCkge30KKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9yZXBvcnRlcl9yZWdpc3RyeS5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1JFUE9SVEVSX1JFR0lTVFJZX0hQUF9JTkNMVURFRAorCisjaW5jbHVkZSA8bWFwPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgY2xhc3MgUmVwb3J0ZXJSZWdpc3RyeSA6IHB1YmxpYyBJUmVwb3J0ZXJSZWdpc3RyeSB7CisKKyAgICBwdWJsaWM6CisKKyAgICAgICAgdmlydHVhbCB+UmVwb3J0ZXJSZWdpc3RyeSgpIENBVENIX09WRVJSSURFIHt9CisKKyAgICAgICAgdmlydHVhbCBJU3RyZWFtaW5nUmVwb3J0ZXIqIGNyZWF0ZSggc3RkOjpzdHJpbmcgY29uc3QmIG5hbWUsIFB0cjxJQ29uZmlnIGNvbnN0PiBjb25zdCYgY29uZmlnICkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgRmFjdG9yeU1hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSAgbV9mYWN0b3JpZXMuZmluZCggbmFtZSApOworICAgICAgICAgICAgaWYoIGl0ID09IG1fZmFjdG9yaWVzLmVuZCgpICkKKyAgICAgICAgICAgICAgICByZXR1cm4gQ0FUQ0hfTlVMTDsKKyAgICAgICAgICAgIHJldHVybiBpdC0+c2Vjb25kLT5jcmVhdGUoIFJlcG9ydGVyQ29uZmlnKCBjb25maWcgKSApOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCByZWdpc3RlclJlcG9ydGVyKCBzdGQ6OnN0cmluZyBjb25zdCYgbmFtZSwgUHRyPElSZXBvcnRlckZhY3Rvcnk+IGNvbnN0JiBmYWN0b3J5ICkgeworICAgICAgICAgICAgbV9mYWN0b3JpZXMuaW5zZXJ0KCBzdGQ6Om1ha2VfcGFpciggbmFtZSwgZmFjdG9yeSApICk7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCByZWdpc3Rlckxpc3RlbmVyKCBQdHI8SVJlcG9ydGVyRmFjdG9yeT4gY29uc3QmIGZhY3RvcnkgKSB7CisgICAgICAgICAgICBtX2xpc3RlbmVycy5wdXNoX2JhY2soIGZhY3RvcnkgKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgRmFjdG9yeU1hcCBjb25zdCYgZ2V0RmFjdG9yaWVzKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgcmV0dXJuIG1fZmFjdG9yaWVzOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgTGlzdGVuZXJzIGNvbnN0JiBnZXRMaXN0ZW5lcnMoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICByZXR1cm4gbV9saXN0ZW5lcnM7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIEZhY3RvcnlNYXAgbV9mYWN0b3JpZXM7CisgICAgICAgIExpc3RlbmVycyBtX2xpc3RlbmVyczsKKyAgICB9OworfQorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfZXhjZXB0aW9uX3RyYW5zbGF0b3JfcmVnaXN0cnkuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9FWENFUFRJT05fVFJBTlNMQVRPUl9SRUdJU1RSWV9IUFBfSU5DTFVERUQKKworI2lmZGVmIF9fT0JKQ19fCisjaW1wb3J0ICJGb3VuZGF0aW9uL0ZvdW5kYXRpb24uaCIKKyNlbmRpZgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgY2xhc3MgRXhjZXB0aW9uVHJhbnNsYXRvclJlZ2lzdHJ5IDogcHVibGljIElFeGNlcHRpb25UcmFuc2xhdG9yUmVnaXN0cnkgeworICAgIHB1YmxpYzoKKyAgICAgICAgfkV4Y2VwdGlvblRyYW5zbGF0b3JSZWdpc3RyeSgpIHsKKyAgICAgICAgICAgIGRlbGV0ZUFsbCggbV90cmFuc2xhdG9ycyApOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHJlZ2lzdGVyVHJhbnNsYXRvciggY29uc3QgSUV4Y2VwdGlvblRyYW5zbGF0b3IqIHRyYW5zbGF0b3IgKSB7CisgICAgICAgICAgICBtX3RyYW5zbGF0b3JzLnB1c2hfYmFjayggdHJhbnNsYXRvciApOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyB0cmFuc2xhdGVBY3RpdmVFeGNlcHRpb24oKSBjb25zdCB7CisgICAgICAgICAgICB0cnkgeworI2lmZGVmIF9fT0JKQ19fCisgICAgICAgICAgICAgICAgLy8gSW4gT2JqZWN0aXZlLUMgdHJ5IG9iamVjdGl2ZS1jIGV4Y2VwdGlvbnMgZmlyc3QKKyAgICAgICAgICAgICAgICBAdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRyeVRyYW5zbGF0b3JzKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEBjYXRjaCAoTlNFeGNlcHRpb24gKmV4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ2F0Y2g6OnRvU3RyaW5nKCBbZXhjZXB0aW9uIGRlc2NyaXB0aW9uXSApOworICAgICAgICAgICAgICAgIH0KKyNlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIHRyeVRyYW5zbGF0b3JzKCk7CisjZW5kaWYKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoKCBUZXN0RmFpbHVyZUV4Y2VwdGlvbiYgKSB7CisgICAgICAgICAgICAgICAgdGhyb3c7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCggc3RkOjpleGNlcHRpb24mIGV4ICkgeworICAgICAgICAgICAgICAgIHJldHVybiBleC53aGF0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCggc3RkOjpzdHJpbmcmIG1zZyApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbXNnOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2goIGNvbnN0IGNoYXIqIG1zZyApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbXNnOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2goLi4uKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICJVbmtub3duIGV4Y2VwdGlvbiI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzdGQ6OnN0cmluZyB0cnlUcmFuc2xhdG9ycygpIGNvbnN0IHsKKyAgICAgICAgICAgIGlmKCBtX3RyYW5zbGF0b3JzLmVtcHR5KCkgKQorICAgICAgICAgICAgICAgIHRocm93OworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBtX3RyYW5zbGF0b3JzWzBdLT50cmFuc2xhdGUoIG1fdHJhbnNsYXRvcnMuYmVnaW4oKSsxLCBtX3RyYW5zbGF0b3JzLmVuZCgpICk7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6dmVjdG9yPGNvbnN0IElFeGNlcHRpb25UcmFuc2xhdG9yKj4gbV90cmFuc2xhdG9yczsKKyAgICB9OworfQorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfdGFnX2FsaWFzX3JlZ2lzdHJ5LmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1RBR19BTElBU19SRUdJU1RSWV9IX0lOQ0xVREVECisKKyNpbmNsdWRlIDxtYXA+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBjbGFzcyBUYWdBbGlhc1JlZ2lzdHJ5IDogcHVibGljIElUYWdBbGlhc1JlZ2lzdHJ5IHsKKyAgICBwdWJsaWM6CisgICAgICAgIHZpcnR1YWwgflRhZ0FsaWFzUmVnaXN0cnkoKTsKKyAgICAgICAgdmlydHVhbCBPcHRpb248VGFnQWxpYXM+IGZpbmQoIHN0ZDo6c3RyaW5nIGNvbnN0JiBhbGlhcyApIGNvbnN0OworICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGV4cGFuZEFsaWFzZXMoIHN0ZDo6c3RyaW5nIGNvbnN0JiB1bmV4cGFuZGVkVGVzdFNwZWMgKSBjb25zdDsKKyAgICAgICAgdm9pZCBhZGQoIHN0ZDo6c3RyaW5nIGNvbnN0JiBhbGlhcywgc3RkOjpzdHJpbmcgY29uc3QmIHRhZywgU291cmNlTGluZUluZm8gY29uc3QmIGxpbmVJbmZvICk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgVGFnQWxpYXM+IG1fcmVnaXN0cnk7CisgICAgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBuYW1lc3BhY2UgeworCisgICAgICAgIGNsYXNzIFJlZ2lzdHJ5SHViIDogcHVibGljIElSZWdpc3RyeUh1YiwgcHVibGljIElNdXRhYmxlUmVnaXN0cnlIdWIgeworCisgICAgICAgICAgICBSZWdpc3RyeUh1YiggUmVnaXN0cnlIdWIgY29uc3QmICk7CisgICAgICAgICAgICB2b2lkIG9wZXJhdG9yPSggUmVnaXN0cnlIdWIgY29uc3QmICk7CisKKyAgICAgICAgcHVibGljOiAvLyBJUmVnaXN0cnlIdWIKKyAgICAgICAgICAgIFJlZ2lzdHJ5SHViKCkgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmlydHVhbCBJUmVwb3J0ZXJSZWdpc3RyeSBjb25zdCYgZ2V0UmVwb3J0ZXJSZWdpc3RyeSgpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbV9yZXBvcnRlclJlZ2lzdHJ5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmlydHVhbCBJVGVzdENhc2VSZWdpc3RyeSBjb25zdCYgZ2V0VGVzdENhc2VSZWdpc3RyeSgpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbV90ZXN0Q2FzZVJlZ2lzdHJ5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmlydHVhbCBJRXhjZXB0aW9uVHJhbnNsYXRvclJlZ2lzdHJ5JiBnZXRFeGNlcHRpb25UcmFuc2xhdG9yUmVnaXN0cnkoKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1fZXhjZXB0aW9uVHJhbnNsYXRvclJlZ2lzdHJ5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmlydHVhbCBJVGFnQWxpYXNSZWdpc3RyeSBjb25zdCYgZ2V0VGFnQWxpYXNSZWdpc3RyeSgpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbV90YWdBbGlhc1JlZ2lzdHJ5OworICAgICAgICAgICAgfQorCisgICAgICAgIHB1YmxpYzogLy8gSU11dGFibGVSZWdpc3RyeUh1YgorICAgICAgICAgICAgdmlydHVhbCB2b2lkIHJlZ2lzdGVyUmVwb3J0ZXIoIHN0ZDo6c3RyaW5nIGNvbnN0JiBuYW1lLCBQdHI8SVJlcG9ydGVyRmFjdG9yeT4gY29uc3QmIGZhY3RvcnkgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgbV9yZXBvcnRlclJlZ2lzdHJ5LnJlZ2lzdGVyUmVwb3J0ZXIoIG5hbWUsIGZhY3RvcnkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpcnR1YWwgdm9pZCByZWdpc3Rlckxpc3RlbmVyKCBQdHI8SVJlcG9ydGVyRmFjdG9yeT4gY29uc3QmIGZhY3RvcnkgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgbV9yZXBvcnRlclJlZ2lzdHJ5LnJlZ2lzdGVyTGlzdGVuZXIoIGZhY3RvcnkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpcnR1YWwgdm9pZCByZWdpc3RlclRlc3QoIFRlc3RDYXNlIGNvbnN0JiB0ZXN0SW5mbyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgICAgICBtX3Rlc3RDYXNlUmVnaXN0cnkucmVnaXN0ZXJUZXN0KCB0ZXN0SW5mbyApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmlydHVhbCB2b2lkIHJlZ2lzdGVyVHJhbnNsYXRvciggY29uc3QgSUV4Y2VwdGlvblRyYW5zbGF0b3IqIHRyYW5zbGF0b3IgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgbV9leGNlcHRpb25UcmFuc2xhdG9yUmVnaXN0cnkucmVnaXN0ZXJUcmFuc2xhdG9yKCB0cmFuc2xhdG9yICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgcmVnaXN0ZXJUYWdBbGlhcyggc3RkOjpzdHJpbmcgY29uc3QmIGFsaWFzLCBzdGQ6OnN0cmluZyBjb25zdCYgdGFnLCBTb3VyY2VMaW5lSW5mbyBjb25zdCYgbGluZUluZm8gKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgbV90YWdBbGlhc1JlZ2lzdHJ5LmFkZCggYWxpYXMsIHRhZywgbGluZUluZm8gKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBwcml2YXRlOgorICAgICAgICAgICAgVGVzdFJlZ2lzdHJ5IG1fdGVzdENhc2VSZWdpc3RyeTsKKyAgICAgICAgICAgIFJlcG9ydGVyUmVnaXN0cnkgbV9yZXBvcnRlclJlZ2lzdHJ5OworICAgICAgICAgICAgRXhjZXB0aW9uVHJhbnNsYXRvclJlZ2lzdHJ5IG1fZXhjZXB0aW9uVHJhbnNsYXRvclJlZ2lzdHJ5OworICAgICAgICAgICAgVGFnQWxpYXNSZWdpc3RyeSBtX3RhZ0FsaWFzUmVnaXN0cnk7CisgICAgICAgIH07CisKKyAgICAgICAgLy8gU2luZ2xlLCBnbG9iYWwsIGluc3RhbmNlCisgICAgICAgIGlubGluZSBSZWdpc3RyeUh1YiomIGdldFRoZVJlZ2lzdHJ5SHViKCkgeworICAgICAgICAgICAgc3RhdGljIFJlZ2lzdHJ5SHViKiB0aGVSZWdpc3RyeUh1YiA9IENBVENIX05VTEw7CisgICAgICAgICAgICBpZiggIXRoZVJlZ2lzdHJ5SHViICkKKyAgICAgICAgICAgICAgICB0aGVSZWdpc3RyeUh1YiA9IG5ldyBSZWdpc3RyeUh1YigpOworICAgICAgICAgICAgcmV0dXJuIHRoZVJlZ2lzdHJ5SHViOworICAgICAgICB9CisgICAgfQorCisgICAgSVJlZ2lzdHJ5SHViJiBnZXRSZWdpc3RyeUh1YigpIHsKKyAgICAgICAgcmV0dXJuICpnZXRUaGVSZWdpc3RyeUh1YigpOworICAgIH0KKyAgICBJTXV0YWJsZVJlZ2lzdHJ5SHViJiBnZXRNdXRhYmxlUmVnaXN0cnlIdWIoKSB7CisgICAgICAgIHJldHVybiAqZ2V0VGhlUmVnaXN0cnlIdWIoKTsKKyAgICB9CisgICAgdm9pZCBjbGVhblVwKCkgeworICAgICAgICBkZWxldGUgZ2V0VGhlUmVnaXN0cnlIdWIoKTsKKyAgICAgICAgZ2V0VGhlUmVnaXN0cnlIdWIoKSA9IENBVENIX05VTEw7CisgICAgICAgIGNsZWFuVXBDb250ZXh0KCk7CisgICAgfQorICAgIHN0ZDo6c3RyaW5nIHRyYW5zbGF0ZUFjdGl2ZUV4Y2VwdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIGdldFJlZ2lzdHJ5SHViKCkuZ2V0RXhjZXB0aW9uVHJhbnNsYXRvclJlZ2lzdHJ5KCkudHJhbnNsYXRlQWN0aXZlRXhjZXB0aW9uKCk7CisgICAgfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX25vdGltcGxlbWVudGVkX2V4Y2VwdGlvbi5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX05PVElNUExFTUVOVEVEX0VYQ0VQVElPTl9IUFBfSU5DTFVERUQKKworI2luY2x1ZGUgPHNzdHJlYW0+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbjo6Tm90SW1wbGVtZW50ZWRFeGNlcHRpb24oIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBsaW5lSW5mbyApCisgICAgOiAgIG1fbGluZUluZm8oIGxpbmVJbmZvICkgeworICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICAgICAgICBvc3MgPDwgbGluZUluZm8gPDwgIjogZnVuY3Rpb24gIjsKKyAgICAgICAgb3NzIDw8ICJub3QgaW1wbGVtZW50ZWQiOworICAgICAgICBtX3doYXQgPSBvc3Muc3RyKCk7CisgICAgfQorCisgICAgY29uc3QgY2hhciogTm90SW1wbGVtZW50ZWRFeGNlcHRpb246OndoYXQoKSBjb25zdCBDQVRDSF9OT0VYQ0VQVCB7CisgICAgICAgIHJldHVybiBtX3doYXQuY19zdHIoKTsKKyAgICB9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfY29udGV4dF9pbXBsLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfQ09OVEVYVF9JTVBMX0hQUF9JTkNMVURFRAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfc3RyZWFtLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfU1RSRUFNX0hQUF9JTkNMVURFRAorCisjaW5jbHVkZSA8c3RkZXhjZXB0PgorI2luY2x1ZGUgPGNzdGRpbz4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFdyaXRlckYsIHNpemVfdCBidWZmZXJTaXplPTI1Nj4KKyAgICBjbGFzcyBTdHJlYW1CdWZJbXBsIDogcHVibGljIFN0cmVhbUJ1ZkJhc2UgeworICAgICAgICBjaGFyIGRhdGFbYnVmZmVyU2l6ZV07CisgICAgICAgIFdyaXRlckYgbV93cml0ZXI7CisKKyAgICBwdWJsaWM6CisgICAgICAgIFN0cmVhbUJ1ZkltcGwoKSB7CisgICAgICAgICAgICBzZXRwKCBkYXRhLCBkYXRhICsgc2l6ZW9mKGRhdGEpICk7CisgICAgICAgIH0KKworICAgICAgICB+U3RyZWFtQnVmSW1wbCgpIENBVENIX05PRVhDRVBUIHsKKyAgICAgICAgICAgIHN5bmMoKTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgaW50IG92ZXJmbG93KCBpbnQgYyApIHsKKyAgICAgICAgICAgIHN5bmMoKTsKKworICAgICAgICAgICAgaWYoIGMgIT0gRU9GICkgeworICAgICAgICAgICAgICAgIGlmKCBwYmFzZSgpID09IGVwcHRyKCkgKQorICAgICAgICAgICAgICAgICAgICBtX3dyaXRlciggc3RkOjpzdHJpbmcoIDEsIHN0YXRpY19jYXN0PGNoYXI+KCBjICkgKSApOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgc3B1dGMoIHN0YXRpY19jYXN0PGNoYXI+KCBjICkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgaW50IHN5bmMoKSB7CisgICAgICAgICAgICBpZiggcGJhc2UoKSAhPSBwcHRyKCkgKSB7CisgICAgICAgICAgICAgICAgbV93cml0ZXIoIHN0ZDo6c3RyaW5nKCBwYmFzZSgpLCBzdGF0aWNfY2FzdDxzdGQ6OnN0cmluZzo6c2l6ZV90eXBlPiggcHB0cigpIC0gcGJhc2UoKSApICkgKTsKKyAgICAgICAgICAgICAgICBzZXRwKCBwYmFzZSgpLCBlcHB0cigpICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH07CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIEZpbGVTdHJlYW06OkZpbGVTdHJlYW0oIHN0ZDo6c3RyaW5nIGNvbnN0JiBmaWxlbmFtZSApIHsKKyAgICAgICAgbV9vZnMub3BlbiggZmlsZW5hbWUuY19zdHIoKSApOworICAgICAgICBpZiggbV9vZnMuZmFpbCgpICkgeworICAgICAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICAgICAgICAgIG9zcyA8PCAiVW5hYmxlIHRvIG9wZW4gZmlsZTogJyIgPDwgZmlsZW5hbWUgPDwgJ1wnJzsKKyAgICAgICAgICAgIHRocm93IHN0ZDo6ZG9tYWluX2Vycm9yKCBvc3Muc3RyKCkgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0ZDo6b3N0cmVhbSYgRmlsZVN0cmVhbTo6c3RyZWFtKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbV9vZnM7CisgICAgfQorCisgICAgc3RydWN0IE91dHB1dERlYnVnV3JpdGVyIHsKKworICAgICAgICB2b2lkIG9wZXJhdG9yKCkoIHN0ZDo6c3RyaW5nIGNvbnN0JnN0ciApIHsKKyAgICAgICAgICAgIHdyaXRlVG9EZWJ1Z0NvbnNvbGUoIHN0ciApOworICAgICAgICB9CisgICAgfTsKKworICAgIERlYnVnT3V0U3RyZWFtOjpEZWJ1Z091dFN0cmVhbSgpCisgICAgOiAgIG1fc3RyZWFtQnVmKCBuZXcgU3RyZWFtQnVmSW1wbDxPdXRwdXREZWJ1Z1dyaXRlcj4oKSApLAorICAgICAgICBtX29zKCBtX3N0cmVhbUJ1Zi5nZXQoKSApCisgICAge30KKworICAgIHN0ZDo6b3N0cmVhbSYgRGVidWdPdXRTdHJlYW06OnN0cmVhbSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1fb3M7CisgICAgfQorCisgICAgLy8gU3RvcmUgdGhlIHN0cmVhbWJ1ZiBmcm9tIGNvdXQgdXAtZnJvbnQgYmVjYXVzZQorICAgIC8vIGNvdXQgbWF5IGdldCByZWRpcmVjdGVkIHdoZW4gcnVubmluZyB0ZXN0cworICAgIENvdXRTdHJlYW06OkNvdXRTdHJlYW0oKQorICAgIDogICBtX29zKCBDYXRjaDo6Y291dCgpLnJkYnVmKCkgKQorICAgIHt9CisKKyAgICBzdGQ6Om9zdHJlYW0mIENvdXRTdHJlYW06OnN0cmVhbSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1fb3M7CisgICAgfQorCisjaWZuZGVmIENBVENIX0NPTkZJR19OT1NURE9VVCAvLyBJZiB5b3UgI2RlZmluZSB0aGlzIHlvdSBtdXN0IGltcGxlbWVudCB0aGVzZSBmdW5jdGlvbnMKKyAgICBzdGQ6Om9zdHJlYW0mIGNvdXQoKSB7CisgICAgICAgIHJldHVybiBzdGQ6OmNvdXQ7CisgICAgfQorICAgIHN0ZDo6b3N0cmVhbSYgY2VycigpIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6Y2VycjsKKyAgICB9CisjZW5kaWYKK30KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIGNsYXNzIENvbnRleHQgOiBwdWJsaWMgSU11dGFibGVDb250ZXh0IHsKKworICAgICAgICBDb250ZXh0KCkgOiBtX2NvbmZpZyggQ0FUQ0hfTlVMTCApLCBtX3J1bm5lciggQ0FUQ0hfTlVMTCApLCBtX3Jlc3VsdENhcHR1cmUoIENBVENIX05VTEwgKSB7fQorICAgICAgICBDb250ZXh0KCBDb250ZXh0IGNvbnN0JiApOworICAgICAgICB2b2lkIG9wZXJhdG9yPSggQ29udGV4dCBjb25zdCYgKTsKKworICAgIHB1YmxpYzoKKyAgICAgICAgdmlydHVhbCB+Q29udGV4dCgpIHsKKyAgICAgICAgICAgIGRlbGV0ZUFsbFZhbHVlcyggbV9nZW5lcmF0b3JzQnlUZXN0TmFtZSApOworICAgICAgICB9CisKKyAgICBwdWJsaWM6IC8vIElDb250ZXh0CisgICAgICAgIHZpcnR1YWwgSVJlc3VsdENhcHR1cmUqIGdldFJlc3VsdENhcHR1cmUoKSB7CisgICAgICAgICAgICByZXR1cm4gbV9yZXN1bHRDYXB0dXJlOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgSVJ1bm5lciogZ2V0UnVubmVyKCkgeworICAgICAgICAgICAgcmV0dXJuIG1fcnVubmVyOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgc2l6ZV90IGdldEdlbmVyYXRvckluZGV4KCBzdGQ6OnN0cmluZyBjb25zdCYgZmlsZUluZm8sIHNpemVfdCB0b3RhbFNpemUgKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0R2VuZXJhdG9yc0ZvckN1cnJlbnRUZXN0KCkKKyAgICAgICAgICAgIC5nZXRHZW5lcmF0b3JJbmZvKCBmaWxlSW5mbywgdG90YWxTaXplICkKKyAgICAgICAgICAgIC5nZXRDdXJyZW50SW5kZXgoKTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIGJvb2wgYWR2YW5jZUdlbmVyYXRvcnNGb3JDdXJyZW50VGVzdCgpIHsKKyAgICAgICAgICAgIElHZW5lcmF0b3JzRm9yVGVzdCogZ2VuZXJhdG9ycyA9IGZpbmRHZW5lcmF0b3JzRm9yQ3VycmVudFRlc3QoKTsKKyAgICAgICAgICAgIHJldHVybiBnZW5lcmF0b3JzICYmIGdlbmVyYXRvcnMtPm1vdmVOZXh0KCk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIFB0cjxJQ29uZmlnIGNvbnN0PiBnZXRDb25maWcoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbV9jb25maWc7CisgICAgICAgIH0KKworICAgIHB1YmxpYzogLy8gSU11dGFibGVDb250ZXh0CisgICAgICAgIHZpcnR1YWwgdm9pZCBzZXRSZXN1bHRDYXB0dXJlKCBJUmVzdWx0Q2FwdHVyZSogcmVzdWx0Q2FwdHVyZSApIHsKKyAgICAgICAgICAgIG1fcmVzdWx0Q2FwdHVyZSA9IHJlc3VsdENhcHR1cmU7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCB2b2lkIHNldFJ1bm5lciggSVJ1bm5lciogcnVubmVyICkgeworICAgICAgICAgICAgbV9ydW5uZXIgPSBydW5uZXI7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCB2b2lkIHNldENvbmZpZyggUHRyPElDb25maWcgY29uc3Q+IGNvbnN0JiBjb25maWcgKSB7CisgICAgICAgICAgICBtX2NvbmZpZyA9IGNvbmZpZzsKKyAgICAgICAgfQorCisgICAgICAgIGZyaWVuZCBJTXV0YWJsZUNvbnRleHQmIGdldEN1cnJlbnRNdXRhYmxlQ29udGV4dCgpOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgSUdlbmVyYXRvcnNGb3JUZXN0KiBmaW5kR2VuZXJhdG9yc0ZvckN1cnJlbnRUZXN0KCkgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgdGVzdE5hbWUgPSBnZXRSZXN1bHRDYXB0dXJlKCktPmdldEN1cnJlbnRUZXN0TmFtZSgpOworCisgICAgICAgICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgSUdlbmVyYXRvcnNGb3JUZXN0Kj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0KKyAgICAgICAgICAgICAgICBtX2dlbmVyYXRvcnNCeVRlc3ROYW1lLmZpbmQoIHRlc3ROYW1lICk7CisgICAgICAgICAgICByZXR1cm4gaXQgIT0gbV9nZW5lcmF0b3JzQnlUZXN0TmFtZS5lbmQoKQorICAgICAgICAgICAgICAgID8gaXQtPnNlY29uZAorICAgICAgICAgICAgICAgIDogQ0FUQ0hfTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIElHZW5lcmF0b3JzRm9yVGVzdCYgZ2V0R2VuZXJhdG9yc0ZvckN1cnJlbnRUZXN0KCkgeworICAgICAgICAgICAgSUdlbmVyYXRvcnNGb3JUZXN0KiBnZW5lcmF0b3JzID0gZmluZEdlbmVyYXRvcnNGb3JDdXJyZW50VGVzdCgpOworICAgICAgICAgICAgaWYoICFnZW5lcmF0b3JzICkgeworICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHRlc3ROYW1lID0gZ2V0UmVzdWx0Q2FwdHVyZSgpLT5nZXRDdXJyZW50VGVzdE5hbWUoKTsKKyAgICAgICAgICAgICAgICBnZW5lcmF0b3JzID0gY3JlYXRlR2VuZXJhdG9yc0ZvclRlc3QoKTsKKyAgICAgICAgICAgICAgICBtX2dlbmVyYXRvcnNCeVRlc3ROYW1lLmluc2VydCggc3RkOjptYWtlX3BhaXIoIHRlc3ROYW1lLCBnZW5lcmF0b3JzICkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAqZ2VuZXJhdG9yczsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgUHRyPElDb25maWcgY29uc3Q+IG1fY29uZmlnOworICAgICAgICBJUnVubmVyKiBtX3J1bm5lcjsKKyAgICAgICAgSVJlc3VsdENhcHR1cmUqIG1fcmVzdWx0Q2FwdHVyZTsKKyAgICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIElHZW5lcmF0b3JzRm9yVGVzdCo+IG1fZ2VuZXJhdG9yc0J5VGVzdE5hbWU7CisgICAgfTsKKworICAgIG5hbWVzcGFjZSB7CisgICAgICAgIENvbnRleHQqIGN1cnJlbnRDb250ZXh0ID0gQ0FUQ0hfTlVMTDsKKyAgICB9CisgICAgSU11dGFibGVDb250ZXh0JiBnZXRDdXJyZW50TXV0YWJsZUNvbnRleHQoKSB7CisgICAgICAgIGlmKCAhY3VycmVudENvbnRleHQgKQorICAgICAgICAgICAgY3VycmVudENvbnRleHQgPSBuZXcgQ29udGV4dCgpOworICAgICAgICByZXR1cm4gKmN1cnJlbnRDb250ZXh0OworICAgIH0KKyAgICBJQ29udGV4dCYgZ2V0Q3VycmVudENvbnRleHQoKSB7CisgICAgICAgIHJldHVybiBnZXRDdXJyZW50TXV0YWJsZUNvbnRleHQoKTsKKyAgICB9CisKKyAgICB2b2lkIGNsZWFuVXBDb250ZXh0KCkgeworICAgICAgICBkZWxldGUgY3VycmVudENvbnRleHQ7CisgICAgICAgIGN1cnJlbnRDb250ZXh0ID0gQ0FUQ0hfTlVMTDsKKyAgICB9Cit9CisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9jb25zb2xlX2NvbG91cl9pbXBsLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfQ09OU09MRV9DT0xPVVJfSU1QTF9IUFBfSU5DTFVERUQKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX2Vycm5vX2d1YXJkLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfRVJSTk9fR1VBUkRfSFBQX0lOQ0xVREVECisKKyNpbmNsdWRlIDxjZXJybm8+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBjbGFzcyBFcnJub0d1YXJkIHsKKyAgICBwdWJsaWM6CisgICAgICAgIEVycm5vR3VhcmQoKTptX29sZEVycm5vKGVycm5vKXt9CisgICAgICAgIH5FcnJub0d1YXJkKCkgeyBlcnJubyA9IG1fb2xkRXJybm87IH0KKyAgICBwcml2YXRlOgorICAgICAgICBpbnQgbV9vbGRFcnJubzsKKyAgICB9OworCit9CisKK25hbWVzcGFjZSBDYXRjaCB7CisgICAgbmFtZXNwYWNlIHsKKworICAgICAgICBzdHJ1Y3QgSUNvbG91ckltcGwgeworICAgICAgICAgICAgdmlydHVhbCB+SUNvbG91ckltcGwoKSB7fQorICAgICAgICAgICAgdmlydHVhbCB2b2lkIHVzZSggQ29sb3VyOjpDb2RlIF9jb2xvdXJDb2RlICkgPSAwOworICAgICAgICB9OworCisgICAgICAgIHN0cnVjdCBOb0NvbG91ckltcGwgOiBJQ29sb3VySW1wbCB7CisgICAgICAgICAgICB2b2lkIHVzZSggQ29sb3VyOjpDb2RlICkge30KKworICAgICAgICAgICAgc3RhdGljIElDb2xvdXJJbXBsKiBpbnN0YW5jZSgpIHsKKyAgICAgICAgICAgICAgICBzdGF0aWMgTm9Db2xvdXJJbXBsIHNfaW5zdGFuY2U7CisgICAgICAgICAgICAgICAgcmV0dXJuICZzX2luc3RhbmNlOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgfSAvLyBhbm9uIG5hbWVzcGFjZQorfSAvLyBuYW1lc3BhY2UgQ2F0Y2gKKworI2lmICFkZWZpbmVkKCBDQVRDSF9DT05GSUdfQ09MT1VSX05PTkUgKSAmJiAhZGVmaW5lZCggQ0FUQ0hfQ09ORklHX0NPTE9VUl9XSU5ET1dTICkgJiYgIWRlZmluZWQoIENBVENIX0NPTkZJR19DT0xPVVJfQU5TSSApCisjICAgaWZkZWYgQ0FUQ0hfUExBVEZPUk1fV0lORE9XUworIyAgICAgICBkZWZpbmUgQ0FUQ0hfQ09ORklHX0NPTE9VUl9XSU5ET1dTCisjICAgZWxzZQorIyAgICAgICBkZWZpbmUgQ0FUQ0hfQ09ORklHX0NPTE9VUl9BTlNJCisjICAgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoIENBVENIX0NPTkZJR19DT0xPVVJfV0lORE9XUyApIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK25hbWVzcGFjZSBDYXRjaCB7CituYW1lc3BhY2UgeworCisgICAgY2xhc3MgV2luMzJDb2xvdXJJbXBsIDogcHVibGljIElDb2xvdXJJbXBsIHsKKyAgICBwdWJsaWM6CisgICAgICAgIFdpbjMyQ29sb3VySW1wbCgpIDogc3Rkb3V0SGFuZGxlKCBHZXRTdGRIYW5kbGUoU1REX09VVFBVVF9IQU5ETEUpICkKKyAgICAgICAgeworICAgICAgICAgICAgQ09OU09MRV9TQ1JFRU5fQlVGRkVSX0lORk8gY3NiaUluZm87CisgICAgICAgICAgICBHZXRDb25zb2xlU2NyZWVuQnVmZmVySW5mbyggc3Rkb3V0SGFuZGxlLCAmY3NiaUluZm8gKTsKKyAgICAgICAgICAgIG9yaWdpbmFsRm9yZWdyb3VuZEF0dHJpYnV0ZXMgPSBjc2JpSW5mby53QXR0cmlidXRlcyAmIH4oIEJBQ0tHUk9VTkRfR1JFRU4gfCBCQUNLR1JPVU5EX1JFRCB8IEJBQ0tHUk9VTkRfQkxVRSB8IEJBQ0tHUk9VTkRfSU5URU5TSVRZICk7CisgICAgICAgICAgICBvcmlnaW5hbEJhY2tncm91bmRBdHRyaWJ1dGVzID0gY3NiaUluZm8ud0F0dHJpYnV0ZXMgJiB+KCBGT1JFR1JPVU5EX0dSRUVOIHwgRk9SRUdST1VORF9SRUQgfCBGT1JFR1JPVU5EX0JMVUUgfCBGT1JFR1JPVU5EX0lOVEVOU0lUWSApOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHVzZSggQ29sb3VyOjpDb2RlIF9jb2xvdXJDb2RlICkgeworICAgICAgICAgICAgc3dpdGNoKCBfY29sb3VyQ29kZSApIHsKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6Tm9uZTogICAgICByZXR1cm4gc2V0VGV4dEF0dHJpYnV0ZSggb3JpZ2luYWxGb3JlZ3JvdW5kQXR0cmlidXRlcyApOworICAgICAgICAgICAgICAgIGNhc2UgQ29sb3VyOjpXaGl0ZTogICAgIHJldHVybiBzZXRUZXh0QXR0cmlidXRlKCBGT1JFR1JPVU5EX0dSRUVOIHwgRk9SRUdST1VORF9SRUQgfCBGT1JFR1JPVU5EX0JMVUUgKTsKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6UmVkOiAgICAgICByZXR1cm4gc2V0VGV4dEF0dHJpYnV0ZSggRk9SRUdST1VORF9SRUQgKTsKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6R3JlZW46ICAgICByZXR1cm4gc2V0VGV4dEF0dHJpYnV0ZSggRk9SRUdST1VORF9HUkVFTiApOworICAgICAgICAgICAgICAgIGNhc2UgQ29sb3VyOjpCbHVlOiAgICAgIHJldHVybiBzZXRUZXh0QXR0cmlidXRlKCBGT1JFR1JPVU5EX0JMVUUgKTsKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6Q3lhbjogICAgICByZXR1cm4gc2V0VGV4dEF0dHJpYnV0ZSggRk9SRUdST1VORF9CTFVFIHwgRk9SRUdST1VORF9HUkVFTiApOworICAgICAgICAgICAgICAgIGNhc2UgQ29sb3VyOjpZZWxsb3c6ICAgIHJldHVybiBzZXRUZXh0QXR0cmlidXRlKCBGT1JFR1JPVU5EX1JFRCB8IEZPUkVHUk9VTkRfR1JFRU4gKTsKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6R3JleTogICAgICByZXR1cm4gc2V0VGV4dEF0dHJpYnV0ZSggMCApOworCisgICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6OkxpZ2h0R3JleTogICAgIHJldHVybiBzZXRUZXh0QXR0cmlidXRlKCBGT1JFR1JPVU5EX0lOVEVOU0lUWSApOworICAgICAgICAgICAgICAgIGNhc2UgQ29sb3VyOjpCcmlnaHRSZWQ6ICAgICByZXR1cm4gc2V0VGV4dEF0dHJpYnV0ZSggRk9SRUdST1VORF9JTlRFTlNJVFkgfCBGT1JFR1JPVU5EX1JFRCApOworICAgICAgICAgICAgICAgIGNhc2UgQ29sb3VyOjpCcmlnaHRHcmVlbjogICByZXR1cm4gc2V0VGV4dEF0dHJpYnV0ZSggRk9SRUdST1VORF9JTlRFTlNJVFkgfCBGT1JFR1JPVU5EX0dSRUVOICk7CisgICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6OkJyaWdodFdoaXRlOiAgIHJldHVybiBzZXRUZXh0QXR0cmlidXRlKCBGT1JFR1JPVU5EX0lOVEVOU0lUWSB8IEZPUkVHUk9VTkRfR1JFRU4gfCBGT1JFR1JPVU5EX1JFRCB8IEZPUkVHUk9VTkRfQkxVRSApOworCisgICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6OkJyaWdodDogdGhyb3cgc3RkOjpsb2dpY19lcnJvciggIm5vdCBhIGNvbG91ciIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgdm9pZCBzZXRUZXh0QXR0cmlidXRlKCBXT1JEIF90ZXh0QXR0cmlidXRlICkgeworICAgICAgICAgICAgU2V0Q29uc29sZVRleHRBdHRyaWJ1dGUoIHN0ZG91dEhhbmRsZSwgX3RleHRBdHRyaWJ1dGUgfCBvcmlnaW5hbEJhY2tncm91bmRBdHRyaWJ1dGVzICk7CisgICAgICAgIH0KKyAgICAgICAgSEFORExFIHN0ZG91dEhhbmRsZTsKKyAgICAgICAgV09SRCBvcmlnaW5hbEZvcmVncm91bmRBdHRyaWJ1dGVzOworICAgICAgICBXT1JEIG9yaWdpbmFsQmFja2dyb3VuZEF0dHJpYnV0ZXM7CisgICAgfTsKKworICAgIElDb2xvdXJJbXBsKiBwbGF0Zm9ybUNvbG91ckluc3RhbmNlKCkgeworICAgICAgICBzdGF0aWMgV2luMzJDb2xvdXJJbXBsIHNfaW5zdGFuY2U7CisKKyAgICAgICAgUHRyPElDb25maWcgY29uc3Q+IGNvbmZpZyA9IGdldEN1cnJlbnRDb250ZXh0KCkuZ2V0Q29uZmlnKCk7CisgICAgICAgIFVzZUNvbG91cjo6WWVzT3JObyBjb2xvdXJNb2RlID0gY29uZmlnCisgICAgICAgICAgICA/IGNvbmZpZy0+dXNlQ29sb3VyKCkKKyAgICAgICAgICAgIDogVXNlQ29sb3VyOjpBdXRvOworICAgICAgICBpZiggY29sb3VyTW9kZSA9PSBVc2VDb2xvdXI6OkF1dG8gKQorICAgICAgICAgICAgY29sb3VyTW9kZSA9ICFpc0RlYnVnZ2VyQWN0aXZlKCkKKyAgICAgICAgICAgICAgICA/IFVzZUNvbG91cjo6WWVzCisgICAgICAgICAgICAgICAgOiBVc2VDb2xvdXI6Ok5vOworICAgICAgICByZXR1cm4gY29sb3VyTW9kZSA9PSBVc2VDb2xvdXI6OlllcworICAgICAgICAgICAgPyAmc19pbnN0YW5jZQorICAgICAgICAgICAgOiBOb0NvbG91ckltcGw6Omluc3RhbmNlKCk7CisgICAgfQorCit9IC8vIGVuZCBhbm9uIG5hbWVzcGFjZQorfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKyNlbGlmIGRlZmluZWQoIENBVENIX0NPTkZJR19DT0xPVVJfQU5TSSApIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworbmFtZXNwYWNlIENhdGNoIHsKK25hbWVzcGFjZSB7CisKKyAgICAvLyB1c2UgUE9TSVgvIEFOU0kgY29uc29sZSB0ZXJtaW5hbCBjb2RlcworICAgIC8vIFRoYW5rcyB0byBBZGFtIFN0cnplbGVja2kgZm9yIG9yaWdpbmFsIGNvbnRyaWJ1dGlvbgorICAgIC8vIChodHRwOi8vZ2l0aHViLmNvbS9uYW5vYW50KQorICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9waGlsc3F1YXJlZC9DYXRjaC9wdWxsLzEzMQorICAgIGNsYXNzIFBvc2l4Q29sb3VySW1wbCA6IHB1YmxpYyBJQ29sb3VySW1wbCB7CisgICAgcHVibGljOgorICAgICAgICB2aXJ0dWFsIHZvaWQgdXNlKCBDb2xvdXI6OkNvZGUgX2NvbG91ckNvZGUgKSB7CisgICAgICAgICAgICBzd2l0Y2goIF9jb2xvdXJDb2RlICkgeworICAgICAgICAgICAgICAgIGNhc2UgQ29sb3VyOjpOb25lOgorICAgICAgICAgICAgICAgIGNhc2UgQ29sb3VyOjpXaGl0ZTogICAgIHJldHVybiBzZXRDb2xvdXIoICJbMG0iICk7CisgICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6OlJlZDogICAgICAgcmV0dXJuIHNldENvbG91ciggIlswOzMxbSIgKTsKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6R3JlZW46ICAgICByZXR1cm4gc2V0Q29sb3VyKCAiWzA7MzJtIiApOworICAgICAgICAgICAgICAgIGNhc2UgQ29sb3VyOjpCbHVlOiAgICAgIHJldHVybiBzZXRDb2xvdXIoICJbMDszNG0iICk7CisgICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6OkN5YW46ICAgICAgcmV0dXJuIHNldENvbG91ciggIlswOzM2bSIgKTsKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6WWVsbG93OiAgICByZXR1cm4gc2V0Q29sb3VyKCAiWzA7MzNtIiApOworICAgICAgICAgICAgICAgIGNhc2UgQ29sb3VyOjpHcmV5OiAgICAgIHJldHVybiBzZXRDb2xvdXIoICJbMTszMG0iICk7CisKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6TGlnaHRHcmV5OiAgICAgcmV0dXJuIHNldENvbG91ciggIlswOzM3bSIgKTsKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6QnJpZ2h0UmVkOiAgICAgcmV0dXJuIHNldENvbG91ciggIlsxOzMxbSIgKTsKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6QnJpZ2h0R3JlZW46ICAgcmV0dXJuIHNldENvbG91ciggIlsxOzMybSIgKTsKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6QnJpZ2h0V2hpdGU6ICAgcmV0dXJuIHNldENvbG91ciggIlsxOzM3bSIgKTsKKworICAgICAgICAgICAgICAgIGNhc2UgQ29sb3VyOjpCcmlnaHQ6IHRocm93IHN0ZDo6bG9naWNfZXJyb3IoICJub3QgYSBjb2xvdXIiICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3RhdGljIElDb2xvdXJJbXBsKiBpbnN0YW5jZSgpIHsKKyAgICAgICAgICAgIHN0YXRpYyBQb3NpeENvbG91ckltcGwgc19pbnN0YW5jZTsKKyAgICAgICAgICAgIHJldHVybiAmc19pbnN0YW5jZTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgdm9pZCBzZXRDb2xvdXIoIGNvbnN0IGNoYXIqIF9lc2NhcGVDb2RlICkgeworICAgICAgICAgICAgQ2F0Y2g6OmNvdXQoKSA8PCAnXDAzMycgPDwgX2VzY2FwZUNvZGU7CisgICAgICAgIH0KKyAgICB9OworCisgICAgSUNvbG91ckltcGwqIHBsYXRmb3JtQ29sb3VySW5zdGFuY2UoKSB7CisgICAgICAgIEVycm5vR3VhcmQgZ3VhcmQ7CisgICAgICAgIFB0cjxJQ29uZmlnIGNvbnN0PiBjb25maWcgPSBnZXRDdXJyZW50Q29udGV4dCgpLmdldENvbmZpZygpOworICAgICAgICBVc2VDb2xvdXI6Olllc09yTm8gY29sb3VyTW9kZSA9IGNvbmZpZworICAgICAgICAgICAgPyBjb25maWctPnVzZUNvbG91cigpCisgICAgICAgICAgICA6IFVzZUNvbG91cjo6QXV0bzsKKyAgICAgICAgaWYoIGNvbG91ck1vZGUgPT0gVXNlQ29sb3VyOjpBdXRvICkKKyAgICAgICAgICAgIGNvbG91ck1vZGUgPSAoIWlzRGVidWdnZXJBY3RpdmUoKSAmJiBpc2F0dHkoU1RET1VUX0ZJTEVOTykgKQorICAgICAgICAgICAgICAgID8gVXNlQ29sb3VyOjpZZXMKKyAgICAgICAgICAgICAgICA6IFVzZUNvbG91cjo6Tm87CisgICAgICAgIHJldHVybiBjb2xvdXJNb2RlID09IFVzZUNvbG91cjo6WWVzCisgICAgICAgICAgICA/IFBvc2l4Q29sb3VySW1wbDo6aW5zdGFuY2UoKQorICAgICAgICAgICAgOiBOb0NvbG91ckltcGw6Omluc3RhbmNlKCk7CisgICAgfQorCit9IC8vIGVuZCBhbm9uIG5hbWVzcGFjZQorfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKyNlbHNlICAvLyBub3QgV2luZG93cyBvciBBTlNJIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBzdGF0aWMgSUNvbG91ckltcGwqIHBsYXRmb3JtQ29sb3VySW5zdGFuY2UoKSB7IHJldHVybiBOb0NvbG91ckltcGw6Omluc3RhbmNlKCk7IH0KKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKyNlbmRpZiAvLyBXaW5kb3dzLyBBTlNJLyBOb25lCisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBDb2xvdXI6OkNvbG91ciggQ29kZSBfY29sb3VyQ29kZSApIDogbV9tb3ZlZCggZmFsc2UgKSB7IHVzZSggX2NvbG91ckNvZGUgKTsgfQorICAgIENvbG91cjo6Q29sb3VyKCBDb2xvdXIgY29uc3QmIF9vdGhlciApIDogbV9tb3ZlZCggZmFsc2UgKSB7IGNvbnN0X2Nhc3Q8Q29sb3VyJj4oIF9vdGhlciApLm1fbW92ZWQgPSB0cnVlOyB9CisgICAgQ29sb3VyOjp+Q29sb3VyKCl7IGlmKCAhbV9tb3ZlZCApIHVzZSggTm9uZSApOyB9CisKKyAgICB2b2lkIENvbG91cjo6dXNlKCBDb2RlIF9jb2xvdXJDb2RlICkgeworICAgICAgICBzdGF0aWMgSUNvbG91ckltcGwqIGltcGwgPSBwbGF0Zm9ybUNvbG91ckluc3RhbmNlKCk7CisgICAgICAgIGltcGwtPnVzZSggX2NvbG91ckNvZGUgKTsKKyAgICB9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfZ2VuZXJhdG9yc19pbXBsLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfR0VORVJBVE9SU19JTVBMX0hQUF9JTkNMVURFRAorCisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxtYXA+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBzdHJ1Y3QgR2VuZXJhdG9ySW5mbyA6IElHZW5lcmF0b3JJbmZvIHsKKworICAgICAgICBHZW5lcmF0b3JJbmZvKCBzdGQ6OnNpemVfdCBzaXplICkKKyAgICAgICAgOiAgIG1fc2l6ZSggc2l6ZSApLAorICAgICAgICAgICAgbV9jdXJyZW50SW5kZXgoIDAgKQorICAgICAgICB7fQorCisgICAgICAgIGJvb2wgbW92ZU5leHQoKSB7CisgICAgICAgICAgICBpZiggKyttX2N1cnJlbnRJbmRleCA9PSBtX3NpemUgKSB7CisgICAgICAgICAgICAgICAgbV9jdXJyZW50SW5kZXggPSAwOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgc3RkOjpzaXplX3QgZ2V0Q3VycmVudEluZGV4KCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1fY3VycmVudEluZGV4OworICAgICAgICB9CisKKyAgICAgICAgc3RkOjpzaXplX3QgbV9zaXplOworICAgICAgICBzdGQ6OnNpemVfdCBtX2N1cnJlbnRJbmRleDsKKyAgICB9OworCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBjbGFzcyBHZW5lcmF0b3JzRm9yVGVzdCA6IHB1YmxpYyBJR2VuZXJhdG9yc0ZvclRlc3QgeworCisgICAgcHVibGljOgorICAgICAgICB+R2VuZXJhdG9yc0ZvclRlc3QoKSB7CisgICAgICAgICAgICBkZWxldGVBbGwoIG1fZ2VuZXJhdG9yc0luT3JkZXIgKTsKKyAgICAgICAgfQorCisgICAgICAgIElHZW5lcmF0b3JJbmZvJiBnZXRHZW5lcmF0b3JJbmZvKCBzdGQ6OnN0cmluZyBjb25zdCYgZmlsZUluZm8sIHN0ZDo6c2l6ZV90IHNpemUgKSB7CisgICAgICAgICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgSUdlbmVyYXRvckluZm8qPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX2dlbmVyYXRvcnNCeU5hbWUuZmluZCggZmlsZUluZm8gKTsKKyAgICAgICAgICAgIGlmKCBpdCA9PSBtX2dlbmVyYXRvcnNCeU5hbWUuZW5kKCkgKSB7CisgICAgICAgICAgICAgICAgSUdlbmVyYXRvckluZm8qIGluZm8gPSBuZXcgR2VuZXJhdG9ySW5mbyggc2l6ZSApOworICAgICAgICAgICAgICAgIG1fZ2VuZXJhdG9yc0J5TmFtZS5pbnNlcnQoIHN0ZDo6bWFrZV9wYWlyKCBmaWxlSW5mbywgaW5mbyApICk7CisgICAgICAgICAgICAgICAgbV9nZW5lcmF0b3JzSW5PcmRlci5wdXNoX2JhY2soIGluZm8gKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKmluZm87CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gKml0LT5zZWNvbmQ7CisgICAgICAgIH0KKworICAgICAgICBib29sIG1vdmVOZXh0KCkgeworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8SUdlbmVyYXRvckluZm8qPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX2dlbmVyYXRvcnNJbk9yZGVyLmJlZ2luKCk7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxJR2VuZXJhdG9ySW5mbyo+Ojpjb25zdF9pdGVyYXRvciBpdEVuZCA9IG1fZ2VuZXJhdG9yc0luT3JkZXIuZW5kKCk7CisgICAgICAgICAgICBmb3IoOyBpdCAhPSBpdEVuZDsgKytpdCApIHsKKyAgICAgICAgICAgICAgICBpZiggKCppdCktPm1vdmVOZXh0KCkgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIElHZW5lcmF0b3JJbmZvKj4gbV9nZW5lcmF0b3JzQnlOYW1lOworICAgICAgICBzdGQ6OnZlY3RvcjxJR2VuZXJhdG9ySW5mbyo+IG1fZ2VuZXJhdG9yc0luT3JkZXI7CisgICAgfTsKKworICAgIElHZW5lcmF0b3JzRm9yVGVzdCogY3JlYXRlR2VuZXJhdG9yc0ZvclRlc3QoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBHZW5lcmF0b3JzRm9yVGVzdCgpOworICAgIH0KKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9hc3NlcnRpb25yZXN1bHQuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9BU1NFUlRJT05SRVNVTFRfSFBQX0lOQ0xVREVECisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBBc3NlcnRpb25JbmZvOjpBc3NlcnRpb25JbmZvKCAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBfbWFjcm9OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTGluZUluZm8gY29uc3QmIF9saW5lSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBfY2FwdHVyZWRFeHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzdWx0RGlzcG9zaXRpb246OkZsYWdzIF9yZXN1bHREaXNwb3NpdGlvbiApCisgICAgOiAgIG1hY3JvTmFtZSggX21hY3JvTmFtZSApLAorICAgICAgICBsaW5lSW5mbyggX2xpbmVJbmZvICksCisgICAgICAgIGNhcHR1cmVkRXhwcmVzc2lvbiggX2NhcHR1cmVkRXhwcmVzc2lvbiApLAorICAgICAgICByZXN1bHREaXNwb3NpdGlvbiggX3Jlc3VsdERpc3Bvc2l0aW9uICkKKyAgICB7fQorCisgICAgQXNzZXJ0aW9uUmVzdWx0OjpBc3NlcnRpb25SZXN1bHQoKSB7fQorCisgICAgQXNzZXJ0aW9uUmVzdWx0OjpBc3NlcnRpb25SZXN1bHQoIEFzc2VydGlvbkluZm8gY29uc3QmIGluZm8sIEFzc2VydGlvblJlc3VsdERhdGEgY29uc3QmIGRhdGEgKQorICAgIDogICBtX2luZm8oIGluZm8gKSwKKyAgICAgICAgbV9yZXN1bHREYXRhKCBkYXRhICkKKyAgICB7fQorCisgICAgQXNzZXJ0aW9uUmVzdWx0Ojp+QXNzZXJ0aW9uUmVzdWx0KCkge30KKworICAgIC8vIFJlc3VsdCB3YXMgYSBzdWNjZXNzCisgICAgYm9vbCBBc3NlcnRpb25SZXN1bHQ6OnN1Y2NlZWRlZCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIENhdGNoOjppc09rKCBtX3Jlc3VsdERhdGEucmVzdWx0VHlwZSApOworICAgIH0KKworICAgIC8vIFJlc3VsdCB3YXMgYSBzdWNjZXNzLCBvciBmYWlsdXJlIGlzIHN1cHByZXNzZWQKKyAgICBib29sIEFzc2VydGlvblJlc3VsdDo6aXNPaygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIENhdGNoOjppc09rKCBtX3Jlc3VsdERhdGEucmVzdWx0VHlwZSApIHx8IHNob3VsZFN1cHByZXNzRmFpbHVyZSggbV9pbmZvLnJlc3VsdERpc3Bvc2l0aW9uICk7CisgICAgfQorCisgICAgUmVzdWx0V2FzOjpPZlR5cGUgQXNzZXJ0aW9uUmVzdWx0OjpnZXRSZXN1bHRUeXBlKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbV9yZXN1bHREYXRhLnJlc3VsdFR5cGU7CisgICAgfQorCisgICAgYm9vbCBBc3NlcnRpb25SZXN1bHQ6Omhhc0V4cHJlc3Npb24oKSBjb25zdCB7CisgICAgICAgIHJldHVybiAhbV9pbmZvLmNhcHR1cmVkRXhwcmVzc2lvbi5lbXB0eSgpOworICAgIH0KKworICAgIGJvb2wgQXNzZXJ0aW9uUmVzdWx0OjpoYXNNZXNzYWdlKCkgY29uc3QgeworICAgICAgICByZXR1cm4gIW1fcmVzdWx0RGF0YS5tZXNzYWdlLmVtcHR5KCk7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgQXNzZXJ0aW9uUmVzdWx0OjpnZXRFeHByZXNzaW9uKCkgY29uc3QgeworICAgICAgICBpZiggaXNGYWxzZVRlc3QoIG1faW5mby5yZXN1bHREaXNwb3NpdGlvbiApICkKKyAgICAgICAgICAgIHJldHVybiAnIScgKyBtX2luZm8uY2FwdHVyZWRFeHByZXNzaW9uOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gbV9pbmZvLmNhcHR1cmVkRXhwcmVzc2lvbjsKKyAgICB9CisgICAgc3RkOjpzdHJpbmcgQXNzZXJ0aW9uUmVzdWx0OjpnZXRFeHByZXNzaW9uSW5NYWNybygpIGNvbnN0IHsKKyAgICAgICAgaWYoIG1faW5mby5tYWNyb05hbWUuZW1wdHkoKSApCisgICAgICAgICAgICByZXR1cm4gbV9pbmZvLmNhcHR1cmVkRXhwcmVzc2lvbjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIG1faW5mby5tYWNyb05hbWUgKyAiKCAiICsgbV9pbmZvLmNhcHR1cmVkRXhwcmVzc2lvbiArICIgKSI7CisgICAgfQorCisgICAgYm9vbCBBc3NlcnRpb25SZXN1bHQ6Omhhc0V4cGFuZGVkRXhwcmVzc2lvbigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGhhc0V4cHJlc3Npb24oKSAmJiBnZXRFeHBhbmRlZEV4cHJlc3Npb24oKSAhPSBnZXRFeHByZXNzaW9uKCk7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgQXNzZXJ0aW9uUmVzdWx0OjpnZXRFeHBhbmRlZEV4cHJlc3Npb24oKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtX3Jlc3VsdERhdGEucmVjb25zdHJ1Y3RFeHByZXNzaW9uKCk7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgQXNzZXJ0aW9uUmVzdWx0OjpnZXRNZXNzYWdlKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbV9yZXN1bHREYXRhLm1lc3NhZ2U7CisgICAgfQorICAgIFNvdXJjZUxpbmVJbmZvIEFzc2VydGlvblJlc3VsdDo6Z2V0U291cmNlSW5mbygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1faW5mby5saW5lSW5mbzsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBBc3NlcnRpb25SZXN1bHQ6OmdldFRlc3RNYWNyb05hbWUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtX2luZm8ubWFjcm9OYW1lOworICAgIH0KKworICAgIHZvaWQgQXNzZXJ0aW9uUmVzdWx0OjpkaXNjYXJkRGVjb21wb3NlZEV4cHJlc3Npb24oKSBjb25zdCB7CisgICAgICAgIG1fcmVzdWx0RGF0YS5kZWNvbXBvc2VkRXhwcmVzc2lvbiA9IENBVENIX05VTEw7CisgICAgfQorCisgICAgdm9pZCBBc3NlcnRpb25SZXN1bHQ6OmV4cGFuZERlY29tcG9zZWRFeHByZXNzaW9uKCkgY29uc3QgeworICAgICAgICBtX3Jlc3VsdERhdGEucmVjb25zdHJ1Y3RFeHByZXNzaW9uKCk7CisgICAgfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3Rlc3RfY2FzZV9pbmZvLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfVEVTVF9DQVNFX0lORk9fSFBQX0lOQ0xVREVECisKKyNpbmNsdWRlIDxjY3R5cGU+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBpbmxpbmUgVGVzdENhc2VJbmZvOjpTcGVjaWFsUHJvcGVydGllcyBwYXJzZVNwZWNpYWxUYWcoIHN0ZDo6c3RyaW5nIGNvbnN0JiB0YWcgKSB7CisgICAgICAgIGlmKCBzdGFydHNXaXRoKCB0YWcsICcuJyApIHx8CisgICAgICAgICAgICB0YWcgPT0gImhpZGUiIHx8CisgICAgICAgICAgICB0YWcgPT0gIiFoaWRlIiApCisgICAgICAgICAgICByZXR1cm4gVGVzdENhc2VJbmZvOjpJc0hpZGRlbjsKKyAgICAgICAgZWxzZSBpZiggdGFnID09ICIhdGhyb3dzIiApCisgICAgICAgICAgICByZXR1cm4gVGVzdENhc2VJbmZvOjpUaHJvd3M7CisgICAgICAgIGVsc2UgaWYoIHRhZyA9PSAiIXNob3VsZGZhaWwiICkKKyAgICAgICAgICAgIHJldHVybiBUZXN0Q2FzZUluZm86OlNob3VsZEZhaWw7CisgICAgICAgIGVsc2UgaWYoIHRhZyA9PSAiIW1heWZhaWwiICkKKyAgICAgICAgICAgIHJldHVybiBUZXN0Q2FzZUluZm86Ok1heUZhaWw7CisgICAgICAgIGVsc2UgaWYoIHRhZyA9PSAiIW5vbnBvcnRhYmxlIiApCisgICAgICAgICAgICByZXR1cm4gVGVzdENhc2VJbmZvOjpOb25Qb3J0YWJsZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIFRlc3RDYXNlSW5mbzo6Tm9uZTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgaXNSZXNlcnZlZFRhZyggc3RkOjpzdHJpbmcgY29uc3QmIHRhZyApIHsKKyAgICAgICAgcmV0dXJuIHBhcnNlU3BlY2lhbFRhZyggdGFnICkgPT0gVGVzdENhc2VJbmZvOjpOb25lICYmIHRhZy5zaXplKCkgPiAwICYmICFzdGQ6OmlzYWxudW0oIHRhZ1swXSApOworICAgIH0KKyAgICBpbmxpbmUgdm9pZCBlbmZvcmNlTm90UmVzZXJ2ZWRUYWcoIHN0ZDo6c3RyaW5nIGNvbnN0JiB0YWcsIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBfbGluZUluZm8gKSB7CisgICAgICAgIGlmKCBpc1Jlc2VydmVkVGFnKCB0YWcgKSApIHsKKyAgICAgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzczsKKyAgICAgICAgICAgIHNzIDw8IENvbG91cihDb2xvdXI6OlJlZCkKKyAgICAgICAgICAgICAgIDw8ICJUYWcgbmFtZSBbIiA8PCB0YWcgPDwgIl0gbm90IGFsbG93ZWQuXG4iCisgICAgICAgICAgICAgICA8PCAiVGFnIG5hbWVzIHN0YXJ0aW5nIHdpdGggbm9uIGFscGhhLW51bWVyaWMgY2hhcmFjdGVycyBhcmUgcmVzZXJ2ZWRcbiIKKyAgICAgICAgICAgICAgIDw8IENvbG91cihDb2xvdXI6OkZpbGVOYW1lKQorICAgICAgICAgICAgICAgPDwgX2xpbmVJbmZvIDw8ICdcbic7CisgICAgICAgICAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3Ioc3Muc3RyKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgVGVzdENhc2UgbWFrZVRlc3RDYXNlKCAgSVRlc3RDYXNlKiBfdGVzdENhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIF9jbGFzc05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBfZGVzY09yVGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMaW5lSW5mbyBjb25zdCYgX2xpbmVJbmZvICkKKyAgICB7CisgICAgICAgIGJvb2wgaXNIaWRkZW4oIHN0YXJ0c1dpdGgoIF9uYW1lLCAiLi8iICkgKTsgLy8gTGVnYWN5IHN1cHBvcnQKKworICAgICAgICAvLyBQYXJzZSBvdXQgdGFncworICAgICAgICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gdGFnczsKKyAgICAgICAgc3RkOjpzdHJpbmcgZGVzYywgdGFnOworICAgICAgICBib29sIGluVGFnID0gZmFsc2U7CisgICAgICAgIGZvciggc3RkOjpzaXplX3QgaSA9IDA7IGkgPCBfZGVzY09yVGFncy5zaXplKCk7ICsraSApIHsKKyAgICAgICAgICAgIGNoYXIgYyA9IF9kZXNjT3JUYWdzW2ldOworICAgICAgICAgICAgaWYoICFpblRhZyApIHsKKyAgICAgICAgICAgICAgICBpZiggYyA9PSAnWycgKQorICAgICAgICAgICAgICAgICAgICBpblRhZyA9IHRydWU7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBkZXNjICs9IGM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiggYyA9PSAnXScgKSB7CisgICAgICAgICAgICAgICAgICAgIFRlc3RDYXNlSW5mbzo6U3BlY2lhbFByb3BlcnRpZXMgcHJvcCA9IHBhcnNlU3BlY2lhbFRhZyggdGFnICk7CisgICAgICAgICAgICAgICAgICAgIGlmKCBwcm9wID09IFRlc3RDYXNlSW5mbzo6SXNIaWRkZW4gKQorICAgICAgICAgICAgICAgICAgICAgICAgaXNIaWRkZW4gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBwcm9wID09IFRlc3RDYXNlSW5mbzo6Tm9uZSApCisgICAgICAgICAgICAgICAgICAgICAgICBlbmZvcmNlTm90UmVzZXJ2ZWRUYWcoIHRhZywgX2xpbmVJbmZvICk7CisKKyAgICAgICAgICAgICAgICAgICAgdGFncy5pbnNlcnQoIHRhZyApOworICAgICAgICAgICAgICAgICAgICB0YWcuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgaW5UYWcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB0YWcgKz0gYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiggaXNIaWRkZW4gKSB7CisgICAgICAgICAgICB0YWdzLmluc2VydCggImhpZGUiICk7CisgICAgICAgICAgICB0YWdzLmluc2VydCggIi4iICk7CisgICAgICAgIH0KKworICAgICAgICBUZXN0Q2FzZUluZm8gaW5mbyggX25hbWUsIF9jbGFzc05hbWUsIGRlc2MsIHRhZ3MsIF9saW5lSW5mbyApOworICAgICAgICByZXR1cm4gVGVzdENhc2UoIF90ZXN0Q2FzZSwgaW5mbyApOworICAgIH0KKworICAgIHZvaWQgc2V0VGFncyggVGVzdENhc2VJbmZvJiB0ZXN0Q2FzZUluZm8sIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBjb25zdCYgdGFncyApCisgICAgeworICAgICAgICB0ZXN0Q2FzZUluZm8udGFncyA9IHRhZ3M7CisgICAgICAgIHRlc3RDYXNlSW5mby5sY2FzZVRhZ3MuY2xlYXIoKTsKKworICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICAgICAgICBmb3IoIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSB0YWdzLmJlZ2luKCksIGl0RW5kID0gdGFncy5lbmQoKTsgaXQgIT0gaXRFbmQ7ICsraXQgKSB7CisgICAgICAgICAgICBvc3MgPDwgJ1snIDw8ICppdCA8PCAnXSc7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBsY2FzZVRhZyA9IHRvTG93ZXIoICppdCApOworICAgICAgICAgICAgdGVzdENhc2VJbmZvLnByb3BlcnRpZXMgPSBzdGF0aWNfY2FzdDxUZXN0Q2FzZUluZm86OlNwZWNpYWxQcm9wZXJ0aWVzPiggdGVzdENhc2VJbmZvLnByb3BlcnRpZXMgfCBwYXJzZVNwZWNpYWxUYWcoIGxjYXNlVGFnICkgKTsKKyAgICAgICAgICAgIHRlc3RDYXNlSW5mby5sY2FzZVRhZ3MuaW5zZXJ0KCBsY2FzZVRhZyApOworICAgICAgICB9CisgICAgICAgIHRlc3RDYXNlSW5mby50YWdzQXNTdHJpbmcgPSBvc3Muc3RyKCk7CisgICAgfQorCisgICAgVGVzdENhc2VJbmZvOjpUZXN0Q2FzZUluZm8oIHN0ZDo6c3RyaW5nIGNvbnN0JiBfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIF9jbGFzc05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBfZGVzY3JpcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBjb25zdCYgX3RhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBfbGluZUluZm8gKQorICAgIDogICBuYW1lKCBfbmFtZSApLAorICAgICAgICBjbGFzc05hbWUoIF9jbGFzc05hbWUgKSwKKyAgICAgICAgZGVzY3JpcHRpb24oIF9kZXNjcmlwdGlvbiApLAorICAgICAgICBsaW5lSW5mbyggX2xpbmVJbmZvICksCisgICAgICAgIHByb3BlcnRpZXMoIE5vbmUgKQorICAgIHsKKyAgICAgICAgc2V0VGFncyggKnRoaXMsIF90YWdzICk7CisgICAgfQorCisgICAgVGVzdENhc2VJbmZvOjpUZXN0Q2FzZUluZm8oIFRlc3RDYXNlSW5mbyBjb25zdCYgb3RoZXIgKQorICAgIDogICBuYW1lKCBvdGhlci5uYW1lICksCisgICAgICAgIGNsYXNzTmFtZSggb3RoZXIuY2xhc3NOYW1lICksCisgICAgICAgIGRlc2NyaXB0aW9uKCBvdGhlci5kZXNjcmlwdGlvbiApLAorICAgICAgICB0YWdzKCBvdGhlci50YWdzICksCisgICAgICAgIGxjYXNlVGFncyggb3RoZXIubGNhc2VUYWdzICksCisgICAgICAgIHRhZ3NBc1N0cmluZyggb3RoZXIudGFnc0FzU3RyaW5nICksCisgICAgICAgIGxpbmVJbmZvKCBvdGhlci5saW5lSW5mbyApLAorICAgICAgICBwcm9wZXJ0aWVzKCBvdGhlci5wcm9wZXJ0aWVzICkKKyAgICB7fQorCisgICAgYm9vbCBUZXN0Q2FzZUluZm86OmlzSGlkZGVuKCkgY29uc3QgeworICAgICAgICByZXR1cm4gKCBwcm9wZXJ0aWVzICYgSXNIaWRkZW4gKSAhPSAwOworICAgIH0KKyAgICBib29sIFRlc3RDYXNlSW5mbzo6dGhyb3dzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gKCBwcm9wZXJ0aWVzICYgVGhyb3dzICkgIT0gMDsKKyAgICB9CisgICAgYm9vbCBUZXN0Q2FzZUluZm86Om9rVG9GYWlsKCkgY29uc3QgeworICAgICAgICByZXR1cm4gKCBwcm9wZXJ0aWVzICYgKFNob3VsZEZhaWwgfCBNYXlGYWlsICkgKSAhPSAwOworICAgIH0KKyAgICBib29sIFRlc3RDYXNlSW5mbzo6ZXhwZWN0ZWRUb0ZhaWwoKSBjb25zdCB7CisgICAgICAgIHJldHVybiAoIHByb3BlcnRpZXMgJiAoU2hvdWxkRmFpbCApICkgIT0gMDsKKyAgICB9CisKKyAgICBUZXN0Q2FzZTo6VGVzdENhc2UoIElUZXN0Q2FzZSogdGVzdENhc2UsIFRlc3RDYXNlSW5mbyBjb25zdCYgaW5mbyApIDogVGVzdENhc2VJbmZvKCBpbmZvICksIHRlc3QoIHRlc3RDYXNlICkge30KKworICAgIFRlc3RDYXNlOjpUZXN0Q2FzZSggVGVzdENhc2UgY29uc3QmIG90aGVyICkKKyAgICA6ICAgVGVzdENhc2VJbmZvKCBvdGhlciApLAorICAgICAgICB0ZXN0KCBvdGhlci50ZXN0ICkKKyAgICB7fQorCisgICAgVGVzdENhc2UgVGVzdENhc2U6OndpdGhOYW1lKCBzdGQ6OnN0cmluZyBjb25zdCYgX25ld05hbWUgKSBjb25zdCB7CisgICAgICAgIFRlc3RDYXNlIG90aGVyKCAqdGhpcyApOworICAgICAgICBvdGhlci5uYW1lID0gX25ld05hbWU7CisgICAgICAgIHJldHVybiBvdGhlcjsKKyAgICB9CisKKyAgICB2b2lkIFRlc3RDYXNlOjpzd2FwKCBUZXN0Q2FzZSYgb3RoZXIgKSB7CisgICAgICAgIHRlc3Quc3dhcCggb3RoZXIudGVzdCApOworICAgICAgICBuYW1lLnN3YXAoIG90aGVyLm5hbWUgKTsKKyAgICAgICAgY2xhc3NOYW1lLnN3YXAoIG90aGVyLmNsYXNzTmFtZSApOworICAgICAgICBkZXNjcmlwdGlvbi5zd2FwKCBvdGhlci5kZXNjcmlwdGlvbiApOworICAgICAgICB0YWdzLnN3YXAoIG90aGVyLnRhZ3MgKTsKKyAgICAgICAgbGNhc2VUYWdzLnN3YXAoIG90aGVyLmxjYXNlVGFncyApOworICAgICAgICB0YWdzQXNTdHJpbmcuc3dhcCggb3RoZXIudGFnc0FzU3RyaW5nICk7CisgICAgICAgIHN0ZDo6c3dhcCggVGVzdENhc2VJbmZvOjpwcm9wZXJ0aWVzLCBzdGF0aWNfY2FzdDxUZXN0Q2FzZUluZm8mPiggb3RoZXIgKS5wcm9wZXJ0aWVzICk7CisgICAgICAgIHN0ZDo6c3dhcCggbGluZUluZm8sIG90aGVyLmxpbmVJbmZvICk7CisgICAgfQorCisgICAgdm9pZCBUZXN0Q2FzZTo6aW52b2tlKCkgY29uc3QgeworICAgICAgICB0ZXN0LT5pbnZva2UoKTsKKyAgICB9CisKKyAgICBib29sIFRlc3RDYXNlOjpvcGVyYXRvciA9PSAoIFRlc3RDYXNlIGNvbnN0JiBvdGhlciApIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICB0ZXN0LmdldCgpID09IG90aGVyLnRlc3QuZ2V0KCkgJiYKKyAgICAgICAgICAgICAgICBuYW1lID09IG90aGVyLm5hbWUgJiYKKyAgICAgICAgICAgICAgICBjbGFzc05hbWUgPT0gb3RoZXIuY2xhc3NOYW1lOworICAgIH0KKworICAgIGJvb2wgVGVzdENhc2U6Om9wZXJhdG9yIDwgKCBUZXN0Q2FzZSBjb25zdCYgb3RoZXIgKSBjb25zdCB7CisgICAgICAgIHJldHVybiBuYW1lIDwgb3RoZXIubmFtZTsKKyAgICB9CisgICAgVGVzdENhc2UmIFRlc3RDYXNlOjpvcGVyYXRvciA9ICggVGVzdENhc2UgY29uc3QmIG90aGVyICkgeworICAgICAgICBUZXN0Q2FzZSB0ZW1wKCBvdGhlciApOworICAgICAgICBzd2FwKCB0ZW1wICk7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBUZXN0Q2FzZUluZm8gY29uc3QmIFRlc3RDYXNlOjpnZXRUZXN0Q2FzZUluZm8oKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF92ZXJzaW9uLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfVkVSU0lPTl9IUFBfSU5DTFVERUQKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIFZlcnNpb246OlZlcnNpb24KKyAgICAgICAgKCAgIHVuc2lnbmVkIGludCBfbWFqb3JWZXJzaW9uLAorICAgICAgICAgICAgdW5zaWduZWQgaW50IF9taW5vclZlcnNpb24sCisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgX3BhdGNoTnVtYmVyLAorICAgICAgICAgICAgY2hhciBjb25zdCAqIGNvbnN0IF9icmFuY2hOYW1lLAorICAgICAgICAgICAgdW5zaWduZWQgaW50IF9idWlsZE51bWJlciApCisgICAgOiAgIG1ham9yVmVyc2lvbiggX21ham9yVmVyc2lvbiApLAorICAgICAgICBtaW5vclZlcnNpb24oIF9taW5vclZlcnNpb24gKSwKKyAgICAgICAgcGF0Y2hOdW1iZXIoIF9wYXRjaE51bWJlciApLAorICAgICAgICBicmFuY2hOYW1lKCBfYnJhbmNoTmFtZSApLAorICAgICAgICBidWlsZE51bWJlciggX2J1aWxkTnVtYmVyICkKKyAgICB7fQorCisgICAgc3RkOjpvc3RyZWFtJiBvcGVyYXRvciA8PCAoIHN0ZDo6b3N0cmVhbSYgb3MsIFZlcnNpb24gY29uc3QmIHZlcnNpb24gKSB7CisgICAgICAgIG9zICA8PCB2ZXJzaW9uLm1ham9yVmVyc2lvbiA8PCAnLicKKyAgICAgICAgICAgIDw8IHZlcnNpb24ubWlub3JWZXJzaW9uIDw8ICcuJworICAgICAgICAgICAgPDwgdmVyc2lvbi5wYXRjaE51bWJlcjsKKyAgICAgICAgLy8gYnJhbmNoTmFtZSBpcyBuZXZlciBudWxsIC0+IDB0aCBjaGFyIGlzIFwwIGlmIGl0IGlzIGVtcHR5CisgICAgICAgIGlmICh2ZXJzaW9uLmJyYW5jaE5hbWVbMF0pIHsKKyAgICAgICAgICAgIG9zIDw8ICctJyA8PCB2ZXJzaW9uLmJyYW5jaE5hbWUKKyAgICAgICAgICAgICAgIDw8ICcuJyA8PCB2ZXJzaW9uLmJ1aWxkTnVtYmVyOworICAgICAgICB9CisgICAgICAgIHJldHVybiBvczsKKyAgICB9CisKKyAgICBpbmxpbmUgVmVyc2lvbiBsaWJyYXJ5VmVyc2lvbigpIHsKKyAgICAgICAgc3RhdGljIFZlcnNpb24gdmVyc2lvbiggMSwgOSwgNCwgIiIsIDAgKTsKKyAgICAgICAgcmV0dXJuIHZlcnNpb247CisgICAgfQorCit9CisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9tZXNzYWdlLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfTUVTU0FHRV9IUFBfSU5DTFVERUQKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIE1lc3NhZ2VJbmZvOjpNZXNzYWdlSW5mbyggICBzdGQ6OnN0cmluZyBjb25zdCYgX21hY3JvTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTGluZUluZm8gY29uc3QmIF9saW5lSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzdWx0V2FzOjpPZlR5cGUgX3R5cGUgKQorICAgIDogICBtYWNyb05hbWUoIF9tYWNyb05hbWUgKSwKKyAgICAgICAgbGluZUluZm8oIF9saW5lSW5mbyApLAorICAgICAgICB0eXBlKCBfdHlwZSApLAorICAgICAgICBzZXF1ZW5jZSggKytnbG9iYWxDb3VudCApCisgICAge30KKworICAgIC8vIFRoaXMgbWF5IG5lZWQgcHJvdGVjdGluZyBpZiB0aHJlYWRpbmcgc3VwcG9ydCBpcyBhZGRlZAorICAgIHVuc2lnbmVkIGludCBNZXNzYWdlSW5mbzo6Z2xvYmFsQ291bnQgPSAwOworCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgU2NvcGVkTWVzc2FnZTo6U2NvcGVkTWVzc2FnZSggTWVzc2FnZUJ1aWxkZXIgY29uc3QmIGJ1aWxkZXIgKQorICAgIDogbV9pbmZvKCBidWlsZGVyLm1faW5mbyApCisgICAgeworICAgICAgICBtX2luZm8ubWVzc2FnZSA9IGJ1aWxkZXIubV9zdHJlYW0uc3RyKCk7CisgICAgICAgIGdldFJlc3VsdENhcHR1cmUoKS5wdXNoU2NvcGVkTWVzc2FnZSggbV9pbmZvICk7CisgICAgfQorICAgIFNjb3BlZE1lc3NhZ2U6OlNjb3BlZE1lc3NhZ2UoIFNjb3BlZE1lc3NhZ2UgY29uc3QmIG90aGVyICkKKyAgICA6IG1faW5mbyggb3RoZXIubV9pbmZvICkKKyAgICB7fQorCisgICAgU2NvcGVkTWVzc2FnZTo6flNjb3BlZE1lc3NhZ2UoKSB7CisgICAgICAgIGlmICggIXN0ZDo6dW5jYXVnaHRfZXhjZXB0aW9uKCkgKXsKKyAgICAgICAgICAgIGdldFJlc3VsdENhcHR1cmUoKS5wb3BTY29wZWRNZXNzYWdlKG1faW5mbyk7CisgICAgICAgIH0KKyAgICB9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfbGVnYWN5X3JlcG9ydGVyX2FkYXB0ZXIuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9MRUdBQ1lfUkVQT1JURVJfQURBUFRFUl9IUFBfSU5DTFVERUQKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX2xlZ2FjeV9yZXBvcnRlcl9hZGFwdGVyLmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0xFR0FDWV9SRVBPUlRFUl9BREFQVEVSX0hfSU5DTFVERUQKKworbmFtZXNwYWNlIENhdGNoCit7CisgICAgLy8gRGVwcmVjYXRlZAorICAgIHN0cnVjdCBJUmVwb3J0ZXIgOiBJU2hhcmVkIHsKKyAgICAgICAgdmlydHVhbCB+SVJlcG9ydGVyKCk7CisKKyAgICAgICAgdmlydHVhbCBib29sIHNob3VsZFJlZGlyZWN0U3Rkb3V0KCkgY29uc3QgPSAwOworCisgICAgICAgIHZpcnR1YWwgdm9pZCBTdGFydFRlc3RpbmcoKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBFbmRUZXN0aW5nKCBUb3RhbHMgY29uc3QmIHRvdGFscyApID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIFN0YXJ0R3JvdXAoIHN0ZDo6c3RyaW5nIGNvbnN0JiBncm91cE5hbWUgKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBFbmRHcm91cCggc3RkOjpzdHJpbmcgY29uc3QmIGdyb3VwTmFtZSwgVG90YWxzIGNvbnN0JiB0b3RhbHMgKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBTdGFydFRlc3RDYXNlKCBUZXN0Q2FzZUluZm8gY29uc3QmIHRlc3RJbmZvICkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgRW5kVGVzdENhc2UoIFRlc3RDYXNlSW5mbyBjb25zdCYgdGVzdEluZm8sIFRvdGFscyBjb25zdCYgdG90YWxzLCBzdGQ6OnN0cmluZyBjb25zdCYgc3RkT3V0LCBzdGQ6OnN0cmluZyBjb25zdCYgc3RkRXJyICkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgU3RhcnRTZWN0aW9uKCBzdGQ6OnN0cmluZyBjb25zdCYgc2VjdGlvbk5hbWUsIHN0ZDo6c3RyaW5nIGNvbnN0JiBkZXNjcmlwdGlvbiApID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIEVuZFNlY3Rpb24oIHN0ZDo6c3RyaW5nIGNvbnN0JiBzZWN0aW9uTmFtZSwgQ291bnRzIGNvbnN0JiBhc3NlcnRpb25zICkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgTm9Bc3NlcnRpb25zSW5TZWN0aW9uKCBzdGQ6OnN0cmluZyBjb25zdCYgc2VjdGlvbk5hbWUgKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBOb0Fzc2VydGlvbnNJblRlc3RDYXNlKCBzdGQ6OnN0cmluZyBjb25zdCYgdGVzdE5hbWUgKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBBYm9ydGVkKCkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgUmVzdWx0KCBBc3NlcnRpb25SZXN1bHQgY29uc3QmIHJlc3VsdCApID0gMDsKKyAgICB9OworCisgICAgY2xhc3MgTGVnYWN5UmVwb3J0ZXJBZGFwdGVyIDogcHVibGljIFNoYXJlZEltcGw8SVN0cmVhbWluZ1JlcG9ydGVyPgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAgIExlZ2FjeVJlcG9ydGVyQWRhcHRlciggUHRyPElSZXBvcnRlcj4gY29uc3QmIGxlZ2FjeVJlcG9ydGVyICk7CisgICAgICAgIHZpcnR1YWwgfkxlZ2FjeVJlcG9ydGVyQWRhcHRlcigpOworCisgICAgICAgIHZpcnR1YWwgUmVwb3J0ZXJQcmVmZXJlbmNlcyBnZXRQcmVmZXJlbmNlcygpIGNvbnN0OworICAgICAgICB2aXJ0dWFsIHZvaWQgbm9NYXRjaGluZ1Rlc3RDYXNlcyggc3RkOjpzdHJpbmcgY29uc3QmICk7CisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0UnVuU3RhcnRpbmcoIFRlc3RSdW5JbmZvIGNvbnN0JiApOworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdEdyb3VwU3RhcnRpbmcoIEdyb3VwSW5mbyBjb25zdCYgZ3JvdXBJbmZvICk7CisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0Q2FzZVN0YXJ0aW5nKCBUZXN0Q2FzZUluZm8gY29uc3QmIHRlc3RJbmZvICk7CisgICAgICAgIHZpcnR1YWwgdm9pZCBzZWN0aW9uU3RhcnRpbmcoIFNlY3Rpb25JbmZvIGNvbnN0JiBzZWN0aW9uSW5mbyApOworICAgICAgICB2aXJ0dWFsIHZvaWQgYXNzZXJ0aW9uU3RhcnRpbmcoIEFzc2VydGlvbkluZm8gY29uc3QmICk7CisgICAgICAgIHZpcnR1YWwgYm9vbCBhc3NlcnRpb25FbmRlZCggQXNzZXJ0aW9uU3RhdHMgY29uc3QmIGFzc2VydGlvblN0YXRzICk7CisgICAgICAgIHZpcnR1YWwgdm9pZCBzZWN0aW9uRW5kZWQoIFNlY3Rpb25TdGF0cyBjb25zdCYgc2VjdGlvblN0YXRzICk7CisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0Q2FzZUVuZGVkKCBUZXN0Q2FzZVN0YXRzIGNvbnN0JiB0ZXN0Q2FzZVN0YXRzICk7CisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0R3JvdXBFbmRlZCggVGVzdEdyb3VwU3RhdHMgY29uc3QmIHRlc3RHcm91cFN0YXRzICk7CisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0UnVuRW5kZWQoIFRlc3RSdW5TdGF0cyBjb25zdCYgdGVzdFJ1blN0YXRzICk7CisgICAgICAgIHZpcnR1YWwgdm9pZCBza2lwVGVzdCggVGVzdENhc2VJbmZvIGNvbnN0JiApOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgUHRyPElSZXBvcnRlcj4gbV9sZWdhY3lSZXBvcnRlcjsKKyAgICB9OworfQorCituYW1lc3BhY2UgQ2F0Y2gKK3sKKyAgICBMZWdhY3lSZXBvcnRlckFkYXB0ZXI6OkxlZ2FjeVJlcG9ydGVyQWRhcHRlciggUHRyPElSZXBvcnRlcj4gY29uc3QmIGxlZ2FjeVJlcG9ydGVyICkKKyAgICA6ICAgbV9sZWdhY3lSZXBvcnRlciggbGVnYWN5UmVwb3J0ZXIgKQorICAgIHt9CisgICAgTGVnYWN5UmVwb3J0ZXJBZGFwdGVyOjp+TGVnYWN5UmVwb3J0ZXJBZGFwdGVyKCkge30KKworICAgIFJlcG9ydGVyUHJlZmVyZW5jZXMgTGVnYWN5UmVwb3J0ZXJBZGFwdGVyOjpnZXRQcmVmZXJlbmNlcygpIGNvbnN0IHsKKyAgICAgICAgUmVwb3J0ZXJQcmVmZXJlbmNlcyBwcmVmczsKKyAgICAgICAgcHJlZnMuc2hvdWxkUmVkaXJlY3RTdGRPdXQgPSBtX2xlZ2FjeVJlcG9ydGVyLT5zaG91bGRSZWRpcmVjdFN0ZG91dCgpOworICAgICAgICByZXR1cm4gcHJlZnM7CisgICAgfQorCisgICAgdm9pZCBMZWdhY3lSZXBvcnRlckFkYXB0ZXI6Om5vTWF0Y2hpbmdUZXN0Q2FzZXMoIHN0ZDo6c3RyaW5nIGNvbnN0JiApIHt9CisgICAgdm9pZCBMZWdhY3lSZXBvcnRlckFkYXB0ZXI6OnRlc3RSdW5TdGFydGluZyggVGVzdFJ1bkluZm8gY29uc3QmICkgeworICAgICAgICBtX2xlZ2FjeVJlcG9ydGVyLT5TdGFydFRlc3RpbmcoKTsKKyAgICB9CisgICAgdm9pZCBMZWdhY3lSZXBvcnRlckFkYXB0ZXI6OnRlc3RHcm91cFN0YXJ0aW5nKCBHcm91cEluZm8gY29uc3QmIGdyb3VwSW5mbyApIHsKKyAgICAgICAgbV9sZWdhY3lSZXBvcnRlci0+U3RhcnRHcm91cCggZ3JvdXBJbmZvLm5hbWUgKTsKKyAgICB9CisgICAgdm9pZCBMZWdhY3lSZXBvcnRlckFkYXB0ZXI6OnRlc3RDYXNlU3RhcnRpbmcoIFRlc3RDYXNlSW5mbyBjb25zdCYgdGVzdEluZm8gKSB7CisgICAgICAgIG1fbGVnYWN5UmVwb3J0ZXItPlN0YXJ0VGVzdENhc2UoIHRlc3RJbmZvICk7CisgICAgfQorICAgIHZvaWQgTGVnYWN5UmVwb3J0ZXJBZGFwdGVyOjpzZWN0aW9uU3RhcnRpbmcoIFNlY3Rpb25JbmZvIGNvbnN0JiBzZWN0aW9uSW5mbyApIHsKKyAgICAgICAgbV9sZWdhY3lSZXBvcnRlci0+U3RhcnRTZWN0aW9uKCBzZWN0aW9uSW5mby5uYW1lLCBzZWN0aW9uSW5mby5kZXNjcmlwdGlvbiApOworICAgIH0KKyAgICB2b2lkIExlZ2FjeVJlcG9ydGVyQWRhcHRlcjo6YXNzZXJ0aW9uU3RhcnRpbmcoIEFzc2VydGlvbkluZm8gY29uc3QmICkgeworICAgICAgICAvLyBOb3Qgb24gbGVnYWN5IGludGVyZmFjZQorICAgIH0KKworICAgIGJvb2wgTGVnYWN5UmVwb3J0ZXJBZGFwdGVyOjphc3NlcnRpb25FbmRlZCggQXNzZXJ0aW9uU3RhdHMgY29uc3QmIGFzc2VydGlvblN0YXRzICkgeworICAgICAgICBpZiggYXNzZXJ0aW9uU3RhdHMuYXNzZXJ0aW9uUmVzdWx0LmdldFJlc3VsdFR5cGUoKSAhPSBSZXN1bHRXYXM6Ok9rICkgeworICAgICAgICAgICAgZm9yKCBzdGQ6OnZlY3RvcjxNZXNzYWdlSW5mbz46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gYXNzZXJ0aW9uU3RhdHMuaW5mb01lc3NhZ2VzLmJlZ2luKCksIGl0RW5kID0gYXNzZXJ0aW9uU3RhdHMuaW5mb01lc3NhZ2VzLmVuZCgpOworICAgICAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICAgICAgKytpdCApIHsKKyAgICAgICAgICAgICAgICBpZiggaXQtPnR5cGUgPT0gUmVzdWx0V2FzOjpJbmZvICkgeworICAgICAgICAgICAgICAgICAgICBSZXN1bHRCdWlsZGVyIHJiKCBpdC0+bWFjcm9OYW1lLmNfc3RyKCksIGl0LT5saW5lSW5mbywgIiIsIFJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwgKTsKKyAgICAgICAgICAgICAgICAgICAgcmIgPDwgaXQtPm1lc3NhZ2U7CisgICAgICAgICAgICAgICAgICAgIHJiLnNldFJlc3VsdFR5cGUoIFJlc3VsdFdhczo6SW5mbyApOworICAgICAgICAgICAgICAgICAgICBBc3NlcnRpb25SZXN1bHQgcmVzdWx0ID0gcmIuYnVpbGQoKTsKKyAgICAgICAgICAgICAgICAgICAgbV9sZWdhY3lSZXBvcnRlci0+UmVzdWx0KCByZXN1bHQgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbV9sZWdhY3lSZXBvcnRlci0+UmVzdWx0KCBhc3NlcnRpb25TdGF0cy5hc3NlcnRpb25SZXN1bHQgKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHZvaWQgTGVnYWN5UmVwb3J0ZXJBZGFwdGVyOjpzZWN0aW9uRW5kZWQoIFNlY3Rpb25TdGF0cyBjb25zdCYgc2VjdGlvblN0YXRzICkgeworICAgICAgICBpZiggc2VjdGlvblN0YXRzLm1pc3NpbmdBc3NlcnRpb25zICkKKyAgICAgICAgICAgIG1fbGVnYWN5UmVwb3J0ZXItPk5vQXNzZXJ0aW9uc0luU2VjdGlvbiggc2VjdGlvblN0YXRzLnNlY3Rpb25JbmZvLm5hbWUgKTsKKyAgICAgICAgbV9sZWdhY3lSZXBvcnRlci0+RW5kU2VjdGlvbiggc2VjdGlvblN0YXRzLnNlY3Rpb25JbmZvLm5hbWUsIHNlY3Rpb25TdGF0cy5hc3NlcnRpb25zICk7CisgICAgfQorICAgIHZvaWQgTGVnYWN5UmVwb3J0ZXJBZGFwdGVyOjp0ZXN0Q2FzZUVuZGVkKCBUZXN0Q2FzZVN0YXRzIGNvbnN0JiB0ZXN0Q2FzZVN0YXRzICkgeworICAgICAgICBtX2xlZ2FjeVJlcG9ydGVyLT5FbmRUZXN0Q2FzZQorICAgICAgICAgICAgKCAgIHRlc3RDYXNlU3RhdHMudGVzdEluZm8sCisgICAgICAgICAgICAgICAgdGVzdENhc2VTdGF0cy50b3RhbHMsCisgICAgICAgICAgICAgICAgdGVzdENhc2VTdGF0cy5zdGRPdXQsCisgICAgICAgICAgICAgICAgdGVzdENhc2VTdGF0cy5zdGRFcnIgKTsKKyAgICB9CisgICAgdm9pZCBMZWdhY3lSZXBvcnRlckFkYXB0ZXI6OnRlc3RHcm91cEVuZGVkKCBUZXN0R3JvdXBTdGF0cyBjb25zdCYgdGVzdEdyb3VwU3RhdHMgKSB7CisgICAgICAgIGlmKCB0ZXN0R3JvdXBTdGF0cy5hYm9ydGluZyApCisgICAgICAgICAgICBtX2xlZ2FjeVJlcG9ydGVyLT5BYm9ydGVkKCk7CisgICAgICAgIG1fbGVnYWN5UmVwb3J0ZXItPkVuZEdyb3VwKCB0ZXN0R3JvdXBTdGF0cy5ncm91cEluZm8ubmFtZSwgdGVzdEdyb3VwU3RhdHMudG90YWxzICk7CisgICAgfQorICAgIHZvaWQgTGVnYWN5UmVwb3J0ZXJBZGFwdGVyOjp0ZXN0UnVuRW5kZWQoIFRlc3RSdW5TdGF0cyBjb25zdCYgdGVzdFJ1blN0YXRzICkgeworICAgICAgICBtX2xlZ2FjeVJlcG9ydGVyLT5FbmRUZXN0aW5nKCB0ZXN0UnVuU3RhdHMudG90YWxzICk7CisgICAgfQorICAgIHZvaWQgTGVnYWN5UmVwb3J0ZXJBZGFwdGVyOjpza2lwVGVzdCggVGVzdENhc2VJbmZvIGNvbnN0JiApIHsKKyAgICB9Cit9CisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF90aW1lci5ocHAKKworI2lmZGVmIF9fY2xhbmdfXworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHB1c2gKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV2MrKzExLWxvbmctbG9uZyIKKyNlbmRpZgorCisjaWZkZWYgQ0FUQ0hfUExBVEZPUk1fV0lORE9XUworCisjZWxzZQorCisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKworI2VuZGlmCisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBuYW1lc3BhY2UgeworI2lmZGVmIENBVENIX1BMQVRGT1JNX1dJTkRPV1MKKyAgICAgICAgVUludDY0IGdldEN1cnJlbnRUaWNrcygpIHsKKyAgICAgICAgICAgIHN0YXRpYyBVSW50NjQgaHo9MCwgaHpvPTA7CisgICAgICAgICAgICBpZiAoIWh6KSB7CisgICAgICAgICAgICAgICAgUXVlcnlQZXJmb3JtYW5jZUZyZXF1ZW5jeSggcmVpbnRlcnByZXRfY2FzdDxMQVJHRV9JTlRFR0VSKj4oICZoeiApICk7CisgICAgICAgICAgICAgICAgUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIoIHJlaW50ZXJwcmV0X2Nhc3Q8TEFSR0VfSU5URUdFUio+KCAmaHpvICkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFVJbnQ2NCB0OworICAgICAgICAgICAgUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIoIHJlaW50ZXJwcmV0X2Nhc3Q8TEFSR0VfSU5URUdFUio+KCAmdCApICk7CisgICAgICAgICAgICByZXR1cm4gKCh0LWh6bykqMTAwMDAwMCkvaHo7CisgICAgICAgIH0KKyNlbHNlCisgICAgICAgIFVJbnQ2NCBnZXRDdXJyZW50VGlja3MoKSB7CisgICAgICAgICAgICB0aW1ldmFsIHQ7CisgICAgICAgICAgICBnZXR0aW1lb2ZkYXkoJnQsQ0FUQ0hfTlVMTCk7CisgICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VUludDY0PiggdC50dl9zZWMgKSAqIDEwMDAwMDB1bGwgKyBzdGF0aWNfY2FzdDxVSW50NjQ+KCB0LnR2X3VzZWMgKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgfQorCisgICAgdm9pZCBUaW1lcjo6c3RhcnQoKSB7CisgICAgICAgIG1fdGlja3MgPSBnZXRDdXJyZW50VGlja3MoKTsKKyAgICB9CisgICAgdW5zaWduZWQgaW50IFRpbWVyOjpnZXRFbGFwc2VkTWljcm9zZWNvbmRzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PihnZXRDdXJyZW50VGlja3MoKSAtIG1fdGlja3MpOworICAgIH0KKyAgICB1bnNpZ25lZCBpbnQgVGltZXI6OmdldEVsYXBzZWRNaWxsaXNlY29uZHMoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KGdldEVsYXBzZWRNaWNyb3NlY29uZHMoKS8xMDAwKTsKKyAgICB9CisgICAgZG91YmxlIFRpbWVyOjpnZXRFbGFwc2VkU2Vjb25kcygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGdldEVsYXBzZWRNaWNyb3NlY29uZHMoKS8xMDAwMDAwLjA7CisgICAgfQorCit9IC8vIG5hbWVzcGFjZSBDYXRjaAorCisjaWZkZWYgX19jbGFuZ19fCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCisjZW5kaWYKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9jb21tb24uaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9DT01NT05fSFBQX0lOQ0xVREVECisKKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPGNjdHlwZT4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIGJvb2wgc3RhcnRzV2l0aCggc3RkOjpzdHJpbmcgY29uc3QmIHMsIHN0ZDo6c3RyaW5nIGNvbnN0JiBwcmVmaXggKSB7CisgICAgICAgIHJldHVybiBzLnNpemUoKSA+PSBwcmVmaXguc2l6ZSgpICYmIHN0ZDo6ZXF1YWwocHJlZml4LmJlZ2luKCksIHByZWZpeC5lbmQoKSwgcy5iZWdpbigpKTsKKyAgICB9CisgICAgYm9vbCBzdGFydHNXaXRoKCBzdGQ6OnN0cmluZyBjb25zdCYgcywgY2hhciBwcmVmaXggKSB7CisgICAgICAgIHJldHVybiAhcy5lbXB0eSgpICYmIHNbMF0gPT0gcHJlZml4OworICAgIH0KKyAgICBib29sIGVuZHNXaXRoKCBzdGQ6OnN0cmluZyBjb25zdCYgcywgc3RkOjpzdHJpbmcgY29uc3QmIHN1ZmZpeCApIHsKKyAgICAgICAgcmV0dXJuIHMuc2l6ZSgpID49IHN1ZmZpeC5zaXplKCkgJiYgc3RkOjplcXVhbChzdWZmaXgucmJlZ2luKCksIHN1ZmZpeC5yZW5kKCksIHMucmJlZ2luKCkpOworICAgIH0KKyAgICBib29sIGVuZHNXaXRoKCBzdGQ6OnN0cmluZyBjb25zdCYgcywgY2hhciBzdWZmaXggKSB7CisgICAgICAgIHJldHVybiAhcy5lbXB0eSgpICYmIHNbcy5zaXplKCktMV0gPT0gc3VmZml4OworICAgIH0KKyAgICBib29sIGNvbnRhaW5zKCBzdGQ6OnN0cmluZyBjb25zdCYgcywgc3RkOjpzdHJpbmcgY29uc3QmIGluZml4ICkgeworICAgICAgICByZXR1cm4gcy5maW5kKCBpbmZpeCApICE9IHN0ZDo6c3RyaW5nOjpucG9zOworICAgIH0KKyAgICBjaGFyIHRvTG93ZXJDaChjaGFyIGMpIHsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGNoYXI+KCBzdGQ6OnRvbG93ZXIoIGMgKSApOworICAgIH0KKyAgICB2b2lkIHRvTG93ZXJJblBsYWNlKCBzdGQ6OnN0cmluZyYgcyApIHsKKyAgICAgICAgc3RkOjp0cmFuc2Zvcm0oIHMuYmVnaW4oKSwgcy5lbmQoKSwgcy5iZWdpbigpLCB0b0xvd2VyQ2ggKTsKKyAgICB9CisgICAgc3RkOjpzdHJpbmcgdG9Mb3dlciggc3RkOjpzdHJpbmcgY29uc3QmIHMgKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIGxjID0gczsKKyAgICAgICAgdG9Mb3dlckluUGxhY2UoIGxjICk7CisgICAgICAgIHJldHVybiBsYzsKKyAgICB9CisgICAgc3RkOjpzdHJpbmcgdHJpbSggc3RkOjpzdHJpbmcgY29uc3QmIHN0ciApIHsKKyAgICAgICAgc3RhdGljIGNoYXIgY29uc3QqIHdoaXRlc3BhY2VDaGFycyA9ICJcblxyXHQgIjsKKyAgICAgICAgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBzdGFydCA9IHN0ci5maW5kX2ZpcnN0X25vdF9vZiggd2hpdGVzcGFjZUNoYXJzICk7CisgICAgICAgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgZW5kID0gc3RyLmZpbmRfbGFzdF9ub3Rfb2YoIHdoaXRlc3BhY2VDaGFycyApOworCisgICAgICAgIHJldHVybiBzdGFydCAhPSBzdGQ6OnN0cmluZzo6bnBvcyA/IHN0ci5zdWJzdHIoIHN0YXJ0LCAxK2VuZC1zdGFydCApIDogc3RkOjpzdHJpbmcoKTsKKyAgICB9CisKKyAgICBib29sIHJlcGxhY2VJblBsYWNlKCBzdGQ6OnN0cmluZyYgc3RyLCBzdGQ6OnN0cmluZyBjb25zdCYgcmVwbGFjZVRoaXMsIHN0ZDo6c3RyaW5nIGNvbnN0JiB3aXRoVGhpcyApIHsKKyAgICAgICAgYm9vbCByZXBsYWNlZCA9IGZhbHNlOworICAgICAgICBzdGQ6OnNpemVfdCBpID0gc3RyLmZpbmQoIHJlcGxhY2VUaGlzICk7CisgICAgICAgIHdoaWxlKCBpICE9IHN0ZDo6c3RyaW5nOjpucG9zICkgeworICAgICAgICAgICAgcmVwbGFjZWQgPSB0cnVlOworICAgICAgICAgICAgc3RyID0gc3RyLnN1YnN0ciggMCwgaSApICsgd2l0aFRoaXMgKyBzdHIuc3Vic3RyKCBpK3JlcGxhY2VUaGlzLnNpemUoKSApOworICAgICAgICAgICAgaWYoIGkgPCBzdHIuc2l6ZSgpLXdpdGhUaGlzLnNpemUoKSApCisgICAgICAgICAgICAgICAgaSA9IHN0ci5maW5kKCByZXBsYWNlVGhpcywgaSt3aXRoVGhpcy5zaXplKCkgKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBpID0gc3RkOjpzdHJpbmc6Om5wb3M7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlcGxhY2VkOworICAgIH0KKworICAgIHBsdXJhbGlzZTo6cGx1cmFsaXNlKCBzdGQ6OnNpemVfdCBjb3VudCwgc3RkOjpzdHJpbmcgY29uc3QmIGxhYmVsICkKKyAgICA6ICAgbV9jb3VudCggY291bnQgKSwKKyAgICAgICAgbV9sYWJlbCggbGFiZWwgKQorICAgIHt9CisKKyAgICBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yIDw8ICggc3RkOjpvc3RyZWFtJiBvcywgcGx1cmFsaXNlIGNvbnN0JiBwbHVyYWxpc2VyICkgeworICAgICAgICBvcyA8PCBwbHVyYWxpc2VyLm1fY291bnQgPDwgJyAnIDw8IHBsdXJhbGlzZXIubV9sYWJlbDsKKyAgICAgICAgaWYoIHBsdXJhbGlzZXIubV9jb3VudCAhPSAxICkKKyAgICAgICAgICAgIG9zIDw8ICdzJzsKKyAgICAgICAgcmV0dXJuIG9zOworICAgIH0KKworICAgIFNvdXJjZUxpbmVJbmZvOjpTb3VyY2VMaW5lSW5mbygpIDogZmlsZSgiIiksIGxpbmUoIDAgKXt9CisgICAgU291cmNlTGluZUluZm86OlNvdXJjZUxpbmVJbmZvKCBjaGFyIGNvbnN0KiBfZmlsZSwgc3RkOjpzaXplX3QgX2xpbmUgKQorICAgIDogICBmaWxlKCBfZmlsZSApLAorICAgICAgICBsaW5lKCBfbGluZSApCisgICAge30KKyAgICBib29sIFNvdXJjZUxpbmVJbmZvOjplbXB0eSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGZpbGVbMF0gPT0gJ1wwJzsKKyAgICB9CisgICAgYm9vbCBTb3VyY2VMaW5lSW5mbzo6b3BlcmF0b3IgPT0gKCBTb3VyY2VMaW5lSW5mbyBjb25zdCYgb3RoZXIgKSBjb25zdCB7CisgICAgICAgIHJldHVybiBsaW5lID09IG90aGVyLmxpbmUgJiYgKGZpbGUgPT0gb3RoZXIuZmlsZSB8fCBzdGQ6OnN0cmNtcChmaWxlLCBvdGhlci5maWxlKSA9PSAwKTsKKyAgICB9CisgICAgYm9vbCBTb3VyY2VMaW5lSW5mbzo6b3BlcmF0b3IgPCAoIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBvdGhlciApIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGxpbmUgPCBvdGhlci5saW5lIHx8ICggbGluZSA9PSBvdGhlci5saW5lICYmIChzdGQ6OnN0cmNtcChmaWxlLCBvdGhlci5maWxlKSA8IDApKTsKKyAgICB9CisKKyAgICB2b2lkIHNlZWRSbmcoIElDb25maWcgY29uc3QmIGNvbmZpZyApIHsKKyAgICAgICAgaWYoIGNvbmZpZy5ybmdTZWVkKCkgIT0gMCApCisgICAgICAgICAgICBzdGQ6OnNyYW5kKCBjb25maWcucm5nU2VlZCgpICk7CisgICAgfQorICAgIHVuc2lnbmVkIGludCBybmdTZWVkKCkgeworICAgICAgICByZXR1cm4gZ2V0Q3VycmVudENvbnRleHQoKS5nZXRDb25maWcoKS0+cm5nU2VlZCgpOworICAgIH0KKworICAgIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3IgPDwgKCBzdGQ6Om9zdHJlYW0mIG9zLCBTb3VyY2VMaW5lSW5mbyBjb25zdCYgaW5mbyApIHsKKyNpZm5kZWYgX19HTlVHX18KKyAgICAgICAgb3MgPDwgaW5mby5maWxlIDw8ICcoJyA8PCBpbmZvLmxpbmUgPDwgJyknOworI2Vsc2UKKyAgICAgICAgb3MgPDwgaW5mby5maWxlIDw8ICc6JyA8PCBpbmZvLmxpbmU7CisjZW5kaWYKKyAgICAgICAgcmV0dXJuIG9zOworICAgIH0KKworICAgIHZvaWQgdGhyb3dMb2dpY0Vycm9yKCBzdGQ6OnN0cmluZyBjb25zdCYgbWVzc2FnZSwgU291cmNlTGluZUluZm8gY29uc3QmIGxvY2F0aW9uSW5mbyApIHsKKyAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICAgICAgb3NzIDw8IGxvY2F0aW9uSW5mbyA8PCAiOiBJbnRlcm5hbCBDYXRjaCBlcnJvcjogJyIgPDwgbWVzc2FnZSA8PCAnXCcnOworICAgICAgICBpZiggYWx3YXlzVHJ1ZSgpICkKKyAgICAgICAgICAgIHRocm93IHN0ZDo6bG9naWNfZXJyb3IoIG9zcy5zdHIoKSApOworICAgIH0KK30KKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3NlY3Rpb24uaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9TRUNUSU9OX0hQUF9JTkNMVURFRAorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgU2VjdGlvbkluZm86OlNlY3Rpb25JbmZvCisgICAgICAgICggICBTb3VyY2VMaW5lSW5mbyBjb25zdCYgX2xpbmVJbmZvLAorICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIF9uYW1lLAorICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIF9kZXNjcmlwdGlvbiApCisgICAgOiAgIG5hbWUoIF9uYW1lICksCisgICAgICAgIGRlc2NyaXB0aW9uKCBfZGVzY3JpcHRpb24gKSwKKyAgICAgICAgbGluZUluZm8oIF9saW5lSW5mbyApCisgICAge30KKworICAgIFNlY3Rpb246OlNlY3Rpb24oIFNlY3Rpb25JbmZvIGNvbnN0JiBpbmZvICkKKyAgICA6ICAgbV9pbmZvKCBpbmZvICksCisgICAgICAgIG1fc2VjdGlvbkluY2x1ZGVkKCBnZXRSZXN1bHRDYXB0dXJlKCkuc2VjdGlvblN0YXJ0ZWQoIG1faW5mbywgbV9hc3NlcnRpb25zICkgKQorICAgIHsKKyAgICAgICAgbV90aW1lci5zdGFydCgpOworICAgIH0KKworICAgIFNlY3Rpb246On5TZWN0aW9uKCkgeworICAgICAgICBpZiggbV9zZWN0aW9uSW5jbHVkZWQgKSB7CisgICAgICAgICAgICBTZWN0aW9uRW5kSW5mbyBlbmRJbmZvKCBtX2luZm8sIG1fYXNzZXJ0aW9ucywgbV90aW1lci5nZXRFbGFwc2VkU2Vjb25kcygpICk7CisgICAgICAgICAgICBpZiggc3RkOjp1bmNhdWdodF9leGNlcHRpb24oKSApCisgICAgICAgICAgICAgICAgZ2V0UmVzdWx0Q2FwdHVyZSgpLnNlY3Rpb25FbmRlZEVhcmx5KCBlbmRJbmZvICk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZ2V0UmVzdWx0Q2FwdHVyZSgpLnNlY3Rpb25FbmRlZCggZW5kSW5mbyApOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gVGhpcyBpbmRpY2F0ZXMgd2hldGhlciB0aGUgc2VjdGlvbiBzaG91bGQgYmUgZXhlY3V0ZWQgb3Igbm90CisgICAgU2VjdGlvbjo6b3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1fc2VjdGlvbkluY2x1ZGVkOworICAgIH0KKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9kZWJ1Z2dlci5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0RFQlVHR0VSX0hQUF9JTkNMVURFRAorCisjaWZkZWYgQ0FUQ0hfUExBVEZPUk1fTUFDCisKKyAgICAjaW5jbHVkZSA8YXNzZXJ0Lmg+CisgICAgI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyAgICAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisgICAgI2luY2x1ZGUgPHVuaXN0ZC5oPgorICAgICNpbmNsdWRlIDxzeXMvc3lzY3RsLmg+CisKKyAgICBuYW1lc3BhY2UgQ2F0Y2h7CisKKyAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBmdW5jdGlvbiBpcyB0YWtlbiBkaXJlY3RseSBmcm9tIHRoZSBmb2xsb3dpbmcgdGVjaG5pY2FsIG5vdGU6CisgICAgICAgIC8vIGh0dHA6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL2xpYnJhcnkvbWFjLyNxYS9xYTIwMDQvcWExMzYxLmh0bWwKKworICAgICAgICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIGN1cnJlbnQgcHJvY2VzcyBpcyBiZWluZyBkZWJ1Z2dlZCAoZWl0aGVyCisgICAgICAgIC8vIHJ1bm5pbmcgdW5kZXIgdGhlIGRlYnVnZ2VyIG9yIGhhcyBhIGRlYnVnZ2VyIGF0dGFjaGVkIHBvc3QgZmFjdG8pLgorICAgICAgICBib29sIGlzRGVidWdnZXJBY3RpdmUoKXsKKworICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICBtaWJbNF07CisgICAgICAgICAgICBzdHJ1Y3Qga2luZm9fcHJvYyAgIGluZm87CisgICAgICAgICAgICBzaXplX3QgICAgICAgICAgICAgIHNpemU7CisKKyAgICAgICAgICAgIC8vIEluaXRpYWxpemUgdGhlIGZsYWdzIHNvIHRoYXQsIGlmIHN5c2N0bCBmYWlscyBmb3Igc29tZSBiaXphcnJlCisgICAgICAgICAgICAvLyByZWFzb24sIHdlIGdldCBhIHByZWRpY3RhYmxlIHJlc3VsdC4KKworICAgICAgICAgICAgaW5mby5rcF9wcm9jLnBfZmxhZyA9IDA7CisKKyAgICAgICAgICAgIC8vIEluaXRpYWxpemUgbWliLCB3aGljaCB0ZWxscyBzeXNjdGwgdGhlIGluZm8gd2Ugd2FudCwgaW4gdGhpcyBjYXNlCisgICAgICAgICAgICAvLyB3ZSdyZSBsb29raW5nIGZvciBpbmZvcm1hdGlvbiBhYm91dCBhIHNwZWNpZmljIHByb2Nlc3MgSUQuCisKKyAgICAgICAgICAgIG1pYlswXSA9IENUTF9LRVJOOworICAgICAgICAgICAgbWliWzFdID0gS0VSTl9QUk9DOworICAgICAgICAgICAgbWliWzJdID0gS0VSTl9QUk9DX1BJRDsKKyAgICAgICAgICAgIG1pYlszXSA9IGdldHBpZCgpOworCisgICAgICAgICAgICAvLyBDYWxsIHN5c2N0bC4KKworICAgICAgICAgICAgc2l6ZSA9IHNpemVvZihpbmZvKTsKKyAgICAgICAgICAgIGlmKCBzeXNjdGwobWliLCBzaXplb2YobWliKSAvIHNpemVvZigqbWliKSwgJmluZm8sICZzaXplLCBDQVRDSF9OVUxMLCAwKSAhPSAwICkgeworICAgICAgICAgICAgICAgIENhdGNoOjpjZXJyKCkgPDwgIlxuKiogQ2FsbCB0byBzeXNjdGwgZmFpbGVkIC0gdW5hYmxlIHRvIGRldGVybWluZSBpZiBkZWJ1Z2dlciBpcyBhY3RpdmUgKipcbiIgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gV2UncmUgYmVpbmcgZGVidWdnZWQgaWYgdGhlIFBfVFJBQ0VEIGZsYWcgaXMgc2V0LgorCisgICAgICAgICAgICByZXR1cm4gKCAoaW5mby5rcF9wcm9jLnBfZmxhZyAmIFBfVFJBQ0VEKSAhPSAwICk7CisgICAgICAgIH0KKyAgICB9IC8vIG5hbWVzcGFjZSBDYXRjaAorCisjZWxpZiBkZWZpbmVkKENBVENIX1BMQVRGT1JNX0xJTlVYKQorICAgICNpbmNsdWRlIDxmc3RyZWFtPgorICAgICNpbmNsdWRlIDxzdHJpbmc+CisKKyAgICBuYW1lc3BhY2UgQ2F0Y2h7CisgICAgICAgIC8vIFRoZSBzdGFuZGFyZCBQT1NJWCB3YXkgb2YgZGV0ZWN0aW5nIGEgZGVidWdnZXIgaXMgdG8gYXR0ZW1wdCB0bworICAgICAgICAvLyBwdHJhY2UoKSB0aGUgcHJvY2VzcywgYnV0IHRoaXMgbmVlZHMgdG8gYmUgZG9uZSBmcm9tIGEgY2hpbGQgYW5kIG5vdAorICAgICAgICAvLyB0aGlzIHByb2Nlc3MgaXRzZWxmIHRvIHN0aWxsIGFsbG93IGF0dGFjaGluZyB0byB0aGlzIHByb2Nlc3MgbGF0ZXIKKyAgICAgICAgLy8gaWYgd2FudGVkLCBzbyBpcyByYXRoZXIgaGVhdnkuIFVuZGVyIExpbnV4IHdlIGhhdmUgdGhlIFBJRCBvZiB0aGUKKyAgICAgICAgLy8gImRlYnVnZ2VyIiAod2hpY2ggZG9lc24ndCBuZWVkIHRvIGJlIGdkYiwgb2YgY291cnNlLCBpdCBjb3VsZCBhbHNvCisgICAgICAgIC8vIGJlIHN0cmFjZSwgZm9yIGV4YW1wbGUpIGluIC9wcm9jLyRQSUQvc3RhdHVzLCBzbyBqdXN0IGdldCBpdCBmcm9tCisgICAgICAgIC8vIHRoZXJlIGluc3RlYWQuCisgICAgICAgIGJvb2wgaXNEZWJ1Z2dlckFjdGl2ZSgpeworICAgICAgICAgICAgLy8gTGlic3RkYysrIGhhcyBhIGJ1Zywgd2hlcmUgc3RkOjppZnN0cmVhbSBzZXRzIGVycm5vIHRvIDAKKyAgICAgICAgICAgIC8vIFRoaXMgd2F5IG91ciB1c2VycyBjYW4gcHJvcGVybHkgYXNzZXJ0IG92ZXIgZXJybm8gdmFsdWVzCisgICAgICAgICAgICBFcnJub0d1YXJkIGd1YXJkOworICAgICAgICAgICAgc3RkOjppZnN0cmVhbSBpbigiL3Byb2Mvc2VsZi9zdGF0dXMiKTsKKyAgICAgICAgICAgIGZvciggc3RkOjpzdHJpbmcgbGluZTsgc3RkOjpnZXRsaW5lKGluLCBsaW5lKTsgKSB7CisgICAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IGludCBQUkVGSVhfTEVOID0gMTE7CisgICAgICAgICAgICAgICAgaWYoIGxpbmUuY29tcGFyZSgwLCBQUkVGSVhfTEVOLCAiVHJhY2VyUGlkOlx0IikgPT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gV2UncmUgdHJhY2VkIGlmIHRoZSBQSUQgaXMgbm90IDAgYW5kIG5vIG90aGVyIFBJRCBzdGFydHMKKyAgICAgICAgICAgICAgICAgICAgLy8gd2l0aCAwIGRpZ2l0LCBzbyBpdCdzIGVub3VnaCB0byBjaGVjayBmb3IganVzdCBhIHNpbmdsZQorICAgICAgICAgICAgICAgICAgICAvLyBjaGFyYWN0ZXIuCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBsaW5lLmxlbmd0aCgpID4gUFJFRklYX0xFTiAmJiBsaW5lW1BSRUZJWF9MRU5dICE9ICcwJzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0gLy8gbmFtZXNwYWNlIENhdGNoCisjZWxpZiBkZWZpbmVkKF9NU0NfVkVSKQorICAgIGV4dGVybiAiQyIgX19kZWNsc3BlYyhkbGxpbXBvcnQpIGludCBfX3N0ZGNhbGwgSXNEZWJ1Z2dlclByZXNlbnQoKTsKKyAgICBuYW1lc3BhY2UgQ2F0Y2ggeworICAgICAgICBib29sIGlzRGVidWdnZXJBY3RpdmUoKSB7CisgICAgICAgICAgICByZXR1cm4gSXNEZWJ1Z2dlclByZXNlbnQoKSAhPSAwOworICAgICAgICB9CisgICAgfQorI2VsaWYgZGVmaW5lZChfX01JTkdXMzJfXykKKyAgICBleHRlcm4gIkMiIF9fZGVjbHNwZWMoZGxsaW1wb3J0KSBpbnQgX19zdGRjYWxsIElzRGVidWdnZXJQcmVzZW50KCk7CisgICAgbmFtZXNwYWNlIENhdGNoIHsKKyAgICAgICAgYm9vbCBpc0RlYnVnZ2VyQWN0aXZlKCkgeworICAgICAgICAgICAgcmV0dXJuIElzRGVidWdnZXJQcmVzZW50KCkgIT0gMDsKKyAgICAgICAgfQorICAgIH0KKyNlbHNlCisgICAgbmFtZXNwYWNlIENhdGNoIHsKKyAgICAgICBpbmxpbmUgYm9vbCBpc0RlYnVnZ2VyQWN0aXZlKCkgeyByZXR1cm4gZmFsc2U7IH0KKyAgICB9CisjZW5kaWYgLy8gUGxhdGZvcm0KKworI2lmZGVmIENBVENIX1BMQVRGT1JNX1dJTkRPV1MKKworICAgIG5hbWVzcGFjZSBDYXRjaCB7CisgICAgICAgIHZvaWQgd3JpdGVUb0RlYnVnQ29uc29sZSggc3RkOjpzdHJpbmcgY29uc3QmIHRleHQgKSB7CisgICAgICAgICAgICA6Ok91dHB1dERlYnVnU3RyaW5nQSggdGV4dC5jX3N0cigpICk7CisgICAgICAgIH0KKyAgICB9CisjZWxzZQorICAgIG5hbWVzcGFjZSBDYXRjaCB7CisgICAgICAgIHZvaWQgd3JpdGVUb0RlYnVnQ29uc29sZSggc3RkOjpzdHJpbmcgY29uc3QmIHRleHQgKSB7CisgICAgICAgICAgICAvLyAhVEJEOiBOZWVkIGEgdmVyc2lvbiBmb3IgTWFjLyBYQ29kZSBhbmQgb3RoZXIgSURFcworICAgICAgICAgICAgQ2F0Y2g6OmNvdXQoKSA8PCB0ZXh0OworICAgICAgICB9CisgICAgfQorI2VuZGlmIC8vIFBsYXRmb3JtCisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF90b3N0cmluZy5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1RPU1RSSU5HX0hQUF9JTkNMVURFRAorCituYW1lc3BhY2UgQ2F0Y2ggeworCituYW1lc3BhY2UgRGV0YWlsIHsKKworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHVucHJpbnRhYmxlU3RyaW5nID0gIns/fSI7CisKKyAgICBuYW1lc3BhY2UgeworICAgICAgICBjb25zdCBpbnQgaGV4VGhyZXNob2xkID0gMjU1OworCisgICAgICAgIHN0cnVjdCBFbmRpYW5uZXNzIHsKKyAgICAgICAgICAgIGVudW0gQXJjaCB7IEJpZywgTGl0dGxlIH07CisKKyAgICAgICAgICAgIHN0YXRpYyBBcmNoIHdoaWNoKCkgeworICAgICAgICAgICAgICAgIHVuaW9uIF97CisgICAgICAgICAgICAgICAgICAgIGludCBhc0ludDsKKyAgICAgICAgICAgICAgICAgICAgY2hhciBhc0NoYXJbc2l6ZW9mIChpbnQpXTsKKyAgICAgICAgICAgICAgICB9IHU7CisKKyAgICAgICAgICAgICAgICB1LmFzSW50ID0gMTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKCB1LmFzQ2hhcltzaXplb2YoaW50KS0xXSA9PSAxICkgPyBCaWcgOiBMaXR0bGU7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgcmF3TWVtb3J5VG9TdHJpbmcoIGNvbnN0IHZvaWQgKm9iamVjdCwgc3RkOjpzaXplX3Qgc2l6ZSApCisgICAgeworICAgICAgICAvLyBSZXZlcnNlIG9yZGVyIGZvciBsaXR0bGUgZW5kaWFuIGFyY2hpdGVjdHVyZXMKKyAgICAgICAgaW50IGkgPSAwLCBlbmQgPSBzdGF0aWNfY2FzdDxpbnQ+KCBzaXplICksIGluYyA9IDE7CisgICAgICAgIGlmKCBFbmRpYW5uZXNzOjp3aGljaCgpID09IEVuZGlhbm5lc3M6OkxpdHRsZSApIHsKKyAgICAgICAgICAgIGkgPSBlbmQtMTsKKyAgICAgICAgICAgIGVuZCA9IGluYyA9IC0xOworICAgICAgICB9CisKKyAgICAgICAgdW5zaWduZWQgY2hhciBjb25zdCAqYnl0ZXMgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyIGNvbnN0ICo+KG9iamVjdCk7CisgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvczsKKyAgICAgICAgb3MgPDwgIjB4IiA8PCBzdGQ6OnNldGZpbGwoJzAnKSA8PCBzdGQ6OmhleDsKKyAgICAgICAgZm9yKCA7IGkgIT0gZW5kOyBpICs9IGluYyApCisgICAgICAgICAgICAgb3MgPDwgc3RkOjpzZXR3KDIpIDw8IHN0YXRpY19jYXN0PHVuc2lnbmVkPihieXRlc1tpXSk7CisgICAgICAgcmV0dXJuIG9zLnN0cigpOworICAgIH0KK30KKworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIHN0ZDo6c3RyaW5nIGNvbnN0JiB2YWx1ZSApIHsKKyAgICBzdGQ6OnN0cmluZyBzID0gdmFsdWU7CisgICAgaWYoIGdldEN1cnJlbnRDb250ZXh0KCkuZ2V0Q29uZmlnKCktPnNob3dJbnZpc2libGVzKCkgKSB7CisgICAgICAgIGZvcihzaXplX3QgaSA9IDA7IGkgPCBzLnNpemUoKTsgKytpICkgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgc3ViczsKKyAgICAgICAgICAgIHN3aXRjaCggc1tpXSApIHsKKyAgICAgICAgICAgIGNhc2UgJ1xuJzogc3VicyA9ICJcXG4iOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ1x0Jzogc3VicyA9ICJcXHQiOyBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoICFzdWJzLmVtcHR5KCkgKSB7CisgICAgICAgICAgICAgICAgcyA9IHMuc3Vic3RyKCAwLCBpICkgKyBzdWJzICsgcy5zdWJzdHIoIGkrMSApOworICAgICAgICAgICAgICAgICsraTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gJyInICsgcyArICciJzsKK30KK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBzdGQ6OndzdHJpbmcgY29uc3QmIHZhbHVlICkgeworCisgICAgc3RkOjpzdHJpbmcgczsKKyAgICBzLnJlc2VydmUoIHZhbHVlLnNpemUoKSApOworICAgIGZvcihzaXplX3QgaSA9IDA7IGkgPCB2YWx1ZS5zaXplKCk7ICsraSApCisgICAgICAgIHMgKz0gdmFsdWVbaV0gPD0gMHhmZiA/IHN0YXRpY19jYXN0PGNoYXI+KCB2YWx1ZVtpXSApIDogJz8nOworICAgIHJldHVybiBDYXRjaDo6dG9TdHJpbmcoIHMgKTsKK30KKworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIGNvbnN0IGNoYXIqIGNvbnN0IHZhbHVlICkgeworICAgIHJldHVybiB2YWx1ZSA/IENhdGNoOjp0b1N0cmluZyggc3RkOjpzdHJpbmcoIHZhbHVlICkgKSA6IHN0ZDo6c3RyaW5nKCAie251bGwgc3RyaW5nfSIgKTsKK30KKworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIGNoYXIqIGNvbnN0IHZhbHVlICkgeworICAgIHJldHVybiBDYXRjaDo6dG9TdHJpbmcoIHN0YXRpY19jYXN0PGNvbnN0IGNoYXIqPiggdmFsdWUgKSApOworfQorCitzdGQ6OnN0cmluZyB0b1N0cmluZyggY29uc3Qgd2NoYXJfdCogY29uc3QgdmFsdWUgKQoreworICAgIHJldHVybiB2YWx1ZSA/IENhdGNoOjp0b1N0cmluZyggc3RkOjp3c3RyaW5nKHZhbHVlKSApIDogc3RkOjpzdHJpbmcoICJ7bnVsbCBzdHJpbmd9IiApOworfQorCitzdGQ6OnN0cmluZyB0b1N0cmluZyggd2NoYXJfdCogY29uc3QgdmFsdWUgKQoreworICAgIHJldHVybiBDYXRjaDo6dG9TdHJpbmcoIHN0YXRpY19jYXN0PGNvbnN0IHdjaGFyX3QqPiggdmFsdWUgKSApOworfQorCitzdGQ6OnN0cmluZyB0b1N0cmluZyggaW50IHZhbHVlICkgeworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisgICAgb3NzIDw8IHZhbHVlOworICAgIGlmKCB2YWx1ZSA+IERldGFpbDo6aGV4VGhyZXNob2xkICkKKyAgICAgICAgb3NzIDw8ICIgKDB4IiA8PCBzdGQ6OmhleCA8PCB2YWx1ZSA8PCAnKSc7CisgICAgcmV0dXJuIG9zcy5zdHIoKTsKK30KKworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIHVuc2lnbmVkIGxvbmcgdmFsdWUgKSB7CisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICBvc3MgPDwgdmFsdWU7CisgICAgaWYoIHZhbHVlID4gRGV0YWlsOjpoZXhUaHJlc2hvbGQgKQorICAgICAgICBvc3MgPDwgIiAoMHgiIDw8IHN0ZDo6aGV4IDw8IHZhbHVlIDw8ICcpJzsKKyAgICByZXR1cm4gb3NzLnN0cigpOworfQorCitzdGQ6OnN0cmluZyB0b1N0cmluZyggdW5zaWduZWQgaW50IHZhbHVlICkgeworICAgIHJldHVybiBDYXRjaDo6dG9TdHJpbmcoIHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KCB2YWx1ZSApICk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdGQ6OnN0cmluZyBmcFRvU3RyaW5nKCBUIHZhbHVlLCBpbnQgcHJlY2lzaW9uICkgeworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisgICAgb3NzIDw8IHN0ZDo6c2V0cHJlY2lzaW9uKCBwcmVjaXNpb24gKQorICAgICAgICA8PCBzdGQ6OmZpeGVkCisgICAgICAgIDw8IHZhbHVlOworICAgIHN0ZDo6c3RyaW5nIGQgPSBvc3Muc3RyKCk7CisgICAgc3RkOjpzaXplX3QgaSA9IGQuZmluZF9sYXN0X25vdF9vZiggJzAnICk7CisgICAgaWYoIGkgIT0gc3RkOjpzdHJpbmc6Om5wb3MgJiYgaSAhPSBkLnNpemUoKS0xICkgeworICAgICAgICBpZiggZFtpXSA9PSAnLicgKQorICAgICAgICAgICAgaSsrOworICAgICAgICBkID0gZC5zdWJzdHIoIDAsIGkrMSApOworICAgIH0KKyAgICByZXR1cm4gZDsKK30KKworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIGNvbnN0IGRvdWJsZSB2YWx1ZSApIHsKKyAgICByZXR1cm4gZnBUb1N0cmluZyggdmFsdWUsIDEwICk7Cit9CitzdGQ6OnN0cmluZyB0b1N0cmluZyggY29uc3QgZmxvYXQgdmFsdWUgKSB7CisgICAgcmV0dXJuIGZwVG9TdHJpbmcoIHZhbHVlLCA1ICkgKyAnZic7Cit9CisKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBib29sIHZhbHVlICkgeworICAgIHJldHVybiB2YWx1ZSA/ICJ0cnVlIiA6ICJmYWxzZSI7Cit9CisKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBjaGFyIHZhbHVlICkgeworICAgIGlmICggdmFsdWUgPT0gJ1xyJyApCisgICAgICAgIHJldHVybiAiJ1xcciciOworICAgIGlmICggdmFsdWUgPT0gJ1xmJyApCisgICAgICAgIHJldHVybiAiJ1xcZiciOworICAgIGlmICggdmFsdWUgPT0gJ1xuJyApCisgICAgICAgIHJldHVybiAiJ1xcbiciOworICAgIGlmICggdmFsdWUgPT0gJ1x0JyApCisgICAgICAgIHJldHVybiAiJ1xcdCciOworICAgIGlmICggJ1wwJyA8PSB2YWx1ZSAmJiB2YWx1ZSA8ICcgJyApCisgICAgICAgIHJldHVybiB0b1N0cmluZyggc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PiggdmFsdWUgKSApOworICAgIGNoYXIgY2hzdHJbXSA9ICInICciOworICAgIGNoc3RyWzFdID0gdmFsdWU7CisgICAgcmV0dXJuIGNoc3RyOworfQorCitzdGQ6OnN0cmluZyB0b1N0cmluZyggc2lnbmVkIGNoYXIgdmFsdWUgKSB7CisgICAgcmV0dXJuIHRvU3RyaW5nKCBzdGF0aWNfY2FzdDxjaGFyPiggdmFsdWUgKSApOworfQorCitzdGQ6OnN0cmluZyB0b1N0cmluZyggdW5zaWduZWQgY2hhciB2YWx1ZSApIHsKKyAgICByZXR1cm4gdG9TdHJpbmcoIHN0YXRpY19jYXN0PGNoYXI+KCB2YWx1ZSApICk7Cit9CisKKyNpZmRlZiBDQVRDSF9DT05GSUdfQ1BQMTFfTE9OR19MT05HCitzdGQ6OnN0cmluZyB0b1N0cmluZyggbG9uZyBsb25nIHZhbHVlICkgeworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisgICAgb3NzIDw8IHZhbHVlOworICAgIGlmKCB2YWx1ZSA+IERldGFpbDo6aGV4VGhyZXNob2xkICkKKyAgICAgICAgb3NzIDw8ICIgKDB4IiA8PCBzdGQ6OmhleCA8PCB2YWx1ZSA8PCAnKSc7CisgICAgcmV0dXJuIG9zcy5zdHIoKTsKK30KK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCB1bnNpZ25lZCBsb25nIGxvbmcgdmFsdWUgKSB7CisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICBvc3MgPDwgdmFsdWU7CisgICAgaWYoIHZhbHVlID4gRGV0YWlsOjpoZXhUaHJlc2hvbGQgKQorICAgICAgICBvc3MgPDwgIiAoMHgiIDw8IHN0ZDo6aGV4IDw8IHZhbHVlIDw8ICcpJzsKKyAgICByZXR1cm4gb3NzLnN0cigpOworfQorI2VuZGlmCisKKyNpZmRlZiBDQVRDSF9DT05GSUdfQ1BQMTFfTlVMTFBUUgorc3RkOjpzdHJpbmcgdG9TdHJpbmcoIHN0ZDo6bnVsbHB0cl90ICkgeworICAgIHJldHVybiAibnVsbHB0ciI7Cit9CisjZW5kaWYKKworI2lmZGVmIF9fT0JKQ19fCisgICAgc3RkOjpzdHJpbmcgdG9TdHJpbmcoIE5TU3RyaW5nIGNvbnN0ICogY29uc3QmIG5zc3RyaW5nICkgeworICAgICAgICBpZiggIW5zc3RyaW5nICkKKyAgICAgICAgICAgIHJldHVybiAibmlsIjsKKyAgICAgICAgcmV0dXJuICJAIiArIHRvU3RyaW5nKFtuc3N0cmluZyBVVEY4U3RyaW5nXSk7CisgICAgfQorICAgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCBOU1N0cmluZyAqIENBVENIX0FSQ19TVFJPTkcgY29uc3QmIG5zc3RyaW5nICkgeworICAgICAgICBpZiggIW5zc3RyaW5nICkKKyAgICAgICAgICAgIHJldHVybiAibmlsIjsKKyAgICAgICAgcmV0dXJuICJAIiArIHRvU3RyaW5nKFtuc3N0cmluZyBVVEY4U3RyaW5nXSk7CisgICAgfQorICAgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCBOU09iamVjdCogY29uc3QmIG5zT2JqZWN0ICkgeworICAgICAgICByZXR1cm4gdG9TdHJpbmcoIFtuc09iamVjdCBkZXNjcmlwdGlvbl0gKTsKKyAgICB9CisjZW5kaWYKKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9yZXN1bHRfYnVpbGRlci5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1JFU1VMVF9CVUlMREVSX0hQUF9JTkNMVURFRAorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgc3RkOjpzdHJpbmcgY2FwdHVyZWRFeHByZXNzaW9uV2l0aFNlY29uZEFyZ3VtZW50KCBzdGQ6OnN0cmluZyBjb25zdCYgY2FwdHVyZWRFeHByZXNzaW9uLCBzdGQ6OnN0cmluZyBjb25zdCYgc2Vjb25kQXJnICkgeworICAgICAgICByZXR1cm4gc2Vjb25kQXJnLmVtcHR5KCkgfHwgc2Vjb25kQXJnID09ICJcIlwiIgorICAgICAgICAgICAgPyBjYXB0dXJlZEV4cHJlc3Npb24KKyAgICAgICAgICAgIDogY2FwdHVyZWRFeHByZXNzaW9uICsgIiwgIiArIHNlY29uZEFyZzsKKyAgICB9CisgICAgUmVzdWx0QnVpbGRlcjo6UmVzdWx0QnVpbGRlciggICBjaGFyIGNvbnN0KiBtYWNyb05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMaW5lSW5mbyBjb25zdCYgbGluZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGNvbnN0KiBjYXB0dXJlZEV4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXN1bHREaXNwb3NpdGlvbjo6RmxhZ3MgcmVzdWx0RGlzcG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGNvbnN0KiBzZWNvbmRBcmcgKQorICAgIDogICBtX2Fzc2VydGlvbkluZm8oIG1hY3JvTmFtZSwgbGluZUluZm8sIGNhcHR1cmVkRXhwcmVzc2lvbldpdGhTZWNvbmRBcmd1bWVudCggY2FwdHVyZWRFeHByZXNzaW9uLCBzZWNvbmRBcmcgKSwgcmVzdWx0RGlzcG9zaXRpb24gKSwKKyAgICAgICAgbV9zaG91bGREZWJ1Z0JyZWFrKCBmYWxzZSApLAorICAgICAgICBtX3Nob3VsZFRocm93KCBmYWxzZSApLAorICAgICAgICBtX2d1YXJkRXhjZXB0aW9uKCBmYWxzZSApCisgICAge30KKworICAgIFJlc3VsdEJ1aWxkZXI6On5SZXN1bHRCdWlsZGVyKCkgeworI2lmIGRlZmluZWQoQ0FUQ0hfQ09ORklHX0ZBU1RfQ09NUElMRSkKKyAgICAgICAgaWYgKCBtX2d1YXJkRXhjZXB0aW9uICkgeworICAgICAgICAgICAgbV9zdHJlYW0ub3NzIDw8ICJFeGNlcHRpb24gdHJhbnNsYXRpb24gd2FzIGRpc2FibGVkIGJ5IENBVENIX0NPTkZJR19GQVNUX0NPTVBJTEUiOworICAgICAgICAgICAgY2FwdHVyZVJlc3VsdCggUmVzdWx0V2FzOjpUaHJld0V4Y2VwdGlvbiApOworICAgICAgICAgICAgZ2V0Q3VycmVudENvbnRleHQoKS5nZXRSZXN1bHRDYXB0dXJlKCktPmV4Y2VwdGlvbkVhcmx5UmVwb3J0ZWQoKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgfQorCisgICAgUmVzdWx0QnVpbGRlciYgUmVzdWx0QnVpbGRlcjo6c2V0UmVzdWx0VHlwZSggUmVzdWx0V2FzOjpPZlR5cGUgcmVzdWx0ICkgeworICAgICAgICBtX2RhdGEucmVzdWx0VHlwZSA9IHJlc3VsdDsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyAgICBSZXN1bHRCdWlsZGVyJiBSZXN1bHRCdWlsZGVyOjpzZXRSZXN1bHRUeXBlKCBib29sIHJlc3VsdCApIHsKKyAgICAgICAgbV9kYXRhLnJlc3VsdFR5cGUgPSByZXN1bHQgPyBSZXN1bHRXYXM6Ok9rIDogUmVzdWx0V2FzOjpFeHByZXNzaW9uRmFpbGVkOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgdm9pZCBSZXN1bHRCdWlsZGVyOjplbmRFeHByZXNzaW9uKCBEZWNvbXBvc2VkRXhwcmVzc2lvbiBjb25zdCYgZXhwciApIHsKKyAgICAgICAgQXNzZXJ0aW9uUmVzdWx0IHJlc3VsdCA9IGJ1aWxkKCBleHByICk7CisgICAgICAgIGhhbmRsZVJlc3VsdCggcmVzdWx0ICk7CisgICAgfQorCisgICAgdm9pZCBSZXN1bHRCdWlsZGVyOjp1c2VBY3RpdmVFeGNlcHRpb24oIFJlc3VsdERpc3Bvc2l0aW9uOjpGbGFncyByZXN1bHREaXNwb3NpdGlvbiApIHsKKyAgICAgICAgbV9hc3NlcnRpb25JbmZvLnJlc3VsdERpc3Bvc2l0aW9uID0gcmVzdWx0RGlzcG9zaXRpb247CisgICAgICAgIG1fc3RyZWFtLm9zcyA8PCBDYXRjaDo6dHJhbnNsYXRlQWN0aXZlRXhjZXB0aW9uKCk7CisgICAgICAgIGNhcHR1cmVSZXN1bHQoIFJlc3VsdFdhczo6VGhyZXdFeGNlcHRpb24gKTsKKyAgICB9CisKKyAgICB2b2lkIFJlc3VsdEJ1aWxkZXI6OmNhcHR1cmVSZXN1bHQoIFJlc3VsdFdhczo6T2ZUeXBlIHJlc3VsdFR5cGUgKSB7CisgICAgICAgIHNldFJlc3VsdFR5cGUoIHJlc3VsdFR5cGUgKTsKKyAgICAgICAgY2FwdHVyZUV4cHJlc3Npb24oKTsKKyAgICB9CisKKyAgICB2b2lkIFJlc3VsdEJ1aWxkZXI6OmNhcHR1cmVFeHBlY3RlZEV4Y2VwdGlvbiggc3RkOjpzdHJpbmcgY29uc3QmIGV4cGVjdGVkTWVzc2FnZSApIHsKKyAgICAgICAgaWYoIGV4cGVjdGVkTWVzc2FnZS5lbXB0eSgpICkKKyAgICAgICAgICAgIGNhcHR1cmVFeHBlY3RlZEV4Y2VwdGlvbiggTWF0Y2hlcnM6OkltcGw6Ok1hdGNoQWxsT2Y8c3RkOjpzdHJpbmc+KCkgKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgY2FwdHVyZUV4cGVjdGVkRXhjZXB0aW9uKCBNYXRjaGVyczo6RXF1YWxzKCBleHBlY3RlZE1lc3NhZ2UgKSApOworICAgIH0KKworICAgIHZvaWQgUmVzdWx0QnVpbGRlcjo6Y2FwdHVyZUV4cGVjdGVkRXhjZXB0aW9uKCBNYXRjaGVyczo6SW1wbDo6TWF0Y2hlckJhc2U8c3RkOjpzdHJpbmc+IGNvbnN0JiBtYXRjaGVyICkgeworCisgICAgICAgIGFzc2VydCggIWlzRmFsc2VUZXN0KCBtX2Fzc2VydGlvbkluZm8ucmVzdWx0RGlzcG9zaXRpb24gKSApOworICAgICAgICBBc3NlcnRpb25SZXN1bHREYXRhIGRhdGEgPSBtX2RhdGE7CisgICAgICAgIGRhdGEucmVzdWx0VHlwZSA9IFJlc3VsdFdhczo6T2s7CisgICAgICAgIGRhdGEucmVjb25zdHJ1Y3RlZEV4cHJlc3Npb24gPSBtX2Fzc2VydGlvbkluZm8uY2FwdHVyZWRFeHByZXNzaW9uOworCisgICAgICAgIHN0ZDo6c3RyaW5nIGFjdHVhbE1lc3NhZ2UgPSBDYXRjaDo6dHJhbnNsYXRlQWN0aXZlRXhjZXB0aW9uKCk7CisgICAgICAgIGlmKCAhbWF0Y2hlci5tYXRjaCggYWN0dWFsTWVzc2FnZSApICkgeworICAgICAgICAgICAgZGF0YS5yZXN1bHRUeXBlID0gUmVzdWx0V2FzOjpFeHByZXNzaW9uRmFpbGVkOworICAgICAgICAgICAgZGF0YS5yZWNvbnN0cnVjdGVkRXhwcmVzc2lvbiA9IGFjdHVhbE1lc3NhZ2U7CisgICAgICAgIH0KKyAgICAgICAgQXNzZXJ0aW9uUmVzdWx0IHJlc3VsdCggbV9hc3NlcnRpb25JbmZvLCBkYXRhICk7CisgICAgICAgIGhhbmRsZVJlc3VsdCggcmVzdWx0ICk7CisgICAgfQorCisgICAgdm9pZCBSZXN1bHRCdWlsZGVyOjpjYXB0dXJlRXhwcmVzc2lvbigpIHsKKyAgICAgICAgQXNzZXJ0aW9uUmVzdWx0IHJlc3VsdCA9IGJ1aWxkKCk7CisgICAgICAgIGhhbmRsZVJlc3VsdCggcmVzdWx0ICk7CisgICAgfQorCisgICAgdm9pZCBSZXN1bHRCdWlsZGVyOjpoYW5kbGVSZXN1bHQoIEFzc2VydGlvblJlc3VsdCBjb25zdCYgcmVzdWx0ICkKKyAgICB7CisgICAgICAgIGdldFJlc3VsdENhcHR1cmUoKS5hc3NlcnRpb25FbmRlZCggcmVzdWx0ICk7CisKKyAgICAgICAgaWYoICFyZXN1bHQuaXNPaygpICkgeworICAgICAgICAgICAgaWYoIGdldEN1cnJlbnRDb250ZXh0KCkuZ2V0Q29uZmlnKCktPnNob3VsZERlYnVnQnJlYWsoKSApCisgICAgICAgICAgICAgICAgbV9zaG91bGREZWJ1Z0JyZWFrID0gdHJ1ZTsKKyAgICAgICAgICAgIGlmKCBnZXRDdXJyZW50Q29udGV4dCgpLmdldFJ1bm5lcigpLT5hYm9ydGluZygpIHx8IChtX2Fzc2VydGlvbkluZm8ucmVzdWx0RGlzcG9zaXRpb24gJiBSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsKSApCisgICAgICAgICAgICAgICAgbV9zaG91bGRUaHJvdyA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIFJlc3VsdEJ1aWxkZXI6OnJlYWN0KCkgeworI2lmIGRlZmluZWQoQ0FUQ0hfQ09ORklHX0ZBU1RfQ09NUElMRSkKKyAgICAgICAgaWYgKG1fc2hvdWxkRGVidWdCcmVhaykgeworICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICAgICAgICAgLy8gVG8gaW5zcGVjdCB0aGUgc3RhdGUgZHVyaW5nIHRlc3QsIHlvdSBuZWVkIHRvIGdvIG9uZSBsZXZlbCB1cCB0aGUgY2FsbHN0YWNrCisgICAgICAgICAgICAvLyBUbyBnbyBiYWNrIHRvIHRoZSB0ZXN0IGFuZCBjaGFuZ2UgZXhlY3V0aW9uLCBqdW1wIG92ZXIgdGhlIHRocm93IHN0YXRlbWVudAorICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICAgICAgICAgQ0FUQ0hfQlJFQUtfSU5UT19ERUJVR0dFUigpOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgaWYoIG1fc2hvdWxkVGhyb3cgKQorICAgICAgICAgICAgdGhyb3cgQ2F0Y2g6OlRlc3RGYWlsdXJlRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgYm9vbCBSZXN1bHRCdWlsZGVyOjpzaG91bGREZWJ1Z0JyZWFrKCkgY29uc3QgeyByZXR1cm4gbV9zaG91bGREZWJ1Z0JyZWFrOyB9CisgICAgYm9vbCBSZXN1bHRCdWlsZGVyOjphbGxvd1Rocm93cygpIGNvbnN0IHsgcmV0dXJuIGdldEN1cnJlbnRDb250ZXh0KCkuZ2V0Q29uZmlnKCktPmFsbG93VGhyb3dzKCk7IH0KKworICAgIEFzc2VydGlvblJlc3VsdCBSZXN1bHRCdWlsZGVyOjpidWlsZCgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gYnVpbGQoICp0aGlzICk7CisgICAgfQorCisgICAgLy8gQ0FWRUFUOiBUaGUgcmV0dXJuZWQgQXNzZXJ0aW9uUmVzdWx0IHN0b3JlcyBhIHBvaW50ZXIgdG8gdGhlIGFyZ3VtZW50IGV4cHIsCisgICAgLy8gICAgICAgICBhIHRlbXBvcmFyeSBEZWNvbXBvc2VkRXhwcmVzc2lvbiwgd2hpY2ggaW4gdHVybiBob2xkcyByZWZlcmVuY2VzIHRvCisgICAgLy8gICAgICAgICBvcGVyYW5kcywgcG9zc2libHkgdGVtcG9yYXJ5IGFzIHdlbGwuCisgICAgLy8gICAgICAgICBJdCBzaG91bGQgaW1tZWRpYXRlbHkgYmUgcGFzc2VkIHRvIGhhbmRsZVJlc3VsdDsgaWYgdGhlIGV4cHJlc3Npb24KKyAgICAvLyAgICAgICAgIG5lZWRzIHRvIGJlIHJlcG9ydGVkLCBpdHMgc3RyaW5nIGV4cGFuc2lvbiBtdXN0IGJlIGNvbXBvc2VkIGJlZm9yZQorICAgIC8vICAgICAgICAgdGhlIHRlbXBvcmFyaWVzIGFyZSBkZXN0cm95ZWQuCisgICAgQXNzZXJ0aW9uUmVzdWx0IFJlc3VsdEJ1aWxkZXI6OmJ1aWxkKCBEZWNvbXBvc2VkRXhwcmVzc2lvbiBjb25zdCYgZXhwciApIGNvbnN0CisgICAgeworICAgICAgICBhc3NlcnQoIG1fZGF0YS5yZXN1bHRUeXBlICE9IFJlc3VsdFdhczo6VW5rbm93biApOworICAgICAgICBBc3NlcnRpb25SZXN1bHREYXRhIGRhdGEgPSBtX2RhdGE7CisKKyAgICAgICAgLy8gRmxpcCBib29sIHJlc3VsdHMgaWYgRmFsc2VUZXN0IGZsYWcgaXMgc2V0CisgICAgICAgIGlmKCBpc0ZhbHNlVGVzdCggbV9hc3NlcnRpb25JbmZvLnJlc3VsdERpc3Bvc2l0aW9uICkgKSB7CisgICAgICAgICAgICBkYXRhLm5lZ2F0ZSggZXhwci5pc0JpbmFyeUV4cHJlc3Npb24oKSApOworICAgICAgICB9CisKKyAgICAgICAgZGF0YS5tZXNzYWdlID0gbV9zdHJlYW0ub3NzLnN0cigpOworICAgICAgICBkYXRhLmRlY29tcG9zZWRFeHByZXNzaW9uID0gJmV4cHI7IC8vIGZvciBsYXp5IHJlY29uc3RydWN0aW9uCisgICAgICAgIHJldHVybiBBc3NlcnRpb25SZXN1bHQoIG1fYXNzZXJ0aW9uSW5mbywgZGF0YSApOworICAgIH0KKworICAgIHZvaWQgUmVzdWx0QnVpbGRlcjo6cmVjb25zdHJ1Y3RFeHByZXNzaW9uKCBzdGQ6OnN0cmluZyYgZGVzdCApIGNvbnN0IHsKKyAgICAgICAgZGVzdCA9IG1fYXNzZXJ0aW9uSW5mby5jYXB0dXJlZEV4cHJlc3Npb247CisgICAgfQorCisgICAgdm9pZCBSZXN1bHRCdWlsZGVyOjpzZXRFeGNlcHRpb25HdWFyZCgpIHsKKyAgICAgICAgbV9ndWFyZEV4Y2VwdGlvbiA9IHRydWU7CisgICAgfQorICAgIHZvaWQgUmVzdWx0QnVpbGRlcjo6dW5zZXRFeGNlcHRpb25HdWFyZCgpIHsKKyAgICAgICAgbV9ndWFyZEV4Y2VwdGlvbiA9IGZhbHNlOworICAgIH0KKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF90YWdfYWxpYXNfcmVnaXN0cnkuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9UQUdfQUxJQVNfUkVHSVNUUllfSFBQX0lOQ0xVREVECisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBUYWdBbGlhc1JlZ2lzdHJ5Ojp+VGFnQWxpYXNSZWdpc3RyeSgpIHt9CisKKyAgICBPcHRpb248VGFnQWxpYXM+IFRhZ0FsaWFzUmVnaXN0cnk6OmZpbmQoIHN0ZDo6c3RyaW5nIGNvbnN0JiBhbGlhcyApIGNvbnN0IHsKKyAgICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIFRhZ0FsaWFzPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3JlZ2lzdHJ5LmZpbmQoIGFsaWFzICk7CisgICAgICAgIGlmKCBpdCAhPSBtX3JlZ2lzdHJ5LmVuZCgpICkKKyAgICAgICAgICAgIHJldHVybiBpdC0+c2Vjb25kOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gT3B0aW9uPFRhZ0FsaWFzPigpOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIFRhZ0FsaWFzUmVnaXN0cnk6OmV4cGFuZEFsaWFzZXMoIHN0ZDo6c3RyaW5nIGNvbnN0JiB1bmV4cGFuZGVkVGVzdFNwZWMgKSBjb25zdCB7CisgICAgICAgIHN0ZDo6c3RyaW5nIGV4cGFuZGVkVGVzdFNwZWMgPSB1bmV4cGFuZGVkVGVzdFNwZWM7CisgICAgICAgIGZvciggc3RkOjptYXA8c3RkOjpzdHJpbmcsIFRhZ0FsaWFzPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3JlZ2lzdHJ5LmJlZ2luKCksIGl0RW5kID0gbV9yZWdpc3RyeS5lbmQoKTsKKyAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICArK2l0ICkgeworICAgICAgICAgICAgc3RkOjpzaXplX3QgcG9zID0gZXhwYW5kZWRUZXN0U3BlYy5maW5kKCBpdC0+Zmlyc3QgKTsKKyAgICAgICAgICAgIGlmKCBwb3MgIT0gc3RkOjpzdHJpbmc6Om5wb3MgKSB7CisgICAgICAgICAgICAgICAgZXhwYW5kZWRUZXN0U3BlYyA9ICBleHBhbmRlZFRlc3RTcGVjLnN1YnN0ciggMCwgcG9zICkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQtPnNlY29uZC50YWcgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwYW5kZWRUZXN0U3BlYy5zdWJzdHIoIHBvcyArIGl0LT5maXJzdC5zaXplKCkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZXhwYW5kZWRUZXN0U3BlYzsKKyAgICB9CisKKyAgICB2b2lkIFRhZ0FsaWFzUmVnaXN0cnk6OmFkZCggc3RkOjpzdHJpbmcgY29uc3QmIGFsaWFzLCBzdGQ6OnN0cmluZyBjb25zdCYgdGFnLCBTb3VyY2VMaW5lSW5mbyBjb25zdCYgbGluZUluZm8gKSB7CisKKyAgICAgICAgaWYoICFzdGFydHNXaXRoKCBhbGlhcywgIltAIiApIHx8ICFlbmRzV2l0aCggYWxpYXMsICddJyApICkgeworICAgICAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICAgICAgICAgIG9zcyA8PCBDb2xvdXIoIENvbG91cjo6UmVkICkKKyAgICAgICAgICAgICAgICA8PCAiZXJyb3I6IHRhZyBhbGlhcywgXCIiIDw8IGFsaWFzIDw8ICJcIiBpcyBub3Qgb2YgdGhlIGZvcm0gW0BhbGlhcyBuYW1lXS5cbiIKKyAgICAgICAgICAgICAgICA8PCBDb2xvdXIoIENvbG91cjo6RmlsZU5hbWUgKQorICAgICAgICAgICAgICAgIDw8IGxpbmVJbmZvIDw8ICdcbic7CisgICAgICAgICAgICB0aHJvdyBzdGQ6OmRvbWFpbl9lcnJvciggb3NzLnN0cigpLmNfc3RyKCkgKTsKKyAgICAgICAgfQorICAgICAgICBpZiggIW1fcmVnaXN0cnkuaW5zZXJ0KCBzdGQ6Om1ha2VfcGFpciggYWxpYXMsIFRhZ0FsaWFzKCB0YWcsIGxpbmVJbmZvICkgKSApLnNlY29uZCApIHsKKyAgICAgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisgICAgICAgICAgICBvc3MgPDwgQ29sb3VyKCBDb2xvdXI6OlJlZCApCisgICAgICAgICAgICAgICAgPDwgImVycm9yOiB0YWcgYWxpYXMsIFwiIiA8PCBhbGlhcyA8PCAiXCIgYWxyZWFkeSByZWdpc3RlcmVkLlxuIgorICAgICAgICAgICAgICAgIDw8ICJcdEZpcnN0IHNlZW4gYXQgIgorICAgICAgICAgICAgICAgIDw8IENvbG91ciggQ29sb3VyOjpSZWQgKSA8PCBmaW5kKGFsaWFzKS0+bGluZUluZm8gPDwgJ1xuJworICAgICAgICAgICAgICAgIDw8IENvbG91ciggQ29sb3VyOjpSZWQgKSA8PCAiXHRSZWRlZmluZWQgYXQgIgorICAgICAgICAgICAgICAgIDw8IENvbG91ciggQ29sb3VyOjpGaWxlTmFtZSkgPDwgbGluZUluZm8gPDwgJ1xuJzsKKyAgICAgICAgICAgIHRocm93IHN0ZDo6ZG9tYWluX2Vycm9yKCBvc3Muc3RyKCkuY19zdHIoKSApOworICAgICAgICB9CisgICAgfQorCisgICAgSVRhZ0FsaWFzUmVnaXN0cnk6On5JVGFnQWxpYXNSZWdpc3RyeSgpIHt9CisKKyAgICBJVGFnQWxpYXNSZWdpc3RyeSBjb25zdCYgSVRhZ0FsaWFzUmVnaXN0cnk6OmdldCgpIHsKKyAgICAgICAgcmV0dXJuIGdldFJlZ2lzdHJ5SHViKCkuZ2V0VGFnQWxpYXNSZWdpc3RyeSgpOworICAgIH0KKworICAgIFJlZ2lzdHJhckZvclRhZ0FsaWFzZXM6OlJlZ2lzdHJhckZvclRhZ0FsaWFzZXMoIGNoYXIgY29uc3QqIGFsaWFzLCBjaGFyIGNvbnN0KiB0YWcsIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBsaW5lSW5mbyApIHsKKyAgICAgICAgZ2V0TXV0YWJsZVJlZ2lzdHJ5SHViKCkucmVnaXN0ZXJUYWdBbGlhcyggYWxpYXMsIHRhZywgbGluZUluZm8gKTsKKyAgICB9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfbWF0Y2hlcnNfc3RyaW5nLmhwcAorCituYW1lc3BhY2UgQ2F0Y2ggeworbmFtZXNwYWNlIE1hdGNoZXJzIHsKKworICAgIG5hbWVzcGFjZSBTdGRTdHJpbmcgeworCisgICAgICAgIENhc2VkU3RyaW5nOjpDYXNlZFN0cmluZyggc3RkOjpzdHJpbmcgY29uc3QmIHN0ciwgQ2FzZVNlbnNpdGl2ZTo6Q2hvaWNlIGNhc2VTZW5zaXRpdml0eSApCisgICAgICAgIDogICBtX2Nhc2VTZW5zaXRpdml0eSggY2FzZVNlbnNpdGl2aXR5ICksCisgICAgICAgICAgICBtX3N0ciggYWRqdXN0U3RyaW5nKCBzdHIgKSApCisgICAgICAgIHt9CisgICAgICAgIHN0ZDo6c3RyaW5nIENhc2VkU3RyaW5nOjphZGp1c3RTdHJpbmcoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIgKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbV9jYXNlU2Vuc2l0aXZpdHkgPT0gQ2FzZVNlbnNpdGl2ZTo6Tm8KKyAgICAgICAgICAgICAgICAgICA/IHRvTG93ZXIoIHN0ciApCisgICAgICAgICAgICAgICAgICAgOiBzdHI7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjpzdHJpbmcgQ2FzZWRTdHJpbmc6OmNhc2VTZW5zaXRpdml0eVN1ZmZpeCgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBtX2Nhc2VTZW5zaXRpdml0eSA9PSBDYXNlU2Vuc2l0aXZlOjpObworICAgICAgICAgICAgICAgICAgID8gIiAoY2FzZSBpbnNlbnNpdGl2ZSkiCisgICAgICAgICAgICAgICAgICAgOiBzdGQ6OnN0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nTWF0Y2hlckJhc2U6OlN0cmluZ01hdGNoZXJCYXNlKCBzdGQ6OnN0cmluZyBjb25zdCYgb3BlcmF0aW9uLCBDYXNlZFN0cmluZyBjb25zdCYgY29tcGFyYXRvciApCisgICAgICAgIDogbV9jb21wYXJhdG9yKCBjb21wYXJhdG9yICksCisgICAgICAgICAgbV9vcGVyYXRpb24oIG9wZXJhdGlvbiApIHsKKyAgICAgICAgfQorCisgICAgICAgIHN0ZDo6c3RyaW5nIFN0cmluZ01hdGNoZXJCYXNlOjpkZXNjcmliZSgpIGNvbnN0IHsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGRlc2NyaXB0aW9uOworICAgICAgICAgICAgZGVzY3JpcHRpb24ucmVzZXJ2ZSg1ICsgbV9vcGVyYXRpb24uc2l6ZSgpICsgbV9jb21wYXJhdG9yLm1fc3RyLnNpemUoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9jb21wYXJhdG9yLmNhc2VTZW5zaXRpdml0eVN1ZmZpeCgpLnNpemUoKSk7CisgICAgICAgICAgICBkZXNjcmlwdGlvbiArPSBtX29wZXJhdGlvbjsKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uICs9ICI6IFwiIjsKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uICs9IG1fY29tcGFyYXRvci5tX3N0cjsKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uICs9ICJcIiI7CisgICAgICAgICAgICBkZXNjcmlwdGlvbiArPSBtX2NvbXBhcmF0b3IuY2FzZVNlbnNpdGl2aXR5U3VmZml4KCk7CisgICAgICAgICAgICByZXR1cm4gZGVzY3JpcHRpb247CisgICAgICAgIH0KKworICAgICAgICBFcXVhbHNNYXRjaGVyOjpFcXVhbHNNYXRjaGVyKCBDYXNlZFN0cmluZyBjb25zdCYgY29tcGFyYXRvciApIDogU3RyaW5nTWF0Y2hlckJhc2UoICJlcXVhbHMiLCBjb21wYXJhdG9yICkge30KKworICAgICAgICBib29sIEVxdWFsc01hdGNoZXI6Om1hdGNoKCBzdGQ6OnN0cmluZyBjb25zdCYgc291cmNlICkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1fY29tcGFyYXRvci5hZGp1c3RTdHJpbmcoIHNvdXJjZSApID09IG1fY29tcGFyYXRvci5tX3N0cjsKKyAgICAgICAgfQorCisgICAgICAgIENvbnRhaW5zTWF0Y2hlcjo6Q29udGFpbnNNYXRjaGVyKCBDYXNlZFN0cmluZyBjb25zdCYgY29tcGFyYXRvciApIDogU3RyaW5nTWF0Y2hlckJhc2UoICJjb250YWlucyIsIGNvbXBhcmF0b3IgKSB7fQorCisgICAgICAgIGJvb2wgQ29udGFpbnNNYXRjaGVyOjptYXRjaCggc3RkOjpzdHJpbmcgY29uc3QmIHNvdXJjZSApIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBjb250YWlucyggbV9jb21wYXJhdG9yLmFkanVzdFN0cmluZyggc291cmNlICksIG1fY29tcGFyYXRvci5tX3N0ciApOworICAgICAgICB9CisKKyAgICAgICAgU3RhcnRzV2l0aE1hdGNoZXI6OlN0YXJ0c1dpdGhNYXRjaGVyKCBDYXNlZFN0cmluZyBjb25zdCYgY29tcGFyYXRvciApIDogU3RyaW5nTWF0Y2hlckJhc2UoICJzdGFydHMgd2l0aCIsIGNvbXBhcmF0b3IgKSB7fQorCisgICAgICAgIGJvb2wgU3RhcnRzV2l0aE1hdGNoZXI6Om1hdGNoKCBzdGQ6OnN0cmluZyBjb25zdCYgc291cmNlICkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIHN0YXJ0c1dpdGgoIG1fY29tcGFyYXRvci5hZGp1c3RTdHJpbmcoIHNvdXJjZSApLCBtX2NvbXBhcmF0b3IubV9zdHIgKTsKKyAgICAgICAgfQorCisgICAgICAgIEVuZHNXaXRoTWF0Y2hlcjo6RW5kc1dpdGhNYXRjaGVyKCBDYXNlZFN0cmluZyBjb25zdCYgY29tcGFyYXRvciApIDogU3RyaW5nTWF0Y2hlckJhc2UoICJlbmRzIHdpdGgiLCBjb21wYXJhdG9yICkge30KKworICAgICAgICBib29sIEVuZHNXaXRoTWF0Y2hlcjo6bWF0Y2goIHN0ZDo6c3RyaW5nIGNvbnN0JiBzb3VyY2UgKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gZW5kc1dpdGgoIG1fY29tcGFyYXRvci5hZGp1c3RTdHJpbmcoIHNvdXJjZSApLCBtX2NvbXBhcmF0b3IubV9zdHIgKTsKKyAgICAgICAgfQorCisgICAgfSAvLyBuYW1lc3BhY2UgU3RkU3RyaW5nCisKKyAgICBTdGRTdHJpbmc6OkVxdWFsc01hdGNoZXIgRXF1YWxzKCBzdGQ6OnN0cmluZyBjb25zdCYgc3RyLCBDYXNlU2Vuc2l0aXZlOjpDaG9pY2UgY2FzZVNlbnNpdGl2aXR5ICkgeworICAgICAgICByZXR1cm4gU3RkU3RyaW5nOjpFcXVhbHNNYXRjaGVyKCBTdGRTdHJpbmc6OkNhc2VkU3RyaW5nKCBzdHIsIGNhc2VTZW5zaXRpdml0eSkgKTsKKyAgICB9CisgICAgU3RkU3RyaW5nOjpDb250YWluc01hdGNoZXIgQ29udGFpbnMoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIsIENhc2VTZW5zaXRpdmU6OkNob2ljZSBjYXNlU2Vuc2l0aXZpdHkgKSB7CisgICAgICAgIHJldHVybiBTdGRTdHJpbmc6OkNvbnRhaW5zTWF0Y2hlciggU3RkU3RyaW5nOjpDYXNlZFN0cmluZyggc3RyLCBjYXNlU2Vuc2l0aXZpdHkpICk7CisgICAgfQorICAgIFN0ZFN0cmluZzo6RW5kc1dpdGhNYXRjaGVyIEVuZHNXaXRoKCBzdGQ6OnN0cmluZyBjb25zdCYgc3RyLCBDYXNlU2Vuc2l0aXZlOjpDaG9pY2UgY2FzZVNlbnNpdGl2aXR5ICkgeworICAgICAgICByZXR1cm4gU3RkU3RyaW5nOjpFbmRzV2l0aE1hdGNoZXIoIFN0ZFN0cmluZzo6Q2FzZWRTdHJpbmcoIHN0ciwgY2FzZVNlbnNpdGl2aXR5KSApOworICAgIH0KKyAgICBTdGRTdHJpbmc6OlN0YXJ0c1dpdGhNYXRjaGVyIFN0YXJ0c1dpdGgoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIsIENhc2VTZW5zaXRpdmU6OkNob2ljZSBjYXNlU2Vuc2l0aXZpdHkgKSB7CisgICAgICAgIHJldHVybiBTdGRTdHJpbmc6OlN0YXJ0c1dpdGhNYXRjaGVyKCBTdGRTdHJpbmc6OkNhc2VkU3RyaW5nKCBzdHIsIGNhc2VTZW5zaXRpdml0eSkgKTsKKyAgICB9CisKK30gLy8gbmFtZXNwYWNlIE1hdGNoZXJzCit9IC8vIG5hbWVzcGFjZSBDYXRjaAorLy8gI2luY2x1ZGVkIGZyb206IC4uL3JlcG9ydGVycy9jYXRjaF9yZXBvcnRlcl9tdWx0aS5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1JFUE9SVEVSX01VTFRJX0hQUF9JTkNMVURFRAorCituYW1lc3BhY2UgQ2F0Y2ggeworCitjbGFzcyBNdWx0aXBsZVJlcG9ydGVycyA6IHB1YmxpYyBTaGFyZWRJbXBsPElTdHJlYW1pbmdSZXBvcnRlcj4geworICAgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8UHRyPElTdHJlYW1pbmdSZXBvcnRlcj4gPiBSZXBvcnRlcnM7CisgICAgUmVwb3J0ZXJzIG1fcmVwb3J0ZXJzOworCitwdWJsaWM6CisgICAgdm9pZCBhZGQoIFB0cjxJU3RyZWFtaW5nUmVwb3J0ZXI+IGNvbnN0JiByZXBvcnRlciApIHsKKyAgICAgICAgbV9yZXBvcnRlcnMucHVzaF9iYWNrKCByZXBvcnRlciApOworICAgIH0KKworcHVibGljOiAvLyBJU3RyZWFtaW5nUmVwb3J0ZXIKKworICAgIHZpcnR1YWwgUmVwb3J0ZXJQcmVmZXJlbmNlcyBnZXRQcmVmZXJlbmNlcygpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgcmV0dXJuIG1fcmVwb3J0ZXJzWzBdLT5nZXRQcmVmZXJlbmNlcygpOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBub01hdGNoaW5nVGVzdENhc2VzKCBzdGQ6OnN0cmluZyBjb25zdCYgc3BlYyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgZm9yKCBSZXBvcnRlcnM6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9yZXBvcnRlcnMuYmVnaW4oKSwgaXRFbmQgPSBtX3JlcG9ydGVycy5lbmQoKTsKKyAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICArK2l0ICkKKyAgICAgICAgICAgICgqaXQpLT5ub01hdGNoaW5nVGVzdENhc2VzKCBzcGVjICk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIHRlc3RSdW5TdGFydGluZyggVGVzdFJ1bkluZm8gY29uc3QmIHRlc3RSdW5JbmZvICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICBmb3IoIFJlcG9ydGVyczo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3JlcG9ydGVycy5iZWdpbigpLCBpdEVuZCA9IG1fcmVwb3J0ZXJzLmVuZCgpOworICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICsraXQgKQorICAgICAgICAgICAgKCppdCktPnRlc3RSdW5TdGFydGluZyggdGVzdFJ1bkluZm8gKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgdGVzdEdyb3VwU3RhcnRpbmcoIEdyb3VwSW5mbyBjb25zdCYgZ3JvdXBJbmZvICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICBmb3IoIFJlcG9ydGVyczo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3JlcG9ydGVycy5iZWdpbigpLCBpdEVuZCA9IG1fcmVwb3J0ZXJzLmVuZCgpOworICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICsraXQgKQorICAgICAgICAgICAgKCppdCktPnRlc3RHcm91cFN0YXJ0aW5nKCBncm91cEluZm8gKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgdGVzdENhc2VTdGFydGluZyggVGVzdENhc2VJbmZvIGNvbnN0JiB0ZXN0SW5mbyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgZm9yKCBSZXBvcnRlcnM6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9yZXBvcnRlcnMuYmVnaW4oKSwgaXRFbmQgPSBtX3JlcG9ydGVycy5lbmQoKTsKKyAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICArK2l0ICkKKyAgICAgICAgICAgICgqaXQpLT50ZXN0Q2FzZVN0YXJ0aW5nKCB0ZXN0SW5mbyApOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBzZWN0aW9uU3RhcnRpbmcoIFNlY3Rpb25JbmZvIGNvbnN0JiBzZWN0aW9uSW5mbyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgZm9yKCBSZXBvcnRlcnM6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9yZXBvcnRlcnMuYmVnaW4oKSwgaXRFbmQgPSBtX3JlcG9ydGVycy5lbmQoKTsKKyAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICArK2l0ICkKKyAgICAgICAgICAgICgqaXQpLT5zZWN0aW9uU3RhcnRpbmcoIHNlY3Rpb25JbmZvICk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIGFzc2VydGlvblN0YXJ0aW5nKCBBc3NlcnRpb25JbmZvIGNvbnN0JiBhc3NlcnRpb25JbmZvICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICBmb3IoIFJlcG9ydGVyczo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3JlcG9ydGVycy5iZWdpbigpLCBpdEVuZCA9IG1fcmVwb3J0ZXJzLmVuZCgpOworICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICsraXQgKQorICAgICAgICAgICAgKCppdCktPmFzc2VydGlvblN0YXJ0aW5nKCBhc3NlcnRpb25JbmZvICk7CisgICAgfQorCisgICAgLy8gVGhlIHJldHVybiB2YWx1ZSBpbmRpY2F0ZXMgaWYgdGhlIG1lc3NhZ2VzIGJ1ZmZlciBzaG91bGQgYmUgY2xlYXJlZDoKKyAgICB2aXJ0dWFsIGJvb2wgYXNzZXJ0aW9uRW5kZWQoIEFzc2VydGlvblN0YXRzIGNvbnN0JiBhc3NlcnRpb25TdGF0cyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgYm9vbCBjbGVhckJ1ZmZlciA9IGZhbHNlOworICAgICAgICBmb3IoIFJlcG9ydGVyczo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3JlcG9ydGVycy5iZWdpbigpLCBpdEVuZCA9IG1fcmVwb3J0ZXJzLmVuZCgpOworICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICsraXQgKQorICAgICAgICAgICAgY2xlYXJCdWZmZXIgfD0gKCppdCktPmFzc2VydGlvbkVuZGVkKCBhc3NlcnRpb25TdGF0cyApOworICAgICAgICByZXR1cm4gY2xlYXJCdWZmZXI7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIHNlY3Rpb25FbmRlZCggU2VjdGlvblN0YXRzIGNvbnN0JiBzZWN0aW9uU3RhdHMgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgIGZvciggUmVwb3J0ZXJzOjpjb25zdF9pdGVyYXRvciBpdCA9IG1fcmVwb3J0ZXJzLmJlZ2luKCksIGl0RW5kID0gbV9yZXBvcnRlcnMuZW5kKCk7CisgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgKytpdCApCisgICAgICAgICAgICAoKml0KS0+c2VjdGlvbkVuZGVkKCBzZWN0aW9uU3RhdHMgKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgdGVzdENhc2VFbmRlZCggVGVzdENhc2VTdGF0cyBjb25zdCYgdGVzdENhc2VTdGF0cyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgZm9yKCBSZXBvcnRlcnM6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9yZXBvcnRlcnMuYmVnaW4oKSwgaXRFbmQgPSBtX3JlcG9ydGVycy5lbmQoKTsKKyAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICArK2l0ICkKKyAgICAgICAgICAgICgqaXQpLT50ZXN0Q2FzZUVuZGVkKCB0ZXN0Q2FzZVN0YXRzICk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIHRlc3RHcm91cEVuZGVkKCBUZXN0R3JvdXBTdGF0cyBjb25zdCYgdGVzdEdyb3VwU3RhdHMgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgIGZvciggUmVwb3J0ZXJzOjpjb25zdF9pdGVyYXRvciBpdCA9IG1fcmVwb3J0ZXJzLmJlZ2luKCksIGl0RW5kID0gbV9yZXBvcnRlcnMuZW5kKCk7CisgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgKytpdCApCisgICAgICAgICAgICAoKml0KS0+dGVzdEdyb3VwRW5kZWQoIHRlc3RHcm91cFN0YXRzICk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIHRlc3RSdW5FbmRlZCggVGVzdFJ1blN0YXRzIGNvbnN0JiB0ZXN0UnVuU3RhdHMgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgIGZvciggUmVwb3J0ZXJzOjpjb25zdF9pdGVyYXRvciBpdCA9IG1fcmVwb3J0ZXJzLmJlZ2luKCksIGl0RW5kID0gbV9yZXBvcnRlcnMuZW5kKCk7CisgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgKytpdCApCisgICAgICAgICAgICAoKml0KS0+dGVzdFJ1bkVuZGVkKCB0ZXN0UnVuU3RhdHMgKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgc2tpcFRlc3QoIFRlc3RDYXNlSW5mbyBjb25zdCYgdGVzdEluZm8gKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgIGZvciggUmVwb3J0ZXJzOjpjb25zdF9pdGVyYXRvciBpdCA9IG1fcmVwb3J0ZXJzLmJlZ2luKCksIGl0RW5kID0gbV9yZXBvcnRlcnMuZW5kKCk7CisgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgKytpdCApCisgICAgICAgICAgICAoKml0KS0+c2tpcFRlc3QoIHRlc3RJbmZvICk7CisgICAgfQorCisgICAgdmlydHVhbCBNdWx0aXBsZVJlcG9ydGVycyogdHJ5QXNNdWx0aSgpIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCit9OworCitQdHI8SVN0cmVhbWluZ1JlcG9ydGVyPiBhZGRSZXBvcnRlciggUHRyPElTdHJlYW1pbmdSZXBvcnRlcj4gY29uc3QmIGV4aXN0aW5nUmVwb3J0ZXIsIFB0cjxJU3RyZWFtaW5nUmVwb3J0ZXI+IGNvbnN0JiBhZGRpdGlvbmFsUmVwb3J0ZXIgKSB7CisgICAgUHRyPElTdHJlYW1pbmdSZXBvcnRlcj4gcmVzdWx0aW5nUmVwb3J0ZXI7CisKKyAgICBpZiggZXhpc3RpbmdSZXBvcnRlciApIHsKKyAgICAgICAgTXVsdGlwbGVSZXBvcnRlcnMqIG11bHRpID0gZXhpc3RpbmdSZXBvcnRlci0+dHJ5QXNNdWx0aSgpOworICAgICAgICBpZiggIW11bHRpICkgeworICAgICAgICAgICAgbXVsdGkgPSBuZXcgTXVsdGlwbGVSZXBvcnRlcnM7CisgICAgICAgICAgICByZXN1bHRpbmdSZXBvcnRlciA9IFB0cjxJU3RyZWFtaW5nUmVwb3J0ZXI+KCBtdWx0aSApOworICAgICAgICAgICAgaWYoIGV4aXN0aW5nUmVwb3J0ZXIgKQorICAgICAgICAgICAgICAgIG11bHRpLT5hZGQoIGV4aXN0aW5nUmVwb3J0ZXIgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICByZXN1bHRpbmdSZXBvcnRlciA9IGV4aXN0aW5nUmVwb3J0ZXI7CisgICAgICAgIG11bHRpLT5hZGQoIGFkZGl0aW9uYWxSZXBvcnRlciApOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJlc3VsdGluZ1JlcG9ydGVyID0gYWRkaXRpb25hbFJlcG9ydGVyOworCisgICAgcmV0dXJuIHJlc3VsdGluZ1JlcG9ydGVyOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IC4uL3JlcG9ydGVycy9jYXRjaF9yZXBvcnRlcl94bWwuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9SRVBPUlRFUl9YTUxfSFBQX0lOQ0xVREVECisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9yZXBvcnRlcl9iYXNlcy5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1JFUE9SVEVSX0JBU0VTX0hQUF9JTkNMVURFRAorCisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxjZmxvYXQ+CisjaW5jbHVkZSA8Y3N0ZGlvPgorI2luY2x1ZGUgPGFzc2VydC5oPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgbmFtZXNwYWNlIHsKKyAgICAgICAgLy8gQmVjYXVzZSBmb3JtYXR0aW5nIHVzaW5nIGMrKyBzdHJlYW1zIGlzIHN0YXRlZnVsLCBkcm9wIGRvd24gdG8gQyBpcyByZXF1aXJlZAorICAgICAgICAvLyBBbHRlcm5hdGl2ZWx5IHdlIGNvdWxkIHVzZSBzdHJpbmdzdHJlYW0sIGJ1dCBpdHMgcGVyZm9ybWFuY2UgaXMuLi4gbm90IGdvb2QuCisgICAgICAgIHN0ZDo6c3RyaW5nIGdldEZvcm1hdHRlZER1cmF0aW9uKCBkb3VibGUgZHVyYXRpb24gKSB7CisgICAgICAgICAgICAvLyBNYXggZXhwb25lbnQgKyAxIGlzIHJlcXVpcmVkIHRvIHJlcHJlc2VudCB0aGUgd2hvbGUgcGFydAorICAgICAgICAgICAgLy8gKyAxIGZvciBkZWNpbWFsIHBvaW50CisgICAgICAgICAgICAvLyArIDMgZm9yIHRoZSAzIGRlY2ltYWwgcGxhY2VzCisgICAgICAgICAgICAvLyArIDEgZm9yIG51bGwgdGVybWluYXRvcgorICAgICAgICAgICAgY29uc3Qgc2l6ZV90IG1heERvdWJsZVNpemUgPSBEQkxfTUFYXzEwX0VYUCArIDEgKyAxICsgMyArIDE7CisgICAgICAgICAgICBjaGFyIGJ1ZmZlclttYXhEb3VibGVTaXplXTsKKworICAgICAgICAgICAgLy8gU2F2ZSBwcmV2aW91cyBlcnJubywgdG8gcHJldmVudCBzcHJpbnRmIGZyb20gb3ZlcndyaXRpbmcgaXQKKyAgICAgICAgICAgIEVycm5vR3VhcmQgZ3VhcmQ7CisjaWZkZWYgX01TQ19WRVIKKyAgICAgICAgICAgIHNwcmludGZfcyhidWZmZXIsICIlLjNmIiwgZHVyYXRpb24pOworI2Vsc2UKKyAgICAgICAgICAgIHNwcmludGYoYnVmZmVyLCAiJS4zZiIsIGR1cmF0aW9uKTsKKyNlbmRpZgorICAgICAgICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKGJ1ZmZlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdHJ1Y3QgU3RyZWFtaW5nUmVwb3J0ZXJCYXNlIDogU2hhcmVkSW1wbDxJU3RyZWFtaW5nUmVwb3J0ZXI+IHsKKworICAgICAgICBTdHJlYW1pbmdSZXBvcnRlckJhc2UoIFJlcG9ydGVyQ29uZmlnIGNvbnN0JiBfY29uZmlnICkKKyAgICAgICAgOiAgIG1fY29uZmlnKCBfY29uZmlnLmZ1bGxDb25maWcoKSApLAorICAgICAgICAgICAgc3RyZWFtKCBfY29uZmlnLnN0cmVhbSgpICkKKyAgICAgICAgeworICAgICAgICAgICAgbV9yZXBvcnRlclByZWZzLnNob3VsZFJlZGlyZWN0U3RkT3V0ID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIFJlcG9ydGVyUHJlZmVyZW5jZXMgZ2V0UHJlZmVyZW5jZXMoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICByZXR1cm4gbV9yZXBvcnRlclByZWZzOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB+U3RyZWFtaW5nUmVwb3J0ZXJCYXNlKCkgQ0FUQ0hfT1ZFUlJJREU7CisKKyAgICAgICAgdmlydHVhbCB2b2lkIG5vTWF0Y2hpbmdUZXN0Q2FzZXMoIHN0ZDo6c3RyaW5nIGNvbnN0JiApIENBVENIX09WRVJSSURFIHt9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RSdW5TdGFydGluZyggVGVzdFJ1bkluZm8gY29uc3QmIF90ZXN0UnVuSW5mbyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIGN1cnJlbnRUZXN0UnVuSW5mbyA9IF90ZXN0UnVuSW5mbzsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdEdyb3VwU3RhcnRpbmcoIEdyb3VwSW5mbyBjb25zdCYgX2dyb3VwSW5mbyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIGN1cnJlbnRHcm91cEluZm8gPSBfZ3JvdXBJbmZvOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RDYXNlU3RhcnRpbmcoIFRlc3RDYXNlSW5mbyBjb25zdCYgX3Rlc3RJbmZvICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgY3VycmVudFRlc3RDYXNlSW5mbyA9IF90ZXN0SW5mbzsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHZvaWQgc2VjdGlvblN0YXJ0aW5nKCBTZWN0aW9uSW5mbyBjb25zdCYgX3NlY3Rpb25JbmZvICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgbV9zZWN0aW9uU3RhY2sucHVzaF9iYWNrKCBfc2VjdGlvbkluZm8gKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBzZWN0aW9uRW5kZWQoIFNlY3Rpb25TdGF0cyBjb25zdCYgLyogX3NlY3Rpb25TdGF0cyAqLyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIG1fc2VjdGlvblN0YWNrLnBvcF9iYWNrKCk7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RDYXNlRW5kZWQoIFRlc3RDYXNlU3RhdHMgY29uc3QmIC8qIF90ZXN0Q2FzZVN0YXRzICovICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgY3VycmVudFRlc3RDYXNlSW5mby5yZXNldCgpOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0R3JvdXBFbmRlZCggVGVzdEdyb3VwU3RhdHMgY29uc3QmIC8qIF90ZXN0R3JvdXBTdGF0cyAqLyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIGN1cnJlbnRHcm91cEluZm8ucmVzZXQoKTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdFJ1bkVuZGVkKCBUZXN0UnVuU3RhdHMgY29uc3QmIC8qIF90ZXN0UnVuU3RhdHMgKi8gKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBjdXJyZW50VGVzdENhc2VJbmZvLnJlc2V0KCk7CisgICAgICAgICAgICBjdXJyZW50R3JvdXBJbmZvLnJlc2V0KCk7CisgICAgICAgICAgICBjdXJyZW50VGVzdFJ1bkluZm8ucmVzZXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBza2lwVGVzdCggVGVzdENhc2VJbmZvIGNvbnN0JiApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIC8vIERvbid0IGRvIGFueXRoaW5nIHdpdGggdGhpcyBieSBkZWZhdWx0LgorICAgICAgICAgICAgLy8gSXQgY2FuIG9wdGlvbmFsbHkgYmUgb3ZlcnJpZGRlbiBpbiB0aGUgZGVyaXZlZCBjbGFzcy4KKyAgICAgICAgfQorCisgICAgICAgIFB0cjxJQ29uZmlnIGNvbnN0PiBtX2NvbmZpZzsKKyAgICAgICAgc3RkOjpvc3RyZWFtJiBzdHJlYW07CisKKyAgICAgICAgTGF6eVN0YXQ8VGVzdFJ1bkluZm8+IGN1cnJlbnRUZXN0UnVuSW5mbzsKKyAgICAgICAgTGF6eVN0YXQ8R3JvdXBJbmZvPiBjdXJyZW50R3JvdXBJbmZvOworICAgICAgICBMYXp5U3RhdDxUZXN0Q2FzZUluZm8+IGN1cnJlbnRUZXN0Q2FzZUluZm87CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8U2VjdGlvbkluZm8+IG1fc2VjdGlvblN0YWNrOworICAgICAgICBSZXBvcnRlclByZWZlcmVuY2VzIG1fcmVwb3J0ZXJQcmVmczsKKyAgICB9OworCisgICAgc3RydWN0IEN1bXVsYXRpdmVSZXBvcnRlckJhc2UgOiBTaGFyZWRJbXBsPElTdHJlYW1pbmdSZXBvcnRlcj4geworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBDaGlsZE5vZGVUPgorICAgICAgICBzdHJ1Y3QgTm9kZSA6IFNoYXJlZEltcGw8PiB7CisgICAgICAgICAgICBleHBsaWNpdCBOb2RlKCBUIGNvbnN0JiBfdmFsdWUgKSA6IHZhbHVlKCBfdmFsdWUgKSB7fQorICAgICAgICAgICAgdmlydHVhbCB+Tm9kZSgpIHt9CisKKyAgICAgICAgICAgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8UHRyPENoaWxkTm9kZVQ+ID4gQ2hpbGROb2RlczsKKyAgICAgICAgICAgIFQgdmFsdWU7CisgICAgICAgICAgICBDaGlsZE5vZGVzIGNoaWxkcmVuOworICAgICAgICB9OworICAgICAgICBzdHJ1Y3QgU2VjdGlvbk5vZGUgOiBTaGFyZWRJbXBsPD4geworICAgICAgICAgICAgZXhwbGljaXQgU2VjdGlvbk5vZGUoIFNlY3Rpb25TdGF0cyBjb25zdCYgX3N0YXRzICkgOiBzdGF0cyggX3N0YXRzICkge30KKyAgICAgICAgICAgIHZpcnR1YWwgflNlY3Rpb25Ob2RlKCk7CisKKyAgICAgICAgICAgIGJvb2wgb3BlcmF0b3IgPT0gKCBTZWN0aW9uTm9kZSBjb25zdCYgb3RoZXIgKSBjb25zdCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXRzLnNlY3Rpb25JbmZvLmxpbmVJbmZvID09IG90aGVyLnN0YXRzLnNlY3Rpb25JbmZvLmxpbmVJbmZvOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYm9vbCBvcGVyYXRvciA9PSAoIFB0cjxTZWN0aW9uTm9kZT4gY29uc3QmIG90aGVyICkgY29uc3QgeworICAgICAgICAgICAgICAgIHJldHVybiBvcGVyYXRvcj09KCAqb3RoZXIgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU2VjdGlvblN0YXRzIHN0YXRzOworICAgICAgICAgICAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxQdHI8U2VjdGlvbk5vZGU+ID4gQ2hpbGRTZWN0aW9uczsKKyAgICAgICAgICAgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8QXNzZXJ0aW9uU3RhdHM+IEFzc2VydGlvbnM7CisgICAgICAgICAgICBDaGlsZFNlY3Rpb25zIGNoaWxkU2VjdGlvbnM7CisgICAgICAgICAgICBBc3NlcnRpb25zIGFzc2VydGlvbnM7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBzdGRPdXQ7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBzdGRFcnI7CisgICAgICAgIH07CisKKyAgICAgICAgc3RydWN0IEJ5U2VjdGlvbkluZm8geworICAgICAgICAgICAgQnlTZWN0aW9uSW5mbyggU2VjdGlvbkluZm8gY29uc3QmIG90aGVyICkgOiBtX290aGVyKCBvdGhlciApIHt9CisgICAgICAgICAgICBCeVNlY3Rpb25JbmZvKCBCeVNlY3Rpb25JbmZvIGNvbnN0JiBvdGhlciApIDogbV9vdGhlciggb3RoZXIubV9vdGhlciApIHt9CisgICAgICAgICAgICBib29sIG9wZXJhdG9yKCkgKCBQdHI8U2VjdGlvbk5vZGU+IGNvbnN0JiBub2RlICkgY29uc3QgeworICAgICAgICAgICAgICAgIHJldHVybiBub2RlLT5zdGF0cy5zZWN0aW9uSW5mby5saW5lSW5mbyA9PSBtX290aGVyLmxpbmVJbmZvOworICAgICAgICAgICAgfQorICAgICAgICBwcml2YXRlOgorICAgICAgICAgICAgdm9pZCBvcGVyYXRvcj0oIEJ5U2VjdGlvbkluZm8gY29uc3QmICk7CisgICAgICAgICAgICBTZWN0aW9uSW5mbyBjb25zdCYgbV9vdGhlcjsKKyAgICAgICAgfTsKKworICAgICAgICB0eXBlZGVmIE5vZGU8VGVzdENhc2VTdGF0cywgU2VjdGlvbk5vZGU+IFRlc3RDYXNlTm9kZTsKKyAgICAgICAgdHlwZWRlZiBOb2RlPFRlc3RHcm91cFN0YXRzLCBUZXN0Q2FzZU5vZGU+IFRlc3RHcm91cE5vZGU7CisgICAgICAgIHR5cGVkZWYgTm9kZTxUZXN0UnVuU3RhdHMsIFRlc3RHcm91cE5vZGU+IFRlc3RSdW5Ob2RlOworCisgICAgICAgIEN1bXVsYXRpdmVSZXBvcnRlckJhc2UoIFJlcG9ydGVyQ29uZmlnIGNvbnN0JiBfY29uZmlnICkKKyAgICAgICAgOiAgIG1fY29uZmlnKCBfY29uZmlnLmZ1bGxDb25maWcoKSApLAorICAgICAgICAgICAgc3RyZWFtKCBfY29uZmlnLnN0cmVhbSgpICkKKyAgICAgICAgeworICAgICAgICAgICAgbV9yZXBvcnRlclByZWZzLnNob3VsZFJlZGlyZWN0U3RkT3V0ID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgfkN1bXVsYXRpdmVSZXBvcnRlckJhc2UoKTsKKworICAgICAgICB2aXJ0dWFsIFJlcG9ydGVyUHJlZmVyZW5jZXMgZ2V0UHJlZmVyZW5jZXMoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICByZXR1cm4gbV9yZXBvcnRlclByZWZzOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RSdW5TdGFydGluZyggVGVzdFJ1bkluZm8gY29uc3QmICkgQ0FUQ0hfT1ZFUlJJREUge30KKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RHcm91cFN0YXJ0aW5nKCBHcm91cEluZm8gY29uc3QmICkgQ0FUQ0hfT1ZFUlJJREUge30KKworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdENhc2VTdGFydGluZyggVGVzdENhc2VJbmZvIGNvbnN0JiApIENBVENIX09WRVJSSURFIHt9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHNlY3Rpb25TdGFydGluZyggU2VjdGlvbkluZm8gY29uc3QmIHNlY3Rpb25JbmZvICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgU2VjdGlvblN0YXRzIGluY29tcGxldGVTdGF0cyggc2VjdGlvbkluZm8sIENvdW50cygpLCAwLCBmYWxzZSApOworICAgICAgICAgICAgUHRyPFNlY3Rpb25Ob2RlPiBub2RlOworICAgICAgICAgICAgaWYoIG1fc2VjdGlvblN0YWNrLmVtcHR5KCkgKSB7CisgICAgICAgICAgICAgICAgaWYoICFtX3Jvb3RTZWN0aW9uICkKKyAgICAgICAgICAgICAgICAgICAgbV9yb290U2VjdGlvbiA9IG5ldyBTZWN0aW9uTm9kZSggaW5jb21wbGV0ZVN0YXRzICk7CisgICAgICAgICAgICAgICAgbm9kZSA9IG1fcm9vdFNlY3Rpb247CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBTZWN0aW9uTm9kZSYgcGFyZW50Tm9kZSA9ICptX3NlY3Rpb25TdGFjay5iYWNrKCk7CisgICAgICAgICAgICAgICAgU2VjdGlvbk5vZGU6OkNoaWxkU2VjdGlvbnM6OmNvbnN0X2l0ZXJhdG9yIGl0ID0KKyAgICAgICAgICAgICAgICAgICAgc3RkOjpmaW5kX2lmKCAgIHBhcmVudE5vZGUuY2hpbGRTZWN0aW9ucy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50Tm9kZS5jaGlsZFNlY3Rpb25zLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnlTZWN0aW9uSW5mbyggc2VjdGlvbkluZm8gKSApOworICAgICAgICAgICAgICAgIGlmKCBpdCA9PSBwYXJlbnROb2RlLmNoaWxkU2VjdGlvbnMuZW5kKCkgKSB7CisgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBuZXcgU2VjdGlvbk5vZGUoIGluY29tcGxldGVTdGF0cyApOworICAgICAgICAgICAgICAgICAgICBwYXJlbnROb2RlLmNoaWxkU2VjdGlvbnMucHVzaF9iYWNrKCBub2RlICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgbm9kZSA9ICppdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1fc2VjdGlvblN0YWNrLnB1c2hfYmFjayggbm9kZSApOworICAgICAgICAgICAgbV9kZWVwZXN0U2VjdGlvbiA9IG5vZGU7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgYXNzZXJ0aW9uU3RhcnRpbmcoIEFzc2VydGlvbkluZm8gY29uc3QmICkgQ0FUQ0hfT1ZFUlJJREUge30KKworICAgICAgICB2aXJ0dWFsIGJvb2wgYXNzZXJ0aW9uRW5kZWQoIEFzc2VydGlvblN0YXRzIGNvbnN0JiBhc3NlcnRpb25TdGF0cyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIGFzc2VydCggIW1fc2VjdGlvblN0YWNrLmVtcHR5KCkgKTsKKyAgICAgICAgICAgIFNlY3Rpb25Ob2RlJiBzZWN0aW9uTm9kZSA9ICptX3NlY3Rpb25TdGFjay5iYWNrKCk7CisgICAgICAgICAgICBzZWN0aW9uTm9kZS5hc3NlcnRpb25zLnB1c2hfYmFjayggYXNzZXJ0aW9uU3RhdHMgKTsKKyAgICAgICAgICAgIC8vIEFzc2VydGlvblJlc3VsdCBob2xkcyBhIHBvaW50ZXIgdG8gYSB0ZW1wb3JhcnkgRGVjb21wb3NlZEV4cHJlc3Npb24sCisgICAgICAgICAgICAvLyB3aGljaCBnZXRFeHBhbmRlZEV4cHJlc3Npb24oKSBjYWxscyB0byBidWlsZCB0aGUgZXhwcmVzc2lvbiBzdHJpbmcuCisgICAgICAgICAgICAvLyBPdXIgc2VjdGlvbiBzdGFjayBjb3B5IG9mIHRoZSBhc3NlcnRpb25SZXN1bHQgd2lsbCBsaWtlbHkgb3V0bGl2ZSB0aGUKKyAgICAgICAgICAgIC8vIHRlbXBvcmFyeSwgc28gaXQgbXVzdCBiZSBleHBhbmRlZCBvciBkaXNjYXJkZWQgbm93IHRvIGF2b2lkIGNhbGxpbmcKKyAgICAgICAgICAgIC8vIGEgZGVzdHJveWVkIG9iamVjdCBsYXRlci4KKyAgICAgICAgICAgIHByZXBhcmVFeHBhbmRlZEV4cHJlc3Npb24oIHNlY3Rpb25Ob2RlLmFzc2VydGlvbnMuYmFjaygpLmFzc2VydGlvblJlc3VsdCApOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCB2b2lkIHNlY3Rpb25FbmRlZCggU2VjdGlvblN0YXRzIGNvbnN0JiBzZWN0aW9uU3RhdHMgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBhc3NlcnQoICFtX3NlY3Rpb25TdGFjay5lbXB0eSgpICk7CisgICAgICAgICAgICBTZWN0aW9uTm9kZSYgbm9kZSA9ICptX3NlY3Rpb25TdGFjay5iYWNrKCk7CisgICAgICAgICAgICBub2RlLnN0YXRzID0gc2VjdGlvblN0YXRzOworICAgICAgICAgICAgbV9zZWN0aW9uU3RhY2sucG9wX2JhY2soKTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdENhc2VFbmRlZCggVGVzdENhc2VTdGF0cyBjb25zdCYgdGVzdENhc2VTdGF0cyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIFB0cjxUZXN0Q2FzZU5vZGU+IG5vZGUgPSBuZXcgVGVzdENhc2VOb2RlKCB0ZXN0Q2FzZVN0YXRzICk7CisgICAgICAgICAgICBhc3NlcnQoIG1fc2VjdGlvblN0YWNrLnNpemUoKSA9PSAwICk7CisgICAgICAgICAgICBub2RlLT5jaGlsZHJlbi5wdXNoX2JhY2soIG1fcm9vdFNlY3Rpb24gKTsKKyAgICAgICAgICAgIG1fdGVzdENhc2VzLnB1c2hfYmFjayggbm9kZSApOworICAgICAgICAgICAgbV9yb290U2VjdGlvbi5yZXNldCgpOworCisgICAgICAgICAgICBhc3NlcnQoIG1fZGVlcGVzdFNlY3Rpb24gKTsKKyAgICAgICAgICAgIG1fZGVlcGVzdFNlY3Rpb24tPnN0ZE91dCA9IHRlc3RDYXNlU3RhdHMuc3RkT3V0OworICAgICAgICAgICAgbV9kZWVwZXN0U2VjdGlvbi0+c3RkRXJyID0gdGVzdENhc2VTdGF0cy5zdGRFcnI7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RHcm91cEVuZGVkKCBUZXN0R3JvdXBTdGF0cyBjb25zdCYgdGVzdEdyb3VwU3RhdHMgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBQdHI8VGVzdEdyb3VwTm9kZT4gbm9kZSA9IG5ldyBUZXN0R3JvdXBOb2RlKCB0ZXN0R3JvdXBTdGF0cyApOworICAgICAgICAgICAgbm9kZS0+Y2hpbGRyZW4uc3dhcCggbV90ZXN0Q2FzZXMgKTsKKyAgICAgICAgICAgIG1fdGVzdEdyb3Vwcy5wdXNoX2JhY2soIG5vZGUgKTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdFJ1bkVuZGVkKCBUZXN0UnVuU3RhdHMgY29uc3QmIHRlc3RSdW5TdGF0cyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIFB0cjxUZXN0UnVuTm9kZT4gbm9kZSA9IG5ldyBUZXN0UnVuTm9kZSggdGVzdFJ1blN0YXRzICk7CisgICAgICAgICAgICBub2RlLT5jaGlsZHJlbi5zd2FwKCBtX3Rlc3RHcm91cHMgKTsKKyAgICAgICAgICAgIG1fdGVzdFJ1bnMucHVzaF9iYWNrKCBub2RlICk7CisgICAgICAgICAgICB0ZXN0UnVuRW5kZWRDdW11bGF0aXZlKCk7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RSdW5FbmRlZEN1bXVsYXRpdmUoKSA9IDA7CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHNraXBUZXN0KCBUZXN0Q2FzZUluZm8gY29uc3QmICkgQ0FUQ0hfT1ZFUlJJREUge30KKworICAgICAgICB2aXJ0dWFsIHZvaWQgcHJlcGFyZUV4cGFuZGVkRXhwcmVzc2lvbiggQXNzZXJ0aW9uUmVzdWx0JiByZXN1bHQgKSBjb25zdCB7CisgICAgICAgICAgICBpZiggcmVzdWx0LmlzT2soKSApCisgICAgICAgICAgICAgICAgcmVzdWx0LmRpc2NhcmREZWNvbXBvc2VkRXhwcmVzc2lvbigpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJlc3VsdC5leHBhbmREZWNvbXBvc2VkRXhwcmVzc2lvbigpOworICAgICAgICB9CisKKyAgICAgICAgUHRyPElDb25maWcgY29uc3Q+IG1fY29uZmlnOworICAgICAgICBzdGQ6Om9zdHJlYW0mIHN0cmVhbTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8QXNzZXJ0aW9uU3RhdHM+IG1fYXNzZXJ0aW9uczsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8UHRyPFNlY3Rpb25Ob2RlPiA+ID4gbV9zZWN0aW9uczsKKyAgICAgICAgc3RkOjp2ZWN0b3I8UHRyPFRlc3RDYXNlTm9kZT4gPiBtX3Rlc3RDYXNlczsKKyAgICAgICAgc3RkOjp2ZWN0b3I8UHRyPFRlc3RHcm91cE5vZGU+ID4gbV90ZXN0R3JvdXBzOworCisgICAgICAgIHN0ZDo6dmVjdG9yPFB0cjxUZXN0UnVuTm9kZT4gPiBtX3Rlc3RSdW5zOworCisgICAgICAgIFB0cjxTZWN0aW9uTm9kZT4gbV9yb290U2VjdGlvbjsKKyAgICAgICAgUHRyPFNlY3Rpb25Ob2RlPiBtX2RlZXBlc3RTZWN0aW9uOworICAgICAgICBzdGQ6OnZlY3RvcjxQdHI8U2VjdGlvbk5vZGU+ID4gbV9zZWN0aW9uU3RhY2s7CisgICAgICAgIFJlcG9ydGVyUHJlZmVyZW5jZXMgbV9yZXBvcnRlclByZWZzOworCisgICAgfTsKKworICAgIHRlbXBsYXRlPGNoYXIgQz4KKyAgICBjaGFyIGNvbnN0KiBnZXRMaW5lT2ZDaGFycygpIHsKKyAgICAgICAgc3RhdGljIGNoYXIgbGluZVtDQVRDSF9DT05GSUdfQ09OU09MRV9XSURUSF0gPSB7MH07CisgICAgICAgIGlmKCAhKmxpbmUgKSB7CisgICAgICAgICAgICBzdGQ6Om1lbXNldCggbGluZSwgQywgQ0FUQ0hfQ09ORklHX0NPTlNPTEVfV0lEVEgtMSApOworICAgICAgICAgICAgbGluZVtDQVRDSF9DT05GSUdfQ09OU09MRV9XSURUSC0xXSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGxpbmU7CisgICAgfQorCisgICAgc3RydWN0IFRlc3RFdmVudExpc3RlbmVyQmFzZSA6IFN0cmVhbWluZ1JlcG9ydGVyQmFzZSB7CisgICAgICAgIFRlc3RFdmVudExpc3RlbmVyQmFzZSggUmVwb3J0ZXJDb25maWcgY29uc3QmIF9jb25maWcgKQorICAgICAgICA6ICAgU3RyZWFtaW5nUmVwb3J0ZXJCYXNlKCBfY29uZmlnICkKKyAgICAgICAge30KKworICAgICAgICB2aXJ0dWFsIHZvaWQgYXNzZXJ0aW9uU3RhcnRpbmcoIEFzc2VydGlvbkluZm8gY29uc3QmICkgQ0FUQ0hfT1ZFUlJJREUge30KKyAgICAgICAgdmlydHVhbCBib29sIGFzc2VydGlvbkVuZGVkKCBBc3NlcnRpb25TdGF0cyBjb25zdCYgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IC4uL2ludGVybmFsL2NhdGNoX3JlcG9ydGVyX3JlZ2lzdHJhcnMuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9SRVBPUlRFUl9SRUdJU1RSQVJTX0hQUF9JTkNMVURFRAorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBjbGFzcyBMZWdhY3lSZXBvcnRlclJlZ2lzdHJhciB7CisKKyAgICAgICAgY2xhc3MgUmVwb3J0ZXJGYWN0b3J5IDogcHVibGljIElSZXBvcnRlckZhY3RvcnkgeworICAgICAgICAgICAgdmlydHVhbCBJU3RyZWFtaW5nUmVwb3J0ZXIqIGNyZWF0ZSggUmVwb3J0ZXJDb25maWcgY29uc3QmIGNvbmZpZyApIGNvbnN0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IExlZ2FjeVJlcG9ydGVyQWRhcHRlciggbmV3IFQoIGNvbmZpZyApICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSBjb25zdCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFQ6OmdldERlc2NyaXB0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICBwdWJsaWM6CisKKyAgICAgICAgTGVnYWN5UmVwb3J0ZXJSZWdpc3RyYXIoIHN0ZDo6c3RyaW5nIGNvbnN0JiBuYW1lICkgeworICAgICAgICAgICAgZ2V0TXV0YWJsZVJlZ2lzdHJ5SHViKCkucmVnaXN0ZXJSZXBvcnRlciggbmFtZSwgbmV3IFJlcG9ydGVyRmFjdG9yeSgpICk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBjbGFzcyBSZXBvcnRlclJlZ2lzdHJhciB7CisKKyAgICAgICAgY2xhc3MgUmVwb3J0ZXJGYWN0b3J5IDogcHVibGljIFNoYXJlZEltcGw8SVJlcG9ydGVyRmFjdG9yeT4geworCisgICAgICAgICAgICAvLyAqKiogUGxlYXNlIE5vdGUgKioqOgorICAgICAgICAgICAgLy8gLSBJZiB5b3UgZW5kIHVwIGhlcmUgbG9va2luZyBhdCBhIGNvbXBpbGVyIGVycm9yIGJlY2F1c2UgaXQncyB0cnlpbmcgdG8gcmVnaXN0ZXIKKyAgICAgICAgICAgIC8vIHlvdXIgY3VzdG9tIHJlcG9ydGVyIGNsYXNzIGJlIGF3YXJlIHRoYXQgdGhlIG5hdGl2ZSByZXBvcnRlciBpbnRlcmZhY2UgaGFzIGNoYW5nZWQKKyAgICAgICAgICAgIC8vIHRvIElTdHJlYW1pbmdSZXBvcnRlci4gVGhlICJsZWdhY3kiIGludGVyZmFjZSwgSVJlcG9ydGVyLCBpcyBzdGlsbCBzdXBwb3J0ZWQgdmlhCisgICAgICAgICAgICAvLyBhbiBhZGFwdGVyLiBKdXN0IHVzZSBSRUdJU1RFUl9MRUdBQ1lfUkVQT1JURVIgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIGFkYXB0ZXIuCisgICAgICAgICAgICAvLyBIb3dldmVyIHBsZWFzZSBjb25zaWRlciB1cGRhdGluZyB0byB0aGUgbmV3IGludGVyZmFjZSBhcyB0aGUgb2xkIG9uZSBpcyBub3cKKyAgICAgICAgICAgIC8vIGRlcHJlY2F0ZWQgYW5kIHdpbGwgcHJvYmFibHkgYmUgcmVtb3ZlZCBxdWl0ZSBzb29uIQorICAgICAgICAgICAgLy8gUGxlYXNlIGNvbnRhY3QgbWUgdmlhIGdpdGh1YiBpZiB5b3UgaGF2ZSBhbnkgcXVlc3Rpb25zIGF0IGFsbCBhYm91dCB0aGlzLgorICAgICAgICAgICAgLy8gSW4gZmFjdCwgaWRlYWxseSwgcGxlYXNlIGNvbnRhY3QgbWUgYW55d2F5IHRvIGxldCBtZSBrbm93IHlvdSd2ZSBoaXQgdGhpcyAtIGFzIEkgaGF2ZQorICAgICAgICAgICAgLy8gbm8gaWRlYSB3aG8gaXMgYWN0dWFsbHkgdXNpbmcgY3VzdG9tIHJlcG9ydGVycyBhdCBhbGwgKHBvc3NpYmx5IG5vLW9uZSEpLgorICAgICAgICAgICAgLy8gVGhlIG5ldyBpbnRlcmZhY2UgaXMgZGVzaWduZWQgdG8gbWluaW1pc2UgZXhwb3N1cmUgdG8gaW50ZXJmYWNlIGNoYW5nZXMgaW4gdGhlIGZ1dHVyZS4KKyAgICAgICAgICAgIHZpcnR1YWwgSVN0cmVhbWluZ1JlcG9ydGVyKiBjcmVhdGUoIFJlcG9ydGVyQ29uZmlnIGNvbnN0JiBjb25maWcgKSBjb25zdCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUKCBjb25maWcgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXREZXNjcmlwdGlvbigpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gVDo6Z2V0RGVzY3JpcHRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgIHB1YmxpYzoKKworICAgICAgICBSZXBvcnRlclJlZ2lzdHJhciggc3RkOjpzdHJpbmcgY29uc3QmIG5hbWUgKSB7CisgICAgICAgICAgICBnZXRNdXRhYmxlUmVnaXN0cnlIdWIoKS5yZWdpc3RlclJlcG9ydGVyKCBuYW1lLCBuZXcgUmVwb3J0ZXJGYWN0b3J5KCkgKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGNsYXNzIExpc3RlbmVyUmVnaXN0cmFyIHsKKworICAgICAgICBjbGFzcyBMaXN0ZW5lckZhY3RvcnkgOiBwdWJsaWMgU2hhcmVkSW1wbDxJUmVwb3J0ZXJGYWN0b3J5PiB7CisKKyAgICAgICAgICAgIHZpcnR1YWwgSVN0cmVhbWluZ1JlcG9ydGVyKiBjcmVhdGUoIFJlcG9ydGVyQ29uZmlnIGNvbnN0JiBjb25maWcgKSBjb25zdCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUKCBjb25maWcgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSBjb25zdCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICBwdWJsaWM6CisKKyAgICAgICAgTGlzdGVuZXJSZWdpc3RyYXIoKSB7CisgICAgICAgICAgICBnZXRNdXRhYmxlUmVnaXN0cnlIdWIoKS5yZWdpc3Rlckxpc3RlbmVyKCBuZXcgTGlzdGVuZXJGYWN0b3J5KCkgKTsKKyAgICAgICAgfQorICAgIH07Cit9CisKKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfUkVHSVNURVJfTEVHQUNZX1JFUE9SVEVSKCBuYW1lLCByZXBvcnRlclR5cGUgKSBcCisgICAgbmFtZXNwYWNleyBDYXRjaDo6TGVnYWN5UmVwb3J0ZXJSZWdpc3RyYXI8cmVwb3J0ZXJUeXBlPiBjYXRjaF9pbnRlcm5hbF9SZWdpc3RyYXJGb3IjI3JlcG9ydGVyVHlwZSggbmFtZSApOyB9CisKKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfUkVHSVNURVJfUkVQT1JURVIoIG5hbWUsIHJlcG9ydGVyVHlwZSApIFwKKyAgICBuYW1lc3BhY2V7IENhdGNoOjpSZXBvcnRlclJlZ2lzdHJhcjxyZXBvcnRlclR5cGU+IGNhdGNoX2ludGVybmFsX1JlZ2lzdHJhckZvciMjcmVwb3J0ZXJUeXBlKCBuYW1lICk7IH0KKworLy8gRGVwcmVjYXRlZCAtIHVzZSB0aGUgZm9ybSB3aXRob3V0IElOVEVSTkFMXworI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9SRUdJU1RFUl9MSVNURU5FUiggbGlzdGVuZXJUeXBlICkgXAorICAgIG5hbWVzcGFjZXsgQ2F0Y2g6Okxpc3RlbmVyUmVnaXN0cmFyPGxpc3RlbmVyVHlwZT4gY2F0Y2hfaW50ZXJuYWxfUmVnaXN0cmFyRm9yIyNsaXN0ZW5lclR5cGU7IH0KKworI2RlZmluZSBDQVRDSF9SRUdJU1RFUl9MSVNURU5FUiggbGlzdGVuZXJUeXBlICkgXAorICAgIG5hbWVzcGFjZXsgQ2F0Y2g6Okxpc3RlbmVyUmVnaXN0cmFyPGxpc3RlbmVyVHlwZT4gY2F0Y2hfaW50ZXJuYWxfUmVnaXN0cmFyRm9yIyNsaXN0ZW5lclR5cGU7IH0KKworLy8gI2luY2x1ZGVkIGZyb206IC4uL2ludGVybmFsL2NhdGNoX3htbHdyaXRlci5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1hNTFdSSVRFUl9IUFBfSU5DTFVERUQKKworI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxpb21hbmlwPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgY2xhc3MgWG1sRW5jb2RlIHsKKyAgICBwdWJsaWM6CisgICAgICAgIGVudW0gRm9yV2hhdCB7IEZvclRleHROb2RlcywgRm9yQXR0cmlidXRlcyB9OworCisgICAgICAgIFhtbEVuY29kZSggc3RkOjpzdHJpbmcgY29uc3QmIHN0ciwgRm9yV2hhdCBmb3JXaGF0ID0gRm9yVGV4dE5vZGVzICkKKyAgICAgICAgOiAgIG1fc3RyKCBzdHIgKSwKKyAgICAgICAgICAgIG1fZm9yV2hhdCggZm9yV2hhdCApCisgICAgICAgIHt9CisKKyAgICAgICAgdm9pZCBlbmNvZGVUbyggc3RkOjpvc3RyZWFtJiBvcyApIGNvbnN0IHsKKworICAgICAgICAgICAgLy8gQXBvc3Ryb3BoZSBlc2NhcGluZyBub3QgbmVjZXNzYXJ5IGlmIHdlIGFsd2F5cyB1c2UgIiB0byB3cml0ZSBhdHRyaWJ1dGVzCisgICAgICAgICAgICAvLyAoc2VlOiBodHRwOi8vd3d3LnczLm9yZy9UUi94bWwvI3N5bnRheCkKKworICAgICAgICAgICAgZm9yKCBzdGQ6OnNpemVfdCBpID0gMDsgaSA8IG1fc3RyLnNpemUoKTsgKysgaSApIHsKKyAgICAgICAgICAgICAgICBjaGFyIGMgPSBtX3N0cltpXTsKKyAgICAgICAgICAgICAgICBzd2l0Y2goIGMgKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJzwnOiAgIG9zIDw8ICImbHQ7IjsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJyYnOiAgIG9zIDw8ICImYW1wOyI7IGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgJz4nOgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2VlOiBodHRwOi8vd3d3LnczLm9yZy9UUi94bWwvI3N5bnRheAorICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGkgPiAyICYmIG1fc3RyW2ktMV0gPT0gJ10nICYmIG1fc3RyW2ktMl0gPT0gJ10nICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcyA8PCAiJmd0OyI7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MgPDwgYzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1wiJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBtX2ZvcldoYXQgPT0gRm9yQXR0cmlidXRlcyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MgPDwgIiZxdW90OyI7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MgPDwgYzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBFc2NhcGUgY29udHJvbCBjaGFycyAtIGJhc2VkIG9uIGNvbnRyaWJ1dGlvbiBieSBAZXNwZW5hbGIgaW4gUFIgIzQ2NSBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ5IEBtcnBpIFBSICM1ODgKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKCBjID49IDAgJiYgYyA8ICdceDA5JyApIHx8ICggYyA+ICdceDBEJyAmJiBjIDwgJ1x4MjAnKSB8fCBjPT0nXHg3RicgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VlIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNDA0MTA3L3doeS1hcmUtY29udHJvbC1jaGFyYWN0ZXJzLWlsbGVnYWwtaW4teG1sLTEtMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zIDw8ICJcXHgiIDw8IHN0ZDo6dXBwZXJjYXNlIDw8IHN0ZDo6aGV4IDw8IHN0ZDo6c2V0ZmlsbCgnMCcpIDw8IHN0ZDo6c2V0dygyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0YXRpY19jYXN0PGludD4oIGMgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcyA8PCBjOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZyaWVuZCBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yIDw8ICggc3RkOjpvc3RyZWFtJiBvcywgWG1sRW5jb2RlIGNvbnN0JiB4bWxFbmNvZGUgKSB7CisgICAgICAgICAgICB4bWxFbmNvZGUuZW5jb2RlVG8oIG9zICk7CisgICAgICAgICAgICByZXR1cm4gb3M7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6c3RyaW5nIG1fc3RyOworICAgICAgICBGb3JXaGF0IG1fZm9yV2hhdDsKKyAgICB9OworCisgICAgY2xhc3MgWG1sV3JpdGVyIHsKKyAgICBwdWJsaWM6CisKKyAgICAgICAgY2xhc3MgU2NvcGVkRWxlbWVudCB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIFNjb3BlZEVsZW1lbnQoIFhtbFdyaXRlciogd3JpdGVyICkKKyAgICAgICAgICAgIDogICBtX3dyaXRlciggd3JpdGVyICkKKyAgICAgICAgICAgIHt9CisKKyAgICAgICAgICAgIFNjb3BlZEVsZW1lbnQoIFNjb3BlZEVsZW1lbnQgY29uc3QmIG90aGVyICkKKyAgICAgICAgICAgIDogICBtX3dyaXRlciggb3RoZXIubV93cml0ZXIgKXsKKyAgICAgICAgICAgICAgICBvdGhlci5tX3dyaXRlciA9IENBVENIX05VTEw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH5TY29wZWRFbGVtZW50KCkgeworICAgICAgICAgICAgICAgIGlmKCBtX3dyaXRlciApCisgICAgICAgICAgICAgICAgICAgIG1fd3JpdGVyLT5lbmRFbGVtZW50KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFNjb3BlZEVsZW1lbnQmIHdyaXRlVGV4dCggc3RkOjpzdHJpbmcgY29uc3QmIHRleHQsIGJvb2wgaW5kZW50ID0gdHJ1ZSApIHsKKyAgICAgICAgICAgICAgICBtX3dyaXRlci0+d3JpdGVUZXh0KCB0ZXh0LCBpbmRlbnQgKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgICAgICAgICBTY29wZWRFbGVtZW50JiB3cml0ZUF0dHJpYnV0ZSggc3RkOjpzdHJpbmcgY29uc3QmIG5hbWUsIFQgY29uc3QmIGF0dHJpYnV0ZSApIHsKKyAgICAgICAgICAgICAgICBtX3dyaXRlci0+d3JpdGVBdHRyaWJ1dGUoIG5hbWUsIGF0dHJpYnV0ZSApOworICAgICAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgICAgIH0KKworICAgICAgICBwcml2YXRlOgorICAgICAgICAgICAgbXV0YWJsZSBYbWxXcml0ZXIqIG1fd3JpdGVyOworICAgICAgICB9OworCisgICAgICAgIFhtbFdyaXRlcigpCisgICAgICAgIDogICBtX3RhZ0lzT3BlbiggZmFsc2UgKSwKKyAgICAgICAgICAgIG1fbmVlZHNOZXdsaW5lKCBmYWxzZSApLAorICAgICAgICAgICAgbV9vcyggQ2F0Y2g6OmNvdXQoKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHdyaXRlRGVjbGFyYXRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIFhtbFdyaXRlciggc3RkOjpvc3RyZWFtJiBvcyApCisgICAgICAgIDogICBtX3RhZ0lzT3BlbiggZmFsc2UgKSwKKyAgICAgICAgICAgIG1fbmVlZHNOZXdsaW5lKCBmYWxzZSApLAorICAgICAgICAgICAgbV9vcyggb3MgKQorICAgICAgICB7CisgICAgICAgICAgICB3cml0ZURlY2xhcmF0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICB+WG1sV3JpdGVyKCkgeworICAgICAgICAgICAgd2hpbGUoICFtX3RhZ3MuZW1wdHkoKSApCisgICAgICAgICAgICAgICAgZW5kRWxlbWVudCgpOworICAgICAgICB9CisKKyAgICAgICAgWG1sV3JpdGVyJiBzdGFydEVsZW1lbnQoIHN0ZDo6c3RyaW5nIGNvbnN0JiBuYW1lICkgeworICAgICAgICAgICAgZW5zdXJlVGFnQ2xvc2VkKCk7CisgICAgICAgICAgICBuZXdsaW5lSWZOZWNlc3NhcnkoKTsKKyAgICAgICAgICAgIG1fb3MgPDwgbV9pbmRlbnQgPDwgJzwnIDw8IG5hbWU7CisgICAgICAgICAgICBtX3RhZ3MucHVzaF9iYWNrKCBuYW1lICk7CisgICAgICAgICAgICBtX2luZGVudCArPSAiICAiOworICAgICAgICAgICAgbV90YWdJc09wZW4gPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgU2NvcGVkRWxlbWVudCBzY29wZWRFbGVtZW50KCBzdGQ6OnN0cmluZyBjb25zdCYgbmFtZSApIHsKKyAgICAgICAgICAgIFNjb3BlZEVsZW1lbnQgc2NvcGVkKCB0aGlzICk7CisgICAgICAgICAgICBzdGFydEVsZW1lbnQoIG5hbWUgKTsKKyAgICAgICAgICAgIHJldHVybiBzY29wZWQ7CisgICAgICAgIH0KKworICAgICAgICBYbWxXcml0ZXImIGVuZEVsZW1lbnQoKSB7CisgICAgICAgICAgICBuZXdsaW5lSWZOZWNlc3NhcnkoKTsKKyAgICAgICAgICAgIG1faW5kZW50ID0gbV9pbmRlbnQuc3Vic3RyKCAwLCBtX2luZGVudC5zaXplKCktMiApOworICAgICAgICAgICAgaWYoIG1fdGFnSXNPcGVuICkgeworICAgICAgICAgICAgICAgIG1fb3MgPDwgIi8+IjsKKyAgICAgICAgICAgICAgICBtX3RhZ0lzT3BlbiA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgbV9vcyA8PCBtX2luZGVudCA8PCAiPC8iIDw8IG1fdGFncy5iYWNrKCkgPDwgIj4iOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbV9vcyA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICBtX3RhZ3MucG9wX2JhY2soKTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIFhtbFdyaXRlciYgd3JpdGVBdHRyaWJ1dGUoIHN0ZDo6c3RyaW5nIGNvbnN0JiBuYW1lLCBzdGQ6OnN0cmluZyBjb25zdCYgYXR0cmlidXRlICkgeworICAgICAgICAgICAgaWYoICFuYW1lLmVtcHR5KCkgJiYgIWF0dHJpYnV0ZS5lbXB0eSgpICkKKyAgICAgICAgICAgICAgICBtX29zIDw8ICcgJyA8PCBuYW1lIDw8ICI9XCIiIDw8IFhtbEVuY29kZSggYXR0cmlidXRlLCBYbWxFbmNvZGU6OkZvckF0dHJpYnV0ZXMgKSA8PCAnIic7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICBYbWxXcml0ZXImIHdyaXRlQXR0cmlidXRlKCBzdGQ6OnN0cmluZyBjb25zdCYgbmFtZSwgYm9vbCBhdHRyaWJ1dGUgKSB7CisgICAgICAgICAgICBtX29zIDw8ICcgJyA8PCBuYW1lIDw8ICI9XCIiIDw8ICggYXR0cmlidXRlID8gInRydWUiIDogImZhbHNlIiApIDw8ICciJzsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgICAgIFhtbFdyaXRlciYgd3JpdGVBdHRyaWJ1dGUoIHN0ZDo6c3RyaW5nIGNvbnN0JiBuYW1lLCBUIGNvbnN0JiBhdHRyaWJ1dGUgKSB7CisgICAgICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICAgICAgICAgICAgb3NzIDw8IGF0dHJpYnV0ZTsKKyAgICAgICAgICAgIHJldHVybiB3cml0ZUF0dHJpYnV0ZSggbmFtZSwgb3NzLnN0cigpICk7CisgICAgICAgIH0KKworICAgICAgICBYbWxXcml0ZXImIHdyaXRlVGV4dCggc3RkOjpzdHJpbmcgY29uc3QmIHRleHQsIGJvb2wgaW5kZW50ID0gdHJ1ZSApIHsKKyAgICAgICAgICAgIGlmKCAhdGV4dC5lbXB0eSgpICl7CisgICAgICAgICAgICAgICAgYm9vbCB0YWdXYXNPcGVuID0gbV90YWdJc09wZW47CisgICAgICAgICAgICAgICAgZW5zdXJlVGFnQ2xvc2VkKCk7CisgICAgICAgICAgICAgICAgaWYoIHRhZ1dhc09wZW4gJiYgaW5kZW50ICkKKyAgICAgICAgICAgICAgICAgICAgbV9vcyA8PCBtX2luZGVudDsKKyAgICAgICAgICAgICAgICBtX29zIDw8IFhtbEVuY29kZSggdGV4dCApOworICAgICAgICAgICAgICAgIG1fbmVlZHNOZXdsaW5lID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIFhtbFdyaXRlciYgd3JpdGVDb21tZW50KCBzdGQ6OnN0cmluZyBjb25zdCYgdGV4dCApIHsKKyAgICAgICAgICAgIGVuc3VyZVRhZ0Nsb3NlZCgpOworICAgICAgICAgICAgbV9vcyA8PCBtX2luZGVudCA8PCAiPCEtLSIgPDwgdGV4dCA8PCAiLS0+IjsKKyAgICAgICAgICAgIG1fbmVlZHNOZXdsaW5lID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgd3JpdGVTdHlsZXNoZWV0UmVmKCBzdGQ6OnN0cmluZyBjb25zdCYgdXJsICkgeworICAgICAgICAgICAgbV9vcyA8PCAiPD94bWwtc3R5bGVzaGVldCB0eXBlPVwidGV4dC94c2xcIiBocmVmPVwiIiA8PCB1cmwgPDwgIlwiPz5cbiI7CisgICAgICAgIH0KKworICAgICAgICBYbWxXcml0ZXImIHdyaXRlQmxhbmtMaW5lKCkgeworICAgICAgICAgICAgZW5zdXJlVGFnQ2xvc2VkKCk7CisgICAgICAgICAgICBtX29zIDw8ICdcbic7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGVuc3VyZVRhZ0Nsb3NlZCgpIHsKKyAgICAgICAgICAgIGlmKCBtX3RhZ0lzT3BlbiApIHsKKyAgICAgICAgICAgICAgICBtX29zIDw8ICI+IiA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICAgICAgbV90YWdJc09wZW4gPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgWG1sV3JpdGVyKCBYbWxXcml0ZXIgY29uc3QmICk7CisgICAgICAgIHZvaWQgb3BlcmF0b3I9KCBYbWxXcml0ZXIgY29uc3QmICk7CisKKyAgICAgICAgdm9pZCB3cml0ZURlY2xhcmF0aW9uKCkgeworICAgICAgICAgICAgbV9vcyA8PCAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG4iOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBuZXdsaW5lSWZOZWNlc3NhcnkoKSB7CisgICAgICAgICAgICBpZiggbV9uZWVkc05ld2xpbmUgKSB7CisgICAgICAgICAgICAgICAgbV9vcyA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICAgICAgbV9uZWVkc05ld2xpbmUgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgbV90YWdJc09wZW47CisgICAgICAgIGJvb2wgbV9uZWVkc05ld2xpbmU7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBtX3RhZ3M7CisgICAgICAgIHN0ZDo6c3RyaW5nIG1faW5kZW50OworICAgICAgICBzdGQ6Om9zdHJlYW0mIG1fb3M7CisgICAgfTsKKworfQorLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3JlZW5hYmxlX3dhcm5pbmdzLmgKKworI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfUkVFTkFCTEVfV0FSTklOR1NfSF9JTkNMVURFRAorCisjaWZkZWYgX19jbGFuZ19fCisjICAgIGlmZGVmIF9fSUNDIC8vIGljcGMgZGVmaW5lcyB0aGUgX19jbGFuZ19fIG1hY3JvCisjICAgICAgICBwcmFnbWEgd2FybmluZyhwb3ApCisjICAgIGVsc2UKKyMgICAgICAgIHByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHBvcAorIyAgICBlbmRpZgorI2VsaWYgZGVmaW5lZCBfX0dOVUNfXworIyAgICBwcmFnbWEgR0NDIGRpYWdub3N0aWMgcG9wCisjZW5kaWYKKworCituYW1lc3BhY2UgQ2F0Y2ggeworICAgIGNsYXNzIFhtbFJlcG9ydGVyIDogcHVibGljIFN0cmVhbWluZ1JlcG9ydGVyQmFzZSB7CisgICAgcHVibGljOgorICAgICAgICBYbWxSZXBvcnRlciggUmVwb3J0ZXJDb25maWcgY29uc3QmIF9jb25maWcgKQorICAgICAgICA6ICAgU3RyZWFtaW5nUmVwb3J0ZXJCYXNlKCBfY29uZmlnICksCisgICAgICAgICAgICBtX3htbChfY29uZmlnLnN0cmVhbSgpKSwKKyAgICAgICAgICAgIG1fc2VjdGlvbkRlcHRoKCAwICkKKyAgICAgICAgeworICAgICAgICAgICAgbV9yZXBvcnRlclByZWZzLnNob3VsZFJlZGlyZWN0U3RkT3V0ID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgflhtbFJlcG9ydGVyKCkgQ0FUQ0hfT1ZFUlJJREU7CisKKyAgICAgICAgc3RhdGljIHN0ZDo6c3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuICJSZXBvcnRzIHRlc3QgcmVzdWx0cyBhcyBhbiBYTUwgZG9jdW1lbnQiOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXRTdHlsZXNoZWV0UmVmKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHdyaXRlU291cmNlSW5mbyggU291cmNlTGluZUluZm8gY29uc3QmIHNvdXJjZUluZm8gKSB7CisgICAgICAgICAgICBtX3htbAorICAgICAgICAgICAgICAgIC53cml0ZUF0dHJpYnV0ZSggImZpbGVuYW1lIiwgc291cmNlSW5mby5maWxlICkKKyAgICAgICAgICAgICAgICAud3JpdGVBdHRyaWJ1dGUoICJsaW5lIiwgc291cmNlSW5mby5saW5lICk7CisgICAgICAgIH0KKworICAgIHB1YmxpYzogLy8gU3RyZWFtaW5nUmVwb3J0ZXJCYXNlCisKKyAgICAgICAgdmlydHVhbCB2b2lkIG5vTWF0Y2hpbmdUZXN0Q2FzZXMoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgU3RyZWFtaW5nUmVwb3J0ZXJCYXNlOjpub01hdGNoaW5nVGVzdENhc2VzKCBzICk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdFJ1blN0YXJ0aW5nKCBUZXN0UnVuSW5mbyBjb25zdCYgdGVzdEluZm8gKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBTdHJlYW1pbmdSZXBvcnRlckJhc2U6OnRlc3RSdW5TdGFydGluZyggdGVzdEluZm8gKTsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHN0eWxlc2hlZXRSZWYgPSBnZXRTdHlsZXNoZWV0UmVmKCk7CisgICAgICAgICAgICBpZiggIXN0eWxlc2hlZXRSZWYuZW1wdHkoKSApCisgICAgICAgICAgICAgICAgbV94bWwud3JpdGVTdHlsZXNoZWV0UmVmKCBzdHlsZXNoZWV0UmVmICk7CisgICAgICAgICAgICBtX3htbC5zdGFydEVsZW1lbnQoICJDYXRjaCIgKTsKKyAgICAgICAgICAgIGlmKCAhbV9jb25maWctPm5hbWUoKS5lbXB0eSgpICkKKyAgICAgICAgICAgICAgICBtX3htbC53cml0ZUF0dHJpYnV0ZSggIm5hbWUiLCBtX2NvbmZpZy0+bmFtZSgpICk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdEdyb3VwU3RhcnRpbmcoIEdyb3VwSW5mbyBjb25zdCYgZ3JvdXBJbmZvICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgU3RyZWFtaW5nUmVwb3J0ZXJCYXNlOjp0ZXN0R3JvdXBTdGFydGluZyggZ3JvdXBJbmZvICk7CisgICAgICAgICAgICBtX3htbC5zdGFydEVsZW1lbnQoICJHcm91cCIgKQorICAgICAgICAgICAgICAgIC53cml0ZUF0dHJpYnV0ZSggIm5hbWUiLCBncm91cEluZm8ubmFtZSApOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RDYXNlU3RhcnRpbmcoIFRlc3RDYXNlSW5mbyBjb25zdCYgdGVzdEluZm8gKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBTdHJlYW1pbmdSZXBvcnRlckJhc2U6OnRlc3RDYXNlU3RhcnRpbmcodGVzdEluZm8pOworICAgICAgICAgICAgbV94bWwuc3RhcnRFbGVtZW50KCAiVGVzdENhc2UiICkKKyAgICAgICAgICAgICAgICAud3JpdGVBdHRyaWJ1dGUoICJuYW1lIiwgdHJpbSggdGVzdEluZm8ubmFtZSApICkKKyAgICAgICAgICAgICAgICAud3JpdGVBdHRyaWJ1dGUoICJkZXNjcmlwdGlvbiIsIHRlc3RJbmZvLmRlc2NyaXB0aW9uICkKKyAgICAgICAgICAgICAgICAud3JpdGVBdHRyaWJ1dGUoICJ0YWdzIiwgdGVzdEluZm8udGFnc0FzU3RyaW5nICk7CisKKyAgICAgICAgICAgIHdyaXRlU291cmNlSW5mbyggdGVzdEluZm8ubGluZUluZm8gKTsKKworICAgICAgICAgICAgaWYgKCBtX2NvbmZpZy0+c2hvd0R1cmF0aW9ucygpID09IFNob3dEdXJhdGlvbnM6OkFsd2F5cyApCisgICAgICAgICAgICAgICAgbV90ZXN0Q2FzZVRpbWVyLnN0YXJ0KCk7CisgICAgICAgICAgICBtX3htbC5lbnN1cmVUYWdDbG9zZWQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBzZWN0aW9uU3RhcnRpbmcoIFNlY3Rpb25JbmZvIGNvbnN0JiBzZWN0aW9uSW5mbyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIFN0cmVhbWluZ1JlcG9ydGVyQmFzZTo6c2VjdGlvblN0YXJ0aW5nKCBzZWN0aW9uSW5mbyApOworICAgICAgICAgICAgaWYoIG1fc2VjdGlvbkRlcHRoKysgPiAwICkgeworICAgICAgICAgICAgICAgIG1feG1sLnN0YXJ0RWxlbWVudCggIlNlY3Rpb24iICkKKyAgICAgICAgICAgICAgICAgICAgLndyaXRlQXR0cmlidXRlKCAibmFtZSIsIHRyaW0oIHNlY3Rpb25JbmZvLm5hbWUgKSApCisgICAgICAgICAgICAgICAgICAgIC53cml0ZUF0dHJpYnV0ZSggImRlc2NyaXB0aW9uIiwgc2VjdGlvbkluZm8uZGVzY3JpcHRpb24gKTsKKyAgICAgICAgICAgICAgICB3cml0ZVNvdXJjZUluZm8oIHNlY3Rpb25JbmZvLmxpbmVJbmZvICk7CisgICAgICAgICAgICAgICAgbV94bWwuZW5zdXJlVGFnQ2xvc2VkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgYXNzZXJ0aW9uU3RhcnRpbmcoIEFzc2VydGlvbkluZm8gY29uc3QmICkgQ0FUQ0hfT1ZFUlJJREUgeyB9CisKKyAgICAgICAgdmlydHVhbCBib29sIGFzc2VydGlvbkVuZGVkKCBBc3NlcnRpb25TdGF0cyBjb25zdCYgYXNzZXJ0aW9uU3RhdHMgKSBDQVRDSF9PVkVSUklERSB7CisKKyAgICAgICAgICAgIEFzc2VydGlvblJlc3VsdCBjb25zdCYgcmVzdWx0ID0gYXNzZXJ0aW9uU3RhdHMuYXNzZXJ0aW9uUmVzdWx0OworCisgICAgICAgICAgICBib29sIGluY2x1ZGVSZXN1bHRzID0gbV9jb25maWctPmluY2x1ZGVTdWNjZXNzZnVsUmVzdWx0cygpIHx8ICFyZXN1bHQuaXNPaygpOworCisgICAgICAgICAgICBpZiggaW5jbHVkZVJlc3VsdHMgKSB7CisgICAgICAgICAgICAgICAgLy8gUHJpbnQgYW55IGluZm8gbWVzc2FnZXMgaW4gPEluZm8+IHRhZ3MuCisgICAgICAgICAgICAgICAgZm9yKCBzdGQ6OnZlY3RvcjxNZXNzYWdlSW5mbz46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gYXNzZXJ0aW9uU3RhdHMuaW5mb01lc3NhZ2VzLmJlZ2luKCksIGl0RW5kID0gYXNzZXJ0aW9uU3RhdHMuaW5mb01lc3NhZ2VzLmVuZCgpOworICAgICAgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgICAgICArK2l0ICkgeworICAgICAgICAgICAgICAgICAgICBpZiggaXQtPnR5cGUgPT0gUmVzdWx0V2FzOjpJbmZvICkgeworICAgICAgICAgICAgICAgICAgICAgICAgbV94bWwuc2NvcGVkRWxlbWVudCggIkluZm8iICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndyaXRlVGV4dCggaXQtPm1lc3NhZ2UgKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICggaXQtPnR5cGUgPT0gUmVzdWx0V2FzOjpXYXJuaW5nICkgeworICAgICAgICAgICAgICAgICAgICAgICAgbV94bWwuc2NvcGVkRWxlbWVudCggIldhcm5pbmciICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndyaXRlVGV4dCggaXQtPm1lc3NhZ2UgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gRHJvcCBvdXQgaWYgcmVzdWx0IHdhcyBzdWNjZXNzZnVsIGJ1dCB3ZSdyZSBub3QgcHJpbnRpbmcgdGhlbS4KKyAgICAgICAgICAgIGlmKCAhaW5jbHVkZVJlc3VsdHMgJiYgcmVzdWx0LmdldFJlc3VsdFR5cGUoKSAhPSBSZXN1bHRXYXM6Oldhcm5pbmcgKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgICAgICAvLyBQcmludCB0aGUgZXhwcmVzc2lvbiBpZiB0aGVyZSBpcyBvbmUuCisgICAgICAgICAgICBpZiggcmVzdWx0Lmhhc0V4cHJlc3Npb24oKSApIHsKKyAgICAgICAgICAgICAgICBtX3htbC5zdGFydEVsZW1lbnQoICJFeHByZXNzaW9uIiApCisgICAgICAgICAgICAgICAgICAgIC53cml0ZUF0dHJpYnV0ZSggInN1Y2Nlc3MiLCByZXN1bHQuc3VjY2VlZGVkKCkgKQorICAgICAgICAgICAgICAgICAgICAud3JpdGVBdHRyaWJ1dGUoICJ0eXBlIiwgcmVzdWx0LmdldFRlc3RNYWNyb05hbWUoKSApOworCisgICAgICAgICAgICAgICAgd3JpdGVTb3VyY2VJbmZvKCByZXN1bHQuZ2V0U291cmNlSW5mbygpICk7CisKKyAgICAgICAgICAgICAgICBtX3htbC5zY29wZWRFbGVtZW50KCAiT3JpZ2luYWwiICkKKyAgICAgICAgICAgICAgICAgICAgLndyaXRlVGV4dCggcmVzdWx0LmdldEV4cHJlc3Npb24oKSApOworICAgICAgICAgICAgICAgIG1feG1sLnNjb3BlZEVsZW1lbnQoICJFeHBhbmRlZCIgKQorICAgICAgICAgICAgICAgICAgICAud3JpdGVUZXh0KCByZXN1bHQuZ2V0RXhwYW5kZWRFeHByZXNzaW9uKCkgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQW5kLi4uIFByaW50IGEgcmVzdWx0IGFwcGxpY2FibGUgdG8gZWFjaCByZXN1bHQgdHlwZS4KKyAgICAgICAgICAgIHN3aXRjaCggcmVzdWx0LmdldFJlc3VsdFR5cGUoKSApIHsKKyAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6VGhyZXdFeGNlcHRpb246CisgICAgICAgICAgICAgICAgICAgIG1feG1sLnN0YXJ0RWxlbWVudCggIkV4Y2VwdGlvbiIgKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVTb3VyY2VJbmZvKCByZXN1bHQuZ2V0U291cmNlSW5mbygpICk7CisgICAgICAgICAgICAgICAgICAgIG1feG1sLndyaXRlVGV4dCggcmVzdWx0LmdldE1lc3NhZ2UoKSApOworICAgICAgICAgICAgICAgICAgICBtX3htbC5lbmRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpGYXRhbEVycm9yQ29uZGl0aW9uOgorICAgICAgICAgICAgICAgICAgICBtX3htbC5zdGFydEVsZW1lbnQoICJGYXRhbEVycm9yQ29uZGl0aW9uIiApOworICAgICAgICAgICAgICAgICAgICB3cml0ZVNvdXJjZUluZm8oIHJlc3VsdC5nZXRTb3VyY2VJbmZvKCkgKTsKKyAgICAgICAgICAgICAgICAgICAgbV94bWwud3JpdGVUZXh0KCByZXN1bHQuZ2V0TWVzc2FnZSgpICk7CisgICAgICAgICAgICAgICAgICAgIG1feG1sLmVuZEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OkluZm86CisgICAgICAgICAgICAgICAgICAgIG1feG1sLnNjb3BlZEVsZW1lbnQoICJJbmZvIiApCisgICAgICAgICAgICAgICAgICAgICAgICAud3JpdGVUZXh0KCByZXN1bHQuZ2V0TWVzc2FnZSgpICk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpXYXJuaW5nOgorICAgICAgICAgICAgICAgICAgICAvLyBXYXJuaW5nIHdpbGwgYWxyZWFkeSBoYXZlIGJlZW4gd3JpdHRlbgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6RXhwbGljaXRGYWlsdXJlOgorICAgICAgICAgICAgICAgICAgICBtX3htbC5zdGFydEVsZW1lbnQoICJGYWlsdXJlIiApOworICAgICAgICAgICAgICAgICAgICB3cml0ZVNvdXJjZUluZm8oIHJlc3VsdC5nZXRTb3VyY2VJbmZvKCkgKTsKKyAgICAgICAgICAgICAgICAgICAgbV94bWwud3JpdGVUZXh0KCByZXN1bHQuZ2V0TWVzc2FnZSgpICk7CisgICAgICAgICAgICAgICAgICAgIG1feG1sLmVuZEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKCByZXN1bHQuaGFzRXhwcmVzc2lvbigpICkKKyAgICAgICAgICAgICAgICBtX3htbC5lbmRFbGVtZW50KCk7CisKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHNlY3Rpb25FbmRlZCggU2VjdGlvblN0YXRzIGNvbnN0JiBzZWN0aW9uU3RhdHMgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBTdHJlYW1pbmdSZXBvcnRlckJhc2U6OnNlY3Rpb25FbmRlZCggc2VjdGlvblN0YXRzICk7CisgICAgICAgICAgICBpZiggLS1tX3NlY3Rpb25EZXB0aCA+IDAgKSB7CisgICAgICAgICAgICAgICAgWG1sV3JpdGVyOjpTY29wZWRFbGVtZW50IGUgPSBtX3htbC5zY29wZWRFbGVtZW50KCAiT3ZlcmFsbFJlc3VsdHMiICk7CisgICAgICAgICAgICAgICAgZS53cml0ZUF0dHJpYnV0ZSggInN1Y2Nlc3NlcyIsIHNlY3Rpb25TdGF0cy5hc3NlcnRpb25zLnBhc3NlZCApOworICAgICAgICAgICAgICAgIGUud3JpdGVBdHRyaWJ1dGUoICJmYWlsdXJlcyIsIHNlY3Rpb25TdGF0cy5hc3NlcnRpb25zLmZhaWxlZCApOworICAgICAgICAgICAgICAgIGUud3JpdGVBdHRyaWJ1dGUoICJleHBlY3RlZEZhaWx1cmVzIiwgc2VjdGlvblN0YXRzLmFzc2VydGlvbnMuZmFpbGVkQnV0T2sgKTsKKworICAgICAgICAgICAgICAgIGlmICggbV9jb25maWctPnNob3dEdXJhdGlvbnMoKSA9PSBTaG93RHVyYXRpb25zOjpBbHdheXMgKQorICAgICAgICAgICAgICAgICAgICBlLndyaXRlQXR0cmlidXRlKCAiZHVyYXRpb25JblNlY29uZHMiLCBzZWN0aW9uU3RhdHMuZHVyYXRpb25JblNlY29uZHMgKTsKKworICAgICAgICAgICAgICAgIG1feG1sLmVuZEVsZW1lbnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0Q2FzZUVuZGVkKCBUZXN0Q2FzZVN0YXRzIGNvbnN0JiB0ZXN0Q2FzZVN0YXRzICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgU3RyZWFtaW5nUmVwb3J0ZXJCYXNlOjp0ZXN0Q2FzZUVuZGVkKCB0ZXN0Q2FzZVN0YXRzICk7CisgICAgICAgICAgICBYbWxXcml0ZXI6OlNjb3BlZEVsZW1lbnQgZSA9IG1feG1sLnNjb3BlZEVsZW1lbnQoICJPdmVyYWxsUmVzdWx0IiApOworICAgICAgICAgICAgZS53cml0ZUF0dHJpYnV0ZSggInN1Y2Nlc3MiLCB0ZXN0Q2FzZVN0YXRzLnRvdGFscy5hc3NlcnRpb25zLmFsbE9rKCkgKTsKKworICAgICAgICAgICAgaWYgKCBtX2NvbmZpZy0+c2hvd0R1cmF0aW9ucygpID09IFNob3dEdXJhdGlvbnM6OkFsd2F5cyApCisgICAgICAgICAgICAgICAgZS53cml0ZUF0dHJpYnV0ZSggImR1cmF0aW9uSW5TZWNvbmRzIiwgbV90ZXN0Q2FzZVRpbWVyLmdldEVsYXBzZWRTZWNvbmRzKCkgKTsKKworICAgICAgICAgICAgaWYoICF0ZXN0Q2FzZVN0YXRzLnN0ZE91dC5lbXB0eSgpICkKKyAgICAgICAgICAgICAgICBtX3htbC5zY29wZWRFbGVtZW50KCAiU3RkT3V0IiApLndyaXRlVGV4dCggdHJpbSggdGVzdENhc2VTdGF0cy5zdGRPdXQgKSwgZmFsc2UgKTsKKyAgICAgICAgICAgIGlmKCAhdGVzdENhc2VTdGF0cy5zdGRFcnIuZW1wdHkoKSApCisgICAgICAgICAgICAgICAgbV94bWwuc2NvcGVkRWxlbWVudCggIlN0ZEVyciIgKS53cml0ZVRleHQoIHRyaW0oIHRlc3RDYXNlU3RhdHMuc3RkRXJyICksIGZhbHNlICk7CisKKyAgICAgICAgICAgIG1feG1sLmVuZEVsZW1lbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0R3JvdXBFbmRlZCggVGVzdEdyb3VwU3RhdHMgY29uc3QmIHRlc3RHcm91cFN0YXRzICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgU3RyZWFtaW5nUmVwb3J0ZXJCYXNlOjp0ZXN0R3JvdXBFbmRlZCggdGVzdEdyb3VwU3RhdHMgKTsKKyAgICAgICAgICAgIC8vIFRPRE86IENoZWNrIHRlc3RHcm91cFN0YXRzLmFib3J0aW5nIGFuZCBhY3QgYWNjb3JkaW5nbHkuCisgICAgICAgICAgICBtX3htbC5zY29wZWRFbGVtZW50KCAiT3ZlcmFsbFJlc3VsdHMiICkKKyAgICAgICAgICAgICAgICAud3JpdGVBdHRyaWJ1dGUoICJzdWNjZXNzZXMiLCB0ZXN0R3JvdXBTdGF0cy50b3RhbHMuYXNzZXJ0aW9ucy5wYXNzZWQgKQorICAgICAgICAgICAgICAgIC53cml0ZUF0dHJpYnV0ZSggImZhaWx1cmVzIiwgdGVzdEdyb3VwU3RhdHMudG90YWxzLmFzc2VydGlvbnMuZmFpbGVkICkKKyAgICAgICAgICAgICAgICAud3JpdGVBdHRyaWJ1dGUoICJleHBlY3RlZEZhaWx1cmVzIiwgdGVzdEdyb3VwU3RhdHMudG90YWxzLmFzc2VydGlvbnMuZmFpbGVkQnV0T2sgKTsKKyAgICAgICAgICAgIG1feG1sLmVuZEVsZW1lbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0UnVuRW5kZWQoIFRlc3RSdW5TdGF0cyBjb25zdCYgdGVzdFJ1blN0YXRzICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgU3RyZWFtaW5nUmVwb3J0ZXJCYXNlOjp0ZXN0UnVuRW5kZWQoIHRlc3RSdW5TdGF0cyApOworICAgICAgICAgICAgbV94bWwuc2NvcGVkRWxlbWVudCggIk92ZXJhbGxSZXN1bHRzIiApCisgICAgICAgICAgICAgICAgLndyaXRlQXR0cmlidXRlKCAic3VjY2Vzc2VzIiwgdGVzdFJ1blN0YXRzLnRvdGFscy5hc3NlcnRpb25zLnBhc3NlZCApCisgICAgICAgICAgICAgICAgLndyaXRlQXR0cmlidXRlKCAiZmFpbHVyZXMiLCB0ZXN0UnVuU3RhdHMudG90YWxzLmFzc2VydGlvbnMuZmFpbGVkICkKKyAgICAgICAgICAgICAgICAud3JpdGVBdHRyaWJ1dGUoICJleHBlY3RlZEZhaWx1cmVzIiwgdGVzdFJ1blN0YXRzLnRvdGFscy5hc3NlcnRpb25zLmZhaWxlZEJ1dE9rICk7CisgICAgICAgICAgICBtX3htbC5lbmRFbGVtZW50KCk7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIFRpbWVyIG1fdGVzdENhc2VUaW1lcjsKKyAgICAgICAgWG1sV3JpdGVyIG1feG1sOworICAgICAgICBpbnQgbV9zZWN0aW9uRGVwdGg7CisgICAgfTsKKworICAgICBJTlRFUk5BTF9DQVRDSF9SRUdJU1RFUl9SRVBPUlRFUiggInhtbCIsIFhtbFJlcG9ydGVyICkKKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiAuLi9yZXBvcnRlcnMvY2F0Y2hfcmVwb3J0ZXJfanVuaXQuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9SRVBPUlRFUl9KVU5JVF9IUFBfSU5DTFVERUQKKworI2luY2x1ZGUgPGFzc2VydC5oPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgbmFtZXNwYWNlIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgZ2V0Q3VycmVudFRpbWVzdGFtcCgpIHsKKyAgICAgICAgICAgIC8vIEJld2FyZSwgdGhpcyBpcyBub3QgcmVlbnRyYW50IGJlY2F1c2Ugb2YgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBpc3N1ZXMKKyAgICAgICAgICAgIC8vIEFsc28sIFVUQyBvbmx5LCBhZ2FpbiBiZWNhdXNlIG9mIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgKCV6IGlzIEMrKzExKQorICAgICAgICAgICAgdGltZV90IHJhd3RpbWU7CisgICAgICAgICAgICBzdGQ6OnRpbWUoJnJhd3RpbWUpOworICAgICAgICAgICAgY29uc3Qgc2l6ZV90IHRpbWVTdGFtcFNpemUgPSBzaXplb2YoIjIwMTctMDEtMTZUMTc6MDY6NDVaIik7CisKKyNpZmRlZiBfTVNDX1ZFUgorICAgICAgICAgICAgc3RkOjp0bSB0aW1lSW5mbyA9IHt9OworICAgICAgICAgICAgZ210aW1lX3MoJnRpbWVJbmZvLCAmcmF3dGltZSk7CisjZWxzZQorICAgICAgICAgICAgc3RkOjp0bSogdGltZUluZm87CisgICAgICAgICAgICB0aW1lSW5mbyA9IHN0ZDo6Z210aW1lKCZyYXd0aW1lKTsKKyNlbmRpZgorCisgICAgICAgICAgICBjaGFyIHRpbWVTdGFtcFt0aW1lU3RhbXBTaXplXTsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBjb25zdCBmbXQgPSAiJVktJW0tJWRUJUg6JU06JVNaIjsKKworI2lmZGVmIF9NU0NfVkVSCisgICAgICAgICAgICBzdGQ6OnN0cmZ0aW1lKHRpbWVTdGFtcCwgdGltZVN0YW1wU2l6ZSwgZm10LCAmdGltZUluZm8pOworI2Vsc2UKKyAgICAgICAgICAgIHN0ZDo6c3RyZnRpbWUodGltZVN0YW1wLCB0aW1lU3RhbXBTaXplLCBmbXQsIHRpbWVJbmZvKTsKKyNlbmRpZgorICAgICAgICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKHRpbWVTdGFtcCk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIGNsYXNzIEp1bml0UmVwb3J0ZXIgOiBwdWJsaWMgQ3VtdWxhdGl2ZVJlcG9ydGVyQmFzZSB7CisgICAgcHVibGljOgorICAgICAgICBKdW5pdFJlcG9ydGVyKCBSZXBvcnRlckNvbmZpZyBjb25zdCYgX2NvbmZpZyApCisgICAgICAgIDogICBDdW11bGF0aXZlUmVwb3J0ZXJCYXNlKCBfY29uZmlnICksCisgICAgICAgICAgICB4bWwoIF9jb25maWcuc3RyZWFtKCkgKSwKKyAgICAgICAgICAgIG1fb2tUb0ZhaWwoIGZhbHNlICkKKyAgICAgICAgeworICAgICAgICAgICAgbV9yZXBvcnRlclByZWZzLnNob3VsZFJlZGlyZWN0U3RkT3V0ID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgfkp1bml0UmVwb3J0ZXIoKSBDQVRDSF9PVkVSUklERTsKKworICAgICAgICBzdGF0aWMgc3RkOjpzdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisgICAgICAgICAgICByZXR1cm4gIlJlcG9ydHMgdGVzdCByZXN1bHRzIGluIGFuIFhNTCBmb3JtYXQgdGhhdCBsb29rcyBsaWtlIEFudCdzIGp1bml0cmVwb3J0IHRhcmdldCI7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgbm9NYXRjaGluZ1Rlc3RDYXNlcyggc3RkOjpzdHJpbmcgY29uc3QmIC8qc3BlYyovICkgQ0FUQ0hfT1ZFUlJJREUge30KKworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdFJ1blN0YXJ0aW5nKCBUZXN0UnVuSW5mbyBjb25zdCYgcnVuSW5mbyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIEN1bXVsYXRpdmVSZXBvcnRlckJhc2U6OnRlc3RSdW5TdGFydGluZyggcnVuSW5mbyApOworICAgICAgICAgICAgeG1sLnN0YXJ0RWxlbWVudCggInRlc3RzdWl0ZXMiICk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdEdyb3VwU3RhcnRpbmcoIEdyb3VwSW5mbyBjb25zdCYgZ3JvdXBJbmZvICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgc3VpdGVUaW1lci5zdGFydCgpOworICAgICAgICAgICAgc3RkT3V0Rm9yU3VpdGUuc3RyKCIiKTsKKyAgICAgICAgICAgIHN0ZEVyckZvclN1aXRlLnN0cigiIik7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9ucyA9IDA7CisgICAgICAgICAgICBDdW11bGF0aXZlUmVwb3J0ZXJCYXNlOjp0ZXN0R3JvdXBTdGFydGluZyggZ3JvdXBJbmZvICk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdENhc2VTdGFydGluZyggVGVzdENhc2VJbmZvIGNvbnN0JiB0ZXN0Q2FzZUluZm8gKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBtX29rVG9GYWlsID0gdGVzdENhc2VJbmZvLm9rVG9GYWlsKCk7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCBib29sIGFzc2VydGlvbkVuZGVkKCBBc3NlcnRpb25TdGF0cyBjb25zdCYgYXNzZXJ0aW9uU3RhdHMgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBpZiggYXNzZXJ0aW9uU3RhdHMuYXNzZXJ0aW9uUmVzdWx0LmdldFJlc3VsdFR5cGUoKSA9PSBSZXN1bHRXYXM6OlRocmV3RXhjZXB0aW9uICYmICFtX29rVG9GYWlsICkKKyAgICAgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9ucysrOworICAgICAgICAgICAgcmV0dXJuIEN1bXVsYXRpdmVSZXBvcnRlckJhc2U6OmFzc2VydGlvbkVuZGVkKCBhc3NlcnRpb25TdGF0cyApOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RDYXNlRW5kZWQoIFRlc3RDYXNlU3RhdHMgY29uc3QmIHRlc3RDYXNlU3RhdHMgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBzdGRPdXRGb3JTdWl0ZSA8PCB0ZXN0Q2FzZVN0YXRzLnN0ZE91dDsKKyAgICAgICAgICAgIHN0ZEVyckZvclN1aXRlIDw8IHRlc3RDYXNlU3RhdHMuc3RkRXJyOworICAgICAgICAgICAgQ3VtdWxhdGl2ZVJlcG9ydGVyQmFzZTo6dGVzdENhc2VFbmRlZCggdGVzdENhc2VTdGF0cyApOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RHcm91cEVuZGVkKCBUZXN0R3JvdXBTdGF0cyBjb25zdCYgdGVzdEdyb3VwU3RhdHMgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBkb3VibGUgc3VpdGVUaW1lID0gc3VpdGVUaW1lci5nZXRFbGFwc2VkU2Vjb25kcygpOworICAgICAgICAgICAgQ3VtdWxhdGl2ZVJlcG9ydGVyQmFzZTo6dGVzdEdyb3VwRW5kZWQoIHRlc3RHcm91cFN0YXRzICk7CisgICAgICAgICAgICB3cml0ZUdyb3VwKCAqbV90ZXN0R3JvdXBzLmJhY2soKSwgc3VpdGVUaW1lICk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdFJ1bkVuZGVkQ3VtdWxhdGl2ZSgpIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIHhtbC5lbmRFbGVtZW50KCk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHdyaXRlR3JvdXAoIFRlc3RHcm91cE5vZGUgY29uc3QmIGdyb3VwTm9kZSwgZG91YmxlIHN1aXRlVGltZSApIHsKKyAgICAgICAgICAgIFhtbFdyaXRlcjo6U2NvcGVkRWxlbWVudCBlID0geG1sLnNjb3BlZEVsZW1lbnQoICJ0ZXN0c3VpdGUiICk7CisgICAgICAgICAgICBUZXN0R3JvdXBTdGF0cyBjb25zdCYgc3RhdHMgPSBncm91cE5vZGUudmFsdWU7CisgICAgICAgICAgICB4bWwud3JpdGVBdHRyaWJ1dGUoICJuYW1lIiwgc3RhdHMuZ3JvdXBJbmZvLm5hbWUgKTsKKyAgICAgICAgICAgIHhtbC53cml0ZUF0dHJpYnV0ZSggImVycm9ycyIsIHVuZXhwZWN0ZWRFeGNlcHRpb25zICk7CisgICAgICAgICAgICB4bWwud3JpdGVBdHRyaWJ1dGUoICJmYWlsdXJlcyIsIHN0YXRzLnRvdGFscy5hc3NlcnRpb25zLmZhaWxlZC11bmV4cGVjdGVkRXhjZXB0aW9ucyApOworICAgICAgICAgICAgeG1sLndyaXRlQXR0cmlidXRlKCAidGVzdHMiLCBzdGF0cy50b3RhbHMuYXNzZXJ0aW9ucy50b3RhbCgpICk7CisgICAgICAgICAgICB4bWwud3JpdGVBdHRyaWJ1dGUoICJob3N0bmFtZSIsICJ0YmQiICk7IC8vICFUQkQKKyAgICAgICAgICAgIGlmKCBtX2NvbmZpZy0+c2hvd0R1cmF0aW9ucygpID09IFNob3dEdXJhdGlvbnM6Ok5ldmVyICkKKyAgICAgICAgICAgICAgICB4bWwud3JpdGVBdHRyaWJ1dGUoICJ0aW1lIiwgIiIgKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB4bWwud3JpdGVBdHRyaWJ1dGUoICJ0aW1lIiwgc3VpdGVUaW1lICk7CisgICAgICAgICAgICB4bWwud3JpdGVBdHRyaWJ1dGUoICJ0aW1lc3RhbXAiLCBnZXRDdXJyZW50VGltZXN0YW1wKCkgKTsKKworICAgICAgICAgICAgLy8gV3JpdGUgdGVzdCBjYXNlcworICAgICAgICAgICAgZm9yKCBUZXN0R3JvdXBOb2RlOjpDaGlsZE5vZGVzOjpjb25zdF9pdGVyYXRvcgorICAgICAgICAgICAgICAgICAgICBpdCA9IGdyb3VwTm9kZS5jaGlsZHJlbi5iZWdpbigpLCBpdEVuZCA9IGdyb3VwTm9kZS5jaGlsZHJlbi5lbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgICAgICsraXQgKQorICAgICAgICAgICAgICAgIHdyaXRlVGVzdENhc2UoICoqaXQgKTsKKworICAgICAgICAgICAgeG1sLnNjb3BlZEVsZW1lbnQoICJzeXN0ZW0tb3V0IiApLndyaXRlVGV4dCggdHJpbSggc3RkT3V0Rm9yU3VpdGUuc3RyKCkgKSwgZmFsc2UgKTsKKyAgICAgICAgICAgIHhtbC5zY29wZWRFbGVtZW50KCAic3lzdGVtLWVyciIgKS53cml0ZVRleHQoIHRyaW0oIHN0ZEVyckZvclN1aXRlLnN0cigpICksIGZhbHNlICk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHdyaXRlVGVzdENhc2UoIFRlc3RDYXNlTm9kZSBjb25zdCYgdGVzdENhc2VOb2RlICkgeworICAgICAgICAgICAgVGVzdENhc2VTdGF0cyBjb25zdCYgc3RhdHMgPSB0ZXN0Q2FzZU5vZGUudmFsdWU7CisKKyAgICAgICAgICAgIC8vIEFsbCB0ZXN0IGNhc2VzIGhhdmUgZXhhY3RseSBvbmUgc2VjdGlvbiAtIHdoaWNoIHJlcHJlc2VudHMgdGhlCisgICAgICAgICAgICAvLyB0ZXN0IGNhc2UgaXRzZWxmLiBUaGF0IHNlY3Rpb24gbWF5IGhhdmUgMC1uIG5lc3RlZCBzZWN0aW9ucworICAgICAgICAgICAgYXNzZXJ0KCB0ZXN0Q2FzZU5vZGUuY2hpbGRyZW4uc2l6ZSgpID09IDEgKTsKKyAgICAgICAgICAgIFNlY3Rpb25Ob2RlIGNvbnN0JiByb290U2VjdGlvbiA9ICp0ZXN0Q2FzZU5vZGUuY2hpbGRyZW4uZnJvbnQoKTsKKworICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2xhc3NOYW1lID0gc3RhdHMudGVzdEluZm8uY2xhc3NOYW1lOworCisgICAgICAgICAgICBpZiggY2xhc3NOYW1lLmVtcHR5KCkgKSB7CisgICAgICAgICAgICAgICAgaWYoIHJvb3RTZWN0aW9uLmNoaWxkU2VjdGlvbnMuZW1wdHkoKSApCisgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9ICJnbG9iYWwiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd3JpdGVTZWN0aW9uKCBjbGFzc05hbWUsICIiLCByb290U2VjdGlvbiApOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCB3cml0ZVNlY3Rpb24oICBzdGQ6OnN0cmluZyBjb25zdCYgY2xhc3NOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiByb290TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWN0aW9uTm9kZSBjb25zdCYgc2VjdGlvbk5vZGUgKSB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lID0gdHJpbSggc2VjdGlvbk5vZGUuc3RhdHMuc2VjdGlvbkluZm8ubmFtZSApOworICAgICAgICAgICAgaWYoICFyb290TmFtZS5lbXB0eSgpICkKKyAgICAgICAgICAgICAgICBuYW1lID0gcm9vdE5hbWUgKyAnLycgKyBuYW1lOworCisgICAgICAgICAgICBpZiggIXNlY3Rpb25Ob2RlLmFzc2VydGlvbnMuZW1wdHkoKSB8fAorICAgICAgICAgICAgICAgICFzZWN0aW9uTm9kZS5zdGRPdXQuZW1wdHkoKSB8fAorICAgICAgICAgICAgICAgICFzZWN0aW9uTm9kZS5zdGRFcnIuZW1wdHkoKSApIHsKKyAgICAgICAgICAgICAgICBYbWxXcml0ZXI6OlNjb3BlZEVsZW1lbnQgZSA9IHhtbC5zY29wZWRFbGVtZW50KCAidGVzdGNhc2UiICk7CisgICAgICAgICAgICAgICAgaWYoIGNsYXNzTmFtZS5lbXB0eSgpICkgeworICAgICAgICAgICAgICAgICAgICB4bWwud3JpdGVBdHRyaWJ1dGUoICJjbGFzc25hbWUiLCBuYW1lICk7CisgICAgICAgICAgICAgICAgICAgIHhtbC53cml0ZUF0dHJpYnV0ZSggIm5hbWUiLCAicm9vdCIgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHhtbC53cml0ZUF0dHJpYnV0ZSggImNsYXNzbmFtZSIsIGNsYXNzTmFtZSApOworICAgICAgICAgICAgICAgICAgICB4bWwud3JpdGVBdHRyaWJ1dGUoICJuYW1lIiwgbmFtZSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB4bWwud3JpdGVBdHRyaWJ1dGUoICJ0aW1lIiwgQ2F0Y2g6OnRvU3RyaW5nKCBzZWN0aW9uTm9kZS5zdGF0cy5kdXJhdGlvbkluU2Vjb25kcyApICk7CisKKyAgICAgICAgICAgICAgICB3cml0ZUFzc2VydGlvbnMoIHNlY3Rpb25Ob2RlICk7CisKKyAgICAgICAgICAgICAgICBpZiggIXNlY3Rpb25Ob2RlLnN0ZE91dC5lbXB0eSgpICkKKyAgICAgICAgICAgICAgICAgICAgeG1sLnNjb3BlZEVsZW1lbnQoICJzeXN0ZW0tb3V0IiApLndyaXRlVGV4dCggdHJpbSggc2VjdGlvbk5vZGUuc3RkT3V0ICksIGZhbHNlICk7CisgICAgICAgICAgICAgICAgaWYoICFzZWN0aW9uTm9kZS5zdGRFcnIuZW1wdHkoKSApCisgICAgICAgICAgICAgICAgICAgIHhtbC5zY29wZWRFbGVtZW50KCAic3lzdGVtLWVyciIgKS53cml0ZVRleHQoIHRyaW0oIHNlY3Rpb25Ob2RlLnN0ZEVyciApLCBmYWxzZSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yKCBTZWN0aW9uTm9kZTo6Q2hpbGRTZWN0aW9uczo6Y29uc3RfaXRlcmF0b3IKKyAgICAgICAgICAgICAgICAgICAgaXQgPSBzZWN0aW9uTm9kZS5jaGlsZFNlY3Rpb25zLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgIGl0RW5kID0gc2VjdGlvbk5vZGUuY2hpbGRTZWN0aW9ucy5lbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgICAgICsraXQgKQorICAgICAgICAgICAgICAgIGlmKCBjbGFzc05hbWUuZW1wdHkoKSApCisgICAgICAgICAgICAgICAgICAgIHdyaXRlU2VjdGlvbiggbmFtZSwgIiIsICoqaXQgKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHdyaXRlU2VjdGlvbiggY2xhc3NOYW1lLCBuYW1lLCAqKml0ICk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHdyaXRlQXNzZXJ0aW9ucyggU2VjdGlvbk5vZGUgY29uc3QmIHNlY3Rpb25Ob2RlICkgeworICAgICAgICAgICAgZm9yKCBTZWN0aW9uTm9kZTo6QXNzZXJ0aW9uczo6Y29uc3RfaXRlcmF0b3IKKyAgICAgICAgICAgICAgICAgICAgaXQgPSBzZWN0aW9uTm9kZS5hc3NlcnRpb25zLmJlZ2luKCksIGl0RW5kID0gc2VjdGlvbk5vZGUuYXNzZXJ0aW9ucy5lbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgICAgICsraXQgKQorICAgICAgICAgICAgICAgIHdyaXRlQXNzZXJ0aW9uKCAqaXQgKTsKKyAgICAgICAgfQorICAgICAgICB2b2lkIHdyaXRlQXNzZXJ0aW9uKCBBc3NlcnRpb25TdGF0cyBjb25zdCYgc3RhdHMgKSB7CisgICAgICAgICAgICBBc3NlcnRpb25SZXN1bHQgY29uc3QmIHJlc3VsdCA9IHN0YXRzLmFzc2VydGlvblJlc3VsdDsKKyAgICAgICAgICAgIGlmKCAhcmVzdWx0LmlzT2soKSApIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBlbGVtZW50TmFtZTsKKyAgICAgICAgICAgICAgICBzd2l0Y2goIHJlc3VsdC5nZXRSZXN1bHRUeXBlKCkgKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpUaHJld0V4Y2VwdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OkZhdGFsRXJyb3JDb25kaXRpb246CisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TmFtZSA9ICJlcnJvciI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OkV4cGxpY2l0RmFpbHVyZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnROYW1lID0gImZhaWx1cmUiOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpFeHByZXNzaW9uRmFpbGVkOgorICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudE5hbWUgPSAiZmFpbHVyZSI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OkRpZG50VGhyb3dFeGNlcHRpb246CisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TmFtZSA9ICJmYWlsdXJlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIC8vIFdlIHNob3VsZCBuZXZlciBzZWUgdGhlc2UgaGVyZToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OkluZm86CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpXYXJuaW5nOgorICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6T2s6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpVbmtub3duOgorICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6RmFpbHVyZUJpdDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OkV4Y2VwdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnROYW1lID0gImludGVybmFsRXJyb3IiOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgWG1sV3JpdGVyOjpTY29wZWRFbGVtZW50IGUgPSB4bWwuc2NvcGVkRWxlbWVudCggZWxlbWVudE5hbWUgKTsKKworICAgICAgICAgICAgICAgIHhtbC53cml0ZUF0dHJpYnV0ZSggIm1lc3NhZ2UiLCByZXN1bHQuZ2V0RXhwYW5kZWRFeHByZXNzaW9uKCkgKTsKKyAgICAgICAgICAgICAgICB4bWwud3JpdGVBdHRyaWJ1dGUoICJ0eXBlIiwgcmVzdWx0LmdldFRlc3RNYWNyb05hbWUoKSApOworCisgICAgICAgICAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICAgICAgICAgICAgICBpZiggIXJlc3VsdC5nZXRNZXNzYWdlKCkuZW1wdHkoKSApCisgICAgICAgICAgICAgICAgICAgIG9zcyA8PCByZXN1bHQuZ2V0TWVzc2FnZSgpIDw8ICdcbic7CisgICAgICAgICAgICAgICAgZm9yKCBzdGQ6OnZlY3RvcjxNZXNzYWdlSW5mbz46OmNvbnN0X2l0ZXJhdG9yCisgICAgICAgICAgICAgICAgICAgICAgICBpdCA9IHN0YXRzLmluZm9NZXNzYWdlcy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgaXRFbmQgPSBzdGF0cy5pbmZvTWVzc2FnZXMuZW5kKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytpdCApCisgICAgICAgICAgICAgICAgICAgIGlmKCBpdC0+dHlwZSA9PSBSZXN1bHRXYXM6OkluZm8gKQorICAgICAgICAgICAgICAgICAgICAgICAgb3NzIDw8IGl0LT5tZXNzYWdlIDw8ICdcbic7CisKKyAgICAgICAgICAgICAgICBvc3MgPDwgImF0ICIgPDwgcmVzdWx0LmdldFNvdXJjZUluZm8oKTsKKyAgICAgICAgICAgICAgICB4bWwud3JpdGVUZXh0KCBvc3Muc3RyKCksIGZhbHNlICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBYbWxXcml0ZXIgeG1sOworICAgICAgICBUaW1lciBzdWl0ZVRpbWVyOworICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gc3RkT3V0Rm9yU3VpdGU7CisgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzdGRFcnJGb3JTdWl0ZTsKKyAgICAgICAgdW5zaWduZWQgaW50IHVuZXhwZWN0ZWRFeGNlcHRpb25zOworICAgICAgICBib29sIG1fb2tUb0ZhaWw7CisgICAgfTsKKworICAgIElOVEVSTkFMX0NBVENIX1JFR0lTVEVSX1JFUE9SVEVSKCAianVuaXQiLCBKdW5pdFJlcG9ydGVyICkKKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiAuLi9yZXBvcnRlcnMvY2F0Y2hfcmVwb3J0ZXJfY29uc29sZS5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1JFUE9SVEVSX0NPTlNPTEVfSFBQX0lOQ0xVREVECisKKyNpbmNsdWRlIDxjZmxvYXQ+CisjaW5jbHVkZSA8Y3N0ZGlvPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgc3RydWN0IENvbnNvbGVSZXBvcnRlciA6IFN0cmVhbWluZ1JlcG9ydGVyQmFzZSB7CisgICAgICAgIENvbnNvbGVSZXBvcnRlciggUmVwb3J0ZXJDb25maWcgY29uc3QmIF9jb25maWcgKQorICAgICAgICA6ICAgU3RyZWFtaW5nUmVwb3J0ZXJCYXNlKCBfY29uZmlnICksCisgICAgICAgICAgICBtX2hlYWRlclByaW50ZWQoIGZhbHNlICkKKyAgICAgICAge30KKworICAgICAgICB2aXJ0dWFsIH5Db25zb2xlUmVwb3J0ZXIoKSBDQVRDSF9PVkVSUklERTsKKyAgICAgICAgc3RhdGljIHN0ZDo6c3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuICJSZXBvcnRzIHRlc3QgcmVzdWx0cyBhcyBwbGFpbiBsaW5lcyBvZiB0ZXh0IjsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBub01hdGNoaW5nVGVzdENhc2VzKCBzdGQ6OnN0cmluZyBjb25zdCYgc3BlYyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIHN0cmVhbSA8PCAiTm8gdGVzdCBjYXNlcyBtYXRjaGVkICciIDw8IHNwZWMgPDwgJ1wnJyA8PCBzdGQ6OmVuZGw7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgYXNzZXJ0aW9uU3RhcnRpbmcoIEFzc2VydGlvbkluZm8gY29uc3QmICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCBib29sIGFzc2VydGlvbkVuZGVkKCBBc3NlcnRpb25TdGF0cyBjb25zdCYgX2Fzc2VydGlvblN0YXRzICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgQXNzZXJ0aW9uUmVzdWx0IGNvbnN0JiByZXN1bHQgPSBfYXNzZXJ0aW9uU3RhdHMuYXNzZXJ0aW9uUmVzdWx0OworCisgICAgICAgICAgICBib29sIGluY2x1ZGVSZXN1bHRzID0gbV9jb25maWctPmluY2x1ZGVTdWNjZXNzZnVsUmVzdWx0cygpIHx8ICFyZXN1bHQuaXNPaygpOworCisgICAgICAgICAgICAvLyBEcm9wIG91dCBpZiByZXN1bHQgd2FzIHN1Y2Nlc3NmdWwgYnV0IHdlJ3JlIG5vdCBwcmludGluZyB0aGVtLgorICAgICAgICAgICAgaWYoICFpbmNsdWRlUmVzdWx0cyAmJiByZXN1bHQuZ2V0UmVzdWx0VHlwZSgpICE9IFJlc3VsdFdhczo6V2FybmluZyApCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgICAgICBsYXp5UHJpbnQoKTsKKworICAgICAgICAgICAgQXNzZXJ0aW9uUHJpbnRlciBwcmludGVyKCBzdHJlYW0sIF9hc3NlcnRpb25TdGF0cywgaW5jbHVkZVJlc3VsdHMgKTsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnQoKTsKKyAgICAgICAgICAgIHN0cmVhbSA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBzZWN0aW9uU3RhcnRpbmcoIFNlY3Rpb25JbmZvIGNvbnN0JiBfc2VjdGlvbkluZm8gKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBtX2hlYWRlclByaW50ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIFN0cmVhbWluZ1JlcG9ydGVyQmFzZTo6c2VjdGlvblN0YXJ0aW5nKCBfc2VjdGlvbkluZm8gKTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHZvaWQgc2VjdGlvbkVuZGVkKCBTZWN0aW9uU3RhdHMgY29uc3QmIF9zZWN0aW9uU3RhdHMgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBpZiggX3NlY3Rpb25TdGF0cy5taXNzaW5nQXNzZXJ0aW9ucyApIHsKKyAgICAgICAgICAgICAgICBsYXp5UHJpbnQoKTsKKyAgICAgICAgICAgICAgICBDb2xvdXIgY29sb3VyKCBDb2xvdXI6OlJlc3VsdEVycm9yICk7CisgICAgICAgICAgICAgICAgaWYoIG1fc2VjdGlvblN0YWNrLnNpemUoKSA+IDEgKQorICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPDwgIlxuTm8gYXNzZXJ0aW9ucyBpbiBzZWN0aW9uIjsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCAiXG5ObyBhc3NlcnRpb25zIGluIHRlc3QgY2FzZSI7CisgICAgICAgICAgICAgICAgc3RyZWFtIDw8ICIgJyIgPDwgX3NlY3Rpb25TdGF0cy5zZWN0aW9uSW5mby5uYW1lIDw8ICInXG4iIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCBtX2NvbmZpZy0+c2hvd0R1cmF0aW9ucygpID09IFNob3dEdXJhdGlvbnM6OkFsd2F5cyApIHsKKyAgICAgICAgICAgICAgICBzdHJlYW0gPDwgZ2V0Rm9ybWF0dGVkRHVyYXRpb24oX3NlY3Rpb25TdGF0cy5kdXJhdGlvbkluU2Vjb25kcykgPDwgIiBzOiAiIDw8IF9zZWN0aW9uU3RhdHMuc2VjdGlvbkluZm8ubmFtZSA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiggbV9oZWFkZXJQcmludGVkICkgeworICAgICAgICAgICAgICAgIG1faGVhZGVyUHJpbnRlZCA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyZWFtaW5nUmVwb3J0ZXJCYXNlOjpzZWN0aW9uRW5kZWQoIF9zZWN0aW9uU3RhdHMgKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0Q2FzZUVuZGVkKCBUZXN0Q2FzZVN0YXRzIGNvbnN0JiBfdGVzdENhc2VTdGF0cyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIFN0cmVhbWluZ1JlcG9ydGVyQmFzZTo6dGVzdENhc2VFbmRlZCggX3Rlc3RDYXNlU3RhdHMgKTsKKyAgICAgICAgICAgIG1faGVhZGVyUHJpbnRlZCA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0R3JvdXBFbmRlZCggVGVzdEdyb3VwU3RhdHMgY29uc3QmIF90ZXN0R3JvdXBTdGF0cyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIGlmKCBjdXJyZW50R3JvdXBJbmZvLnVzZWQgKSB7CisgICAgICAgICAgICAgICAgcHJpbnRTdW1tYXJ5RGl2aWRlcigpOworICAgICAgICAgICAgICAgIHN0cmVhbSA8PCAiU3VtbWFyeSBmb3IgZ3JvdXAgJyIgPDwgX3Rlc3RHcm91cFN0YXRzLmdyb3VwSW5mby5uYW1lIDw8ICInOlxuIjsKKyAgICAgICAgICAgICAgICBwcmludFRvdGFscyggX3Rlc3RHcm91cFN0YXRzLnRvdGFscyApOworICAgICAgICAgICAgICAgIHN0cmVhbSA8PCAnXG4nIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0cmVhbWluZ1JlcG9ydGVyQmFzZTo6dGVzdEdyb3VwRW5kZWQoIF90ZXN0R3JvdXBTdGF0cyApOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0UnVuRW5kZWQoIFRlc3RSdW5TdGF0cyBjb25zdCYgX3Rlc3RSdW5TdGF0cyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIHByaW50VG90YWxzRGl2aWRlciggX3Rlc3RSdW5TdGF0cy50b3RhbHMgKTsKKyAgICAgICAgICAgIHByaW50VG90YWxzKCBfdGVzdFJ1blN0YXRzLnRvdGFscyApOworICAgICAgICAgICAgc3RyZWFtIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgIFN0cmVhbWluZ1JlcG9ydGVyQmFzZTo6dGVzdFJ1bkVuZGVkKCBfdGVzdFJ1blN0YXRzICk7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisKKyAgICAgICAgY2xhc3MgQXNzZXJ0aW9uUHJpbnRlciB7CisgICAgICAgICAgICB2b2lkIG9wZXJhdG9yPSAoIEFzc2VydGlvblByaW50ZXIgY29uc3QmICk7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIEFzc2VydGlvblByaW50ZXIoIHN0ZDo6b3N0cmVhbSYgX3N0cmVhbSwgQXNzZXJ0aW9uU3RhdHMgY29uc3QmIF9zdGF0cywgYm9vbCBfcHJpbnRJbmZvTWVzc2FnZXMgKQorICAgICAgICAgICAgOiAgIHN0cmVhbSggX3N0cmVhbSApLAorICAgICAgICAgICAgICAgIHN0YXRzKCBfc3RhdHMgKSwKKyAgICAgICAgICAgICAgICByZXN1bHQoIF9zdGF0cy5hc3NlcnRpb25SZXN1bHQgKSwKKyAgICAgICAgICAgICAgICBjb2xvdXIoIENvbG91cjo6Tm9uZSApLAorICAgICAgICAgICAgICAgIG1lc3NhZ2UoIHJlc3VsdC5nZXRNZXNzYWdlKCkgKSwKKyAgICAgICAgICAgICAgICBtZXNzYWdlcyggX3N0YXRzLmluZm9NZXNzYWdlcyApLAorICAgICAgICAgICAgICAgIHByaW50SW5mb01lc3NhZ2VzKCBfcHJpbnRJbmZvTWVzc2FnZXMgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN3aXRjaCggcmVzdWx0LmdldFJlc3VsdFR5cGUoKSApIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6Ok9rOgorICAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gQ29sb3VyOjpTdWNjZXNzOworICAgICAgICAgICAgICAgICAgICAgICAgcGFzc09yRmFpbCA9ICJQQVNTRUQiOworICAgICAgICAgICAgICAgICAgICAgICAgLy9pZiggcmVzdWx0Lmhhc01lc3NhZ2UoKSApCisgICAgICAgICAgICAgICAgICAgICAgICBpZiggX3N0YXRzLmluZm9NZXNzYWdlcy5zaXplKCkgPT0gMSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUxhYmVsID0gIndpdGggbWVzc2FnZSI7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggX3N0YXRzLmluZm9NZXNzYWdlcy5zaXplKCkgPiAxICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlTGFiZWwgPSAid2l0aCBtZXNzYWdlcyI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OkV4cHJlc3Npb25GYWlsZWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggcmVzdWx0LmlzT2soKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSBDb2xvdXI6OlN1Y2Nlc3M7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc09yRmFpbCA9ICJGQUlMRUQgLSBidXQgd2FzIG9rIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9IENvbG91cjo6RXJyb3I7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc09yRmFpbCA9ICJGQUlMRUQiOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYoIF9zdGF0cy5pbmZvTWVzc2FnZXMuc2l6ZSgpID09IDEgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VMYWJlbCA9ICJ3aXRoIG1lc3NhZ2UiOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIF9zdGF0cy5pbmZvTWVzc2FnZXMuc2l6ZSgpID4gMSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUxhYmVsID0gIndpdGggbWVzc2FnZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpUaHJld0V4Y2VwdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9IENvbG91cjo6RXJyb3I7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXNzT3JGYWlsID0gIkZBSUxFRCI7CisgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlTGFiZWwgPSAiZHVlIHRvIHVuZXhwZWN0ZWQgZXhjZXB0aW9uIHdpdGggIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfc3RhdHMuaW5mb01lc3NhZ2VzLnNpemUoKSA9PSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VMYWJlbCArPSAibWVzc2FnZSI7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX3N0YXRzLmluZm9NZXNzYWdlcy5zaXplKCkgPiAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VMYWJlbCArPSAibWVzc2FnZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpGYXRhbEVycm9yQ29uZGl0aW9uOgorICAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gQ29sb3VyOjpFcnJvcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NPckZhaWwgPSAiRkFJTEVEIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VMYWJlbCA9ICJkdWUgdG8gYSBmYXRhbCBlcnJvciBjb25kaXRpb24iOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpEaWRudFRocm93RXhjZXB0aW9uOgorICAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gQ29sb3VyOjpFcnJvcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NPckZhaWwgPSAiRkFJTEVEIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VMYWJlbCA9ICJiZWNhdXNlIG5vIGV4Y2VwdGlvbiB3YXMgdGhyb3duIHdoZXJlIG9uZSB3YXMgZXhwZWN0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpJbmZvOgorICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUxhYmVsID0gImluZm8iOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpXYXJuaW5nOgorICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUxhYmVsID0gIndhcm5pbmciOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpFeHBsaWNpdEZhaWx1cmU6CisgICAgICAgICAgICAgICAgICAgICAgICBwYXNzT3JGYWlsID0gIkZBSUxFRCI7CisgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSBDb2xvdXI6OkVycm9yOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIF9zdGF0cy5pbmZvTWVzc2FnZXMuc2l6ZSgpID09IDEgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VMYWJlbCA9ICJleHBsaWNpdGx5IHdpdGggbWVzc2FnZSI7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggX3N0YXRzLmluZm9NZXNzYWdlcy5zaXplKCkgPiAxICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlTGFiZWwgPSAiZXhwbGljaXRseSB3aXRoIG1lc3NhZ2VzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAvLyBUaGVzZSBjYXNlcyBhcmUgaGVyZSB0byBwcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzCisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpVbmtub3duOgorICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6RmFpbHVyZUJpdDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OkV4Y2VwdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NPckZhaWwgPSAiKiogaW50ZXJuYWwgZXJyb3IgKioiOworICAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gQ29sb3VyOjpFcnJvcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdm9pZCBwcmludCgpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICBwcmludFNvdXJjZUluZm8oKTsKKyAgICAgICAgICAgICAgICBpZiggc3RhdHMudG90YWxzLmFzc2VydGlvbnMudG90YWwoKSA+IDAgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmKCByZXN1bHQuaXNPaygpICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCAnXG4nOworICAgICAgICAgICAgICAgICAgICBwcmludFJlc3VsdFR5cGUoKTsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRPcmlnaW5hbEV4cHJlc3Npb24oKTsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRSZWNvbnN0cnVjdGVkRXhwcmVzc2lvbigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtIDw8ICdcbic7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHByaW50TWVzc2FnZSgpOworICAgICAgICAgICAgfQorCisgICAgICAgIHByaXZhdGU6CisgICAgICAgICAgICB2b2lkIHByaW50UmVzdWx0VHlwZSgpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICBpZiggIXBhc3NPckZhaWwuZW1wdHkoKSApIHsKKyAgICAgICAgICAgICAgICAgICAgQ29sb3VyIGNvbG91ckd1YXJkKCBjb2xvdXIgKTsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtIDw8IHBhc3NPckZhaWwgPDwgIjpcbiI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdm9pZCBwcmludE9yaWdpbmFsRXhwcmVzc2lvbigpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICBpZiggcmVzdWx0Lmhhc0V4cHJlc3Npb24oKSApIHsKKyAgICAgICAgICAgICAgICAgICAgQ29sb3VyIGNvbG91ckd1YXJkKCBDb2xvdXI6Ok9yaWdpbmFsRXhwcmVzc2lvbiApOworICAgICAgICAgICAgICAgICAgICBzdHJlYW0gIDw8ICIgICI7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCByZXN1bHQuZ2V0RXhwcmVzc2lvbkluTWFjcm8oKTsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtIDw8ICdcbic7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdm9pZCBwcmludFJlY29uc3RydWN0ZWRFeHByZXNzaW9uKCkgY29uc3QgeworICAgICAgICAgICAgICAgIGlmKCByZXN1bHQuaGFzRXhwYW5kZWRFeHByZXNzaW9uKCkgKSB7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCAid2l0aCBleHBhbnNpb246XG4iOworICAgICAgICAgICAgICAgICAgICBDb2xvdXIgY29sb3VyR3VhcmQoIENvbG91cjo6UmVjb25zdHJ1Y3RlZEV4cHJlc3Npb24gKTsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtIDw8IFRleHQoIHJlc3VsdC5nZXRFeHBhbmRlZEV4cHJlc3Npb24oKSwgVGV4dEF0dHJpYnV0ZXMoKS5zZXRJbmRlbnQoMikgKSA8PCAnXG4nOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZvaWQgcHJpbnRNZXNzYWdlKCkgY29uc3QgeworICAgICAgICAgICAgICAgIGlmKCAhbWVzc2FnZUxhYmVsLmVtcHR5KCkgKQorICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPDwgbWVzc2FnZUxhYmVsIDw8ICc6JyA8PCAnXG4nOworICAgICAgICAgICAgICAgIGZvciggc3RkOjp2ZWN0b3I8TWVzc2FnZUluZm8+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1lc3NhZ2VzLmJlZ2luKCksIGl0RW5kID0gbWVzc2FnZXMuZW5kKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICsraXQgKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgYXNzZXJ0aW9uIGlzIGEgd2FybmluZyBpZ25vcmUgYW55IElORk8gbWVzc2FnZXMKKyAgICAgICAgICAgICAgICAgICAgaWYoIHByaW50SW5mb01lc3NhZ2VzIHx8IGl0LT50eXBlICE9IFJlc3VsdFdhczo6SW5mbyApCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPDwgVGV4dCggaXQtPm1lc3NhZ2UsIFRleHRBdHRyaWJ1dGVzKCkuc2V0SW5kZW50KDIpICkgPDwgJ1xuJzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2b2lkIHByaW50U291cmNlSW5mbygpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICBDb2xvdXIgY29sb3VyR3VhcmQoIENvbG91cjo6RmlsZU5hbWUgKTsKKyAgICAgICAgICAgICAgICBzdHJlYW0gPDwgcmVzdWx0LmdldFNvdXJjZUluZm8oKSA8PCAiOiAiOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGQ6Om9zdHJlYW0mIHN0cmVhbTsKKyAgICAgICAgICAgIEFzc2VydGlvblN0YXRzIGNvbnN0JiBzdGF0czsKKyAgICAgICAgICAgIEFzc2VydGlvblJlc3VsdCBjb25zdCYgcmVzdWx0OworICAgICAgICAgICAgQ29sb3VyOjpDb2RlIGNvbG91cjsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHBhc3NPckZhaWw7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBtZXNzYWdlTGFiZWw7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBtZXNzYWdlOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8TWVzc2FnZUluZm8+IG1lc3NhZ2VzOworICAgICAgICAgICAgYm9vbCBwcmludEluZm9NZXNzYWdlczsKKyAgICAgICAgfTsKKworICAgICAgICB2b2lkIGxhenlQcmludCgpIHsKKworICAgICAgICAgICAgaWYoICFjdXJyZW50VGVzdFJ1bkluZm8udXNlZCApCisgICAgICAgICAgICAgICAgbGF6eVByaW50UnVuSW5mbygpOworICAgICAgICAgICAgaWYoICFjdXJyZW50R3JvdXBJbmZvLnVzZWQgKQorICAgICAgICAgICAgICAgIGxhenlQcmludEdyb3VwSW5mbygpOworCisgICAgICAgICAgICBpZiggIW1faGVhZGVyUHJpbnRlZCApIHsKKyAgICAgICAgICAgICAgICBwcmludFRlc3RDYXNlQW5kU2VjdGlvbkhlYWRlcigpOworICAgICAgICAgICAgICAgIG1faGVhZGVyUHJpbnRlZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdm9pZCBsYXp5UHJpbnRSdW5JbmZvKCkgeworICAgICAgICAgICAgc3RyZWFtICA8PCAnXG4nIDw8IGdldExpbmVPZkNoYXJzPCd+Jz4oKSA8PCAnXG4nOworICAgICAgICAgICAgQ29sb3VyIGNvbG91ciggQ29sb3VyOjpTZWNvbmRhcnlUZXh0ICk7CisgICAgICAgICAgICBzdHJlYW0gIDw8IGN1cnJlbnRUZXN0UnVuSW5mby0+bmFtZQorICAgICAgICAgICAgICAgICAgICA8PCAiIGlzIGEgQ2F0Y2ggdiIgIDw8IGxpYnJhcnlWZXJzaW9uKCkgPDwgIiBob3N0IGFwcGxpY2F0aW9uLlxuIgorICAgICAgICAgICAgICAgICAgICA8PCAiUnVuIHdpdGggLT8gZm9yIG9wdGlvbnNcblxuIjsKKworICAgICAgICAgICAgaWYoIG1fY29uZmlnLT5ybmdTZWVkKCkgIT0gMCApCisgICAgICAgICAgICAgICAgc3RyZWFtIDw8ICJSYW5kb21uZXNzIHNlZWRlZCB0bzogIiA8PCBtX2NvbmZpZy0+cm5nU2VlZCgpIDw8ICJcblxuIjsKKworICAgICAgICAgICAgY3VycmVudFRlc3RSdW5JbmZvLnVzZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIHZvaWQgbGF6eVByaW50R3JvdXBJbmZvKCkgeworICAgICAgICAgICAgaWYoICFjdXJyZW50R3JvdXBJbmZvLT5uYW1lLmVtcHR5KCkgJiYgY3VycmVudEdyb3VwSW5mby0+Z3JvdXBzQ291bnRzID4gMSApIHsKKyAgICAgICAgICAgICAgICBwcmludENsb3NlZEhlYWRlciggIkdyb3VwOiAiICsgY3VycmVudEdyb3VwSW5mby0+bmFtZSApOworICAgICAgICAgICAgICAgIGN1cnJlbnRHcm91cEluZm8udXNlZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdm9pZCBwcmludFRlc3RDYXNlQW5kU2VjdGlvbkhlYWRlcigpIHsKKyAgICAgICAgICAgIGFzc2VydCggIW1fc2VjdGlvblN0YWNrLmVtcHR5KCkgKTsKKyAgICAgICAgICAgIHByaW50T3BlbkhlYWRlciggY3VycmVudFRlc3RDYXNlSW5mby0+bmFtZSApOworCisgICAgICAgICAgICBpZiggbV9zZWN0aW9uU3RhY2suc2l6ZSgpID4gMSApIHsKKyAgICAgICAgICAgICAgICBDb2xvdXIgY29sb3VyR3VhcmQoIENvbG91cjo6SGVhZGVycyApOworCisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8U2VjdGlvbkluZm8+Ojpjb25zdF9pdGVyYXRvcgorICAgICAgICAgICAgICAgICAgICBpdCA9IG1fc2VjdGlvblN0YWNrLmJlZ2luKCkrMSwgLy8gU2tpcCBmaXJzdCBzZWN0aW9uICh0ZXN0IGNhc2UpCisgICAgICAgICAgICAgICAgICAgIGl0RW5kID0gbV9zZWN0aW9uU3RhY2suZW5kKCk7CisgICAgICAgICAgICAgICAgZm9yKCA7IGl0ICE9IGl0RW5kOyArK2l0ICkKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRIZWFkZXJTdHJpbmcoIGl0LT5uYW1lLCAyICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFNvdXJjZUxpbmVJbmZvIGxpbmVJbmZvID0gbV9zZWN0aW9uU3RhY2suYmFjaygpLmxpbmVJbmZvOworCisgICAgICAgICAgICBpZiggIWxpbmVJbmZvLmVtcHR5KCkgKXsKKyAgICAgICAgICAgICAgICBzdHJlYW0gPDwgZ2V0TGluZU9mQ2hhcnM8Jy0nPigpIDw8ICdcbic7CisgICAgICAgICAgICAgICAgQ29sb3VyIGNvbG91ckd1YXJkKCBDb2xvdXI6OkZpbGVOYW1lICk7CisgICAgICAgICAgICAgICAgc3RyZWFtIDw8IGxpbmVJbmZvIDw8ICdcbic7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdHJlYW0gPDwgZ2V0TGluZU9mQ2hhcnM8Jy4nPigpIDw8ICdcbicgPDwgc3RkOjplbmRsOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBwcmludENsb3NlZEhlYWRlciggc3RkOjpzdHJpbmcgY29uc3QmIF9uYW1lICkgeworICAgICAgICAgICAgcHJpbnRPcGVuSGVhZGVyKCBfbmFtZSApOworICAgICAgICAgICAgc3RyZWFtIDw8IGdldExpbmVPZkNoYXJzPCcuJz4oKSA8PCAnXG4nOworICAgICAgICB9CisgICAgICAgIHZvaWQgcHJpbnRPcGVuSGVhZGVyKCBzdGQ6OnN0cmluZyBjb25zdCYgX25hbWUgKSB7CisgICAgICAgICAgICBzdHJlYW0gIDw8IGdldExpbmVPZkNoYXJzPCctJz4oKSA8PCAnXG4nOworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbG91ciBjb2xvdXJHdWFyZCggQ29sb3VyOjpIZWFkZXJzICk7CisgICAgICAgICAgICAgICAgcHJpbnRIZWFkZXJTdHJpbmcoIF9uYW1lICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBpZiBzdHJpbmcgaGFzIGEgOiBpbiBmaXJzdCBsaW5lIHdpbGwgc2V0IGluZGVudCB0byBmb2xsb3cgaXQgb24KKyAgICAgICAgLy8gc3Vic2VxdWVudCBsaW5lcworICAgICAgICB2b2lkIHByaW50SGVhZGVyU3RyaW5nKCBzdGQ6OnN0cmluZyBjb25zdCYgX3N0cmluZywgc3RkOjpzaXplX3QgaW5kZW50ID0gMCApIHsKKyAgICAgICAgICAgIHN0ZDo6c2l6ZV90IGkgPSBfc3RyaW5nLmZpbmQoICI6ICIgKTsKKyAgICAgICAgICAgIGlmKCBpICE9IHN0ZDo6c3RyaW5nOjpucG9zICkKKyAgICAgICAgICAgICAgICBpKz0yOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGkgPSAwOworICAgICAgICAgICAgc3RyZWFtIDw8IFRleHQoIF9zdHJpbmcsIFRleHRBdHRyaWJ1dGVzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0SW5kZW50KCBpbmRlbnQraSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0SW5pdGlhbEluZGVudCggaW5kZW50ICkgKSA8PCAnXG4nOworICAgICAgICB9CisKKyAgICAgICAgc3RydWN0IFN1bW1hcnlDb2x1bW4geworCisgICAgICAgICAgICBTdW1tYXJ5Q29sdW1uKCBzdGQ6OnN0cmluZyBjb25zdCYgX2xhYmVsLCBDb2xvdXI6OkNvZGUgX2NvbG91ciApCisgICAgICAgICAgICA6ICAgbGFiZWwoIF9sYWJlbCApLAorICAgICAgICAgICAgICAgIGNvbG91ciggX2NvbG91ciApCisgICAgICAgICAgICB7fQorICAgICAgICAgICAgU3VtbWFyeUNvbHVtbiBhZGRSb3coIHN0ZDo6c2l6ZV90IGNvdW50ICkgeworICAgICAgICAgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisgICAgICAgICAgICAgICAgb3NzIDw8IGNvdW50OworICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHJvdyA9IG9zcy5zdHIoKTsKKyAgICAgICAgICAgICAgICBmb3IoIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPjo6aXRlcmF0b3IgaXQgPSByb3dzLmJlZ2luKCk7IGl0ICE9IHJvd3MuZW5kKCk7ICsraXQgKSB7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlKCBpdC0+c2l6ZSgpIDwgcm93LnNpemUoKSApCisgICAgICAgICAgICAgICAgICAgICAgICAqaXQgPSAnICcgKyAqaXQ7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlKCBpdC0+c2l6ZSgpID4gcm93LnNpemUoKSApCisgICAgICAgICAgICAgICAgICAgICAgICByb3cgPSAnICcgKyByb3c7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJvd3MucHVzaF9iYWNrKCByb3cgKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGxhYmVsOworICAgICAgICAgICAgQ29sb3VyOjpDb2RlIGNvbG91cjsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiByb3dzOworCisgICAgICAgIH07CisKKyAgICAgICAgdm9pZCBwcmludFRvdGFscyggVG90YWxzIGNvbnN0JiB0b3RhbHMgKSB7CisgICAgICAgICAgICBpZiggdG90YWxzLnRlc3RDYXNlcy50b3RhbCgpID09IDAgKSB7CisgICAgICAgICAgICAgICAgc3RyZWFtIDw8IENvbG91ciggQ29sb3VyOjpXYXJuaW5nICkgPDwgIk5vIHRlc3RzIHJhblxuIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoIHRvdGFscy5hc3NlcnRpb25zLnRvdGFsKCkgPiAwICYmIHRvdGFscy50ZXN0Q2FzZXMuYWxsUGFzc2VkKCkgKSB7CisgICAgICAgICAgICAgICAgc3RyZWFtIDw8IENvbG91ciggQ29sb3VyOjpSZXN1bHRTdWNjZXNzICkgPDwgIkFsbCB0ZXN0cyBwYXNzZWQiOworICAgICAgICAgICAgICAgIHN0cmVhbSA8PCAiICgiCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBwbHVyYWxpc2UoIHRvdGFscy5hc3NlcnRpb25zLnBhc3NlZCwgImFzc2VydGlvbiIgKSA8PCAiIGluICIKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IHBsdXJhbGlzZSggdG90YWxzLnRlc3RDYXNlcy5wYXNzZWQsICJ0ZXN0IGNhc2UiICkgPDwgJyknCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAnXG4nOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxTdW1tYXJ5Q29sdW1uPiBjb2x1bW5zOworICAgICAgICAgICAgICAgIGNvbHVtbnMucHVzaF9iYWNrKCBTdW1tYXJ5Q29sdW1uKCAiIiwgQ29sb3VyOjpOb25lICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkUm93KCB0b3RhbHMudGVzdENhc2VzLnRvdGFsKCkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRSb3coIHRvdGFscy5hc3NlcnRpb25zLnRvdGFsKCkgKSApOworICAgICAgICAgICAgICAgIGNvbHVtbnMucHVzaF9iYWNrKCBTdW1tYXJ5Q29sdW1uKCAicGFzc2VkIiwgQ29sb3VyOjpTdWNjZXNzICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkUm93KCB0b3RhbHMudGVzdENhc2VzLnBhc3NlZCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFJvdyggdG90YWxzLmFzc2VydGlvbnMucGFzc2VkICkgKTsKKyAgICAgICAgICAgICAgICBjb2x1bW5zLnB1c2hfYmFjayggU3VtbWFyeUNvbHVtbiggImZhaWxlZCIsIENvbG91cjo6UmVzdWx0RXJyb3IgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRSb3coIHRvdGFscy50ZXN0Q2FzZXMuZmFpbGVkICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkUm93KCB0b3RhbHMuYXNzZXJ0aW9ucy5mYWlsZWQgKSApOworICAgICAgICAgICAgICAgIGNvbHVtbnMucHVzaF9iYWNrKCBTdW1tYXJ5Q29sdW1uKCAiZmFpbGVkIGFzIGV4cGVjdGVkIiwgQ29sb3VyOjpSZXN1bHRFeHBlY3RlZEZhaWx1cmUgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRSb3coIHRvdGFscy50ZXN0Q2FzZXMuZmFpbGVkQnV0T2sgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRSb3coIHRvdGFscy5hc3NlcnRpb25zLmZhaWxlZEJ1dE9rICkgKTsKKworICAgICAgICAgICAgICAgIHByaW50U3VtbWFyeVJvdyggInRlc3QgY2FzZXMiLCBjb2x1bW5zLCAwICk7CisgICAgICAgICAgICAgICAgcHJpbnRTdW1tYXJ5Um93KCAiYXNzZXJ0aW9ucyIsIGNvbHVtbnMsIDEgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB2b2lkIHByaW50U3VtbWFyeVJvdyggc3RkOjpzdHJpbmcgY29uc3QmIGxhYmVsLCBzdGQ6OnZlY3RvcjxTdW1tYXJ5Q29sdW1uPiBjb25zdCYgY29scywgc3RkOjpzaXplX3Qgcm93ICkgeworICAgICAgICAgICAgZm9yKCBzdGQ6OnZlY3RvcjxTdW1tYXJ5Q29sdW1uPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBjb2xzLmJlZ2luKCk7IGl0ICE9IGNvbHMuZW5kKCk7ICsraXQgKSB7CisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgdmFsdWUgPSBpdC0+cm93c1tyb3ddOworICAgICAgICAgICAgICAgIGlmKCBpdC0+bGFiZWwuZW1wdHkoKSApIHsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtIDw8IGxhYmVsIDw8ICI6ICI7CisgICAgICAgICAgICAgICAgICAgIGlmKCB2YWx1ZSAhPSAiMCIgKQorICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIDw8IHZhbHVlOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPDwgQ29sb3VyKCBDb2xvdXI6Oldhcm5pbmcgKSA8PCAiLSBub25lIC0iOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmKCB2YWx1ZSAhPSAiMCIgKSB7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSAgPDwgQ29sb3VyKCBDb2xvdXI6OkxpZ2h0R3JleSApIDw8ICIgfCAiOworICAgICAgICAgICAgICAgICAgICBzdHJlYW0gIDw8IENvbG91ciggaXQtPmNvbG91ciApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgdmFsdWUgPDwgJyAnIDw8IGl0LT5sYWJlbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdHJlYW0gPDwgJ1xuJzsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyBzdGQ6OnNpemVfdCBtYWtlUmF0aW8oIHN0ZDo6c2l6ZV90IG51bWJlciwgc3RkOjpzaXplX3QgdG90YWwgKSB7CisgICAgICAgICAgICBzdGQ6OnNpemVfdCByYXRpbyA9IHRvdGFsID4gMCA/IENBVENIX0NPTkZJR19DT05TT0xFX1dJRFRIICogbnVtYmVyLyB0b3RhbCA6IDA7CisgICAgICAgICAgICByZXR1cm4gKCByYXRpbyA9PSAwICYmIG51bWJlciA+IDAgKSA/IDEgOiByYXRpbzsKKyAgICAgICAgfQorICAgICAgICBzdGF0aWMgc3RkOjpzaXplX3QmIGZpbmRNYXgoIHN0ZDo6c2l6ZV90JiBpLCBzdGQ6OnNpemVfdCYgaiwgc3RkOjpzaXplX3QmIGsgKSB7CisgICAgICAgICAgICBpZiggaSA+IGogJiYgaSA+IGsgKQorICAgICAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICAgICAgZWxzZSBpZiggaiA+IGsgKQorICAgICAgICAgICAgICAgIHJldHVybiBqOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBrOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBwcmludFRvdGFsc0RpdmlkZXIoIFRvdGFscyBjb25zdCYgdG90YWxzICkgeworICAgICAgICAgICAgaWYoIHRvdGFscy50ZXN0Q2FzZXMudG90YWwoKSA+IDAgKSB7CisgICAgICAgICAgICAgICAgc3RkOjpzaXplX3QgZmFpbGVkUmF0aW8gPSBtYWtlUmF0aW8oIHRvdGFscy50ZXN0Q2FzZXMuZmFpbGVkLCB0b3RhbHMudGVzdENhc2VzLnRvdGFsKCkgKTsKKyAgICAgICAgICAgICAgICBzdGQ6OnNpemVfdCBmYWlsZWRCdXRPa1JhdGlvID0gbWFrZVJhdGlvKCB0b3RhbHMudGVzdENhc2VzLmZhaWxlZEJ1dE9rLCB0b3RhbHMudGVzdENhc2VzLnRvdGFsKCkgKTsKKyAgICAgICAgICAgICAgICBzdGQ6OnNpemVfdCBwYXNzZWRSYXRpbyA9IG1ha2VSYXRpbyggdG90YWxzLnRlc3RDYXNlcy5wYXNzZWQsIHRvdGFscy50ZXN0Q2FzZXMudG90YWwoKSApOworICAgICAgICAgICAgICAgIHdoaWxlKCBmYWlsZWRSYXRpbyArIGZhaWxlZEJ1dE9rUmF0aW8gKyBwYXNzZWRSYXRpbyA8IENBVENIX0NPTkZJR19DT05TT0xFX1dJRFRILTEgKQorICAgICAgICAgICAgICAgICAgICBmaW5kTWF4KCBmYWlsZWRSYXRpbywgZmFpbGVkQnV0T2tSYXRpbywgcGFzc2VkUmF0aW8gKSsrOworICAgICAgICAgICAgICAgIHdoaWxlKCBmYWlsZWRSYXRpbyArIGZhaWxlZEJ1dE9rUmF0aW8gKyBwYXNzZWRSYXRpbyA+IENBVENIX0NPTkZJR19DT05TT0xFX1dJRFRILTEgKQorICAgICAgICAgICAgICAgICAgICBmaW5kTWF4KCBmYWlsZWRSYXRpbywgZmFpbGVkQnV0T2tSYXRpbywgcGFzc2VkUmF0aW8gKS0tOworCisgICAgICAgICAgICAgICAgc3RyZWFtIDw8IENvbG91ciggQ29sb3VyOjpFcnJvciApIDw8IHN0ZDo6c3RyaW5nKCBmYWlsZWRSYXRpbywgJz0nICk7CisgICAgICAgICAgICAgICAgc3RyZWFtIDw8IENvbG91ciggQ29sb3VyOjpSZXN1bHRFeHBlY3RlZEZhaWx1cmUgKSA8PCBzdGQ6OnN0cmluZyggZmFpbGVkQnV0T2tSYXRpbywgJz0nICk7CisgICAgICAgICAgICAgICAgaWYoIHRvdGFscy50ZXN0Q2FzZXMuYWxsUGFzc2VkKCkgKQorICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPDwgQ29sb3VyKCBDb2xvdXI6OlJlc3VsdFN1Y2Nlc3MgKSA8PCBzdGQ6OnN0cmluZyggcGFzc2VkUmF0aW8sICc9JyApOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtIDw8IENvbG91ciggQ29sb3VyOjpTdWNjZXNzICkgPDwgc3RkOjpzdHJpbmcoIHBhc3NlZFJhdGlvLCAnPScgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHN0cmVhbSA8PCBDb2xvdXIoIENvbG91cjo6V2FybmluZyApIDw8IHN0ZDo6c3RyaW5nKCBDQVRDSF9DT05GSUdfQ09OU09MRV9XSURUSC0xLCAnPScgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0cmVhbSA8PCAnXG4nOworICAgICAgICB9CisgICAgICAgIHZvaWQgcHJpbnRTdW1tYXJ5RGl2aWRlcigpIHsKKyAgICAgICAgICAgIHN0cmVhbSA8PCBnZXRMaW5lT2ZDaGFyczwnLSc+KCkgPDwgJ1xuJzsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgYm9vbCBtX2hlYWRlclByaW50ZWQ7CisgICAgfTsKKworICAgIElOVEVSTkFMX0NBVENIX1JFR0lTVEVSX1JFUE9SVEVSKCAiY29uc29sZSIsIENvbnNvbGVSZXBvcnRlciApCisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogLi4vcmVwb3J0ZXJzL2NhdGNoX3JlcG9ydGVyX2NvbXBhY3QuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9SRVBPUlRFUl9DT01QQUNUX0hQUF9JTkNMVURFRAorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgc3RydWN0IENvbXBhY3RSZXBvcnRlciA6IFN0cmVhbWluZ1JlcG9ydGVyQmFzZSB7CisKKyAgICAgICAgQ29tcGFjdFJlcG9ydGVyKCBSZXBvcnRlckNvbmZpZyBjb25zdCYgX2NvbmZpZyApCisgICAgICAgIDogU3RyZWFtaW5nUmVwb3J0ZXJCYXNlKCBfY29uZmlnICkKKyAgICAgICAge30KKworICAgICAgICB2aXJ0dWFsIH5Db21wYWN0UmVwb3J0ZXIoKTsKKworICAgICAgICBzdGF0aWMgc3RkOjpzdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisgICAgICAgICAgICByZXR1cm4gIlJlcG9ydHMgdGVzdCByZXN1bHRzIG9uIGEgc2luZ2xlIGxpbmUsIHN1aXRhYmxlIGZvciBJREVzIjsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgUmVwb3J0ZXJQcmVmZXJlbmNlcyBnZXRQcmVmZXJlbmNlcygpIGNvbnN0IHsKKyAgICAgICAgICAgIFJlcG9ydGVyUHJlZmVyZW5jZXMgcHJlZnM7CisgICAgICAgICAgICBwcmVmcy5zaG91bGRSZWRpcmVjdFN0ZE91dCA9IGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIHByZWZzOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIG5vTWF0Y2hpbmdUZXN0Q2FzZXMoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzcGVjICkgeworICAgICAgICAgICAgc3RyZWFtIDw8ICJObyB0ZXN0IGNhc2VzIG1hdGNoZWQgJyIgPDwgc3BlYyA8PCAnXCcnIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBhc3NlcnRpb25TdGFydGluZyggQXNzZXJ0aW9uSW5mbyBjb25zdCYgKSB7fQorCisgICAgICAgIHZpcnR1YWwgYm9vbCBhc3NlcnRpb25FbmRlZCggQXNzZXJ0aW9uU3RhdHMgY29uc3QmIF9hc3NlcnRpb25TdGF0cyApIHsKKyAgICAgICAgICAgIEFzc2VydGlvblJlc3VsdCBjb25zdCYgcmVzdWx0ID0gX2Fzc2VydGlvblN0YXRzLmFzc2VydGlvblJlc3VsdDsKKworICAgICAgICAgICAgYm9vbCBwcmludEluZm9NZXNzYWdlcyA9IHRydWU7CisKKyAgICAgICAgICAgIC8vIERyb3Agb3V0IGlmIHJlc3VsdCB3YXMgc3VjY2Vzc2Z1bCBhbmQgd2UncmUgbm90IHByaW50aW5nIHRob3NlCisgICAgICAgICAgICBpZiggIW1fY29uZmlnLT5pbmNsdWRlU3VjY2Vzc2Z1bFJlc3VsdHMoKSAmJiByZXN1bHQuaXNPaygpICkgeworICAgICAgICAgICAgICAgIGlmKCByZXN1bHQuZ2V0UmVzdWx0VHlwZSgpICE9IFJlc3VsdFdhczo6V2FybmluZyApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICBwcmludEluZm9NZXNzYWdlcyA9IGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBBc3NlcnRpb25QcmludGVyIHByaW50ZXIoIHN0cmVhbSwgX2Fzc2VydGlvblN0YXRzLCBwcmludEluZm9NZXNzYWdlcyApOworICAgICAgICAgICAgcHJpbnRlci5wcmludCgpOworCisgICAgICAgICAgICBzdHJlYW0gPDwgc3RkOjplbmRsOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgc2VjdGlvbkVuZGVkKFNlY3Rpb25TdGF0cyBjb25zdCYgX3NlY3Rpb25TdGF0cykgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgaWYgKG1fY29uZmlnLT5zaG93RHVyYXRpb25zKCkgPT0gU2hvd0R1cmF0aW9uczo6QWx3YXlzKSB7CisgICAgICAgICAgICAgICAgc3RyZWFtIDw8IGdldEZvcm1hdHRlZER1cmF0aW9uKF9zZWN0aW9uU3RhdHMuZHVyYXRpb25JblNlY29uZHMpIDw8ICIgczogIiA8PCBfc2VjdGlvblN0YXRzLnNlY3Rpb25JbmZvLm5hbWUgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RSdW5FbmRlZCggVGVzdFJ1blN0YXRzIGNvbnN0JiBfdGVzdFJ1blN0YXRzICkgeworICAgICAgICAgICAgcHJpbnRUb3RhbHMoIF90ZXN0UnVuU3RhdHMudG90YWxzICk7CisgICAgICAgICAgICBzdHJlYW0gPDwgJ1xuJyA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICBTdHJlYW1pbmdSZXBvcnRlckJhc2U6OnRlc3RSdW5FbmRlZCggX3Rlc3RSdW5TdGF0cyApOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBjbGFzcyBBc3NlcnRpb25QcmludGVyIHsKKyAgICAgICAgICAgIHZvaWQgb3BlcmF0b3I9ICggQXNzZXJ0aW9uUHJpbnRlciBjb25zdCYgKTsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgQXNzZXJ0aW9uUHJpbnRlciggc3RkOjpvc3RyZWFtJiBfc3RyZWFtLCBBc3NlcnRpb25TdGF0cyBjb25zdCYgX3N0YXRzLCBib29sIF9wcmludEluZm9NZXNzYWdlcyApCisgICAgICAgICAgICA6IHN0cmVhbSggX3N0cmVhbSApCisgICAgICAgICAgICAsIHN0YXRzKCBfc3RhdHMgKQorICAgICAgICAgICAgLCByZXN1bHQoIF9zdGF0cy5hc3NlcnRpb25SZXN1bHQgKQorICAgICAgICAgICAgLCBtZXNzYWdlcyggX3N0YXRzLmluZm9NZXNzYWdlcyApCisgICAgICAgICAgICAsIGl0TWVzc2FnZSggX3N0YXRzLmluZm9NZXNzYWdlcy5iZWdpbigpICkKKyAgICAgICAgICAgICwgcHJpbnRJbmZvTWVzc2FnZXMoIF9wcmludEluZm9NZXNzYWdlcyApCisgICAgICAgICAgICB7fQorCisgICAgICAgICAgICB2b2lkIHByaW50KCkgeworICAgICAgICAgICAgICAgIHByaW50U291cmNlSW5mbygpOworCisgICAgICAgICAgICAgICAgaXRNZXNzYWdlID0gbWVzc2FnZXMuYmVnaW4oKTsKKworICAgICAgICAgICAgICAgIHN3aXRjaCggcmVzdWx0LmdldFJlc3VsdFR5cGUoKSApIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6Ok9rOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRSZXN1bHRUeXBlKCBDb2xvdXI6OlJlc3VsdFN1Y2Nlc3MsIHBhc3NlZFN0cmluZygpICk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludE9yaWdpbmFsRXhwcmVzc2lvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRSZWNvbnN0cnVjdGVkRXhwcmVzc2lvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAhIHJlc3VsdC5oYXNFeHByZXNzaW9uKCkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50UmVtYWluaW5nTWVzc2FnZXMoIENvbG91cjo6Tm9uZSApOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50UmVtYWluaW5nTWVzc2FnZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6RXhwcmVzc2lvbkZhaWxlZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCByZXN1bHQuaXNPaygpICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludFJlc3VsdFR5cGUoIENvbG91cjo6UmVzdWx0U3VjY2VzcywgZmFpbGVkU3RyaW5nKCkgKyBzdGQ6OnN0cmluZyggIiAtIGJ1dCB3YXMgb2siICkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludFJlc3VsdFR5cGUoIENvbG91cjo6RXJyb3IsIGZhaWxlZFN0cmluZygpICk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludE9yaWdpbmFsRXhwcmVzc2lvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRSZWNvbnN0cnVjdGVkRXhwcmVzc2lvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRSZW1haW5pbmdNZXNzYWdlcygpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpUaHJld0V4Y2VwdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50UmVzdWx0VHlwZSggQ29sb3VyOjpFcnJvciwgZmFpbGVkU3RyaW5nKCkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50SXNzdWUoICJ1bmV4cGVjdGVkIGV4Y2VwdGlvbiB3aXRoIG1lc3NhZ2U6IiApOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRNZXNzYWdlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludEV4cHJlc3Npb25XYXMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50UmVtYWluaW5nTWVzc2FnZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6RmF0YWxFcnJvckNvbmRpdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50UmVzdWx0VHlwZSggQ29sb3VyOjpFcnJvciwgZmFpbGVkU3RyaW5nKCkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50SXNzdWUoICJmYXRhbCBlcnJvciBjb25kaXRpb24gd2l0aCBtZXNzYWdlOiIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50TWVzc2FnZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRFeHByZXNzaW9uV2FzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludFJlbWFpbmluZ01lc3NhZ2VzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OkRpZG50VGhyb3dFeGNlcHRpb246CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludFJlc3VsdFR5cGUoIENvbG91cjo6RXJyb3IsIGZhaWxlZFN0cmluZygpICk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludElzc3VlKCAiZXhwZWN0ZWQgZXhjZXB0aW9uLCBnb3Qgbm9uZSIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50RXhwcmVzc2lvbldhcygpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRSZW1haW5pbmdNZXNzYWdlcygpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpJbmZvOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRSZXN1bHRUeXBlKCBDb2xvdXI6Ok5vbmUsICJpbmZvIiApOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRNZXNzYWdlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludFJlbWFpbmluZ01lc3NhZ2VzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6Oldhcm5pbmc6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludFJlc3VsdFR5cGUoIENvbG91cjo6Tm9uZSwgIndhcm5pbmciICk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludE1lc3NhZ2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50UmVtYWluaW5nTWVzc2FnZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6RXhwbGljaXRGYWlsdXJlOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRSZXN1bHRUeXBlKCBDb2xvdXI6OkVycm9yLCBmYWlsZWRTdHJpbmcoKSApOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRJc3N1ZSggImV4cGxpY2l0bHkiICk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludFJlbWFpbmluZ01lc3NhZ2VzKCBDb2xvdXI6Ok5vbmUgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAvLyBUaGVzZSBjYXNlcyBhcmUgaGVyZSB0byBwcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzCisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpVbmtub3duOgorICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6RmFpbHVyZUJpdDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OkV4Y2VwdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50UmVzdWx0VHlwZSggQ29sb3VyOjpFcnJvciwgIioqIGludGVybmFsIGVycm9yICoqIiApOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgIHByaXZhdGU6CisgICAgICAgICAgICAvLyBDb2xvdXI6OkxpZ2h0R3JleQorCisgICAgICAgICAgICBzdGF0aWMgQ29sb3VyOjpDb2RlIGRpbUNvbG91cigpIHsgcmV0dXJuIENvbG91cjo6RmlsZU5hbWU7IH0KKworI2lmZGVmIENBVENIX1BMQVRGT1JNX01BQworICAgICAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIqIGZhaWxlZFN0cmluZygpIHsgcmV0dXJuICJGQUlMRUQiOyB9CisgICAgICAgICAgICBzdGF0aWMgY29uc3QgY2hhciogcGFzc2VkU3RyaW5nKCkgeyByZXR1cm4gIlBBU1NFRCI7IH0KKyNlbHNlCisgICAgICAgICAgICBzdGF0aWMgY29uc3QgY2hhciogZmFpbGVkU3RyaW5nKCkgeyByZXR1cm4gImZhaWxlZCI7IH0KKyAgICAgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyKiBwYXNzZWRTdHJpbmcoKSB7IHJldHVybiAicGFzc2VkIjsgfQorI2VuZGlmCisKKyAgICAgICAgICAgIHZvaWQgcHJpbnRTb3VyY2VJbmZvKCkgY29uc3QgeworICAgICAgICAgICAgICAgIENvbG91ciBjb2xvdXJHdWFyZCggQ29sb3VyOjpGaWxlTmFtZSApOworICAgICAgICAgICAgICAgIHN0cmVhbSA8PCByZXN1bHQuZ2V0U291cmNlSW5mbygpIDw8ICc6JzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdm9pZCBwcmludFJlc3VsdFR5cGUoIENvbG91cjo6Q29kZSBjb2xvdXIsIHN0ZDo6c3RyaW5nIGNvbnN0JiBwYXNzT3JGYWlsICkgY29uc3QgeworICAgICAgICAgICAgICAgIGlmKCAhcGFzc09yRmFpbC5lbXB0eSgpICkgeworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDb2xvdXIgY29sb3VyR3VhcmQoIGNvbG91ciApOworICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIDw8ICcgJyA8PCBwYXNzT3JGYWlsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCAnOic7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2b2lkIHByaW50SXNzdWUoIHN0ZDo6c3RyaW5nIGNvbnN0JiBpc3N1ZSApIGNvbnN0IHsKKyAgICAgICAgICAgICAgICBzdHJlYW0gPDwgJyAnIDw8IGlzc3VlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2b2lkIHByaW50RXhwcmVzc2lvbldhcygpIHsKKyAgICAgICAgICAgICAgICBpZiggcmVzdWx0Lmhhc0V4cHJlc3Npb24oKSApIHsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtIDw8ICc7JzsKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3VyIGNvbG91ciggZGltQ29sb3VyKCkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCAiIGV4cHJlc3Npb24gd2FzOiI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHJpbnRPcmlnaW5hbEV4cHJlc3Npb24oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZvaWQgcHJpbnRPcmlnaW5hbEV4cHJlc3Npb24oKSBjb25zdCB7CisgICAgICAgICAgICAgICAgaWYoIHJlc3VsdC5oYXNFeHByZXNzaW9uKCkgKSB7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCAnICcgPDwgcmVzdWx0LmdldEV4cHJlc3Npb24oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZvaWQgcHJpbnRSZWNvbnN0cnVjdGVkRXhwcmVzc2lvbigpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICBpZiggcmVzdWx0Lmhhc0V4cGFuZGVkRXhwcmVzc2lvbigpICkgeworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDb2xvdXIgY29sb3VyKCBkaW1Db2xvdXIoKSApOworICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIDw8ICIgZm9yOiAiOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCByZXN1bHQuZ2V0RXhwYW5kZWRFeHByZXNzaW9uKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2b2lkIHByaW50TWVzc2FnZSgpIHsKKyAgICAgICAgICAgICAgICBpZiAoIGl0TWVzc2FnZSAhPSBtZXNzYWdlcy5lbmQoKSApIHsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtIDw8ICIgJyIgPDwgaXRNZXNzYWdlLT5tZXNzYWdlIDw8ICdcJyc7CisgICAgICAgICAgICAgICAgICAgICsraXRNZXNzYWdlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdm9pZCBwcmludFJlbWFpbmluZ01lc3NhZ2VzKCBDb2xvdXI6OkNvZGUgY29sb3VyID0gZGltQ29sb3VyKCkgKSB7CisgICAgICAgICAgICAgICAgaWYgKCBpdE1lc3NhZ2UgPT0gbWVzc2FnZXMuZW5kKCkgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgICAgICAvLyB1c2luZyBtZXNzYWdlcy5lbmQoKSBkaXJlY3RseSB5aWVsZHMgY29tcGlsYXRpb24gZXJyb3I6CisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8TWVzc2FnZUluZm8+Ojpjb25zdF9pdGVyYXRvciBpdEVuZCA9IG1lc3NhZ2VzLmVuZCgpOworICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2l6ZV90IE4gPSBzdGF0aWNfY2FzdDxzdGQ6OnNpemVfdD4oIHN0ZDo6ZGlzdGFuY2UoIGl0TWVzc2FnZSwgaXRFbmQgKSApOworCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb2xvdXIgY29sb3VyR3VhcmQoIGNvbG91ciApOworICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPDwgIiB3aXRoICIgPDwgcGx1cmFsaXNlKCBOLCAibWVzc2FnZSIgKSA8PCAnOic7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yKDsgaXRNZXNzYWdlICE9IGl0RW5kOyApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBhc3NlcnRpb24gaXMgYSB3YXJuaW5nIGlnbm9yZSBhbnkgSU5GTyBtZXNzYWdlcworICAgICAgICAgICAgICAgICAgICBpZiggcHJpbnRJbmZvTWVzc2FnZXMgfHwgaXRNZXNzYWdlLT50eXBlICE9IFJlc3VsdFdhczo6SW5mbyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCAiICciIDw8IGl0TWVzc2FnZS0+bWVzc2FnZSA8PCAnXCcnOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCArK2l0TWVzc2FnZSAhPSBpdEVuZCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xvdXIgY29sb3VyR3VhcmQoIGRpbUNvbG91cigpICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIDw8ICIgYW5kIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICBwcml2YXRlOgorICAgICAgICAgICAgc3RkOjpvc3RyZWFtJiBzdHJlYW07CisgICAgICAgICAgICBBc3NlcnRpb25TdGF0cyBjb25zdCYgc3RhdHM7CisgICAgICAgICAgICBBc3NlcnRpb25SZXN1bHQgY29uc3QmIHJlc3VsdDsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPE1lc3NhZ2VJbmZvPiBtZXNzYWdlczsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPE1lc3NhZ2VJbmZvPjo6Y29uc3RfaXRlcmF0b3IgaXRNZXNzYWdlOworICAgICAgICAgICAgYm9vbCBwcmludEluZm9NZXNzYWdlczsKKyAgICAgICAgfTsKKworICAgICAgICAvLyBDb2xvdXIsIG1lc3NhZ2UgdmFyaWFudHM6CisgICAgICAgIC8vIC0gd2hpdGU6IE5vIHRlc3RzIHJhbi4KKyAgICAgICAgLy8gLSAgIHJlZDogRmFpbGVkIFtib3RoL2FsbF0gTiB0ZXN0IGNhc2VzLCBmYWlsZWQgW2JvdGgvYWxsXSBNIGFzc2VydGlvbnMuCisgICAgICAgIC8vIC0gd2hpdGU6IFBhc3NlZCBbYm90aC9hbGxdIE4gdGVzdCBjYXNlcyAobm8gYXNzZXJ0aW9ucykuCisgICAgICAgIC8vIC0gICByZWQ6IEZhaWxlZCBOIHRlc3RzIGNhc2VzLCBmYWlsZWQgTSBhc3NlcnRpb25zLgorICAgICAgICAvLyAtIGdyZWVuOiBQYXNzZWQgW2JvdGgvYWxsXSBOIHRlc3RzIGNhc2VzIHdpdGggTSBhc3NlcnRpb25zLgorCisgICAgICAgIHN0ZDo6c3RyaW5nIGJvdGhPckFsbCggc3RkOjpzaXplX3QgY291bnQgKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gY291bnQgPT0gMSA/IHN0ZDo6c3RyaW5nKCkgOiBjb3VudCA9PSAyID8gImJvdGggIiA6ICJhbGwgIiA7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHByaW50VG90YWxzKCBjb25zdCBUb3RhbHMmIHRvdGFscyApIGNvbnN0IHsKKyAgICAgICAgICAgIGlmKCB0b3RhbHMudGVzdENhc2VzLnRvdGFsKCkgPT0gMCApIHsKKyAgICAgICAgICAgICAgICBzdHJlYW0gPDwgIk5vIHRlc3RzIHJhbi4iOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggdG90YWxzLnRlc3RDYXNlcy5mYWlsZWQgPT0gdG90YWxzLnRlc3RDYXNlcy50b3RhbCgpICkgeworICAgICAgICAgICAgICAgIENvbG91ciBjb2xvdXIoIENvbG91cjo6UmVzdWx0RXJyb3IgKTsKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyBxdWFsaWZ5X2Fzc2VydGlvbnNfZmFpbGVkID0KKyAgICAgICAgICAgICAgICAgICAgdG90YWxzLmFzc2VydGlvbnMuZmFpbGVkID09IHRvdGFscy5hc3NlcnRpb25zLnRvdGFsKCkgPworICAgICAgICAgICAgICAgICAgICAgICAgYm90aE9yQWxsKCB0b3RhbHMuYXNzZXJ0aW9ucy5mYWlsZWQgKSA6IHN0ZDo6c3RyaW5nKCk7CisgICAgICAgICAgICAgICAgc3RyZWFtIDw8CisgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgIiA8PCBib3RoT3JBbGwoIHRvdGFscy50ZXN0Q2FzZXMuZmFpbGVkICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHBsdXJhbGlzZSggdG90YWxzLnRlc3RDYXNlcy5mYWlsZWQsICJ0ZXN0IGNhc2UiICApIDw8ICIsICIKKyAgICAgICAgICAgICAgICAgICAgImZhaWxlZCAiIDw8IHF1YWxpZnlfYXNzZXJ0aW9uc19mYWlsZWQgPDwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdXJhbGlzZSggdG90YWxzLmFzc2VydGlvbnMuZmFpbGVkLCAiYXNzZXJ0aW9uIiApIDw8ICcuJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoIHRvdGFscy5hc3NlcnRpb25zLnRvdGFsKCkgPT0gMCApIHsKKyAgICAgICAgICAgICAgICBzdHJlYW0gPDwKKyAgICAgICAgICAgICAgICAgICAgIlBhc3NlZCAiIDw8IGJvdGhPckFsbCggdG90YWxzLnRlc3RDYXNlcy50b3RhbCgpICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHBsdXJhbGlzZSggdG90YWxzLnRlc3RDYXNlcy50b3RhbCgpLCAidGVzdCBjYXNlIiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIChubyBhc3NlcnRpb25zKS4iOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggdG90YWxzLmFzc2VydGlvbnMuZmFpbGVkICkgeworICAgICAgICAgICAgICAgIENvbG91ciBjb2xvdXIoIENvbG91cjo6UmVzdWx0RXJyb3IgKTsKKyAgICAgICAgICAgICAgICBzdHJlYW0gPDwKKyAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCAiIDw8IHBsdXJhbGlzZSggdG90YWxzLnRlc3RDYXNlcy5mYWlsZWQsICJ0ZXN0IGNhc2UiICApIDw8ICIsICIKKyAgICAgICAgICAgICAgICAgICAgImZhaWxlZCAiIDw8IHBsdXJhbGlzZSggdG90YWxzLmFzc2VydGlvbnMuZmFpbGVkLCAiYXNzZXJ0aW9uIiApIDw8ICcuJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIENvbG91ciBjb2xvdXIoIENvbG91cjo6UmVzdWx0U3VjY2VzcyApOworICAgICAgICAgICAgICAgIHN0cmVhbSA8PAorICAgICAgICAgICAgICAgICAgICAiUGFzc2VkICIgPDwgYm90aE9yQWxsKCB0b3RhbHMudGVzdENhc2VzLnBhc3NlZCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBwbHVyYWxpc2UoIHRvdGFscy50ZXN0Q2FzZXMucGFzc2VkLCAidGVzdCBjYXNlIiAgKSA8PAorICAgICAgICAgICAgICAgICAgICAiIHdpdGggIiAgPDwgcGx1cmFsaXNlKCB0b3RhbHMuYXNzZXJ0aW9ucy5wYXNzZWQsICJhc3NlcnRpb24iICkgPDwgJy4nOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKworICAgIElOVEVSTkFMX0NBVENIX1JFR0lTVEVSX1JFUE9SVEVSKCAiY29tcGFjdCIsIENvbXBhY3RSZXBvcnRlciApCisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCituYW1lc3BhY2UgQ2F0Y2ggeworICAgIC8vIFRoZXNlIGFyZSBhbGwgaGVyZSB0byBhdm9pZCB3YXJuaW5ncyBhYm91dCBub3QgaGF2aW5nIGFueSBvdXQgb2YgbGluZQorICAgIC8vIHZpcnR1YWwgbWV0aG9kcworICAgIE5vbkNvcHlhYmxlOjp+Tm9uQ29weWFibGUoKSB7fQorICAgIElTaGFyZWQ6On5JU2hhcmVkKCkge30KKyAgICBJU3RyZWFtOjp+SVN0cmVhbSgpIENBVENIX05PRVhDRVBUIHt9CisgICAgRmlsZVN0cmVhbTo6fkZpbGVTdHJlYW0oKSBDQVRDSF9OT0VYQ0VQVCB7fQorICAgIENvdXRTdHJlYW06On5Db3V0U3RyZWFtKCkgQ0FUQ0hfTk9FWENFUFQge30KKyAgICBEZWJ1Z091dFN0cmVhbTo6fkRlYnVnT3V0U3RyZWFtKCkgQ0FUQ0hfTk9FWENFUFQge30KKyAgICBTdHJlYW1CdWZCYXNlOjp+U3RyZWFtQnVmQmFzZSgpIENBVENIX05PRVhDRVBUIHt9CisgICAgSUNvbnRleHQ6On5JQ29udGV4dCgpIHt9CisgICAgSVJlc3VsdENhcHR1cmU6On5JUmVzdWx0Q2FwdHVyZSgpIHt9CisgICAgSVRlc3RDYXNlOjp+SVRlc3RDYXNlKCkge30KKyAgICBJVGVzdENhc2VSZWdpc3RyeTo6fklUZXN0Q2FzZVJlZ2lzdHJ5KCkge30KKyAgICBJUmVnaXN0cnlIdWI6On5JUmVnaXN0cnlIdWIoKSB7fQorICAgIElNdXRhYmxlUmVnaXN0cnlIdWI6On5JTXV0YWJsZVJlZ2lzdHJ5SHViKCkge30KKyAgICBJRXhjZXB0aW9uVHJhbnNsYXRvcjo6fklFeGNlcHRpb25UcmFuc2xhdG9yKCkge30KKyAgICBJRXhjZXB0aW9uVHJhbnNsYXRvclJlZ2lzdHJ5Ojp+SUV4Y2VwdGlvblRyYW5zbGF0b3JSZWdpc3RyeSgpIHt9CisgICAgSVJlcG9ydGVyOjp+SVJlcG9ydGVyKCkge30KKyAgICBJUmVwb3J0ZXJGYWN0b3J5Ojp+SVJlcG9ydGVyRmFjdG9yeSgpIHt9CisgICAgSVJlcG9ydGVyUmVnaXN0cnk6On5JUmVwb3J0ZXJSZWdpc3RyeSgpIHt9CisgICAgSVN0cmVhbWluZ1JlcG9ydGVyOjp+SVN0cmVhbWluZ1JlcG9ydGVyKCkge30KKyAgICBBc3NlcnRpb25TdGF0czo6fkFzc2VydGlvblN0YXRzKCkge30KKyAgICBTZWN0aW9uU3RhdHM6On5TZWN0aW9uU3RhdHMoKSB7fQorICAgIFRlc3RDYXNlU3RhdHM6On5UZXN0Q2FzZVN0YXRzKCkge30KKyAgICBUZXN0R3JvdXBTdGF0czo6flRlc3RHcm91cFN0YXRzKCkge30KKyAgICBUZXN0UnVuU3RhdHM6On5UZXN0UnVuU3RhdHMoKSB7fQorICAgIEN1bXVsYXRpdmVSZXBvcnRlckJhc2U6OlNlY3Rpb25Ob2RlOjp+U2VjdGlvbk5vZGUoKSB7fQorICAgIEN1bXVsYXRpdmVSZXBvcnRlckJhc2U6On5DdW11bGF0aXZlUmVwb3J0ZXJCYXNlKCkge30KKworICAgIFN0cmVhbWluZ1JlcG9ydGVyQmFzZTo6flN0cmVhbWluZ1JlcG9ydGVyQmFzZSgpIHt9CisgICAgQ29uc29sZVJlcG9ydGVyOjp+Q29uc29sZVJlcG9ydGVyKCkge30KKyAgICBDb21wYWN0UmVwb3J0ZXI6On5Db21wYWN0UmVwb3J0ZXIoKSB7fQorICAgIElSdW5uZXI6On5JUnVubmVyKCkge30KKyAgICBJTXV0YWJsZUNvbnRleHQ6On5JTXV0YWJsZUNvbnRleHQoKSB7fQorICAgIElDb25maWc6On5JQ29uZmlnKCkge30KKyAgICBYbWxSZXBvcnRlcjo6flhtbFJlcG9ydGVyKCkge30KKyAgICBKdW5pdFJlcG9ydGVyOjp+SnVuaXRSZXBvcnRlcigpIHt9CisgICAgVGVzdFJlZ2lzdHJ5Ojp+VGVzdFJlZ2lzdHJ5KCkge30KKyAgICBGcmVlRnVuY3Rpb25UZXN0Q2FzZTo6fkZyZWVGdW5jdGlvblRlc3RDYXNlKCkge30KKyAgICBJR2VuZXJhdG9ySW5mbzo6fklHZW5lcmF0b3JJbmZvKCkge30KKyAgICBJR2VuZXJhdG9yc0ZvclRlc3Q6On5JR2VuZXJhdG9yc0ZvclRlc3QoKSB7fQorICAgIFdpbGRjYXJkUGF0dGVybjo6fldpbGRjYXJkUGF0dGVybigpIHt9CisgICAgVGVzdFNwZWM6OlBhdHRlcm46On5QYXR0ZXJuKCkge30KKyAgICBUZXN0U3BlYzo6TmFtZVBhdHRlcm46On5OYW1lUGF0dGVybigpIHt9CisgICAgVGVzdFNwZWM6OlRhZ1BhdHRlcm46On5UYWdQYXR0ZXJuKCkge30KKyAgICBUZXN0U3BlYzo6RXhjbHVkZWRQYXR0ZXJuOjp+RXhjbHVkZWRQYXR0ZXJuKCkge30KKyAgICBNYXRjaGVyczo6SW1wbDo6TWF0Y2hlclVudHlwZWRCYXNlOjp+TWF0Y2hlclVudHlwZWRCYXNlKCkge30KKworICAgIHZvaWQgQ29uZmlnOjpkdW1teSgpIHt9CisKKyAgICBuYW1lc3BhY2UgVGVzdENhc2VUcmFja2luZyB7CisgICAgICAgIElUcmFja2VyOjp+SVRyYWNrZXIoKSB7fQorICAgICAgICBUcmFja2VyQmFzZTo6flRyYWNrZXJCYXNlKCkge30KKyAgICAgICAgU2VjdGlvblRyYWNrZXI6On5TZWN0aW9uVHJhY2tlcigpIHt9CisgICAgICAgIEluZGV4VHJhY2tlcjo6fkluZGV4VHJhY2tlcigpIHt9CisgICAgfQorfQorCisjaWZkZWYgX19jbGFuZ19fCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCisjZW5kaWYKKworI2VuZGlmCisKKyNpZmRlZiBDQVRDSF9DT05GSUdfTUFJTgorLy8gI2luY2x1ZGVkIGZyb206IGludGVybmFsL2NhdGNoX2RlZmF1bHRfbWFpbi5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0RFRkFVTFRfTUFJTl9IUFBfSU5DTFVERUQKKworI2lmbmRlZiBfX09CSkNfXworCisjaWYgZGVmaW5lZChXSU4zMikgJiYgZGVmaW5lZChfVU5JQ09ERSkgJiYgIWRlZmluZWQoRE9fTk9UX1VTRV9XTUFJTikKKy8vIFN0YW5kYXJkIEMvQysrIFdpbjMyIFVuaWNvZGUgd21haW4gZW50cnkgcG9pbnQKK2V4dGVybiAiQyIgaW50IHdtYWluIChpbnQgYXJnYywgd2NoYXJfdCAqIGFyZ3ZbXSwgd2NoYXJfdCAqIFtdKSB7CisjZWxzZQorLy8gU3RhbmRhcmQgQy9DKysgbWFpbiBlbnRyeSBwb2ludAoraW50IG1haW4gKGludCBhcmdjLCBjaGFyICogYXJndltdKSB7CisjZW5kaWYKKworCWludCByZXN1bHQgPSBDYXRjaDo6U2Vzc2lvbigpLnJ1biggYXJnYywgYXJndiApOworICAgIHJldHVybiAoIHJlc3VsdCA8IDB4ZmYgPyByZXN1bHQgOiAweGZmICk7Cit9CisKKyNlbHNlIC8vIF9fT0JKQ19fCisKKy8vIE9iamVjdGl2ZS1DIGVudHJ5IHBvaW50CitpbnQgbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pIHsKKyNpZiAhQ0FUQ0hfQVJDX0VOQUJMRUQKKyAgICBOU0F1dG9yZWxlYXNlUG9vbCAqIHBvb2wgPSBbW05TQXV0b3JlbGVhc2VQb29sIGFsbG9jXSBpbml0XTsKKyNlbmRpZgorCisgICAgQ2F0Y2g6OnJlZ2lzdGVyVGVzdE1ldGhvZHMoKTsKKyAgICBpbnQgcmVzdWx0ID0gQ2F0Y2g6OlNlc3Npb24oKS5ydW4oIGFyZ2MsIChjaGFyKiBjb25zdCopYXJndiApOworCisjaWYgIUNBVENIX0FSQ19FTkFCTEVECisgICAgW3Bvb2wgZHJhaW5dOworI2VuZGlmCisKKyAgICByZXR1cm4gKCByZXN1bHQgPCAweGZmID8gcmVzdWx0IDogMHhmZiApOworfQorCisjZW5kaWYgLy8gX19PQkpDX18KKworI2VuZGlmCisKKyNpZmRlZiBDTEFSQV9DT05GSUdfTUFJTl9OT1RfREVGSU5FRAorIyAgdW5kZWYgQ0xBUkFfQ09ORklHX01BSU4KKyNlbmRpZgorCisvLy8vLy8KKworLy8gSWYgdGhpcyBjb25maWcgaWRlbnRpZmllciBpcyBkZWZpbmVkIHRoZW4gYWxsIENBVENIIG1hY3JvcyBhcmUgcHJlZml4ZWQgd2l0aCBDQVRDSF8KKyNpZmRlZiBDQVRDSF9DT05GSUdfUFJFRklYX0FMTAorCisjaWYgZGVmaW5lZChDQVRDSF9DT05GSUdfRkFTVF9DT01QSUxFKQorI2RlZmluZSBDQVRDSF9SRVFVSVJFKCBleHByICkgSU5URVJOQUxfQ0FUQ0hfVEVTVF9OT19UUlkoICJDQVRDSF9SRVFVSVJFIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwsIGV4cHIgKQorI2RlZmluZSBDQVRDSF9SRVFVSVJFX0ZBTFNFKCBleHByICkgSU5URVJOQUxfQ0FUQ0hfVEVTVF9OT19UUlkoICJDQVRDSF9SRVFVSVJFX0ZBTFNFIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwgfCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkZhbHNlVGVzdCwgZXhwciApCisjZWxzZQorI2RlZmluZSBDQVRDSF9SRVFVSVJFKCBleHByICkgSU5URVJOQUxfQ0FUQ0hfVEVTVCggIkNBVENIX1JFUVVJUkUiLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCwgZXhwciApCisjZGVmaW5lIENBVENIX1JFUVVJUkVfRkFMU0UoIGV4cHIgKSBJTlRFUk5BTF9DQVRDSF9URVNUKCAiQ0FUQ0hfUkVRVUlSRV9GQUxTRSIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsIHwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpGYWxzZVRlc3QsIGV4cHIgICkKKyNlbmRpZgorCisjZGVmaW5lIENBVENIX1JFUVVJUkVfVEhST1dTKCBleHByICkgSU5URVJOQUxfQ0FUQ0hfVEhST1dTKCAiQ0FUQ0hfUkVRVUlSRV9USFJPV1MiLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCwgIiIsIGV4cHIgKQorI2RlZmluZSBDQVRDSF9SRVFVSVJFX1RIUk9XU19BUyggZXhwciwgZXhjZXB0aW9uVHlwZSApIElOVEVSTkFMX0NBVENIX1RIUk9XU19BUyggIkNBVENIX1JFUVVJUkVfVEhST1dTX0FTIiwgZXhjZXB0aW9uVHlwZSwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwsIGV4cHIgKQorI2RlZmluZSBDQVRDSF9SRVFVSVJFX1RIUk9XU19XSVRIKCBleHByLCBtYXRjaGVyICkgSU5URVJOQUxfQ0FUQ0hfVEhST1dTKCAiQ0FUQ0hfUkVRVUlSRV9USFJPV1NfV0lUSCIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsLCBtYXRjaGVyLCBleHByICkKKyNkZWZpbmUgQ0FUQ0hfUkVRVUlSRV9OT1RIUk9XKCBleHByICkgSU5URVJOQUxfQ0FUQ0hfTk9fVEhST1coICJDQVRDSF9SRVFVSVJFX05PVEhST1ciLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCwgZXhwciApCisKKyNkZWZpbmUgQ0FUQ0hfQ0hFQ0soIGV4cHIgKSBJTlRFUk5BTF9DQVRDSF9URVNUKCAiQ0FUQ0hfQ0hFQ0siLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlLCBleHByICkKKyNkZWZpbmUgQ0FUQ0hfQ0hFQ0tfRkFMU0UoIGV4cHIgKSBJTlRFUk5BTF9DQVRDSF9URVNUKCAiQ0FUQ0hfQ0hFQ0tfRkFMU0UiLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlIHwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpGYWxzZVRlc3QsIGV4cHIgKQorI2RlZmluZSBDQVRDSF9DSEVDS0VEX0lGKCBleHByICkgSU5URVJOQUxfQ0FUQ0hfSUYoICJDQVRDSF9DSEVDS0VEX0lGIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgZXhwciApCisjZGVmaW5lIENBVENIX0NIRUNLRURfRUxTRSggZXhwciApIElOVEVSTkFMX0NBVENIX0VMU0UoICJDQVRDSF9DSEVDS0VEX0VMU0UiLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlLCBleHByICkKKyNkZWZpbmUgQ0FUQ0hfQ0hFQ0tfTk9GQUlMKCBleHByICkgSU5URVJOQUxfQ0FUQ0hfVEVTVCggIkNBVENIX0NIRUNLX05PRkFJTCIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUgfCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OlN1cHByZXNzRmFpbCwgZXhwciApCisKKyNkZWZpbmUgQ0FUQ0hfQ0hFQ0tfVEhST1dTKCBleHByICkgIElOVEVSTkFMX0NBVENIX1RIUk9XUyggIkNBVENIX0NIRUNLX1RIUk9XUyIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsICIiLCBleHByICkKKyNkZWZpbmUgQ0FUQ0hfQ0hFQ0tfVEhST1dTX0FTKCBleHByLCBleGNlcHRpb25UeXBlICkgSU5URVJOQUxfQ0FUQ0hfVEhST1dTX0FTKCAiQ0FUQ0hfQ0hFQ0tfVEhST1dTX0FTIiwgZXhjZXB0aW9uVHlwZSwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgZXhwciApCisjZGVmaW5lIENBVENIX0NIRUNLX1RIUk9XU19XSVRIKCBleHByLCBtYXRjaGVyICkgSU5URVJOQUxfQ0FUQ0hfVEhST1dTKCAiQ0FUQ0hfQ0hFQ0tfVEhST1dTX1dJVEgiLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlLCBtYXRjaGVyLCBleHByICkKKyNkZWZpbmUgQ0FUQ0hfQ0hFQ0tfTk9USFJPVyggZXhwciApIElOVEVSTkFMX0NBVENIX05PX1RIUk9XKCAiQ0FUQ0hfQ0hFQ0tfTk9USFJPVyIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsIGV4cHIgKQorCisjZGVmaW5lIENBVENIX0NIRUNLX1RIQVQoIGFyZywgbWF0Y2hlciApIElOVEVSTkFMX0NIRUNLX1RIQVQoICJDQVRDSF9DSEVDS19USEFUIiwgbWF0Y2hlciwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgYXJnICkKKworI2lmIGRlZmluZWQoQ0FUQ0hfQ09ORklHX0ZBU1RfQ09NUElMRSkKKyNkZWZpbmUgQ0FUQ0hfUkVRVUlSRV9USEFUKCBhcmcsIG1hdGNoZXIgKSBJTlRFUk5BTF9DSEVDS19USEFUX05PX1RSWSggIkNBVENIX1JFUVVJUkVfVEhBVCIsIG1hdGNoZXIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsLCBhcmcgKQorI2Vsc2UKKyNkZWZpbmUgQ0FUQ0hfUkVRVUlSRV9USEFUKCBhcmcsIG1hdGNoZXIgKSBJTlRFUk5BTF9DSEVDS19USEFUKCAiQ0FUQ0hfUkVRVUlSRV9USEFUIiwgbWF0Y2hlciwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwsIGFyZyApCisjZW5kaWYKKworI2RlZmluZSBDQVRDSF9JTkZPKCBtc2cgKSBJTlRFUk5BTF9DQVRDSF9JTkZPKCAiQ0FUQ0hfSU5GTyIsIG1zZyApCisjZGVmaW5lIENBVENIX1dBUk4oIG1zZyApIElOVEVSTkFMX0NBVENIX01TRyggIkNBVENIX1dBUk4iLCBDYXRjaDo6UmVzdWx0V2FzOjpXYXJuaW5nLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlLCBtc2cgKQorI2RlZmluZSBDQVRDSF9TQ09QRURfSU5GTyggbXNnICkgSU5URVJOQUxfQ0FUQ0hfSU5GTyggIkNBVENIX0lORk8iLCBtc2cgKQorI2RlZmluZSBDQVRDSF9DQVBUVVJFKCBtc2cgKSBJTlRFUk5BTF9DQVRDSF9JTkZPKCAiQ0FUQ0hfQ0FQVFVSRSIsICNtc2cgIiA6PSAiIDw8IENhdGNoOjp0b1N0cmluZyhtc2cpICkKKyNkZWZpbmUgQ0FUQ0hfU0NPUEVEX0NBUFRVUkUoIG1zZyApIElOVEVSTkFMX0NBVENIX0lORk8oICJDQVRDSF9DQVBUVVJFIiwgI21zZyAiIDo9ICIgPDwgQ2F0Y2g6OnRvU3RyaW5nKG1zZykgKQorCisjaWZkZWYgQ0FUQ0hfQ09ORklHX1ZBUklBRElDX01BQ1JPUworICAgICNkZWZpbmUgQ0FUQ0hfVEVTVF9DQVNFKCAuLi4gKSBJTlRFUk5BTF9DQVRDSF9URVNUQ0FTRSggX19WQV9BUkdTX18gKQorICAgICNkZWZpbmUgQ0FUQ0hfVEVTVF9DQVNFX01FVEhPRCggY2xhc3NOYW1lLCAuLi4gKSBJTlRFUk5BTF9DQVRDSF9URVNUX0NBU0VfTUVUSE9EKCBjbGFzc05hbWUsIF9fVkFfQVJHU19fICkKKyAgICAjZGVmaW5lIENBVENIX01FVEhPRF9BU19URVNUX0NBU0UoIG1ldGhvZCwgLi4uICkgSU5URVJOQUxfQ0FUQ0hfTUVUSE9EX0FTX1RFU1RfQ0FTRSggbWV0aG9kLCBfX1ZBX0FSR1NfXyApCisgICAgI2RlZmluZSBDQVRDSF9SRUdJU1RFUl9URVNUX0NBU0UoIEZ1bmN0aW9uLCAuLi4gKSBJTlRFUk5BTF9DQVRDSF9SRUdJU1RFUl9URVNUQ0FTRSggRnVuY3Rpb24sIF9fVkFfQVJHU19fICkKKyAgICAjZGVmaW5lIENBVENIX1NFQ1RJT04oIC4uLiApIElOVEVSTkFMX0NBVENIX1NFQ1RJT04oIF9fVkFfQVJHU19fICkKKyAgICAjZGVmaW5lIENBVENIX0ZBSUwoIC4uLiApIElOVEVSTkFMX0NBVENIX01TRyggIkNBVENIX0ZBSUwiLCBDYXRjaDo6UmVzdWx0V2FzOjpFeHBsaWNpdEZhaWx1cmUsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsLCBfX1ZBX0FSR1NfXyApCisgICAgI2RlZmluZSBDQVRDSF9GQUlMX0NIRUNLKCAuLi4gKSBJTlRFUk5BTF9DQVRDSF9NU0coICJDQVRDSF9GQUlMX0NIRUNLIiwgQ2F0Y2g6OlJlc3VsdFdhczo6RXhwbGljaXRGYWlsdXJlLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlLCBfX1ZBX0FSR1NfXyApCisgICAgI2RlZmluZSBDQVRDSF9TVUNDRUVEKCAuLi4gKSBJTlRFUk5BTF9DQVRDSF9NU0coICJDQVRDSF9TVUNDRUVEIiwgQ2F0Y2g6OlJlc3VsdFdhczo6T2ssIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsIF9fVkFfQVJHU19fICkKKyNlbHNlCisgICAgI2RlZmluZSBDQVRDSF9URVNUX0NBU0UoIG5hbWUsIGRlc2NyaXB0aW9uICkgSU5URVJOQUxfQ0FUQ0hfVEVTVENBU0UoIG5hbWUsIGRlc2NyaXB0aW9uICkKKyAgICAjZGVmaW5lIENBVENIX1RFU1RfQ0FTRV9NRVRIT0QoIGNsYXNzTmFtZSwgbmFtZSwgZGVzY3JpcHRpb24gKSBJTlRFUk5BTF9DQVRDSF9URVNUX0NBU0VfTUVUSE9EKCBjbGFzc05hbWUsIG5hbWUsIGRlc2NyaXB0aW9uICkKKyAgICAjZGVmaW5lIENBVENIX01FVEhPRF9BU19URVNUX0NBU0UoIG1ldGhvZCwgbmFtZSwgZGVzY3JpcHRpb24gKSBJTlRFUk5BTF9DQVRDSF9NRVRIT0RfQVNfVEVTVF9DQVNFKCBtZXRob2QsIG5hbWUsIGRlc2NyaXB0aW9uICkKKyAgICAjZGVmaW5lIENBVENIX1JFR0lTVEVSX1RFU1RfQ0FTRSggZnVuY3Rpb24sIG5hbWUsIGRlc2NyaXB0aW9uICkgSU5URVJOQUxfQ0FUQ0hfUkVHSVNURVJfVEVTVENBU0UoIGZ1bmN0aW9uLCBuYW1lLCBkZXNjcmlwdGlvbiApCisgICAgI2RlZmluZSBDQVRDSF9TRUNUSU9OKCBuYW1lLCBkZXNjcmlwdGlvbiApIElOVEVSTkFMX0NBVENIX1NFQ1RJT04oIG5hbWUsIGRlc2NyaXB0aW9uICkKKyAgICAjZGVmaW5lIENBVENIX0ZBSUwoIG1zZyApIElOVEVSTkFMX0NBVENIX01TRyggIkNBVENIX0ZBSUwiLCBDYXRjaDo6UmVzdWx0V2FzOjpFeHBsaWNpdEZhaWx1cmUsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsLCBtc2cgKQorICAgICNkZWZpbmUgQ0FUQ0hfRkFJTF9DSEVDSyggbXNnICkgSU5URVJOQUxfQ0FUQ0hfTVNHKCAiQ0FUQ0hfRkFJTF9DSEVDSyIsIENhdGNoOjpSZXN1bHRXYXM6OkV4cGxpY2l0RmFpbHVyZSwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgbXNnICkKKyAgICAjZGVmaW5lIENBVENIX1NVQ0NFRUQoIG1zZyApIElOVEVSTkFMX0NBVENIX01TRyggIkNBVENIX1NVQ0NFRUQiLCBDYXRjaDo6UmVzdWx0V2FzOjpPaywgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgbXNnICkKKyNlbmRpZgorI2RlZmluZSBDQVRDSF9BTk9OX1RFU1RfQ0FTRSgpIElOVEVSTkFMX0NBVENIX1RFU1RDQVNFKCAiIiwgIiIgKQorCisjZGVmaW5lIENBVENIX1JFR0lTVEVSX1JFUE9SVEVSKCBuYW1lLCByZXBvcnRlclR5cGUgKSBJTlRFUk5BTF9DQVRDSF9SRUdJU1RFUl9SRVBPUlRFUiggbmFtZSwgcmVwb3J0ZXJUeXBlICkKKyNkZWZpbmUgQ0FUQ0hfUkVHSVNURVJfTEVHQUNZX1JFUE9SVEVSKCBuYW1lLCByZXBvcnRlclR5cGUgKSBJTlRFUk5BTF9DQVRDSF9SRUdJU1RFUl9MRUdBQ1lfUkVQT1JURVIoIG5hbWUsIHJlcG9ydGVyVHlwZSApCisKKyNkZWZpbmUgQ0FUQ0hfR0VORVJBVEUoIGV4cHIpIElOVEVSTkFMX0NBVENIX0dFTkVSQVRFKCBleHByICkKKworLy8gIkJERC1zdHlsZSIgY29udmVuaWVuY2Ugd3JhcHBlcnMKKyNpZmRlZiBDQVRDSF9DT05GSUdfVkFSSUFESUNfTUFDUk9TCisjZGVmaW5lIENBVENIX1NDRU5BUklPKCAuLi4gKSBDQVRDSF9URVNUX0NBU0UoICJTY2VuYXJpbzogIiBfX1ZBX0FSR1NfXyApCisjZGVmaW5lIENBVENIX1NDRU5BUklPX01FVEhPRCggY2xhc3NOYW1lLCAuLi4gKSBJTlRFUk5BTF9DQVRDSF9URVNUX0NBU0VfTUVUSE9EKCBjbGFzc05hbWUsICJTY2VuYXJpbzogIiBfX1ZBX0FSR1NfXyApCisjZWxzZQorI2RlZmluZSBDQVRDSF9TQ0VOQVJJTyggbmFtZSwgdGFncyApIENBVENIX1RFU1RfQ0FTRSggIlNjZW5hcmlvOiAiIG5hbWUsIHRhZ3MgKQorI2RlZmluZSBDQVRDSF9TQ0VOQVJJT19NRVRIT0QoIGNsYXNzTmFtZSwgbmFtZSwgdGFncyApIElOVEVSTkFMX0NBVENIX1RFU1RfQ0FTRV9NRVRIT0QoIGNsYXNzTmFtZSwgIlNjZW5hcmlvOiAiIG5hbWUsIHRhZ3MgKQorI2VuZGlmCisjZGVmaW5lIENBVENIX0dJVkVOKCBkZXNjICkgICAgQ0FUQ0hfU0VDVElPTiggc3RkOjpzdHJpbmcoICJHaXZlbjogIikgKyBkZXNjLCAiIiApCisjZGVmaW5lIENBVENIX1dIRU4oIGRlc2MgKSAgICAgQ0FUQ0hfU0VDVElPTiggc3RkOjpzdHJpbmcoICIgV2hlbjogIikgKyBkZXNjLCAiIiApCisjZGVmaW5lIENBVENIX0FORF9XSEVOKCBkZXNjICkgQ0FUQ0hfU0VDVElPTiggc3RkOjpzdHJpbmcoICIgIEFuZDogIikgKyBkZXNjLCAiIiApCisjZGVmaW5lIENBVENIX1RIRU4oIGRlc2MgKSAgICAgQ0FUQ0hfU0VDVElPTiggc3RkOjpzdHJpbmcoICIgVGhlbjogIikgKyBkZXNjLCAiIiApCisjZGVmaW5lIENBVENIX0FORF9USEVOKCBkZXNjICkgQ0FUQ0hfU0VDVElPTiggc3RkOjpzdHJpbmcoICIgIEFuZDogIikgKyBkZXNjLCAiIiApCisKKy8vIElmIENBVENIX0NPTkZJR19QUkVGSVhfQUxMIGlzIG5vdCBkZWZpbmVkIHRoZW4gdGhlIENBVENIXyBwcmVmaXggaXMgbm90IHJlcXVpcmVkCisjZWxzZQorCisjaWYgZGVmaW5lZChDQVRDSF9DT05GSUdfRkFTVF9DT01QSUxFKQorI2RlZmluZSBSRVFVSVJFKCBleHByICkgSU5URVJOQUxfQ0FUQ0hfVEVTVF9OT19UUlkoICJSRVFVSVJFIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwsIGV4cHIgKQorI2RlZmluZSBSRVFVSVJFX0ZBTFNFKCBleHByICkgSU5URVJOQUxfQ0FUQ0hfVEVTVF9OT19UUlkoICJSRVFVSVJFX0ZBTFNFIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwgfCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkZhbHNlVGVzdCwgZXhwciApCisKKyNlbHNlCisjZGVmaW5lIFJFUVVJUkUoIGV4cHIgKSBJTlRFUk5BTF9DQVRDSF9URVNUKCAiUkVRVUlSRSIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsLCBleHByICApCisjZGVmaW5lIFJFUVVJUkVfRkFMU0UoIGV4cHIgKSBJTlRFUk5BTF9DQVRDSF9URVNUKCAiUkVRVUlSRV9GQUxTRSIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsIHwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpGYWxzZVRlc3QsIGV4cHIgKQorI2VuZGlmCisKKyNkZWZpbmUgUkVRVUlSRV9USFJPV1MoIGV4cHIgKSBJTlRFUk5BTF9DQVRDSF9USFJPV1MoICJSRVFVSVJFX1RIUk9XUyIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsLCAiIiwgZXhwciApCisjZGVmaW5lIFJFUVVJUkVfVEhST1dTX0FTKCBleHByLCBleGNlcHRpb25UeXBlICkgSU5URVJOQUxfQ0FUQ0hfVEhST1dTX0FTKCAiUkVRVUlSRV9USFJPV1NfQVMiLCBleGNlcHRpb25UeXBlLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCwgZXhwciApCisjZGVmaW5lIFJFUVVJUkVfVEhST1dTX1dJVEgoIGV4cHIsIG1hdGNoZXIgKSBJTlRFUk5BTF9DQVRDSF9USFJPV1MoICJSRVFVSVJFX1RIUk9XU19XSVRIIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwsIG1hdGNoZXIsIGV4cHIgKQorI2RlZmluZSBSRVFVSVJFX05PVEhST1coIGV4cHIgKSBJTlRFUk5BTF9DQVRDSF9OT19USFJPVyggIlJFUVVJUkVfTk9USFJPVyIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsLCBleHByICkKKworI2RlZmluZSBDSEVDSyggZXhwciApIElOVEVSTkFMX0NBVENIX1RFU1QoICJDSEVDSyIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsIGV4cHIgKQorI2RlZmluZSBDSEVDS19GQUxTRSggZXhwciApIElOVEVSTkFMX0NBVENIX1RFU1QoICJDSEVDS19GQUxTRSIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUgfCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkZhbHNlVGVzdCwgZXhwciApCisjZGVmaW5lIENIRUNLRURfSUYoIGV4cHIgKSBJTlRFUk5BTF9DQVRDSF9JRiggIkNIRUNLRURfSUYiLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlLCBleHByICkKKyNkZWZpbmUgQ0hFQ0tFRF9FTFNFKCBleHByICkgSU5URVJOQUxfQ0FUQ0hfRUxTRSggIkNIRUNLRURfRUxTRSIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsIGV4cHIgKQorI2RlZmluZSBDSEVDS19OT0ZBSUwoIGV4cHIgKSBJTlRFUk5BTF9DQVRDSF9URVNUKCAiQ0hFQ0tfTk9GQUlMIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSB8IENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6U3VwcHJlc3NGYWlsLCBleHByICkKKworI2RlZmluZSBDSEVDS19USFJPV1MoIGV4cHIgKSAgSU5URVJOQUxfQ0FUQ0hfVEhST1dTKCAiQ0hFQ0tfVEhST1dTIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgIiIsIGV4cHIgKQorI2RlZmluZSBDSEVDS19USFJPV1NfQVMoIGV4cHIsIGV4Y2VwdGlvblR5cGUgKSBJTlRFUk5BTF9DQVRDSF9USFJPV1NfQVMoICJDSEVDS19USFJPV1NfQVMiLCBleGNlcHRpb25UeXBlLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlLCBleHByICkKKyNkZWZpbmUgQ0hFQ0tfVEhST1dTX1dJVEgoIGV4cHIsIG1hdGNoZXIgKSBJTlRFUk5BTF9DQVRDSF9USFJPV1MoICJDSEVDS19USFJPV1NfV0lUSCIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsIG1hdGNoZXIsIGV4cHIgKQorI2RlZmluZSBDSEVDS19OT1RIUk9XKCBleHByICkgSU5URVJOQUxfQ0FUQ0hfTk9fVEhST1coICJDSEVDS19OT1RIUk9XIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgZXhwciApCisKKyNkZWZpbmUgQ0hFQ0tfVEhBVCggYXJnLCBtYXRjaGVyICkgSU5URVJOQUxfQ0hFQ0tfVEhBVCggIkNIRUNLX1RIQVQiLCBtYXRjaGVyLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlLCBhcmcgKQorCisjaWYgZGVmaW5lZChDQVRDSF9DT05GSUdfRkFTVF9DT01QSUxFKQorI2RlZmluZSBSRVFVSVJFX1RIQVQoIGFyZywgbWF0Y2hlciApIElOVEVSTkFMX0NIRUNLX1RIQVRfTk9fVFJZKCAiUkVRVUlSRV9USEFUIiwgbWF0Y2hlciwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwsIGFyZyApCisjZWxzZQorI2RlZmluZSBSRVFVSVJFX1RIQVQoIGFyZywgbWF0Y2hlciApIElOVEVSTkFMX0NIRUNLX1RIQVQoICJSRVFVSVJFX1RIQVQiLCBtYXRjaGVyLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCwgYXJnICkKKyNlbmRpZgorCisjZGVmaW5lIElORk8oIG1zZyApIElOVEVSTkFMX0NBVENIX0lORk8oICJJTkZPIiwgbXNnICkKKyNkZWZpbmUgV0FSTiggbXNnICkgSU5URVJOQUxfQ0FUQ0hfTVNHKCAiV0FSTiIsIENhdGNoOjpSZXN1bHRXYXM6Oldhcm5pbmcsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsIG1zZyApCisjZGVmaW5lIFNDT1BFRF9JTkZPKCBtc2cgKSBJTlRFUk5BTF9DQVRDSF9JTkZPKCAiSU5GTyIsIG1zZyApCisjZGVmaW5lIENBUFRVUkUoIG1zZyApIElOVEVSTkFMX0NBVENIX0lORk8oICJDQVBUVVJFIiwgI21zZyAiIDo9ICIgPDwgQ2F0Y2g6OnRvU3RyaW5nKG1zZykgKQorI2RlZmluZSBTQ09QRURfQ0FQVFVSRSggbXNnICkgSU5URVJOQUxfQ0FUQ0hfSU5GTyggIkNBUFRVUkUiLCAjbXNnICIgOj0gIiA8PCBDYXRjaDo6dG9TdHJpbmcobXNnKSApCisKKyNpZmRlZiBDQVRDSF9DT05GSUdfVkFSSUFESUNfTUFDUk9TCisjZGVmaW5lIFRFU1RfQ0FTRSggLi4uICkgSU5URVJOQUxfQ0FUQ0hfVEVTVENBU0UoIF9fVkFfQVJHU19fICkKKyNkZWZpbmUgVEVTVF9DQVNFX01FVEhPRCggY2xhc3NOYW1lLCAuLi4gKSBJTlRFUk5BTF9DQVRDSF9URVNUX0NBU0VfTUVUSE9EKCBjbGFzc05hbWUsIF9fVkFfQVJHU19fICkKKyNkZWZpbmUgTUVUSE9EX0FTX1RFU1RfQ0FTRSggbWV0aG9kLCAuLi4gKSBJTlRFUk5BTF9DQVRDSF9NRVRIT0RfQVNfVEVTVF9DQVNFKCBtZXRob2QsIF9fVkFfQVJHU19fICkKKyNkZWZpbmUgUkVHSVNURVJfVEVTVF9DQVNFKCBGdW5jdGlvbiwgLi4uICkgSU5URVJOQUxfQ0FUQ0hfUkVHSVNURVJfVEVTVENBU0UoIEZ1bmN0aW9uLCBfX1ZBX0FSR1NfXyApCisjZGVmaW5lIFNFQ1RJT04oIC4uLiApIElOVEVSTkFMX0NBVENIX1NFQ1RJT04oIF9fVkFfQVJHU19fICkKKyNkZWZpbmUgRkFJTCggLi4uICkgSU5URVJOQUxfQ0FUQ0hfTVNHKCAiRkFJTCIsIENhdGNoOjpSZXN1bHRXYXM6OkV4cGxpY2l0RmFpbHVyZSwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwsIF9fVkFfQVJHU19fICkKKyNkZWZpbmUgRkFJTF9DSEVDSyggLi4uICkgSU5URVJOQUxfQ0FUQ0hfTVNHKCAiRkFJTF9DSEVDSyIsIENhdGNoOjpSZXN1bHRXYXM6OkV4cGxpY2l0RmFpbHVyZSwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgX19WQV9BUkdTX18gKQorI2RlZmluZSBTVUNDRUVEKCAuLi4gKSBJTlRFUk5BTF9DQVRDSF9NU0coICJTVUNDRUVEIiwgQ2F0Y2g6OlJlc3VsdFdhczo6T2ssIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsIF9fVkFfQVJHU19fICkKKyNlbHNlCisjZGVmaW5lIFRFU1RfQ0FTRSggbmFtZSwgZGVzY3JpcHRpb24gKSBJTlRFUk5BTF9DQVRDSF9URVNUQ0FTRSggbmFtZSwgZGVzY3JpcHRpb24gKQorICAgICNkZWZpbmUgVEVTVF9DQVNFX01FVEhPRCggY2xhc3NOYW1lLCBuYW1lLCBkZXNjcmlwdGlvbiApIElOVEVSTkFMX0NBVENIX1RFU1RfQ0FTRV9NRVRIT0QoIGNsYXNzTmFtZSwgbmFtZSwgZGVzY3JpcHRpb24gKQorICAgICNkZWZpbmUgTUVUSE9EX0FTX1RFU1RfQ0FTRSggbWV0aG9kLCBuYW1lLCBkZXNjcmlwdGlvbiApIElOVEVSTkFMX0NBVENIX01FVEhPRF9BU19URVNUX0NBU0UoIG1ldGhvZCwgbmFtZSwgZGVzY3JpcHRpb24gKQorICAgICNkZWZpbmUgUkVHSVNURVJfVEVTVF9DQVNFKCBtZXRob2QsIG5hbWUsIGRlc2NyaXB0aW9uICkgSU5URVJOQUxfQ0FUQ0hfUkVHSVNURVJfVEVTVENBU0UoIG1ldGhvZCwgbmFtZSwgZGVzY3JpcHRpb24gKQorICAgICNkZWZpbmUgU0VDVElPTiggbmFtZSwgZGVzY3JpcHRpb24gKSBJTlRFUk5BTF9DQVRDSF9TRUNUSU9OKCBuYW1lLCBkZXNjcmlwdGlvbiApCisgICAgI2RlZmluZSBGQUlMKCBtc2cgKSBJTlRFUk5BTF9DQVRDSF9NU0coICJGQUlMIiwgQ2F0Y2g6OlJlc3VsdFdhczo6RXhwbGljaXRGYWlsdXJlLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCwgbXNnICkKKyAgICAjZGVmaW5lIEZBSUxfQ0hFQ0soIG1zZyApIElOVEVSTkFMX0NBVENIX01TRyggIkZBSUxfQ0hFQ0siLCBDYXRjaDo6UmVzdWx0V2FzOjpFeHBsaWNpdEZhaWx1cmUsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsIG1zZyApCisgICAgI2RlZmluZSBTVUNDRUVEKCBtc2cgKSBJTlRFUk5BTF9DQVRDSF9NU0coICJTVUNDRUVEIiwgQ2F0Y2g6OlJlc3VsdFdhczo6T2ssIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsIG1zZyApCisjZW5kaWYKKyNkZWZpbmUgQU5PTl9URVNUX0NBU0UoKSBJTlRFUk5BTF9DQVRDSF9URVNUQ0FTRSggIiIsICIiICkKKworI2RlZmluZSBSRUdJU1RFUl9SRVBPUlRFUiggbmFtZSwgcmVwb3J0ZXJUeXBlICkgSU5URVJOQUxfQ0FUQ0hfUkVHSVNURVJfUkVQT1JURVIoIG5hbWUsIHJlcG9ydGVyVHlwZSApCisjZGVmaW5lIFJFR0lTVEVSX0xFR0FDWV9SRVBPUlRFUiggbmFtZSwgcmVwb3J0ZXJUeXBlICkgSU5URVJOQUxfQ0FUQ0hfUkVHSVNURVJfTEVHQUNZX1JFUE9SVEVSKCBuYW1lLCByZXBvcnRlclR5cGUgKQorCisjZGVmaW5lIEdFTkVSQVRFKCBleHByKSBJTlRFUk5BTF9DQVRDSF9HRU5FUkFURSggZXhwciApCisKKyNlbmRpZgorCisjZGVmaW5lIENBVENIX1RSQU5TTEFURV9FWENFUFRJT04oIHNpZ25hdHVyZSApIElOVEVSTkFMX0NBVENIX1RSQU5TTEFURV9FWENFUFRJT04oIHNpZ25hdHVyZSApCisKKy8vICJCREQtc3R5bGUiIGNvbnZlbmllbmNlIHdyYXBwZXJzCisjaWZkZWYgQ0FUQ0hfQ09ORklHX1ZBUklBRElDX01BQ1JPUworI2RlZmluZSBTQ0VOQVJJTyggLi4uICkgVEVTVF9DQVNFKCAiU2NlbmFyaW86ICIgX19WQV9BUkdTX18gKQorI2RlZmluZSBTQ0VOQVJJT19NRVRIT0QoIGNsYXNzTmFtZSwgLi4uICkgSU5URVJOQUxfQ0FUQ0hfVEVTVF9DQVNFX01FVEhPRCggY2xhc3NOYW1lLCAiU2NlbmFyaW86ICIgX19WQV9BUkdTX18gKQorI2Vsc2UKKyNkZWZpbmUgU0NFTkFSSU8oIG5hbWUsIHRhZ3MgKSBURVNUX0NBU0UoICJTY2VuYXJpbzogIiBuYW1lLCB0YWdzICkKKyNkZWZpbmUgU0NFTkFSSU9fTUVUSE9EKCBjbGFzc05hbWUsIG5hbWUsIHRhZ3MgKSBJTlRFUk5BTF9DQVRDSF9URVNUX0NBU0VfTUVUSE9EKCBjbGFzc05hbWUsICJTY2VuYXJpbzogIiBuYW1lLCB0YWdzICkKKyNlbmRpZgorI2RlZmluZSBHSVZFTiggZGVzYyApICAgIFNFQ1RJT04oIHN0ZDo6c3RyaW5nKCIgICBHaXZlbjogIikgKyBkZXNjLCAiIiApCisjZGVmaW5lIFdIRU4oIGRlc2MgKSAgICAgU0VDVElPTiggc3RkOjpzdHJpbmcoIiAgICBXaGVuOiAiKSArIGRlc2MsICIiICkKKyNkZWZpbmUgQU5EX1dIRU4oIGRlc2MgKSBTRUNUSU9OKCBzdGQ6OnN0cmluZygiQW5kIHdoZW46ICIpICsgZGVzYywgIiIgKQorI2RlZmluZSBUSEVOKCBkZXNjICkgICAgIFNFQ1RJT04oIHN0ZDo6c3RyaW5nKCIgICAgVGhlbjogIikgKyBkZXNjLCAiIiApCisjZGVmaW5lIEFORF9USEVOKCBkZXNjICkgU0VDVElPTiggc3RkOjpzdHJpbmcoIiAgICAgQW5kOiAiKSArIGRlc2MsICIiICkKKwordXNpbmcgQ2F0Y2g6OkRldGFpbDo6QXBwcm94OworCisjZW5kaWYgLy8gVFdPQkxVRUNVQkVTX1NJTkdMRV9JTkNMVURFX0NBVENIX0hQUF9JTkNMVURFRAorCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdHMvbmV0Y29yZS90X25ldGNvcmVfZ2VuZXJhdG9yX2Z1bmN0aW9uYWxfdGVzdHMuY2MgYi9jb21waWxlci9jcHAvdGVzdHMvbmV0Y29yZS90X25ldGNvcmVfZ2VuZXJhdG9yX2Z1bmN0aW9uYWxfdGVzdHMuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI4YzgzNwotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0cy9uZXRjb3JlL3RfbmV0Y29yZV9nZW5lcmF0b3JfZnVuY3Rpb25hbF90ZXN0cy5jYwpAQCAtMCwwICsxLDMzOSBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgIi4uL2NhdGNoL2NhdGNoLmhwcCIKKyNpbmNsdWRlIDx0aHJpZnQvcGFyc2UvdF9wcm9ncmFtLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2dlbmVyYXRlL3RfbmV0Y29yZV9nZW5lcmF0b3IuaD4KKyNpbmNsdWRlICJ0X25ldGNvcmVfZ2VuZXJhdG9yX2Z1bmN0aW9uYWxfdGVzdHNfaGVscGVycy5oIgorCitURVNUX0NBU0UoICJ0X25ldGNvcmVfZ2VuZXJhdG9yIHNob3VsZCBnZW5lcmF0ZSB2YWxpZCBlbnVtIiwgIltmdW5jdGlvbmFsXSIgKQoreworICAgIHN0cmluZyBwYXRoID0gIkNhc3NhbmRyYVRlc3QudGhyaWZ0IjsKKyAgICBzdHJpbmcgbmFtZSA9ICJuZXRjb3JlIjsKKyAgICBtYXA8c3RyaW5nLCBzdHJpbmc+IHBhcnNlZF9vcHRpb25zID0geyB7ICJ3Y2YiLCAid2NmIiB9IH07CisgICAgc3RyaW5nIG9wdGlvbl9zdHJpbmcgPSAiIjsKKworICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IG5ldyB0X3Byb2dyYW0ocGF0aCwgbmFtZSk7CisgICAgdF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuID0gbmV3IHRfbmV0Y29yZV9nZW5lcmF0b3IocHJvZ3JhbSwgcGFyc2VkX29wdGlvbnMsIG9wdGlvbl9zdHJpbmcpOworCisgICAgc3RkOjpwYWlyPHN0cmluZywgdF9lbnVtKj4gcGFpciA9IFRlc3REYXRhR2VuZXJhdG9yOjpnZXRfdGVzdF9lbnVtX2RhdGEocHJvZ3JhbSk7CisgICAgc3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCA9IHBhaXIuZmlyc3Q7CisgICAgdF9lbnVtKiB0ZXN0X2VudW0gPSBwYWlyLnNlY29uZDsKKworICAgIHN0cmluZyBmaWxlX3BhdGggPSB0ZXN0X2VudW0tPmdldF9uYW1lKCkgKyAiLmNzIjsKKyAgICBvZnN0cmVhbSBvdXQ7CisgICAgb3V0Lm9wZW4oZmlsZV9wYXRoLmNfc3RyKCkpOworCisgICAgUkVRVUlSRV9OT1RIUk9XKGdlbi0+Z2VuZXJhdGVfZW51bShvdXQsIHRlc3RfZW51bSkpOworCisgICAgb3V0LmNsb3NlKCk7CisKKyAgICBzdGQ6Omlmc3RyZWFtIGlmcyhmaWxlX3BhdGgpOworICAgIHN0cmluZyBhY3R1YWxfcmVzdWx0KChzdGQ6OmlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhcj4oaWZzKSksIChzdGQ6OmlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhcj4oKSkpOworICAgIHN0ZDo6cmVtb3ZlKGZpbGVfcGF0aC5jX3N0cigpKTsKKworICAgIFJFUVVJUkUoZXhwZWN0ZWRfcmVzdWx0ID09IGFjdHVhbF9yZXN1bHQpOworCisgICAgZGVsZXRlIHRlc3RfZW51bTsKKyAgICBkZWxldGUgZ2VuOworICAgIGRlbGV0ZSBwcm9ncmFtOwkKK30KKworVEVTVF9DQVNFKCJ0X25ldGNvcmVfZ2VuZXJhdG9yIHNob3VsZCBnZW5lcmF0ZSB2YWxpZCB2b2lkIiwgIltmdW5jdGlvbmFsXSIpCit7CisgICAgc3RyaW5nIHBhdGggPSAiQ2Fzc2FuZHJhVGVzdC50aHJpZnQiOworICAgIHN0cmluZyBuYW1lID0gIm5ldGNvcmUiOworICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gcGFyc2VkX29wdGlvbnMgPSB7IHsgIndjZiIsICJ3Y2YiIH0gfTsKKyAgICBzdHJpbmcgb3B0aW9uX3N0cmluZyA9ICIiOworCisgICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gbmV3IHRfcHJvZ3JhbShwYXRoLCBuYW1lKTsKKyAgICB0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4gPSBuZXcgdF9uZXRjb3JlX2dlbmVyYXRvcihwcm9ncmFtLCBwYXJzZWRfb3B0aW9ucywgb3B0aW9uX3N0cmluZyk7CisKKyAgICBzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4gcGFpciA9IFRlc3REYXRhR2VuZXJhdG9yOjpnZXRfdGVzdF92b2lkX2NvbnN0X2RhdGEoZ2VuKTsKKyAgICBzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0ID0gcGFpci5maXJzdDsKKyAgICB0X2NvbnN0KiBjb25zdF8gPSBwYWlyLnNlY29uZDsKKyAgICB2ZWN0b3I8dF9jb25zdCo+IGNvbnN0c187CisgICAgY29uc3RzXy5wdXNoX2JhY2soY29uc3RfKTsKKworICAgIHN0cmluZyBmaWxlX3BhdGggPSBjb25zdF8tPmdldF9uYW1lKCkgKyAiLmNzIjsKKyAgICBvZnN0cmVhbSBvdXQ7CisgICAgb3V0Lm9wZW4oZmlsZV9wYXRoLmNfc3RyKCkpOworCisgICAgUkVRVUlSRV9USFJPV1MoZ2VuLT5nZW5lcmF0ZV9jb25zdHMob3V0LCBjb25zdHNfKSk7CisKKyAgICBvdXQuY2xvc2UoKTsKKworICAgIHN0ZDo6aWZzdHJlYW0gaWZzKGZpbGVfcGF0aCk7CisgICAgc3RyaW5nIGFjdHVhbF9yZXN1bHQoKHN0ZDo6aXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyPihpZnMpKSwgKHN0ZDo6aXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyPigpKSk7CisgICAgc3RkOjpyZW1vdmUoZmlsZV9wYXRoLmNfc3RyKCkpOworCisgICAgZGVsZXRlIGNvbnN0XzsKKyAgICBkZWxldGUgZ2VuOworICAgIGRlbGV0ZSBwcm9ncmFtOworfQorCitURVNUX0NBU0UoInRfbmV0Y29yZV9nZW5lcmF0b3Igc2hvdWxkIGdlbmVyYXRlIHZhbGlkIHN0cmluZyB3aXRoIGVzY2FwaW5nIGtleXdvcmQiLCAiW2Z1bmN0aW9uYWxdIikKK3sKKyAgICBzdHJpbmcgcGF0aCA9ICJDYXNzYW5kcmFUZXN0LnRocmlmdCI7CisgICAgc3RyaW5nIG5hbWUgPSAibmV0Y29yZSI7CisgICAgbWFwPHN0cmluZywgc3RyaW5nPiBwYXJzZWRfb3B0aW9ucyA9IHsgeyAid2NmIiwgIndjZiIgfSB9OworICAgIHN0cmluZyBvcHRpb25fc3RyaW5nID0gIiI7CisKKyAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSBuZXcgdF9wcm9ncmFtKHBhdGgsIG5hbWUpOworICAgIHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbiA9IG5ldyB0X25ldGNvcmVfZ2VuZXJhdG9yKHByb2dyYW0sIHBhcnNlZF9vcHRpb25zLCBvcHRpb25fc3RyaW5nKTsKKyAgICBnZW4tPmluaXRfZ2VuZXJhdG9yKCk7CisKKyAgICBzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4gcGFpciA9IFRlc3REYXRhR2VuZXJhdG9yOjpnZXRfdGVzdF9zdHJpbmdfY29uc3RfZGF0YShnZW4pOworICAgIHN0cmluZyBleHBlY3RlZF9yZXN1bHQgPSBwYWlyLmZpcnN0OworICAgIHRfY29uc3QqIGNvbnN0XyA9IHBhaXIuc2Vjb25kOworICAgIHZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzXzsKKyAgICBjb25zdHNfLnB1c2hfYmFjayhjb25zdF8pOworCisgICAgc3RyaW5nIGZpbGVfcGF0aCA9IGNvbnN0Xy0+Z2V0X25hbWUoKSArICIuY3MiOworICAgIG9mc3RyZWFtIG91dDsKKyAgICBvdXQub3BlbihmaWxlX3BhdGguY19zdHIoKSk7CisKKyAgICBSRVFVSVJFX05PVEhST1coZ2VuLT5nZW5lcmF0ZV9jb25zdHMob3V0LCBjb25zdHNfKSk7CisKKyAgICBvdXQuY2xvc2UoKTsKKworICAgIHN0ZDo6aWZzdHJlYW0gaWZzKGZpbGVfcGF0aCk7CisgICAgc3RyaW5nIGFjdHVhbF9yZXN1bHQoKHN0ZDo6aXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyPihpZnMpKSwgKHN0ZDo6aXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyPigpKSk7CisgICAgc3RkOjpyZW1vdmUoZmlsZV9wYXRoLmNfc3RyKCkpOworCisgICAgUkVRVUlSRShleHBlY3RlZF9yZXN1bHQgPT0gYWN0dWFsX3Jlc3VsdCk7CisKKyAgICBkZWxldGUgY29uc3RfOworICAgIGRlbGV0ZSBnZW47CisgICAgZGVsZXRlIHByb2dyYW07Cit9CisKK1RFU1RfQ0FTRSgidF9uZXRjb3JlX2dlbmVyYXRvciBzaG91bGQgZ2VuZXJhdGUgdmFsaWQgYm9vbCB3aXRoIGVzY2FwaW5nIGtleXdvcmQiLCAiW2Z1bmN0aW9uYWxdIikKK3sKKyAgICBzdHJpbmcgcGF0aCA9ICJDYXNzYW5kcmFUZXN0LnRocmlmdCI7CisgICAgc3RyaW5nIG5hbWUgPSAibmV0Y29yZSI7CisgICAgbWFwPHN0cmluZywgc3RyaW5nPiBwYXJzZWRfb3B0aW9ucyA9IHsgeyAid2NmIiwgIndjZiIgfSB9OworICAgIHN0cmluZyBvcHRpb25fc3RyaW5nID0gIiI7CisKKyAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSBuZXcgdF9wcm9ncmFtKHBhdGgsIG5hbWUpOworICAgIHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbiA9IG5ldyB0X25ldGNvcmVfZ2VuZXJhdG9yKHByb2dyYW0sIHBhcnNlZF9vcHRpb25zLCBvcHRpb25fc3RyaW5nKTsKKyAgICBnZW4tPmluaXRfZ2VuZXJhdG9yKCk7CisKKyAgICBzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4gcGFpciA9IFRlc3REYXRhR2VuZXJhdG9yOjpnZXRfdGVzdF9ib29sX2NvbnN0X2RhdGEoZ2VuKTsKKyAgICBzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0ID0gcGFpci5maXJzdDsKKyAgICB0X2NvbnN0KiBjb25zdF8gPSBwYWlyLnNlY29uZDsKKyAgICB2ZWN0b3I8dF9jb25zdCo+IGNvbnN0c187CisgICAgY29uc3RzXy5wdXNoX2JhY2soY29uc3RfKTsKKworICAgIHN0cmluZyBmaWxlX3BhdGggPSBjb25zdF8tPmdldF9uYW1lKCkgKyAiLmNzIjsKKyAgICBvZnN0cmVhbSBvdXQ7CisgICAgb3V0Lm9wZW4oZmlsZV9wYXRoLmNfc3RyKCkpOworCisgICAgUkVRVUlSRV9OT1RIUk9XKGdlbi0+Z2VuZXJhdGVfY29uc3RzKG91dCwgY29uc3RzXykpOworCisgICAgb3V0LmNsb3NlKCk7CisKKyAgICBzdGQ6Omlmc3RyZWFtIGlmcyhmaWxlX3BhdGgpOworICAgIHN0cmluZyBhY3R1YWxfcmVzdWx0KChzdGQ6OmlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhcj4oaWZzKSksIChzdGQ6OmlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhcj4oKSkpOworICAgIHN0ZDo6cmVtb3ZlKGZpbGVfcGF0aC5jX3N0cigpKTsKKworICAgIFJFUVVJUkUoZXhwZWN0ZWRfcmVzdWx0ID09IGFjdHVhbF9yZXN1bHQpOworCisgICAgZGVsZXRlIGNvbnN0XzsKKyAgICBkZWxldGUgZ2VuOworICAgIGRlbGV0ZSBwcm9ncmFtOworfQorCitURVNUX0NBU0UoInRfbmV0Y29yZV9nZW5lcmF0b3Igc2hvdWxkIGdlbmVyYXRlIHZhbGlkIHNieXRlIChpOCkgd2l0aCBlc2NhcGluZyBrZXl3b3JkIiwgIltmdW5jdGlvbmFsXSIpCit7CisgICAgc3RyaW5nIHBhdGggPSAiQ2Fzc2FuZHJhVGVzdC50aHJpZnQiOworICAgIHN0cmluZyBuYW1lID0gIm5ldGNvcmUiOworICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gcGFyc2VkX29wdGlvbnMgPSB7IHsgIndjZiIsICJ3Y2YiIH0gfTsKKyAgICBzdHJpbmcgb3B0aW9uX3N0cmluZyA9ICIiOworCisgICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gbmV3IHRfcHJvZ3JhbShwYXRoLCBuYW1lKTsKKyAgICB0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4gPSBuZXcgdF9uZXRjb3JlX2dlbmVyYXRvcihwcm9ncmFtLCBwYXJzZWRfb3B0aW9ucywgb3B0aW9uX3N0cmluZyk7CisgICAgZ2VuLT5pbml0X2dlbmVyYXRvcigpOworCisgICAgc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+IHBhaXIgPSBUZXN0RGF0YUdlbmVyYXRvcjo6Z2V0X3Rlc3RfaThfY29uc3RfZGF0YShnZW4pOworICAgIHN0cmluZyBleHBlY3RlZF9yZXN1bHQgPSBwYWlyLmZpcnN0OworICAgIHRfY29uc3QqIGNvbnN0XyA9IHBhaXIuc2Vjb25kOworICAgIHZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzXzsKKyAgICBjb25zdHNfLnB1c2hfYmFjayhjb25zdF8pOworCisgICAgc3RyaW5nIGZpbGVfcGF0aCA9IGNvbnN0Xy0+Z2V0X25hbWUoKSArICIuY3MiOworICAgIG9mc3RyZWFtIG91dDsKKyAgICBvdXQub3BlbihmaWxlX3BhdGguY19zdHIoKSk7CisKKyAgICBSRVFVSVJFX05PVEhST1coZ2VuLT5nZW5lcmF0ZV9jb25zdHMob3V0LCBjb25zdHNfKSk7CisKKyAgICBvdXQuY2xvc2UoKTsKKworICAgIHN0ZDo6aWZzdHJlYW0gaWZzKGZpbGVfcGF0aCk7CisgICAgc3RyaW5nIGFjdHVhbF9yZXN1bHQoKHN0ZDo6aXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyPihpZnMpKSwgKHN0ZDo6aXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyPigpKSk7CisgICAgc3RkOjpyZW1vdmUoZmlsZV9wYXRoLmNfc3RyKCkpOworCisgICAgUkVRVUlSRShleHBlY3RlZF9yZXN1bHQgPT0gYWN0dWFsX3Jlc3VsdCk7CisKKyAgICBkZWxldGUgY29uc3RfOworICAgIGRlbGV0ZSBnZW47CisgICAgZGVsZXRlIHByb2dyYW07Cit9CisKK1RFU1RfQ0FTRSgidF9uZXRjb3JlX2dlbmVyYXRvciBzaG91bGQgZ2VuZXJhdGUgdmFsaWQgc2hvcnQgKGkxNikgd2l0aCBlc2NhcGluZyBrZXl3b3JkIiwgIltmdW5jdGlvbmFsXSIpCit7CisgICAgc3RyaW5nIHBhdGggPSAiQ2Fzc2FuZHJhVGVzdC50aHJpZnQiOworICAgIHN0cmluZyBuYW1lID0gIm5ldGNvcmUiOworICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gcGFyc2VkX29wdGlvbnMgPSB7IHsgIndjZiIsICJ3Y2YiIH0gfTsKKyAgICBzdHJpbmcgb3B0aW9uX3N0cmluZyA9ICIiOworCisgICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gbmV3IHRfcHJvZ3JhbShwYXRoLCBuYW1lKTsKKyAgICB0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4gPSBuZXcgdF9uZXRjb3JlX2dlbmVyYXRvcihwcm9ncmFtLCBwYXJzZWRfb3B0aW9ucywgb3B0aW9uX3N0cmluZyk7CisgICAgZ2VuLT5pbml0X2dlbmVyYXRvcigpOworCisgICAgc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+IHBhaXIgPSBUZXN0RGF0YUdlbmVyYXRvcjo6Z2V0X3Rlc3RfaTE2X2NvbnN0X2RhdGEoZ2VuKTsKKyAgICBzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0ID0gcGFpci5maXJzdDsKKyAgICB0X2NvbnN0KiBjb25zdF8gPSBwYWlyLnNlY29uZDsKKyAgICB2ZWN0b3I8dF9jb25zdCo+IGNvbnN0c187CisgICAgY29uc3RzXy5wdXNoX2JhY2soY29uc3RfKTsKKworICAgIHN0cmluZyBmaWxlX3BhdGggPSBjb25zdF8tPmdldF9uYW1lKCkgKyAiLmNzIjsKKyAgICBvZnN0cmVhbSBvdXQ7CisgICAgb3V0Lm9wZW4oZmlsZV9wYXRoLmNfc3RyKCkpOworCisgICAgUkVRVUlSRV9OT1RIUk9XKGdlbi0+Z2VuZXJhdGVfY29uc3RzKG91dCwgY29uc3RzXykpOworCisgICAgb3V0LmNsb3NlKCk7CisKKyAgICBzdGQ6Omlmc3RyZWFtIGlmcyhmaWxlX3BhdGgpOworICAgIHN0cmluZyBhY3R1YWxfcmVzdWx0KChzdGQ6OmlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhcj4oaWZzKSksIChzdGQ6OmlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhcj4oKSkpOworICAgIHN0ZDo6cmVtb3ZlKGZpbGVfcGF0aC5jX3N0cigpKTsKKworICAgIFJFUVVJUkUoZXhwZWN0ZWRfcmVzdWx0ID09IGFjdHVhbF9yZXN1bHQpOworCisgICAgZGVsZXRlIGNvbnN0XzsKKyAgICBkZWxldGUgZ2VuOworICAgIGRlbGV0ZSBwcm9ncmFtOworfQorCitURVNUX0NBU0UoInRfbmV0Y29yZV9nZW5lcmF0b3Igc2hvdWxkIGdlbmVyYXRlIHZhbGlkIGludGVnZXIgKGkzMikgd2l0aCBlc2NhcGluZyBrZXl3b3JkIiwgIltmdW5jdGlvbmFsXSIpCit7CisgICAgc3RyaW5nIHBhdGggPSAiQ2Fzc2FuZHJhVGVzdC50aHJpZnQiOworICAgIHN0cmluZyBuYW1lID0gIm5ldGNvcmUiOworICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gcGFyc2VkX29wdGlvbnMgPSB7IHsgIndjZiIsICJ3Y2YiIH0gfTsKKyAgICBzdHJpbmcgb3B0aW9uX3N0cmluZyA9ICIiOworCisgICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gbmV3IHRfcHJvZ3JhbShwYXRoLCBuYW1lKTsKKyAgICB0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4gPSBuZXcgdF9uZXRjb3JlX2dlbmVyYXRvcihwcm9ncmFtLCBwYXJzZWRfb3B0aW9ucywgb3B0aW9uX3N0cmluZyk7CisgICAgZ2VuLT5pbml0X2dlbmVyYXRvcigpOworCisgICAgc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+IHBhaXIgPSBUZXN0RGF0YUdlbmVyYXRvcjo6Z2V0X3Rlc3RfaTMyX2NvbnN0X2RhdGEoZ2VuKTsKKyAgICBzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0ID0gcGFpci5maXJzdDsKKyAgICB0X2NvbnN0KiBjb25zdF8gPSBwYWlyLnNlY29uZDsKKyAgICB2ZWN0b3I8dF9jb25zdCo+IGNvbnN0c187CisgICAgY29uc3RzXy5wdXNoX2JhY2soY29uc3RfKTsKKworICAgIHN0cmluZyBmaWxlX3BhdGggPSBjb25zdF8tPmdldF9uYW1lKCkgKyAiLmNzIjsKKyAgICBvZnN0cmVhbSBvdXQ7CisgICAgb3V0Lm9wZW4oZmlsZV9wYXRoLmNfc3RyKCkpOworCisgICAgUkVRVUlSRV9OT1RIUk9XKGdlbi0+Z2VuZXJhdGVfY29uc3RzKG91dCwgY29uc3RzXykpOworCisgICAgb3V0LmNsb3NlKCk7CisKKyAgICBzdGQ6Omlmc3RyZWFtIGlmcyhmaWxlX3BhdGgpOworICAgIHN0cmluZyBhY3R1YWxfcmVzdWx0KChzdGQ6OmlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhcj4oaWZzKSksIChzdGQ6OmlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhcj4oKSkpOworICAgIHN0ZDo6cmVtb3ZlKGZpbGVfcGF0aC5jX3N0cigpKTsKKworICAgIFJFUVVJUkUoZXhwZWN0ZWRfcmVzdWx0ID09IGFjdHVhbF9yZXN1bHQpOworCisgICAgZGVsZXRlIGNvbnN0XzsKKyAgICBkZWxldGUgZ2VuOworICAgIGRlbGV0ZSBwcm9ncmFtOworfQorCitURVNUX0NBU0UoInRfbmV0Y29yZV9nZW5lcmF0b3Igc2hvdWxkIGdlbmVyYXRlIHZhbGlkIGxvbmcgKGk2NCkgd2l0aCBlc2NhcGluZyBrZXl3b3JkIiwgIltmdW5jdGlvbmFsXSIpCit7CisgICAgc3RyaW5nIHBhdGggPSAiQ2Fzc2FuZHJhVGVzdC50aHJpZnQiOworICAgIHN0cmluZyBuYW1lID0gIm5ldGNvcmUiOworICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gcGFyc2VkX29wdGlvbnMgPSB7IHsgIndjZiIsICJ3Y2YiIH0gfTsKKyAgICBzdHJpbmcgb3B0aW9uX3N0cmluZyA9ICIiOworCisgICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gbmV3IHRfcHJvZ3JhbShwYXRoLCBuYW1lKTsKKyAgICB0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4gPSBuZXcgdF9uZXRjb3JlX2dlbmVyYXRvcihwcm9ncmFtLCBwYXJzZWRfb3B0aW9ucywgb3B0aW9uX3N0cmluZyk7CisgICAgZ2VuLT5pbml0X2dlbmVyYXRvcigpOworCisgICAgc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+IHBhaXIgPSBUZXN0RGF0YUdlbmVyYXRvcjo6Z2V0X3Rlc3RfaTY0X2NvbnN0X2RhdGEoZ2VuKTsKKyAgICBzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0ID0gcGFpci5maXJzdDsKKyAgICB0X2NvbnN0KiBjb25zdF8gPSBwYWlyLnNlY29uZDsKKyAgICB2ZWN0b3I8dF9jb25zdCo+IGNvbnN0c187CisgICAgY29uc3RzXy5wdXNoX2JhY2soY29uc3RfKTsKKworICAgIHN0cmluZyBmaWxlX3BhdGggPSBjb25zdF8tPmdldF9uYW1lKCkgKyAiLmNzIjsKKyAgICBvZnN0cmVhbSBvdXQ7CisgICAgb3V0Lm9wZW4oZmlsZV9wYXRoLmNfc3RyKCkpOworCisgICAgUkVRVUlSRV9OT1RIUk9XKGdlbi0+Z2VuZXJhdGVfY29uc3RzKG91dCwgY29uc3RzXykpOworCisgICAgb3V0LmNsb3NlKCk7CisKKyAgICBzdGQ6Omlmc3RyZWFtIGlmcyhmaWxlX3BhdGgpOworICAgIHN0cmluZyBhY3R1YWxfcmVzdWx0KChzdGQ6OmlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhcj4oaWZzKSksIChzdGQ6OmlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhcj4oKSkpOworICAgIHN0ZDo6cmVtb3ZlKGZpbGVfcGF0aC5jX3N0cigpKTsKKworICAgIFJFUVVJUkUoZXhwZWN0ZWRfcmVzdWx0ID09IGFjdHVhbF9yZXN1bHQpOworCisgICAgZGVsZXRlIGNvbnN0XzsKKyAgICBkZWxldGUgZ2VuOworICAgIGRlbGV0ZSBwcm9ncmFtOworfQorCitURVNUX0NBU0UoInRfbmV0Y29yZV9nZW5lcmF0b3Igc2hvdWxkIGdlbmVyYXRlIHZhbGlkIGRvdWJsZSB3aXRoIGVzY2FwaW5nIGtleXdvcmQiLCAiW2Z1bmN0aW9uYWxdIikKK3sKKyAgICBzdHJpbmcgcGF0aCA9ICJDYXNzYW5kcmFUZXN0LnRocmlmdCI7CisgICAgc3RyaW5nIG5hbWUgPSAibmV0Y29yZSI7CisgICAgbWFwPHN0cmluZywgc3RyaW5nPiBwYXJzZWRfb3B0aW9ucyA9IHsgeyAid2NmIiwgIndjZiIgfSB9OworICAgIHN0cmluZyBvcHRpb25fc3RyaW5nID0gIiI7CisKKyAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSBuZXcgdF9wcm9ncmFtKHBhdGgsIG5hbWUpOworICAgIHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbiA9IG5ldyB0X25ldGNvcmVfZ2VuZXJhdG9yKHByb2dyYW0sIHBhcnNlZF9vcHRpb25zLCBvcHRpb25fc3RyaW5nKTsKKyAgICBnZW4tPmluaXRfZ2VuZXJhdG9yKCk7CisKKyAgICBzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4gcGFpciA9IFRlc3REYXRhR2VuZXJhdG9yOjpnZXRfdGVzdF9kb3VibGVfY29uc3RfZGF0YShnZW4pOworICAgIHN0cmluZyBleHBlY3RlZF9yZXN1bHQgPSBwYWlyLmZpcnN0OworICAgIHRfY29uc3QqIGNvbnN0XyA9IHBhaXIuc2Vjb25kOworICAgIHZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzXzsKKyAgICBjb25zdHNfLnB1c2hfYmFjayhjb25zdF8pOworCisgICAgc3RyaW5nIGZpbGVfcGF0aCA9IGNvbnN0Xy0+Z2V0X25hbWUoKSArICIuY3MiOworICAgIG9mc3RyZWFtIG91dDsKKyAgICBvdXQub3BlbihmaWxlX3BhdGguY19zdHIoKSk7CisKKyAgICBSRVFVSVJFX05PVEhST1coZ2VuLT5nZW5lcmF0ZV9jb25zdHMob3V0LCBjb25zdHNfKSk7CisKKyAgICBvdXQuY2xvc2UoKTsKKworICAgIHN0ZDo6aWZzdHJlYW0gaWZzKGZpbGVfcGF0aCk7CisgICAgc3RyaW5nIGFjdHVhbF9yZXN1bHQoKHN0ZDo6aXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyPihpZnMpKSwgKHN0ZDo6aXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyPigpKSk7CisgICAgc3RkOjpyZW1vdmUoZmlsZV9wYXRoLmNfc3RyKCkpOworCisgICAgUkVRVUlSRShleHBlY3RlZF9yZXN1bHQgPT0gYWN0dWFsX3Jlc3VsdCk7CisKKyAgICBkZWxldGUgY29uc3RfOworICAgIGRlbGV0ZSBnZW47CisgICAgZGVsZXRlIHByb2dyYW07Cit9CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdHMvbmV0Y29yZS90X25ldGNvcmVfZ2VuZXJhdG9yX2Z1bmN0aW9uYWxfdGVzdHNfaGVscGVycy5jYyBiL2NvbXBpbGVyL2NwcC90ZXN0cy9uZXRjb3JlL3RfbmV0Y29yZV9nZW5lcmF0b3JfZnVuY3Rpb25hbF90ZXN0c19oZWxwZXJzLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyYzE3MGIKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdHMvbmV0Y29yZS90X25ldGNvcmVfZ2VuZXJhdG9yX2Z1bmN0aW9uYWxfdGVzdHNfaGVscGVycy5jYwpAQCAtMCwwICsxLDIzNyBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgPHRocmlmdC9wYXJzZS90X3Byb2dyYW0uaD4KKyNpbmNsdWRlICJ0aHJpZnQvY29tbW9uLmgiCisjaW5jbHVkZSA8dGhyaWZ0L2dlbmVyYXRlL3RfbmV0Y29yZV9nZW5lcmF0b3IuaD4KKyNpbmNsdWRlICJ0X25ldGNvcmVfZ2VuZXJhdG9yX2Z1bmN0aW9uYWxfdGVzdHNfaGVscGVycy5oIgorCitjb25zdCBzdHJpbmcgVGVzdERhdGFHZW5lcmF0b3I6OkRFRkFVTFRfRklMRV9IRUFERVIgPSAiLyoqIiAiXG4iCisgICAgICAgICAgICAiICogQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKCkiICJcbiIKKyAgICAgICAgICAgICIgKiIgIlxuIgorICAgICAgICAgICAgIiAqIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkciICJcbiIKKyAgICAgICAgICAgICIgKiAgQGdlbmVyYXRlZCIgIlxuIgorICAgICAgICAgICAgIiAqLyI7CisKK3N0ZDo6cGFpcjxzdHJpbmcsIHRfZW51bSo+IFRlc3REYXRhR2VuZXJhdG9yOjpnZXRfdGVzdF9lbnVtX2RhdGEodF9wcm9ncmFtKiBwcm9ncmFtKQoreworICAgIHN0cmluZyBleHBlY3RlZF9yZXN1bHQgPSBERUZBVUxUX0ZJTEVfSEVBREVSICsKKyAgICAgICAgIlxuIgorICAgICAgICAiXG4iCisgICAgICAgICIvLy8gPHN1bW1hcnk+XG4iCisgICAgICAgICIvLy8gVGVzdERvY1xuIgorICAgICAgICAiLy8vIDwvc3VtbWFyeT5cbiIKKyAgICAgICAgInB1YmxpYyBlbnVtIFRlc3ROYW1lXG4iCisgICAgICAgICJ7XG4iCisgICAgICAgICIgIE5vbmUgPSAwLFxuIgorICAgICAgICAiICBGaXJzdCA9IDEsXG4iCisgICAgICAgICIgIFNlY29uZCA9IDIsXG4iCisgICAgICAgICJ9XG4iOworCisgICAgdF9lbnVtKiBlbnVtXyA9IG5ldyB0X2VudW0ocHJvZ3JhbSk7CisgICAgZW51bV8tPnNldF9uYW1lKCJUZXN0TmFtZSIpOworICAgIGVudW1fLT5zZXRfZG9jKCJUZXN0RG9jIik7CisgICAgZW51bV8tPmFwcGVuZChuZXcgdF9lbnVtX3ZhbHVlKCJOb25lIiwgMCkpOworICAgIGVudW1fLT5hcHBlbmQobmV3IHRfZW51bV92YWx1ZSgiRmlyc3QiLCAxKSk7CisgICAgZW51bV8tPmFwcGVuZChuZXcgdF9lbnVtX3ZhbHVlKCJTZWNvbmQiLCAyKSk7CisKKyAgICByZXR1cm4gc3RkOjpwYWlyPHN0cmluZywgdF9lbnVtKj4oZXhwZWN0ZWRfcmVzdWx0LCBlbnVtXyk7Cit9CisKK3N0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPiBUZXN0RGF0YUdlbmVyYXRvcjo6Z2V0X3Rlc3Rfdm9pZF9jb25zdF9kYXRhKHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbikKK3sKKyAgICBzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0ID0gREVGQVVMVF9GSUxFX0hFQURFUjsKKworICAgIHRfdHlwZSogdHlwZV8gPSBuZXcgdF9iYXNlX3R5cGUoInZvaWQiLCB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEKTsKKyAgICB0eXBlXy0+c2V0X2RvYygiVGVzdERvYyIpOworCisgICAgdF9jb25zdF92YWx1ZSogY29uc3RfdmFsdWVfID0gbmV3IHRfY29uc3RfdmFsdWUoKTsKKyAgICBjb25zdF92YWx1ZV8tPnNldF9zdHJpbmcoIlZvaWRWYWx1ZSIpOworCisgICAgdF9jb25zdCogY29uc3RfID0gbmV3IHRfY29uc3QodHlwZV8sICJ2b2lkIiwgY29uc3RfdmFsdWVfKTsKKyAgICBjb25zdF8tPnNldF9kb2MoIlRlc3REb2MiKTsKKworICAgIHJldHVybiBzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4oZXhwZWN0ZWRfcmVzdWx0LCBjb25zdF8pOworfQorCitzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4gVGVzdERhdGFHZW5lcmF0b3I6OmdldF90ZXN0X3N0cmluZ19jb25zdF9kYXRhKHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbikKK3sKKyAgICBzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0ID0gREVGQVVMVF9GSUxFX0hFQURFUiArICJcbiIgK2dlbi0+bmV0Y29yZV90eXBlX3VzaW5ncygpICsgCisgICAgICAgICJcbiIKKyAgICAgICAgInB1YmxpYyBzdGF0aWMgY2xhc3MgbmV0Y29yZUNvbnN0YW50c1xuIgorICAgICAgICAie1xuIgorICAgICAgICAiICAvLy8gPHN1bW1hcnk+XG4iCisgICAgICAgICIgIC8vLyBUZXN0RG9jXG4iCisgICAgICAgICIgIC8vLyA8L3N1bW1hcnk+XG4iCisgICAgICAgICIgIHB1YmxpYyBjb25zdCBzdHJpbmcgQHN0cmluZyA9IFwiU3RyaW5nVmFsdWVcIjtcbiIKKyAgICAgICAgIn1cbiI7CisKKyAgICB0X3R5cGUqIHR5cGVfID0gbmV3IHRfYmFzZV90eXBlKCJzdHJpbmciLCB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkcpOworICAgIHR5cGVfLT5zZXRfZG9jKCJUZXN0RG9jIik7CisKKyAgICB0X2NvbnN0X3ZhbHVlKiBjb25zdF92YWx1ZV8gPSBuZXcgdF9jb25zdF92YWx1ZSgpOworICAgIGNvbnN0X3ZhbHVlXy0+c2V0X3N0cmluZygiU3RyaW5nVmFsdWUiKTsKKworICAgIHRfY29uc3QqIGNvbnN0XyA9IG5ldyB0X2NvbnN0KHR5cGVfLCAic3RyaW5nIiwgY29uc3RfdmFsdWVfKTsKKyAgICBjb25zdF8tPnNldF9kb2MoIlRlc3REb2MiKTsKKworICAgIHJldHVybiBzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4oZXhwZWN0ZWRfcmVzdWx0LCBjb25zdF8pOworfQorCitzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4gVGVzdERhdGFHZW5lcmF0b3I6OmdldF90ZXN0X2Jvb2xfY29uc3RfZGF0YSh0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4pCit7CisgICAgc3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCA9IERFRkFVTFRfRklMRV9IRUFERVIgKyAiXG4iICtnZW4tPm5ldGNvcmVfdHlwZV91c2luZ3MoKSArCisgICAgICAgICJcbiIKKyAgICAgICAgInB1YmxpYyBzdGF0aWMgY2xhc3MgbmV0Y29yZUNvbnN0YW50c1xuIgorICAgICAgICAie1xuIgorICAgICAgICAiICAvLy8gPHN1bW1hcnk+XG4iCisgICAgICAgICIgIC8vLyBUZXN0RG9jXG4iCisgICAgICAgICIgIC8vLyA8L3N1bW1hcnk+XG4iCisgICAgICAgICIgIHB1YmxpYyBjb25zdCBib29sIEBib29sID0gdHJ1ZTtcbiIKKyAgICAgICAgIn1cbiI7CisKKyAgICB0X3R5cGUqIHR5cGVfID0gbmV3IHRfYmFzZV90eXBlKCJib29sIiwgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTCk7CisgICAgdHlwZV8tPnNldF9kb2MoIlRlc3REb2MiKTsKKworICAgIHRfY29uc3RfdmFsdWUqIGNvbnN0X3ZhbHVlXyA9IG5ldyB0X2NvbnN0X3ZhbHVlKCk7CisgICAgY29uc3RfdmFsdWVfLT5zZXRfaW50ZWdlcigxKTsKKworICAgIHRfY29uc3QqIGNvbnN0XyA9IG5ldyB0X2NvbnN0KHR5cGVfLCAiYm9vbCIsIGNvbnN0X3ZhbHVlXyk7CisgICAgY29uc3RfLT5zZXRfZG9jKCJUZXN0RG9jIik7CisKKyAgICByZXR1cm4gc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+KGV4cGVjdGVkX3Jlc3VsdCwgY29uc3RfKTsKK30KKworc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+IFRlc3REYXRhR2VuZXJhdG9yOjpnZXRfdGVzdF9pOF9jb25zdF9kYXRhKHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbikKK3sKKyAgICBzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0ID0gREVGQVVMVF9GSUxFX0hFQURFUiArICJcbiIgK2dlbi0+bmV0Y29yZV90eXBlX3VzaW5ncygpICsKKyAgICAgICAgIlxuIgorICAgICAgICAicHVibGljIHN0YXRpYyBjbGFzcyBuZXRjb3JlQ29uc3RhbnRzXG4iCisgICAgICAgICJ7XG4iCisgICAgICAgICIgIC8vLyA8c3VtbWFyeT5cbiIKKyAgICAgICAgIiAgLy8vIFRlc3REb2NcbiIKKyAgICAgICAgIiAgLy8vIDwvc3VtbWFyeT5cbiIKKyAgICAgICAgIiAgcHVibGljIGNvbnN0IHNieXRlIEBzYnl0ZSA9IDEyNztcbiIKKyAgICAgICAgIn1cbiI7CisKKyAgICB0X3R5cGUqIHR5cGVfID0gbmV3IHRfYmFzZV90eXBlKCJJOCIsIHRfYmFzZV90eXBlOjpUWVBFX0k4KTsKKyAgICB0eXBlXy0+c2V0X2RvYygiVGVzdERvYyIpOworCisgICAgdF9jb25zdF92YWx1ZSogY29uc3RfdmFsdWVfID0gbmV3IHRfY29uc3RfdmFsdWUoKTsKKyAgICBjb25zdF92YWx1ZV8tPnNldF9pbnRlZ2VyKDEyNyk7CisKKyAgICB0X2NvbnN0KiBjb25zdF8gPSBuZXcgdF9jb25zdCh0eXBlXywgInNieXRlIiwgY29uc3RfdmFsdWVfKTsKKyAgICBjb25zdF8tPnNldF9kb2MoIlRlc3REb2MiKTsKKworICAgIHJldHVybiBzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4oZXhwZWN0ZWRfcmVzdWx0LCBjb25zdF8pOworfQorCitzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4gVGVzdERhdGFHZW5lcmF0b3I6OmdldF90ZXN0X2kxNl9jb25zdF9kYXRhKHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbikKK3sKKyAgICBzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0ID0gREVGQVVMVF9GSUxFX0hFQURFUiArICJcbiIgK2dlbi0+bmV0Y29yZV90eXBlX3VzaW5ncygpICsKKyAgICAgICAgIlxuIgorICAgICAgICAicHVibGljIHN0YXRpYyBjbGFzcyBuZXRjb3JlQ29uc3RhbnRzXG4iCisgICAgICAgICJ7XG4iCisgICAgICAgICIgIC8vLyA8c3VtbWFyeT5cbiIKKyAgICAgICAgIiAgLy8vIFRlc3REb2NcbiIKKyAgICAgICAgIiAgLy8vIDwvc3VtbWFyeT5cbiIKKyAgICAgICAgIiAgcHVibGljIGNvbnN0IHNob3J0IEBzaG9ydCA9IDMyNzY3O1xuIgorICAgICAgICAifVxuIjsKKworICAgIHRfdHlwZSogdHlwZV8gPSBuZXcgdF9iYXNlX3R5cGUoImkxNiIsIHRfYmFzZV90eXBlOjpUWVBFX0kxNik7CisgICAgdHlwZV8tPnNldF9kb2MoIlRlc3REb2MiKTsKKworICAgIHRfY29uc3RfdmFsdWUqIGNvbnN0X3ZhbHVlXyA9IG5ldyB0X2NvbnN0X3ZhbHVlKCk7CisgICAgY29uc3RfdmFsdWVfLT5zZXRfaW50ZWdlcigzMjc2Nyk7CisKKyAgICB0X2NvbnN0KiBjb25zdF8gPSBuZXcgdF9jb25zdCh0eXBlXywgInNob3J0IiwgY29uc3RfdmFsdWVfKTsKKyAgICBjb25zdF8tPnNldF9kb2MoIlRlc3REb2MiKTsKKworICAgIHJldHVybiBzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4oZXhwZWN0ZWRfcmVzdWx0LCBjb25zdF8pOworfQorCitzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4gVGVzdERhdGFHZW5lcmF0b3I6OmdldF90ZXN0X2kzMl9jb25zdF9kYXRhKHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbikKK3sKKyAgICBzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0ID0gREVGQVVMVF9GSUxFX0hFQURFUiArICJcbiIgK2dlbi0+bmV0Y29yZV90eXBlX3VzaW5ncygpICsKKyAgICAgICAgIlxuIgorICAgICAgICAicHVibGljIHN0YXRpYyBjbGFzcyBuZXRjb3JlQ29uc3RhbnRzXG4iCisgICAgICAgICJ7XG4iCisgICAgICAgICIgIC8vLyA8c3VtbWFyeT5cbiIKKyAgICAgICAgIiAgLy8vIFRlc3REb2NcbiIKKyAgICAgICAgIiAgLy8vIDwvc3VtbWFyeT5cbiIKKyAgICAgICAgIiAgcHVibGljIGNvbnN0IGludCBAaW50ID0gMjE0NzQ4MzY0NztcbiIKKyAgICAgICAgIn1cbiI7CisKKyAgICB0X3R5cGUqIHR5cGVfID0gbmV3IHRfYmFzZV90eXBlKCJpMzIiLCB0X2Jhc2VfdHlwZTo6VFlQRV9JMzIpOworICAgIHR5cGVfLT5zZXRfZG9jKCJUZXN0RG9jIik7CisKKyAgICB0X2NvbnN0X3ZhbHVlKiBjb25zdF92YWx1ZV8gPSBuZXcgdF9jb25zdF92YWx1ZSgpOworICAgIGNvbnN0X3ZhbHVlXy0+c2V0X2ludGVnZXIoMjE0NzQ4MzY0Nyk7CisKKyAgICB0X2NvbnN0KiBjb25zdF8gPSBuZXcgdF9jb25zdCh0eXBlXywgImludCIsIGNvbnN0X3ZhbHVlXyk7CisgICAgY29uc3RfLT5zZXRfZG9jKCJUZXN0RG9jIik7CisKKyAgICByZXR1cm4gc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+KGV4cGVjdGVkX3Jlc3VsdCwgY29uc3RfKTsKK30KKworc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+IFRlc3REYXRhR2VuZXJhdG9yOjpnZXRfdGVzdF9pNjRfY29uc3RfZGF0YSh0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4pCit7CisgICAgc3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCA9IERFRkFVTFRfRklMRV9IRUFERVIgKyAiXG4iICtnZW4tPm5ldGNvcmVfdHlwZV91c2luZ3MoKSArCisgICAgICAgICJcbiIKKyAgICAgICAgInB1YmxpYyBzdGF0aWMgY2xhc3MgbmV0Y29yZUNvbnN0YW50c1xuIgorICAgICAgICAie1xuIgorICAgICAgICAiICAvLy8gPHN1bW1hcnk+XG4iCisgICAgICAgICIgIC8vLyBUZXN0RG9jXG4iCisgICAgICAgICIgIC8vLyA8L3N1bW1hcnk+XG4iCisgICAgICAgICIgIHB1YmxpYyBjb25zdCBsb25nIEBsb25nID0gOTIyMzM3MjAzNjg1NDc3NTgwNztcbiIKKyAgICAgICAgIn1cbiI7CisKKyAgICB0X3R5cGUqIHR5cGVfID0gbmV3IHRfYmFzZV90eXBlKCJpNjQiLCB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQpOworICAgIHR5cGVfLT5zZXRfZG9jKCJUZXN0RG9jIik7CisKKyAgICB0X2NvbnN0X3ZhbHVlKiBjb25zdF92YWx1ZV8gPSBuZXcgdF9jb25zdF92YWx1ZSgpOworICAgIGNvbnN0X3ZhbHVlXy0+c2V0X2ludGVnZXIoOTIyMzM3MjAzNjg1NDc3NTgwNyk7CisKKyAgICB0X2NvbnN0KiBjb25zdF8gPSBuZXcgdF9jb25zdCh0eXBlXywgImxvbmciLCBjb25zdF92YWx1ZV8pOworICAgIGNvbnN0Xy0+c2V0X2RvYygiVGVzdERvYyIpOworCisgICAgcmV0dXJuIHN0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPihleHBlY3RlZF9yZXN1bHQsIGNvbnN0Xyk7Cit9CisKK3N0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPiBUZXN0RGF0YUdlbmVyYXRvcjo6Z2V0X3Rlc3RfZG91YmxlX2NvbnN0X2RhdGEodF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuKQoreworICAgIHN0cmluZyBleHBlY3RlZF9yZXN1bHQgPSBERUZBVUxUX0ZJTEVfSEVBREVSICsgIlxuIiArZ2VuLT5uZXRjb3JlX3R5cGVfdXNpbmdzKCkgKworICAgICAgICAiXG4iCisgICAgICAgICJwdWJsaWMgc3RhdGljIGNsYXNzIG5ldGNvcmVDb25zdGFudHNcbiIKKyAgICAgICAgIntcbiIKKyAgICAgICAgIiAgLy8vIDxzdW1tYXJ5PlxuIgorICAgICAgICAiICAvLy8gVGVzdERvY1xuIgorICAgICAgICAiICAvLy8gPC9zdW1tYXJ5PlxuIgorICAgICAgICAiICBwdWJsaWMgY29uc3QgZG91YmxlIEBkb3VibGUgPSA5LjIyMzM3ZSsxODtcbiIKKyAgICAgICAgIn1cbiI7CisKKyAgICB0X3R5cGUqIHR5cGVfID0gbmV3IHRfYmFzZV90eXBlKCJkb3VibGUiLCB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEUpOworICAgIHR5cGVfLT5zZXRfZG9jKCJUZXN0RG9jIik7CisKKyAgICB0X2NvbnN0X3ZhbHVlKiBjb25zdF92YWx1ZV8gPSBuZXcgdF9jb25zdF92YWx1ZSgpOworICAgIGNvbnN0X3ZhbHVlXy0+c2V0X2RvdWJsZSg5MjIzMzcyMDM2ODU0Nzc1ODA3LjEpOworCisgICAgdF9jb25zdCogY29uc3RfID0gbmV3IHRfY29uc3QodHlwZV8sICJkb3VibGUiLCBjb25zdF92YWx1ZV8pOworICAgIGNvbnN0Xy0+c2V0X2RvYygiVGVzdERvYyIpOworCisgICAgcmV0dXJuIHN0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPihleHBlY3RlZF9yZXN1bHQsIGNvbnN0Xyk7Cit9CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdHMvbmV0Y29yZS90X25ldGNvcmVfZ2VuZXJhdG9yX2Z1bmN0aW9uYWxfdGVzdHNfaGVscGVycy5oIGIvY29tcGlsZXIvY3BwL3Rlc3RzL25ldGNvcmUvdF9uZXRjb3JlX2dlbmVyYXRvcl9mdW5jdGlvbmFsX3Rlc3RzX2hlbHBlcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmVhYWMyCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3RzL25ldGNvcmUvdF9uZXRjb3JlX2dlbmVyYXRvcl9mdW5jdGlvbmFsX3Rlc3RzX2hlbHBlcnMuaApAQCAtMCwwICsxLDM0IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSA8dGhyaWZ0L3BhcnNlL3RfcHJvZ3JhbS5oPgorCitjbGFzcyBUZXN0RGF0YUdlbmVyYXRvcgoreworcHVibGljOgorICAgIHN0YXRpYyBjb25zdCBzdHJpbmcgREVGQVVMVF9GSUxFX0hFQURFUjsKKworICAgIHN0YXRpYyBzdGQ6OnBhaXI8c3RyaW5nLCB0X2VudW0qPiBnZXRfdGVzdF9lbnVtX2RhdGEodF9wcm9ncmFtKiBwcm9ncmFtKTsKKyAgICBzdGF0aWMgc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+IGdldF90ZXN0X3ZvaWRfY29uc3RfZGF0YSh0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4pOworICAgIHN0YXRpYyBzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4gZ2V0X3Rlc3Rfc3RyaW5nX2NvbnN0X2RhdGEodF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuKTsKKyAgICBzdGF0aWMgc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+IGdldF90ZXN0X2Jvb2xfY29uc3RfZGF0YSh0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4pOworICAgIHN0YXRpYyBzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4gZ2V0X3Rlc3RfaThfY29uc3RfZGF0YSh0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4pOworICAgIHN0YXRpYyBzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4gZ2V0X3Rlc3RfaTE2X2NvbnN0X2RhdGEodF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuKTsKKyAgICBzdGF0aWMgc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+IGdldF90ZXN0X2kzMl9jb25zdF9kYXRhKHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbik7CisgICAgc3RhdGljIHN0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPiBnZXRfdGVzdF9pNjRfY29uc3RfZGF0YSh0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4pOworICAgIHN0YXRpYyBzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4gZ2V0X3Rlc3RfZG91YmxlX2NvbnN0X2RhdGEodF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuKTsKK307CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdHMvbmV0Y29yZS90X25ldGNvcmVfZ2VuZXJhdG9yX2hlbHBlcnNfdGVzdHMuY2MgYi9jb21waWxlci9jcHAvdGVzdHMvbmV0Y29yZS90X25ldGNvcmVfZ2VuZXJhdG9yX2hlbHBlcnNfdGVzdHMuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJjYmVlZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0cy9uZXRjb3JlL3RfbmV0Y29yZV9nZW5lcmF0b3JfaGVscGVyc190ZXN0cy5jYwpAQCAtMCwwICsxLDIwOSBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgIi4uL2NhdGNoL2NhdGNoLmhwcCIKKyNpbmNsdWRlIDx0aHJpZnQvcGFyc2UvdF9wcm9ncmFtLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2dlbmVyYXRlL3RfbmV0Y29yZV9nZW5lcmF0b3IuaD4KKwordXNpbmcgc3RkOjp2ZWN0b3I7CisKK1RFU1RfQ0FTRSgidF9uZXRjb3JlX2dlbmVyYXRvcjo6bmV0Y29yZV90eXBlX3VzaW5ncygpIHdpdGhvdXQgb3B0aW9uIHdjZiBzaG91bGQgcmV0dXJuIHZhbGlkIG5hbWVzcGFjZXMiLCAiW2hlbHBlcnNdIikKK3sKKyAgICBzdHJpbmcgcGF0aCA9ICJDYXNzYW5kcmFUZXN0LnRocmlmdCI7CisgICAgc3RyaW5nIG5hbWUgPSAibmV0Y29yZSI7CisgICAgbWFwPHN0cmluZywgc3RyaW5nPiBwYXJzZWRfb3B0aW9ucyA9IHsgeyAidW5pb24iLCAidW5pb24iIH0gfTsKKyAgICBzdHJpbmcgb3B0aW9uX3N0cmluZyA9ICIiOworCisgICAgc3RyaW5nIGV4cGVjdGVkX25hbWVzcGFjZXMgPSAidXNpbmcgU3lzdGVtO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyBTeXN0ZW0uVGV4dDtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nIFN5c3RlbS5JTztcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nIFN5c3RlbS5UaHJlYWRpbmc7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNpbmcgVGhyaWZ0O1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNpbmcgVGhyaWZ0LkNvbGxlY3Rpb25zO1xuIiArIGVuZGw7CisKKyAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSBuZXcgdF9wcm9ncmFtKHBhdGgsIG5hbWUpOworICAgIHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbiA9IG5ldyB0X25ldGNvcmVfZ2VuZXJhdG9yKHByb2dyYW0sIHBhcnNlZF9vcHRpb25zLCBvcHRpb25fc3RyaW5nKTsKKworICAgIFJFUVVJUkVfRkFMU0UoZ2VuLT5pc193Y2ZfZW5hYmxlZCgpKTsKKyAgICBSRVFVSVJFKGdlbi0+bmV0Y29yZV90eXBlX3VzaW5ncygpID09IGV4cGVjdGVkX25hbWVzcGFjZXMpOworCisgICAgZGVsZXRlIGdlbjsKKyAgICBkZWxldGUgcHJvZ3JhbTsKK30KKworVEVTVF9DQVNFKCJ0X25ldGNvcmVfZ2VuZXJhdG9yOjpuZXRjb3JlX3R5cGVfdXNpbmdzKCkgd2l0aCBvcHRpb24gd2NmIHNob3VsZCByZXR1cm4gdmFsaWQgbmFtZXNwYWNlcyIsICJbaGVscGVyc10iKQoreworICAgIHN0cmluZyBwYXRoID0gIkNhc3NhbmRyYVRlc3QudGhyaWZ0IjsKKyAgICBzdHJpbmcgbmFtZSA9ICJuZXRjb3JlIjsKKyAgICBtYXA8c3RyaW5nLCBzdHJpbmc+IHBhcnNlZF9vcHRpb25zID0geyB7ICJ3Y2YiLCAid2NmIiB9IH07CisgICAgc3RyaW5nIG9wdGlvbl9zdHJpbmcgPSAiIjsKKworICAgIHN0cmluZyBleHBlY3RlZF9uYW1lc3BhY2VzX3djZiA9ICJ1c2luZyBTeXN0ZW07XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nIFN5c3RlbS5UZXh0O1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nIFN5c3RlbS5JTztcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyBTeXN0ZW0uVGhyZWFkaW5nO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNpbmcgVGhyaWZ0O1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nIFRocmlmdC5Db2xsZWN0aW9ucztcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyBTeXN0ZW0uU2VydmljZU1vZGVsO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb247XG4iICsgZW5kbDsKKworICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IG5ldyB0X3Byb2dyYW0ocGF0aCwgbmFtZSk7CisgICAgdF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuID0gbmV3IHRfbmV0Y29yZV9nZW5lcmF0b3IocHJvZ3JhbSwgcGFyc2VkX29wdGlvbnMsIG9wdGlvbl9zdHJpbmcpOworCisgICAgUkVRVUlSRShnZW4tPmlzX3djZl9lbmFibGVkKCkpOworICAgIFJFUVVJUkUoZ2VuLT5uZXRjb3JlX3R5cGVfdXNpbmdzKCkgPT0gZXhwZWN0ZWRfbmFtZXNwYWNlc193Y2YpOworCisgICAgZGVsZXRlIGdlbjsKKyAgICBkZWxldGUgcHJvZ3JhbTsKK30KKworVEVTVF9DQVNFKCJ0X25ldGNvcmVfZ2VuZXJhdG9yIHNob3VsZCBjb250YWlucyBsYXRlc3QgQyMga2V5d29yZHMgdG8gbm9ybWFsaXplIHdpdGggQCIsICJbaGVscGVyc10iKQoreworICAgIHN0cmluZyBwYXRoID0gIkNhc3NhbmRyYVRlc3QudGhyaWZ0IjsKKyAgICBzdHJpbmcgbmFtZSA9ICJuZXRjb3JlIjsKKyAgICBtYXA8c3RyaW5nLCBzdHJpbmc+IHBhcnNlZF9vcHRpb25zID0geyB7ICJ3Y2YiLCAid2NmIiB9IH07CisgICAgc3RyaW5nIG9wdGlvbl9zdHJpbmcgPSAiIjsKKyAgICB2ZWN0b3I8c3RyaW5nPiBjdXJyZW50X2tleXdvcmRzID0geworICAgICAgICB7ICJhYnN0cmFjdCIgfSwKKyAgICAgICAgeyAiYXMiIH0sCisgICAgICAgIHsgImJhc2UiIH0sCisgICAgICAgIHsgImJvb2wiIH0sCisgICAgICAgIHsgImJyZWFrIiB9LAorICAgICAgICB7ICJieXRlIiB9LAorICAgICAgICB7ICJjYXNlIiB9LAorICAgICAgICB7ICJjYXRjaCIgfSwKKyAgICAgICAgeyAiY2hhciIgfSwKKyAgICAgICAgeyAiY2hlY2tlZCIgfSwKKyAgICAgICAgeyAiY2xhc3MiIH0sCisgICAgICAgIHsgImNvbnN0IiB9LAorICAgICAgICB7ICJjb250aW51ZSIgfSwKKyAgICAgICAgeyAiZGVjaW1hbCIgfSwKKyAgICAgICAgeyAiZGVmYXVsdCIgfSwKKyAgICAgICAgeyAiZGVsZWdhdGUiIH0sCisgICAgICAgIHsgImRvIiB9LAorICAgICAgICB7ICJkb3VibGUiIH0sCisgICAgICAgIHsgImVsc2UiIH0sCisgICAgICAgIHsgImVudW0iIH0sCisgICAgICAgIHsgImV2ZW50IiB9LAorICAgICAgICB7ICJleHBsaWNpdCIgfSwKKyAgICAgICAgeyAiZXh0ZXJuIiB9LAorICAgICAgICB7ICJmYWxzZSIgfSwKKyAgICAgICAgeyAiZmluYWxseSIgfSwKKyAgICAgICAgeyAiZml4ZWQiIH0sCisgICAgICAgIHsgImZsb2F0IiB9LAorICAgICAgICB7ICJmb3IiIH0sCisgICAgICAgIHsgImZvcmVhY2giIH0sCisgICAgICAgIHsgImdvdG8iIH0sCisgICAgICAgIHsgImlmIiB9LAorICAgICAgICB7ICJpbXBsaWNpdCIgfSwKKyAgICAgICAgeyAiaW4iIH0sCisgICAgICAgIHsgImludCIgfSwKKyAgICAgICAgeyAiaW50ZXJmYWNlIiB9LAorICAgICAgICB7ICJpbnRlcm5hbCIgfSwKKyAgICAgICAgeyAiaXMiIH0sCisgICAgICAgIHsgImxvY2siIH0sCisgICAgICAgIHsgImxvbmciIH0sCisgICAgICAgIHsgIm5hbWVzcGFjZSIgfSwKKyAgICAgICAgeyAibmV3IiB9LAorICAgICAgICB7ICJudWxsIiB9LAorICAgICAgICB7ICJvYmplY3QiIH0sCisgICAgICAgIHsgIm9wZXJhdG9yIiB9LAorICAgICAgICB7ICJvdXQiIH0sCisgICAgICAgIHsgIm92ZXJyaWRlIiB9LAorICAgICAgICB7ICJwYXJhbXMiIH0sCisgICAgICAgIHsgInByaXZhdGUiIH0sCisgICAgICAgIHsgInByb3RlY3RlZCIgfSwKKyAgICAgICAgeyAicHVibGljIiB9LAorICAgICAgICB7ICJyZWFkb25seSIgfSwKKyAgICAgICAgeyAicmVmIiB9LAorICAgICAgICB7ICJyZXR1cm4iIH0sCisgICAgICAgIHsgInNieXRlIiB9LAorICAgICAgICB7ICJzZWFsZWQiIH0sCisgICAgICAgIHsgInNob3J0IiB9LAorICAgICAgICB7ICJzaXplb2YiIH0sCisgICAgICAgIHsgInN0YWNrYWxsb2MiIH0sCisgICAgICAgIHsgInN0YXRpYyIgfSwKKyAgICAgICAgeyAic3RyaW5nIiB9LAorICAgICAgICB7ICJzdHJ1Y3QiIH0sCisgICAgICAgIHsgInN3aXRjaCIgfSwKKyAgICAgICAgeyAidGhpcyIgfSwKKyAgICAgICAgeyAidGhyb3ciIH0sCisgICAgICAgIHsgInRydWUiIH0sCisgICAgICAgIHsgInRyeSIgfSwKKyAgICAgICAgeyAidHlwZW9mIiB9LAorICAgICAgICB7ICJ1aW50IiB9LAorICAgICAgICB7ICJ1bG9uZyIgfSwKKyAgICAgICAgeyAidW5jaGVja2VkIiB9LAorICAgICAgICB7ICJ1bnNhZmUiIH0sCisgICAgICAgIHsgInVzaG9ydCIgfSwKKyAgICAgICAgeyAidXNpbmciIH0sCisgICAgICAgIHsgInZvaWQiIH0sCisgICAgICAgIHsgInZvbGF0aWxlIiB9LAorICAgICAgICB7ICJ3aGlsZSIgfSwKKyAgICAgICAgLy8gQ29udGV4dHVhbCBLZXl3b3JkcworICAgICAgICB7ICJhZGQiIH0sCisgICAgICAgIHsgImFsaWFzIiB9LAorICAgICAgICB7ICJhc2NlbmRpbmciIH0sCisgICAgICAgIHsgImFzeW5jIiB9LAorICAgICAgICB7ICJhd2FpdCIgfSwKKyAgICAgICAgeyAiZGVzY2VuZGluZyIgfSwKKyAgICAgICAgeyAiZHluYW1pYyIgfSwKKyAgICAgICAgeyAiZnJvbSIgfSwKKyAgICAgICAgeyAiZ2V0IiB9LAorICAgICAgICB7ICJnbG9iYWwiIH0sCisgICAgICAgIHsgImdyb3VwIiB9LAorICAgICAgICB7ICJpbnRvIiB9LAorICAgICAgICB7ICJqb2luIiB9LAorICAgICAgICB7ICJsZXQiIH0sCisgICAgICAgIHsgIm9yZGVyYnkiIH0sCisgICAgICAgIHsgInBhcnRpYWwiIH0sCisgICAgICAgIHsgInJlbW92ZSIgfSwKKyAgICAgICAgeyAic2VsZWN0IiB9LAorICAgICAgICB7ICJzZXQiIH0sCisgICAgICAgIHsgInZhbHVlIiB9LAorICAgICAgICB7ICJ2YXIiIH0sCisgICAgICAgIHsgIndoZW4iIH0sCisgICAgICAgIHsgIndoZXJlIiB9LAorICAgICAgICB7ICJ5aWVsZCIgfQorICAgIH07CisKKyAgICBzdHJpbmcgbWlzc2VkX2tleXdvcmRzID0gIiI7CisKKyAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSBuZXcgdF9wcm9ncmFtKHBhdGgsIG5hbWUpOworICAgIHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbiA9IG5ldyB0X25ldGNvcmVfZ2VuZXJhdG9yKHByb2dyYW0sIHBhcnNlZF9vcHRpb25zLCBvcHRpb25fc3RyaW5nKTsKKyAgICBnZW4tPmluaXRfZ2VuZXJhdG9yKCk7CisgICAgbWFwPHN0cmluZywgaW50PiBnZW5lcmF0b3JzX2tleXdvcmRzID0gZ2VuLT5nZXRfa2V5d29yZHNfbGlzdCgpOworCisgICAgZm9yICh2ZWN0b3I8c3RyaW5nPjo6aXRlcmF0b3IgaXQgPSBjdXJyZW50X2tleXdvcmRzLmJlZ2luKCk7IGl0ICE9IGN1cnJlbnRfa2V5d29yZHMuZW5kKCk7ICsraXQpCisgICAgeworICAgICAgICBpZiAoZ2VuZXJhdG9yc19rZXl3b3Jkcy5maW5kKCppdCkgPT0gZ2VuZXJhdG9yc19rZXl3b3Jkcy5lbmQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgbWlzc2VkX2tleXdvcmRzID0gbWlzc2VkX2tleXdvcmRzICsgKml0ICsgIiwiOworICAgICAgICB9CisgICAgfQorCisgICAgUkVRVUlSRShtaXNzZWRfa2V5d29yZHMgPT0gIiIpOworCisgICAgZGVsZXRlIGdlbjsKKyAgICBkZWxldGUgcHJvZ3JhbTsKK30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0cy9uZXRjb3JlL3RfbmV0Y29yZV9nZW5lcmF0b3JfaW5pdGlhbGl6YXRpb25fdGVzdHMuY2MgYi9jb21waWxlci9jcHAvdGVzdHMvbmV0Y29yZS90X25ldGNvcmVfZ2VuZXJhdG9yX2luaXRpYWxpemF0aW9uX3Rlc3RzLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjMTc3MzMKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdHMvbmV0Y29yZS90X25ldGNvcmVfZ2VuZXJhdG9yX2luaXRpYWxpemF0aW9uX3Rlc3RzLmNjCkBAIC0wLDAgKzEsNzQgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICIuLi9jYXRjaC9jYXRjaC5ocHAiCisjaW5jbHVkZSA8dGhyaWZ0L3BhcnNlL3RfcHJvZ3JhbS5oPgorI2luY2x1ZGUgPHRocmlmdC9nZW5lcmF0ZS90X25ldGNvcmVfZ2VuZXJhdG9yLmg+CisKK1RFU1RfQ0FTRSggInRfbmV0Y29yZV9nZW5lcmF0b3Igc2hvdWxkIHRocm93IGVycm9yIHdpdGggdW5rbm93biBvcHRpb25zIiwgIltpbml0aWFsaXphdGlvbl0iICkKK3sKKyAgICBzdHJpbmcgcGF0aCA9ICJDYXNzYW5kcmFUZXN0LnRocmlmdCI7CisgICAgc3RyaW5nIG5hbWUgPSAibmV0Y29yZSI7CisgICAgbWFwPHN0cmluZywgc3RyaW5nPiBwYXJzZWRfb3B0aW9ucyA9IHsgeyAia2V5cyIsICJrZXlzIiB9IH07CisgICAgc3RyaW5nIG9wdGlvbl9zdHJpbmcgPSAiIjsKKworICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IG5ldyB0X3Byb2dyYW0ocGF0aCwgbmFtZSk7CisgICAgdF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuID0gbnVsbHB0cjsKKworICAgIFJFUVVJUkVfVEhST1dTKGdlbiA9IG5ldyB0X25ldGNvcmVfZ2VuZXJhdG9yKHByb2dyYW0sIHBhcnNlZF9vcHRpb25zLCBvcHRpb25fc3RyaW5nKSk7CQorCisgICAgZGVsZXRlIGdlbjsKKyAgICBkZWxldGUgcHJvZ3JhbTsJCit9CisKK1RFU1RfQ0FTRSgidF9uZXRjb3JlX2dlbmVyYXRvciBzaG91bGQgY3JlYXRlIHZhbGlkIGluc3RhbmNlIHdpdGggdmFsaWQgb3B0aW9ucyIsICJbaW5pdGlhbGl6YXRpb25dIikKK3sKKyAgICBzdHJpbmcgcGF0aCA9ICJDYXNzYW5kcmFUZXN0LnRocmlmdCI7CisgICAgc3RyaW5nIG5hbWUgPSAibmV0Y29yZSI7CisgICAgbWFwPHN0cmluZywgc3RyaW5nPiBwYXJzZWRfb3B0aW9ucyA9IHsgeyAid2NmIiwgIndjZiIgfSwgeyAibnVsbGFibGUiLCAibnVsbGFibGUifSB9OworICAgIHN0cmluZyBvcHRpb25fc3RyaW5nID0gIiI7CisKKyAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSBuZXcgdF9wcm9ncmFtKHBhdGgsIG5hbWUpOworICAgIHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbiA9IG51bGxwdHI7CisKKyAgICBSRVFVSVJFX05PVEhST1coZ2VuID0gbmV3IHRfbmV0Y29yZV9nZW5lcmF0b3IocHJvZ3JhbSwgcGFyc2VkX29wdGlvbnMsIG9wdGlvbl9zdHJpbmcpKTsKKyAgICBSRVFVSVJFKGdlbiAhPSBudWxscHRyKTsKKyAgICBSRVFVSVJFKGdlbi0+aXNfd2NmX2VuYWJsZWQoKSk7CisgICAgUkVRVUlSRShnZW4tPmlzX251bGxhYmxlX2VuYWJsZWQoKSk7CisgICAgUkVRVUlSRV9GQUxTRShnZW4tPmlzX2hhc2hjb2RlX2VuYWJsZWQoKSk7CisgICAgUkVRVUlSRV9GQUxTRShnZW4tPmlzX3NlcmlhbGl6ZV9lbmFibGVkKCkpOworICAgIFJFUVVJUkVfRkFMU0UoZ2VuLT5pc191bmlvbl9lbmFibGVkKCkpOworCisgICAgZGVsZXRlIGdlbjsKKyAgICBkZWxldGUgcHJvZ3JhbTsKK30KKworVEVTVF9DQVNFKCJ0X25ldGNvcmVfZ2VuZXJhdG9yIHNob3VsZCBwYXNzIGluaXQgc3VjY2VzZnVsbHkiLCAiW2luaXRpYWxpemF0aW9uXSIpCit7CisgICAgc3RyaW5nIHBhdGggPSAiQ2Fzc2FuZHJhVGVzdC50aHJpZnQiOworICAgIHN0cmluZyBuYW1lID0gIm5ldGNvcmUiOworICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gcGFyc2VkX29wdGlvbnMgPSB7IHsgIndjZiIsICJ3Y2YiIH0seyAibnVsbGFibGUiLCAibnVsbGFibGUiIH0gfTsKKyAgICBzdHJpbmcgb3B0aW9uX3N0cmluZyA9ICIiOworCisgICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gbmV3IHRfcHJvZ3JhbShwYXRoLCBuYW1lKTsKKyAgICB0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4gPSBuZXcgdF9uZXRjb3JlX2dlbmVyYXRvcihwcm9ncmFtLCBwYXJzZWRfb3B0aW9ucywgb3B0aW9uX3N0cmluZyk7CisKKyAgICBSRVFVSVJFX05PVEhST1coZ2VuLT5pbml0X2dlbmVyYXRvcigpKTsKKworICAgIGRlbGV0ZSBnZW47CisgICAgZGVsZXRlIHByb2dyYW07Cit9CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdHMvdGVzdHNfbWFpbi5jYyBiL2NvbXBpbGVyL2NwcC90ZXN0cy90ZXN0c19tYWluLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxZDA5YjkKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdHMvdGVzdHNfbWFpbi5jYwpAQCAtMCwwICsxLDE5IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjZGVmaW5lIENBVENIX0NPTkZJR19NQUlOCisjaW5jbHVkZSAiY2F0Y2gvY2F0Y2guaHBwIgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3ZlcnNpb24uaC5pbiBiL2NvbXBpbGVyL2NwcC92ZXJzaW9uLmguaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3NzBlYzkuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3ZlcnNpb24uaC5pbgorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSNkZWZpbmUgVEhSSUZUX1ZFUlNJT04gIkBQQUNLQUdFX1ZFUlNJT05AIgpkaWZmIC0tZ2l0IGEvY29tcG9zZXIuanNvbiBiL2NvbXBvc2VyLmpzb24KaW5kZXggMGYyMmI3Ni4uMWQzYTZjMCAxMDA2NDQKLS0tIGEvY29tcG9zZXIuanNvbgorKysgYi9jb21wb3Nlci5qc29uCkBAIC0xLDkgKzEsMTEgQEAKIHsKICAgICAibmFtZSI6ICJhcGFjaGUvdGhyaWZ0IiwKICAgICAiZGVzY3JpcHRpb24iOiAiQXBhY2hlIFRocmlmdCBSUEMgc3lzdGVtIiwKLSAgICAiaG9tZXBhZ2UiOiAiaHR0cDovL3RocmlmdC5hcGFjaGUub3JnLyIsCisgICAgImhvbWVwYWdlIjogImh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZyIsCiAgICAgInR5cGUiOiAibGlicmFyeSIsCisgICAgImtleXdvcmRzIjogWyJSUEMiXSwKICAgICAibGljZW5zZSI6ICJBcGFjaGUtMi4wIiwKKyAgICAicmVhZG1lIjogIlJFQURNRS5tZCIsCiAgICAgImF1dGhvcnMiOiBbCiAgICAgICAgIHsKICAgICAgICAgICAgICJuYW1lIjogIkFwYWNoZSBUaHJpZnQgRGV2ZWxvcGVycyIsCkBAIC0xNiwxMiArMTgsMTkgQEAKICAgICAgICAgImlzc3VlcyI6ICJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVCIKICAgICB9LAogICAgICJyZXF1aXJlIjogewotICAgICAgICAicGhwIjogIj49NS4zLjAiCisgICAgICAgICJwaHAiOiAiXjUuNSB8fCBeNy4wIgorICAgIH0sCisgICAgInJlcXVpcmUtZGV2IjogeworICAgICAgICAicGhwdW5pdC9waHB1bml0IjogIn40LjguMzYiLAorICAgICAgICAic3F1aXpsYWJzL3BocF9jb2Rlc25pZmZlciI6ICIzLioiCiAgICAgfSwKICAgICAiYXV0b2xvYWQiOiB7Ci0gICAgICAgICJwc3ItMCI6IHsiVGhyaWZ0IjogImxpYi9waHAvbGliLyJ9CisgICAgICAgICJwc3ItNCI6IHsiVGhyaWZ0XFwiOiAibGliL3BocC9saWIvIn0KICAgICB9LAotICAgICJtaW5pbXVtLXN0YWJpbGl0eSI6ICJkZXYiLAorICAgICJhdXRvbG9hZC1kZXYiOiB7CisgICAgICAgICJwc3ItNCI6IHsiVGVzdFxcVGhyaWZ0XFwiOiAibGliL3BocC90ZXN0LyJ9CisgICAgfSwKKyAgICAibWluaW11bS1zdGFiaWxpdHkiOiAic3RhYmxlIiwKICAgICAiZXh0cmEiOiB7CiAgICAgICAgICJicmFuY2gtYWxpYXMiOiB7CiAgICAgICAgICAgICAiZGV2LW1hc3RlciI6ICIxLjAueC1kZXYiCmRpZmYgLS1naXQgYS9jb25maWd1cmUuYWMgYi9jb25maWd1cmUuYWMKaW5kZXggNWZhNjExZS4uMjE3NDYyOSAxMDA3NTUKLS0tIGEvY29uZmlndXJlLmFjCisrKyBiL2NvbmZpZ3VyZS5hYwpAQCAtMTgsMTIgKzE4LDEzIEBACiAjCiAKIEFDX1BSRVJFUSgyLjY1KQorQUNfQ09ORklHX01BQ1JPX0RJUihbLi9hY2xvY2FsXSkKIAotQUNfSU5JVChbdGhyaWZ0XSwgWzAuOS4yXSkKK0FDX0lOSVQoW3RocmlmdF0sIFsxLjAuMF0pCiAKIEFDX0NPTkZJR19BVVhfRElSKFsuXSkKIAotQU1fSU5JVF9BVVRPTUFLRShbMS4xMyB0YXItdXN0YXJdKQorQU1fSU5JVF9BVVRPTUFLRShbMS4xMyBzdWJkaXItb2JqZWN0cyB0YXItdXN0YXJdKQogUEtHX1BST0dfUEtHX0NPTkZJRwogCiBBQ19BUkdfVkFSKFtQWV9QUkVGSVhdLCBbUHJlZml4IGZvciBpbnN0YWxsaW5nIFB5dGhvbiBtb2R1bGVzLgpAQCAtMzMsMTAgKzM0LDEwIEBACiBBU19JRihbdGVzdCAieCRQWV9QUkVGSVgiID0geF0sIFtQWV9QUkVGSVg9Ii91c3IiXSkKIAogQUNfQVJHX1ZBUihbSkFWQV9QUkVGSVhdLCBbUHJlZml4IGZvciBpbnN0YWxsaW5nIHRoZSBKYXZhIGxpYiBqYXIuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAoTm9ybWFsIC0tcHJlZml4IGlzIGlnbm9yZWQgZm9yIEphdmEgYmVjYXVzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgSmF2YSBoYXMgZGlmZmVyZW50IGNvbnZlbnRpb25zLikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQgPSAiL3Vzci9sb2NhbC9saWIiXSkKLUFTX0lGKFt0ZXN0ICJ4JEpBVkFfUFJFRklYIiA9IHhdLCBbSkFWQV9QUkVGSVg9Ii91c3IvbG9jYWwvbGliIl0pCitBU19JRihbdGVzdCAieCRKQVZBX1BSRUZJWCIgIT0geF0sIFtKQVZBX1BSRUZJWD0iJEpBVkFfUFJFRklYL3Vzci9sb2NhbC9saWIiXSwKKyAgICAgIFt0ZXN0ICJ4JFBSRUZJWCIgIT0geF0sIFtKQVZBX1BSRUZJWD0iJFBSRUZJWC91c3IvbG9jYWwvbGliIl0sCisgICAgICBbSkFWQV9QUkVGSVg9Ii91c3IvbG9jYWwvbGliIl0pCiAKIEFDX0FSR19WQVIoW1JVQllfUFJFRklYXSwgW1ByZWZpeCBmb3IgaW5zdGFsbGluZyBSdWJ5IG1vZHVsZXMuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTm9ybWFsIC0tcHJlZml4IGlzIGlnbm9yZWQgZm9yIFJ1YnkgYmVjYXVzZQpAQCAtODIsNiArODMsOSBAQAogQUNfQVJHX1ZBUihbRE1EX0xJQkVWRU5UX0ZMQUdTXSwgW0RNRCBmbGFncyBmb3IgbGlua2luZyBsaWJldmVudCAoYXV0by1kZXRlY3RlZCBpZiBub3Qgc2V0KS5dKQogQUNfQVJHX1ZBUihbRE1EX09QRU5TU0xfRkxBR1NdLCBbRE1EIGZsYWdzIGZvciBsaW5raW5nIE9wZW5TU0wgKGF1dG8tZGV0ZWN0ZWQgaWYgbm90IHNldCkuXSkKIAorQUNfQVJHX1ZBUihbVEhSSUZUXSwgW1BhdGggdG8gdGhlIHRocmlmdCB0b29sIChuZWVkZWQgZm9yIGNyb3NzLWNvbXBpbGF0aW9uKS5dKQorQVNfSUYoW3Rlc3QgIngkVEhSSUZUIiA9IHhdLCBbVEhSSUZUPWBwd2RgL2NvbXBpbGVyL2NwcC90aHJpZnRdKQorCiBBQ19QUk9HX0NDCiBBQ19QUk9HX0NQUAogQUNfUFJPR19DWFgKQEAgLTk4LDcgKzEwMiwxMiBAQAogQUNfUFJPR19SQU5MSUIKIAogQUNfTEFORyhbQysrXSkKLUFYX0NYWF9DT01QSUxFX1NURENYWF8xMShbbm9leHRdKQorQVhfQ1hYX0NPTVBJTEVfU1REQ1hYXzExKFtub2V4dF0sIFttYW5kYXRvcnldKQorCitBTV9FWFRSQV9SRUNVUlNJVkVfVEFSR0VUUyhbc3R5bGVdKQorQUNfU1VCU1QoQ1BQU1RZTEVfQ01ELCAnZmluZCAuIC10eXBlIGYgXCggLWluYW1lICIqLmgiIC1vciAtaW5hbWUgIiouY3BwIiAtb3IgLWluYW1lICIqLmNjIiAtb3IgLWluYW1lICIqLnRjYyIgXCkgLXByaW50ZiAiUmVmb3JtYXR0aW5nOiAlaC8lZlxuIiAtZXhlYyBjbGFuZy1mb3JtYXQgLWkge30gXDsnKQorIyAnCisjIFRoZSBhYm92ZSBjb21tZW50IGlzIHRvIGZpeCBlZGl0b3Igc3ludGF4IGhpZ2hsaWdodGluZwogCiBBQ19BUkdfRU5BQkxFKFtsaWJzXSwKICAgQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLWxpYnNdLCBbYnVpbGQgdGhlIEFwYWNoZSBUaHJpZnQgbGlicmFyaWVzIFtkZWZhdWx0PXllc11dKSwKQEAgLTEwOSwzMSArMTE4LDQ0IEBACiAgIGhhdmVfbGlicz0ibm8iCiAgIHdpdGhfY3BwPSJubyIKICAgd2l0aF9jX2dsaWI9Im5vIgorICB3aXRoX2NsPSJubyIKICAgd2l0aF9qYXZhPSJubyIKICAgd2l0aF9jc2hhcnA9Im5vIgogICB3aXRoX3B5dGhvbj0ibm8iCisgIHdpdGhfcHkzPSJubyIKICAgd2l0aF9ydWJ5PSJubyIKICAgd2l0aF9oYXNrZWxsPSJubyIKKyAgd2l0aF9oYXhlPSJubyIKKyAgd2l0aF9kb3RuZXRjb3JlPSJubyIKICAgd2l0aF9wZXJsPSJubyIKICAgd2l0aF9waHA9Im5vIgogICB3aXRoX3BocF9leHRlbnNpb249Im5vIgorICB3aXRoX2RhcnQ9Im5vIgogICB3aXRoX2VybGFuZz0ibm8iCiAgIHdpdGhfZ289Im5vIgogICB3aXRoX2Q9Im5vIgogICB3aXRoX25vZGVqcz0ibm8iCisgIHdpdGhfbm9kZXRzPSJubyIKICAgd2l0aF9sdWE9Im5vIgorICB3aXRoX3JzPSJubyIKKyAgd2l0aF9zd2lmdD0ibm8iCiBmaQogCi0KIEFYX1RIUklGVF9MSUIoY3BwLCBbQysrXSwgeWVzKQogaGF2ZV9jcHA9bm8KIGlmIHRlc3QgIiR3aXRoX2NwcCIgPSAieWVzIjsgIHRoZW4KLSAgQVhfQk9PU1RfQkFTRShbMS41NC4wXSkKKyAgQVhfQk9PU1RfQkFTRShbMS41My4wXSkKICAgaWYgdGVzdCAieCRzdWNjZWVkZWQiID0gInh5ZXMiIDsgdGhlbgorICAgIEFDX1NVQlNUKFtCT09TVF9MSUJfRElSXSwgWyQoZWNobyAiJEJPT1NUX0xERkxBR1MiIHwgc2VkIC1lICdzL15cLUwvLycpXSkKKyAgICBBQ19TVUJTVChbQk9PU1RfQ0hST05PX0xEQUREXSwgWyQoZWNobyAiJEJPT1NUX0xJQl9ESVIvbGliYm9vc3RfY2hyb25vLmEiKV0pCisgICAgQUNfU1VCU1QoW0JPT1NUX0ZJTEVTWVNURU1fTERBRERdLCBbJChlY2hvICIkQk9PU1RfTElCX0RJUi9saWJib29zdF9maWxlc3lzdGVtLmEiKV0pCisgICAgQUNfU1VCU1QoW0JPT1NUX1NZU1RFTV9MREFERF0sIFskKGVjaG8gIiRCT09TVF9MSUJfRElSL2xpYmJvb3N0X3N5c3RlbS5hIildKQorICAgIEFDX1NVQlNUKFtCT09TVF9URVNUX0xEQUREXSwgWyQoZWNobyAiJEJPT1NUX0xJQl9ESVIvbGliYm9vc3RfdW5pdF90ZXN0X2ZyYW1ld29yay5hIildKQorICAgIEFDX1NVQlNUKFtCT09TVF9USFJFQURfTERBRERdLCBbJChlY2hvICIkQk9PU1RfTElCX0RJUi9saWJib29zdF90aHJlYWQuYSIpXSkKICAgICBoYXZlX2NwcD0ieWVzIgogICBmaQogCi0gIEFYX0xJQl9FVkVOVChbMS4wXSkKKyAgQVhfTElCX0VWRU5UKFsyLjBdKQogICBoYXZlX2xpYmV2ZW50PSRzdWNjZXNzCiAKICAgQVhfTElCX1pMSUIoWzEuMi4zXSkKQEAgLTE0NSwxNCArMTY3LDMzIEBACiAgICAgUEtHX0NIRUNLX01PRFVMRVMoW1FUXSwgW1F0Q29yZSA+PSA0LjMsIFF0TmV0d29yayA+PSA0LjNdLCBoYXZlX3F0PXllcywgaGF2ZV9xdD1ubykKICAgZmkKICAgaWYgdGVzdCAiJGhhdmVfcXQiID0gInllcyI7IHRoZW4KLSAgICBBQ19QQVRIX1BST0dTKFtRVF9NT0NdLCBbbW9jLXF0NCBtb2NdKQotICAgIGhhdmVfcXQ9JHN1Y2Nlc3MKKyAgICBBQ19QQVRIX1BST0dTKFtRVF9NT0NdLCBbbW9jLXF0NCBtb2NdLCAiZmFpbCIpCisgICAgaWYgdGVzdCAiJFFUX01PQyIgPSAiZmFpbCI7IHRoZW4KKyAgICAgIGhhdmVfcXQ9bm8KKyAgICBmaQorICBmaQorCisgIEFYX1RIUklGVF9MSUIocXQ1LCBbUXQ1XSwgeWVzKQorICBoYXZlX3F0NT1ubworICBxdF9yZWR1Y2VfcmVsb2M9IiIKKyAgaWYgdGVzdCAiJHdpdGhfcXQ1IiA9ICJ5ZXMiOyAgdGhlbgorICAgIFBLR19DSEVDS19NT0RVTEVTKFtRVDVdLCBbUXQ1Q29yZSA+PSA1LjAsIFF0NU5ldHdvcmsgPj0gNS4wXSwKKyAgICAgICAgICAgICAgICAgICAgICBbaGF2ZV9xdDU9eWVzO3F0X3JlZHVjZV9yZWxvYz1gJFBLR19DT05GSUcgLS12YXJpYWJsZT1xdF9jb25maWcgUXQ1Q29yZSB8IGdyZXAgInJlZHVjZV9yZWxvY2F0aW9ucyJgXSwKKyAgICAgICAgICAgICAgICAgICAgICBbaGF2ZV9xdDU9bm9dKQorICBmaQorICBpZiB0ZXN0ICIkaGF2ZV9xdDUiID0gInllcyI7IHRoZW4KKyAgICBBQ19QQVRIX1BST0dTKFtRVDVfTU9DXSwgW21vYy1xdDUgbW9jXSwgImZhaWwiKQorICAgIGlmIHRlc3QgIiRRVDVfTU9DIiA9ICJmYWlsIjsgdGhlbgorICAgICAgaGF2ZV9xdDU9bm8KKyAgICBmaQogICBmaQogZmkKIEFNX0NPTkRJVElPTkFMKFtXSVRIX0NQUF0sIFt0ZXN0ICIkaGF2ZV9jcHAiID0gInllcyJdKQogQU1fQ09ORElUSU9OQUwoW0FNWF9IQVZFX0xJQkVWRU5UXSwgW3Rlc3QgIiRoYXZlX2xpYmV2ZW50IiA9ICJ5ZXMiXSkKIEFNX0NPTkRJVElPTkFMKFtBTVhfSEFWRV9aTElCXSwgW3Rlc3QgIiRoYXZlX3psaWIiID0gInllcyJdKQogQU1fQ09ORElUSU9OQUwoW0FNWF9IQVZFX1FUXSwgW3Rlc3QgIiRoYXZlX3F0IiA9ICJ5ZXMiXSkKK0FNX0NPTkRJVElPTkFMKFtBTVhfSEFWRV9RVDVdLCBbdGVzdCAiJGhhdmVfcXQ1IiA9ICJ5ZXMiXSkKK0FNX0NPTkRJVElPTkFMKFtRVDVfUkVEVUNFX1JFTE9DQVRJT05TXSwgW3Rlc3QgIngkcXRfcmVkdWNlX3JlbG9jIiAhPSAieCJdKQogCiBBWF9USFJJRlRfTElCKGNfZ2xpYiwgW0MgKEdMaWIpXSwgeWVzKQogaWYgdGVzdCAiJHdpdGhfY19nbGliIiA9ICJ5ZXMiOyB0aGVuCkBAIC0xNjQsOCArMjA1LDIxIEBACiBmaQogQU1fQ09ORElUSU9OQUwoV0lUSF9DX0dMSUIsIFt0ZXN0ICIkaGF2ZV9nbGliMiIgPSAieWVzIiAtYSAiJGhhdmVfZ29iamVjdDIiID0gInllcyJdKQogCitlY2hvICJPcGVuU1NMIGNoZWNrIgoraWYgdGVzdCAiJGhhdmVfY3BwIiA9ICJ5ZXMiIC1vICIkaGF2ZV9jX2dsaWIiID0gInllcyI7ICB0aGVuCisgIGVjaG8gIkhhdmUgY3BwIG9yIGMgc28gd2UgY2hlY2sgZm9yIE9wZW5TU0wiCisgIEFYX0NIRUNLX09QRU5TU0woKQorZmkKKwogQVhfVEhSSUZUX0xJQihjc2hhcnAsIFtDI10sIHllcykKIGlmIHRlc3QgIiR3aXRoX2NzaGFycCIgPSAieWVzIjsgIHRoZW4KKyAgUEtHX0NIRUNLX01PRFVMRVMoTU9OTywgbW9ubyA+PSAyLjExLjAsIG1vbm9fMl8xMT15ZXMsIG1vbm9fMl8xMT1ubykKKyAgaWYgdGVzdCAiJG1vbm9fMl8xMSIgPT0gInllcyI7IHRoZW4KKyAgICBBQ19QQVRIX1BST0coW01DU10sIFttY3NdKQorICAgIGlmIHRlc3QgIngkTUNTIiAhPSAieCI7IHRoZW4KKyAgICAgIG1vbm9fbWNzPSJ5ZXMiCisgICAgZmkKKyAgZmkKICAgUEtHX0NIRUNLX01PRFVMRVMoTU9OTywgbW9ubyA+PSAyLjAuMCwgbmV0XzNfNT15ZXMsIG5ldF8zXzU9bm8pCiAgIFBLR19DSEVDS19NT0RVTEVTKE1PTk8sIG1vbm8gPj0gMS4yLjQsIGhhdmVfbW9ubz15ZXMsIGhhdmVfbW9ubz1ubykKICAgaWYgdGVzdCAiJGhhdmVfbW9ubyIgPSAieWVzIiA7IHRoZW4KQEAgLTE3NCw2ICsyMjgsNyBAQAogZmkKIEFNX0NPTkRJVElPTkFMKFdJVEhfTU9OTywgW3Rlc3QgIiRoYXZlX2NzaGFycCIgPSAieWVzIl0pCiBBTV9DT05ESVRJT05BTChORVRfMl8wLCBbdGVzdCAiJG5ldF8zXzUiID0gIm5vIl0pCitBTV9DT05ESVRJT05BTChNT05PX01DUywgW3Rlc3QgIiRtb25vX21jcyIgPSAieWVzIl0pCiAKIEFYX1RIUklGVF9MSUIoamF2YSwgW0phdmFdLCB5ZXMpCiBpZiB0ZXN0ICIkd2l0aF9qYXZhIiA9ICJ5ZXMiOyAgdGhlbgpAQCAtMTgyLDcgKzIzNyw4IEBACiAgIEFYX0NIRUNLX0FOVF9WRVJTSU9OKCRBTlQsIDEuNykKICAgQUNfU1VCU1QoQ0xBU1NQQVRIKQogICBBQ19TVUJTVChBTlRfRkxBR1MpCi0gIGlmIHRlc3QgIngkSkFWQUMiICE9ICJ4IiAmJiB0ZXN0ICJ4JEpBVkFDIiAhPSAieCIgJiYgdGVzdCAieCRBTlQiICE9ICJ4IiA7IHRoZW4KKyAgQUNfU1VCU1QoR1JBRExFX09QVFMpCisgIGlmIHRlc3QgIngkSkFWQSIgIT0gIngiICYmIHRlc3QgIngkSkFWQUMiICE9ICJ4IiAmJiB0ZXN0ICJ4JEFOVCIgIT0gIngiIDsgdGhlbgogICAgIGhhdmVfamF2YT0ieWVzIgogICBmaQogZmkKQEAgLTE5MiwxNyArMjQ4LDI1IEBACiBpZiB0ZXN0ICIkd2l0aF9lcmxhbmciID0gInllcyI7ICB0aGVuCiAgIEFDX0VSTEFOR19QQVRIX0VSTAogICBBQ19FUkxBTkdfUEFUSF9FUkxDCisgIEFDX1BBVEhfUFJPRyhbUkVCQVJdLCBbcmViYXJdKQogICBpZiB0ZXN0IC1uICIkRVJMQyIgOyB0aGVuCiAgICAgQUNfRVJMQU5HX1NVQlNUX0xJQl9ESVIKICAgICAjIEluc3RhbGwgaW50byB0aGUgZGV0ZWN0ZWQgRXJsYW5nIGRpcmVjdG9yeSBpbnN0ZWFkIG9mICRsaWJkaXIvZXJsYW5nL2xpYgogICAgIEVSTEFOR19JTlNUQUxMX0xJQl9ESVI9IiRFUkxBTkdfTElCX0RJUiIKICAgICBBQ19FUkxBTkdfU1VCU1RfSU5TVEFMTF9MSUJfU1VCRElSKEFDX1BBQ0tBR0VfTkFNRSwgQUNfUEFDS0FHRV9WRVJTSU9OKQogICBmaQotICBpZiB0ZXN0IC1uICIkRVJMIiAtYSAtbiAiJEVSTEMiIDsgdGhlbgorICBpZiB0ZXN0IC1uICIkRVJMIiAtYSAtbiAiJEVSTEMiICYmIHRlc3QgIngkUkVCQVIiICE9ICJ4IiA7IHRoZW4KICAgICBoYXZlX2VybGFuZz0ieWVzIgorCisgICAgIyBvdHBfcmVsZWFzZSBpcyBzaW1wbHkgYSBudW1iZXIgKGxpa2UgIjE3IikgZm9yIE9UUDE3KyB3aGlsZSAiUjE2Li4uIiBmb3IgT1RQMTYgb3IgbGVzcy4KKyAgICAjIE9UUCB2ZXJzaW9uIGlzIGN1cnJlbnRseSBvbmx5IHVzZWQgZm9yIHJ1bm5pbmcgdGVzdHMuCisgICAgaWYgJEVSTCAtZXZhbCAnZXJsYW5nOmRpc3BsYXkoZXJsYW5nOnN5c3RlbV9pbmZvKG90cF9yZWxlYXNlKSksaGFsdCgpLicgLW5vc2hlbGwgfCBncmVwICJeXCJSIiA+L2Rldi9udWxsOyB0aGVuCisgICAgICBlcmxhbmdfb3RwMTZfb3JfbGVzcz0ieWVzIgorICAgIGZpCiAgIGZpCiBmaQogQU1fQ09ORElUSU9OQUwoV0lUSF9FUkxBTkcsIFt0ZXN0ICIkaGF2ZV9lcmxhbmciID0gInllcyJdKQorQU1fQ09ORElUSU9OQUwoRVJMQU5HX09UUDE2LCBbdGVzdCAiJGVybGFuZ19vdHAxNl9vcl9sZXNzIiA9ICJ5ZXMiXSkKIAogQVhfVEhSSUZUX0xJQihub2RlanMsIFtOb2RlanNdLCB5ZXMpCiBoYXZlX25vZGVqcz1ubwpAQCAtMjE2LDI2ICsyODAsNTggQEAKIEFNX0NPTkRJVElPTkFMKFdJVEhfTk9ERUpTLCBbdGVzdCAiJGhhdmVfbm9kZWpzIiA9ICJ5ZXMiXSkKIEFNX0NPTkRJVElPTkFMKEhBVkVfTlBNLCBbdGVzdCAieCROUE0iICE9ICJ4Il0pCiAKK0FYX1RIUklGVF9MSUIobm9kZXRzLCBbTm9kZXRzXSwgeWVzKQoraGF2ZV9ub2RldHM9bm8KK2lmIHRlc3QgIiR3aXRoX25vZGV0cyIgPSAieWVzIjsgdGhlbgorICBBQ19QQVRIX1BST0dTKFtOT0RFVFNdLCBbbm9kZXRzIG5vZGVdKQorICBBQ19QQVRIX1BST0coW05QTV0sIFtucG1dKQorICBpZiB0ZXN0ICJ4JE5PREVUUyIgIT0gIngiIC1hICJ4JE5QTSIgIT0gIngiOyB0aGVuCisgICAgaGF2ZV9ub2RldHM9InllcyIKKyAgZmkKK2ZpCitBTV9DT05ESVRJT05BTChXSVRIX05PREVUUywgW3Rlc3QgIiRoYXZlX25vZGV0cyIgPSAieWVzIl0pCitBTV9DT05ESVRJT05BTChIQVZFX05QTSwgW3Rlc3QgIngkTlBNIiAhPSAieCJdKQorCiBBWF9USFJJRlRfTElCKGx1YSwgW0x1YV0sIHllcykKIGhhdmVfbHVhPW5vCiBpZiB0ZXN0ICIkd2l0aF9sdWEiID0gInllcyI7IHRoZW4KLSAgQUNfUEFUSF9QUk9HUyhbTFVBXSwgW2x1YV0pCi0gIGlmIHRlc3QgIngkTFVBIiAhPSAieCI7IHRoZW4KLSAgICBoYXZlX2x1YT0ieWVzIgorICBBWF9QUk9HX0xVQSg1LjIsLCBoYXZlX2x1YT0ieWVzIiwgaGF2ZV9sdWE9Im5vIikKKyAgaWYgdGVzdCAiJGhhdmVfbHVhIiA9ICJ5ZXMiOyB0aGVuCisgICAgQVhfTFVBX0hFQURFUlMoLCBoYXZlX2x1YT0ibm8iKQorICAgIEFYX0xVQV9MSUJTKCwgaGF2ZV9sdWE9Im5vIikKICAgZmkKIGZpCiBBTV9DT05ESVRJT05BTChXSVRIX0xVQSwgW3Rlc3QgIiRoYXZlX2x1YSIgPSAieWVzIl0pCiAKKyMgRmluZCBweXRob24gcmVnYXJkbGVzcyBvZiB3aXRoX3B5dGhvbiB2YWx1ZSwgYmVjYXVzZSBpdCdzIG5lZWRlZCBieSBtYWtlIGNyb3NzCitBTV9QQVRIX1BZVEhPTigyLjYsLCA6KQogQVhfVEhSSUZUX0xJQihweXRob24sIFtQeXRob25dLCB5ZXMpCiBpZiB0ZXN0ICIkd2l0aF9weXRob24iID0gInllcyI7ICB0aGVuCi0gIEFNX1BBVEhfUFlUSE9OKDIuNCwsIDopCi0gIGlmIHRlc3QgIngkUFlUSE9OIiAhPSAieCIgJiYgdGVzdCAieCRQWVRIT04iICE9ICJ4OiIgOyB0aGVuCisgIGlmIHRlc3QgLW4gIiRQWVRIT04iOyB0aGVuCiAgICAgaGF2ZV9weXRob249InllcyIKICAgZmkKKyAgQUNfUEFUSF9QUk9HKFtUUklBTF0sIFt0cmlhbF0pCisgIGlmIHRlc3QgLW4gIiRUUklBTCI7IHRoZW4KKyAgICBoYXZlX3RyaWFsPSJ5ZXMiCisgIGZpCiBmaQogQU1fQ09ORElUSU9OQUwoV0lUSF9QWVRIT04sIFt0ZXN0ICIkaGF2ZV9weXRob24iID0gInllcyJdKQorQU1fQ09ORElUSU9OQUwoV0lUSF9UV0lTVEVEX1RFU1QsIFt0ZXN0ICIkaGF2ZV90cmlhbCIgPSAieWVzIl0pCiAKLUFDX1BBVEhfUFJPRyhbVFJJQUxdLCBbdHJpYWxdKQorIyBGaW5kICJweXRob24zIiBleGVjdXRhYmxlLgorIyBJdCdzIGRpc3RybyBzcGVjaWZpYyBhbmQgZmFyIGZyb20gaWRlYWwgYnV0IG5lZWRlZCB0byBjcm9zcyB0ZXN0IHB5Mi0zIGF0IG9uY2UuCisjIFRPRE86IGZpbmQgInB5dGhvbjIiIGlmIGl0J3MgMy54CitoYXZlX3B5Mz0ibm8iCitBWF9USFJJRlRfTElCKHB5MywgW1B5M10sIHllcykKK2lmIHRlc3QgIiR3aXRoX3B5MyIgPSAieWVzIjsgdGhlbgorICBpZiAkUFlUSE9OIC0tdmVyc2lvbiAyPiYxIHwgZ3JlcCAtcSAiUHl0aG9uIDIiOyB0aGVuCisgICAgQUNfUEFUSF9QUk9HUyhbUFlUSE9OM10sIFtweXRob24zIHB5dGhvbjMuNyBweXRob24zNyBweXRob24zLjYgcHl0aG9uMzYgcHl0aG9uMy41IHB5dGhvbjM1IHB5dGhvbjMuNCBweXRob24zNF0pCisgICAgaWYgdGVzdCAtbiAiJFBZVEhPTjMiOyB0aGVuCisgICAgICBoYXZlX3B5Mz0ieWVzIgorICAgIGZpCisgIGZpCitmaQorQU1fQ09ORElUSU9OQUwoV0lUSF9QWTMsIFt0ZXN0ICIkaGF2ZV9weTMiID0gInllcyJdKQogCiBBWF9USFJJRlRfTElCKHBlcmwsIFtQZXJsXSwgeWVzKQogaWYgdGVzdCAiJHdpdGhfcGVybCIgPSAieWVzIjsgdGhlbgpAQCAtMjc1LDggKzM3MSwxNSBAQAogZmkKIEFNX0NPTkRJVElPTkFMKFdJVEhfUEhQX0VYVEVOU0lPTiwgW3Rlc3QgIiRoYXZlX3BocF9leHRlbnNpb24iID0gInllcyJdKQogCi1BQ19QQVRIX1BST0coW1BIUFVOSVRdLCBbcGhwdW5pdF0pCi1BTV9DT05ESVRJT05BTChIQVZFX1BIUFVOSVQsIFt0ZXN0ICJ4JFBIUFVOSVQiICE9ICJ4Il0pCitBWF9USFJJRlRfTElCKGRhcnQsIFtEQVJUXSwgeWVzKQoraWYgdGVzdCAiJHdpdGhfZGFydCIgPSAieWVzIjsgdGhlbgorICBBQ19QQVRIX1BST0coW0RBUlRdLCBbZGFydF0pCisgIEFDX1BBVEhfUFJPRyhbREFSVFBVQl0sIFtwdWJdKQorICBpZiB0ZXN0ICJ4JERBUlQiICE9ICJ4IiAtYSAieCREQVJUUFVCIiAhPSAieCI7IHRoZW4KKyAgICBoYXZlX2RhcnQ9InllcyIKKyAgZmkKK2ZpCitBTV9DT05ESVRJT05BTChXSVRIX0RBUlQsIFt0ZXN0ICIkaGF2ZV9kYXJ0IiA9ICJ5ZXMiXSkKIAogQVhfVEhSSUZUX0xJQihydWJ5LCBbUnVieV0sIHllcykKIGhhdmVfcnVieT1ubwpAQCAtMzEyLDEwICs0MTUsOTkgQEAKIGlmIHRlc3QgIiR3aXRoX2dvIiA9ICJ5ZXMiOyAgdGhlbgogICBBQ19QQVRIX1BST0coW0dPXSwgW2dvXSkKICAgaWYgW1sgLXggIiRHTyIgXV0gOyB0aGVuCi0gICAgaGF2ZV9nbz0ieWVzIgorICAgIEFTX0lGKFt0ZXN0IC1uICIkR08iXSxbCisgICAgICBheF9nb192ZXJzaW9uPSIxLjQiCisgICAgICBheF9nbzE3X3ZlcnNpb249IjEuNyIKKworICAgICAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgR28gdmVyc2lvbl0pCisgICAgICBnb2xhbmdfdmVyc2lvbj1gJEdPIHZlcnNpb24gMj4mMSB8ICRTRUQgLWUgJ3MvXChnbyBcKVwodmVyc2lvbiBcKVwoZ29cKVwoQDw6QDAtOUA6PkAuQDw6QDAtOUA6PkAuQDw6QDAtOUA6PkBcKVwoQDw6QFwqQDo+QCpcKS4qL1w0LydgCisgICAgICBBQ19NU0dfUkVTVUxUKCRnb2xhbmdfdmVyc2lvbikKKyAgICAgIEFDX1NVQlNUKFtnb2xhbmdfdmVyc2lvbl0sWyRnb2xhbmdfdmVyc2lvbl0pCisgICAgICBBWF9DT01QQVJFX1ZFUlNJT04oWyRheF9nb192ZXJzaW9uXSxbbGVdLFskZ29sYW5nX3ZlcnNpb25dLFsKKyAgICAgIDoKKyAgICAgICAgaGF2ZV9nbz0ieWVzIgorICAgICAgXSxbCisgICAgICA6CisgICAgICAgIGhhdmVfZ289Im5vIgorICAgICAgXSkKKyAgICAgIEFYX0NPTVBBUkVfVkVSU0lPTihbJGdvbGFuZ192ZXJzaW9uXSxbbHRdLFskYXhfZ28xN192ZXJzaW9uXSxbCisgICAgICA6CisgICAgICAgIGdvX3ZlcnNpb25fbHRfMTc9InllcyIKKyAgICAgIF0sWworICAgICAgOgorICAgICAgICBnb192ZXJzaW9uX2x0XzE3PSJubyIKKyAgICAgIF0pCisgICAgXSxbCisgICAgICBBQ19NU0dfV0FSTihbY291bGQgbm90IGZpbmQgR28gXSkKKyAgICAgIGhhdmVfZ289Im5vIgorICAgIF0pCiAgIGZpCiBmaQogQU1fQ09ORElUSU9OQUwoV0lUSF9HTywgW3Rlc3QgIiRoYXZlX2dvIiA9ICJ5ZXMiXSkKK0FNX0NPTkRJVElPTkFMKFtHT1ZFUlNJT05fTFRfMTddLCBbdGVzdCAiJGdvX3ZlcnNpb25fbHRfMTciID0gInllcyJdKQorCitBWF9USFJJRlRfTElCKHN3aWZ0LCBbU3dpZnRdLCB5ZXMpCitoYXZlX3N3aWZ0PSJubyIKK2lmIHRlc3QgIiR3aXRoX3N3aWZ0IiA9ICJ5ZXMiOyB0aGVuCisgIEFDX1BBVEhfUFJPRyhbU1dJRlRdLCBbc3dpZnRdKQorICBpZiB0ZXN0ICJ4JFNXSUZUIiAhPSAieCIgLWEgIngkU1dJRlQiICE9ICJ4IjsgdGhlbgorICAgIGhhdmVfc3dpZnQ9InllcyIKKyAgZmkKK2ZpCitBTV9DT05ESVRJT05BTChbV0lUSF9TV0lGVF0sIFt0ZXN0ICIkaGF2ZV9zd2lmdCIgPSAieWVzIl0pCisKK0FYX1RIUklGVF9MSUIocnMsIFtSdXN0XSwgeWVzKQoraGF2ZV9ycz0ibm8iCitpZiB0ZXN0ICIkd2l0aF9ycyIgPSAieWVzIjsgIHRoZW4KKyAgQUNfUEFUSF9QUk9HKFtDQVJHT10sIFtjYXJnb10pCisgIEFDX1BBVEhfUFJPRyhbUlVTVENdLCBbcnVzdGNdKQorICBpZiBbWyAteCAiJENBUkdPIiBdXSAmJiBbWyAteCAiJFJVU1RDIiBdXTsgdGhlbgorICAgICAgbWluX3J1c3RjX3ZlcnNpb249IjEuMTMiCisKKyAgICAgIEFDX01TR19DSEVDS0lORyhbZm9yIHJ1c3RjIHZlcnNpb25dKQorICAgICAgcnVzdGNfdmVyc2lvbj1gJFJVU1RDIC0tdmVyc2lvbiAyPiYxIHwgJFNFRCAtZSAncy9cKHJ1c3RjIFwpXChbMC05XVwpXC5cKFswLTldWzAtOV0qXClcLlwoWzAtOV1bMC05XSpcKS4qL1wyLlwzLydgCisgICAgICBBQ19NU0dfUkVTVUxUKCRydXN0Y192ZXJzaW9uKQorICAgICAgQUNfU1VCU1QoW3J1c3RjX3ZlcnNpb25dLFskcnVzdGNfdmVyc2lvbl0pCisKKyAgICAgIEFYX0NPTVBBUkVfVkVSU0lPTihbJG1pbl9ydXN0Y192ZXJzaW9uXSxbbGVdLFskcnVzdGNfdmVyc2lvbl0sWworICAgICAgOgorICAgICAgICBoYXZlX3JzPSJ5ZXMiCisgICAgICBdLFsKKyAgICAgIDoKKyAgICAgICAgaGF2ZV9ycz0ibm8iCisgICAgICBdKQorICBmaQorZmkKK0FNX0NPTkRJVElPTkFMKFdJVEhfUlMsIFt0ZXN0ICIkaGF2ZV9ycyIgPSAieWVzIl0pCisKK0FYX1RIUklGVF9MSUIoY2wsIFtDb21tb24gTGlzcF0sIHllcykKK2hhdmVfY2w9Im5vIgoraWYgdGVzdCAiJHdpdGhfY2wiID0gInllcyI7ICB0aGVuCisgIEFDX1BBVEhfUFJPRyhbU0JDTF0sIFtzYmNsXSkKKyAgaWYgdGVzdCAieCRTQkNMIiAhPSAieCI7IHRoZW4KKyAgICBoYXZlX2NsPSJ5ZXMiCisgIGZpCitmaQorQU1fQ09ORElUSU9OQUwoV0lUSF9DTCwgW3Rlc3QgIiRoYXZlX2NsIiA9ICJ5ZXMiXSkKKworQVhfVEhSSUZUX0xJQihoYXhlLCBbSGF4ZV0sIHllcykKK2lmIHRlc3QgIiR3aXRoX2hheGUiID0gInllcyI7ICB0aGVuCisgIEFDX1BBVEhfUFJPRyhbSEFYRV0sIFtoYXhlXSkKKyAgaWYgW1sgLXggIiRIQVhFIiBdXSA7IHRoZW4KKyAgICBBWF9QUk9HX0hBWEVfVkVSU0lPTiggWzMuMS4zXSwgaGF2ZV9oYXhlPSJ5ZXMiLCBoYXZlX2hheGU9Im5vIikKKyAgZmkKK2ZpCitBTV9DT05ESVRJT05BTChXSVRIX0hBWEUsIFt0ZXN0ICIkaGF2ZV9oYXhlIiA9ICJ5ZXMiXSkKKworCitBWF9USFJJRlRfTElCKGRvdG5ldGNvcmUsIFsuTkVUIENvcmVdLCB5ZXMpCitpZiB0ZXN0ICIkd2l0aF9kb3RuZXRjb3JlIiA9ICJ5ZXMiOyAgdGhlbgorICBBQ19QQVRIX1BST0coW0RPVE5FVENPUkVdLCBbZG90bmV0XSkKKyAgaWYgW1sgLXggIiRET1RORVRDT1JFIiBdXSA7IHRoZW4KKyAgICBBWF9QUk9HX0RPVE5FVENPUkVfVkVSU0lPTiggWzIuMC4wXSwgaGF2ZV9kb3RuZXRjb3JlPSJ5ZXMiLCBoYXZlX2RvdG5ldGNvcmU9Im5vIikKKyAgZmkKK2ZpCitBTV9DT05ESVRJT05BTChXSVRIX0RPVE5FVENPUkUsIFt0ZXN0ICIkaGF2ZV9kb3RuZXRjb3JlIiA9ICJ5ZXMiXSkKIAogCiBBWF9USFJJRlRfTElCKGQsIFtEXSwgeWVzKQpAQCAtMzU4LDcgKzU1MCw3IEBACiAgICAgICBlbHNlCiAgICAgICAgIEFYX0xJQl9FVkVOVChbMi4wXSkKICAgICAgICAgaWYgdGVzdCAiJHN1Y2Nlc3MiID0gInllcyI7IHRoZW4KLSAgICAgICAgICBETURfTElCRVZFTlRfRkxBR1M9JChlY2hvICIkTElCRVZFTlRfTERGTEFHUyAkTElCRVZFTlRfTElCUyIgfCBcCisgICAgICAgICAgRE1EX0xJQkVWRU5UX0ZMQUdTPSQoZWNobyAiLWZ1c2UtbGQ9Z29sZCAkTElCRVZFTlRfTERGTEFHUyAkTElCRVZFTlRfTElCUyIgfCBcCiAgICAgICAgICAgICBzZWQgLWUgJ3MvXiAqLy9nO3MvICokLy9nO3MvXlwoLlwpLy1MXDEvZztzLyAgKi8gLUwvZycpCiAgICAgICAgICAgd2l0aF9kX2V2ZW50X3Rlc3RzPSJ5ZXMiCiAgICAgICAgIGVsc2UKQEAgLTM4Miw3ICs1NzQsNyBAQAogICAgICAgZWxzZQogICAgICAgICBBWF9DSEVDS19PUEVOU1NMKFt3aXRoX2Rfc3NsX3Rlc3RzPSJ5ZXMiXSkKICAgICAgICAgaWYgdGVzdCAiJHdpdGhfZF9zc2xfdGVzdHMiID0gInllcyI7IHRoZW4KLSAgICAgICAgICBETURfT1BFTlNTTF9GTEFHUz0kKGVjaG8gIiRPUEVOU1NMX0xERkxBR1MgJE9QRU5TU0xfTElCUyIgfCBcCisgICAgICAgICAgRE1EX09QRU5TU0xfRkxBR1M9JChlY2hvICItZnVzZS1sZD1nb2xkICRPUEVOU1NMX0xERkxBR1MgJE9QRU5TU0xfTElCUyIgfCBcCiAgICAgICAgICAgICBzZWQgLWUgJ3MvXiAqLy9nO3MvICokLy9nO3MvXlwoLlwpLy1MXDEvZztzLyAgKi8gLUwvZycpCiAgICAgICAgIGVsc2UKICAgICAgICAgICBBQ19NU0dfV0FSTihbRCBPcGVuU1NMIGludGVyZmFjZSBwcmVzZW50LCBidXQgT3BlblNTTCBsaWJyYXJ5IG5vdCBmb3VuZC5dKQpAQCAtNDE0LDYgKzYwNiwyMCBAQAogZmkKIEFNX0NPTkRJVElPTkFMKFdJVEhfVEVTVFMsIFt0ZXN0ICIkaGF2ZV90ZXN0cyIgPSAieWVzIl0pCiAKK0FDX0FSR19FTkFCTEUoW3BsdWdpbl0sCisgIEFTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1wbHVnaW5dLCBbYnVpbGQgY29tcGlsZXIgcGx1Z2luIHN1cHBvcnQgW2RlZmF1bHQ9bm9dXSksCisgIFtdLCBlbmFibGVfcGx1Z2luPW5vCispCitoYXZlX3BsdWdpbj15ZXMKK2lmIHRlc3QgIiRoYXZlX2NwcCIgPSAibm8iIDsgdGhlbgorICBoYXZlX3BsdWdpbj0ibm8iCitmaQoraWYgdGVzdCAiJGVuYWJsZV9wbHVnaW4iID0gIm5vIjsgdGhlbgorICBoYXZlX3BsdWdpbj0ibm8iCitmaQorQUNfQ09ORklHX0xJTktTKFtjb21waWxlci9jcHAvdGVzdC9wbHVnaW4vdF9jcHBfZ2VuZXJhdG9yLmNjOmNvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfY3BwX2dlbmVyYXRvci5jY10pCitBTV9DT05ESVRJT05BTChXSVRIX1BMVUdJTiwgW3Rlc3QgIiRoYXZlX3BsdWdpbiIgPSAieWVzIl0pCisKIEFDX0FSR19FTkFCTEUoW3R1dG9yaWFsXSwKICAgQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLXR1dG9yaWFsXSwgW2J1aWxkIHR1dG9yaWFsIFtkZWZhdWx0PXllc11dKSwKICAgW10sIGVuYWJsZV90dXRvcmlhbD15ZXMKQEAgLTQ1MywxMSArNjU5LDE0IEBACiBBQ19DSEVDS19IRUFERVJTKFtuZXRkYi5oXSkKIEFDX0NIRUNLX0hFQURFUlMoW25ldGluZXQvaW4uaF0pCiBBQ19DSEVDS19IRUFERVJTKFtwdGhyZWFkLmhdKQorQUNfQ0hFQ0tfSEVBREVSUyhbc2lnbmFsLmhdKQogQUNfQ0hFQ0tfSEVBREVSUyhbc3RkZGVmLmhdKQogQUNfQ0hFQ0tfSEVBREVSUyhbc3RkbGliLmhdKQorQUNfQ0hFQ0tfSEVBREVSUyhbc3lzL2lvY3RsLmhdKQogQUNfQ0hFQ0tfSEVBREVSUyhbc3lzL3NvY2tldC5oXSkKIEFDX0NIRUNLX0hFQURFUlMoW3N5cy90aW1lLmhdKQogQUNfQ0hFQ0tfSEVBREVSUyhbc3lzL3VuLmhdKQorQUNfQ0hFQ0tfSEVBREVSUyhbcG9sbC5oXSkKIEFDX0NIRUNLX0hFQURFUlMoW3N5cy9wb2xsLmhdKQogQUNfQ0hFQ0tfSEVBREVSUyhbc3lzL3Jlc291cmNlLmhdKQogQUNfQ0hFQ0tfSEVBREVSUyhbdW5pc3RkLmhdKQpAQCAtNDc4LDIxICs2ODcsNiBAQAogQUNfQ0hFQ0tfTElCKHJ0LCBjbG9ja19nZXR0aW1lKQogQUNfQ0hFQ0tfTElCKHNvY2tldCwgc2V0c29ja29wdCkKIAotaWYgdGVzdCAiJGhhdmVfY3BwIiA9ICJ5ZXMiIDsgdGhlbgotIyBtaW5ndyB0b29sY2hhaW4gdXNlZCB0byBidWlsZCAiVGhyaWZ0IENvbXBpbGVyIGZvciBXaW5kb3dzIgotIyBkb2VzIG5vdCBzdXBwb3J0IGxpYmNyeXB0bywgc28gd2UganVzdCBjaGVjayBpZiB3ZSBidWlsZGluZyB0aGUgY3BwIGxpYnJhcnkKLUFDX0NIRUNLX0xJQihjcnlwdG8sCi0gICAgQk5faW5pdCwKLSAgICBbQUNfQ0hFQ0tfTElCKHNzbCwKLSAgICAgICAgU1NMX2N0cmwsCi0gICAgICAgIFtMSUJTPSItbHNzbCAtbGNyeXB0byAkTElCUyJdLAotICAgICAgICBbQUNfTVNHX0VSUk9SKFsiRXJyb3I6IGxpYnNzbCByZXF1aXJlZCJdKV0sCi0gICAgICAgIC1sY3J5cHRvCi0gICAgKV0sCi0gICAgW0FDX01TR19FUlJPUihbIkVycm9yOiBsaWJjcnlwdG8gcmVxdWlyZWQuIl0pXQotKQotZmkKLQogQUNfVFlQRV9JTlQxNl9UCiBBQ19UWVBFX0lOVDMyX1QKIEFDX1RZUEVfSU5UNjRfVApAQCAtNTA1LDcgKzY5OSw3IEBACiBBQ19UWVBFX1VJTlQzMl9UCiBBQ19UWVBFX1VJTlQ2NF9UCiBBQ19UWVBFX1VJTlQ4X1QKLUFDX0NIRUNLX1RZUEVTKFtwdHJkaWZmX3RdLCBbXSwgW2V4aXQgMV0pCitBQ19DSEVDS19UWVBFUyhbcHRyZGlmZl90XSwgW10sIFtlY2hvICJwdHJkaWZmX3Qgbm90IGZvdW5kIG9yIGcrKyBub3QgaW5zdGFsbGVkIC0gY2Fubm90IGNvbnRpbnVlIiAmJiBleGl0IDFdKQogCiBBQ19TVFJVQ1RfVE0KIApAQCAtNTQwLDYgKzczNCw3IEBACiBBQ19DSEVDS19GVU5DUyhbbWtkaXJdKQogQUNfQ0hFQ0tfRlVOQ1MoW3JlYWxwYXRoXSkKIEFDX0NIRUNLX0ZVTkNTKFtzZWxlY3RdKQorQUNfQ0hFQ0tfRlVOQ1MoW3NldGxvY2FsZV0pCiBBQ19DSEVDS19GVU5DUyhbc29ja2V0XSkKIEFDX0NIRUNLX0ZVTkNTKFtzdHJjaHJdKQogQUNfQ0hFQ0tfRlVOQ1MoW3N0cmR1cF0pCkBAIC01OTAsMjYgKzc4NSw5IEBACiBBQ19TVUJTVChHQ09WX0NYWEZMQUdTKQogQUNfU1VCU1QoR0NPVl9MREZMQUdTKQogCi1BQ19BUkdfRU5BQkxFKGJvb3N0dGhyZWFkcywKLSAgICAgICAgICAgICAgWyAgLS1lbmFibGUtYm9vc3R0aHJlYWRzICAgICAgdXNlIGJvb3N0IHRocmVhZHMsIGluc3RlYWQgb2YgUE9TSVggcHRocmVhZCAoZXhwZXJpbWVudGFsKSBdLAotICAgICAgICAgICAgICBbY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICAgICAgICAgICAgICAgIHllcykgRU5BQkxFX0JPT1NUVEhSRUFEUz0xIDs7Ci0gICAgICAgICAgICAgICAgbm8pIEVOQUJMRV9CT09TVFRIUkVBRFM9MCA7OwotICAgICAgICAgICAgICAgICopIEFDX01TR19FUlJPUihiYWQgdmFsdWUgJHtlbmFibGV2YWx9IGZvciAtLWVuYWJsZS1jb3YpIDs7Ci0gICAgICAgICAgICAgIGVzYWNdLAotICAgICAgICAgICAgICBbRU5BQkxFX0JPT1NUVEhSRUFEUz0yXSkKLQotCi1pZiB0ZXN0ICJ4WyRdRU5BQkxFX0JPT1NUVEhSRUFEUyIgPSAieDEiOyB0aGVuCi0gIEFDX01TR19XQVJOKGVuYWJsZSBib29zdHRocmVhZHMpCi0gIEFDX0RFRklORShbVVNFX0JPT1NUX1RIUkVBRF0sIFsxXSwgW2V4cGVyaW1lbnRhbCAtLWVuYWJsZS1ib29zdHRocmVhZHMgdGhhdCByZXBsYWNlcyBQT1NJWCBwdGhyZWFkIGJ5IGJvb3N0Ojp0aHJlYWRdKQotICBMSUJTPSItbGJvb3N0X3RocmVhZCAkTElCUyIKLWZpCi0KLUFNX0NPTkRJVElPTkFMKFtXSVRIX0JPT1NUVEhSRUFEU10sIFt0ZXN0ICJ4WyRdRU5BQkxFX0JPT1NUVEhSRUFEUyIgPSAieDEiXSkKLQogQUNfQ09ORklHX0hFQURFUlMoY29uZmlnLmg6Y29uZmlnLmhpbikKIEFDX0NPTkZJR19IRUFERVJTKGxpYi9jcHAvc3JjL3RocmlmdC9jb25maWcuaDpjb25maWcuaGluKQorQUNfQ09ORklHX0hFQURFUlMobGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NvbmZpZy5oOmNvbmZpZy5oaW4pCiAjIGdydWFyZCBhZ2FpbnN0IHByZSBkZWZpbmVkIGNvbmZpZy5oCiBBSF9UT1AoWwogI2lmbmRlZiBDT05GSUdfSApAQCAtNjIzLDEzNyArODAxLDE4NSBAQAogQUNfQ09ORklHX0ZJTEVTKFsKICAgTWFrZWZpbGUKICAgY29tcGlsZXIvY3BwL01ha2VmaWxlCi0gIGNvbXBpbGVyL2NwcC92ZXJzaW9uLmgKLSAgY29tcGlsZXIvY3BwL3NyYy93aW5kb3dzL3ZlcnNpb24uaAorICBjb21waWxlci9jcHAvc3JjL01ha2VmaWxlCisgIGNvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BsdWdpbi9NYWtlZmlsZQorICBjb21waWxlci9jcHAvdGVzdC9NYWtlZmlsZQorICBjb21waWxlci9jcHAvc3JjL3RocmlmdC92ZXJzaW9uLmgKICAgbGliL01ha2VmaWxlCisgIGxpYi9jbC9NYWtlZmlsZQogICBsaWIvY3BwL01ha2VmaWxlCiAgIGxpYi9jcHAvdGVzdC9NYWtlZmlsZQogICBsaWIvY3BwL3RocmlmdC1uYi5wYwogICBsaWIvY3BwL3RocmlmdC16LnBjCiAgIGxpYi9jcHAvdGhyaWZ0LXF0LnBjCisgIGxpYi9jcHAvdGhyaWZ0LXF0NS5wYwogICBsaWIvY3BwL3RocmlmdC5wYwogICBsaWIvY19nbGliL01ha2VmaWxlCiAgIGxpYi9jX2dsaWIvdGhyaWZ0X2NfZ2xpYi5wYwogICBsaWIvY19nbGliL3Rlc3QvTWFrZWZpbGUKICAgbGliL2NzaGFycC9NYWtlZmlsZQorICBsaWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L01ha2VmaWxlCiAgIGxpYi9kL01ha2VmaWxlCiAgIGxpYi9kL3Rlc3QvTWFrZWZpbGUKICAgbGliL2VybC9NYWtlZmlsZQogICBsaWIvZ28vTWFrZWZpbGUKICAgbGliL2dvL3Rlc3QvTWFrZWZpbGUKKyAgbGliL2hheGUvdGVzdC9NYWtlZmlsZQogICBsaWIvaHMvTWFrZWZpbGUKICAgbGliL2phdmEvTWFrZWZpbGUKKyAgbGliL2pzL01ha2VmaWxlCiAgIGxpYi9qcy90ZXN0L01ha2VmaWxlCisgIGxpYi9qc29uL01ha2VmaWxlCisgIGxpYi9qc29uL3Rlc3QvTWFrZWZpbGUKKyAgbGliL25ldGNvcmUvTWFrZWZpbGUKICAgbGliL25vZGVqcy9NYWtlZmlsZQorICBsaWIvbm9kZXRzL01ha2VmaWxlCiAgIGxpYi9wZXJsL01ha2VmaWxlCiAgIGxpYi9wZXJsL3Rlc3QvTWFrZWZpbGUKICAgbGliL3BocC9NYWtlZmlsZQogICBsaWIvcGhwL3Rlc3QvTWFrZWZpbGUKKyAgbGliL2RhcnQvTWFrZWZpbGUKICAgbGliL3B5L01ha2VmaWxlCiAgIGxpYi9yYi9NYWtlZmlsZQorICBsaWIvcnMvTWFrZWZpbGUKKyAgbGliL3JzL3Rlc3QvTWFrZWZpbGUKICAgbGliL2x1YS9NYWtlZmlsZQorICBsaWIvc3dpZnQvTWFrZWZpbGUKKyAgbGliL3htbC9NYWtlZmlsZQorICBsaWIveG1sL3Rlc3QvTWFrZWZpbGUKICAgdGVzdC9NYWtlZmlsZQorICB0ZXN0L2ZlYXR1cmVzL01ha2VmaWxlCiAgIHRlc3QvY19nbGliL01ha2VmaWxlCisgIHRlc3QvY2wvTWFrZWZpbGUKICAgdGVzdC9jcHAvTWFrZWZpbGUKKyAgdGVzdC9jc2hhcnAvTWFrZWZpbGUKICAgdGVzdC9lcmwvTWFrZWZpbGUKICAgdGVzdC9nby9NYWtlZmlsZQorICB0ZXN0L2hheGUvTWFrZWZpbGUKICAgdGVzdC9ocy9NYWtlZmlsZQorICB0ZXN0L2x1YS9NYWtlZmlsZQorICB0ZXN0L25ldGNvcmUvTWFrZWZpbGUKICAgdGVzdC9waHAvTWFrZWZpbGUKKyAgdGVzdC9kYXJ0L01ha2VmaWxlCiAgIHRlc3QvcGVybC9NYWtlZmlsZQogICB0ZXN0L3B5L01ha2VmaWxlCiAgIHRlc3QvcHkudHdpc3RlZC9NYWtlZmlsZQogICB0ZXN0L3B5LnRvcm5hZG8vTWFrZWZpbGUKICAgdGVzdC9yYi9NYWtlZmlsZQorICB0ZXN0L3JzL01ha2VmaWxlCiAgIHR1dG9yaWFsL01ha2VmaWxlCiAgIHR1dG9yaWFsL2NfZ2xpYi9NYWtlZmlsZQorICB0dXRvcmlhbC9jbC9NYWtlZmlsZQogICB0dXRvcmlhbC9jcHAvTWFrZWZpbGUKKyAgdHV0b3JpYWwvZC9NYWtlZmlsZQogICB0dXRvcmlhbC9nby9NYWtlZmlsZQorICB0dXRvcmlhbC9oYXhlL01ha2VmaWxlCiAgIHR1dG9yaWFsL2hzL01ha2VmaWxlCiAgIHR1dG9yaWFsL2phdmEvTWFrZWZpbGUKICAgdHV0b3JpYWwvanMvTWFrZWZpbGUKKyAgdHV0b3JpYWwvbmV0Y29yZS9NYWtlZmlsZQogICB0dXRvcmlhbC9ub2RlanMvTWFrZWZpbGUKKyAgdHV0b3JpYWwvZGFydC9NYWtlZmlsZQogICB0dXRvcmlhbC9weS9NYWtlZmlsZQogICB0dXRvcmlhbC9weS50d2lzdGVkL01ha2VmaWxlCiAgIHR1dG9yaWFsL3B5LnRvcm5hZG8vTWFrZWZpbGUKICAgdHV0b3JpYWwvcmIvTWFrZWZpbGUKKyAgdHV0b3JpYWwvcnMvTWFrZWZpbGUKIF0pCiAKK2lmIHRlc3QgIiRoYXZlX2NwcCIgPSAieWVzIiA7IHRoZW4gTUFZQkVfQ1BQPSJjcHAiIDsgZWxzZSBNQVlCRV9DUFA9IiIgOyBmaQorQUNfU1VCU1QoW01BWUJFX0NQUF0pCitpZiB0ZXN0ICIkaGF2ZV9jX2dsaWIiID0gInllcyIgOyB0aGVuIE1BWUJFX0NfR0xJQj0iY19nbGliIiA7IGVsc2UgTUFZQkVfQ19HTElCPSIiIDsgZmkKK0FDX1NVQlNUKFtNQVlCRV9DX0dMSUJdKQoraWYgdGVzdCAiJGhhdmVfZCIgPSAieWVzIiAtYSAiJGhhdmVfZGVpbW9zX2V2ZW50MiIgPSAieWVzIiAtYSAiJGhhdmVfZGVpbW9zX29wZW5zc2wiID0gInllcyI7IHRoZW4gTUFZQkVfRD0iZCIgOyBlbHNlIE1BWUJFX0Q9IiIgOyBmaQorQUNfU1VCU1QoW01BWUJFX0RdKQoraWYgdGVzdCAiJGhhdmVfamF2YSIgPSAieWVzIiA7IHRoZW4gTUFZQkVfSkFWQT0iamF2YSIgOyBlbHNlIE1BWUJFX0pBVkE9IiIgOyBmaQorQUNfU1VCU1QoW01BWUJFX0pBVkFdKQoraWYgdGVzdCAiJGhhdmVfY3NoYXJwIiA9ICJ5ZXMiIDsgdGhlbiBNQVlCRV9DU0hBUlA9ImNzaGFycCIgOyBlbHNlIE1BWUJFX0NTSEFSUD0iIiA7IGZpCitBQ19TVUJTVChbTUFZQkVfQ1NIQVJQXSkKK2lmIHRlc3QgIiRoYXZlX3B5dGhvbiIgPSAieWVzIiA7IHRoZW4gTUFZQkVfUFlUSE9OPSJweSIgOyBlbHNlIE1BWUJFX1BZVEhPTj0iIiA7IGZpCitBQ19TVUJTVChbTUFZQkVfUFlUSE9OXSkKK2lmIHRlc3QgIiRoYXZlX3B5MyIgPSAieWVzIiA7IHRoZW4gTUFZQkVfUFkzPSJweTMiIDsgZWxzZSBNQVlCRV9QWTM9IiIgOyBmaQorQUNfU1VCU1QoW01BWUJFX1BZM10pCitpZiB0ZXN0ICIkaGF2ZV9ydWJ5IiA9ICJ5ZXMiIDsgdGhlbiBNQVlCRV9SVUJZPSJyYiIgOyBlbHNlIE1BWUJFX1JVQlk9IiIgOyBmaQorQUNfU1VCU1QoW01BWUJFX1JVQlldKQoraWYgdGVzdCAiJGhhdmVfaGFza2VsbCIgPSAieWVzIiA7IHRoZW4gTUFZQkVfSEFTS0VMTD0iaHMiIDsgZWxzZSBNQVlCRV9IQVNLRUxMPSIiIDsgZmkKK0FDX1NVQlNUKFtNQVlCRV9IQVNLRUxMXSkKK2lmIHRlc3QgIiRoYXZlX3BlcmwiID0gInllcyIgOyB0aGVuIE1BWUJFX1BFUkw9InBlcmwiIDsgZWxzZSBNQVlCRV9QRVJMPSIiIDsgZmkKK0FDX1NVQlNUKFtNQVlCRV9QRVJMXSkKK2lmIHRlc3QgIiRoYXZlX3BocCIgPSAieWVzIiA7IHRoZW4gTUFZQkVfUEhQPSJwaHAiIDsgZWxzZSBNQVlCRV9QSFA9IiIgOyBmaQorQUNfU1VCU1QoW01BWUJFX1BIUF0pCitpZiB0ZXN0ICIkaGF2ZV9kYXJ0IiA9ICJ5ZXMiIDsgdGhlbiBNQVlCRV9EQVJUPSJkYXJ0IiA7IGVsc2UgTUFZQkVfREFSVD0iIiA7IGZpCitBQ19TVUJTVChbTUFZQkVfREFSVF0pCitpZiB0ZXN0ICIkaGF2ZV9nbyIgPSAieWVzIiA7IHRoZW4gTUFZQkVfR089ImdvIiA7IGVsc2UgTUFZQkVfR089IiIgOyBmaQorQUNfU1VCU1QoW01BWUJFX0dPXSkKK2lmIHRlc3QgIiRoYXZlX25vZGVqcyIgPSAieWVzIiA7IHRoZW4gTUFZQkVfTk9ERUpTPSJub2RlanMiIDsgZWxzZSBNQVlCRV9OT0RFSlM9IiIgOyBmaQorQUNfU1VCU1QoW01BWUJFX05PREVKU10pCitpZiB0ZXN0ICIkaGF2ZV9ub2RldHMiID0gInllcyIgOyB0aGVuIE1BWUJFX05PREVUUz0ibm9kZXRzIiA7IGVsc2UgTUFZQkVfTk9ERVRTPSIiIDsgZmkKK0FDX1NVQlNUKFtNQVlCRV9OT0RFVFNdKQoraWYgdGVzdCAiJGhhdmVfZXJsYW5nIiA9ICJ5ZXMiIDsgdGhlbiBNQVlCRV9FUkxBTkc9ImVybCIgOyBlbHNlIE1BWUJFX0VSTEFORz0iIiA7IGZpCitBQ19TVUJTVChbTUFZQkVfRVJMQU5HXSkKK2lmIHRlc3QgIiRoYXZlX2x1YSIgPSAieWVzIiA7IHRoZW4gTUFZQkVfTFVBPSJsdWEiIDsgZWxzZSBNQVlCRV9MVUE9IiIgOyBmaQorQUNfU1VCU1QoW01BWUJFX0xVQV0pCitpZiB0ZXN0ICIkaGF2ZV9ycyIgPSAieWVzIiA7IHRoZW4gTUFZQkVfUlM9InJzIiA7IGVsc2UgTUFZQkVfUlM9IiIgOyBmaQorQUNfU1VCU1QoW01BWUJFX1JTXSkKK2lmIHRlc3QgIiRoYXZlX3N3aWZ0IiA9ICJ5ZXMiIDsgdGhlbiBNQVlCRV9TV0lGVD0ic3dpZnQiIDsgZWxzZSBNQVlCRV9TV0lGVD0iIiA7IGZpCitBQ19TVUJTVChbTUFZQkVfU1dJRlRdKQoraWYgdGVzdCAiJGhhdmVfZG90bmV0Y29yZSIgPSAieWVzIiA7IHRoZW4gTUFZQkVfRE9UTkVUQ09SRT0ibmV0Y29yZSIgOyBlbHNlIE1BWUJFX0RPVE5FVENPUkU9IiIgOyBmaQorQUNfU1VCU1QoW01BWUJFX0RPVE5FVENPUkVdKQoraWYgdGVzdCAiJGhhdmVfY2wiID0gInllcyIgOyB0aGVuIE1BWUJFX0NMPSJjbCIgOyBlbHNlIE1BWUJFX0NMPSIiIDsgZmkKK0FDX1NVQlNUKFtNQVlCRV9DTF0pCisKIEFDX09VVFBVVAogCiAKIGVjaG8KIGVjaG8gIiRQQUNLQUdFICRWRVJTSU9OIgogZWNobwotZWNobyAiQnVpbGRpbmcgQysrIExpYnJhcnkgLi4uLi4uLi4uIDogJGhhdmVfY3BwIgogZWNobyAiQnVpbGRpbmcgQyAoR0xpYikgTGlicmFyeSAuLi4uIDogJGhhdmVfY19nbGliIgotZWNobyAiQnVpbGRpbmcgSmF2YSBMaWJyYXJ5IC4uLi4uLi4uIDogJGhhdmVfamF2YSIKLWVjaG8gIkJ1aWxkaW5nIEMjIExpYnJhcnkgLi4uLi4uLi4uLiA6ICRoYXZlX2NzaGFycCIKLWVjaG8gIkJ1aWxkaW5nIFB5dGhvbiBMaWJyYXJ5IC4uLi4uLiA6ICRoYXZlX3B5dGhvbiIKLWVjaG8gIkJ1aWxkaW5nIFJ1YnkgTGlicmFyeSAuLi4uLi4uLiA6ICRoYXZlX3J1YnkiCi1lY2hvICJCdWlsZGluZyBIYXNrZWxsIExpYnJhcnkgLi4uLi4gOiAkaGF2ZV9oYXNrZWxsIgotZWNobyAiQnVpbGRpbmcgUGVybCBMaWJyYXJ5IC4uLi4uLi4uIDogJGhhdmVfcGVybCIKLWVjaG8gIkJ1aWxkaW5nIFBIUCBMaWJyYXJ5IC4uLi4uLi4uLiA6ICRoYXZlX3BocCIKK2VjaG8gIkJ1aWxkaW5nIEMjIChNb25vKSBMaWJyYXJ5IC4uLiA6ICRoYXZlX2NzaGFycCIKK2VjaG8gIkJ1aWxkaW5nIEMrKyBMaWJyYXJ5IC4uLi4uLi4uLiA6ICRoYXZlX2NwcCIKK2VjaG8gIkJ1aWxkaW5nIENvbW1vbiBMaXNwIExpYnJhcnkuLiA6ICRoYXZlX2NsIgorZWNobyAiQnVpbGRpbmcgRCBMaWJyYXJ5IC4uLi4uLi4uLi4uIDogJGhhdmVfZCIKK2VjaG8gIkJ1aWxkaW5nIERhcnQgTGlicmFyeSAuLi4uLi4uLiA6ICRoYXZlX2RhcnQiCitlY2hvICJCdWlsZGluZyBkb3RuZXRjb3JlIExpYnJhcnkgLi4gOiAkaGF2ZV9kb3RuZXRjb3JlIgogZWNobyAiQnVpbGRpbmcgRXJsYW5nIExpYnJhcnkgLi4uLi4uIDogJGhhdmVfZXJsYW5nIgogZWNobyAiQnVpbGRpbmcgR28gTGlicmFyeSAuLi4uLi4uLi4uIDogJGhhdmVfZ28iCi1lY2hvICJCdWlsZGluZyBEIExpYnJhcnkgLi4uLi4uLi4uLi4gOiAkaGF2ZV9kIgotZWNobyAiQnVpbGRpbmcgTm9kZUpTIExpYnJhcnkgLi4uLi4uIDogJGhhdmVfbm9kZWpzIgorZWNobyAiQnVpbGRpbmcgSGFza2VsbCBMaWJyYXJ5IC4uLi4uIDogJGhhdmVfaGFza2VsbCIKK2VjaG8gIkJ1aWxkaW5nIEhheGUgTGlicmFyeSAuLi4uLi4uLiA6ICRoYXZlX2hheGUiCitlY2hvICJCdWlsZGluZyBKYXZhIExpYnJhcnkgLi4uLi4uLi4gOiAkaGF2ZV9qYXZhIgogZWNobyAiQnVpbGRpbmcgTHVhIExpYnJhcnkgLi4uLi4uLi4uIDogJGhhdmVfbHVhIgorZWNobyAiQnVpbGRpbmcgTm9kZUpTIExpYnJhcnkgLi4uLi4uIDogJGhhdmVfbm9kZWpzIgorZWNobyAiQnVpbGRpbmcgUGVybCBMaWJyYXJ5IC4uLi4uLi4uIDogJGhhdmVfcGVybCIKK2VjaG8gIkJ1aWxkaW5nIFBIUCBMaWJyYXJ5IC4uLi4uLi4uLiA6ICRoYXZlX3BocCIKK2VjaG8gIkJ1aWxkaW5nIFBsdWdpbiBTdXBwb3J0IC4uLi4uLiA6ICRoYXZlX3BsdWdpbiIKK2VjaG8gIkJ1aWxkaW5nIFB5dGhvbiBMaWJyYXJ5IC4uLi4uLiA6ICRoYXZlX3B5dGhvbiIKK2VjaG8gIkJ1aWxkaW5nIFB5MyBMaWJyYXJ5IC4uLi4uLi4uLiA6ICRoYXZlX3B5MyIKK2VjaG8gIkJ1aWxkaW5nIFJ1YnkgTGlicmFyeSAuLi4uLi4uLiA6ICRoYXZlX3J1YnkiCitlY2hvICJCdWlsZGluZyBSdXN0IExpYnJhcnkgLi4uLi4uLi4gOiAkaGF2ZV9ycyIKK2VjaG8gIkJ1aWxkaW5nIFN3aWZ0IExpYnJhcnkgLi4uLi4uLiA6ICRoYXZlX3N3aWZ0IgogCi1pZiB0ZXN0ICIkaGF2ZV9jcHAiID0gInllcyIgOyB0aGVuCi0gIGVjaG8KLSAgZWNobyAiQysrIExpYnJhcnk6IgotICBlY2hvICIgICBCdWlsZCBUWmxpYlRyYW5zcG9ydCAuLi4uLi4gOiAkaGF2ZV96bGliIgotICBlY2hvICIgICBCdWlsZCBUTm9uYmxvY2tpbmdTZXJ2ZXIgLi4gOiAkaGF2ZV9saWJldmVudCIKLSAgZWNobyAiICAgQnVpbGQgVFFUY3BTZXJ2ZXIgKFF0KSAuLi4uIDogJGhhdmVfcXQiCi1maQotaWYgdGVzdCAiJGhhdmVfamF2YSIgPSAieWVzIiA7IHRoZW4KLSAgZWNobwotICBlY2hvICJKYXZhIExpYnJhcnk6IgotICBlY2hvICIgICBVc2luZyBqYXZhYyAuLi4uLi4uLi4uLi4uLi4gOiAkSkFWQUMiCi0gIGVjaG8gIiAgIFVzaW5nIGphdmEgLi4uLi4uLi4uLi4uLi4uLiA6ICRKQVZBIgotICBlY2hvICIgICBVc2luZyBhbnQgLi4uLi4uLi4uLi4uLi4uLi4gOiAkQU5UIgotZmkKIGlmIHRlc3QgIiRoYXZlX2NzaGFycCIgPSAieWVzIiA7IHRoZW4KICAgZWNobwogICBlY2hvICJDIyBMaWJyYXJ5OiIKICAgZWNobyAiICAgVXNpbmcgLk5FVCAzLjUgLi4uLi4uLi4uLi4uIDogJG5ldF8zXzUiCisgIGVjaG8gIiAgIFVzaW5nIG1vbm8gdmVyc2lvbiAuLi4uLi4uLiA6ICQoJE1DUyAtLXZlcnNpb24gfCBoZWFkIC0xKSIKIGZpCi1pZiB0ZXN0ICIkaGF2ZV9weXRob24iID0gInllcyIgOyB0aGVuCitpZiB0ZXN0ICIkaGF2ZV9jcHAiID0gInllcyIgOyB0aGVuCiAgIGVjaG8KLSAgZWNobyAiUHl0aG9uIExpYnJhcnk6IgotICBlY2hvICIgICBVc2luZyBQeXRob24gLi4uLi4uLi4uLi4uLi4gOiAkUFlUSE9OIgorICBlY2hvICJDKysgTGlicmFyeToiCisgIGVjaG8gIiAgIEMrKyBjb21waWxlciAuLi4uLi4uLi4uLi4uLiA6ICRDWFgiCisgIGVjaG8gIiAgIEJ1aWxkIFRabGliVHJhbnNwb3J0IC4uLi4uLiA6ICRoYXZlX3psaWIiCisgIGVjaG8gIiAgIEJ1aWxkIFROb25ibG9ja2luZ1NlcnZlciAuLiA6ICRoYXZlX2xpYmV2ZW50IgorICBlY2hvICIgICBCdWlsZCBUUVRjcFNlcnZlciAoUXQ0KSAuLi4gOiAkaGF2ZV9xdCIKKyAgZWNobyAiICAgQnVpbGQgVFFUY3BTZXJ2ZXIgKFF0NSkgLi4uIDogJGhhdmVfcXQ1IgorICBlY2hvICIgICBDKysgY29tcGlsZXIgdmVyc2lvbiAuLi4uLi4gOiAkKCRDWFggLS12ZXJzaW9uIHwgaGVhZCAtMSkiCiBmaQotaWYgdGVzdCAiJGhhdmVfcGhwIiA9ICJ5ZXMiIDsgdGhlbgoraWYgdGVzdCAiJGhhdmVfY2wiID0gInllcyIgOyB0aGVuCiAgIGVjaG8KLSAgZWNobyAiUEhQIExpYnJhcnk6IgotICBlY2hvICIgICBVc2luZyBwaHAtY29uZmlnIC4uLi4uLi4uLi4gOiAkUEhQX0NPTkZJRyIKLWZpCi1pZiB0ZXN0ICIkaGF2ZV9ydWJ5IiA9ICJ5ZXMiIDsgdGhlbgotICBlY2hvCi0gIGVjaG8gIlJ1YnkgTGlicmFyeToiCi0gIGVjaG8gIiAgIFVzaW5nIFJ1YnkgLi4uLi4uLi4uLi4uLi4uLiA6ICRSVUJZIgotZmkKLWlmIHRlc3QgIiRoYXZlX2hhc2tlbGwiID0gInllcyIgOyB0aGVuCi0gIGVjaG8KLSAgZWNobyAiSGFza2VsbCBMaWJyYXJ5OiIKLSAgZWNobyAiICAgVXNpbmcgSGFza2VsbCAuLi4uLi4uLi4uLi4uIDogJFJVTkhBU0tFTEwiCi0gIGVjaG8gIiAgIFVzaW5nIENhYmFsIC4uLi4uLi4uLi4uLi4uLiA6ICRDQUJBTCIKLWZpCi1pZiB0ZXN0ICIkaGF2ZV9wZXJsIiA9ICJ5ZXMiIDsgdGhlbgotICBlY2hvCi0gIGVjaG8gIlBlcmwgTGlicmFyeToiCi0gIGVjaG8gIiAgIFVzaW5nIFBlcmwgLi4uLi4uLi4uLi4uLi4uLiA6ICRQRVJMIgotZmkKLWlmIHRlc3QgIiRoYXZlX2VybGFuZyIgPSAieWVzIiA7IHRoZW4KLSAgZWNobwotICBlY2hvICJFcmxhbmcgTGlicmFyeToiCi0gIGVjaG8gIiAgIFVzaW5nIGVybGMgLi4uLi4uLi4uLi4uLi4uLiA6ICRFUkxDIgotZmkKLWlmIHRlc3QgIiRoYXZlX2dvIiA9ICJ5ZXMiIDsgdGhlbgotICBlY2hvCi0gIGVjaG8gIkdvIExpYnJhcnk6IgotICBlY2hvICIgICBVc2luZyBHby4uLi4uLi4uLi4uLi4uLi4uLi4gOiAkR08iCi0gIGVjaG8gIiAgIFVzaW5nIEdvIHZlcnNpb24uLi4uLi4uLi4uLiA6ICQoJEdPIHZlcnNpb24pIgorICBlY2hvICJDb21tb24gTGlzcCBMaWJyYXJ5OiIKKyAgZWNobyAiICAgVXNpbmcgQ29tbW9uIExpc3AgLi4uLi4uLi4uIDogJFNCQ0wiCisgIGVjaG8gIiAgIFVzaW5nIENvbW1vbiBMaXNwIHZlcnNpb24gLiA6ICQoJFNCQ0wgLS12ZXJzaW9uKSIKIGZpCiBpZiB0ZXN0ICIkaGF2ZV9kIiA9ICJ5ZXMiIDsgdGhlbgogICBlY2hvCkBAIC03NjEsNiArOTg3LDYxIEBACiAgIGVjaG8gIiAgIFVzaW5nIEQgQ29tcGlsZXIgLi4uLi4uLi4uLiA6ICRETUQiCiAgIGVjaG8gIiAgIEJ1aWxkaW5nIEQgbGliZXZlbnQgdGVzdHMgLiA6ICR3aXRoX2RfZXZlbnRfdGVzdHMiCiAgIGVjaG8gIiAgIEJ1aWxkaW5nIEQgU1NMIHRlc3RzIC4uLi4uLiA6ICR3aXRoX2Rfc3NsX3Rlc3RzIgorICBlY2hvICIgICBVc2luZyBEIHZlcnNpb24gLi4uLi4uLi4uLi4gOiAkKCRETUQgLS12ZXJzaW9uIHwgaGVhZCAtMSkiCitmaQoraWYgdGVzdCAiJGhhdmVfZGFydCIgPSAieWVzIiA7IHRoZW4KKyAgZWNobworICBlY2hvICJEYXJ0IExpYnJhcnk6IgorICBlY2hvICIgICBVc2luZyBEYXJ0IC4uLi4uLi4uLi4uLi4uLi4gOiAkREFSVCIKKyAgZWNobyAiICAgVXNpbmcgUHViIC4uLi4uLi4uLi4uLi4uLi4uIDogJERBUlRQVUIiCisgIGVjaG8gIiAgIFVzaW5nIERhcnQgdmVyc2lvbiAuLi4uLi4uLiA6ICQoJERBUlQgLS12ZXJzaW9uIDI+JjEpIgorZmkKK2lmIHRlc3QgIiRoYXZlX2RvdG5ldGNvcmUiID0gInllcyIgOyB0aGVuCisgIGVjaG8KKyAgZWNobyAiLk5FVCBDb3JlIExpYnJhcnk6IgorICBlY2hvICIgICBVc2luZyAuTkVUIENvcmUgLi4uLi4uLi4uLi4gOiAkRE9UTkVUQ09SRSIKKyAgZWNobyAiICAgVXNpbmcgLk5FVCBDb3JlIHZlcnNpb24gLi4uIDogJERPVE5FVENPUkVfVkVSU0lPTiIKK2ZpCitpZiB0ZXN0ICIkaGF2ZV9lcmxhbmciID0gInllcyIgOyB0aGVuCisgIGVjaG8KKyAgZWNobyAiRXJsYW5nIExpYnJhcnk6IgorICBlY2hvICIgICBVc2luZyBlcmxjIC4uLi4uLi4uLi4uLi4uLi4gOiAkRVJMQyIKKyAgZWNobyAiICAgVXNpbmcgcmViYXIgLi4uLi4uLi4uLi4uLi4uIDogJFJFQkFSIgorICBlY2hvICIgICBVc2luZyBlcmxjIHZlcnNpb24gLi4uLi4uLi4gOiAkKCRFUkwgLWV2YWwgJ2VybGFuZzpkaXNwbGF5KGVybGFuZzpzeXN0ZW1faW5mbyhvdHBfcmVsZWFzZSkpLCBoYWx0KCkuJyAtbm9zaGVsbCB8IHRyIC1kICdcIicpIgorZmkKK2lmIHRlc3QgIiRoYXZlX2dvIiA9ICJ5ZXMiIDsgdGhlbgorICBlY2hvCisgIGVjaG8gIkdvIExpYnJhcnk6IgorICBlY2hvICIgICBVc2luZyBHby4uLi4uLi4uLi4uLi4uLi4uLi4gOiAkR08iCisgIGVjaG8gIiAgIFVzaW5nIEdvIHZlcnNpb24uLi4uLi4uLi4uLiA6ICQoJEdPIHZlcnNpb24pIgorZmkKK2lmIHRlc3QgIiRoYXZlX2hhc2tlbGwiID0gInllcyIgOyB0aGVuCisgIGVjaG8KKyAgZWNobyAiSGFza2VsbCBMaWJyYXJ5OiIKKyAgZWNobyAiICAgVXNpbmcgQ2FiYWwgLi4uLi4uLi4uLi4uLi4uIDogJENBQkFMIgorICBlY2hvICIgICBVc2luZyBIYXNrZWxsIC4uLi4uLi4uLi4uLi4gOiAkUlVOSEFTS0VMTCIKKyAgZWNobyAiICAgVXNpbmcgSGFza2VsbCB2ZXJzaW9uIC4uLi4uIDogJCgkUlVOSEFTS0VMTCAtLXZlcnNpb24pIgorZmkKK2lmIHRlc3QgIiRoYXZlX2hheGUiID0gInllcyIgOyB0aGVuCisgIGVjaG8KKyAgZWNobyAiSGF4ZSBMaWJyYXJ5OiIKKyAgZWNobyAiICAgVXNpbmcgSGF4ZSAuLi4uLi4uLi4uLi4uLi4uIDogJEhBWEUiCisgIGVjaG8gIiAgIFVzaW5nIEhheGUgdmVyc2lvbiAuLi4uLi4uLiA6ICRIQVhFX1ZFUlNJT04iCitmaQoraWYgdGVzdCAiJGhhdmVfamF2YSIgPSAieWVzIiA7IHRoZW4KKyAgZWNobworICBlY2hvICJKYXZhIExpYnJhcnk6IgorICBlY2hvICIgICBVc2luZyBncmFkbGV3IC4uLi4uLi4uLi4uLi4gOiBsaWIvamF2YS9ncmFkbGV3IgorICBlY2hvICIgICBVc2luZyBqYXZhIC4uLi4uLi4uLi4uLi4uLi4gOiAkSkFWQSIKKyAgZWNobyAiICAgVXNpbmcgamF2YWMgLi4uLi4uLi4uLi4uLi4uIDogJEpBVkFDIgorICBlY2hvICIgICBVc2luZyBHcmFkbGUgdmVyc2lvbiAuLi4uLi4gOiAkKGxpYi9qYXZhL2dyYWRsZXcgLS12ZXJzaW9uIC0tcXVpZXQgfCBncmVwIEdyYWRsZSAyPiYxKSIKKyAgZWNobyAiICAgVXNpbmcgamF2YSB2ZXJzaW9uIC4uLi4uLi4uIDogJCgkSkFWQSAtdmVyc2lvbiAyPiYxIHwgZ3JlcCAndmVyc2lvbiAnKSIKK2ZpCitpZiB0ZXN0ICIkaGF2ZV9sdWEiID0gInllcyIgOyB0aGVuCisgIGVjaG8KKyAgZWNobyAiTHVhIExpYnJhcnk6IgorICBlY2hvICIgICBVc2luZyBMdWEgLi4uLi4uLi4uLi4uLi4uLi4gOiAkTFVBIgorICBlY2hvICIgICBVc2luZyBMdWEgdmVyc2lvbi4uLi4uLi4uLi4gOiAkKCRMVUEgLXYpIgogZmkKIGlmIHRlc3QgIiRoYXZlX25vZGVqcyIgPSAieWVzIiA7IHRoZW4KICAgZWNobwpAQCAtNzY4LDEyICsxMDQ5LDUyIEBACiAgIGVjaG8gIiAgIFVzaW5nIE5vZGVKUyAuLi4uLi4uLi4uLi4uLiA6ICROT0RFSlMiCiAgIGVjaG8gIiAgIFVzaW5nIE5vZGVKUyB2ZXJzaW9uLi4uLi4uLiA6ICQoJE5PREVKUyAtLXZlcnNpb24pIgogZmkKLWlmIHRlc3QgIiRoYXZlX2x1YSIgPSAieWVzIiA7IHRoZW4KK2lmIHRlc3QgIiRoYXZlX3BlcmwiID0gInllcyIgOyB0aGVuCiAgIGVjaG8KLSAgZWNobyAiTHVhIExpYnJhcnk6IgotICBlY2hvICIgICBVc2luZyBMdWEgLi4uLi4uLi4uLi4uLi4gOiAkTFVBIgorICBlY2hvICJQZXJsIExpYnJhcnk6IgorICBlY2hvICIgICBVc2luZyBQZXJsIC4uLi4uLi4uLi4uLi4uLi4gOiAkUEVSTCIKKyAgZWNobyAiICAgVXNpbmcgUGVybCB2ZXJzaW9uIC4uLi4uLi4uIDogJCgkUEVSTCAtdiB8IGdyZXAgJ3ZlcnNpb24gJykiCitmaQoraWYgdGVzdCAiJGhhdmVfcGhwIiA9ICJ5ZXMiIDsgdGhlbgorICBlY2hvCisgIGVjaG8gIlBIUCBMaWJyYXJ5OiIKKyAgZWNobyAiICAgVXNpbmcgcGhwLWNvbmZpZyAuLi4uLi4uLi4uIDogJFBIUF9DT05GSUciCisgIGVjaG8gIiAgIFVzaW5nIHBocCB2ZXJzaW9uIC4uLi4uLi4uLiA6ICQoJFBIUCAtLXZlcnNpb24gfCBoZWFkIC0xKSIKK2ZpCitpZiB0ZXN0ICIkaGF2ZV9weXRob24iID0gInllcyIgOyB0aGVuCisgIGVjaG8KKyAgZWNobyAiUHl0aG9uIExpYnJhcnk6IgorICBlY2hvICIgICBVc2luZyBQeXRob24gLi4uLi4uLi4uLi4uLi4gOiAkUFlUSE9OIgorICBlY2hvICIgICBVc2luZyBQeXRob24gdmVyc2lvbiAuLi4uLi4gOiAkKCRQWVRIT04gLS12ZXJzaW9uIDI+JjEpIgorICBpZiB0ZXN0ICIkaGF2ZV9weTMiID0gInllcyIgOyB0aGVuCisgIGVjaG8gIiAgIFVzaW5nIFB5dGhvbjMgLi4uLi4uLi4uLi4uLiA6ICRQWVRIT04zIgorICBlY2hvICIgICBVc2luZyBQeXRob24zIHZlcnNpb24gLi4uLi4gOiAkKCRQWVRIT04zIC0tdmVyc2lvbikiCisgIGZpCisgIGlmIHRlc3QgIiRoYXZlX3RyaWFsIiA9ICJ5ZXMiOyB0aGVuCisgIGVjaG8gIiAgIFVzaW5nIHRyaWFsIC4uLi4uLi4uLi4uLi4uLiA6ICRUUklBTCIKKyAgZmkKK2ZpCitpZiB0ZXN0ICIkaGF2ZV9ydWJ5IiA9ICJ5ZXMiIDsgdGhlbgorICBlY2hvCisgIGVjaG8gIlJ1YnkgTGlicmFyeToiCisgIGVjaG8gIiAgIFVzaW5nIFJ1YnkgLi4uLi4uLi4uLi4uLi4uLiA6ICRSVUJZIgorICBlY2hvICIgICBVc2luZyBSdWJ5IHZlcnNpb24gLi4uLi4uLi4gOiAkKCRSVUJZIC0tdmVyc2lvbikiCitmaQoraWYgdGVzdCAiJGhhdmVfcnMiID0gInllcyIgOyB0aGVuCisgIGVjaG8KKyAgZWNobyAiUnVzdCBMaWJyYXJ5OiIKKyAgZWNobyAiICAgVXNpbmcgQ2FyZ28uLi4uLi4uLi4uLi4uLi4uIDogJENBUkdPIgorICBlY2hvICIgICBVc2luZyBydXN0Yy4uLi4uLi4uLi4uLi4uLi4gOiAkUlVTVEMiCisgIGVjaG8gIiAgIFVzaW5nIFJ1c3QgdmVyc2lvbi4uLi4uLi4uLiA6ICQoJFJVU1RDIC0tdmVyc2lvbikiCitmaQoraWYgdGVzdCAiJGhhdmVfc3dpZnQiID0gInllcyIgOyB0aGVuCisgIGVjaG8KKyAgZWNobyAiU3dpZnQgTGlicmFyeToiCisgIGVjaG8gIiAgIFVzaW5nIFN3aWZ0IC4uLi4uLi4uLi4uLi4uLiA6ICRTV0lGVCIKKyAgZWNobyAiICAgVXNpbmcgU3dpZnQgdmVyc2lvbiAuLi4uLi4uIDogJCgkU1dJRlQgLS12ZXJzaW9uIHwgaGVhZCAtMSkiCiBmaQogZWNobwogZWNobyAiSWYgc29tZXRoaW5nIGlzIG1pc3NpbmcgdGhhdCB5b3UgdGhpbmsgc2hvdWxkIGJlIHByZXNlbnQsIgogZWNobyAicGxlYXNlIHNraW0gdGhlIG91dHB1dCBvZiBjb25maWd1cmUgdG8gZmluZCB0aGUgbWlzc2luZyIKIGVjaG8gImNvbXBvbmVudC4gIERldGFpbHMgYXJlIHByZXNlbnQgaW4gY29uZmlnLmxvZy4iCitlY2hvCmRpZmYgLS1naXQgYS9jb250cmliL1JlYnVzL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzIGIvY29udHJpYi9SZWJ1cy9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwppbmRleCAxZDlkOWEyLi5lNDc2ZWFiIDEwMDY0NAotLS0gYS9jb250cmliL1JlYnVzL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCisrKyBiL2NvbnRyaWIvUmVidXMvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKQEAgLTM0LDUgKzM0LDUgQEAKIAogW2Fzc2VtYmx5OiBHdWlkKCIwYWYxMDk4NC00MGQzLTQ1M2QtYjFlNS00MjE1MjllOGM3ZTIiKV0KIAotW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjAuOS4yLjAiKV0KLVthc3NlbWJseTogQXNzZW1ibHlGaWxlVmVyc2lvbigiMC45LjIuMCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjEuMC4wLjAiKV0KK1thc3NlbWJseTogQXNzZW1ibHlGaWxlVmVyc2lvbigiMS4wLjAuMCIpXQpkaWZmIC0tZ2l0IGEvY29udHJpYi9WYWdyYW50ZmlsZSBiL2NvbnRyaWIvVmFncmFudGZpbGUKaW5kZXggZDlhOTA4ZC4uZmY1MzMxNiAxMDA2NDQKLS0tIGEvY29udHJpYi9WYWdyYW50ZmlsZQorKysgYi9jb250cmliL1ZhZ3JhbnRmaWxlCkBAIC00MywxMCArNDMsMTAgQEAKIHN1ZG8gYXB0LWdldCBpbnN0YWxsIC1xcSBsaWJib29zdC1kZXYgbGliYm9vc3QtdGVzdC1kZXYgbGliYm9vc3QtcHJvZ3JhbS1vcHRpb25zLWRldiBsaWJib29zdC1maWxlc3lzdGVtLWRldiBsaWJib29zdC1zeXN0ZW0tZGV2IGxpYmV2ZW50LWRldiAKIAogIyBKYXZhIGRlcGVuZGVuY2llcwotc3VkbyBhcHQtZ2V0IGluc3RhbGwgLXFxIGFudCBvcGVuamRrLTctamRrIG1hdmVuCitzdWRvIGFwdC1nZXQgaW5zdGFsbCAtcXEgYW50IG9wZW5qZGstOC1qZGsgbWF2ZW4KIAogIyBQeXRob24gZGVwZW5kZW5jaWVzCi1zdWRvIGFwdC1nZXQgaW5zdGFsbCAtcXEgcHl0aG9uLWFsbCBweXRob24tYWxsLWRldiBweXRob24tYWxsLWRiZyBweXRob24tc2V0dXB0b29scyBweXRob24tc3VwcG9ydAorc3VkbyBhcHQtZ2V0IGluc3RhbGwgLXFxIHB5dGhvbi1hbGwgcHl0aG9uLWFsbC1kZXYgcHl0aG9uLWFsbC1kYmcgcHl0aG9uLXNldHVwdG9vbHMgcHl0aG9uLXN1cHBvcnQgcHl0aG9uLXNpeCBweXRob24zLXNpeAogCiAjIFJ1YnkgZGVwZW5kZW5jaWVzCiBzdWRvIGFwdC1nZXQgaW5zdGFsbCAtcXEgcnVieSBydWJ5LWRldgpAQCAtNjIsNyArNjIsNyBAQAogc3VkbyBhcHQtZ2V0IGluc3RhbGwgLXFxIGxpYmdsaWIyLjAtZGV2CiAKICMgRXJsYW5nIGRlcGVuZGVuY2llcwotc3VkbyBhcHQtZ2V0IGluc3RhbGwgLXFxIGVybGFuZy1iYXNlIGVybGFuZy1ldW5pdCBlcmxhbmctZGV2CitzdWRvIGFwdC1nZXQgaW5zdGFsbCAtcXEgZXJsYW5nLWJhc2UgZXJsYW5nLWV1bml0IGVybGFuZy1kZXYgZXJsYW5nLXRvb2xzCiAKICMgR08gZGVwZW5kZW5jaWVzCiBlY2hvICJnb2xhbmctZ28gZ29sYW5nLWdvL2Rhc2hib2FyZCBib29sZWFuIGZhbHNlIiB8IGRlYmNvbmYtc2V0LXNlbGVjdGlvbnMKQEAgLTg5LDggKzg5LDggQEAKIAogIyBDdXN0b21pemUgdGhlIHN5c3RlbQogIyAtLS0KLSMgRGVmYXVsdCBqYXZhIHRvIGxhdGVzdCAxLjcgdmVyc2lvbgotdXBkYXRlLWphdmEtYWx0ZXJuYXRpdmVzIC1zIGphdmEtMS43LjAtb3Blbmpkay1hbWQ2NCAKKyMgRGVmYXVsdCBqYXZhIHRvIGxhdGVzdCAxLjggdmVyc2lvbgordXBkYXRlLWphdmEtYWx0ZXJuYXRpdmVzIC1zIGphdmEtMS44LjAtb3Blbmpkay1hbWQ2NCAKIAogIyBQSFBVbml0IHBhY2thZ2UgYnJva2VuIGluIHVidW50dS4gc2VlIGh0dHBzOi8vYnVncy5sYXVuY2hwYWQubmV0L3VidW50dS8rc291cmNlL3BocHVuaXQvK2J1Zy83MDE1NDQKIHN1ZG8gYXB0LWdldCB1cGdyYWRlIHBlYXIKZGlmZiAtLWdpdCBhL2NvbnRyaWIvYXN5bmMtdGVzdC90ZXN0LWxlYWYucHkgYi9jb250cmliL2FzeW5jLXRlc3QvdGVzdC1sZWFmLnB5CmluZGV4IDhiN2MzZTMuLjRlYTRhOWIgMTAwNzU1Ci0tLSBhL2NvbnRyaWIvYXN5bmMtdGVzdC90ZXN0LWxlYWYucHkKKysrIGIvY29udHJpYi9hc3luYy10ZXN0L3Rlc3QtbGVhZi5weQpAQCAtNywxNiArNywxNyBAQAogZnJvbSB0aHJpZnQuc2VydmVyIGltcG9ydCBUSHR0cFNlcnZlcgogZnJvbSBhZ2dyIGltcG9ydCBBZ2dyCiAKKwogY2xhc3MgQWdnckhhbmRsZXIoQWdnci5JZmFjZSk6Ci0gIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICBzZWxmLnZhbHVlcyA9IFtdCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLnZhbHVlcyA9IFtdCiAKLSAgZGVmIGFkZFZhbHVlKHNlbGYsIHZhbHVlKToKLSAgICBzZWxmLnZhbHVlcy5hcHBlbmQodmFsdWUpCisgICAgZGVmIGFkZFZhbHVlKHNlbGYsIHZhbHVlKToKKyAgICAgICAgc2VsZi52YWx1ZXMuYXBwZW5kKHZhbHVlKQogCi0gIGRlZiBnZXRWYWx1ZXMoc2VsZiwgKToKLSAgICB0aW1lLnNsZWVwKDEpCi0gICAgcmV0dXJuIHNlbGYudmFsdWVzCisgICAgZGVmIGdldFZhbHVlcyhzZWxmLCApOgorICAgICAgICB0aW1lLnNsZWVwKDEpCisgICAgICAgIHJldHVybiBzZWxmLnZhbHVlcwogCiBwcm9jZXNzb3IgPSBBZ2dyLlByb2Nlc3NvcihBZ2dySGFuZGxlcigpKQogcGZhY3RvcnkgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpCmRpZmYgLS1naXQgYS9jb250cmliL2ZiMzAzL1RDbGllbnRJbmZvLmNwcCBiL2NvbnRyaWIvZmIzMDMvVENsaWVudEluZm8uY3BwCmluZGV4IDU5NTlmYjEuLjFmYzY2MTIgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvZmIzMDMvVENsaWVudEluZm8uY3BwCisrKyBiL2NvbnRyaWIvZmIzMDMvVENsaWVudEluZm8uY3BwCkBAIC0xNTQsOSArMTU0LDggQEAKICAgICB9CiAKICAgICB0aW1lc3BlYyBzdGFydDsKLSAgICBkb3VibGUgc2VjcyA9IDAuMDsKICAgICBpbmZvLT5nZXRUaW1lKCZzdGFydCk7Ci0gICAgc2VjcyA9IChkb3VibGUpKG5vdy50dl9zZWMgLSBzdGFydC50dl9zZWMpICsgKG5vdy50dl9uc2VjIC0gc3RhcnQudHZfbnNlYykqMC4wMDAwMDAwMDE7CisgICAgZG91YmxlIHNlY3MgPSAoZG91YmxlKShub3cudHZfc2VjIC0gc3RhcnQudHZfc2VjKSArIChub3cudHZfbnNlYyAtIHN0YXJ0LnR2X25zZWMpKjAuMDAwMDAwMDAxOwogCiAgICAgY2hhciBidWZbMjU2XTsKICAgICBzbnByaW50ZihidWYsIHNpemVvZiBidWYsICIlZCAlcyAlcyAlLjNmICVsbHUiLCBpLCBhZGRyU3RyLCBjYWxsU3RyLCBzZWNzLApkaWZmIC0tZ2l0IGEvY29udHJpYi9mYjMwMy9UQ2xpZW50SW5mby5oIGIvY29udHJpYi9mYjMwMy9UQ2xpZW50SW5mby5oCmluZGV4IGQwYTk3NzAuLjY2NjhjMTkgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvZmIzMDMvVENsaWVudEluZm8uaAorKysgYi9jb250cmliL2ZiMzAzL1RDbGllbnRJbmZvLmgKQEAgLTE5Miw3ICsxOTIsNyBAQAogCiAgIC8qKgogICAgKiBSZXR1cm4gYXMgc3RyaW5nIHRoZSB0aHJpZnQgY2FsbCBlaXRoZXIgY3VycmVudGx5IGJlaW5nIHByb2Nlc3NlZCBvcgotICAgKiBtb3N0IHJlY2VudGx5IHByb2Nlc3NlZCBpZiB0aGUgY29ubmVjdGlvbiBpcyBzdGlsbCBvcGVuIGZvciBhZGRpdG9uYWwKKyAgICogbW9zdCByZWNlbnRseSBwcm9jZXNzZWQgaWYgdGhlIGNvbm5lY3Rpb24gaXMgc3RpbGwgb3BlbiBmb3IgYWRkaXRpb25hbAogICAgKiBjYWxscy4gIFJldHVybnMgTlVMTCBpZiBhIGNhbGwgaGFzbid0IGJlZW4gbWFkZSB5ZXQgb3IgcHJvY2Vzc2luZwogICAgKiBoYXMgZW5kZWQuCiAgICAqLwpkaWZmIC0tZ2l0IGEvY29udHJpYi9mYjMwMy9hY2xvY2FsL2F4X2phdmFjX2FuZF9qYXZhLm00IGIvY29udHJpYi9mYjMwMy9hY2xvY2FsL2F4X2phdmFjX2FuZF9qYXZhLm00CmluZGV4IGZkYjRiZjAuLjU4MWI0NTAgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvZmIzMDMvYWNsb2NhbC9heF9qYXZhY19hbmRfamF2YS5tNAorKysgYi9jb250cmliL2ZiMzAzL2FjbG9jYWwvYXhfamF2YWNfYW5kX2phdmEubTQKQEAgLTcsNyArNyw3IEBACiBkbmwgamF2YSBjb21tYW5kIHRlc3RlZC4gIE90aGVyd2lzZSwgYSBoYXJkLWNvZGVkIGxpc3Qgd2lsbCBiZSB1c2VkLgogZG5sIFNpbWlsYXJseSBmb3IgIkpBVkFDIi4KIGRubAotZG5sIEFYX0pBVkFDX0FORF9KQVZBIGRvZXMgbm90IGN1cnJlbmx5IHN1cHBvcnQgdGVzdGluZyBmb3IgYSBwYXJ0aWN1bGFyCitkbmwgQVhfSkFWQUNfQU5EX0pBVkEgZG9lcyBub3QgY3VycmVudGx5IHN1cHBvcnQgdGVzdGluZyBmb3IgYSBwYXJ0aWN1bGFyCiBkbmwgSmF2YSB2ZXJzaW9uLCB0ZXN0aW5nIGZvciBvbmx5IG9uZSBvZiAiamF2YSIgYW5kICJqYXZhYyIsIG9yCiBkbmwgY29tcGlsaW5nIG9yIHJ1bm5pbmcgdXNlci1wcm92aWRlZCBKYXZhIGNvZGUuCiBkbmwKZGlmZiAtLWdpdCBhL2NvbnRyaWIvZmIzMDMvY3BwL0ZhY2Vib29rQmFzZS5jcHAgYi9jb250cmliL2ZiMzAzL2NwcC9GYWNlYm9va0Jhc2UuY3BwCmluZGV4IDgwMDMzNDAuLjNjNTY5NzUgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvZmIzMDMvY3BwL0ZhY2Vib29rQmFzZS5jcHAKKysrIGIvY29udHJpYi9mYjMwMy9jcHAvRmFjZWJvb2tCYXNlLmNwcApAQCAtOTgsNyArOTgsNyBAQAogICAvLyB3YW50IG91ciByZWFkL3dyaXRlIHN0cnVjdHVyZSB0byBnbyBvdmVyIHRoZSB3aXJlCiAgIGNvdW50ZXJzXy5hY3F1aXJlUmVhZCgpOwogICBmb3IoUmVhZFdyaXRlQ291bnRlck1hcDo6aXRlcmF0b3IgaXQgPSBjb3VudGVyc18uYmVnaW4oKTsKLSAgICAgIGl0ICE9IGNvdW50ZXJzXy5lbmQoKTsgaXQrKykKKyAgICAgIGl0ICE9IGNvdW50ZXJzXy5lbmQoKTsgKytpdCkKICAgewogICAgIF9yZXR1cm5baXQtPmZpcnN0XSA9IGl0LT5zZWNvbmQudmFsdWU7CiAgIH0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvZmIzMDMvY3BwL0ZhY2Vib29rQmFzZS5oIGIvY29udHJpYi9mYjMwMy9jcHAvRmFjZWJvb2tCYXNlLmgKaW5kZXggMjE1OWM5NS4uZGFhNTI0NiAxMDA2NDQKLS0tIGEvY29udHJpYi9mYjMwMy9jcHAvRmFjZWJvb2tCYXNlLmgKKysrIGIvY29udHJpYi9mYjMwMy9jcHAvRmFjZWJvb2tCYXNlLmgKQEAgLTIyLDYgKzIyLDcgQEAKIAogI2luY2x1ZGUgIkZhY2Vib29rU2VydmljZS5oIgogCisjaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+CiAjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UU2VydmVyLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L011dGV4Lmg+CiAKZGlmZiAtLWdpdCBhL2NvbnRyaWIvZmIzMDMvY3BwL1NlcnZpY2VUcmFja2VyLmNwcCBiL2NvbnRyaWIvZmIzMDMvY3BwL1NlcnZpY2VUcmFja2VyLmNwcAppbmRleCAyOTE0ZmY2Li43YTYxYjIxIDEwMDY0NAotLS0gYS9jb250cmliL2ZiMzAzL2NwcC9TZXJ2aWNlVHJhY2tlci5jcHAKKysrIGIvY29udHJpYi9mYjMwMy9jcHAvU2VydmljZVRyYWNrZXIuY3BwCkBAIC0yNTEsNyArMjUxLDcgQEAKICAgdWludDY0X3QgY291bnQ7CiAgIGZvciAoaXRlciA9IGNoZWNrcG9pbnRTZXJ2aWNlRHVyYXRpb25fLmJlZ2luKCk7CiAgICAgICAgaXRlciAhPSBjaGVja3BvaW50U2VydmljZUR1cmF0aW9uXy5lbmQoKTsKLSAgICAgICBpdGVyKyspIHsKKyAgICAgICArK2l0ZXIpIHsKICAgICBjb3VudCA9IGl0ZXItPnNlY29uZC5maXJzdDsKICAgICBoYW5kbGVyXy0+c2V0Q291bnRlcihzdHJpbmcoImNoZWNrcG9pbnRfY291bnRfIikgKyBpdGVyLT5maXJzdCwgY291bnQpOwogICAgIGlmIChjb3VudCA9PSAwKSB7CmRpZmYgLS1naXQgYS9jb250cmliL2ZiMzAzL2lmL2ZiMzAzLnRocmlmdCBiL2NvbnRyaWIvZmIzMDMvaWYvZmIzMDMudGhyaWZ0CmluZGV4IDY2YzgzMTUuLjg5YmQ2ZWIgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvZmIzMDMvaWYvZmIzMDMudGhyaWZ0CisrKyBiL2NvbnRyaWIvZmIzMDMvaWYvZmIzMDMudGhyaWZ0CkBAIC0yNCw2ICsyNCw3IEBACiBuYW1lc3BhY2UgamF2YSBjb20uZmFjZWJvb2suZmIzMDMKIG5hbWVzcGFjZSBjcHAgZmFjZWJvb2suZmIzMDMKIG5hbWVzcGFjZSBwZXJsIEZhY2Vib29rLkZCMzAzCituYW1lc3BhY2UgbmV0Y29yZSBGYWNlYm9vay5GQjMwMy5UZXN0CiAKIC8qKgogICogQ29tbW9uIHN0YXR1cyByZXBvcnRpbmcgbWVjaGFuaXNtIGFjcm9zcyBhbGwgc2VydmljZXMKZGlmZiAtLWdpdCBhL2NvbnRyaWIvZmIzMDMvamF2YS9idWlsZC5wcm9wZXJ0aWVzIGIvY29udHJpYi9mYjMwMy9qYXZhL2J1aWxkLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ2MzY2OAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvZmIzMDMvamF2YS9idWlsZC5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNSBAQAorIyBNYXZlbiBBbnQgdGFza3MgSmFyIGRldGFpbHMKK212bi5hbnQudGFzay52ZXJzaW9uPTIuMS4zCittdm4ucmVwbz1odHRwOi8vcmVwbzEubWF2ZW4ub3JnL21hdmVuMgorbXZuLmFudC50YXNrLnVybD0ke212bi5yZXBvfS9vcmcvYXBhY2hlL21hdmVuL21hdmVuLWFudC10YXNrcy8ke212bi5hbnQudGFzay52ZXJzaW9ufQorbXZuLmFudC50YXNrLmphcj1tYXZlbi1hbnQtdGFza3MtJHttdm4uYW50LnRhc2sudmVyc2lvbn0uamFyCmRpZmYgLS1naXQgYS9jb250cmliL2ZiMzAzL2phdmEvYnVpbGQueG1sIGIvY29udHJpYi9mYjMwMy9qYXZhL2J1aWxkLnhtbAppbmRleCA4ZjJmYTUxLi43YTFiOGYxIDEwMDc1NQotLS0gYS9jb250cmliL2ZiMzAzL2phdmEvYnVpbGQueG1sCisrKyBiL2NvbnRyaWIvZmIzMDMvamF2YS9idWlsZC54bWwKQEAgLTcsOSArNyw5IEBACiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKICB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAKKwogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIAorCiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCkBAIC0yNiwyMCArMjYsMjAgQEAKICAgPHByb3BlcnR5IG5hbWU9ImludGVyZmFjZS5kaXIiIHZhbHVlPSIke2Jhc2VkaXJ9Ly4uL2lmIi8+CiAgIDxwcm9wZXJ0eSBuYW1lPSJ0aHJpZnQuamF2YS5kaXIiIGxvY2F0aW9uPSIke3RocmlmdC5yb290fS9saWIvamF2YSIvPgogICA8cHJvcGVydHkgbmFtZT0iYnVpbGQudG9vbHMuZGlyIiBsb2NhdGlvbj0iJHt0aHJpZnQuamF2YS5kaXJ9L2J1aWxkL3Rvb2xzLyIvPgotICA8cHJvcGVydHkgbmFtZT0idGhyaWZ0X2NvbXBpbGVyIiB2YWx1ZT0iJHt0aHJpZnQucm9vdH0vY29tcGlsZXIvY3BwL3RocmlmdCIvPiAKKyAgPHByb3BlcnR5IG5hbWU9InRocmlmdF9jb21waWxlciIgdmFsdWU9IiR7dGhyaWZ0LnJvb3R9L2NvbXBpbGVyL2NwcC90aHJpZnQiLz4KKyAgPHByb3BlcnR5IGZpbGU9IiR7YmFzZWRpcn0vYnVpbGQucHJvcGVydGllcyIvPgogCiAgIDwhLS0gaW5oZXJpdCBmcm9tIHRoZSBqYXZhIGJ1aWxkIGZpbGUgZm9yIHZlcnNpb24gYW5kIG90aGVyIHByb3BlcnRpZXMgLS0+Ci0gIDxwcm9wZXJ0eSBmaWxlPSIke3RocmlmdC5qYXZhLmRpcn0vYnVpbGQucHJvcGVydGllcyIgLz4KKyAgPHByb3BlcnR5IGZpbGU9IiR7dGhyaWZ0LmphdmEuZGlyfS9ncmFkbGUucHJvcGVydGllcyIgLz4KIAogICA8cHJvcGVydHkgZW52aXJvbm1lbnQ9ImVudiIvPgogCiAgIDxjb25kaXRpb24gcHJvcGVydHk9InZlcnNpb24iIHZhbHVlPSIke3RocmlmdC52ZXJzaW9ufSI+CiAgICAgPGlzc2V0IHByb3BlcnR5PSJyZWxlYXNlIi8+CiAgIDwvY29uZGl0aW9uPgotICA8cHJvcGVydHkgbmFtZT0idmVyc2lvbiIgdmFsdWU9IiR7dGhyaWZ0LnZlcnNpb259LXNuYXBzaG90Ii8+CisgIDxwcm9wZXJ0eSBuYW1lPSJ2ZXJzaW9uIiB2YWx1ZT0iJHt0aHJpZnQudmVyc2lvbn0tU05BUFNIT1QiLz4KIAogICA8cHJvcGVydHkgbmFtZT0iZmIzMDMuZmluYWwubmFtZSIgdmFsdWU9IiR7ZmIzMDMuYXJ0aWZhY3RpZH0tJHt2ZXJzaW9ufSIvPgotICA8cHJvcGVydHkgbmFtZT0idGhyaWZ0LmphdmEubGlidGhyaWZ0IiB2YWx1ZT0iJHt0aHJpZnQuamF2YS5kaXJ9L2J1aWxkL2xpYnRocmlmdC0ke3ZlcnNpb259LmphciIvPgogCiAgIDxwcm9wZXJ0eSBuYW1lPSJzcmMiIHZhbHVlPSIke2Jhc2VkaXJ9L3NyYyIvPgogICA8cHJvcGVydHkgbmFtZT0iZ2VuIiB2YWx1ZT0iJHtiYXNlZGlyfS9nZW4tamF2YSIvPgpAQCAtNzQsOCArNzQsMTIgQEAKICAgICA8ZWNobyBtZXNzYWdlPSJCdWlsZGluZyAke2ZiMzAzLmZpbmFsLm5hbWV9LmphciIvPgogICAgIDxqYXZhYyBkZXN0ZGlyPSIke2J1aWxkLmNsYXNzZXMuZGlyfSIgZGVidWc9Im9uIj4KICAgICAgIDxjbGFzc3BhdGg+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt0aHJpZnQuamF2YS5saWJ0aHJpZnR9Ii8+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0iJHt0aHJpZnQucm9vdH0vbGliL2phdmEvYnVpbGQvbGliIj4KKyAgICAgICAgPGZpbGVzZXQgZGlyPSIke3RocmlmdC5qYXZhLmRpcn0vYnVpbGQvbGlicyI+CisgICAgICAgICAgPGluY2x1ZGUgbmFtZT0ibGlidGhyaWZ0Ki5qYXIiIC8+CisgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ibGlidGhyaWZ0KmphdmFkb2MuamFyIiAvPgorICAgICAgICAgIDxleGNsdWRlIG5hbWU9ImxpYnRocmlmdCpzb3VyY2VzLmphciIgLz4KKyAgICAgICAgPC9maWxlc2V0PgorICAgICAgICA8ZmlsZXNldCBkaXI9IiR7dGhyaWZ0LmphdmEuZGlyfS9idWlsZC9kZXBzIj4KICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciIvPgogICAgICAgICA8L2ZpbGVzZXQ+CiAgICAgICA8L2NsYXNzcGF0aD4KQEAgLTEyMCwyMSArMTI0LDIxIEBACiAgICAgPGFydGlmYWN0OnJlbW90ZVJlcG9zaXRvcnkgaWQ9ImFwYWNoZSIgdXJsPSIke2FwYWNoZS5yZXBvfSIvPgogCiAgICAgPCEtLSBQb20gZmlsZSBpbmZvcm1hdGlvbiAtLT4KLSAgICA8YXJ0aWZhY3Q6cG9tIGlkPSJwb20iIAotICAgICAgZ3JvdXBJZD0iJHt0aHJpZnQuZ3JvdXBpZH0iIAorICAgIDxhcnRpZmFjdDpwb20gaWQ9InBvbSIKKyAgICAgIGdyb3VwSWQ9IiR7dGhyaWZ0Lmdyb3VwaWR9IgogICAgICAgYXJ0aWZhY3RJZD0iJHtmYjMwMy5hcnRpZmFjdGlkfSIKLSAgICAgIHZlcnNpb249IiR7dmVyc2lvbn0iIAorICAgICAgdmVyc2lvbj0iJHt2ZXJzaW9ufSIKICAgICAgIHVybD0iaHR0cDovL3RocmlmdC5hcGFjaGUub3JnIgogICAgICAgbmFtZT0iQXBhY2hlIFRocmlmdCIKICAgICAgIGRlc2NyaXB0aW9uPSJUaHJpZnQgaXMgYSBzb2Z0d2FyZSBmcmFtZXdvcmsgZm9yIHNjYWxhYmxlIGNyb3NzLWxhbmd1YWdlIHNlcnZpY2VzIGRldmVsb3BtZW50LiIKLSAgICAgIHBhY2thZ2luZz0icG9tIgorICAgICAgcGFja2FnaW5nPSJqYXIiCiAgICAgPgogICAgICAgPHJlbW90ZVJlcG9zaXRvcnkgcmVmaWQ9ImNlbnRyYWwiLz4KICAgICAgIDxyZW1vdGVSZXBvc2l0b3J5IHJlZmlkPSJhcGFjaGUiLz4KICAgICAgIDxsaWNlbnNlIG5hbWU9IlRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAyLjAiIHVybD0iJHtsaWNlbnNlfSIvPgotICAgICAgPHNjbSBjb25uZWN0aW9uPSJzY206Z2l0Omh0dHBzOi8vZ2l0LXdpcC11cy5hcGFjaGUub3JnL3JlcG9zL2FzZi90aHJpZnQuZ2l0IiAKLSAgICAgIGRldmVsb3BlckNvbm5lY3Rpb249InNjbTpnaXQ6aHR0cHM6Ly9naXQtd2lwLXVzLmFwYWNoZS5vcmcvcmVwb3MvYXNmL3RocmlmdC5naXQiCi0gICAgICB1cmw9Imh0dHBzOi8vZ2l0LXdpcC11cy5hcGFjaGUub3JnL3JlcG9zL2FzZj9wPXRocmlmdC5naXQiCisgICAgICA8c2NtIGNvbm5lY3Rpb249InNjbTpnaXQ6aHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQuZ2l0IgorICAgICAgZGV2ZWxvcGVyQ29ubmVjdGlvbj0ic2NtOmdpdDpodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC5naXQiCisgICAgICB1cmw9Imh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0IgogICAgIC8+CiAgICAgICA8IS0tIFRocmlmdCBEZXZlbG9wZXJzIC0tPgogICAgICAgPGRldmVsb3BlciBpZD0ibWNzbGVlIiBuYW1lPSJNYXJrIFNsZWUiLz4KZGlmZiAtLWdpdCBhL2NvbnRyaWIvZmIzMDMvcHkvZmIzMDMvRmFjZWJvb2tCYXNlLnB5IGIvY29udHJpYi9mYjMwMy9weS9mYjMwMy9GYWNlYm9va0Jhc2UucHkKaW5kZXggNjg1ZmYyMC4uMDdkYjEwYyAxMDA2NDQKLS0tIGEvY29udHJpYi9mYjMwMy9weS9mYjMwMy9GYWNlYm9va0Jhc2UucHkKKysrIGIvY29udHJpYi9mYjMwMy9weS9mYjMwMy9GYWNlYm9va0Jhc2UucHkKQEAgLTI0LDU5ICsyNCw2MCBAQAogaW1wb3J0IHRocmlmdC5yZWZsZWN0aW9uLmxpbWl0ZWQKIGZyb20gdHR5cGVzIGltcG9ydCBmYl9zdGF0dXMKIAorCiBjbGFzcyBGYWNlYm9va0Jhc2UoRmFjZWJvb2tTZXJ2aWNlLklmYWNlKToKIAotICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSk6Ci0gICAgc2VsZi5uYW1lID0gbmFtZQotICAgIHNlbGYuYWxpdmUgPSBpbnQodGltZS50aW1lKCkpCi0gICAgc2VsZi5jb3VudGVycyA9IHt9CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUpOgorICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCisgICAgICAgIHNlbGYuYWxpdmUgPSBpbnQodGltZS50aW1lKCkpCisgICAgICAgIHNlbGYuY291bnRlcnMgPSB7fQogCi0gIGRlZiBnZXROYW1lKHNlbGYsICk6Ci0gICAgcmV0dXJuIHNlbGYubmFtZQorICAgIGRlZiBnZXROYW1lKHNlbGYsICk6CisgICAgICAgIHJldHVybiBzZWxmLm5hbWUKIAotICBkZWYgZ2V0VmVyc2lvbihzZWxmLCApOgotICAgIHJldHVybiAnJworICAgIGRlZiBnZXRWZXJzaW9uKHNlbGYsICk6CisgICAgICAgIHJldHVybiAnJwogCi0gIGRlZiBnZXRTdGF0dXMoc2VsZiwgKToKLSAgICByZXR1cm4gZmJfc3RhdHVzLkFMSVZFCisgICAgZGVmIGdldFN0YXR1cyhzZWxmLCApOgorICAgICAgICByZXR1cm4gZmJfc3RhdHVzLkFMSVZFCiAKLSAgZGVmIGdldENvdW50ZXJzKHNlbGYpOgotICAgIHJldHVybiBzZWxmLmNvdW50ZXJzCisgICAgZGVmIGdldENvdW50ZXJzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5jb3VudGVycwogCi0gIGRlZiByZXNldENvdW50ZXIoc2VsZiwga2V5KToKLSAgICBzZWxmLmNvdW50ZXJzW2tleV0gPSAwCisgICAgZGVmIHJlc2V0Q291bnRlcihzZWxmLCBrZXkpOgorICAgICAgICBzZWxmLmNvdW50ZXJzW2tleV0gPSAwCiAKLSAgZGVmIGdldENvdW50ZXIoc2VsZiwga2V5KToKLSAgICBpZiBzZWxmLmNvdW50ZXJzLmhhc19rZXkoa2V5KToKLSAgICAgIHJldHVybiBzZWxmLmNvdW50ZXJzW2tleV0KLSAgICByZXR1cm4gMAorICAgIGRlZiBnZXRDb3VudGVyKHNlbGYsIGtleSk6CisgICAgICAgIGlmIHNlbGYuY291bnRlcnMuaGFzX2tleShrZXkpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuY291bnRlcnNba2V5XQorICAgICAgICByZXR1cm4gMAogCi0gIGRlZiBpbmNyZW1lbnRDb3VudGVyKHNlbGYsIGtleSk6Ci0gICAgc2VsZi5jb3VudGVyc1trZXldID0gc2VsZi5nZXRDb3VudGVyKGtleSkgKyAxCisgICAgZGVmIGluY3JlbWVudENvdW50ZXIoc2VsZiwga2V5KToKKyAgICAgICAgc2VsZi5jb3VudGVyc1trZXldID0gc2VsZi5nZXRDb3VudGVyKGtleSkgKyAxCiAKLSAgZGVmIHNldE9wdGlvbihzZWxmLCBrZXksIHZhbHVlKToKLSAgICBwYXNzCisgICAgZGVmIHNldE9wdGlvbihzZWxmLCBrZXksIHZhbHVlKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiBnZXRPcHRpb24oc2VsZiwga2V5KToKLSAgICByZXR1cm4gIiIKKyAgICBkZWYgZ2V0T3B0aW9uKHNlbGYsIGtleSk6CisgICAgICAgIHJldHVybiAiIgogCi0gIGRlZiBnZXRPcHRpb25zKHNlbGYpOgotICAgIHJldHVybiB7fQorICAgIGRlZiBnZXRPcHRpb25zKHNlbGYpOgorICAgICAgICByZXR1cm4ge30KIAotICBkZWYgZ2V0T3B0aW9ucyhzZWxmKToKLSAgICByZXR1cm4ge30KKyAgICBkZWYgZ2V0T3B0aW9ucyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHt9CiAKLSAgZGVmIGFsaXZlU2luY2Uoc2VsZik6Ci0gICAgcmV0dXJuIHNlbGYuYWxpdmUKKyAgICBkZWYgYWxpdmVTaW5jZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuYWxpdmUKIAotICBkZWYgZ2V0Q3B1UHJvZmlsZShzZWxmLCBkdXJhdGlvbik6Ci0gICAgcmV0dXJuICIiCisgICAgZGVmIGdldENwdVByb2ZpbGUoc2VsZiwgZHVyYXRpb24pOgorICAgICAgICByZXR1cm4gIiIKIAotICBkZWYgZ2V0TGltaXRlZFJlZmxlY3Rpb24oc2VsZik6Ci0gICAgcmV0dXJuIHRocmlmdC5yZWZsZWN0aW9uLmxpbWl0ZWQuU2VydmljZSgpCisgICAgZGVmIGdldExpbWl0ZWRSZWZsZWN0aW9uKHNlbGYpOgorICAgICAgICByZXR1cm4gdGhyaWZ0LnJlZmxlY3Rpb24ubGltaXRlZC5TZXJ2aWNlKCkKIAotICBkZWYgcmVpbml0aWFsaXplKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgcmVpbml0aWFsaXplKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHNodXRkb3duKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgc2h1dGRvd24oc2VsZik6CisgICAgICAgIHBhc3MKZGlmZiAtLWdpdCBhL2NvbnRyaWIvZmIzMDMvcHkvZmIzMDNfc2NyaXB0cy9mYjMwM19zaW1wbGVfbWdtdC5weSBiL2NvbnRyaWIvZmIzMDMvcHkvZmIzMDNfc2NyaXB0cy9mYjMwM19zaW1wbGVfbWdtdC5weQppbmRleCA0ZjhjZTk5Li41YzhmNDA5IDEwMDY0NAotLS0gYS9jb250cmliL2ZiMzAzL3B5L2ZiMzAzX3NjcmlwdHMvZmIzMDNfc2ltcGxlX21nbXQucHkKKysrIGIvY29udHJpYi9mYjMwMy9weS9mYjMwM19zY3JpcHRzL2ZiMzAzX3NpbXBsZV9tZ210LnB5CkBAIC0xLDQgKzEsNCBAQAotIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjIS91c3IvYmluL2VudiBweXRob24gCiAKICMKICMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQpAQCAtMTksNyArMTksOSBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotaW1wb3J0IHN5cywgb3MKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24KK2ltcG9ydCBzeXMKK2ltcG9ydCBvcwogZnJvbSBvcHRwYXJzZSBpbXBvcnQgT3B0aW9uUGFyc2VyCiAKIGZyb20gdGhyaWZ0LlRocmlmdCBpbXBvcnQgKgpAQCAtMzEsMTEgKzMzLDEyIEBACiBmcm9tIGZiMzAzIGltcG9ydCAqCiBmcm9tIGZiMzAzLnR0eXBlcyBpbXBvcnQgKgogCisKIGRlZiBzZXJ2aWNlX2N0cmwoCi0gICAgICAgICAgICAgICAgIGNvbW1hbmQsCi0gICAgICAgICAgICAgICAgIHBvcnQsCi0gICAgICAgICAgICAgICAgIHRyYW5zX2ZhY3RvcnkgPSBOb25lLAotICAgICAgICAgICAgICAgICBwcm90X2ZhY3RvcnkgPSBOb25lKToKKyAgICAgICAgY29tbWFuZCwKKyAgICAgICAgcG9ydCwKKyAgICAgICAgdHJhbnNfZmFjdG9yeT1Ob25lLAorICAgICAgICBwcm90X2ZhY3Rvcnk9Tm9uZSk6CiAgICAgIiIiCiAgICAgc2VydmljZV9jdHJsIGlzIGEgZ2VuZXJpYyBmdW5jdGlvbiB0byBleGVjdXRlIHN0YW5kYXJkIGZiMzAzIGZ1bmN0aW9ucwogCkBAIC01NSw2NiArNTgsNTkgQEAKICAgICAgICAgICAgIG1zZyA9IGZiX3N0YXR1c19zdHJpbmcoc3RhdHVzKQogICAgICAgICAgICAgaWYgKGxlbihzdGF0dXNfZGV0YWlscykpOgogICAgICAgICAgICAgICAgIG1zZyArPSAiIC0gJXMiICUgc3RhdHVzX2RldGFpbHMKLSAgICAgICAgICAgIHByaW50IG1zZwotCi0gICAgICAgICAgICBpZiAoc3RhdHVzID09IGZiX3N0YXR1cy5BTElWRSk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDIKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDMKKyAgICAgICAgICAgIHByaW50KG1zZykKKyAgICAgICAgICAgIHJldHVybiAyIGlmIHN0YXR1cyA9PSBmYl9zdGF0dXMuQUxJVkUgZWxzZSAzCiAgICAgICAgIGV4Y2VwdDoKLSAgICAgICAgICAgIHByaW50ICJGYWlsZWQgdG8gZ2V0IHN0YXR1cyIKKyAgICAgICAgICAgIHByaW50KCJGYWlsZWQgdG8gZ2V0IHN0YXR1cyIpCiAgICAgICAgICAgICByZXR1cm4gMwogCiAgICAgIyBzY2FsYXIgY29tbWFuZHMKLSAgICBpZiBjb21tYW5kIGluIFsidmVyc2lvbiIsImFsaXZlIiwibmFtZSJdOgorICAgIGlmIGNvbW1hbmQgaW4gWyJ2ZXJzaW9uIiwgImFsaXZlIiwgIm5hbWUiXToKICAgICAgICAgdHJ5OgotICAgICAgICAgICAgcmVzdWx0ID0gZmIzMDNfd3JhcHBlcihjb21tYW5kLCAgcG9ydCwgdHJhbnNfZmFjdG9yeSwgcHJvdF9mYWN0b3J5KQotICAgICAgICAgICAgcHJpbnQgcmVzdWx0CisgICAgICAgICAgICByZXN1bHQgPSBmYjMwM193cmFwcGVyKGNvbW1hbmQsIHBvcnQsIHRyYW5zX2ZhY3RvcnksIHByb3RfZmFjdG9yeSkKKyAgICAgICAgICAgIHByaW50KHJlc3VsdCkKICAgICAgICAgICAgIHJldHVybiAwCiAgICAgICAgIGV4Y2VwdDoKLSAgICAgICAgICAgIHByaW50ICJmYWlsZWQgdG8gZ2V0ICIsY29tbWFuZAorICAgICAgICAgICAgcHJpbnQoImZhaWxlZCB0byBnZXQgIiwgY29tbWFuZCkKICAgICAgICAgICAgIHJldHVybiAzCiAKICAgICAjIGNvdW50ZXJzCiAgICAgaWYgY29tbWFuZCBpbiBbImNvdW50ZXJzIl06CiAgICAgICAgIHRyeToKLSAgICAgICAgICAgIGNvdW50ZXJzID0gZmIzMDNfd3JhcHBlcignY291bnRlcnMnLCAgcG9ydCwgdHJhbnNfZmFjdG9yeSwgcHJvdF9mYWN0b3J5KQorICAgICAgICAgICAgY291bnRlcnMgPSBmYjMwM193cmFwcGVyKCdjb3VudGVycycsIHBvcnQsIHRyYW5zX2ZhY3RvcnksIHByb3RfZmFjdG9yeSkKICAgICAgICAgICAgIGZvciBjb3VudGVyIGluIGNvdW50ZXJzOgotICAgICAgICAgICAgICAgIHByaW50ICIlczogJWQiICUgKGNvdW50ZXIsIGNvdW50ZXJzW2NvdW50ZXJdKQorICAgICAgICAgICAgICAgIHByaW50KCIlczogJWQiICUgKGNvdW50ZXIuZW5jb2RlKCd1dGYtOCcpLCBjb3VudGVyc1tjb3VudGVyXSkpCiAgICAgICAgICAgICByZXR1cm4gMAogICAgICAgICBleGNlcHQ6Ci0gICAgICAgICAgICBwcmludCAiZmFpbGVkIHRvIGdldCBjb3VudGVycyIKKyAgICAgICAgICAgIHByaW50KCJmYWlsZWQgdG8gZ2V0IGNvdW50ZXJzIikKICAgICAgICAgICAgIHJldHVybiAzCiAKLQogICAgICMgT25seSByb290IHNob3VsZCBiZSBhYmxlIHRvIHJ1biB0aGUgZm9sbG93aW5nIGNvbW1hbmRzCiAgICAgaWYgb3MuZ2V0dWlkKCkgPT0gMDoKICAgICAgICAgIyBhc3luYyBjb21tYW5kcwotICAgICAgICBpZiBjb21tYW5kIGluIFsic3RvcCIsInJlbG9hZCJdIDoKKyAgICAgICAgaWYgY29tbWFuZCBpbiBbInN0b3AiLCAicmVsb2FkIl06CiAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgZmIzMDNfd3JhcHBlcihjb21tYW5kLCBwb3J0LCB0cmFuc19mYWN0b3J5LCBwcm90X2ZhY3RvcnkpCiAgICAgICAgICAgICAgICAgcmV0dXJuIDAKICAgICAgICAgICAgIGV4Y2VwdDoKLSAgICAgICAgICAgICAgICBwcmludCAiZmFpbGVkIHRvIHRlbGwgdGhlIHNlcnZpY2UgdG8gIiwgY29tbWFuZAorICAgICAgICAgICAgICAgIHByaW50KCJmYWlsZWQgdG8gdGVsbCB0aGUgc2VydmljZSB0byAiLCBjb21tYW5kKQogICAgICAgICAgICAgICAgIHJldHVybiAzCiAgICAgZWxzZToKLSAgICAgICAgaWYgY29tbWFuZCBpbiBbInN0b3AiLCJyZWxvYWQiXToKLSAgICAgICAgICAgIHByaW50ICJyb290IHByaXZpbGVnZXMgYXJlIHJlcXVpcmVkIHRvIHN0b3Agb3IgcmVsb2FkIHRoZSBzZXJ2aWNlLiIKKyAgICAgICAgaWYgY29tbWFuZCBpbiBbInN0b3AiLCAicmVsb2FkIl06CisgICAgICAgICAgICBwcmludCgicm9vdCBwcml2aWxlZ2VzIGFyZSByZXF1aXJlZCB0byBzdG9wIG9yIHJlbG9hZCB0aGUgc2VydmljZS4iKQogICAgICAgICAgICAgcmV0dXJuIDQKIAotICAgIHByaW50ICJUaGUgZm9sbG93aW5nIGNvbW1hbmRzIGFyZSBhdmFpbGFibGU6IgotICAgIGZvciBjb21tYW5kIGluIFsiY291bnRlcnMiLCJuYW1lIiwidmVyc2lvbiIsImFsaXZlIiwic3RhdHVzIl06Ci0gICAgICAgIHByaW50ICJcdCVzIiAlIGNvbW1hbmQKLSAgICBwcmludCAiVGhlIGZvbGxvd2luZyBjb21tYW5kcyBhcmUgYXZhaWxhYmxlIGZvciB1c2VycyB3aXRoIHJvb3QgcHJpdmlsZWdlczoiCi0gICAgZm9yIGNvbW1hbmQgaW4gWyJzdG9wIiwicmVsb2FkIl06Ci0gICAgICAgIHByaW50ICJcdCVzIiAlIGNvbW1hbmQKKyAgICBwcmludCgiVGhlIGZvbGxvd2luZyBjb21tYW5kcyBhcmUgYXZhaWxhYmxlOiIpCisgICAgZm9yIGNvbW1hbmQgaW4gWyJjb3VudGVycyIsICJuYW1lIiwgInZlcnNpb24iLCAiYWxpdmUiLCAic3RhdHVzIl06CisgICAgICAgIHByaW50KCJcdCVzIiAlIGNvbW1hbmQpCisgICAgcHJpbnQoIlRoZSBmb2xsb3dpbmcgY29tbWFuZHMgYXJlIGF2YWlsYWJsZSBmb3IgdXNlcnMgd2l0aCByb290IHByaXZpbGVnZXM6IikKKyAgICBmb3IgY29tbWFuZCBpbiBbInN0b3AiLCAicmVsb2FkIl06CisgICAgICAgIHByaW50KCJcdCVzIiAlIGNvbW1hbmQpCisKKyAgICByZXR1cm4gMAogCiAKLQotICAgIHJldHVybiAwOwotCi0KLWRlZiBmYjMwM193cmFwcGVyKGNvbW1hbmQsIHBvcnQsIHRyYW5zX2ZhY3RvcnkgPSBOb25lLCBwcm90X2ZhY3RvcnkgPSBOb25lKToKK2RlZiBmYjMwM193cmFwcGVyKGNvbW1hbmQsIHBvcnQsIHRyYW5zX2ZhY3Rvcnk9Tm9uZSwgcHJvdF9mYWN0b3J5PU5vbmUpOgogICAgIHNvY2sgPSBUU29ja2V0LlRTb2NrZXQoJ2xvY2FsaG9zdCcsIHBvcnQpCiAKICAgICAjIHVzZSBpbnB1dCB0cmFuc3BvcnQgZmFjdG9yeSBpZiBwcm92aWRlZApAQCAtMTc5LDExICsxNzUsMTEgQEAKIAogICAgICMgcGFyc2UgY29tbWFuZCBsaW5lIG9wdGlvbnMKICAgICBwYXJzZXIgPSBPcHRpb25QYXJzZXIoKQotICAgIGNvbW1hbmRzPVsic3RvcCIsImNvdW50ZXJzIiwic3RhdHVzIiwicmVsb2FkIiwidmVyc2lvbiIsIm5hbWUiLCJhbGl2ZSJdCisgICAgY29tbWFuZHMgPSBbInN0b3AiLCAiY291bnRlcnMiLCAic3RhdHVzIiwgInJlbG9hZCIsICJ2ZXJzaW9uIiwgIm5hbWUiLCAiYWxpdmUiXQogCiAgICAgcGFyc2VyLmFkZF9vcHRpb24oIi1jIiwgIi0tY29tbWFuZCIsIGRlc3Q9ImNvbW1hbmQiLCBoZWxwPSJleGVjdXRlIHRoaXMgQVBJIiwKICAgICAgICAgICAgICAgICAgICAgICBjaG9pY2VzPWNvbW1hbmRzLCBkZWZhdWx0PSJzdGF0dXMiKQotICAgIHBhcnNlci5hZGRfb3B0aW9uKCItcCIsIi0tcG9ydCIsZGVzdD0icG9ydCIsaGVscD0idGhlIHNlcnZpY2UncyBwb3J0IiwKKyAgICBwYXJzZXIuYWRkX29wdGlvbigiLXAiLCAiLS1wb3J0IiwgZGVzdD0icG9ydCIsIGhlbHA9InRoZSBzZXJ2aWNlJ3MgcG9ydCIsCiAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD05MDgyKQogCiAgICAgKG9wdGlvbnMsIGFyZ3MpID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQpkaWZmIC0tZ2l0IGEvY29udHJpYi9mYjMwMy9weS9zZXR1cC5weSBiL2NvbnRyaWIvZmIzMDMvcHkvc2V0dXAucHkKaW5kZXggOGI2OGRmNC4uZDI3YzI5NiAxMDA2NDQKLS0tIGEvY29udHJpYi9mYjMwMy9weS9zZXR1cC5weQorKysgYi9jb250cmliL2ZiMzAzL3B5L3NldHVwLnB5CkBAIC0yNCwyNiArMjQsMjUgQEAKICAgICBmcm9tIHNldHVwdG9vbHMgaW1wb3J0IHNldHVwLCBFeHRlbnNpb24KIGV4Y2VwdDoKICAgICBmcm9tIGRpc3R1dGlscy5jb3JlIGltcG9ydCBzZXR1cCwgRXh0ZW5zaW9uLCBDb21tYW5kCi0gICAgICAgIAotc2V0dXAobmFtZSA9ICd0aHJpZnRfZmIzMDMnLAotICAgIHZlcnNpb24gPSAnMC45LjInLAotICAgIGRlc2NyaXB0aW9uID0gJ1B5dGhvbiBiaW5kaW5ncyBmb3IgdGhlIEFwYWNoZSBUaHJpZnQgRkIzMDMnLAotICAgIGF1dGhvciA9IFsnVGhyaWZ0IERldmVsb3BlcnMnXSwKLSAgICBhdXRob3JfZW1haWwgPSBbJ2RldkB0aHJpZnQuYXBhY2hlLm9yZyddLAotICAgIHVybCA9ICdodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcnLAotICAgIGxpY2Vuc2UgPSAnQXBhY2hlIExpY2Vuc2UgMi4wJywKLSAgICBwYWNrYWdlcyA9IFsKLSAgICAgICAgJ2ZiMzAzJywKLSAgICAgICAgJ2ZiMzAzX3NjcmlwdHMnLAotICAgIF0sCi0gICAgY2xhc3NpZmllcnMgPSBbCi0gICAgICAgICdEZXZlbG9wbWVudCBTdGF0dXMgOjogNSAtIFByb2R1Y3Rpb24vU3RhYmxlJywKLSAgICAgICAgJ0Vudmlyb25tZW50IDo6IENvbnNvbGUnLAotICAgICAgICAnSW50ZW5kZWQgQXVkaWVuY2UgOjogRGV2ZWxvcGVycycsCi0gICAgICAgICdQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24nLAotICAgICAgICAnUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDInLAotICAgICAgICAnVG9waWMgOjogU29mdHdhcmUgRGV2ZWxvcG1lbnQgOjogTGlicmFyaWVzJywKLSAgICAgICAgJ1RvcGljIDo6IFN5c3RlbSA6OiBOZXR3b3JraW5nJwotICAgIF0sCi0pCiAKK3NldHVwKG5hbWU9J3RocmlmdF9mYjMwMycsCisgICAgICB2ZXJzaW9uPScxLjAuMCcsCisgICAgICBkZXNjcmlwdGlvbj0nUHl0aG9uIGJpbmRpbmdzIGZvciB0aGUgQXBhY2hlIFRocmlmdCBGQjMwMycsCisgICAgICBhdXRob3I9WydBcGFjaGUgVGhyaWZ0IERldmVsb3BlcnMnXSwKKyAgICAgIGF1dGhvcl9lbWFpbD1bJ2RldkB0aHJpZnQuYXBhY2hlLm9yZyddLAorICAgICAgdXJsPSdodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcnLAorICAgICAgbGljZW5zZT0nQXBhY2hlIExpY2Vuc2UgMi4wJywKKyAgICAgIHBhY2thZ2VzPVsKKyAgICAgICAgICAnZmIzMDMnLAorICAgICAgICAgICdmYjMwM19zY3JpcHRzJywKKyAgICAgIF0sCisgICAgICBjbGFzc2lmaWVycz1bCisgICAgICAgICAgJ0RldmVsb3BtZW50IFN0YXR1cyA6OiA3IC0gSW5hY3RpdmUnLAorICAgICAgICAgICdFbnZpcm9ubWVudCA6OiBDb25zb2xlJywKKyAgICAgICAgICAnSW50ZW5kZWQgQXVkaWVuY2UgOjogRGV2ZWxvcGVycycsCisgICAgICAgICAgJ1Byb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbicsCisgICAgICAgICAgJ1Byb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAyJywKKyAgICAgICAgICAnVG9waWMgOjogU29mdHdhcmUgRGV2ZWxvcG1lbnQgOjogTGlicmFyaWVzJywKKyAgICAgICAgICAnVG9waWMgOjogU3lzdGVtIDo6IE5ldHdvcmtpbmcnCisgICAgICBdLAorICAgICAgKQpkaWZmIC0tZ2l0IGEvY29udHJpYi9pbnN0YWxsQ1hYRGVwZW5kZW5jaWVzLnNoIGIvY29udHJpYi9pbnN0YWxsQ1hYRGVwZW5kZW5jaWVzLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmQwNWM0Li4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvaW5zdGFsbENYWERlcGVuZGVuY2llcy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLSMhL2Jpbi9zaAotCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotCi0jIE1haW5seSBhaW1pbmcgVHJhdmlzIENJJ3MgVWJ1bnR1IG1hY2hpbmVzIGZvciBub3cKLSMgc2VlIHdoYXQgd2UgbmVlZDogaHR0cDovL3RocmlmdC5hcGFjaGUub3JnL2RvY3MvaW5zdGFsbC91YnVudHUKLQotCi0jIEdlbmVyYWwgZGVwZW5kZW5jaWVzCi1zdWRvIGFwdC1hZGQtcmVwb3NpdG9yeSAiZGViIGh0dHA6Ly9hcmNoaXZlLnVidW50dS5jb20vdWJ1bnR1LyB0cnVzdHkgbWFpbiByZXN0cmljdGVkIiAteQotc3VkbyBhcHQtZ2V0IHVwZGF0ZSAtcXEKLXN1ZG8gYXB0LWdldCBpbnN0YWxsIC1xcSBsaWJib29zdC1kZXYgbGliYm9vc3QtdGVzdC1kZXYgbGliYm9vc3QtcHJvZ3JhbS1vcHRpb25zLWRldiBsaWJib29zdC1zeXN0ZW0tZGV2IGxpYmJvb3N0LWZpbGVzeXN0ZW0tZGV2IGxpYmV2ZW50LWRldiBhdXRvbWFrZSBsaWJ0b29sIGZsZXggYmlzb24gcGtnLWNvbmZpZyBnKysgbGlic3NsLWRldiBtYWtlIGxpYnF0NC1kZXYgZ2l0IGRlYmhlbHBlciBiYyAKLWRwa2cgLVMgL3Vzci9pbmNsdWRlL2Jvb3N0L3ZlcnNpb24uaHBwCmRpZmYgLS1naXQgYS9jb250cmliL2luc3RhbGxEZXBlbmRlbmNpZXMuc2ggYi9jb250cmliL2luc3RhbGxEZXBlbmRlbmNpZXMuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg1MmE4MDUuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9pbnN0YWxsRGVwZW5kZW5jaWVzLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotIyEvYmluL3NoCi0KLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1TQ1JJUFRQQVRIPSQoIGNkICQoZGlybmFtZSAkMCkgOyBwd2QgLVAgKQotCi0jIE1haW5seSBhaW1pbmcgVHJhdmlzIENJJ3MgVWJ1bnR1IG1hY2hpbmVzIGZvciBub3cKLSMgc2VlIHdoYXQgd2UgbmVlZDogaHR0cDovL3RocmlmdC5hcGFjaGUub3JnL2RvY3MvaW5zdGFsbC91YnVudHUKLQotIyBHZW5lcmFsIGRlcGVuZGVuY2llcwotc2ggJHtTQ1JJUFRQQVRIfS9pbnN0YWxsQ1hYRGVwZW5kZW5jaWVzLnNoCi0KLSMgSmF2YSBkZXBlbmRlbmNpZXMKLXN1ZG8gYXB0LWdldCBpbnN0YWxsIC1xcSBhbnQgb3Blbmpkay03LWpkawotc3VkbyB1cGRhdGUtamF2YS1hbHRlcm5hdGl2ZXMgLXMgamF2YS0xLjcuMC1vcGVuamRrLWFtZDY0Ci0KLSMgUHl0aG9uIGRlcGVuZGVuY2llcwotc3VkbyBhcHQtZ2V0IGluc3RhbGwgLXFxIHB5dGhvbi1hbGwgcHl0aG9uLWFsbC1kZXYgcHl0aG9uLWFsbC1kYmcgcHl0aG9uLXNldHVwdG9vbHMgcHl0aG9uLXN1cHBvcnQKLQotIyBSdWJ5IGRlcGVuZGVuY2llcwotc3VkbyBhcHQtZ2V0IGluc3RhbGwgLXFxIHJ1YnkgcnVieS1kZXYKLXN1ZG8gZ2VtIGluc3RhbGwgYnVuZGxlciByYWtlCi0KLSMgUGVybCBkZXBlbmRlbmNpZXMKLXN1ZG8gYXB0LWdldCBpbnN0YWxsIC1xcSBsaWJiaXQtdmVjdG9yLXBlcmwgbGliY2xhc3MtYWNjZXNzb3ItY2xhc3MtcGVybAotCi0jIFBocCBkZXBlbmRlbmNpZXMKLXN1ZG8gYXB0LWdldCBpbnN0YWxsIC1xcSBwaHA1IHBocDUtZGV2IHBocDUtY2xpIHBocC1wZWFyIHJlMmMKLQotIyBHbGliQyBkZXBlbmRlbmNpZXMKLXN1ZG8gYXB0LWdldCBpbnN0YWxsIC1xcSBsaWJnbGliMi4wLWRldgotCi0jIEVybGFuZyBkZXBlbmRlbmNpZXMKLXN1ZG8gYXB0LWdldCBpbnN0YWxsIC1xcSBlcmxhbmctYmFzZSBlcmxhbmctZXVuaXQgZXJsYW5nLWRldgotCi0jIEdPIGRlcGVuZGVuY2llcwotZWNobyAiZ29sYW5nLWdvIGdvbGFuZy1nby9kYXNoYm9hcmQgYm9vbGVhbiBmYWxzZSIgfCBkZWJjb25mLXNldC1zZWxlY3Rpb25zCi1zdWRvIGFwdC1nZXQgLXkgaW5zdGFsbCAtcXEgZ29sYW5nIGdvbGFuZy1nbwotCi0jIEhhc2tlbGwgZGVwZW5kZW5jaWVzCi1zdWRvIGFkZC1hcHQtcmVwb3NpdG9yeSAteSBwcGE6aHZyL2doYwotc3VkbyBhcHQtZ2V0IHVwZGF0ZQotc3VkbyBhcHQtZ2V0IGluc3RhbGwgY2FiYWwtaW5zdGFsbC0xLjIwIGdoYy0kR0hDVkVSCi0KLSMgTHVhIGRlcGVuZGVuY2llcwotc3VkbyBhcHQtZ2V0IGluc3RhbGwgLXFxIGx1YTUuMiBsdWE1LjItZGV2Ci0KLSMgTm9kZS5qcyBkZXBlbmRlbmNpZXMKLXN1ZG8gYXB0LWdldCBpbnN0YWxsIC1xcSBub2RlanMgbm9kZWpzLWRldiBucG0KLXN1ZG8gdXBkYXRlLWFsdGVybmF0aXZlcyAtLWluc3RhbGwgL3Vzci9iaW4vbm9kZSBub2RlIC91c3IvYmluL25vZGVqcyAxMAotCi0jIENTaGFycAotc3VkbyBhcHQtZ2V0IGluc3RhbGwgLXFxIG1vbm8tZ21jcyBtb25vLWRldmVsIGxpYm1vbm8tc3lzdGVtLXdlYjIuMC1jaWwKLXN1ZG8gYXB0LWdldCBpbnN0YWxsIC1xcSBtaW5ndzMyIG1pbmd3MzItYmludXRpbHMgbWluZ3czMi1ydW50aW1lIG5zaXMKZGlmZiAtLWdpdCBhL2NvbnRyaWIvbWluZ3czMi10b29sY2hhaW4uY21ha2UgYi9jb250cmliL21pbmd3MzItdG9vbGNoYWluLmNtYWtlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGZiMWE1Li4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvbWluZ3czMi10b29sY2hhaW4uY21ha2UKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIENNYWtlIG1pbmd3MzIgY3Jvc3MgY29tcGlsZSB0b29sY2hhaW4gZmlsZQ0KLQ0KLSMgdGhlIG5hbWUgb2YgdGhlIHRhcmdldCBvcGVyYXRpbmcgc3lzdGVtDQotU0VUKENNQUtFX1NZU1RFTV9OQU1FIFdpbmRvd3MpDQotDQotIyB3aGljaCBjb21waWxlcnMgdG8gdXNlIGZvciBDIGFuZCBDKysNCi1TRVQoQ01BS0VfQ19DT01QSUxFUiBpNTg2LW1pbmd3MzJtc3ZjLWdjYykNCi1TRVQoQ01BS0VfQ1hYX0NPTVBJTEVSIGk1ODYtbWluZ3czMm1zdmMtZysrKQ0KLVNFVChDTUFLRV9SQ19DT01QSUxFUiBpNTg2LW1pbmd3MzJtc3ZjLXdpbmRyZXMpDQotDQotIyBoZXJlIGlzIHRoZSB0YXJnZXQgZW52aXJvbm1lbnQgbG9jYXRlZA0KLVNFVChDTUFLRV9GSU5EX1JPT1RfUEFUSCAvdXNyL2k1ODYtbWluZ3czMm1zdmMpDQotDQotIyBhZGp1c3QgdGhlIGRlZmF1bHQgYmVoYXZpb3VyIG9mIHRoZSBGSU5EX1hYWCgpIGNvbW1hbmRzOg0KLSMgc2VhcmNoIGhlYWRlcnMgYW5kIGxpYnJhcmllcyBpbiB0aGUgdGFyZ2V0IGVudmlyb25tZW50LCBzZWFyY2ggDQotIyBwcm9ncmFtcyBpbiB0aGUgaG9zdCBlbnZpcm9ubWVudA0KLXNldChDTUFLRV9GSU5EX1JPT1RfUEFUSF9NT0RFX1BST0dSQU0gTkVWRVIpDQotc2V0KENNQUtFX0ZJTkRfUk9PVF9QQVRIX01PREVfTElCUkFSWSBPTkxZKQ0KLXNldChDTUFLRV9GSU5EX1JPT1RfUEFUSF9NT0RFX0lOQ0xVREUgT05MWSkNCmRpZmYgLS1naXQgYS9jb250cmliL3BhcnNlX3Byb2ZpbGluZy5weSBiL2NvbnRyaWIvcGFyc2VfcHJvZmlsaW5nLnB5CmluZGV4IDUyZDIyMTEuLjBiZTVmMjkgMTAwNzU1Ci0tLSBhL2NvbnRyaWIvcGFyc2VfcHJvZmlsaW5nLnB5CisrKyBiL2NvbnRyaWIvcGFyc2VfcHJvZmlsaW5nLnB5CkBAIC00MiwxMCArNDIsMTIgQEAKICAgICAgICAgc2VsZi5hZGRyZXNzID0gYWRkcmVzcwogICAgICAgICBzZWxmLnNvdXJjZUZpbGUgPSBOb25lCiAgICAgICAgIHNlbGYuc291cmNlTGluZSA9IE5vbmUKLSAgICAgICAgc2VsZi5mdW50aW9uID0gTm9uZQorICAgICAgICBzZWxmLmZ1bmN0aW9uID0gTm9uZQogCiAKIGdfYWRkcnNfYnlfZmlsZW5hbWUgPSB7fQorCisKIGRlZiBnZXRfYWRkcmVzcyhmaWxlbmFtZSwgYWRkcmVzcyk6CiAgICAgIiIiCiAgICAgUmV0cmlldmUgYW4gQWRkcmVzc0luZm8gb2JqZWN0IGZvciB0aGUgc3BlY2lmaWVkIG9iamVjdCBmaWxlIGFuZCBhZGRyZXNzLgpAQCAtMTAzLDEyICsxMDUsMTIgQEAKICAgICAgICAgaWR4ID0gZmlsZV9hbmRfbGluZS5yZmluZCgnOicpCiAgICAgICAgIGlmIGlkeCA8IDA6CiAgICAgICAgICAgICBtc2cgPSAnZXhwZWN0ZWQgZmlsZSBhbmQgbGluZSBudW1iZXIgZnJvbSBhZGRyMmxpbmU7IGdvdCAlcicgJSBcCi0gICAgICAgICAgICAgICAgICAgIChmaWxlX2FuZF9saW5lLCkKKyAgICAgICAgICAgICAgICAoZmlsZV9hbmRfbGluZSwpCiAgICAgICAgICAgICBtc2cgKz0gJ1xuZmlsZT0lciwgYWRkcmVzcz0lcicgJSAoZmlsZW5hbWUsIGFkZHJlc3MuYWRkcmVzcykKICAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbihtc2cpCiAKICAgICAgICAgYWRkcmVzcy5zb3VyY2VGaWxlID0gZmlsZV9hbmRfbGluZVs6aWR4XQotICAgICAgICBhZGRyZXNzLnNvdXJjZUxpbmUgPSBmaWxlX2FuZF9saW5lW2lkeCsxOl0KKyAgICAgICAgYWRkcmVzcy5zb3VyY2VMaW5lID0gZmlsZV9hbmRfbGluZVtpZHggKyAxOl0KIAogICAgIChyZW1haW5pbmdfb3V0LCBjbWRfZXJyKSA9IHByb2MuY29tbXVuaWNhdGUoKQogICAgIHJldGNvZGUgPSBwcm9jLndhaXQoKQpAQCAtMTgwLDcgKzE4Miw3IEBACiAKICAgICB2aXJ0X2NhbGxfcmVnZXggPSByZS5jb21waWxlKHInXlxzKlRfVklSVFVBTF9DQUxMOiAoXGQrKSBjYWxscyBvbiAoLiopOiQnKQogICAgIGdlbl9wcm90X3JlZ2V4ID0gcmUuY29tcGlsZSgKLSAgICAgICAgICAgIHInXlxzKlRfR0VORVJJQ19QUk9UT0NPTDogKFxkKykgY2FsbHMgdG8gKC4qKSB3aXRoIGEgKC4qKTokJykKKyAgICAgICAgcideXHMqVF9HRU5FUklDX1BST1RPQ09MOiAoXGQrKSBjYWxscyB0byAoLiopIHdpdGggYSAoLiopOiQnKQogICAgIGJ0X3JlZ2V4ID0gcmUuY29tcGlsZShyJ15ccyojKFxkKylccyooLiopIFxbKDB4WzAtOUEtWmEtel0rKVxdJCcpCiAKICAgICAjIFBhcnNlIGFsbCBvZiB0aGUgaW5wdXQsIGFuZCBzdG9yZSBpdCBhcyBFbnRyeSBvYmplY3RzCkBAIC0yMDksNyArMjExLDcgQEAKICAgICAgICAgICAgICAgICAjICJfWiIgdG8gdGhlIHR5cGUgbmFtZSB0byBtYWtlIGl0IGxvb2sgbGlrZSBhbiBleHRlcm5hbCBuYW1lLgogICAgICAgICAgICAgICAgIHR5cGVfbmFtZSA9ICdfWicgKyB0eXBlX25hbWUKICAgICAgICAgICAgIGhlYWRlciA9ICdUX1ZJUlRVQUxfQ0FMTDogJWQgY2FsbHMgb24gIiVzIicgJSBcCi0gICAgICAgICAgICAgICAgICAgIChudW1fY2FsbHMsIHR5cGVfbmFtZSkKKyAgICAgICAgICAgICAgICAobnVtX2NhbGxzLCB0eXBlX25hbWUpCiAgICAgICAgICAgICBpZiBjdXJyZW50X2VudHJ5IGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgIGVudHJpZXMuYXBwZW5kKGN1cnJlbnRfZW50cnkpCiAgICAgICAgICAgICBjdXJyZW50X2VudHJ5ID0gRW50cnkoaGVhZGVyKQpAQCAtMjI0LDcgKzIyNiw3IEBACiAgICAgICAgICAgICAgICAgdHlwZV9uYW1lMSA9ICdfWicgKyB0eXBlX25hbWUxCiAgICAgICAgICAgICAgICAgdHlwZV9uYW1lMiA9ICdfWicgKyB0eXBlX25hbWUyCiAgICAgICAgICAgICBoZWFkZXIgPSAnVF9HRU5FUklDX1BST1RPQ09MOiAlZCBjYWxscyB0byAiJXMiIHdpdGggYSAiJXMiJyAlIFwKLSAgICAgICAgICAgICAgICAgICAgKG51bV9jYWxscywgdHlwZV9uYW1lMSwgdHlwZV9uYW1lMikKKyAgICAgICAgICAgICAgICAobnVtX2NhbGxzLCB0eXBlX25hbWUxLCB0eXBlX25hbWUyKQogICAgICAgICAgICAgaWYgY3VycmVudF9lbnRyeSBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICBlbnRyaWVzLmFwcGVuZChjdXJyZW50X2VudHJ5KQogICAgICAgICAgICAgY3VycmVudF9lbnRyeSA9IEVudHJ5KGhlYWRlcikKZGlmZiAtLWdpdCBhL2NvbnRyaWIvdGhyaWZ0LW1hdmVuLXBsdWdpbi9wb20ueG1sIGIvY29udHJpYi90aHJpZnQtbWF2ZW4tcGx1Z2luL3BvbS54bWwKaW5kZXggNWJjMTAwNC4uMWQ2NmJjNiAxMDA2NDQKLS0tIGEvY29udHJpYi90aHJpZnQtbWF2ZW4tcGx1Z2luL3BvbS54bWwKKysrIGIvY29udHJpYi90aHJpZnQtbWF2ZW4tcGx1Z2luL3BvbS54bWwKQEAgLTI3LDE1ICsyNywxNSBAQAogICA8YXJ0aWZhY3RJZD50aHJpZnQtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgogICA8cGFja2FnaW5nPm1hdmVuLXBsdWdpbjwvcGFja2FnaW5nPgogICA8bmFtZT50aHJpZnQtbWF2ZW4tcGx1Z2luPC9uYW1lPgotICA8dmVyc2lvbj4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+CisgIDx2ZXJzaW9uPjEuMC4wPC92ZXJzaW9uPgogICA8YnVpbGQ+CiAgICAgPHBsdWdpbnM+CiAgICAgICA8cGx1Z2luPgogICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CiAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPHNvdXJjZT4xLjc8L3NvdXJjZT4KLSAgICAgICAgICA8dGFyZ2V0PjEuNzwvdGFyZ2V0PgorICAgICAgICAgIDxzb3VyY2U+MS44PC9zb3VyY2U+CisgICAgICAgICAgPHRhcmdldD4xLjg8L3RhcmdldD4KICAgICAgICAgPC9jb25maWd1cmF0aW9uPgogICAgICAgPC9wbHVnaW4+CiAgICAgICA8cGx1Z2luPgpAQCAtNzcsNiArNzcsMTIgQEAKICAgICAgIDxhcnRpZmFjdElkPnBsZXh1cy11dGlsczwvYXJ0aWZhY3RJZD4KICAgICAgIDx2ZXJzaW9uPjMuMC4xNDwvdmVyc2lvbj4KICAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcubW9ja2l0bzwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPm1vY2tpdG8tYWxsPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4xMC4xOTwvdmVyc2lvbj4KKyAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgIDwvZGVwZW5kZW5jeT4KICAgPC9kZXBlbmRlbmNpZXM+CiAgIDxwcm9wZXJ0aWVzPgogICAgIDx0aHJpZnQucm9vdD4ke2Jhc2VkaXJ9Ly4uLy4uPC90aHJpZnQucm9vdD4KZGlmZiAtLWdpdCBhL2NvbnRyaWIvdGhyaWZ0LW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGhyaWZ0L21hdmVuL0Fic3RyYWN0VGhyaWZ0TW9qby5qYXZhIGIvY29udHJpYi90aHJpZnQtbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aHJpZnQvbWF2ZW4vQWJzdHJhY3RUaHJpZnRNb2pvLmphdmEKaW5kZXggYTNiNWFmNi4uODY5YmU5NSAxMDA2NDQKLS0tIGEvY29udHJpYi90aHJpZnQtbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aHJpZnQvbWF2ZW4vQWJzdHJhY3RUaHJpZnRNb2pvLmphdmEKKysrIGIvY29udHJpYi90aHJpZnQtbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aHJpZnQvbWF2ZW4vQWJzdHJhY3RUaHJpZnRNb2pvLmphdmEKQEAgLTkzLDcgKzkzLDcgQEAKICAgICAgKiBpdCB3aWxsIGdlbmVyYXRlIEphdmEgb3V0cHV0LiBUaGUgbWFpbiByZWFzb24gZm9yIHRoaXMgb3B0aW9uIGlzIHRvIGJlIGFibGUgdG8gYWRkIG9wdGlvbnMKICAgICAgKiB0byB0aGUgSmF2YSBnZW5lcmF0b3IgLSBpZiB5b3UgZ2VuZXJhdGUgc29tZXRoaW5nIGVsc2UsIHlvdSdyZSBvbiB5b3VyIG93bi4KICAgICAgKgotICAgICAqIEBwYXJhbWV0ZXIgZGVmYXVsdC12YWx1ZT0iamF2YTpoYXNoY29kZSIKKyAgICAgKiBAcGFyYW1ldGVyIGRlZmF1bHQtdmFsdWU9ImphdmEiCiAgICAgICovCiAgICAgcHJpdmF0ZSBTdHJpbmcgZ2VuZXJhdG9yOwogCkBAIC0xMDYsNyArMTA2LDcgQEAKICAgICAgKiBTaW5jZSB7QGNvZGUgdGhyaWZ0fSBjYW5ub3QgYWNjZXNzIGphcnMsIHRocmlmdCBmaWxlcyBpbiBkZXBlbmRlbmNpZXMgYXJlIGV4dHJhY3RlZCB0byB0aGlzIGxvY2F0aW9uCiAgICAgICogYW5kIGRlbGV0ZWQgb24gZXhpdC4gVGhpcyBkaXJlY3RvcnkgaXMgYWx3YXlzIGNsZWFuZWQgZHVyaW5nIGV4ZWN1dGlvbi4KICAgICAgKgotICAgICAqIEBwYXJhbWV0ZXIgcHJvcGVydHk9IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L3RocmlmdC1kZXBlbmRlbmNpZXMiCisgICAgICogQHBhcmFtZXRlciBkZWZhdWx0LXZhbHVlPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS90aHJpZnQtZGVwZW5kZW5jaWVzIgogICAgICAqIEByZXF1aXJlZAogICAgICAqLwogICAgIHByaXZhdGUgRmlsZSB0ZW1wb3JhcnlUaHJpZnRGaWxlRGlyZWN0b3J5OwpAQCAtMTE3LDcgKzExNyw3IEBACiAgICAgICogQHBhcmFtZXRlciBkZWZhdWx0LXZhbHVlPSIke2xvY2FsUmVwb3NpdG9yeX0iCiAgICAgICogQHJlcXVpcmVkCiAgICAgICovCi0gICAgcHJpdmF0ZSBBcnRpZmFjdFJlcG9zaXRvcnkgbG9jYWxSZXBvc2l0b3J5OworICAgIHByb3RlY3RlZCBBcnRpZmFjdFJlcG9zaXRvcnkgbG9jYWxSZXBvc2l0b3J5OwogCiAgICAgLyoqCiAgICAgICogU2V0IHRoaXMgdG8ge0Bjb2RlIGZhbHNlfSB0byBkaXNhYmxlIGhhc2hpbmcgb2YgZGVwZW5kZW50IGphciBwYXRocy4KQEAgLTEyOSw3ICsxMjksNyBAQAogICAgICAqIEBwYXJhbWV0ZXIgZGVmYXVsdC12YWx1ZT0idHJ1ZSIKICAgICAgKiBAcmVxdWlyZWQKICAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaGFzaERlcGVuZGVudFBhdGhzOworICAgIHByb3RlY3RlZCBib29sZWFuIGhhc2hEZXBlbmRlbnRQYXRoczsKIAogICAgIC8qKgogICAgICAqIEBwYXJhbWV0ZXIKQEAgLTE5Myw3ICsxOTMsNyBAQAogICAgICAgICAgICAgICAgICAgICBhdHRhY2hGaWxlcygpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigiQW4gSU8gZXJyb3Igb2NjdXJlZCIsIGUpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCJBbiBJTyBlcnJvciBvY2N1cnJlZCIsIGUpOwogICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0ZhaWx1cmVFeGNlcHRpb24oInRocmlmdCBmYWlsZWQgdG8gZXhlY3V0ZSBiZWNhdXNlOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOwogICAgICAgICAgICAgfSBjYXRjaCAoQ29tbWFuZExpbmVFeGNlcHRpb24gZSkgewpAQCAtMjI5LDcgKzIyOSw3IEBACiAgICAgICAgIGNoZWNrTm90TnVsbChnZW5lcmF0b3IsICJnZW5lcmF0b3IiKTsKICAgICAgICAgZmluYWwgRmlsZSB0aHJpZnRTb3VyY2VSb290ID0gZ2V0VGhyaWZ0U291cmNlUm9vdCgpOwogICAgICAgICBjaGVja05vdE51bGwodGhyaWZ0U291cmNlUm9vdCk7Ci0gICAgICAgIGNoZWNrQXJndW1lbnQoIXRocmlmdFNvdXJjZVJvb3QuaXNGaWxlKCksICJ0aHJpZnRTb3VyY2VSb290IGlzIGEgZmlsZSwgbm90IGEgZGlyZXRvcnkiKTsKKyAgICAgICAgY2hlY2tBcmd1bWVudCghdGhyaWZ0U291cmNlUm9vdC5pc0ZpbGUoKSwgInRocmlmdFNvdXJjZVJvb3QgaXMgYSBmaWxlLCBub3QgYSBkaXJlY3RvcnkiKTsKICAgICAgICAgY2hlY2tOb3ROdWxsKHRlbXBvcmFyeVRocmlmdEZpbGVEaXJlY3RvcnksICJ0ZW1wb3JhcnlUaHJpZnRGaWxlRGlyZWN0b3J5Iik7CiAgICAgICAgIGNoZWNrU3RhdGUoIXRlbXBvcmFyeVRocmlmdEZpbGVEaXJlY3RvcnkuaXNGaWxlKCksICJ0ZW1wb3JhcnlUaHJpZnRGaWxlRGlyZWN0b3J5IGlzIGEgZmlsZSwgbm90IGEgZGlyZWN0b3J5Iik7CiAgICAgICAgIGZpbmFsIEZpbGUgb3V0cHV0RGlyZWN0b3J5ID0gZ2V0T3V0cHV0RGlyZWN0b3J5KCk7CkBAIC0yNjgsNyArMjY4LDkgQEAKICAgICAgICAgaWYgKHRlbXBvcmFyeVRocmlmdEZpbGVEaXJlY3RvcnkuZXhpc3RzKCkpIHsKICAgICAgICAgICAgIGNsZWFuRGlyZWN0b3J5KHRlbXBvcmFyeVRocmlmdEZpbGVEaXJlY3RvcnkpOwogICAgICAgICB9CisKICAgICAgICAgU2V0PEZpbGU+IHRocmlmdERpcmVjdG9yaWVzID0gbmV3SGFzaFNldCgpOworCiAgICAgICAgIGZvciAoRmlsZSBjbGFzc3BhdGhFbGVtZW50RmlsZSA6IGNsYXNzcGF0aEVsZW1lbnRGaWxlcykgewogICAgICAgICAgICAgLy8gZm9yIHNvbWUgcmVhc29uIHVuZGVyIElBTSwgd2UgcmVjZWl2ZSBwb21zIGFzIGRlcGVuZGVudCBmaWxlcwogICAgICAgICAgICAgLy8gSSBhbSBleGNsdWRpbmcgLnhtbCByYXRoZXIgdGhhbiBpbmNsdWRpbmcgLmphciBhcyB0aGVyZSBtYXkgYmUgb3RoZXIgZXh0ZW5zaW9ucyBpbiB1c2UgKHNhciwgaGFyLCB6aXApCkBAIC0yODMsMTggKzI4NSwyNyBAQAogICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGZvcm1hdCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMgd2FzIG5vdCBhIHJlYWRhYmxlIGFydGlmYWN0IiwgY2xhc3NwYXRoRWxlbWVudEZpbGUpKTsKICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAgICAgKiBDb3B5IGVhY2ggLnRocmlmdCBmaWxlIGZvdW5kIGluIHRoZSBKQVIgaW50byBhIHRlbXBvcmFyeSBkaXJlY3RvcnksIHByZXNlcnZpbmcgdGhlCisgICAgICAgICAgICAgICAgICogZGlyZWN0b3J5IHBhdGggaXQgaGFkIHJlbGF0aXZlIHRvIGl0cyBjb250YWluaW5nIEpBUi4gQWRkIHRoZSByZXN1bHRpbmcgcm9vdCBkaXJlY3RvcnkKKyAgICAgICAgICAgICAgICAgKiAodW5pcXVlIGZvciBlYWNoIEpBUiBwcm9jZXNzZWQpIHRvIHRoZSBzZXQgb2YgdGhyaWZ0IGluY2x1ZGUgZGlyZWN0b3JpZXMgdG8gdXNlIHdoZW4KKyAgICAgICAgICAgICAgICAgKiBjb21waWxpbmcuCisgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgZm9yIChKYXJFbnRyeSBqYXJFbnRyeSA6IGxpc3QoY2xhc3NwYXRoSmFyLmVudHJpZXMoKSkpIHsKICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGphckVudHJ5TmFtZSA9IGphckVudHJ5LmdldE5hbWUoKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGphckVudHJ5LmdldE5hbWUoKS5lbmRzV2l0aChUSFJJRlRfRklMRV9TVUZGSVgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdHJ1bmNhdGVkSmFyUGF0aCA9IHRydW5jYXRlUGF0aChjbGFzc3BhdGhKYXIuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEZpbGUgdGhyaWZ0Um9vdERpcmVjdG9yeSA9IG5ldyBGaWxlKHRlbXBvcmFyeVRocmlmdEZpbGVEaXJlY3RvcnksIHRydW5jYXRlZEphclBhdGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRmlsZSB1bmNvbXByZXNzZWRDb3B5ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGUobmV3IEZpbGUodGVtcG9yYXJ5VGhyaWZ0RmlsZURpcmVjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVuY2F0ZVBhdGgoY2xhc3NwYXRoSmFyLmdldE5hbWUoKSkpLCBqYXJFbnRyeU5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZSh0aHJpZnRSb290RGlyZWN0b3J5LCBqYXJFbnRyeU5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgdW5jb21wcmVzc2VkQ29weS5nZXRQYXJlbnRGaWxlKCkubWtkaXJzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBjb3B5U3RyZWFtVG9GaWxlKG5ldyBSYXdJbnB1dFN0cmVhbUZhY2FkZShjbGFzc3BhdGhKYXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldElucHV0U3RyZWFtKGphckVudHJ5KSksIHVuY29tcHJlc3NlZENvcHkpOwotICAgICAgICAgICAgICAgICAgICAgICAgdGhyaWZ0RGlyZWN0b3JpZXMuYWRkKHVuY29tcHJlc3NlZENvcHkuZ2V0UGFyZW50RmlsZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmlmdERpcmVjdG9yaWVzLmFkZCh0aHJpZnRSb290RGlyZWN0b3J5KTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgfSBlbHNlIGlmIChjbGFzc3BhdGhFbGVtZW50RmlsZS5pc0RpcmVjdG9yeSgpKSB7CiAgICAgICAgICAgICAgICAgRmlsZVtdIHRocmlmdEZpbGVzID0gY2xhc3NwYXRoRWxlbWVudEZpbGUubGlzdEZpbGVzKG5ldyBGaWxlbmFtZUZpbHRlcigpIHsKICAgICAgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgZGlyLCBTdHJpbmcgbmFtZSkgewpAQCAtMzA3LDYgKzMxOCw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CisKICAgICAgICAgcmV0dXJuIEltbXV0YWJsZVNldC5jb3B5T2YodGhyaWZ0RGlyZWN0b3JpZXMpOwogICAgIH0KIApAQCAtMzE5LDE1ICszMzEsNiBAQAogICAgICAgICByZXR1cm4gSW1tdXRhYmxlU2V0LmNvcHlPZih0aHJpZnRGaWxlc0luRGlyZWN0b3J5KTsKICAgICB9CiAKLSAgICBJbW11dGFibGVTZXQ8RmlsZT4gZmluZFRocmlmdEZpbGVzSW5EaXJlY3RvcmllcyhJdGVyYWJsZTxGaWxlPiBkaXJlY3RvcmllcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgY2hlY2tOb3ROdWxsKGRpcmVjdG9yaWVzKTsKLSAgICAgICAgU2V0PEZpbGU+IHRocmlmdEZpbGVzID0gbmV3SGFzaFNldCgpOwotICAgICAgICBmb3IgKEZpbGUgZGlyZWN0b3J5IDogZGlyZWN0b3JpZXMpIHsKLSAgICAgICAgICAgIHRocmlmdEZpbGVzLmFkZEFsbChmaW5kVGhyaWZ0RmlsZXNJbkRpcmVjdG9yeShkaXJlY3RvcnkpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gSW1tdXRhYmxlU2V0LmNvcHlPZih0aHJpZnRGaWxlcyk7Ci0gICAgfQotCiAgICAgLyoqCiAgICAgICogVHJ1bmNhdGVzIHRoZSBwYXRoIG9mIGphciBmaWxlcyBzbyB0aGF0IHRoZXkgYXJlIHJlbGF0aXZlIHRvIHRoZSBsb2NhbCByZXBvc2l0b3J5LgogICAgICAqCmRpZmYgLS1naXQgYS9jb250cmliL3RocmlmdC1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RocmlmdC9tYXZlbi9UaHJpZnRUZXN0Q29tcGlsZU1vam8uamF2YSBiL2NvbnRyaWIvdGhyaWZ0LW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGhyaWZ0L21hdmVuL1RocmlmdFRlc3RDb21waWxlTW9qby5qYXZhCmluZGV4IGZiODlkOTYuLjFiMWQ5OWUgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvdGhyaWZ0LW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGhyaWZ0L21hdmVuL1RocmlmdFRlc3RDb21waWxlTW9qby5qYXZhCisrKyBiL2NvbnRyaWIvdGhyaWZ0LW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGhyaWZ0L21hdmVuL1RocmlmdFRlc3RDb21waWxlTW9qby5qYXZhCkBAIC0yMyw2ICsyMyw3IEBACiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5BcnRpZmFjdDsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5yZXBvc2l0b3J5LkFydGlmYWN0UmVwb3NpdG9yeTsKIAogLyoqCiAgKiBAcGhhc2UgZ2VuZXJhdGUtdGVzdC1zb3VyY2VzCkBAIC03MSw0ICs3MiwyMiBAQAogICAgIHByb3RlY3RlZCBGaWxlIGdldFRocmlmdFNvdXJjZVJvb3QoKSB7CiAgICAgICAgIHJldHVybiB0aHJpZnRUZXN0U291cmNlUm9vdDsKICAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGxvY2FsIG1hdmVuIEFydGlmYWN0UmVwb3NpdG9yeS4gRXhwb3NlZCBvbmx5IHRvIGFsbG93IHRlc3Rpbmcgb3V0c2lkZSBvZiBNYXZlbiBpdHNlbGYuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbG9jYWxSZXBvc2l0b3J5IGxvY2FsIEFydGlmYWN0UmVwb3NpdG9yeQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExvY2FsTWF2ZW5SZXBvc2l0b3J5KGZpbmFsIEFydGlmYWN0UmVwb3NpdG9yeSBsb2NhbFJlcG9zaXRvcnkpIHsKKyAgICAgICAgdGhpcy5sb2NhbFJlcG9zaXRvcnkgPSBsb2NhbFJlcG9zaXRvcnk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBvcHRpb24gdG8gaGFzaCBkZXBlbmRlbnQgSkFSIHBhdGhzLiBFeHBvc2VkIG9ubHkgdG8gYWxsb3cgdGVzdGluZyBvdXRzaWRlIG9mIE1hdmVuIGl0c2VsZi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBoYXNoRGVwZW5kZW50UGF0aHMgd2hldGhlciBvciBub3QgdG8gaGFzaCBwYXRocyB0byBkZXBlbmRlbnQgSkFScworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEhhc2hEZXBlbmRlbnRQYXRocyhmaW5hbCBib29sZWFuIGhhc2hEZXBlbmRlbnRQYXRocykgeworICAgICAgICB0aGlzLmhhc2hEZXBlbmRlbnRQYXRocyA9IGhhc2hEZXBlbmRlbnRQYXRoczsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9jb250cmliL3RocmlmdC1tYXZlbi1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RocmlmdC9tYXZlbi9UZXN0QWJzdHJhY3RUaHJpZnRNb2pvLmphdmEgYi9jb250cmliL3RocmlmdC1tYXZlbi1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RocmlmdC9tYXZlbi9UZXN0QWJzdHJhY3RUaHJpZnRNb2pvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzExNzY3MQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvdGhyaWZ0LW1hdmVuLXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGhyaWZ0L21hdmVuL1Rlc3RBYnN0cmFjdFRocmlmdE1vam8uamF2YQpAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5tYXZlbjsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5TZXRzOworaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QucmVwb3NpdG9yeS5BcnRpZmFjdFJlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcubW9ja2l0by5Nb2NraXRvOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBzdGF0aWMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlLmFzc2VydEVxdWFsczsKKworCitwdWJsaWMgY2xhc3MgVGVzdEFic3RyYWN0VGhyaWZ0TW9qbyB7CisKKyAgICBwcml2YXRlIFRocmlmdFRlc3RDb21waWxlTW9qbyBtb2pvOworICAgIHByaXZhdGUgRmlsZSB0ZXN0Um9vdERpcjsKKyAgICBwcml2YXRlIEFydGlmYWN0UmVwb3NpdG9yeSBtYXZlblJlcG9zaXRvcnk7CisKKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBGaWxlIHRtcERpciA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5pby50bXBkaXIiKSk7CisgICAgICAgIHRlc3RSb290RGlyID0gbmV3IEZpbGUodG1wRGlyLCAidGhyaWZ0LXRlc3QiKTsKKworICAgICAgICAvLyB0aGUgdHJ1bmNhdGVQYXRoIG1ldGhvZCBhc3N1bWVzIGEgbWF2ZW4gcmVwb3NpdG9yeSwgYnV0IGl0IG9ubHkgY2FyZXMgYWJvdXQgdGhlIGJhc2UgZGlyCisgICAgICAgIG1hdmVuUmVwb3NpdG9yeSA9IE1vY2tpdG8ubW9jayhBcnRpZmFjdFJlcG9zaXRvcnkuY2xhc3MpOworICAgICAgICBNb2NraXRvLndoZW4obWF2ZW5SZXBvc2l0b3J5LmdldEJhc2VkaXIoKSkudGhlblJldHVybigiL3Rlc3QvbWF2ZW4vcmVwby9iYXNlZGlyIik7CisKKyAgICAgICAgbW9qbyA9IG5ldyBUaHJpZnRUZXN0Q29tcGlsZU1vam8oKTsKKyAgICAgICAgbW9qby5zZXRMb2NhbE1hdmVuUmVwb3NpdG9yeShtYXZlblJlcG9zaXRvcnkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1ha2VUaHJpZnRQYXRoRnJvbUphcnMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgZmluYWwgRmlsZSB0ZW1wb3JhcnlUaHJpZnRGaWxlRGlyZWN0b3J5ID0gdGVzdFJvb3REaXI7CisKKyAgICAgICAgLy8gVGhlIFNoYXJlZElkbC5qYXIgZmlsZSBjb250YWlucyB0aGUgc2FtZSBpZGwvc2hhcmVkLnRocmlmdCBhbmQgaWRsL3R1dG9yaWFsLnRocmlmdCBoaWVyYXJjaHkKKyAgICAgICAgLy8gdXNlZCBieSBvdGhlciB0ZXN0cy4gSXQncyB1c2VkIGhlcmUgdG8gcmVwcmVzZW50IGEgZGVwZW5kZW5jeSBvZiB0aGUgcHJvamVjdCBtYXZlbiBpcyBidWlsZGluZywKKyAgICAgICAgLy8gb25lIHRoYXQgaXMgY29udHJpYnV0aW5nIC50aHJpZnQgSURMIGZpbGVzIGFzIHdlbGwgYXMgYW55IG90aGVyIGFydGlmYWN0cy4KKyAgICAgICAgZmluYWwgSXRlcmFibGU8RmlsZT4gY2xhc3NwYXRoRWxlbWVudEZpbGVzID0gTGlzdHMubmV3QXJyYXlMaXN0KAorICAgICAgICAgICAgICAgIG5ldyBGaWxlKCJzcmMvdGVzdC9yZXNvdXJjZXMvZGVwZW5kZW5jeS1qYXItdGVzdC9TaGFyZWRJZGwuamFyIikKKyAgICAgICAgKTsKKworICAgICAgICBmaW5hbCBTZXQ8RmlsZT4gdGhyaWZ0RGlyZWN0b3JpZXMgPSBtb2pvLm1ha2VUaHJpZnRQYXRoRnJvbUphcnModGVtcG9yYXJ5VGhyaWZ0RmlsZURpcmVjdG9yeSwgY2xhc3NwYXRoRWxlbWVudEZpbGVzKTsKKworICAgICAgICAvLyBUaGUgcmVzdWx0cyBzaG91bGQgYmUgYSBwYXRoIHRvIGEgZGlyZWN0b3J5IG5hbWVkIGFmdGVyIHRoZSBKQVIgaXRzZWxmIChhc3N1bWluZyBubyBwYXRoIGhhc2hpbmcsCisgICAgICAgIC8vIGJ1dCBzZWUgYmVsb3cgZm9yIGEgc2VwYXJhdGUgdGVzdCBvZiB0aGF0KSByZXByZXNlbnRpbmcgdGhlIHJvb3Qgb2YgYSBoaWVyYXJjaHkgY29udGFpbmluZyB0aHJpZnQKKyAgICAgICAgLy8gZmlsZXMsIHN1aXRhYmxlIGZvciBwcm92aWRpbmcgdG8gdGhlIHRocmlmdCBjb21waWxlciBhcyBhbiBpbmNsdWRlIGRpcmVjdG9yeS4gSW4gdGhpcyBjYXNlLCB0aGF0CisgICAgICAgIC8vIG1lYW5zIGl0IHBvaW50cyB0byB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlICJpZGwiIGhpZXJhcmNoeSByYXRoZXIgdGhhbiB0byB0aGUgaWRsIGRpcmVjdG9yeQorICAgICAgICAvLyBpdHNlbGYuCisgICAgICAgIGZpbmFsIFNldDxGaWxlPiBleHBlY3RlZCA9IFNldHMubmV3SGFzaFNldCgKKyAgICAgICAgICAgICAgICBuZXcgRmlsZSh0ZXN0Um9vdERpciwgInNyYy90ZXN0L3Jlc291cmNlcy9kZXBlbmRlbmN5LWphci10ZXN0L1NoYXJlZElkbC5qYXIiKQorICAgICAgICApOworCisgICAgICAgIGFzc2VydEVxdWFscygibWFrZVRocmlmdFBhdGhGcm9tSmFycyBzaG91bGQgcmV0dXJuIHRocmlmdCBJREwgYmFzZSBwYXRoIGZyb20gd2l0aGluIEpBUiIsIGV4cGVjdGVkLCB0aHJpZnREaXJlY3Rvcmllcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHJ1bmNhdGVQYXRoKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIC8vIEpBUiBwYXRoIGlzIHVucmVsYXRlZCB0byBtYXZlbiByZXBvLCBhbmQgc2hvdWxkIGJlIHVuY2hhbmdlZAorICAgICAgICBhc3NlcnRFcXVhbHMoIi9wYXRoL3RvL3NvbWVqYXIuamFyIiwgbW9qby50cnVuY2F0ZVBhdGgoIi9wYXRoL3RvL3NvbWVqYXIuamFyIikpOworCisgICAgICAgIC8vIEpBUiBwYXRoIGlzIHdpdGhpbiBtYXZlbiByZXBvLCBhbmQgc2hvdWxkIGJlIG1hZGUgcmVsYXRpdmUgdG8gdGhlIHJlcG8KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJwYXRoL3RvL3NvbWVqYXIuamFyIiwgbW9qby50cnVuY2F0ZVBhdGgoIi90ZXN0L21hdmVuL3JlcG8vYmFzZWRpci9wYXRoL3RvL3NvbWVqYXIuamFyIikpOworCisgICAgICAgIC8vIEpBUiBwYXRoIGNvbnRhaW5zIGZvcndhcmQgc2xhc2hlcyB0aGF0IHNob3VsZCBiZSBub3JtYWxpemVkCisgICAgICAgIGFzc2VydEVxdWFscygiL3BhdGgvdG8vc29tZWphci5qYXIiLCBtb2pvLnRydW5jYXRlUGF0aCgiXFxwYXRoXFx0b1xcc29tZWphci5qYXIiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHJ1bmNhdGVQYXRoV2l0aERlcGVuZGVudFBhdGhIYXNoaW5nKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIG1vam8uc2V0SGFzaERlcGVuZGVudFBhdGhzKHRydWUpOworCisgICAgICAgIC8vIGhhc2hEZXBlbmRlbnRQYXRocyBzZXQgdG8gdHJ1ZSwgdGhlIEpBUiBwYXRoIGlzIGltbWVkaWF0ZWx5IGhhc2hlZCAoTUQ1KSBhbmQgY29udmVydGVkIHRvIGEgaGV4IHN0cmluZworCisgICAgICAgIGFzc2VydEVxdWFscygiMWM4NTk1MDk4N2IyMzQ5MzQ2MmNmM2MyNjFkOTUxMGEiLCBtb2pvLnRydW5jYXRlUGF0aCgiL3BhdGgvdG8vc29tZWphci5qYXIiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMzlmYzJiNGMzNGNiNmNiMGRhMzhiZWQ1ZDhiNWZjNjciLCBtb2pvLnRydW5jYXRlUGF0aCgiL3Rlc3QvbWF2ZW4vcmVwby9iYXNlZGlyL3BhdGgvdG8vc29tZWphci5qYXIiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMjViNjkyNGY1YjBlMTk0ODZkMGZmODg0NDhlOTk5ZDUiLCBtb2pvLnRydW5jYXRlUGF0aCgiXFxwYXRoXFx0b1xcc29tZWphci5qYXIiKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250cmliL3RocmlmdC1tYXZlbi1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RocmlmdC9tYXZlbi9UZXN0VGhyaWZ0LmphdmEgYi9jb250cmliL3RocmlmdC1tYXZlbi1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RocmlmdC9tYXZlbi9UZXN0VGhyaWZ0LmphdmEKaW5kZXggM2VjZDA5NC4uN2M3ODkxZSAxMDA2NDQKLS0tIGEvY29udHJpYi90aHJpZnQtbWF2ZW4tcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aHJpZnQvbWF2ZW4vVGVzdFRocmlmdC5qYXZhCisrKyBiL2NvbnRyaWIvdGhyaWZ0LW1hdmVuLXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGhyaWZ0L21hdmVuL1Rlc3RUaHJpZnQuamF2YQpAQCAtNzMsNyArNzMsNyBAQAogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0VGhyaWZ0Q29tcGlsZVdpdGhHZW5lcmF0b3JPcHRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYnVpbGRlci5zZXRHZW5lcmF0b3IoImphdmE6cHJpdmF0ZS1tZW1iZXJzLGhhc2hjb2RlIik7CisgICAgICAgIGJ1aWxkZXIuc2V0R2VuZXJhdG9yKCJqYXZhOnByaXZhdGUtbWVtYmVycyIpOwogICAgICAgICBleGVjdXRlVGhyaWZ0Q29tcGlsZSgpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvY29udHJpYi90aHJpZnQuc3BlYyBiL2NvbnRyaWIvdGhyaWZ0LnNwZWMKaW5kZXggMGViN2IwNi4uY2MzYzMzYyAxMDA2NDQKLS0tIGEvY29udHJpYi90aHJpZnQuc3BlYworKysgYi9jb250cmliL3RocmlmdC5zcGVjCkBAIC0yOCw3ICsyOCw3IEBACiBMaWNlbnNlOiAgICAgICAgQXBhY2hlIExpY2Vuc2UgdjIuMAogR3JvdXA6ICAgICAgICAgIERldmVsb3BtZW50CiBTdW1tYXJ5OiAgICAgICAgUlBDIGFuZCBzZXJpYWxpemF0aW9uIGZyYW1ld29yawotVmVyc2lvbjogICAgICAgIDAuOS4yCitWZXJzaW9uOiAgICAgICAgMS4wLjAKIFJlbGVhc2U6ICAgICAgICAwCiBVUkw6ICAgICAgICAgICAgaHR0cDovL3RocmlmdC5hcGFjaGUub3JnCiBQYWNrYWdlcjogICAgICAgVGhyaWZ0IERldmVsb3BlcnMgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4KQEAgLTE3OCw2ICsxNzgsMTkgQEAKICAgLS13aXRob3V0LWNzaGFycCBcCiAgIC0td2l0aG91dC1lcmxhbmcgXAogCislaWYgMCV7IT93aXRob3V0X3J1Ynk6MX0KK2V2YWwgJChncmVwICJeV0lUSF9SVUJZX1RSVUUiIGNvbmZpZy5sb2cpCitpZiBbWyAiJHtXSVRIX1JVQllfVFJVRX0iICE9ICIiIF1dOyB0aGVuCisgIHNldCAreAorICBlY2hvICIiCisgIGVjaG8gImNvbmZpZ3VyZSBkZXRlcm1pbmVkIHRoYXQgcnVieSByZXF1aXJlbWVudHMgYXJlIG1pc3NpbmcgKGJ1bmRsZXIgZ2VtPyksIGVpdGhlciBpbnN0YWxsIG1pc3NpbmcgY29tcG9uZW50cyIgPiYyCisgIGVjaG8gIm9yIGRpc2FibGUgdGhlIHJ1Ynkgc3ViLXBhY2thZ2VzIGFzIGZvbGxvd3M6IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPiYyCisgIGVjaG8gIiAgICAgcnBtYnVpbGQgLUQnJXdpdGhvdXRfcnVieSAxJyAuLi4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPiYyCisgIGVjaG8gIiIKKyAgZXhpdCAxCitmaQorJWVuZGlmCisKIG1ha2UgJXs/X3NtcF9tZmxhZ3N9CiAKICVpZiAwJXshP3dpdGhvdXRfamF2YToxfQpAQCAtMjM0LDcgKzI0Nyw3IEBACiAvc2Jpbi9sZGNvbmZpZyA+IC9kZXYvbnVsbCAyPiYxCiAKICVjaGFuZ2Vsb2cKLSogVGh1IE9jdCAzMSAyMDE0IFRocmlmdCBEZXYgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4KLS0gVGhyaWZ0IDAuOS4yIHJlbGVhc2UuCisqIFdlZCBBdWcgMjEgMjAxMyBUaHJpZnQgRGV2IDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+CistIFRocmlmdCAwLjkuMSByZWxlYXNlLgogKiBXZWQgT2N0IDEwIDIwMTIgVGhyaWZ0IERldiA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPiAKIC0gVGhyaWZ0IDAuOS4wIHJlbGVhc2UuCmRpZmYgLS1naXQgYS9jb250cmliL3RocmlmdC52aW0gYi9jb250cmliL3RocmlmdC52aW0KaW5kZXggMzAwMGI0Ni4uNjIzMTk1NSAxMDA2NDQKLS0tIGEvY29udHJpYi90aHJpZnQudmltCisrKyBiL2NvbnRyaWIvdGhyaWZ0LnZpbQpAQCAtNTEsNyArNTEsNyBAQAogc3luIGtleXdvcmQgdGhyaWZ0S2V5d29yZCBuYW1lc3BhY2UKIHN5biBrZXl3b3JkIHRocmlmdEtleXdvcmQgeHNkX2FsbCB4c2Rfb3B0aW9uYWwgeHNkX25pbGxhYmxlIHhzZF9hdHRycwogc3luIGtleXdvcmQgdGhyaWZ0S2V5d29yZCBpbmNsdWRlIGNwcF9pbmNsdWRlIGNwcF90eXBlIGNvbnN0IG9wdGlvbmFsIHJlcXVpcmVkCi1zeW4ga2V5d29yZCB0aHJpZnRCYXNpY1R5cGVzIHZvaWQgYm9vbCBieXRlIGkxNiBpMzIgaTY0IGRvdWJsZSBzdHJpbmcgYmluYXJ5CitzeW4ga2V5d29yZCB0aHJpZnRCYXNpY1R5cGVzIHZvaWQgYm9vbCBieXRlIGk4IGkxNiBpMzIgaTY0IGRvdWJsZSBzdHJpbmcgYmluYXJ5CiBzeW4ga2V5d29yZCB0aHJpZnRTdHJ1Y3R1cmUgbWFwIGxpc3Qgc2V0IHN0cnVjdCB0eXBlZGVmIGV4Y2VwdGlvbiBlbnVtIHRocm93cyB1bmlvbgogCiAiIFNwZWNpYWwKZGlmZiAtLWdpdCBhL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9UaHJpZnRDb21tb24uaCBiL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9UaHJpZnRDb21tb24uaAppbmRleCBkMjRkMWE3Li5lMTZkODdkIDEwMDY0NAotLS0gYS9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvVGhyaWZ0Q29tbW9uLmgKKysrIGIvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL1RocmlmdENvbW1vbi5oCkBAIC0xNiw4ICsxNiw2IEBACiAvLwogCiAjaWZkZWYgX1dJTjMyIC8vdGhyaWZ0IGlzIGNyYXNoaW5nIHdoZW4gdXNpbmcgYm9vc3QgdGhyZWFkcyBvbiBNYWMgT1NYCi0jICBkZWZpbmUgVVNFX0JPT1NUX1RIUkVBRCAxCi0jICBpbmNsdWRlIDxib29zdC90aHJlYWQuaHBwPgogI2Vsc2UKICMgIGluY2x1ZGUgPHN5cy9zb2NrZXQuaD4KICMgIGluY2x1ZGUgPG5ldGluZXQvaW4uaD4KZGlmZiAtLWdpdCBhL2NvbnRyaWIvdmFncmFudC9jZW50b3MtNi41L1JFQURNRS5tZCBiL2NvbnRyaWIvdmFncmFudC9jZW50b3MtNi41L1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTU4M2Y5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi92YWdyYW50L2NlbnRvcy02LjUvUkVBRE1FLm1kCkBAIC0wLDAgKzEsNjEgQEAKK0FwYWNoZSBUaHJpZnQgQ2VudG9zIDYuNSBWYWdyYW50IFN1cHBvcnQKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1RoaXMgZGlyZWN0b3J5IGlzIHRoZSBWYWdyYW50IHByb2plY3QgZGlyZWN0b3J5IGZvciBBcGFjaGUgVGhyaWZ0IHJ1bm5pbmcgb24gQ2VudG9zIDYuNS4gVGhlIFZhZ3JhbnRmaWxlIGluIHRoaXMgZGlyZWN0b3J5IGNvbmZpZ3VyZXMgYSBWYWdyYW50IHByb3Zpc2lvbmVkIFZNIGxhdW5jaGVkIHVuZGVyIFZpcnR1YWxCb3guIFRvIHVzZSB0aGlzIHByb2plY3QgeW91IG11c3QgaGF2ZSBhIHJlY2VudCB2ZXJzaW9uIG9mIFZpcnR1YWxCb3ggYW5kIFZhZ3JhbnQgaW5zdGFsbGVkIChpbiB0aGF0IG9yZGVyKS4gVG8gcnVuIHRoZSBWTSwgb3BlbiBhIHNoZWxsLCBjbG9uZSBBcGFjaGUgVGhyaWZ0LCBjaGFuZ2UgdG8gdGhpcyBkaXJlY3RvcnkgYW5kIGVudGVyIHRoZSBWYWdyYW50IHVwIGNvbW1hbmQuCisKKyAgICQgZ2l0IGNsb25lIGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0CisgICAkIGNkIHRocmlmdC9jb250cmliL3ZhZ3JhbnQvY2VudG9zLTYuNQorICAgJCB2YWdyYW50IHVwCisKK1RoaXMgd2lsbCBkb3dubG9hZCBhbmQgbGF1bmNoIHRoZSBiYXNlIGJveCBWTSB1bmRlciBWaXJ0dWFsQm94IGFuZCBydW4gdGhlIEFwYWNoZSBUaHJpZnQgcHJvdmlzaW9uaW5nIHNjcmlwdC4gVGhpcyB3aWxsIHRha2UgdXAgdG8gYW4gaG91ciBkZXBlbmRpbmcgb24geW91ciBoYXJkd2FyZSBhbmQgbmV0d29yay4gT25jZSBjb21wbGV0ZSB5b3UgY2FuIGxvZ2luIHRvIHRoZSBib3ggd2l0aCBWYWdyYW50IHNzaC4gVGhlIHRocmlmdCBzb3VyY2UgdHJlZSBmcm9tIHlvdXIgaG9zdCBvcyBpcyBtb3VudGVkIGF0IC90aHJpZnQuCisKKyAgICQgdmFncmFudCBzc2gKKyAgIFt2YWdyYW50QHRocmlmdCB+XSQgY2QgL3RocmlmdAorICAgW3ZhZ3JhbnRAdGhyaWZ0IHRocmlmdF0kIGNvbXBpbGVyL2NwcC90aHJpZnQgLS12ZXJzaW9uCisgICBUaHJpZnQgdmVyc2lvbiA8dmVyc2lvbj4KKworVGhlIHByb3Zpc2lvbmluZyBzY3JpcHQgKGluc2lkZSB0aGUgVmFncmFudGZpbGUpIHJ1bnMgLi9ib290c3RyYXAuc2gsIC4vY29uZmlndXJlLCBtYWtlIGFuZCBtYWtlIGNoZWNrLCBidXQgZG9lcyBub3QgaW5zdGFsbCB0aHJpZnQuIFRvIGluc3RhbGwgdGhyaWZ0IHJ1biAibWFrZSBpbnN0YWxsIi4KKworVGhlIFZhZ3JhbnQgYmFzZSBib3ggdXNlZCBoZXJlIGlzIGEgbWluaW1hbCBDZW50b3MgNi41IFZpcnR1YWxCb3ggd2l0aCAyR0IgUkFNIGFuZCAyIENQVXMuIEZvciBtb3JlIFZhZ3JhbnQgaW5mb3JtYXRpb246IGh0dHBzOi8vd3d3LnZhZ3JhbnR1cC5jb20uIEEgc3VtbWFyeSBvZiB0aGUgYmFzZSBib3ggcHJlcGFyYXRpb24gZm9sbG93czoKKworcm9vdCBwYXNzd29yZDogdmFncmFudAorCisjQ3JlYXRlIHRoZSB2YWdyYW50IHVzZXIgYW5kIGdpdmUgaXQgc3VkbyBwZXJtaXNzaW9uCithZGR1c2VyIHZhZ3JhbnQKK3Bhc3N3ZCB2YWdyYW50Cit2aXN1ZG8gIDogIHZhZ3JhbnQgQUxMPShBTEwpIE5PUEFTU1dEOiBBTEwKKyAgICAgICAgICAgI0RlZmF1bHRzIHJlcXVpcmV0dHkKKworI1NodXQgZG93biB0aGUgZmlyZXdhbGwgYW5kIGRpc2FibGUgaXQKK3NlcnZpY2UgaXB0YWJsZXMgc3RvcAorY2hrY29uZmlnIGlwdGFibGVzIG9mZgorCisjU2V0dXAgdGhlIHZhZ3JhbnQgc3NoIHB1YmxpYyBrZXkgdG8gYWxsb3cgdmFncmFudCB0byBzc2gKK21rZGlyIC9ob21lL3ZhZ3JhbnQvLnNzaAorY2htb2QgNzAwIC9ob21lL3ZhZ3JhbnQvLnNzaAorY2QgL2hvbWUvdmFncmFudC8uc3NoCit3Z2V0IC0tbm8tY2hlY2stY2VydGlmaWNhdGUgJ2h0dHBzOi8vcmF3LmdpdGh1Yi5jb20vbWl0Y2hlbGxoL3ZhZ3JhbnQvbWFzdGVyL2tleXMvdmFncmFudC5wdWInIC1PIGF1dGhvcml6ZWRfa2V5cworY2htb2QgNjAwIC9ob21lL3ZhZ3JhbnQvLnNzaC9hdXRob3JpemVkX2tleXMKK2Nob3duIC1SIHZhZ3JhbnQgL2hvbWUvdmFncmFudC8uc3NoCisKKyNJbnN0YWxsIEVQRUwgKEV4dHJhIFBhY2thZ2VzIGZvciBFbnRlcnByaXNlIExpbnV4KSBidXQgcHJvdGVjdCB0aGUgYmFzZQorI3JlcG9zaXRvcmllcyBzbyB0aGF0IEVQRUwgZG9lcyBub3QgbWFzayBiYXNlIHBhY2thZ2VzCit5dW0gLXkgaW5zdGFsbCB5dW0tcGx1Z2luLXByb3RlY3RiYXNlCitycG0gLVV2aCBodHRwOi8vZG93bmxvYWQuZmVkb3JhcHJvamVjdC5vcmcvcHViL2VwZWwvNi9pMzg2L2VwZWwtcmVsZWFzZS02LTgubm9hcmNoLnJwbQorCisjSW5zdGFsbCBwZXJsLCBkeW5hbWljIGtlcm5lbCBtb2R1bGVzLCBkZXYgdG9vbHMgYW5kIGtlcm5lbCBoZWFkZXJzIHRvIHN1cHBvcnQKKyNWaXJ0dWFsIGJveCBhZGRpdGlvbnMKK3l1bSAteSBpbnN0YWxsIHBlcmwKK3l1bSAteSAtLWVuYWJsZXJlcG8gZXBlbCBpbnN0YWxsIGRrbXMKK3l1bSAteSBncm91cGluc3RhbGwgIkRldmVsb3BtZW50IFRvb2xzIgoreXVtIC15IGluc3RhbGwga2VybmVsLWRldmVsCisKKyNVcGRhdGUgZXZlcnl0aGluZyBhbmQgcmVib290Cit5dW0gdXBkYXRlCityZWJvb3QKKworI0luc3RhbGwgdGhlIFZpcnR1YWxCb3ggR3Vlc3QgYWRkaXRpb25zICh1c2luZyBWaXJ0dWFsQm94IGlzbykKK21vdW50IC9kZXYvY2Ryb20gL21udAorL21udC9WQm94TGludXhBZGRpdGlvbnMucnVuCit1bW91bnQgL21udAorCitTZWUgdGhlIFZhZ3JhbnRmaWxlIGZvciBmdXJ0aGVyIGRldGFpbHMKZGlmZiAtLWdpdCBhL2NvbnRyaWIvdmFncmFudC9jZW50b3MtNi41L1ZhZ3JhbnRmaWxlIGIvY29udHJpYi92YWdyYW50L2NlbnRvcy02LjUvVmFncmFudGZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFhMjIzOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvdmFncmFudC9jZW50b3MtNi41L1ZhZ3JhbnRmaWxlCkBAIC0wLDAgKzEsMjc0IEBACisjIC0qLSBtb2RlOiBydWJ5IC0qLQorIyB2aTogc2V0IGZ0PXJ1YnkgOgorCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKworIyBBUEFDSEUgVEhSSUZUIFBST1ZJU0lPTklORyBTQ1JJUFQKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFRoaXMgc2NyaXB0IGlzIHVzZWQgdG8gY29uZmlndXJlIHRoZSBiYXNlIENlbnRvcyA2LjUKKyMgVmFncmFudCBib3ggZm9yIEFwYWNoZSBUaHJpZnQgY29tcGlsZXIgYW5kIGxpYiBidWlsZHMuCisjIFRoZSBiYXNlIGJveCBpcyBDZW50b3MgNi41IHdpdGggbm8gYWRkaXRpb25hbCBwYWNrYWdlcworIyBleGNlcHQgdGhvc2UgcmVxdWlyZWQgdG8gc3VwcG9ydCBWaXJ0dWFsQm94IEd1ZXN0IHRvb2xzOgorIyBwZXJsLCBka21zLCBrZXJuZWwtZGV2ZWwgYW5kIHRoZSAiRGV2ZWxvcG1lbnQgVG9vbHMiIGdyb3VwLgorIyBUaGUgZXBlbCByZXBvIHdhcyBhbHNvIGFkZGVkIGFsb25nIHdpdGggdGhlCisjIHl1bS1wbHVnaW4tcHJvdGVjdGJhc2UgcGFja2FnZSB0byBwcmVmZXIgYmFzZSByZXBvIHBhY2thZ2VzLgorIyBUaGUgc2NyaXB0IGJlbG93IHByb3Zpc2lvbnMgQUxMIGxhbmd1YWdlcy4gVGhpcyB3aWxsIHRha2UKKyMgdGltZS4gWW91IGNhbiBncmVhdGx5IHJlZHVjZSB0aGUgYnVpbGQgdGltZSBieSBjb21tZW50aW5nCisjIG91dCB0aGUgTElCIHByb3Zpc2lvbmluZyBmb3IgdW5lZWRlZCBsYW5ndWFnZSBsaWJyYXJpZXMuCisjIEV4cGVjdCBmdWxsIHByb3Zpc2lvbmluZyB0byB0YWtlIDMwIG1pbnV0ZXMgb24gYSBmYXN0CisjIG1hY2hpbmUgd2l0aCBhbiBleGNlbGxlbnQgSW50ZXJuZXQgY29ubmVjdGlvbiAoYW5kIGFub3RoZXIKKyMgMTUgbWludXRlcyBmb3IgdGhlIGJ1aWxkKS4KKyMKKyMgTWFjaGluZSBhY2NvdW50czoKKyMgLSBVc2VyOiB2YWdyYW50L3ZhZ3JhbnQKKyMgLSBBZG1pbjogcm9vdC92YWdyYW50CisjIFZhZ3JhbnQgcHVibGljIHNzaCBrZXkgYWxzbyBpbnN0YWxsZWQKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyRidWlsZF9hbmRfdGVzdCA9IDw8U0NSSVBUCitlY2hvICJQcm92aXNpb25pbmcgc3lzdGVtIHRvIGNvbXBpbGUgYW5kIHRlc3QgQXBhY2hlIFRocmlmdC4iCitkYXRlID4gL2V0Yy92YWdyYW50LnByb3Zpc2lvbl9iZWdpbgorCisjIEFwYWNoZSBUaHJpZnQgY29tcGlsZXIgZGVwZW5kZW5jaWVzCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyNpbnN0YWxsIGFuIHVwZGF0ZWQgYXV0b2NvbmYKK3dnZXQgaHR0cDovL2Z0cC5nbnUub3JnL2dudS9hdXRvY29uZi9hdXRvY29uZi0yLjY5LnRhci5negordGFyIHh2ZiBhdXRvY29uZi0yLjY5LnRhci5negorY2QgYXV0b2NvbmYtMi42OQorLi9jb25maWd1cmUgLS1wcmVmaXg9L3VzcgorbWFrZQorc3VkbyBtYWtlIGluc3RhbGwKK2NkIC4uCisKKyNpbnN0YWxsIGFuIHVwZGF0ZWQgYXV0b21ha2UKK3dnZXQgaHR0cDovL2Z0cC5nbnUub3JnL2dudS9hdXRvbWFrZS9hdXRvbWFrZS0xLjE0LnRhci5negordGFyIHh2ZiBhdXRvbWFrZS0xLjE0LnRhci5negorY2QgYXV0b21ha2UtMS4xNAorLi9jb25maWd1cmUgLS1wcmVmaXg9L3VzcgorbWFrZQorc3VkbyBtYWtlIGluc3RhbGwKK2NkIC4uCisKKyNpbnN0YWxsIGFuIHVwZGF0ZWQgYmlzb24KK3dnZXQgaHR0cDovL2Z0cC5nbnUub3JnL2dudS9iaXNvbi9iaXNvbi0yLjUuMS50YXIuZ3oKK3RhciB4dmYgYmlzb24tMi41LjEudGFyLmd6CitjZCBiaXNvbi0yLjUuMQorLi9jb25maWd1cmUgLS1wcmVmaXg9L3VzcgorbWFrZQorc3VkbyBtYWtlIGluc3RhbGwKK2NkIC4uCisKKyMgQysrOTggTElCIERlcGVuZGVuY2llcworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworc3VkbyB5dW0gLXkgaW5zdGFsbCBsaWJldmVudC1kZXZlbCB6bGliLWRldmVsIG9wZW5zc2wtZGV2ZWwKKworI0luc3RhbGwgYW4gdXBkYXRlZCBCb29zdCBsaWJyYXJ5Cit3Z2V0IGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvYm9vc3QvZmlsZXMvYm9vc3QvMS41NS4wL2Jvb3N0XzFfNTVfMC50YXIuZ3oKK3RhciB4dmYgYm9vc3RfMV81NV8wLnRhci5negorY2QgYm9vc3RfMV81NV8wCisuL2Jvb3RzdHJhcC5zaAorc3VkbyAuL2IyIGluc3RhbGwKKworIyBKYXZhIExJQiBEZXBlbmRlbmNpZXMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3N1ZG8geXVtIGluc3RhbGwgLXkgYW50IGp1bml0IGFudC1ub2RlcHMgYW50LWp1bml0IGphdmEtMS44LjAtb3Blbmpkay1kZXZlbAorCisjIFB5dGhvbiBMSUIgRGVwZW5kZW5jaWVzCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitzdWRvIHl1bSBpbnN0YWxsIC15IHB5dGhvbi1kZXZlbCBweXRob24tc2V0dXB0b29scyBweXRob24tdHdpc3RlZAorCisjIFJ1YnkgTElCIERlcGVuZGVuY2llcworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworc3VkbyB5dW0gaW5zdGFsbCAteSBydWJ5IHJ1YnktZGV2ZWwgcnVieWdlbXMKK3N1ZG8gZ2VtIGluc3RhbGwgYnVuZGxlciByYWtlCisKKyMgTm9kZS5qcyBMSUIgRGVwZW5kZW5jaWVzCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitzdWRvIHl1bSBpbnN0YWxsIC15IG5vZGVqcyBub2RlanMtZGV2ZWwgbnBtCisKKyMgUGVybCBMSUIgRGVwZW5kZW5jaWVzCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitzdWRvIHl1bSBpbnN0YWxsIC15IHBlcmwtQml0LVZlY3RvciBwZXJsLUNsYXNzLUFjY2Vzc29yIHBlcmwtRXh0VXRpbHMtTWFrZU1ha2VyIHBlcmwtVGVzdC1TaW1wbGUKKworIyBQSFAgTElCIERlcGVuZGVuY2llcworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworc3VkbyB5dW0gaW5zdGFsbCAteSBwaHAgcGhwLWRldmVsIHBocC1wZWFyIHJlMmMKKworIyBHTGliQyBMSUIgRGVwZW5kZW5jaWVzCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitzdWRvIHl1bSBpbnN0YWxsIC15IGdsaWIyLWRldmVsCisKKyMgRXJsYW5nIExJQiBEZXBlbmRlbmNpZXMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3N1ZG8geXVtIGluc3RhbGwgLXkgZXJsYW5nLWtlcm5lbCBlcmxhbmctZXJ0cyBlcmxhbmctc3RkbGliIGVybGFuZy1ldW5pdCBlcmxhbmctcmViYXIKKworIyBMdWEgTElCIERlcGVuZGVuY2llcworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworc3VkbyB5dW0gaW5zdGFsbCAteSBsdWEtZGV2ZWwKKworIyBHbyBMSUIgRGVwZW5kZW5jaWVzCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitzdWRvIHl1bSBpbnN0YWxsIC15IGdvbGFuZyBnb2xhbmctcGtnLWxpbnV4LWFtZDY0CisKKyMgQyMgTElCIERlcGVuZGVuY2llcworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworc3VkbyB5dW0gaW5zdGFsbCAteSBtb25vLWNvcmUgbW9uby1kZXZlbCBtb25vLXdlYi1kZXZlbCBtb25vLWV4dHJhcyBtaW5ndzMyLWJpbnV0aWxzIG1pbmd3MzItcnVudGltZSBtaW5ndzMyLW5zaXMKKworIyBIYXNrZWxsIExJQiBEZXBlbmRlbmNpZXMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3dnZXQgaHR0cDovL3NoZXJraW4uanVzdGh1Yi5vcmcvZWw2L1JQTVMveDg2XzY0L2p1c3RodWItcmVsZWFzZS0yLjAtNC4wLmVsNi54ODZfNjQucnBtCitzdWRvIHJwbSAtaXZoIGp1c3RodWItcmVsZWFzZS0yLjAtNC4wLmVsNi54ODZfNjQucnBtCitzdWRvIHl1bSAteSBpbnN0YWxsIGhhc2tlbGwKK3N1ZG8gY2FiYWwgdXBkYXRlCitzdWRvIGNhYmFsIGluc3RhbGwgY2FiYWwtaW5zdGFsbAorCisjIEJ1aWxkIGFuZCBUZXN0IEFwYWNoZSBUaHJpZnQKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2RhdGUgPiAvZXRjL3ZhZ3JhbnQucHJvdmlzaW9uX2VuZAorZWNobyAiU3RhcnRpbmcgQXBhY2hlIFRocmlmdCBidWlsZC4uLiIKK2NkIC90aHJpZnQKK3NoIGJvb3RzdHJhcC5zaAorCisjIEF0IHRoZSB0aW1lIG9mIHRoaXMgZmlsZSdzIGNyZWF0aW9uIFJ1YnksIFB5dGhvbiwgR28gYW5kIEx1YSBmYWlsCisjIHRoZWlyIHVuaXQgdGVzdHMgaW4gdGhpcyBlbnZpcm9ubWVudC4gVG8gYnVpbGQgYW5kIHRlc3QgYW55IG9mIHRoZXNlCisjIGxpYnJhcmllcyB1bmNvbW1lbnQgdGhlIGFwcHJvcHJpYXRlIC0td2l0aG91dCBzd2l0Y2hlcyBiZWxvdy4KKworc2ggY29uZmlndXJlIC0td2l0aG91dC1ydWJ5IC0td2l0aG91dC1nbyAtLXdpdGhvdXQtbHVhIC0td2l0aG91dC1weXRob24KK21ha2UKK2VjaG8gIlN0YXJ0aW5nIEFwYWNoZSBUaHJpZnQgdGVzdHMuLi4iCittYWtlIGNoZWNrCitlY2hvICJGaW5pc2hlZCBidWlsZGluZyBhbmQgdGVzdGluZyBBcGFjaGUgVGhyaWZ0LiIKK2VjaG8gJ1VzZSAibWFrZSBpbnN0YWxsIiB0byBpbnN0YWxsIHRoZSBjb21waWxlciBhbmQgbGlicmFyaWVzLicKK2RhdGUgPiAvZXRjL3ZhZ3JhbnQubWFrZV9lbmQKKworU0NSSVBUCisKK1ZhZ3JhbnQuY29uZmlndXJlKCIyIikgZG8gfGNvbmZpZ3wKKyAgIyBFdmVyeSBWYWdyYW50IHZpcnR1YWwgZW52aXJvbm1lbnQgcmVxdWlyZXMgYSBib3ggdG8gYnVpbGQgb2ZmIG9mLgorICAjIyMjIyBDZW50b3MgNi41IG1pbmltYWwgc3lzdGVtIHdpdGggVmlydHVhbEJveCBHdWVzdCBBZGRpdGlvbnMKKyAgIyMjIyMgQm94IG1haW50YWluZWQgYnkgcmFAYXBhY2hlLm9yZywgc2VlIFJFQURNRS5tZCBmb3IgYm94IGNvbmZpZworICBjb25maWcudm0uYm94ID0gIlJhbmR5QWJlcm5ldGh5L3RocmlmdC1jZW50b3MtNi41LTY0IgorCisgICMgRGlzYWJsZSBhdXRvbWF0aWMgYm94IHVwZGF0ZSBjaGVja2luZy4gSWYgeW91IGRpc2FibGUgdGhpcywgdGhlbgorICAjIGJveGVzIHdpbGwgb25seSBiZSBjaGVja2VkIGZvciB1cGRhdGVzIHdoZW4gdGhlIHVzZXIgcnVucworICAjIGB2YWdyYW50IGJveCBvdXRkYXRlZGAuIFRoaXMgaXMgbm90IHJlY29tbWVuZGVkLgorICAjIyMjIyBUaGlzIGJveCB3aWxsIG5ldmVyIGNoYW5nZQorICBjb25maWcudm0uYm94X2NoZWNrX3VwZGF0ZSA9IGZhbHNlCisKKyAgIyBDcmVhdGUgYSBmb3J3YXJkZWQgcG9ydCBtYXBwaW5nIHdoaWNoIGFsbG93cyBhY2Nlc3MgdG8gYSBzcGVjaWZpYyBwb3J0CisgICMgd2l0aGluIHRoZSBtYWNoaW5lIGZyb20gYSBwb3J0IG9uIHRoZSBob3N0IG1hY2hpbmUuIEluIHRoZSBleGFtcGxlIGJlbG93LAorICAjIGFjY2Vzc2luZyAibG9jYWxob3N0OjgwODAiIHdpbGwgYWNjZXNzIHBvcnQgODAgb24gdGhlIGd1ZXN0IG1hY2hpbmUuCisgICMgY29uZmlnLnZtLm5ldHdvcmsgImZvcndhcmRlZF9wb3J0IiwgZ3Vlc3Q6IDgwLCBob3N0OiA4MDgwCisKKyAgIyBDcmVhdGUgYSBwcml2YXRlIG5ldHdvcmssIHdoaWNoIGFsbG93cyBob3N0LW9ubHkgYWNjZXNzIHRvIHRoZSBtYWNoaW5lCisgICMgdXNpbmcgYSBzcGVjaWZpYyBJUC4KKyAgIyBjb25maWcudm0ubmV0d29yayAicHJpdmF0ZV9uZXR3b3JrIiwgaXA6ICIxOTIuMTY4LjMzLjEwIgorCisgICMgQ3JlYXRlIGEgcHVibGljIG5ldHdvcmssIHdoaWNoIGdlbmVyYWxseSBtYXRjaGVkIHRvIGJyaWRnZWQgbmV0d29yay4KKyAgIyBCcmlkZ2VkIG5ldHdvcmtzIG1ha2UgdGhlIG1hY2hpbmUgYXBwZWFyIGFzIGFub3RoZXIgcGh5c2ljYWwgZGV2aWNlIG9uCisgICMgeW91ciBuZXR3b3JrLgorICAjIGNvbmZpZy52bS5uZXR3b3JrICJwdWJsaWNfbmV0d29yayIKKworICAjIElmIHRydWUsIHRoZW4gYW55IFNTSCBjb25uZWN0aW9ucyBtYWRlIHdpbGwgZW5hYmxlIGFnZW50IGZvcndhcmRpbmcuCisgICMgRGVmYXVsdCB2YWx1ZTogZmFsc2UKKyAgIyBjb25maWcuc3NoLmZvcndhcmRfYWdlbnQgPSB0cnVlCisKKyAgIyBTaGFyZSBhbiBhZGRpdGlvbmFsIGZvbGRlciB0byB0aGUgZ3Vlc3QgVk0uIFRoZSBmaXJzdCBhcmd1bWVudCBpcworICAjIHRoZSBwYXRoIG9uIHRoZSBob3N0IHRvIHRoZSBhY3R1YWwgZm9sZGVyLiBUaGUgc2Vjb25kIGFyZ3VtZW50IGlzCisgICMgdGhlIHBhdGggb24gdGhlIGd1ZXN0IHRvIG1vdW50IHRoZSBmb2xkZXIuIEFuZCB0aGUgb3B0aW9uYWwgdGhpcmQKKyAgIyBhcmd1bWVudCBpcyBhIHNldCBvZiBub24tcmVxdWlyZWQgb3B0aW9ucy4KKyAgIyBjb25maWcudm0uc3luY2VkX2ZvbGRlciAiLi4vZGF0YSIsICIvdmFncmFudF9kYXRhIgorICAjIyMjIyBCeSBjb252ZW50aW9uIHRoZSB0aHJpZnQgc291cmNlIHRyZWUgaXMgbWFwcGVkIHRvIC90aHJpZnQKKyAgY29uZmlnLnZtLnN5bmNlZF9mb2xkZXIgIi4uLy4uLy4uLyIsICIvdGhyaWZ0IgorCisgICMgUHJvdmlkZXItc3BlY2lmaWMgY29uZmlndXJhdGlvbiBzbyB5b3UgY2FuIGZpbmUtdHVuZSB2YXJpb3VzCisgICMgYmFja2luZyBwcm92aWRlcnMgZm9yIFZhZ3JhbnQuIFRoZXNlIGV4cG9zZSBwcm92aWRlci1zcGVjaWZpYyBvcHRpb25zLgorICAjIyMjIyBUaGUgbWFjaGluZSBuZWVkcyAyIENQVXMgYW5kIDJHQiBSQU0gZm9yIHJlYXNvbmFibGUgcGVyZm9ybWFuY2UKKyAgY29uZmlnLnZtLnByb3ZpZGVyICJ2aXJ0dWFsYm94IiBkbyB8dmJ8CisgICAgdmIuY3VzdG9taXplIFsibW9kaWZ5dm0iLCA6aWQsICItLW1lbW9yeSIsICIyMDQ4Il0KKyAgICB2Yi5jdXN0b21pemUgWyJtb2RpZnl2bSIsIDppZCwgIi0tY3B1cyIsICIyIl0KKyAgZW5kCisKKyAgIyBFbmFibGUgcHJvdmlzaW9uaW5nIHdpdGggQ0ZFbmdpbmUuIENGRW5naW5lIENvbW11bml0eSBwYWNrYWdlcyBhcmUKKyAgIyBhdXRvbWF0aWNhbGx5IGluc3RhbGxlZC4gRm9yIGV4YW1wbGUsIGNvbmZpZ3VyZSB0aGUgaG9zdCBhcyBhCisgICMgcG9saWN5IHNlcnZlciBhbmQgb3B0aW9uYWxseSBhIHBvbGljeSBmaWxlIHRvIHJ1bjoKKyAgIworICAjIGNvbmZpZy52bS5wcm92aXNpb24gImNmZW5naW5lIiBkbyB8Y2Z8CisgICMgICBjZi5hbV9wb2xpY3lfaHViID0gdHJ1ZQorICAjICAgIyBjZi5ydW5fZmlsZSA9ICJtb3RkLmNmIgorICAjIGVuZAorICAjCisgICMgWW91IGNhbiBhbHNvIGNvbmZpZ3VyZSBhbmQgYm9vdHN0cmFwIGEgY2xpZW50IHRvIGFuIGV4aXN0aW5nCisgICMgcG9saWN5IHNlcnZlcjoKKyAgIworICAjIGNvbmZpZy52bS5wcm92aXNpb24gImNmZW5naW5lIiBkbyB8Y2Z8CisgICMgICBjZi5wb2xpY3lfc2VydmVyX2FkZHJlc3MgPSAiMTAuMC4yLjE1IgorICAjIGVuZAorCisgICMgRW5hYmxlIHByb3Zpc2lvbmluZyB3aXRoIFB1cHBldCBzdGFuZCBhbG9uZS4gIFB1cHBldCBtYW5pZmVzdHMKKyAgIyBhcmUgY29udGFpbmVkIGluIGEgZGlyZWN0b3J5IHBhdGggcmVsYXRpdmUgdG8gdGhpcyBWYWdyYW50ZmlsZS4KKyAgIyBZb3Ugd2lsbCBuZWVkIHRvIGNyZWF0ZSB0aGUgbWFuaWZlc3RzIGRpcmVjdG9yeSBhbmQgYSBtYW5pZmVzdCBpbgorICAjIHRoZSBmaWxlIGRlZmF1bHQucHAgaW4gdGhlIG1hbmlmZXN0c19wYXRoIGRpcmVjdG9yeS4KKyAgIworICAjIGNvbmZpZy52bS5wcm92aXNpb24gInB1cHBldCIgZG8gfHB1cHBldHwKKyAgIyAgIHB1cHBldC5tYW5pZmVzdHNfcGF0aCA9ICJtYW5pZmVzdHMiCisgICMgICBwdXBwZXQubWFuaWZlc3RfZmlsZSAgPSAiZGVmYXVsdC5wcCIKKyAgIyBlbmQKKworICAjIEVuYWJsZSBwcm92aXNpb25pbmcgd2l0aCBjaGVmIHNvbG8sIHNwZWNpZnlpbmcgYSBjb29rYm9va3MgcGF0aCwgcm9sZXMKKyAgIyBwYXRoLCBhbmQgZGF0YV9iYWdzIHBhdGggKGFsbCByZWxhdGl2ZSB0byB0aGlzIFZhZ3JhbnRmaWxlKSwgYW5kIGFkZGluZworICAjIHNvbWUgcmVjaXBlcyBhbmQvb3Igcm9sZXMuCisgICMKKyAgIyBjb25maWcudm0ucHJvdmlzaW9uICJjaGVmX3NvbG8iIGRvIHxjaGVmfAorICAjICAgY2hlZi5jb29rYm9va3NfcGF0aCA9ICIuLi9teS1yZWNpcGVzL2Nvb2tib29rcyIKKyAgIyAgIGNoZWYucm9sZXNfcGF0aCA9ICIuLi9teS1yZWNpcGVzL3JvbGVzIgorICAjICAgY2hlZi5kYXRhX2JhZ3NfcGF0aCA9ICIuLi9teS1yZWNpcGVzL2RhdGFfYmFncyIKKyAgIyAgIGNoZWYuYWRkX3JlY2lwZSAibXlzcWwiCisgICMgICBjaGVmLmFkZF9yb2xlICJ3ZWIiCisgICMKKyAgIyAgICMgWW91IG1heSBhbHNvIHNwZWNpZnkgY3VzdG9tIEpTT04gYXR0cmlidXRlczoKKyAgIyAgIGNoZWYuanNvbiA9IHsgbXlzcWxfcGFzc3dvcmQ6ICJmb28iIH0KKyAgIyBlbmQKKworICAjIEVuYWJsZSBwcm92aXNpb25pbmcgd2l0aCBjaGVmIHNlcnZlciwgc3BlY2lmeWluZyB0aGUgY2hlZiBzZXJ2ZXIgVVJMLAorICAjIGFuZCB0aGUgcGF0aCB0byB0aGUgdmFsaWRhdGlvbiBrZXkgKHJlbGF0aXZlIHRvIHRoaXMgVmFncmFudGZpbGUpLgorICAjCisgICMgVGhlIE9wc2NvZGUgUGxhdGZvcm0gdXNlcyBIVFRQUy4gU3Vic3RpdHV0ZSB5b3VyIG9yZ2FuaXphdGlvbiBmb3IKKyAgIyBPUkdOQU1FIGluIHRoZSBVUkwgYW5kIHZhbGlkYXRpb24ga2V5LgorICAjCisgICMgSWYgeW91IGhhdmUgeW91ciBvd24gQ2hlZiBTZXJ2ZXIsIHVzZSB0aGUgYXBwcm9wcmlhdGUgVVJMLCB3aGljaCBtYXkgYmUKKyAgIyBIVFRQIGluc3RlYWQgb2YgSFRUUFMgZGVwZW5kaW5nIG9uIHlvdXIgY29uZmlndXJhdGlvbi4gQWxzbyBjaGFuZ2UgdGhlCisgICMgdmFsaWRhdGlvbiBrZXkgdG8gdmFsaWRhdGlvbi5wZW0uCisgICMKKyAgIyBjb25maWcudm0ucHJvdmlzaW9uICJjaGVmX2NsaWVudCIgZG8gfGNoZWZ8CisgICMgICBjaGVmLmNoZWZfc2VydmVyX3VybCA9ICJodHRwczovL2FwaS5vcHNjb2RlLmNvbS9vcmdhbml6YXRpb25zL09SR05BTUUiCisgICMgICBjaGVmLnZhbGlkYXRpb25fa2V5X3BhdGggPSAiT1JHTkFNRS12YWxpZGF0b3IucGVtIgorICAjIGVuZAorICAjCisgICMgSWYgeW91J3JlIHVzaW5nIHRoZSBPcHNjb2RlIHBsYXRmb3JtLCB5b3VyIHZhbGlkYXRvciBjbGllbnQgaXMKKyAgIyBPUkdOQU1FLXZhbGlkYXRvciwgcmVwbGFjaW5nIE9SR05BTUUgd2l0aCB5b3VyIG9yZ2FuaXphdGlvbiBuYW1lLgorICAjCisgICMgSWYgeW91IGhhdmUgeW91ciBvd24gQ2hlZiBTZXJ2ZXIsIHRoZSBkZWZhdWx0IHZhbGlkYXRpb24gY2xpZW50IG5hbWUgaXMKKyAgIyBjaGVmLXZhbGlkYXRvciwgdW5sZXNzIHlvdSBjaGFuZ2VkIHRoZSBjb25maWd1cmF0aW9uLgorICAjCisgICMgICBjaGVmLnZhbGlkYXRpb25fY2xpZW50X25hbWUgPSAiT1JHTkFNRS12YWxpZGF0b3IiCisKKyAgIyMjIyMgUnVuIHRoZSBBcGFjaGUgVGhyaWZ0IHByb3Zpc2lvbmluZyBzY3JpcHQgKGRlY2xhcmVkIGFib3ZlKQorICBjb25maWcudm0ucHJvdmlzaW9uIDpzaGVsbCwgOmlubGluZSA9PiAkYnVpbGRfYW5kX3Rlc3QKK2VuZApkaWZmIC0tZ2l0IGEvY29udHJpYi96ZXJvbXEvTWFrZWZpbGUgYi9jb250cmliL3plcm9tcS9NYWtlZmlsZQppbmRleCBhMWQ3MTU2Li5lZTM5OGUyIDEwMDY0NAotLS0gYS9jb250cmliL3plcm9tcS9NYWtlZmlsZQorKysgYi9jb250cmliL3plcm9tcS9NYWtlZmlsZQpAQCAtMSw2ICsxLDQgQEAKIFRIUklGVCA9IHRocmlmdAotQ1hYRkxBR1MgPSBgcGtnLWNvbmZpZyAtLWNmbGFncyBsaWJ6bXEgdGhyaWZ0YAotTERMSUJTID0gYHBrZy1jb25maWcgLS1saWJzIGxpYnptcSB0aHJpZnRgCiAKIENYWEZMQUdTICs9IC1nMyAtTzAKIApAQCAtMTYsMTUgKzE0LDE5IEBACiBhbGw6ICQoUFlMSUJTKSAkKFBST0dTKQogCiB0ZXN0LWNsaWVudDogdGVzdC1jbGllbnQubyBUWm1xQ2xpZW50Lm8gJChHRU5PQkpTKQorCSQoQ1hYKSAkXiAtbyAkQCAtbHptcSAtbHRocmlmdAogdGVzdC1zZXJ2ZXI6IHRlc3Qtc2VydmVyLm8gVFptcVNlcnZlci5vICQoR0VOT0JKUykKKwkkKENYWCkgJF4gLW8gJEAgLWx6bXEgLWx0aHJpZnQKIHRlc3Qtc2VuZGVyOiB0ZXN0LXNlbmRlci5vIFRabXFDbGllbnQubyAkKEdFTk9CSlMpCisJJChDWFgpICReIC1vICRAIC1sem1xIC1sdGhyaWZ0CiB0ZXN0LXJlY2VpdmVyOiB0ZXN0LXJlY2VpdmVyLm8gVFptcVNlcnZlci5vICQoR0VOT0JKUykKKwkkKENYWCkgJF4gLW8gJEAgLWx6bXEgLWx0aHJpZnQKIAogdGVzdC1jbGllbnQubyB0ZXN0LXNlcnZlci5vIHRlc3Qtc2VuZGVyLm8gdGVzdC1yZWNlaXZlci5vOiAkKEdFTlNSQ1MpCiAKIHN0b3JhZ2UvX19pbml0X18ucHk6IHN0b3JhZ2UudGhyaWZ0CiAJJChSTSkgJChkaXIgJEApCi0JJChUSFJJRlQpIC0tZ2VuIHB5Om5ld3N0eWxlICQ8CisJJChUSFJJRlQpIC0tZ2VuIHB5ICQ8CiAJbXYgZ2VuLXB5LyQoZGlyICRAKSAuCiAKICQoR0VOU1JDUyk6IHN0b3JhZ2UudGhyaWZ0CmRpZmYgLS1naXQgYS9jb250cmliL3plcm9tcS9UWm1xQ2xpZW50LmNwcCBiL2NvbnRyaWIvemVyb21xL1RabXFDbGllbnQuY3BwCmluZGV4IDEzMzIwNGUuLjU2Mjc4ZjMgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvemVyb21xL1RabXFDbGllbnQuY3BwCisrKyBiL2NvbnRyaWIvemVyb21xL1RabXFDbGllbnQuY3BwCkBAIC0yMiw3ICsyMiw3IEBACiAKIG5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHRyYW5zcG9ydCB7CiAKLXVpbnQzMl90IFRabXFDbGllbnQ6OnJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKK3VpbnQzMl90IFRabXFDbGllbnQ6OnJlYWRfdmlydCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewogICBpZiAocmJ1Zl8uYXZhaWxhYmxlX3JlYWQoKSA9PSAwKSB7CiAgICAgKHZvaWQpc29ja18ucmVjdigmbXNnXyk7CiAgICAgcmJ1Zl8ucmVzZXRCdWZmZXIoKHVpbnQ4X3QqKW1zZ18uZGF0YSgpLCBtc2dfLnNpemUoKSk7CkBAIC0zMCwxMSArMzAsMTEgQEAKICAgcmV0dXJuIHJidWZfLnJlYWQoYnVmLCBsZW4pOwogfQogCi12b2lkIFRabXFDbGllbnQ6OndyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7Cit2b2lkIFRabXFDbGllbnQ6OndyaXRlX3ZpcnQoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKICAgcmV0dXJuIHdidWZfLndyaXRlKGJ1ZiwgbGVuKTsKIH0KIAotdm9pZCBUWm1xQ2xpZW50Ojp3cml0ZUVuZCgpIHsKK3VpbnQzMl90IFRabXFDbGllbnQ6OndyaXRlRW5kKCkgewogICB1aW50OF90KiBidWY7CiAgIHVpbnQzMl90IHNpemU7CiAgIHdidWZfLmdldEJ1ZmZlcigmYnVmLCAmc2l6ZSk7CkBAIC00Miw2ICs0Miw3IEBACiAgIHN0ZDo6bWVtY3B5KG1zZy5kYXRhKCksIGJ1Ziwgc2l6ZSk7CiAgICh2b2lkKXNvY2tfLnNlbmQobXNnKTsKICAgd2J1Zl8ucmVzZXRCdWZmZXIodHJ1ZSk7CisgIHJldHVybiBzaXplOwogfQogCiB9fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydApkaWZmIC0tZ2l0IGEvY29udHJpYi96ZXJvbXEvVFptcUNsaWVudC5oIGIvY29udHJpYi96ZXJvbXEvVFptcUNsaWVudC5oCmluZGV4IDlmY2ZjMDYuLmRmMTZlMDMgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvemVyb21xL1RabXFDbGllbnQuaAorKysgYi9jb250cmliL3plcm9tcS9UWm1xQ2xpZW50LmgKQEAgLTQ1LDE1ICs0NSwxNSBAQAogICAgIH0KICAgfQogCi0gIHVpbnQzMl90IHJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOworICB1aW50MzJfdCByZWFkX3ZpcnQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOwogCi0gIHZvaWQgd3JpdGUoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOworICB2b2lkIHdyaXRlX3ZpcnQoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOwogCi0gIHZvaWQgd3JpdGVFbmQoKTsKKyAgdWludDMyX3Qgd3JpdGVFbmQoKTsKIAogIHByb3RlY3RlZDoKLSAgc3RkOjpzdHJpbmcgZW5kcG9pbnRfOwogICB6bXE6OnNvY2tldF90IHNvY2tfOworICBzdGQ6OnN0cmluZyBlbmRwb2ludF87CiAgIFRNZW1vcnlCdWZmZXIgd2J1Zl87CiAgIFRNZW1vcnlCdWZmZXIgcmJ1Zl87CiAgIHptcTo6bWVzc2FnZV90IG1zZ187CmRpZmYgLS1naXQgYS9jb250cmliL3plcm9tcS9UWm1xQ2xpZW50LnB5IGIvY29udHJpYi96ZXJvbXEvVFptcUNsaWVudC5weQppbmRleCBkNTYwNjk3Li4xYmQ2MGExIDEwMDY0NAotLS0gYS9jb250cmliL3plcm9tcS9UWm1xQ2xpZW50LnB5CisrKyBiL2NvbnRyaWIvemVyb21xL1RabXFDbGllbnQucHkKQEAgLTIwLDQ0ICsyMCw0NSBAQAogZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCiBmcm9tIHRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydEJhc2UsIENSZWFkYWJsZVRyYW5zcG9ydAogCisKIGNsYXNzIFRabXFDbGllbnQoVFRyYW5zcG9ydEJhc2UsIENSZWFkYWJsZVRyYW5zcG9ydCk6Ci0gIGRlZiBfX2luaXRfXyhzZWxmLCBjdHgsIGVuZHBvaW50LCBzb2NrX3R5cGUpOgotICAgIHNlbGYuX3NvY2sgPSBjdHguc29ja2V0KHNvY2tfdHlwZSkKLSAgICBzZWxmLl9lbmRwb2ludCA9IGVuZHBvaW50Ci0gICAgc2VsZi5fd2J1ZiA9IFN0cmluZ0lPKCkKLSAgICBzZWxmLl9yYnVmID0gU3RyaW5nSU8oKQorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjdHgsIGVuZHBvaW50LCBzb2NrX3R5cGUpOgorICAgICAgICBzZWxmLl9zb2NrID0gY3R4LnNvY2tldChzb2NrX3R5cGUpCisgICAgICAgIHNlbGYuX2VuZHBvaW50ID0gZW5kcG9pbnQKKyAgICAgICAgc2VsZi5fd2J1ZiA9IFN0cmluZ0lPKCkKKyAgICAgICAgc2VsZi5fcmJ1ZiA9IFN0cmluZ0lPKCkKIAotICBkZWYgb3BlbihzZWxmKToKLSAgICBzZWxmLl9zb2NrLmNvbm5lY3Qoc2VsZi5fZW5kcG9pbnQpCisgICAgZGVmIG9wZW4oc2VsZik6CisgICAgICAgIHNlbGYuX3NvY2suY29ubmVjdChzZWxmLl9lbmRwb2ludCkKIAotICBkZWYgcmVhZChzZWxmLCBzaXplKToKLSAgICByZXQgPSBzZWxmLl9yYnVmLnJlYWQoc2l6ZSkKLSAgICBpZiBsZW4ocmV0KSAhPSAwOgotICAgICAgcmV0dXJuIHJldAotICAgIHNlbGYuX3JlYWRfbWVzc2FnZSgpCi0gICAgcmV0dXJuIHNlbGYuX3JidWYucmVhZChzaXplKQorICAgIGRlZiByZWFkKHNlbGYsIHNpemUpOgorICAgICAgICByZXQgPSBzZWxmLl9yYnVmLnJlYWQoc2l6ZSkKKyAgICAgICAgaWYgbGVuKHJldCkgIT0gMDoKKyAgICAgICAgICAgIHJldHVybiByZXQKKyAgICAgICAgc2VsZi5fcmVhZF9tZXNzYWdlKCkKKyAgICAgICAgcmV0dXJuIHNlbGYuX3JidWYucmVhZChzaXplKQogCi0gIGRlZiBfcmVhZF9tZXNzYWdlKHNlbGYpOgotICAgIG1zZyA9IHNlbGYuX3NvY2sucmVjdigpCi0gICAgc2VsZi5fcmJ1ZiA9IFN0cmluZ0lPKG1zZykKKyAgICBkZWYgX3JlYWRfbWVzc2FnZShzZWxmKToKKyAgICAgICAgbXNnID0gc2VsZi5fc29jay5yZWN2KCkKKyAgICAgICAgc2VsZi5fcmJ1ZiA9IFN0cmluZ0lPKG1zZykKIAotICBkZWYgd3JpdGUoc2VsZiwgYnVmKToKLSAgICBzZWxmLl93YnVmLndyaXRlKGJ1ZikKKyAgICBkZWYgd3JpdGUoc2VsZiwgYnVmKToKKyAgICAgICAgc2VsZi5fd2J1Zi53cml0ZShidWYpCiAKLSAgZGVmIGZsdXNoKHNlbGYpOgotICAgIG1zZyA9IHNlbGYuX3didWYuZ2V0dmFsdWUoKQotICAgIHNlbGYuX3didWYgPSBTdHJpbmdJTygpCi0gICAgc2VsZi5fc29jay5zZW5kKG1zZykKKyAgICBkZWYgZmx1c2goc2VsZik6CisgICAgICAgIG1zZyA9IHNlbGYuX3didWYuZ2V0dmFsdWUoKQorICAgICAgICBzZWxmLl93YnVmID0gU3RyaW5nSU8oKQorICAgICAgICBzZWxmLl9zb2NrLnNlbmQobXNnKQogCi0gICMgSW1wbGVtZW50IHRoZSBDUmVhZGFibGVUcmFuc3BvcnQgaW50ZXJmYWNlLgotICBAcHJvcGVydHkKLSAgZGVmIGNzdHJpbmdpb19idWYoc2VsZik6Ci0gICAgcmV0dXJuIHNlbGYuX3JidWYKKyAgICAjIEltcGxlbWVudCB0aGUgQ1JlYWRhYmxlVHJhbnNwb3J0IGludGVyZmFjZS4KKyAgICBAcHJvcGVydHkKKyAgICBkZWYgY3N0cmluZ2lvX2J1ZihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3JidWYKIAotICAjIE5PVEU6IFRoaXMgd2lsbCBwcm9iYWJseSBub3QgYWN0dWFsbHkgd29yay4KLSAgZGVmIGNzdHJpbmdpb19yZWZpbGwoc2VsZiwgcHJlZml4LCByZXFsZW4pOgotICAgIHdoaWxlIGxlbihwcmVmaXgpIDwgcmVxbGVuOgotICAgICAgc2VsZi5yZWFkX21lc3NhZ2UoKQotICAgICAgcHJlZml4ICs9IHNlbGYuX3JidWYuZ2V0dmFsdWUoKQotICAgIHNlbGYuX3JidWYgPSBTdHJpbmdJTyhwcmVmaXgpCi0gICAgcmV0dXJuIHNlbGYuX3JidWYKKyAgICAjIE5PVEU6IFRoaXMgd2lsbCBwcm9iYWJseSBub3QgYWN0dWFsbHkgd29yay4KKyAgICBkZWYgY3N0cmluZ2lvX3JlZmlsbChzZWxmLCBwcmVmaXgsIHJlcWxlbik6CisgICAgICAgIHdoaWxlIGxlbihwcmVmaXgpIDwgcmVxbGVuOgorICAgICAgICAgICAgc2VsZi5yZWFkX21lc3NhZ2UoKQorICAgICAgICAgICAgcHJlZml4ICs9IHNlbGYuX3JidWYuZ2V0dmFsdWUoKQorICAgICAgICBzZWxmLl9yYnVmID0gU3RyaW5nSU8ocHJlZml4KQorICAgICAgICByZXR1cm4gc2VsZi5fcmJ1ZgpkaWZmIC0tZ2l0IGEvY29udHJpYi96ZXJvbXEvVFptcVNlcnZlci5jcHAgYi9jb250cmliL3plcm9tcS9UWm1xU2VydmVyLmNwcAppbmRleCBmMjU1YTY2Li44ODY2MGEzIDEwMDY0NAotLS0gYS9jb250cmliL3plcm9tcS9UWm1xU2VydmVyLmNwcAorKysgYi9jb250cmliL3plcm9tcS9UWm1xU2VydmVyLmNwcApAQCAtMjEsMTMgKzIxLDEyIEBACiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgogI2luY2x1ZGUgPGJvb3N0L3Njb3BlZF9wdHIuaHBwPgogCi11c2luZyBib29zdDo6c2hhcmVkX3B0cjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0OjpzdGQ6OnNoYXJlZF9wdHI7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyOwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w7CiAKIG5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHNlcnZlciB7CiAKLQogYm9vbCBUWm1xU2VydmVyOjpzZXJ2ZU9uZShpbnQgcmVjdl9mbGFncykgewogICB6bXE6Om1lc3NhZ2VfdCBtc2c7CiAgIGJvb2wgcmVjZWl2ZWQgPSBzb2NrXy5yZWN2KCZtc2csIHJlY3ZfZmxhZ3MpOwpAQCAtNDAsOCArMzksOSBAQAogICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnlfLT5nZXRQcm90b2NvbChpbnB1dFRyYW5zcG9ydCkpOwogICBzaGFyZWRfcHRyPFRQcm90b2NvbD4gb3V0cHV0UHJvdG9jb2woCiAgICAgICBvdXRwdXRQcm90b2NvbEZhY3RvcnlfLT5nZXRQcm90b2NvbChvdXRwdXRUcmFuc3BvcnQpKTsKKyAgc2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiB0cmFuc3BvcnQobmV3IFRNZW1vcnlCdWZmZXIpOwogCi0gIHByb2Nlc3Nvcl8tPnByb2Nlc3MoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpOworICBwcm9jZXNzb3JfLT5wcm9jZXNzKGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sLCBOVUxMKTsKIAogICBpZiAoem1xX3R5cGVfID09IFpNUV9SRVApIHsKICAgICB1aW50OF90KiBidWY7CmRpZmYgLS1naXQgYS9jb250cmliL3plcm9tcS9UWm1xU2VydmVyLmggYi9jb250cmliL3plcm9tcS9UWm1xU2VydmVyLmgKaW5kZXggZjkxYzZlOC4uZWNkMTNiNCAxMDA2NDQKLS0tIGEvY29udHJpYi96ZXJvbXEvVFptcVNlcnZlci5oCisrKyBiL2NvbnRyaWIvemVyb21xL1RabXFTZXJ2ZXIuaApAQCAtMjAsNiArMjAsNyBAQAogI2lmbmRlZiBfVEhSSUZUX1NFUlZFUl9UWk1RU0VSVkVSX0hfCiAjZGVmaW5lIF9USFJJRlRfU0VSVkVSX1RaTVFTRVJWRVJfSF8gMQogCisjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHptcS5ocHA+CiAjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UU2VydmVyLmg+CiAKQEAgLTI4LDkgKzI5LDEwIEBACiBjbGFzcyBUWm1xU2VydmVyIDogcHVibGljIFRTZXJ2ZXIgewogIHB1YmxpYzoKICAgVFptcVNlcnZlcigKLSAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvciwKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IsCiAgICAgICB6bXE6OmNvbnRleHRfdCYgY3R4LCBjb25zdCBzdGQ6OnN0cmluZyYgZW5kcG9pbnQsIGludCB0eXBlKQogICAgIDogVFNlcnZlcihwcm9jZXNzb3IpCisgICAgLCBwcm9jZXNzb3JfKHByb2Nlc3NvcikKICAgICAsIHptcV90eXBlXyh0eXBlKQogICAgICwgc29ja18oY3R4LCB0eXBlKQogICB7CkBAIC01NSw2ICs1Nyw3IEBACiAgIH0KIAogIHByaXZhdGU6CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3JfOwogICBpbnQgem1xX3R5cGVfOwogICB6bXE6OnNvY2tldF90IHNvY2tfOwogfTsKZGlmZiAtLWdpdCBhL2NvbnRyaWIvemVyb21xL1RabXFTZXJ2ZXIucHkgYi9jb250cmliL3plcm9tcS9UWm1xU2VydmVyLnB5CmluZGV4IGM4M2NjOGQuLjE1YzE1NDMgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvemVyb21xL1RabXFTZXJ2ZXIucHkKKysrIGIvY29udHJpYi96ZXJvbXEvVFptcVNlcnZlci5weQpAQCAtMjEsNTggKzIxLDU5IEBACiBpbXBvcnQgdGhyaWZ0LnNlcnZlci5UU2VydmVyCiBpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0CiAKKwogY2xhc3MgVFptcVNlcnZlcih0aHJpZnQuc2VydmVyLlRTZXJ2ZXIuVFNlcnZlcik6Ci0gIGRlZiBfX2luaXRfXyhzZWxmLCBwcm9jZXNzb3IsIGN0eCwgZW5kcG9pbnQsIHNvY2tfdHlwZSk6Ci0gICAgdGhyaWZ0LnNlcnZlci5UU2VydmVyLlRTZXJ2ZXIuX19pbml0X18oc2VsZiwgcHJvY2Vzc29yLCBOb25lKQotICAgIHNlbGYuem1xX3R5cGUgPSBzb2NrX3R5cGUKLSAgICBzZWxmLnNvY2tldCA9IGN0eC5zb2NrZXQoc29ja190eXBlKQotICAgIHNlbGYuc29ja2V0LmJpbmQoZW5kcG9pbnQpCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHByb2Nlc3NvciwgY3R4LCBlbmRwb2ludCwgc29ja190eXBlKToKKyAgICAgICAgdGhyaWZ0LnNlcnZlci5UU2VydmVyLlRTZXJ2ZXIuX19pbml0X18oc2VsZiwgcHJvY2Vzc29yLCBOb25lKQorICAgICAgICBzZWxmLnptcV90eXBlID0gc29ja190eXBlCisgICAgICAgIHNlbGYuc29ja2V0ID0gY3R4LnNvY2tldChzb2NrX3R5cGUpCisgICAgICAgIHNlbGYuc29ja2V0LmJpbmQoZW5kcG9pbnQpCiAKLSAgZGVmIHNlcnZlT25lKHNlbGYpOgotICAgIG1zZyA9IHNlbGYuc29ja2V0LnJlY3YoKQotICAgIGl0cmFucyA9IHRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKG1zZykKLSAgICBvdHJhbnMgPSB0aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcigpCi0gICAgaXByb3QgPSBzZWxmLmlucHV0UHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKGl0cmFucykKLSAgICBvcHJvdCA9IHNlbGYub3V0cHV0UHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKG90cmFucykKKyAgICBkZWYgc2VydmVPbmUoc2VsZik6CisgICAgICAgIG1zZyA9IHNlbGYuc29ja2V0LnJlY3YoKQorICAgICAgICBpdHJhbnMgPSB0aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcihtc2cpCisgICAgICAgIG90cmFucyA9IHRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKCkKKyAgICAgICAgaXByb3QgPSBzZWxmLmlucHV0UHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKGl0cmFucykKKyAgICAgICAgb3Byb3QgPSBzZWxmLm91dHB1dFByb3RvY29sRmFjdG9yeS5nZXRQcm90b2NvbChvdHJhbnMpCiAKLSAgICB0cnk6Ci0gICAgICBzZWxmLnByb2Nlc3Nvci5wcm9jZXNzKGlwcm90LCBvcHJvdCkKLSAgICBleGNlcHQgRXhjZXB0aW9uOgotICAgICAgbG9nZ2luZy5leGNlcHRpb24oIkV4Y2VwdGlvbiB3aGlsZSBwcm9jZXNzaW5nIHJlcXVlc3QiKQotICAgICAgIyBGYWxsIHRocm91Z2ggYW5kIHNlbmQgYmFjayBhIHJlc3BvbnNlLCBldmVuIGlmIGVtcHR5IG9yIGluY29tcGxldGUuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYucHJvY2Vzc29yLnByb2Nlc3MoaXByb3QsIG9wcm90KQorICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICAgICAgbG9nZ2luZy5leGNlcHRpb24oIkV4Y2VwdGlvbiB3aGlsZSBwcm9jZXNzaW5nIHJlcXVlc3QiKQorICAgICAgICAgICAgIyBGYWxsIHRocm91Z2ggYW5kIHNlbmQgYmFjayBhIHJlc3BvbnNlLCBldmVuIGlmIGVtcHR5IG9yIGluY29tcGxldGUuCiAKLSAgICBpZiBzZWxmLnptcV90eXBlID09IHptcS5SRVA6Ci0gICAgICBtc2cgPSBvdHJhbnMuZ2V0dmFsdWUoKQotICAgICAgc2VsZi5zb2NrZXQuc2VuZChtc2cpCisgICAgICAgIGlmIHNlbGYuem1xX3R5cGUgPT0gem1xLlJFUDoKKyAgICAgICAgICAgIG1zZyA9IG90cmFucy5nZXR2YWx1ZSgpCisgICAgICAgICAgICBzZWxmLnNvY2tldC5zZW5kKG1zZykKIAotICBkZWYgc2VydmUoc2VsZik6Ci0gICAgd2hpbGUgVHJ1ZToKLSAgICAgIHNlbGYuc2VydmVPbmUoKQorICAgIGRlZiBzZXJ2ZShzZWxmKToKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIHNlbGYuc2VydmVPbmUoKQogCiAKIGNsYXNzIFRabXFNdWx0aVNlcnZlcihvYmplY3QpOgotICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgc2VsZi5zZXJ2ZXJzID0gW10KKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuc2VydmVycyA9IFtdCiAKLSAgZGVmIHNlcnZlT25lKHNlbGYsIHRpbWVvdXQgPSAtMSk6Ci0gICAgc2VsZi5fc2VydmVBY3RpdmUoc2VsZi5fc2V0dXBQb2xsKCksIHRpbWVvdXQpCisgICAgZGVmIHNlcnZlT25lKHNlbGYsIHRpbWVvdXQ9LTEpOgorICAgICAgICBzZWxmLl9zZXJ2ZUFjdGl2ZShzZWxmLl9zZXR1cFBvbGwoKSwgdGltZW91dCkKIAotICBkZWYgc2VydmVGb3JldmVyKHNlbGYpOgotICAgIHBvbGxfaW5mbyA9IHNlbGYuX3NldHVwUG9sbCgpCi0gICAgd2hpbGUgVHJ1ZToKLSAgICAgIHNlbGYuX3NlcnZlQWN0aXZlKHBvbGxfaW5mbywgLTEpCisgICAgZGVmIHNlcnZlRm9yZXZlcihzZWxmKToKKyAgICAgICAgcG9sbF9pbmZvID0gc2VsZi5fc2V0dXBQb2xsKCkKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIHNlbGYuX3NlcnZlQWN0aXZlKHBvbGxfaW5mbywgLTEpCiAKLSAgZGVmIF9zZXR1cFBvbGwoc2VsZik6Ci0gICAgc2VydmVyX21hcCA9IHt9Ci0gICAgcG9sbGVyID0gem1xLlBvbGxlcigpCi0gICAgZm9yIHNlcnZlciBpbiBzZWxmLnNlcnZlcnM6Ci0gICAgICBzZXJ2ZXJfbWFwW3NlcnZlci5zb2NrZXRdID0gc2VydmVyCi0gICAgICBwb2xsZXIucmVnaXN0ZXIoc2VydmVyLnNvY2tldCwgem1xLlBPTExJTikKLSAgICByZXR1cm4gKHNlcnZlcl9tYXAsIHBvbGxlcikKKyAgICBkZWYgX3NldHVwUG9sbChzZWxmKToKKyAgICAgICAgc2VydmVyX21hcCA9IHt9CisgICAgICAgIHBvbGxlciA9IHptcS5Qb2xsZXIoKQorICAgICAgICBmb3Igc2VydmVyIGluIHNlbGYuc2VydmVyczoKKyAgICAgICAgICAgIHNlcnZlcl9tYXBbc2VydmVyLnNvY2tldF0gPSBzZXJ2ZXIKKyAgICAgICAgICAgIHBvbGxlci5yZWdpc3RlcihzZXJ2ZXIuc29ja2V0LCB6bXEuUE9MTElOKQorICAgICAgICByZXR1cm4gKHNlcnZlcl9tYXAsIHBvbGxlcikKIAotICBkZWYgX3NlcnZlQWN0aXZlKHNlbGYsIHBvbGxfaW5mbywgdGltZW91dCk6Ci0gICAgKHNlcnZlcl9tYXAsIHBvbGxlcikgPSBwb2xsX2luZm8KLSAgICByZWFkeSA9IGRpY3QocG9sbGVyLnBvbGwoKSkKLSAgICBmb3Igc29jaywgc3RhdGUgaW4gcmVhZHkuaXRlbXMoKToKLSAgICAgIGFzc2VydCAoc3RhdGUgJiB6bXEuUE9MTElOKSAhPSAwCi0gICAgICBzZXJ2ZXJfbWFwW3NvY2tdLnNlcnZlT25lKCkKKyAgICBkZWYgX3NlcnZlQWN0aXZlKHNlbGYsIHBvbGxfaW5mbywgdGltZW91dCk6CisgICAgICAgIChzZXJ2ZXJfbWFwLCBwb2xsZXIpID0gcG9sbF9pbmZvCisgICAgICAgIHJlYWR5ID0gZGljdChwb2xsZXIucG9sbCgpKQorICAgICAgICBmb3Igc29jaywgc3RhdGUgaW4gcmVhZHkuaXRlbXMoKToKKyAgICAgICAgICAgIGFzc2VydCAoc3RhdGUgJiB6bXEuUE9MTElOKSAhPSAwCisgICAgICAgICAgICBzZXJ2ZXJfbWFwW3NvY2tdLnNlcnZlT25lKCkKZGlmZiAtLWdpdCBhL2NvbnRyaWIvemVyb21xL2NzaGFycC9Bc3NlbWJseUluZm8uY3MgYi9jb250cmliL3plcm9tcS9jc2hhcnAvQXNzZW1ibHlJbmZvLmNzCmluZGV4IDlhZDQ4YzYuLjEyY2Q0MzQgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvemVyb21xL2NzaGFycC9Bc3NlbWJseUluZm8uY3MKKysrIGIvY29udHJpYi96ZXJvbXEvY3NoYXJwL0Fzc2VtYmx5SW5mby5jcwpAQCAtMTQsMjAgKzE0LDIwIEBACiAgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKICAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCiAgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLwogCiB1c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsKIHVzaW5nIFN5c3RlbS5SdW50aW1lLkNvbXBpbGVyU2VydmljZXM7CiAKLS8vIEluZm9ybWF0aW9uIGFib3V0IHRoaXMgYXNzZW1ibHkgaXMgZGVmaW5lZCBieSB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMuIAorLy8gSW5mb3JtYXRpb24gYWJvdXQgdGhpcyBhc3NlbWJseSBpcyBkZWZpbmVkIGJ5IHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcy4KIC8vIENoYW5nZSB0aGVtIHRvIHRoZSB2YWx1ZXMgc3BlY2lmaWMgdG8geW91ciBwcm9qZWN0LgogCiBbYXNzZW1ibHk6IEFzc2VtYmx5VGl0bGUoIlptcVNlcnZlciIpXQogW2Fzc2VtYmx5OiBBc3NlbWJseURlc2NyaXB0aW9uKCJabXEgRXhhbXBsZXMiKV0KLVthc3NlbWJseTogQXNzZW1ibHlDb25maWd1cmF0aW9uKCIiKV0NCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29uZmlndXJhdGlvbigiIildCiBbYXNzZW1ibHk6IEFzc2VtYmx5Q29tcGFueSgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5UHJvZHVjdCgiIildDQorW2Fzc2VtYmx5OiBBc3NlbWJseVByb2R1Y3QoIiIpXQogW2Fzc2VtYmx5OiBBc3NlbWJseUNvcHlyaWdodCgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCiBbYXNzZW1ibHk6IEFzc2VtYmx5VHJhZGVtYXJrKCIiKV0KIFthc3NlbWJseTogQXNzZW1ibHlDdWx0dXJlKCIiKV0KQEAgLTM4LDcgKzM4LDcgQEAKIAogW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjEuMC4qIildCiAKLS8vIFRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhcmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBzaWduaW5nIGtleSBmb3IgdGhlIGFzc2VtYmx5LCAKKy8vIFRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhcmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBzaWduaW5nIGtleSBmb3IgdGhlIGFzc2VtYmx5LAogLy8gaWYgZGVzaXJlZC4gU2VlIHRoZSBNb25vIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgc2lnbmluZy4KIAogLy9bYXNzZW1ibHk6IEFzc2VtYmx5RGVsYXlTaWduKGZhbHNlKV0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvemVyb21xL2NzaGFycC9UWm1xQ2xpZW50LmNzIGIvY29udHJpYi96ZXJvbXEvY3NoYXJwL1RabXFDbGllbnQuY3MKaW5kZXggYzc5Mjg4Mi4uZTlhYjUxNiAxMDA2NDQKLS0tIGEvY29udHJpYi96ZXJvbXEvY3NoYXJwL1RabXFDbGllbnQuY3MKKysrIGIvY29udHJpYi96ZXJvbXEvY3NoYXJwL1RabXFDbGllbnQuY3MKQEAgLTQ3LDcgKzQ3LDcgQEAKIAkJCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24gKCk7CiAKIAkJCWlmIChfcmJ1Zi5MZW5ndGggPT0gMCkgewotCQkJCS8vRmlsbCB0aGUgQnVmZmVyIHdpdGggdGhlIGNvbXBsZXRlIFpNUSBNZXNzYWdlIHdoaWNoIG5lZWRzIHRvIGJlKD8hKSB0aGUgY29tcGxldGUgVGhyaWZ0IHJlcG9uc2UKKwkJCQkvL0ZpbGwgdGhlIEJ1ZmZlciB3aXRoIHRoZSBjb21wbGV0ZSBaTVEgTWVzc2FnZSB3aGljaCBuZWVkcyB0byBiZSg/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++7vworTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gU29sdXRpb24gRmlsZSwgRm9ybWF0IFZlcnNpb24gMTEuMDAKKyMgVmlzdWFsIFN0dWRpbyAyMDEwCitQcm9qZWN0KCJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSIpID0gIlRocmlmdFpNUSIsICJUaHJpZnRaTVEuY3Nwcm9qIiwgInsxN0M2M0I5MC1ERkQ3LTQyQUMtQTdCMC03NDlFNjg3NkMwQTF9IgorRW5kUHJvamVjdAorUHJvamVjdCgie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iKSA9ICJUaHJpZnQiLCAiLi5cLi5cLi5cbGliXGNzaGFycFxzcmNcVGhyaWZ0LmNzcHJvaiIsICJ7NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfSIKK0VuZFByb2plY3QKK0dsb2JhbAorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Db25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHByZVNvbHV0aW9uCisJCURlYnVnfEFueSBDUFUgPSBEZWJ1Z3xBbnkgQ1BVCisJCURlYnVnfE1peGVkIFBsYXRmb3JtcyA9IERlYnVnfE1peGVkIFBsYXRmb3JtcworCQlEZWJ1Z3x4ODYgPSBEZWJ1Z3x4ODYKKwkJUmVsZWFzZXxBbnkgQ1BVID0gUmVsZWFzZXxBbnkgQ1BVCisJCVJlbGVhc2V8TWl4ZWQgUGxhdGZvcm1zID0gUmVsZWFzZXxNaXhlZCBQbGF0Zm9ybXMKKwkJUmVsZWFzZXx4ODYgPSBSZWxlYXNlfHg4NgorCUVuZEdsb2JhbFNlY3Rpb24KKwlHbG9iYWxTZWN0aW9uKFByb2plY3RDb25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHBvc3RTb2x1dGlvbgorCQl7MTdDNjNCOTAtREZENy00MkFDLUE3QjAtNzQ5RTY4NzZDMEExfS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfHg4NgorCQl7MTdDNjNCOTAtREZENy00MkFDLUE3QjAtNzQ5RTY4NzZDMEExfS5EZWJ1Z3xNaXhlZCBQbGF0Zm9ybXMuQWN0aXZlQ2ZnID0gRGVidWd8eDg2CisJCXsxN0M2M0I5MC1ERkQ3LTQyQUMtQTdCMC03NDlFNjg3NkMwQTF9LkRlYnVnfE1peGVkIFBsYXRmb3Jtcy5CdWlsZC4wID0gRGVidWd8eDg2CisJCXsxN0M2M0I5MC1ERkQ3LTQyQUMtQTdCMC03NDlFNjg3NkMwQTF9LkRlYnVnfHg4Ni5BY3RpdmVDZmcgPSBEZWJ1Z3x4ODYKKwkJezE3QzYzQjkwLURGRDctNDJBQy1BN0IwLTc0OUU2ODc2QzBBMX0uRGVidWd8eDg2LkJ1aWxkLjAgPSBEZWJ1Z3x4ODYKKwkJezE3QzYzQjkwLURGRDctNDJBQy1BN0IwLTc0OUU2ODc2QzBBMX0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8eDg2CisJCXsxN0M2M0I5MC1ERkQ3LTQyQUMtQTdCMC03NDlFNjg3NkMwQTF9LlJlbGVhc2V8TWl4ZWQgUGxhdGZvcm1zLkFjdGl2ZUNmZyA9IFJlbGVhc2V8eDg2CisJCXsxN0M2M0I5MC1ERkQ3LTQyQUMtQTdCMC03NDlFNjg3NkMwQTF9LlJlbGVhc2V8TWl4ZWQgUGxhdGZvcm1zLkJ1aWxkLjAgPSBSZWxlYXNlfHg4NgorCQl7MTdDNjNCOTAtREZENy00MkFDLUE3QjAtNzQ5RTY4NzZDMEExfS5SZWxlYXNlfHg4Ni5BY3RpdmVDZmcgPSBSZWxlYXNlfHg4NgorCQl7MTdDNjNCOTAtREZENy00MkFDLUE3QjAtNzQ5RTY4NzZDMEExfS5SZWxlYXNlfHg4Ni5CdWlsZC4wID0gUmVsZWFzZXx4ODYKKwkJezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXs0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH0uRGVidWd8TWl4ZWQgUGxhdGZvcm1zLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH0uRGVidWd8TWl4ZWQgUGxhdGZvcm1zLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXs0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9LkRlYnVnfHg4Ni5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXs0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH0uUmVsZWFzZXxNaXhlZCBQbGF0Zm9ybXMuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXs0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9LlJlbGVhc2V8TWl4ZWQgUGxhdGZvcm1zLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH0uUmVsZWFzZXx4ODYuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJRW5kR2xvYmFsU2VjdGlvbgorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Qcm9wZXJ0aWVzKSA9IHByZVNvbHV0aW9uCisJCUhpZGVTb2x1dGlvbk5vZGUgPSBGQUxTRQorCUVuZEdsb2JhbFNlY3Rpb24KK0VuZEdsb2JhbApkaWZmIC0tZ2l0IGEvY29udHJpYi96ZXJvbXEvdGVzdC1jbGllbnQuY3BwIGIvY29udHJpYi96ZXJvbXEvdGVzdC1jbGllbnQuY3BwCmluZGV4IGQyZmM1NmMuLjE1OWMyNTAgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvemVyb21xL3Rlc3QtY2xpZW50LmNwcAorKysgYi9jb250cmliL3plcm9tcS90ZXN0LWNsaWVudC5jcHAKQEAgLTYsNyArNiw3IEBACiAjaW5jbHVkZSAiVFptcUNsaWVudC5oIgogI2luY2x1ZGUgIlN0b3JhZ2UuaCIKIAotdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6c3RkOjpzaGFyZWRfcHRyOwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFptcUNsaWVudDsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VEJpbmFyeVByb3RvY29sOwogCkBAIC0xNyw3ICsxNyw3IEBACiAgIGlmIChhcmdjID4gMSkgewogICAgIGluY3IgPSBhdG9pKGFyZ3ZbMV0pOwogICAgIGlmIChpbmNyKSB7Ci0gICAgICBzb2NrdHlwZSA9IFpNUV9ET1dOU1RSRUFNOworICAgICAgc29ja3R5cGUgPSBaTVFfUFVTSDsKICAgICAgIGVuZHBvaW50ID0gInRjcDovLzEyNy4wLjAuMTo5MDkxIjsKICAgICB9CiAgIH0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvemVyb21xL3Rlc3QtY2xpZW50LnB5IGIvY29udHJpYi96ZXJvbXEvdGVzdC1jbGllbnQucHkKaW5kZXggMTg4NmQ5Yy4uZDUxMjE2ZSAxMDA3NTUKLS0tIGEvY29udHJpYi96ZXJvbXEvdGVzdC1jbGllbnQucHkKKysrIGIvY29udHJpYi96ZXJvbXEvdGVzdC1jbGllbnQucHkKQEAgLTksMjggKzksMjggQEAKIAogCiBkZWYgbWFpbihhcmdzKToKLSAgZW5kcG9pbnQgPSAidGNwOi8vMTI3LjAuMC4xOjkwOTAiCi0gIHNvY2t0eXBlID0gem1xLlJFUQotICBpbmNyID0gMAotICBpZiBsZW4oYXJncykgPiAxOgotICAgIGluY3IgPSBpbnQoYXJnc1sxXSkKKyAgICBlbmRwb2ludCA9ICJ0Y3A6Ly8xMjcuMC4wLjE6OTA5MCIKKyAgICBzb2NrdHlwZSA9IHptcS5SRVEKKyAgICBpbmNyID0gMAorICAgIGlmIGxlbihhcmdzKSA+IDE6CisgICAgICAgIGluY3IgPSBpbnQoYXJnc1sxXSkKKyAgICAgICAgaWYgaW5jcjoKKyAgICAgICAgICAgIHNvY2t0eXBlID0gem1xLlBVU0gKKyAgICAgICAgICAgIGVuZHBvaW50ID0gInRjcDovLzEyNy4wLjAuMTo5MDkxIgorCisgICAgY3R4ID0gem1xLkNvbnRleHQoKQorICAgIHRyYW5zcG9ydCA9IFRabXFDbGllbnQuVFptcUNsaWVudChjdHgsIGVuZHBvaW50LCBzb2NrdHlwZSkKKyAgICBwcm90b2NvbCA9IHRocmlmdC5wcm90b2NvbC5UQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQodHJhbnNwb3J0KQorICAgIGNsaWVudCA9IHN0b3JhZ2UuU3RvcmFnZS5DbGllbnQocHJvdG9jb2wpCisgICAgdHJhbnNwb3J0Lm9wZW4oKQorCiAgICAgaWYgaW5jcjoKLSAgICAgIHNvY2t0eXBlID0gem1xLkRPV05TVFJFQU0KLSAgICAgIGVuZHBvaW50ID0gInRjcDovLzEyNy4wLjAuMTo5MDkxIgotCi0gIGN0eCA9IHptcS5Db250ZXh0KCkKLSAgdHJhbnNwb3J0ID0gVFptcUNsaWVudC5UWm1xQ2xpZW50KGN0eCwgZW5kcG9pbnQsIHNvY2t0eXBlKQotICBwcm90b2NvbCA9IHRocmlmdC5wcm90b2NvbC5UQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQodHJhbnNwb3J0KQotICBjbGllbnQgPSBzdG9yYWdlLlN0b3JhZ2UuQ2xpZW50KHByb3RvY29sKQotICB0cmFuc3BvcnQub3BlbigpCi0KLSAgaWYgaW5jcjoKLSAgICBjbGllbnQuaW5jcihpbmNyKQotICAgIHRpbWUuc2xlZXAoMC4wNSkKLSAgZWxzZToKLSAgICB2YWx1ZSA9IGNsaWVudC5nZXQoKQotICAgIHByaW50IHZhbHVlCisgICAgICAgIGNsaWVudC5pbmNyKGluY3IpCisgICAgICAgIHRpbWUuc2xlZXAoMC4wNSkKKyAgICBlbHNlOgorICAgICAgICB2YWx1ZSA9IGNsaWVudC5nZXQoKQorICAgICAgICBwcmludCh2YWx1ZSkKIAogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgotICBtYWluKHN5cy5hcmd2KQorICAgIG1haW4oc3lzLmFyZ3YpCmRpZmYgLS1naXQgYS9jb250cmliL3plcm9tcS90ZXN0LXJlY2VpdmVyLmNwcCBiL2NvbnRyaWIvemVyb21xL3Rlc3QtcmVjZWl2ZXIuY3BwCmluZGV4IDhmZTY5ZGEuLmQ0NjViZmYgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvemVyb21xL3Rlc3QtcmVjZWl2ZXIuY3BwCisrKyBiL2NvbnRyaWIvemVyb21xL3Rlc3QtcmVjZWl2ZXIuY3BwCkBAIC0yLDcgKzIsNyBAQAogI2luY2x1ZGUgIlRabXFTZXJ2ZXIuaCIKICNpbmNsdWRlICJTdG9yYWdlLmgiCiAKLXVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnN0ZDo6c2hhcmVkX3B0cjsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yOwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcjo6VFptcVNlcnZlcjsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXI6OlRabXFNdWx0aVNlcnZlcjsKZGlmZiAtLWdpdCBhL2NvbnRyaWIvemVyb21xL3Rlc3Qtc2VuZGVyLmNwcCBiL2NvbnRyaWIvemVyb21xL3Rlc3Qtc2VuZGVyLmNwcAppbmRleCA2YjBlZWYxLi41YzA4NmExIDEwMDY0NAotLS0gYS9jb250cmliL3plcm9tcS90ZXN0LXNlbmRlci5jcHAKKysrIGIvY29udHJpYi96ZXJvbXEvdGVzdC1zZW5kZXIuY3BwCkBAIC02LDcgKzYsNyBAQAogI2luY2x1ZGUgIlRabXFDbGllbnQuaCIKICNpbmNsdWRlICJTdG9yYWdlLmgiCiAKLXVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnN0ZDo6c2hhcmVkX3B0cjsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRabXFDbGllbnQ7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRCaW5hcnlQcm90b2NvbDsKIApkaWZmIC0tZ2l0IGEvY29udHJpYi96ZXJvbXEvdGVzdC1zZXJ2ZXIuY3BwIGIvY29udHJpYi96ZXJvbXEvdGVzdC1zZXJ2ZXIuY3BwCmluZGV4IGM2MjRiMGQuLmU2ZjFiMjAgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvemVyb21xL3Rlc3Qtc2VydmVyLmNwcAorKysgYi9jb250cmliL3plcm9tcS90ZXN0LXNlcnZlci5jcHAKQEAgLTIsNyArMiw3IEBACiAjaW5jbHVkZSAiVFptcVNlcnZlci5oIgogI2luY2x1ZGUgIlN0b3JhZ2UuaCIKIAotdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6c3RkOjpzaGFyZWRfcHRyOwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3I7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6c2VydmVyOjpUWm1xU2VydmVyOwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcjo6VFptcU11bHRpU2VydmVyOwpAQCAtMzMsNyArMzMsNyBAQAogCiAgIHptcTo6Y29udGV4dF90IGN0eCgxKTsKICAgVFptcVNlcnZlciByZXFyZXBfc2VydmVyKHByb2Nlc3NvciwgY3R4LCAidGNwOi8vMC4wLjAuMDo5MDkwIiwgWk1RX1JFUCk7Ci0gIFRabXFTZXJ2ZXIgb25ld2F5X3NlcnZlcihwcm9jZXNzb3IsIGN0eCwgInRjcDovLzAuMC4wLjA6OTA5MSIsIFpNUV9VUFNUUkVBTSk7CisgIFRabXFTZXJ2ZXIgb25ld2F5X3NlcnZlcihwcm9jZXNzb3IsIGN0eCwgInRjcDovLzAuMC4wLjA6OTA5MSIsIFpNUV9QVUxMKTsKICAgVFptcU11bHRpU2VydmVyIG11bHRpc2VydmVyOwogICBtdWx0aXNlcnZlci5zZXJ2ZXJzKCkucHVzaF9iYWNrKCZyZXFyZXBfc2VydmVyKTsKICAgbXVsdGlzZXJ2ZXIuc2VydmVycygpLnB1c2hfYmFjaygmb25ld2F5X3NlcnZlcik7CmRpZmYgLS1naXQgYS9jb250cmliL3plcm9tcS90ZXN0LXNlcnZlci5weSBiL2NvbnRyaWIvemVyb21xL3Rlc3Qtc2VydmVyLnB5CmluZGV4IDU3NjdiNzEuLmQ4OWIzN2IgMTAwNzU1Ci0tLSBhL2NvbnRyaWIvemVyb21xL3Rlc3Qtc2VydmVyLnB5CisrKyBiL2NvbnRyaWIvemVyb21xL3Rlc3Qtc2VydmVyLnB5CkBAIC02LDI4ICs2LDI4IEBACiAKIAogY2xhc3MgU3RvcmFnZUhhbmRsZXIoc3RvcmFnZS5TdG9yYWdlLklmYWNlKToKLSAgZGVmIF9faW5pdF9fKHNlbGYpOgotICAgIHNlbGYudmFsdWUgPSAwCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLnZhbHVlID0gMAogCi0gIGRlZiBpbmNyKHNlbGYsIGFtb3VudCk6Ci0gICAgc2VsZi52YWx1ZSArPSBhbW91bnQKKyAgICBkZWYgaW5jcihzZWxmLCBhbW91bnQpOgorICAgICAgICBzZWxmLnZhbHVlICs9IGFtb3VudAogCi0gIGRlZiBnZXQoc2VsZik6Ci0gICAgcmV0dXJuIHNlbGYudmFsdWUKKyAgICBkZWYgZ2V0KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi52YWx1ZQogCiAKIGRlZiBtYWluKCk6Ci0gIGhhbmRsZXIgPSBTdG9yYWdlSGFuZGxlcigpCi0gIHByb2Nlc3NvciA9IHN0b3JhZ2UuU3RvcmFnZS5Qcm9jZXNzb3IoaGFuZGxlcikKKyAgICBoYW5kbGVyID0gU3RvcmFnZUhhbmRsZXIoKQorICAgIHByb2Nlc3NvciA9IHN0b3JhZ2UuU3RvcmFnZS5Qcm9jZXNzb3IoaGFuZGxlcikKIAotICBjdHggPSB6bXEuQ29udGV4dCgpCi0gIHJlcXJlcF9zZXJ2ZXIgPSBUWm1xU2VydmVyLlRabXFTZXJ2ZXIocHJvY2Vzc29yLCBjdHgsICJ0Y3A6Ly8wLjAuMC4wOjkwOTAiLCB6bXEuUkVQKQotICBvbmV3YXlfc2VydmVyID0gVFptcVNlcnZlci5UWm1xU2VydmVyKHByb2Nlc3NvciwgY3R4LCAidGNwOi8vMC4wLjAuMDo5MDkxIiwgem1xLlVQU1RSRUFNKQotICBtdWx0aXNlcnZlciA9IFRabXFTZXJ2ZXIuVFptcU11bHRpU2VydmVyKCkKLSAgbXVsdGlzZXJ2ZXIuc2VydmVycy5hcHBlbmQocmVxcmVwX3NlcnZlcikKLSAgbXVsdGlzZXJ2ZXIuc2VydmVycy5hcHBlbmQob25ld2F5X3NlcnZlcikKLSAgbXVsdGlzZXJ2ZXIuc2VydmVGb3JldmVyKCkKKyAgICBjdHggPSB6bXEuQ29udGV4dCgpCisgICAgcmVxcmVwX3NlcnZlciA9IFRabXFTZXJ2ZXIuVFptcVNlcnZlcihwcm9jZXNzb3IsIGN0eCwgInRjcDovLzAuMC4wLjA6OTA5MCIsIHptcS5SRVApCisgICAgb25ld2F5X3NlcnZlciA9IFRabXFTZXJ2ZXIuVFptcVNlcnZlcihwcm9jZXNzb3IsIGN0eCwgInRjcDovLzAuMC4wLjA6OTA5MSIsIHptcS5QVUxMKQorICAgIG11bHRpc2VydmVyID0gVFptcVNlcnZlci5UWm1xTXVsdGlTZXJ2ZXIoKQorICAgIG11bHRpc2VydmVyLnNlcnZlcnMuYXBwZW5kKHJlcXJlcF9zZXJ2ZXIpCisgICAgbXVsdGlzZXJ2ZXIuc2VydmVycy5hcHBlbmQob25ld2F5X3NlcnZlcikKKyAgICBtdWx0aXNlcnZlci5zZXJ2ZUZvcmV2ZXIoKQogCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6Ci0gIG1haW4oKQorICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvZGViaWFuL1JFQURNRS5tZCBiL2RlYmlhbi9SRUFETUUubWQKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCA5OGQ0ZGEwLi44ZWJmZWVhCi0tLSBhL2RlYmlhbi9SRUFETUUubWQKKysrIGIvZGViaWFuL1JFQURNRS5tZApAQCAtMSwxOSArMSw0MSBAQAotc29tZSB0aXBzIG9uIERlYmlhbiBQYWNrYWdpbmcKKyMjIFNvbWUgdGlwcyBvbiBEZWJpYW4gUGFja2FnaW5nCisKIC0gRGViaWFuIE5ldyBNYWludGFpbmVycycgR3VpZGUgW2h0dHA6Ly93d3cuZGViaWFuLm9yZy9kb2MvZGViaWFuLXBvbGljeS9dCiAtIERlYmlhbiBQb2xpY3kgTWFudWFsIFtodHRwOi8vd3d3LmRlYmlhbi5vcmcvZG9jL21hbnVhbHMvbWFpbnQtZ3VpZGUvXQogLSBNYWNoaW5lLXJlYWRhYmxlIGRlYmlhbi9jb3B5cmlnaHQgZmlsZSBbaHR0cDovL2RlcC5kZWJpYW4ubmV0L2RlcHMvZGVwNS9dCistIERlYlNyYyAzLjAgZ3VpZGVsaW5lcyBbaHR0cHM6Ly93aWtpLmRlYmlhbi5vcmcvUHJvamVjdHMvRGViU3JjMy4wXQogCi1idWlsZAorCisjIyBCdWlsZCB1c2luZyBkcGtnLWJ1aWxkcGFja2FnZToKKworYGBgYmFzaAogJCBkcGtnLWJ1aWxkcGFja2FnZSAtZCAtdGMKLSAgLWQgICAgICAgICAgICAgZG8gbm90IGNoZWNrIGJ1aWxkIGRlcGVuZGVuY2llcyBhbmQgY29uZmxpY3RzLgotICAtdGMgICAgICAgICAgICBjbGVhbiBzb3VyY2UgdHJlZSB3aGVuIGZpbmlzaGVkLgorICAtZCAgICMgZG8gbm90IGNoZWNrIGJ1aWxkIGRlcGVuZGVuY2llcyBhbmQgY29uZmxpY3RzLgorICAtdGMgICMgY2xlYW4gc291cmNlIHRyZWUgd2hlbiBmaW5pc2hlZC4KK2BgYAogCi11cGRhdGUgY2hhbmdlbG9nCisKKyMjIFVwZGF0ZSBjaGFuZ2Vsb2c6CisKK2BgYGJhc2gKICQgZGF0ZSAtUgorYGBgCiAKLWNoZWNrIHBhY2thZ2VzCitPbmUgY2FuIGFsc28gaW5zdGFsbCBgZGV2c2NyaXB0c2AgcGFja2FnZSBhbmQgcnVuOgorCitgYGBiYXNoCiskIGRjaCAtaQorYGBgCisKKworIyMgQ2hlY2sgcGFja2FnZXM6CisKK2BgYGJhc2gKICQgZHBrZyAtYyAqLmRlYgogJCBsaW50aWFuICouZGViCitgYGAKIAotdG9kbwotbWFrZSBpdCBwZXJmZWN0IQorCisjIyBUT0RPCisKK01ha2UgaXQgcGVyZmVjdCEKZGlmZiAtLWdpdCBhL2RlYmlhbi9jaGFuZ2Vsb2cgYi9kZWJpYW4vY2hhbmdlbG9nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggOTgzZGQyMS4uNjliNWYyMAotLS0gYS9kZWJpYW4vY2hhbmdlbG9nCisrKyBiL2RlYmlhbi9jaGFuZ2Vsb2cKQEAgLTEsMTQgKzEsMjYgQEAKLXRocmlmdCAoMC45LjIpIHN0YWJsZTsgdXJnZW5jeT1sb3cKK3RocmlmdCAoMC4xMi4wKSBzdGFibGU7IHVyZ2VuY3k9bG93CiAKLSAgKiB1cGRhdGUgdG8gMC45LjIKKyAgKiB1cGRhdGUgdG8gMC4xMi4wCiAKLSAtLSBKYWtlIEZhcnJlbGwgPGpmYXJyZWxsQGFwYWNoZS5vcmc+ICBUaHUsIDMwIE9jdCAyMDE0IDEyOjAwOjAwIC0wNTAwCisgLS0gQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzIDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+ICBXZWQsIDI4IERlYyAyMDE4IDEyOjAwOjAwIC0wNTAwCiAKLXRocmlmdCAoMC45LjEpIHN0YWJsZTsgdXJnZW5jeT1sb3cKLSAgKiB1cGRhdGUgdmVyc2lvbgotICAqIGZpeCBsaWJ0aHJpZnQwLmluc3RhbGwKK3RocmlmdCAoMC4xMS4wKSBzdGFibGU7IHVyZ2VuY3k9bG93CiAKLSAtLSBSb2dlciBNZWllciA8cm9nZXJAYXBhY2hlLm9yZz4gIFR1ZSwgMDggSmFuIDIwMTMgMjI6NDA6MTIgKzAxMDAKKyAgKiB1cGRhdGUgdG8gMC4xMS4wCisKKyAtLSBKYWtlIEZhcnJlbGwgPGpmYXJyZWxsQGFwYWNoZS5vcmc+ICBXZWQsIDA3IERlYyAyMDE3IDIwOjA3OjAwIC0wNTAwCisKK3RocmlmdCAoMC4xMC4wKSBzdGFibGU7IHVyZ2VuY3k9bG93CisKKyAgKiB1cGRhdGUgdG8gMC4xMC4wCisKKyAtLSBKYWtlIEZhcnJlbGwgPGpmYXJyZWxsQGFwYWNoZS5vcmc+ICBXZWQsIDAzIEphbiAyMDE3IDE2OjUyOjAwIC0wNTAwCisKK3RocmlmdCAoMC45LjMpIHN0YWJsZTsgdXJnZW5jeT1sb3cKKworICAqIHVwZGF0ZSB0byAwLjkuMworCisgLS0gSmFrZSBGYXJyZWxsIDxqZmFycmVsbEBhcGFjaGUub3JnPiAgV2VkLCAxMSBPY3QgMjAxNSAxNzoyMjowMCAtMDUwMAogCiB0aHJpZnQgKDAuOS4wKSBzdGFibGU7IHVyZ2VuY3k9bG93CiAKZGlmZiAtLWdpdCBhL2RlYmlhbi9jb21wYXQgYi9kZWJpYW4vY29tcGF0CmluZGV4IDdlZDZmZjguLmVjNjM1MTQgMTAwNjQ0Ci0tLSBhL2RlYmlhbi9jb21wYXQKKysrIGIvZGViaWFuL2NvbXBhdApAQCAtMSArMSBAQAotNQorOQpkaWZmIC0tZ2l0IGEvZGViaWFuL2NvbnRyb2wgYi9kZWJpYW4vY29udHJvbAppbmRleCAzOWQ1N2Y5Li45ODE4YTM3IDEwMDY0NAotLS0gYS9kZWJpYW4vY29udHJvbAorKysgYi9kZWJpYW4vY29udHJvbApAQCAtMSwxOCArMSwyMSBAQAogU291cmNlOiB0aHJpZnQKIFNlY3Rpb246IGRldmVsCiBQcmlvcml0eTogZXh0cmEKLUJ1aWxkLURlcGVuZHM6IGRlYmhlbHBlciAoPj0gNSksIGJ1aWxkLWVzc2VudGlhbCwgbW9uby1nbWNzLCBweXRob24tZGV2LCBhbnQsCi0gICAgbW9uby1kZXZlbCwgIGxpYm1vbm8tc3lzdGVtLXdlYjIuMC1jaWwsIGVybGFuZy1iYXNlLCBydWJ5MS44LWRldiwgYXV0b2NvbmYsIGF1dG9tYWtlLAotICAgIHBrZy1jb25maWcsIGxpYnRvb2wsIGJpc29uLCBmbGV4LCBsaWJib29zdC1kZXYgfCBsaWJib29zdDEuNDAtZGV2LCBweXRob24tYWxsLAotICAgIHB5dGhvbi1hbGwtZGV2LCBweXRob24tYWxsLWRiZywgb3Blbmpkay02LWpkayB8IGphdmEtc2RrLAotICAgIGxpYmJvb3N0LXRlc3QtZGV2IHwgbGliYm9vc3QtdGVzdDEuNDAtZGV2LCBsaWJldmVudC1kZXYsIHBlcmwgKD49IDUuOC4wLTcpLAotICAgIHBocDUsIHBocDUtZGV2LCBsaWJnbGliMi4wLWRldiwgbGlicXQ0LWRldgorQnVpbGQtRGVwZW5kczogZGViaGVscGVyICg+PSA5KSwgYnVpbGQtZXNzZW50aWFsLCBtb25vLW1jcywgcHl0aG9uLWRldiwgYW50LAorICAgIG1vbm8tZGV2ZWwsICBsaWJtb25vLXN5c3RlbS13ZWI0LjAtY2lsLCBlcmxhbmctYmFzZSwgcnVieS1kZXYgfCBydWJ5MS45LjEtZGV2LCBydWJ5LWJ1bmRsZXIgLGF1dG9jb25mLCBhdXRvbWFrZSwKKyAgICBwa2ctY29uZmlnLCBsaWJ0b29sLCBiaXNvbiwgZmxleCwgbGliYm9vc3QtZGV2IHwgbGliYm9vc3QxLjUzLWRldiB8IGxpYmJvb3N0MS42My1hbGwtZGV2LAorICAgIHB5dGhvbi1hbGwsIHB5dGhvbi1zZXR1cHRvb2xzLCBweXRob24tYWxsLWRldiwgcHl0aG9uLWFsbC1kYmcsCisgICAgcHl0aG9uMy1hbGwsIHB5dGhvbjMtc2V0dXB0b29scywgcHl0aG9uMy1hbGwtZGV2LCBweXRob24zLWFsbC1kYmcsCisgICAgb3Blbmpkay03LWpkayB8IG9wZW5qZGstOC1qZGsgfCBkZWZhdWx0LWpkaywKKyAgICBsaWJib29zdC10ZXN0LWRldiB8IGxpYmJvb3N0LXRlc3QxLjUzLWRldiB8IGxpYmJvb3N0LXRlc3QxLjYzLWRldiwgbGliZXZlbnQtZGV2LCBsaWJzc2wtZGV2LCBwZXJsICg+PSA1LjguMC03KSwKKyAgICBwaHAgKD49IDUpLCBwaHAtZGV2ICg+PSA1KSwgbGliZ2xpYjIuMC1kZXYsIHF0Y2hvb3NlciwgcXRiYXNlNS1kZXYtdG9vbHMKIE1haW50YWluZXI6IFRocmlmdCBEZXZlbG9wZXIncyA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPgogSG9tZXBhZ2U6IGh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZy8KLVZjcy1HaXQ6IGh0dHBzOi8vZ2l0LXdpcC11cy5hcGFjaGUub3JnL3JlcG9zL2FzZi90aHJpZnQuZ2l0Ci1WY3MtQnJvd3NlcjogaHR0cHM6Ly9naXQtd2lwLXVzLmFwYWNoZS5vcmcvcmVwb3MvYXNmP3A9dGhyaWZ0LmdpdAotU3RhbmRhcmRzLVZlcnNpb246IDMuNy4yCitWY3MtR2l0OiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC5naXQKK1Zjcy1Ccm93c2VyOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdAorU3RhbmRhcmRzLVZlcnNpb246IDMuOS43CiBYLVB5dGhvbi1WZXJzaW9uOiA+PSAyLjYKK1gtUHl0aG9uMy1WZXJzaW9uOiA+PSAzLjMKIAogUGFja2FnZTogdGhyaWZ0LWNvbXBpbGVyCiBBcmNoaXRlY3R1cmU6IGFueQpAQCAtMjksMTAgKzMyLDEwIEBACiBQYWNrYWdlOiBweXRob24tdGhyaWZ0CiBBcmNoaXRlY3R1cmU6IGFueQogU2VjdGlvbjogcHl0aG9uCi1EZXBlbmRzOiAke3B5dGhvbjpEZXBlbmRzfSwgJHtzaGxpYnM6RGVwZW5kc30sICR7bWlzYzpEZXBlbmRzfQotUmVjb21tZW5kczogcHl0aG9uLXR3aXN0ZWQtY29yZQorRGVwZW5kczogJHtweXRob246RGVwZW5kc30sICR7c2hsaWJzOkRlcGVuZHN9LCAke21pc2M6RGVwZW5kc30sIHB5dGhvbi1zaXgKK1JlY29tbWVuZHM6IHB5dGhvbi10d2lzdGVkLXdlYiwgcHl0aG9uLWJhY2twb3J0cy5zc2wtbWF0Y2gtaG9zdG5hbWUsIHB5dGhvbi1pcGFkZHJlc3MKIFByb3ZpZGVzOiAke3B5dGhvbjpQcm92aWRlc30KLURlc2NyaXB0aW9uOiBQeXRob24gYmluZGluZ3MgZm9yIFRocmlmdAorRGVzY3JpcHRpb246IFB5dGhvbiBiaW5kaW5ncyBmb3IgVGhyaWZ0IChQeXRob24gMikKICBUaHJpZnQgaXMgYSBzb2Z0d2FyZSBmcmFtZXdvcmsgZm9yIHNjYWxhYmxlIGNyb3NzLWxhbmd1YWdlIHNlcnZpY2VzCiAgZGV2ZWxvcG1lbnQuIEl0IGNvbWJpbmVzIGEgc29mdHdhcmUgc3RhY2sgd2l0aCBhIGNvZGUgZ2VuZXJhdGlvbiBlbmdpbmUgdG8KICBidWlsZCBzZXJ2aWNlcyB0aGF0IHdvcmsgZWZmaWNpZW50bHkgYW5kIHNlYW1sZXNzbHkuCkBAIC00MSwxMCArNDQsMTIgQEAKICB0b29sIChpbiB0aGUgdGhyaWZ0LWNvbXBpbGVyIHBhY2thZ2UpIHRvIGNvbXBpbGUgeW91ciBkZWZpbml0aW9uIHRvIFB5dGhvbgogIGNsYXNzZXMsIGFuZCB0aGVuIHRoZSBtb2R1bGVzIGluIHRoaXMgcGFja2FnZSB3aWxsIGFsbG93IHlvdSB0byB1c2UgdGhvc2UKICBjbGFzc2VzIGluIHlvdXIgcHJvZ3JhbXMuCisgLgorIFRoaXMgcGFja2FnZSBpbnN0YWxscyB0aGUgbGlicmFyeSBmb3IgUHl0aG9uIDIuCiAKIFBhY2thZ2U6IHB5dGhvbi10aHJpZnQtZGJnCiBBcmNoaXRlY3R1cmU6IGFueQotU2VjdGlvbjogcHl0aG9uCitTZWN0aW9uOiBkZWJ1ZwogRGVwZW5kczogJHtzaGxpYnM6RGVwZW5kc30sICR7bWlzYzpEZXBlbmRzfSwgcHl0aG9uLXRocmlmdCAoPSAke2JpbmFyeTpWZXJzaW9ufSksIHB5dGhvbi1hbGwtZGJnCiBQcm92aWRlczogJHtweXRob246UHJvdmlkZXN9CiBEZXNjcmlwdGlvbjogUHl0aG9uIGJpbmRpbmdzIGZvciBUaHJpZnQgKGRlYnVnIHZlcnNpb24pCkBAIC01Nyw2ICs2MiwzOSBAQAogIGRlZmluaXRpb24gdG8gUHl0aG9uIGNsYXNzZXMsIGFuZCB0aGVuIHRoZSBtb2R1bGVzIGluIHRoaXMgcGFja2FnZSB3aWxsIGFsbG93CiAgeW91IHRvIHVzZSB0aG9zZSBjbGFzc2VzIGluIHlvdXIgcHJvZ3JhbXMuCiAKK1BhY2thZ2U6IHB5dGhvbjMtdGhyaWZ0CitBcmNoaXRlY3R1cmU6IGFueQorU2VjdGlvbjogcHl0aG9uCitEZXBlbmRzOiAke3B5dGhvbjM6RGVwZW5kc30sICR7c2hsaWJzOkRlcGVuZHN9LCAke21pc2M6RGVwZW5kc30sIHB5dGhvbjMtc2l4CitSZWNvbW1lbmRzOiBweXRob24zLXR3aXN0ZWQtd2ViCitQcm92aWRlczogJHtweXRob246UHJvdmlkZXN9CitEZXNjcmlwdGlvbjogUHl0aG9uIGJpbmRpbmdzIGZvciBUaHJpZnQgKFB5dGhvbiAzKQorIFRocmlmdCBpcyBhIHNvZnR3YXJlIGZyYW1ld29yayBmb3Igc2NhbGFibGUgY3Jvc3MtbGFuZ3VhZ2Ugc2VydmljZXMKKyBkZXZlbG9wbWVudC4gSXQgY29tYmluZXMgYSBzb2Z0d2FyZSBzdGFjayB3aXRoIGEgY29kZSBnZW5lcmF0aW9uIGVuZ2luZSB0bworIGJ1aWxkIHNlcnZpY2VzIHRoYXQgd29yayBlZmZpY2llbnRseSBhbmQgc2VhbWxlc3NseS4KKyAuCisgVGhpcyBwYWNrYWdlIGNvbnRhaW5zIHRoZSBQeXRob24gYmluZGluZ3MgZm9yIFRocmlmdC4gWW91IHdpbGwgbmVlZCB0aGUgdGhyaWZ0CisgdG9vbCAoaW4gdGhlIHRocmlmdC1jb21waWxlciBwYWNrYWdlKSB0byBjb21waWxlIHlvdXIgZGVmaW5pdGlvbiB0byBQeXRob24KKyBjbGFzc2VzLCBhbmQgdGhlbiB0aGUgbW9kdWxlcyBpbiB0aGlzIHBhY2thZ2Ugd2lsbCBhbGxvdyB5b3UgdG8gdXNlIHRob3NlCisgY2xhc3NlcyBpbiB5b3VyIHByb2dyYW1zLgorIC4KKyBUaGlzIHBhY2thZ2UgaW5zdGFsbHMgdGhlIGxpYnJhcnkgZm9yIFB5dGhvbiAzLgorCitQYWNrYWdlOiBweXRob24zLXRocmlmdC1kYmcKK0FyY2hpdGVjdHVyZTogYW55CitTZWN0aW9uOiBkZWJ1ZworRGVwZW5kczogJHtzaGxpYnM6RGVwZW5kc30sICR7bWlzYzpEZXBlbmRzfSwgcHl0aG9uMy10aHJpZnQgKD0gJHtiaW5hcnk6VmVyc2lvbn0pLCBweXRob24zLWFsbC1kYmcKK1Byb3ZpZGVzOiAke3B5dGhvbjpQcm92aWRlc30KK0Rlc2NyaXB0aW9uOiBQeXRob24gYmluZGluZ3MgZm9yIFRocmlmdCAoZGVidWcgdmVyc2lvbikKKyBUaHJpZnQgaXMgYSBzb2Z0d2FyZSBmcmFtZXdvcmsgZm9yIHNjYWxhYmxlIGNyb3NzLWxhbmd1YWdlIHNlcnZpY2VzCisgZGV2ZWxvcG1lbnQuIEl0IGNvbWJpbmVzIGEgc29mdHdhcmUgc3RhY2sgd2l0aCBhIGNvZGUgZ2VuZXJhdGlvbiBlbmdpbmUgdG8KKyBidWlsZCBzZXJ2aWNlcyB0aGF0IHdvcmsgZWZmaWNpZW50bHkgYW5kIHNlYW1sZXNzbHkuCisgLgorIFRoaXMgcGFja2FnZSBjb250YWlucyB0aGUgUHl0aG9uIGJpbmRpbmdzIGZvciBUaHJpZnQgd2l0aCBkZWJ1Z2dpbmcgc3ltYm9scy4KKyBZb3Ugd2lsbCBuZWVkIHRoZSB0aHJpZnQgdG9vbCAoaW4gdGhlIHRocmlmdC1jb21waWxlciBwYWNrYWdlKSB0byBjb21waWxlIHlvdXIKKyBkZWZpbml0aW9uIHRvIFB5dGhvbiBjbGFzc2VzLCBhbmQgdGhlbiB0aGUgbW9kdWxlcyBpbiB0aGlzIHBhY2thZ2Ugd2lsbCBhbGxvdworIHlvdSB0byB1c2UgdGhvc2UgY2xhc3NlcyBpbiB5b3VyIHByb2dyYW1zLgorCiBQYWNrYWdlOiBydWJ5LXRocmlmdAogQXJjaGl0ZWN0dXJlOiBhbGwKIFNlY3Rpb246IGxpYnMKQEAgLTc2LDggKzExNCw4IEBACiAKIFBhY2thZ2U6IGxpYnRocmlmdC1qYXZhCiBBcmNoaXRlY3R1cmU6IGFsbAotU2VjdGlvbjogbGlicwotRGVwZW5kczogamF2YS1nY2otY29tcGF0IHwgamF2YTEtcnVudGltZSB8IGphdmEyLXJ1bnRpbWUsICR7bWlzYzpEZXBlbmRzfQorU2VjdGlvbjogamF2YQorRGVwZW5kczogJHttaXNjOkRlcGVuZHN9CiBEZXNjcmlwdGlvbjogSmF2YSBiaW5kaW5ncyBmb3IgVGhyaWZ0CiAgVGhyaWZ0IGlzIGEgc29mdHdhcmUgZnJhbWV3b3JrIGZvciBzY2FsYWJsZSBjcm9zcy1sYW5ndWFnZSBzZXJ2aWNlcwogIGRldmVsb3BtZW50LiBJdCBjb21iaW5lcyBhIHNvZnR3YXJlIHN0YWNrIHdpdGggYSBjb2RlIGdlbmVyYXRpb24gZW5naW5lIHRvCkBAIC05MCw5ICsxMjgsOSBAQAogCiBQYWNrYWdlOiBsaWJ0aHJpZnQtY2lsCiBBcmNoaXRlY3R1cmU6IGFsbAotU2VjdGlvbjogbGlicwotRGVwZW5kczogY2xpLWNvbW1vbiwgbGlibW9uby1jb3JsaWIxLjAtY2lsICg+PSAxLjApLCBsaWJtb25vLXN5c3RlbTEuMC1jaWwgKD49IDEuMCksIAotICAgIGxpYm1vbm8tc3lzdGVtLXdlYjIuMC1jaWwsICR7bWlzYzpEZXBlbmRzfQorU2VjdGlvbjogY2xpLW1vbm8KK0RlcGVuZHM6IGNsaS1jb21tb24sIGxpYm1vbm8tY29ybGliNC4wLWNpbCAoPj0gMi4xMCkgfCBsaWJtb25vLWNvcmxpYjQuNS1jaWwgKD49My4yKSwgbGlibW9uby1zeXN0ZW00LjAtY2lsICg+PSAyLjEwKSwKKyAgICBsaWJtb25vLXN5c3RlbS13ZWI0LjAtY2lsICg+PSAyLjEwKSwgJHttaXNjOkRlcGVuZHN9CiBEZXNjcmlwdGlvbjogQ0xJIGJpbmRpbmdzIGZvciBUaHJpZnQKICBUaHJpZnQgaXMgYSBzb2Z0d2FyZSBmcmFtZXdvcmsgZm9yIHNjYWxhYmxlIGNyb3NzLWxhbmd1YWdlIHNlcnZpY2VzCiAgZGV2ZWxvcG1lbnQuIEl0IGNvbWJpbmVzIGEgc29mdHdhcmUgc3RhY2sgd2l0aCBhIGNvZGUgZ2VuZXJhdGlvbiBlbmdpbmUgdG8KQEAgLTEyOCwxMCArMTY2LDIxIEBACiAgVGhpcyBwYWNrYWdlIGNvbnRhaW5zIHRoZSBydW50aW1lIGxpYnJhcmllcyBuZWVkZWQgZm9yIEMrKyBhcHBsaWNhdGlvbnMKICB1c2luZyBUaHJpZnQuCiAKK1BhY2thZ2U6IGxpYnRocmlmdDAtZGJnCitBcmNoaXRlY3R1cmU6IGFueQorU2VjdGlvbjogZGVidWcKK0RlcGVuZHM6ICR7c2hsaWJzOkRlcGVuZHN9LCAke21pc2M6RGVwZW5kc30sIGxpYnRocmlmdDAgKD0gJHtiaW5hcnk6VmVyc2lvbn0pCitEZXNjcmlwdGlvbjogVGhyaWZ0IEMrKyBsaWJyYXJ5IGRlYnVnIHN5bWJvbHMKKyBUaHJpZnQgaXMgYSBzb2Z0d2FyZSBmcmFtZXdvcmsgZm9yIHNjYWxhYmxlIGNyb3NzLWxhbmd1YWdlIHNlcnZpY2VzCisgZGV2ZWxvcG1lbnQuIEl0IGNvbWJpbmVzIGEgc29mdHdhcmUgc3RhY2sgd2l0aCBhIGNvZGUgZ2VuZXJhdGlvbiBlbmdpbmUgdG8KKyBidWlsZCBzZXJ2aWNlcyB0aGF0IHdvcmsgZWZmaWNpZW50bHkgYW5kIHNlYW1sZXNzbHkuCisgLgorIFRoaXMgcGFja2FnZSBjb250YWlucyB0aGUgZGVidWcgc3ltYm9scyBmb3IgdGhlIFRocmlmdCBDKysgcnVudGltZSBsaWJyYXJpZXMuCisKIFBhY2thZ2U6IGxpYnRocmlmdC1kZXYKIEFyY2hpdGVjdHVyZTogYW55CiBTZWN0aW9uOiBsaWJkZXZlbAotRGVwZW5kczogJHtzaGxpYnM6RGVwZW5kc30sICR7bWlzYzpEZXBlbmRzfSwgbGlidGhyaWZ0MCwgbGliZ2xpYjIuMC1kZXYKK0RlcGVuZHM6ICR7c2hsaWJzOkRlcGVuZHN9LCAke21pc2M6RGVwZW5kc30sIGxpYnRocmlmdDAgKD0gJHtiaW5hcnk6VmVyc2lvbn0pLCBsaWJnbGliMi4wLWRldgogRGVzY3JpcHRpb246IFRocmlmdCBDKysgbGlicmFyeSAoZGV2ZWxvcG1lbnQgaGVhZGVycykKICBUaHJpZnQgaXMgYSBzb2Z0d2FyZSBmcmFtZXdvcmsgZm9yIHNjYWxhYmxlIGNyb3NzLWxhbmd1YWdlIHNlcnZpY2VzCiAgZGV2ZWxvcG1lbnQuIEl0IGNvbWJpbmVzIGEgc29mdHdhcmUgc3RhY2sgd2l0aCBhIGNvZGUgZ2VuZXJhdGlvbiBlbmdpbmUgdG8KZGlmZiAtLWdpdCBhL2RlYmlhbi9jb3B5cmlnaHQgYi9kZWJpYW4vY29weXJpZ2h0CmluZGV4IDI1NTQ2YjQuLjg1MDY0M2MgMTAwNjQ0Ci0tLSBhL2RlYmlhbi9jb3B5cmlnaHQKKysrIGIvZGViaWFuL2NvcHlyaWdodApAQCAtNCw3ICs0LDcgQEAKIFRoaXMgcGFja2FnZSBhbmQgdGhlIERlYmlhbiBwYWNrYWdpbmcgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLAogc2VlIGAvdXNyL3NoYXJlL2NvbW1vbi1saWNlbnNlcy9BcGFjaGUtMi4wJy4KIAotVGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbnMgd2FzIGNvcGllZCBmcm9tIEFwYWNoZSBUaHJpZnQgTElDRU5TRSBmaWxlLgorVGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbiB3YXMgY29waWVkIGZyb20gQXBhY2hlIFRocmlmdCBMSUNFTlNFIGZpbGUuCiAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTT0ZUV0FSRSBESVNUUklCVVRFRCBXSVRIIFRIUklGVDoKZGlmZiAtLWdpdCBhL2RlYmlhbi9saWJ0aHJpZnQwLmluc3RhbGwgYi9kZWJpYW4vbGlidGhyaWZ0MC5pbnN0YWxsCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL2RlYmlhbi9ydWxlcyBiL2RlYmlhbi9ydWxlcwppbmRleCA2MzNiMTdlLi45YjQzNmQ5IDEwMDc1NQotLS0gYS9kZWJpYW4vcnVsZXMKKysrIGIvZGViaWFuL3J1bGVzCkBAIC0xOCwxMiArMTgsMTggQEAKIAogUFlWRVJTIDo9ICQoc2hlbGwgcHl2ZXJzaW9ucyAtcikKIAorZXhwb3J0IENQUEZMQUdTOj0kKHNoZWxsIGRwa2ctYnVpbGRmbGFncyAtLWdldCBDUFBGTEFHUykKK2V4cG9ydCBDRkxBR1M6PSQoc2hlbGwgZHBrZy1idWlsZGZsYWdzIC0tZ2V0IENGTEFHUykKK2V4cG9ydCBDWFhGTEFHUzo9JChzaGVsbCBkcGtnLWJ1aWxkZmxhZ3MgLS1nZXQgQ1hYRkxBR1MpCitleHBvcnQgTERGTEFHUzo9JChzaGVsbCBkcGtnLWJ1aWxkZmxhZ3MgLS1nZXQgTERGTEFHUykKKwogY29uZmlndXJlOiBjb25maWd1cmUtc3RhbXAKIGNvbmZpZ3VyZS1zdGFtcDoKIAlkaF90ZXN0ZGlyCisKIAkjIEFkZCBoZXJlIGNvbW1hbmRzIHRvIGNvbmZpZ3VyZSB0aGUgcGFja2FnZS4KIAlpZiBbIC1mIGJvb3RzdHJhcC5zaCBdOyB0aGVuICQoQ1VSRElSKS9ib290c3RyYXAuc2g7IGZpCi0JJChDVVJESVIpL2NvbmZpZ3VyZSAtLXByZWZpeD0vdXNyIC0td2l0aC1jX2dsaWIgLS13aXRob3V0LWVybGFuZworCSQoQ1VSRElSKS9jb25maWd1cmUgLS1wcmVmaXg9L3VzciAtLWVuYWJsZS1wbHVnaW49bm8KIAogCXRvdWNoIGNvbmZpZ3VyZS1zdGFtcAogCkBAIC0zNCw3ICs0MCw3IEBACiAJIyAkKE1BS0UpIC1DIHRlc3QgY2hlY2sKIAogYnVpbGQtYXJjaDogYnVpbGQtYXJjaC1zdGFtcAotYnVpbGQtYXJjaC1zdGFtcDogY29uZmlndXJlLXN0YW1wCiskKENVUkRJUikvY29tcGlsZXIvY3BwL3RocmlmdCBidWlsZC1hcmNoLXN0YW1wOiBjb25maWd1cmUtc3RhbXAKIAogCSMgQ29tcGlsZSBjb21waWxlcgogCSQoTUFLRSkgLUMgJChDVVJESVIpL2NvbXBpbGVyL2NwcApAQCAtNTUsMTkgKzYxLDE5IEBACiAJIyBQSFAKIAljZCAkKENVUkRJUikvbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbCAmJiBcCiAJCXBocGl6ZSAmJiBcCi0JCS4vY29uZmlndXJlICYmIG1ha2UKKwkJLi9jb25maWd1cmUgJiYgJChNQUtFKQogCiAJdG91Y2ggJEAKIAogYnVpbGQtaW5kZXA6IGJ1aWxkLWluZGVwLXN0YW1wCi1idWlsZC1pbmRlcC1zdGFtcDogY29uZmlndXJlLXN0YW1wCitidWlsZC1pbmRlcC1zdGFtcDogY29uZmlndXJlLXN0YW1wICQoQ1VSRElSKS9jb21waWxlci9jcHAvdGhyaWZ0CiAKIAkjIEFkZCBoZXJlIGNvbW1hbmRzIHRvIGNvbXBpbGUgdGhlIGluZGVwIHBhcnQgb2YgdGhlIHBhY2thZ2UuCiAJIyQoTUFLRSkgZG9jCiAKIAkjIEphdmEKIAljZCAkKENVUkRJUikvbGliL2phdmEgJiYgXAotCQlhbnQKKwkJLi9ncmFkbGV3IC0tbm8tZGFlbW9uIC1QcmVsZWFzZT10cnVlIGphcgogCiAJIyBDIwogCSQoTUFLRSkgLUMgJChDVVJESVIpL2xpYi9jc2hhcnAKQEAgLTg1LDMzICs5MSwzMiBAQAogCWRoX3Rlc3Ryb290CiAJcm0gLWYgYnVpbGQtYXJjaC1zdGFtcCBidWlsZC1pbmRlcC1zdGFtcCBjb25maWd1cmUtc3RhbXAKIAorCWNkICQoQ1VSRElSKS9saWIvcHkgJiYgcHl0aG9uIHNldHVwLnB5IGNsZWFuIC0tYWxsCisKIAkjIEFkZCBoZXJlIGNvbW1hbmRzIHRvIGNsZWFuIHVwIGFmdGVyIHRoZSBidWlsZCBwcm9jZXNzLgogCS0kKE1BS0UpIGNsZWFuCiAKKwkkKENVUkRJUikvY2xlYW51cC5zaAorCiAJZGhfY2xlYW4KIAogaW5zdGFsbDogaW5zdGFsbC1pbmRlcCBpbnN0YWxsLWFyY2gKIGluc3RhbGwtaW5kZXA6CiAJZGhfdGVzdGRpcgogCWRoX3Rlc3Ryb290Ci0JZGhfY2xlYW4gLWsgLWkKKwlkaF9wcmVwIC1pCiAJZGhfaW5zdGFsbGRpcnMgLWkKIAogCSMgQWRkIGhlcmUgY29tbWFuZHMgdG8gaW5zdGFsbCB0aGUgaW5kZXAgcGFydCBvZiB0aGUgcGFja2FnZSBpbnRvCiAJIyBkZWJpYW4vPHBhY2thZ2U+LWRvYy4KIAkjSU5TVEFMTERPQyMKIAotICAgICAgICAjIEphdmEKKwkjIEphdmEKIAlta2RpciAtcCAkKENVUkRJUikvZGViaWFuL2xpYnRocmlmdC1qYXZhL3Vzci9zaGFyZS9qYXZhLyAmJiBcCi0JY3AgJChDVVJESVIpL2xpYi9qYXZhL2J1aWxkL2xpYnRocmlmdCouamFyIFwKKwljcCAkKENVUkRJUikvbGliL2phdmEvYnVpbGQvbGlicy9saWJ0aHJpZnQqLmphciBcCiAJCSQoQ1VSRElSKS9kZWJpYW4vbGlidGhyaWZ0LWphdmEvdXNyL3NoYXJlL2phdmEvCiAKLSAgICAgICAgIyBSdWJ5Ci0JbWtkaXIgLXAgJChDVVJESVIpL2RlYmlhbi9ydWJ5LXRocmlmdC91c3IvbGliL3J1YnkvMS44ICYmIFwKLQljcCAkKENVUkRJUikvbGliL3JiL2xpYi90aHJpZnQucmIgXAotCQkkKENVUkRJUikvZGViaWFuL3J1YnktdGhyaWZ0L3Vzci9saWIvcnVieS8xLjgKLQljcCAtciAkKENVUkRJUikvbGliL3JiL2xpYi90aHJpZnQgXAotCQkkKENVUkRJUikvZGViaWFuL3J1YnktdGhyaWZ0L3Vzci9saWIvcnVieS8xLjgKKwkjIFJ1YnkKIAlta2RpciAtcCAkKENVUkRJUikvZGViaWFuL3J1YnktdGhyaWZ0L3Vzci9saWIvcnVieS8xLjkuMSAmJiBcCiAJY3AgJChDVVJESVIpL2xpYi9yYi9saWIvdGhyaWZ0LnJiIFwKIAkJJChDVVJESVIpL2RlYmlhbi9ydWJ5LXRocmlmdC91c3IvbGliL3J1YnkvMS45LjEKQEAgLTEyNCw3ICsxMjksMTEgQEAKIAkJJChDVVJESVIpL2RlYmlhbi9saWJ0aHJpZnQtY2lsL3Vzci9saWIvY2xpL3RocmlmdC9UaHJpZnQuZGxsCiAKIAkjIFBlcmwKLQkkKE1BS0UpIC1DICQoQ1VSRElSKS9saWIvcGVybCBpbnN0YWxsIERFU1RESVI9JChDVVJESVIpL2RlYmlhbi9saWJ0aHJpZnQtcGVybC91c3IKKwkkKE1BS0UpIC1DICQoQ1VSRElSKS9saWIvcGVybCBpbnN0YWxsIERFU1RESVI9JChDVVJESVIpL2RlYmlhbi9saWJ0aHJpZnQtcGVybAorCW1rZGlyIC1wICQoQ1VSRElSKS9kZWJpYW4vbGlidGhyaWZ0LXBlcmwvdXNyL3NoYXJlCisJbXYgJChDVVJESVIpL2RlYmlhbi9saWJ0aHJpZnQtcGVybC91c3IvbG9jYWwvbGliL3Blcmw1ICQoQ1VSRElSKS9kZWJpYW4vbGlidGhyaWZ0LXBlcmwvdXNyL3NoYXJlCisJcm1kaXIgJChDVVJESVIpL2RlYmlhbi9saWJ0aHJpZnQtcGVybC91c3IvbG9jYWwvbGliCisJcm1kaXIgJChDVVJESVIpL2RlYmlhbi9saWJ0aHJpZnQtcGVybC91c3IvbG9jYWwKIAogCWRoX2luc3RhbGwgLWkKIApAQCAtMTQ2LDE2ICsxNTUsMjcgQEAKIAogCSMgUHl0aG9uCiAJY2QgJChDVVJESVIpL2xpYi9weSAmJiBcCi0JZm9yIHB5IGluICQoUFlWRVJTKTsgZG8gXAotCQkkJHB5IHNldHVwLnB5IGluc3RhbGwgLS1uby1jb21waWxlIC0tcm9vdD0kKENVUkRJUikvZGViaWFuL3B5dGhvbi10aHJpZnQ7IFwKLQkJJCRweS1kYmcgc2V0dXAucHkgaW5zdGFsbCAtLW5vLWNvbXBpbGUgLS1yb290PSQoQ1VSRElSKS9kZWJpYW4vcHl0aG9uLXRocmlmdC1kYmc7IFwKLQlkb25lCisJcHl0aG9uMiBzZXR1cC5weSBpbnN0YWxsIC0taW5zdGFsbC1sYXlvdXQ9ZGViIC0tbm8tY29tcGlsZSAtLXJvb3Q9JChDVVJESVIpL2RlYmlhbi9weXRob24tdGhyaWZ0ICYmIFwKKwlweXRob24yLWRiZyBzZXR1cC5weSBpbnN0YWxsIC0taW5zdGFsbC1sYXlvdXQ9ZGViIC0tbm8tY29tcGlsZSAtLXJvb3Q9JChDVVJESVIpL2RlYmlhbi9weXRob24tdGhyaWZ0LWRiZyAmJiBcCisJcHl0aG9uMyBzZXR1cC5weSBpbnN0YWxsIC0taW5zdGFsbC1sYXlvdXQ9ZGViIC0tbm8tY29tcGlsZSAtLXJvb3Q9JChDVVJESVIpL2RlYmlhbi9weXRob24zLXRocmlmdCAmJiBcCisJcHl0aG9uMy1kYmcgc2V0dXAucHkgaW5zdGFsbCAtLWluc3RhbGwtbGF5b3V0PWRlYiAtLW5vLWNvbXBpbGUgLS1yb290PSQoQ1VSRElSKS9kZWJpYW4vcHl0aG9uMy10aHJpZnQtZGJnCiAKLQlmaW5kICQoQ1VSRElSKS9kZWJpYW4vcHl0aG9uLXRocmlmdC1kYmcgLW5hbWUgIioucHljIiAtcHJpbnQwIHwgeGFyZ3MgLTAgcm0gLWYKKwlmaW5kICQoQ1VSRElSKS9kZWJpYW4vcHl0aG9uLXRocmlmdCAtbmFtZSAiKi5weVtjb10iIC1wcmludDAgfCB4YXJncyAtMCBybSAtZgorCWZpbmQgJChDVVJESVIpL2RlYmlhbi9weXRob24tdGhyaWZ0IC1uYW1lICJfX3B5Y2FjaGVfXyIgLXByaW50MCB8IHhhcmdzIC0wIHJtIC1mcgorCWZpbmQgJChDVVJESVIpL2RlYmlhbi9weXRob24tdGhyaWZ0LWRiZyAtbmFtZSAiX19weWNhY2hlX18iIC1wcmludDAgfCB4YXJncyAtMCBybSAtZnIKKwlmaW5kICQoQ1VSRElSKS9kZWJpYW4vcHl0aG9uLXRocmlmdC1kYmcgLW5hbWUgIioucHlbY29dIiAtcHJpbnQwIHwgeGFyZ3MgLTAgcm0gLWYKIAlmaW5kICQoQ1VSRElSKS9kZWJpYW4vcHl0aG9uLXRocmlmdC1kYmcgLW5hbWUgIioucHkiIC1wcmludDAgfCB4YXJncyAtMCBybSAtZgogCWZpbmQgJChDVVJESVIpL2RlYmlhbi9weXRob24tdGhyaWZ0LWRiZyAtbmFtZSAiKi5lZ2ctaW5mbyIgLXByaW50MCB8IHhhcmdzIC0wIHJtIC1yZgogCWZpbmQgJChDVVJESVIpL2RlYmlhbi9weXRob24tdGhyaWZ0LWRiZyAtZGVwdGggLXR5cGUgZCAtZW1wdHkgLWV4ZWMgcm1kaXIge30gXDsKIAorCWZpbmQgJChDVVJESVIpL2RlYmlhbi9weXRob24zLXRocmlmdCAtbmFtZSAiKi5weVtjb10iIC1wcmludDAgfCB4YXJncyAtMCBybSAtZgorCWZpbmQgJChDVVJESVIpL2RlYmlhbi9weXRob24zLXRocmlmdCAtbmFtZSAiX19weWNhY2hlX18iIC1wcmludDAgfCB4YXJncyAtMCBybSAtZnIKKwlmaW5kICQoQ1VSRElSKS9kZWJpYW4vcHl0aG9uMy10aHJpZnQtZGJnIC1uYW1lICJfX3B5Y2FjaGVfXyIgLXByaW50MCB8IHhhcmdzIC0wIHJtIC1mcgorCWZpbmQgJChDVVJESVIpL2RlYmlhbi9weXRob24zLXRocmlmdC1kYmcgLW5hbWUgIioucHlbY29dIiAtcHJpbnQwIHwgeGFyZ3MgLTAgcm0gLWYKKwlmaW5kICQoQ1VSRElSKS9kZWJpYW4vcHl0aG9uMy10aHJpZnQtZGJnIC1uYW1lICIqLnB5IiAtcHJpbnQwIHwgeGFyZ3MgLTAgcm0gLWYKKwlmaW5kICQoQ1VSRElSKS9kZWJpYW4vcHl0aG9uMy10aHJpZnQtZGJnIC1uYW1lICIqLmVnZy1pbmZvIiAtcHJpbnQwIHwgeGFyZ3MgLTAgcm0gLXJmCisJZmluZCAkKENVUkRJUikvZGViaWFuL3B5dGhvbjMtdGhyaWZ0LWRiZyAtZGVwdGggLXR5cGUgZCAtZW1wdHkgLWV4ZWMgcm1kaXIge30gXDsKKwogCSMgUEhQCiAJbWtkaXIgLXAgJChDVVJESVIpL2RlYmlhbi9waHA1LXRocmlmdAogCWNkICQoQ1VSRElSKS9saWIvcGhwICYmIFwKQEAgLTE2NCw5ICsxODQsOSBAQAogCSMgQysrIGFuZCBDIChnbGliKQogCW1rZGlyIC1wICQoQ1VSRElSKS9kZWJpYW4vdG1wOyBcCiAJY2QgJChDVVJESVIpL2xpYi9jcHAgJiYgXAotCQltYWtlIERFU1RESVI9JChDVVJESVIpL2RlYmlhbi90bXAgaW5zdGFsbAorCQkkKE1BS0UpIERFU1RESVI9JChDVVJESVIpL2RlYmlhbi90bXAgaW5zdGFsbAogCWNkICQoQ1VSRElSKS9saWIvY19nbGliICYmIFwKLQkJbWFrZSBERVNURElSPSQoQ1VSRElSKS9kZWJpYW4vdG1wIGluc3RhbGwKKwkJJChNQUtFKSBERVNURElSPSQoQ1VSRElSKS9kZWJpYW4vdG1wIGluc3RhbGwKIAogCWRoX2luc3RhbGwgLS1zb3VyY2VkaXI9ZGViaWFuL3RtcCAtcwogCkBAIC0xODIsOCArMjAyLDEwIEBACiAJZGhfaW5zdGFsbGV4YW1wbGVzCiAJZGhfaW5zdGFsbG1hbgogCWRoX2xpbmsKLQlkaF9zdHJpcCAtTnB5dGhvbi10aHJpZnQtZGJnIC1OdGhyaWZ0LWNvbXBpbGVyIC1ObGlidGhyaWZ0MCAtLWRiZz1weXRob24tdGhyaWZ0LWRiZwotCWRoX3N0cmlwIC1OcHl0aG9uLXRocmlmdC1kYmcKKwlkaF9zdHJpcCAtcGxpYnRocmlmdDAgLS1kYmctcGFja2FnZT1saWJ0aHJpZnQwLWRiZworCWRoX3N0cmlwIC1wcHl0aG9uLXRocmlmdCAtLWRiZy1wYWNrYWdlPXB5dGhvbi10aHJpZnQtZGJnCisJZGhfc3RyaXAgLXBweXRob24zLXRocmlmdCAtLWRiZy1wYWNrYWdlPXB5dGhvbjMtdGhyaWZ0LWRiZworCWRoX3N0cmlwIC1wdGhyaWZ0LWNvbXBpbGVyCiAJZGhfY29tcHJlc3MKIAlkaF9maXhwZXJtcwogCWRoX21ha2VzaGxpYnMKQEAgLTE5MywxMyArMjE1LDEzIEBACiAJZGhfZ2VuY29udHJvbAogCWRoX21kNXN1bXMKIAlkaF9idWlsZGRlYgotIyBCdWlsZCBhcmNoaXRlY3R1cmUgaW5kZXBlbmRhbnQgcGFja2FnZXMgdXNpbmcgdGhlIGNvbW1vbiB0YXJnZXQuCisjIEJ1aWxkIGFyY2hpdGVjdHVyZSBpbmRlcGVuZGVudCBwYWNrYWdlcyB1c2luZyB0aGUgY29tbW9uIHRhcmdldC4KIGJpbmFyeS1pbmRlcDogYnVpbGQtaW5kZXAgaW5zdGFsbC1pbmRlcAogCSQoTUFLRSkgLWYgZGViaWFuL3J1bGVzIERIX09QVElPTlM9LWkgYmluYXJ5LWNvbW1vbgogCi0jIEJ1aWxkIGFyY2hpdGVjdHVyZSBkZXBlbmRhbnQgcGFja2FnZXMgdXNpbmcgdGhlIGNvbW1vbiB0YXJnZXQuCisjIEJ1aWxkIGFyY2hpdGVjdHVyZSBkZXBlbmRlbnQgcGFja2FnZXMgdXNpbmcgdGhlIGNvbW1vbiB0YXJnZXQuCiBiaW5hcnktYXJjaDogYnVpbGQtYXJjaCBpbnN0YWxsLWFyY2gKLQllY2hvICJwaHA6RGVwZW5kcz1waHBhcGktJChwaHAtY29uZmlnNSAtLXBocGFwaSkiID4gZGViaWFuL3N1YnN0dmFycworCWVjaG8gInBocDpEZXBlbmRzPXBocGFwaS0kKHNoZWxsIHBocC1jb25maWc1IC0tcGhwYXBpKSIgPiAkKENVUkRJUikvZGViaWFuL3N1YnN0dmFycwogCSQoTUFLRSkgLWYgZGViaWFuL3J1bGVzIERIX09QVElPTlM9LXMgYmluYXJ5LWNvbW1vbgogCiBiaW5hcnk6IGJpbmFyeS1hcmNoIGJpbmFyeS1pbmRlcApkaWZmIC0tZ2l0IGEvZGViaWFuL3N1YnN0dmFycyBiL2RlYmlhbi9zdWJzdHZhcnMKaW5kZXggYmFkZjU3Mi4uOTg0MWYyZCAxMDA2NDQKLS0tIGEvZGViaWFuL3N1YnN0dmFycworKysgYi9kZWJpYW4vc3Vic3R2YXJzCkBAIC0xICsxIEBACi1waHA6RGVwZW5kcz1waHBhcGktCitwaHA6RGVwZW5kcz1waHBhcGktMjAxMjEyMTIKZGlmZiAtLWdpdCBhL2RvYXAucmRmIGIvZG9hcC5yZGYKaW5kZXggMmYyMjQ1ZS4uY2I3NmZhYyAxMDA3NTUKLS0tIGEvZG9hcC5yZGYKKysrIGIvZG9hcC5yZGYKQEAgLTM4LDE3ICszOCwyMCBAQAogICAgIDxwcm9ncmFtbWluZy1sYW5ndWFnZT5DKys8L3Byb2dyYW1taW5nLWxhbmd1YWdlPgogICAgIDxwcm9ncmFtbWluZy1sYW5ndWFnZT5Db2NvYTwvcHJvZ3JhbW1pbmctbGFuZ3VhZ2U+CiAgICAgPHByb2dyYW1taW5nLWxhbmd1YWdlPkQ8L3Byb2dyYW1taW5nLWxhbmd1YWdlPgorICAgIDxwcm9ncmFtbWluZy1sYW5ndWFnZT5EYXJ0PC9wcm9ncmFtbWluZy1sYW5ndWFnZT4KICAgICA8cHJvZ3JhbW1pbmctbGFuZ3VhZ2U+RGVscGhpPC9wcm9ncmFtbWluZy1sYW5ndWFnZT4KICAgICA8cHJvZ3JhbW1pbmctbGFuZ3VhZ2U+RXJsYW5nPC9wcm9ncmFtbWluZy1sYW5ndWFnZT4KICAgICA8cHJvZ3JhbW1pbmctbGFuZ3VhZ2U+R288L3Byb2dyYW1taW5nLWxhbmd1YWdlPgogICAgIDxwcm9ncmFtbWluZy1sYW5ndWFnZT5IYXNrZWxsPC9wcm9ncmFtbWluZy1sYW5ndWFnZT4KKyAgICA8cHJvZ3JhbW1pbmctbGFuZ3VhZ2U+SGF4ZTwvcHJvZ3JhbW1pbmctbGFuZ3VhZ2U+CiAgICAgPHByb2dyYW1taW5nLWxhbmd1YWdlPkphdmE8L3Byb2dyYW1taW5nLWxhbmd1YWdlPgogICAgIDxwcm9ncmFtbWluZy1sYW5ndWFnZT5KYXZhU2NyaXB0PC9wcm9ncmFtbWluZy1sYW5ndWFnZT4KICAgICA8cHJvZ3JhbW1pbmctbGFuZ3VhZ2U+bm9kZS5qczwvcHJvZ3JhbW1pbmctbGFuZ3VhZ2U+Ci0gICAgPHByb2dyYW1taW5nLWxhbmd1YWdlPk9jYW1sPC9wcm9ncmFtbWluZy1sYW5ndWFnZT4KKyAgICA8cHJvZ3JhbW1pbmctbGFuZ3VhZ2U+T0NhbWw8L3Byb2dyYW1taW5nLWxhbmd1YWdlPgogICAgIDxwcm9ncmFtbWluZy1sYW5ndWFnZT5QZXJsPC9wcm9ncmFtbWluZy1sYW5ndWFnZT4KICAgICA8cHJvZ3JhbW1pbmctbGFuZ3VhZ2U+UEhQPC9wcm9ncmFtbWluZy1sYW5ndWFnZT4KICAgICA8cHJvZ3JhbW1pbmctbGFuZ3VhZ2U+UHl0aG9uPC9wcm9ncmFtbWluZy1sYW5ndWFnZT4KKyAgICA8cHJvZ3JhbW1pbmctbGFuZ3VhZ2U+UnVzdDwvcHJvZ3JhbW1pbmctbGFuZ3VhZ2U+CiAgICAgPHByb2dyYW1taW5nLWxhbmd1YWdlPlNtYWxsVGFsazwvcHJvZ3JhbW1pbmctbGFuZ3VhZ2U+CiAgICAgPGNhdGVnb3J5IHJkZjpyZXNvdXJjZT0iaHR0cDovL3Byb2plY3RzLmFwYWNoZS5vcmcvY2F0ZWdvcnkvaHR0cCIgLz4KICAgICA8Y2F0ZWdvcnkgcmRmOnJlc291cmNlPSJodHRwOi8vcHJvamVjdHMuYXBhY2hlLm9yZy9jYXRlZ29yeS9saWJyYXJ5IiAvPgpAQCAtNTcsNiArNjAsMzEgQEAKICAgICA8cmVsZWFzZSByZGY6cGFyc2VUeXBlPSJDb2xsZWN0aW9uIj4KICAgICAgIDxWZXJzaW9uPgogICAgICAgICA8bmFtZT5BcGFjaGUgVGhyaWZ0PC9uYW1lPgorICAgICAgICA8Y3JlYXRlZD4yMDE4LTEyLTI4PC9jcmVhdGVkPgorICAgICAgICA8cmV2aXNpb24+MC4xMi4wPC9yZXZpc2lvbj4KKyAgICAgIDwvVmVyc2lvbj4KKyAgICAgIDxWZXJzaW9uPgorICAgICAgICA8bmFtZT5BcGFjaGUgVGhyaWZ0PC9uYW1lPgorICAgICAgICA8Y3JlYXRlZD4yMDE3LTExLTMwPC9jcmVhdGVkPgorICAgICAgICA8cmV2aXNpb24+MC4xMS4wPC9yZXZpc2lvbj4KKyAgICAgIDwvVmVyc2lvbj4KKyAgICAgIDxWZXJzaW9uPgorICAgICAgICA8bmFtZT5BcGFjaGUgVGhyaWZ0PC9uYW1lPgorICAgICAgICA8Y3JlYXRlZD4yMDE3LTAzLTAxPC9jcmVhdGVkPgorICAgICAgICA8cmV2aXNpb24+MC4xMC4wPC9yZXZpc2lvbj4KKyAgICAgIDwvVmVyc2lvbj4KKyAgICAgIDxWZXJzaW9uPgorICAgICAgICA8bmFtZT5BcGFjaGUgVGhyaWZ0PC9uYW1lPgorICAgICAgICA8Y3JlYXRlZD4yMDE1LTA5LTI1PC9jcmVhdGVkPgorICAgICAgICA8cmV2aXNpb24+MC45LjM8L3JldmlzaW9uPgorICAgICAgPC9WZXJzaW9uPgorICAgICAgPFZlcnNpb24+CisgICAgICAgIDxuYW1lPkFwYWNoZSBUaHJpZnQ8L25hbWU+CisgICAgICAgIDxjcmVhdGVkPjIwMTQtMTEtMDU8L2NyZWF0ZWQ+CisgICAgICAgIDxyZXZpc2lvbj4wLjkuMjwvcmV2aXNpb24+CisgICAgICA8L1ZlcnNpb24+CisgICAgICA8VmVyc2lvbj4KKyAgICAgICAgPG5hbWU+QXBhY2hlIFRocmlmdDwvbmFtZT4KICAgICAgICAgPGNyZWF0ZWQ+MjAxMy0wOC0yMjwvY3JlYXRlZD4KICAgICAgICAgPHJldmlzaW9uPjAuOS4xPC9yZXZpc2lvbj4KICAgICAgIDwvVmVyc2lvbj4KQEAgLTEwOCw4ICsxMzYsOCBAQAogICAgIDwvcmVsZWFzZT4KICAgICA8cmVwb3NpdG9yeT4KICAgICAgIDxHaXRSZXBvc2l0b3J5PgotICAgICAgICA8bG9jYXRpb24gcmRmOnJlc291cmNlPSJodHRwczovL2dpdC13aXAtdXMuYXBhY2hlLm9yZy9yZXBvcy9hc2YvdGhyaWZ0LmdpdCIvPgotICAgICAgICA8YnJvd3NlIHJkZjpyZXNvdXJjZT0iaHR0cHM6Ly9naXQtd2lwLXVzLmFwYWNoZS5vcmcvcmVwb3MvYXNmP3A9dGhyaWZ0LmdpdCIvPgorICAgICAgICA8bG9jYXRpb24gcmRmOnJlc291cmNlPSJodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC5naXQiLz4KKyAgICAgICAgPGJyb3dzZSByZGY6cmVzb3VyY2U9Imh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0Ii8+CiAgICAgICA8L0dpdFJlcG9zaXRvcnk+CiAgICAgPC9yZXBvc2l0b3J5PgogICAgIDxtYWludGFpbmVyPgpkaWZmIC0tZ2l0IGEvZG9jL2NvZGluZ19zdGFuZGFyZHMubWQgYi9kb2MvY29kaW5nX3N0YW5kYXJkcy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDgxMDBhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2NvZGluZ19zdGFuZGFyZHMubWQKQEAgLTAsMCArMSw0OCBAQAorIyBUaHJpZnQgQ29kaW5nIFN0YW5kYXJkcworCisgICBBbnkgZm9vbCBjYW4gd3JpdGUgY29kZSB0aGF0IGEgY29tcHV0ZXIgY2FuIHVuZGVyc3RhbmQuCisgICBHb29kIHByb2dyYW1tZXJzIHdyaXRlIGNvZGUgdGhhdCBodW1hbnMgY2FuIHVuZGVyc3RhbmQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gTWFydGluIEZvd2xlciwgMTk5OQorCitUaGUgcHVycG9zZSBvZiB0aGlzIGRvY3VtZW50IGlzIHRvIG1ha2UgZXZlcnlvbmUncyBsaWZlIGVhc2llci4KKworSXQncyBlYXNpZXIgd2hlbiB5b3UgcmVhZCBnb29kLCB3ZWxsIGZvcm1hdHRlZCwgd2l0aCBjbGVhcmx5IGRlZmluZWQgcHVycG9zZSwgY29kZS4KK0J1dCB0aGUgb25seSB3YXkgdG8gcmVhZCBjbGVhbiBjb2RlIGlzIHRvIHdyaXRlIHN1Y2guCisKK1RoaXMgZG9jdW1lbnQgY2FuIGhlbHAgYWNoaWV2ZSB0aGF0LCBidXQga2VlcCBpbiBtaW5kIHRoYXQKK3Rob3NlIGFyZSBub3Qgc2lsdmVyLWJ1bGxldCwgZml4LWFsbC1hdC1vbmNlIHJ1bGVzLiBKdXN0IHRoaW5rIGFib3V0IHJlYWRhYmlsaXR5IHdoaWxlIHdyaXRpbmcgY29kZS4KK1dyaXRlIGNvZGUgbGlrZSB5b3Ugd291bGQgaGF2ZSB0byByZWFkIGl0IGluIHRlbiB5ZWFycyBmcm9tIG5vdy4KKworIyMgR2VuZXJhbCBDb2RpbmcgU3RhbmRhcmRzCisKK1RocmlmdCBoYXMgc29tZSBoaXN0b3J5LiBOb3QgYWxsIGV4aXN0aW5nIGNvZGUgZm9sbG93cyB0aG9zZSBydWxlcy4KK0J1dCB3ZSB3YW50IHRvIGltcHJvdmUgb3ZlciB0aW1lLgorV2hlbiBtYWtpbmcgc21hbGwgY2hhbmdlIC8gYnVnZml4IC0gbGlrZSBzaW5nbGUgbGluZSBmaXggLSBkbyAqbm90KiByZWZhY3RvciB3aG9sZSBmdW5jdGlvbi4KK1RoYXQgZGlzdHVyYnMgY29kZSByZXBvc2l0b3J5IGhpc3RvcnkuCitXaGVuZXZlciBhZGRpbmcgc29tZXRoaW5nIG5ldyBhbmQgLyBvciBtYWtpbmcgYmlnZ2VyIHJlZmFjdG9yaW5nCisgLSBmb2xsb3cgdGhvc2UgcnVsZXMgYXMgc3RyaWN0bHkgYXMgeW91IGNhbi4KKworV2hlbiBpbiBkb3VidCAtIGNvbnRhY3Qgb3RoZXIgZGV2ZWxvcGVycyAodXNpbmcgZGV2QCBtYWlsaW5nIGxpc3Qgb3IgSVJDKS4KK0NvZGUgcmV2aWV3IGlzIHRoZSBiZXN0IHdheSB0byBpbXByb3ZlIHJlYWRhYmlsaXR5LgorCisjIyMgQmFzaWNzCisgKiBVc2Ugc3BhY2VzIG5vdCB0YWJzCisgKiBVc2Ugb25seSBBU0NJSSBjaGFyYWN0ZXJzIGluIGZpbGUgYW5kIGRpcmVjdG9yeSBuYW1lcworICogQ29tbWl0IHRvIHJlcG9zaXRvcnkgdXNpbmcgVW5peC1zdHlsZSBsaW5lIGVuZGluZ3MgKExGKQorICAgICBPbiBXaW5kb3dzOgorICAgICAgIGdpdCBjb25maWcgY29yZS5hdXRvY3JsZiB0cnVlCisgKiBNYXhpbXVtIGxpbmUgd2lkdGggLSAxMDAgY2hhcmFjdGVycworICogSWYgbm90IHNwZWNpZmllZCBvdGhlcndpc2UgaW4gbGFuZ3VhZ2Ugc3BlY2lmaWMgc3RhbmRhcmQgLSB1c2UgMiBzcGFjZXMgYXMgaW5kZW50L3RhYgorCisjIyMgQ29tbWVudHMKKyAqIEVhY2ggZmlsZSBoYXMgdG8gc3RhcnQgd2l0aCBjb21tZW50IGNvbnRhaW5pbmcgW0FwYWNoZSBMaWNlbnNlXShodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApCisgKiBQdWJsaWMgQVBJIG9mIGxpYnJhcnkgc2hvdWxkIGJlIGRvY3VtZW50ZWQsIHByZWZlcmFibHkgdXNpbmcgZm9ybWF0IG5hdGl2ZSBmb3IgbGFuZ3VhZ2Ugc3BlY2lmaWMgZG9jdW1lbnRhdGlvbiBnZW5lcmF0aW9uIHRvb2xzIChKYXZhZG9jLCBEb3h5Z2VuIGV0Yy4pCisgKiBPdGhlciBjb21tZW50cyBhcmUgZGlzY291cmFnZWQgLSBjb21tZW50cyBhcmUgbGllcy4gV2hlbiBvbmUgaGFzIHRvIG1ha2UgY29tbWVudCBpdCBtZWFucyBvbmUgZmFpbGVkIHRvIHdyaXRlIHJlYWRhYmxlIGNvZGUuIEluc3RlYWQgb2YgIkkgc2hvdWxkIHdyaXRlIGEgY29tbWVudCBoZXJlIiB0aGluayAiSSBzaG91bGQgY2xlYW4gaXQgdXAiCisgKiBEbyBub3QgbGVhdmUgIlRPRE8vRklYTUUiIGNvbW1lbnRzIC0gZmlsZSBbSmlyYV0oaHR0cDovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVCkgaXNzdWUgaW5zdGVhZAorCisjIyMgTmFtaW5nCisgRmluZGluZyBwcm9wZXIgbmFtZXMgaXMgdGhlIG1vc3QgaW1wb3J0YW50IGFuZCBtb3N0IGRpZmZpY3VsdCB0YXNrIGluIHNvZnR3YXJlIGRldmVsb3BtZW50LgorCisjIyBMYW5ndWFnZSBTcGVjaWZpYyBDb2RpbmcgU3RhbmRhcmRzCisKK0ZvciBkZXRhaWxlZCBpbmZvcm1hdGlvbiBzZWUgYGxpYi9MQU5HL2NvZGluZ19zdGFuZGFyZHMubWRgCmRpZmYgLS1naXQgYS9kb2MvY29tbWl0dGVycy5tZCBiL2RvYy9jb21taXR0ZXJzLm1kCmluZGV4IDQ2MDZkYTUuLmRjZGQ3YjcgMTAwNjQ0Ci0tLSBhL2RvYy9jb21taXR0ZXJzLm1kCisrKyBiL2RvYy9jb21taXR0ZXJzLm1kCkBAIC0xLDY3ICsxLDU0IEBACiAjIyBQcm9jZXNzIHVzZWQgYnkgY29tbWl0dGVycyB0byByZXZpZXcgYW5kIHN1Ym1pdCBwYXRjaGVzCiAKLTEuIE1ha2Ugc3VyZSB0aGF0IHRoZXJlIGlzIGFuIGlzc3VlIGZvciB0aGUgcGF0Y2gocykgeW91IGFyZSBhYm91dCB0byBjb21taXQgaW4gb3VyIFtKaXJhIGlzc3VlIHRyYWNrZXJdKHt7IGNvbmYuamlyYV91cmwgfX0pCi0gCisxLiBNYWtlIHN1cmUgdGhhdCB0aGVyZSBpcyBhbiBpc3N1ZSBmb3IgdGhlIHBhdGNoKHMpIHlvdSBhcmUgYWJvdXQgdG8gY29tbWl0IGluIG91ciBbSmlyYSBpc3N1ZSB0cmFja2VyXShodHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUKQorCiAxLiBDaGVjayBvdXQgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoZSBzb3VyY2UgY29kZQotCQotCSogZ2l0IGNsb25lIGh0dHBzOi8vZ2l0LXdpcC11cy5hcGFjaGUub3JnL3JlcG9zL2FzZi90aHJpZnQuZ2l0IHRocmlmdCAKKworICAqIGdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC5naXQgdGhyaWZ0CiAKIDEuIEFwcGx5IHRoZSBwYXRjaAotCQotCSogY3VybCBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvLi4uIHxnaXQgYXBwbHkgLS1pZ25vcmUtc3BhY2UtY2hhbmdlCi0JCi0Jb3IKLQkKLQkqIGN1cmwgaHR0cHM6Ly9naXRodWIuY29tLzxHaXRIdWIgVXNlcj4vdGhyaWZ0L2NvbW1pdC88Q29tbWl0IElEPi5wYXRjaCB8Z2l0IGFwcGx5IC0taWdub3JlLXNwYWNlLWNoYW5nZQotCQotCQorCisgICogY3VybCBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvLi4uIHxnaXQgYXBwbHkgLS1pZ25vcmUtc3BhY2UtY2hhbmdlCisKKyAgb3IKKworICAqIGN1cmwgaHR0cHM6Ly9naXRodWIuY29tLzxHaXRIdWIgVXNlcj4vdGhyaWZ0L2NvbW1pdC88Q29tbWl0IElEPi5wYXRjaCB8Z2l0IGFwcGx5IC0taWdub3JlLXNwYWNlLWNoYW5nZQorCisKIDEuIEluc3BlY3QgdGhlIGFwcGxpZWQgcGF0Y2ggdG8gZW5zdXJlIHRoYXQgYWxsIFtMZWdhbCBhc3BlY3RzIG9uIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucyAoUGF0Y2hlcyldKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC5odG1sI2NvbnRyaWJ1dGlvbnMpIGFyZSBtZXQKIAogMS4gUnVuIHRoZSBuZWNlc3NhcnkgdW5pdCB0ZXN0cyBhbmQgY3Jvc3MgbGFuZ3VhZ2UgdGVzdCBjYXNlcyB0byB2ZXJpZnkgdGhlIHBhdGNoCiAKIDEuIENvbW1pdCB0aGUgcGF0Y2gKIAotCQlnaXQgLS1jb25maWcgdXNlci5uYW1lICJZb3VyIE5hbWUiCi0JCWdpdCAtLWNvbmZpZyB1c2VyLmVtYWlsICJZb3VyQXBhY2hlSURAYXBhY2hlLm9yZyIKLQkJZ2l0IGFkZCAtQQotCQlnaXQgY29tbWl0Ci0JCQotCQkKKyAgICAgICAgZ2l0IC0tY29uZmlnIHVzZXIubmFtZSAiWW91ciBOYW1lIgorICAgICAgICBnaXQgLS1jb25maWcgdXNlci5lbWFpbCAiWW91ckFwYWNoZUlEQGFwYWNoZS5vcmciCisgICAgICAgIGdpdCBhZGQgLUEKKyAgICAgICAgZ2l0IGNvbW1pdAorCiAxLiBUaGUgY29tbWl0IG1lc3NhZ2Ugc2hvdWxkIGJlIGluIHRoZSBmb3JtYXQ6Ci0JCi0JCVRIUklGVC0jIyM6PEppcmEgZGVzY3JpcHRpb24+Ci0JCUNsaWVudDogPGNvbXBvbmVudD4KLQkJUGF0Y2g6IDxOYW1lIG9mIHBlcnNvbiBjb250cmlidXRpbmcgdGhlIHBhdGNoPgotCQkKLQkJRGVzY3JpcHRpb24gb2Ygd2hhdCB3YXMgZml4ZWQgb3IgYWRkcmVzc2VkLgotCQkKLQkJPCUKLQkJCWlmIHRoaXMgaXMgYSBnaXRodWIgcHVsbCByZXF1ZXN0IHRoZW4gY29weSB0aGUgYmVsb3cgYmxvY2sgCi0JCQlmcm9tIHRoZSBHaXRIdWIgZW1haWwgdGhhdCBjYW1lIHRvIGRldkAgbGlzdCwgdGhpcyB3aWxsIAotCQkJYXV0b21hdGljYWxseSBjbG9zZSB0aGUgR2l0SHViIHB1bGwgcmVxdWVzdCAKLQkJJT4KLQkJR2l0aHViIFB1bGwgUmVxdWVzdDogVGhpcyBjbG9zZXMgI1hYCi0JCS0tLS0KLQkJY29tbWl0IDEyMzQ1NjcKLQkJQXV0aG9yOiBkb2Nicm93biA8ZG9jYnJvd25AZXhhbXBsZS5jb20+Ci0JCURhdGU6ICAgMTk4NS0wNi0wM1QwMToyMTowMFoKIAotICAgIAkJZml4IGZvciBUSFJJRlQtMTIzNAorICAgICAgIFRIUklGVC0jIyM6PEppcmEgZGVzY3JpcHRpb24+CisgICAgICAgQ2xpZW50OiA8Y29tcG9uZW50PgorICAgICAgIFBhdGNoOiA8TmFtZSBvZiBwZXJzb24gY29udHJpYnV0aW5nIHRoZSBwYXRjaD4KIAotICAgIAkJZml4IGZvciBUSFJJRlQtMTIzNCBmaXhlcyB0aGUgZmx1eCBjYXBhY2l0b3IKKyAgICAgICBEZXNjcmlwdGlvbiBvZiB3aGF0IHdhcyBmaXhlZCBvciBhZGRyZXNzZWQuCisKKyAgICAgICA8JQorICAgICAgICAgICBpZiB0aGlzIGlzIGEgZ2l0aHViIHB1bGwgcmVxdWVzdCB0aGVuIGFkZCBiZWxvdyBjb21tZW50CisgICAgICAgICAgICB0byBhdXRvbWF0aWNhbHkgY2xvc2UgR2l0SHViIHJlcXVlc3QuCisgICAgICAgJT4KKyAgICAgICBUaGlzIGNsb3NlcyAjWFgKIAogCiAxLiBEb3VibGUgY2hlY2sgdGhlIHBhdGNoIGNvbW1pdHRlZCBhbmQgdGhhdCBub3RoaW5nIHdhcyBtaXNzZWQgdGhlbiBwdXNoIHRoZSBwYXRjaAogCi0JCWdpdCBzdGF0dXMKLQkJZ2l0IHNob3cgSEVBRAotCQlnaXQgcHVzaCBvcmlnaW4gbWFzdGVyCisgICAgICAgZ2l0IHN0YXR1cworICAgICAgIGdpdCBzaG93IEhFQUQKKyAgICAgICBnaXQgcHVzaCBvcmlnaW4gbWFzdGVyCiAKLQkJCisKIDEuIFJlc29sdmUgdGhlIGppcmEgaXNzdWUgYW5kIHNldCB0aGUgZm9sbG93aW5nIGZvciB0aGUgY2hhbmdlbG9nCiAKLQkqIENvbXBvbmVudCB0aGUgcGF0Y2ggaXMgZm9yICAKLQkqIGZpeFZlcnNpb24gdG8gdGhlIGN1cnJlbnQgdmVyc2lvbiBvbiBtYXN0ZXIKLQkKLQotIAorICAqIENvbXBvbmVudCB0aGUgcGF0Y2ggaXMgZm9yCisgICogZml4VmVyc2lvbiB0byB0aGUgY3VycmVudCB2ZXJzaW9uIG9uIG1hc3RlcgpkaWZmIC0tZ2l0IGEvZG9jL2NvbnRyaWJ1dGluZy5tZCBiL2RvYy9jb250cmlidXRpbmcubWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzMDc0YTQuLjAwMDAwMDAKLS0tIGEvZG9jL2NvbnRyaWJ1dGluZy5tZAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLSMjIEhvdyB0byBjb250cmlidXRlCi0KLSAxLiBNYWtlIHN1cmUgeW91ciBpc3N1ZSBpcyBub3QgYWxsIHJlYWR5IGluIHRoZSBbSmlyYSBpc3N1ZSB0cmFja2VyXShodHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUKQotIDEuIElmIG5vdCwgY3JlYXRlIGEgdGlja2V0IGRlc2NyaWJpbmcgdGhlIGNoYW5nZSB5b3UncmUgcHJvcG9zaW5nIGluIHRoZSBbSmlyYSBpc3N1ZSB0cmFja2VyXShodHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUKQotIDEuIENvbnRyaWJ1dGUgeW91ciBwYXRjaCB1c2luZyBvbmUgb2YgdGhlIHR3byBtZXRob2RzIGJlbG93Ci0gCi0jIyMgQ29udHJpYnV0aW5nIHZpYSBhIHBhdGNoCi0gCi0xLiBDaGVjayBvdXQgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoZSBzb3VyY2UgY29kZQotCQotCSogZ2l0IGNsb25lIGh0dHBzOi8vZ2l0LXdpcC11cy5hcGFjaGUub3JnL3JlcG9zL2FzZi90aHJpZnQuZ2l0IHRocmlmdCAKLQotMS4gTW9kaWZ5IHRoZSBzb3VyY2UgdG8gaW5jbHVkZSB0aGUgaW1wcm92ZW1lbnQvYnVnZml4Ci0JCi0JKiBWZXJpZnkgdGhhdCB5b3UgZm9sbG93IHRoZSBzYW1lIENvZGluZ1N0eWxlIHlvdSBzZWUgd2l0aGluIHRoZSBsYW5ndWFnZSB5b3UgYXJlIHdvcmtpbmcgb24KLQkqIFZlcmlmeSB0aGF0IHlvdXIgY2hhbmdlIHdvcmtzIGJ5IGFkZGluZyBhIHVuaXQgdGVzdC4KLQotMS4gQ3JlYXRlIGEgcGF0Y2ggZnJvbSBwcm9qZWN0IHJvb3QgZGlyZWN0b3J5IChlLmcuIHlvdUBkZXY6fi90aHJpZnQgJCApOgotCQotCSogZ2l0IGRpZmYgPiAuLi90aHJpZnQtWFhYLW15LW5ldy1mZWF0dXJlLnBhdGNoCi0KLTEuIEF0dGFjaCB0aGUgbmV3bHkgZ2VuZXJhdGVkIHBhdGNoIHRvIHRoZSBpc3N1ZQotMS4gV2FpdCBmb3Igb3RoZXIgY29udHJpYnV0b3JzIG9yIGNvbW1pdHRlcnMgdG8gcmV2aWV3IHlvdXIgbmV3IGFkZGl0aW9uCi0xLiBXYWl0IGZvciBhIGNvbW1pdHRlciB0byBjb21taXQgeW91ciBwYXRjaAotIAotIyMjIENvbnRyaWJ1dGluZyB2aWEgR2l0SHViIHB1bGwgcmVxdWVzdHMKLQotMS4gQ3JlYXRlIGEgZm9yayBmb3IgaHR0cDovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdAotMS4gQ3JlYXRlIGEgYnJhbmNoIHdpdGggdGhlIGppcmEgdGlja2V0IG51bWJlciB5b3UgYXJlIHdvcmtpbmcgb24KLTEuIE1vZGlmeSB0aGUgc291cmNlIHRvIGluY2x1ZGUgdGhlIGltcHJvdmVtZW50L2J1Z2ZpeAotCQotCSogVmVyaWZ5IHRoYXQgeW91IGZvbGxvdyB0aGUgc2FtZSBDb2RpbmdTdHlsZSB5b3Ugc2VlIHdpdGhpbiB0aGUgbGFuZ3VhZ2UgeW91IGFyZSB3b3JraW5nIG9uCi0JKiBWZXJpZnkgdGhhdCB5b3VyIGNoYW5nZSB3b3JrcyBieSBhZGRpbmcgYSB1bml0IHRlc3QuIAotCi0xLiBJc3N1ZSBhIHB1bGwgcmVxdWVzdCBmb3IgeW91ciBuZXcgZmVhdHVyZQotMS4gV2FpdCBmb3Igb3RoZXIgY29udHJpYnV0b3JzIG9yIGNvbW1pdHRlcnMgdG8gcmV2aWV3IHlvdXIgbmV3IGFkZGl0aW9uCi0xLiBXYWl0IGZvciBhIGNvbW1pdHRlciB0byBjb21taXQgeW91ciBwYXRjaAotCi0jIyMgTW9yZSBpbmZvCi0gCi0gUGxlbnR5IG9mIGluZm9ybWF0aW9uIG9uIHdoeSBhbmQgaG93IHRvIGNvbnRyaWJ1dGUgaXMgYXZhaWxhYmxlIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB3ZWIgc2l0ZS4gSW4gcGFydGljdWxhciwgd2UgcmVjb21tZW5kIHRoZSBmb2xsb3dpbmc6Ci0gCi0gKiBbQ29udHJpYnV0b3JzIFRlY2ggR3VpZGVdKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kZXYvY29udHJpYnV0b3JzKQotICogW0dldCBpbnZvbHZlZCFdKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9mb3VuZGF0aW9uL2dldGludm9sdmVkLmh0bWwpCi0gKiBbTGVnYWwgYXNwZWN0cyBvbiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMgKFBhdGNoZXMpXShodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAuaHRtbCNjb250cmlidXRpb25zKQpkaWZmIC0tZ2l0IGEvZG9jL2ltYWdlcy9jZ3JuLnBuZyBiL2RvYy9pbWFnZXMvY2dybi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGMwOTY0ZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9pbWFnZXMvY2dybi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jL2ltYWdlcy9jcmVkLnBuZyBiL2RvYy9pbWFnZXMvY3JlZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg2YTVmYgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9pbWFnZXMvY3JlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jL2ltYWdlcy9jcmVkZnVsbC5wbmcgYi9kb2MvaW1hZ2VzL2NyZWRmdWxsLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjY2NDA0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2ltYWdlcy9jcmVkZnVsbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jL2ltYWdlcy9jeWVsLnBuZyBiL2RvYy9pbWFnZXMvY3llbC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2MxZGZjNwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9pbWFnZXMvY3llbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jL2ltYWdlcy90aHJpZnQtbGF5ZXJzLnBuZyBiL2RvYy9pbWFnZXMvdGhyaWZ0LWxheWVycy5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFhY2NmNAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9pbWFnZXMvdGhyaWZ0LWxheWVycy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jL2luc3RhbGwvUkVBRE1FLm1kIGIvZG9jL2luc3RhbGwvUkVBRE1FLm1kCmluZGV4IDhmNjk1MTAuLjIyMjMxY2QgMTAwNjQ0Ci0tLSBhL2RvYy9pbnN0YWxsL1JFQURNRS5tZAorKysgYi9kb2MvaW5zdGFsbC9SRUFETUUubWQKQEAgLTEsOSArMSw5IEBACiAKICMjIEJhc2ljIHJlcXVpcmVtZW50cwogKiBBIHJlbGF0aXZlbHkgUE9TSVgtY29tcGxpYW50ICpOSVggc3lzdGVtCi0gICAgKiBDeWd3aW4gb3IgTWluR1cgY2FuIGJlIHVzZWQgb24gV2luZG93cworICAgICogQ3lnd2luIG9yIE1pbkdXIGNhbiBiZSB1c2VkIG9uIFdpbmRvd3MgKGJ1dCB0aGVyZSBhcmUgYmV0dGVyIG9wdGlvbnMsIHNlZSBiZWxvdykKICogZysrIDQuMgotKiBib29zdCAxLjU0LjAKKyogYm9vc3QgMS41My4wCiAqIFJ1bnRpbWUgbGlicmFyaWVzIGZvciBsZXggYW5kIHlhY2MgbWlnaHQgYmUgbmVlZGVkIGZvciB0aGUgY29tcGlsZXIuCiAKICMjIFJlcXVpcmVtZW50cyBmb3IgYnVpbGRpbmcgZnJvbSBzb3VyY2UKQEAgLTE1LDYgKzE1LDEwIEBACiAqIGxleCBhbmQgeWFjYyAoZGV2ZWxvcGVkIHByaW1hcmlseSB3aXRoIGZsZXggYW5kIGJpc29uKQogKiBsaWJzc2wtZGV2CiAKKyMjIFJlcXVpcmVtZW50cyBmb3IgYnVpbGRpbmcgdGhlIGNvbXBpbGVyIGZyb20gc291cmNlIG9uIFdpbmRvd3MKKyogVmlzdWFsIFN0dWRpbyBDKysKKyogRmxleCBhbmQgQmlzb24gKGUuZy4gdGhlIFdpbkZsZXhCaXNvbiBwYWNrYWdlKQorCiAjIyBMYW5ndWFnZSByZXF1aXJlbWVudHMKIFRoZXNlIGFyZSBvbmx5IHJlcXVpcmVkIGlmIHlvdSBjaG9vc2UgdG8gYnVpbGQgdGhlIGxpYnJhcmllcyBmb3IgdGhlIGdpdmVuIGxhbmd1YWdlCiAKQEAgLTIzLDcgKzI3LDcgQEAKICAgICAqIGxpYmV2ZW50IChvcHRpb25hbCwgdG8gYnVpbGQgdGhlIG5vbmJsb2NraW5nIHNlcnZlcikKICAgICAqIHpsaWIgKG9wdGlvbmFsKQogKiBKYXZhCi0gICAgKiBKYXZhIDEuNworICAgICogSmF2YSAxLjgKICAgICAqIEFwYWNoZSBBbnQKICogQyM6IE1vbm8gMS4yLjQgKGFuZCBwa2ctY29uZmlnIHRvIGRldGVjdCBpdCkgb3IgVmlzdWFsIFN0dWRpbyAyMDA1KwogKiBQeXRob24gMi42IChpbmNsdWRpbmcgaGVhZGVyIGZpbGVzIGZvciBleHRlbnNpb24gbW9kdWxlcykKQEAgLTM0LDMgKzM4LDYgQEAKICogUGVybCA1CiAgICAgKiBCaXQ6OlZlY3RvcgogICAgICogQ2xhc3M6OkFjY2Vzc29yCisqIEhheGUgMy4xLjMKKyogR28gMS40CisqIERlbHBoaSAyMDEwCmRpZmYgLS1naXQgYS9kb2MvaW5zdGFsbC9jZW50b3MubWQgYi9kb2MvaW5zdGFsbC9jZW50b3MubWQKaW5kZXggM2NmMjM5OS4uMDQ5MzJjMiAxMDA2NDQKLS0tIGEvZG9jL2luc3RhbGwvY2VudG9zLm1kCisrKyBiL2RvYy9pbnN0YWxsL2NlbnRvcy5tZApAQCAtNTQsMTcgKzU0LDE3IEBACiAKIAlzdWRvIHl1bSAteSBpbnN0YWxsIGxpYmV2ZW50LWRldmVsIHpsaWItZGV2ZWwgb3BlbnNzbC1kZXZlbAogCi0jIyMgVXBncmFkZSBCb29zdCAKKyMjIyBVcGdyYWRlIEJvb3N0ID49IDEuNTMKIAotCXdnZXQgaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9ib29zdC9maWxlcy9ib29zdC8xLjU1LjAvYm9vc3RfMV81NV8wLnRhci5negotCXRhciB4dmYgYm9vc3RfMV81NV8wLnRhci5negotCWNkIGJvb3N0XzFfNTVfMAorCXdnZXQgaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9ib29zdC9maWxlcy9ib29zdC8xLjUzLjAvYm9vc3RfMV81M18wLnRhci5negorCXRhciB4dmYgYm9vc3RfMV81M18wLnRhci5negorCWNkIGJvb3N0XzFfNTNfMAogCS4vYm9vdHN0cmFwLnNoCiAJc3VkbyAuL2IyIGluc3RhbGwKIAogIyMgQnVpbGQgYW5kIEluc3RhbGwgdGhlIEFwYWNoZSBUaHJpZnQgSURMIENvbXBpbGVyCiAKLQlnaXQgY2xvbmUgaHR0cHM6Ly9naXQtd2lwLXVzLmFwYWNoZS5vcmcvcmVwb3MvYXNmL3RocmlmdC5naXQKKwlnaXQgY2xvbmUgaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQuZ2l0CiAJY2QgdGhyaWZ0CiAJLi9ib290c3RyYXAuc2gKIAkuL2NvbmZpZ3VyZSAtLXdpdGgtbHVhPW5vCmRpZmYgLS1naXQgYS9kb2MvaW5zdGFsbC9kZWJpYW4ubWQgYi9kb2MvaW5zdGFsbC9kZWJpYW4ubWQKaW5kZXggM2UzZDc0Zi4uODRmNjk2ZSAxMDA2NDQKLS0tIGEvZG9jL2luc3RhbGwvZGViaWFuLm1kCisrKyBiL2RvYy9pbnN0YWxsL2RlYmlhbi5tZApAQCAtMSwyMSArMSwyNyBAQAotIyMgRGViaWFuIG9yIFVidW50dSBzZXR1cAotVGhlIGZvbGxvd2luZyBjb21tYW5kIGluc3RhbGwgYWxsIHRoZSByZXF1aXJlZCB0b29scyBhbmQgbGlicmFyaWVzIHRvIGJ1aWxkIGFuZCBpbnN0YWxsIHRoZSBBcGFjaGUgVGhyaWZ0IGNvbXBpbGVyIG9uIGEgRGViaWFuL1VidW50dSBMaW51eCBiYXNlZCBzeXN0ZW0uCisjIyBEZWJpYW4vVWJ1bnR1IGluc3RhbGwKK1RoZSBmb2xsb3dpbmcgY29tbWFuZCB3aWxsIGluc3RhbGwgdG9vbHMgYW5kIGxpYnJhcmllcyByZXF1aXJlZCB0byBidWlsZCBhbmQgaW5zdGFsbCB0aGUgQXBhY2hlIFRocmlmdCBjb21waWxlciBhbmQgQysrIGxpYnJhcmllcyBvbiBhIERlYmlhbi9VYnVudHUgTGludXggYmFzZWQgc3lzdGVtLgogCi0Jc3VkbyBhcHQtZ2V0IGluc3RhbGwgbGliYm9vc3QtZGV2IGxpYmJvb3N0LXRlc3QtZGV2IGxpYmJvb3N0LXByb2dyYW0tb3B0aW9ucy1kZXYgbGliYm9vc3Qtc3lzdGVtLWRldiBsaWJib29zdC1maWxlc3lzdGVtLWRldiBsaWJldmVudC1kZXYgYXV0b21ha2UgbGlidG9vbCBmbGV4IGJpc29uIHBrZy1jb25maWcgZysrIGxpYnNzbC1kZXYgCisJc3VkbyBhcHQtZ2V0IGluc3RhbGwgYXV0b21ha2UgYmlzb24gZmxleCBnKysgZ2l0IGxpYmJvb3N0LWFsbC1kZXYgbGliZXZlbnQtZGV2IGxpYnNzbC1kZXYgbGlidG9vbCBtYWtlIHBrZy1jb25maWcKIAotVGhlbiBpbnN0YWxsIHRoZSBKYXZhIEpESyBvZiB5b3VyIGNob2ljZS4gVHlwZSAqKmphdmFjKiogdG8gc2VlIGEgbGlzdCBvZiBhdmFpbGFibGUgcGFja2FnZXMsIHBpY2sgdGhlIG9uZSB5b3UgcHJlZmVyIGFuZCAqKmFwdC1nZXQgaW5zdGFsbCoqIGl0LgorRGViaWFuIDcvVWJ1bnR1IDEyIHVzZXJzIG5lZWQgdG8gbWFudWFsbHkgaW5zdGFsbCBhIG1vcmUgcmVjZW50IHZlcnNpb24gb2YgYXV0b21ha2UgYW5kIChmb3IgQysrIGxpYnJhcnkgYW5kIHRlc3Qgc3VwcG9ydCkgYm9vc3Q6CiAKLURlYmlhbiBzdGFibGUgdXNlcnMgbmVlZCB0byBtYW51YWxseSBpbnN0YWxsIGEgbW9yZSByZWNlbnQgYXV0b21ha2UgdmVyc2lvbjoKKyAgICB3Z2V0IGh0dHA6Ly9mdHAuZGViaWFuLm9yZy9kZWJpYW4vcG9vbC9tYWluL2EvYXV0b21ha2UtMS4xNS9hdXRvbWFrZV8xLjE1LTNfYWxsLmRlYgorICAgIHN1ZG8gZHBrZyAtaSBhdXRvbWFrZV8xLjE1LTNfYWxsLmRlYgogCi0gICAgd2dldCBodHRwOi8vZnRwLmRlYmlhbi5vcmcvZGViaWFuL3Bvb2wvbWFpbi9hL2F1dG9tYWtlLTEuMTQvYXV0b21ha2VfMS4xNC4xLTNfYWxsLmRlYgotICAgIHN1ZG8gZHBrZyAtaSBhdXRvbWFrZV8xLjE0LjEtM19hbGwuZGViCisgICAgd2dldCBodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2Jvb3N0L2ZpbGVzL2Jvb3N0LzEuNjAuMC9ib29zdF8xXzYwXzAudGFyLmd6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhciB4dmYgYm9vc3RfMV82MF8wLnRhci5negorICAgIGNkIGJvb3N0XzFfNjBfMAorICAgIC4vYm9vdHN0cmFwLnNoCisgICAgc3VkbyAuL2IyIGluc3RhbGwKIAogIyMgT3B0aW9uYWwgcGFja2FnZXMKIAotU29tZSBvdGhlciBwYWNrYWdlcyBkZXBlbmQgb24gd2hhdCBsYW5ndWFnZXMgeW91IHdhbnQgVGhyaWZ0IHRvIHN1cHBvcnQuCitJZiB5b3Ugd291bGQgbGlrZSB0byBidWlsZCBBcGFjaGUgVGhyaWZ0IGxpYnJhcmllcyBmb3Igb3RoZXIgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzIHlvdSBtYXkgbmVlZCB0byBpbnN0YWxsIGFkZGl0aW9uYWwgcGFja2FnZXMuIFRoZSBmb2xsb3dpbmcgbGFuZ3VhZ2VzIHJlcXVpcmUgdGhlIHNwZWNpZmllZCBhZGRpdGlvbmFsIHBhY2thZ2VzOgogCi0gKiBSdWJ5IAotCSogcnVieS1mdWxsIHJ1YnktZGV2IHJ1YnktcnNwZWMgcmFrZSBydWJ5Z2VtcyBsaWJkYWVtb25zLXJ1YnkgbGliZ2VtcGx1Z2luLXJ1YnkgbW9uZ3JlbAorICogSmF2YQorCSogcGFja2FnZXM6IGFudCAgCisJKiBZb3Ugd2lsbCBhbHNvIG5lZWQgSmF2YSBKREsgdjEuOCBvciBoaWdoZXIuIFR5cGUgKipqYXZhYyoqIHRvIHNlZSBhIGxpc3Qgb2YgYXZhaWxhYmxlIHBhY2thZ2VzLCBwaWNrIHRoZSBvbmUgeW91IHByZWZlciBhbmQgKiphcHQtZ2V0IGluc3RhbGwqKiBpdCAoZS5nLiBkZWZhdWx0LWpkaykuCisgKiBSdWJ5CisJKiBydWJ5LWZ1bGwgcnVieS1kZXYgcnVieS1yc3BlYyByYWtlIHJ1YnlnZW1zIGJ1bmRsZXIKICAqIFB5dGhvbgogCSogcHl0aG9uLWFsbCBweXRob24tYWxsLWRldiBweXRob24tYWxsLWRiZwogICogUGVybApAQCAtMjUsMTQgKzMxLDI5IEBACiAgKiBDX2dsaWIKIAkqIGxpYmdsaWIyLjAtZGV2CiAgKiBFcmxhbmcKLQkqIGVybGFuZy1iYXNlIGVybGFuZy1ldW5pdCBlcmxhbmctZGV2CisJKiBlcmxhbmctYmFzZSBlcmxhbmctZXVuaXQgZXJsYW5nLWRldiByZWJhcgogICogQ3NoYXJwCiAJKiBtb25vLWdtY3MgbW9uby1kZXZlbCBsaWJtb25vLXN5c3RlbS13ZWIyLjAtY2lsIG51bml0IG51bml0LWNvbnNvbGUKICAqIEhhc2tlbGwKLQkqIGdoYzYgY2FiYWwtaW5zdGFsbCBsaWJnaGM2LWJpbmFyeS1kZXYgbGliZ2hjNi1uZXR3b3JrLWRldiBsaWJnaGM2LWh0dHAtZGV2CisJKiBnaGMgY2FiYWwtaW5zdGFsbCBsaWJnaGMtYmluYXJ5LWRldiBsaWJnaGMtbmV0d29yay1kZXYgbGliZ2hjLWh0dHAtZGV2CiAgKiBUaHJpZnQgQ29tcGlsZXIgZm9yIFdpbmRvd3MKLQkqIG1pbmd3MzIgbWluZ3czMi1iaW51dGlscyBtaW5ndzMyLXJ1bnRpbWUgbnNpcwotCisJKiBtaW5ndy13NjQgbWluZ3ctdzY0LXg4Ni02NC1kZXYgbnNpcworICogUnVzdAorCSogcnVzdGMgY2FyZ28KKyAqIEhheGUKKwkqIGhheGUKKyAqIEx1YQorICAgICogbHVhNS4zIGxpYmx1YTUuMy1kZXYKKyAqIE5vZGVKcworICAgICogbm9kZWpzIG5wbQorICogZG90bmV0Y29yZQorICAgICogaHR0cHM6Ly93d3cubWljcm9zb2Z0LmNvbS9uZXQvbGVhcm4vZ2V0LXN0YXJ0ZWQvbGludXh1YnVudHUKKyAqIGQtbGFuZworICAgICogY3VybCAtZnNTIGh0dHBzOi8vZGxhbmcub3JnL2luc3RhbGwuc2ggfCBiYXNoIC1zIGRtZAorICogZGFydCAmIHB1YgorICAgICogaHR0cHM6Ly93d3cuZGFydGxhbmcub3JnL2luc3RhbGwvbGludXgKKyAgICAqIGh0dHBzOi8vd3d3LmRhcnRsYW5nLm9yZy90b29scy9wdWIvaW5zdGFsbGluZworCQogCiAjIyBBZGRpdGlvbmFsIHJlYWRpbmcKIApkaWZmIC0tZ2l0IGEvZG9jL2luc3RhbGwvd2luZG93cy5tZCBiL2RvYy9pbnN0YWxsL3dpbmRvd3MubWQKaW5kZXggYmUxMzM4NC4uODYxODkzNCAxMDA2NDQKLS0tIGEvZG9jL2luc3RhbGwvd2luZG93cy5tZAorKysgYi9kb2MvaW5zdGFsbC93aW5kb3dzLm1kCkBAIC0xLDE3ICsxLDUxIEBACiAjIyBXaW5kb3dzIFNldHVwCi1UaGUgd2luZG93cyBjb21waWxlciBpcyBhdmFpbGFibGUgYXMgYSBwcmVidWlsdCBleGUgYXZhaWxhYmxlIFtoZXJlXSgvZG93bmxvYWQpCiAKLSMjIFdpbmRvd3Mgc2V0dXAgZnJvbSBzb3VyY2UKK1RoZSBUaHJpZnQgZW52aXJvbm1lbnQgY29uc2lzdHMgb2YgdHdvIG1haW4gcGFydHM6IFRoZSBUaHJpZnQgY29tcGlsZXIgRVhFIGFuZCB0aGUgbGFuZ3VhZ2UtZGVwZW5kZW50IGxpYnJhcmllcy4gTW9zdCBvZiB0aGVzZSBsaWJyYXJpZXMgd2lsbCByZXF1aXJlIHNvbWUga2luZCBvZiBidWlsZCBhbmQvb3IgaW5zdGFsbGF0aW9uLiBCdXQgcmVnYXJkaW5nIHRoZSBUaHJpZnQgY29tcGlsZXIgdXRpbGl0eSB0aGVyZSBhcmUgYSBudW1iZXIgb2YgZGlmZmVyZW50IGFsdGVybmF0aXZlcy4gCiAKLSMjIyBCYXNpYyByZXF1aXJlbWVudHMgZm9yIHdpbjMyCi1UaHJpZnQncyBjb21waWxlciBpcyB3cml0dGVuIGluIEMrKyBhbmQgZGVzaWduZWQgdG8gYmUgcG9ydGFibGUsIGJ1dCB0aGVyZSBhcmUgc29tZSBzeXN0ZW0gcmVxdWlyZW1lbnRzOgorVGhlIGZpcnN0IG9uZSBvZiB0aGVzZSBhbHRlcm5hdGl2ZXMgaXMgdG8gZG93bmxvYWQgdGhlICoqcHJlLWJ1aWx0IFRocmlmdCBDb21waWxlciBFWEUqKiBhbmQgb25seSBidWlsZCB0aGUgbGlicmFyaWVzIG5lZWRlZCBmcm9tIHNvdXJjZSwgZm9sbG93aW5nIG9uZSBvZiB0aGUgIlNldHVwIGZyb20gc291cmNlIiBtZXRob2RzIG91dGxpbmVkIGJlbG93LgogCi0gKiBDeWd3aW4gb3IgTWluR1cKK1RoZSBvdGhlciB0d28gb3B0aW9ucyBhcmUgdG8gYnVpbGQgdGhlIFRocmlmdCBjb21waWxlciBmcm9tIHNvdXJjZS4gVGhlIG1vc3QgcmVjb21tZW5kZWQgd2F5IHRvIGFjaGlldmUgdGhpcyBpcyBieSBtZWFucyBvZiB0aGUgKipWaXN1YWwgU3R1ZGlvIEMrKyBidWlsZCBwcm9qZWN0KiouIEFsdGVybmF0aXZlbHksIHRoZSBUaHJpZnQgY29tcGlsZXIgY2FuIGFsc28gYmUgYnVpbHQgdmlhICoqQ3lnd2luKiogb3IgKipNaW5HVyoqIGJ1aWxkIGVudmlyb25tZW50cywgaG93ZXZlciB0aGlzIG1ldGhvZCBpcyBub3Qgb25seSBsZXNzIGNvbWZvcnRhYmxlLCBidXQgbW9yZSB0aW1lLWNvbnN1bWluZyBhbmQgcmVxdWlyZXMgbXVjaCBtb3JlIG1hbnVhbCBlZmZvcnQuIAorCisKKyMjIFByZWJ1aWx0IFRocmlmdCBjb21waWxlcgorCitUaGUgd2luZG93cyBUaHJpZnQgY29tcGlsZXIgaXMgYXZhaWxhYmxlIGFzIGEgcHJlYnVpbHQgZXhlIGF2YWlsYWJsZSBbaGVyZV0oL2Rvd25sb2FkKS4gTm90ZSB0aGF0IHRoZXJlIGlzIG5vIGluc3RhbGxhdGlvbiB0b29sLCByYXRoZXIgdGhpcyBFWEUgZmlsZSAqaXMqIGFscmVhZHkgdGhlIFRocmlmdCBjb21waWxlciB1dGlsaXR5LiBEb3dubG9hZCB0aGUgZmlsZSBhbmQgcHV0IGl0IGludG8gc29tZSBzdWl0YWJsZSBsb2NhdGlvbiBvZiB5b3VyIGNob2ljZS4KKworTm93IHBpY2sgb25lIG9mIHRoZSAiQnVpbGQgYW5kIGluc3RhbGwgdGFyZ2V0IGxpYnJhcmllcyIgYmVsb3cgdG8gY29udGludWUuCisKKyAKKyMjIFNldHVwIGZyb20gc291cmNlIHZpYSBWaXN1YWwgU3R1ZGlvIEMrKyAocmVjb21tZW5kZWQpCisKKyMjIyBSZXF1aXJlbWVudHMKKworVGhyaWZ0J3MgY29tcGlsZXIgaXMgd3JpdHRlbiBpbiBDKysgYW5kIGRlc2lnbmVkIHRvIGJlIHBvcnRhYmxlLCBidXQgdGhlcmUgYXJlIHNvbWUgc3lzdGVtIHJlcXVpcmVtZW50cy4gVGhyaWZ0J3MgcnVudGltZSBsaWJyYXJpZXMgYXJlIHdyaXR0ZW4gaW4gdmFyaW91cyBsYW5ndWFnZXMsIHdoaWNoIGFyZSBhbHNvIHJlcXVpcmVkIGZvciB0aGUgcGFydGljdWxhciBsYW5ndWFnZSBpbnRlcmZhY2UuCisKKyAqIFZpc3VhbCBTdHVkaW8gQysrLCBhbnkgcmVjZW50IHZlcnNpb24gc2hvdWxkIGRvCisgKiBGbGV4IGFuZCBCaXNvbiwgZS5nLiB0aGUgV2luRmxleEJpc29uIHBhY2thZ2UKICAqIFtBcGFjaGUgVGhyaWZ0IFJlcXVpcmVtZW50c10oL2RvY3MvaW5zdGFsbCkKIAotVGhyaWZ0J3MgcnVudGltZSBsaWJyYXJpZXMgYXJlIHdyaXR0ZW4gaW4gdmFyaW91cyBsYW5ndWFnZXMsIHdoaWNoIGFyZSBhbHNvIHJlcXVpcmVkIGZvciB0aGUgcGFydGljdWxhciBsYW5ndWFnZSBpbnRlcmZhY2UuCisjIyMgQnVpbGQgYW5kIGluc3RhbGwgdGhlIGNvbXBpbGVyCisgCitBZnRlciBhbGwgcmVxdWlyZW1lbnRzIGFyZSBpbiBwbGFjZSwgdXNlIHRoZSBgY29tcGlsZXIvY3BwL2NvbXBpbGVyLnZjeHByb2pgIGJ1aWxkIHByb2plY3QgdG8gYnVpbGQgdGhlIFRocmlmdCBjb21waWxlci4gQ29weSB0aGUgcmVzdWx0aW5nIEVYRSBmaWxlIHRvIGEgbG9jYXRpb24gb2YgeW91ciBjaG9pY2UuIAorCisjIyMgQnVpbGQgYW5kIGluc3RhbGwgdGFyZ2V0IGxpYnJhcmllcworCitBIGZldyBvZiB0aGUgdGFyZ2V0IGxhbmd1YWdlIGxpYnJhcmllcyBhbHNvIGRvIHByb3ZpZGUgVmlzdWFsIFN0dWRpbyBwcm9qZWN0IGZpbGVzLCBzdWNoIGFzIEMrKyBhbmQgQyMuIFRoZXNlIGFyZSBsb2NhdGVkIGluIHRoZSBgbGliLzxsYW5ndWFnZT4vYCBmb2xkZXJzLiAKKworTW9zdCBvZiB0aGUgbGFuZ3VhZ2UgcGFja2FnZXMgbXVzdCBiZSBidWlsdCBhbmQgaW5zdGFsbGVkIG1hbnVhbGx5IHVzaW5nIGJ1aWxkIHRvb2xzIGJldHRlciBzdWl0ZWQgdG8gdGhvc2UgbGFuZ3VhZ2VzLiBUeXBpY2FsIGV4YW1wbGVzIGFyZSBKYXZhLCBSdWJ5LCBEZWxwaGksIG9yIFBIUC4gTG9vayBmb3IgdGhlIGBSRUFETUUubWRgIGZpbGUgaW4gdGhlIGBsaWIvPGxhbmd1YWdlPi9gIGZvbGRlciBmb3IgbW9yZSBkZXRhaWxzIG9uIGhvdyB0byBidWlsZCBhbmQgaW5zdGFsbCBlYWNoIGxhbmd1YWdlJ3MgbGlicmFyeSBwYWNrYWdlLgorIAorCisjIyBTZXR1cCBmcm9tIHNvdXJjZSB2aWEgQ3lnd2luCisKKyMjIyBSZXF1aXJlbWVudHMKKworVGhyaWZ0J3MgY29tcGlsZXIgaXMgd3JpdHRlbiBpbiBDKysgYW5kIGRlc2lnbmVkIHRvIGJlIHBvcnRhYmxlLCBidXQgdGhlcmUgYXJlIHNvbWUgc3lzdGVtIHJlcXVpcmVtZW50cy4gVGhyaWZ0J3MgcnVudGltZSBsaWJyYXJpZXMgYXJlIHdyaXR0ZW4gaW4gdmFyaW91cyBsYW5ndWFnZXMsIHdoaWNoIGFyZSBhbHNvIHJlcXVpcmVkIGZvciB0aGUgcGFydGljdWxhciBsYW5ndWFnZSBpbnRlcmZhY2UuCisKKyAqIEN5Z3dpbiBvciBNaW5HVyAKKyAqIFtBcGFjaGUgVGhyaWZ0IFJlcXVpcmVtZW50c10oL2RvY3MvaW5zdGFsbCkKIAogIyMjIEluc3RhbGxpbmcgZnJvbSBzb3VyY2UKKwogSWYgeW91IGFyZSBidWlsZGluZyBmcm9tIHRoZSBmaXJzdCB0aW1lIG91dCBvZiB0aGUgc291cmNlIHJlcG9zaXRvcnksIHlvdSB3aWxsIG5lZWQgdG8gZ2VuZXJhdGUgdGhlIGNvbmZpZ3VyZSBzY3JpcHRzLiAgKFRoaXMgaXMgbm90IG5lY2Vzc2FyeSBpZiB5b3UgZG93bmxvYWRlZCBhIHRhcmJhbGwuKSAgRnJvbSB0aGUgdG9wIGRpcmVjdG9yeSwgZG86CiAKIAkuL2Jvb3RzdHJhcC5zaApAQCAtMzIsMTQgKzY2LDE2IEBACiAJbWFrZQogCW1ha2UgaW5zdGFsbAogCi1Tb21lIGxhbmd1YWdlIHBhY2thZ2VzIG11c3QgYmUgaW5zdGFsbGVkIG1hbnVhbGx5IHVzaW5nIGJ1aWxkIHRvb2xzIGJldHRlciBzdWl0ZWQgdG8gdGhvc2UgbGFuZ3VhZ2VzIChhdCB0aGUgdGltZSBvZiB0aGlzIHdyaXRpbmcsIHRoaXMgYXBwbGllcyB0byBKYXZhLCBSdWJ5LCBQSFApLgorIyMjIEJ1aWxkIGFuZCBpbnN0YWxsIHRhcmdldCBsaWJyYXJpZXMKIAotTG9vayBmb3IgdGhlIFJFQURNRSBmaWxlIGluIHRoZSBgbGliLzxsYW5ndWFnZT4vYCBmb2xkZXIgZm9yIG1vcmUgZGV0YWlscyBvbiB0aGUgaW5zdGFsbGF0aW9uIG9mIGVhY2ggbGFuZ3VhZ2UgbGlicmFyeSBwYWNrYWdlLgorU29tZSBsYW5ndWFnZSBwYWNrYWdlcyBtdXN0IGJlIGluc3RhbGxlZCBtYW51YWxseSB1c2luZyBidWlsZCB0b29scyBiZXR0ZXIgc3VpdGVkIHRvIHRob3NlIGxhbmd1YWdlcy4gVHlwaWNhbCBleGFtcGxlcyBhcmUgSmF2YSwgUnVieSwgb3IgUEhQLiBMb29rIGZvciB0aGUgUkVBRE1FIGZpbGUgaW4gdGhlIGBsaWIvPGxhbmd1YWdlPi9gIGZvbGRlciBmb3IgbW9yZSBkZXRhaWxzIG9uIHRoZSBpbnN0YWxsYXRpb24gb2YgZWFjaCBsYW5ndWFnZSBsaWJyYXJ5IHBhY2thZ2UuCiAKICMjIyBQb3NzaWJsZSBpc3N1ZXMgd2l0aCBDeWd3aW4gaW5zdGFsbAorCiBTZWUgYWxzbyBQb3NzaWJsZSBpc3N1ZXMgd2l0aCBNaW5HVyBpbnN0YWxsLgogCiAjIyMjIFN5bnRheCBlcnJvciBpbiAuL2NvbmZpZ3VyZQorCiBUaGUgZm9sbG93aW5nIGVycm9yIG9jY3VycyBmb3Igc29tZSB1c2VycyB3aGVuIHJ1bm5pbmcgLi9jb25maWd1cmU6CiAKIAkuL2NvbmZpZ3VyZTogbGluZSAyMTE4Mzogc3ludGF4IGVycm9yIG5lYXIgdW5leHBlY3RlZCB0b2tlbiBgTU9OTywnCkBAIC01Miw2ICs4OCw3IEBACiBGaW5hbGx5LCByZS1ydW4gLi9ib290c3RyYXAuc2ggYW5kIC4vY29uZmlndXJlLiAgKE5vdGUgdGhhdCBwa2cubTQgaXMgY3JlYXRlZCBieSB0aGUgcGtnLWNvbmZpZyB0b29sLiAgSWYgeW91ciAvdXNyL3NoYXJlL2FjbG9jYWwgZGlyZWN0b3J5IGRvZXNuJ3QgY29udGFpbiB0aGUgcGtnLm00IGZpbGUsIHlvdSBtYXkgbm90IGhhdmUgcGtnLWNvbmZpZyBpbnN0YWxsZWQuKQogCiAjIyMjIEluc3RhbGxpbmcgcGVybCBydW50aW1lIGxpYnJhcmllcworCiBTb21ldGltZXMsIHRoZXJlIHdpbGwgYmUgYW4gZXJyb3IgZHVyaW5nIHRoZSBpbnN0YWxsIG9mIHRoZSBwZXJsIGxpYnJhcmllcyB3aXRoIGNobW9kLgogCiBBIHdvcmthcm91bmQgaXMgdG8gYXZvaWQgaW5zdGFsbGluZyB0aGUgcGVybCBsaWJyYXJpZXMgaWYgdGhleSBhcmUgbm90IG5lZWRlZC4KQEAgLTYzLDYgKzEwMCw3IEBACiAJVE9ETwogCiAjIyMjIExpbmtpbmcgdG8gaW5zdGFsbGVkIEMrKyBydW50aW1lIGxpYnJhcmllcworCiBTb21ldGltZXMsIHRoZSBpbnN0YWxsZWQgbGlidGhyaWZ0LmEgd2lsbCBub3QgbGluayB1c2luZyBnKyssIHdpdGggbGlua2VyIGVycm9ycyBhYm91dCBtaXNzaW5nIHZ0YWJsZXMgYW5kIGV4Y2VwdGlvbnMgZm9yIFRocmlmdCBjbGFzc2VzLgogCiBBIHdvcmthcm91bmQgaXMgdG8gbGluayB0aGUgY29tcGlsZWQgb2JqZWN0IGZpbGVzIGRpcmVjdGx5IGZyb20geW91ciBUaHJpZnQgYnVpbGQsIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1pc3NpbmcgY2xhc3Nlcy4KQEAgLTg0LDggKzEyMiwxNiBAQAogCiBUaGlzIGlzc3VlIHNob3VsZCBiZSBmaXhlZCBpbiBDeWd3aW4gdmVyc2lvbnMgYWZ0ZXIgMS43LjUtMSwgb3IgZysrIDQuNS4wLgogCi0jIyBJbnN0YWxsYXRpb24gZnJvbSBTb3VyY2UgKE5vIEN5Z3dpbiBkZXBlbmRlbmN5KQotVG8gY29tcGlsZSB0aGUgVGhyaWZ0IGdlbmVyYXRvciAmIHJ1bnRpbWUgbGlicmFyaWVzICh1bnRlc3RlZCkgd2l0aG91dCB0aGUgY3lnd2luLmRsbCBkZXBlbmRlbmN5IHlvdSBuZWVkIHRvIGluc3RhbGwgIE1pbkdXICh3d3cubWluZ3cub3JnKS4gSW4gYWRkaXRpb24geW91IG5lZWQgdG8gYWRkIHRoZSBmb2xsb3dpbmcgZW50cnkgdG8geW91ciB3aW5kb3dzIFBBVEggdmFyaWFibGUuCisjIyBTZXR1cCBmcm9tIHNvdXJjZSB2aWEgTWluR1cKKworIyMjIFJlcXVpcmVtZW50cworCitUbyBjb21waWxlIHRoZSBUaHJpZnQgZ2VuZXJhdG9yICYgcnVudGltZSBsaWJyYXJpZXMgKHVudGVzdGVkKSB3aXRob3V0IHRoZSBjeWd3aW4uZGxsIGRlcGVuZGVuY3kgeW91IG5lZWQgdG8gaW5zdGFsbCBNaW5HVyAod3d3Lm1pbmd3Lm9yZykuIAorCisgKiBNaW5HVyAKKyAqIFtBcGFjaGUgVGhyaWZ0IFJlcXVpcmVtZW50c10oL2RvY3MvaW5zdGFsbCkKKworSW4gYWRkaXRpb24geW91IG5lZWQgdG8gYWRkIHRoZSBmb2xsb3dpbmcgZW50cnkgdG8geW91ciB3aW5kb3dzIFBBVEggdmFyaWFibGUuCiAKIAlDOlxNSU5HV1xCSU4KIAkKQEAgLTk5LDcgKzE0NSw3IEBACiAKIE1ha2Ugc3VyZSB5b3UgaGF2ZSBqYXZhIGluIHlvdXIgJFBBVEggdmFyaWFibGUsIGlmIG5vdCBkbyhhZGp1c3QgcGF0aCBpZiBuZWNlc3NhcnkpOgogCi0JZXhwb3J0IFBBVEg9JFBBVEg6Ii9jeWdkcml2ZS9jL3Byb2dyYW0gZmlsZXMvamF2YS9qcmUxLjYuMF8wNS9iaW4iCisJZXhwb3J0IFBBVEg9JFBBVEg6Ii9jeWdkcml2ZS9jL3Byb2dyYW0gZmlsZXMvamF2YS9qcmUxLjguMF8xOTEvYmluIgogCiBSdW4gY29uZmlndXJlIC0gdXNpbmcgQ1hYRkxBR1MgdG8gd29yayBhcm91bmQgYW4gaXNzdWUgd2l0aCBhbiBvbGQgcHRocmVhZHMgZGVmaW5lICh1bnRlc3RlZCBvbiBNaW5HVyAtIHdvcmtzIG9uIEN5Z3dpbik6CiAKQEAgLTExNSwxNyArMTYxLDIxIEBACiAJbWluZ3czMi1tYWtlLmV4ZQogCiAjIyMgUG9zc2libGUgaXNzdWVzIHdpdGggTWluR1cgaW5zdGFsbAorCiBTZWUgYWxzbyBQb3NzaWJsZSBpc3N1ZXMgd2l0aCBDeWd3aW4gaW5zdGFsbCwgaW5jbHVkaW5nIHRoZSBkaXNjdXNzaW9uIGFib3V0IFBUSFJFQURfTVVURVhfUkVDVVJTSVZFX05QLgogCiAjIyMjIHl5d3JhcCBpcyBub3QgZm91bmQKKwogTWFrZSBzdXJlIHlvdSBhZGQgLWxmbCBpbiB5b3VyIGN4eGZsYWdzIGluIE1ha2VmaWxlLCBhbHNvIHRyeSBhZGRpbmcgLUxjOi9jeWd3aW4vbGlicwogCiAjIyMjIGJvb3N0IGlzIG5vdCBmb3VuZAorCiBUcnkgYW5kIGNoYW5nZSB0aGUgaW5jbHVkZSBkaXIgdG8gdXNlIHRoZSB3aW5kb3dzIHBhdGggZnJvbSBjIGxpa2UgdGhpczogRWRpdCBjb21waWxlci9jcHAvTWFrZWZpbGUsIGxvb2sgZm9yIHRoZSBkZWNsYXJhdGlvbiBvZiBCT09TVF9DUFBGTEFHUywgY2hhbmdlIHRoYXQgbGluZSBmb3IKIAotCUJPT1NUX0NQUEZMQUdTID0gLUljOi9jeWd3aW4vdXNyL2luY2x1ZGUvYm9vc3QtMV8zM18xCisJQk9PU1RfQ1BQRkxBR1MgPSAtSWM6L2N5Z3dpbi91c3IvaW5jbHVkZS9ib29zdC0xXzUzXzAKIAkKICMjIyMgcmVhbHBhdGggaXMgbm90IGZvdW5kCisKIGFkZCAtRE1JTkdXIC1tbm8tY3lnd2luIHRvIHRoZSBDWFhERUZTIHZhcmlhYmxlIGluIE1ha2VmaWxlCiAKICMjIEFkZGl0aW9uYWwgcmVhZGluZwpkaWZmIC0tZ2l0IGEvZG9jL3NwZWNzL0hlYWRlckZvcm1hdC5tZCBiL2RvYy9zcGVjcy9IZWFkZXJGb3JtYXQubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJlYzdhZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zcGVjcy9IZWFkZXJGb3JtYXQubWQKQEAgLTAsMCArMSw4MiBAQAorPGxpbmsgaHJlZj0iaHR0cDovL2tldmluYnVya2UuYml0YnVja2V0Lm9yZy9tYXJrZG93bmNzcy9tYXJrZG93bi5jc3MiIHJlbD0ic3R5bGVzaGVldCI+PC9saW5rPgorCitIZWFkZXIgZm9ybWF0IGZvciB0aGUgVEhlYWRlci5oCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAgIDAgMSAyIDMgNCA1IDYgNyA4IDkgYSBiIGMgZCBlIGYgMCAxIDIgMyA0IDUgNiA3IDggOSBhIGIgYyBkIGUgZgorICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgIHwgMHwgICAgICAgICAgICAgICAgICAgICAgICAgIExFTkdUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgIHwgMHwgICAgICAgSEVBREVSIE1BR0lDICAgICAgICAgIHwgICAgICAgICAgICBGTEFHUyAgICAgICAgICAgICAgfAorICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgU0VRVUVOQ0UgTlVNQkVSICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgIHwgMHwgICAgIEhlYWRlciBTaXplKC8zMikgICAgICAgIHwgLi4uCisgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgICAgICAgSGVhZGVyIGlzIG9mIHZhcmlhYmxlIHNpemU6CisgICAgICAgICAgICAgICAgICAgICAgIChhbmQgc3RhcnRzIGF0IG9mZnNldCAxNCkKKworICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgIHwgICAgICAgICBQUk9UT0NPTCBJRCAgKHZhcmludCkgIHwgICBOVU0gVFJBTlNGT1JNUyAodmFyaW50KSAgICAgfAorICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgIHwgICAgICBUUkFOU0ZPUk0gMCBJRCAodmFyaW50KSAgIHwgICAgICAgIFRSQU5TRk9STSAwIERBVEEgLi4uCisgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgfCAgICAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLiAgICAgICAgICAgICAgICAgICB8CisgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgfCAgICAgICAgSU5GTyAwIElEICh2YXJpbnQpICAgICAgfCAgICAgICBJTkZPIDAgIERBVEEgLi4uCisgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgfCAgICAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLiAgICAgICAgICAgICAgICAgICB8CisgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBWUxPQUQgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisKK1RoZSBgTEVOR1RIYCBmaWVsZCBpcyAzMiBiaXRzLCBhbmQgY291bnRzIHRoZSByZW1haW5pbmcgYnl0ZXMgaW4gdGhlCitwYWNrZXQsIE5PVCBpbmNsdWRpbmcgdGhlIGxlbmd0aCBmaWVsZC4gIFRoZSBoZWFkZXIgc2l6ZSBmaWVsZCBpcyAxNgorYml0cywgYW5kIGRlZmluZXMgdGhlIHNpemUgb2YgdGhlIGhlYWRlciByZW1haW5pbmcgTk9UIGluY2x1ZGluZyB0aGUKK2BIRUFERVIgTUFHSUNgLCBgRkxBR1NgLCBgU0VRVUVOQ0UgTlVNQkVSYCBhbmQgaGVhZGVyIHNpemUgZmllbGRzLiAgVGhlCitIZWFkZXIgc2l6ZSBmaWVsZCBpcyBpbiBieXRlcy80LgorCitUaGUgdHJhbnNmb3JtIElEJ3MgYXJlIHZhcmludHMuICBUaGUgZGF0YSBmb3IgZWFjaCB0cmFuc2Zvcm0gaXMKK2RlZmluZWQgYnkgdGhlIHRyYW5zZm9ybSBJRCBpbiB0aGUgY29kZSAtIG5vIHNpemUgaXMgZ2l2ZW4gaW4gdGhlCitoZWFkZXIuICBJZiBhIHRyYW5zZm9ybSBJRCBpcyBzcGVjaWZpZWQgZnJvbSBhIGNsaWVudCBhbmQgdGhlIHNlcnZlcgorZG9lc24ndCBrbm93IGFib3V0IHRoZSB0cmFuc2Zvcm0gSUQsIGFuIGVycm9yIE1VU1QgYmUgcmV0dXJuZWQgYXMgd2UKK2Rvbid0IGtub3cgaG93IHRvIHRyYW5zZm9ybSB0aGUgZGF0YS4KKworQ29udmVyc2VseSwgZGF0YSBpbiB0aGUgaW5mbyBoZWFkZXJzIGlzIGlnbm9yYWJsZS4gIFRoaXMgc2hvdWxkIG9ubHkKK2JlIHRoaW5ncyBsaWtlIHRpbWVzdGFtcHMsIGRlYnVnaW5nIHRyYWNpbmcsIGV0Yy4gIFVzaW5nIHRoZSBoZWFkZXIKK3NpemUgeW91IHNob3VsZCBiZSBhYmxlIHRvIHNraXAgdGhpcyBkYXRhIGFuZCByZWFkIHRoZSBwYXlsb2FkIHNhZmVseQoraWYgeW91IGRvbid0IGtub3cgdGhlIGluZm8gSUQuCisKK0luZm8ncyBzaG91bGQgYmUgb2xkZXN0IHN1cHBvcnRlZCB0byBuZXdlc3Qgc3VwcG9ydGVkIG9yZGVyLCBzbyB0aGF0CitpZiB3ZSByZWFkIGFuIGluZm8gSUQgd2UgZG9uJ3Qgc3VwcG9ydCwgbm9uZSBvZiB0aGUgcmVtYWluaW5nIGluZm8KK0lEJ3Mgd2lsbCBiZSBzdXBwb3J0ZWQgZWl0aGVyLCBhbmQgd2UgY2FuIHNhZmVseSBza2lwIHRvIHRoZSBwYXlsb2FkLgorCitJbmZvIElEJ3MgYW5kIHRyYW5zZm9ybSBJRCdzIHNob3VsZCBzaGFyZSB0aGUgc2FtZSBJRCBzcGFjZS4KKworIyMjIFBBRERJTkc6CisKK0hlYWRlciB3aWxsIGJlIHBhZGRlZCBvdXQgdG8gbmV4dCA0LWJ5dGUgYm91bmRhcnkgd2l0aCBgMHgwMGAuCisKK01heCBmcmFtZSBzaXplIGlzIGAweDNGRkZGRkZGYCwgd2hpY2ggaXMgc2xpZ2h0bHkgbGVzcyB0aGFuIGBIVFRQX01BR0lDYC4KK1RoaXMgYWxsb3dzIHVzIHRvIGRpc3Rpbmd1c2ggYmV0d2VlbiBkaWZmZXJlbnQgKG9sZGVyKSB0cmFuc3BvcnRzLgorCisjIyMgVHJhbnNmb3JtIElEczoKKworICAgIFpMSUJfVFJBTlNGT1JNIDB4MDEgLSBObyBkYXRhIGZvciB0aGlzLiAgVXNlIHpsaWIgdG8gKGRlKWNvbXByZXNzIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLgorCisgICAgSE1BQ19UUkFOU0ZPUk0gMHgwMiAtIFZhcmlhYmxlIGFtb3VudCBvZiBtYWMgZGF0YS4gIE9uZSBieXRlIHRvIHNwZWNpZnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZS4gTWFjIGRhdGEgaXMgYXBwZW5kZWQgYXQgdGhlIGVuZCBvZiB0aGUgcGFja2V0LgorICAgIFNOQVBQWV9UUkFOU0ZPUk0gIDB4MDMgIC0gTm8gZGF0YSBmb3IgdGhpcy4gIFVzZSBzbmFwcHkgdG8gKGRlKWNvbXByZXNzIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLgorCisKKyMjI0luZm8gSURzOgorCisgICAgSU5GT19LRVlWQUxVRSAweDAxIC0gdmFyaW50MzIgbnVtYmVyIG9mIGhlYWRlcnMuCisgICAgICAgICAgICAgICAgICAgICAgIC0ga2V5L3ZhbHVlIHBhaXJzIG9mIHZhcnN0cmluZ3MgKHZhcmludDE2IGxlbmd0aCBwbHVzCisgICAgICAgICAgICAgICAgICAgICAgICAgbm8tdHJhaWxpbmctbnVsbCBzdHJpbmcpLgorCmRpZmYgLS1naXQgYS9kb2Mvc3BlY3MvaWRsLm1kIGIvZG9jL3NwZWNzL2lkbC5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjIyZjU0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NwZWNzL2lkbC5tZApAQCAtMCwwICsxLDI3MiBAQAorIyMgVGhyaWZ0IGludGVyZmFjZSBkZXNjcmlwdGlvbiBsYW5ndWFnZQorVGhlIFRocmlmdCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBsYW5ndWFnZSAoSURMKSBhbGxvd3MgZm9yIHRoZSBkZWZpbml0aW9uIG9mIFtUaHJpZnQgVHlwZXNdKC9kb2NzL3R5cGVzKS4gQSBUaHJpZnQgSURMIGZpbGUgaXMgcHJvY2Vzc2VkIGJ5IHRoZSBUaHJpZnQgY29kZSBnZW5lcmF0b3IgdG8gcHJvZHVjZSBjb2RlIGZvciB0aGUgdmFyaW91cyB0YXJnZXQgbGFuZ3VhZ2VzIHRvIHN1cHBvcnQgdGhlIGRlZmluZWQgc3RydWN0cyBhbmQgc2VydmljZXMgaW4gdGhlIElETCBmaWxlLgorCisjIyBEZXNjcmlwdGlvbgorCisqVW5kZXIgY29uc3RydWN0aW9uKgorCitIZXJlIGlzIGEgZGVzY3JpcHRpb24gb2YgdGhlIFRocmlmdCBJREwuCisKKyMjIERvY3VtZW50CisKK0V2ZXJ5IFRocmlmdCBkb2N1bWVudCBjb250YWlucyAwIG9yIG1vcmUgaGVhZGVycyBmb2xsb3dlZCBieSAwIG9yIG1vcmUgZGVmaW5pdGlvbnMuCisKKyAgICBbMV0gIERvY3VtZW50ICAgICAgICA6Oj0gIEhlYWRlciogRGVmaW5pdGlvbioKKworIyMgSGVhZGVyCisKK0EgaGVhZGVyIGlzIGVpdGhlciBhIFRocmlmdCBpbmNsdWRlLCBhIEMrKyBpbmNsdWRlLCBvciBhIG5hbWVzcGFjZSBkZWNsYXJhdGlvbi4KKworICAgIFsyXSAgSGVhZGVyICAgICAgICAgIDo6PSAgSW5jbHVkZSB8IENwcEluY2x1ZGUgfCBOYW1lc3BhY2UKKworIyMjIFRocmlmdCBJbmNsdWRlCisKK0FuIGluY2x1ZGUgbWFrZXMgYWxsIHRoZSBzeW1ib2xzIGZyb20gYW5vdGhlciBmaWxlIHZpc2libGUgKHdpdGggYSBwcmVmaXgpIGFuZCBhZGRzIGNvcnJlc3BvbmRpbmcgaW5jbHVkZSBzdGF0ZW1lbnRzIGludG8gdGhlIGNvZGUgZ2VuZXJhdGVkIGZvciB0aGlzIFRocmlmdCBkb2N1bWVudC4KKworICAgIFszXSAgSW5jbHVkZSAgICAgICAgIDo6PSAgJ2luY2x1ZGUnIExpdGVyYWwKKworIyMjIEMrKyBJbmNsdWRlCisKK0EgQysrIGluY2x1ZGUgYWRkcyBhIGN1c3RvbSBDKysgaW5jbHVkZSB0byB0aGUgb3V0cHV0IG9mIHRoZSBDKysgY29kZSBnZW5lcmF0b3IgZm9yIHRoaXMgVGhyaWZ0IGRvY3VtZW50LiAKKworICAgIFs0XSAgQ3BwSW5jbHVkZSAgICAgIDo6PSAgJ2NwcF9pbmNsdWRlJyBMaXRlcmFsCisKKyMjIyBOYW1lc3BhY2UKKworQSBuYW1lc3BhY2UgZGVjbGFyZXMgd2hpY2ggbmFtZXNwYWNlcy9wYWNrYWdlL21vZHVsZS9ldGMuIHRoZSB0eXBlIGRlZmluaXRpb25zIGluIHRoaXMgZmlsZSB3aWxsIGJlIGRlY2xhcmVkIGluIGZvciB0aGUgdGFyZ2V0IGxhbmd1YWdlcy4gVGhlIG5hbWVzcGFjZSBzY29wZSBpbmRpY2F0ZXMgd2hpY2ggbGFuZ3VhZ2UgdGhlIG5hbWVzcGFjZSBhcHBsaWVzIHRvOyBhIHNjb3BlIG9mICcqJyBpbmRpY2F0ZXMgdGhhdCB0aGUgbmFtZXNwYWNlIGFwcGxpZXMgdG8gYWxsIHRhcmdldCBsYW5ndWFnZXMuCisKKyAgICBbNV0gIE5hbWVzcGFjZSAgICAgICA6Oj0gICggJ25hbWVzcGFjZScgKCBOYW1lc3BhY2VTY29wZSBJZGVudGlmaWVyICkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICdzbWFsbHRhbGsuY2F0ZWdvcnknIFNUSWRlbnRpZmllciApIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAnc21hbGx0YWxrLnByZWZpeCcgSWRlbnRpZmllciApICkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAncGhwX25hbWVzcGFjZScgTGl0ZXJhbCApIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggJ3hzZF9uYW1lc3BhY2UnIExpdGVyYWwgKQorCisgICAgWzZdICBOYW1lc3BhY2VTY29wZSAgOjo9ICAnKicgfCAnY3BwJyB8ICdqYXZhJyB8ICdweScgfCAncGVybCcgfCAncmInIHwgJ2NvY29hJyB8ICdjc2hhcnAnCisKK04uQi46IFNtYWxsdGFsayBoYXMgdHdvIGRpc3RpbmN0IHR5cGVzIG9mIG5hbWVzcGFjZSBjb21tYW5kczoKKworLSBzbWFsbHRhbGsucHJlZml4OiBQcmVwZW5kZWQgdG8gZ2VuZXJhdGVkIGNsYXNzbmFtZXMuCisgIC0gU21hbGx0YWxrIGRvZXMgbm90IGhhdmUgbmFtZXNwYWNlcyBmb3IgY2xhc3Nlcywgc28gcHJlZml4ZXMKKyAgICBhcmUgdXNlZCB0byBhdm9pZCBjbGFzcy1uYW1lIGNvbGxpc2lvbnMuCisgICAgT2Z0ZW4sIHRoZSBwcmVmaXggaXMgdGhlIGF1dGhvcidzIGluaXRpYWxzLCBsaWtlICJLQiIgb3IgIkpXUyIsCisgICAgb3IgYW4gYWJicmV2aWF0aW9uIG9mIHRoZSBwYWNrYWdlIG5hbWUsIGxpa2UgIk1DIiBmb3IgIk1vbnRpY2VsbG8iLgorLSBzbWFsbHRhbGsuY2F0ZWdvcnk6IERldGVybWluZXMgdGhlIGNhdGVnb3J5IGZvciBnZW5lcmF0ZWQgY2xhc3Nlcy4KKyAgQW55IGRvdHMgaW4gdGhlIGlkZW50aWZpZXIgd2lsbCBiZSByZXBsYWNlZCB3aXRoIGh5cGhlbnMgd2hlbiBnZW5lcmF0aW5nCisgIHRoZSBjYXRlZ29yeSBuYW1lLgorICBJZiBub3QgcHJvdmlkZWQsIGRlZmF1bHRzIHRvICJHZW5lcmF0ZWQtIiArIHRoZSBwcm9ncmFtIG5hbWUuCisgIE1ldGhvZHMgd2lsbCBub3QgYmUgY2F0ZWdvcml6ZWQgYmV5b25kICJhcyB5ZXQgdW5jYXRlZ29yaXplZCIuCisgIC0gU21hbGx0YWxrIGFsbG93cyBmaWxpbmcgYm90aCBjbGFzc2VzIGFuZCBtZXRob2RzIHdpdGhpbiBjbGFzc2VzIGludG8gbmFtZWQKKyAgICBncm91cHMuIFRoZXNlIG5hbWVkIGdyb3VwcyBvZiBtZXRob2RzIGFyZSBjYWxsZWQgY2F0ZWdvcmllcy4KKworTi5CLjogVGhlIGBwaHBfbmFtZXNwYWNlYCBkaXJlY3RpdmUgd2lsbCBiZSBkZXByZWNhdGVkIGF0IHNvbWUgcG9pbnQgaW4gdGhlIGZ1dHVyZSBpbiBmYXZvciBvZiB0aGUgc2NvcGVkIHN5bnRheCwgYnV0IHRoZSBzY29wZWQgc3ludGF4IGlzIG5vdCB5ZXQgc3VwcG9ydGVkIGZvciBQSFAuCisKK04uQi46IFRoZSBgeHNkX25hbWVzcGFjZWAgZGlyZWN0aXZlIGhhcyBzb21lIHB1cnBvc2UgaW50ZXJuYWwgdG8gRmFjZWJvb2sgYnV0IHNlcnZlcyBubyBwdXJwb3NlIGluIFRocmlmdCBpdHNlbGYuIFVzZSBvZiB0aGlzIGZlYXR1cmUgaXMgc3Ryb25nbHkgZGlzY291cmFnZWQKKworIyMgRGVmaW5pdGlvbgorCisgICAgWzddICBEZWZpbml0aW9uICAgICAgOjo9ICBDb25zdCB8IFR5cGVkZWYgfCBFbnVtIHwgU2VudW0gfCBTdHJ1Y3QgfCBVbmlvbiB8IEV4Y2VwdGlvbiB8IFNlcnZpY2UKKworIyMjIENvbnN0CisKKyAgICBbOF0gIENvbnN0ICAgICAgICAgICA6Oj0gICdjb25zdCcgRmllbGRUeXBlIElkZW50aWZpZXIgJz0nIENvbnN0VmFsdWUgTGlzdFNlcGFyYXRvcj8KKworIyMjIFR5cGVkZWYKKworQSB0eXBlZGVmIGNyZWF0ZXMgYW4gYWx0ZXJuYXRlIG5hbWUgZm9yIGEgdHlwZS4KKworICAgIFs5XSAgVHlwZWRlZiAgICAgICAgIDo6PSAgJ3R5cGVkZWYnIERlZmluaXRpb25UeXBlIElkZW50aWZpZXIKKworIyMjIEVudW0KKworQW4gZW51bSBjcmVhdGVzIGFuIGVudW1lcmF0ZWQgdHlwZSwgd2l0aCBuYW1lZCB2YWx1ZXMuIElmIG5vIGNvbnN0YW50IHZhbHVlIGlzIHN1cHBsaWVkLCB0aGUgdmFsdWUgaXMgZWl0aGVyIDAgZm9yIHRoZSBmaXJzdCBlbGVtZW50LCBvciBvbmUgZ3JlYXRlciB0aGFuIHRoZSBwcmVjZWRpbmcgdmFsdWUgZm9yIGFueSBzdWJzZXF1ZW50IGVsZW1lbnQuIEFueSBjb25zdGFudCB2YWx1ZSB0aGF0IGlzIHN1cHBsaWVkIG11c3QgYmUgbm9uLW5lZ2F0aXZlLgorCisgICAgWzEwXSBFbnVtICAgICAgICAgICAgOjo9ICAnZW51bScgSWRlbnRpZmllciAneycgKElkZW50aWZpZXIgKCc9JyBJbnRDb25zdGFudCk/IExpc3RTZXBhcmF0b3I/KSogJ30nCisKKyMjIyBTZW51bQorCitTZW51bSAoYW5kIFNsaXN0KSBhcmUgbm93IGRlcHJlY2F0ZWQgYW5kIHNob3VsZCBib3RoIGJlIHJlcGxhY2VkIHdpdGggU3RyaW5nLgorCisgICAgWzExXSBTZW51bSAgICAgICAgICAgOjo9ICAnc2VudW0nIElkZW50aWZpZXIgJ3snIChMaXRlcmFsIExpc3RTZXBhcmF0b3I/KSogJ30nCisKKyMjIyBTdHJ1Y3QKKworU3RydWN0cyBhcmUgdGhlIGZ1bmRhbWVudGFsIGNvbXBvc2l0aW9uYWwgdHlwZSBpbiBUaHJpZnQuIFRoZSBuYW1lIG9mIGVhY2ggZmllbGQgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSBzdHJ1Y3QuCisKKyAgICBbMTJdIFN0cnVjdCAgICAgICAgICA6Oj0gICdzdHJ1Y3QnIElkZW50aWZpZXIgJ3hzZF9hbGwnPyAneycgRmllbGQqICd9JworCitOLkIuOiBUaGUgYHhzZF9hbGxgIGtleXdvcmQgaGFzIHNvbWUgcHVycG9zZSBpbnRlcm5hbCB0byBGYWNlYm9vayBidXQgc2VydmVzIG5vIHB1cnBvc2UgaW4gVGhyaWZ0IGl0c2VsZi4gVXNlIG9mIHRoaXMgZmVhdHVyZSBpcyBzdHJvbmdseSBkaXNjb3VyYWdlZAorCisjIyMgVW5pb24KKworVW5pb25zIGFyZSBzaW1pbGFyIHRvIHN0cnVjdHMsIGV4Y2VwdCB0aGF0IHRoZXkgcHJvdmlkZSBhIG1lYW5zIHRvIHRyYW5zcG9ydCBleGFjdGx5IG9uZSBmaWVsZCBvZiBhIHBvc3NpYmxlIHNldCBvZiBmaWVsZHMsIGp1c3QgbGlrZSB1bmlvbiB7fSBpbiBDKysuIENvbnNlcXVlbnRseSwgdW5pb24gbWVtYmVycyBhcmUgaW1wbGljaXRseSBjb25zaWRlcmVkIG9wdGlvbmFsIChzZWUgcmVxdWlyZWRuZXNzKS4KKworICAgIFsxM10gVW5pb24gICAgICAgICAgOjo9ICAndW5pb24nIElkZW50aWZpZXIgJ3hzZF9hbGwnPyAneycgRmllbGQqICd9JworCitOLkIuOiBUaGUgYHhzZF9hbGxgIGtleXdvcmQgaGFzIHNvbWUgcHVycG9zZSBpbnRlcm5hbCB0byBGYWNlYm9vayBidXQgc2VydmVzIG5vIHB1cnBvc2UgaW4gVGhyaWZ0IGl0c2VsZi4gVXNlIG9mIHRoaXMgZmVhdHVyZSBpcyBzdHJvbmdseSBkaXNjb3VyYWdlZAorCisjIyMgRXhjZXB0aW9uCisKK0V4Y2VwdGlvbnMgYXJlIHNpbWlsYXIgdG8gc3RydWN0cyBleGNlcHQgdGhhdCB0aGV5IGFyZSBpbnRlbmRlZCB0byBpbnRlZ3JhdGUgd2l0aCB0aGUgbmF0aXZlIGV4Y2VwdGlvbiBoYW5kbGluZyBtZWNoYW5pc21zIGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2VzLiBUaGUgbmFtZSBvZiBlYWNoIGZpZWxkIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUgZXhjZXB0aW9uLgorCisgICAgWzE0XSBFeGNlcHRpb24gICAgICAgOjo9ICAnZXhjZXB0aW9uJyBJZGVudGlmaWVyICd7JyBGaWVsZCogJ30nCisKKyMjIyBTZXJ2aWNlCisKK0Egc2VydmljZSBwcm92aWRlcyB0aGUgaW50ZXJmYWNlIGZvciBhIHNldCBvZiBmdW5jdGlvbmFsaXR5IHByb3ZpZGVkIGJ5IGEgVGhyaWZ0IHNlcnZlci4gVGhlIGludGVyZmFjZSBpcyBzaW1wbHkgYSBsaXN0IG9mIGZ1bmN0aW9ucy4gQSBzZXJ2aWNlIGNhbiBleHRlbmQgYW5vdGhlciBzZXJ2aWNlLCB3aGljaCBzaW1wbHkgbWVhbnMgdGhhdCBpdCBwcm92aWRlcyB0aGUgZnVuY3Rpb25zIG9mIHRoZSBleHRlbmRlZCBzZXJ2aWNlIGluIGFkZGl0aW9uIHRvIGl0cyBvd24uCisKKyAgICBbMTVdIFNlcnZpY2UgICAgICAgICA6Oj0gICdzZXJ2aWNlJyBJZGVudGlmaWVyICggJ2V4dGVuZHMnIElkZW50aWZpZXIgKT8gJ3snIEZ1bmN0aW9uKiAnfScKKworIyMgRmllbGQKKworICAgIFsxNl0gRmllbGQgICAgICAgICAgIDo6PSAgRmllbGRJRD8gRmllbGRSZXE/IEZpZWxkVHlwZSBJZGVudGlmaWVyICgnPSBDb25zdFZhbHVlKT8gWHNkRmllbGRPcHRpb25zIExpc3RTZXBhcmF0b3I/CisKKyMjIyBGaWVsZCBJRAorCisgICAgWzE3XSBGaWVsZElEICAgICAgICAgOjo9ICBJbnRDb25zdGFudCAnOicKKworIyMjIEZpZWxkIFJlcXVpcmVkbmVzcworCitUaGVyZSBhcmUgdHdvIGV4cGxpY2l0IHJlcXVpcmVkbmVzcyB2YWx1ZXMsIGFuZCBhIHRoaXJkIG9uZSB0aGF0IGlzIGFwcGxpZWQgaW1wbGljaXR5IGlmIG5laXRoZXIgICpyZXF1aXJlZCogbm9yICpvcHRpb25hbCogYXJlIGdpdmVuOiAqZGVmYXVsdCogcmVxdWlyZWRuZXNzLgorCisgICAgWzE4XSBGaWVsZFJlcSAgICAgICAgOjo9ICAncmVxdWlyZWQnIHwgJ29wdGlvbmFsJyAKKworVGhlIGdlbmVyYWwgcnVsZXMgZm9yIHJlcXVpcmVkbmVzcyBhcmUgYXMgZm9sbG93czoKKworIyMjIyByZXF1aXJlZAorCistIFdyaXRlOiBSZXF1aXJlZCBmaWVsZHMgYXJlIGFsd2F5cyB3cml0dGVuIGFuZCBhcmUgZXhwZWN0ZWQgdG8gYmUgc2V0LgorLSBSZWFkOiBSZXF1aXJlZCBmaWVsZHMgYXJlIGFsd2F5cyByZWFkIGFuZCBhcmUgZXhwZWN0ZWQgdG8gYmUgY29udGFpbmVkIGluIHRoZSBpbnB1dCBzdHJlYW0uCistIERlZmF1bHRzIHZhbHVlczogYXJlIGFsd2F5cyB3cml0dGVuCisKK0lmIGEgcmVxdWlyZWQgZmllbGQgaXMgbWlzc2luZyBkdXJpbmcgcmVhZCwgdGhlIGV4cGVjdGVkIGJlaGF2aW91ciBpcyB0byBpbmRpY2F0ZSBhbiB1bnN1Y2Nlc3NmdWwgcmVhZCBvcGVyYXRpb24gdG8gdGhlIGNhbGxlciwgZS5nLiBieSB0aHJvd2luZyBhbiBleGNlcHRpb24gb3IgcmV0dXJuaW5nIGFuIGVycm9yLiAKKworQmVjYXVzZSBvZiB0aGlzIGJlaGF2aW91ciwgcmVxdWlyZWQgZmllbGRzIGRyYXN0aWNhbGx5IGxpbWl0IHRoZSBvcHRpb25zIHdpdGggcmVnYXJkIHRvIHNvZnQgdmVyc2lvbmluZy4gQmVjYXVzZSB0aGV5IG11c3QgYmUgcHJlc2VudCBvbiByZWFkLCB0aGUgZmllbGRzIGNhbm5vdCBiZSBkZXByZWNhdGVkLiBJZiBhIHJlcXVpcmVkIGZpZWxkIHdvdWxkIGJlIHJlbW92ZWQgKG9yIGNoYW5nZWQgdG8gb3B0aW9uYWwpLCB0aGUgZGF0YSBhcmUgbm8gbG9uZ2VyIGNvbXBhdGlibGUgYmV0d2VlbiB2ZXJzaW9ucy4KKwkKKyMjIyMgb3B0aW9uYWwKKworLSBXcml0ZTogT3B0aW9uYWwgZmllbGRzIGFyZSBvbmx5IHdyaXR0ZW4gd2hlbiB0aGV5IGFyZSBzZXQKKy0gUmVhZDogT3B0aW9uYWwgZmllbGRzIG1heSwgb3IgbWF5IG5vdCBiZSBwYXJ0IG9mIHRoZSBpbnB1dCBzdHJlYW0uIAorLSBEZWZhdWx0IHZhbHVlczogYXJlIHdyaXR0ZW4gd2hlbiB0aGUgaXNzZXQgZmxhZyBpcyBzZXQKKworTW9zdCBsYW5ndWFnZSBpbXBsZW1lbnRhdGlvbnMgdXNlIHRoZSByZWNvbW1lbmRlZCBwcmF0aWNlIG9mIHNvLWNhbGxlZCAiaXNzZXQiIGZsYWdzIHRvIGluZGljYXRlIHdoZXRoZXIgYSBwYXJ0aWN1bGFyIG9wdGlvbmFsIGZpZWxkIGlzIHNldCBvciBub3QuIE9ubHkgZmllbGRzIHdpdGggdGhpcyBmbGFnIHNldCBhcmUgd3JpdHRlbiwgYW5kIGNvbnZlcnNlbHkgdGhlIGZsYWcgaXMgb25seSBzZXQgd2hlbiBhIGZpZWxkIHZhbHVlIGhhcyBiZWVuIHJlYWQgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLiAKKwkKKyMjIyMgZGVmYXVsdCByZXF1aXJlZG5lc3MgKGltcGxpY2l0KQorCistIFdyaXRlOiBJbiB0aGVvcnksIHRoZSBmaWVsZHMgYXJlIGFsd2F5cyB3cml0dGVuLiBUaGVyZSBhcmUgc29tZSBleGNlcHRpb25zIHRvIHRoYXQgcnVsZSwgc2VlIGJlbG93LgorLSBSZWFkOiBMaWtlIG9wdGlvbmFsLCB0aGUgZmllbGQgbWF5LCBvciBtYXkgbm90IGJlIHBhcnQgb2YgdGhlIGlucHV0IHN0cmVhbS4gCistIERlZmF1bHQgdmFsdWVzOiBtYXkgbm90IGJlIHdyaXR0ZW4gKHNlZSBuZXh0IHNlY3Rpb24pCisKK0RlZmF1bHQgcmVxdWlyZWRuZXNzIGlzIGEgZ29vZCBzdGFydGluZyBwb2ludC4gVGhlIGRlc2lyZWQgYmVoYXZpb3VyIGlzIGEgbWl4IG9mIG9wdGlvbmFsIGFuZCByZXF1aXJlZCwgaGVuY2UgdGhlIGludGVybmFsIG5hbWUgIm9wdC1pbiwgcmVxLW91dCIuIEFsdGhvdWdoIGluIHRoZW9yeSB0aGVzZSBmaWVsZHMgYXJlIHN1cHBvc2VkIHRvIGJlIHdyaXR0ZW4gKCJyZXEtb3V0IiksIGluIHJlYWxpdHkgdW5zZXQgZmllbGRzIGFyZSBub3QgYWx3YXlzIHdyaXR0ZW4uIFRoaXMgaXMgZXNwZWNpYWxseSB0aGUgY2FzZSwgd2hlbiB0aGUgZmllbGQgY29udGFpbnMgYSA8bnVsbD4gdmFsdWUsIHdoaWNoIGJ5IGRlZmluaXRpb24gY2Fubm90IGJlIHRyYW5zcG9ydGVkIHRocm91Z2ggdGhyaWZ0LiBUaGUgb25seSB3YXkgdG8gYWNoaWV2ZSB0aGlzIGlzIGJ5IG5vdCB3cml0aW5nIHRoYXQgZmllbGQgYXQgYWxsLCBhbmQgdGhhdCdzIHdoYXQgbW9zdCBsYW5ndWFnZXMgZG8uCisJCisjIyMjIFNlbWFudGljcyBvZiBEZWZhdWx0IFZhbHVlcworCitUaGVyZSBhcmUgb25nb2luZyBkaXNjdXNzaW9ucyBhYm91dCB0aGF0IHRvcGljLCBzZWUgSklSQSBmb3IgZGV0YWlscy4gTm90IGFsbCBpbXBsZW1lbnRhdGlvbnMgdHJlYXQgZGVmYXVsdCB2YWx1ZXMgaW4gdGhlIHZlcnkgc2FtZSB3YXksIGJ1dCB0aGUgY3VycmVudCBzdGF0dXMgcXVvIGlzIG1vcmUgb3IgbGVzcyB0aGF0IGRlZmF1bHQgZmllbGRzIGFyZSB0eXBpY2FsbHkgc2V0IGF0IGluaXRpYWxpemF0aW9uIHRpbWUuIFRoZXJlZm9yZSwgYSB2YWx1ZSB0aGF0IGVxdWFscyB0aGUgZGVmYXVsdCBtYXkgbm90IGJlIHdyaXR0ZW4sIGJlY2F1c2UgdGhlIHJlYWQgZW5kIHdpbGwgc2V0IHRoZSB2YWx1ZSBpbXBsaWNpdGx5LiBPbiB0aGUgb3RoZXIgaGFuZCwgYW4gaW1wbGVtZW50YXRpb24gaXMgZnJlZSB0byB3cml0ZSB0aGUgZGVmYXVsdCB2YWx1ZSBhbnl3YXlzLCBhcyB0aGVyZSBpcyBubyBoYXJkIHJlc3RyaWN0aW9uIHRoYXQgcHJldmVudHMgdGhpcy4gCisKK1RoZSBtYWpvciBwb2ludCB0byBrZWVwIGluIG1pbmQgaGVyZSBpcyB0aGUgZmFjdCwgdGhhdCBhbnkgdW53cml0dGVuIGRlZmF1bHQgdmFsdWUgaW1wbGljaXRseSBiZWNvbWVzIHBhcnQgb2YgdGhlIGludGVyZmFjZSB2ZXJzaW9uLiBJZiB0aGF0IGRlZmF1bHQgaXMgY2hhbmdlZCwgdGhlIGludGVyZmFjZSBjaGFuZ2VzLiBJZiwgaW4gY29udHJhc3QsIHRoZSBkZWZhdWx0IHZhbHVlIGlzIHdyaXR0ZW4gaW50byB0aGUgb3V0cHV0IGRhdGEsIHRoZSBkZWZhdWx0IGluIHRoZSBJREwgY2FuIGNoYW5nZSBhdCBhbnkgdGltZSB3aXRob3V0IGFmZmVjdGluZyBzZXJpYWxpemVkIGRhdGEuCisKKyMjIyBYU0QgT3B0aW9ucworCitOLkIuOiBUaGVzZSBoYXZlICBzb21lIGludGVybmFsIHB1cnBvc2UgYXQgRmFjZWJvb2sgYnV0IHNlcnZlIG5vIGN1cnJlbnQgcHVycG9zZSBpbiBUaHJpZnQuIFVzZSBvZiB0aGVzZSBvcHRpb25zIGlzIHN0cm9uZ2x5IGRpc2NvdXJhZ2VkLgorCisgICAgWzE5XSBYc2RGaWVsZE9wdGlvbnMgOjo9ICAneHNkX29wdGlvbmFsJz8gJ3hzZF9uaWxsYWJsZSc/IFhzZEF0dHJzPworCisgICAgWzIwXSBYc2RBdHRycyAgICAgICAgOjo9ICAneHNkX2F0dHJzJyAneycgRmllbGQqICd9JworCisjIyBGdW5jdGlvbnMKKworICAgIFsyMV0gRnVuY3Rpb24gICAgICAgIDo6PSAgJ29uZXdheSc/IEZ1bmN0aW9uVHlwZSBJZGVudGlmaWVyICcoJyBGaWVsZCogJyknIFRocm93cz8gTGlzdFNlcGFyYXRvcj8KKworICAgIFsyMl0gRnVuY3Rpb25UeXBlICAgIDo6PSAgRmllbGRUeXBlIHwgJ3ZvaWQnCisKKyAgICBbMjNdIFRocm93cyAgICAgICAgICA6Oj0gICd0aHJvd3MnICcoJyBGaWVsZCogJyknCisKKyMjIFR5cGVzCisKKyAgICBbMjRdIEZpZWxkVHlwZSAgICAgICA6Oj0gIElkZW50aWZpZXIgfCBCYXNlVHlwZSB8IENvbnRhaW5lclR5cGUKKworICAgIFsyNV0gRGVmaW5pdGlvblR5cGUgIDo6PSAgQmFzZVR5cGUgfCBDb250YWluZXJUeXBlCisKKyAgICBbMjZdIEJhc2VUeXBlICAgICAgICA6Oj0gICdib29sJyB8ICdieXRlJyB8ICdpOCcgfCAnaTE2JyB8ICdpMzInIHwgJ2k2NCcgfCAnZG91YmxlJyB8ICdzdHJpbmcnIHwgJ2JpbmFyeScgfCAnc2xpc3QnCisKKyAgICBbMjddIENvbnRhaW5lclR5cGUgICA6Oj0gIE1hcFR5cGUgfCBTZXRUeXBlIHwgTGlzdFR5cGUKKworICAgIFsyOF0gTWFwVHlwZSAgICAgICAgIDo6PSAgJ21hcCcgQ3BwVHlwZT8gJzwnIEZpZWxkVHlwZSAnLCcgRmllbGRUeXBlICc+JworCisgICAgWzI5XSBTZXRUeXBlICAgICAgICAgOjo9ICAnc2V0JyBDcHBUeXBlPyAnPCcgRmllbGRUeXBlICc+JworCisgICAgWzMwXSBMaXN0VHlwZSAgICAgICAgOjo9ICAnbGlzdCcgJzwnIEZpZWxkVHlwZSAnPicgQ3BwVHlwZT8KKworICAgIFszMV0gQ3BwVHlwZSAgICAgICAgIDo6PSAgJ2NwcF90eXBlJyBMaXRlcmFsCisKKyMjIENvbnN0YW50IFZhbHVlcworCisgICAgWzMyXSBDb25zdFZhbHVlICAgICAgOjo9ICBJbnRDb25zdGFudCB8IERvdWJsZUNvbnN0YW50IHwgTGl0ZXJhbCB8IElkZW50aWZpZXIgfCBDb25zdExpc3QgfCBDb25zdE1hcAorCisgICAgWzMzXSBJbnRDb25zdGFudCAgICAgOjo9ICAoJysnIHwgJy0nKT8gRGlnaXQrCisKKyAgICBbMzRdIERvdWJsZUNvbnN0YW50ICA6Oj0gICgnKycgfCAnLScpPyBEaWdpdCogKCcuJyBEaWdpdCspPyAoICgnRScgfCAnZScpIEludENvbnN0YW50ICk/CisKKyAgICBbMzVdIENvbnN0TGlzdCAgICAgICA6Oj0gICdbJyAoQ29uc3RWYWx1ZSBMaXN0U2VwYXJhdG9yPykqICddJworCisgICAgWzM2XSBDb25zdE1hcCAgICAgICAgOjo9ICAneycgKENvbnN0VmFsdWUgJzonIENvbnN0VmFsdWUgTGlzdFNlcGFyYXRvcj8pKiAnfScKKworIyMgQmFzaWMgRGVmaW5pdGlvbnMKKworIyMjIExpdGVyYWwKKworICAgIFszN10gTGl0ZXJhbCAgICAgICAgIDo6PSAgKCciJyBbXiJdKiAnIicpIHwgKCInIiBbXiddKiAiJyIpCisKKyMjIyBJZGVudGlmaWVyCisKKyAgICBbMzhdIElkZW50aWZpZXIgICAgICA6Oj0gICggTGV0dGVyIHwgJ18nICkgKCBMZXR0ZXIgfCBEaWdpdCB8ICcuJyB8ICdfJyApKgorCisgICAgWzM5XSBTVElkZW50aWZpZXIgICAgOjo9ICAoIExldHRlciB8ICdfJyApICggTGV0dGVyIHwgRGlnaXQgfCAnLicgfCAnXycgfCAnLScgKSoKKworIyMjIExpc3QgU2VwYXJhdG9yCisKKyAgICBbNDBdIExpc3RTZXBhcmF0b3IgICA6Oj0gICcsJyB8ICc7JworCisjIyMgTGV0dGVycyBhbmQgRGlnaXRzCisKKyAgICBbNDFdIExldHRlciAgICAgICAgICA6Oj0gIFsnQSctJ1onXSB8IFsnYSctJ3onXQorCisgICAgWzQyXSBEaWdpdCAgICAgICAgICAgOjo9ICBbJzAnLSc5J10KKworIyMgRXhhbXBsZXMKKworSGVyZSBhcmUgc29tZSBleGFtcGxlcyBvZiBUaHJpZnQgZGVmaW5pdGlvbnMsIHVzaW5nIHRoZSBUaHJpZnQgSURMOgorCisgKiBbVGhyaWZ0VGVzdC50aHJpZnRdW10gdXNlZCBieSB0aGUgVGhyaWZ0IFRlc3RGcmFtZXdvcmsKKyAqIFRocmlmdCBbdHV0b3JpYWxdW10KKyAqIEZhY2Vib29rJ3MgW2ZiMzAzLnRocmlmdF1bXQorICogW0FwYWNoZSBDYXNzYW5kcmEnc11bXSBUaHJpZnQgSURMOiBbY2Fzc2FuZHJhLnRocmlmdF1bXQorICogW0V2ZXJub3RlIEFQSV1bXQorCisgW1RocmlmdFRlc3QudGhyaWZ0XTogIGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9hcGFjaGUvdGhyaWZ0L21hc3Rlci90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CisgW3R1dG9yaWFsXTogICAgICAgICAgIC90dXRvcmlhbC8KKyBbZmIzMDMudGhyaWZ0XTogICAgICAgaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2FwYWNoZS90aHJpZnQvbWFzdGVyL2NvbnRyaWIvZmIzMDMvaWYvZmIzMDMudGhyaWZ0CisgW0FwYWNoZSBDYXNzYW5kcmEnc106IGh0dHA6Ly9jYXNzYW5kcmEuYXBhY2hlLm9yZy8KKyBbY2Fzc2FuZHJhLnRocmlmdF06ICAgaHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9jYXNzYW5kcmEvdHJ1bmsvaW50ZXJmYWNlL2Nhc3NhbmRyYS50aHJpZnQ/dmlldz1jbworIFtFdmVybm90ZSBBUEldOiAgICAgICBodHRwOi8vd3d3LmV2ZXJub3RlLmNvbS9hYm91dC9kZXZlbG9wZXIvYXBpLworCisjIyBUbyBEby9RdWVzdGlvbnMKKworSW5pdGlhbGl6YXRpb24gb2YgQmFzZSBUeXBlcyBmb3IgYWxsIExhbmd1YWdlcz8KKworICogRG8gYWxsIExhbmd1YWdlcyBpbml0aWFsaXplIHRoZW0gdG8gMCwgYm9vbD1mYWxzZSBhbmQgc3RyaW5nPSIiPyBvciBudWxsLCB1bmRlZmluZWQ/CisKK1doeSBkb2VzIHBvc2l0aW9uIG9mIGBDcHBUeXBlYCB2YXJ5IGJldHdlZW4gYFNldFR5cGVgIGFuZCBgTGlzdFR5cGVgPworCisgKiBzdGQ6OnNldCBkb2VzIHNvcnQgdGhlIGVsZW1lbnRzIGF1dG9tYXRpY2FsbHksIHRoYXQncyB0aGUgZGVzaWduLiBzZWUgW1RocmlmdCBUeXBlc10oL2RvY3MvdHlwZXMpIG9yIHRoZSBbQysrIHN0ZDpzZXQgcmVmZXJlbmNlXVtdIGZvciBmdXJ0aGVyIGRldGFpbHMKKyAqIFRoZSBxdWVzdGlvbiBpcywgaG93IG90aGVyIGxhbmd1YWdlcyBhcmUgZG9pbmcgdGhhdD8gV2hhdCBhYm91dCBjdXN0b20gb2JqZWN0cywgZG8gdGhleSBoYXZlIGEgQ29tcGFyZSBmdW5jdGlvbiB0aGUgc2V0IHRoZSBvcmRlciBjb3JyZWN0bHk/CisKKyBbQysrIHN0ZDpzZXQgcmVmZXJlbmNlXTogaHR0cDovL3d3dy5jcGx1c3BsdXMuY29tL3JlZmVyZW5jZS9zdGwvc2V0LworCitXaHkgY2FuJ3QgYERlZmluaXRpb25UeXBlYCBiZSB0aGUgc2FtZSBhcyBgRmllbGRUeXBlYCAoaS5lLiBpbmNsdWRlIGBJZGVudGlmaWVyYCk/CisKK0V4YW1pbmUgdGhlIGBzbWFsbHRhbGsucHJlZml4YCBhbmQgYHNtYWxsdGFsay5jYXRlZ29yeWAgc3RhdHVzIChlc3AgYHNtYWxsdGFsay5jYXRlZ29yeWAsIHdoaWNoIHRha2VzIGBTVElkZW50aWZpZXJgIGFzIGl0cyBhcmd1bWVudCkuLi4KKworV2hhdCB0byBkbyBhYm91dCBgTGlzdFNlcGFyYXRvcmA/IERvIHdlIHJlYWxseSB3YW50IHRvIGJlIGFzIGxheCBhcyB3ZSBjdXJyZW50bHkgYXJlPworCitTaG91bGQgYEZpZWxkKmAgcmVhbGx5IGJlIGBGaWVsZCtgIGluIGBTdHJ1Y3RgLCBgRW51bWAsIGV0Yy4/CisKZGlmZiAtLWdpdCBhL2RvYy9zcGVjcy90aHJpZnQtYmluYXJ5LXByb3RvY29sLm1kIGIvZG9jL3NwZWNzL3RocmlmdC1iaW5hcnktcHJvdG9jb2wubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg1MjY4NQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zcGVjcy90aHJpZnQtYmluYXJ5LXByb3RvY29sLm1kCkBAIC0wLDAgKzEsMjU0IEBACitUaHJpZnQgQmluYXJ5IHByb3RvY29sIGVuY29kaW5nIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCis8IS0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCitvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQordG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQord2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKK0tJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCitzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCit1bmRlciB0aGUgTGljZW5zZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tPgorCitUaGlzIGRvY3VtZW50cyBkZXNjcmliZXMgdGhlIHdpcmUgZW5jb2RpbmcgZm9yIFJQQyB1c2luZyB0aGUgb2xkZXIgVGhyaWZ0ICpiaW5hcnkgcHJvdG9jb2wqLgorCitUaGUgaW5mb3JtYXRpb24gaGVyZSBpcyBfbW9zdGx5XyBiYXNlZCBvbiB0aGUgSmF2YSBpbXBsZW1lbnRhdGlvbiBpbiB0aGUgQXBhY2hlIHRocmlmdCBsaWJyYXJ5ICh2ZXJzaW9uIDAuOS4xIGFuZAorMC45LjMpLiBPdGhlciBpbXBsZW1lbnRhdGlvbiBob3dldmVyLCBzaG91bGQgYmVoYXZlIHRoZSBzYW1lLgorCitGb3IgYmFja2dyb3VuZCBvbiBUaHJpZnQgc2VlIHRoZSBbVGhyaWZ0IHdoaXRlcGFwZXIgKHBkZildKGh0dHBzOi8vdGhyaWZ0LmFwYWNoZS5vcmcvc3RhdGljL2ZpbGVzL3RocmlmdC0yMDA3MDQwMS5wZGYpLgorCisjIENvbnRlbnRzCisKKyogQmluYXJ5IHByb3RvY29sCisgICogQmFzZSB0eXBlcworICAqIE1lc3NhZ2UKKyAgKiBTdHJ1Y3QKKyAgKiBMaXN0IGFuZCBTZXQKKyAgKiBNYXAKKyogQk5GIG5vdGF0aW9uIHVzZWQgaW4gdGhpcyBkb2N1bWVudAorCisjIEJpbmFyeSBwcm90b2NvbAorCisjIyBCYXNlIHR5cGVzCisKKyMjIyBJbnRlZ2VyIGVuY29kaW5nCisKK0luIHRoZSBfYmluYXJ5IHByb3RvY29sXyBpbnRlZ2VycyBhcmUgZW5jb2RlZCB3aXRoIHRoZSBtb3N0IHNpZ25pZmljYW50IGJ5dGUgZmlyc3QgKGJpZyBlbmRpYW4gYnl0ZSBvcmRlciwgYWthIG5ldHdvcmsKK29yZGVyKS4gQW4gYGludDhgIG5lZWRzIDEgYnl0ZSwgYW4gYGludDE2YCAyLCBhbiBgaW50MzJgIDQgYW5kIGFuIGBpbnQ2NGAgbmVlZHMgOCBieXRlcy4KKworVGhlIENQUCB2ZXJzaW9uIGhhcyB0aGUgb3B0aW9uIHRvIHVzZSB0aGUgYmluYXJ5IHByb3RvY29sIHdpdGggbGl0dGxlIGVuZGlhbiBvcmRlci4gTGl0dGxlIGVuZGlhbiBnaXZlcyBhIHNtYWxsIGJ1dAorbm90aWNlYWJsZSBwZXJmb3JtYW5jZSBib29zdCBiZWNhdXNlIGNvbnRlbXBvcmFyeSBDUFVzIHVzZSBsaXR0bGUgZW5kaWFuIHdoZW4gc3RvcmluZyBpbnRlZ2VycyB0byBSQU0uCisKKyMjIyBFbnVtIGVuY29kaW5nCisKK1RoZSBnZW5lcmF0ZWQgY29kZSBlbmNvZGVzIGBFbnVtYHMgYnkgdGFraW5nIHRoZSBvcmRpbmFsIHZhbHVlIGFuZCB0aGVuIGVuY29kaW5nIHRoYXQgYXMgYW4gaW50MzIuCisKKyMjIyBCaW5hcnkgZW5jb2RpbmcKKworQmluYXJ5IGlzIHNlbnQgYXMgZm9sbG93czoKKworYGBgCitCaW5hcnkgcHJvdG9jb2wsIGJpbmFyeSBkYXRhLCA0KyBieXRlczoKKystLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rCit8IGJ5dGUgbGVuZ3RoICAgICAgICAgICAgICAgICAgICAgICB8IGJ5dGVzICAgICAgICAgICAgICAgIHwKKystLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rCitgYGAKKworV2hlcmU6CisKKyogYGJ5dGUgbGVuZ3RoYCBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBieXRlIGFycmF5LCBhIHNpZ25lZCAzMiBiaXQgaW50ZWdlciBlbmNvZGVkIGluIG5ldHdvcmsgKGJpZyBlbmRpYW4pIG9yZGVyIChtdXN0IGJlID49IDApLgorKiBgYnl0ZXNgIGFyZSB0aGUgYnl0ZXMgb2YgdGhlIGJ5dGUgYXJyYXkuCisKKyMjIyBTdHJpbmcgZW5jb2RpbmcKKworKlN0cmluZypzIGFyZSBmaXJzdCBlbmNvZGVkIHRvIFVURi04LCBhbmQgdGhlbiBzZW5kIGFzIGJpbmFyeS4KKworIyMjIERvdWJsZSBlbmNvZGluZworCitWYWx1ZXMgb2YgdHlwZSBgZG91YmxlYCBhcmUgZmlyc3QgY29udmVydGVkIHRvIGFuIGludDY0IGFjY29yZGluZyB0byB0aGUgSUVFRSA3NTQgZmxvYXRpbmctcG9pbnQgImRvdWJsZSBmb3JtYXQiIGJpdAorbGF5b3V0LiBNb3N0IHJ1bi10aW1lcyBwcm92aWRlIGEgbGlicmFyeSB0byBtYWtlIHRoaXMgY29udmVyc2lvbi4gQm90aCB0aGUgYmluYXJ5IHByb3RvY29sIGFzIHRoZSBjb21wYWN0IHByb3RvY29sIHRoZW4KK2VuY29kZSB0aGUgaW50NjQgaW4gOCBieXRlcyBpbiBiaWcgZW5kaWFuIG9yZGVyLgorCisjIyMgQm9vbGVhbiBlbmNvZGluZworCitWYWx1ZXMgb2YgYGJvb2xgIHR5cGUgYXJlIGZpcnN0IGNvbnZlcnRlZCB0byBhbiBpbnQ4LiBUcnVlIGlzIGNvbnZlcnRlZCB0byBgMWAsIGZhbHNlIHRvIGAwYC4KKworIyMgTWVzc2FnZQorCitBIGBNZXNzYWdlYCBjYW4gYmUgZW5jb2RlZCBpbiB0d28gZGlmZmVyZW50IHdheXM6CisKK2BgYAorQmluYXJ5IHByb3RvY29sIE1lc3NhZ2UsIHN0cmljdCBlbmNvZGluZywgMTIrIGJ5dGVzOgorKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSsKK3wxdnZ2dnZ2dnx2dnZ2dnZ2dnx1bnVzZWQgIHwwMDAwMG1tbXwgbmFtZSBsZW5ndGggICAgICAgICAgICAgICAgICAgICAgIHwgbmFtZSAgICAgICAgICAgICAgICB8IHNlcSBpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisrLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKworYGBgCisKK1doZXJlOgorCisqIGB2dnZ2dnZ2dnZ2dnZ2dnZgIGlzIHRoZSB2ZXJzaW9uLCBhbiB1bnNpZ25lZCAxNSBiaXQgbnVtYmVyIGZpeGVkIHRvIGAxYCAoaW4gYmluYXJ5OiBgMDAwIDAwMDAgMDAwMCAwMDAxYCkuCisgIFRoZSBsZWFkaW5nIGJpdCBpcyBgMWAuCisqIGB1bnVzZWRgIGlzIGFuIGlnbm9yZWQgYnl0ZS4KKyogYG1tbWAgaXMgdGhlIG1lc3NhZ2UgdHlwZSwgYW4gdW5zaWduZWQgMyBiaXQgaW50ZWdlci4gVGhlIDUgbGVhZGluZyBiaXRzIG11c3QgYmUgYDBgIGFzIHNvbWUgY2xpZW50cyAoY2hlY2tlZCBmb3IKKyAgamF2YSBpbiAwLjkuMSkgdGFrZSB0aGUgd2hvbGUgYnl0ZS4KKyogYG5hbWUgbGVuZ3RoYCBpcyB0aGUgYnl0ZSBsZW5ndGggb2YgdGhlIG5hbWUgZmllbGQsIGEgc2lnbmVkIDMyIGJpdCBpbnRlZ2VyIGVuY29kZWQgaW4gbmV0d29yayAoYmlnIGVuZGlhbikgb3JkZXIgKG11c3QgYmUgPj0gMCkuCisqIGBuYW1lYCBpcyB0aGUgbWV0aG9kIG5hbWUsIGEgVVRGLTggZW5jb2RlZCBzdHJpbmcuCisqIGBzZXEgaWRgIGlzIHRoZSBzZXF1ZW5jZSBpZCwgYSBzaWduZWQgMzIgYml0IGludGVnZXIgZW5jb2RlZCBpbiBuZXR3b3JrIChiaWcgZW5kaWFuKSBvcmRlci4KKworVGhlIHNlY29uZCwgb2xkZXIgZW5jb2RpbmcgKGFrYSBub24tc3RyaWN0KSBpczoKKworYGBgCitCaW5hcnkgcHJvdG9jb2wgTWVzc2FnZSwgb2xkIGVuY29kaW5nLCA5KyBieXRlczoKKystLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rCit8IG5hbWUgbGVuZ3RoICAgICAgICAgICAgICAgICAgICAgICB8IG5hbWUgICAgICAgICAgICAgICAgfDAwMDAwbW1tfCBzZXEgaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSsKK2BgYAorCitXaGVyZSBgbmFtZSBsZW5ndGhgLCBgbmFtZWAsIGBtbW1gLCBgc2VxIGlkYCBhcmUgYXMgYWJvdmUuCisKK0JlY2F1c2UgYG5hbWUgbGVuZ3RoYCBtdXN0IGJlIHBvc2l0aXZlICh0aGVyZWZvcmUgdGhlIGZpcnN0IGJpdCBpcyBhbHdheXMgYDBgKSwgdGhlIGZpcnN0IGJpdCBhbGxvd3MgdGhlIHJlY2VpdmVyIHRvIHNlZQord2hldGhlciB0aGUgc3RyaWN0IGZvcm1hdCBvciB0aGUgb2xkIGZvcm1hdCBpcyB1c2VkLiBUaGVyZWZvcmUgYSBzZXJ2ZXIgYW5kIGNsaWVudCB1c2luZyB0aGUgZGlmZmVyZW50IHZhcmlhbnRzIG9mIHRoZQorYmluYXJ5IHByb3RvY29sIGNhbiB0cmFuc3BhcmVudGx5IHRhbGsgd2l0aCBlYWNoIG90aGVyLiBIb3dldmVyLCB3aGVuIHN0cmljdCBtb2RlIGlzIGVuZm9yY2VkLCB0aGUgb2xkIGZvcm1hdCBpcworcmVqZWN0ZWQuCisKK01lc3NhZ2UgdHlwZXMgYXJlIGVuY29kZWQgd2l0aCB0aGUgZm9sbG93aW5nIHZhbHVlczoKKworKiBfQ2FsbF86IDEKKyogX1JlcGx5XzogMgorKiBfRXhjZXB0aW9uXzogMworKiBfT25ld2F5XzogNAorCisjIyBTdHJ1Y3QKKworQSAqU3RydWN0KiBpcyBhIHNlcXVlbmNlIG9mIHplcm8gb3IgbW9yZSBmaWVsZHMsIGZvbGxvd2VkIGJ5IGEgc3RvcCBmaWVsZC4gRWFjaCBmaWVsZCBzdGFydHMgd2l0aCBhIGZpZWxkIGhlYWRlciBhbmQKK2lzIGZvbGxvd2VkIGJ5IHRoZSBlbmNvZGVkIGZpZWxkIHZhbHVlLiBUaGUgZW5jb2RpbmcgY2FuIGJlIHN1bW1hcml6ZWQgYnkgdGhlIGZvbGxvd2luZyBCTkY6CisKK2BgYAorc3RydWN0ICAgICAgICA6Oj0gKCBmaWVsZC1oZWFkZXIgZmllbGQtdmFsdWUgKSogc3RvcC1maWVsZAorZmllbGQtaGVhZGVyICA6Oj0gZmllbGQtdHlwZSBmaWVsZC1pZAorYGBgCisKK0JlY2F1c2UgZWFjaCBmaWVsZCBoZWFkZXIgY29udGFpbnMgdGhlIGZpZWxkLWlkIChhcyBkZWZpbmVkIGJ5IHRoZSBUaHJpZnQgSURMIGZpbGUpLCB0aGUgZmllbGRzIGNhbiBiZSBlbmNvZGVkIGluIGFueQorb3JkZXIuIFRocmlmdCdzIHR5cGUgc3lzdGVtIGlzIG5vdCBleHRlbnNpYmxlOyB5b3UgY2FuIG9ubHkgZW5jb2RlIHRoZSBwcmltaXRpdmUgdHlwZXMgYW5kIHN0cnVjdHMuIFRoZXJlZm9yZSBpcyBhbHNvCitwb3NzaWJsZSB0byBoYW5kbGUgdW5rbm93biBmaWVsZHMgd2hpbGUgZGVjb2Rpbmc7IHRoZXNlIGFyZSBzaW1wbHkgaWdub3JlZC4gV2hpbGUgZGVjb2RpbmcgdGhlIGZpZWxkIHR5cGUgY2FuIGJlIHVzZWQgdG8KK2RldGVybWluZSBob3cgdG8gZGVjb2RlIHRoZSBmaWVsZCB2YWx1ZS4KKworTm90ZSB0aGF0IHRoZSBmaWVsZCBuYW1lIGlzIG5vdCBlbmNvZGVkIHNvIGZpZWxkIHJlbmFtZXMgaW4gdGhlIElETCBkbyBub3QgYWZmZWN0IGZvcndhcmQgYW5kIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCisKK1RoZSBkZWZhdWx0IEphdmEgaW1wbGVtZW50YXRpb24gKEFwYWNoZSBUaHJpZnQgMC45LjEpIGhhcyB1bmRlZmluZWQgYmVoYXZpb3Igd2hlbiBpdCB0cmllcyB0byBkZWNvZGUgYSBmaWVsZCB0aGF0IGhhcworYW5vdGhlciBmaWVsZC10eXBlIHRoZW4gd2hhdCBpcyBleHBlY3RlZC4gVGhlb3JldGljYWxseSB0aGlzIGNvdWxkIGJlIGRldGVjdGVkIGF0IHRoZSBjb3N0IG9mIHNvbWUgYWRkaXRpb25hbCBjaGVja2luZy4KK090aGVyIGltcGxlbWVudGF0aW9uIG1heSBwZXJmb3JtIHRoaXMgY2hlY2sgYW5kIHRoZW4gZWl0aGVyIGlnbm9yZSB0aGUgZmllbGQsIG9yIHJldHVybiBhIHByb3RvY29sIGV4Y2VwdGlvbi4KKworQSAqVW5pb24qIGlzIGVuY29kZWQgZXhhY3RseSB0aGUgc2FtZSBhcyBhIHN0cnVjdCB3aXRoIHRoZSBhZGRpdGlvbmFsIHJlc3RyaWN0aW9uIHRoYXQgYXQgbW9zdCAxIGZpZWxkIG1heSBiZSBlbmNvZGVkLgorCitBbiAqRXhjZXB0aW9uKiBpcyBlbmNvZGVkIGV4YWN0bHkgdGhlIHNhbWUgYXMgYSBzdHJ1Y3QuCisKKyMjIyBTdHJ1Y3QgZW5jb2RpbmcKKworSW4gdGhlIGJpbmFyeSBwcm90b2NvbCBmaWVsZCBoZWFkZXJzIGFuZCB0aGUgc3RvcCBmaWVsZCBhcmUgZW5jb2RlZCBhcyBmb2xsb3dzOgorCitgYGAKK0JpbmFyeSBwcm90b2NvbCBmaWVsZCBoZWFkZXIgYW5kIGZpZWxkIHZhbHVlOgorKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSsKK3x0dHR0dHR0dHwgZmllbGQgaWQgICAgICAgIHwgZmllbGQgdmFsdWUgICAgICAgICB8CisrLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKworCitCaW5hcnkgcHJvdG9jb2wgc3RvcCBmaWVsZDoKKystLS0tLS0tLSsKK3wwMDAwMDAwMHwKKystLS0tLS0tLSsKK2BgYAorCitXaGVyZToKKworKiBgdHR0dHR0dHRgIHRoZSBmaWVsZC10eXBlLCBhIHNpZ25lZCA4IGJpdCBpbnRlZ2VyLgorKiBgZmllbGQgaWRgIHRoZSBmaWVsZC1pZCwgYSBzaWduZWQgMTYgYml0IGludGVnZXIgaW4gYmlnIGVuZGlhbiBvcmRlci4KKyogYGZpZWxkLXZhbHVlYCB0aGUgZW5jb2RlZCBmaWVsZCB2YWx1ZS4KKworVGhlIGZvbGxvd2luZyBmaWVsZC10eXBlcyBhcmUgdXNlZDoKKworKiBgQk9PTGAsIGVuY29kZWQgYXMgYDJgCisqIGBCWVRFYCwgZW5jb2RlZCBhcyBgM2AKKyogYERPVUJMRWAsIGVuY29kZWQgYXMgYDRgCisqIGBJMTZgLCBlbmNvZGVkIGFzIGA2YAorKiBgSTMyYCwgZW5jb2RlZCBhcyBgOGAKKyogYEk2NGAsIGVuY29kZWQgYXMgYDEwYAorKiBgU1RSSU5HYCwgdXNlZCBmb3IgYmluYXJ5IGFuZCBzdHJpbmcgZmllbGRzLCBlbmNvZGVkIGFzIGAxMWAKKyogYFNUUlVDVGAsIHVzZWQgZm9yIHN0cnVjdHMgYW5kIHVuaW9uIGZpZWxkcywgZW5jb2RlZCBhcyBgMTJgCisqIGBNQVBgLCBlbmNvZGVkIGFzIGAxM2AKKyogYFNFVGAsIGVuY29kZWQgYXMgYDE0YAorKiBgTElTVGAsIGVuY29kZWQgYXMgYDE1YAorCisjIyBMaXN0IGFuZCBTZXQKKworTGlzdCBhbmQgc2V0cyBhcmUgZW5jb2RlZCB0aGUgc2FtZTogYSBoZWFkZXIgaW5kaWNhdGluZyB0aGUgc2l6ZSBhbmQgdGhlIGVsZW1lbnQtdHlwZSBvZiB0aGUgZWxlbWVudHMsIGZvbGxvd2VkIGJ5IHRoZQorZW5jb2RlZCBlbGVtZW50cy4KKworYGBgCitCaW5hcnkgcHJvdG9jb2wgbGlzdCAoNSsgYnl0ZXMpIGFuZCBlbGVtZW50czoKKystLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rCit8dHR0dHR0dHR8IHNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGVsZW1lbnRzICAgICAgICAgICAgfAorKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSsKK2BgYAorCitXaGVyZToKKworKiBgdHR0dHR0dHRgIGlzIHRoZSBlbGVtZW50LXR5cGUsIGVuY29kZWQgYXMgYW4gaW50OAorKiBgc2l6ZWAgaXMgdGhlIHNpemUsIGVuY29kZWQgYXMgYW4gaW50MzIsIHBvc2l0aXZlIHZhbHVlcyBvbmx5CisqIGBlbGVtZW50c2AgdGhlIGVsZW1lbnQgdmFsdWVzCisKK1RoZSBlbGVtZW50LXR5cGUgdmFsdWVzIGFyZSB0aGUgc2FtZSBhcyBmaWVsZC10eXBlcy4gVGhlIGZ1bGwgbGlzdCBpcyBpbmNsdWRlZCBpbiB0aGUgc3RydWN0IHNlY3Rpb24gYWJvdmUuCisKK1RoZSBtYXhpbXVtIGxpc3Qvc2V0IHNpemUgaXMgY29uZmlndXJhYmxlLiBCeSBkZWZhdWx0IHRoZXJlIGlzIG5vIGxpbWl0IChtZWFuaW5nIHRoZSBsaW1pdCBpcyB0aGUgbWF4aW11bSBpbnQzMiB2YWx1ZToKKzIxNDc0ODM2NDcpLgorCisjIyBNYXAKKworTWFwcyBhcmUgZW5jb2RlZCB3aXRoIGEgaGVhZGVyIGluZGljYXRpbmcgdGhlIHNpemUsIHRoZSBlbGVtZW50LXR5cGUgb2YgdGhlIGtleXMgYW5kIHRoZSBlbGVtZW50LXR5cGUgb2YgdGhlIGVsZW1lbnRzLAorZm9sbG93ZWQgYnkgdGhlIGVuY29kZWQgZWxlbWVudHMuIFRoZSBlbmNvZGluZyBmb2xsb3dzIHRoaXMgQk5GOgorCitgYGAKK21hcCAgOjo9ICBrZXktZWxlbWVudC10eXBlIHZhbHVlLWVsZW1lbnQtdHlwZSBzaXplICgga2V5IHZhbHVlICkqCitgYGAKKworYGBgCitCaW5hcnkgcHJvdG9jb2wgbWFwICg2KyBieXRlcykgYW5kIGtleSB2YWx1ZSBwYWlyczoKKystLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rCit8a2tra2tra2t8dnZ2dnZ2dnZ8IHNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGtleSB2YWx1ZSBwYWlycyAgICAgfAorKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSsKK2BgYAorCitXaGVyZToKKworKiBga2tra2tra2tgIGlzIHRoZSBrZXkgZWxlbWVudC10eXBlLCBlbmNvZGVkIGFzIGFuIGludDgKKyogYHZ2dnZ2dnZ2YCBpcyB0aGUgdmFsdWUgZWxlbWVudC10eXBlLCBlbmNvZGVkIGFzIGFuIGludDgKKyogYHNpemVgIGlzIHRoZSBzaXplIG9mIHRoZSBtYXAsIGVuY29kZWQgYXMgYW4gaW50MzIsIHBvc2l0aXZlIHZhbHVlcyBvbmx5CisqIGBrZXkgdmFsdWUgcGFpcnNgIGFyZSB0aGUgZW5jb2RlZCBrZXlzIGFuZCB2YWx1ZXMKKworVGhlIGVsZW1lbnQtdHlwZSB2YWx1ZXMgYXJlIHRoZSBzYW1lIGFzIGZpZWxkLXR5cGVzLiBUaGUgZnVsbCBsaXN0IGlzIGluY2x1ZGVkIGluIHRoZSBzdHJ1Y3Qgc2VjdGlvbiBhYm92ZS4KKworVGhlIG1heGltdW0gbWFwIHNpemUgaXMgY29uZmlndXJhYmxlLiBCeSBkZWZhdWx0IHRoZXJlIGlzIG5vIGxpbWl0IChtZWFuaW5nIHRoZSBsaW1pdCBpcyB0aGUgbWF4aW11bSBpbnQzMiB2YWx1ZToKKzIxNDc0ODM2NDcpLgorCisjIEJORiBub3RhdGlvbiB1c2VkIGluIHRoaXMgZG9jdW1lbnQKKworVGhlIGZvbGxvd2luZyBCTkYgbm90YXRpb24gaXMgdXNlZDoKKworKiBhIHBsdXMgYCtgIGFwcGVuZGVkIHRvIGFuIGl0ZW0gcmVwcmVzZW50cyByZXBldGl0aW9uOyB0aGUgaXRlbSBpcyByZXBlYXRlZCAxIG9yIG1vcmUgdGltZXMKKyogYSBzdGFyIGAqYCBhcHBlbmRlZCB0byBhbiBpdGVtIHJlcHJlc2VudHMgb3B0aW9uYWwgcmVwZXRpdGlvbjsgdGhlIGl0ZW0gaXMgcmVwZWF0ZWQgMCBvciBtb3JlIHRpbWVzCisqIGEgcGlwZSBgfGAgYmV0d2VlbiBpdGVtcyByZXByZXNlbnRzIGNob2ljZSwgdGhlIGZpcnN0IG1hdGNoaW5nIGl0ZW0gaXMgc2VsZWN0ZWQKKyogcGFyZW50aGVzaXMgYChgIGFuZCBgKWAgYXJlIHVzZWQgZm9yIGdyb3VwaW5nIG11bHRpcGxlIGl0ZW1zCmRpZmYgLS1naXQgYS9kb2Mvc3BlY3MvdGhyaWZ0LWNvbXBhY3QtcHJvdG9jb2wubWQgYi9kb2Mvc3BlY3MvdGhyaWZ0LWNvbXBhY3QtcHJvdG9jb2wubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI0NjdkZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zcGVjcy90aHJpZnQtY29tcGFjdC1wcm90b2NvbC5tZApAQCAtMCwwICsxLDI5NCBAQAorVGhyaWZ0IENvbXBhY3QgcHJvdG9jb2wgZW5jb2RpbmcgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCis8IS0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCitvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQordG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQord2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKK0tJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCitzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCit1bmRlciB0aGUgTGljZW5zZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tPgorCitUaGlzIGRvY3VtZW50cyBkZXNjcmliZXMgdGhlIHdpcmUgZW5jb2RpbmcgZm9yIFJQQyB1c2luZyB0aGUgVGhyaWZ0ICpjb21wYWN0IHByb3RvY29sKi4KKworVGhlIGluZm9ybWF0aW9uIGhlcmUgaXMgX21vc3RseV8gYmFzZWQgb24gdGhlIEphdmEgaW1wbGVtZW50YXRpb24gaW4gdGhlIEFwYWNoZSB0aHJpZnQgbGlicmFyeSAodmVyc2lvbiAwLjkuMSkgYW5kCitbVEhSSUZULTExMCBBIG1vcmUgY29tcGFjdCBmb3JtYXRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTExMCkuIE90aGVyIGltcGxlbWVudGF0aW9uIGhvd2V2ZXIsCitzaG91bGQgYmVoYXZlIHRoZSBzYW1lLgorCitGb3IgYmFja2dyb3VuZCBvbiBUaHJpZnQgc2VlIHRoZSBbVGhyaWZ0IHdoaXRlcGFwZXIgKHBkZildKGh0dHBzOi8vdGhyaWZ0LmFwYWNoZS5vcmcvc3RhdGljL2ZpbGVzL3RocmlmdC0yMDA3MDQwMS5wZGYpLgorCisjIENvbnRlbnRzCisKKyogQ29tcGFjdCBwcm90b2NvbAorICAqIEJhc2UgdHlwZXMKKyAgKiBNZXNzYWdlCisgICogU3RydWN0CisgICogTGlzdCBhbmQgU2V0CisgICogTWFwCisqIEJORiBub3RhdGlvbiB1c2VkIGluIHRoaXMgZG9jdW1lbnQKKworIyBDb21wYWN0IHByb3RvY29sCisKKyMjIEJhc2UgdHlwZXMKKworIyMjIEludGVnZXIgZW5jb2RpbmcKKworVGhlIF9jb21wYWN0IHByb3RvY29sXyB1c2VzIG11bHRpcGxlIGVuY29kaW5ncyBmb3IgaW50czogdGhlIF96aWd6YWcgaW50XywgYW5kIHRoZSBfdmFyIGludF8uCisKK1ZhbHVlcyBvZiB0eXBlIGBpbnQzMmAgYW5kIGBpbnQ2NGAgYXJlIGZpcnN0IHRyYW5zZm9ybWVkIHRvIGEgKnppZ3phZyBpbnQqLiBBIHppZ3phZyBpbnQgZm9sZHMgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlCitudW1iZXJzIGludG8gdGhlIHBvc2l0aXZlIG51bWJlciBzcGFjZS4gV2hlbiB3ZSByZWFkIDAsIDEsIDIsIDMsIDQgb3IgNSBmcm9tIHRoZSB3aXJlLCB0aGlzIGlzIHRyYW5zbGF0ZWQgdG8gMCwgLTEsIDEsCistMiBvciAyIHJlc3BlY3RpdmVseS4gSGVyZSBhcmUgdGhlIChTY2FsYSkgZm9ybXVsYXMgdG8gY29udmVydCBmcm9tIGludDMyL2ludDY0IHRvIGEgemlnemFnIGludCBhbmQgYmFjazoKKworYGBgc2NhbGEKK2RlZiBpbnRUb1ppZ1phZyhuOiBJbnQpOiBJbnQgPSAobiA8PCAxKSBeIChuID4+IDMxKQorZGVmIHppZ3phZ1RvSW50KG46IEludCk6IEludCA9IChuID4+PiAxKSBeIC0gKG4gJiAxKQorZGVmIGxvbmdUb1ppZ1phZyhuOiBMb25nKTogTG9uZyA9IChuIDw8IDEpIF4gKG4gPj4gNjMpCitkZWYgemlnemFnVG9Mb25nKG46IExvbmcpOiBMb25nID0gKG4gPj4+IDEpIF4gLSAobiAmIDEpCitgYGAKKworVGhlIHppZ3phZyBpbnQgaXMgdGhlbiBlbmNvZGVkIGFzIGEgKnZhciBpbnQqLiBWYXIgaW50cyB0YWtlIDEgdG8gNSBieXRlcyAoaW50MzIpIG9yIDEgdG8gMTAgYnl0ZXMgKGludDY0KS4gVGhlIG1vc3QKK3NpZ25pZmljYW50IGJpdCBvZiBlYWNoIGJ5dGUgaW5kaWNhdGVzIGlmIG1vcmUgYnl0ZXMgZm9sbG93LiBUaGUgY29uY2F0ZW5hdGlvbiBvZiB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgNyBiaXRzIGZyb20gZWFjaAorYnl0ZSBmb3JtIHRoZSBudW1iZXIsIHdoZXJlIHRoZSBmaXJzdCBieXRlIGhhcyB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXRzIChzbyB0aGV5IGFyZSBpbiBiaWcgZW5kaWFuIG9yIG5ldHdvcmsgb3JkZXIpLgorCitWYXIgaW50cyBhcmUgc29tZXRpbWVzIHVzZWQgZGlyZWN0bHkgaW5zaWRlIHRoZSBjb21wYWN0IHByb3RvY29sIHRvIHJlcHJlc2VudCBwb3NpdGl2ZSBudW1iZXJzLgorCitUbyBlbmNvZGUgYW4gYGludDE2YCBhcyB6aWd6YWcgaW50LCBpdCBpcyBmaXJzdCBjb252ZXJ0ZWQgdG8gYW4gYGludDMyYCBhbmQgdGhlbiBlbmNvZGVkIGFzIHN1Y2guIFRoZSB0eXBlIGBpbnQ4YCBzaW1wbHkKK3VzZXMgYSBzaW5nbGUgYnl0ZSBhcyBpbiB0aGUgYmluYXJ5IHByb3RvY29sLgorCisjIyMgRW51bSBlbmNvZGluZworCitUaGUgZ2VuZXJhdGVkIGNvZGUgZW5jb2RlcyBgRW51bWBzIGJ5IHRha2luZyB0aGUgb3JkaW5hbCB2YWx1ZSBhbmQgdGhlbiBlbmNvZGluZyB0aGF0IGFzIGFuIGludDMyLgorCisjIyMgQmluYXJ5IGVuY29kaW5nCisKK0JpbmFyeSBpcyBzZW50IGFzIGZvbGxvd3M6CisKK2BgYAorQmluYXJ5IHByb3RvY29sLCBiaW5hcnkgZGF0YSwgMSsgYnl0ZXM6CisrLS0tLS0tLS0rLi4uKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSsKK3wgYnl0ZSBsZW5ndGggICAgICAgICB8IGJ5dGVzICAgICAgICAgICAgICAgfAorKy0tLS0tLS0tKy4uListLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rCitgYGAKKworV2hlcmU6CisKKyogYGJ5dGUgbGVuZ3RoYCBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBieXRlIGFycmF5LCB1c2luZyB2YXIgaW50IGVuY29kaW5nIChtdXN0IGJlID49IDApLgorKiBgYnl0ZXNgIGFyZSB0aGUgYnl0ZXMgb2YgdGhlIGJ5dGUgYXJyYXkuCisKKyMjIyBTdHJpbmcgZW5jb2RpbmcKKworKlN0cmluZypzIGFyZSBmaXJzdCBlbmNvZGVkIHRvIFVURi04LCBhbmQgdGhlbiBzZW5kIGFzIGJpbmFyeS4KKworIyMjIERvdWJsZSBlbmNvZGluZworCitWYWx1ZXMgb2YgdHlwZSBgZG91YmxlYCBhcmUgZmlyc3QgY29udmVydGVkIHRvIGFuIGludDY0IGFjY29yZGluZyB0byB0aGUgSUVFRSA3NTQgZmxvYXRpbmctcG9pbnQgImRvdWJsZSBmb3JtYXQiIGJpdAorbGF5b3V0LiBNb3N0IHJ1bi10aW1lcyBwcm92aWRlIGEgbGlicmFyeSB0byBtYWtlIHRoaXMgY29udmVyc2lvbi4gQm90aCB0aGUgYmluYXJ5IHByb3RvY29sIGFzIHRoZSBjb21wYWN0IHByb3RvY29sIHRoZW4KK2VuY29kZSB0aGUgaW50NjQgaW4gOCBieXRlcyBpbiBiaWcgZW5kaWFuIG9yZGVyLgorCisjIyMgQm9vbGVhbiBlbmNvZGluZworCitCb29sZWFucyBhcmUgZW5jb2RlZCBkaWZmZXJlbnRseSBkZXBlbmRpbmcgb24gd2hldGhlciBpdCBpcyBhIGZpZWxkIHZhbHVlIChpbiBhIHN0cnVjdCkgb3IgYW4gZWxlbWVudCB2YWx1ZSAoaW4gYSBzZXQsCitsaXN0IG9yIG1hcCkuIEZpZWxkIHZhbHVlcyBhcmUgZW5jb2RlZCBkaXJlY3RseSBpbiB0aGUgZmllbGQgaGVhZGVyLiBFbGVtZW50IHZhbHVlcyBvZiB0eXBlIGBib29sYCBhcmUgc2VudCBhcyBhbiBpbnQ4OwordHJ1ZSBhcyBgMWAgYW5kIGZhbHNlIGFzIGAwYC4KKworIyMgTWVzc2FnZQorCitBIGBNZXNzYWdlYCBvbiB0aGUgd2lyZSBsb29rcyBhcyBmb2xsb3dzOgorCitgYGAKK0NvbXBhY3QgcHJvdG9jb2wgTWVzc2FnZSAoNCsgYnl0ZXMpOgorKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKworfHBwcHBwcHBwfG1tbXZ2dnZ2fCBzZXEgaWQgICAgICAgICAgICAgIHwgbmFtZSBsZW5ndGggICAgICAgICB8IG5hbWUgICAgICAgICAgICAgICAgfAorKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKworYGBgCisKK1doZXJlOgorCisqIGBwcHBwcHBwcGAgaXMgdGhlIHByb3RvY29sIGlkLCBmaXhlZCB0byBgMTAwMCAwMDEwYCwgMHg4Mi4KKyogYG1tbWAgaXMgdGhlIG1lc3NhZ2UgdHlwZSwgYW4gdW5zaWduZWQgMyBiaXQgaW50ZWdlci4KKyogYHZ2dnZ2YCBpcyB0aGUgdmVyc2lvbiwgYW4gdW5zaWduZWQgNSBiaXQgaW50ZWdlciwgZml4ZWQgdG8gYDAwMDAxYC4KKyogYHNlcSBpZGAgaXMgdGhlIHNlcXVlbmNlIGlkLCBhIHNpZ25lZCAzMiBiaXQgaW50ZWdlciBlbmNvZGVkIGFzIGEgdmFyIGludC4KKyogYG5hbWUgbGVuZ3RoYCBpcyB0aGUgYnl0ZSBsZW5ndGggb2YgdGhlIG5hbWUgZmllbGQsIGEgc2lnbmVkIDMyIGJpdCBpbnRlZ2VyIGVuY29kZWQgYXMgYSB2YXIgaW50IChtdXN0IGJlID49IDApLgorKiBgbmFtZWAgaXMgdGhlIG1ldGhvZCBuYW1lIHRvIGludm9rZSwgYSBVVEYtOCBlbmNvZGVkIHN0cmluZy4KKworTWVzc2FnZSB0eXBlcyBhcmUgZW5jb2RlZCB3aXRoIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorCisqIF9DYWxsXzogMQorKiBfUmVwbHlfOiAyCisqIF9FeGNlcHRpb25fOiAzCisqIF9PbmV3YXlfOiA0CisKKyMjIyBTdHJ1Y3QKKworQSAqU3RydWN0KiBpcyBhIHNlcXVlbmNlIG9mIHplcm8gb3IgbW9yZSBmaWVsZHMsIGZvbGxvd2VkIGJ5IGEgc3RvcCBmaWVsZC4gRWFjaCBmaWVsZCBzdGFydHMgd2l0aCBhIGZpZWxkIGhlYWRlciBhbmQKK2lzIGZvbGxvd2VkIGJ5IHRoZSBlbmNvZGVkIGZpZWxkIHZhbHVlLiBUaGUgZW5jb2RpbmcgY2FuIGJlIHN1bW1hcml6ZWQgYnkgdGhlIGZvbGxvd2luZyBCTkY6CisKK2BgYAorc3RydWN0ICAgICAgICA6Oj0gKCBmaWVsZC1oZWFkZXIgZmllbGQtdmFsdWUgKSogc3RvcC1maWVsZAorZmllbGQtaGVhZGVyICA6Oj0gZmllbGQtdHlwZSBmaWVsZC1pZAorYGBgCisKK0JlY2F1c2UgZWFjaCBmaWVsZCBoZWFkZXIgY29udGFpbnMgdGhlIGZpZWxkLWlkIChhcyBkZWZpbmVkIGJ5IHRoZSBUaHJpZnQgSURMIGZpbGUpLCB0aGUgZmllbGRzIGNhbiBiZSBlbmNvZGVkIGluIGFueQorb3JkZXIuIFRocmlmdCdzIHR5cGUgc3lzdGVtIGlzIG5vdCBleHRlbnNpYmxlOyB5b3UgY2FuIG9ubHkgZW5jb2RlIHRoZSBwcmltaXRpdmUgdHlwZXMgYW5kIHN0cnVjdHMuIFRoZXJlZm9yZSBpcyBhbHNvCitwb3NzaWJsZSB0byBoYW5kbGUgdW5rbm93biBmaWVsZHMgd2hpbGUgZGVjb2Rpbmc7IHRoZXNlIGFyZSBzaW1wbHkgaWdub3JlZC4gV2hpbGUgZGVjb2RpbmcgdGhlIGZpZWxkIHR5cGUgY2FuIGJlIHVzZWQgdG8KK2RldGVybWluZSBob3cgdG8gZGVjb2RlIHRoZSBmaWVsZCB2YWx1ZS4KKworTm90ZSB0aGF0IHRoZSBmaWVsZCBuYW1lIGlzIG5vdCBlbmNvZGVkIHNvIGZpZWxkIHJlbmFtZXMgaW4gdGhlIElETCBkbyBub3QgYWZmZWN0IGZvcndhcmQgYW5kIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCisKK1RoZSBkZWZhdWx0IEphdmEgaW1wbGVtZW50YXRpb24gKEFwYWNoZSBUaHJpZnQgMC45LjEpIGhhcyB1bmRlZmluZWQgYmVoYXZpb3Igd2hlbiBpdCB0cmllcyB0byBkZWNvZGUgYSBmaWVsZCB0aGF0IGhhcworYW5vdGhlciBmaWVsZC10eXBlIHRoYW4gd2hhdCBpcyBleHBlY3RlZC4gVGhlb3JldGljYWxseSB0aGlzIGNvdWxkIGJlIGRldGVjdGVkIGF0IHRoZSBjb3N0IG9mIHNvbWUgYWRkaXRpb25hbCBjaGVja2luZy4KK090aGVyIGltcGxlbWVudGF0aW9uIG1heSBwZXJmb3JtIHRoaXMgY2hlY2sgYW5kIHRoZW4gZWl0aGVyIGlnbm9yZSB0aGUgZmllbGQsIG9yIHJldHVybiBhIHByb3RvY29sIGV4Y2VwdGlvbi4KKworQSAqVW5pb24qIGlzIGVuY29kZWQgZXhhY3RseSB0aGUgc2FtZSBhcyBhIHN0cnVjdCB3aXRoIHRoZSBhZGRpdGlvbmFsIHJlc3RyaWN0aW9uIHRoYXQgYXQgbW9zdCAxIGZpZWxkIG1heSBiZSBlbmNvZGVkLgorCitBbiAqRXhjZXB0aW9uKiBpcyBlbmNvZGVkIGV4YWN0bHkgdGhlIHNhbWUgYXMgYSBzdHJ1Y3QuCisKKyMjIyBTdHJ1Y3QgZW5jb2RpbmcKKworYGBgCitDb21wYWN0IHByb3RvY29sIGZpZWxkIGhlYWRlciAoc2hvcnQgZm9ybSkgYW5kIGZpZWxkIHZhbHVlOgorKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSsKK3xkZGRkdHR0dHwgZmllbGQgdmFsdWUgICAgICAgICB8CisrLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKworCitDb21wYWN0IHByb3RvY29sIGZpZWxkIGhlYWRlciAoMSB0byAzIGJ5dGVzLCBsb25nIGZvcm0pIGFuZCBmaWVsZCB2YWx1ZToKKystLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKworfDAwMDB0dHR0fCBmaWVsZCBpZCAgICAgICAgICAgIHwgZmllbGQgdmFsdWUgICAgICAgICB8CisrLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSsKKworQ29tcGFjdCBwcm90b2NvbCBzdG9wIGZpZWxkOgorKy0tLS0tLS0tKworfDAwMDAwMDAwfAorKy0tLS0tLS0tKworYGBgCisKK1doZXJlOgorCisqIGBkZGRkYCBpcyB0aGUgZmllbGQgaWQgZGVsdGEsIGFuIHVuc2lnbmVkIDQgYml0cyBpbnRlZ2VyLCBzdHJpY3RseSBwb3NpdGl2ZS4KKyogYHR0dHRgIGlzIGZpZWxkLXR5cGUgaWQsIGFuIHVuc2lnbmVkIDQgYml0IGludGVnZXIuCisqIGBmaWVsZCBpZGAgdGhlIGZpZWxkIGlkLCBhIHNpZ25lZCAxNiBiaXQgaW50ZWdlciBlbmNvZGVkIGFzIHppZ3phZyBpbnQuCisqIGBmaWVsZC12YWx1ZWAgdGhlIGVuY29kZWQgZmllbGQgdmFsdWUuCisKK1RoZSBmaWVsZCBpZCBkZWx0YSBjYW4gYmUgY29tcHV0ZWQgYnkgYGN1cnJlbnQtZmllbGQtaWQgLSBwcmV2aW91cy1maWVsZC1pZGAsIG9yIGp1c3QgYGN1cnJlbnQtZmllbGQtaWRgIGlmIHRoaXMgaXMgdGhlCitmaXJzdCBvZiB0aGUgc3RydWN0LiBUaGUgc2hvcnQgZm9ybSBzaG91bGQgYmUgdXNlZCB3aGVuIHRoZSBmaWVsZCBpZCBkZWx0YSBpcyBpbiB0aGUgcmFuZ2UgMSAtIDE1IChpbmNsdXNpdmUpLgorCitUaGUgZm9sbG93aW5nIGZpZWxkLXR5cGVzIGNhbiBiZSBlbmNvZGVkOgorCisqIGBCT09MRUFOX1RSVUVgLCBlbmNvZGVkIGFzIGAxYAorKiBgQk9PTEVBTl9GQUxTRWAsIGVuY29kZWQgYXMgYDJgCisqIGBCWVRFYCwgZW5jb2RlZCBhcyBgM2AKKyogYEkxNmAsIGVuY29kZWQgYXMgYDRgCisqIGBJMzJgLCBlbmNvZGVkIGFzIGA1YAorKiBgSTY0YCwgZW5jb2RlZCBhcyBgNmAKKyogYERPVUJMRWAsIGVuY29kZWQgYXMgYDdgCisqIGBCSU5BUllgLCB1c2VkIGZvciBiaW5hcnkgYW5kIHN0cmluZyBmaWVsZHMsIGVuY29kZWQgYXMgYDhgCisqIGBMSVNUYCwgZW5jb2RlZCBhcyBgOWAKKyogYFNFVGAsIGVuY29kZWQgYXMgYDEwYAorKiBgTUFQYCwgZW5jb2RlZCBhcyBgMTFgCisqIGBTVFJVQ1RgLCB1c2VkIGZvciBib3RoIHN0cnVjdHMgYW5kIHVuaW9uIGZpZWxkcywgZW5jb2RlZCBhcyBgMTJgCisKK05vdGUgdGhhdCBiZWNhdXNlIHRoZXJlIGFyZSAyIHNwZWNpZmljIGZpZWxkIHR5cGVzIGZvciB0aGUgYm9vbGVhbiB2YWx1ZXMsIHRoZSBlbmNvZGluZyBvZiBhIGJvb2xlYW4gZmllbGQgdmFsdWUgaGFzIG5vCitsZW5ndGggKDAgYnl0ZXMpLgorCisjIyBMaXN0IGFuZCBTZXQKKworTGlzdCBhbmQgc2V0cyBhcmUgZW5jb2RlZCB0aGUgc2FtZTogYSBoZWFkZXIgaW5kaWNhdGluZyB0aGUgc2l6ZSBhbmQgdGhlIGVsZW1lbnQtdHlwZSBvZiB0aGUgZWxlbWVudHMsIGZvbGxvd2VkIGJ5IHRoZQorZW5jb2RlZCBlbGVtZW50cy4KKworYGBgCitDb21wYWN0IHByb3RvY29sIGxpc3QgaGVhZGVyICgxIGJ5dGUsIHNob3J0IGZvcm0pIGFuZCBlbGVtZW50czoKKystLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rCit8c3Nzc3R0dHR8IGVsZW1lbnRzICAgICAgICAgICAgfAorKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSsKKworQ29tcGFjdCBwcm90b2NvbCBsaXN0IGhlYWRlciAoMisgYnl0ZXMsIGxvbmcgZm9ybSkgYW5kIGVsZW1lbnRzOgorKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rCit8MTExMXR0dHR8IHNpemUgICAgICAgICAgICAgICAgfCBlbGVtZW50cyAgICAgICAgICAgIHwKKystLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKworYGBgCisKK1doZXJlOgorCisqIGBzc3NzYCBpcyB0aGUgc2l6ZSwgNCBiaXQgdW5zaWduZWQgaW50LCB2YWx1ZXMgYDBgIC0gYDE0YAorKiBgdHR0dGAgaXMgdGhlIGVsZW1lbnQtdHlwZSwgYSA0IGJpdCB1bnNpZ25lZCBpbnQKKyogYHNpemVgIGlzIHRoZSBzaXplLCBhIHZhciBpbnQgKGludDMyKSwgcG9zaXRpdmUgdmFsdWVzIGAxNWAgb3IgaGlnaGVyCisqIGBlbGVtZW50c2AgYXJlIHRoZSBlbmNvZGVkIGVsZW1lbnRzCisKK1RoZSBzaG9ydCBmb3JtIHNob3VsZCBiZSB1c2VkIHdoZW4gdGhlIGxlbmd0aCBpcyBpbiB0aGUgcmFuZ2UgMCAtIDE0IChpbmNsdXNpdmUpLgorCitUaGUgZm9sbG93aW5nIGVsZW1lbnQtdHlwZXMgYXJlIHVzZWQgKG5vdGUgdGhhdCB0aGVzZSBhcmUgX2RpZmZlcmVudF8gZnJvbSB0aGUgZmllbGQtdHlwZXMpOgorCisqIGBCT09MYCwgZW5jb2RlZCBhcyBgMmAKKyogYEJZVEVgLCBlbmNvZGVkIGFzIGAzYAorKiBgRE9VQkxFYCwgZW5jb2RlZCBhcyBgNGAKKyogYEkxNmAsIGVuY29kZWQgYXMgYDZgCisqIGBJMzJgLCBlbmNvZGVkIGFzIGA4YAorKiBgSTY0YCwgZW5jb2RlZCBhcyBgMTBgCisqIGBTVFJJTkdgLCB1c2VkIGZvciBiaW5hcnkgYW5kIHN0cmluZyBmaWVsZHMsIGVuY29kZWQgYXMgYDExYAorKiBgU1RSVUNUYCwgdXNlZCBmb3Igc3RydWN0cyBhbmQgdW5pb24gZmllbGRzLCBlbmNvZGVkIGFzIGAxMmAKKyogYE1BUGAsIGVuY29kZWQgYXMgYDEzYAorKiBgU0VUYCwgZW5jb2RlZCBhcyBgMTRgCisqIGBMSVNUYCwgZW5jb2RlZCBhcyBgMTVgCisKKworVGhlIG1heGltdW0gbGlzdC9zZXQgc2l6ZSBpcyBjb25maWd1cmFibGUuIEJ5IGRlZmF1bHQgdGhlcmUgaXMgbm8gbGltaXQgKG1lYW5pbmcgdGhlIGxpbWl0IGlzIHRoZSBtYXhpbXVtIGludDMyIHZhbHVlOgorMjE0NzQ4MzY0NykuCisKKyMjIE1hcAorCitNYXBzIGFyZSBlbmNvZGVkIHdpdGggYSBoZWFkZXIgaW5kaWNhdGluZyB0aGUgc2l6ZSwgdGhlIHR5cGUgb2YgdGhlIGtleXMgYW5kIHRoZSBlbGVtZW50LXR5cGUgb2YgdGhlIGVsZW1lbnRzLCBmb2xsb3dlZAorYnkgdGhlIGVuY29kZWQgZWxlbWVudHMuIFRoZSBlbmNvZGluZyBmb2xsb3dzIHRoaXMgQk5GOgorCitgYGAKK21hcCAgICAgICAgICAgOjo9IGVtcHR5LW1hcCB8IG5vbi1lbXB0eS1tYXAKK2VtcHR5LW1hcCAgICAgOjo9IGAwYAorbm9uLWVtcHR5LW1hcCA6Oj0gc2l6ZSBrZXktZWxlbWVudC10eXBlIHZhbHVlLWVsZW1lbnQtdHlwZSAoa2V5IHZhbHVlKSsKK2BgYAorCitgYGAKK0NvbXBhY3QgcHJvdG9jb2wgbWFwIGhlYWRlciAoMSBieXRlLCBlbXB0eSBtYXApOgorKy0tLS0tLS0tKworfDAwMDAwMDAwfAorKy0tLS0tLS0tKworCitDb21wYWN0IHByb3RvY29sIG1hcCBoZWFkZXIgKDIrIGJ5dGVzLCBub24gZW1wdHkgbWFwKSBhbmQga2V5IHZhbHVlIHBhaXJzOgorKy0tLS0tLS0tKy4uListLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rCit8IHNpemUgICAgICAgICAgICAgICAgfGtra2t2dnZ2fCBrZXkgdmFsdWUgcGFpcnMgICAgIHwKKystLS0tLS0tLSsuLi4rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKworYGBgCisKK1doZXJlOgorCisqIGBzaXplYCBpcyB0aGUgc2l6ZSwgYSB2YXIgaW50IChpbnQzMiksIHN0cmljdGx5IHBvc2l0aXZlIHZhbHVlcworKiBga2tra2AgaXMgdGhlIGtleSBlbGVtZW50LXR5cGUsIGEgNCBiaXQgdW5zaWduZWQgaW50CisqIGB2dnZ2YCBpcyB0aGUgdmFsdWUgZWxlbWVudC10eXBlLCBhIDQgYml0IHVuc2lnbmVkIGludAorKiBga2V5IHZhbHVlIHBhaXJzYCBhcmUgdGhlIGVuY29kZWQga2V5cyBhbmQgdmFsdWVzCisKK1RoZSBlbGVtZW50LXR5cGVzIGFyZSB0aGUgc2FtZSBhcyBmb3IgbGlzdHMuIFRoZSBmdWxsIGxpc3QgaXMgaW5jbHVkZWQgaW4gdGhlICdMaXN0IGFuZCBzZXQnIHNlY3Rpb24uCisKK1RoZSBtYXhpbXVtIG1hcCBzaXplIGlzIGNvbmZpZ3VyYWJsZS4gQnkgZGVmYXVsdCB0aGVyZSBpcyBubyBsaW1pdCAobWVhbmluZyB0aGUgbGltaXQgaXMgdGhlIG1heGltdW0gaW50MzIgdmFsdWU6CisyMTQ3NDgzNjQ3KS4KKworIyBCTkYgbm90YXRpb24gdXNlZCBpbiB0aGlzIGRvY3VtZW50CisKK1RoZSBmb2xsb3dpbmcgQk5GIG5vdGF0aW9uIGlzIHVzZWQ6CisKKyogYSBwbHVzIGArYCBhcHBlbmRlZCB0byBhbiBpdGVtIHJlcHJlc2VudHMgcmVwZXRpdGlvbjsgdGhlIGl0ZW0gaXMgcmVwZWF0ZWQgMSBvciBtb3JlIHRpbWVzCisqIGEgc3RhciBgKmAgYXBwZW5kZWQgdG8gYW4gaXRlbSByZXByZXNlbnRzIG9wdGlvbmFsIHJlcGV0aXRpb247IHRoZSBpdGVtIGlzIHJlcGVhdGVkIDAgb3IgbW9yZSB0aW1lcworKiBhIHBpcGUgYHxgIGJldHdlZW4gaXRlbXMgcmVwcmVzZW50cyBjaG9pY2UsIHRoZSBmaXJzdCBtYXRjaGluZyBpdGVtIGlzIHNlbGVjdGVkCisqIHBhcmVudGhlc2lzIGAoYCBhbmQgYClgIGFyZSB1c2VkIGZvciBncm91cGluZyBtdWx0aXBsZSBpdGVtcwpkaWZmIC0tZ2l0IGEvZG9jL3NwZWNzL3RocmlmdC1wcm90b2NvbC1zcGVjLm1kIGIvZG9jL3NwZWNzL3RocmlmdC1wcm90b2NvbC1zcGVjLm1kCmluZGV4IDQ4ZWU4MjcuLjBjMWE2MWMgMTAwNjQ0Ci0tLSBhL2RvYy9zcGVjcy90aHJpZnQtcHJvdG9jb2wtc3BlYy5tZAorKysgYi9kb2Mvc3BlY3MvdGhyaWZ0LXByb3RvY29sLXNwZWMubWQKQEAgLTEsNyArMSw5IEBACiBUaHJpZnQgUHJvdG9jb2wgU3RydWN0dXJlCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCiBMYXN0IE1vZGlmaWVkOiAyMDA3LUp1bi0yOQogCis8IS0tCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCkBAIC0yMiw2ICsyNCw3IEBACiB1bmRlciB0aGUgTGljZW5zZS4KIAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tPgogCiBUaGlzIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUgc3RydWN0dXJlIG9mIHRoZSBUaHJpZnQgcHJvdG9jb2wKIHdpdGhvdXQgc3BlY2lmeWluZyB0aGUgZW5jb2RpbmcuIFRodXMsIHRoZSBvcmRlciBvZiBlbGVtZW50cwpAQCAtMzEsMTIgKzM0LDEzIEBACiB0aGF0IHRha2UgdGhlIHBsYWNlIG9mIGFuIGFjdHVhbCBlbmNvZGluZyBzcGVjaWZpY2F0aW9uLgogCiBUaGV5IGtleSBwb2ludCB0byBub3RpY2UgaXMgdGhhdCBBTEwgbWVzc2FnZXMgYXJlIGp1c3Qgb25lIHdyYXBwZWQKLTxzdHJ1Y3Q+LiBEZXBlbmRpbmcgdXBvbiB0aGUgbWVzc2FnZSB0eXBlLCB0aGUgPHN0cnVjdD4gY2FuIGJlCitgPHN0cnVjdD5gLiBEZXBlbmRpbmcgdXBvbiB0aGUgbWVzc2FnZSB0eXBlLCB0aGUgYDxzdHJ1Y3Q+YCBjYW4gYmUKIGludGVycHJldGVkIGFzIHRoZSBhcmd1bWVudCBsaXN0IHRvIGEgZnVuY3Rpb24sIHRoZSByZXR1cm4gdmFsdWUKIG9mIGEgZnVuY3Rpb24sIG9yIGFuIGV4Y2VwdGlvbi4KIAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAorYGBgCiAgICAgICAgPG1lc3NhZ2U+IDo6PSA8bWVzc2FnZS1iZWdpbj4gPHN0cnVjdD4gPG1lc3NhZ2UtZW5kPgogCiAgPG1lc3NhZ2UtYmVnaW4+IDo6PSA8bWV0aG9kLW5hbWU+IDxtZXNzYWdlLXR5cGU+IDxtZXNzYWdlLXNlcWlkPgpAQCAtOTQsMyArOTgsNCBAQAogIDxzZXQtZWxlbS10eXBlPiA6Oj0gPGZpZWxkLXR5cGU+CiAKICAgICAgIDxzZXQtc2l6ZT4gOjo9IEkzMgorYGBgCmRpZmYgLS1naXQgYS9kb2Mvc3BlY3MvdGhyaWZ0LXJwYy5tZCBiL2RvYy9zcGVjcy90aHJpZnQtcnBjLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0NWMwNmYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc3BlY3MvdGhyaWZ0LXJwYy5tZApAQCAtMCwwICsxLDE3OCBAQAorVGhyaWZ0IFJlbW90ZSBQcm9jZWR1cmUgQ2FsbAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCis8IS0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCitvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQordG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQord2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKK0tJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCitzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCit1bmRlciB0aGUgTGljZW5zZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tPgorCitUaGlzIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUgaGlnaCBsZXZlbCBtZXNzYWdlIGV4Y2hhbmdlIGJldHdlZW4gdGhlIFRocmlmdCBSUEMgY2xpZW50IGFuZCBzZXJ2ZXIuCitTZWUgW3RocmlmdC1iaW5hcnktcHJvdG9jb2wubWRdIGFuZCBbdGhyaWZ0LWNvbXBhY3QtcHJvdG9jb2wubWRdIGZvciBhIGRlc2NyaXB0aW9uIG9mIGhvdyB0aGUgZXhjaGFuZ2VzIGFyZSBlbmNvZGVkIG9uCit0aGUgd2lyZS4KKworSW4gYWRkaXRpb24sIHRoaXMgZG9jdW1lbnQgY29tcGFyZXMgdGhlIGJpbmFyeSBwcm90b2NvbCB3aXRoIHRoZSBjb21wYWN0IHByb3RvY29sLiBGaW5hbGx5IGl0IGRlc2NyaWJlcyB0aGUgZnJhbWVkIHZzLgordW5mcmFtZWQgdHJhbnNwb3J0LgorCitUaGUgaW5mb3JtYXRpb24gaGVyZSBpcyBfbW9zdGx5XyBiYXNlZCBvbiB0aGUgSmF2YSBpbXBsZW1lbnRhdGlvbiBpbiB0aGUgQXBhY2hlIHRocmlmdCBsaWJyYXJ5ICh2ZXJzaW9uIDAuOS4xIGFuZAorMC45LjMpLiBPdGhlciBpbXBsZW1lbnRhdGlvbiBob3dldmVyLCBzaG91bGQgYmVoYXZlIHRoZSBzYW1lLgorCitGb3IgYmFja2dyb3VuZCBvbiBUaHJpZnQgc2VlIHRoZSBbVGhyaWZ0IHdoaXRlcGFwZXIgKHBkZildKGh0dHBzOi8vdGhyaWZ0LmFwYWNoZS5vcmcvc3RhdGljL2ZpbGVzL3RocmlmdC0yMDA3MDQwMS5wZGYpLgorCisjIENvbnRlbnRzCisKKyogVGhyaWZ0IE1lc3NhZ2UgZXhjaGFuZ2UgZm9yIFJlbW90ZSBQcm9jZWR1cmUgQ2FsbAorICAqIE1lc3NhZ2UKKyAgKiBSZXF1ZXN0IHN0cnVjdAorICAqIFJlc3BvbnNlIHN0cnVjdAorKiBQcm90b2NvbCBjb25zaWRlcmF0aW9ucworICAqIENvbXBhcmluZyBiaW5hcnkgYW5kIGNvbXBhY3QgcHJvdG9jb2wKKyAgKiBDb21wYXRpYmlsaXR5CisgICogRnJhbWVkIHZzIHVuZnJhbWVkIHRyYW5zcG9ydAorCisjIFRocmlmdCBSZW1vdGUgUHJvY2VkdXJlIENhbGwgTWVzc2FnZSBleGNoYW5nZQorCitCb3RoIHRoZSBiaW5hcnkgcHJvdG9jb2wgYW5kIHRoZSBjb21wYWN0IHByb3RvY29sIGFzc3VtZSBhIHRyYW5zcG9ydCBsYXllciB0aGF0IGV4cG9zZXMgYSBiaS1kaXJlY3Rpb25hbCBieXRlIHN0cmVhbSwKK2ZvciBleGFtcGxlIGEgVENQIHNvY2tldC4gQm90aCB1c2UgdGhlIGZvbGxvd2luZyBleGNoYW5nZToKKworMS4gQ2xpZW50IHNlbmRzIGEgYE1lc3NhZ2VgICh0eXBlIGBDYWxsYCBvciBgT25ld2F5YCkuIFRoZSBUTWVzc2FnZSBjb250YWlucyBzb21lIG1ldGFkYXRhIGFuZCB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kCisgICB0byBpbnZva2UuCisyLiBDbGllbnQgc2VuZHMgbWV0aG9kIGFyZ3VtZW50cyAoYSBzdHJ1Y3QgZGVmaW5lZCBieSB0aGUgZ2VuZXJhdGUgY29kZSkuCiszLiBTZXJ2ZXIgc2VuZHMgYSBgTWVzc2FnZWAgKHR5cGUgYFJlcGx5YCBvciBgRXhjZXB0aW9uYCkgdG8gc3RhcnQgdGhlIHJlc3BvbnNlLgorNC4gU2VydmVyIHNlbmRzIGEgc3RydWN0IGNvbnRhaW5pbmcgdGhlIG1ldGhvZCByZXN1bHQgb3IgZXhjZXB0aW9uLgorCitUaGUgcGF0dGVybiBpcyBhIHNpbXBsZSBoYWxmIGR1cGxleCBwcm90b2NvbCB3aGVyZSB0aGUgcGFydGllcyBhbHRlcm5hdGUgaW4gc2VuZGluZyBhIGBNZXNzYWdlYCBmb2xsb3dlZCBieSBhIHN0cnVjdC4KK1doYXQgdGhlc2UgYXJlIGlzIGRlc2NyaWJlZCBiZWxvdy4KKworQWx0aG91Z2ggdGhlIHN0YW5kYXJkIEFwYWNoZSBUaHJpZnQgSmF2YSBjbGllbnRzIGRvIG5vdCBzdXBwb3J0IHBpcGVsaW5pbmcgKHNlbmRpbmcgbXVsdGlwbGUgcmVxdWVzdHMgd2l0aG91dCB3YWl0aW5nCitmb3IgYW4gcmVzcG9uc2UpLCB0aGUgc3RhbmRhcmQgQXBhY2hlIFRocmlmdCBKYXZhIHNlcnZlcnMgZG8gc3VwcG9ydCBpdC4KKworIyMgTWVzc2FnZQorCitBICpNZXNzYWdlKiBjb250YWluczoKKworKiBfTmFtZV8sIGEgc3RyaW5nIChjYW4gYmUgZW1wdHkpLgorKiBfTWVzc2FnZSB0eXBlXywgYSBtZXNzYWdlIHR5cGVzLCBvbmUgb2YgYENhbGxgLCBgUmVwbHlgLCBgRXhjZXB0aW9uYCBhbmQgYE9uZXdheWAuCisqIF9TZXF1ZW5jZSBpZF8sIGEgc2lnbmVkIGludDMyIGludGVnZXIuCisKK1RoZSAqc2VxdWVuY2UgaWQqIGlzIGEgc2ltcGxlIG1lc3NhZ2UgaWQgYXNzaWduZWQgYnkgdGhlIGNsaWVudC4gVGhlIHNlcnZlciB3aWxsIHVzZSB0aGUgc2FtZSBzZXF1ZW5jZSBpZCBpbiB0aGUKK21lc3NhZ2Ugb2YgdGhlIHJlc3BvbnNlLiBUaGUgY2xpZW50IHVzZXMgdGhpcyBudW1iZXIgdG8gZGV0ZWN0IG91dCBvZiBvcmRlciByZXNwb25zZXMuIEVhY2ggY2xpZW50IGhhcyBhbiBpbnQzMiBmaWVsZAord2hpY2ggaXMgaW5jcmVhc2VkIGZvciBlYWNoIG1lc3NhZ2UuIFRoZSBzZXF1ZW5jZSBpZCBzaW1wbHkgd3JhcHMgYXJvdW5kIHdoZW4gaXQgb3ZlcmZsb3dzLgorCitUaGUgKm5hbWUqIGluZGljYXRlcyB0aGUgc2VydmljZSBtZXRob2QgbmFtZSB0byBpbnZva2UuIFRoZSBzZXJ2ZXIgY29waWVzIHRoZSBuYW1lIGluIHRoZSByZXNwb25zZSBtZXNzYWdlLgorCitXaGVuIHRoZSAqbXVsdGlwbGV4ZWQgcHJvdG9jb2wqIGlzIHVzZWQsIHRoZSBuYW1lIGNvbnRhaW5zIHRoZSBzZXJ2aWNlIG5hbWUsIGEgY29sb24gYDpgIGFuZCB0aGUgbWV0aG9kIG5hbWUuIFRoZQorbXVsdGlwbGV4ZWQgcHJvdG9jb2wgaXMgbm90IGNvbXBhdGlibGUgd2l0aCBvdGhlciBwcm90b2NvbHMuCisKK1RoZSAqbWVzc2FnZSB0eXBlKiBpbmRpY2F0ZXMgd2hhdCBraW5kIG9mIG1lc3NhZ2UgaXMgc2VudC4gQ2xpZW50cyBzZW5kIHJlcXVlc3RzIHdpdGggVE1lc3NhZ2VzIG9mIHR5cGUgYENhbGxgIG9yCitgT25ld2F5YCAoc3RlcCAxIGluIHRoZSBwcm90b2NvbCBleGNoYW5nZSkuIFNlcnZlcnMgc2VuZCByZXNwb25zZXMgd2l0aCBtZXNzYWdlcyBvZiB0eXBlIGBFeGNlcHRpb25gIG9yIGBSZXBseWAgKHN0ZXAKKzMpLgorCitUeXBlIGBSZXBseWAgaXMgdXNlZCB3aGVuIHRoZSBzZXJ2aWNlIG1ldGhvZCBjb21wbGV0ZXMgbm9ybWFsbHkuIFRoYXQgaXMsIGl0IHJldHVybnMgYSB2YWx1ZSBvciBpdCB0aHJvd3Mgb25lIG9mIHRoZQorZXhjZXB0aW9ucyBkZWZpbmVkIGluIHRoZSBUaHJpZnQgSURMIGZpbGUuCisKK1R5cGUgYEV4Y2VwdGlvbmAgaXMgdXNlZCBmb3Igb3RoZXIgZXhjZXB0aW9ucy4gVGhhdCBpczogd2hlbiB0aGUgc2VydmljZSBtZXRob2QgdGhyb3dzIGFuIGV4Y2VwdGlvbiB0aGF0IGlzIG5vdCBkZWNsYXJlZAoraW4gdGhlIFRocmlmdCBJREwgZmlsZSwgb3Igc29tZSBvdGhlciBwYXJ0IG9mIHRoZSBUaHJpZnQgc3RhY2sgdGhyb3dzIGFuIGV4Y2VwdGlvbi4gRm9yIGV4YW1wbGUgd2hlbiB0aGUgc2VydmVyIGNvdWxkCitub3QgZW5jb2RlIG9yIGRlY29kZSBhIG1lc3NhZ2Ugb3Igc3RydWN0LgorCitJbiB0aGUgSmF2YSBpbXBsZW1lbnRhdGlvbiAoMC45LjMpIHRoZXJlIGlzIGRpZmZlcmVudCBiZWhhdmlvciBmb3IgdGhlIHN5bmNocm9ub3VzIGFuZCBhc3luY2hyb25vdXMgc2VydmVyLiBJbiB0aGUgYXN5bmMKK3NlcnZlciBhbGwgZXhjZXB0aW9ucyBhcmUgc2VuZCBhcyBhIGBUQXBwbGljYXRpb25FeGNlcHRpb25gIChzZWUgJ1Jlc3BvbnNlIHN0cnVjdCcgYmVsb3cpLiBJbiB0aGUgc3luY2hyb25vdXMgSmF2YQoraW1wbGVtZW50YXRpb24gb25seSAodW5kZWNsYXJlZCkgZXhjZXB0aW9ucyB0aGF0IGV4dGVuZCBgVEV4Y2VwdGlvbmAgYXJlIHNlbmQgYXMgYSBgVEFwcGxpY2F0aW9uRXhjZXB0aW9uYC4gVW5jaGVja2VkCitleGNlcHRpb25zIGxlYWQgdG8gYW4gaW1tZWRpYXRlIGNsb3NlIG9mIHRoZSBjb25uZWN0aW9uLgorCitUeXBlIGBPbmV3YXlgIGlzIG9ubHkgdXNlZCBzdGFydGluZyBmcm9tIEFwYWNoZSBUaHJpZnQgMC45LjMuIEVhcmxpZXIgdmVyc2lvbnMgZG8gX25vdF8gc2VuZCBUTWVzc2FnZXMgb2YgdHlwZSBgT25ld2F5YCwKK2V2ZW4gZm9yIHNlcnZpY2UgbWV0aG9kcyBkZWZpbmVkIHdpdGggdGhlIGBvbmV3YXlgIG1vZGlmaWVyLgorCitXaGVuIGNsaWVudCBzZW5kcyBhIHJlcXVlc3Qgd2l0aCB0eXBlIGBPbmV3YXlgLCB0aGUgc2VydmVyIG11c3QgX25vdF8gc2VuZCBhIHJlc3BvbnNlIChzdGVwcyAzIGFuZCA0IGFyZSBza2lwcGVkKS4gTm90ZQordGhhdCB0aGUgVGhyaWZ0IElETCBlbmZvcmNlcyBhIHJldHVybiB0eXBlIG9mIGB2b2lkYCBhbmQgZG9lcyBub3QgYWxsb3cgZXhjZXB0aW9ucyBmb3Igb25ld2F5IHNlcnZpY2VzLgorCisjIyBSZXF1ZXN0IHN0cnVjdAorCitUaGUgc3RydWN0IHRoYXQgZm9sbG93cyB0aGUgbWVzc2FnZSBvZiB0eXBlIGBDYWxsYCBvciBgT25ld2F5YCBjb250YWlucyB0aGUgYXJndW1lbnRzIG9mIHRoZSBzZXJ2aWNlIG1ldGhvZC4gVGhlCithcmd1bWVudCBpZHMgY29ycmVzcG9uZCB0byB0aGUgZmllbGQgaWRzLiBUaGUgbmFtZSBvZiB0aGUgc3RydWN0IGlzIHRoZSBuYW1lIG9mIHRoZSBtZXRob2Qgd2l0aCBgX2FyZ3NgIGFwcGVuZGVkLgorRm9yIG1ldGhvZHMgd2l0aG91dCBhcmd1bWVudHMgYW4gc3RydWN0IGlzIHNlbnQgd2l0aG91dCBmaWVsZHMuCisKKyMjIFJlc3BvbnNlIHN0cnVjdAorCitUaGUgc3RydWN0IHRoYXQgZm9sbG93cyB0aGUgbWVzc2FnZSBvZiB0eXBlIGBSZXBseWAgYXJlIHN0cnVjdHMgaW4gd2hpY2ggZXhhY3RseSAxIG9mIHRoZSBmb2xsb3dpbmcgZmllbGRzIGlzIGVuY29kZWQ6CisKKyogQSBmaWVsZCB3aXRoIG5hbWUgYHN1Y2Nlc3NgIGFuZCBpZCBgMGAsIHVzZWQgaW4gY2FzZSB0aGUgbWV0aG9kIGNvbXBsZXRlZCBub3JtYWxseS4KKyogQW4gZXhjZXB0aW9uIGZpZWxkLCBuYW1lIGFuZCBpZCBhcmUgYXMgZGVmaW5lZCBpbiB0aGUgYHRocm93c2AgY2xhdXNlIGluIHRoZSBUaHJpZnQgSURMJ3Mgc2VydmljZSBtZXRob2QgZGVmaW5pdGlvbi4KKworV2hlbiB0aGUgbWVzc2FnZSBpcyBvZiB0eXBlIGBFeGNlcHRpb25gIHRoZSBzdHJ1Y3QgaXMgZW5jb2RlZCBhcyBpZiBpdCB3YXMgZGVjbGFyZWQgYnkgdGhlIGZvbGxvd2luZyBJREw6CisKK2BgYAorZXhjZXB0aW9uIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgIDE6IHN0cmluZyBtZXNzYWdlLAorICAyOiBpMzIgdHlwZQorfQorYGBgCisKK1RoZSBmb2xsb3dpbmcgZXhjZXB0aW9uIHR5cGVzIGFyZSBkZWZpbmVkIGluIHRoZSBqYXZhIGltcGxlbWVudGF0aW9uICgwLjkuMyk6CisKKyogX3Vua25vd25fOiAwLCB1c2VkIGluIGNhc2UgdGhlIHR5cGUgZnJvbSB0aGUgcGVlciBpcyB1bmtub3duLgorKiBfdW5rbm93biBtZXRob2RfOiAxLCB1c2VkIGluIGNhc2UgdGhlIG1ldGhvZCByZXF1ZXN0ZWQgYnkgdGhlIGNsaWVudCBpcyB1bmtub3duIGJ5IHRoZSBzZXJ2ZXIuCisqIF9pbnZhbGlkIG1lc3NhZ2UgdHlwZV86IDIsIG5vIHVzYWdlIHdhcyBmb3VuZC4KKyogX3dyb25nIG1ldGhvZCBuYW1lXzogMywgbm8gdXNhZ2Ugd2FzIGZvdW5kLgorKiBfYmFkIHNlcXVlbmNlIGlkXzogNCwgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBjbGllbnQgdG8gaW5kaWNhdGUgYSB3cm9uZyBzZXF1ZW5jZSBpZCBpbiB0aGUgcmVzcG9uc2UuCisqIF9taXNzaW5nIHJlc3VsdF86IDUsIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgY2xpZW50IHRvIGluZGljYXRlIGEgcmVzcG9uc2Ugd2l0aG91dCBhbnkgZmllbGQgKHJlc3VsdCBub3IgZXhjZXB0aW9uKS4KKyogX2ludGVybmFsIGVycm9yXzogNiwgdXNlZCB3aGVuIHRoZSBzZXJ2ZXIgdGhyb3dzIGFuIGV4Y2VwdGlvbiB0aGF0IGlzIG5vdCBkZWNsYXJlZCBpbiB0aGUgVGhyaWZ0IElETCBmaWxlLiAKKyogX3Byb3RvY29sIGVycm9yXzogNywgdXNlZCB3aGVuIHNvbWV0aGluZyBnb2VzIHdyb25nIGR1cmluZyBkZWNvZGluZy4gRm9yIGV4YW1wbGUgd2hlbiBhIGxpc3QgaXMgdG9vIGxvbmcgb3IgYSByZXF1aXJlZAorIGZpZWxkIGlzIG1pc3NpbmcuIAorKiBfaW52YWxpZCB0cmFuc2Zvcm1fOiA4LCBubyB1c2FnZSB3YXMgZm91bmQuCisqIF9pbnZhbGlkIHByb3RvY29sXzogOSwgbm8gdXNhZ2Ugd2FzIGZvdW5kLgorKiBfdW5zdXBwb3J0ZWQgY2xpZW50IHR5cGVfOiAxMCwgbm8gdXNhZ2Ugd2FzIGZvdW5kLgorCisjIFByb3RvY29sIGNvbnNpZGVyYXRpb25zCisKKyMjIENvbXBhcmluZyBiaW5hcnkgYW5kIGNvbXBhY3QgcHJvdG9jb2wKKworVGhlIGJpbmFyeSBwcm90b2NvbCBpcyBmYWlybHkgc2ltcGxlIGFuZCB0aGVyZWZvcmUgZWFzeSB0byBwcm9jZXNzLiBUaGUgY29tcGFjdCBwcm90b2NvbCBuZWVkcyBsZXNzIGJ5dGVzIHRvIHNlbmQgdGhlCitzYW1lIGRhdGEgYXQgdGhlIGNvc3Qgb2YgYWRkaXRpb25hbCBwcm9jZXNzaW5nLiBBcyBiYW5kd2lkdGggaXMgdXN1YWxseSB0aGUgYm90dGxlbmVjaywgdGhlIGNvbXBhY3QgcHJvdG9jb2wgaXMgYWxtb3N0CithbHdheXMgc2xpZ2h0bHkgZmFzdGVyLgorCisjIyBDb21wYXRpYmlsaXR5CisKK0Egc2VydmVyIGNvdWxkIGF1dG9tYXRpY2FsbHkgZGV0ZXJtaW5lIHdoZXRoZXIgYSBjbGllbnQgdGFsa3MgdGhlIGJpbmFyeSBwcm90b2NvbCBvciB0aGUgY29tcGFjdCBwcm90b2NvbCBieQoraW52ZXN0aWdhdGluZyB0aGUgZmlyc3QgYnl0ZS4gSWYgdGhlIHZhbHVlIGlzIGAxMDAwIDAwMDFgIG9yIGAwMDAwIDAwMDBgIChhc3N1bWluZyBhIG5hbWUgc2hvcnRlciB0aGVuIMKxMTYgTUIpIGl0IGlzIHRoZQorYmluYXJ5IHByb3RvY29sLiBXaGVuIHRoZSB2YWx1ZSBpcyBgMTAwMCAwMDEwYCBpdCBpcyB0YWxraW5nIHRoZSBjb21wYWN0IHByb3RvY29sLgorCisjIyBGcmFtZWQgdnMuIHVuZnJhbWVkIHRyYW5zcG9ydAorCitUaGUgZmlyc3QgdGhyaWZ0IGJpbmFyeSB3aXJlIGZvcm1hdCB3YXMgdW5mcmFtZWQuIFRoaXMgbWVhbnMgdGhhdCBpbmZvcm1hdGlvbiBpcyBzZW50IG91dCBpbiBhIHNpbmdsZSBzdHJlYW0gb2YgYnl0ZXMuCitXaXRoIHVuZnJhbWVkIHRyYW5zcG9ydCB0aGUgKGdlbmVyYXRlZCkgcHJvY2Vzc29ycyB3aWxsIHJlYWQgZGlyZWN0bHkgZnJvbSB0aGUgc29ja2V0ICh0aG91Z2ggQXBhY2hlIFRocmlmdCBkb2VzIHRyeSB0bworZ3JhYiBhbGwgYXZhaWxhYmxlIGJ5dGVzIGZyb20gdGhlIHNvY2tldCBpbiBhIGJ1ZmZlciB3aGVuIGl0IGNhbikuCisKK0xhdGVyLCBUaHJpZnQgaW50cm9kdWNlZCB0aGUgZnJhbWVkIHRyYW5zcG9ydC4KKworV2l0aCBmcmFtZWQgdHJhbnNwb3J0IHRoZSBmdWxsIHJlcXVlc3QgYW5kIHJlc3BvbnNlICh0aGUgVE1lc3NhZ2UgYW5kIHRoZSBmb2xsb3dpbmcgc3RydWN0KSBhcmUgZmlyc3Qgd3JpdHRlbiB0byBhCitidWZmZXIuIFRoZW4gd2hlbiB0aGUgc3RydWN0IGlzIGNvbXBsZXRlICh0cmFuc3BvcnQgbWV0aG9kIGBmbHVzaGAgaXMgaGlqYWNrZWQgZm9yIHRoaXMpLCB0aGUgbGVuZ3RoIG9mIHRoZSBidWZmZXIgaXMKK3dyaXR0ZW4gdG8gdGhlIHNvY2tldCBmaXJzdCwgZm9sbG93ZWQgYnkgdGhlIGJ1ZmZlcmVkIGJ5dGVzLiBUaGUgY29tYmluYXRpb24gaXMgY2FsbGVkIGEgX2ZyYW1lXy4gT24gdGhlIHJlY2VpdmVyIHNpZGUKK3RoZSBjb21wbGV0ZSBmcmFtZSBpcyBmaXJzdCByZWFkIGluIGEgYnVmZmVyIGJlZm9yZSB0aGUgbWVzc2FnZSBpcyBwYXNzZWQgdG8gYSBwcm9jZXNzb3IuCisKK1RoZSBsZW5ndGggcHJlZml4IGlzIGEgNCBieXRlIHNpZ25lZCBpbnQsIHNlbmQgaW4gbmV0d29yayAoYmlnIGVuZGlhbikgb3JkZXIuCitUaGUgZm9sbG93aW5nIG11c3QgYmUgdHJ1ZTogYDBgIDw9IGxlbmd0aCA8PSBgMTYzODQwMDBgICgxNk0pLgorCitGcmFtZWQgdHJhbnNwb3J0IHdhcyBpbnRyb2R1Y2VkIHRvIGVhc2UgdGhlIGltcGxlbWVudGF0aW9uIG9mIGFzeW5jIHByb2Nlc3NvcnMuIEFuIGFzeW5jIHByb2Nlc3NvciBpcyBvbmx5IGludm9rZWQgd2hlbgorYWxsIGRhdGEgaXMgcmVjZWl2ZWQuIFVuZm9ydHVuYXRlbHksIGZyYW1lZCB0cmFuc3BvcnQgaXMgbm90IGlkZWFsIGZvciBsYXJnZSBtZXNzYWdlcyBhcyB0aGUgZW50aXJlIGZyYW1lIHN0YXlzIGluCittZW1vcnkgdW50aWwgdGhlIG1lc3NhZ2UgaGFzIGJlZW4gcHJvY2Vzc2VkLiBJbiBhZGRpdGlvbiwgdGhlIGphdmEgaW1wbGVtZW50YXRpb24gbWVyZ2VzIHRoZSBpbmNvbWluZyBkYXRhIHRvIGEgc2luZ2xlLAorZ3Jvd2luZyBieXRlIGFycmF5LiBFdmVyeSB0aW1lIHRoZSBieXRlIGFycmF5IGlzIGZ1bGwgaXQgbmVlZHMgdG8gYmUgY29waWVkIHRvIGEgbmV3IGxhcmdlciBieXRlIGFycmF5LgorCitGcmFtZWQgYW5kIHVuZnJhbWVkIHRyYW5zcG9ydHMgYXJlIG5vdCBjb21wYXRpYmxlIHdpdGggZWFjaCBvdGhlci4KZGlmZiAtLWdpdCBhL2R1Yi5qc29uIGIvZHViLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY3NmFmYwotLS0gL2Rldi9udWxsCisrKyBiL2R1Yi5qc29uCkBAIC0wLDAgKzEsMjggQEAKK3sKKyAgIm5hbWUiOiAiYXBhY2hlLXRocmlmdCIsCisgICJkZXNjcmlwdGlvbiI6ICJBcGFjaGUgVGhyaWZ0IEQgbGlicmFyeSIsCisgICJhdXRob3JzIjogWworICAgICJBcGFjaGUgVGhyaWZ0IERldmVsb3BlcnMgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4iCisgIF0sCisgICJob21lcGFnZSI6ICJodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmciLAorICAibGljZW5zZSI6ICJBcGFjaGUtMi4wIiwKKyAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAibGliZXZlbnQiOiB7CisgICAgICAidmVyc2lvbiI6ICJ+PjIuMC4yIgorICAgIH0sCisgICAgIm9wZW5zc2wiOiB7CisgICAgICAidmVyc2lvbiI6ICI+PTEuMS42IgorICAgIH0KKyAgfSwKKyAgInN5c3RlbURlcGVuZGVuY2llcyI6ICJPbiBzeXN0ZW1zIHdpdGggbmF0aXZlIG9wZW5zc2wgMS4wLnggdXNlIGR1YiBwYWNrYWdlIG9wZW5zc2x+PjEuMSwgb24gc3lzdGVtcyB3aXRoIG5hdGl2ZSBvcGVuc3NsIDEuMS54IHVzZSBkdWIgcGFja2FnZSBvcGVuc3Nsfj4yLjAiLAorICAidGFyZ2V0VHlwZSI6ICJsaWJyYXJ5IiwKKyAgInNvdXJjZVBhdGhzIjogWworICAgICJsaWIvZC9zcmMiIAorICBdLAorICAiaW1wb3J0UGF0aHMiOiBbCisgICAgImxpYi9kL3NyYyIKKyAgXSwKKyAgImV4Y2x1ZGVkU291cmNlRmlsZXMiOiBbCisgICAgImxpYi9kL3NyYy90aHJpZnQvaW5kZXguZCIKKyAgXQorfQpkaWZmIC0tZ2l0IGEvbGliL01ha2VmaWxlLmFtIGIvbGliL01ha2VmaWxlLmFtCmluZGV4IDU3NTFhMmMuLmI2Y2UyMGUgMTAwNjQ0Ci0tLSBhL2xpYi9NYWtlZmlsZS5hbQorKysgYi9saWIvTWFrZWZpbGUuYW0KQEAgLTE3LDExICsxNywxNSBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotU1VCRElSUyA9CitTVUJESVJTID0ganNvbiB4bWwKK1BSRUNST1NTX1RBUkdFVCA9CiAKIGlmIFdJVEhfQ1BQCisjIGNwcCBkaXIgaXMgcGlja2VkIGRpcmVjdGx5IGJ5IHBsdWdpbiBidWlsZAoraWYgIVdJVEhfUExVR0lOCiBTVUJESVJTICs9IGNwcAogZW5kaWYKK2VuZGlmCiAKIGlmIFdJVEhfQ19HTElCCiBTVUJESVJTICs9IGNfZ2xpYgpAQCAtMzMsOSArMzcsMTAgQEAKIAogaWYgV0lUSF9KQVZBCiBTVUJESVJTICs9IGphdmEKK1BSRUNST1NTX1RBUkdFVCArPSBwcmVjcm9zcy1qYXZhCiAjIEphdmFTY3JpcHQgdW5pdCB0ZXN0IGRlcGVuZHMgb24gamF2YQogIyBzbyB0ZXN0IG9ubHkgaWYgamF2YSwgYW50ICYgY28gaXMgYXZhaWxhYmxlCi1TVUJESVJTICs9IGpzL3Rlc3QKK1NVQkRJUlMgKz0ganMKIGVuZGlmCiAKIGlmIFdJVEhfUFlUSE9OCkBAIC02MiwzMSArNjcsNjAgQEAKIFNVQkRJUlMgKz0gcGhwCiBlbmRpZgogCitpZiBXSVRIX0RBUlQKK1NVQkRJUlMgKz0gZGFydAorZW5kaWYKKworaWYgV0lUSF9ET1RORVRDT1JFCitTVUJESVJTICs9IG5ldGNvcmUKK2VuZGlmCisKIGlmIFdJVEhfR08KIFNVQkRJUlMgKz0gZ28KIGVuZGlmCiAKIGlmIFdJVEhfRAogU1VCRElSUyArPSBkCitQUkVDUk9TU19UQVJHRVQgKz0gcHJlY3Jvc3MtZAogZW5kaWYKIAogaWYgV0lUSF9OT0RFSlMKIFNVQkRJUlMgKz0gbm9kZWpzCitQUkVDUk9TU19UQVJHRVQgKz0gcHJlY3Jvc3Mtbm9kZWpzCitTVUJESVJTICs9IG5vZGV0cwogZW5kaWYKIAogaWYgV0lUSF9MVUEKIFNVQkRJUlMgKz0gbHVhCiBlbmRpZgogCitpZiBXSVRIX1JTCitTVUJESVJTICs9IHJzCitlbmRpZgorCitpZiBXSVRIX0NMCitTVUJESVJTICs9IGNsCitlbmRpZgorCitpZiBXSVRIX1NXSUZUCitTVUJESVJTICs9IHN3aWZ0CitlbmRpZgorCiAjIEFsbCBvZiB0aGUgbGlicyB0aGF0IGRvbid0IHVzZSBBdXRvbWFrZSBuZWVkIHRvIGdvIGluIGhlcmUKICMgc28gdGhleSB3aWxsIGVuZCB1cCBpbiBvdXIgcmVsZWFzZSB0YXJiYWxscy4KIEVYVFJBX0RJU1QgPSBcCiAJYXMzIFwKIAljb2NvYSBcCiAJZCBcCisJZGFydCBcCiAJZGVscGhpIFwKKwloYXhlIFwKIAlqYXZhbWUgXAogCWpzIFwKIAlvY2FtbCBcCiAJc3QgXAogCXRzCisKK3ByZWNyb3NzLSU6CisJJChNQUtFKSAtQyAkKiBwcmVjcm9zcworcHJlY3Jvc3M6ICQoUFJFQ1JPU1NfVEFSR0VUKQpkaWZmIC0tZ2l0IGEvbGliL2FzMy9idWlsZC5wcm9wZXJ0aWVzIGIvbGliL2FzMy9idWlsZC5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0NjM2NjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvYXMzL2J1aWxkLnByb3BlcnRpZXMKQEAgLTAsMCArMSw1IEBACisjIE1hdmVuIEFudCB0YXNrcyBKYXIgZGV0YWlscworbXZuLmFudC50YXNrLnZlcnNpb249Mi4xLjMKK212bi5yZXBvPWh0dHA6Ly9yZXBvMS5tYXZlbi5vcmcvbWF2ZW4yCittdm4uYW50LnRhc2sudXJsPSR7bXZuLnJlcG99L29yZy9hcGFjaGUvbWF2ZW4vbWF2ZW4tYW50LXRhc2tzLyR7bXZuLmFudC50YXNrLnZlcnNpb259Cittdm4uYW50LnRhc2suamFyPW1hdmVuLWFudC10YXNrcy0ke212bi5hbnQudGFzay52ZXJzaW9ufS5qYXIKZGlmZiAtLWdpdCBhL2xpYi9hczMvYnVpbGQueG1sIGIvbGliL2FzMy9idWlsZC54bWwKaW5kZXggNjA0ZGE0Mi4uYjBjNGM4NSAxMDA3NTUKLS0tIGEvbGliL2FzMy9idWlsZC54bWwKKysrIGIvbGliL2FzMy9idWlsZC54bWwKQEAgLTcsOSArNyw5IEBACiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKICB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAKKwogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIAorCiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCkBAIC0xOSwyMyArMTksMjQgQEAKICAtLT4KIDxwcm9qZWN0IG5hbWU9ImxpYnRocmlmdC1hczMiIGRlZmF1bHQ9ImNvbXBpbGUiIGJhc2VkaXI9Ii4iCiAgIHhtbG5zOmFydGlmYWN0PSJhbnRsaWI6b3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5hbnQiPgotCQorCiAgIDxwcm9wZXJ0eSBuYW1lPSJhczMuYXJ0aWZhY3RpZCIgdmFsdWU9IiR7YW50LnByb2plY3QubmFtZX0iLz4KLQkKKwogICA8cHJvcGVydHkgbmFtZT0idGhyaWZ0LnJvb3QiIGxvY2F0aW9uPSIke2Jhc2VkaXJ9Ly4uLy4uLyIvPgogICA8cHJvcGVydHkgbmFtZT0idGhyaWZ0LmphdmEuZGlyIiBsb2NhdGlvbj0iJHt0aHJpZnQucm9vdH0vbGliL2phdmEiLz4KICAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLnRvb2xzLmRpciIgbG9jYXRpb249IiR7dGhyaWZ0LmphdmEuZGlyfS9idWlsZC90b29scy8iLz4KLSAgPHByb3BlcnR5IG5hbWU9InRocmlmdF9jb21waWxlciIgdmFsdWU9IiR7dGhyaWZ0LnJvb3R9L2NvbXBpbGVyL2NwcC90aHJpZnQiLz4gCisgIDxwcm9wZXJ0eSBuYW1lPSJ0aHJpZnRfY29tcGlsZXIiIHZhbHVlPSIke3RocmlmdC5yb290fS9jb21waWxlci9jcHAvdGhyaWZ0Ii8+CisgIDxwcm9wZXJ0eSBmaWxlPSIke2Jhc2VkaXJ9L2J1aWxkLnByb3BlcnRpZXMiLz4KIAogICA8IS0tIGluaGVyaXQgZnJvbSB0aGUgamF2YSBidWlsZCBmaWxlIGZvciB2ZXJzaW9uIGFuZCBvdGhlciBwcm9wZXJ0aWVzIC0tPgotICA8cHJvcGVydHkgZmlsZT0iJHt0aHJpZnQuamF2YS5kaXJ9L2J1aWxkLnByb3BlcnRpZXMiIC8+CisgIDxwcm9wZXJ0eSBmaWxlPSIke3RocmlmdC5qYXZhLmRpcn0vZ3JhZGxlLnByb3BlcnRpZXMiIC8+CiAKICAgPHByb3BlcnR5IGVudmlyb25tZW50PSJlbnYiLz4KIAogICA8Y29uZGl0aW9uIHByb3BlcnR5PSJ2ZXJzaW9uIiB2YWx1ZT0iJHt0aHJpZnQudmVyc2lvbn0iPgogICAgIDxpc3NldCBwcm9wZXJ0eT0icmVsZWFzZSIvPgogICA8L2NvbmRpdGlvbj4KLSAgPHByb3BlcnR5IG5hbWU9InZlcnNpb24iIHZhbHVlPSIke3RocmlmdC52ZXJzaW9ufS1zbmFwc2hvdCIvPgorICA8cHJvcGVydHkgbmFtZT0idmVyc2lvbiIgdmFsdWU9IiR7dGhyaWZ0LnZlcnNpb259LVNOQVBTSE9UIi8+CiAKICAgPHByb3BlcnR5IG5hbWU9ImFzMy5maW5hbC5uYW1lIiB2YWx1ZT0iJHthczMuYXJ0aWZhY3RpZH0tJHt2ZXJzaW9ufSIvPgogCkBAIC01MiwxMiArNTMsMTMgQEAKICAgPHRhcmdldCBuYW1lPSJzZXR1cC5pbml0Ij4KICAgICA8dHN0YW1wLz4KICAgICA8bWtkaXIgZGlyPSIke2J1aWxkLmRpcn0iLz4KKyAgICA8bWtkaXIgZGlyPSIke2J1aWxkLnRvb2xzLmRpcn0iLz4KICAgPC90YXJnZXQ+CiAKICAgPHRhcmdldCBuYW1lPSJmbGV4LmNoZWNrIiB1bmxlc3M9IkZMRVhfSE9NRSI+CiAgICAgPGZhaWwgbWVzc2FnZT0nWW91IG11c3Qgc2V0IHRoZSBGTEVYX0hPTUUgcHJvcGVydHkgcG9pbnRpbmcgdG8geW91ciBmbGV4IFNESywgZWcuIGFudCAtREZMRVhfSE9NRT0iL0FwcGxpY2F0aW9ucy9BZG9iZSBGbGV4IEJ1aWxkZXIgMy9zZGtzLzMuMi4wIicvPgogICA8L3RhcmdldD4KLQkKKwogICA8dGFyZ2V0IG5hbWU9ImZsZXguaW5pdCIgZGVwZW5kcz0iZmxleC5jaGVjayIgdW5sZXNzPSJmbGV4LmZpbmlzaGVkIj4KICAgICA8dGFza2RlZiByZXNvdXJjZT0iZmxleFRhc2tzLnRhc2tzIiBjbGFzc3BhdGg9IiR7RkxFWF9IT01FfS9hbnQvbGliL2ZsZXhUYXNrcy5qYXIiIC8+CiAgICAgPHByb3BlcnR5IG5hbWU9ImZsZXguZmluaXNoZWQiIHZhbHVlPSJ0cnVlIi8+CkBAIC02OSwxMCArNzEsMTAgQEAKICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5hcyIvPgogICAgICAgPC9maWxlc2V0PgogICAgIDwvcGF0aD4KLSAgICA8cGF0aGNvbnZlcnQgCi0gICAgICBwcm9wZXJ0eT0iYXMuc3JjLmNsYXNzZXMiIAotICAgICAgcGF0aHNlcD0iICIgCi0gICAgICBkaXJzZXA9Ii4iIAorICAgIDxwYXRoY29udmVydAorICAgICAgcHJvcGVydHk9ImFzLnNyYy5jbGFzc2VzIgorICAgICAgcGF0aHNlcD0iICIKKyAgICAgIGRpcnNlcD0iLiIKICAgICAgIHJlZmlkPSJhcy5zcmMuZmlsZXMiCiAgICAgPgogICAgICAgPG1hcCBmcm9tPSIke3NyY30vIiB0bz0iIi8+CkBAIC0xMDgsMjEgKzExMCwyMSBAQAogICAgIDxhcnRpZmFjdDpyZW1vdGVSZXBvc2l0b3J5IGlkPSJhcGFjaGUiIHVybD0iJHthcGFjaGUucmVwb30iLz4KIAogICAgIDwhLS0gUG9tIGZpbGUgaW5mb3JtYXRpb24gLS0+Ci0gICAgPGFydGlmYWN0OnBvbSBpZD0icG9tIiAKLSAgICAgIGdyb3VwSWQ9IiR7dGhyaWZ0Lmdyb3VwaWR9IiAKKyAgICA8YXJ0aWZhY3Q6cG9tIGlkPSJwb20iCisgICAgICBncm91cElkPSIke3RocmlmdC5ncm91cGlkfSIKICAgICAgIGFydGlmYWN0SWQ9IiR7YXMzLmFydGlmYWN0aWR9IgotICAgICAgdmVyc2lvbj0iJHt2ZXJzaW9ufSIgCisgICAgICB2ZXJzaW9uPSIke3ZlcnNpb259IgogICAgICAgdXJsPSJodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmciCiAgICAgICBuYW1lPSJBcGFjaGUgVGhyaWZ0IgogICAgICAgZGVzY3JpcHRpb249IlRocmlmdCBpcyBhIHNvZnR3YXJlIGZyYW1ld29yayBmb3Igc2NhbGFibGUgY3Jvc3MtbGFuZ3VhZ2Ugc2VydmljZXMgZGV2ZWxvcG1lbnQuIgotICAgICAgcGFja2FnaW5nPSJwb20iCisgICAgICBwYWNrYWdpbmc9InN3YyIKICAgICA+CiAgICAgICA8cmVtb3RlUmVwb3NpdG9yeSByZWZpZD0iY2VudHJhbCIvPgogICAgICAgPHJlbW90ZVJlcG9zaXRvcnkgcmVmaWQ9ImFwYWNoZSIvPgogICAgICAgPGxpY2Vuc2UgbmFtZT0iVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCIgdXJsPSIke2xpY2Vuc2V9Ii8+Ci0gICAgICA8c2NtIGNvbm5lY3Rpb249InNjbTpnaXQ6aHR0cHM6Ly9naXQtd2lwLXVzLmFwYWNoZS5vcmcvcmVwb3MvYXNmL3RocmlmdC5naXQiIAotICAgICAgZGV2ZWxvcGVyQ29ubmVjdGlvbj0ic2NtOmdpdDpodHRwczovL2dpdC13aXAtdXMuYXBhY2hlLm9yZy9yZXBvcy9hc2YvdGhyaWZ0LmdpdCIKLSAgICAgIHVybD0iaHR0cHM6Ly9naXQtd2lwLXVzLmFwYWNoZS5vcmcvcmVwb3MvYXNmP3A9dGhyaWZ0LmdpdCIKKyAgICAgIDxzY20gY29ubmVjdGlvbj0ic2NtOmdpdDpodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC5naXQiCisgICAgICBkZXZlbG9wZXJDb25uZWN0aW9uPSJzY206Z2l0Omh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0LmdpdCIKKyAgICAgIHVybD0iaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQiCiAgICAgICAvPgogICAgICAgPCEtLSBUaHJpZnQgRGV2ZWxvcGVycyAtLT4KICAgICAgIDxkZXZlbG9wZXIgaWQ9Im1jc2xlZSIgbmFtZT0iTWFyayBTbGVlIi8+CkBAIC0xNzYsNSArMTc4LDUgQEAKICAgICA8IS0tIHJ1biB3aXRoOiBhbnQgLURyZWxlYXNlPXRydWUgcHVibGlzaCAtLT4KICAgICA8c2lnbkFuZERlcGxveSBmaWxlPSIke2FzMy5wb20ueG1sfSIgcGFja2FnaW5nPSJwb20iIGNsYXNzaWZpZXI9IiIgcG9tPSIke2FzMy5wb20ueG1sfSIvPgogICAgIDxzaWduQW5kRGVwbG95IGZpbGU9IiR7YXMzLnN3Yy5maWxlfSIgcGFja2FnaW5nPSJzd2MiIGNsYXNzaWZpZXI9IiIgcG9tPSIke2FzMy5wb20ueG1sfSIvPgotICA8L3RhcmdldD4JCisgIDwvdGFyZ2V0PgogPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbGliL2FzMy9jb2Rpbmdfc3RhbmRhcmRzLm1kIGIvbGliL2FzMy9jb2Rpbmdfc3RhbmRhcmRzLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMDM5MGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvYXMzL2NvZGluZ19zdGFuZGFyZHMubWQKQEAgLTAsMCArMSBAQAorUGxlYXNlIGZvbGxvdyBbR2VuZXJhbCBDb2RpbmcgU3RhbmRhcmRzXSgvZG9jL2NvZGluZ19zdGFuZGFyZHMubWQpCmRpZmYgLS1naXQgYS9saWIvYXMzL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEZ1bGxEdXBsZXhIdHRwQ2xpZW50LmFzIGIvbGliL2FzMy9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGdWxsRHVwbGV4SHR0cENsaWVudC5hcwppbmRleCAzMzc0OTg2Li44NjNjNTliIDEwMDY0NAotLS0gYS9saWIvYXMzL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEZ1bGxEdXBsZXhIdHRwQ2xpZW50LmFzCisrKyBiL2xpYi9hczMvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9URnVsbER1cGxleEh0dHBDbGllbnQuYXMKQEAgLTE5NSw3ICsxOTUsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICB0aGlzLm91dHB1dCA9IHRoaXMuc29ja2V0OwogICAgICAgICAgICAgdGhpcy5pbnB1dCA9IHRoaXMuc29ja2V0OwotICAgICAgICAgICAgdGhpcy5vdXRwdXQud3JpdGVVVEYoIkNPTk5FQ1QgIiArIHJlc291cmNlICsgIiBIVFRQLzEuMVxuIiArICJIb3N0OiAiICsgaG9zdCArICI6IiArIHBvcnQgKyAiXHJcbiIgKyAiVXNlci1BZ2VudDogQmF0dGxlTmV0XHJcbiIgKyAiVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWRcclxuIiArICJjb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL3gtdGhyaWZ0XHJcbiIgKyAiQWNjZXB0OiAqLypcclxuXHJcbiIpOworICAgICAgICAgICAgdGhpcy5vdXRwdXQud3JpdGVVVEYoIkNPTk5FQ1QgIiArIHJlc291cmNlICsgIiBIVFRQLzEuMVxuIiArICJIb3N0OiAiICsgaG9zdCArICI6IiArIHBvcnQgKyAiXHJcbiIgKyAiVXNlci1BZ2VudDogVGhyaWZ0L0FTM1xyXG4iICsgIlRyYW5zZmVyLUVuY29kaW5nOiBjaHVua2VkXHJcbiIgKyAiY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi94LXRocmlmdFxyXG4iICsgIkFjY2VwdDogKi8qXHJcblxyXG4iKTsKICAgICAgICAgICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyLmRpc3BhdGNoRXZlbnQoZXZlbnQpOwogICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL2xpYi9hczMvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0LmFzIGIvbGliL2FzMy9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuYXMKaW5kZXggNjg5MTM4OC4uYzYwZDcxMSAxMDA2NDQKLS0tIGEvbGliL2FzMy9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuYXMKKysrIGIvbGliL2FzMy9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuYXMKQEAgLTEyNyw2ICsxMjcsMTEgQEAKICAgICB7CiAgICAgICB0aGlzLmV2ZW50RGlzcGF0Y2hlci5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyLCB1c2VDYXB0dXJlLCBwcmlvcml0eSwgdXNlV2Vha1JlZmVyZW5jZSk7CiAgICAgfQorICAgIAorICAgIHB1YmxpYyBmdW5jdGlvbiByZW1vdmVFdmVudExpc3RlbmVyKHR5cGU6U3RyaW5nLCBsaXN0ZW5lcjpGdW5jdGlvbiwgdXNlQ2FwdHVyZTpCb29sZWFuID0gZmFsc2UpOnZvaWQKKyAgICB7CisgICAgICB0aGlzLmV2ZW50RGlzcGF0Y2hlci5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyLCB1c2VDYXB0dXJlKTsKKyAgICB9CiAKICAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gb3BlbigpOnZvaWQKICAgICB7CmRpZmYgLS1naXQgYS9saWIvY19nbGliL0NNYWtlTGlzdHMudHh0IGIvbGliL2NfZ2xpYi9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzQzYTY4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDg2IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIyBGaW5kIHJlcXVpcmVkIHBhY2thZ2VzCitmaW5kX3BhY2thZ2UoR0xJQiBSRVFVSVJFRCBDT01QT05FTlRTIGdvYmplY3QpCitpbmNsdWRlX2RpcmVjdG9yaWVzKCR7R0xJQl9JTkNMVURFX0RJUlN9KQorCitpbmNsdWRlX2RpcmVjdG9yaWVzKHNyYykKKworIyBTWVNMSUJTIGNvbnRhaW5zIGxpYnJhcmllcyB0aGF0IG5lZWQgdG8gYmUgbGlua2VkIHRvIGFsbCBsaWIgdGFyZ2V0cworc2V0KFNZU0xJQlMgJHtHTElCX0xJQlJBUklFU30gJHtHTElCX0dPQkpFQ1RfTElCUkFSSUVTfSkKKworIyBDcmVhdGUgdGhlIHRocmlmdCBDIGdsaWIgbGlicmFyeQorc2V0KHRocmlmdF9jX2dsaWJfU09VUkNFUworICAgIHNyYy90aHJpZnQvY19nbGliL3RocmlmdC5jCisgICAgc3JjL3RocmlmdC9jX2dsaWIvdGhyaWZ0X3N0cnVjdC5jCisgICAgc3JjL3RocmlmdC9jX2dsaWIvdGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbi5jCisgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9wcm9jZXNzb3IuYworICAgIHNyYy90aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfZGlzcGF0Y2hfcHJvY2Vzc29yLmMKKyAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvci5jCisgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmMKKyAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2xfZmFjdG9yeS5jCisgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvci5jCisgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbC5jCisgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sLmMKKyAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sX2ZhY3RvcnkuYworICAgIHNyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9jb21wYWN0X3Byb3RvY29sLmMKKyAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfY29tcGFjdF9wcm90b2NvbF9mYWN0b3J5LmMKKyAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5jCisgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnRfZmFjdG9yeS5jCisgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfZmFjdG9yeS5jCisgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2ZhY3RvcnkuYworICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc29ja2V0LmMKKyAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQuYworICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3NvY2tldC5jCisgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnQuYworICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZmRfdHJhbnNwb3J0LmMKKyAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQuYworICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfbWVtb3J5X2J1ZmZlci5jCisgICAgc3JjL3RocmlmdC9jX2dsaWIvc2VydmVyL3RocmlmdF9zZXJ2ZXIuYworICAgIHNyYy90aHJpZnQvY19nbGliL3NlcnZlci90aHJpZnRfc2ltcGxlX3NlcnZlci5jCispCisKKyMgSWYgT3BlblNTTCBpcyBub3QgZm91bmQganVzdCBpZ25vcmUgdGhlIE9wZW5TU0wgc3R1ZmYKK2ZpbmRfcGFja2FnZShPcGVuU1NMKQoraWYoT1BFTlNTTF9GT1VORCBBTkQgV0lUSF9PUEVOU1NMKQorICAgIGxpc3QoIEFQUEVORCB0aHJpZnRjcHBfU09VUkNFUworCSAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NzbF9zb2NrZXQuYworICAgICkKKyAgICBpbmNsdWRlX2RpcmVjdG9yaWVzKFNZU1RFTSAiJHtPUEVOU1NMX0lOQ0xVREVfRElSfSIpCisgICAgbGlzdChBUFBFTkQgU1lTTElCUyAiJHtPUEVOU1NMX0xJQlJBUklFU30iKQorZW5kaWYoKQorCisKKyMgQ29udGFpbnMgdGhlIHRocmlmdCBzcGVjaWZpYyBBRERfTElCUkFSWV9USFJJRlQgYW5kIFRBUkdFVF9MSU5LX0xJQlJBUklFU19USFJJRlQKK2luY2x1ZGUoVGhyaWZ0TWFjcm9zKQorCitBRERfTElCUkFSWV9USFJJRlQodGhyaWZ0X2NfZ2xpYiAke3RocmlmdF9jX2dsaWJfU09VUkNFU30pCitUQVJHRVRfTElOS19MSUJSQVJJRVNfVEhSSUZUKHRocmlmdF9jX2dsaWIgJHtTWVNMSUJTfSkKKworIyBJbnN0YWxsIHRoZSBoZWFkZXJzCitpbnN0YWxsKERJUkVDVE9SWSAic3JjL3RocmlmdCIgREVTVElOQVRJT04gIiR7SU5DTFVERV9JTlNUQUxMX0RJUn0iCisgICAgRklMRVNfTUFUQ0hJTkcgUEFUVEVSTiAiKi5oIikKKyMgQ29weSBjb25maWcuaCBmaWxlCitpbnN0YWxsKERJUkVDVE9SWSAiJHtDTUFLRV9CSU5BUllfRElSfS90aHJpZnQiIERFU1RJTkFUSU9OICIke0lOQ0xVREVfSU5TVEFMTF9ESVJ9IgorICAgIEZJTEVTX01BVENISU5HIFBBVFRFUk4gIiouaCIpCisKK2lmKEJVSUxEX1RFU1RJTkcpCisgICAgYWRkX3N1YmRpcmVjdG9yeSh0ZXN0KQorZW5kaWYoKQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9NYWtlZmlsZS5hbSBiL2xpYi9jX2dsaWIvTWFrZWZpbGUuYW0KaW5kZXggODhlMmQ3My4uNDliNWIyMyAxMDA3NTUKLS0tIGEvbGliL2NfZ2xpYi9NYWtlZmlsZS5hbQorKysgYi9saWIvY19nbGliL01ha2VmaWxlLmFtCkBAIC0yNCwxMSArMjQsOCBAQAogbGliX0xUTElCUkFSSUVTID0gbGlidGhyaWZ0X2NfZ2xpYi5sYQogcGtnY29uZmlnX0RBVEEgPSB0aHJpZnRfY19nbGliLnBjCiAKLWNvbW1vbl9jZmxhZ3MgPSAtZyAtV2FsbCAtVyAtSXNyYyAtSSBzcmMvdGhyaWZ0L2NfZ2xpYiAkKEdMSUJfQ0ZMQUdTKQotY29tbW9uX2xkZmxhZ3MgPSAtZyAtV2FsbCAtVyAkKEdMSUJfTERGTEFHUykgQEdDT1ZfTERGTEFHU0AKLQotIyB0aGlzIHJlbW92ZXMgb3B0aW1pemF0aW9ucyBhbmQgYWRkcyBjb3ZlcmFnZSBmbGFncwotQ0ZMQUdTID0gQEdDT1ZfQ0ZMQUdTQAorQU1fQ1BQRkxBR1MgPSAtSXNyYyAtSSBzcmMvdGhyaWZ0L2NfZ2xpYgorQU1fQ0ZMQUdTID0gLVdhbGwgLVdleHRyYSAtcGVkYW50aWMKIAogIyBEZWZpbmUgdGhlIHNvdXJjZSBmaWxlcyBmb3IgdGhlIG1vZHVsZQogCkBAIC0zNywyNCArMzQsMzMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3RocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb24uYyBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X3Byb2Nlc3Nvci5jIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfZGlzcGF0Y2hfcHJvY2Vzc29yLmMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3IuYyBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuYyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yLmMgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2ZhY3RvcnkuYyBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sLmMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sLmMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sLmMgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9mYWN0b3J5LmMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2wuYyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfY29tcGFjdF9wcm90b2NvbF9mYWN0b3J5LmMgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuYyBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydF9mYWN0b3J5LmMgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfZmFjdG9yeS5jIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9mYWN0b3J5LmMgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zb2NrZXQuYyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NzbF9zb2NrZXQuYyBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQuYyBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl9zb2NrZXQuYyBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydC5jIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZmRfdHJhbnNwb3J0LmMgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0LmMgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9tZW1vcnlfYnVmZmVyLmMgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvc2VydmVyL3RocmlmdF9zZXJ2ZXIuYyBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9zZXJ2ZXIvdGhyaWZ0X3NpbXBsZV9zZXJ2ZXIuYwogCi1saWJ0aHJpZnRfY19nbGliX2xhX0NGTEFHUyA9ICQoY29tbW9uX2NmbGFncykKK2xpYnRocmlmdF9jX2dsaWJfbGFfQ0ZMQUdTID0gJChBTV9DRkxBR1MpICQoR0xJQl9DRkxBR1MpICQoR09CSkVDVF9DRkxBR1MpICQoT1BFTlNTTF9JTkNMVURFUykKK2xpYnRocmlmdF9jX2dsaWJfbGFfTERGTEFHUyA9ICQoQU1fTERGTEFHUykgJChHTElCX0xJQlMpICQoR09CSkVDVF9MSUJTKSAgJChPUEVOU1NMX0xERkxBR1MpICQoT1BFTlNTTF9MSUJTKSAKIAogaW5jbHVkZV90aHJpZnRkaXIgPSAkKGluY2x1ZGVkaXIpL3RocmlmdC9jX2dsaWIKIGluY2x1ZGVfdGhyaWZ0X0hFQURFUlMgPSBcCkBAIC02NSwxNyArNzEsMjYgQEAKIAogaW5jbHVkZV9wcm90b2NvbGRpciA9ICQoaW5jbHVkZV90aHJpZnRkaXIpL3Byb3RvY29sCiBpbmNsdWRlX3Byb3RvY29sX0hFQURFUlMgPSBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yLmggXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2ZhY3RvcnkuaCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sLmggXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9mYWN0b3J5LmgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfZmFjdG9yeS5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9jb21wYWN0X3Byb3RvY29sLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZmFjdG9yeS5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbC5oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAKIAogaW5jbHVkZV90cmFuc3BvcnRkaXIgPSAkKGluY2x1ZGVfdGhyaWZ0ZGlyKS90cmFuc3BvcnQKIGluY2x1ZGVfdHJhbnNwb3J0X0hFQURFUlMgPSBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZkX3RyYW5zcG9ydC5oIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQuaCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9tZW1vcnlfYnVmZmVyLmggXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3NvY2tldC5oIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQuaCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zb2NrZXQuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9wbGF0Zm9ybV9zb2NrZXQuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zc2xfc29ja2V0LmggXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0LmggXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0X2ZhY3RvcnkuaCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfZmFjdG9yeS5oIFwKQEAgLTg3LDEwICsxMDIsMTMgQEAKIAogaW5jbHVkZV9wcm9jZXNzb3JkaXIgPSAkKGluY2x1ZGVfdGhyaWZ0ZGlyKS9wcm9jZXNzb3IKIGluY2x1ZGVfcHJvY2Vzc29yX0hFQURFUlMgPSBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X3Byb2Nlc3Nvci5oIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X2Rpc3BhdGNoX3Byb2Nlc3Nvci5oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9kaXNwYXRjaF9wcm9jZXNzb3IuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3IuaAogCiAKIEVYVFJBX0RJU1QgPSBcCisgICAgICAgICAgICAgQ01ha2VMaXN0cy50eHQgXAorICAgICAgICAgICAgIGNvZGluZ19zdGFuZGFyZHMubWQgXAogICAgICAgICAgICAgIFJFQURNRS5tZCBcCiAgICAgICAgICAgICAgdGVzdC9nbGliLnN1cHByZXNzIFwKICAgICAgICAgICAgICB0aHJpZnRfY19nbGliLnBjLmluCmRpZmYgLS1naXQgYS9saWIvY19nbGliL1JFQURNRS5tZCBiL2xpYi9jX2dsaWIvUkVBRE1FLm1kCmluZGV4IGZkNzBkMDguLmRkODRmM2QgMTAwNjQ0Ci0tLSBhL2xpYi9jX2dsaWIvUkVBRE1FLm1kCisrKyBiL2xpYi9jX2dsaWIvUkVBRE1FLm1kCkBAIC0zMiwzICszMiwxOCBAQAogR0xpYgogaHR0cDovL3d3dy5ndGsub3JnLwogCitCcmVha2luZyBDaGFuZ2VzCis9PT09PT09PT09PT09PT09CisKKzAuMTIuMAorLS0tLS0tCisKK1RoZSBjb21waWxlcidzIGhhbmRsaW5nIG9mIG5hbWVzcGFjZXMgd2hlbiBnZW5lcmF0aW5nIHRoZSBuYW1lIG9mIHR5cGVzLAorZnVuY3Rpb25zIGFuZCBoZWFkZXIgZmlsZXMgaGFzIGJlZW4gaW1wcm92ZWQuIFRoaXMgbWVhbnMgY29kZSB3cml0dGVuIHRvIHVzZQorY2xhc3NlcyBnZW5lcmF0ZWQgYnkgcHJldmlvdXMgdmVyc2lvbnMgb2YgdGhlIGNvbXBpbGVyIG1heSBuZWVkIHRvIGJlIHVwZGF0ZWQgdG8KK3JlZmxlY3QgdGhlIHByb3BlciBjb252ZW50aW9uIGZvciBjbGFzcyBuYW1lcywgd2hpY2ggaXMKKworLSBBIGxvd2VyY2FzZSwgW3NuYWtlLWNhc2VdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1NuYWtlX2Nhc2UpCisgIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjbGFzcycgbmFtZXNwYWNlLCBmb2xsb3dlZCBieQorLSBBbiB1bmRlcnNjb3JlIGFuZAorLSBBIGxvd2VyY2FzZSwgc25ha2UtY2FzZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgY2xhc3MnIG5hbWUuCmRpZmYgLS1naXQgYS9saWIvY19nbGliL2NvZGluZ19zdGFuZGFyZHMubWQgYi9saWIvY19nbGliL2NvZGluZ19zdGFuZGFyZHMubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRiM2EwMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvY29kaW5nX3N0YW5kYXJkcy5tZApAQCAtMCwwICsxLDUgQEAKKyMjIEMgR2xpYiBDb2RpbmcgU3RhbmRhcmRzCisKK1BsZWFzZSBmb2xsb3c6CisgKiBbVGhyaWZ0IEdlbmVyYWwgQ29kaW5nIFN0YW5kYXJkc10oL2RvYy9jb2Rpbmdfc3RhbmRhcmRzLm1kKQorICogW0dOT01FIEMgQ29kaW5nIFN0eWxlXShodHRwczovL2hlbHAuZ25vbWUub3JnL3VzZXJzL3Byb2dyYW1taW5nLWd1aWRlbGluZXMvc3RhYmxlL2MtY29kaW5nLXN0eWxlLmh0bWwuZW4pCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfZGlzcGF0Y2hfcHJvY2Vzc29yLmMgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfZGlzcGF0Y2hfcHJvY2Vzc29yLmMKaW5kZXggN2QyMjNiZi4uNTdkNjIxNyAxMDA2NDQKLS0tIGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X2Rpc3BhdGNoX3Byb2Nlc3Nvci5jCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9kaXNwYXRjaF9wcm9jZXNzb3IuYwpAQCAtMjMsNyArMjMsNyBAQAogCiBHX0RFRklORV9BQlNUUkFDVF9UWVBFIChUaHJpZnREaXNwYXRjaFByb2Nlc3NvciwKICAgICAgICAgICAgICAgICAgICAgICAgIHRocmlmdF9kaXNwYXRjaF9wcm9jZXNzb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICBUSFJJRlRfVFlQRV9QUk9DRVNTT1IpOworICAgICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX1RZUEVfUFJPQ0VTU09SKQogCiBnYm9vbGVhbgogdGhyaWZ0X2Rpc3BhdGNoX3Byb2Nlc3Nvcl9wcm9jZXNzIChUaHJpZnRQcm9jZXNzb3IgKnByb2Nlc3NvciwKQEAgLTk4LDYgKzk4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikgPCAwKQogICAgIHJldHVybiBGQUxTRTsKICAgbWVzc2FnZSA9IGdfc3RyY29uY2F0ICgiSW52YWxpZCBtZXRob2QgbmFtZTogJyIsIGZuYW1lLCAiJyIsIE5VTEwpOworICBnX2ZyZWUgKGZuYW1lKTsKICAgeGNlcHRpb24gPQogICAgIGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQVBQTElDQVRJT05fRVhDRVBUSU9OLAogICAgICAgICAgICAgICAgICAgInR5cGUiLCAgICBUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SX1VOS05PV05fTUVUSE9ELApkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvci5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4YTBmNGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yLmMKQEAgLTAsMCArMSwzNDYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb24uaD4KKworR19ERUZJTkVfVFlQRShUaHJpZnRNdWx0aXBsZXhlZFByb2Nlc3NvciwgdGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3NvciwgVEhSSUZUX1RZUEVfUFJPQ0VTU09SKQorCisKK2VudW0KK3sKKyAgUFJPUF9USFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SX0RFRkFVTFRfU0VSVklDRV9OQU1FID0gMSwKKyAgUFJPUF9USFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SX0VORAorfTsKKworc3RhdGljIEdQYXJhbVNwZWMgKnRocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3Jfb2JqX3Byb3BlcnRpZXNbUFJPUF9USFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SX0VORF0gPSB7IE5VTEwsIH07CisKKworc3RhdGljIGdib29sZWFuCit0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX3JlZ2lzdGVyX3Byb2Nlc3Nvcl9pbXBsKFRocmlmdFByb2Nlc3NvciAqcHJvY2Vzc29yLCBjb25zdCBnY2hhciAqIG11bHRpcGxleGVkX3Byb2Nlc3Nvcl9uYW1lLCBUaHJpZnRQcm9jZXNzb3IgKiBtdWx0aXBsZXhlZF9wcm9jZXNzb3IgLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0TXVsdGlwbGV4ZWRQcm9jZXNzb3IgKnNlbGYgPSBUSFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SKHByb2Nlc3Nvcik7CisgIGdfaGFzaF90YWJsZV9yZXBsYWNlKHNlbGYtPm11bHRpcGxleGVkX3NlcnZpY2VzLAorCQkgICAgICAgZ19zdHJkdXAobXVsdGlwbGV4ZWRfcHJvY2Vzc29yX25hbWUpLAorCQkgICAgICAgZ19vYmplY3RfcmVmIChtdWx0aXBsZXhlZF9wcm9jZXNzb3IpKTsKKworICAvKiBNYWtlIGZpcnN0IHJlZ2lzdGVyZWQgYmVjb21lIGRlZmF1bHQgKi8KKyAgaWYoIXNlbGYtPmRlZmF1bHRfcHJvY2Vzc29yX25hbWUpeworICAgICAgc2VsZi0+ZGVmYXVsdF9wcm9jZXNzb3JfbmFtZSA9IGdfc3RyZHVwKG11bHRpcGxleGVkX3Byb2Nlc3Nvcl9uYW1lKTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KKworCitzdGF0aWMgZ2Jvb2xlYW4KK3RocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3JfcHJvY2Vzc19pbXBsIChUaHJpZnRQcm9jZXNzb3IgKnByb2Nlc3NvciwgVGhyaWZ0UHJvdG9jb2wgKmluLAorCQkJCQkgICBUaHJpZnRQcm90b2NvbCAqb3V0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2Jvb2xlYW4gcmV0dmFsID0gRkFMU0U7CisgIGdib29sZWFuIHRva2VuX2Vycm9yID0gRkFMU0U7CisgIFRocmlmdEFwcGxpY2F0aW9uRXhjZXB0aW9uICp4Y2VwdGlvbjsKKyAgVGhyaWZ0U3RvcmVkTWVzc2FnZVByb3RvY29sICpzdG9yZWRfbWVzc2FnZV9wcm90b2NvbCA9IE5VTEw7CisgIFRocmlmdE1lc3NhZ2VUeXBlIG1lc3NhZ2VfdHlwZTsKKyAgVGhyaWZ0TXVsdGlwbGV4ZWRQcm9jZXNzb3IgKnNlbGYgPSBUSFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SKHByb2Nlc3Nvcik7CisgIFRocmlmdFByb2Nlc3NvciAqbXVsdGlwbGV4ZWRfcHJvY2Vzc29yID0gTlVMTDsKKyAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQ7CisgIGNoYXIgKnRva2VuPU5VTEw7CisgIGludCB0b2tlbl9pbmRleD0wOworICBjaGFyICpzdGF0ZT1OVUxMOworICBnY2hhciAqZm5hbWU9TlVMTDsKKyAgZ2ludDMyIHNlcWlkLCByZXN1bHQ7CisKKyAgLyogRklYTUUgSXQgc2VlbXMgdGhhdCBwcmV2aW91cyBwcm9jZXNzb3IgaXMgbm90IG1hbmFnaW5nIGVycm9yIGNvcnJlY3RseSAqLworICBpZigqZXJyb3IhPU5VTEwpIHsKKyAgICAgIGdfZGVidWcgKCJ0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yOiBsYXN0IGVycm9yIG5vdCByZW1vdmVkOiAlcyIsCisgICAgICAJCSAgICplcnJvciAhPSBOVUxMID8gKCplcnJvciktPm1lc3NhZ2UgOiAiKG51bGwpIik7CisgICAgICBnX2NsZWFyX2Vycm9yIChlcnJvcik7CisgIH0KKworCisgIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MoaW4pLT5yZWFkX21lc3NhZ2VfYmVnaW4oaW4sICZmbmFtZSwgJm1lc3NhZ2VfdHlwZSwgJnNlcWlkLCBlcnJvcik7CisKKyAgaWYoIShtZXNzYWdlX3R5cGUgPT0gVF9DQUxMIHx8IG1lc3NhZ2VfdHlwZSA9PSBUX09ORVdBWSkpIHsKKyAgICAgIGdfc2V0X2Vycm9yIChlcnJvciwKKwkJICAgVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUl9FUlJPUiwKKwkJICAgVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUl9FUlJPUl9NRVNTQUdFX1RZUEUsCisJCSAgICJtZXNzYWdlIHR5cGUgaW52YWxpZCBmb3IgdGhpcyBwcm9jZXNzb3IiKTsKKyAgfWVsc2V7CisgICAgICAvKiBTcGxpdCBieSB0aGUgdG9rZW4gKi8KKyAgICAgIGZvciAodG9rZW4gPSBzdHJ0b2tfcihmbmFtZSwgVEhSSUZUX01VTFRJUExFWEVEX1BST1RPQ09MX0RFRkFVTFRfU0VQQVJBVE9SLCAmc3RhdGUpLAorCSAgdG9rZW5faW5kZXg9MDsKKwkgIHRva2VuICE9IE5VTEwgJiYgIXRva2VuX2Vycm9yOworCSAgdG9rZW4gPSBzdHJ0b2tfcihOVUxMLCBUSFJJRlRfTVVMVElQTEVYRURfUFJPVE9DT0xfREVGQVVMVF9TRVBBUkFUT1IsICZzdGF0ZSksCisJICAgICAgdG9rZW5faW5kZXgrKykKKwl7CisJICBzd2l0Y2godG9rZW5faW5kZXgpeworCSAgICBjYXNlIDA6CisJICAgICAgLyogSXQgc2hvdWxkIGJlIHRoZSBzZXJ2aWNlIG5hbWUgKi8KKwkgICAgICBtdWx0aXBsZXhlZF9wcm9jZXNzb3IgPSBnX2hhc2hfdGFibGVfbG9va3VwKHNlbGYtPm11bHRpcGxleGVkX3NlcnZpY2VzLCB0b2tlbik7CisJICAgICAgaWYobXVsdGlwbGV4ZWRfcHJvY2Vzc29yPT1OVUxMKXsKKwkJICB0b2tlbl9lcnJvcj1UUlVFOworCSAgICAgIH0KKwkgICAgICBicmVhazsKKwkgICAgY2FzZSAxOgorCSAgICAgIC8qIEl0IHNob3VsZCBiZSB0aGUgZnVuY3Rpb24gbmFtZSAqLworCSAgICAgIHN0b3JlZF9tZXNzYWdlX3Byb3RvY29sID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTCwKKwkJCQkJCSAgICAgICJwcm90b2NvbCIsIGluLAorCQkJCQkJICAgICAgIm5hbWUiLCB0b2tlbiwKKwkJCQkJCSAgICAgICJ0eXBlIiwgbWVzc2FnZV90eXBlLAorCQkJCQkJICAgICAgInNlcWlkIiwgc2VxaWQsCisJCQkJCQkgICAgICBOVUxMKTsKKwkgICAgICBicmVhazsKKwkgICAgZGVmYXVsdDoKKwkgICAgICBnX3NldF9lcnJvciAoZXJyb3IsCisJCQkgICBUSFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SX0VSUk9SLAorCQkJICAgVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUl9FUlJPUl9NRVNTQUdFX1dST05HTFlfTVVMVElQTEVYRUQsCisJCQkgICAidGhlIG1lc3NhZ2UgaGFzIG1vcmUgdG9rZW5zIHRoYW4gZXhwZWN0ZWQhIik7CisJICAgICAgdG9rZW5fZXJyb3I9VFJVRTsKKwkgICAgICBicmVhazsKKwkgIH0KKwl9CisgICAgICAvKiBTZXQgZGVmYXVsdCAqLworICAgICAgaWYoIXN0b3JlZF9tZXNzYWdlX3Byb3RvY29sICYmCisJICAhbXVsdGlwbGV4ZWRfcHJvY2Vzc29yICYmCisJICB0b2tlbl9pbmRleD09MSAmJiBzZWxmLT5kZWZhdWx0X3Byb2Nlc3Nvcl9uYW1lKXsKKwkgIC8qIEl0IHNob3VsZCBiZSB0aGUgc2VydmljZSBuYW1lICovCisJICBtdWx0aXBsZXhlZF9wcm9jZXNzb3IgPSBnX2hhc2hfdGFibGVfbG9va3VwKHNlbGYtPm11bHRpcGxleGVkX3NlcnZpY2VzLCBzZWxmLT5kZWZhdWx0X3Byb2Nlc3Nvcl9uYW1lKTsKKwkgIGlmKG11bHRpcGxleGVkX3Byb2Nlc3Nvcj09TlVMTCl7CisJICAgICAgZ19zZXRfZXJyb3IgKGVycm9yLAorCQkJICAgVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUl9FUlJPUiwKKwkJCSAgIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfRVJST1JfU0VSVklDRV9VTkFWQUlMQUJMRSwKKwkJCSAgICJzZXJ2aWNlICVzIG5vdCBhdmFpbGFibGUgb24gdGhpcyBwcm9jZXNzb3IiLAorCQkJICAgc2VsZi0+ZGVmYXVsdF9wcm9jZXNzb3JfbmFtZSk7CisJICB9ZWxzZXsKKwkgICAgICAvKiBTZXQgdGhlIG1lc3NhZ2UgbmFtZSB0byB0aGUgb3JpZ2luYWwgbmFtZSAqLworCSAgICAgIHN0b3JlZF9tZXNzYWdlX3Byb3RvY29sID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTCwKKwkJCQkJCSAgICAgICJwcm90b2NvbCIsIGluLAorCQkJCQkJICAgICAgIm5hbWUiLCBmbmFtZSwKKwkJCQkJCSAgICAgICJ0eXBlIiwgbWVzc2FnZV90eXBlLAorCQkJCQkJICAgICAgInNlcWlkIiwgc2VxaWQsCisJCQkJCQkgICAgICBOVUxMKTsKKwkgIH0KKworICAgICAgfQorCisgICAgICBpZihzdG9yZWRfbWVzc2FnZV9wcm90b2NvbCE9TlVMTCAmJiBtdWx0aXBsZXhlZF9wcm9jZXNzb3IhPU5VTEwpeworCSAgcmV0dmFsID0gVEhSSUZUX1BST0NFU1NPUl9HRVRfQ0xBU1MgKG11bHRpcGxleGVkX3Byb2Nlc3NvciktPnByb2Nlc3MgKG11bHRpcGxleGVkX3Byb2Nlc3NvciwgKFRocmlmdFByb3RvY29sICopIHN0b3JlZF9tZXNzYWdlX3Byb3RvY29sLCBvdXQsIGVycm9yKSA7CisgICAgICB9ZWxzZXsKKwkgIGlmKCFlcnJvcikKKwkgIGdfc2V0X2Vycm9yIChlcnJvciwKKwkJICAgICAgIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfRVJST1IsCisJCSAgICAgICBUSFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SX0VSUk9SX1NFUlZJQ0VfVU5BVkFJTEFCTEUsCisJCSAgICAgICAic2VydmljZSAlcyBpcyBub3QgbXVsdGlwbGV4ZWQgaW4gdGhpcyBwcm9jZXNzb3IiLAorCQkgICAgICAgZm5hbWUpOworICAgICAgfQorCisKKyAgfQorCisgIGlmKCFyZXR2YWwpeworICAgICAgLyogQnkgZGVmYXVsdCwgcmV0dXJuIGFuIGFwcGxpY2F0aW9uIGV4Y2VwdGlvbiB0byB0aGUgY2xpZW50IGluZGljYXRpbmcgdGhlCisgICAgICAgICAgbWV0aG9kIG5hbWUgaXMgbm90IHJlY29nbml6ZWQuICovCisgICAgICAvKiBDb3BpZWQgZnJvbSBkaXNwYWNoIHByb2Nlc3NvciAqLworCisgICAgICBpZiAoKHRocmlmdF9wcm90b2NvbF9za2lwIChpbiwgVF9TVFJVQ1QsIGVycm9yKSA8IDApIHx8CisJICAodGhyaWZ0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9lbmQgKGluLCBlcnJvcikgPCAwKSkKKwlyZXR1cm4gcmV0dmFsOworCisgICAgICBnX29iamVjdF9nZXQgKGluLCAidHJhbnNwb3J0IiwgJnRyYW5zcG9ydCwgTlVMTCk7CisgICAgICByZXN1bHQgPSB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfZW5kICh0cmFuc3BvcnQsIGVycm9yKTsKKyAgICAgIGdfb2JqZWN0X3VucmVmICh0cmFuc3BvcnQpOworICAgICAgaWYgKHJlc3VsdCA8IDApIHsKKwkgIC8qIFdlIG11c3QgZnJlZSBmbmFtZSAqLworCSAgZ19mcmVlKGZuYW1lKTsKKwkgIHJldHVybiByZXR2YWw7CisgICAgICB9CisKKyAgICAgIGlmICh0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbiAob3V0LAorCQkJCQkgICAgICAgZm5hbWUsCisJCQkJCSAgICAgICBUX0VYQ0VQVElPTiwKKwkJCQkJICAgICAgIHNlcWlkLAorCQkJCQkgICAgICAgZXJyb3IpIDwgMCl7CisJICAvKiBXZSBtdXN0IGZyZWUgZm5hbWUgKi8KKwkgIGdfZnJlZShmbmFtZSk7CisKKwkgIHJldHVybiByZXR2YWw7CisgICAgICB9CisKKworICAgICAgeGNlcHRpb24gPQorCSAgZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9BUFBMSUNBVElPTl9FWENFUFRJT04sCisJCQkidHlwZSIsICAgIFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1JfVU5LTk9XTl9NRVRIT0QsCisJCQkibWVzc2FnZSIsICgqZXJyb3IpLT5tZXNzYWdlLAorCQkJTlVMTCk7CisgICAgICByZXN1bHQgPSB0aHJpZnRfc3RydWN0X3dyaXRlIChUSFJJRlRfU1RSVUNUICh4Y2VwdGlvbiksCisJCQkJICAgIG91dCwKKwkJCQkgICAgZXJyb3IpOworICAgICAgZ19vYmplY3RfdW5yZWYgKHhjZXB0aW9uKTsKKyAgICAgIGlmICgocmVzdWx0IDwgMCkgfHwKKwkgICh0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9lbmQgKG91dCwgZXJyb3IpIDwgMCkpCisJcmV0dXJuIHJldHZhbDsKKworICAgICAgZ19vYmplY3RfZ2V0IChvdXQsICJ0cmFuc3BvcnQiLCAmdHJhbnNwb3J0LCBOVUxMKTsKKyAgICAgIHJldHZhbCA9CisJICAoKHRocmlmdF90cmFuc3BvcnRfd3JpdGVfZW5kICh0cmFuc3BvcnQsIGVycm9yKSA+PSAwKSAmJgorCSAgICAgICh0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIGVycm9yKSA+PSAwKSk7CisgICAgICBnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsKKyAgfWVsc2V7CisgICAgICAvKiBUaGUgcHJvdG9jb2wgbm93IGhhcyBhIGNvcHkgd2UgY2FuIGZyZWUgaXQgKi8KKyAgICAgIGdfZnJlZShmbmFtZSk7CisKKyAgfQorCisgIC8qCisgIEZJWE1FIFRoaXMgbWFrZXMgZXZlcnl0aGluZyBmYWlsLCBJIGRvbid0IGtub3cgd2h5LgorICBpZihzdG9yZWRfbWVzc2FnZV9wcm90b2NvbCE9TlVMTCl7CisJICAvLyBBZnRlciBpdHMgdXNlIHdlIG11c3QgZnJlZSBpdAorCSAgZ19vYmplY3RfdW5yZWYoc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2wpOworICB9CisgICovCisgIHJldHVybiByZXR2YWw7Cit9CisKKy8qIGRlZmluZSB0aGUgR0Vycm9yIGRvbWFpbiBmb3IgVGhyaWZ0IHRyYW5zcG9ydHMgKi8KK0dRdWFyawordGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvcl9lcnJvcl9xdWFyayAodm9pZCkKK3sKKyAgcmV0dXJuIGdfcXVhcmtfZnJvbV9zdGF0aWNfc3RyaW5nIChUSFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SX0VSUk9SX0RPTUFJTik7Cit9CisKKworc3RhdGljIHZvaWQKK3RocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3Jfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICAgICAgKm9iamVjdCwKKyAgICBndWludCAgICAgICAgIHByb3BlcnR5X2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqdmFsdWUsCisgICAgR1BhcmFtU3BlYyAgICpwc3BlYykKK3sKKyAgVGhyaWZ0TXVsdGlwbGV4ZWRQcm9jZXNzb3IgKnNlbGYgPSBUSFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcGVydHlfaWQpCisgIHsKKyAgY2FzZSBQUk9QX1RIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfREVGQVVMVF9TRVJWSUNFX05BTUU6CisgICAgc2VsZi0+ZGVmYXVsdF9wcm9jZXNzb3JfbmFtZSA9IGdfdmFsdWVfZHVwX3N0cmluZyAodmFsdWUpOworICAgIGJyZWFrOworCisgIGRlZmF1bHQ6CisgICAgLyogV2UgZG9uJ3QgaGF2ZSBhbnkgb3RoZXIgcHJvcGVydHkuLi4gKi8KKyAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcGVydHlfaWQsIHBzcGVjKTsKKyAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvcl9nZXRfcHJvcGVydHkgKEdPYmplY3QgICAgKm9iamVjdCwKKyAgICBndWludCAgICAgICBwcm9wZXJ0eV9pZCwKKyAgICBHVmFsdWUgICAgICp2YWx1ZSwKKyAgICBHUGFyYW1TcGVjICpwc3BlYykKK3sKKyAgVGhyaWZ0TXVsdGlwbGV4ZWRQcm9jZXNzb3IgKnNlbGYgPSBUSFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcGVydHlfaWQpCisgIHsKKyAgY2FzZSBQUk9QX1RIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfREVGQVVMVF9TRVJWSUNFX05BTUU6CisgICAgZ192YWx1ZV9zZXRfc3RyaW5nICh2YWx1ZSwgc2VsZi0+ZGVmYXVsdF9wcm9jZXNzb3JfbmFtZSk7CisgICAgYnJlYWs7CisKKyAgZGVmYXVsdDoKKyAgICAvKiBXZSBkb24ndCBoYXZlIGFueSBvdGhlciBwcm9wZXJ0eS4uLiAqLworICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wZXJ0eV9pZCwgcHNwZWMpOworICAgIGJyZWFrOworICB9Cit9CisKKy8qIGRlc3RydWN0b3IgKi8KK3N0YXRpYyB2b2lkCit0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX2ZpbmFsaXplIChHT2JqZWN0ICpvYmplY3QpCit7CisgIFRocmlmdE11bHRpcGxleGVkUHJvY2Vzc29yICpzZWxmID0gVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUihvYmplY3QpOworCisgIC8qIEZyZWUgb3VyIG11bHRpcGxleGVkIGhhc2ggdGFibGUgKi8KKyAgZ19oYXNoX3RhYmxlX3VucmVmIChzZWxmLT5tdWx0aXBsZXhlZF9zZXJ2aWNlcyk7CisgIHNlbGYtPm11bHRpcGxleGVkX3NlcnZpY2VzID0gTlVMTDsKKworICBpZihzZWxmLT5kZWZhdWx0X3Byb2Nlc3Nvcl9uYW1lKXsKKyAgICAgIGdfZnJlZShzZWxmLT5kZWZhdWx0X3Byb2Nlc3Nvcl9uYW1lKTsKKyAgICAgIHNlbGYtPmRlZmF1bHRfcHJvY2Vzc29yX25hbWU9TlVMTDsKKyAgfQorCisgIC8qIENoYWluIHVwIHRvIHBhcmVudCAqLworICBpZiAoR19PQkpFQ1RfQ0xBU1MgKHRocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3JfcGFyZW50X2NsYXNzKS0+ZmluYWxpemUpCisgICAgKCpHX09CSkVDVF9DTEFTUyAodGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvcl9wYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSkgKG9iamVjdCk7Cit9CisKKy8qIGNsYXNzIGluaXRpYWxpemVyIGZvciBUaHJpZnRNdWx0aXBsZXhlZFByb2Nlc3NvciAqLworc3RhdGljIHZvaWQKK3RocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3JfY2xhc3NfaW5pdCAoVGhyaWZ0TXVsdGlwbGV4ZWRQcm9jZXNzb3JDbGFzcyAqY2xzKQoreworICAvKiBPdmVycmlkZSAqLworICBUSFJJRlRfUFJPQ0VTU09SX0NMQVNTKGNscyktPnByb2Nlc3MgPSB0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX3Byb2Nlc3NfaW1wbDsKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGNscyk7CisKKyAgLyogT2JqZWN0IG1ldGhvZHMgKi8KKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gdGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvcl9zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IHRocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3JfZ2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IHRocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3JfZmluYWxpemU7CisKKyAgLyogQ2xhc3MgbWV0aG9kcyAqLworICBjbHMtPnJlZ2lzdGVyX3Byb2Nlc3NvciA9IHRocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3JfcmVnaXN0ZXJfcHJvY2Vzc29yX2ltcGw7CisKKworICB0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX29ial9wcm9wZXJ0aWVzW1BST1BfVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUl9ERUZBVUxUX1NFUlZJQ0VfTkFNRV0gPQorICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZyAoImRlZmF1bHQiLAorICAgICAgICAgICJEZWZhdWx0IHNlcnZpY2UgbmFtZSB0aGUgcHJvdG9jb2wgcG9pbnRzIHRvIHdoZXJlIG5vIG11bHRpcGxleGVkIGNsaWVudCB1c2VkIiwKKyAgICAgICAgICAiU2V0IHRoZSBkZWZhdWx0IHNlcnZpY2UgbmFtZSIsCisgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAoR19QQVJBTV9SRUFEV1JJVEUpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnRpZXMgKGdvYmplY3RfY2xhc3MsCisJCQkJICAgICBQUk9QX1RIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfRU5ELAorICAgICAgdGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvcl9vYmpfcHJvcGVydGllcyk7CisKK30KKworc3RhdGljIHZvaWQKK3RocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3JfaW5pdCAoVGhyaWZ0TXVsdGlwbGV4ZWRQcm9jZXNzb3IgKnNlbGYpCit7CisKKyAgLyogQ3JlYXRlIG91ciBtdWx0aXBsZXhlZCBzZXJ2aWNlcyBoYXNoIHRhYmxlICovCisgIHNlbGYtPm11bHRpcGxleGVkX3NlcnZpY2VzID0gZ19oYXNoX3RhYmxlX25ld19mdWxsICgKKyAgICAgIGdfc3RyX2hhc2gsCisgICAgICBnX3N0cl9lcXVhbCwKKyAgICAgIGdfZnJlZSwKKyAgICAgIGdfb2JqZWN0X3VucmVmKTsKKyAgc2VsZi0+ZGVmYXVsdF9wcm9jZXNzb3JfbmFtZSA9IE5VTEw7Cit9CisKKworZ2Jvb2xlYW4KK3RocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3JfcmVnaXN0ZXJfcHJvY2Vzc29yKFRocmlmdFByb2Nlc3NvciAqcHJvY2Vzc29yLCBjb25zdCBnY2hhciAqIG11bHRpcGxleGVkX3Byb2Nlc3Nvcl9uYW1lLCBUaHJpZnRQcm9jZXNzb3IgKiBtdWx0aXBsZXhlZF9wcm9jZXNzb3IgLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfR0VUX0NMQVNTKHByb2Nlc3NvciktPnJlZ2lzdGVyX3Byb2Nlc3Nvcihwcm9jZXNzb3IsIG11bHRpcGxleGVkX3Byb2Nlc3Nvcl9uYW1lLCBtdWx0aXBsZXhlZF9wcm9jZXNzb3IsIGVycm9yKTsKK30KKworCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yLmggYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQwNjYxNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3IuaApAQCAtMCwwICsxLDExNCBAQAorLyoKKyAqIHRocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3IuaAorICoKKyAqICBDcmVhdGVkIG9uOiAxNCBzZXB0LiAyMDE3CisgKiAgICAgIEF1dGhvcjogZ2FndWlsYXIKKyAqLworCisjaWZuZGVmIF9USFJJRlRfTVVMVElQTEVYRURfTVVMVElQTEVYRURfUFJPQ0VTU09SX0hfCisjZGVmaW5lIF9USFJJRlRfTVVMVElQTEVYRURfTVVMVElQTEVYRURfUFJPQ0VTU09SX0hfCisKKworI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfcHJvY2Vzc29yLmg+CisKKworR19CRUdJTl9ERUNMUworCisvKiEgXGZpbGUgdGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvci5oCisgKiAgXGJyaWVmIFRoZSBtdWx0aXBsZXhlZCBwcm9jZXNzb3IgZm9yIGNfZ2xpYi4KKyAqLworCisvKiB0eXBlIG1hY3JvcyAqLworI2RlZmluZSBUSFJJRlRfVFlQRV9NVUxUSVBMRVhFRF9QUk9DRVNTT1IgKHRocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3JfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1Iob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBUSFJJRlRfVFlQRV9NVUxUSVBMRVhFRF9QUk9DRVNTT1IsIFRocmlmdE11bHRpcGxleGVkUHJvY2Vzc29yKSkKKyNkZWZpbmUgVEhSSUZUX0lTX01VTFRJUExFWEVEX1BST0NFU1NPUihvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIFRIUklGVF9UWVBFX01VTFRJUExFWEVEX1BST0NFU1NPUikpCisjZGVmaW5lIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksIFRIUklGVF9UWVBFX01VTFRJUExFWEVEX1BST0NFU1NPUiwgVGhyaWZ0TXVsdGlwbGV4ZWRQcm9jZXNzb3JDbGFzcykpCisjZGVmaW5lIFRIUklGVF9JU19NVUxUSVBMRVhFRF9QUk9DRVNTT1JfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksIFRIUklGVF9UWVBFX01VTFRJUExFWEVEX1BST0NFU1NPUikpCisjZGVmaW5lIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfR0VUX0NMQVNTKG9iaikgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBUSFJJRlRfVFlQRV9NVUxUSVBMRVhFRF9QUk9DRVNTT1IsIFRocmlmdE11bHRpcGxleGVkUHJvY2Vzc29yQ2xhc3MpKQorCisvKiBkZWZpbmUgdGhlIEdFcnJvciBkb21haW4gc3RyaW5nICovCisjZGVmaW5lIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfRVJST1JfRE9NQUlOICJ0aHJpZnQtbXVsdGlwbGV4ZWQtcHJvY2Vzc29yLWVycm9yLXF1YXJrIgorCisKKy8qIQorICogVGhyaWZ0IE11bHRpcGxleGVkUHJvY2Vzc29yIG9iamVjdAorICovCitzdHJ1Y3QgX1RocmlmdE11bHRpcGxleGVkUHJvY2Vzc29yCit7CisgIFRocmlmdFByb2Nlc3NvciBwYXJlbnQ7CisKKyAgLyogcHJpdmF0ZSAqLworICBnY2hhciAqIGRlZmF1bHRfcHJvY2Vzc29yX25hbWU7CisgIEdIYXNoVGFibGUgKm11bHRpcGxleGVkX3NlcnZpY2VzOworfTsKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRNdWx0aXBsZXhlZFByb2Nlc3NvciBUaHJpZnRNdWx0aXBsZXhlZFByb2Nlc3NvcjsKKworLyohCisgKiBUaHJpZnQgTXVsdGlwbGV4ZWRQcm9jZXNzb3IgY2xhc3MKKyAqLworc3RydWN0IF9UaHJpZnRNdWx0aXBsZXhlZFByb2Nlc3NvckNsYXNzCit7CisgIFRocmlmdFByb2Nlc3NvckNsYXNzIHBhcmVudDsKKworICBnYm9vbGVhbiAoKiByZWdpc3Rlcl9wcm9jZXNzb3IpIChUaHJpZnRQcm9jZXNzb3IgKnNlbGYsIGNvbnN0IGdjaGFyICogbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX25hbWUsIFRocmlmdFByb2Nlc3NvciAqIG11bHRpcGxleGVkX3Byb2Nlc3NvciAsIEdFcnJvciAqKmVycm9yKTsKKworfTsKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRNdWx0aXBsZXhlZFByb2Nlc3NvckNsYXNzIFRocmlmdE11bHRpcGxleGVkUHJvY2Vzc29yQ2xhc3M7CisKKy8qIHVzZWQgYnkgVEhSSUZUX1RZUEVfTVVMVElQTEVYRURfUFJPQ0VTU09SICovCitHVHlwZSB0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX2dldF90eXBlICh2b2lkKTsKKworLyohCisgKiBQcm9jZXNzZXMgdGhlIHJlcXVlc3QuCisgKiBccHVibGljIFxtZW1iZXJvZiBUaHJpZnRNdWx0aXBsZXhlZFByb2Nlc3NvckNsYXNzCisgKi8KK2dib29sZWFuIHRocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3JfcHJvY2VzcyAoVGhyaWZ0TXVsdGlwbGV4ZWRQcm9jZXNzb3IgKnByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0UHJvdG9jb2wgKmluLCBUaHJpZnRQcm90b2NvbCAqb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisKKworLyogUHVibGljIEFQSSAqLworCisvKioKKyAqIEBicmllZiBSZWdpc3RlcnMgYSBwcm9jZXNzb3IgaW4gdGhlIG11bHRpcGxleGVkIHByb2Nlc3NvciB1bmRlciBpdHMgbmFtZS4gSXQKKyAqIHdpbGwgdGFrZSBhIHJlZmVyZW5jZSB0byB0aGUgcHJvY2Vzc29yIHNvIHJlZmNvdW50IHdpbGwgYmUgaW5jcmVtZW50ZWQuCisgKiBJdCB3aWxsIGFsc28gYmUgZGVjcmVtZW50ZWQgb24gb2JqZWN0IGRlc3RydWN0aW9uLgorICoKKyAqIFRoZSBmaXJzdCByZWdpc3RlcmVkIHByb2Nlc3NvciBiZWNvbWVzIGRlZmF1bHQuIEJ1dCB5b3UgY2FuIG92ZXJyaWRlIGl0IHdpdGgKKyAqICJkZWZhdWx0IiBwcm9wZXJ0eS4KKyAqCisgKiBJdCByZXR1cm5zIGEgY29tcGxpYW50IGVycm9yIGlmIGl0IGNhbm5vdCBiZSByZWdpc3RlcmVkLgorICoKKyAqIEBwYXJhbSBwcm9jZXNzb3IgUG9pbnRlciB0byB0aGUgbXVsdGlwbGV4ZWQgcHJvY2Vzc29yLgorICogQHBhcmFtIG11bHRpcGxleGVkX3Byb2Nlc3Nvcl9uYW1lIE5hbWUgb2YgdGhlIHByb2Nlc3NvciB5b3Ugd2FudCB0byByZWdpc3RlcgorICogQHBhcmFtIG11bHRpcGxleGVkX3Byb2Nlc3NvciBQb2ludGVyIHRvIGltcGxlbWVudGVkIHByb2Nlc3NvciB5b3Ugd2FudCBtdWx0aXBsZXguCisgKiBAcGFyYW0gZXJyb3IgRXJyb3Igb2JqZWN0IHdoZXJlIHdlIHNob3VsZCBzdG9yZSBlcnJvcnMuCisgKgorICogQHNlZSBodHRwczovL2RldmVsb3Blci5nbm9tZS5vcmcvZ2xpYi9zdGFibGUvZ2xpYi1FcnJvci1SZXBvcnRpbmcuaHRtbCNnLXNldC1lcnJvcgorICovCitnYm9vbGVhbiB0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX3JlZ2lzdGVyX3Byb2Nlc3NvcihUaHJpZnRQcm9jZXNzb3IgKnByb2Nlc3NvciwgY29uc3QgZ2NoYXIgKiBtdWx0aXBsZXhlZF9wcm9jZXNzb3JfbmFtZSwgVGhyaWZ0UHJvY2Vzc29yICogbXVsdGlwbGV4ZWRfcHJvY2Vzc29yICwgR0Vycm9yICoqZXJyb3IpOworCisKKy8qIGRlZmluZSBlcnJvci9leGNlcHRpb24gdHlwZXMgKi8KK3R5cGVkZWYgZW51bQoreworICBUSFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SX0VSUk9SX1VOS05PV04sCisgIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfRVJST1JfU0VSVklDRV9VTkFWQUlMQUJMRSwKKyAgVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUl9FUlJPUl9NRVNTQUdFX1RZUEUsCisgIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfRVJST1JfTUVTU0FHRV9XUk9OR0xZX01VTFRJUExFWEVELAorICBUSFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SX0VSUk9SX1NFTkQsCisgIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfRVJST1JfUkVDRUlWRSwKKyAgVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUl9FUlJPUl9DTE9TRQorfSBUaHJpZnRNdWx0aXBsZXhlZFByb2Nlc3NvckVycm9yOworCisKK0dRdWFyayB0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX2Vycm9yX3F1YXJrICh2b2lkKTsKKyNkZWZpbmUgVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUl9FUlJPUiAodGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvcl9lcnJvcl9xdWFyayAoKSkKKworCitHX0VORF9ERUNMUworCisKKyNlbmRpZiAvKiBfVEhSSUZUX01VTFRJUExFWEVEX01VTFRJUExFWEVEX1BST0NFU1NPUl9IXyAqLwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sLmMgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2wuYwppbmRleCAzMmE4MDAwLi43YzJkMDE3IDEwMDY0NAotLS0gYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2wuYworKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2wuYwpAQCAtNTMsMTMgKzUzLDEzIEBACiAgICAgY29uc3QgZ2NoYXIgKm5hbWUsIGNvbnN0IFRocmlmdE1lc3NhZ2VUeXBlIG1lc3NhZ2VfdHlwZSwKICAgICBjb25zdCBnaW50MzIgc2VxaWQsIEdFcnJvciAqKmVycm9yKQogewotICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7Ci0KICAgZ2ludDMyIHZlcnNpb24gPSAoVEhSSUZUX0JJTkFSWV9QUk9UT0NPTF9WRVJTSU9OXzEpCiAgICAgICAgICAgICAgICAgICAgfCAoKGdpbnQzMikgbWVzc2FnZV90eXBlKTsKICAgZ2ludDMyIHJldDsKICAgZ2ludDMyIHhmZXIgPSAwOwogCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKwogICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9pMzIgKHByb3RvY29sLCB2ZXJzaW9uLCBlcnJvcikpIDwgMCkKICAgewogICAgIHJldHVybiAtMTsKQEAgLTExNywxMiArMTE3LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnaW50MTYgZmllbGRfaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKIHsKLSAgVEhSSUZUX1VOVVNFRF9WQVIgKG5hbWUpOwotICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7Ci0KICAgZ2ludDMyIHJldDsKICAgZ2ludDMyIHhmZXIgPSAwOwogCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAobmFtZSk7CisKICAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIChnaW50OCkgZmllbGRfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKSA8IDApCiAgIHsKQEAgLTE2MiwxMSArMTYzLDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQogewotICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7Ci0KICAgZ2ludDMyIHJldDsKICAgZ2ludDMyIHhmZXIgPSAwOwogCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKwogICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgKGdpbnQ4KSBrZXlfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKSA8IDApCiAgIHsKQEAgLTIwMiwxMSArMjAzLDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgc2l6ZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQogewotICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7IAotCiAgIGdpbnQzMiByZXQ7CiAgIGdpbnQzMiB4ZmVyID0gMDsKIAorICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKICAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIChnaW50OCkgZWxlbWVudF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpIDwgMCkKICAgewpAQCAtMjU2LDggKzI1NywxMSBAQAogdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9ib29sIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdib29sZWFuIHZhbHVlLCBHRXJyb3IgKiplcnJvcikKIHsKKyAgZ3VpbnQ4IHRtcDsKKwogICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7Ci0gIGd1aW50OCB0bXAgPSB2YWx1ZSA/IDEgOiAwOworCisgIHRtcCA9IHZhbHVlID8gMSA6IDA7CiAgIHJldHVybiB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIHRtcCwgZXJyb3IpOwogfQogCkBAIC0yODAsOSArMjg0LDExIEBACiB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2kxNiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnaW50MTYgdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCiB7CisgIGdpbnQxNiBuZXQ7CisKICAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOwogCi0gIGdpbnQxNiBuZXQgPSBnX2h0b25zICh2YWx1ZSk7CisgIG5ldCA9IGdfaHRvbnMgKHZhbHVlKTsKICAgaWYgKHRocmlmdF90cmFuc3BvcnRfd3JpdGUgKHByb3RvY29sLT50cmFuc3BvcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgZ3BvaW50ZXIpICZuZXQsIDIsIGVycm9yKSkKICAgewpAQCAtMjk2LDkgKzMwMiwxMSBAQAogdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9pMzIgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ2ludDMyIHZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQogeworICBnaW50MzIgbmV0OworCiAgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKIAotICBnaW50MzIgbmV0ID0gZ19odG9ubCAodmFsdWUpOworICBuZXQgPSBnX2h0b25sICh2YWx1ZSk7CiAgIGlmICh0aHJpZnRfdHJhbnNwb3J0X3dyaXRlIChwcm90b2NvbC0+dHJhbnNwb3J0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGdwb2ludGVyKSAmbmV0LCA0LCBlcnJvcikpCiAgIHsKQEAgLTMxMiw5ICszMjAsMTEgQEAKIHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfaTY0IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdpbnQ2NCB2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKIHsKKyAgZ2ludDY0IG5ldDsKKwogICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CiAKLSAgZ2ludDY0IG5ldCA9IEdVSU5UNjRfVE9fQkUgKHZhbHVlKTsKKyAgbmV0ID0gR1VJTlQ2NF9UT19CRSAodmFsdWUpOwogICBpZiAodGhyaWZ0X3RyYW5zcG9ydF93cml0ZSAocHJvdG9jb2wtPnRyYW5zcG9ydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBncG9pbnRlcikgJm5ldCwgOCwgZXJyb3IpKQogICB7CkBAIC0zMjgsOSArMzM4LDExIEBACiB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2RvdWJsZSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdkb3VibGUgdmFsdWUsIEdFcnJvciAqKmVycm9yKQogeworICBndWludDY0IGJpdHM7CisKICAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOwogCi0gIGd1aW50NjQgYml0cyA9IEdVSU5UNjRfRlJPTV9CRSAodGhyaWZ0X2JpdHdpc2VfY2FzdF9ndWludDY0ICh2YWx1ZSkpOworICBiaXRzID0gR1VJTlQ2NF9GUk9NX0JFICh0aHJpZnRfYml0d2lzZV9jYXN0X2d1aW50NjQgKHZhbHVlKSk7CiAgIGlmICh0aHJpZnRfdHJhbnNwb3J0X3dyaXRlIChwcm90b2NvbC0+dHJhbnNwb3J0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGdwb2ludGVyKSAmYml0cywgOCwgZXJyb3IpKQogICB7CkBAIC0zNDQsOSArMzU2LDExIEBACiB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX3N0cmluZyAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdjaGFyICpzdHIsIEdFcnJvciAqKmVycm9yKQogeworICBndWludDMyIGxlbjsKKwogICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CiAKLSAgZ3VpbnQzMiBsZW4gPSBzdHIgIT0gTlVMTCA/IHN0cmxlbiAoc3RyKSA6IDA7CisgIGxlbiA9IHN0ciAhPSBOVUxMID8gc3RybGVuIChzdHIpIDogMDsKICAgLyogd3JpdGUgdGhlIHN0cmluZyBsZW5ndGggKyAxIHdoaWNoIGluY2x1ZGVzIHRoZSBudWxsIHRlcm1pbmF0b3IgKi8KICAgcmV0dXJuIHRocmlmdF9wcm90b2NvbF93cml0ZV9iaW5hcnkgKHByb3RvY29sLCAoY29uc3QgZ3BvaW50ZXIpIHN0ciwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4sIGVycm9yKTsKQEAgLTM1NywxMCArMzcxLDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3BvaW50ZXIgYnVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcikKIHsKLSAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOwogICBnaW50MzIgcmV0OwogICBnaW50MzIgeGZlciA9IDA7CiAKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCiAgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2kzMiAocHJvdG9jb2wsIGxlbiwgZXJyb3IpKSA8IDApCiAgIHsKICAgICByZXR1cm4gLTE7CkBAIC0zODYsMTIgKzQwMSwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdE1lc3NhZ2VUeXBlICptZXNzYWdlX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludDMyICpzZXFpZCwgR0Vycm9yICoqZXJyb3IpCiB7Ci0gIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKLQogICBnaW50MzIgcmV0OwogICBnaW50MzIgeGZlciA9IDA7CiAgIGdpbnQzMiBzejsKIAorICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKICAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9pMzIgKHByb3RvY29sLCAmc3osIGVycm9yKSkgPCAwKQogICB7CiAgICAgcmV0dXJuIC0xOwpAQCAtNDY0LDEzICs0NzksMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludDE2ICpmaWVsZF9pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCiB7Ci0gIFRIUklGVF9VTlVTRURfVkFSIChuYW1lKTsKLSAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOwotCiAgIGdpbnQzMiByZXQ7CiAgIGdpbnQzMiB4ZmVyID0gMDsKICAgZ2ludDggdHlwZTsKIAorICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKG5hbWUpOworCiAgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZ0eXBlLCBlcnJvcikpIDwgMCkKICAgewogICAgIHJldHVybiAtMTsKQEAgLTUwNiwxMyArNTIyLDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyICpzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCiB7Ci0gIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKLQogICBnaW50MzIgcmV0OwogICBnaW50MzIgeGZlciA9IDA7CiAgIGdpbnQ4IGssIHY7CiAgIGdpbnQzMiBzaXplaTsKIAorICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKICAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJmssIGVycm9yKSkgPCAwKQogICB7CiAgICAgcmV0dXJuIC0xOwpAQCAtNTU5LDEzICs1NzUsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUeXBlICplbGVtZW50X3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiAqc2l6ZSwgR0Vycm9yICoqZXJyb3IpCiB7Ci0gIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKLQogICBnaW50MzIgcmV0OwogICBnaW50MzIgeGZlciA9IDA7CiAgIGdpbnQ4IGU7CiAgIGdpbnQzMiBzaXplaTsKIAorICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKICAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJmUsIGVycm9yKSkgPCAwKQogICB7CiAgICAgcmV0dXJuIC0xOwpAQCAtNjIzLDEzICs2MzksMTQgQEAKIHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9ib29sIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdib29sZWFuICp2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKIHsKLSAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOwogICBnaW50MzIgcmV0OwogICBncG9pbnRlciBiWzFdOwogCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKwogICBpZiAoKHJldCA9IAotICAgICAgIHRocmlmdF90cmFuc3BvcnRfcmVhZCAocHJvdG9jb2wtPnRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIsIDEsIGVycm9yKSkgPCAwKQorICAgICAgIHRocmlmdF90cmFuc3BvcnRfcmVhZF9hbGwgKHByb3RvY29sLT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYiwgMSwgZXJyb3IpKSA8IDApCiAgIHsKICAgICByZXR1cm4gLTE7CiAgIH0KQEAgLTY0MSwxMyArNjU4LDE0IEBACiB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfYnl0ZSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnaW50OCAqdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCiB7Ci0gIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKICAgZ2ludDMyIHJldDsKICAgZ3BvaW50ZXIgYlsxXTsKIAorICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKICAgaWYgKChyZXQgPQotICAgICAgIHRocmlmdF90cmFuc3BvcnRfcmVhZCAocHJvdG9jb2wtPnRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIsIDEsIGVycm9yKSkgPCAwKQorICAgICAgIHRocmlmdF90cmFuc3BvcnRfcmVhZF9hbGwgKHByb3RvY29sLT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYiwgMSwgZXJyb3IpKSA8IDApCiAgIHsKICAgICByZXR1cm4gLTE7CiAgIH0KQEAgLTY1OSwxOCArNjc3LDIyIEBACiB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfaTE2IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdpbnQxNiAqdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKIHsKLSAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOwogICBnaW50MzIgcmV0OwotICBncG9pbnRlciBiWzJdOworICB1bmlvbgorICB7CisgICAgZ2ludDggYnl0ZV9hcnJheVsyXTsKKyAgICBnaW50MTYgaW50MTY7CisgIH0gYjsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CiAKICAgaWYgKChyZXQgPQotICAgICAgIHRocmlmdF90cmFuc3BvcnRfcmVhZCAocHJvdG9jb2wtPnRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIsIDIsIGVycm9yKSkgPCAwKQorICAgICAgIHRocmlmdF90cmFuc3BvcnRfcmVhZF9hbGwgKHByb3RvY29sLT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi5ieXRlX2FycmF5LCAyLCBlcnJvcikpIDwgMCkKICAgewogICAgIHJldHVybiAtMTsKICAgfQotICAqdmFsdWUgPSAqKGdpbnQxNiAqKSBiOwotICAqdmFsdWUgPSBnX250b2hzICgqdmFsdWUpOworICAqdmFsdWUgPSBnX250b2hzIChiLmludDE2KTsKICAgcmV0dXJuIHJldDsKIH0KIApAQCAtNjc4LDE4ICs3MDAsMjIgQEAKIHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9pMzIgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2ludDMyICp2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQogewotICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CiAgIGdpbnQzMiByZXQ7Ci0gIGdwb2ludGVyIGJbNF07CisgIHVuaW9uCisgIHsKKyAgICBnaW50OCBieXRlX2FycmF5WzRdOworICAgIGdpbnQzMiBpbnQzMjsKKyAgfSBiOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKIAogICBpZiAoKHJldCA9Ci0gICAgICAgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkIChwcm90b2NvbC0+dHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYiwgNCwgZXJyb3IpKSA8IDApCisgICAgICAgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2FsbCAocHJvdG9jb2wtPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLmJ5dGVfYXJyYXksIDQsIGVycm9yKSkgPCAwKQogICB7CiAgICAgcmV0dXJuIC0xOwogICB9Ci0gICp2YWx1ZSA9ICooZ2ludDMyICopIGI7Ci0gICp2YWx1ZSA9IGdfbnRvaGwgKCp2YWx1ZSk7CisgICp2YWx1ZSA9IGdfbnRvaGwgKGIuaW50MzIpOwogICByZXR1cm4gcmV0OwogfQogCkBAIC02OTcsMTggKzcyMywyMiBAQAogdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2k2NCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnaW50NjQgKnZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCiB7Ci0gIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKICAgZ2ludDMyIHJldDsKLSAgZ3BvaW50ZXIgYls4XTsKKyAgdW5pb24KKyAgeworICAgIGdpbnQ4IGJ5dGVfYXJyYXlbOF07CisgICAgZ2ludDY0IGludDY0OworICB9IGI7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOwogCiAgIGlmICgocmV0ID0KLSAgICAgICB0aHJpZnRfdHJhbnNwb3J0X3JlYWQgKHByb3RvY29sLT50cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLCA4LCBlcnJvcikpIDwgMCkKKyAgICAgICB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfYWxsIChwcm90b2NvbC0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIuYnl0ZV9hcnJheSwgOCwgZXJyb3IpKSA8IDApCiAgIHsKICAgICByZXR1cm4gLTE7CiAgIH0KLSAgKnZhbHVlID0gKihnaW50NjQgKikgYjsKLSAgKnZhbHVlID0gR1VJTlQ2NF9GUk9NX0JFICgqdmFsdWUpOworICAqdmFsdWUgPSBHVUlOVDY0X0ZST01fQkUgKGIuaW50NjQpOwogICByZXR1cm4gcmV0OwogfQogCkBAIC03MTYsMTkgKzc0NiwyMiBAQAogdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2RvdWJsZSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2RvdWJsZSAqdmFsdWUsIEdFcnJvciAqKmVycm9yKQogewotICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CiAgIGdpbnQzMiByZXQ7Ci0gIGdwb2ludGVyIGJbOF07CisgIHVuaW9uCisgIHsKKyAgICBnaW50OCBieXRlX2FycmF5WzhdOworICAgIGd1aW50NjQgdWludDY0OworICB9IGI7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOwogCiAgIGlmICgocmV0ID0KLSAgICAgICB0aHJpZnRfdHJhbnNwb3J0X3JlYWQgKHByb3RvY29sLT50cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLCA4LCBlcnJvcikpIDwgMCkKKyAgICAgICB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfYWxsIChwcm90b2NvbC0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIuYnl0ZV9hcnJheSwgOCwgZXJyb3IpKSA8IDApCiAgIHsKICAgICByZXR1cm4gLTE7CiAgIH0KLSAgZ3VpbnQ2NCBiaXRzID0gKihndWludDY0ICopIGI7Ci0gIGJpdHMgPSBHVUlOVDY0X0ZST01fQkUgKGJpdHMpOwotICAqdmFsdWUgPSB0aHJpZnRfYml0d2lzZV9jYXN0X2dkb3VibGUgKGJpdHMpOworICAqdmFsdWUgPSB0aHJpZnRfYml0d2lzZV9jYXN0X2dkb3VibGUgKEdVSU5UNjRfRlJPTV9CRSAoYi51aW50NjQpKTsKICAgcmV0dXJuIHJldDsKIH0KIApAQCAtNzM2LDEyICs3NjksMTMgQEAKIHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9zdHJpbmcgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjaGFyICoqc3RyLCBHRXJyb3IgKiplcnJvcikKIHsKLSAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOwogICBndWludDMyIGxlbjsKICAgZ2ludDMyIHJldDsKICAgZ2ludDMyIHhmZXIgPSAwOwogICBnaW50MzIgcmVhZF9sZW4gPSAwOwogCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKwogICAvKiByZWFkIHRoZSBsZW5ndGggaW50byByZWFkX2xlbiAqLwogICBpZiAoKHJldCA9CiAgICAgICAgdGhyaWZ0X3Byb3RvY29sX3JlYWRfaTMyIChwcm90b2NvbCwgJnJlYWRfbGVuLCBlcnJvcikpIDwgMCkKQEAgLTc1MCwxNCArNzg0LDIxIEBACiAgIH0KICAgeGZlciArPSByZXQ7CiAKLSAgaWYgKHJlYWRfbGVuID4gMCkKLSAgewotICAgIC8qIGFsbG9jYXRlIHRoZSBtZW1vcnkgZm9yIHRoZSBzdHJpbmcgKi8KLSAgICBsZW4gPSAoZ3VpbnQzMikgcmVhZF9sZW4gKyAxOyAvLyBzcGFjZSBmb3IgbnVsbCB0ZXJtaW5hdG9yCi0gICAgKnN0ciA9IGdfbmV3MCAoZ2NoYXIsIGxlbik7CisgIGlmIChyZWFkX2xlbiA8IDApIHsKKyAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9QUk9UT0NPTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgVEhSSUZUX1BST1RPQ09MX0VSUk9SX05FR0FUSVZFX1NJWkUsCisgICAgICAgICAgICAgICAgICJnb3QgbmVnYXRpdmUgc2l6ZSBvZiAlZCIsIHJlYWRfbGVuKTsKKyAgICAqc3RyID0gTlVMTDsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICAvKiBhbGxvY2F0ZSB0aGUgbWVtb3J5IGZvciB0aGUgc3RyaW5nICovCisgIGxlbiA9IChndWludDMyKSByZWFkX2xlbiArIDE7IC8qIHNwYWNlIGZvciBudWxsIHRlcm1pbmF0b3IgKi8KKyAgKnN0ciA9IGdfbmV3MCAoZ2NoYXIsIGxlbik7CisgIGlmIChyZWFkX2xlbiA+IDApIHsKICAgICBpZiAoKHJldCA9Ci0gICAgICAgICB0aHJpZnRfdHJhbnNwb3J0X3JlYWQgKHByb3RvY29sLT50cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzdHIsIHJlYWRfbGVuLCBlcnJvcikpIDwgMCkKKyAgICAgICAgIHRocmlmdF90cmFuc3BvcnRfcmVhZF9hbGwgKHByb3RvY29sLT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc3RyLCByZWFkX2xlbiwgZXJyb3IpKSA8IDApCiAgICAgewogICAgICAgZ19mcmVlICgqc3RyKTsKICAgICAgICpzdHIgPSBOVUxMOwpAQCAtNzY2LDcgKzgwNyw3IEBACiAgICAgfQogICAgIHhmZXIgKz0gcmV0OwogICB9IGVsc2UgewotICAgICpzdHIgPSBOVUxMOworICAgICoqc3RyID0gMDsKICAgfQogCiAgIHJldHVybiB4ZmVyOwpAQCAtNzc3LDExICs4MTgsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwb2ludGVyICpidWYsIGd1aW50MzIgKmxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQogewotICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CiAgIGdpbnQzMiByZXQ7CiAgIGdpbnQzMiB4ZmVyID0gMDsKICAgZ2ludDMyIHJlYWRfbGVuID0gMDsKICAKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCiAgIC8qIHJlYWQgdGhlIGxlbmd0aCBpbnRvIHJlYWRfbGVuICovCiAgIGlmICgocmV0ID0KICAgICAgICB0aHJpZnRfcHJvdG9jb2xfcmVhZF9pMzIgKHByb3RvY29sLCAmcmVhZF9sZW4sIGVycm9yKSkgPCAwKQpAQCAtNzk2LDggKzgzOCw4IEBACiAgICAgKmxlbiA9IChndWludDMyKSByZWFkX2xlbjsKICAgICAqYnVmID0gZ19uZXcgKGd1Y2hhciwgKmxlbik7CiAgICAgaWYgKChyZXQgPQotICAgICAgICAgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkIChwcm90b2NvbC0+dHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmLCAqbGVuLCBlcnJvcikpIDwgMCkKKyAgICAgICAgIHRocmlmdF90cmFuc3BvcnRfcmVhZF9hbGwgKHByb3RvY29sLT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmLCAqbGVuLCBlcnJvcikpIDwgMCkKICAgICB7CiAgICAgICBnX2ZyZWUgKCpidWYpOwogICAgICAgKmJ1ZiA9IE5VTEw7CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfZmFjdG9yeS5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sX2ZhY3RvcnkuYwppbmRleCAzOTBjODA5Li43NzRlOWFkIDEwMDY0NAotLS0gYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfZmFjdG9yeS5jCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9mYWN0b3J5LmMKQEAgLTI3LDExICsyNywxMSBAQAogdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9mYWN0b3J5X2dldF9wcm90b2NvbCAoVGhyaWZ0UHJvdG9jb2xGYWN0b3J5ICpmYWN0b3J5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQpCiB7Ci0gIFRIUklGVF9VTlVTRURfVkFSIChmYWN0b3J5KTsKLQogICBUaHJpZnRCaW5hcnlQcm90b2NvbCAqdGIgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJhbnNwb3J0IiwgdHJhbnNwb3J0LCBOVUxMKTsKIAorICBUSFJJRlRfVU5VU0VEX1ZBUiAoZmFjdG9yeSk7CisKICAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTCAodGIpOwogfQogCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9jb21wYWN0X3Byb3RvY29sLmMgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9jb21wYWN0X3Byb3RvY29sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FlNDc0OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2wuYwpAQCAtMCwwICsxLDE2MDkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfY29tcGFjdF9wcm90b2NvbC5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NvbmZpZy5oPgorCisvKgorICogKl90b196aWd6YWcgZGVwZW5kIG9uIHRoZSBmYWN0IHRoYXQgdGhlIHJpZ2h0IHNoaWZ0CisgKiBvcGVyYXRvciBvbiBhIHNpZ25lZCBpbnRlZ2VyIGlzIGFuIGFyaXRobWV0aWMgKHNpZ24tZXh0ZW5kaW5nKSBzaGlmdC4KKyAqIElmIHRoaXMgaXMgbm90IHRoZSBjYXNlLCB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiB3aWxsIG5vdCB3b3JrLgorICovCisjaWYgIWRlZmluZWQoU0lHTkVEX1JJR0hUX1NISUZUX0lTKSB8fCAhZGVmaW5lZChBUklUSE1FVElDX1JJR0hUX1NISUZUKQorIyBlcnJvciAiVW5hYmxlIHRvIGRldGVybWluZSB0aGUgYmVoYXZpb3Igb2YgYSBzaWduZWQgcmlnaHQgc2hpZnQiCisjZW5kaWYKKyNpZiBTSUdORURfUklHSFRfU0hJRlRfSVMgIT0gQVJJVEhNRVRJQ19SSUdIVF9TSElGVAorIyBlcnJvciAidGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2wgb25seSB3b3JrcyBpZiBzaWduZWQgcmlnaHQgc2hpZnQgaXMgYXJpdGhtZXRpYyIKKyNlbmRpZgorCisvKiBvYmplY3QgcHJvcGVydGllcyAqLworZW51bSBfVGhyaWZ0Q29tcGFjdFByb3RvY29sUHJvcGVydGllcworeworICAgIFBST1BfMCwKKyAgICBQUk9QX1RIUklGVF9DT01QQUNUX1BST1RPQ09MX1NUUklOR19MSU1JVCwKKyAgICBQUk9QX1RIUklGVF9DT01QQUNUX1BST1RPQ09MX0NPTlRBSU5FUl9MSU1JVAorfTsKKworR19ERUZJTkVfVFlQRSAoVGhyaWZ0Q29tcGFjdFByb3RvY29sLCB0aHJpZnRfY29tcGFjdF9wcm90b2NvbCwKKyAgICAgICAgICAgICAgIFRIUklGVF9UWVBFX1BST1RPQ09MKQorCitzdGF0aWMgY29uc3QgZ2ludDggUFJPVE9DT0xfSUQgPSAoZ2ludDgpMHg4MnU7CitzdGF0aWMgY29uc3QgZ2ludDggVkVSU0lPTl9OID0gMTsKK3N0YXRpYyBjb25zdCBnaW50OCBWRVJTSU9OX01BU0sgPSAweDFmOyAgICAgICAvKiAwMDAxIDExMTEgKi8KK3N0YXRpYyBjb25zdCBnaW50OCBUWVBFX01BU0sgPSAoZ2ludDgpMHhlMHU7ICAvKiAxMTEwIDAwMDAgKi8KK3N0YXRpYyBjb25zdCBnaW50OCBUWVBFX0JJVFMgPSAweDA3OyAgICAgICAgICAvKiAwMDAwIDAxMTEgKi8KK3N0YXRpYyBjb25zdCBnaW50MzIgVFlQRV9TSElGVF9BTU9VTlQgPSA1OworCitlbnVtIFR5cGVzIHsKKyAgQ1RfU1RPUCAgICAgICAgICAgPSAweDAwLAorICBDVF9CT09MRUFOX1RSVUUgICA9IDB4MDEsCisgIENUX0JPT0xFQU5fRkFMU0UgID0gMHgwMiwKKyAgQ1RfQllURSAgICAgICAgICAgPSAweDAzLAorICBDVF9JMTYgICAgICAgICAgICA9IDB4MDQsCisgIENUX0kzMiAgICAgICAgICAgID0gMHgwNSwKKyAgQ1RfSTY0ICAgICAgICAgICAgPSAweDA2LAorICBDVF9ET1VCTEUgICAgICAgICA9IDB4MDcsCisgIENUX0JJTkFSWSAgICAgICAgID0gMHgwOCwKKyAgQ1RfTElTVCAgICAgICAgICAgPSAweDA5LAorICBDVF9TRVQgICAgICAgICAgICA9IDB4MEEsCisgIENUX01BUCAgICAgICAgICAgID0gMHgwQiwKKyAgQ1RfU1RSVUNUICAgICAgICAgPSAweDBDCit9OworCitzdGF0aWMgY29uc3QgZ2ludDggVFR5cGVUb0NUeXBlWzE2XSA9IHsKKyAgQ1RfU1RPUCwgLyogVF9TVE9QICovCisgIDAsIC8qIHVudXNlZCAqLworICBDVF9CT09MRUFOX1RSVUUsIC8qIFRfQk9PTCAqLworICBDVF9CWVRFLCAvKiBUX0JZVEUgKi8KKyAgQ1RfRE9VQkxFLCAvKiBUX0RPVUJMRSAqLworICAwLCAvKiB1bnVzZWQgKi8KKyAgQ1RfSTE2LCAvKiBUX0kxNiAqLworICAwLCAvKiB1bnVzZWQgKi8KKyAgQ1RfSTMyLCAvKiBUX0kzMiAqLworICAwLCAvKiB1bnVzZWQgKi8KKyAgQ1RfSTY0LCAvKiBUX0k2NCAqLworICBDVF9CSU5BUlksIC8qIFRfU1RSSU5HICovCisgIENUX1NUUlVDVCwgLyogVF9TVFJVQ1QgKi8KKyAgQ1RfTUFQLCAvKiBUX01BUCAqLworICBDVF9TRVQsIC8qIFRfU0VUICovCisgIENUX0xJU1QsIC8qIFRfTElTVCAqLworfTsKKworc3RhdGljIGd1aW50NjQKK3RocmlmdF9iaXR3aXNlX2Nhc3RfZ3VpbnQ2NCAoY29uc3QgZ2RvdWJsZSB2KQoreworICB1bmlvbiB7CisgICAgZ2RvdWJsZSBmcm9tOworICAgIGd1aW50NjQgdG87CisgIH0gdTsKKyAgdS5mcm9tID0gdjsKKyAgcmV0dXJuIHUudG87Cit9CisKK3N0YXRpYyBnZG91YmxlCit0aHJpZnRfYml0d2lzZV9jYXN0X2dkb3VibGUgKGNvbnN0IGd1aW50NjQgdikKK3sKKyAgdW5pb24geworICAgIGd1aW50NjQgZnJvbTsKKyAgICBnZG91YmxlIHRvOworICB9IHU7CisgIHUuZnJvbSA9IHY7CisgIHJldHVybiB1LnRvOworfQorCisvKioKKyAqIENvbnZlcnQgbCBpbnRvIGEgemlnemFnIGxvbmcuIFRoaXMgYWxsb3dzIG5lZ2F0aXZlIG51bWJlcnMgdG8gYmUKKyAqIHJlcHJlc2VudGVkIGNvbXBhY3RseSBhcyBhIHZhcmludC4KKyAqLworc3RhdGljIGd1aW50NjQKK2k2NF90b196aWd6YWcgKGNvbnN0IGdpbnQ2NCBsKQoreworICByZXR1cm4gKCgoZ3VpbnQ2NClsKSA8PCAxKSBeIChsID4+IDYzKTsKK30KKworLyoqCisgKiBDb252ZXJ0IG4gaW50byBhIHppZ3phZyBpbnQuIFRoaXMgYWxsb3dzIG5lZ2F0aXZlIG51bWJlcnMgdG8gYmUKKyAqIHJlcHJlc2VudGVkIGNvbXBhY3RseSBhcyBhIHZhcmludC4KKyAqLworc3RhdGljIGd1aW50MzIKK2kzMl90b196aWd6YWcgKGNvbnN0IGdpbnQzMiBuKQoreworICByZXR1cm4gKCgoZ3VpbnQzMiluKSA8PCAxKSBeIChuID4+IDMxKTsKK30KKworLyoqCisgKiBDb252ZXJ0IGZyb20gemlnemFnIGludCB0byBpbnQuCisgKi8KK3N0YXRpYyBnaW50MzIKK3ppZ3phZ190b19pMzIgKGd1aW50MzIgbikKK3sKKyAgcmV0dXJuIChuID4+IDEpIF4gKGd1aW50MzIpICgtKGdpbnQzMikgKG4gJiAxKSk7Cit9CisKKy8qKgorICogQ29udmVydCBmcm9tIHppZ3phZyBsb25nIHRvIGxvbmcuCisgKi8KK3N0YXRpYyBnaW50NjQKK3ppZ3phZ190b19pNjQgKGd1aW50NjQgbikKK3sKKyAgcmV0dXJuIChuID4+IDEpIF4gKGd1aW50NjQpICgtKGdpbnQ2NCkgKG4gJiAxKSk7Cit9CisKK1RocmlmdFR5cGUgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZ2V0X3R0eXBlIChUaHJpZnRDb21wYWN0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdpbnQ4IHR5cGUsIEdFcnJvciAqKmVycm9yKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHJvdG9jb2wpOworCisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgVF9TVE9QOgorICAgICAgcmV0dXJuIFRfU1RPUDsKKyAgICBjYXNlIENUX0JPT0xFQU5fRkFMU0U6CisgICAgY2FzZSBDVF9CT09MRUFOX1RSVUU6CisgICAgICByZXR1cm4gVF9CT09MOworICAgIGNhc2UgQ1RfQllURToKKyAgICAgIHJldHVybiBUX0JZVEU7CisgICAgY2FzZSBDVF9JMTY6CisgICAgICByZXR1cm4gVF9JMTY7CisgICAgY2FzZSBDVF9JMzI6CisgICAgICByZXR1cm4gVF9JMzI7CisgICAgY2FzZSBDVF9JNjQ6CisgICAgICByZXR1cm4gVF9JNjQ7CisgICAgY2FzZSBDVF9ET1VCTEU6CisgICAgICByZXR1cm4gVF9ET1VCTEU7CisgICAgY2FzZSBDVF9CSU5BUlk6CisgICAgICByZXR1cm4gVF9TVFJJTkc7CisgICAgY2FzZSBDVF9MSVNUOgorICAgICAgcmV0dXJuIFRfTElTVDsKKyAgICBjYXNlIENUX1NFVDoKKyAgICAgIHJldHVybiBUX1NFVDsKKyAgICBjYXNlIENUX01BUDoKKyAgICAgIHJldHVybiBUX01BUDsKKyAgICBjYXNlIENUX1NUUlVDVDoKKyAgICAgIHJldHVybiBUX1NUUlVDVDsKKyAgICBkZWZhdWx0OgorICAgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfUFJPVE9DT0xfRVJST1IsCisgICAgICAgICAgICAgICAgICAgVEhSSUZUX1BST1RPQ09MX0VSUk9SX0lOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAidW5yZWNvZ25pemVkIHR5cGUiKTsKKyAgICAgIHJldHVybiAtMTsKKyAgfQorfQorCisvKioKKyAqIFdyaXRlIGFuIGkzMiBhcyBhIHZhcmludC4gUmVzdWx0cyBpbiAxLTUgYnl0ZXMgb24gdGhlIHdpcmUuCisgKi8KK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfdmFyaW50MzIgKFRocmlmdENvbXBhY3RQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBndWludDggYnVmWzVdOworICBnaW50MzIgeGZlcjsKKyAgZ3VpbnQzMiBtOworCisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisKKyAgeGZlciA9IDA7CisgIG0gPSBuOworCisgIHdoaWxlIChUUlVFKSB7CisgICAgaWYgKChtICYgfjB4N0YpID09IDApIHsKKyAgICAgIGJ1Zlt4ZmVyKytdID0gKGdpbnQ4KW07CisgICAgICBicmVhazsKKyAgICB9IGVsc2UgeworICAgICAgYnVmW3hmZXIrK10gPSAoZ2ludDgpKChtICYgMHg3RikgfCAweDgwKTsKKyAgICAgIG0gPj49IDc7CisgICAgfQorICB9CisKKyAgaWYgKHRocmlmdF90cmFuc3BvcnRfd3JpdGUgKFRIUklGVF9QUk9UT0NPTCAocHJvdG9jb2wpLT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgZ3BvaW50ZXIpIGJ1ZiwgeGZlciwgZXJyb3IpKSB7CisgICAgcmV0dXJuIHhmZXI7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIC0xOworICB9Cit9CisKKy8qKgorICogV3JpdGUgYW4gaTY0IGFzIGEgdmFyaW50LiBSZXN1bHRzIGluIDEtMTAgYnl0ZXMgb24gdGhlIHdpcmUuCisgKi8KK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfdmFyaW50NjQgKFRocmlmdENvbXBhY3RQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQ2NCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBndWludDggYnVmWzEwXTsKKyAgZ2ludDMyIHhmZXI7CisgIGd1aW50NjQgbTsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworCisgIHhmZXIgPSAwOworICBtID0gbjsKKworICB3aGlsZSAoVFJVRSkgeworICAgIGlmICgobSAmIH4weDdGTCkgPT0gMCkgeworICAgICAgYnVmW3hmZXIrK10gPSAoZ2ludDgpbTsKKyAgICAgIGJyZWFrOworICAgIH0gZWxzZSB7CisgICAgICBidWZbeGZlcisrXSA9IChnaW50OCkoKG0gJiAweDdGKSB8IDB4ODApOworICAgICAgbSA+Pj0gNzsKKyAgICB9CisgIH0KKworICBpZiAodGhyaWZ0X3RyYW5zcG9ydF93cml0ZSAoVEhSSUZUX1BST1RPQ09MIChwcm90b2NvbCktPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBncG9pbnRlcikgYnVmLCB4ZmVyLCBlcnJvcikpIHsKKyAgICByZXR1cm4geGZlcjsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gLTE7CisgIH0KK30KKworLyoqCisgKiBSZWFkIGFuIGk2NCBmcm9tIHRoZSB3aXJlIGFzIGEgcHJvcGVyIHZhcmludC4gVGhlIE1TQiBvZiBlYWNoIGJ5dGUgaXMgc2V0CisgKiBpZiB0aGVyZSBpcyBhbm90aGVyIGJ5dGUgdG8gZm9sbG93LiBUaGlzIGNhbiByZWFkIHVwIHRvIDEwIGJ5dGVzLgorICovCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfdmFyaW50NjQgKFRocmlmdENvbXBhY3RQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50NjQgKmk2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbCAqdHA7CisgIGdpbnQzMiByZXQ7CisgIGdpbnQzMiB4ZmVyOworICBndWludDY0IHZhbDsKKyAgZ2ludCBzaGlmdDsKKyAgZ3VpbnQ4IGJ5dGU7CisKKyAgdHAgPSBUSFJJRlRfUFJPVE9DT0wgKHByb3RvY29sKTsKKyAgeGZlciA9IDA7CisgIHZhbCA9IDA7CisgIHNoaWZ0ID0gMDsKKyAgYnl0ZSA9IDA7CisKKyAgd2hpbGUgKFRSVUUpIHsKKyAgICBpZiAoKHJldCA9IHRocmlmdF90cmFuc3BvcnRfcmVhZF9hbGwgKHRwLT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ3BvaW50ZXIpICZieXRlLCAxLCBlcnJvcikpIDwgMCkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICArK3hmZXI7CisgICAgdmFsIHw9IChndWludDY0KShieXRlICYgMHg3ZikgPDwgc2hpZnQ7CisgICAgc2hpZnQgKz0gNzsKKyAgICBpZiAoIShieXRlICYgMHg4MCkpIHsKKyAgICAgICppNjQgPSAoZ2ludDY0KSB2YWw7CisgICAgICByZXR1cm4geGZlcjsKKyAgICB9CisgICAgaWYgKEdfVU5MSUtFTFkgKHhmZXIgPT0gMTApKSB7IC8qIDcgKiA5IDwgNjQgPCA3ICogMTAgKi8KKyAgICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1BST1RPQ09MX0VSUk9SLAorICAgICAgICAgICAgICAgICAgIFRIUklGVF9QUk9UT0NPTF9FUlJPUl9JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgInZhcmlhYmxlLWxlbmd0aCBpbnQgb3ZlciAxMCBieXRlcyIpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgfQorfQorCisvKioKKyAqIFJlYWQgYW4gaTMyIGZyb20gdGhlIHdpcmUgYXMgYSB2YXJpbnQuIFRoZSBNU0Igb2YgZWFjaCBieXRlIGlzIHNldAorICogaWYgdGhlcmUgaXMgYW5vdGhlciBieXRlIHRvIGZvbGxvdy4gVGhpcyBjYW4gcmVhZCB1cCB0byA1IGJ5dGVzLgorICovCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfdmFyaW50MzIgKFRocmlmdENvbXBhY3RQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50MzIgKmkzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBnaW50NjQgdmFsOworICBnaW50MzIgcmV0OworICBnaW50MzIgeGZlcjsKKworICB4ZmVyID0gMDsKKworICBpZiAoKHJldCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfdmFyaW50NjQgKHByb3RvY29sLCAmdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkgPCAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHhmZXIgKz0gcmV0OworCisgICppMzIgPSAoZ2ludDMyKXZhbDsKKworICByZXR1cm4geGZlcjsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbl9pbnRlcm5hbCAoVGhyaWZ0Q29tcGFjdFByb3RvY29sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0VHlwZSBmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdpbnQxNiBmaWVsZF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnaW50OCB0eXBlX292ZXJyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBnaW50MzIgcmV0OworICBnaW50MzIgeGZlcjsKKyAgZ2ludDggdHlwZV90b193cml0ZTsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAobmFtZSk7CisKKyAgeGZlciA9IDA7CisKKyAgLyogaWYgdGhlcmUncyBhIHR5cGUgb3ZlcnJpZGUsIHVzZSB0aGF0LiAqLworICB0eXBlX3RvX3dyaXRlCisgICAgPSAodHlwZV9vdmVycmlkZSA9PSAtMSA/IFRUeXBlVG9DVHlwZVtmaWVsZF90eXBlXSA6IHR5cGVfb3ZlcnJpZGUpOworCisgIC8qIGNoZWNrIGlmIHdlIGNhbiB1c2UgZGVsdGEgZW5jb2RpbmcgZm9yIHRoZSBmaWVsZCBpZCAqLworICBpZiAoZmllbGRfaWQgPiBwcm90b2NvbC0+X2xhc3RfZmllbGRfaWQKKyAgICAgICYmIGZpZWxkX2lkIC0gcHJvdG9jb2wtPl9sYXN0X2ZpZWxkX2lkIDw9IDE1KSB7CisgICAgLyogd3JpdGUgdGhlbSB0b2dldGhlciAqLworICAgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2J5dGUgKFRIUklGVF9QUk9UT0NPTCAocHJvdG9jb2wpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnaW50OCkgKChmaWVsZF9pZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHByb3RvY29sLT5fbGFzdF9maWVsZF9pZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCA0IHwgdHlwZV90b193cml0ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKSA8IDApIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgeGZlciArPSByZXQ7CisgIH0gZWxzZSB7CisgICAgLyogd3JpdGUgdGhlbSBzZXBhcmF0ZSAqLworICAgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2J5dGUgKFRIUklGVF9QUk9UT0NPTCAocHJvdG9jb2wpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVfdG9fd3JpdGUsIGVycm9yKSkgPCAwKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHhmZXIgKz0gcmV0OworCisgICAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfaTE2IChUSFJJRlRfUFJPVE9DT0wgKHByb3RvY29sKSwgZmllbGRfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpIDwgMCkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB4ZmVyICs9IHJldDsKKyAgfQorCisgIHByb3RvY29sLT5fbGFzdF9maWVsZF9pZCA9IGZpZWxkX2lkOworICByZXR1cm4geGZlcjsKK30KKworLyoqCisgKiBNZXRob2QgZm9yIHdyaXRpbmcgdGhlIHN0YXJ0IG9mIGxpc3RzIGFuZCBzZXRzLiBMaXN0IGFuZCBzZXRzIG9uCisgKiB0aGUgd2lyZSBkaWZmZXIgb25seSBieSB0aGUgdHlwZSBpbmRpY2F0b3IuCisgKi8KK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfY29sbGVjdGlvbl9iZWdpbiAoVGhyaWZ0Q29tcGFjdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdFR5cGUgZWxlbV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiBzaXplLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2ludDMyIHJldDsKKyAgZ2ludDMyIHhmZXI7CisKKyAgeGZlciA9IDA7CisKKyAgaWYgKHNpemUgPD0gMTQpIHsKKyAgICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9ieXRlIChUSFJJRlRfUFJPVE9DT0wgKHByb3RvY29sKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2ludDgpIChzaXplIDw8IDQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFRUeXBlVG9DVHlwZVtlbGVtX3R5cGVdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpIDwgMCkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB4ZmVyICs9IHJldDsKKyAgfSBlbHNlIHsKKyAgICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9ieXRlIChUSFJJRlRfUFJPVE9DT0wgKHByb3RvY29sKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2ludDgpICgweGYwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBUVHlwZVRvQ1R5cGVbZWxlbV90eXBlXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKSA8IDApIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgeGZlciArPSByZXQ7CisKKyAgICBpZiAoKHJldCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3ZhcmludDMyIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ3VpbnQzMikgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpIDwgMCkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB4ZmVyICs9IHJldDsKKyAgfQorCisgIHJldHVybiB4ZmVyOworfQorCisvKgorICogcHVibGljIG1ldGhvZHMKKyAqLworCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0TWVzc2FnZVR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2ludDMyIHNlcWlkLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2ludDggdmVyc2lvbjsKKyAgZ2ludDMyIHJldDsKKyAgZ2ludDMyIHhmZXI7CisKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICpjcDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGNwID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKTsKKworICB2ZXJzaW9uID0gKFZFUlNJT05fTiAmIFZFUlNJT05fTUFTSykKKyAgICAgICAgICAgIHwgKCgoZ2ludDMyKSBtZXNzYWdlX3R5cGUgPDwgVFlQRV9TSElGVF9BTU9VTlQpICYgVFlQRV9NQVNLKTsKKyAgeGZlciA9IDA7CisKKyAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIFBST1RPQ09MX0lELCBlcnJvcikpIDwgMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKworICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgdmVyc2lvbiwgZXJyb3IpKSA8IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisKKyAgaWYgKChyZXQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV92YXJpbnQzMiAoY3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChndWludDMyKSBzZXFpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKSA8IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisKKyAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfc3RyaW5nIChwcm90b2NvbCwgbmFtZSwgZXJyb3IpKSA8IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisKKyAgcmV0dXJuIHhmZXI7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgLyogc2F0aXNmeSAtV2FsbCAqLworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHJvdG9jb2wpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gMDsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9zdHJ1Y3RfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKmNwOworICBHUXVldWUgKnE7CisKKyAgLyogc2F0aXNmeSAtV2FsbCAqLworICBUSFJJRlRfVU5VU0VEX1ZBUiAobmFtZSk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBjcCA9IFRIUklGVF9DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCk7CisgIHEgPSAmKGNwLT5fbGFzdF9maWVsZCk7CisKKyAgZ19xdWV1ZV9wdXNoX3RhaWwgKHEsIEdJTlRfVE9fUE9JTlRFUiAoKGdpbnQpIGNwLT5fbGFzdF9maWVsZF9pZCkpOworICBjcC0+X2xhc3RfZmllbGRfaWQgPSAwOworICByZXR1cm4gMDsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9zdHJ1Y3RfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICpjcDsKKyAgR1F1ZXVlICpxOworCisgIC8qIHNhdGlzZnkgLVdhbGwgKi8KKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKworICBjcCA9IFRIUklGVF9DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCk7CisgIHEgPSAmKGNwLT5fbGFzdF9maWVsZCk7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBjcC0+X2xhc3RfZmllbGRfaWQgPSAoZ2ludDE2KSBHUE9JTlRFUl9UT19JTlQgKGdfcXVldWVfcG9wX3RhaWwgKHEpKTsKKyAgcmV0dXJuIDA7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIGZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2ludDE2IGZpZWxkX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKmNwOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgY3AgPSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpOworCisgIGlmIChmaWVsZF90eXBlID09IFRfQk9PTCkgeworICAgIGNwLT5fYm9vbF9maWVsZF9uYW1lID0gbmFtZTsKKyAgICBjcC0+X2Jvb2xfZmllbGRfdHlwZSA9IGZpZWxkX3R5cGU7CisgICAgY3AtPl9ib29sX2ZpZWxkX2lkID0gZmllbGRfaWQ7CisgICAgcmV0dXJuIDA7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luX2ludGVybmFsIChjcCwgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9pZCwgLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7CisgIH0KK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIC8qIHNhdGlzZnkgLVdhbGwgKi8KKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHByb3RvY29sKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKyAgcmV0dXJuIDA7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfc3RvcCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisgIHJldHVybiB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIChnaW50OCkgVF9TVE9QLCBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfbWFwX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdFR5cGUga2V5X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdFR5cGUgdmFsdWVfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2ludDMyIHJldDsKKyAgZ2ludDMyIHhmZXI7CisKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICpjcDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGNwID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKTsKKworICB4ZmVyID0gMDsKKworICBpZiAoKHJldCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3ZhcmludDMyIChjcCwgKGd1aW50MzIpIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkgPCAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHhmZXIgKz0gcmV0OworCisgIGlmIChzaXplID4gMCkgeworICAgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnaW50OCkgKFRUeXBlVG9DVHlwZVtrZXlfdHlwZV0gPDwgNAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVFR5cGVUb0NUeXBlW3ZhbHVlX3R5cGVdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpIDwgMCkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB4ZmVyICs9IHJldDsKKyAgfQorCisgIHJldHVybiB4ZmVyOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX21hcF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHJvdG9jb2wpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gMDsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9saXN0X2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIGVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKmNwOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgY3AgPSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpOworCisgIHJldHVybiB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9jb2xsZWN0aW9uX2JlZ2luIChjcCwgZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2xpc3RfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChwcm90b2NvbCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIHJldHVybiAwOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3NldF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIGVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICpjcDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGNwID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKTsKKworICByZXR1cm4gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfY29sbGVjdGlvbl9iZWdpbiAoY3AsIGVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9zZXRfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHJvdG9jb2wpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gMDsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ib29sIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnYm9vbGVhbiB2YWx1ZSwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdENvbXBhY3RQcm90b2NvbCAqY3A7CisKKyAgZ2ludDMyIHJldDsKKyAgZ2ludDMyIHhmZXI7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBjcCA9IFRIUklGVF9DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCk7CisKKyAgeGZlciA9IDA7CisKKyAgaWYgKGNwLT5fYm9vbF9maWVsZF9uYW1lICE9IE5VTEwpIHsKKyAgICAvKiB3ZSBoYXZlbid0IHdyaXR0ZW4gdGhlIGZpZWxkIGhlYWRlciB5ZXQgKi8KKyAgICBpZiAoKHJldCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luX2ludGVybmFsIChjcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwLT5fYm9vbF9maWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3AtPl9ib29sX2ZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcC0+X2Jvb2xfZmllbGRfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2ludDgpICh2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBDVF9CT09MRUFOX1RSVUUgOiBDVF9CT09MRUFOX0ZBTFNFKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkgPCAwKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHhmZXIgKz0gcmV0OworCisgICAgY3AtPl9ib29sX2ZpZWxkX25hbWUgPSBOVUxMOworICB9IGVsc2UgeworICAgIC8qIHdlJ3JlIG5vdCBwYXJ0IG9mIGEgZmllbGQsIHNvIGp1c3Qgd3JpdGUgdGhlIHZhbHVlICovCisgICAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdpbnQ4KSAodmFsdWUgPyBDVF9CT09MRUFOX1RSVUUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IENUX0JPT0xFQU5fRkFMU0UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkgPCAwKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHhmZXIgKz0gcmV0OworICB9CisgIHJldHVybiB4ZmVyOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2J5dGUgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ2ludDggdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBpZiAodGhyaWZ0X3RyYW5zcG9ydF93cml0ZSAocHJvdG9jb2wtPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBncG9pbnRlcikgJnZhbHVlLCAxLCBlcnJvcikpIHsKKyAgICByZXR1cm4gMTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gLTE7CisgIH0KK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pMTYgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ2ludDE2IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICpjcDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGNwID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKTsKKworICByZXR1cm4gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfdmFyaW50MzIgKGNwLAorICAgICAgICAgICAgICAgICAgICAgICAgIGkzMl90b196aWd6YWcgKChnaW50MzIpIHZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTMyIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdpbnQzMiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdENvbXBhY3RQcm90b2NvbCAqY3A7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBjcCA9IFRIUklGVF9DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3ZhcmludDMyIChjcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpMzJfdG9femlnemFnICh2YWx1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2k2NCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnaW50NjQgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKmNwOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgY3AgPSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpOworCisgIHJldHVybiB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV92YXJpbnQ2NCAoY3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgaTY0X3RvX3ppZ3phZyAodmFsdWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9kb3VibGUgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2RvdWJsZSB2YWx1ZSwgR0Vycm9yICoqZXJyb3IpCit7CisgIGd1aW50NjQgYml0czsKKworICBnX2Fzc2VydCAoc2l6ZW9mIChnZG91YmxlKSA9PSBzaXplb2YgKGd1aW50NjQpKTsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGJpdHMgPSBHVUlOVDY0X1RPX0xFICh0aHJpZnRfYml0d2lzZV9jYXN0X2d1aW50NjQgKHZhbHVlKSk7CisgIGlmICh0aHJpZnRfdHJhbnNwb3J0X3dyaXRlIChwcm90b2NvbC0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGdwb2ludGVyKSAmYml0cywgOCwgZXJyb3IpKSB7CisgICAgcmV0dXJuIDg7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIC0xOworICB9Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfc3RyaW5nIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdjaGFyICpzdHIsIEdFcnJvciAqKmVycm9yKQoreworICBzaXplX3QgbGVuOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgbGVuID0gc3RyICE9IE5VTEwgPyBzdHJsZW4gKHN0cikgOiAwOworICBpZiAobGVuID4gR19NQVhJTlQzMikgeworICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1BST1RPQ09MX0VSUk9SLAorICAgICAgICAgICAgICAgICBUSFJJRlRfUFJPVE9DT0xfRVJST1JfU0laRV9MSU1JVCwKKyAgICAgICAgICAgICAgICAgInN0cmluZyBzaXplIChndWVzczogJWx1KSBpcyB0b28gbGFyZ2UiLCAodW5zaWduZWQgbG9uZykgbGVuKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICAvKiB3cml0ZSB0aGUgc3RyaW5nIGxlbmd0aCArIDEgd2hpY2ggaW5jbHVkZXMgdGhlIG51bGwgdGVybWluYXRvciAqLworICByZXR1cm4gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2JpbmFyeSAocHJvdG9jb2wsIChjb25zdCBncG9pbnRlcikgc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGd1aW50MzIpIGxlbiwgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2JpbmFyeSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBncG9pbnRlciBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICpjcDsKKworICBnaW50MzIgcmV0OworICBnaW50MzIgeGZlcjsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGNwID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKTsKKworICB4ZmVyID0gMDsKKworICBpZiAoKHJldCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3ZhcmludDMyIChjcCwgbGVuLCBlcnJvcikpIDwgMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKworICBpZiAobGVuID4gMCkgeworICAgIC8qIGNoZWNraW5nIGxlbiArIHhmZXIgPiB1aW50X21heCwgYnV0IHdlIGRvbid0IHdhbnQgdG8gb3ZlcmZsb3cgd2hpbGUKKyAgICAgKiBjaGVja2luZyBmb3Igb3ZlcmZsb3dzLiB0cmFuc2Zvcm1pbmcgdG8gbGVuID4gdWludF9tYXggLSB4ZmVyLgorICAgICAqLworICAgIGlmIChsZW4gPiAoZ3VpbnQzMikgKEdfTUFYSU5UMzIgLSB4ZmVyKSkgeworICAgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfUFJPVE9DT0xfRVJST1IsCisgICAgICAgICAgICAgICAgICAgVEhSSUZUX1BST1RPQ09MX0VSUk9SX1NJWkVfTElNSVQsCisgICAgICAgICAgICAgICAgICAgInNpemUgJWQgKyAlZCBpcyB0b28gbGFyZ2UiLCBsZW4sIHhmZXIpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmICh0aHJpZnRfdHJhbnNwb3J0X3dyaXRlIChwcm90b2NvbC0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgZ3BvaW50ZXIpIGJ1ZiwgbGVuLCBlcnJvcikgPT0gRkFMU0UpIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgeGZlciArPSBsZW47CisgIH0KKworICByZXR1cm4geGZlcjsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NoYXIgKipuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRNZXNzYWdlVHlwZSAqbWVzc2FnZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50MzIgKnNlcWlkLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICpjcDsKKworICBnaW50MzIgcmV0OworICBnaW50MzIgeGZlcjsKKworICBnaW50OCBwcm90b2NvbF9pZCwgdmVyc2lvbl9hbmRfdHlwZSwgdmVyc2lvbjsKKworICB4ZmVyID0gMDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGNwID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKTsKKworICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmcHJvdG9jb2xfaWQsIGVycm9yKSkgPCAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHhmZXIgKz0gcmV0OworCisgIGlmIChwcm90b2NvbF9pZCAhPSBQUk9UT0NPTF9JRCkgeworICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1BST1RPQ09MX0VSUk9SLAorICAgICAgICAgICAgICAgICBUSFJJRlRfUFJPVE9DT0xfRVJST1JfQkFEX1ZFUlNJT04sCisgICAgICAgICAgICAgICAgICJiYWQgcHJvdG9jb2wgaWQiKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmdmVyc2lvbl9hbmRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpIDwgMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKworICB2ZXJzaW9uID0gKGdpbnQ4KSh2ZXJzaW9uX2FuZF90eXBlICYgVkVSU0lPTl9NQVNLKTsKKyAgaWYgKHZlcnNpb24gIT0gVkVSU0lPTl9OKSB7CisgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfUFJPVE9DT0xfRVJST1IsCisgICAgICAgICAgICAgICAgIFRIUklGVF9QUk9UT0NPTF9FUlJPUl9CQURfVkVSU0lPTiwKKyAgICAgICAgICAgICAgICAgImJhZCB2ZXJzaW9uIGFuZC9vciB0eXBlIik7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgKm1lc3NhZ2VfdHlwZQorICAgID0gKFRocmlmdE1lc3NhZ2VUeXBlKSgodmVyc2lvbl9hbmRfdHlwZSA+PiBUWVBFX1NISUZUX0FNT1VOVCkgJiBUWVBFX0JJVFMpOworCisgIGlmICgocmV0ID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF92YXJpbnQzMiAoY3AsIHNlcWlkLCBlcnJvcikpIDwgMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKworICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX3N0cmluZyAocHJvdG9jb2wsIG5hbWUsIGVycm9yKSkgPCAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHhmZXIgKz0gcmV0OworCisgIHJldHVybiB4ZmVyOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHJvdG9jb2wpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gMDsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3N0cnVjdF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjaGFyICoqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICpjcDsKKyAgR1F1ZXVlICpxOworCisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBjcCA9IFRIUklGVF9DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCk7CisgIHEgPSAmKGNwLT5fbGFzdF9maWVsZCk7CisKKyAgKm5hbWUgPSBOVUxMOworCisgIGdfcXVldWVfcHVzaF90YWlsIChxLCBHSU5UX1RPX1BPSU5URVIgKChnaW50KSBjcC0+X2xhc3RfZmllbGRfaWQpKTsKKyAgY3AtPl9sYXN0X2ZpZWxkX2lkID0gMDsKKworICByZXR1cm4gMDsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3N0cnVjdF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdENvbXBhY3RQcm90b2NvbCAqY3A7CisgIEdRdWV1ZSAqcTsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgY3AgPSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpOworICBxID0gJihjcC0+X2xhc3RfZmllbGQpOworCisgIGNwLT5fbGFzdF9maWVsZF9pZCA9IChnaW50MTYpIEdQT0lOVEVSX1RPX0lOVCAoZ19xdWV1ZV9wb3BfdGFpbCAocSkpOworCisgIHJldHVybiAwOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjaGFyICoqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFR5cGUgKmZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50MTYgKmZpZWxkX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdENvbXBhY3RQcm90b2NvbCAqY3A7CisKKyAgZ2ludDMyIHJldDsKKyAgZ2ludDMyIHhmZXI7CisKKyAgZ2ludDE2IG1vZGlmaWVyOworICBnaW50OCBieXRlOworICBnaW50OCB0eXBlOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgY3AgPSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpOworCisgIFRIUklGVF9VTlVTRURfVkFSIChuYW1lKTsKKworICB4ZmVyID0gMDsKKworICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmYnl0ZSwgZXJyb3IpKSA8IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisKKyAgdHlwZSA9IChieXRlICYgMHgwZik7CisKKyAgLyogaWYgaXQncyBhIHN0b3AsIHRoZW4gd2UgY2FuIHJldHVybiBpbW1lZGlhdGVseSwgYXMgdGhlIHN0cnVjdCBpcyBvdmVyLiAqLworICBpZiAodHlwZSA9PSBUX1NUT1ApIHsKKyAgICAqZmllbGRfdHlwZSA9IFRfU1RPUDsKKyAgICAqZmllbGRfaWQgPSAwOworICAgIHJldHVybiB4ZmVyOworICB9CisKKyAgLyogbWFzayBvZmYgdGhlIDQgTVNCIG9mIHRoZSB0eXBlIGhlYWRlci4KKyAgICogaXQgY291bGQgY29udGFpbiBhIGZpZWxkIGlkIGRlbHRhLgorICAgKi8KKyAgbW9kaWZpZXIgPSAoZ2ludDE2KSgoKGd1aW50OClieXRlICYgMHhmMCkgPj4gNCk7CisgIGlmIChtb2RpZmllciA9PSAwKSB7CisgICAgLyogbm90IGEgZGVsdGEsIGxvb2sgYWhlYWQgZm9yIHRoZSB6aWd6YWcgdmFyaW50IGZpZWxkIGlkLiAqLworICAgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfaTE2IChwcm90b2NvbCwgZmllbGRfaWQsIGVycm9yKSkgPCAwKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHhmZXIgKz0gcmV0OworICB9IGVsc2UgeworICAgICpmaWVsZF9pZCA9IChnaW50MTYpKGNwLT5fbGFzdF9maWVsZF9pZCArIG1vZGlmaWVyKTsKKyAgfQorICBpZiAoKHJldCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX2dldF90dHlwZSAoY3AsIHR5cGUsIGVycm9yKSkgPCAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgICpmaWVsZF90eXBlID0gcmV0OworCisgIC8qIGlmIHRoaXMgaGFwcGVucyB0byBiZSBhIGJvb2xlYW4gZmllbGQsIHRoZSB2YWx1ZSBpcyBlbmNvZGVkIGluIHRoZSB0eXBlICovCisgIGlmICh0eXBlID09IENUX0JPT0xFQU5fVFJVRSB8fCB0eXBlID09IENUX0JPT0xFQU5fRkFMU0UpIHsKKyAgICAvKiBzYXZlIHRoZSBib29sZWFuIHZhbHVlIGluIGEgc3BlY2lhbCBpbnN0YW5jZSB2YXJpYWJsZS4gKi8KKyAgICBjcC0+X2hhc19ib29sX3ZhbHVlID0gVFJVRTsKKyAgICBjcC0+X2Jvb2xfdmFsdWUgPQorICAgICAgKHR5cGUgPT0gQ1RfQk9PTEVBTl9UUlVFID8gVFJVRSA6IEZBTFNFKTsKKyAgfQorCisgIC8qIHB1c2ggdGhlIG5ldyBmaWVsZCBvbnRvIHRoZSBmaWVsZCBzdGFjayBzbyB3ZSBjYW4ga2VlcCB0aGUgZGVsdGFzIGdvaW5nLiAqLworICBjcC0+X2xhc3RfZmllbGRfaWQgPSAqZmllbGRfaWQ7CisKKyAgcmV0dXJuIHhmZXI7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHByb3RvY29sKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKyAgcmV0dXJuIDA7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9tYXBfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUeXBlICprZXlfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUeXBlICp2YWx1ZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgKnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIGdpbnQzMiByZXQ7CisgIGdpbnQzMiB4ZmVyOworCisgIGdpbnQ4IGt2X3R5cGU7CisgIGdpbnQzMiBtc2l6ZTsKKworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKmNwOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAga3ZfdHlwZSA9IDA7CisgIG1zaXplID0gMDsKKworICBjcCA9IFRIUklGVF9DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCk7CisKKyAgeGZlciA9IDA7CisKKyAgaWYgKChyZXQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3ZhcmludDMyIChjcCwgJm1zaXplLCBlcnJvcikpIDwwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHhmZXIgKz0gcmV0OworCisgIC8qIHN0aWxsIHJlYWQgdGhlIGt2IGJ5dGUgaWYgbmVnYXRpdmUgc2l6ZSAqLworICBpZiAobXNpemUgIT0gMCkgeworICAgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZrdl90eXBlLCBlcnJvcikpIDwgMCkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB4ZmVyICs9IHJldDsKKyAgfQorCisgIGlmIChjcC0+Y29udGFpbmVyX2xpbWl0ID4gMCAmJiBtc2l6ZSA+IGNwLT5jb250YWluZXJfbGltaXQpIHsKKyAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9QUk9UT0NPTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgVEhSSUZUX1BST1RPQ09MX0VSUk9SX1NJWkVfTElNSVQsCisgICAgICAgICAgICAgICAgICJnb3Qgc2l6ZSBvdmVyIGxpbWl0ICglZCA+ICVkKSIsIG1zaXplLCBjcC0+Y29udGFpbmVyX2xpbWl0KTsKKyAgICByZXR1cm4gLTE7CisgIH0gZWxzZSBpZiAobXNpemUgPiAwKSB7CisgICAgaWYgKChyZXQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9nZXRfdHR5cGUgKGNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2ludDgpKChndWludDgpa3ZfdHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+IDQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpIDwgMCkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICAqa2V5X3R5cGUgPSByZXQ7CisgICAgaWYgKChyZXQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9nZXRfdHR5cGUgKGNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2ludDgpKChndWludDgpa3ZfdHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgMHhmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKSA8IDApIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgKnZhbHVlX3R5cGUgPSByZXQ7CisgICAgKnNpemUgPSAoZ3VpbnQzMikgbXNpemU7CisgIH0gZWxzZSBpZiAobXNpemUgPT0gMCkgeworICAgICprZXlfdHlwZSA9IDA7CisgICAgKnZhbHVlX3R5cGUgPSAwOworICAgICpzaXplID0gMDsKKyAgfSBlbHNlIHsKKyAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9QUk9UT0NPTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgVEhSSUZUX1BST1RPQ09MX0VSUk9SX05FR0FUSVZFX1NJWkUsCisgICAgICAgICAgICAgICAgICJnb3QgbmVnYXRpdmUgc2l6ZSBvZiAlZCIsIG1zaXplKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICByZXR1cm4geGZlcjsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX21hcF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChwcm90b2NvbCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIHJldHVybiAwOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfbGlzdF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUeXBlICplbGVtZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgKnNpemUsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKmNwOworCisgIGdpbnQzMiByZXQ7CisgIGdpbnQzMiB4ZmVyOworCisgIGdpbnQ4IHNpemVfYW5kX3R5cGU7CisgIGdpbnQzMiBsc2l6ZTsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGNwID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKTsKKworICBzaXplX2FuZF90eXBlID0gMDsKKworICB4ZmVyID0gMDsKKworICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmc2l6ZV9hbmRfdHlwZSwgZXJyb3IpKSA8IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisKKyAgbHNpemUgPSAoKGd1aW50OClzaXplX2FuZF90eXBlID4+IDQpICYgMHgwZjsKKyAgaWYgKGxzaXplID09IDE1KSB7CisgICAgaWYgKChyZXQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3ZhcmludDMyIChjcCwgJmxzaXplLCBlcnJvcikpIDwgMCkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB4ZmVyICs9IHJldDsKKyAgfQorCisgIGlmIChsc2l6ZSA8IDApIHsKKyAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9QUk9UT0NPTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgVEhSSUZUX1BST1RPQ09MX0VSUk9SX05FR0FUSVZFX1NJWkUsCisgICAgICAgICAgICAgICAgICJnb3QgbmVnYXRpdmUgc2l6ZSBvZiAlZCIsIGxzaXplKTsKKyAgICByZXR1cm4gLTE7CisgIH0gZWxzZSBpZiAoY3AtPmNvbnRhaW5lcl9saW1pdCA+IDAgJiYgbHNpemUgPiBjcC0+Y29udGFpbmVyX2xpbWl0KSB7CisgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfUFJPVE9DT0xfRVJST1IsCisgICAgICAgICAgICAgICAgIFRIUklGVF9QUk9UT0NPTF9FUlJPUl9TSVpFX0xJTUlULAorICAgICAgICAgICAgICAgICAiZ290IHNpemUgb3ZlciBsaW1pdCAoJWQgPiAlZCkiLCBsc2l6ZSwgY3AtPmNvbnRhaW5lcl9saW1pdCk7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgaWYgKChyZXQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9nZXRfdHR5cGUgKGNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdpbnQ4KShzaXplX2FuZF90eXBlICYgMHgwZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpIDwgMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICAqZWxlbWVudF90eXBlID0gcmV0OworICAqc2l6ZSA9IChndWludDMyKSBsc2l6ZTsKKworICByZXR1cm4geGZlcjsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2xpc3RfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHByb3RvY29sKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKyAgcmV0dXJuIDA7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9zZXRfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUeXBlICplbGVtZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiAqc2l6ZSwgR0Vycm9yICoqZXJyb3IpCit7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgcmV0dXJuIHRocmlmdF9wcm90b2NvbF9yZWFkX2xpc3RfYmVnaW4gKHByb3RvY29sLCBlbGVtZW50X3R5cGUsIHNpemUsIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3NldF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChwcm90b2NvbCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIHJldHVybiAwOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYm9vbCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnYm9vbGVhbiAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKmNwOworCisgIGdpbnQzMiByZXQ7CisgIGdpbnQzMiB4ZmVyOworCisgIGdpbnQ4IHZhbDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGNwID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKTsKKworICB4ZmVyID0gMDsKKworICBpZiAoY3AtPl9oYXNfYm9vbF92YWx1ZSA9PSBUUlVFKSB7CisgICAgKnZhbHVlID0gY3AtPl9ib29sX3ZhbHVlOworICAgIGNwLT5faGFzX2Jvb2xfdmFsdWUgPSBGQUxTRTsKKyAgICByZXR1cm4gMDsKKyAgfSBlbHNlIHsKKyAgICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmdmFsLCBlcnJvcikpIDwgMCkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB4ZmVyICs9IHJldDsKKworICAgICp2YWx1ZSA9ICh2YWwgPT0gQ1RfQk9PTEVBTl9UUlVFKTsKKyAgICByZXR1cm4geGZlcjsKKyAgfQorfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYnl0ZSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnaW50OCAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBnaW50MzIgcmV0OworICBncG9pbnRlciBiWzFdOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgaWYgKChyZXQgPQorICAgICAgIHRocmlmdF90cmFuc3BvcnRfcmVhZF9hbGwgKHByb3RvY29sLT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYiwgMSwgZXJyb3IpKSA8IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgKnZhbHVlID0gKihnaW50OCAqKSBiOworICByZXR1cm4gcmV0OworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfaTE2IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdpbnQxNiAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdENvbXBhY3RQcm90b2NvbCAqY3A7CisKKyAgZ2ludDMyIHJldDsKKyAgZ2ludDMyIHZhbDsKKyAgZ2ludDMyIHhmZXI7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBjcCA9IFRIUklGVF9DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCk7CisKKyAgeGZlciA9IDA7CisKKyAgaWYgKChyZXQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3ZhcmludDMyIChjcCwgJnZhbCwgZXJyb3IpKSA8IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisKKyAgKnZhbHVlID0gKGdpbnQxNikgemlnemFnX3RvX2kzMiAoKGd1aW50MzIpIHZhbCk7CisKKyAgcmV0dXJuIHhmZXI7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9pMzIgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2ludDMyICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICpjcDsKKworICBnaW50MzIgcmV0OworICBnaW50MzIgdmFsOworICBnaW50MzIgeGZlcjsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGNwID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKTsKKworICB4ZmVyID0gMDsKKworICBpZiAoKHJldCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfdmFyaW50MzIgKGNwLCAmdmFsLCBlcnJvcikpIDwgMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKworICAqdmFsdWUgPSB6aWd6YWdfdG9faTMyICgoZ3VpbnQzMikgdmFsKTsKKworICByZXR1cm4geGZlcjsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2k2NCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnaW50NjQgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKmNwOworCisgIGdpbnQzMiByZXQ7CisgIGdpbnQ2NCB2YWw7CisgIGdpbnQzMiB4ZmVyOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgY3AgPSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpOworCisgIHhmZXIgPSAwOworCisgIGlmICgocmV0ID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF92YXJpbnQ2NCAoY3AsICZ2YWwsIGVycm9yKSkgPCAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHhmZXIgKz0gcmV0OworCisgICp2YWx1ZSA9IHppZ3phZ190b19pNjQgKChndWludDY0KSB2YWwpOworCisgIHJldHVybiB4ZmVyOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZG91YmxlIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2RvdWJsZSAqdmFsdWUsIEdFcnJvciAqKmVycm9yKQoreworICBnaW50MzIgcmV0OworICB1bmlvbiB7CisgICAgZ3VpbnQ2NCBiaXRzOworICAgIGd1aW50OCBiWzhdOworICB9IHU7CisKKyAgZ19hc3NlcnQgKHNpemVvZiAoZ2RvdWJsZSkgPT0gc2l6ZW9mIChndWludDY0KSk7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBpZiAoKHJldCA9CisgICAgICAgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2FsbCAocHJvdG9jb2wtPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1LmIsIDgsIGVycm9yKSkgPCAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHUuYml0cyA9IEdVSU5UNjRfRlJPTV9MRSAodS5iaXRzKTsKKyAgKnZhbHVlID0gdGhyaWZ0X2JpdHdpc2VfY2FzdF9nZG91YmxlICh1LmJpdHMpOworICByZXR1cm4gcmV0OworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfc3RyaW5nIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NoYXIgKipzdHIsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKmNwOworCisgIGdpbnQzMiByZXQ7CisgIGdpbnQzMiB4ZmVyOworCisgIGdpbnQzMiByZWFkX2xlbjsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGNwID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKTsKKworICB4ZmVyID0gMDsKKyAgcmVhZF9sZW4gPSAwOworCisgIC8qIHJlYWQgdGhlIGxlbmd0aCBpbnRvIHJlYWRfbGVuICovCisgIGlmICgocmV0ID0KKyAgICAgICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3ZhcmludDMyIChjcCwgJnJlYWRfbGVuLCBlcnJvcikpIDwgMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKworICBpZiAoY3AtPnN0cmluZ19saW1pdCA+IDAgJiYgcmVhZF9sZW4gPiBjcC0+c3RyaW5nX2xpbWl0KSB7CisgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfUFJPVE9DT0xfRVJST1IsCisgICAgICAgICAgICAgICAgIFRIUklGVF9QUk9UT0NPTF9FUlJPUl9TSVpFX0xJTUlULAorICAgICAgICAgICAgICAgICAiZ290IHNpemUgb3ZlciBsaW1pdCAoJWQgPiAlZCkiLCByZWFkX2xlbiwgY3AtPnN0cmluZ19saW1pdCk7CisgICAgKnN0ciA9IE5VTEw7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgaWYgKHJlYWRfbGVuIDwgMCkgeworICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1BST1RPQ09MX0VSUk9SLAorICAgICAgICAgICAgICAgICBUSFJJRlRfUFJPVE9DT0xfRVJST1JfTkVHQVRJVkVfU0laRSwKKyAgICAgICAgICAgICAgICAgImdvdCBuZWdhdGl2ZSBzaXplIG9mICVkIiwgcmVhZF9sZW4pOworICAgICpzdHIgPSBOVUxMOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIC8qIGFsbG9jYXRlIHRoZSBtZW1vcnkgYXMgYW4gYXJyYXkgb2YgdW5zaWduZWQgY2hhciBmb3IgYmluYXJ5IGRhdGEgKi8KKyAgKnN0ciA9IGdfbmV3MCAoZ2NoYXIsIHJlYWRfbGVuICsgMSk7CisgIGlmIChyZWFkX2xlbiA+IDApIHsKKyAgICBpZiAoKHJldCA9CisgICAgICAgICB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfYWxsIChwcm90b2NvbC0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnN0ciwgcmVhZF9sZW4sIGVycm9yKSkgPCAwKSB7CisgICAgICBnX2ZyZWUgKCpzdHIpOworICAgICAgKnN0ciA9IE5VTEw7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHhmZXIgKz0gcmV0OworICB9IGVsc2UgeworICAgICoqc3RyID0gMDsKKyAgfQorCisgIHJldHVybiB4ZmVyOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYmluYXJ5IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3BvaW50ZXIgKmJ1ZiwgZ3VpbnQzMiAqbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKmNwOworCisgIGdpbnQzMiByZXQ7CisgIGdpbnQzMiB4ZmVyOworCisgIGdpbnQzMiByZWFkX2xlbjsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGNwID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKTsKKworICB4ZmVyID0gMDsKKyAgcmVhZF9sZW4gPSAwOworCisgIC8qIHJlYWQgdGhlIGxlbmd0aCBpbnRvIHJlYWRfbGVuICovCisgIGlmICgocmV0ID0KKyAgICAgICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3ZhcmludDMyIChjcCwgJnJlYWRfbGVuLCBlcnJvcikpIDwgMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKworICBpZiAoY3AtPnN0cmluZ19saW1pdCA+IDAgJiYgcmVhZF9sZW4gPiBjcC0+c3RyaW5nX2xpbWl0KSB7CisgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfUFJPVE9DT0xfRVJST1IsCisgICAgICAgICAgICAgICAgIFRIUklGVF9QUk9UT0NPTF9FUlJPUl9TSVpFX0xJTUlULAorICAgICAgICAgICAgICAgICAiZ290IHNpemUgb3ZlciBsaW1pdCAoJWQgPiAlZCkiLCByZWFkX2xlbiwgY3AtPnN0cmluZ19saW1pdCk7CisgICAgKmJ1ZiA9IE5VTEw7CisgICAgKmxlbiA9IDA7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgaWYgKHJlYWRfbGVuID4gMCkgeworICAgIC8qIGFsbG9jYXRlIHRoZSBtZW1vcnkgYXMgYW4gYXJyYXkgb2YgdW5zaWduZWQgY2hhciBmb3IgYmluYXJ5IGRhdGEgKi8KKyAgICAqbGVuID0gKGd1aW50MzIpIHJlYWRfbGVuOworICAgICpidWYgPSBnX25ldyAoZ3VjaGFyLCAqbGVuKTsKKyAgICBpZiAoKHJldCA9CisgICAgICAgICB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfYWxsIChwcm90b2NvbC0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZiwgKmxlbiwgZXJyb3IpKSA8IDApIHsKKyAgICAgIGdfZnJlZSAoKmJ1Zik7CisgICAgICAqYnVmID0gTlVMTDsKKyAgICAgICpsZW4gPSAwOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB4ZmVyICs9IHJldDsKKworICB9IGVsc2UgaWYgKHJlYWRfbGVuID09IDApIHsKKyAgICAqbGVuID0gKGd1aW50MzIpIHJlYWRfbGVuOworICAgICpidWYgPSBOVUxMOworCisgIH0gZWxzZSB7CisgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfUFJPVE9DT0xfRVJST1IsCisgICAgICAgICAgICAgICAgIFRIUklGVF9QUk9UT0NPTF9FUlJPUl9ORUdBVElWRV9TSVpFLAorICAgICAgICAgICAgICAgICAiZ290IG5lZ2F0aXZlIHNpemUgb2YgJWQiLCByZWFkX2xlbik7CisgICAgKmJ1ZiA9IE5VTEw7CisgICAgKmxlbiA9IDA7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgcmV0dXJuIHhmZXI7Cit9CisKKy8qIHByb3BlcnR5IGFjY2Vzc29yICovCit2b2lkCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9nZXRfcHJvcGVydHkgKEdPYmplY3QgKm9iamVjdCwgZ3VpbnQgcHJvcGVydHlfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdWYWx1ZSAqdmFsdWUsIEdQYXJhbVNwZWMgKnBzcGVjKQoreworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKnRjOworCisgIFRIUklGVF9VTlVTRURfVkFSIChwc3BlYyk7CisKKyAgdGMgPSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTCAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BlcnR5X2lkKSB7CisgICAgY2FzZSBQUk9QX1RIUklGVF9DT01QQUNUX1BST1RPQ09MX1NUUklOR19MSU1JVDoKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIHRjLT5zdHJpbmdfbGltaXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUklGVF9DT01QQUNUX1BST1RPQ09MX0NPTlRBSU5FUl9MSU1JVDoKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIHRjLT5jb250YWluZXJfbGltaXQpOworICAgICAgYnJlYWs7CisgIH0KK30KKworLyogcHJvcGVydHkgbXV0YXRvciAqLwordm9pZAordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICpvYmplY3QsIGd1aW50IHByb3BlcnR5X2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHVmFsdWUgKnZhbHVlLCBHUGFyYW1TcGVjICpwc3BlYykKK3sKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICp0YzsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHNwZWMpOworCisgIHRjID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0wgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wZXJ0eV9pZCkgeworICAgIGNhc2UgUFJPUF9USFJJRlRfQ09NUEFDVF9QUk9UT0NPTF9TVFJJTkdfTElNSVQ6CisgICAgICB0Yy0+c3RyaW5nX2xpbWl0ID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0xfQ09OVEFJTkVSX0xJTUlUOgorICAgICAgdGMtPmNvbnRhaW5lcl9saW1pdCA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgIH0KK30KKworLyogaW5pdGlhbGl6ZSB0aGUgY2xhc3MgKi8KK3N0YXRpYyB2b2lkCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9jbGFzc19pbml0IChUaHJpZnRDb21wYWN0UHJvdG9jb2xDbGFzcyAqa2xhc3MpCit7CisgIFRocmlmdFByb3RvY29sQ2xhc3MgKmNsczsKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHUGFyYW1TcGVjICpwYXJhbV9zcGVjOworCisgIGNscyA9IFRIUklGVF9QUk9UT0NPTF9DTEFTUyAoa2xhc3MpOworICBnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKTsKKyAgcGFyYW1fc3BlYyA9IE5VTEw7CisKKyAgLyogc2V0dXAgYWNjZXNzb3JzIGFuZCBtdXRhdG9ycyAqLworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9nZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3NldF9wcm9wZXJ0eTsKKworICBwYXJhbV9zcGVjID0gZ19wYXJhbV9zcGVjX2ludCAoInN0cmluZ19saW1pdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWF4IGFsbG93ZWQgc3RyaW5nIHNpemUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNldCB0aGUgbWF4IHN0cmluZyBsaW1pdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKiBtaW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfTUFYSU5UMzIsIC8qIG1heCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyogZGVmYXVsdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9DT05TVFJVQ1RfT05MWSB8IEdfUEFSQU1fUkVBRFdSSVRFKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPUF9USFJJRlRfQ09NUEFDVF9QUk9UT0NPTF9TVFJJTkdfTElNSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtX3NwZWMpOworCisgIHBhcmFtX3NwZWMgPSBnX3BhcmFtX3NwZWNfaW50ICgiY29udGFpbmVyX2xpbWl0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNYXggYWxsb3dlZCBjb250YWluZXIgc2l6ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2V0IHRoZSBtYXggY29udGFpbmVyIGxpbWl0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qIG1pbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19NQVhJTlQzMiwgLyogbWF4ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKiBkZWZhdWx0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX0NPTlNUUlVDVF9PTkxZIHwgR19QQVJBTV9SRUFEV1JJVEUpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9QX1RIUklGVF9DT01QQUNUX1BST1RPQ09MX0NPTlRBSU5FUl9MSU1JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1fc3BlYyk7CisKKyAgY2xzLT53cml0ZV9tZXNzYWdlX2JlZ2luID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbjsKKyAgY2xzLT53cml0ZV9tZXNzYWdlX2VuZCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfZW5kOworICBjbHMtPndyaXRlX3N0cnVjdF9iZWdpbiA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9iZWdpbjsKKyAgY2xzLT53cml0ZV9zdHJ1Y3RfZW5kID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfc3RydWN0X2VuZDsKKyAgY2xzLT53cml0ZV9maWVsZF9iZWdpbiA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luOworICBjbHMtPndyaXRlX2ZpZWxkX2VuZCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2VuZDsKKyAgY2xzLT53cml0ZV9maWVsZF9zdG9wID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfc3RvcDsKKyAgY2xzLT53cml0ZV9tYXBfYmVnaW4gPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9tYXBfYmVnaW47CisgIGNscy0+d3JpdGVfbWFwX2VuZCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX21hcF9lbmQ7CisgIGNscy0+d3JpdGVfbGlzdF9iZWdpbiA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2xpc3RfYmVnaW47CisgIGNscy0+d3JpdGVfbGlzdF9lbmQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9saXN0X2VuZDsKKyAgY2xzLT53cml0ZV9zZXRfYmVnaW4gPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9zZXRfYmVnaW47CisgIGNscy0+d3JpdGVfc2V0X2VuZCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3NldF9lbmQ7CisgIGNscy0+d3JpdGVfYm9vbCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2Jvb2w7CisgIGNscy0+d3JpdGVfYnl0ZSA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2J5dGU7CisgIGNscy0+d3JpdGVfaTE2ID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTE2OworICBjbHMtPndyaXRlX2kzMiA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2kzMjsKKyAgY2xzLT53cml0ZV9pNjQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pNjQ7CisgIGNscy0+d3JpdGVfZG91YmxlID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZG91YmxlOworICBjbHMtPndyaXRlX3N0cmluZyA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3N0cmluZzsKKyAgY2xzLT53cml0ZV9iaW5hcnkgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9iaW5hcnk7CisgIGNscy0+cmVhZF9tZXNzYWdlX2JlZ2luID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luOworICBjbHMtPnJlYWRfbWVzc2FnZV9lbmQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfZW5kOworICBjbHMtPnJlYWRfc3RydWN0X2JlZ2luID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfYmVnaW47CisgIGNscy0+cmVhZF9zdHJ1Y3RfZW5kID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfZW5kOworICBjbHMtPnJlYWRfZmllbGRfYmVnaW4gPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luOworICBjbHMtPnJlYWRfZmllbGRfZW5kID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9lbmQ7CisgIGNscy0+cmVhZF9tYXBfYmVnaW4gPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX21hcF9iZWdpbjsKKyAgY2xzLT5yZWFkX21hcF9lbmQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX21hcF9lbmQ7CisgIGNscy0+cmVhZF9saXN0X2JlZ2luID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9saXN0X2JlZ2luOworICBjbHMtPnJlYWRfbGlzdF9lbmQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2xpc3RfZW5kOworICBjbHMtPnJlYWRfc2V0X2JlZ2luID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9zZXRfYmVnaW47CisgIGNscy0+cmVhZF9zZXRfZW5kID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9zZXRfZW5kOworICBjbHMtPnJlYWRfYm9vbCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYm9vbDsKKyAgY2xzLT5yZWFkX2J5dGUgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2J5dGU7CisgIGNscy0+cmVhZF9pMTYgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2kxNjsKKyAgY2xzLT5yZWFkX2kzMiA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfaTMyOworICBjbHMtPnJlYWRfaTY0ID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9pNjQ7CisgIGNscy0+cmVhZF9kb3VibGUgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2RvdWJsZTsKKyAgY2xzLT5yZWFkX3N0cmluZyA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfc3RyaW5nOworICBjbHMtPnJlYWRfYmluYXJ5ID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9iaW5hcnk7Cit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9pbml0IChUaHJpZnRDb21wYWN0UHJvdG9jb2wgKnNlbGYpCit7CisgIGdfcXVldWVfaW5pdCAoJihzZWxmLT5fbGFzdF9maWVsZCkpOworfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfY29tcGFjdF9wcm90b2NvbC5oIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfY29tcGFjdF9wcm90b2NvbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmZmNhYWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9jb21wYWN0X3Byb3RvY29sLmgKQEAgLTAsMCArMSwxMDcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0xfSAorI2RlZmluZSBfVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0xfSAorCisjaW5jbHVkZSA8Z2xpYi5oPgorI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaD4KKworR19CRUdJTl9ERUNMUworCisvKiEgXGZpbGUgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2wuaAorICogIFxicmllZiBDb21wYWN0IHByb3RvY29sIGltcGxlbWVudGF0aW9uIG9mIGEgVGhyaWZ0IHByb3RvY29sLiAgSW1wbGVtZW50cyB0aGUKKyAqICAgICAgICAgVGhyaWZ0UHJvdG9jb2wgaW50ZXJmYWNlLgorICovCisKKy8qIHR5cGUgbWFjcm9zICovCisjZGVmaW5lIFRIUklGVF9UWVBFX0NPTVBBQ1RfUFJPVE9DT0wgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX2dldF90eXBlICgpKQorI2RlZmluZSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTChvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgVEhSSUZUX1RZUEVfQ09NUEFDVF9QUk9UT0NPTCwgXAorICAgVGhyaWZ0Q29tcGFjdFByb3RvY29sKSkKKyNkZWZpbmUgVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIFRIUklGVF9UWVBFX0NPTVBBQ1RfUFJPVE9DT0wpKQorI2RlZmluZSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTF9DTEFTUyhjKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCBUSFJJRlRfVFlQRV9DT01QQUNUX1BST1RPQ09MLCBcCisgICBUaHJpZnRDb21wYWN0UHJvdG9jb2xDbGFzcykpCisjZGVmaW5lIFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MX0NMQVNTKGMpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksIFRIUklGVF9UWVBFX0NPTVBBQ1RfUFJPVE9DT0wpKQorI2RlZmluZSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTF9HRVRfQ0xBU1Mob2JqKSBcCisgIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgVEhSSUZUX1RZUEVfQ09NUEFDVF9QUk9UT0NPTCwgXAorICAgVGhyaWZ0Q29tcGFjdFByb3RvY29sQ2xhc3MpKQorCisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRDb21wYWN0UHJvdG9jb2wgVGhyaWZ0Q29tcGFjdFByb3RvY29sOworCisvKiEKKyAqIFRocmlmdCBDb21wYWN0IFByb3RvY29sIGluc3RhbmNlLgorICovCitzdHJ1Y3QgX1RocmlmdENvbXBhY3RQcm90b2NvbAoreworICBUaHJpZnRQcm90b2NvbCBwYXJlbnQ7CisKKyAgLyogcHJvdGVjdGVkICovCisgIGdpbnQzMiBzdHJpbmdfbGltaXQ7CisgIGdpbnQzMiBjb250YWluZXJfbGltaXQ7CisKKyAgLyogcHJpdmF0ZSAqLworCisgIC8qKgorICAgKiAoV3JpdGluZykgSWYgd2UgZW5jb3VudGVyIGEgYm9vbGVhbiBmaWVsZCBiZWdpbiwgc2F2ZSB0aGUgVEZpZWxkIGhlcmUKKyAgICogc28gaXQgY2FuIGhhdmUgdGhlIHZhbHVlIGluY29ycG9yYXRlZC4KKyAgICovCisgIGNvbnN0IGdjaGFyKiBfYm9vbF9maWVsZF9uYW1lOworICBUaHJpZnRUeXBlIF9ib29sX2ZpZWxkX3R5cGU7CisgIGdpbnQxNiBfYm9vbF9maWVsZF9pZDsKKworICAvKioKKyAgICogKFJlYWRpbmcpIElmIHdlIHJlYWQgYSBmaWVsZCBoZWFkZXIsIGFuZCBpdCdzIGEgYm9vbGVhbiBmaWVsZCwgc2F2ZQorICAgKiB0aGUgYm9vbGVhbiB2YWx1ZSBoZXJlIHNvIHRoYXQgcmVhZF9ib29sIGNhbiB1c2UgaXQuCisgICAqLworICBnYm9vbGVhbiBfaGFzX2Jvb2xfdmFsdWU7CisgIGdib29sZWFuIF9ib29sX3ZhbHVlOworCisgIC8qKgorICAgKiBVc2VkIHRvIGtlZXAgdHJhY2sgb2YgdGhlIGxhc3QgZmllbGQgZm9yIHRoZSBjdXJyZW50IGFuZCBwcmV2aW91cyBzdHJ1Y3RzLAorICAgKiBzbyB3ZSBjYW4gZG8gdGhlIGRlbHRhIHN0dWZmLgorICAgKi8KKworICBHUXVldWUgX2xhc3RfZmllbGQ7CisgIGdpbnQxNiBfbGFzdF9maWVsZF9pZDsKK307CisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRDb21wYWN0UHJvdG9jb2xDbGFzcyBUaHJpZnRDb21wYWN0UHJvdG9jb2xDbGFzczsKKworLyohCisgKiBUaHJpZnQgQ29tcGFjdCBQcm90b2NvbCBjbGFzcy4KKyAqLworc3RydWN0IF9UaHJpZnRDb21wYWN0UHJvdG9jb2xDbGFzcworeworICBUaHJpZnRQcm90b2NvbENsYXNzIHBhcmVudDsKK307CisKKy8qIHVzZWQgYnkgVEhSSUZUX1RZUEVfQ09NUEFDVF9QUk9UT0NPTCAqLworR1R5cGUgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX1RIUklGVF9DT01QQUNUX1BST1RPQ09MX0ggKi8KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZmFjdG9yeS5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfY29tcGFjdF9wcm90b2NvbF9mYWN0b3J5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTcyNWUxZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZmFjdG9yeS5jCkBAIC0wLDAgKzEsMTQwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9jb21wYWN0X3Byb3RvY29sX2ZhY3RvcnkuaD4KKworLyogb2JqZWN0IHByb3BlcnRpZXMgKi8KK2VudW0gX1RocmlmdENvbXBhY3RQcm90b2NvbEZhY3RvcnlQcm9wZXJ0aWVzCit7CisgICAgUFJPUF8wLAorICAgIFBST1BfVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0xfRkFDVE9SWV9TVFJJTkdfTElNSVQsCisgICAgUFJPUF9USFJJRlRfQ09NUEFDVF9QUk9UT0NPTF9GQUNUT1JZX0NPTlRBSU5FUl9MSU1JVAorfTsKKworR19ERUZJTkVfVFlQRSAoVGhyaWZ0Q29tcGFjdFByb3RvY29sRmFjdG9yeSwgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZmFjdG9yeSwKKyAgICAgICAgICAgICAgIFRIUklGVF9UWVBFX1BST1RPQ09MX0ZBQ1RPUlkpCisKK1RocmlmdFByb3RvY29sICoKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX2ZhY3RvcnlfZ2V0X3Byb3RvY29sIChUaHJpZnRQcm90b2NvbEZhY3RvcnkgKmZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQpCit7CisgIFRocmlmdENvbXBhY3RQcm90b2NvbEZhY3RvcnkgKnRjZjsKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICp0YzsKKworICB0Y2YgPSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTF9GQUNUT1JZIChmYWN0b3J5KTsKKworICB0YyA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQ09NUEFDVF9QUk9UT0NPTCwKKyAgICAgICAgICAgICAgICAgICAgICJ0cmFuc3BvcnQiLCB0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAic3RyaW5nX2xpbWl0IiwgdGNmLT5zdHJpbmdfbGltaXQsCisgICAgICAgICAgICAgICAgICAgICAiY29udGFpbmVyX2xpbWl0IiwgdGNmLT5jb250YWluZXJfbGltaXQsCisgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MICh0Yyk7Cit9CisKKy8qIHByb3BlcnR5IGFjY2Vzc29yICovCit2b2lkCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9mYWN0b3J5X2dldF9wcm9wZXJ0eSAoR09iamVjdCAqb2JqZWN0LCBndWludCBwcm9wZXJ0eV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHVmFsdWUgKnZhbHVlLCBHUGFyYW1TcGVjICpwc3BlYykKK3sKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sRmFjdG9yeSAqdGNmOworCisgIFRIUklGVF9VTlVTRURfVkFSIChwc3BlYyk7CisKKyAgdGNmID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0xfRkFDVE9SWSAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BlcnR5X2lkKSB7CisgICAgY2FzZSBQUk9QX1RIUklGVF9DT01QQUNUX1BST1RPQ09MX0ZBQ1RPUllfU1RSSU5HX0xJTUlUOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgdGNmLT5zdHJpbmdfbGltaXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUklGVF9DT01QQUNUX1BST1RPQ09MX0ZBQ1RPUllfQ09OVEFJTkVSX0xJTUlUOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgdGNmLT5jb250YWluZXJfbGltaXQpOworICAgICAgYnJlYWs7CisgIH0KK30KKworLyogcHJvcGVydHkgbXV0YXRvciAqLwordm9pZAordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZmFjdG9yeV9zZXRfcHJvcGVydHkgKEdPYmplY3QgKm9iamVjdCwgZ3VpbnQgcHJvcGVydHlfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR1ZhbHVlICp2YWx1ZSwgR1BhcmFtU3BlYworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBzcGVjKQoreworICBUaHJpZnRDb21wYWN0UHJvdG9jb2xGYWN0b3J5ICp0Y2Y7CisKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHBzcGVjKTsKKworICB0Y2YgPSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTF9GQUNUT1JZIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcGVydHlfaWQpIHsKKyAgICBjYXNlIFBST1BfVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0xfRkFDVE9SWV9TVFJJTkdfTElNSVQ6CisgICAgICB0Y2YtPnN0cmluZ19saW1pdCA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUklGVF9DT01QQUNUX1BST1RPQ09MX0ZBQ1RPUllfQ09OVEFJTkVSX0xJTUlUOgorICAgICAgdGNmLT5jb250YWluZXJfbGltaXQgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9mYWN0b3J5X2NsYXNzX2luaXQgKFRocmlmdENvbXBhY3RQcm90b2NvbEZhY3RvcnlDbGFzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICprbGFzcykKK3sKKyAgVGhyaWZ0UHJvdG9jb2xGYWN0b3J5Q2xhc3MgKmNsczsKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHUGFyYW1TcGVjICpwYXJhbV9zcGVjOworCisgIGNscyA9IFRIUklGVF9QUk9UT0NPTF9GQUNUT1JZX0NMQVNTIChrbGFzcyk7CisgIGdvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoa2xhc3MpOworICBwYXJhbV9zcGVjID0gTlVMTDsKKworICAvKiBzZXR1cCBhY2Nlc3NvcnMgYW5kIG11dGF0b3JzICovCisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX2ZhY3RvcnlfZ2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9mYWN0b3J5X3NldF9wcm9wZXJ0eTsKKworICBwYXJhbV9zcGVjID0gZ19wYXJhbV9zcGVjX2ludCAoInN0cmluZ19saW1pdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWF4IGFsbG93ZWQgc3RyaW5nIHNpemUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNldCB0aGUgbWF4IHN0cmluZyBsaW1pdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKiBtaW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfTUFYSU5UMzIsIC8qIG1heCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyogZGVmYXVsdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9DT05TVFJVQ1RfT05MWSB8IEdfUEFSQU1fUkVBRFdSSVRFKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPUF9USFJJRlRfQ09NUEFDVF9QUk9UT0NPTF9GQUNUT1JZX1NUUklOR19MSU1JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1fc3BlYyk7CisKKyAgcGFyYW1fc3BlYyA9IGdfcGFyYW1fc3BlY19pbnQgKCJjb250YWluZXJfbGltaXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1heCBhbGxvd2VkIGNvbnRhaW5lciBzaXplIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZXQgdGhlIG1heCBjb250YWluZXIgbGltaXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyogbWluICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX01BWElOVDMyLCAvKiBtYXggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qIGRlZmF1bHQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fQ09OU1RSVUNUX09OTFkgfCBHX1BBUkFNX1JFQURXUklURSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgUFJPUF9USFJJRlRfQ09NUEFDVF9QUk9UT0NPTF9GQUNUT1JZX0NPTlRBSU5FUl9MSU1JVCwgcGFyYW1fc3BlYyk7CisKKyAgY2xzLT5nZXRfcHJvdG9jb2wgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9mYWN0b3J5X2dldF9wcm90b2NvbDsKK30KKworc3RhdGljIHZvaWQKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX2ZhY3RvcnlfaW5pdCAoVGhyaWZ0Q29tcGFjdFByb3RvY29sRmFjdG9yeSAqZmFjdG9yeSkKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGZhY3RvcnkpOworfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfY29tcGFjdF9wcm90b2NvbF9mYWN0b3J5LmggYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9jb21wYWN0X3Byb3RvY29sX2ZhY3RvcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmY5NTNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfY29tcGFjdF9wcm90b2NvbF9mYWN0b3J5LmgKQEAgLTAsMCArMSw3MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfQ09NUEFDVF9QUk9UT0NPTF9GQUNUT1JZX0gKKyNkZWZpbmUgX1RIUklGVF9DT01QQUNUX1BST1RPQ09MX0ZBQ1RPUllfSAorCisjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2ZhY3RvcnkuaD4KKworR19CRUdJTl9ERUNMUworCisvKiB0eXBlIG1hY3JvcyAqLworI2RlZmluZSBUSFJJRlRfVFlQRV9DT01QQUNUX1BST1RPQ09MX0ZBQ1RPUlkgXAorICAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZmFjdG9yeV9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0xfRkFDVE9SWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgVEhSSUZUX1RZUEVfQ09NUEFDVF9QUk9UT0NPTF9GQUNUT1JZLCBcCisgICBUaHJpZnRDb21wYWN0UHJvdG9jb2xGYWN0b3J5KSkKKyNkZWZpbmUgVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0xfRkFDVE9SWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgVEhSSUZUX1RZUEVfQ09NUEFDVF9QUk9UT0NPTF9GQUNUT1JZKSkKKyNkZWZpbmUgVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0xfRkFDVE9SWV9DTEFTUyhjKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCBUSFJJRlRfVFlQRV9DT01QQUNUX1BST1RPQ09MX0ZBQ1RPUlksIFwKKyAgIFRocmlmdENvbXBhY3RQcm90b2NvbEZhY3RvcnlDbGFzcykpCisjZGVmaW5lIFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MX0ZBQ1RPUllfQ0xBU1MoYykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgVEhSSUZUX1RZUEVfQ09NUEFDVF9QUk9UT0NPTF9GQUNUT1JZKSkKKyNkZWZpbmUgVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0xfRkFDVE9SWV9HRVRfQ0xBU1Mob2JqKSBcCisgIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgVEhSSUZUX1RZUEVfQ09NUEFDVF9QUk9UT0NPTF9GQUNUT1JZLCBcCisgICBUaHJpZnRDb21wYWN0UHJvdG9jb2xGYWN0b3J5Q2xhc3MpKQorCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0Q29tcGFjdFByb3RvY29sRmFjdG9yeSBUaHJpZnRDb21wYWN0UHJvdG9jb2xGYWN0b3J5OworCitzdHJ1Y3QgX1RocmlmdENvbXBhY3RQcm90b2NvbEZhY3RvcnkKK3sKKyAgVGhyaWZ0UHJvdG9jb2xGYWN0b3J5IHBhcmVudDsKKworICAvKiBwcm90ZWN0ZWQgKi8KKyAgZ2ludDMyIHN0cmluZ19saW1pdDsKKyAgZ2ludDMyIGNvbnRhaW5lcl9saW1pdDsKK307CisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRDb21wYWN0UHJvdG9jb2xGYWN0b3J5Q2xhc3MKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sRmFjdG9yeUNsYXNzOworCitzdHJ1Y3QgX1RocmlmdENvbXBhY3RQcm90b2NvbEZhY3RvcnlDbGFzcworeworICBUaHJpZnRQcm90b2NvbEZhY3RvcnlDbGFzcyBwYXJlbnQ7Cit9OworCisvKiB1c2VkIGJ5IFRIUklGVF9UWVBFX0NPTVBBQ1RfUFJPVE9DT0xfRkFDVE9SWSAqLworR1R5cGUgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZmFjdG9yeV9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0xfRkFDVE9SWV9IICovCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbC5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjdmNGE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2wuYwpAQCAtMCwwICsxLDE1OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxnbGliLmg+CisjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3IuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbC5oPgorCisKK2VudW0KK3sKKyAgUFJPUF9USFJJRlRfTVVMVElQTEVYRURfUFJPVE9DT0xfU0VSVklDRV9OQU1FID0gMSwKKyAgUFJPUF9USFJJRlRfTVVMVElQTEVYRURfUFJPVE9DT0xfRU5ECit9OworCitHX0RFRklORV9UWVBFKFRocmlmdE11bHRpcGxleGVkUHJvdG9jb2wsIHRocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbCwgVEhSSUZUX1RZUEVfUFJPVE9DT0xfREVDT1JBVE9SKQorCisKK3N0YXRpYyBHUGFyYW1TcGVjICp0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2xfb2JqX3Byb3BlcnRpZXNbUFJPUF9USFJJRlRfTVVMVElQTEVYRURfUFJPVE9DT0xfRU5EXSA9IHsgTlVMTCwgfTsKKworZ2ludDMyCit0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbiAoVGhyaWZ0TXVsdGlwbGV4ZWRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgY29uc3QgZ2NoYXIgKm5hbWUsIGNvbnN0IFRocmlmdE1lc3NhZ2VUeXBlIG1lc3NhZ2VfdHlwZSwKKyAgICBjb25zdCBnaW50MzIgc2VxaWQsIEdFcnJvciAqKmVycm9yKQoreworICBnaW50MzIgcmV0OworICBnY2hhciAqc2VydmljZV9uYW1lID0gTlVMTDsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19NVUxUSVBMRVhFRF9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgVGhyaWZ0TXVsdGlwbGV4ZWRQcm90b2NvbCAqc2VsZiA9IFRIUklGVF9NVUxUSVBMRVhFRF9QUk9UT0NPTCAocHJvdG9jb2wpOworICBUaHJpZnRNdWx0aXBsZXhlZFByb3RvY29sQ2xhc3MgKm11bHRpcGxleENsYXNzID0gVEhSSUZUX01VTFRJUExFWEVEX1BST1RPQ09MX0dFVF9DTEFTUyhzZWxmKTsKKworICBpZiggKG1lc3NhZ2VfdHlwZSA9PSBUX0NBTEwgfHwgbWVzc2FnZV90eXBlID09IFRfT05FV0FZKSAmJiBzZWxmLT5zZXJ2aWNlX25hbWUgIT0gTlVMTCkgeworICAgIHNlcnZpY2VfbmFtZSA9IGdfc3RyZHVwX3ByaW50ZigiJXMlcyVzIiwgc2VsZi0+c2VydmljZV9uYW1lLCBUSFJJRlRfTVVMVElQTEVYRURfUFJPVE9DT0xfREVGQVVMVF9TRVBBUkFUT1IsIG5hbWUpOworICB9ZWxzZXsKKyAgICBzZXJ2aWNlX25hbWUgPSBnX3N0cmR1cChuYW1lKTsKKyAgfQorCisgIC8qIHJlbGF5IHRvIHRoZSBwcm90b2NvbF9kZWNvcmF0b3IgKi8KKyAgcmV0ID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9tZXNzYWdlX2JlZ2luKHByb3RvY29sLCBzZXJ2aWNlX25hbWUsIG1lc3NhZ2VfdHlwZSwgc2VxaWQsIGVycm9yKTsKKworICBnX2ZyZWUoc2VydmljZV9uYW1lKTsKKworICByZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyB2b2lkCit0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2xfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICAgICAgKm9iamVjdCwKKyAgICBndWludCAgICAgICAgIHByb3BlcnR5X2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqdmFsdWUsCisgICAgR1BhcmFtU3BlYyAgICpwc3BlYykKK3sKKyAgVGhyaWZ0TXVsdGlwbGV4ZWRQcm90b2NvbCAqc2VsZiA9IFRIUklGVF9NVUxUSVBMRVhFRF9QUk9UT0NPTCAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BlcnR5X2lkKQorICB7CisgIGNhc2UgUFJPUF9USFJJRlRfTVVMVElQTEVYRURfUFJPVE9DT0xfU0VSVklDRV9OQU1FOgorICAgIHNlbGYtPnNlcnZpY2VfbmFtZSA9IGdfdmFsdWVfZHVwX3N0cmluZyAodmFsdWUpOworICAgIGJyZWFrOworCisgIGRlZmF1bHQ6CisgICAgLyogV2UgZG9uJ3QgaGF2ZSBhbnkgb3RoZXIgcHJvcGVydHkuLi4gKi8KKyAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcGVydHlfaWQsIHBzcGVjKTsKKyAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sX2dldF9wcm9wZXJ0eSAoR09iamVjdCAgICAqb2JqZWN0LAorICAgIGd1aW50ICAgICAgIHByb3BlcnR5X2lkLAorICAgIEdWYWx1ZSAgICAgKnZhbHVlLAorICAgIEdQYXJhbVNwZWMgKnBzcGVjKQoreworICBUaHJpZnRNdWx0aXBsZXhlZFByb3RvY29sICpzZWxmID0gVEhSSUZUX01VTFRJUExFWEVEX1BST1RPQ09MIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcGVydHlfaWQpCisgIHsKKyAgY2FzZSBQUk9QX1RIUklGVF9NVUxUSVBMRVhFRF9QUk9UT0NPTF9TRVJWSUNFX05BTUU6CisgICAgZ192YWx1ZV9zZXRfc3RyaW5nICh2YWx1ZSwgc2VsZi0+c2VydmljZV9uYW1lKTsKKyAgICBicmVhazsKKworICBkZWZhdWx0OgorICAgIC8qIFdlIGRvbid0IGhhdmUgYW55IG90aGVyIHByb3BlcnR5Li4uICovCisgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BlcnR5X2lkLCBwc3BlYyk7CisgICAgYnJlYWs7CisgIH0KK30KKworCitzdGF0aWMgdm9pZAordGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sX2luaXQgKFRocmlmdE11bHRpcGxleGVkUHJvdG9jb2wgKnByb3RvY29sKQoreworICBwcm90b2NvbC0+c2VydmljZV9uYW1lID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQKK3RocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbF9maW5hbGl6ZSAoR09iamVjdCAqZ29iamVjdCkKK3sKKyAgVGhyaWZ0TXVsdGlwbGV4ZWRQcm90b2NvbCAqc2VsZiA9IFRIUklGVF9NVUxUSVBMRVhFRF9QUk9UT0NPTCAoZ29iamVjdCk7CisKKyAgaWYgKHNlbGYtPnNlcnZpY2VfbmFtZSkgeworICAgIGdfZnJlZShzZWxmLT5zZXJ2aWNlX25hbWUpOworICAgIHNlbGYtPnNlcnZpY2VfbmFtZSA9IE5VTEw7CisgIH0KKworICAvKiBBbHdheXMgY2hhaW4gdXAgdG8gdGhlIHBhcmVudCBjbGFzczsgYXMgd2l0aCBkaXNwb3NlKCksIGZpbmFsaXplKCkKKyAgICogaXMgZ3VhcmFudGVlZCB0byBleGlzdCBvbiB0aGUgcGFyZW50J3MgY2xhc3MgdmlydHVhbCBmdW5jdGlvbiB0YWJsZQorICAgKi8KKyAgR19PQkpFQ1RfQ0xBU1MgKHRocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbF9wYXJlbnRfY2xhc3MpLT5maW5hbGl6ZShnb2JqZWN0KTsKK30KKworCisvKiBpbml0aWFsaXplIHRoZSBjbGFzcyAqLworc3RhdGljIHZvaWQKK3RocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbF9jbGFzc19pbml0IChUaHJpZnRNdWx0aXBsZXhlZFByb3RvY29sQ2xhc3MgKmtsYXNzKQoreworICBUaHJpZnRQcm90b2NvbENsYXNzICpjbHMgPSBUSFJJRlRfUFJPVE9DT0xfQ0xBU1MgKGtsYXNzKTsKKyAgR09iamVjdENsYXNzICpvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoa2xhc3MpOworCisgIGNscy0+d3JpdGVfbWVzc2FnZV9iZWdpbiA9IHRocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2JlZ2luOworCisgIG9iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gdGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sX3NldF9wcm9wZXJ0eTsKKyAgb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSB0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2xfZ2V0X3Byb3BlcnR5OworICBvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gdGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sX2ZpbmFsaXplOworCisgIHRocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbF9vYmpfcHJvcGVydGllc1tQUk9QX1RIUklGVF9NVUxUSVBMRVhFRF9QUk9UT0NPTF9TRVJWSUNFX05BTUVdID0KKyAgICAgIGdfcGFyYW1fc3BlY19zdHJpbmcgKCJzZXJ2aWNlLW5hbWUiLAorICAgICAgICAgICJTZXJ2aWNlIG5hbWUgdGhlIHByb3RvY29sIHBvaW50cyB0byIsCisgICAgICAgICAgIlNldCB0aGUgc2VydmljZSBuYW1lIiwKKyAgICAgICAgICBOVUxMLAorICAgICAgICAgIChHX1BBUkFNX0NPTlNUUlVDVF9PTkxZIHwgR19QQVJBTV9SRUFEV1JJVEUpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnRpZXMgKG9iamVjdF9jbGFzcywKKyAgICAgIFBST1BfVEhSSUZUX01VTFRJUExFWEVEX1BST1RPQ09MX0VORCwKKyAgICAgIHRocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbF9vYmpfcHJvcGVydGllcyk7Cit9CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbC5oIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmUwOGZiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2wuaApAQCAtMCwwICsxLDc2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9NVUxUSVBMRVhFRF9QUk9UT0NPTF9ICisjZGVmaW5lIF9USFJJRlRfTVVMVElQTEVYRURfUFJPVE9DT0xfSAorCisjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oPgorCitHX0JFR0lOX0RFQ0xTCisKKy8qISBcZmlsZSB0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2wuaAorICogIFxicmllZiBNdWx0aXBsZXhlZCBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBvZiBhIFRocmlmdCBwcm90b2NvbC4gIEltcGxlbWVudHMgdGhlCisgKiAgICAgICAgIFRocmlmdFByb3RvY29sIGludGVyZmFjZS4KKyAqLworCisvKiB0eXBlIG1hY3JvcyAqLworI2RlZmluZSBUSFJJRlRfVFlQRV9NVUxUSVBMRVhFRF9QUk9UT0NPTCAodGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sX2dldF90eXBlICgpKQorI2RlZmluZSBUSFJJRlRfTVVMVElQTEVYRURfUFJPVE9DT0wob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBUSFJJRlRfVFlQRV9NVUxUSVBMRVhFRF9QUk9UT0NPTCwgVGhyaWZ0TXVsdGlwbGV4ZWRQcm90b2NvbCkpCisjZGVmaW5lIFRIUklGVF9JU19NVUxUSVBMRVhFRF9QUk9UT0NPTChvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIFRIUklGVF9UWVBFX01VTFRJUExFWEVEX1BST1RPQ09MKSkKKyNkZWZpbmUgVEhSSUZUX01VTFRJUExFWEVEX1BST1RPQ09MX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCBUSFJJRlRfVFlQRV9NVUxUSVBMRVhFRF9QUk9UT0NPTCwgVGhyaWZ0TXVsdGlwbGV4ZWRQcm90b2NvbENsYXNzKSkKKyNkZWZpbmUgVEhSSUZUX0lTX01VTFRJUExFWEVEX1BST1RPQ09MX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCBUSFJJRlRfVFlQRV9NVUxUSVBMRVhFRF9QUk9UT0NPTCkpCisjZGVmaW5lIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9UT0NPTF9HRVRfQ0xBU1Mob2JqKSAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIFRIUklGVF9UWVBFX01VTFRJUExFWEVEX1BST1RPQ09MLCBUaHJpZnRNdWx0aXBsZXhlZFByb3RvY29sQ2xhc3MpKQorCisvKiBjb25zdGFudCAqLworI2RlZmluZSBUSFJJRlRfTVVMVElQTEVYRURfUFJPVE9DT0xfREVGQVVMVF9TRVBBUkFUT1IgIjoiCisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRNdWx0aXBsZXhlZFByb3RvY29sIFRocmlmdE11bHRpcGxleGVkUHJvdG9jb2w7CisKKworCisvKiEKKyAqIFRocmlmdCBNdWx0aXBsZXhlZCBQcm90b2NvbCBpbnN0YW5jZS4KKyAqLworc3RydWN0IF9UaHJpZnRNdWx0aXBsZXhlZFByb3RvY29sCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yIHBhcmVudDsKKworICBnY2hhciAqc2VydmljZV9uYW1lOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdE11bHRpcGxleGVkUHJvdG9jb2xDbGFzcyBUaHJpZnRNdWx0aXBsZXhlZFByb3RvY29sQ2xhc3M7CisKKy8qIQorICogVGhyaWZ0IE11bHRpcGxleGVkIFByb3RvY29sIGNsYXNzLgorICovCitzdHJ1Y3QgX1RocmlmdE11bHRpcGxleGVkUHJvdG9jb2xDbGFzcworeworICBUaHJpZnRQcm90b2NvbERlY29yYXRvckNsYXNzIHBhcmVudDsKK307CisKKy8qIHVzZWQgYnkgVEhSSUZUX1RZUEVfTVVMVElQTEVYRURfUFJPVE9DT0wgKi8KK0dUeXBlIHRocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbF9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfVEhSSUZUX01VTFRJUExFWEVEX1BST1RPQ09MX0ggKi8KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmMgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5jCmluZGV4IGQ2MzE1ZDguLjgyOTZhOGMgMTAwNjQ0Ci0tLSBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmMKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuYwpAQCAtNjEsMTUgKzYxLDE1IEBACiAgIHN3aXRjaCAocHJvcGVydHlfaWQpCiAgIHsKICAgICBjYXNlIFBST1BfVEhSSUZUX1BST1RPQ09MX1RSQU5TUE9SVDoKLSAgICAgIHByb3RvY29sLT50cmFuc3BvcnQgPSBnX3ZhbHVlX2dldF9vYmplY3QgKHZhbHVlKTsKKyAgICAgIHByb3RvY29sLT50cmFuc3BvcnQgPSBnX3ZhbHVlX2R1cF9vYmplY3QgKHZhbHVlKTsKICAgICAgIGJyZWFrOwogICB9CiB9CiAKIAogZ2ludDMyCi10aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAqbmFtZSwgCit0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdjaGFyICpuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdE1lc3NhZ2VUeXBlIG1lc3NhZ2VfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnaW50MzIgc2VxaWQsIEdFcnJvciAqKmVycm9yKQogewpAQCAtMjQzLDcgKzI0Myw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLCBlcnJvcik7CiB9CiAKLWdpbnQzMiAKK2dpbnQzMgogdGhyaWZ0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NoYXIgKipuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0TWVzc2FnZVR5cGUgKm1lc3NhZ2VfdHlwZSwKQEAgLTI1NCw3ICsyNTQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxaWQsIGVycm9yKTsKIH0KIAotZ2ludDMyIAorZ2ludDMyCiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQogewpAQCAtMjYyLDcgKzI2Miw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKIH0KIAotZ2ludDMyIAorZ2ludDMyCiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NoYXIgKipuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKQEAgLTI3OSw3ICsyNzksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKIH0KIAotZ2ludDMyIAorZ2ludDMyCiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjaGFyICoqbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUeXBlICpmaWVsZF90eXBlLApAQCAtMjkzLDcgKzI5Myw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKIH0KIAotZ2ludDMyIAorZ2ludDMyCiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9maWVsZF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCiB7CkBAIC0zMDEsNyArMzAxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKIH0KIAotZ2ludDMyIAorZ2ludDMyCiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9tYXBfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHlwZSAqa2V5X3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFR5cGUgKnZhbHVlX3R5cGUsIGd1aW50MzIgKnNpemUsCkBAIC0zMTEsMTcgKzMxMSwxNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7CiB9CiAKLWdpbnQzMiAKK2dpbnQzMgogdGhyaWZ0X3Byb3RvY29sX3JlYWRfbWFwX2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcikKIHsKICAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+cmVhZF9tYXBfZW5kIChwcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7CiB9CiAKLWdpbnQzMiAKK2dpbnQzMgogdGhyaWZ0X3Byb3RvY29sX3JlYWRfbGlzdF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHlwZSAqZWxlbWVudF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiAqc2l6ZSwgR0Vycm9yICoqZXJyb3IpCkBAIC00MTIsNyArNDEyLDcgQEAKIH0KIAogZ2ludDMyCi10aHJpZnRfcHJvdG9jb2xfcmVhZF9iaW5hcnkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ3BvaW50ZXIgKmJ1ZiwgCit0aHJpZnRfcHJvdG9jb2xfcmVhZF9iaW5hcnkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ3BvaW50ZXIgKmJ1ZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiAqbGVuLCBHRXJyb3IgKiplcnJvcikKIHsKICAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+cmVhZF9iaW5hcnkgKHByb3RvY29sLCBidWYsCkBAIC00NjUsNyArNDY1LDcgQEAKICAgICAgIH0KICAgICBjYXNlIFRfU1RSVUNUOgogICAgICAgewotICAgICAgICBndWludDMyIHJlc3VsdCA9IDA7CisgICAgICAgIGdpbnQzMiByZXN1bHQgPSAwOwogICAgICAgICBnY2hhciAqbmFtZTsKICAgICAgICAgZ2ludDE2IGZpZDsKICAgICAgICAgVGhyaWZ0VHlwZSBmdHlwZTsKQEAgLTQ3NSw2ICs0NzUsMTAgQEAKICAgICAgICAgewogICAgICAgICAgIHJlc3VsdCArPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZuYW1lLCAmZnR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlkLCBlcnJvcik7CisgICAgICAgICAgaWYgKHJlc3VsdCA8IDApCisgICAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsgIAorICAgICAgICAgIH0KICAgICAgICAgICBpZiAoZnR5cGUgPT0gVF9TVE9QKQogICAgICAgICAgIHsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtNDg1LDkgKzQ4OSw5IEBACiAgICAgICAgIHJlc3VsdCArPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfZW5kIChwcm90b2NvbCwgZXJyb3IpOwogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgfQotICAgIGNhc2UgVF9NQVA6CisgICAgY2FzZSBUX1NFVDoKICAgICAgIHsKLSAgICAgICAgZ3VpbnQzMiByZXN1bHQgPSAwOworICAgICAgICBnaW50MzIgcmVzdWx0ID0gMDsKICAgICAgICAgVGhyaWZ0VHlwZSBlbGVtX3R5cGU7CiAgICAgICAgIGd1aW50MzIgaSwgc2l6ZTsKICAgICAgICAgcmVzdWx0ICs9IHRocmlmdF9wcm90b2NvbF9yZWFkX3NldF9iZWdpbiAocHJvdG9jb2wsICZlbGVtX3R5cGUsICZzaXplLApAQCAtNDk5LDkgKzUwMywyNSBAQAogICAgICAgICByZXN1bHQgKz0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfc2V0X2VuZCAocHJvdG9jb2wsIGVycm9yKTsKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgIH0KKyAgICBjYXNlIFRfTUFQOgorICAgICAgeworICAgICAgICBnaW50MzIgcmVzdWx0ID0gMDsKKyAgICAgICAgVGhyaWZ0VHlwZSBlbGVtX3R5cGU7CisgICAgICAgIFRocmlmdFR5cGUga2V5X3R5cGU7CisgICAgICAgIGd1aW50MzIgaSwgc2l6ZTsKKyAgICAgICAgcmVzdWx0ICs9IHRocmlmdF9wcm90b2NvbF9yZWFkX21hcF9iZWdpbiAocHJvdG9jb2wsICZrZXlfdHlwZSwgJmVsZW1fdHlwZSwgJnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykKKyAgICAgICAgeworICAgICAgICAgIHJlc3VsdCArPSB0aHJpZnRfcHJvdG9jb2xfc2tpcCAocHJvdG9jb2wsIGtleV90eXBlLCBlcnJvcik7CisgICAgICAgICAgcmVzdWx0ICs9IHRocmlmdF9wcm90b2NvbF9za2lwIChwcm90b2NvbCwgZWxlbV90eXBlLCBlcnJvcik7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0ICs9IHRocmlmdF9wcm90b2NvbF9yZWFkX21hcF9lbmQgKHByb3RvY29sLCBlcnJvcik7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICB9CiAgICAgY2FzZSBUX0xJU1Q6CiAgICAgICB7Ci0gICAgICAgIGd1aW50MzIgcmVzdWx0ID0gMDsKKyAgICAgICAgZ2ludDMyIHJlc3VsdCA9IDA7CiAgICAgICAgIFRocmlmdFR5cGUgZWxlbV90eXBlOwogICAgICAgICBndWludDMyIGksIHNpemU7CiAgICAgICAgIHJlc3VsdCArPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9saXN0X2JlZ2luIChwcm90b2NvbCwgJmVsZW1fdHlwZSwgJnNpemUsCkBAIC01MzMsMTIgKzU1MywyNyBAQAogfQogCiBzdGF0aWMgdm9pZAordGhyaWZ0X3Byb3RvY29sX2Rpc3Bvc2UgKEdPYmplY3QgKmdvYmplY3QpCit7CisgIFRocmlmdFByb3RvY29sICpzZWxmID0gVEhSSUZUX1BST1RPQ09MIChnb2JqZWN0KTsKKworICBnX2NsZWFyX29iamVjdCgmc2VsZi0+dHJhbnNwb3J0KTsKKworICAvKiBBbHdheXMgY2hhaW4gdXAgdG8gdGhlIHBhcmVudCBjbGFzczsgdGhlcmUgaXMgbm8gbmVlZCB0byBjaGVjayBpZgorICAgKiB0aGUgcGFyZW50IGNsYXNzIGltcGxlbWVudHMgdGhlIGRpc3Bvc2UoKSB2aXJ0dWFsIGZ1bmN0aW9uOiBpdCBpcworICAgKiBhbHdheXMgZ3VhcmFudGVlZCB0byBkbyBzbworICAgKi8KKyAgR19PQkpFQ1RfQ0xBU1MgKHRocmlmdF9wcm90b2NvbF9wYXJlbnRfY2xhc3MpLT5kaXNwb3NlKGdvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAogdGhyaWZ0X3Byb3RvY29sX2NsYXNzX2luaXQgKFRocmlmdFByb3RvY29sQ2xhc3MgKmNscykKIHsKICAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGNscyk7CiAKICAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gdGhyaWZ0X3Byb3RvY29sX2dldF9wcm9wZXJ0eTsKICAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gdGhyaWZ0X3Byb3RvY29sX3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+ZGlzcG9zZSA9IHRocmlmdF9wcm90b2NvbF9kaXNwb3NlOwogCiAgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCiAgICAgICBQUk9QX1RIUklGVF9QUk9UT0NPTF9UUkFOU1BPUlQsCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3IuYyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzZjk0MjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3IuYwpAQCAtMCwwICsxLDYyMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxnbGliLmg+CisjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3IuaD4KKworR19ERUZJTkVfVFlQRShUaHJpZnRQcm90b2NvbERlY29yYXRvciwgdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvciwgVEhSSUZUX1RZUEVfUFJPVE9DT0wpCisKKworZW51bQoreworICBQUk9QX1RIUklGVF9UWVBFX1BST1RPQ09MX0RFQ09SQVRPUl9DT05DUkVURV9QUk9UT0NPTCA9IDEsCisgIFBST1BfVEhSSUZUX1RZUEVfUFJPVE9DT0xfREVDT1JBVE9SX0VORAorfTsKKworc3RhdGljIEdQYXJhbVNwZWMgKnRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfb2JqX3Byb3BlcnRpZXNbUFJPUF9USFJJRlRfVFlQRV9QUk9UT0NPTF9ERUNPUkFUT1JfRU5EXSA9IHsgTlVMTCwgfTsKKworCisKKworCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfbWVzc2FnZV9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdE1lc3NhZ2VUeXBlIG1lc3NhZ2VfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnaW50MzIgc2VxaWQsIEdFcnJvciAqKmVycm9yKQoreworCisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworICBUaHJpZnRQcm90b2NvbENsYXNzICpwcm90byA9IFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKTsKKworICBnX2RlYnVnKCJDb25jcmV0ZSBwcm90b2NvbCAlcCB8ICVwIiwgKHZvaWQgKilzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwgKHZvaWQgKilwcm90byk7CisKKyAgcmV0dXJuIHByb3RvLT53cml0ZV9tZXNzYWdlX2JlZ2luIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VfdHlwZSwgc2VxaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9tZXNzYWdlX2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+d3JpdGVfbWVzc2FnZV9lbmQgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfc3RydWN0X2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPndyaXRlX3N0cnVjdF9iZWdpbiAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9zdHJ1Y3RfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT53cml0ZV9zdHJ1Y3RfZW5kIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfZmllbGRfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdFR5cGUgZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2ludDE2IGZpZWxkX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPndyaXRlX2ZpZWxkX2JlZ2luIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIGZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9pZCwgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfZmllbGRfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT53cml0ZV9maWVsZF9lbmQgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX2ZpZWxkX3N0b3AgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPndyaXRlX2ZpZWxkX3N0b3AgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9tYXBfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdFR5cGUga2V5X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIHZhbHVlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIHNpemUsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT53cml0ZV9tYXBfYmVnaW4gKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X3R5cGUsIHZhbHVlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLCBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9tYXBfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT53cml0ZV9tYXBfZW5kIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfbGlzdF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdFR5cGUgZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgc2l6ZSwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPndyaXRlX2xpc3RfYmVnaW4gKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudF90eXBlLCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfbGlzdF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPndyaXRlX2xpc3RfZW5kIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX3NldF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0VHlwZSBlbGVtZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIHNpemUsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT53cml0ZV9zZXRfYmVnaW4gKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudF90eXBlLCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfc2V0X2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+d3JpdGVfc2V0X2VuZCAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX2Jvb2wgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnYm9vbGVhbiB2YWx1ZSwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPndyaXRlX2Jvb2wgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfYnl0ZSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnaW50OCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+d3JpdGVfYnl0ZSAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9pMTYgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ2ludDE2IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPndyaXRlX2kxNiAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX2kzMiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnaW50MzIgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+d3JpdGVfaTMyIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfaTY0IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdpbnQ2NCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT53cml0ZV9pNjQgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9kb3VibGUgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdkb3VibGUgdmFsdWUsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT53cml0ZV9kb3VibGUgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLCBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9zdHJpbmcgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdjaGFyICpzdHIsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT53cml0ZV9zdHJpbmcgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLCBzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfYmluYXJ5IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdwb2ludGVyIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+d3JpdGVfYmluYXJ5IChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9tZXNzYWdlX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY2hhciAqKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRNZXNzYWdlVHlwZSAqbWVzc2FnZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludDMyICpzZXFpZCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPnJlYWRfbWVzc2FnZV9iZWdpbiAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBtZXNzYWdlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXFpZCwgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9tZXNzYWdlX2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT5yZWFkX21lc3NhZ2VfZW5kIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9zdHJ1Y3RfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NoYXIgKipuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+cmVhZF9zdHJ1Y3RfYmVnaW4gKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfc3RydWN0X2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+cmVhZF9zdHJ1Y3RfZW5kIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX2ZpZWxkX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NoYXIgKipuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFR5cGUgKmZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludDE2ICpmaWVsZF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+cmVhZF9maWVsZF9iZWdpbiAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX2ZpZWxkX2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+cmVhZF9maWVsZF9lbmQgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9tYXBfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHlwZSAqa2V5X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFR5cGUgKnZhbHVlX3R5cGUsIGd1aW50MzIgKnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT5yZWFkX21hcF9iZWdpbiAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9tYXBfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT5yZWFkX21hcF9lbmQgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfbGlzdF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHlwZSAqZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiAqc2l6ZSwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPnJlYWRfbGlzdF9iZWdpbiAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfbGlzdF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPnJlYWRfbGlzdF9lbmQgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX3NldF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUeXBlICplbGVtZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgKnNpemUsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT5yZWFkX3NldF9iZWdpbiAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLCBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX3NldF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPnJlYWRfc2V0X2VuZCAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9ib29sIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdib29sZWFuICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT5yZWFkX2Jvb2wgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX2J5dGUgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2ludDggKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPnJlYWRfYnl0ZSAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfaTE2IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdpbnQxNiAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT5yZWFkX2kxNiAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9pMzIgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2ludDMyICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPnJlYWRfaTMyIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX2k2NCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnaW50NjQgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+cmVhZF9pNjQgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfZG91YmxlIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdkb3VibGUgKnZhbHVlLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+cmVhZF9kb3VibGUgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfc3RyaW5nIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjaGFyICoqc3RyLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+cmVhZF9zdHJpbmcgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLCBzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX2JpbmFyeSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBncG9pbnRlciAqYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyICpsZW4sIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT5yZWFkX2JpbmFyeSAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwgZXJyb3IpOworfQorCisKK3N0YXRpYyB2b2lkCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3NldF9wcm9wZXJ0eSAoR09iamVjdCAgICAgICpvYmplY3QsCisgICAgZ3VpbnQgICAgICAgICBwcm9wZXJ0eV9pZCwKKyAgICBjb25zdCBHVmFsdWUgKnZhbHVlLAorICAgIEdQYXJhbVNwZWMgICAqcHNwZWMpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BlcnR5X2lkKQorICB7CisgIGNhc2UgUFJPUF9USFJJRlRfVFlQRV9QUk9UT0NPTF9ERUNPUkFUT1JfQ09OQ1JFVEVfUFJPVE9DT0w6CisgICAgc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wgPSBnX3ZhbHVlX2R1cF9vYmplY3QgKHZhbHVlKTsKKyAgICBicmVhazsKKworICBkZWZhdWx0OgorICAgIC8qIFdlIGRvbid0IGhhdmUgYW55IG90aGVyIHByb3BlcnR5Li4uICovCisgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BlcnR5X2lkLCBwc3BlYyk7CisgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICAgICpvYmplY3QsCisgICAgZ3VpbnQgICAgICAgcHJvcGVydHlfaWQsCisgICAgR1ZhbHVlICAgICAqdmFsdWUsCisgICAgR1BhcmFtU3BlYyAqcHNwZWMpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BlcnR5X2lkKQorICB7CisgIGNhc2UgUFJPUF9USFJJRlRfVFlQRV9QUk9UT0NPTF9ERUNPUkFUT1JfQ09OQ1JFVEVfUFJPVE9DT0w6CisgICAgZ192YWx1ZV9zZXRfb2JqZWN0ICh2YWx1ZSwgc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpOworICAgIGJyZWFrOworCisgIGRlZmF1bHQ6CisgICAgLyogV2UgZG9uJ3QgaGF2ZSBhbnkgb3RoZXIgcHJvcGVydHkuLi4gKi8KKyAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcGVydHlfaWQsIHBzcGVjKTsKKyAgICBicmVhazsKKyAgfQorfQorCisKK1RocmlmdFByb3RvY29sICoKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfZ2V0X2NvbmNyZXRlX3Byb3RvY29sKFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpwcm90b2NvbCkKK3sKKyAgVGhyaWZ0UHJvdG9jb2wgKnJldHZhbCA9IE5VTEw7CisgIGlmKCFUSFJJRlRfSVNfUFJPVE9DT0xfREVDT1JBVE9SKHByb3RvY29sKSl7CisgICAgZ193YXJuaW5nKCJUaGUgdHlwZSBpcyBub3QgcHJvdG9jb2wgZGVjb3JhdG9yIik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SKHByb3RvY29sKTsKKyAgZ19kZWJ1ZygiR2V0dGluZyBjb25jcmV0ZSBwcm90b2NvbCBmcm9tICVwIC0+ICVwIiwgKHZvaWQgKilzZWxmLCAodm9pZCAqKXNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCisKK3N0YXRpYyB2b2lkCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX2luaXQgKFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpwcm90b2NvbCkKK3sKKyAgcHJvdG9jb2wtPmNvbmNyZXRlX3Byb3RvY29sID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfZGlzcG9zZSAoR09iamVjdCAqZ29iamVjdCkKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChnb2JqZWN0KTsKKworICBnX2NsZWFyX29iamVjdCgmc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpOworCisgIC8qIEFsd2F5cyBjaGFpbiB1cCB0byB0aGUgcGFyZW50IGNsYXNzOyB0aGVyZSBpcyBubyBuZWVkIHRvIGNoZWNrIGlmCisgICAqIHRoZSBwYXJlbnQgY2xhc3MgaW1wbGVtZW50cyB0aGUgZGlzcG9zZSgpIHZpcnR1YWwgZnVuY3Rpb246IGl0IGlzCisgICAqIGFsd2F5cyBndWFyYW50ZWVkIHRvIGRvIHNvCisgICAqLworICBHX09CSkVDVF9DTEFTUyAodGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9wYXJlbnRfY2xhc3MpLT5kaXNwb3NlKGdvYmplY3QpOworfQorCisvKiBpbml0aWFsaXplIHRoZSBjbGFzcyAqLworc3RhdGljIHZvaWQKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfY2xhc3NfaW5pdCAoVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3JDbGFzcyAqa2xhc3MpCit7CisgIFRocmlmdFByb3RvY29sQ2xhc3MgKmNscyA9IFRIUklGVF9QUk9UT0NPTF9DTEFTUyAoa2xhc3MpOworICBHT2JqZWN0Q2xhc3MgKm9iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChrbGFzcyk7CisgIG9iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9zZXRfcHJvcGVydHk7CisgIG9iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9nZXRfcHJvcGVydHk7CisgIG9iamVjdF9jbGFzcy0+ZGlzcG9zZSA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfZGlzcG9zZTsKKworICB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX29ial9wcm9wZXJ0aWVzW1BST1BfVEhSSUZUX1RZUEVfUFJPVE9DT0xfREVDT1JBVE9SX0NPTkNSRVRFX1BST1RPQ09MXSA9CisgICAgICBnX3BhcmFtX3NwZWNfb2JqZWN0ICgicHJvdG9jb2wiLAorICAgICAgICAgICJQcm90b2NvbCIsCisgICAgICAgICAgIlNldCB0aGUgcHJvdG9jb2wgdG8gYmUgaW1wbGVtZW50ZWQiLCBUSFJJRlRfVFlQRV9QUk9UT0NPTCwKKyAgICAgICAgICAoR19QQVJBTV9DT05TVFJVQ1RfT05MWSB8IEdfUEFSQU1fUkVBRFdSSVRFKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0aWVzIChvYmplY3RfY2xhc3MsCisgICAgICBQUk9QX1RIUklGVF9UWVBFX1BST1RPQ09MX0RFQ09SQVRPUl9FTkQsCisgICAgICB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX29ial9wcm9wZXJ0aWVzKTsKKworICBnX2RlYnVnKCJDdXJyZW50IGRlY29yYXRvciB3cml0ZV9tZXNzYWdlX2JlZ2luIGFkZHIgJXAsIG5ldyAlcCIsIGNscy0+d3JpdGVfbWVzc2FnZV9iZWdpbiwgdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9tZXNzYWdlX2JlZ2luKTsKKworICBjbHMtPndyaXRlX21lc3NhZ2VfYmVnaW4gPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX21lc3NhZ2VfYmVnaW47CisgIGNscy0+d3JpdGVfbWVzc2FnZV9lbmQgPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX21lc3NhZ2VfZW5kOworICBjbHMtPndyaXRlX3N0cnVjdF9iZWdpbiA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfc3RydWN0X2JlZ2luOworICBjbHMtPndyaXRlX3N0cnVjdF9lbmQgPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX3N0cnVjdF9lbmQ7CisgIGNscy0+d3JpdGVfZmllbGRfYmVnaW4gPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX2ZpZWxkX2JlZ2luOworICBjbHMtPndyaXRlX2ZpZWxkX2VuZCA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfZmllbGRfZW5kOworICBjbHMtPndyaXRlX2ZpZWxkX3N0b3AgPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX2ZpZWxkX3N0b3A7CisgIGNscy0+d3JpdGVfbWFwX2JlZ2luID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9tYXBfYmVnaW47CisgIGNscy0+d3JpdGVfbWFwX2VuZCA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfbWFwX2VuZDsKKyAgY2xzLT53cml0ZV9saXN0X2JlZ2luID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9saXN0X2JlZ2luOworICBjbHMtPndyaXRlX2xpc3RfZW5kID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9saXN0X2VuZDsKKyAgY2xzLT53cml0ZV9zZXRfYmVnaW4gPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX3NldF9iZWdpbjsKKyAgY2xzLT53cml0ZV9zZXRfZW5kID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9zZXRfZW5kOworICBjbHMtPndyaXRlX2Jvb2wgPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX2Jvb2w7CisgIGNscy0+d3JpdGVfYnl0ZSA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfYnl0ZTsKKyAgY2xzLT53cml0ZV9pMTYgPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX2kxNjsKKyAgY2xzLT53cml0ZV9pMzIgPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX2kzMjsKKyAgY2xzLT53cml0ZV9pNjQgPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX2k2NDsKKyAgY2xzLT53cml0ZV9kb3VibGUgPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX2RvdWJsZTsKKyAgY2xzLT53cml0ZV9zdHJpbmcgPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX3N0cmluZzsKKyAgY2xzLT53cml0ZV9iaW5hcnkgPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX2JpbmFyeTsKKyAgY2xzLT5yZWFkX21lc3NhZ2VfYmVnaW4gPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfbWVzc2FnZV9iZWdpbjsKKyAgY2xzLT5yZWFkX21lc3NhZ2VfZW5kID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX21lc3NhZ2VfZW5kOworICBjbHMtPnJlYWRfc3RydWN0X2JlZ2luID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX3N0cnVjdF9iZWdpbjsKKyAgY2xzLT5yZWFkX3N0cnVjdF9lbmQgPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfc3RydWN0X2VuZDsKKyAgY2xzLT5yZWFkX2ZpZWxkX2JlZ2luID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX2ZpZWxkX2JlZ2luOworICBjbHMtPnJlYWRfZmllbGRfZW5kID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX2ZpZWxkX2VuZDsKKyAgY2xzLT5yZWFkX21hcF9iZWdpbiA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9tYXBfYmVnaW47CisgIGNscy0+cmVhZF9tYXBfZW5kID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX21hcF9lbmQ7CisgIGNscy0+cmVhZF9saXN0X2JlZ2luID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX2xpc3RfYmVnaW47CisgIGNscy0+cmVhZF9saXN0X2VuZCA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9saXN0X2VuZDsKKyAgY2xzLT5yZWFkX3NldF9iZWdpbiA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9zZXRfYmVnaW47CisgIGNscy0+cmVhZF9zZXRfZW5kID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX3NldF9lbmQ7CisgIGNscy0+cmVhZF9ib29sID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX2Jvb2w7CisgIGNscy0+cmVhZF9ieXRlID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX2J5dGU7CisgIGNscy0+cmVhZF9pMTYgPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfaTE2OworICBjbHMtPnJlYWRfaTMyID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX2kzMjsKKyAgY2xzLT5yZWFkX2k2NCA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9pNjQ7CisgIGNscy0+cmVhZF9kb3VibGUgPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfZG91YmxlOworICBjbHMtPnJlYWRfc3RyaW5nID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX3N0cmluZzsKKyAgY2xzLT5yZWFkX2JpbmFyeSA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9iaW5hcnk7Cit9CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3IuaCBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzYjZhZjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3IuaApAQCAtMCwwICsxLDcyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1JfSAorI2RlZmluZSBfVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUl9ICisKKyNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0Lmg+CisKK0dfQkVHSU5fREVDTFMKKworLyohIFxmaWxlIHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3IuaAorICogIFxicmllZiBNdWx0aXBsZXhlZCBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBvZiBhIFRocmlmdCBwcm90b2NvbC4gIEltcGxlbWVudHMgdGhlCisgKiAgICAgICAgIFRocmlmdFByb3RvY29sIGludGVyZmFjZS4KKyAqLworCisvKiB0eXBlIG1hY3JvcyAqLworI2RlZmluZSBUSFJJRlRfVFlQRV9QUk9UT0NPTF9ERUNPUkFUT1IgKHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1Iob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBUSFJJRlRfVFlQRV9QUk9UT0NPTF9ERUNPUkFUT1IsIFRocmlmdFByb3RvY29sRGVjb3JhdG9yKSkKKyNkZWZpbmUgVEhSSUZUX0lTX1BST1RPQ09MX0RFQ09SQVRPUihvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIFRIUklGVF9UWVBFX1BST1RPQ09MX0RFQ09SQVRPUikpCisjZGVmaW5lIFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1JfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksIFRIUklGVF9UWVBFX1BST1RPQ09MX0RFQ09SQVRPUiwgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3JDbGFzcykpCisjZGVmaW5lIFRIUklGVF9JU19QUk9UT0NPTF9ERUNPUkFUT1JfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksIFRIUklGVF9UWVBFX1BST1RPQ09MX0RFQ09SQVRPUikpCisjZGVmaW5lIFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1JfR0VUX0NMQVNTKG9iaikgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBUSFJJRlRfVFlQRV9QUk9UT0NPTF9ERUNPUkFUT1IsIFRocmlmdFByb3RvY29sRGVjb3JhdG9yQ2xhc3MpKQorCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3I7CisKKworLyohCisgKiBUaHJpZnQgUHJvdG9jb2wgRGVjb3JhdG9yIGluc3RhbmNlLgorICovCitzdHJ1Y3QgX1RocmlmdFByb3RvY29sRGVjb3JhdG9yCit7CisgIFRocmlmdFByb3RvY29sIHBhcmVudDsKKworICBUaHJpZnRQcm90b2NvbCAqY29uY3JldGVfcHJvdG9jb2w7Cit9OworCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3JDbGFzcyBUaHJpZnRQcm90b2NvbERlY29yYXRvckNsYXNzOworCisvKiEKKyAqIFRocmlmdCBQcm90b2NvbCBEZWNvcmF0b3IgY2xhc3MuCisgKi8KK3N0cnVjdCBfVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3JDbGFzcworeworICBUaHJpZnRQcm90b2NvbENsYXNzIHBhcmVudDsKKworfTsKKworLyogdXNlZCBieSBUSFJJRlRfVFlQRV9QUk9UT0NPTF9ERUNPUkFUT1IgKi8KK0dUeXBlIHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX1RIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1JfSCAqLwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2wuYyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBkNTYwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sLmMKQEAgLTAsMCArMSwxOTIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Z2xpYi5oPgorI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2wuaD4KKworCitlbnVtCit7CisgIFBST1BfVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MX01FU1NBR0VfTkFNRSA9IDEsCisgIFBST1BfVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MX01FU1NBR0VfVFlQRSwKKyAgUFJPUF9USFJJRlRfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0xfU0VRVUVOQ0VfSUQsCisgIFBST1BfVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MX1RSQU5TUE9SVCwgLyogVE9ETyB1Z2x5IGhhY2sgKi8KKyAgUFJPUF9USFJJRlRfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0xfRU5ECit9OworCitHX0RFRklORV9UWVBFKFRocmlmdFN0b3JlZE1lc3NhZ2VQcm90b2NvbCwgdGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sLCBUSFJJRlRfVFlQRV9QUk9UT0NPTF9ERUNPUkFUT1IpCisKKworc3RhdGljIEdQYXJhbVNwZWMgKnRocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbF9vYmpfcHJvcGVydGllc1tQUk9QX1RIUklGVF9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTF9FTkRdID0geyBOVUxMLCB9OworCitnaW50MzIKK3RocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKwkJCQkJICAgZ2NoYXIgKipuYW1lLAorCQkJCQkgICBUaHJpZnRNZXNzYWdlVHlwZSAqbWVzc2FnZV90eXBlLAorCQkJCQkgICBnaW50MzIgKnNlcWlkLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2ludDMyIHJldCA9IDA7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworCisgIFRocmlmdFN0b3JlZE1lc3NhZ2VQcm90b2NvbCAqc2VsZiA9IFRIUklGVF9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTCAocHJvdG9jb2wpOworCisgIC8qIFdlIHJldHVybiB0aGUgc3RvcmVkIHZhbHVlcyBvbiBjb25zdHJ1Y3Rpb24gKi8KKyAgKm5hbWUgPSBzZWxmLT5uYW1lOworICAqbWVzc2FnZV90eXBlID0gc2VsZi0+bXR5cGU7CisgICpzZXFpZCA9IHNlbGYtPnNlcWlkOworCisgIHJldHVybiByZXQ7Cit9CisKKworc3RhdGljIHZvaWQKK3RocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbF9zZXRfcHJvcGVydHkgKEdPYmplY3QgICAgICAqb2JqZWN0LAorCQkJCQkgICAgIGd1aW50ICAgICAgICAgcHJvcGVydHlfaWQsCisJCQkJCSAgICAgY29uc3QgR1ZhbHVlICp2YWx1ZSwKKwkJCQkJICAgICBHUGFyYW1TcGVjICAgKnBzcGVjKQoreworICBUaHJpZnRTdG9yZWRNZXNzYWdlUHJvdG9jb2wgKnNlbGYgPSBUSFJJRlRfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0wgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wZXJ0eV9pZCkKKyAgeworICAgIGNhc2UgUFJPUF9USFJJRlRfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0xfTUVTU0FHRV9OQU1FOgorICAgICAgc2VsZi0+bmFtZSA9IGdfdmFsdWVfZHVwX3N0cmluZyAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUklGVF9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTF9NRVNTQUdFX1RZUEU6CisgICAgICBzZWxmLT5tdHlwZSA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUklGVF9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTF9TRVFVRU5DRV9JRDoKKyAgICAgIHNlbGYtPnNlcWlkID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAvKiBXZSBkb24ndCBoYXZlIGFueSBvdGhlciBwcm9wZXJ0eS4uLiAqLworICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BlcnR5X2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sX2dldF9wcm9wZXJ0eSAoR09iamVjdCAgICAqb2JqZWN0LAorCQkJCQkgICAgIGd1aW50ICAgICAgIHByb3BlcnR5X2lkLAorCQkJCQkgICAgIEdWYWx1ZSAgICAgKnZhbHVlLAorCQkJCQkgICAgIEdQYXJhbVNwZWMgKnBzcGVjKQoreworICBUaHJpZnRTdG9yZWRNZXNzYWdlUHJvdG9jb2wgKnNlbGYgPSBUSFJJRlRfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0wgKG9iamVjdCk7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpkZWNvcmF0b3IgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChvYmplY3QpOworICBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydD1OVUxMOworICBzd2l0Y2ggKHByb3BlcnR5X2lkKQorICB7CisgICAgY2FzZSBQUk9QX1RIUklGVF9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTF9NRVNTQUdFX05BTUU6CisgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKHZhbHVlLCBzZWxmLT5uYW1lKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9USFJJRlRfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0xfVFJBTlNQT1JUOgorICAgICAgLyogRklYTUUgU2luY2Ugd2UgZG9uJ3Qgb3ZlcnJpZGUgcHJvcGVydGllcyBpbiB0aGUgZGVjb3JhdG9yIGFzIGl0IHNob3VsZAorICAgICAgICAgd2UganVzdCBvdmVycmlkZSB0aGUgcHJvcGVydGllcyB0aGF0IHdlIGtub3cgYXJlIHVzZWQgKi8KKyAgICAgIGdfb2JqZWN0X2dldChkZWNvcmF0b3ItPmNvbmNyZXRlX3Byb3RvY29sLHBzcGVjLT5uYW1lLCAmdHJhbnNwb3J0LCBOVUxMKTsKKyAgICAgIGdfdmFsdWVfc2V0X3BvaW50ZXIgKHZhbHVlLCB0cmFuc3BvcnQpOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgLyogV2UgZG9uJ3QgaGF2ZSBhbnkgb3RoZXIgcHJvcGVydHkuLi4gKi8KKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wZXJ0eV9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworCitzdGF0aWMgdm9pZAordGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sX2luaXQgKFRocmlmdFN0b3JlZE1lc3NhZ2VQcm90b2NvbCAqcHJvdG9jb2wpCit7CisgIHByb3RvY29sLT5uYW1lID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQKK3RocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbF9maW5hbGl6ZSAoR09iamVjdCAqZ29iamVjdCkKK3sKKyAgVGhyaWZ0U3RvcmVkTWVzc2FnZVByb3RvY29sICpzZWxmID0gVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MIChnb2JqZWN0KTsKKworICBpZiAoc2VsZi0+bmFtZSkgeworICAgICAgZ19mcmVlKHNlbGYtPm5hbWUpOworICAgICAgc2VsZi0+bmFtZSA9IE5VTEw7CisgIH0KKworICAvKiBBbHdheXMgY2hhaW4gdXAgdG8gdGhlIHBhcmVudCBjbGFzczsgYXMgd2l0aCBkaXNwb3NlKCksIGZpbmFsaXplKCkKKyAgICogaXMgZ3VhcmFudGVlZCB0byBleGlzdCBvbiB0aGUgcGFyZW50J3MgY2xhc3MgdmlydHVhbCBmdW5jdGlvbiB0YWJsZQorICAgKi8KKyAgR19PQkpFQ1RfQ0xBU1MgKHRocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbF9wYXJlbnRfY2xhc3MpLT5maW5hbGl6ZShnb2JqZWN0KTsKK30KKworCisvKiBpbml0aWFsaXplIHRoZSBjbGFzcyAqLworc3RhdGljIHZvaWQKK3RocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbF9jbGFzc19pbml0IChUaHJpZnRTdG9yZWRNZXNzYWdlUHJvdG9jb2xDbGFzcyAqa2xhc3MpCit7CisgIFRocmlmdFByb3RvY29sQ2xhc3MgKmNscyA9IFRIUklGVF9QUk9UT0NPTF9DTEFTUyAoa2xhc3MpOworICBHT2JqZWN0Q2xhc3MgKm9iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChrbGFzcyk7CisKKyAgY2xzLT5yZWFkX21lc3NhZ2VfYmVnaW4gPSB0aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luOworCisgIG9iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gdGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sX3NldF9wcm9wZXJ0eTsKKyAgb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSB0aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2xfZ2V0X3Byb3BlcnR5OworICBvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gdGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sX2ZpbmFsaXplOworCisgIHRocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbF9vYmpfcHJvcGVydGllc1tQUk9QX1RIUklGVF9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTF9NRVNTQUdFX05BTUVdID0KKyAgICAgIGdfcGFyYW1fc3BlY19zdHJpbmcgKCJuYW1lIiwKKwkJCSAgICJTZXJ2aWNlIG5hbWUgdGhlIHByb3RvY29sIHBvaW50cyB0byIsCisJCQkgICAiU2V0IHRoZSBzZXJ2aWNlIG5hbWUiLAorCQkJICAgTlVMTCwKKwkJCSAgIChHX1BBUkFNX0NPTlNUUlVDVF9PTkxZIHwgR19QQVJBTV9SRUFEV1JJVEUpKTsKKyAgdGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sX29ial9wcm9wZXJ0aWVzW1BST1BfVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MX01FU1NBR0VfVFlQRV0gPQorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoInR5cGUiLAorCQkJIk1lc3NhZ2UgdHlwZSBpbiB0aGUgd2lyZSIsCisJCQkiU2V0IHRoZSBtZXNzYWdlIHR5cGUgaW4gdGhlIHdpcmUiLAorCQkJVF9DQUxMLCBUX09ORVdBWSwKKwkJCVRfQ0FMTCwKKwkJCShHX1BBUkFNX0NPTlNUUlVDVF9PTkxZIHwgR19QQVJBTV9SRUFEV1JJVEUpKTsKKyAgdGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sX29ial9wcm9wZXJ0aWVzW1BST1BfVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MX1NFUVVFTkNFX0lEXSA9CisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgic2VxaWQiLAorCQkJIlNlcXVlbmNlIGlkIHR5cGUgaW4gdGhlIHdpcmUiLAorCQkJIlNldCB0aGUgU2VxdWVuY2UgaWQgaW4gdGhlIHdpcmUiLAorCQkJMCwgR19NQVhJTlQsCisJCQkwLAorCQkJKEdfUEFSQU1fQ09OU1RSVUNUX09OTFkgfCBHX1BBUkFNX1JFQURXUklURSkpOworCisgIC8qIFRPRE8gVWdseSBoYWNrLCBpbiB0aGVvcnkgd2UgbXVzdCBvdmVycmlkZSBhbGwgcHJvcGVydGllcyBmcm9tIHVuZGVybGF5aW5nCisgICAgIHByb3RvY29sICovCisgIHRocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbF9vYmpfcHJvcGVydGllc1tQUk9QX1RIUklGVF9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTF9UUkFOU1BPUlRdID0KKyAgICAgIGdfcGFyYW1fc3BlY19wb2ludGVyICgidHJhbnNwb3J0IiwKKwkJCSJUcmFuc3BvcnQgb24gdGhlIHVuZGVybGF5aW5nIGltcGxlbWVudGF0aW9uIiwKKwkJCSJUcmFuc3BvcnQgb2YgZGVjb3JhdGVkIHByb3RvY29sIiwKKwkJCUdfUEFSQU1fUkVBREFCTEUpOworCisKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnRpZXMgKG9iamVjdF9jbGFzcywKKwkJCQkgICAgIFBST1BfVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MX0VORCwKKwkJCQkgICAgIHRocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbF9vYmpfcHJvcGVydGllcyk7Cit9CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbC5oIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODc4MmFjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2wuaApAQCAtMCwwICsxLDc4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTF9ICisjZGVmaW5lIF9USFJJRlRfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0xfSAorCisjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oPgorCitHX0JFR0lOX0RFQ0xTCisKKy8qISBcZmlsZSB0aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2wuaAorICogIFxicmllZiBTdG9yZWRNZXNzYWdlIHByb3RvY29sIGltcGxlbWVudGF0aW9uIG9mIGEgcHJlLXN0b3JlZCBtZXNzYWdlIGhlYWRlcgorICogIG9uIFRocmlmdCBwcm90b2NvbC4gIEltcGxlbWVudHMgdGhlIFRocmlmdFByb3RvY29sIGludGVyZmFjZS4KKyAqLworCisvKiB0eXBlIG1hY3JvcyAqLworI2RlZmluZSBUSFJJRlRfVFlQRV9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTCAodGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sX2dldF90eXBlICgpKQorI2RlZmluZSBUSFJJRlRfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0wob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBUSFJJRlRfVFlQRV9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTCwgVGhyaWZ0U3RvcmVkTWVzc2FnZVByb3RvY29sKSkKKyNkZWZpbmUgVEhSSUZUX0lTX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgVEhSSUZUX1RZUEVfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0wpKQorI2RlZmluZSBUSFJJRlRfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0xfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksIFRIUklGVF9UWVBFX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MLCBUaHJpZnRTdG9yZWRNZXNzYWdlUHJvdG9jb2xDbGFzcykpCisjZGVmaW5lIFRIUklGVF9JU19TVE9SRURfTUVTU0FHRV9QUk9UT0NPTF9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgVEhSSUZUX1RZUEVfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0wpKQorI2RlZmluZSBUSFJJRlRfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0xfR0VUX0NMQVNTKG9iaikgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBUSFJJRlRfVFlQRV9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTCwgVGhyaWZ0U3RvcmVkTWVzc2FnZVByb3RvY29sQ2xhc3MpKQorCisvKiBjb25zdGFudCAqLworI2RlZmluZSBUSFJJRlRfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0xfREVGQVVMVF9TRVBBUkFUT1IgIjoiCisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRTdG9yZWRNZXNzYWdlUHJvdG9jb2wgVGhyaWZ0U3RvcmVkTWVzc2FnZVByb3RvY29sOworCisKKworLyohCisgKiBUaHJpZnQgU3RvcmVkTWVzc2FnZSBQcm90b2NvbCBpbnN0YW5jZS4KKyAqLworc3RydWN0IF9UaHJpZnRTdG9yZWRNZXNzYWdlUHJvdG9jb2wKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgcGFyZW50OworCisgIGdjaGFyICpuYW1lOworICBUaHJpZnRNZXNzYWdlVHlwZSBtdHlwZTsKKyAgZ2ludDMyIHNlcWlkOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdFN0b3JlZE1lc3NhZ2VQcm90b2NvbENsYXNzIFRocmlmdFN0b3JlZE1lc3NhZ2VQcm90b2NvbENsYXNzOworCisvKiEKKyAqIFRocmlmdCBTdG9yZWRNZXNzYWdlIFByb3RvY29sIGNsYXNzLgorICovCitzdHJ1Y3QgX1RocmlmdFN0b3JlZE1lc3NhZ2VQcm90b2NvbENsYXNzCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yQ2xhc3MgcGFyZW50OworfTsKKworLyogdXNlZCBieSBUSFJJRlRfVFlQRV9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTCAqLworR1R5cGUgdGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sX2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9USFJJRlRfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0xfSCAqLwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9zZXJ2ZXIvdGhyaWZ0X3NlcnZlci5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9zZXJ2ZXIvdGhyaWZ0X3NlcnZlci5jCmluZGV4IGU4YWZmNDUuLmNjZjkxNTMgMTAwNjQ0Ci0tLSBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvc2VydmVyL3RocmlmdF9zZXJ2ZXIuYworKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3NlcnZlci90aHJpZnRfc2VydmVyLmMKQEAgLTc2LDIyICs3NiwyMiBAQAogICBzd2l0Y2ggKHByb3BlcnR5X2lkKQogICB7CiAgICAgY2FzZSBQUk9QX1RIUklGVF9TRVJWRVJfUFJPQ0VTU09SOgotICAgICAgc2VydmVyLT5wcm9jZXNzb3IgPSBnX3ZhbHVlX2dldF9vYmplY3QgKHZhbHVlKTsKKyAgICAgIHNlcnZlci0+cHJvY2Vzc29yID0gZ192YWx1ZV9kdXBfb2JqZWN0ICh2YWx1ZSk7CiAgICAgICBicmVhazsKICAgICBjYXNlIFBST1BfVEhSSUZUX1NFUlZFUl9TRVJWRVJfVFJBTlNQT1JUOgotICAgICAgc2VydmVyLT5zZXJ2ZXJfdHJhbnNwb3J0ID0gZ192YWx1ZV9nZXRfb2JqZWN0ICh2YWx1ZSk7CisgICAgICBzZXJ2ZXItPnNlcnZlcl90cmFuc3BvcnQgPSBnX3ZhbHVlX2R1cF9vYmplY3QgKHZhbHVlKTsKICAgICAgIGJyZWFrOwogICAgIGNhc2UgUFJPUF9USFJJRlRfU0VSVkVSX0lOUFVUX1RSQU5TUE9SVF9GQUNUT1JZOgotICAgICAgc2VydmVyLT5pbnB1dF90cmFuc3BvcnRfZmFjdG9yeSA9IGdfdmFsdWVfZ2V0X29iamVjdCAodmFsdWUpOworICAgICAgc2VydmVyLT5pbnB1dF90cmFuc3BvcnRfZmFjdG9yeSA9IGdfdmFsdWVfZHVwX29iamVjdCAodmFsdWUpOwogICAgICAgYnJlYWs7CiAgICAgY2FzZSBQUk9QX1RIUklGVF9TRVJWRVJfT1VUUFVUX1RSQU5TUE9SVF9GQUNUT1JZOgotICAgICAgc2VydmVyLT5vdXRwdXRfdHJhbnNwb3J0X2ZhY3RvcnkgPSBnX3ZhbHVlX2dldF9vYmplY3QgKHZhbHVlKTsKKyAgICAgIHNlcnZlci0+b3V0cHV0X3RyYW5zcG9ydF9mYWN0b3J5ID0gZ192YWx1ZV9kdXBfb2JqZWN0ICh2YWx1ZSk7CiAgICAgICBicmVhazsKICAgICBjYXNlIFBST1BfVEhSSUZUX1NFUlZFUl9JTlBVVF9QUk9UT0NPTF9GQUNUT1JZOgotICAgICAgc2VydmVyLT5pbnB1dF9wcm90b2NvbF9mYWN0b3J5ID0gZ192YWx1ZV9nZXRfb2JqZWN0ICh2YWx1ZSk7CisgICAgICBzZXJ2ZXItPmlucHV0X3Byb3RvY29sX2ZhY3RvcnkgPSBnX3ZhbHVlX2R1cF9vYmplY3QgKHZhbHVlKTsKICAgICAgIGJyZWFrOwogICAgIGNhc2UgUFJPUF9USFJJRlRfU0VSVkVSX09VVFBVVF9QUk9UT0NPTF9GQUNUT1JZOgotICAgICAgc2VydmVyLT5vdXRwdXRfcHJvdG9jb2xfZmFjdG9yeSA9IGdfdmFsdWVfZ2V0X29iamVjdCAodmFsdWUpOworICAgICAgc2VydmVyLT5vdXRwdXRfcHJvdG9jb2xfZmFjdG9yeSA9IGdfdmFsdWVfZHVwX29iamVjdCAodmFsdWUpOwogICAgICAgYnJlYWs7CiAgIH0KIH0KQEAgLTEyMCw3ICsxMjAsMjcgQEAKICAgc2VydmVyLT5vdXRwdXRfcHJvdG9jb2xfZmFjdG9yeSA9IE5VTEw7CiB9CiAKLS8qIGNsYXNzIGluaXRpYWxpemVyIGZvciBUaHJpZnRTZXJ2ZXIKK3N0YXRpYyB2b2lkCit0aHJpZnRfc2VydmVyX2Rpc3Bvc2UgKEdPYmplY3QgKmdvYmplY3QpCit7CisgIFRocmlmdFNlcnZlciAqc2VsZiA9IFRIUklGVF9TRVJWRVIgKGdvYmplY3QpOworCisgIGdfY2xlYXJfb2JqZWN0KCZzZWxmLT5vdXRwdXRfcHJvdG9jb2xfZmFjdG9yeSk7CisgIGdfY2xlYXJfb2JqZWN0KCZzZWxmLT5pbnB1dF9wcm90b2NvbF9mYWN0b3J5KTsKKyAgZ19jbGVhcl9vYmplY3QoJnNlbGYtPm91dHB1dF90cmFuc3BvcnRfZmFjdG9yeSk7CisgIGdfY2xlYXJfb2JqZWN0KCZzZWxmLT5pbnB1dF90cmFuc3BvcnRfZmFjdG9yeSk7CisgIGdfY2xlYXJfb2JqZWN0KCZzZWxmLT5zZXJ2ZXJfdHJhbnNwb3J0KTsKKyAgZ19jbGVhcl9vYmplY3QoJnNlbGYtPnByb2Nlc3Nvcik7CisKKyAgLyogQWx3YXlzIGNoYWluIHVwIHRvIHRoZSBwYXJlbnQgY2xhc3M7IHRoZXJlIGlzIG5vIG5lZWQgdG8gY2hlY2sgaWYKKyAgICogdGhlIHBhcmVudCBjbGFzcyBpbXBsZW1lbnRzIHRoZSBkaXNwb3NlKCkgdmlydHVhbCBmdW5jdGlvbjogaXQgaXMKKyAgICogYWx3YXlzIGd1YXJhbnRlZWQgdG8gZG8gc28KKyAgICovCisgIEdfT0JKRUNUX0NMQVNTICh0aHJpZnRfc2VydmVyX3BhcmVudF9jbGFzcyktPmRpc3Bvc2UoZ29iamVjdCk7Cit9CisKKy8qCisgKiBjbGFzcyBpbml0aWFsaXplciBmb3IgVGhyaWZ0U2VydmVyCiAgKiBUT0RPOiBpbXBsZW1lbnQgU2VydmVyRXZlbnRIYW5kbGVyIGFzIGEgR0Nsb3N1cmUKICAqLwogc3RhdGljIHZvaWQKQEAgLTEzMCw2ICsxNTAsNyBAQAogCiAgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IHRocmlmdF9zZXJ2ZXJfZ2V0X3Byb3BlcnR5OwogICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSB0aHJpZnRfc2VydmVyX3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+ZGlzcG9zZSA9IHRocmlmdF9zZXJ2ZXJfZGlzcG9zZTsKIAogICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAogICAgICAgUFJPUF9USFJJRlRfU0VSVkVSX1BST0NFU1NPUiwKZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvc2VydmVyL3RocmlmdF9zaW1wbGVfc2VydmVyLmMgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3NlcnZlci90aHJpZnRfc2ltcGxlX3NlcnZlci5jCmluZGV4IGNiMjBhYjYuLjIyYTk2YzcgMTAwNjQ0Ci0tLSBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvc2VydmVyL3RocmlmdF9zaW1wbGVfc2VydmVyLmMKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9zZXJ2ZXIvdGhyaWZ0X3NpbXBsZV9zZXJ2ZXIuYwpAQCAtMjcsMTQgKzI3LDE0IEBACiBnYm9vbGVhbgogdGhyaWZ0X3NpbXBsZV9zZXJ2ZXJfc2VydmUgKFRocmlmdFNlcnZlciAqc2VydmVyLCBHRXJyb3IgKiplcnJvcikKIHsKLSAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19TSU1QTEVfU0VSVkVSIChzZXJ2ZXIpLCBGQUxTRSk7Ci0KICAgVGhyaWZ0VHJhbnNwb3J0ICp0ID0gTlVMTDsKICAgVGhyaWZ0VHJhbnNwb3J0ICppbnB1dF90cmFuc3BvcnQgPSBOVUxMLCAqb3V0cHV0X3RyYW5zcG9ydCA9IE5VTEw7CiAgIFRocmlmdFByb3RvY29sICppbnB1dF9wcm90b2NvbCA9IE5VTEwsICpvdXRwdXRfcHJvdG9jb2wgPSBOVUxMOwogICBUaHJpZnRTaW1wbGVTZXJ2ZXIgKnRzcyA9IFRIUklGVF9TSU1QTEVfU0VSVkVSKHNlcnZlcik7CiAgIEdFcnJvciAqcHJvY2Vzc19lcnJvciA9IE5VTEw7CiAKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19TSU1QTEVfU0VSVkVSIChzZXJ2ZXIpLCBGQUxTRSk7CisKICAgaWYgKHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2xpc3RlbiAoc2VydmVyLT5zZXJ2ZXJfdHJhbnNwb3J0LCBlcnJvcikpIHsKICAgICB0c3MtPnJ1bm5pbmcgPSBUUlVFOwogICAgIHdoaWxlICh0c3MtPnJ1bm5pbmcgPT0gVFJVRSkKQEAgLTY5LDExICs2OSwxMSBAQAogICAgICAgICAgIGdfbWVzc2FnZSAoInRocmlmdF9zaW1wbGVfc2VydmVyX3NlcnZlOiAlcyIsIHByb2Nlc3NfZXJyb3ItPm1lc3NhZ2UpOwogICAgICAgICAgIGdfY2xlYXJfZXJyb3IgKCZwcm9jZXNzX2Vycm9yKTsKIAotICAgICAgICAgIC8vIE5vdGUgd2UgZG8gbm90IHByb3BhZ2F0ZSBwcm9jZXNzaW5nIGVycm9ycyB0byB0aGUgY2FsbGVyIGFzIHRoZXkKLSAgICAgICAgICAvLyBub3JtYWxseSBhcmUgdHJhbnNpZW50IGFuZCBub3QgZmF0YWwgdG8gdGhlIHNlcnZlcgorICAgICAgICAgIC8qIE5vdGUgd2UgZG8gbm90IHByb3BhZ2F0ZSBwcm9jZXNzaW5nIGVycm9ycyB0byB0aGUgY2FsbGVyIGFzIHRoZXkKKyAgICAgICAgICAgKiBub3JtYWxseSBhcmUgdHJhbnNpZW50IGFuZCBub3QgZmF0YWwgdG8gdGhlIHNlcnZlciAqLwogICAgICAgICB9CiAKLSAgICAgICAgLy8gVE9ETzogaGFuZGxlIGV4Y2VwdGlvbnMKKyAgICAgICAgLyogVE9ETzogaGFuZGxlIGV4Y2VwdGlvbnMgKi8KICAgICAgICAgVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKGlucHV0X3RyYW5zcG9ydCktPmNsb3NlIChpbnB1dF90cmFuc3BvcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CiAgICAgICAgIFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTIChvdXRwdXRfdHJhbnNwb3J0KS0+Y2xvc2UgKG91dHB1dF90cmFuc3BvcnQsCkBAIC04MSwxMyArODEsMTMgQEAKICAgICAgIH0KICAgICB9CiAKLSAgICAvLyBhdHRlbXB0IHRvIHNodXRkb3duCisgICAgLyogYXR0ZW1wdCB0byBzaHV0ZG93biAqLwogICAgIFRIUklGVF9TRVJWRVJfVFJBTlNQT1JUX0dFVF9DTEFTUyAoc2VydmVyLT5zZXJ2ZXJfdHJhbnNwb3J0KQogICAgICAgLT5jbG9zZSAoc2VydmVyLT5zZXJ2ZXJfdHJhbnNwb3J0LCBOVUxMKTsKICAgfQogCi0gIC8vIFNpbmNlIHRoaXMgbWV0aG9kIGlzIGRlc2lnbmVkIHRvIHJ1biBmb3JldmVyLCBpdCBjYW4gb25seSBldmVyIHJldHVybiBvbgotICAvLyBlcnJvcgorICAvKiBTaW5jZSB0aGlzIG1ldGhvZCBpcyBkZXNpZ25lZCB0byBydW4gZm9yZXZlciwgaXQgY2FuIG9ubHkgZXZlciByZXR1cm4gb24KKyAgICogZXJyb3IgKi8KICAgcmV0dXJuIEZBTFNFOwogfQogCkBAIC0xMDEsMTAgKzEwMSwxMCBAQAogc3RhdGljIHZvaWQKIHRocmlmdF9zaW1wbGVfc2VydmVyX2luaXQgKFRocmlmdFNpbXBsZVNlcnZlciAqdHNzKQogewotICB0c3MtPnJ1bm5pbmcgPSBGQUxTRTsKLQogICBUaHJpZnRTZXJ2ZXIgKnNlcnZlciA9IFRIUklGVF9TRVJWRVIodHNzKTsKIAorICB0c3MtPnJ1bm5pbmcgPSBGQUxTRTsKKwogICBpZiAoc2VydmVyLT5pbnB1dF90cmFuc3BvcnRfZmFjdG9yeSA9PSBOVUxMKQogICB7CiAgICAgc2VydmVyLT5pbnB1dF90cmFuc3BvcnRfZmFjdG9yeSA9CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RocmlmdC5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90aHJpZnQuYwppbmRleCAwNzljYjUxLi44ZGU4NjlmIDEwMDY0NAotLS0gYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RocmlmdC5jCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdGhyaWZ0LmMKQEAgLTI1LDEwICsyNSw3MyBAQAogdm9pZAogdGhyaWZ0X2hhc2hfdGFibGVfZ2V0X2tleXMgKGdwb2ludGVyIGtleSwgZ3BvaW50ZXIgdmFsdWUsIGdwb2ludGVyIHVzZXJfZGF0YSkKIHsKLSAgVEhSSUZUX1VOVVNFRF9WQVIgKHZhbHVlKTsKICAgR0xpc3QgKipsaXN0ID0gKEdMaXN0ICoqKSB1c2VyX2RhdGE7CisKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHZhbHVlKTsKKwogICAqbGlzdCA9IGdfbGlzdF9hcHBlbmQgKCpsaXN0LCBrZXkpOwogfQordm9pZCB0aHJpZnRfc2FmZV9oYXNoX3RhYmxlX2Rlc3Ryb3koR0hhc2hUYWJsZSogaGFzaF90YWJsZSkKK3sKKyAgaWYgKGhhc2hfdGFibGUpCisgIHsKKyAgICBnX2hhc2hfdGFibGVfZGVzdHJveShoYXNoX3RhYmxlKTsKKyAgfQorfQorCitndWludCB0aHJpZnRfYm9vbGVhbl9oYXNoKGdjb25zdHBvaW50ZXIgdikKK3sKKyAgY29uc3QgZ2Jvb2xlYW4qIHAgPSB2OworICByZXR1cm4gcCAmJiAqcCA/IDEgOiAwOworfQorZ2Jvb2xlYW4gdGhyaWZ0X2Jvb2xlYW5fZXF1YWwoZ2NvbnN0cG9pbnRlciBhLCBnY29uc3Rwb2ludGVyIGIpCit7CisgIGlmIChhID09IGIpIHsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBpZiAoIWEgfHwgIWIpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgY29uc3QgZ2Jvb2xlYW4qIHBhID0gYTsKKyAgY29uc3QgZ2Jvb2xlYW4qIHBiID0gYjsKKyAgcmV0dXJuICpwYSA9PSAqcGI7Cit9CisKK2d1aW50IHRocmlmdF9pbnQ4X2hhc2goZ2NvbnN0cG9pbnRlciB2KQoreworICBjb25zdCBnaW50OCogcCA9IHY7CisgIHJldHVybiBwID8gKnAgOiAwOworfQorZ2Jvb2xlYW4gdGhyaWZ0X2ludDhfZXF1YWwoZ2NvbnN0cG9pbnRlciBhLCBnY29uc3Rwb2ludGVyIGIpCit7CisgIGlmIChhID09IGIpIHsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBpZiAoIWEgfHwgIWIpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgY29uc3QgZ2ludDgqIHBhID0gYTsKKyAgY29uc3QgZ2ludDgqIHBiID0gYjsKKyAgcmV0dXJuICpwYSA9PSAqcGI7Cit9CisKK2d1aW50IHRocmlmdF9pbnQxNl9oYXNoKGdjb25zdHBvaW50ZXIgdikKK3sKKyAgY29uc3QgZ2ludDE2KiBwID0gdjsKKyAgcmV0dXJuIHAgPyAqcCA6IDA7Cit9CitnYm9vbGVhbiB0aHJpZnRfaW50MTZfZXF1YWwoZ2NvbnN0cG9pbnRlciBhLCBnY29uc3Rwb2ludGVyIGIpCit7CisgIGlmIChhID09IGIpIHsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBpZiAoIWEgfHwgIWIpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgY29uc3QgZ2ludDE2KiBwYSA9IGE7CisgIGNvbnN0IGdpbnQxNiogcGIgPSBiOworICByZXR1cm4gKnBhID09ICpwYjsKK30KIAogdm9pZAogdGhyaWZ0X3N0cmluZ19mcmVlIChncG9pbnRlciBzdHIpCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RocmlmdC5oIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90aHJpZnQuaAppbmRleCAyMzZiNDZmLi45NGE2NDc4IDEwMDY0NAotLS0gYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RocmlmdC5oCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdGhyaWZ0LmgKQEAgLTMzLDYgKzMzLDE3IEBACiAKIHZvaWQgdGhyaWZ0X2hhc2hfdGFibGVfZ2V0X2tleXMgKGdwb2ludGVyIGtleSwgZ3BvaW50ZXIgdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncG9pbnRlciB1c2VyX2RhdGEpOwordm9pZCB0aHJpZnRfc2FmZV9oYXNoX3RhYmxlX2Rlc3Ryb3koR0hhc2hUYWJsZSogaGFzaF90YWJsZSk7CisKK2d1aW50IHRocmlmdF9ib29sZWFuX2hhc2goZ2NvbnN0cG9pbnRlciB2KTsKK2dib29sZWFuIHRocmlmdF9ib29sZWFuX2VxdWFsKGdjb25zdHBvaW50ZXIgYSwgZ2NvbnN0cG9pbnRlciBiKTsKKworZ3VpbnQgdGhyaWZ0X2ludDhfaGFzaChnY29uc3Rwb2ludGVyIHYpOworZ2Jvb2xlYW4gdGhyaWZ0X2ludDhfZXF1YWwoZ2NvbnN0cG9pbnRlciBhLCBnY29uc3Rwb2ludGVyIGIpOworCitndWludCB0aHJpZnRfaW50MTZfaGFzaChnY29uc3Rwb2ludGVyIHYpOworZ2Jvb2xlYW4gdGhyaWZ0X2ludDE2X2VxdWFsKGdjb25zdHBvaW50ZXIgYSwgZ2NvbnN0cG9pbnRlciBiKTsKKwogdm9pZCB0aHJpZnRfc3RyaW5nX2ZyZWUgKGdwb2ludGVyIHN0cik7CiAKLSNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVEhSSUZUX0gKKyNlbmRpZiAvKiAjaWZuZGVmIF9USFJJRlRfVEhSSUZUX0ggKi8KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnQuYyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnQuYwppbmRleCBlZThlMWFhLi4wYWIzZTkzIDEwMDY0NAotLS0gYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0LmMKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydC5jCkBAIC0xNyw3ICsxNyw2IEBACiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+CiAjaW5jbHVkZSA8bmV0ZGIuaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdGRpby5oPgpAQCAtODAsMTMgKzc5LDEzIEBACiAgIGdpbnQgcmV0ID0gMDsKICAgZ3VpbnQzMiB3YW50ID0gbGVuOwogICBndWludDMyIGdvdCA9IDA7Ci0gIGd1Y2hhciB0bXBkYXRhW2xlbl07CisgIGd1Y2hhciAqdG1wZGF0YSA9IGdfYWxsb2NhIChsZW4pOwogICBndWludDMyIGhhdmUgPSB0LT5yX2J1Zi0+bGVuOwogCi0gIC8vIHdlIHNob3VsZG4ndCBoaXQgdGhpcyB1bmxlc3MgdGhlIGJ1ZmZlciBkb2Vzbid0IGhhdmUgZW5vdWdoIHRvIHJlYWQKLSAgYXNzZXJ0ICh0LT5yX2J1Zi0+bGVuIDwgd2FudCk7CisgIC8qIHdlIHNob3VsZG4ndCBoaXQgdGhpcyB1bmxlc3MgdGhlIGJ1ZmZlciBkb2Vzbid0IGhhdmUgZW5vdWdoIHRvIHJlYWQgKi8KKyAgZ19hc3NlcnQgKHQtPnJfYnVmLT5sZW4gPCB3YW50KTsKIAotICAvLyBmaXJzdCBjb3B5IHdoYXQgd2UgaGF2ZSBpbiBvdXIgYnVmZmVyLgorICAvKiBmaXJzdCBjb3B5IHdoYXQgd2UgaGF2ZSBpbiBvdXIgYnVmZmVyLiAqLwogICBpZiAoaGF2ZSA+IDApCiAgIHsKICAgICBtZW1jcHkgKGJ1ZiwgdC0+cl9idWYsIHQtPnJfYnVmLT5sZW4pOwpAQCAtOTQsOSArOTMsOSBAQAogICAgIHQtPnJfYnVmID0gZ19ieXRlX2FycmF5X3JlbW92ZV9yYW5nZSAodC0+cl9idWYsIDAsIHQtPnJfYnVmLT5sZW4pOwogICB9CiAKLSAgLy8gaWYgdGhlIGJ1ZmZlciBpcyBzdGlsbCBzbWFsbGVyIHRoYW4gd2hhdCB3ZSB3YW50IHRvIHJlYWQsIHRoZW4ganVzdAotICAvLyByZWFkIGl0IGRpcmVjdGx5LiAgb3RoZXJ3aXNlLCBmaWxsIHRoZSBidWZmZXIgYW5kIHRoZW4gZ2l2ZSBvdXQKLSAgLy8gZW5vdWdoIHRvIHNhdGlzZnkgdGhlIHJlYWQuCisgIC8qIGlmIHRoZSBidWZmZXIgaXMgc3RpbGwgc21hbGxlciB0aGFuIHdoYXQgd2Ugd2FudCB0byByZWFkLCB0aGVuIGp1c3QKKyAgICogcmVhZCBpdCBkaXJlY3RseS4gIG90aGVyd2lzZSwgZmlsbCB0aGUgYnVmZmVyIGFuZCB0aGVuIGdpdmUgb3V0CisgICAqIGVub3VnaCB0byBzYXRpc2Z5IHRoZSByZWFkLiAqLwogICBpZiAodC0+cl9idWZfc2l6ZSA8IHdhbnQpCiAgIHsKICAgICBpZiAoKHJldCA9IFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0LT50cmFuc3BvcnQpLT5yZWFkICh0LT50cmFuc3BvcnQsCkBAIC0xMDcsMTAgKzEwNiwxMiBAQAogICAgIH0KICAgICBnb3QgKz0gcmV0OwogCi0gICAgLy8gY29weSB0aGUgZGF0YSBzdGFydGluZyBmcm9tIHdoZXJlIHdlIGxlZnQgb2ZmCi0gICAgbWVtY3B5IChidWYgKyBoYXZlLCB0bXBkYXRhLCBnb3QpOworICAgIC8qIGNvcHkgdGhlIGRhdGEgc3RhcnRpbmcgZnJvbSB3aGVyZSB3ZSBsZWZ0IG9mZiAqLworICAgIG1lbWNweSAoKGd1aW50OCAqKWJ1ZiArIGhhdmUsIHRtcGRhdGEsIGdvdCk7CiAgICAgcmV0dXJuIGdvdCArIGhhdmU7IAogICB9IGVsc2UgeworICAgIGd1aW50MzIgZ2l2ZTsKKwogICAgIGlmICgocmV0ID0gVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHQtPnRyYW5zcG9ydCktPnJlYWQgKHQtPnRyYW5zcG9ydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhbnQsCkBAIC0xMjAsMTEgKzEyMSwxMSBAQAogICAgIGdvdCArPSByZXQ7CiAgICAgdC0+cl9idWYgPSBnX2J5dGVfYXJyYXlfYXBwZW5kICh0LT5yX2J1ZiwgdG1wZGF0YSwgZ290KTsKICAgICAKLSAgICAvLyBoYW5kIG92ZXIgd2hhdCB3ZSBoYXZlIHVwIHRvIHdoYXQgdGhlIGNhbGxlciB3YW50cwotICAgIGd1aW50MzIgZ2l2ZSA9IHdhbnQgPCB0LT5yX2J1Zi0+bGVuID8gd2FudCA6IHQtPnJfYnVmLT5sZW47CisgICAgLyogaGFuZCBvdmVyIHdoYXQgd2UgaGF2ZSB1cCB0byB3aGF0IHRoZSBjYWxsZXIgd2FudHMgKi8KKyAgICBnaXZlID0gd2FudCA8IHQtPnJfYnVmLT5sZW4gPyB3YW50IDogdC0+cl9idWYtPmxlbjsKIAogCi0gICAgbWVtY3B5IChidWYgKyBsZW4gLSB3YW50LCB0LT5yX2J1Zi0+ZGF0YSwgZ2l2ZSk7CisgICAgbWVtY3B5ICgoZ3VpbnQ4ICopYnVmICsgbGVuIC0gd2FudCwgdC0+cl9idWYtPmRhdGEsIGdpdmUpOwogICAgIHQtPnJfYnVmID0gZ19ieXRlX2FycmF5X3JlbW92ZV9yYW5nZSAodC0+cl9idWYsIDAsIGdpdmUpOwogICAgIHdhbnQgLT0gZ2l2ZTsKIApAQCAtMTcwLDggKzE3MSw4IEBACiAgIGd1aW50MzIgaGF2ZV9ieXRlcyA9IHQtPndfYnVmLT5sZW47CiAgIGd1aW50MzIgc3BhY2UgPSB0LT53X2J1Zl9zaXplIC0gdC0+d19idWYtPmxlbjsKIAotICAvLyB3ZSBuZWVkIHR3byBzeXNjYWxscyBiZWNhdXNlIHRoZSBidWZmZXJlZCBkYXRhIHBsdXMgdGhlIGJ1ZmZlciBpdHNlbGYKLSAgLy8gaXMgdG9vIGJpZy4KKyAgLyogd2UgbmVlZCB0d28gc3lzY2FsbHMgYmVjYXVzZSB0aGUgYnVmZmVyZWQgZGF0YSBwbHVzIHRoZSBidWZmZXIgaXRzZWxmCisgICAqIGlzIHRvbyBiaWcuICovCiAgIGlmICgoaGF2ZV9ieXRlcyArIGxlbiA+PSAyKnQtPndfYnVmX3NpemUpIHx8IChoYXZlX2J5dGVzID09IDApKQogICB7CiAgICAgaWYgKGhhdmVfYnl0ZXMgPiAwKQpAQCAtMjAwLDcgKzIwMSw3IEBACiAgIH0KIAogICB0LT53X2J1ZiA9IGdfYnl0ZV9hcnJheV9yZW1vdmVfcmFuZ2UgKHQtPndfYnVmLCAwLCB0LT53X2J1Zi0+bGVuKTsKLSAgdC0+d19idWYgPSBnX2J5dGVfYXJyYXlfYXBwZW5kICh0LT53X2J1ZiwgYnVmK3NwYWNlLCBsZW4tc3BhY2UpOworICB0LT53X2J1ZiA9IGdfYnl0ZV9hcnJheV9hcHBlbmQgKHQtPndfYnVmLCAoZ3VpbnQ4ICopYnVmICsgc3BhY2UsIGxlbi1zcGFjZSk7CiAKICAgcmV0dXJuIFRSVUU7CiB9CkBAIC0yNDIsNyArMjQzLDcgQEAKIAogICBpZiAodC0+d19idWYgIT0gTlVMTCAmJiB0LT53X2J1Zi0+bGVuID4gMCkKICAgewotICAgIC8vIHdyaXRlIHRoZSBidWZmZXIgYW5kIHRoZW4gZW1wdHkgaXQKKyAgICAvKiB3cml0ZSB0aGUgYnVmZmVyIGFuZCB0aGVuIGVtcHR5IGl0ICovCiAgICAgaWYgKCFUSFJJRlRfVFJBTlNQT1JUX0dFVF9DTEFTUyAodC0+dHJhbnNwb3J0KS0+d3JpdGUgKHQtPnRyYW5zcG9ydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC0+d19idWYtPmRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQtPndfYnVmLT5sZW4sCkBAIC0yOTAsOSArMjkxLDEwIEBACiB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2dldF9wcm9wZXJ0eSAoR09iamVjdCAqb2JqZWN0LCBndWludCBwcm9wZXJ0eV9pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHVmFsdWUgKnZhbHVlLCBHUGFyYW1TcGVjICpwc3BlYykKIHsKLSAgVEhSSUZUX1VOVVNFRF9WQVIgKHBzcGVjKTsKICAgVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnQgKnRyYW5zcG9ydCA9IFRIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlQgKG9iamVjdCk7CiAKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHBzcGVjKTsKKwogICBzd2l0Y2ggKHByb3BlcnR5X2lkKQogICB7CiAgICAgY2FzZSBQUk9QX1RIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlRfVFJBTlNQT1JUOgpAQCAtMzEyLDkgKzMxNCwxMCBAQAogdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9zZXRfcHJvcGVydHkgKEdPYmplY3QgKm9iamVjdCwgZ3VpbnQgcHJvcGVydHlfaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR1ZhbHVlICp2YWx1ZSwgR1BhcmFtU3BlYyAqcHNwZWMpCiB7Ci0gIFRIUklGVF9VTlVTRURfVkFSIChwc3BlYyk7CiAgIFRocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBUSFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUIChvYmplY3QpOwogCisgIFRIUklGVF9VTlVTRURfVkFSIChwc3BlYyk7CisKICAgc3dpdGNoIChwcm9wZXJ0eV9pZCkKICAgewogICAgIGNhc2UgUFJPUF9USFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUX1RSQU5TUE9SVDoKQEAgLTMzMyw2ICszMzYsNyBAQAogc3RhdGljIHZvaWQKIHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfY2xhc3NfaW5pdCAoVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnRDbGFzcyAqY2xzKQogeworICBUaHJpZnRUcmFuc3BvcnRDbGFzcyAqdHRjID0gVEhSSUZUX1RSQU5TUE9SVF9DTEFTUyAoY2xzKTsKICAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGNscyk7CiAgIEdQYXJhbVNwZWMgKnBhcmFtX3NwZWMgPSBOVUxMOwogCkBAIC0zNzMsOCArMzc3LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1fc3BlYyk7CiAKIAotICBUaHJpZnRUcmFuc3BvcnRDbGFzcyAqdHRjID0gVEhSSUZUX1RSQU5TUE9SVF9DTEFTUyAoY2xzKTsKLQogICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfZmluYWxpemU7CiAgIHR0Yy0+aXNfb3BlbiA9IHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfaXNfb3BlbjsKICAgdHRjLT5wZWVrID0gdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9wZWVrOwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZkX3RyYW5zcG9ydC5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZkX3RyYW5zcG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0YWJmZjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZmRfdHJhbnNwb3J0LmMKQEAgLTAsMCArMSwyNjUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGdsaWIuaD4KKyNpbmNsdWRlIDxnbGliL2dzdGRpby5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZkX3RyYW5zcG9ydC5oPgorCisvKiBvYmplY3QgcHJvcGVydGllcyAqLworZW51bSBfVGhyaWZ0RkRUcmFuc3BvcnRQcm9wZXJ0aWVzCit7CisgIFBST1BfMCwKKyAgUFJPUF9USFJJRlRfRkRfVFJBTlNQT1JUX0ZECit9OworCitHX0RFRklORV9UWVBFIChUaHJpZnRGRFRyYW5zcG9ydCwgdGhyaWZ0X2ZkX3RyYW5zcG9ydCwgVEhSSUZUX1RZUEVfVFJBTlNQT1JUKQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfaXNfb3BlbiAqLworZ2Jvb2xlYW4KK3RocmlmdF9mZF90cmFuc3BvcnRfaXNfb3BlbiAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQpCit7CisgIFRocmlmdEZEVHJhbnNwb3J0ICp0OworICB0ID0gVEhSSUZUX0ZEX1RSQU5TUE9SVCAodHJhbnNwb3J0KTsKKyAgcmV0dXJuIHQtPmZkID49IDAgJiYgISAoZmNudGwgKHQtPmZkLCBGX0dFVEZMKSA9PSAtMSAmJiBlcnJubyA9PSBFQkFERik7Cit9CisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9vcGVuICovCitnYm9vbGVhbgordGhyaWZ0X2ZkX3RyYW5zcG9ydF9vcGVuIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIHJldHVybiB0aHJpZnRfZmRfdHJhbnNwb3J0X2lzX29wZW4gKHRyYW5zcG9ydCk7Cit9CisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9jbG9zZSAqLworZ2Jvb2xlYW4KK3RocmlmdF9mZF90cmFuc3BvcnRfY2xvc2UgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0RkRUcmFuc3BvcnQgKnQ7CisgIHQgPSBUSFJJRlRfRkRfVFJBTlNQT1JUICh0cmFuc3BvcnQpOworCisjaWYgR0xJQl9DSEVDS19WRVJTSU9OICgyLCAzNiwgMCkKKyAgcmV0dXJuIGdfY2xvc2UgKHQtPmZkLCBlcnJvcik7CisjZWxzZQorICBpZiAoY2xvc2UgKHQtPmZkKSA9PSAwKSB7CisgICAgZ19jbGVhcl9lcnJvciAoZXJyb3IpOworICAgIHJldHVybiBUUlVFOworICB9IGVsc2UgeworICAgIGdfc2V0X2Vycm9yIChlcnJvciwKKyAgICAgICAgICAgICAgICAgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUl9DTE9TRSwKKyAgICAgICAgICAgICAgICAgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisjZW5kaWYKK30KKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X3JlYWQgKi8KK2dpbnQzMgordGhyaWZ0X2ZkX3RyYW5zcG9ydF9yZWFkIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgZ3BvaW50ZXIgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdEZEVHJhbnNwb3J0ICp0OworICBzc2l6ZV90IG47CisKKyAgdCA9IFRIUklGVF9GRF9UUkFOU1BPUlQgKHRyYW5zcG9ydCk7CisgIG4gPSByZWFkICh0LT5mZCwgKGd1aW50OCAqKSBidWYsIGxlbik7CisgIGlmIChuID09IC0xKSB7CisgICAgZ19zZXRfZXJyb3IgKGVycm9yLAorICAgICAgICAgICAgICAgICBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SLAorICAgICAgICAgICAgICAgICBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SX1JFQ0VJVkUsCisgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gcmVhZCBmcm9tIGZkOiAlcyIsCisgICAgICAgICAgICAgICAgIHN0cmVycm9yIChlcnJubykpOworICAgIHJldHVybiAtMTsKKyAgfQorICByZXR1cm4gbjsKK30KKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfZW5kCisgKiBjYWxsZWQgd2hlbiB3cml0ZSBpcyBjb21wbGV0ZS4gIG5vdGhpbmcgdG8gZG8gb24gb3VyIGVuZC4gKi8KK2dib29sZWFuCit0aHJpZnRfZmRfdHJhbnNwb3J0X3JlYWRfZW5kIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIC8qIHNhdGlzZnkgLVdhbGwgKi8KKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHRyYW5zcG9ydCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIHJldHVybiBUUlVFOworfQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfd3JpdGUgKi8KK2dib29sZWFuCit0aHJpZnRfZmRfdHJhbnNwb3J0X3dyaXRlIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdwb2ludGVyIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0RkRUcmFuc3BvcnQgKnQ7CisgIGd1aW50OCAqX2J1ZjsKKyAgZ3VpbnQzMiBfbGVuOworICBzc2l6ZV90IG47CisKKyAgdCA9IFRIUklGVF9GRF9UUkFOU1BPUlQgKHRyYW5zcG9ydCk7CisgIF9idWYgPSAoZ3VpbnQ4ICopIGJ1ZjsKKyAgX2xlbiA9IGxlbjsKKyAgd2hpbGUgKF9sZW4gPiAwKSB7CisgICAgbiA9IHdyaXRlICh0LT5mZCwgX2J1ZiwgX2xlbik7CisgICAgaWYgKG4gPT0gLTEpIHsKKyAgICAgIGdfc2V0X2Vycm9yIChlcnJvciwKKyAgICAgICAgICAgICAgICAgICBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SLAorICAgICAgICAgICAgICAgICAgIFRIUklGVF9UUkFOU1BPUlRfRVJST1JfU0VORCwKKyAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHdyaXRlIGZyb20gZmQ6ICVzIiwKKyAgICAgICAgICAgICAgICAgICBzdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9IGVsc2UgeworICAgICAgX2J1ZiArPSBuOworICAgICAgX2xlbiAtPSBuOworICAgIH0KKyAgfQorICByZXR1cm4gVFJVRTsKK30KKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X3dyaXRlX2VuZAorICogY2FsbGVkIHdoZW4gd3JpdGUgaXMgY29tcGxldGUuICBub3RoaW5nIHRvIGRvIG9uIG91ciBlbmQuICovCitnYm9vbGVhbgordGhyaWZ0X2ZkX3RyYW5zcG9ydF93cml0ZV9lbmQgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHRyYW5zcG9ydCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIHJldHVybiBUUlVFOworfQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKi8KK2dib29sZWFuCit0aHJpZnRfZmRfdHJhbnNwb3J0X2ZsdXNoIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdEZEVHJhbnNwb3J0ICp0OworICB0ID0gVEhSSUZUX0ZEX1RSQU5TUE9SVCAodHJhbnNwb3J0KTsKKyAgaWYgKGZzeW5jICh0LT5mZCkgPT0gLTEpIHsKKyAgICBnX3NldF9lcnJvciAoZXJyb3IsCisgICAgICAgICAgICAgICAgIFRIUklGVF9UUkFOU1BPUlRfRVJST1IsCisgICAgICAgICAgICAgICAgIFRIUklGVF9UUkFOU1BPUlRfRVJST1JfVU5LTk9XTiwKKyAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBmbHVzaCBmZDogJXMiLAorICAgICAgICAgICAgICAgICBzdHJlcnJvciAoZXJybm8pKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KK30KKworLyogaW5pdGlhbGl6ZXMgdGhlIGluc3RhbmNlICovCitzdGF0aWMgdm9pZAordGhyaWZ0X2ZkX3RyYW5zcG9ydF9pbml0IChUaHJpZnRGRFRyYW5zcG9ydCAqdHJhbnNwb3J0KQoreworICB0cmFuc3BvcnQtPmZkID0gLTE7Cit9CisKKy8qIGRlc3RydWN0b3IgKi8KK3N0YXRpYyB2b2lkCit0aHJpZnRfZmRfdHJhbnNwb3J0X2ZpbmFsaXplIChHT2JqZWN0ICpvYmplY3QpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChvYmplY3QpOworfQorCisvKiBwcm9wZXJ0eSBhY2Nlc3NvciAqLwordm9pZAordGhyaWZ0X2ZkX3RyYW5zcG9ydF9nZXRfcHJvcGVydHkgKEdPYmplY3QgKm9iamVjdCwgZ3VpbnQgcHJvcGVydHlfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1ZhbHVlICp2YWx1ZSwgR1BhcmFtU3BlYyAqcHNwZWMpCit7CisgIFRocmlmdEZEVHJhbnNwb3J0ICp0OworCisgIFRIUklGVF9VTlVTRURfVkFSIChwc3BlYyk7CisKKyAgdCA9IFRIUklGVF9GRF9UUkFOU1BPUlQgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wZXJ0eV9pZCkgeworICAgIGNhc2UgUFJPUF9USFJJRlRfRkRfVFJBTlNQT1JUX0ZEOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgdC0+ZmQpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wZXJ0eV9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworLyogcHJvcGVydHkgbXV0YXRvciAqLwordm9pZAordGhyaWZ0X2ZkX3RyYW5zcG9ydF9zZXRfcHJvcGVydHkgKEdPYmplY3QgKm9iamVjdCwgZ3VpbnQgcHJvcGVydHlfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR1ZhbHVlICp2YWx1ZSwgR1BhcmFtU3BlYyAqcHNwZWMpCit7CisgIFRocmlmdEZEVHJhbnNwb3J0ICp0OworCisgIFRIUklGVF9VTlVTRURfVkFSIChwc3BlYyk7CisKKyAgdCA9IFRIUklGVF9GRF9UUkFOU1BPUlQgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wZXJ0eV9pZCkgeworICAgIGNhc2UgUFJPUF9USFJJRlRfRkRfVFJBTlNQT1JUX0ZEOgorICAgICAgdC0+ZmQgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcGVydHlfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKKy8qIGluaXRpYWxpemVzIHRoZSBjbGFzcyAqLworc3RhdGljIHZvaWQKK3RocmlmdF9mZF90cmFuc3BvcnRfY2xhc3NfaW5pdCAoVGhyaWZ0RkRUcmFuc3BvcnRDbGFzcyAqY2xzKQoreworICBUaHJpZnRUcmFuc3BvcnRDbGFzcyAqdHRjOworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdQYXJhbVNwZWMgKnBhcmFtX3NwZWM7CisKKyAgdHRjID0gVEhSSUZUX1RSQU5TUE9SVF9DTEFTUyAoY2xzKTsKKyAgZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChjbHMpOworICBwYXJhbV9zcGVjID0gTlVMTDsKKworICAvKiBzZXR1cCBhY2Nlc3NvcnMgYW5kIG11dGF0b3JzICovCisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IHRocmlmdF9mZF90cmFuc3BvcnRfZ2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSB0aHJpZnRfZmRfdHJhbnNwb3J0X3NldF9wcm9wZXJ0eTsKKworICBwYXJhbV9zcGVjID0gZ19wYXJhbV9zcGVjX2ludCAoImZkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmaWxlIGRlc2NyaXB0b3IgKGNvbnN0cnVjdCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNldCB0aGUgZmlsZSBkZXNjcmlwdG9yIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVF9NSU4sIC8qIG1pbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UX01BWCwgLyogbWF4LCAxMDI0KjEwMjQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLCAvKiBkZWZhdWx0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX0NPTlNUUlVDVF9PTkxZIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPUF9USFJJRlRfRkRfVFJBTlNQT1JUX0ZELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbV9zcGVjKTsKKworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IHRocmlmdF9mZF90cmFuc3BvcnRfZmluYWxpemU7CisgIHR0Yy0+aXNfb3BlbiA9IHRocmlmdF9mZF90cmFuc3BvcnRfaXNfb3BlbjsKKyAgdHRjLT5vcGVuID0gdGhyaWZ0X2ZkX3RyYW5zcG9ydF9vcGVuOworICB0dGMtPmNsb3NlID0gdGhyaWZ0X2ZkX3RyYW5zcG9ydF9jbG9zZTsKKyAgdHRjLT5yZWFkID0gdGhyaWZ0X2ZkX3RyYW5zcG9ydF9yZWFkOworICB0dGMtPnJlYWRfZW5kID0gdGhyaWZ0X2ZkX3RyYW5zcG9ydF9yZWFkX2VuZDsKKyAgdHRjLT53cml0ZSA9IHRocmlmdF9mZF90cmFuc3BvcnRfd3JpdGU7CisgIHR0Yy0+d3JpdGVfZW5kID0gdGhyaWZ0X2ZkX3RyYW5zcG9ydF93cml0ZV9lbmQ7CisgIHR0Yy0+Zmx1c2ggPSB0aHJpZnRfZmRfdHJhbnNwb3J0X2ZsdXNoOworfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZkX3RyYW5zcG9ydC5oIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZkX3RyYW5zcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlNmQ1YzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZmRfdHJhbnNwb3J0LmgKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfRkRfVFJBTlNQT1JUX0gKKyNkZWZpbmUgX1RIUklGVF9GRF9UUkFOU1BPUlRfSAorCisjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KKworI2luY2x1ZGUgInRocmlmdF90cmFuc3BvcnQuaCIKKworR19CRUdJTl9ERUNMUworCisvKiEgXGZpbGUgdGhyaWZ0X2ZkX3RyYW5zcG9ydC5oCisgKiAgXGJyaWVmIENsYXNzIGZvciBUaHJpZnQgZmlsZSBkZXNjcmlwdG9yIHRyYW5zcG9ydHMuCisgKi8KKworLyogdHlwZSBtYWNyb3MgKi8KKyNkZWZpbmUgVEhSSUZUX1RZUEVfRkRfVFJBTlNQT1JUICh0aHJpZnRfZmRfdHJhbnNwb3J0X2dldF90eXBlICgpKQorI2RlZmluZSBUSFJJRlRfRkRfVFJBTlNQT1JUKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBUSFJJRlRfVFlQRV9GRF9UUkFOU1BPUlQsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRGRFRyYW5zcG9ydCkpCisjZGVmaW5lIFRIUklGVF9JU19GRF9UUkFOU1BPUlQob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIFRIUklGVF9UWVBFX0ZEX1RSQU5TUE9SVCkpCisjZGVmaW5lIFRIUklGVF9GRF9UUkFOU1BPUlRfQ0xBU1MoYykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgVEhSSUZUX1RZUEVfRkRfVFJBTlNQT1JULCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0RkRUcmFuc3BvcnRDbGFzcykpCisjZGVmaW5lIFRIUklGVF9JU19GRF9UUkFOU1BPUlRfQ0xBU1MoYykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgVEhSSUZUX1RZUEVfRkRfVFJBTlNQT1JUKSkKKyNkZWZpbmUgVEhSSUZUX0ZEX1RSQU5TUE9SVF9HRVRfQ0xBU1Mob2JqKSBcCisgIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgVEhSSUZUX1RZUEVfRkRfVFJBTlNQT1JULCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRGRFRyYW5zcG9ydENsYXNzKSkKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdEZEVHJhbnNwb3J0IFRocmlmdEZEVHJhbnNwb3J0OworCitzdHJ1Y3QgX1RocmlmdEZEVHJhbnNwb3J0Cit7CisgIFRocmlmdFRyYW5zcG9ydCBwYXJlbnQ7CisKKyAgLyogcHJvdGVjdGVkICovCisgIGdpbnQgZmQ7Cit9OworCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0RkRUcmFuc3BvcnRDbGFzcyBUaHJpZnRGRFRyYW5zcG9ydENsYXNzOworCisvKiEKKyAqIFRocmlmdCBUcmFuc3BvcnQgY2xhc3MKKyAqLworc3RydWN0IF9UaHJpZnRGRFRyYW5zcG9ydENsYXNzCit7CisgIFRocmlmdFRyYW5zcG9ydENsYXNzIHBhcmVudDsKK307CisKKy8qIHVzZWQgYnkgVEhSSUZUX1RZUEVfRkRfVFJBTlNQT1JUICovCitHVHlwZSB0aHJpZnRfZmRfdHJhbnNwb3J0X2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9USFJJRlRfRkRfVFJBTlNQT1JUX0ggKi8KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0LmMgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydC5jCmluZGV4IDQ3YTc5NjAuLmM1NDgyNDYgMTAwNjQ0Ci0tLSBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0LmMKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQuYwpAQCAtMTcsNyArMTcsNiBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPG5ldGRiLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KQEAgLTg5LDEwICs4OCwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgKHN6KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpID09IHNpemVvZiAoc3opKQogICB7CisgICAgZ3VjaGFyICp0bXBkYXRhOworCiAgICAgc3ogPSBudG9obCAoc3opOwogCiAgICAgLyogY3JlYXRlIGEgYnVmZmVyIHRvIGhvbGQgdGhlIGRhdGEgYW5kIHJlYWQgdGhhdCBtdWNoIGRhdGEgKi8KLSAgICBndWNoYXIgdG1wZGF0YVtzel07CisgICAgdG1wZGF0YSA9IGdfYWxsb2NhIChzeik7CiAgICAgYnl0ZXMgPSB0aHJpZnRfdHJhbnNwb3J0X3JlYWQgKHQtPnRyYW5zcG9ydCwgdG1wZGF0YSwgc3osIGVycm9yKTsKIAogICAgIGlmIChieXRlcyA+IDAgJiYgKGVycm9yID09IE5VTEwgfHwgKmVycm9yID09IE5VTEwpKQpAQCAtMTE3LDEwICsxMTgsMTAgQEAKICAgZ3VpbnQzMiBoYXZlID0gdC0+cl9idWYtPmxlbjsKICAgZ2ludDMyIHJlc3VsdCA9IC0xOwogCi0gIC8vIHdlIHNob3VsZG4ndCBoaXQgdGhpcyB1bmxlc3MgdGhlIGJ1ZmZlciBkb2Vzbid0IGhhdmUgZW5vdWdoIHRvIHJlYWQKLSAgYXNzZXJ0ICh0LT5yX2J1Zi0+bGVuIDwgd2FudCk7CisgIC8qIHdlIHNob3VsZG4ndCBoaXQgdGhpcyB1bmxlc3MgdGhlIGJ1ZmZlciBkb2Vzbid0IGhhdmUgZW5vdWdoIHRvIHJlYWQgKi8KKyAgZ19hc3NlcnQgKHQtPnJfYnVmLT5sZW4gPCB3YW50KTsKIAotICAvLyBmaXJzdCBjb3B5IHdoYXQgd2UgaGF2ZSBpbiBvdXIgYnVmZmVyLCBpZiB0aGVyZSBpcyBhbnl0aGluZyBsZWZ0CisgIC8qIGZpcnN0IGNvcHkgd2hhdCB3ZSBoYXZlIGluIG91ciBidWZmZXIsIGlmIHRoZXJlIGlzIGFueXRoaW5nIGxlZnQgKi8KICAgaWYgKGhhdmUgPiAwKQogICB7CiAgICAgbWVtY3B5IChidWYsIHQtPnJfYnVmLCB0LT5yX2J1Zi0+bGVuKTsKQEAgLTEyOCwxNCArMTI5LDE0IEBACiAgICAgdC0+cl9idWYgPSBnX2J5dGVfYXJyYXlfcmVtb3ZlX3JhbmdlICh0LT5yX2J1ZiwgMCwgdC0+cl9idWYtPmxlbik7CiAgIH0KIAotICAvLyByZWFkIGEgZnJhbWUgb2YgaW5wdXQgYW5kIGJ1ZmZlciBpdAorICAvKiByZWFkIGEgZnJhbWUgb2YgaW5wdXQgYW5kIGJ1ZmZlciBpdCAqLwogICBpZiAodGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfcmVhZF9mcmFtZSAodHJhbnNwb3J0LCBlcnJvcikgPT0gVFJVRSkKICAgewotICAgIC8vIGhhbmQgb3ZlciB3aGF0IHdlIGhhdmUgdXAgdG8gd2hhdCB0aGUgY2FsbGVyIHdhbnRzCisgICAgLyogaGFuZCBvdmVyIHdoYXQgd2UgaGF2ZSB1cCB0byB3aGF0IHRoZSBjYWxsZXIgd2FudHMgKi8KICAgICBndWludDMyIGdpdmUgPSB3YW50IDwgdC0+cl9idWYtPmxlbiA/IHdhbnQgOiB0LT5yX2J1Zi0+bGVuOwogCi0gICAgLy8gY29weSB0aGUgZGF0YSBpbnRvIHRoZSBidWZmZXIKLSAgICBtZW1jcHkgKGJ1ZiArIGxlbiAtIHdhbnQsIHQtPnJfYnVmLT5kYXRhLCBnaXZlKTsKKyAgICAvKiBjb3B5IHRoZSBkYXRhIGludG8gdGhlIGJ1ZmZlciAqLworICAgIG1lbWNweSAoKGd1aW50OCAqKWJ1ZiArIGxlbiAtIHdhbnQsIHQtPnJfYnVmLT5kYXRhLCBnaXZlKTsKICAgICB0LT5yX2J1ZiA9IGdfYnl0ZV9hcnJheV9yZW1vdmVfcmFuZ2UgKHQtPnJfYnVmLCAwLCBnaXZlKTsKICAgICB3YW50IC09IGdpdmU7CiAKQEAgLTE3OSwxMCArMTgwLDExIEBACiB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF93cml0ZV9zbG93IChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgZ3BvaW50ZXIgYnVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKQogewotICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOwogICBUaHJpZnRGcmFtZWRUcmFuc3BvcnQgKnQgPSBUSFJJRlRfRlJBTUVEX1RSQU5TUE9SVCAodHJhbnNwb3J0KTsKIAotICAvLyBhcHBlbmQgdGhlIGRhdGEgdG8gdGhlIGJ1ZmZlciBhbmQgd2UncmUgZG9uZQorICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworCisgIC8qIGFwcGVuZCB0aGUgZGF0YSB0byB0aGUgYnVmZmVyIGFuZCB3ZSdyZSBkb25lICovCiAgIGdfYnl0ZV9hcnJheV9hcHBlbmQgKHQtPndfYnVmLCBidWYsIGxlbik7CiAKICAgcmV0dXJuIFRSVUU7CkBAIC0yMjMsMTMgKzIyNSwxNCBAQAogewogICBUaHJpZnRGcmFtZWRUcmFuc3BvcnQgKnQgPSBUSFJJRlRfRlJBTUVEX1RSQU5TUE9SVCAodHJhbnNwb3J0KTsKICAgZ2ludDMyIHN6X2hibywgc3pfbmJvOworICBndWNoYXIgKnRtcGRhdGE7CiAKLSAgLy8gZ2V0IHRoZSBzaXplIG9mIHRoZSBmcmFtZSBpbiBob3N0IGFuZCBuZXR3b3JrIGJ5dGUgb3JkZXIKKyAgLyogZ2V0IHRoZSBzaXplIG9mIHRoZSBmcmFtZSBpbiBob3N0IGFuZCBuZXR3b3JrIGJ5dGUgb3JkZXIgKi8KICAgc3pfaGJvID0gdC0+d19idWYtPmxlbiArIHNpemVvZihzel9uYm8pOwogICBzel9uYm8gPSAoZ2ludDMyKSBodG9ubCAoKGd1aW50MzIpIHQtPndfYnVmLT5sZW4pOwogCi0gIC8vIGNvcHkgdGhlIHNpemUgb2YgdGhlIGZyYW1lIGFuZCB0aGVuIHRoZSBmcmFtZSBpdHNlbGYKLSAgZ3VjaGFyIHRtcGRhdGFbc3pfaGJvXTsKKyAgLyogY29weSB0aGUgc2l6ZSBvZiB0aGUgZnJhbWUgYW5kIHRoZW4gdGhlIGZyYW1lIGl0c2VsZiAqLworICB0bXBkYXRhID0gZ19hbGxvY2EgKHN6X2hibyk7CiAgIG1lbWNweSAodG1wZGF0YSwgKGd1aW50OCAqKSAmc3pfbmJvLCBzaXplb2YgKHN6X25ibykpOwogCiAgIGlmICh0LT53X2J1Zi0+bGVuID4gMCkKQEAgLTIzOCw3ICsyNDEsNyBAQAogICAgIHQtPndfYnVmID0gZ19ieXRlX2FycmF5X3JlbW92ZV9yYW5nZSAodC0+d19idWYsIDAsIHQtPndfYnVmLT5sZW4pOwogICB9CiAgICAgCi0gIC8vIHdyaXRlIHRoZSBidWZmZXIgYW5kIHRoZW4gZW1wdHkgaXQKKyAgLyogd3JpdGUgdGhlIGJ1ZmZlciBhbmQgdGhlbiBlbXB0eSBpdCAqLwogICBUSFJJRlRfVFJBTlNQT1JUX0dFVF9DTEFTUyAodC0+dHJhbnNwb3J0KS0+d3JpdGUgKHQtPnRyYW5zcG9ydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBkYXRhLCBzel9oYm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOwpAQCAtMjgyLDkgKzI4NSwxMCBAQAogdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICpvYmplY3QsIGd1aW50IHByb3BlcnR5X2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHVmFsdWUgKnZhbHVlLCBHUGFyYW1TcGVjICpwc3BlYykKIHsKLSAgVEhSSUZUX1VOVVNFRF9WQVIgKHBzcGVjKTsKICAgVGhyaWZ0RnJhbWVkVHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBUSFJJRlRfRlJBTUVEX1RSQU5TUE9SVCAob2JqZWN0KTsKIAorICBUSFJJRlRfVU5VU0VEX1ZBUiAocHNwZWMpOworCiAgIHN3aXRjaCAocHJvcGVydHlfaWQpCiAgIHsKICAgICBjYXNlIFBST1BfVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlRfVFJBTlNQT1JUOgpAQCAtMzA0LDkgKzMwOCwxMCBAQAogdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICpvYmplY3QsIGd1aW50IHByb3BlcnR5X2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHVmFsdWUgKnZhbHVlLCBHUGFyYW1TcGVjICpwc3BlYykKIHsKLSAgVEhSSUZUX1VOVVNFRF9WQVIgKHBzcGVjKTsKICAgVGhyaWZ0RnJhbWVkVHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBUSFJJRlRfRlJBTUVEX1RSQU5TUE9SVCAob2JqZWN0KTsKIAorICBUSFJJRlRfVU5VU0VEX1ZBUiAocHNwZWMpOworCiAgIHN3aXRjaCAocHJvcGVydHlfaWQpCiAgIHsKICAgICBjYXNlIFBST1BfVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlRfVFJBTlNQT1JUOgpAQCAtMzI1LDYgKzMzMCw3IEBACiBzdGF0aWMgdm9pZAogdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfY2xhc3NfaW5pdCAoVGhyaWZ0RnJhbWVkVHJhbnNwb3J0Q2xhc3MgKmNscykKIHsKKyAgVGhyaWZ0VHJhbnNwb3J0Q2xhc3MgKnR0YyA9IFRIUklGVF9UUkFOU1BPUlRfQ0xBU1MgKGNscyk7CiAgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChjbHMpOwogICBHUGFyYW1TcGVjICpwYXJhbV9zcGVjID0gTlVMTDsKIApAQCAtMzY0LDkgKzM3MCw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST1BfVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlRfV1JJVEVfQlVGRkVSX1NJWkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtX3NwZWMpOwogCi0KLSAgVGhyaWZ0VHJhbnNwb3J0Q2xhc3MgKnR0YyA9IFRIUklGVF9UUkFOU1BPUlRfQ0xBU1MgKGNscyk7Ci0KICAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9maW5hbGl6ZTsKICAgdHRjLT5pc19vcGVuID0gdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfaXNfb3BlbjsKICAgdHRjLT5wZWVrID0gdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfcGVlazsKZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9tZW1vcnlfYnVmZmVyLmMgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfbWVtb3J5X2J1ZmZlci5jCmluZGV4IGFhMDVlOTYuLjkxODE4ZTkgMTAwNjQ0Ci0tLSBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9tZW1vcnlfYnVmZmVyLmMKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X21lbW9yeV9idWZmZXIuYwpAQCAtMTcsNyArMTcsNiBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPG5ldGRiLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KQEAgLTMzLDYgKzMyLDggQEAKIHsKICAgUFJPUF8wLAogICBQUk9QX1RIUklGVF9NRU1PUllfQlVGRkVSX0JVRkZFUl9TSVpFLAorICBQUk9QX1RIUklGVF9NRU1PUllfQlVGRkVSX0JVRkZFUiwKKyAgUFJPUF9USFJJRlRfTUVNT1JZX0JVRkZFUl9PV05FUgogfTsKIAogR19ERUZJTkVfVFlQRShUaHJpZnRNZW1vcnlCdWZmZXIsIHRocmlmdF9tZW1vcnlfYnVmZmVyLCBUSFJJRlRfVFlQRV9UUkFOU1BPUlQpCkBAIC02OCwxMCArNjksMTEgQEAKIHRocmlmdF9tZW1vcnlfYnVmZmVyX3JlYWQgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBncG9pbnRlciBidWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpCiB7Ci0gIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CiAgIFRocmlmdE1lbW9yeUJ1ZmZlciAqdCA9IFRIUklGVF9NRU1PUllfQlVGRkVSICh0cmFuc3BvcnQpOwogICBndWludDMyIGdpdmUgPSBsZW47IAogCisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisKICAgLyogaWYgdGhlIHJlcXVlc3RlZCBieXRlcyBhcmUgbW9yZSB0aGFuIHdoYXQgd2UgaGF2ZSBhdmFpbGFibGUsCiAgICAqIGp1c3QgZ2l2ZSBhbGwgdGhhdCB3ZSBoYXZlIHRoZSBidWZmZXIgKi8KICAgaWYgKHQtPmJ1Zi0+bGVuIDwgbGVuKQpAQCAtMTAyLDEwICsxMDQsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBncG9pbnRlciBidWYsICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpCiB7Ci0gIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7Ci0KICAgVGhyaWZ0TWVtb3J5QnVmZmVyICp0ID0gVEhSSUZUX01FTU9SWV9CVUZGRVIgKHRyYW5zcG9ydCk7CiAKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKwogICAvKiByZXR1cm4gYW4gZXhjZXB0aW9uIGlmIHRoZSBidWZmZXIgZG9lc24ndCBoYXZlIGVub3VnaCBzcGFjZS4gKi8KICAgaWYgKGxlbiA+IHQtPmJ1Zl9zaXplIC0gdC0+YnVmLT5sZW4pCiAgIHsKQEAgLTE0MCwyNCArMTQyLDI0IEBACiAgIHJldHVybiBUUlVFOwogfQogCi0vKiBpbml0aWFsaXplcyB0aGUgaW5zdGFuY2UgKi8KKy8qIGluaXRpYWxpemVzIGNsYXNzIGJlZm9yZSBjb25zdHJ1Y3RvciBwcm9wZXJ0aWVzIGFyZSBzZXQgKi8KIHN0YXRpYyB2b2lkCi10aHJpZnRfbWVtb3J5X2J1ZmZlcl9pbml0IChUaHJpZnRNZW1vcnlCdWZmZXIgKnRyYW5zcG9ydCkKK3RocmlmdF9tZW1vcnlfYnVmZmVyX2luaXQgKFRocmlmdE1lbW9yeUJ1ZmZlciAqdCkKIHsKLSAgdHJhbnNwb3J0LT5idWYgPSBnX2J5dGVfYXJyYXlfbmV3ICgpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAodCk7CiB9CiAKIC8qIGRlc3RydWN0b3IgKi8KIHN0YXRpYyB2b2lkCiB0aHJpZnRfbWVtb3J5X2J1ZmZlcl9maW5hbGl6ZSAoR09iamVjdCAqb2JqZWN0KQogewotICBUaHJpZnRNZW1vcnlCdWZmZXIgKnRyYW5zcG9ydCA9IFRIUklGVF9NRU1PUllfQlVGRkVSIChvYmplY3QpOworICBUaHJpZnRNZW1vcnlCdWZmZXIgKnQgPSBUSFJJRlRfTUVNT1JZX0JVRkZFUiAob2JqZWN0KTsKIAotICBpZiAodHJhbnNwb3J0LT5idWYgIT0gTlVMTCkKKyAgaWYgKHQtPm93bmVyICYmIHQtPmJ1ZiAhPSBOVUxMKQogICB7Ci0gICAgZ19ieXRlX2FycmF5X2ZyZWUgKHRyYW5zcG9ydC0+YnVmLCBUUlVFKTsKKyAgICBnX2J5dGVfYXJyYXlfdW5yZWYgKHQtPmJ1Zik7CiAgIH0KLSAgdHJhbnNwb3J0LT5idWYgPSBOVUxMOworICB0LT5idWYgPSBOVUxMOwogfQogCiAvKiBwcm9wZXJ0eSBhY2Nlc3NvciAqLwpAQCAtMTY1LDEzICsxNjcsMjMgQEAKIHRocmlmdF9tZW1vcnlfYnVmZmVyX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqb2JqZWN0LCBndWludCBwcm9wZXJ0eV9pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1ZhbHVlICp2YWx1ZSwgR1BhcmFtU3BlYyAqcHNwZWMpCiB7CisgIFRocmlmdE1lbW9yeUJ1ZmZlciAqdCA9IFRIUklGVF9NRU1PUllfQlVGRkVSIChvYmplY3QpOworCiAgIFRIUklGVF9VTlVTRURfVkFSIChwc3BlYyk7Ci0gIFRocmlmdE1lbW9yeUJ1ZmZlciAqdHJhbnNwb3J0ID0gVEhSSUZUX01FTU9SWV9CVUZGRVIgKG9iamVjdCk7CiAKICAgc3dpdGNoIChwcm9wZXJ0eV9pZCkKICAgewogICAgIGNhc2UgUFJPUF9USFJJRlRfTUVNT1JZX0JVRkZFUl9CVUZGRVJfU0laRToKLSAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCB0cmFuc3BvcnQtPmJ1Zl9zaXplKTsKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCB0LT5idWZfc2l6ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVEhSSUZUX01FTU9SWV9CVUZGRVJfQlVGRkVSOgorICAgICAgZ192YWx1ZV9zZXRfcG9pbnRlciAodmFsdWUsIChncG9pbnRlcikgKHQtPmJ1ZikpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUklGVF9NRU1PUllfQlVGRkVSX09XTkVSOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIHQtPm93bmVyKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcGVydHlfaWQsIHBzcGVjKTsKICAgICAgIGJyZWFrOwogICB9CiB9CkBAIC0xODEsMjEgKzE5Myw0NSBAQAogdGhyaWZ0X21lbW9yeV9idWZmZXJfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICpvYmplY3QsIGd1aW50IHByb3BlcnR5X2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHVmFsdWUgKnZhbHVlLCBHUGFyYW1TcGVjICpwc3BlYykKIHsKKyAgVGhyaWZ0TWVtb3J5QnVmZmVyICp0ID0gVEhSSUZUX01FTU9SWV9CVUZGRVIgKG9iamVjdCk7CisKICAgVEhSSUZUX1VOVVNFRF9WQVIgKHBzcGVjKTsKLSAgVGhyaWZ0TWVtb3J5QnVmZmVyICp0cmFuc3BvcnQgPSBUSFJJRlRfTUVNT1JZX0JVRkZFUiAob2JqZWN0KTsKIAogICBzd2l0Y2ggKHByb3BlcnR5X2lkKQogICB7CiAgICAgY2FzZSBQUk9QX1RIUklGVF9NRU1PUllfQlVGRkVSX0JVRkZFUl9TSVpFOgotICAgICAgdHJhbnNwb3J0LT5idWZfc2l6ZSA9IGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKTsKKyAgICAgIHQtPmJ1Zl9zaXplID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUklGVF9NRU1PUllfQlVGRkVSX0JVRkZFUjoKKyAgICAgIHQtPmJ1ZiA9IChHQnl0ZUFycmF5KikgZ192YWx1ZV9nZXRfcG9pbnRlciAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUklGVF9NRU1PUllfQlVGRkVSX09XTkVSOgorICAgICAgdC0+b3duZXIgPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BlcnR5X2lkLCBwc3BlYyk7CiAgICAgICBicmVhazsKICAgfQogfQogCisvKiBpbml0aWFsaXplcyBjbGFzcyBhZnRlciBjb25zdHJ1Y3RvciBwcm9wZXJ0aWVzIGFyZSBzZXQgKi8KK3N0YXRpYyB2b2lkCit0aHJpZnRfbWVtb3J5X2J1ZmZlcl9jb25zdHJ1Y3RlZCAoR09iamVjdCAqb2JqZWN0KQoreworICBUaHJpZnRNZW1vcnlCdWZmZXIgKnQgPSBUSFJJRlRfTUVNT1JZX0JVRkZFUiAob2JqZWN0KTsKKworICBpZiAodC0+YnVmID09IE5VTEwpIHsKKyAgICB0LT5idWYgPSBnX2J5dGVfYXJyYXlfbmV3ICgpOworICB9CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHRocmlmdF9tZW1vcnlfYnVmZmVyX3BhcmVudF9jbGFzcyktPmNvbnN0cnVjdGVkIChvYmplY3QpOworfQorCiAvKiBpbml0aWFsaXplcyB0aGUgY2xhc3MgKi8KIHN0YXRpYyB2b2lkCiB0aHJpZnRfbWVtb3J5X2J1ZmZlcl9jbGFzc19pbml0IChUaHJpZnRNZW1vcnlCdWZmZXJDbGFzcyAqY2xzKQogeworICBUaHJpZnRUcmFuc3BvcnRDbGFzcyAqdHRjID0gVEhSSUZUX1RSQU5TUE9SVF9DTEFTUyAoY2xzKTsKICAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGNscyk7CiAgIEdQYXJhbVNwZWMgKnBhcmFtX3NwZWMgPSBOVUxMOwogCkBAIC0yMDUsMTggKzI0MSwzOCBAQAogCiAgIHBhcmFtX3NwZWMgPSBnX3BhcmFtX3NwZWNfdWludCAoImJ1Zl9zaXplIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnVmZmVyIHNpemUgKGNvbnN0cnVjdCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZXQgdGhlIHJlYWQgYnVmZmVyIHNpemUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZXQgdGhlIHJlYWQvd3JpdGUgYnVmZmVyIHNpemUgbGltaXQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qIG1pbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwNDg1NzYsIC8qIG1heCwgMTAyNCoxMDI0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTEyLCAvKiBkZWZhdWx0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19NQVhVSU5UMzIsIC8qIG1heCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfTUFYVUlOVDMyLCAvKiBkZWZhdWx0ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9DT05TVFJVQ1RfT05MWSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUpOwogICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9QX1RIUklGVF9NRU1PUllfQlVGRkVSX0JVRkZFUl9TSVpFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbV9zcGVjKTsKIAotICBUaHJpZnRUcmFuc3BvcnRDbGFzcyAqdHRjID0gVEhSSUZUX1RSQU5TUE9SVF9DTEFTUyAoY2xzKTsKKyAgcGFyYW1fc3BlYyA9IGdfcGFyYW1fc3BlY19wb2ludGVyICgiYnVmIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW50ZXJuYWwgYnVmZmVyIChHQnl0ZUFycmF5KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNldCB0aGUgaW50ZXJuYWwgYnVmZmVyIChHQnl0ZUFycmF5KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9DT05TVFJVQ1RfT05MWSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9QX1RIUklGVF9NRU1PUllfQlVGRkVSX0JVRkZFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1fc3BlYyk7CiAKKyAgcGFyYW1fc3BlYyA9IGdfcGFyYW1fc3BlY19ib29sZWFuICgib3duZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnRlcm5hbCBidWZmZXIgbWVtb3J5IG1hbmFnZW1lbnQgcG9saWN5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2V0IHdoZXRoZXIgaW50ZXJuYWwgYnVmZmVyIHNob3VsZCBiZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgdW5yZWZlcmVuY2VkIHdoZW4gdGhyaWZ0X21lbW9yeV9idWZmZXIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGlzIGZpbmFsaXplZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX0NPTlNUUlVDVF9PTkxZIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST1BfVEhSSUZUX01FTU9SWV9CVUZGRVJfT1dORVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtX3NwZWMpOworCisgIGdvYmplY3RfY2xhc3MtPmNvbnN0cnVjdGVkID0gdGhyaWZ0X21lbW9yeV9idWZmZXJfY29uc3RydWN0ZWQ7CiAgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gdGhyaWZ0X21lbW9yeV9idWZmZXJfZmluYWxpemU7CiAgIHR0Yy0+aXNfb3BlbiA9IHRocmlmdF9tZW1vcnlfYnVmZmVyX2lzX29wZW47CiAgIHR0Yy0+b3BlbiA9IHRocmlmdF9tZW1vcnlfYnVmZmVyX29wZW47CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfbWVtb3J5X2J1ZmZlci5oIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X21lbW9yeV9idWZmZXIuaAppbmRleCA0ZWJlOThmLi5kNWQ0N2IzIDEwMDY0NAotLS0gYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfbWVtb3J5X2J1ZmZlci5oCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9tZW1vcnlfYnVmZmVyLmgKQEAgLTUxLDYgKzUxLDcgQEAKICAgLyogcHJpdmF0ZSAqLwogICBHQnl0ZUFycmF5ICpidWY7CiAgIGd1aW50MzIgYnVmX3NpemU7CisgIGdib29sZWFuIG93bmVyOwogfTsKIAogdHlwZWRlZiBzdHJ1Y3QgX1RocmlmdE1lbW9yeUJ1ZmZlckNsYXNzIFRocmlmdE1lbW9yeUJ1ZmZlckNsYXNzOwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3BsYXRmb3JtX3NvY2tldC5oIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3BsYXRmb3JtX3NvY2tldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkZTYwZjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfcGxhdGZvcm1fc29ja2V0LmgKQEAgLTAsMCArMSwxMjAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyogY2xhbmctZm9ybWF0IG9mZiAqLworCisjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1BMQVRGT1JNX1NPQ0tFVF9IXworIyAgZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1BMQVRGT1JNX1NPQ0tFVF9IXworCisjaWZkZWYgX1dJTjMyCisjICBkZWZpbmUgVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IgOjpXU0FHZXRMYXN0RXJyb3IoKQorIyAgZGVmaW5lIFRIUklGVF9FUlJOTyAoKl9lcnJubygpKQorIyAgZGVmaW5lIFRIUklGVF9FSU5QUk9HUkVTUyBXU0FFSU5QUk9HUkVTUworIyAgZGVmaW5lIFRIUklGVF9FQUdBSU4gV1NBRVdPVUxEQkxPQ0sKKyMgIGRlZmluZSBUSFJJRlRfRUlOVFIgV1NBRUlOVFIKKyMgIGRlZmluZSBUSFJJRlRfRUNPTk5SRVNFVCBXU0FFQ09OTlJFU0VUCisjICBkZWZpbmUgVEhSSUZUX0VOT1RDT05OIFdTQUVOT1RDT05OCisjICBkZWZpbmUgVEhSSUZUX0VUSU1FRE9VVCBXU0FFVElNRURPVVQKKyMgIGRlZmluZSBUSFJJRlRfRVdPVUxEQkxPQ0sgV1NBRVdPVUxEQkxPQ0sKKyMgIGRlZmluZSBUSFJJRlRfRVBJUEUgV1NBRUNPTk5SRVNFVAorIyAgZGVmaW5lIFRIUklGVF9OT19TT0NLRVRfQ0FDSElORyBTT19FWENMVVNJVkVBRERSVVNFCisjICBkZWZpbmUgVEhSSUZUX0lOVkFMSURfU09DS0VUIElOVkFMSURfU09DS0VUCisjICBkZWZpbmUgVEhSSUZUX1NPQ0tFVFBBSVIgdGhyaWZ0X3NvY2tldHBhaXIKKyMgIGRlZmluZSBUSFJJRlRfRkNOVEwgdGhyaWZ0X2ZjbnRsCisjICBkZWZpbmUgVEhSSUZUX09fTk9OQkxPQ0sgMQorIyAgZGVmaW5lIFRIUklGVF9GX0dFVEZMIDAKKyMgIGRlZmluZSBUSFJJRlRfRl9TRVRGTCAxCisjICBkZWZpbmUgVEhSSUZUX0dFVFRJTUVPRkRBWSB0aHJpZnRfZ2V0dGltZW9mZGF5CisjICBkZWZpbmUgVEhSSUZUX0NMT1NFU09DS0VUIGNsb3Nlc29ja2V0CisjICBkZWZpbmUgVEhSSUZUX0NMT1NFIF9jbG9zZQorIyAgZGVmaW5lIFRIUklGVF9PUEVOIF9vcGVuCisjICBkZWZpbmUgVEhSSUZUX0ZUUlVOQ0FURSBfY2hzaXplX3MKKyMgIGRlZmluZSBUSFJJRlRfRlNZTkMgX2NvbW1pdAorIyAgZGVmaW5lIFRIUklGVF9MU0VFSyBfbHNlZWsKKyMgIGRlZmluZSBUSFJJRlRfV1JJVEUgX3dyaXRlCisjICBkZWZpbmUgVEhSSUZUX1JFQUQgX3JlYWQKKyMgIGRlZmluZSBUSFJJRlRfRlNUQVQgX2ZzdGF0CisjICBkZWZpbmUgVEhSSUZUX1NUQVQgX3N0YXQKKyMgIGlmZGVmIF9XSU4zMl9XQ0UKKyMgICAgZGVmaW5lIFRIUklGVF9HQUlfU1RSRVJST1IoLi4uKSB0aHJpZnRfd3N0cjJzdHIoZ2FpX3N0cmVycm9yVyhfX1ZBX0FSR1NfXykpCisjICBlbHNlCisjICAgIGRlZmluZSBUSFJJRlRfR0FJX1NUUkVSUk9SIGdhaV9zdHJlcnJvckEKKyMgIGVuZGlmCisjICBkZWZpbmUgVEhSSUZUX1NTSVpFVCBwdHJkaWZmX3QKKyMgIGRlZmluZSBUSFJJRlRfU05QUklOVEYgX3NucHJpbnRmCisjICBkZWZpbmUgVEhSSUZUX1NMRUVQX1NFQyB0aHJpZnRfc2xlZXAKKyMgIGRlZmluZSBUSFJJRlRfU0xFRVBfVVNFQyB0aHJpZnRfdXNsZWVwCisjICBkZWZpbmUgVEhSSUZUX1RJTUVTUEVDIHRocmlmdF90aW1lc3BlYworIyAgZGVmaW5lIFRIUklGVF9DVElNRV9SIHRocmlmdF9jdGltZV9yCisjICBkZWZpbmUgVEhSSUZUX1BPTEwgdGhyaWZ0X3BvbGwKKyMgIGlmIFdJTlZFUiA8PSAweDA1MDIgLyogWFAsIFNlcnZlcjIwMDMgKi8KKyMgICAgZGVmaW5lIFRIUklGVF9QT0xMRkQgIHRocmlmdF9wb2xsZmQKKyMgICAgZGVmaW5lIFRIUklGVF9QT0xMSU4gIDB4MDMwMAorIyAgICBkZWZpbmUgVEhSSUZUX1BPTExPVVQgMHgwMDEwCisjICBlbHNlIC8qIFZpc3RhLCBXaW43Li4uICovCisjICAgIGRlZmluZSBUSFJJRlRfUE9MTEZEICBwb2xsZmQKKyMgICAgZGVmaW5lIFRIUklGVF9QT0xMSU4gIFBPTExJTgorIyAgICBkZWZpbmUgVEhSSUZUX1BPTExPVVQgUE9MTE9VVAorIyAgZW5kaWYgLyogV0lOVkVSICovCisjICBkZWZpbmUgVEhSSUZUX1NIVVRfUkRXUiBTRF9CT1RICisjZWxzZSAvKiBub3QgX1dJTjMyICovCisjICBpbmNsdWRlIDxlcnJuby5oPgorIyAgZGVmaW5lIFRIUklGVF9HRVRfU09DS0VUX0VSUk9SIGVycm5vCisjICBkZWZpbmUgVEhSSUZUX0VSUk5PIGVycm5vCisjICBkZWZpbmUgVEhSSUZUX0VJTlRSICAgICAgIEVJTlRSCisjICBkZWZpbmUgVEhSSUZUX0VJTlBST0dSRVNTIEVJTlBST0dSRVNTCisjICBkZWZpbmUgVEhSSUZUX0VDT05OUkVTRVQgIEVDT05OUkVTRVQKKyMgIGRlZmluZSBUSFJJRlRfRU5PVENPTk4gICAgRU5PVENPTk4KKyMgIGRlZmluZSBUSFJJRlRfRVRJTUVET1VUICAgRVRJTUVET1VUCisjICBkZWZpbmUgVEhSSUZUX0VXT1VMREJMT0NLIEVXT1VMREJMT0NLCisjICBkZWZpbmUgVEhSSUZUX0VBR0FJTiAgICAgIEVBR0FJTgorIyAgZGVmaW5lIFRIUklGVF9FUElQRSAgICAgICBFUElQRQorIyAgZGVmaW5lIFRIUklGVF9OT19TT0NLRVRfQ0FDSElORyBTT19SRVVTRUFERFIKKyMgIGRlZmluZSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQgKC0xKQorIyAgZGVmaW5lIFRIUklGVF9TT0NLRVRQQUlSIHNvY2tldHBhaXIKKyMgIGRlZmluZSBUSFJJRlRfRkNOVEwgZmNudGwKKyMgIGRlZmluZSBUSFJJRlRfT19OT05CTE9DSyBPX05PTkJMT0NLCisjICBkZWZpbmUgVEhSSUZUX0ZfR0VURkwgRl9HRVRGTAorIyAgZGVmaW5lIFRIUklGVF9GX1NFVEZMIEZfU0VURkwKKyMgIGRlZmluZSBUSFJJRlRfR0VUVElNRU9GREFZIGdldHRpbWVvZmRheQorIyAgZGVmaW5lIFRIUklGVF9DTE9TRVNPQ0tFVCBjbG9zZQorIyAgZGVmaW5lIFRIUklGVF9DTE9TRSBjbG9zZQorIyAgZGVmaW5lIFRIUklGVF9PUEVOIG9wZW4KKyMgIGRlZmluZSBUSFJJRlRfRlRSVU5DQVRFIGZ0cnVuY2F0ZQorIyAgZGVmaW5lIFRIUklGVF9GU1lOQyBmc3luYworIyAgZGVmaW5lIFRIUklGVF9MU0VFSyBsc2VlaworIyAgZGVmaW5lIFRIUklGVF9XUklURSB3cml0ZQorIyAgZGVmaW5lIFRIUklGVF9SRUFEIHJlYWQKKyMgIGRlZmluZSBUSFJJRlRfU1RBVCBzdGF0CisjICBkZWZpbmUgVEhSSUZUX0ZTVEFUIGZzdGF0CisjICBkZWZpbmUgVEhSSUZUX0dBSV9TVFJFUlJPUiBnYWlfc3RyZXJyb3IKKyMgIGRlZmluZSBUSFJJRlRfU1NJWkVUIHNzaXplX3QKKyMgIGRlZmluZSBUSFJJRlRfU05QUklOVEYgc25wcmludGYKKyMgIGRlZmluZSBUSFJJRlRfU0xFRVBfU0VDIHNsZWVwCisjICBkZWZpbmUgVEhSSUZUX1NMRUVQX1VTRUMgdXNsZWVwCisjICBkZWZpbmUgVEhSSUZUX1RJTUVTUEVDIHRpbWVzcGVjCisjICBkZWZpbmUgVEhSSUZUX0NUSU1FX1IgY3RpbWVfcgorIyAgZGVmaW5lIFRIUklGVF9QT0xMIHBvbGwKKyMgIGRlZmluZSBUSFJJRlRfUE9MTEZEICBwb2xsZmQKKyMgIGRlZmluZSBUSFJJRlRfUE9MTElOICBQT0xMSU4KKyMgIGRlZmluZSBUSFJJRlRfUE9MTE9VVCBQT0xMT1VUCisjICBkZWZpbmUgVEhSSUZUX1NIVVRfUkRXUiBTSFVUX1JEV1IKKyNlbmRpZgorCisjZW5kaWYgLyogX1RIUklGVF9UUkFOU1BPUlRfUExBVEZPUk1fU09DS0VUX0hfICovCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3NvY2tldC5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl9zb2NrZXQuYwppbmRleCA1ZDFmNDUyLi42ZWE4OTdjIDEwMDY0NAotLS0gYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3NvY2tldC5jCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfc29ja2V0LmMKQEAgLTQyLDkgKzQyLDYgQEAKIC8qIGRlZmluZSB0aGUgR0Vycm9yIGRvbWFpbiBzdHJpbmcgKi8KICNkZWZpbmUgVEhSSUZUX1NFUlZFUl9TT0NLRVRfRVJST1JfRE9NQUlOICJ0aHJpZnQtc2VydmVyLXNvY2tldC1lcnJvci1xdWFyayIKIAotLyogZm9yIGVycm9ycyBjb21pbmcgZnJvbSBzb2NrZXQoKSBhbmQgY29ubmVjdCgpICovCi1leHRlcm4gaW50IGVycm5vOwotCiBHX0RFRklORV9UWVBFKFRocmlmdFNlcnZlclNvY2tldCwgdGhyaWZ0X3NlcnZlcl9zb2NrZXQsIFRIUklGVF9UWVBFX1NFUlZFUl9UUkFOU1BPUlQpCiAKIGdib29sZWFuCkBAIC0yMTUsNiArMjEyLDcgQEAKIHN0YXRpYyB2b2lkCiB0aHJpZnRfc2VydmVyX3NvY2tldF9jbGFzc19pbml0IChUaHJpZnRTZXJ2ZXJTb2NrZXRDbGFzcyAqY2xzKQogeworICBUaHJpZnRTZXJ2ZXJUcmFuc3BvcnRDbGFzcyAqdHN0YyA9IFRIUklGVF9TRVJWRVJfVFJBTlNQT1JUX0NMQVNTIChjbHMpOwogICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoY2xzKTsKICAgR1BhcmFtU3BlYyAqcGFyYW1fc3BlYyA9IE5VTEw7CiAKQEAgLTIyNiwxMiArMjI0LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQgKGNvbnN0cnVjdCkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZXQgdGhlIHBvcnQgdG8gbGlzdGVuIHRvIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKiBtaW4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2NTUzNCwgLyogbWF4ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjU1MzUsIC8qIG1heCAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkwOTAsIC8qIGRlZmF1bHQgYnkgY29udmVudGlvbiAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fQ09OU1RSVUNUX09OTFkgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFKTsKICAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPUF9USFJJRlRfU0VSVkVSX1NPQ0tFVF9QT1JULCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPUF9USFJJRlRfU0VSVkVSX1NPQ0tFVF9QT1JULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbV9zcGVjKTsKIAogICBwYXJhbV9zcGVjID0gZ19wYXJhbV9zcGVjX3VpbnQgKCJiYWNrbG9nIiwKQEAgLTI0OCw3ICsyNDYsNiBAQAogCiAgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gdGhyaWZ0X3NlcnZlcl9zb2NrZXRfZmluYWxpemU7CiAKLSAgVGhyaWZ0U2VydmVyVHJhbnNwb3J0Q2xhc3MgKnRzdGMgPSBUSFJJRlRfU0VSVkVSX1RSQU5TUE9SVF9DTEFTUyAoY2xzKTsKICAgdHN0Yy0+bGlzdGVuID0gdGhyaWZ0X3NlcnZlcl9zb2NrZXRfbGlzdGVuOwogICB0c3RjLT5hY2NlcHQgPSB0aHJpZnRfc2VydmVyX3NvY2tldF9hY2NlcHQ7CiAgIHRzdGMtPmNsb3NlID0gdGhyaWZ0X3NlcnZlcl9zb2NrZXRfY2xvc2U7CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3NvY2tldC5oIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl9zb2NrZXQuaAppbmRleCBmMDcyY2IwLi5mZDA0OTU0IDEwMDY0NAotLS0gYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3NvY2tldC5oCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfc29ja2V0LmgKQEAgLTQ5LDcgKzQ5LDcgQEAKICAgVGhyaWZ0U2VydmVyVHJhbnNwb3J0IHBhcmVudDsKIAogICAvKiBwcml2YXRlICovCi0gIGdzaG9ydCBwb3J0OworICBndWludCBwb3J0OwogICBnc2hvcnQgYmFja2xvZzsKICAgaW50IHNkOwogICBndWludDggKmJ1ZjsKZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zb2NrZXQuYyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zb2NrZXQuYwppbmRleCA2YmM5YWYzLi42ZGQwZjBkIDEwMDY0NAotLS0gYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc29ja2V0LmMKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NvY2tldC5jCkBAIC0zNyw5ICszNyw2IEBACiAgIFBST1BfVEhSSUZUX1NPQ0tFVF9QT1JUCiB9OwogCi0vKiBmb3IgZXJyb3JzIGNvbWluZyBmcm9tIHNvY2tldCgpIGFuZCBjb25uZWN0KCkgKi8KLWV4dGVybiBpbnQgZXJybm87Ci0KIEdfREVGSU5FX1RZUEUoVGhyaWZ0U29ja2V0LCB0aHJpZnRfc29ja2V0LCBUSFJJRlRfVFlQRV9UUkFOU1BPUlQpCiAKIC8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9pc19vcGVuICovCkBAIC05OCw2ICs5NSwyNSBAQAogICByZXR1cm4gcmVzdWx0OwogfQogCisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9jbG9zZSAqLworZ2Jvb2xlYW4KK3RocmlmdF9zb2NrZXRfY2xvc2UgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0U29ja2V0ICpzb2NrZXQgPSBUSFJJRlRfU09DS0VUICh0cmFuc3BvcnQpOworCisgIGlmIChjbG9zZSAoc29ja2V0LT5zZCkgPT0gLTEpCisgIHsKKyAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9UUkFOU1BPUlRfRVJST1IsIFRIUklGVF9UUkFOU1BPUlRfRVJST1JfQ0xPU0UsCisgICAgICAgICAgICAgICAgICJ1bmFibGUgdG8gY2xvc2Ugc29ja2V0IC0gJXMiLAorICAgICAgICAgICAgICAgICBzdHJlcnJvcihlcnJubykpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIHNvY2tldC0+c2QgPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQ7CisgIHJldHVybiBUUlVFOworfQorCiAvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfb3BlbiAqLwogZ2Jvb2xlYW4KIHRocmlmdF9zb2NrZXRfb3BlbiAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQpAQCAtMTMxLDggKzE0Nyw4IEBACiAgIC8qIGNyZWF0ZSBhIHNvY2tldCBzdHJ1Y3R1cmUgKi8KICAgbWVtc2V0ICgmcGluLCAwLCBzaXplb2YocGluKSk7CiAgIHBpbi5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKLSAgcGluLnNpbl9hZGRyLnNfYWRkciA9ICgoc3RydWN0IGluX2FkZHIgKikgKGhwLT5oX2FkZHIpKS0+c19hZGRyOwotICBwaW4uc2luX3BvcnQgPSBodG9ucyAodHNvY2tldC0+cG9ydCk7IAorICBwaW4uc2luX2FkZHIuc19hZGRyID0gKChzdHJ1Y3QgaW5fYWRkciAqKSAoaHAtPmhfYWRkcl9saXN0WzBdKSktPnNfYWRkcjsKKyAgcGluLnNpbl9wb3J0ID0gaHRvbnMgKHRzb2NrZXQtPnBvcnQpOwogCiAgIC8qIGNyZWF0ZSB0aGUgc29ja2V0ICovCiAgIGlmICgodHNvY2tldC0+c2QgPSBzb2NrZXQgKEFGX0lORVQsIFNPQ0tfU1RSRUFNLCAwKSkgPT0gLTEpCkBAIC0xNDcsNyArMTYzLDggQEAKICAgLyogb3BlbiBhIGNvbm5lY3Rpb24gKi8KICAgaWYgKGNvbm5lY3QgKHRzb2NrZXQtPnNkLCAoc3RydWN0IHNvY2thZGRyICopICZwaW4sIHNpemVvZihwaW4pKSA9PSAtMSkKICAgewotICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUiwgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUl9DT05ORUNULAorICAgICAgdGhyaWZ0X3NvY2tldF9jbG9zZSh0c29ja2V0LCBOVUxMKTsKKyAgICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUiwgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUl9DT05ORUNULAogICAgICAgICAgICAgICAgICAiZmFpbGVkIHRvIGNvbm5lY3QgdG8gaG9zdCAlczolZCAtICVzIiwKICAgICAgICAgICAgICAgICAgdHNvY2tldC0+aG9zdG5hbWUsIHRzb2NrZXQtPnBvcnQsIHN0cmVycm9yKGVycm5vKSk7CiAgICAgcmV0dXJuIEZBTFNFOwpAQCAtMTU2LDIzICsxNzMsNiBAQAogICByZXR1cm4gVFJVRTsKIH0KIAotLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X2Nsb3NlICovCi1nYm9vbGVhbgotdGhyaWZ0X3NvY2tldF9jbG9zZSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQotewotICBUaHJpZnRTb2NrZXQgKnNvY2tldCA9IFRIUklGVF9TT0NLRVQgKHRyYW5zcG9ydCk7Ci0KLSAgaWYgKGNsb3NlIChzb2NrZXQtPnNkKSA9PSAtMSkKLSAgewotICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUiwgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUl9DTE9TRSwKLSAgICAgICAgICAgICAgICAgInVuYWJsZSB0byBjbG9zZSBzb2NrZXQgLSAlcyIsCi0gICAgICAgICAgICAgICAgIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgcmV0dXJuIEZBTFNFOwotICB9Ci0KLSAgc29ja2V0LT5zZCA9IFRIUklGVF9JTlZBTElEX1NPQ0tFVDsKLSAgcmV0dXJuIFRSVUU7Ci19CiAKIC8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkICovCiBnaW50MzIKQEAgLTE4Niw3ICsxODYsNyBAQAogCiAgIHdoaWxlIChnb3QgPCBsZW4pCiAgIHsKLSAgICByZXQgPSByZWN2IChzb2NrZXQtPnNkLCBidWYrZ290LCBsZW4tZ290LCAwKTsKKyAgICByZXQgPSByZWN2IChzb2NrZXQtPnNkLCAoZ3VpbnQ4ICopYnVmICsgZ290LCBsZW4tZ290LCAwKTsKICAgICBpZiAocmV0IDw9IDApCiAgICAgewogICAgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SLApAQCAtMjEzLDcgKzIxMyw3IEBACiAKIC8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF93cml0ZSAqLwogZ2Jvb2xlYW4KLXRocmlmdF9zb2NrZXRfd3JpdGUgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBjb25zdCBncG9pbnRlciBidWYsICAgICAKK3RocmlmdF9zb2NrZXRfd3JpdGUgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBjb25zdCBncG9pbnRlciBidWYsCiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpCiB7CiAgIGdpbnQgcmV0ID0gMDsKQEAgLTIyNCw3ICsyMjQsNyBAQAogCiAgIHdoaWxlIChzZW50IDwgbGVuKQogICB7Ci0gICAgcmV0ID0gc2VuZCAoc29ja2V0LT5zZCwgYnVmICsgc2VudCwgbGVuIC0gc2VudCwgMCk7CisgICAgcmV0ID0gc2VuZCAoc29ja2V0LT5zZCwgKGd1aW50OCAqKWJ1ZiArIHNlbnQsIGxlbiAtIHNlbnQsIDApOwogICAgIGlmIChyZXQgPCAwKQogICAgIHsKICAgICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUiwKQEAgLTI5MSw5ICsyOTEsMTAgQEAKIHRocmlmdF9zb2NrZXRfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICpvYmplY3QsIGd1aW50IHByb3BlcnR5X2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdWYWx1ZSAqdmFsdWUsIEdQYXJhbVNwZWMgKnBzcGVjKQogewotICBUSFJJRlRfVU5VU0VEX1ZBUiAocHNwZWMpOwogICBUaHJpZnRTb2NrZXQgKnNvY2tldCA9IFRIUklGVF9TT0NLRVQgKG9iamVjdCk7CiAKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHBzcGVjKTsKKwogICBzd2l0Y2ggKHByb3BlcnR5X2lkKQogICB7CiAgICAgY2FzZSBQUk9QX1RIUklGVF9TT0NLRVRfSE9TVE5BTUU6CkBAIC0zMTAsMTIgKzMxMSwxNiBAQAogdGhyaWZ0X3NvY2tldF9zZXRfcHJvcGVydHkgKEdPYmplY3QgKm9iamVjdCwgZ3VpbnQgcHJvcGVydHlfaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR1ZhbHVlICp2YWx1ZSwgR1BhcmFtU3BlYyAqcHNwZWMpCiB7Ci0gIFRIUklGVF9VTlVTRURfVkFSIChwc3BlYyk7CiAgIFRocmlmdFNvY2tldCAqc29ja2V0ID0gVEhSSUZUX1NPQ0tFVCAob2JqZWN0KTsKIAorICBUSFJJRlRfVU5VU0VEX1ZBUiAocHNwZWMpOworCiAgIHN3aXRjaCAocHJvcGVydHlfaWQpCiAgIHsKICAgICBjYXNlIFBST1BfVEhSSUZUX1NPQ0tFVF9IT1NUTkFNRToKKyAgICAgIGlmIChzb2NrZXQtPmhvc3RuYW1lKSB7CisgICAgICAgIGdfZnJlZShzb2NrZXQtPmhvc3RuYW1lKTsKKyAgICAgIH0KICAgICAgIHNvY2tldC0+aG9zdG5hbWUgPSBnX3N0cmR1cCAoZ192YWx1ZV9nZXRfc3RyaW5nICh2YWx1ZSkpOwogICAgICAgYnJlYWs7CiAgICAgY2FzZSBQUk9QX1RIUklGVF9TT0NLRVRfUE9SVDoKQEAgLTMyOCw2ICszMzMsNyBAQAogc3RhdGljIHZvaWQKIHRocmlmdF9zb2NrZXRfY2xhc3NfaW5pdCAoVGhyaWZ0U29ja2V0Q2xhc3MgKmNscykKIHsKKyAgVGhyaWZ0VHJhbnNwb3J0Q2xhc3MgKnR0YyA9IFRIUklGVF9UUkFOU1BPUlRfQ0xBU1MgKGNscyk7CiAgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChjbHMpOwogICBHUGFyYW1TcGVjICpwYXJhbV9zcGVjID0gTlVMTDsKIApAQCAtMzQ3LDE2ICszNTMsMTQgQEAKICAgcGFyYW1fc3BlYyA9IGdfcGFyYW1fc3BlY191aW50ICgicG9ydCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQgKGNvbnN0cnVjdCkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZXQgdGhlIHBvcnQgb2YgdGhlIHJlbW90ZSBob3N0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKiBtaW4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2NTUzNCwgLyogbWF4ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHUsIC8qIG1pbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY1NTM1dSwgLyogbWF4ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTA5MCwgLyogZGVmYXVsdCBieSBjb252ZW50aW9uICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9DT05TVFJVQ1RfT05MWSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUpOwogICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1RIUklGVF9TT0NLRVRfUE9SVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1fc3BlYyk7CiAKLSAgVGhyaWZ0VHJhbnNwb3J0Q2xhc3MgKnR0YyA9IFRIUklGVF9UUkFOU1BPUlRfQ0xBU1MgKGNscyk7Ci0KICAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSB0aHJpZnRfc29ja2V0X2ZpbmFsaXplOwogICB0dGMtPmlzX29wZW4gPSB0aHJpZnRfc29ja2V0X2lzX29wZW47CiAgIHR0Yy0+cGVlayA9IHRocmlmdF9zb2NrZXRfcGVlazsKZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zb2NrZXQuaCBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zb2NrZXQuaAppbmRleCA5ODE1NzdkLi4yZjZmNjdkIDEwMDY0NAotLS0gYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc29ja2V0LmgKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NvY2tldC5oCkBAIC01MCwxMSArNTAsOCBAQAogCiAgIC8qIHByaXZhdGUgKi8KICAgZ2NoYXIgKmhvc3RuYW1lOwotICBnc2hvcnQgcG9ydDsKKyAgZ3VpbnQgcG9ydDsKICAgaW50IHNkOwotICBndWludDggKmJ1ZjsKLSAgZ3VpbnQzMiBidWZfc2l6ZTsKLSAgZ3VpbnQzMiBidWZfbGVuOwogfTsKIAogdHlwZWRlZiBzdHJ1Y3QgX1RocmlmdFNvY2tldENsYXNzIFRocmlmdFNvY2tldENsYXNzOwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NzbF9zb2NrZXQuYyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zc2xfc29ja2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU1NTQwNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zc2xfc29ja2V0LmMKQEAgLTAsMCArMSw4MDYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvc3NsLmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgorCisjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KKyNpbmNsdWRlIDxnbGliLmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NzbF9zb2NrZXQuaD4KKworCisjaWYgZGVmaW5lZChXSU4zMikKKyNkZWZpbmUgTVVURVhfVFlQRSAgICAgICAgICAgIEhBTkRMRQorI2RlZmluZSBNVVRFWF9TRVRVUCh4KSAgICAgICAgKHgpID0gQ3JlYXRlTXV0ZXgoTlVMTCwgRkFMU0UsIE5VTEwpCisjZGVmaW5lIE1VVEVYX0NMRUFOVVAoeCkgICAgICBDbG9zZUhhbmRsZSh4KQorI2RlZmluZSBNVVRFWF9MT0NLKHgpICAgICAgICAgV2FpdEZvclNpbmdsZU9iamVjdCgoeCksIElORklOSVRFKQorI2RlZmluZSBNVVRFWF9VTkxPQ0soeCkgICAgICAgUmVsZWFzZU11dGV4KHgpCisjZWxzZQorI2RlZmluZSBNVVRFWF9UWVBFICAgICAgICAgICAgcHRocmVhZF9tdXRleF90CisjZGVmaW5lIE1VVEVYX1NFVFVQKHgpICAgICAgICBwdGhyZWFkX211dGV4X2luaXQoJih4KSwgTlVMTCkKKyNkZWZpbmUgTVVURVhfQ0xFQU5VUCh4KSAgICAgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmKHgpKQorI2RlZmluZSBNVVRFWF9MT0NLKHgpICAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCYoeCkpCisjZGVmaW5lIE1VVEVYX1VOTE9DSyh4KSAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmKHgpKQorI2VuZGlmCisKKyNkZWZpbmUgT1BFTlNTTF9WRVJTSU9OX05PX1RIUkVBRF9JRCAweDEwMDAwMDAwTAorCisKKy8qIG9iamVjdCBwcm9wZXJ0aWVzICovCitlbnVtIF9UaHJpZnRTU0xTb2NrZXRQcm9wZXJ0aWVzCit7CisgIFBST1BfVEhSSUZUX1NTTF9TT0NLRVRfQ09OVEVYVCA9IDMsCisgIFBST1BfVEhSSUZUX1NTTF9TRUxGX1NJR05FRAorfTsKKworLyogVG8gaG9sZCBhIGdsb2JhbCBzdGF0ZSBtYW5hZ2VtZW50IG9mIG9wZW5zc2wgZm9yIGFsbCBpbnN0YW5jZXMgKi8KK3N0YXRpYyBnYm9vbGVhbiB0aHJpZnRfc3NsX3NvY2tldF9vcGVuc3NsX2luaXRpYWxpemVkPUZBTFNFOworLyogVGhpcyBhcnJheSB3aWxsIHN0b3JlIGFsbCBvZiB0aGUgbXV0ZXhlcyBhdmFpbGFibGUgdG8gT3BlblNTTC4gKi8KK3N0YXRpYyBNVVRFWF9UWVBFICp0aHJpZnRfc3NsX3NvY2tldF9nbG9iYWxfbXV0ZXhfYnVmPU5VTEw7CisKKworLyoqCisgKiBPcGVuU1NMIHVuaXEgaWQgZnVuY3Rpb24uCisgKgorICogQHJldHVybiAgICB0aHJlYWQgaWQKKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgdGhyaWZ0X3NzbF9zb2NrZXRfc3RhdGljX2lkX2Z1bmN0aW9uKHZvaWQpCit7CisjaWYgZGVmaW5lZChXSU4zMikKKyAgcmV0dXJuIEdldEN1cnJlbnRUaHJlYWRJZCgpOworI2Vsc2UKKyAgcmV0dXJuICgodW5zaWduZWQgbG9uZykgcHRocmVhZF9zZWxmKCkpOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIHRocmlmdF9zc2xfc29ja2V0X3N0YXRpY19sb2NraW5nX2NhbGxiYWNrKGludCBtb2RlLCBpbnQgbiwgY29uc3QgY2hhciogdW5rLCBpbnQgaWQpIHsKKyAgaWYgKG1vZGUgJiBDUllQVE9fTE9DSykKKyAgICBNVVRFWF9MT0NLKHRocmlmdF9zc2xfc29ja2V0X2dsb2JhbF9tdXRleF9idWZbbl0pOworICBlbHNlCisgICAgTVVURVhfVU5MT0NLKHRocmlmdF9zc2xfc29ja2V0X2dsb2JhbF9tdXRleF9idWZbbl0pOworfQorCitzdGF0aWMgaW50IHRocmlmdF9zc2xfc29ja2V0X3N0YXRpY190aHJlYWRfc2V0dXAodm9pZCkKK3sKKyAgaW50IGk7CisKKyAgdGhyaWZ0X3NzbF9zb2NrZXRfZ2xvYmFsX211dGV4X2J1ZiA9IG1hbGxvYyhDUllQVE9fbnVtX2xvY2tzKCkgKiBzaXplb2YoTVVURVhfVFlQRSkpOworICBpZiAoIXRocmlmdF9zc2xfc29ja2V0X2dsb2JhbF9tdXRleF9idWYpCisgICAgcmV0dXJuIDA7CisgIGZvciAoaSA9IDA7ICBpIDwgQ1JZUFRPX251bV9sb2NrcyggICk7ICBpKyspCisgICAgTVVURVhfU0VUVVAodGhyaWZ0X3NzbF9zb2NrZXRfZ2xvYmFsX211dGV4X2J1ZltpXSk7CisgIENSWVBUT19zZXRfaWRfY2FsbGJhY2sodGhyaWZ0X3NzbF9zb2NrZXRfc3RhdGljX2lkX2Z1bmN0aW9uKTsKKyAgQ1JZUFRPX3NldF9sb2NraW5nX2NhbGxiYWNrKHRocmlmdF9zc2xfc29ja2V0X3N0YXRpY19sb2NraW5nX2NhbGxiYWNrKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgdGhyaWZ0X3NzbF9zb2NrZXRfc3RhdGljX3RocmVhZF9jbGVhbnVwKHZvaWQpCit7CisgIGludCBpOworICBpZiAoIXRocmlmdF9zc2xfc29ja2V0X2dsb2JhbF9tdXRleF9idWYpCisgICAgcmV0dXJuIDA7CisgIENSWVBUT19zZXRfaWRfY2FsbGJhY2soTlVMTCk7CisgIENSWVBUT19zZXRfbG9ja2luZ19jYWxsYmFjayhOVUxMKTsKKyAgZm9yIChpID0gMDsgIGkgPCBDUllQVE9fbnVtX2xvY2tzKCAgKTsgIGkrKykKKyAgICBNVVRFWF9DTEVBTlVQKHRocmlmdF9zc2xfc29ja2V0X2dsb2JhbF9tdXRleF9idWZbaV0pOworICBmcmVlKHRocmlmdF9zc2xfc29ja2V0X2dsb2JhbF9tdXRleF9idWYpOworICB0aHJpZnRfc3NsX3NvY2tldF9nbG9iYWxfbXV0ZXhfYnVmID0gTlVMTDsKKyAgcmV0dXJuIDE7Cit9CisKKy8qCitzdGF0aWMgdm9pZCogdGhyaWZ0X3NzbF9zb2NrZXRfZHluX2xvY2tfY3JlYXRlX2NhbGxiYWNrKGNvbnN0IGNoYXIqIHVuaywgaW50IGlkKSB7CisgIGdfcHJpbnQoIldlIHNob3VsZCBjcmVhdGUgYSBsb2NrXG4iKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHRocmlmdF9zc2xfc29ja2V0X2R5bl9sb2NrX2NhbGxiYWNrKGludCBtb2RlLCB2b2lkKiBsb2NrLCBjb25zdCBjaGFyKiB1bmssIGludCBpZCkgeworICBpZiAobG9jayAhPSBOVUxMKSB7CisgICAgaWYgKG1vZGUgJiBDUllQVE9fTE9DSykgeworICAgICAgZ19wcmludGYoIldlIHNob3VsZCBsb2NrIHRocmVhZCAlZFxuIik7CisgICAgfSBlbHNlIHsKKyAgICAgIGdfcHJpbnRmKCJXZSBzaG91bGQgdW5sb2NrIHRocmVhZCAlZFxuIik7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkIHRocmlmdF9zc2xfc29ja2V0X2R5bl9sb2NrX2Rlc3Ryb3lfY2FsbGJhY2sodm9pZCogbG9jaywgY29uc3QgY2hhciogdW5rLCBpbnQgaWQpIHsKKyAgZ19wcmludGYoIldlIG11c3QgZGVzdHJveSB0aGUgbG9ja1xuIik7Cit9CisgKi8KKworCitHX0RFRklORV9UWVBFKFRocmlmdFNTTFNvY2tldCwgdGhyaWZ0X3NzbF9zb2NrZXQsIFRIUklGVF9UWVBFX1NPQ0tFVCkKKworCisKKy8qKgorICogV2hlbiB0aGVyZSdzIGEgdGhyZWFkIGNvbnRleHQgYXR0YWNoZWQsIHdlIHBhc3MgdGhlIFNTTCBzb2NrZXQgY29udGV4dCBzbyBpdAorICogY2FuIGNoZWNrIGlmIHRoZSBlcnJvciBpcyBvdXRzaWRlIFNTTCwgb24gSS9PIGZvciBleGFtcGxlCisgKiBAcGFyYW0gc29ja2V0CisgKiBAcGFyYW0gZXJyb3JfbXNnCisgKiBAcGFyYW0gdGhyaWZ0X2Vycm9yX25vCisgKiBAcGFyYW0gc3NsX2Vycm9yCisgKiBAcGFyYW0gZXJyb3IKKyAqLworc3RhdGljCit2b2lkIHRocmlmdF9zc2xfc29ja2V0X2dldF9zc2xfZXJyb3IoVGhyaWZ0U1NMU29ja2V0ICpzb2NrZXQsIGNvbnN0IGd1Y2hhciAqZXJyb3JfbXNnLCBndWludCB0aHJpZnRfZXJyb3Jfbm8sIGludCBzc2xfZXJyb3IsIEdFcnJvciAqKmVycm9yKQoreworICB1bnNpZ25lZCBsb25nIGVycm9yX2NvZGU7CisgIGNoYXIgYnVmZmVyWzEwMjRdOworICBpbnQgYnVmZmVyX3NpemU9MTAyNDsKKyAgZ2Jvb2xlYW4gZmlyc3RfZXJyb3IgPSBUUlVFOworICBpbnQgc3NsX2Vycm9yX3R5cGUgPSBTU0xfZ2V0X2Vycm9yKHNvY2tldC0+c3NsLCBzc2xfZXJyb3IpOworICBpZihzc2xfZXJyb3JfdHlwZT4wKXsKKyAgICAgIHN3aXRjaChzc2xfZXJyb3JfdHlwZSl7CisJY2FzZSBTU0xfRVJST1JfU1NMOgorCSAgYnVmZmVyX3NpemUtPXNucHJpbnRmKGJ1ZmZlciwgYnVmZmVyX3NpemUsICJTU0wgJXM6ICIsIGVycm9yX21zZyk7CisJICB3aGlsZSAoKGVycm9yX2NvZGUgPSBFUlJfZ2V0X2Vycm9yKCkpICE9IDAgJiYgYnVmZmVyX3NpemU+MSkgeworCSAgICAgIGNvbnN0IGNoYXIqIHJlYXNvbiA9IEVSUl9yZWFzb25fZXJyb3Jfc3RyaW5nKGVycm9yX2NvZGUpOworCSAgICAgIGlmKHJlYXNvbiE9TlVMTCl7CisJCSAgaWYoIWZpcnN0X2Vycm9yKSB7CisJCSAgICAgIGJ1ZmZlcl9zaXplLT1zbnByaW50ZihidWZmZXIrKDEwMjQtYnVmZmVyX3NpemUpLCBidWZmZXJfc2l6ZSwgIlxuXHQiKTsKKwkJICAgICAgZmlyc3RfZXJyb3I9RkFMU0U7CisJCSAgfQorCQkgIGJ1ZmZlcl9zaXplLT1zbnByaW50ZihidWZmZXIrKDEwMjQtYnVmZmVyX3NpemUpLCBidWZmZXJfc2l6ZSwgIiVsWCglcykgLT4gJXMiLCBlcnJvcl9jb2RlLCByZWFzb24sIFNTTF9zdGF0ZV9zdHJpbmcoc29ja2V0LT5zc2wpKTsKKwkgICAgICB9CisJICB9CisJICBicmVhazsKKwljYXNlIFNTTF9FUlJPUl9TWVNDQUxMOgorCSAgYnVmZmVyX3NpemUtPXNucHJpbnRmKGJ1ZmZlciwgYnVmZmVyX3NpemUsICIlczogIiwgZXJyb3JfbXNnKTsKKwkgIGJ1ZmZlcl9zaXplLT1zbnByaW50ZihidWZmZXIrKDEwMjQtYnVmZmVyX3NpemUpLCBidWZmZXJfc2l6ZSwgIiVsWCAtPiAlcyIsIGVycm5vLCBzdHJlcnJvcihlcnJubykpOworCSAgYnJlYWs7CisJY2FzZSBTU0xfRVJST1JfV0FOVF9SRUFEOgorCSAgYnVmZmVyX3NpemUtPXNucHJpbnRmKGJ1ZmZlciwgYnVmZmVyX3NpemUsICIlczogIiwgZXJyb3JfbXNnKTsKKwkgIGJ1ZmZlcl9zaXplLT1zbnByaW50ZihidWZmZXIrKDEwMjQtYnVmZmVyX3NpemUpLCBidWZmZXJfc2l6ZSwgIiVsWCAtPiAlcyIsIHNzbF9lcnJvcl90eXBlLCAiRXJyb3Igd2hpbGUgcmVhZGluZyBmcm9tIHVuZGVybGF5aW5nIGxheWVyIik7CisJICBicmVhazsKKwljYXNlIFNTTF9FUlJPUl9XQU5UX1dSSVRFOgorCSAgYnVmZmVyX3NpemUtPXNucHJpbnRmKGJ1ZmZlciwgYnVmZmVyX3NpemUsICIlczogIiwgZXJyb3JfbXNnKTsKKwkgIGJ1ZmZlcl9zaXplLT1zbnByaW50ZihidWZmZXIrKDEwMjQtYnVmZmVyX3NpemUpLCBidWZmZXJfc2l6ZSwgIiVsWCAtPiAlcyIsIHNzbF9lcnJvcl90eXBlLCAiRXJyb3Igd2hpbGUgd3JpdHRpbmcgdG8gdW5kZXJsYXlpbmcgbGF5ZXIiKTsKKwkgIGJyZWFrOworCisgICAgICB9CisgICAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9UUkFOU1BPUlRfRVJST1IsCisJCSAgIHRocmlmdF9lcnJvcl9ubywgIiVzIiwgYnVmZmVyKTsKKyAgfQorfQorCisvKioKKyAqIEZvciBnbG9iYWwgU1NMIGVycm9ycworICogQHBhcmFtIGVycm9yX21zZworICogQHBhcmFtIHRocmlmdF9lcnJvcl9ubworICogQHBhcmFtIGVycm9yCisgKi8KK3N0YXRpYwordm9pZCB0aHJpZnRfc3NsX3NvY2tldF9nZXRfZXJyb3IoY29uc3QgZ3VjaGFyICplcnJvcl9tc2csIGd1aW50IHRocmlmdF9lcnJvcl9ubywgR0Vycm9yICoqZXJyb3IpCit7CisgIHVuc2lnbmVkIGxvbmcgZXJyb3JfY29kZTsKKyAgd2hpbGUgKChlcnJvcl9jb2RlID0gRVJSX2dldF9lcnJvcigpKSAhPSAwKSB7CisgICAgICBjb25zdCBjaGFyKiByZWFzb24gPSBFUlJfcmVhc29uX2Vycm9yX3N0cmluZyhlcnJvcl9jb2RlKTsKKyAgICAgIGlmIChyZWFzb24gPT0gTlVMTCkgeworCSAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SLAorCQkgICAgICAgdGhyaWZ0X2Vycm9yX25vLAorCQkgICAgICAgIlNTTCBlcnJvciAlbFg6ICVzIiwgZXJyb3JfY29kZSwgZXJyb3JfbXNnKTsKKyAgICAgIH1lbHNleworCSAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SLAorCQkgICAgICAgdGhyaWZ0X2Vycm9yX25vLAorCQkgICAgICAgIlNTTCBlcnJvciAlbFggJXM6ICVzIiwgZXJyb3JfY29kZSxyZWFzb24sIGVycm9yX21zZyk7CisgICAgICB9CisgIH0KK30KKworCisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9pc19vcGVuICovCitnYm9vbGVhbgordGhyaWZ0X3NzbF9zb2NrZXRfaXNfb3BlbiAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQpCit7CisgIHJldHVybiB0aHJpZnRfc29ja2V0X2lzX29wZW4odHJhbnNwb3J0KTsKK30KKworLyogb3ZlcnJpZGVzIHRocmlmdF90cmFuc3BvcnRfcGVlayAqLworZ2Jvb2xlYW4KK3RocmlmdF9zc2xfc29ja2V0X3BlZWsgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2Jvb2xlYW4gcmV0dmFsID0gRkFMU0U7CisgIFRocmlmdFNTTFNvY2tldCAqc3NsX3NvY2tldCA9IFRIUklGVF9TU0xfU09DS0VUICh0cmFuc3BvcnQpOworICBpZiAodGhyaWZ0X3NzbF9zb2NrZXRfaXNfb3BlbiAodHJhbnNwb3J0KSkKKyAgICB7CisgICAgICBpbnQgcmM7CisgICAgICBnY2hhciBieXRlOworICAgICAgcmMgPSBTU0xfcGVlayhzc2xfc29ja2V0LT5zc2wsICZieXRlLCAxKTsKKyAgICAgIGlmIChyYyA8IDApIHsKKwkgIHRocmlmdF9zc2xfc29ja2V0X2dldF9zc2xfZXJyb3Ioc3NsX3NvY2tldCwgIkNoZWNrIHNvY2tldCBkYXRhIiwKKwkJCQkJICBUSFJJRlRfU1NMX1NPQ0tFVF9FUlJPUl9TU0wsIHJjLCBlcnJvcik7CisgICAgICB9CisgICAgICBpZiAocmMgPT0gMCkgeworCSAgRVJSX2NsZWFyX2Vycm9yKCk7CisgICAgICB9CisgICAgICByZXR2YWwgPSAocmMgPiAwKTsKKyAgICB9CisgIHJldHVybiByZXR2YWw7Cit9CisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9vcGVuICovCitnYm9vbGVhbgordGhyaWZ0X3NzbF9zb2NrZXRfb3BlbiAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICBFUlJfY2xlYXJfZXJyb3IoKTsKKworICBpZiAoIXRocmlmdF9zb2NrZXRfb3Blbih0cmFuc3BvcnQsIGVycm9yKSkgeworICAgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgaWYgKCFUSFJJRlRfU1NMX1NPQ0tFVF9HRVRfQ0xBU1ModHJhbnNwb3J0KS0+aGFuZGxlX2hhbmRzaGFrZSh0cmFuc3BvcnQsIGVycm9yKSkgeworICAgICAgdGhyaWZ0X3NzbF9zb2NrZXRfY2xvc2UodHJhbnNwb3J0LCBOVUxMKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfY2xvc2UgKi8KK2dib29sZWFuCit0aHJpZnRfc3NsX3NvY2tldF9jbG9zZSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICBnYm9vbGVhbiByZXR2YWwgPSBGQUxTRTsKKyAgVGhyaWZ0U1NMU29ja2V0ICpzc2xfc29ja2V0ID0gVEhSSUZUX1NTTF9TT0NLRVQodHJhbnNwb3J0KTsKKyAgaWYoc3NsX3NvY2tldCE9TlVMTCAmJiBzc2xfc29ja2V0LT5zc2wpIHsKKyAgICAgIGludCByYyA9IFNTTF9zaHV0ZG93bihzc2xfc29ja2V0LT5zc2wpOworLyogICAgICBpZiAocmMgPCAwKSB7CisJICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9TU0xfU09DS0VUX0VSUk9SX1NTTDsKKyAgICAgIH0qLworICAgICAgU1NMX2ZyZWUoc3NsX3NvY2tldC0+c3NsKTsKKyAgICAgIHNzbF9zb2NrZXQtPnNzbCA9IE5VTEw7CisgICAgICBFUlJfcmVtb3ZlX3N0YXRlKDApOworICB9CisgIHJldHVybiB0aHJpZnRfc29ja2V0X2Nsb3NlKHRyYW5zcG9ydCwgZXJyb3IpOworfQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfcmVhZCAqLworZ2ludDMyCit0aHJpZnRfc3NsX3NvY2tldF9yZWFkIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgZ3BvaW50ZXIgYnVmLAorCQkJZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKQoreworICBndWludCBtYXhSZWN2UmV0cmllc18gPSAxMDsKKyAgVGhyaWZ0U1NMU29ja2V0ICpzc2xfc29ja2V0ID0gVEhSSUZUX1NTTF9TT0NLRVQgKHRyYW5zcG9ydCk7CisgIGd1aW50IGJ5dGVzID0gMDsKKyAgZ3VpbnQgcmV0cmllcyA9IDA7CisgIFRocmlmdFNvY2tldCAqc29ja2V0ID0gVEhSSUZUX1NPQ0tFVCAodHJhbnNwb3J0KTsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKHNvY2tldC0+c2QgIT0gVEhSSUZUX0lOVkFMSURfU09DS0VUICYmIHNzbF9zb2NrZXQtPnNzbCE9TlVMTCwgRkFMU0UpOworCisgIGZvciAocmV0cmllcz0wOyByZXRyaWVzIDwgbWF4UmVjdlJldHJpZXNfOyByZXRyaWVzKyspIHsKKyAgICAgIGJ5dGVzID0gU1NMX3JlYWQoc3NsX3NvY2tldC0+c3NsLCBidWYsIGxlbik7CisgICAgICBpZiAoYnl0ZXMgPj0gMCkKKwlicmVhazsKKyAgICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgICBpZiAoU1NMX2dldF9lcnJvcihzc2xfc29ja2V0LT5zc2wsIGJ5dGVzKSA9PSBTU0xfRVJST1JfU1lTQ0FMTCkgeworCSAgaWYgKEVSUl9nZXRfZXJyb3IoKSA9PSAwICYmIGVycm5vX2NvcHkgPT0gVEhSSUZUX0VJTlRSKSB7CisJICAgICAgY29udGludWU7CisJICB9CisgICAgICB9ZWxzZXsKKwkgIHRocmlmdF9zc2xfc29ja2V0X2dldF9zc2xfZXJyb3Ioc3NsX3NvY2tldCwgIlJlY2VpdmUgZXJyb3IiLAorCQkJCQkgIFRIUklGVF9TU0xfU09DS0VUX0VSUk9SX1NTTCwgYnl0ZXMsIGVycm9yKTsKKworICAgICAgfQorICAgICAgcmV0dXJuIC0xOworICB9CisgIHJldHVybiBieXRlczsKK30KKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfZW5kCisgKiBjYWxsZWQgd2hlbiB3cml0ZSBpcyBjb21wbGV0ZS4gIG5vdGhpbmcgdG8gZG8gb24gb3VyIGVuZC4gKi8KK2dib29sZWFuCit0aHJpZnRfc3NsX3NvY2tldF9yZWFkX2VuZCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICAvKiBzYXRpc2Z5IC1XYWxsICovCisgIFRIUklGVF9VTlVTRURfVkFSICh0cmFuc3BvcnQpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gVFJVRTsKK30KKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X3dyaXRlICovCitnYm9vbGVhbgordGhyaWZ0X3NzbF9zb2NrZXRfd3JpdGUgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBjb25zdCBncG9pbnRlciBidWYsCisJCQkgY29uc3QgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRTU0xTb2NrZXQgKnNzbF9zb2NrZXQgPSBUSFJJRlRfU1NMX1NPQ0tFVCAodHJhbnNwb3J0KTsKKyAgZ2ludCByZXQgPSAwOworICBndWludCBzZW50ID0gMDsKKyAgVGhyaWZ0U29ja2V0ICpzb2NrZXQgPSBUSFJJRlRfU09DS0VUICh0cmFuc3BvcnQpOworICBnX3JldHVybl92YWxfaWZfZmFpbCAoc29ja2V0LT5zZCAhPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQgJiYgc3NsX3NvY2tldC0+c3NsIT1OVUxMLCBGQUxTRSk7CisKKyAgd2hpbGUgKHNlbnQgPCBsZW4pCisgICAgeworICAgICAgcmV0ID0gU1NMX3dyaXRlIChzc2xfc29ja2V0LT5zc2wsIChndWludDggKilidWYgKyBzZW50LCBsZW4gLSBzZW50KTsKKyAgICAgIGlmIChyZXQgPCAwKQorCXsKKwkgIHRocmlmdF9zc2xfc29ja2V0X2dldF9zc2xfZXJyb3Ioc3NsX3NvY2tldCwgIlNlbmQgZXJyb3IiLAorCQkJCQkgIFRIUklGVF9TU0xfU09DS0VUX0VSUk9SX1NTTCwgcmV0LCBlcnJvcik7CisJICByZXR1cm4gRkFMU0U7CisJfQorICAgICAgc2VudCArPSByZXQ7CisgICAgfQorCisgIHJldHVybiBzZW50PT1sZW47Cit9CisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF93cml0ZV9lbmQKKyAqIGNhbGxlZCB3aGVuIHdyaXRlIGlzIGNvbXBsZXRlLiAgbm90aGluZyB0byBkbyBvbiBvdXIgZW5kLiAqLworZ2Jvb2xlYW4KK3RocmlmdF9zc2xfc29ja2V0X3dyaXRlX2VuZCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICAvKiBzYXRpc2Z5IC1XYWxsICovCisgIFRIUklGVF9VTlVTRURfVkFSICh0cmFuc3BvcnQpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gVFJVRTsKK30KKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoCisgKiBmbHVzaCBwZW5kaW5nIGRhdGEuICBzaW5jZSB3ZSBhcmUgbm90IGJ1ZmZlcmVkLCB0aGlzIGlzIGEgbm8tb3AgKi8KK2dib29sZWFuCit0aHJpZnRfc3NsX3NvY2tldF9mbHVzaCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRTU0xTb2NrZXQgKnNzbF9zb2NrZXQgPSBUSFJJRlRfU1NMX1NPQ0tFVCAodHJhbnNwb3J0KTsKKyAgZ2ludCByZXQgPSAwOworICBndWludCBzZW50ID0gMDsKKworICBUaHJpZnRTb2NrZXQgKnNvY2tldCA9IFRIUklGVF9TT0NLRVQgKHRyYW5zcG9ydCk7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChzb2NrZXQtPnNkICE9IFRIUklGVF9JTlZBTElEX1NPQ0tFVCAmJiBzc2xfc29ja2V0LT5zc2whPU5VTEwsIEZBTFNFKTsKKworICBCSU8qIGJpbyA9IFNTTF9nZXRfd2Jpbyhzc2xfc29ja2V0LT5zc2wpOworICBpZiAoYmlvID09IE5VTEwpIHsKKyAgICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUiwKKwkJICAgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUl9TRU5ELAorCQkgICAiZmFpbGVkIHRvIGZsdXNoLCB3YmlvIHJldHVybmVkIG51bGwiKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAoQklPX2ZsdXNoKGJpbykgIT0gMSkgeworICAgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SLAorCQkgICBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SX1NFTkQsCisJCSAgICJmYWlsZWQgdG8gZmx1c2ggaXQgcmV0dXJuZWQgZXJyb3IiKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KKworCitnYm9vbGVhbgordGhyaWZ0X3NzbF9zb2NrZXRfaGFuZGxlX2hhbmRzaGFrZShUaHJpZnRUcmFuc3BvcnQgKiB0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRTU0xTb2NrZXQgKnNzbF9zb2NrZXQgPSBUSFJJRlRfU1NMX1NPQ0tFVCAodHJhbnNwb3J0KTsKKyAgVGhyaWZ0U29ja2V0ICpzb2NrZXQgPSBUSFJJRlRfU09DS0VUICh0cmFuc3BvcnQpOworICBnX3JldHVybl92YWxfaWZfZmFpbCAodGhyaWZ0X3RyYW5zcG9ydF9pc19vcGVuICh0cmFuc3BvcnQpLCBGQUxTRSk7CisKKyAgaWYoVEhSSUZUX1NTTF9TT0NLRVRfR0VUX0NMQVNTKHNzbF9zb2NrZXQpLT5jcmVhdGVfc3NsX2NvbnRleHQodHJhbnNwb3J0LCBlcnJvcikpeworICAgICAgLypDb250ZXh0IGNyZWF0ZWQqLworICAgICAgU1NMX3NldF9mZChzc2xfc29ja2V0LT5zc2wsIHNvY2tldC0+c2QpOworICAgICAgaW50IHJjOworICAgICAgaWYoc3NsX3NvY2tldC0+c2VydmVyKXsKKwkgIHJjID0gU1NMX2FjY2VwdChzc2xfc29ja2V0LT5zc2wpOworICAgICAgfWVsc2V7CisJICByYyA9IFNTTF9jb25uZWN0KHNzbF9zb2NrZXQtPnNzbCk7CisgICAgICB9CisgICAgICBpZiAocmMgPD0gMCkgeworCSAgdGhyaWZ0X3NzbF9zb2NrZXRfZ2V0X3NzbF9lcnJvcihzc2xfc29ja2V0LCAiRXJyb3Igd2hpbGUgY29ubmVjdC9iaW5kIiwgVEhSSUZUX1NTTF9TT0NLRVRfRVJST1JfQ09OTkVDVF9CSU5ELCByYywgZXJyb3IpOworCSAgcmV0dXJuIEZBTFNFOworICAgICAgfQorICB9ZWxzZQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gdGhyaWZ0X3NzbF9zb2NrZXRfYXV0aG9yaXplKHRyYW5zcG9ydCwgZXJyb3IpOworfQorCitnYm9vbGVhbgordGhyaWZ0X3NzbF9zb2NrZXRfY3JlYXRlX3NzbF9jb250ZXh0KFRocmlmdFRyYW5zcG9ydCAqIHRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFNTTFNvY2tldCAqc29ja2V0ID0gVEhSSUZUX1NTTF9TT0NLRVQgKHRyYW5zcG9ydCk7CisKKyAgaWYoc29ja2V0LT5jdHghPU5VTEwpeworICAgICAgaWYoc29ja2V0LT5zc2whPU5VTEwpIHsKKwkgIHJldHVybiBUUlVFOworICAgICAgfQorCisgICAgICBzb2NrZXQtPnNzbCA9IFNTTF9uZXcoc29ja2V0LT5jdHgpOworICAgICAgaWYgKHNvY2tldC0+c3NsID09IE5VTEwpIHsKKwkgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUiwKKwkJICAgICAgIFRIUklGVF9TU0xfU09DS0VUX0VSUk9SX1RSQU5TUE9SVCwKKwkJICAgICAgICJVbmFibGUgdG8gY3JlYXRlIGRlZmF1bHQgU1NMIGNvbnRleHQiKTsKKwkgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCisKK2dib29sZWFuIHRocmlmdF9zc2xfbG9hZF9jZXJ0X2Zyb21fZmlsZShUaHJpZnRTU0xTb2NrZXQgKnNzbF9zb2NrZXQsIGNvbnN0IGNoYXIgKmZpbGVfbmFtZSkKK3sKKyAgY2hhciBlcnJvcl9idWZmZXJbMjU1XTsKKyAgaWYgKCF0aHJpZnRfc3NsX3NvY2tldF9vcGVuc3NsX2luaXRpYWxpemVkKSB7CisgICAgICBnX2Vycm9yKCJPcGVuU1NMIGlzIG5vdCBpbml0aWFsaXplZCB5ZXQiKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpbnQgcmMgPSBTU0xfQ1RYX2xvYWRfdmVyaWZ5X2xvY2F0aW9ucyhzc2xfc29ja2V0LT5jdHgsIGZpbGVfbmFtZSwgTlVMTCk7CisgIGlmIChyYyAhPSAxKSB7IC8qdmVyaWZ5IGF1dGhlbnRpY2F0aW9uIHJlc3VsdCovCisgICAgICBFUlJfZXJyb3Jfc3RyaW5nX24oRVJSX2dldF9lcnJvcigpLCBlcnJvcl9idWZmZXIsIDI1NCk7CisgICAgICBnX3dhcm5pbmcoIkxvYWQgb2YgY2VydGlmaWNhdGVzIGZhaWxlZDogJXMhIiwgZXJyb3JfYnVmZmVyKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KKworCitnYm9vbGVhbiB0aHJpZnRfc3NsX2xvYWRfY2VydF9mcm9tX2J1ZmZlcihUaHJpZnRTU0xTb2NrZXQgKnNzbF9zb2NrZXQsIGNvbnN0IGNoYXIgY2hhaW5fY2VydHNbXSkKK3sKKyAgZ2Jvb2xlYW4gcmV0dmFsID0gRkFMU0U7CisgIC8qIExvYWQgY2hhaW4gb2YgY2VydHMqLworICBYNTA5ICpjYWNlcnQ9TlVMTDsKKyAgQklPICptZW0gPSBCSU9fbmV3X21lbV9idWYoY2hhaW5fY2VydHMsc3RybGVuKGNoYWluX2NlcnRzKSk7CisgIFg1MDlfU1RPUkUgKmNlcnRfc3RvcmUgPSBTU0xfQ1RYX2dldF9jZXJ0X3N0b3JlKHNzbF9zb2NrZXQtPmN0eCk7CisKKyAgaWYoY2VydF9zdG9yZSE9TlVMTCl7CisgICAgICBpbnQgaW5kZXggPSAwOworICAgICAgd2hpbGUgKChjYWNlcnQgPSBQRU1fcmVhZF9iaW9fWDUwOShtZW0sIE5VTEwsIDAsIE5VTEwpKSE9TlVMTCkgeworCSAgaWYoY2FjZXJ0KSB7CisJICAgICAgWDUwOV9TVE9SRV9hZGRfY2VydChjZXJ0X3N0b3JlLCBjYWNlcnQpOworCSAgICAgIFg1MDlfZnJlZShjYWNlcnQpOworCSAgICAgIGNhY2VydD1OVUxMOworCSAgfSAvKiBGcmVlIGltbWVkaWF0ZWx5ICovCisJICBpbmRleCsrOworICAgICAgfQorICAgICAgcmV0dmFsPVRSVUU7CisgIH0KKyAgQklPX2ZyZWUobWVtKTsKKyAgcmV0dXJuIHJldHZhbDsKK30KKworZ2Jvb2xlYW4KK3RocmlmdF9zc2xfc29ja2V0X2F1dGhvcml6ZShUaHJpZnRUcmFuc3BvcnQgKiB0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRTb2NrZXQgKnNvY2tldCA9IFRIUklGVF9TT0NLRVQgKHRyYW5zcG9ydCk7CisgIFRocmlmdFNTTFNvY2tldCAqc3NsX3NvY2tldCA9IFRIUklGVF9TU0xfU09DS0VUICh0cmFuc3BvcnQpOworICBUaHJpZnRTU0xTb2NrZXRDbGFzcyAqY2xzID0gVEhSSUZUX1NTTF9TT0NLRVRfR0VUX0NMQVNTKHNzbF9zb2NrZXQpOworICBnYm9vbGVhbiBhdXRob3JpemF0aW9uX3Jlc3VsdCA9IEZBTFNFOworCisgIGlmKGNscyE9TlVMTCAmJiBzc2xfc29ja2V0LT5zc2whPU5VTEwpeworICAgICAgaW50IHJjID0gU1NMX2dldF92ZXJpZnlfcmVzdWx0KHNzbF9zb2NrZXQtPnNzbCk7CisgICAgICBpZiAocmMgIT0gWDUwOV9WX09LKSB7IC8qIHZlcmlmeSBhdXRoZW50aWNhdGlvbiByZXN1bHQgKi8KKwkgIGlmIChyYyA9PSBYNTA5X1ZfRVJSX0RFUFRIX1pFUk9fU0VMRl9TSUdORURfQ0VSVCAmJiBzc2xfc29ja2V0LT5hbGxvd19zZWxmc2lnbmVkKSB7CisJICAgICAgZ19kZWJ1ZygiVGhlIGNlcnRpZmljYXRlIGlzIGEgc2VsZi1zaWduZWQgY2VydGlmaWNhdGUgYW5kIGNvbmZpZ3VyYXRpb24gYWxsb3dzIGl0Iik7CisJICB9IGVsc2UgeworCSAgICAgIGdfc2V0X2Vycm9yIChlcnJvciwKKwkJCSAgIFRIUklGVF9UUkFOU1BPUlRfRVJST1IsCisJCQkgICBUSFJJRlRfU1NMX1NPQ0tFVF9FUlJPUl9TU0xfQ0VSVF9WQUxJREFUSU9OX0ZBSUxFRCwKKwkJCSAgICJUaGUgY2VydGlmaWNhdGUgdmVyaWZpY2F0aW9uIGZhaWxlZDogJXMgKCVkKSIsIFg1MDlfdmVyaWZ5X2NlcnRfZXJyb3Jfc3RyaW5nKHJjKSwgcmMpOworCSAgICAgIHJldHVybiBGQUxTRTsKKwkgIH0KKyAgICAgIH0KKworICAgICAgWDUwOSogY2VydCA9IFNTTF9nZXRfcGVlcl9jZXJ0aWZpY2F0ZShzc2xfc29ja2V0LT5zc2wpOworICAgICAgaWYgKGNlcnQgPT0gTlVMTCkgeworCSAgaWYgKFNTTF9nZXRfdmVyaWZ5X21vZGUoc3NsX3NvY2tldC0+c3NsKSAmIFNTTF9WRVJJRllfRkFJTF9JRl9OT19QRUVSX0NFUlQpIHsKKwkgICAgICBnX3NldF9lcnJvciAoZXJyb3IsCisJCQkgICBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SLAorCQkJICAgVEhSSUZUX1NTTF9TT0NLRVRfRVJST1JfU1NMX0NFUlRfVkFMSURBVElPTl9GQUlMRUQsCisJCQkgICAiTm8gY2VydGlmaWNhdGUgcHJlc2VudC4gQXJlIHlvdSBjb25uZWN0aW5nIFNTTCBzZXJ2ZXI/Iik7CisJICAgICAgcmV0dXJuIEZBTFNFOworCSAgfQorCSAgZ19kZWJ1ZygiTm8gY2VydGlmaWNhdGUgcmVxdWlyZWQiKTsKKwkgIHJldHVybiBUUlVFOworICAgICAgfQorCisgICAgICAvKiBjZXJ0aWZpY2F0ZSBpcyBwcmVzZW50LCBzaW5jZSB3ZSBkb24ndCBzdXBwb3J0IGFjY2VzcyBtYW5hZ2VyIHdlIGFyZSBkb25lICovCisgICAgICBpZiAoY2xzLT5hdXRob3JpemVfcGVlciA9PSBOVUxMKSB7CisJICBYNTA5X2ZyZWUoY2VydCk7CisJICBnX2RlYnVnKCJDZXJ0aWZpY2F0ZSBwcmVzZW50ZWQgYnV0IHdlJ3JlIG5vdCBjaGVja2luZyBpdCIpOworCSAgcmV0dXJuIFRSVUU7CisgICAgICB9IGVsc2UgeworCSAgLyogYm90aCBjZXJ0aWZpY2F0ZSBhbmQgYWNjZXNzIG1hbmFnZXIgYXJlIHByZXNlbnQgKi8KKwkgIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIHNhOworCSAgc29ja2xlbl90IHNhTGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlKTsKKwkgIGlmIChnZXRwZWVybmFtZShzb2NrZXQtPnNkLCAoc3RydWN0IHNvY2thZGRyKikmc2EsICZzYUxlbmd0aCkgIT0gMCkgeworCSAgICAgIHNhLnNzX2ZhbWlseSA9IEFGX1VOU1BFQzsKKwkgIH0KKwkgIGF1dGhvcml6YXRpb25fcmVzdWx0ID0gY2xzLT5hdXRob3JpemVfcGVlcih0cmFuc3BvcnQsIGNlcnQsICZzYSwgZXJyb3IpOworICAgICAgfQorICAgICAgaWYoY2VydCAhPSBOVUxMKSB7CisJICBYNTA5X2ZyZWUoY2VydCk7CisgICAgICB9CisgIH0KKworICByZXR1cm4gYXV0aG9yaXphdGlvbl9yZXN1bHQ7Cit9CisKKworLyogaW5pdGlhbGl6ZXMgdGhlIGluc3RhbmNlICovCitzdGF0aWMgdm9pZAordGhyaWZ0X3NzbF9zb2NrZXRfaW5pdCAoVGhyaWZ0U1NMU29ja2V0ICpzb2NrZXQpCit7CisgIEdFcnJvciAqZXJyb3IgPSBOVUxMOworICBzb2NrZXQtPnNzbCA9IE5VTEw7CisgIHNvY2tldC0+Y3R4ID0gdGhyaWZ0X3NzbF9zb2NrZXRfY29udGV4dF9pbml0aWFsaXplKFNTTFRMUywgJmVycm9yKTsKKyAgaWYoc29ja2V0LT5jdHggPT0gTlVMTCkgeworICAgICAgZ19pbmZvKCJUaGUgU1NMIGNvbnRleHQgd2FzIG5vdCBhdXRvbWF0aWNhbGx5IGluaXRpYWxpemVkIHdpdGggcHJvdG9jb2wgJWQiLCBTU0xUTFMpOworICAgICAgaWYoZXJyb3IhPU5VTEwpeworCSAgZ19pbmZvKCJSZXBvcnRlZCByZWFzb24gJXMiLCBlcnJvci0+bWVzc2FnZSk7CisJICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKKyAgICAgIH0KKyAgfQorICBzb2NrZXQtPnNlcnZlciA9IEZBTFNFOworICBzb2NrZXQtPmFsbG93X3NlbGZzaWduZWQgPSBGQUxTRTsKKworfQorCisvKiBkZXN0cnVjdG9yICovCitzdGF0aWMgdm9pZAordGhyaWZ0X3NzbF9zb2NrZXRfZmluYWxpemUgKEdPYmplY3QgKm9iamVjdCkKK3sKKyAgVGhyaWZ0U1NMU29ja2V0ICpzb2NrZXQgPSBUSFJJRlRfU1NMX1NPQ0tFVCAob2JqZWN0KTsKKyAgR0Vycm9yICplcnJvcj1OVUxMOworICBpZihzb2NrZXQhPU5VTEwpeworICAgICAgZ19kZWJ1ZygiSW5zdGFuY2UgJXAgZGVzdHJveWVkIiwgKHZvaWQgKilzb2NrZXQpOworICAgICAgaWYoc29ja2V0LT5zc2wgIT0gTlVMTCkKKwl7CisJICB0aHJpZnRfc3NsX3NvY2tldF9jbG9zZShUSFJJRlRfVFJBTlNQT1JUKG9iamVjdCksICZlcnJvcik7CisJICBzb2NrZXQtPnNzbD1OVUxMOworCX0KKworICAgICAgaWYoc29ja2V0LT5jdHghPU5VTEwpeworCSAgZ19kZWJ1ZygiRnJlZWluZyB0aGUgY29udGV4dCBmb3IgdGhlIGluc3RhbmNlIik7CisJICBTU0xfQ1RYX2ZyZWUoc29ja2V0LT5jdHgpOworCSAgc29ja2V0LT5jdHg9TlVMTDsKKyAgICAgIH0KKyAgfQorCisgIGlmIChHX09CSkVDVF9DTEFTUyAodGhyaWZ0X3NzbF9zb2NrZXRfcGFyZW50X2NsYXNzKS0+ZmluYWxpemUpCisgICAgKCpHX09CSkVDVF9DTEFTUyAodGhyaWZ0X3NzbF9zb2NrZXRfcGFyZW50X2NsYXNzKS0+ZmluYWxpemUpIChvYmplY3QpOworfQorCisvKiBwcm9wZXJ0eSBhY2Nlc3NvciAqLwordm9pZAordGhyaWZ0X3NzbF9zb2NrZXRfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICpvYmplY3QsIGd1aW50IHByb3BlcnR5X2lkLAorCQkJCUdWYWx1ZSAqdmFsdWUsIEdQYXJhbVNwZWMgKnBzcGVjKQoreworICBUaHJpZnRTU0xTb2NrZXQgKnNvY2tldCA9IFRIUklGVF9TU0xfU09DS0VUIChvYmplY3QpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHNwZWMpOworCisgIHN3aXRjaCAocHJvcGVydHlfaWQpCisgIHsKKyAgICBjYXNlIFBST1BfVEhSSUZUX1NTTF9TT0NLRVRfQ09OVEVYVDoKKyAgICAgIGdfdmFsdWVfc2V0X3BvaW50ZXIgKHZhbHVlLCBzb2NrZXQtPmN0eCk7CisgICAgICBicmVhazsKKyAgfQorfQorCisvKiBwcm9wZXJ0eSBtdXRhdG9yICovCit2b2lkCit0aHJpZnRfc3NsX3NvY2tldF9zZXRfcHJvcGVydHkgKEdPYmplY3QgKm9iamVjdCwgZ3VpbnQgcHJvcGVydHlfaWQsCisJCQkJY29uc3QgR1ZhbHVlICp2YWx1ZSwgR1BhcmFtU3BlYyAqcHNwZWMpCit7CisgIFRocmlmdFNTTFNvY2tldCAqc29ja2V0ID0gVEhSSUZUX1NTTF9TT0NLRVQgKG9iamVjdCk7CisKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHBzcGVjKTsKKyAgc3dpdGNoIChwcm9wZXJ0eV9pZCkKKyAgeworICAgIGNhc2UgUFJPUF9USFJJRlRfU1NMX1NPQ0tFVF9DT05URVhUOgorICAgICAgaWYoc29ja2V0LT5jdHghPU5VTEwpeworCSAgZ19kZWJ1ZygiRnJlZWluZyB0aGUgY29udGV4dCBzaW5jZSB3ZSBhcmUgc2V0dGluZyBhIG5ldyBvbmUiKTsKKwkgIFNTTF9DVFhfZnJlZShzb2NrZXQtPmN0eCk7CisgICAgICB9CisgICAgICBzb2NrZXQtPmN0eCA9IGdfdmFsdWVfZ2V0X3BvaW50ZXIodmFsdWUpOyAvKiBXZSBjb3B5IHRoZSBjb250ZXh0ICovCisgICAgICBicmVhazsKKworICAgIGNhc2UgUFJPUF9USFJJRlRfU1NMX1NFTEZfU0lHTkVEOgorICAgICAgc29ja2V0LT5hbGxvd19zZWxmc2lnbmVkID0gZ192YWx1ZV9nZXRfYm9vbGVhbih2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgZ193YXJuaW5nKCJUcnlpbmcgdG8gc2V0IHByb3BlcnR5ICVpIHRoYXQgZG9lc24ndCBleGlzdHMhIiwgcHJvcGVydHlfaWQpOworICAgICAgLyogICAgdGhyaWZ0X3NvY2tldF9zZXRfcHJvcGVydHkob2JqZWN0LCBwcm9wZXJ0eV9pZCwgdmFsdWUsIHBzcGVjKTsgKi8KKyAgICAgIGJyZWFrOworICB9Cit9CisKK3ZvaWQKK3RocmlmdF9zc2xfc29ja2V0X2luaXRpYWxpemVfb3BlbnNzbCh2b2lkKQoreworICBpZih0aHJpZnRfc3NsX3NvY2tldF9vcGVuc3NsX2luaXRpYWxpemVkKXsKKyAgICAgIHJldHVybjsKKyAgfQorICB0aHJpZnRfc3NsX3NvY2tldF9vcGVuc3NsX2luaXRpYWxpemVkPVRSVUU7CisgIFNTTF9saWJyYXJ5X2luaXQoKTsKKyAgRVJSX2xvYWRfY3J5cHRvX3N0cmluZ3MoKTsKKyAgU1NMX2xvYWRfZXJyb3Jfc3RyaW5ncygpOworICBFUlJfbG9hZF9CSU9fc3RyaW5ncygpOworCisgIC8qIFNldHVwIGxvY2tpbmcgKi8KKyAgZ19kZWJ1ZygiV2Ugc2V0dXAgJWQgdGhyZWFkcyBsb2NrcyIsIHRocmlmdF9zc2xfc29ja2V0X3N0YXRpY190aHJlYWRfc2V0dXAoKSk7CisKKyAgLyogZHluYW1pYyBsb2NraW5nCisgIENSWVBUT19zZXRfZHlubG9ja19jcmVhdGVfY2FsbGJhY2sodGhyaWZ0X3NzbF9zb2NrZXRfZHluX2xvY2tfY3JlYXRlX2NhbGxiYWNrKTsKKyAgQ1JZUFRPX3NldF9keW5sb2NrX2xvY2tfY2FsbGJhY2sodGhyaWZ0X3NzbF9zb2NrZXRfZHluX2xvY2tfY2FsbGJhY2spOworICBDUllQVE9fc2V0X2R5bmxvY2tfZGVzdHJveV9jYWxsYmFjayh0aHJpZnRfc3NsX3NvY2tldF9keW5fbG9ja19kZXN0cm95X2NhbGxiYWNrKTsKKyAgICovCit9CisKKwordm9pZCB0aHJpZnRfc3NsX3NvY2tldF9maW5hbGl6ZV9vcGVuc3NsKHZvaWQpCit7CisgIGlmICghdGhyaWZ0X3NzbF9zb2NrZXRfb3BlbnNzbF9pbml0aWFsaXplZCkgeworICAgICAgcmV0dXJuOworICB9CisgIHRocmlmdF9zc2xfc29ja2V0X29wZW5zc2xfaW5pdGlhbGl6ZWQgPSBGQUxTRTsKKworICBnX2RlYnVnKCJXZSBjbGVhcmVkICVkIHRocmVhZHMgbG9ja3MiLCB0aHJpZnRfc3NsX3NvY2tldF9zdGF0aWNfdGhyZWFkX2NsZWFudXAoKSk7CisgIC8qIE5vdCBzdXBwb3J0ZWQKKyAgQ1JZUFRPX3NldF9sb2NraW5nX2NhbGxiYWNrKE5VTEwpOworICBDUllQVE9fc2V0X2R5bmxvY2tfY3JlYXRlX2NhbGxiYWNrKE5VTEwpOworICBDUllQVE9fc2V0X2R5bmxvY2tfbG9ja19jYWxsYmFjayhOVUxMKTsKKyAgQ1JZUFRPX3NldF9keW5sb2NrX2Rlc3Ryb3lfY2FsbGJhY2soTlVMTCk7CisgICAqLworICBFUlJfZnJlZV9zdHJpbmdzKCk7CisgIEVWUF9jbGVhbnVwKCk7CisgIENSWVBUT19jbGVhbnVwX2FsbF9leF9kYXRhKCk7CisgIEVSUl9yZW1vdmVfc3RhdGUoMCk7Cit9CisKKworLyogaW5pdGlhbGl6ZXMgdGhlIGNsYXNzICovCitzdGF0aWMgdm9pZAordGhyaWZ0X3NzbF9zb2NrZXRfY2xhc3NfaW5pdCAoVGhyaWZ0U1NMU29ja2V0Q2xhc3MgKmNscykKK3sKKyAgVGhyaWZ0VHJhbnNwb3J0Q2xhc3MgKnR0YyA9IFRIUklGVF9UUkFOU1BPUlRfQ0xBU1MgKGNscyk7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChjbHMpOworICBHUGFyYW1TcGVjICpwYXJhbV9zcGVjID0gTlVMTDsKKworICBnX2RlYnVnKCJJbml0aWFsaXphdGlvbiBvZiBUaHJpZnRTU0xTb2NrZXRDbGFzcyIpOworICAvKiBzZXR1cCBhY2Nlc3NvcnMgYW5kIG11dGF0b3JzICovCisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IHRocmlmdF9zc2xfc29ja2V0X2dldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gdGhyaWZ0X3NzbF9zb2NrZXRfc2V0X3Byb3BlcnR5OworICBwYXJhbV9zcGVjID0gZ19wYXJhbV9zcGVjX3BvaW50ZXIgKCJzc2xfY29udGV4dCIsCisJCQkJICAgICAiU1NMQ29udGV4dCIsCisJCQkJICAgICAiU2V0IHRoZSBTU0wgY29udGV4dCBmb3IgaGFuZHNoYWtlIHdpdGggdGhlIHJlbW90ZSBob3N0IiwKKwkJCQkgICAgIEdfUEFSQU1fUkVBRFdSSVRFKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9USFJJRlRfU1NMX1NPQ0tFVF9DT05URVhULAorCQkJCSAgIHBhcmFtX3NwZWMpOworICBwYXJhbV9zcGVjID0gZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJzc2xfYWNjZXB0X3NlbGZzaWduZWQiLAorCQkJCSAgICAgIkFjY2VwdCBTZWxmIFNpZ25lZCIsCisJCQkJICAgICAiV2hldGhlciBvciBub3QgYWNjZXB0IHNlbGYgc2lnbmVkIGNlcnRpZmljYXRlIiwKKwkJCQkgICAgIEZBTFNFLAorCQkJCSAgICAgR19QQVJBTV9SRUFEV1JJVEUpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1RIUklGVF9TU0xfU0VMRl9TSUdORUQsCisJCQkJICAgcGFyYW1fc3BlYyk7CisgIC8qIENsYXNzIG1ldGhvZHMgKi8KKyAgY2xzLT5oYW5kbGVfaGFuZHNoYWtlID0gdGhyaWZ0X3NzbF9zb2NrZXRfaGFuZGxlX2hhbmRzaGFrZTsKKyAgY2xzLT5jcmVhdGVfc3NsX2NvbnRleHQgPSB0aHJpZnRfc3NsX3NvY2tldF9jcmVhdGVfc3NsX2NvbnRleHQ7CisKKyAgLyogT3ZlcnJpZGUgKi8KKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSB0aHJpZnRfc3NsX3NvY2tldF9maW5hbGl6ZTsKKyAgdHRjLT5pc19vcGVuID0gdGhyaWZ0X3NzbF9zb2NrZXRfaXNfb3BlbjsKKyAgdHRjLT5wZWVrID0gdGhyaWZ0X3NzbF9zb2NrZXRfcGVlazsKKyAgdHRjLT5vcGVuID0gdGhyaWZ0X3NzbF9zb2NrZXRfb3BlbjsKKyAgdHRjLT5jbG9zZSA9IHRocmlmdF9zc2xfc29ja2V0X2Nsb3NlOworICB0dGMtPnJlYWQgPSB0aHJpZnRfc3NsX3NvY2tldF9yZWFkOworICB0dGMtPnJlYWRfZW5kID0gdGhyaWZ0X3NzbF9zb2NrZXRfcmVhZF9lbmQ7CisgIHR0Yy0+d3JpdGUgPSB0aHJpZnRfc3NsX3NvY2tldF93cml0ZTsKKyAgdHRjLT53cml0ZV9lbmQgPSB0aHJpZnRfc3NsX3NvY2tldF93cml0ZV9lbmQ7CisgIHR0Yy0+Zmx1c2ggPSB0aHJpZnRfc3NsX3NvY2tldF9mbHVzaDsKK30KKworCisvKgorICogUHVibGljIEFQSQorICovCitUaHJpZnRTU0xTb2NrZXQqCit0aHJpZnRfc3NsX3NvY2tldF9uZXcoVGhyaWZ0U1NMU29ja2V0UHJvdG9jb2wgc3NsX3Byb3RvY29sLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0U1NMU29ja2V0ICp0aHJpZnRTU0xTb2NrZXQgPSBOVUxMOworICBTU0xfQ1RYICpzc2xfY29udGV4dCA9IE5VTEw7CisgIC8qIENyZWF0ZSB0aGUgY29udGV4dCAqLworICBpZigoc3NsX2NvbnRleHQ9dGhyaWZ0X3NzbF9zb2NrZXRfY29udGV4dF9pbml0aWFsaXplKHNzbF9wcm90b2NvbCwgZXJyb3IpKT09TlVMTCl7CisgICAgICBnX3dhcm5pbmcoIldlIGNhbm5vdCBpbml0aWFsaXplIGNvbnRleHQgZm9yIHByb3RvY29sICVkIiwgc3NsX3Byb3RvY29sKTsKKyAgICAgIHJldHVybiB0aHJpZnRTU0xTb2NrZXQ7CisgIH0KKworICAvKiBGSVhNRSBpZiB0aGUgcHJvdG9jb2wgaXMgZGlmZmVyZW50PyAqLworICB0aHJpZnRTU0xTb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NTTF9TT0NLRVQsICJzc2xfY29udGV4dCIsIHNzbF9jb250ZXh0LCBOVUxMKTsKKyAgcmV0dXJuIHRocmlmdFNTTFNvY2tldDsKK30KKworVGhyaWZ0U1NMU29ja2V0KgordGhyaWZ0X3NzbF9zb2NrZXRfbmV3X3dpdGhfaG9zdChUaHJpZnRTU0xTb2NrZXRQcm90b2NvbCBzc2xfcHJvdG9jb2wsIGdjaGFyICpob3N0bmFtZSwgZ3VpbnQgcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFNTTFNvY2tldCAqdGhyaWZ0U1NMU29ja2V0ID0gTlVMTDsKKyAgU1NMX0NUWCAqc3NsX2NvbnRleHQgPSBOVUxMOworICAvKiBDcmVhdGUgdGhlIGNvbnRleHQgKi8KKyAgaWYoKHNzbF9jb250ZXh0PXRocmlmdF9zc2xfc29ja2V0X2NvbnRleHRfaW5pdGlhbGl6ZShzc2xfcHJvdG9jb2wsIGVycm9yKSk9PU5VTEwpeworICAgICAgLyogRklYTUUgRG8gZXJyb3IgY29udHJvbCAqLworICAgICAgcmV0dXJuIHRocmlmdFNTTFNvY2tldDsKKyAgfQorICAvKiBGSVhNRSBpZiB0aGUgcHJvdG9jb2wgaXMgZGlmZmVyZW50PyAqLworICB0aHJpZnRTU0xTb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NTTF9TT0NLRVQsICJzc2xfY29udGV4dCIsIHNzbF9jb250ZXh0LCAiaG9zdG5hbWUiLCBob3N0bmFtZSwgInBvcnQiLCBwb3J0LCBOVUxMKTsKKyAgcmV0dXJuIHRocmlmdFNTTFNvY2tldDsKK30KKwordm9pZCB0aHJpZnRfc3NsX3NvY2tldF9zZXRfbWFuYWdlcihUaHJpZnRTU0xTb2NrZXQgKnNzbF9zb2NrZXQsIEFVVEhPUklaQVRJT05fTUFOQUdFUl9DQUxMQkFDSyBjYWxsYmFjaykKK3sKKyAgVGhyaWZ0U1NMU29ja2V0Q2xhc3MgKnNzbFNvY2tldENsYXNzID0gVEhSSUZUX1NTTF9TT0NLRVRfR0VUX0NMQVNTIChzc2xfc29ja2V0KTsKKyAgaWYoc3NsU29ja2V0Q2xhc3MpeworICAgICAgc3NsU29ja2V0Q2xhc3MtPmF1dGhvcml6ZV9wZWVyID0gY2FsbGJhY2s7CisgIH0KK30KKworCitTU0xfQ1RYKgordGhyaWZ0X3NzbF9zb2NrZXRfY29udGV4dF9pbml0aWFsaXplKFRocmlmdFNTTFNvY2tldFByb3RvY29sIHNzbF9wcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFNTTF9DVFgqIGNvbnRleHQgPSBOVUxMOworICBzd2l0Y2goc3NsX3Byb3RvY29sKXsKKyAgICBjYXNlIFNTTFRMUzoKKyAgICAgIGNvbnRleHQgPSBTU0xfQ1RYX25ldyhTU0x2MjNfbWV0aG9kKCkpOworICAgICAgYnJlYWs7CisjaWZuZGVmIE9QRU5TU0xfTk9fU1NMMworICAgIGNhc2UgU1NMdjM6CisgICAgICBjb250ZXh0ID0gU1NMX0NUWF9uZXcoU1NMdjNfbWV0aG9kKCkpOworICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICBjYXNlIFRMU3YxXzA6CisgICAgICBjb250ZXh0ID0gU1NMX0NUWF9uZXcoVExTdjFfbWV0aG9kKCkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUTFN2MV8xOgorICAgICAgY29udGV4dCA9IFNTTF9DVFhfbmV3KFRMU3YxXzFfbWV0aG9kKCkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUTFN2MV8yOgorICAgICAgY29udGV4dCA9IFNTTF9DVFhfbmV3KFRMU3YxXzJfbWV0aG9kKCkpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUiwKKwkJICAgVEhSSUZUX1NTTF9TT0NLRVRfRVJST1JfQ0lQSEVSX05PVF9BVkFJTEFCTEUsCisJCSAgICJUaGUgU1NMIHByb3RvY29sIGlzIHVua25vd24gZm9yICVkIiwgc3NsX3Byb3RvY29sKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgICAgYnJlYWs7CisgIH0KKworICBpZiAoY29udGV4dCA9PSBOVUxMKSB7CisgICAgICB0aHJpZnRfc3NsX3NvY2tldF9nZXRfZXJyb3IoIk5vIGNpcGhlciBvdmVybGF5IiwgVEhSSUZUX1NTTF9TT0NLRVRfRVJST1JfQ0lQSEVSX05PVF9BVkFJTEFCTEUsIGVycm9yKTsKKyAgICAgIHJldHVybiBOVUxMOworICB9CisgIFNTTF9DVFhfc2V0X21vZGUoY29udGV4dCwgU1NMX01PREVfQVVUT19SRVRSWSk7CisKKyAgLyogRGlzYWJsZSBob3JyaWJseSBpbnNlY3VyZSBTU0x2MiBhbmQgU1NMdjMgcHJvdG9jb2xzIGJ1dCBhbGxvdyBhIGhhbmRzaGFrZQorICAgICB3aXRoIG9sZGVyIGNsaWVudHMgc28gdGhleSBnZXQgYSBncmFjZWZ1bCBkZW5pYWwuICovCisgIGlmIChzc2xfcHJvdG9jb2wgPT0gU1NMVExTKSB7CisgICAgICBTU0xfQ1RYX3NldF9vcHRpb25zKGNvbnRleHQsIFNTTF9PUF9OT19TU0x2Mik7CisgICAgICBTU0xfQ1RYX3NldF9vcHRpb25zKGNvbnRleHQsIFNTTF9PUF9OT19TU0x2Myk7ICAgLyogVEhSSUZULTMxNjQgKi8KKyAgfQorCisgIHJldHVybiBjb250ZXh0OworfQorCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc3NsX3NvY2tldC5oIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NzbF9zb2NrZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2E0NjVhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NzbF9zb2NrZXQuaApAQCAtMCwwICsxLDIxOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfU1NMX1NPQ0tFVF9ICisjZGVmaW5lIF9USFJJRlRfU1NMX1NPQ0tFVF9ICisKKyNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgorI2luY2x1ZGUgPGdsaWIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcmFuZC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvc3NsLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5djMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9wbGF0Zm9ybV9zb2NrZXQuaD4KKworR19CRUdJTl9ERUNMUworCisvKiEgXGZpbGUgdGhyaWZ0X3NzbF9zb2NrZXQuaAorICogIFxicmllZiBTU0wgU29ja2V0IGltcGxlbWVudGF0aW9uIG9mIGEgVGhyaWZ0IHRyYW5zcG9ydC4gIFN1YmNsYXNzZXMgdGhlCisgKiAgICAgICAgIFRocmlmdFNvY2tldCBjbGFzcy4gQmFzZWQgb24gcGxhaW4gb3BlbnNzbC4KKyAqICAgICAgICAgSW4gdGhlIGZ1dHVyZSB3ZSBzaG91bGQgdGFrZSBhIGxvb2sgdG8gaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTAxNgorICovCisKKy8qIHR5cGUgbWFjcm9zICovCisjZGVmaW5lIFRIUklGVF9UWVBFX1NTTF9TT0NLRVQgKHRocmlmdF9zc2xfc29ja2V0X2dldF90eXBlICgpKQorI2RlZmluZSBUSFJJRlRfU1NMX1NPQ0tFVChvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIFRIUklGVF9UWVBFX1NTTF9TT0NLRVQsIFRocmlmdFNTTFNvY2tldCkpCisjZGVmaW5lIFRIUklGVF9JU19TU0xfU09DS0VUKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgVEhSSUZUX1RZUEVfU1NMX1NPQ0tFVCkpCisjZGVmaW5lIFRIUklGVF9TU0xfU09DS0VUX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCBUSFJJRlRfVFlQRV9TU0xfU09DS0VULCBUaHJpZnRTU0xTb2NrZXRDbGFzcykpCisjZGVmaW5lIFRIUklGVF9JU19TU0xfU09DS0VUX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCBUSFJJRlRfVFlQRV9TU0xfU09DS0VUKSkKKyNkZWZpbmUgVEhSSUZUX1NTTF9TT0NLRVRfR0VUX0NMQVNTKG9iaikgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBUSFJJRlRfVFlQRV9TU0xfU09DS0VULCBUaHJpZnRTU0xTb2NrZXRDbGFzcykpCisKKworLyogZGVmaW5lIGVycm9yL2V4Y2VwdGlvbiB0eXBlcyAqLwordHlwZWRlZiBlbnVtCit7CisgIFRIUklGVF9TU0xfU09DS0VUX0VSUk9SX1RSQU5TUE9SVD03LAorICBUSFJJRlRfU1NMX1NPQ0tFVF9FUlJPUl9DT05ORUNUX0JJTkQsCisgIFRIUklGVF9TU0xfU09DS0VUX0VSUk9SX0NJUEhFUl9OT1RfQVZBSUxBQkxFLAorICBUSFJJRlRfU1NMX1NPQ0tFVF9FUlJPUl9TU0wsCisgIFRIUklGVF9TU0xfU09DS0VUX0VSUk9SX1NTTF9DRVJUX1ZBTElEQVRJT05fRkFJTEVECit9IFRocmlmdFNTTFNvY2tldEVycm9yOworCisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRTU0xTb2NrZXQgVGhyaWZ0U1NMU29ja2V0OworCisvKiEKKyAqIFRocmlmdCBTU0wgU29ja2V0IGluc3RhbmNlLgorICovCitzdHJ1Y3QgX1RocmlmdFNTTFNvY2tldAoreworICBUaHJpZnRTb2NrZXQgcGFyZW50OworCisgIC8qIHByaXZhdGUgKi8KKyAgU1NMICpzc2w7CisgIFNTTF9DVFgqIGN0eDsKKyAgZ2Jvb2xlYW4gc2VydmVyOworICBnYm9vbGVhbiBhbGxvd19zZWxmc2lnbmVkOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdFNTTFNvY2tldENsYXNzIFRocmlmdFNTTFNvY2tldENsYXNzOwordHlwZWRlZiBnYm9vbGVhbiAoKiBBVVRIT1JJWkFUSU9OX01BTkFHRVJfQ0FMTEJBQ0spIChUaHJpZnRUcmFuc3BvcnQgKiB0cmFuc3BvcnQsIFg1MDkgKmNlcnQsIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlICphZGRyLCBHRXJyb3IgKiplcnJvcik7CisKKy8qIQorICogVGhyaWZ0IFNvY2tldCBjbGFzcy4KKyAqLworc3RydWN0IF9UaHJpZnRTU0xTb2NrZXRDbGFzcworeworICBUaHJpZnRTb2NrZXRDbGFzcyBwYXJlbnQ7CisKKyAgZ2Jvb2xlYW4gKCogaGFuZGxlX2hhbmRzaGFrZSkgKFRocmlmdFRyYW5zcG9ydCAqIHRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpOworICBnYm9vbGVhbiAoKiBjcmVhdGVfc3NsX2NvbnRleHQpIChUaHJpZnRUcmFuc3BvcnQgKiB0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKTsKKyAgZ2Jvb2xlYW4gKCogYXV0aG9yaXplX3BlZXIpIChUaHJpZnRUcmFuc3BvcnQgKiB0cmFuc3BvcnQsIFg1MDkgKmNlcnQsIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlICphZGRyLCBHRXJyb3IgKiplcnJvcik7CisKKyAgLyogUGFkZGluZyB0byBhbGxvdyBhZGRpbmcgdXAgdG8gMTIgbmV3IHZpcnR1YWwgZnVuY3Rpb25zIHdpdGhvdXQKKyAgICogYnJlYWtpbmcgQUJJLiAqLworICBncG9pbnRlciBwYWRkaW5nWzEyXTsKK307CisKK2VudW0gX1RocmlmdFNTTFNvY2tldFByb3RvY29sIHsKKyAgU1NMVExTICA9IDAsICAvKiBTdXBwb3J0cyBTU0x2MiBhbmQgU1NMdjMgaGFuZHNoYWtlIGJ1dCBvbmx5IG5lZ290aWF0ZXMgYXQgVExTdjFfMCBvciBsYXRlci4gKi8KKy8qU1NMdjIgICA9IDEsICAgSE9SUklCTFkgSU5TRUNVUkUhICovCisgIFNTTHYzICAgPSAyLCAgLyogU3VwcG9ydHMgU1NMdjMgb25seSAtIGFsc28gaG9ycmlibHkgaW5zZWN1cmUhICovCisgIFRMU3YxXzAgPSAzLCAgLyogU3VwcG9ydHMgVExTdjFfMCBvciBsYXRlci4gKi8KKyAgVExTdjFfMSA9IDQsICAvKiBTdXBwb3J0cyBUTFN2MV8xIG9yIGxhdGVyLiAqLworICBUTFN2MV8yID0gNSwgIC8qIFN1cHBvcnRzIFRMU3YxXzIgb3IgbGF0ZXIuICovCisgIExBVEVTVCAgPSBUTFN2MV8yCit9OwordHlwZWRlZiBlbnVtIF9UaHJpZnRTU0xTb2NrZXRQcm90b2NvbCBUaHJpZnRTU0xTb2NrZXRQcm90b2NvbDsKKworCisvKiBJbnRlcm5hbCBmdW5jdGlvbnMgKi8KK1NTTF9DVFgqCit0aHJpZnRfc3NsX3NvY2tldF9jb250ZXh0X2luaXRpYWxpemUoVGhyaWZ0U1NMU29ja2V0UHJvdG9jb2wgc3NsX3Byb3RvY29sLCBHRXJyb3IgKiplcnJvcik7CisKKworLyogdXNlZCBieSBUSFJJRlRfVFlQRV9TU0xfU09DS0VUICovCitHVHlwZSB0aHJpZnRfc3NsX3NvY2tldF9nZXRfdHlwZSAodm9pZCk7CisKKy8qIFB1YmxpYyBBUEkgKi8KKworLyoqCisgKiBAYnJpZWYgU2V0IGEgcGlubmluZyBtYW5hZ2VyIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgb25lLgorICoKKyAqIFRoZSBwaW5uaW5nIG1hbmFnZXIgd2lsbCBiZSB1c2VkIGR1cmluZyB0aGUgU1NMIGhhbmRzaGFrZSB0byBjaGVjayBjZXJ0aWZpY2F0ZQorICogYW5kIHBpbm5pbmcgcGFyYW1ldGVycy4KKyAqCisgKiBAcGFyYW0gc3NsX3NvY2tldCBTU0wgU29ja2V0IHRvIG9wZXJhdGUgb24uCisgKiBAcGFyYW0gY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCB3aWxsIHRha2UgdGhlIGNvbnRyb2wgd2hpbGUgdmFsaWRhdGluZyBwaW5uaW5nCisgKgorICovCit2b2lkIHRocmlmdF9zc2xfc29ja2V0X3NldF9tYW5hZ2VyKFRocmlmdFNTTFNvY2tldCAqc3NsX3NvY2tldCwgQVVUSE9SSVpBVElPTl9NQU5BR0VSX0NBTExCQUNLIGNhbGxiYWNrKTsKKworLyogVGhpcyBpcyB0aGUgU1NMIEFQSSAqLworLyoqCisgKiBDb252ZW5pZW5jZSBmdW5jdGlvbiB0byBjcmVhdGUgYSBuZXcgU1NMIGNvbnRleHQgd2l0aCB0aGUgcHJvdG9jb2wgc3BlY2lmaWVkCisgKiBhbmQgYXNzaWduIHRoaXMgbmV3IGNvbnRleHQgdG8gdGhlIGNyZWF0ZWQgVGhyaWZ0U1NMU29ja2V0IHdpdGggc3BlY2lmaWVkIGhvc3Q6cG9ydC4KKyAqIEBwYXJhbSBzc2xfcHJvdG9jb2wKKyAqIEBwYXJhbSBob3N0bmFtZQorICogQHBhcmFtIHBvcnQKKyAqIEBwYXJhbSBlcnJvcgorICogQHJldHVybgorICovCitUaHJpZnRTU0xTb2NrZXQqCit0aHJpZnRfc3NsX3NvY2tldF9uZXdfd2l0aF9ob3N0KFRocmlmdFNTTFNvY2tldFByb3RvY29sIHNzbF9wcm90b2NvbCwgZ2NoYXIgKmhvc3RuYW1lLCBndWludCBwb3J0LCBHRXJyb3IgKiplcnJvcik7CisKKy8qKgorICogQ29udmVuaWVuY2UgZnVuY3Rpb24gdG8gY3JlYXRlIGEgbmV3IFNTTCBjb250ZXh0IHdpdGggdGhlIHByb3RvY29sIHNwZWNpZmllZAorICogYW5kIGFzc2lnbiB0aGlzIG5ldyBjb250ZXh0IHRvIHRoZSBjcmVhdGVkIFRocmlmdFNTTFNvY2tldC4KKyAqIEBwYXJhbSBzc2xfcHJvdG9jb2wKKyAqIEBwYXJhbSBlcnJvcgorICogQHJldHVybgorICovCitUaHJpZnRTU0xTb2NrZXQqCit0aHJpZnRfc3NsX3NvY2tldF9uZXcoVGhyaWZ0U1NMU29ja2V0UHJvdG9jb2wgc3NsX3Byb3RvY29sLCBHRXJyb3IgKiplcnJvcik7CisKKy8qKgorICogTG9hZCBhIGNlcnRpZmljYXRlIGNoYWluIGZyb20gYSBQRU0gZmlsZS4KKyAqIEBwYXJhbSBzc2xfc29ja2V0IFRoZSBzc2wgc29ja2V0CisgKiBAcGFyYW0gZmlsZV9uYW1lIFRoZSBmaWxlIG5hbWUgb2YgdGhlIFBFTSBjZXJ0aWZpY2F0ZSBjaGFpbgorICogQHJldHVybgorICovCitnYm9vbGVhbgordGhyaWZ0X3NzbF9sb2FkX2NlcnRfZnJvbV9maWxlKFRocmlmdFNTTFNvY2tldCAqc3NsX3NvY2tldCwgY29uc3QgY2hhciAqZmlsZV9uYW1lKTsKKworLyoqCisgKiBMb2FkIGEgY2VydGlmaWNhdGUgY2hhaW4gZnJvbSBtZW1vcnkKKyAqIEBwYXJhbSBzc2xfc29ja2V0IHRoZSBzc2wgc29ja2V0CisgKiBAcGFyYW0gY2hhaW5fY2VydHMgdGhlIGJ1ZmZlciB0byBsb2FkIFBFTSBmcm9tCisgKiBAcmV0dXJuCisgKi8KK2dib29sZWFuCit0aHJpZnRfc3NsX2xvYWRfY2VydF9mcm9tX2J1ZmZlcihUaHJpZnRTU0xTb2NrZXQgKnNzbF9zb2NrZXQsIGNvbnN0IGNoYXIgY2hhaW5fY2VydHNbXSk7CisKKy8qKgorICogQ2hlY2sgaWYgdGhlIHNzbCBzb2NrZXQgaXMgb3BlbiBhbmQgcmVhZHkgdG8gc2VuZCBhbmQgcmVjZWl2ZQorICogQHBhcmFtIHRyYW5zcG9ydAorICogQHJldHVybiB0cnVlIGlmIG9wZW4KKyAqLworZ2Jvb2xlYW4KK3RocmlmdF9zc2xfc29ja2V0X2lzX29wZW4gKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0KTsKKworCisvKioKKyAqIE9wZW4gY29ubmVjdGlvbiBpZiByZXF1aXJlZCBhbmQgc2V0IHRoZSBzb2NrZXQgdG8gYmUgcmVhZHkgdG8gc2VuZCBhbmQgcmVjZWl2ZQorICogQHBhcmFtIHRyYW5zcG9ydAorICogQHBhcmFtIGVycm9yCisgKiBAcmV0dXJuIHRydWUgaWYgb3BlcmF0aW9uIHdhcyBjb3JyZWN0CisgKi8KK2dib29sZWFuCit0aHJpZnRfc3NsX3NvY2tldF9vcGVuIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpOworCisKKy8qKgorICogQGJyaWVmIEluaXRpYWxpemF0aW9uIGZ1bmN0aW9uCisgKgorICogSXQgd2lsbCBpbml0aWFsaXplIE9wZW5TU0wgZnVuY3Rpb24uIFRoaXMgaW5pdGlhbGl6YXRpb24gd2lsbCBiZSBkb25lIGFwcAorICogd2lkZS4gU28gaWYgeW91IHdhbnQgdG8gaW5pdGlhbGl6ZSBpdCBieSB5b3Vyc2VsZiB5b3Ugc2hvdWxkIG5vdCBjYWxsIGl0LgorICogQnV0IGl0IG1lYW5zIHlvdSBtdXN0IGhhbmRsZSBPcGVuU1NMIGluaXRpYWxpemF0aW9uIGFuZCBoYW5kbGUgbG9ja2luZy4KKyAqCisgKiBJdCBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZSBhbnl0aGluZyBlbHNlLgorICoKKyAqCisgKi8KK3ZvaWQKK3RocmlmdF9zc2xfc29ja2V0X2luaXRpYWxpemVfb3BlbnNzbCh2b2lkKTsKKy8qKgorICogQGJyaWVmIEZpbmFsaXphdGlvbiBmdW5jdGlvbgorICoKKyAqIEl0IGNsZWFycyBhbGwgcmVzb3VyY2VzIGluaXRpYWxpemVkIGluIGluaXRpYWxpemUgZnVuY3Rpb24uCisgKgorICogSXQgc2hvdWxkIGJlIGNhbGxlZCBhZnRlciBhbnl0aGluZyBlbHNlLgorICoKKyAqCisgKi8KK3ZvaWQKK3RocmlmdF9zc2xfc29ja2V0X2ZpbmFsaXplX29wZW5zc2wodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuYyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuYwppbmRleCA1NTMzNDM3Li45ZGQyNjcxIDEwMDY0NAotLS0gYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0LmMKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5jCkBAIC04NSw2ICs4NSwxNCBAQAogICByZXR1cm4gVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHRyYW5zcG9ydCktPmZsdXNoICh0cmFuc3BvcnQsIGVycm9yKTsKIH0KIAorZ2ludDMyCit0aHJpZnRfdHJhbnNwb3J0X3JlYWRfYWxsIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgZ3BvaW50ZXIgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHRyYW5zcG9ydCktPnJlYWRfYWxsICh0cmFuc3BvcnQsIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLCBlcnJvcik7Cit9CisKIC8qIGJ5IGRlZmF1bHQsIHBlZWsgcmV0dXJucyB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoZSB0cmFuc3BvcnQgaXMgb3BlbiAqLwogc3RhdGljIGdib29sZWFuCiB0aHJpZnRfdHJhbnNwb3J0X3JlYWxfcGVlayAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQpAQCAtOTQsNiArMTAyLDMzIEBACiAgIHJldHVybiBUSFJJRlRfVFJBTlNQT1JUX0dFVF9DTEFTUyAodHJhbnNwb3J0KS0+aXNfb3BlbiAodHJhbnNwb3J0KTsKIH0KIAorc3RhdGljIGdpbnQzMgordGhyaWZ0X3RyYW5zcG9ydF9yZWFsX3JlYWRfYWxsIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgZ3BvaW50ZXIgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFRyYW5zcG9ydENsYXNzICp0dGM7CisgIGd1aW50MzIgaGF2ZTsKKyAgZ2ludDMyIHJldDsKKyAgZ2ludDggKmJ5dGVzOworCisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisKKyAgdHRjID0gVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHRyYW5zcG9ydCk7CisgIGhhdmUgPSAwOworICByZXQgPSAwOworICBieXRlcyA9IChnaW50OCopIGJ1ZjsKKworICB3aGlsZSAoaGF2ZSA8IGxlbikgeworICAgIGlmICgocmV0ID0gdHRjLT5yZWFkICh0cmFuc3BvcnQsIChncG9pbnRlcikgKGJ5dGVzICsgaGF2ZSksIGxlbiAtIGhhdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkgPCAwKSB7CisgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBoYXZlICs9IHJldDsKKyAgfQorCisgIHJldHVybiBoYXZlOworfQorCiAvKiBkZWZpbmUgdGhlIEdFcnJvciBkb21haW4gZm9yIFRocmlmdCB0cmFuc3BvcnRzICovCiBHUXVhcmsKIHRocmlmdF90cmFuc3BvcnRfZXJyb3JfcXVhcmsgKHZvaWQpCkBAIC0xMTUsOCArMTUwLDkgQEAKICAgY2xzLT53cml0ZV9lbmQgPSB0aHJpZnRfdHJhbnNwb3J0X3dyaXRlX2VuZDsKICAgY2xzLT5mbHVzaCA9IHRocmlmdF90cmFuc3BvcnRfZmx1c2g7CiAKLSAgLyogcHJvdmlkZSBhIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBwZWVrIG1ldGhvZCAqLworICAvKiBwcm92aWRlIGEgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIHBlZWsgYW5kIHJlYWRfYWxsIG1ldGhvZHMgKi8KICAgY2xzLT5wZWVrID0gdGhyaWZ0X3RyYW5zcG9ydF9yZWFsX3BlZWs7CisgIGNscy0+cmVhZF9hbGwgPSB0aHJpZnRfdHJhbnNwb3J0X3JlYWxfcmVhZF9hbGw7CiB9CiAKIHN0YXRpYyB2b2lkCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0LmggYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0LmgKaW5kZXggNTU1NWE1ZS4uOTRiYjZmNSAxMDA2NDQKLS0tIGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaApAQCAtNzMsNiArNzMsOCBAQAogICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcik7CiAgIGdib29sZWFuICgqd3JpdGVfZW5kKSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKTsKICAgZ2Jvb2xlYW4gKCpmbHVzaCkgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcik7CisgIGdpbnQzMiAoKnJlYWRfYWxsKSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGdwb2ludGVyIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpOwogfTsKIAogLyogdXNlZCBieSBUSFJJRlRfVFlQRV9UUkFOU1BPUlQgKi8KQEAgLTE0Myw2ICsxNDUsMTMgQEAKICAqLwogZ2Jvb2xlYW4gdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKTsKIAorLyohCisgKiBSZWFkIGxlbiBieXRlcyBvZiBkYXRhIGludG8gdGhlIGJ1ZmZlciBidWYuCisgKiBccHVibGljIFxtZW1iZXJvZiBUaHJpZnRUcmFuc3BvcnRJbnRlcmZhY2UKKyAqLworZ2ludDMyIHRocmlmdF90cmFuc3BvcnRfcmVhZF9hbGwgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBncG9pbnRlciBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKTsKKwogLyogZGVmaW5lIGVycm9yL2V4Y2VwdGlvbiB0eXBlcyAqLwogdHlwZWRlZiBlbnVtCiB7CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3Rlc3QvQ01ha2VMaXN0cy50eHQgYi9saWIvY19nbGliL3Rlc3QvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIzZTQxYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvdGVzdC9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDIwMiBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKworc2V0KFRFU1RfUFJFRklYICJjX2dsaWIiKQorCitpbmNsdWRlX2RpcmVjdG9yaWVzKFNZU1RFTSAke0Jvb3N0X0lOQ0xVREVfRElSU30pCisKKyNNYWtlIHN1cmUgZ2VuLWNwcCBhbmQgZ2VuLWNfZ2xpYiBmaWxlcyBjYW4gYmUgaW5jbHVkZWQKK2luY2x1ZGVfZGlyZWN0b3JpZXMoIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfSIpCisKKyMgQ3JlYXRlIHRoZSB0aHJpZnQgQyB0ZXN0IGxpYnJhcnkKK3NldCh0ZXN0Z2VuY19TT1VSQ0VTCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfZGVidWdfcHJvdG9fdGVzdF90eXBlcy5jCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfZW51bV90ZXN0X3R5cGVzLmMKKyAgICBnZW4tY19nbGliL3RfdGVzdF9lbnVtX3Rlc3Rfc2VydmljZS5jCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfZW1wdHlfc2VydmljZS5jCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfaW5oZXJpdGVkLmMKKyAgICBnZW4tY19nbGliL3RfdGVzdF9vcHRpb25hbF9yZXF1aXJlZF90ZXN0X3R5cGVzLmMKKyAgICBnZW4tY19nbGliL3RfdGVzdF9yZXZlcnNlX29yZGVyX3NlcnZpY2UuYworICAgIGdlbi1jX2dsaWIvdF90ZXN0X3NlY29uZF9zZXJ2aWNlLmMKKyAgICBnZW4tY19nbGliL3RfdGVzdF9zZXJ2aWNlX2Zvcl9leGNlcHRpb25fd2l0aF9hX21hcC5jCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3Rfc3J2LmMKKyAgICBnZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdC5jCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfdGhyaWZ0X3Rlc3RfdHlwZXMuYworICAgIGdlbi1jX2dsaWIvdF90ZXN0X2RlYnVnX3Byb3RvX3Rlc3RfdHlwZXMuaAorICAgIGdlbi1jX2dsaWIvdF90ZXN0X2VudW1fdGVzdF90eXBlcy5oCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfZW51bV90ZXN0X3NlcnZpY2UuaAorICAgIGdlbi1jX2dsaWIvdF90ZXN0X2VtcHR5X3NlcnZpY2UuaAorICAgIGdlbi1jX2dsaWIvdF90ZXN0X2luaGVyaXRlZC5oCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3Rfb3B0aW9uYWxfcmVxdWlyZWRfdGVzdF90eXBlcy5oCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfcmV2ZXJzZV9vcmRlcl9zZXJ2aWNlLmgKKyAgICBnZW4tY19nbGliL3RfdGVzdF9zZWNvbmRfc2VydmljZS5oCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3Rfc2VydmljZV9mb3JfZXhjZXB0aW9uX3dpdGhfYV9tYXAuaAorICAgIGdlbi1jX2dsaWIvdF90ZXN0X3Nydi5oCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfdGhyaWZ0X3Rlc3QuaAorICAgIGdlbi1jX2dsaWIvdF90ZXN0X3RocmlmdF90ZXN0X3R5cGVzLmgKKykKKworYWRkX2xpYnJhcnkodGVzdGdlbmMgU1RBVElDICR7dGVzdGdlbmNfU09VUkNFU30pCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkodGVzdGdlbmMgdGhyaWZ0X2NfZ2xpYikKKworCithZGRfZXhlY3V0YWJsZSh0ZXN0c2VyaWFsaXphdGlvbiB0ZXN0c2VyaWFsaXphdGlvbi5jKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKHRlc3RzZXJpYWxpemF0aW9uIHRlc3RnZW5jKQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKHRlc3RzZXJpYWxpemF0aW9uIHRocmlmdF9jX2dsaWIpCithZGRfdGVzdChOQU1FIHRlc3RzZXJpYWxpemF0aW9uIENPTU1BTkQgdGVzdHNlcmlhbGl6YXRpb24pCisKK2FkZF9leGVjdXRhYmxlKHRlc3RhcHBsaWNhdGlvbmV4Y2VwdGlvbiB0ZXN0YXBwbGljYXRpb25leGNlcHRpb24uYykKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWSh0ZXN0YXBwbGljYXRpb25leGNlcHRpb24gdGhyaWZ0X2NfZ2xpYikKK2FkZF90ZXN0KE5BTUUgdGVzdGFwcGxpY2F0aW9uZXhjZXB0aW9uIENPTU1BTkQgdGVzdGFwcGxpY2F0aW9uZXhjZXB0aW9uKQorCithZGRfZXhlY3V0YWJsZSh0ZXN0dHJhbnNwb3J0c29ja2V0IHRlc3R0cmFuc3BvcnRzb2NrZXQuYykKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWSh0ZXN0dHJhbnNwb3J0c29ja2V0IHRocmlmdF9jX2dsaWIpCithZGRfdGVzdChOQU1FIHRlc3R0cmFuc3BvcnRzb2NrZXQgQ09NTUFORCB0ZXN0dHJhbnNwb3J0c29ja2V0KQorCithZGRfZXhlY3V0YWJsZSh0ZXN0YmluYXJ5cHJvdG9jb2wgdGVzdGJpbmFyeXByb3RvY29sLmMpCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkodGVzdGJpbmFyeXByb3RvY29sIHRocmlmdF9jX2dsaWIpCithZGRfdGVzdChOQU1FIHRlc3RiaW5hcnlwcm90b2NvbCBDT01NQU5EIHRlc3RiaW5hcnlwcm90b2NvbCkKKworYWRkX2V4ZWN1dGFibGUodGVzdGNvbXBhY3Rwcm90b2NvbCB0ZXN0Y29tcGFjdHByb3RvY29sLmMpCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkodGVzdGNvbXBhY3Rwcm90b2NvbCB0aHJpZnRfY19nbGliKQorYWRkX3Rlc3QoTkFNRSB0ZXN0Y29tcGFjdHByb3RvY29sIENPTU1BTkQgdGVzdGNvbXBhY3Rwcm90b2NvbCkKKworYWRkX2V4ZWN1dGFibGUodGVzdGJ1ZmZlcmVkdHJhbnNwb3J0IHRlc3RidWZmZXJlZHRyYW5zcG9ydC5jKQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKHRlc3RidWZmZXJlZHRyYW5zcG9ydCB0aHJpZnRfY19nbGliKQorYWRkX3Rlc3QoTkFNRSB0ZXN0YnVmZmVyZWR0cmFuc3BvcnQgQ09NTUFORCB0ZXN0YnVmZmVyZWR0cmFuc3BvcnQpCisKK2FkZF9leGVjdXRhYmxlKHRlc3RmcmFtZWR0cmFuc3BvcnQgdGVzdGZyYW1lZHRyYW5zcG9ydC5jKQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKHRlc3RmcmFtZWR0cmFuc3BvcnQgdGhyaWZ0X2NfZ2xpYikKK2FkZF90ZXN0KE5BTUUgdGVzdGZyYW1lZHRyYW5zcG9ydCBDT01NQU5EIHRlc3RmcmFtZWR0cmFuc3BvcnQpCisKK2FkZF9leGVjdXRhYmxlKHRlc3RmZHRyYW5zcG9ydCB0ZXN0ZmR0cmFuc3BvcnQuYykKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWSh0ZXN0ZmR0cmFuc3BvcnQgdGhyaWZ0X2NfZ2xpYikKK2FkZF90ZXN0KE5BTUUgdGVzdGZkdHJhbnNwb3J0IENPTU1BTkQgdGVzdGZkdHJhbnNwb3J0KQorCithZGRfZXhlY3V0YWJsZSh0ZXN0bWVtb3J5YnVmZmVyIHRlc3RtZW1vcnlidWZmZXIuYykKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWSh0ZXN0bWVtb3J5YnVmZmVyIHRocmlmdF9jX2dsaWIpCithZGRfdGVzdChOQU1FIHRlc3RtZW1vcnlidWZmZXIgQ09NTUFORCB0ZXN0bWVtb3J5YnVmZmVyKQorCithZGRfZXhlY3V0YWJsZSh0ZXN0c2ltcGxlc2VydmVyIHRlc3RzaW1wbGVzZXJ2ZXIuYykKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWSh0ZXN0c2ltcGxlc2VydmVyIHRocmlmdF9jX2dsaWIpCithZGRfdGVzdChOQU1FIHRlc3RzaW1wbGVzZXJ2ZXIgQ09NTUFORCB0ZXN0c2ltcGxlc2VydmVyKQorCithZGRfZXhlY3V0YWJsZSh0ZXN0ZGVidWdwcm90byB0ZXN0ZGVidWdwcm90by5jKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKHRlc3RkZWJ1Z3Byb3RvIHRlc3RnZW5jKQorYWRkX3Rlc3QoTkFNRSB0ZXN0ZGVidWdwcm90byBDT01NQU5EIHRlc3RkZWJ1Z3Byb3RvKQorCithZGRfZXhlY3V0YWJsZSh0ZXN0b3B0aW9uYWxyZXF1aXJlZCB0ZXN0b3B0aW9uYWxyZXF1aXJlZC5jKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKHRlc3RvcHRpb25hbHJlcXVpcmVkIHRlc3RnZW5jKQorYWRkX3Rlc3QoTkFNRSB0ZXN0b3B0aW9uYWxyZXF1aXJlZCBDT01NQU5EIHRlc3RvcHRpb25hbHJlcXVpcmVkKQorCitpbmNsdWRlX2RpcmVjdG9yaWVzKCIke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9jX2dsaWIvc3JjIiAiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1jX2dsaWIiKQorCithZGRfZXhlY3V0YWJsZSh0ZXN0dGhyaWZ0dGVzdCB0ZXN0dGhyaWZ0dGVzdC5jCisgICAgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvY19nbGliL3NyYy90aHJpZnRfdGVzdF9oYW5kbGVyLmMKKyAgICAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9jX2dsaWIvc3JjL3RocmlmdF90ZXN0X2hhbmRsZXIuaAorICAgICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L2NfZ2xpYi9zcmMvdGhyaWZ0X3NlY29uZF9zZXJ2aWNlX2hhbmRsZXIuYworICAgICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L2NfZ2xpYi9zcmMvdGhyaWZ0X3NlY29uZF9zZXJ2aWNlX2hhbmRsZXIuaAorICAgIGdlbi1jX2dsaWIvdF90ZXN0X3RocmlmdF90ZXN0X3R5cGVzLmgpCit0YXJnZXRfbGlua19saWJyYXJpZXModGVzdHRocmlmdHRlc3QgdGVzdGdlbmMpCithZGRfdGVzdChOQU1FIHRlc3R0aHJpZnR0ZXN0IENPTU1BTkQgdGVzdHRocmlmdHRlc3QpCisKKworaWYoQlVJTERfQ1BQKQorCisgICAgaW5jbHVkZV9kaXJlY3RvcmllcygiJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L2xpYi9jcHAvc3JjIikKKworICAgICMgQ3JlYXRlIHRoZSB0aHJpZnQgQysrIHRlc3QgbGlicmFyeQorICAgIHNldCh0ZXN0Z2VuY19jcHBfU09VUkNFUworICAgICAgICBnZW4tY3BwL1RocmlmdFRlc3QuY3BwCisgICAgICAgIGdlbi1jcHAvVGhyaWZ0VGVzdF9jb25zdGFudHMuY3BwCisgICAgICAgIGdlbi1jcHAvVGhyaWZ0VGVzdF90eXBlcy5jcHAKKyAgICAgICAgZ2VuLWNwcC9UaHJpZnRUZXN0LmgKKyAgICAgICAgZ2VuLWNwcC9UaHJpZnRUZXN0X2NvbnN0YW50cy5oCisgICAgICAgIGdlbi1jcHAvVGhyaWZ0VGVzdF90eXBlcy5oCisgICAgKQorCisgICAgYWRkX2xpYnJhcnkodGVzdGdlbmNfY3BwIFNUQVRJQyAke3Rlc3RnZW5jX2NwcF9TT1VSQ0VTfSkKKyAgICBMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkodGVzdGdlbmNfY3BwIHRocmlmdCkKKworICAgICNIQUNLOiB0ZXN0dGhyaWZ0dGVzdGNsaWVudC5jcHAgaW5jbHVkZXMgVGhyaWZ0VGVzdC5oIHdpdGhvdXQgZ2VuLSovIHByZWZpeGVzCisgICAgIyBzbyB3ZSBpbmNsdWRlIGl0IGhlcmUKKyAgICBpbmNsdWRlX2RpcmVjdG9yaWVzKCIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWNwcCIgIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4tY19nbGliIikKKworICAgIGFkZF9leGVjdXRhYmxlKHRlc3R0aHJpZnR0ZXN0Y2xpZW50IHRlc3R0aHJpZnR0ZXN0Y2xpZW50LmNwcCkKKyAgICB0YXJnZXRfbGlua19saWJyYXJpZXModGVzdHRocmlmdHRlc3RjbGllbnQgdGVzdGdlbmMgdGVzdGdlbmNfY3BwICR7WkxJQl9MSUJSQVJJRVN9KQorICAgIGFkZF90ZXN0KE5BTUUgdGVzdHRocmlmdHRlc3RjbGllbnQgQ09NTUFORCB0ZXN0dGhyaWZ0dGVzdGNsaWVudCkKKworZW5kaWYoQlVJTERfQ1BQKQorCisjCisjIENvbW1vbiB0aHJpZnQgY29kZSBnZW5lcmF0aW9uIHJ1bGVzCisjCisKK2FkZF9jdXN0b21fY29tbWFuZChPVVRQVVQKKyAgICBnZW4tY19nbGliL3RfdGVzdF9kZWJ1Z19wcm90b190ZXN0X3R5cGVzLmMKKyAgICBnZW4tY19nbGliL3RfdGVzdF9kZWJ1Z19wcm90b190ZXN0X3R5cGVzLmgKKyAgICBnZW4tY19nbGliL3RfdGVzdF9lbXB0eV9zZXJ2aWNlLmMKKyAgICBnZW4tY19nbGliL3RfdGVzdF9lbXB0eV9zZXJ2aWNlLmgKKyAgICBnZW4tY19nbGliL3RfdGVzdF9pbmhlcml0ZWQuYworICAgIGdlbi1jX2dsaWIvdF90ZXN0X2luaGVyaXRlZC5oCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfcmV2ZXJzZV9vcmRlcl9zZXJ2aWNlLmMKKyAgICBnZW4tY19nbGliL3RfdGVzdF9yZXZlcnNlX29yZGVyX3NlcnZpY2UuaAorICAgIGdlbi1jX2dsaWIvdF90ZXN0X3NlcnZpY2VfZm9yX2V4Y2VwdGlvbl93aXRoX2FfbWFwLmMKKyAgICBnZW4tY19nbGliL3RfdGVzdF9zZXJ2aWNlX2Zvcl9leGNlcHRpb25fd2l0aF9hX21hcC5oCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3Rfc3J2LmMKKyAgICBnZW4tY19nbGliL3RfdGVzdF9zcnYuaAorICAgIENPTU1BTkQgJHtUSFJJRlRfQ09NUElMRVJ9IC0tZ2VuIGNfZ2xpYiAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9EZWJ1Z1Byb3RvVGVzdC50aHJpZnQKKykKKworYWRkX2N1c3RvbV9jb21tYW5kKE9VVFBVVAorICAgIGdlbi1jX2dsaWIvdF90ZXN0X2VudW1fdGVzdF90eXBlcy5jCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfZW51bV90ZXN0X3R5cGVzLmgKKyAgICBnZW4tY19nbGliL3RfdGVzdF9lbnVtX3Rlc3Rfc2VydmljZS5jCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfZW51bV90ZXN0X3NlcnZpY2UuaAorICAgIENPTU1BTkQgJHtUSFJJRlRfQ09NUElMRVJ9IC0tZ2VuIGNfZ2xpYiAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9FbnVtVGVzdC50aHJpZnQKKykKKworYWRkX2N1c3RvbV9jb21tYW5kKE9VVFBVVAorICAgIGdlbi1jX2dsaWIvdF90ZXN0X29wdGlvbmFsX3JlcXVpcmVkX3Rlc3RfdHlwZXMuYworICAgIGdlbi1jX2dsaWIvdF90ZXN0X29wdGlvbmFsX3JlcXVpcmVkX3Rlc3RfdHlwZXMuaAorICAgIENPTU1BTkQgJHtUSFJJRlRfQ09NUElMRVJ9IC0tZ2VuIGNfZ2xpYiAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9PcHRpb25hbFJlcXVpcmVkVGVzdC50aHJpZnQKKykKKworYWRkX2N1c3RvbV9jb21tYW5kKE9VVFBVVAorICAgIGdlbi1jX2dsaWIvdF90ZXN0X3NlY29uZF9zZXJ2aWNlLmMKKyAgICBnZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdC5jCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfdGhyaWZ0X3Rlc3RfdHlwZXMuYworICAgIGdlbi1jX2dsaWIvdF90ZXN0X3NlY29uZF9zZXJ2aWNlLmgKKyAgICBnZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdC5oCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfdGhyaWZ0X3Rlc3RfdHlwZXMuaAorICAgIENPTU1BTkQgJHtUSFJJRlRfQ09NUElMRVJ9IC0tZ2VuIGNfZ2xpYiAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorKQorCithZGRfY3VzdG9tX2NvbW1hbmQoT1VUUFVUCisgICAgZ2VuLWNwcC9UaHJpZnRUZXN0LmNwcAorICAgIGdlbi1jcHAvVGhyaWZ0VGVzdF9jb25zdGFudHMuY3BwCisgICAgZ2VuLWNwcC9UaHJpZnRUZXN0X3R5cGVzLmNwcAorICAgIGdlbi1jcHAvVGhyaWZ0VGVzdC5oCisgICAgZ2VuLWNwcC9UaHJpZnRUZXN0X2NvbnN0YW50cy5oCisgICAgZ2VuLWNwcC9UaHJpZnRUZXN0X3R5cGVzLmgKKyAgICBDT01NQU5EICR7VEhSSUZUX0NPTVBJTEVSfSAtLWdlbiBjcHAgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKKykKKworIyBUT0RPOiBBZGQgbWVtb3J5IGNoZWNrcyB1c2luZyBjdGVzdF9tZW1jaGVjayBvciBzaW1pbGFyCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3Rlc3QvQ29udGFpbmVyVGVzdC50aHJpZnQgYi9saWIvY19nbGliL3Rlc3QvQ29udGFpbmVyVGVzdC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTkyYTlhNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvdGVzdC9Db250YWluZXJUZXN0LnRocmlmdApAQCAtMCwwICsxLDM1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK25hbWVzcGFjZSBjX2dsaWIgVFRlc3QKKwordHlwZWRlZiBsaXN0PHN0cmluZz4gU3RyaW5nTGlzdAordHlwZWRlZiBsaXN0PFN0cmluZ0xpc3Q+IExpc3RTdHJpbmdMaXN0CisKK3N0cnVjdCBDb250YWluZXJzV2l0aERlZmF1bHRWYWx1ZXMgeworICAxOiBsaXN0PHN0cmluZz4gU3RyaW5nTGlzdCA9IFsgIkFwYWNoZSIsICJUaHJpZnQiIF07Cit9CisKK3NlcnZpY2UgQ29udGFpbmVyU2VydmljZSB7CisgIHZvaWQgcmVjZWl2ZVN0cmluZ0xpc3QoMTogbGlzdDxzdHJpbmc+IHN0cmluZ0xpc3QpOworICBsaXN0PHN0cmluZz4gcmV0dXJuU3RyaW5nTGlzdCgpOworCisgIGxpc3Q8bGlzdDxzdHJpbmc+PiByZXR1cm5MaXN0U3RyaW5nTGlzdCgpOworICBMaXN0U3RyaW5nTGlzdCByZXR1cm5UeXBlZGVmZExpc3RTdHJpbmdMaXN0KCk7Cit9CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3Rlc3QvTWFrZWZpbGUuYW0gYi9saWIvY19nbGliL3Rlc3QvTWFrZWZpbGUuYW0KaW5kZXggNDY4Mzc1OS4uNWU5ZDJlYSAxMDA3NTUKLS0tIGEvbGliL2NfZ2xpYi90ZXN0L01ha2VmaWxlLmFtCisrKyBiL2xpYi9jX2dsaWIvdGVzdC9NYWtlZmlsZS5hbQpAQCAtMTYsMjIgKzE2LDQzIEBACiAjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCi1BVVRPTUFLRV9PUFRJT05TID0gc2VyaWFsLXRlc3RzCitBVVRPTUFLRV9PUFRJT05TID0gc3ViZGlyLW9iamVjdHMgc2VyaWFsLXRlc3RzCiAKIFNVQkRJUlMgPQogCi1BTV9DUFBGTEFHUyA9IC1nIC1XYWxsIC1JLi4vc3JjICQoR0xJQl9DRkxBR1MpCi1BTV9MREZMQUdTID0gJChHTElCX0xJQlMpICQoR09CSkVDVF9MSUJTKSBAR0NPVl9MREZMQUdTQAorQlVJTFRfU09VUkNFUyA9IFwKKyAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfY29udGFpbmVyX3Rlc3RfdHlwZXMuYyBcCisgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X2NvbnRhaW5lcl90ZXN0X3R5cGVzLmggXAorICAgICAgICBnZW4tY19nbGliL3RfdGVzdF9kZWJ1Z19wcm90b190ZXN0X3R5cGVzLmggXAorICAgICAgICBnZW4tY19nbGliL3RfdGVzdF9lbXB0eV9zZXJ2aWNlLmggXAorICAgICAgICBnZW4tY19nbGliL3RfdGVzdF9pbmhlcml0ZWQuaCBcCisgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X29wdGlvbmFsX3JlcXVpcmVkX3Rlc3RfdHlwZXMuaCBcCisgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X3JldmVyc2Vfb3JkZXJfc2VydmljZS5oIFwKKyAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3Rfc2Vjb25kX3NlcnZpY2UuaCBcCisgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X3NlcnZpY2VfZm9yX2V4Y2VwdGlvbl93aXRoX2FfbWFwLmggXAorICAgICAgICBnZW4tY19nbGliL3RfdGVzdF9jb250YWluZXJfc2VydmljZS5jIFwKKyAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfY29udGFpbmVyX3NlcnZpY2UuaCBcCisgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X3Nydi5oIFwKKyAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfdGhyaWZ0X3Rlc3QuaCBcCisgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X3RocmlmdF90ZXN0X3R5cGVzLmgKIAotQ0ZMQUdTID0gQEdDT1ZfQ0ZMQUdTQAotQ1hYRkxBR1MgPSAtZworQU1fQ1BQRkxBR1MgPSAtSS4uL3NyYyAtSS4vZ2VuLWNfZ2xpYgorQU1fQ0ZMQUdTID0gLWcgLVdhbGwgLVdleHRyYSAtcGVkYW50aWMgJChHTElCX0NGTEFHUykgJChHT0JKRUNUX0NGTEFHUykgJChPUEVOU1NMX0lOQ0xVREVTKSBcCisJQEdDT1ZfQ0ZMQUdTQAorQU1fQ1hYRkxBR1MgPSAkKEFNX0NGTEFHUykKK0FNX0xERkxBR1MgPSAkKEdMSUJfTElCUykgJChHT0JKRUNUX0xJQlMpICQoT1BFTlNTTF9MSUJTKSBAR0NPVl9MREZMQUdTQAogCiBjaGVja19QUk9HUkFNUyA9IFwKKyAgdGVzdHNlcmlhbGl6YXRpb24gXAogICB0ZXN0YXBwbGljYXRpb25leGNlcHRpb24gXAorICB0ZXN0Y29udGFpbmVydGVzdCBcCiAgIHRlc3R0cmFuc3BvcnRzb2NrZXQgXAorICB0ZXN0dHJhbnNwb3J0c3Nsc29ja2V0IFwKICAgdGVzdGJpbmFyeXByb3RvY29sIFwKKyAgdGVzdGNvbXBhY3Rwcm90b2NvbCBcCiAgIHRlc3RidWZmZXJlZHRyYW5zcG9ydCBcCiAgIHRlc3RmcmFtZWR0cmFuc3BvcnQgXAorICB0ZXN0ZmR0cmFuc3BvcnQgXAogICB0ZXN0bWVtb3J5YnVmZmVyIFwKICAgdGVzdHN0cnVjdCBcCiAgIHRlc3RzaW1wbGVzZXJ2ZXIgXApAQCAtNDAsNzkgKzYxLDEyOSBAQAogICB0ZXN0dGhyaWZ0dGVzdAogCiBpZiBXSVRIX0NQUAorICBCVUlMVF9TT1VSQ0VTICs9IGdlbi1jcHAvVGhyaWZ0VGVzdF90eXBlcy5jcHAKICAgY2hlY2tfUFJPR1JBTVMgKz0gdGVzdHRocmlmdHRlc3RjbGllbnQKIGVuZGlmCiAKK3Rlc3RzZXJpYWxpemF0aW9uX1NPVVJDRVMgPSB0ZXN0c2VyaWFsaXphdGlvbi5jCit0ZXN0c2VyaWFsaXphdGlvbl9MREFERCA9IFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9wcm90b2NvbC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfdHJhbnNwb3J0Lm8gXAorICAgIGxpYnRlc3RnZW5jLmxhCisKIHRlc3RhcHBsaWNhdGlvbmV4Y2VwdGlvbl9TT1VSQ0VTID0gdGVzdGFwcGxpY2F0aW9uZXhjZXB0aW9uLmMKIHRlc3RhcHBsaWNhdGlvbmV4Y2VwdGlvbl9MREFERCA9IFwKLSAgICAuLi9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb24ubyBcCi0gICAgLi4vbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfcHJvdG9jb2wubyBcCi0gICAgLi4vbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfc3RydWN0Lm8gXAotICAgIC4uL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3RyYW5zcG9ydC5vCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uLm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3Byb3RvY29sLm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3N0cnVjdC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfdHJhbnNwb3J0Lm8KKwordGVzdGNvbnRhaW5lcnRlc3RfU09VUkNFUyA9IHRlc3Rjb250YWluZXJ0ZXN0LmMKK3Rlc3Rjb250YWluZXJ0ZXN0X0xEQUREID0gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3N0cnVjdC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9wcm90b2NvbC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfdHJhbnNwb3J0Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF90cmFuc3BvcnRfZmFjdG9yeS5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfcHJvY2Vzc29yLm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3Byb3RvY29sX2ZhY3RvcnkubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfYmluYXJ5X3Byb3RvY29sLm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9mYWN0b3J5Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zb2NrZXQubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3NlcnZlcl9zb2NrZXQubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvc2VydmVyL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3NlcnZlci5vIFwKKwkgIGxpYnRlc3RnZW5jLmxhCiAKIHRlc3R0cmFuc3BvcnRzb2NrZXRfU09VUkNFUyA9IHRlc3R0cmFuc3BvcnRzb2NrZXQuYwogdGVzdHRyYW5zcG9ydHNvY2tldF9MREFERCA9IFwKLSAgICAuLi9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF90cmFuc3BvcnQubyBcCi0gICAgLi4vbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0Lm8gXAotICAgIC4uL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQubyBcCi0gICAgLi4vbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfc2VydmVyX3NvY2tldC5vCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3RyYW5zcG9ydC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zZXJ2ZXJfc29ja2V0Lm8KKworCit0ZXN0dHJhbnNwb3J0c3Nsc29ja2V0X1NPVVJDRVMgPSB0ZXN0dHJhbnNwb3J0c3Nsc29ja2V0LmMKK3Rlc3R0cmFuc3BvcnRzc2xzb2NrZXRfTERBREQgPSBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3RyYW5zcG9ydC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfc29ja2V0Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9idWZmZXJlZF90cmFuc3BvcnQubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3NlcnZlcl9zb2NrZXQubworCiAKIHRlc3RiaW5hcnlwcm90b2NvbF9TT1VSQ0VTID0gdGVzdGJpbmFyeXByb3RvY29sLmMKIHRlc3RiaW5hcnlwcm90b2NvbF9MREFERCA9IFwKLSAgICAuLi9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9wcm90b2NvbC5vIFwKLSAgICAuLi9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF90cmFuc3BvcnQubyBcCi0gICAgLi4vbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfc29ja2V0Lm8gXAotICAgIC4uL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQubyBcCi0gICAgLi4vbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfc2VydmVyX3NvY2tldC5vCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfcHJvdG9jb2wubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3RyYW5zcG9ydC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfZnJhbWVkX3RyYW5zcG9ydC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfc29ja2V0Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zZXJ2ZXJfc29ja2V0Lm8KKwordGVzdGNvbXBhY3Rwcm90b2NvbF9TT1VSQ0VTID0gdGVzdGNvbXBhY3Rwcm90b2NvbC5jCit0ZXN0Y29tcGFjdHByb3RvY29sX0xEQUREID0gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3Byb3RvY29sLm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF90cmFuc3BvcnQubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3NvY2tldC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfc2VydmVyX3NvY2tldC5vCiAKIHRlc3RidWZmZXJlZHRyYW5zcG9ydF9TT1VSQ0VTID0gdGVzdGJ1ZmZlcmVkdHJhbnNwb3J0LmMKIHRlc3RidWZmZXJlZHRyYW5zcG9ydF9MREFERCA9IFwKLSAgICAuLi9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF90cmFuc3BvcnQubyBcCi0gICAgLi4vbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfc29ja2V0Lm8gXAotICAgIC4uL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQubyBcCi0gICAgLi4vbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfc2VydmVyX3NvY2tldC5vCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3RyYW5zcG9ydC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfc29ja2V0Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zZXJ2ZXJfc29ja2V0Lm8KIAogdGVzdGZyYW1lZHRyYW5zcG9ydF9TT1VSQ0VTID0gdGVzdGZyYW1lZHRyYW5zcG9ydC5jCiB0ZXN0ZnJhbWVkdHJhbnNwb3J0X0xEQUREID0gXAotICAgIC4uL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3RyYW5zcG9ydC5vIFwKLSAgICAuLi9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zb2NrZXQubyBcCi0gICAgLi4vbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5vIFwKLSAgICAuLi9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zZXJ2ZXJfc29ja2V0Lm8KKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfdHJhbnNwb3J0Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zb2NrZXQubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3NlcnZlcl9zb2NrZXQubworCit0ZXN0ZmR0cmFuc3BvcnRfU09VUkNFUyA9IHRlc3RmZHRyYW5zcG9ydC5jCit0ZXN0ZmR0cmFuc3BvcnRfTERBREQgPSBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3RyYW5zcG9ydC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfZmRfdHJhbnNwb3J0Lm8KIAogdGVzdG1lbW9yeWJ1ZmZlcl9TT1VSQ0VTID0gdGVzdG1lbW9yeWJ1ZmZlci5jCiB0ZXN0bWVtb3J5YnVmZmVyX0xEQUREID0gXAotICAgIC4uL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3RyYW5zcG9ydC5vCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3RyYW5zcG9ydC5vCiAKIHRlc3RzdHJ1Y3RfU09VUkNFUyA9IHRlc3RzdHJ1Y3QuYwogdGVzdHN0cnVjdF9MREFERCA9IFwKLSAgICAuLi9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9wcm90b2NvbC5vIFwKLSAgICAuLi9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF90cmFuc3BvcnQubworICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3Byb3RvY29sLm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF90cmFuc3BvcnQubwogCiB0ZXN0c2ltcGxlc2VydmVyX1NPVVJDRVMgPSB0ZXN0c2ltcGxlc2VydmVyLmMKIHRlc3RzaW1wbGVzZXJ2ZXJfTERBREQgPSBcCi0gICAgLi4vbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfcHJvdG9jb2wubyBcCi0gICAgLi4vbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfdHJhbnNwb3J0Lm8gXAotICAgIC4uL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3RyYW5zcG9ydF9mYWN0b3J5Lm8gXAotICAgIC4uL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3Byb2Nlc3Nvci5vIFwKLSAgICAuLi9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9wcm90b2NvbF9mYWN0b3J5Lm8gXAotICAgIC4uL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X2JpbmFyeV9wcm90b2NvbC5vIFwKLSAgICAuLi9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9iaW5hcnlfcHJvdG9jb2xfZmFjdG9yeS5vIFwKLSAgICAuLi9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zb2NrZXQubyBcCi0gICAgLi4vbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5vIFwKLSAgICAuLi9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zZXJ2ZXJfc29ja2V0Lm8gXAotICAgIC4uL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3NlcnZlci5vCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfcHJvdG9jb2wubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3RyYW5zcG9ydC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfdHJhbnNwb3J0X2ZhY3RvcnkubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvY2Vzc29yL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3Byb2Nlc3Nvci5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9wcm90b2NvbF9mYWN0b3J5Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X2JpbmFyeV9wcm90b2NvbC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9iaW5hcnlfcHJvdG9jb2xfZmFjdG9yeS5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfc29ja2V0Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zZXJ2ZXJfc29ja2V0Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3NlcnZlci9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zZXJ2ZXIubwogCiB0ZXN0ZGVidWdwcm90b19TT1VSQ0VTID0gdGVzdGRlYnVncHJvdG8uYwogdGVzdGRlYnVncHJvdG9fTERBREQgPSBsaWJ0ZXN0Z2VuYy5sYQogCiB0ZXN0b3B0aW9uYWxyZXF1aXJlZF9TT1VSQ0VTID0gdGVzdG9wdGlvbmFscmVxdWlyZWQuYwogdGVzdG9wdGlvbmFscmVxdWlyZWRfTERBREQgPSBcCi0gICAgLi4vbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfcHJvdG9jb2wubyBcCi0gICAgLi4vbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfdHJhbnNwb3J0Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3Byb3RvY29sLm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF90cmFuc3BvcnQubyBcCiAgICAgbGlidGVzdGdlbmMubGEKIAogdGVzdHRocmlmdHRlc3RfU09VUkNFUyA9IHRlc3R0aHJpZnR0ZXN0LmMKLXRlc3R0aHJpZnR0ZXN0X0xEQUREID0gbGlidGVzdGdlbmMubGEKK3Rlc3R0aHJpZnR0ZXN0X0xEQUREID0gbGlidGVzdGdlbmMubGEgXAorICAgICQodG9wX2J1aWxkZGlyKS90ZXN0L2NfZ2xpYi9zcmMvdGhyaWZ0X3Rlc3RfaGFuZGxlci5vCit0ZXN0dGhyaWZ0dGVzdF9DRkxBR1MgPSAtSSQodG9wX3NyY2RpcikvdGVzdC9jX2dsaWIvc3JjIC1JLi9nZW4tY19nbGliICQoR0xJQl9DRkxBR1MpCiAKIHRlc3R0aHJpZnR0ZXN0Y2xpZW50X1NPVVJDRVMgPSB0ZXN0dGhyaWZ0dGVzdGNsaWVudC5jcHAKIHRlc3R0aHJpZnR0ZXN0Y2xpZW50X0NQUEZMQUdTID0gLUkuLi8uLi9jcHAvc3JjICQoQk9PU1RfQ1BQRkxBR1MpIC1JLi9nZW4tY3BwIC1JLi4vc3JjIC1JLi9nZW4tY19nbGliICQoR0xJQl9DRkxBR1MpCkBAIC0xMjYsNyArMTk3LDEwIEBACiBlbmRpZgogCiBub2Rpc3RfbGlidGVzdGdlbmNfbGFfU09VUkNFUyA9IFwKKyAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfY29udGFpbmVyX3Rlc3RfdHlwZXMuYyBcCiAgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X2RlYnVnX3Byb3RvX3Rlc3RfdHlwZXMuYyBcCisgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X2VudW1fdGVzdF90eXBlcy5jIFwKKyAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfZW51bV90ZXN0X3NlcnZpY2UuYyBcCiAgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X2VtcHR5X3NlcnZpY2UuYyBcCiAgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X2luaGVyaXRlZC5jIFwKICAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3Rfb3B0aW9uYWxfcmVxdWlyZWRfdGVzdF90eXBlcy5jIFwKQEAgLTEzNCw5ICsyMDgsMTMgQEAKICAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3Rfc2Vjb25kX3NlcnZpY2UuYyBcCiAgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X3NlcnZpY2VfZm9yX2V4Y2VwdGlvbl93aXRoX2FfbWFwLmMgXAogICAgICAgICBnZW4tY19nbGliL3RfdGVzdF9zcnYuYyBcCisgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X2NvbnRhaW5lcl9zZXJ2aWNlLmMgXAogICAgICAgICBnZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdC5jIFwKICAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfdGhyaWZ0X3Rlc3RfdHlwZXMuYyBcCisgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X2NvbnRhaW5lcl90ZXN0X3R5cGVzLmggXAogICAgICAgICBnZW4tY19nbGliL3RfdGVzdF9kZWJ1Z19wcm90b190ZXN0X3R5cGVzLmggXAorICAgICAgICBnZW4tY19nbGliL3RfdGVzdF9lbnVtX3Rlc3RfdHlwZXMuaCBcCisgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X2VudW1fdGVzdF9zZXJ2aWNlLmggXAogICAgICAgICBnZW4tY19nbGliL3RfdGVzdF9lbXB0eV9zZXJ2aWNlLmggXAogICAgICAgICBnZW4tY19nbGliL3RfdGVzdF9pbmhlcml0ZWQuaCBcCiAgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X29wdGlvbmFsX3JlcXVpcmVkX3Rlc3RfdHlwZXMuaCBcCkBAIC0xNDQsOSArMjIyLDExIEBACiAgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X3NlY29uZF9zZXJ2aWNlLmggXAogICAgICAgICBnZW4tY19nbGliL3RfdGVzdF9zZXJ2aWNlX2Zvcl9leGNlcHRpb25fd2l0aF9hX21hcC5oIFwKICAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3Rfc3J2LmggXAorICAgICAgICBnZW4tY19nbGliL3RfdGVzdF9jb250YWluZXJfc2VydmljZS5oIFwKICAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfdGhyaWZ0X3Rlc3QuaCBcCiAgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X3RocmlmdF90ZXN0X3R5cGVzLmgKIGxpYnRlc3RnZW5jX2xhX0xJQkFERCA9ICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL2xpYnRocmlmdF9jX2dsaWIubGEKK2xpYnRlc3RnZW5jX2xhX0NQUEZMQUdTID0gJChBTV9DUFBGTEFHUykgLVduby11bnVzZWQtZnVuY3Rpb24KIAogbm9kaXN0X2xpYnRlc3RnZW5jcHBfbGFfU09VUkNFUyA9IFwKICAgICAgICAgZ2VuLWNwcC9UaHJpZnRUZXN0LmNwcCBcCkBAIC0xNTcsMTggKzIzNywyMiBAQAogICAgICAgICBnZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMuaAogbGlidGVzdGdlbmNwcF9sYV9DUFBGTEFHUyA9IC1JLi4vLi4vY3BwL3NyYyAkKEJPT1NUX0NQUEZMQUdTKSAtSS4vZ2VuLWNwcAogCi1USFJJRlQgPSAkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL3RocmlmdAotCi1nZW4tY19nbGliL3RfdGVzdF9kZWJ1Z19wcm90b190ZXN0X3R5cGVzLmMgZ2VuLWNfZ2xpYi90X3Rlc3RfZGVidWdfcHJvdG9fdGVzdF90eXBlcy5oIGdlbi1jX2dsaWIvdF90ZXN0X2VtcHR5X3NlcnZpY2UuYyBnZW4tY19nbGliL3RfdGVzdF9lbXB0eV9zZXJ2aWNlLmggZ2VuLWNfZ2xpYi90X3Rlc3RfaW5oZXJpdGVkLmMgZ2VuLWNfZ2xpYi90X3Rlc3RfaW5oZXJpdGVkLmggZ2VuLWNfZ2xpYi90X3Rlc3RfcmV2ZXJzZV9vcmRlcl9zZXJ2aWNlLmMgZ2VuLWNfZ2xpYi90X3Rlc3RfcmV2ZXJzZV9vcmRlcl9zZXJ2aWNlLmggZ2VuLWNfZ2xpYi90X3Rlc3Rfc2VydmljZV9mb3JfZXhjZXB0aW9uX3dpdGhfYV9tYXAuYyBnZW4tY19nbGliL3RfdGVzdF9zZXJ2aWNlX2Zvcl9leGNlcHRpb25fd2l0aF9hX21hcC5oIGdlbi1jX2dsaWIvdF90ZXN0X3Nydi5jIGdlbi1jX2dsaWIvdF90ZXN0X3Nydi5oOiAuLi8uLi8uLi90ZXN0L0RlYnVnUHJvdG9UZXN0LnRocmlmdAorZ2VuLWNfZ2xpYi90X3Rlc3RfY29udGFpbmVyX3Rlc3RfdHlwZXMuYyBnZW4tY19nbGliL3RfdGVzdF9jb250YWluZXJfdGVzdF90eXBlcy5oIGdlbi1jX2dsaWIvdF90ZXN0X2NvbnRhaW5lcl9zZXJ2aWNlLmMgZ2VuLWNfZ2xpYi90X3Rlc3RfY29udGFpbmVyX3NlcnZpY2UuaDogQ29udGFpbmVyVGVzdC50aHJpZnQgJChUSFJJRlQpCiAJJChUSFJJRlQpIC0tZ2VuIGNfZ2xpYiAkPAogCi1nZW4tY19nbGliL3RfdGVzdF9vcHRpb25hbF9yZXF1aXJlZF90ZXN0X3R5cGVzLmMgZ2VuLWNfZ2xpYi90X3Rlc3Rfb3B0aW9uYWxfcmVxdWlyZWRfdGVzdF90eXBlcy5oOiAuLi8uLi8uLi90ZXN0L09wdGlvbmFsUmVxdWlyZWRUZXN0LnRocmlmdAorZ2VuLWNfZ2xpYi90X3Rlc3RfZGVidWdfcHJvdG9fdGVzdF90eXBlcy5jIGdlbi1jX2dsaWIvdF90ZXN0X2RlYnVnX3Byb3RvX3Rlc3RfdHlwZXMuaCBnZW4tY19nbGliL3RfdGVzdF9lbXB0eV9zZXJ2aWNlLmMgZ2VuLWNfZ2xpYi90X3Rlc3RfZW1wdHlfc2VydmljZS5oIGdlbi1jX2dsaWIvdF90ZXN0X2luaGVyaXRlZC5jIGdlbi1jX2dsaWIvdF90ZXN0X2luaGVyaXRlZC5oIGdlbi1jX2dsaWIvdF90ZXN0X3JldmVyc2Vfb3JkZXJfc2VydmljZS5jIGdlbi1jX2dsaWIvdF90ZXN0X3JldmVyc2Vfb3JkZXJfc2VydmljZS5oIGdlbi1jX2dsaWIvdF90ZXN0X3NlcnZpY2VfZm9yX2V4Y2VwdGlvbl93aXRoX2FfbWFwLmMgZ2VuLWNfZ2xpYi90X3Rlc3Rfc2VydmljZV9mb3JfZXhjZXB0aW9uX3dpdGhfYV9tYXAuaCBnZW4tY19nbGliL3RfdGVzdF9zcnYuYyBnZW4tY19nbGliL3RfdGVzdF9zcnYuaDogLi4vLi4vLi4vdGVzdC9EZWJ1Z1Byb3RvVGVzdC50aHJpZnQgJChUSFJJRlQpCiAJJChUSFJJRlQpIC0tZ2VuIGNfZ2xpYiAkPAogCi1nZW4tY19nbGliL3RfdGVzdF9zZWNvbmRfc2VydmljZS5jIGdlbi1jX2dsaWIvdF90ZXN0X3RocmlmdF90ZXN0LmMgZ2VuLWNfZ2xpYi90X3Rlc3RfdGhyaWZ0X3Rlc3RfdHlwZXMuYyBnZW4tY19nbGliL3RfdGVzdF9zZWNvbmRfc2VydmljZS5oIGdlbi1jX2dsaWIvdF90ZXN0X3RocmlmdF90ZXN0LS5oIGdlbi1jX2dsaWIvdF90ZXN0X3RocmlmdF90ZXN0X3R5cGVzLmg6IC4uLy4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKK2dlbi1jX2dsaWIvdF90ZXN0X2VudW1fdGVzdF90eXBlcy5jIGdlbi1jX2dsaWIvdF90ZXN0X2VudW1fdGVzdF90eXBlcy5oIGdlbi1jX2dsaWIvdF90ZXN0X2VudW1fdGVzdF9zZXJ2aWNlLmMgZ2VuLWNfZ2xpYi90X3Rlc3RfZW51bV90ZXN0X3NlcnZpY2UuaCA6IC4uLy4uLy4uL3Rlc3QvRW51bVRlc3QudGhyaWZ0ICQoVEhSSUZUKQogCSQoVEhSSUZUKSAtLWdlbiBjX2dsaWIgJDwKIAotZ2VuLWNwcC9UaHJpZnRUZXN0LmNwcCBnZW4tY3BwL1RocmlmdFRlc3RfY29uc3RhbnRzLmNwcCBnZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMuY3BwOiAuLi8uLi8uLi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CitnZW4tY19nbGliL3RfdGVzdF9vcHRpb25hbF9yZXF1aXJlZF90ZXN0X3R5cGVzLmMgZ2VuLWNfZ2xpYi90X3Rlc3Rfb3B0aW9uYWxfcmVxdWlyZWRfdGVzdF90eXBlcy5oOiAuLi8uLi8uLi90ZXN0L09wdGlvbmFsUmVxdWlyZWRUZXN0LnRocmlmdCAkKFRIUklGVCkKKwkkKFRIUklGVCkgLS1nZW4gY19nbGliICQ8CisKK2dlbi1jX2dsaWIvdF90ZXN0X3NlY29uZF9zZXJ2aWNlLmMgZ2VuLWNfZ2xpYi90X3Rlc3RfdGhyaWZ0X3Rlc3QuYyBnZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdF90eXBlcy5jIGdlbi1jX2dsaWIvdF90ZXN0X3NlY29uZF9zZXJ2aWNlLmggZ2VuLWNfZ2xpYi90X3Rlc3RfdGhyaWZ0X3Rlc3QuaCBnZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdF90eXBlcy5oOiAuLi8uLi8uLi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0ICQoVEhSSUZUKQorCSQoVEhSSUZUKSAtLWdlbiBjX2dsaWIgJDwKKworZ2VuLWNwcC9UaHJpZnRUZXN0LmNwcCBnZW4tY3BwL1RocmlmdFRlc3RfY29uc3RhbnRzLmNwcCBnZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMuY3BwOiAuLi8uLi8uLi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0ICQoVEhSSUZUKQogCSQoVEhSSUZUKSAtLWdlbiBjcHAgJDwKIAogVEVTVFMgPSBcCkBAIC0yMjQsNyArMzA4LDcgQEAKIAkgICAgJHskPF9WQUxHUklORF9MRUFLX09QVFN9ICAuLyQ8CiAKIGNsZWFuLWxvY2FsOgotCSQoUk0pIC1yIGdlbi1jX2dsaWIgZ2VuLWNwcAorCSQoUk0pIGdlbi1jX2dsaWIvKiBnZW4tY3BwLyoKIAogQ0xFQU5GSUxFUyA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAqLmJiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC0yMzMsMyArMzE3LDggQEAKICAgICAqLmdjbm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgKi5nY2RhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICouZ2NvdgorCitFWFRSQV9ESVNUID0gXAorICAgICAgICAgICAgIENNYWtlTGlzdHMudHh0IFwKKyAgICAgICAgICAgICBDb250YWluZXJUZXN0LnRocmlmdAorCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3Rlc3QvdGVzdGFwcGxpY2F0aW9uZXhjZXB0aW9uLmMgYi9saWIvY19nbGliL3Rlc3QvdGVzdGFwcGxpY2F0aW9uZXhjZXB0aW9uLmMKaW5kZXggMjQ4MTM0MC4uODllMzllMiAxMDA2NDQKLS0tIGEvbGliL2NfZ2xpYi90ZXN0L3Rlc3RhcHBsaWNhdGlvbmV4Y2VwdGlvbi5jCisrKyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0YXBwbGljYXRpb25leGNlcHRpb24uYwpAQCAtOTksNyArOTksNyBAQAogCiAvKiAiZ190ZXN0X2V4cGVjdF9tZXNzYWdlIiBpcyByZXF1aXJlZCBmb3IgdGhlIHByb3BlcnR5IHJhbmdlIHRlc3RzIGJlbG93IGJ1dCBpcwogICAgbm90IHByZXNlbnQgaW4gR0xpYiBiZWZvcmUgdmVyc2lvbiAyLjM0ICovCi0jaWYgKEdMSUJfTUFKT1JfVkVSU0lPTiA9PSAyKSAmJiAoR0xJQl9NSU5PUl9WRVJTSU9OID49IDM0KQorI2lmIChHTElCX0NIRUNLX1ZFUlNJT04gKDIsIDM0LCAwKSkKICAgZ19vYmplY3Rfc2V0ICh4Y2VwdGlvbiwKICAgICAgICAgICAgICAgICAidHlwZSIsIFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1JfVU5LTk9XTiwKICAgICAgICAgICAgICAgICBOVUxMKTsKQEAgLTE2MSw3ICsxNjEsNyBAQAogaW50CiBtYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiB7Ci0jaWYgKEdMSUJfTUFKT1JfVkVSU0lPTiA9PSAyKSAmJiAoR0xJQl9NSU5PUl9WRVJTSU9OIDwgMzYpCisjaWYgKCFHTElCX0NIRUNLX1ZFUlNJT04gKDIsIDM2LCAwKSkKICAgZ190eXBlX2luaXQgKCk7CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi90ZXN0L3Rlc3RiaW5hcnlwcm90b2NvbC5jIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3RiaW5hcnlwcm90b2NvbC5jCmluZGV4IGY3NWM3OTYuLjE0ZjRmYjAgMTAwNzU1Ci0tLSBhL2xpYi9jX2dsaWIvdGVzdC90ZXN0YmluYXJ5cHJvdG9jb2wuYworKysgYi9saWIvY19nbGliL3Rlc3QvdGVzdGJpbmFyeXByb3RvY29sLmMKQEAgLTE3LDIyICsxNywzMSBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorLyogRGlzYWJsZSBzdHJpbmctZnVuY3Rpb24gb3B0aW1pemF0aW9ucyB3aGVuIGdsaWJjIGlzIHVzZWQsIGFzIHRoZXNlIHByb2R1Y2UKKyAgIGNvbXBpbGVyIHdhcm5pbmdzIGFib3V0IHN0cmluZyBsZW5ndGggd2hlbiBhIHN0cmluZyBmdW5jdGlvbiBpcyB1c2VkIGluc2lkZQorICAgYSBjYWxsIHRvIGdfYXNzZXJ0ICgpICovCisjaWZkZWYgX19HTElCQ19fCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNkZWZpbmUgX19OT19TVFJJTkdfSU5MSU5FUyAxCisjZW5kaWYKKwogI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+CiAjaW5jbHVkZSA8bmV0ZGIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgogCiAjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuaD4KICNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc29ja2V0Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl9zb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydC5oPgogCiAjZGVmaW5lIFRFU1RfQk9PTCBUUlVFCiAjZGVmaW5lIFRFU1RfQllURSAxMjMKICNkZWZpbmUgVEVTVF9JMTYgMTIzNDUKICNkZWZpbmUgVEVTVF9JMzIgMTIzNDU2Nzg5MAotI2RlZmluZSBURVNUX0k2NCAxMjM0NTY3ODkwMTIzNDVMTAorI2RlZmluZSBURVNUX0k2NCBHX0dJTlQ2NF9DT05TVEFOVCAoMTIzNDU2Nzg5MDEyMzQ1KQogI2RlZmluZSBURVNUX0RPVUJMRSAxMjM0NTY3ODkwLjEyMwogI2RlZmluZSBURVNUX1NUUklORyAidGhpcyBpcyBhIHRlc3Qgc3RyaW5nIDEyMzQ1Njc4OTAhQCMkJV4mKigpIgogI2RlZmluZSBURVNUX1BPUlQgNTExOTkKQEAgLTQxLDE0ICs1MCwxNCBAQAogc3RhdGljIGludCB0cmFuc3BvcnRfcmVhZF9lcnJvciA9IDA7CiBzdGF0aWMgaW50IHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gLTE7CiBnaW50MzIKLW15X3RocmlmdF90cmFuc3BvcnRfcmVhZCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGdwb2ludGVyIGJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKQorbXlfdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2FsbCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGdwb2ludGVyIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcikKIHsKICAgaWYgKHRyYW5zcG9ydF9yZWFkX2NvdW50ICE9IHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0CiAgICAgICAmJiB0cmFuc3BvcnRfcmVhZF9lcnJvciA9PSAwKQogICB7CiAgICAgdHJhbnNwb3J0X3JlYWRfY291bnQrKzsKLSAgICByZXR1cm4gdGhyaWZ0X3RyYW5zcG9ydF9yZWFkICh0cmFuc3BvcnQsIGJ1ZiwgbGVuLCBlcnJvcik7CisgICAgcmV0dXJuIHRocmlmdF90cmFuc3BvcnRfcmVhZF9hbGwgKHRyYW5zcG9ydCwgYnVmLCBsZW4sIGVycm9yKTsKICAgfQogICByZXR1cm4gLTE7CiB9CkBAIC02OSwxNCArNzgsMTUgQEAKICAgcmV0dXJuIEZBTFNFOwogfQogCi0jZGVmaW5lIHRocmlmdF90cmFuc3BvcnRfcmVhZCBteV90aHJpZnRfdHJhbnNwb3J0X3JlYWQKKyNkZWZpbmUgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2FsbCBteV90aHJpZnRfdHJhbnNwb3J0X3JlYWRfYWxsCiAjZGVmaW5lIHRocmlmdF90cmFuc3BvcnRfd3JpdGUgbXlfdGhyaWZ0X3RyYW5zcG9ydF93cml0ZQogI2luY2x1ZGUgIi4uL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2wuYyIKLSN1bmRlZiB0aHJpZnRfdHJhbnNwb3J0X3JlYWQKKyN1bmRlZiB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfYWxsCiAjdW5kZWYgdGhyaWZ0X3RyYW5zcG9ydF93cml0ZQogCiBzdGF0aWMgdm9pZCB0aHJpZnRfc2VydmVyX3ByaW1pdGl2ZXMgKGNvbnN0IGludCBwb3J0KTsKIHN0YXRpYyB2b2lkIHRocmlmdF9zZXJ2ZXJfY29tcGxleF90eXBlcyAoY29uc3QgaW50IHBvcnQpOworc3RhdGljIHZvaWQgdGhyaWZ0X3NlcnZlcl9tYW55X2ZyYW1lcyAoY29uc3QgaW50IHBvcnQpOwogCiBzdGF0aWMgdm9pZAogdGVzdF9jcmVhdGVfYW5kX2Rlc3Ryb3kodm9pZCkKQEAgLTg1LDcgKzk1LDcgQEAKIAogICAvKiBjcmVhdGUgYW4gb2JqZWN0IGFuZCB0aGVuIGRlc3Ryb3kgaXQgKi8KICAgb2JqZWN0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0wsIE5VTEwpOwotICBhc3NlcnQgKG9iamVjdCAhPSBOVUxMKTsKKyAgZ19hc3NlcnQgKG9iamVjdCAhPSBOVUxMKTsKICAgZ19vYmplY3RfdW5yZWYgKG9iamVjdCk7CiB9CiAKQEAgLTk5LDExICsxMDksMTEgQEAKICAgLyogY3JlYXRlIGEgVGhyaWZ0VHJhbnNwb3J0ICovCiAgIHRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwgImhvc3RuYW1lIiwgImxvY2FsaG9zdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3J0IiwgNTExODgsIE5VTEwpOwotICBhc3NlcnQgKHRzb2NrZXQgIT0gTlVMTCk7CisgIGdfYXNzZXJ0ICh0c29ja2V0ICE9IE5VTEwpOwogICAvKiBjcmVhdGUgYSBUaHJpZnRCaW5hcnlQcm90b2NvbCB1c2luZyB0aGUgVHJhbnNwb3J0ICovCiAgIHByb3RvY29sID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0wsICJ0cmFuc3BvcnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHNvY2tldCwgTlVMTCk7Ci0gIGFzc2VydCAocHJvdG9jb2wgIT0gTlVMTCk7CisgIGdfYXNzZXJ0IChwcm90b2NvbCAhPSBOVUxMKTsKICAgLyogZmV0Y2ggdGhlIHByb3BlcnRpZXMgKi8KICAgZ19vYmplY3RfZ2V0IChHX09CSkVDVChwcm90b2NvbCksICJ0cmFuc3BvcnQiLCAmdGVtcCwgTlVMTCk7CiAgIGdfb2JqZWN0X3VucmVmICh0ZW1wKTsKQEAgLTEyOCw3ICsxMzgsNyBAQAogCiAgIC8qIGZvcmsgYSBzZXJ2ZXIgZnJvbSB0aGUgY2xpZW50ICovCiAgIHBpZCA9IGZvcmsgKCk7Ci0gIGFzc2VydCAocGlkID49IDApOworICBnX2Fzc2VydCAocGlkID49IDApOwogCiAgIGlmIChwaWQgPT0gMCkKICAgewpAQCAtMTQ0LDQ3ICsxNTQsNDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCIsIHBvcnQsIE5VTEwpOwogICAgIHRyYW5zcG9ydCA9IFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpOwogICAgIHRocmlmdF90cmFuc3BvcnRfb3BlbiAodHJhbnNwb3J0LCBOVUxMKTsKLSAgICBhc3NlcnQgKHRocmlmdF90cmFuc3BvcnRfaXNfb3BlbiAodHJhbnNwb3J0KSk7CisgICAgZ19hc3NlcnQgKHRocmlmdF90cmFuc3BvcnRfaXNfb3BlbiAodHJhbnNwb3J0KSk7CiAKICAgICAvKiBjcmVhdGUgYSBUaHJpZnRCaW5hcnlUcmFuc3BvcnQgKi8KICAgICB0YiA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MLCAidHJhbnNwb3J0IiwKICAgICAgICAgICAgICAgICAgICAgICAgdHNvY2tldCwgTlVMTCk7CiAgICAgcHJvdG9jb2wgPSBUSFJJRlRfUFJPVE9DT0wgKHRiKTsKLSAgICBhc3NlcnQgKHByb3RvY29sICE9IE5VTEwpOworICAgIGdfYXNzZXJ0IChwcm90b2NvbCAhPSBOVUxMKTsKIAogICAgIC8qIHdyaXRlIGEgYnVuY2ggb2YgcHJpbWl0aXZlcyAqLwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9ib29sIChwcm90b2NvbCwgVEVTVF9CT09MLCBOVUxMKSA+IDApOwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgVEVTVF9CWVRFLCBOVUxMKSA+IDApOwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9pMTYgKHByb3RvY29sLCBURVNUX0kxNiwgTlVMTCkgPiAwKTsKLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgVEVTVF9JMzIsIE5VTEwpID4gMCk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2k2NCAocHJvdG9jb2wsIFRFU1RfSTY0LCBOVUxMKSA+IDApOwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9kb3VibGUgKHByb3RvY29sLCAKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9ib29sIChwcm90b2NvbCwgVEVTVF9CT09MLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCBURVNUX0JZVEUsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfaTE2IChwcm90b2NvbCwgVEVTVF9JMTYsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgVEVTVF9JMzIsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfaTY0IChwcm90b2NvbCwgVEVTVF9JNjQsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfZG91YmxlIChwcm90b2NvbCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVTVF9ET1VCTEUsIE5VTEwpID4gMCk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX3N0cmluZyAocHJvdG9jb2wsCisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfc3RyaW5nIChwcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURVNUX1NUUklORywgTlVMTCkgPiAwKTsKLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYmluYXJ5IChwcm90b2NvbCwgYmluYXJ5LCAKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9zdHJpbmcgKHByb3RvY29sLCAiIiwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9iaW5hcnkgKHByb3RvY29sLCBiaW5hcnksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwgTlVMTCkgPiAwKTsKLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYmluYXJ5IChwcm90b2NvbCwgTlVMTCwgMCwgTlVMTCkgPiAwKTsKLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYmluYXJ5IChwcm90b2NvbCwgYmluYXJ5LAorICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2JpbmFyeSAocHJvdG9jb2wsIE5VTEwsIDAsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYmluYXJ5IChwcm90b2NvbCwgYmluYXJ5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwgTlVMTCkgPiAwKTsKIAogICAgIC8qIHRlc3Qgd3JpdGUgZXJyb3JzICovCiAgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yID0gMTsKLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIFRFU1RfQllURSwgCisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIFRFU1RfQllURSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID09IC0xKTsKLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfaTE2IChwcm90b2NvbCwgVEVTVF9JMTYsIE5VTEwpID09IC0xKTsKLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgVEVTVF9JMzIsIE5VTEwpID09IC0xKTsKLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfaTY0IChwcm90b2NvbCwgVEVTVF9JNjQsIE5VTEwpID09IC0xKTsKLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfZG91YmxlIChwcm90b2NvbCwgVEVTVF9ET1VCTEUsCisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfaTE2IChwcm90b2NvbCwgVEVTVF9JMTYsIE5VTEwpID09IC0xKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9pMzIgKHByb3RvY29sLCBURVNUX0kzMiwgTlVMTCkgPT0gLTEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2k2NCAocHJvdG9jb2wsIFRFU1RfSTY0LCBOVUxMKSA9PSAtMSk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfZG91YmxlIChwcm90b2NvbCwgVEVTVF9ET1VCTEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPT0gLTEpOwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9iaW5hcnkgKHByb3RvY29sLCBiaW5hcnksIGxlbiwKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9iaW5hcnkgKHByb3RvY29sLCBiaW5hcnksIGxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA9PSAtMSk7CiAgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yID0gMDsKIAogICAgIC8qIHRlc3QgYmluYXJ5IHBhcnRpYWwgZmFpbHVyZSAqLwogICAgIHRyYW5zcG9ydF93cml0ZV9jb3VudCA9IDA7CiAgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yX2F0ID0gMTsKLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYmluYXJ5IChwcm90b2NvbCwgYmluYXJ5LAorICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2JpbmFyeSAocHJvdG9jb2wsIGJpbmFyeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4sIE5VTEwpID09IC0xKTsKICAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAtMTsKIApAQCAtMTkyLDggKzIwMyw4IEBACiAgICAgdGhyaWZ0X3RyYW5zcG9ydF9jbG9zZSAodHJhbnNwb3J0LCBOVUxMKTsKICAgICBnX29iamVjdF91bnJlZiAodHNvY2tldCk7CiAgICAgZ19vYmplY3RfdW5yZWYgKHByb3RvY29sKTsKLSAgICBhc3NlcnQgKHdhaXQgKCZzdGF0dXMpID09IHBpZCk7Ci0gICAgYXNzZXJ0IChzdGF0dXMgPT0gMCk7CisgICAgZ19hc3NlcnQgKHdhaXQgKCZzdGF0dXMpID09IHBpZCk7CisgICAgZ19hc3NlcnQgKHN0YXR1cyA9PSAwKTsKICAgfQogfQogCkBAIC0yMTAsNyArMjIxLDcgQEAKIAogICAvKiBmb3JrIGEgc2VydmVyIGZyb20gdGhlIGNsaWVudCAqLwogICBwaWQgPSBmb3JrICgpOwotICBhc3NlcnQgKHBpZCA+PSAwKTsKKyAgZ19hc3NlcnQgKHBpZCA+PSAwKTsKIAogICBpZiAocGlkID09IDApCiAgIHsKQEAgLTIyNiwzMyArMjM3LDMzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQiLCBwb3J0LCBOVUxMKTsKICAgICB0cmFuc3BvcnQgPSBUSFJJRlRfVFJBTlNQT1JUICh0c29ja2V0KTsKICAgICB0aHJpZnRfdHJhbnNwb3J0X29wZW4gKHRyYW5zcG9ydCwgTlVMTCk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfdHJhbnNwb3J0X2lzX29wZW4gKHRyYW5zcG9ydCkpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfdHJhbnNwb3J0X2lzX29wZW4gKHRyYW5zcG9ydCkpOwogCiAgICAgLyogY3JlYXRlIGEgVGhyaWZ0QmluYXJ5VHJhbnNwb3J0ICovCiAgICAgdGIgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTCwgInRyYW5zcG9ydCIsCiAgICAgICAgICAgICAgICAgICAgICAgIHRzb2NrZXQsIE5VTEwpOwogICAgIHByb3RvY29sID0gVEhSSUZUX1BST1RPQ09MICh0Yik7Ci0gICAgYXNzZXJ0IChwcm90b2NvbCAhPSBOVUxMKTsKKyAgICBnX2Fzc2VydCAocHJvdG9jb2wgIT0gTlVMTCk7CiAKICAgICAvKiB0ZXN0IHN0cnVjdHVyZXMgKi8KLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfc3RydWN0X2JlZ2luIChwcm90b2NvbCwgCisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfc3RydWN0X2JlZ2luIChwcm90b2NvbCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCkgPT0gMCk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9zdHJ1Y3RfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CiAKLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsIFRfVk9JRCwKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwgVF9WT0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgTlVMTCkgPiAwKTsKLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CiAKICAgICAvKiB0ZXN0IHdyaXRlIGVycm9yICovCiAgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yID0gMTsKLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsIFRfVk9JRCwgCisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsIFRfVk9JRCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBOVUxMKSA9PSAtMSk7CiAgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yID0gMDsKIAogICAgIC8qIHRlc3QgMm5kIHdyaXRlIGVycm9yICovCiAgICAgdHJhbnNwb3J0X3dyaXRlX2NvdW50ID0gMDsKICAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAxOwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwgVF9WT0lELAorICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLCBUX1ZPSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBOVUxMKSA9PSAtMSk7CiAgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yX2F0ID0gLTE7CiAKQEAgLTI2MCwxMiArMjcxLDEyIEBACiAgICAgdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgVF9WT0lELCBOVUxMKTsKIAogICAgIC8qIHRlc3Qgd3JpdGVfZmllbGRfc3RvcCAqLwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9maWVsZF9zdG9wIChwcm90b2NvbCwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9maWVsZF9zdG9wIChwcm90b2NvbCwgTlVMTCkgPiAwKTsKIAogICAgIC8qIHdyaXRlIGEgbWFwICovCi0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX21hcF9iZWdpbiAocHJvdG9jb2wsIFRfVk9JRCwgVF9WT0lELAorICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX21hcF9iZWdpbiAocHJvdG9jb2wsIFRfVk9JRCwgVF9WT0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIE5VTEwpID4gMCk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX21hcF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9tYXBfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CiAKICAgICAvKiB0ZXN0IDJuZCByZWFkIGZhaWx1cmUgb24gYSBtYXAgKi8KICAgICB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCBUX1ZPSUQsIE5VTEwpOwpAQCAtMjc2LDIxICsyODcsMjEgQEAKIAogICAgIC8qIHRlc3QgMXN0IHdyaXRlIGZhaWx1cmUgb24gYSBtYXAgKi8KICAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3IgPSAxOwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9tYXBfYmVnaW4gKHByb3RvY29sLCBUX1ZPSUQsIFRfVk9JRCwKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9tYXBfYmVnaW4gKHByb3RvY29sLCBUX1ZPSUQsIFRfVk9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBOVUxMKSA9PSAtMSk7CiAgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yID0gMDsKIAogICAgIC8qIHRlc3QgMm5kIHdyaXRlIGZhaWx1cmUgb24gYSBtYXAgKi8KICAgICB0cmFuc3BvcnRfd3JpdGVfY291bnQgPSAwOwogICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvcl9hdCA9IDE7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX21hcF9iZWdpbiAocHJvdG9jb2wsIFRfVk9JRCwgVF9WT0lELAorICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX21hcF9iZWdpbiAocHJvdG9jb2wsIFRfVk9JRCwgVF9WT0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIE5VTEwpID09IC0xKTsKICAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAtMTsKIAogICAgIC8qIHRlc3QgM3JkIHdyaXRlIGZhaWx1cmUgb24gYSBtYXAgKi8KICAgICB0cmFuc3BvcnRfd3JpdGVfY291bnQgPSAwOwogICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvcl9hdCA9IDI7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX21hcF9iZWdpbiAocHJvdG9jb2wsIFRfVk9JRCwgVF9WT0lELAorICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX21hcF9iZWdpbiAocHJvdG9jb2wsIFRfVk9JRCwgVF9WT0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIE5VTEwpID09IC0xKTsKICAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAtMTsKIApAQCAtMzAwLDkgKzMxMSw5IEBACiAgICAgdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9pMzIgKHByb3RvY29sLCAtMTAsIE5VTEwpOwogCiAgICAgLyogdGVzdCBsaXN0IG9wZXJhdGlvbnMgKi8KLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbGlzdF9iZWdpbiAocHJvdG9jb2wsIFRfVk9JRCwKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9saXN0X2JlZ2luIChwcm90b2NvbCwgVF9WT0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBOVUxMKSA+IDApOwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9saXN0X2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2xpc3RfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CiAKICAgICAvKiB0ZXN0IDJuZCByZWFkIGZhaWx1cmUgb24gYSBsaXN0ICovCiAgICAgdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgVF9WT0lELCBOVUxMKTsKQEAgLTMxMywyNyArMzI0LDI3IEBACiAKICAgICAvKiB0ZXN0IGZpcnN0IHdyaXRlIGVycm9yIG9uIGEgbGlzdCAqLwogICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvciA9IDE7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2xpc3RfYmVnaW4gKHByb3RvY29sLCBUX1ZPSUQsCisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbGlzdF9iZWdpbiAocHJvdG9jb2wsIFRfVk9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgTlVMTCkgPT0gLTEpOwogICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvciA9IDA7CiAKICAgICAvKiB0ZXN0IDJuZCB3cml0ZSBlcnJvciBvbiBhIGxpc3QgKi8KICAgICB0cmFuc3BvcnRfd3JpdGVfY291bnQgPSAwOwogICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvcl9hdCA9IDE7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2xpc3RfYmVnaW4gKHByb3RvY29sLCBUX1ZPSUQsCisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbGlzdF9iZWdpbiAocHJvdG9jb2wsIFRfVk9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgTlVMTCkgPT0gLTEpOwogICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvcl9hdCA9IC0xOwogCiAgICAgLyogdGVzdCBzZXQgb3BlcmF0aW9uIHMqLwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9zZXRfYmVnaW4gKHByb3RvY29sLCBUX1ZPSUQsCisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfc2V0X2JlZ2luIChwcm90b2NvbCwgVF9WT0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIE5VTEwpID4gMCk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX3NldF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9zZXRfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CiAKICAgICAvKiBpbnZhbGlkIHZlcnNpb24gKi8KLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgLTEsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgLTEsIE5VTEwpID4gMCk7CiAKICAgICAvKiBzeiA+IDAgZm9yIGEgbWVzc2FnZSAqLwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9pMzIgKHByb3RvY29sLCAxLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2kzMiAocHJvdG9jb2wsIDEsIE5VTEwpID4gMCk7CiAKICAgICAvKiBzZW5kIGEgdmFsaWQgbWVzc2FnZSAqLwogICAgIHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgMHg4MDAxMDAwMCwgTlVMTCk7CkBAIC0zNDgsMjYgKzM1OSwyNiBAQAogICAgIHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfc3RyaW5nIChwcm90b2NvbCwgInRlc3QiLCBOVUxMKTsKIAogICAgIC8qIHNlbmQgYSB2YWxpZCBtZXNzYWdlICovCi0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9DQUxMLCAxLCBOVUxMKSA+IDApOwogCi0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKIAogICAgIC8qIHNlbmQgYnJva2VuIHdyaXRlcyAqLwogICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvciA9IDE7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9DQUxMLCAxLCBOVUxMKSA9PSAtMSk7CiAgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yID0gMDsKIAogICAgIHRyYW5zcG9ydF93cml0ZV9jb3VudCA9IDA7CiAgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yX2F0ID0gMjsKLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0NBTEwsIDEsIE5VTEwpID09IC0xKTsKICAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAtMTsKIAogICAgIHRyYW5zcG9ydF93cml0ZV9jb3VudCA9IDA7CiAgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yX2F0ID0gMzsKLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0NBTEwsIDEsIE5VTEwpID09IC0xKTsKICAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAtMTsKIApAQCAtMzc1LDggKzM4Niw5NSBAQAogICAgIHRocmlmdF90cmFuc3BvcnRfY2xvc2UgKHRyYW5zcG9ydCwgTlVMTCk7CiAgICAgZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOwogICAgIGdfb2JqZWN0X3VucmVmIChwcm90b2NvbCk7Ci0gICAgYXNzZXJ0ICh3YWl0ICgmc3RhdHVzKSA9PSBwaWQpOwotICAgIGFzc2VydCAoc3RhdHVzID09IDApOworICAgIGdfYXNzZXJ0ICh3YWl0ICgmc3RhdHVzKSA9PSBwaWQpOworICAgIGdfYXNzZXJ0IChzdGF0dXMgPT0gMCk7CisgIH0KK30KKworc3RhdGljIHZvaWQKK3Rlc3RfcmVhZF9hbmRfd3JpdGVfbWFueV9mcmFtZXMgKHZvaWQpCit7CisgIGludCBzdGF0dXM7CisgIHBpZF90IHBpZDsKKyAgVGhyaWZ0U29ja2V0ICp0c29ja2V0ID0gTlVMTDsKKyAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBOVUxMOworICBUaHJpZnRGcmFtZWRUcmFuc3BvcnQgKmZ0ID0gTlVMTDsKKyAgVGhyaWZ0QmluYXJ5UHJvdG9jb2wgKnRiID0gTlVMTDsKKyAgVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sID0gTlVMTDsKKyAgZ3BvaW50ZXIgYmluYXJ5ID0gKGdwb2ludGVyICopIFRFU1RfU1RSSU5HOworICBjb25zdCBndWludDMyIGxlbiA9IHN0cmxlbiAoVEVTVF9TVFJJTkcpOworICBpbnQgcG9ydCA9IFRFU1RfUE9SVDsKKworICAvKiBmb3JrIGEgc2VydmVyIGZyb20gdGhlIGNsaWVudCAqLworICBwaWQgPSBmb3JrICgpOworICBnX2Fzc2VydCAocGlkID49IDApOworCisgIGlmIChwaWQgPT0gMCkKKyAgeworICAgIC8qIGNoaWxkIGxpc3RlbnMgKi8KKyAgICB0aHJpZnRfc2VydmVyX21hbnlfZnJhbWVzIChwb3J0KTsKKyAgICBleGl0ICgwKTsKKyAgfSBlbHNlIHsKKyAgICAvKiBwYXJlbnQuICB3YWl0IGEgYml0IGZvciB0aGUgc29ja2V0IHRvIGJlIGNyZWF0ZWQuICovCisgICAgc2xlZXAgKDEpOworCisgICAgLyogY3JlYXRlIGEgVGhyaWZ0U29ja2V0ICovCisgICAgdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCIsIHBvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0c29ja2V0ICE9IE5VTEwpOworICAgIHRyYW5zcG9ydCA9IFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpOworCisgICAgLyogd3JhcCBpbiBhIGZyYW1lZCB0cmFuc3BvcnQgKi8KKyAgICBmdCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfRlJBTUVEX1RSQU5TUE9SVCwgInRyYW5zcG9ydCIsIHRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgIndfYnVmX3NpemUiLCAxLCBOVUxMKTsKKyAgICBnX2Fzc2VydCAoZnQgIT0gTlVMTCk7CisgICAgdHJhbnNwb3J0ID0gVEhSSUZUX1RSQU5TUE9SVCAoZnQpOworCisgICAgdGhyaWZ0X3RyYW5zcG9ydF9vcGVuICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfdHJhbnNwb3J0X2lzX29wZW4gKHRyYW5zcG9ydCkpOworCisgICAgLyogY3JlYXRlIGEgYmluYXJ5IHByb3RvY29sICovCisgICAgdGIgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTCwgInRyYW5zcG9ydCIsCisgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydCwgTlVMTCk7CisgICAgcHJvdG9jb2wgPSBUSFJJRlRfUFJPVE9DT0wgKHRiKTsKKyAgICBnX2Fzc2VydCAocHJvdG9jb2wgIT0gTlVMTCk7CisKKyAgICAvKiB3cml0ZSBhIGJ1bmNoIG9mIHByaW1pdGl2ZXMgKi8KKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9ib29sIChwcm90b2NvbCwgVEVTVF9CT09MLCBOVUxMKSA+IDApOworICAgIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIFRFU1RfQllURSwgTlVMTCkgPiAwKTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2kxNiAocHJvdG9jb2wsIFRFU1RfSTE2LCBOVUxMKSA+IDApOworICAgIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgVEVTVF9JMzIsIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9pNjQgKHByb3RvY29sLCBURVNUX0k2NCwgTlVMTCkgPiAwKTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2RvdWJsZSAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVTVF9ET1VCTEUsIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9zdHJpbmcgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFU1RfU1RSSU5HLCBOVUxMKSA+IDApOworICAgIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfc3RyaW5nIChwcm90b2NvbCwgIiIsIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9iaW5hcnkgKHByb3RvY29sLCBiaW5hcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLCBOVUxMKSA+IDApOworICAgIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYmluYXJ5IChwcm90b2NvbCwgTlVMTCwgMCwgTlVMTCkgPiAwKTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2JpbmFyeSAocHJvdG9jb2wsIGJpbmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4sIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKworICAgIC8qIGNsZWFuIHVwICovCisgICAgdGhyaWZ0X3RyYW5zcG9ydF93cml0ZV9lbmQgKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9jbG9zZSAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX29iamVjdF91bnJlZiAoZnQpOworICAgIGdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKKyAgICBnX29iamVjdF91bnJlZiAodGIpOworICAgIGdfYXNzZXJ0ICh3YWl0ICgmc3RhdHVzKSA9PSBwaWQpOworICAgIGdfYXNzZXJ0IChzdGF0dXMgPT0gMCk7CiAgIH0KIH0KIApAQCAtMzk1LDYgKzQ5Myw3IEBACiAgIGdpbnQ2NCB2YWx1ZV82NCA9IDA7CiAgIGdkb3VibGUgdmFsdWVfZG91YmxlID0gMDsKICAgZ2NoYXIgKnN0cmluZyA9IE5VTEw7CisgIGdjaGFyICplbXB0eV9zdHJpbmcgPSBOVUxMOwogICBncG9pbnRlciBiaW5hcnkgPSBOVUxMOwogICBndWludDMyIGxlbiA9IDA7CiAgIHZvaWQgKmNvbXBhcmF0b3IgPSAodm9pZCAqKSBURVNUX1NUUklORzsKQEAgLTQwNCw2MSArNTAzLDY4IEBACiAgIHRyYW5zcG9ydCA9IFRIUklGVF9TRVJWRVJfVFJBTlNQT1JUICh0c29ja2V0KTsKICAgdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfbGlzdGVuICh0cmFuc3BvcnQsIE5VTEwpOwogICBjbGllbnQgPSB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9hY2NlcHQgKHRyYW5zcG9ydCwgTlVMTCk7Ci0gIGFzc2VydCAoY2xpZW50ICE9IE5VTEwpOworICBnX2Fzc2VydCAoY2xpZW50ICE9IE5VTEwpOwogCiAgIHRicCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MLCAidHJhbnNwb3J0IiwKICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQsIE5VTEwpOwogICBwcm90b2NvbCA9IFRIUklGVF9QUk9UT0NPTCAodGJwKTsKIAotICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9ib29sIChwcm90b2NvbCwKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9ib29sIChwcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlX2Jvb2xlYW4sIE5VTEwpID4gMCk7Ci0gIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmdmFsdWVfYnl0ZSwgTlVMTCkgPiAwKTsKLSAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfaTE2IChwcm90b2NvbCwgJnZhbHVlXzE2LCBOVUxMKSA+IDApOwotICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9pMzIgKHByb3RvY29sLCAmdmFsdWVfMzIsIE5VTEwpID4gMCk7Ci0gIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2k2NCAocHJvdG9jb2wsICZ2YWx1ZV82NCwgTlVMTCkgPiAwKTsKLSAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfZG91YmxlIChwcm90b2NvbCwKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnZhbHVlX2J5dGUsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfaTE2IChwcm90b2NvbCwgJnZhbHVlXzE2LCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2kzMiAocHJvdG9jb2wsICZ2YWx1ZV8zMiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9pNjQgKHByb3RvY29sLCAmdmFsdWVfNjQsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfZG91YmxlIChwcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVfZG91YmxlLCBOVUxMKSA+IDApOwotICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9zdHJpbmcgKHByb3RvY29sLCAmc3RyaW5nLCBOVUxMKSA+IDApOwotICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9iaW5hcnkgKHByb3RvY29sLCAmYmluYXJ5LAorICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX3N0cmluZyAocHJvdG9jb2wsICZzdHJpbmcsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfc3RyaW5nIChwcm90b2NvbCwgJmVtcHR5X3N0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2JpbmFyeSAocHJvdG9jb2wsICZiaW5hcnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlbiwgTlVMTCkgPiAwKTsKIAotICBhc3NlcnQgKHZhbHVlX2Jvb2xlYW4gPT0gVEVTVF9CT09MKTsKLSAgYXNzZXJ0ICh2YWx1ZV9ieXRlID0gVEVTVF9CWVRFKTsKLSAgYXNzZXJ0ICh2YWx1ZV8xNiA9IFRFU1RfSTE2KTsKLSAgYXNzZXJ0ICh2YWx1ZV8zMiA9IFRFU1RfSTMyKTsKLSAgYXNzZXJ0ICh2YWx1ZV82NCA9IFRFU1RfSTY0KTsKLSAgYXNzZXJ0ICh2YWx1ZV9kb3VibGUgPSBURVNUX0RPVUJMRSk7Ci0gIGFzc2VydCAoc3RyY21wIChURVNUX1NUUklORywgc3RyaW5nKSA9PSAwKTsKLSAgYXNzZXJ0IChtZW1jbXAgKGNvbXBhcmF0b3IsIGJpbmFyeSwgbGVuKSA9PSAwKTsKKyAgZ19hc3NlcnQgKHZhbHVlX2Jvb2xlYW4gPT0gVEVTVF9CT09MKTsKKyAgZ19hc3NlcnQgKHZhbHVlX2J5dGUgPT0gVEVTVF9CWVRFKTsKKyAgZ19hc3NlcnQgKHZhbHVlXzE2ID09IFRFU1RfSTE2KTsKKyAgZ19hc3NlcnQgKHZhbHVlXzMyID09IFRFU1RfSTMyKTsKKyAgZ19hc3NlcnQgKHZhbHVlXzY0ID09IFRFU1RfSTY0KTsKKyAgZ19hc3NlcnQgKHZhbHVlX2RvdWJsZSA9PSBURVNUX0RPVUJMRSk7CisgIGdfYXNzZXJ0IChzdHJjbXAgKFRFU1RfU1RSSU5HLCBzdHJpbmcpID09IDApOworICBnX2Fzc2VydCAoc3RyY21wICgiIiwgZW1wdHlfc3RyaW5nKSA9PSAwKTsKKyAgZ19hc3NlcnQgKG1lbWNtcCAoY29tcGFyYXRvciwgYmluYXJ5LCBsZW4pID09IDApOwogCiAgIGdfZnJlZSAoc3RyaW5nKTsKKyAgZ19mcmVlIChlbXB0eV9zdHJpbmcpOwogICBnX2ZyZWUgKGJpbmFyeSk7CiAKLSAgdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2JpbmFyeSAocHJvdG9jb2wsICZiaW5hcnksICZsZW4sIE5VTEwpOworICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2JpbmFyeSAocHJvdG9jb2wsICZiaW5hcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlbiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKGJpbmFyeSA9PSBOVUxMKTsKKyAgZ19hc3NlcnQgKGxlbiA9PSAwKTsKICAgZ19mcmVlIChiaW5hcnkpOwogCiAgIHRyYW5zcG9ydF9yZWFkX2NvdW50ID0gMDsKICAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAwOwotICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9iaW5hcnkgKHByb3RvY29sLCAmYmluYXJ5LAorICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2JpbmFyeSAocHJvdG9jb2wsICZiaW5hcnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlbiwgTlVMTCkgPT0gLTEpOwogICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IC0xOwogCiAgIHRyYW5zcG9ydF9yZWFkX2NvdW50ID0gMDsKICAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAxOwotICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9iaW5hcnkgKHByb3RvY29sLCAmYmluYXJ5LAorICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2JpbmFyeSAocHJvdG9jb2wsICZiaW5hcnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlbiwgTlVMTCkgPT0gLTEpOwogICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IC0xOwogCiAgIHRyYW5zcG9ydF9yZWFkX2Vycm9yID0gMTsKLSAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfYm9vbCAocHJvdG9jb2wsCisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfYm9vbCAocHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZV9ib29sZWFuLCBOVUxMKSA9PSAtMSk7Ci0gIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLAorICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVfYnl0ZSwgTlVMTCkgPT0gLTEpOwotICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9pMTYgKHByb3RvY29sLAorICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2kxNiAocHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlXzE2LCBOVUxMKSA9PSAtMSk7Ci0gIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2kzMiAocHJvdG9jb2wsICZ2YWx1ZV8zMiwgTlVMTCkgPT0gLTEpOwotICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9pNjQgKHByb3RvY29sLCAmdmFsdWVfNjQsIE5VTEwpID09IC0xKTsKLSAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfZG91YmxlIChwcm90b2NvbCwKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9pMzIgKHByb3RvY29sLCAmdmFsdWVfMzIsIE5VTEwpID09IC0xKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9pNjQgKHByb3RvY29sLCAmdmFsdWVfNjQsIE5VTEwpID09IC0xKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9kb3VibGUgKHByb3RvY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZV9kb3VibGUsIE5VTEwpID09IC0xKTsKICAgdHJhbnNwb3J0X3JlYWRfZXJyb3IgPSAwOwogCkBAIC00OTYsNyArNjAyLDcgQEAKICAgdHJhbnNwb3J0ID0gVEhSSUZUX1NFUlZFUl9UUkFOU1BPUlQgKHRzb2NrZXQpOwogICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9saXN0ZW4gKHRyYW5zcG9ydCwgTlVMTCk7CiAgIGNsaWVudCA9IHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2FjY2VwdCAodHJhbnNwb3J0LCBOVUxMKTsKLSAgYXNzZXJ0IChjbGllbnQgIT0gTlVMTCk7CisgIGdfYXNzZXJ0IChjbGllbnQgIT0gTlVMTCk7CiAKICAgdGJwID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0wsICJ0cmFuc3BvcnQiLAogICAgICAgICAgICAgICAgICAgICAgIGNsaWVudCwgTlVMTCk7CkBAIC01MTEsNyArNjE3LDcgQEAKIAogICAvKiB0ZXN0IGZpcnN0IHJlYWQgZXJyb3Igb24gYSBmaWVsZCAqLwogICB0cmFuc3BvcnRfcmVhZF9lcnJvciA9IDE7Ci0gIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfbmFtZSwgJmZpZWxkX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfaWQsIE5VTEwpID09IC0xKTsKICAgdHJhbnNwb3J0X3JlYWRfZXJyb3IgPSAwOwpAQCAtNTIyLDcgKzYyOCw3IEBACiAgIC8qIHRlc3QgMm5kIHJlYWQgZmFpbHVyZSBvbiBhIGZpZWxkICovCiAgIHRyYW5zcG9ydF9yZWFkX2NvdW50ID0gMDsKICAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAxOwotICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsCisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX25hbWUsICZmaWVsZF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKSA9PSAtMSk7CiAgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gLTE7CkBAIC01MzgsNyArNjQ0LDcgQEAKICAgLyogdGVzdCByZWFkIGZhaWx1cmUgb24gYSBtYXAgKi8KICAgdHJhbnNwb3J0X3JlYWRfY291bnQgPSAwOwogICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IDA7Ci0gIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21hcF9iZWdpbiAocHJvdG9jb2wsCisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWFwX2JlZ2luIChwcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma2V5X3R5cGUsICZ2YWx1ZV90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplLCBOVUxMKSA9PSAtMSk7CiAgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gLTE7CkBAIC01NDYsNyArNjUyLDcgQEAKICAgLyogdGVzdCAybmQgcmVhZCBmYWlsdXJlIG9uIGEgbWFwICovCiAgIHRyYW5zcG9ydF9yZWFkX2NvdW50ID0gMDsKICAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAxOwotICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9tYXBfYmVnaW4gKHByb3RvY29sLAorICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21hcF9iZWdpbiAocHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleV90eXBlLCAmdmFsdWVfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSwgTlVMTCkgPT0gLTEpOwogICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IC0xOwpAQCAtNTU0LDcgKzY2MCw3IEBACiAgIC8qIHRlc3QgM3JkIHJlYWQgZmFpbHVyZSBvbiBhIG1hcCAqLwogICB0cmFuc3BvcnRfcmVhZF9jb3VudCA9IDA7CiAgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gMjsKLSAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWFwX2JlZ2luIChwcm90b2NvbCwKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9tYXBfYmVnaW4gKHByb3RvY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXlfdHlwZSwgJnZhbHVlX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUsIE5VTEwpID09IC0xKTsKICAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAtMTsKQEAgLTU2Nyw3ICs2NzMsNyBAQAogICB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZ2YWx1ZSwgTlVMTCk7CiAKICAgLyogdGVzdCBuZWdhdGl2ZSBtYXAgc2l6ZSAqLwotICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9tYXBfYmVnaW4gKHByb3RvY29sLAorICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21hcF9iZWdpbiAocHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleV90eXBlLCAmdmFsdWVfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSwgTlVMTCkgPT0gLTEpOwogCkBAIC01NzcsNyArNjgzLDcgQEAKIAogICAvKiB0ZXN0IHJlYWQgZmFpbHVyZSAqLwogICB0cmFuc3BvcnRfcmVhZF9lcnJvciA9IDE7Ci0gIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2xpc3RfYmVnaW4gKHByb3RvY29sLCAmZWxlbWVudF90eXBlLAorICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2xpc3RfYmVnaW4gKHByb3RvY29sLCAmZWxlbWVudF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSwgTlVMTCkgPT0gLTEpOwogICB0cmFuc3BvcnRfcmVhZF9lcnJvciA9IDA7CiAKQEAgLTU5OSwyMyArNzA1LDIzIEBACiAKICAgLyogYnJva2VuIHJlYWQgKi8KICAgdHJhbnNwb3J0X3JlYWRfZXJyb3IgPSAxOwotICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgJm1lc3NhZ2VfbmFtZSwKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgJm1lc3NhZ2VfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lc3NhZ2VfdHlwZSwgJnNlcWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA9PSAtMSk7CiAgIHRyYW5zcG9ydF9yZWFkX2Vycm9yID0gMDsKIAogICAvKiBpbnZhbGlkIHByb3RvY29sIHZlcnNpb24gKi8KLSAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICZtZXNzYWdlX25hbWUsCisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICZtZXNzYWdlX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZXNzYWdlX3R5cGUsICZzZXFpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPT0gLTEpOwogCiAgIC8qIHN6ID4gMCAqLwotICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgJm1lc3NhZ2VfbmFtZSwKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgJm1lc3NhZ2VfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lc3NhZ2VfdHlwZSwgJnNlcWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA+IDApOwogCiAgIC8qIHJlYWQgYSB2YWxpZCBtZXNzYWdlICovCi0gIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAmbWVzc2FnZV9uYW1lLAorICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAmbWVzc2FnZV9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVzc2FnZV90eXBlLCAmc2VxaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID4gMCk7CiAgIGdfZnJlZSAobWVzc2FnZV9uYW1lKTsKQEAgLTYyMyw3ICs3MjksNyBAQAogICAvKiBicm9rZW4gMm5kIHJlYWQgb24gYSBtZXNzYWdlICovCiAgIHRyYW5zcG9ydF9yZWFkX2NvdW50ID0gMDsKICAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAxOwotICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgJm1lc3NhZ2VfbmFtZSwKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgJm1lc3NhZ2VfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lc3NhZ2VfdHlwZSwgJnNlcWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA9PSAtMSk7CiAgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gLTE7CkBAIC02MzEsMTkgKzczNywxOSBAQAogICAvKiBicm9rZW4gM3JkIHJlYWQgb24gYSBtZXNzYWdlICovCiAgIHRyYW5zcG9ydF9yZWFkX2NvdW50ID0gMDsKICAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAzOyAvKiByZWFkX3N0cmluZyBkb2VzIHR3byByZWFkcyAqLwotICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgJm1lc3NhZ2VfbmFtZSwKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgJm1lc3NhZ2VfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lc3NhZ2VfdHlwZSwgJnNlcWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA9PSAtMSk7CiAgIGdfZnJlZSAobWVzc2FnZV9uYW1lKTsKICAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAtMTsKIAogICAvKiByZWFkIGEgdmFsaWQgbWVzc2FnZSAqLwotICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgJm1lc3NhZ2VfbmFtZSwKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgJm1lc3NhZ2VfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lc3NhZ2VfdHlwZSwgJnNlcWlkLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPiAwKTsKICAgZ19mcmVlIChtZXNzYWdlX25hbWUpOwogCi0gIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21lc3NhZ2VfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKIAogICAvKiBoYW5kbGUgMm5kIHdyaXRlIGZhaWx1cmUgb24gYSBtZXNzYWdlICovCiAgIHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9pMzIgKHByb3RvY29sLCAmdmVyc2lvbiwgTlVMTCk7CkBAIC02NTMsMjAgKzc1OSwxMDEgQEAKICAgdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX3N0cmluZyAocHJvdG9jb2wsICZtZXNzYWdlX25hbWUsIE5VTEwpOwogCiAgIGdfb2JqZWN0X3VucmVmIChjbGllbnQpOwotICAvLyBUT0RPOiBpbnZlc3RpZ2F0ZSBnX29iamVjdF91bnJlZiAodGJwKTsKKyAgLyogVE9ETzogaW52ZXN0aWdhdGUgZ19vYmplY3RfdW5yZWYgKHRicCk7ICovCisgIGdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKK30KKworc3RhdGljIHZvaWQKK3RocmlmdF9zZXJ2ZXJfbWFueV9mcmFtZXMgKGNvbnN0IGludCBwb3J0KQoreworICBUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgKnRyYW5zcG9ydCA9IE5VTEw7CisgIFRocmlmdFRyYW5zcG9ydCAqY2xpZW50ID0gTlVMTDsKKyAgVGhyaWZ0QmluYXJ5UHJvdG9jb2wgKnRicCA9IE5VTEw7CisgIFRocmlmdFByb3RvY29sICpwcm90b2NvbCA9IE5VTEw7CisgIFRocmlmdFNlcnZlclNvY2tldCAqdHNvY2tldCA9IE5VTEw7CisgIGdib29sZWFuIHZhbHVlX2Jvb2xlYW4gPSBGQUxTRTsKKyAgZ2ludDggdmFsdWVfYnl0ZSA9IDA7CisgIGdpbnQxNiB2YWx1ZV8xNiA9IDA7CisgIGdpbnQzMiB2YWx1ZV8zMiA9IDA7CisgIGdpbnQ2NCB2YWx1ZV82NCA9IDA7CisgIGdkb3VibGUgdmFsdWVfZG91YmxlID0gMDsKKyAgZ2NoYXIgKnN0cmluZyA9IE5VTEw7CisgIGdjaGFyICplbXB0eV9zdHJpbmcgPSBOVUxMOworICBncG9pbnRlciBiaW5hcnkgPSBOVUxMOworICBndWludDMyIGxlbiA9IDA7CisgIHZvaWQgKmNvbXBhcmF0b3IgPSAodm9pZCAqKSBURVNUX1NUUklORzsKKworICB0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TRVJWRVJfU09DS0VULCAicG9ydCIsIHBvcnQsIE5VTEwpOworICB0cmFuc3BvcnQgPSBUSFJJRlRfU0VSVkVSX1RSQU5TUE9SVCAodHNvY2tldCk7CisgIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2xpc3RlbiAodHJhbnNwb3J0LCBOVUxMKTsKKworICAvKiB3cmFwIHRoZSBjbGllbnQgaW4gYSBmcmFtZWQgdHJhbnNwb3J0ICovCisgIGNsaWVudCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfRlJBTUVEX1RSQU5TUE9SVCwgInRyYW5zcG9ydCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfYWNjZXB0ICh0cmFuc3BvcnQsIE5VTEwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJyX2J1Zl9zaXplIiwgMSwgTlVMTCk7CisgIGdfYXNzZXJ0IChjbGllbnQgIT0gTlVMTCk7CisKKyAgdGJwID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0wsICJ0cmFuc3BvcnQiLAorICAgICAgICAgICAgICAgICAgICAgIGNsaWVudCwgTlVMTCk7CisgIHByb3RvY29sID0gVEhSSUZUX1BST1RPQ09MICh0YnApOworCisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfYm9vbCAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZV9ib29sZWFuLCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmdmFsdWVfYnl0ZSwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9pMTYgKHByb3RvY29sLCAmdmFsdWVfMTYsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfaTMyIChwcm90b2NvbCwgJnZhbHVlXzMyLCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2k2NCAocHJvdG9jb2wsICZ2YWx1ZV82NCwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9kb3VibGUgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZV9kb3VibGUsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfc3RyaW5nIChwcm90b2NvbCwgJnN0cmluZywgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9zdHJpbmcgKHByb3RvY29sLCAmZW1wdHlfc3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfYmluYXJ5IChwcm90b2NvbCwgJmJpbmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGVuLCBOVUxMKSA+IDApOworCisgIGdfYXNzZXJ0ICh2YWx1ZV9ib29sZWFuID09IFRFU1RfQk9PTCk7CisgIGdfYXNzZXJ0ICh2YWx1ZV9ieXRlID09IFRFU1RfQllURSk7CisgIGdfYXNzZXJ0ICh2YWx1ZV8xNiA9PSBURVNUX0kxNik7CisgIGdfYXNzZXJ0ICh2YWx1ZV8zMiA9PSBURVNUX0kzMik7CisgIGdfYXNzZXJ0ICh2YWx1ZV82NCA9PSBURVNUX0k2NCk7CisgIGdfYXNzZXJ0ICh2YWx1ZV9kb3VibGUgPT0gVEVTVF9ET1VCTEUpOworICBnX2Fzc2VydCAoc3RyY21wIChURVNUX1NUUklORywgc3RyaW5nKSA9PSAwKTsKKyAgZ19hc3NlcnQgKHN0cmNtcCAoIiIsIGVtcHR5X3N0cmluZykgPT0gMCk7CisgIGdfYXNzZXJ0IChtZW1jbXAgKGNvbXBhcmF0b3IsIGJpbmFyeSwgbGVuKSA9PSAwKTsKKworICBnX2ZyZWUgKHN0cmluZyk7CisgIGdfZnJlZSAoZW1wdHlfc3RyaW5nKTsKKyAgZ19mcmVlIChiaW5hcnkpOworCisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfYmluYXJ5IChwcm90b2NvbCwgJmJpbmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGVuLCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAoYmluYXJ5ID09IE5VTEwpOworICBnX2Fzc2VydCAobGVuID09IDApOworICBnX2ZyZWUgKGJpbmFyeSk7CisKKyAgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2VuZCAoY2xpZW50LCBOVUxMKTsKKyAgdGhyaWZ0X3RyYW5zcG9ydF9jbG9zZSAoY2xpZW50LCBOVUxMKTsKKworICBnX29iamVjdF91bnJlZiAodGJwKTsKKyAgZ19vYmplY3RfdW5yZWYgKGNsaWVudCk7CiAgIGdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKIH0KIAogaW50CiBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCiB7CisjaWYgKCFHTElCX0NIRUNLX1ZFUlNJT04gKDIsIDM2LCAwKSkKICAgZ190eXBlX2luaXQoKTsKKyNlbmRpZgorCiAgIGdfdGVzdF9pbml0ICgmYXJnYywgJmFyZ3YsIE5VTEwpOwogCiAgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0YmluYXJ5cHJvdG9jb2wvQ3JlYXRlQW5kRGVzdHJveSIsIHRlc3RfY3JlYXRlX2FuZF9kZXN0cm95KTsKICAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RiaW5hcnlwcm90b2NvbC9Jbml0aWFsaXplIiwgdGVzdF9pbml0aWFsaXplKTsKICAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RiaW5hcnlwcm90b2NvbC9SZWFkQW5kV3JpdGVQcmltaXRpdmVzIiwgdGVzdF9yZWFkX2FuZF93cml0ZV9wcmltaXRpdmVzKTsKICAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RiaW5hcnlwcm90b2NvbC9SZWFkQW5kV3JpdGVDb21wbGV4VHlwZXMiLCB0ZXN0X3JlYWRfYW5kX3dyaXRlX2NvbXBsZXhfdHlwZXMpOworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdGJpbmFyeXByb3RvY29sL1JlYWRBbmRXcml0ZU1hbnlGcmFtZXMiLAorICAgICAgICAgICAgICAgICAgIHRlc3RfcmVhZF9hbmRfd3JpdGVfbWFueV9mcmFtZXMpOwogCiAgIHJldHVybiBnX3Rlc3RfcnVuICgpOwogfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi90ZXN0L3Rlc3RidWZmZXJlZHRyYW5zcG9ydC5jIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3RidWZmZXJlZHRyYW5zcG9ydC5jCmluZGV4IDdkOWM0NmQuLmQwMTgwNmQgMTAwNzU1Ci0tLSBhL2xpYi9jX2dsaWIvdGVzdC90ZXN0YnVmZmVyZWR0cmFuc3BvcnQuYworKysgYi9saWIvY19nbGliL3Rlc3QvdGVzdGJ1ZmZlcmVkdHJhbnNwb3J0LmMKQEAgLTE3LDkgKzE3LDkgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlIDxhc3NlcnQuaD4KICNpbmNsdWRlIDxuZXRkYi5oPgogI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CiAKICNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NvY2tldC5oPgpAQCAtMzAsMTAgKzMwLDggQEAKIAogI2luY2x1ZGUgIi4uL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0LmMiCiAKLXN0YXRpYyBjb25zdCBjaGFyIFRFU1RfQUREUkVTU1tdID0gImxvY2FsaG9zdCI7Ci1zdGF0aWMgY29uc3Qgc2hvcnQgVEVTVF9QT1JUID0gNjQ0NDQ7Ci0KIHN0YXRpYyB2b2lkIHRocmlmdF9zZXJ2ZXIgKGNvbnN0IGludCBwb3J0KTsKK3N0YXRpYyB2b2lkIHRocmlmdF9zb2NrZXRfc2VydmVyX29wZW4gKGNvbnN0IGludCBwb3J0LCBpbnQgdGltZXMpOwogCiAvKiB0ZXN0IG9iamVjdCBjcmVhdGlvbiBhbmQgZGVzdHJ1Y3Rpb24gKi8KIHN0YXRpYyB2b2lkCkBAIC00NSwxMCArNDMsMTAgQEAKIAogICBHT2JqZWN0ICpvYmplY3QgPSBOVUxMOwogICBvYmplY3QgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JVRkZFUkVEX1RSQU5TUE9SVCwgTlVMTCk7Ci0gIGFzc2VydCAob2JqZWN0ICE9IE5VTEwpOworICBnX2Fzc2VydCAob2JqZWN0ICE9IE5VTEwpOwogICBnX29iamVjdF9nZXQgKEdfT0JKRUNUIChvYmplY3QpLCAidHJhbnNwb3J0IiwgJnRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAicl9idWZfc2l6ZSIsICZyX2J1Zl9zaXplLAotICAgICAgICAgICAgICAgICJ3X2J1Zl9zaXplIiwgJndfYnVmX3NpemUsIE5VTEwpOworCQkicl9idWZfc2l6ZSIsICZyX2J1Zl9zaXplLAorCQkid19idWZfc2l6ZSIsICZ3X2J1Zl9zaXplLCBOVUxMKTsKICAgZ19vYmplY3RfdW5yZWYgKG9iamVjdCk7CiB9CiAKQEAgLTU4LDM1ICs1Niw1MiBAQAogICBUaHJpZnRTb2NrZXQgKnRzb2NrZXQgPSBOVUxMOwogICBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCA9IE5VTEw7CiAgIEdFcnJvciAqZXJyID0gTlVMTDsKKyAgcGlkX3QgcGlkOworICBpbnQgcG9ydCA9IDUxMTk5OworICBpbnQgc3RhdHVzOwogCi0gIC8qIGNyZWF0ZSBhIFRocmlmdFNvY2tldCAqLwotICB0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TT0NLRVQsICJob3N0bmFtZSIsICJsb2NhbGhvc3QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCIsIDUxMTg4LCBOVUxMKTsgCisgIHBpZCA9IGZvcmsgKCk7CisgIGdfYXNzZXJ0ICggcGlkID49IDAgKTsKIAotICAvKiBjcmVhdGUgYSBCdWZmZXJlZFRyYW5zcG9ydCB3cmFwcGVyIG9mIHRoZSBTb2NrZXQgKi8KLSAgdHJhbnNwb3J0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9CVUZGRVJFRF9UUkFOU1BPUlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgInRyYW5zcG9ydCIsIFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpLCBOVUxMKTsKKyAgaWYgKCBwaWQgPT0gMCApCisgICAgeworICAgICAgLyogY2hpbGQgbGlzdGVucyAqLworICAgICAgdGhyaWZ0X3NvY2tldF9zZXJ2ZXJfb3BlbiAocG9ydCwxKTsKKyAgICAgIGV4aXQgKDApOworICAgIH0gZWxzZSB7CisJLyogcGFyZW50IGNvbm5lY3RzLCB3YWl0IGEgYml0IGZvciB0aGUgc29ja2V0IHRvIGJlIGNyZWF0ZWQgKi8KKwlzbGVlcCAoMSk7CisJLyogY3JlYXRlIGEgVGhyaWZ0U29ja2V0ICovCisJdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwKKwkJCQkicG9ydCIsIHBvcnQsIE5VTEwpOwogCi0gIC8qIHRoaXMgc2hvdWxkbid0IHdvcmsgKi8KLSAgYXNzZXJ0ICh0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X29wZW4gKHRyYW5zcG9ydCwgTlVMTCkgPT0gRkFMU0UpOwotICBhc3NlcnQgKHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfaXNfb3BlbiAodHJhbnNwb3J0KSA9PSBUUlVFKTsKLSAgYXNzZXJ0ICh0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2Nsb3NlICh0cmFuc3BvcnQsIE5VTEwpID09IFRSVUUpOwotICBnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsKLSAgZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOworCS8qIGNyZWF0ZSBhIEJ1ZmZlcmVkVHJhbnNwb3J0IHdyYXBwZXIgb2YgdGhlIFNvY2tldCAqLworCXRyYW5zcG9ydCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JULAorCQkJCSAgInRyYW5zcG9ydCIsIFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpLCBOVUxMKTsKIAotICAvKiB0cnkgYW5kIHVuZGVybHlpbmcgc29ja2V0IGZhaWx1cmUgKi8KLSAgdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0LmJyb2tlbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworCS8qIHRoaXMgc2hvdWxkbid0IHdvcmsgKi8KKwlnX2Fzc2VydCAodGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9vcGVuICh0cmFuc3BvcnQsIE5VTEwpID09IFRSVUUpOworCWdfYXNzZXJ0ICh0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2lzX29wZW4gKHRyYW5zcG9ydCkgPT0gVFJVRSk7CisJZ19hc3NlcnQgKHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfY2xvc2UgKHRyYW5zcG9ydCwgTlVMTCkgPT0gVFJVRSk7CisJZ19vYmplY3RfdW5yZWYgKHRyYW5zcG9ydCk7CisJZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOwogCi0gIC8qIGNyZWF0ZSBhIEJ1ZmZlcmVkVHJhbnNwb3J0IHdyYXBwZXIgb2YgdGhlIFNvY2tldCAqLwotICB0cmFuc3BvcnQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JVRkZFUkVEX1RSQU5TUE9SVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJhbnNwb3J0IiwgVEhSSUZUX1RSQU5TUE9SVCAodHNvY2tldCksIE5VTEwpOworCS8qIHRyeSBhbmQgdW5kZXJseWluZyBzb2NrZXQgZmFpbHVyZSAqLworCXRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwgImhvc3RuYW1lIiwgImxvY2FsaG9zdC5icm9rZW4iLAorCQkJCU5VTEwpOwogCi0gIGFzc2VydCAodGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9vcGVuICh0cmFuc3BvcnQsICZlcnIpID09IEZBTFNFKTsKLSAgZ19vYmplY3RfdW5yZWYgKHRyYW5zcG9ydCk7Ci0gIGdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKLSAgZ19lcnJvcl9mcmVlIChlcnIpOwotICBlcnIgPSBOVUxMOworCS8qIGNyZWF0ZSBhIEJ1ZmZlcmVkVHJhbnNwb3J0IHdyYXBwZXIgb2YgdGhlIFNvY2tldCAqLworCXRyYW5zcG9ydCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JULAorCQkJCSAgInRyYW5zcG9ydCIsIFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpLCBOVUxMKTsKKworCWdfYXNzZXJ0ICh0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X29wZW4gKHRyYW5zcG9ydCwgJmVycikgPT0gRkFMU0UpOworCWdfb2JqZWN0X3VucmVmICh0cmFuc3BvcnQpOworCWdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKKwlnX2Vycm9yX2ZyZWUgKGVycik7CisJZXJyID0gTlVMTDsKKwlnX2Fzc2VydCAoIHdhaXQgKCZzdGF0dXMpID09IHBpZCApOworCWdfYXNzZXJ0ICggc3RhdHVzID09IDAgKTsKKyAgICB9CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC0xMDAsNjAgKzExNSw4MSBAQAogICBndWNoYXIgYnVmWzEwXSA9IFRFU1RfREFUQTsgLyogYSBidWZmZXIgKi8KIAogICBwaWQgPSBmb3JrICgpOwotICBhc3NlcnQgKCBwaWQgPj0gMCApOworICBnX2Fzc2VydCAoIHBpZCA+PSAwICk7CiAKICAgaWYgKCBwaWQgPT0gMCApCi0gIHsKLSAgICAvKiBjaGlsZCBsaXN0ZW5zICovCi0gICAgdGhyaWZ0X3NlcnZlciAocG9ydCk7Ci0gICAgZXhpdCAoMCk7Ci0gIH0gZWxzZSB7Ci0gICAgLyogcGFyZW50IGNvbm5lY3RzLCB3YWl0IGEgYml0IGZvciB0aGUgc29ja2V0IHRvIGJlIGNyZWF0ZWQgKi8KLSAgICBzbGVlcCAoMSk7CisgICAgeworICAgICAgLyogY2hpbGQgbGlzdGVucyAqLworICAgICAgdGhyaWZ0X3NlcnZlciAocG9ydCk7CisgICAgICBleGl0ICgwKTsKKyAgICB9IGVsc2UgeworCS8qIHBhcmVudCBjb25uZWN0cywgd2FpdCBhIGJpdCBmb3IgdGhlIHNvY2tldCB0byBiZSBjcmVhdGVkICovCisJc2xlZXAgKDEpOwogCi0gICAgdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCIsIHBvcnQsIE5VTEwpOwotICAgIHRyYW5zcG9ydCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRyYW5zcG9ydCIsIFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndfYnVmX3NpemUiLCA0LCBOVUxMKTsKKwl0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TT0NLRVQsICJob3N0bmFtZSIsICJsb2NhbGhvc3QiLAorCQkJCSJwb3J0IiwgcG9ydCwgTlVMTCk7CisJdHJhbnNwb3J0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9CVUZGRVJFRF9UUkFOU1BPUlQsCisJCQkJICAidHJhbnNwb3J0IiwgVEhSSUZUX1RSQU5TUE9SVCAodHNvY2tldCksCisJCQkJICAid19idWZfc2l6ZSIsIDQsIE5VTEwpOwogCi0gICAgYXNzZXJ0ICh0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X29wZW4gKHRyYW5zcG9ydCwgTlVMTCkgPT0gVFJVRSk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2lzX29wZW4gKHRyYW5zcG9ydCkpOworCWdfYXNzZXJ0ICh0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X29wZW4gKHRyYW5zcG9ydCwgTlVMTCkgPT0gVFJVRSk7CisJZ19hc3NlcnQgKHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfaXNfb3BlbiAodHJhbnNwb3J0KSk7CiAKLSAgICAvKiB3cml0ZSAxMCBieXRlcyAqLwotICAgIHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxMCwgTlVMTCk7CisJLyogd3JpdGUgMTAgYnl0ZXMgKi8KKwl0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMTAsIE5VTEwpOwogCi0gICAgLyogd3JpdGUgMSBieXRlIGF0IGEgdGltZSAqLwotICAgIHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxLCBOVUxMKTsKLSAgICB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMSwgTlVMTCk7Ci0gICAgdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEsIE5VTEwpOworCS8qIHdyaXRlIDEgYnl0ZSBhdCBhIHRpbWUgKi8KKwl0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMSwgTlVMTCk7CisJdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEsIE5VTEwpOworCXRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxLCBOVUxMKTsKIAotICAgIC8qIG92ZXJmbG93IHRoZSBidWZmZXIgKi8KLSAgICB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMiwgTlVMTCk7Ci0gICAgdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEsIE5VTEwpOwotICAgIHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisJLyogb3ZlcmZsb3cgdGhlIGJ1ZmZlciAqLworCXRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAyLCBOVUxMKTsKKwl0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMSwgTlVMTCk7CisJdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKIAotICAgIC8qIHdyaXRlIDEgYnl0ZSBhbmQgZmx1c2ggKi8KLSAgICB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMSwgTlVMTCk7Ci0gICAgdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKwkvKiB3cml0ZSAxIGJ5dGUgYW5kIGZsdXNoICovCisJdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEsIE5VTEwpOworCXRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CiAKLSAgICAvKiB3cml0ZSBhbmQgb3ZlcmZsb3cgYnVmZmVyIHdpdGggMiBzeXN0ZW0gY2FsbHMgKi8KLSAgICB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMSwgTlVMTCk7Ci0gICAgdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDMsIE5VTEwpOworCS8qIHdyaXRlIGFuZCBvdmVyZmxvdyBidWZmZXIgd2l0aCAyIHN5c3RlbSBjYWxscyAqLworCXRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxLCBOVUxMKTsKKwl0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMywgTlVMTCk7CiAKLSAgICAvKiB3cml0ZSAxMCBieXRlcyAqLwotICAgIHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxMCwgTlVMTCk7CisJLyogd3JpdGUgMTAgYnl0ZXMgKi8KKwl0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMTAsIE5VTEwpOwogCi0gICAgdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZV9lbmQgKHRyYW5zcG9ydCwgTlVMTCk7Ci0gICAgdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKLSAgICB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2Nsb3NlICh0cmFuc3BvcnQsIE5VTEwpOworCXRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGVfZW5kICh0cmFuc3BvcnQsIE5VTEwpOworCXRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisJdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9jbG9zZSAodHJhbnNwb3J0LCBOVUxMKTsKIAotICAgIGdfb2JqZWN0X3VucmVmICh0cmFuc3BvcnQpOwotICAgIGdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKKwlnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsKKwlnX29iamVjdF91bnJlZiAodHNvY2tldCk7CiAKLSAgICBhc3NlcnQgKCB3YWl0ICgmc3RhdHVzKSA9PSBwaWQgKTsKLSAgICBhc3NlcnQgKCBzdGF0dXMgPT0gMCApOworCWdfYXNzZXJ0ICggd2FpdCAoJnN0YXR1cykgPT0gcGlkICk7CisJZ19hc3NlcnQgKCBzdGF0dXMgPT0gMCApOworICAgIH0KK30KKworCitzdGF0aWMgdm9pZAordGhyaWZ0X3NvY2tldF9zZXJ2ZXJfb3BlbiAoY29uc3QgaW50IHBvcnQsIGludCB0aW1lcykKK3sKKyAgVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBOVUxMOworICBUaHJpZnRUcmFuc3BvcnQgKmNsaWVudCA9IE5VTEw7CisgIGludCBpOworICBUaHJpZnRTZXJ2ZXJTb2NrZXQgKnRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NFUlZFUl9TT0NLRVQsCisJCQkJCSAgICAgICJwb3J0IiwgcG9ydCwgTlVMTCk7CisKKyAgdHJhbnNwb3J0ID0gVEhSSUZUX1NFUlZFUl9UUkFOU1BPUlQgKHRzb2NrZXQpOworICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9saXN0ZW4gKHRyYW5zcG9ydCwgTlVMTCk7CisgIGZvcihpPTA7aTx0aW1lcztpKyspeworICAgICAgY2xpZW50ID0gdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfYWNjZXB0ICh0cmFuc3BvcnQsIE5VTEwpOworICAgICAgZ19hc3NlcnQgKGNsaWVudCAhPSBOVUxMKTsKKyAgICAgIHRocmlmdF9zb2NrZXRfY2xvc2UgKGNsaWVudCwgTlVMTCk7CisgICAgICBnX29iamVjdF91bnJlZiAoY2xpZW50KTsKICAgfQorICBnX29iamVjdF91bnJlZiAodHNvY2tldCk7CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC0xNjYsMjEgKzIwMiwyMSBAQAogICBndWNoYXIgbWF0Y2hbMTBdID0gVEVTVF9EQVRBOwogCiAgIFRocmlmdFNlcnZlclNvY2tldCAqdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU0VSVkVSX1NPQ0tFVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCIsIHBvcnQsIE5VTEwpOworCQkJCQkgICAgICAicG9ydCIsIHBvcnQsIE5VTEwpOwogCiAgIHRyYW5zcG9ydCA9IFRIUklGVF9TRVJWRVJfVFJBTlNQT1JUICh0c29ja2V0KTsKICAgdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfbGlzdGVuICh0cmFuc3BvcnQsIE5VTEwpOwogCiAgIC8qIHdyYXAgdGhlIGNsaWVudCBpbiBhIEJ1ZmZlcmVkVHJhbnNwb3J0ICovCiAgIGNsaWVudCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JULCAidHJhbnNwb3J0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9hY2NlcHQgKHRyYW5zcG9ydCwgTlVMTCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgInJfYnVmX3NpemUiLCA1LCBOVUxMKTsKLSAgYXNzZXJ0IChjbGllbnQgIT0gTlVMTCk7CisJCQkgdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfYWNjZXB0ICh0cmFuc3BvcnQsIE5VTEwpLAorCQkJICJyX2J1Zl9zaXplIiwgNSwgTlVMTCk7CisgIGdfYXNzZXJ0IChjbGllbnQgIT0gTlVMTCk7CiAKICAgLyogcmVhZCAxMCBieXRlcyAqLwogICBieXRlcyA9IHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfcmVhZCAoY2xpZW50LCBidWYsIDEwLCBOVUxMKTsKLSAgYXNzZXJ0IChieXRlcyA9PSAxMCk7IC8qIG1ha2Ugc3VyZSB3ZSd2ZSByZWFkIDEwIGJ5dGVzICovCi0gIGFzc2VydCAoIG1lbWNtcCAoYnVmLCBtYXRjaCwgMTApID09IDAgKTsgLyogbWFrZSBzdXJlIHdoYXQgd2UgZ290IG1hdGNoZXMgKi8KKyAgZ19hc3NlcnQgKGJ5dGVzID09IDEwKTsgLyogbWFrZSBzdXJlIHdlJ3ZlIHJlYWQgMTAgYnl0ZXMgKi8KKyAgZ19hc3NlcnQgKCBtZW1jbXAgKGJ1ZiwgbWF0Y2gsIDEwKSA9PSAwICk7IC8qIG1ha2Ugc3VyZSB3aGF0IHdlIGdvdCBtYXRjaGVzICovCiAKICAgLyogcmVhZCAxIGJ5dGUgKi8KICAgYnl0ZXMgPSB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3JlYWQgKGNsaWVudCwgYnVmLCAxLCBOVUxMKTsKQEAgLTIwOSw3MSArMjQ1LDc0IEBACiAgIHNpZ25hbChTSUdQSVBFLCBTSUdfSUdOKTsKIAogICBwaWQgPSBmb3JrICgpOwotICBhc3NlcnQgKCBwaWQgPj0gMCApOworICBnX2Fzc2VydCAoIHBpZCA+PSAwICk7CiAKICAgaWYgKCBwaWQgPT0gMCApCi0gIHsKLSAgICAvKiBjaGlsZCBsaXN0ZW5zICovCi0gICAgVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBOVUxMOwotICAgIFRocmlmdFRyYW5zcG9ydCAqY2xpZW50ID0gTlVMTDsKKyAgICB7CisgICAgICAvKiBjaGlsZCBsaXN0ZW5zICovCisgICAgICBUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgKnRyYW5zcG9ydCA9IE5VTEw7CisgICAgICBUaHJpZnRUcmFuc3BvcnQgKmNsaWVudCA9IE5VTEw7CiAKLSAgICBUaHJpZnRTZXJ2ZXJTb2NrZXQgKnRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NFUlZFUl9TT0NLRVQsCi0gICAgICAgICJwb3J0IiwgcG9ydCwgTlVMTCk7CisgICAgICBUaHJpZnRTZXJ2ZXJTb2NrZXQgKnRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NFUlZFUl9TT0NLRVQsCisJCQkJCQkgICJwb3J0IiwgcG9ydCwgTlVMTCk7CiAKLSAgICB0cmFuc3BvcnQgPSBUSFJJRlRfU0VSVkVSX1RSQU5TUE9SVCAodHNvY2tldCk7Ci0gICAgdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfbGlzdGVuICh0cmFuc3BvcnQsIE5VTEwpOworICAgICAgdHJhbnNwb3J0ID0gVEhSSUZUX1NFUlZFUl9UUkFOU1BPUlQgKHRzb2NrZXQpOworICAgICAgdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfbGlzdGVuICh0cmFuc3BvcnQsIE5VTEwpOwogCi0gICAgLyogd3JhcCB0aGUgY2xpZW50IGluIGEgQnVmZmVyZWRUcmFuc3BvcnQgKi8KLSAgICBjbGllbnQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JVRkZFUkVEX1RSQU5TUE9SVCwgInRyYW5zcG9ydCIsCi0gICAgICAgIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2FjY2VwdCAodHJhbnNwb3J0LCBOVUxMKSwKLSAgICAgICAgInJfYnVmX3NpemUiLCA1LCBOVUxMKTsKLSAgICBhc3NlcnQgKGNsaWVudCAhPSBOVUxMKTsKKyAgICAgIC8qIHdyYXAgdGhlIGNsaWVudCBpbiBhIEJ1ZmZlcmVkVHJhbnNwb3J0ICovCisgICAgICBjbGllbnQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JVRkZFUkVEX1RSQU5TUE9SVCwgInRyYW5zcG9ydCIsCisJCQkgICAgIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2FjY2VwdCAodHJhbnNwb3J0LCBOVUxMKSwKKwkJCSAgICAgInJfYnVmX3NpemUiLCA1LCBOVUxMKTsKKyAgICAgIGdfYXNzZXJ0IChjbGllbnQgIT0gTlVMTCk7CiAKLSAgICAvKiBqdXN0IGNsb3NlIHNvY2tldCAqLwotICAgIHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfY2xvc2UgKGNsaWVudCwgTlVMTCk7Ci0gICAgZ19vYmplY3RfdW5yZWYgKGNsaWVudCk7Ci0gICAgZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOwotICAgIGV4aXQgKDApOwotICB9IGVsc2UgewotICAgIC8qIHBhcmVudCBjb25uZWN0cywgd2FpdCBhIGJpdCBmb3IgdGhlIHNvY2tldCB0byBiZSBjcmVhdGVkICovCi0gICAgc2xlZXAgKDEpOworICAgICAgLyoganVzdCBjbG9zZSBzb2NrZXQgKi8KKyAgICAgIHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfY2xvc2UgKGNsaWVudCwgTlVMTCk7CisgICAgICBnX29iamVjdF91bnJlZiAoY2xpZW50KTsKKyAgICAgIGdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKKyAgICAgIGV4aXQgKDApOworICAgIH0gZWxzZSB7CisJLyogcGFyZW50IGNvbm5lY3RzLCB3YWl0IGEgYml0IGZvciB0aGUgc29ja2V0IHRvIGJlIGNyZWF0ZWQgKi8KKwlzbGVlcCAoMSk7CiAKLSAgICB0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TT0NLRVQsICJob3N0bmFtZSIsICJsb2NhbGhvc3QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3J0IiwgcG9ydCwgTlVMTCk7Ci0gICAgdHJhbnNwb3J0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9CVUZGRVJFRF9UUkFOU1BPUlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJhbnNwb3J0IiwgVEhSSUZUX1RSQU5TUE9SVCAodHNvY2tldCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid19idWZfc2l6ZSIsIDQsIE5VTEwpOworCXRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwgImhvc3RuYW1lIiwgImxvY2FsaG9zdCIsCisJCQkJInBvcnQiLCBwb3J0LCBOVUxMKTsKKwl0cmFuc3BvcnQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JVRkZFUkVEX1RSQU5TUE9SVCwKKwkJCQkgICJ0cmFuc3BvcnQiLCBUSFJJRlRfVFJBTlNQT1JUICh0c29ja2V0KSwKKwkJCQkgICJ3X2J1Zl9zaXplIiwgNCwgTlVMTCk7CiAKIAotICAgIGFzc2VydCAodGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9vcGVuICh0cmFuc3BvcnQsIE5VTEwpID09IFRSVUUpOwotICAgIGFzc2VydCAodGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9pc19vcGVuICh0cmFuc3BvcnQpKTsKKwlnX2Fzc2VydCAodGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9vcGVuICh0cmFuc3BvcnQsIE5VTEwpID09IFRSVUUpOworCWdfYXNzZXJ0ICh0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2lzX29wZW4gKHRyYW5zcG9ydCkpOwogCi0gICAgLyogcmVjb2duaXplIGRpc2Nvbm5lY3Rpb24gKi8KLSAgICBzbGVlcCgxKTsKLSAgICBhc3NlcnQgKHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxMCwgTlVMTCkgPT0gVFJVRSk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMTAsIE5VTEwpID09IEZBTFNFKTsKKwkvKiByZWNvZ25pemUgZGlzY29ubmVjdGlvbiAqLworCXNsZWVwKDEpOworCWdfYXNzZXJ0ICh0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMTAsIE5VTEwpID09IFRSVUUpOworCWdfYXNzZXJ0ICh0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMTAsIE5VTEwpID09IEZBTFNFKTsKIAotICAgIC8qIHdyaXRlIGFuZCBvdmVyZmxvdyBidWZmZXIgKi8KLSAgICBhc3NlcnQgKHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxMCwgTlVMTCkgPT0gRkFMU0UpOworCS8qIHdyaXRlIGFuZCBvdmVyZmxvdyBidWZmZXIgKi8KKwlnX2Fzc2VydCAodGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEwLCBOVUxMKSA9PSBGQUxTRSk7CiAKLSAgICAvKiB3cml0ZSAxIGFuZCBmbHVzaCAqLwotICAgIGFzc2VydCAodGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEsIE5VTEwpID09IFRSVUUpOwotICAgIGFzc2VydCAodGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKSA9PSBGQUxTRSk7CisJLyogd3JpdGUgMSBhbmQgZmx1c2ggKi8KKwlnX2Fzc2VydCAodGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEsIE5VTEwpID09IFRSVUUpOworCWdfYXNzZXJ0ICh0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpID09IEZBTFNFKTsKIAotICAgIHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfY2xvc2UgKHRyYW5zcG9ydCwgTlVMTCk7CisJdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9jbG9zZSAodHJhbnNwb3J0LCBOVUxMKTsKIAotICAgIGdfb2JqZWN0X3VucmVmICh0cmFuc3BvcnQpOwotICAgIGdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKKwlnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsKKwlnX29iamVjdF91bnJlZiAodHNvY2tldCk7CiAKLSAgICBhc3NlcnQgKCB3YWl0ICgmc3RhdHVzKSA9PSBwaWQgKTsKLSAgICBhc3NlcnQgKCBzdGF0dXMgPT0gMCApOwotICB9CisJZ19hc3NlcnQgKCB3YWl0ICgmc3RhdHVzKSA9PSBwaWQgKTsKKwlnX2Fzc2VydCAoIHN0YXR1cyA9PSAwICk7CisgICAgfQogfQogCiBpbnQKIG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKIHsKKyNpZiAoIUdMSUJfQ0hFQ0tfVkVSU0lPTiAoMiwgMzYsIDApKQogICBnX3R5cGVfaW5pdCgpOworI2VuZGlmCisKICAgZ190ZXN0X2luaXQgKCZhcmdjLCAmYXJndiwgTlVMTCk7CiAKICAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RidWZmZXJlZHRyYW5zcG9ydC9DcmVhdGVBbmREZXN0cm95IiwgdGVzdF9jcmVhdGVfYW5kX2Rlc3Ryb3kpOwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi90ZXN0L3Rlc3Rjb21wYWN0cHJvdG9jb2wuYyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0Y29tcGFjdHByb3RvY29sLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTVhZDQ5MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0Y29tcGFjdHByb3RvY29sLmMKQEAgLTAsMCArMSwxMjkzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qIERpc2FibGUgc3RyaW5nLWZ1bmN0aW9uIG9wdGltaXphdGlvbnMgd2hlbiBnbGliYyBpcyB1c2VkLCBhcyB0aGVzZSBwcm9kdWNlCisgICBjb21waWxlciB3YXJuaW5ncyBhYm91dCBzdHJpbmcgbGVuZ3RoIHdoZW4gYSBzdHJpbmcgZnVuY3Rpb24gaXMgdXNlZCBpbnNpZGUKKyAgIGEgY2FsbCB0byBnX2Fzc2VydCAoKSAqLworI2lmICFkZWZpbmVkKF9fQVBQTEVfXykgJiYgIWRlZmluZWQoX19GcmVlQlNEX18pICYmIFwKKyAgICAhZGVmaW5lZChfX09wZW5CU0RfXykgJiYgIWRlZmluZWQoX19OZXRCU0RfXykKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorI2VuZGlmCisKKyNpZmRlZiBfX0dMSUJDX18KKyNkZWZpbmUgX19OT19TVFJJTkdfSU5MSU5FUyAxCisjZW5kaWYKKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+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+PSwgMCk7CisKKyAgaWYgKHBpZCA9PSAwKSB7ICAgIC8qIFRoZSBjaGlsZCBwcm9jZXNzICovCisgICAgLyogV2FpdCBhIG1vbWVudCBmb3IgdGhlIHNlcnZlciB0byBmaW5pc2ggc3RhcnRpbmcgKi8KKyAgICBzbGVlcCAoMSk7CisKKyAgICBnX3Rlc3RfaW5pdCAoJmFyZ2MsICZhcmd2LCBOVUxMKTsKKworICAgIGdfdGVzdF9hZGRfZnVuYworICAgICAgKCIvdGVzdGNvbnRhaW5lcnRlc3QvQ29udGFpbmVyVGVzdC9TdHJ1Y3RzL0NvbnRhaW5lcnNXaXRoRGVmYXVsdFZhbHVlcyIsCisgICAgICAgdGVzdF9jb250YWluZXJzX3dpdGhfZGVmYXVsdF92YWx1ZXMpOworICAgIGdfdGVzdF9hZGRfZnVuYworICAgICAgKCIvdGVzdGNvbnRhaW5lcnRlc3QvQ29udGFpbmVyVGVzdC9TZXJ2aWNlcy9Db250YWluZXJTZXJ2aWNlL1N0cmluZ0xpc3QiLAorICAgICAgIHRlc3RfY29udGFpbmVyX3NlcnZpY2Vfc3RyaW5nX2xpc3QpOworICAgIGdfdGVzdF9hZGRfZnVuYworICAgICAgKCIvdGVzdGNvbnRhaW5lcnRlc3QvQ29udGFpbmVyVGVzdC9TZXJ2aWNlcy9Db250YWluZXJTZXJ2aWNlL0xpc3RTdHJpbmdMaXN0IiwKKyAgICAgICB0ZXN0X2NvbnRhaW5lcl9zZXJ2aWNlX2xpc3Rfc3RyaW5nX2xpc3QpOworICAgIGdfdGVzdF9hZGRfZnVuYworICAgICAgKCIvdGVzdGNvbnRhaW5lcnRlc3QvQ29udGFpbmVyVGVzdC9TZXJ2aWNlcy9Db250YWluZXJTZXJ2aWNlL1R5cGVkZWZkTGlzdFN0cmluZ0xpc3QiLAorICAgICAgIHRlc3RfY29udGFpbmVyX3NlcnZpY2VfdHlwZWRlZmRfbGlzdF9zdHJpbmdfbGlzdCk7CisKKyAgICAvKiBSdW4gdGhlIHRlc3RzIGFuZCBtYWtlIHRoZSByZXN1bHQgYXZhaWxhYmxlIHRvIG91ciBwYXJlbnQgcHJvY2VzcyAqLworICAgIF9leGl0IChnX3Rlc3RfcnVuICgpKTsKKyAgfQorICBlbHNlIHsKKyAgICBUVGVzdENvbnRhaW5lclNlcnZpY2VIYW5kbGVyICpoYW5kbGVyOworICAgIFRUZXN0Q29udGFpbmVyU2VydmljZVByb2Nlc3NvciAqcHJvY2Vzc29yOworCisgICAgVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICpzZXJ2ZXJfdHJhbnNwb3J0OworICAgIFRocmlmdFRyYW5zcG9ydEZhY3RvcnkgKnRyYW5zcG9ydF9mYWN0b3J5OworICAgIFRocmlmdFByb3RvY29sRmFjdG9yeSAqcHJvdG9jb2xfZmFjdG9yeTsKKworICAgIHN0cnVjdCBzaWdhY3Rpb24gc2lnY2hsZF9hY3Rpb247CisKKyAgICBHRXJyb3IgKmVycm9yID0gTlVMTDsKKyAgICBpbnQgZXhpdF9zdGF0dXMgPSAxOworCisgICAgLyogVHJhcCB0aGUgZXZlbnQgb2YgdGhlIGNoaWxkIHByb2Nlc3MgdGVybWluYXRpbmcgc28gd2Uga25vdyB0byBzdG9wIHRoZQorICAgICAgIHNlcnZlciBhbmQgZXhpdCAqLworICAgIG1lbXNldCAoJnNpZ2NobGRfYWN0aW9uLCAwLCBzaXplb2YgKHNpZ2NobGRfYWN0aW9uKSk7CisgICAgc2lnY2hsZF9hY3Rpb24uc2FfaGFuZGxlciA9IHNpZ2NobGRfaGFuZGxlcjsKKyAgICBzaWdjaGxkX2FjdGlvbi5zYV9mbGFncyA9IFNBX1JFU0VUSEFORDsKKyAgICBzaWdhY3Rpb24gKFNJR0NITEQsICZzaWdjaGxkX2FjdGlvbiwgTlVMTCk7CisKKyAgICAvKiBDcmVhdGUgb3VyIHRlc3Qgc2VydmVyICovCisgICAgaGFuZGxlciA9IGdfb2JqZWN0X25ldyAoVFlQRV9URVNUX0NPTlRBSU5FUl9TRVJWSUNFX0hBTkRMRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgcHJvY2Vzc29yID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9DT05UQUlORVJfU0VSVklDRV9QUk9DRVNTT1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGFuZGxlciIsIGhhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICBzZXJ2ZXJfdHJhbnNwb3J0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TRVJWRVJfU09DS0VULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3J0IiwgVEVTVF9TRVJWRVJfUE9SVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICB0cmFuc3BvcnRfZmFjdG9yeSA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JUX0ZBQ1RPUlksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgIHByb3RvY29sX2ZhY3RvcnkgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTF9GQUNUT1JZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworCisgICAgc2VydmVyID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TSU1QTEVfU0VSVkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgInByb2Nlc3NvciIsICAgICAgICAgICAgICAgIHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXJ2ZXJfdHJhbnNwb3J0IiwgICAgICAgICBzZXJ2ZXJfdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgImlucHV0X3RyYW5zcG9ydF9mYWN0b3J5IiwgIHRyYW5zcG9ydF9mYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIm91dHB1dF90cmFuc3BvcnRfZmFjdG9yeSIsIHRyYW5zcG9ydF9mYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgImlucHV0X3Byb3RvY29sX2ZhY3RvcnkiLCAgIHByb3RvY29sX2ZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAib3V0cHV0X3Byb3RvY29sX2ZhY3RvcnkiLCAgcHJvdG9jb2xfZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworCisgICAgLyogU3RhcnQgdGhlIHNlcnZlciAqLworICAgIHRocmlmdF9zZXJ2ZXJfc2VydmUgKHNlcnZlciwgJmVycm9yKTsKKworICAgIC8qIE1ha2Ugc3VyZSB0aGUgc2VydmVyIHN0b3BwZWQgb25seSBiZWNhdXNlIGl0IHdhcyBpbnRlcnJ1cHRlZCAoYnkgdGhlCisgICAgICAgY2hpbGQgcHJvY2VzcyB0ZXJtaW5hdGluZykgKi8KKyAgICBnX2Fzc2VydCghZXJyb3IgfHwgZ19lcnJvcl9tYXRjaGVzKGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX1NFUlZFUl9TT0NLRVRfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSFJJRlRfU0VSVkVSX1NPQ0tFVF9FUlJPUl9BQ0NFUFQpKTsKKworICAgIC8qIEZyZWUgb3VyIHJlc291cmNlcyAqLworICAgIGdfY2xlYXJfb2JqZWN0ICgmc2VydmVyKTsKKyAgICBnX2NsZWFyX29iamVjdCAoJnByb3RvY29sX2ZhY3RvcnkpOworICAgIGdfY2xlYXJfb2JqZWN0ICgmdHJhbnNwb3J0X2ZhY3RvcnkpOworICAgIGdfY2xlYXJfb2JqZWN0ICgmc2VydmVyX3RyYW5zcG9ydCk7CisgICAgZ19jbGVhcl9vYmplY3QgKCZwcm9jZXNzb3IpOworICAgIGdfY2xlYXJfb2JqZWN0ICgmaGFuZGxlcik7CisKKyAgICAvKiBXYWl0IGZvciB0aGUgY2hpbGQgcHJvY2VzcyB0byBjb21wbGV0ZSBhbmQgcmV0dXJuIGl0cyBleGl0IHN0YXR1cyAqLworICAgIGdfYXNzZXJ0ICh3YWl0ICgmc3RhdHVzKSA9PSBwaWQpOworICAgIGlmIChXSUZFWElURUQgKHN0YXR1cykpCisgICAgICBleGl0X3N0YXR1cyA9IFdFWElUU1RBVFVTIChzdGF0dXMpOworCisgICAgcmV0dXJuIGV4aXRfc3RhdHVzOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3Rlc3QvdGVzdGRlYnVncHJvdG8uYyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0ZGVidWdwcm90by5jCmluZGV4IGUzNDNjMWUuLjEwOWE0OGIgMTAwNjQ0Ci0tLSBhL2xpYi9jX2dsaWIvdGVzdC90ZXN0ZGVidWdwcm90by5jCisrKyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0ZGVidWdwcm90by5jCkBAIC0xNyw3ICsxNyw2IEBACiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+CiAjaW5jbHVkZSA8bWF0aC5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CkBAIC0xNDYsNyArMTQ1LDcgQEAKIAogICBnX2Fzc2VydF9jbXBpbnQgKGFfYml0ZSwgICAgPT0sIDB4N2YpOwogICBnX2Fzc2VydF9jbXBpbnQgKGludGVnZXIxNiwgPT0sIDB4N2ZmZik7Ci0gIGdfYXNzZXJ0X2NtcGludCAoaW50ZWdlcjY0LCA9PSwgMTAwMDAwMDAwMDApOworICBnX2Fzc2VydF9jbXBpbnQgKGludGVnZXI2NCwgPT0sIEdfR0lOVDY0X0NPTlNUQU5UICgxMDAwMDAwMDAwMCkpOwogCiAgIGdfYXNzZXJ0IChieXRlX2xpc3QgIT0gTlVMTCk7CiAgIGdfYXNzZXJ0X2NtcGludCAoYnl0ZV9saXN0LT5sZW4sID09LCAzKTsKQEAgLTE3OSw4ICsxNzgsMTEgQEAKICAgc3RhdGljIGNvbnN0IGdpbnQxNiBpbml0aWFsX2kxNl9saXN0WzVdID0geyA0MTgxLCA2NzY1LCAxMDk0NiwgMTc3MTEsIDI4NjU3IH07CiAgIHN0YXRpYyBjb25zdCBnaW50NjQgaW5pdGlhbF9pNjRfbGlzdFs1XSA9CiAgICAgewotICAgICAgMTEwMDA4Nzc3ODM2NjEwMTkzMSwgMTc3OTk3OTQxNjAwNDcxNDE4OSwgMjg4MDA2NzE5NDM3MDgxNjEyMCwKLSAgICAgIDQ2NjAwNDY2MTAzNzU1MzAzMDksIDc1NDAxMTM4MDQ3NDYzNDY0MjkKKyAgICAgIEdfR0lOVDY0X0NPTlNUQU5UICgxMTAwMDg3Nzc4MzY2MTAxOTMxKSwKKyAgICAgIEdfR0lOVDY0X0NPTlNUQU5UICgxNzc5OTc5NDE2MDA0NzE0MTg5KSwKKyAgICAgIEdfR0lOVDY0X0NPTlNUQU5UICgyODgwMDY3MTk0MzcwODE2MTIwKSwKKyAgICAgIEdfR0lOVDY0X0NPTlNUQU5UICg0NjYwMDQ2NjEwMzc1NTMwMzA5KSwKKyAgICAgIEdfR0lOVDY0X0NPTlNUQU5UICg3NTQwMTEzODA0NzQ2MzQ2NDI5KQogICAgIH07CiAgIHN0YXRpYyBjb25zdCBndWludDggaW5pdGlhbF9iYXNlNjRbOF0gPQogICAgIHsKQEAgLTIxNiwyMiArMjE4LDIzIEBACiAgIGdfYXJyYXlfYXBwZW5kX3ZhbHMgKGk2NF9saXN0LCBpbml0aWFsX2k2NF9saXN0LCA1KTsKIAogICAvKiBBbGwgb2YgT25lT2ZFYWNoJ3MgcHJvcGVydGllcyBjYW4gYmUgc2V0IGF0IGNvbnN0cnVjdGlvbi4uLiAqLwotICBvbmVfb2ZfZWFjaCA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfT05FX09GX0VBQ0gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW1fdHJ1ZSIsICAgICAgICAgIFRSVUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW1fZmFsc2UiLCAgICAgICAgIEZBTFNFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFfYml0ZSIsICAgICAgICAgICAweDUwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludGVnZXIxNiIsICAgICAgICAweDdlNTcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW50ZWdlcjMyIiwgICAgICAgIDB4ZGVhZGJlZWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW50ZWdlcjY0IiwgICAgICAgIDB4ZmExNWVmYWNhZGUxNWJhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkb3VibGVfcHJlY2lzaW9uIiwgTV9QSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb21lX2NoYXJhY3RlcnMiLCAgIkRlYnVnIFRISVMhIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ6b21nX3VuaWNvZGUiLCAgICAgIlx4ZDdcblxhXHQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndoYXRfd2hvIiwgICAgICAgICBUUlVFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhc2U2NCIsICAgICAgICAgICBiYXNlNjQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnl0ZV9saXN0IiwgICAgICAgIGJ5dGVfbGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpMTZfbGlzdCIsICAgICAgICAgaTE2X2xpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaTY0X2xpc3QiLCAgICAgICAgIGk2NF9saXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgIG9uZV9vZl9lYWNoID0KKyAgICBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX09ORV9PRl9FQUNILAorICAgICAgICAgICAgICAgICAgImltX3RydWUiLCAgICAgICAgICBUUlVFLAorICAgICAgICAgICAgICAgICAgImltX2ZhbHNlIiwgICAgICAgICBGQUxTRSwKKyAgICAgICAgICAgICAgICAgICJhX2JpdGUiLCAgICAgICAgICAgMHg1MCwKKyAgICAgICAgICAgICAgICAgICJpbnRlZ2VyMTYiLCAgICAgICAgMHg3ZTU3LAorICAgICAgICAgICAgICAgICAgImludGVnZXIzMiIsICAgICAgICAweGRlYWRiZWVmLAorICAgICAgICAgICAgICAgICAgImludGVnZXI2NCIsICAgICAgICBHX0dJTlQ2NF9DT05TVEFOVCAoMHhmYTE1ZWZhY2FkZTE1YmFkKSwKKyAgICAgICAgICAgICAgICAgICJkb3VibGVfcHJlY2lzaW9uIiwgTV9QSSwKKyAgICAgICAgICAgICAgICAgICJzb21lX2NoYXJhY3RlcnMiLCAgIkRlYnVnIFRISVMhIiwKKyAgICAgICAgICAgICAgICAgICJ6b21nX3VuaWNvZGUiLCAgICAgIlx4ZDdcblxhXHQiLAorICAgICAgICAgICAgICAgICAgIndoYXRfd2hvIiwgICAgICAgICBUUlVFLAorICAgICAgICAgICAgICAgICAgImJhc2U2NCIsICAgICAgICAgICBiYXNlNjQsCisgICAgICAgICAgICAgICAgICAiYnl0ZV9saXN0IiwgICAgICAgIGJ5dGVfbGlzdCwKKyAgICAgICAgICAgICAgICAgICJpMTZfbGlzdCIsICAgICAgICAgaTE2X2xpc3QsCisgICAgICAgICAgICAgICAgICAiaTY0X2xpc3QiLCAgICAgICAgIGk2NF9saXN0LAorICAgICAgICAgICAgICAgICAgTlVMTCk7CiAgIGdfYXNzZXJ0IChvbmVfb2ZfZWFjaCAhPSBOVUxMKTsKIAogICBnX2FycmF5X3VucmVmIChpNjRfbGlzdCk7CkBAIC0yNjcsNyArMjcwLDcgQEAKICAgZ19hc3NlcnRfY21waGV4IChhX2JpdGUsICAgID09LCAweDUwKTsKICAgZ19hc3NlcnRfY21waGV4IChpbnRlZ2VyMTYsID09LCAweDdlNTcpOwogICBnX2Fzc2VydF9jbXBoZXggKGludGVnZXIzMiwgPT0sIChnaW50MzIpMHhkZWFkYmVlZik7Ci0gIGdfYXNzZXJ0X2NtcGhleCAoaW50ZWdlcjY0LCA9PSwgMHhmYTE1ZWZhY2FkZTE1YmFkKTsKKyAgZ19hc3NlcnRfY21waGV4IChpbnRlZ2VyNjQsID09LCBHX0dJTlQ2NF9DT05TVEFOVCAoMHhmYTE1ZWZhY2FkZTE1YmFkKSk7CiAKICAgZ19hc3NlcnRfY21wZmxvYXQgKGRvdWJsZV9wcmVjaXNpb24sID09LCBNX1BJKTsKIApAQCAtODM0LDExICs4MzcsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CiAKICAgLyogVFRlc3RJbmhlcml0ZWRDbGllbnQgaW5oZXJpdHMgZnJvbSBUVGVzdFNydkNsaWVudCAqLwotICBhc3NlcnQgKGdfdHlwZV9pc19hIChUX1RFU1RfVFlQRV9JTkhFUklURURfQ0xJRU5ULAorICBnX2Fzc2VydCAoZ190eXBlX2lzX2EgKFRfVEVTVF9UWVBFX0lOSEVSSVRFRF9DTElFTlQsCiAgICAgICAgICAgICAgICAgICAgICAgIFRfVEVTVF9UWVBFX1NSVl9DTElFTlQpKTsKIAogICAvKiBUVGVzdEluaGVyaXRlZENsaWVudCBpbXBsZW1lbnRzIFRUZXN0U3J2Q2xpZW50J3MgaW50ZXJmYWNlICovCi0gIGFzc2VydCAoZ190eXBlX2lzX2EgKFRfVEVTVF9UWVBFX0lOSEVSSVRFRF9DTElFTlQsCisgIGdfYXNzZXJ0IChnX3R5cGVfaXNfYSAoVF9URVNUX1RZUEVfSU5IRVJJVEVEX0NMSUVOVCwKICAgICAgICAgICAgICAgICAgICAgICAgVF9URVNUX1RZUEVfU1JWX0lGKSk7CiAKICAgLyogVFRlc3RJbmhlcml0ZWRDbGllbnQncyBpbmhlcml0ZWQgcHJvcGVydGllcyBjYW4gYmUgc2V0IGFuZCByZXRyaWV2ZWQgKi8KQEAgLTg1Miw4ICs4NTUsOCBAQAogICAgICAgICAgICAgICAgICJvdXRwdXRfcHJvdG9jb2wiLCAmb3V0cHV0X3Byb3RvY29sLAogICAgICAgICAgICAgICAgIE5VTEwpOwogCi0gIGFzc2VydCAoaW5wdXRfcHJvdG9jb2wgPT0gR19PQkpFQ1QocHJvdG9jb2wpKTsKLSAgYXNzZXJ0IChvdXRwdXRfcHJvdG9jb2wgPT0gR19PQkpFQ1QocHJvdG9jb2wpKTsKKyAgZ19hc3NlcnQgKGlucHV0X3Byb3RvY29sID09IEdfT0JKRUNUKHByb3RvY29sKSk7CisgIGdfYXNzZXJ0IChvdXRwdXRfcHJvdG9jb2wgPT0gR19PQkpFQ1QocHJvdG9jb2wpKTsKIAogICBnX29iamVjdF91bnJlZiAob3V0cHV0X3Byb3RvY29sKTsKICAgZ19vYmplY3RfdW5yZWYgKGlucHV0X3Byb3RvY29sKTsKQEAgLTg2NCw3ICs4NjcsNyBAQAogaW50CiBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCiB7Ci0jaWYgKEdMSUJfTUFKT1JfVkVSU0lPTiA9PSAyKSAmJiAoR0xJQl9NSU5PUl9WRVJTSU9OIDwgMzYpCisjaWYgKCFHTElCX0NIRUNLX1ZFUlNJT04gKDIsIDM2LCAwKSkKICAgZ190eXBlX2luaXQgKCk7CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi90ZXN0L3Rlc3RmZHRyYW5zcG9ydC5jIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3RmZHRyYW5zcG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjFlYTg5YmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3Rlc3QvdGVzdGZkdHJhbnNwb3J0LmMKQEAgLTAsMCArMSwxODQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8Z2xpYi5oPgorI2luY2x1ZGUgPGdsaWIvZ3N0ZGlvLmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZkX3RyYW5zcG9ydC5oPgorCitzdGF0aWMgY29uc3QgZ2NoYXIgVEVTVF9EQVRBWzEyXSA9ICJhYmNkZTAxMjM0ISI7CisKK3N0YXRpYyB2b2lkCit0ZXN0X2NyZWF0ZV9hbmRfZGVzdHJveSAodm9pZCkKK3sKKyAgR09iamVjdCAqb2JqZWN0OworICBvYmplY3QgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0ZEX1RSQU5TUE9SVCwgImZkIiwgLTEsIE5VTEwpOworICBnX2Fzc2VydCAob2JqZWN0ICE9IE5VTEwpOworICBnX29iamVjdF91bnJlZiAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3Rfb3Blbl9hbmRfY2xvc2UgKHZvaWQpCit7CisgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0OworICBUaHJpZnRUcmFuc3BvcnRDbGFzcyAqa2xhc3M7CisgIEdFcnJvciAqZXJyb3I7CisgIGdpbnQgZmQ7CisgIGdjaGFyICpmaWxlbmFtZTsKKworICBlcnJvciA9IE5VTEw7CisgIGZpbGVuYW1lID0gTlVMTDsKKworICBmZCA9IGdfZmlsZV9vcGVuX3RtcCAoTlVMTCwgJmZpbGVuYW1lLCAmZXJyb3IpOworICBnX2Fzc2VydCAoZmQgPj0gMCk7CisKKyAgdHJhbnNwb3J0ID0gVEhSSUZUX1RSQU5TUE9SVCAoZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9GRF9UUkFOU1BPUlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZkIiwgZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpOworICBrbGFzcyA9IFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0cmFuc3BvcnQpOworCisgIC8qIG9wZW4gaXMgbm8tb3AgKi8KKyAgZ19hc3NlcnQgKGtsYXNzLT5pc19vcGVuICh0cmFuc3BvcnQpKTsKKyAgZ19hc3NlcnQgKGtsYXNzLT5wZWVrICh0cmFuc3BvcnQsICZlcnJvcikpOworICBnX2Fzc2VydCAoa2xhc3MtPm9wZW4gKHRyYW5zcG9ydCwgJmVycm9yKSk7CisgIGdfYXNzZXJ0IChrbGFzcy0+aXNfb3BlbiAodHJhbnNwb3J0KSk7CisgIGdfYXNzZXJ0IChrbGFzcy0+cGVlayAodHJhbnNwb3J0LCAmZXJyb3IpKTsKKworICBnX2Fzc2VydCAoa2xhc3MtPmNsb3NlICh0cmFuc3BvcnQsICZlcnJvcikpOworICBnX2Fzc2VydCAoISBrbGFzcy0+b3BlbiAodHJhbnNwb3J0LCAmZXJyb3IpKTsKKyAgZ19hc3NlcnQgKCEga2xhc3MtPmlzX29wZW4gKHRyYW5zcG9ydCkpOworICBnX2Fzc2VydCAoISBrbGFzcy0+cGVlayAodHJhbnNwb3J0LCAmZXJyb3IpKTsKKworICAvKiBhbHJlYWR5IGNsb3NlZCAqLworICBnX2Fzc2VydCAoY2xvc2UgKGZkKSAhPSAwKTsKKyAgZ19hc3NlcnQgKGVycm5vID09IEVCQURGKTsKKworICBnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsKKworICBnX3JlbW92ZSAoZmlsZW5hbWUpOworICBnX2ZyZWUgKGZpbGVuYW1lKTsKKworICAvKiB0ZXN0IGJhZCBmZCAqLworICB0cmFuc3BvcnQgPSBUSFJJRlRfVFJBTlNQT1JUIChnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0ZEX1RSQU5TUE9SVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmQiLCAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSk7CisgIGtsYXNzID0gVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHRyYW5zcG9ydCk7CisKKyAgZ19hc3NlcnQgKCEga2xhc3MtPmlzX29wZW4gKHRyYW5zcG9ydCkpOworICBlcnJvciA9IE5VTEw7CisgIGdfYXNzZXJ0ICghIGtsYXNzLT5wZWVrICh0cmFuc3BvcnQsICZlcnJvcikpOworICBlcnJvciA9IE5VTEw7CisgIGdfYXNzZXJ0ICghIGtsYXNzLT5vcGVuICh0cmFuc3BvcnQsICZlcnJvcikpOworICBlcnJvciA9IE5VTEw7CisgIGdfYXNzZXJ0ICghIGtsYXNzLT5jbG9zZSAodHJhbnNwb3J0LCAmZXJyb3IpKTsKKworICBnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfcmVhZF9hbmRfd3JpdGUgKHZvaWQpCit7CisgIGdjaGFyIG91dF9idWZbOF07CisgIGdjaGFyICpiOworICBnaW50IHdhbnQsIGdvdDsKKyAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQ7CisgIFRocmlmdFRyYW5zcG9ydENsYXNzICprbGFzczsKKyAgR0Vycm9yICplcnJvcjsKKyAgZ2ludCBmZDsKKyAgZ2NoYXIgKmZpbGVuYW1lOworCisgIGVycm9yID0gTlVMTDsKKyAgZmlsZW5hbWUgPSBOVUxMOworCisgIGZkID0gZ19maWxlX29wZW5fdG1wIChOVUxMLCAmZmlsZW5hbWUsICZlcnJvcik7CisgIGdfYXNzZXJ0IChmZCA+PSAwKTsKKworICAvKiB3cml0ZSAqLworICB0cmFuc3BvcnQgPSBUSFJJRlRfVFJBTlNQT1JUIChnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0ZEX1RSQU5TUE9SVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmQiLCBmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSk7CisgIGtsYXNzID0gVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHRyYW5zcG9ydCk7CisgIGdfYXNzZXJ0IChrbGFzcy0+aXNfb3BlbiAodHJhbnNwb3J0KSk7CisgIGdfYXNzZXJ0IChrbGFzcy0+d3JpdGUgKHRyYW5zcG9ydCwgKGdwb2ludGVyKSBURVNUX0RBVEEsIDExLCAmZXJyb3IpKTsKKyAgZ19hc3NlcnQgKGtsYXNzLT5mbHVzaCAodHJhbnNwb3J0LCAmZXJyb3IpKTsKKyAgZ19hc3NlcnQgKGtsYXNzLT5jbG9zZSAodHJhbnNwb3J0LCAmZXJyb3IpKTsKKyAgZ19vYmplY3RfdW5yZWYgKHRyYW5zcG9ydCk7CisKKyAgLyogcmVhZCAqLworICBmZCA9IG9wZW4oZmlsZW5hbWUsIE9fUkRPTkxZLCBTX0lSVVNSIHwgU19JV1VTUik7CisgIGdfYXNzZXJ0IChmZCA+PSAwKTsKKworICB0cmFuc3BvcnQgPSBUSFJJRlRfVFJBTlNQT1JUIChnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0ZEX1RSQU5TUE9SVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmQiLCBmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSk7CisgIGtsYXNzID0gVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHRyYW5zcG9ydCk7CisKKyAgbWVtc2V0KG91dF9idWYsIDAsIDgpOworICBiID0gb3V0X2J1ZjsKKyAgd2FudCA9IDc7CisgIHdoaWxlICh3YW50ID4gMCkgeworICAgIGdvdCA9IGtsYXNzLT5yZWFkICh0cmFuc3BvcnQsIChncG9pbnRlcikgYiwgd2FudCwgJmVycm9yKTsKKyAgICBnX2Fzc2VydCAoZ290ID4gMCAmJiBnb3QgPD0gd2FudCk7CisgICAgYiArPSBnb3Q7CisgICAgd2FudCAtPSBnb3Q7CisgIH0KKyAgZ19hc3NlcnQgKG1lbWNtcCAob3V0X2J1ZiwgVEVTVF9EQVRBLCA3KSA9PSAwKTsKKworICBtZW1zZXQob3V0X2J1ZiwgMCwgOCk7CisgIGIgPSBvdXRfYnVmOworICB3YW50ID0gNDsKKyAgd2hpbGUgKHdhbnQgPiAwKSB7CisgICAgZ290ID0ga2xhc3MtPnJlYWQgKHRyYW5zcG9ydCwgKGdwb2ludGVyKSBiLCB3YW50LCAmZXJyb3IpOworICAgIGdfYXNzZXJ0IChnb3QgPiAwICYmIGdvdCA8PSB3YW50KTsKKyAgICBiICs9IGdvdDsKKyAgICB3YW50IC09IGdvdDsKKyAgfQorICBnX2Fzc2VydCAobWVtY21wIChvdXRfYnVmLCBURVNUX0RBVEEgKyA3LCA0KSA9PSAwKTsKKworICBnX2Fzc2VydCAoa2xhc3MtPmNsb3NlICh0cmFuc3BvcnQsICZlcnJvcikpOworICBnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsKKworICAvKiBjbGVhbiB1cCAqLworCisgIGdfcmVtb3ZlIChmaWxlbmFtZSk7CisgIGdfZnJlZSAoZmlsZW5hbWUpOworfQorCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisjaWYgKCFHTElCX0NIRUNLX1ZFUlNJT04gKDIsIDM2LCAwKSkKKyAgZ190eXBlX2luaXQgKCk7CisjZW5kaWYKKworICBnX3Rlc3RfaW5pdCAoJmFyZ2MsICZhcmd2LCBOVUxMKTsKKworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdGZkdHJhbnNwb3J0L0NyZWF0ZUFuZERlc3Ryb3kiLCB0ZXN0X2NyZWF0ZV9hbmRfZGVzdHJveSk7CisgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0ZmR0cmFuc3BvcnQvT3BlbkFuZENsb3NlIiwgdGVzdF9vcGVuX2FuZF9jbG9zZSk7CisgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0ZmR0cmFuc3BvcnQvUmVhZEFuZFdyaXRlIiwgdGVzdF9yZWFkX2FuZF93cml0ZSk7CisKKyAgcmV0dXJuIGdfdGVzdF9ydW4gKCk7Cit9CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3Rlc3QvdGVzdGZyYW1lZHRyYW5zcG9ydC5jIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3RmcmFtZWR0cmFuc3BvcnQuYwppbmRleCA4NDNhZDkzLi4wMDhlNjFlIDEwMDc1NQotLS0gYS9saWIvY19nbGliL3Rlc3QvdGVzdGZyYW1lZHRyYW5zcG9ydC5jCisrKyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0ZnJhbWVkdHJhbnNwb3J0LmMKQEAgLTE3LDggKzE3LDggQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlIDxhc3NlcnQuaD4KICNpbmNsdWRlIDxuZXRkYi5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CiAKICNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NvY2tldC5oPgpAQCAtMjksMTAgKzI5LDggQEAKIAogI2luY2x1ZGUgIi4uL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydC5jIgogCi1zdGF0aWMgY29uc3QgY2hhciBURVNUX0FERFJFU1NbXSA9ICJsb2NhbGhvc3QiOwotc3RhdGljIGNvbnN0IHNob3J0IFRFU1RfUE9SVCA9IDY0NDQ0OwotCiBzdGF0aWMgdm9pZCB0aHJpZnRfc2VydmVyIChjb25zdCBpbnQgcG9ydCk7CitzdGF0aWMgdm9pZCB0aHJpZnRfc29ja2V0X3NlcnZlcl9vcGVuIChjb25zdCBpbnQgcG9ydCwgaW50IHRpbWVzKTsKIAogLyogdGVzdCBvYmplY3QgY3JlYXRpb24gYW5kIGRlc3RydWN0aW9uICovCiBzdGF0aWMgdm9pZApAQCAtNDQsMTAgKzQyLDEwIEBACiAKICAgR09iamVjdCAqb2JqZWN0ID0gTlVMTDsKICAgb2JqZWN0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9GUkFNRURfVFJBTlNQT1JULCBOVUxMKTsKLSAgYXNzZXJ0IChvYmplY3QgIT0gTlVMTCk7CisgIGdfYXNzZXJ0IChvYmplY3QgIT0gTlVMTCk7CiAgIGdfb2JqZWN0X2dldCAoR19PQkpFQ1QgKG9iamVjdCksICJ0cmFuc3BvcnQiLCAmdHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICJyX2J1Zl9zaXplIiwgJnJfYnVmX3NpemUsCi0gICAgICAgICAgICAgICAgIndfYnVmX3NpemUiLCAmd19idWZfc2l6ZSwgTlVMTCk7CisJCSJyX2J1Zl9zaXplIiwgJnJfYnVmX3NpemUsCisJCSJ3X2J1Zl9zaXplIiwgJndfYnVmX3NpemUsIE5VTEwpOwogICBnX29iamVjdF91bnJlZiAob2JqZWN0KTsKIH0KIApAQCAtNTcsMzUgKzU1LDUzIEBACiAgIFRocmlmdFNvY2tldCAqdHNvY2tldCA9IE5VTEw7CiAgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKICAgR0Vycm9yICplcnIgPSBOVUxMOworICBwaWRfdCBwaWQ7CisgIGludCBwb3J0ID0gNTExOTk7CisgIGludCBzdGF0dXM7CiAKLSAgLyogY3JlYXRlIGEgVGhyaWZ0U29ja2V0ICovCi0gIHRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwgImhvc3RuYW1lIiwgImxvY2FsaG9zdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJwb3J0IiwgNTExODgsIE5VTEwpOyAKKyAgcGlkID0gZm9yayAoKTsKKyAgZ19hc3NlcnQgKCBwaWQgPj0gMCApOwogCi0gIC8qIGNyZWF0ZSBhIEJ1ZmZlcmVkVHJhbnNwb3J0IHdyYXBwZXIgb2YgdGhlIFNvY2tldCAqLwotICB0cmFuc3BvcnQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0ZSQU1FRF9UUkFOU1BPUlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgInRyYW5zcG9ydCIsIFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpLCBOVUxMKTsKKyAgaWYgKCBwaWQgPT0gMCApCisgICAgeworICAgICAgLyogY2hpbGQgbGlzdGVucyAqLworICAgICAgdGhyaWZ0X3NvY2tldF9zZXJ2ZXJfb3BlbiAocG9ydCwxKTsKKyAgICAgIGV4aXQgKDApOworICAgIH0gZWxzZSB7CisJLyogcGFyZW50IGNvbm5lY3RzLCB3YWl0IGEgYml0IGZvciB0aGUgc29ja2V0IHRvIGJlIGNyZWF0ZWQgKi8KKwlzbGVlcCAoMSk7CisJLyogY3JlYXRlIGEgVGhyaWZ0U29ja2V0ICovCisJdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwKKwkJCQkicG9ydCIsIHBvcnQsIE5VTEwpOwogCi0gIC8qIHRoaXMgc2hvdWxkbid0IHdvcmsgKi8KLSAgYXNzZXJ0ICh0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9vcGVuICh0cmFuc3BvcnQsIE5VTEwpID09IEZBTFNFKTsKLSAgYXNzZXJ0ICh0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9pc19vcGVuICh0cmFuc3BvcnQpID09IFRSVUUpOwotICBhc3NlcnQgKHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2Nsb3NlICh0cmFuc3BvcnQsIE5VTEwpID09IFRSVUUpOwotICBnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsKLSAgZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOworCS8qIGNyZWF0ZSBhIEJ1ZmZlcmVkVHJhbnNwb3J0IHdyYXBwZXIgb2YgdGhlIFNvY2tldCAqLworCXRyYW5zcG9ydCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfRlJBTUVEX1RSQU5TUE9SVCwKKwkJCQkgICJ0cmFuc3BvcnQiLCBUSFJJRlRfVFJBTlNQT1JUICh0c29ja2V0KSwgTlVMTCk7CiAKLSAgLyogdHJ5IGFuZCB1bmRlcmx5aW5nIHNvY2tldCBmYWlsdXJlICovCi0gIHRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwgImhvc3RuYW1lIiwgImxvY2FsaG9zdC5icm9rZW4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKwkvKiB0aGlzIHNob3VsZG4ndCB3b3JrICovCisJZ19hc3NlcnQgKHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X29wZW4gKHRyYW5zcG9ydCwgTlVMTCkgPT0gVFJVRSk7CisJZ19hc3NlcnQgKHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2lzX29wZW4gKHRyYW5zcG9ydCkgPT0gVFJVRSk7CisJZ19hc3NlcnQgKHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2Nsb3NlICh0cmFuc3BvcnQsIE5VTEwpID09IFRSVUUpOworCWdfb2JqZWN0X3VucmVmICh0cmFuc3BvcnQpOworCWdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKIAotICAvKiBjcmVhdGUgYSBCdWZmZXJlZFRyYW5zcG9ydCB3cmFwcGVyIG9mIHRoZSBTb2NrZXQgKi8KLSAgdHJhbnNwb3J0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9GUkFNRURfVFJBTlNQT1JULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cmFuc3BvcnQiLCBUSFJJRlRfVFJBTlNQT1JUICh0c29ja2V0KSwgTlVMTCk7CisJLyogdHJ5IGFuZCB1bmRlcmx5aW5nIHNvY2tldCBmYWlsdXJlICovCisJdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0LmJyb2tlbiIsCisJCQkJTlVMTCk7CiAKLSAgYXNzZXJ0ICh0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9vcGVuICh0cmFuc3BvcnQsICZlcnIpID09IEZBTFNFKTsKLSAgZ19vYmplY3RfdW5yZWYgKHRyYW5zcG9ydCk7Ci0gIGdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKLSAgZ19lcnJvcl9mcmVlIChlcnIpOwotICBlcnIgPSBOVUxMOworCS8qIGNyZWF0ZSBhIEJ1ZmZlcmVkVHJhbnNwb3J0IHdyYXBwZXIgb2YgdGhlIFNvY2tldCAqLworCXRyYW5zcG9ydCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfRlJBTUVEX1RSQU5TUE9SVCwKKwkJCQkgICJ0cmFuc3BvcnQiLCBUSFJJRlRfVFJBTlNQT1JUICh0c29ja2V0KSwgTlVMTCk7CisKKwlnX2Fzc2VydCAodGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfb3BlbiAodHJhbnNwb3J0LCAmZXJyKSA9PSBGQUxTRSk7CisJZ19vYmplY3RfdW5yZWYgKHRyYW5zcG9ydCk7CisJZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOworCWdfZXJyb3JfZnJlZSAoZXJyKTsKKwllcnIgPSBOVUxMOworCisJZ19hc3NlcnQgKCB3YWl0ICgmc3RhdHVzKSA9PSBwaWQgKTsKKwlnX2Fzc2VydCAoIHN0YXR1cyA9PSAwICk7CisgICAgfQogfQogCiBzdGF0aWMgdm9pZApAQCAtOTksNDkgKzExNSw0OSBAQAogICBndWNoYXIgYnVmWzEwXSA9IFRFU1RfREFUQTsgLyogYSBidWZmZXIgKi8KIAogICBwaWQgPSBmb3JrICgpOwotICBhc3NlcnQgKCBwaWQgPj0gMCApOworICBnX2Fzc2VydCAoIHBpZCA+PSAwICk7CiAKICAgaWYgKCBwaWQgPT0gMCApCi0gIHsKLSAgICAvKiBjaGlsZCBsaXN0ZW5zICovCi0gICAgdGhyaWZ0X3NlcnZlciAocG9ydCk7Ci0gICAgZXhpdCAoMCk7Ci0gIH0gZWxzZSB7Ci0gICAgLyogcGFyZW50IGNvbm5lY3RzLCB3YWl0IGEgYml0IGZvciB0aGUgc29ja2V0IHRvIGJlIGNyZWF0ZWQgKi8KLSAgICBzbGVlcCAoMSk7CisgICAgeworICAgICAgLyogY2hpbGQgbGlzdGVucyAqLworICAgICAgdGhyaWZ0X3NlcnZlciAocG9ydCk7CisgICAgICBleGl0ICgwKTsKKyAgICB9IGVsc2UgeworCS8qIHBhcmVudCBjb25uZWN0cywgd2FpdCBhIGJpdCBmb3IgdGhlIHNvY2tldCB0byBiZSBjcmVhdGVkICovCisJc2xlZXAgKDEpOwogCi0gICAgdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCIsIHBvcnQsIE5VTEwpOwotICAgIHRyYW5zcG9ydCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfRlJBTUVEX1RSQU5TUE9SVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cmFuc3BvcnQiLCBUSFJJRlRfVFJBTlNQT1JUICh0c29ja2V0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3X2J1Zl9zaXplIiwgNCwgTlVMTCk7CisJdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwKKwkJCQkicG9ydCIsIHBvcnQsIE5VTEwpOworCXRyYW5zcG9ydCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfRlJBTUVEX1RSQU5TUE9SVCwKKwkJCQkgICJ0cmFuc3BvcnQiLCBUSFJJRlRfVFJBTlNQT1JUICh0c29ja2V0KSwKKwkJCQkgICJ3X2J1Zl9zaXplIiwgNCwgTlVMTCk7CiAKLSAgICBhc3NlcnQgKHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X29wZW4gKHRyYW5zcG9ydCwgTlVMTCkgPT0gVFJVRSk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9pc19vcGVuICh0cmFuc3BvcnQpKTsKKwlnX2Fzc2VydCAodGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfb3BlbiAodHJhbnNwb3J0LCBOVUxMKSA9PSBUUlVFKTsKKwlnX2Fzc2VydCAodGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfaXNfb3BlbiAodHJhbnNwb3J0KSk7CiAKLSAgICAvKiB3cml0ZSAxMCBieXRlcyAqLwotICAgIHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMTAsIE5VTEwpOwotICAgIHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworCS8qIHdyaXRlIDEwIGJ5dGVzICovCisJdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxMCwgTlVMTCk7CisJdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CiAKLSAgICB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEsIE5VTEwpOwotICAgIHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworCXRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMSwgTlVMTCk7CisJdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CiAKLSAgICB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEwLCBOVUxMKTsKLSAgICB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKwl0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEwLCBOVUxMKTsKKwl0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKIAotICAgIHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMTAsIE5VTEwpOwotICAgIHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworCXRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMTAsIE5VTEwpOworCXRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOwogCi0gICAgdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfd3JpdGVfZW5kICh0cmFuc3BvcnQsIE5VTEwpOwotICAgIHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOwotICAgIHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2Nsb3NlICh0cmFuc3BvcnQsIE5VTEwpOworCXRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3dyaXRlX2VuZCAodHJhbnNwb3J0LCBOVUxMKTsKKwl0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKwl0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9jbG9zZSAodHJhbnNwb3J0LCBOVUxMKTsKIAotICAgIGdfb2JqZWN0X3VucmVmICh0cmFuc3BvcnQpOwotICAgIGdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKKwlnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsKKwlnX29iamVjdF91bnJlZiAodHNvY2tldCk7CiAKLSAgICBhc3NlcnQgKCB3YWl0ICgmc3RhdHVzKSA9PSBwaWQgKTsKLSAgICBhc3NlcnQgKCBzdGF0dXMgPT0gMCApOwotICB9CisJZ19hc3NlcnQgKCB3YWl0ICgmc3RhdHVzKSA9PSBwaWQgKTsKKwlnX2Fzc2VydCAoIHN0YXR1cyA9PSAwICk7CisgICAgfQogfQogCiAvKiB0ZXN0IHJlYWRpbmcgZnJvbSB0aGUgdHJhbnNwb3J0IGFmdGVyIHRoZSBwZWVyIGhhcyB1bmV4cGVjdGVkbHkKQEAgLTE1OCw3NiArMTc0LDk3IEBACiAgIGdfYXNzZXJ0IChwaWQgPj0gMCk7CiAKICAgaWYgKHBpZCA9PSAwKQotICB7Ci0gICAgVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICpzZXJ2ZXJfdHJhbnNwb3J0ID0gTlVMTDsKLSAgICBUaHJpZnRUcmFuc3BvcnQgKmNsaWVudF90cmFuc3BvcnQgPSBOVUxMOworICAgIHsKKyAgICAgIFRocmlmdFNlcnZlclRyYW5zcG9ydCAqc2VydmVyX3RyYW5zcG9ydCA9IE5VTEw7CisgICAgICBUaHJpZnRUcmFuc3BvcnQgKmNsaWVudF90cmFuc3BvcnQgPSBOVUxMOwogCi0gICAgLyogY2hpbGQgbGlzdGVucyAqLwotICAgIHNlcnZlcl90cmFuc3BvcnQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NFUlZFUl9TT0NLRVQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQiLCBwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwotICAgIGdfYXNzZXJ0IChzZXJ2ZXJfdHJhbnNwb3J0ICE9IE5VTEwpOworICAgICAgLyogY2hpbGQgbGlzdGVucyAqLworICAgICAgc2VydmVyX3RyYW5zcG9ydCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU0VSVkVSX1NPQ0tFVCwKKwkJCQkgICAgICAgInBvcnQiLCBwb3J0LAorCQkJCSAgICAgICBOVUxMKTsKKyAgICAgIGdfYXNzZXJ0IChzZXJ2ZXJfdHJhbnNwb3J0ICE9IE5VTEwpOwogCi0gICAgdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfbGlzdGVuIChzZXJ2ZXJfdHJhbnNwb3J0LCAmZXJyKTsKLSAgICBnX2Fzc2VydCAoZXJyID09IE5VTEwpOworICAgICAgdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfbGlzdGVuIChzZXJ2ZXJfdHJhbnNwb3J0LCAmZXJyKTsKKyAgICAgIGdfYXNzZXJ0IChlcnIgPT0gTlVMTCk7CiAKLSAgICAvKiB3cmFwIHRoZSBjbGllbnQgdHJhbnNwb3J0IGluIGEgVGhyaWZ0RnJhbWVkVHJhbnNwb3J0ICovCi0gICAgY2xpZW50X3RyYW5zcG9ydCA9IGdfb2JqZWN0X25ldwotICAgICAgKFRIUklGVF9UWVBFX0ZSQU1FRF9UUkFOU1BPUlQsCi0gICAgICAgInRyYW5zcG9ydCIsICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9hY2NlcHQgKHNlcnZlcl90cmFuc3BvcnQsICZlcnIpLAotICAgICAgICJyX2J1Zl9zaXplIiwgMCwKLSAgICAgICBOVUxMKTsKLSAgICBnX2Fzc2VydCAoZXJyID09IE5VTEwpOwotICAgIGdfYXNzZXJ0IChjbGllbnRfdHJhbnNwb3J0ICE9IE5VTEwpOworICAgICAgLyogd3JhcCB0aGUgY2xpZW50IHRyYW5zcG9ydCBpbiBhIFRocmlmdEZyYW1lZFRyYW5zcG9ydCAqLworICAgICAgY2xpZW50X3RyYW5zcG9ydCA9IGdfb2JqZWN0X25ldworCSAgKFRIUklGVF9UWVBFX0ZSQU1FRF9UUkFOU1BPUlQsCisJICAgInRyYW5zcG9ydCIsICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9hY2NlcHQgKHNlcnZlcl90cmFuc3BvcnQsICZlcnIpLAorCSAgICJyX2J1Zl9zaXplIiwgMCwKKwkgICBOVUxMKTsKKyAgICAgIGdfYXNzZXJ0IChlcnIgPT0gTlVMTCk7CisgICAgICBnX2Fzc2VydCAoY2xpZW50X3RyYW5zcG9ydCAhPSBOVUxMKTsKIAotICAgIC8qIGNsb3NlIHRoZSBjb25uZWN0aW9uIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBjbGllbnQgY29ubmVjdHMgKi8KLSAgICB0aHJpZnRfdHJhbnNwb3J0X2Nsb3NlIChjbGllbnRfdHJhbnNwb3J0LCBOVUxMKTsKKyAgICAgIC8qIGNsb3NlIHRoZSBjb25uZWN0aW9uIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBjbGllbnQgY29ubmVjdHMgKi8KKyAgICAgIHRocmlmdF90cmFuc3BvcnRfY2xvc2UgKGNsaWVudF90cmFuc3BvcnQsIE5VTEwpOwogCi0gICAgZ19vYmplY3RfdW5yZWYgKGNsaWVudF90cmFuc3BvcnQpOwotICAgIGdfb2JqZWN0X3VucmVmIChzZXJ2ZXJfdHJhbnNwb3J0KTsKKyAgICAgIGdfb2JqZWN0X3VucmVmIChjbGllbnRfdHJhbnNwb3J0KTsKKyAgICAgIGdfb2JqZWN0X3VucmVmIChzZXJ2ZXJfdHJhbnNwb3J0KTsKIAotICAgIGV4aXQgKDApOwotICB9IGVsc2UgewotICAgIFRocmlmdFNvY2tldCAqdHNvY2tldCA9IE5VTEw7Ci0gICAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBOVUxMOwotICAgIGd1Y2hhciBidWZbMTBdOyAvKiBhIGJ1ZmZlciAqLworICAgICAgZXhpdCAoMCk7CisgICAgfSBlbHNlIHsKKwlUaHJpZnRTb2NrZXQgKnRzb2NrZXQgPSBOVUxMOworCVRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKKwlndWNoYXIgYnVmWzEwXTsgLyogYSBidWZmZXIgKi8KIAotICAgIC8qIHBhcmVudCBjb25uZWN0cywgd2FpdCBhIGJpdCBmb3IgdGhlIHNvY2tldCB0byBiZSBjcmVhdGVkICovCi0gICAgc2xlZXAgKDEpOworCS8qIHBhcmVudCBjb25uZWN0cywgd2FpdCBhIGJpdCBmb3IgdGhlIHNvY2tldCB0byBiZSBjcmVhdGVkICovCisJc2xlZXAgKDEpOwogCi0gICAgdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJob3N0bmFtZSIsICJsb2NhbGhvc3QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3J0IiwgICAgIHBvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0gICAgdHJhbnNwb3J0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9GUkFNRURfVFJBTlNQT1JULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRyYW5zcG9ydCIsICBUSFJJRlRfVFJBTlNQT1JUICh0c29ja2V0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3X2J1Zl9zaXplIiwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworCXRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwKKwkJCQkiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwKKwkJCQkicG9ydCIsICAgICBwb3J0LAorCQkJCU5VTEwpOworCXRyYW5zcG9ydCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfRlJBTUVEX1RSQU5TUE9SVCwKKwkJCQkgICJ0cmFuc3BvcnQiLCAgVEhSSUZUX1RSQU5TUE9SVCAodHNvY2tldCksCisJCQkJICAid19idWZfc2l6ZSIsIDAsCisJCQkJICBOVUxMKTsKIAotICAgIGdfYXNzZXJ0ICh0aHJpZnRfdHJhbnNwb3J0X29wZW4gKHRyYW5zcG9ydCwgTlVMTCkgPT0gVFJVRSk7Ci0gICAgZ19hc3NlcnQgKHRocmlmdF90cmFuc3BvcnRfaXNfb3BlbiAodHJhbnNwb3J0KSk7CisJZ19hc3NlcnQgKHRocmlmdF90cmFuc3BvcnRfb3BlbiAodHJhbnNwb3J0LCBOVUxMKSA9PSBUUlVFKTsKKwlnX2Fzc2VydCAodGhyaWZ0X3RyYW5zcG9ydF9pc19vcGVuICh0cmFuc3BvcnQpKTsKIAotICAgIC8qIGF0dGVtcHRpbmcgdG8gcmVhZCBmcm9tIHRoZSB0cmFuc3BvcnQgYWZ0ZXIgdGhlIHBlZXIgaGFzIGNsb3NlZAorCS8qIGF0dGVtcHRpbmcgdG8gcmVhZCBmcm9tIHRoZSB0cmFuc3BvcnQgYWZ0ZXIgdGhlIHBlZXIgaGFzIGNsb3NlZAogICAgICAgIHRoZSBjb25uZWN0aW9uIGZhaWxzIGdyYWNlZnVsbHkgd2l0aG91dCBnZW5lcmF0aW5nIGEgY3JpdGljYWwKICAgICAgICB3YXJuaW5nIG9yIHNlZ21lbnRhdGlvbiBmYXVsdCAqLwotICAgIHRocmlmdF90cmFuc3BvcnRfcmVhZCAodHJhbnNwb3J0LCBidWYsIDEwLCAmZXJyKTsKLSAgICBnX2Fzc2VydCAoZXJyICE9IE5VTEwpOworCXRocmlmdF90cmFuc3BvcnRfcmVhZCAodHJhbnNwb3J0LCBidWYsIDEwLCAmZXJyKTsKKwlnX2Fzc2VydCAoZXJyICE9IE5VTEwpOwogCi0gICAgZ19lcnJvcl9mcmVlIChlcnIpOwotICAgIGVyciA9IE5VTEw7CisJZ19lcnJvcl9mcmVlIChlcnIpOworCWVyciA9IE5VTEw7CiAKLSAgICB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfZW5kICh0cmFuc3BvcnQsICZlcnIpOwotICAgIGdfYXNzZXJ0IChlcnIgPT0gTlVMTCk7CisJdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2VuZCAodHJhbnNwb3J0LCAmZXJyKTsKKwlnX2Fzc2VydCAoZXJyID09IE5VTEwpOwogCi0gICAgdGhyaWZ0X3RyYW5zcG9ydF9jbG9zZSAodHJhbnNwb3J0LCAmZXJyKTsKLSAgICBnX2Fzc2VydCAoZXJyID09IE5VTEwpOworCXRocmlmdF90cmFuc3BvcnRfY2xvc2UgKHRyYW5zcG9ydCwgJmVycik7CisJZ19hc3NlcnQgKGVyciA9PSBOVUxMKTsKIAotICAgIGdfb2JqZWN0X3VucmVmICh0cmFuc3BvcnQpOwotICAgIGdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKKwlnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsKKwlnX29iamVjdF91bnJlZiAodHNvY2tldCk7CiAKLSAgICBnX2Fzc2VydCAod2FpdCAoJnN0YXR1cykgPT0gcGlkKTsKLSAgICBnX2Fzc2VydCAoc3RhdHVzID09IDApOworCWdfYXNzZXJ0ICh3YWl0ICgmc3RhdHVzKSA9PSBwaWQpOworCWdfYXNzZXJ0IChzdGF0dXMgPT0gMCk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X3NvY2tldF9zZXJ2ZXJfb3BlbiAoY29uc3QgaW50IHBvcnQsIGludCB0aW1lcykKK3sKKyAgVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBOVUxMOworICBUaHJpZnRUcmFuc3BvcnQgKmNsaWVudCA9IE5VTEw7CisgIGludCBpOworCisgIFRocmlmdFNlcnZlclNvY2tldCAqdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU0VSVkVSX1NPQ0tFVCwKKwkJCQkJICAgICAgInBvcnQiLCBwb3J0LCBOVUxMKTsKKworICB0cmFuc3BvcnQgPSBUSFJJRlRfU0VSVkVSX1RSQU5TUE9SVCAodHNvY2tldCk7CisgIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2xpc3RlbiAodHJhbnNwb3J0LCBOVUxMKTsKKyAgZm9yKGk9MDtpPHRpbWVzO2krKyl7CisgICAgICBjbGllbnQgPSB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9hY2NlcHQgKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgICBnX2Fzc2VydCAoY2xpZW50ICE9IE5VTEwpOworICAgICAgdGhyaWZ0X3NvY2tldF9jbG9zZSAoY2xpZW50LCBOVUxMKTsKKyAgICAgIGdfb2JqZWN0X3VucmVmIChjbGllbnQpOwogICB9CisgIGdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTI0MCwyMSArMjc3LDIxIEBACiAgIGd1Y2hhciBtYXRjaFsxMF0gPSBURVNUX0RBVEE7CiAKICAgVGhyaWZ0U2VydmVyU29ja2V0ICp0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TRVJWRVJfU09DS0VULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3J0IiwgcG9ydCwgTlVMTCk7CisJCQkJCSAgICAgICJwb3J0IiwgcG9ydCwgTlVMTCk7CiAKICAgdHJhbnNwb3J0ID0gVEhSSUZUX1NFUlZFUl9UUkFOU1BPUlQgKHRzb2NrZXQpOwogICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9saXN0ZW4gKHRyYW5zcG9ydCwgTlVMTCk7CiAKICAgLyogd3JhcCB0aGUgY2xpZW50IGluIGEgQnVmZmVyZWRUcmFuc3BvcnQgKi8KICAgY2xpZW50ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9GUkFNRURfVFJBTlNQT1JULCAidHJhbnNwb3J0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9hY2NlcHQgKHRyYW5zcG9ydCwgTlVMTCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgInJfYnVmX3NpemUiLCA1LCBOVUxMKTsKLSAgYXNzZXJ0IChjbGllbnQgIT0gTlVMTCk7CisJCQkgdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfYWNjZXB0ICh0cmFuc3BvcnQsIE5VTEwpLAorCQkJICJyX2J1Zl9zaXplIiwgNSwgTlVMTCk7CisgIGdfYXNzZXJ0IChjbGllbnQgIT0gTlVMTCk7CiAKICAgLyogcmVhZCAxMCBieXRlcyAqLwogICBieXRlcyA9IHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3JlYWQgKGNsaWVudCwgYnVmLCAxMCwgTlVMTCk7Ci0gIGFzc2VydCAoYnl0ZXMgPT0gMTApOyAvKiBtYWtlIHN1cmUgd2UndmUgcmVhZCAxMCBieXRlcyAqLwotICBhc3NlcnQgKCBtZW1jbXAgKGJ1ZiwgbWF0Y2gsIDEwKSA9PSAwICk7IC8qIG1ha2Ugc3VyZSB3aGF0IHdlIGdvdCBtYXRjaGVzICovCisgIGdfYXNzZXJ0IChieXRlcyA9PSAxMCk7IC8qIG1ha2Ugc3VyZSB3ZSd2ZSByZWFkIDEwIGJ5dGVzICovCisgIGdfYXNzZXJ0ICggbWVtY21wIChidWYsIG1hdGNoLCAxMCkgPT0gMCApOyAvKiBtYWtlIHN1cmUgd2hhdCB3ZSBnb3QgbWF0Y2hlcyAqLwogCiAgIGJ5dGVzID0gdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfcmVhZCAoY2xpZW50LCBidWYsIDYsIE5VTEwpOwogICBieXRlcyA9IHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3JlYWQgKGNsaWVudCwgYnVmLCA1LCBOVUxMKTsKQEAgLTI3MSw3ICszMDgsMTAgQEAKIGludAogbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQogeworI2lmICghR0xJQl9DSEVDS19WRVJTSU9OICgyLCAzNiwgMCkpCiAgIGdfdHlwZV9pbml0KCk7CisjZW5kaWYKKwogICBnX3Rlc3RfaW5pdCAoJmFyZ2MsICZhcmd2LCBOVUxMKTsKIAogICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdGZyYW1lZHRyYW5zcG9ydC9DcmVhdGVBbmREZXN0cm95IiwgdGVzdF9jcmVhdGVfYW5kX2Rlc3Ryb3kpOwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi90ZXN0L3Rlc3RtZW1vcnlidWZmZXIuYyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0bWVtb3J5YnVmZmVyLmMKaW5kZXggNzE2OWE1Yy4uOWZiNjhiOSAxMDA3NTUKLS0tIGEvbGliL2NfZ2xpYi90ZXN0L3Rlc3RtZW1vcnlidWZmZXIuYworKysgYi9saWIvY19nbGliL3Rlc3QvdGVzdG1lbW9yeWJ1ZmZlci5jCkBAIC0xNyw3ICsxNyw2IEBACiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+CiAjaW5jbHVkZSA8bmV0ZGIuaD4KIAogI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaD4KQEAgLTI1LDcxICsyNCwyMDAgQEAKICNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5oPgogI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfc29ja2V0Lmg+CiAKLSNkZWZpbmUgVEVTVF9EQVRBIHsgJ2EnLCAnYicsICdjJywgJ2QnLCAnZScsICdmJywgJ2cnLCAnaCcsICdpJywgJ2onIH0KK3N0YXRpYyBjb25zdCBnY2hhciBURVNUX0RBVEFbMTFdID0gImFiY2RlZmdoaWoiOwogCiAjaW5jbHVkZSAiLi4vc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9tZW1vcnlfYnVmZmVyLmMiCiAKIC8qIHRlc3Qgb2JqZWN0IGNyZWF0aW9uIGFuZCBkZXN0cnVjdGlvbiAqLwogc3RhdGljIHZvaWQKLXRlc3RfY3JlYXRlX2FuZF9kZXN0cm95KHZvaWQpCit0ZXN0X2NyZWF0ZV9hbmRfZGVzdHJveSAodm9pZCkKIHsKICAgR09iamVjdCAqb2JqZWN0ID0gTlVMTDsKLSAgb2JqZWN0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9NRU1PUllfQlVGRkVSLCBOVUxMKTsKLSAgYXNzZXJ0IChvYmplY3QgIT0gTlVMTCk7CisgIG9iamVjdCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfTUVNT1JZX0JVRkZFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiYnVmX3NpemUiLCAxMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgZ19hc3NlcnQgKG9iamVjdCAhPSBOVUxMKTsKICAgZ19vYmplY3RfdW5yZWYgKG9iamVjdCk7CiB9CiAKIHN0YXRpYyB2b2lkCi10ZXN0X29wZW5fYW5kX2Nsb3NlKHZvaWQpCit0ZXN0X2NyZWF0ZV9hbmRfZGVzdHJveV9sYXJnZSAodm9pZCkKK3sKKyAgR09iamVjdCAqb2JqZWN0ID0gTlVMTDsKKyAgb2JqZWN0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9NRU1PUllfQlVGRkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICJidWZfc2l6ZSIsIDEwICogMTAyNCAqIDEwMjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgIGdfYXNzZXJ0IChvYmplY3QgIT0gTlVMTCk7CisgIGdfb2JqZWN0X3VucmVmIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9jcmVhdGVfYW5kX2Rlc3Ryb3lfZGVmYXVsdCAodm9pZCkKK3sKKyAgR09iamVjdCAqb2JqZWN0ID0gTlVMTDsKKyAgb2JqZWN0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9NRU1PUllfQlVGRkVSLCBOVUxMKTsKKyAgZ19hc3NlcnQgKG9iamVjdCAhPSBOVUxMKTsKKyAgZ19vYmplY3RfdW5yZWYgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X2NyZWF0ZV9hbmRfZGVzdHJveV9leHRlcm5hbCAodm9pZCkKK3sKKyAgR09iamVjdCAqb2JqZWN0ID0gTlVMTDsKKyAgR0J5dGVBcnJheSAqYnVmID0gZ19ieXRlX2FycmF5X25ldyAoKTsKKyAgZ19hc3NlcnQgKGJ1ZiAhPSBOVUxMKTsKKyAgb2JqZWN0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9NRU1PUllfQlVGRkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICJidWYiLCBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgIGdfYXNzZXJ0IChvYmplY3QgIT0gTlVMTCk7CisgIGdfb2JqZWN0X3VucmVmIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9jcmVhdGVfYW5kX2Rlc3Ryb3lfdW5vd25lZCAodm9pZCkKK3sKKyAgR09iamVjdCAqb2JqZWN0ID0gTlVMTDsKKyAgR1ZhbHVlIHZhbCA9IEdfVkFMVUVfSU5JVDsKKyAgR0J5dGVBcnJheSAqYnVmOworCisgIG9iamVjdCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfTUVNT1JZX0JVRkZFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAib3duZXIiLCBGQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgZ19hc3NlcnQgKG9iamVjdCAhPSBOVUxMKTsKKworICBnX3ZhbHVlX2luaXQgKCZ2YWwsIEdfVFlQRV9QT0lOVEVSKTsKKyAgZ19vYmplY3RfZ2V0X3Byb3BlcnR5IChvYmplY3QsICJidWYiLCAmdmFsKTsKKyAgYnVmID0gKEdCeXRlQXJyYXkqKSBnX3ZhbHVlX2dldF9wb2ludGVyICgmdmFsKTsKKyAgZ19hc3NlcnQgKGJ1ZiAhPSBOVUxMKTsKKworICBnX2J5dGVfYXJyYXlfdW5yZWYgKGJ1Zik7CisgIGdfdmFsdWVfdW5zZXQgKCZ2YWwpOworICBnX29iamVjdF91bnJlZiAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3Rfb3Blbl9hbmRfY2xvc2UgKHZvaWQpCiB7CiAgIFRocmlmdE1lbW9yeUJ1ZmZlciAqdGJ1ZmZlciA9IE5VTEw7CiAKICAgLyogY3JlYXRlIGEgVGhyaWZ0TWVtb3J5QnVmZmVyICovCiAgIHRidWZmZXIgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX01FTU9SWV9CVUZGRVIsIE5VTEwpOwogCi0gIC8qIHRoaXMgc2hvdWxkbid0IHdvcmsgKi8KLSAgYXNzZXJ0ICh0aHJpZnRfbWVtb3J5X2J1ZmZlcl9vcGVuIChUSFJJRlRfVFJBTlNQT1JUICh0YnVmZmVyKSwgTlVMTCkgPT0gVFJVRSk7Ci0gIGFzc2VydCAodGhyaWZ0X21lbW9yeV9idWZmZXJfaXNfb3BlbiAoVEhSSUZUX1RSQU5TUE9SVCAodGJ1ZmZlcikpID09IFRSVUUpOwotICBhc3NlcnQgKHRocmlmdF9tZW1vcnlfYnVmZmVyX2Nsb3NlIChUSFJJRlRfVFJBTlNQT1JUICh0YnVmZmVyKSwgTlVMTCkgPT0gVFJVRSk7CisgIC8qIG5vLW9wcyAqLworICBnX2Fzc2VydCAodGhyaWZ0X21lbW9yeV9idWZmZXJfb3BlbiAoVEhSSUZUX1RSQU5TUE9SVCAodGJ1ZmZlciksIE5VTEwpID09IFRSVUUpOworICBnX2Fzc2VydCAodGhyaWZ0X21lbW9yeV9idWZmZXJfaXNfb3BlbiAoVEhSSUZUX1RSQU5TUE9SVCAodGJ1ZmZlcikpID09IFRSVUUpOworICBnX2Fzc2VydCAodGhyaWZ0X21lbW9yeV9idWZmZXJfY2xvc2UgKFRIUklGVF9UUkFOU1BPUlQgKHRidWZmZXIpLCBOVUxMKSA9PSBUUlVFKTsKKwogICBnX29iamVjdF91bnJlZiAodGJ1ZmZlcik7CiB9CiAKIHN0YXRpYyB2b2lkCi10ZXN0X3JlYWRfYW5kX3dyaXRlKHZvaWQpCit0ZXN0X3JlYWRfYW5kX3dyaXRlICh2b2lkKQogewogICBUaHJpZnRNZW1vcnlCdWZmZXIgKnRidWZmZXIgPSBOVUxMOwotICBndWNoYXIgYnVmWzEwXSA9IFRFU1RfREFUQTsKLSAgZ3VjaGFyIHJlYWRbMTBdOworICBnaW50IGdvdCwgd2FudDsKKyAgZ2NoYXIgcmVhZFsxMF07CisgIGdjaGFyICpiOwogICBHRXJyb3IgKmVycm9yID0gTlVMTDsKIAogICB0YnVmZmVyID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9NRU1PUllfQlVGRkVSLCAiYnVmX3NpemUiLCA1LCBOVUxMKTsKLSAgYXNzZXJ0ICh0aHJpZnRfbWVtb3J5X2J1ZmZlcl93cml0ZSAoVEhSSUZUX1RSQU5TUE9SVCAodGJ1ZmZlciksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChncG9pbnRlcikgYnVmLAorICBnX2Fzc2VydCAodGhyaWZ0X21lbW9yeV9idWZmZXJfd3JpdGUgKFRIUklGVF9UUkFOU1BPUlQgKHRidWZmZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ3BvaW50ZXIpIFRFU1RfREFUQSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAsICZlcnJvcikgPT0gRkFMU0UpOwotICBhc3NlcnQgKGVycm9yICE9IE5VTEwpOworICBnX2Fzc2VydCAoZXJyb3IgIT0gTlVMTCk7CiAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOwogICBlcnJvciA9IE5VTEw7CiAgIGdfb2JqZWN0X3VucmVmICh0YnVmZmVyKTsKIAogICB0YnVmZmVyID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9NRU1PUllfQlVGRkVSLCAiYnVmX3NpemUiLCAxNSwgTlVMTCk7Ci0gIGFzc2VydCAodGhyaWZ0X21lbW9yeV9idWZmZXJfd3JpdGUgKFRIUklGVF9UUkFOU1BPUlQgKHRidWZmZXIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ3BvaW50ZXIpIGJ1ZiwgMTAsICZlcnJvcikgPT0gVFJVRSk7Ci0gIGFzc2VydCAoZXJyb3IgPT0gTlVMTCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfbWVtb3J5X2J1ZmZlcl93cml0ZSAoVEhSSUZUX1RSQU5TUE9SVCAodGJ1ZmZlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChncG9pbnRlcikgVEVTVF9EQVRBLCAxMCwgJmVycm9yKSA9PSBUUlVFKTsKKyAgZ19hc3NlcnQgKGVycm9yID09IE5VTEwpOwogCi0gIGFzc2VydCAodGhyaWZ0X21lbW9yeV9idWZmZXJfcmVhZCAoVEhSSUZUX1RSQU5TUE9SVCAodGJ1ZmZlciksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlYWQsIDEwLCAmZXJyb3IpID4gMCk7Ci0gIGFzc2VydCAoZXJyb3IgPT0gTlVMTCk7CisgIG1lbXNldChyZWFkLCAwLCAxMCk7CisgIGIgPSByZWFkOworICB3YW50ID0gMTA7CisgIHdoaWxlICh3YW50ID4gMCkgeworICAgIGdvdCA9IHRocmlmdF9tZW1vcnlfYnVmZmVyX3JlYWQgKFRIUklGVF9UUkFOU1BPUlQgKHRidWZmZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChncG9pbnRlcikgYiwgd2FudCwgJmVycm9yKTsKKyAgICBnX2Fzc2VydCAoZ290ID4gMCAmJiBnb3QgPD0gd2FudCk7CisgICAgZ19hc3NlcnQgKGVycm9yID09IE5VTEwpOworICAgIGIgKz0gZ290OworICAgIHdhbnQgLT0gZ290OworICB9CisgIGdfYXNzZXJ0IChtZW1jbXAgKHJlYWQsIFRFU1RfREFUQSwgMTApID09IDApOworICBnX29iamVjdF91bnJlZiAodGJ1ZmZlcik7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3JlYWRfYW5kX3dyaXRlX2RlZmF1bHQgKHZvaWQpCit7CisgIFRocmlmdE1lbW9yeUJ1ZmZlciAqdGJ1ZmZlciA9IE5VTEw7CisgIGdpbnQgZ290LCB3YW50LCBpOworICBnY2hhciByZWFkWzEwXTsKKyAgZ2NoYXIgKmI7CisgIEdFcnJvciAqZXJyb3IgPSBOVUxMOworCisgIHRidWZmZXIgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX01FTU9SWV9CVUZGRVIsIE5VTEwpOworICBmb3IgKGkgPSAwOyBpIDwgMTAwOyArK2kpIHsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X21lbW9yeV9idWZmZXJfd3JpdGUgKFRIUklGVF9UUkFOU1BPUlQgKHRidWZmZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChncG9pbnRlcikgVEVTVF9EQVRBLCAxMCwgJmVycm9yKSA9PSBUUlVFKTsKKyAgICBnX2Fzc2VydCAoZXJyb3IgPT0gTlVMTCk7CisgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgMTAwOyArK2kpIHsKKyAgICBtZW1zZXQocmVhZCwgMCwgMTApOworICAgIGIgPSByZWFkOworICAgIHdhbnQgPSAxMDsKKyAgICB3aGlsZSAod2FudCA+IDApIHsKKyAgICAgIGdvdCA9IHRocmlmdF9tZW1vcnlfYnVmZmVyX3JlYWQgKFRIUklGVF9UUkFOU1BPUlQgKHRidWZmZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdwb2ludGVyKSBiLCB3YW50LCAmZXJyb3IpOworICAgICAgZ19hc3NlcnQgKGdvdCA+IDAgJiYgZ290IDw9IHdhbnQpOworICAgICAgZ19hc3NlcnQgKGVycm9yID09IE5VTEwpOworICAgICAgYiArPSBnb3Q7CisgICAgICB3YW50IC09IGdvdDsKKyAgICB9CisgICAgZ19hc3NlcnQgKG1lbWNtcCAocmVhZCwgVEVTVF9EQVRBLCAxMCkgPT0gMCk7CisgIH0KKyAgZ19vYmplY3RfdW5yZWYgKHRidWZmZXIpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9yZWFkX2FuZF93cml0ZV9leHRlcm5hbCAodm9pZCkKK3sKKyAgVGhyaWZ0TWVtb3J5QnVmZmVyICp0YnVmZmVyID0gTlVMTDsKKyAgZ2NoYXIgKmI7CisgIEdFcnJvciAqZXJyb3IgPSBOVUxMOworICBHQnl0ZUFycmF5ICpidWYgPSBnX2J5dGVfYXJyYXlfbmV3ICgpOworICBnX2Fzc2VydCAoYnVmICE9IE5VTEwpOworCisgIHRidWZmZXIgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX01FTU9SWV9CVUZGRVIsICJidWYiLCBidWYsIE5VTEwpOworICBnX2Fzc2VydCAodGhyaWZ0X21lbW9yeV9idWZmZXJfd3JpdGUgKFRIUklGVF9UUkFOU1BPUlQgKHRidWZmZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ3BvaW50ZXIpIFRFU1RfREFUQSwgMTAsICZlcnJvcikgPT0gVFJVRSk7CisgIGdfYXNzZXJ0IChlcnJvciA9PSBOVUxMKTsKKworICBnX2Fzc2VydCAobWVtY21wIChidWYtPmRhdGEsIFRFU1RfREFUQSwgMTApID09IDApOworICBnX29iamVjdF91bnJlZiAodGJ1ZmZlcik7CiB9CiAKIGludAogbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQogewotICBnX3R5cGVfaW5pdCgpOworI2lmICghR0xJQl9DSEVDS19WRVJTSU9OICgyLCAzNiwgMCkpCisgIGdfdHlwZV9pbml0ICgpOworI2VuZGlmCisKICAgZ190ZXN0X2luaXQgKCZhcmdjLCAmYXJndiwgTlVMTCk7CiAKICAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RtZW1vcnlidWZmZXIvQ3JlYXRlQW5kRGVzdHJveSIsIHRlc3RfY3JlYXRlX2FuZF9kZXN0cm95KTsKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RtZW1vcnlidWZmZXIvQ3JlYXRlQW5kRGVzdHJveUxhcmdlIiwgdGVzdF9jcmVhdGVfYW5kX2Rlc3Ryb3lfbGFyZ2UpOworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdG1lbW9yeWJ1ZmZlci9DcmVhdGVBbmREZXN0cm95VW5saW1pdGVkIiwgdGVzdF9jcmVhdGVfYW5kX2Rlc3Ryb3lfZGVmYXVsdCk7CisgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0bWVtb3J5YnVmZmVyL0NyZWF0ZUFuZERlc3Ryb3lFeHRlcm5hbCIsIHRlc3RfY3JlYXRlX2FuZF9kZXN0cm95X2V4dGVybmFsKTsKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RtZW1vcnlidWZmZXIvQ3JlYXRlQW5kRGVzdHJveVVub3duZWQiLCB0ZXN0X2NyZWF0ZV9hbmRfZGVzdHJveV91bm93bmVkKTsKICAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RtZW1vcnlidWZmZXIvT3BlbkFuZENsb3NlIiwgdGVzdF9vcGVuX2FuZF9jbG9zZSk7CiAgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0bWVtb3J5YnVmZmVyL1JlYWRBbmRXcml0ZSIsIHRlc3RfcmVhZF9hbmRfd3JpdGUpOworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdG1lbW9yeWJ1ZmZlci9SZWFkQW5kV3JpdGVVbmxpbWl0ZWQiLCB0ZXN0X3JlYWRfYW5kX3dyaXRlX2RlZmF1bHQpOworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdG1lbW9yeWJ1ZmZlci9SZWFkQW5kV3JpdGVFeHRlcm5hbCIsIHRlc3RfcmVhZF9hbmRfd3JpdGVfZXh0ZXJuYWwpOwogCiAgIHJldHVybiBnX3Rlc3RfcnVuICgpOwogfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi90ZXN0L3Rlc3RvcHRpb25hbHJlcXVpcmVkLmMgYi9saWIvY19nbGliL3Rlc3QvdGVzdG9wdGlvbmFscmVxdWlyZWQuYwppbmRleCAyODM5ZGQ0Li42MzZjMzZkIDEwMDc1NQotLS0gYS9saWIvY19nbGliL3Rlc3QvdGVzdG9wdGlvbmFscmVxdWlyZWQuYworKysgYi9saWIvY19nbGliL3Rlc3QvdGVzdG9wdGlvbmFscmVxdWlyZWQuYwpAQCAtMTcsNyArMTcsNiBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPGdsaWIuaD4KIAogI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0X3N0cnVjdC5oPgpAQCAtNzQsMjAgKzczLDIwIEBACiAgIHMyID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9TSU1QTEUsIE5VTEwpOwogICBzMyA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfU0lNUExFLCBOVUxMKTsKIAotICAvLyB3cml0ZS10by1yZWFkIHdpdGggb3B0aW9uYWwgZmllbGRzCisgIC8qIHdyaXRlLXRvLXJlYWQgd2l0aCBvcHRpb25hbCBmaWVsZHMgKi8KICAgczEtPmltX29wdGlvbmFsID0gMTA7Ci0gIGFzc2VydCAoczEtPl9faXNzZXRfaW1fZGVmYXVsdCA9PSBGQUxTRSk7Ci0gIGFzc2VydCAoczEtPl9faXNzZXRfaW1fb3B0aW9uYWwgPT0gRkFMU0UpOyAgCisgIGdfYXNzZXJ0IChzMS0+X19pc3NldF9pbV9kZWZhdWx0ID09IEZBTFNFKTsKKyAgZ19hc3NlcnQgKHMxLT5fX2lzc2V0X2ltX29wdGlvbmFsID09IEZBTFNFKTsgIAogICB3cml0ZV90b19yZWFkIChUSFJJRlRfU1RSVUNUIChzMSksIFRIUklGVF9TVFJVQ1QgKHMyKSwgTlVMTCwgTlVMTCk7Ci0gIGFzc2VydCAoczItPl9faXNzZXRfaW1fZGVmYXVsdCA9IFRSVUUpOwotICBhc3NlcnQgKHMyLT5fX2lzc2V0X2ltX29wdGlvbmFsID09IEZBTFNFKTsKLSAgYXNzZXJ0IChzMi0+aW1fb3B0aW9uYWwgPT0gMCk7CisgIGdfYXNzZXJ0IChzMi0+X19pc3NldF9pbV9kZWZhdWx0ID09IFRSVUUpOworICBnX2Fzc2VydCAoczItPl9faXNzZXRfaW1fb3B0aW9uYWwgPT0gRkFMU0UpOworICBnX2Fzc2VydCAoczItPmltX29wdGlvbmFsID09IDApOwogCiAgIHMxLT5fX2lzc2V0X2ltX29wdGlvbmFsID0gVFJVRTsKICAgd3JpdGVfdG9fcmVhZCAoVEhSSUZUX1NUUlVDVCAoczEpLCBUSFJJRlRfU1RSVUNUIChzMyksIE5VTEwsIE5VTEwpOwotICBhc3NlcnQgKHMzLT5fX2lzc2V0X2ltX2RlZmF1bHQgPT0gVFJVRSk7Ci0gIGFzc2VydCAoczMtPl9faXNzZXRfaW1fb3B0aW9uYWwgPT0gVFJVRSk7Ci0gIGFzc2VydCAoczMtPmltX29wdGlvbmFsID09IDEwKTsKKyAgZ19hc3NlcnQgKHMzLT5fX2lzc2V0X2ltX2RlZmF1bHQgPT0gVFJVRSk7CisgIGdfYXNzZXJ0IChzMy0+X19pc3NldF9pbV9vcHRpb25hbCA9PSBUUlVFKTsKKyAgZ19hc3NlcnQgKHMzLT5pbV9vcHRpb25hbCA9PSAxMCk7CiAKICAgZ19vYmplY3RfdW5yZWYgKHMxKTsKICAgZ19vYmplY3RfdW5yZWYgKHMyKTsKQEAgLTEwOSwxMCArMTA4LDEwIEBACiAgIHdyaXRlX3RvX3JlYWQgKFRIUklGVF9TVFJVQ1QgKHQyKSwgVEhSSUZUX1NUUlVDVCAodDEpLCBOVUxMLCBOVUxMKTsKICAgd3JpdGVfdG9fcmVhZCAoVEhSSUZUX1NUUlVDVCAodDEpLCBUSFJJRlRfU1RSVUNUICh0MiksIE5VTEwsIE5VTEwpOwogCi0gIGFzc2VydCAodDEtPl9faXNzZXRfaW1fZGVmYXVsdCA9PSBGQUxTRSk7Ci0gIGFzc2VydCAodDItPl9faXNzZXRfaW1fb3B0aW9uYWwgPT0gVFJVRSk7Ci0gIGFzc2VydCAodDEtPmltX2RlZmF1bHQgPT0gdDItPmltX29wdGlvbmFsKTsKLSAgYXNzZXJ0ICh0MS0+aW1fZGVmYXVsdCA9PSAwKTsKKyAgZ19hc3NlcnQgKHQxLT5fX2lzc2V0X2ltX2RlZmF1bHQgPT0gRkFMU0UpOworICBnX2Fzc2VydCAodDItPl9faXNzZXRfaW1fb3B0aW9uYWwgPT0gVFJVRSk7CisgIGdfYXNzZXJ0ICh0MS0+aW1fZGVmYXVsdCA9PSB0Mi0+aW1fb3B0aW9uYWwpOworICBnX2Fzc2VydCAodDEtPmltX2RlZmF1bHQgPT0gMCk7CiAKICAgZ19vYmplY3RfdW5yZWYgKHQxKTsKICAgZ19vYmplY3RfdW5yZWYgKHQyKTsKQEAgLTEzMyw3ICsxMzIsNyBAQAogICB3cml0ZV90b19yZWFkIChUSFJJRlRfU1RSVUNUICh0MSksIFRIUklGVF9TVFJVQ1QgKHQzKSwgTlVMTCwgTlVMTCk7CiAgIHdyaXRlX3RvX3JlYWQgKFRIUklGVF9TVFJVQ1QgKHQzKSwgVEhSSUZUX1NUUlVDVCAodDEpLCBOVUxMLCBOVUxMKTsKIAotICBhc3NlcnQgKHQxLT5fX2lzc2V0X2ltX2RlZmF1bHQgPT0gVFJVRSk7CisgIGdfYXNzZXJ0ICh0MS0+X19pc3NldF9pbV9kZWZhdWx0ID09IFRSVUUpOwogCiAgIGdfb2JqZWN0X3VucmVmICh0MSk7CiAgIGdfb2JqZWN0X3VucmVmICh0Myk7CkBAIC0xNzQsMjMgKzE3Myw0NiBAQAogICB0MiA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfVFJJQ0tZMiwgTlVMTCk7CiAgIHQzID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9UUklDS1kzLCBOVUxMKTsKIAotICAvLyB0aHJvd3MgcHJvdG9jb2wgZXhjZXB0aW9uCisgIC8qIHRocm93cyBwcm90b2NvbCBleGNlcHRpb24gKi8KICAgd3JpdGVfdG9fcmVhZCAoVEhSSUZUX1NUUlVDVCAodDIpLCBUSFJJRlRfU1RSVUNUICh0MyksIE5VTEwsICZyZWFkX2Vycm9yKTsKLSAgYXNzZXJ0IChyZWFkX2Vycm9yICE9IE5VTEwpOworICBnX2Fzc2VydCAocmVhZF9lcnJvciAhPSBOVUxMKTsKICAgZ19lcnJvcl9mcmVlIChyZWFkX2Vycm9yKTsKIAogICB3cml0ZV90b19yZWFkIChUSFJJRlRfU1RSVUNUICh0MyksIFRIUklGVF9TVFJVQ1QgKHQyKSwgTlVMTCwgTlVMTCk7CiAKLSAgYXNzZXJ0ICh0Mi0+X19pc3NldF9pbV9vcHRpb25hbCk7CisgIGdfYXNzZXJ0ICh0Mi0+X19pc3NldF9pbV9vcHRpb25hbCk7CiAKICAgZ19vYmplY3RfdW5yZWYgKHQyKTsKICAgZ19vYmplY3RfdW5yZWYgKHQzKTsKIH0KIAorc3RhdGljIHZvaWQKK3Rlc3Rfbm9uX3NldF9iaW5hcnkgKHZvaWQpCit7CisgIFRUZXN0QmluYXJpZXMgKmIxID0gTlVMTDsKKyAgVFRlc3RCaW5hcmllcyAqYjIgPSBOVUxMOworICBHRXJyb3IgKmVycm9yID0gTlVMTDsKKworICBiMSA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfQklOQVJJRVMsIE5VTEwpOworICBiMiA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfQklOQVJJRVMsIE5VTEwpOworCisgIHdyaXRlX3RvX3JlYWQgKFRIUklGVF9TVFJVQ1QgKGIxKSwgVEhSSUZUX1NUUlVDVCAoYjIpLCBOVUxMLCAmZXJyb3IpOworICBnX2Fzc2VydCghZXJyb3IpOworICB3cml0ZV90b19yZWFkIChUSFJJRlRfU1RSVUNUIChiMiksIFRIUklGVF9TVFJVQ1QgKGIxKSwgTlVMTCwgJmVycm9yKTsKKyAgZ19hc3NlcnQoIWVycm9yKTsKKyAgLyogT0suIE5vIHNlZ2ZhdWx0ICovCisKKyAgZ19vYmplY3RfdW5yZWYgKGIxKTsKKyAgZ19vYmplY3RfdW5yZWYgKGIyKTsKK30KKwogaW50CiBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCiB7CisjaWYgKCFHTElCX0NIRUNLX1ZFUlNJT04gKDIsIDM2LCAwKSkKICAgZ190eXBlX2luaXQoKTsKKyNlbmRpZgorCiAgIGdfdGVzdF9pbml0ICgmYXJnYywgJmFyZ3YsIE5VTEwpOwogCiAgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0b3B0aW9uYWxyZXF1aXJlZC9PbGRTY2hvb2wiLCB0ZXN0X29sZF9zY2hvb2wxKTsKQEAgLTE5OSw2ICsyMjEsNyBAQAogICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdG9wdGlvbmFscmVxdWlyZWQvVHJpY2t5MiIsIHRlc3RfdHJpY2t5Mik7CiAgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0b3B0aW9uYWxyZXF1aXJlZC9Ucmlja3kzIiwgdGVzdF90cmlja3kzKTsKICAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RvcHRpb25hbHJlcXVpcmVkL1RyaWNreTQiLCB0ZXN0X3RyaWNreTQpOworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdG9wdGlvbmFscmVxdWlyZWQvQmluYXJ5IiwgdGVzdF9ub25fc2V0X2JpbmFyeSk7CiAKICAgcmV0dXJuIGdfdGVzdF9ydW4gKCk7CiB9CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3Rlc3QvdGVzdHNlcmlhbGl6YXRpb24uYyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0c2VyaWFsaXphdGlvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3ZDQxMWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3Rlc3QvdGVzdHNlcmlhbGl6YXRpb24uYwpAQCAtMCwwICsxLDk1IEBACisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfbWVtb3J5X2J1ZmZlci5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaD4KKyNpbmNsdWRlICJnZW4tY19nbGliL3RfdGVzdF9kZWJ1Z19wcm90b190ZXN0X3R5cGVzLmgiCisjaW5jbHVkZSAiZ2VuLWNfZ2xpYi90X3Rlc3RfZW51bV90ZXN0X3R5cGVzLmgiCisKK3N0YXRpYyB2b2lkIGVudW1fY29uc3RhbnRzX3JlYWRfd3JpdGUoKSB7CisgIEdFcnJvciogZXJyb3IgPSBOVUxMOworICBUaHJpZnRUcmFuc3BvcnQqIHRyYW5zcG9ydAorICAgICAgPSBUSFJJRlRfVFJBTlNQT1JUKGdfb2JqZWN0X25ldyhUSFJJRlRfVFlQRV9NRU1PUllfQlVGRkVSLCAiYnVmX3NpemUiLCAxMDI0LCBOVUxMKSk7CisgIFRocmlmdFByb3RvY29sKiBwcm90b2NvbAorICAgICAgPSBUSFJJRlRfUFJPVE9DT0woZ19vYmplY3RfbmV3KFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTCwgInRyYW5zcG9ydCIsIHRyYW5zcG9ydCwgTlVMTCkpOworICBUVGVzdEVudW1UZXN0U3RydWN0KiBzcmMgPSBUX1RFU1RfRU5VTV9URVNUOworICBUVGVzdEVudW1UZXN0U3RydWN0KiBkc3QgPSBnX29iamVjdF9uZXcoVF9URVNUX1RZUEVfRU5VTV9URVNUX1NUUlVDVCwgTlVMTCk7CisgIFRUZXN0RW51bVRlc3RTdHJ1Y3RDbGFzcyogY2xzID0gVF9URVNUX0VOVU1fVEVTVF9TVFJVQ1RfR0VUX0NMQVNTKHNyYyk7CisgIGludCB3cml0ZV9sZW47CisgIGludCByZWFkX2xlbjsKKworICB3cml0ZV9sZW4gPSBUSFJJRlRfU1RSVUNUX0NMQVNTKGNscyktPndyaXRlKFRIUklGVF9TVFJVQ1Qoc3JjKSwgcHJvdG9jb2wsICZlcnJvcik7CisgIGdfYXNzZXJ0KCFlcnJvcik7CisgIGdfYXNzZXJ0KHdyaXRlX2xlbiA+IDApOworCisgIHJlYWRfbGVuID0gVEhSSUZUX1NUUlVDVF9DTEFTUyhjbHMpLT5yZWFkKFRIUklGVF9TVFJVQ1QoZHN0KSwgcHJvdG9jb2wsICZlcnJvcik7CisgIGdfYXNzZXJ0KCFlcnJvcik7CisgIGdfYXNzZXJ0X2NtcGludCh3cml0ZV9sZW4sID09LCByZWFkX2xlbik7CisKKyAgZ19vYmplY3RfdW5yZWYoZHN0KTsKKyAgZ19vYmplY3RfdW5yZWYocHJvdG9jb2wpOworICBnX29iamVjdF91bnJlZih0cmFuc3BvcnQpOworfQorCitzdGF0aWMgdm9pZCBzdHJ1Y3RfY29uc3RhbnRzX3JlYWRfd3JpdGUoKSB7CisgIEdFcnJvciogZXJyb3IgPSBOVUxMOworICBUaHJpZnRUcmFuc3BvcnQqIHRyYW5zcG9ydAorICAgICAgPSBUSFJJRlRfVFJBTlNQT1JUKGdfb2JqZWN0X25ldyhUSFJJRlRfVFlQRV9NRU1PUllfQlVGRkVSLCAiYnVmX3NpemUiLCA0MDk2LCBOVUxMKSk7CisgIFRocmlmdFByb3RvY29sKiBwcm90b2NvbAorICAgICAgPSBUSFJJRlRfUFJPVE9DT0woZ19vYmplY3RfbmV3KFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTCwgInRyYW5zcG9ydCIsIHRyYW5zcG9ydCwgTlVMTCkpOworICBUVGVzdENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QqIHNyYyA9IFRfVEVTVF9DT01QQUNUX1RFU1Q7CisgIFRUZXN0Q29tcGFjdFByb3RvVGVzdFN0cnVjdCogZHN0ID0gZ19vYmplY3RfbmV3KFRfVEVTVF9UWVBFX0NPTVBBQ1RfUFJPVE9fVEVTVF9TVFJVQ1QsIE5VTEwpOworICBUVGVzdENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RDbGFzcyogY2xzID0gVF9URVNUX0NPTVBBQ1RfUFJPVE9fVEVTVF9TVFJVQ1RfR0VUX0NMQVNTKHNyYyk7CisgIGludCB3cml0ZV9sZW47CisgIGludCByZWFkX2xlbjsKKworICB3cml0ZV9sZW4gPSBUSFJJRlRfU1RSVUNUX0NMQVNTKGNscyktPndyaXRlKFRIUklGVF9TVFJVQ1Qoc3JjKSwgcHJvdG9jb2wsICZlcnJvcik7CisgIGdfYXNzZXJ0KCFlcnJvcik7CisgIGdfYXNzZXJ0KHdyaXRlX2xlbiA+IDApOworCisgIHJlYWRfbGVuID0gVEhSSUZUX1NUUlVDVF9DTEFTUyhjbHMpLT5yZWFkKFRIUklGVF9TVFJVQ1QoZHN0KSwgcHJvdG9jb2wsICZlcnJvcik7CisgIGdfYXNzZXJ0KCFlcnJvcik7CisgIGdfYXNzZXJ0X2NtcGludCh3cml0ZV9sZW4sID09LCByZWFkX2xlbik7CisKKyAgZ19vYmplY3RfdW5yZWYoZHN0KTsKKyAgZ19vYmplY3RfdW5yZWYocHJvdG9jb2wpOworICBnX29iamVjdF91bnJlZih0cmFuc3BvcnQpOworfQorCitzdGF0aWMgdm9pZCBzdHJ1Y3RfcmVhZF93cml0ZV9sZW5ndGhfc2hvdWxkX2VxdWFsKCkgeworICBHRXJyb3IqIGVycm9yID0gTlVMTDsKKyAgVGhyaWZ0VHJhbnNwb3J0KiB0cmFuc3BvcnQKKyAgICAgID0gVEhSSUZUX1RSQU5TUE9SVChnX29iamVjdF9uZXcoVEhSSUZUX1RZUEVfTUVNT1JZX0JVRkZFUiwgImJ1Zl9zaXplIiwgMjA0OCwgTlVMTCkpOworICBUaHJpZnRQcm90b2NvbCogcHJvdG9jb2wKKyAgICAgID0gVEhSSUZUX1BST1RPQ09MKGdfb2JqZWN0X25ldyhUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0wsICJ0cmFuc3BvcnQiLCB0cmFuc3BvcnQsIE5VTEwpKTsKKyAgVFRlc3RCb25rKiBzcmMgPSBnX29iamVjdF9uZXcoVF9URVNUX1RZUEVfQk9OSywgTlVMTCk7CisgIFRUZXN0Qm9uayogZHN0ID0gZ19vYmplY3RfbmV3KFRfVEVTVF9UWVBFX0JPTkssIE5VTEwpOworICBUVGVzdEJvbmtDbGFzcyogY2xzID0gVF9URVNUX0JPTktfR0VUX0NMQVNTKHNyYyk7CisgIGludCB3cml0ZV9sZW47CisgIGludCByZWFkX2xlbjsKKworICB3cml0ZV9sZW4gPSBUSFJJRlRfU1RSVUNUX0NMQVNTKGNscyktPndyaXRlKFRIUklGVF9TVFJVQ1Qoc3JjKSwgcHJvdG9jb2wsICZlcnJvcik7CisgIGdfYXNzZXJ0KCFlcnJvcik7CisgIGdfYXNzZXJ0KHdyaXRlX2xlbiA+IDApOworCisgIHJlYWRfbGVuID0gVEhSSUZUX1NUUlVDVF9DTEFTUyhjbHMpLT5yZWFkKFRIUklGVF9TVFJVQ1QoZHN0KSwgcHJvdG9jb2wsICZlcnJvcik7CisgIGdfYXNzZXJ0KCFlcnJvcik7CisgIGdfYXNzZXJ0X2NtcGludCh3cml0ZV9sZW4sID09LCByZWFkX2xlbik7CisKKyAgZ19vYmplY3RfdW5yZWYoZHN0KTsKKyAgZ19vYmplY3RfdW5yZWYoc3JjKTsKKyAgZ19vYmplY3RfdW5yZWYocHJvdG9jb2wpOworICBnX29iamVjdF91bnJlZih0cmFuc3BvcnQpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKSB7CisjaWYgKCFHTElCX0NIRUNLX1ZFUlNJT04oMiwgMzYsIDApKQorICBnX3R5cGVfaW5pdCgpOworI2VuZGlmCisgIGdfdGVzdF9pbml0KCZhcmdjLCAmYXJndiwgTlVMTCk7CisKKyAgZ190ZXN0X2FkZF9mdW5jKCIvdGVzdHNlcmlhbGl6YXRpb24vU3RydWN0UmVhZFdyaXRlTGVuZ3RoU2hvdWxkRXF1YWwiLAorICAgICAgICAgICAgICAgICAgc3RydWN0X3JlYWRfd3JpdGVfbGVuZ3RoX3Nob3VsZF9lcXVhbCk7CisgIGdfdGVzdF9hZGRfZnVuYygiL3Rlc3RzZXJpYWxpemF0aW9uL1N0cnVjdENvbnN0YW50cyIsIHN0cnVjdF9jb25zdGFudHNfcmVhZF93cml0ZSk7CisgIGdfdGVzdF9hZGRfZnVuYygiL3Rlc3RzZXJpYWxpemF0aW9uL0VudW1Db25zdGFudHMiLCBlbnVtX2NvbnN0YW50c19yZWFkX3dyaXRlKTsKKyAgcmV0dXJuIGdfdGVzdF9ydW4oKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvdGVzdC90ZXN0c2ltcGxlc2VydmVyLmMgYi9saWIvY19nbGliL3Rlc3QvdGVzdHNpbXBsZXNlcnZlci5jCmluZGV4IDkyNjI5YjQuLjNjNmYyZTggMTAwNzU1Ci0tLSBhL2xpYi9jX2dsaWIvdGVzdC90ZXN0c2ltcGxlc2VydmVyLmMKKysrIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3RzaW1wbGVzZXJ2ZXIuYwpAQCAtMTcsNyArMTcsNiBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPGdsaWIuaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KQEAgLTUzLDYgKzUyLDExIEBACiB0ZXN0X3Byb2Nlc3Nvcl9wcm9jZXNzIChUaHJpZnRQcm9jZXNzb3IgKnByb2Nlc3NvciwgVGhyaWZ0UHJvdG9jb2wgKmluLAogICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0UHJvdG9jb2wgKm91dCwgR0Vycm9yICoqZXJyb3IpCiB7CisgIFRIUklGVF9VTlVTRURfVkFSIChwcm9jZXNzb3IpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoaW4pOworICBUSFJJRlRfVU5VU0VEX1ZBUiAob3V0KTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKwogICByZXR1cm4gRkFMU0U7CiB9CiAKQEAgLTg0LDcgKzg4LDcgQEAKIAogICAvKiBydW4gdGhlIHNlcnZlciBpbiBhIGNoaWxkIHByb2Nlc3MgKi8KICAgcGlkID0gZm9yayAoKTsKLSAgYXNzZXJ0IChwaWQgPj0gMCk7CisgIGdfYXNzZXJ0IChwaWQgPj0gMCk7CiAKICAgaWYgKHBpZCA9PSAwKQogICB7CkBAIC05OCwxNSArMTAyLDE4IEBACiAgICAgZ19vYmplY3RfdW5yZWYgKHNzKTsKICAgICBnX29iamVjdF91bnJlZiAodHNzKTsKICAgICBnX29iamVjdF91bnJlZiAocCk7Ci0gICAgYXNzZXJ0ICh3YWl0ICgmc3RhdHVzKSA9PSBwaWQpOwotICAgIGFzc2VydCAoc3RhdHVzID09IFNJR0lOVCk7CisgICAgZ19hc3NlcnQgKHdhaXQgKCZzdGF0dXMpID09IHBpZCk7CisgICAgZ19hc3NlcnQgKHN0YXR1cyA9PSBTSUdJTlQpOwogICB9CiB9CiAKIGludAogbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQogeworI2lmICghR0xJQl9DSEVDS19WRVJTSU9OICgyLCAzNiwgMCkpCiAgIGdfdHlwZV9pbml0KCk7CisjZW5kaWYKKwogICBnX3Rlc3RfaW5pdCAoJmFyZ2MsICZhcmd2LCBOVUxMKTsKIAogICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdHNpbXBsZXNlcnZlci9TaW1wbGVTZXJ2ZXIiLCB0ZXN0X3NlcnZlcik7CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3Rlc3QvdGVzdHN0cnVjdC5jIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3RzdHJ1Y3QuYwppbmRleCAxODJhNmFjLi5kMTIwY2JjIDEwMDc1NQotLS0gYS9saWIvY19nbGliL3Rlc3QvdGVzdHN0cnVjdC5jCisrKyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0c3RydWN0LmMKQEAgLTE3LDcgKzE3LDYgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlIDxhc3NlcnQuaD4KICNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgogCiAjaW5jbHVkZSAiLi4vc3JjL3RocmlmdC9jX2dsaWIvdGhyaWZ0X3N0cnVjdC5jIgpAQCAtNTEsNiArNTAsMTAgQEAKIHRocmlmdF90ZXN0X3N0cnVjdF9yZWFkIChUaHJpZnRTdHJ1Y3QgKm9iamVjdCwgVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQogeworICBUSFJJRlRfVU5VU0VEX1ZBUiAob2JqZWN0KTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHByb3RvY29sKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKwogICByZXR1cm4gMDsKIH0KIApAQCAtNTgsNiArNjEsMTAgQEAKIHRocmlmdF90ZXN0X3N0cnVjdF93cml0ZSAoVGhyaWZ0U3RydWN0ICpvYmplY3QsIFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCiB7CisgIFRIUklGVF9VTlVTRURfVkFSIChvYmplY3QpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHJvdG9jb2wpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworCiAgIHJldHVybiAwOwogfQogCkBAIC04MSw3ICs4OCw3IEBACiAgIFRocmlmdFRlc3RTdHJ1Y3QgKnQgPSBOVUxMOwogCiAgIHQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1RFU1RfU1RSVUNULCBOVUxMKTsKLSAgYXNzZXJ0ICggVEhSSUZUX0lTX1NUUlVDVCAodCkpOworICBnX2Fzc2VydCAoIFRIUklGVF9JU19TVFJVQ1QgKHQpKTsKICAgdGhyaWZ0X3N0cnVjdF9yZWFkIChUSFJJRlRfU1RSVUNUICh0KSwgTlVMTCwgTlVMTCk7CiAgIHRocmlmdF9zdHJ1Y3Rfd3JpdGUgKFRIUklGVF9TVFJVQ1QgKHQpLCBOVUxMLCBOVUxMKTsKICAgdGhyaWZ0X3Rlc3Rfc3RydWN0X3JlYWQgKFRIUklGVF9TVFJVQ1QgKHQpLCBOVUxMLCBOVUxMKTsKQEAgLTkyLDcgKzk5LDEwIEBACiBpbnQKIG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKIHsKKyNpZiAoIUdMSUJfQ0hFQ0tfVkVSU0lPTiAoMiwgMzYsIDApKQogICBnX3R5cGVfaW5pdCgpOworI2VuZGlmCisKICAgZ190ZXN0X2luaXQgKCZhcmdjLCAmYXJndiwgTlVMTCk7CiAKICAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RzdHJ1Y3QvSW5pdGlhbGl6ZU9iamVjdCIsIHRlc3RfaW5pdGlhbGl6ZV9vYmplY3QpOwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi90ZXN0L3Rlc3R0aHJpZnR0ZXN0LmMgYi9saWIvY19nbGliL3Rlc3QvdGVzdHRocmlmdHRlc3QuYwppbmRleCBhNDJkMDg5Li4yM2E5MzRkIDEwMDc1NQotLS0gYS9saWIvY19nbGliL3Rlc3QvdGVzdHRocmlmdHRlc3QuYworKysgYi9saWIvY19nbGliL3Rlc3QvdGVzdHRocmlmdHRlc3QuYwpAQCAtMSwxNCArMSwxNyBAQAotI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPG5ldGRiLmg+CiAKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdC5oPgogI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl9zb2NrZXQuaD4KIAorI2luY2x1ZGUgInRfdGVzdF90aHJpZnRfdGVzdF90eXBlcy5oIgorI2luY2x1ZGUgInRocmlmdF90ZXN0X2hhbmRsZXIuaCIKKwogc3RhdGljIGNvbnN0IGNoYXIgVEVTVF9BRERSRVNTW10gPSAibG9jYWxob3N0IjsKIHN0YXRpYyBjb25zdCBpbnQgVEVTVF9QT1JUID0gNjQ0NDQ7CiAKIHN0YXRpYyB2b2lkCi10ZXN0X3RocmlmdF9zZXJ2ZXIgKGNvbnN0IGludCBwb3J0KQordGVzdF90aHJpZnRfc2VydmVyICh2b2lkKQogewogICBUaHJpZnRTZXJ2ZXJTb2NrZXQgKnRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NFUlZFUl9TT0NLRVQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQiLCBURVNUX1BPUlQsIE5VTEwpOwpAQCAtMTYsMTMgKzE5LDk0IEBACiAgIGdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKIH0KIAorc3RhdGljIHZvaWQKK3NldF9pbmRpY2F0b3IgKGdwb2ludGVyIGRhdGEsIEdPYmplY3QgKndoZXJlX3RoZV9vYmplY3Rfd2FzKSB7CisgIFRIUklGVF9VTlVTRURfVkFSKHdoZXJlX3RoZV9vYmplY3Rfd2FzKTsKKworICAqKGdib29sZWFuICopIGRhdGEgPSBUUlVFOworfQorCitzdGF0aWMgdm9pZAordGVzdF90aHJpZnRfaGFuZGxlciAodm9pZCkKK3sKKyAgR0Vycm9yICplcnJvcjsKKyAgR0hhc2hUYWJsZSAqX3JldHVybjsKKyAgVFRlc3RJbnNhbml0eSAqYXJndW1lbnQ7CisgIGdib29sZWFuIGluZGljYXRvcjsKKworICBUVGVzdFh0cnVjdCAgKnh0cnVjdCwgICp4dHJ1Y3QyOworICBUVGVzdE51bWJlcnogbnVtYmVyejsKKyAgVFRlc3ROdW1iZXJ6IG51bWJlcnoyOworICBUVGVzdFVzZXJJZCB1c2VyX2lkLCAqdXNlcl9pZF9wdHIsICp1c2VyX2lkX3B0cjI7CisgIEdIYXNoVGFibGUgKnVzZXJfbWFwOworICBHUHRyQXJyYXkgKnh0cnVjdHM7CisKKyAgZXJyb3IgPSBOVUxMOworICBpbmRpY2F0b3IgPSBGQUxTRTsKKworICB1c2VyX21hcCA9IE5VTEw7CisgIHh0cnVjdHMgPSBOVUxMOworCisgIGFyZ3VtZW50ID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9JTlNBTklUWSwgTlVMTCk7CisgIGdfb2JqZWN0X2dldCAoYXJndW1lbnQsCisgICAgICAgICAgICAgICAgInVzZXJNYXAiLCAmdXNlcl9tYXAsCisgICAgICAgICAgICAgICAgInh0cnVjdHMiLCAmeHRydWN0cywKKyAgICAgICAgICAgICAgICBOVUxMKTsKKworICBudW1iZXJ6ID0gVF9URVNUX05VTUJFUlpfRklWRTsKKyAgbnVtYmVyejIgPSBUX1RFU1RfTlVNQkVSWl9FSUdIVDsKKyAgdXNlcl9pZF9wdHIgPSBnX21hbGxvYyAoc2l6ZW9mICp1c2VyX2lkX3B0cik7CisgICp1c2VyX2lkX3B0ciA9IDU7CisgIHVzZXJfaWRfcHRyMiA9IGdfbWFsbG9jIChzaXplb2YgKnVzZXJfaWRfcHRyKTsKKyAgKnVzZXJfaWRfcHRyMiA9IDg7CisgIGdfaGFzaF90YWJsZV9pbnNlcnQgKHVzZXJfbWFwLCAoZ3BvaW50ZXIpbnVtYmVyeiwgdXNlcl9pZF9wdHIpOworICBnX2hhc2hfdGFibGVfaW5zZXJ0ICh1c2VyX21hcCwgKGdwb2ludGVyKW51bWJlcnoyLCB1c2VyX2lkX3B0cjIpOworICBnX2hhc2hfdGFibGVfdW5yZWYgKHVzZXJfbWFwKTsKKworICB4dHJ1Y3QgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX1hUUlVDVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAic3RyaW5nX3RoaW5nIiwgIkhlbGxvMiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgImJ5dGVfdGhpbmciLCAgIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgImkzMl90aGluZyIsICAgIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgImk2NF90aGluZyIsICAgIDJMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgeHRydWN0MiA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfWFRSVUNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAic3RyaW5nX3RoaW5nIiwgIkdvb2RieWU0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImJ5dGVfdGhpbmciLCAgIDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJpMzJfdGhpbmciLCAgICA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAiaTY0X3RoaW5nIiwgICAgNExMLAorICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgZ19wdHJfYXJyYXlfYWRkICh4dHJ1Y3RzLCB4dHJ1Y3QyKTsKKyAgZ19wdHJfYXJyYXlfYWRkICh4dHJ1Y3RzLCB4dHJ1Y3QpOworICBnX3B0cl9hcnJheV91bnJlZiAoeHRydWN0cyk7CisKKyAgX3JldHVybiA9IGdfaGFzaF90YWJsZV9uZXdfZnVsbCAoZ19pbnQ2NF9oYXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnX2ludDY0X2VxdWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnX2ZyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChHRGVzdHJveU5vdGlmeSlnX2hhc2hfdGFibGVfdW5yZWYpOworCisgIGdfb2JqZWN0X3dlYWtfcmVmIChHX09CSkVDVCAoYXJndW1lbnQpLCBzZXRfaW5kaWNhdG9yLCAoZ3BvaW50ZXIpICZpbmRpY2F0b3IpOworCisgIGdfYXNzZXJ0ICh0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3RfaW5zYW5pdHkgKE5VTEwsICZfcmV0dXJuLCBhcmd1bWVudCwgJmVycm9yKSk7CisgIGdfYXNzZXJ0ICghIGluZGljYXRvcik7CisKKyAgZ19oYXNoX3RhYmxlX3VucmVmIChfcmV0dXJuKTsKKyAgZ19hc3NlcnQgKCEgaW5kaWNhdG9yKTsKKworICBnX29iamVjdF91bnJlZiAoYXJndW1lbnQpOworICBnX2Fzc2VydCAoaW5kaWNhdG9yKTsKK30KKwogaW50CiBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCiB7CisjaWYgKCFHTElCX0NIRUNLX1ZFUlNJT04gKDIsIDM2LCAwKSkKICAgZ190eXBlX2luaXQoKTsKKyNlbmRpZgorCiAgIGdfdGVzdF9pbml0ICgmYXJnYywgJmFyZ3YsIE5VTEwpOwogCiAgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0dGhyaWZ0L1NlcnZlciIsIHRlc3RfdGhyaWZ0X3NlcnZlcik7CisgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0dGhyaWZ0L0hhbmRsZXIiLCB0ZXN0X3RocmlmdF9oYW5kbGVyKTsKIAogICByZXR1cm4gZ190ZXN0X3J1biAoKTsKIH0KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvdGVzdC90ZXN0dGhyaWZ0dGVzdGNsaWVudC5jcHAgYi9saWIvY19nbGliL3Rlc3QvdGVzdHRocmlmdHRlc3RjbGllbnQuY3BwCmluZGV4IGY0ZTMyNTAuLjE5MTBjOGEgMTAwNzU1Ci0tLSBhL2xpYi9jX2dsaWIvdGVzdC90ZXN0dGhyaWZ0dGVzdGNsaWVudC5jcHAKKysrIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3R0aHJpZnR0ZXN0Y2xpZW50LmNwcApAQCAtMTcsNyArMTcsNyBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotLyogdGVzdCBhIEMgY2xpZW50IHdpdGggYSBDKysgc2VydmVyICovCisvKiB0ZXN0IGEgQyBjbGllbnQgd2l0aCBhIEMrKyBzZXJ2ZXIgICh0aGF0IG1ha2VzIHNlbnNlLi4uKSAqLwogCiAjaW5jbHVkZSA8c2lnbmFsLmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CkBAIC0yNSwyMyArMjUsMzQgQEAKICNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1REZWJ1Z1Byb3RvY29sLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UU2ltcGxlU2VydmVyLmg+CisjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oPgogI2luY2x1ZGUgIlRocmlmdFRlc3QuaCIKICNpbmNsdWRlICJUaHJpZnRUZXN0X3R5cGVzLmgiCiAKICNpbmNsdWRlIDxpb3N0cmVhbT4KLQotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLXVzaW5nIG5hbWVzcGFjZSBib29zdDsKKyNpbmNsdWRlIDxtYXA+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+ICAmYXJnMywgY29uc3QgTnVtYmVyejo6dHlwZSBhcmc0LCBjb25zdCBVc2VySWQgYXJnNSkgewotICAgIHByaW50ZigiW0MgLT4gQysrXSB0ZXN0TXVsdGkoKVxuIik7CisgICAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRSAoYXJnMyk7CisgICAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRSAoYXJnNCk7CisgICAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRSAoYXJnNSk7CisKKyAgICBjb3V0IDw8ICJbQyAtPiBDKytdIHRlc3RNdWx0aSgpIiA8PCBlbmRsOwogCiAgICAgaGVsbG8uc3RyaW5nX3RoaW5nID0gIkhlbGxvMiI7CiAgICAgaGVsbG8uYnl0ZV90aGluZyA9IGFyZzA7CkBAIC0yNjYsNyArMjkzLDcgQEAKICAgdm9pZCB0ZXN0RXhjZXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nICZhcmcpCiAgICAgdGhyb3coWGNlcHRpb24sIGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uKQogICB7Ci0gICAgcHJpbnRmKCJbQyAtPiBDKytdIHRlc3RFeGNlcHRpb24oJXMpXG4iLCBhcmcuY19zdHIoKSk7CisgICAgY291dCA8PCAiW0MgLT4gQysrXSB0ZXN0RXhjZXB0aW9uKCIgPDwgYXJnIDw8ICIpIiA8PCBlbmRsOwogICAgIGlmIChhcmcuY29tcGFyZSgiWGNlcHRpb24iKSA9PSAwKSB7CiAgICAgICBYY2VwdGlvbiBlOwogICAgICAgZS5lcnJvckNvZGUgPSAxMDAxOwpAQCAtMjg0LDcgKzMxMSw3IEBACiAKICAgdm9pZCB0ZXN0TXVsdGlFeGNlcHRpb24oWHRydWN0ICZyZXN1bHQsIGNvbnN0IHN0ZDo6c3RyaW5nICZhcmcwLCBjb25zdCBzdGQ6OnN0cmluZyAmYXJnMSkgdGhyb3coWGNlcHRpb24sIFhjZXB0aW9uMikgewogCi0gICAgcHJpbnRmKCJbQyAtPiBDKytdIHRlc3RNdWx0aUV4Y2VwdGlvbiglcywgJXMpXG4iLCBhcmcwLmNfc3RyKCksIGFyZzEuY19zdHIoKSk7CisgICAgY291dCA8PCAiW0MgLT4gQysrXSB0ZXN0TXVsdGlFeGNlcHRpb24oIiA8PCBhcmcwIDw8ICIsICIgPDwgYXJnMSA8PCAiKSIgPDwgZW5kbDsKIAogICAgIGlmIChhcmcwLmNvbXBhcmUoIlhjZXB0aW9uIikgPT0gMCkgewogICAgICAgWGNlcHRpb24gZTsKQEAgLTMwMywxNSArMzMwLDE3IEBACiAgIH0KIAogICB2b2lkIHRlc3RPbmV3YXkoaW50IHNsZWVwRm9yKSB7Ci0gICAgcHJpbnRmKCJ0ZXN0T25ld2F5KCVkKTogU2xlZXBpbmcuLi5cbiIsIHNsZWVwRm9yKTsKKyAgICBjb3V0IDw8ICJ0ZXN0T25ld2F5KCIgPDwgc2xlZXBGb3IgPDwgIik6IFNsZWVwaW5nLi4uIiA8PCBlbmRsOwogICAgIHNsZWVwKHNsZWVwRm9yKTsKLSAgICBwcmludGYoInRlc3RPbmV3YXkoJWQpOiBkb25lIHNsZWVwaW5nIVxuIiwgc2xlZXBGb3IpOworICAgIGNvdXQgPDwgInRlc3RPbmV3YXkoIiA8PCBzbGVlcEZvciA8PCAiKTogZG9uZSBzbGVlcGluZyEiIDw8IGVuZGw7CiAgIH0KIH07CiAKIC8vIEMgQ0xJRU5UCiBleHRlcm4gIkMiIHsKIAorI3VuZGVmIFRIUklGVF9TT0NLRVQgLyogZnJvbSBsaWIvY3BwICovCisKICNpbmNsdWRlICJ0X3Rlc3RfdGhyaWZ0X3Rlc3QuaCIKICNpbmNsdWRlICJ0X3Rlc3RfdGhyaWZ0X3Rlc3RfdHlwZXMuaCIKICNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc29ja2V0Lmg+CkBAIC0zMjksNyArMzU4LDcgQEAKICAgZ2NoYXIgKnN0cmluZyA9IE5VTEw7CiAgIGdpbnQ4IGJ5dGUgPSAwOwogICBnaW50MTYgaTE2ID0gMDsKLSAgZ2ludDMyIGkzMiA9IDAsIGFub3RoZXJfaTMyID0gNTY3ODk7IAorICBnaW50MzIgaTMyID0gMCwgYW5vdGhlcl9pMzIgPSA1Njc4OTsKICAgZ2ludDY0IGk2NCA9IDA7CiAgIGRvdWJsZSBkYmwgPSAwLjA7CiAgIFRUZXN0WHRydWN0ICp4dHJ1Y3RfaW4sICp4dHJ1Y3Rfb3V0OwpAQCAtMzM4LDcgKzM2Nyw3IEBACiAgIEdIYXNoVGFibGUgKnNldF9pbiA9IE5VTEwsICpzZXRfb3V0ID0gTlVMTDsKICAgR0FycmF5ICpsaXN0X2luID0gTlVMTCwgKmxpc3Rfb3V0ID0gTlVMTDsKICAgVFRlc3ROdW1iZXJ6IGVudW1faW4sIGVudW1fb3V0OwotICBUVGVzdFVzZXJJZCB1c2VyX2lkX2luLCB1c2VyX2lkX291dDsgCisgIFRUZXN0VXNlcklkIHVzZXJfaWRfaW4sIHVzZXJfaWRfb3V0OwogICBHSGFzaFRhYmxlICppbnNhbml0eV9pbiA9IE5VTEw7CiAgIFRUZXN0WHRydWN0ICp4dHJ1Y3QxLCAqeHRydWN0MjsKICAgVFRlc3RJbnNhbml0eSAqaW5zYW5pdHlfb3V0ID0gTlVMTDsKQEAgLTM0NywxMSArMzc2LDEzIEBACiAgIFRUZXN0WGNlcHRpb24gKnhjZXB0aW9uID0gTlVMTDsKICAgVFRlc3RYY2VwdGlvbjIgKnhjZXB0aW9uMiA9IE5VTEw7CiAKKyNpZiAoIUdMSUJfQ0hFQ0tfVkVSU0lPTiAoMiwgMzYsIDApKQogICAvLyBpbml0aWFsaXplIGdvYmplY3QKICAgZ190eXBlX2luaXQgKCk7CisjZW5kaWYKIAogICAvLyBjcmVhdGUgYSBDIGNsaWVudAotICB0c29ja2V0ID0gKFRocmlmdFNvY2tldCAqKSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwgCisgIHRzb2NrZXQgPSAoVGhyaWZ0U29ja2V0ICopIGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULAogICAgICAgICAgICAgICAgICAgICAgICAgICAiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQiLCBURVNUX1BPUlQsIE5VTEwpOwogICBwcm90b2NvbCA9IChUaHJpZnRCaW5hcnlQcm90b2NvbCAqKSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTCwKQEAgLTUyMSw4ICs1NTIsNyBAQAogICBhc3NlcnQgKHRfdGVzdF90aHJpZnRfdGVzdF9jbGllbnRfdGVzdF9leGNlcHRpb24gKGlmYWNlLCAiQXBwbGljYXRpb25FeGNlcHRpb24iLCAmeGNlcHRpb24sICZlcnJvcikgPT0gRkFMU0UpOwogICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKICAgZXJyb3IgPSBOVUxMOwotICBnX29iamVjdF91bnJlZiAoeGNlcHRpb24pOwotICB4Y2VwdGlvbiA9IE5VTEw7CisgIGFzc2VydCAoeGNlcHRpb24gPT0gTlVMTCk7CiAKICAgYXNzZXJ0ICh0X3Rlc3RfdGhyaWZ0X3Rlc3RfY2xpZW50X3Rlc3RfZXhjZXB0aW9uIChpZmFjZSwgIlRlc3QiLCAmeGNlcHRpb24sICZlcnJvcikgPT0gVFJVRSk7CiAgIGFzc2VydCAoZXJyb3IgPT0gTlVMTCk7CkBAIC01NzQsMTEgKzYwNCwxMyBAQAogc3RhdGljIHZvaWQKIGJhaWxvdXQgKGludCBzaWdudW0pCiB7CisgIFRIUklGVF9VTlVTRURfVkFSSUFCTEUgKHNpZ251bSk7CisKICAgZXhpdCAoMSk7CiB9CiAKIGludAotbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQorbWFpbiAodm9pZCkKIHsKICAgaW50IHN0YXR1czsKICAgaW50IHBpZCA9IGZvcmsgKCk7CkBAIC01ODYsMTEgKzYxOCwxMSBAQAogCiAgIGlmIChwaWQgPT0gMCkgLyogY2hpbGQgKi8KICAgewotICAgIHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpOwotICAgIHNoYXJlZF9wdHI8VGVzdEhhbmRsZXI+IHRlc3RIYW5kbGVyKG5ldyBUZXN0SGFuZGxlcigpKTsKLSAgICBzaGFyZWRfcHRyPFRocmlmdFRlc3RQcm9jZXNzb3I+IHRlc3RQcm9jZXNzb3IobmV3IFRocmlmdFRlc3RQcm9jZXNzb3IodGVzdEhhbmRsZXIpKTsKLSAgICBzaGFyZWRfcHRyPFRTZXJ2ZXJTb2NrZXQ+IHNlcnZlclNvY2tldChuZXcgVFNlcnZlclNvY2tldChURVNUX1BPUlQpKTsKLSAgICBzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiB0cmFuc3BvcnRGYWN0b3J5KG5ldyBUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KCkpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnkobmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRlc3RIYW5kbGVyPiB0ZXN0SGFuZGxlcihuZXcgVGVzdEhhbmRsZXIoKSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRocmlmdFRlc3RQcm9jZXNzb3I+IHRlc3RQcm9jZXNzb3IobmV3IFRocmlmdFRlc3RQcm9jZXNzb3IodGVzdEhhbmRsZXIpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlclNvY2tldD4gc2VydmVyU29ja2V0KG5ldyBUU2VydmVyU29ja2V0KFRFU1RfUE9SVCkpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gdHJhbnNwb3J0RmFjdG9yeShuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSgpKTsKICAgICBUU2ltcGxlU2VydmVyIHNpbXBsZVNlcnZlcih0ZXN0UHJvY2Vzc29yLCBzZXJ2ZXJTb2NrZXQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSk7CiAgICAgc2lnbmFsIChTSUdBTFJNLCBiYWlsb3V0KTsKICAgICBhbGFybSAoNjApOwpAQCAtNTk5LDcgKzYzMSw3IEBACiAgICAgc2xlZXAgKDEpOwogICAgIHRlc3RfdGhyaWZ0X2NsaWVudCAoKTsKICAgICBraWxsIChwaWQsIFNJR0lOVCk7Ci0gICAgd2FpdCAoJnN0YXR1cykgPT0gcGlkOworICAgIGFzc2VydCAod2FpdCAoJnN0YXR1cykgPT0gcGlkKTsKICAgfQogCiAgIHJldHVybiAwOwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi90ZXN0L3Rlc3R0cmFuc3BvcnRzb2NrZXQuYyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0dHJhbnNwb3J0c29ja2V0LmMKaW5kZXggMDhjYWQxYy4uODljNjFiOSAxMDA3NTUKLS0tIGEvbGliL2NfZ2xpYi90ZXN0L3Rlc3R0cmFuc3BvcnRzb2NrZXQuYworKysgYi9saWIvY19nbGliL3Rlc3QvdGVzdHRyYW5zcG9ydHNvY2tldC5jCkBAIC0xNyw3ICsxNyw2IEBACiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+CiAjaW5jbHVkZSA8bmV0ZGIuaD4KICNpbmNsdWRlIDxzeXMvd2FpdC5oPgogCkBAIC0zNCw5ICszMyw5IEBACiBteV9zb2NrZXQoaW50IGRvbWFpbiwgaW50IHR5cGUsIGludCBwcm90b2NvbCkKIHsKICAgaWYgKHNvY2tldF9lcnJvciA9PSAwKQotICB7Ci0gICAgcmV0dXJuIHNvY2tldCAoZG9tYWluLCB0eXBlLCBwcm90b2NvbCk7Ci0gIH0KKyAgICB7CisgICAgICByZXR1cm4gc29ja2V0IChkb21haW4sIHR5cGUsIHByb3RvY29sKTsKKyAgICB9CiAgIHJldHVybiAtMTsKIH0KIApAQCAtNDUsOSArNDQsOSBAQAogbXlfcmVjdihpbnQgc29ja2V0LCB2b2lkICpidWZmZXIsIHNpemVfdCBsZW5ndGgsIGludCBmbGFncykKIHsKICAgaWYgKHJlY3ZfZXJyb3IgPT0gMCkKLSAgewotICAgIHJldHVybiByZWN2IChzb2NrZXQsIGJ1ZmZlciwgbGVuZ3RoLCBmbGFncyk7Ci0gIH0KKyAgICB7CisgICAgICByZXR1cm4gcmVjdiAoc29ja2V0LCBidWZmZXIsIGxlbmd0aCwgZmxhZ3MpOworICAgIH0KICAgcmV0dXJuIC0xOwogfQogCkBAIC01Niw5ICs1NSw5IEBACiBteV9zZW5kKGludCBzb2NrZXQsIGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGxlbmd0aCwgaW50IGZsYWdzKQogewogICBpZiAoc2VuZF9lcnJvciA9PSAwKQotICB7Ci0gICAgcmV0dXJuIHNlbmQgKHNvY2tldCwgYnVmZmVyLCBsZW5ndGgsIGZsYWdzKTsKLSAgfQorICAgIHsKKyAgICAgIHJldHVybiBzZW5kIChzb2NrZXQsIGJ1ZmZlciwgbGVuZ3RoLCBmbGFncyk7CisgICAgfQogICByZXR1cm4gLTE7CiB9CiAKQEAgLTcwLDExICs2OSw4IEBACiAjdW5kZWYgcmVjdgogI3VuZGVmIHNlbmQKIAotc3RhdGljIGNvbnN0IGNoYXIgVEVTVF9BRERSRVNTW10gPSAibG9jYWxob3N0IjsKLXN0YXRpYyBjb25zdCBzaG9ydCBURVNUX1BPUlQgPSA2NDQ0NDsKLQogc3RhdGljIHZvaWQgdGhyaWZ0X3NvY2tldF9zZXJ2ZXIgKGNvbnN0IGludCBwb3J0KTsKLQorc3RhdGljIHZvaWQgdGhyaWZ0X3NvY2tldF9zZXJ2ZXJfb3BlbiAoY29uc3QgaW50IHBvcnQsIGludCB0aW1lcyk7CiAvKiB0ZXN0IG9iamVjdCBjcmVhdGlvbiBhbmQgZGVzdHJ1Y3Rpb24gKi8KIHN0YXRpYyB2b2lkCiB0ZXN0X2NyZWF0ZV9hbmRfZGVzdHJveSh2b2lkKQpAQCAtODQsNyArODAsNyBAQAogCiAgIEdPYmplY3QgKm9iamVjdCA9IE5VTEw7CiAgIG9iamVjdCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCBOVUxMKTsKLSAgYXNzZXJ0IChvYmplY3QgIT0gTlVMTCk7CisgIGdfYXNzZXJ0IChvYmplY3QgIT0gTlVMTCk7CiAgIGdfb2JqZWN0X2dldCAoR19PQkpFQ1Qob2JqZWN0KSwgImhvc3RuYW1lIiwgJmhvc3RuYW1lLCAicG9ydCIsICZwb3J0LCBOVUxMKTsKICAgZ19mcmVlIChob3N0bmFtZSk7CiAKQEAgLTk3LDgyICs5MywxMDAgQEAKICAgVGhyaWZ0U29ja2V0ICp0c29ja2V0ID0gTlVMTDsKICAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBOVUxMOwogICBHRXJyb3IgKmVyciA9IE5VTEw7CisgIGludCBwb3J0ID0gNTExOTk7CisgIHBpZF90IHBpZDsKKyAgaW50IHN0YXR1czsKIAotICAvKiBvcGVuIGEgY29ubmVjdGlvbiBhbmQgY2xvc2UgaXQgKi8KLSAgdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQiLCA1MTE4OCwgTlVMTCk7IAotICB0cmFuc3BvcnQgPSBUSFJJRlRfVFJBTlNQT1JUICh0c29ja2V0KTsKLSAgdGhyaWZ0X3NvY2tldF9vcGVuICh0cmFuc3BvcnQsIE5VTEwpOwotICBhc3NlcnQgKHRocmlmdF9zb2NrZXRfaXNfb3BlbiAodHJhbnNwb3J0KSA9PSBUUlVFKTsKLSAgdGhyaWZ0X3NvY2tldF9jbG9zZSAodHJhbnNwb3J0LCBOVUxMKTsKLSAgYXNzZXJ0ICh0aHJpZnRfc29ja2V0X2lzX29wZW4gKHRyYW5zcG9ydCkgPT0gRkFMU0UpOworICBwaWQgPSBmb3JrICgpOworICBnX2Fzc2VydCAoIHBpZCA+PSAwICk7CiAKLSAgLyogdGVzdCBjbG9zZSBmYWlsdXJlICovCi0gIHRzb2NrZXQtPnNkID0gLTE7Ci0gIHRocmlmdF9zb2NrZXRfY2xvc2UgKHRyYW5zcG9ydCwgTlVMTCk7Ci0gIGdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKKyAgaWYgKCBwaWQgPT0gMCApCisgICAgeworICAgICAgLyogY2hpbGQgbGlzdGVucyAqLworICAgICAgdGhyaWZ0X3NvY2tldF9zZXJ2ZXJfb3BlbiAocG9ydCwgMSk7CisgICAgICBleGl0ICgwKTsKKyAgICB9IGVsc2UgeworCS8qIHBhcmVudCBjb25uZWN0cywgd2FpdCBhIGJpdCBmb3IgdGhlIHNvY2tldCB0byBiZSBjcmVhdGVkICovCisJc2xlZXAgKDEpOwogCi0gIC8qIHRyeSBhIGhvc3RuYW1lIGxvb2t1cCBmYWlsdXJlICovCi0gIHRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwgImhvc3RuYW1lIiwgImxvY2FsaG9zdC5icm9rZW4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKLSAgdHJhbnNwb3J0ID0gVEhSSUZUX1RSQU5TUE9SVCAodHNvY2tldCk7Ci0gIGFzc2VydCAodGhyaWZ0X3NvY2tldF9vcGVuICh0cmFuc3BvcnQsICZlcnIpID09IEZBTFNFKTsKLSAgZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOwotICBnX2Vycm9yX2ZyZWUgKGVycik7Ci0gIGVyciA9IE5VTEw7CisJLyogb3BlbiBhIGNvbm5lY3Rpb24gYW5kIGNsb3NlIGl0ICovCisJdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwKKwkJCQkicG9ydCIsIHBvcnQsIE5VTEwpOworCXRyYW5zcG9ydCA9IFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpOworCXRocmlmdF9zb2NrZXRfb3BlbiAodHJhbnNwb3J0LCBOVUxMKTsKKwlnX2Fzc2VydCAodGhyaWZ0X3NvY2tldF9pc19vcGVuICh0cmFuc3BvcnQpID09IFRSVUUpOworCXRocmlmdF9zb2NrZXRfY2xvc2UgKHRyYW5zcG9ydCwgTlVMTCk7CisJZ19hc3NlcnQgKHRocmlmdF9zb2NrZXRfaXNfb3BlbiAodHJhbnNwb3J0KSA9PSBGQUxTRSk7CiAKLSAgLyogdHJ5IGFuIGVycm9yIGNhbGwgdG8gc29ja2V0KCkgKi8KLSAgdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwgTlVMTCk7Ci0gIHRyYW5zcG9ydCA9IFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpOwotICBzb2NrZXRfZXJyb3IgPSAxOwotICBhc3NlcnQgKHRocmlmdF9zb2NrZXRfb3BlbiAodHJhbnNwb3J0LCAmZXJyKSA9PSBGQUxTRSk7Ci0gIHNvY2tldF9lcnJvciA9IDA7Ci0gIGdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKLSAgZ19lcnJvcl9mcmVlIChlcnIpOworCS8qIHRlc3QgY2xvc2UgZmFpbHVyZSAqLworCXRzb2NrZXQtPnNkID0gLTE7CisJdGhyaWZ0X3NvY2tldF9jbG9zZSAodHJhbnNwb3J0LCBOVUxMKTsKKwlnX29iamVjdF91bnJlZiAodHNvY2tldCk7CisKKwkvKiB0cnkgYSBob3N0bmFtZSBsb29rdXAgZmFpbHVyZSAqLworCXRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwgImhvc3RuYW1lIiwgImxvY2FsaG9zdC5icm9rZW4iLAorCQkJCU5VTEwpOworCXRyYW5zcG9ydCA9IFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpOworCWdfYXNzZXJ0ICh0aHJpZnRfc29ja2V0X29wZW4gKHRyYW5zcG9ydCwgJmVycikgPT0gRkFMU0UpOworCWdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKKwlnX2Vycm9yX2ZyZWUgKGVycik7CisJZXJyID0gTlVMTDsKKworCS8qIHRyeSBhbiBlcnJvciBjYWxsIHRvIHNvY2tldCgpICovCisJdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwgTlVMTCk7CisJdHJhbnNwb3J0ID0gVEhSSUZUX1RSQU5TUE9SVCAodHNvY2tldCk7CisJc29ja2V0X2Vycm9yID0gMTsKKwlnX2Fzc2VydCAodGhyaWZ0X3NvY2tldF9vcGVuICh0cmFuc3BvcnQsICZlcnIpID09IEZBTFNFKTsKKwlzb2NrZXRfZXJyb3IgPSAwOworCWdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKKwlnX2Vycm9yX2ZyZWUgKGVycik7CisJZ19hc3NlcnQgKCB3YWl0ICgmc3RhdHVzKSA9PSBwaWQgKTsKKwlnX2Fzc2VydCAoIHN0YXR1cyA9PSAwICk7CisgICAgfQogfQogCiBzdGF0aWMgdm9pZAogdGVzdF9yZWFkX2FuZF93cml0ZSh2b2lkKQogewotICBpbnQgc3RhdHVzOwotICBwaWRfdCBwaWQ7CiAgIFRocmlmdFNvY2tldCAqdHNvY2tldCA9IE5VTEw7CiAgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKKyAgcGlkX3QgcGlkOwogICBpbnQgcG9ydCA9IDUxMTk5OworICBpbnQgc3RhdHVzOwogICBndWNoYXIgYnVmWzEwXSA9IFRFU1RfREFUQTsgLyogYSBidWZmZXIgKi8KIAogICBwaWQgPSBmb3JrICgpOwotICBhc3NlcnQgKCBwaWQgPj0gMCApOworICBnX2Fzc2VydCAoIHBpZCA+PSAwICk7CiAKICAgaWYgKCBwaWQgPT0gMCApCi0gIHsKLSAgICAvKiBjaGlsZCBsaXN0ZW5zICovCi0gICAgdGhyaWZ0X3NvY2tldF9zZXJ2ZXIgKHBvcnQpOwotICAgIGV4aXQgKDApOwotICB9IGVsc2UgewotICAgIC8qIHBhcmVudCBjb25uZWN0cywgd2FpdCBhIGJpdCBmb3IgdGhlIHNvY2tldCB0byBiZSBjcmVhdGVkICovCi0gICAgc2xlZXAgKDEpOworICAgIHsKKyAgICAgIC8qIGNoaWxkIGxpc3RlbnMgKi8KKyAgICAgIHRocmlmdF9zb2NrZXRfc2VydmVyIChwb3J0KTsKKyAgICAgIGV4aXQgKDApOworICAgIH0gZWxzZSB7CisJLyogcGFyZW50IGNvbm5lY3RzLCB3YWl0IGEgYml0IGZvciB0aGUgc29ja2V0IHRvIGJlIGNyZWF0ZWQgKi8KKwlzbGVlcCAoMSk7CiAKLSAgICB0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TT0NLRVQsICJob3N0bmFtZSIsICJsb2NhbGhvc3QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3J0IiwgcG9ydCwgTlVMTCk7Ci0gICAgdHJhbnNwb3J0ID0gVEhSSUZUX1RSQU5TUE9SVCAodHNvY2tldCk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfc29ja2V0X29wZW4gKHRyYW5zcG9ydCwgTlVMTCkgPT0gVFJVRSk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfc29ja2V0X2lzX29wZW4gKHRyYW5zcG9ydCkpOwotICAgIHRocmlmdF9zb2NrZXRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxMCwgTlVMTCk7CisJdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwKKwkJCQkicG9ydCIsIHBvcnQsIE5VTEwpOworCXRyYW5zcG9ydCA9IFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpOworCWdfYXNzZXJ0ICh0aHJpZnRfc29ja2V0X29wZW4gKHRyYW5zcG9ydCwgTlVMTCkgPT0gVFJVRSk7CisJZ19hc3NlcnQgKHRocmlmdF9zb2NrZXRfaXNfb3BlbiAodHJhbnNwb3J0KSk7CisJdGhyaWZ0X3NvY2tldF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEwLCBOVUxMKTsKIAotICAgIC8qIHdyaXRlIGZhaWwgKi8KLSAgICBzZW5kX2Vycm9yID0gMTsKLSAgICB0aHJpZnRfc29ja2V0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMSwgTlVMTCk7Ci0gICAgc2VuZF9lcnJvciA9IDA7CisJLyogd3JpdGUgZmFpbCAqLworCXNlbmRfZXJyb3IgPSAxOworCXRocmlmdF9zb2NrZXRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxLCBOVUxMKTsKKwlzZW5kX2Vycm9yID0gMDsKIAotICAgIHRocmlmdF9zb2NrZXRfd3JpdGVfZW5kICh0cmFuc3BvcnQsIE5VTEwpOwotICAgIHRocmlmdF9zb2NrZXRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7Ci0gICAgdGhyaWZ0X3NvY2tldF9jbG9zZSAodHJhbnNwb3J0LCBOVUxMKTsKLSAgICBnX29iamVjdF91bnJlZiAodHNvY2tldCk7CisJdGhyaWZ0X3NvY2tldF93cml0ZV9lbmQgKHRyYW5zcG9ydCwgTlVMTCk7CisJdGhyaWZ0X3NvY2tldF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKwl0aHJpZnRfc29ja2V0X2Nsb3NlICh0cmFuc3BvcnQsIE5VTEwpOworCWdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKIAotICAgIGFzc2VydCAoIHdhaXQgKCZzdGF0dXMpID09IHBpZCApOwotICAgIGFzc2VydCAoIHN0YXR1cyA9PSAwICk7Ci0gIH0KKwlnX2Fzc2VydCAoIHdhaXQgKCZzdGF0dXMpID09IHBpZCApOworCWdfYXNzZXJ0ICggc3RhdHVzID09IDAgKTsKKyAgICB9CiB9CiAKIC8qIHRlc3QgVGhyaWZ0U29ja2V0J3MgcGVlaygpIGltcGxlbWVudGF0aW9uICovCkBAIC0xODcsOSArMjAxLDkgQEAKICAgR0Vycm9yICplcnJvciA9IE5VTEw7CiAKICAgY2xpZW50X3RyYW5zcG9ydCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQiLCAgICAgcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisJCQkJICAgImhvc3RuYW1lIiwgImxvY2FsaG9zdCIsCisJCQkJICAgInBvcnQiLCAgICAgcG9ydCwKKwkJCQkgICBOVUxMKTsKIAogICAvKiB0aHJpZnRfdHJhbnNwb3J0X3BlZWsgcmV0dXJucyBGQUxTRSB3aGVuIHRoZSBzb2NrZXQgaXMgY2xvc2VkICovCiAgIGdfYXNzZXJ0ICh0aHJpZnRfdHJhbnNwb3J0X2lzX29wZW4gKGNsaWVudF90cmFuc3BvcnQpID09IEZBTFNFKTsKQEAgLTIwMCw4MSArMjE0LDEwMiBAQAogICBnX2Fzc2VydCAocGlkID49IDApOwogCiAgIGlmIChwaWQgPT0gMCkKLSAgewotICAgIFRocmlmdFNlcnZlclRyYW5zcG9ydCAqc2VydmVyX3RyYW5zcG9ydCA9IE5VTEw7CisgICAgeworICAgICAgVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICpzZXJ2ZXJfdHJhbnNwb3J0ID0gTlVMTDsKIAotICAgIGdfb2JqZWN0X3VucmVmIChjbGllbnRfdHJhbnNwb3J0KTsKKyAgICAgIGdfb2JqZWN0X3VucmVmIChjbGllbnRfdHJhbnNwb3J0KTsKIAotICAgIC8qIGNoaWxkIGxpc3RlbnMgKi8KLSAgICBzZXJ2ZXJfdHJhbnNwb3J0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TRVJWRVJfU09DS0VULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3J0IiwgcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKLSAgICBnX2Fzc2VydCAoc2VydmVyX3RyYW5zcG9ydCAhPSBOVUxMKTsKKyAgICAgIC8qIGNoaWxkIGxpc3RlbnMgKi8KKyAgICAgIHNlcnZlcl90cmFuc3BvcnQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NFUlZFUl9TT0NLRVQsCisJCQkJICAgICAgICJwb3J0IiwgcG9ydCwKKwkJCQkgICAgICAgTlVMTCk7CisgICAgICBnX2Fzc2VydCAoc2VydmVyX3RyYW5zcG9ydCAhPSBOVUxMKTsKIAotICAgIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2xpc3RlbiAoc2VydmVyX3RyYW5zcG9ydCwgJmVycm9yKTsKLSAgICBnX2Fzc2VydCAoZXJyb3IgPT0gTlVMTCk7CisgICAgICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9saXN0ZW4gKHNlcnZlcl90cmFuc3BvcnQsICZlcnJvcik7CisgICAgICBnX2Fzc2VydCAoZXJyb3IgPT0gTlVMTCk7CiAKLSAgICBjbGllbnRfdHJhbnNwb3J0ID0gZ19vYmplY3RfbmV3Ci0gICAgICAoVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JULAotICAgICAgICJ0cmFuc3BvcnQiLCAgdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfYWNjZXB0IChzZXJ2ZXJfdHJhbnNwb3J0LCAmZXJyb3IpLAotICAgICAgICJyX2J1Zl9zaXplIiwgMCwKLSAgICAgICAid19idWZfc2l6ZSIsIHNpemVvZiBkYXRhLAotICAgICAgIE5VTEwpOwotICAgIGdfYXNzZXJ0IChlcnJvciA9PSBOVUxMKTsKLSAgICBnX2Fzc2VydCAoY2xpZW50X3RyYW5zcG9ydCAhPSBOVUxMKTsKKyAgICAgIGNsaWVudF90cmFuc3BvcnQgPSBnX29iamVjdF9uZXcKKwkgIChUSFJJRlRfVFlQRV9CVUZGRVJFRF9UUkFOU1BPUlQsCisJICAgInRyYW5zcG9ydCIsICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9hY2NlcHQgKHNlcnZlcl90cmFuc3BvcnQsICZlcnJvciksCisJICAgInJfYnVmX3NpemUiLCAwLAorCSAgICJ3X2J1Zl9zaXplIiwgc2l6ZW9mIGRhdGEsCisJICAgTlVMTCk7CisgICAgICBnX2Fzc2VydCAoZXJyb3IgPT0gTlVMTCk7CisgICAgICBnX2Fzc2VydCAoY2xpZW50X3RyYW5zcG9ydCAhPSBOVUxMKTsKIAotICAgIC8qIHdyaXRlIGV4YWN0bHkgb25lIGNoYXJhY3RlciB0byB0aGUgY2xpZW50ICovCi0gICAgZ19hc3NlcnQgKHRocmlmdF90cmFuc3BvcnRfd3JpdGUgKGNsaWVudF90cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKSA9PSBUUlVFKTsKKyAgICAgIC8qIHdyaXRlIGV4YWN0bHkgb25lIGNoYXJhY3RlciB0byB0aGUgY2xpZW50ICovCisgICAgICBnX2Fzc2VydCAodGhyaWZ0X3RyYW5zcG9ydF93cml0ZSAoY2xpZW50X3RyYW5zcG9ydCwKKwkJCQkJJmRhdGEsCisJCQkJCXNpemVvZiBkYXRhLAorCQkJCQkmZXJyb3IpID09IFRSVUUpOwogCi0gICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAoY2xpZW50X3RyYW5zcG9ydCwgJmVycm9yKTsKLSAgICB0aHJpZnRfdHJhbnNwb3J0X3dyaXRlX2VuZCAoY2xpZW50X3RyYW5zcG9ydCwgJmVycm9yKTsKLSAgICB0aHJpZnRfdHJhbnNwb3J0X2Nsb3NlIChjbGllbnRfdHJhbnNwb3J0LCAmZXJyb3IpOworICAgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAoY2xpZW50X3RyYW5zcG9ydCwgJmVycm9yKTsKKyAgICAgIHRocmlmdF90cmFuc3BvcnRfd3JpdGVfZW5kIChjbGllbnRfdHJhbnNwb3J0LCAmZXJyb3IpOworICAgICAgdGhyaWZ0X3RyYW5zcG9ydF9jbG9zZSAoY2xpZW50X3RyYW5zcG9ydCwgJmVycm9yKTsKIAotICAgIGdfb2JqZWN0X3VucmVmIChjbGllbnRfdHJhbnNwb3J0KTsKLSAgICBnX29iamVjdF91bnJlZiAoc2VydmVyX3RyYW5zcG9ydCk7CisgICAgICBnX29iamVjdF91bnJlZiAoY2xpZW50X3RyYW5zcG9ydCk7CisgICAgICBnX29iamVjdF91bnJlZiAoc2VydmVyX3RyYW5zcG9ydCk7CiAKLSAgICBleGl0ICgwKTsKLSAgfQorICAgICAgZXhpdCAoMCk7CisgICAgfQogICBlbHNlIHsKLSAgICAvKiBwYXJlbnQgY29ubmVjdHMsIHdhaXQgYSBiaXQgZm9yIHRoZSBzb2NrZXQgdG8gYmUgY3JlYXRlZCAqLwotICAgIHNsZWVwICgxKTsKKyAgICAgIC8qIHBhcmVudCBjb25uZWN0cywgd2FpdCBhIGJpdCBmb3IgdGhlIHNvY2tldCB0byBiZSBjcmVhdGVkICovCisgICAgICBzbGVlcCAoMSk7CiAKLSAgICAvKiBjb25uZWN0IHRvIHRoZSBjaGlsZCAqLwotICAgIHRocmlmdF90cmFuc3BvcnRfb3BlbiAoY2xpZW50X3RyYW5zcG9ydCwgJmVycm9yKTsKLSAgICBnX2Fzc2VydCAoZXJyb3IgPT0gTlVMTCk7Ci0gICAgZ19hc3NlcnQgKHRocmlmdF90cmFuc3BvcnRfaXNfb3BlbiAoY2xpZW50X3RyYW5zcG9ydCkgPT0gVFJVRSk7CisgICAgICAvKiBjb25uZWN0IHRvIHRoZSBjaGlsZCAqLworICAgICAgdGhyaWZ0X3RyYW5zcG9ydF9vcGVuIChjbGllbnRfdHJhbnNwb3J0LCAmZXJyb3IpOworICAgICAgZ19hc3NlcnQgKGVycm9yID09IE5VTEwpOworICAgICAgZ19hc3NlcnQgKHRocmlmdF90cmFuc3BvcnRfaXNfb3BlbiAoY2xpZW50X3RyYW5zcG9ydCkgPT0gVFJVRSk7CiAKLSAgICAvKiB0aHJpZnRfdHJhbnNwb3J0X3BlZWsgcmV0dXJucyBUUlVFIHdoZW4gdGhlIHNvY2tldCBpcyBvcGVuIGFuZCB0aGVyZSBpcworICAgICAgLyogdGhyaWZ0X3RyYW5zcG9ydF9wZWVrIHJldHVybnMgVFJVRSB3aGVuIHRoZSBzb2NrZXQgaXMgb3BlbiBhbmQgdGhlcmUgaXMKICAgICAgICBkYXRhIGF2YWlsYWJsZSB0byBiZSByZWFkICovCi0gICAgZ19hc3NlcnQgKHRocmlmdF90cmFuc3BvcnRfcGVlayAoY2xpZW50X3RyYW5zcG9ydCwgJmVycm9yKSA9PSBUUlVFKTsKLSAgICBnX2Fzc2VydCAoZXJyb3IgPT0gTlVMTCk7CisgICAgICBnX2Fzc2VydCAodGhyaWZ0X3RyYW5zcG9ydF9wZWVrIChjbGllbnRfdHJhbnNwb3J0LCAmZXJyb3IpID09IFRSVUUpOworICAgICAgZ19hc3NlcnQgKGVycm9yID09IE5VTEwpOwogCi0gICAgLyogcmVhZCBleGFjdGx5IG9uZSBjaGFyYWN0ZXIgZnJvbSB0aGUgc2VydmVyICovCi0gICAgZ19hc3NlcnRfY21waW50ICh0aHJpZnRfdHJhbnNwb3J0X3JlYWQgKGNsaWVudF90cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKSwgPT0sIHNpemVvZiBkYXRhKTsKKyAgICAgIC8qIHJlYWQgZXhhY3RseSBvbmUgY2hhcmFjdGVyIGZyb20gdGhlIHNlcnZlciAqLworICAgICAgZ19hc3NlcnRfY21waW50ICh0aHJpZnRfdHJhbnNwb3J0X3JlYWQgKGNsaWVudF90cmFuc3BvcnQsCisJCQkJCSAgICAgICZkYXRhLAorCQkJCQkgICAgICBzaXplb2YgZGF0YSwKKwkJCQkJICAgICAgJmVycm9yKSwgPT0sIHNpemVvZiBkYXRhKTsKIAotICAgIC8qIHRocmlmdF90cmFuc3BvcnRfcGVlayByZXR1cm5zIEZBTFNFIHdoZW4gdGhlIHNvY2tldCBpcyBvcGVuIGJ1dCB0aGVyZSBpcworICAgICAgLyogdGhyaWZ0X3RyYW5zcG9ydF9wZWVrIHJldHVybnMgRkFMU0Ugd2hlbiB0aGUgc29ja2V0IGlzIG9wZW4gYnV0IHRoZXJlIGlzCiAgICAgICAgbm8gKG1vcmUpIGRhdGEgYXZhaWxhYmxlIHRvIGJlIHJlYWQgKi8KLSAgICBnX2Fzc2VydCAodGhyaWZ0X3RyYW5zcG9ydF9pc19vcGVuIChjbGllbnRfdHJhbnNwb3J0KSA9PSBUUlVFKTsKLSAgICBnX2Fzc2VydCAodGhyaWZ0X3RyYW5zcG9ydF9wZWVrIChjbGllbnRfdHJhbnNwb3J0LCAmZXJyb3IpID09IEZBTFNFKTsKLSAgICBnX2Fzc2VydCAoZXJyb3IgPT0gTlVMTCk7CisgICAgICBnX2Fzc2VydCAodGhyaWZ0X3RyYW5zcG9ydF9pc19vcGVuIChjbGllbnRfdHJhbnNwb3J0KSA9PSBUUlVFKTsKKyAgICAgIGdfYXNzZXJ0ICh0aHJpZnRfdHJhbnNwb3J0X3BlZWsgKGNsaWVudF90cmFuc3BvcnQsICZlcnJvcikgPT0gRkFMU0UpOworICAgICAgZ19hc3NlcnQgKGVycm9yID09IE5VTEwpOwogCi0gICAgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2VuZCAoY2xpZW50X3RyYW5zcG9ydCwgJmVycm9yKTsKLSAgICB0aHJpZnRfdHJhbnNwb3J0X2Nsb3NlIChjbGllbnRfdHJhbnNwb3J0LCAmZXJyb3IpOworICAgICAgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2VuZCAoY2xpZW50X3RyYW5zcG9ydCwgJmVycm9yKTsKKyAgICAgIHRocmlmdF90cmFuc3BvcnRfY2xvc2UgKGNsaWVudF90cmFuc3BvcnQsICZlcnJvcik7CiAKLSAgICBnX29iamVjdF91bnJlZiAoY2xpZW50X3RyYW5zcG9ydCk7CisgICAgICBnX29iamVjdF91bnJlZiAoY2xpZW50X3RyYW5zcG9ydCk7CiAKLSAgICBnX2Fzc2VydCAod2FpdCAoJnN0YXR1cykgPT0gcGlkKTsKLSAgICBnX2Fzc2VydCAoc3RhdHVzID09IDApOworICAgICAgZ19hc3NlcnQgKHdhaXQgKCZzdGF0dXMpID09IHBpZCk7CisgICAgICBnX2Fzc2VydCAoc3RhdHVzID09IDApOwogICB9CiB9CiAKIHN0YXRpYyB2b2lkCit0aHJpZnRfc29ja2V0X3NlcnZlcl9vcGVuIChjb25zdCBpbnQgcG9ydCwgaW50IHRpbWVzKQoreworICBUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgKnRyYW5zcG9ydCA9IE5VTEw7CisgIFRocmlmdFRyYW5zcG9ydCAqY2xpZW50ID0gTlVMTDsKKyAgaW50IGk7CisgIFRocmlmdFNlcnZlclNvY2tldCAqdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU0VSVkVSX1NPQ0tFVCwKKwkJCQkJICAgICAgInBvcnQiLCBwb3J0LCBOVUxMKTsKKworICB0cmFuc3BvcnQgPSBUSFJJRlRfU0VSVkVSX1RSQU5TUE9SVCAodHNvY2tldCk7CisgIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2xpc3RlbiAodHJhbnNwb3J0LCBOVUxMKTsKKyAgZm9yKGk9MDtpPHRpbWVzO2krKyl7CisgICAgICBjbGllbnQgPSB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9hY2NlcHQgKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgICBnX2Fzc2VydCAoY2xpZW50ICE9IE5VTEwpOworICAgICAgdGhyaWZ0X3NvY2tldF9jbG9zZSAoY2xpZW50LCBOVUxMKTsKKyAgICAgIGdfb2JqZWN0X3VucmVmIChjbGllbnQpOworICB9CisgIGdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKK30KKworCitzdGF0aWMgdm9pZAogdGhyaWZ0X3NvY2tldF9zZXJ2ZXIgKGNvbnN0IGludCBwb3J0KQogewogICBpbnQgYnl0ZXMgPSAwOwpAQCAtMjg0LDE3ICszMTksMTcgQEAKICAgZ3VjaGFyIG1hdGNoWzEwXSA9IFRFU1RfREFUQTsKIAogICBUaHJpZnRTZXJ2ZXJTb2NrZXQgKnRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NFUlZFUl9TT0NLRVQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQiLCBwb3J0LCBOVUxMKTsKKwkJCQkJICAgICAgInBvcnQiLCBwb3J0LCBOVUxMKTsKIAogICB0cmFuc3BvcnQgPSBUSFJJRlRfU0VSVkVSX1RSQU5TUE9SVCAodHNvY2tldCk7CiAgIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2xpc3RlbiAodHJhbnNwb3J0LCBOVUxMKTsKICAgY2xpZW50ID0gdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfYWNjZXB0ICh0cmFuc3BvcnQsIE5VTEwpOwotICBhc3NlcnQgKGNsaWVudCAhPSBOVUxMKTsKKyAgZ19hc3NlcnQgKGNsaWVudCAhPSBOVUxMKTsKIAogICAvKiByZWFkIDEwIGJ5dGVzICovCiAgIGJ5dGVzID0gdGhyaWZ0X3NvY2tldF9yZWFkIChjbGllbnQsIGJ1ZiwgMTAsIE5VTEwpOwotICBhc3NlcnQgKGJ5dGVzID09IDEwKTsgLyogbWFrZSBzdXJlIHdlJ3ZlIHJlYWQgMTAgYnl0ZXMgKi8KLSAgYXNzZXJ0ICggbWVtY21wKGJ1ZiwgbWF0Y2gsIDEwKSA9PSAwICk7IC8qIG1ha2Ugc3VyZSB3aGF0IHdlIGdvdCBtYXRjaGVzICovCisgIGdfYXNzZXJ0IChieXRlcyA9PSAxMCk7IC8qIG1ha2Ugc3VyZSB3ZSd2ZSByZWFkIDEwIGJ5dGVzICovCisgIGdfYXNzZXJ0ICggbWVtY21wKGJ1ZiwgbWF0Y2gsIDEwKSA9PSAwICk7IC8qIG1ha2Ugc3VyZSB3aGF0IHdlIGdvdCBtYXRjaGVzICovCiAKICAgLyogZmFpbGVkIHJlYWQgKi8KICAgcmVjdl9lcnJvciA9IDE7CkBAIC0zMTAsNyArMzQ1LDEwIEBACiBpbnQKIG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKIHsKKyNpZiAoIUdMSUJfQ0hFQ0tfVkVSU0lPTiAoMiwgMzYsIDApKQogICBnX3R5cGVfaW5pdCgpOworI2VuZGlmCisKICAgZ190ZXN0X2luaXQgKCZhcmdjLCAmYXJndiwgTlVMTCk7CiAKICAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3R0cmFuc3BvcnRzb2NrZXQvQ3JlYXRlQW5kRGVzdHJveSIsIHRlc3RfY3JlYXRlX2FuZF9kZXN0cm95KTsKZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvdGVzdC90ZXN0dHJhbnNwb3J0c3Nsc29ja2V0LmMgYi9saWIvY19nbGliL3Rlc3QvdGVzdHRyYW5zcG9ydHNzbHNvY2tldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMjY0NGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3Rlc3QvdGVzdHRyYW5zcG9ydHNzbHNvY2tldC5jCkBAIC0wLDAgKzEsNTQyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjZGVmaW5lIF9QT1NJWF9DX1NPVVJDRSAyMDAxMTJMIC8qIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzM3NTQxOTg1L3N0b3JhZ2Utc2l6ZS1vZi1hZGRyaW5mby1pc250LWtub3duICovCisKKworI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl9zb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc3NsX3NvY2tldC5oPgorCisvKiAjZGVmaW5lIFRFU1RfREFUQSB7ICdhJywgJ2InLCAnYycsICdkJywgJ2UnLCAnZicsICdnJywgJ2gnLCAnaScsICdqJyB9ICovCisjZGVmaW5lIFRFU1RfREFUQSB7ICJHRVQgLyBIVFRQLzEuMVxuXG4iIH0KKworCisvKiBzdWJzdGl0dXRlZCBmdW5jdGlvbnMgdG8gdGVzdCBmYWlsdXJlcyBvZiBzeXN0ZW0gYW5kIGxpYnJhcnkgY2FsbHMgKi8KK3N0YXRpYyBpbnQgc29ja2V0X2Vycm9yID0gMDsKK2ludAorbXlfc29ja2V0KGludCBkb21haW4sIGludCB0eXBlLCBpbnQgcHJvdG9jb2wpCit7CisgIGlmIChzb2NrZXRfZXJyb3IgPT0gMCkKKyAgICB7CisgICAgICByZXR1cm4gc29ja2V0IChkb21haW4sIHR5cGUsIHByb3RvY29sKTsKKyAgICB9CisgIHJldHVybiAtMTsKK30KKworc3RhdGljIGludCByZWN2X2Vycm9yID0gMDsKK3NzaXplX3QKK215X3JlY3YoaW50IHNvY2tldCwgdm9pZCAqYnVmZmVyLCBzaXplX3QgbGVuZ3RoLCBpbnQgZmxhZ3MpCit7CisgIGlmIChyZWN2X2Vycm9yID09IDApCisgICAgeworICAgICAgcmV0dXJuIHJlY3YgKHNvY2tldCwgYnVmZmVyLCBsZW5ndGgsIGZsYWdzKTsKKyAgICB9CisgIHJldHVybiAtMTsKK30KKworc3RhdGljIGludCBzZW5kX2Vycm9yID0gMDsKK3NzaXplX3QKK215X3NlbmQoaW50IHNvY2tldCwgY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgbGVuZ3RoLCBpbnQgZmxhZ3MpCit7CisgIGlmIChzZW5kX2Vycm9yID09IDApCisgICAgeworICAgICAgcmV0dXJuIHNlbmQgKHNvY2tldCwgYnVmZmVyLCBsZW5ndGgsIGZsYWdzKTsKKyAgICB9CisgIHJldHVybiAtMTsKK30KKworI2RlZmluZSBzb2NrZXQgbXlfc29ja2V0CisjZGVmaW5lIHJlY3YgbXlfcmVjdgorI2RlZmluZSBzZW5kIG15X3NlbmQKKyNpbmNsdWRlICIuLi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NzbF9zb2NrZXQuYyIKKyN1bmRlZiBzb2NrZXQKKyN1bmRlZiByZWN2CisjdW5kZWYgc2VuZAorCitzdGF0aWMgdm9pZCB0aHJpZnRfc29ja2V0X3NlcnZlciAoY29uc3QgaW50IHBvcnQpOworCisvKiB0ZXN0IG9iamVjdCBjcmVhdGlvbiBhbmQgZGVzdHJ1Y3Rpb24gKi8KK3N0YXRpYyB2b2lkCit0ZXN0X3NzbF9jcmVhdGVfYW5kX2Rlc3Ryb3kodm9pZCkKK3sKKyAgZ2NoYXIgKmhvc3RuYW1lID0gTlVMTDsKKyAgZ3VpbnQgcG9ydCA9IDA7CisKKyAgR09iamVjdCAqb2JqZWN0ID0gTlVMTDsKKyAgb2JqZWN0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TU0xfU09DS0VULCBOVUxMKTsKKyAgZ19hc3NlcnQgKG9iamVjdCAhPSBOVUxMKTsKKyAgZ19vYmplY3RfZ2V0IChHX09CSkVDVChvYmplY3QpLCAiaG9zdG5hbWUiLCAmaG9zdG5hbWUsICJwb3J0IiwgJnBvcnQsIE5VTEwpOworICBnX2ZyZWUgKGhvc3RuYW1lKTsKKyAgZ19vYmplY3RfdW5yZWYgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3NzbF9jcmVhdGVfYW5kX3NldF9wcm9wZXJ0aWVzKHZvaWQpCit7CisgIGdjaGFyICpob3N0bmFtZSA9IE5VTEw7CisgIGd1aW50IHBvcnQgPSAwOworICBTU0xfQ1RYKiBzc2xfY3R4PSBOVUxMOworICBHRXJyb3IgKmVycm9yPU5VTEw7CisKKyAgR09iamVjdCAqb2JqZWN0ID0gTlVMTDsKKyAgb2JqZWN0ID0gdGhyaWZ0X3NzbF9zb2NrZXRfbmV3KFNTTFRMUywgJmVycm9yKTsKKyAgZ19vYmplY3RfZ2V0IChHX09CSkVDVChvYmplY3QpLCAiaG9zdG5hbWUiLCAmaG9zdG5hbWUsICJwb3J0IiwgJnBvcnQsICJzc2xfY29udGV4dCIsICZzc2xfY3R4LCBOVUxMKTsKKyAgZ19hc3NlcnQgKHNzbF9jdHghPU5VTEwpOworCisgIGdfZnJlZSAoaG9zdG5hbWUpOworICBnX29iamVjdF91bnJlZiAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3Rfc3NsX29wZW5fYW5kX2Nsb3NlX25vbl9zc2xfc2VydmVyKHZvaWQpCit7CisgIFRocmlmdFNTTFNvY2tldCAqdFNTTFNvY2tldCA9IE5VTEw7CisgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKKyAgR0Vycm9yICplcnJvcj1OVUxMOworICBwaWRfdCBwaWQ7CisgIGludCBub25fc3NsX3BvcnQgPSA1MTE5ODsKKyAgY2hhciBlcnJvcm1zZ1syNTVdOworCisKKyAgcGlkID0gZm9yayAoKTsKKyAgZ19hc3NlcnQgKCBwaWQgPj0gMCApOworCisgIGlmICggcGlkID09IDAgKQorICAgIHsKKyAgICAgIC8qIGNoaWxkIGxpc3RlbnMgKi8KKyAgICAgIC8qIFRoaXMgaXMgYSBub24gU1NMIHNlcnZlciAqLworICAgICAgdGhyaWZ0X3NvY2tldF9zZXJ2ZXIgKG5vbl9zc2xfcG9ydCk7CisgICAgICBleGl0ICgwKTsKKyAgICB9IGVsc2UgeworCS8qIHBhcmVudCBjb25uZWN0cywgd2FpdCBhIGJpdCBmb3IgdGhlIHNvY2tldCB0byBiZSBjcmVhdGVkICovCisJc2xlZXAgKDEpOworCisJLyogb3BlbiBhIGNvbm5lY3Rpb24gYW5kIGNsb3NlIGl0ICovCisJdFNTTFNvY2tldCA9IHRocmlmdF9zc2xfc29ja2V0X25ld193aXRoX2hvc3QoU1NMVExTLCAibG9jYWxob3N0Iiwgbm9uX3NzbF9wb3J0LCAmZXJyb3IpOworCisJdHJhbnNwb3J0ID0gVEhSSUZUX1RSQU5TUE9SVCAodFNTTFNvY2tldCk7CisJZ19hc3NlcnQgKHRocmlmdF9zc2xfc29ja2V0X29wZW4gKHRyYW5zcG9ydCwgJmVycm9yKSA9PSBGQUxTRSk7CisJZ19hc3NlcnRfY21wc3RyKGVycm9yLT5tZXNzYWdlLCA9PSAsIkVycm9yIHdoaWxlIGNvbm5lY3QvYmluZDogNjggLT4gQ29ubmVjdGlvbiByZXNldCBieSBwZWVyIik7CisJZ19jbGVhcl9lcnJvciAoJmVycm9yKTsKKwlnX2Fzc2VydCAodGhyaWZ0X3NzbF9zb2NrZXRfaXNfb3BlbiAodHJhbnNwb3J0KSA9PSBGQUxTRSk7CisJdGhyaWZ0X3NzbF9zb2NrZXRfY2xvc2UgKHRyYW5zcG9ydCwgTlVMTCk7CisJZ19hc3NlcnQgKHRocmlmdF9zc2xfc29ja2V0X2lzX29wZW4gKHRyYW5zcG9ydCkgPT0gRkFMU0UpOworCisJLyogdGVzdCBjbG9zZSBmYWlsdXJlICovCisJVEhSSUZUX1NPQ0tFVCh0U1NMU29ja2V0KS0+c2QgPSAtMTsKKwl0aHJpZnRfc3NsX3NvY2tldF9jbG9zZSAodHJhbnNwb3J0LCBOVUxMKTsKKwlnX29iamVjdF91bnJlZiAodFNTTFNvY2tldCk7CisKKwkvKiB0cnkgYSBob3N0bmFtZSBsb29rdXAgZmFpbHVyZSAqLworCXRTU0xTb2NrZXQgPSB0aHJpZnRfc3NsX3NvY2tldF9uZXdfd2l0aF9ob3N0KFNTTFRMUywgImxvY2FsaG9zdC5icm9rZW4iLCBub25fc3NsX3BvcnQsICZlcnJvcik7CisJdHJhbnNwb3J0ID0gVEhSSUZUX1RSQU5TUE9SVCAodFNTTFNvY2tldCk7CisJZ19hc3NlcnQgKHRocmlmdF9zc2xfc29ja2V0X29wZW4gKHRyYW5zcG9ydCwgJmVycm9yKSA9PSBGQUxTRSk7CisJc25wcmludGYoZXJyb3Jtc2csIDI1NSwgImhvc3QgbG9va3VwIGZhaWxlZCBmb3IgbG9jYWxob3N0LmJyb2tlbjolZCAtIFVua25vd24gaG9zdCIsIG5vbl9zc2xfcG9ydCk7CisJZ19hc3NlcnRfY21wc3RyKGVycm9yLT5tZXNzYWdlLCA9PSwgZXJyb3Jtc2cpOworCWdfY2xlYXJfZXJyb3IgKCZlcnJvcik7CisJZ19vYmplY3RfdW5yZWYgKHRTU0xTb2NrZXQpOworCWVycm9yID0gTlVMTDsKKworCQkvKiB0cnkgYW4gZXJyb3IgY2FsbCB0byBzb2NrZXQoKSAqLworCS8qCisJCXRTU0xTb2NrZXQgPSB0aHJpZnRfc3NsX3NvY2tldF9uZXdfd2l0aF9ob3N0KFNTTFRMUywgImxvY2FsaG9zdCIsIHBvcnQsICZlcnJvcik7CisJCXRyYW5zcG9ydCA9IFRIUklGVF9UUkFOU1BPUlQgKHRTU0xTb2NrZXQpOworCQlzb2NrZXRfZXJyb3IgPSAxOworCQlhc3NlcnQgKHRocmlmdF9zc2xfc29ja2V0X29wZW4gKHRyYW5zcG9ydCwgJmVycm9yKSA9PSBGQUxTRSk7CisJCXNvY2tldF9lcnJvciA9IDA7CisJCWdfb2JqZWN0X3VucmVmICh0U1NMU29ja2V0KTsKKwkJZ19lcnJvcl9mcmVlIChlcnJvcik7CisJICovCisgICAgfQorfQorCitzdGF0aWMgdm9pZAordGVzdF9zc2xfd3JpdGVfaW52YWxpZF9zb2NrZXQodm9pZCkKK3sKKyAgVGhyaWZ0U1NMU29ja2V0ICp0U1NMU29ja2V0ID0gTlVMTDsKKyAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBOVUxMOworICBHRXJyb3IgKmVycm9yPU5VTEw7CisgIGNoYXIgYnVmZmVyW10gPSAidGhpcyBtdXN0IG5vdCBicmVhayI7CisKKyAgLyogb3BlbiBhIGNvbm5lY3Rpb24gYW5kIGNsb3NlIGl0ICovCisgIHRTU0xTb2NrZXQgPSB0aHJpZnRfc3NsX3NvY2tldF9uZXdfd2l0aF9ob3N0KFNTTFRMUywgImxvY2FsaG9zdCIsIDUxMTg4KzEsICZlcnJvcik7CisKKyAgdHJhbnNwb3J0ID0gVEhSSUZUX1RSQU5TUE9SVCAodFNTTFNvY2tldCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfc3NsX3NvY2tldF9vcGVuICh0cmFuc3BvcnQsIE5VTEwpID09IEZBTFNFKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9zc2xfc29ja2V0X2lzX29wZW4gKHRyYW5zcG9ydCkgPT0gRkFMU0UpOworCisgIC8qIEZJWE1FIFRoaXMgbXVzdCBiZSB0ZXN0ZWQgYnV0IHNpbmNlIHRoZSBhc3NlcnRpb24gaW5zaWRlIHRocmlmdF9zc2xfc29ja2V0X3dyaXRlIGJyZWFrcyB0aGUgdGVzdCB1bml0CisgICBpdCdzIGRpc2FibGVkLiBUaGV5IGlkZWEgaXMgdG8gZGlzYWJsZSB0cmFwL2NvcmVkdW1wIGR1cmluZyB0aGlzIHRlc3QKKyAgZ19hc3NlcnQgKHRocmlmdF9zc2xfc29ja2V0X3dyaXRlKHRyYW5zcG9ydCwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgJmVycm9yKSA9PSBGQUxTRSk7CisgIGdfbWVzc2FnZSAoIndyaXRlX2ZhaWxlZF93aXRoX2Vycm9yOiAlcyIsCisJICAgICBlcnJvciAhPSBOVUxMID8gZXJyb3ItPm1lc3NhZ2UgOiAiTm8iKTsKKyAgZ19jbGVhcl9lcnJvciAoJmVycm9yKTsKKyAgKi8KKyAgdGhyaWZ0X3NzbF9zb2NrZXRfY2xvc2UgKHRyYW5zcG9ydCwgTlVMTCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfc3NsX3NvY2tldF9pc19vcGVuICh0cmFuc3BvcnQpID09IEZBTFNFKTsKKworICAvKiB0ZXN0IGNsb3NlIGZhaWx1cmUgKi8KKyAgVEhSSUZUX1NPQ0tFVCh0U1NMU29ja2V0KS0+c2QgPSAtMTsKKyAgdGhyaWZ0X3NzbF9zb2NrZXRfY2xvc2UgKHRyYW5zcG9ydCwgTlVMTCk7CisgIGdfb2JqZWN0X3VucmVmICh0U1NMU29ja2V0KTsKK30KKworCisKKy8qKgorICogUHJpbnQgdGhlIGNvbW1vbiBuYW1lIG9mIGNlcnRpZmljYXRlCisgKi8KK3Vuc2lnbmVkIGNoYXIgKiBnZXRfY25fbmFtZShYNTA5X05BTUUqIGNvbnN0IG5hbWUpCit7CisgIGludCBpZHggPSAtMTsKKyAgdW5zaWduZWQgY2hhciAqdXRmOCA9IE5VTEw7CisKKyAgZG8KKyAgICB7CisgICAgICBpZighbmFtZSkgYnJlYWs7IC8qIGZhaWxlZCAqLworCisgICAgICBpZHggPSBYNTA5X05BTUVfZ2V0X2luZGV4X2J5X05JRChuYW1lLCBOSURfY29tbW9uTmFtZSwgLTEpOworICAgICAgaWYoIShpZHggPiAtMSkpICBicmVhazsgLyogZmFpbGVkICovCisKKyAgICAgIFg1MDlfTkFNRV9FTlRSWSogZW50cnkgPSBYNTA5X05BTUVfZ2V0X2VudHJ5KG5hbWUsIGlkeCk7CisgICAgICBpZighZW50cnkpIGJyZWFrOyAvKiBmYWlsZWQgKi8KKworICAgICAgQVNOMV9TVFJJTkcqIGRhdGEgPSBYNTA5X05BTUVfRU5UUllfZ2V0X2RhdGEoZW50cnkpOworICAgICAgaWYoIWRhdGEpIGJyZWFrOyAvKiBmYWlsZWQgKi8KKworICAgICAgaW50IGxlbmd0aCA9IEFTTjFfU1RSSU5HX3RvX1VURjgoJnV0ZjgsIGRhdGEpOworICAgICAgaWYoIXV0ZjggfHwgIShsZW5ndGggPiAwKSkgIGJyZWFrOyAvKiBmYWlsZWQgKi8KKworICAgIH0gd2hpbGUgKDApOworICByZXR1cm4gdXRmODsKK30KKworLyoKKyAqIEhhbmRsZSBJUFY0IGFuZCBJUFY2IGFkZHIKKyAqLwordm9pZCAqZ2V0X2luX2FkZHIoc3RydWN0IHNvY2thZGRyICpzYSkKK3sKKyAgaWYgKHNhLT5zYV9mYW1pbHkgPT0gQUZfSU5FVCkKKyAgICByZXR1cm4gJigoKHN0cnVjdCBzb2NrYWRkcl9pbiopc2EpLT5zaW5fYWRkcik7CisgIHJldHVybiAmKCgoc3RydWN0IHNvY2thZGRyX2luNiopc2EpLT5zaW42X2FkZHIpOworfQorCitpbnQgdmVyaWZ5X2lwKGNoYXIgKiBob3N0bmFtZSwgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgKmFkZHIpCit7CisgIHN0cnVjdCBhZGRyaW5mbyAqYWRkcl9pbmZvLCpwOworICBzdHJ1Y3QgYWRkcmluZm8gaGludHM7CisgIGludCByZXM7CisgIGludCByZXR2YWwgPSAwOworCisKKyAgbWVtc2V0KCZoaW50cywgMCwgc2l6ZW9mIChzdHJ1Y3QgYWRkcmluZm8pKTsKKyAgaGludHMuYWlfZmFtaWx5ID0gQUZfVU5TUEVDOyAvKiB1c2UgQUZfSU5FVDYgdG8gZm9yY2UgSVB2NiAqLworICBoaW50cy5haV9zb2NrdHlwZSA9IFNPQ0tfU1RSRUFNOworCisKKyAgaWYgKCAocmVzID0gZ2V0YWRkcmluZm8oaG9zdG5hbWUsIE5VTEwsICZoaW50cywgJmFkZHJfaW5mbykgKSAhPSAwKQorICAgIHsKKyAgICAgIC8qIGdldCB0aGUgaG9zdCBpbmZvICovCisgICAgICBnX2Vycm9yKCJDYW5ub3QgZ2V0IHRoZSBob3N0IGFkZHJlc3MiKTsKKyAgICAgIHJldHVybiByZXR2YWw7CisgICAgfQorICAvKiBsb29wIHRocm91Z2ggYWxsIHRoZSByZXN1bHRzIGFuZCBjb25uZWN0IHRvIHRoZSBmaXJzdCB3ZSBjYW4gKi8KKyAgY2hhciBkbnNob3N0W0lORVQ2X0FERFJTVFJMRU5dOyAvKiBiaWdnZXIgYWRkciBzdXBwb3J0ZWQgSVBWNiAqLworICBjaGFyIHNvY2tldF9pcFtJTkVUNl9BRERSU1RSTEVOXTsKKyAgaWYoaW5ldF9udG9wKGFkZHItPnNzX2ZhbWlseSwgZ2V0X2luX2FkZHIoYWRkciksIHNvY2tldF9pcCwgSU5FVDZfQUREUlNUUkxFTik9PXNvY2tldF9pcCl7CisgICAgICBnX2RlYnVnKCJXZSBhcmUgY29ubmVjdGVkIHRvIGhvc3QgJXMgY2hlY2tpbmcgYWdhaW5zdCBjZXJ0aWZpY2F0ZS4uLiIsIHNvY2tldF9pcCk7CisgICAgICBpbnQgc2l6ZWlwID0gc29ja2V0X2lwIT1OVUxMID8gc3RybGVuKHNvY2tldF9pcCkgOiAwOworICAgICAgZm9yKHAgPSBhZGRyX2luZm87IHAgIT0gTlVMTDsgcCA9IHAtPmFpX25leHQpIHsKKwkgIGlmKGluZXRfbnRvcChwLT5haV9mYW1pbHksIGdldF9pbl9hZGRyKChzdHJ1Y3Qgc29ja2FkZHIgKilwLT5haV9hZGRyKSwgZG5zaG9zdCwgSU5FVDZfQUREUlNUUkxFTik9PWRuc2hvc3QpeworCSAgICAgIGlmKGRuc2hvc3QhPU5VTEwpeworCQkgIGdfaW5mbygiRE5TIGFkZHJlc3MgWyVpIC0+ICVzXSIsIHAtPmFpX2FkZHIsIGRuc2hvc3QpOworCQkgIGlmKCFzdHJuY21wKGRuc2hvc3QsIHNvY2tldF9pcCwgc2l6ZWlwKSl7CisJCSAgICAgIHJldHZhbD0xOworCQkgICAgICBicmVhazsgLyogaWYgd2UgZ2V0IGhlcmUsIHdlIG11c3QgaGF2ZSBjb25uZWN0ZWQgc3VjY2Vzc2Z1bGx5ICovCisJCSAgfQorCSAgICAgIH0KKwkgIH0KKyAgICAgIH0KKyAgfQorCisgIGlmKGFkZHJfaW5mbykKKyAgICBmcmVlYWRkcmluZm8oYWRkcl9pbmZvKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdm9pZAorcmVhZF9mcm9tX2ZpbGUoY2hhciAqYnVmZmVyLCBsb25nIHNpemUsIGNvbnN0IGNoYXIgKmZpbGVfbmFtZSkKK3sKKyAgY2hhciBjaDsKKyAgbG9uZyBpbmRleD0wOworICBGSUxFICpmcDsKKworICBmcCA9IGZvcGVuKGZpbGVfbmFtZSwiciIpOyAvKiByZWFkIG1vZGUgKi8KKworICBpZiggZnAgPT0gTlVMTCApCisgICAgeworICAgICAgcGVycm9yKCJFcnJvciB3aGlsZSBvcGVuaW5nIHRoZSBmaWxlLlxuIik7CisgICAgICBleGl0KEVYSVRfRkFJTFVSRSk7CisgICAgfQorCisgIHByaW50ZigiVGhlIGNvbnRlbnRzIG9mICVzIGZpbGUgYXJlIDpcbiIsIGZpbGVfbmFtZSk7CisKKyAgd2hpbGUoaW5kZXg8c2l6ZSAmJiAoIGNoID0gZmdldGMoZnApICkgIT0gRU9GICl7CisgICAgICBidWZmZXJbaW5kZXgrK10gPSBjaDsKKyAgfQorCisgIGZjbG9zZShmcCk7Cit9CisKKyNkZWZpbmUgSVNTVUVSX0NOX1BJTk5JTkcgIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIKKyNkZWZpbmUgU1VCSkVDVF9DTl9QSU5OSU5HICJsb2NhbGhvc3QiCisjZGVmaW5lIENFUlRfU0VSSUFMX05VTUJFUiAiMSIKKworZ2Jvb2xlYW4gdmVyaWZ5X2NlcnRpZmljYXRlX3NuKFg1MDkgKmNlcnQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNlcmlhbF9udW1iZXIpCit7CisgIGdib29sZWFuIHJldHZhbCA9IEZBTFNFOworCisgIEFTTjFfSU5URUdFUiAqc2VyaWFsID0gWDUwOV9nZXRfc2VyaWFsTnVtYmVyKGNlcnQpOworCisgIEJJR05VTSAqYm4gPSBBU04xX0lOVEVHRVJfdG9fQk4oc2VyaWFsLCBOVUxMKTsKKyAgaWYgKCFibikgeworICAgICAgZnByaW50ZihzdGRlcnIsICJ1bmFibGUgdG8gY29udmVydCBBU04xSU5URUdFUiB0byBCTlxuIik7CisgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICB9CisgIGNoYXIgKnRtcCA9IEJOX2JuMmRlYyhibik7CisgIGlmICghdG1wKSB7CisgICAgICBnX3dhcm5pbmcoc3RkZXJyLCAidW5hYmxlIHRvIGNvbnZlcnQgQk4gdG8gZGVjaW1hbCBzdHJpbmcuXG4iKTsKKyAgICAgIEJOX2ZyZWUoYm4pOworICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgfQorICAvKgorICAgIGlmIChzdHJsZW4odG1wKSA+PSBsZW4pIHsKKyAgICAgIGdfd2FybihzdGRlcnIsICJidWZmZXIgbGVuZ3RoIHNob3J0ZXIgdGhhbiBzZXJpYWwgbnVtYmVyXG4iKTsKKyAgICAgIEJOX2ZyZWUoYm4pOworICAgICAgT1BFTlNTTF9mcmVlKHRtcCk7CisgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgIH0KKyAgKi8KKyAgaWYoIXN0cm5jbXAoc2VyaWFsX251bWJlciwgdG1wLCBzdHJsZW4oc2VyaWFsX251bWJlcikpKXsKKyAgICAgIHJldHZhbD1UUlVFOworICB9ZWxzZXsKKyAgICAgIGdfd2FybmluZygiU2VyaWFsIG51bWJlciBpcyBub3QgdmFsaWQiKTsKKyAgfQorCisgIEJOX2ZyZWUoYm4pOworICBPUEVOU1NMX2ZyZWUodG1wKTsKKyAgcmV0dXJuIHJldHZhbDsKK30KKworZ2Jvb2xlYW4gbXlfYWNjZXNzX21hbmFnZXIoVGhyaWZ0VHJhbnNwb3J0ICogdHJhbnNwb3J0LCBYNTA5ICpjZXJ0LCBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqYWRkciwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFNTTFNvY2tldCAqc3NsU29ja2V0ID0gVEhSSUZUX1NTTF9TT0NLRVQgKHRyYW5zcG9ydCk7CisKKyAgZ19pbmZvKCJQcm9jZXNzaW5nIGFjY2VzcyB0byB0aGUgc2VydmVyIik7CisgIFg1MDlfTkFNRSogaW5hbWUgPSBjZXJ0ID8gWDUwOV9nZXRfaXNzdWVyX25hbWUoY2VydCkgOiBOVUxMOworICBYNTA5X05BTUUqIHNuYW1lID0gY2VydCA/IFg1MDlfZ2V0X3N1YmplY3RfbmFtZShjZXJ0KSA6IE5VTEw7CisKKyAgLyogSXNzdWVyIGlzIHRoZSBhdXRob3JpdHkgd2UgdHJ1c3QgdGhhdCB3YXJyYW50cyBub3RoaW5nIHVzZWZ1bCAqLworICBjb25zdCB1bnNpZ25lZCBjaGFyICogaXNzdWVyID0gZ2V0X2NuX25hbWUoaW5hbWUpOworICBpZihpc3N1ZXIpeworICAgICAgZ2Jvb2xlYW4gdmFsaWQgPSBUUlVFOworICAgICAgZ19pbmZvKCJJc3N1ZXIgKGNuKSAlcyIsIGlzc3Vlcik7CisKKyAgICAgIC8qIElzc3VlciBwaW5uaW5nICovCisgICAgICBpZihzdHJuY21wKElTU1VFUl9DTl9QSU5OSU5HLCBpc3N1ZXIsIHN0cmxlbihJU1NVRVJfQ05fUElOTklORykpKXsKKwkgIGdfd2FybmluZygiVGhlIElzc3VlciBvZiB0aGUgY2VydGlmaWNhdGUgaXMgbm90IHZhbGlkIik7CisJICB2YWxpZD1GQUxTRTsKKyAgICAgIH0KKyAgICAgIE9QRU5TU0xfZnJlZShpc3N1ZXIpOworICAgICAgaWYoIXZhbGlkKQorCXJldHVybiB2YWxpZDsKKyAgfQorCisKKyAgLyogU3ViamVjdCBpcyB3aG8gdGhlIGNlcnRpZmljYXRlIGlzIGlzc3VlZCB0byBieSB0aGUgYXV0aG9yaXR5ICAqLworICBjb25zdCB1bnNpZ25lZCBjaGFyICogc3ViamVjdCA9IGdldF9jbl9uYW1lKHNuYW1lKTsKKyAgaWYoc3ViamVjdCl7CisgICAgICBnX2luZm8oIlN1YmplY3QgKGNuKSAlcyIsIHN1YmplY3QpOworICAgICAgZ2Jvb2xlYW4gdmFsaWQgPSBUUlVFOworCisgICAgICAvKiBTdWJqZWN0IHBpbm5pbmcgKi8KKyAgICAgIGlmKHN0cm5jbXAoU1VCSkVDVF9DTl9QSU5OSU5HLCBzdWJqZWN0LCBzdHJsZW4oU1VCSkVDVF9DTl9QSU5OSU5HKSkpeworCSAgZ193YXJuaW5nKCJUaGUgc3ViamVjdCBvZiB0aGUgY2VydGlmaWNhdGUgaXMgbm90IHZhbGlkIik7CisJICB2YWxpZD1GQUxTRTsKKyAgICAgIH0KKworICAgICAgaWYoIXZhbGlkKQorCXJldHVybiB2YWxpZDsKKworICAgICAgLyogSG9zdCBwaW5uaW5nICAgICAgICovCisgICAgICBpZih2ZXJpZnlfaXAoc3ViamVjdCwgYWRkcikpeworCSAgZ19pbmZvKCJWZXJpZmllZCBzdWJqZWN0Iik7CisgICAgICB9ZWxzZXsKKwkgIGdfaW5mbygiQ2Fubm90IHZlcmlmeSBzdWJqZWN0Iik7CisJICB2YWxpZD1GQUxTRTsKKyAgICAgIH0KKyAgICAgIE9QRU5TU0xfZnJlZShzdWJqZWN0KTsKKworICAgICAgaWYoIXZhbGlkKQorCXJldHVybiB2YWxpZDsKKyAgfQorCisgIGlmKCF2ZXJpZnlfY2VydGlmaWNhdGVfc24oY2VydCwgQ0VSVF9TRVJJQUxfTlVNQkVSKSl7CisgICAgICByZXR1cm4gRkFMU0U7CisgIH1lbHNleworICAgICAgZ19pbmZvKCJWZXJpZmllZCBzZXJpYWwgbnVtYmVyIik7CisgIH0KKworICByZXR1cm4gVFJVRTsKKworfQorCisKKworCisjaWZkZWYgQlVJTERfU0VSVkVSCitzdGF0aWMgdm9pZAordGVzdF9zc2xfYXV0aG9yaXphdGlvbl9tYW5hZ2VyKHZvaWQpCit7CisgIGludCBzdGF0dXM9MDsKKyAgcGlkX3QgcGlkOworICBUaHJpZnRTU0xTb2NrZXQgKnRTU0xzb2NrZXQgPSBOVUxMOworICBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCA9IE5VTEw7CisgIC8qICBpbnQgcG9ydCA9IDUxMTk5OyAqLworICBpbnQgcG9ydCA9IDQ0MzsKKyAgR0Vycm9yICplcnJvcj1OVUxMOworCisgIGd1Y2hhciBidWZbMTddID0gVEVTVF9EQVRBOyAvKiBhIGJ1ZmZlciAqLworCisvKgorICBwaWQgPSBmb3JrICgpOworICAgIGdfYXNzZXJ0ICggcGlkID49IDAgKTsKKworICAgIGlmICggcGlkID09IDAgKQorICAgIHsKKyAgICAgIHRocmlmdF9zc2xfc29ja2V0X3NlcnZlciAocG9ydCk7CisgICAgICBleGl0ICgwKTsKKyAgICB9IGVsc2UgeworCSovCisgIC8qIHBhcmVudCBjb25uZWN0cywgd2FpdCBhIGJpdCBmb3IgdGhlIHNvY2tldCB0byBiZSBjcmVhdGVkICovCisgIHNsZWVwICgxKTsKKworICAvKiBUZXN0IGFnYWluc3QgbGV2ZWwyIG93bmNsb3VkIGNlcnRpZmljYXRlICovCisgIHRTU0xzb2NrZXQgPSB0aHJpZnRfc3NsX3NvY2tldF9uZXdfd2l0aF9ob3N0KFNTTFRMUywgImxvY2FsaG9zdCIsIHBvcnQsICZlcnJvcik7CisgIHRocmlmdF9zc2xfc29ja2V0X3NldF9tYW5hZ2VyKHRTU0xzb2NrZXQsIG15X2FjY2Vzc19tYW5hZ2VyKTsgICAgICAgICAgIC8qIEluc3RhbGwgcGlubmluZyBtYW5hZ2VyICovCisgIC8qIHRocmlmdF9zc2xfbG9hZF9jZXJ0X2Zyb21fZmlsZSh0U1NMc29ja2V0LCAiLi9vd25jbG91ZC5sZXZlbDJjcm0ucGVtIik7ICovCisgIHVuc2lnbmVkIGNoYXIgY2VydF9idWZmZXJbNjU1MzRdOworICByZWFkX2Zyb21fZmlsZShjZXJ0X2J1ZmZlciwgNjU1MzQsICIuLi8uLi9rZXlzL2NsaWVudC5wZW0iKTsKKyAgaWYoIXRocmlmdF9zc2xfbG9hZF9jZXJ0X2Zyb21fYnVmZmVyKHRTU0xzb2NrZXQsIGNlcnRfYnVmZmVyKSl7CisgICAgICBnX3dhcm5pbmcoIkNlcnRpZmljYXRlcyBjYW5ub3QgYmUgbG9hZGVkISIpOworICB9CisKKyAgdHJhbnNwb3J0ID0gVEhSSUZUX1RSQU5TUE9SVCAodFNTTHNvY2tldCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfc3NsX3NvY2tldF9vcGVuICh0cmFuc3BvcnQsIE5VTEwpID09IFRSVUUpOworICBnX2Fzc2VydCAodGhyaWZ0X3NzbF9zb2NrZXRfaXNfb3BlbiAodHJhbnNwb3J0KSk7CisKKyAgdGhyaWZ0X3NzbF9zb2NrZXRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxNywgTlVMTCk7CisKKyAgLyogd3JpdGUgZmFpbCAqLworICBzZW5kX2Vycm9yID0gMTsKKyAgLyoKKyAgICAgIHRocmlmdF9zc2xfc29ja2V0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMSwgTlVMTCk7CisgICAgIHNlbmRfZXJyb3IgPSAwOworICAgICAgdGhyaWZ0X3NzbF9zb2NrZXRfd3JpdGVfZW5kICh0cmFuc3BvcnQsIE5VTEwpOworICAgICAgdGhyaWZ0X3NzbF9zb2NrZXRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgICAqLworICB0aHJpZnRfc3NsX3NvY2tldF9jbG9zZSAodHJhbnNwb3J0LCBOVUxMKTsKKyAgZ19vYmplY3RfdW5yZWYgKHRTU0xzb2NrZXQpOworCisgIC8qICAgIGdfYXNzZXJ0ICggd2FpdCAoJnN0YXR1cykgPT0gcGlkICk7ICovCisgIGdfYXNzZXJ0ICggc3RhdHVzID09IDAgKTsKKyAgLyogIH0gKi8KK30KKyNlbmRpZgorCisKK3N0YXRpYyB2b2lkCit0aHJpZnRfc29ja2V0X3NlcnZlciAoY29uc3QgaW50IHBvcnQpCit7CisgIGludCBieXRlcyA9IDA7CisgIFRocmlmdFNlcnZlclRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKKyAgVGhyaWZ0VHJhbnNwb3J0ICpjbGllbnQgPSBOVUxMOworICBndWNoYXIgYnVmWzEwXTsgLyogYSBidWZmZXIgKi8KKyAgZ3VjaGFyIG1hdGNoWzEwXSA9IFRFU1RfREFUQTsKKworICBUaHJpZnRTZXJ2ZXJTb2NrZXQgKnRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NFUlZFUl9TT0NLRVQsCisJCQkJCSAgICAgICJwb3J0IiwgcG9ydCwgTlVMTCk7CisKKyAgdHJhbnNwb3J0ID0gVEhSSUZUX1NFUlZFUl9UUkFOU1BPUlQgKHRzb2NrZXQpOworICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9saXN0ZW4gKHRyYW5zcG9ydCwgTlVMTCk7CisgIGNsaWVudCA9IHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2FjY2VwdCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgZ19hc3NlcnQgKGNsaWVudCAhPSBOVUxMKTsKKworICAvKiByZWFkIDEwIGJ5dGVzICovCisgIGJ5dGVzID0gdGhyaWZ0X3NzbF9zb2NrZXRfcmVhZCAoY2xpZW50LCBidWYsIDEwLCBOVUxMKTsKKyAgZ19hc3NlcnQgKGJ5dGVzID09IDEwKTsgLyogbWFrZSBzdXJlIHdlJ3ZlIHJlYWQgMTAgYnl0ZXMgKi8KKyAgZ19hc3NlcnQgKCBtZW1jbXAoYnVmLCBtYXRjaCwgMTApID09IDAgKTsgLyogbWFrZSBzdXJlIHdoYXQgd2UgZ290IG1hdGNoZXMgKi8KKworICAvKiBmYWlsZWQgcmVhZCAqLworICByZWN2X2Vycm9yID0gMTsKKyAgdGhyaWZ0X3NzbF9zb2NrZXRfcmVhZCAoY2xpZW50LCBidWYsIDEsIE5VTEwpOworICByZWN2X2Vycm9yID0gMDsKKworICB0aHJpZnRfc3NsX3NvY2tldF9yZWFkX2VuZCAoY2xpZW50LCBOVUxMKTsKKyAgdGhyaWZ0X3NzbF9zb2NrZXRfY2xvc2UgKGNsaWVudCwgTlVMTCk7CisgIGdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKKyAgZ19vYmplY3RfdW5yZWYgKGNsaWVudCk7Cit9CisKK2ludAorbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICBpbnQgcmV0dmFsOworI2lmICghR0xJQl9DSEVDS19WRVJTSU9OICgyLCAzNiwgMCkpCisgIGdfdHlwZV9pbml0KCk7CisjZW5kaWYKKworICBnX3Rlc3RfaW5pdCAoJmFyZ2MsICZhcmd2LCBOVUxMKTsKKworICB0aHJpZnRfc3NsX3NvY2tldF9pbml0aWFsaXplX29wZW5zc2woKTsKKworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdHRyYW5zcG9ydHNzbHNvY2tldC9DcmVhdGVBbmREZXN0cm95IiwgdGVzdF9zc2xfY3JlYXRlX2FuZF9kZXN0cm95KTsKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3R0cmFuc3BvcnRzc2xzb2NrZXQvQ3JlYXRlQW5kU2V0UHJvcGVydGllcyIsIHRlc3Rfc3NsX2NyZWF0ZV9hbmRfc2V0X3Byb3BlcnRpZXMpOworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdHRyYW5zcG9ydHNzbHNvY2tldC9PcGVuQW5kQ2xvc2VOb25TU0xTZXJ2ZXIiLCB0ZXN0X3NzbF9vcGVuX2FuZF9jbG9zZV9ub25fc3NsX3NlcnZlcik7CisgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0dHJhbnNwb3J0c3Nsc29ja2V0L09wZW5BbmRXcml0ZUludmFsaWRTb2NrZXQiLCB0ZXN0X3NzbF93cml0ZV9pbnZhbGlkX3NvY2tldCk7CisKKworCisKKyAgcmV0dmFsID0gZ190ZXN0X3J1biAoKTsKKworICB0aHJpZnRfc3NsX3NvY2tldF9maW5hbGl6ZV9vcGVuc3NsKCk7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKwpkaWZmIC0tZ2l0IGEvbGliL2NsL01ha2VmaWxlLmFtIGIvbGliL2NsL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0YjM4ODYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY2wvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw0MCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK1RIUklGVCA9ICQodG9wX2J1aWxkZGlyKS9jb21waWxlci9jcHAvdGhyaWZ0CisKK2FsbC1sb2NhbDoKKwliYXNoIGVuc3VyZS1leHRlcm5hbHMuc2gKKworcnVuLXRlc3RzOiB0ZXN0L21ha2UtdGVzdC1iaW5hcnkubGlzcAorCSQoU0JDTCkgLS1zY3JpcHQgdGVzdC9tYWtlLXRlc3QtYmluYXJ5Lmxpc3AKKworY2hlY2stbG9jYWw6IHJ1bi10ZXN0cworCS4vcnVuLXRlc3RzCisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIHJ1bi10ZXN0cyBxdWlja2xpc3AubGlzcCBiYWNrcG9ydC11cGRhdGUuemlwCisJJChSTSkgLXJmIGxpYiBleHRlcm5hbHMgcXVpY2tsaXNwCisKK0VYVFJBX0RJU1QgPSBcCisJUkVBRE1FLm1kIFwKKwlSRUFETUVTIFwKKwlsb2FkLWxvY2FsbHkubGlzcCBcCisJdGVzdCBcCisJZW5zdXJlLWV4dGVybmFscy5zaApkaWZmIC0tZ2l0IGEvbGliL2NsL1JFQURNRS5tZCBiL2xpYi9jbC9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ2ZWFmYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jbC9SRUFETUUubWQKQEAgLTAsMCArMSwyNTMgQEAKK1RocmlmdCBDb21tb24gTGlzcCBMaWJyYXJ5CisKK0xpY2Vuc2UKKz09PT09PT0KKworTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKK2Rpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCityZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK3RvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKK3dpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCitzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCitLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwordW5kZXIgdGhlIExpY2Vuc2UuCisKKworCitVc2luZyBUaHJpZnQgd2l0aCBDb21tb24gTGlzcAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgVGhyaWZ0IGlzIGEgcHJvdG9jb2wgYW5kIGxpYnJhcnkgZm9yIGxhbmd1YWdlLWluZGVwZW5kZW50IGNvbW11bmljYXRpb24gYmV0d2VlbiBjb29wZXJhdGluZworIHByb2Nlc3Nlcy4gVGhlIGNvbW11bmljYXRpb24gdGFrZXMgdGhlIGZvcm0gb2YgcmVxdWVzdCBhbmQgcmVzcG9uc2UgbWVzc2FnZXMsIG9mIHdoaWNoIHRoZSBmb3JtcworIGFyZSBzcGVjaWZpZWQgaW4gYWR2YW5jZSB0aHJvdWZoIGEgc2hhcmVkIGludGVyZmFjZSBkZWZpbml0aW9uLiBBIFRocmlmdCBkZWZpbml0aW9uIGZpbGUgaXMgdHJhbnNsYXRlZAorIGludG8gTGlzcCBzb3VyY2UgZmlsZXMsIHdoaWNoIGNvbXByaXNlIHNldmVyYWwgZGVmaW5pdGlvbnM6CisKKyAgKiBUaHJlZSBwYWNrYWdlcywgb25lIGZvciB0aGUgbmFtZXNwYWNlIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBvcGVyYXRvcnMsIGFuZCBvbmUgZWFjaCBmb3IgcmVxdWVzdCBhbmQKKyAgcmVzcG9uc2Ugb3BlcmF0b3JzLgorICAqIFZhcmlvdXMgdHlwZSBkZWZpbml0aW9ucyBhcyBpbXBsZW1lbnRhdGlvbnMgZm9yIFRocmlmdCB0eXBlZGVmIGFuZCBlbnVtIGRlZmluaXRpb25zLgorICAqIERFRi1TVFJVQ1QgYW5kIERFRi1FWENFUFRJT04gZm9ybXMgZm9yIFRocmlmdCBzdHJ1Y3QgYW5kIGV4Y2VwdGlvbiBkZWZpbml0aW9ucy4KKyAgKiBERUYtU0VSVklDRSBmb3JtcyBmb3IgdGhyaWZ0IHNlcnZpY2UgZGVmaW5pdGlvbnMuCisKKyBFYWNoIHNlcnZpY2UgZGVmaW5pdGlvbiBleHBhbmRzIGluIGEgY29sbGVjdGlvbiBvZiBnZW5lcmljIGZ1bmN0aW9uIGRlZmluaXRpb25zLiBGb3IgZWFjaCBgb3BgCisgaW4gdGhlIHNlcnZpY2UgZGVmaW5pdGlvbiwgdHdvIGZ1bmN0aW9ucyBhcmUgZGVmaW5lZAorCisgICogYG9wYC1yZXF1ZXN0IGlzIGRlZmluZWQgZm9yIHVzZSBieSBhIGNsaWVudC4gSXQgYWNjZXB0cyBhbiBhZGRpdGlvbmFsIGluaXRpYWwgYHByb3RvY29sYCBhcmd1bWVudCwKKyAgICB0byBhY3QgYXMgdGhlIGNsaWVudCBwcm94eSBmb3IgdGhlIG9wZXJhdGlvbiBhbmQgbWVkaWF0ZSB0aGUgaW50ZXJhY3Rpb24gd2l0aCBhIHJlbW90ZSBwcm9jZXNzCisgICAgdGhyb3VnaCBhIFRocmlmdC1lbmNvZGVkIHRyYW5zcG9ydCBzdHJlYW0uCisgICogYG9wYC1yZXNwb25zZSBpcyBkZWZpbmVkIGZvciB1c2UgYnkgYSBzZXJ2ZXIuIEl0IGFjY2VwdHMgYSBzaW5nbGUgYHByb3RvY29sYCBhcmd1bWVudC4gQSBzZXJ2ZXIKKyAgICB1c2VzIGl0IHRvIGRlY29kZSB0aGUgcmVxdWVzdCBtZXNzYWdlLCBpbnZva2UgdGhlIGJhc2UgYG9wYCBmdW5jdGlvbiB3aXRoIHRoZSBtZXNzYWdlIGFyZ3VtZW50cywKKyAgICBlbmNvZGUgYW5kIHNlbmQgdGhlIHRoZSByZXN1bHQgYXMgYSByZXNwb25zZSwgYW5kIGhhbmRsZXMgZXhjZXB0aW9ucy4KKworIFRoZSBjbGllbnQgaW50ZXJmYWNlIGlzIG9uZSBvcGVyYXRvcgorCisgICogYHdpdGgtY2xpZW50ICh2YXJpYWJsZSBsb2NhdGlvbikgLiBib2R5YCA6IGNyZWF0ZXMgYSBjb25uZWN0aW9uIGluIGEgZHluYW1pYyBjb250ZXh0IGFuZCBjbG9zZXMgaXQKKyAgICB1cG9uIGV4aXQuIFRoZSB2YXJpYWJsZSBpcyBib3VuZCB0byBhIGNsaWVudCBwcm94eSBzdHJlYW0vcHJvdG9jb2wgaW5zdGFuY2UsIHdoaWNoIHdyYXBzIHRoZQorICAgIGJhc2UgaS9vIHN0cmVhbSAtIHNvY2tldCwgZmlsZSwgZXRjLCB3aXRoIGFuIG9wZXJhdG9ycyB3aGljaCBpbXBsZW1lbnQgdGhlIFRocmlmdCBwcm90b2NvbAorICAgIGFuZCB0cmFuc3BvcnQgbWVjaGFuaXNtcy4KKworIFRoZSBzZXJ2ZXIgaW50ZXJmYWNlIGNvbWJpbmVzIHNlcnZlciBhbmQgc2VydmljZSBvYmplY3RzCisKKyAgKiBgc2VydmUgKGxvY2F0aW9uIHNlcnZpY2UpYCA6IGFjY2VwdHMgY29ubmVjdGlvbnMgb24gdGhlIGRlc2lnbmF0ZWQgcG9ydCBhbmQgcmVzcG9uZHMgdG8KKyAgICByZXF1ZXN0cyBvZiB0aGUgc2VydmljZSdzIG9wZXJhdGlvbnMuCisKKworQnVpbGRpbmcgCistLS0tLS0tLQorCitUaGUgVGhyaWZ0IENvbW1vbiBMaXNwIGxpYnJhcnkgaXMgcGFja2FnZWQgYXMgdGhlIEFTREZbWzFdXSBzeXN0ZW0gYHRocmlmdGAuCitJdCBkZXBlbmRzIG9uIHRoZSBzeXN0ZW1zCisKKyogcHVyaVtbMl1dIDogZm9yIHRoZSB0aHJpZnQgdXJpIGNsYXNzCisqIGNsb3Nlci1tb3BbWzNdXSA6IGZvciBjbGFzcyBtZXRhZGF0YQorKiB0cml2aWFsLXV0Zi04W1s0XV0gOiBmb3Igc3RyaW5nIGNvZGVjcworKiB1c29ja2V0W1s1XV0gOiBmb3IgdGhlIHNvY2tldCB0cmFuc3BvcnQKKyogaWVlZS1mbG9hdHNbWzZdXSA6IGZvciBjb252ZXJzaW9uIGJldHdlZW4gaW50cyBhbmQgZmxvYXRzCisqIHRyaXZpYWwtZ3JheS1zdHJlYW1zW1s3XV0gOiBhbiBhYnN0cmFjdGlvbiBsYXllciBmb3IgZ3JheSBzdHJlYW1zCisqIGFsZXhhbmRyaWFbWzhdXSA6IGhhbmR5IHV0aWxpdGllcworCitUaGUgZGVwZW5kZW5jaWVzIGFyZSBidW5kbGVkIGZvciBsb2NhbCBidWlsZHMgb2YgdGVzdHMgYW5kIHR1dG9yaWFsIGJpbmFyaWVzIC0gCitpdCBpcyBwb3NzaWJsZSB0byB1c2UgdGhvc2UgYnVuZGxlcyB0byBsb2FkIHRoZSBsaWJyYXJ5LCB0b28uCisKK0luIG9yZGVyIHRvIGJ1aWxkIGl0LCByZWdpc3RlciB0aG9zZSBzeXN0ZW1zIHdpdGggQVNERiBhbmQgZXZhbHVhdGU6CisKKyAgICAoYXNkZjpsb2FkLXN5c3RlbSA6dGhyaWZ0KQorCitUaGlzIHdpbGwgY29tcGlsZSBhbmQgbG9hZCB0aGUgTGlzcCBjb21waWxlciBmb3IgVGhyaWZ0IGRlZmluaXRpb24gZmlsZXMsIHRoZQordHJhbnNwb3J0IGFuZCBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbnMsIGFuZCB0aGUgY2xpZW50IGFuZCBzZXJ2ZXIgaW50ZXJmYWNlCitmdW5jdGlvbnMuIEluIG9yZGVyIHRvIHVzZSBUaHJpZnQgaW4gYW4gYXBwbGljYXRpb24sIG9uZSBtdXN0IGFsc28gYXV0aG9yIGFuZC9vcgorbG9hZCB0aGUgaW50ZXJmYWNlIGRlZmluaXRpb25zIGZvciB0aGUgcmVtb3RlIHNlcnZpY2UuW1s5XV0gSWYgb25lIGlzIGltcGxlbWVudGluZyBhIHNlcnZpY2UsCitvbmUgbXVzdCBhbHNvIGRlZmluZSB0aGUgYWN0dWFsIGZ1bmN0aW9ucyB0byB3aGljaCBUaHJpZnQgaXMgdG8gYWN0IGFzIHRoZSBwcm94eQoraW50ZXJmYWNlLiBUaGUgcmVtYWluZGVyIG9mIHRoaXMgZG9jdW1lbnQgZm9sbG93cyB0aGUgVGhyaWZ0IHR1dG9yaWFsIHRvIGlsbHVzdHJhdGUgaG93Cit0byBwZXJmb3JtIHRoZSBzdGVwcworCisgICogaW1wbGVtZW50IHRoZSBzZXJ2aWNlCisgICogdHJhbnNsYXRlIHRoZSBUaHJpZnQgSURMCisgICogbG9hZCB0aGUgTGlzcCBzZXJ2aWNlIGludGVyZmFjZXMKKyAgKiBydW4gYSBzZXJ2ZXIgZm9yIHRoZSBzZXJ2aWNlCisgICogdXNlIGEgY2xpZW50IHRvIGFjY2VzcyB0aGUgc2VydmljZSByZW1vdGVseQorCitOb3RlIHRoYXQsIGlmIG9uZSBpcyB0byBpbXBsZW1lbnQgYSBuZXcgc2VydmljZSwgb25lIHdpbGwgYWxzbyBuZWVkIHRvIGF1dGhvciB0aGUKK0lETCBmaWxlcywgYXMgdGhlcmUgaXMgbm8gZmFjaWxpdHkgdG8gZ2VuZXJhdGUgdGhlbSBmcm9tIGEgc2VydmljZSBpbXBsZW1lbnRhdGlvbi4KKworCitJbXBsZW1lbnQgdGhlIFNlcnZpY2UKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgdHV0b3JpYWwgY29tcHJpc2VzIHNlcnZlcmFsIGZ1bmN0aW9uczogYGFkZGAsIGBwaW5nYCwgYHppcGAsIGFuZCBgY2FsY3VsYXRlYC4KK0VhY2ggdHJhbnNsYXRlZCBJREwgZmlsZSBnZW5lcmF0ZXMgdGhyZWUgcGFja2FnZXMgZm9yIGV2ZXJ5IHNlcnZpY2UuIEluIHRoZSBjYXNlIG9mCit0aGUgdHV0b3JpYWwgZmlsZSwgdGhlIHJlbGV2YW50IHBhY2thZ2VzIGFyZToKKworICAqIHR1dG9yaWFsLmNhbGN1bGF0b3IKKyAgKiB0dXRvcmlhbC5jYWxjdWxhdG9yLWltcGxlbWVudGF0aW9uCisgICogdHV0b3JpYWwuY2FsY3VsYXRvci1yZXNwb25zZQorICAKK1RoaXMgaXMgdG8gc2VwYXJhdGUgdGhlIHJlcXVlc3QgKGdlbmVyYXRlZCksIHJlc3BvbnNlIChnZW5lcmF0ZWQpIGFuZCBpbXBsZW1lbnRhdGlvbgorKG1lYW50IHRvIGJlIGltcGxlbWVudGVkIGJ5IHRoZSBwcm9ncmFtbWVyKSBmdW5jdGlvbnMgZm9yIGRlZmluZWQgVGhyaWZ0IG1ldGhvZHMuCisKK0l0IGlzIHN1Z2dlc3RlZCB0byB3b3JrIGluIHRoZSBgdHV0b3JpYWwtaW1wbGVtZW50YXRpb25gIHBhY2thZ2Ugd2hpbGUgaW1wbGVtZW50aW5nCit0aGUgc2VydmljZXMgLSBpdCBpbXBvcnRzIHRoZSBgY29tbW9uLWxpc3BgIHBhY2thZ2UsIHdoaWxlIHRoZSBzZXJ2aWNlLXNwZWNpZmljIG9uZXMKK2Rvbid0ICh0byBhdm9pZCBjb25mbGljdHMgYmV0d2VlbiBUaHJpZnQgbWV0aG9kIG5hbWVzIGFuZCBmdW5jdGlvbiBuYW1lcyBpbiBgY29tbW9uLWxpc3BgKS4KKworICAgIDs7IGRlZmluZSB0aGUgYmFzZSBvcGVyYXRpb25zCisgICAgCisgICAgKGluLXBhY2thZ2UgOnR1dG9yaWFsLWltcGxlbWVudGF0aW9uKQorICAgIAorICAgIChkZWZ1biB0dXRvcmlhbC5jYWxjdWxhdG9yLWltcGxlbWVudGF0aW9uOmFkZCAobnVtMSBudW0yKQorICAgICAgKGZvcm1hdCB0ICJ+JkFza2VkIHRvIGFkZCB+QSBhbmQgfkEuIiBudW0xIG51bTIpCisgICAgICAoKyBudW0xIG51bTIpKQorICAgIAorICAgIChkZWZ1biB0dXRvcmlhbC5jYWxjdWxhdG9yLWltcGxlbWVudGF0aW9uOnBpbmcgKCkKKyAgICAgIChwcmludCA6cGluZykpCisgICAgCisgICAgKGRlZnVuIHR1dG9yaWFsLmNhbGN1bGF0b3ItaW1wbGVtZW50YXRpb246emlwICgpCisgICAgICAocHJpbnQgOnppcCkpCisgICAgCisgICAgKGRlZnVuIHR1dG9yaWFsLmNhbGN1bGF0b3ItaW1wbGVtZW50YXRpb246Y2FsY3VsYXRlIChsb2dpZCB0YXNrKQorICAgICAgKGNhbGN1bGF0ZS1vcCAod29yay1vcCB0YXNrKSAod29yay1udW0xIHRhc2spICh3b3JrLW51bTIgdGFzaykpKQorICAgIAorICAgIChkZWZnZW5lcmljIGNhbGN1bGF0ZS1vcCAob3AgYXJnMSBhcmcyKQorICAgICAgKDptZXRob2QgOmFyb3VuZCAob3AgYXJnMSBhcmcyKQorICAgICAgICAobGV0ICgocmVzdWx0IChjYWxsLW5leHQtbWV0aG9kKSkpCisgICAgICAgICAgKGZvcm1hdCB0ICJ+JkFza2VkIHRvIGNhbGN1bGF0ZTogfmQgb24gIH5BIGFuZCB+QSA9IH5kLiIgb3AgYXJnMSBhcmcyIHJlc3VsdCkKKyAgICAgICAgICByZXN1bHQpKQorICAgIAorICAgICAgKDptZXRob2QgKChvcCAoZXFsIG9wZXJhdGlvbi5hZGQpKSBhcmcxIGFyZzIpCisgICAgICAgICgrIGFyZzEgYXJnMikpCisgICAgICAoOm1ldGhvZCAoKG9wIChlcWwgb3BlcmF0aW9uLnN1YnRyYWN0KSkgYXJnMSBhcmcyKQorICAgICAgICAoLSBhcmcxIGFyZzIpKQorICAgICAgKDptZXRob2QgKChvcCAoZXFsIG9wZXJhdGlvbi5tdWx0aXBseSkpIGFyZzEgYXJnMikKKyAgICAgICAgKCogYXJnMSBhcmcyKSkKKyAgICAgICg6bWV0aG9kICgob3AgKGVxbCBvcGVyYXRpb24uZGl2aWRlKSkgYXJnMSBhcmcyKQorICAgICAgICAoLyBhcmcxIGFyZzIpKSkKKyAgICAKKyAgICAoZGVmdW4gemlwICgpIChwcmludCAnemlwKSkKKworCitUcmFuc2xhdGUgdGhlIFRocmlmdCBJREwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJREwgZmlsZXMgZW1wbG95IHRoZSBmaWxlIGV4dGVuc2lvbiBgdGhyaWZ0YC4gSW4gdGhpcyBjYXNlLCB0aGVyZSBhcmUgdHdvIGZpbGVzIHRvIHRyYW5zbGF0ZQorICAqIGB0dXRvcmlhbC50aHJpZnRgCisgICogYHNoYXJlZC50aHJpZnRgCitBcyB0aGUgZm9ybWVyIGluY2x1ZGVzIHRoZSBsYXR0ZXIsIG9uZSB1c2VzIGl0IHRvIGdlbmVyYXRlIHRoZSBpbnRlcmZhY2VzOgorCisgICAgJFRIUklGVC9iaW4vdGhyaWZ0IC1yIC0tZ2VuIGNsICRUSFJJRlQvdHV0b3JpYWwvdHV0b3JpYWwudGhyaWZ0CisgICAgCitgLXJgIHN0YW5kcyBmb3IgcmVjdXJzaW9uLCB3aGlsZSBgLS1nZW5gIGxldHMgb25lIGNob29zZSB0aGUgbGFuZ3VhZ2UgdG8gdHJhbnNsYXRlIHRvLgorCisKK0xvYWQgdGhlIExpc3AgdHJhbnNsYXRlZCBzZXJ2aWNlIGludGVyZmFjZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIHRyYW5zbGF0b3IgZ2VuZXJhdGVzIHRocmVlIGZpbGVzIGZvciBlYWNoIElETCBmaWxlLiBGb3IgZXhhbXBsZSBgdHV0b3JpYWwtdHlwZXMubGlzcGAsCitgdHV0b3JpYWwtdmFycy5saXNwYCBhbmQgYW4gYC5hc2RgIGZpbGUgdGhhdCBjYW4gYmUgdXNlZCB0byBsb2FkIHRoZW0gYm90aCBhbmQgcHVsbCBpbgorb3RoZXIgaW5jbHVkZXMgKGxpa2UgYHNoYXJlZGAgd2l0aGluIHRoZSB0dXRvcmlhbCkgYXMgZGVwZW5kZW5jaWVzLgorCisKK1J1biBhIFNlcnZlciBmb3IgdGhlIFNlcnZpY2UKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIGFjdHVhbCBzZXJ2aWNlIG5hbWUsIGFzIHNwZWNpZmllZCBpbiB0aGUgYGRlZi1zZXJ2aWNlYCBmb3JtIGluIGB0dXRvcmlhbC5saXNwYCwgaXMgYGNhbGN1bGF0b3JgLiAKK0VhY2ggc2VydmljZSBkZWZpbml0aW9uIGRlZmluZXMgYSBnbG9iYWwgdmFyaWFibGUgd2l0aCB0aGUgc2VydmljZSBuYW1lIGFuZCBiaW5kcyBpdCB0byBhCitzZXJ2aWNlIGluc3RhbmNlIHdoY2ggZGVzY3JpYmVzIHRoZSBvcGVyYXRpb25zLgorCitJbiBvcmRlciB0byBzdGFydCBhIHNlcnZpY2UsIHNwZWNpZnkgYSBsb2NhdGlvbiBhbmQgdGhlIHNlcnZpY2UgaW5zdGFuY2UuIAorCisgICAgKGluLXBhY2thZ2UgOnR1dG9yaWFsKQorICAgIChzZXJ2ZSAjdSJ0aHJpZnQ6Ly8xMjcuMC4wLjE6OTA5MSIgY2FsY3VsYXRvcikKKworCitVc2UgYSBDbGllbnQgdG8gQWNjZXNzIHRoZSBTZXJ2aWNlIFJlbW90ZWx5CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworW2luIHNvbWUgb3RoZXIgcHJvY2Vzc10gcnVuIHRoZSBjbGllbnQKKworICAgIChpbi1wYWNrYWdlIDpjbC11c2VyKQorCisgICAgKG1hY3JvbGV0ICgoc2hvdyAoZm9ybSkKKyAgICAgICAgICAgICAgICAgYChmb3JtYXQgKnRyYWNlLW91dHB1dCogIn4lfnMgPT5+eyB+c359IgorICAgICAgICAgICAgICAgICAgICAgICAgICAnLGZvcm0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgKG11bHRpcGxlLXZhbHVlLWxpc3QgKGlnbm9yZS1lcnJvcnMgLGZvcm0pKSkpKQorICAgICAgKHdpdGgtY2xpZW50IChwcm90b2NvbCAjdSJ0aHJpZnQ6Ly8xMjcuMC4wLjE6OTA5MSIpCisgICAgICAgIChzaG93ICh0dXRvcmlhbC5jYWxjdWxhdG9yOnBpbmcgcHJvdG9jb2wpKQorICAgICAgICAoc2hvdyAodHV0b3JpYWwuY2FsY3VsYXRvcjphZGQgcHJvdG9jb2wgMSAyKSkKKyAgICAgICAgKHNob3cgKHR1dG9yaWFsLmNhbGN1bGF0b3I6YWRkIHByb3RvY29sIDEgNCkpCisgICAgCisgICAgICAgIChsZXQgKCh0YXNrIChtYWtlLWluc3RhbmNlICd0dXRvcmlhbDp3b3JrCisgICAgICAgICAgICAgICAgICAgICAgOm9wIG9wZXJhdGlvbi5zdWJ0cmFjdCA6bnVtMSAxNSA6bnVtMiAxMCkpKQorICAgICAgICAgIChzaG93ICh0dXRvcmlhbC5jYWxjdWxhdG9yOmNhbGN1bGF0ZSBwcm90b2NvbCAxIHRhc2spKQorICAgICAgICAKKyAgICAgICAgICAoc2V0ZiAodHV0b3JpYWw6d29yay1vcCB0YXNrKSBvcGVyYXRpb24uZGl2aWRlCisgICAgICAgICAgICAgICAgKHR1dG9yaWFsOndvcmstbnVtMSB0YXNrKSAxCisgICAgICAgICAgICAgICAgKHR1dG9yaWFsOndvcmstbnVtMiB0YXNrKSAwKQorICAgICAgICAgIChzaG93ICh0dXRvcmlhbC5jYWxjdWxhdG9yOmNhbGN1bGF0ZSBwcm90b2NvbCAxIHRhc2spKSkKKyAgICAgICAgCisgICAgICAgIChzaG93IChzaGFyZWQuc2hhcmVkLXNlcnZpY2U6Z2V0LXN0cnVjdCBwcm90b2NvbCAxKSkKKyAgICAKKyAgICAgICAgKHNob3cgKHppcCBwcm90b2NvbCkpKSkKKworSXNzdWVzCistLS0tLS0KKworIyMjIG9wdGlvbmFsIGZpZWxkcyAKKyBXaGVyZSB0aGUgSURMIGRlY2xhcmVzIGEgZmllbGQgb3B0aW9ucywgdGhlIGRlZi1zdHJ1Y3QgZm9ybSBpbmNsdWRlcyBubworIGluaXRmb3JtIGZvciB0aGUgc2xvdCBhbmQgdGhlIGVuY29kaW5nIG9wZXJhdG9yIHNraXBzIGFuIHVuYm91bmQgc2xvdC4gVGhpcyBsZWF2ZSBzb21lIGFtYmlndWl0eQorIHdpdGggYm9vbCBmaWVsZHMuCisKKyMjIyBpbnN0YW50aWF0aW9uIHByb3RvY29sIDoKKyBzdHJ1Y3QgY2xhc3NlcyBhcmUgc3RhbmRhcmQgY2xhc3NlcyBhbmQgZXhjZXB0aW9uIGNsYXNzZXMgYXJlCisgd2hhdGV2ZXIgdGhlIGltcGxlbWVudGF0aW9uIHByZXNjcmliZXMuIGRlY29kZXJzIGFwcGx5IG1ha2Utc3RydWN0IHRvIGFuIGluaXRhcmdzIGxpc3QuCisgcGFydGljdWxhcmx5IGF0IHRoZSBzZXJ2aWNlIGVuZCwgdGhlcmUgYXJlIGFkdmFudGFnZXMgdG8gcmVzb3VyY2luZyBzdHJ1Y3RzIGFuZCBkZWNvZGluZworIHdpdGggZGlyZWN0IHNpZGUtZWZmZWN0cyBvbiBzbG90LXZhbHVlcworCisjIyMgbWFwczoKKyBNYXBzIGFyZSBub3cgcmVwcmVzZW50ZWQgYXMgaGFzaCB0YWJsZXMuIEFzIGRhdGEgdGhyb3VnaCB0aGUgY2FsbC9yZXBseSBpbnRlcmZhY2UgaXMgYWxsIHN0YXRpY2FsbHkKKyB0eXBlZCwgaXQgaXMgbm90IG5lY2Vzc2FyeSBmb3IgdGhlIG9iamVjdHMgdG8gdGhlbXNlbHZlcyBpbmRpY2F0ZSB0aGUgY29kaW5nIGZvcm0uIEFzc29jaWF0aW9uIGxpc3RzCisgd291bGQgYmUgc3VmZmljaWVudC4gQXMgdGhlIGtleSB0eXBlIGlzIGFyYml0cmFyeSwgcHJvcGVydHkgbGlzdHMgb2ZmZXIgbm8gYWRkaXRpb25hbCBjb252ZW5pZW5jZToKKyBhcyBgZ2V0ZmAgb3BlcmF0ZXMgd2l0aCBgZXFgIGEgbmV3IGFjY2VzcyBpbnRlcmZhY2Ugd291bGQgYmUgbmVjZXNzYXJ5IGFuZCB0aGV5IHdvdWxkIG5vdCBiZQorIGF2YWlsYWJsZSBmb3IgZnVuY3Rpb24gYXBwbGljYXRpb24uCisKKworIFsxXTogd3d3LmNvbW1vbi1saXNwLm5ldC9hc2RmCisgWzJdOiBodHRwOi8vZ2l0aHViLmNvbS9saXNwL2NvbS5iOS5wdXJpLnBwY3JlCisgWzNdOiB3d3cuY29tbW9uLWxpc3AubmV0L2Nsb3Nlci1tb3AKKyBbNF06IHRyaXZpYWwtdXRmLTgKKyBbNV06IGh0dHBzOi8vZ2l0aHViLmNvbS91c29ja2V0L3Vzb2NrZXQKKyBbNl06IGh0dHBzOi8vZ2l0aHViLmNvbS9tYXJpam5oL2llZWUtZmxvYXRzCisgWzddOiBodHRwczovL2dpdGh1Yi5jb20vdHJpdmlhbC1ncmF5LXN0cmVhbXMvdHJpdmlhbC1ncmF5LXN0cmVhbXMKKyBbOF06IGh0dHBzOi8vZ2l0bGFiLmNvbW1vbi1saXNwLm5ldC9hbGV4YW5kcmlhL2FsZXhhbmRyaWEKKyBbOV06IGh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvdGhyaWZ0L1RocmlmdEdlbmVyYXRpb24KKworKiB1c29ja2V0W1s1XV0gOiBmb3IgdGhlIHNvY2tldCB0cmFuc3BvcnQKKyogaWVlZS1mbG9hdHNbWzZdXSA6IGZvciBjb252ZXJzaW9uIGJldHdlZW4gaW50cyBhbmQgZmxvYXRzCisqIHRyaXZpYWwtZ3JheS1zdHJlYW1zW1s3XV0gOiBhbiBhYnN0cmFjdGlvbiBsYXllciBmb3IgZ3JheSBzdHJlYW1zCisqIGFsZXhhbmRyaWFbWzhdXSA6IGhhbmR5IHV0aWxpdGllcwpkaWZmIC0tZ2l0IGEvbGliL2NsL1JFQURNRVMvcmVhZG1lLWNhc3NhbmRyYS5saXNwIGIvbGliL2NsL1JFQURNRVMvcmVhZG1lLWNhc3NhbmRyYS5saXNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyNzQ0ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY2wvUkVBRE1FUy9yZWFkbWUtY2Fzc2FuZHJhLmxpc3AKQEAgLTAsMCArMSw2NCBAQAorKGluLXBhY2thZ2UgOmNsLXVzZXIpCisKKyMrKG9yIGNjbCBzYmNsKSAvZGV2ZWxvcG1lbnQvc291cmNlL2xpYnJhcnkvCisobG9hZCAiYnVpbGQtaW5pdC5saXNwIikKKworOzs7ICEgZmlyc3QsIHNlbGVjdCB0aGUgYXBpIHZlcnNpb24gaW4gdGhlIGNhc3NhbmRyYSBzeXN0ZW0gZGVmaW5pdGlvbgorOzs7IGFzIG9ubHkgb25lIHNob3VsZCBiZSBsb2FkZWQgYXQgYSB0aW1lLgorKGFzZGY6bG9hZC1zeXN0ZW0gOmRlLnNldGYuY2Fzc2FuZHJhKQorCisoaW4tcGFja2FnZSA6ZGUuc2V0Zi5jYXNzYW5kcmEpCisKKyhkZWZwYXJhbWV0ZXIgKmMtbG9jYXRpb24qCisgIDs7IHJlbW90ZQorICA7OyAjdSJ0aHJpZnQ6Ly9lYzItMTc0LTEyOS02Ni0xNDguY29tcHV0ZS0xLmFtYXpvbmF3cy5jb206OTE2MCIKKyAgOzsgbG9jYWwKKyAgI3UidGhyaWZ0Oi8vMTI3LjAuMC4xOjkxNjAiCisgICJBIGNhc3NhbmRyYSBzZXJ2aWNlIGxvY2F0aW9uIC0gZWl0aGVyIHRoZSBsb2NhbCBvbmUgb3IgYSByZW1vdGUgc2VydmljZSAKKyAtIGFsd2F5cyBhICd0aHJpZnQnIHVyaS4iKQorCisoZGVmcGFyYW1ldGVyICpjKiAodGhyaWZ0OmNsaWVudCAqYy1sb2NhdGlvbiopKQorCisKKyhjYXNzYW5kcmE6ZGVzY3JpYmUta2V5c3BhY2VzICpjKikKKzs7ID0+ICgiS2V5c3BhY2UxIiAic3lzdGVtIikKKworKGNhc3NhbmRyYTpkZXNjcmliZS1jbHVzdGVyLW5hbWUgKmMqKQorOzsgPT4iVGVzdCBDbHVzdGVyIgorCisoY2Fzc2FuZHJhOmRlc2NyaWJlLXZlcnNpb24gKmMqKQorOzsgPT4gIjIuMS4wIgorCisobG9vcCBmb3Igc3BhY2UgaW4gKGNhc3NhbmRyYTpkZXNjcmliZS1rZXlzcGFjZXMgKmMqKQorICAgICAgY29sbGVjdCAobG9vcCBmb3Iga2V5IGJlaW5nIGVhY2ggaGFzaC1rZXkgb2YgKGNhc3NhbmRyYTpkZXNjcmliZS1rZXlzcGFjZSAqYyogc3BhY2UpCisgICAgICAgICAgICAgICAgICAgIHVzaW5nIChoYXNoLXZhbHVlIHZhbHVlKQorICAgICAgICAgICAgICAgICAgICBjb2xsZWN0IChjb25zIGtleQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb29wIGZvciBrZXkgYmVpbmcgZWFjaCBoYXNoLWtleSBvZiB2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIChoYXNoLXZhbHVlIHZhbHVlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxlY3QgKGNvbnMga2V5IHZhbHVlKSkpKSkKKworCisoY2xvc2UgKmMqKQorCisoZGVmdW4gZGVzY3JpYmUtY2Fzc2FuZHJhIChsb2NhdGlvbiAmb3B0aW9uYWwgKHN0cmVhbSAqc3RhbmRhcmQtb3V0cHV0KikpCisgICJQcmludCB0aGUgZmlyc3Qtb3JkZXIgc3RvcmUgbWV0YWRhdGEgZm9yIGEgY2Fzc2FuZHJhIExPQ0FUSU9OLiIKKworICAodGhyaWZ0OndpdGgtY2xpZW50IChjYXNzYW5kcmEgbG9jYXRpb24pCisgICAgKGxldCogKChrZXlzcGFjZS1uYW1lcyAoY2Fzc2FuZHJhOmRlc2NyaWJlLWtleXNwYWNlcyBjYXNzYW5kcmEpKQorICAgICAgICAgICAoY2x1c3RlciAoY2Fzc2FuZHJhOmRlc2NyaWJlLWNsdXN0ZXItbmFtZSBjYXNzYW5kcmEpKQorICAgICAgICAgICAodmVyc2lvbiAoY2Fzc2FuZHJhOmRlc2NyaWJlLXZlcnNpb24gY2Fzc2FuZHJhKSkKKyAgICAgICAgICAgKGtleXNwYWNlLWRlc2NyaXB0aW9ucyAobG9vcCBmb3Igc3BhY2UgaW4ga2V5c3BhY2UtbmFtZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsZWN0IChjb25zIHNwYWNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9vcCBmb3Iga2V5IGJlaW5nIGVhY2ggaGFzaC1rZXkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIChjYXNzYW5kcmE6ZGVzY3JpYmUta2V5c3BhY2UgY2Fzc2FuZHJhIHNwYWNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNpbmcgKGhhc2gtdmFsdWUgdmFsdWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsZWN0IChjb25zIGtleQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9vcCBmb3Iga2V5IGJlaW5nIGVhY2ggaGFzaC1rZXkgb2YgdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNpbmcgKGhhc2gtdmFsdWUgdmFsdWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxlY3QgKGNvbnMga2V5IHZhbHVlKSkpKSkpKSkKKyAgICAgIChmb3JtYXQgc3RyZWFtICJ+JmNvbm5lY3Rpb24gdG8gOiB+YSIgY2Fzc2FuZHJhKQorICAgICAgKGZvcm1hdCBzdHJlYW0gIn4mdmVyc2lvbiA6IH5hIiB2ZXJzaW9uKQorICAgICAgKGZvcm1hdCBzdHJlYW0gIn4mY2x1c3RlciA6IH5hIiBjbHVzdGVyKQorICAgICAgKGZvcm1hdCBzdHJlYW0gIn4ma2V5c3BhY2Vzfnt+e34lfiVzcGFjZTogfmF+QHt+JSAgfnt+YSA6fkB7fjIwdH46d35efiV+fX59fn1+fX59IiBrZXlzcGFjZS1kZXNjcmlwdGlvbnMpKSkpCisKKzs7OyAoZGVzY3JpYmUtY2Fzc2FuZHJhICpjLWxvY2F0aW9uKikKZGlmZiAtLWdpdCBhL2xpYi9jbC9lbnN1cmUtZXh0ZXJuYWxzLnNoIGIvbGliL2NsL2Vuc3VyZS1leHRlcm5hbHMuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDQ5NWYwMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jbC9lbnN1cmUtZXh0ZXJuYWxzLnNoCkBAIC0wLDAgKzEsMTYgQEAKKyMhL2Jpbi9iYXNoCisKK3NldCAtZQorCitpZiBbWyAhIC1lIHF1aWNrbGlzcC5saXNwIF1dOyB0aGVuIGN1cmwgLU8gaHR0cHM6Ly9iZXRhLnF1aWNrbGlzcC5vcmcvcXVpY2tsaXNwLmxpc3A7IGZpCitzYmNsIC0tbG9hZCBxdWlja2xpc3AubGlzcCBcCisgICAgIC0tZXZhbCAiKGlnbm9yZS1lcnJvcnMgKHF1aWNrbGlzcC1xdWlja3N0YXJ0Omluc3RhbGwgOnBhdGggXCJxdWlja2xpc3AvXCIpKSIgXAorICAgICAtLWV2YWwgIihsb2FkIFwicXVpY2tsaXNwL3NldHVwLmxpc3BcIikiIFwKKyAgICAgLS1ldmFsICIocXVpY2tsaXNwOmJ1bmRsZS1zeXN0ZW1zICcoIzpwdXJpICM6dXNvY2tldCAjOmNsb3Nlci1tb3AgIzp0cml2aWFsLXV0Zi04ICM6aWVlZS1mbG9hdHMgIzp0cml2aWFsLWdyYXktc3RyZWFtcyAjOmFsZXhhbmRyaWEgIzpib3JkZWF1eC10aHJlYWRzICM6Y2wtcHBjcmUgIzpmaWFzY28gIzpuZXQuZGlkaWVydmVybmEuY2xvbikgOnRvIFwiZXh0ZXJuYWxzL1wiKSIgXAorICAgICAtLWV2YWwgIihxdWl0KSIgXAorICAgICAtLW5vLXVzZXJpbml0CitpZiBbWyAhIC1lIGJhY2twb3J0LXVwZGF0ZS56aXAgXV07IHRoZW4KKyAgICBjdXJsIC1PIC1MIGh0dHBzOi8vZ2l0aHViLmNvbS9UdXJ0bGVXYXJlUEwvZGUuc2V0Zi50aHJpZnQvYXJjaGl2ZS9iYWNrcG9ydC11cGRhdGUuemlwOworZmkKK21rZGlyIC1wIGxpYgordW56aXAgLXUgYmFja3BvcnQtdXBkYXRlLnppcCAtZCBsaWIKZGlmZiAtLWdpdCBhL2xpYi9jbC9sb2FkLWxvY2FsbHkubGlzcCBiL2xpYi9jbC9sb2FkLWxvY2FsbHkubGlzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTJjNzA0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NsL2xvYWQtbG9jYWxseS5saXNwCkBAIC0wLDAgKzEsMjMgQEAKKyhpbi1wYWNrYWdlICM6Y2wtdXNlcikKKworOzs7OyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzs7OzsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOzs7OyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzs7OzsKKzs7OzsgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOzs7OworOzs7OyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis7Ozs7IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis7Ozs7IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOzs7OyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis7Ozs7IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCis7Ozs7IEp1c3QgYSBzY3JpcHQgZm9yIGxvYWRpbmcgdGhlIGxpYnJhcnkgaXRzZWxmLCB1c2luZyBidW5kbGVkIGRlcGVuZGVuY2llcy4KKzs7OzsgVGhpcyBpcyBoZXJlIGZvciB3aGVuIHdlIHdhbnQgdG8gYnVpbGQgdGhlIHNlbGYtdGVzdCBhbmQgY3Jvc3MtdGVzdAorOzs7OyBiaW5hcmllcy4KKworKHJlcXVpcmUgImFzZGYiKQorCisobG9hZCAobWVyZ2UtcGF0aG5hbWVzICJleHRlcm5hbHMvYnVuZGxlLmxpc3AiICpsb2FkLXRydWVuYW1lKikpCisoYXNkZjpsb2FkLWFzZCAobWVyZ2UtcGF0aG5hbWVzICJsaWIvZGUuc2V0Zi50aHJpZnQtYmFja3BvcnQtdXBkYXRlL3RocmlmdC5hc2QiICpsb2FkLXRydWVuYW1lKikpCisoYXNkZjpsb2FkLXN5c3RlbSA6dGhyaWZ0KQpkaWZmIC0tZ2l0IGEvbGliL2NsL3Rlc3QvbWFrZS10ZXN0LWJpbmFyeS5saXNwIGIvbGliL2NsL3Rlc3QvbWFrZS10ZXN0LWJpbmFyeS5saXNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlN2E1OGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY2wvdGVzdC9tYWtlLXRlc3QtYmluYXJ5Lmxpc3AKQEAgLTAsMCArMSwzMSBAQAorOzs7OyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzs7OzsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOzs7OyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzs7OzsKKzs7OzsgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOzs7OworOzs7OyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis7Ozs7IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis7Ozs7IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOzs7OyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis7Ozs7IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCis7Ozs7IFRoaXMgZmlsZSBpcyB1c2VkIHRvIGJ1aWxkIHRoZSBiaW5hcnkgdGhhdCBydW5zIGFsbCBzZWxmLXRlc3RzLiBUaGUKKzs7OzsgYmluYXJ5IGlzIHRoZW4gbWVhbnQgdG8gYmUgaG9va2VkIHVwIHRvIFRocmlmdCdzIGBtYWtlIGNoZWNrYCBmYWNpbGl0eSwKKzs7OzsgYnV0IGNhbiBlYXNpbHkgYmUgcnVuIG9uIGl0cyBvd24gYXMgd2VsbC4KKworKGluLXBhY2thZ2UgIzpjbC11c2VyKQorCisocmVxdWlyZSAiYXNkZiIpCisobG9hZCAobWVyZ2UtcGF0aG5hbWVzICIuLi9sb2FkLWxvY2FsbHkubGlzcCIgKmxvYWQtdHJ1ZW5hbWUqKSkKKyhhc2RmOmxvYWQtYXNkIChtZXJnZS1wYXRobmFtZXMgIi4uL2xpYi9kZS5zZXRmLnRocmlmdC1iYWNrcG9ydC11cGRhdGUvdGVzdC90aHJpZnQtdGVzdC5hc2QiICpsb2FkLXRydWVuYW1lKikpCisoYXNkZjpsb2FkLXN5c3RlbSA6dGhyaWZ0LXRlc3QpCisoYXNkZjpsb2FkLXN5c3RlbSA6bmV0LmRpZGllcnZlcm5hLmNsb24pCisKKyhuZXQuZGlkaWVydmVybmEuY2xvbjpuaWNrbmFtZS1wYWNrYWdlKQorCisoZGVmdW4gbWFpbiAoKQorICAobGV0ICgocmVzdWx0IChpZiAoZmlhc2NvOnJ1bi10ZXN0cyAndGhyaWZ0LXRlc3QpIDAgLTEpKSkKKyAgICAoY2xvbjpleGl0IHJlc3VsdCkpKQorCisoY2xvbjpkdW1wICJydW4tdGVzdHMiIG1haW4pCmRpZmYgLS1naXQgYS9saWIvY29jb2EvY29kaW5nX3N0YW5kYXJkcy5tZCBiL2xpYi9jb2NvYS9jb2Rpbmdfc3RhbmRhcmRzLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMDM5MGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2EvY29kaW5nX3N0YW5kYXJkcy5tZApAQCAtMCwwICsxIEBACitQbGVhc2UgZm9sbG93IFtHZW5lcmFsIENvZGluZyBTdGFuZGFyZHNdKC9kb2MvY29kaW5nX3N0YW5kYXJkcy5tZCkKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvVEFwcGxpY2F0aW9uRXJyb3IuaCBiL2xpYi9jb2NvYS9zcmMvVEFwcGxpY2F0aW9uRXJyb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzk4ODFhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvY29hL3NyYy9UQXBwbGljYXRpb25FcnJvci5oCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2ltcG9ydCAiVFByb3RvY29sLmgiCisKK2V4dGVybiBOU1N0cmluZyAqVEFwcGxpY2F0aW9uRXJyb3JEb21haW47CisKK3R5cGVkZWYgTlNfRU5VTSAoaW50LCBUQXBwbGljYXRpb25FcnJvcikgeworICBUQXBwbGljYXRpb25FcnJvclVua25vd24gICAgICAgICAgICAgICAgPSAwLAorICBUQXBwbGljYXRpb25FcnJvclVua25vd25NZXRob2QgICAgICAgICAgPSAxLAorICBUQXBwbGljYXRpb25FcnJvckludmFsaWRNZXNzYWdlVHlwZSAgICAgPSAyLAorICBUQXBwbGljYXRpb25FcnJvcldyb25nTWV0aG9kTmFtZSAgICAgICAgPSAzLAorICBUQXBwbGljYXRpb25FcnJvckJhZFNlcXVlbmNlSWQgICAgICAgICAgPSA0LAorICBUQXBwbGljYXRpb25FcnJvck1pc3NpbmdSZXN1bHQgICAgICAgICAgPSA1LAorICBUQXBwbGljYXRpb25FcnJvckludGVybmFsRXJyb3IgICAgICAgICAgPSA2LAorICBUQXBwbGljYXRpb25FcnJvclByb3RvY29sRXJyb3IgICAgICAgICAgPSA3LAorICBUQXBwbGljYXRpb25FcnJvckludmFsaWRUcmFuc2Zvcm0gICAgICAgPSA4LAorICBUQXBwbGljYXRpb25FcnJvckludmFsaWRQcm90b2NvbCAgICAgICAgPSA5LAorICBUQXBwbGljYXRpb25FcnJvclVuc3VwcG9ydGVkQ2xpZW50VHlwZSAgPSAxMCwKK307CisKKworZXh0ZXJuIE5TU3RyaW5nICpUQXBwbGljYXRpb25FcnJvck5hbWVLZXk7CitleHRlcm4gTlNTdHJpbmcgKlRBcHBsaWNhdGlvbkVycm9yUmVhc29uS2V5OworZXh0ZXJuIE5TU3RyaW5nICpUQXBwbGljYXRpb25FcnJvck1ldGhvZEtleTsKKworCitAaW50ZXJmYWNlIE5TRXJyb3IgKFRBcHBsaWNhdGlvbkVycm9yKQorCitAcHJvcGVydHkgKHJlYWRvbmx5LCBjb3B5KSBOU1N0cmluZyAqbmFtZTsKK0Bwcm9wZXJ0eSAocmVhZG9ubHksIGNvcHkpIE5TU3RyaW5nICpyZWFzb247CisKKysoaW5zdGFuY2V0eXBlKSBlcnJvcldpdGhUeXBlOihUQXBwbGljYXRpb25FcnJvcil0eXBlIHJlYXNvbjooTlNTdHJpbmcgKilyZWFzb247CisKKysoaW5zdGFuY2V0eXBlKSByZWFkOihpZDxUUHJvdG9jb2w+KXByb3RvY29sOworCistKEJPT0wpIHdyaXRlOihpZDxUUHJvdG9jb2w+KW91dFByb3RvY29sIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcjsKKworQGVuZApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9UQXBwbGljYXRpb25FcnJvci5tIGIvbGliL2NvY29hL3NyYy9UQXBwbGljYXRpb25FcnJvci5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4MGJjMGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL1RBcHBsaWNhdGlvbkVycm9yLm0KQEAgLTAsMCArMSwyMzEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2ltcG9ydCAiVEFwcGxpY2F0aW9uRXJyb3IuaCIKKyNpbXBvcnQgIlRQcm90b2NvbFV0aWwuaCIKKworCitOU1N0cmluZyAqVEFwcGxpY2F0aW9uRXJyb3JEb21haW4gPSBAIlRBcHBsaWNhdGlvbkVycm9yRG9tYWluIjsKKworCitOU1N0cmluZyAqVEFwcGxpY2F0aW9uRXJyb3JOYW1lS2V5ID0gQCJuYW1lIjsKK05TU3RyaW5nICpUQXBwbGljYXRpb25FcnJvclJlYXNvbktleSA9IEAicmVhc29uIjsKK05TU3RyaW5nICpUQXBwbGljYXRpb25FcnJvck1ldGhvZEtleSA9IEAibWV0aG9kIjsKKworCitAaW1wbGVtZW50YXRpb24gTlNFcnJvciAoVEFwcGxpY2F0aW9uRXJyb3IpCisKKy0oTlNTdHJpbmcgKikgcmVhc29uCit7CisgIHJldHVybiBzZWxmLnVzZXJJbmZvW1RBcHBsaWNhdGlvbkVycm9yUmVhc29uS2V5XTsKK30KKworLShOU1N0cmluZyAqKSBuYW1lCit7CisgIHJldHVybiBzZWxmLnVzZXJJbmZvW1RBcHBsaWNhdGlvbkVycm9yTmFtZUtleV07Cit9CisKKysoaW5zdGFuY2V0eXBlKSBlcnJvcldpdGhUeXBlOihUQXBwbGljYXRpb25FcnJvcil0eXBlIHJlYXNvbjooTlNTdHJpbmcgKilyZWFzb24KK3sKKyAgTlNTdHJpbmcgKm5hbWU7CisgIHN3aXRjaCAodHlwZSkgeworICBjYXNlIFRBcHBsaWNhdGlvbkVycm9yVW5rbm93bk1ldGhvZDoKKyAgICBuYW1lID0gQCJVbmtub3duIE1ldGhvZCI7CisgICAgYnJlYWs7CisKKyAgY2FzZSBUQXBwbGljYXRpb25FcnJvckludmFsaWRNZXNzYWdlVHlwZToKKyAgICBuYW1lID0gQCJJbnZhbGlkIE1lc3NhZ2UgVHlwZSI7CisgICAgYnJlYWs7CisKKyAgY2FzZSBUQXBwbGljYXRpb25FcnJvcldyb25nTWV0aG9kTmFtZToKKyAgICBuYW1lID0gQCJXcm9uZyBNZXRob2QgTmFtZSI7CisgICAgYnJlYWs7CisKKyAgY2FzZSBUQXBwbGljYXRpb25FcnJvckJhZFNlcXVlbmNlSWQ6CisgICAgbmFtZSA9IEAiQmFkIFNlcXVlbmNlIElEIjsKKyAgICBicmVhazsKKworICBjYXNlIFRBcHBsaWNhdGlvbkVycm9yTWlzc2luZ1Jlc3VsdDoKKyAgICBuYW1lID0gQCJNaXNzaW5nIFJlc3VsdCI7CisgICAgYnJlYWs7CisKKyAgY2FzZSBUQXBwbGljYXRpb25FcnJvckludGVybmFsRXJyb3I6CisgICAgbmFtZSA9IEAiSW50ZXJuYWwgRXJyb3IiOworICAgIGJyZWFrOworCisgIGNhc2UgVEFwcGxpY2F0aW9uRXJyb3JQcm90b2NvbEVycm9yOgorICAgIG5hbWUgPSBAIlByb3RvY29sIEVycm9yIjsKKyAgICBicmVhazsKKworICBjYXNlIFRBcHBsaWNhdGlvbkVycm9ySW52YWxpZFRyYW5zZm9ybToKKyAgICBuYW1lID0gQCJJbnZhbGlkIFRyYW5zZm9ybSI7CisgICAgYnJlYWs7CisKKyAgY2FzZSBUQXBwbGljYXRpb25FcnJvckludmFsaWRQcm90b2NvbDoKKyAgICBuYW1lID0gQCJJbnZhbGlkIFByb3RvY29sIjsKKyAgICBicmVhazsKKworICBjYXNlIFRBcHBsaWNhdGlvbkVycm9yVW5zdXBwb3J0ZWRDbGllbnRUeXBlOgorICAgIG5hbWUgPSBAIlVuc3VwcG9ydGVkIENsaWVudCBUeXBlIjsKKyAgICBicmVhazsKKworICBkZWZhdWx0OgorICAgIG5hbWUgPSBAIlVua25vd24iOworICAgIGJyZWFrOworICB9CisKKyAgTlNEaWN0aW9uYXJ5ICp1c2VySW5mbzsKKyAgaWYgKHJlYXNvbikgeworICAgIHVzZXJJbmZvID0gQHtUQXBwbGljYXRpb25FcnJvck5hbWVLZXk6bmFtZSwKKyAgICAgICAgICAgICAgICAgVEFwcGxpY2F0aW9uRXJyb3JSZWFzb25LZXk6cmVhc29ufTsKKyAgfQorICBlbHNlIHsKKyAgICB1c2VySW5mbyA9IEB7VEFwcGxpY2F0aW9uRXJyb3JOYW1lS2V5Om5hbWV9OworICB9CisKKyAgcmV0dXJuIFtOU0Vycm9yIGVycm9yV2l0aERvbWFpbjpUQXBwbGljYXRpb25FcnJvckRvbWFpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOnR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySW5mbzp1c2VySW5mb107Cit9CisKKworKyhpbnN0YW5jZXR5cGUpIHJlYWQ6KGlkPFRQcm90b2NvbD4pcHJvdG9jb2wKK3sKKyAgTlNTdHJpbmcgKnJlYXNvbiA9IG5pbDsKKyAgU0ludDMyIHR5cGUgPSBUQXBwbGljYXRpb25FcnJvclVua25vd247CisgIFNJbnQzMiBmaWVsZFR5cGU7CisgIFNJbnQzMiBmaWVsZElEOworCisgIE5TRXJyb3IgKmVycm9yOworICBpZiAoIVtwcm90b2NvbCByZWFkU3RydWN0QmVnaW5SZXR1cm5pbmdOYW1lOk5VTEwgZXJyb3I6JmVycm9yXSkgeworICAgIHJldHVybiBlcnJvcjsKKyAgfQorCisgIHdoaWxlICh0cnVlKSB7CisKKyAgICBpZiAoIVtwcm90b2NvbCByZWFkRmllbGRCZWdpblJldHVybmluZ05hbWU6TlVMTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTomZmllbGRUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZElEOiZmaWVsZElECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiZlcnJvcl0pCisgICAgeworICAgICAgcmV0dXJuIGVycm9yOworICAgIH0KKworICAgIGlmIChmaWVsZFR5cGUgPT0gVFR5cGVTVE9QKSB7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGZpZWxkSUQpIHsKKyAgICBjYXNlIDE6CisgICAgICBpZiAoZmllbGRUeXBlID09IFRUeXBlU1RSSU5HKSB7CisgICAgICAgIGlmICghW3Byb3RvY29sIHJlYWRTdHJpbmc6JnJlYXNvbiBlcnJvcjomZXJyb3JdKSB7CisgICAgICAgICAgcmV0dXJuIGVycm9yOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgaWYgKCFbVFByb3RvY29sVXRpbCBza2lwVHlwZTpmaWVsZFR5cGUgb25Qcm90b2NvbDpwcm90b2NvbCBlcnJvcjomZXJyb3JdKSB7CisgICAgICAgICAgcmV0dXJuIGVycm9yOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgMjoKKyAgICAgIGlmIChmaWVsZFR5cGUgPT0gVFR5cGVJMzIpIHsKKyAgICAgICAgaWYgKCFbcHJvdG9jb2wgcmVhZEkzMjomdHlwZSBlcnJvcjomZXJyb3JdKSB7CisgICAgICAgICAgcmV0dXJuIGVycm9yOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgaWYgKCFbVFByb3RvY29sVXRpbCBza2lwVHlwZTpmaWVsZFR5cGUgb25Qcm90b2NvbDpwcm90b2NvbCBlcnJvcjomZXJyb3JdKSB7CisgICAgICAgICAgcmV0dXJuIGVycm9yOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBpZiAoIVtUUHJvdG9jb2xVdGlsIHNraXBUeXBlOmZpZWxkVHlwZSBvblByb3RvY29sOnByb3RvY29sIGVycm9yOiZlcnJvcl0pIHsKKyAgICAgICAgcmV0dXJuIGVycm9yOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmICghW3Byb3RvY29sIHJlYWRGaWVsZEVuZDomZXJyb3JdKSB7CisgICAgICByZXR1cm4gZXJyb3I7CisgICAgfQorCisgIH0KKworICBpZiAoIVtwcm90b2NvbCByZWFkU3RydWN0RW5kOiZlcnJvcl0pIHsKKyAgICByZXR1cm4gZXJyb3I7CisgIH0KKworICByZXR1cm4gW05TRXJyb3IgZXJyb3JXaXRoVHlwZTp0eXBlIHJlYXNvbjpyZWFzb25dOworfQorCisKKy0oQk9PTCkgd3JpdGU6KGlkPFRQcm90b2NvbD4pcHJvdG9jb2wgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIGlmICghW3Byb3RvY29sIHdyaXRlU3RydWN0QmVnaW5XaXRoTmFtZTpAIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiIgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisKKyAgaWYgKHNlbGYubG9jYWxpemVkRGVzY3JpcHRpb24gIT0gbmlsKSB7CisgICAgaWYgKCFbcHJvdG9jb2wgd3JpdGVGaWVsZEJlZ2luV2l0aE5hbWU6QCJtZXNzYWdlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOlRUeXBlU1RSSU5HCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkSUQ6MSBlcnJvcjplcnJvcl0pCisgICAgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKworICAgIGlmICghW3Byb3RvY29sIHdyaXRlU3RyaW5nOnNlbGYubG9jYWxpemVkRGVzY3JpcHRpb24gZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorCisgICAgaWYgKCFbcHJvdG9jb2wgd3JpdGVGaWVsZEVuZDplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisgIH0KKworICBpZiAoIVtwcm90b2NvbCB3cml0ZUZpZWxkQmVnaW5XaXRoTmFtZTpAInR5cGUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOlRUeXBlSTMyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZElEOjIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6ZXJyb3JdKQorICB7CisgICAgcmV0dXJuIE5POworICB9CisKKyAgaWYgKCFbcHJvdG9jb2wgd3JpdGVJMzI6KFNJbnQzMilzZWxmLmNvZGUgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisKKyAgaWYgKCFbcHJvdG9jb2wgd3JpdGVGaWVsZEVuZDplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKworICBpZiAoIVtwcm90b2NvbCB3cml0ZUZpZWxkU3RvcDplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKworICBpZiAoIVtwcm90b2NvbCB3cml0ZVN0cnVjdEVuZDplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKworICByZXR1cm4gWUVTOworfQorCitAZW5kCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5oIGIvbGliL2NvY29hL3NyYy9UQXBwbGljYXRpb25FeGNlcHRpb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2IwMjdkNi4uMDAwMDAwMAotLS0gYS9saWIvY29jb2Evc3JjL1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW1wb3J0ICJURXhjZXB0aW9uLmgiCi0jaW1wb3J0ICJUUHJvdG9jb2wuaCIKLQotZW51bSB7Ci0gIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbl9VTktOT1dOID0gMCwKLSAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uX1VOS05PV05fTUVUSE9EID0gMSwKLSAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uX0lOVkFMSURfTUVTU0FHRV9UWVBFID0gMiwKLSAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uX1dST05HX01FVEhPRF9OQU1FID0gMywKLSAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uX0JBRF9TRVFVRU5DRV9JRCA9IDQsCi0gIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbl9NSVNTSU5HX1JFU1VMVCA9IDUsCi0gIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbl9JTlRFUk5BTF9FUlJPUiA9IDYsCi0gIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbl9QUk9UT0NPTF9FUlJPUiA9IDcsCi0gIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbl9JTlZBTElEX1RSQU5TRk9STSA9IDgsCi0gIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbl9JTlZBTElEX1BST1RPQ09MID0gOSwKLSAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uX1VOU1VQUE9SVEVEX0NMSUVOVF9UWVBFID0gMTAKLX07Ci0KLS8vIEZJWE1FCi1AaW50ZXJmYWNlIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiA6IFRFeGNlcHRpb24gewotICBpbnQgbVR5cGU7Ci19Ci0KLSsgKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiAqKSByZWFkOiAoaWQgPFRQcm90b2NvbD4pIHByb3RvY29sOwotCi0tICh2b2lkKSB3cml0ZTogKGlkIDxUUHJvdG9jb2w+KSBwcm90b2NvbDsKLQotKyAoVEFwcGxpY2F0aW9uRXhjZXB0aW9uICopIGV4Y2VwdGlvbldpdGhUeXBlOiAoaW50KSB0eXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb246IChOU1N0cmluZyAqKSBtZXNzYWdlOwotCi1AZW5kCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5tIGIvbGliL2NvY29hL3NyYy9UQXBwbGljYXRpb25FeGNlcHRpb24ubQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc0ZGZjNS4uMDAwMDAwMAotLS0gYS9saWIvY29jb2Evc3JjL1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5tCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2ltcG9ydCAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmgiCi0jaW1wb3J0ICJUUHJvdG9jb2xVdGlsLmgiCi0jaW1wb3J0ICJUT2JqZWN0aXZlLUMuaCIKLQotQGltcGxlbWVudGF0aW9uIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbgotCi0tIChpZCkgaW5pdFdpdGhUeXBlOiAoaW50KSB0eXBlCi0gICAgICAgICAgICAgcmVhc29uOiAoTlNTdHJpbmcgKikgcmVhc29uCi17Ci0gIG1UeXBlID0gdHlwZTsKLQotICBOU1N0cmluZyAqIG5hbWU7Ci0gIHN3aXRjaCAodHlwZSkgewotICBjYXNlIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbl9VTktOT1dOX01FVEhPRDoKLSAgICBuYW1lID0gQCJVbmtub3duIG1ldGhvZCI7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgVEFwcGxpY2F0aW9uRXhjZXB0aW9uX0lOVkFMSURfTUVTU0FHRV9UWVBFOgotICAgIG5hbWUgPSBAIkludmFsaWQgbWVzc2FnZSB0eXBlIjsKLSAgICBicmVhazsKLSAgY2FzZSBUQXBwbGljYXRpb25FeGNlcHRpb25fV1JPTkdfTUVUSE9EX05BTUU6Ci0gICAgbmFtZSA9IEAiV3JvbmcgbWV0aG9kIG5hbWUiOwotICAgIGJyZWFrOwotICBjYXNlIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbl9CQURfU0VRVUVOQ0VfSUQ6Ci0gICAgbmFtZSA9IEAiQmFkIHNlcXVlbmNlIElEIjsKLSAgICBicmVhazsKLSAgY2FzZSBUQXBwbGljYXRpb25FeGNlcHRpb25fTUlTU0lOR19SRVNVTFQ6Ci0gICAgbmFtZSA9IEAiTWlzc2luZyByZXN1bHQiOwotICAgIGJyZWFrOwotICBjYXNlIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbl9JTlRFUk5BTF9FUlJPUjoKLSAgICBuYW1lID0gQCJJbnRlcm5hbCBlcnJvciI7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgVEFwcGxpY2F0aW9uRXhjZXB0aW9uX1BST1RPQ09MX0VSUk9SOgotICAgIG5hbWUgPSBAIlByb3RvY29sIGVycm9yIjsKLSAgICBicmVhazsKLSAgY2FzZSBUQXBwbGljYXRpb25FeGNlcHRpb25fSU5WQUxJRF9UUkFOU0ZPUk06Ci0gICAgbmFtZSA9IEAiSW52YWxpZCB0cmFuc2Zvcm0iOwotICAgIGJyZWFrOwotICBjYXNlIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbl9JTlZBTElEX1BST1RPQ09MOgotICAgIG5hbWUgPSBAIkludmFsaWQgcHJvdG9jb2wiOwotICAgIGJyZWFrOwotICBjYXNlIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbl9VTlNVUFBPUlRFRF9DTElFTlRfVFlQRToKLSAgICBuYW1lID0gQCJVbnN1cHBvcnRlZCBjbGllbnQgdHlwZSI7Ci0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6Ci0gICAgbmFtZSA9IEAiVW5rbm93biI7Ci0gICAgYnJlYWs7Ci0gIH0KLQotICBzZWxmID0gW3N1cGVyIGluaXRXaXRoTmFtZTogbmFtZSByZWFzb246IHJlYXNvbiB1c2VySW5mbzogbmlsXTsKLSAgcmV0dXJuIHNlbGY7Ci19Ci0KLQotKyAoVEFwcGxpY2F0aW9uRXhjZXB0aW9uICopIHJlYWQ6IChpZCA8VFByb3RvY29sPikgcHJvdG9jb2wKLXsKLSAgTlNTdHJpbmcgKiByZWFzb24gPSBuaWw7Ci0gIGludCB0eXBlID0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uX1VOS05PV047Ci0gIGludCBmaWVsZFR5cGU7Ci0gIGludCBmaWVsZElEOwotCi0gIFtwcm90b2NvbCByZWFkU3RydWN0QmVnaW5SZXR1cm5pbmdOYW1lOiBOVUxMXTsKLQotICB3aGlsZSAodHJ1ZSkgewotICAgIFtwcm90b2NvbCByZWFkRmllbGRCZWdpblJldHVybmluZ05hbWU6IE5VTEwKLSAgICAgICAgICAgICAgdHlwZTogJmZpZWxkVHlwZQotICAgICAgICAgICAgICBmaWVsZElEOiAmZmllbGRJRF07Ci0gICAgaWYgKGZpZWxkVHlwZSA9PSBUVHlwZV9TVE9QKSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgc3dpdGNoIChmaWVsZElEKSB7Ci0gICAgY2FzZSAxOgotICAgICAgaWYgKGZpZWxkVHlwZSA9PSBUVHlwZV9TVFJJTkcpIHsKLSAgICAgICAgcmVhc29uID0gW3Byb3RvY29sIHJlYWRTdHJpbmddOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgW1RQcm90b2NvbFV0aWwgc2tpcFR5cGU6IGZpZWxkVHlwZSBvblByb3RvY29sOiBwcm90b2NvbF07Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICBpZiAoZmllbGRUeXBlID09IFRUeXBlX0kzMikgewotICAgICAgICB0eXBlID0gW3Byb3RvY29sIHJlYWRJMzJdOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgW1RQcm90b2NvbFV0aWwgc2tpcFR5cGU6IGZpZWxkVHlwZSBvblByb3RvY29sOiBwcm90b2NvbF07Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgW1RQcm90b2NvbFV0aWwgc2tpcFR5cGU6IGZpZWxkVHlwZSBvblByb3RvY29sOiBwcm90b2NvbF07Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgW3Byb3RvY29sIHJlYWRGaWVsZEVuZF07Ci0gIH0KLSAgW3Byb3RvY29sIHJlYWRTdHJ1Y3RFbmRdOwotCi0gIHJldHVybiBbVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGV4Y2VwdGlvbldpdGhUeXBlOiB0eXBlIHJlYXNvbjogcmVhc29uXTsKLX0KLQotCi0tICh2b2lkKSB3cml0ZTogKGlkIDxUUHJvdG9jb2w+KSBwcm90b2NvbAotewotICBbcHJvdG9jb2wgd3JpdGVTdHJ1Y3RCZWdpbldpdGhOYW1lOiBAIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiJdOwotCi0gIGlmIChbc2VsZiByZWFzb25dICE9IG5pbCkgewotICAgIFtwcm90b2NvbCB3cml0ZUZpZWxkQmVnaW5XaXRoTmFtZTogQCJtZXNzYWdlIgotICAgICAgICAgICAgICAgICB0eXBlOiBUVHlwZV9TVFJJTkcKLSAgICAgICAgICAgICAgICAgZmllbGRJRDogMV07Ci0gICAgW3Byb3RvY29sIHdyaXRlU3RyaW5nOiBbc2VsZiByZWFzb25dXTsKLSAgICBbcHJvdG9jb2wgd3JpdGVGaWVsZEVuZF07Ci0gIH0KLQotICBbcHJvdG9jb2wgd3JpdGVGaWVsZEJlZ2luV2l0aE5hbWU6IEAidHlwZSIKLSAgICAgICAgICAgICAgIHR5cGU6IFRUeXBlX0kzMgotICAgICAgICAgICAgICAgZmllbGRJRDogMl07Ci0gIFtwcm90b2NvbCB3cml0ZUkzMjogbVR5cGVdOwotICBbcHJvdG9jb2wgd3JpdGVGaWVsZEVuZF07Ci0KLSAgW3Byb3RvY29sIHdyaXRlRmllbGRTdG9wXTsKLSAgW3Byb3RvY29sIHdyaXRlU3RydWN0RW5kXTsKLX0KLQotCi0rIChUQXBwbGljYXRpb25FeGNlcHRpb24gKikgZXhjZXB0aW9uV2l0aFR5cGU6IChpbnQpIHR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uOiAoTlNTdHJpbmcgKikgcmVhc29uCi17Ci0gIHJldHVybiBbW1tUQXBwbGljYXRpb25FeGNlcHRpb24gYWxsb2NdIGluaXRXaXRoVHlwZTogdHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb246IHJlYXNvbl0gYXV0b3JlbGVhc2Vfc3R1Yl07Ci19Ci0KLUBlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvVEJhc2VDbGllbnQuaCBiL2xpYi9jb2NvYS9zcmMvVEJhc2VDbGllbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjczYWEwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvY29hL3NyYy9UQmFzZUNsaWVudC5oCkBAIC0wLDAgKzEsMjcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2ltcG9ydCAiVFByb3RvY29sLmgiCisjaW1wb3J0ICJUQXBwbGljYXRpb25FcnJvci5oIgorCitAaW50ZXJmYWNlIFRCYXNlQ2xpZW50IDogTlNPYmplY3QKKworLShOU0Vycm9yICopIGNoZWNrSW5jb21pbmdNZXNzYWdlRXhjZXB0aW9uOihpZDxUUHJvdG9jb2w+KXByb3RvY29sOworCitAZW5kCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL1RCYXNlQ2xpZW50Lm0gYi9saWIvY29jb2Evc3JjL1RCYXNlQ2xpZW50Lm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ5Y2FlMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb2NvYS9zcmMvVEJhc2VDbGllbnQubQpAQCAtMCwwICsxLDUxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbXBvcnQgIlRCYXNlQ2xpZW50LmgiCisjaW1wb3J0ICJUQXBwbGljYXRpb25FcnJvci5oIgorCisKK0BpbnRlcmZhY2UgVEJhc2VDbGllbnQgKCkKK0BlbmQKKworCitAaW1wbGVtZW50YXRpb24gVEJhc2VDbGllbnQKKworLShOU0Vycm9yICopIGNoZWNrSW5jb21pbmdNZXNzYWdlRXhjZXB0aW9uOihpZDxUUHJvdG9jb2w+KWluUHJvdG9jb2wKK3sKKyAgTlNFcnJvciAqdGhyaWZ0RXJyb3I7CisKKyAgU0ludDMyIG1zZ1R5cGUgPSAwOworICBpZiAoIVtpblByb3RvY29sIHJlYWRNZXNzYWdlQmVnaW5SZXR1cm5pbmdOYW1lOm5pbCB0eXBlOiZtc2dUeXBlIHNlcXVlbmNlSUQ6TlVMTCBlcnJvcjomdGhyaWZ0RXJyb3JdKSB7CisgICAgcmV0dXJuIHRocmlmdEVycm9yOworICB9CisKKyAgaWYgKG1zZ1R5cGUgPT0gVE1lc3NhZ2VUeXBlRVhDRVBUSU9OKSB7CisKKyAgICB0aHJpZnRFcnJvciA9IFtOU0Vycm9yIHJlYWQ6aW5Qcm90b2NvbF07CisKKyAgICBbaW5Qcm90b2NvbCByZWFkTWVzc2FnZUVuZDpOVUxMXTsKKworICAgIHJldHVybiB0aHJpZnRFcnJvcjsKKyAgfQorCisgIHJldHVybiBuaWw7Cit9CisKK0BlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvVEJpbmFyeS5zd2lmdCBiL2xpYi9jb2NvYS9zcmMvVEJpbmFyeS5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGEzNjYwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvY29hL3NyYy9UQmluYXJ5LnN3aWZ0CkBAIC0wLDAgKzEsMTIyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ltcG9ydCBGb3VuZGF0aW9uCisKKworcHVibGljIHN0cnVjdCBUQmluYXJ5IDogVFNlcmlhbGl6YWJsZSB7CisgIAorICBwdWJsaWMgc3RhdGljIHZhciB0aHJpZnRUeXBlIDogVFR5cGUgeyByZXR1cm4gLlNUUklORyB9CisgIAorICBwcml2YXRlIHZhciBzdG9yYWdlIDogTlNEYXRhCisgIAorICBwdWJsaWMgaW5pdCgpIHsKKyAgICBzZWxmLnN0b3JhZ2UgPSBOU0RhdGEoKQorICB9CisgIAorICBwdWJsaWMgaW5pdChjb250ZW50c09mRmlsZSBmaWxlOiBTdHJpbmcsIG9wdGlvbnM6IE5TRGF0YVJlYWRpbmdPcHRpb25zID0gW10pIHRocm93cyB7CisgICAgc2VsZi5zdG9yYWdlID0gdHJ5IE5TRGF0YShjb250ZW50c09mRmlsZTogZmlsZSwgb3B0aW9uczogb3B0aW9ucykKKyAgfQorICAKKyAgcHVibGljIGluaXQoY29udGVudHNPZlVSTCBVUkw6IE5TVVJMLCBvcHRpb25zOiBOU0RhdGFSZWFkaW5nT3B0aW9ucyA9IFtdKSB0aHJvd3MgeworICAgIHNlbGYuc3RvcmFnZSA9IHRyeSBOU0RhdGEoY29udGVudHNPZlVSTDogVVJMLCBvcHRpb25zOiBvcHRpb25zKQorICB9CisgIAorICBwdWJsaWMgaW5pdD8oYmFzZTY0RW5jb2RlZERhdGEgYmFzZTY0RGF0YTogTlNEYXRhLCBvcHRpb25zOiBOU0RhdGFCYXNlNjREZWNvZGluZ09wdGlvbnMgPSBbXSkgeworICAgIGd1YXJkIGxldCBzdG9yYWdlID0gTlNEYXRhKGJhc2U2NEVuY29kZWREYXRhOiBiYXNlNjREYXRhLCBvcHRpb25zOiBvcHRpb25zKSBlbHNlIHsKKyAgICAgIHJldHVybiBuaWwKKyAgICB9CisgICAgc2VsZi5zdG9yYWdlID0gc3RvcmFnZQorICB9CisgIAorICBwdWJsaWMgaW5pdChkYXRhOiBOU0RhdGEpIHsKKyAgICBzZWxmLnN0b3JhZ2UgPSBkYXRhCisgIH0KKyAgCisgIHB1YmxpYyB2YXIgbGVuZ3RoIDogSW50IHsKKyAgICByZXR1cm4gc3RvcmFnZS5sZW5ndGgKKyAgfQorICAKKyAgcHVibGljIHZhciBoYXNoVmFsdWUgOiBJbnQgeworICAgIHJldHVybiBzdG9yYWdlLmhhc2hWYWx1ZQorICB9CisgIAorICBwdWJsaWMgdmFyIGJ5dGVzIDogVW5zYWZlUG9pbnRlcjxWb2lkPiB7CisgICAgcmV0dXJuIHN0b3JhZ2UuYnl0ZXMKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgZ2V0Qnl0ZXMoYnVmZmVyOiBVbnNhZmVNdXRhYmxlUG9pbnRlcjxWb2lkPiwgbGVuZ3RoOiBJbnQpIHsKKyAgICBzdG9yYWdlLmdldEJ5dGVzKGJ1ZmZlciwgbGVuZ3RoOiBsZW5ndGgpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIGdldEJ5dGVzKGJ1ZmZlcjogVW5zYWZlTXV0YWJsZVBvaW50ZXI8Vm9pZD4sIHJhbmdlOiBSYW5nZTxJbnQ+KSB7CisgICAgc3RvcmFnZS5nZXRCeXRlcyhidWZmZXIsIHJhbmdlOiBOU1JhbmdlKHJhbmdlKSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgc3ViQmluYXJ5V2l0aFJhbmdlKHJhbmdlOiBSYW5nZTxJbnQ+KSAtPiBUQmluYXJ5IHsKKyAgICByZXR1cm4gVEJpbmFyeShkYXRhOiBzdG9yYWdlLnN1YmRhdGFXaXRoUmFuZ2UoTlNSYW5nZShyYW5nZSkpKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZVRvRmlsZShwYXRoOiBTdHJpbmcsIG9wdGlvbnM6IE5TRGF0YVdyaXRpbmdPcHRpb25zID0gW10pIHRocm93cyB7CisgICAgdHJ5IHN0b3JhZ2Uud3JpdGVUb0ZpbGUocGF0aCwgb3B0aW9uczogb3B0aW9ucykKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVUb1VSTCh1cmw6IE5TVVJMLCBvcHRpb25zOiBOU0RhdGFXcml0aW5nT3B0aW9ucyA9IFtdKSB0aHJvd3MgeworICAgIHRyeSBzdG9yYWdlLndyaXRlVG9VUkwodXJsLCBvcHRpb25zOiBvcHRpb25zKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByYW5nZU9mRGF0YShkYXRhVG9GaW5kIGRhdGE6IE5TRGF0YSwgb3B0aW9uczogTlNEYXRhU2VhcmNoT3B0aW9ucywgcmFuZ2U6IFJhbmdlPEludD4pIC0+IFJhbmdlPEludD4/IHsKKyAgICByZXR1cm4gc3RvcmFnZS5yYW5nZU9mRGF0YShkYXRhLCBvcHRpb25zOiBvcHRpb25zLCByYW5nZTogTlNSYW5nZShyYW5nZSkpLnRvUmFuZ2UoKQorICB9CisgIAorICBwdWJsaWMgZnVuYyBlbnVtZXJhdGVCeXRlUmFuZ2VzVXNpbmdCbG9jayhibG9jazogKFVuc2FmZVBvaW50ZXI8Vm9pZD4sIFJhbmdlPEludD4sIGlub3V0IEJvb2wpIC0+IFZvaWQpIHsKKyAgICBzdG9yYWdlLmVudW1lcmF0ZUJ5dGVSYW5nZXNVc2luZ0Jsb2NrIHsgYnl0ZXMsIHJhbmdlLCBzdG9wIGluCisgICAgICB2YXIgc3RvcFRtcCA9IEJvb2woc3RvcC5tZW1vcnkpCisgICAgICBibG9jayhieXRlcywgcmFuZ2UudG9SYW5nZSgpISwgJnN0b3BUbXApCisgICAgICBzdG9wLm1lbW9yeSA9IE9iakNCb29sKHN0b3BUbXApCisgICAgfQorICB9CisgIAorICBwdWJsaWMgc3RhdGljIGZ1bmMgcmVhZFZhbHVlRnJvbVByb3RvY29sKHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyAtPiBUQmluYXJ5IHsKKyAgICB2YXIgZGF0YSA6IE5TRGF0YT8KKyAgICB0cnkgcHJvdG8ucmVhZEJpbmFyeSgmZGF0YSkKKyAgICByZXR1cm4gVEJpbmFyeShkYXRhOiBkYXRhISkKKyAgfQorICAKKyAgcHVibGljIHN0YXRpYyBmdW5jIHdyaXRlVmFsdWUodmFsdWU6IFRCaW5hcnksIHRvUHJvdG9jb2wgcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIHsKKyAgICB0cnkgcHJvdG8ud3JpdGVCaW5hcnkodmFsdWUuc3RvcmFnZSkKKyAgfQorICAKK30KKworZXh0ZW5zaW9uIFRCaW5hcnkgOiBDdXN0b21TdHJpbmdDb252ZXJ0aWJsZSwgQ3VzdG9tRGVidWdTdHJpbmdDb252ZXJ0aWJsZSB7CisgIAorICBwdWJsaWMgdmFyIGRlc2NyaXB0aW9uIDogU3RyaW5nIHsKKyAgICByZXR1cm4gc3RvcmFnZS5kZXNjcmlwdGlvbgorICB9CisgIAorICBwdWJsaWMgdmFyIGRlYnVnRGVzY3JpcHRpb24gOiBTdHJpbmcgeworICAgIHJldHVybiBzdG9yYWdlLmRlYnVnRGVzY3JpcHRpb24KKyAgfQorICAKK30KKworcHVibGljIGZ1bmMgPT0obGhzOiBUQmluYXJ5LCByaHM6IFRCaW5hcnkpIC0+IEJvb2wgeworICByZXR1cm4gbGhzLnN0b3JhZ2UgPT0gcmhzLnN0b3JhZ2UKK30KZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvVEVudW0uc3dpZnQgYi9saWIvY29jb2Evc3JjL1RFbnVtLnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MmE1M2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL1RFbnVtLnN3aWZ0CkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworaW1wb3J0IEZvdW5kYXRpb24KKworCitwdWJsaWMgcHJvdG9jb2wgVEVudW0gOiBUU2VyaWFsaXphYmxlIHsKKyAgCit9CisKK3B1YmxpYyBleHRlbnNpb24gVEVudW0geworICAKKyAgcHVibGljIHN0YXRpYyB2YXIgdGhyaWZ0VHlwZSA6IFRUeXBlIHsgcmV0dXJuIFRUeXBlLkkzMiB9CisgIAorfQpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9URXJyb3IuaCBiL2xpYi9jb2NvYS9zcmMvVEVycm9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJiNzJjNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb2NvYS9zcmMvVEVycm9yLmgKQEAgLTAsMCArMSwyMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW1wb3J0IDxGb3VuZGF0aW9uL0ZvdW5kYXRpb24uaD4KKworCitleHRlcm4gTlNTdHJpbmcgKlRFcnJvckRvbWFpbjsKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvVEVycm9yLm0gYi9saWIvY29jb2Evc3JjL1RFcnJvci5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmN2Y5MmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL1RFcnJvci5tCkBAIC0wLDAgKzEsMjMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2ltcG9ydCAiVEVycm9yLmgiCisKKworTlNTdHJpbmcgKlRFcnJvckRvbWFpbiA9IEAiVEVycm9yRG9tYWluIjsKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvVEV4Y2VwdGlvbi5oIGIvbGliL2NvY29hL3NyYy9URXhjZXB0aW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1NmY0ZmEuLjAwMDAwMDAKLS0tIGEvbGliL2NvY29hL3NyYy9URXhjZXB0aW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbXBvcnQgPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPgotCi1AaW50ZXJmYWNlIFRFeGNlcHRpb24gOiBOU0V4Y2VwdGlvbiB7Ci19Ci0KLSsgKGlkKSBleGNlcHRpb25XaXRoTmFtZTogKE5TU3RyaW5nICopIG5hbWU7Ci0KLSsgKGlkKSBleGNlcHRpb25XaXRoTmFtZTogKE5TU3RyaW5nICopIG5hbWUKLSAgICAgICAgICAgICAgICAgIHJlYXNvbjogKE5TU3RyaW5nICopIHJlYXNvbjsKLQotKyAoaWQpIGV4Y2VwdGlvbldpdGhOYW1lOiAoTlNTdHJpbmcgKikgbmFtZQotICAgICAgICAgICAgICAgICAgcmVhc29uOiAoTlNTdHJpbmcgKikgcmVhc29uCi0gICAgICAgICAgICAgICAgICAgZXJyb3I6IChOU0Vycm9yICopIGVycm9yOwotCi1AZW5kCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL1RFeGNlcHRpb24ubSBiL2xpYi9jb2NvYS9zcmMvVEV4Y2VwdGlvbi5tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTYwZTNiLi4wMDAwMDAwCi0tLSBhL2xpYi9jb2NvYS9zcmMvVEV4Y2VwdGlvbi5tCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW1wb3J0ICJURXhjZXB0aW9uLmgiCi0jaW1wb3J0ICJUT2JqZWN0aXZlLUMuaCIKLQotQGltcGxlbWVudGF0aW9uIFRFeGNlcHRpb24KLQotKyAoaWQpIGV4Y2VwdGlvbldpdGhOYW1lOiAoTlNTdHJpbmcgKikgbmFtZQotewotICByZXR1cm4gW3NlbGYgZXhjZXB0aW9uV2l0aE5hbWU6IG5hbWUgcmVhc29uOiBAInVua25vd24iIGVycm9yOiBuaWxdOwotfQotCi0KLSsgKGlkKSBleGNlcHRpb25XaXRoTmFtZTogKE5TU3RyaW5nICopIG5hbWUKLSAgICAgICAgICAgICAgICAgIHJlYXNvbjogKE5TU3RyaW5nICopIHJlYXNvbgotewotICByZXR1cm4gW3NlbGYgZXhjZXB0aW9uV2l0aE5hbWU6IG5hbWUgcmVhc29uOiByZWFzb24gZXJyb3I6IG5pbF07Ci19Ci0KLQotKyAoaWQpIGV4Y2VwdGlvbldpdGhOYW1lOiAoTlNTdHJpbmcgKikgbmFtZQotICAgICAgICAgICAgICAgICAgcmVhc29uOiAoTlNTdHJpbmcgKikgcmVhc29uCi0gICAgICAgICAgICAgICAgICAgZXJyb3I6IChOU0Vycm9yICopIGVycm9yCi17Ci0gIE5TRGljdGlvbmFyeSAqIHVzZXJJbmZvID0gbmlsOwotICBpZiAoZXJyb3IgIT0gbmlsKSB7Ci0gICAgdXNlckluZm8gPSBbTlNEaWN0aW9uYXJ5IGRpY3Rpb25hcnlXaXRoT2JqZWN0OiBlcnJvciBmb3JLZXk6IEAiZXJyb3IiXTsKLSAgfQotCi0gIHJldHVybiBbc3VwZXIgZXhjZXB0aW9uV2l0aE5hbWU6IG5hbWUKLSAgICAgICAgICAgICAgICByZWFzb246IHJlYXNvbgotICAgICAgICAgICAgICAgIHVzZXJJbmZvOiB1c2VySW5mb107Ci19Ci0KLQotLSAoTlNTdHJpbmcgKikgZGVzY3JpcHRpb24KLXsKLSAgTlNNdXRhYmxlU3RyaW5nICogcmVzdWx0ID0gW05TTXV0YWJsZVN0cmluZyBzdHJpbmdXaXRoU3RyaW5nOiBbc2VsZiBuYW1lXV07Ci0gIFtyZXN1bHQgYXBwZW5kRm9ybWF0OiBAIjogJUAiLCBbc2VsZiByZWFzb25dXTsKLSAgaWYgKFtzZWxmIHVzZXJJbmZvXSAhPSBuaWwpIHsKLSAgICBbcmVzdWx0IGFwcGVuZEZvcm1hdDogQCJcbiAgdXNlckluZm8gPSAlQCIsIFtzZWxmIHVzZXJJbmZvXV07Ci0gIH0KLQotICByZXR1cm4gcmVzdWx0OwotfQotCi0KLUBlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvVExpc3Quc3dpZnQgYi9saWIvY29jb2Evc3JjL1RMaXN0LnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwNWJkODEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL1RMaXN0LnN3aWZ0CkBAIC0wLDAgKzEsMTQ4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ltcG9ydCBGb3VuZGF0aW9uCisKKworCitwdWJsaWMgc3RydWN0IFRMaXN0PEVsZW1lbnQgOiBUU2VyaWFsaXphYmxlPiA6IE11dGFibGVDb2xsZWN0aW9uVHlwZSwgSGFzaGFibGUsIEFycmF5TGl0ZXJhbENvbnZlcnRpYmxlLCBUU2VyaWFsaXphYmxlIHsKKyAgCisgIHB1YmxpYyBzdGF0aWMgdmFyIHRocmlmdFR5cGUgOiBUVHlwZSB7IHJldHVybiAuTElTVCB9CisgIAorICB0eXBlYWxpYXMgU3RvcmFnZSA9IEFycmF5PEVsZW1lbnQ+CisKKyAgcHVibGljIHR5cGVhbGlhcyBJbmRleCA9IFN0b3JhZ2UuSW5kZXgKKyAgCisgIHByaXZhdGUgdmFyIHN0b3JhZ2UgPSBTdG9yYWdlKCkKKyAgCisgIHB1YmxpYyB2YXIgc3RhcnRJbmRleCA6IEluZGV4IHsKKyAgICByZXR1cm4gc3RvcmFnZS5zdGFydEluZGV4CisgIH0KKyAgCisgIHB1YmxpYyB2YXIgZW5kSW5kZXggOiBJbmRleCB7CisgICAgcmV0dXJuIHN0b3JhZ2UuZW5kSW5kZXgKKyAgfQorCisgIHB1YmxpYyBzdWJzY3JpcHQgKHBvc2l0aW9uOiBJbmRleCkgLT4gRWxlbWVudCB7CisgICAgZ2V0IHsKKyAgICAgIHJldHVybiBzdG9yYWdlW3Bvc2l0aW9uXQorICAgIH0KKyAgICBzZXQgeworICAgICAgc3RvcmFnZVtwb3NpdGlvbl0gPSBuZXdWYWx1ZQorICAgIH0KKyAgfQorICAKKyAgcHVibGljIHZhciBoYXNoVmFsdWUgOiBJbnQgeworICAgIGxldCBwcmltZSA9IDMxCisgICAgdmFyIHJlc3VsdCA9IDEKKyAgICBmb3IgZWxlbWVudCBpbiBzdG9yYWdlIHsKKyAgICAgIHJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgZWxlbWVudC5oYXNoVmFsdWUKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdAorICB9CisgIAorICBwdWJsaWMgaW5pdChhcnJheUxpdGVyYWwgZWxlbWVudHM6IEVsZW1lbnQuLi4pIHsKKyAgICBzZWxmLnN0b3JhZ2UgPSBTdG9yYWdlKHN0b3JhZ2UpCisgIH0KKyAgCisgIHB1YmxpYyBpbml0KCkgeworICAgIHNlbGYuc3RvcmFnZSA9IFN0b3JhZ2UoKQorICB9CisgIAorICBwdWJsaWMgbXV0YXRpbmcgZnVuYyBhcHBlbmQobmV3RWxlbWVudDogRWxlbWVudCkgeworICAgIHNlbGYuc3RvcmFnZS5hcHBlbmQobmV3RWxlbWVudCkKKyAgfQorICAKKyAgcHVibGljIG11dGF0aW5nIGZ1bmMgYXBwZW5kQ29udGVudHNPZjxDIDogQ29sbGVjdGlvblR5cGUgd2hlcmUgQy5HZW5lcmF0b3IuRWxlbWVudCA9PSBFbGVtZW50PihuZXdzdG9yYWdlOiBDKSB7CisgICAgc2VsZi5zdG9yYWdlLmFwcGVuZENvbnRlbnRzT2YobmV3c3RvcmFnZSkKKyAgfQorICAKKyAgcHVibGljIG11dGF0aW5nIGZ1bmMgaW5zZXJ0KG5ld0VsZW1lbnQ6IEVsZW1lbnQsIGF0SW5kZXggaW5kZXg6IEludCkgeworICAgIHNlbGYuc3RvcmFnZS5pbnNlcnQobmV3RWxlbWVudCwgYXRJbmRleDogaW5kZXgpCisgIH0KKyAgCisgIHB1YmxpYyBtdXRhdGluZyBmdW5jIGluc2VydENvbnRlbnRzT2Y8QyA6IENvbGxlY3Rpb25UeXBlIHdoZXJlIEMuR2VuZXJhdG9yLkVsZW1lbnQgPT0gRWxlbWVudD4obmV3RWxlbWVudHM6IEMsIGF0IGluZGV4OiBJbnQpIHsKKyAgICBzZWxmLnN0b3JhZ2UuaW5zZXJ0Q29udGVudHNPZihuZXdFbGVtZW50cywgYXQ6IGluZGV4KQorICB9CisgIAorICBwdWJsaWMgbXV0YXRpbmcgZnVuYyByZW1vdmVBbGwoa2VlcENhcGFjaXR5IGtlZXBDYXBhY2l0eTogQm9vbCA9IHRydWUpIHsKKyAgICBzZWxmLnN0b3JhZ2UucmVtb3ZlQWxsKGtlZXBDYXBhY2l0eToga2VlcENhcGFjaXR5KQorICB9CisgIAorICBwdWJsaWMgbXV0YXRpbmcgZnVuYyByZW1vdmVBdEluZGV4KGluZGV4OiBJbmRleCkgeworICAgIHNlbGYuc3RvcmFnZS5yZW1vdmVBdEluZGV4KGluZGV4KQorICB9CisgIAorICBwdWJsaWMgbXV0YXRpbmcgZnVuYyByZW1vdmVGaXJzdChuOiBJbnQgPSAwKSB7CisgICAgc2VsZi5zdG9yYWdlLnJlbW92ZUZpcnN0KG4pCisgIH0KKyAgCisgIHB1YmxpYyBtdXRhdGluZyBmdW5jIHJlbW92ZUxhc3QoKSAtPiBFbGVtZW50IHsKKyAgICByZXR1cm4gc2VsZi5zdG9yYWdlLnJlbW92ZUxhc3QoKQorICB9CisgIAorICBwdWJsaWMgbXV0YXRpbmcgZnVuYyByZW1vdmVSYW5nZShzdWJSYW5nZTogUmFuZ2U8SW5kZXg+KSB7CisgICAgc2VsZi5zdG9yYWdlLnJlbW92ZVJhbmdlKHN1YlJhbmdlKQorICB9CisgIAorICBwdWJsaWMgbXV0YXRpbmcgZnVuYyByZXNlcnZlQ2FwYWNpdHkobWluaW11bUNhcGFjaXR5OiBJbnQpIHsKKyAgICBzZWxmLnN0b3JhZ2UucmVzZXJ2ZUNhcGFjaXR5KG1pbmltdW1DYXBhY2l0eSkKKyAgfQorICAKKyAgcHVibGljIHN0YXRpYyBmdW5jIHJlYWRWYWx1ZUZyb21Qcm90b2NvbChwcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gVExpc3QgeworICAgIGxldCAoZWxlbWVudFR5cGUsIHNpemUpID0gdHJ5IHByb3RvLnJlYWRMaXN0QmVnaW4oKQorICAgIGlmIGVsZW1lbnRUeXBlICE9IEVsZW1lbnQudGhyaWZ0VHlwZSB7CisgICAgICB0aHJvdyBOU0Vycm9yKAorICAgICAgICBkb21haW46IFRQcm90b2NvbEVycm9yRG9tYWluLAorICAgICAgICBjb2RlOiBJbnQoVFByb3RvY29sRXJyb3IuSW52YWxpZERhdGEucmF3VmFsdWUpLAorICAgICAgICB1c2VySW5mbzogW1RQcm90b2NvbEVycm9yRXh0ZW5kZWRFcnJvcktleTogTlNOdW1iZXIoaW50OiBUUHJvdG9jb2xFeHRlbmRlZEVycm9yLlVuZXhwZWN0ZWRUeXBlLnJhd1ZhbHVlKV0pCisgICAgfQorICAgIHZhciBsaXN0ID0gVExpc3QoKQorICAgIGZvciBfIGluIDAuLjxzaXplIHsKKyAgICAgIGxldCBlbGVtZW50ID0gdHJ5IEVsZW1lbnQucmVhZFZhbHVlRnJvbVByb3RvY29sKHByb3RvKQorICAgICAgbGlzdC5zdG9yYWdlLmFwcGVuZChlbGVtZW50KQorICAgIH0KKyAgICB0cnkgcHJvdG8ucmVhZExpc3RFbmQoKQorICAgIHJldHVybiBsaXN0CisgIH0KKyAgCisgIHB1YmxpYyBzdGF0aWMgZnVuYyB3cml0ZVZhbHVlKHZhbHVlOiBUTGlzdCwgdG9Qcm90b2NvbCBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgeworICAgIHRyeSBwcm90by53cml0ZUxpc3RCZWdpbldpdGhFbGVtZW50VHlwZShFbGVtZW50LnRocmlmdFR5cGUsIHNpemU6IHZhbHVlLmNvdW50KQorICAgIGZvciBlbGVtZW50IGluIHZhbHVlLnN0b3JhZ2UgeworICAgICAgdHJ5IEVsZW1lbnQud3JpdGVWYWx1ZShlbGVtZW50LCB0b1Byb3RvY29sOiBwcm90bykKKyAgICB9CisgICAgdHJ5IHByb3RvLndyaXRlTGlzdEVuZCgpCisgIH0KK30KKworZXh0ZW5zaW9uIFRMaXN0IDogQ3VzdG9tU3RyaW5nQ29udmVydGlibGUsIEN1c3RvbURlYnVnU3RyaW5nQ29udmVydGlibGUgeworICAKKyAgcHVibGljIHZhciBkZXNjcmlwdGlvbiA6IFN0cmluZyB7CisgICAgcmV0dXJuIHN0b3JhZ2UuZGVzY3JpcHRpb24KKyAgfQorICAKKyAgcHVibGljIHZhciBkZWJ1Z0Rlc2NyaXB0aW9uIDogU3RyaW5nIHsKKyAgICByZXR1cm4gc3RvcmFnZS5kZWJ1Z0Rlc2NyaXB0aW9uCisgIH0KKyAgCit9CisKK3B1YmxpYyBmdW5jID09PEVsZW1lbnQ+KGxoczogVExpc3Q8RWxlbWVudD4sIHJoczogVExpc3Q8RWxlbWVudD4pIC0+IEJvb2wgeworICByZXR1cm4gbGhzLnN0b3JhZ2UgPT0gcmhzLnN0b3JhZ2UKK30KZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvVE1hcC5zd2lmdCBiL2xpYi9jb2NvYS9zcmMvVE1hcC5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTZlNzQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvY29hL3NyYy9UTWFwLnN3aWZ0CkBAIC0wLDAgKzEsMTU4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ltcG9ydCBGb3VuZGF0aW9uCisKKworcHVibGljIHN0cnVjdCBUTWFwPEtleSA6IFRTZXJpYWxpemFibGUsIFZhbHVlIDogVFNlcmlhbGl6YWJsZT4gOiBDb2xsZWN0aW9uVHlwZSwgRGljdGlvbmFyeUxpdGVyYWxDb252ZXJ0aWJsZSwgVFNlcmlhbGl6YWJsZSB7CisgIAorICBwdWJsaWMgc3RhdGljIHZhciB0aHJpZnRUeXBlIDogVFR5cGUgeyByZXR1cm4gLk1BUCB9CisKKyAgdHlwZWFsaWFzIFN0b3JhZ2UgPSBEaWN0aW9uYXJ5PEtleSwgVmFsdWU+CisKKyAgcHVibGljIHR5cGVhbGlhcyBJbmRleCA9IFN0b3JhZ2UuSW5kZXgKKworICBwdWJsaWMgdHlwZWFsaWFzIEVsZW1lbnQgPSBTdG9yYWdlLkVsZW1lbnQKKyAgCisgIHByaXZhdGUgdmFyIHN0b3JhZ2UgOiBTdG9yYWdlCisKKyAgcHVibGljIHZhciBzdGFydEluZGV4IDogSW5kZXggeworICAgIHJldHVybiBzdG9yYWdlLnN0YXJ0SW5kZXgKKyAgfQorICAKKyAgcHVibGljIHZhciBlbmRJbmRleDogSW5kZXggeworICAgIHJldHVybiBzdG9yYWdlLmVuZEluZGV4CisgIH0KKworICBwdWJsaWMgdmFyIGtleXM6IExhenlNYXBDb2xsZWN0aW9uPFtLZXkgOiBWYWx1ZV0sIEtleT4geworICAgIHJldHVybiBzdG9yYWdlLmtleXMKKyAgfQorICAKKyAgcHVibGljIHZhciB2YWx1ZXM6IExhenlNYXBDb2xsZWN0aW9uPFtLZXkgOiBWYWx1ZV0sIFZhbHVlPiB7CisgICAgcmV0dXJuIHN0b3JhZ2UudmFsdWVzCisgIH0KKyAgCisgIHB1YmxpYyBpbml0KCkgeworICAgIHN0b3JhZ2UgPSBTdG9yYWdlKCkKKyAgfQorICAKKyAgcHVibGljIGluaXQoZGljdGlvbmFyeUxpdGVyYWwgZWxlbWVudHM6IChLZXksIFZhbHVlKS4uLikgeworICAgIHN0b3JhZ2UgPSBTdG9yYWdlKCkKKyAgICBmb3IgKGtleSwgdmFsdWUpIGluIGVsZW1lbnRzIHsKKyAgICAgIHN0b3JhZ2Vba2V5XSA9IHZhbHVlCisgICAgfQorICB9CisgIAorICBwdWJsaWMgaW5pdChtaW5pbXVtQ2FwYWNpdHk6IEludCkgeworICAgIHN0b3JhZ2UgPSBTdG9yYWdlKG1pbmltdW1DYXBhY2l0eTogbWluaW11bUNhcGFjaXR5KQorICB9CisgIAorICBwdWJsaWMgc3Vic2NyaXB0IChwb3NpdGlvbjogSW5kZXgpIC0+IEVsZW1lbnQgeworICAgIGdldCB7CisgICAgICByZXR1cm4gc3RvcmFnZVtwb3NpdGlvbl0KKyAgICB9CisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIGluZGV4Rm9yS2V5KGtleTogS2V5KSAtPiBJbmRleD8geworICAgIHJldHVybiBzdG9yYWdlLmluZGV4Rm9yS2V5KGtleSkKKyAgfQorICAKKyAgcHVibGljIHN1YnNjcmlwdCAoa2V5OiBLZXkpIC0+IFZhbHVlPyB7CisgICAgZ2V0IHsKKyAgICAgIHJldHVybiBzdG9yYWdlW2tleV0KKyAgICB9CisgICAgc2V0IHsKKyAgICAgIHN0b3JhZ2Vba2V5XSA9IG5ld1ZhbHVlCisgICAgfQorICB9CisKKyAgcHVibGljIG11dGF0aW5nIGZ1bmMgdXBkYXRlVmFsdWUodmFsdWU6IFZhbHVlLCBmb3JLZXkga2V5OiBLZXkpIC0+IFZhbHVlPyB7CisgICAgcmV0dXJuIHVwZGF0ZVZhbHVlKHZhbHVlLCBmb3JLZXk6IGtleSkKKyAgfQorICAKKyAgcHVibGljIG11dGF0aW5nIGZ1bmMgcmVtb3ZlQXRJbmRleChpbmRleDogRGljdGlvbmFyeUluZGV4PEtleSwgVmFsdWU+KSAtPiAoS2V5LCBWYWx1ZSkgeworICAgIHJldHVybiByZW1vdmVBdEluZGV4KGluZGV4KQorICB9CisgIAorICBwdWJsaWMgbXV0YXRpbmcgZnVuYyByZW1vdmVWYWx1ZUZvcktleShrZXk6IEtleSkgLT4gVmFsdWU/IHsKKyAgICByZXR1cm4gc3RvcmFnZS5yZW1vdmVWYWx1ZUZvcktleShrZXkpCisgIH0KKyAgCisgIHB1YmxpYyBtdXRhdGluZyBmdW5jIHJlbW92ZUFsbChrZWVwQ2FwYWNpdHkga2VlcENhcGFjaXR5OiBCb29sID0gZmFsc2UpIHsKKyAgICBzdG9yYWdlLnJlbW92ZUFsbChrZWVwQ2FwYWNpdHk6IGtlZXBDYXBhY2l0eSkKKyAgfQorCisgIHB1YmxpYyB2YXIgaGFzaFZhbHVlIDogSW50IHsKKyAgICBsZXQgcHJpbWUgPSAzMQorICAgIHZhciByZXN1bHQgPSAxCisgICAgZm9yIChrZXksIHZhbHVlKSBpbiBzdG9yYWdlIHsKKyAgICAgIHJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsga2V5Lmhhc2hWYWx1ZQorICAgICAgcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyB2YWx1ZS5oYXNoVmFsdWUKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdAorICB9CisgIAorICBwdWJsaWMgc3RhdGljIGZ1bmMgcmVhZFZhbHVlRnJvbVByb3RvY29sKHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyAtPiBUTWFwIHsKKyAgICBsZXQgKGtleVR5cGUsIHZhbHVlVHlwZSwgc2l6ZSkgPSB0cnkgcHJvdG8ucmVhZE1hcEJlZ2luKCkKKyAgICBpZiBrZXlUeXBlICE9IEtleS50aHJpZnRUeXBlIHx8IHZhbHVlVHlwZSAhPSBWYWx1ZS50aHJpZnRUeXBlIHsKKyAgICAgIHRocm93IE5TRXJyb3IoCisgICAgICAgIGRvbWFpbjogVFByb3RvY29sRXJyb3JEb21haW4sCisgICAgICAgIGNvZGU6IEludChUUHJvdG9jb2xFcnJvci5JbnZhbGlkRGF0YS5yYXdWYWx1ZSksCisgICAgICAgIHVzZXJJbmZvOiBbVFByb3RvY29sRXJyb3JFeHRlbmRlZEVycm9yS2V5OiBOU051bWJlcihpbnQ6IFRQcm90b2NvbEV4dGVuZGVkRXJyb3IuVW5leHBlY3RlZFR5cGUucmF3VmFsdWUpXSkKKyAgICB9CisgICAgdmFyIG1hcCA9IFRNYXAoKQorICAgIGZvciBfIGluIDAuLjxzaXplIHsKKyAgICAgIGxldCBrZXkgPSB0cnkgS2V5LnJlYWRWYWx1ZUZyb21Qcm90b2NvbChwcm90bykKKyAgICAgIGxldCB2YWx1ZSA9IHRyeSBWYWx1ZS5yZWFkVmFsdWVGcm9tUHJvdG9jb2wocHJvdG8pCisgICAgICBtYXAuc3RvcmFnZVtrZXldID0gdmFsdWUKKyAgICB9CisgICAgdHJ5IHByb3RvLnJlYWRNYXBFbmQoKQorICAgIHJldHVybiBtYXAKKyAgfQorICAKKyAgcHVibGljIHN0YXRpYyBmdW5jIHdyaXRlVmFsdWUodmFsdWU6IFRNYXAsIHRvUHJvdG9jb2wgcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIHsKKyAgICB0cnkgcHJvdG8ud3JpdGVNYXBCZWdpbldpdGhLZXlUeXBlKEtleS50aHJpZnRUeXBlLCB2YWx1ZVR5cGU6IFZhbHVlLnRocmlmdFR5cGUsIHNpemU6IHZhbHVlLmNvdW50KQorICAgIGZvciAoa2V5LCB2YWx1ZSkgaW4gdmFsdWUuc3RvcmFnZSB7CisgICAgICB0cnkgS2V5LndyaXRlVmFsdWUoa2V5LCB0b1Byb3RvY29sOiBwcm90bykKKyAgICAgIHRyeSBWYWx1ZS53cml0ZVZhbHVlKHZhbHVlLCB0b1Byb3RvY29sOiBwcm90bykKKyAgICB9CisgICAgdHJ5IHByb3RvLndyaXRlTWFwRW5kKCkKKyAgfQorICAKK30KKworCitleHRlbnNpb24gVE1hcCA6IEN1c3RvbVN0cmluZ0NvbnZlcnRpYmxlLCBDdXN0b21EZWJ1Z1N0cmluZ0NvbnZlcnRpYmxlIHsKKyAgCisgIHB1YmxpYyB2YXIgZGVzY3JpcHRpb24gOiBTdHJpbmcgeworICAgIHJldHVybiBzdG9yYWdlLmRlc2NyaXB0aW9uCisgIH0KKyAgCisgIHB1YmxpYyB2YXIgZGVidWdEZXNjcmlwdGlvbiA6IFN0cmluZyB7CisgICAgcmV0dXJuIHN0b3JhZ2UuZGVidWdEZXNjcmlwdGlvbgorICB9CisgIAorfQorCitwdWJsaWMgZnVuYyA9PTxLZXksIFZhbHVlPihsaHM6IFRNYXA8S2V5LFZhbHVlPiwgcmhzOiBUTWFwPEtleSwgVmFsdWU+KSAtPiBCb29sIHsKKyAgaWYgbGhzLmNvdW50ICE9IHJocy5jb3VudCB7CisgICAgcmV0dXJuIGZhbHNlCisgIH0KKyAgcmV0dXJuIGxocy5zdG9yYWdlID09IHJocy5zdG9yYWdlCit9CmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL1RPYmplY3RpdmUtQy5oIGIvbGliL2NvY29hL3NyYy9UT2JqZWN0aXZlLUMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWMwODMxZC4uMDAwMDAwMAotLS0gYS9saWIvY29jb2Evc3JjL1RPYmplY3RpdmUtQy5oCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKgotICogVE9iamVjdGl2ZS1DLmggaXMgZm9yIHN1cHBvcnRpbmcgY29leGlzdGVuY2Ugb2YgYm90aCB0aGUgQVJDIChBdXRvbWF0aWMgCi0gKiBSZWZlcmVuY2UgQ291bnRpbmcpIG1vZGUgYW5kIHRoZSBOb24tQVJDIG1vZGUgb2YgT2JqZWN0aXZlLUMgCi0gKiBpbiB0aGUgc2FtZSBzb3VyY2UgY29kZS4KLSAqCi0gKiAgICAgICAgICAgICAgICAgIDIwMTEvMTEvMTQgIEhJUkFOTyBTYXRvc2hpIChBSVNULCBKYXBhbikKLSAqCi0gKiBCZWZvcmU6Ci0gKgotICogICAgdmFyID0gW2FPYmplY3QgcmV0YWluXTsKLSAqICAgIFthT2JqZWN0IHJlbGVhc2VdOwotICogICAgW2FPYmplY3QgYXV0b3JlbGVhc2VdOwotICogICAgW3N1cGVyIGRlYWxsb2NdOwotICogICAgQ0ZGdW5jdGlvbihvYmopOwotICoKLSAqIEFSQyBhbmQgTm9uLUFSQyBjb21wYXRpYmxlOgotICoKLSAqICAgICNpbXBvcnQgIlRPYmplY3RpdmUtQy5oIgotICogICAgdmFyID0gW2FPYmplY3QgcmV0YWluX3N0dWJdOwotICogICAgW2FPYmplY3QgcmVsZWFzZV9zdHViXTsKLSAqICAgIFthT2JqZWN0IGF1dG9yZWxlYXNlX3N0dWJdOwotICogICAgW3N1cGVyIGRlYWxsb2Nfc3R1Yl07Ci0gKiAgICBDRkZ1bmN0aW9uKGJyaWRnZV9zdHViIG9iaik7Ci0gKgotICogICAgRG9uJ3QgdXNlIHJldGFpbl9zdHViIGZvciBAcHJvcGVydHkocmV0YWluKS4KLSAqICAgIFVzZSBOU0F1dG9yZWxlYXNlUG9vbCBsaWtlIHRoaXM6Ci0gKiAgICAgICAgI2lmIF9faGFzX2ZlYXR1cmUob2JqY19hcmMpCi0gKiAgICAgICAgICBAYXV0b3JlbGVhc2Vwb29sIHsKLSAqICAgICAgICAgICAgICAvLyBjb2RlIAotICogICAgICAgICAgfQotICogICAgICAgICNlbHNlCi0gKiAgICAgICAgICBOU0F1dG9SZWxlYXNlUG9vbCAqcG9vbCA9IFtbTlNBdXRvUmVsZWFzZVBvb2wgYWxsb2NdIGluaXQuLi4KLSAqICAgICAgICAgIC8vIGNvZGUKLSAqICAgICAgICAgIFtwb29sIHJlbGVhc2VdOwotICogICAgICAgICNlbmRpZgotICovCi0KLQotI2lmICFkZWZpbmVkKHJldGFpbl9zdHViKQotI2lmIF9faGFzX2ZlYXR1cmUob2JqY19hcmMpCi0jZGVmaW5lIHJldGFpbl9zdHViIHNlbGYKLSNkZWZpbmUgYXV0b3JlbGVhc2Vfc3R1YiBzZWxmCi0jZGVmaW5lIHJlbGVhc2Vfc3R1YiBzZWxmCi0jZGVmaW5lIGRlYWxsb2Nfc3R1YiBzZWxmCi0jZGVmaW5lIGJyaWRnZV9zdHViIF9fYnJpZGdlCi0jZWxzZQotI2RlZmluZSByZXRhaW5fc3R1YiByZXRhaW4KLSNkZWZpbmUgYXV0b3JlbGVhc2Vfc3R1YiBhdXRvcmVsZWFzZQotI2RlZmluZSByZWxlYXNlX3N0dWIgcmVsZWFzZQotI2RlZmluZSBkZWFsbG9jX3N0dWIgZGVhbGxvYwotI2RlZmluZSBicmlkZ2Vfc3R1YgotI2VuZGlmCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvVFByb2Nlc3Nvci5oIGIvbGliL2NvY29hL3NyYy9UUHJvY2Vzc29yLmgKaW5kZXggOTgwYmU5NC4uMjBjNzJlMiAxMDA2NDQKLS0tIGEvbGliL2NvY29hL3NyYy9UUHJvY2Vzc29yLmgKKysrIGIvbGliL2NvY29hL3NyYy9UUHJvY2Vzc29yLmgKQEAgLTIwLDEwICsyMCwxNiBAQAogI2ltcG9ydCA8Rm91bmRhdGlvbi9Gb3VuZGF0aW9uLmg+CiAjaW1wb3J0ICJUUHJvdG9jb2wuaCIKIAorTlNfQVNTVU1FX05PTk5VTExfQkVHSU4KKwogCiBAcHJvdG9jb2wgVFByb2Nlc3NvciA8TlNPYmplY3Q+CiAKLS0gKEJPT0wpIHByb2Nlc3NPbklucHV0UHJvdG9jb2w6IChpZCA8VFByb3RvY29sPikgaW5Qcm90b2NvbAotICAgICAgICAgICAgICAgICBvdXRwdXRQcm90b2NvbDogKGlkIDxUUHJvdG9jb2w+KSBvdXRQcm90b2NvbDsKKy0oQk9PTCkgcHJvY2Vzc09uSW5wdXRQcm90b2NvbDooaWQgPFRQcm90b2NvbD4paW5Qcm90b2NvbAorICAgICAgICAgICAgICAgIG91dHB1dFByb3RvY29sOihpZCA8VFByb3RvY29sPilvdXRQcm90b2NvbAorICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICoqKWVycm9yOwogCiBAZW5kCisKKworTlNfQVNTVU1FX05PTk5VTExfRU5ECmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL1RQcm9jZXNzb3JGYWN0b3J5LmggYi9saWIvY29jb2Evc3JjL1RQcm9jZXNzb3JGYWN0b3J5LmgKaW5kZXggMjlkMTJiMy4uODUwMjBhNSAxMDA2NDQKLS0tIGEvbGliL2NvY29hL3NyYy9UUHJvY2Vzc29yRmFjdG9yeS5oCisrKyBiL2xpYi9jb2NvYS9zcmMvVFByb2Nlc3NvckZhY3RvcnkuaApAQCAtMjAsOCArMjAsMTQgQEAKICNpbXBvcnQgPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPgogI2ltcG9ydCAiVFByb2Nlc3Nvci5oIgogCitOU19BU1NVTUVfTk9OTlVMTF9CRUdJTgorCisKIEBwcm90b2NvbCBUUHJvY2Vzc29yRmFjdG9yeSA8TlNPYmplY3Q+CiAKLS0gKGlkPFRQcm9jZXNzb3I+KSBwcm9jZXNzb3JGb3JUcmFuc3BvcnQ6IChpZDxUVHJhbnNwb3J0PikgdHJhbnNwb3J0OworLShpZDxUUHJvY2Vzc29yPikgcHJvY2Vzc29yRm9yVHJhbnNwb3J0OihpZDxUVHJhbnNwb3J0Pil0cmFuc3BvcnQ7CiAKIEBlbmQKKworCitOU19BU1NVTUVfTk9OTlVMTF9FTkQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvVFByb3RvY29sLnN3aWZ0IGIvbGliL2NvY29hL3NyYy9UUHJvdG9jb2wuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc3NTg0OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb2NvYS9zcmMvVFByb3RvY29sLnN3aWZ0CkBAIC0wLDAgKzEsMTkwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ltcG9ydCBGb3VuZGF0aW9uCisKKworcHVibGljIGV4dGVuc2lvbiBUUHJvdG9jb2wgeworICAKKyAgcHVibGljIGZ1bmMgcmVhZE1lc3NhZ2VCZWdpbigpIHRocm93cyAtPiAoU3RyaW5nLCBUTWVzc2FnZVR5cGUsIEludCkgeworICAgIAorICAgIHZhciBuYW1lIDogTlNTdHJpbmc/CisgICAgdmFyIHR5cGUgOiBJbnQzMiA9IC0xCisgICAgdmFyIHNlcXVlbmNlSUQgOiBJbnQzMiA9IC0xCisgICAgCisgICAgdHJ5IHJlYWRNZXNzYWdlQmVnaW5SZXR1cm5pbmdOYW1lKCZuYW1lLCB0eXBlOiAmdHlwZSwgc2VxdWVuY2VJRDogJnNlcXVlbmNlSUQpCisgICAgCisgICAgcmV0dXJuIChuYW1lIGFzIFN0cmluZyEsIFRNZXNzYWdlVHlwZShyYXdWYWx1ZTogdHlwZSkhLCBJbnQoc2VxdWVuY2VJRCkpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlTWVzc2FnZUJlZ2luV2l0aE5hbWUobmFtZTogU3RyaW5nLCB0eXBlOiBUTWVzc2FnZVR5cGUsIHNlcXVlbmNlSUQ6IEludCkgdGhyb3dzIHsKKyAgICB0cnkgd3JpdGVNZXNzYWdlQmVnaW5XaXRoTmFtZShuYW1lLCB0eXBlOiB0eXBlLnJhd1ZhbHVlLCBzZXF1ZW5jZUlEOiBJbnQzMihzZXF1ZW5jZUlEKSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZFN0cnVjdEJlZ2luKCkgdGhyb3dzIC0+IChTdHJpbmc/KSB7CisgICAgCisgICAgdmFyIG5hbWUgOiBOU1N0cmluZz8gPSBuaWwKKyAgICAKKyAgICB0cnkgcmVhZFN0cnVjdEJlZ2luUmV0dXJuaW5nTmFtZSgmbmFtZSkKKyAgICAKKyAgICByZXR1cm4gKG5hbWUgYXMgU3RyaW5nPykKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZEZpZWxkQmVnaW4oKSB0aHJvd3MgLT4gKFN0cmluZz8sIFRUeXBlLCBJbnQpIHsKKyAgICAKKyAgICB2YXIgbmFtZSA6IE5TU3RyaW5nPyA9IG5pbAorICAgIHZhciB0eXBlIDogSW50MzIgPSAtMQorICAgIHZhciBmaWVsZElEIDogSW50MzIgPSAtMQorICAgIAorICAgIHRyeSByZWFkRmllbGRCZWdpblJldHVybmluZ05hbWUoJm5hbWUsIHR5cGU6ICZ0eXBlLCBmaWVsZElEOiAmZmllbGRJRCkKKyAgICAKKyAgICByZXR1cm4gKG5hbWUgYXMgU3RyaW5nPywgVFR5cGUocmF3VmFsdWU6IHR5cGUpISwgSW50KGZpZWxkSUQpKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZUZpZWxkQmVnaW5XaXRoTmFtZShuYW1lOiBTdHJpbmcsIHR5cGU6IFRUeXBlLCBmaWVsZElEOiBJbnQpIHRocm93cyB7CisgICAgdHJ5IHdyaXRlRmllbGRCZWdpbldpdGhOYW1lKG5hbWUsIHR5cGU6IHR5cGUucmF3VmFsdWUsIGZpZWxkSUQ6IEludDMyKGZpZWxkSUQpKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkTWFwQmVnaW4oKSB0aHJvd3MgLT4gKFRUeXBlLCBUVHlwZSwgSW50MzIpIHsKKyAgICAKKyAgICB2YXIga2V5VHlwZSA6IEludDMyID0gLTEKKyAgICB2YXIgdmFsdWVUeXBlIDogSW50MzIgPSAtMQorICAgIHZhciBzaXplIDogSW50MzIgPSAwCisgICAgCisgICAgdHJ5IHJlYWRNYXBCZWdpblJldHVybmluZ0tleVR5cGUoJmtleVR5cGUsIHZhbHVlVHlwZTogJnZhbHVlVHlwZSwgc2l6ZTogJnNpemUpCisgICAgCisgICAgcmV0dXJuIChUVHlwZShyYXdWYWx1ZToga2V5VHlwZSkhLCBUVHlwZShyYXdWYWx1ZTogdmFsdWVUeXBlKSEsIHNpemUpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlTWFwQmVnaW5XaXRoS2V5VHlwZShrZXlUeXBlOiBUVHlwZSwgdmFsdWVUeXBlOiBUVHlwZSwgc2l6ZTogSW50KSB0aHJvd3MgeworICAgIHRyeSB3cml0ZU1hcEJlZ2luV2l0aEtleVR5cGUoa2V5VHlwZS5yYXdWYWx1ZSwgdmFsdWVUeXBlOiB2YWx1ZVR5cGUucmF3VmFsdWUsIHNpemU6IEludDMyKHNpemUpKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkU2V0QmVnaW4oKSB0aHJvd3MgLT4gKFRUeXBlLCBJbnQzMikgeworICAgIAorICAgIHZhciBlbGVtZW50VHlwZSA6IEludDMyID0gLTEKKyAgICB2YXIgc2l6ZSA6IEludDMyID0gMAorICAgIAorICAgIHRyeSByZWFkU2V0QmVnaW5SZXR1cm5pbmdFbGVtZW50VHlwZSgmZWxlbWVudFR5cGUsIHNpemU6ICZzaXplKQorICAgIAorICAgIHJldHVybiAoVFR5cGUocmF3VmFsdWU6IGVsZW1lbnRUeXBlKSEsIHNpemUpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlU2V0QmVnaW5XaXRoRWxlbWVudFR5cGUoZWxlbWVudFR5cGU6IFRUeXBlLCBzaXplOiBJbnQpIHRocm93cyB7CisgICAgdHJ5IHdyaXRlU2V0QmVnaW5XaXRoRWxlbWVudFR5cGUoZWxlbWVudFR5cGUucmF3VmFsdWUsIHNpemU6IEludDMyKHNpemUpKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkTGlzdEJlZ2luKCkgdGhyb3dzIC0+IChUVHlwZSwgSW50MzIpIHsKKyAgICAKKyAgICB2YXIgZWxlbWVudFR5cGUgOiBJbnQzMiA9IC0xCisgICAgdmFyIHNpemUgOiBJbnQzMiA9IDAKKyAgICAKKyAgICB0cnkgcmVhZExpc3RCZWdpblJldHVybmluZ0VsZW1lbnRUeXBlKCZlbGVtZW50VHlwZSwgc2l6ZTogJnNpemUpCisgICAgCisgICAgcmV0dXJuIChUVHlwZShyYXdWYWx1ZTogZWxlbWVudFR5cGUpISwgc2l6ZSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVMaXN0QmVnaW5XaXRoRWxlbWVudFR5cGUoZWxlbWVudFR5cGU6IFRUeXBlLCBzaXplOiBJbnQpIHRocm93cyB7CisgICAgdHJ5IHdyaXRlTGlzdEJlZ2luV2l0aEVsZW1lbnRUeXBlKGVsZW1lbnRUeXBlLnJhd1ZhbHVlLCBzaXplOiBJbnQzMihzaXplKSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVGaWVsZFZhbHVlPFQ6IFRTZXJpYWxpemFibGU+KHZhbHVlOiBULCBuYW1lOiBTdHJpbmcsIHR5cGU6IFRUeXBlLCBpZDogSW50MzIpIHRocm93cyB7CisgICAgdHJ5IHdyaXRlRmllbGRCZWdpbldpdGhOYW1lKG5hbWUsIHR5cGU6IHR5cGUucmF3VmFsdWUsIGZpZWxkSUQ6IGlkKQorICAgIHRyeSB3cml0ZVZhbHVlKHZhbHVlKQorICAgIHRyeSB3cml0ZUZpZWxkRW5kKCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZFZhbHVlPFQ6IFRTZXJpYWxpemFibGU+KCkgdGhyb3dzIC0+IFQgeworICAgIHJldHVybiB0cnkgVC5yZWFkVmFsdWVGcm9tUHJvdG9jb2woc2VsZikKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVWYWx1ZTxUOiBUU2VyaWFsaXphYmxlPih2YWx1ZTogVCkgdGhyb3dzIHsKKyAgICB0cnkgVC53cml0ZVZhbHVlKHZhbHVlLCB0b1Byb3RvY29sOiBzZWxmKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkUmVzdWx0TWVzc2FnZUJlZ2luKCkgdGhyb3dzIHsKKyAgICAKKyAgICBsZXQgKF8sIHR5cGUsIF8pID0gdHJ5IHJlYWRNZXNzYWdlQmVnaW4oKTsKKyAgICAKKyAgICBpZiB0eXBlID09IC5FWENFUFRJT04geworICAgICAgbGV0IHggPSB0cnkgcmVhZEV4Y2VwdGlvbigpCisgICAgICB0aHJvdyB4CisgICAgfQorICAgIAorICAgIHJldHVybgorICB9CisgIAorICBwdWJsaWMgZnVuYyB2YWxpZGF0ZVZhbHVlKHZhbHVlOiBBbnk/LCBuYW1lZCBuYW1lOiBTdHJpbmcpIHRocm93cyB7CisgICAgCisgICAgaWYgdmFsdWUgPT0gbmlsIHsKKyAgICAgIHRocm93IE5TRXJyb3IoCisgICAgICAgIGRvbWFpbjogVFByb3RvY29sRXJyb3JEb21haW4sCisgICAgICAgIGNvZGU6IEludChUUHJvdG9jb2xFcnJvci5Vbmtub3duLnJhd1ZhbHVlKSwKKyAgICAgICAgdXNlckluZm86IFtUUHJvdG9jb2xFcnJvckZpZWxkTmFtZUtleTogbmFtZV0pCisgICAgfQorICAgIAorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkRXhjZXB0aW9uKCkgdGhyb3dzIC0+IEVycm9yVHlwZSB7CisgICAgCisgICAgdmFyIHJlYXNvbiA6IFN0cmluZz8KKyAgICB2YXIgdHlwZSA9IFRBcHBsaWNhdGlvbkVycm9yLlVua25vd24KKyAgICAKKyAgICB0cnkgcmVhZFN0cnVjdEJlZ2luKCkKKyAgICAKKyAgICBmaWVsZHM6IHdoaWxlICh0cnVlKSB7CisgICAgICAKKyAgICAgIGxldCAoXywgZmllbGRUeXBlLCBmaWVsZElEKSA9IHRyeSByZWFkRmllbGRCZWdpbigpCisgICAgICAKKyAgICAgIHN3aXRjaCAoZmllbGRJRCwgZmllbGRUeXBlKSB7CisgICAgICBjYXNlIChfLCAuU1RPUCk6CisgICAgICAgIGJyZWFrIGZpZWxkcworICAgICAgICAKKyAgICAgIGNhc2UgKDEsIC5TVFJJTkcpOgorICAgICAgICByZWFzb24gPSB0cnkgcmVhZFZhbHVlKCkgYXMgU3RyaW5nCisgICAgICAgIAorICAgICAgY2FzZSAoMiwgLkkzMik6CisgICAgICAgIGxldCB0eXBlVmFsID0gdHJ5IHJlYWRWYWx1ZSgpIGFzIEludDMyCisgICAgICAgIGlmIGxldCB0bXAgPSBUQXBwbGljYXRpb25FcnJvcihyYXdWYWx1ZTogdHlwZVZhbCkgeworICAgICAgICAgIHR5cGUgPSB0bXAKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgIGNhc2UgbGV0IChfLCB1bmtub3duVHlwZSk6CisgICAgICAgIHRyeSBza2lwVHlwZSh1bmtub3duVHlwZSkKKyAgICAgIH0KKyAgICAgIAorICAgICAgdHJ5IHJlYWRGaWVsZEVuZCgpCisgICAgfQorICAgIAorICAgIHRyeSByZWFkU3RydWN0RW5kKCkKKyAgICAKKyAgICByZXR1cm4gTlNFcnJvcih0eXBlOnR5cGUsIHJlYXNvbjpyZWFzb24gPz8gIiIpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlRXhjZXB0aW9uRm9yTWVzc2FnZU5hbWUobmFtZTogU3RyaW5nLCBzZXF1ZW5jZUlEOiBJbnQsIGV4OiBOU0Vycm9yKSB0aHJvd3MgeworICAgIHRyeSB3cml0ZU1lc3NhZ2VCZWdpbldpdGhOYW1lKG5hbWUsIHR5cGU6IC5FWENFUFRJT04sIHNlcXVlbmNlSUQ6IHNlcXVlbmNlSUQpCisgICAgdHJ5IGV4LndyaXRlKHNlbGYpCisgICAgdHJ5IHdyaXRlTWVzc2FnZUVuZCgpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHNraXBUeXBlKHR5cGU6IFRUeXBlKSB0aHJvd3MgeworICAgIHRyeSBUUHJvdG9jb2xVdGlsLnNraXBUeXBlKHR5cGUucmF3VmFsdWUsIG9uUHJvdG9jb2w6IHNlbGYpCisgIH0KKyAgCit9CmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL1RTZXJpYWxpemFibGUuc3dpZnQgYi9saWIvY29jb2Evc3JjL1RTZXJpYWxpemFibGUuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZkZmQ0MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb2NvYS9zcmMvVFNlcmlhbGl6YWJsZS5zd2lmdApAQCAtMCwwICsxLDE3OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitpbXBvcnQgRm91bmRhdGlvbgorCisKK3B1YmxpYyBwcm90b2NvbCBUU2VyaWFsaXphYmxlIDogSGFzaGFibGUgeworICAKKyAgc3RhdGljIHZhciB0aHJpZnRUeXBlIDogVFR5cGUgeyBnZXQgfQorICAKKyAgaW5pdCgpCisgIAorICBzdGF0aWMgZnVuYyByZWFkVmFsdWVGcm9tUHJvdG9jb2wocHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIC0+IFNlbGYKKyAgCisgIHN0YXRpYyBmdW5jIHdyaXRlVmFsdWUodmFsdWU6IFNlbGYsIHRvUHJvdG9jb2wgcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzCisgIAorfQorCisKKworaW5maXggb3BlcmF0b3IgPz09IHt9CisKK3B1YmxpYyBmdW5jID89PTxUOiBUU2VyaWFsaXphYmxlPihsaHM6IFQ/LCByaHM6IFQ/KSAtPiBCb29sIHsKKyAgaWYgbGV0IGwgPSBsaHMsIHIgPSByaHMgeworICAgIHJldHVybiBsID09IHIKKyAgfQorICByZXR1cm4gbGhzID09IHJocworfQorCitwdWJsaWMgZnVuYyA/PT08VDogVFNlcmlhbGl6YWJsZT4obGhzOiBULCByaHM6IFQpIC0+IEJvb2wgeworICByZXR1cm4gbGhzID09IHJocworfQorCisKKworZXh0ZW5zaW9uIEJvb2wgOiBUU2VyaWFsaXphYmxlIHsKKyAgCisgIHB1YmxpYyBzdGF0aWMgbGV0IHRocmlmdFR5cGUgPSBUVHlwZS5CT09MCisgIAorICBwdWJsaWMgc3RhdGljIGZ1bmMgcmVhZFZhbHVlRnJvbVByb3RvY29sKHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyAtPiBCb29sIHsKKyAgICB2YXIgdmFsdWUgOiBPYmpDQm9vbCA9IGZhbHNlCisgICAgdHJ5IHByb3RvLnJlYWRCb29sKCZ2YWx1ZSkKKyAgICByZXR1cm4gdmFsdWUuYm9vbFZhbHVlCisgIH0KKyAgCisgIHB1YmxpYyBzdGF0aWMgZnVuYyB3cml0ZVZhbHVlKHZhbHVlOiBCb29sLCB0b1Byb3RvY29sIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyB7CisgICAgdHJ5IHByb3RvLndyaXRlQm9vbCh2YWx1ZSkKKyAgfQorICAKK30KKworZXh0ZW5zaW9uIEludDggOiBUU2VyaWFsaXphYmxlIHsKKyAgCisgIHB1YmxpYyBzdGF0aWMgbGV0IHRocmlmdFR5cGUgPSBUVHlwZS5CWVRFCisgIAorICBwdWJsaWMgc3RhdGljIGZ1bmMgcmVhZFZhbHVlRnJvbVByb3RvY29sKHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyAtPiBJbnQ4IHsKKyAgICB2YXIgdmFsdWUgPSBVSW50OCgpCisgICAgdHJ5IHByb3RvLnJlYWRCeXRlKCZ2YWx1ZSkKKyAgICByZXR1cm4gSW50OCh2YWx1ZSkKKyAgfQorICAKKyAgcHVibGljIHN0YXRpYyBmdW5jIHdyaXRlVmFsdWUodmFsdWU6IEludDgsIHRvUHJvdG9jb2wgcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIHsKKyAgICB0cnkgcHJvdG8ud3JpdGVCeXRlKFVJbnQ4KHZhbHVlKSkKKyAgfQorICAKK30KKworZXh0ZW5zaW9uIEludDE2IDogVFNlcmlhbGl6YWJsZSB7CisgIAorICBwdWJsaWMgc3RhdGljIGxldCB0aHJpZnRUeXBlID0gVFR5cGUuSTE2CisgIAorICBwdWJsaWMgc3RhdGljIGZ1bmMgcmVhZFZhbHVlRnJvbVByb3RvY29sKHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyAtPiBJbnQxNiB7CisgICAgdmFyIHZhbHVlID0gSW50MTYoKQorICAgIHRyeSBwcm90by5yZWFkSTE2KCZ2YWx1ZSkKKyAgICByZXR1cm4gdmFsdWUKKyAgfQorICAKKyAgcHVibGljIHN0YXRpYyBmdW5jIHdyaXRlVmFsdWUodmFsdWU6IEludDE2LCB0b1Byb3RvY29sIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyB7CisgICAgdHJ5IHByb3RvLndyaXRlSTE2KHZhbHVlKQorICB9CisgIAorfQorCitleHRlbnNpb24gSW50IDogVFNlcmlhbGl6YWJsZSB7CisgIAorICBwdWJsaWMgc3RhdGljIGxldCB0aHJpZnRUeXBlID0gVFR5cGUuSTMyCisgIAorICBwdWJsaWMgc3RhdGljIGZ1bmMgcmVhZFZhbHVlRnJvbVByb3RvY29sKHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyAtPiBJbnQgeworICAgIHZhciB2YWx1ZSA9IEludDMyKCkKKyAgICB0cnkgcHJvdG8ucmVhZEkzMigmdmFsdWUpCisgICAgcmV0dXJuIEludCh2YWx1ZSkKKyAgfQorICAKKyAgcHVibGljIHN0YXRpYyBmdW5jIHdyaXRlVmFsdWUodmFsdWU6IEludCwgdG9Qcm90b2NvbCBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgeworICAgIHRyeSBwcm90by53cml0ZUkzMihJbnQzMih2YWx1ZSkpCisgIH0KKyAgCit9CisKK2V4dGVuc2lvbiBJbnQzMiA6IFRTZXJpYWxpemFibGUgeworICAKKyAgcHVibGljIHN0YXRpYyBsZXQgdGhyaWZ0VHlwZSA9IFRUeXBlLkkzMgorICAKKyAgcHVibGljIHN0YXRpYyBmdW5jIHJlYWRWYWx1ZUZyb21Qcm90b2NvbChwcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gSW50MzIgeworICAgIHZhciB2YWx1ZSA9IEludDMyKCkKKyAgICB0cnkgcHJvdG8ucmVhZEkzMigmdmFsdWUpCisgICAgcmV0dXJuIHZhbHVlCisgIH0KKyAgCisgIHB1YmxpYyBzdGF0aWMgZnVuYyB3cml0ZVZhbHVlKHZhbHVlOiBJbnQzMiwgdG9Qcm90b2NvbCBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgeworICAgIHRyeSBwcm90by53cml0ZUkzMih2YWx1ZSkKKyAgfQorICAKK30KKworZXh0ZW5zaW9uIEludDY0IDogVFNlcmlhbGl6YWJsZSB7CisgIAorICBwdWJsaWMgc3RhdGljIGxldCB0aHJpZnRUeXBlID0gVFR5cGUuSTY0CisgIAorICBwdWJsaWMgc3RhdGljIGZ1bmMgcmVhZFZhbHVlRnJvbVByb3RvY29sKHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyAtPiBJbnQ2NCB7CisgICAgdmFyIHZhbHVlID0gSW50NjQoKQorICAgIHRyeSBwcm90by5yZWFkSTY0KCZ2YWx1ZSkKKyAgICByZXR1cm4gdmFsdWUKKyAgfQorICAKKyAgcHVibGljIHN0YXRpYyBmdW5jIHdyaXRlVmFsdWUodmFsdWU6IEludDY0LCB0b1Byb3RvY29sIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyB7CisgICAgdHJ5IHByb3RvLndyaXRlSTY0KHZhbHVlKQorICB9CisgIAorfQorCitleHRlbnNpb24gRG91YmxlIDogVFNlcmlhbGl6YWJsZSB7CisgIAorICBwdWJsaWMgc3RhdGljIGxldCB0aHJpZnRUeXBlID0gVFR5cGUuRE9VQkxFCisgIAorICBwdWJsaWMgc3RhdGljIGZ1bmMgcmVhZFZhbHVlRnJvbVByb3RvY29sKHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyAtPiBEb3VibGUgeworICAgIHZhciB2YWx1ZSA9IERvdWJsZSgpCisgICAgdHJ5IHByb3RvLnJlYWREb3VibGUoJnZhbHVlKQorICAgIHJldHVybiB2YWx1ZQorICB9CisgIAorICBwdWJsaWMgc3RhdGljIGZ1bmMgd3JpdGVWYWx1ZSh2YWx1ZTogRG91YmxlLCB0b1Byb3RvY29sIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyB7CisgICAgdHJ5IHByb3RvLndyaXRlRG91YmxlKHZhbHVlKQorICB9CisgIAorfQorCitleHRlbnNpb24gU3RyaW5nIDogVFNlcmlhbGl6YWJsZSB7CisgIAorICBwdWJsaWMgc3RhdGljIGxldCB0aHJpZnRUeXBlID0gVFR5cGUuU1RSSU5HCisgIAorICBwdWJsaWMgc3RhdGljIGZ1bmMgcmVhZFZhbHVlRnJvbVByb3RvY29sKHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyAtPiBTdHJpbmcgeworICAgIHZhciB2YWx1ZSA6IE5TU3RyaW5nPworICAgIHRyeSBwcm90by5yZWFkU3RyaW5nKCZ2YWx1ZSkKKyAgICByZXR1cm4gdmFsdWUgYXMhIFN0cmluZworICB9CisgIAorICBwdWJsaWMgc3RhdGljIGZ1bmMgd3JpdGVWYWx1ZSh2YWx1ZTogU3RyaW5nLCB0b1Byb3RvY29sIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyB7CisgICAgdHJ5IHByb3RvLndyaXRlU3RyaW5nKHZhbHVlKQorICB9CisgIAorfQpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9UU2V0LnN3aWZ0IGIvbGliL2NvY29hL3NyYy9UU2V0LnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1ODMzZTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL1RTZXQuc3dpZnQKQEAgLTAsMCArMSwxNjEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworaW1wb3J0IEZvdW5kYXRpb24KKworCitwdWJsaWMgc3RydWN0IFRTZXQ8RWxlbWVudCA6IFRTZXJpYWxpemFibGU+IDogQ29sbGVjdGlvblR5cGUsIEFycmF5TGl0ZXJhbENvbnZlcnRpYmxlLCBUU2VyaWFsaXphYmxlIHsKKyAgCisgIHB1YmxpYyBzdGF0aWMgdmFyIHRocmlmdFR5cGUgOiBUVHlwZSB7IHJldHVybiAuU0VUIH0KKyAgCisgIHB1YmxpYyB0eXBlYWxpYXMgSW5kZXggPSBTdG9yYWdlLkluZGV4CisgIAorICB0eXBlYWxpYXMgU3RvcmFnZSA9IFNldDxFbGVtZW50PgorICAKKyAgcHJpdmF0ZSB2YXIgc3RvcmFnZSA6IFN0b3JhZ2UKKyAgCisgIHB1YmxpYyBpbml0KCkgeworICAgIHN0b3JhZ2UgPSBTdG9yYWdlKCkKKyAgfQorICAKKyAgcHVibGljIGluaXQoYXJyYXlMaXRlcmFsIGVsZW1lbnRzOiBFbGVtZW50Li4uKSB7CisgICAgc3RvcmFnZSA9IFN0b3JhZ2UoZWxlbWVudHMpCisgIH0KKyAgCisgIHB1YmxpYyBpbml0PFMgOiBTZXF1ZW5jZVR5cGUgd2hlcmUgUy5HZW5lcmF0b3IuRWxlbWVudCA9PSBFbGVtZW50PihfIHNlcXVlbmNlOiBTKSB7CisgICAgc3RvcmFnZSA9IFN0b3JhZ2Uoc2VxdWVuY2UpICAgIAorICB9CisgIAorICBwdWJsaWMgdmFyIHN0YXJ0SW5kZXggOiBJbmRleCB7IHJldHVybiBzdG9yYWdlLnN0YXJ0SW5kZXggfQorICAKKyAgcHVibGljIHZhciBlbmRJbmRleCA6IEluZGV4IHsgcmV0dXJuIHN0b3JhZ2UuZW5kSW5kZXggfQorICAKKyAgcHVibGljIG11dGF0aW5nIGZ1bmMgaW5zZXJ0KG1lbWJlcjogRWxlbWVudCkgeworICAgIHJldHVybiBzdG9yYWdlLmluc2VydChtZW1iZXIpCisgIH0KKyAgCisgIHB1YmxpYyBtdXRhdGluZyBmdW5jIHJlbW92ZShlbGVtZW50OiBFbGVtZW50KSAtPiBFbGVtZW50PyB7CisgICAgcmV0dXJuIHN0b3JhZ2UucmVtb3ZlKGVsZW1lbnQpCisgIH0KKyAgCisgIHB1YmxpYyBtdXRhdGluZyBmdW5jIHJlbW92ZUFsbChrZWVwQ2FwYWNpdHkga2VlcENhcGFjaXR5OiBCb29sID0gZmFsc2UpIHsKKyAgICByZXR1cm4gc3RvcmFnZS5yZW1vdmVBbGwoa2VlcENhcGFjaXR5OiBrZWVwQ2FwYWNpdHkpCisgIH0KKyAgCisgIHB1YmxpYyBtdXRhdGluZyBmdW5jIHJlbW92ZUF0SW5kZXgoaW5kZXg6IFNldEluZGV4PEVsZW1lbnQ+KSAtPiBFbGVtZW50IHsKKyAgICByZXR1cm4gc3RvcmFnZS5yZW1vdmVBdEluZGV4KGluZGV4KQorICB9CisgIAorICBwdWJsaWMgc3Vic2NyaXB0IChwb3NpdGlvbjogU2V0SW5kZXg8RWxlbWVudD4pIC0+IEVsZW1lbnQgeworICAgIHJldHVybiBzdG9yYWdlW3Bvc2l0aW9uXQorICB9CisgIAorICBwdWJsaWMgZnVuYyB1bmlvbihvdGhlcjogVFNldCkgLT4gVFNldCB7CisgICAgcmV0dXJuIFRTZXQoc3RvcmFnZS51bmlvbihvdGhlcikpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIGludGVyc2VjdChvdGhlcjogVFNldCkgLT4gVFNldCB7CisgICAgcmV0dXJuIFRTZXQoc3RvcmFnZS5pbnRlcnNlY3Qob3RoZXIpKQorICB9CisgIAorICBwdWJsaWMgZnVuYyBleGNsdXNpdmVPcihvdGhlcjogVFNldCkgLT4gVFNldCB7CisgICAgcmV0dXJuIFRTZXQoc3RvcmFnZS5leGNsdXNpdmVPcihvdGhlcikpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHN1YnRyYWN0KG90aGVyOiBUU2V0KSAtPiBUU2V0IHsKKyAgICByZXR1cm4gVFNldChzdG9yYWdlLnN1YnRyYWN0KG90aGVyKSkKKyAgfQorICAKKyAgcHVibGljIG11dGF0aW5nIGZ1bmMgaW50ZXJzZWN0SW5QbGFjZShvdGhlcjogVFNldCkgeworICAgIHN0b3JhZ2UuaW50ZXJzZWN0SW5QbGFjZShvdGhlcikKKyAgfQorCisgIHB1YmxpYyBtdXRhdGluZyBmdW5jIGV4Y2x1c2l2ZU9ySW5QbGFjZShvdGhlcjogVFNldCkgeworICAgIHN0b3JhZ2UuZXhjbHVzaXZlT3JJblBsYWNlKG90aGVyKQorICB9CisKKyAgcHVibGljIG11dGF0aW5nIGZ1bmMgc3VidHJhY3RJblBsYWNlKG90aGVyOiBUU2V0KSB7CisgICAgc3RvcmFnZS5zdWJ0cmFjdEluUGxhY2Uob3RoZXIpCisgIH0gIAorCisgIHB1YmxpYyBmdW5jIGlzU3Vic2V0T2Yob3RoZXI6IFRTZXQpIC0+IEJvb2wgeworICAgIHJldHVybiBzdG9yYWdlLmlzU3Vic2V0T2Yob3RoZXIpCisgIH0KKworICBwdWJsaWMgZnVuYyBpc0Rpc2pvaW50V2l0aChvdGhlcjogVFNldCkgLT4gQm9vbCB7CisgICAgcmV0dXJuIHN0b3JhZ2UuaXNEaXNqb2ludFdpdGgob3RoZXIpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIGlzU3VwZXJzZXRPZihvdGhlcjogVFNldCkgLT4gQm9vbCB7CisgICAgcmV0dXJuIHN0b3JhZ2UuaXNTdXBlcnNldE9mKG90aGVyKQorICB9CisKKyAgcHVibGljIHZhciBpc0VtcHR5OiBCb29sIHsgcmV0dXJuIHN0b3JhZ2UuaXNFbXB0eSB9CisKKyAgcHVibGljIHZhciBoYXNoVmFsdWUgOiBJbnQgeworICAgIGxldCBwcmltZSA9IDMxCisgICAgdmFyIHJlc3VsdCA9IDEKKyAgICBmb3IgZWxlbWVudCBpbiBzdG9yYWdlIHsKKyAgICAgIHJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgZWxlbWVudC5oYXNoVmFsdWUKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdAorICB9CisgIAorICBwdWJsaWMgc3RhdGljIGZ1bmMgcmVhZFZhbHVlRnJvbVByb3RvY29sKHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyAtPiBUU2V0IHsKKyAgICBsZXQgKGVsZW1lbnRUeXBlLCBzaXplKSA9IHRyeSBwcm90by5yZWFkU2V0QmVnaW4oKQorICAgIGlmIGVsZW1lbnRUeXBlICE9IEVsZW1lbnQudGhyaWZ0VHlwZSB7CisgICAgICB0aHJvdyBOU0Vycm9yKAorICAgICAgICBkb21haW46IFRQcm90b2NvbEVycm9yRG9tYWluLAorICAgICAgICBjb2RlOiBJbnQoVFByb3RvY29sRXJyb3IuSW52YWxpZERhdGEucmF3VmFsdWUpLAorICAgICAgICB1c2VySW5mbzogW1RQcm90b2NvbEVycm9yRXh0ZW5kZWRFcnJvcktleTogTlNOdW1iZXIoaW50OiBlbGVtZW50VHlwZS5yYXdWYWx1ZSldKQorICAgIH0KKyAgICB2YXIgc2V0ID0gVFNldCgpCisgICAgZm9yIF8gaW4gMC4uPHNpemUgeworICAgICAgbGV0IGVsZW1lbnQgPSB0cnkgRWxlbWVudC5yZWFkVmFsdWVGcm9tUHJvdG9jb2wocHJvdG8pCisgICAgICBzZXQuc3RvcmFnZS5pbnNlcnQoZWxlbWVudCkKKyAgICB9CisgICAgdHJ5IHByb3RvLnJlYWRTZXRFbmQoKQorICAgIHJldHVybiBzZXQKKyAgfQorICAKKyAgcHVibGljIHN0YXRpYyBmdW5jIHdyaXRlVmFsdWUodmFsdWU6IFRTZXQsIHRvUHJvdG9jb2wgcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIHsKKyAgICB0cnkgcHJvdG8ud3JpdGVTZXRCZWdpbldpdGhFbGVtZW50VHlwZShFbGVtZW50LnRocmlmdFR5cGUsIHNpemU6IHZhbHVlLmNvdW50KQorICAgIGZvciBlbGVtZW50IGluIHZhbHVlLnN0b3JhZ2UgeworICAgICAgdHJ5IEVsZW1lbnQud3JpdGVWYWx1ZShlbGVtZW50LCB0b1Byb3RvY29sOiBwcm90bykKKyAgICB9CisgICAgdHJ5IHByb3RvLndyaXRlU2V0RW5kKCkKKyAgfQorICAKK30KKworZXh0ZW5zaW9uIFRTZXQgOiBDdXN0b21TdHJpbmdDb252ZXJ0aWJsZSwgQ3VzdG9tRGVidWdTdHJpbmdDb252ZXJ0aWJsZSB7CisgIAorICBwdWJsaWMgdmFyIGRlc2NyaXB0aW9uIDogU3RyaW5nIHsKKyAgICByZXR1cm4gc3RvcmFnZS5kZXNjcmlwdGlvbgorICB9CisgIAorICBwdWJsaWMgdmFyIGRlYnVnRGVzY3JpcHRpb24gOiBTdHJpbmcgeworICAgIHJldHVybiBzdG9yYWdlLmRlYnVnRGVzY3JpcHRpb24KKyAgfQorICAKK30KKworcHVibGljIGZ1bmMgPT08RWxlbWVudD4obGhzOiBUU2V0PEVsZW1lbnQ+LCByaHM6IFRTZXQ8RWxlbWVudD4pIC0+IEJvb2wgeworICByZXR1cm4gbGhzLnN0b3JhZ2UgPT0gcmhzLnN0b3JhZ2UKK30KZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvVFNoYXJlZFByb2Nlc3NvckZhY3RvcnkuaCBiL2xpYi9jb2NvYS9zcmMvVFNoYXJlZFByb2Nlc3NvckZhY3RvcnkuaAppbmRleCBjZjRhNDYyLi5jNzVmYWQxIDEwMDY0NAotLS0gYS9saWIvY29jb2Evc3JjL1RTaGFyZWRQcm9jZXNzb3JGYWN0b3J5LmgKKysrIGIvbGliL2NvY29hL3NyYy9UU2hhcmVkUHJvY2Vzc29yRmFjdG9yeS5oCkBAIC0yMCw4ICsyMCw5IEBACiAjaW1wb3J0IDxGb3VuZGF0aW9uL0ZvdW5kYXRpb24uaD4KICNpbXBvcnQgIlRQcm9jZXNzb3JGYWN0b3J5LmgiCiAKLUBpbnRlcmZhY2UgVFNoYXJlZFByb2Nlc3NvckZhY3RvcnkgOiBOU09iamVjdCA8VFByb2Nlc3NvckZhY3Rvcnk+IHsKLSAgaWQ8VFByb2Nlc3Nvcj4gbVNoYXJlZFByb2Nlc3NvcjsKLX0KLS0gKGlkKSBpbml0V2l0aFNoYXJlZFByb2Nlc3NvcjogKGlkPFRQcm9jZXNzb3I+KSBzaGFyZWRQcm9jZXNzb3I7CisKK0BpbnRlcmZhY2UgVFNoYXJlZFByb2Nlc3NvckZhY3RvcnkgOiBOU09iamVjdCA8VFByb2Nlc3NvckZhY3Rvcnk+CisKKy0oaWQpIGluaXRXaXRoU2hhcmVkUHJvY2Vzc29yOihpZDxUUHJvY2Vzc29yPilzaGFyZWRQcm9jZXNzb3I7CisKIEBlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvVFNoYXJlZFByb2Nlc3NvckZhY3RvcnkubSBiL2xpYi9jb2NvYS9zcmMvVFNoYXJlZFByb2Nlc3NvckZhY3RvcnkubQppbmRleCBhMDAwN2MwLi4zZDU1ZjQ3IDEwMDY0NAotLS0gYS9saWIvY29jb2Evc3JjL1RTaGFyZWRQcm9jZXNzb3JGYWN0b3J5Lm0KKysrIGIvbGliL2NvY29hL3NyYy9UU2hhcmVkUHJvY2Vzc29yRmFjdG9yeS5tCkBAIC0xOSwzNCArMTksMzEgQEAKIAogCiAjaW1wb3J0ICJUU2hhcmVkUHJvY2Vzc29yRmFjdG9yeS5oIgotI2ltcG9ydCAiVE9iamVjdGl2ZS1DLmgiCisKKworQGludGVyZmFjZSBUU2hhcmVkUHJvY2Vzc29yRmFjdG9yeSAoKQorCitAcHJvcGVydHkoc3Ryb25nLCBub25hdG9taWMpIGlkPFRQcm9jZXNzb3I+IHNoYXJlZFByb2Nlc3NvcjsKKworQGVuZAogCiAKIEBpbXBsZW1lbnRhdGlvbiBUU2hhcmVkUHJvY2Vzc29yRmFjdG9yeQogCiAKLS0gKGlkKSBpbml0V2l0aFNoYXJlZFByb2Nlc3NvcjogKGlkPFRQcm9jZXNzb3I+KSBzaGFyZWRQcm9jZXNzb3IKKy0oaWQpIGluaXRXaXRoU2hhcmVkUHJvY2Vzc29yOihpZDxUUHJvY2Vzc29yPilzaGFyZWRQcm9jZXNzb3IKIHsKICAgc2VsZiA9IFtzdXBlciBpbml0XTsKLSAgaWYgKCFzZWxmKSB7Ci0gICAgcmV0dXJuIG5pbDsKKyAgaWYgKHNlbGYpIHsKKyAgICBfc2hhcmVkUHJvY2Vzc29yID0gc2hhcmVkUHJvY2Vzc29yOwogICB9Ci0gIAotICBtU2hhcmVkUHJvY2Vzc29yID0gW3NoYXJlZFByb2Nlc3NvciByZXRhaW5fc3R1Yl07CisKICAgcmV0dXJuIHNlbGY7CiB9CiAKLQotLSAodm9pZCkgZGVhbGxvYworLShpZDxUUHJvY2Vzc29yPikgcHJvY2Vzc29yRm9yVHJhbnNwb3J0OihpZDxUVHJhbnNwb3J0Pil0cmFuc3BvcnQKIHsKLSAgW21TaGFyZWRQcm9jZXNzb3IgcmVsZWFzZV9zdHViXTsKLSAgW3N1cGVyIGRlYWxsb2Nfc3R1Yl07Ci19Ci0KLQotLSAoaWQ8VFByb2Nlc3Nvcj4pIHByb2Nlc3NvckZvclRyYW5zcG9ydDogKGlkPFRUcmFuc3BvcnQ+KSB0cmFuc3BvcnQKLXsKLSAgcmV0dXJuIFtbbVNoYXJlZFByb2Nlc3NvciByZXRhaW5fc3R1Yl0gYXV0b3JlbGVhc2Vfc3R1Yl07CisgIHJldHVybiBfc2hhcmVkUHJvY2Vzc29yOwogfQogCiBAZW5kCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL1RTdHJ1Y3Quc3dpZnQgYi9saWIvY29jb2Evc3JjL1RTdHJ1Y3Quc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2VhNzJlNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb2NvYS9zcmMvVFN0cnVjdC5zd2lmdApAQCAtMCwwICsxLDMxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ltcG9ydCBGb3VuZGF0aW9uCisKKworcHVibGljIHByb3RvY29sIFRTdHJ1Y3QgOiBUU2VyaWFsaXphYmxlIHsKK30KKworCitwdWJsaWMgZXh0ZW5zaW9uIFRTdHJ1Y3QgeworICAKKyAgcHVibGljIHN0YXRpYyB2YXIgdGhyaWZ0VHlwZSA6IFRUeXBlIHsgcmV0dXJuIFRUeXBlLlNUUlVDVCB9CisgIAorfQpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9UaHJpZnQuaCBiL2xpYi9jb2NvYS9zcmMvVGhyaWZ0LmgKaW5kZXggZTE1YTUwZS4uZDAxODI2ZCAxMDA2NDQKLS0tIGEvbGliL2NvY29hL3NyYy9UaHJpZnQuaAorKysgYi9saWIvY29jb2Evc3JjL1RocmlmdC5oCkBAIC0xNyw0ICsxNyw0IEBACiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jZGVmaW5lIFRocmlmdFZlcnNpb24gQCIwLjkuMiIKKyNkZWZpbmUgVGhyaWZ0VmVyc2lvbiBAIjEuMC4wIgpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UQmFzZS5oIGIvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UQmFzZS5oCmluZGV4IDMzMDM3ZWYuLjk5MzVkNTAgMTAwNjQ0Ci0tLSBhL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVEJhc2UuaAorKysgYi9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RCYXNlLmgKQEAgLTI2LDE2ICsyNiwyMSBAQAogLyoqCiAgKiBEZS1zZXJpYWxpemUgb2JqZWN0IGZyb20gdGhlIGdpdmVuIGlucHV0IHByb3RvY29sCiAgKgotICogQHBhcmFtIGlucHV0IHByb3RvY29sIHVzZWQgZm9yIHJlYWRpbmcgCisgKiBAcGFyYW0gaW5Qcm90b2NvbCBwcm90b2NvbCB1c2VkIGZvciByZWFkaW5nCiAgKi8KLS0gKHZvaWQpIHJlYWQ6IChpZCA8VFByb3RvY29sPikgaW5Qcm90b2NvbDsKKy0oQk9PTCkgcmVhZDooaWQgPFRQcm90b2NvbD4paW5Qcm90b2NvbCBlcnJvcjooTlNFcnJvciAqKillcnJvcjsKIAogLyoqCiAgKiBTZXJpYWxpemUgb2JqZWN0IHRvIHRoZSBnaXZlbiBwcm90b2NvbAogICoKLSAqIEBwYXJhbSBidWYgb3V0cHV0IHByb3RvY29sIHVzZWQgZm9yIHdyaXRpbmcKKyAqIEBwYXJhbSBvdXRQcm90b2NvbCBvdXRwdXQgcHJvdG9jb2wgdXNlZCBmb3Igd3JpdGluZwogICovCi0tICh2b2lkKSB3cml0ZTogKGlkIDxUUHJvdG9jb2w+KSBvdXRQcm90b2NvbDsKKy0oQk9PTCkgd3JpdGU6KGlkIDxUUHJvdG9jb2w+KW91dFByb3RvY29sIGVycm9yOihOU0Vycm9yICoqKWVycm9yOworCisKKy8qKgorICogVmFsaWRhdGUgcmVxdWlyZWQgZmllbGRzCisgKi8KKy0oQk9PTCkgdmFsaWRhdGU6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKV9fdGhyaWZ0RXJyb3I7CiAKIEBlbmQKLQpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaCBiL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmgKaW5kZXggOWE3MzczMC4uYmI5MGZhZCAxMDA2NDQKLS0tIGEvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaAorKysgYi9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oCkBAIC0yMSwzMSArMjEsMjkgQEAKICNpbXBvcnQgIlRUcmFuc3BvcnQuaCIKICNpbXBvcnQgIlRQcm90b2NvbEZhY3RvcnkuaCIKIAorTlNfQVNTVU1FX05PTk5VTExfQkVHSU4KIAotQGludGVyZmFjZSBUQmluYXJ5UHJvdG9jb2wgOiBOU09iamVjdCA8VFByb3RvY29sPiB7Ci0gIGlkIDxUVHJhbnNwb3J0PiBtVHJhbnNwb3J0OwotICBCT09MIG1TdHJpY3RSZWFkOwotICBCT09MIG1TdHJpY3RXcml0ZTsKLSAgaW50MzJfdCBtTWVzc2FnZVNpemVMaW1pdDsKLX0KIAotLSAoaWQpIGluaXRXaXRoVHJhbnNwb3J0OiAoaWQgPFRUcmFuc3BvcnQ+KSB0cmFuc3BvcnQ7CitAaW50ZXJmYWNlIFRCaW5hcnlQcm90b2NvbCA6IE5TT2JqZWN0IDxUUHJvdG9jb2w+CiAKLS0gKGlkKSBpbml0V2l0aFRyYW5zcG9ydDogKGlkIDxUVHJhbnNwb3J0PikgdHJhbnNwb3J0Ci0gICAgICAgICAgICAgIHN0cmljdFJlYWQ6IChCT09MKSBzdHJpY3RSZWFkCi0gICAgICAgICAgICAgc3RyaWN0V3JpdGU6IChCT09MKSBzdHJpY3RXcml0ZTsKK0Bwcm9wZXJ0eSAoYXNzaWduLCBub25hdG9taWMpIFVJbnQzMiBtZXNzYWdlU2l6ZUxpbWl0OwogCi0tIChpbnQzMl90KSBtZXNzYWdlU2l6ZUxpbWl0OwotLSAodm9pZCkgc2V0TWVzc2FnZVNpemVMaW1pdDogKGludDMyX3QpIHNpemVMaW1pdDsKKy0oaWQpIGluaXRXaXRoVHJhbnNwb3J0OihpZCA8VFRyYW5zcG9ydD4pdHJhbnNwb3J0OworCistKGlkKSBpbml0V2l0aFRyYW5zcG9ydDooaWQgPFRUcmFuc3BvcnQ+KXRyYW5zcG9ydAorICAgICAgICAgICAgIHN0cmljdFJlYWQ6KEJPT0wpc3RyaWN0UmVhZAorICAgICAgICAgICAgc3RyaWN0V3JpdGU6KEJPT0wpc3RyaWN0V3JpdGU7CisKK0BlbmQ7CisKKworQGludGVyZmFjZSBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5IDogTlNPYmplY3QgPFRQcm90b2NvbEZhY3Rvcnk+CisKKysoVEJpbmFyeVByb3RvY29sRmFjdG9yeSAqKSBzaGFyZWRGYWN0b3J5OworCistKFRCaW5hcnlQcm90b2NvbCAqKSBuZXdQcm90b2NvbE9uVHJhbnNwb3J0OihpZCA8VFRyYW5zcG9ydD4pdHJhbnNwb3J0OwogCiBAZW5kCiAKIAotQGludGVyZmFjZSBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5IDogTlNPYmplY3QgPFRQcm90b2NvbEZhY3Rvcnk+IHsKLX0KLQotKyAoVEJpbmFyeVByb3RvY29sRmFjdG9yeSAqKSBzaGFyZWRGYWN0b3J5OwotCi0tIChUQmluYXJ5UHJvdG9jb2wgKikgbmV3UHJvdG9jb2xPblRyYW5zcG9ydDogKGlkIDxUVHJhbnNwb3J0PikgdHJhbnNwb3J0OwotCi1AZW5kCitOU19BU1NVTUVfTk9OTlVMTF9FTkQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5tIGIvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wubQppbmRleCAxNTA4YWNjLi4xZjllNTdhIDEwMDY0NAotLS0gYS9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5tCisrKyBiL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLm0KQEAgLTE4LDE4ICsxOCwyMCBAQAogICovCiAKICNpbXBvcnQgIlRCaW5hcnlQcm90b2NvbC5oIgotI2ltcG9ydCAiVFByb3RvY29sRXhjZXB0aW9uLmgiCi0jaW1wb3J0ICJUT2JqZWN0aXZlLUMuaCIKLQotaW50MzJfdCBWRVJTSU9OXzEgPSAweDgwMDEwMDAwOwotaW50MzJfdCBWRVJTSU9OX01BU0sgPSAweGZmZmYwMDAwOworI2ltcG9ydCAiVFByb3RvY29sRXJyb3IuaCIKIAogCi1zdGF0aWMgVEJpbmFyeVByb3RvY29sRmFjdG9yeSAqIGdTaGFyZWRGYWN0b3J5ID0gbmlsOworc3RhdGljIFNJbnQzMiBWRVJTSU9OXzEgPSAweDgwMDEwMDAwOworc3RhdGljIFNJbnQzMiBWRVJTSU9OX01BU0sgPSAweGZmZmYwMDAwOworCisKK3N0YXRpYyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5ICpnU2hhcmVkRmFjdG9yeSA9IG5pbDsKKwogCiBAaW1wbGVtZW50YXRpb24gVEJpbmFyeVByb3RvY29sRmFjdG9yeQogCi0rIChUQmluYXJ5UHJvdG9jb2xGYWN0b3J5ICopIHNoYXJlZEZhY3RvcnkgeworKyhUQmluYXJ5UHJvdG9jb2xGYWN0b3J5ICopIHNoYXJlZEZhY3RvcnkKK3sKICAgaWYgKGdTaGFyZWRGYWN0b3J5ID09IG5pbCkgewogICAgIGdTaGFyZWRGYWN0b3J5ID0gW1tUQmluYXJ5UHJvdG9jb2xGYWN0b3J5IGFsbG9jXSBpbml0XTsKICAgfQpAQCAtMzcsMzU4ICszOSw1NTMgQEAKICAgcmV0dXJuIGdTaGFyZWRGYWN0b3J5OwogfQogCi0tIChUQmluYXJ5UHJvdG9jb2wgKikgbmV3UHJvdG9jb2xPblRyYW5zcG9ydDogKGlkIDxUVHJhbnNwb3J0PikgdHJhbnNwb3J0IHsKLSAgcmV0dXJuIFtbVEJpbmFyeVByb3RvY29sIGFsbG9jXSBpbml0V2l0aFRyYW5zcG9ydDogdHJhbnNwb3J0XTsKKy0oTlNTdHJpbmcgKikgcHJvdG9jb2xOYW1lCit7CisgIHJldHVybiBAImJpbmFyeSI7Cit9CisKKy0oVEJpbmFyeVByb3RvY29sICopIG5ld1Byb3RvY29sT25UcmFuc3BvcnQ6KGlkIDxUVHJhbnNwb3J0Pil0cmFuc3BvcnQKK3sKKyAgcmV0dXJuIFtbVEJpbmFyeVByb3RvY29sIGFsbG9jXSBpbml0V2l0aFRyYW5zcG9ydDp0cmFuc3BvcnRdOwogfQogCiBAZW5kCiAKIAorQGludGVyZmFjZSBUQmluYXJ5UHJvdG9jb2wgKCkKKworQHByb3BlcnR5KHN0cm9uZywgbm9uYXRvbWljKSBpZCA8VFRyYW5zcG9ydD4gdHJhbnNwb3J0OworCitAcHJvcGVydHkoYXNzaWduLCBub25hdG9taWMpIEJPT0wgc3RyaWN0UmVhZDsKK0Bwcm9wZXJ0eShhc3NpZ24sIG5vbmF0b21pYykgQk9PTCBzdHJpY3RXcml0ZTsKKworQHByb3BlcnR5KHN0cm9uZywgbm9uYXRvbWljKSBOU1N0cmluZyAqY3VycmVudE1lc3NhZ2VOYW1lOworQHByb3BlcnR5KHN0cm9uZywgbm9uYXRvbWljKSBOU1N0cmluZyAqY3VycmVudEZpZWxkTmFtZTsKKworQGVuZAorCiAKIEBpbXBsZW1lbnRhdGlvbiBUQmluYXJ5UHJvdG9jb2wKIAotLSAoaWQpIGluaXRXaXRoVHJhbnNwb3J0OiAoaWQgPFRUcmFuc3BvcnQ+KSB0cmFuc3BvcnQKKy0oaWQpIGluaXRXaXRoVHJhbnNwb3J0OihpZCA8VFRyYW5zcG9ydD4pYVRyYW5zcG9ydAogewotICByZXR1cm4gW3NlbGYgaW5pdFdpdGhUcmFuc3BvcnQ6IHRyYW5zcG9ydCBzdHJpY3RSZWFkOiBOTyBzdHJpY3RXcml0ZTogWUVTXTsKKyAgcmV0dXJuIFtzZWxmIGluaXRXaXRoVHJhbnNwb3J0OmFUcmFuc3BvcnQgc3RyaWN0UmVhZDpOTyBzdHJpY3RXcml0ZTpZRVNdOwogfQogCi0tIChpZCkgaW5pdFdpdGhUcmFuc3BvcnQ6IChpZCA8VFRyYW5zcG9ydD4pIHRyYW5zcG9ydAotICAgICAgICAgICAgICBzdHJpY3RSZWFkOiAoQk9PTCkgc3RyaWN0UmVhZAotICAgICAgICAgICAgIHN0cmljdFdyaXRlOiAoQk9PTCkgc3RyaWN0V3JpdGUKKy0oaWQpIGluaXRXaXRoVHJhbnNwb3J0OihpZCA8VFRyYW5zcG9ydD4pdHJhbnNwb3J0CisgICAgICAgICAgICAgc3RyaWN0UmVhZDooQk9PTClzdHJpY3RSZWFkCisgICAgICAgICAgICBzdHJpY3RXcml0ZTooQk9PTClzdHJpY3RXcml0ZQogewogICBzZWxmID0gW3N1cGVyIGluaXRdOwotICBtVHJhbnNwb3J0ID0gW3RyYW5zcG9ydCByZXRhaW5fc3R1Yl07Ci0gIG1TdHJpY3RSZWFkID0gc3RyaWN0UmVhZDsKLSAgbVN0cmljdFdyaXRlID0gc3RyaWN0V3JpdGU7CisgIGlmIChzZWxmKSB7CisgICAgX3RyYW5zcG9ydCA9IHRyYW5zcG9ydDsKKyAgICBfc3RyaWN0UmVhZCA9IHN0cmljdFJlYWQ7CisgICAgX3N0cmljdFdyaXRlID0gc3RyaWN0V3JpdGU7CisgIH0KICAgcmV0dXJuIHNlbGY7CiB9CiAKLQotLSAoaW50MzJfdCkgbWVzc2FnZVNpemVMaW1pdAorLShpZCA8VFRyYW5zcG9ydD4pIHRyYW5zcG9ydAogewotICByZXR1cm4gbU1lc3NhZ2VTaXplTGltaXQ7CisgIHJldHVybiBfdHJhbnNwb3J0OwogfQogCi0KLS0gKHZvaWQpIHNldE1lc3NhZ2VTaXplTGltaXQ6IChpbnQzMl90KSBzaXplTGltaXQKKy0oTlNTdHJpbmcgKikgcmVhZFN0cmluZ0JvZHk6KGludClzaXplIGVycm9yOihOU0Vycm9yICoqKWVycm9yCiB7Ci0gIG1NZXNzYWdlU2l6ZUxpbWl0ID0gc2l6ZUxpbWl0OwotfQotCi0KLS0gKHZvaWQpIGRlYWxsb2MKLXsKLSAgW21UcmFuc3BvcnQgcmVsZWFzZV9zdHViXTsKLSAgW3N1cGVyIGRlYWxsb2Nfc3R1Yl07Ci19Ci0KLQotLSAoaWQgPFRUcmFuc3BvcnQ+KSB0cmFuc3BvcnQKLXsKLSAgcmV0dXJuIG1UcmFuc3BvcnQ7Ci19Ci0KLQotLSAoTlNTdHJpbmcgKikgcmVhZFN0cmluZ0JvZHk6IChpbnQpIHNpemUKLXsKLSAgY2hhciAqIGJ1ZmZlciA9IG1hbGxvYyhzaXplKzEpOwotICBpZiAoIWJ1ZmZlcikgewotICAgIEB0aHJvdyBbVFByb3RvY29sRXhjZXB0aW9uIGV4Y2VwdGlvbldpdGhOYW1lOiBAIlRQcm90b2NvbEV4Y2VwdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbjogW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6IEAiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBpbiAlcywgc2l6ZTogJWkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19QUkVUVFlfRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVdXTs7CisgIE5TTXV0YWJsZURhdGEgKmRhdGEgPSBbTlNNdXRhYmxlRGF0YSBkYXRhV2l0aExlbmd0aDpzaXplXTsKKyAgaWYgKCFkYXRhKSB7CisgICAgUFJPVE9DT0xfRVJST1IobmlsLCBVbmtub3duLCBAIlVuYWJsZSB0byBhbGxvY2F0ZSAlZCBieXRlcyIsIHNpemUpOwogICB9Ci0gIFttVHJhbnNwb3J0IHJlYWRBbGw6ICh1aW50OF90ICopIGJ1ZmZlciBvZmZzZXQ6IDAgbGVuZ3RoOiBzaXplXTsKLSAgYnVmZmVyW3NpemVdID0gMDsKLSAgTlNTdHJpbmcgKiByZXN1bHQgPSBbTlNTdHJpbmcgc3RyaW5nV2l0aFVURjhTdHJpbmc6IGJ1ZmZlcl07Ci0gIGZyZWUoYnVmZmVyKTsKLSAgcmV0dXJuIHJlc3VsdDsKKworICBpZiAoIVtfdHJhbnNwb3J0IHJlYWRBbGw6ZGF0YS5tdXRhYmxlQnl0ZXMgb2Zmc2V0OjAgbGVuZ3RoOnNpemUgZXJyb3I6ZXJyb3JdKSB7CisgICAgUFJPVE9DT0xfVFJBTlNQT1JUX0VSUk9SKG5pbCwgZXJyb3IsIEAiVHJhbnNwb3J0IHJlYWQgZmFpbGVkIik7CisgIH0KKworICByZXR1cm4gW1tOU1N0cmluZyBhbGxvY10gaW5pdFdpdGhEYXRhOmRhdGEgZW5jb2Rpbmc6TlNVVEY4U3RyaW5nRW5jb2RpbmddOwogfQogCiAKLS0gKHZvaWQpIHJlYWRNZXNzYWdlQmVnaW5SZXR1cm5pbmdOYW1lOiAoTlNTdHJpbmcgKiopIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAoaW50ICopIHR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZUlEOiAoaW50ICopIHNlcXVlbmNlSUQKKy0oQk9PTCkgcmVhZE1lc3NhZ2VCZWdpblJldHVybmluZ05hbWU6KE5TU3RyaW5nICoqKW5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6KFNJbnQzMiAqKXR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlSUQ6KFNJbnQzMiAqKXNlcXVlbmNlSUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gIGludDMyX3Qgc2l6ZSA9IFtzZWxmIHJlYWRJMzJdOworICBTSW50MzIgc2l6ZTsKKyAgaWYgKCFbc2VsZiByZWFkSTMyOiZzaXplIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorICA7CisKICAgaWYgKHNpemUgPCAwKSB7CiAgICAgaW50IHZlcnNpb24gPSBzaXplICYgVkVSU0lPTl9NQVNLOwogICAgIGlmICh2ZXJzaW9uICE9IFZFUlNJT05fMSkgewotICAgICAgQHRocm93IFtUUHJvdG9jb2xFeGNlcHRpb24gZXhjZXB0aW9uV2l0aE5hbWU6IEAiVFByb3RvY29sRXhjZXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uOiBAIkJhZCB2ZXJzaW9uIGluIHJlYWRNZXNzYWdlQmVnaW4iXTsKKyAgICAgIFBST1RPQ09MX0VSUk9SKE5PLCBCYWRWZXJzaW9uLCBAIkJhZCBtZXNzYWdlIHZlcnNpb24iKTsKICAgICB9CiAgICAgaWYgKHR5cGUgIT0gTlVMTCkgewogICAgICAgKnR5cGUgPSBzaXplICYgMHgwMEZGOwogICAgIH0KLSAgICBOU1N0cmluZyAqIG1lc3NhZ2VOYW1lID0gW3NlbGYgcmVhZFN0cmluZ107CisgICAgTlNTdHJpbmcgKm1lc3NhZ2VOYW1lOworICAgIGlmICghW3NlbGYgcmVhZFN0cmluZzombWVzc2FnZU5hbWUgZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorICAgIGlmIChuYW1lICE9IG5pbCkgeworICAgICAgKm5hbWUgPSBtZXNzYWdlTmFtZTsKKyAgICB9CisgIH0KKyAgZWxzZSB7CisKKyAgICBpZiAoX3N0cmljdFJlYWQpIHsKKyAgICAgIFBST1RPQ09MX0VSUk9SKE5PLCBJbnZhbGlkRGF0YSwgQCJNaXNzaW5nIG1lc3NhZ2UgdmVyc2lvbiwgb2xkIGNsaWVudD8iKTsKKyAgICB9CisKKyAgICBpZiAoX21lc3NhZ2VTaXplTGltaXQgPiAwICYmIHNpemUgPiBfbWVzc2FnZVNpemVMaW1pdCkgeworICAgICAgUFJPVE9DT0xfRVJST1IoTk8sIFNpemVMaW1pdCwgQCJNZXNzYWdlIGV4Y2VlZWRzIHNpemUgbGltaXQgb2YgJWQiLCAoaW50KXNpemUpOworICAgIH0KKworICAgIE5TU3RyaW5nICptZXNzYWdlTmFtZSA9IFtzZWxmIHJlYWRTdHJpbmdCb2R5OnNpemUgZXJyb3I6ZXJyb3JdOworICAgIGlmICghbWVzc2FnZU5hbWUpIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisKICAgICBpZiAobmFtZSAhPSBOVUxMKSB7CiAgICAgICAqbmFtZSA9IG1lc3NhZ2VOYW1lOwogICAgIH0KLSAgICBpbnQgc2VxSUQgPSBbc2VsZiByZWFkSTMyXTsKLSAgICBpZiAoc2VxdWVuY2VJRCAhPSBOVUxMKSB7Ci0gICAgICAqc2VxdWVuY2VJRCA9IHNlcUlEOworCisgICAgVUludDggbWVzc2FnZVR5cGU7CisgICAgaWYgKCFbc2VsZiByZWFkQnl0ZTombWVzc2FnZVR5cGUgZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CiAgICAgfQotICB9IGVsc2UgewotICAgIGlmIChtU3RyaWN0UmVhZCkgewotICAgICAgQHRocm93IFtUUHJvdG9jb2xFeGNlcHRpb24gZXhjZXB0aW9uV2l0aE5hbWU6IEAiVFByb3RvY29sRXhjZXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uOiBAIk1pc3NpbmcgdmVyc2lvbiBpbiByZWFkTWVzc2FnZUJlZ2luLCBvbGQgY2xpZW50PyJdOwotICAgIH0KLSAgICBpZiAoW3NlbGYgbWVzc2FnZVNpemVMaW1pdF0gPiAwICYmIHNpemUgPiBbc2VsZiBtZXNzYWdlU2l6ZUxpbWl0XSkgewotICAgICAgQHRocm93IFtUUHJvdG9jb2xFeGNlcHRpb24gZXhjZXB0aW9uV2l0aE5hbWU6IEAiVFByb3RvY29sRXhjZXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb246IFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OiBAIk1lc3NhZ2UgdG9vIGJpZy4gIFNpemUgbGltaXQgaXM6ICVkIE1lc3NhZ2Ugc2l6ZSBpczogJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTWVzc2FnZVNpemVMaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV1dOwotICAgIH0KLSAgICBOU1N0cmluZyAqIG1lc3NhZ2VOYW1lID0gW3NlbGYgcmVhZFN0cmluZ0JvZHk6IHNpemVdOwotICAgIGlmIChuYW1lICE9IE5VTEwpIHsKLSAgICAgICpuYW1lID0gbWVzc2FnZU5hbWU7Ci0gICAgfQotICAgIGludCBtZXNzYWdlVHlwZSA9IFtzZWxmIHJlYWRCeXRlXTsKKwogICAgIGlmICh0eXBlICE9IE5VTEwpIHsKICAgICAgICp0eXBlID0gbWVzc2FnZVR5cGU7CiAgICAgfQotICAgIGludCBzZXFJRCA9IFtzZWxmIHJlYWRJMzJdOwotICAgIGlmIChzZXF1ZW5jZUlEICE9IE5VTEwpIHsKLSAgICAgICpzZXF1ZW5jZUlEID0gc2VxSUQ7Ci0gICAgfQogICB9CisKKyAgU0ludDMyIHNlcUlEOworICBpZiAoIVtzZWxmIHJlYWRJMzI6JnNlcUlEIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorICBpZiAoc2VxdWVuY2VJRCAhPSBOVUxMKSB7CisgICAgKnNlcXVlbmNlSUQgPSBzZXFJRDsKKyAgfQorCisgIHJldHVybiBZRVM7CiB9CiAKIAotLSAodm9pZCkgcmVhZE1lc3NhZ2VFbmQge30KLQotCi0tICh2b2lkKSByZWFkU3RydWN0QmVnaW5SZXR1cm5pbmdOYW1lOiAoTlNTdHJpbmcgKiopIG5hbWUKKy0oQk9PTCkgcmVhZE1lc3NhZ2VFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gIGlmIChuYW1lICE9IE5VTEwpIHsKLSAgICAqbmFtZSA9IG5pbDsKLSAgfQorICByZXR1cm4gWUVTOwogfQogCiAKLS0gKHZvaWQpIHJlYWRTdHJ1Y3RFbmQge30KLQotCi0tICh2b2lkKSByZWFkRmllbGRCZWdpblJldHVybmluZ05hbWU6IChOU1N0cmluZyAqKikgbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAoaW50ICopIGZpZWxkVHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZElEOiAoaW50ICopIGZpZWxkSUQKKy0oQk9PTCkgcmVhZFN0cnVjdEJlZ2luUmV0dXJuaW5nTmFtZTooTlNTdHJpbmcgKl9fYXV0b3JlbGVhc2luZyAqKW5hbWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gIGlmIChuYW1lICE9IE5VTEwpIHsKKyAgcmV0dXJuIFlFUzsKK30KKworCistKEJPT0wpIHJlYWRTdHJ1Y3RFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBZRVM7Cit9CisKKworLShCT09MKSByZWFkRmllbGRCZWdpblJldHVybmluZ05hbWU6KE5TU3RyaW5nICpfX2F1dG9yZWxlYXNpbmcgKiluYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTooU0ludDMyICopZmllbGRUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRJRDooU0ludDMyICopZmllbGRJRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIGlmIChuYW1lICE9IG5pbCkgewogICAgICpuYW1lID0gbmlsOwogICB9Ci0gIGludCBmdCA9IFtzZWxmIHJlYWRCeXRlXTsKKworICBVSW50OCBmdDsKKyAgaWYgKCFbc2VsZiByZWFkQnl0ZTomZnQgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CiAgIGlmIChmaWVsZFR5cGUgIT0gTlVMTCkgewogICAgICpmaWVsZFR5cGUgPSBmdDsKICAgfQotICBpZiAoZnQgIT0gVFR5cGVfU1RPUCkgewotICAgIGludCBmaWQgPSBbc2VsZiByZWFkSTE2XTsKKyAgaWYgKGZ0ICE9IFRUeXBlU1RPUCkgeworICAgIFNJbnQxNiBmaWQ7CisgICAgaWYgKCFbc2VsZiByZWFkSTE2OiZmaWQgZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQogICAgIGlmIChmaWVsZElEICE9IE5VTEwpIHsKICAgICAgICpmaWVsZElEID0gZmlkOwogICAgIH0KICAgfQorICByZXR1cm4gWUVTOwogfQogCiAKLS0gKHZvaWQpIHJlYWRGaWVsZEVuZCB7fQotCi0KLS0gKGludDMyX3QpIHJlYWRJMzIKKy0oQk9PTCkgcmVhZEZpZWxkRW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICB1aW50OF90IGkzMnJkWzRdOwotICBbbVRyYW5zcG9ydCByZWFkQWxsOiBpMzJyZCBvZmZzZXQ6IDAgbGVuZ3RoOiA0XTsKLSAgcmV0dXJuCisgIHJldHVybiBZRVM7Cit9CisKKworLShCT09MKSByZWFkU3RyaW5nOihOU1N0cmluZyAqX19hdXRvcmVsZWFzaW5nICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFNJbnQzMiBzaXplOworICBpZiAoIVtzZWxmIHJlYWRJMzI6JnNpemUgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisKKyAgTlNTdHJpbmcgKnN0cmluZyA9IFtzZWxmIHJlYWRTdHJpbmdCb2R5OnNpemUgZXJyb3I6ZXJyb3JdOworICBpZiAoIXN0cmluZykgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgICp2YWx1ZSA9IHN0cmluZzsKKworICByZXR1cm4gWUVTOworfQorCisKKy0oQk9PTCkgcmVhZEJvb2w6KEJPT0wgKil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgVUludDggYnl0ZTsKKyAgaWYgKCFbc2VsZiByZWFkQnl0ZTomYnl0ZSBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKworICAqdmFsdWUgPSBieXRlID09IDE7CisKKyAgcmV0dXJuIFlFUzsKK30KKworCistKEJPT0wpIHJlYWRCeXRlOihVSW50OCAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBVSW50OCBidWZmWzFdOworICBpZiAoIVtfdHJhbnNwb3J0IHJlYWRBbGw6YnVmZiBvZmZzZXQ6MCBsZW5ndGg6MSBlcnJvcjplcnJvcl0pIHsKKyAgICBQUk9UT0NPTF9UUkFOU1BPUlRfRVJST1IoTk8sIGVycm9yLCBAIlRyYW5zcG9ydCByZWFkIGZhaWxlZCIpOworICB9CisKKyAgKnZhbHVlID0gYnVmZlswXTsKKworICByZXR1cm4gWUVTOworfQorCisKKy0oQk9PTCkgcmVhZEkxNjooU0ludDE2ICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFVJbnQ4IGJ1ZmZbMl07CisgIGlmICghW190cmFuc3BvcnQgcmVhZEFsbDpidWZmIG9mZnNldDowIGxlbmd0aDoyIGVycm9yOmVycm9yXSkgeworICAgIFBST1RPQ09MX1RSQU5TUE9SVF9FUlJPUihOTywgZXJyb3IsIEAiVHJhbnNwb3J0IHJlYWQgZmFpbGVkIik7CisgIH0KKworICAqdmFsdWUgPQorICAgICgoU0ludDE2KShidWZmWzBdICYgMHhmZikgPDwgOCkgfAorICAgICgoU0ludDE2KShidWZmWzFdICYgMHhmZikpOworCisgIHJldHVybiBZRVM7Cit9CisKKworLShCT09MKSByZWFkSTMyOihTSW50MzIgKil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgVUludDggaTMycmRbNF07CisgIGlmICghW190cmFuc3BvcnQgcmVhZEFsbDppMzJyZCBvZmZzZXQ6MCBsZW5ndGg6NCBlcnJvcjplcnJvcl0pIHsKKyAgICBQUk9UT0NPTF9UUkFOU1BPUlRfRVJST1IoTk8sIGVycm9yLCBAIlRyYW5zcG9ydCByZWFkIGZhaWxlZCIpOworICB9CisKKyAgKnZhbHVlID0KICAgICAoKGkzMnJkWzBdICYgMHhmZikgPDwgMjQpIHwKICAgICAoKGkzMnJkWzFdICYgMHhmZikgPDwgMTYpIHwKICAgICAoKGkzMnJkWzJdICYgMHhmZikgPDwgIDgpIHwKICAgICAoKGkzMnJkWzNdICYgMHhmZikpOworCisgIHJldHVybiBZRVM7CiB9CiAKIAotLSAoTlNTdHJpbmcgKikgcmVhZFN0cmluZworLShCT09MKSByZWFkSTY0OihTSW50NjQgKil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgaW50IHNpemUgPSBbc2VsZiByZWFkSTMyXTsKLSAgcmV0dXJuIFtzZWxmIHJlYWRTdHJpbmdCb2R5OiBzaXplXTsKKyAgVUludDggYnVmZls4XTsKKyAgaWYgKCFbX3RyYW5zcG9ydCByZWFkQWxsOmJ1ZmYgb2Zmc2V0OjAgbGVuZ3RoOjggZXJyb3I6ZXJyb3JdKSB7CisgICAgUFJPVE9DT0xfVFJBTlNQT1JUX0VSUk9SKE5PLCBlcnJvciwgQCJUcmFuc3BvcnQgcmVhZCBmYWlsZWQiKTsKKyAgfQorCisgICp2YWx1ZSA9CisgICAgKChTSW50NjQpKGJ1ZmZbMF0gJiAweGZmKSA8PCA1NikgfAorICAgICgoU0ludDY0KShidWZmWzFdICYgMHhmZikgPDwgNDgpIHwKKyAgICAoKFNJbnQ2NCkoYnVmZlsyXSAmIDB4ZmYpIDw8IDQwKSB8CisgICAgKChTSW50NjQpKGJ1ZmZbM10gJiAweGZmKSA8PCAzMikgfAorICAgICgoU0ludDY0KShidWZmWzRdICYgMHhmZikgPDwgMjQpIHwKKyAgICAoKFNJbnQ2NCkoYnVmZls1XSAmIDB4ZmYpIDw8IDE2KSB8CisgICAgKChTSW50NjQpKGJ1ZmZbNl0gJiAweGZmKSA8PCAgOCkgfAorICAgICgoU0ludDY0KShidWZmWzddICYgMHhmZikpOworCisgIHJldHVybiBZRVM7CiB9CiAKIAotLSAoQk9PTCkgcmVhZEJvb2wKLXsKLSAgcmV0dXJuIFtzZWxmIHJlYWRCeXRlXSA9PSAxOwotfQotCi0tICh1aW50OF90KSByZWFkQnl0ZQotewotICB1aW50OF90IG15Qnl0ZTsKLSAgW21UcmFuc3BvcnQgcmVhZEFsbDogJm15Qnl0ZSBvZmZzZXQ6IDAgbGVuZ3RoOiAxXTsKLSAgcmV0dXJuIG15Qnl0ZTsKLX0KLQotLSAoc2hvcnQpIHJlYWRJMTYKLXsKLSAgdWludDhfdCBidWZmWzJdOwotICBbbVRyYW5zcG9ydCByZWFkQWxsOiBidWZmIG9mZnNldDogMCBsZW5ndGg6IDJdOwotICByZXR1cm4gKHNob3J0KQotICAgICgoKGJ1ZmZbMF0gJiAweGZmKSA8PCA4KSB8Ci0gICAgICgoYnVmZlsxXSAmIDB4ZmYpKSk7Ci0gIHJldHVybiAwOwotfQotCi0tIChpbnQ2NF90KSByZWFkSTY0OwotewotICB1aW50OF90IGk2NHJkWzhdOwotICBbbVRyYW5zcG9ydCByZWFkQWxsOiBpNjRyZCBvZmZzZXQ6IDAgbGVuZ3RoOiA4XTsKLSAgcmV0dXJuCi0gICAgKChpbnQ2NF90KShpNjRyZFswXSAmIDB4ZmYpIDw8IDU2KSB8Ci0gICAgKChpbnQ2NF90KShpNjRyZFsxXSAmIDB4ZmYpIDw8IDQ4KSB8Ci0gICAgKChpbnQ2NF90KShpNjRyZFsyXSAmIDB4ZmYpIDw8IDQwKSB8Ci0gICAgKChpbnQ2NF90KShpNjRyZFszXSAmIDB4ZmYpIDw8IDMyKSB8Ci0gICAgKChpbnQ2NF90KShpNjRyZFs0XSAmIDB4ZmYpIDw8IDI0KSB8Ci0gICAgKChpbnQ2NF90KShpNjRyZFs1XSAmIDB4ZmYpIDw8IDE2KSB8Ci0gICAgKChpbnQ2NF90KShpNjRyZFs2XSAmIDB4ZmYpIDw8ICA4KSB8Ci0gICAgKChpbnQ2NF90KShpNjRyZFs3XSAmIDB4ZmYpKTsKLX0KLQotLSAoZG91YmxlKSByZWFkRG91YmxlOworLShCT09MKSByZWFkRG91YmxlOihkb3VibGUgKil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKICAgLy8gRklYTUUgLSB3aWxsIHRoaXMgZ2V0IHVzIGludG8gdHJvdWJsZSBvbiBQb3dlclBDPwotICBpbnQ2NF90IGllZWU3NTQgPSBbc2VsZiByZWFkSTY0XTsKLSAgcmV0dXJuICooKGRvdWJsZSAqKSAmaWVlZTc1NCk7CisgIHJldHVybiBbc2VsZiByZWFkSTY0OihTSW50NjQgKil2YWx1ZSBlcnJvcjplcnJvcl07CiB9CiAKIAotLSAoTlNEYXRhICopIHJlYWRCaW5hcnkKKy0oQk9PTCkgcmVhZEJpbmFyeTooTlNEYXRhICpfX2F1dG9yZWxlYXNpbmcgKil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgaW50MzJfdCBzaXplID0gW3NlbGYgcmVhZEkzMl07Ci0gIHVpbnQ4X3QgKiBidWZmID0gbWFsbG9jKHNpemUpOwotICBpZiAoYnVmZiA9PSBOVUxMKSB7Ci0gICAgQHRocm93IFtUUHJvdG9jb2xFeGNlcHRpb24KLSAgICAgICAgICAgICBleGNlcHRpb25XaXRoTmFtZTogQCJUUHJvdG9jb2xFeGNlcHRpb24iCi0gICAgICAgICAgICAgcmVhc29uOiBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDogQCJPdXQgb2YgbWVtb3J5LiAgVW5hYmxlIHRvIGFsbG9jYXRlICVkIGJ5dGVzIHRyeWluZyB0byByZWFkIGJpbmFyeSBkYXRhLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV1dOworICBTSW50MzIgc2l6ZTsKKyAgaWYgKCFbc2VsZiByZWFkSTMyOiZzaXplIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKICAgfQotICBbbVRyYW5zcG9ydCByZWFkQWxsOiBidWZmIG9mZnNldDogMCBsZW5ndGg6IHNpemVdOwotICByZXR1cm4gW05TRGF0YSBkYXRhV2l0aEJ5dGVzTm9Db3B5OiBidWZmIGxlbmd0aDogc2l6ZV07CisKKyAgTlNNdXRhYmxlRGF0YSAqZGF0YSA9IFtOU011dGFibGVEYXRhIGRhdGFXaXRoTGVuZ3RoOnNpemVdOworICBpZiAoIWRhdGEpIHsKKyAgICBQUk9UT0NPTF9FUlJPUihOTywgVW5rbm93biwgQCJVbmFibGUgdG8gYWxsb2NhdGUgJWQgYnl0ZXMiLCAoaW50KXNpemUpOworICB9CisKKyAgaWYgKCFbX3RyYW5zcG9ydCByZWFkQWxsOmRhdGEubXV0YWJsZUJ5dGVzIG9mZnNldDowIGxlbmd0aDpzaXplIGVycm9yOmVycm9yXSkgeworICAgIFBST1RPQ09MX1RSQU5TUE9SVF9FUlJPUihOTywgZXJyb3IsIEAiVHJhbnNwb3J0IHJlYWQgZmFpbGVkIik7CisgIH0KKworICAqdmFsdWUgPSBkYXRhOworCisgIHJldHVybiBZRVM7CiB9CiAKIAotLSAodm9pZCkgcmVhZE1hcEJlZ2luUmV0dXJuaW5nS2V5VHlwZTogKGludCAqKSBrZXlUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVUeXBlOiAoaW50ICopIHZhbHVlVHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogKGludCAqKSBzaXplCistKEJPT0wpIHJlYWRNYXBCZWdpblJldHVybmluZ0tleVR5cGU6KFNJbnQzMiAqKWtleVR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlVHlwZTooU0ludDMyICopdmFsdWVUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6KFNJbnQzMiAqKXNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgaW50IGt0ID0gW3NlbGYgcmVhZEJ5dGVdOwotICBpbnQgdnQgPSBbc2VsZiByZWFkQnl0ZV07Ci0gIGludCBzID0gW3NlbGYgcmVhZEkzMl07CisgIFVJbnQ4IGt0OworICBpZiAoIVtzZWxmIHJlYWRCeXRlOiZrdCBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKworICBVSW50OCB2dDsKKyAgaWYgKCFbc2VsZiByZWFkQnl0ZTomdnQgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisKKyAgU0ludDMyIHM7CisgIGlmICghW3NlbGYgcmVhZEkzMjomcyBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKwogICBpZiAoa2V5VHlwZSAhPSBOVUxMKSB7CiAgICAgKmtleVR5cGUgPSBrdDsKICAgfQorCiAgIGlmICh2YWx1ZVR5cGUgIT0gTlVMTCkgewogICAgICp2YWx1ZVR5cGUgPSB2dDsKICAgfQorCiAgIGlmIChzaXplICE9IE5VTEwpIHsKICAgICAqc2l6ZSA9IHM7CiAgIH0KKworICByZXR1cm4gWUVTOwogfQogCi0tICh2b2lkKSByZWFkTWFwRW5kIHt9CiAKLQotLSAodm9pZCkgcmVhZFNldEJlZ2luUmV0dXJuaW5nRWxlbWVudFR5cGU6IChpbnQgKikgZWxlbWVudFR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOiAoaW50ICopIHNpemUKKy0oQk9PTCkgcmVhZE1hcEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgaW50IGV0ID0gW3NlbGYgcmVhZEJ5dGVdOwotICBpbnQgcyA9IFtzZWxmIHJlYWRJMzJdOworICByZXR1cm4gWUVTOworfQorCisKKy0oQk9PTCkgcmVhZFNldEJlZ2luUmV0dXJuaW5nRWxlbWVudFR5cGU6KFNJbnQzMiAqKWVsZW1lbnRUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOihTSW50MzIgKilzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBVSW50OCBldDsKKyAgaWYgKCFbc2VsZiByZWFkQnl0ZTomZXQgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisKKyAgU0ludDMyIHM7CisgIGlmICghW3NlbGYgcmVhZEkzMjomcyBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKwogICBpZiAoZWxlbWVudFR5cGUgIT0gTlVMTCkgewogICAgICplbGVtZW50VHlwZSA9IGV0OwogICB9CisKICAgaWYgKHNpemUgIT0gTlVMTCkgewogICAgICpzaXplID0gczsKICAgfQorCisgIHJldHVybiBZRVM7CiB9CiAKIAotLSAodm9pZCkgcmVhZFNldEVuZCB7fQotCi0KLS0gKHZvaWQpIHJlYWRMaXN0QmVnaW5SZXR1cm5pbmdFbGVtZW50VHlwZTogKGludCAqKSBlbGVtZW50VHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOiAoaW50ICopIHNpemUKKy0oQk9PTCkgcmVhZFNldEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgaW50IGV0ID0gW3NlbGYgcmVhZEJ5dGVdOwotICBpbnQgcyA9IFtzZWxmIHJlYWRJMzJdOworICByZXR1cm4gWUVTOworfQorCisKKy0oQk9PTCkgcmVhZExpc3RCZWdpblJldHVybmluZ0VsZW1lbnRUeXBlOihTSW50MzIgKillbGVtZW50VHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6KFNJbnQzMiAqKXNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBVSW50OCBldDsKKyAgaWYgKCFbc2VsZiByZWFkQnl0ZTomZXQgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisKKyAgU0ludDMyIHM7CisgIGlmICghW3NlbGYgcmVhZEkzMjomcyBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKwogICBpZiAoZWxlbWVudFR5cGUgIT0gTlVMTCkgewogICAgICplbGVtZW50VHlwZSA9IGV0OwogICB9CisKICAgaWYgKHNpemUgIT0gTlVMTCkgewogICAgICpzaXplID0gczsKICAgfQorCisgIHJldHVybiBZRVM7CiB9CiAKIAotLSAodm9pZCkgcmVhZExpc3RFbmQge30KLQotCi0tICh2b2lkKSB3cml0ZUJ5dGU6ICh1aW50OF90KSB2YWx1ZQorLShCT09MKSByZWFkTGlzdEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgW21UcmFuc3BvcnQgd3JpdGU6ICZ2YWx1ZSBvZmZzZXQ6IDAgbGVuZ3RoOiAxXTsKKyAgcmV0dXJuIFlFUzsKIH0KIAogCi0tICh2b2lkKSB3cml0ZU1lc3NhZ2VCZWdpbldpdGhOYW1lOiAoTlNTdHJpbmcgKikgbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogKGludCkgbWVzc2FnZVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlSUQ6IChpbnQpIHNlcXVlbmNlSUQKKworLShCT09MKSB3cml0ZU1lc3NhZ2VCZWdpbldpdGhOYW1lOihOU1N0cmluZyAqKW5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTooU0ludDMyKW1lc3NhZ2VUeXBlCisgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlSUQ6KFNJbnQzMilzZXF1ZW5jZUlECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gIGlmIChtU3RyaWN0V3JpdGUpIHsKKyAgaWYgKF9zdHJpY3RXcml0ZSkgeworCiAgICAgaW50IHZlcnNpb24gPSBWRVJTSU9OXzEgfCBtZXNzYWdlVHlwZTsKLSAgICBbc2VsZiB3cml0ZUkzMjogdmVyc2lvbl07Ci0gICAgW3NlbGYgd3JpdGVTdHJpbmc6IG5hbWVdOwotICAgIFtzZWxmIHdyaXRlSTMyOiBzZXF1ZW5jZUlEXTsKLSAgfSBlbHNlIHsKLSAgICBbc2VsZiB3cml0ZVN0cmluZzogbmFtZV07Ci0gICAgW3NlbGYgd3JpdGVCeXRlOiBtZXNzYWdlVHlwZV07Ci0gICAgW3NlbGYgd3JpdGVJMzI6IHNlcXVlbmNlSURdOworCisgICAgaWYgKCFbc2VsZiB3cml0ZUkzMjp2ZXJzaW9uIGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKworICAgIGlmICghW3NlbGYgd3JpdGVTdHJpbmc6bmFtZSBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisKKyAgICBpZiAoIVtzZWxmIHdyaXRlSTMyOnNlcXVlbmNlSUQgZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQogICB9CisgIGVsc2UgeworCisgICAgaWYgKCFbc2VsZiB3cml0ZVN0cmluZzpuYW1lIGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKworICAgIGlmICghW3NlbGYgd3JpdGVCeXRlOm1lc3NhZ2VUeXBlIGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKworICAgIGlmICghW3NlbGYgd3JpdGVJMzI6c2VxdWVuY2VJRCBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisgIH0KKworICBfY3VycmVudE1lc3NhZ2VOYW1lID0gbmFtZTsKKworICByZXR1cm4gWUVTOwogfQogCiAKLS0gKHZvaWQpIHdyaXRlTWVzc2FnZUVuZCB7fQotCi0KLS0gKHZvaWQpIHdyaXRlU3RydWN0QmVnaW5XaXRoTmFtZTogKE5TU3RyaW5nICopIG5hbWUge30KLQotCi0tICh2b2lkKSB3cml0ZVN0cnVjdEVuZCB7fQotCi0KLS0gKHZvaWQpIHdyaXRlRmllbGRCZWdpbldpdGhOYW1lOiAoTlNTdHJpbmcgKikgbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IChpbnQpIGZpZWxkVHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkSUQ6IChpbnQpIGZpZWxkSUQKKy0oQk9PTCkgd3JpdGVNZXNzYWdlRW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICBbc2VsZiB3cml0ZUJ5dGU6IGZpZWxkVHlwZV07Ci0gIFtzZWxmIHdyaXRlSTE2OiBmaWVsZElEXTsKKyAgX2N1cnJlbnRNZXNzYWdlTmFtZSA9IG5pbDsKKyAgcmV0dXJuIFlFUzsKIH0KIAogCi0tICh2b2lkKSB3cml0ZUkzMjogKGludDMyX3QpIHZhbHVlCistKEJPT0wpIHdyaXRlU3RydWN0QmVnaW5XaXRoTmFtZTooTlNTdHJpbmcgKiluYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgdWludDhfdCBidWZmWzRdOworICByZXR1cm4gWUVTOworfQorCisKKy0oQk9PTCkgd3JpdGVTdHJ1Y3RFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBZRVM7Cit9CisKKworLShCT09MKSB3cml0ZUZpZWxkQmVnaW5XaXRoTmFtZTooTlNTdHJpbmcgKiluYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOihTSW50MzIpZmllbGRUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZElEOihTSW50MzIpZmllbGRJRAorICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgaWYgKCFbc2VsZiB3cml0ZUJ5dGU6ZmllbGRUeXBlIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgIGlmICghW3NlbGYgd3JpdGVJMTY6ZmllbGRJRCBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKworICByZXR1cm4gWUVTOworfQorCisKKy0oQk9PTCkgd3JpdGVCb29sOihCT09MKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW3NlbGYgd3JpdGVCeXRlOih2YWx1ZSA/IDEgOiAwKSBlcnJvcjplcnJvcl07Cit9CisKKworLShCT09MKSB3cml0ZUJ5dGU6KFVJbnQ4KXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBpZiAoIVtfdHJhbnNwb3J0IHdyaXRlOiZ2YWx1ZSBvZmZzZXQ6MCBsZW5ndGg6MSBlcnJvcjplcnJvcl0pIHsKKyAgICBQUk9UT0NPTF9UUkFOU1BPUlRfRVJST1IoTk8sIGVycm9yLCBAIlRyYW5zcG9ydCB3cml0ZSBmYWlsZWQiKTsKKyAgfQorICByZXR1cm4gWUVTOworfQorCisKKy0oQk9PTCkgd3JpdGVJMTY6KHNob3J0KXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBVSW50OCBidWZmWzJdOworICBidWZmWzBdID0gMHhmZiAmICh2YWx1ZSA+PiA4KTsKKyAgYnVmZlsxXSA9IDB4ZmYgJiB2YWx1ZTsKKworICBpZiAoIVtfdHJhbnNwb3J0IHdyaXRlOmJ1ZmYgb2Zmc2V0OjAgbGVuZ3RoOjIgZXJyb3I6ZXJyb3JdKSB7CisgICAgUFJPVE9DT0xfVFJBTlNQT1JUX0VSUk9SKE5PLCBlcnJvciwgQCJUcmFuc3BvcnQgd3JpdGUgZmFpbGVkIik7CisgIH0KKworICByZXR1cm4gWUVTOworfQorCisKKy0oQk9PTCkgd3JpdGVJMzI6KFNJbnQzMil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgVUludDggYnVmZls0XTsKICAgYnVmZlswXSA9IDB4RkYgJiAodmFsdWUgPj4gMjQpOwogICBidWZmWzFdID0gMHhGRiAmICh2YWx1ZSA+PiAxNik7CiAgIGJ1ZmZbMl0gPSAweEZGICYgKHZhbHVlID4+IDgpOwogICBidWZmWzNdID0gMHhGRiAmIHZhbHVlOwotICBbbVRyYW5zcG9ydCB3cml0ZTogYnVmZiBvZmZzZXQ6IDAgbGVuZ3RoOiA0XTsKLX0KIAotLSAodm9pZCkgd3JpdGVJMTY6IChzaG9ydCkgdmFsdWUKLXsKLSAgdWludDhfdCBidWZmWzJdOwotICBidWZmWzBdID0gMHhmZiAmICh2YWx1ZSA+PiA4KTsKLSAgYnVmZlsxXSA9IDB4ZmYgJiB2YWx1ZTsKLSAgW21UcmFuc3BvcnQgd3JpdGU6IGJ1ZmYgb2Zmc2V0OiAwIGxlbmd0aDogMl07CisgIGlmICghW190cmFuc3BvcnQgd3JpdGU6YnVmZiBvZmZzZXQ6MCBsZW5ndGg6NCBlcnJvcjplcnJvcl0pIHsKKyAgICBQUk9UT0NPTF9UUkFOU1BPUlRfRVJST1IoTk8sIGVycm9yLCBAIlRyYW5zcG9ydCB3cml0ZSBmYWlsZWQiKTsKKyAgfQorCisgIHJldHVybiBZRVM7CiB9CiAKIAotLSAodm9pZCkgd3JpdGVJNjQ6IChpbnQ2NF90KSB2YWx1ZQorLShCT09MKSB3cml0ZUk2NDooU0ludDY0KXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICB1aW50OF90IGJ1ZmZbOF07CisgIFVJbnQ4IGJ1ZmZbOF07CiAgIGJ1ZmZbMF0gPSAweEZGICYgKHZhbHVlID4+IDU2KTsKICAgYnVmZlsxXSA9IDB4RkYgJiAodmFsdWUgPj4gNDgpOwogICBidWZmWzJdID0gMHhGRiAmICh2YWx1ZSA+PiA0MCk7CkBAIC0zOTcsODIgKzU5NCwxNDcgQEAKICAgYnVmZls1XSA9IDB4RkYgJiAodmFsdWUgPj4gMTYpOwogICBidWZmWzZdID0gMHhGRiAmICh2YWx1ZSA+PiA4KTsKICAgYnVmZls3XSA9IDB4RkYgJiB2YWx1ZTsKLSAgW21UcmFuc3BvcnQgd3JpdGU6IGJ1ZmYgb2Zmc2V0OiAwIGxlbmd0aDogOF07CisKKyAgaWYgKCFbX3RyYW5zcG9ydCB3cml0ZTpidWZmIG9mZnNldDowIGxlbmd0aDo4IGVycm9yOmVycm9yXSkgeworICAgIFBST1RPQ09MX1RSQU5TUE9SVF9FUlJPUihOTywgZXJyb3IsIEAiVHJhbnNwb3J0IHdyaXRlIGZhaWxlZCIpOworICB9CisKKyAgcmV0dXJuIFlFUzsKIH0KIAotLSAodm9pZCkgd3JpdGVEb3VibGU6IChkb3VibGUpIHZhbHVlCisKKy0oQk9PTCkgd3JpdGVEb3VibGU6KGRvdWJsZSl2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgLy8gc3BpdCBvdXQgSUVFRSA3NTQgYml0cyAtIEZJWE1FIC0gd2lsbCB0aGlzIGdldCB1cyBpbiB0cm91YmxlIG9uCi0gIC8vIFBvd2VyUEM/Ci0gIFtzZWxmIHdyaXRlSTY0OiAqKChpbnQ2NF90ICopICZ2YWx1ZSldOworICAvLyBGSVhNRSAtIHdpbGwgdGhpcyBnZXQgdXMgaW4gdHJvdWJsZSBvbiBQb3dlclBDPworICBpZiAoIVtzZWxmIHdyaXRlSTY0OiooU0ludDY0ICopJnZhbHVlIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgIHJldHVybiBZRVM7CiB9CiAKIAotLSAodm9pZCkgd3JpdGVTdHJpbmc6IChOU1N0cmluZyAqKSB2YWx1ZQorLShCT09MKSB3cml0ZVN0cmluZzooTlNTdHJpbmcgKil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKICAgaWYgKHZhbHVlICE9IG5pbCkgewotICAgIGNvbnN0IGNoYXIgKiB1dGY4Qnl0ZXMgPSBbdmFsdWUgVVRGOFN0cmluZ107Ci0gICAgc2l6ZV90IGxlbmd0aCA9IHN0cmxlbih1dGY4Qnl0ZXMpOwotICAgIFtzZWxmIHdyaXRlSTMyOiBsZW5ndGhdOwotICAgIFttVHJhbnNwb3J0IHdyaXRlOiAodWludDhfdCAqKSB1dGY4Qnl0ZXMgb2Zmc2V0OiAwIGxlbmd0aDogbGVuZ3RoXTsKLSAgfSBlbHNlIHsKKworICAgIGNvbnN0IGNoYXIgKnV0ZjhCeXRlcyA9IFt2YWx1ZSBVVEY4U3RyaW5nXTsKKworICAgIFNJbnQzMiBsZW5ndGggPSAoU0ludDMyKXN0cmxlbih1dGY4Qnl0ZXMpOworICAgIGlmICghW3NlbGYgd3JpdGVJMzI6bGVuZ3RoIGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKworICAgIGlmICghW190cmFuc3BvcnQgd3JpdGU6KFVJbnQ4ICopdXRmOEJ5dGVzIG9mZnNldDowIGxlbmd0aDooaW50KWxlbmd0aCBlcnJvcjplcnJvcl0pIHsKKyAgICAgIFBST1RPQ09MX1RSQU5TUE9SVF9FUlJPUihOTywgZXJyb3IsIEAiVHJhbnNwb3J0IHdyaXRlIGZhaWxlZCIpOworICAgIH0KKworICB9CisgIGVsc2UgeworCiAgICAgLy8gaW5zdGVhZCBvZiBjcmFzaGluZyB3aGVuIHdlIGdldCBudWxsLCBsZXQncyB3cml0ZSBvdXQgYSB6ZXJvCiAgICAgLy8gbGVuZ3RoIHN0cmluZwotICAgIFtzZWxmIHdyaXRlSTMyOiAwXTsKKyAgICBpZiAoIVtzZWxmIHdyaXRlSTMyOjAgZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorCiAgIH0KKworICByZXR1cm4gWUVTOwogfQogCiAKLS0gKHZvaWQpIHdyaXRlQmluYXJ5OiAoTlNEYXRhICopIGRhdGEKKy0oQk9PTCkgd3JpdGVCaW5hcnk6KE5TRGF0YSAqKWRhdGEgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gIFtzZWxmIHdyaXRlSTMyOiBbZGF0YSBsZW5ndGhdXTsKLSAgW21UcmFuc3BvcnQgd3JpdGU6IFtkYXRhIGJ5dGVzXSBvZmZzZXQ6IDAgbGVuZ3RoOiBbZGF0YSBsZW5ndGhdXTsKLX0KKyAgaWYgKCFbc2VsZiB3cml0ZUkzMjooU0ludDMyKWRhdGEubGVuZ3RoIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQogCi0tICh2b2lkKSB3cml0ZUZpZWxkU3RvcAotewotICBbc2VsZiB3cml0ZUJ5dGU6IFRUeXBlX1NUT1BdOworICBpZiAoIVtfdHJhbnNwb3J0IHdyaXRlOmRhdGEuYnl0ZXMgb2Zmc2V0OjAgbGVuZ3RoOihVSW50MzIpZGF0YS5sZW5ndGggZXJyb3I6ZXJyb3JdKSB7CisgICAgUFJPVE9DT0xfVFJBTlNQT1JUX0VSUk9SKE5PLCBlcnJvciwgQCJUcmFuc3BvcnQgd3JpdGUgZmFpbGVkIik7CisgIH0KKworICByZXR1cm4gWUVTOwogfQogCiAKLS0gKHZvaWQpIHdyaXRlRmllbGRFbmQge30KLQotCi0tICh2b2lkKSB3cml0ZU1hcEJlZ2luV2l0aEtleVR5cGU6IChpbnQpIGtleVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlVHlwZTogKGludCkgdmFsdWVUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IChpbnQpIHNpemUKKy0oQk9PTCkgd3JpdGVGaWVsZFN0b3A6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gIFtzZWxmIHdyaXRlQnl0ZToga2V5VHlwZV07Ci0gIFtzZWxmIHdyaXRlQnl0ZTogdmFsdWVUeXBlXTsKLSAgW3NlbGYgd3JpdGVJMzI6IHNpemVdOworICBpZiAoIVtzZWxmIHdyaXRlQnl0ZTpUVHlwZVNUT1AgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisKKyAgcmV0dXJuIFlFUzsKIH0KIAotLSAodm9pZCkgd3JpdGVNYXBFbmQge30KIAotCi0tICh2b2lkKSB3cml0ZVNldEJlZ2luV2l0aEVsZW1lbnRUeXBlOiAoaW50KSBlbGVtZW50VHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogKGludCkgc2l6ZQorLShCT09MKSB3cml0ZUZpZWxkRW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICBbc2VsZiB3cml0ZUJ5dGU6IGVsZW1lbnRUeXBlXTsKLSAgW3NlbGYgd3JpdGVJMzI6IHNpemVdOworICByZXR1cm4gWUVTOwogfQogCi0tICh2b2lkKSB3cml0ZVNldEVuZCB7fQogCi0KLS0gKHZvaWQpIHdyaXRlTGlzdEJlZ2luV2l0aEVsZW1lbnRUeXBlOiAoaW50KSBlbGVtZW50VHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IChpbnQpIHNpemUKKy0oQk9PTCkgd3JpdGVNYXBCZWdpbldpdGhLZXlUeXBlOihTSW50MzIpa2V5VHlwZQorICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVR5cGU6KFNJbnQzMil2YWx1ZVR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOihTSW50MzIpc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gIFtzZWxmIHdyaXRlQnl0ZTogZWxlbWVudFR5cGVdOwotICBbc2VsZiB3cml0ZUkzMjogc2l6ZV07CisgIGlmICghW3NlbGYgd3JpdGVCeXRlOmtleVR5cGUgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisgIGlmICghW3NlbGYgd3JpdGVCeXRlOnZhbHVlVHlwZSBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKyAgaWYgKCFbc2VsZiB3cml0ZUkzMjooaW50KXNpemUgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisgIHJldHVybiBZRVM7CiB9CiAKLS0gKHZvaWQpIHdyaXRlTGlzdEVuZCB7fQogCi0KLS0gKHZvaWQpIHdyaXRlQm9vbDogKEJPT0wpIHZhbHVlCistKEJPT0wpIHdyaXRlTWFwRW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICBbc2VsZiB3cml0ZUJ5dGU6ICh2YWx1ZSA/IDEgOiAwKV07CisgIHJldHVybiBZRVM7Cit9CisKKworLShCT09MKSB3cml0ZVNldEJlZ2luV2l0aEVsZW1lbnRUeXBlOihTSW50MzIpZWxlbWVudFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTooU0ludDMyKXNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgaWYgKCFbc2VsZiB3cml0ZUJ5dGU6ZWxlbWVudFR5cGUgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisgIGlmICghW3NlbGYgd3JpdGVJMzI6c2l6ZSBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKyAgcmV0dXJuIFlFUzsKK30KKworCistKEJPT0wpIHdyaXRlU2V0RW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gWUVTOworfQorCisKKy0oQk9PTCkgd3JpdGVMaXN0QmVnaW5XaXRoRWxlbWVudFR5cGU6KFNJbnQzMillbGVtZW50VHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTooU0ludDMyKXNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIGlmICghW3NlbGYgd3JpdGVCeXRlOmVsZW1lbnRUeXBlIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorICBpZiAoIVtzZWxmIHdyaXRlSTMyOnNpemUgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisgIHJldHVybiBZRVM7Cit9CisKKworLShCT09MKSB3cml0ZUxpc3RFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBZRVM7CiB9CiAKIEBlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5oIGIvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y2YWNjYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5oCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2ltcG9ydCAiVFByb3RvY29sLmgiCisjaW1wb3J0ICJUVHJhbnNwb3J0LmgiCisjaW1wb3J0ICJUUHJvdG9jb2xGYWN0b3J5LmgiCisKK05TX0FTU1VNRV9OT05OVUxMX0JFR0lOCisKKworQGludGVyZmFjZSBUQ29tcGFjdFByb3RvY29sIDogTlNPYmplY3QgPFRQcm90b2NvbD4KKworLShpZCkgaW5pdFdpdGhUcmFuc3BvcnQ6KGlkIDxUVHJhbnNwb3J0Pil0cmFuc3BvcnQ7CisKK0BlbmQKKworQGludGVyZmFjZSBUQ29tcGFjdFByb3RvY29sRmFjdG9yeSA6IE5TT2JqZWN0IDxUUHJvdG9jb2xGYWN0b3J5PgorCisrKFRDb21wYWN0UHJvdG9jb2xGYWN0b3J5ICopIHNoYXJlZEZhY3Rvcnk7CisKKy0oVENvbXBhY3RQcm90b2NvbCAqKSBuZXdQcm90b2NvbE9uVHJhbnNwb3J0OihpZCA8VFRyYW5zcG9ydD4pdHJhbnNwb3J0OworCitAZW5kCisKKworTlNfQVNTVU1FX05PTk5VTExfRU5EClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLm0gYi9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjBlYmIyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLm0KQEAgLTAsMCArMSw5ODMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2ltcG9ydCAiVENvbXBhY3RQcm90b2NvbC5oIgorI2ltcG9ydCAiVFByb3RvY29sRXJyb3IuaCIKKworc3RhdGljIGNvbnN0IFVJbnQ4IENPTVBBQ1RfUFJPVE9DT0xfSUQgPSAweDgyOworc3RhdGljIGNvbnN0IFVJbnQ4IENPTVBBQ1RfVkVSU0lPTiA9IDE7CitzdGF0aWMgY29uc3QgVUludDggQ09NUEFDVF9WRVJTSU9OX01BU0sgPSAweDFGOyAvLyAwMDAxIDExMTEKK3N0YXRpYyBjb25zdCBVSW50OCBDT01QQUNUX1RZUEVfTUFTSyA9IDB4RTA7IC8vIDExMTAgMDAwMAorc3RhdGljIGNvbnN0IFVJbnQ4IENPTVBBQ1RfVFlQRV9CSVRTID0gMHgwNzsgLy8gMDAwMCAwMTExCitzdGF0aWMgY29uc3QgaW50IENPTVBBQ1RfVFlQRV9TSElGVF9BTU9VTlQgPSA1OworCitlbnVtIHsKKyAgVENUeXBlX1NUT1AgPSAweDAwLAorICBUQ1R5cGVfQk9PTEVBTl9UUlVFID0gMHgwMSwKKyAgVENUeXBlX0JPT0xFQU5fRkFMU0UgPSAweDAyLAorICBUQ1R5cGVfQllURSA9IDB4MDMsCisgIFRDVHlwZV9JMTYgPSAweDA0LAorICBUQ1R5cGVfSTMyID0gMHgwNSwKKyAgVENUeXBlX0k2NCA9IDB4MDYsCisgIFRDVHlwZV9ET1VCTEUgPSAweDA3LAorICBUQ1R5cGVfQklOQVJZID0gMHgwOCwKKyAgVENUeXBlX0xJU1QgPSAweDA5LAorICBUQ1R5cGVfU0VUID0gMHgwQSwKKyAgVENUeXBlX01BUCA9IDB4MEIsCisgIFRDVHlwZV9TVFJVQ1QgPSAweDBDLAorfTsKKworQGltcGxlbWVudGF0aW9uIFRDb21wYWN0UHJvdG9jb2xGYWN0b3J5CisKKysoVENvbXBhY3RQcm90b2NvbEZhY3RvcnkgKikgc2hhcmVkRmFjdG9yeQoreworICBzdGF0aWMgVENvbXBhY3RQcm90b2NvbEZhY3RvcnkgKmdTaGFyZWRGYWN0b3J5ID0gbmlsOworICBpZiAoZ1NoYXJlZEZhY3RvcnkgPT0gbmlsKSB7CisgICAgZ1NoYXJlZEZhY3RvcnkgPSBbW1RDb21wYWN0UHJvdG9jb2xGYWN0b3J5IGFsbG9jXSBpbml0XTsKKyAgfQorCisgIHJldHVybiBnU2hhcmVkRmFjdG9yeTsKK30KKworLShOU1N0cmluZyAqKSBwcm90b2NvbE5hbWUKK3sKKyAgcmV0dXJuIEAiY29tcGFjdCI7Cit9CisKKy0oVENvbXBhY3RQcm90b2NvbCAqKSBuZXdQcm90b2NvbE9uVHJhbnNwb3J0OihpZCA8VFRyYW5zcG9ydD4pdHJhbnNwb3J0Cit7CisgIHJldHVybiBbW1RDb21wYWN0UHJvdG9jb2wgYWxsb2NdIGluaXRXaXRoVHJhbnNwb3J0OnRyYW5zcG9ydF07Cit9CisKK0BlbmQKKworCitAaW50ZXJmYWNlIFRDb21wYWN0UHJvdG9jb2wgKCkKKworQHByb3BlcnR5KHN0cm9uZywgbm9uYXRvbWljKSBpZCA8VFRyYW5zcG9ydD4gdHJhbnNwb3J0OworCitAcHJvcGVydHkoc3Ryb25nLCBub25hdG9taWMpIE5TTXV0YWJsZUFycmF5ICpsYXN0RmllbGQ7CitAcHJvcGVydHkoYXNzaWduLCBub25hdG9taWMpIHNob3J0IGxhc3RGaWVsZElkOworCitAcHJvcGVydHkoc3Ryb25nLCBub25hdG9taWMpIE5TU3RyaW5nICpib29sRmllbGROYW1lOworQHByb3BlcnR5KHN0cm9uZywgbm9uYXRvbWljKSBOU051bWJlciAqYm9vbEZpZWxkVHlwZTsKK0Bwcm9wZXJ0eShzdHJvbmcsIG5vbmF0b21pYykgTlNOdW1iZXIgKmJvb2xGaWVsZElkOworQHByb3BlcnR5KHN0cm9uZywgbm9uYXRvbWljKSBOU051bWJlciAqYm9vbGVhblZhbHVlOworCitAcHJvcGVydHkoc3Ryb25nLCBub25hdG9taWMpIE5TU3RyaW5nICpjdXJyZW50TWVzc2FnZU5hbWU7CisKK0BlbmQKKworCitAaW1wbGVtZW50YXRpb24gVENvbXBhY3RQcm90b2NvbAorCistKGlkKSBpbml0Cit7CisgIHNlbGYgPSBbc3VwZXIgaW5pdF07CisKKyAgaWYgKHNlbGYgIT0gbmlsKSB7CisgICAgX2xhc3RGaWVsZCA9IFtbTlNNdXRhYmxlQXJyYXkgYWxsb2NdIGluaXRdOworICB9CisKKyAgcmV0dXJuIHNlbGY7Cit9CisKKy0oaWQpIGluaXRXaXRoVHJhbnNwb3J0OihpZCA8VFRyYW5zcG9ydD4pYVRyYW5zcG9ydAoreworICBzZWxmID0gW3NlbGYgaW5pdF07CisKKyAgaWYgKHNlbGYgIT0gbmlsKSB7CisgICAgX3RyYW5zcG9ydCA9IGFUcmFuc3BvcnQ7CisgIH0KKworICByZXR1cm4gc2VsZjsKK30KKworLShpZCA8VFRyYW5zcG9ydD4pIHRyYW5zcG9ydAoreworICByZXR1cm4gX3RyYW5zcG9ydDsKK30KKworLShCT09MKSB3cml0ZUJ5dGVEaXJlY3Q6KFVJbnQ4KW4gZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIGlmICghW190cmFuc3BvcnQgd3JpdGU6KFVJbnQ4ICopJm4gb2Zmc2V0OjAgbGVuZ3RoOjEgZXJyb3I6ZXJyb3JdKSB7CisgICAgUFJPVE9DT0xfVFJBTlNQT1JUX0VSUk9SKE5PLCBlcnJvciwgQCJUcmFuc3BvcnQgd3JpdGUgZmFpbGVkIik7CisgIH0KKyAgcmV0dXJuIFlFUzsKK30KKworLShCT09MKSB3cml0ZVZhcmludDMyOihVSW50MzIpbiBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgVUludDggaTMyYnVmWzVdID0gezB9OworICBVSW50MzIgaWR4ID0gMDsKKworICB3aGlsZSAodHJ1ZSkgeworICAgIGlmICgobiAmIH4weDdGKSA9PSAwKSB7CisgICAgICBpMzJidWZbaWR4KytdID0gKFVJbnQ4KW47CisgICAgICBicmVhazsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBpMzJidWZbaWR4KytdID0gKFVJbnQ4KSgobiAmIDB4N0YpIHwgMHg4MCk7CisgICAgICBuID4+PSA3OworICAgIH0KKyAgfQorCisgIGlmICghW190cmFuc3BvcnQgd3JpdGU6aTMyYnVmIG9mZnNldDowIGxlbmd0aDppZHggZXJyb3I6ZXJyb3JdKSB7CisgICAgUFJPVE9DT0xfVFJBTlNQT1JUX0VSUk9SKE5PLCBlcnJvciwgQCJUcmFuc3BvcnQgd3JpdGUgZmFpbGVkIik7CisgIH0KKworICByZXR1cm4gWUVTOworfQorCistKEJPT0wpIHdyaXRlTWVzc2FnZUJlZ2luV2l0aE5hbWU6KE5TU3RyaW5nICopbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOihTSW50MzIpbWVzc2FnZVR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VJRDooU0ludDMyKXNlcXVlbmNlSUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgaWYgKCFbc2VsZiB3cml0ZUJ5dGVEaXJlY3Q6Q09NUEFDVF9QUk9UT0NPTF9JRCBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKyAgaWYgKCFbc2VsZiB3cml0ZUJ5dGVEaXJlY3Q6KFVJbnQ4KSgoQ09NUEFDVF9WRVJTSU9OICYgQ09NUEFDVF9WRVJTSU9OX01BU0spIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCgoVUludDMyKW1lc3NhZ2VUeXBlKSA8PCBDT01QQUNUX1RZUEVfU0hJRlRfQU1PVU5UKSAmIENPTVBBQ1RfVFlQRV9NQVNLKSkgZXJyb3I6ZXJyb3JdKQorICB7CisgICAgcmV0dXJuIE5POworICB9CisgIGlmICghW3NlbGYgd3JpdGVWYXJpbnQzMjooVUludDMyKXNlcXVlbmNlSUQgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisgIGlmICghW3NlbGYgd3JpdGVTdHJpbmc6bmFtZSBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKworICBfY3VycmVudE1lc3NhZ2VOYW1lID0gbmFtZTsKKworICByZXR1cm4gWUVTOworfQorCistKEJPT0wpIHdyaXRlU3RydWN0QmVnaW5XaXRoTmFtZTooTlNTdHJpbmcgKiluYW1lIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBbX2xhc3RGaWVsZCBhZGRPYmplY3Q6QChfbGFzdEZpZWxkSWQpXTsKKyAgX2xhc3RGaWVsZElkID0gMDsKKyAgcmV0dXJuIFlFUzsKK30KKworLShCT09MKSB3cml0ZVN0cnVjdEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgX2xhc3RGaWVsZElkID0gW19sYXN0RmllbGQubGFzdE9iamVjdCBzaG9ydFZhbHVlXTsKKyAgW19sYXN0RmllbGQgcmVtb3ZlTGFzdE9iamVjdF07CisgIHJldHVybiBZRVM7Cit9CisKKy0oQk9PTCkgd3JpdGVGaWVsZEJlZ2luV2l0aE5hbWU6KE5TU3RyaW5nICopbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTooU0ludDMyKWZpZWxkVHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRJRDooU0ludDMyKWZpZWxkSUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIGlmIChmaWVsZFR5cGUgPT0gVFR5cGVCT09MKSB7CisgICAgX2Jvb2xGaWVsZE5hbWUgPSBbbmFtZSBjb3B5XTsKKyAgICBfYm9vbEZpZWxkVHlwZSA9IEAoZmllbGRUeXBlKTsKKyAgICBfYm9vbEZpZWxkSWQgPSBAKGZpZWxkSUQpOworICAgIHJldHVybiBZRVM7CisgIH0KKyAgZWxzZSB7CisgICAgcmV0dXJuIFtzZWxmIHdyaXRlRmllbGRCZWdpbkludGVybmFsV2l0aE5hbWU6bmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOmZpZWxkVHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZElEOmZpZWxkSUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVPdmVycmlkZToweEZGCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6ZXJyb3JdOworICB9Cit9CisKKy0oQk9PTCkgd3JpdGVGaWVsZEJlZ2luSW50ZXJuYWxXaXRoTmFtZTooTlNTdHJpbmcgKiluYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6KFNJbnQzMilmaWVsZFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRJRDooU0ludDMyKWZpZWxkSUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVPdmVycmlkZTooVUludDgpdHlwZU92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFVJbnQ4IHR5cGVUb1dyaXRlID0gdHlwZU92ZXJyaWRlID09IDB4RkYgPyBbc2VsZiBjb21wYWN0VHlwZUZvclRUeXBlOmZpZWxkVHlwZV0gOiB0eXBlT3ZlcnJpZGU7CisKKyAgLy8gY2hlY2sgaWYgd2UgY2FuIHVzZSBkZWx0YSBlbmNvZGluZyBmb3IgdGhlIGZpZWxkIGlkCisgIGlmIChmaWVsZElEID4gX2xhc3RGaWVsZElkICYmIGZpZWxkSUQgLSBfbGFzdEZpZWxkSWQgPD0gMTUpIHsKKyAgICAvLyBXcml0ZSB0aGVtIHRvZ2V0aGVyCisgICAgaWYgKCFbc2VsZiB3cml0ZUJ5dGVEaXJlY3Q6KGZpZWxkSUQgLSBfbGFzdEZpZWxkSWQpIDw8IDQgfCB0eXBlVG9Xcml0ZSBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisgIH0KKyAgZWxzZSB7CisgICAgLy8gV3JpdGUgdGhlbSBzZXBhcmF0ZQorICAgIGlmICghW3NlbGYgd3JpdGVCeXRlRGlyZWN0OnR5cGVUb1dyaXRlIGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKyAgICBpZiAoIVtzZWxmIHdyaXRlSTE2OmZpZWxkSUQgZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorICB9CisKKyAgX2xhc3RGaWVsZElkID0gZmllbGRJRDsKKworICByZXR1cm4gWUVTOworfQorCistKEJPT0wpIHdyaXRlRmllbGRTdG9wOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW3NlbGYgd3JpdGVCeXRlRGlyZWN0OlRDVHlwZV9TVE9QIGVycm9yOmVycm9yXTsKK30KKworLShCT09MKSB3cml0ZU1hcEJlZ2luV2l0aEtleVR5cGU6KFNJbnQzMilrZXlUeXBlCisgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlVHlwZTooU0ludDMyKXZhbHVlVHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6KFNJbnQzMilzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgaWYgKHNpemUgPT0gMCkgeworICAgIGlmICghW3NlbGYgd3JpdGVCeXRlRGlyZWN0OjAgZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorICB9CisgIGVsc2UgeworICAgIGlmICghW3NlbGYgd3JpdGVWYXJpbnQzMjooVUludDMyKXNpemUgZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorICAgIGlmICghW3NlbGYgd3JpdGVCeXRlRGlyZWN0OltzZWxmIGNvbXBhY3RUeXBlRm9yVFR5cGU6a2V5VHlwZV0gPDwgNCB8IFtzZWxmIGNvbXBhY3RUeXBlRm9yVFR5cGU6dmFsdWVUeXBlXSBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFlFUzsKK30KKworLShCT09MKSB3cml0ZUxpc3RCZWdpbldpdGhFbGVtZW50VHlwZTooU0ludDMyKWVsZW1lbnRUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOihTSW50MzIpc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtzZWxmIHdyaXRlQ29sbGVjdGlvbkJlZ2luV2l0aEVsZW1lbnRUeXBlOmVsZW1lbnRUeXBlIHNpemU6c2l6ZSBlcnJvcjplcnJvcl07Cit9CisKKy0oQk9PTCkgd3JpdGVTZXRCZWdpbldpdGhFbGVtZW50VHlwZTooU0ludDMyKWVsZW1lbnRUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6KFNJbnQzMilzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbc2VsZiB3cml0ZUNvbGxlY3Rpb25CZWdpbldpdGhFbGVtZW50VHlwZTplbGVtZW50VHlwZSBzaXplOnNpemUgZXJyb3I6ZXJyb3JdOworfQorCistKEJPT0wpIHdyaXRlQm9vbDooQk9PTCliIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBCT09MIHJlc3VsdDsKKyAgaWYgKF9ib29sRmllbGRJZCAhPSBuaWwgJiYgX2Jvb2xGaWVsZE5hbWUgIT0gbmlsICYmIF9ib29sRmllbGRUeXBlICE9IG5pbCkgeworICAgIC8vIHdlIGhhdmVuJ3Qgd3JpdHRlbiB0aGUgZmllbGQgaGVhZGVyIHlldAorICAgIHJlc3VsdCA9IFtzZWxmIHdyaXRlRmllbGRCZWdpbkludGVybmFsV2l0aE5hbWU6X2Jvb2xGaWVsZE5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOl9ib29sRmllbGRUeXBlLmludFZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRJRDpfYm9vbEZpZWxkSWQuaW50VmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZU92ZXJyaWRlOmIgPyBUQ1R5cGVfQk9PTEVBTl9UUlVFIDogVENUeXBlX0JPT0xFQU5fRkFMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOmVycm9yXTsKKyAgICBfYm9vbEZpZWxkSWQgPSBuaWw7CisgICAgX2Jvb2xGaWVsZE5hbWUgPSBuaWw7CisgICAgX2Jvb2xGaWVsZFR5cGUgPSBuaWw7CisgIH0KKyAgZWxzZSB7CisgICAgLy8gd2UncmUgbm90IHBhcnQgb2YgYSBmaWVsZCwgc28ganVzdCBXcml0ZSB0aGUgdmFsdWUuCisgICAgcmVzdWx0ID0gW3NlbGYgd3JpdGVCeXRlRGlyZWN0OmIgPyBUQ1R5cGVfQk9PTEVBTl9UUlVFIDogVENUeXBlX0JPT0xFQU5fRkFMU0UgZXJyb3I6ZXJyb3JdOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy0oQk9PTCkgd3JpdGVCeXRlOihVSW50OCl2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtzZWxmIHdyaXRlQnl0ZURpcmVjdDp2YWx1ZSBlcnJvcjplcnJvcl07Cit9CisKKy0oQk9PTCkgd3JpdGVJMTY6KFNJbnQxNil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtzZWxmIHdyaXRlVmFyaW50MzI6W3NlbGYgaTMyVG9aaWdaYWc6dmFsdWVdIGVycm9yOmVycm9yXTsKK30KKworLShCT09MKSB3cml0ZUkzMjooU0ludDMyKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW3NlbGYgd3JpdGVWYXJpbnQzMjpbc2VsZiBpMzJUb1ppZ1phZzp2YWx1ZV0gZXJyb3I6ZXJyb3JdOworfQorCistKEJPT0wpIHdyaXRlSTY0OihTSW50NjQpdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbc2VsZiB3cml0ZVZhcmludDY0OltzZWxmIGk2NFRvWmlnWmFnOnZhbHVlXSBlcnJvcjplcnJvcl07Cit9CisKKy0oQk9PTCkgd3JpdGVEb3VibGU6KGRvdWJsZSl2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgLy8gU2FmZSBiaXQtY2FzdGluZyBkb3VibGUtPnVpbnQ2NAorCisgIFVJbnQ2NCBiaXRzID0gMDsKKyAgbWVtY3B5KCZiaXRzLCAmdmFsdWUsIDgpOworCisgIGJpdHMgPSBPU1N3YXBIb3N0VG9MaXR0bGVJbnQ2NChiaXRzKTsKKworICBpZiAoIVtfdHJhbnNwb3J0IHdyaXRlOihVSW50OCAqKSZiaXRzIG9mZnNldDowIGxlbmd0aDo4IGVycm9yOmVycm9yXSkgeworICAgIFBST1RPQ09MX1RSQU5TUE9SVF9FUlJPUihOTywgZXJyb3IsIEAiVHJhbnNwb3J0IHdyaXRlIGZhaWxlZCIpOworICB9CisKKyAgcmV0dXJuIFlFUzsKK30KKworLShCT09MKSB3cml0ZVN0cmluZzooTlNTdHJpbmcgKil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtzZWxmIHdyaXRlQmluYXJ5Olt2YWx1ZSBkYXRhVXNpbmdFbmNvZGluZzpOU1VURjhTdHJpbmdFbmNvZGluZ10gZXJyb3I6ZXJyb3JdOworfQorCistKEJPT0wpIHdyaXRlQmluYXJ5OihOU0RhdGEgKilkYXRhIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBpZiAoIVtzZWxmIHdyaXRlVmFyaW50MzI6KFVJbnQzMilkYXRhLmxlbmd0aCBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKyAgaWYgKCFbX3RyYW5zcG9ydCB3cml0ZTpkYXRhLmJ5dGVzIG9mZnNldDowIGxlbmd0aDooVUludDMyKWRhdGEubGVuZ3RoIGVycm9yOmVycm9yXSkgeworICAgIFBST1RPQ09MX1RSQU5TUE9SVF9FUlJPUihOTywgZXJyb3IsIEAiVHJhbnNwb3J0IHdyaXRlIGZhaWxlZCIpOworICB9CisgIHJldHVybiBZRVM7Cit9CisKKy0oQk9PTCkgd3JpdGVNZXNzYWdlRW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBfY3VycmVudE1lc3NhZ2VOYW1lID0gbmlsOworICByZXR1cm4gWUVTOworfQorCistKEJPT0wpIHdyaXRlTWFwRW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gWUVTOworfQorCistKEJPT0wpIHdyaXRlTGlzdEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFlFUzsKK30KKworLShCT09MKSB3cml0ZVNldEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFlFUzsKK30KKworLShCT09MKSB3cml0ZUZpZWxkRW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gWUVTOworfQorCistKEJPT0wpIHdyaXRlQ29sbGVjdGlvbkJlZ2luV2l0aEVsZW1lbnRUeXBlOihTSW50MzIpZWxlbWVudFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6KFNJbnQzMilzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBVSW50OCBjdHlwZUVsZW1lbnQgPSBbc2VsZiBjb21wYWN0VHlwZUZvclRUeXBlOmVsZW1lbnRUeXBlXTsKKworICBpZiAoc2l6ZSA8PSAxNCkgeworICAgIGlmICghW3NlbGYgd3JpdGVCeXRlRGlyZWN0OnNpemUgPDwgNCB8IGN0eXBlRWxlbWVudCBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisgIH0KKyAgZWxzZSB7CisgICAgaWYgKCFbc2VsZiB3cml0ZUJ5dGVEaXJlY3Q6MHhmMCB8IGN0eXBlRWxlbWVudCBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisgICAgaWYgKCFbc2VsZiB3cml0ZVZhcmludDMyOihVSW50MzIpc2l6ZSBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFlFUzsKK30KKworLShCT09MKSB3cml0ZVZhcmludDY0OihVSW50NjQpbiBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgVUludDggdmFyaW50NjRvdXRbMTBdID0gezB9OworICBpbnQgaWR4ID0gMDsKKworICB3aGlsZSAodHJ1ZSkgeworICAgIGlmICgobiAmIH4weDdGTCkgPT0gMCkgeworICAgICAgdmFyaW50NjRvdXRbaWR4KytdID0gKFVJbnQ4KW47CisgICAgICBicmVhazsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICB2YXJpbnQ2NG91dFtpZHgrK10gPSAoVUludDgpKChuICYgMHg3RikgfCAweDgwKTsKKyAgICAgIG4gPj49IDc7CisgICAgfQorICB9CisKKyAgaWYgKCFbX3RyYW5zcG9ydCB3cml0ZTp2YXJpbnQ2NG91dCBvZmZzZXQ6MCBsZW5ndGg6aWR4IGVycm9yOmVycm9yXSkgeworICAgIFBST1RPQ09MX1RSQU5TUE9SVF9FUlJPUihOTywgZXJyb3IsIEAiVHJhbnNwb3J0IHdyaXRlIGZhaWxlZCIpOworICB9CisKKyAgcmV0dXJuIFlFUzsKK30KKworLShVSW50MzIpIGkzMlRvWmlnWmFnOihTSW50MzIpbgoreworICAvKgorICAgICBaaWdaYWcgZW5jb2RpbmcgbWFwcyBzaWduZWQgaW50ZWdlcnMgdG8gdW5zaWduZWQgaW50ZWdlcnMgc28gdGhhdAorICAgICBudW1iZXJzIHdpdGggYSBzbWFsbCBhYnNvbHV0ZSB2YWx1ZSAoZm9yIGluc3RhbmNlLCAtMSkgaGF2ZQorICAgICBhIHNtYWxsIHZhcmludCBlbmNvZGVkIHZhbHVlIHRvby4gSXQgZG9lcyB0aGlzIGluIGEgd2F5IHRoYXQKKyAgICAgInppZy16YWdzIiBiYWNrIGFuZCBmb3J0aCB0aHJvdWdoIHRoZSBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgaW50ZWdlcnMsCisgICAgIHNvIHRoYXQgLTEgaXMgZW5jb2RlZCBhcyAxLCAxIGlzIGVuY29kZWQgYXMgMiwgLTIgaXMgZW5jb2RlZCBhcyAzLCBhbmQgc28KKyAgICAgICAgIG9uCisgICAqLworICByZXR1cm4gKFVJbnQzMikobiA8PCAxKSBeIChVSW50MzIpKG4gPj4gMzEpOworfQorCistKFVJbnQ2NCkgaTY0VG9aaWdaYWc6KFNJbnQ2NCluCit7CisgIHJldHVybiAoVUludDY0KShuIDw8IDEpIF4gKFVJbnQ2NCkobiA+PiA2Myk7Cit9CisKKy0oQk9PTCkgcmVhZE1lc3NhZ2VCZWdpblJldHVybmluZ05hbWU6KE5TU3RyaW5nICoqKXBuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOihTSW50MzIgKilwdHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VJRDooU0ludDMyICopcHNlcXVlbmNlSUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFVJbnQ4IHByb3RvY29sSWQ7CisgIGlmICghW3NlbGYgcmVhZEJ5dGU6JnByb3RvY29sSWQgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisKKyAgaWYgKHByb3RvY29sSWQgIT0gQ09NUEFDVF9QUk9UT0NPTF9JRCkgeworICAgIGlmIChlcnJvcikgeworICAgICAgKmVycm9yID0gW05TRXJyb3IgZXJyb3JXaXRoRG9tYWluOlRQcm90b2NvbEVycm9yRG9tYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6VFByb3RvY29sRXJyb3JVbmtub3duCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckluZm86QHtUUHJvdG9jb2xFcnJvckV4dGVuZGVkRXJyb3JLZXk6IEAoVFByb3RvY29sRXh0ZW5kZWRFcnJvck1pc21hdGNoZWRQcm90b2NvbCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xFcnJvckV4cGVjdGVkSWRLZXk6IEAoQ09NUEFDVF9QUk9UT0NPTF9JRCl9XTsKKyAgICB9CisgICAgcmV0dXJuIE5POworICB9CisKKyAgVUludDggdmVyc2lvbkFuZFR5cGU7CisgIGlmICghW3NlbGYgcmVhZEJ5dGU6JnZlcnNpb25BbmRUeXBlIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgIFVJbnQ4IHZlcnNpb24gPSB2ZXJzaW9uQW5kVHlwZSAmIENPTVBBQ1RfVkVSU0lPTl9NQVNLOworICBpZiAodmVyc2lvbiAhPSBDT01QQUNUX1ZFUlNJT04pIHsKKyAgICBpZiAoZXJyb3IpIHsKKyAgICAgICplcnJvciA9IFtOU0Vycm9yIGVycm9yV2l0aERvbWFpbjpUUHJvdG9jb2xFcnJvckRvbWFpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOlRQcm90b2NvbEVycm9yQmFkVmVyc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvOkB7VFByb3RvY29sRXJyb3JFeHBlY3RlZFZlcnNpb25LZXk6IEAoQ09NUEFDVF9WRVJTSU9OKX1dOworICAgIH0KKyAgICByZXR1cm4gTk87CisgIH0KKworICBpbnQgdHlwZSA9ICh2ZXJzaW9uQW5kVHlwZSA+PiBDT01QQUNUX1RZUEVfU0hJRlRfQU1PVU5UKSAmIENPTVBBQ1RfVFlQRV9CSVRTOworICBVSW50MzIgc2VxdWVuY2VJRDsKKyAgaWYgKCFbc2VsZiByZWFkVmFyaW50MzI6JnNlcXVlbmNlSUQgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisgIE5TU3RyaW5nICpuYW1lOworICBpZiAoIVtzZWxmIHJlYWRTdHJpbmc6Jm5hbWUgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisKKyAgaWYgKHB0eXBlICE9IE5VTEwpIHsKKyAgICAqcHR5cGUgPSB0eXBlOworICB9CisgIGlmIChwc2VxdWVuY2VJRCAhPSBOVUxMKSB7CisgICAgKnBzZXF1ZW5jZUlEID0gc2VxdWVuY2VJRDsKKyAgfQorICBpZiAocG5hbWUgIT0gTlVMTCkgeworICAgICpwbmFtZSA9IG5hbWU7CisgIH0KKyAgcmV0dXJuIFlFUzsKK30KKworLShCT09MKSByZWFkU3RydWN0QmVnaW5SZXR1cm5pbmdOYW1lOihOU1N0cmluZyAqKilwbmFtZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgW19sYXN0RmllbGQgYWRkT2JqZWN0OkAoX2xhc3RGaWVsZElkKV07CisgIF9sYXN0RmllbGRJZCA9IDA7CisKKyAgaWYgKHBuYW1lICE9IE5VTEwpIHsKKyAgICAqcG5hbWUgPSBAIiI7CisgIH0KKworICByZXR1cm4gWUVTOworfQorCistKEJPT0wpIHJlYWRTdHJ1Y3RFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIF9sYXN0RmllbGRJZCA9IFtfbGFzdEZpZWxkLmxhc3RPYmplY3Qgc2hvcnRWYWx1ZV07CisgIFtfbGFzdEZpZWxkIHJlbW92ZUxhc3RPYmplY3RdOworICByZXR1cm4gWUVTOworfQorCistKEJPT0wpIHJlYWRGaWVsZEJlZ2luUmV0dXJuaW5nTmFtZTooTlNTdHJpbmcgKiopcG5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOihTSW50MzIgKilwZmllbGRUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRJRDooU0ludDMyICopcGZpZWxkSUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBVSW50OCBieXRlOworICBpZiAoIVtzZWxmIHJlYWRCeXRlOiZieXRlIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgIFVJbnQ4IHR5cGUgPSBieXRlICYgMHgwZjsKKworICAvLyBpZiBpdCdzIGEgc3RvcCwgdGhlbiB3ZSBjYW4gcmV0dXJuIGltbWVkaWF0ZWx5LCBhcyB0aGUgc3RydWN0IGlzIG92ZXIuCisgIGlmICh0eXBlID09IFRDVHlwZV9TVE9QKSB7CisgICAgaWYgKHBuYW1lICE9IE5VTEwpIHsKKyAgICAgICpwbmFtZSA9IEAiIjsKKyAgICB9CisgICAgaWYgKHBmaWVsZFR5cGUgIT0gTlVMTCkgeworICAgICAgKnBmaWVsZFR5cGUgPSBUVHlwZVNUT1A7CisgICAgfQorICAgIGlmIChwZmllbGRJRCAhPSBOVUxMKSB7CisgICAgICAqcGZpZWxkSUQgPSAwOworICAgIH0KKyAgICByZXR1cm4gWUVTOworICB9CisKKyAgc2hvcnQgZmllbGRJZCA9IDA7CisKKyAgLy8gbWFzayBvZmYgdGhlIDQgTVNCIG9mIHRoZSB0eXBlIGhlYWRlci4gaXQgY291bGQgY29udGFpbiBhIGZpZWxkIGlkIGRlbHRhLgorICBzaG9ydCBtb2RpZmllciA9IChieXRlICYgMHhmMCkgPj4gNDsKKyAgaWYgKG1vZGlmaWVyID09IDApIHsKKyAgICAvLyBub3QgYSBkZWx0YS4gbG9vayBhaGVhZCBmb3IgdGhlIHppZ3phZyB2YXJpbnQgZmllbGQgaWQuCisgICAgaWYgKCFbc2VsZiByZWFkSTE2OiZmaWVsZElkIGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKyAgfQorICBlbHNlIHsKKyAgICAvLyBoYXMgYSBkZWx0YS4gYWRkIHRoZSBkZWx0YSB0byB0aGUgbGFzdCBSZWFkIGZpZWxkIGlkLgorICAgIGZpZWxkSWQgPSBfbGFzdEZpZWxkSWQgKyBtb2RpZmllcjsKKyAgfQorCisgIFVJbnQ4IGZpZWxkVHlwZTsKKyAgaWYgKCFbc2VsZiB0dHlwZTomZmllbGRUeXBlIGZvckNvbXBhY3RUeXBlOnR5cGUgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisKKyAgaWYgKHBuYW1lICE9IE5VTEwpIHsKKyAgICAqcG5hbWUgPSBAIiI7CisgIH0KKyAgaWYgKHBmaWVsZFR5cGUgIT0gTlVMTCkgeworICAgICpwZmllbGRUeXBlID0gZmllbGRUeXBlOworICB9CisgIGlmIChwZmllbGRJRCAhPSBOVUxMKSB7CisgICAgKnBmaWVsZElEID0gZmllbGRJZDsKKyAgfQorCisgIC8vIGlmIHRoaXMgaGFwcGVucyB0byBiZSBhIGJvb2xlYW4gZmllbGQsIHRoZSB2YWx1ZSBpcyBlbmNvZGVkIGluIHRoZSB0eXBlCisgIGlmICh0eXBlID09IFRDVHlwZV9CT09MRUFOX1RSVUUgfHwKKyAgICAgIHR5cGUgPT0gVENUeXBlX0JPT0xFQU5fRkFMU0UpCisgIHsKKyAgICAvLyBzYXZlIHRoZSBib29sZWFuIHZhbHVlIGluIGEgc3BlY2lhbCBpbnN0YW5jZSB2YXJpYWJsZS4KKyAgICBfYm9vbGVhblZhbHVlID0gW05TTnVtYmVyIG51bWJlcldpdGhCb29sOnR5cGUgPT0gVENUeXBlX0JPT0xFQU5fVFJVRV07CisgIH0KKworICAvLyBwdXNoIHRoZSBuZXcgZmllbGQgb250byB0aGUgZmllbGQgc3RhY2sgc28gd2UgY2FuIGtlZXAgdGhlIGRlbHRhcyBnb2luZy4KKyAgX2xhc3RGaWVsZElkID0gZmllbGRJZDsKKworICByZXR1cm4gWUVTOworfQorCistKEJPT0wpIHJlYWRNYXBCZWdpblJldHVybmluZ0tleVR5cGU6KFNJbnQzMiAqKXBrZXlUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVR5cGU6KFNJbnQzMiAqKXB2YWx1ZVR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTooU0ludDMyICopcHNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgVUludDgga2V5QW5kVmFsdWVUeXBlID0gMDsKKyAgVUludDMyIHNpemU7CisgIGlmICghW3NlbGYgcmVhZFZhcmludDMyOiZzaXplIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorICBpZiAoc2l6ZSAhPSAwKSB7CisgICAgaWYgKCFbc2VsZiByZWFkQnl0ZToma2V5QW5kVmFsdWVUeXBlIGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKyAgfQorCisgIFVJbnQ4IGtleVR5cGU7CisgIGlmICghW3NlbGYgdHR5cGU6JmtleVR5cGUgZm9yQ29tcGFjdFR5cGU6a2V5QW5kVmFsdWVUeXBlID4+IDQgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisKKyAgVUludDggdmFsdWVUeXBlOworICBpZiAoIVtzZWxmIHR0eXBlOiZ2YWx1ZVR5cGUgZm9yQ29tcGFjdFR5cGU6a2V5QW5kVmFsdWVUeXBlICYgMHhmIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgIGlmIChwa2V5VHlwZSAhPSBOVUxMKSB7CisgICAgKnBrZXlUeXBlID0ga2V5VHlwZTsKKyAgfQorICBpZiAocHZhbHVlVHlwZSAhPSBOVUxMKSB7CisgICAgKnB2YWx1ZVR5cGUgPSB2YWx1ZVR5cGU7CisgIH0KKyAgaWYgKHBzaXplICE9IE5VTEwpIHsKKyAgICAqcHNpemUgPSBzaXplOworICB9CisKKyAgcmV0dXJuIFlFUzsKK30KKworLShCT09MKSByZWFkTGlzdEJlZ2luUmV0dXJuaW5nRWxlbWVudFR5cGU6KFNJbnQzMiAqKXBlbGVtZW50VHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6KFNJbnQzMiAqKXBzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgVUludDggc2l6ZUFuZFR5cGU7CisgIGlmICghW3NlbGYgcmVhZEJ5dGU6JnNpemVBbmRUeXBlIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgIFVJbnQzMiBzaXplID0gKHNpemVBbmRUeXBlID4+IDQpICYgMHgwZjsKKyAgaWYgKHNpemUgPT0gMTUpIHsKKyAgICBpZiAoIVtzZWxmIHJlYWRWYXJpbnQzMjomc2l6ZSBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisgIH0KKworICBVSW50OCBlbGVtZW50VHlwZTsKKyAgaWYgKCFbc2VsZiB0dHlwZTomZWxlbWVudFR5cGUgZm9yQ29tcGFjdFR5cGU6c2l6ZUFuZFR5cGUgJiAweDBmIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgIGlmIChwZWxlbWVudFR5cGUgIT0gTlVMTCkgeworICAgICpwZWxlbWVudFR5cGUgPSBlbGVtZW50VHlwZTsKKyAgfQorICBpZiAocHNpemUgIT0gTlVMTCkgeworICAgICpwc2l6ZSA9IHNpemU7CisgIH0KKworICByZXR1cm4gWUVTOworfQorCistKEJPT0wpIHJlYWRTZXRCZWdpblJldHVybmluZ0VsZW1lbnRUeXBlOihTSW50MzIgKilwZWxlbWVudFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6KFNJbnQzMiAqKXBzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW3NlbGYgcmVhZExpc3RCZWdpblJldHVybmluZ0VsZW1lbnRUeXBlOnBlbGVtZW50VHlwZSBzaXplOnBzaXplIGVycm9yOmVycm9yXTsKK30KKworLShCT09MKSByZWFkQm9vbDooQk9PTCAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBpZiAoX2Jvb2xlYW5WYWx1ZSAhPSBuaWwpIHsKKworICAgIEJPT0wgcmVzdWx0ID0gX2Jvb2xlYW5WYWx1ZS5ib29sVmFsdWU7CisgICAgX2Jvb2xlYW5WYWx1ZSA9IG5pbDsKKworICAgICp2YWx1ZSA9IHJlc3VsdDsKKyAgfQorICBlbHNlIHsKKworICAgIFVJbnQ4IHJlc3VsdDsKKyAgICBpZiAoIVtzZWxmIHJlYWRCeXRlOiZyZXN1bHQgZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorCisgICAgKnZhbHVlID0gcmVzdWx0ID09IFRDVHlwZV9CT09MRUFOX1RSVUU7CisgIH0KKworICByZXR1cm4gWUVTOworfQorCistKEJPT0wpIHJlYWRCeXRlOihVSW50OCAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBpZiAoIVtfdHJhbnNwb3J0IHJlYWRBbGw6dmFsdWUgb2Zmc2V0OjAgbGVuZ3RoOjEgZXJyb3I6ZXJyb3JdKSB7CisgICAgUFJPVE9DT0xfVFJBTlNQT1JUX0VSUk9SKE5PLCBlcnJvciwgQCJUcmFuc3BvcnQgcmVhZCBmYWlsZWQiKTsKKyAgfQorICByZXR1cm4gWUVTOworfQorCistKEJPT0wpIHJlYWRJMTY6KFNJbnQxNiAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBVSW50MzIgdjsKKyAgaWYgKCFbc2VsZiByZWFkVmFyaW50MzI6JnYgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisKKyAgaWYgKHZhbHVlKSB7CisgICAgKnZhbHVlID0gKFNJbnQxNilbc2VsZiB6aWdaYWdUb2kzMjp2XTsKKyAgfQorCisgIHJldHVybiBZRVM7Cit9CisKKy0oQk9PTCkgcmVhZEkzMjooU0ludDMyICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFVJbnQzMiB2OworICBpZiAoIVtzZWxmIHJlYWRWYXJpbnQzMjomdiBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKworICBpZiAodmFsdWUpIHsKKyAgICAqdmFsdWUgPSBbc2VsZiB6aWdaYWdUb2kzMjp2XTsKKyAgfQorCisgIHJldHVybiBZRVM7Cit9CisKKy0oQk9PTCkgcmVhZEk2NDooU0ludDY0ICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFVJbnQ2NCB2OworICBpZiAoIVtzZWxmIHJlYWRWYXJpbnQ2NDomdiBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKworICBpZiAodmFsdWUpIHsKKyAgICAqdmFsdWUgPSBbc2VsZiB6aWdaYWdUb2k2NDp2XTsKKyAgfQorCisgIHJldHVybiBZRVM7Cit9CisKKy0oQk9PTCkgcmVhZERvdWJsZTooZG91YmxlICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFVJbnQ2NCBiaXRzOworICBpZiAoIVtfdHJhbnNwb3J0IHJlYWRBbGw6KFVJbnQ4ICopJmJpdHMgb2Zmc2V0OjAgbGVuZ3RoOjggZXJyb3I6ZXJyb3JdKSB7CisgICAgUFJPVE9DT0xfVFJBTlNQT1JUX0VSUk9SKE5PLCBlcnJvciwgQCJUcmFuc3BvcnQgcmVhZCBmYWlsZWQiKTsKKyAgfQorCisgIGJpdHMgPSBPU1N3YXBMaXR0bGVUb0hvc3RJbnQ2NChiaXRzKTsKKworICBpZiAodmFsdWUpIHsKKyAgICBtZW1jcHkodmFsdWUsICZiaXRzLCBzaXplb2YoYml0cykpOworICB9CisKKyAgcmV0dXJuIFlFUzsKK30KKworLShCT09MKSByZWFkU3RyaW5nOihOU1N0cmluZyAqX19hdXRvcmVsZWFzaW5nICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFVJbnQzMiBsZW5ndGg7CisgIGlmICghW3NlbGYgcmVhZFZhcmludDMyOiZsZW5ndGggZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisKKyAgTlNTdHJpbmcgKnJlc3VsdDsKKworICBpZiAobGVuZ3RoICE9IDApIHsKKworICAgIE5TRGF0YSAqZGF0YTsKKyAgICBpZiAoIVtzZWxmIHJlYWRCaW5hcnlPZkxlbmd0aDpsZW5ndGggZGF0YTomZGF0YSBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisKKyAgICByZXN1bHQgPSBbW05TU3RyaW5nIGFsbG9jXSBpbml0V2l0aERhdGE6ZGF0YQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZzpOU1VURjhTdHJpbmdFbmNvZGluZ107CisgIH0KKyAgZWxzZSB7CisgICAgcmVzdWx0ID0gQCIiOworICB9CisKKyAgaWYgKHZhbHVlKSB7CisgICAgKnZhbHVlID0gcmVzdWx0OworICB9CisKKyAgcmV0dXJuIFlFUzsKK30KKworLShCT09MKSByZWFkQmluYXJ5OihOU0RhdGEgKl9fYXV0b3JlbGVhc2luZyAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBVSW50MzIgbGVuZ3RoOworICBpZiAoIVtzZWxmIHJlYWRWYXJpbnQzMjombGVuZ3RoIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgIHJldHVybiBbc2VsZiByZWFkQmluYXJ5T2ZMZW5ndGg6bGVuZ3RoIGRhdGE6dmFsdWUgZXJyb3I6ZXJyb3JdOworfQorCistKEJPT0wpIHJlYWRCaW5hcnlPZkxlbmd0aDooVUludDMyKWxlbmd0aCBkYXRhOihOU0RhdGEgKl9fYXV0b3JlbGVhc2luZyAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBOU0RhdGEgKnJlc3VsdDsKKworICBpZiAobGVuZ3RoICE9IDApIHsKKworICAgIE5TTXV0YWJsZURhdGEgKmJ1ZiA9IFtOU011dGFibGVEYXRhIGRhdGFXaXRoTGVuZ3RoOmxlbmd0aF07CisgICAgaWYgKCFbX3RyYW5zcG9ydCByZWFkQWxsOmJ1Zi5tdXRhYmxlQnl0ZXMgb2Zmc2V0OjAgbGVuZ3RoOmxlbmd0aCBlcnJvcjplcnJvcl0pIHsKKyAgICAgIFBST1RPQ09MX1RSQU5TUE9SVF9FUlJPUihOTywgZXJyb3IsIEAiVHJhbnNwb3J0IHJlYWQgZmFpbGVkIik7CisgICAgfQorCisgICAgcmVzdWx0ID0gYnVmOworICB9CisgIGVsc2UgeworCisgICAgcmVzdWx0ID0gW05TRGF0YSBkYXRhXTsKKworICB9CisKKyAgaWYgKHZhbHVlKSB7CisgICAgKnZhbHVlID0gcmVzdWx0OworICB9CisKKyAgcmV0dXJuIFlFUzsKK30KKworLShCT09MKSByZWFkTWVzc2FnZUVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFlFUzsKK30KKy0oQk9PTCkgcmVhZEZpZWxkRW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gWUVTOworfQorLShCT09MKSByZWFkTWFwRW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gWUVTOworfQorLShCT09MKSByZWFkTGlzdEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFlFUzsKK30KKy0oQk9PTCkgcmVhZFNldEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFlFUzsKK30KKworLShCT09MKSByZWFkVmFyaW50MzI6KFVJbnQzMiAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBVSW50MzIgcmVzdWx0ID0gMDsKKyAgaW50IHNoaWZ0ID0gMDsKKworICB3aGlsZSAodHJ1ZSkgeworCisgICAgVUludDggYnl0ZTsKKyAgICBpZiAoIVtzZWxmIHJlYWRCeXRlOiZieXRlIGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKworICAgIHJlc3VsdCB8PSAoVUludDMyKShieXRlICYgMHg3ZikgPDwgc2hpZnQ7CisgICAgaWYgKCEoYnl0ZSAmIDB4ODApKSB7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBzaGlmdCArPSA3OworICB9CisKKyAgaWYgKHZhbHVlKSB7CisgICAgKnZhbHVlID0gcmVzdWx0OworICB9CisKKyAgcmV0dXJuIFlFUzsKK30KKworLShCT09MKSByZWFkVmFyaW50NjQ6KFVJbnQ2NCAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBpbnQgc2hpZnQgPSAwOworICBVSW50NjQgcmVzdWx0ID0gMDsKKworICB3aGlsZSAodHJ1ZSkgeworCisgICAgVUludDggYnl0ZTsKKyAgICBpZiAoIVtzZWxmIHJlYWRCeXRlOiZieXRlIGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKworICAgIHJlc3VsdCB8PSAoVUludDY0KShieXRlICYgMHg3ZikgPDwgc2hpZnQ7CisgICAgaWYgKCEoYnl0ZSAmIDB4ODApKSB7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBzaGlmdCArPSA3OworICB9CisKKyAgaWYgKHZhbHVlKSB7CisgICAgKnZhbHVlID0gcmVzdWx0OworICB9CisKKyAgcmV0dXJuIFlFUzsKK30KKworLShTSW50MzIpIHppZ1phZ1RvaTMyOihVSW50MzIpbgoreworICByZXR1cm4gKFNJbnQzMikobiA+PiAxKSBeICgtKFNJbnQzMikobiAmIDEpKTsKK30KKworLShTSW50NjQpIHppZ1phZ1RvaTY0OihVSW50NjQpbgoreworICByZXR1cm4gKFNJbnQ2NCkobiA+PiAxKSBeICgtKFNJbnQ2NCkobiAmIDEpKTsKK30KKworLShCT09MKSB0dHlwZTooVUludDggKil0dHlwZSBmb3JDb21wYWN0VHlwZTooVUludDgpY3R5cGUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHN3aXRjaCAoY3R5cGUgJiAweDBmKSB7CisgIGNhc2UgVENUeXBlX1NUT1A6CisgICAgKnR0eXBlID0gVFR5cGVTVE9QOworICAgIHJldHVybiBZRVM7CisKKyAgY2FzZSBUQ1R5cGVfQk9PTEVBTl9GQUxTRToKKyAgY2FzZSBUQ1R5cGVfQk9PTEVBTl9UUlVFOgorICAgICp0dHlwZSA9IFRUeXBlQk9PTDsKKyAgICByZXR1cm4gWUVTOworCisgIGNhc2UgVENUeXBlX0JZVEU6CisgICAgKnR0eXBlID0gVFR5cGVCWVRFOworICAgIHJldHVybiBZRVM7CisKKyAgY2FzZSBUQ1R5cGVfSTE2OgorICAgICp0dHlwZSA9IFRUeXBlSTE2OworICAgIHJldHVybiBZRVM7CisKKyAgY2FzZSBUQ1R5cGVfSTMyOgorICAgICp0dHlwZSA9IFRUeXBlSTMyOworICAgIHJldHVybiBZRVM7CisKKyAgY2FzZSBUQ1R5cGVfSTY0OgorICAgICp0dHlwZSA9IFRUeXBlSTY0OworICAgIHJldHVybiBZRVM7CisKKyAgY2FzZSBUQ1R5cGVfRE9VQkxFOgorICAgICp0dHlwZSA9IFRUeXBlRE9VQkxFOworICAgIHJldHVybiBZRVM7CisKKyAgY2FzZSBUQ1R5cGVfQklOQVJZOgorICAgICp0dHlwZSA9IFRUeXBlU1RSSU5HOworICAgIHJldHVybiBZRVM7CisKKyAgY2FzZSBUQ1R5cGVfTElTVDoKKyAgICAqdHR5cGUgPSBUVHlwZUxJU1Q7CisgICAgcmV0dXJuIFlFUzsKKworICBjYXNlIFRDVHlwZV9TRVQ6CisgICAgKnR0eXBlID0gVFR5cGVTRVQ7CisgICAgcmV0dXJuIFlFUzsKKworICBjYXNlIFRDVHlwZV9NQVA6CisgICAgKnR0eXBlID0gVFR5cGVNQVA7CisgICAgcmV0dXJuIFlFUzsKKworICBjYXNlIFRDVHlwZV9TVFJVQ1Q6CisgICAgKnR0eXBlID0gVFR5cGVTVFJVQ1Q7CisgICAgcmV0dXJuIFlFUzsKKworICBkZWZhdWx0OgorICAgIGlmIChlcnJvcikgeworICAgICAgKmVycm9yID0gW05TRXJyb3IgZXJyb3JXaXRoRG9tYWluOlRQcm90b2NvbEVycm9yRG9tYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6VFByb3RvY29sRXJyb3JVbmtub3duCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckluZm86QHtUUHJvdG9jb2xFcnJvclR5cGVLZXk6IEAoKFVJbnQ4KShjdHlwZSAmIDB4MEYpKX1dOworICAgIH0KKyAgICByZXR1cm4gTk87CisgIH0KK30KKworLShVSW50OCkgY29tcGFjdFR5cGVGb3JUVHlwZTooVUludDgpdHR5cGUKK3sKKyAgc3RhdGljIFVJbnQ4IHR0eXBlVG9Db21wYWN0VHlwZVtdID0geworICAgIFtUVHlwZVNUT1BdID0gVENUeXBlX1NUT1AsCisgICAgW1RUeXBlQk9PTF0gPSBUQ1R5cGVfQk9PTEVBTl9GQUxTRSwKKyAgICBbVFR5cGVCWVRFXSA9IFRDVHlwZV9CWVRFLAorICAgIFtUVHlwZURPVUJMRV0gPSBUQ1R5cGVfRE9VQkxFLAorICAgIFtUVHlwZUkxNl0gPSBUQ1R5cGVfSTE2LAorICAgIFtUVHlwZUkzMl0gPSBUQ1R5cGVfSTMyLAorICAgIFtUVHlwZUk2NF0gPSBUQ1R5cGVfSTY0LAorICAgIFtUVHlwZVNUUklOR10gPSBUQ1R5cGVfQklOQVJZLAorICAgIFtUVHlwZVNUUlVDVF0gPSBUQ1R5cGVfU1RSVUNULAorICAgIFtUVHlwZU1BUF0gPSBUQ1R5cGVfTUFQLAorICAgIFtUVHlwZVNFVF0gPSBUQ1R5cGVfU0VULAorICAgIFtUVHlwZUxJU1RdID0gVENUeXBlX0xJU1QKKyAgfTsKKworICByZXR1cm4gdHR5cGVUb0NvbXBhY3RUeXBlW3R0eXBlXTsKK30KKworQGVuZApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5oIGIvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5oCmluZGV4IGYyOTg0NTkuLmI4Y2UzNjEgMTAwNjQ0Ci0tLSBhL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wuaAorKysgYi9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLmgKQEAgLTIxLDEzICsyMSwxOCBAQAogCiAjaW1wb3J0ICJUUHJvdG9jb2xEZWNvcmF0b3IuaCIKIAotRk9VTkRBVElPTl9FWFBPUlQgTlNTdHJpbmcgKmNvbnN0IE1VTFRJUExFWEVEX1NFUlZJQ0VfU0VQRVJBVE9SOworTlNfQVNTVU1FX05PTk5VTExfQkVHSU4KIAotQGludGVyZmFjZSBUTXVsdGlwbGV4ZWRQcm90b2NvbCA6IFRQcm90b2NvbERlY29yYXRvciB7Ci0gICAgTlNTdHJpbmcgKiBtU2VydmljZU5hbWU7Ci19CiAKLS0gKGlkKSBpbml0V2l0aFByb3RvY29sOiAoaWQgPFRQcm90b2NvbD4pIHByb3RvY29sCi0gICAgICAgICAgICBzZXJ2aWNlTmFtZTogKE5TU3RyaW5nICopIG5hbWU7CitleHRlcm4gTlNTdHJpbmcgKlRNdWx0aXBsZXhlZFByb3RvY29sU2VwZXJhdG9yOworCisKK0BpbnRlcmZhY2UgVE11bHRpcGxleGVkUHJvdG9jb2wgOiBUUHJvdG9jb2xEZWNvcmF0b3IKKworLShpZCkgaW5pdFdpdGhQcm90b2NvbDooaWQgPFRQcm90b2NvbD4pcHJvdG9jb2wKKyAgICAgICAgICAgc2VydmljZU5hbWU6KE5TU3RyaW5nICopbmFtZTsKIAogQGVuZAorCisKK05TX0FTU1VNRV9OT05OVUxMX0VORApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wubSBiL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wubQppbmRleCA0OTA5NWUzLi41ODM4YzU3IDEwMDY0NAotLS0gYS9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLm0KKysrIGIvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5tCkBAIC0yMCw0OCArMjAsNDcgQEAKICNpbXBvcnQgIlRNdWx0aXBsZXhlZFByb3RvY29sLmgiCiAKICNpbXBvcnQgIlRQcm90b2NvbC5oIgotI2ltcG9ydCAiVE9iamVjdGl2ZS1DLmgiCiAKLU5TU3RyaW5nICpjb25zdCBNVUxUSVBMRVhFRF9TRVJWSUNFX1NFUEVSQVRPUiA9IEAiOiI7CitOU1N0cmluZyAqVE11bHRpcGxleGVkUHJvdG9jb2xTZXBlcmF0b3IgPSBAIjoiOworCisKK0BpbnRlcmZhY2UgVE11bHRpcGxleGVkUHJvdG9jb2wgKCkKKworQHByb3BlcnR5KHN0cm9uZywgbm9uYXRvbWljKSBOU1N0cmluZyAqc2VydmljZU5hbWU7CisKK0BlbmQKKwogCiBAaW1wbGVtZW50YXRpb24gVE11bHRpcGxleGVkUHJvdG9jb2wKIAotLSAoaWQpIGluaXRXaXRoUHJvdG9jb2w6IChpZCA8VFByb3RvY29sPikgcHJvdG9jb2wKLSAgICAgICAgICAgIHNlcnZpY2VOYW1lOiAoTlNTdHJpbmcgKikgbmFtZQorLShpZCkgaW5pdFdpdGhQcm90b2NvbDooaWQgPFRQcm90b2NvbD4pcHJvdG9jb2wKKyAgICAgICAgICAgc2VydmljZU5hbWU6KE5TU3RyaW5nICopbmFtZQogewotICAgIHNlbGYgPSBbc3VwZXIgaW5pdFdpdGhQcm90b2NvbDpwcm90b2NvbF07Ci0KLSAgICBpZiAoc2VsZikgewotICAgICAgICBtU2VydmljZU5hbWUgPSBbbmFtZSByZXRhaW5fc3R1Yl07Ci0gICAgfQotICAgIHJldHVybiBzZWxmOworICBzZWxmID0gW3N1cGVyIGluaXRXaXRoUHJvdG9jb2w6cHJvdG9jb2xdOworICBpZiAoc2VsZikgeworICAgIF9zZXJ2aWNlTmFtZSA9IG5hbWU7CisgIH0KKyAgcmV0dXJuIHNlbGY7CiB9CiAKLS0gKHZvaWQpIHdyaXRlTWVzc2FnZUJlZ2luV2l0aE5hbWU6IChOU1N0cmluZyAqKSBuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAoaW50KSBtZXNzYWdlVHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VJRDogKGludCkgc2VxdWVuY2VJRAorLShCT09MKSB3cml0ZU1lc3NhZ2VCZWdpbldpdGhOYW1lOihOU1N0cmluZyAqKW5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTooU0ludDMyKW1lc3NhZ2VUeXBlCisgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlSUQ6KFNJbnQzMilzZXF1ZW5jZUlECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gICAgc3dpdGNoIChtZXNzYWdlVHlwZSkgewotICAgICAgICBjYXNlIFRNZXNzYWdlVHlwZV9DQUxMOgotICAgICAgICBjYXNlIFRNZXNzYWdlVHlwZV9PTkVXQVk6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTlNNdXRhYmxlU3RyaW5nICogc2VydmljZUZ1bmN0aW9uID0gW1tOU011dGFibGVTdHJpbmcgYWxsb2NdIGluaXRXaXRoU3RyaW5nOm1TZXJ2aWNlTmFtZV07Ci0gICAgICAgICAgICAgICAgW3NlcnZpY2VGdW5jdGlvbiBhcHBlbmRTdHJpbmc6TVVMVElQTEVYRURfU0VSVklDRV9TRVBFUkFUT1JdOwotICAgICAgICAgICAgICAgIFtzZXJ2aWNlRnVuY3Rpb24gYXBwZW5kU3RyaW5nOm5hbWVdOwotICAgICAgICAgICAgICAgIFtzdXBlciB3cml0ZU1lc3NhZ2VCZWdpbldpdGhOYW1lOnNlcnZpY2VGdW5jdGlvbiB0eXBlOm1lc3NhZ2VUeXBlIHNlcXVlbmNlSUQ6c2VxdWVuY2VJRF07Ci0gICAgICAgICAgICAgICAgW3NlcnZpY2VGdW5jdGlvbiByZWxlYXNlX3N0dWJdOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBbc3VwZXIgd3JpdGVNZXNzYWdlQmVnaW5XaXRoTmFtZTpuYW1lIHR5cGU6bWVzc2FnZVR5cGUgc2VxdWVuY2VJRDpzZXF1ZW5jZUlEXTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLX0KKyAgc3dpdGNoIChtZXNzYWdlVHlwZSkgeworICBjYXNlIFRNZXNzYWdlVHlwZUNBTEw6CisgIGNhc2UgVE1lc3NhZ2VUeXBlT05FV0FZOiB7CisgICAgTlNNdXRhYmxlU3RyaW5nICpzZXJ2aWNlRnVuY3Rpb24gPSBbW05TTXV0YWJsZVN0cmluZyBhbGxvY10gaW5pdFdpdGhTdHJpbmc6X3NlcnZpY2VOYW1lXTsKKyAgICBbc2VydmljZUZ1bmN0aW9uIGFwcGVuZFN0cmluZzpUTXVsdGlwbGV4ZWRQcm90b2NvbFNlcGVyYXRvcl07CisgICAgW3NlcnZpY2VGdW5jdGlvbiBhcHBlbmRTdHJpbmc6bmFtZV07CisgICAgcmV0dXJuIFtzdXBlciB3cml0ZU1lc3NhZ2VCZWdpbldpdGhOYW1lOnNlcnZpY2VGdW5jdGlvbiB0eXBlOm1lc3NhZ2VUeXBlIHNlcXVlbmNlSUQ6c2VxdWVuY2VJRCBlcnJvcjplcnJvcl07CisgIH0KKyAgYnJlYWs7CiAKLS0gKHZvaWQpIGRlYWxsb2MKLXsKLSAgICBbbVNlcnZpY2VOYW1lIHJlbGVhc2Vfc3R1Yl07Ci0gICAgW3N1cGVyIGRlYWxsb2Nfc3R1Yl07CisgIGRlZmF1bHQ6CisgICAgcmV0dXJuIFtzdXBlciB3cml0ZU1lc3NhZ2VCZWdpbldpdGhOYW1lOm5hbWUgdHlwZTptZXNzYWdlVHlwZSBzZXF1ZW5jZUlEOnNlcXVlbmNlSUQgZXJyb3I6ZXJyb3JdOworICB9CiB9CiAKIEBlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVFByb3RvY29sLmggYi9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbC5oCmluZGV4IDI4MTIzOWQuLjg0MTA1OWYgMTAwNjQ0Ci0tLSBhL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVFByb3RvY29sLmgKKysrIGIvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2wuaApAQCAtMjIsMTI3ICsyMiwxNDMgQEAKICNpbXBvcnQgIlRUcmFuc3BvcnQuaCIKIAogCi1lbnVtIHsKLSAgVE1lc3NhZ2VUeXBlX0NBTEwgPSAxLAotICBUTWVzc2FnZVR5cGVfUkVQTFkgPSAyLAotICBUTWVzc2FnZVR5cGVfRVhDRVBUSU9OID0gMywKLSAgVE1lc3NhZ2VUeXBlX09ORVdBWSA9IDQKK05TX0FTU1VNRV9OT05OVUxMX0JFR0lOCisKKwordHlwZWRlZiBOU19FTlVNIChpbnQsIFRNZXNzYWdlVHlwZSkgeworICBUTWVzc2FnZVR5cGVDQUxMID0gMSwKKyAgVE1lc3NhZ2VUeXBlUkVQTFkgPSAyLAorICBUTWVzc2FnZVR5cGVFWENFUFRJT04gPSAzLAorICBUTWVzc2FnZVR5cGVPTkVXQVkgPSA0CiB9OwogCi1lbnVtIHsKLSAgVFR5cGVfU1RPUCAgID0gMCwKLSAgVFR5cGVfVk9JRCAgID0gMSwKLSAgVFR5cGVfQk9PTCAgID0gMiwKLSAgVFR5cGVfQllURSAgID0gMywKLSAgVFR5cGVfRE9VQkxFID0gNCwKLSAgVFR5cGVfSTE2ICAgID0gNiwKLSAgVFR5cGVfSTMyICAgID0gOCwKLSAgVFR5cGVfSTY0ICAgID0gMTAsCi0gIFRUeXBlX1NUUklORyA9IDExLAotICBUVHlwZV9TVFJVQ1QgPSAxMiwKLSAgVFR5cGVfTUFQICAgID0gMTMsCi0gIFRUeXBlX1NFVCAgICA9IDE0LAotICBUVHlwZV9MSVNUICAgPSAxNQordHlwZWRlZiBOU19FTlVNIChpbnQsIFRUeXBlKSB7CisgIFRUeXBlU1RPUCAgID0gMCwKKyAgVFR5cGVWT0lEICAgPSAxLAorICBUVHlwZUJPT0wgICA9IDIsCisgIFRUeXBlQllURSAgID0gMywKKyAgVFR5cGVET1VCTEUgPSA0LAorICBUVHlwZUkxNiAgICA9IDYsCisgIFRUeXBlSTMyICAgID0gOCwKKyAgVFR5cGVJNjQgICAgPSAxMCwKKyAgVFR5cGVTVFJJTkcgPSAxMSwKKyAgVFR5cGVTVFJVQ1QgPSAxMiwKKyAgVFR5cGVNQVAgICAgPSAxMywKKyAgVFR5cGVTRVQgICAgPSAxNCwKKyAgVFR5cGVMSVNUICAgPSAxNQogfTsKIAogCiBAcHJvdG9jb2wgVFByb3RvY29sIDxOU09iamVjdD4KIAotLSAoaWQgPFRUcmFuc3BvcnQ+KSB0cmFuc3BvcnQ7CistKGlkIDxUVHJhbnNwb3J0PikgdHJhbnNwb3J0OwogCi0tICh2b2lkKSByZWFkTWVzc2FnZUJlZ2luUmV0dXJuaW5nTmFtZTogKE5TU3RyaW5nICoqKSBuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogKGludCAqKSB0eXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VJRDogKGludCAqKSBzZXF1ZW5jZUlEOwotLSAodm9pZCkgcmVhZE1lc3NhZ2VFbmQ7CistKEJPT0wpIHJlYWRNZXNzYWdlQmVnaW5SZXR1cm5pbmdOYW1lOihOU1N0cmluZyAqX19udWxsYWJsZSBfX2F1dG9yZWxlYXNpbmcgKl9fbnVsbGFibGUpbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZToobnVsbGFibGUgU0ludDMyICopdHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VJRDoobnVsbGFibGUgU0ludDMyICopc2VxdWVuY2VJRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CistKEJPT0wpIHJlYWRNZXNzYWdlRW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcjsKIAotLSAodm9pZCkgcmVhZFN0cnVjdEJlZ2luUmV0dXJuaW5nTmFtZTogKE5TU3RyaW5nICoqKSBuYW1lOwotLSAodm9pZCkgcmVhZFN0cnVjdEVuZDsKKy0oQk9PTCkgcmVhZFN0cnVjdEJlZ2luUmV0dXJuaW5nTmFtZTooTlNTdHJpbmcgKl9fbnVsbGFibGUgX19hdXRvcmVsZWFzaW5nICpfX251bGxhYmxlKW5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CistKEJPT0wpIHJlYWRTdHJ1Y3RFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOwogCi0tICh2b2lkKSByZWFkRmllbGRCZWdpblJldHVybmluZ05hbWU6IChOU1N0cmluZyAqKikgbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAoaW50ICopIGZpZWxkVHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZElEOiAoaW50ICopIGZpZWxkSUQ7Ci0tICh2b2lkKSByZWFkRmllbGRFbmQ7CistKEJPT0wpIHJlYWRGaWVsZEJlZ2luUmV0dXJuaW5nTmFtZTooTlNTdHJpbmcgKl9fbnVsbGFibGUgX19hdXRvcmVsZWFzaW5nICpfX251bGxhYmxlKW5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOihTSW50MzIgKilmaWVsZFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZElEOihudWxsYWJsZSBTSW50MzIgKilmaWVsZElECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CistKEJPT0wpIHJlYWRGaWVsZEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CiAKLS0gKE5TU3RyaW5nICopIHJlYWRTdHJpbmc7CistKEJPT0wpIHJlYWRTdHJpbmc6KE5TU3RyaW5nICpfX25vbm51bGwgX19hdXRvcmVsZWFzaW5nICpfX25vbm51bGwpdmFsdWUgZXJyb3I6KE5TRXJyb3IgKiopZXJyb3I7CiAKLS0gKEJPT0wpIHJlYWRCb29sOworLShCT09MKSByZWFkQm9vbDooQk9PTCAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcjsKIAotLSAodW5zaWduZWQgY2hhcikgcmVhZEJ5dGU7CistKEJPT0wpIHJlYWRCeXRlOihVSW50OCAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcjsKIAotLSAoc2hvcnQpIHJlYWRJMTY7CistKEJPT0wpIHJlYWRJMTY6KFNJbnQxNiAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcjsKIAotLSAoaW50MzJfdCkgcmVhZEkzMjsKKy0oQk9PTCkgcmVhZEkzMjooU0ludDMyICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOwogCi0tIChpbnQ2NF90KSByZWFkSTY0OworLShCT09MKSByZWFkSTY0OihTSW50NjQgKil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CiAKLS0gKGRvdWJsZSkgcmVhZERvdWJsZTsKKy0oQk9PTCkgcmVhZERvdWJsZTooZG91YmxlICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOwogCi0tIChOU0RhdGEgKikgcmVhZEJpbmFyeTsKKy0oQk9PTCkgcmVhZEJpbmFyeTooTlNEYXRhICpfX25vbm51bGwgX19hdXRvcmVsZWFzaW5nICpfX25vbm51bGwpdmFsdWUgZXJyb3I6KE5TRXJyb3IgKiopZXJyb3I7CiAKLS0gKHZvaWQpIHJlYWRNYXBCZWdpblJldHVybmluZ0tleVR5cGU6IChpbnQgKikga2V5VHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlVHlwZTogKGludCAqKSB2YWx1ZVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IChpbnQgKikgc2l6ZTsKLS0gKHZvaWQpIHJlYWRNYXBFbmQ7CistKEJPT0wpIHJlYWRNYXBCZWdpblJldHVybmluZ0tleVR5cGU6KG51bGxhYmxlIFNJbnQzMiAqKWtleVR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlVHlwZToobnVsbGFibGUgU0ludDMyICopdmFsdWVUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6KFNJbnQzMiAqKXNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CistKEJPT0wpIHJlYWRNYXBFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOwogCiAKLS0gKHZvaWQpIHJlYWRTZXRCZWdpblJldHVybmluZ0VsZW1lbnRUeXBlOiAoaW50ICopIGVsZW1lbnRUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogKGludCAqKSBzaXplOwotLSAodm9pZCkgcmVhZFNldEVuZDsKKy0oQk9PTCkgcmVhZFNldEJlZ2luUmV0dXJuaW5nRWxlbWVudFR5cGU6KG51bGxhYmxlIFNJbnQzMiAqKWVsZW1lbnRUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOihTSW50MzIgKilzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcjsKKy0oQk9PTCkgcmVhZFNldEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CiAKIAotLSAodm9pZCkgcmVhZExpc3RCZWdpblJldHVybmluZ0VsZW1lbnRUeXBlOiAoaW50ICopIGVsZW1lbnRUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IChpbnQgKikgc2l6ZTsKLS0gKHZvaWQpIHJlYWRMaXN0RW5kOworLShCT09MKSByZWFkTGlzdEJlZ2luUmV0dXJuaW5nRWxlbWVudFR5cGU6KG51bGxhYmxlIFNJbnQzMiAqKWVsZW1lbnRUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTooU0ludDMyICopc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOworLShCT09MKSByZWFkTGlzdEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CiAKIAotLSAodm9pZCkgd3JpdGVNZXNzYWdlQmVnaW5XaXRoTmFtZTogKE5TU3RyaW5nICopIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IChpbnQpIG1lc3NhZ2VUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZUlEOiAoaW50KSBzZXF1ZW5jZUlEOwotLSAodm9pZCkgd3JpdGVNZXNzYWdlRW5kOworLShCT09MKSB3cml0ZU1lc3NhZ2VCZWdpbldpdGhOYW1lOihOU1N0cmluZyAqKW5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTooU0ludDMyKW1lc3NhZ2VUeXBlCisgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlSUQ6KFNJbnQzMilzZXF1ZW5jZUlECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOworLShCT09MKSB3cml0ZU1lc3NhZ2VFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOwogCi0tICh2b2lkKSB3cml0ZVN0cnVjdEJlZ2luV2l0aE5hbWU6IChOU1N0cmluZyAqKSBuYW1lOwotLSAodm9pZCkgd3JpdGVTdHJ1Y3RFbmQ7CistKEJPT0wpIHdyaXRlU3RydWN0QmVnaW5XaXRoTmFtZTooTlNTdHJpbmcgKiluYW1lIGVycm9yOihOU0Vycm9yICoqKWVycm9yOworLShCT09MKSB3cml0ZVN0cnVjdEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CiAKLS0gKHZvaWQpIHdyaXRlRmllbGRCZWdpbldpdGhOYW1lOiAoTlNTdHJpbmcgKikgbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IChpbnQpIGZpZWxkVHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkSUQ6IChpbnQpIGZpZWxkSUQ7CistKEJPT0wpIHdyaXRlRmllbGRCZWdpbldpdGhOYW1lOihOU1N0cmluZyAqKW5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6KFNJbnQzMilmaWVsZFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkSUQ6KFNJbnQzMilmaWVsZElECisgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcjsKIAotLSAodm9pZCkgd3JpdGVJMzI6IChpbnQzMl90KSB2YWx1ZTsKKy0oQk9PTCkgd3JpdGVJMzI6KFNJbnQzMil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CiAKLS0gKHZvaWQpIHdyaXRlSTY0OiAoaW50NjRfdCkgdmFsdWU7CistKEJPT0wpIHdyaXRlSTY0OihTSW50NjQpdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOwogCi0tICh2b2lkKSB3cml0ZUkxNjogKHNob3J0KSB2YWx1ZTsKKy0oQk9PTCkgd3JpdGVJMTY6KHNob3J0KXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcjsKIAotLSAodm9pZCkgd3JpdGVCeXRlOiAodWludDhfdCkgdmFsdWU7CistKEJPT0wpIHdyaXRlQnl0ZTooVUludDgpdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOwogCi0tICh2b2lkKSB3cml0ZVN0cmluZzogKE5TU3RyaW5nICopIHZhbHVlOworLShCT09MKSB3cml0ZVN0cmluZzooTlNTdHJpbmcgKil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CiAKLS0gKHZvaWQpIHdyaXRlRG91YmxlOiAoZG91YmxlKSB2YWx1ZTsKKy0oQk9PTCkgd3JpdGVEb3VibGU6KGRvdWJsZSl2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CiAKLS0gKHZvaWQpIHdyaXRlQm9vbDogKEJPT0wpIHZhbHVlOworLShCT09MKSB3cml0ZUJvb2w6KEJPT0wpdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOwogCi0tICh2b2lkKSB3cml0ZUJpbmFyeTogKE5TRGF0YSAqKSBkYXRhOworLShCT09MKSB3cml0ZUJpbmFyeTooTlNEYXRhICopZGF0YSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CiAKLS0gKHZvaWQpIHdyaXRlRmllbGRTdG9wOworLShCT09MKSB3cml0ZUZpZWxkU3RvcDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CiAKLS0gKHZvaWQpIHdyaXRlRmllbGRFbmQ7CistKEJPT0wpIHdyaXRlRmllbGRFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOwogCi0tICh2b2lkKSB3cml0ZU1hcEJlZ2luV2l0aEtleVR5cGU6IChpbnQpIGtleVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlVHlwZTogKGludCkgdmFsdWVUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IChpbnQpIHNpemU7Ci0tICh2b2lkKSB3cml0ZU1hcEVuZDsKKy0oQk9PTCkgd3JpdGVNYXBCZWdpbldpdGhLZXlUeXBlOihTSW50MzIpa2V5VHlwZQorICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVR5cGU6KFNJbnQzMil2YWx1ZVR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOihTSW50MzIpc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOworLShCT09MKSB3cml0ZU1hcEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CiAKIAotLSAodm9pZCkgd3JpdGVTZXRCZWdpbldpdGhFbGVtZW50VHlwZTogKGludCkgZWxlbWVudFR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IChpbnQpIHNpemU7Ci0tICh2b2lkKSB3cml0ZVNldEVuZDsKKy0oQk9PTCkgd3JpdGVTZXRCZWdpbldpdGhFbGVtZW50VHlwZTooU0ludDMyKWVsZW1lbnRUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6KFNJbnQzMilzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOworLShCT09MKSB3cml0ZVNldEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CiAKIAotLSAodm9pZCkgd3JpdGVMaXN0QmVnaW5XaXRoRWxlbWVudFR5cGU6IChpbnQpIGVsZW1lbnRUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogKGludCkgc2l6ZTsKKy0oQk9PTCkgd3JpdGVMaXN0QmVnaW5XaXRoRWxlbWVudFR5cGU6KFNJbnQzMillbGVtZW50VHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTooU0ludDMyKXNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOwogCi0tICh2b2lkKSB3cml0ZUxpc3RFbmQ7CistKEJPT0wpIHdyaXRlTGlzdEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CiAKIAogQGVuZAogCisKK05TX0FTU1VNRV9OT05OVUxMX0VORApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xEZWNvcmF0b3IuaCBiL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLmgKaW5kZXggODI5YmVkNi4uMzY5YjZhMiAxMDA2NDQKLS0tIGEvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xEZWNvcmF0b3IuaAorKysgYi9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5oCkBAIC0yMSwxMCArMjEsMTQgQEAKIAogI2ltcG9ydCAiVFByb3RvY29sLmgiCiAKLUBpbnRlcmZhY2UgVFByb3RvY29sRGVjb3JhdG9yIDogTlNPYmplY3QgPFRQcm90b2NvbD4gewotICAgIGlkPFRQcm90b2NvbD4gbUNvbmNyZXRlUHJvdG9jb2w7Ci19CitOU19BU1NVTUVfTk9OTlVMTF9CRUdJTgogCi0tIChpZCkgaW5pdFdpdGhQcm90b2NvbDogKGlkIDxUUHJvdG9jb2w+KSBwcm90b2NvbDsKKworQGludGVyZmFjZSBUUHJvdG9jb2xEZWNvcmF0b3IgOiBOU09iamVjdCA8VFByb3RvY29sPgorCistKGlkKSBpbml0V2l0aFByb3RvY29sOihpZCA8VFByb3RvY29sPilwcm90b2NvbDsKIAogQGVuZAorCisKK05TX0FTU1VNRV9OT05OVUxMX0VORApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLm0gYi9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5tCmluZGV4IGU1YWNiNmMuLjIxOGY5MDAgMTAwNjQ0Ci0tLSBhL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLm0KKysrIGIvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xEZWNvcmF0b3IubQpAQCAtMTgsMjU3ICsxOCwyNzggQEAKICAqLwogCiAjaW1wb3J0ICJUUHJvdG9jb2xEZWNvcmF0b3IuaCIKLSNpbXBvcnQgIlRPYmplY3RpdmUtQy5oIgorCisKK0BpbnRlcmZhY2UgVFByb3RvY29sRGVjb3JhdG9yICgpCisKK0Bwcm9wZXJ0eShzdHJvbmcsIG5vbmF0b21pYykgaWQ8VFByb3RvY29sPiBjb25jcmV0ZVByb3RvY29sOworCitAZW5kCisKIAogQGltcGxlbWVudGF0aW9uIFRQcm90b2NvbERlY29yYXRvcgogCi0tIChpZCkgaW5pdFdpdGhQcm90b2NvbDogKGlkIDxUUHJvdG9jb2w+KSBwcm90b2NvbAorLShpZCkgaW5pdFdpdGhQcm90b2NvbDooaWQgPFRQcm90b2NvbD4pcHJvdG9jb2wKIHsKLSAgICBzZWxmID0gW3N1cGVyIGluaXRdOwotICAgIGlmIChzZWxmKSB7Ci0gICAgICAgIG1Db25jcmV0ZVByb3RvY29sID0gW3Byb3RvY29sIHJldGFpbl9zdHViXTsKLSAgICB9Ci0gICAgcmV0dXJuIHNlbGY7CisgIHNlbGYgPSBbc3VwZXIgaW5pdF07CisgIGlmIChzZWxmKSB7CisgICAgX2NvbmNyZXRlUHJvdG9jb2wgPSBwcm90b2NvbDsKKyAgfQorICByZXR1cm4gc2VsZjsKIH0KIAotLSAoaWQgPFRUcmFuc3BvcnQ+KSB0cmFuc3BvcnQKKy0oaWQgPFRUcmFuc3BvcnQ+KSB0cmFuc3BvcnQKIHsKLSAgICByZXR1cm4gW21Db25jcmV0ZVByb3RvY29sIHRyYW5zcG9ydF07CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgdHJhbnNwb3J0XTsKIH0KIAotLSAodm9pZCkgcmVhZE1lc3NhZ2VCZWdpblJldHVybmluZ05hbWU6IChOU1N0cmluZyAqKikgbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IChpbnQgKikgdHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlSUQ6IChpbnQgKikgc2VxdWVuY2VJRAorLShCT09MKSByZWFkTWVzc2FnZUJlZ2luUmV0dXJuaW5nTmFtZTooTlNTdHJpbmcgKiopbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTooU0ludDMyICopdHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VJRDooU0ludDMyICopc2VxdWVuY2VJRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgICBbbUNvbmNyZXRlUHJvdG9jb2wgcmVhZE1lc3NhZ2VCZWdpblJldHVybmluZ05hbWU6bmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTp0eXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZUlEOnNlcXVlbmNlSURdOworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHJlYWRNZXNzYWdlQmVnaW5SZXR1cm5pbmdOYW1lOm5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTp0eXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlSUQ6c2VxdWVuY2VJRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOmVycm9yXTsKIH0KIAotLSAodm9pZCkgcmVhZE1lc3NhZ2VFbmQKKy0oQk9PTCkgcmVhZE1lc3NhZ2VFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gICAgW21Db25jcmV0ZVByb3RvY29sIHJlYWRNZXNzYWdlRW5kXTsKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCByZWFkTWVzc2FnZUVuZDplcnJvcl07CiB9CiAKLS0gKHZvaWQpIHJlYWRTdHJ1Y3RCZWdpblJldHVybmluZ05hbWU6IChOU1N0cmluZyAqKikgbmFtZQorLShCT09MKSByZWFkU3RydWN0QmVnaW5SZXR1cm5pbmdOYW1lOihOU1N0cmluZyAqKiluYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gICAgW21Db25jcmV0ZVByb3RvY29sIHJlYWRTdHJ1Y3RCZWdpblJldHVybmluZ05hbWU6bmFtZV07CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgcmVhZFN0cnVjdEJlZ2luUmV0dXJuaW5nTmFtZTpuYW1lIGVycm9yOmVycm9yXTsKIH0KIAotLSAodm9pZCkgcmVhZFN0cnVjdEVuZAorLShCT09MKSByZWFkU3RydWN0RW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICAgIFttQ29uY3JldGVQcm90b2NvbCByZWFkU3RydWN0RW5kXTsKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCByZWFkU3RydWN0RW5kOmVycm9yXTsKIH0KIAotLSAodm9pZCkgcmVhZEZpZWxkQmVnaW5SZXR1cm5pbmdOYW1lOiAoTlNTdHJpbmcgKiopIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogKGludCAqKSBmaWVsZFR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRJRDogKGludCAqKSBmaWVsZElECistKEJPT0wpIHJlYWRGaWVsZEJlZ2luUmV0dXJuaW5nTmFtZTooTlNTdHJpbmcgKiopbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6KFNJbnQzMiAqKWZpZWxkVHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkSUQ6KFNJbnQzMiAqKWZpZWxkSUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICAgIFttQ29uY3JldGVQcm90b2NvbCByZWFkRmllbGRCZWdpblJldHVybmluZ05hbWU6bmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ZmllbGRUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRJRDpmaWVsZElEXTsKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCByZWFkRmllbGRCZWdpblJldHVybmluZ05hbWU6bmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTpmaWVsZFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkSUQ6ZmllbGRJRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjplcnJvcl07CiB9Ci0tICh2b2lkKSByZWFkRmllbGRFbmQKKy0oQk9PTCkgcmVhZEZpZWxkRW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICAgIFttQ29uY3JldGVQcm90b2NvbCByZWFkRmllbGRFbmRdOworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHJlYWRGaWVsZEVuZDplcnJvcl07CiB9CiAKLS0gKE5TU3RyaW5nICopIHJlYWRTdHJpbmcKKy0oQk9PTCkgcmVhZFN0cmluZzooTlNTdHJpbmcgKl9fYXV0b3JlbGVhc2luZyAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICAgIHJldHVybiBbbUNvbmNyZXRlUHJvdG9jb2wgcmVhZFN0cmluZ107CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgcmVhZFN0cmluZzp2YWx1ZSBlcnJvcjplcnJvcl07CiB9CiAKLS0gKEJPT0wpIHJlYWRCb29sCistKEJPT0wpIHJlYWRCb29sOihCT09MICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gICAgcmV0dXJuIFttQ29uY3JldGVQcm90b2NvbCByZWFkQm9vbF07CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgcmVhZEJvb2w6dmFsdWUgZXJyb3I6ZXJyb3JdOwogfQogCi0tICh1bnNpZ25lZCBjaGFyKSByZWFkQnl0ZQorLShCT09MKSByZWFkQnl0ZTooVUludDggKil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgICByZXR1cm4gW21Db25jcmV0ZVByb3RvY29sIHJlYWRCeXRlXTsKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCByZWFkQnl0ZTp2YWx1ZSBlcnJvcjplcnJvcl07CiB9CiAKLS0gKHNob3J0KSByZWFkSTE2CistKEJPT0wpIHJlYWRJMTY6KFNJbnQxNiAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICAgIHJldHVybiBbbUNvbmNyZXRlUHJvdG9jb2wgcmVhZEkxNl07CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgcmVhZEkxNjp2YWx1ZSBlcnJvcjplcnJvcl07CiB9CiAKLS0gKGludDMyX3QpIHJlYWRJMzIKKy0oQk9PTCkgcmVhZEkzMjooU0ludDMyICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gICAgcmV0dXJuIFttQ29uY3JldGVQcm90b2NvbCByZWFkSTMyXTsKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCByZWFkSTMyOnZhbHVlIGVycm9yOmVycm9yXTsKIH0KIAotLSAoaW50NjRfdCkgcmVhZEk2NAorLShCT09MKSByZWFkSTY0OihTSW50NjQgKil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgICByZXR1cm4gW21Db25jcmV0ZVByb3RvY29sIHJlYWRJNjRdOworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHJlYWRJNjQ6dmFsdWUgZXJyb3I6ZXJyb3JdOwogfQogCi0tIChkb3VibGUpIHJlYWREb3VibGUKKy0oQk9PTCkgcmVhZERvdWJsZTooZG91YmxlICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gICAgcmV0dXJuIFttQ29uY3JldGVQcm90b2NvbCByZWFkRG91YmxlXTsKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCByZWFkRG91YmxlOnZhbHVlIGVycm9yOmVycm9yXTsKIH0KIAotLSAoTlNEYXRhICopIHJlYWRCaW5hcnkKKy0oQk9PTCkgcmVhZEJpbmFyeTooTlNEYXRhICpfX2F1dG9yZWxlYXNpbmcgKil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgICByZXR1cm4gW21Db25jcmV0ZVByb3RvY29sIHJlYWRCaW5hcnldOworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHJlYWRCaW5hcnk6dmFsdWUgZXJyb3I6ZXJyb3JdOwogfQogCi0tICh2b2lkKSByZWFkTWFwQmVnaW5SZXR1cm5pbmdLZXlUeXBlOiAoaW50ICopIGtleVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVR5cGU6IChpbnQgKikgdmFsdWVUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOiAoaW50ICopIHNpemUKKy0oQk9PTCkgcmVhZE1hcEJlZ2luUmV0dXJuaW5nS2V5VHlwZTooU0ludDMyICopa2V5VHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVUeXBlOihTSW50MzIgKil2YWx1ZVR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTooU0ludDMyICopc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICAgIFttQ29uY3JldGVQcm90b2NvbCByZWFkTWFwQmVnaW5SZXR1cm5pbmdLZXlUeXBlOmtleVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlVHlwZTp2YWx1ZVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTpzaXplXTsKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCByZWFkTWFwQmVnaW5SZXR1cm5pbmdLZXlUeXBlOmtleVR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVUeXBlOnZhbHVlVHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6c2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6ZXJyb3JdOwogfQotLSAodm9pZCkgcmVhZE1hcEVuZAorLShCT09MKSByZWFkTWFwRW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICAgIFttQ29uY3JldGVQcm90b2NvbCByZWFkTWFwRW5kXTsKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCByZWFkTWFwRW5kOmVycm9yXTsKIH0KIAogCi0tICh2b2lkKSByZWFkU2V0QmVnaW5SZXR1cm5pbmdFbGVtZW50VHlwZTogKGludCAqKSBlbGVtZW50VHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IChpbnQgKikgc2l6ZQorLShCT09MKSByZWFkU2V0QmVnaW5SZXR1cm5pbmdFbGVtZW50VHlwZTooU0ludDMyICopZWxlbWVudFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6KFNJbnQzMiAqKXNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gICAgW21Db25jcmV0ZVByb3RvY29sIHJlYWRTZXRCZWdpblJldHVybmluZ0VsZW1lbnRUeXBlOmVsZW1lbnRUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOnNpemVdOworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHJlYWRTZXRCZWdpblJldHVybmluZ0VsZW1lbnRUeXBlOmVsZW1lbnRUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6c2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOmVycm9yXTsKIH0KLS0gKHZvaWQpIHJlYWRTZXRFbmQKKy0oQk9PTCkgcmVhZFNldEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgICBbbUNvbmNyZXRlUHJvdG9jb2wgcmVhZFNldEVuZF07CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgcmVhZFNldEVuZDplcnJvcl07CiB9CiAKLS0gKHZvaWQpIHJlYWRMaXN0QmVnaW5SZXR1cm5pbmdFbGVtZW50VHlwZTogKGludCAqKSBlbGVtZW50VHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOiAoaW50ICopIHNpemUKKy0oQk9PTCkgcmVhZExpc3RCZWdpblJldHVybmluZ0VsZW1lbnRUeXBlOihTSW50MzIgKillbGVtZW50VHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6KFNJbnQzMiAqKXNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICAgIFttQ29uY3JldGVQcm90b2NvbCByZWFkTGlzdEJlZ2luUmV0dXJuaW5nRWxlbWVudFR5cGU6ZWxlbWVudFR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOnNpemVdOworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHJlYWRMaXN0QmVnaW5SZXR1cm5pbmdFbGVtZW50VHlwZTplbGVtZW50VHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTpzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOmVycm9yXTsKIH0KLS0gKHZvaWQpIHJlYWRMaXN0RW5kCistKEJPT0wpIHJlYWRMaXN0RW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICAgIFttQ29uY3JldGVQcm90b2NvbCByZWFkTGlzdEVuZF07CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgcmVhZExpc3RFbmQ6ZXJyb3JdOwogfQogCi0tICh2b2lkKSB3cml0ZU1lc3NhZ2VCZWdpbldpdGhOYW1lOiAoTlNTdHJpbmcgKikgbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogKGludCkgbWVzc2FnZVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlSUQ6IChpbnQpIHNlcXVlbmNlSUQKKy0oQk9PTCkgd3JpdGVNZXNzYWdlQmVnaW5XaXRoTmFtZTooTlNTdHJpbmcgKiluYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6KFNJbnQzMiltZXNzYWdlVHlwZQorICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZUlEOihTSW50MzIpc2VxdWVuY2VJRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICAgIFttQ29uY3JldGVQcm90b2NvbCB3cml0ZU1lc3NhZ2VCZWdpbldpdGhOYW1lOm5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTptZXNzYWdlVHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZUlEOnNlcXVlbmNlSURdOworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHdyaXRlTWVzc2FnZUJlZ2luV2l0aE5hbWU6bmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6bWVzc2FnZVR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZUlEOnNlcXVlbmNlSUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOmVycm9yXTsKIH0KLS0gKHZvaWQpIHdyaXRlTWVzc2FnZUVuZAorLShCT09MKSB3cml0ZU1lc3NhZ2VFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gICAgW21Db25jcmV0ZVByb3RvY29sIHdyaXRlTWVzc2FnZUVuZF07CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgd3JpdGVNZXNzYWdlRW5kOmVycm9yXTsKIH0KIAotLSAodm9pZCkgd3JpdGVTdHJ1Y3RCZWdpbldpdGhOYW1lOiAoTlNTdHJpbmcgKikgbmFtZQorLShCT09MKSB3cml0ZVN0cnVjdEJlZ2luV2l0aE5hbWU6KE5TU3RyaW5nICopbmFtZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgICBbbUNvbmNyZXRlUHJvdG9jb2wgd3JpdGVTdHJ1Y3RCZWdpbldpdGhOYW1lOm5hbWVdOworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHdyaXRlU3RydWN0QmVnaW5XaXRoTmFtZTpuYW1lIGVycm9yOmVycm9yXTsKIH0KLS0gKHZvaWQpIHdyaXRlU3RydWN0RW5kCistKEJPT0wpIHdyaXRlU3RydWN0RW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICAgIFttQ29uY3JldGVQcm90b2NvbCB3cml0ZVN0cnVjdEVuZF07CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgd3JpdGVTdHJ1Y3RFbmQ6ZXJyb3JdOwogfQogCi0tICh2b2lkKSB3cml0ZUZpZWxkQmVnaW5XaXRoTmFtZTogKE5TU3RyaW5nICopIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAoaW50KSBmaWVsZFR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZElEOiAoaW50KSBmaWVsZElECistKEJPT0wpIHdyaXRlRmllbGRCZWdpbldpdGhOYW1lOihOU1N0cmluZyAqKW5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6KFNJbnQzMilmaWVsZFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkSUQ6KFNJbnQzMilmaWVsZElECisgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICAgIFttQ29uY3JldGVQcm90b2NvbCB3cml0ZUZpZWxkQmVnaW5XaXRoTmFtZTpuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOmZpZWxkVHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRJRDpmaWVsZElEXTsKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCB3cml0ZUZpZWxkQmVnaW5XaXRoTmFtZTpuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ZmllbGRUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkSUQ6ZmllbGRJRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOmVycm9yXTsKIH0KIAotLSAodm9pZCkgd3JpdGVJMzI6IChpbnQzMl90KSB2YWx1ZQorLShCT09MKSB3cml0ZUkzMjooU0ludDMyKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICAgIFttQ29uY3JldGVQcm90b2NvbCB3cml0ZUkzMjp2YWx1ZV07CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgd3JpdGVJMzI6dmFsdWUgZXJyb3I6ZXJyb3JdOwogfQogCi0tICh2b2lkKSB3cml0ZUk2NDogKGludDY0X3QpIHZhbHVlCistKEJPT0wpIHdyaXRlSTY0OihTSW50NjQpdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gICAgW21Db25jcmV0ZVByb3RvY29sIHdyaXRlSTY0OnZhbHVlXTsKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCB3cml0ZUk2NDp2YWx1ZSBlcnJvcjplcnJvcl07CiB9CiAKLS0gKHZvaWQpIHdyaXRlSTE2OiAoc2hvcnQpIHZhbHVlCistKEJPT0wpIHdyaXRlSTE2OihTSW50MTYpdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gICAgW21Db25jcmV0ZVByb3RvY29sIHdyaXRlSTE2OnZhbHVlXTsKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCB3cml0ZUkxNjp2YWx1ZSBlcnJvcjplcnJvcl07CiB9CiAKLS0gKHZvaWQpIHdyaXRlQnl0ZTogKHVpbnQ4X3QpIHZhbHVlCistKEJPT0wpIHdyaXRlQnl0ZTooVUludDgpdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gICAgW21Db25jcmV0ZVByb3RvY29sIHdyaXRlQnl0ZTp2YWx1ZV07CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgd3JpdGVCeXRlOnZhbHVlIGVycm9yOmVycm9yXTsKIH0KIAotLSAodm9pZCkgd3JpdGVTdHJpbmc6IChOU1N0cmluZyAqKSB2YWx1ZQorLShCT09MKSB3cml0ZVN0cmluZzooTlNTdHJpbmcgKil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgICBbbUNvbmNyZXRlUHJvdG9jb2wgd3JpdGVTdHJpbmc6dmFsdWVdOworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHdyaXRlU3RyaW5nOnZhbHVlIGVycm9yOmVycm9yXTsKIH0KIAotLSAodm9pZCkgd3JpdGVEb3VibGU6IChkb3VibGUpIHZhbHVlCistKEJPT0wpIHdyaXRlRG91YmxlOihkb3VibGUpdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gICAgW21Db25jcmV0ZVByb3RvY29sIHdyaXRlRG91YmxlOnZhbHVlXTsKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCB3cml0ZURvdWJsZTp2YWx1ZSBlcnJvcjplcnJvcl07CiB9CiAKLS0gKHZvaWQpIHdyaXRlQm9vbDogKEJPT0wpIHZhbHVlCistKEJPT0wpIHdyaXRlQm9vbDooQk9PTCl2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgICBbbUNvbmNyZXRlUHJvdG9jb2wgd3JpdGVCb29sOnZhbHVlXTsKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCB3cml0ZUJvb2w6dmFsdWUgZXJyb3I6ZXJyb3JdOwogfQogCi0tICh2b2lkKSB3cml0ZUJpbmFyeTogKE5TRGF0YSAqKSBkYXRhCistKEJPT0wpIHdyaXRlQmluYXJ5OihOU0RhdGEgKilkYXRhIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICAgIFttQ29uY3JldGVQcm90b2NvbCB3cml0ZUJpbmFyeTpkYXRhXTsKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCB3cml0ZUJpbmFyeTpkYXRhIGVycm9yOmVycm9yXTsKIH0KIAotLSAodm9pZCkgd3JpdGVGaWVsZFN0b3AKKy0oQk9PTCkgd3JpdGVGaWVsZFN0b3A6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gICAgW21Db25jcmV0ZVByb3RvY29sIHdyaXRlRmllbGRTdG9wXTsKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCB3cml0ZUZpZWxkU3RvcDplcnJvcl07CiB9CiAKLS0gKHZvaWQpIHdyaXRlRmllbGRFbmQKKy0oQk9PTCkgd3JpdGVGaWVsZEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgICBbbUNvbmNyZXRlUHJvdG9jb2wgd3JpdGVGaWVsZEVuZF07CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgd3JpdGVGaWVsZEVuZDplcnJvcl07CiB9CiAKLS0gKHZvaWQpIHdyaXRlTWFwQmVnaW5XaXRoS2V5VHlwZTogKGludCkga2V5VHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVUeXBlOiAoaW50KSB2YWx1ZVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogKGludCkgc2l6ZQorLShCT09MKSB3cml0ZU1hcEJlZ2luV2l0aEtleVR5cGU6KFNJbnQzMilrZXlUeXBlCisgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlVHlwZTooU0ludDMyKXZhbHVlVHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6KFNJbnQzMilzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgICBbbUNvbmNyZXRlUHJvdG9jb2wgd3JpdGVNYXBCZWdpbldpdGhLZXlUeXBlOmtleVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVUeXBlOnZhbHVlVHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6c2l6ZV07Ci19Ci0tICh2b2lkKSB3cml0ZU1hcEVuZAotewotICAgIFttQ29uY3JldGVQcm90b2NvbCB3cml0ZU1hcEVuZF07CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgd3JpdGVNYXBCZWdpbldpdGhLZXlUeXBlOmtleVR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVR5cGU6dmFsdWVUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOnNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6ZXJyb3JdOwogfQogCi0tICh2b2lkKSB3cml0ZVNldEJlZ2luV2l0aEVsZW1lbnRUeXBlOiAoaW50KSBlbGVtZW50VHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogKGludCkgc2l6ZQorLShCT09MKSB3cml0ZU1hcEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgICBbbUNvbmNyZXRlUHJvdG9jb2wgd3JpdGVTZXRCZWdpbldpdGhFbGVtZW50VHlwZTplbGVtZW50VHlwZSBzaXplOnNpemVdOworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHdyaXRlTWFwRW5kOmVycm9yXTsKIH0KIAotLSAodm9pZCkgd3JpdGVTZXRFbmQKKy0oQk9PTCkgd3JpdGVTZXRCZWdpbldpdGhFbGVtZW50VHlwZTooU0ludDMyKWVsZW1lbnRUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6KFNJbnQzMilzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gICAgW21Db25jcmV0ZVByb3RvY29sIHdyaXRlU2V0RW5kXTsKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCB3cml0ZVNldEJlZ2luV2l0aEVsZW1lbnRUeXBlOmVsZW1lbnRUeXBlIHNpemU6c2l6ZSBlcnJvcjplcnJvcl07CiB9CiAKLS0gKHZvaWQpIHdyaXRlTGlzdEJlZ2luV2l0aEVsZW1lbnRUeXBlOiAoaW50KSBlbGVtZW50VHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IChpbnQpIHNpemUKKy0oQk9PTCkgd3JpdGVTZXRFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gICAgW21Db25jcmV0ZVByb3RvY29sIHdyaXRlTGlzdEJlZ2luV2l0aEVsZW1lbnRUeXBlOmVsZW1lbnRUeXBlIHNpemU6c2l6ZV07CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgd3JpdGVTZXRFbmQ6ZXJyb3JdOwogfQogCi0tICh2b2lkKSB3cml0ZUxpc3RFbmQKKy0oQk9PTCkgd3JpdGVMaXN0QmVnaW5XaXRoRWxlbWVudFR5cGU6KFNJbnQzMillbGVtZW50VHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTooU0ludDMyKXNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gICAgW21Db25jcmV0ZVByb3RvY29sIHdyaXRlTGlzdEVuZF07CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgd3JpdGVMaXN0QmVnaW5XaXRoRWxlbWVudFR5cGU6ZWxlbWVudFR5cGUgc2l6ZTpzaXplIGVycm9yOmVycm9yXTsKIH0KIAotLSAodm9pZCkgZGVhbGxvYworLShCT09MKSB3cml0ZUxpc3RFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gICAgW21Db25jcmV0ZVByb3RvY29sIHJlbGVhc2Vfc3R1Yl07Ci0gICAgW3N1cGVyIGRlYWxsb2Nfc3R1Yl07CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgd3JpdGVMaXN0RW5kOmVycm9yXTsKIH0KIAogQGVuZApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xFcnJvci5oIGIvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xFcnJvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiMGJjNDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbEVycm9yLmgKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW1wb3J0ICJURXJyb3IuaCIKKworCitleHRlcm4gTlNTdHJpbmcgKlRQcm90b2NvbEVycm9yRG9tYWluOworCit0eXBlZGVmIE5TX0VOVU0gKGludCwgVFByb3RvY29sRXJyb3IpIHsKKyAgVFByb3RvY29sRXJyb3JVbmtub3duICAgICAgICAgICAgICAgICAgID0gMCwKKyAgVFByb3RvY29sRXJyb3JJbnZhbGlkRGF0YSAgICAgICAgICAgICAgID0gMSwKKyAgVFByb3RvY29sRXJyb3JOZWdhdGl2ZVNpemUgICAgICAgICAgICAgID0gMiwKKyAgVFByb3RvY29sRXJyb3JTaXplTGltaXQgICAgICAgICAgICAgICAgID0gMywKKyAgVFByb3RvY29sRXJyb3JCYWRWZXJzaW9uICAgICAgICAgICAgICAgID0gNCwKKyAgVFByb3RvY29sRXJyb3JOb3RJbXBsZW1lbnRlZCAgICAgICAgICAgID0gNSwKKyAgVFByb3RvY29sRXJyb3JEZXB0aExpbWl0ICAgICAgICAgICAgICAgID0gNiwKK307CisKKwordHlwZWRlZiBOU19FTlVNKGludCwgVFByb3RvY29sRXh0ZW5kZWRFcnJvcikgeworICBUUHJvdG9jb2xFeHRlbmRlZEVycm9yTWlzc2luZ1JlcXVpcmVkRmllbGQgID0gMTAwMSwKKyAgVFByb3RvY29sRXh0ZW5kZWRFcnJvclVuZXhwZWN0ZWRUeXBlICAgICAgICA9IDEwMDIsCisgIFRQcm90b2NvbEV4dGVuZGVkRXJyb3JNaXNtYXRjaGVkUHJvdG9jb2wgICAgPSAxMDAzLAorfTsKKworZXh0ZXJuIE5TU3RyaW5nICpUUHJvdG9jb2xFcnJvckV4dGVuZGVkRXJyb3JLZXk7CitleHRlcm4gTlNTdHJpbmcgKlRQcm90b2NvbEVycm9yRmllbGROYW1lS2V5OworZXh0ZXJuIE5TU3RyaW5nICpUUHJvdG9jb2xFcnJvckV4cGVjdGVkSWRLZXk7CitleHRlcm4gTlNTdHJpbmcgKlRQcm90b2NvbEVycm9yRXhwZWN0ZWRWZXJzaW9uS2V5OworZXh0ZXJuIE5TU3RyaW5nICpUUHJvdG9jb2xFcnJvclR5cGVLZXk7CitleHRlcm4gTlNTdHJpbmcgKlRQcm90b2NvbEVycm9yU291cmNlTGluZUtleTsKK2V4dGVybiBOU1N0cmluZyAqVFByb3RvY29sRXJyb3JTb3VyY2VGaWxlS2V5OworZXh0ZXJuIE5TU3RyaW5nICpUUHJvdG9jb2xFcnJvclNvdXJjZU1ldGhvZEtleTsKK2V4dGVybiBOU1N0cmluZyAqVFByb3RvY29sRXJyb3JNZXNzYWdlTmFtZUtleTsKKworCisjZGVmaW5lIFBST1RPQ09MX0VSUk9SKHJldCwgZXJyLCAuLi4pIFwKKyAgaWYgKGVycm9yKSB7ICBcCisgICAgKmVycm9yID0gW05TRXJyb3IgZXJyb3JXaXRoRG9tYWluOlRQcm90b2NvbEVycm9yRG9tYWluIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6VFByb3RvY29sRXJyb3IgIyMgZXJyIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckluZm86QHtOU0xvY2FsaXplZERlc2NyaXB0aW9uS2V5OiBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpfX1ZBX0FSR1NfX10sIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIlNvdXJjZUZpbGUiOiBbTlNTdHJpbmcgc3RyaW5nV2l0aFVURjhTdHJpbmc6X19GSUxFX19dLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCJTb3VyY2VMaW5lIjogQChfX0xJTkVfXyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIlNvdXJjZUZ1bmN0aW9uIjogW05TU3RyaW5nIHN0cmluZ1dpdGhVVEY4U3RyaW5nOl9fUFJFVFRZX0ZVTkNUSU9OX19dLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCJNZXNzYWdlIjogc2VsZi5jdXJyZW50TWVzc2FnZU5hbWUgPyBzZWxmLmN1cnJlbnRNZXNzYWdlTmFtZSA6IEAiIn1dOyBcCisgIH0gXAorICByZXR1cm4gcmV0CisKKyNkZWZpbmUgUFJPVE9DT0xfVFJBTlNQT1JUX0VSUk9SKHJldCwgZXJyb3JQdHIsIC4uLikgXAorICBpZiAoZXJyb3JQdHIpIHsgXAorICAgICplcnJvciA9IFtOU0Vycm9yIGVycm9yV2l0aERvbWFpbjpUUHJvdG9jb2xFcnJvckRvbWFpbiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOlRQcm90b2NvbEVycm9yVW5rbm93biBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvOkB7TlNMb2NhbGl6ZWREZXNjcmlwdGlvbktleTogW1tOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0Ol9fVkFfQVJHU19fXSBzdHJpbmdCeUFwcGVuZGluZ0Zvcm1hdDpAIjogJUAiLCBbKCplcnJvclB0cikgbG9jYWxpemVkRGVzY3JpcHRpb25dXSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEVycm9yU291cmNlRmlsZUtleTogW05TU3RyaW5nIHN0cmluZ1dpdGhVVEY4U3RyaW5nOl9fRklMRV9fXSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEVycm9yU291cmNlTGluZUtleTogQChfX0xJTkVfXyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xFcnJvclNvdXJjZU1ldGhvZEtleTogW05TU3RyaW5nIHN0cmluZ1dpdGhVVEY4U3RyaW5nOl9fUFJFVFRZX0ZVTkNUSU9OX19dLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRXJyb3JNZXNzYWdlTmFtZUtleTogc2VsZi5jdXJyZW50TWVzc2FnZU5hbWUgPyBzZWxmLmN1cnJlbnRNZXNzYWdlTmFtZSA6IEAiIiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TVW5kZXJseWluZ0Vycm9yS2V5OiAqZXJyb3JQdHJ9XTsgXAorICB9IFwKKyAgcmV0dXJuIHJldApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xFcnJvci5tIGIvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xFcnJvci5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1MzY3M2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbEVycm9yLm0KQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW1wb3J0ICJUUHJvdG9jb2xFcnJvci5oIgorCisKK05TU3RyaW5nICpUUHJvdG9jb2xFcnJvckRvbWFpbiA9IEAiVFByb3RvY29sRXJyb3JEb21haW4iOworCitOU1N0cmluZyAqVFByb3RvY29sRXJyb3JFeHRlbmRlZEVycm9yS2V5ID0gQCJleHRlbmRlZEVycm9yIjsKK05TU3RyaW5nICpUUHJvdG9jb2xFcnJvckZpZWxkTmFtZUtleSA9IEAiZmllbGQiOworTlNTdHJpbmcgKlRQcm90b2NvbEVycm9yRXhwZWN0ZWRJZEtleSA9IEAiZXhwZWN0ZWRJZCI7CitOU1N0cmluZyAqVFByb3RvY29sRXJyb3JFeHBlY3RlZFZlcnNpb25LZXkgPSBAImV4cGVjdGVkVmVyc2lvbiI7CitOU1N0cmluZyAqVFByb3RvY29sRXJyb3JUeXBlS2V5ID0gQCJ0eXBlIjsKK05TU3RyaW5nICpUUHJvdG9jb2xFcnJvclNvdXJjZUxpbmVLZXkgPSBAInNvdXJjZUxpbmUiOworTlNTdHJpbmcgKlRQcm90b2NvbEVycm9yU291cmNlRmlsZUtleSA9IEAic291cmNlRmlsZSI7CitOU1N0cmluZyAqVFByb3RvY29sRXJyb3JTb3VyY2VNZXRob2RLZXkgPSBAInNvdXJjZU1ldGhvZCI7CitOU1N0cmluZyAqVFByb3RvY29sRXJyb3JNZXNzYWdlTmFtZUtleSA9IEAibWVzc2FnZU5hbWUiOwpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xFeGNlcHRpb24uaCBiL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVFByb3RvY29sRXhjZXB0aW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkMzU0ZmMuLjAwMDAwMDAKLS0tIGEvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xFeGNlcHRpb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2ltcG9ydCAiVEV4Y2VwdGlvbi5oIgotCi1AaW50ZXJmYWNlIFRQcm90b2NvbEV4Y2VwdGlvbiA6IFRFeGNlcHRpb24gewotfQotCi1AZW5kCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbEV4Y2VwdGlvbi5tIGIvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xFeGNlcHRpb24ubQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjgxNDg3YS4uMDAwMDAwMAotLS0gYS9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbEV4Y2VwdGlvbi5tCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW1wb3J0ICJUUHJvdG9jb2xFeGNlcHRpb24uaCIKLQotQGltcGxlbWVudGF0aW9uIFRQcm90b2NvbEV4Y2VwdGlvbgotQGVuZApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xGYWN0b3J5LmggYi9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbEZhY3RvcnkuaAppbmRleCBmMjAwYTZkLi5hMDIyYTdmIDEwMDY0NAotLS0gYS9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbEZhY3RvcnkuaAorKysgYi9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbEZhY3RvcnkuaApAQCAtMjEsOSArMjEsMTYgQEAKICNpbXBvcnQgIlRQcm90b2NvbC5oIgogI2ltcG9ydCAiVFRyYW5zcG9ydC5oIgogCitOU19BU1NVTUVfTk9OTlVMTF9CRUdJTgorCiAKIEBwcm90b2NvbCBUUHJvdG9jb2xGYWN0b3J5IDxOU09iamVjdD4KIAotLSAoaWQgPFRQcm90b2NvbD4pIG5ld1Byb3RvY29sT25UcmFuc3BvcnQ6IChpZCA8VFRyYW5zcG9ydD4pIHRyYW5zcG9ydDsKK0Bwcm9wZXJ0eSAocmVhZG9ubHksIG5vbmF0b21pYykgTlNTdHJpbmcgKnByb3RvY29sTmFtZTsKKworLShpZDxUUHJvdG9jb2w+KSBuZXdQcm90b2NvbE9uVHJhbnNwb3J0OihpZDxUVHJhbnNwb3J0Pil0cmFuc3BvcnQ7CiAKIEBlbmQKKworCitOU19BU1NVTUVfTk9OTlVMTF9FTkQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVFByb3RvY29sVXRpbC5oIGIvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xVdGlsLmgKaW5kZXggNzU3NzQ4YS4uODI1MTBjZiAxMDA2NDQKLS0tIGEvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xVdGlsLmgKKysrIGIvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xVdGlsLmgKQEAgLTIwLDEwICsyMCwxNCBAQAogI2ltcG9ydCAiVFByb3RvY29sLmgiCiAjaW1wb3J0ICJUVHJhbnNwb3J0LmgiCiAKLUBpbnRlcmZhY2UgVFByb3RvY29sVXRpbCA6IE5TT2JqZWN0IHsKK05TX0FTU1VNRV9OT05OVUxMX0JFR0lOCiAKLX0KIAotKyAodm9pZCkgc2tpcFR5cGU6IChpbnQpIHR5cGUgb25Qcm90b2NvbDogKGlkIDxUUHJvdG9jb2w+KSBwcm90b2NvbDsKK0BpbnRlcmZhY2UgVFByb3RvY29sVXRpbCA6IE5TT2JqZWN0CiAKLUBlbmQKKysoQk9PTCkgc2tpcFR5cGU6KGludCl0eXBlIG9uUHJvdG9jb2w6KGlkIDxUUHJvdG9jb2w+KXByb3RvY29sIGVycm9yOihOU0Vycm9yICoqKWVycm9yOworCitAZW5kOworCisKK05TX0FTU1VNRV9OT05OVUxMX0VORApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVFByb3RvY29sVXRpbC5tIGIvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xVdGlsLm0KaW5kZXggMTNkNzA5NS4uYzBkNjVhYyAxMDA2NDQKLS0tIGEvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xVdGlsLm0KKysrIGIvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xVdGlsLm0KQEAgLTIxLDg0ICsyMSwxNTEgQEAKIAogQGltcGxlbWVudGF0aW9uIFRQcm90b2NvbFV0aWwKIAotKyAodm9pZCkgc2tpcFR5cGU6IChpbnQpIHR5cGUgb25Qcm90b2NvbDogKGlkIDxUUHJvdG9jb2w+KSBwcm90b2NvbAorKyhCT09MKSBza2lwVHlwZTooaW50KXR5cGUgb25Qcm90b2NvbDooaWQgPFRQcm90b2NvbD4pcHJvdG9jb2wgZXJyb3I6KE5TRXJyb3IgKiopZXJyb3IKIHsKICAgc3dpdGNoICh0eXBlKSB7Ci0gIGNhc2UgVFR5cGVfQk9PTDoKLSAgICBbcHJvdG9jb2wgcmVhZEJvb2xdOwotICAgIGJyZWFrOwotICBjYXNlIFRUeXBlX0JZVEU6Ci0gICAgW3Byb3RvY29sIHJlYWRCeXRlXTsKLSAgICBicmVhazsKLSAgY2FzZSBUVHlwZV9JMTY6Ci0gICAgW3Byb3RvY29sIHJlYWRJMTZdOwotICAgIGJyZWFrOwotICBjYXNlIFRUeXBlX0kzMjoKLSAgICBbcHJvdG9jb2wgcmVhZEkzMl07Ci0gICAgYnJlYWs7Ci0gIGNhc2UgVFR5cGVfSTY0OgotICAgIFtwcm90b2NvbCByZWFkSTY0XTsKLSAgICBicmVhazsKLSAgY2FzZSBUVHlwZV9ET1VCTEU6Ci0gICAgW3Byb3RvY29sIHJlYWREb3VibGVdOwotICAgIGJyZWFrOwotICBjYXNlIFRUeXBlX1NUUklORzoKLSAgICBbcHJvdG9jb2wgcmVhZFN0cmluZ107Ci0gICAgYnJlYWs7Ci0gIGNhc2UgVFR5cGVfU1RSVUNUOgotICAgIFtwcm90b2NvbCByZWFkU3RydWN0QmVnaW5SZXR1cm5pbmdOYW1lOiBOVUxMXTsKKyAgY2FzZSBUVHlwZUJPT0w6IHsKKyAgICBCT09MIHZhbDsKKyAgICBpZiAoIVtwcm90b2NvbCByZWFkQm9vbDomdmFsIGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKyAgfQorICBicmVhazsKKworICBjYXNlIFRUeXBlQllURTogeworICAgIFVJbnQ4IHZhbDsKKyAgICBpZiAoIVtwcm90b2NvbCByZWFkQnl0ZTomdmFsIGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKyAgfQorICBicmVhazsKKworICBjYXNlIFRUeXBlSTE2OiB7CisgICAgU0ludDE2IHZhbDsKKyAgICBpZiAoIVtwcm90b2NvbCByZWFkSTE2OiZ2YWwgZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorICB9CisgIGJyZWFrOworCisgIGNhc2UgVFR5cGVJMzI6IHsKKyAgICBTSW50MzIgdmFsOworICAgIGlmICghW3Byb3RvY29sIHJlYWRJMzI6JnZhbCBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisgIH0KKyAgYnJlYWs7CisKKyAgY2FzZSBUVHlwZUk2NDogeworICAgIFNJbnQ2NCB2YWw7CisgICAgaWYgKCFbcHJvdG9jb2wgcmVhZEk2NDomdmFsIGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKyAgfQorICBicmVhazsKKworICBjYXNlIFRUeXBlRE9VQkxFOiB7CisgICAgZG91YmxlIHZhbDsKKyAgICBpZiAoIVtwcm90b2NvbCByZWFkRG91YmxlOiZ2YWwgZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorICB9CisgIGJyZWFrOworCisgIGNhc2UgVFR5cGVTVFJJTkc6IHsKKyAgICBOU1N0cmluZyAqdmFsOworICAgIGlmICghW3Byb3RvY29sIHJlYWRTdHJpbmc6JnZhbCBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisgIH0KKyAgYnJlYWs7CisKKyAgY2FzZSBUVHlwZVNUUlVDVDogeworICAgIGlmICghW3Byb3RvY29sIHJlYWRTdHJ1Y3RCZWdpblJldHVybmluZ05hbWU6TlVMTCBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CiAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIGludCBmaWVsZFR5cGU7Ci0gICAgICBbcHJvdG9jb2wgcmVhZEZpZWxkQmVnaW5SZXR1cm5pbmdOYW1lOiBuaWwgdHlwZTogJmZpZWxkVHlwZSBmaWVsZElEOiBuaWxdOwotICAgICAgaWYgKGZpZWxkVHlwZSA9PSBUVHlwZV9TVE9QKSB7CisgICAgICBTSW50MzIgZmllbGRUeXBlOworICAgICAgaWYgKCFbcHJvdG9jb2wgcmVhZEZpZWxkQmVnaW5SZXR1cm5pbmdOYW1lOm5pbCB0eXBlOiZmaWVsZFR5cGUgZmllbGRJRDpuaWwgZXJyb3I6ZXJyb3JdKSB7CisgICAgICAgIHJldHVybiBOTzsKKyAgICAgIH0KKyAgICAgIGlmIChmaWVsZFR5cGUgPT0gVFR5cGVTVE9QKSB7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQotICAgICAgW1RQcm90b2NvbFV0aWwgc2tpcFR5cGU6IGZpZWxkVHlwZSBvblByb3RvY29sOiBwcm90b2NvbF07Ci0gICAgICBbcHJvdG9jb2wgcmVhZEZpZWxkRW5kXTsKKyAgICAgIGlmICghW3NlbGYgc2tpcFR5cGU6ZmllbGRUeXBlIG9uUHJvdG9jb2w6cHJvdG9jb2wgZXJyb3I6ZXJyb3JdKSB7CisgICAgICAgIHJldHVybiBOTzsKKyAgICAgIH0KKyAgICAgIGlmICghW3Byb3RvY29sIHJlYWRGaWVsZEVuZDplcnJvcl0pIHsKKyAgICAgICAgcmV0dXJuIE5POworICAgICAgfQogICAgIH0KLSAgICBbcHJvdG9jb2wgcmVhZFN0cnVjdEVuZF07Ci0gICAgYnJlYWs7Ci0gIGNhc2UgVFR5cGVfTUFQOgotICB7Ci0gICAgaW50IGtleVR5cGU7Ci0gICAgaW50IHZhbHVlVHlwZTsKLSAgICBpbnQgc2l6ZTsKLSAgICBbcHJvdG9jb2wgcmVhZE1hcEJlZ2luUmV0dXJuaW5nS2V5VHlwZTogJmtleVR5cGUgdmFsdWVUeXBlOiAmdmFsdWVUeXBlIHNpemU6ICZzaXplXTsKKyAgICBpZiAoIVtwcm90b2NvbCByZWFkU3RydWN0RW5kOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKyAgfQorICBicmVhazsKKworICBjYXNlIFRUeXBlTUFQOiB7CisgICAgU0ludDMyIGtleVR5cGU7CisgICAgU0ludDMyIHZhbHVlVHlwZTsKKyAgICBTSW50MzIgc2l6ZTsKKyAgICBpZiAoIVtwcm90b2NvbCByZWFkTWFwQmVnaW5SZXR1cm5pbmdLZXlUeXBlOiZrZXlUeXBlIHZhbHVlVHlwZTomdmFsdWVUeXBlIHNpemU6JnNpemUgZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQogICAgIGludCBpOwogICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgIFtUUHJvdG9jb2xVdGlsIHNraXBUeXBlOiBrZXlUeXBlIG9uUHJvdG9jb2w6IHByb3RvY29sXTsKLSAgICAgIFtUUHJvdG9jb2xVdGlsIHNraXBUeXBlOiB2YWx1ZVR5cGUgb25Qcm90b2NvbDogcHJvdG9jb2xdOwotICAgIH0KLSAgICBbcHJvdG9jb2wgcmVhZE1hcEVuZF07Ci0gIH0KLSAgICBicmVhazsKLSAgICBjYXNlIFRUeXBlX1NFVDoKLSAgICB7Ci0gICAgICBpbnQgZWxlbVR5cGU7Ci0gICAgICBpbnQgc2l6ZTsKLSAgICAgIFtwcm90b2NvbCByZWFkU2V0QmVnaW5SZXR1cm5pbmdFbGVtZW50VHlwZTogJmVsZW1UeXBlIHNpemU6ICZzaXplXTsKLSAgICAgIGludCBpOwotICAgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICBbVFByb3RvY29sVXRpbCBza2lwVHlwZTogZWxlbVR5cGUgb25Qcm90b2NvbDogcHJvdG9jb2xdOworICAgICAgaWYgKCFbVFByb3RvY29sVXRpbCBza2lwVHlwZTprZXlUeXBlIG9uUHJvdG9jb2w6cHJvdG9jb2wgZXJyb3I6ZXJyb3JdKSB7CisgICAgICAgIHJldHVybiBOTzsKICAgICAgIH0KLSAgICAgIFtwcm90b2NvbCByZWFkU2V0RW5kXTsKLSAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFRUeXBlX0xJU1Q6Ci0gICAgewotICAgICAgaW50IGVsZW1UeXBlOwotICAgICAgaW50IHNpemU7Ci0gICAgICBbcHJvdG9jb2wgcmVhZExpc3RCZWdpblJldHVybmluZ0VsZW1lbnRUeXBlOiAmZWxlbVR5cGUgc2l6ZTogJnNpemVdOwotICAgICAgaW50IGk7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgIFtUUHJvdG9jb2xVdGlsIHNraXBUeXBlOiBlbGVtVHlwZSBvblByb3RvY29sOiBwcm90b2NvbF07CisgICAgICBpZiAoIVtUUHJvdG9jb2xVdGlsIHNraXBUeXBlOnZhbHVlVHlwZSBvblByb3RvY29sOnByb3RvY29sIGVycm9yOmVycm9yXSkgeworICAgICAgICByZXR1cm4gTk87CiAgICAgICB9Ci0gICAgICBbcHJvdG9jb2wgcmVhZExpc3RFbmRdOwogICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm47CisgICAgaWYgKCFbcHJvdG9jb2wgcmVhZE1hcEVuZDplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CiAgIH0KKyAgYnJlYWs7CisKKyAgY2FzZSBUVHlwZVNFVDogeworICAgIFNJbnQzMiBlbGVtVHlwZTsKKyAgICBTSW50MzIgc2l6ZTsKKyAgICBpZiAoIVtwcm90b2NvbCByZWFkU2V0QmVnaW5SZXR1cm5pbmdFbGVtZW50VHlwZTomZWxlbVR5cGUgc2l6ZTomc2l6ZSBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgaWYgKCFbVFByb3RvY29sVXRpbCBza2lwVHlwZTplbGVtVHlwZSBvblByb3RvY29sOnByb3RvY29sIGVycm9yOmVycm9yXSkgeworICAgICAgICByZXR1cm4gTk87CisgICAgICB9CisgICAgfQorICAgIGlmICghW3Byb3RvY29sIHJlYWRTZXRFbmQ6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorICB9CisgIGJyZWFrOworCisgIGNhc2UgVFR5cGVMSVNUOiB7CisgICAgU0ludDMyIGVsZW1UeXBlOworICAgIFNJbnQzMiBzaXplOworICAgIGlmICghW3Byb3RvY29sIHJlYWRMaXN0QmVnaW5SZXR1cm5pbmdFbGVtZW50VHlwZTomZWxlbVR5cGUgc2l6ZTomc2l6ZSBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgaWYgKCFbVFByb3RvY29sVXRpbCBza2lwVHlwZTplbGVtVHlwZSBvblByb3RvY29sOnByb3RvY29sIGVycm9yOmVycm9yXSkgeworICAgICAgICByZXR1cm4gTk87CisgICAgICB9CisgICAgfQorICAgIGlmICghW3Byb3RvY29sIHJlYWRMaXN0RW5kOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKyAgfQorICBicmVhazsKKworICB9CisKKyAgcmV0dXJuIFlFUzsKIH0KIAogQGVuZApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9zZXJ2ZXIvVFNvY2tldFNlcnZlci5oIGIvbGliL2NvY29hL3NyYy9zZXJ2ZXIvVFNvY2tldFNlcnZlci5oCmluZGV4IGM4ZmY5ZjAuLjk1YjBkM2MgMTAwNjQ0Ci0tLSBhL2xpYi9jb2NvYS9zcmMvc2VydmVyL1RTb2NrZXRTZXJ2ZXIuaAorKysgYi9saWIvY29jb2Evc3JjL3NlcnZlci9UU29ja2V0U2VydmVyLmgKQEAgLTI3LDIzICsyNywyNSBAQAogI2ltcG9ydCA8Q0ZOZXR3b3JrL0NGTmV0d29yay5oPgogI2VuZGlmCiAKLWV4dGVybiBOU1N0cmluZyAqIGNvbnN0IGtUU29ja2V0U2VydmVyX0NsaWVudENvbm5lY3Rpb25GaW5pc2hlZEZvclByb2Nlc3Nvck5vdGlmaWNhdGlvbjsKLWV4dGVybiBOU1N0cmluZyAqIGNvbnN0IGtUU29ja2V0U2VydmVyX1Byb2Nlc3NvcktleTsKLWV4dGVybiBOU1N0cmluZyAqIGNvbnN0IGtUU29ja2VyU2VydmVyX1RyYW5zcG9ydEtleTsKK05TX0FTU1VNRV9OT05OVUxMX0JFR0lOCiAKIAotQGludGVyZmFjZSBUU29ja2V0U2VydmVyIDogTlNPYmplY3QgewotICBOU0ZpbGVIYW5kbGUgKiBtU29ja2V0RmlsZUhhbmRsZTsKLSAgaWQgPFRQcm90b2NvbEZhY3Rvcnk+IG1JbnB1dFByb3RvY29sRmFjdG9yeTsKLSAgaWQgPFRQcm90b2NvbEZhY3Rvcnk+IG1PdXRwdXRQcm90b2NvbEZhY3Rvcnk7Ci0gIGlkIDxUUHJvY2Vzc29yRmFjdG9yeT4gbVByb2Nlc3NvckZhY3Rvcnk7Ci19CitleHRlcm4gTlNTdHJpbmcgKmNvbnN0IFRTb2NrZXRTZXJ2ZXJDbGllbnRDb25uZWN0aW9uRmluaXNoZWQ7CitleHRlcm4gTlNTdHJpbmcgKmNvbnN0IFRTb2NrZXRTZXJ2ZXJQcm9jZXNzb3JLZXk7CitleHRlcm4gTlNTdHJpbmcgKmNvbnN0IFRTb2NrZXJTZXJ2ZXJUcmFuc3BvcnRLZXk7CiAKLS0gKGlkKSBpbml0V2l0aFBvcnQ6IChpbnQpIHBvcnQKLSAgICBwcm90b2NvbEZhY3Rvcnk6IChpZCA8VFByb3RvY29sRmFjdG9yeT4pIHByb3RvY29sRmFjdG9yeQotICAgcHJvY2Vzc29yRmFjdG9yeTogKGlkIDxUUHJvY2Vzc29yRmFjdG9yeT4pIHByb2Nlc3NvckZhY3Rvcnk7CisKK0BpbnRlcmZhY2UgVFNvY2tldFNlcnZlciA6IE5TT2JqZWN0CisKKy0oaW5zdGFuY2V0eXBlKSBpbml0V2l0aFBvcnQ6KGludClwb3J0CisgICAgICAgICAgICAgcHJvdG9jb2xGYWN0b3J5OihpZCA8VFByb3RvY29sRmFjdG9yeT4pcHJvdG9jb2xGYWN0b3J5CisgICAgICAgICAgICBwcm9jZXNzb3JGYWN0b3J5OihpZCA8VFByb2Nlc3NvckZhY3Rvcnk+KXByb2Nlc3NvckZhY3Rvcnk7CisKKy0gKGluc3RhbmNldHlwZSkgaW5pdFdpdGhQYXRoOiAoTlNTdHJpbmcgKikgcGF0aAorICAgICAgICAgICAgICBwcm90b2NvbEZhY3Rvcnk6IChpZCA8VFByb3RvY29sRmFjdG9yeT4pIHByb3RvY29sRmFjdG9yeQorICAgICAgICAgICAgIHByb2Nlc3NvckZhY3Rvcnk6IChpZCA8VFByb2Nlc3NvckZhY3Rvcnk+KSBwcm9jZXNzb3JGYWN0b3J5OwogCiBAZW5kCiAKIAotCitOU19BU1NVTUVfTk9OTlVMTF9FTkQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvc2VydmVyL1RTb2NrZXRTZXJ2ZXIubSBiL2xpYi9jb2NvYS9zcmMvc2VydmVyL1RTb2NrZXRTZXJ2ZXIubQppbmRleCA0OTQxNDQ1Li4wOWI2MDNjIDEwMDY0NAotLS0gYS9saWIvY29jb2Evc3JjL3NlcnZlci9UU29ja2V0U2VydmVyLm0KKysrIGIvbGliL2NvY29hL3NyYy9zZXJ2ZXIvVFNvY2tldFNlcnZlci5tCkBAIC0yMSwzNiArMjEsOTIgQEAKICNpbXBvcnQgIlRTb2NrZXRTZXJ2ZXIuaCIKICNpbXBvcnQgIlROU0ZpbGVIYW5kbGVUcmFuc3BvcnQuaCIKICNpbXBvcnQgIlRQcm90b2NvbC5oIgotI2ltcG9ydCAiVFRyYW5zcG9ydEV4Y2VwdGlvbi5oIgotI2ltcG9ydCAiVE9iamVjdGl2ZS1DLmgiCisjaW1wb3J0ICJUVHJhbnNwb3J0RXJyb3IuaCIKKwogI2ltcG9ydCA8c3lzL3NvY2tldC5oPgogI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxzeXMvdW4uaD4KIAogCitOU1N0cmluZyAqY29uc3QgVFNvY2tldFNlcnZlckNsaWVudENvbm5lY3Rpb25GaW5pc2hlZCA9IEAiVFNvY2tldFNlcnZlckNsaWVudENvbm5lY3Rpb25GaW5pc2hlZCI7CitOU1N0cmluZyAqY29uc3QgVFNvY2tldFNlcnZlclByb2Nlc3NvcktleSA9IEAiVFNvY2tldFNlcnZlclByb2Nlc3NvciI7CitOU1N0cmluZyAqY29uc3QgVFNvY2tlclNlcnZlclRyYW5zcG9ydEtleSA9IEAiVFNvY2tlclNlcnZlclRyYW5zcG9ydCI7CiAKLU5TU3RyaW5nICogY29uc3Qga1RTb2NrZXRTZXJ2ZXJfQ2xpZW50Q29ubmVjdGlvbkZpbmlzaGVkRm9yUHJvY2Vzc29yTm90aWZpY2F0aW9uID0gQCJUU29ja2V0U2VydmVyX0NsaWVudENvbm5lY3Rpb25GaW5pc2hlZEZvclByb2Nlc3Nvck5vdGlmaWNhdGlvbiI7Ci1OU1N0cmluZyAqIGNvbnN0IGtUU29ja2V0U2VydmVyX1Byb2Nlc3NvcktleSA9IEAiVFNvY2tldFNlcnZlcl9Qcm9jZXNzb3IiOwotTlNTdHJpbmcgKiBjb25zdCBrVFNvY2tlclNlcnZlcl9UcmFuc3BvcnRLZXkgPSBAIlRTb2NrZXJTZXJ2ZXJfVHJhbnNwb3J0IjsKKworQGludGVyZmFjZSBUU29ja2V0U2VydmVyICgpCisKK0Bwcm9wZXJ0eShzdHJvbmcsIG5vbmF0b21pYykgaWQ8VFByb3RvY29sRmFjdG9yeT4gaW5wdXRQcm90b2NvbEZhY3Rvcnk7CitAcHJvcGVydHkoc3Ryb25nLCBub25hdG9taWMpIGlkPFRQcm90b2NvbEZhY3Rvcnk+IG91dHB1dFByb3RvY29sRmFjdG9yeTsKK0Bwcm9wZXJ0eShzdHJvbmcsIG5vbmF0b21pYykgaWQ8VFByb2Nlc3NvckZhY3Rvcnk+IHByb2Nlc3NvckZhY3Rvcnk7CitAcHJvcGVydHkoc3Ryb25nLCBub25hdG9taWMpIE5TRmlsZUhhbmRsZSAqc29ja2V0RmlsZUhhbmRsZTsKK0Bwcm9wZXJ0eShzdHJvbmcsIG5vbmF0b21pYykgZGlzcGF0Y2hfcXVldWVfdCBwcm9jZXNzaW5nUXVldWU7CitAcHJvcGVydHkoc3Ryb25nLCBub25hdG9taWMpIE5TU3RyaW5nICpkb21haW5Tb2NrZXRQYXRoOworCitAZW5kCiAKIAogQGltcGxlbWVudGF0aW9uIFRTb2NrZXRTZXJ2ZXIKIAotLSAoaWQpIGluaXRXaXRoUG9ydDogKGludCkgcG9ydAotICAgIHByb3RvY29sRmFjdG9yeTogKGlkIDxUUHJvdG9jb2xGYWN0b3J5PikgcHJvdG9jb2xGYWN0b3J5Ci0gICBwcm9jZXNzb3JGYWN0b3J5OiAoaWQgPFRQcm9jZXNzb3JGYWN0b3J5PikgcHJvY2Vzc29yRmFjdG9yeTsKKy0oaW5zdGFuY2V0eXBlKSBpbml0V2l0aFNvY2tldDooQ0ZTb2NrZXRSZWYpc29ja2V0CisgICAgICAgICAgICAgcHJvdG9jb2xGYWN0b3J5OihpZCA8VFByb3RvY29sRmFjdG9yeT4pcHJvdG9jb2xGYWN0b3J5CisgICAgICAgICAgICBwcm9jZXNzb3JGYWN0b3J5OihpZCA8VFByb2Nlc3NvckZhY3Rvcnk+KXByb2Nlc3NvckZhY3Rvcnk7CiB7CiAgIHNlbGYgPSBbc3VwZXIgaW5pdF07CiAKLSAgbUlucHV0UHJvdG9jb2xGYWN0b3J5ID0gW3Byb3RvY29sRmFjdG9yeSByZXRhaW5fc3R1Yl07Ci0gIG1PdXRwdXRQcm90b2NvbEZhY3RvcnkgPSBbcHJvdG9jb2xGYWN0b3J5IHJldGFpbl9zdHViXTsKLSAgbVByb2Nlc3NvckZhY3RvcnkgPSBbcHJvY2Vzc29yRmFjdG9yeSByZXRhaW5fc3R1Yl07CisgIF9pbnB1dFByb3RvY29sRmFjdG9yeSA9IHByb3RvY29sRmFjdG9yeTsKKyAgX291dHB1dFByb3RvY29sRmFjdG9yeSA9IHByb3RvY29sRmFjdG9yeTsKKyAgX3Byb2Nlc3NvckZhY3RvcnkgPSBwcm9jZXNzb3JGYWN0b3J5OworCisgIGRpc3BhdGNoX3F1ZXVlX2F0dHJfdCBwcm9jZXNzaW5nUXVldWVBdHRyID0KKyAgICBkaXNwYXRjaF9xdWV1ZV9hdHRyX21ha2Vfd2l0aF9xb3NfY2xhc3MoRElTUEFUQ0hfUVVFVUVfQ09OQ1VSUkVOVCwgUU9TX0NMQVNTX0JBQ0tHUk9VTkQsIDApOworCisgIF9wcm9jZXNzaW5nUXVldWUgPSBkaXNwYXRjaF9xdWV1ZV9jcmVhdGUoIlRTb2NrZXRTZXJ2ZXIucHJvY2Vzc2luZyIsIHByb2Nlc3NpbmdRdWV1ZUF0dHIpOwogCiAgIC8vIGNyZWF0ZSBhIHNvY2tldC4KLSAgaW50IGZkID0gLTE7CisgIGludCBmZCA9IENGU29ja2V0R2V0TmF0aXZlKHNvY2tldCk7CisKKyAgLy8gd3JhcCBpdCBpbiBhIGZpbGUgaGFuZGxlIHNvIHdlIGNhbiBnZXQgbWVzc2FnZXMgZnJvbSBpdAorICBfc29ja2V0RmlsZUhhbmRsZSA9IFtbTlNGaWxlSGFuZGxlIGFsbG9jXSBpbml0V2l0aEZpbGVEZXNjcmlwdG9yOmZkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VPbkRlYWxsb2M6WUVTXTsKKworICAvLyB0aHJvdyBhd2F5IG91ciBzb2NrZXQKKyAgQ0ZTb2NrZXRJbnZhbGlkYXRlKHNvY2tldCk7CisgIENGUmVsZWFzZShzb2NrZXQpOworCisgIC8vIHJlZ2lzdGVyIGZvciBub3RpZmljYXRpb25zIG9mIGFjY2VwdGVkIGluY29taW5nIGNvbm5lY3Rpb25zCisgIFtbTlNOb3RpZmljYXRpb25DZW50ZXIgZGVmYXVsdENlbnRlcl0gYWRkT2JzZXJ2ZXI6c2VsZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yOkBzZWxlY3Rvcihjb25uZWN0aW9uQWNjZXB0ZWQ6KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOk5TRmlsZUhhbmRsZUNvbm5lY3Rpb25BY2NlcHRlZE5vdGlmaWNhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0Ol9zb2NrZXRGaWxlSGFuZGxlXTsKKworICAvLyB0ZWxsIHNvY2tldCB0byBsaXN0ZW4KKyAgW19zb2NrZXRGaWxlSGFuZGxlIGFjY2VwdENvbm5lY3Rpb25JbkJhY2tncm91bmRBbmROb3RpZnldOworCisgIHJldHVybiBzZWxmOworfQorCistIChpZCkgaW5pdFdpdGhQb3J0OiAoaW50KSBwb3J0CisgICAgcHJvdG9jb2xGYWN0b3J5OiAoaWQgPFRQcm90b2NvbEZhY3Rvcnk+KSBwcm90b2NvbEZhY3RvcnkKKyAgIHByb2Nlc3NvckZhY3Rvcnk6IChpZCA8VFByb2Nlc3NvckZhY3Rvcnk+KSBwcm9jZXNzb3JGYWN0b3J5Cit7CisgIENGU29ja2V0UmVmIHNvY2tldCA9IFtbc2VsZiBjbGFzc10gY3JlYXRlU29ja2V0V2l0aFBvcnQ6cG9ydF07CisgIGlmIChzb2NrZXQgPT0gTlVMTCkgeworICAgIHJldHVybiBuaWw7CisgIH0KKworICBpZiAoc2VsZiA9IFtzZWxmIGluaXRXaXRoU29ja2V0OnNvY2tldCBwcm90b2NvbEZhY3Rvcnk6cHJvdG9jb2xGYWN0b3J5IHByb2Nlc3NvckZhY3Rvcnk6cHJvY2Vzc29yRmFjdG9yeV0pIHsKKyAgICBOU0xvZyhAIlRTb2NrZXRTZXJ2ZXI6IExpc3RlbmluZyBvbiBUQ1AgcG9ydCAlZCIsIHBvcnQpOworICB9CisgIHJldHVybiBzZWxmOworfQorCisKKysoQ0ZTb2NrZXRSZWYpIGNyZWF0ZVNvY2tldFdpdGhQb3J0OihpbnQpcG9ydAorewogICBDRlNvY2tldFJlZiBzb2NrZXQgPSBDRlNvY2tldENyZWF0ZShrQ0ZBbGxvY2F0b3JEZWZhdWx0LCBQRl9JTkVULCBTT0NLX1NUUkVBTSwgSVBQUk9UT19UQ1AsIDAsIE5VTEwsIE5VTEwpOwogICBpZiAoc29ja2V0KSB7CiAgICAgQ0ZTb2NrZXRTZXRTb2NrZXRGbGFncyhzb2NrZXQsIENGU29ja2V0R2V0U29ja2V0RmxhZ3Moc29ja2V0KSAmIH5rQ0ZTb2NrZXRDbG9zZU9uSW52YWxpZGF0ZSk7Ci0gICAgZmQgPSBDRlNvY2tldEdldE5hdGl2ZShzb2NrZXQpOworICAgIGludCBmZCA9IENGU29ja2V0R2V0TmF0aXZlKHNvY2tldCk7CiAgICAgaW50IHllcyA9IDE7CiAgICAgc2V0c29ja29wdChmZCwgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLCAodm9pZCAqKSZ5ZXMsIHNpemVvZih5ZXMpKTsKIApAQCAtNjEsMTM0ICsxMTcsMTIzIEBACiAgICAgYWRkci5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOwogICAgIGFkZHIuc2luX2FkZHIuc19hZGRyID0gaHRvbmwoSU5BRERSX0FOWSk7CiAgICAgTlNEYXRhICphZGRyZXNzID0gW05TRGF0YSBkYXRhV2l0aEJ5dGVzOiZhZGRyIGxlbmd0aDpzaXplb2YoYWRkcildOwotICAgIGlmIChDRlNvY2tldFNldEFkZHJlc3Moc29ja2V0LCAoYnJpZGdlX3N0dWIgQ0ZEYXRhUmVmKWFkZHJlc3MpICE9IGtDRlNvY2tldFN1Y2Nlc3MpIHsKKyAgICBpZiAoQ0ZTb2NrZXRTZXRBZGRyZXNzKHNvY2tldCwgKF9fYnJpZGdlIENGRGF0YVJlZilhZGRyZXNzKSAhPSBrQ0ZTb2NrZXRTdWNjZXNzKSB7CiAgICAgICBDRlNvY2tldEludmFsaWRhdGUoc29ja2V0KTsKICAgICAgIENGUmVsZWFzZShzb2NrZXQpOwotICAgICAgTlNMb2coQCIqKiogQ291bGQgbm90IGJpbmQgdG8gYWRkcmVzcyIpOwotICAgICAgcmV0dXJuIG5pbDsKKyAgICAgIE5TTG9nKEAiVFNvY2tldFNlcnZlcjogQ291bGQgbm90IGJpbmQgdG8gYWRkcmVzcyIpOworICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICB9IGVsc2UgewotICAgIE5TTG9nKEAiKioqIE5vIHNlcnZlciBzb2NrZXQiKTsKKworICAgIHJldHVybiBzb2NrZXQ7CisgIH0KKyAgZWxzZSB7CisgICAgTlNMb2coQCJUU29ja2V0U2VydmVyOiBObyBzZXJ2ZXIgc29ja2V0Iik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK30KKworLSAoaWQpIGluaXRXaXRoUGF0aDogKE5TU3RyaW5nICopIHBhdGgKKyAgICBwcm90b2NvbEZhY3Rvcnk6IChpZCA8VFByb3RvY29sRmFjdG9yeT4pIHByb3RvY29sRmFjdG9yeQorICAgcHJvY2Vzc29yRmFjdG9yeTogKGlkIDxUUHJvY2Vzc29yRmFjdG9yeT4pIHByb2Nlc3NvckZhY3RvcnkKK3sKKyAgX2RvbWFpblNvY2tldFBhdGggPSBwYXRoOworICBDRlNvY2tldFJlZiBzb2NrZXQgPSBbW3NlbGYgY2xhc3NdIGNyZWF0ZVNvY2tldFdpdGhQYXRoOnBhdGhdOworICBpZiAoc29ja2V0ID09IE5VTEwpIHsKICAgICByZXR1cm4gbmlsOwogICB9Ci0gIAotICAvLyB3cmFwIGl0IGluIGEgZmlsZSBoYW5kbGUgc28gd2UgY2FuIGdldCBtZXNzYWdlcyBmcm9tIGl0Ci0gIG1Tb2NrZXRGaWxlSGFuZGxlID0gW1tOU0ZpbGVIYW5kbGUgYWxsb2NdIGluaXRXaXRoRmlsZURlc2NyaXB0b3I6IGZkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VPbkRlYWxsb2M6IFlFU107Ci0gIAotICAvLyB0aHJvdyBhd2F5IG91ciBzb2NrZXQKLSAgQ0ZTb2NrZXRJbnZhbGlkYXRlKHNvY2tldCk7Ci0gIENGUmVsZWFzZShzb2NrZXQpOwotICAKLSAgICAvLyByZWdpc3RlciBmb3Igbm90aWZpY2F0aW9ucyBvZiBhY2NlcHRlZCBpbmNvbWluZyBjb25uZWN0aW9ucwotICBbW05TTm90aWZpY2F0aW9uQ2VudGVyIGRlZmF1bHRDZW50ZXJdIGFkZE9ic2VydmVyOiBzZWxmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6IEBzZWxlY3Rvcihjb25uZWN0aW9uQWNjZXB0ZWQ6KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBOU0ZpbGVIYW5kbGVDb25uZWN0aW9uQWNjZXB0ZWROb3RpZmljYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdDogbVNvY2tldEZpbGVIYW5kbGVdOwotICAKLSAgLy8gdGVsbCBzb2NrZXQgdG8gbGlzdGVuCi0gIFttU29ja2V0RmlsZUhhbmRsZSBhY2NlcHRDb25uZWN0aW9uSW5CYWNrZ3JvdW5kQW5kTm90aWZ5XTsKLSAgCi0gIE5TTG9nKEAiTGlzdGVuaW5nIG9uIFRDUCBwb3J0ICVkIiwgcG9ydCk7Ci0gIAorCisgIGlmIChzZWxmID0gW3NlbGYgaW5pdFdpdGhTb2NrZXQ6c29ja2V0IHByb3RvY29sRmFjdG9yeTpwcm90b2NvbEZhY3RvcnkgcHJvY2Vzc29yRmFjdG9yeTpwcm9jZXNzb3JGYWN0b3J5XSkgeworICAgIE5TTG9nKEAiVFNvY2tldFNlcnZlcjogTGlzdGVuaW5nIG9uIHBhdGggJUAiLCBwYXRoKTsKKyAgfQogICByZXR1cm4gc2VsZjsKIH0KIAotCi0tICh2b2lkKSBkZWFsbG9jIHsKLSAgW1tOU05vdGlmaWNhdGlvbkNlbnRlciBkZWZhdWx0Q2VudGVyXSByZW1vdmVPYnNlcnZlcjpzZWxmXTsKLSAgW21JbnB1dFByb3RvY29sRmFjdG9yeSByZWxlYXNlX3N0dWJdOwotICBbbU91dHB1dFByb3RvY29sRmFjdG9yeSByZWxlYXNlX3N0dWJdOwotICBbbVByb2Nlc3NvckZhY3RvcnkgcmVsZWFzZV9zdHViXTsKLSAgW21Tb2NrZXRGaWxlSGFuZGxlIHJlbGVhc2Vfc3R1Yl07Ci0gIFtzdXBlciBkZWFsbG9jX3N0dWJdOwotfQotCi0KLS0gKHZvaWQpIGNvbm5lY3Rpb25BY2NlcHRlZDogKE5TTm90aWZpY2F0aW9uICopIGFOb3RpZmljYXRpb24KKysgKENGU29ja2V0UmVmKSBjcmVhdGVTb2NrZXRXaXRoUGF0aDogKE5TU3RyaW5nICopIHBhdGgKIHsKLSAgTlNGaWxlSGFuZGxlICogc29ja2V0ID0gW1thTm90aWZpY2F0aW9uIHVzZXJJbmZvXSBvYmplY3RGb3JLZXk6IE5TRmlsZUhhbmRsZU5vdGlmaWNhdGlvbkZpbGVIYW5kbGVJdGVtXTsKKyAgQ0ZTb2NrZXRSZWYgc29ja2V0ID0gQ0ZTb2NrZXRDcmVhdGUoa0NGQWxsb2NhdG9yRGVmYXVsdCwgUEZfTE9DQUwsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX0lQLCAwLCBOVUxMLCBOVUxMKTsKKyAgaWYgKHNvY2tldCkgeworICAgIENGU29ja2V0U2V0U29ja2V0RmxhZ3Moc29ja2V0LCAgQ0ZTb2NrZXRHZXRTb2NrZXRGbGFncyhzb2NrZXQpICYgfmtDRlNvY2tldENsb3NlT25JbnZhbGlkYXRlKTsKKyAgICBpbnQgZmQgPSBDRlNvY2tldEdldE5hdGl2ZShzb2NrZXQpOworICAgIGludCB5ZXMgPSAxOworICAgIHNldHNvY2tvcHQoZmQsIFNPTF9TT0NLRVQsIFNPX1JFVVNFQUREUiwgKHZvaWQgKikmeWVzLCBzaXplb2YoeWVzKSk7CiAKLSAgLy8gbm93IHRoYXQgd2UgaGF2ZSBhIGNsaWVudCBjb25uZWN0ZWQsIHNwaW4gb2ZmIGEgdGhyZWFkIHRvIGhhbmRsZSBhY3Rpdml0eQotICBbTlNUaHJlYWQgZGV0YWNoTmV3VGhyZWFkU2VsZWN0b3I6IEBzZWxlY3RvcihoYW5kbGVDbGllbnRDb25uZWN0aW9uOikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvVGFyZ2V0OiBzZWxmCi0gICAgICAgICAgICAgICAgICAgICAgICAgd2l0aE9iamVjdDogc29ja2V0XTsKLQotICBbW2FOb3RpZmljYXRpb24gb2JqZWN0XSBhY2NlcHRDb25uZWN0aW9uSW5CYWNrZ3JvdW5kQW5kTm90aWZ5XTsKLX0KLQotCi0tICh2b2lkKSBoYW5kbGVDbGllbnRDb25uZWN0aW9uOiAoTlNGaWxlSGFuZGxlICopIGNsaWVudFNvY2tldAotewotI2lmIF9faGFzX2ZlYXR1cmUob2JqY19hcmMpCi0gICAgQGF1dG9yZWxlYXNlcG9vbCB7Ci0gICAgICAgIFROU0ZpbGVIYW5kbGVUcmFuc3BvcnQgKiB0cmFuc3BvcnQgPSBbW1ROU0ZpbGVIYW5kbGVUcmFuc3BvcnQgYWxsb2NdIGluaXRXaXRoRmlsZUhhbmRsZTogY2xpZW50U29ja2V0XTsKLSAgICAgICAgaWQ8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yID0gW21Qcm9jZXNzb3JGYWN0b3J5IHByb2Nlc3NvckZvclRyYW5zcG9ydDogdHJhbnNwb3J0XTsKLSAgICAgICAgCi0gICAgICAgIGlkIDxUUHJvdG9jb2w+IGluUHJvdG9jb2wgPSBbbUlucHV0UHJvdG9jb2xGYWN0b3J5IG5ld1Byb3RvY29sT25UcmFuc3BvcnQ6IHRyYW5zcG9ydF07Ci0gICAgICAgIGlkIDxUUHJvdG9jb2w+IG91dFByb3RvY29sID0gW21PdXRwdXRQcm90b2NvbEZhY3RvcnkgbmV3UHJvdG9jb2xPblRyYW5zcG9ydDogdHJhbnNwb3J0XTsKLSAgICAgICAgCi0gICAgICAgIEB0cnkgewotICAgICAgICAgICAgQk9PTCByZXN1bHQgPSBOTzsKLSAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICBAYXV0b3JlbGVhc2Vwb29sIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gW3Byb2Nlc3NvciBwcm9jZXNzT25JbnB1dFByb3RvY29sOiBpblByb3RvY29sIG91dHB1dFByb3RvY29sOiBvdXRQcm90b2NvbF07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSB3aGlsZSAocmVzdWx0KTsKLSAgICAgICAgfQotICAgICAgICBAY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gKiB0ZSkgewotICAgICAgICAgICAgLy9OU0xvZyhAIkNhdWdodCB0cmFuc3BvcnQgZXhjZXB0aW9uLCBhYmFuZG9uaW5nIGNsaWVudCBjb25uZWN0aW9uOiAlQCIsIHRlKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgTlNOb3RpZmljYXRpb24gKiBuID0gW05TTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbldpdGhOYW1lOiBrVFNvY2tldFNlcnZlcl9DbGllbnRDb25uZWN0aW9uRmluaXNoZWRGb3JQcm9jZXNzb3JOb3RpZmljYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0OiBzZWxmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySW5mbzogW05TRGljdGlvbmFyeSBkaWN0aW9uYXJ5V2l0aE9iamVjdHNBbmRLZXlzOiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrVFNvY2tldFNlcnZlcl9Qcm9jZXNzb3JLZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1RTb2NrZXJTZXJ2ZXJfVHJhbnNwb3J0S2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuaWxdXTsKLSAgICAgICAgW1tOU05vdGlmaWNhdGlvbkNlbnRlciBkZWZhdWx0Q2VudGVyXSBwZXJmb3JtU2VsZWN0b3JPbk1haW5UaHJlYWQ6IEBzZWxlY3Rvcihwb3N0Tm90aWZpY2F0aW9uOikgd2l0aE9iamVjdDogbiB3YWl0VW50aWxEb25lOiBZRVNdOwotICAgICAgICAKKyAgICBzaXplX3QgbnVsbFRlcm1pbmF0ZWRQYXRoTGVuZ3RoID0gcGF0aC5sZW5ndGggKyAxOworICAgIHN0cnVjdCBzb2NrYWRkcl91biBhZGRyOworICAgIGlmIChudWxsVGVybWluYXRlZFBhdGhMZW5ndGg+IHNpemVvZihhZGRyLnN1bl9wYXRoKSkgeworICAgICAgTlNMb2coQCJUU29ja2V0U2VydmVyOiBVbmFibGUgdG8gY3JlYXRlIHNvY2tldCBhdCBwYXRoICVALiBQYXRoIGlzIHRvbyBsb25nLiIsIHBhdGgpOworICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotI2Vsc2UKLSAgTlNBdXRvcmVsZWFzZVBvb2wgKiBwb29sID0gW1tOU0F1dG9yZWxlYXNlUG9vbCBhbGxvY10gaW5pdF07Ci0gIAotICBUTlNGaWxlSGFuZGxlVHJhbnNwb3J0ICogdHJhbnNwb3J0ID0gW1tUTlNGaWxlSGFuZGxlVHJhbnNwb3J0IGFsbG9jXSBpbml0V2l0aEZpbGVIYW5kbGU6IGNsaWVudFNvY2tldF07Ci0gIGlkPFRQcm9jZXNzb3I+IHByb2Nlc3NvciA9IFttUHJvY2Vzc29yRmFjdG9yeSBwcm9jZXNzb3JGb3JUcmFuc3BvcnQ6IHRyYW5zcG9ydF07Ci0gIAotICBpZCA8VFByb3RvY29sPiBpblByb3RvY29sID0gW1ttSW5wdXRQcm90b2NvbEZhY3RvcnkgbmV3UHJvdG9jb2xPblRyYW5zcG9ydDogdHJhbnNwb3J0XSBhdXRvcmVsZWFzZV07Ci0gIGlkIDxUUHJvdG9jb2w+IG91dFByb3RvY29sID0gW1ttT3V0cHV0UHJvdG9jb2xGYWN0b3J5IG5ld1Byb3RvY29sT25UcmFuc3BvcnQ6IHRyYW5zcG9ydF0gYXV0b3JlbGVhc2VdOwogCi0gIEB0cnkgewotICAgIEJPT0wgcmVzdWx0ID0gTk87Ci0gICAgZG8gewotICAgICAgTlNBdXRvcmVsZWFzZVBvb2wgKiBteVBvb2wgPSBbW05TQXV0b3JlbGVhc2VQb29sIGFsbG9jXSBpbml0XTsKLSAgICAgIHJlc3VsdCA9IFtwcm9jZXNzb3IgcHJvY2Vzc09uSW5wdXRQcm90b2NvbDogaW5Qcm90b2NvbCBvdXRwdXRQcm90b2NvbDogb3V0UHJvdG9jb2xdOwotICAgICAgW215UG9vbCByZWxlYXNlXTsKLSAgICB9IHdoaWxlIChyZXN1bHQpOwotICB9Ci0gIEBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiAqIHRlKSB7Ci0gICAgLy9OU0xvZyhAIkNhdWdodCB0cmFuc3BvcnQgZXhjZXB0aW9uLCBhYmFuZG9uaW5nIGNsaWVudCBjb25uZWN0aW9uOiAlQCIsIHRlKTsKLSAgfQorICAgIGFkZHIuc3VuX2ZhbWlseSA9IEFGX0xPQ0FMOworICAgIG1lbWNweShhZGRyLnN1bl9wYXRoLCBwYXRoLlVURjhTdHJpbmcsIG51bGxUZXJtaW5hdGVkUGF0aExlbmd0aCk7CisgICAgYWRkci5zdW5fbGVuID0gU1VOX0xFTigmYWRkcik7CiAKLSAgTlNOb3RpZmljYXRpb24gKiBuID0gW05TTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbldpdGhOYW1lOiBrVFNvY2tldFNlcnZlcl9DbGllbnRDb25uZWN0aW9uRmluaXNoZWRGb3JQcm9jZXNzb3JOb3RpZmljYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0OiBzZWxmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySW5mbzogW05TRGljdGlvbmFyeSBkaWN0aW9uYXJ5V2l0aE9iamVjdHNBbmRLZXlzOiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrVFNvY2tldFNlcnZlcl9Qcm9jZXNzb3JLZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1RTb2NrZXJTZXJ2ZXJfVHJhbnNwb3J0S2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuaWxdXTsKLSAgW1tOU05vdGlmaWNhdGlvbkNlbnRlciBkZWZhdWx0Q2VudGVyXSBwZXJmb3JtU2VsZWN0b3JPbk1haW5UaHJlYWQ6IEBzZWxlY3Rvcihwb3N0Tm90aWZpY2F0aW9uOikgd2l0aE9iamVjdDogbiB3YWl0VW50aWxEb25lOiBZRVNdOwotICAKLSAgW3Bvb2wgcmVsZWFzZV07Ci0jZW5kaWYKKyAgICBOU0RhdGEgKmFkZHJlc3MgPSBbTlNEYXRhIGRhdGFXaXRoQnl0ZXM6JmFkZHIgbGVuZ3RoOnNpemVvZihhZGRyKV07CisgICAgaWYgKENGU29ja2V0U2V0QWRkcmVzcyhzb2NrZXQsIChfX2JyaWRnZSBDRkRhdGFSZWYpYWRkcmVzcykgIT0ga0NGU29ja2V0U3VjY2VzcykgeworICAgICAgQ0ZTb2NrZXRJbnZhbGlkYXRlKHNvY2tldCk7CisgICAgICBDRlJlbGVhc2Uoc29ja2V0KTsKKyAgICAgIE5TTG9nKEAiVFNvY2tldFNlcnZlcjogQ291bGQgbm90IGJpbmQgdG8gYWRkcmVzcyIpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIHNvY2tldDsKKyAgfSBlbHNlIHsKKyAgICBOU0xvZyhAIlRTb2NrZXRTZXJ2ZXI6IE5vIHNlcnZlciBzb2NrZXQiKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorfQorCistKHZvaWQpIGRlYWxsb2MKK3sKKyAgW1tOU05vdGlmaWNhdGlvbkNlbnRlciBkZWZhdWx0Q2VudGVyXSByZW1vdmVPYnNlcnZlcjpzZWxmXTsKKworICBpZiAoX2RvbWFpblNvY2tldFBhdGggIT0gbmlsKSB7CisgICAgdW5saW5rKF9kb21haW5Tb2NrZXRQYXRoLlVURjhTdHJpbmcpOworICB9CiB9CiAKIAorLSh2b2lkKSBjb25uZWN0aW9uQWNjZXB0ZWQ6KE5TTm90aWZpY2F0aW9uICopbm90aWZpY2F0aW9uCit7CisgIE5TRmlsZUhhbmRsZSAqc29ja2V0ID0gW25vdGlmaWNhdGlvbi51c2VySW5mbyBvYmplY3RGb3JLZXk6TlNGaWxlSGFuZGxlTm90aWZpY2F0aW9uRmlsZUhhbmRsZUl0ZW1dOworCisgIC8vIE5vdyB0aGF0IHdlIGhhdmUgYSBjbGllbnQgY29ubmVjdGVkLCBoYW5kbGUgcmVxdWVzdCBvbiBxdWV1ZQorICBkaXNwYXRjaF9hc3luYyhfcHJvY2Vzc2luZ1F1ZXVlLCBeeworCisgICAgW3NlbGYgaGFuZGxlQ2xpZW50Q29ubmVjdGlvbjpzb2NrZXRdOworCisgIH0pOworCisgIC8vIENvbnRpbnVlIGFjY2VwdGluZyBjb25uZWN0aW9ucworICBbX3NvY2tldEZpbGVIYW5kbGUgYWNjZXB0Q29ubmVjdGlvbkluQmFja2dyb3VuZEFuZE5vdGlmeV07Cit9CisKKworLSh2b2lkKSBoYW5kbGVDbGllbnRDb25uZWN0aW9uOihOU0ZpbGVIYW5kbGUgKiljbGllbnRTb2NrZXQKK3sKKyAgQGF1dG9yZWxlYXNlcG9vbCB7CisKKyAgICBUTlNGaWxlSGFuZGxlVHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBbW1ROU0ZpbGVIYW5kbGVUcmFuc3BvcnQgYWxsb2NdIGluaXRXaXRoRmlsZUhhbmRsZTpjbGllbnRTb2NrZXRdOworICAgIGlkPFRQcm9jZXNzb3I+IHByb2Nlc3NvciA9IFtfcHJvY2Vzc29yRmFjdG9yeSBwcm9jZXNzb3JGb3JUcmFuc3BvcnQ6dHJhbnNwb3J0XTsKKworICAgIGlkIDxUUHJvdG9jb2w+IGluUHJvdG9jb2wgPSBbX2lucHV0UHJvdG9jb2xGYWN0b3J5IG5ld1Byb3RvY29sT25UcmFuc3BvcnQ6dHJhbnNwb3J0XTsKKyAgICBpZCA8VFByb3RvY29sPiBvdXRQcm90b2NvbCA9IFtfb3V0cHV0UHJvdG9jb2xGYWN0b3J5IG5ld1Byb3RvY29sT25UcmFuc3BvcnQ6dHJhbnNwb3J0XTsKKworICAgIE5TRXJyb3IgKmVycm9yOworICAgIGlmICghW3Byb2Nlc3NvciBwcm9jZXNzT25JbnB1dFByb3RvY29sOmluUHJvdG9jb2wgb3V0cHV0UHJvdG9jb2w6b3V0UHJvdG9jb2wgZXJyb3I6JmVycm9yXSkgeworICAgICAgLy8gSGFuZGxlIGVycm9yCisgICAgICBOU0xvZyhAIkVycm9yIHByb2Nlc3NpbmcgcmVxdWVzdDogJUAiLCBlcnJvcik7CisgICAgfQorCisgICAgZGlzcGF0Y2hfYXN5bmMoZGlzcGF0Y2hfZ2V0X21haW5fcXVldWUoKSwgXnsKKworICAgICAgW05TTm90aWZpY2F0aW9uQ2VudGVyLmRlZmF1bHRDZW50ZXIgcG9zdE5vdGlmaWNhdGlvbk5hbWU6VFNvY2tldFNlcnZlckNsaWVudENvbm5lY3Rpb25GaW5pc2hlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Q6c2VsZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckluZm86QHtUU29ja2V0U2VydmVyUHJvY2Vzc29yS2V5OiBwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRTb2NrZXJTZXJ2ZXJUcmFuc3BvcnRLZXk6IHRyYW5zcG9ydH1dOworICAgIH0pOworCisgIH0KK30KIAogQGVuZAotCi0KLQpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVEFzeW5jVHJhbnNwb3J0LmggYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UQXN5bmNUcmFuc3BvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWI0ZmJkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVEFzeW5jVHJhbnNwb3J0LmgKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW1wb3J0ICJUVHJhbnNwb3J0LmgiCisKK05TX0FTU1VNRV9OT05OVUxMX0JFR0lOCisKKworQHByb3RvY29sIFRBc3luY1RyYW5zcG9ydDsKKworCitAcHJvdG9jb2wgVEFzeW5jVHJhbnNwb3J0RmFjdG9yeSA8TlNPYmplY3Q+CisKKy0oaWQ8VEFzeW5jVHJhbnNwb3J0PikgbmV3VHJhbnNwb3J0OworCitAZW5kCisKKwordHlwZWRlZiB2b2lkICheVEFzeW5jQ29tcGxldGlvbkJsb2NrKSgpOwordHlwZWRlZiB2b2lkICheVEFzeW5jRmFpbHVyZUJsb2NrKShOU0Vycm9yICogX19ub25udWxsKTsKKworCitAcHJvdG9jb2wgVEFzeW5jVHJhbnNwb3J0IDxUVHJhbnNwb3J0PgorCistKHZvaWQpIGZsdXNoV2l0aENvbXBsZXRpb246KFRBc3luY0NvbXBsZXRpb25CbG9jayljb21wbGV0ZWQgZmFpbHVyZTooVEFzeW5jRmFpbHVyZUJsb2NrKWZhaWx1cmU7CisKK0BlbmQKKworCitOU19BU1NVTUVfTk9OTlVMTF9FTkQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9URnJhbWVkVHJhbnNwb3J0LmggYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9URnJhbWVkVHJhbnNwb3J0LmgKaW5kZXggZmMzODg3Ny4uZWE2OGFjNCAxMDA2NDQKLS0tIGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVEZyYW1lZFRyYW5zcG9ydC5oCisrKyBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnQuaApAQCAtMjAsMTAgKzIwLDE0IEBACiAjaW1wb3J0IDxGb3VuZGF0aW9uL0ZvdW5kYXRpb24uaD4KICNpbXBvcnQgIlRUcmFuc3BvcnQuaCIKIAotQGludGVyZmFjZSBURnJhbWVkVHJhbnNwb3J0IDogTlNPYmplY3QgPFRUcmFuc3BvcnQ+IHsKLSAgICBpZCA8VFRyYW5zcG9ydD4gbVRyYW5zcG9ydDsKLX0KK05TX0FTU1VNRV9OT05OVUxMX0JFR0lOCiAKLS0gKGlkKSBpbml0V2l0aFRyYW5zcG9ydDogKGlkIDxUVHJhbnNwb3J0PikgdHJhbnNwb3J0OworCitAaW50ZXJmYWNlIFRGcmFtZWRUcmFuc3BvcnQgOiBOU09iamVjdCA8VFRyYW5zcG9ydD4KKworLShpZCkgaW5pdFdpdGhUcmFuc3BvcnQ6KGlkIDxUVHJhbnNwb3J0Pil0cmFuc3BvcnQ7CiAKIEBlbmQKKworCitOU19BU1NVTUVfTk9OTlVMTF9FTkQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnQubSBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnQubQppbmRleCAwODVmOWI2Li40ZGI2NWM0IDEwMDY0NAotLS0gYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9URnJhbWVkVHJhbnNwb3J0Lm0KKysrIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVEZyYW1lZFRyYW5zcG9ydC5tCkBAIC0xOCwxMDkgKzE4LDE2MyBAQAogICovCiAKICNpbXBvcnQgIlRGcmFtZWRUcmFuc3BvcnQuaCIKLSNpbXBvcnQgIlRUcmFuc3BvcnRFeGNlcHRpb24uaCIKLSNpbXBvcnQgIlRPYmplY3RpdmUtQy5oIgorI2ltcG9ydCAiVFRyYW5zcG9ydEVycm9yLmgiCiAKICNkZWZpbmUgSEVBREVSX1NJWkUgNAogI2RlZmluZSBJTklUX0ZSQU1FX1NJWkUgMTAyNAogCi1AaW1wbGVtZW50YXRpb24gVEZyYW1lZFRyYW5zcG9ydCB7Ci0gICAgTlNNdXRhYmxlRGF0YSogd3JpdGVCdWZmZXI7Ci0gICAgTlNNdXRhYmxlRGF0YSogcmVhZEJ1ZmZlcjsKLSAgICBOU1VJbnRlZ2VyIHJlYWRPZmZzZXQ7Ci0gICAgdWludDhfdCBkdW1teV9oZWFkZXJbSEVBREVSX1NJWkVdOwotfQogCi0tIChpZCkgaW5pdFdpdGhUcmFuc3BvcnQ6KGlkIDxUVHJhbnNwb3J0Pil0cmFuc3BvcnQKK0BpbnRlcmZhY2UgVEZyYW1lZFRyYW5zcG9ydCAoKQorCitAcHJvcGVydHkoc3Ryb25nLCBub25hdG9taWMpIGlkPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydDsKK0Bwcm9wZXJ0eShzdHJvbmcsIG5vbmF0b21pYykgTlNNdXRhYmxlRGF0YSAqd3JpdGVCdWZmZXI7CitAcHJvcGVydHkoc3Ryb25nLCBub25hdG9taWMpIE5TTXV0YWJsZURhdGEgKnJlYWRCdWZmZXI7CitAcHJvcGVydHkoYXNzaWduLCBub25hdG9taWMpIE5TVUludGVnZXIgcmVhZE9mZnNldDsKKworQGVuZAorCisKK0BpbXBsZW1lbnRhdGlvbiBURnJhbWVkVHJhbnNwb3J0CisKKy0oaWQpIGluaXRXaXRoVHJhbnNwb3J0OihpZCA8VFRyYW5zcG9ydD4pYVRyYW5zcG9ydAogewotICAgIG1UcmFuc3BvcnQgPSBbdHJhbnNwb3J0IHJldGFpbl9zdHViXTsKLSAgICByZWFkQnVmZmVyID0gbmlsOwotICAgIHJlYWRPZmZzZXQgPSAwOwotICAgIHdyaXRlQnVmZmVyID0gW1tOU011dGFibGVEYXRhIGFsbG9jXSBpbml0V2l0aENhcGFjaXR5OklOSVRfRlJBTUVfU0laRV07Ci0gICAgW3dyaXRlQnVmZmVyIGFwcGVuZEJ5dGVzOmR1bW15X2hlYWRlciBsZW5ndGg6SEVBREVSX1NJWkVdOwotICAgIHJldHVybiBzZWxmOworICBpZiAoKHNlbGYgPSBbc2VsZiBpbml0XSkpIHsKKyAgICBfdHJhbnNwb3J0ID0gYVRyYW5zcG9ydDsKKyAgICBfcmVhZEJ1ZmZlciA9IG5pbDsKKyAgICBfcmVhZE9mZnNldCA9IDA7CisgICAgX3dyaXRlQnVmZmVyID0gW05TTXV0YWJsZURhdGEgZGF0YVdpdGhMZW5ndGg6SEVBREVSX1NJWkVdOworICB9CisgIHJldHVybiBzZWxmOwogfQogCi0tICh2b2lkKSBkZWFsbG9jCistKEJPT0wpIGZsdXNoOihOU0Vycm9yICoqKWVycm9yCiB7Ci0gICAgW21UcmFuc3BvcnQgcmVsZWFzZV9zdHViXTsKLSAgICBbd3JpdGVCdWZmZXIgcmVsZWFzZV9zdHViXTsKLSAgICBpZiAocmVhZEJ1ZmZlciAhPSBuaWwpCi0gICAgICAgIFtyZWFkQnVmZmVyIHJlbGVhc2Vfc3R1Yl07Ci0gICAgW3N1cGVyIGRlYWxsb2Nfc3R1Yl07Ci19Ci0KLS0gKHZvaWQpZmx1c2gKLXsKLSAgICBpbnQgbGVuID0gW3dyaXRlQnVmZmVyIGxlbmd0aF07Ci0gICAgaW50IGRhdGFfbGVuID0gbGVuIC0gSEVBREVSX1NJWkU7Ci0gICAgaWYgKGRhdGFfbGVuIDwgMCkKLSAgICAgICAgQHRocm93IFtUVHJhbnNwb3J0RXhjZXB0aW9uIGV4Y2VwdGlvbldpdGhSZWFzb246QCJGcmFtZWQgdHJhbnNwb3J0IGJ1ZmZlciBoYXMgbm8gaGVhZGVyIl07Ci0KLSAgICB1aW50OF90IGkzMnJkW0hFQURFUl9TSVpFXTsKLSAgICBpMzJyZFswXSA9ICh1aW50OF90KSgweGZmICYgKGRhdGFfbGVuID4+IDI0KSk7Ci0gICAgaTMycmRbMV0gPSAodWludDhfdCkoMHhmZiAmIChkYXRhX2xlbiA+PiAxNikpOwotICAgIGkzMnJkWzJdID0gKHVpbnQ4X3QpKDB4ZmYgJiAoZGF0YV9sZW4gPj4gOCkpOwotICAgIGkzMnJkWzNdID0gKHVpbnQ4X3QpKDB4ZmYgJiAoZGF0YV9sZW4pKTsKLQotICAgIC8vIHNob3VsZCB3ZSBtYWtlIGEgY29weSBvZiB0aGUgd3JpdGVCdWZmZXIgaW5zdGVhZD8gQmV0dGVyIGZvciB0aHJlYWRlZCBvcGVyYXRpb25zIQotICAgIFt3cml0ZUJ1ZmZlciByZXBsYWNlQnl0ZXNJblJhbmdlOk5TTWFrZVJhbmdlKDAsIEhFQURFUl9TSVpFKSB3aXRoQnl0ZXM6aTMycmQgbGVuZ3RoOkhFQURFUl9TSVpFXTsKLSAgICBbbVRyYW5zcG9ydCB3cml0ZTpbd3JpdGVCdWZmZXIgbXV0YWJsZUJ5dGVzXSBvZmZzZXQ6MCBsZW5ndGg6bGVuXTsKLSAgICBbbVRyYW5zcG9ydCBmbHVzaF07Ci0KLSAgICAvLyByZXVzZSBvbGQgbWVtb3J5IGJ1ZmZlcgotICAgIFt3cml0ZUJ1ZmZlciBzZXRMZW5ndGg6MF07Ci0gICAgW3dyaXRlQnVmZmVyIGFwcGVuZEJ5dGVzOmR1bW15X2hlYWRlciBsZW5ndGg6SEVBREVSX1NJWkVdOwotfQotCi0tICh2b2lkKXdyaXRlOihjb25zdCB1aW50OF90ICopZGF0YSBvZmZzZXQ6KHVuc2lnbmVkIGludClvZmZzZXQgbGVuZ3RoOih1bnNpZ25lZCBpbnQpbGVuZ3RoCi17Ci0gICAgW3dyaXRlQnVmZmVyIGFwcGVuZEJ5dGVzOmRhdGErb2Zmc2V0IGxlbmd0aDpsZW5ndGhdOwotfQotCi0tIChpbnQpcmVhZEFsbDoodWludDhfdCAqKWJ1ZiBvZmZzZXQ6KGludClvZmYgbGVuZ3RoOihpbnQpbGVuIHsKLSAgICBpZiAocmVhZEJ1ZmZlciA9PSBuaWwpIHsKLSAgICAgICAgW3NlbGYgcmVhZEZyYW1lXTsKKyAgaW50IGxlbiA9IChpbnQpW193cml0ZUJ1ZmZlciBsZW5ndGhdOworICBpbnQgZGF0YV9sZW4gPSBsZW4gLSBIRUFERVJfU0laRTsKKyAgaWYgKGRhdGFfbGVuIDwgMCkgeworICAgIGlmIChlcnJvcikgeworICAgICAgKmVycm9yID0gW05TRXJyb3IgZXJyb3JXaXRoRG9tYWluOlRUcmFuc3BvcnRFcnJvckRvbWFpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOlRUcmFuc3BvcnRFcnJvclVua25vd24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySW5mbzpAe31dOwogICAgIH0KLSAgICAKLSAgICBpZiAocmVhZEJ1ZmZlciAhPSBuaWwpIHsKLSAgICAgICAgaW50IGJ1ZmZlcl9sZW4gPSBbcmVhZEJ1ZmZlciBsZW5ndGhdOwotICAgICAgICBpZiAoYnVmZmVyX2xlbi1yZWFkT2Zmc2V0ID49IGxlbikgewotICAgICAgICAgICAgW3JlYWRCdWZmZXIgZ2V0Qnl0ZXM6YnVmIHJhbmdlOk5TTWFrZVJhbmdlKHJlYWRPZmZzZXQsbGVuKV07IC8vIGNvcHkgZGF0YQotICAgICAgICAgICAgcmVhZE9mZnNldCArPSBsZW47Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyB2b2lkIHRoZSBwcmV2aW91cyByZWFkQnVmZmVyIGRhdGEgYW5kIHJlcXVlc3QgYSBuZXcgZnJhbWUKLSAgICAgICAgICAgIFtzZWxmIHJlYWRGcmFtZV07Ci0gICAgICAgICAgICBbcmVhZEJ1ZmZlciBnZXRCeXRlczpidWYgcmFuZ2U6TlNNYWtlUmFuZ2UoMCxsZW4pXTsgLy8gY29weSBkYXRhCi0gICAgICAgICAgICByZWFkT2Zmc2V0ID0gbGVuOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBsZW47CisgICAgcmV0dXJuIE5POworICB9CisKKyAgVUludDggaTMycmRbSEVBREVSX1NJWkVdOworICBpMzJyZFswXSA9IChVSW50OCkoMHhmZiAmIChkYXRhX2xlbiA+PiAyNCkpOworICBpMzJyZFsxXSA9IChVSW50OCkoMHhmZiAmIChkYXRhX2xlbiA+PiAxNikpOworICBpMzJyZFsyXSA9IChVSW50OCkoMHhmZiAmIChkYXRhX2xlbiA+PiA4KSk7CisgIGkzMnJkWzNdID0gKFVJbnQ4KSgweGZmICYgKGRhdGFfbGVuKSk7CisKKyAgLy8gc2hvdWxkIHdlIG1ha2UgYSBjb3B5IG9mIHRoZSB3cml0ZUJ1ZmZlciBpbnN0ZWFkPyBCZXR0ZXIgZm9yIHRocmVhZGVkCisgIC8vICBvcGVyYXRpb25zIQorICBbX3dyaXRlQnVmZmVyIHJlcGxhY2VCeXRlc0luUmFuZ2U6TlNNYWtlUmFuZ2UoMCwgSEVBREVSX1NJWkUpCisgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhCeXRlczppMzJyZCBsZW5ndGg6SEVBREVSX1NJWkVdOworCisgIGlmICghW190cmFuc3BvcnQgd3JpdGU6X3dyaXRlQnVmZmVyLm11dGFibGVCeXRlcyBvZmZzZXQ6MCBsZW5ndGg6bGVuIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgIGlmICghW190cmFuc3BvcnQgZmx1c2g6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisKKyAgX3dyaXRlQnVmZmVyLmxlbmd0aCA9IEhFQURFUl9TSVpFOworCisgIHJldHVybiBZRVM7CiB9CiAKLS0gKHZvaWQpcmVhZEZyYW1lCistKEJPT0wpIHdyaXRlOihjb25zdCBVSW50OCAqKWRhdGEgb2Zmc2V0OihVSW50MzIpb2Zmc2V0IGxlbmd0aDooVUludDMyKWxlbmd0aCBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgICB1aW50OF90IGkzMnJkW0hFQURFUl9TSVpFXTsKLSAgICBbbVRyYW5zcG9ydCByZWFkQWxsOiBpMzJyZCBvZmZzZXQ6IDAgbGVuZ3RoOiBIRUFERVJfU0laRV07Ci0gICAgaW50IHNpemUgPQotICAgICAgICAoKGkzMnJkWzBdICYgMHhmZikgPDwgMjQpIHwKLSAgICAgICAgKChpMzJyZFsxXSAmIDB4ZmYpIDw8IDE2KSB8Ci0gICAgICAgICgoaTMycmRbMl0gJiAweGZmKSA8PCAgOCkgfAotICAgICAgICAoKGkzMnJkWzNdICYgMHhmZikpOworICBbX3dyaXRlQnVmZmVyIGFwcGVuZEJ5dGVzOmRhdGErb2Zmc2V0IGxlbmd0aDpsZW5ndGhdOwogCi0gICAgaWYgKHJlYWRCdWZmZXIgPT0gbmlsKSB7Ci0gICAgICAgIHJlYWRCdWZmZXIgPSBbW05TTXV0YWJsZURhdGEgYWxsb2NdIGluaXRXaXRoTGVuZ3RoOnNpemVdOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGludCBsZW4gPSBbcmVhZEJ1ZmZlciBsZW5ndGhdOwotICAgICAgICBpZiAobGVuID49IHNpemUpIHsKLSAgICAgICAgICAgIFtyZWFkQnVmZmVyIHNldExlbmd0aDpzaXplXTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIGluY3JlYXNlIGxlbmd0aCBvZiBkYXRhIGJ1ZmZlcgotICAgICAgICAgICAgW3JlYWRCdWZmZXIgaW5jcmVhc2VMZW5ndGhCeTpzaXplLWxlbl07Ci0gICAgICAgIH0KKyAgcmV0dXJuIFlFUzsKK30KKworLShCT09MKSByZWFkQWxsOihVSW50OCAqKW91dEJ1ZmZlciBvZmZzZXQ6KFVJbnQzMilvdXRCdWZmZXJPZmZzZXQgbGVuZ3RoOihVSW50MzIpbGVuZ3RoIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBVSW50MzIgZ290ID0gW3NlbGYgcmVhZEF2YWlsOm91dEJ1ZmZlciBvZmZzZXQ6b3V0QnVmZmVyT2Zmc2V0IG1heExlbmd0aDpsZW5ndGggZXJyb3I6ZXJyb3JdOworICBpZiAoZ290ICE9IGxlbmd0aCkgeworCisgICAgLy8gUmVwb3J0IHVuZGVyZmxvdyBvbmx5IGlmIHJlYWRBdmFpbCBkaWRuJ3QgcmVwb3J0IGVycm9yIGFscmVhZHkKKyAgICBpZiAoZXJyb3IgJiYgISplcnJvcikgeworICAgICAgKmVycm9yID0gW05TRXJyb3IgZXJyb3JXaXRoRG9tYWluOlRUcmFuc3BvcnRFcnJvckRvbWFpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOlRUcmFuc3BvcnRFcnJvckVuZE9mRmlsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvOm5pbF07CiAgICAgfQotICAgIC8vIGNvcHkgaW50byBpbnRlcm5hbCBtZW1vcnkgYnVmZmVyCi0gICAgW21UcmFuc3BvcnQgcmVhZEFsbDpbcmVhZEJ1ZmZlciBtdXRhYmxlQnl0ZXNdIG9mZnNldDowIGxlbmd0aDpzaXplXTsKKworICAgIHJldHVybiBOTzsKKyAgfQorCisgIHJldHVybiBZRVM7Cit9CisKKy0oVUludDMyKSByZWFkQXZhaWw6KFVJbnQ4ICopb3V0QnVmZmVyIG9mZnNldDooVUludDMyKW91dEJ1ZmZlck9mZnNldCBtYXhMZW5ndGg6KFVJbnQzMilsZW5ndGggZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFVJbnQzMiBnb3QgPSAwOworICB3aGlsZSAoZ290IDwgbGVuZ3RoKSB7CisKKyAgICBOU1VJbnRlZ2VyIGF2YWlsID0gX3JlYWRCdWZmZXIubGVuZ3RoIC0gX3JlYWRPZmZzZXQ7CisgICAgaWYgKGF2YWlsID09IDApIHsKKyAgICAgIGlmICghW3NlbGYgcmVhZEZyYW1lOmVycm9yXSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICAgIGF2YWlsID0gX3JlYWRCdWZmZXIubGVuZ3RoOworICAgIH0KKworICAgIE5TUmFuZ2UgcmFuZ2U7CisgICAgcmFuZ2UubG9jYXRpb24gPSBfcmVhZE9mZnNldDsKKyAgICByYW5nZS5sZW5ndGggPSBNSU4obGVuZ3RoIC0gZ290LCBhdmFpbCk7CisKKyAgICBbX3JlYWRCdWZmZXIgZ2V0Qnl0ZXM6b3V0QnVmZmVyK291dEJ1ZmZlck9mZnNldCtnb3QgcmFuZ2U6cmFuZ2VdOworICAgIF9yZWFkT2Zmc2V0ICs9IHJhbmdlLmxlbmd0aDsKKyAgICBnb3QgKz0gcmFuZ2UubGVuZ3RoOworICB9CisKKyAgcmV0dXJuIGdvdDsKK30KKworLShCT09MKSByZWFkRnJhbWU6KE5TRXJyb3IgKiopZXJyb3IKK3sKKyAgVUludDggaTMycmRbSEVBREVSX1NJWkVdOworICBpZiAoIVtfdHJhbnNwb3J0IHJlYWRBbGw6aTMycmQgb2Zmc2V0OjAgbGVuZ3RoOkhFQURFUl9TSVpFIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgIFNJbnQzMiBzaXplID0KKyAgICAoKGkzMnJkWzBdICYgMHhmZikgPDwgMjQpIHwKKyAgICAoKGkzMnJkWzFdICYgMHhmZikgPDwgMTYpIHwKKyAgICAoKGkzMnJkWzJdICYgMHhmZikgPDwgIDgpIHwKKyAgICAoKGkzMnJkWzNdICYgMHhmZikpOworCisgIGlmIChfcmVhZEJ1ZmZlciA9PSBuaWwpIHsKKworICAgIF9yZWFkQnVmZmVyID0gW05TTXV0YWJsZURhdGEgZGF0YVdpdGhMZW5ndGg6c2l6ZV07CisKKyAgfQorICBlbHNlIHsKKworICAgIFNJbnQzMiBsZW4gPSAoU0ludDMyKV9yZWFkQnVmZmVyLmxlbmd0aDsKKyAgICBpZiAobGVuID49IHNpemUpIHsKKworICAgICAgX3JlYWRCdWZmZXIubGVuZ3RoID0gc2l6ZTsKKworICAgIH0KKyAgICBlbHNlIHsKKworICAgICAgLy8gaW5jcmVhc2UgbGVuZ3RoIG9mIGRhdGEgYnVmZmVyCisgICAgICBbX3JlYWRCdWZmZXIgaW5jcmVhc2VMZW5ndGhCeTpzaXplLWxlbl07CisKKyAgICB9CisKKyAgfQorCisgIC8vIGNvcHkgaW50byBpbnRlcm5hbCBtZW1vcnkgYnVmZmVyCisgIGlmICghW190cmFuc3BvcnQgcmVhZEFsbDpfcmVhZEJ1ZmZlci5tdXRhYmxlQnl0ZXMgb2Zmc2V0OjAgbGVuZ3RoOnNpemUgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisKKyAgcmV0dXJuIFlFUzsKIH0KIAogQGVuZApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVEhUVFBDbGllbnQuaCBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RIVFRQQ2xpZW50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkNTc4NDAuLjAwMDAwMDAKLS0tIGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVEhUVFBDbGllbnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2ltcG9ydCA8Rm91bmRhdGlvbi9Gb3VuZGF0aW9uLmg+Ci0jaW1wb3J0ICJUVHJhbnNwb3J0LmgiCi0KLUBpbnRlcmZhY2UgVEhUVFBDbGllbnQgOiBOU09iamVjdCA8VFRyYW5zcG9ydD4gewotICBOU1VSTCAqIG1VUkw7Ci0gIE5TTXV0YWJsZVVSTFJlcXVlc3QgKiBtUmVxdWVzdDsKLSAgTlNNdXRhYmxlRGF0YSAqIG1SZXF1ZXN0RGF0YTsKLSAgTlNEYXRhICogbVJlc3BvbnNlRGF0YTsKLSAgaW50IG1SZXNwb25zZURhdGFPZmZzZXQ7Ci0gIE5TU3RyaW5nICogbVVzZXJBZ2VudDsKLSAgaW50IG1UaW1lb3V0OwotfQotCi0tIChpZCkgaW5pdFdpdGhVUkw6IChOU1VSTCAqKSBhVVJMOwotCi0tIChpZCkgaW5pdFdpdGhVUkw6IChOU1VSTCAqKSBhVVJMCi0gICAgICAgICB1c2VyQWdlbnQ6IChOU1N0cmluZyAqKSB1c2VyQWdlbnQKLSAgICAgICAgICAgdGltZW91dDogKGludCkgdGltZW91dDsKLQotLSAodm9pZCkgc2V0VVJMOiAoTlNVUkwgKikgYVVSTDsKLQotQGVuZAotCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9USFRUUENsaWVudC5tIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVEhUVFBDbGllbnQubQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTYxN2Q0NS4uMDAwMDAwMAotLS0gYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9USFRUUENsaWVudC5tCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2ltcG9ydCAiVEhUVFBDbGllbnQuaCIKLSNpbXBvcnQgIlRUcmFuc3BvcnRFeGNlcHRpb24uaCIKLSNpbXBvcnQgIlRPYmplY3RpdmUtQy5oIgotCi1AaW1wbGVtZW50YXRpb24gVEhUVFBDbGllbnQKLQotCi0tICh2b2lkKSBzZXR1cFJlcXVlc3QKLXsKLSAgaWYgKG1SZXF1ZXN0ICE9IG5pbCkgewotICAgIFttUmVxdWVzdCByZWxlYXNlX3N0dWJdOwotICB9Ci0KLSAgLy8gc2V0IHVwIG91ciByZXF1ZXN0IG9iamVjdCB0aGF0IHdlJ2xsIHVzZSBmb3IgZWFjaCByZXF1ZXN0Ci0gIG1SZXF1ZXN0ID0gW1tOU011dGFibGVVUkxSZXF1ZXN0IGFsbG9jXSBpbml0V2l0aFVSTDogbVVSTF07Ci0gIFttUmVxdWVzdCBzZXRIVFRQTWV0aG9kOiBAIlBPU1QiXTsKLSAgW21SZXF1ZXN0IHNldFZhbHVlOiBAImFwcGxpY2F0aW9uL3gtdGhyaWZ0IiBmb3JIVFRQSGVhZGVyRmllbGQ6IEAiQ29udGVudC1UeXBlIl07Ci0gIFttUmVxdWVzdCBzZXRWYWx1ZTogQCJhcHBsaWNhdGlvbi94LXRocmlmdCIgZm9ySFRUUEhlYWRlckZpZWxkOiBAIkFjY2VwdCJdOwotCi0gIE5TU3RyaW5nICogdXNlckFnZW50ID0gbVVzZXJBZ2VudDsKLSAgaWYgKCF1c2VyQWdlbnQpIHsKLSAgICB1c2VyQWdlbnQgPSBAIkNvY29hL1RIVFRQQ2xpZW50IjsKLSAgfQotICBbbVJlcXVlc3Qgc2V0VmFsdWU6IHVzZXJBZ2VudCBmb3JIVFRQSGVhZGVyRmllbGQ6IEAiVXNlci1BZ2VudCJdOwotCi0gIFttUmVxdWVzdCBzZXRDYWNoZVBvbGljeTogTlNVUkxSZXF1ZXN0UmVsb2FkSWdub3JpbmdDYWNoZURhdGFdOwotICBpZiAobVRpbWVvdXQpIHsKLSAgICBbbVJlcXVlc3Qgc2V0VGltZW91dEludGVydmFsOiBtVGltZW91dF07Ci0gIH0KLX0KLQotCi0tIChpZCkgaW5pdFdpdGhVUkw6IChOU1VSTCAqKSBhVVJMCi17Ci0gIHJldHVybiBbc2VsZiBpbml0V2l0aFVSTDogYVVSTAotICAgICAgICAgICAgICAgICB1c2VyQWdlbnQ6IG5pbAotICAgICAgICAgICAgICAgICAgIHRpbWVvdXQ6IDBdOwotfQotCi0KLS0gKGlkKSBpbml0V2l0aFVSTDogKE5TVVJMICopIGFVUkwKLSAgICAgICAgIHVzZXJBZ2VudDogKE5TU3RyaW5nICopIHVzZXJBZ2VudAotICAgICAgICAgICB0aW1lb3V0OiAoaW50KSB0aW1lb3V0Ci17Ci0gIHNlbGYgPSBbc3VwZXIgaW5pdF07Ci0gIGlmICghc2VsZikgewotICAgIHJldHVybiBuaWw7Ci0gIH0KLQotICBtVGltZW91dCA9IHRpbWVvdXQ7Ci0gIGlmICh1c2VyQWdlbnQpIHsKLSAgICBtVXNlckFnZW50ID0gW3VzZXJBZ2VudCByZXRhaW5fc3R1Yl07Ci0gIH0KLSAgbVVSTCA9IFthVVJMIHJldGFpbl9zdHViXTsKLQotICBbc2VsZiBzZXR1cFJlcXVlc3RdOwotCi0gIC8vIGNyZWF0ZSBvdXIgcmVxdWVzdCBkYXRhIGJ1ZmZlcgotICBtUmVxdWVzdERhdGEgPSBbW05TTXV0YWJsZURhdGEgYWxsb2NdIGluaXRXaXRoQ2FwYWNpdHk6IDEwMjRdOwotCi0gIHJldHVybiBzZWxmOwotfQotCi0KLS0gKHZvaWQpIHNldFVSTDogKE5TVVJMICopIGFVUkwKLXsKLSAgW2FVUkwgcmV0YWluX3N0dWJdOwotICBbbVVSTCByZWxlYXNlX3N0dWJdOwotICBtVVJMID0gYVVSTDsKLQotICBbc2VsZiBzZXR1cFJlcXVlc3RdOwotfQotCi0KLS0gKHZvaWQpIGRlYWxsb2MKLXsKLSAgW21VUkwgcmVsZWFzZV9zdHViXTsKLSAgW21Vc2VyQWdlbnQgcmVsZWFzZV9zdHViXTsKLSAgW21SZXF1ZXN0IHJlbGVhc2Vfc3R1Yl07Ci0gIFttUmVxdWVzdERhdGEgcmVsZWFzZV9zdHViXTsKLSAgW21SZXNwb25zZURhdGEgcmVsZWFzZV9zdHViXTsKLSAgW3N1cGVyIGRlYWxsb2Nfc3R1Yl07Ci19Ci0KLQotLSAoaW50KSByZWFkQWxsOiAodWludDhfdCAqKSBidWYgb2Zmc2V0OiAoaW50KSBvZmYgbGVuZ3RoOiAoaW50KSBsZW4KLXsKLSAgTlNSYW5nZSByOwotICByLmxvY2F0aW9uID0gbVJlc3BvbnNlRGF0YU9mZnNldDsKLSAgci5sZW5ndGggPSBsZW47Ci0KLSAgW21SZXNwb25zZURhdGEgZ2V0Qnl0ZXM6IGJ1ZitvZmYgcmFuZ2U6IHJdOwotICBtUmVzcG9uc2VEYXRhT2Zmc2V0ICs9IGxlbjsKLQotICByZXR1cm4gbGVuOwotfQotCi0KLS0gKHZvaWQpIHdyaXRlOiAoY29uc3QgdWludDhfdCAqKSBkYXRhIG9mZnNldDogKHVuc2lnbmVkIGludCkgb2Zmc2V0IGxlbmd0aDogKHVuc2lnbmVkIGludCkgbGVuZ3RoCi17Ci0gIFttUmVxdWVzdERhdGEgYXBwZW5kQnl0ZXM6IGRhdGErb2Zmc2V0IGxlbmd0aDogbGVuZ3RoXTsKLX0KLQotCi0tICh2b2lkKSBmbHVzaAotewotICBbbVJlcXVlc3Qgc2V0SFRUUEJvZHk6IG1SZXF1ZXN0RGF0YV07IC8vIG5vdCBzdXJlIGlmIGl0IGNvcGllcyB0aGUgZGF0YQotCi0gIC8vIG1ha2UgdGhlIEhUVFAgcmVxdWVzdAotICBOU1VSTFJlc3BvbnNlICogcmVzcG9uc2U7Ci0gIE5TRXJyb3IgKiBlcnJvcjsKLSAgTlNEYXRhICogcmVzcG9uc2VEYXRhID0KLSAgICBbTlNVUkxDb25uZWN0aW9uIHNlbmRTeW5jaHJvbm91c1JlcXVlc3Q6IG1SZXF1ZXN0IHJldHVybmluZ1Jlc3BvbnNlOiAmcmVzcG9uc2UgZXJyb3I6ICZlcnJvcl07Ci0KLSAgW21SZXF1ZXN0RGF0YSBzZXRMZW5ndGg6IDBdOwotCi0gIGlmIChyZXNwb25zZURhdGEgPT0gbmlsKSB7Ci0gICAgQHRocm93IFtUVHJhbnNwb3J0RXhjZXB0aW9uIGV4Y2VwdGlvbldpdGhOYW1lOiBAIlRUcmFuc3BvcnRFeGNlcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbjogQCJDb3VsZCBub3QgbWFrZSBIVFRQIHJlcXVlc3QiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBlcnJvcl07Ci0gIH0KLSAgaWYgKCFbcmVzcG9uc2UgaXNLaW5kT2ZDbGFzczogW05TSFRUUFVSTFJlc3BvbnNlIGNsYXNzXV0pIHsKLSAgICBAdGhyb3cgW1RUcmFuc3BvcnRFeGNlcHRpb24gZXhjZXB0aW9uV2l0aE5hbWU6IEAiVFRyYW5zcG9ydEV4Y2VwdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb246IFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OiBAIlVuZXhwZWN0ZWQgTlNVUkxSZXNwb25zZSB0eXBlOiAlQCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNTdHJpbmdGcm9tQ2xhc3MoW3Jlc3BvbnNlIGNsYXNzXSldXTsKLSAgfQotCi0gIE5TSFRUUFVSTFJlc3BvbnNlICogaHR0cFJlc3BvbnNlID0gKE5TSFRUUFVSTFJlc3BvbnNlICopIHJlc3BvbnNlOwotICBpZiAoW2h0dHBSZXNwb25zZSBzdGF0dXNDb2RlXSAhPSAyMDApIHsKLSAgICBAdGhyb3cgW1RUcmFuc3BvcnRFeGNlcHRpb24gZXhjZXB0aW9uV2l0aE5hbWU6IEAiVFRyYW5zcG9ydEV4Y2VwdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb246IFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OiBAIkJhZCByZXNwb25zZSBmcm9tIEhUVFAgc2VydmVyOiAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2h0dHBSZXNwb25zZSBzdGF0dXNDb2RlXV1dOwotICB9Ci0KLSAgLy8gcGhldyEKLSAgW21SZXNwb25zZURhdGEgcmVsZWFzZV9zdHViXTsKLSAgbVJlc3BvbnNlRGF0YSA9IFtyZXNwb25zZURhdGEgcmV0YWluX3N0dWJdOwotICBtUmVzcG9uc2VEYXRhT2Zmc2V0ID0gMDsKLX0KLQotCi1AZW5kCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9USFRUUFNlc3Npb25UcmFuc3BvcnQuaCBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RIVFRQU2Vzc2lvblRyYW5zcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwMzQ5OWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9USFRUUFNlc3Npb25UcmFuc3BvcnQuaApAQCAtMCwwICsxLDQ3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbXBvcnQgPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPgorI2ltcG9ydCAiVEFzeW5jVHJhbnNwb3J0LmgiCisKK05TX0FTU1VNRV9OT05OVUxMX0JFR0lOCisKKwordHlwZWRlZiBOU0Vycm9yICpfX251bGxhYmxlICheVEhUVFBTZXNzaW9uVHJhbnNwb3J0UmVzcG9uc2VWYWxpZGF0ZUJsb2NrKSAoTlNIVFRQVVJMUmVzcG9uc2UgKnJlc3BvbnNlLCBOU0RhdGEgKnJlc3BvbnNlRGF0YSk7CisKKworQGludGVyZmFjZSBUSFRUUFNlc3Npb25UcmFuc3BvcnRGYWN0b3J5IDogTlNPYmplY3Q8VEFzeW5jVHJhbnNwb3J0RmFjdG9yeT4KKworQHByb3BlcnR5IChzdHJvbmcsIG5vbmF0b21pYykgVEhUVFBTZXNzaW9uVHJhbnNwb3J0UmVzcG9uc2VWYWxpZGF0ZUJsb2NrIHJlc3BvbnNlVmFsaWRhdGU7CisKKysodm9pZCkgc2V0dXBEZWZhdWx0c0ZvclNlc3Npb25Db25maWd1cmF0aW9uOihOU1VSTFNlc3Npb25Db25maWd1cmF0aW9uICopY29uZmlnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aFByb3RvY29sTmFtZTooTlNTdHJpbmcgKilwcm90b2NvbE5hbWU7CisKKy0oaWQpIGluaXRXaXRoU2Vzc2lvbjooTlNVUkxTZXNzaW9uICopc2Vzc2lvbgorICAgICAgICAgICAgICAgICAgVVJMOihOU1VSTCAqKWFVUkw7CisKK0BlbmQKKworCitAaW50ZXJmYWNlIFRIVFRQU2Vzc2lvblRyYW5zcG9ydCA6IE5TT2JqZWN0IDxUQXN5bmNUcmFuc3BvcnQ+CisKK0BlbmQKKworCitOU19BU1NVTUVfTk9OTlVMTF9FTkQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RIVFRQU2Vzc2lvblRyYW5zcG9ydC5tIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVEhUVFBTZXNzaW9uVHJhbnNwb3J0Lm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzEwYjdmYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RIVFRQU2Vzc2lvblRyYW5zcG9ydC5tCkBAIC0wLDAgKzEsMjY4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbXBvcnQgIlRIVFRQU2Vzc2lvblRyYW5zcG9ydC5oIgorI2ltcG9ydCAiVFRyYW5zcG9ydEVycm9yLmgiCisKKworQGludGVyZmFjZSBUSFRUUFNlc3Npb25UcmFuc3BvcnRGYWN0b3J5ICgpCisKK0Bwcm9wZXJ0eSAoc3Ryb25nLCBub25hdG9taWMpIE5TVVJMU2Vzc2lvbiAqc2Vzc2lvbjsKK0Bwcm9wZXJ0eSAoc3Ryb25nLCBub25hdG9taWMpIE5TVVJMICp1cmw7CisKK0BlbmQKKworCitAaW50ZXJmYWNlIFRIVFRQU2Vzc2lvblRyYW5zcG9ydCAoKQorCitAcHJvcGVydHkgKHN0cm9uZywgbm9uYXRvbWljKSBUSFRUUFNlc3Npb25UcmFuc3BvcnRGYWN0b3J5ICpmYWN0b3J5OworQHByb3BlcnR5IChzdHJvbmcsIG5vbmF0b21pYykgTlNNdXRhYmxlRGF0YSAqcmVxdWVzdERhdGE7CitAcHJvcGVydHkgKHN0cm9uZywgbm9uYXRvbWljKSBOU0RhdGEgKnJlc3BvbnNlRGF0YTsKK0Bwcm9wZXJ0eSAoYXNzaWduLCBub25hdG9taWMpIE5TVUludGVnZXIgcmVzcG9uc2VEYXRhT2Zmc2V0OworCistKGluc3RhbmNldHlwZSkgaW5pdFdpdGhGYWN0b3J5OihUSFRUUFNlc3Npb25UcmFuc3BvcnRGYWN0b3J5ICopZmFjdG9yeTsKKworQGVuZAorCisKK0BpbXBsZW1lbnRhdGlvbiBUSFRUUFNlc3Npb25UcmFuc3BvcnRGYWN0b3J5CisKKysodm9pZCkgc2V0dXBEZWZhdWx0c0ZvclNlc3Npb25Db25maWd1cmF0aW9uOihOU1VSTFNlc3Npb25Db25maWd1cmF0aW9uICopY29uZmlnIHdpdGhQcm90b2NvbE5hbWU6KE5TU3RyaW5nICopcHJvdG9jb2xOYW1lCit7CisgIE5TU3RyaW5nICp0aHJpZnRDb250ZW50VHlwZSA9IEAiYXBwbGljYXRpb24veC10aHJpZnQiOworICBpZiAocHJvdG9jb2xOYW1lLmxlbmd0aCkgeworICAgIHRocmlmdENvbnRlbnRUeXBlID0gW3RocmlmdENvbnRlbnRUeXBlIHN0cmluZ0J5QXBwZW5kaW5nRm9ybWF0OkAiOyBwPSVAIiwgcHJvdG9jb2xOYW1lXTsKKyAgfQorCisgIGNvbmZpZy5yZXF1ZXN0Q2FjaGVQb2xpY3kgPSBOU1VSTFJlcXVlc3RSZWxvYWRJZ25vcmluZ0NhY2hlRGF0YTsKKyAgY29uZmlnLkhUVFBTaG91bGRVc2VQaXBlbGluaW5nID0gWUVTOworICBjb25maWcuSFRUUFNob3VsZFNldENvb2tpZXMgPSBOTzsKKyAgY29uZmlnLlVSTENhY2hlID0gbmlsOworICBjb25maWcuSFRUUEFkZGl0aW9uYWxIZWFkZXJzID0gQHtAIkNvbnRlbnQtVHlwZSI6dGhyaWZ0Q29udGVudFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAiQWNjZXB0Ijp0aHJpZnRDb250ZW50VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCJVc2VyLUFnZW50IjpAIlRocmlmdC9Db2NvYSAoU2Vzc2lvbikifTsKK30KKworCistKGlkKSBpbml0V2l0aFNlc3Npb246KE5TVVJMU2Vzc2lvbiAqKXNlc3Npb24gVVJMOihOU1VSTCAqKXVybAoreworICBzZWxmID0gW3N1cGVyIGluaXRdOworICBpZiAoc2VsZikgeworICAgIF9zZXNzaW9uID0gc2Vzc2lvbjsKKyAgICBfdXJsID0gdXJsOworICB9CisKKyAgcmV0dXJuIHNlbGY7Cit9CisKKy0oaWQ8VEFzeW5jVHJhbnNwb3J0PikgbmV3VHJhbnNwb3J0Cit7CisgIHJldHVybiBbW1RIVFRQU2Vzc2lvblRyYW5zcG9ydCBhbGxvY10gaW5pdFdpdGhGYWN0b3J5OnNlbGZdOworfQorCistKE5TVVJMU2Vzc2lvbkRhdGFUYXNrICopIHRhc2tXaXRoUmVxdWVzdDooTlNVUkxSZXF1ZXN0ICopcmVxdWVzdAorICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbkhhbmRsZXI6KHZvaWQgKF4pKE5TRGF0YSAqZGF0YSwgTlNVUkxSZXNwb25zZSAqcmVzcG9uc2UsIE5TRXJyb3IgKmVycm9yKSljb21wbGV0aW9uSGFuZGxlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIE5TVVJMU2Vzc2lvbkRhdGFUYXNrICpuZXdUYXNrID0gW19zZXNzaW9uIGRhdGFUYXNrV2l0aFJlcXVlc3Q6cmVxdWVzdCBjb21wbGV0aW9uSGFuZGxlcjpjb21wbGV0aW9uSGFuZGxlcl07CisgIGlmICghbmV3VGFzaykgeworICAgIGlmIChlcnJvcikgeworICAgICAgKmVycm9yID0gW05TRXJyb3IgZXJyb3JXaXRoRG9tYWluOlRUcmFuc3BvcnRFcnJvckRvbWFpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOlRUcmFuc3BvcnRFcnJvclVua25vd24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySW5mbzpAe05TTG9jYWxpemVkRGVzY3JpcHRpb25LZXk6QCJGYWlsZWQgdG8gY3JlYXRlIHNlc3Npb24gZGF0YSB0YXNrIn1dOworICAgIH0KKyAgICByZXR1cm4gbmlsOworICB9CisKKyAgcmV0dXJuIG5ld1Rhc2s7Cit9CisKKy0oTlNFcnJvciAqKSB2YWxpZGF0ZVJlc3BvbnNlOihOU0hUVFBVUkxSZXNwb25zZSAqKXJlc3BvbnNlIGRhdGE6KE5TRGF0YSAqKWRhdGEKK3sKKyAgaWYgKF9yZXNwb25zZVZhbGlkYXRlKSB7CisgICAgcmV0dXJuIF9yZXNwb25zZVZhbGlkYXRlKHJlc3BvbnNlLCBkYXRhKTsKKyAgfQorICByZXR1cm4gbmlsOworfQorCitAZW5kCisKKworCitAaW1wbGVtZW50YXRpb24gVEhUVFBTZXNzaW9uVHJhbnNwb3J0CisKKy0oaW5zdGFuY2V0eXBlKSBpbml0V2l0aEZhY3Rvcnk6KFRIVFRQU2Vzc2lvblRyYW5zcG9ydEZhY3RvcnkgKilmYWN0b3J5Cit7CisgIHNlbGYgPSBbc3VwZXIgaW5pdF07CisgIGlmIChzZWxmKSB7CisgICAgX2ZhY3RvcnkgPSBmYWN0b3J5OworICB9CisgIHJldHVybiBzZWxmOworfQorCistKEJPT0wpIHJlYWRBbGw6KFVJbnQ4ICopb3V0QnVmZmVyIG9mZnNldDooVUludDMyKW91dEJ1ZmZlck9mZnNldCBsZW5ndGg6KFVJbnQzMilsZW5ndGggZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFVJbnQzMiBnb3QgPSBbc2VsZiByZWFkQXZhaWw6b3V0QnVmZmVyIG9mZnNldDpvdXRCdWZmZXJPZmZzZXQgbWF4TGVuZ3RoOmxlbmd0aCBlcnJvcjplcnJvcl07CisgIGlmIChnb3QgIT0gbGVuZ3RoKSB7CisKKyAgICAvLyBSZXBvcnQgdW5kZXJmbG93IG9ubHkgaWYgcmVhZEF2YWlsIGRpZG4ndCByZXBvcnQgZXJyb3IgYWxyZWFkeQorICAgIGlmIChlcnJvciAmJiAhKmVycm9yKSB7CisgICAgICAqZXJyb3IgPSBbTlNFcnJvciBlcnJvcldpdGhEb21haW46VFRyYW5zcG9ydEVycm9yRG9tYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6VFRyYW5zcG9ydEVycm9yRW5kT2ZGaWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckluZm86bmlsXTsKKyAgICB9CisKKyAgICByZXR1cm4gTk87CisgIH0KKworICByZXR1cm4gWUVTOworfQorCistKFVJbnQzMikgcmVhZEF2YWlsOihVSW50OCAqKW91dEJ1ZmZlciBvZmZzZXQ6KFVJbnQzMilvdXRCdWZmZXJPZmZzZXQgbWF4TGVuZ3RoOihVSW50MzIpbWF4TGVuZ3RoIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBOU1VJbnRlZ2VyIGF2YWlsID0gX3Jlc3BvbnNlRGF0YS5sZW5ndGggLSBfcmVzcG9uc2VEYXRhT2Zmc2V0OworCisgIE5TUmFuZ2UgcmFuZ2U7CisgIHJhbmdlLmxvY2F0aW9uID0gX3Jlc3BvbnNlRGF0YU9mZnNldDsKKyAgcmFuZ2UubGVuZ3RoID0gTUlOKG1heExlbmd0aCwgYXZhaWwpOworCisgIFtfcmVzcG9uc2VEYXRhIGdldEJ5dGVzOm91dEJ1ZmZlcitvdXRCdWZmZXJPZmZzZXQgcmFuZ2U6cmFuZ2VdOworICBfcmVzcG9uc2VEYXRhT2Zmc2V0ICs9IHJhbmdlLmxlbmd0aDsKKworICByZXR1cm4gKFVJbnQzMilyYW5nZS5sZW5ndGg7Cit9CisKKy0oQk9PTCkgd3JpdGU6KGNvbnN0IFVJbnQ4ICopZGF0YSBvZmZzZXQ6KFVJbnQzMilvZmZzZXQgbGVuZ3RoOihVSW50MzIpbGVuZ3RoIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBpZiAoIV9yZXF1ZXN0RGF0YSkgeworICAgIF9yZXF1ZXN0RGF0YSA9IFtOU011dGFibGVEYXRhIGRhdGFXaXRoQ2FwYWNpdHk6MjU2XTsKKyAgfQorCisgIFtfcmVxdWVzdERhdGEgYXBwZW5kQnl0ZXM6ZGF0YStvZmZzZXQgbGVuZ3RoOmxlbmd0aF07CisKKyAgcmV0dXJuIFlFUzsKK30KKworLSh2b2lkKSBmbHVzaFdpdGhDb21wbGV0aW9uOihUQXN5bmNDb21wbGV0aW9uQmxvY2spY29tcGxldGVkIGZhaWx1cmU6KFRBc3luY0ZhaWx1cmVCbG9jaylmYWlsdXJlCit7CisgIE5TRXJyb3IgKmVycm9yOworCisgIE5TTXV0YWJsZVVSTFJlcXVlc3QgKnJlcXVlc3QgPSBbW05TTXV0YWJsZVVSTFJlcXVlc3QgYWxsb2NdIGluaXRXaXRoVVJMOl9mYWN0b3J5LnVybF07CisgIHJlcXVlc3QuSFRUUE1ldGhvZCA9IEAiUE9TVCI7CisgIHJlcXVlc3QuSFRUUEJvZHkgPSBfcmVxdWVzdERhdGE7CisKKyAgX3JlcXVlc3REYXRhID0gbmlsOworCisgIE5TVVJMU2Vzc2lvbkRhdGFUYXNrICp0YXNrID0gW19mYWN0b3J5IHRhc2tXaXRoUmVxdWVzdDpyZXF1ZXN0IGNvbXBsZXRpb25IYW5kbGVyOl4oTlNEYXRhICpkYXRhLCBOU1VSTFJlc3BvbnNlICpyZXNwb25zZSwgTlNFcnJvciAqZXJyb3IpIHsKKworICAgIC8vIENoZWNrIHJlc3BvbnNlIHR5cGUKKyAgICBpZiAoIWVycm9yICYmICFbcmVzcG9uc2UgaXNLaW5kT2ZDbGFzczpOU0hUVFBVUkxSZXNwb25zZS5jbGFzc10pIHsKKworICAgICAgZXJyb3IgPSBbTlNFcnJvciBlcnJvcldpdGhEb21haW46VFRyYW5zcG9ydEVycm9yRG9tYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6VFRyYW5zcG9ydEVycm9yVW5rbm93bgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvOkB7VFRyYW5zcG9ydEVycm9ySHR0cEVycm9yS2V5OiBAKFRIdHRwVHJhbnNwb3J0RXJyb3JJbnZhbGlkUmVzcG9uc2UpfV07CisKKyAgICB9CisKKyAgICAvLyBDaGVjayBzdGF0dXMgY29kZQorICAgIE5TSFRUUFVSTFJlc3BvbnNlICpodHRwUmVzcG9uc2UgPSAoaWQpcmVzcG9uc2U7CisgICAgaWYgKCFlcnJvciAmJiBodHRwUmVzcG9uc2Uuc3RhdHVzQ29kZSAhPSAyMDApIHsKKworICAgICAgVEh0dHBUcmFuc3BvcnRFcnJvciBjb2RlOworICAgICAgaWYgKGh0dHBSZXNwb25zZS5zdGF0dXNDb2RlID09IDQwMSkgeworICAgICAgICBjb2RlID0gVEh0dHBUcmFuc3BvcnRFcnJvckF1dGhlbnRpY2F0aW9uOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIGNvZGUgPSBUSHR0cFRyYW5zcG9ydEVycm9ySW52YWxpZFN0YXR1czsKKyAgICAgIH0KKworICAgICAgZXJyb3IgPSBbTlNFcnJvciBlcnJvcldpdGhEb21haW46VFRyYW5zcG9ydEVycm9yRG9tYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZTpUVHJhbnNwb3J0RXJyb3JVbmtub3duCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySW5mbzpAe1RUcmFuc3BvcnRFcnJvckh0dHBFcnJvcktleTogQChjb2RlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCJzdGF0dXNDb2RlIjpAKGh0dHBSZXNwb25zZS5zdGF0dXNDb2RlKX1dOworICAgIH0KKworICAgIC8vIEFsbG93IGZhY3RvcnkgdG8gY2hlY2sKKyAgICBpZiAoIWVycm9yKSB7CisgICAgICBlcnJvciA9IFtfZmFjdG9yeSB2YWxpZGF0ZVJlc3BvbnNlOmh0dHBSZXNwb25zZSBkYXRhOmRhdGFdOworICAgIH0KKworICAgIF9yZXNwb25zZURhdGFPZmZzZXQgPSAwOworCisgICAgaWYgKGVycm9yKSB7CisKKyAgICAgIF9yZXNwb25zZURhdGEgPSBuaWw7CisKKyAgICAgIGZhaWx1cmUoZXJyb3IpOworCisgICAgfQorICAgIGVsc2UgeworCisgICAgICBpZiAoZGF0YSA9PSBuaWwpIHsKKyAgICAgICAgZGF0YSA9IFtOU0RhdGEgZGF0YV07CisgICAgICB9CisKKyAgICAgIF9yZXNwb25zZURhdGEgPSBkYXRhOworCisgICAgICBjb21wbGV0ZWQoc2VsZik7CisgICAgfQorCisgIH0gZXJyb3I6JmVycm9yXTsKKworICBpZiAoIXRhc2spIHsKKyAgICBmYWlsdXJlKGVycm9yKTsKKyAgICByZXR1cm47CisgIH0KKworICBbdGFzayByZXN1bWVdOworfQorCistKEJPT0wpIGZsdXNoOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBkaXNwYXRjaF9zZW1hcGhvcmVfdCBjb21wbGV0ZWQgPSBkaXNwYXRjaF9zZW1hcGhvcmVfY3JlYXRlKDApOworCisgIF9fYmxvY2sgQk9PTCByZXN1bHQ7CisgIF9fYmxvY2sgTlNFcnJvciAqaW50ZXJuYWxFcnJvcjsKKworICBbc2VsZiBmbHVzaFdpdGhDb21wbGV0aW9uOl4oaWQgPCBUQXN5bmNUcmFuc3BvcnQgPiB0cmFuc3BvcnQpIHsKKworICAgIHJlc3VsdCA9IFlFUzsKKworICAgIGRpc3BhdGNoX3NlbWFwaG9yZV9zaWduYWwoY29tcGxldGVkKTsKKworICB9IGZhaWx1cmU6XihOU0Vycm9yICplcnJvcikgeworCisgICAgaW50ZXJuYWxFcnJvciA9IGVycm9yOworCisgICAgcmVzdWx0ID0gTk87CisKKyAgICBkaXNwYXRjaF9zZW1hcGhvcmVfc2lnbmFsKGNvbXBsZXRlZCk7CisKKyAgfV07CisKKyAgZGlzcGF0Y2hfc2VtYXBob3JlX3dhaXQoY29tcGxldGVkLCBESVNQQVRDSF9USU1FX0ZPUkVWRVIpOworCisgIGlmIChlcnJvcikgeworICAgICplcnJvciA9IGludGVybmFsRXJyb3I7CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCitAZW5kCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9USFRUUFRyYW5zcG9ydC5oIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVEhUVFBUcmFuc3BvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzM1ZGFmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVEhUVFBUcmFuc3BvcnQuaApAQCAtMCwwICsxLDM5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbXBvcnQgPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPgorI2ltcG9ydCAiVFRyYW5zcG9ydC5oIgorCitOU19BU1NVTUVfTk9OTlVMTF9CRUdJTgorCisKK0BpbnRlcmZhY2UgVEhUVFBUcmFuc3BvcnQgOiBOU09iamVjdCA8VFRyYW5zcG9ydD4KKworLShpZCkgaW5pdFdpdGhVUkw6KE5TVVJMICopYVVSTDsKKworLShpZCkgaW5pdFdpdGhVUkw6KE5TVVJMICopYVVSTAorICAgICAgICB1c2VyQWdlbnQ6KG51bGxhYmxlIE5TU3RyaW5nICopdXNlckFnZW50CisgICAgICAgICAgdGltZW91dDooaW50KXRpbWVvdXQ7CisKKy0odm9pZCkgc2V0VVJMOihOU1VSTCAqKWFVUkw7CisKK0BlbmQKKworCitOU19BU1NVTUVfTk9OTlVMTF9FTkQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RIVFRQVHJhbnNwb3J0Lm0gYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9USFRUUFRyYW5zcG9ydC5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0MDQ2YzYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9USFRUUFRyYW5zcG9ydC5tCkBAIC0wLDAgKzEsMTgyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbXBvcnQgIlRIVFRQVHJhbnNwb3J0LmgiCisjaW1wb3J0ICJUVHJhbnNwb3J0RXJyb3IuaCIKKworCitAaW50ZXJmYWNlIFRIVFRQVHJhbnNwb3J0ICgpCisKK0Bwcm9wZXJ0eSAoc3Ryb25nLCBub25hdG9taWMpIE5TVVJMICp1cmw7CitAcHJvcGVydHkgKHN0cm9uZywgbm9uYXRvbWljKSBOU011dGFibGVVUkxSZXF1ZXN0ICpyZXF1ZXN0OworQHByb3BlcnR5IChzdHJvbmcsIG5vbmF0b21pYykgTlNNdXRhYmxlRGF0YSAqcmVxdWVzdERhdGE7CitAcHJvcGVydHkgKHN0cm9uZywgbm9uYXRvbWljKSBOU0RhdGEgKnJlc3BvbnNlRGF0YTsKK0Bwcm9wZXJ0eSAoYXNzaWduLCBub25hdG9taWMpIE5TVUludGVnZXIgcmVzcG9uc2VEYXRhT2Zmc2V0OworQHByb3BlcnR5IChzdHJvbmcsIG5vbmF0b21pYykgTlNTdHJpbmcgKnVzZXJBZ2VudDsKK0Bwcm9wZXJ0eSAoYXNzaWduLCBub25hdG9taWMpIE5TVGltZUludGVydmFsIHRpbWVvdXQ7CisKK0BlbmQKKworCitAaW1wbGVtZW50YXRpb24gVEhUVFBUcmFuc3BvcnQKKworLSh2b2lkKSBzZXR1cFJlcXVlc3QKK3sKKyAgLy8gc2V0IHVwIG91ciByZXF1ZXN0IG9iamVjdCB0aGF0IHdlJ2xsIHVzZSBmb3IgZWFjaCByZXF1ZXN0CisgIF9yZXF1ZXN0ID0gW1tOU011dGFibGVVUkxSZXF1ZXN0IGFsbG9jXSBpbml0V2l0aFVSTDpfdXJsXTsKKyAgW19yZXF1ZXN0IHNldEhUVFBNZXRob2Q6QCJQT1NUIl07CisgIFtfcmVxdWVzdCBzZXRWYWx1ZTpAImFwcGxpY2F0aW9uL3gtdGhyaWZ0IiBmb3JIVFRQSGVhZGVyRmllbGQ6QCJDb250ZW50LVR5cGUiXTsKKyAgW19yZXF1ZXN0IHNldFZhbHVlOkAiYXBwbGljYXRpb24veC10aHJpZnQiIGZvckhUVFBIZWFkZXJGaWVsZDpAIkFjY2VwdCJdOworCisgIE5TU3RyaW5nICp1c2VyQWdlbnQgPSBfdXNlckFnZW50OworICBpZiAoIXVzZXJBZ2VudCkgeworICAgIHVzZXJBZ2VudCA9IEAiVGhyaWZ0L0NvY29hIjsKKyAgfQorICBbX3JlcXVlc3Qgc2V0VmFsdWU6dXNlckFnZW50IGZvckhUVFBIZWFkZXJGaWVsZDpAIlVzZXItQWdlbnQiXTsKKworICBbX3JlcXVlc3Qgc2V0Q2FjaGVQb2xpY3k6TlNVUkxSZXF1ZXN0UmVsb2FkSWdub3JpbmdDYWNoZURhdGFdOworICBpZiAoX3RpbWVvdXQpIHsKKyAgICBbX3JlcXVlc3Qgc2V0VGltZW91dEludGVydmFsOl90aW1lb3V0XTsKKyAgfQorfQorCisKKy0oaWQpIGluaXRXaXRoVVJMOihOU1VSTCAqKWFVUkwKK3sKKyAgcmV0dXJuIFtzZWxmIGluaXRXaXRoVVJMOmFVUkwKKyAgICAgICAgICAgICAgICAgdXNlckFnZW50Om5pbAorICAgICAgICAgICAgICAgICAgIHRpbWVvdXQ6MF07Cit9CisKKworLShpZCkgaW5pdFdpdGhVUkw6KE5TVVJMICopYVVSTAorICAgICAgICB1c2VyQWdlbnQ6KE5TU3RyaW5nICopYVVzZXJBZ2VudAorICAgICAgICAgIHRpbWVvdXQ6KGludClhVGltZW91dAoreworICBzZWxmID0gW3N1cGVyIGluaXRdOworICBpZiAoIXNlbGYpIHsKKyAgICByZXR1cm4gbmlsOworICB9CisKKyAgX3RpbWVvdXQgPSBhVGltZW91dDsKKyAgX3VzZXJBZ2VudCA9IGFVc2VyQWdlbnQ7CisgIF91cmwgPSBhVVJMOworCisgIFtzZWxmIHNldHVwUmVxdWVzdF07CisKKyAgLy8gY3JlYXRlIG91ciByZXF1ZXN0IGRhdGEgYnVmZmVyCisgIF9yZXF1ZXN0RGF0YSA9IFtbTlNNdXRhYmxlRGF0YSBhbGxvY10gaW5pdFdpdGhDYXBhY2l0eToxMDI0XTsKKworICByZXR1cm4gc2VsZjsKK30KKworLSh2b2lkKSBzZXRVUkw6KE5TVVJMICopYVVSTAoreworICBfdXJsID0gYVVSTDsKKworICBbc2VsZiBzZXR1cFJlcXVlc3RdOworfQorCistKEJPT0wpIHJlYWRBbGw6KFVJbnQ4ICopb3V0QnVmZmVyIG9mZnNldDooVUludDMyKW91dEJ1ZmZlck9mZnNldCBsZW5ndGg6KFVJbnQzMilsZW5ndGggZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFVJbnQzMiBnb3QgPSBbc2VsZiByZWFkQXZhaWw6b3V0QnVmZmVyIG9mZnNldDpvdXRCdWZmZXJPZmZzZXQgbWF4TGVuZ3RoOmxlbmd0aCBlcnJvcjplcnJvcl07CisgIGlmIChnb3QgIT0gbGVuZ3RoKSB7CisKKyAgICAvLyBSZXBvcnQgdW5kZXJmbG93IG9ubHkgaWYgcmVhZEF2YWlsIGRpZG4ndCByZXBvcnQgZXJyb3IgYWxyZWFkeQorICAgIGlmIChlcnJvciAmJiAhKmVycm9yKSB7CisgICAgICAqZXJyb3IgPSBbTlNFcnJvciBlcnJvcldpdGhEb21haW46VFRyYW5zcG9ydEVycm9yRG9tYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6VFRyYW5zcG9ydEVycm9yRW5kT2ZGaWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckluZm86bmlsXTsKKyAgICB9CisKKyAgICByZXR1cm4gTk87CisgIH0KKworICByZXR1cm4gWUVTOworfQorCistKFVJbnQzMikgcmVhZEF2YWlsOihVSW50OCAqKW91dEJ1ZmZlciBvZmZzZXQ6KFVJbnQzMilvdXRCdWZmZXJPZmZzZXQgbWF4TGVuZ3RoOihVSW50MzIpbWF4TGVuZ3RoIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBOU1VJbnRlZ2VyIGF2YWlsID0gX3Jlc3BvbnNlRGF0YS5sZW5ndGggLSBfcmVzcG9uc2VEYXRhT2Zmc2V0OworCisgIE5TUmFuZ2UgcmFuZ2U7CisgIHJhbmdlLmxvY2F0aW9uID0gX3Jlc3BvbnNlRGF0YU9mZnNldDsKKyAgcmFuZ2UubGVuZ3RoID0gTUlOKG1heExlbmd0aCwgYXZhaWwpOworCisgIFtfcmVzcG9uc2VEYXRhIGdldEJ5dGVzOm91dEJ1ZmZlcitvdXRCdWZmZXJPZmZzZXQgcmFuZ2U6cmFuZ2VdOworICBfcmVzcG9uc2VEYXRhT2Zmc2V0ICs9IHJhbmdlLmxlbmd0aDsKKworICByZXR1cm4gKFVJbnQzMilyYW5nZS5sZW5ndGg7Cit9CisKKy0oQk9PTCkgd3JpdGU6KGNvbnN0IFVJbnQ4ICopZGF0YSBvZmZzZXQ6KFVJbnQzMilvZmZzZXQgbGVuZ3RoOihVSW50MzIpbGVuZ3RoIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBbX3JlcXVlc3REYXRhIGFwcGVuZEJ5dGVzOmRhdGErb2Zmc2V0IGxlbmd0aDpsZW5ndGhdOworCisgIHJldHVybiBZRVM7Cit9CisKKy0oQk9PTCkgZmx1c2g6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFtfcmVxdWVzdCBzZXRIVFRQQm9keTpfcmVxdWVzdERhdGFdOworCisgIF9yZXNwb25zZURhdGFPZmZzZXQgPSAwOworCisgIC8vIG1ha2UgdGhlIEhUVFAgcmVxdWVzdAorICBOU1VSTFJlc3BvbnNlICpyZXNwb25zZTsKKyAgX3Jlc3BvbnNlRGF0YSA9IFtOU1VSTENvbm5lY3Rpb24gc2VuZFN5bmNocm9ub3VzUmVxdWVzdDpfcmVxdWVzdCByZXR1cm5pbmdSZXNwb25zZTomcmVzcG9uc2UgZXJyb3I6ZXJyb3JdOworICBpZiAoIV9yZXNwb25zZURhdGEpIHsKKyAgICByZXR1cm4gTk87CisgIH0KKworICBbX3JlcXVlc3REYXRhIHNldExlbmd0aDowXTsKKworICBpZiAoIVtyZXNwb25zZSBpc0tpbmRPZkNsYXNzOk5TSFRUUFVSTFJlc3BvbnNlLmNsYXNzXSkgeworICAgIGlmIChlcnJvcikgeworICAgICAgKmVycm9yID0gW05TRXJyb3IgZXJyb3JXaXRoRG9tYWluOlRUcmFuc3BvcnRFcnJvckRvbWFpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOlRUcmFuc3BvcnRFcnJvclVua25vd24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySW5mbzpAe1RUcmFuc3BvcnRFcnJvckh0dHBFcnJvcktleTogQChUSHR0cFRyYW5zcG9ydEVycm9ySW52YWxpZFJlc3BvbnNlKX1dOworICAgIH0KKyAgICByZXR1cm4gTk87CisgIH0KKworICBOU0hUVFBVUkxSZXNwb25zZSAqaHR0cFJlc3BvbnNlID0gKE5TSFRUUFVSTFJlc3BvbnNlICopcmVzcG9uc2U7CisgIGlmIChbaHR0cFJlc3BvbnNlIHN0YXR1c0NvZGVdICE9IDIwMCkgeworICAgIGlmIChlcnJvcikgeworCisgICAgICBUSHR0cFRyYW5zcG9ydEVycm9yIGNvZGU7CisgICAgICBpZiAoaHR0cFJlc3BvbnNlLnN0YXR1c0NvZGUgPT0gNDAxKSB7CisgICAgICAgIGNvZGUgPSBUSHR0cFRyYW5zcG9ydEVycm9yQXV0aGVudGljYXRpb247CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgY29kZSA9IFRIdHRwVHJhbnNwb3J0RXJyb3JJbnZhbGlkU3RhdHVzOworICAgICAgfQorCisgICAgICAqZXJyb3IgPSBbTlNFcnJvciBlcnJvcldpdGhEb21haW46VFRyYW5zcG9ydEVycm9yRG9tYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6VFRyYW5zcG9ydEVycm9yVW5rbm93bgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvOkB7VFRyYW5zcG9ydEVycm9ySHR0cEVycm9yS2V5OiBAKGNvZGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCJzdGF0dXNDb2RlIjpAKGh0dHBSZXNwb25zZS5zdGF0dXNDb2RlKX1dOworICAgIH0KKyAgICByZXR1cm4gTk87CisgIH0KKworICByZXR1cm4gWUVTOworfQorCitAZW5kCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UTWVtb3J5QnVmZmVyLmggYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UTWVtb3J5QnVmZmVyLmgKaW5kZXggZmE0ZDM3MS4uNjI0OWQzMiAxMDA2NDQKLS0tIGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVE1lbW9yeUJ1ZmZlci5oCisrKyBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RNZW1vcnlCdWZmZXIuaApAQCAtMjAsMTAgKzIwLDE4IEBACiAjaW1wb3J0IDxGb3VuZGF0aW9uL0ZvdW5kYXRpb24uaD4KICNpbXBvcnQgIlRUcmFuc3BvcnQuaCIKIAotQGludGVyZmFjZSBUTWVtb3J5QnVmZmVyIDogTlNPYmplY3QgPFRUcmFuc3BvcnQ+IHsKLQlOU011dGFibGVEYXRhICptQnVmZmVyOwotCU5TVUludGVnZXIgbU9mZnNldDsKLX0KLS0gKGlkKWluaXRXaXRoRGF0YTooTlNEYXRhICopZGF0YTsKLS0gKE5TRGF0YSAqKWdldEJ1ZmZlcjsKK05TX0FTU1VNRV9OT05OVUxMX0JFR0lOCisKKworQGludGVyZmFjZSBUTWVtb3J5QnVmZmVyIDogTlNPYmplY3QgPFRUcmFuc3BvcnQ+CisKKy0oTlNEYXRhICopIGJ1ZmZlcjsKKworLShpZCkgaW5pdFdpdGhEYXRhOihOU0RhdGEgKilkYXRhOworCistKGlkKSBpbml0V2l0aERhdGFOb0NvcHk6KE5TTXV0YWJsZURhdGEgKilkYXRhOworCiBAZW5kCisKKworTlNfQVNTVU1FX05PTk5VTExfRU5ECmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UTWVtb3J5QnVmZmVyLm0gYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UTWVtb3J5QnVmZmVyLm0KaW5kZXggYzM4MDFjNy4uZWMxOWNjOCAxMDA2NDQKLS0tIGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVE1lbW9yeUJ1ZmZlci5tCisrKyBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RNZW1vcnlCdWZmZXIubQpAQCAtMTgsNTUgKzE4LDEwNCBAQAogICovCiAKICNpbXBvcnQgIlRNZW1vcnlCdWZmZXIuaCIKLSNpbXBvcnQgIlRUcmFuc3BvcnRFeGNlcHRpb24uaCIKLSNpbXBvcnQgIlRPYmplY3RpdmUtQy5oIgorI2ltcG9ydCAiVFRyYW5zcG9ydEVycm9yLmgiCisKIAogI2RlZmluZSBHQVJCQUdFX0JVRkZFUl9TSVpFIDQwOTYgLy8gNEtpQgogCisKK0BpbnRlcmZhY2UgVE1lbW9yeUJ1ZmZlciAoKQorCitAcHJvcGVydHkoc3Ryb25nLCBub25hdG9taWMpIE5TTXV0YWJsZURhdGEgKmJ1ZmZlcjsKK0Bwcm9wZXJ0eShhc3NpZ24sIG5vbmF0b21pYykgVUludDMyIGJ1ZmZlck9mZnNldDsKKworQGVuZAorCisKIEBpbXBsZW1lbnRhdGlvbiBUTWVtb3J5QnVmZmVyCi0tIChpZClpbml0IHsKLQlpZiAoc2VsZiA9IFtzdXBlciBpbml0XSkgewotCQltQnVmZmVyID0gW1tOU011dGFibGVEYXRhIGFsbG9jXSBpbml0XTsKLQkJbU9mZnNldCA9IDA7Ci0JfQotCXJldHVybiBzZWxmOworCistKGlkKSBpbml0Cit7CisgIGlmICgoc2VsZiA9IFtzdXBlciBpbml0XSkpIHsKKyAgICBfYnVmZmVyID0gW05TTXV0YWJsZURhdGEgbmV3XTsKKyAgICBfYnVmZmVyT2Zmc2V0ID0gMDsKKyAgfQorICByZXR1cm4gc2VsZjsKIH0KIAotLSAoaWQpaW5pdFdpdGhEYXRhOihOU0RhdGEgKilkYXRhIHsKLQlpZiAoc2VsZiA9IFtzdXBlciBpbml0XSkgewotCQltQnVmZmVyID0gW2RhdGEgbXV0YWJsZUNvcHldOwotCQltT2Zmc2V0ID0gMDsKLQl9Ci0JcmV0dXJuIHNlbGY7CistKGlkKSBpbml0V2l0aERhdGE6KE5TRGF0YSAqKWRhdGEKK3sKKyAgaWYgKHNlbGYgPSBbc3VwZXIgaW5pdF0pIHsKKyAgICBfYnVmZmVyID0gW2RhdGEgbXV0YWJsZUNvcHldOworICAgIF9idWZmZXJPZmZzZXQgPSAwOworICB9CisgIHJldHVybiBzZWxmOwogfQogCi0tIChpbnQpcmVhZEFsbDoodWludDhfdCAqKWJ1ZiBvZmZzZXQ6KGludClvZmYgbGVuZ3RoOihpbnQpbGVuIHsKLQlpZiAoW21CdWZmZXIgbGVuZ3RoXSAtIG1PZmZzZXQgPCBsZW4pIHsKLQkJQHRocm93IFtUVHJhbnNwb3J0RXhjZXB0aW9uIGV4Y2VwdGlvbldpdGhSZWFzb246QCJOb3QgZW5vdWdoIGJ5dGVzIHJlbWFpbiBpbiBidWZmZXIiXTsKLQl9Ci0JW21CdWZmZXIgZ2V0Qnl0ZXM6YnVmIHJhbmdlOk5TTWFrZVJhbmdlKG1PZmZzZXQsIGxlbildOwotCW1PZmZzZXQgKz0gbGVuOwotCWlmIChtT2Zmc2V0ID49IEdBUkJBR0VfQlVGRkVSX1NJWkUpIHsKLQkJW21CdWZmZXIgcmVwbGFjZUJ5dGVzSW5SYW5nZTpOU01ha2VSYW5nZSgwLCBtT2Zmc2V0KSB3aXRoQnl0ZXM6TlVMTCBsZW5ndGg6MF07Ci0JCW1PZmZzZXQgPSAwOwotCX0KLQlyZXR1cm4gbGVuOworLShpZCkgaW5pdFdpdGhEYXRhTm9Db3B5OihOU011dGFibGVEYXRhICopZGF0YQoreworICBpZiAoc2VsZiA9IFtzdXBlciBpbml0XSkgeworICAgIF9idWZmZXIgPSBkYXRhOworICAgIF9idWZmZXJPZmZzZXQgPSAwOworICB9CisgIHJldHVybiBzZWxmOwogfQogCi0tICh2b2lkKXdyaXRlOihjb25zdCB1aW50OF90ICopZGF0YSBvZmZzZXQ6KHVuc2lnbmVkIGludClvZmZzZXQgbGVuZ3RoOih1bnNpZ25lZCBpbnQpbGVuZ3RoIHsKLQlbbUJ1ZmZlciBhcHBlbmRCeXRlczpkYXRhK29mZnNldCBsZW5ndGg6bGVuZ3RoXTsKKy0oQk9PTCkgcmVhZEFsbDooVUludDggKilvdXRCdWZmZXIgb2Zmc2V0OihVSW50MzIpb3V0QnVmZmVyT2Zmc2V0IGxlbmd0aDooVUludDMyKWxlbmd0aCBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgVUludDMyIGdvdCA9IFtzZWxmIHJlYWRBdmFpbDpvdXRCdWZmZXIgb2Zmc2V0Om91dEJ1ZmZlck9mZnNldCBtYXhMZW5ndGg6bGVuZ3RoIGVycm9yOmVycm9yXTsKKyAgaWYgKGdvdCAhPSBsZW5ndGgpIHsKKworICAgIC8vIFJlcG9ydCB1bmRlcmZsb3cgb25seSBpZiByZWFkQXZhaWwgZGlkbid0IHJlcG9ydCBlcnJvciBhbHJlYWR5CisgICAgaWYgKGVycm9yICYmICEqZXJyb3IpIHsKKyAgICAgICplcnJvciA9IFtOU0Vycm9yIGVycm9yV2l0aERvbWFpbjpUVHJhbnNwb3J0RXJyb3JEb21haW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZTpUVHJhbnNwb3J0RXJyb3JFbmRPZkZpbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySW5mbzpuaWxdOworICAgIH0KKworICAgIHJldHVybiBOTzsKKyAgfQorCisgIHJldHVybiBZRVM7CiB9CiAKLS0gKHZvaWQpZmx1c2ggewotCS8vIG5vb3AKKy0oVUludDMyKSByZWFkQXZhaWw6KFVJbnQ4ICopb3V0QnVmZmVyIG9mZnNldDooVUludDMyKW91dEJ1ZmZlck9mZnNldCBtYXhMZW5ndGg6KFVJbnQzMiltYXhMZW5ndGggZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFVJbnQzMiBhdmFpbCA9IChVSW50MzIpX2J1ZmZlci5sZW5ndGggLSBfYnVmZmVyT2Zmc2V0OworICBpZiAoYXZhaWwgPT0gMCkgeworICAgIHJldHVybiAwOworICB9CisKKyAgTlNSYW5nZSByYW5nZTsKKyAgcmFuZ2UubG9jYXRpb24gPSBfYnVmZmVyT2Zmc2V0OworICByYW5nZS5sZW5ndGggPSBNSU4obWF4TGVuZ3RoLCBhdmFpbCk7CisKKyAgW19idWZmZXIgZ2V0Qnl0ZXM6b3V0QnVmZmVyICsgb3V0QnVmZmVyT2Zmc2V0IHJhbmdlOnJhbmdlXTsKKyAgX2J1ZmZlck9mZnNldCArPSByYW5nZS5sZW5ndGg7CisKKyAgaWYgKF9idWZmZXJPZmZzZXQgPj0gR0FSQkFHRV9CVUZGRVJfU0laRSkgeworICAgIFtfYnVmZmVyIHJlcGxhY2VCeXRlc0luUmFuZ2U6TlNNYWtlUmFuZ2UoMCwgX2J1ZmZlck9mZnNldCkgd2l0aEJ5dGVzOk5VTEwgbGVuZ3RoOjBdOworICAgIF9idWZmZXJPZmZzZXQgPSAwOworICB9CisKKyAgcmV0dXJuIChVSW50MzIpcmFuZ2UubGVuZ3RoOwogfQogCi0tIChOU0RhdGEgKilnZXRCdWZmZXIgewotCXJldHVybiBbW21CdWZmZXIgY29weV0gYXV0b3JlbGVhc2Vfc3R1Yl07CistKEJPT0wpIHdyaXRlOihjb25zdCBVSW50OCAqKWluQnVmZmVyIG9mZnNldDooVUludDMyKWluQnVmZmVyT2Zmc2V0IGxlbmd0aDooVUludDMyKWxlbmd0aCBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgW19idWZmZXIgYXBwZW5kQnl0ZXM6aW5CdWZmZXIgKyBpbkJ1ZmZlck9mZnNldCBsZW5ndGg6bGVuZ3RoXTsKKworICByZXR1cm4gWUVTOwogfQogCi0tICh2b2lkKWRlYWxsb2MgewotCVttQnVmZmVyIHJlbGVhc2Vfc3R1Yl07Ci0JW3N1cGVyIGRlYWxsb2Nfc3R1Yl07CistKE5TRGF0YSAqKSBidWZmZXIKK3sKKyAgcmV0dXJuIF9idWZmZXI7CiB9CisKKy0oQk9PTCkgZmx1c2g6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBZRVM7Cit9CisKIEBlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1ROU0ZpbGVIYW5kbGVUcmFuc3BvcnQuaCBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1ROU0ZpbGVIYW5kbGVUcmFuc3BvcnQuaAppbmRleCBiYTJhMjA5Li5kYjZlZGYzIDEwMDY0NAotLS0gYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UTlNGaWxlSGFuZGxlVHJhbnNwb3J0LmgKKysrIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVE5TRmlsZUhhbmRsZVRyYW5zcG9ydC5oCkBAIC0yMSwxNSArMjEsMTggQEAKICNpbXBvcnQgPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPgogI2ltcG9ydCAiVFRyYW5zcG9ydC5oIgogCi1AaW50ZXJmYWNlIFROU0ZpbGVIYW5kbGVUcmFuc3BvcnQgOiBOU09iamVjdCA8VFRyYW5zcG9ydD4gewotICBOU0ZpbGVIYW5kbGUgKiBtSW5wdXRGaWxlSGFuZGxlOwotICBOU0ZpbGVIYW5kbGUgKiBtT3V0cHV0RmlsZUhhbmRsZTsKLX0KK05TX0FTU1VNRV9OT05OVUxMX0JFR0lOCiAKLS0gKGlkKSBpbml0V2l0aEZpbGVIYW5kbGU6IChOU0ZpbGVIYW5kbGUgKikgZmlsZUhhbmRsZTsKIAotLSAoaWQpIGluaXRXaXRoSW5wdXRGaWxlSGFuZGxlOiAoTlNGaWxlSGFuZGxlICopIGlucHV0RmlsZUhhbmRsZQotICAgICAgICAgICAgICBvdXRwdXRGaWxlSGFuZGxlOiAoTlNGaWxlSGFuZGxlICopIG91dHB1dEZpbGVIYW5kbGU7CitAaW50ZXJmYWNlIFROU0ZpbGVIYW5kbGVUcmFuc3BvcnQgOiBOU09iamVjdCA8VFRyYW5zcG9ydD4KKworLShpZCkgaW5pdFdpdGhGaWxlSGFuZGxlOihOU0ZpbGVIYW5kbGUgKilmaWxlSGFuZGxlOworCistKGlkKSBpbml0V2l0aElucHV0RmlsZUhhbmRsZTooTlNGaWxlSGFuZGxlICopaW5wdXRGaWxlSGFuZGxlCisgICAgICAgICAgICAgb3V0cHV0RmlsZUhhbmRsZTooTlNGaWxlSGFuZGxlICopb3V0cHV0RmlsZUhhbmRsZTsKIAogCiBAZW5kCisKKworTlNfQVNTVU1FX05PTk5VTExfRU5ECmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UTlNGaWxlSGFuZGxlVHJhbnNwb3J0Lm0gYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UTlNGaWxlSGFuZGxlVHJhbnNwb3J0Lm0KaW5kZXggMGZmMjAwYi4uYzkwN2Y4NyAxMDA2NDQKLS0tIGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVE5TRmlsZUhhbmRsZVRyYW5zcG9ydC5tCisrKyBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1ROU0ZpbGVIYW5kbGVUcmFuc3BvcnQubQpAQCAtMTksNzUgKzE5LDEwMCBAQAogCiAKICNpbXBvcnQgIlROU0ZpbGVIYW5kbGVUcmFuc3BvcnQuaCIKLSNpbXBvcnQgIlRUcmFuc3BvcnRFeGNlcHRpb24uaCIKLSNpbXBvcnQgIlRPYmplY3RpdmUtQy5oIgorI2ltcG9ydCAiVFRyYW5zcG9ydEVycm9yLmgiCisKKworQGludGVyZmFjZSBUTlNGaWxlSGFuZGxlVHJhbnNwb3J0ICgpCisKK0Bwcm9wZXJ0eShzdHJvbmcsIG5vbmF0b21pYykgTlNGaWxlSGFuZGxlICppbnB1dEZpbGVIYW5kbGU7CitAcHJvcGVydHkoc3Ryb25nLCBub25hdG9taWMpIE5TRmlsZUhhbmRsZSAqb3V0cHV0RmlsZUhhbmRsZTsKKworQGVuZAogCiAKIEBpbXBsZW1lbnRhdGlvbiBUTlNGaWxlSGFuZGxlVHJhbnNwb3J0CiAKLS0gKGlkKSBpbml0V2l0aEZpbGVIYW5kbGU6IChOU0ZpbGVIYW5kbGUgKikgZmlsZUhhbmRsZQorLShpZCkgaW5pdFdpdGhGaWxlSGFuZGxlOihOU0ZpbGVIYW5kbGUgKilmaWxlSGFuZGxlCiB7Ci0gIHJldHVybiBbc2VsZiBpbml0V2l0aElucHV0RmlsZUhhbmRsZTogZmlsZUhhbmRsZQotICAgICAgICAgICAgICAgICAgICAgIG91dHB1dEZpbGVIYW5kbGU6IGZpbGVIYW5kbGVdOworICByZXR1cm4gW3NlbGYgaW5pdFdpdGhJbnB1dEZpbGVIYW5kbGU6ZmlsZUhhbmRsZQorICAgICAgICAgICAgICAgICAgICAgIG91dHB1dEZpbGVIYW5kbGU6ZmlsZUhhbmRsZV07CiB9CiAKIAotLSAoaWQpIGluaXRXaXRoSW5wdXRGaWxlSGFuZGxlOiAoTlNGaWxlSGFuZGxlICopIGlucHV0RmlsZUhhbmRsZQotICAgICAgICAgICAgICBvdXRwdXRGaWxlSGFuZGxlOiAoTlNGaWxlSGFuZGxlICopIG91dHB1dEZpbGVIYW5kbGUKKy0oaWQpIGluaXRXaXRoSW5wdXRGaWxlSGFuZGxlOihOU0ZpbGVIYW5kbGUgKilhSW5wdXRGaWxlSGFuZGxlCisgICAgICAgICAgICAgb3V0cHV0RmlsZUhhbmRsZTooTlNGaWxlSGFuZGxlICopYU91dHB1dEZpbGVIYW5kbGUKIHsKICAgc2VsZiA9IFtzdXBlciBpbml0XTsKLQotICBtSW5wdXRGaWxlSGFuZGxlID0gW2lucHV0RmlsZUhhbmRsZSByZXRhaW5fc3R1Yl07Ci0gIG1PdXRwdXRGaWxlSGFuZGxlID0gW291dHB1dEZpbGVIYW5kbGUgcmV0YWluX3N0dWJdOwotCisgIGlmIChzZWxmKSB7CisgICAgX2lucHV0RmlsZUhhbmRsZSA9IGFJbnB1dEZpbGVIYW5kbGU7CisgICAgX291dHB1dEZpbGVIYW5kbGUgPSBhT3V0cHV0RmlsZUhhbmRsZTsKKyAgfQogICByZXR1cm4gc2VsZjsKIH0KIAogCi0tICh2b2lkKSBkZWFsbG9jIHsKLSAgW21JbnB1dEZpbGVIYW5kbGUgcmVsZWFzZV9zdHViXTsKLSAgW21PdXRwdXRGaWxlSGFuZGxlIHJlbGVhc2Vfc3R1Yl07Ci0gIFtzdXBlciBkZWFsbG9jX3N0dWJdOworLShCT09MKSByZWFkQWxsOihVSW50OCAqKWJ1ZiBvZmZzZXQ6KFVJbnQzMilvZmYgbGVuZ3RoOihVSW50MzIpbGVuIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBVSW50MzIgZ290ID0gMDsKKyAgd2hpbGUgKGdvdCA8IGxlbikgeworCisgICAgTlNEYXRhICpkID0gW19pbnB1dEZpbGVIYW5kbGUgcmVhZERhdGFPZkxlbmd0aDpsZW4tZ290XTsKKyAgICBpZiAoZC5sZW5ndGggPT0gMCkgeworICAgICAgaWYgKGVycm9yKSB7CisgICAgICAgICplcnJvciA9IFtOU0Vycm9yIGVycm9yV2l0aERvbWFpbjpUVHJhbnNwb3J0RXJyb3JEb21haW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOlRUcmFuc3BvcnRFcnJvckVuZE9mRmlsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckluZm86bmlsXTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisKKyAgICBbZCBnZXRCeXRlczpidWYrZ290IGxlbmd0aDpkLmxlbmd0aF07CisgICAgZ290ICs9IGQubGVuZ3RoOworICB9CisgIHJldHVybiBZRVM7CiB9CiAKIAotLSAoaW50KSByZWFkQWxsOiAodWludDhfdCAqKSBidWYgb2Zmc2V0OiAoaW50KSBvZmYgbGVuZ3RoOiAoaW50KSBsZW4KKy0oVUludDMyKSByZWFkQXZhaWw6KFVJbnQ4ICopYnVmIG9mZnNldDooVUludDMyKW9mZiBtYXhMZW5ndGg6KFVJbnQzMilsZW4gZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gIGludCBnb3QgPSAwOworICBVSW50MzIgZ290ID0gMDsKICAgd2hpbGUgKGdvdCA8IGxlbikgewotICAgIE5TRGF0YSAqIGQgPSBbbUlucHV0RmlsZUhhbmRsZSByZWFkRGF0YU9mTGVuZ3RoOiBsZW4tZ290XTsKLSAgICBpZiAoW2QgbGVuZ3RoXSA9PSAwKSB7Ci0gICAgICBAdGhyb3cgW1RUcmFuc3BvcnRFeGNlcHRpb24gZXhjZXB0aW9uV2l0aE5hbWU6IEAiVFRyYW5zcG9ydEV4Y2VwdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb246IEAiQ2Fubm90IHJlYWQuIE5vIG1vcmUgZGF0YS4iXTsKKworICAgIE5TRGF0YSAqZCA9IFtfaW5wdXRGaWxlSGFuZGxlIHJlYWREYXRhT2ZMZW5ndGg6bGVuLWdvdF07CisgICAgaWYgKGQubGVuZ3RoID09IDApIHsKKyAgICAgIGJyZWFrOwogICAgIH0KLSAgICBbZCBnZXRCeXRlczogYnVmK2dvdF07Ci0gICAgZ290ICs9IFtkIGxlbmd0aF07CisKKyAgICBbZCBnZXRCeXRlczpidWYrZ290IGxlbmd0aDpkLmxlbmd0aF07CisgICAgZ290ICs9IGQubGVuZ3RoOwogICB9CiAgIHJldHVybiBnb3Q7CiB9CiAKIAotLSAodm9pZCkgd3JpdGU6IChjb25zdCB1aW50OF90ICopIGRhdGEgb2Zmc2V0OiAodW5zaWduZWQgaW50KSBvZmZzZXQgbGVuZ3RoOiAodW5zaWduZWQgaW50KSBsZW5ndGgKKy0oQk9PTCkgd3JpdGU6KGNvbnN0IFVJbnQ4ICopZGF0YSBvZmZzZXQ6KFVJbnQzMilvZmZzZXQgbGVuZ3RoOihVSW50MzIpbGVuZ3RoIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICB2b2lkICpwb3MgPSAodm9pZCAqKSBkYXRhICsgb2Zmc2V0OwotICBOU0RhdGEgKiBkYXRhT2JqZWN0ID0gW1tOU0RhdGEgYWxsb2NdIGluaXRXaXRoQnl0ZXNOb0NvcHk6IHBvcyAvLyBkYXRhK29mZnNldAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGg6IGxlbmd0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlV2hlbkRvbmU6IE5PXTsKKyAgdm9pZCAqcG9zID0gKHZvaWQgKilkYXRhICsgb2Zmc2V0OwogCiAgIEB0cnkgewotICAgIFttT3V0cHV0RmlsZUhhbmRsZSB3cml0ZURhdGE6IGRhdGFPYmplY3RdOwotICB9IEBjYXRjaCAoTlNFeGNlcHRpb24gKiBlKSB7Ci0gICAgQHRocm93IFtUVHJhbnNwb3J0RXhjZXB0aW9uIGV4Y2VwdGlvbldpdGhOYW1lOiBAIlRUcmFuc3BvcnRFeGNlcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uOiBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDogQCIlczogVW5hYmxlIHRvIHdyaXRlIGRhdGE6ICVAIiwgX19QUkVUVFlfRlVOQ1RJT05fXywgZV1dOworICAgIFtfb3V0cHV0RmlsZUhhbmRsZSB3cml0ZURhdGE6W05TRGF0YSBkYXRhV2l0aEJ5dGVzTm9Db3B5OnBvcyBsZW5ndGg6bGVuZ3RoIGZyZWVXaGVuRG9uZTpOT11dOworICB9CisgIEBjYXRjaCAoTlNFeGNlcHRpb24gKmUpIHsKKyAgICBpZiAoZXJyb3IpIHsKKyAgICAgICplcnJvciA9IFtOU0Vycm9yIGVycm9yV2l0aERvbWFpbjpUVHJhbnNwb3J0RXJyb3JEb21haW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZTpUVHJhbnNwb3J0RXJyb3JOb3RPcGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckluZm86QHt9XTsKKyAgICB9CisgICAgcmV0dXJuIE5POwogICB9CiAKLSAgW2RhdGFPYmplY3QgcmVsZWFzZV9zdHViXTsKKyAgcmV0dXJuIFlFUzsKIH0KIAogCi0tICh2b2lkKSBmbHVzaAorLShCT09MKSBmbHVzaDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLQorICByZXR1cm4gWUVTOwogfQogCiBAZW5kCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UTlNTdHJlYW1UcmFuc3BvcnQuaCBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1ROU1N0cmVhbVRyYW5zcG9ydC5oCmluZGV4IDgwMTFmYjkuLjU0YzQ4ODQgMTAwNjQ0Ci0tLSBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1ROU1N0cmVhbVRyYW5zcG9ydC5oCisrKyBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1ROU1N0cmVhbVRyYW5zcG9ydC5oCkBAIC0yMCwyMSArMjAsMjQgQEAKICNpbXBvcnQgPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPgogI2ltcG9ydCAiVFRyYW5zcG9ydC5oIgogCi1AaW50ZXJmYWNlIFROU1N0cmVhbVRyYW5zcG9ydCA6IE5TT2JqZWN0IDxUVHJhbnNwb3J0PiB7CitOU19BU1NVTUVfTk9OTlVMTF9CRUdJTgogCi19CiAKLUBwcm9wZXJ0eSAobm9uYXRvbWljLCBzdHJvbmcpIE5TSW5wdXRTdHJlYW0gKiBtSW5wdXQ7Ci1AcHJvcGVydHkgKG5vbmF0b21pYywgc3Ryb25nKSBOU091dHB1dFN0cmVhbSAqIG1PdXRwdXQ7CitAaW50ZXJmYWNlIFROU1N0cmVhbVRyYW5zcG9ydCA6IE5TT2JqZWN0IDxUVHJhbnNwb3J0PgogCi0tIChpZCkgaW5pdFdpdGhJbnB1dFN0cmVhbTogKE5TSW5wdXRTdHJlYW0gKikgaW5wdXQKLSAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtOiAoTlNPdXRwdXRTdHJlYW0gKikgb3V0cHV0OworQHByb3BlcnR5IChzdHJvbmcsIG5vbmF0b21pYykgTlNJbnB1dFN0cmVhbSAqaW5wdXQ7CitAcHJvcGVydHkgKHN0cm9uZywgbm9uYXRvbWljKSBOU091dHB1dFN0cmVhbSAqb3V0cHV0OwogCi0tIChpZCkgaW5pdFdpdGhJbnB1dFN0cmVhbTogKE5TSW5wdXRTdHJlYW0gKikgaW5wdXQ7CistKGlkKSBpbml0V2l0aElucHV0U3RyZWFtOihudWxsYWJsZSBOU0lucHV0U3RyZWFtICopaW5wdXQKKyAgICAgICAgICAgICBvdXRwdXRTdHJlYW06KG51bGxhYmxlIE5TT3V0cHV0U3RyZWFtICopb3V0cHV0OwogCi0tIChpZCkgaW5pdFdpdGhPdXRwdXRTdHJlYW06IChOU091dHB1dFN0cmVhbSAqKSBvdXRwdXQ7CistKGlkKSBpbml0V2l0aElucHV0U3RyZWFtOihOU0lucHV0U3RyZWFtICopaW5wdXQ7CisKKy0oaWQpIGluaXRXaXRoT3V0cHV0U3RyZWFtOihOU091dHB1dFN0cmVhbSAqKW91dHB1dDsKKworLSh2b2lkKSBjbG9zZTsKIAogQGVuZAogCiAKLQorTlNfQVNTVU1FX05PTk5VTExfRU5ECmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UTlNTdHJlYW1UcmFuc3BvcnQubSBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1ROU1N0cmVhbVRyYW5zcG9ydC5tCmluZGV4IGUyYmMyNDkuLjE4YzQxZDMgMTAwNjQ0Ci0tLSBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1ROU1N0cmVhbVRyYW5zcG9ydC5tCisrKyBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1ROU1N0cmVhbVRyYW5zcG9ydC5tCkBAIC0xOCw3MyArMTgsMTM2IEBACiAgKi8KIAogI2ltcG9ydCAiVE5TU3RyZWFtVHJhbnNwb3J0LmgiCi0jaW1wb3J0ICJUVHJhbnNwb3J0RXhjZXB0aW9uLmgiCi0jaW1wb3J0ICJUT2JqZWN0aXZlLUMuaCIKKyNpbXBvcnQgIlRUcmFuc3BvcnRFcnJvci5oIgorCisKK0BpbnRlcmZhY2UgVE5TU3RyZWFtVHJhbnNwb3J0ICgpCitAZW5kCiAKIAogQGltcGxlbWVudGF0aW9uIFROU1N0cmVhbVRyYW5zcG9ydAogCi0tIChpZCkgaW5pdFdpdGhJbnB1dFN0cmVhbTogKE5TSW5wdXRTdHJlYW0gKikgaW5wdXQKLSAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtOiAoTlNPdXRwdXRTdHJlYW0gKikgb3V0cHV0CistKGlkKSBpbml0V2l0aElucHV0U3RyZWFtOihOU0lucHV0U3RyZWFtICopaW5wdXQKKyAgICAgICAgICAgICBvdXRwdXRTdHJlYW06KE5TT3V0cHV0U3RyZWFtICopb3V0cHV0CiB7CiAgIHNlbGYgPSBbc3VwZXIgaW5pdF07Ci0gIHNlbGYubUlucHV0ID0gW2lucHV0IHJldGFpbl9zdHViXTsKLSAgc2VsZi5tT3V0cHV0ID0gW291dHB1dCByZXRhaW5fc3R1Yl07CisgIGlmIChzZWxmKSB7CisgICAgX2lucHV0ID0gaW5wdXQ7CisgICAgX291dHB1dCA9IG91dHB1dDsKKyAgfQogICByZXR1cm4gc2VsZjsKIH0KIAotLSAoaWQpIGluaXRXaXRoSW5wdXRTdHJlYW06IChOU0lucHV0U3RyZWFtICopIGlucHV0CistKGlkKSBpbml0V2l0aElucHV0U3RyZWFtOihOU0lucHV0U3RyZWFtICopaW5wdXQKIHsKLSAgcmV0dXJuIFtzZWxmIGluaXRXaXRoSW5wdXRTdHJlYW06IGlucHV0IG91dHB1dFN0cmVhbTogbmlsXTsKKyAgcmV0dXJuIFtzZWxmIGluaXRXaXRoSW5wdXRTdHJlYW06aW5wdXQgb3V0cHV0U3RyZWFtOm5pbF07CiB9CiAKLS0gKGlkKSBpbml0V2l0aE91dHB1dFN0cmVhbTogKE5TT3V0cHV0U3RyZWFtICopIG91dHB1dAorLShpZCkgaW5pdFdpdGhPdXRwdXRTdHJlYW06KE5TT3V0cHV0U3RyZWFtICopb3V0cHV0CiB7Ci0gIHJldHVybiBbc2VsZiBpbml0V2l0aElucHV0U3RyZWFtOiBuaWwgb3V0cHV0U3RyZWFtOiBvdXRwdXRdOworICByZXR1cm4gW3NlbGYgaW5pdFdpdGhJbnB1dFN0cmVhbTpuaWwgb3V0cHV0U3RyZWFtOm91dHB1dF07CiB9CiAKLS0gKHZvaWQpIGRlYWxsb2MKKy0odm9pZCkgZGVhbGxvYwogewotICBbc2VsZi5tSW5wdXQgcmVsZWFzZV9zdHViXTsKLSAgW3NlbGYubU91dHB1dCByZWxlYXNlX3N0dWJdOwotICBbc3VwZXIgZGVhbGxvY19zdHViXTsKKyAgW3NlbGYgY2xvc2VdOwogfQogCi0KLS0gKGludCkgcmVhZEFsbDogKHVpbnQ4X3QgKikgYnVmIG9mZnNldDogKGludCkgb2ZmIGxlbmd0aDogKGludCkgbGVuCistKEJPT0wpIHJlYWRBbGw6KFVJbnQ4ICopYnVmIG9mZnNldDooVUludDMyKW9mZiBsZW5ndGg6KFVJbnQzMilsZW4gZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gIGludCBnb3QgPSAwOwotICBpbnQgcmV0ID0gMDsKKyAgVUludDMyIGdvdCA9IDA7CiAgIHdoaWxlIChnb3QgPCBsZW4pIHsKLSAgICByZXQgPSBbc2VsZi5tSW5wdXQgcmVhZDogYnVmK29mZitnb3QgbWF4TGVuZ3RoOiBsZW4tZ290XTsKLSAgICBpZiAocmV0IDw9IDApIHsKLSAgICAgIEB0aHJvdyBbVFRyYW5zcG9ydEV4Y2VwdGlvbiBleGNlcHRpb25XaXRoUmVhc29uOiBAIkNhbm5vdCByZWFkLiBSZW1vdGUgc2lkZSBoYXMgY2xvc2VkLiJdOworCisgICAgVUludDMyIHJlYWQgPSAoVUludDMyKVtfaW5wdXQgcmVhZDpidWYrb2ZmK2dvdCBtYXhMZW5ndGg6bGVuLWdvdF07CisgICAgaWYgKHJlYWQgPD0gMCkgeworICAgICAgaWYgKGVycm9yKSB7CisgICAgICAgICplcnJvciA9IFtOU0Vycm9yIGVycm9yV2l0aERvbWFpbjpUVHJhbnNwb3J0RXJyb3JEb21haW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOlRUcmFuc3BvcnRFcnJvck5vdE9wZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvOkB7fV07CisgICAgICB9CisgICAgICByZXR1cm4gTk87CiAgICAgfQotICAgIGdvdCArPSByZXQ7CisKKyAgICBnb3QgKz0gcmVhZDsKICAgfQorCisgIHJldHVybiBZRVM7Cit9CisKKworLShVSW50MzIpIHJlYWRBdmFpbDooVUludDggKilidWYgb2Zmc2V0OihVSW50MzIpb2ZmIG1heExlbmd0aDooVUludDMyKWxlbiBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgVUludDMyIGdvdCA9IDA7CisgIHdoaWxlIChnb3QgPCBsZW4pIHsKKworICAgIFVJbnQzMiByZWFkID0gKFVJbnQzMilbX2lucHV0IHJlYWQ6YnVmK29mZitnb3QgbWF4TGVuZ3RoOmxlbi1nb3RdOworICAgIGlmIChyZWFkIDw9IDApIHsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGdvdCArPSByZWFkOworICB9CisKICAgcmV0dXJuIGdvdDsKIH0KIAogCi0tICh2b2lkKSB3cml0ZTogKGNvbnN0IHVpbnQ4X3QgKikgZGF0YSBvZmZzZXQ6ICh1bnNpZ25lZCBpbnQpIG9mZnNldCBsZW5ndGg6ICh1bnNpZ25lZCBpbnQpIGxlbmd0aAorLShCT09MKSB3cml0ZTooY29uc3QgVUludDggKilkYXRhIG9mZnNldDooVUludDMyKW9mZnNldCBsZW5ndGg6KFVJbnQzMilsZW5ndGggZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gIGludCBnb3QgPSAwOwotICBpbnQgcmVzdWx0ID0gMDsKKyAgVUludDMyIGdvdCA9IDA7CisgIE5TSW50ZWdlciB0b3RhbCA9IDA7CiAgIHdoaWxlIChnb3QgPCBsZW5ndGgpIHsKLSAgICByZXN1bHQgPSBbc2VsZi5tT3V0cHV0IHdyaXRlOiBkYXRhK29mZnNldCtnb3QgbWF4TGVuZ3RoOiBsZW5ndGgtZ290XTsKLSAgICBpZiAocmVzdWx0ID09IC0xKSB7Ci0gICAgICBAdGhyb3cgW1RUcmFuc3BvcnRFeGNlcHRpb24gZXhjZXB0aW9uV2l0aFJlYXNvbjogQCJFcnJvciB3cml0aW5nIHRvIHRyYW5zcG9ydCBvdXRwdXQgc3RyZWFtLiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBbc2VsZi5tT3V0cHV0IHN0cmVhbUVycm9yXV07Ci0gICAgfSBlbHNlIGlmIChyZXN1bHQgPT0gMCkgewotICAgICAgQHRocm93IFtUVHJhbnNwb3J0RXhjZXB0aW9uIGV4Y2VwdGlvbldpdGhSZWFzb246IEAiRW5kIG9mIG91dHB1dCBzdHJlYW0uIl07CisKKyAgICB0b3RhbCA9IFtfb3V0cHV0IHdyaXRlOmRhdGErb2Zmc2V0K2dvdCBtYXhMZW5ndGg6bGVuZ3RoLWdvdF07CisgICAgaWYgKHRvdGFsID09IC0xKSB7CisgICAgICBpZiAoZXJyb3IpIHsKKyAgICAgICAgKmVycm9yID0gW05TRXJyb3IgZXJyb3JXaXRoRG9tYWluOlRUcmFuc3BvcnRFcnJvckRvbWFpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6VFRyYW5zcG9ydEVycm9yTm90T3BlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckluZm86QHt9XTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBOTzsKICAgICB9Ci0gICAgZ290ICs9IHJlc3VsdDsKKyAgICBlbHNlIGlmICh0b3RhbCA9PSAwKSB7CisgICAgICBpZiAoZXJyb3IpIHsKKyAgICAgICAgKmVycm9yID0gW05TRXJyb3IgZXJyb3JXaXRoRG9tYWluOlRUcmFuc3BvcnRFcnJvckRvbWFpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6VFRyYW5zcG9ydEVycm9yRW5kT2ZGaWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySW5mbzpAe31dOworICAgICAgfQorICAgICAgcmV0dXJuIE5POworICAgIH0KKworICAgIGdvdCArPSB0b3RhbDsKICAgfQorCisgIHJldHVybiBZRVM7CiB9CiAKLS0gKHZvaWQpIGZsdXNoCistKEJPT0wpIGZsdXNoOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICAvLyBubyBmbHVzaCBmb3IgeW91IQorICByZXR1cm4gWUVTOworfQorCistKHZvaWQpIGNsb3NlCit7CisgIE5TSW5wdXRTdHJlYW0gKmlucHV0ID0gc2VsZi5pbnB1dDsKKyAgaWYgKGlucHV0KSB7CisgICAgLy8gQ2xvc2UgYW5kIHJlc2V0IGlucHV0c3RyZWFtCisgICAgQ0ZSZWFkU3RyZWFtU2V0UHJvcGVydHkoKF9fYnJpZGdlIENGUmVhZFN0cmVhbVJlZikoaW5wdXQpLCBrQ0ZTdHJlYW1Qcm9wZXJ0eVNob3VsZENsb3NlTmF0aXZlU29ja2V0LCBrQ0ZCb29sZWFuVHJ1ZSk7CisgICAgW2lucHV0IHNldERlbGVnYXRlOm5pbF07CisgICAgW2lucHV0IGNsb3NlXTsKKyAgICBbaW5wdXQgcmVtb3ZlRnJvbVJ1bkxvb3A6W05TUnVuTG9vcCBjdXJyZW50UnVuTG9vcF0gZm9yTW9kZTpOU0RlZmF1bHRSdW5Mb29wTW9kZV07CisgICAgaW5wdXQgPSBuaWw7CisgIH0KKworICBOU091dHB1dFN0cmVhbSAqb3V0cHV0ID0gc2VsZi5vdXRwdXQ7CisgIGlmIChvdXRwdXQpIHsKKyAgICAvLyBDbG9zZSBhbmQgcmVzZXQgb3V0cHV0c3RyZWFtCisgICAgQ0ZXcml0ZVN0cmVhbVNldFByb3BlcnR5KChfX2JyaWRnZSBDRldyaXRlU3RyZWFtUmVmKShvdXRwdXQpLCBrQ0ZTdHJlYW1Qcm9wZXJ0eVNob3VsZENsb3NlTmF0aXZlU29ja2V0LCBrQ0ZCb29sZWFuVHJ1ZSk7CisgICAgW291dHB1dCBzZXREZWxlZ2F0ZTpuaWxdOworICAgIFtvdXRwdXQgY2xvc2VdOworICAgIFtvdXRwdXQgcmVtb3ZlRnJvbVJ1bkxvb3A6W05TUnVuTG9vcCBjdXJyZW50UnVuTG9vcF0gZm9yTW9kZTpOU0RlZmF1bHRSdW5Mb29wTW9kZV07CisgICAgb3V0cHV0ID0gbmlsOworICB9CiB9CiAKIEBlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RTU0xTb2NrZXRDbGllbnQuaCBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RTU0xTb2NrZXRDbGllbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRkZTEyNC4uMDAwMDAwMAotLS0gYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU1NMU29ja2V0Q2xpZW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbXBvcnQgPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPgotI2ltcG9ydCAiVE5TU3RyZWFtVHJhbnNwb3J0LmgiCi0KLUBpbnRlcmZhY2UgVFNTTFNvY2tldENsaWVudCA6IFROU1N0cmVhbVRyYW5zcG9ydAotI2lmIFRBUkdFVF9PU19JUEhPTkUgfHwgKE1BQ19PU19YX1ZFUlNJT05fTUFYX0FMTE9XRUQgPj0gTUFDX09TX1hfVkVSU0lPTl8xMF82KQotPE5TU3RyZWFtRGVsZWdhdGU+Ci0jZW5kaWYKLXsKLSAgICBOU0lucHV0U3RyZWFtICppbnB1dFN0cmVhbTsKLSAgICBOU091dHB1dFN0cmVhbSAqb3V0cHV0U3RyZWFtOwotQHByaXZhdGUKLSAgICBOU1N0cmluZyAqc3NsSG9zdG5hbWU7Ci0gICAgaW50IHNkOwotfQotCi0tIChpZCkgaW5pdFdpdGhIb3N0bmFtZTogKE5TU3RyaW5nICopIGhvc3RuYW1lCi0gICAgICAgICAgICAgICAgICAgcG9ydDogKGludCkgcG9ydDsKLQotLSAoQk9PTCkgaXNPcGVuOwotCi1AZW5kCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU1NMU29ja2V0Q2xpZW50Lm0gYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU1NMU29ja2V0Q2xpZW50Lm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiNWEyYjQuLjAwMDAwMDAKLS0tIGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFNTTFNvY2tldENsaWVudC5tCisrKyAvZGV2L251bGwKQEAgLTEsMjYzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSNpbXBvcnQgPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPgotI2ltcG9ydCA8Q29yZUZvdW5kYXRpb24vQ29yZUZvdW5kYXRpb24uaD4KLSNpbXBvcnQgIlRTU0xTb2NrZXRDbGllbnQuaCIKLSNpbXBvcnQgIlRTU0xTb2NrZXRFeGNlcHRpb24uaCIKLSNpbXBvcnQgIlRPYmplY3RpdmUtQy5oIgotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLSNpbmNsdWRlIDxuZXRpbmV0L2luLmg+Ci0jaW5jbHVkZSA8bmV0ZGIuaD4KLQotI2lmICFUQVJHRVRfT1NfSVBIT05FCi0jaW1wb3J0IDxDb3JlU2VydmljZXMvQ29yZVNlcnZpY2VzLmg+Ci0jZWxzZQotI2ltcG9ydCA8Q0ZOZXR3b3JrL0NGTmV0d29yay5oPgotI2VuZGlmCi0KLUBpbXBsZW1lbnRhdGlvbiBUU1NMU29ja2V0Q2xpZW50Ci0KLS0gKGlkKSBpbml0V2l0aEhvc3RuYW1lOiAoTlNTdHJpbmcgKikgaG9zdG5hbWUKLSAgICAgICAgICAgICAgICAgICBwb3J0OiAoaW50KSBwb3J0Ci17Ci0gICAgc3NsSG9zdG5hbWUgPSBob3N0bmFtZTsKLQlDRlJlYWRTdHJlYW1SZWYgcmVhZFN0cmVhbSA9IE5VTEw7Ci0JQ0ZXcml0ZVN0cmVhbVJlZiB3cml0ZVN0cmVhbSA9IE5VTEw7Ci0gICAgCi0gICAgCi0gICAgLyogY3JlYXRlIGEgc29ja2V0IHN0cnVjdHVyZSAqLwotICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBwaW47Ci0gICAgc3RydWN0IGhvc3RlbnQgKmhwID0gTlVMTDsKLSAgICBmb3IoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgewotICAgICAgICAKLQotICAgICAgICAKLSAgICAgICAgaWYgKChocCA9IGdldGhvc3RieW5hbWUoW2hvc3RuYW1lIFVURjhTdHJpbmddKSkgPT0gTlVMTCkgeyAKLSAgICAgICAgICAgIE5TTG9nKEAiZmFpbGVkIHRvIHJlc29sdmUgaG9zdG5hbWUgJUAiLCBob3N0bmFtZSk7Ci0gICAgICAgICAgICBoZXJyb3IoInJlc29sdiIpOwotICAgICAgICAgICAgaWYoaSA9PSA5KSB7Ci0gICAgICAgICAgICAgICAgQHRocm93IFtUU1NMU29ja2V0RXhjZXB0aW9uIGV4Y2VwdGlvbldpdGhSZWFzb246IEAiZmFpbGVkIHRvIHJlc29sdmUgaG9zdG5hbWUiXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFtOU1RocmVhZCBzbGVlcEZvclRpbWVJbnRlcnZhbDowLjJdOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgbWVtc2V0ICgmcGluLCAwLCBzaXplb2YocGluKSk7Ci0gICAgcGluLnNpbl9mYW1pbHkgPSBBRl9JTkVUOwotICAgIHBpbi5zaW5fYWRkci5zX2FkZHIgPSAoKHN0cnVjdCBpbl9hZGRyICopIChocC0+aF9hZGRyKSktPnNfYWRkcjsKLSAgICBwaW4uc2luX3BvcnQgPSBodG9ucyAocG9ydCk7Ci0gICAgCi0gICAgLyogY3JlYXRlIHRoZSBzb2NrZXQgKi8KLSAgICBpZiAoKHNkID0gc29ja2V0IChBRl9JTkVULCBTT0NLX1NUUkVBTSwgSVBQUk9UT19UQ1ApKSA9PSAtMSkKLSAgICB7Ci0gICAgICAgIE5TTG9nKEAiZmFpbGVkIHRvIGNyZWF0ZSBzb2NrZXQgZm9yIGhvc3QgJUA6JWQiLCBob3N0bmFtZSwgcG9ydCk7Ci0gICAgICAgIEB0aHJvdyBbVFNTTFNvY2tldEV4Y2VwdGlvbiBleGNlcHRpb25XaXRoUmVhc29uOiBAImZhaWxlZCB0byBjcmVhdGUgc29ja2V0Il07Ci0gICAgfQotICAgIAotICAgIC8qIG9wZW4gYSBjb25uZWN0aW9uICovCi0gICAgaWYgKGNvbm5lY3QgKHNkLCAoc3RydWN0IHNvY2thZGRyICopICZwaW4sIHNpemVvZihwaW4pKSA9PSAtMSkKLSAgICB7Ci0gICAgICAgIE5TTG9nKEAiZmFpbGVkIHRvIGNyZWF0ZSBjb25lbmN0IHRvIGhvc3QgJUA6JWQiLCBob3N0bmFtZSwgcG9ydCk7Ci0gICAgICAgIEB0aHJvdyBbVFNTTFNvY2tldEV4Y2VwdGlvbiBleGNlcHRpb25XaXRoUmVhc29uOiBAImZhaWxlZCB0byBjb25uZWN0Il07Ci0gICAgfQotICAgIENGU3RyZWFtQ3JlYXRlUGFpcldpdGhTb2NrZXQoa0NGQWxsb2NhdG9yRGVmYXVsdCwgc2QsICZyZWFkU3RyZWFtLCAmd3JpdGVTdHJlYW0pOwotICAgIAotICAgIENGUmVhZFN0cmVhbVNldFByb3BlcnR5KHJlYWRTdHJlYW0sIGtDRlN0cmVhbVByb3BlcnR5U2hvdWxkQ2xvc2VOYXRpdmVTb2NrZXQsIGtDRkJvb2xlYW5UcnVlKTsKLSAgICBDRldyaXRlU3RyZWFtU2V0UHJvcGVydHkod3JpdGVTdHJlYW0sIGtDRlN0cmVhbVByb3BlcnR5U2hvdWxkQ2xvc2VOYXRpdmVTb2NrZXQsIGtDRkJvb2xlYW5UcnVlKTsKLSAgICAKLQlpZiAocmVhZFN0cmVhbSAmJiB3cml0ZVN0cmVhbSkgewotICAgICAgICBDRlJlYWRTdHJlYW1TZXRQcm9wZXJ0eShyZWFkU3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQ0ZTdHJlYW1Qcm9wZXJ0eVNvY2tldFNlY3VyaXR5TGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtDRlN0cmVhbVNvY2tldFNlY3VyaXR5TGV2ZWxUTFN2MSk7Ci0gICAgICAgIAotICAgICAgICBOU0RpY3Rpb25hcnkgKnNldHRpbmdzID0KLSAgICAgICAgW05TRGljdGlvbmFyeSBkaWN0aW9uYXJ5V2l0aE9iamVjdHNBbmRLZXlzOgotICAgICAgICAgKGlkKWtDRkJvb2xlYW5UcnVlLCAoaWQpa0NGU3RyZWFtU1NMVmFsaWRhdGVzQ2VydGlmaWNhdGVDaGFpbiwKLSAgICAgICAgIG5pbF07Ci0gICAgICAgIAotICAgICAgICBDRlJlYWRTdHJlYW1TZXRQcm9wZXJ0eSgoQ0ZSZWFkU3RyZWFtUmVmKXJlYWRTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtDRlN0cmVhbVByb3BlcnR5U1NMU2V0dGluZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDRlR5cGVSZWYpc2V0dGluZ3MpOwotICAgICAgICBDRldyaXRlU3RyZWFtU2V0UHJvcGVydHkoKENGV3JpdGVTdHJlYW1SZWYpd3JpdGVTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQ0ZTdHJlYW1Qcm9wZXJ0eVNTTFNldHRpbmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENGVHlwZVJlZilzZXR0aW5ncyk7Ci0gICAgICAgIAotCQlpbnB1dFN0cmVhbSA9IChicmlkZ2Vfc3R1YiBOU0lucHV0U3RyZWFtICopcmVhZFN0cmVhbTsKLQkJW2lucHV0U3RyZWFtIHJldGFpbl9zdHViXTsKLQkJW2lucHV0U3RyZWFtIHNldERlbGVnYXRlOnNlbGZdOwotICAgCQlbaW5wdXRTdHJlYW0gc2NoZWR1bGVJblJ1bkxvb3A6W05TUnVuTG9vcCBtYWluUnVuTG9vcF0gZm9yTW9kZTpOU0RlZmF1bHRSdW5Mb29wTW9kZV07Ci0JCVtpbnB1dFN0cmVhbSBvcGVuXTsKLQkJCi0JCW91dHB1dFN0cmVhbSA9IChicmlkZ2Vfc3R1YiBOU091dHB1dFN0cmVhbSAqKXdyaXRlU3RyZWFtOwotCQlbb3V0cHV0U3RyZWFtIHJldGFpbl9zdHViXTsKLQkJW291dHB1dFN0cmVhbSBzZXREZWxlZ2F0ZTpzZWxmXTsKLSAgICAgICAgW291dHB1dFN0cmVhbSBzY2hlZHVsZUluUnVuTG9vcDpbTlNSdW5Mb29wIG1haW5SdW5Mb29wXSBmb3JNb2RlOk5TRGVmYXVsdFJ1bkxvb3BNb2RlXTsKLQkJW291dHB1dFN0cmVhbSBvcGVuXTsKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBDRlJlbGVhc2UocmVhZFN0cmVhbSk7Ci0gICAgICAgIENGUmVsZWFzZSh3cml0ZVN0cmVhbSk7Ci0JfQotICAgIAotICAgIAotCQotCXNlbGYgPSBbc3VwZXIgaW5pdFdpdGhJbnB1dFN0cmVhbTogaW5wdXRTdHJlYW0gb3V0cHV0U3RyZWFtOiBvdXRwdXRTdHJlYW1dOwotICAgIAotCXJldHVybiBzZWxmOwotfQotCi0jcHJhZ21hIG1hcmsgLQotI3ByYWdtYSBtYXJrIE5TU3RyZWFtRGVsZWdhdGUKLS0gKHZvaWQpc3RyZWFtOihOU1N0cmVhbSAqKWFTdHJlYW0KLSAgICBoYW5kbGVFdmVudDooTlNTdHJlYW1FdmVudClldmVudENvZGUgewotICAgIHN3aXRjaCAoZXZlbnRDb2RlKSB7Ci0gICAgICAgIGNhc2UgTlNTdHJlYW1FdmVudE5vbmU6Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBOU1N0cmVhbUV2ZW50SGFzQnl0ZXNBdmFpbGFibGU6Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBOU1N0cmVhbUV2ZW50T3BlbkNvbXBsZXRlZDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE5TU3RyZWFtRXZlbnRIYXNTcGFjZUF2YWlsYWJsZToKLSAgICAgICAgewotICAgICAgICAgICAgU2VjUG9saWN5UmVmIHBvbGljeSA9IFNlY1BvbGljeUNyZWF0ZVNTTChOTywgKF9fYnJpZGdlIENGU3RyaW5nUmVmKShzc2xIb3N0bmFtZSkpOwotICAgICAgICAgICAgU2VjVHJ1c3RSZWYgdHJ1c3QgPSBOVUxMOwotICAgICAgICAgICAgQ0ZBcnJheVJlZiBzdHJlYW1DZXJ0aWZpY2F0ZXNSZWYgPQotICAgICAgICAgICAgQ0ZCcmlkZ2luZ1JldGFpbigoX19icmlkZ2UgaWQpKChfX2JyaWRnZSBDRkFycmF5UmVmKShbYVN0cmVhbSBwcm9wZXJ0eUZvcktleTooTlNTdHJpbmcgKikga0NGU3RyZWFtUHJvcGVydHlTU0xQZWVyQ2VydGlmaWNhdGVzXSkpKTsKLSAgICAgICAgICAgIFNlY1RydXN0Q3JlYXRlV2l0aENlcnRpZmljYXRlcyhDRkJyaWRnaW5nUmV0YWluKChfX2JyaWRnZSBpZCkoc3RyZWFtQ2VydGlmaWNhdGVzUmVmKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9saWN5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cnVzdCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFNlY1RydXN0UmVzdWx0VHlwZSB0cnVzdFJlc3VsdFR5cGUgPSBrU2VjVHJ1c3RSZXN1bHRJbnZhbGlkOwotICAgICAgICAgICAgU2VjVHJ1c3RFdmFsdWF0ZSh0cnVzdCwgJnRydXN0UmVzdWx0VHlwZSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIEJPT0wgcHJvY2VlZCA9IE5POwotICAgICAgICAgICAgc3dpdGNoICh0cnVzdFJlc3VsdFR5cGUpIHsKLSAgICAgICAgICAgICAgICBjYXNlIGtTZWNUcnVzdFJlc3VsdFByb2NlZWQ6Ci0gICAgICAgICAgICAgICAgICAgIHByb2NlZWQgPSBZRVM7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2Uga1NlY1RydXN0UmVzdWx0VW5zcGVjaWZpZWQ6Ci0gICAgICAgICAgICAgICAgICAgIE5TTG9nKEAiVHJ1c3RlZCBieSBPUyIpOwotICAgICAgICAgICAgICAgICAgICBwcm9jZWVkID0gWUVTOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIGtTZWNUcnVzdFJlc3VsdFJlY292ZXJhYmxlVHJ1c3RGYWlsdXJlOgotICAgICAgICAgICAgICAgICAgICBwcm9jZWVkID0gcmVjb3ZlckZyb21UcnVzdEZhaWx1cmUodHJ1c3QpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIGtTZWNUcnVzdFJlc3VsdERlbnk6Ci0gICAgICAgICAgICAgICAgICAgIE5TTG9nKEAiRGVueSIpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIGtTZWNUcnVzdFJlc3VsdEZhdGFsVHJ1c3RGYWlsdXJlOgotICAgICAgICAgICAgICAgICAgICBOU0xvZyhAIkZhdGFsVHJ1c3RGYWlsdXJlIik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2Uga1NlY1RydXN0UmVzdWx0T3RoZXJFcnJvcjoKLSAgICAgICAgICAgICAgICAgICAgTlNMb2coQCJPdGhlckVycm9yIik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2Uga1NlY1RydXN0UmVzdWx0SW52YWxpZDoKLSAgICAgICAgICAgICAgICAgICAgTlNMb2coQCJJbnZhbGlkIik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIE5TTG9nKEAiRGVmYXVsdCIpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHRydXN0KSB7Ci0gICAgICAgICAgICAgICAgQ0ZSZWxlYXNlKHRydXN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwb2xpY3kpIHsKLSAgICAgICAgICAgICAgICBDRlJlbGVhc2UocG9saWN5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghcHJvY2VlZCkgewotICAgICAgICAgICAgICAgIE5TTG9nKEAiQ2Fubm90IHRydXN0IGNlcnRpZmljYXRlLiBUcnVzdFJlc3VsdFR5cGU6ICV1IiwgdHJ1c3RSZXN1bHRUeXBlKTsKLSAgICAgICAgICAgICAgICBbYVN0cmVhbSBjbG9zZV07Ci0gICAgICAgICAgICAgICAgQHRocm93IFtUU1NMU29ja2V0RXhjZXB0aW9uIGV4Y2VwdGlvbldpdGhSZWFzb246IEAiQ2Fubm90IHRydXN0IGNlcnRpZmljYXRlIl07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE5TU3RyZWFtRXZlbnRFcnJvck9jY3VycmVkOgotICAgICAgICB7Ci0gICAgICAgICAgICBOU0Vycm9yICp0aGVFcnJvciA9IFthU3RyZWFtIHN0cmVhbUVycm9yXTsKLSAgICAgICAgICAgIE5TTG9nKEAiRXJyb3Igb2NjdXJlZCBvcGVuaW5nIHN0cmVhbTogJUAiLCB0aGVFcnJvcik7Ci0vLyAgICAgICAgICAgIEB0aHJvdyBbVFNTTFNvY2tldEV4Y2VwdGlvbiBleGNlcHRpb25XaXRoUmVhc29uOiBAIkVycm9yIG9jY3VyZWQgb3BlbmluZyBzdHJlYW0iIGVycm9yOiB0aGVFcnJvcl07Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIE5TU3RyZWFtRXZlbnRFbmRFbmNvdW50ZXJlZDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi1ib29sIHJlY292ZXJGcm9tVHJ1c3RGYWlsdXJlKFNlY1RydXN0UmVmIG15VHJ1c3QpCi17Ci0gICAgCi0gICAgU2VjVHJ1c3RSZXN1bHRUeXBlIHRydXN0UmVzdWx0OwotICAgIE9TU3RhdHVzIHN0YXR1cyA9IFNlY1RydXN0RXZhbHVhdGUobXlUcnVzdCwgJnRydXN0UmVzdWx0KTsKLSAgICAKLSAgICBDRkFic29sdXRlVGltZSB0cnVzdFRpbWUsY3VycmVudFRpbWUsdGltZUluY3JlbWVudCxuZXdUaW1lOwotICAgIENGRGF0ZVJlZiBuZXdEYXRlOwotICAgIGlmICh0cnVzdFJlc3VsdCA9PSBrU2VjVHJ1c3RSZXN1bHRSZWNvdmVyYWJsZVRydXN0RmFpbHVyZSkgewotICAgICAgICB0cnVzdFRpbWUgPSBTZWNUcnVzdEdldFZlcmlmeVRpbWUobXlUcnVzdCk7Ci0gICAgICAgIHRpbWVJbmNyZW1lbnQgPSAzMTUzNjAwMDsKLSAgICAgICAgY3VycmVudFRpbWUgPSBDRkFic29sdXRlVGltZUdldEN1cnJlbnQoKTsKLSAgICAgICAgbmV3VGltZSA9IGN1cnJlbnRUaW1lIC0gdGltZUluY3JlbWVudDsKLSAgICAgICAgaWYgKHRydXN0VGltZSAtIG5ld1RpbWUpewotICAgICAgICAgICAgbmV3RGF0ZSA9IENGRGF0ZUNyZWF0ZShOVUxMLCBuZXdUaW1lKTsKLSAgICAgICAgICAgIFNlY1RydXN0U2V0VmVyaWZ5RGF0ZShteVRydXN0LCBuZXdEYXRlKTsKLSAgICAgICAgICAgIHN0YXR1cyA9IFNlY1RydXN0RXZhbHVhdGUobXlUcnVzdCwgJnRydXN0UmVzdWx0KTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAodHJ1c3RSZXN1bHQgIT0ga1NlY1RydXN0UmVzdWx0UHJvY2VlZCkgewotICAgICAgICBOU0xvZyhAIkNlcnRpZmljYXRlIHRydXN0IGZhaWx1cmUiKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotLSAodm9pZCljbG9zZQotewotICAgIGlmKHNlbGYubUlucHV0KSB7Ci0gICAgICAgIC8vQ2xvc2UgYW5kIHJlc2V0IGlucHV0c3RyZWFtCi0gICAgICAgIENGUmVhZFN0cmVhbVNldFByb3BlcnR5KChfX2JyaWRnZSBDRlJlYWRTdHJlYW1SZWYpKHNlbGYubUlucHV0KSwga0NGU3RyZWFtUHJvcGVydHlTaG91bGRDbG9zZU5hdGl2ZVNvY2tldCwga0NGQm9vbGVhblRydWUpOwotICAgICAgICBbc2VsZi5tSW5wdXQgc2V0RGVsZWdhdGU6bmlsXTsKLSAgICAgICAgW3NlbGYubUlucHV0IGNsb3NlXTsKLSAgICAgICAgW3NlbGYubUlucHV0IHJlbW92ZUZyb21SdW5Mb29wOltOU1J1bkxvb3AgY3VycmVudFJ1bkxvb3BdIGZvck1vZGU6TlNEZWZhdWx0UnVuTG9vcE1vZGVdOwotICAgICAgICBzZWxmLm1JbnB1dCA9IG5pbDsKLSAgICB9Ci0gICAgCi0gICAgaWYoc2VsZi5tT3V0cHV0KSB7Ci0gICAgICAgIC8vQ2xvc2UgYW5kIHJlc2V0IG91dHB1dHN0cmVhbQotICAgICAgICBDRlJlYWRTdHJlYW1TZXRQcm9wZXJ0eSgoX19icmlkZ2UgQ0ZSZWFkU3RyZWFtUmVmKShzZWxmLm1PdXRwdXQpLCBrQ0ZTdHJlYW1Qcm9wZXJ0eVNob3VsZENsb3NlTmF0aXZlU29ja2V0LCBrQ0ZCb29sZWFuVHJ1ZSk7Ci0gICAgICAgIFtzZWxmLm1PdXRwdXQgc2V0RGVsZWdhdGU6bmlsXTsKLSAgICAgICAgW3NlbGYubU91dHB1dCBjbG9zZV07Ci0gICAgICAgIFtzZWxmLm1PdXRwdXQgcmVtb3ZlRnJvbVJ1bkxvb3A6W05TUnVuTG9vcCBjdXJyZW50UnVuTG9vcF0gZm9yTW9kZTpOU0RlZmF1bHRSdW5Mb29wTW9kZV07Ci0gICAgICAgIHNlbGYubU91dHB1dCA9IG5pbDsKLSAgICB9Ci19Ci0KLS0gKEJPT0wpIGlzT3BlbgotewotICAgIGlmKHNkID4gMCkKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gRkFMU0U7Ci19Ci0KLUBlbmQKLQpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFNTTFNvY2tldEV4Y2VwdGlvbi5oIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFNTTFNvY2tldEV4Y2VwdGlvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjkwYjA1Li4wMDAwMDAwCi0tLSBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RTU0xTb2NrZXRFeGNlcHRpb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2ltcG9ydCAiVFRyYW5zcG9ydEV4Y2VwdGlvbi5oIgotCi1AaW50ZXJmYWNlIFRTU0xTb2NrZXRFeGNlcHRpb24gOiBUVHJhbnNwb3J0RXhjZXB0aW9uCi0KLSsgKGlkKSBleGNlcHRpb25XaXRoUmVhc29uOiAoTlNTdHJpbmcgKikgcmVhc29uCi0gICAgICAgICAgICAgICAgICAgICBlcnJvcjogKE5TRXJyb3IgKikgZXJyb3I7Ci0KLSsgKGlkKSBleGNlcHRpb25XaXRoUmVhc29uOiAoTlNTdHJpbmcgKikgcmVhc29uOwotCi1AZW5kCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU1NMU29ja2V0RXhjZXB0aW9uLm0gYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU1NMU29ja2V0RXhjZXB0aW9uLm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5ZWFkZjUuLjAwMDAwMDAKLS0tIGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFNTTFNvY2tldEV4Y2VwdGlvbi5tCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW1wb3J0ICJUU1NMU29ja2V0RXhjZXB0aW9uLmgiCi0KLUBpbXBsZW1lbnRhdGlvbiBUU1NMU29ja2V0RXhjZXB0aW9uCi0KLSsgKGlkKSBleGNlcHRpb25XaXRoUmVhc29uOiAoTlNTdHJpbmcgKikgcmVhc29uCi0gICAgICAgICAgICAgICAgICAgICBlcnJvcjogKE5TRXJyb3IgKikgZXJyb3IKLXsKLSAgICBOU0RpY3Rpb25hcnkgKiB1c2VySW5mbyA9IG5pbDsKLSAgICBpZiAoZXJyb3IgIT0gbmlsKSB7Ci0gICAgICAgIHVzZXJJbmZvID0gW05TRGljdGlvbmFyeSBkaWN0aW9uYXJ5V2l0aE9iamVjdDogZXJyb3IgZm9yS2V5OiBAImVycm9yIl07Ci0gICAgfQotICAgIAotICAgIHJldHVybiBbc3VwZXIgZXhjZXB0aW9uV2l0aE5hbWU6IEAiVFNTTFNvY2tldEV4Y2VwdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uOiByZWFzb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvOiB1c2VySW5mb107Ci19Ci0KLSsgKGlkKSBleGNlcHRpb25XaXRoUmVhc29uOiAoTlNTdHJpbmcgKikgcmVhc29uCi17Ci0gICAgcmV0dXJuIFtzZWxmIGV4Y2VwdGlvbldpdGhSZWFzb246IHJlYXNvbiBlcnJvcjogbmlsXTsKLX0KLQotQGVuZApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFNTTFNvY2tldFRyYW5zcG9ydC5oIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFNTTFNvY2tldFRyYW5zcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2MDZjNGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU1NMU29ja2V0VHJhbnNwb3J0LmgKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW1wb3J0IDxGb3VuZGF0aW9uL0ZvdW5kYXRpb24uaD4KKyNpbXBvcnQgIlROU1N0cmVhbVRyYW5zcG9ydC5oIgorCitOU19BU1NVTUVfTk9OTlVMTF9CRUdJTgorCisKK0BpbnRlcmZhY2UgVFNTTFNvY2tldFRyYW5zcG9ydCA6IFROU1N0cmVhbVRyYW5zcG9ydCA8TlNTdHJlYW1EZWxlZ2F0ZT4KKworLShpZCkgaW5pdFdpdGhIb3N0bmFtZTooTlNTdHJpbmcgKilob3N0bmFtZQorICAgICAgICAgICAgICAgICAgcG9ydDooaW50KXBvcnQKKyAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKiopZXJyb3I7CisKKy0oQk9PTCkgaXNPcGVuOworCitAZW5kCisKKworTlNfQVNTVU1FX05PTk5VTExfRU5ECmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU1NMU29ja2V0VHJhbnNwb3J0Lm0gYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU1NMU29ja2V0VHJhbnNwb3J0Lm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWIxMjE0ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RTU0xTb2NrZXRUcmFuc3BvcnQubQpAQCAtMCwwICsxLDMwNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2ltcG9ydCA8Rm91bmRhdGlvbi9Gb3VuZGF0aW9uLmg+CisjaW1wb3J0IDxDb3JlRm91bmRhdGlvbi9Db3JlRm91bmRhdGlvbi5oPgorI2ltcG9ydCAiVFNTTFNvY2tldFRyYW5zcG9ydC5oIgorI2ltcG9ydCAiVFNTTFNvY2tldFRyYW5zcG9ydEVycm9yLmgiCisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxuZXRkYi5oPgorCisjaWYgIVRBUkdFVF9PU19JUEhPTkUKKyNpbXBvcnQgPENvcmVTZXJ2aWNlcy9Db3JlU2VydmljZXMuaD4KKyNlbHNlCisjaW1wb3J0IDxDRk5ldHdvcmsvQ0ZOZXR3b3JrLmg+CisjZW5kaWYKKworQGludGVyZmFjZSBUU1NMU29ja2V0VHJhbnNwb3J0ICgpCisKK0Bwcm9wZXJ0eShzdHJvbmcsIG5vbmF0b21pYykgTlNTdHJpbmcgKnNzbEhvc3RuYW1lOworQHByb3BlcnR5KGFzc2lnbiwgbm9uYXRvbWljKSBpbnQgc2Q7CisKK0BlbmQKKworCitAaW1wbGVtZW50YXRpb24gVFNTTFNvY2tldFRyYW5zcG9ydAorCistKGlkKSBpbml0V2l0aEhvc3RuYW1lOihOU1N0cmluZyAqKWhvc3RuYW1lCisgICAgICAgICAgICAgICAgICBwb3J0OihpbnQpcG9ydAorICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqKillcnJvcgoreworICBfc3NsSG9zdG5hbWUgPSBob3N0bmFtZTsKKyAgQ0ZSZWFkU3RyZWFtUmVmIHJlYWRTdHJlYW0gPSBOVUxMOworICBDRldyaXRlU3RyZWFtUmVmIHdyaXRlU3RyZWFtID0gTlVMTDsKKworCisgIC8qIGNyZWF0ZSBhIHNvY2tldCBzdHJ1Y3R1cmUgKi8KKyAgc3RydWN0IHNvY2thZGRyX2luIHBpbjsKKyAgc3RydWN0IGhvc3RlbnQgKmhwID0gTlVMTDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisKKworCisgICAgaWYgKChocCA9IGdldGhvc3RieW5hbWUoW2hvc3RuYW1lIFVURjhTdHJpbmddKSkgPT0gTlVMTCkgeworICAgICAgTlNMb2coQCJmYWlsZWQgdG8gcmVzb2x2ZSBob3N0bmFtZSAlQCIsIGhvc3RuYW1lKTsKKyAgICAgIGhlcnJvcigicmVzb2x2Iik7CisgICAgICBpZiAoaSA9PSA5KSB7CisgICAgICAgIGlmIChlcnJvcikgeworICAgICAgICAgICplcnJvciA9IFtOU0Vycm9yIGVycm9yV2l0aERvbWFpbjpUU1NMU29ja2V0VHJhbnNwb3J0RXJyb3JEb21haW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6VFNTTFNvY2tldFRyYW5zcG9ydEVycm9ySG9zdGFuYW1lUmVzb2x1dGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySW5mbzpuaWxdOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuaWw7CisgICAgICB9CisgICAgICBbTlNUaHJlYWQgc2xlZXBGb3JUaW1lSW50ZXJ2YWw6MC4yXTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBtZW1zZXQoJnBpbiwgMCwgc2l6ZW9mKHBpbikpOworICBwaW4uc2luX2ZhbWlseSA9IEFGX0lORVQ7CisgIG1lbWNweSgmcGluLnNpbl9hZGRyLCBocC0+aF9hZGRyLCBzaXplb2Yoc3RydWN0IGluX2FkZHIpKTsKKyAgcGluLnNpbl9wb3J0ID0gaHRvbnMocG9ydCk7CisKKyAgLyogY3JlYXRlIHRoZSBzb2NrZXQgKi8KKyAgaWYgKChfc2QgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19TVFJFQU0sIElQUFJPVE9fVENQKSkgPT0gLTEpIHsKKyAgICBOU0xvZyhAImZhaWxlZCB0byBjcmVhdGUgc29ja2V0IGZvciBob3N0ICVAOiVkIiwgaG9zdG5hbWUsIHBvcnQpOworICAgIGlmIChlcnJvcikgeworICAgICAgKmVycm9yID0gW05TRXJyb3IgZXJyb3JXaXRoRG9tYWluOlRTU0xTb2NrZXRUcmFuc3BvcnRFcnJvckRvbWFpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOlRTU0xTb2NrZXRUcmFuc3BvcnRFcnJvclNvY2tldENyZWF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvOm5pbF07CisgICAgfQorICAgIHJldHVybiBuaWw7CisgIH0KKworICAvKiBvcGVuIGEgY29ubmVjdGlvbiAqLworICBpZiAoY29ubmVjdChfc2QsIChzdHJ1Y3Qgc29ja2FkZHIgKikmcGluLCBzaXplb2YocGluKSkgPT0gLTEpIHsKKyAgICBOU0xvZyhAImZhaWxlZCB0byBjcmVhdGUgY29uZW5jdCB0byBob3N0ICVAOiVkIiwgaG9zdG5hbWUsIHBvcnQpOworICAgIGlmIChlcnJvcikgeworICAgICAgKmVycm9yID0gW05TRXJyb3IgZXJyb3JXaXRoRG9tYWluOlRTU0xTb2NrZXRUcmFuc3BvcnRFcnJvckRvbWFpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOlRTU0xTb2NrZXRUcmFuc3BvcnRFcnJvckNvbm5lY3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySW5mbzpuaWxdOworICAgIH0KKyAgICByZXR1cm4gbmlsOworICB9CisgIENGU3RyZWFtQ3JlYXRlUGFpcldpdGhTb2NrZXQoa0NGQWxsb2NhdG9yRGVmYXVsdCwgX3NkLCAmcmVhZFN0cmVhbSwgJndyaXRlU3RyZWFtKTsKKworICBDRlJlYWRTdHJlYW1TZXRQcm9wZXJ0eShyZWFkU3RyZWFtLCBrQ0ZTdHJlYW1Qcm9wZXJ0eVNob3VsZENsb3NlTmF0aXZlU29ja2V0LCBrQ0ZCb29sZWFuVHJ1ZSk7CisgIENGV3JpdGVTdHJlYW1TZXRQcm9wZXJ0eSh3cml0ZVN0cmVhbSwga0NGU3RyZWFtUHJvcGVydHlTaG91bGRDbG9zZU5hdGl2ZVNvY2tldCwga0NGQm9vbGVhblRydWUpOworCisgIE5TSW5wdXRTdHJlYW0gKmlucHV0U3RyZWFtOworICBOU091dHB1dFN0cmVhbSAqb3V0cHV0U3RyZWFtOworCisgIGlmIChyZWFkU3RyZWFtICYmIHdyaXRlU3RyZWFtKSB7CisKKyAgICBDRlJlYWRTdHJlYW1TZXRQcm9wZXJ0eShyZWFkU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtDRlN0cmVhbVByb3BlcnR5U29ja2V0U2VjdXJpdHlMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQ0ZTdHJlYW1Tb2NrZXRTZWN1cml0eUxldmVsVExTdjEpOworCisgICAgTlNEaWN0aW9uYXJ5ICpzZXR0aW5ncyA9IEB7KF9fYnJpZGdlIE5TU3RyaW5nICopa0NGU3RyZWFtU1NMVmFsaWRhdGVzQ2VydGlmaWNhdGVDaGFpbjogQFlFU307CisKKyAgICBDRlJlYWRTdHJlYW1TZXRQcm9wZXJ0eSgoQ0ZSZWFkU3RyZWFtUmVmKXJlYWRTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAga0NGU3RyZWFtUHJvcGVydHlTU0xTZXR0aW5ncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ0ZUeXBlUmVmKXNldHRpbmdzKTsKKworICAgIENGV3JpdGVTdHJlYW1TZXRQcm9wZXJ0eSgoQ0ZXcml0ZVN0cmVhbVJlZil3cml0ZVN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0NGU3RyZWFtUHJvcGVydHlTU0xTZXR0aW5ncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENGVHlwZVJlZilzZXR0aW5ncyk7CisKKyAgICBpbnB1dFN0cmVhbSA9IChfX2JyaWRnZSBOU0lucHV0U3RyZWFtICopcmVhZFN0cmVhbTsKKyAgICBbaW5wdXRTdHJlYW0gc2V0RGVsZWdhdGU6c2VsZl07CisgICAgW2lucHV0U3RyZWFtIHNjaGVkdWxlSW5SdW5Mb29wOltOU1J1bkxvb3AgY3VycmVudFJ1bkxvb3BdIGZvck1vZGU6TlNEZWZhdWx0UnVuTG9vcE1vZGVdOworICAgIFtpbnB1dFN0cmVhbSBvcGVuXTsKKworICAgIG91dHB1dFN0cmVhbSA9IChfX2JyaWRnZSBOU091dHB1dFN0cmVhbSAqKXdyaXRlU3RyZWFtOworICAgIFtvdXRwdXRTdHJlYW0gc2V0RGVsZWdhdGU6c2VsZl07CisgICAgW291dHB1dFN0cmVhbSBzY2hlZHVsZUluUnVuTG9vcDpbTlNSdW5Mb29wIGN1cnJlbnRSdW5Mb29wXSBmb3JNb2RlOk5TRGVmYXVsdFJ1bkxvb3BNb2RlXTsKKyAgICBbb3V0cHV0U3RyZWFtIG9wZW5dOworCisgICAgQ0ZSZWxlYXNlKHJlYWRTdHJlYW0pOworICAgIENGUmVsZWFzZSh3cml0ZVN0cmVhbSk7CisgIH0KKworICBzZWxmID0gW3N1cGVyIGluaXRXaXRoSW5wdXRTdHJlYW06aW5wdXRTdHJlYW0gb3V0cHV0U3RyZWFtOm91dHB1dFN0cmVhbV07CisKKyAgcmV0dXJuIHNlbGY7Cit9CisKKy0odm9pZCkgZGVhbGxvYworeworICBbc2VsZiBjbG9zZV07Cit9CisKKyNwcmFnbWEgbWFyayAtCisjcHJhZ21hIG1hcmsgTlNTdHJlYW1EZWxlZ2F0ZQorCistKHZvaWQpIHN0cmVhbTooTlNTdHJlYW0gKilhU3RyZWFtCisgICBoYW5kbGVFdmVudDooTlNTdHJlYW1FdmVudClldmVudENvZGUKK3sKKyAgc3dpdGNoIChldmVudENvZGUpIHsKKyAgY2FzZSBOU1N0cmVhbUV2ZW50Tm9uZToKKyAgICBicmVhazsKKworICBjYXNlIE5TU3RyZWFtRXZlbnRIYXNCeXRlc0F2YWlsYWJsZToKKyAgICBicmVhazsKKworICBjYXNlIE5TU3RyZWFtRXZlbnRPcGVuQ29tcGxldGVkOgorICAgIGJyZWFrOworCisgIGNhc2UgTlNTdHJlYW1FdmVudEhhc1NwYWNlQXZhaWxhYmxlOiB7CisKKyAgICBCT09MIHByb2NlZWQgPSBOTzsKKyAgICBTZWNUcnVzdFJlc3VsdFR5cGUgdHJ1c3RSZXN1bHQgPSBrU2VjVHJ1c3RSZXN1bHRJbnZhbGlkOworICAgIENGTXV0YWJsZUFycmF5UmVmIG5ld1BvbGljaWVzID0gTlVMTDsKKworICAgIGRvIHsKKworICAgICAgU2VjVHJ1c3RSZWYgdHJ1c3QgPSAoX19icmlkZ2UgU2VjVHJ1c3RSZWYpW2FTdHJlYW0gcHJvcGVydHlGb3JLZXk6KE5TU3RyaW5nICopa0NGU3RyZWFtUHJvcGVydHlTU0xQZWVyVHJ1c3RdOworCisgICAgICAvLyBBZGQgbmV3IHBvbGljeSB0byBjdXJyZW50IGxpc3Qgb2YgcG9saWNpZXMKKyAgICAgIFNlY1BvbGljeVJlZiBwb2xpY3kgPSBTZWNQb2xpY3lDcmVhdGVTU0woTk8sIChfX2JyaWRnZSBDRlN0cmluZ1JlZikoX3NzbEhvc3RuYW1lKSk7CisgICAgICBpZiAoIXBvbGljeSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgQ0ZBcnJheVJlZiBwb2xpY2llczsKKyAgICAgIGlmIChTZWNUcnVzdENvcHlQb2xpY2llcyh0cnVzdCwgJnBvbGljaWVzKSAhPSBlcnJTZWNTdWNjZXNzKSB7CisgICAgICAgIENGUmVsZWFzZShwb2xpY3kpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgbmV3UG9saWNpZXMgPSBDRkFycmF5Q3JlYXRlTXV0YWJsZUNvcHkoTlVMTCwgMCwgcG9saWNpZXMpOworICAgICAgQ0ZBcnJheUFwcGVuZFZhbHVlKG5ld1BvbGljaWVzLCBwb2xpY3kpOworCisgICAgICBDRlJlbGVhc2UocG9saWNpZXMpOworICAgICAgQ0ZSZWxlYXNlKHBvbGljeSk7CisKKyAgICAgIC8vIFVwZGF0ZSB0cnVzdCBwb2xpY2llcworICAgICAgaWYgKFNlY1RydXN0U2V0UG9saWNpZXModHJ1c3QsIG5ld1BvbGljaWVzKSAhPSBlcnJTZWNTdWNjZXNzKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICAvLyBFdmFsdWF0ZSB0aGUgdHJ1c3QgY2hhaW4KKyAgICAgIGlmIChTZWNUcnVzdEV2YWx1YXRlKHRydXN0LCAmdHJ1c3RSZXN1bHQpICE9IGVyclNlY1N1Y2Nlc3MpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIHN3aXRjaCAodHJ1c3RSZXN1bHQpIHsKKyAgICAgIGNhc2Uga1NlY1RydXN0UmVzdWx0UHJvY2VlZDoKKyAgICAgICAgLy8gTlNMb2coQCJUcnVzdGVkIGJ5IFVTRVIiKTsKKyAgICAgICAgcHJvY2VlZCA9IFlFUzsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2Uga1NlY1RydXN0UmVzdWx0VW5zcGVjaWZpZWQ6CisgICAgICAgIC8vIE5TTG9nKEAiVHJ1c3RlZCBieSBPUyIpOworICAgICAgICBwcm9jZWVkID0gWUVTOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBrU2VjVHJ1c3RSZXN1bHRSZWNvdmVyYWJsZVRydXN0RmFpbHVyZToKKyAgICAgICAgcHJvY2VlZCA9IHJlY292ZXJGcm9tVHJ1c3RGYWlsdXJlKHRydXN0LCB0cnVzdFJlc3VsdCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIGtTZWNUcnVzdFJlc3VsdERlbnk6CisgICAgICAgIC8vIE5TTG9nKEAiRGVueSIpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBrU2VjVHJ1c3RSZXN1bHRGYXRhbFRydXN0RmFpbHVyZToKKyAgICAgICAgLy8gTlNMb2coQCJGYXRhbFRydXN0RmFpbHVyZSIpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBrU2VjVHJ1c3RSZXN1bHRPdGhlckVycm9yOgorICAgICAgICAvLyBOU0xvZyhAIk90aGVyRXJyb3IiKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2Uga1NlY1RydXN0UmVzdWx0SW52YWxpZDoKKyAgICAgICAgLy8gTlNMb2coQCJJbnZhbGlkIik7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICAvLyBOU0xvZyhAIkRlZmF1bHQiKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICB9CisgICAgd2hpbGUgKE5PKTsKKworICAgIGlmICghcHJvY2VlZCkgeworICAgICAgTlNMb2coQCJUU1NMU29ja2V0VHJhbnNwb3J0OiBDYW5ub3QgdHJ1c3QgY2VydGlmaWNhdGUuIFJlc3VsdDogJXUiLCB0cnVzdFJlc3VsdCk7CisgICAgICBbYVN0cmVhbSBjbG9zZV07CisgICAgfQorCisgICAgaWYgKG5ld1BvbGljaWVzKSB7CisgICAgICBDRlJlbGVhc2UobmV3UG9saWNpZXMpOworICAgIH0KKworICB9CisgIGJyZWFrOworCisgIGNhc2UgTlNTdHJlYW1FdmVudEVycm9yT2NjdXJyZWQ6IHsKKyAgICBOU0xvZyhAIlRTU0xTb2NrZXRUcmFuc3BvcnQ6IEVycm9yIG9jY3VycmVkIG9wZW5pbmcgc3RyZWFtOiAlQCIsIFthU3RyZWFtIHN0cmVhbUVycm9yXSk7CisgICAgYnJlYWs7CisgIH0KKworICBjYXNlIE5TU3RyZWFtRXZlbnRFbmRFbmNvdW50ZXJlZDoKKyAgICBicmVhazsKKyAgfQorfQorCitCT09MIHJlY292ZXJGcm9tVHJ1c3RGYWlsdXJlKFNlY1RydXN0UmVmIG15VHJ1c3QsIFNlY1RydXN0UmVzdWx0VHlwZSBsYXN0VHJ1c3RSZXN1bHQpCit7CisgIENGQWJzb2x1dGVUaW1lIHRydXN0VGltZSA9IFNlY1RydXN0R2V0VmVyaWZ5VGltZShteVRydXN0KTsKKyAgQ0ZBYnNvbHV0ZVRpbWUgY3VycmVudFRpbWUgPSBDRkFic29sdXRlVGltZUdldEN1cnJlbnQoKTsKKworICBDRkFic29sdXRlVGltZSB0aW1lSW5jcmVtZW50ID0gMzE1MzYwMDA7CisgIENGQWJzb2x1dGVUaW1lIG5ld1RpbWUgPSBjdXJyZW50VGltZSAtIHRpbWVJbmNyZW1lbnQ7CisKKyAgaWYgKHRydXN0VGltZSAtIG5ld1RpbWUpIHsKKworICAgIENGRGF0ZVJlZiBuZXdEYXRlID0gQ0ZEYXRlQ3JlYXRlKE5VTEwsIG5ld1RpbWUpOworICAgIFNlY1RydXN0U2V0VmVyaWZ5RGF0ZShteVRydXN0LCBuZXdEYXRlKTsKKyAgICBDRlJlbGVhc2UobmV3RGF0ZSk7CisKKyAgICBpZiAoU2VjVHJ1c3RFdmFsdWF0ZShteVRydXN0LCAmbGFzdFRydXN0UmVzdWx0KSAhPSBlcnJTZWNTdWNjZXNzKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorCisgIH0KKworICBpZiAobGFzdFRydXN0UmVzdWx0ID09IGtTZWNUcnVzdFJlc3VsdFByb2NlZWQgfHwgbGFzdFRydXN0UmVzdWx0ID09IGtTZWNUcnVzdFJlc3VsdFVuc3BlY2lmaWVkKSB7CisgICAgcmV0dXJuIFlFUzsKKyAgfQorCisgIE5TTG9nKEAiVFNTTFNvY2tldFRyYW5zcG9ydDogVW5hYmxlIHRvIHJlY292ZXIgY2VydGlmaWNhdGUgdHJ1c3QgZmFpbHVyZSIpOworICByZXR1cm4gWUVTOworfQorCistKEJPT0wpIGlzT3BlbgoreworICBpZiAoX3NkID4gMCkgeworICAgIHJldHVybiBUUlVFOworICB9CisgIGVsc2UgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitAZW5kCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU1NMU29ja2V0VHJhbnNwb3J0RXJyb3IuaCBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RTU0xTb2NrZXRUcmFuc3BvcnRFcnJvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxN2YzOWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU1NMU29ja2V0VHJhbnNwb3J0RXJyb3IuaApAQCAtMCwwICsxLDMwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbXBvcnQgIlRUcmFuc3BvcnRFcnJvci5oIgorCisKK2V4dGVybiBOU1N0cmluZyAqVFNTTFNvY2tldFRyYW5zcG9ydEVycm9yRG9tYWluOworCisKK3R5cGVkZWYgTlNfRU5VTSAoaW50LCBUU1NMU29ja2V0VHJhbnNwb3J0RXJyb3IpIHsKKyAgVFNTTFNvY2tldFRyYW5zcG9ydEVycm9ySG9zdGFuYW1lUmVzb2x1dGlvbiAgPSAtMTAwMDAsCisgIFRTU0xTb2NrZXRUcmFuc3BvcnRFcnJvclNvY2tldENyZWF0ZSAgICAgICAgID0gLTEwMDAxLAorICBUU1NMU29ja2V0VHJhbnNwb3J0RXJyb3JDb25uZWN0ICAgICAgICAgICAgICA9IC0xMDAwMiwKK307CmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU1NMU29ja2V0VHJhbnNwb3J0RXJyb3IubSBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RTU0xTb2NrZXRUcmFuc3BvcnRFcnJvci5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjZjk0MWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU1NMU29ja2V0VHJhbnNwb3J0RXJyb3IubQpAQCAtMCwwICsxLDIzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbXBvcnQgIlRTU0xTb2NrZXRUcmFuc3BvcnRFcnJvci5oIgorCisKK05TU3RyaW5nICpUU1NMU29ja2V0VHJhbnNwb3J0RXJyb3JEb21haW4gPSBAIlRTU0xTb2NrZXRUcmFuc3BvcnRFcnJvckRvbWFpbiI7CmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU29ja2V0Q2xpZW50LmggYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU29ja2V0Q2xpZW50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3Mjg1MGYuLjAwMDAwMDAKLS0tIGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFNvY2tldENsaWVudC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW1wb3J0IDxGb3VuZGF0aW9uL0ZvdW5kYXRpb24uaD4KLSNpbXBvcnQgIlROU1N0cmVhbVRyYW5zcG9ydC5oIgotCi1AaW50ZXJmYWNlIFRTb2NrZXRDbGllbnQgOiBUTlNTdHJlYW1UcmFuc3BvcnQgCi0jaWYgVEFSR0VUX09TX0lQSE9ORSB8fCAoTUFDX09TX1hfVkVSU0lPTl9NQVhfQUxMT1dFRCA+PSBNQUNfT1NfWF9WRVJTSU9OXzEwXzYpCi08TlNTdHJlYW1EZWxlZ2F0ZT4KLSNlbmRpZgotewotfQotCi0tIChpZCkgaW5pdFdpdGhIb3N0bmFtZTogKE5TU3RyaW5nICopIGhvc3RuYW1lCi0gICAgICAgICAgICAgICAgICAgcG9ydDogKGludCkgcG9ydDsKLQotQGVuZAotCi0KLQpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFNvY2tldENsaWVudC5tIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFNvY2tldENsaWVudC5tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTdlZWE4Li4wMDAwMDAwCi0tLSBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RTb2NrZXRDbGllbnQubQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSNpbXBvcnQgIlRTb2NrZXRDbGllbnQuaCIKLSNpbXBvcnQgIlRPYmplY3RpdmUtQy5oIgotCi0jaWYgIVRBUkdFVF9PU19JUEhPTkUKLSNpbXBvcnQgPENvcmVTZXJ2aWNlcy9Db3JlU2VydmljZXMuaD4KLSNlbHNlCi0jaW1wb3J0IDxDRk5ldHdvcmsvQ0ZOZXR3b3JrLmg+Ci0jZW5kaWYKLQotQGludGVyZmFjZSBUU29ja2V0Q2xpZW50ICgpCi17Ci0gICAgTlNJbnB1dFN0cmVhbSAqIGlucHV0U3RyZWFtOwotCU5TT3V0cHV0U3RyZWFtICogb3V0cHV0U3RyZWFtOwotfQotQGVuZAotCi1AaW1wbGVtZW50YXRpb24gVFNvY2tldENsaWVudAotCi0tIChpZCkgaW5pdFdpdGhIb3N0bmFtZTogKE5TU3RyaW5nICopIGhvc3RuYW1lCi0gICAgICAgICAgICAgICAgICAgcG9ydDogKGludCkgcG9ydAotewotCWlucHV0U3RyZWFtID0gTlVMTDsKLQlvdXRwdXRTdHJlYW0gPSBOVUxMOwotCUNGUmVhZFN0cmVhbVJlZiByZWFkU3RyZWFtID0gTlVMTDsKLQlDRldyaXRlU3RyZWFtUmVmIHdyaXRlU3RyZWFtID0gTlVMTDsKLQlDRlN0cmVhbUNyZWF0ZVBhaXJXaXRoU29ja2V0VG9Ib3N0KGtDRkFsbG9jYXRvckRlZmF1bHQsIChicmlkZ2Vfc3R1YiBDRlN0cmluZ1JlZilob3N0bmFtZSwgcG9ydCwgJnJlYWRTdHJlYW0sICZ3cml0ZVN0cmVhbSk7Ci0JaWYgKHJlYWRTdHJlYW0gJiYgd3JpdGVTdHJlYW0pIHsKLQkJQ0ZSZWFkU3RyZWFtU2V0UHJvcGVydHkocmVhZFN0cmVhbSwga0NGU3RyZWFtUHJvcGVydHlTaG91bGRDbG9zZU5hdGl2ZVNvY2tldCwga0NGQm9vbGVhblRydWUpOwotCQlDRldyaXRlU3RyZWFtU2V0UHJvcGVydHkod3JpdGVTdHJlYW0sIGtDRlN0cmVhbVByb3BlcnR5U2hvdWxkQ2xvc2VOYXRpdmVTb2NrZXQsIGtDRkJvb2xlYW5UcnVlKTsKLQkJCi0JCWlucHV0U3RyZWFtID0gKGJyaWRnZV9zdHViIE5TSW5wdXRTdHJlYW0gKilyZWFkU3RyZWFtOwotCQlbaW5wdXRTdHJlYW0gcmV0YWluX3N0dWJdOwotCQlbaW5wdXRTdHJlYW0gc2V0RGVsZWdhdGU6c2VsZl07Ci0JCVtpbnB1dFN0cmVhbSBzY2hlZHVsZUluUnVuTG9vcDpbTlNSdW5Mb29wIGN1cnJlbnRSdW5Mb29wXSBmb3JNb2RlOk5TRGVmYXVsdFJ1bkxvb3BNb2RlXTsKLQkJW2lucHV0U3RyZWFtIG9wZW5dOwotCQkKLQkJb3V0cHV0U3RyZWFtID0gKGJyaWRnZV9zdHViIE5TT3V0cHV0U3RyZWFtICopd3JpdGVTdHJlYW07Ci0JCVtvdXRwdXRTdHJlYW0gcmV0YWluX3N0dWJdOwotCQlbb3V0cHV0U3RyZWFtIHNldERlbGVnYXRlOnNlbGZdOwotCQlbb3V0cHV0U3RyZWFtIHNjaGVkdWxlSW5SdW5Mb29wOltOU1J1bkxvb3AgY3VycmVudFJ1bkxvb3BdIGZvck1vZGU6TlNEZWZhdWx0UnVuTG9vcE1vZGVdOwotCQlbb3V0cHV0U3RyZWFtIG9wZW5dOwotICAgICAgICBDRlJlbGVhc2UocmVhZFN0cmVhbSk7Ci0gICAgICAgIENGUmVsZWFzZSh3cml0ZVN0cmVhbSk7Ci0JfQotCQotCXNlbGYgPSBbc3VwZXIgaW5pdFdpdGhJbnB1dFN0cmVhbTogaW5wdXRTdHJlYW0gb3V0cHV0U3RyZWFtOiBvdXRwdXRTdHJlYW1dOwotCQotCXJldHVybiBzZWxmOwotfQotCi0tKHZvaWQpZGVhbGxvYwotewotICAgIFtpbnB1dFN0cmVhbSBjbG9zZV07Ci0gICAgW2lucHV0U3RyZWFtIHJlbW92ZUZyb21SdW5Mb29wOltOU1J1bkxvb3AgY3VycmVudFJ1bkxvb3BdIGZvck1vZGU6TlNEZWZhdWx0UnVuTG9vcE1vZGVdOwotICAgIFtpbnB1dFN0cmVhbSBzZXREZWxlZ2F0ZTpuaWxdOwotICAgIFtpbnB1dFN0cmVhbSByZWxlYXNlX3N0dWJdOwotICAgIAotICAgIFtvdXRwdXRTdHJlYW0gY2xvc2VdOwotICAgIFtvdXRwdXRTdHJlYW0gcmVtb3ZlRnJvbVJ1bkxvb3A6W05TUnVuTG9vcCBjdXJyZW50UnVuTG9vcF0gZm9yTW9kZTpOU0RlZmF1bHRSdW5Mb29wTW9kZV07Ci0gICAgW291dHB1dFN0cmVhbSBzZXREZWxlZ2F0ZTpuaWxdOwotICAgIFtvdXRwdXRTdHJlYW0gcmVsZWFzZV9zdHViXTsKLSAgICBbc3VwZXIgZGVhbGxvY19zdHViXTsKLX0KLQotCi1AZW5kCi0KLQotCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU29ja2V0VHJhbnNwb3J0LmggYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU29ja2V0VHJhbnNwb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdiOTFhMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RTb2NrZXRUcmFuc3BvcnQuaApAQCAtMCwwICsxLDM2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbXBvcnQgPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPgorI2ltcG9ydCAiVE5TU3RyZWFtVHJhbnNwb3J0LmgiCisKK05TX0FTU1VNRV9OT05OVUxMX0JFR0lOCisKKworQGludGVyZmFjZSBUU29ja2V0VHJhbnNwb3J0IDogVE5TU3RyZWFtVHJhbnNwb3J0CisKKy0oaWQpIGluaXRXaXRoSG9zdG5hbWU6KE5TU3RyaW5nICopaG9zdG5hbWUKKyAgICAgICAgICAgICAgICAgIHBvcnQ6KGludClwb3J0OworCistKGlkKSBpbml0V2l0aFBhdGg6KE5TU3RyaW5nICopcGF0aDsKKworQGVuZAorCisKK05TX0FTU1VNRV9OT05OVUxMX0VORApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFNvY2tldFRyYW5zcG9ydC5tIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFNvY2tldFRyYW5zcG9ydC5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljNThhYmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU29ja2V0VHJhbnNwb3J0Lm0KQEAgLTAsMCArMSwxMzEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpbXBvcnQgIlRTb2NrZXRUcmFuc3BvcnQuaCIKKworI2lmICFUQVJHRVRfT1NfSVBIT05FCisjaW1wb3J0IDxDb3JlU2VydmljZXMvQ29yZVNlcnZpY2VzLmg+CisjZWxzZQorI2ltcG9ydCA8Q0ZOZXR3b3JrL0NGTmV0d29yay5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPHN5cy91bi5oPgorCitAaW50ZXJmYWNlIFRTb2NrZXRUcmFuc3BvcnQgKCkgPE5TU3RyZWFtRGVsZWdhdGU+CitAZW5kCisKKworQGltcGxlbWVudGF0aW9uIFRTb2NrZXRUcmFuc3BvcnQKKworLSAoaWQpIGluaXRXaXRoUmVhZFN0cmVhbTogKENGUmVhZFN0cmVhbVJlZikgcmVhZFN0cmVhbSB3cml0ZVN0cmVhbTogKENGV3JpdGVTdHJlYW1SZWYpIHdyaXRlU3RyZWFtCit7CisgIE5TSW5wdXRTdHJlYW0gKmlucHV0U3RyZWFtID0gbmlsOworICBOU091dHB1dFN0cmVhbSAqb3V0cHV0U3RyZWFtID0gbmlsOworCisgIGlmIChyZWFkU3RyZWFtICYmIHdyaXRlU3RyZWFtKSB7CisKKyAgICBDRlJlYWRTdHJlYW1TZXRQcm9wZXJ0eShyZWFkU3RyZWFtLCBrQ0ZTdHJlYW1Qcm9wZXJ0eVNob3VsZENsb3NlTmF0aXZlU29ja2V0LCBrQ0ZCb29sZWFuVHJ1ZSk7CisgICAgQ0ZXcml0ZVN0cmVhbVNldFByb3BlcnR5KHdyaXRlU3RyZWFtLCBrQ0ZTdHJlYW1Qcm9wZXJ0eVNob3VsZENsb3NlTmF0aXZlU29ja2V0LCBrQ0ZCb29sZWFuVHJ1ZSk7CisKKyAgICBpbnB1dFN0cmVhbSA9IChfX2JyaWRnZSBOU0lucHV0U3RyZWFtICopcmVhZFN0cmVhbTsKKyAgICBbaW5wdXRTdHJlYW0gc2V0RGVsZWdhdGU6c2VsZl07CisgICAgW2lucHV0U3RyZWFtIHNjaGVkdWxlSW5SdW5Mb29wOk5TUnVuTG9vcC5jdXJyZW50UnVuTG9vcCBmb3JNb2RlOk5TRGVmYXVsdFJ1bkxvb3BNb2RlXTsKKyAgICBbaW5wdXRTdHJlYW0gb3Blbl07CisKKyAgICBvdXRwdXRTdHJlYW0gPSAoX19icmlkZ2UgTlNPdXRwdXRTdHJlYW0gKil3cml0ZVN0cmVhbTsKKyAgICBbb3V0cHV0U3RyZWFtIHNldERlbGVnYXRlOnNlbGZdOworICAgIFtvdXRwdXRTdHJlYW0gc2NoZWR1bGVJblJ1bkxvb3A6TlNSdW5Mb29wLmN1cnJlbnRSdW5Mb29wIGZvck1vZGU6TlNEZWZhdWx0UnVuTG9vcE1vZGVdOworICAgIFtvdXRwdXRTdHJlYW0gb3Blbl07CisgIH0KKyAgZWxzZSB7CisKKyAgICBpZiAocmVhZFN0cmVhbSkgeworICAgICAgQ0ZSZWxlYXNlKHJlYWRTdHJlYW0pOworICAgIH0KKworICAgIGlmICh3cml0ZVN0cmVhbSkgeworICAgICAgQ0ZSZWxlYXNlKHdyaXRlU3RyZWFtKTsKKyAgICB9CisKKyAgICByZXR1cm4gbmlsOworICB9CisKKyAgcmV0dXJuIFtzdXBlciBpbml0V2l0aElucHV0U3RyZWFtOmlucHV0U3RyZWFtIG91dHB1dFN0cmVhbTpvdXRwdXRTdHJlYW1dOworfQorCistIChpZCkgaW5pdFdpdGhIb3N0bmFtZTogKE5TU3RyaW5nICopIGhvc3RuYW1lCisgICAgICAgICAgICAgICAgICAgcG9ydDogKGludCkgcG9ydAoreworICBDRlJlYWRTdHJlYW1SZWYgcmVhZFN0cmVhbSA9IE5VTEw7CisgIENGV3JpdGVTdHJlYW1SZWYgd3JpdGVTdHJlYW0gPSBOVUxMOworICBDRlN0cmVhbUNyZWF0ZVBhaXJXaXRoU29ja2V0VG9Ib3N0KGtDRkFsbG9jYXRvckRlZmF1bHQsIChfX2JyaWRnZSBDRlN0cmluZ1JlZilob3N0bmFtZSwgcG9ydCwgJnJlYWRTdHJlYW0sICZ3cml0ZVN0cmVhbSk7CisgIHJldHVybiBbc2VsZiBpbml0V2l0aFJlYWRTdHJlYW06cmVhZFN0cmVhbSB3cml0ZVN0cmVhbTp3cml0ZVN0cmVhbV07Cit9CisKKy0gKGlkKSBpbml0V2l0aFBhdGg6IChOU1N0cmluZyAqKSBwYXRoCit7CisgIENGU29ja2V0TmF0aXZlSGFuZGxlIHNvY2tmZCA9IHNvY2tldChBRl9MT0NBTCwgU09DS19TVFJFQU0sIElQUFJPVE9fSVApOworICBpbnQgeWVzID0gMTsKKyAgaWYgKHNldHNvY2tvcHQoc29ja2ZkLCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsICZ5ZXMsIHNpemVvZih5ZXMpKSA8IDApCisgIHsKKyAgICBOU0xvZyhAIlRTb2NrZXRUcmFuc3BvcnQ6IFVuYWJsZSB0byBzZXQgUkVVU0VBRERSIHByb3BlcnR5IG9mIHNvY2tldC4iKTsKKyAgICByZXR1cm4gbmlsOworICB9CisKKyAgTlNEYXRhICpzZXJ2ZXJBZGRyZXNzID0gW1tzZWxmIGNsYXNzXSBjcmVhdGVBZGRyZXNzV2l0aFBhdGg6cGF0aF07CisKKyAgQ0ZSZWFkU3RyZWFtUmVmIHJlYWRTdHJlYW0gPSBOVUxMOworICBDRldyaXRlU3RyZWFtUmVmIHdyaXRlU3RyZWFtID0gTlVMTDsKKyAgQ0ZTdHJlYW1DcmVhdGVQYWlyV2l0aFNvY2tldChrQ0ZBbGxvY2F0b3JEZWZhdWx0LCBzb2NrZmQsICZyZWFkU3RyZWFtLCAmd3JpdGVTdHJlYW0pOworICBpZiAoIXJlYWRTdHJlYW0gfHwgIXdyaXRlU3RyZWFtKQorICB7CisgICAgTlNMb2coQCJUU29ja2V0VHJhbnNwb3J0OiBVbmFibGUgdG8gY3JlYXRlIHJlYWQvd3JpdGUgc3RyZWFtIHBhaXIgZm9yIHNvY2tldC4iKTsKKyAgICByZXR1cm4gbmlsOworICB9CisKKyAgaWYgKGNvbm5lY3Qoc29ja2ZkLCAoc3RydWN0IHNvY2thZGRyICopc2VydmVyQWRkcmVzcy5ieXRlcywgKHNvY2tsZW5fdCkgc2VydmVyQWRkcmVzcy5sZW5ndGgpIDwgMCkKKyAgeworICAgIE5TTG9nKEAiVFNvY2tldFRyYW5zcG9ydDogQ29ubmVjdCBlcnJvcjogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgcmV0dXJuIG5pbDsKKyAgfQorCisgIHJldHVybiBbc2VsZiBpbml0V2l0aFJlYWRTdHJlYW06cmVhZFN0cmVhbSB3cml0ZVN0cmVhbTp3cml0ZVN0cmVhbV07Cit9CisKKysgKE5TRGF0YSAqKSBjcmVhdGVBZGRyZXNzV2l0aFBhdGg6IChOU1N0cmluZyAqKXBhdGgKK3sKKyAgc3RydWN0IHNvY2thZGRyX3VuIHNlcnZhZGRyOworCisgIHNpemVfdCBudWxsVGVybWluYXRlZFBhdGhMZW5ndGggPSBwYXRoLmxlbmd0aCArIDE7CisgIGlmIChudWxsVGVybWluYXRlZFBhdGhMZW5ndGg+IHNpemVvZihzZXJ2YWRkci5zdW5fcGF0aCkpIHsKKyAgICBOU0xvZyhAIlRTb2NrZXRUcmFuc3BvcnQ6IFVuYWJsZSB0byBjcmVhdGUgc29ja2V0IGF0IHBhdGggJUAuIFBhdGggaXMgdG9vIGxvbmcuIiwgcGF0aCk7CisgICAgcmV0dXJuIG5pbDsKKyAgfQorCisgIGJ6ZXJvKCZzZXJ2YWRkcixzaXplb2Yoc2VydmFkZHIpKTsKKyAgc2VydmFkZHIuc3VuX2ZhbWlseSA9IEFGX0xPQ0FMOworICBtZW1jcHkoc2VydmFkZHIuc3VuX3BhdGgsIHBhdGguVVRGOFN0cmluZywgbnVsbFRlcm1pbmF0ZWRQYXRoTGVuZ3RoKTsKKyAgc2VydmFkZHIuc3VuX2xlbiA9IFNVTl9MRU4oJnNlcnZhZGRyKTsKKworICByZXR1cm4gW05TRGF0YSBkYXRhV2l0aEJ5dGVzOiZzZXJ2YWRkciBsZW5ndGg6c2l6ZW9mKHNlcnZhZGRyKV07Cit9CisKKworQGVuZApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydC5oIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydC5oCmluZGV4IDYxZWJiZDIuLjU1OGNmNjAgMTAwNjQ0Ci0tLSBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaAorKysgYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0LmgKQEAgLTE3LDIwICsxNywzMiBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2ltcG9ydCA8Rm91bmRhdGlvbi9Gb3VuZGF0aW9uLmg+CisKKworTlNfQVNTVU1FX05PTk5VTExfQkVHSU4KKworCiBAcHJvdG9jb2wgVFRyYW5zcG9ydCA8TlNPYmplY3Q+CiAKLSAgLyoqCi0gICAqIEd1YXJhbnRlZXMgdGhhdCBhbGwgb2YgbGVuIGJ5dGVzIGFyZSByZWFkCi0gICAqCi0gICAqIEBwYXJhbSBidWYgQnVmZmVyIHRvIHJlYWQgaW50bwotICAgKiBAcGFyYW0gb2ZmIEluZGV4IGluIGJ1ZmZlciB0byBzdGFydCBzdG9yaW5nIGJ5dGVzIGF0Ci0gICAqIEBwYXJhbSBsZW4gTWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZAotICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgcmVhZCwgd2hpY2ggbXVzdCBiZSBlcXVhbCB0byBsZW4KLSAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIHRoZXJlIHdhcyBhbiBlcnJvciByZWFkaW5nIGRhdGEKLSAgICovCi0tIChpbnQpIHJlYWRBbGw6ICh1aW50OF90ICopIGJ1ZiBvZmZzZXQ6IChpbnQpIG9mZiBsZW5ndGg6IChpbnQpIGxlbjsKKy8qKgorICogR3VhcmFudGVlcyB0aGF0IGFsbCBvZiBsZW4gYnl0ZXMgYXJlIHJlYWQKKyAqCisgKiBAcGFyYW0gYnVmIEJ1ZmZlciB0byByZWFkIGludG8KKyAqIEBwYXJhbSBvZmYgSW5kZXggaW4gYnVmZmVyIHRvIHN0YXJ0IHN0b3JpbmcgYnl0ZXMgYXQKKyAqIEBwYXJhbSBsZW4gTWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZAorICogQHJldHVybiBZRVMgaWYgc3VjY2VlZGVkLCBOTyBpZiBmYWlsZWQKKyAqIEB0aHJvd3MgVFRyYW5zcG9ydEVycm9yIGlmIHRoZXJlIHdhcyBhbiBlcnJvciByZWFkaW5nIGRhdGEKKyAqLworLShCT09MKSByZWFkQWxsOihVSW50OCAqKWJ1ZiBvZmZzZXQ6KFVJbnQzMilvZmYgbGVuZ3RoOihVSW50MzIpbGVuIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcjsKIAotLSAodm9pZCkgd3JpdGU6IChjb25zdCB1aW50OF90ICopIGRhdGEgb2Zmc2V0OiAodW5zaWduZWQgaW50KSBvZmZzZXQgbGVuZ3RoOiAodW5zaWduZWQgaW50KSBsZW5ndGg7CistKFVJbnQzMikgcmVhZEF2YWlsOihVSW50OCAqKWJ1ZiBvZmZzZXQ6KFVJbnQzMilvZmYgbWF4TGVuZ3RoOihVSW50MzIpbWF4TGVuIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcjsKIAotLSAodm9pZCkgZmx1c2g7CistKEJPT0wpIHdyaXRlOihjb25zdCBVSW50OCAqKWRhdGEgb2Zmc2V0OihVSW50MzIpb2Zmc2V0IGxlbmd0aDooVUludDMyKWxlbmd0aCBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CisKKy0oQk9PTCkgZmx1c2g6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOworCiBAZW5kCisKKworTlNfQVNTVU1FX05PTk5VTExfRU5ECmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0RXJyb3IuaCBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RUcmFuc3BvcnRFcnJvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4YzlmMDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0RXJyb3IuaApAQCAtMCwwICsxLDQzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbXBvcnQgIlRFcnJvci5oIgorCisKK2V4dGVybiBOU1N0cmluZyAqVFRyYW5zcG9ydEVycm9yRG9tYWluOworCisKK3R5cGVkZWYgTlNfRU5VTSAoaW50LCBUVHJhbnNwb3J0RXJyb3IpIHsKKyAgVFRyYW5zcG9ydEVycm9yVW5rbm93biAgICAgICAgPSAwLAorICBUVHJhbnNwb3J0RXJyb3JOb3RPcGVuICAgICAgICA9IDEsCisgIFRUcmFuc3BvcnRFcnJvckFscmVhZHlPcGVuICAgID0gMiwKKyAgVFRyYW5zcG9ydEVycm9yVGltZWRPdXQgICAgICAgPSAzLAorICBUVHJhbnNwb3J0RXJyb3JFbmRPZkZpbGUgICAgICA9IDQsCit9OworCisKK2V4dGVybiBOU1N0cmluZyAqVFRyYW5zcG9ydEVycm9yRXh0ZW5kZWRFcnJvcktleTsKK2V4dGVybiBOU1N0cmluZyAqVFRyYW5zcG9ydEVycm9ySHR0cEVycm9yS2V5OworCisKK3R5cGVkZWYgTlNfRU5VTShpbnQsIFRIdHRwVHJhbnNwb3J0RXJyb3IpIHsKKyAgVEh0dHBUcmFuc3BvcnRFcnJvckludmFsaWRSZXNwb25zZSAgPSAxMDAxLAorICBUSHR0cFRyYW5zcG9ydEVycm9ySW52YWxpZFN0YXR1cyAgICA9IDEwMDIsCisgIFRIdHRwVHJhbnNwb3J0RXJyb3JBdXRoZW50aWNhdGlvbiAgID0gMTAwMywKK307CmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0RXJyb3IubSBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RUcmFuc3BvcnRFcnJvci5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxYWYwNzYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0RXJyb3IubQpAQCAtMCwwICsxLDI3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbXBvcnQgIlRUcmFuc3BvcnRFcnJvci5oIgorCisKK05TU3RyaW5nICpUVHJhbnNwb3J0RXJyb3JEb21haW4gPSBAIlRUcmFuc3BvcnRFcnJvckRvbWFpbiI7CisKKworTlNTdHJpbmcgKlRUcmFuc3BvcnRFcnJvckV4dGVuZGVkRXJyb3JLZXkgPSBAImV4dGVuZGVkRXJyb3IiOworTlNTdHJpbmcgKlRUcmFuc3BvcnRFcnJvckh0dHBFcnJvcktleSA9IEAiaHR0cEVycm9yIjsKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uaCBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc0OWZlMi4uMDAwMDAwMAotLS0gYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbXBvcnQgIlRFeGNlcHRpb24uaCIKLQotQGludGVyZmFjZSBUVHJhbnNwb3J0RXhjZXB0aW9uIDogVEV4Y2VwdGlvbiB7Ci19Ci0KLSsgKGlkKSBleGNlcHRpb25XaXRoUmVhc29uOiAoTlNTdHJpbmcgKikgcmVhc29uCi0gICAgICAgICAgICAgICAgICAgICBlcnJvcjogKE5TRXJyb3IgKikgZXJyb3I7Ci0KLSsgKGlkKSBleGNlcHRpb25XaXRoUmVhc29uOiAoTlNTdHJpbmcgKikgcmVhc29uOwotCi1AZW5kCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLm0gYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzY2RmYmQuLjAwMDAwMDAKLS0tIGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5tCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW1wb3J0ICJUVHJhbnNwb3J0RXhjZXB0aW9uLmgiCi0jaW1wb3J0ICJUT2JqZWN0aXZlLUMuaCIKLQotQGltcGxlbWVudGF0aW9uIFRUcmFuc3BvcnRFeGNlcHRpb24KLQotKyAoaWQpIGV4Y2VwdGlvbldpdGhSZWFzb246IChOU1N0cmluZyAqKSByZWFzb24KLSAgICAgICAgICAgICAgICAgICAgIGVycm9yOiAoTlNFcnJvciAqKSBlcnJvcgotewotICBOU0RpY3Rpb25hcnkgKiB1c2VySW5mbyA9IG5pbDsKLSAgaWYgKGVycm9yICE9IG5pbCkgewotICAgIHVzZXJJbmZvID0gW05TRGljdGlvbmFyeSBkaWN0aW9uYXJ5V2l0aE9iamVjdDogZXJyb3IgZm9yS2V5OiBAImVycm9yIl07Ci0gIH0KLQotICByZXR1cm4gW3N1cGVyIGV4Y2VwdGlvbldpdGhOYW1lOiBAIlRUcmFuc3BvcnRFeGNlcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb246IHJlYXNvbgotICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvOiB1c2VySW5mb107Ci19Ci0KLQotKyAoaWQpIGV4Y2VwdGlvbldpdGhSZWFzb246IChOU1N0cmluZyAqKSByZWFzb24KLXsKLSAgcmV0dXJuIFtzZWxmIGV4Y2VwdGlvbldpdGhSZWFzb246IHJlYXNvbiBlcnJvcjogbmlsXTsKLX0KLQotQGVuZApkaWZmIC0tZ2l0IGEvbGliL2NwcC9DTWFrZUxpc3RzLnR4dCBiL2xpYi9jcHAvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOWVhODJjMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwyMTIgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitpbmNsdWRlX2RpcmVjdG9yaWVzKFNZU1RFTSAiJHtCb29zdF9JTkNMVURFX0RJUlN9IikKK2luY2x1ZGVfZGlyZWN0b3JpZXMoc3JjKQorCisjIFNZU0xJQlMgY29udGFpbnMgbGlicmFyaWVzIHRoYXQgbmVlZCB0byBiZSBsaW5rZWQgdG8gYWxsIGxpYiB0YXJnZXRzCitzZXQoU1lTTElCUyAiIikKKworIyBDcmVhdGUgdGhlIHRocmlmdCBDKysgbGlicmFyeQorc2V0KCB0aHJpZnRjcHBfU09VUkNFUworICAgc3JjL3RocmlmdC9UQXBwbGljYXRpb25FeGNlcHRpb24uY3BwCisgICBzcmMvdGhyaWZ0L1RPdXRwdXQuY3BwCisgICBzcmMvdGhyaWZ0L2FzeW5jL1RBc3luY0NoYW5uZWwuY3BwCisgICBzcmMvdGhyaWZ0L2FzeW5jL1RBc3luY1Byb3RvY29sUHJvY2Vzc29yLmNwcAorICAgc3JjL3RocmlmdC9hc3luYy9UQ29uY3VycmVudENsaWVudFN5bmNJbmZvLmgKKyAgIHNyYy90aHJpZnQvYXN5bmMvVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mby5jcHAKKyAgIHNyYy90aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5jcHAKKyAgIHNyYy90aHJpZnQvY29uY3VycmVuY3kvVGltZXJNYW5hZ2VyLmNwcAorICAgc3JjL3RocmlmdC9jb25jdXJyZW5jeS9VdGlsLmNwcAorICAgc3JjL3RocmlmdC9wcm9jZXNzb3IvUGVla1Byb2Nlc3Nvci5jcHAKKyAgIHNyYy90aHJpZnQvcHJvdG9jb2wvVEJhc2U2NFV0aWxzLmNwcAorICAgc3JjL3RocmlmdC9wcm90b2NvbC9URGVidWdQcm90b2NvbC5jcHAKKyAgIHNyYy90aHJpZnQvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5jcHAKKyAgIHNyYy90aHJpZnQvcHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wuY3BwCisgICBzcmMvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbC5jcHAKKyAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uY3BwCisgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9URkRUcmFuc3BvcnQuY3BwCisgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU2ltcGxlRmlsZVRyYW5zcG9ydC5jcHAKKyAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwVHJhbnNwb3J0LmNwcAorICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBDbGllbnQuY3BwCisgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cFNlcnZlci5jcHAKKyAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuY3BwCisgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0UG9vbC5jcHAKKyAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuY3BwCisgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0VXRpbHMuY3BwCisgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5jcHAKKyAgIHNyYy90aHJpZnQvc2VydmVyL1RDb25uZWN0ZWRDbGllbnQuY3BwCisgICBzcmMvdGhyaWZ0L3NlcnZlci9UU2VydmVyRnJhbWV3b3JrLmNwcAorICAgc3JjL3RocmlmdC9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5jcHAKKyAgIHNyYy90aHJpZnQvc2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmNwcAorICAgc3JjL3RocmlmdC9zZXJ2ZXIvVFRocmVhZGVkU2VydmVyLmNwcAorKQorCisjIFRoZXNlIGZpbGVzIGRvbid0IHdvcmsgb24gV2luZG93cyBDRSBhcyB0aGVyZSBpcyBubyBwaXBlIHN1cHBvcnQKKyMgVE9ETzogVGhlc2UgZmlsZXMgd29uJ3Qgd29yayB3aXRoIFVOSUNPREUgc3VwcG9ydCBvbiB3aW5kb3dzLiBJZiBmaXhlZCB0aGlzIGNhbiBiZSByZS1hZGRlZC4KK2lmIChOT1QgV0lOQ0UpCisgICAgbGlzdChBUFBFTkQgdGhyaWZ0Y3BwX1NPVVJDRVMKKyAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UUGlwZS5jcHAKKyAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UUGlwZVNlcnZlci5jcHAKKyAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9URmlsZVRyYW5zcG9ydC5jcHAKKyAgICApCitlbmRpZigpCisKKworaWYgKFdJTjMyKQorICAgIGxpc3QoQVBQRU5EIHRocmlmdGNwcF9TT1VSQ0VTCisgICAgICAgIHNyYy90aHJpZnQvd2luZG93cy9UV2luc29ja1NpbmdsZXRvbi5jcHAKKyAgICAgICAgc3JjL3RocmlmdC93aW5kb3dzL1NvY2tldFBhaXIuY3BwCisgICAgICAgIHNyYy90aHJpZnQvd2luZG93cy9HZXRUaW1lT2ZEYXkuY3BwCisgICAgICAgIHNyYy90aHJpZnQvd2luZG93cy9XaW5GY250bC5jcHAKKyAgICApCisgICAgaWYoTk9UIFdJTkNFKQorICAgICAgICAjIFRoaXMgZmlsZSB1c2VzIHBpcGVzIHNvIGl0IGN1cnJlbnRseSB3b24ndCB3b3JrIG9uIFdpbmRvd3MgQ0UKKyAgICAgICAgbGlzdChBUFBFTkQgdGhyaWZ0Y3BwX1NPVVJDRVMKKyAgICAgICAgICAgIHNyYy90aHJpZnQvd2luZG93cy9PdmVybGFwcGVkU3VibWlzc2lvblRocmVhZC5jcHAKKyAgICAgICAgKQorICAgIGVuZGlmKCkKK2Vsc2UoKQorICAgICMgVGhlc2UgZmlsZXMgZXZhbHVhdGUgdG8gbm90aGluZyBvbiBXaW5kb3dzLCBzbyBvbWl0IHRoZW0gZnJvbSB0aGUKKyAgICAjIFdpbmRvd3MgYnVpbGQKKyAgICBsaXN0KEFQUEVORCB0aHJpZnRjcHBfU09VUkNFUworICAgICAgICBzcmMvdGhyaWZ0L1ZpcnR1YWxQcm9maWxpbmcuY3BwCisgICAgICAgIHNyYy90aHJpZnQvc2VydmVyL1RTZXJ2ZXIuY3BwCisgICAgKQorZW5kaWYoKQorCisjIElmIE9wZW5TU0wgaXMgbm90IGZvdW5kIGp1c3QgaWdub3JlIHRoZSBPcGVuU1NMIHN0dWZmCitmaW5kX3BhY2thZ2UoT3BlblNTTCkKK2lmKE9QRU5TU0xfRk9VTkQgQU5EIFdJVEhfT1BFTlNTTCkKKyAgICBsaXN0KCBBUFBFTkQgdGhyaWZ0Y3BwX1NPVVJDRVMKKyAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU1NMU29ja2V0LmNwcAorICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RTU0xTZXJ2ZXJTb2NrZXQuY3BwCisgICAgKQorICAgIGluY2x1ZGVfZGlyZWN0b3JpZXMoU1lTVEVNICIke09QRU5TU0xfSU5DTFVERV9ESVJ9IikKKyAgICBsaXN0KEFQUEVORCBTWVNMSUJTICIke09QRU5TU0xfTElCUkFSSUVTfSIpCitlbmRpZigpCisKKyMgV0lUSF8qVEhSRUFEUyBzZWxlY3RzIHdoaWNoIHRocmVhZGluZyBsaWJyYXJ5IHRvIHVzZQoraWYoVU5JWCBBTkQgTk9UIFdJVEhfU1REVEhSRUFEUykKKyAgICBpZihBTkRST0lEKQorICAgICAgICBzZXQoQ01BS0VfQ1hYX0ZMQUdTICIke0NNQUtFX0NYWF9GTEFHU30gLXB0aHJlYWQiKQorICAgIGVsc2UoKQorICAgICAgICBsaXN0KEFQUEVORCBTWVNMSUJTIHB0aHJlYWQpCisgICAgZW5kaWYoKQorICAgIHNldCggdGhyaWZ0Y3BwX3RocmVhZHNfU09VUkNFUworICAgICAgICBzcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1Bvc2l4VGhyZWFkRmFjdG9yeS5jcHAKKyAgICAgICAgc3JjL3RocmlmdC9jb25jdXJyZW5jeS9NdXRleC5jcHAKKyAgICAgICAgc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmNwcAorICAgICkKK2Vsc2UoKQorICAgIGlmKFVOSVgpCisgICAgICAgIGlmKEFORFJPSUQpCisgICAgICAgICAgICBzZXQoQ01BS0VfQ1hYX0ZMQUdTICIke0NNQUtFX0NYWF9GTEFHU30gLXB0aHJlYWQiKQorICAgICAgICBlbHNlKCkKKyAgICAgICAgICAgIGxpc3QoQVBQRU5EIFNZU0xJQlMgcHRocmVhZCkKKyAgICAgICAgZW5kaWYoKQorICAgIGVuZGlmKCkKKyAgICBzZXQoIHRocmlmdGNwcF90aHJlYWRzX1NPVVJDRVMKKyAgICAgICAgc3JjL3RocmlmdC9jb25jdXJyZW5jeS9TdGRUaHJlYWRGYWN0b3J5LmNwcAorICAgICAgICBzcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1N0ZE11dGV4LmNwcAorICAgICAgICBzcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1N0ZE1vbml0b3IuY3BwCisgICAgKQorZW5kaWYoKQorCisjIFRocmlmdCBub24gYmxvY2tpbmcgc2VydmVyCitzZXQoIHRocmlmdGNwcG5iX1NPVVJDRVMKKyAgICBzcmMvdGhyaWZ0L3NlcnZlci9UTm9uYmxvY2tpbmdTZXJ2ZXIuY3BwCisgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU2VydmVyU29ja2V0LmNwcAorICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NTTFNlcnZlclNvY2tldC5jcHAKKyAgICBzcmMvdGhyaWZ0L2FzeW5jL1RFdmh0dHBTZXJ2ZXIuY3BwCisgICAgc3JjL3RocmlmdC9hc3luYy9URXZodHRwQ2xpZW50Q2hhbm5lbC5jcHAKKykKKworIyBUaHJpZnQgemxpYiBzZXJ2ZXIKK3NldCggdGhyaWZ0Y3Bwel9TT1VSQ0VTCisgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVFpsaWJUcmFuc3BvcnQuY3BwCisgICAgc3JjL3RocmlmdC9wcm90b2NvbC9USGVhZGVyUHJvdG9jb2wuY3BwCisgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVEhlYWRlclRyYW5zcG9ydC5jcHAKKyAgICBzcmMvdGhyaWZ0L3Byb3RvY29sL1RIZWFkZXJQcm90b2NvbC5jcHAKKyAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9USGVhZGVyVHJhbnNwb3J0LmNwcAorKQorCisjIFRocmlmdCBRdDQgc2VydmVyCitzZXQoIHRocmlmdGNwcHF0X1NPVVJDRVMKKyAgICBzcmMvdGhyaWZ0L3F0L1RRSU9EZXZpY2VUcmFuc3BvcnQuY3BwCisgICAgc3JjL3RocmlmdC9xdC9UUVRjcFNlcnZlci5jcHAKKykKKworIyBDb250YWlucyB0aGUgdGhyaWZ0IHNwZWNpZmljIEFERF9MSUJSQVJZX1RIUklGVCBhbmQgVEFSR0VUX0xJTktfTElCUkFSSUVTX1RIUklGVAoraW5jbHVkZShUaHJpZnRNYWNyb3MpCisKK0FERF9MSUJSQVJZX1RIUklGVCh0aHJpZnQgJHt0aHJpZnRjcHBfU09VUkNFU30gJHt0aHJpZnRjcHBfdGhyZWFkc19TT1VSQ0VTfSkKK2lmKFdJTjMyKQorICAgIFRBUkdFVF9MSU5LX0xJQlJBUklFU19USFJJRlQodGhyaWZ0ICR7U1lTTElCU30gd3MyXzMyKQorZWxzZSgpCisgICAgVEFSR0VUX0xJTktfTElCUkFSSUVTX1RIUklGVCh0aHJpZnQgJHtTWVNMSUJTfSkKK2VuZGlmKCkKKworaWYoV0lUSF9MSUJFVkVOVCkKKyAgICBmaW5kX3BhY2thZ2UoTGliZXZlbnQgUkVRVUlSRUQpICAjIExpYmV2ZW50IGNvbWVzIHdpdGggQ01ha2Ugc3VwcG9ydCBmb3JtIHVwc3RyZWFtCisgICAgaW5jbHVkZV9kaXJlY3RvcmllcyhTWVNURU0gJHtMSUJFVkVOVF9JTkNMVURFX0RJUlN9KQorCisgICAgQUREX0xJQlJBUllfVEhSSUZUKHRocmlmdG5iICR7dGhyaWZ0Y3BwbmJfU09VUkNFU30pCisgICAgVEFSR0VUX0xJTktfTElCUkFSSUVTX1RIUklGVCh0aHJpZnRuYiAke1NZU0xJQlN9ICR7TElCRVZFTlRfTElCUkFSSUVTfSkKKyAgICBUQVJHRVRfTElOS19MSUJSQVJJRVNfVEhSSUZUX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkodGhyaWZ0bmIgdGhyaWZ0KQorZW5kaWYoKQorCitpZihXSVRIX1pMSUIpCisgICAgZmluZF9wYWNrYWdlKFpMSUIgUkVRVUlSRUQpCisgICAgaW5jbHVkZV9kaXJlY3RvcmllcyhTWVNURU0gJHtaTElCX0lOQ0xVREVfRElSU30pCisKKyAgICBBRERfTElCUkFSWV9USFJJRlQodGhyaWZ0eiAke3RocmlmdGNwcHpfU09VUkNFU30pCisgICAgVEFSR0VUX0xJTktfTElCUkFSSUVTX1RIUklGVCh0aHJpZnR6ICR7U1lTTElCU30gJHtaTElCX0xJQlJBUklFU30pCisgICAgVEFSR0VUX0xJTktfTElCUkFSSUVTX1RIUklGVF9BR0FJTlNUX1RIUklGVF9MSUJSQVJZKHRocmlmdHogdGhyaWZ0KQorZW5kaWYoKQorCitpZihXSVRIX1FUNCkKKyAgICBzZXQoQ01BS0VfQVVUT01PQyBPTikKKyAgICBmaW5kX3BhY2thZ2UoUXQ0IFJFUVVJUkVEIENPTVBPTkVOVFMgUXRDb3JlIFF0TmV0d29yaykKKyAgICBBRERfTElCUkFSWV9USFJJRlQodGhyaWZ0cXQgJHt0aHJpZnRjcHBxdF9TT1VSQ0VTfSkKKyAgICBUQVJHRVRfTElOS19MSUJSQVJJRVNfVEhSSUZUKHRocmlmdHF0ICR7U1lTTElCU30gUXQ0OjpRdENvcmUgUXQ0OjpRdE5ldHdvcmspCisgICAgVEFSR0VUX0xJTktfTElCUkFSSUVTX1RIUklGVF9BR0FJTlNUX1RIUklGVF9MSUJSQVJZKHRocmlmdHF0IHRocmlmdCkKK2VuZGlmKCkKKworaWYoV0lUSF9RVDUpCisgICAgIyBRdDUgaGFzIGl0cyBvd24gZGlyZWN0b3J5IHRvIGF2b2lkIGNvbmZsaWN0IHdpdGggUXQ0IGNhdXNlZCBieSBDTUFLRV9BVVRPTU9DCisgICAgYWRkX3N1YmRpcmVjdG9yeShzcmMvdGhyaWZ0L3F0KQorZW5kaWYoKQorCitpZihNU1ZDKQorICAgIGFkZF9kZWZpbml0aW9ucygiLURVTklDT0RFIC1EX1VOSUNPREUiKQorZW5kaWYoKQorCithZGRfZGVmaW5pdGlvbnMoIi1EX19TVERDX0xJTUlUX01BQ1JPUyIpCisKKyMgSW5zdGFsbCB0aGUgaGVhZGVycworaW5zdGFsbChESVJFQ1RPUlkgInNyYy90aHJpZnQiIERFU1RJTkFUSU9OICIke0lOQ0xVREVfSU5TVEFMTF9ESVJ9IgorICAgIEZJTEVTX01BVENISU5HIFBBVFRFUk4gIiouaCIgUEFUVEVSTiAiKi50Y2MiKQorIyBDb3B5IGNvbmZpZy5oIGZpbGUKK2luc3RhbGwoRElSRUNUT1JZICIke0NNQUtFX0JJTkFSWV9ESVJ9L3RocmlmdCIgREVTVElOQVRJT04gIiR7SU5DTFVERV9JTlNUQUxMX0RJUn0iCisgICAgRklMRVNfTUFUQ0hJTkcgUEFUVEVSTiAiKi5oIikKKworaWYoQlVJTERfVEVTVElORykKKyAgICBhZGRfc3ViZGlyZWN0b3J5KHRlc3QpCitlbmRpZigpCmRpZmYgLS1naXQgYS9saWIvY3BwL01ha2VmaWxlLmFtIGIvbGliL2NwcC9NYWtlZmlsZS5hbQppbmRleCA1MjA2ZGI4Li44NWJiOWFiIDEwMDc1NQotLS0gYS9saWIvY3BwL01ha2VmaWxlLmFtCisrKyBiL2xpYi9jcHAvTWFrZWZpbGUuYW0KQEAgLTIyLDE3ICsyMiwyNSBAQAogbW9jXyUuY3BwOiAlLmgKIAkkKFFUX01PQykgJChRVF9DRkxBR1MpICQ8IC1vICRACiAKK21vY19fJS5jcHA6ICUuaAorCSQoUVQ1X01PQykgJChRVDVfQ0ZMQUdTKSAkPCAtbyAkQAorCiBTVUJESVJTID0gLgogCiBpZiBXSVRIX1RFU1RTCisjIFRoaXMgZmlsZSBpcyBuZWVkZWQgYnkgY29tcGlsZXIgd2l0aCBwbHVnaW4sIHdoaWxlIHRlc3QvTWFrZWZpbGUuYW0gbmVlZHMgY29tcGlsZXIKKyMgU28gdGVzdCBkaXJlY3RvcnkgaXMgZGlyZWN0bHkgcGlja2VkIGJ5IHRvcCBsZXZlbCBNYWtlZmlsZS5hbSBmb3IgcGx1Z2luIGJ1aWxkCitpZiAhV0lUSF9QTFVHSU4KIFNVQkRJUlMgKz0gdGVzdAogZW5kaWYKK2VuZGlmCiAKIHBrZ2NvbmZpZ2RpciA9ICQobGliZGlyKS9wa2djb25maWcKIAogbGliX0xUTElCUkFSSUVTID0gbGlidGhyaWZ0LmxhCiBwa2djb25maWdfREFUQSA9IHRocmlmdC5wYwotbGlidGhyaWZ0X2xhX0xERkxBR1MgPSAtcmVsZWFzZSAkKFZFUlNJT04pICQoQk9PU1RfTERGTEFHUykKK2xpYnRocmlmdF9sYV9MREZMQUdTID0gLXJlbGVhc2UgJChWRVJTSU9OKQorbGlidGhyaWZ0X2xhX0xJQkFERCA9ICQoQk9PU1RfTERGTEFHUykgJChPUEVOU1NMX0xERkxBR1MpICQoT1BFTlNTTF9MSUJTKQogCiAjIyBXZSBvbmx5IGJ1aWxkIHRoZSBleHRyYSBsaWJyYXJpZXMgaWYgd2UgaGF2ZSB0aGUgZGVwZW5kZW5jaWVzLAogIyMgYnV0IHdlIGluc3RhbGwgYWxsIG9mIHRoZSBoZWFkZXJzIHVuY29uZGl0aW9uYWxseS4KQEAgLTQ4LDI0ICs1NiwzMSBAQAogbGliX0xUTElCUkFSSUVTICs9IGxpYnRocmlmdHF0LmxhCiBwa2djb25maWdfREFUQSArPSB0aHJpZnQtcXQucGMKIGVuZGlmCitpZiBBTVhfSEFWRV9RVDUKK2xpYl9MVExJQlJBUklFUyArPSBsaWJ0aHJpZnRxdDUubGEKK3BrZ2NvbmZpZ19EQVRBICs9IHRocmlmdC1xdDUucGMKK2VuZGlmCiAKIEFNX0NYWEZMQUdTID0gLVdhbGwgLVdleHRyYSAtcGVkYW50aWMKLUFNX0NQUEZMQUdTID0gJChCT09TVF9DUFBGTEFHUykgLUkkKHNyY2Rpcikvc3JjCi1BTV9MREZMQUdTID0gJChCT09TVF9MREZMQUdTKQorQU1fQ1BQRkxBR1MgPSAkKEJPT1NUX0NQUEZMQUdTKSAkKE9QRU5TU0xfSU5DTFVERVMpIC1JJChzcmNkaXIpL3NyYyAtRF9fU1REQ19GT1JNQVRfTUFDUk9TIC1EX19TVERDX0xJTUlUX01BQ1JPUwogCiAjIERlZmluZSB0aGUgc291cmNlIGZpbGVzIGZvciB0aGUgbW9kdWxlCiAKLWxpYnRocmlmdF9sYV9TT1VSQ0VTID0gc3JjL3RocmlmdC9UaHJpZnQuY3BwIFwKLSAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9UQXBwbGljYXRpb25FeGNlcHRpb24uY3BwIFwKK2xpYnRocmlmdF9sYV9TT1VSQ0VTID0gc3JjL3RocmlmdC9UQXBwbGljYXRpb25FeGNlcHRpb24uY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9UT3V0cHV0LmNwcCBcCiAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvVmlydHVhbFByb2ZpbGluZy5jcHAgXAorICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2FzeW5jL1RBc3luY0NoYW5uZWwuY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9hc3luYy9UQXN5bmNQcm90b2NvbFByb2Nlc3Nvci5jcHAgXAorICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2FzeW5jL1RDb25jdXJyZW50Q2xpZW50U3luY0luZm8uY3BwIFwKICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyLmNwcCBcCiAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY29uY3VycmVuY3kvVGltZXJNYW5hZ2VyLmNwcCBcCiAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY29uY3VycmVuY3kvVXRpbC5jcHAgXAorICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3Byb2Nlc3Nvci9QZWVrUHJvY2Vzc29yLmNwcCBcCiAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcHJvdG9jb2wvVERlYnVnUHJvdG9jb2wuY3BwIFwKLSAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wcm90b2NvbC9URGVuc2VQcm90b2NvbC5jcHAgXAogICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2wuY3BwIFwKICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wcm90b2NvbC9UQmFzZTY0VXRpbHMuY3BwIFwKICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5jcHAgXAorICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbC5jcHAgXAogICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmNwcCBcCiAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RGRFRyYW5zcG9ydC5jcHAgXAogICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9URmlsZVRyYW5zcG9ydC5jcHAgXApAQCAtODAsNDggKzk1LDU4IEBACiAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXRQb29sLmNwcCBcCiAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuY3BwIFwKICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVFNTTFNlcnZlclNvY2tldC5jcHAgXAorICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQuY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU1NMU2VydmVyU29ja2V0LmNwcCBcCiAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRVdGlscy5jcHAgXAogICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5jcHAgXAorICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3NlcnZlci9UQ29ubmVjdGVkQ2xpZW50LmNwcCBcCiAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvc2VydmVyL1RTZXJ2ZXIuY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9zZXJ2ZXIvVFNlcnZlckZyYW1ld29yay5jcHAgXAogICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3NlcnZlci9UU2ltcGxlU2VydmVyLmNwcCBcCiAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvc2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmNwcCBcCi0gICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvc2VydmVyL1RUaHJlYWRlZFNlcnZlci5jcHAgXAotICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2FzeW5jL1RBc3luY0NoYW5uZWwuY3BwIFwKLSAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wcm9jZXNzb3IvUGVla1Byb2Nlc3Nvci5jcHAKKyAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9zZXJ2ZXIvVFRocmVhZGVkU2VydmVyLmNwcAogCi1pZiBXSVRIX0JPT1NUVEhSRUFEUwotbGlidGhyaWZ0X2xhX1NPVVJDRVMgKz0gc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Cb29zdFRocmVhZEZhY3RvcnkuY3BwIFwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY29uY3VycmVuY3kvQm9vc3RNb25pdG9yLmNwcCBcCi0gICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L0Jvb3N0TXV0ZXguY3BwCi1lbHNlCiBsaWJ0aHJpZnRfbGFfU09VUkNFUyArPSBzcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L011dGV4LmNwcCBcCiAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L01vbml0b3IuY3BwIFwKICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY29uY3VycmVuY3kvUG9zaXhUaHJlYWRGYWN0b3J5LmNwcAotZW5kaWYKIAogbGlidGhyaWZ0bmJfbGFfU09VUkNFUyA9IHNyYy90aHJpZnQvc2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5jcHAgXAotICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvYXN5bmMvVEFzeW5jUHJvdG9jb2xQcm9jZXNzb3IuY3BwIFwKICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2FzeW5jL1RFdmh0dHBTZXJ2ZXIuY3BwIFwKICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2FzeW5jL1RFdmh0dHBDbGllbnRDaGFubmVsLmNwcAogCi1saWJ0aHJpZnR6X2xhX1NPVVJDRVMgPSBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UWmxpYlRyYW5zcG9ydC5jcHAKK2xpYnRocmlmdHpfbGFfU09VUkNFUyA9IHNyYy90aHJpZnQvdHJhbnNwb3J0L1RabGliVHJhbnNwb3J0LmNwcCBcCisgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9USGVhZGVyVHJhbnNwb3J0LmNwcCBcCisgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3Byb3RvY29sL1RIZWFkZXJQcm90b2NvbC5jcHAKKwogCiBsaWJ0aHJpZnRxdF9sYV9NT0MgPSBzcmMvdGhyaWZ0L3F0L21vY19UUVRjcFNlcnZlci5jcHAKLWxpYnRocmlmdHF0X2xhX1NPVVJDRVMgPSAkKGxpYnRocmlmdHF0X2xhX01PQykgXAotICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcXQvVFFJT0RldmljZVRyYW5zcG9ydC5jcHAgXAorbm9kaXN0X2xpYnRocmlmdHF0X2xhX1NPVVJDRVMgPSAkKGxpYnRocmlmdHF0X2xhX01PQykKK2xpYnRocmlmdHF0X2xhX1NPVVJDRVMgPSBzcmMvdGhyaWZ0L3F0L1RRSU9EZXZpY2VUcmFuc3BvcnQuY3BwIFwKICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3F0L1RRVGNwU2VydmVyLmNwcAogQ0xFQU5GSUxFUyA9ICQobGlidGhyaWZ0cXRfbGFfTU9DKQogCitsaWJ0aHJpZnRxdDVfbGFfTU9DID0gc3JjL3RocmlmdC9xdC9tb2NfX1RRVGNwU2VydmVyLmNwcAorbm9kaXN0X2xpYnRocmlmdHF0NV9sYV9TT1VSQ0VTID0gJChsaWJ0aHJpZnRxdDVfbGFfTU9DKQorbGlidGhyaWZ0cXQ1X2xhX1NPVVJDRVMgPSBzcmMvdGhyaWZ0L3F0L1RRSU9EZXZpY2VUcmFuc3BvcnQuY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9xdC9UUVRjcFNlcnZlci5jcHAKK0NMRUFORklMRVMgKz0gJChsaWJ0aHJpZnRxdDVfbGFfTU9DKQorCiAjIEZsYWdzIGZvciB0aGUgdmFyaW91cyBsaWJyYXJpZXMKIGxpYnRocmlmdG5iX2xhX0NQUEZMQUdTID0gJChBTV9DUFBGTEFHUykgJChMSUJFVkVOVF9DUFBGTEFHUykKIGxpYnRocmlmdHpfbGFfQ1BQRkxBR1MgID0gJChBTV9DUFBGTEFHUykgJChaTElCX0NQUEZMQUdTKQogbGlidGhyaWZ0cXRfbGFfQ1BQRkxBR1MgPSAkKEFNX0NQUEZMQUdTKSAkKFFUX0NGTEFHUykKK2xpYnRocmlmdHF0NV9sYV9DUFBGTEFHUyA9ICQoQU1fQ1BQRkxBR1MpICQoUVQ1X0NGTEFHUykKK2lmIFFUNV9SRURVQ0VfUkVMT0NBVElPTlMKK2xpYnRocmlmdHF0NV9sYV9DUFBGTEFHUyArPSAtZlBJQworZW5kaWYKIGxpYnRocmlmdG5iX2xhX0NYWEZMQUdTID0gJChBTV9DWFhGTEFHUykKIGxpYnRocmlmdHpfbGFfQ1hYRkxBR1MgID0gJChBTV9DWFhGTEFHUykKIGxpYnRocmlmdHF0X2xhX0NYWEZMQUdTICA9ICQoQU1fQ1hYRkxBR1MpCitsaWJ0aHJpZnRxdDVfbGFfQ1hYRkxBR1MgID0gJChBTV9DWFhGTEFHUykKIGxpYnRocmlmdG5iX2xhX0xERkxBR1MgID0gLXJlbGVhc2UgJChWRVJTSU9OKSAkKEJPT1NUX0xERkxBR1MpCi1saWJ0aHJpZnR6X2xhX0xERkxBR1MgICA9IC1yZWxlYXNlICQoVkVSU0lPTikgJChCT09TVF9MREZMQUdTKQorbGlidGhyaWZ0el9sYV9MREZMQUdTICAgPSAtcmVsZWFzZSAkKFZFUlNJT04pICQoQk9PU1RfTERGTEFHUykgJChaTElCX0xJQlMpCiBsaWJ0aHJpZnRxdF9sYV9MREZMQUdTICAgPSAtcmVsZWFzZSAkKFZFUlNJT04pICQoQk9PU1RfTERGTEFHUykgJChRVF9MSUJTKQorbGlidGhyaWZ0cXQ1X2xhX0xERkxBR1MgICA9IC1yZWxlYXNlICQoVkVSU0lPTikgJChCT09TVF9MREZMQUdTKSAkKFFUNV9MSUJTKQogCiBpbmNsdWRlX3RocmlmdGRpciA9ICQoaW5jbHVkZWRpcikvdGhyaWZ0CiBpbmNsdWRlX3RocmlmdF9IRUFERVJTID0gXApAQCAtMTI5LDE2ICsxNTQsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RocmlmdC1jb25maWcuaCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9URGlzcGF0Y2hQcm9jZXNzb3IuaCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9UaHJpZnQuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9UUmVmbGVjdGlvbkxvY2FsLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvVE91dHB1dC5oIFwKICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L1RQcm9jZXNzb3IuaCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9UQXBwbGljYXRpb25FeGNlcHRpb24uaCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9UTG9nZ2luZy5oIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2N4eGZ1bmN0aW9uYWwuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9UVG9TdHJpbmcuaAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvVFRvU3RyaW5nLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvVEJhc2UuaAogCiBpbmNsdWRlX2NvbmN1cnJlbmN5ZGlyID0gJChpbmNsdWRlX3RocmlmdGRpcikvY29uY3VycmVuY3kKIGluY2x1ZGVfY29uY3VycmVuY3lfSEVBREVSUyA9IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L0Jvb3N0VGhyZWFkRmFjdG9yeS5oIFwKICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L0V4Y2VwdGlvbi5oIFwKICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L011dGV4LmggXAogICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY29uY3VycmVuY3kvTW9uaXRvci5oIFwKQEAgLTE2MCwxMyArMTg0LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wudGNjIFwKICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wuaCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLnRjYyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wcm90b2NvbC9URGVuc2VQcm90b2NvbC5oIFwKICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3Byb3RvY29sL1REZWJ1Z1Byb3RvY29sLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcHJvdG9jb2wvVEhlYWRlclByb3RvY29sLmggXAogICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcHJvdG9jb2wvVEJhc2U2NFV0aWxzLmggXAogICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5oIFwKICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLmggXAogICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLmggXAogICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sVGFwLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sVHlwZXMuaCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xFeGNlcHRpb24uaCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wcm90b2NvbC9UVmlydHVhbFByb3RvY29sLmggXAogICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmgKQEAgLTE3NiwxMCArMjAxLDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvUGxhdGZvcm1Tb2NrZXQuaCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVEZEVHJhbnNwb3J0LmggXAogICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RGaWxlVHJhbnNwb3J0LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RIZWFkZXJUcmFuc3BvcnQuaCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVFNpbXBsZUZpbGVUcmFuc3BvcnQuaCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oIFwKICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU1NMU2VydmVyU29ja2V0LmggXAogICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJUcmFuc3BvcnQuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NlcnZlclNvY2tldC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQuaCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBUcmFuc3BvcnQuaCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBDbGllbnQuaCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBTZXJ2ZXIuaCBcCkBAIC0xOTgsNyArMjI3LDkgQEAKIAogaW5jbHVkZV9zZXJ2ZXJkaXIgPSAkKGluY2x1ZGVfdGhyaWZ0ZGlyKS9zZXJ2ZXIKIGluY2x1ZGVfc2VydmVyX0hFQURFUlMgPSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9zZXJ2ZXIvVENvbm5lY3RlZENsaWVudC5oIFwKICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3NlcnZlci9UU2VydmVyLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvc2VydmVyL1RTZXJ2ZXJGcmFtZXdvcmsuaCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5oIFwKICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5oIFwKICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3NlcnZlci9UVGhyZWFkZWRTZXJ2ZXIuaCBcCkBAIC0yMTcsNiArMjQ4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvYXN5bmMvVEFzeW5jUHJvY2Vzc29yLmggXAogICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9hc3luYy9UQXN5bmNCdWZmZXJQcm9jZXNzb3IuaCBcCiAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2FzeW5jL1RBc3luY1Byb3RvY29sUHJvY2Vzc29yLmggXAorICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9hc3luYy9UQ29uY3VycmVudENsaWVudFN5bmNJbmZvLmggXAogICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9hc3luYy9URXZodHRwQ2xpZW50Q2hhbm5lbC5oIFwKICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvYXN5bmMvVEV2aHR0cFNlcnZlci5oCiAKQEAgLTIyNSw4ICsyNTcsNiBAQAogICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9xdC9UUUlPRGV2aWNlVHJhbnNwb3J0LmggXAogICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9xdC9UUVRjcFNlcnZlci5oCiAKLVRIUklGVCA9ICQodG9wX2J1aWxkZGlyKS9jb21waWxlci9jcHAvdGhyaWZ0Ci0KIFdJTkRPV1NfRElTVCA9IFwKICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3dpbmRvd3MgXAogICAgICAgICAgICAgIHRocmlmdC5zbG4gXApAQCAtMjM3LDkgKzI2NywxNiBAQAogICAgICAgICAgICAgIDNyZHBhcnR5LnByb3BzCiAKIEVYVFJBX0RJU1QgPSBcCisgICAgICAgICAgICAgQ01ha2VMaXN0cy50eHQgXAorICAgICAgICAgICAgIGNvZGluZ19zdGFuZGFyZHMubWQgXAogICAgICAgICAgICAgIFJFQURNRS5tZCBcCiAgICAgICAgICAgICAgdGhyaWZ0LW5iLnBjLmluIFwKICAgICAgICAgICAgICB0aHJpZnQucGMuaW4gXAogICAgICAgICAgICAgIHRocmlmdC16LnBjLmluIFwKICAgICAgICAgICAgICB0aHJpZnQtcXQucGMuaW4gXAorICAgICAgICAgICAgIHRocmlmdC1xdDUucGMuaW4gXAorICAgICAgICAgICAgIHNyYy90aHJpZnQvcXQvQ01ha2VMaXN0cy50eHQgXAogICAgICAgICAgICAgICQoV0lORE9XU19ESVNUKQorCitzdHlsZS1sb2NhbDoKKwkkKENQUFNUWUxFX0NNRCkKZGlmZiAtLWdpdCBhL2xpYi9jcHAvUkVBRE1FLm1kIGIvbGliL2NwcC9SRUFETUUubWQKaW5kZXggMmJlZTJlYy4uZTc0NGE2YSAxMDA3NTUKLS0tIGEvbGliL2NwcC9SRUFETUUubWQKKysrIGIvbGliL2NwcC9SRUFETUUubWQKQEAgLTE5LDcgKzE5LDYgQEAKIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKIHVuZGVyIHRoZSBMaWNlbnNlLgogCi0KICMgVXNpbmcgVGhyaWZ0IHdpdGggQysrCiAKIFRoZSBUaHJpZnQgQysrIGxpYnJhcmllcyBhcmUgYnVpbHQgdXNpbmcgdGhlIEdOVSB0b29scy4gRm9sbG93IHRoZSBpbnN0cnVjdGlvbnMKQEAgLTU1LDE1ICs1NCwyMiBAQAogCiAjIyBEZXBlbmRlbmNpZXMKIAotYm9vc3Qgc2hhcmVkIHBvaW50ZXJzCi1odHRwOi8vd3d3LmJvb3N0Lm9yZy9saWJzL3NtYXJ0X3B0ci9zbWFydF9wdHIuaHRtCitJZiB5b3VyIEMrKyBlbnZpcm9ubWVudCBpbXBsZW1lbnRzIEMrKzExIG9yIGxhdGVyLCB0aHJpZnQgd2lsbCBhdXRvbWF0aWNhbGx5IHVzZQorc3RkOjpzaGFyZWRfcHRyLiAgT3RoZXJ3aXNlIHlvdSB3aWxsIG5lZWQgdGhlIGJvb3N0IGxpYnJhcnkgdG8gcHJvdmlkZSBhIHNoYXJlZF9wdHIKK2ltcGxlbWVudGF0aW9uIGZvciBDKysgZW52aXJvbm1lbnRzIHByZS1DKysxMS4gIElmIHlvdSBhcmUgbGlua2luZyBhZ2FpbnN0IGNvZGUKK3RoYXQgZXhwZWN0cyB0byBiZSB1c2luZyBib29zdDo6c2hhcmVkX3B0ciwgeW91IGNhbiBkZWZpbmUgdGhlIHByZXByb2Nlc3NvcgordmFyaWFibGUgRk9SQ0VfQk9PU1RfU01BUlRfUFRSIGZvciB5b3VyIGJ1aWxkIG9mIHRocmlmdCB0byBtYWtlIGl0IHVzZSBib29zdCBpbnN0ZWFkCitvZiBzdGQgZm9yIGEgbnVtYmVyIG9mIG1lbW9yeSByZWxhdGVkIGNsYXNzZXMuICBTZWUgdGhyaWZ0L3N0ZGN4eC5oIGZvciBtb3JlLgogCiBsaWJldmVudCAoZm9yIGxpYnRocmlmdG5iIG9ubHkpCiBodHRwOi8vbW9ua2V5Lm9yZy9+cHJvdm9zL2xpYmV2ZW50LwogCiAjIFVzaW5nIFRocmlmdCB3aXRoIEMrKyBvbiBXaW5kb3dzCiAKLVlvdSBuZWVkIHRvIGRlZmluZSBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIDNyZCBwYXJ0eSBjb21wb25lbnRzIHNlcGFyYXRlbHk6CitCb3RoIHRoZSBhdXRvY29uZiBhbmQgY21ha2UgYnVpbGQgc3lzdGVtcyBhcmUgYWJsZSB0byBhdXRvbWF0aWNhbGx5IGRldGVjdCBtYW55CitzeXN0ZW0gY29uZmlndXJhdGlvbnMgd2l0aG91dCB0aGUgbmVlZCB0byBzcGVjaWZ5IGxpYnJhcnkgbG9jYXRpb25zLCBob3dldmVyIGlmCit5b3UgcnVuIGludG8gcHJvYmxlbXMgb3Igd2FudCB0byByZWRpcmVjdCB0aHJpZnQgdG8gYnVpbGQgYW5kIGxpbmsgYWdhaW5zdCB5b3VyCitvd24gcHJvdmlkZWQgdGhpcmQgcGFydHkgbGlicmFyaWVzOgogCiBCT09TVF9ST09UIDogRm9yIGJvb3N0LCBlLmcuIEQ6XGJvb3N0XzFfNTVfMAogT1BFTlNTTF9ST09UX0RJUiA6IEZvciBPcGVuU1NMLCBlLmcuIEQ6XE9wZW5TU0wtV2luMzIKQEAgLTc0LDEzICs4MCw3IEBACiAKIFNlZSAvM3JkcGFydHkudXNlciBmb3IgbW9yZSBkZXRhaWxzLgogCi1UaHJpZnQgaXMgZGl2aWRlZCBpbnRvIHR3byBsaWJyYXJpZXMuCi0KLSogbGlidGhyaWZ0IC0gVGhlIGNvcmUgVGhyaWZ0IGxpYnJhcnkgY29udGFpbnMgYWxsIHRoZSBjb3JlIFRocmlmdCBjb2RlLiBJdCByZXF1aXJlcwotICBib29zdCBzaGFyZWQgcG9pbnRlcnMsIHB0aHJlYWRzLCBhbmQgbGlicnQuCi0KLSogbGlidGhyaWZ0bmIgLSBUaGlzIGxpYnJhcnkgY29udGFpbnMgdGhlIFRocmlmdCBub25ibG9ja2luZyBzZXJ2ZXIsIHdoaWNoIHVzZXMgbGliZXZlbnQuCi0gIFRvIGxpbmsgdGhpcyBsaWJyYXJ5IHlvdSB3aWxsIGFsc28gbmVlZCB0byBsaW5rIGxpYmV2ZW50LgorVGhlIHNhbWUgbGlua2luZyBndWlkZWxpbmVzIGRlc2NyaWJlZCBhYm92ZSBmb3IgbGlidGhyaWZ0bmIgYXBwbHkgdG8gd2luZG93cyBhcyB3ZWxsLgogCiAjIyBMaW5raW5nIEFnYWluc3QgVGhyaWZ0CiAKQEAgLTkzLDggKzkzLDcgQEAKIAogIyMgRGVwZW5kZW5jaWVzCiAKLWJvb3N0IHNoYXJlZCBwb2ludGVycwotaHR0cDovL3d3dy5ib29zdC5vcmcvbGlicy9zbWFydF9wdHIvc21hcnRfcHRyLmh0bQorVGhlIHNhbWUgZGVwZW5kZW5jaWVzIGZvciBzaGFyZWRfcHRyIGFzIGRlc2NyaWJlZCBhYm92ZSBhcHBseSB0byB3aW5kb3dzIGFzIHdlbGwuCiAKIGJvb3N0IHRocmVhZAogaHR0cDovL3d3dy5ib29zdC5vcmcvZG9jL2xpYnMvcmVsZWFzZS9kb2MvaHRtbC90aHJlYWQuaHRtbApAQCAtMjcyLDMgKzI3MSwyNiBAQAogCiBUaGUgUFJORyBzZWVkIGlzIGtleSB0byB0aGUgYXBwbGljYXRpb24gc2VjdXJpdHkuIFRoaXMgbWV0aG9kIHNob3VsZCBiZQogb3ZlcnJpZGRlbiBpZiBpdCdzIG5vdCBzdHJvbmcgZW5vdWdoIGZvciB5b3UuCisKKyMgQnJlYWtpbmcgQ2hhbmdlcworCisjIyAwLjExLjAKKworT2xkZXIgdmVyc2lvbnMgb2YgdGhyaWZ0IGRlcGVuZGVkIG9uIHRoZSA8Ym9vc3Qvc21hcnRfcHRyLmhwcD4gY2xhc3NlcyB3aGljaAord2VyZSB1c2VkIGluIHRocmlmdCBoZWFkZXJzIHRvIGRlZmluZSBpbnRlcmZhY2VzLiAgVGhyaWZ0IG5vdyBkZXRlY3RzIEMrKzExCithdCBidWlsZCB0aW1lIGFuZCB3aWxsIHByZWZlciB0byB1c2UgPG1lbW9yeT4gY2xhc3NlcyBmcm9tIEMrKzExIGluc3RlYWQuCitZb3UgY2FuIGZvcmNlIHRoZSBsaWJyYXJ5IHRvIGJ1aWxkIHdpdGggYm9vc3QgbWVtb3J5IGNsYXNzZXMgYnkgZGVmaW5pbmcgdGhlCitwcmVwcm9jZXNzb3IgbWFjcm8gYEZPUkNFX0JPT1NUX1NNQVJUX1BUUmAuICAoVEhSSUZULTIyMjEpCisKK0luIHRoZSBwdGhyZWFkIG11dGV4IGltcGxlbWVudGF0aW9uLCB0aGUgY29udGVudGlvbiBwcm9maWxpbmcgY29kZSB3YXMgZW5hYmxlZAorYnkgZGVmYXVsdCBpbiBhbGwgYnVpbGRzLiAgVGhpcyBjaGFuZ2VkIHRvIGJlIGRpc2FibGVkIGJ5IGRlZmF1bHQuICAoVEhSSUZULTQxNTEpCisKK0luIG9sZGVyIHJlbGVhc2VzLCBpZiBhIFRTU0xTb2NrZXRGYWN0b3J5J3MgbGlmZXRpbWUgd2FzIG5vdCBhdCBsZWFzdCBhcyBsb25nCithcyB0aGUgVFNTTFNvY2tldHMgaXQgY3JlYXRlZCwgd2Ugc2lsZW50bHkgcmV2ZXJ0ZWQgb3BlbnNzbCB0byB1bnNhZmUgbXVsdGl0aHJlYWQgYmVoYXZpb3IKK2FuZCBzbyB0aGUgcmVzdWx0cyB3ZXJlIHVuZGVmaW5lZC4gIENoYW5nZXMgd2VyZSBtYWRlIGluIDAuMTEuMCB0aGF0IGNhdXNlIGVpdGhlciBhbgorYXNzZXJ0aW9uIG9yIGEgY29yZSBpbnN0ZWFkIG9mIHVuZGVmaW5lZCBiZWhhdmlvci4gIFRoZSBsaWZldGltZSBvZiBhIFRTU0xTb2NrZXRGYWN0b3J5CisqbXVzdCogYmUgbG9uZ2VyIHRoYW4gYW55IFRTU0xTb2NrZXQgdGhhdCBpdCBjcmVhdGVzLCBvdGhlcndpc2Ugb3BlbnNzbCB3aWxsIGJlIGNsZWFuZWQKK3VwIHRvbyBlYXJseS4gIElmIHRoZSBzdGF0aWMgYm9vbGVhbiBpcyBzZXQgdG8gZGlzYWJsZSBvcGVuc3NsIGluaXRpYWxpemF0aW9uIGFuZAorY2xlYW51cCBhbmQgbGVhdmUgaXQgdXAgdG8gdGhlIGNvbnN1bWluZyBhcHBsaWNhdGlvbiwgdGhpcyByZXF1aXJlbWVudCBpcyBub3QgbmVlZGVkLgorKFRIUklGVC00MTY0KQorCmRpZmYgLS1naXQgYS9saWIvY3BwL2NvZGluZ19zdGFuZGFyZHMubWQgYi9saWIvY3BwL2NvZGluZ19zdGFuZGFyZHMubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODAxOGM3NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvY29kaW5nX3N0YW5kYXJkcy5tZApAQCAtMCwwICsxLDQgQEAKK1BsZWFzZSBmb2xsb3cgW0dlbmVyYWwgQ29kaW5nIFN0YW5kYXJkc10oL2RvYy9jb2Rpbmdfc3RhbmRhcmRzLm1kKQorCisgKiBzZWUgLmNsYW5nLWZvcm1hdCBpbiByb290IGRpciBmb3Igc2V0dGluZ3Mgb2YgYWNjZXB0ZWQgZm9ybWF0CisgKiBjbGFuZy1mb3JtYXQgKDMuNSBvciBuZXdlcikgY2FuIGJlIHVzZWQgdG8gYXV0b21hdGljYWx5IHJlZm9ybWF0IGNvZGUgKCdtYWtlIHN0eWxlJyBjb21tYW5kKQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9saWJ0aHJpZnQudmN4cHJvaiBiL2xpYi9jcHAvbGlidGhyaWZ0LnZjeHByb2oKaW5kZXggMWZjMDhiOC4uZDEwOTdlYyAxMDA2NDQKLS0tIGEvbGliL2NwcC9saWJ0aHJpZnQudmN4cHJvagorKysgYi9saWIvY3BwL2xpYnRocmlmdC52Y3hwcm9qCkBAIC0xLDQgKzEsNCBAQAot77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+CiA8UHJvamVjdCBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIFRvb2xzVmVyc2lvbj0iNC4wIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KICAgPEl0ZW1Hcm91cCBMYWJlbD0iUHJvamVjdENvbmZpZ3VyYXRpb25zIj4KICAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iRGVidWctbXR8V2luMzIiPgpAQCAtMzYsNiArMzYsNyBAQAogICA8L0l0ZW1Hcm91cD4KICAgPEl0ZW1Hcm91cD4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcYXN5bmNcVEFzeW5jQ2hhbm5lbC5jcHAiLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcYXN5bmNcVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mby5jcHAiLz4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcY29uY3VycmVuY3lcQm9vc3RNb25pdG9yLmNwcCIgLz4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcY29uY3VycmVuY3lcQm9vc3RNdXRleC5jcHAiIC8+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGNvbmN1cnJlbmN5XEJvb3N0VGhyZWFkRmFjdG9yeS5jcHAiIC8+CkBAIC00NiwxNCArNDcsMTcgQEAKICAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRccHJvY2Vzc29yXFBlZWtQcm9jZXNzb3IuY3BwIi8+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHByb3RvY29sXFRCYXNlNjRVdGlscy5jcHAiIC8+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHByb3RvY29sXFREZWJ1Z1Byb3RvY29sLmNwcCIvPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwcm90b2NvbFxURGVuc2VQcm90b2NvbC5jcHAiLz4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRccHJvdG9jb2xcVEpTT05Qcm90b2NvbC5jcHAiLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRccHJvdG9jb2xcVFByb3RvY29sLmNwcCIvPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwcm90b2NvbFxUTXVsdGlwbGV4ZWRQcm90b2NvbC5jcHAiLz4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcc2VydmVyXFRTaW1wbGVTZXJ2ZXIuY3BwIi8+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHNlcnZlclxUVGhyZWFkUG9vbFNlcnZlci5jcHAiLz4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcc2VydmVyXFRUaHJlYWRlZFNlcnZlci5jcHAiLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcc2VydmVyXFRDb25uZWN0ZWRDbGllbnQuY3BwIi8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHNlcnZlclxUTm9uYmxvY2tpbmdTZXJ2ZXIuY3BwIi8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHNlcnZlclxUU2VydmVyRnJhbWV3b3JrLmNwcCIvPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxUQXBwbGljYXRpb25FeGNlcHRpb24uY3BwIi8+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XFRocmlmdC5jcHAiLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcVE91dHB1dC5jcHAiLz4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRCdWZmZXJUcmFuc3BvcnRzLmNwcCIvPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVEZEVHJhbnNwb3J0LmNwcCIgLz4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRIdHRwQ2xpZW50LmNwcCIgLz4KQEAgLTc2LDYgKzgwLDcgQEAKICAgPC9JdGVtR3JvdXA+CiAgIDxJdGVtR3JvdXA+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGFzeW5jXFRBc3luY0NoYW5uZWwuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcYXN5bmNcVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mby5oIiAvPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxjb25jdXJyZW5jeVxCb29zdFRocmVhZEZhY3RvcnkuaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcY29uY3VycmVuY3lcU3RkVGhyZWFkRmFjdG9yeS5oIiAvPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxjb25jdXJyZW5jeVxFeGNlcHRpb24uaCIgLz4KQEAgLTg0LDcgKzg5LDYgQEAKICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccHJvY2Vzc29yXFRNdWx0aXBsZXhlZFByb2Nlc3Nvci5oIiAvPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwcm90b2NvbFxUQmluYXJ5UHJvdG9jb2wuaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccHJvdG9jb2xcVERlYnVnUHJvdG9jb2wuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccHJvdG9jb2xcVERlbnNlUHJvdG9jb2wuaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccHJvdG9jb2xcVEpTT05Qcm90b2NvbC5oIiAvPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwcm90b2NvbFxUTXVsdGlwbGV4ZWRQcm90b2NvbC5oIiAvPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwcm90b2NvbFxUUHJvdG9jb2wuaCIgLz4KQEAgLTk1LDYgKzk5LDcgQEAKICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcc2VydmVyXFRUaHJlYWRlZFNlcnZlci5oIiAvPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxUQXBwbGljYXRpb25FeGNlcHRpb24uaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcVGhyaWZ0LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XFRPdXRwdXQuaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcVFByb2Nlc3Nvci5oIiAvPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVEJ1ZmZlclRyYW5zcG9ydHMuaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRGRFRyYW5zcG9ydC5oIiAvPgpkaWZmIC0tZ2l0IGEvbGliL2NwcC9saWJ0aHJpZnQudmN4cHJvai5maWx0ZXJzIGIvbGliL2NwcC9saWJ0aHJpZnQudmN4cHJvai5maWx0ZXJzCmluZGV4IGMzODUxNmIuLjVmNjRmNzggMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvbGlidGhyaWZ0LnZjeHByb2ouZmlsdGVycworKysgYi9saWIvY3BwL2xpYnRocmlmdC52Y3hwcm9qLmZpbHRlcnMKQEAgLTQsNyArNCw3IEBACiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUQnVmZmVyVHJhbnNwb3J0cy5jcHAiPgogICAgICAgPEZpbHRlcj50cmFuc3BvcnQ8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcVGhyaWZ0LmNwcCIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcVE91dHB1dC5jcHAiIC8+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5jcHAiIC8+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHdpbmRvd3NcU3RkQWZ4LmNwcCI+CiAgICAgICA8RmlsdGVyPndpbmRvd3M8L0ZpbHRlcj4KQEAgLTI1LDE5ICsyNSwxNiBAQAogICAgICAgPEZpbHRlcj5jb25jdXJyZW5jeTwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwcm90b2NvbFxURGVidWdQcm90b2NvbC5jcHAiPgotICAgICAgPEZpbHRlcj5wcm90b2NhbDwvRmlsdGVyPgotICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwcm90b2NvbFxURGVuc2VQcm90b2NvbC5jcHAiPgotICAgICAgPEZpbHRlcj5wcm90b2NhbDwvRmlsdGVyPgorICAgICAgPEZpbHRlcj5wcm90b2NvbDwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwcm90b2NvbFxUQmFzZTY0VXRpbHMuY3BwIj4KLSAgICAgIDxGaWx0ZXI+cHJvdG9jYWw8L0ZpbHRlcj4KKyAgICAgIDxGaWx0ZXI+cHJvdG9jb2w8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRccHJvdG9jb2xcVEpTT05Qcm90b2NvbC5jcHAiPgotICAgICAgPEZpbHRlcj5wcm90b2NhbDwvRmlsdGVyPgorICAgICAgPEZpbHRlcj5wcm90b2NvbDwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwcm90b2NvbFxUTXVsdGlwbGV4ZWRQcm90b2NvbC5jcHAiPgotICAgICAgPEZpbHRlcj5wcm90b2NhbDwvRmlsdGVyPgorICAgICAgPEZpbHRlcj5wcm90b2NvbDwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVEZEVHJhbnNwb3J0LmNwcCI+CiAgICAgICA8RmlsdGVyPnRyYW5zcG9ydDwvRmlsdGVyPgpAQCAtNzUsNiArNzIsOSBAQAogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxhc3luY1xUQXN5bmNDaGFubmVsLmNwcCI+CiAgICAgICA8RmlsdGVyPmFzeW5jPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGFzeW5jXFRDb25jdXJyZW50Q2xpZW50U3luY0luZm8uY3BwIj4KKyAgICAgIDxGaWx0ZXI+YXN5bmM8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRccHJvY2Vzc29yXFBlZWtQcm9jZXNzb3IuY3BwIj4KICAgICAgIDxGaWx0ZXI+cHJvY2Vzc29yPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+CkBAIC0xMjAsNyArMTIwLDcgQEAKICAgICAgIDxGaWx0ZXI+dHJhbnNwb3J0PC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHByb3RvY29sXFRCaW5hcnlQcm90b2NvbC5oIj4KLSAgICAgIDxGaWx0ZXI+cHJvdG9jYWw8L0ZpbHRlcj4KKyAgICAgIDxGaWx0ZXI+cHJvdG9jb2w8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcVGhyaWZ0LmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XFRQcm9jZXNzb3IuaCIgLz4KQEAgLTE1MywxMCArMTUzLDEwIEBACiAgICAgICA8RmlsdGVyPndpbmRvd3M8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccHJvdG9jb2xcVFByb3RvY29sLmgiPgotICAgICAgPEZpbHRlcj5wcm90b2NhbDwvRmlsdGVyPgorICAgICAgPEZpbHRlcj5wcm90b2NvbDwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwcm90b2NvbFxUVmlydHVhbFByb3RvY29sLmgiPgotICAgICAgPEZpbHRlcj5wcm90b2NhbDwvRmlsdGVyPgorICAgICAgPEZpbHRlcj5wcm90b2NvbDwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxzZXJ2ZXJcVFNlcnZlci5oIj4KICAgICAgIDxGaWx0ZXI+c2VydmVyPC9GaWx0ZXI+CkBAIC0xNzMsNiArMTczLDkgQEAKICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcYXN5bmNcVEFzeW5jQ2hhbm5lbC5oIj4KICAgICAgIDxGaWx0ZXI+YXN5bmM8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcYXN5bmNcVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mby5oIj4KKyAgICAgIDxGaWx0ZXI+YXN5bmM8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccHJvY2Vzc29yXFBlZWtQcm9jZXNzb3IuaCI+CiAgICAgICA8RmlsdGVyPnByb2Nlc3NvcjwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgpAQCAtMjAxLDE2ICsyMDQsMTMgQEAKICAgICAgIDxGaWx0ZXI+dHJhbnNwb3J0PC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHByb3RvY29sXFRKU09OUHJvdG9jb2wuaCI+Ci0gICAgICA8RmlsdGVyPnByb3RvY2FsPC9GaWx0ZXI+CisgICAgICA8RmlsdGVyPnByb3RvY29sPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHByb3RvY29sXFRNdWx0aXBsZXhlZFByb3RvY29sLmgiPgotICAgICAgPEZpbHRlcj5wcm90b2NhbDwvRmlsdGVyPgotICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwcm90b2NvbFxURGVuc2VQcm90b2NvbC5oIj4KLSAgICAgIDxGaWx0ZXI+cHJvdG9jYWw8L0ZpbHRlcj4KKyAgICAgIDxGaWx0ZXI+cHJvdG9jb2w8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccHJvdG9jb2xcVERlYnVnUHJvdG9jb2wuaCI+Ci0gICAgICA8RmlsdGVyPnByb3RvY2FsPC9GaWx0ZXI+CisgICAgICA8RmlsdGVyPnByb3RvY29sPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUU2VydmVyU29ja2V0LmgiPgogICAgICAgPEZpbHRlcj50cmFuc3BvcnQ8L0ZpbHRlcj4KQEAgLTI0Nyw3ICsyNDcsNyBAQAogICAgIDwvQ2xJbmNsdWRlPgogICA8L0l0ZW1Hcm91cD4KICAgPEl0ZW1Hcm91cD4KLSAgICA8RmlsdGVyIEluY2x1ZGU9InByb3RvY2FsIj4KKyAgICA8RmlsdGVyIEluY2x1ZGU9InByb3RvY29sIj4KICAgICAgIDxVbmlxdWVJZGVudGlmaWVyPnswN2NlZDE5Yi1iNzJhLTQxMDUtOWZmYi02ZDJiY2Y2NDQ5N2V9PC9VbmlxdWVJZGVudGlmaWVyPgogICAgIDwvRmlsdGVyPgogICAgIDxGaWx0ZXIgSW5jbHVkZT0idHJhbnNwb3J0Ij4KQEAgLTI3NCwxMCArMjc0LDEwIEBACiAgIDwvSXRlbUdyb3VwPgogICA8SXRlbUdyb3VwPgogICAgIDxOb25lIEluY2x1ZGU9InNyY1x0aHJpZnRccHJvdG9jb2xcVEJpbmFyeVByb3RvY29sLnRjYyI+Ci0gICAgICA8RmlsdGVyPnByb3RvY2FsPC9GaWx0ZXI+CisgICAgICA8RmlsdGVyPnByb3RvY29sPC9GaWx0ZXI+CiAgICAgPC9Ob25lPgogICAgIDxOb25lIEluY2x1ZGU9InNyY1x0aHJpZnRcd2luZG93c1x0cjFcZnVuY3Rpb25hbCI+CiAgICAgICA8RmlsdGVyPndpbmRvd3NcdHIxPC9GaWx0ZXI+CiAgICAgPC9Ob25lPgogICA8L0l0ZW1Hcm91cD4KLTwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCis8L1Byb2plY3Q+CmRpZmYgLS1naXQgYS9saWIvY3BwL2xpYnRocmlmdG5iLnZjeHByb2ogYi9saWIvY3BwL2xpYnRocmlmdG5iLnZjeHByb2oKaW5kZXggMjU5YmIyMC4uOWE2ZmZlNiAxMDA3NTUKLS0tIGEvbGliL2NwcC9saWJ0aHJpZnRuYi52Y3hwcm9qCisrKyBiL2xpYi9jcHAvbGlidGhyaWZ0bmIudmN4cHJvagpAQCAtMzUsMTYgKzM1LDIxIEBACiAgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4KICAgPC9JdGVtR3JvdXA+CiAgIDxJdGVtR3JvdXA+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGFzeW5jXFRBc3luY1Byb3RvY29sUHJvY2Vzc29yLmNwcCIvPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxhc3luY1xURXZodHRwQ2xpZW50Q2hhbm5lbC5jcHAiLz4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcYXN5bmNcVEV2aHR0cFNlcnZlci5jcHAiLz4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcc2VydmVyXFROb25ibG9ja2luZ1NlcnZlci5jcHAiLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcYXN5bmNcVEFzeW5jUHJvdG9jb2xQcm9jZXNzb3IuY3BwIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxhc3luY1xURXZodHRwQ2xpZW50Q2hhbm5lbC5jcHAiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGFzeW5jXFRFdmh0dHBTZXJ2ZXIuY3BwIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxzZXJ2ZXJcVE5vbmJsb2NraW5nU2VydmVyLmNwcCIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFROb25ibG9ja2luZ1NlcnZlclNvY2tldC5jcHAiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQuY3BwIiAvPgogICA8L0l0ZW1Hcm91cD4KICAgPEl0ZW1Hcm91cD4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcYXN5bmNcVEFzeW5jUHJvdG9jb2xQcm9jZXNzb3IuaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcYXN5bmNcVEV2aHR0cENsaWVudENoYW5uZWwuaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcYXN5bmNcVEV2aHR0cFNlcnZlci5oIiAvPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxzZXJ2ZXJcVE5vbmJsb2NraW5nU2VydmVyLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVE5vbmJsb2NraW5nU1NMU2VydmVyU29ja2V0LmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHdpbmRvd3NcY29uZmlnLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHdpbmRvd3NcZm9yY2VfaW5jLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHdpbmRvd3NcVGFyZ2V0VmVyc2lvbi5oIiAvPgpAQCAtMjkwLDQgKzI5NSw0IEBACiAgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLnRhcmdldHMiIC8+CiAgIDxJbXBvcnRHcm91cCBMYWJlbD0iRXh0ZW5zaW9uVGFyZ2V0cyI+CiAgIDwvSW1wb3J0R3JvdXA+Ci08L1Byb2plY3Q+Cis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9saWJ0aHJpZnRuYi52Y3hwcm9qLmZpbHRlcnMgYi9saWIvY3BwL2xpYnRocmlmdG5iLnZjeHByb2ouZmlsdGVycwppbmRleCA1MjQ1NTQ0Li44NTcwM2RkIDEwMDY0NAotLS0gYS9saWIvY3BwL2xpYnRocmlmdG5iLnZjeHByb2ouZmlsdGVycworKysgYi9saWIvY3BwL2xpYnRocmlmdG5iLnZjeHByb2ouZmlsdGVycwpAQCAtMTAsNiArMTAsOSBAQAogICAgIDxGaWx0ZXIgSW5jbHVkZT0id2luZG93cyI+CiAgICAgICA8VW5pcXVlSWRlbnRpZmllcj57NjBmYzllNWUtMDg2Ni00YWJhLTg2NjItNDM5YmI0YTQ2MWQzfTwvVW5pcXVlSWRlbnRpZmllcj4KICAgICA8L0ZpbHRlcj4KKyAgICA8RmlsdGVyIEluY2x1ZGU9InRyYW5zcG9ydCI+CisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57MjNmZTJmZGUtYTdjOS00M2VjLWE0MDktN2Y1M2RmNWVlZTY0fTwvVW5pcXVlSWRlbnRpZmllcj4KKyAgICA8L0ZpbHRlcj4KICAgPC9JdGVtR3JvdXA+CiAgIDxJdGVtR3JvdXA+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHNlcnZlclxUTm9uYmxvY2tpbmdTZXJ2ZXIuY3BwIj4KQEAgLTI3LDYgKzMwLDEyIEBACiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHdpbmRvd3NcU3RkQWZ4LmNwcCI+CiAgICAgICA8RmlsdGVyPndpbmRvd3M8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFROb25ibG9ja2luZ1NlcnZlclNvY2tldC5jcHAiPgorICAgICAgPEZpbHRlcj50cmFuc3BvcnQ8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFROb25ibG9ja2luZ1NTTFNlcnZlclNvY2tldC5jcHAiPgorICAgICAgPEZpbHRlcj50cmFuc3BvcnQ8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KICAgPC9JdGVtR3JvdXA+CiAgIDxJdGVtR3JvdXA+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHNlcnZlclxUTm9uYmxvY2tpbmdTZXJ2ZXIuaCI+CkBAIC01Myw1ICs2MiwxNCBAQAogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx3aW5kb3dzXGZvcmNlX2luYy5oIj4KICAgICAgIDxGaWx0ZXI+d2luZG93czwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVE5vbmJsb2NraW5nU2VydmVyU29ja2V0LmgiPgorICAgICAgPEZpbHRlcj50cmFuc3BvcnQ8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydC5oIj4KKyAgICAgIDxGaWx0ZXI+dHJhbnNwb3J0PC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQuaCI+CisgICAgICA8RmlsdGVyPnRyYW5zcG9ydDwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgogICA8L0l0ZW1Hcm91cD4KLTwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCis8L1Byb2plY3Q+CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9UQXBwbGljYXRpb25FeGNlcHRpb24uY3BwCmluZGV4IDExMTBiYTIuLjJmMTQ2NTMgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9UQXBwbGljYXRpb25FeGNlcHRpb24uY3BwCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9UQXBwbGljYXRpb25FeGNlcHRpb24uY3BwCkBAIC0yMCw3ICsyMCw4IEBACiAjaW5jbHVkZSA8dGhyaWZ0L1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5oPgogI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuaD4KIAotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKIAogdWludDMyX3QgVEFwcGxpY2F0aW9uRXhjZXB0aW9uOjpyZWFkKGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBpcHJvdCkgewogICB1aW50MzJfdCB4ZmVyID0gMDsKQEAgLTc2LDUgKzc3LDUgQEAKICAgeGZlciArPSBvcHJvdC0+d3JpdGVTdHJ1Y3RFbmQoKTsKICAgcmV0dXJuIHhmZXI7CiB9Ci0KLX19IC8vIGFwYWNoZTo6dGhyaWZ0Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmggYi9saWIvY3BwL3NyYy90aHJpZnQvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmgKaW5kZXggZDMyYTIxZC4uNjA2MThmYiAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9UQXBwbGljYXRpb25FeGNlcHRpb24uaApAQCAtMjIsMTYgKzIyLDE1IEBACiAKICNpbmNsdWRlIDx0aHJpZnQvVGhyaWZ0Lmg+CiAKLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKIAogbmFtZXNwYWNlIHByb3RvY29sIHsKLSAgY2xhc3MgVFByb3RvY29sOworY2xhc3MgVFByb3RvY29sOwogfQogCiBjbGFzcyBUQXBwbGljYXRpb25FeGNlcHRpb24gOiBwdWJsaWMgVEV4Y2VwdGlvbiB7Ci0gcHVibGljOgotCitwdWJsaWM6CiAgIC8qKgogICAgKiBFcnJvciBjb2RlcyBmb3IgdGhlIHZhcmlvdXMgdHlwZXMgb2YgZXhjZXB0aW9ucy4KICAgICovCkBAIC00OSwyNCArNDgsMTYgQEAKICAgICBVTlNVUFBPUlRFRF9DTElFTlRfVFlQRSA9IDEwCiAgIH07CiAKLSAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKCkgOgotICAgIFRFeGNlcHRpb24oKSwKLSAgICB0eXBlXyhVTktOT1dOKSB7fQorICBUQXBwbGljYXRpb25FeGNlcHRpb24oKSA6IFRFeGNlcHRpb24oKSwgdHlwZV8oVU5LTk9XTikge30KIAotICBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uVHlwZSB0eXBlKSA6Ci0gICAgVEV4Y2VwdGlvbigpLAotICAgIHR5cGVfKHR5cGUpIHt9CisgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb25UeXBlIHR5cGUpIDogVEV4Y2VwdGlvbigpLCB0eXBlXyh0eXBlKSB7fQogCi0gIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkgOgotICAgIFRFeGNlcHRpb24obWVzc2FnZSksCi0gICAgdHlwZV8oVU5LTk9XTikge30KKyAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSA6IFRFeGNlcHRpb24obWVzc2FnZSksIHR5cGVfKFVOS05PV04pIHt9CiAKLSAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvblR5cGUgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSA6Ci0gICAgVEV4Y2VwdGlvbihtZXNzYWdlKSwKLSAgICB0eXBlXyh0eXBlKSB7fQorICBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uVHlwZSB0eXBlLCBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkKKyAgICA6IFRFeGNlcHRpb24obWVzc2FnZSksIHR5cGVfKHR5cGUpIHt9CiAKLSAgdmlydHVhbCB+VEFwcGxpY2F0aW9uRXhjZXB0aW9uKCkgdGhyb3coKSB7fQorICB2aXJ0dWFsIH5UQXBwbGljYXRpb25FeGNlcHRpb24oKSBub2V4Y2VwdCB7fQogCiAgIC8qKgogICAgKiBSZXR1cm5zIGFuIGVycm9yIGNvZGUgdGhhdCBwcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdHlwZSBvZiBlcnJvcgpAQCAtNzQsMjUgKzY1LDM1IEBACiAgICAqCiAgICAqIEByZXR1cm4gRXJyb3IgY29kZQogICAgKi8KLSAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uVHlwZSBnZXRUeXBlKCkgewotICAgIHJldHVybiB0eXBlXzsKLSAgfQorICBUQXBwbGljYXRpb25FeGNlcHRpb25UeXBlIGdldFR5cGUoKSBjb25zdCB7IHJldHVybiB0eXBlXzsgfQogCi0gIHZpcnR1YWwgY29uc3QgY2hhciogd2hhdCgpIGNvbnN0IHRocm93KCkgeworICB2aXJ0dWFsIGNvbnN0IGNoYXIqIHdoYXQoKSBjb25zdCBub2V4Y2VwdCB7CiAgICAgaWYgKG1lc3NhZ2VfLmVtcHR5KCkpIHsKICAgICAgIHN3aXRjaCAodHlwZV8pIHsKLSAgICAgICAgY2FzZSBVTktOT1dOICAgICAgICAgICAgICAgICA6IHJldHVybiAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uOiBVbmtub3duIGFwcGxpY2F0aW9uIGV4Y2VwdGlvbiI7Ci0gICAgICAgIGNhc2UgVU5LTk9XTl9NRVRIT0QgICAgICAgICAgOiByZXR1cm4gIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjogVW5rbm93biBtZXRob2QiOwotICAgICAgICBjYXNlIElOVkFMSURfTUVTU0FHRV9UWVBFICAgIDogcmV0dXJuICJUQXBwbGljYXRpb25FeGNlcHRpb246IEludmFsaWQgbWVzc2FnZSB0eXBlIjsKLSAgICAgICAgY2FzZSBXUk9OR19NRVRIT0RfTkFNRSAgICAgICA6IHJldHVybiAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uOiBXcm9uZyBtZXRob2QgbmFtZSI7Ci0gICAgICAgIGNhc2UgQkFEX1NFUVVFTkNFX0lEICAgICAgICAgOiByZXR1cm4gIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjogQmFkIHNlcXVlbmNlIGlkZW50aWZpZXIiOwotICAgICAgICBjYXNlIE1JU1NJTkdfUkVTVUxUICAgICAgICAgIDogcmV0dXJuICJUQXBwbGljYXRpb25FeGNlcHRpb246IE1pc3NpbmcgcmVzdWx0IjsKLSAgICAgICAgY2FzZSBJTlRFUk5BTF9FUlJPUiAgICAgICAgICA6IHJldHVybiAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uOiBJbnRlcm5hbCBlcnJvciI7Ci0gICAgICAgIGNhc2UgUFJPVE9DT0xfRVJST1IgICAgICAgICAgOiByZXR1cm4gIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjogUHJvdG9jb2wgZXJyb3IiOwotICAgICAgICBjYXNlIElOVkFMSURfVFJBTlNGT1JNICAgICAgIDogcmV0dXJuICJUQXBwbGljYXRpb25FeGNlcHRpb246IEludmFsaWQgdHJhbnNmb3JtIjsKLSAgICAgICAgY2FzZSBJTlZBTElEX1BST1RPQ09MICAgICAgICA6IHJldHVybiAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uOiBJbnZhbGlkIHByb3RvY29sIjsKLSAgICAgICAgY2FzZSBVTlNVUFBPUlRFRF9DTElFTlRfVFlQRSA6IHJldHVybiAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uOiBVbnN1cHBvcnRlZCBjbGllbnQgdHlwZSI7Ci0gICAgICAgIGRlZmF1bHQgICAgICAgICAgICAgICAgICAgICAgOiByZXR1cm4gIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjogKEludmFsaWQgZXhjZXB0aW9uIHR5cGUpIjsKKyAgICAgIGNhc2UgVU5LTk9XTjoKKyAgICAgICAgcmV0dXJuICJUQXBwbGljYXRpb25FeGNlcHRpb246IFVua25vd24gYXBwbGljYXRpb24gZXhjZXB0aW9uIjsKKyAgICAgIGNhc2UgVU5LTk9XTl9NRVRIT0Q6CisgICAgICAgIHJldHVybiAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uOiBVbmtub3duIG1ldGhvZCI7CisgICAgICBjYXNlIElOVkFMSURfTUVTU0FHRV9UWVBFOgorICAgICAgICByZXR1cm4gIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjogSW52YWxpZCBtZXNzYWdlIHR5cGUiOworICAgICAgY2FzZSBXUk9OR19NRVRIT0RfTkFNRToKKyAgICAgICAgcmV0dXJuICJUQXBwbGljYXRpb25FeGNlcHRpb246IFdyb25nIG1ldGhvZCBuYW1lIjsKKyAgICAgIGNhc2UgQkFEX1NFUVVFTkNFX0lEOgorICAgICAgICByZXR1cm4gIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjogQmFkIHNlcXVlbmNlIGlkZW50aWZpZXIiOworICAgICAgY2FzZSBNSVNTSU5HX1JFU1VMVDoKKyAgICAgICAgcmV0dXJuICJUQXBwbGljYXRpb25FeGNlcHRpb246IE1pc3NpbmcgcmVzdWx0IjsKKyAgICAgIGNhc2UgSU5URVJOQUxfRVJST1I6CisgICAgICAgIHJldHVybiAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uOiBJbnRlcm5hbCBlcnJvciI7CisgICAgICBjYXNlIFBST1RPQ09MX0VSUk9SOgorICAgICAgICByZXR1cm4gIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjogUHJvdG9jb2wgZXJyb3IiOworICAgICAgY2FzZSBJTlZBTElEX1RSQU5TRk9STToKKyAgICAgICAgcmV0dXJuICJUQXBwbGljYXRpb25FeGNlcHRpb246IEludmFsaWQgdHJhbnNmb3JtIjsKKyAgICAgIGNhc2UgSU5WQUxJRF9QUk9UT0NPTDoKKyAgICAgICAgcmV0dXJuICJUQXBwbGljYXRpb25FeGNlcHRpb246IEludmFsaWQgcHJvdG9jb2wiOworICAgICAgY2FzZSBVTlNVUFBPUlRFRF9DTElFTlRfVFlQRToKKyAgICAgICAgcmV0dXJuICJUQXBwbGljYXRpb25FeGNlcHRpb246IFVuc3VwcG9ydGVkIGNsaWVudCB0eXBlIjsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uOiAoSW52YWxpZCBleGNlcHRpb24gdHlwZSkiOwogICAgICAgfTsKICAgICB9IGVsc2UgewogICAgICAgcmV0dXJuIG1lc3NhZ2VfLmNfc3RyKCk7CkBAIC0xMDIsMTQgKzEwMywxMyBAQAogICB1aW50MzJfdCByZWFkKHByb3RvY29sOjpUUHJvdG9jb2wqIGlwcm90KTsKICAgdWludDMyX3Qgd3JpdGUocHJvdG9jb2w6OlRQcm90b2NvbCogb3Byb3QpIGNvbnN0OwogCi0gcHJvdGVjdGVkOgorcHJvdGVjdGVkOgogICAvKioKICAgICogRXJyb3IgY29kZQogICAgKi8KICAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uVHlwZSB0eXBlXzsKLQogfTsKLQotfX0gLy8gYXBhY2hlOjp0aHJpZnQKK30KK30gLy8gYXBhY2hlOjp0aHJpZnQKIAogI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UQVBQTElDQVRJT05FWENFUFRJT05fSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9UQmFzZS5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L1RCYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI3NGJjZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9UQmFzZS5oCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1RCQVNFX0hfCisjZGVmaW5lIF9USFJJRlRfVEJBU0VfSF8gMQorCisjaW5jbHVkZSA8dGhyaWZ0L1RocmlmdC5oPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKKworY2xhc3MgVEJhc2UgeworcHVibGljOgorICB2aXJ0dWFsIH5UQmFzZSgpe307CisgIHZpcnR1YWwgdWludDMyX3QgcmVhZChwcm90b2NvbDo6VFByb3RvY29sKiBpcHJvdCkgPSAwOworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlKHByb3RvY29sOjpUUHJvdG9jb2wqIG9wcm90KSBjb25zdCA9IDA7Cit9OworfQorfSAvLyBhcGFjaGU6OnRocmlmdAorCisjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RCQVNFX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvVERpc3BhdGNoUHJvY2Vzc29yLmggYi9saWIvY3BwL3NyYy90aHJpZnQvVERpc3BhdGNoUHJvY2Vzc29yLmgKaW5kZXggMzNlYzIyZS4uMjhkMzQ3ZCAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L1REaXNwYXRjaFByb2Nlc3Nvci5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9URGlzcGF0Y2hQcm9jZXNzb3IuaApAQCAtMjEsNyArMjEsOCBAQAogCiAjaW5jbHVkZSA8dGhyaWZ0L1RQcm9jZXNzb3IuaD4KIAotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKIAogLyoqCiAgKiBURGlzcGF0Y2hQcm9jZXNzb3IgaXMgYSBoZWxwZXIgY2xhc3MgdG8gcGFyc2UgdGhlIG1lc3NhZ2UgaGVhZGVyIHRoZW4gY2FsbApAQCAtMzEsOSArMzIsOSBAQAogICovCiB0ZW1wbGF0ZSA8Y2xhc3MgUHJvdG9jb2xfPgogY2xhc3MgVERpc3BhdGNoUHJvY2Vzc29yVCA6IHB1YmxpYyBUUHJvY2Vzc29yIHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgYm9vbCBwcm9jZXNzKGJvb3N0OjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IGluLAotICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBvdXQsCitwdWJsaWM6CisgIHZpcnR1YWwgYm9vbCBwcm9jZXNzKHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogY29ubmVjdGlvbkNvbnRleHQpIHsKICAgICBwcm90b2NvbDo6VFByb3RvY29sKiBpblJhdyA9IGluLmdldCgpOwogICAgIHByb3RvY29sOjpUUHJvdG9jb2wqIG91dFJhdyA9IG91dC5nZXQoKTsKQEAgLTYwLDE1ICs2MSwxNCBAQAogICAgIC8vIChUaGUgb2xkIGdlbmVyYXRlZCBwcm9jZXNzb3IgY29kZSB1c2VkIHRvIHRyeSB0byBza2lwIGEgVF9TVFJVQ1QgYW5kCiAgICAgLy8gY29udGludWUuICBIb3dldmVyLCB0aGF0IHNlZW1zIHVuc2FmZS4pCiAgICAgaWYgKG10eXBlICE9IHByb3RvY29sOjpUX0NBTEwgJiYgbXR5cGUgIT0gcHJvdG9jb2w6OlRfT05FV0FZKSB7Ci0gICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJyZWNlaXZlZCBpbnZhbGlkIG1lc3NhZ2UgdHlwZSAlZCBmcm9tIGNsaWVudCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG10eXBlKTsKKyAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoInJlY2VpdmVkIGludmFsaWQgbWVzc2FnZSB0eXBlICVkIGZyb20gY2xpZW50IiwgbXR5cGUpOwogICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIHJldHVybiB0aGlzLT5kaXNwYXRjaENhbGwoaW5SYXcsIG91dFJhdywgZm5hbWUsIHNlcWlkLCBjb25uZWN0aW9uQ29udGV4dCk7CiAgIH0KIAotIHByb3RlY3RlZDoKK3Byb3RlY3RlZDoKICAgYm9vbCBwcm9jZXNzRmFzdChQcm90b2NvbF8qIGluLCBQcm90b2NvbF8qIG91dCwgdm9pZCogY29ubmVjdGlvbkNvbnRleHQpIHsKICAgICBzdGQ6OnN0cmluZyBmbmFtZTsKICAgICBwcm90b2NvbDo6VE1lc3NhZ2VUeXBlIG10eXBlOwpAQCAtNzYsMTMgKzc2LDExIEBACiAgICAgaW4tPnJlYWRNZXNzYWdlQmVnaW4oZm5hbWUsIG10eXBlLCBzZXFpZCk7CiAKICAgICBpZiAobXR5cGUgIT0gcHJvdG9jb2w6OlRfQ0FMTCAmJiBtdHlwZSAhPSBwcm90b2NvbDo6VF9PTkVXQVkpIHsKLSAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoInJlY2VpdmVkIGludmFsaWQgbWVzc2FnZSB0eXBlICVkIGZyb20gY2xpZW50IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbXR5cGUpOworICAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigicmVjZWl2ZWQgaW52YWxpZCBtZXNzYWdlIHR5cGUgJWQgZnJvbSBjbGllbnQiLCBtdHlwZSk7CiAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgcmV0dXJuIHRoaXMtPmRpc3BhdGNoQ2FsbFRlbXBsYXRlZChpbiwgb3V0LCBmbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcWlkLCBjb25uZWN0aW9uQ29udGV4dCk7CisgICAgcmV0dXJuIHRoaXMtPmRpc3BhdGNoQ2FsbFRlbXBsYXRlZChpbiwgb3V0LCBmbmFtZSwgc2VxaWQsIGNvbm5lY3Rpb25Db250ZXh0KTsKICAgfQogCiAgIC8qKgpAQCAtOTAsMTEgKzg4LDE0IEBACiAgICAqLwogICB2aXJ0dWFsIGJvb2wgZGlzcGF0Y2hDYWxsKGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBpbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCogb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmbmFtZSwgaW50MzJfdCBzZXFpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzZXFpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjYWxsQ29udGV4dCkgPSAwOwogCi0gIHZpcnR1YWwgYm9vbCBkaXNwYXRjaENhbGxUZW1wbGF0ZWQoUHJvdG9jb2xfKiBpbiwgUHJvdG9jb2xfKiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZuYW1lLCBpbnQzMl90IHNlcWlkLAorICB2aXJ0dWFsIGJvb2wgZGlzcGF0Y2hDYWxsVGVtcGxhdGVkKFByb3RvY29sXyogaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvdG9jb2xfKiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2VxaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogY2FsbENvbnRleHQpID0gMDsKIH07CiAKQEAgLTEwMyw5ICsxMDQsOSBAQAogICogcGVyZm9ybSBhIGR5bmFtaWNfY2FzdC4KICAqLwogY2xhc3MgVERpc3BhdGNoUHJvY2Vzc29yIDogcHVibGljIFRQcm9jZXNzb3IgewotIHB1YmxpYzoKLSAgdmlydHVhbCBib29sIHByb2Nlc3MoYm9vc3Q6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gaW4sCi0gICAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IG91dCwKK3B1YmxpYzoKKyAgdmlydHVhbCBib29sIHByb2Nlc3Moc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IGluLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gb3V0LAogICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjb25uZWN0aW9uQ29udGV4dCkgewogICAgIHN0ZDo6c3RyaW5nIGZuYW1lOwogICAgIHByb3RvY29sOjpUTWVzc2FnZVR5cGUgbXR5cGU7CkBAIC0xMTMsMzAgKzExNCwyOCBAQAogICAgIGluLT5yZWFkTWVzc2FnZUJlZ2luKGZuYW1lLCBtdHlwZSwgc2VxaWQpOwogCiAgICAgaWYgKG10eXBlICE9IHByb3RvY29sOjpUX0NBTEwgJiYgbXR5cGUgIT0gcHJvdG9jb2w6OlRfT05FV0FZKSB7Ci0gICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJyZWNlaXZlZCBpbnZhbGlkIG1lc3NhZ2UgdHlwZSAlZCBmcm9tIGNsaWVudCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG10eXBlKTsKKyAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoInJlY2VpdmVkIGludmFsaWQgbWVzc2FnZSB0eXBlICVkIGZyb20gY2xpZW50IiwgbXR5cGUpOwogICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIHJldHVybiBkaXNwYXRjaENhbGwoaW4uZ2V0KCksIG91dC5nZXQoKSwgZm5hbWUsIHNlcWlkLCBjb25uZWN0aW9uQ29udGV4dCk7CiAgIH0KIAotIHByb3RlY3RlZDoKK3Byb3RlY3RlZDoKICAgdmlydHVhbCBib29sIGRpc3BhdGNoQ2FsbChhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCogaW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZm5hbWUsIGludDMyX3Qgc2VxaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2VxaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogY2FsbENvbnRleHQpID0gMDsKIH07CiAKIC8vIFNwZWNpYWxpemUgVERpc3BhdGNoUHJvY2Vzc29yVCBmb3IgVFByb3RvY29sIGFuZCBURHVtbXlQcm90b2NvbCBqdXN0IHRvIHVzZQogLy8gdGhlIGdlbmVyaWMgVERpc3BhdGNoUHJvY2Vzc29yLgogdGVtcGxhdGUgPD4KLWNsYXNzIFREaXNwYXRjaFByb2Nlc3NvclQ8cHJvdG9jb2w6OlREdW1teVByb3RvY29sPiA6Ci0gIHB1YmxpYyBURGlzcGF0Y2hQcm9jZXNzb3Ige307CitjbGFzcyBURGlzcGF0Y2hQcm9jZXNzb3JUPHByb3RvY29sOjpURHVtbXlQcm90b2NvbD4gOiBwdWJsaWMgVERpc3BhdGNoUHJvY2Vzc29yIHt9OwogdGVtcGxhdGUgPD4KLWNsYXNzIFREaXNwYXRjaFByb2Nlc3NvclQ8cHJvdG9jb2w6OlRQcm90b2NvbD4gOgotICBwdWJsaWMgVERpc3BhdGNoUHJvY2Vzc29yIHt9OwotCi19fSAvLyBhcGFjaGU6OnRocmlmdAorY2xhc3MgVERpc3BhdGNoUHJvY2Vzc29yVDxwcm90b2NvbDo6VFByb3RvY29sPiA6IHB1YmxpYyBURGlzcGF0Y2hQcm9jZXNzb3Ige307Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0CiAKICNlbmRpZiAvLyBfVEhSSUZUX1RESVNQQVRDSFBST0NFU1NPUl9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L1RMb2dnaW5nLmggYi9saWIvY3BwL3NyYy90aHJpZnQvVExvZ2dpbmcuaAppbmRleCA0YzhiZGRjLi4wN2ZmMDMwIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvVExvZ2dpbmcuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvVExvZ2dpbmcuaApAQCAtMzksMTMgKzM5LDExIEBACiAgKi8KICNkZWZpbmUgVF9HTE9CQUxfREVCVUdHSU5HX0xFVkVMIDAKIAotCiAvKioKICAqIFRfR0xPQkFMX0xPR0dJTkdfTEVWRUwgPSAwOiBhbGwgbG9nZ2luZyB0dXJuZWQgb2ZmLCBsb2dnaW5nIG1hY3JvcyB1bmRlZmluZWQKICAqIFRfR0xPQkFMX0xPR0dJTkdfTEVWRUwgPSAxOiBhbGwgbG9nZ2luZyB0dXJuZWQgb24KICAqLwotI2RlZmluZSBUX0dMT0JBTF9MT0dHSU5HX0xFVkVMICAgMQotCisjZGVmaW5lIFRfR0xPQkFMX0xPR0dJTkdfTEVWRUwgMQogCiAvKioKICAqIFN0YW5kYXJkIHdyYXBwZXIgYXJvdW5kIGZwcmludGYgd2hhdCB3aWxsIHByZWZpeCB0aGUgZmlsZSBuYW1lIGFuZCBsaW5lCkBAIC01NSwxMDYgKzUzLDExNSBAQAogICogQHBhcmFtIGZvcm1hdF9zdHJpbmcKICAqLwogI2lmIFRfR0xPQkFMX0RFQlVHR0lOR19MRVZFTCA+IDAKLSAgI2RlZmluZSBUX0RFQlVHKGZvcm1hdF9zdHJpbmcsLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKFRfR0xPQkFMX0RFQlVHR0lOR19MRVZFTCA+IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgZnByaW50ZihzdGRlcnIsIlslcywlZF0gIiBmb3JtYXRfc3RyaW5nICIgXG4iLCBfX0ZJTEVfXywgX19MSU5FX18sIyNfX1ZBX0FSR1NfXyk7IFwKKyNkZWZpbmUgVF9ERUJVRyhmb3JtYXRfc3RyaW5nLCAuLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKFRfR0xPQkFMX0RFQlVHR0lOR19MRVZFTCA+IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlslcywlZF0gIiBmb3JtYXRfc3RyaW5nICIgXG4iLCBfX0ZJTEVfXywgX19MSU5FX18sICMjX19WQV9BUkdTX18pOyAgICAgICAgICAgIFwKICAgfQogI2Vsc2UKLSAgI2RlZmluZSBUX0RFQlVHKGZvcm1hdF9zdHJpbmcsLi4uKQorI2RlZmluZSBUX0RFQlVHKGZvcm1hdF9zdHJpbmcsIC4uLikKICNlbmRpZgogCi0KIC8qKgotICogYW5hbGFnb3VzIHRvIFRfREVCVUcgYnV0IGFsc28gcHJpbnRzIHRoZSB0aW1lCisgKiBhbmFsb2dvdXMgdG8gVF9ERUJVRyBidXQgYWxzbyBwcmludHMgdGhlIHRpbWUKICAqCiAgKiBAcGFyYW0gc3RyaW5nICBmb3JtYXRfc3RyaW5nIGlucHV0OiBwcmludGYgc3R5bGUgZm9ybWF0IHN0cmluZwogICovCiAjaWYgVF9HTE9CQUxfREVCVUdHSU5HX0xFVkVMID4gMAotICAjZGVmaW5lIFRfREVCVUdfVChmb3JtYXRfc3RyaW5nLC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGlmIChUX0dMT0JBTF9ERUJVR0dJTkdfTEVWRUwgPiAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB0aW1lX3Qgbm93OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGNoYXIgZGJndGltZVsyNl0gOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgdGltZSgmbm93KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBUSFJJRlRfQ1RJTUVfUigmbm93LCBkYmd0aW1lKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBkYmd0aW1lWzI0XSA9ICdcMCc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGZwcmludGYoc3RkZXJyLCJbJXMsJWRdIFslc10gIiBmb3JtYXRfc3RyaW5nICIgXG4iLCBfX0ZJTEVfXywgX19MSU5FX18sZGJndGltZSwjI19fVkFfQVJHU19fKTsgXAotICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfQorI2RlZmluZSBUX0RFQlVHX1QoZm9ybWF0X3N0cmluZywgLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChUX0dMT0JBTF9ERUJVR0dJTkdfTEVWRUwgPiAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdGltZV90IG5vdzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY2hhciBkYmd0aW1lWzI2XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdGltZSgmbm93KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgVEhSSUZUX0NUSU1FX1IoJm5vdywgZGJndGltZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgZGJndGltZVsyNF0gPSAnXDAnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgZnByaW50ZihzdGRlcnIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAiWyVzLCVkXSBbJXNdICIgZm9ybWF0X3N0cmluZyAiIFxuIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICBfX0ZJTEVfXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICBfX0xJTkVfXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICBkYmd0aW1lLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAjI19fVkFfQVJHU19fKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CiAjZWxzZQotICAjZGVmaW5lIFRfREVCVUdfVChmb3JtYXRfc3RyaW5nLC4uLikKKyNkZWZpbmUgVF9ERUJVR19UKGZvcm1hdF9zdHJpbmcsIC4uLikKICNlbmRpZgogCi0KIC8qKgotICogYW5hbGFnb3VzIHRvIFRfREVCVUcgYnV0IHVzZXMgaW5wdXQgbGV2ZWwgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IHRoZSBzdHJpbmcKKyAqIGFuYWxvZ291cyB0byBUX0RFQlVHIGJ1dCB1c2VzIGlucHV0IGxldmVsIHRvIGRldGVybWluZSB3aGV0aGVyIG9yIG5vdCB0aGUgc3RyaW5nCiAgKiBzaG91bGQgYmUgbG9nZ2VkLgogICoKICAqIEBwYXJhbSBpbnQgICAgIGxldmVsOiBzcGVjaWZpZWQgZGVidWcgbGV2ZWwKICAqIEBwYXJhbSBzdHJpbmcgIGZvcm1hdF9zdHJpbmcgaW5wdXQ6IGZvcm1hdCBzdHJpbmcKICAqLwotI2RlZmluZSBUX0RFQlVHX0wobGV2ZWwsIGZvcm1hdF9zdHJpbmcsLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGlmICgobGV2ZWwpID4gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBmcHJpbnRmKHN0ZGVyciwiWyVzLCVkXSAiIGZvcm1hdF9zdHJpbmcgIiBcbiIsIF9fRklMRV9fLCBfX0xJTkVfXywjI19fVkFfQVJHU19fKTsgXAorI2RlZmluZSBUX0RFQlVHX0wobGV2ZWwsIGZvcm1hdF9zdHJpbmcsIC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoKGxldmVsKSA+IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZwcmludGYoc3RkZXJyLCAiWyVzLCVkXSAiIGZvcm1hdF9zdHJpbmcgIiBcbiIsIF9fRklMRV9fLCBfX0xJTkVfXywgIyNfX1ZBX0FSR1NfXyk7ICAgICAgICAgICAgXAogICB9CiAKLQogLyoqCiAgKiBFeHBsaWNpdCBlcnJvciBsb2dnaW5nLiBQcmludHMgdGltZSwgZmlsZSBuYW1lIGFuZCBsaW5lIG51bWJlcgogICoKICAqIEBwYXJhbSBzdHJpbmcgIGZvcm1hdF9zdHJpbmcgaW5wdXQ6IHByaW50ZiBzdHlsZSBmb3JtYXQgc3RyaW5nCiAgKi8KLSNkZWZpbmUgVF9FUlJPUihmb3JtYXRfc3RyaW5nLC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB0aW1lX3Qgbm93OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjaGFyIGRiZ3RpbWVbMjZdIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB0aW1lKCZub3cpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBUSFJJRlRfQ1RJTUVfUigmbm93LCBkYmd0aW1lKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZGJndGltZVsyNF0gPSAnXDAnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZnByaW50ZihzdGRlcnIsIlslcywlZF0gWyVzXSBFUlJPUjogIiBmb3JtYXRfc3RyaW5nICIgXG4iLCBfX0ZJTEVfXywgX19MSU5FX18sZGJndGltZSwjI19fVkFfQVJHU19fKTsgXAorI2RlZmluZSBUX0VSUk9SKGZvcm1hdF9zdHJpbmcsIC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRpbWVfdCBub3c7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNoYXIgZGJndGltZVsyNl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRpbWUoJm5vdyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRIUklGVF9DVElNRV9SKCZub3csIGRiZ3RpbWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRiZ3RpbWVbMjRdID0gJ1wwJzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZwcmludGYoc3RkZXJyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgIlslcywlZF0gWyVzXSBFUlJPUjogIiBmb3JtYXRfc3RyaW5nICIgXG4iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgX19GSUxFX18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgX19MSU5FX18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZGJndGltZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgIyNfX1ZBX0FSR1NfXyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICB9CiAKLQogLyoqCi0gKiBBbmFsYWdvdXMgdG8gVF9FUlJPUiwgYWRkaXRpb25hbGx5IGFib3J0aW5nIHRoZSBwcm9jZXNzLgorICogQW5hbG9nb3VzIHRvIFRfRVJST1IsIGFkZGl0aW9uYWxseSBhYm9ydGluZyB0aGUgcHJvY2Vzcy4KICAqIFdBUk5JTkc6IG1hY3JvIGNhbGxzIGFib3J0KCksIGVuZGluZyBwcm9ncmFtIGV4ZWN1dGlvbgogICoKICAqIEBwYXJhbSBzdHJpbmcgIGZvcm1hdF9zdHJpbmcgaW5wdXQ6IHByaW50ZiBzdHlsZSBmb3JtYXQgc3RyaW5nCiAgKi8KLSNkZWZpbmUgVF9FUlJPUl9BQk9SVChmb3JtYXRfc3RyaW5nLC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB0aW1lX3Qgbm93OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjaGFyIGRiZ3RpbWVbMjZdIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB0aW1lKCZub3cpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBUSFJJRlRfQ1RJTUVfUigmbm93LCBkYmd0aW1lKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZGJndGltZVsyNF0gPSAnXDAnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZnByaW50ZihzdGRlcnIsIlslcywlZF0gWyVzXSBFUlJPUjogR29pbmcgdG8gYWJvcnQgIiBmb3JtYXRfc3RyaW5nICIgXG4iLCBfX0ZJTEVfXywgX19MSU5FX18sZGJndGltZSwjI19fVkFfQVJHU19fKTsgXAotICAgIGV4aXQoMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorI2RlZmluZSBUX0VSUk9SX0FCT1JUKGZvcm1hdF9zdHJpbmcsIC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRpbWVfdCBub3c7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNoYXIgZGJndGltZVsyNl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRpbWUoJm5vdyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRIUklGVF9DVElNRV9SKCZub3csIGRiZ3RpbWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRiZ3RpbWVbMjRdID0gJ1wwJzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZwcmludGYoc3RkZXJyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgIlslcywlZF0gWyVzXSBFUlJPUjogR29pbmcgdG8gYWJvcnQgIiBmb3JtYXRfc3RyaW5nICIgXG4iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgX19GSUxFX18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgX19MSU5FX18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZGJndGltZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgIyNfX1ZBX0FSR1NfXyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGV4aXQoMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICB9CiAKLQogLyoqCiAgKiBMb2cgaW5wdXQgbWVzc2FnZQogICoKICAqIEBwYXJhbSBzdHJpbmcgIGZvcm1hdF9zdHJpbmcgaW5wdXQ6IHByaW50ZiBzdHlsZSBmb3JtYXQgc3RyaW5nCiAgKi8KICNpZiBUX0dMT0JBTF9MT0dHSU5HX0xFVkVMID4gMAotICAjZGVmaW5lIFRfTE9HX09QRVIoZm9ybWF0X3N0cmluZywuLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgaWYgKFRfR0xPQkFMX0xPR0dJTkdfTEVWRUwgPiAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB0aW1lX3Qgbm93OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBjaGFyIGRiZ3RpbWVbMjZdIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB0aW1lKCZub3cpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBUSFJJRlRfQ1RJTUVfUigmbm93LCBkYmd0aW1lKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgZGJndGltZVsyNF0gPSAnXDAnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgZnByaW50ZihzdGRlcnIsIlslc10gIiBmb3JtYXRfc3RyaW5nICIgXG4iLCBkYmd0aW1lLCMjX19WQV9BUkdTX18pOyAgXAotICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0KKyNkZWZpbmUgVF9MT0dfT1BFUihmb3JtYXRfc3RyaW5nLCAuLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoVF9HTE9CQUxfTE9HR0lOR19MRVZFTCA+IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHRpbWVfdCBub3c7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNoYXIgZGJndGltZVsyNl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHRpbWUoJm5vdyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIFRIUklGVF9DVElNRV9SKCZub3csIGRiZ3RpbWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGRiZ3RpbWVbMjRdID0gJ1wwJzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiWyVzXSAiIGZvcm1hdF9zdHJpbmcgIiBcbiIsIGRiZ3RpbWUsICMjX19WQV9BUkdTX18pOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQogI2Vsc2UKLSAgI2RlZmluZSBUX0xPR19PUEVSKGZvcm1hdF9zdHJpbmcsLi4uKQorI2RlZmluZSBUX0xPR19PUEVSKGZvcm1hdF9zdHJpbmcsIC4uLikKICNlbmRpZgogCi0KIC8qKgogICogVF9HTE9CQUxfREVCVUdfVklSVFVBTCA9IDAgb3IgdW5zZXQ6IG5vcm1hbCBvcGVyYXRpb24sCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlydHVhbCBjYWxsIGRlYnVnIG1lc3NhZ2VzIGRpc2FibGVkCkBAIC0xNjUsMjkgKzE3MiwyNCBAQAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwYWNoZTo6dGhyaWZ0Ojpwcm9maWxlX3ByaW50X2luZm8oKQogICovCiAjaWYgVF9HTE9CQUxfREVCVUdfVklSVFVBTCA+IDEKLSAgI2RlZmluZSBUX1ZJUlRVQUxfQ0FMTCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIDo6YXBhY2hlOjp0aHJpZnQ6OnByb2ZpbGVfdmlydHVhbF9jYWxsKHR5cGVpZCgqdGhpcykpCi0gICNkZWZpbmUgVF9HRU5FUklDX1BST1RPQ09MKHRlbXBsYXRlX2NsYXNzLCBnZW5lcmljX3Byb3QsIHNwZWNpZmljX3Byb3QpIFwKLSAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgaWYgKCEoc3BlY2lmaWNfcHJvdCkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIDo6YXBhY2hlOjp0aHJpZnQ6OnByb2ZpbGVfZ2VuZXJpY19wcm90b2NvbCggICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICB0eXBlaWQoKnRlbXBsYXRlX2NsYXNzKSwgdHlwZWlkKCpnZW5lcmljX3Byb3QpKTsgICAgICAgICAgICAgIFwKLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gd2hpbGUgKDApCisjZGVmaW5lIFRfVklSVFVBTF9DQUxMKCkgOjphcGFjaGU6OnRocmlmdDo6cHJvZmlsZV92aXJ0dWFsX2NhbGwodHlwZWlkKCp0aGlzKSkKKyNkZWZpbmUgVF9HRU5FUklDX1BST1RPQ09MKHRlbXBsYXRlX2NsYXNzLCBnZW5lcmljX3Byb3QsIHNwZWNpZmljX3Byb3QpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIShzcGVjaWZpY19wcm90KSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIDo6YXBhY2hlOjp0aHJpZnQ6OnByb2ZpbGVfZ2VuZXJpY19wcm90b2NvbCh0eXBlaWQoKnRlbXBsYXRlX2NsYXNzKSwgdHlwZWlkKCpnZW5lcmljX3Byb3QpKTsgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKICNlbGlmIFRfR0xPQkFMX0RFQlVHX1ZJUlRVQUwgPT0gMQotICAjZGVmaW5lIFRfVklSVFVBTF9DQUxMKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZnByaW50ZihzdGRlcnIsIlslcywlZF0gdmlydHVhbCBjYWxsXG4iLCBfX0ZJTEVfXywgX19MSU5FX18pCi0gICNkZWZpbmUgVF9HRU5FUklDX1BST1RPQ09MKHRlbXBsYXRlX2NsYXNzLCBnZW5lcmljX3Byb3QsIHNwZWNpZmljX3Byb3QpIFwKLSAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgaWYgKCEoc3BlY2lmaWNfcHJvdCkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGZwcmludGYoc3RkZXJyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAiWyVzLCVkXSBmYWlsZWQgdG8gY2FzdCB0byBzcGVjaWZpYyBwcm90b2NvbCB0eXBlXG4iLCAgICAgXAotICAgICAgICAgICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9IHdoaWxlICgwKQorI2RlZmluZSBUX1ZJUlRVQUxfQ0FMTCgpIGZwcmludGYoc3RkZXJyLCAiWyVzLCVkXSB2aXJ0dWFsIGNhbGxcbiIsIF9fRklMRV9fLCBfX0xJTkVfXykKKyNkZWZpbmUgVF9HRU5FUklDX1BST1RPQ09MKHRlbXBsYXRlX2NsYXNzLCBnZW5lcmljX3Byb3QsIHNwZWNpZmljX3Byb3QpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIShzcGVjaWZpY19wcm90KSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiWyVzLCVkXSBmYWlsZWQgdG8gY2FzdCB0byBzcGVjaWZpYyBwcm90b2NvbCB0eXBlXG4iLCBfX0ZJTEVfXywgX19MSU5FX18pOyAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKICNlbHNlCi0gICNkZWZpbmUgVF9WSVJUVUFMX0NBTEwoKQotICAjZGVmaW5lIFRfR0VORVJJQ19QUk9UT0NPTCh0ZW1wbGF0ZV9jbGFzcywgZ2VuZXJpY19wcm90LCBzcGVjaWZpY19wcm90KQorI2RlZmluZSBUX1ZJUlRVQUxfQ0FMTCgpCisjZGVmaW5lIFRfR0VORVJJQ19QUk9UT0NPTCh0ZW1wbGF0ZV9jbGFzcywgZ2VuZXJpY19wcm90LCBzcGVjaWZpY19wcm90KQogI2VuZGlmCiAKICNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVExPR0dJTkdfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9UT3V0cHV0LmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9UT3V0cHV0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTNhOWUyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L1RPdXRwdXQuY3BwCkBAIC0wLDAgKzEsMTI2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvVGhyaWZ0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L1RUb1N0cmluZy5oPgorI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8Y3N0ZGxpYj4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworCitUT3V0cHV0IEdsb2JhbE91dHB1dDsKKwordm9pZCBUT3V0cHV0OjpwcmludGYoY29uc3QgY2hhciogbWVzc2FnZSwgLi4uKSB7CisjaWZuZGVmIFRIUklGVF9TUVVFTENIX0NPTlNPTEVfT1VUUFVUCisgIC8vIFRyeSB0byByZWR1Y2UgaGVhcCB1c2FnZSwgZXZlbiBpZiBwcmludGYgaXMgY2FsbGVkIHJhcmVseS4KKyAgc3RhdGljIGNvbnN0IGludCBTVEFDS19CVUZfU0laRSA9IDI1NjsKKyAgY2hhciBzdGFja19idWZbU1RBQ0tfQlVGX1NJWkVdOworICB2YV9saXN0IGFwOworCisjaWZkZWYgX01TQ19WRVIKKyAgdmFfc3RhcnQoYXAsIG1lc3NhZ2UpOworICBpbnQgbmVlZCA9IF92c2NwcmludGYobWVzc2FnZSwgYXApOworICB2YV9lbmQoYXApOworCisgIGlmIChuZWVkIDwgU1RBQ0tfQlVGX1NJWkUpIHsKKyAgICB2YV9zdGFydChhcCwgbWVzc2FnZSk7CisgICAgdnNucHJpbnRmX3Moc3RhY2tfYnVmLCBTVEFDS19CVUZfU0laRSwgX1RSVU5DQVRFLCBtZXNzYWdlLCBhcCk7CisgICAgdmFfZW5kKGFwKTsKKyAgICBmXyhzdGFja19idWYpOworICAgIHJldHVybjsKKyAgfQorI2Vsc2UKKyAgdmFfc3RhcnQoYXAsIG1lc3NhZ2UpOworICBpbnQgbmVlZCA9IHZzbnByaW50ZihzdGFja19idWYsIFNUQUNLX0JVRl9TSVpFLCBtZXNzYWdlLCBhcCk7CisgIHZhX2VuZChhcCk7CisKKyAgaWYgKG5lZWQgPCBTVEFDS19CVUZfU0laRSkgeworICAgIGZfKHN0YWNrX2J1Zik7CisgICAgcmV0dXJuOworICB9CisjZW5kaWYKKworICBjaGFyKiBoZWFwX2J1ZiA9IChjaGFyKiltYWxsb2MoKG5lZWQgKyAxKSAqIHNpemVvZihjaGFyKSk7CisgIGlmIChoZWFwX2J1ZiA9PSBOVUxMKSB7CisjaWZkZWYgX01TQ19WRVIKKyAgICB2YV9zdGFydChhcCwgbWVzc2FnZSk7CisgICAgdnNucHJpbnRmX3Moc3RhY2tfYnVmLCBTVEFDS19CVUZfU0laRSwgX1RSVU5DQVRFLCBtZXNzYWdlLCBhcCk7CisgICAgdmFfZW5kKGFwKTsKKyNlbmRpZgorICAgIC8vIE1hbGxvYyBmYWlsZWQuICBXZSBtaWdodCBhcyB3ZWxsIHByaW50IHRoZSBzdGFjayBidWZmZXIuCisgICAgZl8oc3RhY2tfYnVmKTsKKyAgICByZXR1cm47CisgIH0KKworICB2YV9zdGFydChhcCwgbWVzc2FnZSk7CisgIGludCBydmFsID0gdnNucHJpbnRmKGhlYXBfYnVmLCBuZWVkICsgMSwgbWVzc2FnZSwgYXApOworICB2YV9lbmQoYXApOworICAvLyBUT0RPKHNoaWdpbik6IGluZm9ybSB1c2VyCisgIGlmIChydmFsICE9IC0xKSB7CisgICAgZl8oaGVhcF9idWYpOworICB9CisgIGZyZWUoaGVhcF9idWYpOworI2VuZGlmCit9CisKK3ZvaWQgVE91dHB1dDo6ZXJyb3JUaW1lV3JhcHBlcihjb25zdCBjaGFyKiBtc2cpIHsKKyNpZm5kZWYgVEhSSUZUX1NRVUVMQ0hfQ09OU09MRV9PVVRQVVQKKyAgdGltZV90IG5vdzsKKyAgY2hhciBkYmd0aW1lWzI2XTsKKyAgdGltZSgmbm93KTsKKyAgVEhSSUZUX0NUSU1FX1IoJm5vdywgZGJndGltZSk7CisgIGRiZ3RpbWVbMjRdID0gMDsKKyAgZnByaW50ZihzdGRlcnIsICJUaHJpZnQ6ICVzICVzXG4iLCBkYmd0aW1lLCBtc2cpOworI2VuZGlmCit9CisKK3ZvaWQgVE91dHB1dDo6cGVycm9yKGNvbnN0IGNoYXIqIG1lc3NhZ2UsIGludCBlcnJub19jb3B5KSB7CisgIHN0ZDo6c3RyaW5nIG91dCA9IG1lc3NhZ2UgKyBzdGQ6OnN0cmluZygiOiAiKSArIHN0cmVycm9yX3MoZXJybm9fY29weSk7CisgIGZfKG91dC5jX3N0cigpKTsKK30KKworc3RkOjpzdHJpbmcgVE91dHB1dDo6c3RyZXJyb3JfcyhpbnQgZXJybm9fY29weSkgeworI2lmbmRlZiBIQVZFX1NUUkVSUk9SX1IKKyAgcmV0dXJuICJlcnJubyA9ICIgKyB0b19zdHJpbmcoZXJybm9fY29weSk7CisjZWxzZSAvLyBIQVZFX1NUUkVSUk9SX1IKKworICBjaGFyIGJfZXJyYnVmWzEwMjRdID0geydcMCd9OworI2lmZGVmIFNUUkVSUk9SX1JfQ0hBUl9QCisgIGNoYXIqIGJfZXJyb3IgPSBzdHJlcnJvcl9yKGVycm5vX2NvcHksIGJfZXJyYnVmLCBzaXplb2YoYl9lcnJidWYpKTsKKyNlbHNlCisgIGNoYXIqIGJfZXJyb3IgPSBiX2VycmJ1ZjsKKyAgaW50IHJ2ID0gc3RyZXJyb3JfcihlcnJub19jb3B5LCBiX2VycmJ1Ziwgc2l6ZW9mKGJfZXJyYnVmKSk7CisgIGlmIChydiA9PSAtMSkgeworICAgIC8vIHN0cmVycm9yX3IgZmFpbGVkLiAgb21nd3RmYmJxLgorICAgIHJldHVybiAiWFNJLWNvbXBsaWFudCBzdHJlcnJvcl9yKCkgZmFpbGVkIHdpdGggZXJybm8gPSAiCisgICAgICAgICAgICsgdG9fc3RyaW5nKGVycm5vX2NvcHkpOworICB9CisjZW5kaWYKKyAgLy8gQ2FuIGFueW9uZSBwcm92ZSB0aGF0IGV4cGxpY2l0IGNhc3QgaXMgcHJvYmFibHkgbm90IG5lY2Vzc2FyeQorICAvLyB0byBlbnN1cmUgdGhhdCB0aGUgc3RyaW5nIG9iamVjdCBpcyBjb25zdHJ1Y3RlZCBiZWZvcmUKKyAgLy8gYl9lcnJvciBiZWNvbWVzIGludmFsaWQ/CisgIHJldHVybiBzdGQ6OnN0cmluZyhiX2Vycm9yKTsKKworI2VuZGlmIC8vIEhBVkVfU1RSRVJST1JfUgorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L1RPdXRwdXQuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9UT3V0cHV0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM3NWY3MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9UT3V0cHV0LmgKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfT1VUUFVUX0hfCisjZGVmaW5lIF9USFJJRlRfT1VUUFVUX0hfIDEKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKKworY2xhc3MgVE91dHB1dCB7CitwdWJsaWM6CisgIFRPdXRwdXQoKSA6IGZfKCZlcnJvclRpbWVXcmFwcGVyKSB7fQorCisgIGlubGluZSB2b2lkIHNldE91dHB1dEZ1bmN0aW9uKHZvaWQgKCpmdW5jdGlvbikoY29uc3QgY2hhciopKSB7IGZfID0gZnVuY3Rpb247IH0KKworICBpbmxpbmUgdm9pZCBvcGVyYXRvcigpKGNvbnN0IGNoYXIqIG1lc3NhZ2UpIHsgZl8obWVzc2FnZSk7IH0KKworICAvLyBJdCBpcyBpbXBvcnRhbnQgdG8gaGF2ZSBhIGNvbnN0IGNoYXIqIG92ZXJsb2FkIGhlcmUgaW5zdGVhZCBvZgorICAvLyBqdXN0IHRoZSBzdHJpbmcgdmVyc2lvbiwgb3RoZXJ3aXNlIGVycm5vIGNvdWxkIGJlIGNvcnJ1cHRlZAorICAvLyBpZiB0aGVyZSBpcyBzb21lIHByb2JsZW0gYWxsb2NhdGluZyBtZW1vcnkgd2hlbiBjb25zdHJ1Y3RpbmcKKyAgLy8gdGhlIHN0cmluZy4KKyAgdm9pZCBwZXJyb3IoY29uc3QgY2hhciogbWVzc2FnZSwgaW50IGVycm5vX2NvcHkpOworICBpbmxpbmUgdm9pZCBwZXJyb3IoY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UsIGludCBlcnJub19jb3B5KSB7CisgICAgcGVycm9yKG1lc3NhZ2UuY19zdHIoKSwgZXJybm9fY29weSk7CisgIH0KKworICB2b2lkIHByaW50Zihjb25zdCBjaGFyKiBtZXNzYWdlLCAuLi4pOworCisgIHN0YXRpYyB2b2lkIGVycm9yVGltZVdyYXBwZXIoY29uc3QgY2hhciogbXNnKTsKKworICAvKiogSnVzdCBsaWtlIHN0cmVycm9yX3IgYnV0IHJldHVybnMgYSBDKysgc3RyaW5nIG9iamVjdC4gKi8KKyAgc3RhdGljIHN0ZDo6c3RyaW5nIHN0cmVycm9yX3MoaW50IGVycm5vX2NvcHkpOworCitwcml2YXRlOgorICB2b2lkICgqZl8pKGNvbnN0IGNoYXIqKTsKK307CisKK2V4dGVybiBUT3V0cHV0IEdsb2JhbE91dHB1dDsKK30KK30gLy8gbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0CisKKyNlbmRpZiAvL19USFJJRlRfT1VUUFVUX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvVFByb2Nlc3Nvci5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L1RQcm9jZXNzb3IuaAppbmRleCBiNGE0NjU3Li42YTQ2NDY2IDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvVFByb2Nlc3Nvci5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9UUHJvY2Vzc29yLmgKQEAgLTIyLDkgKzIyLDkgQEAKIAogI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmg+Ci0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+CiAKLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CiAKIC8qKgogICogVmlydHVhbCBpbnRlcmZhY2UgY2xhc3MgdGhhdCBjYW4gaGFuZGxlIGV2ZW50cyBmcm9tIHRoZSBwcm9jZXNzb3IuIFRvCkBAIC0zNCw4ICszNCw3IEBACiAgKiBpbnN0YW5jZSdzIHN0YXRlKS4KICAqLwogY2xhc3MgVFByb2Nlc3NvckV2ZW50SGFuZGxlciB7Ci0gcHVibGljOgotCitwdWJsaWM6CiAgIHZpcnR1YWwgflRQcm9jZXNzb3JFdmVudEhhbmRsZXIoKSB7fQogCiAgIC8qKgpAQCAtNDUsOCArNDQsOCBAQAogICAgKiBmb3IgdGhhdCBmdW5jdGlvbiBpbnZvY2F0aW9uLgogICAgKi8KICAgdmlydHVhbCB2b2lkKiBnZXRDb250ZXh0KGNvbnN0IGNoYXIqIGZuX25hbWUsIHZvaWQqIHNlcnZlckNvbnRleHQpIHsKLSAgICAodm9pZCkgZm5fbmFtZTsKLSAgICAodm9pZCkgc2VydmVyQ29udGV4dDsKKyAgICAodm9pZClmbl9uYW1lOworICAgICh2b2lkKXNlcnZlckNvbnRleHQ7CiAgICAgcmV0dXJuIE5VTEw7CiAgIH0KIApAQCAtNTQsNjEgKzUzLDYxIEBACiAgICAqIEV4cGVjdGVkIHRvIGZyZWUgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCBhIGNvbnRleHQuCiAgICAqLwogICB2aXJ0dWFsIHZvaWQgZnJlZUNvbnRleHQodm9pZCogY3R4LCBjb25zdCBjaGFyKiBmbl9uYW1lKSB7Ci0gICAgKHZvaWQpIGN0eDsKLSAgICAodm9pZCkgZm5fbmFtZTsKKyAgICAodm9pZCljdHg7CisgICAgKHZvaWQpZm5fbmFtZTsKICAgfQogCiAgIC8qKgogICAgKiBDYWxsZWQgYmVmb3JlIHJlYWRpbmcgYXJndW1lbnRzLgogICAgKi8KICAgdmlydHVhbCB2b2lkIHByZVJlYWQodm9pZCogY3R4LCBjb25zdCBjaGFyKiBmbl9uYW1lKSB7Ci0gICAgKHZvaWQpIGN0eDsKLSAgICAodm9pZCkgZm5fbmFtZTsKKyAgICAodm9pZCljdHg7CisgICAgKHZvaWQpZm5fbmFtZTsKICAgfQogCiAgIC8qKgogICAgKiBDYWxsZWQgYmV0d2VlbiByZWFkaW5nIGFyZ3VtZW50cyBhbmQgY2FsbGluZyB0aGUgaGFuZGxlci4KICAgICovCiAgIHZpcnR1YWwgdm9pZCBwb3N0UmVhZCh2b2lkKiBjdHgsIGNvbnN0IGNoYXIqIGZuX25hbWUsIHVpbnQzMl90IGJ5dGVzKSB7Ci0gICAgKHZvaWQpIGN0eDsKLSAgICAodm9pZCkgZm5fbmFtZTsKLSAgICAodm9pZCkgYnl0ZXM7CisgICAgKHZvaWQpY3R4OworICAgICh2b2lkKWZuX25hbWU7CisgICAgKHZvaWQpYnl0ZXM7CiAgIH0KIAogICAvKioKICAgICogQ2FsbGVkIGJldHdlZW4gY2FsbGluZyB0aGUgaGFuZGxlciBhbmQgd3JpdGluZyB0aGUgcmVzcG9uc2UuCiAgICAqLwogICB2aXJ0dWFsIHZvaWQgcHJlV3JpdGUodm9pZCogY3R4LCBjb25zdCBjaGFyKiBmbl9uYW1lKSB7Ci0gICAgKHZvaWQpIGN0eDsKLSAgICAodm9pZCkgZm5fbmFtZTsKKyAgICAodm9pZCljdHg7CisgICAgKHZvaWQpZm5fbmFtZTsKICAgfQogCiAgIC8qKgogICAgKiBDYWxsZWQgYWZ0ZXIgd3JpdGluZyB0aGUgcmVzcG9uc2UuCiAgICAqLwogICB2aXJ0dWFsIHZvaWQgcG9zdFdyaXRlKHZvaWQqIGN0eCwgY29uc3QgY2hhciogZm5fbmFtZSwgdWludDMyX3QgYnl0ZXMpIHsKLSAgICAodm9pZCkgY3R4OwotICAgICh2b2lkKSBmbl9uYW1lOwotICAgICh2b2lkKSBieXRlczsKKyAgICAodm9pZCljdHg7CisgICAgKHZvaWQpZm5fbmFtZTsKKyAgICAodm9pZClieXRlczsKICAgfQogCiAgIC8qKgogICAgKiBDYWxsZWQgd2hlbiBhbiBhc3luYyBmdW5jdGlvbiBjYWxsIGNvbXBsZXRlcyBzdWNjZXNzZnVsbHkuCiAgICAqLwogICB2aXJ0dWFsIHZvaWQgYXN5bmNDb21wbGV0ZSh2b2lkKiBjdHgsIGNvbnN0IGNoYXIqIGZuX25hbWUpIHsKLSAgICAodm9pZCkgY3R4OwotICAgICh2b2lkKSBmbl9uYW1lOworICAgICh2b2lkKWN0eDsKKyAgICAodm9pZClmbl9uYW1lOwogICB9CiAKICAgLyoqCiAgICAqIENhbGxlZCBpZiB0aGUgaGFuZGxlciB0aHJvd3MgYW4gdW5kZWNsYXJlZCBleGNlcHRpb24uCiAgICAqLwogICB2aXJ0dWFsIHZvaWQgaGFuZGxlckVycm9yKHZvaWQqIGN0eCwgY29uc3QgY2hhciogZm5fbmFtZSkgewotICAgICh2b2lkKSBjdHg7Ci0gICAgKHZvaWQpIGZuX25hbWU7CisgICAgKHZvaWQpY3R4OworICAgICh2b2lkKWZuX25hbWU7CiAgIH0KIAotIHByb3RlY3RlZDoKK3Byb3RlY3RlZDoKICAgVFByb2Nlc3NvckV2ZW50SGFuZGxlcigpIHt9CiB9OwogCkBAIC0xMTYsMTIgKzExNSwxNiBAQAogICogQSBoZWxwZXIgY2xhc3MgdXNlZCBieSB0aGUgZ2VuZXJhdGVkIGNvZGUgdG8gZnJlZSBlYWNoIGNvbnRleHQuCiAgKi8KIGNsYXNzIFRQcm9jZXNzb3JDb250ZXh0RnJlZXIgewotIHB1YmxpYzoKLSAgVFByb2Nlc3NvckNvbnRleHRGcmVlcihUUHJvY2Vzc29yRXZlbnRIYW5kbGVyKiBoYW5kbGVyLCB2b2lkKiBjb250ZXh0LCBjb25zdCBjaGFyKiBtZXRob2QpIDoKLSAgICBoYW5kbGVyXyhoYW5kbGVyKSwgY29udGV4dF8oY29udGV4dCksIG1ldGhvZF8obWV0aG9kKSB7fQotICB+VFByb2Nlc3NvckNvbnRleHRGcmVlcigpIHsgaWYgKGhhbmRsZXJfICE9IE5VTEwpIGhhbmRsZXJfLT5mcmVlQ29udGV4dChjb250ZXh0XywgbWV0aG9kXyk7IH0KK3B1YmxpYzoKKyAgVFByb2Nlc3NvckNvbnRleHRGcmVlcihUUHJvY2Vzc29yRXZlbnRIYW5kbGVyKiBoYW5kbGVyLCB2b2lkKiBjb250ZXh0LCBjb25zdCBjaGFyKiBtZXRob2QpCisgICAgOiBoYW5kbGVyXyhoYW5kbGVyKSwgY29udGV4dF8oY29udGV4dCksIG1ldGhvZF8obWV0aG9kKSB7fQorICB+VFByb2Nlc3NvckNvbnRleHRGcmVlcigpIHsKKyAgICBpZiAoaGFuZGxlcl8gIT0gTlVMTCkKKyAgICAgIGhhbmRsZXJfLT5mcmVlQ29udGV4dChjb250ZXh0XywgbWV0aG9kXyk7CisgIH0KICAgdm9pZCB1bnJlZ2lzdGVyKCkgeyBoYW5kbGVyXyA9IE5VTEw7IH0KLSBwcml2YXRlOgorCitwcml2YXRlOgogICBhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3NvckV2ZW50SGFuZGxlciogaGFuZGxlcl87CiAgIHZvaWQqIGNvbnRleHRfOwogICBjb25zdCBjaGFyKiBtZXRob2RfOwpAQCAtMTM1LDM0ICsxMzgsMzEgQEAKICAqCiAgKi8KIGNsYXNzIFRQcm9jZXNzb3IgewotIHB1YmxpYzoKK3B1YmxpYzoKICAgdmlydHVhbCB+VFByb2Nlc3NvcigpIHt9CiAKLSAgdmlydHVhbCBib29sIHByb2Nlc3MoYm9vc3Q6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gaW4sCi0gICAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IG91dCwKKyAgdmlydHVhbCBib29sIHByb2Nlc3Moc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IGluLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gb3V0LAogICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjb25uZWN0aW9uQ29udGV4dCkgPSAwOwogCi0gIGJvb2wgcHJvY2Vzcyhib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gaW8sCi0gICAgICAgICAgICAgICB2b2lkKiBjb25uZWN0aW9uQ29udGV4dCkgeworICBib29sIHByb2Nlc3Moc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBpbywgdm9pZCogY29ubmVjdGlvbkNvbnRleHQpIHsKICAgICByZXR1cm4gcHJvY2VzcyhpbywgaW8sIGNvbm5lY3Rpb25Db250ZXh0KTsKICAgfQogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3JFdmVudEhhbmRsZXI+IGdldEV2ZW50SGFuZGxlcigpIHsKLSAgICByZXR1cm4gZXZlbnRIYW5kbGVyXzsKLSAgfQorICBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3NvckV2ZW50SGFuZGxlcj4gZ2V0RXZlbnRIYW5kbGVyKCkgY29uc3QgeyByZXR1cm4gZXZlbnRIYW5kbGVyXzsgfQogCi0gIHZvaWQgc2V0RXZlbnRIYW5kbGVyKGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3JFdmVudEhhbmRsZXI+IGV2ZW50SGFuZGxlcikgeworICB2b2lkIHNldEV2ZW50SGFuZGxlcihzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3NvckV2ZW50SGFuZGxlcj4gZXZlbnRIYW5kbGVyKSB7CiAgICAgZXZlbnRIYW5kbGVyXyA9IGV2ZW50SGFuZGxlcjsKICAgfQogCi0gcHJvdGVjdGVkOgorcHJvdGVjdGVkOgogICBUUHJvY2Vzc29yKCkge30KIAotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yRXZlbnRIYW5kbGVyPiBldmVudEhhbmRsZXJfOworICBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3NvckV2ZW50SGFuZGxlcj4gZXZlbnRIYW5kbGVyXzsKIH07CiAKIC8qKgotICogVGhpcyBpcyBhIGhlbHBlciBjbGFzcyB0byBhbGxvdyBib29zdDo6c2hhcmVkX3B0ciB0byBiZSB1c2VkIHdpdGggaGFuZGxlcgorICogVGhpcyBpcyBhIGhlbHBlciBjbGFzcyB0byBhbGxvdyBzdGQ6OnNoYXJlZF9wdHIgdG8gYmUgdXNlZCB3aXRoIGhhbmRsZXIKICAqIHBvaW50ZXJzIHJldHVybmVkIGJ5IHRoZSBnZW5lcmF0ZWQgaGFuZGxlciBmYWN0b3JpZXMuCiAgKgogICogVGhlIGhhbmRsZXIgZmFjdG9yeSBjbGFzc2VzIGdlbmVyYXRlZCBieSB0aGUgdGhyaWZ0IGNvbXBpbGVyIHJldHVybiByYXcKQEAgLTE3MywzNSArMTczLDM1IEBACiAgKiBwYXJhbWV0ZXIgdG8gYSBzaGFyZWRfcHRyLCBzbyB0aGF0IGZhY3RvcnktPnJlbGVhc2VIYW5kbGVyKCkgd2lsbCBiZSBjYWxsZWQKICAqIHdoZW4gdGhlIG9iamVjdCBpcyBubyBsb25nZXIgbmVlZGVkLCBpbnN0ZWFkIG9mIGRlbGV0aW5nIHRoZSBwb2ludGVyLgogICovCi10ZW1wbGF0ZTx0eXBlbmFtZSBIYW5kbGVyRmFjdG9yeV8+Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgSGFuZGxlckZhY3RvcnlfPgogY2xhc3MgUmVsZWFzZUhhbmRsZXIgewotIHB1YmxpYzoKLSAgIFJlbGVhc2VIYW5kbGVyKGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPEhhbmRsZXJGYWN0b3J5Xz4mIGhhbmRsZXJGYWN0b3J5KSA6Ci0gICAgICAgaGFuZGxlckZhY3RvcnlfKGhhbmRsZXJGYWN0b3J5KSB7fQorcHVibGljOgorICBSZWxlYXNlSGFuZGxlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SGFuZGxlckZhY3RvcnlfPiYgaGFuZGxlckZhY3RvcnkpCisgICAgOiBoYW5kbGVyRmFjdG9yeV8oaGFuZGxlckZhY3RvcnkpIHt9CiAKLSAgIHZvaWQgb3BlcmF0b3IoKSh0eXBlbmFtZSBIYW5kbGVyRmFjdG9yeV86OkhhbmRsZXIqIGhhbmRsZXIpIHsKLSAgICAgaWYgKGhhbmRsZXIpIHsKLSAgICAgICBoYW5kbGVyRmFjdG9yeV8tPnJlbGVhc2VIYW5kbGVyKGhhbmRsZXIpOwotICAgICB9Ci0gICB9CisgIHZvaWQgb3BlcmF0b3IoKSh0eXBlbmFtZSBIYW5kbGVyRmFjdG9yeV86OkhhbmRsZXIqIGhhbmRsZXIpIHsKKyAgICBpZiAoaGFuZGxlcikgeworICAgICAgaGFuZGxlckZhY3RvcnlfLT5yZWxlYXNlSGFuZGxlcihoYW5kbGVyKTsKKyAgICB9CisgIH0KIAotIHByaXZhdGU6Ci0gICBib29zdDo6c2hhcmVkX3B0cjxIYW5kbGVyRmFjdG9yeV8+IGhhbmRsZXJGYWN0b3J5XzsKK3ByaXZhdGU6CisgIHN0ZDo6c2hhcmVkX3B0cjxIYW5kbGVyRmFjdG9yeV8+IGhhbmRsZXJGYWN0b3J5XzsKIH07CiAKIHN0cnVjdCBUQ29ubmVjdGlvbkluZm8gewogICAvLyBUaGUgaW5wdXQgYW5kIG91dHB1dCBwcm90b2NvbHMKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gaW5wdXQ7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IG91dHB1dDsKKyAgc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IGlucHV0OworICBzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gb3V0cHV0OwogICAvLyBUaGUgdW5kZXJseWluZyB0cmFuc3BvcnQgdXNlZCBmb3IgdGhlIGNvbm5lY3Rpb24KICAgLy8gVGhpcyBpcyB0aGUgdHJhbnNwb3J0IHRoYXQgd2FzIHJldHVybmVkIGJ5IFRTZXJ2ZXJUcmFuc3BvcnQ6OmFjY2VwdCgpLAogICAvLyBhbmQgaXQgbWF5IGJlIGRpZmZlcmVudCB0aGFuIHRoZSB0cmFuc3BvcnQgcG9pbnRlZCB0byBieSB0aGUgaW5wdXQgYW5kCiAgIC8vIG91dHB1dCBwcm90b2NvbHMuCi0gIGJvb3N0OjpzaGFyZWRfcHRyPHRyYW5zcG9ydDo6VFRyYW5zcG9ydD4gdHJhbnNwb3J0OworICBzdGQ6OnNoYXJlZF9wdHI8dHJhbnNwb3J0OjpUVHJhbnNwb3J0PiB0cmFuc3BvcnQ7CiB9OwogCiBjbGFzcyBUUHJvY2Vzc29yRmFjdG9yeSB7Ci0gcHVibGljOgorcHVibGljOgogICB2aXJ0dWFsIH5UUHJvY2Vzc29yRmFjdG9yeSgpIHt9CiAKICAgLyoqCkBAIC0yMTEsMjMgKzIxMSwxOSBAQAogICAgKiBhY2NlcHRlZCBvbi4gIFRoaXMgZ2VuZXJhbGx5IG1lYW5zIHRoYXQgdGhpcyBjYWxsIGRvZXMgbm90IG5lZWQgdG8gYmUKICAgICogdGhyZWFkIHNhZmUsIGFzIGl0IHdpbGwgYWx3YXlzIGJlIGludm9rZWQgZnJvbSBhIHNpbmdsZSB0aHJlYWQuCiAgICAqLwotICB2aXJ0dWFsIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IGdldFByb2Nlc3NvcigKLSAgICAgIGNvbnN0IFRDb25uZWN0aW9uSW5mbyYgY29ubkluZm8pID0gMDsKKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gZ2V0UHJvY2Vzc29yKGNvbnN0IFRDb25uZWN0aW9uSW5mbyYgY29ubkluZm8pID0gMDsKIH07CiAKIGNsYXNzIFRTaW5nbGV0b25Qcm9jZXNzb3JGYWN0b3J5IDogcHVibGljIFRQcm9jZXNzb3JGYWN0b3J5IHsKLSBwdWJsaWM6Ci0gIFRTaW5nbGV0b25Qcm9jZXNzb3JGYWN0b3J5KGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvcikgOgotICAgICAgcHJvY2Vzc29yXyhwcm9jZXNzb3IpIHt9CitwdWJsaWM6CisgIFRTaW5nbGV0b25Qcm9jZXNzb3JGYWN0b3J5KHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IpIDogcHJvY2Vzc29yXyhwcm9jZXNzb3IpIHt9CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gZ2V0UHJvY2Vzc29yKGNvbnN0IFRDb25uZWN0aW9uSW5mbyYpIHsKLSAgICByZXR1cm4gcHJvY2Vzc29yXzsKLSAgfQorICBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gZ2V0UHJvY2Vzc29yKGNvbnN0IFRDb25uZWN0aW9uSW5mbyYpIHsgcmV0dXJuIHByb2Nlc3Nvcl87IH0KIAotIHByaXZhdGU6Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3Nvcl87Citwcml2YXRlOgorICBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yXzsKIH07Ci0KLX19IC8vIGFwYWNoZTo6dGhyaWZ0Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0CiAKICNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVFBST0NFU1NPUl9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L1RSZWZsZWN0aW9uTG9jYWwuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9UUmVmbGVjdGlvbkxvY2FsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlZjc1MTEuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L1RSZWZsZWN0aW9uTG9jYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX1RSRUZMRUNUSU9OTE9DQUxfSF8KLSNkZWZpbmUgX1RIUklGVF9UUkVGTEVDVElPTkxPQ0FMX0hfIDEKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPGNzdHJpbmc+Ci0jaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbC5oPgotCi0vKioKLSAqIExvY2FsIFJlZmxlY3Rpb24gaXMgYSBibGFua2V0IHRlcm0gcmVmZXJyaW5nIHRvIHRoZSB0aGUgc3RydWN0dXJlCi0gKiBhbmQgZ2VuZXJhdGlvbiBvZiB0aGlzIHBhcnRpY3VsYXIgcmVwcmVzZW50YXRpb24gb2YgVGhyaWZ0IHR5cGVzLgotICogKEl0IGlzIGNhbGxlZCBsb2NhbCBiZWNhdXNlIGl0IGNhbm5vdCBiZSBzZXJpYWxpemVkIGJ5IFRocmlmdCkuCi0gKgotICovCi0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHJlZmxlY3Rpb24geyBuYW1lc3BhY2UgbG9jYWwgewotCi11c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRUeXBlOwotCi0vLyBXZSBpbmNsdWRlIHRoaXMgbWFueSBieXRlcyBvZiB0aGUgc3RydWN0dXJlJ3MgZmluZ2VycHJpbnQgd2hlbiBzZXJpYWxpemluZwotLy8gYSB0b3AtbGV2ZWwgc3RydWN0dXJlLiAgTG9uZyBlbm91Z2ggdG8gbWFrZSBjb2xsaXNpb25zIHVubGlrZWx5LCBzaG9ydAotLy8gZW5vdWdoIHRvIG5vdCBzaWduaWZpY2FudGx5IGFmZmVjdCB0aGUgYW1vdW50IG9mIG1lbW9yeSB1c2VkLgotY29uc3QgaW50IEZQX1BSRUZJWF9MRU4gPSA0OwotCi1zdHJ1Y3QgRmllbGRNZXRhIHsKLSAgaW50MTZfdCB0YWc7Ci0gIGJvb2wgaXNfb3B0aW9uYWw7Ci19OwotCi1zdHJ1Y3QgVHlwZVNwZWMgewotICBUVHlwZSB0dHlwZTsKLSAgdWludDhfdCAgICBmcF9wcmVmaXhbRlBfUFJFRklYX0xFTl07Ci0KLSAgLy8gVXNlIGFuIGFub255bW91cyB1bmlvbiBoZXJlIHNvIHdlIGNhbiBmaXQgdHdvIFR5cGVTcGVjcyBpbiBvbmUgY2FjaGUgbGluZS4KLSAgdW5pb24gewotICAgIHN0cnVjdCB7Ci0gICAgICAvLyBVc2UgcGFyYWxsZWwgYXJyYXlzIGhlcmUgZm9yIGRlbnNlciBwYWNraW5nIChvZiB0aGUgYXJyYXlzKS4KLSAgICAgIEZpZWxkTWV0YSogbWV0YXM7Ci0gICAgICBUeXBlU3BlYyoqIHNwZWNzOwotICAgIH0gdHN0cnVjdDsKLSAgICBzdHJ1Y3QgewotICAgICAgVHlwZVNwZWMgKnN1YnR5cGUxOwotICAgICAgVHlwZVNwZWMgKnN1YnR5cGUyOwotICAgIH0gdGNvbnRhaW5lcjsKLSAgfTsKLQotICAvLyBTdGF0aWMgaW5pdGlhbGl6YXRpb24gb2YgdW5pb25zIGlzbid0IHJlYWxseSBwb3NzaWJsZSwKLSAgLy8gc28gdGFrZSB0aGUgcGx1bmdlIGFuZCB1c2UgY29uc3RydWN0b3JzLgotICAvLyBIb3BlZnVsbHkgdGhleSdsbCBiZSBldmFsdWF0ZWQgYXQgY29tcGlsZSB0aW1lLgotCi0gIFR5cGVTcGVjKFRUeXBlIHR0eXBlKSA6IHR0eXBlKHR0eXBlKSB7Ci0gICAgc3RkOjptZW1zZXQoZnBfcHJlZml4LCAwLCBGUF9QUkVGSVhfTEVOKTsKLSAgfQotCi0gIFR5cGVTcGVjKFRUeXBlIHR0eXBlLAotICAgICAgICAgICBjb25zdCB1aW50OF90KiBmaW5nZXJwcmludCwKLSAgICAgICAgICAgRmllbGRNZXRhKiBtZXRhcywKLSAgICAgICAgICAgVHlwZVNwZWMqKiBzcGVjcykgOgotICAgIHR0eXBlKHR0eXBlKQotICB7Ci0gICAgc3RkOjptZW1jcHkoZnBfcHJlZml4LCBmaW5nZXJwcmludCwgRlBfUFJFRklYX0xFTik7Ci0gICAgdHN0cnVjdC5tZXRhcyA9IG1ldGFzOwotICAgIHRzdHJ1Y3Quc3BlY3MgPSBzcGVjczsKLSAgfQotCi0gIFR5cGVTcGVjKFRUeXBlIHR0eXBlLCBUeXBlU3BlYyogc3VidHlwZTEsIFR5cGVTcGVjKiBzdWJ0eXBlMikgOgotICAgIHR0eXBlKHR0eXBlKQotICB7Ci0gICAgc3RkOjptZW1zZXQoZnBfcHJlZml4LCAwLCBGUF9QUkVGSVhfTEVOKTsKLSAgICB0Y29udGFpbmVyLnN1YnR5cGUxID0gc3VidHlwZTE7Ci0gICAgdGNvbnRhaW5lci5zdWJ0eXBlMiA9IHN1YnR5cGUyOwotICB9Ci0KLX07Ci0KLX19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnJlZmxlY3Rpb246OmxvY2FsCi0KLSNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVFJFRkxFQ1RJT05MT0NBTF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L1RUb1N0cmluZy5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L1RUb1N0cmluZy5oCmluZGV4IGMxNjBlMDkuLjI1NzgwZjkgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9UVG9TdHJpbmcuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvVFRvU3RyaW5nLmgKQEAgLTIwLDE5ICsyMCw0NSBAQAogI2lmbmRlZiBfVEhSSUZUX1RPU1RSSU5HX0hfCiAjZGVmaW5lIF9USFJJRlRfVE9TVFJJTkdfSF8gMQogCi0jaW5jbHVkZSA8Ym9vc3QvbGV4aWNhbF9jYXN0LmhwcD4KLQotI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxjbWF0aD4KKyNpbmNsdWRlIDxsaW1pdHM+CiAjaW5jbHVkZSA8bWFwPgogI2luY2x1ZGUgPHNldD4KLSNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgogCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgewogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyhjb25zdCBUJiB0KSB7Ci0gIHJldHVybiBib29zdDo6bGV4aWNhbF9jYXN0PHN0ZDo6c3RyaW5nPih0KTsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIG87CisgIG8gPDwgdDsKKyAgcmV0dXJuIG8uc3RyKCk7Cit9CisKKy8vIFRPRE86IHJlcGxhY2UgdGhlIGNvbXB1dGF0aW9ucyBiZWxvdyB3aXRoIHN0ZDo6bnVtZXJpY19saW1pdHM6Om1heF9kaWdpdHMxMCBvbmNlIEMrKzExCisvLyBpcyBlbmFibGVkLgoraW5saW5lIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyhjb25zdCBmbG9hdCYgdCkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gbzsKKyAgby5wcmVjaXNpb24oc3RhdGljX2Nhc3Q8c3RkOjpzdHJlYW1zaXplPihzdGQ6OmNlaWwoc3RhdGljX2Nhc3Q8ZG91YmxlPihzdGQ6Om51bWVyaWNfbGltaXRzPGZsb2F0Pjo6ZGlnaXRzICogc3RkOjpsb2cxMCgyLjBmKSArIDEpKSkpOworICBvIDw8IHQ7CisgIHJldHVybiBvLnN0cigpOworfQorCitpbmxpbmUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKGNvbnN0IGRvdWJsZSYgdCkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gbzsKKyAgby5wcmVjaXNpb24oc3RhdGljX2Nhc3Q8c3RkOjpzdHJlYW1zaXplPihzdGQ6OmNlaWwoc3RhdGljX2Nhc3Q8ZG91YmxlPihzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmRpZ2l0cyAqIHN0ZDo6bG9nMTAoMi4wZikgKyAxKSkpKTsKKyAgbyA8PCB0OworICByZXR1cm4gby5zdHIoKTsKK30KKworaW5saW5lIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyhjb25zdCBsb25nIGRvdWJsZSYgdCkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gbzsKKyAgby5wcmVjaXNpb24oc3RhdGljX2Nhc3Q8c3RkOjpzdHJlYW1zaXplPihzdGQ6OmNlaWwoc3RhdGljX2Nhc3Q8ZG91YmxlPihzdGQ6Om51bWVyaWNfbGltaXRzPGxvbmcgZG91YmxlPjo6ZGlnaXRzICogc3RkOjpsb2cxMCgyLjBmKSArIDEpKSkpOworICBvIDw8IHQ7CisgIHJldHVybiBvLnN0cigpOwogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj4KQEAgLTUyLDggKzc4LDcgQEAKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1zdGQ6OnN0cmluZyB0b19zdHJpbmcoY29uc3QgVCYgYmVnLCBjb25zdCBUJiBlbmQpCi17CitzdGQ6OnN0cmluZyB0b19zdHJpbmcoY29uc3QgVCYgYmVnLCBjb25zdCBUJiBlbmQpIHsKICAgc3RkOjpvc3RyaW5nc3RyZWFtIG87CiAgIGZvciAoVCBpdCA9IGJlZzsgaXQgIT0gZW5kOyArK2l0KSB7CiAgICAgaWYgKGl0ICE9IGJlZykKQEAgLTgzLDcgKzEwOCw3IEBACiAgIG8gPDwgInsiIDw8IHRvX3N0cmluZyhzLmJlZ2luKCksIHMuZW5kKCkpIDw8ICJ9IjsKICAgcmV0dXJuIG8uc3RyKCk7CiB9Ci0KLX19IC8vIGFwYWNoZTo6dGhyaWZ0Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0CiAKICNlbmRpZiAvLyBfVEhSSUZUX1RPU1RSSU5HX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvVGhyaWZ0LmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9UaHJpZnQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWUxMzg2Li4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9UaHJpZnQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHRocmlmdC9UaHJpZnQuaD4KLSNpbmNsdWRlIDxjc3RyaW5nPgotI2luY2x1ZGUgPGNzdGRsaWI+Ci0jaW5jbHVkZSA8Ym9vc3QvbGV4aWNhbF9jYXN0LmhwcD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7Ci0KLVRPdXRwdXQgR2xvYmFsT3V0cHV0OwotCi12b2lkIFRPdXRwdXQ6OnByaW50Zihjb25zdCBjaGFyICptZXNzYWdlLCAuLi4pIHsKLSNpZm5kZWYgVEhSSUZUX1NRVUVMQ0hfQ09OU09MRV9PVVRQVVQKLSAgLy8gVHJ5IHRvIHJlZHVjZSBoZWFwIHVzYWdlLCBldmVuIGlmIHByaW50ZiBpcyBjYWxsZWQgcmFyZWx5LgotICBzdGF0aWMgY29uc3QgaW50IFNUQUNLX0JVRl9TSVpFID0gMjU2OwotICBjaGFyIHN0YWNrX2J1ZltTVEFDS19CVUZfU0laRV07Ci0gIHZhX2xpc3QgYXA7Ci0KLSNpZmRlZiBfTVNDX1ZFUgotICB2YV9zdGFydChhcCwgbWVzc2FnZSk7Ci0gIGludCBuZWVkID0gX3ZzY3ByaW50ZihtZXNzYWdlLCBhcCk7Ci0gIHZhX2VuZChhcCk7Ci0KLSAgaWYgKG5lZWQgPCBTVEFDS19CVUZfU0laRSkgewotICAgIHZhX3N0YXJ0KGFwLCBtZXNzYWdlKTsKLSAgICB2c25wcmludGZfcyhzdGFja19idWYsIFNUQUNLX0JVRl9TSVpFLCBfVFJVTkNBVEUsIG1lc3NhZ2UsIGFwKTsKLSAgICB2YV9lbmQoYXApOwotICAgIGZfKHN0YWNrX2J1Zik7Ci0gICAgcmV0dXJuOwotICB9Ci0jZWxzZQotICB2YV9zdGFydChhcCwgbWVzc2FnZSk7Ci0gIGludCBuZWVkID0gdnNucHJpbnRmKHN0YWNrX2J1ZiwgU1RBQ0tfQlVGX1NJWkUsIG1lc3NhZ2UsIGFwKTsKLSAgdmFfZW5kKGFwKTsKLQotICBpZiAobmVlZCA8IFNUQUNLX0JVRl9TSVpFKSB7Ci0gICAgZl8oc3RhY2tfYnVmKTsKLSAgICByZXR1cm47Ci0gIH0KLSNlbmRpZgotCi0gIGNoYXIgKmhlYXBfYnVmID0gKGNoYXIqKW1hbGxvYygobmVlZCsxKSAqIHNpemVvZihjaGFyKSk7Ci0gIGlmIChoZWFwX2J1ZiA9PSBOVUxMKSB7Ci0jaWZkZWYgX01TQ19WRVIKLSAgICB2YV9zdGFydChhcCwgbWVzc2FnZSk7Ci0gICAgdnNucHJpbnRmX3Moc3RhY2tfYnVmLCBTVEFDS19CVUZfU0laRSwgX1RSVU5DQVRFLCBtZXNzYWdlLCBhcCk7Ci0gICAgdmFfZW5kKGFwKTsKLSNlbmRpZgotICAgIC8vIE1hbGxvYyBmYWlsZWQuICBXZSBtaWdodCBhcyB3ZWxsIHByaW50IHRoZSBzdGFjayBidWZmZXIuCi0gICAgZl8oc3RhY2tfYnVmKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICB2YV9zdGFydChhcCwgbWVzc2FnZSk7Ci0gIGludCBydmFsID0gdnNucHJpbnRmKGhlYXBfYnVmLCBuZWVkKzEsIG1lc3NhZ2UsIGFwKTsKLSAgdmFfZW5kKGFwKTsKLSAgLy8gVE9ETyhzaGlnaW4pOiBpbmZvcm0gdXNlcgotICBpZiAocnZhbCAhPSAtMSkgewotICAgIGZfKGhlYXBfYnVmKTsKLSAgfQotICBmcmVlKGhlYXBfYnVmKTsKLSNlbmRpZgotfQotCi12b2lkIFRPdXRwdXQ6OmVycm9yVGltZVdyYXBwZXIoY29uc3QgY2hhciogbXNnKSB7Ci0jaWZuZGVmIFRIUklGVF9TUVVFTENIX0NPTlNPTEVfT1VUUFVUCi0gIHRpbWVfdCBub3c7Ci0gIGNoYXIgZGJndGltZVsyNl07Ci0gIHRpbWUoJm5vdyk7Ci0gIFRIUklGVF9DVElNRV9SKCZub3csIGRiZ3RpbWUpOwotICBkYmd0aW1lWzI0XSA9IDA7Ci0gIGZwcmludGYoc3RkZXJyLCAiVGhyaWZ0OiAlcyAlc1xuIiwgZGJndGltZSwgbXNnKTsKLSNlbmRpZgotfQotCi12b2lkIFRPdXRwdXQ6OnBlcnJvcihjb25zdCBjaGFyICptZXNzYWdlLCBpbnQgZXJybm9fY29weSkgewotICBzdGQ6OnN0cmluZyBvdXQgPSBtZXNzYWdlICsgc3RyZXJyb3JfcyhlcnJub19jb3B5KTsKLSAgZl8ob3V0LmNfc3RyKCkpOwotfQotCi1zdGQ6OnN0cmluZyBUT3V0cHV0OjpzdHJlcnJvcl9zKGludCBlcnJub19jb3B5KSB7Ci0jaWZuZGVmIEhBVkVfU1RSRVJST1JfUgotICByZXR1cm4gImVycm5vID0gIiArIGJvb3N0OjpsZXhpY2FsX2Nhc3Q8c3RkOjpzdHJpbmc+KGVycm5vX2NvcHkpOwotI2Vsc2UgIC8vIEhBVkVfU1RSRVJST1JfUgotCi0gIGNoYXIgYl9lcnJidWZbMTAyNF0gPSB7ICdcMCcgfTsKLSNpZmRlZiBTVFJFUlJPUl9SX0NIQVJfUAotICBjaGFyICpiX2Vycm9yID0gc3RyZXJyb3JfcihlcnJub19jb3B5LCBiX2VycmJ1Ziwgc2l6ZW9mKGJfZXJyYnVmKSk7Ci0jZWxzZQotICBjaGFyICpiX2Vycm9yID0gYl9lcnJidWY7Ci0gIGludCBydiA9IHN0cmVycm9yX3IoZXJybm9fY29weSwgYl9lcnJidWYsIHNpemVvZihiX2VycmJ1ZikpOwotICBpZiAocnYgPT0gLTEpIHsKLSAgICAvLyBzdHJlcnJvcl9yIGZhaWxlZC4gIG9tZ3d0ZmJicS4KLSAgICByZXR1cm4gIlhTSS1jb21wbGlhbnQgc3RyZXJyb3JfcigpIGZhaWxlZCB3aXRoIGVycm5vID0gIiArCi0gICAgICBib29zdDo6bGV4aWNhbF9jYXN0PHN0ZDo6c3RyaW5nPihlcnJub19jb3B5KTsKLSAgfQotI2VuZGlmCi0gIC8vIENhbiBhbnlvbmUgcHJvdmUgdGhhdCBleHBsaWNpdCBjYXN0IGlzIHByb2JhYmx5IG5vdCBuZWNlc3NhcnkKLSAgLy8gdG8gZW5zdXJlIHRoYXQgdGhlIHN0cmluZyBvYmplY3QgaXMgY29uc3RydWN0ZWQgYmVmb3JlCi0gIC8vIGJfZXJyb3IgYmVjb21lcyBpbnZhbGlkPwotICByZXR1cm4gc3RkOjpzdHJpbmcoYl9lcnJvcik7Ci0KLSNlbmRpZiAgLy8gSEFWRV9TVFJFUlJPUl9SCi19Ci0KLX19IC8vIGFwYWNoZTo6dGhyaWZ0CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvVGhyaWZ0LmggYi9saWIvY3BwL3NyYy90aHJpZnQvVGhyaWZ0LmgKaW5kZXggNGQ4ZDg3Yy4uNjMyMjc0MiAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L1RocmlmdC5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9UaHJpZnQuaApAQCAtNDIsMTExICs0Miw0NiBAQAogI2luY2x1ZGUgPGV4Y2VwdGlvbj4KICNpbmNsdWRlIDx0eXBlaW5mbz4KIAotI2luY2x1ZGUgPGJvb3N0L3V0aWxpdHkvZW5hYmxlX2lmLmhwcD4KLSNpbmNsdWRlIDxib29zdC90eXBlX3RyYWl0cy9pc19jb252ZXJ0aWJsZS5ocHA+Ci0KICNpbmNsdWRlIDx0aHJpZnQvVExvZ2dpbmcuaD4KLQotLyoqCi0gKiBIZWxwZXIgbWFjcm9zIHRvIGFsbG93IGZ1bmN0aW9uIG92ZXJsb2FkaW5nIGV2ZW4gd2hlbiB1c2luZwotICogYm9vc3Q6OnNoYXJlZF9wdHIuCi0gKgotICogc2hhcmVkX3B0ciBtYWtlcyBvdmVybG9hZGluZyByZWFsbHkgYW5ub3lpbmcsIHNpbmNlIHNoYXJlZF9wdHIgZGVmaW5lcwotICogY29uc3RydWN0b3IgbWV0aG9kcyB0byBhbGxvdyBvbmUgc2hhcmVkX3B0ciB0eXBlIHRvIGJlIGNvbnN0cnVjdGVkIGZyb20gYW55Ci0gKiBvdGhlciBzaGFyZWRfcHRyIHR5cGUuICAoRXZlbiBpZiBpdCB3b3VsZCBiZSBhIGNvbXBpbGUgZXJyb3IgdG8gYWN0dWFsbHkgdHJ5Ci0gKiB0byBpbnN0YW50aWF0ZSB0aGUgY29uc3RydWN0b3IuKSAgVGhlc2UgbWFjcm9zIGFkZCBhbiBleHRyYSBhcmd1bWVudCB0byB0aGUKLSAqIGZ1bmN0aW9uIHRvIGNhdXNlIGl0IHRvIG9ubHkgYmUgaW5zdGFudGlhdGVkIGlmIGEgcG9pbnRlciBvZiB0eXBlIFQgaXMKLSAqIGNvbnZlcnRpYmxlIHRvIGEgcG9pbnRlciBvZiB0eXBlIFUuCi0gKgotICogVEhSSUZUX09WRVJMT0FEX0lGIHNob3VsZCBiZSB1c2VkIGluIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucy4KLSAqIFRIUklGVF9PVkVSTE9BRF9JRl9ERUZOIHNob3VsZCBiZSB1c2VkIGluIHRoZSBmdW5jdGlvbiBkZWZpbml0aW9uLCBpZiBpdCBpcwotICogZGVmaW5lZCBzZXBhcmF0ZWx5IGZyb20gd2hlcmUgaXQgaXMgZGVjbGFyZWQuCi0gKi8KLSNkZWZpbmUgVEhSSUZUX09WRVJMT0FEX0lGX0RFRk4oVCwgWSkgXAotICB0eXBlbmFtZSA6OmJvb3N0OjplbmFibGVfaWY8dHlwZW5hbWUgOjpib29zdDo6aXNfY29udmVydGlibGU8VCosIFkqPjo6dHlwZSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCo+Ojp0eXBlCi0KLSNkZWZpbmUgVEhSSUZUX09WRVJMT0FEX0lGKFQsIFkpIFwKLSAgVEhSSUZUX09WRVJMT0FEX0lGX0RFRk4oVCwgWSkgPSBOVUxMCisjaW5jbHVkZSA8dGhyaWZ0L1RPdXRwdXQuaD4KIAogI2RlZmluZSBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFKHgpICgodm9pZCkoeCkpCiAKLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CiAKLWNsYXNzIFRFbnVtSXRlcmF0b3IgOiBwdWJsaWMgc3RkOjppdGVyYXRvcjxzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnLCBzdGQ6OnBhaXI8aW50LCBjb25zdCBjaGFyKj4gPiB7Ci0gcHVibGljOgotICBURW51bUl0ZXJhdG9yKGludCBuLAotICAgICAgICAgICAgICAgIGludCogZW51bXMsCi0gICAgICAgICAgICAgICAgY29uc3QgY2hhcioqIG5hbWVzKSA6Ci0gICAgICBpaV8oMCksIG5fKG4pLCBlbnVtc18oZW51bXMpLCBuYW1lc18obmFtZXMpIHsKLSAgfQorY2xhc3MgVEVudW1JdGVyYXRvcgorICAgIDogcHVibGljIHN0ZDo6aXRlcmF0b3I8c3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZywgc3RkOjpwYWlyPGludCwgY29uc3QgY2hhcio+ID4geworcHVibGljOgorICBURW51bUl0ZXJhdG9yKGludCBuLCBpbnQqIGVudW1zLCBjb25zdCBjaGFyKiogbmFtZXMpCisgICAgOiBpaV8oMCksIG5fKG4pLCBlbnVtc18oZW51bXMpLCBuYW1lc18obmFtZXMpIHt9CiAKLSAgaW50IG9wZXJhdG9yICsrKCkgewotICAgIHJldHVybiArK2lpXzsKLSAgfQorICBpbnQgb3BlcmF0b3IrKygpIHsgcmV0dXJuICsraWlfOyB9CiAKLSAgYm9vbCBvcGVyYXRvciAhPShjb25zdCBURW51bUl0ZXJhdG9yJiBlbmQpIHsKLSAgICAodm9pZCllbmQ7ICAvLyBhdm9pZCAidW51c2VkIiB3YXJuaW5nIHdpdGggTkRFQlVHCisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBURW51bUl0ZXJhdG9yJiBlbmQpIHsKKyAgICBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFKGVuZCk7CiAgICAgYXNzZXJ0KGVuZC5uXyA9PSAtMSk7CiAgICAgcmV0dXJuIChpaV8gIT0gbl8pOwogICB9CiAKLSAgc3RkOjpwYWlyPGludCwgY29uc3QgY2hhcio+IG9wZXJhdG9yKigpIGNvbnN0IHsKLSAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoZW51bXNfW2lpX10sIG5hbWVzX1tpaV9dKTsKLSAgfQorICBzdGQ6OnBhaXI8aW50LCBjb25zdCBjaGFyKj4gb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gc3RkOjptYWtlX3BhaXIoZW51bXNfW2lpX10sIG5hbWVzX1tpaV9dKTsgfQogCi0gcHJpdmF0ZToKK3ByaXZhdGU6CiAgIGludCBpaV87CiAgIGNvbnN0IGludCBuXzsKICAgaW50KiBlbnVtc187CiAgIGNvbnN0IGNoYXIqKiBuYW1lc187CiB9OwogCi1jbGFzcyBUT3V0cHV0IHsKLSBwdWJsaWM6Ci0gIFRPdXRwdXQoKSA6IGZfKCZlcnJvclRpbWVXcmFwcGVyKSB7fQotCi0gIGlubGluZSB2b2lkIHNldE91dHB1dEZ1bmN0aW9uKHZvaWQgKCpmdW5jdGlvbikoY29uc3QgY2hhciAqKSl7Ci0gICAgZl8gPSBmdW5jdGlvbjsKLSAgfQotCi0gIGlubGluZSB2b2lkIG9wZXJhdG9yKCkoY29uc3QgY2hhciAqbWVzc2FnZSl7Ci0gICAgZl8obWVzc2FnZSk7Ci0gIH0KLQotICAvLyBJdCBpcyBpbXBvcnRhbnQgdG8gaGF2ZSBhIGNvbnN0IGNoYXIqIG92ZXJsb2FkIGhlcmUgaW5zdGVhZCBvZgotICAvLyBqdXN0IHRoZSBzdHJpbmcgdmVyc2lvbiwgb3RoZXJ3aXNlIGVycm5vIGNvdWxkIGJlIGNvcnJ1cHRlZAotICAvLyBpZiB0aGVyZSBpcyBzb21lIHByb2JsZW0gYWxsb2NhdGluZyBtZW1vcnkgd2hlbiBjb25zdHJ1Y3RpbmcKLSAgLy8gdGhlIHN0cmluZy4KLSAgdm9pZCBwZXJyb3IoY29uc3QgY2hhciAqbWVzc2FnZSwgaW50IGVycm5vX2NvcHkpOwotICBpbmxpbmUgdm9pZCBwZXJyb3IoY29uc3Qgc3RkOjpzdHJpbmcgJm1lc3NhZ2UsIGludCBlcnJub19jb3B5KSB7Ci0gICAgcGVycm9yKG1lc3NhZ2UuY19zdHIoKSwgZXJybm9fY29weSk7Ci0gIH0KLQotICB2b2lkIHByaW50Zihjb25zdCBjaGFyICptZXNzYWdlLCAuLi4pOwotCi0gIHN0YXRpYyB2b2lkIGVycm9yVGltZVdyYXBwZXIoY29uc3QgY2hhciogbXNnKTsKLQotICAvKiogSnVzdCBsaWtlIHN0cmVycm9yX3IgYnV0IHJldHVybnMgYSBDKysgc3RyaW5nIG9iamVjdC4gKi8KLSAgc3RhdGljIHN0ZDo6c3RyaW5nIHN0cmVycm9yX3MoaW50IGVycm5vX2NvcHkpOwotCi0gcHJpdmF0ZToKLSAgdm9pZCAoKmZfKShjb25zdCBjaGFyICopOwotfTsKLQotZXh0ZXJuIFRPdXRwdXQgR2xvYmFsT3V0cHV0OwotCiBjbGFzcyBURXhjZXB0aW9uIDogcHVibGljIHN0ZDo6ZXhjZXB0aW9uIHsKLSBwdWJsaWM6Ci0gIFRFeGNlcHRpb24oKToKLSAgICBtZXNzYWdlXygpIHt9CitwdWJsaWM6CisgIFRFeGNlcHRpb24oKSA6IG1lc3NhZ2VfKCkge30KIAotICBURXhjZXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSA6Ci0gICAgbWVzc2FnZV8obWVzc2FnZSkge30KKyAgVEV4Y2VwdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkgOiBtZXNzYWdlXyhtZXNzYWdlKSB7fQogCi0gIHZpcnR1YWwgflRFeGNlcHRpb24oKSB0aHJvdygpIHt9CisgIHZpcnR1YWwgflRFeGNlcHRpb24oKSBub2V4Y2VwdCB7fQogCi0gIHZpcnR1YWwgY29uc3QgY2hhciogd2hhdCgpIGNvbnN0IHRocm93KCkgeworICB2aXJ0dWFsIGNvbnN0IGNoYXIqIHdoYXQoKSBjb25zdCBub2V4Y2VwdCB7CiAgICAgaWYgKG1lc3NhZ2VfLmVtcHR5KCkpIHsKICAgICAgIHJldHVybiAiRGVmYXVsdCBURXhjZXB0aW9uLiI7CiAgICAgfSBlbHNlIHsKQEAgLTE1NCwzMyArODksMjkgQEAKICAgICB9CiAgIH0KIAotIHByb3RlY3RlZDoKK3Byb3RlY3RlZDoKICAgc3RkOjpzdHJpbmcgbWVzc2FnZV87Ci0KIH07CiAKLQotLy8gRm9yd2FyZCBkZWNsYXJlIHRoaXMgc3RydWN0dXJlIHVzZWQgYnkgVERlbnNlUHJvdG9jb2wKLW5hbWVzcGFjZSByZWZsZWN0aW9uIHsgbmFtZXNwYWNlIGxvY2FsIHsKLXN0cnVjdCBUeXBlU3BlYzsKLX19Ci0KIGNsYXNzIFREZWxheWVkRXhjZXB0aW9uIHsKLSBwdWJsaWM6Ci0gIHRlbXBsYXRlIDxjbGFzcyBFPiBzdGF0aWMgVERlbGF5ZWRFeGNlcHRpb24qIGRlbGF5RXhjZXB0aW9uKGNvbnN0IEUmIGUpOworcHVibGljOgorICB0ZW1wbGF0ZSA8Y2xhc3MgRT4KKyAgc3RhdGljIFREZWxheWVkRXhjZXB0aW9uKiBkZWxheUV4Y2VwdGlvbihjb25zdCBFJiBlKTsKICAgdmlydHVhbCB2b2lkIHRocm93X2l0KCkgPSAwOwotICB2aXJ0dWFsIH5URGVsYXllZEV4Y2VwdGlvbigpIHt9OworICB2aXJ0dWFsIH5URGVsYXllZEV4Y2VwdGlvbigpe307CiB9OwogCi10ZW1wbGF0ZSA8Y2xhc3MgRT4gY2xhc3MgVEV4Y2VwdGlvbldyYXBwZXIgOiBwdWJsaWMgVERlbGF5ZWRFeGNlcHRpb24gewotIHB1YmxpYzoKK3RlbXBsYXRlIDxjbGFzcyBFPgorY2xhc3MgVEV4Y2VwdGlvbldyYXBwZXIgOiBwdWJsaWMgVERlbGF5ZWRFeGNlcHRpb24geworcHVibGljOgogICBURXhjZXB0aW9uV3JhcHBlcihjb25zdCBFJiBlKSA6IGVfKGUpIHt9CiAgIHZpcnR1YWwgdm9pZCB0aHJvd19pdCgpIHsKICAgICBFIHRlbXAoZV8pOwogICAgIGRlbGV0ZSB0aGlzOwogICAgIHRocm93IHRlbXA7CiAgIH0KLSBwcml2YXRlOgorCitwcml2YXRlOgogICBFIGVfOwogfTsKIApAQCAtMTkxLDEzICsxMjIsMTIgQEAKIAogI2lmIFRfR0xPQkFMX0RFQlVHX1ZJUlRVQUwgPiAxCiB2b2lkIHByb2ZpbGVfdmlydHVhbF9jYWxsKGNvbnN0IHN0ZDo6dHlwZV9pbmZvJiBpbmZvKTsKLXZvaWQgcHJvZmlsZV9nZW5lcmljX3Byb3RvY29sKGNvbnN0IHN0ZDo6dHlwZV9pbmZvJiB0ZW1wbGF0ZV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp0eXBlX2luZm8mIHByb3RfdHlwZSk7Ci12b2lkIHByb2ZpbGVfcHJpbnRfaW5mbyhGSUxFICpmKTsKK3ZvaWQgcHJvZmlsZV9nZW5lcmljX3Byb3RvY29sKGNvbnN0IHN0ZDo6dHlwZV9pbmZvJiB0ZW1wbGF0ZV90eXBlLCBjb25zdCBzdGQ6OnR5cGVfaW5mbyYgcHJvdF90eXBlKTsKK3ZvaWQgcHJvZmlsZV9wcmludF9pbmZvKEZJTEUqIGYpOwogdm9pZCBwcm9maWxlX3ByaW50X2luZm8oKTsKIHZvaWQgcHJvZmlsZV93cml0ZV9wcHJvZihGSUxFKiBnZW5fY2FsbHNfZiwgRklMRSogdmlydHVhbF9jYWxsc19mKTsKICNlbmRpZgotCi19fSAvLyBhcGFjaGU6OnRocmlmdAorfQorfSAvLyBhcGFjaGU6OnRocmlmdAogCiAjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RIUklGVF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L1ZpcnR1YWxQcm9maWxpbmcuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L1ZpcnR1YWxQcm9maWxpbmcuY3BwCmluZGV4IDE4MGNmYjcuLjZjZTM0NmIgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9WaXJ0dWFsUHJvZmlsaW5nLmNwcAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvVmlydHVhbFByb2ZpbGluZy5jcHAKQEAgLTM1LDE0ICszNSwxNCBAQAogI2Vycm9yICJUaHJpZnQgdmlydHVhbCBmdW5jdGlvbiBwcm9maWxpbmcgY3VycmVudGx5IHJlcXVpcmVzIGdsaWJjIgogI2VuZGlmIC8vICFfX0dMSUJDX18KIAotCiAjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L011dGV4Lmg+CiAKICNpbmNsdWRlIDxleHQvaGFzaF9tYXA+CiAjaW5jbHVkZSA8ZXhlY2luZm8uaD4KICNpbmNsdWRlIDxzdGRpby5oPgogCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgewogCiB1c2luZyA6OmFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6TXV0ZXg7CiB1c2luZyA6OmFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6R3VhcmQ7CkBAIC01MywyMCArNTMsMTggQEAKICAqIEEgc3RhY2sgdHJhY2UKICAqLwogY2xhc3MgQmFja3RyYWNlIHsKLSBwdWJsaWM6CitwdWJsaWM6CiAgIEJhY2t0cmFjZShpbnQgc2tpcCA9IDApOwotICBCYWNrdHJhY2UoQmFja3RyYWNlIGNvbnN0ICZidCk7CisgIEJhY2t0cmFjZShCYWNrdHJhY2UgY29uc3QmIGJ0KTsKIAotICB2b2lkIG9wZXJhdG9yPShCYWNrdHJhY2UgY29uc3QgJmJ0KSB7CisgIHZvaWQgb3BlcmF0b3I9KEJhY2t0cmFjZSBjb25zdCYgYnQpIHsKICAgICBudW1DYWxsZXJzXyA9IGJ0Lm51bUNhbGxlcnNfOwogICAgIGlmIChudW1DYWxsZXJzXyA+PSAwKSB7CiAgICAgICBtZW1jcHkoY2FsbGVyc18sIGJ0LmNhbGxlcnNfLCBudW1DYWxsZXJzXyAqIHNpemVvZih2b2lkKikpOwogICAgIH0KICAgfQogCi0gIGJvb2wgb3BlcmF0b3I9PShCYWNrdHJhY2UgY29uc3QgJmJ0KSBjb25zdCB7Ci0gICAgcmV0dXJuIChjbXAoYnQpID09IDApOwotICB9CisgIGJvb2wgb3BlcmF0b3I9PShCYWNrdHJhY2UgY29uc3QmIGJ0KSBjb25zdCB7IHJldHVybiAoY21wKGJ0KSA9PSAwKTsgfQogCiAgIHNpemVfdCBoYXNoKCkgY29uc3QgewogICAgIGludHB0cl90IHJldCA9IDA7CkBAIC04Myw4ICs4MSw4IEBACiAgICAgfQogCiAgICAgZm9yIChpbnQgbiA9IDA7IG4gPCBudW1DYWxsZXJzXzsgKytuKSB7Ci0gICAgICBpbnQgZGlmZiA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KGNhbGxlcnNfW25dKSAtCi0gICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KGJ0LmNhbGxlcnNfW25dKTsKKyAgICAgIGludCBkaWZmID0gcmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oY2FsbGVyc19bbl0pCisgICAgICAgICAgICAgICAgIC0gcmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oYnQuY2FsbGVyc19bbl0pOwogICAgICAgaWYgKGRpZmYgIT0gMCkgewogICAgICAgICByZXR1cm4gZGlmZjsKICAgICAgIH0KQEAgLTkzLDggKzkxLDggQEAKICAgICByZXR1cm4gMDsKICAgfQogCi0gIHZvaWQgcHJpbnQoRklMRSAqZiwgaW50IGluZGVudD0wLCBpbnQgc3RhcnQ9MCkgY29uc3QgewotICAgIGNoYXIgKipzdHJpbmdzID0gYmFja3RyYWNlX3N5bWJvbHMoY2FsbGVyc18sIG51bUNhbGxlcnNfKTsKKyAgdm9pZCBwcmludChGSUxFKiBmLCBpbnQgaW5kZW50ID0gMCwgaW50IHN0YXJ0ID0gMCkgY29uc3QgeworICAgIGNoYXIqKiBzdHJpbmdzID0gYmFja3RyYWNlX3N5bWJvbHMoY2FsbGVyc18sIG51bUNhbGxlcnNfKTsKICAgICBpZiAoc3RyaW5ncykgewogICAgICAgc3RhcnQgKz0gc2tpcF87CiAgICAgICBpZiAoc3RhcnQgPCAwKSB7CkBAIC0xMDksMTEgKzEwNyw5IEBACiAgICAgfQogICB9CiAKLSAgaW50IGdldERlcHRoKCkgY29uc3QgewotICAgIHJldHVybiBudW1DYWxsZXJzXyAtIHNraXBfOwotICB9CisgIGludCBnZXREZXB0aCgpIGNvbnN0IHsgcmV0dXJuIG51bUNhbGxlcnNfIC0gc2tpcF87IH0KIAotICB2b2lkICpnZXRGcmFtZShpbnQgaW5kZXgpIGNvbnN0IHsKKyAgdm9pZCogZ2V0RnJhbWUoaW50IGluZGV4KSBjb25zdCB7CiAgICAgaW50IGFkanVzdGVkX2luZGV4ID0gaW5kZXggKyBza2lwXzsKICAgICBpZiAoYWRqdXN0ZWRfaW5kZXggPCAwIHx8IGFkanVzdGVkX2luZGV4ID49IG51bUNhbGxlcnNfKSB7CiAgICAgICByZXR1cm4gTlVMTDsKQEAgLTEyMSw4ICsxMTcsOCBAQAogICAgIHJldHVybiBjYWxsZXJzX1thZGp1c3RlZF9pbmRleF07CiAgIH0KIAotIHByaXZhdGU6Ci0gIHZvaWQgKmNhbGxlcnNfW01BWF9TVEFDS19ERVBUSF07Citwcml2YXRlOgorICB2b2lkKiBjYWxsZXJzX1tNQVhfU1RBQ0tfREVQVEhdOwogICBpbnQgbnVtQ2FsbGVyc187CiAgIGludCBza2lwXzsKIH07CkBAIC0xMzgsOSArMTM0LDcgQEAKICAgfQogfQogCi1CYWNrdHJhY2U6OkJhY2t0cmFjZShCYWNrdHJhY2UgY29uc3QgJmJ0KQotICA6IG51bUNhbGxlcnNfKGJ0Lm51bUNhbGxlcnNfKQotICAsIHNraXBfKGJ0LnNraXBfKSB7CitCYWNrdHJhY2U6OkJhY2t0cmFjZShCYWNrdHJhY2UgY29uc3QmIGJ0KSA6IG51bUNhbGxlcnNfKGJ0Lm51bUNhbGxlcnNfKSwgc2tpcF8oYnQuc2tpcF8pIHsKICAgaWYgKG51bUNhbGxlcnNfID49IDApIHsKICAgICBtZW1jcHkoY2FsbGVyc18sIGJ0LmNhbGxlcnNfLCBudW1DYWxsZXJzXyAqIHNpemVvZih2b2lkKikpOwogICB9CkBAIC0xNTAsMzIgKzE0NCwyMCBAQAogICogQSBiYWNrdHJhY2UsIHBsdXMgb25lIG9yIHR3byB0eXBlIG5hbWVzCiAgKi8KIGNsYXNzIEtleSB7Ci0gcHVibGljOgorcHVibGljOgogICBjbGFzcyBIYXNoIHsKLSAgIHB1YmxpYzoKLSAgICBzaXplX3Qgb3BlcmF0b3IoKShLZXkgY29uc3QmIGspIGNvbnN0IHsKLSAgICAgIHJldHVybiBrLmhhc2goKTsKLSAgICB9CisgIHB1YmxpYzoKKyAgICBzaXplX3Qgb3BlcmF0b3IoKShLZXkgY29uc3QmIGspIGNvbnN0IHsgcmV0dXJuIGsuaGFzaCgpOyB9CiAgIH07CiAKICAgS2V5KGNvbnN0IEJhY2t0cmFjZSogYnQsIGNvbnN0IHN0ZDo6dHlwZV9pbmZvJiB0eXBlX2luZm8pCi0gICAgOiBiYWNrdHJhY2VfKGJ0KQotICAgICwgdHlwZU5hbWUxXyh0eXBlX2luZm8ubmFtZSgpKQotICAgICwgdHlwZU5hbWUyXyhOVUxMKSB7Ci0gIH0KKyAgICA6IGJhY2t0cmFjZV8oYnQpLCB0eXBlTmFtZTFfKHR5cGVfaW5mby5uYW1lKCkpLCB0eXBlTmFtZTJfKE5VTEwpIHt9CiAKLSAgS2V5KGNvbnN0IEJhY2t0cmFjZSogYnQsIGNvbnN0IHN0ZDo6dHlwZV9pbmZvJiB0eXBlX2luZm8xLAotICAgICAgY29uc3Qgc3RkOjp0eXBlX2luZm8mIHR5cGVfaW5mbzIpCi0gICAgOiBiYWNrdHJhY2VfKGJ0KQotICAgICwgdHlwZU5hbWUxXyh0eXBlX2luZm8xLm5hbWUoKSkKLSAgICAsIHR5cGVOYW1lMl8odHlwZV9pbmZvMi5uYW1lKCkpIHsKLSAgfQorICBLZXkoY29uc3QgQmFja3RyYWNlKiBidCwgY29uc3Qgc3RkOjp0eXBlX2luZm8mIHR5cGVfaW5mbzEsIGNvbnN0IHN0ZDo6dHlwZV9pbmZvJiB0eXBlX2luZm8yKQorICAgIDogYmFja3RyYWNlXyhidCksIHR5cGVOYW1lMV8odHlwZV9pbmZvMS5uYW1lKCkpLCB0eXBlTmFtZTJfKHR5cGVfaW5mbzIubmFtZSgpKSB7fQogCiAgIEtleShjb25zdCBLZXkmIGspCi0gICAgOiBiYWNrdHJhY2VfKGsuYmFja3RyYWNlXykKLSAgICAsIHR5cGVOYW1lMV8oay50eXBlTmFtZTFfKQotICAgICwgdHlwZU5hbWUyXyhrLnR5cGVOYW1lMl8pIHsKLSAgfQorICAgIDogYmFja3RyYWNlXyhrLmJhY2t0cmFjZV8pLCB0eXBlTmFtZTFfKGsudHlwZU5hbWUxXyksIHR5cGVOYW1lMl8oay50eXBlTmFtZTJfKSB7fQogCiAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IEtleSYgaykgewogICAgIGJhY2t0cmFjZV8gPSBrLmJhY2t0cmFjZV87CkBAIC0xODMsMTcgKzE2NSwxMSBAQAogICAgIHR5cGVOYW1lMl8gPSBrLnR5cGVOYW1lMl87CiAgIH0KIAotICBjb25zdCBCYWNrdHJhY2UqIGdldEJhY2t0cmFjZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gYmFja3RyYWNlXzsKLSAgfQorICBjb25zdCBCYWNrdHJhY2UqIGdldEJhY2t0cmFjZSgpIGNvbnN0IHsgcmV0dXJuIGJhY2t0cmFjZV87IH0KIAotICBjb25zdCBjaGFyKiBnZXRUeXBlTmFtZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gdHlwZU5hbWUxXzsKLSAgfQorICBjb25zdCBjaGFyKiBnZXRUeXBlTmFtZSgpIGNvbnN0IHsgcmV0dXJuIHR5cGVOYW1lMV87IH0KIAotICBjb25zdCBjaGFyKiBnZXRUeXBlTmFtZTIoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHR5cGVOYW1lMl87Ci0gIH0KKyAgY29uc3QgY2hhciogZ2V0VHlwZU5hbWUyKCkgY29uc3QgeyByZXR1cm4gdHlwZU5hbWUyXzsgfQogCiAgIHZvaWQgbWFrZVBlcnNpc3RlbnQoKSB7CiAgICAgLy8gQ29weSB0aGUgQmFja3RyYWNlIG9iamVjdApAQCAtMjMzLDIwICsyMDksMTcgQEAKICAgICByZXR1cm4gay50eXBlTmFtZTJfIC0gdHlwZU5hbWUyXzsKICAgfQogCi0gIGJvb2wgb3BlcmF0b3I9PShjb25zdCBLZXkmIGspIGNvbnN0IHsKLSAgICByZXR1cm4gY21wKGspID09IDA7Ci0gIH0KKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEtleSYgaykgY29uc3QgeyByZXR1cm4gY21wKGspID09IDA7IH0KIAogICBzaXplX3QgaGFzaCgpIGNvbnN0IHsKICAgICAvLyBOT1RFOiBBcyBhYm92ZSwgd2UganVzdCB1c2UgdGhlIG5hbWUgcG9pbnRlciB2YWx1ZS4KICAgICAvLyBXb3JrcyB3aXRoIEdOVSBsaWJzdGRjKyssIGJ1dCBub3QgZ3VhcmFudGVlZCB0byBiZSBjb3JyZWN0IG9uIGFsbAogICAgIC8vIGltcGxlbWVudGF0aW9ucy4KLSAgICByZXR1cm4gYmFja3RyYWNlXy0+aGFzaCgpIF4KLSAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8c2l6ZV90Pih0eXBlTmFtZTFfKSBeCi0gICAgICByZWludGVycHJldF9jYXN0PHNpemVfdD4odHlwZU5hbWUyXyk7CisgICAgcmV0dXJuIGJhY2t0cmFjZV8tPmhhc2goKSBeIHJlaW50ZXJwcmV0X2Nhc3Q8c2l6ZV90Pih0eXBlTmFtZTFfKQorICAgICAgICAgICBeIHJlaW50ZXJwcmV0X2Nhc3Q8c2l6ZV90Pih0eXBlTmFtZTJfKTsKICAgfQogCi0gcHJpdmF0ZToKK3ByaXZhdGU6CiAgIGNvbnN0IEJhY2t0cmFjZSogYmFja3RyYWNlXzsKICAgY29uc3QgY2hhciogdHlwZU5hbWUxXzsKICAgY29uc3QgY2hhciogdHlwZU5hbWUyXzsKQEAgLTI1Nyw5ICsyMzAsOCBAQAogICogaGFzIGEgaGlnaGVyIGNvdW50LgogICovCiBjbGFzcyBDb3VudEdyZWF0ZXIgewotIHB1YmxpYzoKLSAgYm9vbCBvcGVyYXRvcigpKHN0ZDo6cGFpcjxLZXksIHNpemVfdD4gYnQxLAotICAgICAgICAgICAgICAgICAgc3RkOjpwYWlyPEtleSwgc2l6ZV90PiBidDIpIGNvbnN0IHsKK3B1YmxpYzoKKyAgYm9vbCBvcGVyYXRvcigpKHN0ZDo6cGFpcjxLZXksIHNpemVfdD4gYnQxLCBzdGQ6OnBhaXI8S2V5LCBzaXplX3Q+IGJ0MikgY29uc3QgewogICAgIHJldHVybiBidDEuc2Vjb25kID4gYnQyLnNlY29uZDsKICAgfQogfTsKQEAgLTI3OCw4ICsyNTAsNyBAQAogQmFja3RyYWNlTWFwIGdlbmVyaWNfY2FsbHM7CiBNdXRleCBnZW5lcmljX2NhbGxzX211dGV4OwogCi0KLXZvaWQgX3JlY29yZF9iYWNrdHJhY2UoQmFja3RyYWNlTWFwKiBtYXAsIGNvbnN0IE11dGV4JiBtdXRleCwgS2V5ICprKSB7Cit2b2lkIF9yZWNvcmRfYmFja3RyYWNlKEJhY2t0cmFjZU1hcCogbWFwLCBjb25zdCBNdXRleCYgbXV0ZXgsIEtleSogaykgewogICBHdWFyZCBndWFyZChtdXRleCk7CiAKICAgQmFja3RyYWNlTWFwOjppdGVyYXRvciBpdCA9IG1hcC0+ZmluZCgqayk7CkBAIC0zMjQsNyArMjk1LDcgQEAKICAqIFByaW50IHRoZSByZWNvcmRlZCBwcm9maWxpbmcgaW5mb3JtYXRpb24gdG8gdGhlIHNwZWNpZmllZCBmaWxlLgogICovCiB2b2lkIHByb2ZpbGVfcHJpbnRfaW5mbyhGSUxFKiBmKSB7Ci0gIHR5cGVkZWYgc3RkOjp2ZWN0b3I8IHN0ZDo6cGFpcjxLZXksIHNpemVfdD4gPiBCYWNrdHJhY2VWZWN0b3I7CisgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPEtleSwgc2l6ZV90PiA+IEJhY2t0cmFjZVZlY3RvcjsKIAogICBDb3VudEdyZWF0ZXIgaXNfZ3JlYXRlcjsKIApAQCAtMzQyLDEzICszMTMsMTQgQEAKICAgQmFja3RyYWNlVmVjdG9yIGdwX3NvcnRlZChnZW5lcmljX2NhbGxzLmJlZ2luKCksIGdlbmVyaWNfY2FsbHMuZW5kKCkpOwogICBzdGQ6OnNvcnQoZ3Bfc29ydGVkLmJlZ2luKCksIGdwX3NvcnRlZC5lbmQoKSwgaXNfZ3JlYXRlcik7CiAKLSAgZm9yIChCYWNrdHJhY2VWZWN0b3I6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gZ3Bfc29ydGVkLmJlZ2luKCk7Ci0gICAgICAgaXQgIT0gZ3Bfc29ydGVkLmVuZCgpOwotICAgICAgICsraXQpIHsKLSAgICBLZXkgY29uc3QgJmtleSA9IGl0LT5maXJzdDsKKyAgZm9yIChCYWNrdHJhY2VWZWN0b3I6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gZ3Bfc29ydGVkLmJlZ2luKCk7IGl0ICE9IGdwX3NvcnRlZC5lbmQoKTsgKytpdCkgeworICAgIEtleSBjb25zdCYga2V5ID0gaXQtPmZpcnN0OwogICAgIHNpemVfdCBjb25zdCBjb3VudCA9IGl0LT5zZWNvbmQ7Ci0gICAgZnByaW50ZihmLCAiVF9HRU5FUklDX1BST1RPQ09MOiAlenUgY2FsbHMgdG8gJXMgd2l0aCBhICVzOlxuIiwKLSAgICAgICAgICAgIGNvdW50LCBrZXkuZ2V0VHlwZU5hbWUoKSwga2V5LmdldFR5cGVOYW1lMigpKTsKKyAgICBmcHJpbnRmKGYsCisgICAgICAgICAgICAiVF9HRU5FUklDX1BST1RPQ09MOiAlenUgY2FsbHMgdG8gJXMgd2l0aCBhICVzOlxuIiwKKyAgICAgICAgICAgIGNvdW50LAorICAgICAgICAgICAga2V5LmdldFR5cGVOYW1lKCksCisgICAgICAgICAgICBrZXkuZ2V0VHlwZU5hbWUyKCkpOwogICAgIGtleS5nZXRCYWNrdHJhY2UoKS0+cHJpbnQoZiwgMik7CiAgICAgZnByaW50ZihmLCAiXG4iKTsKICAgfQpAQCAtMzU3LDEwICszMjksOCBAQAogICBCYWNrdHJhY2VWZWN0b3IgdmNfc29ydGVkKHZpcnR1YWxfY2FsbHMuYmVnaW4oKSwgdmlydHVhbF9jYWxscy5lbmQoKSk7CiAgIHN0ZDo6c29ydCh2Y19zb3J0ZWQuYmVnaW4oKSwgdmNfc29ydGVkLmVuZCgpLCBpc19ncmVhdGVyKTsKIAotICBmb3IgKEJhY2t0cmFjZVZlY3Rvcjo6Y29uc3RfaXRlcmF0b3IgaXQgPSB2Y19zb3J0ZWQuYmVnaW4oKTsKLSAgICAgICBpdCAhPSB2Y19zb3J0ZWQuZW5kKCk7Ci0gICAgICAgKytpdCkgewotICAgIEtleSBjb25zdCAma2V5ID0gaXQtPmZpcnN0OworICBmb3IgKEJhY2t0cmFjZVZlY3Rvcjo6Y29uc3RfaXRlcmF0b3IgaXQgPSB2Y19zb3J0ZWQuYmVnaW4oKTsgaXQgIT0gdmNfc29ydGVkLmVuZCgpOyArK2l0KSB7CisgICAgS2V5IGNvbnN0JiBrZXkgPSBpdC0+Zmlyc3Q7CiAgICAgc2l6ZV90IGNvbnN0IGNvdW50ID0gaXQtPnNlY29uZDsKICAgICBmcHJpbnRmKGYsICJUX1ZJUlRVQUxfQ0FMTDogJXp1IGNhbGxzIG9uICVzOlxuIiwgY291bnQsIGtleS5nZXRUeXBlTmFtZSgpKTsKICAgICBrZXkuZ2V0QmFja3RyYWNlKCktPnByaW50KGYsIDIpOwpAQCAtMzgwLDcgKzM1MCw3IEBACiAgKi8KIHN0YXRpYyB2b2lkIHByb2ZpbGVfd3JpdGVfcHByb2ZfZmlsZShGSUxFKiBmLCBCYWNrdHJhY2VNYXAgY29uc3QmIG1hcCkgewogICAvLyBXcml0ZSB0aGUgaGVhZGVyCi0gIHVpbnRwdHJfdCBoZWFkZXJbNV0gPSB7IDAsIDMsIDAsIDAsIDAgfTsKKyAgdWludHB0cl90IGhlYWRlcls1XSA9IHswLCAzLCAwLCAwLCAwfTsKICAgZndyaXRlKCZoZWFkZXIsIHNpemVvZihoZWFkZXIpLCAxLCBmKTsKIAogICAvLyBXcml0ZSB0aGUgcHJvZmlsZSByZWNvcmRzCkBAIC0zOTksMTIgKzM2OSwxMiBAQAogICB9CiAKICAgLy8gV3JpdGUgdGhlIHRyYWlsZXIKLSAgdWludHB0cl90IHRyYWlsZXJbM10gPSB7IDAsIDEsIDAgfTsKKyAgdWludHB0cl90IHRyYWlsZXJbM10gPSB7MCwgMSwgMH07CiAgIGZ3cml0ZSgmdHJhaWxlciwgc2l6ZW9mKHRyYWlsZXIpLCAxLCBmKTsKIAogICAvLyBXcml0ZSAvcHJvYy9zZWxmL21hcHMKICAgLy8gVE9ETyhzaW1wa2lucyk6IFRoaXMgb25seSB3b3JrcyBvbiBsaW51eAotICBGSUxFICpwcm9jX21hcHMgPSBmb3BlbigiL3Byb2Mvc2VsZi9tYXBzIiwgInIiKTsKKyAgRklMRSogcHJvY19tYXBzID0gZm9wZW4oIi9wcm9jL3NlbGYvbWFwcyIsICJyIik7CiAgIGlmIChwcm9jX21hcHMpIHsKICAgICB1aW50OF90IGJ1Zls0MDk2XTsKICAgICB3aGlsZSAodHJ1ZSkgewpAQCAtNDM0LDcgKzQwNCw3IEBACiAgKiAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVfdmlydHVhbF9jYWxsKCkgd2lsbCBiZSB3cml0dGVuIHRvIHRoaXMgZmlsZS4KICAqLwogdm9pZCBwcm9maWxlX3dyaXRlX3Bwcm9mKEZJTEUqIGdlbl9jYWxsc19mLCBGSUxFKiB2aXJ0dWFsX2NhbGxzX2YpIHsKLSAgdHlwZWRlZiBzdGQ6OnZlY3Rvcjwgc3RkOjpwYWlyPEtleSwgc2l6ZV90PiA+IEJhY2t0cmFjZVZlY3RvcjsKKyAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8S2V5LCBzaXplX3Q+ID4gQmFja3RyYWNlVmVjdG9yOwogCiAgIENvdW50R3JlYXRlciBpc19ncmVhdGVyOwogCkBAIC00NDksNyArNDE5LDcgQEAKICAgLy8gd3JpdGUgdGhlIGluZm8gZnJvbSB2aXJ0dWFsX2NhbGxzCiAgIHByb2ZpbGVfd3JpdGVfcHByb2ZfZmlsZSh2aXJ0dWFsX2NhbGxzX2YsIHZpcnR1YWxfY2FsbHMpOwogfQotCi19fSAvLyBhcGFjaGU6OnRocmlmdAorfQorfSAvLyBhcGFjaGU6OnRocmlmdAogCiAjZW5kaWYgLy8gVF9HTE9CQUxfUFJPRklMRV9WSVJUVUFMID4gMApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RBc3luY0J1ZmZlclByb2Nlc3Nvci5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RBc3luY0J1ZmZlclByb2Nlc3Nvci5oCmluZGV4IGFkN2M2MzkuLjljOTZiMTQgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQXN5bmNCdWZmZXJQcm9jZXNzb3IuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEFzeW5jQnVmZmVyUHJvY2Vzc29yLmgKQEAgLTIwLDI3ICsyMCwyNyBAQAogI2lmbmRlZiBfVEhSSUZUX1RBU1lOQ19CVUZGRVJfUFJPQ0VTU09SX0hfCiAjZGVmaW5lIF9USFJJRlRfVEFTWU5DX0JVRkZFUl9QUk9DRVNTT1JfSF8gMQogCi0jaW5jbHVkZSA8dGhyaWZ0L2N4eGZ1bmN0aW9uYWwuaD4KLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KLQorI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+CiAKLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIGFzeW5jIHsKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgYXN5bmMgewogCiBjbGFzcyBUQXN5bmNCdWZmZXJQcm9jZXNzb3IgewotIHB1YmxpYzoKK3B1YmxpYzoKICAgLy8gUHJvY2VzcyBkYXRhIGluICJpbiIsIHB1dHRpbmcgdGhlIHJlc3VsdCBpbiAib3V0Ii4KICAgLy8gQ2FsbCBfcmV0dXJuKHRydWUpIHdoZW4gZG9uZSwgb3IgX3JldHVybihmYWxzZSkgdG8KICAgLy8gZm9yY2VmdWxseSBjbG9zZSB0aGUgY29ubmVjdGlvbiAoaWYgYXBwbGljYWJsZSkuCiAgIC8vICJpbiIgYW5kICJvdXQiIHNob3VsZCBiZSBUTWVtb3J5QnVmZmVyIG9yIHNpbWlsYXIsCiAgIC8vIG5vdCBhIHdyYXBwZXIgYXJvdW5kIGEgc29ja2V0LgotICB2aXJ0dWFsIHZvaWQgcHJvY2VzcygKLSAgICAgIGFwYWNoZTo6dGhyaWZ0OjpzdGRjeHg6OmZ1bmN0aW9uPHZvaWQoYm9vbCBoZWFsdGh5KT4gX3JldHVybiwKLSAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRCdWZmZXJCYXNlPiBpYnVmLAotICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VEJ1ZmZlckJhc2U+IG9idWYpID0gMDsKKyAgdmlydHVhbCB2b2lkIHByb2Nlc3Moc3RkOjpmdW5jdGlvbjx2b2lkKGJvb2wgaGVhbHRoeSk+IF9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjx0cmFuc3BvcnQ6OlRCdWZmZXJCYXNlPiBpYnVmLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8dHJhbnNwb3J0OjpUQnVmZmVyQmFzZT4gb2J1ZikgPSAwOwogICB2aXJ0dWFsIH5UQXN5bmNCdWZmZXJQcm9jZXNzb3IoKSB7fQogfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojphc3luYworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6YXN5bmMKIAogI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UQVNZTkNfQlVGRkVSX1BST0NFU1NPUl9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RBc3luY0NoYW5uZWwuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RBc3luY0NoYW5uZWwuY3BwCmluZGV4IDY0ZGZlNWYuLjAxYjkxMTMgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQXN5bmNDaGFubmVsLmNwcAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEFzeW5jQ2hhbm5lbC5jcHAKQEAgLTE4LDE3ICsxOCwxOSBAQAogICovCiAKICNpbmNsdWRlIDx0aHJpZnQvYXN5bmMvVEFzeW5jQ2hhbm5lbC5oPgotI2luY2x1ZGUgPHRocmlmdC9jeHhmdW5jdGlvbmFsLmg+CiAKLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIGFzeW5jIHsKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgYXN5bmMgewogCiB2b2lkIFRBc3luY0NoYW5uZWw6OnNlbmRBbmRSZWN2TWVzc2FnZShjb25zdCBWb2lkQ2FsbGJhY2smIGNvYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRNZW1vcnlCdWZmZXIqIHNlbmRCdWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTWVtb3J5QnVmZmVyKiByZWN2QnVmKSB7Ci0gIGFwYWNoZTo6dGhyaWZ0OjpzdGRjeHg6OmZ1bmN0aW9uPHZvaWQoKT4gc2VuZF9kb25lID0KLSAgICBhcGFjaGU6OnRocmlmdDo6c3RkY3h4OjpiaW5kKCZUQXN5bmNDaGFubmVsOjpyZWN2TWVzc2FnZSwgdGhpcywgY29iLCByZWN2QnVmKTsKKyAgc3RkOjpmdW5jdGlvbjx2b2lkKCk+IHNlbmRfZG9uZQorICAgICAgPSBzdGQ6OmJpbmQoJlRBc3luY0NoYW5uZWw6OnJlY3ZNZXNzYWdlLCB0aGlzLCBjb2IsIHJlY3ZCdWYpOwogCiAgIHNlbmRNZXNzYWdlKHNlbmRfZG9uZSwgc2VuZEJ1Zik7CiB9Ci0KLX19fSAgLy8gYXBhY2hlOjp0aHJpZnQ6OmFzeW5jCit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojphc3luYwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RBc3luY0NoYW5uZWwuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQXN5bmNDaGFubmVsLmgKaW5kZXggMGYyMDJmZC4uZDdhY2U5NiAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RBc3luY0NoYW5uZWwuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEFzeW5jQ2hhbm5lbC5oCkBAIC0yMCwxOSArMjAsMjYgQEAKICNpZm5kZWYgX1RIUklGVF9BU1lOQ19UQVNZTkNDSEFOTkVMX0hfCiAjZGVmaW5lIF9USFJJRlRfQVNZTkNfVEFTWU5DQ0hBTk5FTF9IXyAxCiAKLSNpbmNsdWRlIDx0aHJpZnQvY3h4ZnVuY3Rpb25hbC5oPgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHRocmlmdC9UaHJpZnQuaD4KIAotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKIGNsYXNzIFRNZW1vcnlCdWZmZXI7Ci19fX0KK30KK30KK30KIAotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgYXN5bmMgeworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBhc3luYyB7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyOwogCiBjbGFzcyBUQXN5bmNDaGFubmVsIHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgYXBhY2hlOjp0aHJpZnQ6OnN0ZGN4eDo6ZnVuY3Rpb248dm9pZCgpPiBWb2lkQ2FsbGJhY2s7CitwdWJsaWM6CisgIHR5cGVkZWYgc3RkOjpmdW5jdGlvbjx2b2lkKCk+IFZvaWRDYWxsYmFjazsKIAogICB2aXJ0dWFsIH5UQXN5bmNDaGFubmVsKCkge30KIApAQCAtNDUsMjIgKzUyLDIzIEBACiAgICAqIFNlbmQgYSBtZXNzYWdlIG92ZXIgdGhlIGNoYW5uZWwuCiAgICAqLwogICB2aXJ0dWFsIHZvaWQgc2VuZE1lc3NhZ2UoY29uc3QgVm9pZENhbGxiYWNrJiBjb2IsCi0gICAgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlciogbWVzc2FnZSkgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlciogbWVzc2FnZSkgPSAwOwogCiAgIC8qKgogICAgKiBSZWNlaXZlIGEgbWVzc2FnZSBmcm9tIHRoZSBjaGFubmVsLgogICAgKi8KICAgdmlydHVhbCB2b2lkIHJlY3ZNZXNzYWdlKGNvbnN0IFZvaWRDYWxsYmFjayYgY29iLAotICAgIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXIqIG1lc3NhZ2UpID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXIqIG1lc3NhZ2UpID0gMDsKIAogICAvKioKICAgICogU2VuZCBhIG1lc3NhZ2Ugb3ZlciB0aGUgY2hhbm5lbCBhbmQgcmVjZWl2ZSBhIHJlc3BvbnNlLgogICAgKi8KICAgdmlydHVhbCB2b2lkIHNlbmRBbmRSZWN2TWVzc2FnZShjb25zdCBWb2lkQ2FsbGJhY2smIGNvYiwKLSAgICBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyKiBzZW5kQnVmLAotICAgIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXIqIHJlY3ZCdWYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXIqIHNlbmRCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlciogcmVjdkJ1Zik7CiB9OwotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OmFzeW5jCit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojphc3luYwogCiAjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX0FTWU5DX1RBU1lOQ0NIQU5ORUxfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQXN5bmNEaXNwYXRjaFByb2Nlc3Nvci5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RBc3luY0Rpc3BhdGNoUHJvY2Vzc29yLmgKaW5kZXggMTViNWJjZS4uNTlkYjU5NyAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RBc3luY0Rpc3BhdGNoUHJvY2Vzc29yLmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RBc3luY0Rpc3BhdGNoUHJvY2Vzc29yLmgKQEAgLTIxLDcgKzIxLDkgQEAKIAogI2luY2x1ZGUgPHRocmlmdC9hc3luYy9UQXN5bmNQcm9jZXNzb3IuaD4KIAotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgYXN5bmMgeworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBhc3luYyB7CiAKIC8qKgogICogVEFzeW5jRGlzcGF0Y2hQcm9jZXNzb3IgaXMgYSBoZWxwZXIgY2xhc3MgdG8gcGFyc2UgdGhlIG1lc3NhZ2UgaGVhZGVyIHRoZW4KQEAgLTMxLDEwICszMywxMCBAQAogICovCiB0ZW1wbGF0ZSA8Y2xhc3MgUHJvdG9jb2xfPgogY2xhc3MgVEFzeW5jRGlzcGF0Y2hQcm9jZXNzb3JUIDogcHVibGljIFRBc3luY1Byb2Nlc3NvciB7Ci0gcHVibGljOgotICB2aXJ0dWFsIHZvaWQgcHJvY2VzcyhhcGFjaGU6OnRocmlmdDo6c3RkY3h4OjpmdW5jdGlvbjx2b2lkKGJvb2wgc3VjY2Vzcyk+IF9yZXR1cm4sCi0gICAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IGluLAotICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBvdXQpIHsKK3B1YmxpYzoKKyAgdmlydHVhbCB2b2lkIHByb2Nlc3Moc3RkOjpmdW5jdGlvbjx2b2lkKGJvb2wgc3VjY2Vzcyk+IF9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IG91dCkgewogICAgIHByb3RvY29sOjpUUHJvdG9jb2wqIGluUmF3ID0gaW4uZ2V0KCk7CiAgICAgcHJvdG9jb2w6OlRQcm90b2NvbCogb3V0UmF3ID0gb3V0LmdldCgpOwogCkBAIC02MCw4ICs2Miw3IEBACiAgICAgLy8gKFRoZSBvbGQgZ2VuZXJhdGVkIHByb2Nlc3NvciBjb2RlIHVzZWQgdG8gdHJ5IHRvIHNraXAgYSBUX1NUUlVDVCBhbmQKICAgICAvLyBjb250aW51ZS4gIEhvd2V2ZXIsIHRoYXQgc2VlbXMgdW5zYWZlLikKICAgICBpZiAobXR5cGUgIT0gcHJvdG9jb2w6OlRfQ0FMTCAmJiBtdHlwZSAhPSBwcm90b2NvbDo6VF9PTkVXQVkpIHsKLSAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoInJlY2VpdmVkIGludmFsaWQgbWVzc2FnZSB0eXBlICVkIGZyb20gY2xpZW50IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbXR5cGUpOworICAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigicmVjZWl2ZWQgaW52YWxpZCBtZXNzYWdlIHR5cGUgJWQgZnJvbSBjbGllbnQiLCBtdHlwZSk7CiAgICAgICBfcmV0dXJuKGZhbHNlKTsKICAgICAgIHJldHVybjsKICAgICB9CkBAIC02OSwxNiArNzAsMTYgQEAKICAgICByZXR1cm4gdGhpcy0+ZGlzcGF0Y2hDYWxsKF9yZXR1cm4sIGluUmF3LCBvdXRSYXcsIGZuYW1lLCBzZXFpZCk7CiAgIH0KIAotICB2b2lkIHByb2Nlc3NGYXN0KGFwYWNoZTo6dGhyaWZ0OjpzdGRjeHg6OmZ1bmN0aW9uPHZvaWQoYm9vbCBzdWNjZXNzKT4gX3JldHVybiwKLSAgICAgICAgICAgICAgICAgICBQcm90b2NvbF8qIGluLCBQcm90b2NvbF8qIG91dCkgeworICB2b2lkIHByb2Nlc3NGYXN0KHN0ZDo6ZnVuY3Rpb248dm9pZChib29sIHN1Y2Nlc3MpPiBfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgIFByb3RvY29sXyogaW4sCisgICAgICAgICAgICAgICAgICAgUHJvdG9jb2xfKiBvdXQpIHsKICAgICBzdGQ6OnN0cmluZyBmbmFtZTsKICAgICBwcm90b2NvbDo6VE1lc3NhZ2VUeXBlIG10eXBlOwogICAgIGludDMyX3Qgc2VxaWQ7CiAgICAgaW4tPnJlYWRNZXNzYWdlQmVnaW4oZm5hbWUsIG10eXBlLCBzZXFpZCk7CiAKICAgICBpZiAobXR5cGUgIT0gcHJvdG9jb2w6OlRfQ0FMTCAmJiBtdHlwZSAhPSBwcm90b2NvbDo6VF9PTkVXQVkpIHsKLSAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoInJlY2VpdmVkIGludmFsaWQgbWVzc2FnZSB0eXBlICVkIGZyb20gY2xpZW50IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbXR5cGUpOworICAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigicmVjZWl2ZWQgaW52YWxpZCBtZXNzYWdlIHR5cGUgJWQgZnJvbSBjbGllbnQiLCBtdHlwZSk7CiAgICAgICBfcmV0dXJuKGZhbHNlKTsKICAgICAgIHJldHVybjsKICAgICB9CkBAIC04NiwxMyArODcsMTUgQEAKICAgICByZXR1cm4gdGhpcy0+ZGlzcGF0Y2hDYWxsVGVtcGxhdGVkKF9yZXR1cm4sIGluLCBvdXQsIGZuYW1lLCBzZXFpZCk7CiAgIH0KIAotICB2aXJ0dWFsIHZvaWQgZGlzcGF0Y2hDYWxsKGFwYWNoZTo6dGhyaWZ0OjpzdGRjeHg6OmZ1bmN0aW9uPHZvaWQoYm9vbCBvayk+IF9yZXR1cm4sCisgIHZpcnR1YWwgdm9pZCBkaXNwYXRjaENhbGwoc3RkOjpmdW5jdGlvbjx2b2lkKGJvb2wgb2spPiBfcmV0dXJuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBpbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCogb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmbmFtZSwgaW50MzJfdCBzZXFpZCkgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNlcWlkKSA9IDA7CiAKLSAgdmlydHVhbCB2b2lkIGRpc3BhdGNoQ2FsbFRlbXBsYXRlZChhcGFjaGU6OnRocmlmdDo6c3RkY3h4OjpmdW5jdGlvbjx2b2lkKGJvb2wgb2spPiBfcmV0dXJuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3RvY29sXyogaW4sIFByb3RvY29sXyogb3V0LAorICB2aXJ0dWFsIHZvaWQgZGlzcGF0Y2hDYWxsVGVtcGxhdGVkKHN0ZDo6ZnVuY3Rpb248dm9pZChib29sIG9rKT4gX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm90b2NvbF8qIGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3RvY29sXyogb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNlcWlkKSA9IDA7CiB9OwpAQCAtMTAyLDEwICsxMDUsMTAgQEAKICAqIHRoYXQgZG9lc24ndCBib3RoZXIgdHJ5aW5nIHRvIHBlcmZvcm0gYSBkeW5hbWljX2Nhc3QuCiAgKi8KIGNsYXNzIFRBc3luY0Rpc3BhdGNoUHJvY2Vzc29yIDogcHVibGljIFRBc3luY1Byb2Nlc3NvciB7Ci0gcHVibGljOgotICB2aXJ0dWFsIHZvaWQgcHJvY2VzcyhhcGFjaGU6OnRocmlmdDo6c3RkY3h4OjpmdW5jdGlvbjx2b2lkKGJvb2wgc3VjY2Vzcyk+IF9yZXR1cm4sCi0gICAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IGluLAotICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBvdXQpIHsKK3B1YmxpYzoKKyAgdmlydHVhbCB2b2lkIHByb2Nlc3Moc3RkOjpmdW5jdGlvbjx2b2lkKGJvb2wgc3VjY2Vzcyk+IF9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IG91dCkgewogICAgIHByb3RvY29sOjpUUHJvdG9jb2wqIGluUmF3ID0gaW4uZ2V0KCk7CiAgICAgcHJvdG9jb2w6OlRQcm90b2NvbCogb3V0UmF3ID0gb3V0LmdldCgpOwogCkBAIC0xMjAsOCArMTIzLDcgQEAKICAgICAvLyAoVGhlIG9sZCBnZW5lcmF0ZWQgcHJvY2Vzc29yIGNvZGUgdXNlZCB0byB0cnkgdG8gc2tpcCBhIFRfU1RSVUNUIGFuZAogICAgIC8vIGNvbnRpbnVlLiAgSG93ZXZlciwgdGhhdCBzZWVtcyB1bnNhZmUuKQogICAgIGlmIChtdHlwZSAhPSBwcm90b2NvbDo6VF9DQUxMICYmIG10eXBlICE9IHByb3RvY29sOjpUX09ORVdBWSkgewotICAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigicmVjZWl2ZWQgaW52YWxpZCBtZXNzYWdlIHR5cGUgJWQgZnJvbSBjbGllbnQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBtdHlwZSk7CisgICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJyZWNlaXZlZCBpbnZhbGlkIG1lc3NhZ2UgdHlwZSAlZCBmcm9tIGNsaWVudCIsIG10eXBlKTsKICAgICAgIF9yZXR1cm4oZmFsc2UpOwogICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTEyOSwyMSArMTMxLDIxIEBACiAgICAgcmV0dXJuIGRpc3BhdGNoQ2FsbChfcmV0dXJuLCBpblJhdywgb3V0UmF3LCBmbmFtZSwgc2VxaWQpOwogICB9CiAKLSAgdmlydHVhbCB2b2lkIGRpc3BhdGNoQ2FsbChhcGFjaGU6OnRocmlmdDo6c3RkY3h4OjpmdW5jdGlvbjx2b2lkKGJvb2wgb2spPiBfcmV0dXJuLAorICB2aXJ0dWFsIHZvaWQgZGlzcGF0Y2hDYWxsKHN0ZDo6ZnVuY3Rpb248dm9pZChib29sIG9rKT4gX3JldHVybiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCogaW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZm5hbWUsIGludDMyX3Qgc2VxaWQpID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzZXFpZCkgPSAwOwogfTsKIAogLy8gU3BlY2lhbGl6ZSBUQXN5bmNEaXNwYXRjaFByb2Nlc3NvclQgZm9yIFRQcm90b2NvbCBhbmQgVER1bW15UHJvdG9jb2wganVzdCB0bwogLy8gdXNlIHRoZSBnZW5lcmljIFREaXNwYXRjaFByb2Nlc3Nvci4KIHRlbXBsYXRlIDw+Ci1jbGFzcyBUQXN5bmNEaXNwYXRjaFByb2Nlc3NvclQ8cHJvdG9jb2w6OlREdW1teVByb3RvY29sPiA6Ci0gIHB1YmxpYyBUQXN5bmNEaXNwYXRjaFByb2Nlc3NvciB7fTsKK2NsYXNzIFRBc3luY0Rpc3BhdGNoUHJvY2Vzc29yVDxwcm90b2NvbDo6VER1bW15UHJvdG9jb2w+IDogcHVibGljIFRBc3luY0Rpc3BhdGNoUHJvY2Vzc29yIHt9OwogdGVtcGxhdGUgPD4KLWNsYXNzIFRBc3luY0Rpc3BhdGNoUHJvY2Vzc29yVDxwcm90b2NvbDo6VFByb3RvY29sPiA6Ci0gIHB1YmxpYyBUQXN5bmNEaXNwYXRjaFByb2Nlc3NvciB7fTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojphc3luYworY2xhc3MgVEFzeW5jRGlzcGF0Y2hQcm9jZXNzb3JUPHByb3RvY29sOjpUUHJvdG9jb2w+IDogcHVibGljIFRBc3luY0Rpc3BhdGNoUHJvY2Vzc29yIHt9OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6YXN5bmMKIAogI2VuZGlmIC8vIF9USFJJRlRfQVNZTkNfVEFTWU5DRElTUEFUQ0hQUk9DRVNTT1JfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQXN5bmNQcm9jZXNzb3IuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQXN5bmNQcm9jZXNzb3IuaAppbmRleCBhMDNkMWRjLi5mZGI5NzZkIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEFzeW5jUHJvY2Vzc29yLmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RBc3luY1Byb2Nlc3Nvci5oCkBAIC0yMCw1OCArMjAsNDYgQEAKICNpZm5kZWYgX1RIUklGVF9UQVNZTkNQUk9DRVNTT1JfSF8KICNkZWZpbmUgX1RIUklGVF9UQVNZTkNQUk9DRVNTT1JfSF8gMQogCi0jaW5jbHVkZSA8dGhyaWZ0L2N4eGZ1bmN0aW9uYWwuaD4KLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KICNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmg+CisjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHRocmlmdC9UUHJvY2Vzc29yLmg+CiAKLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIGFzeW5jIHsKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgYXN5bmMgewogCiAvKioKICAqIEFzeW5jIHZlcnNpb24gb2YgYSBUUHJvY2Vzc29yLiAgSXQgaXMgbm90IGV4cGVjdGVkIHRvIGNvbXBsZXRlIGJ5IHRoZSB0aW1lCiAgKiB0aGUgY2FsbCB0byBwcm9jZXNzIHJldHVybnMuICBJbnN0ZWFkLCBpdCBjYWxscyBhIGNvYiB0byBzaWduYWwgY29tcGxldGlvbi4KICAqLwogCi1jbGFzcyBURXZlbnRTZXJ2ZXI7IC8vIGZvcndhcmQgZGVjbGFyYXRpb24KLQogY2xhc3MgVEFzeW5jUHJvY2Vzc29yIHsKLSBwdWJsaWM6CitwdWJsaWM6CiAgIHZpcnR1YWwgflRBc3luY1Byb2Nlc3NvcigpIHt9CiAKLSAgdmlydHVhbCB2b2lkIHByb2Nlc3MoYXBhY2hlOjp0aHJpZnQ6OnN0ZGN4eDo6ZnVuY3Rpb248dm9pZChib29sIHN1Y2Nlc3MpPiBfcmV0dXJuLAotICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gb3V0KSA9IDA7CisgIHZpcnR1YWwgdm9pZCBwcm9jZXNzKHN0ZDo6ZnVuY3Rpb248dm9pZChib29sIHN1Y2Nlc3MpPiBfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gaW4sCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBvdXQpID0gMDsKIAotICB2b2lkIHByb2Nlc3MoYXBhY2hlOjp0aHJpZnQ6OnN0ZGN4eDo6ZnVuY3Rpb248dm9pZChib29sIHN1Y2Nlc3MpPiBfcmV0dXJuLAotICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IGlvKSB7CisgIHZvaWQgcHJvY2VzcyhzdGQ6OmZ1bmN0aW9uPHZvaWQoYm9vbCBzdWNjZXNzKT4gX3JldHVybiwKKyAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBpbykgewogICAgIHJldHVybiBwcm9jZXNzKF9yZXR1cm4sIGlvLCBpbyk7CiAgIH0KIAotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yRXZlbnRIYW5kbGVyPiBnZXRFdmVudEhhbmRsZXIoKSB7Ci0gICAgcmV0dXJuIGV2ZW50SGFuZGxlcl87Ci0gIH0KKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3JFdmVudEhhbmRsZXI+IGdldEV2ZW50SGFuZGxlcigpIGNvbnN0IHsgcmV0dXJuIGV2ZW50SGFuZGxlcl87IH0KIAotICB2b2lkIHNldEV2ZW50SGFuZGxlcihib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yRXZlbnRIYW5kbGVyPiBldmVudEhhbmRsZXIpIHsKKyAgdm9pZCBzZXRFdmVudEhhbmRsZXIoc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3JFdmVudEhhbmRsZXI+IGV2ZW50SGFuZGxlcikgewogICAgIGV2ZW50SGFuZGxlcl8gPSBldmVudEhhbmRsZXI7CiAgIH0KIAotICBjb25zdCBURXZlbnRTZXJ2ZXIqIGdldEFzeW5jU2VydmVyKCkgewotICAgIHJldHVybiBhc3luY1NlcnZlcl87Ci0gIH0KLSBwcm90ZWN0ZWQ6Citwcm90ZWN0ZWQ6CiAgIFRBc3luY1Byb2Nlc3NvcigpIHt9CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3NvckV2ZW50SGFuZGxlcj4gZXZlbnRIYW5kbGVyXzsKLSAgY29uc3QgVEV2ZW50U2VydmVyKiBhc3luY1NlcnZlcl87Ci0gcHJpdmF0ZToKLSAgZnJpZW5kIGNsYXNzIFRFdmVudFNlcnZlcjsKLSAgdm9pZCBzZXRBc3luY1NlcnZlcihjb25zdCBURXZlbnRTZXJ2ZXIqIHNlcnZlcikgewotICAgIGFzeW5jU2VydmVyXyA9IHNlcnZlcjsKLSAgfQorICBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3NvckV2ZW50SGFuZGxlcj4gZXZlbnRIYW5kbGVyXzsKIH07CiAKIGNsYXNzIFRBc3luY1Byb2Nlc3NvckZhY3RvcnkgewotIHB1YmxpYzoKK3B1YmxpYzoKICAgdmlydHVhbCB+VEFzeW5jUHJvY2Vzc29yRmFjdG9yeSgpIHt9CiAKICAgLyoqCkBAIC04MSwxNyArNjksMTYgQEAKICAgICogYWNjZXB0ZWQgb24uICBUaGlzIGdlbmVyYWxseSBtZWFucyB0aGF0IHRoaXMgY2FsbCBkb2VzIG5vdCBuZWVkIHRvIGJlCiAgICAqIHRocmVhZCBzYWZlLCBhcyBpdCB3aWxsIGFsd2F5cyBiZSBpbnZva2VkIGZyb20gYSBzaW5nbGUgdGhyZWFkLgogICAgKi8KLSAgdmlydHVhbCBib29zdDo6c2hhcmVkX3B0cjxUQXN5bmNQcm9jZXNzb3I+IGdldFByb2Nlc3NvcigKLSAgICAgIGNvbnN0IFRDb25uZWN0aW9uSW5mbyYgY29ubkluZm8pID0gMDsKKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VEFzeW5jUHJvY2Vzc29yPiBnZXRQcm9jZXNzb3IoY29uc3QgVENvbm5lY3Rpb25JbmZvJiBjb25uSW5mbykgPSAwOwogfTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmFzeW5jCiAKLQotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OmFzeW5jCi0KLS8vIFhYWCBJJ20gbGF6eSBmb3Igbm93Ci1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7Ci11c2luZyBhcGFjaGU6OnRocmlmdDo6YXN5bmM6OlRBc3luY1Byb2Nlc3NvcjsKLX19CituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworICB1c2luZyBhcGFjaGU6OnRocmlmdDo6YXN5bmM6OlRBc3luY1Byb2Nlc3NvcjsKK30KK30KIAogI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UQVNZTkNQUk9DRVNTT1JfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQXN5bmNQcm90b2NvbFByb2Nlc3Nvci5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEFzeW5jUHJvdG9jb2xQcm9jZXNzb3IuY3BwCmluZGV4IDIwOTYyODkuLmNiNTIwMWIgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQXN5bmNQcm90b2NvbFByb2Nlc3Nvci5jcHAKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RBc3luY1Byb3RvY29sUHJvY2Vzc29yLmNwcApAQCAtMjIsMzAgKzIyLDMyIEBACiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUQnVmZmVyQmFzZTsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sOwogCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBhc3luYyB7CituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIGFzeW5jIHsKIAotdm9pZCBUQXN5bmNQcm90b2NvbFByb2Nlc3Nvcjo6cHJvY2VzcygKLSAgICBhcGFjaGU6OnRocmlmdDo6c3RkY3h4OjpmdW5jdGlvbjx2b2lkKGJvb2wgaGVhbHRoeSk+IF9yZXR1cm4sCi0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VEJ1ZmZlckJhc2U+IGlidWYsCi0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VEJ1ZmZlckJhc2U+IG9idWYpIHsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBpcHJvdChwZmFjdF8tPmdldFByb3RvY29sKGlidWYpKTsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBvcHJvdChwZmFjdF8tPmdldFByb3RvY29sKG9idWYpKTsKLSAgcmV0dXJuIHVuZGVybHlpbmdfLT5wcm9jZXNzKAotICAgICAgYXBhY2hlOjp0aHJpZnQ6OnN0ZGN4eDo6YmluZCgKLSAgICAgICAgJlRBc3luY1Byb3RvY29sUHJvY2Vzc29yOjpmaW5pc2gsCi0gICAgICAgIF9yZXR1cm4sCi0gICAgICAgIG9wcm90LAotICAgICAgICBhcGFjaGU6OnRocmlmdDo6c3RkY3h4OjpwbGFjZWhvbGRlcnM6Ol8xKSwKLSAgICAgIGlwcm90LCBvcHJvdCk7Cit2b2lkIFRBc3luY1Byb3RvY29sUHJvY2Vzc29yOjpwcm9jZXNzKHN0ZDo6ZnVuY3Rpb248dm9pZChib29sIGhlYWx0aHkpPiBfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VEJ1ZmZlckJhc2U+IGlidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUQnVmZmVyQmFzZT4gb2J1ZikgeworICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBpcHJvdChwZmFjdF8tPmdldFByb3RvY29sKGlidWYpKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gb3Byb3QocGZhY3RfLT5nZXRQcm90b2NvbChvYnVmKSk7CisgIHJldHVybiB1bmRlcmx5aW5nXworICAgICAgLT5wcm9jZXNzKHN0ZDo6YmluZCgmVEFzeW5jUHJvdG9jb2xQcm9jZXNzb3I6OmZpbmlzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHJvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6cGxhY2Vob2xkZXJzOjpfMSksCisgICAgICAgICAgICAgICAgaXByb3QsCisgICAgICAgICAgICAgICAgb3Byb3QpOwogfQogCiAvKiBzdGF0aWMgKi8gdm9pZCBUQXN5bmNQcm90b2NvbFByb2Nlc3Nvcjo6ZmluaXNoKAotICAgIGFwYWNoZTo6dGhyaWZ0OjpzdGRjeHg6OmZ1bmN0aW9uPHZvaWQoYm9vbCBoZWFsdGh5KT4gX3JldHVybiwKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IG9wcm90LAorICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChib29sIGhlYWx0aHkpPiBfcmV0dXJuLAorICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IG9wcm90LAogICAgIGJvb2wgaGVhbHRoeSkgewotICAodm9pZCkgb3Byb3Q7CisgICh2b2lkKW9wcm90OwogICAvLyBUaGlzIGlzIGEgc3R1YiBmdW5jdGlvbiB0byBob2xkIGEgcmVmZXJlbmNlIHRvIG9wcm90LgogICByZXR1cm4gX3JldHVybihoZWFsdGh5KTsKIH0KLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojphc3luYworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6YXN5bmMKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQXN5bmNQcm90b2NvbFByb2Nlc3Nvci5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RBc3luY1Byb3RvY29sUHJvY2Vzc29yLmgKaW5kZXggODQwYjRkZC4uODA1MmNmMyAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RBc3luY1Byb3RvY29sUHJvY2Vzc29yLmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RBc3luY1Byb3RvY29sUHJvY2Vzc29yLmgKQEAgLTI0LDM0ICsyNCwzMiBAQAogI2luY2x1ZGUgPHRocmlmdC9hc3luYy9UQXN5bmNCdWZmZXJQcm9jZXNzb3IuaD4KICNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmg+CiAKLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIGFzeW5jIHsKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgYXN5bmMgewogCiBjbGFzcyBUQXN5bmNQcm90b2NvbFByb2Nlc3NvciA6IHB1YmxpYyBUQXN5bmNCdWZmZXJQcm9jZXNzb3IgewotIHB1YmxpYzoKLSAgVEFzeW5jUHJvdG9jb2xQcm9jZXNzb3IoCi0gICAgICBib29zdDo6c2hhcmVkX3B0cjxUQXN5bmNQcm9jZXNzb3I+IHVuZGVybHlpbmcsCi0gICAgICBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+IHBmYWN0KQotICAgIDogdW5kZXJseWluZ18odW5kZXJseWluZykKLSAgICAsIHBmYWN0XyhwZmFjdCkKLSAge30KK3B1YmxpYzoKKyAgVEFzeW5jUHJvdG9jb2xQcm9jZXNzb3Ioc3RkOjpzaGFyZWRfcHRyPFRBc3luY1Byb2Nlc3Nvcj4gdW5kZXJseWluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4gcGZhY3QpCisgICAgOiB1bmRlcmx5aW5nXyh1bmRlcmx5aW5nKSwgcGZhY3RfKHBmYWN0KSB7fQogCi0gIHZpcnR1YWwgdm9pZCBwcm9jZXNzKAotICAgICAgYXBhY2hlOjp0aHJpZnQ6OnN0ZGN4eDo6ZnVuY3Rpb248dm9pZChib29sIGhlYWx0aHkpPiBfcmV0dXJuLAotICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VEJ1ZmZlckJhc2U+IGlidWYsCi0gICAgICBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUQnVmZmVyQmFzZT4gb2J1Zik7CisgIHZpcnR1YWwgdm9pZCBwcm9jZXNzKHN0ZDo6ZnVuY3Rpb248dm9pZChib29sIGhlYWx0aHkpPiBfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VEJ1ZmZlckJhc2U+IGlidWYsCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUQnVmZmVyQmFzZT4gb2J1Zik7CiAKICAgdmlydHVhbCB+VEFzeW5jUHJvdG9jb2xQcm9jZXNzb3IoKSB7fQogCi0gcHJpdmF0ZToKLSAgc3RhdGljIHZvaWQgZmluaXNoKAotICAgICAgYXBhY2hlOjp0aHJpZnQ6OnN0ZGN4eDo6ZnVuY3Rpb248dm9pZChib29sIGhlYWx0aHkpPiBfcmV0dXJuLAotICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IG9wcm90LAotICAgICAgYm9vbCBoZWFsdGh5KTsKK3ByaXZhdGU6CisgIHN0YXRpYyB2b2lkIGZpbmlzaChzdGQ6OmZ1bmN0aW9uPHZvaWQoYm9vbCBoZWFsdGh5KT4gX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gb3Byb3QsCisgICAgICAgICAgICAgICAgICAgICBib29sIGhlYWx0aHkpOwogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRBc3luY1Byb2Nlc3Nvcj4gdW5kZXJseWluZ187Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4gcGZhY3RfOworICBzdGQ6OnNoYXJlZF9wdHI8VEFzeW5jUHJvY2Vzc29yPiB1bmRlcmx5aW5nXzsKKyAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4gcGZhY3RfOwogfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojphc3luYworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6YXN5bmMKIAogI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UTkFNRV9NRV9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RDb25jdXJyZW50Q2xpZW50U3luY0luZm8uY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RDb25jdXJyZW50Q2xpZW50U3luY0luZm8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ZTI3YzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mby5jcHAKQEAgLTAsMCArMSwyNDIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC9hc3luYy9UQ29uY3VycmVudENsaWVudFN5bmNJbmZvLmg+CisjaW5jbHVkZSA8dGhyaWZ0L1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5oPgorI2luY2x1ZGUgPGxpbWl0cz4KKworbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgYXN5bmMgeworCit1c2luZyBuYW1lc3BhY2UgOjphcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k7CisKK1RDb25jdXJyZW50Q2xpZW50U3luY0luZm86OlRDb25jdXJyZW50Q2xpZW50U3luY0luZm8oKSA6CisgIHN0b3BfKGZhbHNlKSwKKyAgc2VxaWRNdXRleF8oKSwKKyAgLy8gdGVzdCByb2xsb3ZlciBhbGwgdGhlIHRpbWUKKyAgbmV4dHNlcWlkXygoc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWF4KSgpLTEwKSwKKyAgc2VxaWRUb01vbml0b3JNYXBfKCksCisgIGZyZWVNb25pdG9yc18oKSwKKyAgd3JpdGVNdXRleF8oKSwKKyAgcmVhZE11dGV4XygpLAorICByZWN2UGVuZGluZ18oZmFsc2UpLAorICB3YWtldXBTb21lb25lXyhmYWxzZSksCisgIHNlcWlkUGVuZGluZ18oMCksCisgIGZuYW1lUGVuZGluZ18oKSwKKyAgbXR5cGVQZW5kaW5nXyg6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9DQUxMKQoreworICBmcmVlTW9uaXRvcnNfLnJlc2VydmUoTU9OSVRPUl9DQUNIRV9TSVpFKTsKK30KKworYm9vbCBUQ29uY3VycmVudENsaWVudFN5bmNJbmZvOjpnZXRQZW5kaW5nKAorICBzdGQ6OnN0cmluZyAmZm5hbWUsCisgIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUTWVzc2FnZVR5cGUgJm10eXBlLAorICBpbnQzMl90ICZyc2VxaWQpCit7CisgIGlmKHN0b3BfKQorICAgIHRocm93RGVhZENvbm5lY3Rpb25fKCk7CisgIHdha2V1cFNvbWVvbmVfID0gZmFsc2U7CisgIGlmKHJlY3ZQZW5kaW5nXykKKyAgeworICAgIHJlY3ZQZW5kaW5nXyA9IGZhbHNlOworICAgIHJzZXFpZCA9IHNlcWlkUGVuZGluZ187CisgICAgZm5hbWUgID0gZm5hbWVQZW5kaW5nXzsKKyAgICBtdHlwZSAgPSBtdHlwZVBlbmRpbmdfOworICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBUQ29uY3VycmVudENsaWVudFN5bmNJbmZvOjp1cGRhdGVQZW5kaW5nKAorICBjb25zdCBzdGQ6OnN0cmluZyAmZm5hbWUsCisgIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUTWVzc2FnZVR5cGUgbXR5cGUsCisgIGludDMyX3QgcnNlcWlkKQoreworICByZWN2UGVuZGluZ18gPSB0cnVlOworICBzZXFpZFBlbmRpbmdfID0gcnNlcWlkOworICBmbmFtZVBlbmRpbmdfID0gZm5hbWU7CisgIG10eXBlUGVuZGluZ18gPSBtdHlwZTsKKyAgTW9uaXRvclB0ciBtb25pdG9yOworICB7CisgICAgR3VhcmQgc2VxaWRHdWFyZChzZXFpZE11dGV4Xyk7CisgICAgTW9uaXRvck1hcDo6aXRlcmF0b3IgaSA9IHNlcWlkVG9Nb25pdG9yTWFwXy5maW5kKHJzZXFpZCk7CisgICAgaWYoaSA9PSBzZXFpZFRvTW9uaXRvck1hcF8uZW5kKCkpCisgICAgICB0aHJvd0JhZFNlcUlkXygpOworICAgIG1vbml0b3IgPSBpLT5zZWNvbmQ7CisgIH0KKyAgbW9uaXRvci0+bm90aWZ5KCk7Cit9CisKK3ZvaWQgVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mbzo6d2FpdEZvcldvcmsoaW50MzJfdCBzZXFpZCkKK3sKKyAgTW9uaXRvclB0ciBtOworICB7CisgICAgR3VhcmQgc2VxaWRHdWFyZChzZXFpZE11dGV4Xyk7CisgICAgbSA9IHNlcWlkVG9Nb25pdG9yTWFwX1tzZXFpZF07CisgIH0KKyAgd2hpbGUodHJ1ZSkKKyAgeworICAgIC8vIGJlIHZlcnkgY2FyZWZ1bCBhYm91dCBzZXR0aW5nIHN0YXRlIGluIHRoaXMgbG9vcCB0aGF0IGFmZmVjdHMgd2FraW5nIHVwLiAgWW91IG1heSBleGl0CisgICAgLy8gdGhpcyBmdW5jdGlvbiwgYXR0ZW1wdCB0byBncmFiIHNvbWUgd29yaywgYW5kIHNvbWVvbmUgZWxzZSBjb3VsZCBoYXZlIGJlYXRlbiB5b3UgKG9yIG5vdAorICAgIC8vIGxlZnQpIHRoZSByZWFkIG11dGV4LCBhbmQgdGhhdCB3aWxsIHB1dCB5b3UgcmlnaHQgYmFjayBpbiB0aGlzIGxvb3AsIHdpdGggdGhlIG1hbmdsZWQKKyAgICAvLyBzdGF0ZSB5b3UgbGVmdCBiZWhpbmQuCisgICAgaWYoc3RvcF8pCisgICAgICB0aHJvd0RlYWRDb25uZWN0aW9uXygpOworICAgIGlmKHdha2V1cFNvbWVvbmVfKQorICAgICAgcmV0dXJuOworICAgIGlmKHJlY3ZQZW5kaW5nXyAmJiBzZXFpZFBlbmRpbmdfID09IHNlcWlkKQorICAgICAgcmV0dXJuOworICAgIG0tPndhaXRGb3JldmVyKCk7CisgIH0KK30KKwordm9pZCBUQ29uY3VycmVudENsaWVudFN5bmNJbmZvOjp0aHJvd0JhZFNlcUlkXygpCit7CisgIHRocm93IGFwYWNoZTo6dGhyaWZ0OjpUQXBwbGljYXRpb25FeGNlcHRpb24oCisgICAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uOjpCQURfU0VRVUVOQ0VfSUQsCisgICAgInNlcnZlciBzZW50IGEgYmFkIHNlcWlkIik7Cit9CisKK3ZvaWQgVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mbzo6dGhyb3dEZWFkQ29ubmVjdGlvbl8oKQoreworICB0aHJvdyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICJ0aGlzIGNsaWVudCBkaWVkIG9uIGFub3RoZXIgdGhyZWFkLCBhbmQgaXMgbm93IGluIGFuIHVudXNhYmxlIHN0YXRlIik7Cit9CisKK3ZvaWQgVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mbzo6d2FrZXVwQW55b25lXyhjb25zdCBHdWFyZCAmKQoreworICB3YWtldXBTb21lb25lXyA9IHRydWU7CisgIGlmKCFzZXFpZFRvTW9uaXRvck1hcF8uZW1wdHkoKSkKKyAgeworICAgIC8vIFRoZSBtb25pdG9yIG1hcCBtYXBzIGludGVnZXJzIHRvIG1vbml0b3JzLiAgTGFyZ2VyIGludGVnZXJzIGFyZSBtb3JlIHJlY2VudAorICAgIC8vIG1lc3NhZ2VzLiAgU2luY2UgdGhpcyBpcyBvcmRlcmVkLCBpdCBtZWFucyB0aGF0IHRoZSBsYXN0IGVsZW1lbnQgaXMgdGhlIG1vc3QgcmVjZW50LgorICAgIC8vIFdlIGFyZSB0cnlpbmcgdG8gZ3Vlc3Mgd2hpY2ggdGhyZWFkIHdpbGwgaGF2ZSBpdHMgbWVzc2FnZSBjb21wbGV0ZSBuZXh0LCBzbyB3ZSBhcmUgcGlja2luZworICAgIC8vIHRoZSBtb3N0IHJlY2VudC4gVGhlIG9sZGVzdCBtZXNzYWdlIGlzIGxpa2VseSB0byBiZSBzb21lIHBvbGxpbmcsIGxvbmcgbGl2ZWQgbWVzc2FnZS4KKyAgICAvLyBJZiB3ZSBndWVzcyByaWdodCwgdGhlIHRocmVhZCB3ZSB3YWtlIHVwIHdpbGwgaGFuZGxlIHRoZSBtZXNzYWdlIHRoYXQgY29tZXMgaW4uCisgICAgLy8gSWYgd2UgZ3Vlc3Mgd3JvbmcsIHRoZSB0aHJlYWQgd2Ugd2FrZSB1cCB3aWxsIGhhbmQgb2ZmIHRoZSB3b3JrIHRvIHRoZSBjb3JyZWN0IHRocmVhZCwKKyAgICAvLyBjb3N0aW5nIHVzIGFuIGV4dHJhIGNvbnRleHQgc3dpdGNoLgorICAgIHNlcWlkVG9Nb25pdG9yTWFwXy5yYmVnaW4oKS0+c2Vjb25kLT5ub3RpZnkoKTsKKyAgfQorfQorCit2b2lkIFRDb25jdXJyZW50Q2xpZW50U3luY0luZm86Om1hcmtCYWRfKGNvbnN0IEd1YXJkICYpCit7CisgIHdha2V1cFNvbWVvbmVfID0gdHJ1ZTsKKyAgc3RvcF8gPSB0cnVlOworICBmb3IoTW9uaXRvck1hcDo6aXRlcmF0b3IgaSA9IHNlcWlkVG9Nb25pdG9yTWFwXy5iZWdpbigpOyBpICE9IHNlcWlkVG9Nb25pdG9yTWFwXy5lbmQoKTsgKytpKQorICAgIGktPnNlY29uZC0+bm90aWZ5KCk7Cit9CisKK1RDb25jdXJyZW50Q2xpZW50U3luY0luZm86Ok1vbml0b3JQdHIKK1RDb25jdXJyZW50Q2xpZW50U3luY0luZm86Om5ld01vbml0b3JfKGNvbnN0IEd1YXJkICYpCit7CisgIGlmKGZyZWVNb25pdG9yc18uZW1wdHkoKSkKKyAgICByZXR1cm4gTW9uaXRvclB0cihuZXcgTW9uaXRvcigmcmVhZE11dGV4XykpOworICBNb25pdG9yUHRyIHJldHZhbDsKKyAgLy9zd2FwcGluZyB0byBhdm9pZCBhbiBhdG9taWMgb3BlcmF0aW9uCisgIHJldHZhbC5zd2FwKGZyZWVNb25pdG9yc18uYmFjaygpKTsKKyAgZnJlZU1vbml0b3JzXy5wb3BfYmFjaygpOworICByZXR1cm4gcmV0dmFsOworfQorCit2b2lkIFRDb25jdXJyZW50Q2xpZW50U3luY0luZm86OmRlbGV0ZU1vbml0b3JfKAorICBjb25zdCBHdWFyZCAmLAorICBUQ29uY3VycmVudENsaWVudFN5bmNJbmZvOjpNb25pdG9yUHRyICZtKSAvKm5vZXhjZXB0Ki8KK3sKKyAgaWYoZnJlZU1vbml0b3JzXy5zaXplKCkgPiBNT05JVE9SX0NBQ0hFX1NJWkUpCisgIHsKKyAgICBtLnJlc2V0KCk7CisgICAgcmV0dXJuOworICB9CisgIC8vZnJlZU1vbml0b3JzXyB3YXMgcmVzZXJ2ZWQgdXAgdG8gTU9OSVRPUl9DQUNIRV9TSVpFIGluIHRoZSBjdG9yLAorICAvL3NvIHRoaXMgc2hvdWxkbid0IHRocm93CisgIGZyZWVNb25pdG9yc18ucHVzaF9iYWNrKFRDb25jdXJyZW50Q2xpZW50U3luY0luZm86Ok1vbml0b3JQdHIoKSk7CisgIC8vc3dhcHBpbmcgdG8gYXZvaWQgYW4gYXRvbWljIG9wZXJhdGlvbgorICBtLnN3YXAoZnJlZU1vbml0b3JzXy5iYWNrKCkpOworfQorCitpbnQzMl90IFRDb25jdXJyZW50Q2xpZW50U3luY0luZm86OmdlbmVyYXRlU2VxSWQoKQoreworICBHdWFyZCBzZXFpZEd1YXJkKHNlcWlkTXV0ZXhfKTsKKyAgaWYoc3RvcF8pCisgICAgdGhyb3dEZWFkQ29ubmVjdGlvbl8oKTsKKworICBpZighc2VxaWRUb01vbml0b3JNYXBfLmVtcHR5KCkpCisgICAgaWYobmV4dHNlcWlkXyA9PSBzZXFpZFRvTW9uaXRvck1hcF8uYmVnaW4oKS0+Zmlyc3QpCisgICAgICB0aHJvdyBhcGFjaGU6OnRocmlmdDo6VEFwcGxpY2F0aW9uRXhjZXB0aW9uKAorICAgICAgICBUQXBwbGljYXRpb25FeGNlcHRpb246OkJBRF9TRVFVRU5DRV9JRCwKKyAgICAgICAgImFib3V0IHRvIHJlcGVhdCBhIHNlcWlkIik7CisgIGludDMyX3QgbmV3U2VxSWQgPSBuZXh0c2VxaWRfKys7CisgIHNlcWlkVG9Nb25pdG9yTWFwX1tuZXdTZXFJZF0gPSBuZXdNb25pdG9yXyhzZXFpZEd1YXJkKTsKKyAgcmV0dXJuIG5ld1NlcUlkOworfQorCitUQ29uY3VycmVudFJlY3ZTZW50cnk6OlRDb25jdXJyZW50UmVjdlNlbnRyeShUQ29uY3VycmVudENsaWVudFN5bmNJbmZvICpzeW5jLCBpbnQzMl90IHNlcWlkKSA6CisgIHN5bmNfKCpzeW5jKSwKKyAgc2VxaWRfKHNlcWlkKSwKKyAgY29tbWl0dGVkXyhmYWxzZSkKK3sKKyAgc3luY18uZ2V0UmVhZE11dGV4KCkubG9jaygpOworfQorCitUQ29uY3VycmVudFJlY3ZTZW50cnk6On5UQ29uY3VycmVudFJlY3ZTZW50cnkoKQoreworICB7CisgICAgR3VhcmQgc2VxaWRHdWFyZChzeW5jXy5zZXFpZE11dGV4Xyk7CisgICAgc3luY18uZGVsZXRlTW9uaXRvcl8oc2VxaWRHdWFyZCwgc3luY18uc2VxaWRUb01vbml0b3JNYXBfW3NlcWlkX10pOworCisgICAgc3luY18uc2VxaWRUb01vbml0b3JNYXBfLmVyYXNlKHNlcWlkXyk7CisgICAgaWYoY29tbWl0dGVkXykKKyAgICAgIHN5bmNfLndha2V1cEFueW9uZV8oc2VxaWRHdWFyZCk7CisgICAgZWxzZQorICAgICAgc3luY18ubWFya0JhZF8oc2VxaWRHdWFyZCk7CisgIH0KKyAgc3luY18uZ2V0UmVhZE11dGV4KCkudW5sb2NrKCk7Cit9CisKK3ZvaWQgVENvbmN1cnJlbnRSZWN2U2VudHJ5Ojpjb21taXQoKQoreworICBjb21taXR0ZWRfID0gdHJ1ZTsKK30KKworVENvbmN1cnJlbnRTZW5kU2VudHJ5OjpUQ29uY3VycmVudFNlbmRTZW50cnkoVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mbyAqc3luYykgOgorICBzeW5jXygqc3luYyksCisgIGNvbW1pdHRlZF8oZmFsc2UpCit7CisgIHN5bmNfLmdldFdyaXRlTXV0ZXgoKS5sb2NrKCk7Cit9CisKK1RDb25jdXJyZW50U2VuZFNlbnRyeTo6flRDb25jdXJyZW50U2VuZFNlbnRyeSgpCit7CisgIGlmKCFjb21taXR0ZWRfKQorICB7CisgICAgR3VhcmQgc2VxaWRHdWFyZChzeW5jXy5zZXFpZE11dGV4Xyk7CisgICAgc3luY18ubWFya0JhZF8oc2VxaWRHdWFyZCk7CisgIH0KKyAgc3luY18uZ2V0V3JpdGVNdXRleCgpLnVubG9jaygpOworfQorCit2b2lkIFRDb25jdXJyZW50U2VuZFNlbnRyeTo6Y29tbWl0KCkKK3sKKyAgY29tbWl0dGVkXyA9IHRydWU7Cit9CisKKworfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojphc3luYwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RDb25jdXJyZW50Q2xpZW50U3luY0luZm8uaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQ29uY3VycmVudENsaWVudFN5bmNJbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJjNWViNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQ29uY3VycmVudENsaWVudFN5bmNJbmZvLmgKQEAgLTAsMCArMSwxMjYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgX1RIUklGVF9UQ09OQ1VSUkVOVENMSUVOVFNZTkNJTkZPX0hfCisjZGVmaW5lIF9USFJJRlRfVENPTkNVUlJFTlRDTElFTlRTWU5DSU5GT19IXyAxCisKKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L011dGV4Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L01vbml0b3IuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxtYXA+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgYXN5bmMgeworCitjbGFzcyBUQ29uY3VycmVudENsaWVudFN5bmNJbmZvOworCitjbGFzcyBUQ29uY3VycmVudFNlbmRTZW50cnkgeworcHVibGljOgorICBleHBsaWNpdCBUQ29uY3VycmVudFNlbmRTZW50cnkoVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mbyogc3luYyk7CisgIH5UQ29uY3VycmVudFNlbmRTZW50cnkoKTsKKworICB2b2lkIGNvbW1pdCgpOworCitwcml2YXRlOgorICBUQ29uY3VycmVudENsaWVudFN5bmNJbmZvJiBzeW5jXzsKKyAgYm9vbCBjb21taXR0ZWRfOworfTsKKworY2xhc3MgVENvbmN1cnJlbnRSZWN2U2VudHJ5IHsKK3B1YmxpYzoKKyAgVENvbmN1cnJlbnRSZWN2U2VudHJ5KFRDb25jdXJyZW50Q2xpZW50U3luY0luZm8qIHN5bmMsIGludDMyX3Qgc2VxaWQpOworICB+VENvbmN1cnJlbnRSZWN2U2VudHJ5KCk7CisKKyAgdm9pZCBjb21taXQoKTsKKworcHJpdmF0ZToKKyAgVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mbyYgc3luY187CisgIGludDMyX3Qgc2VxaWRfOworICBib29sIGNvbW1pdHRlZF87Cit9OworCitjbGFzcyBUQ29uY3VycmVudENsaWVudFN5bmNJbmZvIHsKK3ByaXZhdGU6IC8vIHR5cGVkZWZzCisgIHR5cGVkZWYgc3RkOjpzaGFyZWRfcHRyPCA6OmFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6TW9uaXRvcj4gTW9uaXRvclB0cjsKKyAgdHlwZWRlZiBzdGQ6Om1hcDxpbnQzMl90LCBNb25pdG9yUHRyPiBNb25pdG9yTWFwOworCitwdWJsaWM6CisgIFRDb25jdXJyZW50Q2xpZW50U3luY0luZm8oKTsKKworICBpbnQzMl90IGdlbmVyYXRlU2VxSWQoKTsKKworICBib29sIGdldFBlbmRpbmcoc3RkOjpzdHJpbmcmIGZuYW1lLAorICAgICAgICAgICAgICAgICAgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRNZXNzYWdlVHlwZSYgbXR5cGUsCisgICAgICAgICAgICAgICAgICBpbnQzMl90JiByc2VxaWQpOyAvKiByZXF1aXJlcyByZWFkTXV0ZXhfICovCisKKyAgdm9pZCB1cGRhdGVQZW5kaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBmbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUTWVzc2FnZVR5cGUgbXR5cGUsCisgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJzZXFpZCk7IC8qIHJlcXVpcmVzIHJlYWRNdXRleF8gKi8KKworICB2b2lkIHdhaXRGb3JXb3JrKGludDMyX3Qgc2VxaWQpOyAvKiByZXF1aXJlcyByZWFkTXV0ZXhfICovCisKKyAgOjphcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6Ok11dGV4JiBnZXRSZWFkTXV0ZXgoKSB7IHJldHVybiByZWFkTXV0ZXhfOyB9CisgIDo6YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpNdXRleCYgZ2V0V3JpdGVNdXRleCgpIHsgcmV0dXJuIHdyaXRlTXV0ZXhfOyB9CisKK3ByaXZhdGU6IC8vIGNvbnN0YW50cworICBlbnVtIHsgTU9OSVRPUl9DQUNIRV9TSVpFID0gMTAgfTsKKworcHJpdmF0ZTogLy8gZnVuY3Rpb25zCisgIE1vbml0b3JQdHIgbmV3TW9uaXRvcl8oCisgICAgICBjb25zdCA6OmFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6R3VhcmQmIHNlcWlkR3VhcmQpOyAvKiByZXF1aXJlcyBzZXFpZE11dGV4XyAqLworICB2b2lkIGRlbGV0ZU1vbml0b3JfKGNvbnN0IDo6YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpHdWFyZCYgc2VxaWRHdWFyZCwgTW9uaXRvclB0ciYgbSk7CisgICAgICAvKm5vZXhjZXB0Ki8gLyogcmVxdWlyZXMgc2VxaWRNdXRleF8gKi8KKyAgdm9pZCB3YWtldXBBbnlvbmVfKAorICAgICAgY29uc3QgOjphcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6Okd1YXJkJiBzZXFpZEd1YXJkKTsgICAgICAgICAgIC8qIHJlcXVpcmVzIHNlcWlkTXV0ZXhfICovCisgIHZvaWQgbWFya0JhZF8oY29uc3QgOjphcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6Okd1YXJkJiBzZXFpZEd1YXJkKTsgLyogcmVxdWlyZXMgc2VxaWRNdXRleF8gKi8KKyAgdm9pZCB0aHJvd0JhZFNlcUlkXygpOworICB2b2lkIHRocm93RGVhZENvbm5lY3Rpb25fKCk7CisKK3ByaXZhdGU6IC8vIGRhdGEgbWVtYmVycworICB2b2xhdGlsZSBib29sIHN0b3BfOworCisgIDo6YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpNdXRleCBzZXFpZE11dGV4XzsKKyAgLy8gYmVnaW4gc2VxaWRNdXRleF8gcHJvdGVjdGVkIG1lbWJlcnMKKyAgaW50MzJfdCBuZXh0c2VxaWRfOworICBNb25pdG9yTWFwIHNlcWlkVG9Nb25pdG9yTWFwXzsKKyAgc3RkOjp2ZWN0b3I8TW9uaXRvclB0cj4gZnJlZU1vbml0b3JzXzsKKyAgLy8gZW5kIHNlcWlkTXV0ZXhfIHByb3RlY3RlZCBtZW1iZXJzCisKKyAgOjphcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6Ok11dGV4IHdyaXRlTXV0ZXhfOworCisgIDo6YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpNdXRleCByZWFkTXV0ZXhfOworICAvLyBiZWdpbiByZWFkTXV0ZXhfIHByb3RlY3RlZCBtZW1iZXJzCisgIGJvb2wgcmVjdlBlbmRpbmdfOworICBib29sIHdha2V1cFNvbWVvbmVfOworICBpbnQzMl90IHNlcWlkUGVuZGluZ187CisgIHN0ZDo6c3RyaW5nIGZuYW1lUGVuZGluZ187CisgIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUTWVzc2FnZVR5cGUgbXR5cGVQZW5kaW5nXzsKKyAgLy8gZW5kIHJlYWRNdXRleF8gcHJvdGVjdGVkIG1lbWJlcnMKKworICBmcmllbmQgY2xhc3MgVENvbmN1cnJlbnRTZW5kU2VudHJ5OworICBmcmllbmQgY2xhc3MgVENvbmN1cnJlbnRSZWN2U2VudHJ5OworfTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmFzeW5jCisKKyNlbmRpZiAvLyBfVEhSSUZUX1RDT05DVVJSRU5UQ0xJRU5UU1lOQ0lORk9fSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9URXZodHRwQ2xpZW50Q2hhbm5lbC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEV2aHR0cENsaWVudENoYW5uZWwuY3BwCmluZGV4IDdhZDc1MzcuLjZhZjgxMDQgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9URXZodHRwQ2xpZW50Q2hhbm5lbC5jcHAKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RFdmh0dHBDbGllbnRDaGFubmVsLmNwcApAQCAtMTksNiArMTksOCBAQAogCiAjaW5jbHVkZSA8dGhyaWZ0L2FzeW5jL1RFdmh0dHBDbGllbnRDaGFubmVsLmg+CiAjaW5jbHVkZSA8ZXZodHRwLmg+CisjaW5jbHVkZSA8ZXZlbnQyL2J1ZmZlci5oPgorI2luY2x1ZGUgPGV2ZW50Mi9idWZmZXJfY29tcGF0Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgogI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xFeGNlcHRpb24uaD4KIApAQCAtMjgsNDIgKzMwLDMzIEBACiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjsKIAotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgYXN5bmMgeworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBhc3luYyB7CiAKK1RFdmh0dHBDbGllbnRDaGFubmVsOjpURXZodHRwQ2xpZW50Q2hhbm5lbChjb25zdCBzdGQ6OnN0cmluZyYgaG9zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBldmVudF9iYXNlKiBlYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZXZkbnNfYmFzZSogZG5zYmFzZSkKIAotVEV2aHR0cENsaWVudENoYW5uZWw6OlRFdmh0dHBDbGllbnRDaGFubmVsKAotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBob3N0LAotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoLAotICAgIGNvbnN0IGNoYXIqIGFkZHJlc3MsCi0gICAgaW50IHBvcnQsCi0gICAgc3RydWN0IGV2ZW50X2Jhc2UqIGViKQotICA6IGhvc3RfKGhvc3QpCi0gICwgcGF0aF8ocGF0aCkKLSAgLCByZWN2QnVmXyhOVUxMKQotICAsIGNvbm5fKE5VTEwpCi17Ci0gIGNvbm5fID0gZXZodHRwX2Nvbm5lY3Rpb25fbmV3KGFkZHJlc3MsIHBvcnQpOworICA6IGhvc3RfKGhvc3QpLCBwYXRoXyhwYXRoKSwgY29ubl8oTlVMTCkgeworICBjb25uXyA9IGV2aHR0cF9jb25uZWN0aW9uX2Jhc2VfbmV3KGViLCBkbnNiYXNlLCBhZGRyZXNzLCBwb3J0KTsKICAgaWYgKGNvbm5fID09IE5VTEwpIHsKICAgICB0aHJvdyBURXhjZXB0aW9uKCJldmh0dHBfY29ubmVjdGlvbl9uZXcgZmFpbGVkIik7CiAgIH0KLSAgZXZodHRwX2Nvbm5lY3Rpb25fc2V0X2Jhc2UoY29ubl8sIGViKTsKIH0KIAotCiBURXZodHRwQ2xpZW50Q2hhbm5lbDo6flRFdmh0dHBDbGllbnRDaGFubmVsKCkgewogICBpZiAoY29ubl8gIT0gTlVMTCkgewogICAgIGV2aHR0cF9jb25uZWN0aW9uX2ZyZWUoY29ubl8pOwogICB9CiB9CiAKLQotdm9pZCBURXZodHRwQ2xpZW50Q2hhbm5lbDo6c2VuZEFuZFJlY3ZNZXNzYWdlKAotICAgIGNvbnN0IFZvaWRDYWxsYmFjayYgY29iLAotICAgIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXIqIHNlbmRCdWYsCi0gICAgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlciogcmVjdkJ1ZikgewotICBjb2JfID0gY29iOwotICByZWN2QnVmXyA9IHJlY3ZCdWY7Ci0KK3ZvaWQgVEV2aHR0cENsaWVudENoYW5uZWw6OnNlbmRBbmRSZWN2TWVzc2FnZShjb25zdCBWb2lkQ2FsbGJhY2smIGNvYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyKiBzZW5kQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXIqIHJlY3ZCdWYpIHsKICAgc3RydWN0IGV2aHR0cF9yZXF1ZXN0KiByZXEgPSBldmh0dHBfcmVxdWVzdF9uZXcocmVzcG9uc2UsIHRoaXMpOwogICBpZiAocmVxID09IE5VTEwpIHsKICAgICB0aHJvdyBURXhjZXB0aW9uKCJldmh0dHBfcmVxdWVzdF9uZXcgZmFpbGVkIik7CkBAIC05Myw3MCArODYsNzEgQEAKICAgaWYgKHJ2ICE9IDApIHsKICAgICB0aHJvdyBURXhjZXB0aW9uKCJldmh0dHBfbWFrZV9yZXF1ZXN0IGZhaWxlZCIpOwogICB9CisKKyAgY29tcGxldGlvblF1ZXVlXy5wdXNoKENvbXBsZXRpb24oY29iLCByZWN2QnVmKSk7CiB9CiAKLQotdm9pZCBURXZodHRwQ2xpZW50Q2hhbm5lbDo6c2VuZE1lc3NhZ2UoCi0gICAgY29uc3QgVm9pZENhbGxiYWNrJiBjb2IsIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXIqIG1lc3NhZ2UpIHsKLSAgKHZvaWQpIGNvYjsKLSAgKHZvaWQpIG1lc3NhZ2U7Cit2b2lkIFRFdmh0dHBDbGllbnRDaGFubmVsOjpzZW5kTWVzc2FnZShjb25zdCBWb2lkQ2FsbGJhY2smIGNvYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXIqIG1lc3NhZ2UpIHsKKyAgKHZvaWQpY29iOworICAodm9pZCltZXNzYWdlOwogICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCi0JCQkgICAiVW5leHBlY3RlZCBjYWxsIHRvIFRFdmh0dHBDbGllbnRDaGFubmVsOjpzZW5kTWVzc2FnZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuZXhwZWN0ZWQgY2FsbCB0byBURXZodHRwQ2xpZW50Q2hhbm5lbDo6c2VuZE1lc3NhZ2UiKTsKIH0KIAotCi12b2lkIFRFdmh0dHBDbGllbnRDaGFubmVsOjpyZWN2TWVzc2FnZSgKLSAgICBjb25zdCBWb2lkQ2FsbGJhY2smIGNvYiwgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlciogbWVzc2FnZSkgewotICAodm9pZCkgY29iOwotICAodm9pZCkgbWVzc2FnZTsKK3ZvaWQgVEV2aHR0cENsaWVudENoYW5uZWw6OnJlY3ZNZXNzYWdlKGNvbnN0IFZvaWRDYWxsYmFjayYgY29iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlciogbWVzc2FnZSkgeworICAodm9pZCljb2I7CisgICh2b2lkKW1lc3NhZ2U7CiAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKLQkJCSAgICJVbmV4cGVjdGVkIGNhbGwgdG8gVEV2aHR0cENsaWVudENoYW5uZWw6OnJlY3ZNZXNzYWdlIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5leHBlY3RlZCBjYWxsIHRvIFRFdmh0dHBDbGllbnRDaGFubmVsOjpyZWN2TWVzc2FnZSIpOwogfQogCi0KIHZvaWQgVEV2aHR0cENsaWVudENoYW5uZWw6OmZpbmlzaChzdHJ1Y3QgZXZodHRwX3JlcXVlc3QqIHJlcSkgeworICBhc3NlcnQoIWNvbXBsZXRpb25RdWV1ZV8uZW1wdHkoKSk7CisgIENvbXBsZXRpb24gY29tcGxldGlvbiA9IGNvbXBsZXRpb25RdWV1ZV8uZnJvbnQoKTsKKyAgY29tcGxldGlvblF1ZXVlXy5wb3AoKTsKICAgaWYgKHJlcSA9PSBOVUxMKSB7Ci0gIHRyeSB7Ci0gICAgY29iXygpOwotICB9IGNhdGNoKGNvbnN0IFRUcmFuc3BvcnRFeGNlcHRpb24mIGUpIHsKLSAgICBpZihlLmdldFR5cGUoKSA9PSBUVHJhbnNwb3J0RXhjZXB0aW9uOjpFTkRfT0ZfRklMRSkKLSAgICAgIHRocm93IFRFeGNlcHRpb24oImNvbm5lY3QgZmFpbGVkIik7Ci0gICAgZWxzZQotICAgICAgdGhyb3c7Ci0gIH0KLSAgcmV0dXJuOworICAgIHRyeSB7CisgICAgICBjb21wbGV0aW9uLmZpcnN0KCk7CisgICAgfSBjYXRjaCAoY29uc3QgVFRyYW5zcG9ydEV4Y2VwdGlvbiYgZSkgeworICAgICAgaWYgKGUuZ2V0VHlwZSgpID09IFRUcmFuc3BvcnRFeGNlcHRpb246OkVORF9PRl9GSUxFKQorICAgICAgICB0aHJvdyBURXhjZXB0aW9uKCJjb25uZWN0IGZhaWxlZCIpOworICAgICAgZWxzZQorICAgICAgICB0aHJvdzsKKyAgICB9CisgICAgcmV0dXJuOwogICB9IGVsc2UgaWYgKHJlcS0+cmVzcG9uc2VfY29kZSAhPSAyMDApIHsKLSAgdHJ5IHsKLSAgICBjb2JfKCk7Ci0gIH0gY2F0Y2goY29uc3QgVFRyYW5zcG9ydEV4Y2VwdGlvbiYgZSkgewotICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOwotICAgIHNzIDw8ICJzZXJ2ZXIgcmV0dXJuZWQgY29kZSAiIDw8IHJlcS0+cmVzcG9uc2VfY29kZTsKLQlpZihyZXEtPnJlc3BvbnNlX2NvZGVfbGluZSkKLQkJc3MgPDwgIjogIiA8PCByZXEtPnJlc3BvbnNlX2NvZGVfbGluZTsKLSAgICBpZihlLmdldFR5cGUoKSA9PSBUVHJhbnNwb3J0RXhjZXB0aW9uOjpFTkRfT0ZfRklMRSkKLSAgICAgIHRocm93IFRFeGNlcHRpb24oc3Muc3RyKCkpOwotICAgIGVsc2UKLSAgICAgIHRocm93OworICAgIHRyeSB7CisgICAgICBjb21wbGV0aW9uLmZpcnN0KCk7CisgICAgfSBjYXRjaCAoY29uc3QgVFRyYW5zcG9ydEV4Y2VwdGlvbiYgZSkgeworICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgICAgICBzcyA8PCAic2VydmVyIHJldHVybmVkIGNvZGUgIiA8PCByZXEtPnJlc3BvbnNlX2NvZGU7CisgICAgICBpZiAocmVxLT5yZXNwb25zZV9jb2RlX2xpbmUpCisgICAgICAgIHNzIDw8ICI6ICIgPDwgcmVxLT5yZXNwb25zZV9jb2RlX2xpbmU7CisgICAgICBpZiAoZS5nZXRUeXBlKCkgPT0gVFRyYW5zcG9ydEV4Y2VwdGlvbjo6RU5EX09GX0ZJTEUpCisgICAgICAgIHRocm93IFRFeGNlcHRpb24oc3Muc3RyKCkpOworICAgICAgZWxzZQorICAgICAgICB0aHJvdzsKKyAgICB9CisgICAgcmV0dXJuOwogICB9Ci0gIHJldHVybjsKLSAgfQotICByZWN2QnVmXy0+cmVzZXRCdWZmZXIoCi0gICAgICBFVkJVRkZFUl9EQVRBKHJlcS0+aW5wdXRfYnVmZmVyKSwKLSAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihFVkJVRkZFUl9MRU5HVEgocmVxLT5pbnB1dF9idWZmZXIpKSk7Ci0gIGNvYl8oKTsKKyAgY29tcGxldGlvbi5zZWNvbmQtPnJlc2V0QnVmZmVyKEVWQlVGRkVSX0RBVEEocmVxLT5pbnB1dF9idWZmZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KEVWQlVGRkVSX0xFTkdUSChyZXEtPmlucHV0X2J1ZmZlcikpKTsKKyAgY29tcGxldGlvbi5maXJzdCgpOwogICByZXR1cm47CiB9CiAKLQogLyogc3RhdGljICovIHZvaWQgVEV2aHR0cENsaWVudENoYW5uZWw6OnJlc3BvbnNlKHN0cnVjdCBldmh0dHBfcmVxdWVzdCogcmVxLCB2b2lkKiBhcmcpIHsKICAgVEV2aHR0cENsaWVudENoYW5uZWwqIHNlbGYgPSAoVEV2aHR0cENsaWVudENoYW5uZWwqKWFyZzsKICAgdHJ5IHsKICAgICBzZWxmLT5maW5pc2gocmVxKTsKLSAgfSBjYXRjaChzdGQ6OmV4Y2VwdGlvbiYgZSkgeworICB9IGNhdGNoIChzdGQ6OmV4Y2VwdGlvbiYgZSkgewogICAgIC8vIGRvbid0IHByb3BhZ2F0ZSBhIEMrKyBleGNlcHRpb24gaW4gQyBjb2RlIChlLmcuIGxpYmV2ZW50KQotICAgIHN0ZDo6Y2VyciA8PCAiVEV2aHR0cENsaWVudENoYW5uZWw6OnJlc3BvbnNlIGV4Y2VwdGlvbiB0aHJvd24gKGlnbm9yZWQpOiAiIDw8IGUud2hhdCgpIDw8IHN0ZDo6ZW5kbDsKKyAgICBzdGQ6OmNlcnIgPDwgIlRFdmh0dHBDbGllbnRDaGFubmVsOjpyZXNwb25zZSBleGNlcHRpb24gdGhyb3duIChpZ25vcmVkKTogIiA8PCBlLndoYXQoKQorICAgICAgICAgICAgICA8PCBzdGQ6OmVuZGw7CiAgIH0KIH0KLQotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OmFzeW5jCit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojphc3luYwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RFdmh0dHBDbGllbnRDaGFubmVsLmggYi9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEV2aHR0cENsaWVudENoYW5uZWwuaAppbmRleCBhNzIyOWU5Li5hMzIxZjQxIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEV2aHR0cENsaWVudENoYW5uZWwuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEV2aHR0cENsaWVudENoYW5uZWwuaApAQCAtMjAsNTcgKzIwLDY5IEBACiAjaWZuZGVmIF9USFJJRlRfVEVWSFRUUF9DTElFTlRfQ0hBTk5FTF9IXwogI2RlZmluZSBfVEhSSUZUX1RFVkhUVFBfQ0xJRU5UX0NIQU5ORUxfSF8gMQogCisjaW5jbHVkZSA8cXVldWU+CiAjaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHRocmlmdC9hc3luYy9UQXN5bmNDaGFubmVsLmg+CiAKIHN0cnVjdCBldmVudF9iYXNlOworc3RydWN0IGV2ZG5zX2Jhc2U7CiBzdHJ1Y3QgZXZodHRwX2Nvbm5lY3Rpb247CiBzdHJ1Y3QgZXZodHRwX3JlcXVlc3Q7CiAKLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHRyYW5zcG9ydCB7CituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CiBjbGFzcyBUTWVtb3J5QnVmZmVyOwotfX19Cit9Cit9Cit9CiAKLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIGFzeW5jIHsKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgYXN5bmMgewogCiBjbGFzcyBURXZodHRwQ2xpZW50Q2hhbm5lbCA6IHB1YmxpYyBUQXN5bmNDaGFubmVsIHsKLSBwdWJsaWM6CitwdWJsaWM6CiAgIHVzaW5nIFRBc3luY0NoYW5uZWw6OlZvaWRDYWxsYmFjazsKIAotICBURXZodHRwQ2xpZW50Q2hhbm5lbCgKLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBob3N0LAotICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsCi0gICAgICBjb25zdCBjaGFyKiBhZGRyZXNzLAotICAgICAgaW50IHBvcnQsCi0gICAgICBzdHJ1Y3QgZXZlbnRfYmFzZSogZWIpOworICBURXZodHRwQ2xpZW50Q2hhbm5lbChjb25zdCBzdGQ6OnN0cmluZyYgaG9zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZXZlbnRfYmFzZSogZWIsCisgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBldmRuc19iYXNlICpkbnNiYXNlID0gMCk7CiAgIH5URXZodHRwQ2xpZW50Q2hhbm5lbCgpOwogCiAgIHZpcnR1YWwgdm9pZCBzZW5kQW5kUmVjdk1lc3NhZ2UoY29uc3QgVm9pZENhbGxiYWNrJiBjb2IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlciogc2VuZEJ1ZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyKiByZWN2QnVmKTsKIAotICB2aXJ0dWFsIHZvaWQgc2VuZE1lc3NhZ2UoY29uc3QgVm9pZENhbGxiYWNrJiBjb2IsIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXIqIG1lc3NhZ2UpOwotICB2aXJ0dWFsIHZvaWQgcmVjdk1lc3NhZ2UoY29uc3QgVm9pZENhbGxiYWNrJiBjb2IsIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXIqIG1lc3NhZ2UpOworICB2aXJ0dWFsIHZvaWQgc2VuZE1lc3NhZ2UoY29uc3QgVm9pZENhbGxiYWNrJiBjb2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyKiBtZXNzYWdlKTsKKyAgdmlydHVhbCB2b2lkIHJlY3ZNZXNzYWdlKGNvbnN0IFZvaWRDYWxsYmFjayYgY29iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlciogbWVzc2FnZSk7CiAKICAgdm9pZCBmaW5pc2goc3RydWN0IGV2aHR0cF9yZXF1ZXN0KiByZXEpOwogCi0gIC8vWFhYCisgIC8vIFhYWAogICB2aXJ0dWFsIGJvb2wgZ29vZCgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KICAgdmlydHVhbCBib29sIGVycm9yKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KICAgdmlydHVhbCBib29sIHRpbWVkT3V0KCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KIAotIHByaXZhdGU6Citwcml2YXRlOgogICBzdGF0aWMgdm9pZCByZXNwb25zZShzdHJ1Y3QgZXZodHRwX3JlcXVlc3QqIHJlcSwgdm9pZCogYXJnKTsKIAogICBzdGQ6OnN0cmluZyBob3N0XzsKICAgc3RkOjpzdHJpbmcgcGF0aF87Ci0gIFZvaWRDYWxsYmFjayBjb2JfOwotICBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyKiByZWN2QnVmXzsKKyAgdHlwZWRlZiBzdGQ6OnBhaXI8Vm9pZENhbGxiYWNrLCBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyKj4gQ29tcGxldGlvbjsKKyAgdHlwZWRlZiBzdGQ6OnF1ZXVlPENvbXBsZXRpb24+IENvbXBsZXRpb25RdWV1ZTsKKyAgQ29tcGxldGlvblF1ZXVlIGNvbXBsZXRpb25RdWV1ZV87CiAgIHN0cnVjdCBldmh0dHBfY29ubmVjdGlvbiogY29ubl87Ci0KIH07Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6YXN5bmMKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmFzeW5jCiAKICNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVEVWSFRUUF9DTElFTlRfQ0hBTk5FTF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RFdmh0dHBTZXJ2ZXIuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RFdmh0dHBTZXJ2ZXIuY3BwCmluZGV4IGZhOGQ3ODIuLmJkYzMyNjYgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9URXZodHRwU2VydmVyLmNwcAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEV2aHR0cFNlcnZlci5jcHAKQEAgLTIwLDggKzIwLDEwIEBACiAjaW5jbHVkZSA8dGhyaWZ0L2FzeW5jL1RFdmh0dHBTZXJ2ZXIuaD4KICNpbmNsdWRlIDx0aHJpZnQvYXN5bmMvVEFzeW5jQnVmZmVyUHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgorI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDxldmh0dHAuaD4KLQorI2luY2x1ZGUgPGV2ZW50Mi9idWZmZXIuaD4KKyNpbmNsdWRlIDxldmVudDIvYnVmZmVyX2NvbXBhdC5oPgogI2luY2x1ZGUgPGlvc3RyZWFtPgogCiAjaWZuZGVmIEhUVFBfSU5URVJOQUwgLy8gbGliZXZlbnQgPCAyCkBAIC0yOSwzMSArMzEsMjYgQEAKICNlbmRpZgogCiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyOwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOwogCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBhc3luYyB7Ci0KK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgYXN5bmMgewogCiBzdHJ1Y3QgVEV2aHR0cFNlcnZlcjo6UmVxdWVzdENvbnRleHQgewogICBzdHJ1Y3QgZXZodHRwX3JlcXVlc3QqIHJlcTsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlcj4gaWJ1ZjsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlcj4gb2J1ZjsKKyAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXI+IGlidWY7CisgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyPiBvYnVmOwogCiAgIFJlcXVlc3RDb250ZXh0KHN0cnVjdCBldmh0dHBfcmVxdWVzdCogcmVxKTsKIH07CiAKK1RFdmh0dHBTZXJ2ZXI6OlRFdmh0dHBTZXJ2ZXIoc3RkOjpzaGFyZWRfcHRyPFRBc3luY0J1ZmZlclByb2Nlc3Nvcj4gcHJvY2Vzc29yKQorICA6IHByb2Nlc3Nvcl8ocHJvY2Vzc29yKSwgZWJfKE5VTEwpLCBlaF8oTlVMTCkgeworfQogCi1URXZodHRwU2VydmVyOjpURXZodHRwU2VydmVyKGJvb3N0OjpzaGFyZWRfcHRyPFRBc3luY0J1ZmZlclByb2Nlc3Nvcj4gcHJvY2Vzc29yKQotICA6IHByb2Nlc3Nvcl8ocHJvY2Vzc29yKQotICAsIGViXyhOVUxMKQotICAsIGVoXyhOVUxMKQote30KLQotCi1URXZodHRwU2VydmVyOjpURXZodHRwU2VydmVyKGJvb3N0OjpzaGFyZWRfcHRyPFRBc3luY0J1ZmZlclByb2Nlc3Nvcj4gcHJvY2Vzc29yLCBpbnQgcG9ydCkKLSAgOiBwcm9jZXNzb3JfKHByb2Nlc3NvcikKLSAgLCBlYl8oTlVMTCkKLSAgLCBlaF8oTlVMTCkKLXsKK1RFdmh0dHBTZXJ2ZXI6OlRFdmh0dHBTZXJ2ZXIoc3RkOjpzaGFyZWRfcHRyPFRBc3luY0J1ZmZlclByb2Nlc3Nvcj4gcHJvY2Vzc29yLCBpbnQgcG9ydCkKKyAgOiBwcm9jZXNzb3JfKHByb2Nlc3NvciksIGViXyhOVUxMKSwgZWhfKE5VTEwpIHsKICAgLy8gQ3JlYXRlIGV2ZW50X2Jhc2UgYW5kIGV2aHR0cC4KICAgZWJfID0gZXZlbnRfYmFzZV9uZXcoKTsKICAgaWYgKGViXyA9PSBOVUxMKSB7CkBAIC03MCw3ICs2Nyw3IEBACiAgIGlmIChyZXQgPCAwKSB7CiAgICAgZXZodHRwX2ZyZWUoZWhfKTsKICAgICBldmVudF9iYXNlX2ZyZWUoZWJfKTsKLQl0aHJvdyBURXhjZXB0aW9uKCJldmh0dHBfYmluZF9zb2NrZXQgZmFpbGVkIik7CisgICAgdGhyb3cgVEV4Y2VwdGlvbigiZXZodHRwX2JpbmRfc29ja2V0IGZhaWxlZCIpOwogICB9CiAKICAgLy8gUmVnaXN0ZXIgYSBoYW5kbGVyLiAgSWYgeW91IHVzZSB0aGUgb3RoZXIgY29uc3RydWN0b3IsCkBAIC03OSw3ICs3Niw2IEBACiAgIGV2aHR0cF9zZXRfY2IoZWhfLCAiLyIsIHJlcXVlc3QsICh2b2lkKil0aGlzKTsKIH0KIAotCiBURXZodHRwU2VydmVyOjp+VEV2aHR0cFNlcnZlcigpIHsKICAgaWYgKGVoXyAhPSBOVUxMKSB7CiAgICAgZXZodHRwX2ZyZWUoZWhfKTsKQEAgLTg5LDcgKzg1LDYgQEAKICAgfQogfQogCi0KIGludCBURXZodHRwU2VydmVyOjpzZXJ2ZSgpIHsKICAgaWYgKGViXyA9PSBOVUxMKSB7CiAgICAgdGhyb3cgVEV4Y2VwdGlvbigiVW5leHBlY3RlZCBjYWxsIHRvIFRFdmh0dHBTZXJ2ZXI6OnNlcnZlIik7CkBAIC05NywzOCArOTIsMzQgQEAKICAgcmV0dXJuIGV2ZW50X2Jhc2VfZGlzcGF0Y2goZWJfKTsKIH0KIAotCi1URXZodHRwU2VydmVyOjpSZXF1ZXN0Q29udGV4dDo6UmVxdWVzdENvbnRleHQoc3RydWN0IGV2aHR0cF9yZXF1ZXN0KiByZXEpIDogcmVxKHJlcSkKLSAgLCBpYnVmKG5ldyBUTWVtb3J5QnVmZmVyKEVWQlVGRkVSX0RBVEEocmVxLT5pbnB1dF9idWZmZXIpLCBzdGF0aWNfY2FzdDx1aW50MzJfdD4oRVZCVUZGRVJfTEVOR1RIKHJlcS0+aW5wdXRfYnVmZmVyKSkpKQotICAsIG9idWYobmV3IFRNZW1vcnlCdWZmZXIoKSkKLXt9Ci0KK1RFdmh0dHBTZXJ2ZXI6OlJlcXVlc3RDb250ZXh0OjpSZXF1ZXN0Q29udGV4dChzdHJ1Y3QgZXZodHRwX3JlcXVlc3QqIHJlcSkKKyAgOiByZXEocmVxKSwKKyAgICBpYnVmKG5ldyBUTWVtb3J5QnVmZmVyKEVWQlVGRkVSX0RBVEEocmVxLT5pbnB1dF9idWZmZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KEVWQlVGRkVSX0xFTkdUSChyZXEtPmlucHV0X2J1ZmZlcikpKSksCisgICAgb2J1ZihuZXcgVE1lbW9yeUJ1ZmZlcigpKSB7Cit9CiAKIHZvaWQgVEV2aHR0cFNlcnZlcjo6cmVxdWVzdChzdHJ1Y3QgZXZodHRwX3JlcXVlc3QqIHJlcSwgdm9pZCogc2VsZikgewogICB0cnkgewogICAgIHN0YXRpY19jYXN0PFRFdmh0dHBTZXJ2ZXIqPihzZWxmKS0+cHJvY2VzcyhyZXEpOwotICB9IGNhdGNoKHN0ZDo6ZXhjZXB0aW9uJiBlKSB7CisgIH0gY2F0Y2ggKHN0ZDo6ZXhjZXB0aW9uJiBlKSB7CiAgICAgZXZodHRwX3NlbmRfcmVwbHkocmVxLCBIVFRQX0lOVEVSTkFMLCBlLndoYXQoKSwgMCk7CiAgIH0KIH0KIAotCiB2b2lkIFRFdmh0dHBTZXJ2ZXI6OnByb2Nlc3Moc3RydWN0IGV2aHR0cF9yZXF1ZXN0KiByZXEpIHsKICAgUmVxdWVzdENvbnRleHQqIGN0eCA9IG5ldyBSZXF1ZXN0Q29udGV4dChyZXEpOwotICByZXR1cm4gcHJvY2Vzc29yXy0+cHJvY2VzcygKLSAgICAgIGFwYWNoZTo6dGhyaWZ0OjpzdGRjeHg6OmJpbmQoCi0gICAgICAgICZURXZodHRwU2VydmVyOjpjb21wbGV0ZSwKLSAgICAgICAgdGhpcywKLSAgICAgICAgY3R4LAotICAgICAgICBhcGFjaGU6OnRocmlmdDo6c3RkY3h4OjpwbGFjZWhvbGRlcnM6Ol8xKSwKLSAgICAgIGN0eC0+aWJ1ZiwKLSAgICAgIGN0eC0+b2J1Zik7CisgIHJldHVybiBwcm9jZXNzb3JfLT5wcm9jZXNzKHN0ZDo6YmluZCgmVEV2aHR0cFNlcnZlcjo6Y29tcGxldGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpwbGFjZWhvbGRlcnM6Ol8xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5pYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPm9idWYpOwogfQogCi0KIHZvaWQgVEV2aHR0cFNlcnZlcjo6Y29tcGxldGUoUmVxdWVzdENvbnRleHQqIGN0eCwgYm9vbCBzdWNjZXNzKSB7Ci0gICh2b2lkKSBzdWNjZXNzOwotICBzdGQ6OmF1dG9fcHRyPFJlcXVlc3RDb250ZXh0PiBwdHIoY3R4KTsKKyAgKHZvaWQpc3VjY2VzczsKKyAgc3RkOjp1bmlxdWVfcHRyPFJlcXVlc3RDb250ZXh0PiBwdHIoY3R4KTsKIAogICBpbnQgY29kZSA9IHN1Y2Nlc3MgPyAyMDAgOiA0MDA7CiAgIGNvbnN0IGNoYXIqIHJlYXNvbiA9IHN1Y2Nlc3MgPyAiT0siIDogIkJhZCBSZXF1ZXN0IjsKQEAgLTE0Miw3ICsxMzMsNyBAQAogICBzdHJ1Y3QgZXZidWZmZXIqIGJ1ZiA9IGV2YnVmZmVyX25ldygpOwogICBpZiAoYnVmID09IE5VTEwpIHsKICAgICAvLyBUT0RPOiBMb2cgYW4gZXJyb3IuCi0gICAgICBzdGQ6OmNlcnIgPDwgImV2YnVmZmVyX25ldyBmYWlsZWQgIiA8PCBfX0ZJTEVfXyA8PCAiOiIgPDwgIF9fTElORV9fIDw8IHN0ZDo6ZW5kbDsKKyAgICBzdGQ6OmNlcnIgPDwgImV2YnVmZmVyX25ldyBmYWlsZWQgIiA8PCBfX0ZJTEVfXyA8PCAiOiIgPDwgX19MSU5FX18gPDwgc3RkOjplbmRsOwogICB9IGVsc2UgewogICAgIHVpbnQ4X3QqIG9idWY7CiAgICAgdWludDMyX3Qgc3o7CkBAIC0xNTAsNyArMTQxLDggQEAKICAgICBpbnQgcmV0ID0gZXZidWZmZXJfYWRkKGJ1Ziwgb2J1Ziwgc3opOwogICAgIGlmIChyZXQgIT0gMCkgewogICAgICAgLy8gVE9ETzogTG9nIGFuIGVycm9yLgotICAgICAgc3RkOjpjZXJyIDw8ICJldmh0dHBfYWRkIGZhaWxlZCB3aXRoICIgPDwgcmV0IDw8ICIgIiA8PCBfX0ZJTEVfXyA8PCAiOiIgPDwgIF9fTElORV9fIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHN0ZDo6Y2VyciA8PCAiZXZodHRwX2FkZCBmYWlsZWQgd2l0aCAiIDw8IHJldCA8PCAiICIgPDwgX19GSUxFX18gPDwgIjoiIDw8IF9fTElORV9fCisgICAgICAgICAgICAgICAgPDwgc3RkOjplbmRsOwogICAgIH0KICAgfQogCkBAIC0xNjAsMTAgKzE1Miw5IEBACiAgIH0KIH0KIAotCiBzdHJ1Y3QgZXZlbnRfYmFzZSogVEV2aHR0cFNlcnZlcjo6Z2V0RXZlbnRCYXNlKCkgewogICByZXR1cm4gZWJfOwogfQotCi0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6YXN5bmMKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmFzeW5jCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEV2aHR0cFNlcnZlci5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RFdmh0dHBTZXJ2ZXIuaAppbmRleCBlZGM2ZmZiLi5jNWJmM2I2IDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEV2aHR0cFNlcnZlci5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9URXZodHRwU2VydmVyLmgKQEAgLTIwLDE4ICsyMCwyMCBAQAogI2lmbmRlZiBfVEhSSUZUX1RFVkhUVFBfU0VSVkVSX0hfCiAjZGVmaW5lIF9USFJJRlRfVEVWSFRUUF9TRVJWRVJfSF8gMQogCi0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+CisjaW5jbHVkZSA8bWVtb3J5PgogCiBzdHJ1Y3QgZXZlbnRfYmFzZTsKIHN0cnVjdCBldmh0dHA7CiBzdHJ1Y3QgZXZodHRwX3JlcXVlc3Q7CiAKLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIGFzeW5jIHsKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgYXN5bmMgewogCiBjbGFzcyBUQXN5bmNCdWZmZXJQcm9jZXNzb3I7CiAKIGNsYXNzIFRFdmh0dHBTZXJ2ZXIgewotIHB1YmxpYzoKK3B1YmxpYzoKICAgLyoqCiAgICAqIENyZWF0ZSBhIFRFdmh0dHBTZXJ2ZXIgZm9yIHVzZSB3aXRoIGFuIGV4dGVybmFsIGV2aHR0cCBpbnN0YW5jZS4KICAgICogTXVzdCBiZSBtYW51YWxseSBpbnN0YWxsZWQgd2l0aCBldmh0dHBfc2V0X2NiLCB1c2luZwpAQCAtMzksMTQgKzQxLDE0IEBACiAgICAqIGFkZHJlc3Mgb2YgdGhlIHNlcnZlciBhcyB0aGUgZXh0cmEgYXJnLgogICAgKiBEbyBub3QgY2FsbCAic2VydmUiIG9uIHRoaXMgc2VydmVyLgogICAgKi8KLSAgVEV2aHR0cFNlcnZlcihib29zdDo6c2hhcmVkX3B0cjxUQXN5bmNCdWZmZXJQcm9jZXNzb3I+IHByb2Nlc3Nvcik7CisgIFRFdmh0dHBTZXJ2ZXIoc3RkOjpzaGFyZWRfcHRyPFRBc3luY0J1ZmZlclByb2Nlc3Nvcj4gcHJvY2Vzc29yKTsKIAogICAvKioKICAgICogQ3JlYXRlIGEgVEV2aHR0cFNlcnZlciB3aXRoIGFuIGVtYmVkZGVkIGV2ZW50X2Jhc2UgYW5kIGV2aHR0cCwKICAgICogbGlzdGVuaW5nIG9uIHBvcnQgYW5kIHJlc3BvbmRpbmcgb24gdGhlIGVuZHBvaW50ICIvIi4KICAgICogQ2FsbCAic2VydmUiIG9uIHRoaXMgc2VydmVyIHRvIHNlcnZlIGZvcmV2ZXIuCiAgICAqLwotICBURXZodHRwU2VydmVyKGJvb3N0OjpzaGFyZWRfcHRyPFRBc3luY0J1ZmZlclByb2Nlc3Nvcj4gcHJvY2Vzc29yLCBpbnQgcG9ydCk7CisgIFRFdmh0dHBTZXJ2ZXIoc3RkOjpzaGFyZWRfcHRyPFRBc3luY0J1ZmZlclByb2Nlc3Nvcj4gcHJvY2Vzc29yLCBpbnQgcG9ydCk7CiAKICAgflRFdmh0dHBTZXJ2ZXIoKTsKIApAQCAtNTUsMTcgKzU3LDE4IEBACiAKICAgc3RydWN0IGV2ZW50X2Jhc2UqIGdldEV2ZW50QmFzZSgpOwogCi0gcHJpdmF0ZToKK3ByaXZhdGU6CiAgIHN0cnVjdCBSZXF1ZXN0Q29udGV4dDsKIAogICB2b2lkIHByb2Nlc3Moc3RydWN0IGV2aHR0cF9yZXF1ZXN0KiByZXEpOwogICB2b2lkIGNvbXBsZXRlKFJlcXVlc3RDb250ZXh0KiBjdHgsIGJvb2wgc3VjY2Vzcyk7CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VEFzeW5jQnVmZmVyUHJvY2Vzc29yPiBwcm9jZXNzb3JfOworICBzdGQ6OnNoYXJlZF9wdHI8VEFzeW5jQnVmZmVyUHJvY2Vzc29yPiBwcm9jZXNzb3JfOwogICBzdHJ1Y3QgZXZlbnRfYmFzZSogZWJfOwogICBzdHJ1Y3QgZXZodHRwKiBlaF87CiB9OwotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OmFzeW5jCit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojphc3luYwogCiAjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RFVkhUVFBfU0VSVkVSX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvQm9vc3RNb25pdG9yLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Cb29zdE1vbml0b3IuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDI3MTU3Li4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Cb29zdE1vbml0b3IuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjExICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHRocmlmdC90aHJpZnQtY29uZmlnLmg+Ci0KLSNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTW9uaXRvci5oPgotI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9FeGNlcHRpb24uaD4KLSNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVXRpbC5oPgotI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvUGxhdGZvcm1Tb2NrZXQuaD4KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLQotI2luY2x1ZGUgPGJvb3N0L3Njb3BlZF9wdHIuaHBwPgotI2luY2x1ZGUgPGJvb3N0L3RocmVhZC5ocHA+Ci0jaW5jbHVkZSA8Ym9vc3QvZGF0ZV90aW1lL3Bvc2l4X3RpbWUvcG9zaXhfdGltZS5ocHA+Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKLQotLyoqCi0gKiBNb25pdG9yIGltcGxlbWVudGF0aW9uIHVzaW5nIHRoZSBib29zdCB0aHJlYWQgbGlicmFyeQotICoKLSAqIEB2ZXJzaW9uICRJZDokCi0gKi8KLWNsYXNzIE1vbml0b3I6OkltcGwgOiBwdWJsaWMgYm9vc3Q6OmNvbmRpdGlvbl92YXJpYWJsZV9hbnkgewotCi0gcHVibGljOgotCi0gIEltcGwoKQotICAgICA6IG93bmVkTXV0ZXhfKG5ldyBNdXRleCgpKSwKLSAgICAgICBtdXRleF8oTlVMTCkgewotICAgIGluaXQob3duZWRNdXRleF8uZ2V0KCkpOwotICB9Ci0KLSAgSW1wbChNdXRleCogbXV0ZXgpCi0gICAgIDogbXV0ZXhfKE5VTEwpIHsKLSAgICBpbml0KG11dGV4KTsKLSAgfQotCi0gIEltcGwoTW9uaXRvciogbW9uaXRvcikKLSAgICAgOiBtdXRleF8oTlVMTCkgewotICAgIGluaXQoJihtb25pdG9yLT5tdXRleCgpKSk7Ci0gIH0KLQotICBNdXRleCYgbXV0ZXgoKSB7IHJldHVybiAqbXV0ZXhfOyB9Ci0gIHZvaWQgbG9jaygpIHsgbXV0ZXgoKS5sb2NrKCk7IH0KLSAgdm9pZCB1bmxvY2soKSB7IG11dGV4KCkudW5sb2NrKCk7IH0KLQotICAvKioKLSAgICogRXhjZXB0aW9uLXRocm93aW5nIHZlcnNpb24gb2Ygd2FpdEZvclRpbWVSZWxhdGl2ZSgpLCBjYWxsZWQgc2ltcGx5Ci0gICAqIHdhaXQoaW50NjQpIGZvciBoaXN0b3JpY2FsIHJlYXNvbnMuICBUaW1lb3V0IGlzIGluIG1pbGxpc2Vjb25kcy4KLSAgICoKLSAgICogSWYgdGhlIGNvbmRpdGlvbiBvY2N1cnMsICB0aGlzIGZ1bmN0aW9uIHJldHVybnMgY2xlYW5seTsgb24gdGltZW91dCBvcgotICAgKiBlcnJvciBhbiBleGNlcHRpb24gaXMgdGhyb3duLgotICAgKi8KLSAgdm9pZCB3YWl0KGludDY0X3QgdGltZW91dF9tcykgewotICAgIGludCByZXN1bHQgPSB3YWl0Rm9yVGltZVJlbGF0aXZlKHRpbWVvdXRfbXMpOwotICAgIGlmIChyZXN1bHQgPT0gVEhSSUZUX0VUSU1FRE9VVCkgewotICAgICAgdGhyb3cgVGltZWRPdXRFeGNlcHRpb24oKTsKLSAgICB9IGVsc2UgaWYgKHJlc3VsdCAhPSAwKSB7Ci0gICAgICB0aHJvdyBURXhjZXB0aW9uKAotICAgICAgICAiTW9uaXRvcjo6d2FpdCgpIGZhaWxlZCIpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBXYWl0cyB1bnRpbCB0aGUgc3BlY2lmaWVkIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGZvciB0aGUgY29uZGl0aW9uIHRvCi0gICAqIG9jY3VyLCBvciB3YWl0cyBmb3JldmVyIGlmIHRpbWVvdXRfbXMgPT0gMC4KLSAgICoKLSAgICogUmV0dXJucyAwIGlmIGNvbmRpdGlvbiBvY2N1cnMsIFRIUklGVF9FVElNRURPVVQgb24gdGltZW91dCwgb3IgYW4gZXJyb3IgY29kZS4KLSAgICovCi0gIGludCB3YWl0Rm9yVGltZVJlbGF0aXZlKGludDY0X3QgdGltZW91dF9tcykgewotICAgIGlmICh0aW1lb3V0X21zID09IDBMTCkgewotICAgICAgcmV0dXJuIHdhaXRGb3JldmVyKCk7Ci0gICAgfQotCi0gICAgYXNzZXJ0KG11dGV4Xyk7Ci0JYm9vc3Q6OnRpbWVkX211dGV4KiBtdXRleEltcGwgPQotICAgICAgcmVpbnRlcnByZXRfY2FzdDxib29zdDo6dGltZWRfbXV0ZXgqPihtdXRleF8tPmdldFVuZGVybHlpbmdJbXBsKCkpOwotICAgIGFzc2VydChtdXRleEltcGwpOwotCi0JYm9vc3Q6OnRpbWVkX211dGV4OjpzY29wZWRfbG9jayBsb2NrKCptdXRleEltcGwsIGJvb3N0OjphZG9wdF9sb2NrKTsKLQlpbnQgcmVzID0gdGltZWRfd2FpdChsb2NrLCBib29zdDo6Z2V0X3N5c3RlbV90aW1lKCkrYm9vc3Q6OnBvc2l4X3RpbWU6Om1pbGxpc2Vjb25kcyh0aW1lb3V0X21zKSkgPyAwIDogVEhSSUZUX0VUSU1FRE9VVDsKLQlsb2NrLnJlbGVhc2UoKTsKLQlyZXR1cm4gcmVzOwotICB9Ci0KLSAgLyoqCi0gICAqIFdhaXRzIHVudGlsIHRoZSBhYnNvbHV0ZSB0aW1lIHNwZWNpZmllZCB1c2luZyBzdHJ1Y3QgVEhSSUZUX1RJTUVTUEVDLgotICAgKiBSZXR1cm5zIDAgaWYgY29uZGl0aW9uIG9jY3VycywgVEhSSUZUX0VUSU1FRE9VVCBvbiB0aW1lb3V0LCBvciBhbiBlcnJvciBjb2RlLgotICAgKi8KLSAgaW50IHdhaXRGb3JUaW1lKGNvbnN0IFRIUklGVF9USU1FU1BFQyogYWJzdGltZSkgewotICAgIHN0cnVjdCB0aW1ldmFsIHRlbXA7Ci0gICAgdGVtcC50dl9zZWMgID0gc3RhdGljX2Nhc3Q8bG9uZz4oYWJzdGltZS0+dHZfc2VjKTsKLSAgICB0ZW1wLnR2X3VzZWMgPSBzdGF0aWNfY2FzdDxsb25nPihhYnN0aW1lLT50dl9uc2VjKSAvIDEwMDA7Ci0gICAgcmV0dXJuIHdhaXRGb3JUaW1lKCZ0ZW1wKTsKLSAgfQotCi0gIC8qKgotICAgKiBXYWl0cyB1bnRpbCB0aGUgYWJzb2x1dGUgdGltZSBzcGVjaWZpZWQgdXNpbmcgc3RydWN0IHRpbWV2YWwuCi0gICAqIFJldHVybnMgMCBpZiBjb25kaXRpb24gb2NjdXJzLCBUSFJJRlRfRVRJTUVET1VUIG9uIHRpbWVvdXQsIG9yIGFuIGVycm9yIGNvZGUuCi0gICAqLwotICBpbnQgd2FpdEZvclRpbWUoY29uc3Qgc3RydWN0IHRpbWV2YWwqIGFic3RpbWUpIHsKLSAgICBhc3NlcnQobXV0ZXhfKTsKLSAgICBib29zdDo6dGltZWRfbXV0ZXgqIG11dGV4SW1wbCA9Ci0gICAgICBzdGF0aWNfY2FzdDxib29zdDo6dGltZWRfbXV0ZXgqPihtdXRleF8tPmdldFVuZGVybHlpbmdJbXBsKCkpOwotICAgIGFzc2VydChtdXRleEltcGwpOwotCi0gICAgc3RydWN0IHRpbWV2YWwgY3VycmVudHRpbWU7Ci0gICAgVXRpbDo6dG9UaW1ldmFsKGN1cnJlbnR0aW1lLCBVdGlsOjpjdXJyZW50VGltZSgpKTsKLQotCWxvbmcgdHZfc2VjID0gc3RhdGljX2Nhc3Q8bG9uZz4oYWJzdGltZS0+dHZfc2VjIC0gY3VycmVudHRpbWUudHZfc2VjKTsKLQlsb25nIHR2X3VzZWMgPSBzdGF0aWNfY2FzdDxsb25nPihhYnN0aW1lLT50dl91c2VjIC0gY3VycmVudHRpbWUudHZfdXNlYyk7Ci0JaWYodHZfc2VjIDwgMCkKLQkJdHZfc2VjID0gMDsKLQlpZih0dl91c2VjIDwgMCkKLQkJdHZfdXNlYyA9IDA7Ci0KLQlib29zdDo6dGltZWRfbXV0ZXg6OnNjb3BlZF9sb2NrIGxvY2soKm11dGV4SW1wbCwgYm9vc3Q6OmFkb3B0X2xvY2spOwotCWludCByZXMgPSB0aW1lZF93YWl0KGxvY2ssIGJvb3N0OjpnZXRfc3lzdGVtX3RpbWUoKSArCi0JCWJvb3N0Ojpwb3NpeF90aW1lOjpzZWNvbmRzKHR2X3NlYykgKwotCQlib29zdDo6cG9zaXhfdGltZTo6bWljcm9zZWNvbmRzKHR2X3VzZWMpCi0JCSkgPyAwIDogVEhSSUZUX0VUSU1FRE9VVDsKLQlsb2NrLnJlbGVhc2UoKTsKLQlyZXR1cm4gcmVzOwotICB9Ci0KLSAgLyoqCi0gICAqIFdhaXRzIGZvcmV2ZXIgdW50aWwgdGhlIGNvbmRpdGlvbiBvY2N1cnMuCi0gICAqIFJldHVybnMgMCBpZiBjb25kaXRpb24gb2NjdXJzLCBvciBhbiBlcnJvciBjb2RlIG90aGVyd2lzZS4KLSAgICovCi0gIGludCB3YWl0Rm9yZXZlcigpIHsKLSAgICBhc3NlcnQobXV0ZXhfKTsKLSAgICBib29zdDo6dGltZWRfbXV0ZXgqIG11dGV4SW1wbCA9Ci0gICAgICByZWludGVycHJldF9jYXN0PGJvb3N0Ojp0aW1lZF9tdXRleCo+KG11dGV4Xy0+Z2V0VW5kZXJseWluZ0ltcGwoKSk7Ci0gICAgYXNzZXJ0KG11dGV4SW1wbCk7Ci0KLQlib29zdDo6dGltZWRfbXV0ZXg6OnNjb3BlZF9sb2NrIGxvY2soKm11dGV4SW1wbCwgYm9vc3Q6OmFkb3B0X2xvY2spOwotCSgoYm9vc3Q6OmNvbmRpdGlvbl92YXJpYWJsZV9hbnkqKXRoaXMpLT53YWl0KGxvY2spOwotCWxvY2sucmVsZWFzZSgpOwotICAgIHJldHVybiAwOwotICB9Ci0KLQotICB2b2lkIG5vdGlmeSgpIHsKLQkgIG5vdGlmeV9vbmUoKTsKLSAgfQotCi0gIHZvaWQgbm90aWZ5QWxsKCkgewotCSAgbm90aWZ5X2FsbCgpOwotICB9Ci0KLSBwcml2YXRlOgotCi0gIHZvaWQgaW5pdChNdXRleCogbXV0ZXgpIHsKLSAgICBtdXRleF8gPSBtdXRleDsKLSAgfQotCi0gIGJvb3N0OjpzY29wZWRfcHRyPE11dGV4PiBvd25lZE11dGV4XzsKLSAgTXV0ZXgqIG11dGV4XzsKLX07Ci0KLU1vbml0b3I6Ok1vbml0b3IoKSA6IGltcGxfKG5ldyBNb25pdG9yOjpJbXBsKCkpIHt9Ci1Nb25pdG9yOjpNb25pdG9yKE11dGV4KiBtdXRleCkgOiBpbXBsXyhuZXcgTW9uaXRvcjo6SW1wbChtdXRleCkpIHt9Ci1Nb25pdG9yOjpNb25pdG9yKE1vbml0b3IqIG1vbml0b3IpIDogaW1wbF8obmV3IE1vbml0b3I6OkltcGwobW9uaXRvcikpIHt9Ci0KLU1vbml0b3I6On5Nb25pdG9yKCkgeyBkZWxldGUgaW1wbF87IH0KLQotTXV0ZXgmIE1vbml0b3I6Om11dGV4KCkgY29uc3QgeyByZXR1cm4gY29uc3RfY2FzdDxNb25pdG9yOjpJbXBsKj4oaW1wbF8pLT5tdXRleCgpOyB9Ci0KLXZvaWQgTW9uaXRvcjo6bG9jaygpIGNvbnN0IHsgY29uc3RfY2FzdDxNb25pdG9yOjpJbXBsKj4oaW1wbF8pLT5sb2NrKCk7IH0KLQotdm9pZCBNb25pdG9yOjp1bmxvY2soKSBjb25zdCB7IGNvbnN0X2Nhc3Q8TW9uaXRvcjo6SW1wbCo+KGltcGxfKS0+dW5sb2NrKCk7IH0KLQotdm9pZCBNb25pdG9yOjp3YWl0KGludDY0X3QgdGltZW91dCkgY29uc3QgeyBjb25zdF9jYXN0PE1vbml0b3I6OkltcGwqPihpbXBsXyktPndhaXQodGltZW91dCk7IH0KLQotaW50IE1vbml0b3I6OndhaXRGb3JUaW1lKGNvbnN0IFRIUklGVF9USU1FU1BFQyogYWJzdGltZSkgY29uc3QgewotICByZXR1cm4gY29uc3RfY2FzdDxNb25pdG9yOjpJbXBsKj4oaW1wbF8pLT53YWl0Rm9yVGltZShhYnN0aW1lKTsKLX0KLQotaW50IE1vbml0b3I6OndhaXRGb3JUaW1lKGNvbnN0IHRpbWV2YWwqIGFic3RpbWUpIGNvbnN0IHsKLSAgcmV0dXJuIGNvbnN0X2Nhc3Q8TW9uaXRvcjo6SW1wbCo+KGltcGxfKS0+d2FpdEZvclRpbWUoYWJzdGltZSk7Ci19Ci0KLWludCBNb25pdG9yOjp3YWl0Rm9yVGltZVJlbGF0aXZlKGludDY0X3QgdGltZW91dF9tcykgY29uc3QgewotICByZXR1cm4gY29uc3RfY2FzdDxNb25pdG9yOjpJbXBsKj4oaW1wbF8pLT53YWl0Rm9yVGltZVJlbGF0aXZlKHRpbWVvdXRfbXMpOwotfQotCi1pbnQgTW9uaXRvcjo6d2FpdEZvcmV2ZXIoKSBjb25zdCB7Ci0gIHJldHVybiBjb25zdF9jYXN0PE1vbml0b3I6OkltcGwqPihpbXBsXyktPndhaXRGb3JldmVyKCk7Ci19Ci0KLXZvaWQgTW9uaXRvcjo6bm90aWZ5KCkgY29uc3QgeyBjb25zdF9jYXN0PE1vbml0b3I6OkltcGwqPihpbXBsXyktPm5vdGlmeSgpOyB9Ci0KLXZvaWQgTW9uaXRvcjo6bm90aWZ5QWxsKCkgY29uc3QgeyBjb25zdF9jYXN0PE1vbml0b3I6OkltcGwqPihpbXBsXyktPm5vdGlmeUFsbCgpOyB9Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Cb29zdE11dGV4LmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Cb29zdE11dGV4LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTljMzYxOC4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvQm9vc3RNdXRleC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDx0aHJpZnQvdGhyaWZ0LWNvbmZpZy5oPgotCi0jaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L011dGV4Lmg+Ci0jaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1V0aWwuaD4KLSNpbmNsdWRlIDx0aHJpZnQvVGhyaWZ0Lmg+Ci0KLSNpbmNsdWRlIDxjYXNzZXJ0PgotI2luY2x1ZGUgPGJvb3N0L3RocmVhZC5ocHA+Ci0jaW5jbHVkZSA8Ym9vc3QvdGhyZWFkL211dGV4LmhwcD4KLSNpbmNsdWRlIDxib29zdC9kYXRlX3RpbWUvcG9zaXhfdGltZS9wb3NpeF90aW1lLmhwcD4KLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgY29uY3VycmVuY3kgewotCi0vKioKLSAqIEltcGxlbWVudGF0aW9uIG9mIE11dGV4IGNsYXNzIHVzaW5nIGJvb3N0IGludGVycHJvY2VzcyBtdXRleAotICoKLSAqIEB2ZXJzaW9uICRJZDokCi0gKi8KLWNsYXNzIE11dGV4OjppbXBsIDogcHVibGljIGJvb3N0Ojp0aW1lZF9tdXRleCB7Ci19OwotCi1NdXRleDo6TXV0ZXgoSW5pdGlhbGl6ZXIgaW5pdCkgOiBpbXBsXyhuZXcgTXV0ZXg6OmltcGwoKSkKLXsgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRShpbml0KTsgfQotCi12b2lkKiBNdXRleDo6Z2V0VW5kZXJseWluZ0ltcGwoKSBjb25zdCB7IHJldHVybiBpbXBsXy5nZXQoKTsgfQotCi12b2lkIE11dGV4Ojpsb2NrKCkgY29uc3QgeyBpbXBsXy0+bG9jaygpOyB9Ci0KLWJvb2wgTXV0ZXg6OnRyeWxvY2soKSBjb25zdCB7IHJldHVybiBpbXBsXy0+dHJ5X2xvY2soKTsgfQotCi1ib29sIE11dGV4Ojp0aW1lZGxvY2soaW50NjRfdCBtcykgY29uc3QgeyByZXR1cm4gaW1wbF8tPnRpbWVkX2xvY2soYm9vc3Q6OmdldF9zeXN0ZW1fdGltZSgpK2Jvb3N0Ojpwb3NpeF90aW1lOjptaWxsaXNlY29uZHMobXMpKTsgfQotCi12b2lkIE11dGV4Ojp1bmxvY2soKSBjb25zdCB7IGltcGxfLT51bmxvY2soKTsgfQotCi12b2lkIE11dGV4OjpERUZBVUxUX0lOSVRJQUxJWkVSKHZvaWQqIGFyZykgewotICBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFKGFyZyk7Ci19Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Cb29zdFRocmVhZEZhY3RvcnkuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L0Jvb3N0VGhyZWFkRmFjdG9yeS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0NWE5NjQuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L0Jvb3N0VGhyZWFkRmFjdG9yeS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxODQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8dGhyaWZ0L3RocmlmdC1jb25maWcuaD4KLQotI2lmZGVmIFVTRV9CT09TVF9USFJFQUQKLQotI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9Cb29zdFRocmVhZEZhY3RvcnkuaD4KLSNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvRXhjZXB0aW9uLmg+Ci0KLSNpbmNsdWRlIDxjYXNzZXJ0PgotCi0jaW5jbHVkZSA8Ym9vc3Qvd2Vha19wdHIuaHBwPgotI2luY2x1ZGUgPGJvb3N0L3RocmVhZC5ocHA+Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKLQotdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7Ci11c2luZyBib29zdDo6d2Vha19wdHI7Ci0KLS8qKgotICogVGhlIGJvb3N0IHRocmVhZCBjbGFzcy4KLSAqCi0gKiBAdmVyc2lvbiAkSWQ6JAotICovCi1jbGFzcyBCb29zdFRocmVhZDogcHVibGljIFRocmVhZCB7Ci0gcHVibGljOgotCi0gIGVudW0gU1RBVEUgewotICAgIHVuaW5pdGlhbGl6ZWQsCi0gICAgc3RhcnRpbmcsCi0gICAgc3RhcnRlZCwKLSAgICBzdG9wcGluZywKLSAgICBzdG9wcGVkCi0gIH07Ci0KLSAgc3RhdGljIHZvaWQqIHRocmVhZE1haW4odm9pZCogYXJnKTsKLQotIHByaXZhdGU6Ci0gIHN0ZDo6YXV0b19wdHI8Ym9vc3Q6OnRocmVhZD4gdGhyZWFkXzsKLSAgU1RBVEUgc3RhdGVfOwotICB3ZWFrX3B0cjxCb29zdFRocmVhZD4gc2VsZl87Ci0gIGJvb2wgZGV0YWNoZWRfOwotCi0gcHVibGljOgotCi0gIEJvb3N0VGhyZWFkKGJvb2wgZGV0YWNoZWQsIHNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlKSA6Ci0gICAgc3RhdGVfKHVuaW5pdGlhbGl6ZWQpLAotICAgIGRldGFjaGVkXyhkZXRhY2hlZCkgewotICAgICAgdGhpcy0+VGhyZWFkOjpydW5uYWJsZShydW5uYWJsZSk7Ci0gICAgfQotCi0gIH5Cb29zdFRocmVhZCgpIHsKLSAgICBpZighZGV0YWNoZWRfKSB7Ci0gICAgICB0cnkgewotICAgICAgICBqb2luKCk7Ci0gICAgICB9IGNhdGNoKC4uLikgewotICAgICAgICAvLyBXZSdyZSByZWFsbHkgaG9zZWQuCi0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBzdGFydCgpIHsKLSAgICBpZiAoc3RhdGVfICE9IHVuaW5pdGlhbGl6ZWQpIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLy8gQ3JlYXRlIHJlZmVyZW5jZQotICAgIHNoYXJlZF9wdHI8Qm9vc3RUaHJlYWQ+KiBzZWxmUmVmID0gbmV3IHNoYXJlZF9wdHI8Qm9vc3RUaHJlYWQ+KCk7Ci0gICAgKnNlbGZSZWYgPSBzZWxmXy5sb2NrKCk7Ci0KLSAgICBzdGF0ZV8gPSBzdGFydGluZzsKLQotICAgIHRocmVhZF8gPSBzdGQ6OmF1dG9fcHRyPGJvb3N0Ojp0aHJlYWQ+KG5ldyBib29zdDo6dGhyZWFkKGJvb3N0OjpiaW5kKHRocmVhZE1haW4sICh2b2lkKilzZWxmUmVmKSkpOwotCi0gICAgaWYoZGV0YWNoZWRfKQotICAgICAgdGhyZWFkXy0+ZGV0YWNoKCk7Ci0gIH0KLQotICB2b2lkIGpvaW4oKSB7Ci0gICAgaWYgKCFkZXRhY2hlZF8gJiYgc3RhdGVfICE9IHVuaW5pdGlhbGl6ZWQpIHsKLSAgICAgIHRocmVhZF8tPmpvaW4oKTsKLSAgICB9Ci0gIH0KLQotICBUaHJlYWQ6OmlkX3QgZ2V0SWQoKSB7Ci0gICAgcmV0dXJuIHRocmVhZF8uZ2V0KCkgPyB0aHJlYWRfLT5nZXRfaWQoKSA6IGJvb3N0Ojp0aHJlYWQ6OmlkKCk7Ci0gIH0KLQotICBzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZSgpIGNvbnN0IHsgcmV0dXJuIFRocmVhZDo6cnVubmFibGUoKTsgfQotCi0gIHZvaWQgcnVubmFibGUoc2hhcmVkX3B0cjxSdW5uYWJsZT4gdmFsdWUpIHsgVGhyZWFkOjpydW5uYWJsZSh2YWx1ZSk7IH0KLQotICB2b2lkIHdlYWtSZWYoc2hhcmVkX3B0cjxCb29zdFRocmVhZD4gc2VsZikgewotICAgIGFzc2VydChzZWxmLmdldCgpID09IHRoaXMpOwotICAgIHNlbGZfID0gd2Vha19wdHI8Qm9vc3RUaHJlYWQ+KHNlbGYpOwotICB9Ci19OwotCi12b2lkKiBCb29zdFRocmVhZDo6dGhyZWFkTWFpbih2b2lkKiBhcmcpIHsKLSAgc2hhcmVkX3B0cjxCb29zdFRocmVhZD4gdGhyZWFkID0gKihzaGFyZWRfcHRyPEJvb3N0VGhyZWFkPiopYXJnOwotICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxzaGFyZWRfcHRyPEJvb3N0VGhyZWFkPio+KGFyZyk7Ci0KLSAgaWYgKCF0aHJlYWQpIHsKLSAgICByZXR1cm4gKHZvaWQqKTA7Ci0gIH0KLQotICBpZiAodGhyZWFkLT5zdGF0ZV8gIT0gc3RhcnRpbmcpIHsKLSAgICByZXR1cm4gKHZvaWQqKTA7Ci0gIH0KLQotICB0aHJlYWQtPnN0YXRlXyA9IHN0YXJ0ZWQ7Ci0gIHRocmVhZC0+cnVubmFibGUoKS0+cnVuKCk7Ci0KLSAgaWYgKHRocmVhZC0+c3RhdGVfICE9IHN0b3BwaW5nICYmIHRocmVhZC0+c3RhdGVfICE9IHN0b3BwZWQpIHsKLSAgICB0aHJlYWQtPnN0YXRlXyA9IHN0b3BwaW5nOwotICB9Ci0gIHJldHVybiAodm9pZCopMDsKLX0KLQotLyoqCi0gKiBQT1NJWCBUaHJlYWQgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbgotICovCi1jbGFzcyBCb29zdFRocmVhZEZhY3Rvcnk6OkltcGwgewotCi0gcHJpdmF0ZToKLSAgYm9vbCBkZXRhY2hlZF87Ci0KLSBwdWJsaWM6Ci0KLSAgSW1wbChib29sIGRldGFjaGVkKSA6Ci0gICAgZGV0YWNoZWRfKGRldGFjaGVkKSB7fQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IFBPU0lYIHRocmVhZCB0byBydW4gdGhlIHJ1bm5hYmxlIG9iamVjdAotICAgKgotICAgKiBAcGFyYW0gcnVubmFibGUgQSBydW5uYWJsZSBvYmplY3QKLSAgICovCi0gIHNoYXJlZF9wdHI8VGhyZWFkPiBuZXdUaHJlYWQoc2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGUpIGNvbnN0IHsKLSAgICBzaGFyZWRfcHRyPEJvb3N0VGhyZWFkPiByZXN1bHQgPSBzaGFyZWRfcHRyPEJvb3N0VGhyZWFkPihuZXcgQm9vc3RUaHJlYWQoZGV0YWNoZWRfLCBydW5uYWJsZSkpOwotICAgIHJlc3VsdC0+d2Vha1JlZihyZXN1bHQpOwotICAgIHJ1bm5hYmxlLT50aHJlYWQocmVzdWx0KTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgYm9vbCBpc0RldGFjaGVkKCkgY29uc3QgeyByZXR1cm4gZGV0YWNoZWRfOyB9Ci0KLSAgdm9pZCBzZXREZXRhY2hlZChib29sIHZhbHVlKSB7IGRldGFjaGVkXyA9IHZhbHVlOyB9Ci0KLSAgVGhyZWFkOjppZF90IGdldEN1cnJlbnRUaHJlYWRJZCgpIGNvbnN0IHsKLSAgICByZXR1cm4gYm9vc3Q6OnRoaXNfdGhyZWFkOjpnZXRfaWQoKTsKLSAgfQotfTsKLQotQm9vc3RUaHJlYWRGYWN0b3J5OjpCb29zdFRocmVhZEZhY3RvcnkoYm9vbCBkZXRhY2hlZCkgOgotICBpbXBsXyhuZXcgQm9vc3RUaHJlYWRGYWN0b3J5OjpJbXBsKGRldGFjaGVkKSkge30KLQotc2hhcmVkX3B0cjxUaHJlYWQ+IEJvb3N0VGhyZWFkRmFjdG9yeTo6bmV3VGhyZWFkKHNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlKSBjb25zdCB7IHJldHVybiBpbXBsXy0+bmV3VGhyZWFkKHJ1bm5hYmxlKTsgfQotCi1ib29sIEJvb3N0VGhyZWFkRmFjdG9yeTo6aXNEZXRhY2hlZCgpIGNvbnN0IHsgcmV0dXJuIGltcGxfLT5pc0RldGFjaGVkKCk7IH0KLQotdm9pZCBCb29zdFRocmVhZEZhY3Rvcnk6OnNldERldGFjaGVkKGJvb2wgdmFsdWUpIHsgaW1wbF8tPnNldERldGFjaGVkKHZhbHVlKTsgfQotCi1UaHJlYWQ6OmlkX3QgQm9vc3RUaHJlYWRGYWN0b3J5OjpnZXRDdXJyZW50VGhyZWFkSWQoKSBjb25zdCB7IHJldHVybiBpbXBsXy0+Z2V0Q3VycmVudFRocmVhZElkKCk7IH0KLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQotCi0jZW5kaWYgLy8gVVNFX0JPT1NUX1RIUkVBRApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L0Jvb3N0VGhyZWFkRmFjdG9yeS5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L0Jvb3N0VGhyZWFkRmFjdG9yeS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTIzNmQzLi4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Cb29zdFRocmVhZEZhY3RvcnkuaAorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX0JPT1NUVEhSRUFERkFDVE9SWV9IXwotI2RlZmluZSBfVEhSSUZUX0NPTkNVUlJFTkNZX0JPT1NUVEhSRUFERkFDVE9SWV9IXyAxCi0KLSNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkLmg+Ci0KLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgY29uY3VycmVuY3kgewotCi0vKioKLSAqIEEgdGhyZWFkIGZhY3RvcnkgdG8gY3JlYXRlIHBvc2l4IHRocmVhZHMKLSAqCi0gKiBAdmVyc2lvbiAkSWQ6JAotICovCi1jbGFzcyBCb29zdFRocmVhZEZhY3RvcnkgOiBwdWJsaWMgVGhyZWFkRmFjdG9yeSB7Ci0KLSBwdWJsaWM6Ci0KLSAgLyoqCi0gICAqIEJvb3N0IHRocmVhZCBmYWN0b3J5LiAgQWxsIHRocmVhZHMgY3JlYXRlZCBieSBhIGZhY3RvcnkgYXJlIHJlZmVyZW5jZS1jb3VudGVkCi0gICAqIHZpYSBib29zdDo6c2hhcmVkX3B0ciBhbmQgYm9vc3Q6OndlYWtfcHRyLiAgVGhlIGZhY3RvcnkgZ3VhcmFudGVlcyB0aGF0IHRocmVhZHMgYW5kCi0gICAqIHRoZSBSdW5uYWJsZSB0YXNrcyB0aGV5IGhvc3Qgd2lsbCBiZSBwcm9wZXJseSBjbGVhbmVkIHVwIG9uY2UgdGhlIGxhc3Qgc3Ryb25nIHJlZmVyZW5jZQotICAgKiB0byBib3RoIGlzIGdpdmVuIHVwLgotICAgKgotICAgKiBUaHJlYWRzIGFyZSBjcmVhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBib29zdCBwb2xpY3ksIHByaW9yaXR5LCBzdGFjay1zaXplLiBBIGRldGFjaGFibGUgdGhyZWFkIGlzIG5vdAotICAgKiBqb2luYWJsZS4KLSAgICoKLSAgICogQnkgZGVmYXVsdCB0aHJlYWRzIGFyZSBub3Qgam9pbmFibGUuCi0gICAqLwotCi0gIEJvb3N0VGhyZWFkRmFjdG9yeShib29sIGRldGFjaGVkPXRydWUpOwotCi0gIC8vIEZyb20gVGhyZWFkRmFjdG9yeTsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkPiBuZXdUaHJlYWQoYm9vc3Q6OnNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlKSBjb25zdDsKLQotICAvLyBGcm9tIFRocmVhZEZhY3Rvcnk7Ci0gIFRocmVhZDo6aWRfdCBnZXRDdXJyZW50VGhyZWFkSWQoKSBjb25zdDsKLQotICAvKioKLSAgICogU2V0cyBkZXRhY2hlZCBtb2RlIG9mIHRocmVhZHMKLSAgICovCi0gIHZpcnR1YWwgdm9pZCBzZXREZXRhY2hlZChib29sIGRldGFjaGVkKTsKLQotICAvKioKLSAgICogR2V0cyBjdXJyZW50IGRldGFjaGVkIG1vZGUKLSAgICovCi0gIHZpcnR1YWwgYm9vbCBpc0RldGFjaGVkKCkgY29uc3Q7Ci0KLXByaXZhdGU6Ci0gIGNsYXNzIEltcGw7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPEltcGw+IGltcGxfOwotfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQotCi0jZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX0JPT1NUVEhSRUFERkFDVE9SWV9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L0V4Y2VwdGlvbi5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L0V4Y2VwdGlvbi5oCmluZGV4IGM2MmYxMTYuLjY0MzhmZGEgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9FeGNlcHRpb24uaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvRXhjZXB0aW9uLmgKQEAgLTIzLDcgKzIzLDkgQEAKICNpbmNsdWRlIDxleGNlcHRpb24+CiAjaW5jbHVkZSA8dGhyaWZ0L1RocmlmdC5oPgogCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBjb25jdXJyZW5jeSB7CituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKIAogY2xhc3MgTm9TdWNoVGFza0V4Y2VwdGlvbiA6IHB1YmxpYyBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbiB7fTsKIApAQCAtMzksMjYgKzQxLDI0IEBACiAKIGNsYXNzIFRpbWVkT3V0RXhjZXB0aW9uIDogcHVibGljIGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uIHsKIHB1YmxpYzoKLSAgVGltZWRPdXRFeGNlcHRpb24oKTpURXhjZXB0aW9uKCJUaW1lZE91dEV4Y2VwdGlvbiIpe307Ci0gIFRpbWVkT3V0RXhjZXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlICkgOgotICAgIFRFeGNlcHRpb24obWVzc2FnZSkge30KKyAgVGltZWRPdXRFeGNlcHRpb24oKSA6IFRFeGNlcHRpb24oIlRpbWVkT3V0RXhjZXB0aW9uIil7fTsKKyAgVGltZWRPdXRFeGNlcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpIDogVEV4Y2VwdGlvbihtZXNzYWdlKSB7fQogfTsKIAogY2xhc3MgVG9vTWFueVBlbmRpbmdUYXNrc0V4Y2VwdGlvbiA6IHB1YmxpYyBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbiB7CiBwdWJsaWM6Ci0gIFRvb01hbnlQZW5kaW5nVGFza3NFeGNlcHRpb24oKTpURXhjZXB0aW9uKCJUb29NYW55UGVuZGluZ1Rhc2tzRXhjZXB0aW9uIil7fTsKLSAgVG9vTWFueVBlbmRpbmdUYXNrc0V4Y2VwdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSApIDoKLSAgICBURXhjZXB0aW9uKG1lc3NhZ2UpIHt9CisgIFRvb01hbnlQZW5kaW5nVGFza3NFeGNlcHRpb24oKSA6IFRFeGNlcHRpb24oIlRvb01hbnlQZW5kaW5nVGFza3NFeGNlcHRpb24iKXt9OworICBUb29NYW55UGVuZGluZ1Rhc2tzRXhjZXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSA6IFRFeGNlcHRpb24obWVzc2FnZSkge30KIH07CiAKIGNsYXNzIFN5c3RlbVJlc291cmNlRXhjZXB0aW9uIDogcHVibGljIGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uIHsKIHB1YmxpYzoKLSAgICBTeXN0ZW1SZXNvdXJjZUV4Y2VwdGlvbigpIHt9CisgIFN5c3RlbVJlc291cmNlRXhjZXB0aW9uKCkge30KIAotICAgIFN5c3RlbVJlc291cmNlRXhjZXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSA6Ci0gICAgICAgIFRFeGNlcHRpb24obWVzc2FnZSkge30KKyAgU3lzdGVtUmVzb3VyY2VFeGNlcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpIDogVEV4Y2VwdGlvbihtZXNzYWdlKSB7fQogfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKIAogI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9DT05DVVJSRU5DWV9FWENFUFRJT05fSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9GdW5jdGlvblJ1bm5lci5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L0Z1bmN0aW9uUnVubmVyLmgKaW5kZXggZTNiMmJmMy4uOGFkMTc2ZSAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L0Z1bmN0aW9uUnVubmVyLmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L0Z1bmN0aW9uUnVubmVyLmgKQEAgLTIwLDEwICsyMCwxMiBAQAogI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX0ZVTkNUSU9OX1JVTk5FUl9ICiAjZGVmaW5lIF9USFJJRlRfQ09OQ1VSUkVOQ1lfRlVOQ1RJT05fUlVOTkVSX0ggMQogCi0jaW5jbHVkZSA8dGhyaWZ0L2N4eGZ1bmN0aW9uYWwuaD4KICNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkLmg+CisjaW5jbHVkZSA8bWVtb3J5PgogCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBjb25jdXJyZW5jeSB7CituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKIAogLyoqCiAgKiBDb252ZW5pZW50IGltcGxlbWVudGF0aW9uIG9mIFJ1bm5hYmxlIHRoYXQgd2lsbCBleGVjdXRlIGFyYml0cmFyeSBjYWxsYmFja3MuCkBAIC00Miw1MyArNDQsNDkgQEAKICAqICBBKiBhID0gbmV3IEEoKTsKICAqICAvLyBUbyBjcmVhdGUgYSB0aHJlYWQgdGhhdCBleGVjdXRlcyBhLmZvbygpIGV2ZXJ5IDEwMCBtaWxsaXNlY29uZHM6CiAgKiAgZmFjdG9yeS0+bmV3VGhyZWFkKEZ1bmN0aW9uUnVubmVyOjpjcmVhdGUoCi0gKiAgICBhcGFjaGU6OnRocmlmdDo6c3RkY3h4OjpiaW5kKCZBOjpmb28sIGEpLCAxMDApKS0+c3RhcnQoKTsKKyAqICAgIHN0ZDo6YmluZCgmQTo6Zm9vLCBhKSwgMTAwKSktPnN0YXJ0KCk7CiAgKgogICovCiAKIGNsYXNzIEZ1bmN0aW9uUnVubmVyIDogcHVibGljIFJ1bm5hYmxlIHsKLSBwdWJsaWM6CitwdWJsaWM6CiAgIC8vIFRoaXMgaXMgdGhlIHR5cGUgb2YgY2FsbGJhY2sgJ3B0aHJlYWRfY3JlYXRlKCknIGV4cGVjdHMuCi0gIHR5cGVkZWYgdm9pZCogKCpQdGhyZWFkRnVuY1B0cikodm9pZCAqYXJnKTsKKyAgdHlwZWRlZiB2b2lkKiAoKlB0aHJlYWRGdW5jUHRyKSh2b2lkKiBhcmcpOwogICAvLyBUaGlzIGEgZnVsbHktZ2VuZXJpYyB2b2lkKHZvaWQpIGNhbGxiYWNrIGZvciBjdXN0b20gYmluZGluZ3MuCi0gIHR5cGVkZWYgYXBhY2hlOjp0aHJpZnQ6OnN0ZGN4eDo6ZnVuY3Rpb248dm9pZCgpPiBWb2lkRnVuYzsKKyAgdHlwZWRlZiBzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gVm9pZEZ1bmM7CiAKLSAgdHlwZWRlZiBhcGFjaGU6OnRocmlmdDo6c3RkY3h4OjpmdW5jdGlvbjxib29sKCk+IEJvb2xGdW5jOworICB0eXBlZGVmIHN0ZDo6ZnVuY3Rpb248Ym9vbCgpPiBCb29sRnVuYzsKIAogICAvKioKICAgICogU3ludGFjdGljIHN1Z2FyIHRvIG1ha2UgaXQgZWFzaWVyIHRvIGNyZWF0ZSBuZXcgRnVuY3Rpb25SdW5uZXIKICAgICogb2JqZWN0cyB3cmFwcGVkIGluIHNoYXJlZF9wdHIuCiAgICAqLwotICBzdGF0aWMgYm9vc3Q6OnNoYXJlZF9wdHI8RnVuY3Rpb25SdW5uZXI+IGNyZWF0ZShjb25zdCBWb2lkRnVuYyYgY29iKSB7Ci0gICAgcmV0dXJuIGJvb3N0OjpzaGFyZWRfcHRyPEZ1bmN0aW9uUnVubmVyPihuZXcgRnVuY3Rpb25SdW5uZXIoY29iKSk7CisgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8RnVuY3Rpb25SdW5uZXI+IGNyZWF0ZShjb25zdCBWb2lkRnVuYyYgY29iKSB7CisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxGdW5jdGlvblJ1bm5lcj4obmV3IEZ1bmN0aW9uUnVubmVyKGNvYikpOwogICB9CiAKLSAgc3RhdGljIGJvb3N0OjpzaGFyZWRfcHRyPEZ1bmN0aW9uUnVubmVyPiBjcmVhdGUoUHRocmVhZEZ1bmNQdHIgZnVuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogYXJnKSB7Ci0gICAgcmV0dXJuIGJvb3N0OjpzaGFyZWRfcHRyPEZ1bmN0aW9uUnVubmVyPihuZXcgRnVuY3Rpb25SdW5uZXIoZnVuYywgYXJnKSk7CisgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8RnVuY3Rpb25SdW5uZXI+IGNyZWF0ZShQdGhyZWFkRnVuY1B0ciBmdW5jLCB2b2lkKiBhcmcpIHsKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPEZ1bmN0aW9uUnVubmVyPihuZXcgRnVuY3Rpb25SdW5uZXIoZnVuYywgYXJnKSk7CiAgIH0KIAogcHJpdmF0ZToKLSAgc3RhdGljIHZvaWQgcHRocmVhZF9mdW5jX3dyYXBwZXIoUHRocmVhZEZ1bmNQdHIgZnVuYywgdm9pZCAqYXJnKQotICB7Ci0gICAgLy9kaXNjYXJkIHJldHVybiB2YWx1ZQorICBzdGF0aWMgdm9pZCBwdGhyZWFkX2Z1bmNfd3JhcHBlcihQdGhyZWFkRnVuY1B0ciBmdW5jLCB2b2lkKiBhcmcpIHsKKyAgICAvLyBkaXNjYXJkIHJldHVybiB2YWx1ZQogICAgIGZ1bmMoYXJnKTsKICAgfQorCiBwdWJsaWM6CiAgIC8qKgogICAgKiBHaXZlbiBhICdwdGhyZWFkX2NyZWF0ZScgc3R5bGUgY2FsbGJhY2ssIHRoaXMgRnVuY3Rpb25SdW5uZXIgd2lsbAogICAgKiBleGVjdXRlIHRoZSBnaXZlbiBjYWxsYmFjay4gIE5vdGUgdGhhdCB0aGUgJ3ZvaWQqJyByZXR1cm4gdmFsdWUgaXMgaWdub3JlZC4KICAgICovCiAgIEZ1bmN0aW9uUnVubmVyKFB0aHJlYWRGdW5jUHRyIGZ1bmMsIHZvaWQqIGFyZykKLSAgIDogZnVuY18oYXBhY2hlOjp0aHJpZnQ6OnN0ZGN4eDo6YmluZChwdGhyZWFkX2Z1bmNfd3JhcHBlciwgZnVuYywgYXJnKSkKLSAgeyB9CisgICAgOiBmdW5jXyhzdGQ6OmJpbmQocHRocmVhZF9mdW5jX3dyYXBwZXIsIGZ1bmMsIGFyZykpLCBpbnRlcnZhbE1zXygtMSkge30KIAogICAvKioKICAgICogR2l2ZW4gYSBnZW5lcmljIGNhbGxiYWNrLCB0aGlzIEZ1bmN0aW9uUnVubmVyIHdpbGwgZXhlY3V0ZSBpdC4KICAgICovCi0gIEZ1bmN0aW9uUnVubmVyKGNvbnN0IFZvaWRGdW5jJiBjb2IpCi0gICA6IGZ1bmNfKGNvYikKLSAgeyB9CisgIEZ1bmN0aW9uUnVubmVyKGNvbnN0IFZvaWRGdW5jJiBjb2IpIDogZnVuY18oY29iKSwgaW50ZXJ2YWxNc18oLTEpIHt9CiAKICAgLyoqCiAgICAqIEdpdmVuIGEgYm9vbCBmb28oLi4uKSB0eXBlIGNhbGxiYWNrLCBGdW5jdGlvblJ1bm5lciB3aWxsIGV4ZWN1dGUKQEAgLTk2LDI2ICs5NCwyNSBAQAogICAgKiB1bnRpbCBpdCByZXR1cm5zIGZhbHNlLiBOb3RlIHRoYXQgdGhlIGFjdHVhbCBpbnRlcnZhbCBiZXR3ZWVuIGNhbGxzIHdpbGwKICAgICogYmUgaW50ZXJ2YWxNcyBwbHVzIGV4ZWN1dGlvbiB0aW1lIG9mIHRoZSBjYWxsYmFjay4KICAgICovCi0gIEZ1bmN0aW9uUnVubmVyKGNvbnN0IEJvb2xGdW5jJiBjb2IsIGludCBpbnRlcnZhbE1zKQotICAgOiByZXBGdW5jXyhjb2IpLCBpbnRlcnZhbE1zXyhpbnRlcnZhbE1zKQotICB7IH0KKyAgRnVuY3Rpb25SdW5uZXIoY29uc3QgQm9vbEZ1bmMmIGNvYiwgaW50IGludGVydmFsTXMpIDogcmVwRnVuY18oY29iKSwgaW50ZXJ2YWxNc18oaW50ZXJ2YWxNcykge30KIAogICB2b2lkIHJ1bigpIHsKICAgICBpZiAocmVwRnVuY18pIHsKLSAgICAgIHdoaWxlKHJlcEZ1bmNfKCkpIHsKLSAgICAgICAgVEhSSUZUX1NMRUVQX1VTRUMoaW50ZXJ2YWxNc18qMTAwMCk7CisgICAgICB3aGlsZSAocmVwRnVuY18oKSkgeworICAgICAgICBUSFJJRlRfU0xFRVBfVVNFQyhpbnRlcnZhbE1zXyAqIDEwMDApOwogICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICBmdW5jXygpOwogICAgIH0KICAgfQogCi0gcHJpdmF0ZToKK3ByaXZhdGU6CiAgIFZvaWRGdW5jIGZ1bmNfOwogICBCb29sRnVuYyByZXBGdW5jXzsKICAgaW50IGludGVydmFsTXNfOwogfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKIAogI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9DT05DVVJSRU5DWV9GVU5DVElPTl9SVU5ORVJfSApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L01vbml0b3IuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L01vbml0b3IuY3BwCmluZGV4IGQ5NGIyYTQuLjk1NzBjYzYgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmNwcAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvTW9uaXRvci5jcHAKQEAgLTE3LDEyICsxNywxMyBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2luY2x1ZGUgPHRocmlmdC90aHJpZnQtY29uZmlnLmg+CisKICNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTW9uaXRvci5oPgogI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9FeGNlcHRpb24uaD4KICNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVXRpbC5oPgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvUGxhdGZvcm1Tb2NrZXQuaD4KLQotI2luY2x1ZGUgPGJvb3N0L3Njb3BlZF9wdHIuaHBwPgorI2luY2x1ZGUgPG1lbW9yeT4KIAogI2luY2x1ZGUgPGFzc2VydC5oPgogCkBAIC0zMCw5ICszMSwxMyBAQAogCiAjaW5jbHVkZSA8cHRocmVhZC5oPgogCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBjb25jdXJyZW5jeSB7CituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgewogCi11c2luZyBib29zdDo6c2NvcGVkX3B0cjsKK3VzaW5nIHN0ZDo6dW5pcXVlX3B0cjsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKKworbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKIAogLyoqCiAgKiBNb25pdG9yIGltcGxlbWVudGF0aW9uIHVzaW5nIHRoZSBQT1NJWCBwdGhyZWFkIGxpYnJhcnkKQEAgLTQxLDI2ICs0NiwxNCBAQAogICovCiBjbGFzcyBNb25pdG9yOjpJbXBsIHsKIAotIHB1YmxpYzoKLQotICBJbXBsKCkKLSAgICAgOiBvd25lZE11dGV4XyhuZXcgTXV0ZXgoKSksCi0gICAgICAgbXV0ZXhfKE5VTEwpLAotICAgICAgIGNvbmRJbml0aWFsaXplZF8oZmFsc2UpIHsKK3B1YmxpYzoKKyAgSW1wbCgpIDogb3duZWRNdXRleF8obmV3IE11dGV4KCkpLCBtdXRleF8oTlVMTCksIGNvbmRJbml0aWFsaXplZF8oZmFsc2UpIHsKICAgICBpbml0KG93bmVkTXV0ZXhfLmdldCgpKTsKICAgfQogCi0gIEltcGwoTXV0ZXgqIG11dGV4KQotICAgICA6IG11dGV4XyhOVUxMKSwKLSAgICAgICBjb25kSW5pdGlhbGl6ZWRfKGZhbHNlKSB7Ci0gICAgaW5pdChtdXRleCk7Ci0gIH0KKyAgSW1wbChNdXRleCogbXV0ZXgpIDogbXV0ZXhfKE5VTEwpLCBjb25kSW5pdGlhbGl6ZWRfKGZhbHNlKSB7IGluaXQobXV0ZXgpOyB9CiAKLSAgSW1wbChNb25pdG9yKiBtb25pdG9yKQotICAgICA6IG11dGV4XyhOVUxMKSwKLSAgICAgICBjb25kSW5pdGlhbGl6ZWRfKGZhbHNlKSB7Ci0gICAgaW5pdCgmKG1vbml0b3ItPm11dGV4KCkpKTsKLSAgfQorICBJbXBsKE1vbml0b3IqIG1vbml0b3IpIDogbXV0ZXhfKE5VTEwpLCBjb25kSW5pdGlhbGl6ZWRfKGZhbHNlKSB7IGluaXQoJihtb25pdG9yLT5tdXRleCgpKSk7IH0KIAogICB+SW1wbCgpIHsgY2xlYW51cCgpOyB9CiAKQEAgLTgwLDExICs3MywxMCBAQAogICAgIGlmIChyZXN1bHQgPT0gVEhSSUZUX0VUSU1FRE9VVCkgewogICAgICAgLy8gcHRocmVhZF9jb25kX3RpbWVkd2FpdCBoYXMgYmVlbiBvYnNlcnZlZCB0byByZXR1cm4gZWFybHkgb24KICAgICAgIC8vIHZhcmlvdXMgcGxhdGZvcm1zLCBzbyBjb21tZW50IG91dCB0aGlzIGFzc2VydC4KLSAgICAgIC8vYXNzZXJ0KFV0aWw6OmN1cnJlbnRUaW1lKCkgPj0gKG5vdyArIHRpbWVvdXQpKTsKKyAgICAgIC8vIGFzc2VydChVdGlsOjpjdXJyZW50VGltZSgpID49IChub3cgKyB0aW1lb3V0KSk7CiAgICAgICB0aHJvdyBUaW1lZE91dEV4Y2VwdGlvbigpOwogICAgIH0gZWxzZSBpZiAocmVzdWx0ICE9IDApIHsKLSAgICAgIHRocm93IFRFeGNlcHRpb24oCi0gICAgICAgICJwdGhyZWFkX2NvbmRfd2FpdCgpIG9yIHB0aHJlYWRfY29uZF90aW1lZHdhaXQoKSBmYWlsZWQiKTsKKyAgICAgIHRocm93IFRFeGNlcHRpb24oInB0aHJlYWRfY29uZF93YWl0KCkgb3IgcHRocmVhZF9jb25kX3RpbWVkd2FpdCgpIGZhaWxlZCIpOwogICAgIH0KICAgfQogCkBAIC0xMTAsMTkgKzEwMiwxNiBAQAogICAgKi8KICAgaW50IHdhaXRGb3JUaW1lKGNvbnN0IFRIUklGVF9USU1FU1BFQyogYWJzdGltZSkgY29uc3QgewogICAgIGFzc2VydChtdXRleF8pOwotICAgIHB0aHJlYWRfbXV0ZXhfdCogbXV0ZXhJbXBsID0KLSAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8cHRocmVhZF9tdXRleF90Kj4obXV0ZXhfLT5nZXRVbmRlcmx5aW5nSW1wbCgpKTsKKyAgICBwdGhyZWFkX211dGV4X3QqIG11dGV4SW1wbCA9IHJlaW50ZXJwcmV0X2Nhc3Q8cHRocmVhZF9tdXRleF90Kj4obXV0ZXhfLT5nZXRVbmRlcmx5aW5nSW1wbCgpKTsKICAgICBhc3NlcnQobXV0ZXhJbXBsKTsKIAogICAgIC8vIFhYWCBOZWVkIHRvIGFzc2VydCB0aGF0IGNhbGxlciBvd25zIG11dGV4Ci0gICAgcmV0dXJuIHB0aHJlYWRfY29uZF90aW1lZHdhaXQoJnB0aHJlYWRfY29uZF8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXV0ZXhJbXBsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFic3RpbWUpOworICAgIHJldHVybiBwdGhyZWFkX2NvbmRfdGltZWR3YWl0KCZwdGhyZWFkX2NvbmRfLCBtdXRleEltcGwsIGFic3RpbWUpOwogICB9CiAKICAgaW50IHdhaXRGb3JUaW1lKGNvbnN0IHN0cnVjdCB0aW1ldmFsKiBhYnN0aW1lKSBjb25zdCB7CiAgICAgc3RydWN0IFRIUklGVF9USU1FU1BFQyB0ZW1wOwotICAgIHRlbXAudHZfc2VjICA9IGFic3RpbWUtPnR2X3NlYzsKKyAgICB0ZW1wLnR2X3NlYyA9IGFic3RpbWUtPnR2X3NlYzsKICAgICB0ZW1wLnR2X25zZWMgPSBhYnN0aW1lLT50dl91c2VjICogMTAwMDsKICAgICByZXR1cm4gd2FpdEZvclRpbWUoJnRlbXApOwogICB9CkBAIC0xMzIsMTMgKzEyMSwxMSBAQAogICAgKi8KICAgaW50IHdhaXRGb3JldmVyKCkgY29uc3QgewogICAgIGFzc2VydChtdXRleF8pOwotICAgIHB0aHJlYWRfbXV0ZXhfdCogbXV0ZXhJbXBsID0KLSAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8cHRocmVhZF9tdXRleF90Kj4obXV0ZXhfLT5nZXRVbmRlcmx5aW5nSW1wbCgpKTsKKyAgICBwdGhyZWFkX211dGV4X3QqIG11dGV4SW1wbCA9IHJlaW50ZXJwcmV0X2Nhc3Q8cHRocmVhZF9tdXRleF90Kj4obXV0ZXhfLT5nZXRVbmRlcmx5aW5nSW1wbCgpKTsKICAgICBhc3NlcnQobXV0ZXhJbXBsKTsKICAgICByZXR1cm4gcHRocmVhZF9jb25kX3dhaXQoJnB0aHJlYWRfY29uZF8sIG11dGV4SW1wbCk7CiAgIH0KIAotCiAgIHZvaWQgbm90aWZ5KCkgewogICAgIC8vIFhYWCBOZWVkIHRvIGFzc2VydCB0aGF0IGNhbGxlciBvd25zIG11dGV4CiAgICAgaW50IGlyZXQgPSBwdGhyZWFkX2NvbmRfc2lnbmFsKCZwdGhyZWFkX2NvbmRfKTsKQEAgLTE1Myw4ICsxNDAsNyBAQAogICAgIGFzc2VydChpcmV0ID09IDApOwogICB9CiAKLSBwcml2YXRlOgotCitwcml2YXRlOgogICB2b2lkIGluaXQoTXV0ZXgqIG11dGV4KSB7CiAgICAgbXV0ZXhfID0gbXV0ZXg7CiAKQEAgLTE3NywyNiArMTYzLDM5IEBACiAgICAgfQogICB9CiAKLSAgc2NvcGVkX3B0cjxNdXRleD4gb3duZWRNdXRleF87CisgIHVuaXF1ZV9wdHI8TXV0ZXg+IG93bmVkTXV0ZXhfOwogICBNdXRleCogbXV0ZXhfOwogCiAgIG11dGFibGUgcHRocmVhZF9jb25kX3QgcHRocmVhZF9jb25kXzsKICAgbXV0YWJsZSBib29sIGNvbmRJbml0aWFsaXplZF87CiB9OwogCi1Nb25pdG9yOjpNb25pdG9yKCkgOiBpbXBsXyhuZXcgTW9uaXRvcjo6SW1wbCgpKSB7fQotTW9uaXRvcjo6TW9uaXRvcihNdXRleCogbXV0ZXgpIDogaW1wbF8obmV3IE1vbml0b3I6OkltcGwobXV0ZXgpKSB7fQotTW9uaXRvcjo6TW9uaXRvcihNb25pdG9yKiBtb25pdG9yKSA6IGltcGxfKG5ldyBNb25pdG9yOjpJbXBsKG1vbml0b3IpKSB7fQorTW9uaXRvcjo6TW9uaXRvcigpIDogaW1wbF8obmV3IE1vbml0b3I6OkltcGwoKSkgeworfQorTW9uaXRvcjo6TW9uaXRvcihNdXRleCogbXV0ZXgpIDogaW1wbF8obmV3IE1vbml0b3I6OkltcGwobXV0ZXgpKSB7Cit9CitNb25pdG9yOjpNb25pdG9yKE1vbml0b3IqIG1vbml0b3IpIDogaW1wbF8obmV3IE1vbml0b3I6OkltcGwobW9uaXRvcikpIHsKK30KIAotTW9uaXRvcjo6fk1vbml0b3IoKSB7IGRlbGV0ZSBpbXBsXzsgfQorTW9uaXRvcjo6fk1vbml0b3IoKSB7CisgIGRlbGV0ZSBpbXBsXzsKK30KIAotTXV0ZXgmIE1vbml0b3I6Om11dGV4KCkgY29uc3QgeyByZXR1cm4gaW1wbF8tPm11dGV4KCk7IH0KK011dGV4JiBNb25pdG9yOjptdXRleCgpIGNvbnN0IHsKKyAgcmV0dXJuIGltcGxfLT5tdXRleCgpOworfQogCi12b2lkIE1vbml0b3I6OmxvY2soKSBjb25zdCB7IGltcGxfLT5sb2NrKCk7IH0KK3ZvaWQgTW9uaXRvcjo6bG9jaygpIGNvbnN0IHsKKyAgaW1wbF8tPmxvY2soKTsKK30KIAotdm9pZCBNb25pdG9yOjp1bmxvY2soKSBjb25zdCB7IGltcGxfLT51bmxvY2soKTsgfQordm9pZCBNb25pdG9yOjp1bmxvY2soKSBjb25zdCB7CisgIGltcGxfLT51bmxvY2soKTsKK30KIAotdm9pZCBNb25pdG9yOjp3YWl0KGludDY0X3QgdGltZW91dCkgY29uc3QgeyBpbXBsXy0+d2FpdCh0aW1lb3V0KTsgfQordm9pZCBNb25pdG9yOjp3YWl0KGludDY0X3QgdGltZW91dCkgY29uc3QgeworICBpbXBsXy0+d2FpdCh0aW1lb3V0KTsKK30KIAogaW50IE1vbml0b3I6OndhaXRGb3JUaW1lKGNvbnN0IFRIUklGVF9USU1FU1BFQyogYWJzdGltZSkgY29uc3QgewogICByZXR1cm4gaW1wbF8tPndhaXRGb3JUaW1lKGFic3RpbWUpOwpAQCAtMjE0LDggKzIxMywxMyBAQAogICByZXR1cm4gaW1wbF8tPndhaXRGb3JldmVyKCk7CiB9CiAKLXZvaWQgTW9uaXRvcjo6bm90aWZ5KCkgY29uc3QgeyBpbXBsXy0+bm90aWZ5KCk7IH0KK3ZvaWQgTW9uaXRvcjo6bm90aWZ5KCkgY29uc3QgeworICBpbXBsXy0+bm90aWZ5KCk7Cit9CiAKLXZvaWQgTW9uaXRvcjo6bm90aWZ5QWxsKCkgY29uc3QgeyBpbXBsXy0+bm90aWZ5QWxsKCk7IH0KLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQordm9pZCBNb25pdG9yOjpub3RpZnlBbGwoKSBjb25zdCB7CisgIGltcGxfLT5ub3RpZnlBbGwoKTsKK30KK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvTW9uaXRvci5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L01vbml0b3IuaAppbmRleCA4MTFlMGUxLi4yMzk5YTk4IDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvTW9uaXRvci5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmgKQEAgLTIwLDEzICsyMCwxOCBAQAogI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX01PTklUT1JfSF8KICNkZWZpbmUgX1RIUklGVF9DT05DVVJSRU5DWV9NT05JVE9SX0hfIDEKIAorI2lmZGVmIEhBVkVfU1lTX1RJTUVfSAorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjZW5kaWYKKwogI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9FeGNlcHRpb24uaD4KICNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTXV0ZXguaD4KIAogI2luY2x1ZGUgPGJvb3N0L3V0aWxpdHkuaHBwPgogCi0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgY29uY3VycmVuY3kgewogCiAvKioKICAqIEEgbW9uaXRvciBpcyBhIGNvbWJpbmF0aW9uIG11dGV4IGFuZCBjb25kaXRpb24tZXZlbnQuICBXYWl0aW5nIGFuZApAQCAtNDcsNyArNTIsNyBAQAogICogQHZlcnNpb24gJElkOiQKICAqLwogY2xhc3MgTW9uaXRvciA6IGJvb3N0Ojpub25jb3B5YWJsZSB7Ci0gcHVibGljOgorcHVibGljOgogICAvKiogQ3JlYXRlcyBhIG5ldyBtdXRleCwgYW5kIHRha2VzIG93bmVyc2hpcCBvZiBpdC4gKi8KICAgTW9uaXRvcigpOwogCkBAIC0xMDEsMzAgKzEwNiwyOCBAQAogICAgKi8KICAgdm9pZCB3YWl0KGludDY0X3QgdGltZW91dF9tcyA9IDBMTCkgY29uc3Q7CiAKLQogICAvKiogV2FrZXMgdXAgb25lIHRocmVhZCB3YWl0aW5nIG9uIHRoaXMgbW9uaXRvci4gKi8KICAgdmlydHVhbCB2b2lkIG5vdGlmeSgpIGNvbnN0OwogCiAgIC8qKiBXYWtlcyB1cCBhbGwgd2FpdGluZyB0aHJlYWRzIG9uIHRoaXMgbW9uaXRvci4gKi8KICAgdmlydHVhbCB2b2lkIG5vdGlmeUFsbCgpIGNvbnN0OwogCi0gcHJpdmF0ZToKLQorcHJpdmF0ZToKICAgY2xhc3MgSW1wbDsKIAogICBJbXBsKiBpbXBsXzsKIH07CiAKIGNsYXNzIFN5bmNocm9uaXplZCB7Ci0gcHVibGljOgotIFN5bmNocm9uaXplZChjb25zdCBNb25pdG9yKiBtb25pdG9yKSA6IGcobW9uaXRvci0+bXV0ZXgoKSkgeyB9Ci0gU3luY2hyb25pemVkKGNvbnN0IE1vbml0b3ImIG1vbml0b3IpIDogZyhtb25pdG9yLm11dGV4KCkpIHsgfQorcHVibGljOgorICBTeW5jaHJvbml6ZWQoY29uc3QgTW9uaXRvciogbW9uaXRvcikgOiBnKG1vbml0b3ItPm11dGV4KCkpIHt9CisgIFN5bmNocm9uaXplZChjb25zdCBNb25pdG9yJiBtb25pdG9yKSA6IGcobW9uaXRvci5tdXRleCgpKSB7fQogCi0gcHJpdmF0ZToKK3ByaXZhdGU6CiAgIEd1YXJkIGc7CiB9OwotCi0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5CiAKICNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfQ09OQ1VSUkVOQ1lfTU9OSVRPUl9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L011dGV4LmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9NdXRleC5jcHAKaW5kZXggM2Y3YmI1Yi4uYTUyNjQ2MSAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L011dGV4LmNwcAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvTXV0ZXguY3BwCkBAIC0xNyw2MyArMTcsNjkgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKy8vIG5lZWRlZCB0byB0ZXN0IGZvciBwdGhyZWFkIGltcGxlbWVudGF0aW9uIGNhcGFiaWxpdGllczoKKyNkZWZpbmUgX19VU0VfR05VCisKICNpbmNsdWRlIDx0aHJpZnQvdGhyaWZ0LWNvbmZpZy5oPgogCiAjaW5jbHVkZSA8dGhyaWZ0L1RocmlmdC5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9FeGNlcHRpb24uaD4KICNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTXV0ZXguaD4KICNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVXRpbC5oPgogCiAjaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaWZkZWYgSEFWRV9QVEhSRUFEX0gKKyNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxwdGhyZWFkLmg+Ci0jZW5kaWYKICNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KIAotdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7CisjaW5jbHVkZSA8Ym9vc3QvZm9ybWF0LmhwcD4KIAotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgY29uY3VycmVuY3kgeworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBjb25jdXJyZW5jeSB7CiAKLSNpZm5kZWYgVEhSSUZUX05PX0NPTlRFTlRJT05fUFJPRklMSU5HCisvLyBFbmFibGUgdGhpcyB0byB0dXJuIG9uIG11dGV4IGNvbnRlbnRpb24gcHJvZmlsaW5nIHN1cHBvcnQKKy8vICNkZWZpbmUgVEhSSUZUX1BUSFJFQURfTVVURVhfQ09OVEVOVElPTl9QUk9GSUxJTkcKIAotc3RhdGljIHNpZ19hdG9taWNfdCBtdXRleFByb2ZpbGluZ1NhbXBsZVJhdGUgPSAwOworI2lmZGVmIFRIUklGVF9QVEhSRUFEX01VVEVYX0NPTlRFTlRJT05fUFJPRklMSU5HCisKK3N0YXRpYyBpbnQzMl90IG11dGV4UHJvZmlsaW5nQ291bnRlciA9IDA7CitzdGF0aWMgaW50MzJfdCBtdXRleFByb2ZpbGluZ1NhbXBsZVJhdGUgPSAwOwogc3RhdGljIE11dGV4V2FpdENhbGxiYWNrIG11dGV4UHJvZmlsaW5nQ2FsbGJhY2sgPSAwOwogCi12b2xhdGlsZSBzdGF0aWMgc2lnX2F0b21pY190IG11dGV4UHJvZmlsaW5nQ291bnRlciA9IDA7Ci0KLXZvaWQgZW5hYmxlTXV0ZXhQcm9maWxpbmcoaW50MzJfdCBwcm9maWxpbmdTYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBNdXRleFdhaXRDYWxsYmFjayBjYWxsYmFjaykgewordm9pZCBlbmFibGVNdXRleFByb2ZpbGluZyhpbnQzMl90IHByb2ZpbGluZ1NhbXBsZVJhdGUsIE11dGV4V2FpdENhbGxiYWNrIGNhbGxiYWNrKSB7CiAgIG11dGV4UHJvZmlsaW5nU2FtcGxlUmF0ZSA9IHByb2ZpbGluZ1NhbXBsZVJhdGU7CiAgIG11dGV4UHJvZmlsaW5nQ2FsbGJhY2sgPSBjYWxsYmFjazsKIH0KIAotI2RlZmluZSBQUk9GSUxFX01VVEVYX1NUQVJUX0xPQ0soKSBcCi0gICAgaW50NjRfdCBfbG9ja19zdGFydFRpbWUgPSBtYXliZUdldFByb2ZpbGluZ1N0YXJ0VGltZSgpOworI2RlZmluZSBQUk9GSUxFX01VVEVYX1NUQVJUX0xPQ0soKSBpbnQ2NF90IF9sb2NrX3N0YXJ0VGltZSA9IG1heWJlR2V0UHJvZmlsaW5nU3RhcnRUaW1lKCk7CiAKLSNkZWZpbmUgUFJPRklMRV9NVVRFWF9OT1RfTE9DS0VEKCkgXAotICBkbyB7IFwKLSAgICBpZiAoX2xvY2tfc3RhcnRUaW1lID4gMCkgeyBcCi0gICAgICBpbnQ2NF90IGVuZFRpbWUgPSBVdGlsOjpjdXJyZW50VGltZVVzZWMoKTsgXAotICAgICAgKCptdXRleFByb2ZpbGluZ0NhbGxiYWNrKSh0aGlzLCBlbmRUaW1lIC0gX2xvY2tfc3RhcnRUaW1lKTsgXAotICAgIH0gXAorI2RlZmluZSBQUk9GSUxFX01VVEVYX05PVF9MT0NLRUQoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChfbG9ja19zdGFydFRpbWUgPiAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgaW50NjRfdCBlbmRUaW1lID0gVXRpbDo6Y3VycmVudFRpbWVVc2VjKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKCptdXRleFByb2ZpbGluZ0NhbGxiYWNrKSh0aGlzLCBlbmRUaW1lIC0gX2xvY2tfc3RhcnRUaW1lKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICB9IHdoaWxlICgwKQogCi0jZGVmaW5lIFBST0ZJTEVfTVVURVhfTE9DS0VEKCkgXAotICBkbyB7IFwKLSAgICBwcm9maWxlVGltZV8gPSBfbG9ja19zdGFydFRpbWU7IFwKLSAgICBpZiAocHJvZmlsZVRpbWVfID4gMCkgeyBcCi0gICAgICBwcm9maWxlVGltZV8gPSBVdGlsOjpjdXJyZW50VGltZVVzZWMoKSAtIHByb2ZpbGVUaW1lXzsgXAotICAgIH0gXAorI2RlZmluZSBQUk9GSUxFX01VVEVYX0xPQ0tFRCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHByb2ZpbGVUaW1lXyA9IF9sb2NrX3N0YXJ0VGltZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChwcm9maWxlVGltZV8gPiAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgcHJvZmlsZVRpbWVfID0gVXRpbDo6Y3VycmVudFRpbWVVc2VjKCkgLSBwcm9maWxlVGltZV87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICB9IHdoaWxlICgwKQogCi0jZGVmaW5lIFBST0ZJTEVfTVVURVhfU1RBUlRfVU5MT0NLKCkgXAotICBpbnQ2NF90IF90ZW1wX3Byb2ZpbGVUaW1lID0gcHJvZmlsZVRpbWVfOyBcCisjZGVmaW5lIFBST0ZJTEVfTVVURVhfU1RBUlRfVU5MT0NLKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGludDY0X3QgX3RlbXBfcHJvZmlsZVRpbWUgPSBwcm9maWxlVGltZV87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIHByb2ZpbGVUaW1lXyA9IDA7CiAKLSNkZWZpbmUgUFJPRklMRV9NVVRFWF9VTkxPQ0tFRCgpIFwKLSAgZG8geyBcCi0gICAgaWYgKF90ZW1wX3Byb2ZpbGVUaW1lID4gMCkgeyBcCi0gICAgICAoKm11dGV4UHJvZmlsaW5nQ2FsbGJhY2spKHRoaXMsIF90ZW1wX3Byb2ZpbGVUaW1lKTsgXAotICAgIH0gXAorI2RlZmluZSBQUk9GSUxFX01VVEVYX1VOTE9DS0VEKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChfdGVtcF9wcm9maWxlVGltZSA+IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKCptdXRleFByb2ZpbGluZ0NhbGxiYWNrKSh0aGlzLCBfdGVtcF9wcm9maWxlVGltZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICB9IHdoaWxlICgwKQogCiBzdGF0aWMgaW5saW5lIGludDY0X3QgbWF5YmVHZXRQcm9maWxpbmdTdGFydFRpbWUoKSB7CkBAIC0xMDEsMjIgKzEwNywzMCBAQAogfQogCiAjZWxzZQotIyAgZGVmaW5lIFBST0ZJTEVfTVVURVhfU1RBUlRfTE9DSygpCi0jICBkZWZpbmUgUFJPRklMRV9NVVRFWF9OT1RfTE9DS0VEKCkKLSMgIGRlZmluZSBQUk9GSUxFX01VVEVYX0xPQ0tFRCgpCi0jICBkZWZpbmUgUFJPRklMRV9NVVRFWF9TVEFSVF9VTkxPQ0soKQotIyAgZGVmaW5lIFBST0ZJTEVfTVVURVhfVU5MT0NLRUQoKQotI2VuZGlmIC8vIFRIUklGVF9OT19DT05URU5USU9OX1BST0ZJTElORworI2RlZmluZSBQUk9GSUxFX01VVEVYX1NUQVJUX0xPQ0soKQorI2RlZmluZSBQUk9GSUxFX01VVEVYX05PVF9MT0NLRUQoKQorI2RlZmluZSBQUk9GSUxFX01VVEVYX0xPQ0tFRCgpCisjZGVmaW5lIFBST0ZJTEVfTVVURVhfU1RBUlRfVU5MT0NLKCkKKyNkZWZpbmUgUFJPRklMRV9NVVRFWF9VTkxPQ0tFRCgpCisjZW5kaWYgLy8gVEhSSUZUX1BUSFJFQURfTVVURVhfQ09OVEVOVElPTl9QUk9GSUxJTkcKKworI2RlZmluZSBFSU5UUl9MT09QKF9DQUxMKSAgICAgICAgICBpbnQgcmV0OyBkbyB7IHJldCA9IF9DQUxMOyB9IHdoaWxlIChyZXQgPT0gRUlOVFIpCisjZGVmaW5lIEFCT1JUX09ORkFJTChfQ0FMTCkgICAgICB7IEVJTlRSX0xPT1AoX0NBTEwpOyBpZiAocmV0KSB7IGFib3J0KCk7IH0gfQorI2RlZmluZSBUSFJPV19TUkUoX0NBTExTVFIsIFJFVCkgeyB0aHJvdyBTeXN0ZW1SZXNvdXJjZUV4Y2VwdGlvbihib29zdDo6c3RyKGJvb3N0Ojpmb3JtYXQoIiUxJSByZXR1cm5lZCAlMiUgKCUzJSkiKSAlIF9DQUxMU1RSICUgUkVUICUgOjpzdHJlcnJvcihSRVQpKSk7IH0KKyNkZWZpbmUgVEhST1dfU1JFX09ORkFJTChfQ0FMTCkgIHsgRUlOVFJfTE9PUChfQ0FMTCk7IGlmIChyZXQpIHsgVEhST1dfU1JFKCNfQ0FMTCwgcmV0KTsgfSB9CisjZGVmaW5lIFRIUk9XX1NSRV9UUllGQUlMKF9DQUxMKSB7IEVJTlRSX0xPT1AoX0NBTEwpOyBpZiAocmV0ID09IDApIHsgcmV0dXJuIHRydWU7IH0gZWxzZSBpZiAocmV0ID09IEVCVVNZKSB7IHJldHVybiBmYWxzZTsgfSBUSFJPV19TUkUoI19DQUxMLCByZXQpOyB9CiAKIC8qKgogICogSW1wbGVtZW50YXRpb24gb2YgTXV0ZXggY2xhc3MgdXNpbmcgUE9TSVggbXV0ZXgKICAqCisgKiBUaHJvd3MgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpTeXN0ZW1SZXNvdXJjZUV4Y2VwdGlvbiBvbiBlcnJvci4KKyAqCiAgKiBAdmVyc2lvbiAkSWQ6JAogICovCiBjbGFzcyBNdXRleDo6aW1wbCB7Ci0gcHVibGljOgorcHVibGljOgogICBpbXBsKEluaXRpYWxpemVyIGluaXQpIDogaW5pdGlhbGl6ZWRfKGZhbHNlKSB7Ci0jaWZuZGVmIFRIUklGVF9OT19DT05URU5USU9OX1BST0ZJTElORworI2lmZGVmIFRIUklGVF9QVEhSRUFEX01VVEVYX0NPTlRFTlRJT05fUFJPRklMSU5HCiAgICAgcHJvZmlsZVRpbWVfID0gMDsKICNlbmRpZgogICAgIGluaXQoJnB0aHJlYWRfbXV0ZXhfKTsKQEAgLTEyNiwxOSArMTQwLDE5IEBACiAgIH5pbXBsKCkgewogICAgIGlmIChpbml0aWFsaXplZF8pIHsKICAgICAgIGluaXRpYWxpemVkXyA9IGZhbHNlOwotICAgICAgaW50IHJldCA9IHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmcHRocmVhZF9tdXRleF8pOwotICAgICAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRShyZXQpOwotICAgICAgYXNzZXJ0KHJldCA9PSAwKTsKKyAgICAgIEFCT1JUX09ORkFJTChwdGhyZWFkX211dGV4X2Rlc3Ryb3koJnB0aHJlYWRfbXV0ZXhfKSk7CiAgICAgfQogICB9CiAKICAgdm9pZCBsb2NrKCkgY29uc3QgewogICAgIFBST0ZJTEVfTVVURVhfU1RBUlRfTE9DSygpOwotICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmcHRocmVhZF9tdXRleF8pOworICAgIFRIUk9XX1NSRV9PTkZBSUwocHRocmVhZF9tdXRleF9sb2NrKCZwdGhyZWFkX211dGV4XykpOwogICAgIFBST0ZJTEVfTVVURVhfTE9DS0VEKCk7CiAgIH0KIAotICBib29sIHRyeWxvY2soKSBjb25zdCB7IHJldHVybiAoMCA9PSBwdGhyZWFkX211dGV4X3RyeWxvY2soJnB0aHJlYWRfbXV0ZXhfKSk7IH0KKyAgYm9vbCB0cnlsb2NrKCkgY29uc3QgeworICAgIFRIUk9XX1NSRV9UUllGQUlMKHB0aHJlYWRfbXV0ZXhfdHJ5bG9jaygmcHRocmVhZF9tdXRleF8pKTsKKyAgfQogCiAgIGJvb2wgdGltZWRsb2NrKGludDY0X3QgbWlsbGlzZWNvbmRzKSBjb25zdCB7CiAjaWYgZGVmaW5lZChfUE9TSVhfVElNRU9VVFMpICYmIF9QT1NJWF9USU1FT1VUUyA+PSAyMDAxMTJMCkBAIC0xNDYsMTQgKzE2MCwxNiBAQAogCiAgICAgc3RydWN0IFRIUklGVF9USU1FU1BFQyB0czsKICAgICBVdGlsOjp0b1RpbWVzcGVjKHRzLCBtaWxsaXNlY29uZHMgKyBVdGlsOjpjdXJyZW50VGltZSgpKTsKLSAgICBpbnQgcmV0ID0gcHRocmVhZF9tdXRleF90aW1lZGxvY2soJnB0aHJlYWRfbXV0ZXhfLCAmdHMpOworICAgIEVJTlRSX0xPT1AocHRocmVhZF9tdXRleF90aW1lZGxvY2soJnB0aHJlYWRfbXV0ZXhfLCAmdHMpKTsKICAgICBpZiAocmV0ID09IDApIHsKICAgICAgIFBST0ZJTEVfTVVURVhfTE9DS0VEKCk7CiAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKHJldCA9PSBFVElNRURPVVQpIHsKKyAgICAgIFBST0ZJTEVfTVVURVhfTk9UX0xPQ0tFRCgpOworICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIFBST0ZJTEVfTVVURVhfTk9UX0xPQ0tFRCgpOwotICAgIHJldHVybiBmYWxzZTsKKyAgICBUSFJPV19TUkUoInB0aHJlYWRfbXV0ZXhfdGltZWRsb2NrKCZwdGhyZWFkX211dGV4XywgJnRzKSIsIHJldCk7CiAjZWxzZQogICAgIC8qIE90aGVyd2lzZSBmb2xsb3cgc29sdXRpb24gdXNlZCBieSBNb25vIGZvciBBbmRyb2lkICovCiAgICAgc3RydWN0IFRIUklGVF9USU1FU1BFQyBzbGVlcHl0aW1lLCBub3csIHRvOwpAQCAtMTc4LDU1ICsxOTQsNTUgQEAKIAogICB2b2lkIHVubG9jaygpIGNvbnN0IHsKICAgICBQUk9GSUxFX01VVEVYX1NUQVJUX1VOTE9DSygpOwotICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZwdGhyZWFkX211dGV4Xyk7CisgICAgVEhST1dfU1JFX09ORkFJTChwdGhyZWFkX211dGV4X3VubG9jaygmcHRocmVhZF9tdXRleF8pKTsKICAgICBQUk9GSUxFX01VVEVYX1VOTE9DS0VEKCk7CiAgIH0KIAotICB2b2lkKiBnZXRVbmRlcmx5aW5nSW1wbCgpIGNvbnN0IHsgcmV0dXJuICh2b2lkKikgJnB0aHJlYWRfbXV0ZXhfOyB9CisgIHZvaWQqIGdldFVuZGVybHlpbmdJbXBsKCkgY29uc3QgeyByZXR1cm4gKHZvaWQqKSZwdGhyZWFkX211dGV4XzsgfQogCi0gcHJpdmF0ZToKK3ByaXZhdGU6CiAgIG11dGFibGUgcHRocmVhZF9tdXRleF90IHB0aHJlYWRfbXV0ZXhfOwogICBtdXRhYmxlIGJvb2wgaW5pdGlhbGl6ZWRfOwotI2lmbmRlZiBUSFJJRlRfTk9fQ09OVEVOVElPTl9QUk9GSUxJTkcKKyNpZmRlZiBUSFJJRlRfUFRIUkVBRF9NVVRFWF9DT05URU5USU9OX1BST0ZJTElORwogICBtdXRhYmxlIGludDY0X3QgcHJvZmlsZVRpbWVfOwogI2VuZGlmCiB9OwogCi1NdXRleDo6TXV0ZXgoSW5pdGlhbGl6ZXIgaW5pdCkgOiBpbXBsXyhuZXcgTXV0ZXg6OmltcGwoaW5pdCkpIHt9CitNdXRleDo6TXV0ZXgoSW5pdGlhbGl6ZXIgaW5pdCkgOiBpbXBsXyhuZXcgTXV0ZXg6OmltcGwoaW5pdCkpIHsKK30KIAotdm9pZCogTXV0ZXg6OmdldFVuZGVybHlpbmdJbXBsKCkgY29uc3QgeyByZXR1cm4gaW1wbF8tPmdldFVuZGVybHlpbmdJbXBsKCk7IH0KK3ZvaWQqIE11dGV4OjpnZXRVbmRlcmx5aW5nSW1wbCgpIGNvbnN0IHsKKyAgcmV0dXJuIGltcGxfLT5nZXRVbmRlcmx5aW5nSW1wbCgpOworfQogCi12b2lkIE11dGV4Ojpsb2NrKCkgY29uc3QgeyBpbXBsXy0+bG9jaygpOyB9Cit2b2lkIE11dGV4Ojpsb2NrKCkgY29uc3QgeworICBpbXBsXy0+bG9jaygpOworfQogCi1ib29sIE11dGV4Ojp0cnlsb2NrKCkgY29uc3QgeyByZXR1cm4gaW1wbF8tPnRyeWxvY2soKTsgfQorYm9vbCBNdXRleDo6dHJ5bG9jaygpIGNvbnN0IHsKKyAgcmV0dXJuIGltcGxfLT50cnlsb2NrKCk7Cit9CiAKLWJvb2wgTXV0ZXg6OnRpbWVkbG9jayhpbnQ2NF90IG1zKSBjb25zdCB7IHJldHVybiBpbXBsXy0+dGltZWRsb2NrKG1zKTsgfQorYm9vbCBNdXRleDo6dGltZWRsb2NrKGludDY0X3QgbXMpIGNvbnN0IHsKKyAgcmV0dXJuIGltcGxfLT50aW1lZGxvY2sobXMpOworfQogCi12b2lkIE11dGV4Ojp1bmxvY2soKSBjb25zdCB7IGltcGxfLT51bmxvY2soKTsgfQordm9pZCBNdXRleDo6dW5sb2NrKCkgY29uc3QgeworICBpbXBsXy0+dW5sb2NrKCk7Cit9CiAKIHZvaWQgTXV0ZXg6OkRFRkFVTFRfSU5JVElBTElaRVIodm9pZCogYXJnKSB7CiAgIHB0aHJlYWRfbXV0ZXhfdCogcHRocmVhZF9tdXRleCA9IChwdGhyZWFkX211dGV4X3QqKWFyZzsKLSAgaW50IHJldCA9IHB0aHJlYWRfbXV0ZXhfaW5pdChwdGhyZWFkX211dGV4LCBOVUxMKTsKLSAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRShyZXQpOwotICBhc3NlcnQocmV0ID09IDApOworICBUSFJPV19TUkVfT05GQUlMKHB0aHJlYWRfbXV0ZXhfaW5pdChwdGhyZWFkX211dGV4LCBOVUxMKSk7CiB9CiAKLSNpZiBkZWZpbmVkKFBUSFJFQURfQURBUFRJVkVfTVVURVhfSU5JVElBTElaRVJfTlApIHx8IGRlZmluZWQoUFRIUkVBRF9SRUNVUlNJVkVfTVVURVhfSU5JVElBTElaRVJfTlApCisjaWYgZGVmaW5lZChQVEhSRUFEX0FEQVBUSVZFX01VVEVYX0lOSVRJQUxJWkVSX05QKSB8fCBkZWZpbmVkKFBUSFJFQURfRVJST1JDSEVDS19NVVRFWF9JTklUSUFMSVpFUl9OUCkgfHwgZGVmaW5lZChQVEhSRUFEX1JFQ1VSU0lWRV9NVVRFWF9JTklUSUFMSVpFUl9OUCkKIHN0YXRpYyB2b2lkIGluaXRfd2l0aF9raW5kKHB0aHJlYWRfbXV0ZXhfdCogbXV0ZXgsIGludCBraW5kKSB7CiAgIHB0aHJlYWRfbXV0ZXhhdHRyX3QgbXV0ZXhhdHRyOwotICBpbnQgcmV0ID0gcHRocmVhZF9tdXRleGF0dHJfaW5pdCgmbXV0ZXhhdHRyKTsKLSAgYXNzZXJ0KHJldCA9PSAwKTsKLQotICAvLyBBcHBhcmVudGx5LCB0aGlzIGNhbiBmYWlsLiAgU2hvdWxkIHdlIHJlYWxseSBiZSBhYm9ydGluZz8KLSAgcmV0ID0gcHRocmVhZF9tdXRleGF0dHJfc2V0dHlwZSgmbXV0ZXhhdHRyLCBraW5kKTsKLSAgYXNzZXJ0KHJldCA9PSAwKTsKLQotICByZXQgPSBwdGhyZWFkX211dGV4X2luaXQobXV0ZXgsICZtdXRleGF0dHIpOwotICBhc3NlcnQocmV0ID09IDApOwotCi0gIHJldCA9IHB0aHJlYWRfbXV0ZXhhdHRyX2Rlc3Ryb3koJm11dGV4YXR0cik7Ci0gIGFzc2VydChyZXQgPT0gMCk7Ci0gIFRIUklGVF9VTlVTRURfVkFSSUFCTEUocmV0KTsKKyAgVEhST1dfU1JFX09ORkFJTChwdGhyZWFkX211dGV4YXR0cl9pbml0KCZtdXRleGF0dHIpKTsKKyAgVEhST1dfU1JFX09ORkFJTChwdGhyZWFkX211dGV4YXR0cl9zZXR0eXBlKCZtdXRleGF0dHIsIGtpbmQpKTsKKyAgVEhST1dfU1JFX09ORkFJTChwdGhyZWFkX211dGV4X2luaXQobXV0ZXgsICZtdXRleGF0dHIpKTsKKyAgVEhST1dfU1JFX09ORkFJTChwdGhyZWFkX211dGV4YXR0cl9kZXN0cm95KCZtdXRleGF0dHIpKTsKIH0KICNlbmRpZgogCkBAIC0yNDQsMTMgKzI2MCwxOCBAQAogfQogI2VuZGlmCiAKKyNpZmRlZiBQVEhSRUFEX0VSUk9SQ0hFQ0tfTVVURVhfSU5JVElBTElaRVJfTlAKK3ZvaWQgTXV0ZXg6OkVSUk9SQ0hFQ0tfSU5JVElBTElaRVIodm9pZCogYXJnKSB7CisgIGluaXRfd2l0aF9raW5kKChwdGhyZWFkX211dGV4X3QqKWFyZywgUFRIUkVBRF9NVVRFWF9FUlJPUkNIRUNLKTsKK30KKyNlbmRpZgorCiAjaWZkZWYgUFRIUkVBRF9SRUNVUlNJVkVfTVVURVhfSU5JVElBTElaRVJfTlAKIHZvaWQgTXV0ZXg6OlJFQ1VSU0lWRV9JTklUSUFMSVpFUih2b2lkKiBhcmcpIHsKICAgaW5pdF93aXRoX2tpbmQoKHB0aHJlYWRfbXV0ZXhfdCopYXJnLCBQVEhSRUFEX01VVEVYX1JFQ1VSU0lWRV9OUCk7CiB9CiAjZW5kaWYKIAotCiAvKioKICAqIEltcGxlbWVudGF0aW9uIG9mIFJlYWRXcml0ZU11dGV4IGNsYXNzIHVzaW5nIFBPU0lYIHJ3IGxvY2sKICAqCkBAIC0yNTksNzAgKzI4MCw3NyBAQAogY2xhc3MgUmVhZFdyaXRlTXV0ZXg6OmltcGwgewogcHVibGljOgogICBpbXBsKCkgOiBpbml0aWFsaXplZF8oZmFsc2UpIHsKLSNpZm5kZWYgVEhSSUZUX05PX0NPTlRFTlRJT05fUFJPRklMSU5HCisjaWZkZWYgVEhSSUZUX1BUSFJFQURfTVVURVhfQ09OVEVOVElPTl9QUk9GSUxJTkcKICAgICBwcm9maWxlVGltZV8gPSAwOwogI2VuZGlmCi0gICAgaW50IHJldCA9IHB0aHJlYWRfcndsb2NrX2luaXQoJnJ3X2xvY2tfLCBOVUxMKTsKLSAgICBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFKHJldCk7Ci0gICAgYXNzZXJ0KHJldCA9PSAwKTsKKyAgICBUSFJPV19TUkVfT05GQUlMKHB0aHJlYWRfcndsb2NrX2luaXQoJnJ3X2xvY2tfLCBOVUxMKSk7CiAgICAgaW5pdGlhbGl6ZWRfID0gdHJ1ZTsKICAgfQogCiAgIH5pbXBsKCkgewotICAgIGlmKGluaXRpYWxpemVkXykgeworICAgIGlmIChpbml0aWFsaXplZF8pIHsKICAgICAgIGluaXRpYWxpemVkXyA9IGZhbHNlOwotICAgICAgaW50IHJldCA9IHB0aHJlYWRfcndsb2NrX2Rlc3Ryb3koJnJ3X2xvY2tfKTsKLSAgICAgIFRIUklGVF9VTlVTRURfVkFSSUFCTEUocmV0KTsKLSAgICAgIGFzc2VydChyZXQgPT0gMCk7CisgICAgICBBQk9SVF9PTkZBSUwocHRocmVhZF9yd2xvY2tfZGVzdHJveSgmcndfbG9ja18pKTsKICAgICB9CiAgIH0KIAogICB2b2lkIGFjcXVpcmVSZWFkKCkgY29uc3QgewogICAgIFBST0ZJTEVfTVVURVhfU1RBUlRfTE9DSygpOwotICAgIHB0aHJlYWRfcndsb2NrX3JkbG9jaygmcndfbG9ja18pOwotICAgIFBST0ZJTEVfTVVURVhfTk9UX0xPQ0tFRCgpOyAgLy8gbm90IGV4Y2x1c2l2ZSwgc28gdXNlIG5vdC1sb2NrZWQgcGF0aAorICAgIFRIUk9XX1NSRV9PTkZBSUwocHRocmVhZF9yd2xvY2tfcmRsb2NrKCZyd19sb2NrXykpOworICAgIFBST0ZJTEVfTVVURVhfTk9UX0xPQ0tFRCgpOyAvLyBub3QgZXhjbHVzaXZlLCBzbyB1c2Ugbm90LWxvY2tlZCBwYXRoCiAgIH0KIAogICB2b2lkIGFjcXVpcmVXcml0ZSgpIGNvbnN0IHsKICAgICBQUk9GSUxFX01VVEVYX1NUQVJUX0xPQ0soKTsKLSAgICBwdGhyZWFkX3J3bG9ja193cmxvY2soJnJ3X2xvY2tfKTsKKyAgICBUSFJPV19TUkVfT05GQUlMKHB0aHJlYWRfcndsb2NrX3dybG9jaygmcndfbG9ja18pKTsKICAgICBQUk9GSUxFX01VVEVYX0xPQ0tFRCgpOwogICB9CiAKLSAgYm9vbCBhdHRlbXB0UmVhZCgpIGNvbnN0IHsgcmV0dXJuICFwdGhyZWFkX3J3bG9ja190cnlyZGxvY2soJnJ3X2xvY2tfKTsgfQorICBib29sIGF0dGVtcHRSZWFkKCkgY29uc3QgeyBUSFJPV19TUkVfVFJZRkFJTChwdGhyZWFkX3J3bG9ja190cnlyZGxvY2soJnJ3X2xvY2tfKSk7IH0KIAotICBib29sIGF0dGVtcHRXcml0ZSgpIGNvbnN0IHsgcmV0dXJuICFwdGhyZWFkX3J3bG9ja190cnl3cmxvY2soJnJ3X2xvY2tfKTsgfQorICBib29sIGF0dGVtcHRXcml0ZSgpIGNvbnN0IHsgVEhST1dfU1JFX1RSWUZBSUwocHRocmVhZF9yd2xvY2tfdHJ5d3Jsb2NrKCZyd19sb2NrXykpOyB9CiAKICAgdm9pZCByZWxlYXNlKCkgY29uc3QgewogICAgIFBST0ZJTEVfTVVURVhfU1RBUlRfVU5MT0NLKCk7Ci0gICAgcHRocmVhZF9yd2xvY2tfdW5sb2NrKCZyd19sb2NrXyk7CisgICAgVEhST1dfU1JFX09ORkFJTChwdGhyZWFkX3J3bG9ja191bmxvY2soJnJ3X2xvY2tfKSk7CiAgICAgUFJPRklMRV9NVVRFWF9VTkxPQ0tFRCgpOwogICB9CiAKIHByaXZhdGU6CiAgIG11dGFibGUgcHRocmVhZF9yd2xvY2tfdCByd19sb2NrXzsKICAgbXV0YWJsZSBib29sIGluaXRpYWxpemVkXzsKLSNpZm5kZWYgVEhSSUZUX05PX0NPTlRFTlRJT05fUFJPRklMSU5HCisjaWZkZWYgVEhSSUZUX1BUSFJFQURfTVVURVhfQ09OVEVOVElPTl9QUk9GSUxJTkcKICAgbXV0YWJsZSBpbnQ2NF90IHByb2ZpbGVUaW1lXzsKICNlbmRpZgogfTsKIAotUmVhZFdyaXRlTXV0ZXg6OlJlYWRXcml0ZU11dGV4KCkgOiBpbXBsXyhuZXcgUmVhZFdyaXRlTXV0ZXg6OmltcGwoKSkge30KK1JlYWRXcml0ZU11dGV4OjpSZWFkV3JpdGVNdXRleCgpIDogaW1wbF8obmV3IFJlYWRXcml0ZU11dGV4OjppbXBsKCkpIHsKK30KIAotdm9pZCBSZWFkV3JpdGVNdXRleDo6YWNxdWlyZVJlYWQoKSBjb25zdCB7IGltcGxfLT5hY3F1aXJlUmVhZCgpOyB9Cit2b2lkIFJlYWRXcml0ZU11dGV4OjphY3F1aXJlUmVhZCgpIGNvbnN0IHsKKyAgaW1wbF8tPmFjcXVpcmVSZWFkKCk7Cit9CiAKLXZvaWQgUmVhZFdyaXRlTXV0ZXg6OmFjcXVpcmVXcml0ZSgpIGNvbnN0IHsgaW1wbF8tPmFjcXVpcmVXcml0ZSgpOyB9Cit2b2lkIFJlYWRXcml0ZU11dGV4OjphY3F1aXJlV3JpdGUoKSBjb25zdCB7CisgIGltcGxfLT5hY3F1aXJlV3JpdGUoKTsKK30KIAotYm9vbCBSZWFkV3JpdGVNdXRleDo6YXR0ZW1wdFJlYWQoKSBjb25zdCB7IHJldHVybiBpbXBsXy0+YXR0ZW1wdFJlYWQoKTsgfQorYm9vbCBSZWFkV3JpdGVNdXRleDo6YXR0ZW1wdFJlYWQoKSBjb25zdCB7CisgIHJldHVybiBpbXBsXy0+YXR0ZW1wdFJlYWQoKTsKK30KIAotYm9vbCBSZWFkV3JpdGVNdXRleDo6YXR0ZW1wdFdyaXRlKCkgY29uc3QgeyByZXR1cm4gaW1wbF8tPmF0dGVtcHRXcml0ZSgpOyB9Citib29sIFJlYWRXcml0ZU11dGV4OjphdHRlbXB0V3JpdGUoKSBjb25zdCB7CisgIHJldHVybiBpbXBsXy0+YXR0ZW1wdFdyaXRlKCk7Cit9CiAKLXZvaWQgUmVhZFdyaXRlTXV0ZXg6OnJlbGVhc2UoKSBjb25zdCB7IGltcGxfLT5yZWxlYXNlKCk7IH0KK3ZvaWQgUmVhZFdyaXRlTXV0ZXg6OnJlbGVhc2UoKSBjb25zdCB7CisgIGltcGxfLT5yZWxlYXNlKCk7Cit9CiAKLU5vU3RhcnZlUmVhZFdyaXRlTXV0ZXg6Ok5vU3RhcnZlUmVhZFdyaXRlTXV0ZXgoKSA6IHdyaXRlcldhaXRpbmdfKGZhbHNlKSB7fQorTm9TdGFydmVSZWFkV3JpdGVNdXRleDo6Tm9TdGFydmVSZWFkV3JpdGVNdXRleCgpIDogd3JpdGVyV2FpdGluZ18oZmFsc2UpIHsKK30KIAotdm9pZCBOb1N0YXJ2ZVJlYWRXcml0ZU11dGV4OjphY3F1aXJlUmVhZCgpIGNvbnN0Ci17Cit2b2lkIE5vU3RhcnZlUmVhZFdyaXRlTXV0ZXg6OmFjcXVpcmVSZWFkKCkgY29uc3QgewogICBpZiAod3JpdGVyV2FpdGluZ18pIHsKICAgICAvLyB3cml0ZXIgaXMgd2FpdGluZywgYmxvY2sgb24gdGhlIHdyaXRlcidzIG11dGV4IHVudGlsIGhlJ3MgZG9uZSB3aXRoIGl0CiAgICAgbXV0ZXhfLmxvY2soKTsKQEAgLTMzMiw4ICszNjAsNyBAQAogICBSZWFkV3JpdGVNdXRleDo6YWNxdWlyZVJlYWQoKTsKIH0KIAotdm9pZCBOb1N0YXJ2ZVJlYWRXcml0ZU11dGV4OjphY3F1aXJlV3JpdGUoKSBjb25zdAotewordm9pZCBOb1N0YXJ2ZVJlYWRXcml0ZU11dGV4OjphY3F1aXJlV3JpdGUoKSBjb25zdCB7CiAgIC8vIGlmIHdlIGNhbiBhY3F1aXJlIHRoZSByd2xvY2sgdGhlIGVhc3kgd2F5LCB3ZSdyZSBkb25lCiAgIGlmIChhdHRlbXB0V3JpdGUoKSkgewogICAgIHJldHVybjsKQEAgLTM0OCw2ICszNzUsNiBAQAogICB3cml0ZXJXYWl0aW5nXyA9IGZhbHNlOwogICBtdXRleF8udW5sb2NrKCk7CiB9Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKLQorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9NdXRleC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L011dGV4LmgKaW5kZXggM2NkODQ0MC4uYTFmNTM5NiAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L011dGV4LmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L011dGV4LmgKQEAgLTIwLDEwICsyMCwxMyBAQAogI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX01VVEVYX0hfCiAjZGVmaW5lIF9USFJJRlRfQ09OQ1VSUkVOQ1lfTVVURVhfSF8gMQogCi0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+CisjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPGJvb3N0L25vbmNvcHlhYmxlLmhwcD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KIAotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgY29uY3VycmVuY3kgeworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBjb25jdXJyZW5jeSB7CiAKICNpZm5kZWYgVEhSSUZUX05PX0NPTlRFTlRJT05fUFJPRklMSU5HCiAKQEAgLTQ2LDIyICs0OSwyNyBAQAogICogcGFydGljdWxhciB0aW1lIHBlcmlvZC4KICAqLwogdHlwZWRlZiB2b2lkICgqTXV0ZXhXYWl0Q2FsbGJhY2spKGNvbnN0IHZvaWQqIGlkLCBpbnQ2NF90IHdhaXRUaW1lTWljcm9zKTsKLXZvaWQgZW5hYmxlTXV0ZXhQcm9maWxpbmcoaW50MzJfdCBwcm9maWxpbmdTYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBNdXRleFdhaXRDYWxsYmFjayBjYWxsYmFjayk7Cit2b2lkIGVuYWJsZU11dGV4UHJvZmlsaW5nKGludDMyX3QgcHJvZmlsaW5nU2FtcGxlUmF0ZSwgTXV0ZXhXYWl0Q2FsbGJhY2sgY2FsbGJhY2spOwogCiAjZW5kaWYKIAogLyoqCisgKiBOT1RFOiBBbGwgbXV0ZXggaW1wbGVtZW50YXRpb25zIHRocm93IGFuIGV4Y2VwdGlvbiBvbiBmYWlsdXJlLiAgU2VlIGVhY2gKKyAqICAgICAgIHNwZWNpZmljIGltcGxlbWVudGF0aW9uIHRvIHVuZGVyc3RhbmQgdGhlIGV4Y2VwdGlvbiB0eXBlKHMpIHVzZWQuCisgKi8KKworLyoqCiAgKiBBIHNpbXBsZSBtdXRleCBjbGFzcwogICoKICAqIEB2ZXJzaW9uICRJZDokCiAgKi8KIGNsYXNzIE11dGV4IHsKLSBwdWJsaWM6CitwdWJsaWM6CiAgIHR5cGVkZWYgdm9pZCAoKkluaXRpYWxpemVyKSh2b2lkKik7CiAKICAgTXV0ZXgoSW5pdGlhbGl6ZXIgaW5pdCA9IERFRkFVTFRfSU5JVElBTElaRVIpOwogICB2aXJ0dWFsIH5NdXRleCgpIHt9CisKICAgdmlydHVhbCB2b2lkIGxvY2soKSBjb25zdDsKICAgdmlydHVhbCBib29sIHRyeWxvY2soKSBjb25zdDsKICAgdmlydHVhbCBib29sIHRpbWVkbG9jayhpbnQ2NF90IG1pbGxpc2Vjb25kcykgY29uc3Q7CkBAIC02OSwxNCArNzcsMTYgQEAKIAogICB2b2lkKiBnZXRVbmRlcmx5aW5nSW1wbCgpIGNvbnN0OwogCi0gIHN0YXRpYyB2b2lkIERFRkFVTFRfSU5JVElBTElaRVIodm9pZCopOworICAvLyBJZiB5b3UgYXR0ZW1wdCB0byB1c2Ugb25lIG9mIHRoZXNlIGFuZCBpdCBmYWlscyB0byBsaW5rLCBpdCBtZWFucworICAvLyB5b3VyIHZlcnNpb24gb2YgcHRocmVhZHMgZG9lcyBub3Qgc3VwcG9ydCBpdCAtIHRyeSBhbm90aGVyIG9uZS4KICAgc3RhdGljIHZvaWQgQURBUFRJVkVfSU5JVElBTElaRVIodm9pZCopOworICBzdGF0aWMgdm9pZCBERUZBVUxUX0lOSVRJQUxJWkVSKHZvaWQqKTsKKyAgc3RhdGljIHZvaWQgRVJST1JDSEVDS19JTklUSUFMSVpFUih2b2lkKik7CiAgIHN0YXRpYyB2b2lkIFJFQ1VSU0lWRV9JTklUSUFMSVpFUih2b2lkKik7CiAKLSBwcml2YXRlOgotCitwcml2YXRlOgogICBjbGFzcyBpbXBsOwotICBib29zdDo6c2hhcmVkX3B0cjxpbXBsPiBpbXBsXzsKKyAgc3RkOjpzaGFyZWRfcHRyPGltcGw+IGltcGxfOwogfTsKIAogY2xhc3MgUmVhZFdyaXRlTXV0ZXggewpAQCAtOTYsOSArMTA2LDggQEAKICAgdmlydHVhbCB2b2lkIHJlbGVhc2UoKSBjb25zdDsKIAogcHJpdmF0ZToKLQogICBjbGFzcyBpbXBsOwotICBib29zdDo6c2hhcmVkX3B0cjxpbXBsPiBpbXBsXzsKKyAgc3RkOjpzaGFyZWRfcHRyPGltcGw+IGltcGxfOwogfTsKIAogLyoqCkBAIC0xMjEsNyArMTMwLDcgQEAKIH07CiAKIGNsYXNzIEd1YXJkIDogYm9vc3Q6Om5vbmNvcHlhYmxlIHsKLSBwdWJsaWM6CitwdWJsaWM6CiAgIEd1YXJkKGNvbnN0IE11dGV4JiB2YWx1ZSwgaW50NjRfdCB0aW1lb3V0ID0gMCkgOiBtdXRleF8oJnZhbHVlKSB7CiAgICAgaWYgKHRpbWVvdXQgPT0gMCkgewogICAgICAgdmFsdWUubG9jaygpOwpAQCAtMTQxLDQ4ICsxNTAsNDAgQEAKICAgICB9CiAgIH0KIAotICBvcGVyYXRvciBib29sKCkgY29uc3QgewotICAgIHJldHVybiAobXV0ZXhfICE9IE5VTEwpOwotICB9CisgIG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiAobXV0ZXhfICE9IE5VTEwpOyB9CiAKLSBwcml2YXRlOgorcHJpdmF0ZToKICAgY29uc3QgTXV0ZXgqIG11dGV4XzsKIH07CiAKIC8vIENhbiBiZSB1c2VkIGFzIHNlY29uZCBhcmd1bWVudCB0byBSV0d1YXJkIHRvIG1ha2UgY29kZSBtb3JlIHJlYWRhYmxlCiAvLyBhcyB0byB3aGV0aGVyIHdlJ3JlIGRvaW5nIGFjcXVpcmVSZWFkKCkgb3IgYWNxdWlyZVdyaXRlKCkuCi1lbnVtIFJXR3VhcmRUeXBlIHsKLSAgUldfUkVBRCA9IDAsCi0gIFJXX1dSSVRFID0gMQotfTsKLQorZW51bSBSV0d1YXJkVHlwZSB7IFJXX1JFQUQgPSAwLCBSV19XUklURSA9IDEgfTsKIAogY2xhc3MgUldHdWFyZCA6IGJvb3N0Ojpub25jb3B5YWJsZSB7Ci0gIHB1YmxpYzoKLSAgICBSV0d1YXJkKGNvbnN0IFJlYWRXcml0ZU11dGV4JiB2YWx1ZSwgYm9vbCB3cml0ZSA9IGZhbHNlKQotICAgICAgICAgOiByd19tdXRleF8odmFsdWUpIHsKLSAgICAgIGlmICh3cml0ZSkgewotICAgICAgICByd19tdXRleF8uYWNxdWlyZVdyaXRlKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByd19tdXRleF8uYWNxdWlyZVJlYWQoKTsKLSAgICAgIH0KK3B1YmxpYzoKKyAgUldHdWFyZChjb25zdCBSZWFkV3JpdGVNdXRleCYgdmFsdWUsIGJvb2wgd3JpdGUgPSBmYWxzZSkgOiByd19tdXRleF8odmFsdWUpIHsKKyAgICBpZiAod3JpdGUpIHsKKyAgICAgIHJ3X211dGV4Xy5hY3F1aXJlV3JpdGUoKTsKKyAgICB9IGVsc2UgeworICAgICAgcndfbXV0ZXhfLmFjcXVpcmVSZWFkKCk7CiAgICAgfQorICB9CiAKLSAgICBSV0d1YXJkKGNvbnN0IFJlYWRXcml0ZU11dGV4JiB2YWx1ZSwgUldHdWFyZFR5cGUgdHlwZSkKLSAgICAgICAgIDogcndfbXV0ZXhfKHZhbHVlKSB7Ci0gICAgICBpZiAodHlwZSA9PSBSV19XUklURSkgewotICAgICAgICByd19tdXRleF8uYWNxdWlyZVdyaXRlKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByd19tdXRleF8uYWNxdWlyZVJlYWQoKTsKLSAgICAgIH0KKyAgUldHdWFyZChjb25zdCBSZWFkV3JpdGVNdXRleCYgdmFsdWUsIFJXR3VhcmRUeXBlIHR5cGUpIDogcndfbXV0ZXhfKHZhbHVlKSB7CisgICAgaWYgKHR5cGUgPT0gUldfV1JJVEUpIHsKKyAgICAgIHJ3X211dGV4Xy5hY3F1aXJlV3JpdGUoKTsKKyAgICB9IGVsc2UgeworICAgICAgcndfbXV0ZXhfLmFjcXVpcmVSZWFkKCk7CiAgICAgfQotICAgIH5SV0d1YXJkKCkgewotICAgICAgcndfbXV0ZXhfLnJlbGVhc2UoKTsKLSAgICB9Ci0gIHByaXZhdGU6Ci0gICAgY29uc3QgUmVhZFdyaXRlTXV0ZXgmIHJ3X211dGV4XzsKKyAgfQorICB+UldHdWFyZCgpIHsgcndfbXV0ZXhfLnJlbGVhc2UoKTsgfQorCitwcml2YXRlOgorICBjb25zdCBSZWFkV3JpdGVNdXRleCYgcndfbXV0ZXhfOwogfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKIAogI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9DT05DVVJSRU5DWV9NVVRFWF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1BsYXRmb3JtVGhyZWFkRmFjdG9yeS5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1BsYXRmb3JtVGhyZWFkRmFjdG9yeS5oCmluZGV4IDZlNDZkZmMuLjk5YjQ0MDMgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9QbGF0Zm9ybVRocmVhZEZhY3RvcnkuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvUGxhdGZvcm1UaHJlYWRGYWN0b3J5LmgKQEAgLTIwLDI1ICsyMCwyOSBAQAogI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX1BMQVRGT1JNVEhSRUFERkFDVE9SWV9IXwogI2RlZmluZSBfVEhSSUZUX0NPTkNVUlJFTkNZX1BMQVRGT1JNVEhSRUFERkFDVE9SWV9IXyAxCiAKKy8vIGNsYW5nLWZvcm1hdCBvZmYKICNpbmNsdWRlIDx0aHJpZnQvdGhyaWZ0LWNvbmZpZy5oPgotI2lmIFVTRV9CT09TVF9USFJFQUQKLSMgIGluY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9Cb29zdFRocmVhZEZhY3RvcnkuaD4KLSNlbGlmIFVTRV9TVERfVEhSRUFECisjaWYgVVNFX1NURF9USFJFQUQKICMgIGluY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9TdGRUaHJlYWRGYWN0b3J5Lmg+CiAjZWxzZQogIyAgaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1Bvc2l4VGhyZWFkRmFjdG9yeS5oPgogI2VuZGlmCisvLyBjbGFuZy1mb3JtYXQgb24KIAotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgY29uY3VycmVuY3kgeworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBjb25jdXJyZW5jeSB7CiAKLSNpZmRlZiBVU0VfQk9PU1RfVEhSRUFECi0gIHR5cGVkZWYgQm9vc3RUaHJlYWRGYWN0b3J5IFBsYXRmb3JtVGhyZWFkRmFjdG9yeTsKLSNlbGlmIFVTRV9TVERfVEhSRUFECisvLyBjbGFuZy1mb3JtYXQgb2ZmCisjaWYgVVNFX1NURF9USFJFQUQKICAgdHlwZWRlZiBTdGRUaHJlYWRGYWN0b3J5IFBsYXRmb3JtVGhyZWFkRmFjdG9yeTsKICNlbHNlCiAgIHR5cGVkZWYgUG9zaXhUaHJlYWRGYWN0b3J5IFBsYXRmb3JtVGhyZWFkRmFjdG9yeTsKICNlbmRpZgorLy8gY2xhbmctZm9ybWF0IG9uCiAKLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5CiAKICNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfQ09OQ1VSUkVOQ1lfUExBVEZPUk1USFJFQURGQUNUT1JZX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvUG9zaXhUaHJlYWRGYWN0b3J5LmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Qb3NpeFRocmVhZEZhY3RvcnkuY3BwCmluZGV4IDUyY2VlYWQuLjVjNTkyNjkgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Qb3NpeFRocmVhZEZhY3RvcnkuY3BwCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Qb3NpeFRocmVhZEZhY3RvcnkuY3BwCkBAIC0xOSwxMSArMTksMTIgQEAKIAogI2luY2x1ZGUgPHRocmlmdC90aHJpZnQtY29uZmlnLmg+CiAKLSNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvUG9zaXhUaHJlYWRGYWN0b3J5Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L0V4Y2VwdGlvbi5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1Bvc2l4VGhyZWFkRmFjdG9yeS5oPgogCiAjaWYgR09PR0xFX1BFUkZUT09MU19SRUdJU1RFUl9USFJFQUQKLSMgIGluY2x1ZGUgPGdvb2dsZS9wcm9maWxlci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm9maWxlci5oPgogI2VuZGlmCiAKICNpbmNsdWRlIDxhc3NlcnQuaD4KQEAgLTMxLDU1ICszMiw1MSBAQAogCiAjaW5jbHVkZSA8aW9zdHJlYW0+CiAKLSNpbmNsdWRlIDxib29zdC93ZWFrX3B0ci5ocHA+CisjaW5jbHVkZSA8bWVtb3J5PgogCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBjb25jdXJyZW5jeSB7Ci0KLXVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOwotdXNpbmcgYm9vc3Q6OndlYWtfcHRyOworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBjb25jdXJyZW5jeSB7CiAKIC8qKgogICogVGhlIFBPU0lYIHRocmVhZCBjbGFzcy4KICAqCiAgKiBAdmVyc2lvbiAkSWQ6JAogICovCi1jbGFzcyBQdGhyZWFkVGhyZWFkOiBwdWJsaWMgVGhyZWFkIHsKLSBwdWJsaWM6Ci0KLSAgZW51bSBTVEFURSB7Ci0gICAgdW5pbml0aWFsaXplZCwKLSAgICBzdGFydGluZywKLSAgICBzdGFydGVkLAotICAgIHN0b3BwaW5nLAotICAgIHN0b3BwZWQKLSAgfTsKK2NsYXNzIFB0aHJlYWRUaHJlYWQgOiBwdWJsaWMgVGhyZWFkIHsKK3B1YmxpYzoKKyAgZW51bSBTVEFURSB7IHVuaW5pdGlhbGl6ZWQsIHN0YXJ0aW5nLCBzdGFydGVkLCBzdG9wcGluZywgc3RvcHBlZCB9OwogCiAgIHN0YXRpYyBjb25zdCBpbnQgTUIgPSAxMDI0ICogMTAyNDsKIAogICBzdGF0aWMgdm9pZCogdGhyZWFkTWFpbih2b2lkKiBhcmcpOwogCi0gcHJpdmF0ZToKK3ByaXZhdGU6CiAgIHB0aHJlYWRfdCBwdGhyZWFkXzsKLSAgU1RBVEUgc3RhdGVfOworICBNb25pdG9yIG1vbml0b3JfOwkJLy8gZ3VhcmQgdG8gcHJvdGVjdCBzdGF0ZV8gYW5kIGFsc28gbm90aWZpY2F0aW9uCisgIFNUQVRFIHN0YXRlXzsgICAgICAgICAvLyB0byBwcm90ZWN0IHByb3BlciB0aHJlYWQgc3RhcnQgYmVoYXZpb3IKICAgaW50IHBvbGljeV87CiAgIGludCBwcmlvcml0eV87CiAgIGludCBzdGFja1NpemVfOwotICB3ZWFrX3B0cjxQdGhyZWFkVGhyZWFkPiBzZWxmXzsKKyAgc3RkOjp3ZWFrX3B0cjxQdGhyZWFkVGhyZWFkPiBzZWxmXzsKICAgYm9vbCBkZXRhY2hlZF87CiAKLSBwdWJsaWM6Ci0KLSAgUHRocmVhZFRocmVhZChpbnQgcG9saWN5LCBpbnQgcHJpb3JpdHksIGludCBzdGFja1NpemUsIGJvb2wgZGV0YWNoZWQsIHNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlKSA6CitwdWJsaWM6CisgIFB0aHJlYWRUaHJlYWQoaW50IHBvbGljeSwKKyAgICAgICAgICAgICAgICBpbnQgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgaW50IHN0YWNrU2l6ZSwKKyAgICAgICAgICAgICAgICBib29sIGRldGFjaGVkLAorICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGUpCisgICAgOgogCiAjaWZuZGVmIF9XSU4zMgotICAgIHB0aHJlYWRfKDApLAorICAgICAgcHRocmVhZF8oMCksCiAjZW5kaWYgLy8gX1dJTjMyCi0KLSAgICBzdGF0ZV8odW5pbml0aWFsaXplZCksCi0gICAgcG9saWN5Xyhwb2xpY3kpLAotICAgIHByaW9yaXR5Xyhwcmlvcml0eSksCi0gICAgc3RhY2tTaXplXyhzdGFja1NpemUpLAotICAgIGRldGFjaGVkXyhkZXRhY2hlZCkgeworICAgICAgc3RhdGVfKHVuaW5pdGlhbGl6ZWQpLAorICAgICAgcG9saWN5Xyhwb2xpY3kpLAorICAgICAgcHJpb3JpdHlfKHByaW9yaXR5KSwKKyAgICAgIHN0YWNrU2l6ZV8oc3RhY2tTaXplKSwKKyAgICAgIGRldGFjaGVkXyhkZXRhY2hlZCkgewogCiAgICAgdGhpcy0+VGhyZWFkOjpydW5uYWJsZShydW5uYWJsZSk7CiAgIH0KQEAgLTg4LDMwICs4NSw0NyBAQAogICAgIC8qIE5vdGhpbmcgcmVmZXJlbmNlcyB0aGlzIHRocmVhZCwgaWYgaXMgaXMgbm90IGRldGFjaGVkLCBkbyBhIGpvaW4KICAgICAgICBub3csIG90aGVyd2lzZSB0aGUgdGhyZWFkLWlkIGFuZCwgcG9zc2libHksIG90aGVyIHJlc291cmNlcyB3aWxsCiAgICAgICAgYmUgbGVha2VkLiAqLwotICAgIGlmKCFkZXRhY2hlZF8pIHsKKyAgICBpZiAoIWRldGFjaGVkXykgewogICAgICAgdHJ5IHsKICAgICAgICAgam9pbigpOwotICAgICAgfSBjYXRjaCguLi4pIHsKKyAgICAgIH0gY2F0Y2ggKC4uLikgewogICAgICAgICAvLyBXZSdyZSByZWFsbHkgaG9zZWQuCiAgICAgICB9CiAgICAgfQogICB9CiAKKyAgU1RBVEUgZ2V0U3RhdGUoKSBjb25zdAorICB7CisgICAgU3luY2hyb25pemVkIHN5bmMobW9uaXRvcl8pOworICAgIHJldHVybiBzdGF0ZV87CisgIH0KKworICB2b2lkIHNldFN0YXRlKFNUQVRFIG5ld1N0YXRlKQorICB7CisgICAgU3luY2hyb25pemVkIHN5bmMobW9uaXRvcl8pOworICAgIHN0YXRlXyA9IG5ld1N0YXRlOworCisgICAgLy8gdW5ibG9jayBzdGFydCgpIHdpdGggdGhlIGtub3dsZWRnZSB0aGF0IHRoZSB0aHJlYWQgaGFzIGFjdHVhbGx5CisgICAgLy8gc3RhcnRlZCBydW5uaW5nLCB3aGljaCBhdm9pZHMgYSByYWNlIGluIGRldGFjaGVkIHRocmVhZHMuCisgICAgaWYgKG5ld1N0YXRlID09IHN0YXJ0ZWQpIHsKKwkgIG1vbml0b3JfLm5vdGlmeSgpOworICAgIH0KKyAgfQorCiAgIHZvaWQgc3RhcnQoKSB7Ci0gICAgaWYgKHN0YXRlXyAhPSB1bmluaXRpYWxpemVkKSB7CisgICAgaWYgKGdldFN0YXRlKCkgIT0gdW5pbml0aWFsaXplZCkgewogICAgICAgcmV0dXJuOwogICAgIH0KIAogICAgIHB0aHJlYWRfYXR0cl90IHRocmVhZF9hdHRyOwogICAgIGlmIChwdGhyZWFkX2F0dHJfaW5pdCgmdGhyZWFkX2F0dHIpICE9IDApIHsKLSAgICAgICAgdGhyb3cgU3lzdGVtUmVzb3VyY2VFeGNlcHRpb24oInB0aHJlYWRfYXR0cl9pbml0IGZhaWxlZCIpOworICAgICAgdGhyb3cgU3lzdGVtUmVzb3VyY2VFeGNlcHRpb24oInB0aHJlYWRfYXR0cl9pbml0IGZhaWxlZCIpOwogICAgIH0KIAotICAgIGlmKHB0aHJlYWRfYXR0cl9zZXRkZXRhY2hzdGF0ZSgmdGhyZWFkX2F0dHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGFjaGVkXyA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBUSFJFQURfQ1JFQVRFX0RFVEFDSEVEIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFRIUkVBRF9DUkVBVEVfSk9JTkFCTEUpICE9IDApIHsKLSAgICAgICAgdGhyb3cgU3lzdGVtUmVzb3VyY2VFeGNlcHRpb24oInB0aHJlYWRfYXR0cl9zZXRkZXRhY2hzdGF0ZSBmYWlsZWQiKTsKKyAgICBpZiAocHRocmVhZF9hdHRyX3NldGRldGFjaHN0YXRlKCZ0aHJlYWRfYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGFjaGVkXyA/IFBUSFJFQURfQ1JFQVRFX0RFVEFDSEVEIDogUFRIUkVBRF9DUkVBVEVfSk9JTkFCTEUpCisgICAgICAgICE9IDApIHsKKyAgICAgIHRocm93IFN5c3RlbVJlc291cmNlRXhjZXB0aW9uKCJwdGhyZWFkX2F0dHJfc2V0ZGV0YWNoc3RhdGUgZmFpbGVkIik7CiAgICAgfQogCiAgICAgLy8gU2V0IHRocmVhZCBzdGFjayBzaXplCkBAIC0xMTksMTUgKzEzMywxOCBAQAogICAgICAgdGhyb3cgU3lzdGVtUmVzb3VyY2VFeGNlcHRpb24oInB0aHJlYWRfYXR0cl9zZXRzdGFja3NpemUgZmFpbGVkIik7CiAgICAgfQogCi0gICAgLy8gU2V0IHRocmVhZCBwb2xpY3kKLSAgICAjaWZkZWYgX1dJTjMyCi0JLy9XSU4zMiBQdGhyZWFkIGltcGxlbWVudGF0aW9uIGRvZXNuJ3Qgc2VlbSB0byBzdXBwb3J0IHNoZWR1bGluZyBwb2xpY2llcyBvdGhlciB0aGVuIFBvc2l4VGhyZWFkRmFjdG9yeTo6T1RIRVIgLSBydW50aW1lIGVycm9yCi0JcG9saWN5XyA9IFBvc2l4VGhyZWFkRmFjdG9yeTo6T1RIRVI7Ci0gICAgI2VuZGlmCisvLyBTZXQgdGhyZWFkIHBvbGljeQorI2lmZGVmIF9XSU4zMgorICAgIC8vIFdJTjMyIFB0aHJlYWQgaW1wbGVtZW50YXRpb24gZG9lc24ndCBzZWVtIHRvIHN1cHBvcnQgc2hlZHVsaW5nIHBvbGljaWVzIG90aGVyIHRoZW4KKyAgICAvLyBQb3NpeFRocmVhZEZhY3Rvcnk6Ok9USEVSIC0gcnVudGltZSBlcnJvcgorICAgIHBvbGljeV8gPSBQb3NpeFRocmVhZEZhY3Rvcnk6Ok9USEVSOworI2VuZGlmCiAKKyNpZiBfUE9TSVhfVEhSRUFEX1BSSU9SSVRZX1NDSEVEVUxJTkcgPiAwCiAgICAgaWYgKHB0aHJlYWRfYXR0cl9zZXRzY2hlZHBvbGljeSgmdGhyZWFkX2F0dHIsIHBvbGljeV8pICE9IDApIHsKICAgICAgIHRocm93IFN5c3RlbVJlc291cmNlRXhjZXB0aW9uKCJwdGhyZWFkX2F0dHJfc2V0c2NoZWRwb2xpY3kgZmFpbGVkIik7CiAgICAgfQorI2VuZGlmCiAKICAgICBzdHJ1Y3Qgc2NoZWRfcGFyYW0gc2NoZWRfcGFyYW07CiAgICAgc2NoZWRfcGFyYW0uc2NoZWRfcHJpb3JpdHkgPSBwcmlvcml0eV87CkBAIC0xMzgsMTggKzE1NSwyNyBAQAogICAgIH0KIAogICAgIC8vIENyZWF0ZSByZWZlcmVuY2UKLSAgICBzaGFyZWRfcHRyPFB0aHJlYWRUaHJlYWQ+KiBzZWxmUmVmID0gbmV3IHNoYXJlZF9wdHI8UHRocmVhZFRocmVhZD4oKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8UHRocmVhZFRocmVhZD4qIHNlbGZSZWYgPSBuZXcgc3RkOjpzaGFyZWRfcHRyPFB0aHJlYWRUaHJlYWQ+KCk7CiAgICAgKnNlbGZSZWYgPSBzZWxmXy5sb2NrKCk7CiAKLSAgICBzdGF0ZV8gPSBzdGFydGluZzsKKyAgICBzZXRTdGF0ZShzdGFydGluZyk7CiAKKwlTeW5jaHJvbml6ZWQgc3luYyhtb25pdG9yXyk7CisJCiAgICAgaWYgKHB0aHJlYWRfY3JlYXRlKCZwdGhyZWFkXywgJnRocmVhZF9hdHRyLCB0aHJlYWRNYWluLCAodm9pZCopc2VsZlJlZikgIT0gMCkgewogICAgICAgdGhyb3cgU3lzdGVtUmVzb3VyY2VFeGNlcHRpb24oInB0aHJlYWRfY3JlYXRlIGZhaWxlZCIpOwogICAgIH0KKyAgICAKKyAgICAvLyBUaGUgY2FsbGVyIG1heSBub3QgY2hvb3NlIHRvIGd1YXJhbnRlZSB0aGUgc2NvcGUgb2YgdGhlIFJ1bm5hYmxlCisgICAgLy8gYmVpbmcgdXNlZCBpbiB0aGUgdGhyZWFkLCBzbyB3ZSBtdXN0IGFjdHVhbGx5IHdhaXQgdW50aWwgdGhlIHRocmVhZAorICAgIC8vIHN0YXJ0cyBiZWZvcmUgd2UgcmV0dXJuLiAgSWYgd2UgZG8gbm90IHdhaXQsIGl0IHdvdWxkIGJlIHBvc3NpYmxlCisgICAgLy8gZm9yIHRoZSBjYWxsZXIgdG8gc3RhcnQgZGVzdHJ1Y3RpbmcgdGhlIFJ1bm5hYmxlIGFuZCB0aGUgVGhyZWFkLAorICAgIC8vIGFuZCB3ZSB3b3VsZCBlbmQgdXAgaW4gYSByYWNlLiAgVGhpcyB3YXMgaWRlbnRpZmllZCB3aXRoIHZhbGdyaW5kLgorICAgIG1vbml0b3JfLndhaXQoKTsKICAgfQogCiAgIHZvaWQgam9pbigpIHsKLSAgICBpZiAoIWRldGFjaGVkXyAmJiBzdGF0ZV8gIT0gdW5pbml0aWFsaXplZCkgeworICAgIGlmICghZGV0YWNoZWRfICYmIGdldFN0YXRlKCkgIT0gdW5pbml0aWFsaXplZCkgewogICAgICAgdm9pZCogaWdub3JlOwogICAgICAgLyogWFhYCiAgICAgICAgICBJZiBqb2luIGZhaWxzIGl0IGlzIG1vc3QgbGlrZWx5IGR1ZSB0byB0aGUgZmFjdApAQCAtMTYzLDggKzE4OSw2IEBACiAgICAgICBpZiAocmVzICE9IDApIHsKICAgICAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiUHRocmVhZFRocmVhZDo6am9pbigpOiBmYWlsIHdpdGggY29kZSAlZCIsIHJlcyk7CiAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoIlB0aHJlYWRUaHJlYWQ6OmpvaW4oKTogZGV0YWNoZWQgdGhyZWFkIik7CiAgICAgfQogICB9CiAKQEAgLTE3NywxNjUgKzIwMSwxMzUgQEAKICNlbmRpZiAvLyBfV0lOMzIKICAgfQogCi0gIHNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlKCkgY29uc3QgeyByZXR1cm4gVGhyZWFkOjpydW5uYWJsZSgpOyB9CisgIHN0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGUoKSBjb25zdCB7IHJldHVybiBUaHJlYWQ6OnJ1bm5hYmxlKCk7IH0KIAotICB2b2lkIHJ1bm5hYmxlKHNoYXJlZF9wdHI8UnVubmFibGU+IHZhbHVlKSB7IFRocmVhZDo6cnVubmFibGUodmFsdWUpOyB9CisgIHZvaWQgcnVubmFibGUoc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB2YWx1ZSkgeyBUaHJlYWQ6OnJ1bm5hYmxlKHZhbHVlKTsgfQogCi0gIHZvaWQgd2Vha1JlZihzaGFyZWRfcHRyPFB0aHJlYWRUaHJlYWQ+IHNlbGYpIHsKKyAgdm9pZCB3ZWFrUmVmKHN0ZDo6c2hhcmVkX3B0cjxQdGhyZWFkVGhyZWFkPiBzZWxmKSB7CiAgICAgYXNzZXJ0KHNlbGYuZ2V0KCkgPT0gdGhpcyk7Ci0gICAgc2VsZl8gPSB3ZWFrX3B0cjxQdGhyZWFkVGhyZWFkPihzZWxmKTsKKyAgICBzZWxmXyA9IHN0ZDo6d2Vha19wdHI8UHRocmVhZFRocmVhZD4oc2VsZik7CiAgIH0KIH07CiAKIHZvaWQqIFB0aHJlYWRUaHJlYWQ6OnRocmVhZE1haW4odm9pZCogYXJnKSB7Ci0gIHNoYXJlZF9wdHI8UHRocmVhZFRocmVhZD4gdGhyZWFkID0gKihzaGFyZWRfcHRyPFB0aHJlYWRUaHJlYWQ+Kilhcmc7Ci0gIGRlbGV0ZSByZWludGVycHJldF9jYXN0PHNoYXJlZF9wdHI8UHRocmVhZFRocmVhZD4qPihhcmcpOwotCi0gIGlmICh0aHJlYWQgPT0gTlVMTCkgewotICAgIHJldHVybiAodm9pZCopMDsKLSAgfQotCi0gIGlmICh0aHJlYWQtPnN0YXRlXyAhPSBzdGFydGluZykgewotICAgIHJldHVybiAodm9pZCopMDsKLSAgfQorICBzdGQ6OnNoYXJlZF9wdHI8UHRocmVhZFRocmVhZD4gdGhyZWFkID0gKihzdGQ6OnNoYXJlZF9wdHI8UHRocmVhZFRocmVhZD4qKWFyZzsKKyAgZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8c3RkOjpzaGFyZWRfcHRyPFB0aHJlYWRUaHJlYWQ+Kj4oYXJnKTsKIAogI2lmIEdPT0dMRV9QRVJGVE9PTFNfUkVHSVNURVJfVEhSRUFECiAgIFByb2ZpbGVyUmVnaXN0ZXJUaHJlYWQoKTsKICNlbmRpZgogCi0gIHRocmVhZC0+c3RhdGVfID0gc3RhcnRlZDsKKyAgdGhyZWFkLT5zZXRTdGF0ZShzdGFydGVkKTsKKwogICB0aHJlYWQtPnJ1bm5hYmxlKCktPnJ1bigpOwotICBpZiAodGhyZWFkLT5zdGF0ZV8gIT0gc3RvcHBpbmcgJiYgdGhyZWFkLT5zdGF0ZV8gIT0gc3RvcHBlZCkgewotICAgIHRocmVhZC0+c3RhdGVfID0gc3RvcHBpbmc7CisKKyAgU1RBVEUgX3MgPSB0aHJlYWQtPmdldFN0YXRlKCk7CisgIGlmIChfcyAhPSBzdG9wcGluZyAmJiBfcyAhPSBzdG9wcGVkKSB7CisgICAgdGhyZWFkLT5zZXRTdGF0ZShzdG9wcGluZyk7CiAgIH0KIAogICByZXR1cm4gKHZvaWQqKTA7CiB9CiAKIC8qKgotICogUE9TSVggVGhyZWFkIGZhY3RvcnkgaW1wbGVtZW50YXRpb24KKyAqIENvbnZlcnRzIGdlbmVyaWMgcG9zaXggdGhyZWFkIHNjaGVkdWxlIHBvbGljeSBlbnVtcyBpbnRvIHB0aHJlYWQKKyAqIEFQSSB2YWx1ZXMuCiAgKi8KLWNsYXNzIFBvc2l4VGhyZWFkRmFjdG9yeTo6SW1wbCB7Ci0KLSBwcml2YXRlOgotICBQT0xJQ1kgcG9saWN5XzsKLSAgUFJJT1JJVFkgcHJpb3JpdHlfOwotICBpbnQgc3RhY2tTaXplXzsKLSAgYm9vbCBkZXRhY2hlZF87Ci0KLSAgLyoqCi0gICAqIENvbnZlcnRzIGdlbmVyaWMgcG9zaXggdGhyZWFkIHNjaGVkdWxlIHBvbGljeSBlbnVtcyBpbnRvIHB0aHJlYWQKLSAgICogQVBJIHZhbHVlcy4KLSAgICovCi0gIHN0YXRpYyBpbnQgdG9QdGhyZWFkUG9saWN5KFBPTElDWSBwb2xpY3kpIHsKLSAgICBzd2l0Y2ggKHBvbGljeSkgewotICAgIGNhc2UgT1RIRVI6Ci0gICAgICByZXR1cm4gU0NIRURfT1RIRVI7Ci0gICAgY2FzZSBGSUZPOgotICAgICAgcmV0dXJuIFNDSEVEX0ZJRk87Ci0gICAgY2FzZSBST1VORF9ST0JJTjoKLSAgICAgIHJldHVybiBTQ0hFRF9SUjsKLSAgICB9CitzdGF0aWMgaW50IHRvUHRocmVhZFBvbGljeShQb3NpeFRocmVhZEZhY3Rvcnk6OlBPTElDWSBwb2xpY3kpIHsKKyAgc3dpdGNoIChwb2xpY3kpIHsKKyAgY2FzZSBQb3NpeFRocmVhZEZhY3Rvcnk6Ok9USEVSOgogICAgIHJldHVybiBTQ0hFRF9PVEhFUjsKKyAgY2FzZSBQb3NpeFRocmVhZEZhY3Rvcnk6OkZJRk86CisgICAgcmV0dXJuIFNDSEVEX0ZJRk87CisgIGNhc2UgUG9zaXhUaHJlYWRGYWN0b3J5OjpST1VORF9ST0JJTjoKKyAgICByZXR1cm4gU0NIRURfUlI7CiAgIH0KKyAgcmV0dXJuIFNDSEVEX09USEVSOworfQogCi0gIC8qKgotICAgKiBDb252ZXJ0cyByZWxhdGl2ZSB0aHJlYWQgcHJpb3JpdGllcyB0byBhYnNvbHV0ZSB2YWx1ZSBiYXNlZCBvbiBwb3NpeAotICAgKiB0aHJlYWQgc2NoZWR1bGVyIHBvbGljeQotICAgKgotICAgKiAgVGhlIGlkZWEgaXMgc2ltcGx5IHRvIGRpdmlkZSB1cCB0aGUgcHJpb3JpdHkgcmFuZ2UgZm9yIHRoZSBnaXZlbiBwb2xpY3kKLSAgICogaW50byB0aGUgY29ycmVwc29uZGluZyByZWxhdGl2ZSBwcmlvcml0eSBsZXZlbCAobG93ZXN0Li5oaWdoZXN0KSBhbmQKLSAgICogdGhlbiBwcm8tcmF0ZSBhY2NvcmRpbmdseS4KLSAgICovCi0gIHN0YXRpYyBpbnQgdG9QdGhyZWFkUHJpb3JpdHkoUE9MSUNZIHBvbGljeSwgUFJJT1JJVFkgcHJpb3JpdHkpIHsKLSAgICBpbnQgcHRocmVhZF9wb2xpY3kgPSB0b1B0aHJlYWRQb2xpY3kocG9saWN5KTsKLSAgICBpbnQgbWluX3ByaW9yaXR5ID0gMDsKLSAgICBpbnQgbWF4X3ByaW9yaXR5ID0gMDsKKy8qKgorICogQ29udmVydHMgcmVsYXRpdmUgdGhyZWFkIHByaW9yaXRpZXMgdG8gYWJzb2x1dGUgdmFsdWUgYmFzZWQgb24gcG9zaXgKKyAqIHRocmVhZCBzY2hlZHVsZXIgcG9saWN5CisgKgorICogIFRoZSBpZGVhIGlzIHNpbXBseSB0byBkaXZpZGUgdXAgdGhlIHByaW9yaXR5IHJhbmdlIGZvciB0aGUgZ2l2ZW4gcG9saWN5CisgKiBpbnRvIHRoZSBjb3JyZXBzb25kaW5nIHJlbGF0aXZlIHByaW9yaXR5IGxldmVsIChsb3dlc3QuLmhpZ2hlc3QpIGFuZAorICogdGhlbiBwcm8tcmF0ZSBhY2NvcmRpbmdseS4KKyAqLworc3RhdGljIGludCB0b1B0aHJlYWRQcmlvcml0eShQb3NpeFRocmVhZEZhY3Rvcnk6OlBPTElDWSBwb2xpY3ksIFBvc2l4VGhyZWFkRmFjdG9yeTo6UFJJT1JJVFkgcHJpb3JpdHkpIHsKKyAgaW50IHB0aHJlYWRfcG9saWN5ID0gdG9QdGhyZWFkUG9saWN5KHBvbGljeSk7CisgIGludCBtaW5fcHJpb3JpdHkgPSAwOworICBpbnQgbWF4X3ByaW9yaXR5ID0gMDsKICNpZmRlZiBIQVZFX1NDSEVEX0dFVF9QUklPUklUWV9NSU4KLSAgICBtaW5fcHJpb3JpdHkgPSBzY2hlZF9nZXRfcHJpb3JpdHlfbWluKHB0aHJlYWRfcG9saWN5KTsKKyAgbWluX3ByaW9yaXR5ID0gc2NoZWRfZ2V0X3ByaW9yaXR5X21pbihwdGhyZWFkX3BvbGljeSk7CiAjZW5kaWYKICNpZmRlZiBIQVZFX1NDSEVEX0dFVF9QUklPUklUWV9NQVgKLSAgICBtYXhfcHJpb3JpdHkgPSBzY2hlZF9nZXRfcHJpb3JpdHlfbWF4KHB0aHJlYWRfcG9saWN5KTsKKyAgbWF4X3ByaW9yaXR5ID0gc2NoZWRfZ2V0X3ByaW9yaXR5X21heChwdGhyZWFkX3BvbGljeSk7CiAjZW5kaWYKLSAgICBpbnQgcXVhbnRhID0gKEhJR0hFU1QgLSBMT1dFU1QpICsgMTsKLSAgICBmbG9hdCBzdGVwc3BlcnF1YW50YSA9IChmbG9hdCkobWF4X3ByaW9yaXR5IC0gbWluX3ByaW9yaXR5KSAvIHF1YW50YTsKKyAgaW50IHF1YW50YSA9IChQb3NpeFRocmVhZEZhY3Rvcnk6OkhJR0hFU1QgLSBQb3NpeFRocmVhZEZhY3Rvcnk6OkxPV0VTVCkgKyAxOworICBmbG9hdCBzdGVwc3BlcnF1YW50YSA9IChmbG9hdCkobWF4X3ByaW9yaXR5IC0gbWluX3ByaW9yaXR5KSAvIHF1YW50YTsKIAotICAgIGlmIChwcmlvcml0eSA8PSBISUdIRVNUKSB7Ci0gICAgICByZXR1cm4gKGludCkobWluX3ByaW9yaXR5ICsgc3RlcHNwZXJxdWFudGEgKiBwcmlvcml0eSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIHNob3VsZCBuZXZlciBnZXQgaGVyZSBmb3IgcHJpb3JpdHkgaW5jcmVtZW50cy4KLSAgICAgIGFzc2VydChmYWxzZSk7Ci0gICAgICByZXR1cm4gKGludCkobWluX3ByaW9yaXR5ICsgc3RlcHNwZXJxdWFudGEgKiBOT1JNQUwpOwotICAgIH0KKyAgaWYgKHByaW9yaXR5IDw9IFBvc2l4VGhyZWFkRmFjdG9yeTo6SElHSEVTVCkgeworICAgIHJldHVybiAoaW50KShtaW5fcHJpb3JpdHkgKyBzdGVwc3BlcnF1YW50YSAqIHByaW9yaXR5KTsKKyAgfSBlbHNlIHsKKyAgICAvLyBzaG91bGQgbmV2ZXIgZ2V0IGhlcmUgZm9yIHByaW9yaXR5IGluY3JlbWVudHMuCisgICAgYXNzZXJ0KGZhbHNlKTsKKyAgICByZXR1cm4gKGludCkobWluX3ByaW9yaXR5ICsgc3RlcHNwZXJxdWFudGEgKiBQb3NpeFRocmVhZEZhY3Rvcnk6Ok5PUk1BTCk7CiAgIH0KK30KIAotIHB1YmxpYzoKLQotICBJbXBsKFBPTElDWSBwb2xpY3ksIFBSSU9SSVRZIHByaW9yaXR5LCBpbnQgc3RhY2tTaXplLCBib29sIGRldGFjaGVkKSA6CitQb3NpeFRocmVhZEZhY3Rvcnk6OlBvc2l4VGhyZWFkRmFjdG9yeShQT0xJQ1kgcG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJJT1JJVFkgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhY2tTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZXRhY2hlZCkKKyAgOiBUaHJlYWRGYWN0b3J5KGRldGFjaGVkKSwKICAgICBwb2xpY3lfKHBvbGljeSksCiAgICAgcHJpb3JpdHlfKHByaW9yaXR5KSwKLSAgICBzdGFja1NpemVfKHN0YWNrU2l6ZSksCi0gICAgZGV0YWNoZWRfKGRldGFjaGVkKSB7fQorICAgIHN0YWNrU2l6ZV8oc3RhY2tTaXplKSB7Cit9CiAKLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgUE9TSVggdGhyZWFkIHRvIHJ1biB0aGUgcnVubmFibGUgb2JqZWN0Ci0gICAqCi0gICAqIEBwYXJhbSBydW5uYWJsZSBBIHJ1bm5hYmxlIG9iamVjdAotICAgKi8KLSAgc2hhcmVkX3B0cjxUaHJlYWQ+IG5ld1RocmVhZChzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZSkgY29uc3QgewotICAgIHNoYXJlZF9wdHI8UHRocmVhZFRocmVhZD4gcmVzdWx0ID0gc2hhcmVkX3B0cjxQdGhyZWFkVGhyZWFkPihuZXcgUHRocmVhZFRocmVhZCh0b1B0aHJlYWRQb2xpY3kocG9saWN5XyksIHRvUHRocmVhZFByaW9yaXR5KHBvbGljeV8sIHByaW9yaXR5XyksIHN0YWNrU2l6ZV8sIGRldGFjaGVkXywgcnVubmFibGUpKTsKLSAgICByZXN1bHQtPndlYWtSZWYocmVzdWx0KTsKLSAgICBydW5uYWJsZS0+dGhyZWFkKHJlc3VsdCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQorUG9zaXhUaHJlYWRGYWN0b3J5OjpQb3NpeFRocmVhZEZhY3RvcnkoYm9vbCBkZXRhY2hlZCkKKyAgOiBUaHJlYWRGYWN0b3J5KGRldGFjaGVkKSwKKyAgICBwb2xpY3lfKFJPVU5EX1JPQklOKSwKKyAgICBwcmlvcml0eV8oTk9STUFMKSwKKyAgICBzdGFja1NpemVfKDEpIHsKK30KIAotICBpbnQgZ2V0U3RhY2tTaXplKCkgY29uc3QgeyByZXR1cm4gc3RhY2tTaXplXzsgfQorc3RkOjpzaGFyZWRfcHRyPFRocmVhZD4gUG9zaXhUaHJlYWRGYWN0b3J5OjpuZXdUaHJlYWQoc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZSkgY29uc3QgeworICBzdGQ6OnNoYXJlZF9wdHI8UHRocmVhZFRocmVhZD4gcmVzdWx0CisgICAgICA9IHN0ZDo6c2hhcmVkX3B0cjxQdGhyZWFkVGhyZWFkPihuZXcgUHRocmVhZFRocmVhZCh0b1B0aHJlYWRQb2xpY3kocG9saWN5XyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9QdGhyZWFkUHJpb3JpdHkocG9saWN5XywgcHJpb3JpdHlfKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFja1NpemVfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRGV0YWNoZWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5uYWJsZSkpOworICByZXN1bHQtPndlYWtSZWYocmVzdWx0KTsKKyAgcnVubmFibGUtPnRocmVhZChyZXN1bHQpOworICByZXR1cm4gcmVzdWx0OworfQogCi0gIHZvaWQgc2V0U3RhY2tTaXplKGludCB2YWx1ZSkgeyBzdGFja1NpemVfID0gdmFsdWU7IH0KK2ludCBQb3NpeFRocmVhZEZhY3Rvcnk6OmdldFN0YWNrU2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIHN0YWNrU2l6ZV87Cit9CiAKLSAgUFJJT1JJVFkgZ2V0UHJpb3JpdHkoKSBjb25zdCB7IHJldHVybiBwcmlvcml0eV87IH0KK3ZvaWQgUG9zaXhUaHJlYWRGYWN0b3J5OjpzZXRTdGFja1NpemUoaW50IHZhbHVlKSB7CisgIHN0YWNrU2l6ZV8gPSB2YWx1ZTsKK30KIAotICAvKioKLSAgICogU2V0cyBwcmlvcml0eS4KLSAgICoKLSAgICogIFhYWAotICAgKiAgTmVlZCB0byBoYW5kbGUgaW5jcmVtZW50YWwgcHJpb3JpdGllcyBwcm9wZXJseS4KLSAgICovCi0gIHZvaWQgc2V0UHJpb3JpdHkoUFJJT1JJVFkgdmFsdWUpIHsgcHJpb3JpdHlfID0gdmFsdWU7IH0KK1Bvc2l4VGhyZWFkRmFjdG9yeTo6UFJJT1JJVFkgUG9zaXhUaHJlYWRGYWN0b3J5OjpnZXRQcmlvcml0eSgpIGNvbnN0IHsKKyAgcmV0dXJuIHByaW9yaXR5XzsKK30KIAotICBib29sIGlzRGV0YWNoZWQoKSBjb25zdCB7IHJldHVybiBkZXRhY2hlZF87IH0KK3ZvaWQgUG9zaXhUaHJlYWRGYWN0b3J5OjpzZXRQcmlvcml0eShQUklPUklUWSB2YWx1ZSkgeworICBwcmlvcml0eV8gPSB2YWx1ZTsKK30KIAotICB2b2lkIHNldERldGFjaGVkKGJvb2wgdmFsdWUpIHsgZGV0YWNoZWRfID0gdmFsdWU7IH0KLQotICBUaHJlYWQ6OmlkX3QgZ2V0Q3VycmVudFRocmVhZElkKCkgY29uc3QgewotCitUaHJlYWQ6OmlkX3QgUG9zaXhUaHJlYWRGYWN0b3J5OjpnZXRDdXJyZW50VGhyZWFkSWQoKSBjb25zdCB7CiAjaWZuZGVmIF9XSU4zMgotICAgIHJldHVybiAoVGhyZWFkOjppZF90KXB0aHJlYWRfc2VsZigpOworICByZXR1cm4gKFRocmVhZDo6aWRfdClwdGhyZWFkX3NlbGYoKTsKICNlbHNlCi0gICAgcmV0dXJuIChUaHJlYWQ6OmlkX3QpcHRocmVhZF9zZWxmKCkucDsKKyAgcmV0dXJuIChUaHJlYWQ6OmlkX3QpcHRocmVhZF9zZWxmKCkucDsKICNlbmRpZiAvLyBfV0lOMzIKK30KIAotICB9Ci0KLX07Ci0KLVBvc2l4VGhyZWFkRmFjdG9yeTo6UG9zaXhUaHJlYWRGYWN0b3J5KFBPTElDWSBwb2xpY3ksIFBSSU9SSVRZIHByaW9yaXR5LCBpbnQgc3RhY2tTaXplLCBib29sIGRldGFjaGVkKSA6Ci0gIGltcGxfKG5ldyBQb3NpeFRocmVhZEZhY3Rvcnk6OkltcGwocG9saWN5LCBwcmlvcml0eSwgc3RhY2tTaXplLCBkZXRhY2hlZCkpIHt9Ci0KLXNoYXJlZF9wdHI8VGhyZWFkPiBQb3NpeFRocmVhZEZhY3Rvcnk6Om5ld1RocmVhZChzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZSkgY29uc3QgeyByZXR1cm4gaW1wbF8tPm5ld1RocmVhZChydW5uYWJsZSk7IH0KLQotaW50IFBvc2l4VGhyZWFkRmFjdG9yeTo6Z2V0U3RhY2tTaXplKCkgY29uc3QgeyByZXR1cm4gaW1wbF8tPmdldFN0YWNrU2l6ZSgpOyB9Ci0KLXZvaWQgUG9zaXhUaHJlYWRGYWN0b3J5OjpzZXRTdGFja1NpemUoaW50IHZhbHVlKSB7IGltcGxfLT5zZXRTdGFja1NpemUodmFsdWUpOyB9Ci0KLVBvc2l4VGhyZWFkRmFjdG9yeTo6UFJJT1JJVFkgUG9zaXhUaHJlYWRGYWN0b3J5OjpnZXRQcmlvcml0eSgpIGNvbnN0IHsgcmV0dXJuIGltcGxfLT5nZXRQcmlvcml0eSgpOyB9Ci0KLXZvaWQgUG9zaXhUaHJlYWRGYWN0b3J5OjpzZXRQcmlvcml0eShQb3NpeFRocmVhZEZhY3Rvcnk6OlBSSU9SSVRZIHZhbHVlKSB7IGltcGxfLT5zZXRQcmlvcml0eSh2YWx1ZSk7IH0KLQotYm9vbCBQb3NpeFRocmVhZEZhY3Rvcnk6OmlzRGV0YWNoZWQoKSBjb25zdCB7IHJldHVybiBpbXBsXy0+aXNEZXRhY2hlZCgpOyB9Ci0KLXZvaWQgUG9zaXhUaHJlYWRGYWN0b3J5OjpzZXREZXRhY2hlZChib29sIHZhbHVlKSB7IGltcGxfLT5zZXREZXRhY2hlZCh2YWx1ZSk7IH0KLQotVGhyZWFkOjppZF90IFBvc2l4VGhyZWFkRmFjdG9yeTo6Z2V0Q3VycmVudFRocmVhZElkKCkgY29uc3QgeyByZXR1cm4gaW1wbF8tPmdldEN1cnJlbnRUaHJlYWRJZCgpOyB9Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvUG9zaXhUaHJlYWRGYWN0b3J5LmggYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvUG9zaXhUaHJlYWRGYWN0b3J5LmgKaW5kZXggNzIzNjhjYS4uY2IzYjE3YyAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1Bvc2l4VGhyZWFkRmFjdG9yeS5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Qb3NpeFRocmVhZEZhY3RvcnkuaApAQCAtMjIsOSArMjIsMTEgQEAKIAogI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9UaHJlYWQuaD4KIAotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgorI2luY2x1ZGUgPG1lbW9yeT4KIAotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgY29uY3VycmVuY3kgeworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBjb25jdXJyZW5jeSB7CiAKIC8qKgogICogQSB0aHJlYWQgZmFjdG9yeSB0byBjcmVhdGUgcG9zaXggdGhyZWFkcwpAQCAtMzMsMjMgKzM1LDE4IEBACiAgKi8KIGNsYXNzIFBvc2l4VGhyZWFkRmFjdG9yeSA6IHB1YmxpYyBUaHJlYWRGYWN0b3J5IHsKIAotIHB1YmxpYzoKLQorcHVibGljOgogICAvKioKICAgICogUE9TSVggVGhyZWFkIHNjaGVkdWxlciBwb2xpY2llcwogICAgKi8KLSAgZW51bSBQT0xJQ1kgewotICAgIE9USEVSLAotICAgIEZJRk8sCi0gICAgUk9VTkRfUk9CSU4KLSAgfTsKKyAgZW51bSBQT0xJQ1kgeyBPVEhFUiwgRklGTywgUk9VTkRfUk9CSU4gfTsKIAogICAvKioKICAgICogUE9TSVggVGhyZWFkIHNjaGVkdWxlciByZWxhdGl2ZSBwcmlvcml0aWVzLAogICAgKgogICAgKiBBYnNvbHV0ZSBwcmlvcml0eSBpcyBkZXRlcm1pbmVkIGJ5IHNjaGVkdWxlciBwb2xpY3kgYW5kIE9TLiBUaGlzCiAgICAqIGVudW1lcmF0aW9uIHNwZWNpZmllcyByZWxhdGl2ZSBwcmlvcml0aWVzIHN1Y2ggdGhhdCBvbmUgY2FuIHNwZWNpZnkgYQotICAgKiBwcmlvcml0eSB3aXRoaW5nIGEgZ2l2aW5nIHNjaGVkdWxlciBwb2xpY3kgd2l0aG91dCBrbm93aW5nIHRoZSBhYnNvbHV0ZQorICAgKiBwcmlvcml0eSB3aXRoaW4gYSBnaXZpbmcgc2NoZWR1bGVyIHBvbGljeSB3aXRob3V0IGtub3dpbmcgdGhlIGFic29sdXRlCiAgICAqIHZhbHVlIG9mIHRoZSBwcmlvcml0eS4KICAgICovCiAgIGVudW0gUFJJT1JJVFkgewpAQCAtNjYsOSArNjMsOSBAQAogCiAgIC8qKgogICAgKiBQb3NpeCB0aHJlYWQgKHB0aHJlYWQpIGZhY3RvcnkuICBBbGwgdGhyZWFkcyBjcmVhdGVkIGJ5IGEgZmFjdG9yeSBhcmUgcmVmZXJlbmNlLWNvdW50ZWQKLSAgICogdmlhIGJvb3N0OjpzaGFyZWRfcHRyIGFuZCBib29zdDo6d2Vha19wdHIuICBUaGUgZmFjdG9yeSBndWFyYW50ZWVzIHRoYXQgdGhyZWFkcyBhbmQKLSAgICogdGhlIFJ1bm5hYmxlIHRhc2tzIHRoZXkgaG9zdCB3aWxsIGJlIHByb3Blcmx5IGNsZWFuZWQgdXAgb25jZSB0aGUgbGFzdCBzdHJvbmcgcmVmZXJlbmNlCi0gICAqIHRvIGJvdGggaXMgZ2l2ZW4gdXAuCisgICAqIHZpYSBzdGQ6OnNoYXJlZF9wdHIuICBUaGUgZmFjdG9yeSBndWFyYW50ZWVzIHRoYXQgdGhyZWFkcyBhbmQgdGhlIFJ1bm5hYmxlIHRhc2tzIAorICAgKiB0aGV5IGhvc3Qgd2lsbCBiZSBwcm9wZXJseSBjbGVhbmVkIHVwIG9uY2UgdGhlIGxhc3Qgc3Ryb25nIHJlZmVyZW5jZSB0byBib3RoIGlzCisgICAqIGdpdmVuIHVwLgogICAgKgogICAgKiBUaHJlYWRzIGFyZSBjcmVhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBwb2xpY3ksIHByaW9yaXR5LCBzdGFjay1zaXplIGFuZCBkZXRhY2hhYmxlLW1vZGUKICAgICogZGV0YWNoZWQgbWVhbnMgdGhlIHRocmVhZCBpcyBmcmVlLXJ1bm5pbmcgYW5kIHdpbGwgcmVsZWFzZSBhbGwgc3lzdGVtIHJlc291cmNlcyB0aGUKQEAgLTc3LDI0ICs3NCwzNCBAQAogICAgKgogICAgKiBCeSBkZWZhdWx0IHRocmVhZHMgYXJlIG5vdCBqb2luYWJsZS4KICAgICovCisgIFBvc2l4VGhyZWFkRmFjdG9yeShQT0xJQ1kgcG9saWN5ID0gUk9VTkRfUk9CSU4sCisgICAgICAgICAgICAgICAgICAgICBQUklPUklUWSBwcmlvcml0eSA9IE5PUk1BTCwKKyAgICAgICAgICAgICAgICAgICAgIGludCBzdGFja1NpemUgPSAxLAorICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZXRhY2hlZCA9IHRydWUpOwogCi0gIFBvc2l4VGhyZWFkRmFjdG9yeShQT0xJQ1kgcG9saWN5PVJPVU5EX1JPQklOLCBQUklPUklUWSBwcmlvcml0eT1OT1JNQUwsIGludCBzdGFja1NpemU9MSwgYm9vbCBkZXRhY2hlZD10cnVlKTsKKyAgLyoqCisgICAqIFByb3ZpZGUgYSBjb25zdHJ1Y3RvciBjb21wYXRpYmxlIHdpdGggdGhlIG90aGVyIGZhY3RvcmllcworICAgKiBUaGUgZGVmYXVsdCBwb2xpY3kgaXMgUE9MSUNZOjpST1VORF9ST0JJTi4KKyAgICogVGhlIGRlZmF1bHQgcHJpb3JpdHkgaXMgUFJJT1JJVFk6Ok5PUk1BTC4KKyAgICogVGhlIGRlZmF1bHQgc3RhY2tTaXplIGlzIDEuCisgICAqLworICBQb3NpeFRocmVhZEZhY3RvcnkoYm9vbCBkZXRhY2hlZCk7CiAKICAgLy8gRnJvbSBUaHJlYWRGYWN0b3J5OwotICBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWQ+IG5ld1RocmVhZChib29zdDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGUpIGNvbnN0OworICBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkPiBuZXdUaHJlYWQoc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZSkgY29uc3Q7CiAKICAgLy8gRnJvbSBUaHJlYWRGYWN0b3J5OwogICBUaHJlYWQ6OmlkX3QgZ2V0Q3VycmVudFRocmVhZElkKCkgY29uc3Q7CiAKICAgLyoqCi0gICAqIEdldHMgc3RhY2sgc2l6ZSBmb3IgY3JlYXRlZCB0aHJlYWRzCisgICAqIEdldHMgc3RhY2sgc2l6ZSBmb3IgbmV3bHkgY3JlYXRlZCB0aHJlYWRzCiAgICAqCiAgICAqIEByZXR1cm4gaW50IHNpemUgaW4gbWVnYWJ5dGVzCiAgICAqLwogICB2aXJ0dWFsIGludCBnZXRTdGFja1NpemUoKSBjb25zdDsKIAogICAvKioKLSAgICogU2V0cyBzdGFjayBzaXplIGZvciBjcmVhdGVkIHRocmVhZHMKKyAgICogU2V0cyBzdGFjayBzaXplIGZvciBuZXdseSBjcmVhdGVkIHRocmVhZHMKICAgICoKICAgICogQHBhcmFtIHZhbHVlIHNpemUgaW4gbWVnYWJ5dGVzCiAgICAqLwpAQCAtMTEwLDIxICsxMTcsMTMgQEAKICAgICovCiAgIHZpcnR1YWwgdm9pZCBzZXRQcmlvcml0eShQUklPUklUWSBwcmlvcml0eSk7CiAKLSAgLyoqCi0gICAqIFNldHMgZGV0YWNoZWQgbW9kZSBvZiB0aHJlYWRzCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgc2V0RGV0YWNoZWQoYm9vbCBkZXRhY2hlZCk7Ci0KLSAgLyoqCi0gICAqIEdldHMgY3VycmVudCBkZXRhY2hlZCBtb2RlCi0gICAqLwotICB2aXJ0dWFsIGJvb2wgaXNEZXRhY2hlZCgpIGNvbnN0OwotCi0gcHJpdmF0ZToKLSAgY2xhc3MgSW1wbDsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8SW1wbD4gaW1wbF87Citwcml2YXRlOgorICBQT0xJQ1kgcG9saWN5XzsKKyAgUFJJT1JJVFkgcHJpb3JpdHlfOworICBpbnQgc3RhY2tTaXplXzsKIH07Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5CiAKICNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfQ09OQ1VSUkVOQ1lfUE9TSVhUSFJFQURGQUNUT1JZX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvU3RkTW9uaXRvci5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvU3RkTW9uaXRvci5jcHAKaW5kZXggY2YyNTdlNi4uN2IzYjIwOSAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1N0ZE1vbml0b3IuY3BwCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9TdGRNb25pdG9yLmNwcApAQCAtMzAsNyArMzAsOSBAQAogI2luY2x1ZGUgPHRocmVhZD4KICNpbmNsdWRlIDxtdXRleD4KIAotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgY29uY3VycmVuY3kgeworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBjb25jdXJyZW5jeSB7CiAKIC8qKgogICogTW9uaXRvciBpbXBsZW1lbnRhdGlvbiB1c2luZyB0aGUgc3RkIHRocmVhZCBsaWJyYXJ5CkBAIC0zOSwyNiArNDEsMTIgQEAKICAqLwogY2xhc3MgTW9uaXRvcjo6SW1wbCB7CiAKLSBwdWJsaWM6CitwdWJsaWM6CisgIEltcGwoKSA6IG93bmVkTXV0ZXhfKG5ldyBNdXRleCgpKSwgY29uZGl0aW9uVmFyaWFibGVfKCksIG11dGV4XyhOVUxMKSB7IGluaXQob3duZWRNdXRleF8uZ2V0KCkpOyB9CiAKLSAgSW1wbCgpCi0gICAgIDogb3duZWRNdXRleF8obmV3IE11dGV4KCkpLAotICAgICAgIGNvbmRpdGlvblZhcmlhYmxlXygpLAotICAgICAgIG11dGV4XyhOVUxMKSB7Ci0gICAgaW5pdChvd25lZE11dGV4Xy5nZXQoKSk7Ci0gIH0KKyAgSW1wbChNdXRleCogbXV0ZXgpIDogb3duZWRNdXRleF8oKSwgY29uZGl0aW9uVmFyaWFibGVfKCksIG11dGV4XyhOVUxMKSB7IGluaXQobXV0ZXgpOyB9CiAKLSAgSW1wbChNdXRleCogbXV0ZXgpCi0gICAgIDogb3duZWRNdXRleF8oKSwKLSAgICAgICBjb25kaXRpb25WYXJpYWJsZV8oKSwKLSAgICAgICBtdXRleF8oTlVMTCkgewotICAgIGluaXQobXV0ZXgpOwotICB9Ci0KLSAgSW1wbChNb25pdG9yKiBtb25pdG9yKQotICAgICA6IG93bmVkTXV0ZXhfKCksCi0gICAgICAgY29uZGl0aW9uVmFyaWFibGVfKCksCi0gICAgICAgbXV0ZXhfKE5VTEwpIHsKKyAgSW1wbChNb25pdG9yKiBtb25pdG9yKSA6IG93bmVkTXV0ZXhfKCksIGNvbmRpdGlvblZhcmlhYmxlXygpLCBtdXRleF8oTlVMTCkgewogICAgIGluaXQoJihtb25pdG9yLT5tdXRleCgpKSk7CiAgIH0KIApAQCAtNzgsOCArNjYsNyBAQAogICAgIGlmIChyZXN1bHQgPT0gVEhSSUZUX0VUSU1FRE9VVCkgewogICAgICAgdGhyb3cgVGltZWRPdXRFeGNlcHRpb24oKTsKICAgICB9IGVsc2UgaWYgKHJlc3VsdCAhPSAwKSB7Ci0gICAgICB0aHJvdyBURXhjZXB0aW9uKAotICAgICAgICAiTW9uaXRvcjo6d2FpdCgpIGZhaWxlZCIpOworICAgICAgdGhyb3cgVEV4Y2VwdGlvbigiTW9uaXRvcjo6d2FpdCgpIGZhaWxlZCIpOwogICAgIH0KICAgfQogCkBAIC05NSwxMiArODIsMTIgQEAKICAgICB9CiAKICAgICBhc3NlcnQobXV0ZXhfKTsKLSAgICBzdGQ6OnRpbWVkX211dGV4KiBtdXRleEltcGwgPQotICAgICAgc3RhdGljX2Nhc3Q8c3RkOjp0aW1lZF9tdXRleCo+KG11dGV4Xy0+Z2V0VW5kZXJseWluZ0ltcGwoKSk7CisgICAgc3RkOjp0aW1lZF9tdXRleCogbXV0ZXhJbXBsID0gc3RhdGljX2Nhc3Q8c3RkOjp0aW1lZF9tdXRleCo+KG11dGV4Xy0+Z2V0VW5kZXJseWluZ0ltcGwoKSk7CiAgICAgYXNzZXJ0KG11dGV4SW1wbCk7CiAKICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6dGltZWRfbXV0ZXg+IGxvY2soKm11dGV4SW1wbCwgc3RkOjphZG9wdF9sb2NrKTsKLSAgICBib29sIHRpbWVkb3V0ID0gKGNvbmRpdGlvblZhcmlhYmxlXy53YWl0X2Zvcihsb2NrLCBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKHRpbWVvdXRfbXMpKSA9PSBzdGQ6OmN2X3N0YXR1czo6dGltZW91dCk7CisgICAgYm9vbCB0aW1lZG91dCA9IChjb25kaXRpb25WYXJpYWJsZV8ud2FpdF9mb3IobG9jaywgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyh0aW1lb3V0X21zKSkKKyAgICAgICAgICAgICAgICAgICAgID09IHN0ZDo6Y3Zfc3RhdHVzOjp0aW1lb3V0KTsKICAgICBsb2NrLnJlbGVhc2UoKTsKICAgICByZXR1cm4gKHRpbWVkb3V0ID8gVEhSSUZUX0VUSU1FRE9VVCA6IDApOwogICB9CkBAIC0xMTEsNyArOTgsNyBAQAogICAgKi8KICAgaW50IHdhaXRGb3JUaW1lKGNvbnN0IFRIUklGVF9USU1FU1BFQyogYWJzdGltZSkgewogICAgIHN0cnVjdCB0aW1ldmFsIHRlbXA7Ci0gICAgdGVtcC50dl9zZWMgID0gc3RhdGljX2Nhc3Q8bG9uZz4oYWJzdGltZS0+dHZfc2VjKTsKKyAgICB0ZW1wLnR2X3NlYyA9IHN0YXRpY19jYXN0PGxvbmc+KGFic3RpbWUtPnR2X3NlYyk7CiAgICAgdGVtcC50dl91c2VjID0gc3RhdGljX2Nhc3Q8bG9uZz4oYWJzdGltZS0+dHZfbnNlYykgLyAxMDAwOwogICAgIHJldHVybiB3YWl0Rm9yVGltZSgmdGVtcCk7CiAgIH0KQEAgLTEyMiwyNCArMTA5LDI0IEBACiAgICAqLwogICBpbnQgd2FpdEZvclRpbWUoY29uc3Qgc3RydWN0IHRpbWV2YWwqIGFic3RpbWUpIHsKICAgICBhc3NlcnQobXV0ZXhfKTsKLSAgICBzdGQ6OnRpbWVkX211dGV4KiBtdXRleEltcGwgPQotICAgICAgc3RhdGljX2Nhc3Q8c3RkOjp0aW1lZF9tdXRleCo+KG11dGV4Xy0+Z2V0VW5kZXJseWluZ0ltcGwoKSk7CisgICAgc3RkOjp0aW1lZF9tdXRleCogbXV0ZXhJbXBsID0gc3RhdGljX2Nhc3Q8c3RkOjp0aW1lZF9tdXRleCo+KG11dGV4Xy0+Z2V0VW5kZXJseWluZ0ltcGwoKSk7CiAgICAgYXNzZXJ0KG11dGV4SW1wbCk7CiAKICAgICBzdHJ1Y3QgdGltZXZhbCBjdXJyZW50dGltZTsKICAgICBVdGlsOjp0b1RpbWV2YWwoY3VycmVudHRpbWUsIFV0aWw6OmN1cnJlbnRUaW1lKCkpOwogCi0gICAgbG9uZyB0dl9zZWMgID0gc3RhdGljX2Nhc3Q8bG9uZz4oYWJzdGltZS0+dHZfc2VjICAtIGN1cnJlbnR0aW1lLnR2X3NlYyk7CisgICAgbG9uZyB0dl9zZWMgPSBzdGF0aWNfY2FzdDxsb25nPihhYnN0aW1lLT50dl9zZWMgLSBjdXJyZW50dGltZS50dl9zZWMpOwogICAgIGxvbmcgdHZfdXNlYyA9IHN0YXRpY19jYXN0PGxvbmc+KGFic3RpbWUtPnR2X3VzZWMgLSBjdXJyZW50dGltZS50dl91c2VjKTsKLSAgICBpZih0dl9zZWMgPCAwKQorICAgIGlmICh0dl9zZWMgPCAwKQogICAgICAgdHZfc2VjID0gMDsKLSAgICBpZih0dl91c2VjIDwgMCkKKyAgICBpZiAodHZfdXNlYyA8IDApCiAgICAgICB0dl91c2VjID0gMDsKIAogICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjp0aW1lZF9tdXRleD4gbG9jaygqbXV0ZXhJbXBsLCBzdGQ6OmFkb3B0X2xvY2spOwogICAgIGJvb2wgdGltZWRvdXQgPSAoY29uZGl0aW9uVmFyaWFibGVfLndhaXRfZm9yKGxvY2ssCi0gICAgICBzdGQ6OmNocm9ubzo6c2Vjb25kcyh0dl9zZWMpICsKLSAgICAgIHN0ZDo6Y2hyb25vOjptaWNyb3NlY29uZHModHZfdXNlYykpID09IHN0ZDo6Y3Zfc3RhdHVzOjp0aW1lb3V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmNocm9ubzo6c2Vjb25kcyh0dl9zZWMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzdGQ6OmNocm9ubzo6bWljcm9zZWNvbmRzKHR2X3VzZWMpKQorICAgICAgICAgICAgICAgICAgICAgPT0gc3RkOjpjdl9zdGF0dXM6OnRpbWVvdXQpOwogICAgIGxvY2sucmVsZWFzZSgpOwogICAgIHJldHVybiAodGltZWRvdXQgPyBUSFJJRlRfRVRJTUVET1VUIDogMCk7CiAgIH0KQEAgLTE1MCw4ICsxMzcsNyBAQAogICAgKi8KICAgaW50IHdhaXRGb3JldmVyKCkgewogICAgIGFzc2VydChtdXRleF8pOwotICAgIHN0ZDo6dGltZWRfbXV0ZXgqIG11dGV4SW1wbCA9Ci0gICAgICBzdGF0aWNfY2FzdDxzdGQ6OnRpbWVkX211dGV4Kj4obXV0ZXhfLT5nZXRVbmRlcmx5aW5nSW1wbCgpKTsKKyAgICBzdGQ6OnRpbWVkX211dGV4KiBtdXRleEltcGwgPSBzdGF0aWNfY2FzdDxzdGQ6OnRpbWVkX211dGV4Kj4obXV0ZXhfLT5nZXRVbmRlcmx5aW5nSW1wbCgpKTsKICAgICBhc3NlcnQobXV0ZXhJbXBsKTsKIAogICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjp0aW1lZF9tdXRleD4gbG9jaygqbXV0ZXhJbXBsLCBzdGQ6OmFkb3B0X2xvY2spOwpAQCAtMTYwLDM5ICsxNDYsNDQgQEAKICAgICByZXR1cm4gMDsKICAgfQogCisgIHZvaWQgbm90aWZ5KCkgeyBjb25kaXRpb25WYXJpYWJsZV8ubm90aWZ5X29uZSgpOyB9CiAKLSAgdm9pZCBub3RpZnkoKSB7Ci0gICAgY29uZGl0aW9uVmFyaWFibGVfLm5vdGlmeV9vbmUoKTsKLSAgfQorICB2b2lkIG5vdGlmeUFsbCgpIHsgY29uZGl0aW9uVmFyaWFibGVfLm5vdGlmeV9hbGwoKTsgfQogCi0gIHZvaWQgbm90aWZ5QWxsKCkgewotICAgIGNvbmRpdGlvblZhcmlhYmxlXy5ub3RpZnlfYWxsKCk7Ci0gIH0KLQotIHByaXZhdGU6Ci0KLSAgdm9pZCBpbml0KE11dGV4KiBtdXRleCkgewotICAgIG11dGV4XyA9IG11dGV4OwotICB9Citwcml2YXRlOgorICB2b2lkIGluaXQoTXV0ZXgqIG11dGV4KSB7IG11dGV4XyA9IG11dGV4OyB9CiAKICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPE11dGV4PiBvd25lZE11dGV4XzsKICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGVfYW55IGNvbmRpdGlvblZhcmlhYmxlXzsKICAgTXV0ZXgqIG11dGV4XzsKIH07CiAKLU1vbml0b3I6Ok1vbml0b3IoKSA6IGltcGxfKG5ldyBNb25pdG9yOjpJbXBsKCkpIHt9Ci1Nb25pdG9yOjpNb25pdG9yKE11dGV4KiBtdXRleCkgOiBpbXBsXyhuZXcgTW9uaXRvcjo6SW1wbChtdXRleCkpIHt9Ci1Nb25pdG9yOjpNb25pdG9yKE1vbml0b3IqIG1vbml0b3IpIDogaW1wbF8obmV3IE1vbml0b3I6OkltcGwobW9uaXRvcikpIHt9CitNb25pdG9yOjpNb25pdG9yKCkgOiBpbXBsXyhuZXcgTW9uaXRvcjo6SW1wbCgpKSB7Cit9CitNb25pdG9yOjpNb25pdG9yKE11dGV4KiBtdXRleCkgOiBpbXBsXyhuZXcgTW9uaXRvcjo6SW1wbChtdXRleCkpIHsKK30KK01vbml0b3I6Ok1vbml0b3IoTW9uaXRvciogbW9uaXRvcikgOiBpbXBsXyhuZXcgTW9uaXRvcjo6SW1wbChtb25pdG9yKSkgeworfQogCi1Nb25pdG9yOjp+TW9uaXRvcigpIHsgZGVsZXRlIGltcGxfOyB9CitNb25pdG9yOjp+TW9uaXRvcigpIHsKKyAgZGVsZXRlIGltcGxfOworfQogCi1NdXRleCYgTW9uaXRvcjo6bXV0ZXgoKSBjb25zdCB7IHJldHVybiBjb25zdF9jYXN0PE1vbml0b3I6OkltcGwqPihpbXBsXyktPm11dGV4KCk7IH0KK011dGV4JiBNb25pdG9yOjptdXRleCgpIGNvbnN0IHsKKyAgcmV0dXJuIGNvbnN0X2Nhc3Q8TW9uaXRvcjo6SW1wbCo+KGltcGxfKS0+bXV0ZXgoKTsKK30KIAotdm9pZCBNb25pdG9yOjpsb2NrKCkgY29uc3QgeyBjb25zdF9jYXN0PE1vbml0b3I6OkltcGwqPihpbXBsXyktPmxvY2soKTsgfQordm9pZCBNb25pdG9yOjpsb2NrKCkgY29uc3QgeworICBjb25zdF9jYXN0PE1vbml0b3I6OkltcGwqPihpbXBsXyktPmxvY2soKTsKK30KIAotdm9pZCBNb25pdG9yOjp1bmxvY2soKSBjb25zdCB7IGNvbnN0X2Nhc3Q8TW9uaXRvcjo6SW1wbCo+KGltcGxfKS0+dW5sb2NrKCk7IH0KK3ZvaWQgTW9uaXRvcjo6dW5sb2NrKCkgY29uc3QgeworICBjb25zdF9jYXN0PE1vbml0b3I6OkltcGwqPihpbXBsXyktPnVubG9jaygpOworfQogCi12b2lkIE1vbml0b3I6OndhaXQoaW50NjRfdCB0aW1lb3V0KSBjb25zdCB7IGNvbnN0X2Nhc3Q8TW9uaXRvcjo6SW1wbCo+KGltcGxfKS0+d2FpdCh0aW1lb3V0KTsgfQordm9pZCBNb25pdG9yOjp3YWl0KGludDY0X3QgdGltZW91dCkgY29uc3QgeworICBjb25zdF9jYXN0PE1vbml0b3I6OkltcGwqPihpbXBsXyktPndhaXQodGltZW91dCk7Cit9CiAKIGludCBNb25pdG9yOjp3YWl0Rm9yVGltZShjb25zdCBUSFJJRlRfVElNRVNQRUMqIGFic3RpbWUpIGNvbnN0IHsKICAgcmV0dXJuIGNvbnN0X2Nhc3Q8TW9uaXRvcjo6SW1wbCo+KGltcGxfKS0+d2FpdEZvclRpbWUoYWJzdGltZSk7CkBAIC0yMTAsOCArMjAxLDEzIEBACiAgIHJldHVybiBjb25zdF9jYXN0PE1vbml0b3I6OkltcGwqPihpbXBsXyktPndhaXRGb3JldmVyKCk7CiB9CiAKLXZvaWQgTW9uaXRvcjo6bm90aWZ5KCkgY29uc3QgeyBjb25zdF9jYXN0PE1vbml0b3I6OkltcGwqPihpbXBsXyktPm5vdGlmeSgpOyB9Cit2b2lkIE1vbml0b3I6Om5vdGlmeSgpIGNvbnN0IHsKKyAgY29uc3RfY2FzdDxNb25pdG9yOjpJbXBsKj4oaW1wbF8pLT5ub3RpZnkoKTsKK30KIAotdm9pZCBNb25pdG9yOjpub3RpZnlBbGwoKSBjb25zdCB7IGNvbnN0X2Nhc3Q8TW9uaXRvcjo6SW1wbCo+KGltcGxfKS0+bm90aWZ5QWxsKCk7IH0KLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQordm9pZCBNb25pdG9yOjpub3RpZnlBbGwoKSBjb25zdCB7CisgIGNvbnN0X2Nhc3Q8TW9uaXRvcjo6SW1wbCo+KGltcGxfKS0+bm90aWZ5QWxsKCk7Cit9Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1N0ZE11dGV4LmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9TdGRNdXRleC5jcHAKaW5kZXggMjhmODg5YS4uZTBmNzlmYSAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1N0ZE11dGV4LmNwcAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvU3RkTXV0ZXguY3BwCkBAIC0yNiwzMCArMjYsNDYgQEAKICNpbmNsdWRlIDxjaHJvbm8+CiAjaW5jbHVkZSA8bXV0ZXg+CiAKLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgY29uY3VycmVuY3kgewogCiAvKioKICAqIEltcGxlbWVudGF0aW9uIG9mIE11dGV4IGNsYXNzIHVzaW5nIEMrKzExIHN0ZDo6dGltZWRfbXV0ZXgKICAqCisgKiBNZXRob2RzIHRocm93IHN0ZDo6c3lzdGVtX2Vycm9yIG9uIGVycm9yLgorICoKICAqIEB2ZXJzaW9uICRJZDokCiAgKi8KLWNsYXNzIE11dGV4OjppbXBsIDogcHVibGljIHN0ZDo6dGltZWRfbXV0ZXggewotfTsKK2NsYXNzIE11dGV4OjppbXBsIDogcHVibGljIHN0ZDo6dGltZWRfbXV0ZXgge307CiAKLU11dGV4OjpNdXRleChJbml0aWFsaXplciBpbml0KSA6IGltcGxfKG5ldyBNdXRleDo6aW1wbCgpKSB7fQotCi12b2lkKiBNdXRleDo6Z2V0VW5kZXJseWluZ0ltcGwoKSBjb25zdCB7IHJldHVybiBpbXBsXy5nZXQoKTsgfQotCi12b2lkIE11dGV4Ojpsb2NrKCkgY29uc3QgeyBpbXBsXy0+bG9jaygpOyB9Ci0KLWJvb2wgTXV0ZXg6OnRyeWxvY2soKSBjb25zdCB7IHJldHVybiBpbXBsXy0+dHJ5X2xvY2soKTsgfQotCi1ib29sIE11dGV4Ojp0aW1lZGxvY2soaW50NjRfdCBtcykgY29uc3QgeyByZXR1cm4gaW1wbF8tPnRyeV9sb2NrX2ZvcihzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKG1zKSk7IH0KLQotdm9pZCBNdXRleDo6dW5sb2NrKCkgY29uc3QgeyBpbXBsXy0+dW5sb2NrKCk7IH0KLQotdm9pZCBNdXRleDo6REVGQVVMVF9JTklUSUFMSVpFUih2b2lkKiBhcmcpIHsKK011dGV4OjpNdXRleChJbml0aWFsaXplciBpbml0KSA6IGltcGxfKG5ldyBNdXRleDo6aW1wbCgpKSB7CisgICgodm9pZClpbml0KTsKIH0KIAotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQordm9pZCogTXV0ZXg6OmdldFVuZGVybHlpbmdJbXBsKCkgY29uc3QgeworICByZXR1cm4gaW1wbF8uZ2V0KCk7Cit9CiAKK3ZvaWQgTXV0ZXg6OmxvY2soKSBjb25zdCB7CisgIGltcGxfLT5sb2NrKCk7Cit9CisKK2Jvb2wgTXV0ZXg6OnRyeWxvY2soKSBjb25zdCB7CisgIHJldHVybiBpbXBsXy0+dHJ5X2xvY2soKTsKK30KKworYm9vbCBNdXRleDo6dGltZWRsb2NrKGludDY0X3QgbXMpIGNvbnN0IHsKKyAgcmV0dXJuIGltcGxfLT50cnlfbG9ja19mb3Ioc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyhtcykpOworfQorCit2b2lkIE11dGV4Ojp1bmxvY2soKSBjb25zdCB7CisgIGltcGxfLT51bmxvY2soKTsKK30KKwordm9pZCBNdXRleDo6REVGQVVMVF9JTklUSUFMSVpFUih2b2lkKiBhcmcpIHsKKyAgKCh2b2lkKWFyZyk7Cit9Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1N0ZFRocmVhZEZhY3RvcnkuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1N0ZFRocmVhZEZhY3RvcnkuY3BwCmluZGV4IDYwMTRiMzIuLmM4ODVmM2EgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9TdGRUaHJlYWRGYWN0b3J5LmNwcAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvU3RkVGhyZWFkRmFjdG9yeS5jcHAKQEAgLTE5LDE4ICsxOSwxOSBAQAogCiAjaW5jbHVkZSA8dGhyaWZ0L3RocmlmdC1jb25maWcuaD4KIAotI2lmZGVmIFVTRV9TVERfVEhSRUFECisjaWYgVVNFX1NURF9USFJFQUQKIAotI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9TdGRUaHJlYWRGYWN0b3J5Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L0V4Y2VwdGlvbi5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1N0ZFRocmVhZEZhY3RvcnkuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CiAKICNpbmNsdWRlIDxjYXNzZXJ0PgotCi0jaW5jbHVkZSA8Ym9vc3QvZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXMuaHBwPgotI2luY2x1ZGUgPGJvb3N0L3dlYWtfcHRyLmhwcD4KICNpbmNsdWRlIDx0aHJlYWQ+CiAKLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgY29uY3VycmVuY3kgewogCiAvKioKICAqIFRoZSBDKysxMSB0aHJlYWQgY2xhc3MuCkBAIC00MSw1NCArNDIsNzAgQEAKICAqCiAgKiBAdmVyc2lvbiAkSWQ6JAogICovCi1jbGFzcyBTdGRUaHJlYWQ6IHB1YmxpYyBUaHJlYWQsIHB1YmxpYyBib29zdDo6ZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXM8U3RkVGhyZWFkPiB7Ci0gcHVibGljOgorY2xhc3MgU3RkVGhyZWFkIDogcHVibGljIFRocmVhZCwgcHVibGljIHN0ZDo6ZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXM8U3RkVGhyZWFkPiB7CitwdWJsaWM6CisgIGVudW0gU1RBVEUgeyB1bmluaXRpYWxpemVkLCBzdGFydGluZywgc3RhcnRlZCwgc3RvcHBpbmcsIHN0b3BwZWQgfTsKIAotICBlbnVtIFNUQVRFIHsKLSAgICB1bmluaXRpYWxpemVkLAotICAgIHN0YXJ0aW5nLAotICAgIHN0YXJ0ZWQsCi0gICAgc3RvcHBpbmcsCi0gICAgc3RvcHBlZAotICB9OworICBzdGF0aWMgdm9pZCB0aHJlYWRNYWluKHN0ZDo6c2hhcmVkX3B0cjxTdGRUaHJlYWQ+IHRocmVhZCk7CiAKLSAgIHN0YXRpYyB2b2lkIHRocmVhZE1haW4oYm9vc3Q6OnNoYXJlZF9wdHI8U3RkVGhyZWFkPiB0aHJlYWQpOwotCi0gcHJpdmF0ZToKK3ByaXZhdGU6CiAgIHN0ZDo6dW5pcXVlX3B0cjxzdGQ6OnRocmVhZD4gdGhyZWFkXzsKKyAgTW9uaXRvciBtb25pdG9yXzsKICAgU1RBVEUgc3RhdGVfOwogICBib29sIGRldGFjaGVkXzsKIAotIHB1YmxpYzoKLQotICBTdGRUaHJlYWQoYm9vbCBkZXRhY2hlZCwgYm9vc3Q6OnNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlKSA6Ci0gICAgICBzdGF0ZV8odW5pbml0aWFsaXplZCksCi0gICAgICBkZXRhY2hlZF8oZGV0YWNoZWQpIHsKK3B1YmxpYzoKKyAgU3RkVGhyZWFkKGJvb2wgZGV0YWNoZWQsIHN0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGUpCisgICAgOiBzdGF0ZV8odW5pbml0aWFsaXplZCksIGRldGFjaGVkXyhkZXRhY2hlZCkgewogICAgIHRoaXMtPlRocmVhZDo6cnVubmFibGUocnVubmFibGUpOwogICB9CiAKICAgflN0ZFRocmVhZCgpIHsKLSAgICBpZighZGV0YWNoZWRfKSB7CisgICAgaWYgKCFkZXRhY2hlZF8gJiYgdGhyZWFkXy0+am9pbmFibGUoKSkgewogICAgICAgdHJ5IHsKICAgICAgICAgam9pbigpOwotICAgICAgfSBjYXRjaCguLi4pIHsKKyAgICAgIH0gY2F0Y2ggKC4uLikgewogICAgICAgICAvLyBXZSdyZSByZWFsbHkgaG9zZWQuCiAgICAgICB9CiAgICAgfQogICB9CiAKKyAgU1RBVEUgZ2V0U3RhdGUoKSBjb25zdAorICB7CisgICAgU3luY2hyb25pemVkIHN5bmMobW9uaXRvcl8pOworICAgIHJldHVybiBzdGF0ZV87CisgIH0KKworICB2b2lkIHNldFN0YXRlKFNUQVRFIG5ld1N0YXRlKQorICB7CisgICAgU3luY2hyb25pemVkIHN5bmMobW9uaXRvcl8pOworICAgIHN0YXRlXyA9IG5ld1N0YXRlOworCisgICAgLy8gdW5ibG9jayBzdGFydCgpIHdpdGggdGhlIGtub3dsZWRnZSB0aGF0IHRoZSB0aHJlYWQgaGFzIGFjdHVhbGx5CisgICAgLy8gc3RhcnRlZCBydW5uaW5nLCB3aGljaCBhdm9pZHMgYSByYWNlIGluIGRldGFjaGVkIHRocmVhZHMuCisgICAgaWYgKG5ld1N0YXRlID09IHN0YXJ0ZWQpIHsKKwkgIG1vbml0b3JfLm5vdGlmeSgpOworICAgIH0KKyAgfQorCiAgIHZvaWQgc3RhcnQoKSB7Ci0gICAgaWYgKHN0YXRlXyAhPSB1bmluaXRpYWxpemVkKSB7CisgICAgaWYgKGdldFN0YXRlKCkgIT0gdW5pbml0aWFsaXplZCkgewogICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFN0ZFRocmVhZD4gc2VsZlJlZiA9IHNoYXJlZF9mcm9tX3RoaXMoKTsKLSAgICBzdGF0ZV8gPSBzdGFydGluZzsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8U3RkVGhyZWFkPiBzZWxmUmVmID0gc2hhcmVkX2Zyb21fdGhpcygpOworICAgIHNldFN0YXRlKHN0YXJ0aW5nKTsKIAorICAgIFN5bmNocm9uaXplZCBzeW5jKG1vbml0b3JfKTsKICAgICB0aHJlYWRfID0gc3RkOjp1bmlxdWVfcHRyPHN0ZDo6dGhyZWFkPihuZXcgc3RkOjp0aHJlYWQodGhyZWFkTWFpbiwgc2VsZlJlZikpOwogCi0gICAgaWYoZGV0YWNoZWRfKQorICAgIGlmIChkZXRhY2hlZF8pCiAgICAgICB0aHJlYWRfLT5kZXRhY2goKTsKKyAgICAKKyAgICAvLyBXYWl0IGZvciB0aGUgdGhyZWFkIHRvIHN0YXJ0IGFuZCBnZXQgZmFyIGVub3VnaCB0byBncmFiIGV2ZXJ5dGhpbmcKKyAgICAvLyB0aGF0IGl0IG5lZWRzIGZyb20gdGhlIGNhbGxpbmcgY29udGV4dCwgdGh1cyBhYnNvbHZpbmcgdGhlIGNhbGxlcgorICAgIC8vIGZyb20gYmVpbmcgcmVxdWlyZWQgdG8gaG9sZCBvbiB0byBydW5uYWJsZSBpbmRlZmluaXRlbHkuCisgICAgbW9uaXRvcl8ud2FpdCgpOwogICB9CiAKICAgdm9pZCBqb2luKCkgewpAQCAtOTcsNzkgKzExNCw0MCBAQAogICAgIH0KICAgfQogCi0gIFRocmVhZDo6aWRfdCBnZXRJZCgpIHsKLSAgICByZXR1cm4gdGhyZWFkXy5nZXQoKSA/IHRocmVhZF8tPmdldF9pZCgpIDogc3RkOjp0aHJlYWQ6OmlkKCk7Ci0gIH0KKyAgVGhyZWFkOjppZF90IGdldElkKCkgeyByZXR1cm4gdGhyZWFkXy5nZXQoKSA/IHRocmVhZF8tPmdldF9pZCgpIDogc3RkOjp0aHJlYWQ6OmlkKCk7IH0KIAotICBib29zdDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGUoKSBjb25zdCB7IHJldHVybiBUaHJlYWQ6OnJ1bm5hYmxlKCk7IH0KKyAgc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZSgpIGNvbnN0IHsgcmV0dXJuIFRocmVhZDo6cnVubmFibGUoKTsgfQogCi0gIHZvaWQgcnVubmFibGUoYm9vc3Q6OnNoYXJlZF9wdHI8UnVubmFibGU+IHZhbHVlKSB7IFRocmVhZDo6cnVubmFibGUodmFsdWUpOyB9CisgIHZvaWQgcnVubmFibGUoc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB2YWx1ZSkgeyBUaHJlYWQ6OnJ1bm5hYmxlKHZhbHVlKTsgfQogfTsKIAotdm9pZCBTdGRUaHJlYWQ6OnRocmVhZE1haW4oYm9vc3Q6OnNoYXJlZF9wdHI8U3RkVGhyZWFkPiB0aHJlYWQpIHsKLSAgaWYgKHRocmVhZCA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuOwotICB9Cit2b2lkIFN0ZFRocmVhZDo6dGhyZWFkTWFpbihzdGQ6OnNoYXJlZF9wdHI8U3RkVGhyZWFkPiB0aHJlYWQpIHsKKyNpZiBHT09HTEVfUEVSRlRPT0xTX1JFR0lTVEVSX1RIUkVBRAorICBQcm9maWxlclJlZ2lzdGVyVGhyZWFkKCk7CisjZW5kaWYKIAotICBpZiAodGhyZWFkLT5zdGF0ZV8gIT0gc3RhcnRpbmcpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICB0aHJlYWQtPnN0YXRlXyA9IHN0YXJ0ZWQ7CisgIHRocmVhZC0+c2V0U3RhdGUoc3RhcnRlZCk7CiAgIHRocmVhZC0+cnVubmFibGUoKS0+cnVuKCk7CiAKLSAgaWYgKHRocmVhZC0+c3RhdGVfICE9IHN0b3BwaW5nICYmIHRocmVhZC0+c3RhdGVfICE9IHN0b3BwZWQpIHsKLSAgICB0aHJlYWQtPnN0YXRlXyA9IHN0b3BwaW5nOworICBpZiAodGhyZWFkLT5nZXRTdGF0ZSgpICE9IHN0b3BwaW5nICYmIHRocmVhZC0+Z2V0U3RhdGUoKSAhPSBzdG9wcGVkKSB7CisgICAgdGhyZWFkLT5zZXRTdGF0ZShzdG9wcGluZyk7CiAgIH0KLQotICByZXR1cm47CiB9CiAKLS8qKgotICogc3RkOjp0aHJlYWQgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbgotICovCi1jbGFzcyBTdGRUaHJlYWRGYWN0b3J5OjpJbXBsIHsKK1N0ZFRocmVhZEZhY3Rvcnk6OlN0ZFRocmVhZEZhY3RvcnkoYm9vbCBkZXRhY2hlZCkgOiBUaHJlYWRGYWN0b3J5KGRldGFjaGVkKSB7Cit9CiAKLSBwcml2YXRlOgotICBib29sIGRldGFjaGVkXzsKK3N0ZDo6c2hhcmVkX3B0cjxUaHJlYWQ+IFN0ZFRocmVhZEZhY3Rvcnk6Om5ld1RocmVhZChzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlKSBjb25zdCB7CisgIHN0ZDo6c2hhcmVkX3B0cjxTdGRUaHJlYWQ+IHJlc3VsdCA9IHN0ZDo6c2hhcmVkX3B0cjxTdGRUaHJlYWQ+KG5ldyBTdGRUaHJlYWQoaXNEZXRhY2hlZCgpLCBydW5uYWJsZSkpOworICBydW5uYWJsZS0+dGhyZWFkKHJlc3VsdCk7CisgIHJldHVybiByZXN1bHQ7Cit9CiAKLSBwdWJsaWM6Ci0KLSAgSW1wbChib29sIGRldGFjaGVkKSA6Ci0gICAgZGV0YWNoZWRfKGRldGFjaGVkKSB7fQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IHN0ZDo6dGhyZWFkIHRvIHJ1biB0aGUgcnVubmFibGUgb2JqZWN0Ci0gICAqCi0gICAqIEBwYXJhbSBydW5uYWJsZSBBIHJ1bm5hYmxlIG9iamVjdAotICAgKi8KLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkPiBuZXdUaHJlYWQoYm9vc3Q6OnNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlKSBjb25zdCB7Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8U3RkVGhyZWFkPiByZXN1bHQgPSBib29zdDo6c2hhcmVkX3B0cjxTdGRUaHJlYWQ+KG5ldyBTdGRUaHJlYWQoZGV0YWNoZWRfLCBydW5uYWJsZSkpOwotICAgIHJ1bm5hYmxlLT50aHJlYWQocmVzdWx0KTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgYm9vbCBpc0RldGFjaGVkKCkgY29uc3QgeyByZXR1cm4gZGV0YWNoZWRfOyB9Ci0KLSAgdm9pZCBzZXREZXRhY2hlZChib29sIHZhbHVlKSB7IGRldGFjaGVkXyA9IHZhbHVlOyB9Ci0KLSAgVGhyZWFkOjppZF90IGdldEN1cnJlbnRUaHJlYWRJZCgpIGNvbnN0IHsKLSAgICByZXR1cm4gc3RkOjp0aGlzX3RocmVhZDo6Z2V0X2lkKCk7Ci0gIH0KLQotfTsKLQotU3RkVGhyZWFkRmFjdG9yeTo6U3RkVGhyZWFkRmFjdG9yeShib29sIGRldGFjaGVkKSA6Ci0gIGltcGxfKG5ldyBTdGRUaHJlYWRGYWN0b3J5OjpJbXBsKGRldGFjaGVkKSkge30KLQotYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkPiBTdGRUaHJlYWRGYWN0b3J5OjpuZXdUaHJlYWQoYm9vc3Q6OnNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlKSBjb25zdCB7IHJldHVybiBpbXBsXy0+bmV3VGhyZWFkKHJ1bm5hYmxlKTsgfQotCi1ib29sIFN0ZFRocmVhZEZhY3Rvcnk6OmlzRGV0YWNoZWQoKSBjb25zdCB7IHJldHVybiBpbXBsXy0+aXNEZXRhY2hlZCgpOyB9Ci0KLXZvaWQgU3RkVGhyZWFkRmFjdG9yeTo6c2V0RGV0YWNoZWQoYm9vbCB2YWx1ZSkgeyBpbXBsXy0+c2V0RGV0YWNoZWQodmFsdWUpOyB9Ci0KLVRocmVhZDo6aWRfdCBTdGRUaHJlYWRGYWN0b3J5OjpnZXRDdXJyZW50VGhyZWFkSWQoKSBjb25zdCB7IHJldHVybiBpbXBsXy0+Z2V0Q3VycmVudFRocmVhZElkKCk7IH0KLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQorVGhyZWFkOjppZF90IFN0ZFRocmVhZEZhY3Rvcnk6OmdldEN1cnJlbnRUaHJlYWRJZCgpIGNvbnN0IHsKKyAgcmV0dXJuIHN0ZDo6dGhpc190aHJlYWQ6OmdldF9pZCgpOworfQorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKIAogI2VuZGlmIC8vIFVTRV9TVERfVEhSRUFECmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvU3RkVGhyZWFkRmFjdG9yeS5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1N0ZFRocmVhZEZhY3RvcnkuaAppbmRleCAzMDdmOTcwLi5lNzQwNDZiIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvU3RkVGhyZWFkRmFjdG9yeS5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9TdGRUaHJlYWRGYWN0b3J5LmgKQEAgLTIyLDkgKzIyLDExIEBACiAKICNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkLmg+CiAKLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KKyNpbmNsdWRlIDxtZW1vcnk+CiAKLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgY29uY3VycmVuY3kgewogCiAvKioKICAqIEEgdGhyZWFkIGZhY3RvcnkgdG8gY3JlYXRlIHN0ZDo6dGhyZWFkcy4KQEAgLTMzLDQwICszNSwyNyBAQAogICovCiBjbGFzcyBTdGRUaHJlYWRGYWN0b3J5IDogcHVibGljIFRocmVhZEZhY3RvcnkgewogCi0gcHVibGljOgotCitwdWJsaWM6CiAgIC8qKgogICAgKiBTdGQgdGhyZWFkIGZhY3RvcnkuICBBbGwgdGhyZWFkcyBjcmVhdGVkIGJ5IGEgZmFjdG9yeSBhcmUgcmVmZXJlbmNlLWNvdW50ZWQKLSAgICogdmlhIGJvb3N0OjpzaGFyZWRfcHRyIGFuZCBib29zdDo6d2Vha19wdHIuICBUaGUgZmFjdG9yeSBndWFyYW50ZWVzIHRoYXQgdGhyZWFkcyBhbmQKLSAgICogdGhlIFJ1bm5hYmxlIHRhc2tzIHRoZXkgaG9zdCB3aWxsIGJlIHByb3Blcmx5IGNsZWFuZWQgdXAgb25jZSB0aGUgbGFzdCBzdHJvbmcgcmVmZXJlbmNlCisgICAqIHZpYSBzdGQ6OnNoYXJlZF9wdHIuICBUaGUgZmFjdG9yeSBndWFyYW50ZWVzIHRoYXQgdGhyZWFkcyBhbmQgdGhlIFJ1bm5hYmxlIHRhc2tzCisgICAqIHRoZXkgaG9zdCB3aWxsIGJlIHByb3Blcmx5IGNsZWFuZWQgdXAgb25jZSB0aGUgbGFzdCBzdHJvbmcgcmVmZXJlbmNlCiAgICAqIHRvIGJvdGggaXMgZ2l2ZW4gdXAuCiAgICAqCiAgICAqIEJ5IGRlZmF1bHQgdGhyZWFkcyBhcmUgbm90IGpvaW5hYmxlLgogICAgKi8KIAotICBTdGRUaHJlYWRGYWN0b3J5KGJvb2wgZGV0YWNoZWQ9dHJ1ZSk7CisgIFN0ZFRocmVhZEZhY3RvcnkoYm9vbCBkZXRhY2hlZCA9IHRydWUpOwogCiAgIC8vIEZyb20gVGhyZWFkRmFjdG9yeTsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkPiBuZXdUaHJlYWQoYm9vc3Q6OnNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlKSBjb25zdDsKKyAgc3RkOjpzaGFyZWRfcHRyPFRocmVhZD4gbmV3VGhyZWFkKHN0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGUpIGNvbnN0OwogCiAgIC8vIEZyb20gVGhyZWFkRmFjdG9yeTsKICAgVGhyZWFkOjppZF90IGdldEN1cnJlbnRUaHJlYWRJZCgpIGNvbnN0OwotCi0gIC8qKgotICAgKiBTZXRzIGRldGFjaGVkIG1vZGUgb2YgdGhyZWFkcwotICAgKi8KLSAgdmlydHVhbCB2b2lkIHNldERldGFjaGVkKGJvb2wgZGV0YWNoZWQpOwotCi0gIC8qKgotICAgKiBHZXRzIGN1cnJlbnQgZGV0YWNoZWQgbW9kZQotICAgKi8KLSAgdmlydHVhbCBib29sIGlzRGV0YWNoZWQoKSBjb25zdDsKLQotcHJpdmF0ZToKLSAgY2xhc3MgSW1wbDsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8SW1wbD4gaW1wbF87CiB9OwogCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQogCiAjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX1NURFRIUkVBREZBQ1RPUllfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9UaHJlYWQuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9UaHJlYWQuaApvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IDcwMTI5MzMuLmIyZWE0ZTIKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZC5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9UaHJlYWQuaApAQCAtMjEsMjIgKzIxLDIxIEBACiAjZGVmaW5lIF9USFJJRlRfQ09OQ1VSUkVOQ1lfVEhSRUFEX0hfIDEKIAogI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgotI2luY2x1ZGUgPGJvb3N0L3dlYWtfcHRyLmhwcD4KKyNpbmNsdWRlIDxtZW1vcnk+CiAKICNpbmNsdWRlIDx0aHJpZnQvdGhyaWZ0LWNvbmZpZy5oPgogCi0jaWYgVVNFX0JPT1NUX1RIUkVBRAotIyAgaW5jbHVkZSA8Ym9vc3QvdGhyZWFkLmhwcD4KLSNlbGlmIFVTRV9TVERfVEhSRUFECi0jICBpbmNsdWRlIDx0aHJlYWQ+CisjaWYgVVNFX1NURF9USFJFQUQKKyNpbmNsdWRlIDx0aHJlYWQ+CiAjZWxzZQotIyAgaWZkZWYgSEFWRV9QVEhSRUFEX0gKLSMgICAgaW5jbHVkZSA8cHRocmVhZC5oPgotIyAgZW5kaWYKKyNpZmRlZiBIQVZFX1BUSFJFQURfSAorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNlbmRpZgogI2VuZGlmCiAKLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgY29uY3VycmVuY3kgewogCiBjbGFzcyBUaHJlYWQ7CiAKQEAgLTQ3LDI0ICs0NiwyNCBAQAogICovCiBjbGFzcyBSdW5uYWJsZSB7CiAKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgflJ1bm5hYmxlKCkge307CitwdWJsaWM6CisgIHZpcnR1YWwgflJ1bm5hYmxlKCl7fTsKICAgdmlydHVhbCB2b2lkIHJ1bigpID0gMDsKIAogICAvKioKICAgICogR2V0cyB0aGUgdGhyZWFkIG9iamVjdCB0aGF0IGlzIGhvc3RpbmcgdGhpcyBydW5uYWJsZSBvYmplY3QgIC0gY2FuIHJldHVybgotICAgKiBhbiBlbXB0eSBib29zdDo6c2hhcmVkIHBvaW50ZXIgaWYgbm8gcmVmZXJlbmNlcyByZW1haW4gb24gdGhldCB0aHJlYWQgIG9iamVjdAorICAgKiBhbiBlbXB0eSBib29zdDo6c2hhcmVkIHBvaW50ZXIgaWYgbm8gcmVmZXJlbmNlcyByZW1haW4gb24gdGhhdCB0aHJlYWQgb2JqZWN0CiAgICAqLwotICB2aXJ0dWFsIGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZD4gdGhyZWFkKCkgeyByZXR1cm4gdGhyZWFkXy5sb2NrKCk7IH0KKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkPiB0aHJlYWQoKSB7IHJldHVybiB0aHJlYWRfLmxvY2soKTsgfQogCiAgIC8qKgogICAgKiBTZXRzIHRoZSB0aHJlYWQgdGhhdCBpcyBleGVjdXRpbmcgdGhpcyBvYmplY3QuICBUaGlzIGlzIG9ubHkgbWVhbnQgZm9yCiAgICAqIHVzZSBieSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbnMgb2YgVGhyZWFkLgogICAgKi8KLSAgdmlydHVhbCB2b2lkIHRocmVhZChib29zdDo6c2hhcmVkX3B0cjxUaHJlYWQ+IHZhbHVlKSB7IHRocmVhZF8gPSB2YWx1ZTsgfQorICB2aXJ0dWFsIHZvaWQgdGhyZWFkKHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWQ+IHZhbHVlKSB7IHRocmVhZF8gPSB2YWx1ZTsgfQogCi0gcHJpdmF0ZToKLSAgYm9vc3Q6OndlYWtfcHRyPFRocmVhZD4gdGhyZWFkXzsKK3ByaXZhdGU6CisgIHN0ZDo6d2Vha19wdHI8VGhyZWFkPiB0aHJlYWRfOwogfTsKIAogLyoqCkBAIC03OCwxNCArNzcsOCBAQAogICovCiBjbGFzcyBUaHJlYWQgewogCi0gcHVibGljOgotCi0jaWYgVVNFX0JPT1NUX1RIUkVBRAotICB0eXBlZGVmIGJvb3N0Ojp0aHJlYWQ6OmlkIGlkX3Q7Ci0KLSAgc3RhdGljIGlubGluZSBib29sIGlzX2N1cnJlbnQoaWRfdCB0KSB7IHJldHVybiB0ID09IGJvb3N0Ojp0aGlzX3RocmVhZDo6Z2V0X2lkKCk7IH0KLSAgc3RhdGljIGlubGluZSBpZF90IGdldF9jdXJyZW50KCkgeyByZXR1cm4gYm9vc3Q6OnRoaXNfdGhyZWFkOjpnZXRfaWQoKTsgfQotI2VsaWYgVVNFX1NURF9USFJFQUQKK3B1YmxpYzoKKyNpZiBVU0VfU1REX1RIUkVBRAogICB0eXBlZGVmIHN0ZDo6dGhyZWFkOjppZCBpZF90OwogCiAgIHN0YXRpYyBpbmxpbmUgYm9vbCBpc19jdXJyZW50KGlkX3QgdCkgeyByZXR1cm4gdCA9PSBzdGQ6OnRoaXNfdGhyZWFkOjpnZXRfaWQoKTsgfQpAQCAtOTcsNyArOTAsNyBAQAogICBzdGF0aWMgaW5saW5lIGlkX3QgZ2V0X2N1cnJlbnQoKSB7IHJldHVybiBwdGhyZWFkX3NlbGYoKTsgfQogI2VuZGlmCiAKLSAgdmlydHVhbCB+VGhyZWFkKCkge307CisgIHZpcnR1YWwgflRocmVhZCgpe307CiAKICAgLyoqCiAgICAqIFN0YXJ0cyB0aGUgdGhyZWFkLiBEb2VzIHBsYXRmb3JtIHNwZWNpZmljIHRocmVhZCBjcmVhdGlvbiBhbmQKQEAgLTEwNyw4ICsxMDAsOSBAQAogICB2aXJ0dWFsIHZvaWQgc3RhcnQoKSA9IDA7CiAKICAgLyoqCi0gICAqIEpvaW4gdGhpcyB0aHJlYWQuIEN1cnJlbnQgdGhyZWFkIGJsb2NrcyB1bnRpbCB0aGlzIHRhcmdldCB0aHJlYWQKLSAgICogY29tcGxldGVzLgorICAgKiBKb2luIHRoaXMgdGhyZWFkLiBJZiB0aGlzIHRocmVhZCBpcyBqb2luYWJsZSwgdGhlIGNhbGxpbmcgdGhyZWFkIGJsb2NrcworICAgKiB1bnRpbCB0aGlzIHRocmVhZCBjb21wbGV0ZXMuICBJZiB0aGUgdGFyZ2V0IHRocmVhZCBpcyBub3Qgam9pbmFibGUsIHRoZW4KKyAgICogbm90aGluZyBoYXBwZW5zLgogICAgKi8KICAgdmlydHVhbCB2b2lkIGpvaW4oKSA9IDA7CiAKQEAgLTEyMCwxNCArMTE0LDEzIEBACiAgIC8qKgogICAgKiBHZXRzIHRoZSBydW5uYWJsZSBvYmplY3QgdGhpcyB0aHJlYWQgaXMgaG9zdGluZwogICAgKi8KLSAgdmlydHVhbCBib29zdDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGUoKSBjb25zdCB7IHJldHVybiBfcnVubmFibGU7IH0KKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlKCkgY29uc3QgeyByZXR1cm4gX3J1bm5hYmxlOyB9CiAKLSBwcm90ZWN0ZWQ6Ci0gIHZpcnR1YWwgdm9pZCBydW5uYWJsZShib29zdDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gdmFsdWUpIHsgX3J1bm5hYmxlID0gdmFsdWU7IH0KK3Byb3RlY3RlZDoKKyAgdmlydHVhbCB2b2lkIHJ1bm5hYmxlKHN0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gdmFsdWUpIHsgX3J1bm5hYmxlID0gdmFsdWU7IH0KIAotIHByaXZhdGU6Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiBfcnVubmFibGU7Ci0KK3ByaXZhdGU6CisgIHN0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gX3J1bm5hYmxlOwogfTsKIAogLyoqCkBAIC0xMzUsMTggKzEyOCw0MyBAQAogICogb2JqZWN0IGZvciBleGVjdXRpb24KICAqLwogY2xhc3MgVGhyZWFkRmFjdG9yeSB7Citwcm90ZWN0ZWQ6CisgIFRocmVhZEZhY3RvcnkoYm9vbCBkZXRhY2hlZCkgOiBkZXRhY2hlZF8oZGV0YWNoZWQpIHsgfQogCi0gcHVibGljOgotICB2aXJ0dWFsIH5UaHJlYWRGYWN0b3J5KCkge30KLSAgdmlydHVhbCBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWQ+IG5ld1RocmVhZChib29zdDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGUpIGNvbnN0ID0gMDsKK3B1YmxpYzoKKyAgdmlydHVhbCB+VGhyZWFkRmFjdG9yeSgpIHsgfQogCi0gIC8qKiBHZXRzIHRoZSBjdXJyZW50IHRocmVhZCBpZCBvciB1bmtub3duX3RocmVhZF9pZCBpZiB0aGUgY3VycmVudCB0aHJlYWQgaXMgbm90IGEgdGhyaWZ0IHRocmVhZCAqLworICAvKioKKyAgICogR2V0cyBjdXJyZW50IGRldGFjaGVkIG1vZGUKKyAgICovCisgIGJvb2wgaXNEZXRhY2hlZCgpIGNvbnN0IHsgcmV0dXJuIGRldGFjaGVkXzsgfQogCisgIC8qKgorICAgKiBTZXRzIHRoZSBkZXRhY2hlZCBkaXNwb3NpdGlvbiBvZiBuZXdseSBjcmVhdGVkIHRocmVhZHMuCisgICAqLworICB2b2lkIHNldERldGFjaGVkKGJvb2wgZGV0YWNoZWQpIHsgZGV0YWNoZWRfID0gZGV0YWNoZWQ7IH0KKworICAvKioKKyAgICogQ3JlYXRlIGEgbmV3IHRocmVhZC4KKyAgICovCisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRocmVhZD4gbmV3VGhyZWFkKHN0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGUpIGNvbnN0ID0gMDsKKworICAvKioKKyAgICogR2V0cyB0aGUgY3VycmVudCB0aHJlYWQgaWQgb3IgdW5rbm93bl90aHJlYWRfaWQgaWYgdGhlIGN1cnJlbnQgdGhyZWFkIGlzIG5vdCBhIHRocmlmdCB0aHJlYWQKKyAgICovCisgIHZpcnR1YWwgVGhyZWFkOjppZF90IGdldEN1cnJlbnRUaHJlYWRJZCgpIGNvbnN0ID0gMDsKKworICAvKioKKyAgICogRm9yIGNvZGUgcmVhZGFiaWxpdHkgZGVmaW5lIHRoZSB1bmtub3duL3VuZGVmaW5lZCB0aHJlYWQgaWQKKyAgICovCiAgIHN0YXRpYyBjb25zdCBUaHJlYWQ6OmlkX3QgdW5rbm93bl90aHJlYWRfaWQ7CiAKLSAgdmlydHVhbCBUaHJlYWQ6OmlkX3QgZ2V0Q3VycmVudFRocmVhZElkKCkgY29uc3QgPSAwOworcHJpdmF0ZToKKyAgYm9vbCBkZXRhY2hlZF87CiB9OwogCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQogCiAjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX1RIUkVBRF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXIuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXIuY3BwCmluZGV4IDIwNGQ1ZGMuLjU4MDI1ZjkgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyLmNwcAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5jcHAKQEAgLTI0LDIwICsyNCwxOCBAQAogI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1V0aWwuaD4KIAotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgorI2luY2x1ZGUgPG1lbW9yeT4KIAotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHF1ZXVlPgorI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKyNpbmNsdWRlIDxkZXF1ZT4KICNpbmNsdWRlIDxzZXQ+CiAKLSNpZiBkZWZpbmVkKERFQlVHKQotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2VuZGlmIC8vZGVmaW5lZChERUJVRykKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgY29uY3VycmVuY3kgewogCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBjb25jdXJyZW5jeSB7Ci0KLXVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOwotdXNpbmcgYm9vc3Q6OmR5bmFtaWNfcG9pbnRlcl9jYXN0OwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOwordXNpbmcgc3RkOjpkeW5hbWljX3BvaW50ZXJfY2FzdDsKIAogLyoqCiAgKiBUaHJlYWRNYW5hZ2VyIGNsYXNzCkBAIC00Nyw0MCArNDUsNDIgQEAKICAqIGl0IG1haW50YWlucyBzdGF0aXN0aWNzIG9uIG51bWJlciBvZiBpZGxlIHRocmVhZHMsIG51bWJlciBvZiBhY3RpdmUgdGhyZWFkcywKICAqIHRhc2sgYmFja2xvZywgYW5kIGF2ZXJhZ2Ugd2FpdCBhbmQgc2VydmljZSB0aW1lcy4KICAqCisgKiBUaGVyZSBhcmUgdGhyZWUgZGlmZmVyZW50IG1vbml0b3JzIHVzZWQgZm9yIHNpZ25hbGluZyBkaWZmZXJlbnQgY29uZGl0aW9ucworICogaG93ZXZlciB0aGV5IGFsbCBzaGFyZSB0aGUgc2FtZSBtdXRleF8uCisgKgogICogQHZlcnNpb24gJElkOiQKICAqLwotY2xhc3MgVGhyZWFkTWFuYWdlcjo6SW1wbCA6IHB1YmxpYyBUaHJlYWRNYW5hZ2VyICB7CitjbGFzcyBUaHJlYWRNYW5hZ2VyOjpJbXBsIDogcHVibGljIFRocmVhZE1hbmFnZXIgewogCi0gcHVibGljOgotICBJbXBsKCkgOgotICAgIHdvcmtlckNvdW50XygwKSwKLSAgICB3b3JrZXJNYXhDb3VudF8oMCksCi0gICAgaWRsZUNvdW50XygwKSwKLSAgICBwZW5kaW5nVGFza0NvdW50TWF4XygwKSwKLSAgICBleHBpcmVkQ291bnRfKDApLAotICAgIHN0YXRlXyhUaHJlYWRNYW5hZ2VyOjpVTklOSVRJQUxJWkVEKSwKLSAgICBtb25pdG9yXygmbXV0ZXhfKSwKLSAgICBtYXhNb25pdG9yXygmbXV0ZXhfKSB7fQorcHVibGljOgorICBJbXBsKCkKKyAgICA6IHdvcmtlckNvdW50XygwKSwKKyAgICAgIHdvcmtlck1heENvdW50XygwKSwKKyAgICAgIGlkbGVDb3VudF8oMCksCisgICAgICBwZW5kaW5nVGFza0NvdW50TWF4XygwKSwKKyAgICAgIGV4cGlyZWRDb3VudF8oMCksCisgICAgICBzdGF0ZV8oVGhyZWFkTWFuYWdlcjo6VU5JTklUSUFMSVpFRCksCisgICAgICBtb25pdG9yXygmbXV0ZXhfKSwKKyAgICAgIG1heE1vbml0b3JfKCZtdXRleF8pLAorICAgICAgd29ya2VyTW9uaXRvcl8oJm11dGV4Xykge30KIAogICB+SW1wbCgpIHsgc3RvcCgpOyB9CiAKICAgdm9pZCBzdGFydCgpOworICB2b2lkIHN0b3AoKTsKIAotICB2b2lkIHN0b3AoKSB7IHN0b3BJbXBsKGZhbHNlKTsgfQotCi0gIHZvaWQgam9pbigpIHsgc3RvcEltcGwodHJ1ZSk7IH0KLQotICBUaHJlYWRNYW5hZ2VyOjpTVEFURSBzdGF0ZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gc3RhdGVfOwotICB9CisgIFRocmVhZE1hbmFnZXI6OlNUQVRFIHN0YXRlKCkgY29uc3QgeyByZXR1cm4gc3RhdGVfOyB9CiAKICAgc2hhcmVkX3B0cjxUaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5KCkgY29uc3QgewotICAgIFN5bmNocm9uaXplZCBzKG1vbml0b3JfKTsKKyAgICBHdWFyZCBnKG11dGV4Xyk7CiAgICAgcmV0dXJuIHRocmVhZEZhY3RvcnlfOwogICB9CiAKICAgdm9pZCB0aHJlYWRGYWN0b3J5KHNoYXJlZF9wdHI8VGhyZWFkRmFjdG9yeT4gdmFsdWUpIHsKLSAgICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yXyk7CisgICAgR3VhcmQgZyhtdXRleF8pOworICAgIGlmICh0aHJlYWRGYWN0b3J5XyAmJiB0aHJlYWRGYWN0b3J5Xy0+aXNEZXRhY2hlZCgpICE9IHZhbHVlLT5pc0RldGFjaGVkKCkpIHsKKyAgICAgIHRocm93IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigpOworICAgIH0KICAgICB0aHJlYWRGYWN0b3J5XyA9IHZhbHVlOwogICB9CiAKQEAgLTg4LDU2ICs4OCw2OCBAQAogCiAgIHZvaWQgcmVtb3ZlV29ya2VyKHNpemVfdCB2YWx1ZSk7CiAKLSAgc2l6ZV90IGlkbGVXb3JrZXJDb3VudCgpIGNvbnN0IHsKLSAgICByZXR1cm4gaWRsZUNvdW50XzsKLSAgfQorICBzaXplX3QgaWRsZVdvcmtlckNvdW50KCkgY29uc3QgeyByZXR1cm4gaWRsZUNvdW50XzsgfQogCiAgIHNpemVfdCB3b3JrZXJDb3VudCgpIGNvbnN0IHsKLSAgICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yXyk7CisgICAgR3VhcmQgZyhtdXRleF8pOwogICAgIHJldHVybiB3b3JrZXJDb3VudF87CiAgIH0KIAogICBzaXplX3QgcGVuZGluZ1Rhc2tDb3VudCgpIGNvbnN0IHsKLSAgICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yXyk7CisgICAgR3VhcmQgZyhtdXRleF8pOwogICAgIHJldHVybiB0YXNrc18uc2l6ZSgpOwogICB9CiAKICAgc2l6ZV90IHRvdGFsVGFza0NvdW50KCkgY29uc3QgewotICAgIFN5bmNocm9uaXplZCBzKG1vbml0b3JfKTsKKyAgICBHdWFyZCBnKG11dGV4Xyk7CiAgICAgcmV0dXJuIHRhc2tzXy5zaXplKCkgKyB3b3JrZXJDb3VudF8gLSBpZGxlQ291bnRfOwogICB9CiAKICAgc2l6ZV90IHBlbmRpbmdUYXNrQ291bnRNYXgoKSBjb25zdCB7Ci0gICAgU3luY2hyb25pemVkIHMobW9uaXRvcl8pOworICAgIEd1YXJkIGcobXV0ZXhfKTsKICAgICByZXR1cm4gcGVuZGluZ1Rhc2tDb3VudE1heF87CiAgIH0KIAogICBzaXplX3QgZXhwaXJlZFRhc2tDb3VudCgpIHsKLSAgICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yXyk7Ci0gICAgc2l6ZV90IHJlc3VsdCA9IGV4cGlyZWRDb3VudF87Ci0gICAgZXhwaXJlZENvdW50XyA9IDA7Ci0gICAgcmV0dXJuIHJlc3VsdDsKKyAgICBHdWFyZCBnKG11dGV4Xyk7CisgICAgcmV0dXJuIGV4cGlyZWRDb3VudF87CiAgIH0KIAogICB2b2lkIHBlbmRpbmdUYXNrQ291bnRNYXgoY29uc3Qgc2l6ZV90IHZhbHVlKSB7Ci0gICAgU3luY2hyb25pemVkIHMobW9uaXRvcl8pOworICAgIEd1YXJkIGcobXV0ZXhfKTsKICAgICBwZW5kaW5nVGFza0NvdW50TWF4XyA9IHZhbHVlOwogICB9CiAKLSAgYm9vbCBjYW5TbGVlcCgpOwotCiAgIHZvaWQgYWRkKHNoYXJlZF9wdHI8UnVubmFibGU+IHZhbHVlLCBpbnQ2NF90IHRpbWVvdXQsIGludDY0X3QgZXhwaXJhdGlvbik7CiAKICAgdm9pZCByZW1vdmUoc2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzayk7CiAKICAgc2hhcmVkX3B0cjxSdW5uYWJsZT4gcmVtb3ZlTmV4dFBlbmRpbmcoKTsKIAotICB2b2lkIHJlbW92ZUV4cGlyZWRUYXNrcygpOworICB2b2lkIHJlbW92ZUV4cGlyZWRUYXNrcygpIHsKKyAgICByZW1vdmVFeHBpcmVkKGZhbHNlKTsKKyAgfQogCiAgIHZvaWQgc2V0RXhwaXJlQ2FsbGJhY2soRXhwaXJlQ2FsbGJhY2sgZXhwaXJlQ2FsbGJhY2spOwogCiBwcml2YXRlOgotICB2b2lkIHN0b3BJbXBsKGJvb2wgam9pbik7CisgIC8qKgorICAgKiBSZW1vdmUgb25lIG9yIG1vcmUgZXhwaXJlZCB0YXNrcy4KKyAgICogXHBhcmFtW2luXSAganVzdE9uZSAgaWYgdHJ1ZSwgdHJ5IHRvIHJlbW92ZSBqdXN0IG9uZSB0YXNrIGFuZCByZXR1cm4KKyAgICovCisgIHZvaWQgcmVtb3ZlRXhwaXJlZChib29sIGp1c3RPbmUpOworCisgIC8qKgorICAgKiBccmV0dXJucyB3aGV0aGVyIGl0IGlzIGFjY2VwdGFibGUgdG8gYmxvY2ssIGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCB0aHJlYWQgaWQKKyAgICovCisgIGJvb2wgY2FuU2xlZXAoKSBjb25zdDsKKworICAvKioKKyAgICogTG93ZXJzIHRoZSBtYXhpbXVtIHdvcmtlciBjb3VudCBhbmQgYmxvY2tzIHVudGlsIGVub3VnaCB3b3JrZXIgdGhyZWFkcyBjb21wbGV0ZQorICAgKiB0byBnZXQgdG8gdGhlIG5ldyBtYXhpbXVtIHdvcmtlciBsaW1pdC4gIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGFjcXVpcmluZworICAgKiBhIGxvY2sgb24gdGhlIGNsYXNzIG11dGV4Xy4KKyAgICovCisgIHZvaWQgcmVtb3ZlV29ya2Vyc1VuZGVyTG9jayhzaXplX3QgdmFsdWUpOwogCiAgIHNpemVfdCB3b3JrZXJDb3VudF87CiAgIHNpemVfdCB3b3JrZXJNYXhDb3VudF87CkBAIC0xNDksMTMgKzE2MSwxMyBAQAogICBUaHJlYWRNYW5hZ2VyOjpTVEFURSBzdGF0ZV87CiAgIHNoYXJlZF9wdHI8VGhyZWFkRmFjdG9yeT4gdGhyZWFkRmFjdG9yeV87CiAKLQogICBmcmllbmQgY2xhc3MgVGhyZWFkTWFuYWdlcjo6VGFzazsKLSAgc3RkOjpxdWV1ZTxzaGFyZWRfcHRyPFRhc2s+ID4gdGFza3NfOworICB0eXBlZGVmIHN0ZDo6ZGVxdWU8c2hhcmVkX3B0cjxUYXNrPiA+IFRhc2tRdWV1ZTsKKyAgVGFza1F1ZXVlIHRhc2tzXzsKICAgTXV0ZXggbXV0ZXhfOwogICBNb25pdG9yIG1vbml0b3JfOwogICBNb25pdG9yIG1heE1vbml0b3JfOwotICBNb25pdG9yIHdvcmtlck1vbml0b3JfOworICBNb25pdG9yIHdvcmtlck1vbml0b3JfOyAgICAgICAvLyB1c2VkIHRvIHN5bmNocm9uaXplIGNoYW5nZXMgaW4gd29ya2VyIGNvdW50CiAKICAgZnJpZW5kIGNsYXNzIFRocmVhZE1hbmFnZXI6OldvcmtlcjsKICAgc3RkOjpzZXQ8c2hhcmVkX3B0cjxUaHJlYWQ+ID4gd29ya2Vyc187CkBAIC0xNjUsMTggKzE3NywxMyBAQAogCiBjbGFzcyBUaHJlYWRNYW5hZ2VyOjpUYXNrIDogcHVibGljIFJ1bm5hYmxlIHsKIAotIHB1YmxpYzoKLSAgZW51bSBTVEFURSB7Ci0gICAgV0FJVElORywKLSAgICBFWEVDVVRJTkcsCi0gICAgQ0FOQ0VMTEVELAotICAgIENPTVBMRVRFCi0gIH07CitwdWJsaWM6CisgIGVudW0gU1RBVEUgeyBXQUlUSU5HLCBFWEVDVVRJTkcsIFRJTUVET1VULCBDT01QTEVURSB9OwogCi0gIFRhc2soc2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGUsIGludDY0X3QgZXhwaXJhdGlvbj0wTEwpICA6Ci0gICAgcnVubmFibGVfKHJ1bm5hYmxlKSwKLSAgICBzdGF0ZV8oV0FJVElORyksCi0gICAgZXhwaXJlVGltZV8oZXhwaXJhdGlvbiAhPSAwTEwgPyBVdGlsOjpjdXJyZW50VGltZSgpICsgZXhwaXJhdGlvbiA6IDBMTCkge30KKyAgVGFzayhzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZSwgaW50NjRfdCBleHBpcmF0aW9uID0gMExMKQorICAgIDogcnVubmFibGVfKHJ1bm5hYmxlKSwKKyAgICAgIHN0YXRlXyhXQUlUSU5HKSwKKyAgICAgIGV4cGlyZVRpbWVfKGV4cGlyYXRpb24gIT0gMExMID8gVXRpbDo6Y3VycmVudFRpbWUoKSArIGV4cGlyYXRpb24gOiAwTEwpIHt9CiAKICAgflRhc2soKSB7fQogCkBAIC0xODcsNDYgKzE5NCwzMiBAQAogICAgIH0KICAgfQogCi0gIHNoYXJlZF9wdHI8UnVubmFibGU+IGdldFJ1bm5hYmxlKCkgewotICAgIHJldHVybiBydW5uYWJsZV87Ci0gIH0KKyAgc2hhcmVkX3B0cjxSdW5uYWJsZT4gZ2V0UnVubmFibGUoKSB7IHJldHVybiBydW5uYWJsZV87IH0KIAotICBpbnQ2NF90IGdldEV4cGlyZVRpbWUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGV4cGlyZVRpbWVfOwotICB9CisgIGludDY0X3QgZ2V0RXhwaXJlVGltZSgpIGNvbnN0IHsgcmV0dXJuIGV4cGlyZVRpbWVfOyB9CiAKLSBwcml2YXRlOgorcHJpdmF0ZToKICAgc2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGVfOwogICBmcmllbmQgY2xhc3MgVGhyZWFkTWFuYWdlcjo6V29ya2VyOwogICBTVEFURSBzdGF0ZV87CiAgIGludDY0X3QgZXhwaXJlVGltZV87CiB9OwogCi1jbGFzcyBUaHJlYWRNYW5hZ2VyOjpXb3JrZXI6IHB1YmxpYyBSdW5uYWJsZSB7Ci0gIGVudW0gU1RBVEUgewotICAgIFVOSU5JVElBTElaRUQsCi0gICAgU1RBUlRJTkcsCi0gICAgU1RBUlRFRCwKLSAgICBTVE9QUElORywKLSAgICBTVE9QUEVECi0gIH07CitjbGFzcyBUaHJlYWRNYW5hZ2VyOjpXb3JrZXIgOiBwdWJsaWMgUnVubmFibGUgeworICBlbnVtIFNUQVRFIHsgVU5JTklUSUFMSVpFRCwgU1RBUlRJTkcsIFNUQVJURUQsIFNUT1BQSU5HLCBTVE9QUEVEIH07CiAKLSBwdWJsaWM6Ci0gIFdvcmtlcihUaHJlYWRNYW5hZ2VyOjpJbXBsKiBtYW5hZ2VyKSA6Ci0gICAgbWFuYWdlcl8obWFuYWdlciksCi0gICAgc3RhdGVfKFVOSU5JVElBTElaRUQpLAotICAgIGlkbGVfKGZhbHNlKSB7fQorcHVibGljOgorICBXb3JrZXIoVGhyZWFkTWFuYWdlcjo6SW1wbCogbWFuYWdlcikgOiBtYW5hZ2VyXyhtYW5hZ2VyKSwgc3RhdGVfKFVOSU5JVElBTElaRUQpIHt9CiAKICAgfldvcmtlcigpIHt9CiAKLSBwcml2YXRlOgorcHJpdmF0ZToKICAgYm9vbCBpc0FjdGl2ZSgpIGNvbnN0IHsKLSAgICByZXR1cm4KLSAgICAgIChtYW5hZ2VyXy0+d29ya2VyQ291bnRfIDw9IG1hbmFnZXJfLT53b3JrZXJNYXhDb3VudF8pIHx8Ci0gICAgICAobWFuYWdlcl8tPnN0YXRlXyA9PSBKT0lOSU5HICYmICFtYW5hZ2VyXy0+dGFza3NfLmVtcHR5KCkpOworICAgIHJldHVybiAobWFuYWdlcl8tPndvcmtlckNvdW50XyA8PSBtYW5hZ2VyXy0+d29ya2VyTWF4Q291bnRfKQorICAgICAgICAgICB8fCAobWFuYWdlcl8tPnN0YXRlXyA9PSBKT0lOSU5HICYmICFtYW5hZ2VyXy0+dGFza3NfLmVtcHR5KCkpOwogICB9CiAKLSBwdWJsaWM6CitwdWJsaWM6CiAgIC8qKgogICAgKiBXb3JrZXIgZW50cnkgcG9pbnQKICAgICoKQEAgLTIzNCwzMjcgKzIyNywzMzggQEAKICAgICogZXhlY3V0ZS4KICAgICovCiAgIHZvaWQgcnVuKCkgewotICAgIGJvb2wgYWN0aXZlID0gZmFsc2U7Ci0gICAgYm9vbCBub3RpZnlNYW5hZ2VyID0gZmFsc2U7CisgICAgR3VhcmQgZyhtYW5hZ2VyXy0+bXV0ZXhfKTsKKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGhhcyB0aHJlZSBwYXJ0czsgb25lIGlzIHRvIGNoZWNrIGZvciBhbmQgYWNjb3VudCBmb3IKKyAgICAgKiBhZG1pdHRpbmcgYSB0YXNrIHdoaWNoIGhhcHBlbnMgdW5kZXIgYSBsb2NrLiAgVGhlbiB0aGUgbG9jayBpcyByZWxlYXNlZAorICAgICAqIGFuZCB0aGUgdGFzayBpdHNlbGYgaXMgZXhlY3V0ZWQuICBGaW5hbGx5IHdlIGRvIHNvbWUgYWNjb3VudGluZworICAgICAqIHVuZGVyIGxvY2sgYWdhaW4gd2hlbiB0aGUgdGFzayBjb21wbGV0ZXMuCisgICAgICovCisKKyAgICAvKioKKyAgICAgKiBBZG1pdHRpbmcKKyAgICAgKi8KIAogICAgIC8qKgogICAgICAqIEluY3JlbWVudCB3b3JrZXIgc2VtYXBob3JlIGFuZCBub3RpZnkgbWFuYWdlciBpZiB3b3JrZXIgY291bnQgcmVhY2hlZAogICAgICAqIGRlc2lyZWQgbWF4Ci0gICAgICoKLSAgICAgKiBOb3RlOiBXZSBoYXZlIHRvIHJlbGVhc2UgdGhlIG1vbml0b3IgYW5kIGFjcXVpcmUgdGhlIHdvcmtlck1vbml0b3IKLSAgICAgKiBzaW5jZSB0aGF0IGlzIHdoYXQgdGhlIG1hbmFnZXIgYmxvY2tzIG9uIGZvciB3b3JrZXIgYWRkL3JlbW92ZQogICAgICAqLwotICAgIHsKLSAgICAgIFN5bmNocm9uaXplZCBzKG1hbmFnZXJfLT5tb25pdG9yXyk7Ci0gICAgICBhY3RpdmUgPSBtYW5hZ2VyXy0+d29ya2VyQ291bnRfIDwgbWFuYWdlcl8tPndvcmtlck1heENvdW50XzsKLSAgICAgIGlmIChhY3RpdmUpIHsKLSAgICAgICAgbWFuYWdlcl8tPndvcmtlckNvdW50XysrOwotICAgICAgICBub3RpZnlNYW5hZ2VyID0gbWFuYWdlcl8tPndvcmtlckNvdW50XyA9PSBtYW5hZ2VyXy0+d29ya2VyTWF4Q291bnRfOwotICAgICAgfQotICAgIH0KLQotICAgIGlmIChub3RpZnlNYW5hZ2VyKSB7Ci0gICAgICBTeW5jaHJvbml6ZWQgcyhtYW5hZ2VyXy0+d29ya2VyTW9uaXRvcl8pOwotICAgICAgbWFuYWdlcl8tPndvcmtlck1vbml0b3JfLm5vdGlmeSgpOwotICAgICAgbm90aWZ5TWFuYWdlciA9IGZhbHNlOwotICAgIH0KLQotICAgIHdoaWxlIChhY3RpdmUpIHsKLSAgICAgIHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcjo6VGFzaz4gdGFzazsKLQotICAgICAgLyoqCi0gICAgICAgKiBXaGlsZSBob2xkaW5nIG1hbmFnZXIgbW9uaXRvciBibG9jayBmb3Igbm9uLWVtcHR5IHRhc2sgcXVldWUgKEFsc28KLSAgICAgICAqIGNoZWNrIHRoYXQgdGhlIHRocmVhZCBoYXNuJ3QgYmVlbiByZXF1ZXN0ZWQgdG8gc3RvcCkuIE9uY2UgdGhlIHF1ZXVlCi0gICAgICAgKiBpcyBub24tZW1wdHksIGRlcXVldWUgYSB0YXNrLCByZWxlYXNlIG1vbml0b3IsIGFuZCBleGVjdXRlLiBJZiB0aGUKLSAgICAgICAqIHdvcmtlciBtYXggY291bnQgaGFzIGJlZW4gZGVjcmVtZW50ZWQgc3VjaCB0aGF0IHdlIGV4Y2VlZCBpdCwgbWFyawotICAgICAgICogb3Vyc2VsZiBpbmFjdGl2ZSwgZGVjcmVtZW50IHRoZSB3b3JrZXIgY291bnQgYW5kIG5vdGlmeSB0aGUgbWFuYWdlcgotICAgICAgICogKHRlY2huaWNhbGx5IHdlJ3JlIG5vdGlmeWluZyB0aGUgbmV4dCBibG9ja2VkIHRocmVhZCBidXQgZXZlbnR1YWxseQotICAgICAgICogdGhlIG1hbmFnZXIgd2lsbCBzZWUgaXQuCi0gICAgICAgKi8KLSAgICAgIHsKLSAgICAgICAgR3VhcmQgZyhtYW5hZ2VyXy0+bXV0ZXhfKTsKLSAgICAgICAgYWN0aXZlID0gaXNBY3RpdmUoKTsKLQotICAgICAgICB3aGlsZSAoYWN0aXZlICYmIG1hbmFnZXJfLT50YXNrc18uZW1wdHkoKSkgewotICAgICAgICAgIG1hbmFnZXJfLT5pZGxlQ291bnRfKys7Ci0gICAgICAgICAgaWRsZV8gPSB0cnVlOwotICAgICAgICAgIG1hbmFnZXJfLT5tb25pdG9yXy53YWl0KCk7Ci0gICAgICAgICAgYWN0aXZlID0gaXNBY3RpdmUoKTsKLSAgICAgICAgICBpZGxlXyA9IGZhbHNlOwotICAgICAgICAgIG1hbmFnZXJfLT5pZGxlQ291bnRfLS07Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYWN0aXZlKSB7Ci0gICAgICAgICAgbWFuYWdlcl8tPnJlbW92ZUV4cGlyZWRUYXNrcygpOwotCi0gICAgICAgICAgaWYgKCFtYW5hZ2VyXy0+dGFza3NfLmVtcHR5KCkpIHsKLSAgICAgICAgICAgIHRhc2sgPSBtYW5hZ2VyXy0+dGFza3NfLmZyb250KCk7Ci0gICAgICAgICAgICBtYW5hZ2VyXy0+dGFza3NfLnBvcCgpOwotICAgICAgICAgICAgaWYgKHRhc2stPnN0YXRlXyA9PSBUaHJlYWRNYW5hZ2VyOjpUYXNrOjpXQUlUSU5HKSB7Ci0gICAgICAgICAgICAgIHRhc2stPnN0YXRlXyA9IFRocmVhZE1hbmFnZXI6OlRhc2s6OkVYRUNVVElORzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogSWYgd2UgaGF2ZSBhIHBlbmRpbmcgdGFzayBtYXggYW5kIHdlIGp1c3QgZHJvcHBlZCBiZWxvdyBpdCwgd2FrZXVwIGFueQotICAgICAgICAgICAgICAgdGhyZWFkIHRoYXQgbWlnaHQgYmUgYmxvY2tlZCBvbiBhZGQuICovCi0gICAgICAgICAgICBpZiAobWFuYWdlcl8tPnBlbmRpbmdUYXNrQ291bnRNYXhfICE9IDAgJiYKLSAgICAgICAgICAgICAgICBtYW5hZ2VyXy0+dGFza3NfLnNpemUoKSA8PSBtYW5hZ2VyXy0+cGVuZGluZ1Rhc2tDb3VudE1heF8gLSAxKSB7Ci0gICAgICAgICAgICAgIG1hbmFnZXJfLT5tYXhNb25pdG9yXy5ub3RpZnkoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaWRsZV8gPSB0cnVlOwotICAgICAgICAgIG1hbmFnZXJfLT53b3JrZXJDb3VudF8tLTsKLSAgICAgICAgICBub3RpZnlNYW5hZ2VyID0gKG1hbmFnZXJfLT53b3JrZXJDb3VudF8gPT0gbWFuYWdlcl8tPndvcmtlck1heENvdW50Xyk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKHRhc2spIHsKLSAgICAgICAgaWYgKHRhc2stPnN0YXRlXyA9PSBUaHJlYWRNYW5hZ2VyOjpUYXNrOjpFWEVDVVRJTkcpIHsKLSAgICAgICAgICB0cnkgewotICAgICAgICAgICAgdGFzay0+cnVuKCk7Ci0gICAgICAgICAgfSBjYXRjaCguLi4pIHsKLSAgICAgICAgICAgIC8vIFhYWCBuZWVkIHRvIGxvZyB0aGlzCi0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgewotICAgICAgU3luY2hyb25pemVkIHMobWFuYWdlcl8tPndvcmtlck1vbml0b3JfKTsKLSAgICAgIG1hbmFnZXJfLT5kZWFkV29ya2Vyc18uaW5zZXJ0KHRoaXMtPnRocmVhZCgpKTsKLSAgICAgIGlmIChub3RpZnlNYW5hZ2VyKSB7CisgICAgYm9vbCBhY3RpdmUgPSBtYW5hZ2VyXy0+d29ya2VyQ291bnRfIDwgbWFuYWdlcl8tPndvcmtlck1heENvdW50XzsKKyAgICBpZiAoYWN0aXZlKSB7CisgICAgICBpZiAoKyttYW5hZ2VyXy0+d29ya2VyQ291bnRfID09IG1hbmFnZXJfLT53b3JrZXJNYXhDb3VudF8pIHsKICAgICAgICAgbWFuYWdlcl8tPndvcmtlck1vbml0b3JfLm5vdGlmeSgpOwogICAgICAgfQogICAgIH0KIAotICAgIHJldHVybjsKKyAgICB3aGlsZSAoYWN0aXZlKSB7CisgICAgICAvKioKKyAgICAgICAgKiBXaGlsZSBob2xkaW5nIG1hbmFnZXIgbW9uaXRvciBibG9jayBmb3Igbm9uLWVtcHR5IHRhc2sgcXVldWUgKEFsc28KKyAgICAgICAgKiBjaGVjayB0aGF0IHRoZSB0aHJlYWQgaGFzbid0IGJlZW4gcmVxdWVzdGVkIHRvIHN0b3ApLiBPbmNlIHRoZSBxdWV1ZQorICAgICAgICAqIGlzIG5vbi1lbXB0eSwgZGVxdWV1ZSBhIHRhc2ssIHJlbGVhc2UgbW9uaXRvciwgYW5kIGV4ZWN1dGUuIElmIHRoZQorICAgICAgICAqIHdvcmtlciBtYXggY291bnQgaGFzIGJlZW4gZGVjcmVtZW50ZWQgc3VjaCB0aGF0IHdlIGV4Y2VlZCBpdCwgbWFyaworICAgICAgICAqIG91cnNlbGYgaW5hY3RpdmUsIGRlY3JlbWVudCB0aGUgd29ya2VyIGNvdW50IGFuZCBub3RpZnkgdGhlIG1hbmFnZXIKKyAgICAgICAgKiAodGVjaG5pY2FsbHkgd2UncmUgbm90aWZ5aW5nIHRoZSBuZXh0IGJsb2NrZWQgdGhyZWFkIGJ1dCBldmVudHVhbGx5CisgICAgICAgICogdGhlIG1hbmFnZXIgd2lsbCBzZWUgaXQuCisgICAgICAgICovCisgICAgICBhY3RpdmUgPSBpc0FjdGl2ZSgpOworCisgICAgICB3aGlsZSAoYWN0aXZlICYmIG1hbmFnZXJfLT50YXNrc18uZW1wdHkoKSkgeworICAgICAgICBtYW5hZ2VyXy0+aWRsZUNvdW50XysrOworICAgICAgICBtYW5hZ2VyXy0+bW9uaXRvcl8ud2FpdCgpOworICAgICAgICBhY3RpdmUgPSBpc0FjdGl2ZSgpOworICAgICAgICBtYW5hZ2VyXy0+aWRsZUNvdW50Xy0tOworICAgICAgfQorCisgICAgICBzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI6OlRhc2s+IHRhc2s7CisKKyAgICAgIGlmIChhY3RpdmUpIHsKKyAgICAgICAgaWYgKCFtYW5hZ2VyXy0+dGFza3NfLmVtcHR5KCkpIHsKKyAgICAgICAgICB0YXNrID0gbWFuYWdlcl8tPnRhc2tzXy5mcm9udCgpOworICAgICAgICAgIG1hbmFnZXJfLT50YXNrc18ucG9wX2Zyb250KCk7CisgICAgICAgICAgaWYgKHRhc2stPnN0YXRlXyA9PSBUaHJlYWRNYW5hZ2VyOjpUYXNrOjpXQUlUSU5HKSB7CisgICAgICAgICAgICAvLyBJZiB0aGUgc3RhdGUgaXMgY2hhbmdlZCB0byBhbnl0aGluZyBvdGhlciB0aGFuIEVYRUNVVElORyBvciBUSU1FRE9VVCBoZXJlCisgICAgICAgICAgICAvLyB0aGVuIHRoZSBleGVjdXRpb24gbG9vcCBuZWVkcyB0byBiZSBjaGFuZ2VkIGJlbG93LgorICAgICAgICAgICAgdGFzay0+c3RhdGVfID0KKyAgICAgICAgICAgICAgICAodGFzay0+Z2V0RXhwaXJlVGltZSgpICYmIHRhc2stPmdldEV4cGlyZVRpbWUoKSA8IFV0aWw6OmN1cnJlbnRUaW1lKCkpID8KKyAgICAgICAgICAgICAgICAgICAgVGhyZWFkTWFuYWdlcjo6VGFzazo6VElNRURPVVQgOgorICAgICAgICAgICAgICAgICAgICBUaHJlYWRNYW5hZ2VyOjpUYXNrOjpFWEVDVVRJTkc7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogSWYgd2UgaGF2ZSBhIHBlbmRpbmcgdGFzayBtYXggYW5kIHdlIGp1c3QgZHJvcHBlZCBiZWxvdyBpdCwgd2FrZXVwIGFueQorICAgICAgICAgICAgdGhyZWFkIHRoYXQgbWlnaHQgYmUgYmxvY2tlZCBvbiBhZGQuICovCisgICAgICAgIGlmIChtYW5hZ2VyXy0+cGVuZGluZ1Rhc2tDb3VudE1heF8gIT0gMAorICAgICAgICAgICAgJiYgbWFuYWdlcl8tPnRhc2tzXy5zaXplKCkgPD0gbWFuYWdlcl8tPnBlbmRpbmdUYXNrQ291bnRNYXhfIC0gMSkgeworICAgICAgICAgIG1hbmFnZXJfLT5tYXhNb25pdG9yXy5ub3RpZnkoKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIEV4ZWN1dGlvbiAtIG5vdCBob2xkaW5nIGEgbG9jaworICAgICAgICovCisgICAgICBpZiAodGFzaykgeworICAgICAgICBpZiAodGFzay0+c3RhdGVfID09IFRocmVhZE1hbmFnZXI6OlRhc2s6OkVYRUNVVElORykgeworCisgICAgICAgICAgLy8gUmVsZWFzZSB0aGUgbG9jayBzbyB3ZSBjYW4gcnVuIHRoZSB0YXNrIHdpdGhvdXQgYmxvY2tpbmcgdGhlIHRocmVhZCBtYW5hZ2VyCisgICAgICAgICAgbWFuYWdlcl8tPm11dGV4Xy51bmxvY2soKTsKKworICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0YXNrLT5ydW4oKTsKKyAgICAgICAgICB9IGNhdGNoIChjb25zdCBzdGQ6OmV4Y2VwdGlvbiYgZSkgeworICAgICAgICAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiW0VSUk9SXSB0YXNrLT5ydW4oKSByYWlzZWQgYW4gZXhjZXB0aW9uOiAlcyIsIGUud2hhdCgpKTsKKyAgICAgICAgICB9IGNhdGNoICguLi4pIHsKKyAgICAgICAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoIltFUlJPUl0gdGFzay0+cnVuKCkgcmFpc2VkIGFuIHVua25vd24gZXhjZXB0aW9uIik7CisgICAgICAgICAgfQorCisgICAgICAgICAgLy8gUmUtYWNxdWlyZSB0aGUgbG9jayB0byBwcm9jZWVkIGluIHRoZSB0aHJlYWQgbWFuYWdlcgorICAgICAgICAgIG1hbmFnZXJfLT5tdXRleF8ubG9jaygpOworCisgICAgICAgIH0gZWxzZSBpZiAobWFuYWdlcl8tPmV4cGlyZUNhbGxiYWNrXykgeworICAgICAgICAgIC8vIFRoZSBvbmx5IG90aGVyIHN0YXRlIHRoZSB0YXNrIGNvdWxkIGhhdmUgYmVlbiBpbiBpcyBUSU1FRE9VVCAoc2VlIGFib3ZlKQorICAgICAgICAgIG1hbmFnZXJfLT5leHBpcmVDYWxsYmFja18odGFzay0+Z2V0UnVubmFibGUoKSk7CisgICAgICAgICAgbWFuYWdlcl8tPmV4cGlyZWRDb3VudF8rKzsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmFsIGFjY291bnRpbmcgZm9yIHRoZSB3b3JrZXIgdGhyZWFkIHRoYXQgaXMgZG9uZSB3b3JraW5nCisgICAgICovCisgICAgbWFuYWdlcl8tPmRlYWRXb3JrZXJzXy5pbnNlcnQodGhpcy0+dGhyZWFkKCkpOworICAgIGlmICgtLW1hbmFnZXJfLT53b3JrZXJDb3VudF8gPT0gbWFuYWdlcl8tPndvcmtlck1heENvdW50XykgeworICAgICAgbWFuYWdlcl8tPndvcmtlck1vbml0b3JfLm5vdGlmeSgpOworICAgIH0KICAgfQogCi0gIHByaXZhdGU6Ci0gICAgVGhyZWFkTWFuYWdlcjo6SW1wbCogbWFuYWdlcl87Ci0gICAgZnJpZW5kIGNsYXNzIFRocmVhZE1hbmFnZXI6OkltcGw7Ci0gICAgU1RBVEUgc3RhdGVfOwotICAgIGJvb2wgaWRsZV87Citwcml2YXRlOgorICBUaHJlYWRNYW5hZ2VyOjpJbXBsKiBtYW5hZ2VyXzsKKyAgZnJpZW5kIGNsYXNzIFRocmVhZE1hbmFnZXI6OkltcGw7CisgIFNUQVRFIHN0YXRlXzsKIH07CiAKLQotICB2b2lkIFRocmVhZE1hbmFnZXI6OkltcGw6OmFkZFdvcmtlcihzaXplX3QgdmFsdWUpIHsKK3ZvaWQgVGhyZWFkTWFuYWdlcjo6SW1wbDo6YWRkV29ya2VyKHNpemVfdCB2YWx1ZSkgewogICBzdGQ6OnNldDxzaGFyZWRfcHRyPFRocmVhZD4gPiBuZXdUaHJlYWRzOwogICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgdmFsdWU7IGl4KyspIHsKLSAgICBzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI6Oldvcmtlcj4gd29ya2VyID0gc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyOjpXb3JrZXI+KG5ldyBUaHJlYWRNYW5hZ2VyOjpXb3JrZXIodGhpcykpOworICAgIHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcjo6V29ya2VyPiB3b3JrZXIKKyAgICAgICAgPSBzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI6Oldvcmtlcj4obmV3IFRocmVhZE1hbmFnZXI6Oldvcmtlcih0aGlzKSk7CiAgICAgbmV3VGhyZWFkcy5pbnNlcnQodGhyZWFkRmFjdG9yeV8tPm5ld1RocmVhZCh3b3JrZXIpKTsKICAgfQogCi0gIHsKLSAgICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yXyk7Ci0gICAgd29ya2VyTWF4Q291bnRfICs9IHZhbHVlOwotICAgIHdvcmtlcnNfLmluc2VydChuZXdUaHJlYWRzLmJlZ2luKCksIG5ld1RocmVhZHMuZW5kKCkpOwotICB9CisgIEd1YXJkIGcobXV0ZXhfKTsKKyAgd29ya2VyTWF4Q291bnRfICs9IHZhbHVlOworICB3b3JrZXJzXy5pbnNlcnQobmV3VGhyZWFkcy5iZWdpbigpLCBuZXdUaHJlYWRzLmVuZCgpKTsKIAotICBmb3IgKHN0ZDo6c2V0PHNoYXJlZF9wdHI8VGhyZWFkPiA+OjppdGVyYXRvciBpeCA9IG5ld1RocmVhZHMuYmVnaW4oKTsgaXggIT0gbmV3VGhyZWFkcy5lbmQoKTsgaXgrKykgewotICAgIHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcjo6V29ya2VyPiB3b3JrZXIgPSBkeW5hbWljX3BvaW50ZXJfY2FzdDxUaHJlYWRNYW5hZ2VyOjpXb3JrZXIsIFJ1bm5hYmxlPigoKml4KS0+cnVubmFibGUoKSk7CisgIGZvciAoc3RkOjpzZXQ8c2hhcmVkX3B0cjxUaHJlYWQ+ID46Oml0ZXJhdG9yIGl4ID0gbmV3VGhyZWFkcy5iZWdpbigpOyBpeCAhPSBuZXdUaHJlYWRzLmVuZCgpOworICAgICAgICsraXgpIHsKKyAgICBzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI6Oldvcmtlcj4gd29ya2VyCisgICAgICAgID0gZHluYW1pY19wb2ludGVyX2Nhc3Q8VGhyZWFkTWFuYWdlcjo6V29ya2VyLCBSdW5uYWJsZT4oKCppeCktPnJ1bm5hYmxlKCkpOwogICAgIHdvcmtlci0+c3RhdGVfID0gVGhyZWFkTWFuYWdlcjo6V29ya2VyOjpTVEFSVElORzsKICAgICAoKml4KS0+c3RhcnQoKTsKICAgICBpZE1hcF8uaW5zZXJ0KHN0ZDo6cGFpcjxjb25zdCBUaHJlYWQ6OmlkX3QsIHNoYXJlZF9wdHI8VGhyZWFkPiA+KCgqaXgpLT5nZXRJZCgpLCAqaXgpKTsKICAgfQogCi0gIHsKLSAgICBTeW5jaHJvbml6ZWQgcyh3b3JrZXJNb25pdG9yXyk7Ci0gICAgd2hpbGUgKHdvcmtlckNvdW50XyAhPSB3b3JrZXJNYXhDb3VudF8pIHsKLSAgICAgIHdvcmtlck1vbml0b3JfLndhaXQoKTsKLSAgICB9CisgIHdoaWxlICh3b3JrZXJDb3VudF8gIT0gd29ya2VyTWF4Q291bnRfKSB7CisgICAgd29ya2VyTW9uaXRvcl8ud2FpdCgpOwogICB9CiB9CiAKIHZvaWQgVGhyZWFkTWFuYWdlcjo6SW1wbDo6c3RhcnQoKSB7Ci0KKyAgR3VhcmQgZyhtdXRleF8pOwogICBpZiAoc3RhdGVfID09IFRocmVhZE1hbmFnZXI6OlNUT1BQRUQpIHsKICAgICByZXR1cm47CiAgIH0KIAotICB7Ci0gICAgU3luY2hyb25pemVkIHMobW9uaXRvcl8pOwotICAgIGlmIChzdGF0ZV8gPT0gVGhyZWFkTWFuYWdlcjo6VU5JTklUSUFMSVpFRCkgewotICAgICAgaWYgKCF0aHJlYWRGYWN0b3J5XykgewotICAgICAgICB0aHJvdyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICAgIH0KLSAgICAgIHN0YXRlXyA9IFRocmVhZE1hbmFnZXI6OlNUQVJURUQ7Ci0gICAgICBtb25pdG9yXy5ub3RpZnlBbGwoKTsKKyAgaWYgKHN0YXRlXyA9PSBUaHJlYWRNYW5hZ2VyOjpVTklOSVRJQUxJWkVEKSB7CisgICAgaWYgKCF0aHJlYWRGYWN0b3J5XykgeworICAgICAgdGhyb3cgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCk7CiAgICAgfQorICAgIHN0YXRlXyA9IFRocmVhZE1hbmFnZXI6OlNUQVJURUQ7CisgICAgbW9uaXRvcl8ubm90aWZ5QWxsKCk7CisgIH0KIAotICAgIHdoaWxlIChzdGF0ZV8gPT0gU1RBUlRJTkcpIHsKLSAgICAgIG1vbml0b3JfLndhaXQoKTsKLSAgICB9CisgIHdoaWxlIChzdGF0ZV8gPT0gU1RBUlRJTkcpIHsKKyAgICBtb25pdG9yXy53YWl0KCk7CiAgIH0KIH0KIAotdm9pZCBUaHJlYWRNYW5hZ2VyOjpJbXBsOjpzdG9wSW1wbChib29sIGpvaW4pIHsKK3ZvaWQgVGhyZWFkTWFuYWdlcjo6SW1wbDo6c3RvcCgpIHsKKyAgR3VhcmQgZyhtdXRleF8pOwogICBib29sIGRvU3RvcCA9IGZhbHNlOwotICBpZiAoc3RhdGVfID09IFRocmVhZE1hbmFnZXI6OlNUT1BQRUQpIHsKLSAgICByZXR1cm47Ci0gIH0KIAotICB7Ci0gICAgU3luY2hyb25pemVkIHMobW9uaXRvcl8pOwotICAgIGlmIChzdGF0ZV8gIT0gVGhyZWFkTWFuYWdlcjo6U1RPUFBJTkcgJiYKLSAgICAgICAgc3RhdGVfICE9IFRocmVhZE1hbmFnZXI6OkpPSU5JTkcgJiYKLSAgICAgICAgc3RhdGVfICE9IFRocmVhZE1hbmFnZXI6OlNUT1BQRUQpIHsKLSAgICAgIGRvU3RvcCA9IHRydWU7Ci0gICAgICBzdGF0ZV8gPSBqb2luID8gVGhyZWFkTWFuYWdlcjo6Sk9JTklORyA6IFRocmVhZE1hbmFnZXI6OlNUT1BQSU5HOwotICAgIH0KKyAgaWYgKHN0YXRlXyAhPSBUaHJlYWRNYW5hZ2VyOjpTVE9QUElORyAmJiBzdGF0ZV8gIT0gVGhyZWFkTWFuYWdlcjo6Sk9JTklORworICAgICAgJiYgc3RhdGVfICE9IFRocmVhZE1hbmFnZXI6OlNUT1BQRUQpIHsKKyAgICBkb1N0b3AgPSB0cnVlOworICAgIHN0YXRlXyA9IFRocmVhZE1hbmFnZXI6OkpPSU5JTkc7CiAgIH0KIAogICBpZiAoZG9TdG9wKSB7Ci0gICAgcmVtb3ZlV29ya2VyKHdvcmtlckNvdW50Xyk7CisgICAgcmVtb3ZlV29ya2Vyc1VuZGVyTG9jayh3b3JrZXJDb3VudF8pOwogICB9CiAKLSAgLy8gWFhYCi0gIC8vIHNob3VsZCBiZSBhYmxlIHRvIGJsb2NrIGhlcmUgZm9yIHRyYW5zaXRpb24gdG8gU1RPUFBFRCBzaW5jZSB3ZSdyZSBubwotICAvLyB1c2luZyBzaGFyZWRfcHRycwotCi0gIHsKLSAgICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yXyk7Ci0gICAgc3RhdGVfID0gVGhyZWFkTWFuYWdlcjo6U1RPUFBFRDsKLSAgfQotCisgIHN0YXRlXyA9IFRocmVhZE1hbmFnZXI6OlNUT1BQRUQ7CiB9CiAKIHZvaWQgVGhyZWFkTWFuYWdlcjo6SW1wbDo6cmVtb3ZlV29ya2VyKHNpemVfdCB2YWx1ZSkgewotICBzdGQ6OnNldDxzaGFyZWRfcHRyPFRocmVhZD4gPiByZW1vdmVkVGhyZWFkczsKLSAgewotICAgIFN5bmNocm9uaXplZCBzKG1vbml0b3JfKTsKLSAgICBpZiAodmFsdWUgPiB3b3JrZXJNYXhDb3VudF8pIHsKLSAgICAgIHRocm93IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHdvcmtlck1heENvdW50XyAtPSB2YWx1ZTsKLQotICAgIGlmIChpZGxlQ291bnRfIDwgdmFsdWUpIHsKLSAgICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCBpZGxlQ291bnRfOyBpeCsrKSB7Ci0gICAgICAgIG1vbml0b3JfLm5vdGlmeSgpOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBtb25pdG9yXy5ub3RpZnlBbGwoKTsKLSAgICB9Ci0gIH0KLQotICB7Ci0gICAgU3luY2hyb25pemVkIHMod29ya2VyTW9uaXRvcl8pOwotCi0gICAgd2hpbGUgKHdvcmtlckNvdW50XyAhPSB3b3JrZXJNYXhDb3VudF8pIHsKLSAgICAgIHdvcmtlck1vbml0b3JfLndhaXQoKTsKLSAgICB9Ci0KLSAgICBmb3IgKHN0ZDo6c2V0PHNoYXJlZF9wdHI8VGhyZWFkPiA+OjppdGVyYXRvciBpeCA9IGRlYWRXb3JrZXJzXy5iZWdpbigpOyBpeCAhPSBkZWFkV29ya2Vyc18uZW5kKCk7IGl4KyspIHsKLSAgICAgIGlkTWFwXy5lcmFzZSgoKml4KS0+Z2V0SWQoKSk7Ci0gICAgICB3b3JrZXJzXy5lcmFzZSgqaXgpOwotICAgIH0KLQotICAgIGRlYWRXb3JrZXJzXy5jbGVhcigpOwotICB9CisgIEd1YXJkIGcobXV0ZXhfKTsKKyAgcmVtb3ZlV29ya2Vyc1VuZGVyTG9jayh2YWx1ZSk7CiB9CiAKLSAgYm9vbCBUaHJlYWRNYW5hZ2VyOjpJbXBsOjpjYW5TbGVlcCgpIHsKLSAgICBjb25zdCBUaHJlYWQ6OmlkX3QgaWQgPSB0aHJlYWRGYWN0b3J5Xy0+Z2V0Q3VycmVudFRocmVhZElkKCk7Ci0gICAgcmV0dXJuIGlkTWFwXy5maW5kKGlkKSA9PSBpZE1hcF8uZW5kKCk7Cit2b2lkIFRocmVhZE1hbmFnZXI6OkltcGw6OnJlbW92ZVdvcmtlcnNVbmRlckxvY2soc2l6ZV90IHZhbHVlKSB7CisgIGlmICh2YWx1ZSA+IHdvcmtlck1heENvdW50XykgeworICAgIHRocm93IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigpOwogICB9CiAKLSAgdm9pZCBUaHJlYWRNYW5hZ2VyOjpJbXBsOjphZGQoc2hhcmVkX3B0cjxSdW5uYWJsZT4gdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBleHBpcmF0aW9uKSB7Ci0gICAgR3VhcmQgZyhtdXRleF8sIHRpbWVvdXQpOworICB3b3JrZXJNYXhDb3VudF8gLT0gdmFsdWU7CiAKLSAgICBpZiAoIWcpIHsKLSAgICAgIHRocm93IFRpbWVkT3V0RXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgaWYgKHN0YXRlXyAhPSBUaHJlYWRNYW5hZ2VyOjpTVEFSVEVEKSB7Ci0gICAgICB0aHJvdyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRocmVhZE1hbmFnZXI6OkltcGw6OmFkZCBUaHJlYWRNYW5hZ2VyICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm90IHN0YXJ0ZWQiKTsKLSAgICB9Ci0KLSAgICByZW1vdmVFeHBpcmVkVGFza3MoKTsKLSAgICBpZiAocGVuZGluZ1Rhc2tDb3VudE1heF8gPiAwICYmICh0YXNrc18uc2l6ZSgpID49IHBlbmRpbmdUYXNrQ291bnRNYXhfKSkgewotICAgICAgaWYgKGNhblNsZWVwKCkgJiYgdGltZW91dCA+PSAwKSB7Ci0gICAgICAgIHdoaWxlIChwZW5kaW5nVGFza0NvdW50TWF4XyA+IDAgJiYgdGFza3NfLnNpemUoKSA+PSBwZW5kaW5nVGFza0NvdW50TWF4XykgewotICAgICAgICAgIC8vIFRoaXMgaXMgdGhyZWFkIHNhZmUgYmVjYXVzZSB0aGUgbXV0ZXggaXMgc2hhcmVkIGJldHdlZW4gbW9uaXRvcnMuCi0gICAgICAgICAgbWF4TW9uaXRvcl8ud2FpdCh0aW1lb3V0KTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgdGhyb3cgVG9vTWFueVBlbmRpbmdUYXNrc0V4Y2VwdGlvbigpOwotICAgICAgfQotICAgIH0KLQotICAgIHRhc2tzXy5wdXNoKHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcjo6VGFzaz4obmV3IFRocmVhZE1hbmFnZXI6OlRhc2sodmFsdWUsIGV4cGlyYXRpb24pKSk7Ci0KLSAgICAvLyBJZiBpZGxlIHRocmVhZCBpcyBhdmFpbGFibGUgbm90aWZ5IGl0LCBvdGhlcndpc2UgYWxsIHdvcmtlciB0aHJlYWRzIGFyZQotICAgIC8vIHJ1bm5pbmcgYW5kIHdpbGwgZ2V0IGFyb3VuZCB0byB0aGlzIHRhc2sgaW4gdGltZS4KLSAgICBpZiAoaWRsZUNvdW50XyA+IDApIHsKKyAgaWYgKGlkbGVDb3VudF8gPiB2YWx1ZSkgeworICAgIC8vIFRoZXJlIGFyZSBtb3JlIGlkbGUgd29ya2VycyB0aGFuIHdlIG5lZWQgdG8gcmVtb3ZlLAorICAgIC8vIHNvIG5vdGlmeSBlbm91Z2ggb2YgdGhlbSBzbyB0aGV5IGNhbiB0ZXJtaW5hdGUuCisgICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IHZhbHVlOyBpeCsrKSB7CiAgICAgICBtb25pdG9yXy5ub3RpZnkoKTsKICAgICB9CisgIH0gZWxzZSB7CisgICAgLy8gVGhlcmUgYXJlIGFzIG1hbnkgb3IgbGVzcyBpZGxlIHdvcmtlcnMgdGhhbiB3ZSBuZWVkIHRvIHJlbW92ZSwKKyAgICAvLyBzbyBqdXN0IG5vdGlmeSB0aGVtIGFsbCBzbyB0aGV5IGNhbiB0ZXJtaW5hdGUuCisgICAgbW9uaXRvcl8ubm90aWZ5QWxsKCk7CiAgIH0KIAotdm9pZCBUaHJlYWRNYW5hZ2VyOjpJbXBsOjpyZW1vdmUoc2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzaykgewotICAodm9pZCkgdGFzazsKLSAgU3luY2hyb25pemVkIHMobW9uaXRvcl8pOworICB3aGlsZSAod29ya2VyQ291bnRfICE9IHdvcmtlck1heENvdW50XykgeworICAgIHdvcmtlck1vbml0b3JfLndhaXQoKTsKKyAgfQorCisgIGZvciAoc3RkOjpzZXQ8c2hhcmVkX3B0cjxUaHJlYWQ+ID46Oml0ZXJhdG9yIGl4ID0gZGVhZFdvcmtlcnNfLmJlZ2luKCk7CisgICAgICAgaXggIT0gZGVhZFdvcmtlcnNfLmVuZCgpOworICAgICAgICsraXgpIHsKKworICAgIC8vIHdoZW4gdXNlZCB3aXRoIGEgam9pbmFibGUgdGhyZWFkIGZhY3RvcnksIHdlIGpvaW4gdGhlIHRocmVhZHMgYXMgd2UgcmVtb3ZlIHRoZW0KKyAgICBpZiAoIXRocmVhZEZhY3RvcnlfLT5pc0RldGFjaGVkKCkpIHsKKyAgICAgICgqaXgpLT5qb2luKCk7CisgICAgfQorCisgICAgaWRNYXBfLmVyYXNlKCgqaXgpLT5nZXRJZCgpKTsKKyAgICB3b3JrZXJzXy5lcmFzZSgqaXgpOworICB9CisKKyAgZGVhZFdvcmtlcnNfLmNsZWFyKCk7Cit9CisKK2Jvb2wgVGhyZWFkTWFuYWdlcjo6SW1wbDo6Y2FuU2xlZXAoKSBjb25zdCB7CisgIGNvbnN0IFRocmVhZDo6aWRfdCBpZCA9IHRocmVhZEZhY3RvcnlfLT5nZXRDdXJyZW50VGhyZWFkSWQoKTsKKyAgcmV0dXJuIGlkTWFwXy5maW5kKGlkKSA9PSBpZE1hcF8uZW5kKCk7Cit9CisKK3ZvaWQgVGhyZWFkTWFuYWdlcjo6SW1wbDo6YWRkKHNoYXJlZF9wdHI8UnVubmFibGU+IHZhbHVlLCBpbnQ2NF90IHRpbWVvdXQsIGludDY0X3QgZXhwaXJhdGlvbikgeworICBHdWFyZCBnKG11dGV4XywgdGltZW91dCk7CisKKyAgaWYgKCFnKSB7CisgICAgdGhyb3cgVGltZWRPdXRFeGNlcHRpb24oKTsKKyAgfQorCiAgIGlmIChzdGF0ZV8gIT0gVGhyZWFkTWFuYWdlcjo6U1RBUlRFRCkgewotICAgIHRocm93IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhyZWFkTWFuYWdlcjo6SW1wbDo6cmVtb3ZlIFRocmVhZE1hbmFnZXIgbm90ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN0YXJ0ZWQiKTsKKyAgICB0aHJvdyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICJUaHJlYWRNYW5hZ2VyOjpJbXBsOjphZGQgVGhyZWFkTWFuYWdlciAiCisgICAgICAgICJub3Qgc3RhcnRlZCIpOworICB9CisKKyAgLy8gaWYgd2UncmUgYXQgYSBsaW1pdCwgcmVtb3ZlIGFuIGV4cGlyZWQgdGFzayB0byBzZWUgaWYgdGhlIGxpbWl0IGNsZWFycworICBpZiAocGVuZGluZ1Rhc2tDb3VudE1heF8gPiAwICYmICh0YXNrc18uc2l6ZSgpID49IHBlbmRpbmdUYXNrQ291bnRNYXhfKSkgeworICAgIHJlbW92ZUV4cGlyZWQodHJ1ZSk7CisgIH0KKworICBpZiAocGVuZGluZ1Rhc2tDb3VudE1heF8gPiAwICYmICh0YXNrc18uc2l6ZSgpID49IHBlbmRpbmdUYXNrQ291bnRNYXhfKSkgeworICAgIGlmIChjYW5TbGVlcCgpICYmIHRpbWVvdXQgPj0gMCkgeworICAgICAgd2hpbGUgKHBlbmRpbmdUYXNrQ291bnRNYXhfID4gMCAmJiB0YXNrc18uc2l6ZSgpID49IHBlbmRpbmdUYXNrQ291bnRNYXhfKSB7CisgICAgICAgIC8vIFRoaXMgaXMgdGhyZWFkIHNhZmUgYmVjYXVzZSB0aGUgbXV0ZXggaXMgc2hhcmVkIGJldHdlZW4gbW9uaXRvcnMuCisgICAgICAgIG1heE1vbml0b3JfLndhaXQodGltZW91dCk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHRocm93IFRvb01hbnlQZW5kaW5nVGFza3NFeGNlcHRpb24oKTsKKyAgICB9CisgIH0KKworICB0YXNrc18ucHVzaF9iYWNrKHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcjo6VGFzaz4obmV3IFRocmVhZE1hbmFnZXI6OlRhc2sodmFsdWUsIGV4cGlyYXRpb24pKSk7CisKKyAgLy8gSWYgaWRsZSB0aHJlYWQgaXMgYXZhaWxhYmxlIG5vdGlmeSBpdCwgb3RoZXJ3aXNlIGFsbCB3b3JrZXIgdGhyZWFkcyBhcmUKKyAgLy8gcnVubmluZyBhbmQgd2lsbCBnZXQgYXJvdW5kIHRvIHRoaXMgdGFzayBpbiB0aW1lLgorICBpZiAoaWRsZUNvdW50XyA+IDApIHsKKyAgICBtb25pdG9yXy5ub3RpZnkoKTsKICAgfQogfQogCi1ib29zdDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gVGhyZWFkTWFuYWdlcjo6SW1wbDo6cmVtb3ZlTmV4dFBlbmRpbmcoKSB7Cit2b2lkIFRocmVhZE1hbmFnZXI6OkltcGw6OnJlbW92ZShzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrKSB7CiAgIEd1YXJkIGcobXV0ZXhfKTsKICAgaWYgKHN0YXRlXyAhPSBUaHJlYWRNYW5hZ2VyOjpTVEFSVEVEKSB7Ci0gICAgdGhyb3cgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaHJlYWRNYW5hZ2VyOjpJbXBsOjpyZW1vdmVOZXh0UGVuZGluZyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaHJlYWRNYW5hZ2VyIG5vdCBzdGFydGVkIik7CisgICAgdGhyb3cgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAorICAgICAgICAiVGhyZWFkTWFuYWdlcjo6SW1wbDo6cmVtb3ZlIFRocmVhZE1hbmFnZXIgbm90ICIKKyAgICAgICAgInN0YXJ0ZWQiKTsKKyAgfQorCisgIGZvciAoVGFza1F1ZXVlOjppdGVyYXRvciBpdCA9IHRhc2tzXy5iZWdpbigpOyBpdCAhPSB0YXNrc18uZW5kKCk7ICsraXQpCisgIHsKKyAgICBpZiAoKCppdCktPmdldFJ1bm5hYmxlKCkgPT0gdGFzaykKKyAgICB7CisgICAgICB0YXNrc18uZXJhc2UoaXQpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorfQorCitzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+IFRocmVhZE1hbmFnZXI6OkltcGw6OnJlbW92ZU5leHRQZW5kaW5nKCkgeworICBHdWFyZCBnKG11dGV4Xyk7CisgIGlmIChzdGF0ZV8gIT0gVGhyZWFkTWFuYWdlcjo6U1RBUlRFRCkgeworICAgIHRocm93IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKKyAgICAgICAgIlRocmVhZE1hbmFnZXI6OkltcGw6OnJlbW92ZU5leHRQZW5kaW5nICIKKyAgICAgICAgIlRocmVhZE1hbmFnZXIgbm90IHN0YXJ0ZWQiKTsKICAgfQogCiAgIGlmICh0YXNrc18uZW1wdHkoKSkgewotICAgIHJldHVybiBib29zdDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4oKTsKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPigpOwogICB9CiAKICAgc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyOjpUYXNrPiB0YXNrID0gdGFza3NfLmZyb250KCk7Ci0gIHRhc2tzXy5wb3AoKTsKKyAgdGFza3NfLnBvcF9mcm9udCgpOwogCiAgIHJldHVybiB0YXNrLT5nZXRSdW5uYWJsZSgpOwogfQogCi12b2lkIFRocmVhZE1hbmFnZXI6OkltcGw6OnJlbW92ZUV4cGlyZWRUYXNrcygpIHsKLSAgaW50NjRfdCBub3cgPSAwTEw7IC8vIHdlIHdvbid0IGFzayBmb3IgdGhlIHRpbWUgdW50aWxlIHdlIG5lZWQgaXQKK3ZvaWQgVGhyZWFkTWFuYWdlcjo6SW1wbDo6cmVtb3ZlRXhwaXJlZChib29sIGp1c3RPbmUpIHsKKyAgLy8gdGhpcyBpcyBhbHdheXMgY2FsbGVkIHVuZGVyIGEgbG9jaworICBpbnQ2NF90IG5vdyA9IDBMTDsKIAotICAvLyBub3RlIHRoYXQgdGhpcyBsb29wIGJyZWFrcyBhdCB0aGUgZmlyc3Qgbm9uLWV4cGlyaW5nIHRhc2sKLSAgd2hpbGUgKCF0YXNrc18uZW1wdHkoKSkgewotICAgIHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcjo6VGFzaz4gdGFzayA9IHRhc2tzXy5mcm9udCgpOwotICAgIGlmICh0YXNrLT5nZXRFeHBpcmVUaW1lKCkgPT0gMExMKSB7Ci0gICAgICBicmVhazsKLSAgICB9CisgIGZvciAoVGFza1F1ZXVlOjppdGVyYXRvciBpdCA9IHRhc2tzXy5iZWdpbigpOyBpdCAhPSB0YXNrc18uZW5kKCk7ICkKKyAgewogICAgIGlmIChub3cgPT0gMExMKSB7CiAgICAgICBub3cgPSBVdGlsOjpjdXJyZW50VGltZSgpOwogICAgIH0KLSAgICBpZiAodGFzay0+Z2V0RXhwaXJlVGltZSgpID4gbm93KSB7Ci0gICAgICBicmVhazsKKworICAgIGlmICgoKml0KS0+Z2V0RXhwaXJlVGltZSgpID4gMExMICYmICgqaXQpLT5nZXRFeHBpcmVUaW1lKCkgPCBub3cpIHsKKyAgICAgIGlmIChleHBpcmVDYWxsYmFja18pIHsKKyAgICAgICAgZXhwaXJlQ2FsbGJhY2tfKCgqaXQpLT5nZXRSdW5uYWJsZSgpKTsKKyAgICAgIH0KKyAgICAgIGl0ID0gdGFza3NfLmVyYXNlKGl0KTsKKyAgICAgICsrZXhwaXJlZENvdW50XzsKKyAgICAgIGlmIChqdXN0T25lKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KICAgICB9Ci0gICAgaWYgKGV4cGlyZUNhbGxiYWNrXykgewotICAgICAgZXhwaXJlQ2FsbGJhY2tfKHRhc2stPmdldFJ1bm5hYmxlKCkpOworICAgIGVsc2UKKyAgICB7CisgICAgICArK2l0OwogICAgIH0KLSAgICB0YXNrc18ucG9wKCk7Ci0gICAgZXhwaXJlZENvdW50XysrOwogICB9CiB9CiAKLQogdm9pZCBUaHJlYWRNYW5hZ2VyOjpJbXBsOjpzZXRFeHBpcmVDYWxsYmFjayhFeHBpcmVDYWxsYmFjayBleHBpcmVDYWxsYmFjaykgeworICBHdWFyZCBnKG11dGV4Xyk7CiAgIGV4cGlyZUNhbGxiYWNrXyA9IGV4cGlyZUNhbGxiYWNrOwogfQogCiBjbGFzcyBTaW1wbGVUaHJlYWRNYW5hZ2VyIDogcHVibGljIFRocmVhZE1hbmFnZXI6OkltcGwgewogCi0gcHVibGljOgotICBTaW1wbGVUaHJlYWRNYW5hZ2VyKHNpemVfdCB3b3JrZXJDb3VudD00LCBzaXplX3QgcGVuZGluZ1Rhc2tDb3VudE1heD0wKSA6Ci0gICAgd29ya2VyQ291bnRfKHdvcmtlckNvdW50KSwKLSAgICBwZW5kaW5nVGFza0NvdW50TWF4XyhwZW5kaW5nVGFza0NvdW50TWF4KSB7Ci0gIH0KK3B1YmxpYzoKKyAgU2ltcGxlVGhyZWFkTWFuYWdlcihzaXplX3Qgd29ya2VyQ291bnQgPSA0LCBzaXplX3QgcGVuZGluZ1Rhc2tDb3VudE1heCA9IDApCisgICAgOiB3b3JrZXJDb3VudF8od29ya2VyQ291bnQpLCBwZW5kaW5nVGFza0NvdW50TWF4XyhwZW5kaW5nVGFza0NvdW50TWF4KSB7fQogCiAgIHZvaWQgc3RhcnQoKSB7CiAgICAgVGhyZWFkTWFuYWdlcjo6SW1wbDo6cGVuZGluZ1Rhc2tDb3VudE1heChwZW5kaW5nVGFza0NvdW50TWF4Xyk7CkBAIC01NjIsMjAgKzU2NiwxOSBAQAogICAgIGFkZFdvcmtlcih3b3JrZXJDb3VudF8pOwogICB9CiAKLSBwcml2YXRlOgorcHJpdmF0ZToKICAgY29uc3Qgc2l6ZV90IHdvcmtlckNvdW50XzsKICAgY29uc3Qgc2l6ZV90IHBlbmRpbmdUYXNrQ291bnRNYXhfOwotICBNb25pdG9yIG1vbml0b3JfOwogfTsKIAotCiBzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IFRocmVhZE1hbmFnZXI6Om5ld1RocmVhZE1hbmFnZXIoKSB7CiAgIHJldHVybiBzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+KG5ldyBUaHJlYWRNYW5hZ2VyOjpJbXBsKCkpOwogfQogCi1zaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IFRocmVhZE1hbmFnZXI6Om5ld1NpbXBsZVRocmVhZE1hbmFnZXIoc2l6ZV90IGNvdW50LCBzaXplX3QgcGVuZGluZ1Rhc2tDb3VudE1heCkgeworc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiBUaHJlYWRNYW5hZ2VyOjpuZXdTaW1wbGVUaHJlYWRNYW5hZ2VyKHNpemVfdCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgcGVuZGluZ1Rhc2tDb3VudE1heCkgewogICByZXR1cm4gc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPihuZXcgU2ltcGxlVGhyZWFkTWFuYWdlcihjb3VudCwgcGVuZGluZ1Rhc2tDb3VudE1heCkpOwogfQotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5Ci0KK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXIuaAppbmRleCAwZmVkYzg4Li40NzBmYzBhIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyLmgKQEAgLTIwLDEyICsyMCwxNCBAQAogI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX1RIUkVBRE1BTkFHRVJfSF8KICNkZWZpbmUgX1RIUklGVF9DT05DVVJSRU5DWV9USFJFQURNQU5BR0VSX0hfIDEKIAotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgotI2luY2x1ZGUgPHRocmlmdC9jeHhmdW5jdGlvbmFsLmg+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZC5oPgogCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBjb25jdXJyZW5jeSB7CituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKIAogLyoqCiAgKiBUaHJlYWQgUG9vbCBNYW5hZ2VyIGFuZCByZWxhdGVkIGNsYXNzZXMKQEAgLTM5LDI1ICs0MSwyNSBAQAogICoKICAqIFRoaXMgY2xhc3MgbWFuYWdlcyBhIHBvb2wgb2YgdGhyZWFkcy4gSXQgdXNlcyBhIFRocmVhZEZhY3RvcnkgdG8gY3JlYXRlCiAgKiB0aHJlYWRzLiBJdCBuZXZlciBhY3R1YWxseSBjcmVhdGVzIG9yIGRlc3Ryb3lzIHdvcmtlciB0aHJlYWRzLCByYXRoZXIKLSAqIEl0IG1haW50YWlucyBzdGF0aXN0aWNzIG9uIG51bWJlciBvZiBpZGxlIHRocmVhZHMsIG51bWJlciBvZiBhY3RpdmUgdGhyZWFkcywKKyAqIGl0IG1haW50YWlucyBzdGF0aXN0aWNzIG9uIG51bWJlciBvZiBpZGxlIHRocmVhZHMsIG51bWJlciBvZiBhY3RpdmUgdGhyZWFkcywKICAqIHRhc2sgYmFja2xvZywgYW5kIGF2ZXJhZ2Ugd2FpdCBhbmQgc2VydmljZSB0aW1lcyBhbmQgaW5mb3JtcyB0aGUgUG9vbFBvbGljeQogICogb2JqZWN0IGJvdW5kIHRvIGluc3RhbmNlcyBvZiB0aGlzIG1hbmFnZXIgb2YgaW50ZXJlc3RpbmcgdHJhbnNpdGlvbnMuIEl0IGlzCiAgKiB0aGVuIHVwIHRoZSBQb29sUG9saWN5IG9iamVjdCB0byBkZWNpZGUgaWYgdGhlIHRocmVhZCBwb29sIHNpemUgbmVlZHMgdG8gYmUKICAqIGFkanVzdGVkIGFuZCBjYWxsIHRoaXMgb2JqZWN0IGFkZFdvcmtlciBhbmQgcmVtb3ZlV29ya2VyIG1ldGhvZHMgdG8gbWFrZQogICogY2hhbmdlcy4KICAqCi0gKiBUaGlzIGRlc2lnbiBhbGxvd3MgZGlmZmVyZW50IHBvbGljeSBpbXBsZW1lbnRhdGlvbnMgdG8gdXNlZCB0aGlzIGNvZGUgdG8KKyAqIFRoaXMgZGVzaWduIGFsbG93cyBkaWZmZXJlbnQgcG9saWN5IGltcGxlbWVudGF0aW9ucyB0byB1c2UgdGhpcyBjb2RlIHRvCiAgKiBoYW5kbGUgYmFzaWMgd29ya2VyIHRocmVhZCBtYW5hZ2VtZW50IGFuZCB3b3JrZXIgdGFzayBleGVjdXRpb24gYW5kIGZvY3VzIG9uCiAgKiBwb2xpY3kgaXNzdWVzLiBUaGUgc2ltcGxlc3QgcG9saWN5LCBTdGF0aWNQb2xpY3ksIGRvZXMgbm90aGluZyBvdGhlciB0aGFuCiAgKiBjcmVhdGUgYSBmaXhlZCBudW1iZXIgb2YgdGhyZWFkcy4KICAqLwogY2xhc3MgVGhyZWFkTWFuYWdlciB7CiAKLSBwcm90ZWN0ZWQ6Citwcm90ZWN0ZWQ6CiAgIFRocmVhZE1hbmFnZXIoKSB7fQogCi0gcHVibGljOgotICB0eXBlZGVmIGFwYWNoZTo6dGhyaWZ0OjpzdGRjeHg6OmZ1bmN0aW9uPHZvaWQoYm9vc3Q6OnNoYXJlZF9wdHI8UnVubmFibGU+KT4gRXhwaXJlQ2FsbGJhY2s7CitwdWJsaWM6CisgIHR5cGVkZWYgc3RkOjpmdW5jdGlvbjx2b2lkKHN0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4pPiBFeHBpcmVDYWxsYmFjazsKIAogICB2aXJ0dWFsIH5UaHJlYWRNYW5hZ2VyKCkge30KIApAQCAtNjksMzggKzcxLDQ2IEBACiAKICAgLyoqCiAgICAqIFN0b3BzIHRoZSB0aHJlYWQgbWFuYWdlci4gQWJvcnRzIGFsbCByZW1haW5pbmcgdW5wcm9jZXNzZWQgdGFzaywgc2h1dHMKLSAgICogZG93biBhbGwgY3JlYXRlZCB3b3JrZXIgdGhyZWFkcywgYW5kIHJlYWxlYXNlcyBhbGwgYWxsb2NhdGVkIHJlc291cmNlcy4KKyAgICogZG93biBhbGwgY3JlYXRlZCB3b3JrZXIgdGhyZWFkcywgYW5kIHJlbGVhc2VzIGFsbCBhbGxvY2F0ZWQgcmVzb3VyY2VzLgogICAgKiBUaGlzIG1ldGhvZCBibG9ja3MgZm9yIGFsbCB3b3JrZXIgdGhyZWFkcyB0byBjb21wbGV0ZSwgdGh1cyBpdCBjYW4KICAgICogcG90ZW50aWFsbHkgYmxvY2sgZm9yZXZlciBpZiBhIHdvcmtlciB0aHJlYWQgaXMgcnVubmluZyBhIHRhc2sgdGhhdAogICAgKiB3b24ndCB0ZXJtaW5hdGUuCisgICAqCisgICAqIFdvcmtlciB0aHJlYWRzIHdpbGwgYmUgam9pbmVkIGRlcGVuZGluZyBvbiB0aGUgdGhyZWFkRmFjdG9yeSdzIGRldGFjaGVkCisgICAqIGRpc3Bvc2l0aW9uLgogICAgKi8KICAgdmlydHVhbCB2b2lkIHN0b3AoKSA9IDA7CiAKLSAgLyoqCi0gICAqIEpvaW5zIHRoZSB0aHJlYWQgbWFuYWdlci4gVGhpcyBpcyB0aGUgc2FtZSBhcyBzdG9wLCBleGNlcHQgdGhhdCBpdCB3aWxsCi0gICAqIGJsb2NrIHVudGlsIGFsbCB0aGUgd29ya2VycyBoYXZlIGZpbmlzaGVkIHRoZWlyIHdvcmsuIEF0IHRoYXQgcG9pbnQKLSAgICogdGhlIFRocmVhZE1hbmFnZXIgd2lsbCB0cmFuc2l0aW9uIGludG8gdGhlIFNUT1BQRUQgc3RhdGUuCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgam9pbigpID0gMDsKLQotICBlbnVtIFNUQVRFIHsKLSAgICBVTklOSVRJQUxJWkVELAotICAgIFNUQVJUSU5HLAotICAgIFNUQVJURUQsCi0gICAgSk9JTklORywKLSAgICBTVE9QUElORywKLSAgICBTVE9QUEVECi0gIH07CisgIGVudW0gU1RBVEUgeyBVTklOSVRJQUxJWkVELCBTVEFSVElORywgU1RBUlRFRCwgSk9JTklORywgU1RPUFBJTkcsIFNUT1BQRUQgfTsKIAogICB2aXJ0dWFsIFNUQVRFIHN0YXRlKCkgY29uc3QgPSAwOwogCi0gIHZpcnR1YWwgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkRmFjdG9yeT4gdGhyZWFkRmFjdG9yeSgpIGNvbnN0ID0gMDsKKyAgLyoqCisgICAqIFxyZXR1cm5zIHRoZSBjdXJyZW50IHRocmVhZCBmYWN0b3J5CisgICAqLworICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5KCkgY29uc3QgPSAwOwogCi0gIHZpcnR1YWwgdm9pZCB0aHJlYWRGYWN0b3J5KGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZEZhY3Rvcnk+IHZhbHVlKSA9IDA7CisgIC8qKgorICAgKiBTZXQgdGhlIHRocmVhZCBmYWN0b3J5LgorICAgKiBcdGhyb3dzIEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgbmV3IHRocmVhZCBmYWN0b3J5IGhhcyBhIGRpZmZlcmVudAorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRhY2hlZCBkaXNwb3NpdGlvbiB0aGFuIHRoZSBvbmUgcmVwbGFjaW5nIGl0CisgICAqLworICB2aXJ0dWFsIHZvaWQgdGhyZWFkRmFjdG9yeShzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkRmFjdG9yeT4gdmFsdWUpID0gMDsKIAotICB2aXJ0dWFsIHZvaWQgYWRkV29ya2VyKHNpemVfdCB2YWx1ZT0xKSA9IDA7CisgIC8qKgorICAgKiBBZGRzIHdvcmtlciB0aHJlYWQocykuCisgICAqLworICB2aXJ0dWFsIHZvaWQgYWRkV29ya2VyKHNpemVfdCB2YWx1ZSA9IDEpID0gMDsKIAotICB2aXJ0dWFsIHZvaWQgcmVtb3ZlV29ya2VyKHNpemVfdCB2YWx1ZT0xKSA9IDA7CisgIC8qKgorICAgKiBSZW1vdmVzIHdvcmtlciB0aHJlYWQocykuCisgICAqIFRocmVhZHMgYXJlIGpvaW5lZCBpZiB0aGUgdGhyZWFkIGZhY3RvcnkgZGV0YWNoZWQgZGlzcG9zaXRpb24gYWxsb3dzIGl0LgorICAgKiBCbG9ja3MgdW50aWwgdGhlIG51bWJlciBvZiB3b3JrZXIgdGhyZWFkcyByZWFjaGVzIHRoZSBuZXcgbGltaXQuCisgICAqIFxwYXJhbVtpbl0gIHZhbHVlICB0aGUgbnVtYmVyIHRvIHJlbW92ZQorICAgKiBcdGhyb3dzIEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIHRoZSBudW1iZXIKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Ygd29ya2VycworICAgKi8KKyAgdmlydHVhbCB2b2lkIHJlbW92ZVdvcmtlcihzaXplX3QgdmFsdWUgPSAxKSA9IDA7CiAKICAgLyoqCiAgICAqIEdldHMgdGhlIGN1cnJlbnQgbnVtYmVyIG9mIGlkbGUgd29ya2VyIHRocmVhZHMKQEAgLTExNSw3ICsxMjUsNyBAQAogICAvKioKICAgICogR2V0cyB0aGUgY3VycmVudCBudW1iZXIgb2YgcGVuZGluZyB0YXNrcwogICAgKi8KLSAgdmlydHVhbCBzaXplX3QgcGVuZGluZ1Rhc2tDb3VudCgpIGNvbnN0ICA9IDA7CisgIHZpcnR1YWwgc2l6ZV90IHBlbmRpbmdUYXNrQ291bnQoKSBjb25zdCA9IDA7CiAKICAgLyoqCiAgICAqIEdldHMgdGhlIGN1cnJlbnQgbnVtYmVyIG9mIHBlbmRpbmcgYW5kIGV4ZWN1dGluZyB0YXNrcwpAQCAtMTI4LDcgKzEzOCw4IEBACiAgIHZpcnR1YWwgc2l6ZV90IHBlbmRpbmdUYXNrQ291bnRNYXgoKSBjb25zdCA9IDA7CiAKICAgLyoqCi0gICAqIEdldHMgdGhlIG51bWJlciBvZiB0YXNrcyB3aGljaCBoYXZlIGJlZW4gZXhwaXJlZCB3aXRob3V0IGJlaW5nIHJ1bi4KKyAgICogR2V0cyB0aGUgbnVtYmVyIG9mIHRhc2tzIHdoaWNoIGhhdmUgYmVlbiBleHBpcmVkIHdpdGhvdXQgYmVpbmcgcnVuCisgICAqIHNpbmNlIHN0YXJ0KCkgd2FzIGNhbGxlZC4KICAgICovCiAgIHZpcnR1YWwgc2l6ZV90IGV4cGlyZWRUYXNrQ291bnQoKSA9IDA7CiAKQEAgLTE1MSwyMSArMTYyLDIxIEBACiAgICAqCiAgICAqIEB0aHJvd3MgVG9vTWFueVBlbmRpbmdUYXNrc0V4Y2VwdGlvbiBQZW5kaW5nIHRhc2sgY291bnQgZXhjZWVkcyBtYXggcGVuZGluZyB0YXNrIGNvdW50CiAgICAqLwotICB2aXJ0dWFsIHZvaWQgYWRkKGJvb3N0OjpzaGFyZWRfcHRyPFJ1bm5hYmxlPnRhc2ssCi0gICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lb3V0PTBMTCwKLSAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGV4cGlyYXRpb249MExMKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBhZGQoc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrLAorICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZW91dCA9IDBMTCwKKyAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGV4cGlyYXRpb24gPSAwTEwpID0gMDsKIAogICAvKioKICAgICogUmVtb3ZlcyBhIHBlbmRpbmcgdGFzawogICAgKi8KLSAgdmlydHVhbCB2b2lkIHJlbW92ZShib29zdDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzaykgPSAwOworICB2aXJ0dWFsIHZvaWQgcmVtb3ZlKHN0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzaykgPSAwOwogCiAgIC8qKgogICAgKiBSZW1vdmUgdGhlIG5leHQgcGVuZGluZyB0YXNrIHdoaWNoIHdvdWxkIGJlIHJ1bi4KICAgICoKICAgICogQHJldHVybiB0aGUgdGFzayByZW1vdmVkLgogICAgKi8KLSAgdmlydHVhbCBib29zdDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gcmVtb3ZlTmV4dFBlbmRpbmcoKSA9IDA7CisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiByZW1vdmVOZXh0UGVuZGluZygpID0gMDsKIAogICAvKioKICAgICogUmVtb3ZlIHRhc2tzIGZyb20gZnJvbnQgb2YgdGFzayBxdWV1ZSB0aGF0IGhhdmUgZXhwaXJlZC4KQEAgLTE4MCwxNCArMTkxLDE1IEBACiAgICAqLwogICB2aXJ0dWFsIHZvaWQgc2V0RXhwaXJlQ2FsbGJhY2soRXhwaXJlQ2FsbGJhY2sgZXhwaXJlQ2FsbGJhY2spID0gMDsKIAotICBzdGF0aWMgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gbmV3VGhyZWFkTWFuYWdlcigpOworICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IG5ld1RocmVhZE1hbmFnZXIoKTsKIAogICAvKioKICAgICogQ3JlYXRlcyBhIHNpbXBsZSB0aHJlYWQgbWFuYWdlciB0aGUgdXNlcyBjb3VudCBudW1iZXIgb2Ygd29ya2VyIHRocmVhZHMgYW5kIGhhcwogICAgKiBhIHBlbmRpbmdUYXNrQ291bnRNYXggbWF4aW11bSBwZW5kaW5nIHRhc2tzLiBUaGUgZGVmYXVsdCwgMCwgc3BlY2lmaWVkIG5vIGxpbWl0CiAgICAqIG9uIHBlbmRpbmcgdGFza3MKICAgICovCi0gIHN0YXRpYyBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiBuZXdTaW1wbGVUaHJlYWRNYW5hZ2VyKHNpemVfdCBjb3VudD00LCBzaXplX3QgcGVuZGluZ1Rhc2tDb3VudE1heD0wKTsKKyAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiBuZXdTaW1wbGVUaHJlYWRNYW5hZ2VyKHNpemVfdCBjb3VudCA9IDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBwZW5kaW5nVGFza0NvdW50TWF4ID0gMCk7CiAKICAgY2xhc3MgVGFzazsKIApAQCAtMTk1LDcgKzIwNyw4IEBACiAKICAgY2xhc3MgSW1wbDsKIH07Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5CiAKICNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfQ09OQ1VSUkVOQ1lfVEhSRUFETUFOQUdFUl9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1RpbWVyTWFuYWdlci5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvVGltZXJNYW5hZ2VyLmNwcAppbmRleCA2ODIxYjJlLi42MWEzNGZmIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvVGltZXJNYW5hZ2VyLmNwcAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvVGltZXJNYW5hZ2VyLmNwcApAQCAtMjUsOSArMjUsMTIgQEAKICNpbmNsdWRlIDxpb3N0cmVhbT4KICNpbmNsdWRlIDxzZXQ+CiAKLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgY29uY3VycmVuY3kgewogCi11c2luZyBib29zdDo6c2hhcmVkX3B0cjsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKK3VzaW5nIHN0ZDo6d2Vha19wdHI7CiAKIC8qKgogICogVGltZXJNYW5hZ2VyIGNsYXNzCkBAIC0zNiwyMCArMzksMTIgQEAKICAqLwogY2xhc3MgVGltZXJNYW5hZ2VyOjpUYXNrIDogcHVibGljIFJ1bm5hYmxlIHsKIAotIHB1YmxpYzoKLSAgZW51bSBTVEFURSB7Ci0gICAgV0FJVElORywKLSAgICBFWEVDVVRJTkcsCi0gICAgQ0FOQ0VMTEVELAotICAgIENPTVBMRVRFCi0gIH07CitwdWJsaWM6CisgIGVudW0gU1RBVEUgeyBXQUlUSU5HLCBFWEVDVVRJTkcsIENBTkNFTExFRCwgQ09NUExFVEUgfTsKIAotICBUYXNrKHNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlKSA6Ci0gICAgcnVubmFibGVfKHJ1bm5hYmxlKSwKLSAgICBzdGF0ZV8oV0FJVElORykge30KKyAgVGFzayhzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZSkgOiBydW5uYWJsZV8ocnVubmFibGUpLCBzdGF0ZV8oV0FJVElORykge30KIAotICB+VGFzaygpIHsKLSAgfQorICB+VGFzaygpIHt9CiAKICAgdm9pZCBydW4oKSB7CiAgICAgaWYgKHN0YXRlXyA9PSBFWEVDVVRJTkcpIHsKQEAgLTU4LDE3ICs1MywyMCBAQAogICAgIH0KICAgfQogCi0gcHJpdmF0ZToKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IHNoYXJlZF9wdHI8UnVubmFibGU+ICYgcnVubmFibGUpIGNvbnN0IHsgcmV0dXJuIHJ1bm5hYmxlXyA9PSBydW5uYWJsZTsgfQorCisgIHRhc2tfaXRlcmF0b3IgaXRfOworCitwcml2YXRlOgogICBzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZV87CiAgIGZyaWVuZCBjbGFzcyBUaW1lck1hbmFnZXI6OkRpc3BhdGNoZXI7CiAgIFNUQVRFIHN0YXRlXzsKIH07CiAKLWNsYXNzIFRpbWVyTWFuYWdlcjo6RGlzcGF0Y2hlcjogcHVibGljIFJ1bm5hYmxlIHsKK2NsYXNzIFRpbWVyTWFuYWdlcjo6RGlzcGF0Y2hlciA6IHB1YmxpYyBSdW5uYWJsZSB7CiAKLSBwdWJsaWM6Ci0gIERpc3BhdGNoZXIoVGltZXJNYW5hZ2VyKiBtYW5hZ2VyKSA6Ci0gICAgbWFuYWdlcl8obWFuYWdlcikge30KK3B1YmxpYzoKKyAgRGlzcGF0Y2hlcihUaW1lck1hbmFnZXIqIG1hbmFnZXIpIDogbWFuYWdlcl8obWFuYWdlcikge30KIAogICB+RGlzcGF0Y2hlcigpIHt9CiAKQEAgLTkzLDE2ICs5MSwxOSBAQAogICAgICAgICBTeW5jaHJvbml6ZWQgcyhtYW5hZ2VyXy0+bW9uaXRvcl8pOwogICAgICAgICB0YXNrX2l0ZXJhdG9yIGV4cGlyZWRUYXNrRW5kOwogICAgICAgICBpbnQ2NF90IG5vdyA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7Ci0gICAgICAgIHdoaWxlIChtYW5hZ2VyXy0+c3RhdGVfID09IFRpbWVyTWFuYWdlcjo6U1RBUlRFRCAmJgotICAgICAgICAgICAgICAgKGV4cGlyZWRUYXNrRW5kID0gbWFuYWdlcl8tPnRhc2tNYXBfLnVwcGVyX2JvdW5kKG5vdykpID09IG1hbmFnZXJfLT50YXNrTWFwXy5iZWdpbigpKSB7CisgICAgICAgIHdoaWxlIChtYW5hZ2VyXy0+c3RhdGVfID09IFRpbWVyTWFuYWdlcjo6U1RBUlRFRAorICAgICAgICAgICAgICAgJiYgKGV4cGlyZWRUYXNrRW5kID0gbWFuYWdlcl8tPnRhc2tNYXBfLnVwcGVyX2JvdW5kKG5vdykpCisgICAgICAgICAgICAgICAgICA9PSBtYW5hZ2VyXy0+dGFza01hcF8uYmVnaW4oKSkgewogICAgICAgICAgIGludDY0X3QgdGltZW91dCA9IDBMTDsKICAgICAgICAgICBpZiAoIW1hbmFnZXJfLT50YXNrTWFwXy5lbXB0eSgpKSB7CiAgICAgICAgICAgICB0aW1lb3V0ID0gbWFuYWdlcl8tPnRhc2tNYXBfLmJlZ2luKCktPmZpcnN0IC0gbm93OwogICAgICAgICAgIH0KLSAgICAgICAgICBhc3NlcnQoKHRpbWVvdXQgIT0gMCAmJiBtYW5hZ2VyXy0+dGFza0NvdW50XyA+IDApIHx8ICh0aW1lb3V0ID09IDAgJiYgbWFuYWdlcl8tPnRhc2tDb3VudF8gPT0gMCkpOworICAgICAgICAgIGFzc2VydCgodGltZW91dCAhPSAwICYmIG1hbmFnZXJfLT50YXNrQ291bnRfID4gMCkKKyAgICAgICAgICAgICAgICAgfHwgKHRpbWVvdXQgPT0gMCAmJiBtYW5hZ2VyXy0+dGFza0NvdW50XyA9PSAwKSk7CiAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIG1hbmFnZXJfLT5tb25pdG9yXy53YWl0KHRpbWVvdXQpOwotICAgICAgICAgIH0gY2F0Y2ggKFRpbWVkT3V0RXhjZXB0aW9uICYpIHt9CisgICAgICAgICAgfSBjYXRjaCAoVGltZWRPdXRFeGNlcHRpb24mKSB7CisgICAgICAgICAgfQogICAgICAgICAgIG5vdyA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7CiAgICAgICAgIH0KIApAQCAtMTEwLDYgKzExMSw3IEBACiAgICAgICAgICAgZm9yICh0YXNrX2l0ZXJhdG9yIGl4ID0gbWFuYWdlcl8tPnRhc2tNYXBfLmJlZ2luKCk7IGl4ICE9IGV4cGlyZWRUYXNrRW5kOyBpeCsrKSB7CiAgICAgICAgICAgICBzaGFyZWRfcHRyPFRpbWVyTWFuYWdlcjo6VGFzaz4gdGFzayA9IGl4LT5zZWNvbmQ7CiAgICAgICAgICAgICBleHBpcmVkVGFza3MuaW5zZXJ0KHRhc2spOworICAgICAgICAgICAgdGFzay0+aXRfID0gbWFuYWdlcl8tPnRhc2tNYXBfLmVuZCgpOwogICAgICAgICAgICAgaWYgKHRhc2stPnN0YXRlXyA9PSBUaW1lck1hbmFnZXI6OlRhc2s6OldBSVRJTkcpIHsKICAgICAgICAgICAgICAgdGFzay0+c3RhdGVfID0gVGltZXJNYW5hZ2VyOjpUYXNrOjpFWEVDVVRJTkc7CiAgICAgICAgICAgICB9CkBAIC0xMTksNyArMTIxLDkgQEAKICAgICAgICAgfQogICAgICAgfQogCi0gICAgICBmb3IgKHN0ZDo6c2V0PHNoYXJlZF9wdHI8VGFzaz4gPjo6aXRlcmF0b3IgaXggPSAgZXhwaXJlZFRhc2tzLmJlZ2luKCk7IGl4ICE9IGV4cGlyZWRUYXNrcy5lbmQoKTsgaXgrKykgeworICAgICAgZm9yIChzdGQ6OnNldDxzaGFyZWRfcHRyPFRhc2s+ID46Oml0ZXJhdG9yIGl4ID0gZXhwaXJlZFRhc2tzLmJlZ2luKCk7CisgICAgICAgICAgIGl4ICE9IGV4cGlyZWRUYXNrcy5lbmQoKTsKKyAgICAgICAgICAgKytpeCkgewogICAgICAgICAoKml4KS0+cnVuKCk7CiAgICAgICB9CiAKQEAgLTEzNSwyMCArMTM5LDIwIEBACiAgICAgcmV0dXJuOwogICB9CiAKLSBwcml2YXRlOgorcHJpdmF0ZToKICAgVGltZXJNYW5hZ2VyKiBtYW5hZ2VyXzsKICAgZnJpZW5kIGNsYXNzIFRpbWVyTWFuYWdlcjsKIH07CiAKICNpZiBkZWZpbmVkKF9NU0NfVkVSKQogI3ByYWdtYSB3YXJuaW5nKHB1c2gpCi0jcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTogNDM1NSkgLy8gJ3RoaXMnIHVzZWQgaW4gYmFzZSBtZW1iZXIgaW5pdGlhbGl6ZXIgbGlzdAorI3ByYWdtYSB3YXJuaW5nKGRpc2FibGUgOiA0MzU1KSAvLyAndGhpcycgdXNlZCBpbiBiYXNlIG1lbWJlciBpbml0aWFsaXplciBsaXN0CiAjZW5kaWYKIAotVGltZXJNYW5hZ2VyOjpUaW1lck1hbmFnZXIoKSA6Ci0gIHRhc2tDb3VudF8oMCksCi0gIHN0YXRlXyhUaW1lck1hbmFnZXI6OlVOSU5JVElBTElaRUQpLAotICBkaXNwYXRjaGVyXyhzaGFyZWRfcHRyPERpc3BhdGNoZXI+KG5ldyBEaXNwYXRjaGVyKHRoaXMpKSkgeworVGltZXJNYW5hZ2VyOjpUaW1lck1hbmFnZXIoKQorICA6IHRhc2tDb3VudF8oMCksCisgICAgc3RhdGVfKFRpbWVyTWFuYWdlcjo6VU5JTklUSUFMSVpFRCksCisgICAgZGlzcGF0Y2hlcl8oc2hhcmVkX3B0cjxEaXNwYXRjaGVyPihuZXcgRGlzcGF0Y2hlcih0aGlzKSkpIHsKIH0KIAogI2lmIGRlZmluZWQoX01TQ19WRVIpCkBAIC0xNjMsOSArMTY3LDggQEAKICAgaWYgKHN0YXRlXyAhPSBTVE9QUEVEKSB7CiAgICAgdHJ5IHsKICAgICAgIHN0b3AoKTsKLSAgICB9IGNhdGNoKC4uLikgewotICAgICAgdGhyb3c7Ci0gICAgICAvLyB1aG9oCisgICAgfSBjYXRjaCAoLi4uKSB7CisgICAgICAvLyBXZSdyZSByZWFsbHkgaG9zZWQuCiAgICAgfQogICB9CiB9CkBAIC0yMDMsNyArMjA2LDcgQEAKICAgICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yXyk7CiAgICAgaWYgKHN0YXRlXyA9PSBUaW1lck1hbmFnZXI6OlVOSU5JVElBTElaRUQpIHsKICAgICAgIHN0YXRlXyA9IFRpbWVyTWFuYWdlcjo6U1RPUFBFRDsKLSAgICB9IGVsc2UgaWYgKHN0YXRlXyAhPSBTVE9QUElORyAmJiAgc3RhdGVfICE9IFNUT1BQRUQpIHsKKyAgICB9IGVsc2UgaWYgKHN0YXRlXyAhPSBTVE9QUElORyAmJiBzdGF0ZV8gIT0gU1RPUFBFRCkgewogICAgICAgZG9TdG9wID0gdHJ1ZTsKICAgICAgIHN0YXRlXyA9IFNUT1BQSU5HOwogICAgICAgbW9uaXRvcl8ubm90aWZ5QWxsKCk7CkBAIC0yMjcsNyArMjMwLDcgQEAKICAgcmV0dXJuIHRocmVhZEZhY3RvcnlfOwogfQogCi12b2lkIFRpbWVyTWFuYWdlcjo6dGhyZWFkRmFjdG9yeShzaGFyZWRfcHRyPGNvbnN0IFRocmVhZEZhY3Rvcnk+ICB2YWx1ZSkgewordm9pZCBUaW1lck1hbmFnZXI6OnRocmVhZEZhY3Rvcnkoc2hhcmVkX3B0cjxjb25zdCBUaHJlYWRGYWN0b3J5PiB2YWx1ZSkgewogICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yXyk7CiAgIHRocmVhZEZhY3RvcnlfID0gdmFsdWU7CiB9CkBAIC0yMzYsNyArMjM5LDcgQEAKICAgcmV0dXJuIHRhc2tDb3VudF87CiB9CiAKLXZvaWQgVGltZXJNYW5hZ2VyOjphZGQoc2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzaywgaW50NjRfdCB0aW1lb3V0KSB7CitUaW1lck1hbmFnZXI6OlRpbWVyIFRpbWVyTWFuYWdlcjo6YWRkKHNoYXJlZF9wdHI8UnVubmFibGU+IHRhc2ssIGludDY0X3QgdGltZW91dCkgewogICBpbnQ2NF90IG5vdyA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7CiAgIHRpbWVvdXQgKz0gbm93OwogCkBAIC0yNTEsOCArMjU0LDkgQEAKICAgICAvLyBiZWNhdXNlIHRoZSBuZXcgdGFzayBtaWdodCBpbnNlcnQgYXQgdGhlIGZyb250LgogICAgIGJvb2wgbm90aWZ5UmVxdWlyZWQgPSAodGFza0NvdW50XyA9PSAwKSA/IHRydWUgOiB0aW1lb3V0IDwgdGFza01hcF8uYmVnaW4oKS0+Zmlyc3Q7CiAKKyAgICBzaGFyZWRfcHRyPFRhc2s+IHRpbWVyKG5ldyBUYXNrKHRhc2spKTsKICAgICB0YXNrQ291bnRfKys7Ci0gICAgdGFza01hcF8uaW5zZXJ0KHN0ZDo6cGFpcjxpbnQ2NF90LCBzaGFyZWRfcHRyPFRhc2s+ID4odGltZW91dCwgc2hhcmVkX3B0cjxUYXNrPihuZXcgVGFzayh0YXNrKSkpKTsKKyAgICB0aW1lci0+aXRfID0gdGFza01hcF8uaW5zZXJ0KHN0ZDo6cGFpcjxpbnQ2NF90LCBzaGFyZWRfcHRyPFRhc2s+ID4odGltZW91dCwgdGltZXIpKTsKIAogICAgIC8vIElmIHRoZSB0YXNrIG1hcCB3YXMgZW1wdHksIG9yIGlmIHdlIGhhdmUgYW4gZXhwaXJhdGlvbiB0aGF0IGlzIGVhcmxpZXIKICAgICAvLyB0aGFuIGFueSBwcmV2aW91c2x5IHNlZW4sIGtpY2sgdGhlIGRpc3BhdGNoZXIgc28gaXQgY2FuIHVwZGF0ZSBpdHMKQEAgLTI2MCwxMCArMjY0LDEzIEBACiAgICAgaWYgKG5vdGlmeVJlcXVpcmVkKSB7CiAgICAgICBtb25pdG9yXy5ub3RpZnkoKTsKICAgICB9CisKKyAgICByZXR1cm4gdGltZXI7CiAgIH0KIH0KIAotdm9pZCBUaW1lck1hbmFnZXI6OmFkZChzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrLCBjb25zdCBzdHJ1Y3QgVEhSSUZUX1RJTUVTUEVDJiB2YWx1ZSkgeworVGltZXJNYW5hZ2VyOjpUaW1lciBUaW1lck1hbmFnZXI6OmFkZChzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrLAorICAgIGNvbnN0IHN0cnVjdCBUSFJJRlRfVElNRVNQRUMmIHZhbHVlKSB7CiAKICAgaW50NjRfdCBleHBpcmF0aW9uOwogICBVdGlsOjp0b01pbGxpc2Vjb25kcyhleHBpcmF0aW9uLCB2YWx1ZSk7CkBAIC0yNzEsMTMgKzI3OCwxNCBAQAogICBpbnQ2NF90IG5vdyA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7CiAKICAgaWYgKGV4cGlyYXRpb24gPCBub3cpIHsKLSAgICB0aHJvdyAgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgdGhyb3cgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCk7CiAgIH0KIAotICBhZGQodGFzaywgZXhwaXJhdGlvbiAtIG5vdyk7CisgIHJldHVybiBhZGQodGFzaywgZXhwaXJhdGlvbiAtIG5vdyk7CiB9CiAKLXZvaWQgVGltZXJNYW5hZ2VyOjphZGQoc2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzaywgY29uc3Qgc3RydWN0IHRpbWV2YWwmIHZhbHVlKSB7CitUaW1lck1hbmFnZXI6OlRpbWVyIFRpbWVyTWFuYWdlcjo6YWRkKHNoYXJlZF9wdHI8UnVubmFibGU+IHRhc2ssCisgICAgY29uc3Qgc3RydWN0IHRpbWV2YWwmIHZhbHVlKSB7CiAKICAgaW50NjRfdCBleHBpcmF0aW9uOwogICBVdGlsOjp0b01pbGxpc2Vjb25kcyhleHBpcmF0aW9uLCB2YWx1ZSk7CkBAIC0yODUsMjEgKzI5Myw1NSBAQAogICBpbnQ2NF90IG5vdyA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7CiAKICAgaWYgKGV4cGlyYXRpb24gPCBub3cpIHsKLSAgICB0aHJvdyAgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgdGhyb3cgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCk7CiAgIH0KIAotICBhZGQodGFzaywgZXhwaXJhdGlvbiAtIG5vdyk7CisgIHJldHVybiBhZGQodGFzaywgZXhwaXJhdGlvbiAtIG5vdyk7CiB9CiAKIHZvaWQgVGltZXJNYW5hZ2VyOjpyZW1vdmUoc2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzaykgewotICAodm9pZCkgdGFzazsKICAgU3luY2hyb25pemVkIHMobW9uaXRvcl8pOwogICBpZiAoc3RhdGVfICE9IFRpbWVyTWFuYWdlcjo6U1RBUlRFRCkgewogICAgIHRocm93IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwogICB9CisgIGJvb2wgZm91bmQgPSBmYWxzZTsKKyAgZm9yICh0YXNrX2l0ZXJhdG9yIGl4ID0gdGFza01hcF8uYmVnaW4oKTsgaXggIT0gdGFza01hcF8uZW5kKCk7KSB7CisgICAgaWYgKCppeC0+c2Vjb25kID09IHRhc2spIHsKKyAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgIHRhc2tDb3VudF8tLTsKKyAgICAgIHRhc2tNYXBfLmVyYXNlKGl4KyspOworICAgIH0gZWxzZSB7CisgICAgICArK2l4OworICAgIH0KKyAgfQorICBpZiAoIWZvdW5kKSB7CisgICAgdGhyb3cgTm9TdWNoVGFza0V4Y2VwdGlvbigpOworICB9CiB9CiAKLVRpbWVyTWFuYWdlcjo6U1RBVEUgVGltZXJNYW5hZ2VyOjpzdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIHN0YXRlXzsgfQordm9pZCBUaW1lck1hbmFnZXI6OnJlbW92ZShUaW1lciBoYW5kbGUpIHsKKyAgU3luY2hyb25pemVkIHMobW9uaXRvcl8pOworICBpZiAoc3RhdGVfICE9IFRpbWVyTWFuYWdlcjo6U1RBUlRFRCkgeworICAgIHRocm93IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICB9CiAKLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKKyAgc2hhcmVkX3B0cjxUYXNrPiB0YXNrID0gaGFuZGxlLmxvY2soKTsKKyAgaWYgKCF0YXNrKSB7CisgICAgdGhyb3cgTm9TdWNoVGFza0V4Y2VwdGlvbigpOworICB9CiAKKyAgaWYgKHRhc2stPml0XyA9PSB0YXNrTWFwXy5lbmQoKSkgeworICAgIC8vIFRhc2sgaXMgYmVpbmcgZXhlY3V0ZWQKKyAgICB0aHJvdyBVbmNhbmNlbGxhYmxlVGFza0V4Y2VwdGlvbigpOworICB9CisKKyAgdGFza01hcF8uZXJhc2UodGFzay0+aXRfKTsKKyAgdGFza0NvdW50Xy0tOworfQorCitUaW1lck1hbmFnZXI6OlNUQVRFIFRpbWVyTWFuYWdlcjo6c3RhdGUoKSBjb25zdCB7CisgIHJldHVybiBzdGF0ZV87Cit9Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1RpbWVyTWFuYWdlci5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1RpbWVyTWFuYWdlci5oCmluZGV4IGQ4MjAwY2IuLmJhNzkyMjYgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9UaW1lck1hbmFnZXIuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvVGltZXJNYW5hZ2VyLmgKQEAgLTI0LDExICsyNCwxMyBAQAogI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZC5oPgogCi0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+CisjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPG1hcD4KICNpbmNsdWRlIDx0aW1lLmg+CiAKLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgY29uY3VycmVuY3kgewogCiAvKioKICAqIFRpbWVyIE1hbmFnZXIKQEAgLTM5LDE1ICs0MSwxNyBAQAogICovCiBjbGFzcyBUaW1lck1hbmFnZXIgewogCi0gcHVibGljOgorcHVibGljOgorICBjbGFzcyBUYXNrOworICB0eXBlZGVmIHN0ZDo6d2Vha19wdHI8VGFzaz4gVGltZXI7CiAKICAgVGltZXJNYW5hZ2VyKCk7CiAKICAgdmlydHVhbCB+VGltZXJNYW5hZ2VyKCk7CiAKLSAgdmlydHVhbCBib29zdDo6c2hhcmVkX3B0cjxjb25zdCBUaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5KCkgY29uc3Q7CisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IFRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnkoKSBjb25zdDsKIAotICB2aXJ0dWFsIHZvaWQgdGhyZWFkRmFjdG9yeShib29zdDo6c2hhcmVkX3B0cjxjb25zdCBUaHJlYWRGYWN0b3J5PiB2YWx1ZSk7CisgIHZpcnR1YWwgdm9pZCB0aHJlYWRGYWN0b3J5KHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBUaHJlYWRGYWN0b3J5PiB2YWx1ZSk7CiAKICAgLyoqCiAgICAqIFN0YXJ0cyB0aGUgdGltZXIgbWFuYWdlciBzZXJ2aWNlCkBAIC02MSwzNSArNjUsNDAgQEAKICAgICovCiAgIHZpcnR1YWwgdm9pZCBzdG9wKCk7CiAKLSAgdmlydHVhbCBzaXplX3QgdGFza0NvdW50KCkgY29uc3QgOworICB2aXJ0dWFsIHNpemVfdCB0YXNrQ291bnQoKSBjb25zdDsKIAogICAvKioKICAgICogQWRkcyBhIHRhc2sgdG8gYmUgZXhlY3V0ZWQgYXQgc29tZSB0aW1lIGluIHRoZSBmdXR1cmUgYnkgYSB3b3JrZXIgdGhyZWFkLgogICAgKgogICAgKiBAcGFyYW0gdGFzayBUaGUgdGFzayB0byBleGVjdXRlCiAgICAqIEBwYXJhbSB0aW1lb3V0IFRpbWUgaW4gbWlsbGlzZWNvbmRzIHRvIGRlbGF5IGJlZm9yZSBleGVjdXRpbmcgdGFzaworICAgKiBAcmV0dXJuIEhhbmRsZSBvZiB0aGUgdGltZXIsIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHJlbW92ZSB0aGUgdGltZXIuCiAgICAqLwotICB2aXJ0dWFsIHZvaWQgYWRkKGJvb3N0OjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrLCBpbnQ2NF90IHRpbWVvdXQpOworICB2aXJ0dWFsIFRpbWVyIGFkZChzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+IHRhc2ssIGludDY0X3QgdGltZW91dCk7CiAKICAgLyoqCiAgICAqIEFkZHMgYSB0YXNrIHRvIGJlIGV4ZWN1dGVkIGF0IHNvbWUgdGltZSBpbiB0aGUgZnV0dXJlIGJ5IGEgd29ya2VyIHRocmVhZC4KICAgICoKICAgICogQHBhcmFtIHRhc2sgVGhlIHRhc2sgdG8gZXhlY3V0ZQogICAgKiBAcGFyYW0gdGltZW91dCBBYnNvbHV0ZSB0aW1lIGluIHRoZSBmdXR1cmUgdG8gZXhlY3V0ZSB0YXNrLgorICAgKiBAcmV0dXJuIEhhbmRsZSBvZiB0aGUgdGltZXIsIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHJlbW92ZSB0aGUgdGltZXIuCiAgICAqLwotICB2aXJ0dWFsIHZvaWQgYWRkKGJvb3N0OjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrLCBjb25zdCBzdHJ1Y3QgVEhSSUZUX1RJTUVTUEVDJiB0aW1lb3V0KTsKKyAgdmlydHVhbCBUaW1lciBhZGQoc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrLCBjb25zdCBzdHJ1Y3QgVEhSSUZUX1RJTUVTUEVDJiB0aW1lb3V0KTsKIAogICAvKioKICAgICogQWRkcyBhIHRhc2sgdG8gYmUgZXhlY3V0ZWQgYXQgc29tZSB0aW1lIGluIHRoZSBmdXR1cmUgYnkgYSB3b3JrZXIgdGhyZWFkLgogICAgKgogICAgKiBAcGFyYW0gdGFzayBUaGUgdGFzayB0byBleGVjdXRlCiAgICAqIEBwYXJhbSB0aW1lb3V0IEFic29sdXRlIHRpbWUgaW4gdGhlIGZ1dHVyZSB0byBleGVjdXRlIHRhc2suCisgICAqIEByZXR1cm4gSGFuZGxlIG9mIHRoZSB0aW1lciwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gcmVtb3ZlIHRoZSB0aW1lci4KICAgICovCi0gIHZpcnR1YWwgdm9pZCBhZGQoYm9vc3Q6OnNoYXJlZF9wdHI8UnVubmFibGU+IHRhc2ssIGNvbnN0IHN0cnVjdCB0aW1ldmFsJiB0aW1lb3V0KTsKKyAgdmlydHVhbCBUaW1lciBhZGQoc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrLCBjb25zdCBzdHJ1Y3QgdGltZXZhbCYgdGltZW91dCk7CiAKICAgLyoqCiAgICAqIFJlbW92ZXMgYSBwZW5kaW5nIHRhc2sKICAgICoKKyAgICogQHBhcmFtIHRhc2sgVGhlIHRhc2sgdG8gcmVtb3ZlLiBBbGwgdGltZXJzIHdoaWNoIGV4ZWN1dGUgdGhpcyB0YXNrIHdpbGwKKyAgICogYmUgcmVtb3ZlZC4KICAgICogQHRocm93cyBOb1N1Y2hUYXNrRXhjZXB0aW9uIFNwZWNpZmllZCB0YXNrIGRvZXNuJ3QgZXhpc3QuIEl0IHdhcyBlaXRoZXIKICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZCBhbHJlYWR5IG9yIHRoaXMgY2FsbCB3YXMgbWFkZSBmb3IgYQogICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFzayB0aGF0IHdhcyBuZXZlciBhZGRlZCB0byB0aGlzIHRpbWVyCkBAIC05NywzNCArMTA2LDQyIEBACiAgICAqIEB0aHJvd3MgVW5jYW5jZWxsYWJsZVRhc2tFeGNlcHRpb24gU3BlY2lmaWVkIHRhc2sgaXMgYWxyZWFkeSBiZWluZwogICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVkIG9yIGhhcyBjb21wbGV0ZWQgZXhlY3V0aW9uLgogICAgKi8KLSAgdmlydHVhbCB2b2lkIHJlbW92ZShib29zdDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzayk7CisgIHZpcnR1YWwgdm9pZCByZW1vdmUoc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrKTsKIAotICBlbnVtIFNUQVRFIHsKLSAgICBVTklOSVRJQUxJWkVELAotICAgIFNUQVJUSU5HLAotICAgIFNUQVJURUQsCi0gICAgU1RPUFBJTkcsCi0gICAgU1RPUFBFRAotICB9OworICAvKioKKyAgICogUmVtb3ZlcyBhIHNpbmdsZSBwZW5kaW5nIHRhc2sKKyAgICoKKyAgICogQHBhcmFtIHRpbWVyIFRoZSB0aW1lciB0byByZW1vdmUuIFRoZSB0aW1lciBpcyByZXR1cm5lZCB3aGVuIGNhbGxpbmcgdGhlCisgICAqIGFkZCgpIG1ldGhvZC4KKyAgICogQHRocm93cyBOb1N1Y2hUYXNrRXhjZXB0aW9uIFNwZWNpZmllZCB0YXNrIGRvZXNuJ3QgZXhpc3QuIEl0IHdhcyBlaXRoZXIKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZCBhbHJlYWR5IG9yIHRoaXMgY2FsbCB3YXMgbWFkZSBmb3IgYQorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFzayB0aGF0IHdhcyBuZXZlciBhZGRlZCB0byB0aGlzIHRpbWVyCisgICAqCisgICAqIEB0aHJvd3MgVW5jYW5jZWxsYWJsZVRhc2tFeGNlcHRpb24gU3BlY2lmaWVkIHRhc2sgaXMgYWxyZWFkeSBiZWluZworICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVkIG9yIGhhcyBjb21wbGV0ZWQgZXhlY3V0aW9uLgorICAgKi8KKyAgdmlydHVhbCB2b2lkIHJlbW92ZShUaW1lciB0aW1lcik7CisKKyAgZW51bSBTVEFURSB7IFVOSU5JVElBTElaRUQsIFNUQVJUSU5HLCBTVEFSVEVELCBTVE9QUElORywgU1RPUFBFRCB9OwogCiAgIHZpcnR1YWwgU1RBVEUgc3RhdGUoKSBjb25zdDsKIAotIHByaXZhdGU6Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPGNvbnN0IFRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnlfOwotICBjbGFzcyBUYXNrOworcHJpdmF0ZToKKyAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IFRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnlfOwogICBmcmllbmQgY2xhc3MgVGFzazsKLSAgc3RkOjptdWx0aW1hcDxpbnQ2NF90LCBib29zdDo6c2hhcmVkX3B0cjxUYXNrPiA+IHRhc2tNYXBfOworICBzdGQ6Om11bHRpbWFwPGludDY0X3QsIHN0ZDo6c2hhcmVkX3B0cjxUYXNrPiA+IHRhc2tNYXBfOwogICBzaXplX3QgdGFza0NvdW50XzsKICAgTW9uaXRvciBtb25pdG9yXzsKICAgU1RBVEUgc3RhdGVfOwogICBjbGFzcyBEaXNwYXRjaGVyOwogICBmcmllbmQgY2xhc3MgRGlzcGF0Y2hlcjsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8RGlzcGF0Y2hlcj4gZGlzcGF0Y2hlcl87Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZD4gZGlzcGF0Y2hlclRocmVhZF87Ci0gIHR5cGVkZWYgc3RkOjptdWx0aW1hcDxpbnQ2NF90LCBib29zdDo6c2hhcmVkX3B0cjxUaW1lck1hbmFnZXI6OlRhc2s+ID46Oml0ZXJhdG9yIHRhc2tfaXRlcmF0b3I7CisgIHN0ZDo6c2hhcmVkX3B0cjxEaXNwYXRjaGVyPiBkaXNwYXRjaGVyXzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRocmVhZD4gZGlzcGF0Y2hlclRocmVhZF87CisgIHR5cGVkZWYgc3RkOjptdWx0aW1hcDxpbnQ2NF90LCBzdGQ6OnNoYXJlZF9wdHI8VGltZXJNYW5hZ2VyOjpUYXNrPiA+OjppdGVyYXRvciB0YXNrX2l0ZXJhdG9yOwogICB0eXBlZGVmIHN0ZDo6cGFpcjx0YXNrX2l0ZXJhdG9yLCB0YXNrX2l0ZXJhdG9yPiB0YXNrX3JhbmdlOwogfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKIAogI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9DT05DVVJSRU5DWV9USU1FUk1BTkFHRVJfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9VdGlsLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9VdGlsLmNwcAppbmRleCA3ZDkwODVlLi5kZDZkMTlmIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvVXRpbC5jcHAKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1V0aWwuY3BwCkBAIC0yNiwxNiArMjYsMTkgQEAKICNpbmNsdWRlIDxzeXMvdGltZS5oPgogI2VuZGlmCiAKLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgY29uY3VycmVuY3kgewogCiBpbnQ2NF90IFV0aWw6OmN1cnJlbnRUaW1lVGlja3MoaW50NjRfdCB0aWNrc1BlclNlYykgewogICBpbnQ2NF90IHJlc3VsdDsKICAgc3RydWN0IHRpbWV2YWwgbm93OwogICBpbnQgcmV0ID0gVEhSSUZUX0dFVFRJTUVPRkRBWSgmbm93LCBOVUxMKTsKICAgYXNzZXJ0KHJldCA9PSAwKTsKLSAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRShyZXQpOyAvL3NxdWVsY2hpbmcgInVudXNlZCB2YXJpYWJsZSIgd2FybmluZworICBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFKHJldCk7IC8vIHNxdWVsY2hpbmcgInVudXNlZCB2YXJpYWJsZSIgd2FybmluZwogICB0b1RpY2tzKHJlc3VsdCwgbm93LCB0aWNrc1BlclNlYyk7CiAgIHJldHVybiByZXN1bHQ7CiB9Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvVXRpbC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1V0aWwuaAppbmRleCA2M2Q4MGEyLi4xYTkxNTk5IDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvVXRpbC5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9VdGlsLmgKQEAgLTMxLDcgKzMxLDkgQEAKIAogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvUGxhdGZvcm1Tb2NrZXQuaD4KIAotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgY29uY3VycmVuY3kgeworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBjb25jdXJyZW5jeSB7CiAKIC8qKgogICogVXRpbGl0eSBtZXRob2RzCkBAIC01NSw4ICs1Nyw3IEBACiAgIHN0YXRpYyBjb25zdCBpbnQ2NF90IE5TX1BFUl9VUyA9IE5TX1BFUl9TIC8gVVNfUEVSX1M7CiAgIHN0YXRpYyBjb25zdCBpbnQ2NF90IFVTX1BFUl9NUyA9IFVTX1BFUl9TIC8gTVNfUEVSX1M7CiAKLSBwdWJsaWM6Ci0KK3B1YmxpYzoKICAgLyoqCiAgICAqIENvbnZlcnRzIG1pbGxpc2Vjb25kIHRpbWVzdGFtcCBpbnRvIGEgVEhSSUZUX1RJTUVTUEVDIHN0cnVjdAogICAgKgpAQCAtNjQsMTcgKzY1LDIwIEBACiAgICAqIEBwYXJhbSB0aW1lIG9yIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcwogICAgKi8KICAgc3RhdGljIHZvaWQgdG9UaW1lc3BlYyhzdHJ1Y3QgVEhSSUZUX1RJTUVTUEVDJiByZXN1bHQsIGludDY0X3QgdmFsdWUpIHsKLSAgICByZXN1bHQudHZfc2VjID0gdmFsdWUgLyBNU19QRVJfUzsgLy8gbXMgdG8gcworICAgIHJlc3VsdC50dl9zZWMgPSB2YWx1ZSAvIE1TX1BFUl9TOyAgICAgICAgICAgICAgICAvLyBtcyB0byBzCiAgICAgcmVzdWx0LnR2X25zZWMgPSAodmFsdWUgJSBNU19QRVJfUykgKiBOU19QRVJfTVM7IC8vIG1zIHRvIG5zCiAgIH0KIAogICBzdGF0aWMgdm9pZCB0b1RpbWV2YWwoc3RydWN0IHRpbWV2YWwmIHJlc3VsdCwgaW50NjRfdCB2YWx1ZSkgewotICAgIHJlc3VsdC50dl9zZWMgID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHZhbHVlIC8gTVNfUEVSX1MpOyAvLyBtcyB0byBzCisgICAgcmVzdWx0LnR2X3NlYyA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pih2YWx1ZSAvIE1TX1BFUl9TKTsgICAgICAgICAgICAgICAgLy8gbXMgdG8gcwogICAgIHJlc3VsdC50dl91c2VjID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KCh2YWx1ZSAlIE1TX1BFUl9TKSAqIFVTX1BFUl9NUyk7IC8vIG1zIHRvIHVzCiAgIH0KIAotICBzdGF0aWMgdm9pZCB0b1RpY2tzKGludDY0X3QmIHJlc3VsdCwgaW50NjRfdCBzZWNzLCBpbnQ2NF90IG9sZFRpY2tzLAotICAgICAgICAgICAgICAgICAgICAgIGludDY0X3Qgb2xkVGlja3NQZXJTZWMsIGludDY0X3QgbmV3VGlja3NQZXJTZWMpIHsKKyAgc3RhdGljIHZvaWQgdG9UaWNrcyhpbnQ2NF90JiByZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBzZWNzLAorICAgICAgICAgICAgICAgICAgICAgIGludDY0X3Qgb2xkVGlja3MsCisgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBvbGRUaWNrc1BlclNlYywKKyAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IG5ld1RpY2tzUGVyU2VjKSB7CiAgICAgcmVzdWx0ID0gc2VjcyAqIG5ld1RpY2tzUGVyU2VjOwogICAgIHJlc3VsdCArPSBvbGRUaWNrcyAqIG5ld1RpY2tzUGVyU2VjIC8gb2xkVGlja3NQZXJTZWM7CiAKQEAgLTg2LDM0ICs5MCwyOCBAQAogICAvKioKICAgICogQ29udmVydHMgc3RydWN0IFRIUklGVF9USU1FU1BFQyB0byBhcmJpdHJhcnktc2l6ZWQgdGlja3Mgc2luY2UgZXBvY2gKICAgICovCi0gIHN0YXRpYyB2b2lkIHRvVGlja3MoaW50NjRfdCYgcmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBUSFJJRlRfVElNRVNQRUMmIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGlja3NQZXJTZWMpIHsKKyAgc3RhdGljIHZvaWQgdG9UaWNrcyhpbnQ2NF90JiByZXN1bHQsIGNvbnN0IHN0cnVjdCBUSFJJRlRfVElNRVNQRUMmIHZhbHVlLCBpbnQ2NF90IHRpY2tzUGVyU2VjKSB7CiAgICAgcmV0dXJuIHRvVGlja3MocmVzdWx0LCB2YWx1ZS50dl9zZWMsIHZhbHVlLnR2X25zZWMsIE5TX1BFUl9TLCB0aWNrc1BlclNlYyk7CiAgIH0KIAogICAvKioKICAgICogQ29udmVydHMgc3RydWN0IHRpbWV2YWwgdG8gYXJiaXRyYXJ5LXNpemVkIHRpY2tzIHNpbmNlIGVwb2NoCiAgICAqLwotICBzdGF0aWMgdm9pZCB0b1RpY2tzKGludDY0X3QmIHJlc3VsdCwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgdGltZXZhbCYgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aWNrc1BlclNlYykgewotICAgIHJldHVybiB0b1RpY2tzKHJlc3VsdCwgdmFsdWUudHZfc2VjLCB2YWx1ZS50dl91c2VjLCBVU19QRVJfUywgdGlja3NQZXJTZWMpOworICBzdGF0aWMgdm9pZCB0b1RpY2tzKGludDY0X3QmIHJlc3VsdCwgY29uc3Qgc3RydWN0IHRpbWV2YWwmIHZhbHVlLCBpbnQ2NF90IHRpY2tzUGVyU2VjKSB7CisgICAgcmV0dXJuIHRvVGlja3MocmVzdWx0LCAodW5zaWduZWQgbG9uZyl2YWx1ZS50dl9zZWMsICh1bnNpZ25lZCBsb25nKXZhbHVlLnR2X3VzZWMsIFVTX1BFUl9TLCB0aWNrc1BlclNlYyk7CiAgIH0KIAogICAvKioKICAgICogQ29udmVydHMgc3RydWN0IFRIUklGVF9USU1FU1BFQyB0byBtaWxsaXNlY29uZHMKICAgICovCi0gIHN0YXRpYyB2b2lkIHRvTWlsbGlzZWNvbmRzKGludDY0X3QmIHJlc3VsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IFRIUklGVF9USU1FU1BFQyYgdmFsdWUpIHsKKyAgc3RhdGljIHZvaWQgdG9NaWxsaXNlY29uZHMoaW50NjRfdCYgcmVzdWx0LCBjb25zdCBzdHJ1Y3QgVEhSSUZUX1RJTUVTUEVDJiB2YWx1ZSkgewogICAgIHJldHVybiB0b1RpY2tzKHJlc3VsdCwgdmFsdWUsIE1TX1BFUl9TKTsKICAgfQogCiAgIC8qKgogICAgKiBDb252ZXJ0cyBzdHJ1Y3QgdGltZXZhbCB0byBtaWxsaXNlY29uZHMKICAgICovCi0gIHN0YXRpYyB2b2lkIHRvTWlsbGlzZWNvbmRzKGludDY0X3QmIHJlc3VsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHRpbWV2YWwmIHZhbHVlKSB7CisgIHN0YXRpYyB2b2lkIHRvTWlsbGlzZWNvbmRzKGludDY0X3QmIHJlc3VsdCwgY29uc3Qgc3RydWN0IHRpbWV2YWwmIHZhbHVlKSB7CiAgICAgcmV0dXJuIHRvVGlja3MocmVzdWx0LCB2YWx1ZSwgTVNfUEVSX1MpOwogICB9CiAKQEAgLTE0Niw3ICsxNDQsOCBAQAogICAgKi8KICAgc3RhdGljIGludDY0X3QgY3VycmVudFRpbWVVc2VjKCkgeyByZXR1cm4gY3VycmVudFRpbWVUaWNrcyhVU19QRVJfUyk7IH0KIH07Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5CiAKICNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfQ09OQ1VSUkVOQ1lfVVRJTF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2N4eGZ1bmN0aW9uYWwuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9jeHhmdW5jdGlvbmFsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyNGI5MWIuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L2N4eGZ1bmN0aW9uYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9DWFhGVU5DVElPTkFMX0hfCi0jZGVmaW5lIF9USFJJRlRfQ1hYRlVOQ1RJT05BTF9IXyAxCi0KLS8qKgotICogTG9hZHMgPGZ1bmN0aW9uYWw+IGZyb20gdGhlICdyaWdodCcgbG9jYXRpb24sIGRlcGVuZGluZwotICogb24gY29tcGlsZXIgYW5kIHdoZXRoZXIgb3Igbm90IGl0J3MgdXNpbmcgQysrMDMgd2l0aCBUUjEKLSAqIG9yIEMrKzExLgotICovCi0KLS8qCi0gKiBNU1ZDIDEwIGFuZCAxMSBoYXZlIHRoZSA8ZnVuY3Rpb25hbD4gc3R1ZmYgYXQgPGZ1bmN0aW9uYWw+LgotICogSW4gTVNWQyAxMCBhbGwgb2YgdGhlIGltcGxlbWVudGF0aW9ucyBsaXZlIGluIHN0ZDo6dHIxLgotICogSW4gTVNWQyAxMSBhbGwgb2YgdGhlIGltcGxlbWVudGF0aW9ucyBsaXZlIGluIHN0ZCwgd2l0aCBhbGlhc2VzCi0gKiAgaW4gc3RkOjp0cjEgdG8gcG9pbnQgdG8gdGhlIG9uZXMgaW4gc3RkLgotICovCi0jaWZkZWYgX1dJTjMyCi0gICNkZWZpbmUgX1RIUklGVF9VU0lOR19NSUNST1NPRlRfU1RETElCIDEKLSNlbmRpZgotCi0jaWZkZWYgX19jbGFuZ19fCi0gIC8qIENsYW5nIGhhcyB0d28gb3B0aW9ucywgZGVwZW5kaW5nIG9uIHN0YW5kYXJkIGxpYnJhcnk6Ci0gICAqIC0gbm8gLXN0ZGxpYiBvciAtc3RkbGliPWxpYnN0ZGMrKyBzZXQ7IHVzZXMgR05VIGxpYnN0ZGMrKy4KLSAgICogICAgPHRyMS9mdW5jdGlvbmFsPgotICAgKiAtIC1zdGRsaWI9bGliYysrOyB1c2VzIExMVk0gbGliYysrLgotICAgKiAgICA8ZnVuY3Rpb25hbD4sIG5vICdzdGQ6OnRyMScuCi0gICAqCi0gICAqIFRoZSBjb21waWxlciBpdHNlbGYgZG9lc24ndCBkZWZpbmUgYW55dGhpbmcgZGlmZmVyZW50bHkKLSAgICogZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBvZiAtc3RkbGliLCBidXQgdGhlIGxpYnJhcnkgaGVhZGVycwotICAgKiB3aWxsIHNldCBkaWZmZXJlbnQgcHJlcHJvY2Vzc29yIG9wdGlvbnMuIEluIG9yZGVyIHRvIGNoZWNrLAotICAgKiB0aG91Z2gsIHdlIGhhdmUgdG8gcHVsbCBpbiBzb21lIGxpYnJhcnkgaGVhZGVyLgotICAgKi8KLSAgI2luY2x1ZGUgPHV0aWxpdHk+Ci0KLSAgLyogV2l0aCBMTFZNIGxpYmMrKywgdXRpbGl0eSBwdWxscyBpbiBfX2NvbmZpZywgd2hpY2ggc2V0cwotICAgICBfTElCQ1BQX1ZFUlNJT04uICovCi0gICNpZiBkZWZpbmVkKF9MSUJDUFBfVkVSU0lPTikKLSAgICAjZGVmaW5lIF9USFJJRlRfVVNJTkdfQ0xBTkdfTElCQ1hYIDEKLQotICAvKiBXaXRoIEdOVSBsaWJzdGRjKyssIHV0aWxpdHkgcHVsbHMgaW4gYml0cy9jKytjb25maWcuaCwKLSAgICAgd2hpY2ggc2V0cyBfX0dMSUJDWFhfXy4gKi8KLSAgI2VsaWYgZGVmaW5lZChfX0dMSUJDWFhfXykKLSAgICAjZGVmaW5lIF9USFJJRlRfVVNJTkdfR05VX0xJQlNURENYWCAxCi0KLSAgLyogTm8gaWRlYS4gKi8KLSAgI2Vsc2UKLSAgICAjZXJyb3IgVW5hYmxlIHRvIGRldGVjdCB3aGljaCBDKysgc3RhbmRhcmQgbGlicmFyeSBpcyBpbiB1c2UuCi0gICNlbmRpZgotI2VsaWYgX19HTlVDX18KLSAgI2RlZmluZSBfVEhSSUZUX1VTSU5HX0dOVV9MSUJTVERDWFggMQotI2VuZGlmCi0KLSNpZiBfVEhSSUZUX1VTSU5HX01JQ1JPU09GVF9TVERMSUIKLSAgI2luY2x1ZGUgPGZ1bmN0aW9uYWw+Ci0KLSAgbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2Ugc3RkY3h4IHsKLSAgICB1c2luZyA6OnN0ZDo6dHIxOjpmdW5jdGlvbjsKLSAgICB1c2luZyA6OnN0ZDo6dHIxOjpiaW5kOwotCi0gICAgbmFtZXNwYWNlIHBsYWNlaG9sZGVycyB7Ci0gICAgICB1c2luZyA6OnN0ZDo6dHIxOjpwbGFjZWhvbGRlcnM6Ol8xOwotICAgICAgdXNpbmcgOjpzdGQ6OnRyMTo6cGxhY2Vob2xkZXJzOjpfMjsKLSAgICAgIHVzaW5nIDo6c3RkOjp0cjE6OnBsYWNlaG9sZGVyczo6XzM7Ci0gICAgICB1c2luZyA6OnN0ZDo6dHIxOjpwbGFjZWhvbGRlcnM6Ol80OwotICAgICAgdXNpbmcgOjpzdGQ6OnRyMTo6cGxhY2Vob2xkZXJzOjpfNTsKLSAgICAgIHVzaW5nIDo6c3RkOjp0cjE6OnBsYWNlaG9sZGVyczo6XzY7Ci0gICAgfSAvLyBhcGFjaGU6OnRocmlmdDo6c3RkY3h4OjpwbGFjZWhvbGRlcnMKLSAgfX19IC8vIGFwYWNoZTo6dGhyaWZ0OjpzdGRjeHgKLQotI2VsaWYgX1RIUklGVF9VU0lOR19DTEFOR19MSUJDWFgKLSAgI2luY2x1ZGUgPGZ1bmN0aW9uYWw+Ci0KLSAgbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2Ugc3RkY3h4IHsKLSAgICB1c2luZyA6OnN0ZDo6ZnVuY3Rpb247Ci0gICAgdXNpbmcgOjpzdGQ6OmJpbmQ7Ci0KLSAgICBuYW1lc3BhY2UgcGxhY2Vob2xkZXJzIHsKLSAgICAgIHVzaW5nIDo6c3RkOjpwbGFjZWhvbGRlcnM6Ol8xOwotICAgICAgdXNpbmcgOjpzdGQ6OnBsYWNlaG9sZGVyczo6XzI7Ci0gICAgICB1c2luZyA6OnN0ZDo6cGxhY2Vob2xkZXJzOjpfMzsKLSAgICAgIHVzaW5nIDo6c3RkOjpwbGFjZWhvbGRlcnM6Ol80OwotICAgICAgdXNpbmcgOjpzdGQ6OnBsYWNlaG9sZGVyczo6XzU7Ci0gICAgICB1c2luZyA6OnN0ZDo6cGxhY2Vob2xkZXJzOjpfNjsKLSAgICB9IC8vIGFwYWNoZTo6dGhyaWZ0OjpzdGRjeHg6OnBsYWNlaG9sZGVycwotICB9fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnN0ZGN4eAotCi0jZWxpZiBfVEhSSUZUX1VTSU5HX0dOVV9MSUJTVERDWFgKLSAgI2luY2x1ZGUgPHRyMS9mdW5jdGlvbmFsPgotCi0gIG5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHN0ZGN4eCB7Ci0gICAgdXNpbmcgOjpzdGQ6OnRyMTo6ZnVuY3Rpb247Ci0gICAgdXNpbmcgOjpzdGQ6OnRyMTo6YmluZDsKLQotICAgIG5hbWVzcGFjZSBwbGFjZWhvbGRlcnMgewotICAgICAgdXNpbmcgOjpzdGQ6OnRyMTo6cGxhY2Vob2xkZXJzOjpfMTsKLSAgICAgIHVzaW5nIDo6c3RkOjp0cjE6OnBsYWNlaG9sZGVyczo6XzI7Ci0gICAgICB1c2luZyA6OnN0ZDo6dHIxOjpwbGFjZWhvbGRlcnM6Ol8zOwotICAgICAgdXNpbmcgOjpzdGQ6OnRyMTo6cGxhY2Vob2xkZXJzOjpfNDsKLSAgICAgIHVzaW5nIDo6c3RkOjp0cjE6OnBsYWNlaG9sZGVyczo6XzU7Ci0gICAgICB1c2luZyA6OnN0ZDo6dHIxOjpwbGFjZWhvbGRlcnM6Ol82OwotICAgIH0gLy8gYXBhY2hlOjp0aHJpZnQ6OnN0ZGN4eDo6cGxhY2Vob2xkZXJzCi0gIH19fSAvLyBhcGFjaGU6OnRocmlmdDo6c3RkY3h4Ci0jZW5kaWYKLQotICAvLyBBbGlhcyBmb3IgdGhyaWZ0IGMrKyBjb21wYXRpYmlsaXR5IG5hbWVzcGFjZQotICBuYW1lc3BhY2UgdGN4eCA9IGFwYWNoZTo6dGhyaWZ0OjpzdGRjeHg7Ci0KLSNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfQ1hYRlVOQ1RJT05BTF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb2Nlc3Nvci9QZWVrUHJvY2Vzc29yLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm9jZXNzb3IvUGVla1Byb2Nlc3Nvci5jcHAKaW5kZXggOTMwM2ExMy4uMDdmNmJhNSAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb2Nlc3Nvci9QZWVrUHJvY2Vzc29yLmNwcAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvY2Vzc29yL1BlZWtQcm9jZXNzb3IuY3BwCkBAIC0yMyw0MiArMjMsNDcgQEAKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w7CiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ7CiAKLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHByb2Nlc3NvciB7CituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHByb2Nlc3NvciB7CiAKIFBlZWtQcm9jZXNzb3I6OlBlZWtQcm9jZXNzb3IoKSB7CiAgIG1lbW9yeUJ1ZmZlcl8ucmVzZXQobmV3IFRNZW1vcnlCdWZmZXIoKSk7CiAgIHRhcmdldFRyYW5zcG9ydF8gPSBtZW1vcnlCdWZmZXJfOwogfQotUGVla1Byb2Nlc3Nvcjo6flBlZWtQcm9jZXNzb3IoKSB7fQorUGVla1Byb2Nlc3Nvcjo6flBlZWtQcm9jZXNzb3IoKSB7Cit9CiAKLXZvaWQgUGVla1Byb2Nlc3Nvcjo6aW5pdGlhbGl6ZShib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBhY3R1YWxQcm9jZXNzb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQaXBlZFRyYW5zcG9ydEZhY3Rvcnk+IHRyYW5zcG9ydEZhY3RvcnkpIHsKK3ZvaWQgUGVla1Byb2Nlc3Nvcjo6aW5pdGlhbGl6ZShzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gYWN0dWFsUHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRQaXBlZFRyYW5zcG9ydEZhY3Rvcnk+IHRyYW5zcG9ydEZhY3RvcnkpIHsKICAgYWN0dWFsUHJvY2Vzc29yXyA9IGFjdHVhbFByb2Nlc3NvcjsKICAgcGlwZWRQcm90b2NvbF8gPSBwcm90b2NvbEZhY3RvcnktPmdldFByb3RvY29sKHRhcmdldFRyYW5zcG9ydF8pOwogICB0cmFuc3BvcnRGYWN0b3J5XyA9IHRyYW5zcG9ydEZhY3Rvcnk7CiAgIHRyYW5zcG9ydEZhY3RvcnlfLT5pbml0aWFsaXplVGFyZ2V0VHJhbnNwb3J0KHRhcmdldFRyYW5zcG9ydF8pOwogfQogCi1ib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBQZWVrUHJvY2Vzc29yOjpnZXRQaXBlZFRyYW5zcG9ydChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBpbikgeworc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IFBlZWtQcm9jZXNzb3I6OmdldFBpcGVkVHJhbnNwb3J0KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBpbikgewogICByZXR1cm4gdHJhbnNwb3J0RmFjdG9yeV8tPmdldFRyYW5zcG9ydChpbik7CiB9CiAKLXZvaWQgUGVla1Byb2Nlc3Nvcjo6c2V0VGFyZ2V0VHJhbnNwb3J0KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRhcmdldFRyYW5zcG9ydCkgewordm9pZCBQZWVrUHJvY2Vzc29yOjpzZXRUYXJnZXRUcmFuc3BvcnQoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRhcmdldFRyYW5zcG9ydCkgewogICB0YXJnZXRUcmFuc3BvcnRfID0gdGFyZ2V0VHJhbnNwb3J0OwotICBpZiAoYm9vc3Q6OmR5bmFtaWNfcG9pbnRlcl9jYXN0PFRNZW1vcnlCdWZmZXI+KHRhcmdldFRyYW5zcG9ydF8pKSB7Ci0gICAgbWVtb3J5QnVmZmVyXyA9IGJvb3N0OjpkeW5hbWljX3BvaW50ZXJfY2FzdDxUTWVtb3J5QnVmZmVyPih0YXJnZXRUcmFuc3BvcnQpOwotICB9IGVsc2UgaWYgKGJvb3N0OjpkeW5hbWljX3BvaW50ZXJfY2FzdDxUUGlwZWRUcmFuc3BvcnQ+KHRhcmdldFRyYW5zcG9ydF8pKSB7Ci0gICAgbWVtb3J5QnVmZmVyXyA9IGJvb3N0OjpkeW5hbWljX3BvaW50ZXJfY2FzdDxUTWVtb3J5QnVmZmVyPihib29zdDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8VFBpcGVkVHJhbnNwb3J0Pih0YXJnZXRUcmFuc3BvcnRfKS0+Z2V0VGFyZ2V0VHJhbnNwb3J0KCkpOworICBpZiAoc3RkOjpkeW5hbWljX3BvaW50ZXJfY2FzdDxUTWVtb3J5QnVmZmVyPih0YXJnZXRUcmFuc3BvcnRfKSkgeworICAgIG1lbW9yeUJ1ZmZlcl8gPSBzdGQ6OmR5bmFtaWNfcG9pbnRlcl9jYXN0PFRNZW1vcnlCdWZmZXI+KHRhcmdldFRyYW5zcG9ydCk7CisgIH0gZWxzZSBpZiAoc3RkOjpkeW5hbWljX3BvaW50ZXJfY2FzdDxUUGlwZWRUcmFuc3BvcnQ+KHRhcmdldFRyYW5zcG9ydF8pKSB7CisgICAgbWVtb3J5QnVmZmVyXyA9IHN0ZDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8VE1lbW9yeUJ1ZmZlcj4oCisgICAgICAgIHN0ZDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8VFBpcGVkVHJhbnNwb3J0Pih0YXJnZXRUcmFuc3BvcnRfKS0+Z2V0VGFyZ2V0VHJhbnNwb3J0KCkpOwogICB9CiAKICAgaWYgKCFtZW1vcnlCdWZmZXJfKSB7Ci0gICAgdGhyb3cgVEV4Y2VwdGlvbigiVGFyZ2V0IHRyYW5zcG9ydCBtdXN0IGJlIGEgVE1lbW9yeUJ1ZmZlciBvciBhIFRQaXBlZFRyYW5zcG9ydCB3aXRoIFRNZW1vcnlCdWZmZXIiKTsKKyAgICB0aHJvdyBURXhjZXB0aW9uKAorICAgICAgICAiVGFyZ2V0IHRyYW5zcG9ydCBtdXN0IGJlIGEgVE1lbW9yeUJ1ZmZlciBvciBhIFRQaXBlZFRyYW5zcG9ydCB3aXRoIFRNZW1vcnlCdWZmZXIiKTsKICAgfQogfQogCi1ib29sIFBlZWtQcm9jZXNzb3I6OnByb2Nlc3MoYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IG91dCwKK2Jvb2wgUGVla1Byb2Nlc3Nvcjo6cHJvY2VzcyhzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogY29ubmVjdGlvbkNvbnRleHQpIHsKIAogICBzdGQ6OnN0cmluZyBmbmFtZTsKQEAgLTEwNywyMSArMTEyLDIxIEBACiB9CiAKIHZvaWQgUGVla1Byb2Nlc3Nvcjo6cGVla05hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIGZuYW1lKSB7Ci0gICh2b2lkKSBmbmFtZTsKKyAgKHZvaWQpZm5hbWU7CiB9CiAKIHZvaWQgUGVla1Byb2Nlc3Nvcjo6cGVla0J1ZmZlcih1aW50OF90KiBidWZmZXIsIHVpbnQzMl90IHNpemUpIHsKLSAgKHZvaWQpIGJ1ZmZlcjsKLSAgKHZvaWQpIHNpemU7CisgICh2b2lkKWJ1ZmZlcjsKKyAgKHZvaWQpc2l6ZTsKIH0KIAotdm9pZCBQZWVrUHJvY2Vzc29yOjpwZWVrKGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGUgZnR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCBmaWQpIHsKLSAgKHZvaWQpIGZpZDsKK3ZvaWQgUGVla1Byb2Nlc3Nvcjo6cGVlayhzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBpbiwgVFR5cGUgZnR5cGUsIGludDE2X3QgZmlkKSB7CisgICh2b2lkKWZpZDsKICAgaW4tPnNraXAoZnR5cGUpOwogfQogCi12b2lkIFBlZWtQcm9jZXNzb3I6OnBlZWtFbmQoKSB7fQotCi19fX0KK3ZvaWQgUGVla1Byb2Nlc3Nvcjo6cGVla0VuZCgpIHsKK30KK30KK30KK30KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm9jZXNzb3IvUGVla1Byb2Nlc3Nvci5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb2Nlc3Nvci9QZWVrUHJvY2Vzc29yLmgKaW5kZXggOWNmYjM1YS4uZWZhYzJiOSAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb2Nlc3Nvci9QZWVrUHJvY2Vzc29yLmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb2Nlc3Nvci9QZWVrUHJvY2Vzc29yLmgKQEAgLTI1LDkgKzI1LDExIEBACiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0VXRpbHMuaD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+Ci0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+CisjaW5jbHVkZSA8bWVtb3J5PgogCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBwcm9jZXNzb3IgeworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBwcm9jZXNzb3IgewogCiAvKgogICogQ2xhc3MgZm9yIHBlZWtpbmcgYXQgdGhlIHJhdyBkYXRhIHRoYXQgaXMgYmVpbmcgcHJvY2Vzc2VkIGJ5IGFub3RoZXIgcHJvY2Vzc29yCkBAIC0zNiw3ICszOCw3IEBACiAgKi8KIGNsYXNzIFBlZWtQcm9jZXNzb3IgOiBwdWJsaWMgYXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3IgewogCi0gcHVibGljOgorcHVibGljOgogICBQZWVrUHJvY2Vzc29yKCk7CiAgIHZpcnR1YWwgflBlZWtQcm9jZXNzb3IoKTsKIApAQCAtNDQsMzUgKzQ2LDM4IEBACiAgIC8vICAgICAgICAgICAgIHByb3RvY29sRmFjdG9yeSAgLSB0aGUgcHJvdG9jb2wgZmFjdG9yeSB1c2VkIHRvIHdyYXAgdGhlIG1lbW9yeSBidWZmZXIKICAgLy8gICAgICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSAtIHRoaXMgVFBpcGVkVHJhbnNwb3J0RmFjdG9yeSBpcyB1c2VkIHRvIHdyYXAgdGhlIHNvdXJjZSB0cmFuc3BvcnQKICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpYSBhIGNhbGwgdG8gZ2V0UGlwZWRUcmFuc3BvcnQKLSAgdm9pZCBpbml0aWFsaXplKGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yPiBhY3R1YWxQcm9jZXNzb3IsCi0gICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRQaXBlZFRyYW5zcG9ydEZhY3Rvcnk+IHRyYW5zcG9ydEZhY3RvcnkpOworICB2b2lkIGluaXRpYWxpemUoCisgICAgICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3I+IGFjdHVhbFByb2Nlc3NvciwKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeSwKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUUGlwZWRUcmFuc3BvcnRGYWN0b3J5PiB0cmFuc3BvcnRGYWN0b3J5KTsKIAotICBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0PiBnZXRQaXBlZFRyYW5zcG9ydChib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0PiBpbik7CisgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0PiBnZXRQaXBlZFRyYW5zcG9ydCgKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0PiBpbik7CiAKLSAgdm9pZCBzZXRUYXJnZXRUcmFuc3BvcnQoYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydD4gdGFyZ2V0VHJhbnNwb3J0KTsKKyAgdm9pZCBzZXRUYXJnZXRUcmFuc3BvcnQoc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ+IHRhcmdldFRyYW5zcG9ydCk7CiAKLSAgdmlydHVhbCBib29sIHByb2Nlc3MoYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IGluLAotICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gb3V0LAorICB2aXJ0dWFsIGJvb2wgcHJvY2VzcyhzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IGluLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogY29ubmVjdGlvbkNvbnRleHQpOwogCiAgIC8vIFRoZSBmb2xsb3dpbmcgdGhyZWUgZnVuY3Rpb25zIGNhbiBiZSBvdmVybG9hZGVkIGJ5IGNoaWxkIGNsYXNzZXMgdG8KICAgLy8gYWNoaWV2ZSBkZXNpcmVkIHBlZWtpbmcgYmVoYXZpb3IKICAgdmlydHVhbCB2b2lkIHBlZWtOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBmbmFtZSk7CiAgIHZpcnR1YWwgdm9pZCBwZWVrQnVmZmVyKHVpbnQ4X3QqIGJ1ZmZlciwgdWludDMyX3Qgc2l6ZSk7Ci0gIHZpcnR1YWwgdm9pZCBwZWVrKGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBpbiwKKyAgdmlydHVhbCB2b2lkIHBlZWsoc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBpbiwKICAgICAgICAgICAgICAgICAgICAgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUVHlwZSBmdHlwZSwKICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCBmaWQpOwogICB2aXJ0dWFsIHZvaWQgcGVla0VuZCgpOwogCi0gcHJpdmF0ZToKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3I+IGFjdHVhbFByb2Nlc3Nvcl87Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBwaXBlZFByb3RvY29sXzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFBpcGVkVHJhbnNwb3J0RmFjdG9yeT4gdHJhbnNwb3J0RmFjdG9yeV87Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXI+IG1lbW9yeUJ1ZmZlcl87Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ+IHRhcmdldFRyYW5zcG9ydF87Citwcml2YXRlOgorICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3I+IGFjdHVhbFByb2Nlc3Nvcl87CisgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gcGlwZWRQcm90b2NvbF87CisgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUUGlwZWRUcmFuc3BvcnRGYWN0b3J5PiB0cmFuc3BvcnRGYWN0b3J5XzsKKyAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXI+IG1lbW9yeUJ1ZmZlcl87CisgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0PiB0YXJnZXRUcmFuc3BvcnRfOwogfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpwcm9jZXNzb3IKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnByb2Nlc3NvcgogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm9jZXNzb3IvU3RhdHNQcm9jZXNzb3IuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm9jZXNzb3IvU3RhdHNQcm9jZXNzb3IuaAppbmRleCAwZmMxMjNlLi5lOThlZmI4IDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvY2Vzc29yL1N0YXRzUHJvY2Vzc29yLmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb2Nlc3Nvci9TdGF0c1Byb2Nlc3Nvci5oCkBAIC0yMCwxMiArMjAsMTQgQEAKICNpZm5kZWYgU1RBVFNQUk9DRVNTT1JfSAogI2RlZmluZSBTVEFUU1BST0NFU1NPUl9ICiAKLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KKyNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbC5oPgogI2luY2x1ZGUgPFRQcm9jZXNzb3IuaD4KIAotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgcHJvY2Vzc29yIHsKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgcHJvY2Vzc29yIHsKIAogLyoKICAqIENsYXNzIGZvciBrZWVwaW5nIHRyYWNrIG9mIGZ1bmN0aW9uIGNhbGwgc3RhdGlzdGljcyBhbmQgcHJpbnRpbmcgdGhlbSBpZiBkZXNpcmVkCkBAIC0zMywxNCArMzUsMTEgQEAKICAqLwogY2xhc3MgU3RhdHNQcm9jZXNzb3IgOiBwdWJsaWMgYXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3IgewogcHVibGljOgotICBTdGF0c1Byb2Nlc3Nvcihib29sIHByaW50LCBib29sIGZyZXF1ZW5jeSkKLSAgICA6IHByaW50XyhwcmludCksCi0gICAgICBmcmVxdWVuY3lfKGZyZXF1ZW5jeSkKLSAge30KLSAgdmlydHVhbCB+U3RhdHNQcm9jZXNzb3IoKSB7fTsKKyAgU3RhdHNQcm9jZXNzb3IoYm9vbCBwcmludCwgYm9vbCBmcmVxdWVuY3kpIDogcHJpbnRfKHByaW50KSwgZnJlcXVlbmN5XyhmcmVxdWVuY3kpIHt9CisgIHZpcnR1YWwgflN0YXRzUHJvY2Vzc29yKCl7fTsKIAotICB2aXJ0dWFsIGJvb2wgcHJvY2Vzcyhib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gcGlwcm90LAotICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gcG9wcm90LAorICB2aXJ0dWFsIGJvb2wgcHJvY2VzcyhzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IHBpcHJvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBwb3Byb3QsCiAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHNlcnZlckNvbnRleHQpIHsKIAogICAgIHBpcHJvdF8gPSBwaXByb3Q7CkBAIC04OCwxNzkgKzg3LDE1NiBAQAogICAgIHJldHVybiB0cnVlOwogICB9CiAKLSAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludDY0X3Q+JiBnZXRfZnJlcXVlbmN5X21hcCgpIHsKLSAgICByZXR1cm4gZnJlcXVlbmN5X21hcF87Ci0gIH0KKyAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludDY0X3Q+JiBnZXRfZnJlcXVlbmN5X21hcCgpIHsgcmV0dXJuIGZyZXF1ZW5jeV9tYXBfOyB9CiAKIHByb3RlY3RlZDoKICAgdm9pZCBwcmludEFuZFBhc3NUb0J1ZmZlcihhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRUeXBlIGZ0eXBlKSB7CiAgICAgc3dpdGNoIChmdHlwZSkgewotICAgICAgY2FzZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfQk9PTDoKLSAgICAgICAgewotICAgICAgICAgIGJvb2wgYm9vbHY7Ci0gICAgICAgICAgcGlwcm90Xy0+cmVhZEJvb2woYm9vbHYpOwotICAgICAgICAgIGlmIChwcmludF8pIHsKLSAgICAgICAgICAgIHByaW50ZigiJWQiLCBib29sdik7Ci0gICAgICAgICAgfQorICAgIGNhc2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0JPT0w6IHsKKyAgICAgIGJvb2wgYm9vbHY7CisgICAgICBwaXByb3RfLT5yZWFkQm9vbChib29sdik7CisgICAgICBpZiAocHJpbnRfKSB7CisgICAgICAgIHByaW50ZigiJWQiLCBib29sdik7CisgICAgICB9CisgICAgfSBicmVhazsKKyAgICBjYXNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9CWVRFOiB7CisgICAgICBpbnQ4X3QgYnl0ZXY7CisgICAgICBwaXByb3RfLT5yZWFkQnl0ZShieXRldik7CisgICAgICBpZiAocHJpbnRfKSB7CisgICAgICAgIHByaW50ZigiJWQiLCBieXRldik7CisgICAgICB9CisgICAgfSBicmVhazsKKyAgICBjYXNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9JMTY6IHsKKyAgICAgIGludDE2X3QgaTE2OworICAgICAgcGlwcm90Xy0+cmVhZEkxNihpMTYpOworICAgICAgaWYgKHByaW50XykgeworICAgICAgICBwcmludGYoIiVkIiwgaTE2KTsKKyAgICAgIH0KKyAgICB9IGJyZWFrOworICAgIGNhc2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0kzMjogeworICAgICAgaW50MzJfdCBpMzI7CisgICAgICBwaXByb3RfLT5yZWFkSTMyKGkzMik7CisgICAgICBpZiAocHJpbnRfKSB7CisgICAgICAgIHByaW50ZigiJWQiLCBpMzIpOworICAgICAgfQorICAgIH0gYnJlYWs7CisgICAgY2FzZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfSTY0OiB7CisgICAgICBpbnQ2NF90IGk2NDsKKyAgICAgIHBpcHJvdF8tPnJlYWRJNjQoaTY0KTsKKyAgICAgIGlmIChwcmludF8pIHsKKyAgICAgICAgcHJpbnRmKCIlbGQiLCBpNjQpOworICAgICAgfQorICAgIH0gYnJlYWs7CisgICAgY2FzZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfRE9VQkxFOiB7CisgICAgICBkb3VibGUgZHViOworICAgICAgcGlwcm90Xy0+cmVhZERvdWJsZShkdWIpOworICAgICAgaWYgKHByaW50XykgeworICAgICAgICBwcmludGYoIiVmIiwgZHViKTsKKyAgICAgIH0KKyAgICB9IGJyZWFrOworICAgIGNhc2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1NUUklORzogeworICAgICAgc3RkOjpzdHJpbmcgc3RyOworICAgICAgcGlwcm90Xy0+cmVhZFN0cmluZyhzdHIpOworICAgICAgaWYgKHByaW50XykgeworICAgICAgICBwcmludGYoIiVzIiwgc3RyLmNfc3RyKCkpOworICAgICAgfQorICAgIH0gYnJlYWs7CisgICAgY2FzZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfU1RSVUNUOiB7CisgICAgICBzdGQ6OnN0cmluZyBuYW1lOworICAgICAgaW50MTZfdCBmaWQ7CisgICAgICBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRUeXBlIGZ0eXBlOworICAgICAgcGlwcm90Xy0+cmVhZFN0cnVjdEJlZ2luKG5hbWUpOworICAgICAgaWYgKHByaW50XykgeworICAgICAgICBwcmludGYoIjwiKTsKKyAgICAgIH0KKyAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIHBpcHJvdF8tPnJlYWRGaWVsZEJlZ2luKG5hbWUsIGZ0eXBlLCBmaWQpOworICAgICAgICBpZiAoZnR5cGUgPT0gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1NUT1ApIHsKKyAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0JZVEU6Ci0gICAgICAgIHsKLSAgICAgICAgICBpbnQ4X3QgYnl0ZXY7Ci0gICAgICAgICAgcGlwcm90Xy0+cmVhZEJ5dGUoYnl0ZXYpOwotICAgICAgICAgIGlmIChwcmludF8pIHsKLSAgICAgICAgICAgIHByaW50ZigiJWQiLCBieXRldik7Ci0gICAgICAgICAgfQorICAgICAgICBwcmludEFuZFBhc3NUb0J1ZmZlcihmdHlwZSk7CisgICAgICAgIGlmIChwcmludF8pIHsKKyAgICAgICAgICBwcmludGYoIiwiKTsKICAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0kxNjoKLSAgICAgICAgewotICAgICAgICAgIGludDE2X3QgaTE2OwotICAgICAgICAgIHBpcHJvdF8tPnJlYWRJMTYoaTE2KTsKLSAgICAgICAgICBpZiAocHJpbnRfKSB7Ci0gICAgICAgICAgICBwcmludGYoIiVkIiwgaTE2KTsKLSAgICAgICAgICB9CisgICAgICAgIHBpcHJvdF8tPnJlYWRGaWVsZEVuZCgpOworICAgICAgfQorICAgICAgcGlwcm90Xy0+cmVhZFN0cnVjdEVuZCgpOworICAgICAgaWYgKHByaW50XykgeworICAgICAgICBwcmludGYoIlxiPiIpOworICAgICAgfQorICAgIH0gYnJlYWs7CisgICAgY2FzZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfTUFQOiB7CisgICAgICBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRUeXBlIGtleVR5cGU7CisgICAgICBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRUeXBlIHZhbFR5cGU7CisgICAgICB1aW50MzJfdCBpLCBzaXplOworICAgICAgcGlwcm90Xy0+cmVhZE1hcEJlZ2luKGtleVR5cGUsIHZhbFR5cGUsIHNpemUpOworICAgICAgaWYgKHByaW50XykgeworICAgICAgICBwcmludGYoInsiKTsKKyAgICAgIH0KKyAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgcHJpbnRBbmRQYXNzVG9CdWZmZXIoa2V5VHlwZSk7CisgICAgICAgIGlmIChwcmludF8pIHsKKyAgICAgICAgICBwcmludGYoIj0+Iik7CiAgICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9JMzI6Ci0gICAgICAgIHsKLSAgICAgICAgICBpbnQzMl90IGkzMjsKLSAgICAgICAgICBwaXByb3RfLT5yZWFkSTMyKGkzMik7Ci0gICAgICAgICAgaWYgKHByaW50XykgewotICAgICAgICAgICAgcHJpbnRmKCIlZCIsIGkzMik7Ci0gICAgICAgICAgfQorICAgICAgICBwcmludEFuZFBhc3NUb0J1ZmZlcih2YWxUeXBlKTsKKyAgICAgICAgaWYgKHByaW50XykgeworICAgICAgICAgIHByaW50ZigiLCIpOwogICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfSTY0OgotICAgICAgICB7Ci0gICAgICAgICAgaW50NjRfdCBpNjQ7Ci0gICAgICAgICAgcGlwcm90Xy0+cmVhZEk2NChpNjQpOwotICAgICAgICAgIGlmIChwcmludF8pIHsKLSAgICAgICAgICAgIHByaW50ZigiJWxkIiwgaTY0KTsKLSAgICAgICAgICB9CisgICAgICB9CisgICAgICBwaXByb3RfLT5yZWFkTWFwRW5kKCk7CisgICAgICBpZiAocHJpbnRfKSB7CisgICAgICAgIHByaW50ZigiXGJ9Iik7CisgICAgICB9CisgICAgfSBicmVhazsKKyAgICBjYXNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9TRVQ6IHsKKyAgICAgIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFR5cGUgZWxlbVR5cGU7CisgICAgICB1aW50MzJfdCBpLCBzaXplOworICAgICAgcGlwcm90Xy0+cmVhZFNldEJlZ2luKGVsZW1UeXBlLCBzaXplKTsKKyAgICAgIGlmIChwcmludF8pIHsKKyAgICAgICAgcHJpbnRmKCJ7Iik7CisgICAgICB9CisgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgIHByaW50QW5kUGFzc1RvQnVmZmVyKGVsZW1UeXBlKTsKKyAgICAgICAgaWYgKHByaW50XykgeworICAgICAgICAgIHByaW50ZigiLCIpOwogICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfRE9VQkxFOgotICAgICAgICB7Ci0gICAgICAgICAgZG91YmxlIGR1YjsKLSAgICAgICAgICBwaXByb3RfLT5yZWFkRG91YmxlKGR1Yik7Ci0gICAgICAgICAgaWYgKHByaW50XykgewotICAgICAgICAgICAgcHJpbnRmKCIlZiIsIGR1Yik7Ci0gICAgICAgICAgfQorICAgICAgfQorICAgICAgcGlwcm90Xy0+cmVhZFNldEVuZCgpOworICAgICAgaWYgKHByaW50XykgeworICAgICAgICBwcmludGYoIlxifSIpOworICAgICAgfQorICAgIH0gYnJlYWs7CisgICAgY2FzZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfTElTVDogeworICAgICAgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUVHlwZSBlbGVtVHlwZTsKKyAgICAgIHVpbnQzMl90IGksIHNpemU7CisgICAgICBwaXByb3RfLT5yZWFkTGlzdEJlZ2luKGVsZW1UeXBlLCBzaXplKTsKKyAgICAgIGlmIChwcmludF8pIHsKKyAgICAgICAgcHJpbnRmKCJbIik7CisgICAgICB9CisgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgIHByaW50QW5kUGFzc1RvQnVmZmVyKGVsZW1UeXBlKTsKKyAgICAgICAgaWYgKHByaW50XykgeworICAgICAgICAgIHByaW50ZigiLCIpOwogICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfU1RSSU5HOgotICAgICAgICB7Ci0gICAgICAgICAgc3RkOjpzdHJpbmcgc3RyOwotICAgICAgICAgIHBpcHJvdF8tPnJlYWRTdHJpbmcoc3RyKTsKLSAgICAgICAgICBpZiAocHJpbnRfKSB7Ci0gICAgICAgICAgICBwcmludGYoIiVzIiwgc3RyLmNfc3RyKCkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1NUUlVDVDoKLSAgICAgICAgewotICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWU7Ci0gICAgICAgICAgaW50MTZfdCBmaWQ7Ci0gICAgICAgICAgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUVHlwZSBmdHlwZTsKLSAgICAgICAgICBwaXByb3RfLT5yZWFkU3RydWN0QmVnaW4obmFtZSk7Ci0gICAgICAgICAgaWYgKHByaW50XykgewotICAgICAgICAgICAgcHJpbnRmKCI8Iik7Ci0gICAgICAgICAgfQotICAgICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICBwaXByb3RfLT5yZWFkRmllbGRCZWdpbihuYW1lLCBmdHlwZSwgZmlkKTsKLSAgICAgICAgICAgIGlmIChmdHlwZSA9PSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfU1RPUCkgewotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHByaW50QW5kUGFzc1RvQnVmZmVyKGZ0eXBlKTsKLSAgICAgICAgICAgIGlmIChwcmludF8pIHsKLSAgICAgICAgICAgICAgcHJpbnRmKCIsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwaXByb3RfLT5yZWFkRmllbGRFbmQoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcGlwcm90Xy0+cmVhZFN0cnVjdEVuZCgpOwotICAgICAgICAgIGlmIChwcmludF8pIHsKLSAgICAgICAgICAgIHByaW50ZigiXGI+Iik7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfTUFQOgotICAgICAgICB7Ci0gICAgICAgICAgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUVHlwZSBrZXlUeXBlOwotICAgICAgICAgIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFR5cGUgdmFsVHlwZTsKLSAgICAgICAgICB1aW50MzJfdCBpLCBzaXplOwotICAgICAgICAgIHBpcHJvdF8tPnJlYWRNYXBCZWdpbihrZXlUeXBlLCB2YWxUeXBlLCBzaXplKTsKLSAgICAgICAgICBpZiAocHJpbnRfKSB7Ci0gICAgICAgICAgICBwcmludGYoInsiKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgcHJpbnRBbmRQYXNzVG9CdWZmZXIoa2V5VHlwZSk7Ci0gICAgICAgICAgICBpZiAocHJpbnRfKSB7Ci0gICAgICAgICAgICAgIHByaW50ZigiPT4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHByaW50QW5kUGFzc1RvQnVmZmVyKHZhbFR5cGUpOwotICAgICAgICAgICAgaWYgKHByaW50XykgewotICAgICAgICAgICAgICBwcmludGYoIiwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgcGlwcm90Xy0+cmVhZE1hcEVuZCgpOwotICAgICAgICAgIGlmIChwcmludF8pIHsKLSAgICAgICAgICAgIHByaW50ZigiXGJ9Iik7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfU0VUOgotICAgICAgICB7Ci0gICAgICAgICAgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUVHlwZSBlbGVtVHlwZTsKLSAgICAgICAgICB1aW50MzJfdCBpLCBzaXplOwotICAgICAgICAgIHBpcHJvdF8tPnJlYWRTZXRCZWdpbihlbGVtVHlwZSwgc2l6ZSk7Ci0gICAgICAgICAgaWYgKHByaW50XykgewotICAgICAgICAgICAgcHJpbnRmKCJ7Iik7Ci0gICAgICAgICAgfQotICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgIHByaW50QW5kUGFzc1RvQnVmZmVyKGVsZW1UeXBlKTsKLSAgICAgICAgICAgIGlmIChwcmludF8pIHsKLSAgICAgICAgICAgICAgcHJpbnRmKCIsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIHBpcHJvdF8tPnJlYWRTZXRFbmQoKTsKLSAgICAgICAgICBpZiAocHJpbnRfKSB7Ci0gICAgICAgICAgICBwcmludGYoIlxifSIpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0xJU1Q6Ci0gICAgICAgIHsKLSAgICAgICAgICBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRUeXBlIGVsZW1UeXBlOwotICAgICAgICAgIHVpbnQzMl90IGksIHNpemU7Ci0gICAgICAgICAgcGlwcm90Xy0+cmVhZExpc3RCZWdpbihlbGVtVHlwZSwgc2l6ZSk7Ci0gICAgICAgICAgaWYgKHByaW50XykgewotICAgICAgICAgICAgcHJpbnRmKCJbIik7Ci0gICAgICAgICAgfQotICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgIHByaW50QW5kUGFzc1RvQnVmZmVyKGVsZW1UeXBlKTsKLSAgICAgICAgICAgIGlmIChwcmludF8pIHsKLSAgICAgICAgICAgICAgcHJpbnRmKCIsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIHBpcHJvdF8tPnJlYWRMaXN0RW5kKCk7Ci0gICAgICAgICAgaWYgKHByaW50XykgewotICAgICAgICAgICAgcHJpbnRmKCJcYl0iKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIHBpcHJvdF8tPnJlYWRMaXN0RW5kKCk7CisgICAgICBpZiAocHJpbnRfKSB7CisgICAgICAgIHByaW50ZigiXGJdIik7CisgICAgICB9CisgICAgfSBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CiAgICAgfQogICB9CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IHBpcHJvdF87CisgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gcGlwcm90XzsKICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludDY0X3Q+IGZyZXF1ZW5jeV9tYXBfOwogCiAgIGJvb2wgcHJpbnRfOwogICBib29sIGZyZXF1ZW5jeV87CiB9OwotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnByb2Nlc3NvcgorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6cHJvY2Vzc29yCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb2Nlc3Nvci9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm9jZXNzb3IvVE11bHRpcGxleGVkUHJvY2Vzc29yLmgKaW5kZXggYTM1MmQ5MC4uMmFhN2Y3NSAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb2Nlc3Nvci9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvY2Vzc29yL1RNdWx0aXBsZXhlZFByb2Nlc3Nvci5oCkBAIC0yNSwxOTQgKzI1LDIwMCBAQAogI2luY2x1ZGUgPHRocmlmdC9UUHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8Ym9vc3QvdG9rZW5pemVyLmhwcD4KIAotbmFtZXNwYWNlIGFwYWNoZQotewotICAgIG5hbWVzcGFjZSB0aHJpZnQKLSAgICB7Ci0gICAgICAgIHVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBwcm90b2NvbCB7CiAKLSAgICAgICAgbmFtZXNwYWNlIHByb3RvY29sIHsKKy8qKgorICogIFRvIGJlIGFibGUgdG8gd29yayB3aXRoIGFueSBwcm90b2NvbCwgd2UgbmVlZGVkCisgKiAgdG8gYWxsb3cgdGhlbSB0byBjYWxsIHJlYWRNZXNzYWdlQmVnaW4oKSBhbmQgZ2V0IGEgVE1lc3NhZ2UgaW4gZXhhY3RseQorICogIHRoZSBzdGFuZGFyZCBmb3JtYXQsIHdpdGhvdXQgdGhlIHNlcnZpY2UgbmFtZSBwcmVwZW5kZWQgdG8gVE1lc3NhZ2UubmFtZS4KKyAqLworY2xhc3MgU3RvcmVkTWVzc2FnZVByb3RvY29sIDogcHVibGljIFRQcm90b2NvbERlY29yYXRvciB7CitwdWJsaWM6CisgIFN0b3JlZE1lc3NhZ2VQcm90b2NvbChzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gX3Byb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVE1lc3NhZ2VUeXBlIF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBfc2VxaWQpCisgICAgOiBUUHJvdG9jb2xEZWNvcmF0b3IoX3Byb3RvY29sKSwgbmFtZShfbmFtZSksIHR5cGUoX3R5cGUpLCBzZXFpZChfc2VxaWQpIHt9CiAKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogIFRvIGJlIGFibGUgdG8gd29yayB3aXRoIGFueSBwcm90b2NvbCwgd2UgbmVlZGVkCi0gICAgICAgICAgICAgKiAgdG8gYWxsb3cgdGhlbSB0byBjYWxsIHJlYWRNZXNzYWdlQmVnaW4oKSBhbmQgZ2V0IGEgVE1lc3NhZ2UgaW4gZXhhY3RseQotICAgICAgICAgICAgICogIHRoZSBzdGFuZGFyZCBmb3JtYXQsIHdpdGhvdXQgdGhlIHNlcnZpY2UgbmFtZSBwcmVwZW5kZWQgdG8gVE1lc3NhZ2UubmFtZS4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgY2xhc3MgU3RvcmVkTWVzc2FnZVByb3RvY29sIDogcHVibGljIFRQcm90b2NvbERlY29yYXRvcgotICAgICAgICAgICAgewotICAgICAgICAgICAgcHVibGljOgotICAgICAgICAgICAgICAgIFN0b3JlZE1lc3NhZ2VQcm90b2NvbCggc2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBfcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBfbmFtZSwgY29uc3QgVE1lc3NhZ2VUeXBlIF90eXBlLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IF9zZXFpZCkgOgotICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xEZWNvcmF0b3IoX3Byb3RvY29sKSwKLSAgICAgICAgICAgICAgICAgICAgbmFtZShfbmFtZSksCi0gICAgICAgICAgICAgICAgICAgIHR5cGUoX3R5cGUpLAotICAgICAgICAgICAgICAgICAgICBzZXFpZChfc2VxaWQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIH0KKyAgdWludDMyX3QgcmVhZE1lc3NhZ2VCZWdpbl92aXJ0KHN0ZDo6c3RyaW5nJiBfbmFtZSwgVE1lc3NhZ2VUeXBlJiBfdHlwZSwgaW50MzJfdCYgX3NlcWlkKSB7CiAKLSAgICAgICAgICAgICAgICB1aW50MzJfdCByZWFkTWVzc2FnZUJlZ2luX3ZpcnQoc3RkOjpzdHJpbmcmIF9uYW1lLCBUTWVzc2FnZVR5cGUmIF90eXBlLCBpbnQzMl90JiBfc2VxaWQpCi0gICAgICAgICAgICAgICAgeworICAgIF9uYW1lID0gbmFtZTsKKyAgICBfdHlwZSA9IHR5cGU7CisgICAgX3NlcWlkID0gc2VxaWQ7CiAKLSAgICAgICAgICAgICAgICAgICAgX25hbWUgID0gbmFtZTsKLSAgICAgICAgICAgICAgICAgICAgX3R5cGUgID0gdHlwZTsKLSAgICAgICAgICAgICAgICAgICAgX3NlcWlkID0gc2VxaWQ7CisgICAgcmV0dXJuIDA7IC8vIChOb3JtYWwgVFByb3RvY29sIHJlYWQgZnVuY3Rpb25zIHJldHVybiBudW1iZXIgb2YgYnl0ZXMgcmVhZCkKKyAgfQogCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAwOyAvLyAoTm9ybWFsIFRQcm90b2NvbCByZWFkIGZ1bmN0aW9ucyByZXR1cm4gbnVtYmVyIG9mIGJ5dGVzIHJlYWQpCi0gICAgICAgICAgICAgICAgfQorICBzdGQ6OnN0cmluZyBuYW1lOworICBUTWVzc2FnZVR5cGUgdHlwZTsKKyAgaW50MzJfdCBzZXFpZDsKK307Cit9IC8vIG5hbWVzcGFjZSBwcm90b2NvbAogCi0gICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZTsKLSAgICAgICAgICAgICAgICBUTWVzc2FnZVR5cGUgdHlwZTsKLSAgICAgICAgICAgICAgICBpbnQzMl90IHNlcWlkOwotICAgICAgICAgICAgfTsKLSAgICAgICAgfSAvL25hbWVzcGFjZSBwcm90b2NvbAorLyoqCisgKiA8Y29kZT5UTXVsdGlwbGV4ZWRQcm9jZXNzb3I8L2NvZGU+IGlzIGEgPGNvZGU+VFByb2Nlc3NvcjwvY29kZT4gYWxsb3dpbmcKKyAqIGEgc2luZ2xlIDxjb2RlPlRTZXJ2ZXI8L2NvZGU+IHRvIHByb3ZpZGUgbXVsdGlwbGUgc2VydmljZXMuCisgKgorICogPHA+VG8gZG8gc28sIHlvdSBpbnN0YW50aWF0ZSB0aGUgcHJvY2Vzc29yIGFuZCB0aGVuIHJlZ2lzdGVyIGFkZGl0aW9uYWwKKyAqIHByb2Nlc3NvcnMgd2l0aCBpdCwgYXMgc2hvd24gaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlOjwvcD4KKyAqCisgKiA8YmxvY2txdW90ZT48Y29kZT4KKyAqICAgICBzdGQ6OnNoYXJlZF9wdHI8VE11bHRpcGxleGVkUHJvY2Vzc29yPiBwcm9jZXNzb3IobmV3IFRNdWx0aXBsZXhlZFByb2Nlc3NvcigpKTsKKyAqCisgKiAgICAgcHJvY2Vzc29yLT5yZWdpc3RlclByb2Nlc3NvcigKKyAqICAgICAgICAgIkNhbGN1bGF0b3IiLAorICogICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4oIG5ldyBDYWxjdWxhdG9yUHJvY2Vzc29yKAorICogICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENhbGN1bGF0b3JIYW5kbGVyPiggbmV3IENhbGN1bGF0b3JIYW5kbGVyKCkpKSkpOworICoKKyAqICAgICBwcm9jZXNzb3ItPnJlZ2lzdGVyUHJvY2Vzc29yKAorICogICAgICAgICAiV2VhdGhlclJlcG9ydCIsCisgKiAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiggbmV3IFdlYXRoZXJSZXBvcnRQcm9jZXNzb3IoCisgKiAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8V2VhdGhlclJlcG9ydEhhbmRsZXI+KCBuZXcgV2VhdGhlclJlcG9ydEhhbmRsZXIoKSkpKSk7CisgKgorICogICAgIHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiB0cmFuc3BvcnQobmV3IFRTZXJ2ZXJTb2NrZXQoOTA5MCkpOworICogICAgIFRTaW1wbGVTZXJ2ZXIgc2VydmVyKHByb2Nlc3NvciwgdHJhbnNwb3J0KTsKKyAqCisgKiAgICAgc2VydmVyLnNlcnZlKCk7CisgKiA8L2NvZGU+PC9ibG9ja3F1b3RlPgorICovCitjbGFzcyBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IgOiBwdWJsaWMgVFByb2Nlc3NvciB7CitwdWJsaWM6CisgIHR5cGVkZWYgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiA+IHNlcnZpY2VzX3Q7CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIDxjb2RlPlRNdWx0aXBsZXhlZFByb2Nlc3NvcjwvY29kZT4gaXMgYSA8Y29kZT5UUHJvY2Vzc29yPC9jb2RlPiBhbGxvd2luZwotICAgICAgICAgKiBhIHNpbmdsZSA8Y29kZT5UU2VydmVyPC9jb2RlPiB0byBwcm92aWRlIG11bHRpcGxlIHNlcnZpY2VzLgotICAgICAgICAgKgotICAgICAgICAgKiA8cD5UbyBkbyBzbywgeW91IGluc3RhbnRpYXRlIHRoZSBwcm9jZXNzb3IgYW5kIHRoZW4gcmVnaXN0ZXIgYWRkaXRpb25hbAotICAgICAgICAgKiBwcm9jZXNzb3JzIHdpdGggaXQsIGFzIHNob3duIGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZTo8L3A+Ci0gICAgICAgICAqCi0gICAgICAgICAqIDxibG9ja3F1b3RlPjxjb2RlPgotICAgICAgICAgKiAgICAgc2hhcmVkX3B0cjxUTXVsdGlwbGV4ZWRQcm9jZXNzb3I+IHByb2Nlc3NvcihuZXcgVE11bHRpcGxleGVkUHJvY2Vzc29yKCkpOwotICAgICAgICAgKgotICAgICAgICAgKiAgICAgcHJvY2Vzc29yLT5yZWdpc3RlclByb2Nlc3NvcigKLSAgICAgICAgICogICAgICAgICAiQ2FsY3VsYXRvciIsCi0gICAgICAgICAqICAgICAgICAgc2hhcmVkX3B0cjxUUHJvY2Vzc29yPiggbmV3IENhbGN1bGF0b3JQcm9jZXNzb3IoCi0gICAgICAgICAqICAgICAgICAgICAgIHNoYXJlZF9wdHI8Q2FsY3VsYXRvckhhbmRsZXI+KCBuZXcgQ2FsY3VsYXRvckhhbmRsZXIoKSkpKSk7Ci0gICAgICAgICAqCi0gICAgICAgICAqICAgICBwcm9jZXNzb3ItPnJlZ2lzdGVyUHJvY2Vzc29yKAotICAgICAgICAgKiAgICAgICAgICJXZWF0aGVyUmVwb3J0IiwKLSAgICAgICAgICogICAgICAgICBzaGFyZWRfcHRyPFRQcm9jZXNzb3I+KCBuZXcgV2VhdGhlclJlcG9ydFByb2Nlc3NvcigKLSAgICAgICAgICogICAgICAgICAgICAgc2hhcmVkX3B0cjxXZWF0aGVyUmVwb3J0SGFuZGxlcj4oIG5ldyBXZWF0aGVyUmVwb3J0SGFuZGxlcigpKSkpKTsKLSAgICAgICAgICoKLSAgICAgICAgICogICAgIHNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4gdHJhbnNwb3J0KG5ldyBUU2VydmVyU29ja2V0KDkwOTApKTsKLSAgICAgICAgICogICAgIFRTaW1wbGVTZXJ2ZXIgc2VydmVyKHByb2Nlc3NvciwgdHJhbnNwb3J0KTsKLSAgICAgICAgICoKLSAgICAgICAgICogICAgIHNlcnZlci5zZXJ2ZSgpOwotICAgICAgICAgKiA8L2NvZGU+PC9ibG9ja3F1b3RlPgotICAgICAgICAgKi8KLSAgICAgICAgY2xhc3MgVE11bHRpcGxleGVkUHJvY2Vzc29yIDogcHVibGljIFRQcm9jZXNzb3IKLSAgICAgICAgewotICAgICAgICBwdWJsaWM6Ci0gICAgICAgICAgICB0eXBlZGVmIHN0ZDo6bWFwPCBzdGQ6OnN0cmluZywgc2hhcmVkX3B0cjxUUHJvY2Vzc29yPiA+IHNlcnZpY2VzX3Q7CisgIC8qKgorICAgICogJ1JlZ2lzdGVyJyBhIHNlcnZpY2Ugd2l0aCB0aGlzIDxjb2RlPlRNdWx0aXBsZXhlZFByb2Nlc3NvcjwvY29kZT4uICBUaGlzCisgICAgKiBhbGxvd3MgdXMgdG8gYnJva2VyIHJlcXVlc3RzIHRvIGluZGl2aWR1YWwgc2VydmljZXMgYnkgdXNpbmcgdGhlIHNlcnZpY2UKKyAgICAqIG5hbWUgdG8gc2VsZWN0IHRoZW0gYXQgcmVxdWVzdCB0aW1lLgorICAgICoKKyAgICAqIFxwYXJhbSBbaW5dIHNlcnZpY2VOYW1lIE5hbWUgb2YgYSBzZXJ2aWNlLCBoYXMgdG8gYmUgaWRlbnRpY2FsIHRvIHRoZSBuYW1lCisgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBkZWNsYXJlZCBpbiB0aGUgVGhyaWZ0IElETCwgZS5nLiAiV2VhdGhlclJlcG9ydCIuCisgICAgKiBccGFyYW0gW2luXSBwcm9jZXNzb3IgICBJbXBsZW1lbnRhdGlvbiBvZiBhIHNlcnZpY2UsIHVzdWFsbHkgcmVmZXJyZWQgdG8KKyAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIGFzICJoYW5kbGVycyIsIGUuZy4gV2VhdGhlclJlcG9ydEhhbmRsZXIsCisgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRpbmcgV2VhdGhlclJlcG9ydElmIGludGVyZmFjZS4KKyAgICAqLworICB2b2lkIHJlZ2lzdGVyUHJvY2Vzc29yKGNvbnN0IHN0ZDo6c3RyaW5nJiBzZXJ2aWNlTmFtZSwgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvcikgeworICAgIHNlcnZpY2VzW3NlcnZpY2VOYW1lXSA9IHByb2Nlc3NvcjsKKyAgfQogCi0gICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogJ1JlZ2lzdGVyJyBhIHNlcnZpY2Ugd2l0aCB0aGlzIDxjb2RlPlRNdWx0aXBsZXhlZFByb2Nlc3NvcjwvY29kZT4uICBUaGlzCi0gICAgICAgICAgICAgKiBhbGxvd3MgdXMgdG8gYnJva2VyIHJlcXVlc3RzIHRvIGluZGl2aWR1YWwgc2VydmljZXMgYnkgdXNpbmcgdGhlIHNlcnZpY2UKLSAgICAgICAgICAgICAqIG5hbWUgdG8gc2VsZWN0IHRoZW0gYXQgcmVxdWVzdCB0aW1lLgotICAgICAgICAgICAgICoKLSAgICAgICAgICAgICAqIFxwYXJhbSBbaW5dIHNlcnZpY2VOYW1lIE5hbWUgb2YgYSBzZXJ2aWNlLCBoYXMgdG8gYmUgaWRlbnRpY2FsIHRvIHRoZSBuYW1lCi0gICAgICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBkZWNsYXJlZCBpbiB0aGUgVGhyaWZ0IElETCwgZS5nLiAiV2VhdGhlclJlcG9ydCIuCi0gICAgICAgICAgICAgKiBccGFyYW0gW2luXSBwcm9jZXNzb3IgICBJbXBsZW1lbnRhdGlvbiBvZiBhIHNlcnZpY2UsIHVzdXNhbGx5IHJlZmVycmVkIHRvCi0gICAgICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBhcyAiaGFuZGxlcnMiLCBlLmcuIFdlYXRoZXJSZXBvcnRIYW5kbGVyLAotICAgICAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50aW5nIFdlYXRoZXJSZXBvcnRJZiBpbnRlcmZhY2UuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHZvaWQgcmVnaXN0ZXJQcm9jZXNzb3IoIGNvbnN0IHN0ZDo6c3RyaW5nICYgc2VydmljZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2VydmljZXNbc2VydmljZU5hbWVdID0gcHJvY2Vzc29yOwotICAgICAgICAgICAgfQorICAvKioKKyAgICogUmVnaXN0ZXIgYSBzZXJ2aWNlIHRvIGJlIGNhbGxlZCB0byBwcm9jZXNzIHF1ZXJpZXMgd2l0aG91dCBzZXJ2aWNlIG5hbWUKKyAgICogXHBhcmFtIFtpbl0gcHJvY2Vzc29yICAgSW1wbGVtZW50YXRpb24gb2YgYSBzZXJ2aWNlLgorICAgKi8KKyAgdm9pZCByZWdpc3RlckRlZmF1bHQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+JiBwcm9jZXNzb3IpIHsKKyAgICBkZWZhdWx0UHJvY2Vzc29yID0gcHJvY2Vzc29yOworICB9CiAKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiA8Y29kZT5wcm9jZXNzPC9jb2RlPiBwZXJmb3JtcyB0aGUgZm9sbG93aW5nIHN0ZXBzOgotICAgICAgICAgICAgICoKLSAgICAgICAgICAgICAqIDxvbD4KLSAgICAgICAgICAgICAqICAgICA8bGk+UmVhZCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBtZXNzYWdlLjwvbGk+Ci0gICAgICAgICAgICAgKiAgICAgPGxpPkV4dHJhY3QgdGhlIHNlcnZpY2UgbmFtZSBmcm9tIHRoZSBtZXNzYWdlLjwvbGk+Ci0gICAgICAgICAgICAgKiAgICAgPGxpPlVzaW5nIHRoZSBzZXJ2aWNlIG5hbWUgdG8gbG9jYXRlIHRoZSBhcHByb3ByaWF0ZSBwcm9jZXNzb3IuPC9saT4KLSAgICAgICAgICAgICAqICAgICA8bGk+RGlzcGF0Y2ggdG8gdGhlIHByb2Nlc3Nvciwgd2l0aCBhIGRlY29yYXRlZCBpbnN0YW5jZSBvZiBUUHJvdG9jb2wKLSAgICAgICAgICAgICAqICAgICAgICAgdGhhdCBhbGxvd3MgcmVhZE1lc3NhZ2VCZWdpbigpIHRvIHJldHVybiB0aGUgb3JpZ2luYWwgVE1lc3NhZ2UuPC9saT4KLSAgICAgICAgICAgICAqIDwvb2w+Ci0gICAgICAgICAgICAgKgotICAgICAgICAgICAgICogXHRocm93cyBURXhjZXB0aW9uIElmIHRoZSBtZXNzYWdlIHR5cGUgaXMgbm90IFRfQ0FMTCBvciBUX09ORVdBWSwgaWYKLSAgICAgICAgICAgICAqIHRoZSBzZXJ2aWNlIG5hbWUgd2FzIG5vdCBmb3VuZCBpbiB0aGUgbWVzc2FnZSwgb3IgaWYgdGhlIHNlcnZpY2UKLSAgICAgICAgICAgICAqIG5hbWUgd2FzIG5vdCBmb3VuZCBpbiB0aGUgc2VydmljZSBtYXAuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGJvb2wgcHJvY2Vzcyggc2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNvbm5lY3Rpb25Db250ZXh0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWU7Ci0gICAgICAgICAgICAgICAgcHJvdG9jb2w6OlRNZXNzYWdlVHlwZSB0eXBlOwotICAgICAgICAgICAgICAgIGludDMyX3Qgc2VxaWQ7CisgIC8qKgorICAgKiBDaGV3IHVwIGludmFsaWQgaW5wdXQgYW5kIHJldHVybiBhbiBleGNlcHRpb24gdG8gdGhyb3cuCisgICAqLworICBURXhjZXB0aW9uIHByb3RvY29sX2Vycm9yKHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNlcWlkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbXNnKSBjb25zdCB7CisgICAgaW4tPnNraXAoOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfU1RSVUNUKTsKKyAgICBpbi0+cmVhZE1lc3NhZ2VFbmQoKTsKKyAgICBpbi0+Z2V0VHJhbnNwb3J0KCktPnJlYWRFbmQoKTsKKyAgICA6OmFwYWNoZTo6dGhyaWZ0OjpUQXBwbGljYXRpb25FeGNlcHRpb24KKyAgICAgIHgoOjphcGFjaGU6OnRocmlmdDo6VEFwcGxpY2F0aW9uRXhjZXB0aW9uOjpQUk9UT0NPTF9FUlJPUiwKKyAgICAgICAgIlRNdWx0aXBsZXhlZFByb2Nlc3NvcjogIiArIG1zZyk7CisgICAgb3V0LT53cml0ZU1lc3NhZ2VCZWdpbihuYW1lLCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9FWENFUFRJT04sIHNlcWlkKTsKKyAgICB4LndyaXRlKG91dC5nZXQoKSk7CisgICAgb3V0LT53cml0ZU1lc3NhZ2VFbmQoKTsKKyAgICBvdXQtPmdldFRyYW5zcG9ydCgpLT53cml0ZUVuZCgpOworICAgIG91dC0+Z2V0VHJhbnNwb3J0KCktPmZsdXNoKCk7CisgICAgcmV0dXJuIFRFeGNlcHRpb24obXNnKTsKK30KKyAgIAorICAvKioKKyAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiA8Y29kZT5wcm9jZXNzPC9jb2RlPiBwZXJmb3JtcyB0aGUgZm9sbG93aW5nIHN0ZXBzOgorICAgKgorICAgKiA8b2w+CisgICAqICAgICA8bGk+UmVhZCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBtZXNzYWdlLjwvbGk+CisgICAqICAgICA8bGk+RXh0cmFjdCB0aGUgc2VydmljZSBuYW1lIGZyb20gdGhlIG1lc3NhZ2UuPC9saT4KKyAgICogICAgIDxsaT5Vc2luZyB0aGUgc2VydmljZSBuYW1lIHRvIGxvY2F0ZSB0aGUgYXBwcm9wcmlhdGUgcHJvY2Vzc29yLjwvbGk+CisgICAqICAgICA8bGk+RGlzcGF0Y2ggdG8gdGhlIHByb2Nlc3Nvciwgd2l0aCBhIGRlY29yYXRlZCBpbnN0YW5jZSBvZiBUUHJvdG9jb2wKKyAgICogICAgICAgICB0aGF0IGFsbG93cyByZWFkTWVzc2FnZUJlZ2luKCkgdG8gcmV0dXJuIHRoZSBvcmlnaW5hbCBUTWVzc2FnZS48L2xpPgorICAgKiA8L29sPgorICAgKgorICAgKiBcdGhyb3dzIFRFeGNlcHRpb24gSWYgdGhlIG1lc3NhZ2UgdHlwZSBpcyBub3QgVF9DQUxMIG9yIFRfT05FV0FZLCBpZgorICAgKiB0aGUgc2VydmljZSBuYW1lIHdhcyBub3QgZm91bmQgaW4gdGhlIG1lc3NhZ2UsIG9yIGlmIHRoZSBzZXJ2aWNlCisgICAqIG5hbWUgd2FzIG5vdCBmb3VuZCBpbiB0aGUgc2VydmljZSBtYXAuCisgICAqLworICBib29sIHByb2Nlc3Moc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IGluLAorICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IG91dCwKKyAgICAgICAgICAgICAgIHZvaWQqIGNvbm5lY3Rpb25Db250ZXh0KSB7CisgICAgc3RkOjpzdHJpbmcgbmFtZTsKKyAgICBwcm90b2NvbDo6VE1lc3NhZ2VUeXBlIHR5cGU7CisgICAgaW50MzJfdCBzZXFpZDsKIAotICAgICAgICAgICAgICAgIC8vIFVzZSB0aGUgYWN0dWFsIHVuZGVybHlpbmcgcHJvdG9jb2wgKGUuZy4gVEJpbmFyeVByb3RvY29sKSB0byByZWFkIHRoZQotICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2UgaGVhZGVyLiAgVGhpcyBwdWxscyB0aGUgbWVzc2FnZSAib2ZmIHRoZSB3aXJlIiwgd2hpY2ggd2UnbGwKLSAgICAgICAgICAgICAgICAvLyBkZWFsIHdpdGggYXQgdGhlIGVuZCBvZiB0aGlzIG1ldGhvZC4KLSAgICAgICAgICAgICAgICBpbi0+cmVhZE1lc3NhZ2VCZWdpbihuYW1lLCB0eXBlLCBzZXFpZCk7CisgICAgLy8gVXNlIHRoZSBhY3R1YWwgdW5kZXJseWluZyBwcm90b2NvbCAoZS5nLiBUQmluYXJ5UHJvdG9jb2wpIHRvIHJlYWQgdGhlCisgICAgLy8gbWVzc2FnZSBoZWFkZXIuICBUaGlzIHB1bGxzIHRoZSBtZXNzYWdlICJvZmYgdGhlIHdpcmUiLCB3aGljaCB3ZSdsbAorICAgIC8vIGRlYWwgd2l0aCBhdCB0aGUgZW5kIG9mIHRoaXMgbWV0aG9kLgorICAgIGluLT5yZWFkTWVzc2FnZUJlZ2luKG5hbWUsIHR5cGUsIHNlcWlkKTsKIAotICAgICAgICAgICAgICAgIGlmKCB0eXBlICE9IHByb3RvY29sOjpUX0NBTEwgJiYgdHlwZSAhPSBwcm90b2NvbDo6VF9PTkVXQVkgKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFVuZXhwZWN0ZWQgbWVzc2FnZSB0eXBlLgotICAgICAgICAgICAgICAgICAgICBpbi0+c2tpcCg6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9TVFJVQ1QpOwotICAgICAgICAgICAgICAgICAgICBpbi0+cmVhZE1lc3NhZ2VFbmQoKTsKLSAgICAgICAgICAgICAgICAgICAgaW4tPmdldFRyYW5zcG9ydCgpLT5yZWFkRW5kKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIG1zZygiVE11bHRpcGxleGVkUHJvY2Vzc29yOiBVbmV4cGVjdGVkIG1lc3NhZ2UgdHlwZSIpOwotICAgICAgICAgICAgICAgICAgICA6OmFwYWNoZTo6dGhyaWZ0OjpUQXBwbGljYXRpb25FeGNlcHRpb24geCgKLSAgICAgICAgICAgICAgICAgICAgICAgIDo6YXBhY2hlOjp0aHJpZnQ6OlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6UFJPVE9DT0xfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICBtc2cpOwotICAgICAgICAgICAgICAgICAgICBvdXQtPndyaXRlTWVzc2FnZUJlZ2luKG5hbWUsIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0VYQ0VQVElPTiwgc2VxaWQpOwotICAgICAgICAgICAgICAgICAgICB4LndyaXRlKG91dC5nZXQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIG91dC0+d3JpdGVNZXNzYWdlRW5kKCk7Ci0gICAgICAgICAgICAgICAgICAgIG91dC0+Z2V0VHJhbnNwb3J0KCktPndyaXRlRW5kKCk7Ci0gICAgICAgICAgICAgICAgICAgIG91dC0+Z2V0VHJhbnNwb3J0KCktPmZsdXNoKCk7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IFRFeGNlcHRpb24obXNnKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBFeHRyYWN0IHRoZSBzZXJ2aWNlIG5hbWUKLQotICAgICAgICAgICAgICAgIGJvb3N0Ojp0b2tlbml6ZXI8Ym9vc3Q6OmNoYXJfc2VwYXJhdG9yPGNoYXI+ID4gdG9rKCBuYW1lLCBib29zdDo6Y2hhcl9zZXBhcmF0b3I8Y2hhcj4oIjoiKSApOwotCi0gICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHRva2VuczsKLSAgICAgICAgICAgICAgICBzdGQ6OmNvcHkoIHRvay5iZWdpbigpLCB0b2suZW5kKCksIHN0ZDo6YmFja19pbnNlcnRlcih0b2tlbnMpICk7Ci0KLSAgICAgICAgICAgICAgICAvLyBBIHZhbGlkIG1lc3NhZ2Ugc2hvdWxkIGNvbnNpc3Qgb2YgdHdvIHRva2VuczogdGhlIHNlcnZpY2UKLSAgICAgICAgICAgICAgICAvLyBuYW1lIGFuZCB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kIHRvIGNhbGwuCi0gICAgICAgICAgICAgICAgaWYoIHRva2Vucy5zaXplKCkgPT0gMiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBTZWFyY2ggZm9yIGEgcHJvY2Vzc29yIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNlcnZpY2UgbmFtZS4KLSAgICAgICAgICAgICAgICAgICAgc2VydmljZXNfdDo6aXRlcmF0b3IgaXQgPSBzZXJ2aWNlcy5maW5kKHRva2Vuc1swXSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIGl0ICE9IHNlcnZpY2VzLmVuZCgpICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IgPSBpdC0+c2Vjb25kOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGV0IHRoZSBwcm9jZXNzb3IgcmVnaXN0ZXJlZCBmb3IgdGhpcyBzZXJ2aWNlIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByb2Nlc3MgdGhlIG1lc3NhZ2UuCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJvY2Vzc29yLT5wcm9jZXNzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBwcm90b2NvbDo6U3RvcmVkTWVzc2FnZVByb3RvY29sKCBpbiwgdG9rZW5zWzFdLCB0eXBlLCBzZXFpZCApICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LCBjb25uZWN0aW9uQ29udGV4dCApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVW5rbm93biBzZXJ2aWNlLgotICAgICAgICAgICAgICAgICAgICAgICAgaW4tPnNraXAoOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfU1RSVUNUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluLT5yZWFkTWVzc2FnZUVuZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaW4tPmdldFRyYW5zcG9ydCgpLT5yZWFkRW5kKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG1zZygiVE11bHRpcGxleGVkUHJvY2Vzc29yOiBVbmtub3duIHNlcnZpY2U6ICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgbXNnICs9IHRva2Vuc1swXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIDo6YXBhY2hlOjp0aHJpZnQ6OlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB4KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6YXBhY2hlOjp0aHJpZnQ6OlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6UFJPVE9DT0xfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dC0+d3JpdGVNZXNzYWdlQmVnaW4obmFtZSwgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfRVhDRVBUSU9OLCBzZXFpZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4LndyaXRlKG91dC5nZXQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXQtPndyaXRlTWVzc2FnZUVuZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0LT5nZXRUcmFuc3BvcnQoKS0+d3JpdGVFbmQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dC0+Z2V0VHJhbnNwb3J0KCktPmZsdXNoKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtc2cgKz0gIi4gRGlkIHlvdSBmb3JnZXQgdG8gY2FsbCByZWdpc3RlclByb2Nlc3NvcigpPyI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBURXhjZXB0aW9uKG1zZyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGU6Ci0gICAgICAgICAgICAvKiogTWFwIG9mIHNlcnZpY2UgcHJvY2Vzc29yIG9iamVjdHMsIGluZGV4ZWQgYnkgc2VydmljZSBuYW1lcy4gKi8KLSAgICAgICAgICAgIHNlcnZpY2VzX3Qgc2VydmljZXM7Ci0gICAgICAgIH07CisgICAgaWYgKHR5cGUgIT0gcHJvdG9jb2w6OlRfQ0FMTCAmJiB0eXBlICE9IHByb3RvY29sOjpUX09ORVdBWSkgeworICAgICAgLy8gVW5leHBlY3RlZCBtZXNzYWdlIHR5cGUuCisgICAgICB0aHJvdyBwcm90b2NvbF9lcnJvcihpbiwgb3V0LCBuYW1lLCBzZXFpZCwgIlVuZXhwZWN0ZWQgbWVzc2FnZSB0eXBlIik7CiAgICAgfQorCisgICAgLy8gRXh0cmFjdCB0aGUgc2VydmljZSBuYW1lCisgICAgYm9vc3Q6OnRva2VuaXplcjxib29zdDo6Y2hhcl9zZXBhcmF0b3I8Y2hhcj4gPiB0b2sobmFtZSwgYm9vc3Q6OmNoYXJfc2VwYXJhdG9yPGNoYXI+KCI6IikpOworCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHRva2VuczsKKyAgICBzdGQ6OmNvcHkodG9rLmJlZ2luKCksIHRvay5lbmQoKSwgc3RkOjpiYWNrX2luc2VydGVyKHRva2VucykpOworCisgICAgLy8gQSB2YWxpZCBtZXNzYWdlIHNob3VsZCBjb25zaXN0IG9mIHR3byB0b2tlbnM6IHRoZSBzZXJ2aWNlCisgICAgLy8gbmFtZSBhbmQgdGhlIG5hbWUgb2YgdGhlIG1ldGhvZCB0byBjYWxsLgorICAgIGlmICh0b2tlbnMuc2l6ZSgpID09IDIpIHsKKyAgICAgIC8vIFNlYXJjaCBmb3IgYSBwcm9jZXNzb3IgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc2VydmljZSBuYW1lLgorICAgICAgc2VydmljZXNfdDo6aXRlcmF0b3IgaXQgPSBzZXJ2aWNlcy5maW5kKHRva2Vuc1swXSk7CisKKyAgICAgIGlmIChpdCAhPSBzZXJ2aWNlcy5lbmQoKSkgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yID0gaXQtPnNlY29uZDsKKyAgICAgICAgLy8gTGV0IHRoZSBwcm9jZXNzb3IgcmVnaXN0ZXJlZCBmb3IgdGhpcyBzZXJ2aWNlIG5hbWUKKyAgICAgICAgLy8gcHJvY2VzcyB0aGUgbWVzc2FnZS4KKyAgICAgICAgcmV0dXJuIHByb2Nlc3NvcgorICAgICAgICAgICAgLT5wcm9jZXNzKHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IHByb3RvY29sOjpTdG9yZWRNZXNzYWdlUHJvdG9jb2woaW4sIHRva2Vuc1sxXSwgdHlwZSwgc2VxaWQpKSwKKyAgICAgICAgICAgICAgICAgICAgICBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbkNvbnRleHQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gVW5rbm93biBzZXJ2aWNlLgorICAgICAgICB0aHJvdyBwcm90b2NvbF9lcnJvcihpbiwgb3V0LCBuYW1lLCBzZXFpZCwgCisgICAgICAgICAgICAiVW5rbm93biBzZXJ2aWNlOiAiICsgdG9rZW5zWzBdICsKKwkJCQkiLiBEaWQgeW91IGZvcmdldCB0byBjYWxsIHJlZ2lzdGVyUHJvY2Vzc29yKCk/Iik7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0b2tlbnMuc2l6ZSgpID09IDEpIHsKKwkgIGlmIChkZWZhdWx0UHJvY2Vzc29yKSB7CisgICAgICAgIC8vIG5vbi1tdWx0aXBsZXhlZCBjbGllbnQgZm9yd2FyZHMgdG8gZGVmYXVsdCBwcm9jZXNzb3IKKyAgICAgICAgcmV0dXJuIGRlZmF1bHRQcm9jZXNzb3IgICAgICAgICAgICAKKyAgICAgICAgICAgIC0+cHJvY2VzcyhzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4oCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBwcm90b2NvbDo6U3RvcmVkTWVzc2FnZVByb3RvY29sKGluLCB0b2tlbnNbMF0sIHR5cGUsIHNlcWlkKSksCisgICAgICAgICAgICAgICAgICAgICAgb3V0LAorICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25Db250ZXh0KTsKKwkgIH0gZWxzZSB7CisJCXRocm93IHByb3RvY29sX2Vycm9yKGluLCBvdXQsIG5hbWUsIHNlcWlkLAorCQkJIk5vbi1tdWx0aXBsZXhlZCBjbGllbnQgcmVxdWVzdCBkcm9wcGVkLiAiCisJCQkiRGlkIHlvdSBmb3JnZXQgdG8gY2FsbCBkZWZhdWx0UHJvY2Vzc29yKCk/Iik7CisJICB9CisgICAgfSBlbHNlIHsKKwkJdGhyb3cgcHJvdG9jb2xfZXJyb3IoaW4sIG91dCwgbmFtZSwgc2VxaWQsCisJCSAgICAiV3JvbmcgbnVtYmVyIG9mIHRva2Vucy4iKTsKKyAgICB9CisgIH0KKworcHJpdmF0ZToKKyAgLyoqIE1hcCBvZiBzZXJ2aWNlIHByb2Nlc3NvciBvYmplY3RzLCBpbmRleGVkIGJ5IHNlcnZpY2UgbmFtZXMuICovCisgIHNlcnZpY2VzX3Qgc2VydmljZXM7CisgIAorICAvLyEgSWYgYSBub24tbXVsdGkgY2xpZW50IHJlcXVlc3RzIHNvbWV0aGluZywgaXQgZ29lcyB0byB0aGUKKyAgLy8hIGRlZmF1bHQgcHJvY2Vzc29yIChpZiBvbmUgaXMgZGVmaW5lZCkgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgorICBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gZGVmYXVsdFByb2Nlc3NvcjsKK307Cit9CiB9CiAKICNlbmRpZiAvLyBUSFJJRlRfVE1VTFRJUExFWEVEUFJPQ0VTU09SX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVEJhc2U2NFV0aWxzLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UQmFzZTY0VXRpbHMuY3BwCmluZGV4IGNkMzQzZWQuLjc0NzRmNWEgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UQmFzZTY0VXRpbHMuY3BwCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UQmFzZTY0VXRpbHMuY3BwCkBAIC0xOSwxNyArMTksMTYgQEAKIAogI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQmFzZTY0VXRpbHMuaD4KIAotI2luY2x1ZGUgPGJvb3N0L3N0YXRpY19hc3NlcnQuaHBwPgotCiB1c2luZyBzdGQ6OnN0cmluZzsKIAotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgcHJvdG9jb2wgeworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBwcm90b2NvbCB7CiAKK3N0YXRpYyBjb25zdCB1aW50OF90KiBrQmFzZTY0RW5jb2RlVGFibGUKKyAgICA9IChjb25zdCB1aW50OF90KikiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyI7CiAKLXN0YXRpYyBjb25zdCB1aW50OF90ICprQmFzZTY0RW5jb2RlVGFibGUgPSAoY29uc3QgdWludDhfdCAqKQotICAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyI7Ci0KLXZvaWQgIGJhc2U2NF9lbmNvZGUoY29uc3QgdWludDhfdCAqaW4sIHVpbnQzMl90IGxlbiwgdWludDhfdCAqYnVmKSB7Cit2b2lkIGJhc2U2NF9lbmNvZGUoY29uc3QgdWludDhfdCogaW4sIHVpbnQzMl90IGxlbiwgdWludDhfdCogYnVmKSB7CiAgIGJ1ZlswXSA9IGtCYXNlNjRFbmNvZGVUYWJsZVsoaW5bMF0gPj4gMikgJiAweDNmXTsKICAgaWYgKGxlbiA9PSAzKSB7CiAgICAgYnVmWzFdID0ga0Jhc2U2NEVuY29kZVRhYmxlWygoaW5bMF0gPDwgNCkgJiAweDMwKSB8ICgoaW5bMV0gPj4gNCkgJiAweDBmKV07CkBAIC0zOCw0MiArMzcsMjc5IEBACiAgIH0gZWxzZSBpZiAobGVuID09IDIpIHsKICAgICBidWZbMV0gPSBrQmFzZTY0RW5jb2RlVGFibGVbKChpblswXSA8PCA0KSAmIDB4MzApIHwgKChpblsxXSA+PiA0KSAmIDB4MGYpXTsKICAgICBidWZbMl0gPSBrQmFzZTY0RW5jb2RlVGFibGVbKGluWzFdIDw8IDIpICYgMHgzY107Ci0gIH0gZWxzZSAgeyAvLyBsZW4gPT0gMQorICB9IGVsc2UgeyAvLyBsZW4gPT0gMQogICAgIGJ1ZlsxXSA9IGtCYXNlNjRFbmNvZGVUYWJsZVsoaW5bMF0gPDwgNCkgJiAweDMwXTsKICAgfQogfQogCi1zdGF0aWMgY29uc3QgdWludDhfdCBrQmFzZTY0RGVjb2RlVGFibGVbMjU2XSA9ewotMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKLTB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCi0weGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHgzZSwweGZmLDB4ZmYsMHhmZiwweDNmLAotMHgzNCwweDM1LDB4MzYsMHgzNywweDM4LDB4MzksMHgzYSwweDNiLDB4M2MsMHgzZCwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKLTB4ZmYsMHgwMCwweDAxLDB4MDIsMHgwMywweDA0LDB4MDUsMHgwNiwweDA3LDB4MDgsMHgwOSwweDBhLDB4MGIsMHgwYywweDBkLDB4MGUsCi0weDBmLDB4MTAsMHgxMSwweDEyLDB4MTMsMHgxNCwweDE1LDB4MTYsMHgxNywweDE4LDB4MTksMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAotMHhmZiwweDFhLDB4MWIsMHgxYywweDFkLDB4MWUsMHgxZiwweDIwLDB4MjEsMHgyMiwweDIzLDB4MjQsMHgyNSwweDI2LDB4MjcsMHgyOCwKLTB4MjksMHgyYSwweDJiLDB4MmMsMHgyZCwweDJlLDB4MmYsMHgzMCwweDMxLDB4MzIsMHgzMywweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCi0weGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAotMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKLTB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCi0weGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAotMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKLTB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCi0weGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAotMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKK3N0YXRpYyBjb25zdCB1aW50OF90IGtCYXNlNjREZWNvZGVUYWJsZVsyNTZdID0geworICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHgzZSwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweDNmLAorICAgIDB4MzQsCisgICAgMHgzNSwKKyAgICAweDM2LAorICAgIDB4MzcsCisgICAgMHgzOCwKKyAgICAweDM5LAorICAgIDB4M2EsCisgICAgMHgzYiwKKyAgICAweDNjLAorICAgIDB4M2QsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweDAwLAorICAgIDB4MDEsCisgICAgMHgwMiwKKyAgICAweDAzLAorICAgIDB4MDQsCisgICAgMHgwNSwKKyAgICAweDA2LAorICAgIDB4MDcsCisgICAgMHgwOCwKKyAgICAweDA5LAorICAgIDB4MGEsCisgICAgMHgwYiwKKyAgICAweDBjLAorICAgIDB4MGQsCisgICAgMHgwZSwKKyAgICAweDBmLAorICAgIDB4MTAsCisgICAgMHgxMSwKKyAgICAweDEyLAorICAgIDB4MTMsCisgICAgMHgxNCwKKyAgICAweDE1LAorICAgIDB4MTYsCisgICAgMHgxNywKKyAgICAweDE4LAorICAgIDB4MTksCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHgxYSwKKyAgICAweDFiLAorICAgIDB4MWMsCisgICAgMHgxZCwKKyAgICAweDFlLAorICAgIDB4MWYsCisgICAgMHgyMCwKKyAgICAweDIxLAorICAgIDB4MjIsCisgICAgMHgyMywKKyAgICAweDI0LAorICAgIDB4MjUsCisgICAgMHgyNiwKKyAgICAweDI3LAorICAgIDB4MjgsCisgICAgMHgyOSwKKyAgICAweDJhLAorICAgIDB4MmIsCisgICAgMHgyYywKKyAgICAweDJkLAorICAgIDB4MmUsCisgICAgMHgyZiwKKyAgICAweDMwLAorICAgIDB4MzEsCisgICAgMHgzMiwKKyAgICAweDMzLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCiB9OwogCi12b2lkIGJhc2U2NF9kZWNvZGUodWludDhfdCAqYnVmLCB1aW50MzJfdCBsZW4pIHsKLSAgYnVmWzBdID0gKGtCYXNlNjREZWNvZGVUYWJsZVtidWZbMF1dIDw8IDIpIHwKLSAgICAgICAgICAgKGtCYXNlNjREZWNvZGVUYWJsZVtidWZbMV1dID4+IDQpOwordm9pZCBiYXNlNjRfZGVjb2RlKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CisgIGJ1ZlswXSA9IChrQmFzZTY0RGVjb2RlVGFibGVbYnVmWzBdXSA8PCAyKSB8IChrQmFzZTY0RGVjb2RlVGFibGVbYnVmWzFdXSA+PiA0KTsKICAgaWYgKGxlbiA+IDIpIHsKLSAgICBidWZbMV0gPSAoKGtCYXNlNjREZWNvZGVUYWJsZVtidWZbMV1dIDw8IDQpICYgMHhmMCkgfAotICAgICAgICAgICAgICAoa0Jhc2U2NERlY29kZVRhYmxlW2J1ZlsyXV0gPj4gMik7CisgICAgYnVmWzFdID0gKChrQmFzZTY0RGVjb2RlVGFibGVbYnVmWzFdXSA8PCA0KSAmIDB4ZjApIHwgKGtCYXNlNjREZWNvZGVUYWJsZVtidWZbMl1dID4+IDIpOwogICAgIGlmIChsZW4gPiAzKSB7Ci0gICAgICBidWZbMl0gPSAoKGtCYXNlNjREZWNvZGVUYWJsZVtidWZbMl1dIDw8IDYpICYgMHhjMCkgfAotICAgICAgICAgICAgICAgIChrQmFzZTY0RGVjb2RlVGFibGVbYnVmWzNdXSk7CisgICAgICBidWZbMl0gPSAoKGtCYXNlNjREZWNvZGVUYWJsZVtidWZbMl1dIDw8IDYpICYgMHhjMCkgfCAoa0Jhc2U2NERlY29kZVRhYmxlW2J1ZlszXV0pOwogICAgIH0KICAgfQogfQotCi0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2wKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVEJhc2U2NFV0aWxzLmggYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVEJhc2U2NFV0aWxzLmgKaW5kZXggM2RlZjczMy4uMWVhNjc0NCAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RCYXNlNjRVdGlscy5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UQmFzZTY0VXRpbHMuaApAQCAtMjMsMjAgKzIzLDIzIEBACiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAjaW5jbHVkZSA8c3RyaW5nPgogCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBwcm90b2NvbCB7CituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHByb3RvY29sIHsKIAogLy8gaW4gbXVzdCBiZSBhdCBsZWFzdCBsZW4gYnl0ZXMKIC8vIGxlbiBtdXN0IGJlIDEsIDIsIG9yIDMKIC8vIGJ1ZiBtdXN0IGJlIGEgYnVmZmVyIG9mIGF0IGxlYXN0IDQgYnl0ZXMgYW5kIG1heSBub3Qgb3ZlcmxhcCBpbgogLy8gdGhlIGRhdGEgaXMgbm90IHBhZGRlZCB3aXRoICc9JzsgdGhlIGNhbGxlciBjYW4gZG8gdGhpcyBpZiBkZXNpcmVkCi12b2lkIGJhc2U2NF9lbmNvZGUoY29uc3QgdWludDhfdCAqaW4sIHVpbnQzMl90IGxlbiwgdWludDhfdCAqYnVmKTsKK3ZvaWQgYmFzZTY0X2VuY29kZShjb25zdCB1aW50OF90KiBpbiwgdWludDMyX3QgbGVuLCB1aW50OF90KiBidWYpOwogCiAvLyBidWYgbXVzdCBiZSBhIGJ1ZmZlciBvZiBhdCBsZWFzdCA0IGJ5dGVzIGFuZCBjb250YWluIGJhc2U2NCBlbmNvZGVkIHZhbHVlcwogLy8gYnVmIHdpbGwgYmUgY2hhbmdlZCB0byBjb250YWluIG91dHB1dCBieXRlcwogLy8gbGVuIGlzIG51bWJlciBvZiBieXRlcyB0byBjb25zdW1lIGZyb20gaW5wdXQgKG11c3QgYmUgMiwgMywgb3IgNCkKIC8vIG5vICc9JyBwYWRkaW5nIHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgaW5wdXQKLXZvaWQgYmFzZTY0X2RlY29kZSh1aW50OF90ICpidWYsIHVpbnQzMl90IGxlbik7Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2wKK3ZvaWQgYmFzZTY0X2RlY29kZSh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbAogCiAjZW5kaWYgLy8gI2RlZmluZSBfVEhSSUZUX1BST1RPQ09MX1RCQVNFNjRVVElMU19IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oCmluZGV4IGE1YjE5ZTUuLjkwNjc3NTggMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmgKQEAgLTIzLDYyICsyMyw0NyBAQAogI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuaD4KICNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFZpcnR1YWxQcm90b2NvbC5oPgogCi0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+CisjaW5jbHVkZSA8bWVtb3J5PgogCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBwcm90b2NvbCB7CituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHByb3RvY29sIHsKIAogLyoqCiAgKiBUaGUgZGVmYXVsdCBiaW5hcnkgcHJvdG9jb2wgZm9yIHRocmlmdC4gV3JpdGVzIGFsbCBkYXRhIGluIGEgdmVyeSBiYXNpYwogICogYmluYXJ5IGZvcm1hdCwgZXNzZW50aWFsbHkganVzdCBzcGl0dGluZyBvdXQgdGhlIHJhdyBieXRlcy4KICAqCiAgKi8KLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotY2xhc3MgVEJpbmFyeVByb3RvY29sVAotICA6IHB1YmxpYyBUVmlydHVhbFByb3RvY29sPCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8+ID4gewotIHByb3RlY3RlZDoKK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfID0gVE5ldHdvcmtCaWdFbmRpYW4+CitjbGFzcyBUQmluYXJ5UHJvdG9jb2xUIDogcHVibGljIFRWaXJ0dWFsUHJvdG9jb2w8VEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPiA+IHsKK3B1YmxpYzoKICAgc3RhdGljIGNvbnN0IGludDMyX3QgVkVSU0lPTl9NQVNLID0gKChpbnQzMl90KTB4ZmZmZjAwMDApOwogICBzdGF0aWMgY29uc3QgaW50MzJfdCBWRVJTSU9OXzEgPSAoKGludDMyX3QpMHg4MDAxMDAwMCk7Ci0gIC8vIFZFUlNJT05fMiAoMHg4MDAyMDAwMCkgIGlzIHRha2VuIGJ5IFREZW5zZVByb3RvY29sLgorICAvLyBWRVJTSU9OXzIgKDB4ODAwMjAwMDApIHdhcyB0YWtlbiBieSBURGVuc2VQcm90b2NvbCAod2hpY2ggaGFzIHNpbmNlIGJlZW4gcmVtb3ZlZCkKIAotIHB1YmxpYzoKLSAgVEJpbmFyeVByb3RvY29sVChib29zdDo6c2hhcmVkX3B0cjxUcmFuc3BvcnRfPiB0cmFucykgOgotICAgIFRWaXJ0dWFsUHJvdG9jb2w8IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0Xz4gPih0cmFucyksCi0gICAgdHJhbnNfKHRyYW5zLmdldCgpKSwKLSAgICBzdHJpbmdfbGltaXRfKDApLAotICAgIGNvbnRhaW5lcl9saW1pdF8oMCksCi0gICAgc3RyaWN0X3JlYWRfKGZhbHNlKSwKLSAgICBzdHJpY3Rfd3JpdGVfKHRydWUpLAotICAgIHN0cmluZ19idWZfKE5VTEwpLAotICAgIHN0cmluZ19idWZfc2l6ZV8oMCkge30KKyAgVEJpbmFyeVByb3RvY29sVChzdGQ6OnNoYXJlZF9wdHI8VHJhbnNwb3J0Xz4gdHJhbnMpCisgICAgOiBUVmlydHVhbFByb3RvY29sPFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz4gPih0cmFucyksCisgICAgICB0cmFuc18odHJhbnMuZ2V0KCkpLAorICAgICAgc3RyaW5nX2xpbWl0XygwKSwKKyAgICAgIGNvbnRhaW5lcl9saW1pdF8oMCksCisgICAgICBzdHJpY3RfcmVhZF8oZmFsc2UpLAorICAgICAgc3RyaWN0X3dyaXRlXyh0cnVlKSB7fQogCi0gIFRCaW5hcnlQcm90b2NvbFQoYm9vc3Q6OnNoYXJlZF9wdHI8VHJhbnNwb3J0Xz4gdHJhbnMsCisgIFRCaW5hcnlQcm90b2NvbFQoc3RkOjpzaGFyZWRfcHRyPFRyYW5zcG9ydF8+IHRyYW5zLAogICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RyaW5nX2xpbWl0LAogICAgICAgICAgICAgICAgICAgIGludDMyX3QgY29udGFpbmVyX2xpbWl0LAogICAgICAgICAgICAgICAgICAgIGJvb2wgc3RyaWN0X3JlYWQsCi0gICAgICAgICAgICAgICAgICAgYm9vbCBzdHJpY3Rfd3JpdGUpIDoKLSAgICBUVmlydHVhbFByb3RvY29sPCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8+ID4odHJhbnMpLAotICAgIHRyYW5zXyh0cmFucy5nZXQoKSksCi0gICAgc3RyaW5nX2xpbWl0XyhzdHJpbmdfbGltaXQpLAotICAgIGNvbnRhaW5lcl9saW1pdF8oY29udGFpbmVyX2xpbWl0KSwKLSAgICBzdHJpY3RfcmVhZF8oc3RyaWN0X3JlYWQpLAotICAgIHN0cmljdF93cml0ZV8oc3RyaWN0X3dyaXRlKSwKLSAgICBzdHJpbmdfYnVmXyhOVUxMKSwKLSAgICBzdHJpbmdfYnVmX3NpemVfKDApIHt9CisgICAgICAgICAgICAgICAgICAgYm9vbCBzdHJpY3Rfd3JpdGUpCisgICAgOiBUVmlydHVhbFByb3RvY29sPFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz4gPih0cmFucyksCisgICAgICB0cmFuc18odHJhbnMuZ2V0KCkpLAorICAgICAgc3RyaW5nX2xpbWl0XyhzdHJpbmdfbGltaXQpLAorICAgICAgY29udGFpbmVyX2xpbWl0Xyhjb250YWluZXJfbGltaXQpLAorICAgICAgc3RyaWN0X3JlYWRfKHN0cmljdF9yZWFkKSwKKyAgICAgIHN0cmljdF93cml0ZV8oc3RyaWN0X3dyaXRlKSB7fQogCi0gIH5UQmluYXJ5UHJvdG9jb2xUKCkgewotICAgIGlmIChzdHJpbmdfYnVmXyAhPSBOVUxMKSB7Ci0gICAgICBzdGQ6OmZyZWUoc3RyaW5nX2J1Zl8pOwotICAgICAgc3RyaW5nX2J1Zl9zaXplXyA9IDA7Ci0gICAgfQotICB9CisgIHZvaWQgc2V0U3RyaW5nU2l6ZUxpbWl0KGludDMyX3Qgc3RyaW5nX2xpbWl0KSB7IHN0cmluZ19saW1pdF8gPSBzdHJpbmdfbGltaXQ7IH0KIAotICB2b2lkIHNldFN0cmluZ1NpemVMaW1pdChpbnQzMl90IHN0cmluZ19saW1pdCkgewotICAgIHN0cmluZ19saW1pdF8gPSBzdHJpbmdfbGltaXQ7Ci0gIH0KLQotICB2b2lkIHNldENvbnRhaW5lclNpemVMaW1pdChpbnQzMl90IGNvbnRhaW5lcl9saW1pdCkgewotICAgIGNvbnRhaW5lcl9saW1pdF8gPSBjb250YWluZXJfbGltaXQ7Ci0gIH0KKyAgdm9pZCBzZXRDb250YWluZXJTaXplTGltaXQoaW50MzJfdCBjb250YWluZXJfbGltaXQpIHsgY29udGFpbmVyX2xpbWl0XyA9IGNvbnRhaW5lcl9saW1pdDsgfQogCiAgIHZvaWQgc2V0U3RyaWN0KGJvb2wgc3RyaWN0X3JlYWQsIGJvb2wgc3RyaWN0X3dyaXRlKSB7CiAgICAgc3RyaWN0X3JlYWRfID0gc3RyaWN0X3JlYWQ7CkBAIC05NSwyMiArODAsMTcgQEAKIAogICAvKm9sKi8gdWludDMyX3Qgd3JpdGVNZXNzYWdlRW5kKCk7CiAKLQogICBpbmxpbmUgdWludDMyX3Qgd3JpdGVTdHJ1Y3RCZWdpbihjb25zdCBjaGFyKiBuYW1lKTsKIAogICBpbmxpbmUgdWludDMyX3Qgd3JpdGVTdHJ1Y3RFbmQoKTsKIAotICBpbmxpbmUgdWludDMyX3Qgd3JpdGVGaWVsZEJlZ2luKGNvbnN0IGNoYXIqIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFR5cGUgZmllbGRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgZmllbGRJZCk7CisgIGlubGluZSB1aW50MzJfdCB3cml0ZUZpZWxkQmVnaW4oY29uc3QgY2hhciogbmFtZSwgY29uc3QgVFR5cGUgZmllbGRUeXBlLCBjb25zdCBpbnQxNl90IGZpZWxkSWQpOwogCiAgIGlubGluZSB1aW50MzJfdCB3cml0ZUZpZWxkRW5kKCk7CiAKICAgaW5saW5lIHVpbnQzMl90IHdyaXRlRmllbGRTdG9wKCk7CiAKLSAgaW5saW5lIHVpbnQzMl90IHdyaXRlTWFwQmVnaW4oY29uc3QgVFR5cGUga2V5VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFR5cGUgdmFsVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSk7CisgIGlubGluZSB1aW50MzJfdCB3cml0ZU1hcEJlZ2luKGNvbnN0IFRUeXBlIGtleVR5cGUsIGNvbnN0IFRUeXBlIHZhbFR5cGUsIGNvbnN0IHVpbnQzMl90IHNpemUpOwogCiAgIGlubGluZSB1aW50MzJfdCB3cml0ZU1hcEVuZCgpOwogCkBAIC0xNDMsMTAgKzEyMyw3IEBACiAgICAqIFJlYWRpbmcgZnVuY3Rpb25zCiAgICAqLwogCi0KLSAgLypvbCovIHVpbnQzMl90IHJlYWRNZXNzYWdlQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRNZXNzYWdlVHlwZSYgbWVzc2FnZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIHNlcWlkKTsKKyAgLypvbCovIHVpbnQzMl90IHJlYWRNZXNzYWdlQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsIFRNZXNzYWdlVHlwZSYgbWVzc2FnZVR5cGUsIGludDMyX3QmIHNlcWlkKTsKIAogICAvKm9sKi8gdWludDMyX3QgcmVhZE1lc3NhZ2VFbmQoKTsKIApAQCAtMTU0LDE1ICsxMzEsMTEgQEAKIAogICBpbmxpbmUgdWludDMyX3QgcmVhZFN0cnVjdEVuZCgpOwogCi0gIGlubGluZSB1aW50MzJfdCByZWFkRmllbGRCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUeXBlJiBmaWVsZFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90JiBmaWVsZElkKTsKKyAgaW5saW5lIHVpbnQzMl90IHJlYWRGaWVsZEJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLCBUVHlwZSYgZmllbGRUeXBlLCBpbnQxNl90JiBmaWVsZElkKTsKIAogICBpbmxpbmUgdWludDMyX3QgcmVhZEZpZWxkRW5kKCk7CiAKLSAgaW5saW5lIHVpbnQzMl90IHJlYWRNYXBCZWdpbihUVHlwZSYga2V5VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZSYgdmFsVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2l6ZSk7CisgIGlubGluZSB1aW50MzJfdCByZWFkTWFwQmVnaW4oVFR5cGUmIGtleVR5cGUsIFRUeXBlJiB2YWxUeXBlLCB1aW50MzJfdCYgc2l6ZSk7CiAKICAgaW5saW5lIHVpbnQzMl90IHJlYWRNYXBFbmQoKTsKIApAQCAtMTc2LDcgKzE0OSw3IEBACiAKICAgaW5saW5lIHVpbnQzMl90IHJlYWRCb29sKGJvb2wmIHZhbHVlKTsKICAgLy8gUHJvdmlkZSB0aGUgZGVmYXVsdCByZWFkQm9vbCgpIGltcGxlbWVudGF0aW9uIGZvciBzdGQ6OnZlY3Rvcjxib29sPgotICB1c2luZyBUVmlydHVhbFByb3RvY29sPCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8+ID46OnJlYWRCb29sOworICB1c2luZyBUVmlydHVhbFByb3RvY29sPFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz4gPjo6cmVhZEJvb2w7CiAKICAgaW5saW5lIHVpbnQzMl90IHJlYWRCeXRlKGludDhfdCYgYnl0ZSk7CiAKQEAgLTE4OCwxMyArMTYxLDEzIEBACiAKICAgaW5saW5lIHVpbnQzMl90IHJlYWREb3VibGUoZG91YmxlJiBkdWIpOwogCi0gIHRlbXBsYXRlPHR5cGVuYW1lIFN0clR5cGU+CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBTdHJUeXBlPgogICBpbmxpbmUgdWludDMyX3QgcmVhZFN0cmluZyhTdHJUeXBlJiBzdHIpOwogCiAgIGlubGluZSB1aW50MzJfdCByZWFkQmluYXJ5KHN0ZDo6c3RyaW5nJiBzdHIpOwogCi0gcHJvdGVjdGVkOgotICB0ZW1wbGF0ZTx0eXBlbmFtZSBTdHJUeXBlPgorcHJvdGVjdGVkOgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU3RyVHlwZT4KICAgdWludDMyX3QgcmVhZFN0cmluZ0JvZHkoU3RyVHlwZSYgc3RyLCBpbnQzMl90IHN6KTsKIAogICBUcmFuc3BvcnRfKiB0cmFuc187CkBAIC0yMDUsNzcgKzE3OCw3MiBAQAogICAvLyBFbmZvcmNlIHByZXNlbmNlIG9mIHZlcnNpb24gaWRlbnRpZmllcgogICBib29sIHN0cmljdF9yZWFkXzsKICAgYm9vbCBzdHJpY3Rfd3JpdGVfOwotCi0gIC8vIEJ1ZmZlciBmb3IgcmVhZGluZyBzdHJpbmdzLCBzYXZlIGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIHByb3RvY29sIHRvCi0gIC8vIGF2b2lkIG1lbW9yeSBjaHVybiBhbGxvY2F0aW5nIG1lbW9yeSBvbiBldmVyeSBzdHJpbmcgcmVhZAotICB1aW50OF90KiBzdHJpbmdfYnVmXzsKLSAgaW50MzJfdCBzdHJpbmdfYnVmX3NpemVfOwotCiB9OwogCiB0eXBlZGVmIFRCaW5hcnlQcm90b2NvbFQ8VFRyYW5zcG9ydD4gVEJpbmFyeVByb3RvY29sOwordHlwZWRlZiBUQmluYXJ5UHJvdG9jb2xUPFRUcmFuc3BvcnQsIFROZXR3b3JrTGl0dGxlRW5kaWFuPiBUTEVCaW5hcnlQcm90b2NvbDsKIAogLyoqCiAgKiBDb25zdHJ1Y3RzIGJpbmFyeSBwcm90b2NvbCBoYW5kbGVycwogICovCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfID0gVE5ldHdvcmtCaWdFbmRpYW4+CiBjbGFzcyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5VCA6IHB1YmxpYyBUUHJvdG9jb2xGYWN0b3J5IHsKLSBwdWJsaWM6Ci0gIFRCaW5hcnlQcm90b2NvbEZhY3RvcnlUKCkgOgotICAgIHN0cmluZ19saW1pdF8oMCksCi0gICAgY29udGFpbmVyX2xpbWl0XygwKSwKLSAgICBzdHJpY3RfcmVhZF8oZmFsc2UpLAotICAgIHN0cmljdF93cml0ZV8odHJ1ZSkge30KK3B1YmxpYzoKKyAgVEJpbmFyeVByb3RvY29sRmFjdG9yeVQoKQorICAgIDogc3RyaW5nX2xpbWl0XygwKSwgY29udGFpbmVyX2xpbWl0XygwKSwgc3RyaWN0X3JlYWRfKGZhbHNlKSwgc3RyaWN0X3dyaXRlXyh0cnVlKSB7fQogCi0gIFRCaW5hcnlQcm90b2NvbEZhY3RvcnlUKGludDMyX3Qgc3RyaW5nX2xpbWl0LCBpbnQzMl90IGNvbnRhaW5lcl9saW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdHJpY3RfcmVhZCwgYm9vbCBzdHJpY3Rfd3JpdGUpIDoKLSAgICBzdHJpbmdfbGltaXRfKHN0cmluZ19saW1pdCksCi0gICAgY29udGFpbmVyX2xpbWl0Xyhjb250YWluZXJfbGltaXQpLAotICAgIHN0cmljdF9yZWFkXyhzdHJpY3RfcmVhZCksCi0gICAgc3RyaWN0X3dyaXRlXyhzdHJpY3Rfd3JpdGUpIHt9CisgIFRCaW5hcnlQcm90b2NvbEZhY3RvcnlUKGludDMyX3Qgc3RyaW5nX2xpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvbnRhaW5lcl9saW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdHJpY3RfcmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdHJpY3Rfd3JpdGUpCisgICAgOiBzdHJpbmdfbGltaXRfKHN0cmluZ19saW1pdCksCisgICAgICBjb250YWluZXJfbGltaXRfKGNvbnRhaW5lcl9saW1pdCksCisgICAgICBzdHJpY3RfcmVhZF8oc3RyaWN0X3JlYWQpLAorICAgICAgc3RyaWN0X3dyaXRlXyhzdHJpY3Rfd3JpdGUpIHt9CiAKICAgdmlydHVhbCB+VEJpbmFyeVByb3RvY29sRmFjdG9yeVQoKSB7fQogCi0gIHZvaWQgc2V0U3RyaW5nU2l6ZUxpbWl0KGludDMyX3Qgc3RyaW5nX2xpbWl0KSB7Ci0gICAgc3RyaW5nX2xpbWl0XyA9IHN0cmluZ19saW1pdDsKLSAgfQorICB2b2lkIHNldFN0cmluZ1NpemVMaW1pdChpbnQzMl90IHN0cmluZ19saW1pdCkgeyBzdHJpbmdfbGltaXRfID0gc3RyaW5nX2xpbWl0OyB9CiAKLSAgdm9pZCBzZXRDb250YWluZXJTaXplTGltaXQoaW50MzJfdCBjb250YWluZXJfbGltaXQpIHsKLSAgICBjb250YWluZXJfbGltaXRfID0gY29udGFpbmVyX2xpbWl0OwotICB9CisgIHZvaWQgc2V0Q29udGFpbmVyU2l6ZUxpbWl0KGludDMyX3QgY29udGFpbmVyX2xpbWl0KSB7IGNvbnRhaW5lcl9saW1pdF8gPSBjb250YWluZXJfbGltaXQ7IH0KIAogICB2b2lkIHNldFN0cmljdChib29sIHN0cmljdF9yZWFkLCBib29sIHN0cmljdF93cml0ZSkgewogICAgIHN0cmljdF9yZWFkXyA9IHN0cmljdF9yZWFkOwogICAgIHN0cmljdF93cml0ZV8gPSBzdHJpY3Rfd3JpdGU7CiAgIH0KIAotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGdldFByb3RvY29sKGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKSB7Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VHJhbnNwb3J0Xz4gc3BlY2lmaWNfdHJhbnMgPQotICAgICAgYm9vc3Q6OmR5bmFtaWNfcG9pbnRlcl9jYXN0PFRyYW5zcG9ydF8+KHRyYW5zKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gZ2V0UHJvdG9jb2woc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRyYW5zcG9ydF8+IHNwZWNpZmljX3RyYW5zID0gc3RkOjpkeW5hbWljX3BvaW50ZXJfY2FzdDxUcmFuc3BvcnRfPih0cmFucyk7CiAgICAgVFByb3RvY29sKiBwcm90OwogICAgIGlmIChzcGVjaWZpY190cmFucykgewotICAgICAgcHJvdCA9IG5ldyBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8+KHNwZWNpZmljX3RyYW5zLCBzdHJpbmdfbGltaXRfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcl9saW1pdF8sIHN0cmljdF9yZWFkXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpY3Rfd3JpdGVfKTsKKyAgICAgIHByb3QgPSBuZXcgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPihzcGVjaWZpY190cmFucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfbGltaXRfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcl9saW1pdF8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWN0X3JlYWRfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmljdF93cml0ZV8pOwogICAgIH0gZWxzZSB7Ci0gICAgICBwcm90ID0gbmV3IFRCaW5hcnlQcm90b2NvbCh0cmFucywgc3RyaW5nX2xpbWl0XywgY29udGFpbmVyX2xpbWl0XywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmljdF9yZWFkXywgc3RyaWN0X3dyaXRlXyk7CisgICAgICBwcm90ID0gbmV3IFRCaW5hcnlQcm90b2NvbFQ8VFRyYW5zcG9ydCwgQnl0ZU9yZGVyXz4odHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX2xpbWl0XywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJfbGltaXRfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmljdF9yZWFkXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpY3Rfd3JpdGVfKTsKICAgICB9CiAKLSAgICByZXR1cm4gYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPihwcm90KTsKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4ocHJvdCk7CiAgIH0KIAotIHByaXZhdGU6Citwcml2YXRlOgogICBpbnQzMl90IHN0cmluZ19saW1pdF87CiAgIGludDMyX3QgY29udGFpbmVyX2xpbWl0XzsKICAgYm9vbCBzdHJpY3RfcmVhZF87CiAgIGJvb2wgc3RyaWN0X3dyaXRlXzsKLQogfTsKIAogdHlwZWRlZiBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5VDxUVHJhbnNwb3J0PiBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5OwotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sCit0eXBlZGVmIFRCaW5hcnlQcm90b2NvbEZhY3RvcnlUPFRUcmFuc3BvcnQsIFROZXR3b3JrTGl0dGxlRW5kaWFuPiBUTEVCaW5hcnlQcm90b2NvbEZhY3Rvcnk7Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbAogCiAjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC50Y2M+CiAKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wudGNjIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC50Y2MKaW5kZXggNDAyMjZhNS4uZmU3Mzk5MiAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC50Y2MKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC50Y2MKQEAgLTI0LDEzICsyNCwxNCBAQAogCiAjaW5jbHVkZSA8bGltaXRzPgogCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHByb3RvY29sIHsKIAotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgcHJvdG9jb2wgewotCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OndyaXRlTWVzc2FnZUJlZ2luKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVE1lc3NhZ2VUeXBlIG1lc3NhZ2VUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBzZXFpZCkgewordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+Ojp3cml0ZU1lc3NhZ2VCZWdpbihjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRNZXNzYWdlVHlwZSBtZXNzYWdlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3Qgc2VxaWQpIHsKICAgaWYgKHRoaXMtPnN0cmljdF93cml0ZV8pIHsKICAgICBpbnQzMl90IHZlcnNpb24gPSAoVkVSU0lPTl8xKSB8ICgoaW50MzJfdCltZXNzYWdlVHlwZSk7CiAgICAgdWludDMyX3Qgd3NpemUgPSAwOwpAQCAtNDcsNDggKzQ4LDQ3IEBACiAgIH0KIH0KIAotdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Ci11aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8+Ojp3cml0ZU1lc3NhZ2VFbmQoKSB7Cit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OndyaXRlTWVzc2FnZUVuZCgpIHsKICAgcmV0dXJuIDA7CiB9CiAKLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotdWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfPjo6d3JpdGVTdHJ1Y3RCZWdpbihjb25zdCBjaGFyKiBuYW1lKSB7Ci0gICh2b2lkKSBuYW1lOwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+Ojp3cml0ZVN0cnVjdEJlZ2luKGNvbnN0IGNoYXIqIG5hbWUpIHsKKyAgKHZvaWQpbmFtZTsKICAgcmV0dXJuIDA7CiB9CiAKLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotdWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfPjo6d3JpdGVTdHJ1Y3RFbmQoKSB7Cit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OndyaXRlU3RydWN0RW5kKCkgewogICByZXR1cm4gMDsKIH0KIAotdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Ci11aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8+Ojp3cml0ZUZpZWxkQmVnaW4oY29uc3QgY2hhciogbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSBmaWVsZFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCBmaWVsZElkKSB7Ci0gICh2b2lkKSBuYW1lOwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+Ojp3cml0ZUZpZWxkQmVnaW4oY29uc3QgY2hhciogbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSBmaWVsZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCBmaWVsZElkKSB7CisgICh2b2lkKW5hbWU7CiAgIHVpbnQzMl90IHdzaXplID0gMDsKICAgd3NpemUgKz0gd3JpdGVCeXRlKChpbnQ4X3QpZmllbGRUeXBlKTsKICAgd3NpemUgKz0gd3JpdGVJMTYoZmllbGRJZCk7CiAgIHJldHVybiB3c2l6ZTsKIH0KIAotdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Ci11aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8+Ojp3cml0ZUZpZWxkRW5kKCkgewordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+Ojp3cml0ZUZpZWxkRW5kKCkgewogICByZXR1cm4gMDsKIH0KIAotdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Ci11aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8+Ojp3cml0ZUZpZWxkU3RvcCgpIHsKLSAgcmV0dXJuCi0gICAgd3JpdGVCeXRlKChpbnQ4X3QpVF9TVE9QKTsKK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfPgordWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPjo6d3JpdGVGaWVsZFN0b3AoKSB7CisgIHJldHVybiB3cml0ZUJ5dGUoKGludDhfdClUX1NUT1ApOwogfQogCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OndyaXRlTWFwQmVnaW4oY29uc3QgVFR5cGUga2V5VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFR5cGUgdmFsVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSkgewordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+Ojp3cml0ZU1hcEJlZ2luKGNvbnN0IFRUeXBlIGtleVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIHZhbFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKICAgdWludDMyX3Qgd3NpemUgPSAwOwogICB3c2l6ZSArPSB3cml0ZUJ5dGUoKGludDhfdClrZXlUeXBlKTsKICAgd3NpemUgKz0gd3JpdGVCeXRlKChpbnQ4X3QpdmFsVHlwZSk7CkBAIC05Niw4OSArOTYsODggQEAKICAgcmV0dXJuIHdzaXplOwogfQogCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OndyaXRlTWFwRW5kKCkgewordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+Ojp3cml0ZU1hcEVuZCgpIHsKICAgcmV0dXJuIDA7CiB9CiAKLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotdWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfPjo6d3JpdGVMaXN0QmVnaW4oY29uc3QgVFR5cGUgZWxlbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKSB7Ci0gIHVpbnQzMl90IHdzaXplID0gMDsKLSAgd3NpemUgKz0gd3JpdGVCeXRlKChpbnQ4X3QpIGVsZW1UeXBlKTsKLSAgd3NpemUgKz0gd3JpdGVJMzIoKGludDMyX3Qpc2l6ZSk7Ci0gIHJldHVybiB3c2l6ZTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Ci11aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8+Ojp3cml0ZUxpc3RFbmQoKSB7Ci0gIHJldHVybiAwOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OndyaXRlU2V0QmVnaW4oY29uc3QgVFR5cGUgZWxlbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfPgordWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPjo6d3JpdGVMaXN0QmVnaW4oY29uc3QgVFR5cGUgZWxlbVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKSB7CiAgIHVpbnQzMl90IHdzaXplID0gMDsKICAgd3NpemUgKz0gd3JpdGVCeXRlKChpbnQ4X3QpZWxlbVR5cGUpOwogICB3c2l6ZSArPSB3cml0ZUkzMigoaW50MzJfdClzaXplKTsKICAgcmV0dXJuIHdzaXplOwogfQogCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OndyaXRlU2V0RW5kKCkgewordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+Ojp3cml0ZUxpc3RFbmQoKSB7CiAgIHJldHVybiAwOwogfQogCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OndyaXRlQm9vbChjb25zdCBib29sIHZhbHVlKSB7Ci0gIHVpbnQ4X3QgdG1wID0gIHZhbHVlID8gMSA6IDA7Cit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OndyaXRlU2V0QmVnaW4oY29uc3QgVFR5cGUgZWxlbVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKKyAgdWludDMyX3Qgd3NpemUgPSAwOworICB3c2l6ZSArPSB3cml0ZUJ5dGUoKGludDhfdCllbGVtVHlwZSk7CisgIHdzaXplICs9IHdyaXRlSTMyKChpbnQzMl90KXNpemUpOworICByZXR1cm4gd3NpemU7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfPgordWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPjo6d3JpdGVTZXRFbmQoKSB7CisgIHJldHVybiAwOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OndyaXRlQm9vbChjb25zdCBib29sIHZhbHVlKSB7CisgIHVpbnQ4X3QgdG1wID0gdmFsdWUgPyAxIDogMDsKICAgdGhpcy0+dHJhbnNfLT53cml0ZSgmdG1wLCAxKTsKICAgcmV0dXJuIDE7CiB9CiAKLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotdWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfPjo6d3JpdGVCeXRlKGNvbnN0IGludDhfdCBieXRlKSB7Cit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OndyaXRlQnl0ZShjb25zdCBpbnQ4X3QgYnl0ZSkgewogICB0aGlzLT50cmFuc18tPndyaXRlKCh1aW50OF90KikmYnl0ZSwgMSk7CiAgIHJldHVybiAxOwogfQogCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OndyaXRlSTE2KGNvbnN0IGludDE2X3QgaTE2KSB7Ci0gIGludDE2X3QgbmV0ID0gKGludDE2X3QpaHRvbnMoaTE2KTsKK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfPgordWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPjo6d3JpdGVJMTYoY29uc3QgaW50MTZfdCBpMTYpIHsKKyAgaW50MTZfdCBuZXQgPSAoaW50MTZfdClCeXRlT3JkZXJfOjp0b1dpcmUxNihpMTYpOwogICB0aGlzLT50cmFuc18tPndyaXRlKCh1aW50OF90KikmbmV0LCAyKTsKICAgcmV0dXJuIDI7CiB9CiAKLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotdWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfPjo6d3JpdGVJMzIoY29uc3QgaW50MzJfdCBpMzIpIHsKLSAgaW50MzJfdCBuZXQgPSAoaW50MzJfdClodG9ubChpMzIpOwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+Ojp3cml0ZUkzMihjb25zdCBpbnQzMl90IGkzMikgeworICBpbnQzMl90IG5ldCA9IChpbnQzMl90KUJ5dGVPcmRlcl86OnRvV2lyZTMyKGkzMik7CiAgIHRoaXMtPnRyYW5zXy0+d3JpdGUoKHVpbnQ4X3QqKSZuZXQsIDQpOwogICByZXR1cm4gNDsKIH0KIAotdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Ci11aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8+Ojp3cml0ZUk2NChjb25zdCBpbnQ2NF90IGk2NCkgewotICBpbnQ2NF90IG5ldCA9IChpbnQ2NF90KWh0b25sbChpNjQpOwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+Ojp3cml0ZUk2NChjb25zdCBpbnQ2NF90IGk2NCkgeworICBpbnQ2NF90IG5ldCA9IChpbnQ2NF90KUJ5dGVPcmRlcl86OnRvV2lyZTY0KGk2NCk7CiAgIHRoaXMtPnRyYW5zXy0+d3JpdGUoKHVpbnQ4X3QqKSZuZXQsIDgpOwogICByZXR1cm4gODsKIH0KIAotdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Ci11aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8+Ojp3cml0ZURvdWJsZShjb25zdCBkb3VibGUgZHViKSB7Ci0gIEJPT1NUX1NUQVRJQ19BU1NFUlQoc2l6ZW9mKGRvdWJsZSkgPT0gc2l6ZW9mKHVpbnQ2NF90KSk7Ci0gIEJPT1NUX1NUQVRJQ19BU1NFUlQoc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+Ojppc19pZWM1NTkpOwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+Ojp3cml0ZURvdWJsZShjb25zdCBkb3VibGUgZHViKSB7CisgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKGRvdWJsZSkgPT0gc2l6ZW9mKHVpbnQ2NF90KSwgInNpemVvZihkb3VibGUpID09IHNpemVvZih1aW50NjRfdCkiKTsKKyAgc3RhdGljX2Fzc2VydChzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmlzX2llYzU1OSwgInN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aXNfaWVjNTU5Iik7CiAKICAgdWludDY0X3QgYml0cyA9IGJpdHdpc2VfY2FzdDx1aW50NjRfdD4oZHViKTsKLSAgYml0cyA9IGh0b25sbChiaXRzKTsKKyAgYml0cyA9IEJ5dGVPcmRlcl86OnRvV2lyZTY0KGJpdHMpOwogICB0aGlzLT50cmFuc18tPndyaXRlKCh1aW50OF90KikmYml0cywgOCk7CiAgIHJldHVybiA4OwogfQogCi0KLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotdGVtcGxhdGU8dHlwZW5hbWUgU3RyVHlwZT4KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OndyaXRlU3RyaW5nKGNvbnN0IFN0clR5cGUmIHN0cikgewotICBpZihzdHIuc2l6ZSgpID4gc3RhdGljX2Nhc3Q8c2l6ZV90Pigoc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWF4KSgpKSkKK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfPgordGVtcGxhdGUgPHR5cGVuYW1lIFN0clR5cGU+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+Ojp3cml0ZVN0cmluZyhjb25zdCBTdHJUeXBlJiBzdHIpIHsKKyAgaWYgKHN0ci5zaXplKCkgPiBzdGF0aWNfY2FzdDxzaXplX3Q+KChzdGQ6Om51bWVyaWNfbGltaXRzPGludDMyX3Q+OjptYXgpKCkpKQogICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OlNJWkVfTElNSVQpOwogICB1aW50MzJfdCBzaXplID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHN0ci5zaXplKCkpOwogICB1aW50MzJfdCByZXN1bHQgPSB3cml0ZUkzMigoaW50MzJfdClzaXplKTsKQEAgLTE4OCwxOSArMTg3LDE5IEBACiAgIHJldHVybiByZXN1bHQgKyBzaXplOwogfQogCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OndyaXRlQmluYXJ5KGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKLSAgcmV0dXJuIFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OndyaXRlU3RyaW5nKHN0cik7Cit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OndyaXRlQmluYXJ5KGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKKyAgcmV0dXJuIFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OndyaXRlU3RyaW5nKHN0cik7CiB9CiAKIC8qKgogICogUmVhZGluZyBmdW5jdGlvbnMKICAqLwogCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnJlYWRNZXNzYWdlQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRNZXNzYWdlVHlwZSYgbWVzc2FnZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIHNlcWlkKSB7Cit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OnJlYWRNZXNzYWdlQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRNZXNzYWdlVHlwZSYgbWVzc2FnZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIHNlcWlkKSB7CiAgIHVpbnQzMl90IHJlc3VsdCA9IDA7CiAgIGludDMyX3Qgc3o7CiAgIHJlc3VsdCArPSByZWFkSTMyKHN6KTsKQEAgLTIxNiw3ICsyMTUsOCBAQAogICAgIHJlc3VsdCArPSByZWFkSTMyKHNlcWlkKTsKICAgfSBlbHNlIHsKICAgICBpZiAodGhpcy0+c3RyaWN0X3JlYWRfKSB7Ci0gICAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpCQURfVkVSU0lPTiwgIk5vIHZlcnNpb24gaWRlbnRpZmllci4uLiBvbGQgcHJvdG9jb2wgY2xpZW50IGluIHN0cmljdCBtb2RlPyIpOworICAgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6QkFEX1ZFUlNJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vIHZlcnNpb24gaWRlbnRpZmllci4uLiBvbGQgcHJvdG9jb2wgY2xpZW50IGluIHN0cmljdCBtb2RlPyIpOwogICAgIH0gZWxzZSB7CiAgICAgICAvLyBIYW5kbGUgcHJlLXZlcnNpb25lZCBpbnB1dAogICAgICAgaW50OF90IHR5cGU7CkBAIC0yMjksMjcgKzIyOSwyNyBAQAogICByZXR1cm4gcmVzdWx0OwogfQogCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnJlYWRNZXNzYWdlRW5kKCkgewordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+OjpyZWFkTWVzc2FnZUVuZCgpIHsKICAgcmV0dXJuIDA7CiB9CiAKLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotdWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfPjo6cmVhZFN0cnVjdEJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lKSB7Cit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OnJlYWRTdHJ1Y3RCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSkgewogICBuYW1lID0gIiI7CiAgIHJldHVybiAwOwogfQogCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnJlYWRTdHJ1Y3RFbmQoKSB7Cit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OnJlYWRTdHJ1Y3RFbmQoKSB7CiAgIHJldHVybiAwOwogfQogCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnJlYWRGaWVsZEJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGUmIGZpZWxkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QmIGZpZWxkSWQpIHsKLSAgKHZvaWQpIG5hbWU7Cit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OnJlYWRGaWVsZEJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGUmIGZpZWxkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QmIGZpZWxkSWQpIHsKKyAgKHZvaWQpbmFtZTsKICAgdWludDMyX3QgcmVzdWx0ID0gMDsKICAgaW50OF90IHR5cGU7CiAgIHJlc3VsdCArPSByZWFkQnl0ZSh0eXBlKTsKQEAgLTI2MiwxNSArMjYyLDE1IEBACiAgIHJldHVybiByZXN1bHQ7CiB9CiAKLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotdWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfPjo6cmVhZEZpZWxkRW5kKCkgewordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+OjpyZWFkRmllbGRFbmQoKSB7CiAgIHJldHVybiAwOwogfQogCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnJlYWRNYXBCZWdpbihUVHlwZSYga2V5VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZSYgdmFsVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2l6ZSkgewordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+OjpyZWFkTWFwQmVnaW4oVFR5cGUmIGtleVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGUmIHZhbFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIHNpemUpIHsKICAgaW50OF90IGssIHY7CiAgIHVpbnQzMl90IHJlc3VsdCA9IDA7CiAgIGludDMyX3Qgc2l6ZWk7CkBAIC0yODgsMTQgKzI4OCwxMyBAQAogICByZXR1cm4gcmVzdWx0OwogfQogCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnJlYWRNYXBFbmQoKSB7Cit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OnJlYWRNYXBFbmQoKSB7CiAgIHJldHVybiAwOwogfQogCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnJlYWRMaXN0QmVnaW4oVFR5cGUmIGVsZW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2l6ZSkgewordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+OjpyZWFkTGlzdEJlZ2luKFRUeXBlJiBlbGVtVHlwZSwgdWludDMyX3QmIHNpemUpIHsKICAgaW50OF90IGU7CiAgIHVpbnQzMl90IHJlc3VsdCA9IDA7CiAgIGludDMyX3Qgc2l6ZWk7CkBAIC0zMTEsMTQgKzMxMCwxMyBAQAogICByZXR1cm4gcmVzdWx0OwogfQogCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnJlYWRMaXN0RW5kKCkgewordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+OjpyZWFkTGlzdEVuZCgpIHsKICAgcmV0dXJuIDA7CiB9CiAKLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotdWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfPjo6cmVhZFNldEJlZ2luKFRUeXBlJiBlbGVtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2l6ZSkgewordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+OjpyZWFkU2V0QmVnaW4oVFR5cGUmIGVsZW1UeXBlLCB1aW50MzJfdCYgc2l6ZSkgewogICBpbnQ4X3QgZTsKICAgdWludDMyX3QgcmVzdWx0ID0gMDsKICAgaW50MzJfdCBzaXplaTsKQEAgLTMzNCw5MyArMzMyLDkyIEBACiAgIHJldHVybiByZXN1bHQ7CiB9CiAKLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotdWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfPjo6cmVhZFNldEVuZCgpIHsKK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfPgordWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPjo6cmVhZFNldEVuZCgpIHsKICAgcmV0dXJuIDA7CiB9CiAKLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotdWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfPjo6cmVhZEJvb2woYm9vbCYgdmFsdWUpIHsKK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfPgordWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPjo6cmVhZEJvb2woYm9vbCYgdmFsdWUpIHsKICAgdWludDhfdCBiWzFdOwogICB0aGlzLT50cmFuc18tPnJlYWRBbGwoYiwgMSk7CiAgIHZhbHVlID0gKihpbnQ4X3QqKWIgIT0gMDsKICAgcmV0dXJuIDE7CiB9CiAKLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotdWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfPjo6cmVhZEJ5dGUoaW50OF90JiBieXRlKSB7Cit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OnJlYWRCeXRlKGludDhfdCYgYnl0ZSkgewogICB1aW50OF90IGJbMV07CiAgIHRoaXMtPnRyYW5zXy0+cmVhZEFsbChiLCAxKTsKICAgYnl0ZSA9ICooaW50OF90KiliOwogICByZXR1cm4gMTsKIH0KIAotdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Ci11aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8+OjpyZWFkSTE2KGludDE2X3QmIGkxNikgewordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+OjpyZWFkSTE2KGludDE2X3QmIGkxNikgewogICB1bmlvbiBieXRlcyB7CiAgICAgdWludDhfdCBiWzJdOwogICAgIGludDE2X3QgYWxsOwogICB9IHRoZUJ5dGVzOwogICB0aGlzLT50cmFuc18tPnJlYWRBbGwodGhlQnl0ZXMuYiwgMik7Ci0gIGkxNiA9IChpbnQxNl90KW50b2hzKHRoZUJ5dGVzLmFsbCk7CisgIGkxNiA9IChpbnQxNl90KUJ5dGVPcmRlcl86OmZyb21XaXJlMTYodGhlQnl0ZXMuYWxsKTsKICAgcmV0dXJuIDI7CiB9CiAKLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotdWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfPjo6cmVhZEkzMihpbnQzMl90JiBpMzIpIHsKK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfPgordWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPjo6cmVhZEkzMihpbnQzMl90JiBpMzIpIHsKICAgdW5pb24gYnl0ZXMgewogICAgIHVpbnQ4X3QgYls0XTsKICAgICBpbnQzMl90IGFsbDsKICAgfSB0aGVCeXRlczsKICAgdGhpcy0+dHJhbnNfLT5yZWFkQWxsKHRoZUJ5dGVzLmIsIDQpOwotICBpMzIgPSAoaW50MzJfdCludG9obCh0aGVCeXRlcy5hbGwpOworICBpMzIgPSAoaW50MzJfdClCeXRlT3JkZXJfOjpmcm9tV2lyZTMyKHRoZUJ5dGVzLmFsbCk7CiAgIHJldHVybiA0OwogfQogCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnJlYWRJNjQoaW50NjRfdCYgaTY0KSB7Cit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OnJlYWRJNjQoaW50NjRfdCYgaTY0KSB7CiAgIHVuaW9uIGJ5dGVzIHsKICAgICB1aW50OF90IGJbOF07CiAgICAgaW50NjRfdCBhbGw7CiAgIH0gdGhlQnl0ZXM7CiAgIHRoaXMtPnRyYW5zXy0+cmVhZEFsbCh0aGVCeXRlcy5iLCA4KTsKLSAgaTY0ID0gKGludDY0X3QpbnRvaGxsKHRoZUJ5dGVzLmFsbCk7CisgIGk2NCA9IChpbnQ2NF90KUJ5dGVPcmRlcl86OmZyb21XaXJlNjQodGhlQnl0ZXMuYWxsKTsKICAgcmV0dXJuIDg7CiB9CiAKLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotdWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfPjo6cmVhZERvdWJsZShkb3VibGUmIGR1YikgewotICBCT09TVF9TVEFUSUNfQVNTRVJUKHNpemVvZihkb3VibGUpID09IHNpemVvZih1aW50NjRfdCkpOwotICBCT09TVF9TVEFUSUNfQVNTRVJUKHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aXNfaWVjNTU5KTsKK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfPgordWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPjo6cmVhZERvdWJsZShkb3VibGUmIGR1YikgeworICBzdGF0aWNfYXNzZXJ0KHNpemVvZihkb3VibGUpID09IHNpemVvZih1aW50NjRfdCksICJzaXplb2YoZG91YmxlKSA9PSBzaXplb2YodWludDY0X3QpIik7CisgIHN0YXRpY19hc3NlcnQoc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+Ojppc19pZWM1NTksICJzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmlzX2llYzU1OSIpOwogCiAgIHVuaW9uIGJ5dGVzIHsKICAgICB1aW50OF90IGJbOF07CiAgICAgdWludDY0X3QgYWxsOwogICB9IHRoZUJ5dGVzOwogICB0aGlzLT50cmFuc18tPnJlYWRBbGwodGhlQnl0ZXMuYiwgOCk7Ci0gIHRoZUJ5dGVzLmFsbCA9IG50b2hsbCh0aGVCeXRlcy5hbGwpOworICB0aGVCeXRlcy5hbGwgPSBCeXRlT3JkZXJfOjpmcm9tV2lyZTY0KHRoZUJ5dGVzLmFsbCk7CiAgIGR1YiA9IGJpdHdpc2VfY2FzdDxkb3VibGU+KHRoZUJ5dGVzLmFsbCk7CiAgIHJldHVybiA4OwogfQogCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXRlbXBsYXRlPHR5cGVuYW1lIFN0clR5cGU+Ci11aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8+OjpyZWFkU3RyaW5nKFN0clR5cGUmIHN0cikgewordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU3RyVHlwZT4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OnJlYWRTdHJpbmcoU3RyVHlwZSYgc3RyKSB7CiAgIHVpbnQzMl90IHJlc3VsdDsKICAgaW50MzJfdCBzaXplOwogICByZXN1bHQgPSByZWFkSTMyKHNpemUpOwogICByZXR1cm4gcmVzdWx0ICsgcmVhZFN0cmluZ0JvZHkoc3RyLCBzaXplKTsKIH0KIAotdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Ci11aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8+OjpyZWFkQmluYXJ5KHN0ZDo6c3RyaW5nJiBzdHIpIHsKLSAgcmV0dXJuIFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnJlYWRTdHJpbmcoc3RyKTsKK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfPgordWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPjo6cmVhZEJpbmFyeShzdGQ6OnN0cmluZyYgc3RyKSB7CisgIHJldHVybiBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+OjpyZWFkU3RyaW5nKHN0cik7CiB9CiAKLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotdGVtcGxhdGU8dHlwZW5hbWUgU3RyVHlwZT4KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnJlYWRTdHJpbmdCb2R5KFN0clR5cGUmIHN0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2l6ZSkgewordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU3RyVHlwZT4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OnJlYWRTdHJpbmdCb2R5KFN0clR5cGUmIHN0ciwgaW50MzJfdCBzaXplKSB7CiAgIHVpbnQzMl90IHJlc3VsdCA9IDA7CiAKICAgLy8gQ2F0Y2ggZXJyb3IgY2FzZXMKQEAgLTQ0NywxMCArNDQ0LDExIEBACiAgIH0KIAogICBzdHIucmVzaXplKHNpemUpOwotICB0aGlzLT50cmFuc18tPnJlYWRBbGwocmVpbnRlcnByZXRfY2FzdDx1aW50OF90ICo+KCZzdHJbMF0pLCBzaXplKTsKKyAgdGhpcy0+dHJhbnNfLT5yZWFkQWxsKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KCZzdHJbMF0pLCBzaXplKTsKICAgcmV0dXJuICh1aW50MzJfdClzaXplOwogfQotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sCit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbAogCiAjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1BST1RPQ09MX1RCSU5BUllQUk9UT0NPTF9UQ0NfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wuaAppbmRleCBjZTYwYjQ1Li41Y2ZiNDdkIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLmgKQEAgLTIzLDIzICsyMywyNSBAQAogI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UVmlydHVhbFByb3RvY29sLmg+CiAKICNpbmNsdWRlIDxzdGFjaz4KLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KKyNpbmNsdWRlIDxtZW1vcnk+CiAKLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHByb3RvY29sIHsKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgcHJvdG9jb2wgewogCiAvKioKICAqIEMrKyBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgQ29tcGFjdCBQcm90b2NvbCBhcyBkZXNjcmliZWQgaW4gVEhSSUZULTExMAogICovCiB0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLWNsYXNzIFRDb21wYWN0UHJvdG9jb2xUCi0gIDogcHVibGljIFRWaXJ0dWFsUHJvdG9jb2w8IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+ID4geworY2xhc3MgVENvbXBhY3RQcm90b2NvbFQgOiBwdWJsaWMgVFZpcnR1YWxQcm90b2NvbDxUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPiA+IHsKK3B1YmxpYzoKKyAgc3RhdGljIGNvbnN0IGludDhfdCBQUk9UT0NPTF9JRCA9IChpbnQ4X3QpMHg4MnU7CisgIHN0YXRpYyBjb25zdCBpbnQ4X3QgVkVSU0lPTl9OID0gMTsKKyAgc3RhdGljIGNvbnN0IGludDhfdCBWRVJTSU9OX01BU0sgPSAweDFmOyAgICAgICAvLyAwMDAxIDExMTEKIAotIHByb3RlY3RlZDoKLSAgc3RhdGljIGNvbnN0IGludDhfdCAgUFJPVE9DT0xfSUQgPSAoaW50OF90KTB4ODJ1OwotICBzdGF0aWMgY29uc3QgaW50OF90ICBWRVJTSU9OX04gPSAxOwotICBzdGF0aWMgY29uc3QgaW50OF90ICBWRVJTSU9OX01BU0sgPSAweDFmOyAvLyAwMDAxIDExMTEKLSAgc3RhdGljIGNvbnN0IGludDhfdCAgVFlQRV9NQVNLID0gKGludDhfdCkweEUwdTsgLy8gMTExMCAwMDAwCi0gIHN0YXRpYyBjb25zdCBpbnQ4X3QgIFRZUEVfQklUUyA9IDB4MDc7IC8vIDAwMDAgMDExMQorcHJvdGVjdGVkOgorICBzdGF0aWMgY29uc3QgaW50OF90IFRZUEVfTUFTSyA9IChpbnQ4X3QpMHhFMHU7IC8vIDExMTAgMDAwMAorICBzdGF0aWMgY29uc3QgaW50OF90IFRZUEVfQklUUyA9IDB4MDc7ICAgICAgICAgIC8vIDAwMDAgMDExMQogICBzdGF0aWMgY29uc3QgaW50MzJfdCBUWVBFX1NISUZUX0FNT1VOVCA9IDU7CiAKICAgVHJhbnNwb3J0XyogdHJhbnNfOwpAQCAtNzEsMzcgKzczLDM0IEBACiAgIHN0ZDo6c3RhY2s8aW50MTZfdD4gbGFzdEZpZWxkXzsKICAgaW50MTZfdCBsYXN0RmllbGRJZF87CiAKLSBwdWJsaWM6Ci0gIFRDb21wYWN0UHJvdG9jb2xUKGJvb3N0OjpzaGFyZWRfcHRyPFRyYW5zcG9ydF8+IHRyYW5zKSA6Ci0gICAgVFZpcnR1YWxQcm90b2NvbDwgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz4gPih0cmFucyksCi0gICAgdHJhbnNfKHRyYW5zLmdldCgpKSwKLSAgICBsYXN0RmllbGRJZF8oMCksCi0gICAgc3RyaW5nX2xpbWl0XygwKSwKLSAgICBzdHJpbmdfYnVmXyhOVUxMKSwKLSAgICBzdHJpbmdfYnVmX3NpemVfKDApLAotICAgIGNvbnRhaW5lcl9saW1pdF8oMCkgeworcHVibGljOgorICBUQ29tcGFjdFByb3RvY29sVChzdGQ6OnNoYXJlZF9wdHI8VHJhbnNwb3J0Xz4gdHJhbnMpCisgICAgOiBUVmlydHVhbFByb3RvY29sPFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+ID4odHJhbnMpLAorICAgICAgdHJhbnNfKHRyYW5zLmdldCgpKSwKKyAgICAgIGxhc3RGaWVsZElkXygwKSwKKyAgICAgIHN0cmluZ19saW1pdF8oMCksCisgICAgICBzdHJpbmdfYnVmXyhOVUxMKSwKKyAgICAgIHN0cmluZ19idWZfc2l6ZV8oMCksCisgICAgICBjb250YWluZXJfbGltaXRfKDApIHsKICAgICBib29sZWFuRmllbGRfLm5hbWUgPSBOVUxMOwogICAgIGJvb2xWYWx1ZV8uaGFzQm9vbFZhbHVlID0gZmFsc2U7CiAgIH0KIAotICBUQ29tcGFjdFByb3RvY29sVChib29zdDo6c2hhcmVkX3B0cjxUcmFuc3BvcnRfPiB0cmFucywKKyAgVENvbXBhY3RQcm90b2NvbFQoc3RkOjpzaGFyZWRfcHRyPFRyYW5zcG9ydF8+IHRyYW5zLAogICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0cmluZ19saW1pdCwKLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjb250YWluZXJfbGltaXQpIDoKLSAgICBUVmlydHVhbFByb3RvY29sPCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPiA+KHRyYW5zKSwKLSAgICB0cmFuc18odHJhbnMuZ2V0KCkpLAotICAgIGxhc3RGaWVsZElkXygwKSwKLSAgICBzdHJpbmdfbGltaXRfKHN0cmluZ19saW1pdCksCi0gICAgc3RyaW5nX2J1Zl8oTlVMTCksCi0gICAgc3RyaW5nX2J1Zl9zaXplXygwKSwKLSAgICBjb250YWluZXJfbGltaXRfKGNvbnRhaW5lcl9saW1pdCkgeworICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvbnRhaW5lcl9saW1pdCkKKyAgICA6IFRWaXJ0dWFsUHJvdG9jb2w8VENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz4gPih0cmFucyksCisgICAgICB0cmFuc18odHJhbnMuZ2V0KCkpLAorICAgICAgbGFzdEZpZWxkSWRfKDApLAorICAgICAgc3RyaW5nX2xpbWl0XyhzdHJpbmdfbGltaXQpLAorICAgICAgc3RyaW5nX2J1Zl8oTlVMTCksCisgICAgICBzdHJpbmdfYnVmX3NpemVfKDApLAorICAgICAgY29udGFpbmVyX2xpbWl0Xyhjb250YWluZXJfbGltaXQpIHsKICAgICBib29sZWFuRmllbGRfLm5hbWUgPSBOVUxMOwogICAgIGJvb2xWYWx1ZV8uaGFzQm9vbFZhbHVlID0gZmFsc2U7CiAgIH0KIAotICB+VENvbXBhY3RQcm90b2NvbFQoKSB7Ci0gICAgZnJlZShzdHJpbmdfYnVmXyk7Ci0gIH0KLQorICB+VENvbXBhY3RQcm90b2NvbFQoKSB7IGZyZWUoc3RyaW5nX2J1Zl8pOyB9CiAKICAgLyoqCiAgICAqIFdyaXRpbmcgZnVuY3Rpb25zCkBAIC0xMTUsMjEgKzExNCwxNSBAQAogCiAgIHVpbnQzMl90IHdyaXRlU3RydWN0RW5kKCk7CiAKLSAgdWludDMyX3Qgd3JpdGVGaWVsZEJlZ2luKGNvbnN0IGNoYXIqIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSBmaWVsZFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90IGZpZWxkSWQpOworICB1aW50MzJfdCB3cml0ZUZpZWxkQmVnaW4oY29uc3QgY2hhciogbmFtZSwgY29uc3QgVFR5cGUgZmllbGRUeXBlLCBjb25zdCBpbnQxNl90IGZpZWxkSWQpOwogCiAgIHVpbnQzMl90IHdyaXRlRmllbGRTdG9wKCk7CiAKLSAgdWludDMyX3Qgd3JpdGVMaXN0QmVnaW4oY29uc3QgVFR5cGUgZWxlbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpOworICB1aW50MzJfdCB3cml0ZUxpc3RCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSk7CiAKLSAgdWludDMyX3Qgd3JpdGVTZXRCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKTsKKyAgdWludDMyX3Qgd3JpdGVTZXRCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSk7CiAKLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZU1hcEJlZ2luKGNvbnN0IFRUeXBlIGtleVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSB2YWxUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSk7CisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVNYXBCZWdpbihjb25zdCBUVHlwZSBrZXlUeXBlLCBjb25zdCBUVHlwZSB2YWxUeXBlLCBjb25zdCB1aW50MzJfdCBzaXplKTsKIAogICB1aW50MzJfdCB3cml0ZUJvb2woY29uc3QgYm9vbCB2YWx1ZSk7CiAKQEAgLTE1Nyw3ICsxNTAsNyBAQAogICB1aW50MzJfdCB3cml0ZVNldEVuZCgpIHsgcmV0dXJuIDA7IH0KICAgdWludDMyX3Qgd3JpdGVGaWVsZEVuZCgpIHsgcmV0dXJuIDA7IH0KIAotIHByb3RlY3RlZDoKK3Byb3RlY3RlZDoKICAgaW50MzJfdCB3cml0ZUZpZWxkQmVnaW5JbnRlcm5hbChjb25zdCBjaGFyKiBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIGZpZWxkVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90IGZpZWxkSWQsCkBAIC0xNjksMzIgKzE2MiwyNCBAQAogICB1aW50MzJfdCBpMzJUb1ppZ3phZyhjb25zdCBpbnQzMl90IG4pOwogICBpbmxpbmUgaW50OF90IGdldENvbXBhY3RUeXBlKGNvbnN0IFRUeXBlIHR0eXBlKTsKIAotIHB1YmxpYzoKLSAgdWludDMyX3QgcmVhZE1lc3NhZ2VCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTWVzc2FnZVR5cGUmIG1lc3NhZ2VUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIHNlcWlkKTsKK3B1YmxpYzoKKyAgdWludDMyX3QgcmVhZE1lc3NhZ2VCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSwgVE1lc3NhZ2VUeXBlJiBtZXNzYWdlVHlwZSwgaW50MzJfdCYgc2VxaWQpOwogCiAgIHVpbnQzMl90IHJlYWRTdHJ1Y3RCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSk7CiAKICAgdWludDMyX3QgcmVhZFN0cnVjdEVuZCgpOwogCi0gIHVpbnQzMl90IHJlYWRGaWVsZEJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZSYgZmllbGRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90JiBmaWVsZElkKTsKKyAgdWludDMyX3QgcmVhZEZpZWxkQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsIFRUeXBlJiBmaWVsZFR5cGUsIGludDE2X3QmIGZpZWxkSWQpOwogCi0gIHVpbnQzMl90IHJlYWRNYXBCZWdpbihUVHlwZSYga2V5VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFRUeXBlJiB2YWxUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIHNpemUpOworICB1aW50MzJfdCByZWFkTWFwQmVnaW4oVFR5cGUmIGtleVR5cGUsIFRUeXBlJiB2YWxUeXBlLCB1aW50MzJfdCYgc2l6ZSk7CiAKLSAgdWludDMyX3QgcmVhZExpc3RCZWdpbihUVHlwZSYgZWxlbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIHNpemUpOworICB1aW50MzJfdCByZWFkTGlzdEJlZ2luKFRUeXBlJiBlbGVtVHlwZSwgdWludDMyX3QmIHNpemUpOwogCi0gIHVpbnQzMl90IHJlYWRTZXRCZWdpbihUVHlwZSYgZWxlbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2l6ZSk7CisgIHVpbnQzMl90IHJlYWRTZXRCZWdpbihUVHlwZSYgZWxlbVR5cGUsIHVpbnQzMl90JiBzaXplKTsKIAogICB1aW50MzJfdCByZWFkQm9vbChib29sJiB2YWx1ZSk7CiAgIC8vIFByb3ZpZGUgdGhlIGRlZmF1bHQgcmVhZEJvb2woKSBpbXBsZW1lbnRhdGlvbiBmb3Igc3RkOjp2ZWN0b3I8Ym9vbD4KLSAgdXNpbmcgVFZpcnR1YWxQcm90b2NvbDwgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz4gPjo6cmVhZEJvb2w7CisgIHVzaW5nIFRWaXJ0dWFsUHJvdG9jb2w8VENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz4gPjo6cmVhZEJvb2w7CiAKICAgdWludDMyX3QgcmVhZEJ5dGUoaW50OF90JiBieXRlKTsKIApAQCAtMjIwLDcgKzIwNSw3IEBACiAgIHVpbnQzMl90IHJlYWRMaXN0RW5kKCkgeyByZXR1cm4gMDsgfQogICB1aW50MzJfdCByZWFkU2V0RW5kKCkgeyByZXR1cm4gMDsgfQogCi0gcHJvdGVjdGVkOgorcHJvdGVjdGVkOgogICB1aW50MzJfdCByZWFkVmFyaW50MzIoaW50MzJfdCYgaTMyKTsKICAgdWludDMyX3QgcmVhZFZhcmludDY0KGludDY0X3QmIGk2NCk7CiAgIGludDMyX3QgemlnemFnVG9JMzIodWludDMyX3Qgbik7CkBAIC0yNDIsNDggKzIyNywzOSBAQAogICovCiB0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KIGNsYXNzIFRDb21wYWN0UHJvdG9jb2xGYWN0b3J5VCA6IHB1YmxpYyBUUHJvdG9jb2xGYWN0b3J5IHsKLSBwdWJsaWM6Ci0gIFRDb21wYWN0UHJvdG9jb2xGYWN0b3J5VCgpIDoKLSAgICBzdHJpbmdfbGltaXRfKDApLAotICAgIGNvbnRhaW5lcl9saW1pdF8oMCkge30KK3B1YmxpYzoKKyAgVENvbXBhY3RQcm90b2NvbEZhY3RvcnlUKCkgOiBzdHJpbmdfbGltaXRfKDApLCBjb250YWluZXJfbGltaXRfKDApIHt9CiAKLSAgVENvbXBhY3RQcm90b2NvbEZhY3RvcnlUKGludDMyX3Qgc3RyaW5nX2xpbWl0LCBpbnQzMl90IGNvbnRhaW5lcl9saW1pdCkgOgotICAgIHN0cmluZ19saW1pdF8oc3RyaW5nX2xpbWl0KSwKLSAgICBjb250YWluZXJfbGltaXRfKGNvbnRhaW5lcl9saW1pdCkge30KKyAgVENvbXBhY3RQcm90b2NvbEZhY3RvcnlUKGludDMyX3Qgc3RyaW5nX2xpbWl0LCBpbnQzMl90IGNvbnRhaW5lcl9saW1pdCkKKyAgICA6IHN0cmluZ19saW1pdF8oc3RyaW5nX2xpbWl0KSwgY29udGFpbmVyX2xpbWl0Xyhjb250YWluZXJfbGltaXQpIHt9CiAKICAgdmlydHVhbCB+VENvbXBhY3RQcm90b2NvbEZhY3RvcnlUKCkge30KIAotICB2b2lkIHNldFN0cmluZ1NpemVMaW1pdChpbnQzMl90IHN0cmluZ19saW1pdCkgewotICAgIHN0cmluZ19saW1pdF8gPSBzdHJpbmdfbGltaXQ7Ci0gIH0KKyAgdm9pZCBzZXRTdHJpbmdTaXplTGltaXQoaW50MzJfdCBzdHJpbmdfbGltaXQpIHsgc3RyaW5nX2xpbWl0XyA9IHN0cmluZ19saW1pdDsgfQogCi0gIHZvaWQgc2V0Q29udGFpbmVyU2l6ZUxpbWl0KGludDMyX3QgY29udGFpbmVyX2xpbWl0KSB7Ci0gICAgY29udGFpbmVyX2xpbWl0XyA9IGNvbnRhaW5lcl9saW1pdDsKLSAgfQorICB2b2lkIHNldENvbnRhaW5lclNpemVMaW1pdChpbnQzMl90IGNvbnRhaW5lcl9saW1pdCkgeyBjb250YWluZXJfbGltaXRfID0gY29udGFpbmVyX2xpbWl0OyB9CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBnZXRQcm90b2NvbChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFucykgewotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRyYW5zcG9ydF8+IHNwZWNpZmljX3RyYW5zID0KLSAgICAgIGJvb3N0OjpkeW5hbWljX3BvaW50ZXJfY2FzdDxUcmFuc3BvcnRfPih0cmFucyk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGdldFByb3RvY29sKHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFucykgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxUcmFuc3BvcnRfPiBzcGVjaWZpY190cmFucyA9IHN0ZDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8VHJhbnNwb3J0Xz4odHJhbnMpOwogICAgIFRQcm90b2NvbCogcHJvdDsKICAgICBpZiAoc3BlY2lmaWNfdHJhbnMpIHsKLSAgICAgIHByb3QgPSBuZXcgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz4oc3BlY2lmaWNfdHJhbnMsIHN0cmluZ19saW1pdF8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcl9saW1pdF8pOworICAgICAgcHJvdCA9IG5ldyBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPihzcGVjaWZpY190cmFucywgc3RyaW5nX2xpbWl0XywgY29udGFpbmVyX2xpbWl0Xyk7CiAgICAgfSBlbHNlIHsKICAgICAgIHByb3QgPSBuZXcgVENvbXBhY3RQcm90b2NvbCh0cmFucywgc3RyaW5nX2xpbWl0XywgY29udGFpbmVyX2xpbWl0Xyk7CiAgICAgfQogCi0gICAgcmV0dXJuIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4ocHJvdCk7CisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+KHByb3QpOwogICB9CiAKLSBwcml2YXRlOgorcHJpdmF0ZToKICAgaW50MzJfdCBzdHJpbmdfbGltaXRfOwogICBpbnQzMl90IGNvbnRhaW5lcl9saW1pdF87Ci0KIH07CiAKIHR5cGVkZWYgVENvbXBhY3RQcm90b2NvbEZhY3RvcnlUPFRUcmFuc3BvcnQ+IFRDb21wYWN0UHJvdG9jb2xGYWN0b3J5OwotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sCit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbAogCiAjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wudGNjPgogCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC50Y2MgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC50Y2MKaW5kZXggODVkZGU2Yy4uOGVmZWM2ZSAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wudGNjCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLnRjYwpAQCAtMjEsNiArMjEsOCBAQAogCiAjaW5jbHVkZSA8bGltaXRzPgogCisjaW5jbHVkZSAidGhyaWZ0L2NvbmZpZy5oIgorCiAvKgogICogVENvbXBhY3RQcm90b2NvbDo6aSpUb1ppZ3phZyBkZXBlbmQgb24gdGhlIGZhY3QgdGhhdCB0aGUgcmlnaHQgc2hpZnQKICAqIG9wZXJhdG9yIG9uIGEgc2lnbmVkIGludGVnZXIgaXMgYW4gYXJpdGhtZXRpYyAoc2lnbi1leHRlbmRpbmcpIHNoaWZ0LgpAQCAtMjUxLDE3ICsyNTMsMTcgQEAKICAqLwogdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+CiB1aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6d3JpdGVEb3VibGUoY29uc3QgZG91YmxlIGR1YikgewotICBCT09TVF9TVEFUSUNfQVNTRVJUKHNpemVvZihkb3VibGUpID09IHNpemVvZih1aW50NjRfdCkpOwotICBCT09TVF9TVEFUSUNfQVNTRVJUKHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aXNfaWVjNTU5KTsKKyAgc3RhdGljX2Fzc2VydChzaXplb2YoZG91YmxlKSA9PSBzaXplb2YodWludDY0X3QpLCAic2l6ZW9mKGRvdWJsZSkgPT0gc2l6ZW9mKHVpbnQ2NF90KSIpOworICBzdGF0aWNfYXNzZXJ0KHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aXNfaWVjNTU5LCAic3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+Ojppc19pZWM1NTkiKTsKIAogICB1aW50NjRfdCBiaXRzID0gYml0d2lzZV9jYXN0PHVpbnQ2NF90PihkdWIpOwotICBiaXRzID0gaHRvbGVsbChiaXRzKTsKKyAgYml0cyA9IFRIUklGVF9odG9sZWxsKGJpdHMpOwogICB0cmFuc18tPndyaXRlKCh1aW50OF90KikmYml0cywgOCk7CiAgIHJldHVybiA4OwogfQogCiAvKioKLSAqIFdyaXRlIGEgc3RyaW5nIHRvIHRoZSB3aXJlIHdpdGggYSB2YXJpbnQgc2l6ZSBwcmVjZWVkaW5nLgorICogV3JpdGUgYSBzdHJpbmcgdG8gdGhlIHdpcmUgd2l0aCBhIHZhcmludCBzaXplIHByZWNlZGluZy4KICAqLwogdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+CiB1aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6d3JpdGVTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgewpAQCAtMzg1LDcgKzM4Nyw3IEBACiAgKi8KIHRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgogdWludDY0X3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46Omk2NFRvWmlnemFnKGNvbnN0IGludDY0X3QgbCkgewotICByZXR1cm4gKGwgPDwgMSkgXiAobCA+PiA2Myk7CisgIHJldHVybiAoc3RhdGljX2Nhc3Q8dWludDY0X3Q+KGwpIDw8IDEpIF4gKGwgPj4gNjMpOwogfQogCiAvKioKQEAgLTM5NCw3ICszOTYsNyBAQAogICovCiB0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KIHVpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+OjppMzJUb1ppZ3phZyhjb25zdCBpbnQzMl90IG4pIHsKLSAgcmV0dXJuIChuIDw8IDEpIF4gKG4gPj4gMzEpOworICByZXR1cm4gKHN0YXRpY19jYXN0PHVpbnQzMl90PihuKSA8PCAxKSBeIChuID4+IDMxKTsKIH0KIAogLyoqCkBAIC02NTEsMTUgKzY1MywxNSBAQAogICovCiB0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KIHVpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+OjpyZWFkRG91YmxlKGRvdWJsZSYgZHViKSB7Ci0gIEJPT1NUX1NUQVRJQ19BU1NFUlQoc2l6ZW9mKGRvdWJsZSkgPT0gc2l6ZW9mKHVpbnQ2NF90KSk7Ci0gIEJPT1NUX1NUQVRJQ19BU1NFUlQoc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+Ojppc19pZWM1NTkpOworICBzdGF0aWNfYXNzZXJ0KHNpemVvZihkb3VibGUpID09IHNpemVvZih1aW50NjRfdCksICJzaXplb2YoZG91YmxlKSA9PSBzaXplb2YodWludDY0X3QpIik7CisgIHN0YXRpY19hc3NlcnQoc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+Ojppc19pZWM1NTksICJzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmlzX2llYzU1OSIpOwogCiAgIHVuaW9uIHsKICAgICB1aW50NjRfdCBiaXRzOwogICAgIHVpbnQ4X3QgYls4XTsKICAgfSB1OwogICB0cmFuc18tPnJlYWRBbGwodS5iLCA4KTsKLSAgdS5iaXRzID0gbGV0b2hsbCh1LmJpdHMpOworICB1LmJpdHMgPSBUSFJJRlRfbGV0b2hsbCh1LmJpdHMpOwogICBkdWIgPSBiaXR3aXNlX2Nhc3Q8ZG91YmxlPih1LmJpdHMpOwogICByZXR1cm4gODsKIH0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9URGVidWdQcm90b2NvbC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVERlYnVnUHJvdG9jb2wuY3BwCmluZGV4IDYzZWExNGQuLjBlNmQ0YTIgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9URGVidWdQcm90b2NvbC5jcHAKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1REZWJ1Z1Byb3RvY29sLmNwcApAQCAtMTksMTYgKzE5LDE0IEBACiAKICNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVERlYnVnUHJvdG9jb2wuaD4KIAorI2luY2x1ZGUgPHRocmlmdC9UVG9TdHJpbmcuaD4KICNpbmNsdWRlIDxjYXNzZXJ0PgogI2luY2x1ZGUgPGNjdHlwZT4KICNpbmNsdWRlIDxjc3RkaW8+CiAjaW5jbHVkZSA8c3RkZXhjZXB0PgotI2luY2x1ZGUgPGJvb3N0L3N0YXRpY19hc3NlcnQuaHBwPgotI2luY2x1ZGUgPGJvb3N0L2xleGljYWxfY2FzdC5ocHA+CiAKIHVzaW5nIHN0ZDo6c3RyaW5nOwogCi0KIHN0YXRpYyBzdHJpbmcgYnl0ZV90b19oZXgoY29uc3QgdWludDhfdCBieXRlKSB7CiAgIGNoYXIgYnVmWzNdOwogICBpbnQgcmV0ID0gc3RkOjpzcHJpbnRmKGJ1ZiwgIiUwMngiLCAoaW50KWJ5dGUpOwpAQCAtMzgsMjggKzM2LDQ2IEBACiAgIHJldHVybiBidWY7CiB9CiAKLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgcHJvdG9jb2wgeworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBwcm90b2NvbCB7CiAKIHN0cmluZyBURGVidWdQcm90b2NvbDo6ZmllbGRUeXBlTmFtZShUVHlwZSB0eXBlKSB7CiAgIHN3aXRjaCAodHlwZSkgewotICAgIGNhc2UgVF9TVE9QICAgOiByZXR1cm4gInN0b3AiICAgOwotICAgIGNhc2UgVF9WT0lEICAgOiByZXR1cm4gInZvaWQiICAgOwotICAgIGNhc2UgVF9CT09MICAgOiByZXR1cm4gImJvb2wiICAgOwotICAgIGNhc2UgVF9CWVRFICAgOiByZXR1cm4gImJ5dGUiICAgOwotICAgIGNhc2UgVF9JMTYgICAgOiByZXR1cm4gImkxNiIgICAgOwotICAgIGNhc2UgVF9JMzIgICAgOiByZXR1cm4gImkzMiIgICAgOwotICAgIGNhc2UgVF9VNjQgICAgOiByZXR1cm4gInU2NCIgICAgOwotICAgIGNhc2UgVF9JNjQgICAgOiByZXR1cm4gImk2NCIgICAgOwotICAgIGNhc2UgVF9ET1VCTEUgOiByZXR1cm4gImRvdWJsZSIgOwotICAgIGNhc2UgVF9TVFJJTkcgOiByZXR1cm4gInN0cmluZyIgOwotICAgIGNhc2UgVF9TVFJVQ1QgOiByZXR1cm4gInN0cnVjdCIgOwotICAgIGNhc2UgVF9NQVAgICAgOiByZXR1cm4gIm1hcCIgICAgOwotICAgIGNhc2UgVF9TRVQgICAgOiByZXR1cm4gInNldCIgICAgOwotICAgIGNhc2UgVF9MSVNUICAgOiByZXR1cm4gImxpc3QiICAgOwotICAgIGNhc2UgVF9VVEY4ICAgOiByZXR1cm4gInV0ZjgiICAgOwotICAgIGNhc2UgVF9VVEYxNiAgOiByZXR1cm4gInV0ZjE2IiAgOwotICAgIGRlZmF1bHQ6IHJldHVybiAidW5rbm93biI7CisgIGNhc2UgVF9TVE9QOgorICAgIHJldHVybiAic3RvcCI7CisgIGNhc2UgVF9WT0lEOgorICAgIHJldHVybiAidm9pZCI7CisgIGNhc2UgVF9CT09MOgorICAgIHJldHVybiAiYm9vbCI7CisgIGNhc2UgVF9CWVRFOgorICAgIHJldHVybiAiYnl0ZSI7CisgIGNhc2UgVF9JMTY6CisgICAgcmV0dXJuICJpMTYiOworICBjYXNlIFRfSTMyOgorICAgIHJldHVybiAiaTMyIjsKKyAgY2FzZSBUX1U2NDoKKyAgICByZXR1cm4gInU2NCI7CisgIGNhc2UgVF9JNjQ6CisgICAgcmV0dXJuICJpNjQiOworICBjYXNlIFRfRE9VQkxFOgorICAgIHJldHVybiAiZG91YmxlIjsKKyAgY2FzZSBUX1NUUklORzoKKyAgICByZXR1cm4gInN0cmluZyI7CisgIGNhc2UgVF9TVFJVQ1Q6CisgICAgcmV0dXJuICJzdHJ1Y3QiOworICBjYXNlIFRfTUFQOgorICAgIHJldHVybiAibWFwIjsKKyAgY2FzZSBUX1NFVDoKKyAgICByZXR1cm4gInNldCI7CisgIGNhc2UgVF9MSVNUOgorICAgIHJldHVybiAibGlzdCI7CisgIGNhc2UgVF9VVEY4OgorICAgIHJldHVybiAidXRmOCI7CisgIGNhc2UgVF9VVEYxNjoKKyAgICByZXR1cm4gInV0ZjE2IjsKKyAgZGVmYXVsdDoKKyAgICByZXR1cm4gInVua25vd24iOwogICB9CiB9CiAKQEAgLTc1LDE5ICs5MSwxOSBAQAogfQogCiB1aW50MzJfdCBURGVidWdQcm90b2NvbDo6d3JpdGVQbGFpbihjb25zdCBzdHJpbmcmIHN0cikgewotICBpZihzdHIubGVuZ3RoKCkgPiAoc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCkoKSkKKyAgaWYgKHN0ci5sZW5ndGgoKSA+IChzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KSgpKQogICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OlNJWkVfTElNSVQpOwogICB0cmFuc18tPndyaXRlKCh1aW50OF90KilzdHIuZGF0YSgpLCBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc3RyLmxlbmd0aCgpKSk7CiAgIHJldHVybiBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc3RyLmxlbmd0aCgpKTsKIH0KIAogdWludDMyX3QgVERlYnVnUHJvdG9jb2w6OndyaXRlSW5kZW50ZWQoY29uc3Qgc3RyaW5nJiBzdHIpIHsKLSAgaWYoc3RyLmxlbmd0aCgpID4gKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgpKCkpCisgIGlmIChzdHIubGVuZ3RoKCkgPiAoc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCkoKSkKICAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpTSVpFX0xJTUlUKTsKLSAgaWYoaW5kZW50X3N0cl8ubGVuZ3RoKCkgPiAoc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCkoKSkKKyAgaWYgKGluZGVudF9zdHJfLmxlbmd0aCgpID4gKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgpKCkpCiAgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6U0laRV9MSU1JVCk7CiAgIHVpbnQ2NF90IHRvdGFsX2xlbiA9IGluZGVudF9zdHJfLmxlbmd0aCgpICsgc3RyLmxlbmd0aCgpOwotICBpZih0b3RhbF9sZW4gPiAoc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCkoKSkKKyAgaWYgKHRvdGFsX2xlbiA+IChzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KSgpKQogICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OlNJWkVfTElNSVQpOwogICB0cmFuc18tPndyaXRlKCh1aW50OF90KilpbmRlbnRfc3RyXy5kYXRhKCksIHN0YXRpY19jYXN0PHVpbnQzMl90PihpbmRlbnRfc3RyXy5sZW5ndGgoKSkpOwogICB0cmFuc18tPndyaXRlKCh1aW50OF90KilzdHIuZGF0YSgpLCBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc3RyLmxlbmd0aCgpKSk7CkBAIC05OCw1MiArMTE0LDUxIEBACiAgIHVpbnQzMl90IHNpemU7CiAKICAgc3dpdGNoICh3cml0ZV9zdGF0ZV8uYmFjaygpKSB7Ci0gICAgY2FzZSBVTklOSVQ6Ci0gICAgICAvLyBYWFggZmlndXJlIG91dCB3aGF0IHRvIGRvIGhlcmUuCi0gICAgICAvL3Rocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSk7Ci0gICAgICAvL3JldHVybiB3cml0ZUluZGVudGVkKHN0cik7Ci0gICAgICByZXR1cm4gMDsKLSAgICBjYXNlIFNUUlVDVDoKLSAgICAgIHJldHVybiAwOwotICAgIGNhc2UgU0VUOgotICAgICAgcmV0dXJuIHdyaXRlSW5kZW50ZWQoIiIpOwotICAgIGNhc2UgTUFQX0tFWToKLSAgICAgIHJldHVybiB3cml0ZUluZGVudGVkKCIiKTsKLSAgICBjYXNlIE1BUF9WQUxVRToKLSAgICAgIHJldHVybiB3cml0ZVBsYWluKCIgLT4gIik7Ci0gICAgY2FzZSBMSVNUOgotICAgICAgc2l6ZSA9IHdyaXRlSW5kZW50ZWQoCi0gICAgICAgICAgIlsiICsgYm9vc3Q6OmxleGljYWxfY2FzdDxzdHJpbmc+KGxpc3RfaWR4Xy5iYWNrKCkpICsgIl0gPSAiKTsKLSAgICAgIGxpc3RfaWR4Xy5iYWNrKCkrKzsKLSAgICAgIHJldHVybiBzaXplOwotICAgIGRlZmF1bHQ6Ci0gICAgICB0aHJvdyBzdGQ6OmxvZ2ljX2Vycm9yKCJJbnZhbGlkIGVudW0gdmFsdWUuIik7CisgIGNhc2UgVU5JTklUOgorICAgIC8vIFhYWCBmaWd1cmUgb3V0IHdoYXQgdG8gZG8gaGVyZS4KKyAgICAvLyB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEpOworICAgIC8vIHJldHVybiB3cml0ZUluZGVudGVkKHN0cik7CisgICAgcmV0dXJuIDA7CisgIGNhc2UgU1RSVUNUOgorICAgIHJldHVybiAwOworICBjYXNlIFNFVDoKKyAgICByZXR1cm4gd3JpdGVJbmRlbnRlZCgiIik7CisgIGNhc2UgTUFQX0tFWToKKyAgICByZXR1cm4gd3JpdGVJbmRlbnRlZCgiIik7CisgIGNhc2UgTUFQX1ZBTFVFOgorICAgIHJldHVybiB3cml0ZVBsYWluKCIgLT4gIik7CisgIGNhc2UgTElTVDoKKyAgICBzaXplID0gd3JpdGVJbmRlbnRlZCgiWyIgKyB0b19zdHJpbmcobGlzdF9pZHhfLmJhY2soKSkgKyAiXSA9ICIpOworICAgIGxpc3RfaWR4Xy5iYWNrKCkrKzsKKyAgICByZXR1cm4gc2l6ZTsKKyAgZGVmYXVsdDoKKyAgICB0aHJvdyBzdGQ6OmxvZ2ljX2Vycm9yKCJJbnZhbGlkIGVudW0gdmFsdWUuIik7CiAgIH0KIH0KIAogdWludDMyX3QgVERlYnVnUHJvdG9jb2w6OmVuZEl0ZW0oKSB7Ci0gIC8vdWludDMyX3Qgc2l6ZTsKKyAgLy8gdWludDMyX3Qgc2l6ZTsKIAogICBzd2l0Y2ggKHdyaXRlX3N0YXRlXy5iYWNrKCkpIHsKLSAgICBjYXNlIFVOSU5JVDoKLSAgICAgIC8vIFhYWCBmaWd1cmUgb3V0IHdoYXQgdG8gZG8gaGVyZS4KLSAgICAgIC8vdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBKTsKLSAgICAgIC8vcmV0dXJuIHdyaXRlSW5kZW50ZWQoc3RyKTsKLSAgICAgIHJldHVybiAwOwotICAgIGNhc2UgU1RSVUNUOgotICAgICAgcmV0dXJuIHdyaXRlUGxhaW4oIixcbiIpOwotICAgIGNhc2UgU0VUOgotICAgICAgcmV0dXJuIHdyaXRlUGxhaW4oIixcbiIpOwotICAgIGNhc2UgTUFQX0tFWToKLSAgICAgIHdyaXRlX3N0YXRlXy5iYWNrKCkgPSBNQVBfVkFMVUU7Ci0gICAgICByZXR1cm4gMDsKLSAgICBjYXNlIE1BUF9WQUxVRToKLSAgICAgIHdyaXRlX3N0YXRlXy5iYWNrKCkgPSBNQVBfS0VZOwotICAgICAgcmV0dXJuIHdyaXRlUGxhaW4oIixcbiIpOwotICAgIGNhc2UgTElTVDoKLSAgICAgIHJldHVybiB3cml0ZVBsYWluKCIsXG4iKTsKLSAgICBkZWZhdWx0OgotICAgICAgdGhyb3cgc3RkOjpsb2dpY19lcnJvcigiSW52YWxpZCBlbnVtIHZhbHVlLiIpOworICBjYXNlIFVOSU5JVDoKKyAgICAvLyBYWFggZmlndXJlIG91dCB3aGF0IHRvIGRvIGhlcmUuCisgICAgLy8gdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBKTsKKyAgICAvLyByZXR1cm4gd3JpdGVJbmRlbnRlZChzdHIpOworICAgIHJldHVybiAwOworICBjYXNlIFNUUlVDVDoKKyAgICByZXR1cm4gd3JpdGVQbGFpbigiLFxuIik7CisgIGNhc2UgU0VUOgorICAgIHJldHVybiB3cml0ZVBsYWluKCIsXG4iKTsKKyAgY2FzZSBNQVBfS0VZOgorICAgIHdyaXRlX3N0YXRlXy5iYWNrKCkgPSBNQVBfVkFMVUU7CisgICAgcmV0dXJuIDA7CisgIGNhc2UgTUFQX1ZBTFVFOgorICAgIHdyaXRlX3N0YXRlXy5iYWNrKCkgPSBNQVBfS0VZOworICAgIHJldHVybiB3cml0ZVBsYWluKCIsXG4iKTsKKyAgY2FzZSBMSVNUOgorICAgIHJldHVybiB3cml0ZVBsYWluKCIsXG4iKTsKKyAgZGVmYXVsdDoKKyAgICB0aHJvdyBzdGQ6OmxvZ2ljX2Vycm9yKCJJbnZhbGlkIGVudW0gdmFsdWUuIik7CiAgIH0KIH0KIApAQCAtMTU4LDEzICsxNzMsMjEgQEAKIHVpbnQzMl90IFREZWJ1Z1Byb3RvY29sOjp3cml0ZU1lc3NhZ2VCZWdpbihjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUTWVzc2FnZVR5cGUgbWVzc2FnZVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBzZXFpZCkgewotICAodm9pZCkgc2VxaWQ7CisgICh2b2lkKXNlcWlkOwogICBzdHJpbmcgbXR5cGU7CiAgIHN3aXRjaCAobWVzc2FnZVR5cGUpIHsKLSAgICBjYXNlIFRfQ0FMTCAgICAgIDogbXR5cGUgPSAiY2FsbCIgICA7IGJyZWFrOwotICAgIGNhc2UgVF9SRVBMWSAgICAgOiBtdHlwZSA9ICJyZXBseSIgIDsgYnJlYWs7Ci0gICAgY2FzZSBUX0VYQ0VQVElPTiA6IG10eXBlID0gImV4biIgICAgOyBicmVhazsKLSAgICBjYXNlIFRfT05FV0FZICAgIDogbXR5cGUgPSAib25ld2F5IiA7IGJyZWFrOworICBjYXNlIFRfQ0FMTDoKKyAgICBtdHlwZSA9ICJjYWxsIjsKKyAgICBicmVhazsKKyAgY2FzZSBUX1JFUExZOgorICAgIG10eXBlID0gInJlcGx5IjsKKyAgICBicmVhazsKKyAgY2FzZSBUX0VYQ0VQVElPTjoKKyAgICBtdHlwZSA9ICJleG4iOworICAgIGJyZWFrOworICBjYXNlIFRfT05FV0FZOgorICAgIG10eXBlID0gIm9uZXdheSI7CisgICAgYnJlYWs7CiAgIH0KIAogICB1aW50MzJfdCBzaXplID0gd3JpdGVJbmRlbnRlZCgiKCIgKyBtdHlwZSArICIpICIgKyBuYW1lICsgIigiKTsKQEAgLTE5OSwxMyArMjIyLDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIGZpZWxkVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCBmaWVsZElkKSB7CiAgIC8vIHNwcmludGYoaWRfc3RyLCAiJTAyZCIsIGZpZWxkSWQpOwotICBzdHJpbmcgaWRfc3RyID0gYm9vc3Q6OmxleGljYWxfY2FzdDxzdHJpbmc+KGZpZWxkSWQpOwotICBpZiAoaWRfc3RyLmxlbmd0aCgpID09IDEpIGlkX3N0ciA9ICcwJyArIGlkX3N0cjsKKyAgc3RyaW5nIGlkX3N0ciA9IHRvX3N0cmluZyhmaWVsZElkKTsKKyAgaWYgKGlkX3N0ci5sZW5ndGgoKSA9PSAxKQorICAgIGlkX3N0ciA9ICcwJyArIGlkX3N0cjsKIAotICByZXR1cm4gd3JpdGVJbmRlbnRlZCgKLSAgICAgIGlkX3N0ciArICI6ICIgKwotICAgICAgbmFtZSArICIgKCIgKwotICAgICAgZmllbGRUeXBlTmFtZShmaWVsZFR5cGUpICsgIikgPSAiKTsKKyAgcmV0dXJuIHdyaXRlSW5kZW50ZWQoaWRfc3RyICsgIjogIiArIG5hbWUgKyAiICgiICsgZmllbGRUeXBlTmFtZShmaWVsZFR5cGUpICsgIikgPSAiKTsKIH0KIAogdWludDMyX3QgVERlYnVnUHJvdG9jb2w6OndyaXRlRmllbGRFbmQoKSB7CkBAIC0yMTUsNyArMjM2LDcgQEAKIAogdWludDMyX3QgVERlYnVnUHJvdG9jb2w6OndyaXRlRmllbGRTdG9wKCkgewogICByZXR1cm4gMDsKLSAgICAvL3dyaXRlSW5kZW50ZWQoIioqKlNUT1AqKipcbiIpOworICAvLyB3cml0ZUluZGVudGVkKCIqKipTVE9QKioqXG4iKTsKIH0KIAogdWludDMyX3QgVERlYnVnUHJvdG9jb2w6OndyaXRlTWFwQmVnaW4oY29uc3QgVFR5cGUga2V5VHlwZSwKQEAgLTIyNiw3ICsyNDcsNyBAQAogICBic2l6ZSArPSBzdGFydEl0ZW0oKTsKICAgYnNpemUgKz0gd3JpdGVQbGFpbigKICAgICAgICJtYXA8IiArIGZpZWxkVHlwZU5hbWUoa2V5VHlwZSkgKyAiLCIgKyBmaWVsZFR5cGVOYW1lKHZhbFR5cGUpICsgIj4iCi0gICAgICAiWyIgKyBib29zdDo6bGV4aWNhbF9jYXN0PHN0cmluZz4oc2l6ZSkgKyAiXSB7XG4iKTsKKyAgICAgICJbIiArIHRvX3N0cmluZyhzaXplKSArICJdIHtcbiIpOwogICBpbmRlbnRVcCgpOwogICB3cml0ZV9zdGF0ZV8ucHVzaF9iYWNrKE1BUF9LRVkpOwogICByZXR1cm4gYnNpemU7CkBAIC0yNDEsMTQgKzI2MiwxMyBAQAogICByZXR1cm4gc2l6ZTsKIH0KIAotdWludDMyX3QgVERlYnVnUHJvdG9jb2w6OndyaXRlTGlzdEJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKK3VpbnQzMl90IFREZWJ1Z1Byb3RvY29sOjp3cml0ZUxpc3RCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSkgewogICAvLyBUT0RPKGRyZWlzcyk6IE9wdGltaXplIHNob3J0IGFycmF5cy4KICAgdWludDMyX3QgYnNpemUgPSAwOwogICBic2l6ZSArPSBzdGFydEl0ZW0oKTsKICAgYnNpemUgKz0gd3JpdGVQbGFpbigKICAgICAgICJsaXN0PCIgKyBmaWVsZFR5cGVOYW1lKGVsZW1UeXBlKSArICI+IgotICAgICAgIlsiICsgYm9vc3Q6OmxleGljYWxfY2FzdDxzdHJpbmc+KHNpemUpICsgIl0ge1xuIik7CisgICAgICAiWyIgKyB0b19zdHJpbmcoc2l6ZSkgKyAiXSB7XG4iKTsKICAgaW5kZW50VXAoKTsKICAgd3JpdGVfc3RhdGVfLnB1c2hfYmFjayhMSVNUKTsKICAgbGlzdF9pZHhfLnB1c2hfYmFjaygwKTsKQEAgLTI2NSwxNCArMjg1LDEzIEBACiAgIHJldHVybiBzaXplOwogfQogCi11aW50MzJfdCBURGVidWdQcm90b2NvbDo6d3JpdGVTZXRCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKK3VpbnQzMl90IFREZWJ1Z1Byb3RvY29sOjp3cml0ZVNldEJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLCBjb25zdCB1aW50MzJfdCBzaXplKSB7CiAgIC8vIFRPRE8oZHJlaXNzKTogT3B0aW1pemUgc2hvcnQgc2V0cy4KICAgdWludDMyX3QgYnNpemUgPSAwOwogICBic2l6ZSArPSBzdGFydEl0ZW0oKTsKICAgYnNpemUgKz0gd3JpdGVQbGFpbigKICAgICAgICJzZXQ8IiArIGZpZWxkVHlwZU5hbWUoZWxlbVR5cGUpICsgIj4iCi0gICAgICAiWyIgKyBib29zdDo6bGV4aWNhbF9jYXN0PHN0cmluZz4oc2l6ZSkgKyAiXSB7XG4iKTsKKyAgICAgICJbIiArIHRvX3N0cmluZyhzaXplKSArICJdIHtcbiIpOwogICBpbmRlbnRVcCgpOwogICB3cml0ZV9zdGF0ZV8ucHVzaF9iYWNrKFNFVCk7CiAgIHJldHVybiBic2l6ZTsKQEAgLTI5NiwyOSArMzE1LDI4IEBACiB9CiAKIHVpbnQzMl90IFREZWJ1Z1Byb3RvY29sOjp3cml0ZUkxNihjb25zdCBpbnQxNl90IGkxNikgewotICByZXR1cm4gd3JpdGVJdGVtKGJvb3N0OjpsZXhpY2FsX2Nhc3Q8c3RyaW5nPihpMTYpKTsKKyAgcmV0dXJuIHdyaXRlSXRlbSh0b19zdHJpbmcoaTE2KSk7CiB9CiAKIHVpbnQzMl90IFREZWJ1Z1Byb3RvY29sOjp3cml0ZUkzMihjb25zdCBpbnQzMl90IGkzMikgewotICByZXR1cm4gd3JpdGVJdGVtKGJvb3N0OjpsZXhpY2FsX2Nhc3Q8c3RyaW5nPihpMzIpKTsKKyAgcmV0dXJuIHdyaXRlSXRlbSh0b19zdHJpbmcoaTMyKSk7CiB9CiAKIHVpbnQzMl90IFREZWJ1Z1Byb3RvY29sOjp3cml0ZUk2NChjb25zdCBpbnQ2NF90IGk2NCkgewotICByZXR1cm4gd3JpdGVJdGVtKGJvb3N0OjpsZXhpY2FsX2Nhc3Q8c3RyaW5nPihpNjQpKTsKKyAgcmV0dXJuIHdyaXRlSXRlbSh0b19zdHJpbmcoaTY0KSk7CiB9CiAKIHVpbnQzMl90IFREZWJ1Z1Byb3RvY29sOjp3cml0ZURvdWJsZShjb25zdCBkb3VibGUgZHViKSB7Ci0gIHJldHVybiB3cml0ZUl0ZW0oYm9vc3Q6OmxleGljYWxfY2FzdDxzdHJpbmc+KGR1YikpOworICByZXR1cm4gd3JpdGVJdGVtKHRvX3N0cmluZyhkdWIpKTsKIH0KIAotCiB1aW50MzJfdCBURGVidWdQcm90b2NvbDo6d3JpdGVTdHJpbmcoY29uc3Qgc3RyaW5nJiBzdHIpIHsKICAgLy8gWFhYIFJhdy9VVEYtOD8KIAogICBzdHJpbmcgdG9fc2hvdyA9IHN0cjsKICAgaWYgKHRvX3Nob3cubGVuZ3RoKCkgPiAoc3RyaW5nOjpzaXplX3R5cGUpc3RyaW5nX2xpbWl0XykgewogICAgIHRvX3Nob3cgPSBzdHIuc3Vic3RyKDAsIHN0cmluZ19wcmVmaXhfc2l6ZV8pOwotICAgIHRvX3Nob3cgKz0gIlsuLi5dKCIgKyBib29zdDo6bGV4aWNhbF9jYXN0PHN0cmluZz4oc3RyLmxlbmd0aCgpKSArICIpIjsKKyAgICB0b19zaG93ICs9ICJbLi4uXSgiICsgdG9fc3RyaW5nKHN0ci5sZW5ndGgoKSkgKyAiKSI7CiAgIH0KIAogICBzdHJpbmcgb3V0cHV0ID0gIlwiIjsKQEAgLTMyOCwyMCArMzQ2LDM2IEBACiAgICAgICBvdXRwdXQgKz0gIlxcXFwiOwogICAgIH0gZWxzZSBpZiAoKml0ID09ICciJykgewogICAgICAgb3V0cHV0ICs9ICJcXFwiIjsKLSAgICB9IGVsc2UgaWYgKHN0ZDo6aXNwcmludCgqaXQpKSB7CisgICAgICAvLyBwYXNzaW5nIGNoYXJhY3RlcnMgPDAgdG8gc3RkOjppc3ByaW50IGNhdXNlcyBhc3NlcnRzLiBpc3ByaW50IHRha2VzIGFuCisgICAgICAvLyBpbnQsIHNvIHdlIG5lZWQgdG8gYmUgY2FyZWZ1bCBvZiBzaWduIGV4dGVuc2lvbgorICAgIH0gZWxzZSBpZiAoc3RkOjppc3ByaW50KCh1bnNpZ25lZCBjaGFyKSppdCkpIHsKICAgICAgIG91dHB1dCArPSAqaXQ7CiAgICAgfSBlbHNlIHsKICAgICAgIHN3aXRjaCAoKml0KSB7Ci0gICAgICAgIGNhc2UgJ1xhJzogb3V0cHV0ICs9ICJcXGEiOyBicmVhazsKLSAgICAgICAgY2FzZSAnXGInOiBvdXRwdXQgKz0gIlxcYiI7IGJyZWFrOwotICAgICAgICBjYXNlICdcZic6IG91dHB1dCArPSAiXFxmIjsgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ1xuJzogb3V0cHV0ICs9ICJcXG4iOyBicmVhazsKLSAgICAgICAgY2FzZSAnXHInOiBvdXRwdXQgKz0gIlxcciI7IGJyZWFrOwotICAgICAgICBjYXNlICdcdCc6IG91dHB1dCArPSAiXFx0IjsgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ1x2Jzogb3V0cHV0ICs9ICJcXHYiOyBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBvdXRwdXQgKz0gIlxceCI7Ci0gICAgICAgICAgb3V0cHV0ICs9IGJ5dGVfdG9faGV4KCppdCk7CisgICAgICBjYXNlICdcYSc6CisgICAgICAgIG91dHB1dCArPSAiXFxhIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdcYic6CisgICAgICAgIG91dHB1dCArPSAiXFxiIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdcZic6CisgICAgICAgIG91dHB1dCArPSAiXFxmIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdcbic6CisgICAgICAgIG91dHB1dCArPSAiXFxuIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdccic6CisgICAgICAgIG91dHB1dCArPSAiXFxyIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdcdCc6CisgICAgICAgIG91dHB1dCArPSAiXFx0IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdcdic6CisgICAgICAgIG91dHB1dCArPSAiXFx2IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBvdXRwdXQgKz0gIlxceCI7CisgICAgICAgIG91dHB1dCArPSBieXRlX3RvX2hleCgqaXQpOwogICAgICAgfQogICAgIH0KICAgfQpAQCAtMzU0LDUgKzM4OCw2IEBACiAgIC8vIFhYWCBIZXg/CiAgIHJldHVybiBURGVidWdQcm90b2NvbDo6d3JpdGVTdHJpbmcoc3RyKTsKIH0KLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbAorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2wKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9URGVidWdQcm90b2NvbC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1REZWJ1Z1Byb3RvY29sLmgKaW5kZXggZjg1ZTY5MS4uYzA3OTYyNCAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1REZWJ1Z1Byb3RvY29sLmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1REZWJ1Z1Byb3RvY29sLmgKQEAgLTIyLDkgKzIyLDExIEBACiAKICNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFZpcnR1YWxQcm90b2NvbC5oPgogCi0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+CisjaW5jbHVkZSA8bWVtb3J5PgogCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBwcm90b2NvbCB7CituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHByb3RvY29sIHsKIAogLyoKIApAQCAtMzksNDQgKzQxLDMwIEBACiAKICovCiAKLQogLyoqCiAgKiBQcm90b2NvbCB0aGF0IHByaW50cyB0aGUgcGF5bG9hZCBpbiBhIG5pY2UgaHVtYW4tcmVhZGFibGUgZm9ybWF0LgogICogUmVhZGluZyBmcm9tIHRoaXMgcHJvdG9jb2wgaXMgbm90IHN1cHBvcnRlZC4KICAqCiAgKi8KIGNsYXNzIFREZWJ1Z1Byb3RvY29sIDogcHVibGljIFRWaXJ0dWFsUHJvdG9jb2w8VERlYnVnUHJvdG9jb2w+IHsKLSBwcml2YXRlOgotICBlbnVtIHdyaXRlX3N0YXRlX3QKLSAgeyBVTklOSVQKLSAgLCBTVFJVQ1QKLSAgLCBMSVNUCi0gICwgU0VUCi0gICwgTUFQX0tFWQotICAsIE1BUF9WQUxVRQotICB9OworcHJpdmF0ZToKKyAgZW51bSB3cml0ZV9zdGF0ZV90IHsgVU5JTklULCBTVFJVQ1QsIExJU1QsIFNFVCwgTUFQX0tFWSwgTUFQX1ZBTFVFIH07CiAKLSBwdWJsaWM6Ci0gIFREZWJ1Z1Byb3RvY29sKGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKQotICAgIDogVFZpcnR1YWxQcm90b2NvbDxURGVidWdQcm90b2NvbD4odHJhbnMpCi0gICAgLCB0cmFuc18odHJhbnMuZ2V0KCkpCi0gICAgLCBzdHJpbmdfbGltaXRfKERFRkFVTFRfU1RSSU5HX0xJTUlUKQotICAgICwgc3RyaW5nX3ByZWZpeF9zaXplXyhERUZBVUxUX1NUUklOR19QUkVGSVhfU0laRSkKLSAgeworcHVibGljOgorICBURGVidWdQcm90b2NvbChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMpCisgICAgOiBUVmlydHVhbFByb3RvY29sPFREZWJ1Z1Byb3RvY29sPih0cmFucyksCisgICAgICB0cmFuc18odHJhbnMuZ2V0KCkpLAorICAgICAgc3RyaW5nX2xpbWl0XyhERUZBVUxUX1NUUklOR19MSU1JVCksCisgICAgICBzdHJpbmdfcHJlZml4X3NpemVfKERFRkFVTFRfU1RSSU5HX1BSRUZJWF9TSVpFKSB7CiAgICAgd3JpdGVfc3RhdGVfLnB1c2hfYmFjayhVTklOSVQpOwogICB9CiAKICAgc3RhdGljIGNvbnN0IGludDMyX3QgREVGQVVMVF9TVFJJTkdfTElNSVQgPSAyNTY7CiAgIHN0YXRpYyBjb25zdCBpbnQzMl90IERFRkFVTFRfU1RSSU5HX1BSRUZJWF9TSVpFID0gMTY7CiAKLSAgdm9pZCBzZXRTdHJpbmdTaXplTGltaXQoaW50MzJfdCBzdHJpbmdfbGltaXQpIHsKLSAgICBzdHJpbmdfbGltaXRfID0gc3RyaW5nX2xpbWl0OwotICB9CisgIHZvaWQgc2V0U3RyaW5nU2l6ZUxpbWl0KGludDMyX3Qgc3RyaW5nX2xpbWl0KSB7IHN0cmluZ19saW1pdF8gPSBzdHJpbmdfbGltaXQ7IH0KIAotICB2b2lkIHNldFN0cmluZ1ByZWZpeFNpemUoaW50MzJfdCBzdHJpbmdfcHJlZml4X3NpemUpIHsKLSAgICBzdHJpbmdfcHJlZml4X3NpemVfID0gc3RyaW5nX3ByZWZpeF9zaXplOwotICB9Ci0KKyAgdm9pZCBzZXRTdHJpbmdQcmVmaXhTaXplKGludDMyX3Qgc3RyaW5nX3ByZWZpeF9zaXplKSB7IHN0cmluZ19wcmVmaXhfc2l6ZV8gPSBzdHJpbmdfcHJlZml4X3NpemU7IH0KIAogICB1aW50MzJfdCB3cml0ZU1lc3NhZ2VCZWdpbihjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVE1lc3NhZ2VUeXBlIG1lc3NhZ2VUeXBlLApAQCAtODQsMzIgKzcyLDI1IEBACiAKICAgdWludDMyX3Qgd3JpdGVNZXNzYWdlRW5kKCk7CiAKLQogICB1aW50MzJfdCB3cml0ZVN0cnVjdEJlZ2luKGNvbnN0IGNoYXIqIG5hbWUpOwogCiAgIHVpbnQzMl90IHdyaXRlU3RydWN0RW5kKCk7CiAKLSAgdWludDMyX3Qgd3JpdGVGaWVsZEJlZ2luKGNvbnN0IGNoYXIqIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSBmaWVsZFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90IGZpZWxkSWQpOworICB1aW50MzJfdCB3cml0ZUZpZWxkQmVnaW4oY29uc3QgY2hhciogbmFtZSwgY29uc3QgVFR5cGUgZmllbGRUeXBlLCBjb25zdCBpbnQxNl90IGZpZWxkSWQpOwogCiAgIHVpbnQzMl90IHdyaXRlRmllbGRFbmQoKTsKIAogICB1aW50MzJfdCB3cml0ZUZpZWxkU3RvcCgpOwogCi0gIHVpbnQzMl90IHdyaXRlTWFwQmVnaW4oY29uc3QgVFR5cGUga2V5VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSB2YWxUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpOworICB1aW50MzJfdCB3cml0ZU1hcEJlZ2luKGNvbnN0IFRUeXBlIGtleVR5cGUsIGNvbnN0IFRUeXBlIHZhbFR5cGUsIGNvbnN0IHVpbnQzMl90IHNpemUpOwogCiAgIHVpbnQzMl90IHdyaXRlTWFwRW5kKCk7CiAKLSAgdWludDMyX3Qgd3JpdGVMaXN0QmVnaW4oY29uc3QgVFR5cGUgZWxlbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpOworICB1aW50MzJfdCB3cml0ZUxpc3RCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSk7CiAKICAgdWludDMyX3Qgd3JpdGVMaXN0RW5kKCk7CiAKLSAgdWludDMyX3Qgd3JpdGVTZXRCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKTsKKyAgdWludDMyX3Qgd3JpdGVTZXRCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSk7CiAKICAgdWludDMyX3Qgd3JpdGVTZXRFbmQoKTsKIApAQCAtMTI5LDggKzExMCw3IEBACiAKICAgdWludDMyX3Qgd3JpdGVCaW5hcnkoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cik7CiAKLQotIHByaXZhdGU6Citwcml2YXRlOgogICB2b2lkIGluZGVudFVwKCk7CiAgIHZvaWQgaW5kZW50RG93bigpOwogICB1aW50MzJfdCB3cml0ZVBsYWluKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpOwpAQCAtMTU3LDMwICsxMzcsMzAgQEAKICAqIENvbnN0cnVjdHMgZGVidWcgcHJvdG9jb2wgaGFuZGxlcnMKICAqLwogY2xhc3MgVERlYnVnUHJvdG9jb2xGYWN0b3J5IDogcHVibGljIFRQcm90b2NvbEZhY3RvcnkgewotIHB1YmxpYzoKK3B1YmxpYzoKICAgVERlYnVnUHJvdG9jb2xGYWN0b3J5KCkge30KICAgdmlydHVhbCB+VERlYnVnUHJvdG9jb2xGYWN0b3J5KCkge30KIAotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGdldFByb3RvY29sKGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKSB7Ci0gICAgcmV0dXJuIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4obmV3IFREZWJ1Z1Byb3RvY29sKHRyYW5zKSk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGdldFByb3RvY29sKHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFucykgeworICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPihuZXcgVERlYnVnUHJvdG9jb2wodHJhbnMpKTsKICAgfQotCiB9OwotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sCi0KK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sCiAKIC8vIFRPRE8oZHJlaXNzKTogTW92ZSAocGFydCBvZikgVGhyaWZ0RGVidWdTdHJpbmcgaW50byBhIC5jcHAgZmlsZSBhbmQgcmVtb3ZlIHRoaXMuCiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgogCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgewogCi10ZW1wbGF0ZTx0eXBlbmFtZSBUaHJpZnRTdHJ1Y3Q+Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVGhyaWZ0U3RydWN0Pgogc3RkOjpzdHJpbmcgVGhyaWZ0RGVidWdTdHJpbmcoY29uc3QgVGhyaWZ0U3RydWN0JiB0cykgewogICB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDsKICAgdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDsKICAgVE1lbW9yeUJ1ZmZlciogYnVmZmVyID0gbmV3IFRNZW1vcnlCdWZmZXI7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKGJ1ZmZlcik7CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFucyhidWZmZXIpOwogICBURGVidWdQcm90b2NvbCBwcm90b2NvbCh0cmFucyk7CiAKICAgdHMud3JpdGUoJnByb3RvY29sKTsKQEAgLTE5OCw3ICsxNzgsNyBAQAogICB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDsKICAgdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDsKICAgVE1lbW9yeUJ1ZmZlciogYnVmZmVyID0gbmV3IFRNZW1vcnlCdWZmZXI7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKGJ1ZmZlcik7CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFucyhidWZmZXIpOwogICBURGVidWdQcm90b2NvbCBwcm90b2NvbCh0cmFucyk7CiAKICAgLy8gSSBhbSBncm9zcyEKQEAgLTIxOCwxMCArMTk4LDcgQEAKICAgcmV0dXJuIHN0ZDo6c3RyaW5nKChjaGFyKilidWYsICh1bnNpZ25lZCBpbnQpc2l6ZSk7CiB9CiAjZW5kaWYgLy8gMAotCi19fSAvLyBhcGFjaGU6OnRocmlmdAotCit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0CiAKICNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfUFJPVE9DT0xfVERFQlVHUFJPVE9DT0xfSF8KLQotCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVERlbnNlUHJvdG9jb2wuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1REZW5zZVByb3RvY29sLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZiZmMxMy4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVERlbnNlUHJvdG9jb2wuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNzY4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLQotSU1QTEVNRU5UQVRJT04gREVUQUlMUwotCi1URGVuc2VQcm90b2NvbCB3YXMgZGVzaWduZWQgdG8gaGF2ZSBhIHNtYWxsZXIgc2VyaWFsaXplZCBmb3JtIHRoYW4KLVRCaW5hcnlQcm90b2NvbC4gIFRoaXMgaXMgYWNjb21wbGlzaGVkIHVzaW5nIHR3byB0ZWNobmlxdWVzLiAgVGhlIGZpcnN0IGlzCi12YXJpYWJsZS1sZW5ndGggaW50ZWdlciBlbmNvZGluZy4gIFdlIHVzZSB0aGUgc2FtZSB0ZWNobmlxdWUgdGhhdCB0aGUgU3RhbmRhcmQKLU1JREkgRmlsZSBmb3JtYXQgdXNlcyBmb3IgInZhcmlhYmxlLWxlbmd0aCBxdWFudGl0aWVzIgotKGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVmFyaWFibGUtbGVuZ3RoX3F1YW50aXR5KS4KLUFsbCBpbnRlZ2VycyAoaW5jbHVkaW5nIGkxNiwgYnV0IG5vdCBieXRlKSBhcmUgZmlyc3QgY2FzdCB0byB1aW50NjRfdCwKLXRoZW4gd3JpdHRlbiBvdXQgYXMgdmFyaWFibGUtbGVuZ3RoIHF1YW50aXRpZXMuICBUaGlzIGhhcyB0aGUgdW5mb3J0dW5hdGUgc2lkZQotZWZmZWN0IHRoYXQgYWxsIG5lZ2F0aXZlIG51bWJlcnMgcmVxdWlyZSAxMCBieXRlcywgYnV0IG5lZ2F0aXZlIG51bWJlcnMgdGVuZAotdG8gYmUgZmFyIGxlc3MgY29tbW9uIHRoYW4gcG9zaXRpdmUgb25lcy4KLQotVGhlIHNlY29uZCB0ZWNobmlxdWUgZWxpbWluYXRpbmcgdGhlIGZpZWxkIGlkcyB1c2VkIGJ5IFRCaW5hcnlQcm90b2NvbC4gIFRoaXMKLWRlY2lzaW9uIHJlcXVpcmVkIHN1cHBvcnQgZnJvbSB0aGUgVGhyaWZ0IGNvbXBpbGVyIGFuZCBhbHNvIHNhY3JpZmljZXMgc29tZSBvZgotdGhlIGJhY2t3YXJkIGFuZCBmb3J3YXJkIGNvbXBhdGliaWxpdHkgb2YgVEJpbmFyeVByb3RvY29sLgotCi1XZSBjb25zaWRlcmVkIGltcGxlbWVudGluZyB0aGlzIHRlY2huaXF1ZSBieSBnZW5lcmF0aW5nIHNlcGFyYXRlIHJlYWRlcnMgYW5kCi13cml0ZXJzIGZvciB0aGUgZGVuc2UgcHJvdG9jb2wgKHRoaXMgaXMgaG93IFBpbGxhciwgVGhyaWZ0J3MgcHJlZGVjZXNzb3IsCi13b3JrZWQpLCBidXQgdGhpcyBpZGVhIGhhZCBhIGZldyBwcm9ibGVtczoKLS0gT3VyIGFic3RyYWN0aW9ucyBnbyBvdXQgdGhlIHdpbmRvdy4KLS0gV2Ugd291bGQgaGF2ZSB0byBtYWludGFpbiBhIHNlY29uZCBjb2RlIGdlbmVyYXRvci4KLS0gUHJlc2VydmluZyBjb21wYXRpYmlsaXR5IHdpdGggb2xkIHZlcnNpb25zIG9mIHRoZSBzdHJ1Y3R1cmVzIHdvdWxkIGJlIGEKLSAgbmlnaHRtYXJlLgotCi1UaGVyZWZvcmUsIHdlIGNob3NlIGFuIGFsdGVybmF0ZSBpbXBsZW1lbnRhdGlvbiB0aGF0IHN0b3JlZCB0aGUgZGVzY3JpcHRpb24gb2YKLXRoZSBkYXRhIG5laXRoZXIgaW4gdGhlIGRhdGEgaXRzZWxmIChsaWtlIFRCaW5hcnlQcm90b2NvbCkgbm9yIGluIHRoZQotc2VyaWFsaXphdGlvbiBjb2RlIChsaWtlIFBpbGxhciksIGJ1dCBpbnN0ZWFkIGluIGEgc2VwYXJhdGUgZGF0YSBzdHJ1Y3R1cmUsCi1jYWxsZWQgYSBUeXBlU3BlYy4gIFR5cGVTcGVjcyBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSBUaHJpZnQgY29tcGlsZXIKLShzcGVjaWZpY2FsbHkgaW4gdGhlIHRfY3BwX2dlbmVyYXRvciksIGFuZCB0aGVpciBzdHJ1Y3R1cmUgc2hvdWxkIGJlCi1kb2N1bWVudGVkIHRoZXJlIChUT0RPKGRyZWlzcyk6IHMvc2hvdWxkIGJlL2lzLykuCi0KLVdlIG1haW50YWluIGEgc3RhY2sgb2YgVHlwZVNwZWNzIHdpdGhpbiB0aGUgcHJvdG9jb2wgc28gaXQga25vd3Mgd2hlcmUgdGhlCi1nZW5lcmF0ZWQgY29kZSBpcyBpbiB0aGUgcmVhZGluZy93cml0aW5nIHByb2Nlc3MuICBGb3IgZXhhbXBsZSwgaWYgd2UgYXJlCi13cml0aW5nIGFuIGkzMiBjb250YWluZWQgaW4gYSBzdHJ1Y3QgYmFyLCBjb250YWluZWQgaW4gYSBzdHJ1Y3QgZm9vLCB0aGVuIHRoZQotc3RhY2sgd291bGQgbG9vayBsaWtlOiBUT1AgLCBpMzIgLCBzdHJ1Y3QgYmFyICwgc3RydWN0IGZvbyAsIEJPVFRPTS4KLVRoZSBmb2xsb3dpbmcgaW52YXJpYW50OiB3aGVuZXZlciB3ZSBhcmUgYWJvdXQgdG8gcmVhZC93cml0ZSBhbiBvYmplY3QKLShzdHJ1Y3RCZWdpbiwgY29udGFpbmVyQmVnaW4sIG9yIGEgc2NhbGFyKSwgdGhlIFR5cGVTcGVjIG9uIHRoZSB0b3Agb2YgdGhlCi1zdGFjayBtdXN0IG1hdGNoIHRoZSB0eXBlIGJlaW5nIHJlYWQvd3JpdHRlbi4gIFRoZSBtYWluIHJlYXNvbnMgdGhhdCB0aGlzCi1pbnZhcmlhbnQgbXVzdCBiZSBtYWludGFpbmVkIGlzIHRoYXQgaWYgd2UgZXZlciBzdGFydCByZWFkaW5nIGEgc3RydWN0dXJlLCB3ZQotbXVzdCBoYXZlIGl0cyBleGFjdCBUeXBlU3BlYyBpbiBvcmRlciB0byBwYXNzIHRoZSByaWdodCB0YWdzIHRvIHRoZQotZGVzZXJpYWxpemVyLgotCi1XZSB1c2UgdGhlIGZvbGxvd2luZyBzdHJhdGVnaWVzIGZvciBtYWludGFpbmluZyB0aGlzIGludmFyaWFudDoKLQotLSBGb3Igc3RydWN0dXJlcywgd2UgaGF2ZSBhIHNlcGFyYXRlIHN0YWNrIG9mIGluZGV4ZXMsIG9uZSBmb3IgZWFjaCBzdHJ1Y3R1cmUKLSAgb24gdGhlIFR5cGVTcGVjIHN0YWNrLiAgVGhlc2UgYXJlIGluZGV4ZXMgaW50byB0aGUgbGlzdCBvZiBmaWVsZHMgaW4gdGhlCi0gIHN0cnVjdHVyZSdzIFR5cGVTcGVjLiAgV2hlbiB3ZSB7cmVhZCx3cml0ZX1GaWVsZEJlZ2luLCB3ZSBwdXNoIG9uIHRoZQotICBUeXBlU3BlYyBmb3IgdGhlIGZpZWxkLgotLSBXaGVuIHdlIGJlZ2luIHdyaXRpbmcgYSBsaXN0IG9yIHNldCwgd2UgcHVzaCBvbiB0aGUgVHlwZVNwZWMgZm9yIHRoZQotICBlbGVtZW50IHR5cGUuCi0tIEZvciBtYXBzLCB3ZSBoYXZlIGEgc2VwYXJhdGUgc3RhY2sgb2YgYm9vbGVhbnMsIG9uZSBmb3IgZWFjaCBtYXAgb24gdGhlCi0gIFR5cGVTcGVjIHN0YWNrLiAgVGhlIGJvb2xlYW4gaXMgdHJ1ZSBpZiB3ZSBhcmUgd3JpdGluZyB0aGUga2V5IGZvciB0aGF0Ci0gIG1hcCwgYW5kIGZhbHNlIGlmIHdlIGFyZSB3cml0aW5nIHRoZSB2YWx1ZS4gIE1hcHMgYXJlIHRoZSB0cmlja2llc3QgY2FzZQotICBiZWNhdXNlIHRoZSBnZW5lcmF0ZWQgY29kZSBkb2VzIG5vdCBjYWxsIGFueSBwcm90b2NvbCBtZXRob2QgYmV0d2VlbgotICB0aGUga2V5IGFuZCB0aGUgdmFsdWUuICBBcyBhIHJlc3VsdCwgd2UgcG90ZW50aWFsbHkgaGF2ZSB0byBzd2l0Y2gKLSAgYmV0d2VlbiBtYXAga2V5IHN0YXRlIGFuZCBtYXAgdmFsdWUgc3RhdGUgYWZ0ZXIgcmVhZGluZy93cml0aW5nIGFueSBvYmplY3QuCi0tIFRoaXMgam9iIGlzIGhhbmRsZWQgYnkgdGhlIHN0YXRlVHJhbnNpdGlvbiBtZXRob2QuICBJdCBpcyBjYWxsZWQgYWZ0ZXIKLSAgcmVhZGluZy93cml0aW5nIGV2ZXJ5IG9iamVjdC4gIEl0IHBvcHMgdGhlIGN1cnJlbnQgVHlwZVNwZWMgb2ZmIHRoZSBzdGFjaywKLSAgdGhlbiBvcHRpb25hbGx5IHB1c2hlcyBhIG5ldyBvbmUgb24sIGRlcGVuZGluZyBvbiB3aGF0IHRoZSBuZXh0IFR5cGVTcGVjIGlzLgotICBJZiBpdCBpcyBhIHN0cnVjdCwgdGhlIGpvYiBpcyBsZWZ0IHRvIHRoZSBuZXh0IHdyaXRlRmllbGRCZWdpbi4gIElmIGl0IGlzIGEKLSAgc2V0IG9yIGxpc3QsIHRoZSBqdXN0LXBvcHBlZCB0eXBlc3BlYyBpcyBwdXNoZWQgYmFjayBvbi4gIElmIGl0IGlzIGEgbWFwLAotICB0aGUgdG9wIG9mIHRoZSBrZXkvdmFsdWUgc3RhY2sgaXMgdG9nZ2xlZCwgYW5kIHRoZSBhcHByb3ByaWF0ZSBUeXBlU3BlYwotICBpcyBwdXNoZWQuCi0KLU9wdGlvbmFsIGZpZWxkcyBhcmUgYSBsaXR0bGUgdHJpY2t5IGFsc28uICBXZSB3cml0ZSBhIHplcm8gYnl0ZSBpZiB0aGV5IGFyZQotYWJzZW50IGFuZCBwcmVmaXggdGhlbSB3aXRoIGFuIDB4MDEgYnl0ZSBpZiB0aGV5IGFyZSBwcmVzZW50Ci0qLwotCi0jZGVmaW5lIF9fU1REQ19MSU1JVF9NQUNST1MKLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVERlbnNlUHJvdG9jb2wuaD4KLSNpbmNsdWRlIDx0aHJpZnQvVFJlZmxlY3Rpb25Mb2NhbC5oPgotCi0vLyBMZWF2aW5nIHRoaXMgb24gZm9yIG5vdy4gIERpc2FibGluZyBpdCB3aWxsIHR1cm4gb2ZmIGFzc2VydHMsIHdoaWNoIHNob3VsZAotLy8gZ2l2ZSBhIHBlcmZvcm1hbmNlIGJvb3N0LiAgV2hlbiB3ZSBoYXZlICpyZWFsbHkqIHRob3JvdWdoIHRlc3QgY2FzZXMsCi0vLyB3ZSBzaG91bGQgZHJvcCB0aGlzLgotI2RlZmluZSBERUJVR19UREVOU0VQUk9UT0NPTAotCi0vLyBOT1RFOiBBc3NlcnRpb25zIHNob3VsZCAqb25seSogYmUgdXNlZCB0byBkZXRlY3QgYnVncyBpbiBjb2RlLAotLy8gICAgICAgZWl0aGVyIGluIFREZW5zZVByb3RvY29sIGl0c2VsZiwgb3IgaW4gY29kZSB1c2luZyBpdC4KLS8vICAgICAgIChGb3IgZXhhbXBsZSwgdXNpbmcgdGhlIHdyb25nIFR5cGVTcGVjLikKLS8vICAgICAgIEludmFsaWQgZGF0YSBzaG91bGQgTkVWRVIgY2F1c2UgYW4gYXNzZXJ0aW9uIGZhaWx1cmUsCi0vLyAgICAgICBubyBtYXR0ZXIgaG93IGdyb3NzbHkgY29ycnVwdGVkLCBub3IgaG93IGluZ2VuaW91c2x5IGNyYWZ0ZWQuCi0jaWZkZWYgREVCVUdfVERFTlNFUFJPVE9DT0wKLSN1bmRlZiBOREVCVUcKLSNlbHNlCi0jZGVmaW5lIE5ERUJVRwotI2VuZGlmCi0jaW5jbHVkZSA8Y2Fzc2VydD4KLQotdXNpbmcgc3RkOjpzdHJpbmc7Ci0KLSNpZmRlZiBfX0dOVUNfXwotI2RlZmluZSBVTkxJS0VMWSh2YWwpIChfX2J1aWx0aW5fZXhwZWN0KCh2YWwpLCAwKSkKLSNlbHNlCi0jZGVmaW5lIFVOTElLRUxZKHZhbCkgKHZhbCkKLSNlbmRpZgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBwcm90b2NvbCB7Ci0KLWNvbnN0IGludCBURGVuc2VQcm90b2NvbDo6RlBfUFJFRklYX0xFTiA9Ci0gIGFwYWNoZTo6dGhyaWZ0OjpyZWZsZWN0aW9uOjpsb2NhbDo6RlBfUFJFRklYX0xFTjsKLQotLy8gVG9wIFR5cGVTcGVjLiAgVHlwZVNwZWMgb2YgdGhlIHN0cnVjdHVyZSBiZWluZyBlbmNvZGVkLgotI2RlZmluZSBUVFMgICh0c19zdGFja18uYmFjaygpKSAgLy8gdHlwZSA9IFR5cGVTcGVjKgotLy8gSW5EZVguICBJbmRleCBpbnRvIFRUUyBvZiB0aGUgY3VycmVudC9uZXh0IGZpZWxkIHRvIGVuY29kZS4KLSNkZWZpbmUgSURYIChpZHhfc3RhY2tfLmJhY2soKSkgIC8vIHR5cGUgPSBpbnQKLS8vIEZpZWxkIFR5cGVTcGVjLiAgVHlwZVNwZWMgb2YgdGhlIGN1cnJlbnQvbmV4dCBmaWVsZCB0byBlbmNvZGUuCi0jZGVmaW5lIEZUUyAoVFRTLT50c3RydWN0LnNwZWNzW0lEWF0pICAvLyB0eXBlID0gVHlwZVNwZWMqCi0vLyBGaWVsZCBNZVRhLiAgTWV0YWRhdGEgb2YgdGhlIGN1cnJlbnQvbmV4dCBmaWVsZCB0byBlbmNvZGUuCi0jZGVmaW5lIEZNVCAoVFRTLT50c3RydWN0Lm1ldGFzW0lEWF0pICAvLyB0eXBlID0gRmllbGRNZXRhCi0vLyBTdWJUeXBlIDEvMi4gIFR5cGVTcGVjIG9mIHRoZSBmaXJzdC9zZWNvbmQgc3VidHlwZSBvZiB0aGlzIGNvbnRhaW5lci4KLSNkZWZpbmUgU1QxIChUVFMtPnRjb250YWluZXIuc3VidHlwZTEpCi0jZGVmaW5lIFNUMiAoVFRTLT50Y29udGFpbmVyLnN1YnR5cGUyKQotCi0KLS8qKgotICogQ2hlY2tzIHRoYXQgQGMgdHR5cGUgaXMgaW5kZWVkIHRoZSB0dHlwZSB0aGF0IHdlIHNob3VsZCBiZSB3cml0aW5nLAotICogYWNjb3JkaW5nIHRvIG91ciB0eXBlc3BlYy4gIEFib3J0cyBpZiB0aGUgdGVzdCBmYWlscyBhbmQgZGVidWdnaW5nIGluIG9uLgotICovCi1pbmxpbmUgdm9pZCBURGVuc2VQcm90b2NvbDo6Y2hlY2tUVHlwZShjb25zdCBUVHlwZSB0dHlwZSkgewotICBhc3NlcnQoIXRzX3N0YWNrXy5lbXB0eSgpKTsKLSAgYXNzZXJ0KFRUUy0+dHR5cGUgPT0gdHR5cGUpOwotfQotCi0vKioKLSAqIE1ha2VzIHN1cmUgdGhhdCB0aGUgVHlwZVNwZWMgc3RhY2sgaXMgY29ycmVjdCBmb3IgdGhlIG5leHQgb2JqZWN0LgotICogU2VlIHRvcC1vZi1maWxlIGNvbW1lbnRzLgotICovCi1pbmxpbmUgdm9pZCBURGVuc2VQcm90b2NvbDo6c3RhdGVUcmFuc2l0aW9uKCkgewotICBUeXBlU3BlYyogb2xkX3R0cyA9IHRzX3N0YWNrXy5iYWNrKCk7Ci0gIHRzX3N0YWNrXy5wb3BfYmFjaygpOwotCi0gIC8vIElmIHRoaXMgaXMgdGhlIGVuZCBvZiB0aGUgdG9wLWxldmVsIHdyaXRlLCB3ZSBzaG91bGQgaGF2ZSBqdXN0IHBvcHBlZAotICAvLyB0aGUgVHlwZVNwZWMgcGFzc2VkIHRvIHRoZSBjb25zdHJ1Y3Rvci4KLSAgaWYgKHRzX3N0YWNrXy5lbXB0eSgpKSB7Ci0gICAgYXNzZXJ0KG9sZF90dHMgPSB0eXBlX3NwZWNfKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzd2l0Y2ggKFRUUy0+dHR5cGUpIHsKLQotICAgIGNhc2UgVF9TVFJVQ1Q6Ci0gICAgICBhc3NlcnQob2xkX3R0cyA9PSBGVFMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFRfTElTVDoKLSAgICBjYXNlIFRfU0VUOgotICAgICAgYXNzZXJ0KG9sZF90dHMgPT0gU1QxKTsKLSAgICAgIHRzX3N0YWNrXy5wdXNoX2JhY2sob2xkX3R0cyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgVF9NQVA6Ci0gICAgICBhc3NlcnQob2xkX3R0cyA9PSAobWt2X3N0YWNrXy5iYWNrKCkgPyBTVDEgOiBTVDIpKTsKLSAgICAgIG1rdl9zdGFja18uYmFjaygpID0gIW1rdl9zdGFja18uYmFjaygpOwotICAgICAgdHNfc3RhY2tfLnB1c2hfYmFjayhta3Zfc3RhY2tfLmJhY2soKSA/IFNUMSA6IFNUMik7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhc3NlcnQoISJJbnZhbGlkIFRUeXBlIGluIHN0YXRlVHJhbnNpdGlvbi4iKTsKLSAgICAgIGJyZWFrOwotCi0gIH0KLX0KLQotCi0vKgotICogVmFyaWFibGUtbGVuZ3RoIHF1YW50aXR5IGZ1bmN0aW9ucy4KLSAqLwotCi1pbmxpbmUgdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OnZscVJlYWQodWludDY0X3QmIHZscSkgewotICB1aW50MzJfdCB1c2VkID0gMDsKLSAgdWludDY0X3QgdmFsID0gMDsKLSAgdWludDhfdCBidWZbMTBdOyAgLy8gNjQgYml0cyAvICg3IGJpdHMvYnl0ZSkgPSAxMCBieXRlcy4KLSAgdWludDMyX3QgYnVmX3NpemUgPSBzaXplb2YoYnVmKTsKLSAgY29uc3QgdWludDhfdCogYm9ycm93ZWQgPSB0cmFuc18tPmJvcnJvdyhidWYsICZidWZfc2l6ZSk7Ci0KLSAgLy8gRmFzdCBwYXRoLiAgVE9ETyhkcmVpc3MpOiBNYWtlIGl0IGZhc3Rlci4KLSAgaWYgKGJvcnJvd2VkICE9IE5VTEwpIHsKLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgdWludDhfdCBieXRlID0gYm9ycm93ZWRbdXNlZF07Ci0gICAgICB1c2VkKys7Ci0gICAgICB2YWwgPSAodmFsIDw8IDcpIHwgKGJ5dGUgJiAweDdmKTsKLSAgICAgIGlmICghKGJ5dGUgJiAweDgwKSkgewotICAgICAgICB2bHEgPSB2YWw7Ci0gICAgICAgIHRyYW5zXy0+Y29uc3VtZSh1c2VkKTsKLSAgICAgICAgcmV0dXJuIHVzZWQ7Ci0gICAgICB9Ci0gICAgICAvLyBIYXZlIHRvIGNoZWNrIGZvciBpbnZhbGlkIGRhdGEgc28gd2UgZG9uJ3QgY3Jhc2guCi0gICAgICBpZiAoVU5MSUtFTFkodXNlZCA9PSBzaXplb2YoYnVmKSkpIHsKLSAgICAgICAgcmVzZXRTdGF0ZSgpOwotICAgICAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEsICJWYXJpYWJsZS1sZW5ndGggaW50IG92ZXIgMTAgYnl0ZXMuIik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLy8gU2xvdyBwYXRoLgotICBlbHNlIHsKLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgdWludDhfdCBieXRlOwotICAgICAgdXNlZCArPSB0cmFuc18tPnJlYWRBbGwoJmJ5dGUsIDEpOwotICAgICAgdmFsID0gKHZhbCA8PCA3KSB8IChieXRlICYgMHg3Zik7Ci0gICAgICBpZiAoIShieXRlICYgMHg4MCkpIHsKLSAgICAgICAgdmxxID0gdmFsOwotICAgICAgICByZXR1cm4gdXNlZDsKLSAgICAgIH0KLSAgICAgIC8vIE1pZ2h0IGFzIHdlbGwgY2hlY2sgZm9yIGludmFsaWQgZGF0YSBvbiB0aGUgc2xvdyBwYXRoIHRvby4KLSAgICAgIGlmIChVTkxJS0VMWSh1c2VkID49IHNpemVvZihidWYpKSkgewotICAgICAgICByZXNldFN0YXRlKCk7Ci0gICAgICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSwgIlZhcmlhYmxlLWxlbmd0aCBpbnQgb3ZlciAxMCBieXRlcy4iKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotaW5saW5lIHVpbnQzMl90IFREZW5zZVByb3RvY29sOjp2bHFXcml0ZSh1aW50NjRfdCB2bHEpIHsKLSAgdWludDhfdCBidWZbMTBdOyAgLy8gNjQgYml0cyAvICg3IGJpdHMvYnl0ZSkgPSAxMCBieXRlcy4KLSAgaW50MzJfdCBwb3MgPSBzaXplb2YoYnVmKSAtIDE7Ci0KLSAgLy8gV3JpdGUgdGhlIHRoaW5nIGZyb20gYmFjayB0byBmcm9udC4KLSAgYnVmW3Bvc10gPSB2bHEgJiAweDdmOwotICB2bHEgPj49IDc7Ci0gIHBvcy0tOwotCi0gIHdoaWxlICh2bHEgPiAwKSB7Ci0gICAgYXNzZXJ0KHBvcyA+PSAwKTsKLSAgICBidWZbcG9zXSA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHZscSB8IDB4ODApOwotICAgIHZscSA+Pj0gNzsKLSAgICBwb3MtLTsKLSAgfQotCi0gIC8vIEJhY2sgdXAgb25lIHN0ZXAgYmVmb3JlIHdyaXRpbmcuCi0gIHBvcysrOwotCi0gIHRyYW5zXy0+d3JpdGUoYnVmK3Bvcywgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHNpemVvZihidWYpIC0gcG9zKSk7Ci0gIHJldHVybiBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc2l6ZW9mKGJ1ZikgLSBwb3MpOwotfQotCi0KLQotLyoKLSAqIFdyaXRpbmcgZnVuY3Rpb25zLgotICovCi0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjp3cml0ZU1lc3NhZ2VCZWdpbihjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUTWVzc2FnZVR5cGUgbWVzc2FnZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBzZXFpZCkgewotICB0aHJvdyBURXhjZXB0aW9uKCJURGVuc2VQcm90b2NvbCBkb2Vzbid0IHdvcmsgd2l0aCBtZXNzYWdlcyAoeWV0KS4iKTsKLQotICBpbnQzMl90IHZlcnNpb24gPSAoVkVSU0lPTl8yKSB8ICgoaW50MzJfdCltZXNzYWdlVHlwZSk7Ci0gIHVpbnQzMl90IHdzaXplID0gMDsKLSAgd3NpemUgKz0gc3ViV3JpdGVJMzIodmVyc2lvbik7Ci0gIHdzaXplICs9IHN1YldyaXRlU3RyaW5nKG5hbWUpOwotICB3c2l6ZSArPSBzdWJXcml0ZUkzMihzZXFpZCk7Ci0gIHJldHVybiB3c2l6ZTsKLX0KLQotdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OndyaXRlTWVzc2FnZUVuZCgpIHsKLSAgcmV0dXJuIDA7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjp3cml0ZVN0cnVjdEJlZ2luKGNvbnN0IGNoYXIqIG5hbWUpIHsKLSAgKHZvaWQpIG5hbWU7Ci0gIHVpbnQzMl90IHhmZXIgPSAwOwotCi0gIC8vIFRoZSBUeXBlU3BlYyBzdGFjayBzaG91bGQgYmUgZW1wdHkgaWYgdGhpcyBpcyB0aGUgdG9wLWxldmVsIHJlYWQvd3JpdGUuCi0gIC8vIElmIGl0IGlzLCB3ZSBwdXNoIHRoZSBUeXBlU3BlYyBwYXNzZWQgdG8gdGhlIGNvbnN0cnVjdG9yLgotICBpZiAodHNfc3RhY2tfLmVtcHR5KCkpIHsKLSAgICBhc3NlcnQoc3RhbmRhbG9uZV8pOwotCi0gICAgaWYgKHR5cGVfc3BlY18gPT0gTlVMTCkgewotICAgICAgcmVzZXRTdGF0ZSgpOwotICAgICAgdGhyb3cgVEV4Y2VwdGlvbigiVERlbnNlUHJvdG9jb2w6IE5vIHR5cGUgc3BlY2lmaWVkLiIpOwotICAgIH0gZWxzZSB7Ci0gICAgICBhc3NlcnQodHlwZV9zcGVjXy0+dHR5cGUgPT0gVF9TVFJVQ1QpOwotICAgICAgdHNfc3RhY2tfLnB1c2hfYmFjayh0eXBlX3NwZWNfKTsKLSAgICAgIC8vIFdyaXRlIG91dCBhIHByZWZpeCBvZiB0aGUgc3RydWN0dXJlIGZpbmdlcnByaW50LgotICAgICAgdHJhbnNfLT53cml0ZSh0eXBlX3NwZWNfLT5mcF9wcmVmaXgsIEZQX1BSRUZJWF9MRU4pOwotICAgICAgeGZlciArPSBGUF9QUkVGSVhfTEVOOwotICAgIH0KLSAgfQotCi0gIC8vIFdlIG5lZWQgYSBuZXcgZmllbGQgaW5kZXggZm9yIHRoaXMgc3RydWN0dXJlLgotICBpZHhfc3RhY2tfLnB1c2hfYmFjaygwKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjp3cml0ZVN0cnVjdEVuZCgpIHsKLSAgaWR4X3N0YWNrXy5wb3BfYmFjaygpOwotICBzdGF0ZVRyYW5zaXRpb24oKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjp3cml0ZUZpZWxkQmVnaW4oY29uc3QgY2hhciogbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFR5cGUgZmllbGRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90IGZpZWxkSWQpIHsKLSAgKHZvaWQpIG5hbWU7Ci0gIHVpbnQzMl90IHhmZXIgPSAwOwotCi0gIC8vIFNraXAgb3ZlciBvcHRpb25hbCBmaWVsZHMuCi0gIHdoaWxlIChGTVQudGFnICE9IGZpZWxkSWQpIHsKLSAgICAvLyBUT0RPKGRyZWlzcyk6IE9sZCBtZXRhIGhlcmUuCi0gICAgYXNzZXJ0KEZUUy0+dHR5cGUgIT0gVF9TVE9QKTsKLSAgICBhc3NlcnQoRk1ULmlzX29wdGlvbmFsKTsKLSAgICAvLyBXcml0ZSBhIHplcm8gYnl0ZSBzbyB0aGUgcmVhZGVyIGNhbiBza2lwIGl0LgotICAgIHhmZXIgKz0gc3ViV3JpdGVCb29sKGZhbHNlKTsKLSAgICAvLyBBbmQgYWR2YW5jZSB0byB0aGUgbmV4dCBmaWVsZC4KLSAgICBJRFgrKzsKLSAgfQotCi0gIC8vIFRPRE8oZHJlaXNzKTogZ2l2ZSBhIGJldHRlciBleGNlcHRpb24uCi0gIGFzc2VydChGVFMtPnR0eXBlID09IGZpZWxkVHlwZSk7Ci0KLSAgaWYgKEZNVC5pc19vcHRpb25hbCkgewotICAgIHN1YldyaXRlQm9vbCh0cnVlKTsKLSAgICB4ZmVyICs9IDE7Ci0gIH0KLQotICAvLyB3cml0ZUZpZWxkU3RvcCBzaGFyZXMgYWxsIGxvdCBvZiBsb2dpYyB1cCB0byB0aGlzIHBvaW50LgotICAvLyBJbnN0ZWFkIG9mIHJlcGxpY2F0aW5nIGl0IGFsbCwgd2UganVzdCBjYWxsIHRoaXMgbWV0aG9kIGZyb20gdGhhdCBvbmUKLSAgLy8gYW5kIHVzZSBhIGdyb3NzIHNwZWNpYWwgY2FzZSBoZXJlLgotICBpZiAoVU5MSUtFTFkoRlRTLT50dHlwZSAhPSBUX1NUT1ApKSB7Ci0gICAgLy8gRm9yIG5vcm1hbCBmaWVsZHMsIHB1c2ggdGhlIFR5cGVTcGVjIHRoYXQgd2UncmUgYWJvdXQgdG8gdXNlLgotICAgIHRzX3N0YWNrXy5wdXNoX2JhY2soRlRTKTsKLSAgfQotICByZXR1cm4geGZlcjsKLX0KLQotdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OndyaXRlRmllbGRFbmQoKSB7Ci0gIC8vIEp1c3QgbW92ZSBvbiB0byB0aGUgbmV4dCBmaWVsZC4KLSAgSURYKys7Ci0gIHJldHVybiAwOwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6d3JpdGVGaWVsZFN0b3AoKSB7Ci0gIHJldHVybiBURGVuc2VQcm90b2NvbDo6d3JpdGVGaWVsZEJlZ2luKCIiLCBUX1NUT1AsIDApOwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6d3JpdGVNYXBCZWdpbihjb25zdCBUVHlwZSBrZXlUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFR5cGUgdmFsVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKLSAgY2hlY2tUVHlwZShUX01BUCk7Ci0KLSAgYXNzZXJ0KGtleVR5cGUgPT0gU1QxLT50dHlwZSk7Ci0gIGFzc2VydCh2YWxUeXBlID09IFNUMi0+dHR5cGUpOwotCi0gIHRzX3N0YWNrXy5wdXNoX2JhY2soU1QxKTsKLSAgbWt2X3N0YWNrXy5wdXNoX2JhY2sodHJ1ZSk7Ci0KLSAgcmV0dXJuIHN1YldyaXRlSTMyKChpbnQzMl90KXNpemUpOwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6d3JpdGVNYXBFbmQoKSB7Ci0gIC8vIFBvcCBvZmYgdGhlIHZhbHVlIHR5cGUsIGFzIHdlbGwgYXMgb3VyIGVudHJ5IGluIHRoZSBtYXAga2V5L3ZhbHVlIHN0YWNrLgotICAvLyBzdGF0ZVRyYW5zaXRpb24gdGFrZXMgY2FyZSBvZiBwb3BwaW5nIG9mZiBvdXIgVHlwZVNwZWMuCi0gIHRzX3N0YWNrXy5wb3BfYmFjaygpOwotICBta3Zfc3RhY2tfLnBvcF9iYWNrKCk7Ci0gIHN0YXRlVHJhbnNpdGlvbigpOwotICByZXR1cm4gMDsKLX0KLQotdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OndyaXRlTGlzdEJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKLSAgY2hlY2tUVHlwZShUX0xJU1QpOwotCi0gIGFzc2VydChlbGVtVHlwZSA9PSBTVDEtPnR0eXBlKTsKLSAgdHNfc3RhY2tfLnB1c2hfYmFjayhTVDEpOwotICByZXR1cm4gc3ViV3JpdGVJMzIoKGludDMyX3Qpc2l6ZSk7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjp3cml0ZUxpc3RFbmQoKSB7Ci0gIC8vIFBvcCBvZmYgdGhlIGVsZW1lbnQgdHlwZS4gIHN0YXRlVHJhbnNpdGlvbiB0YWtlcyBjYXJlIG9mIHBvcHBpbmcgb2ZmIG91cnMuCi0gIHRzX3N0YWNrXy5wb3BfYmFjaygpOwotICBzdGF0ZVRyYW5zaXRpb24oKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjp3cml0ZVNldEJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSkgewotICBjaGVja1RUeXBlKFRfU0VUKTsKLQotICBhc3NlcnQoZWxlbVR5cGUgPT0gU1QxLT50dHlwZSk7Ci0gIHRzX3N0YWNrXy5wdXNoX2JhY2soU1QxKTsKLSAgcmV0dXJuIHN1YldyaXRlSTMyKChpbnQzMl90KXNpemUpOwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6d3JpdGVTZXRFbmQoKSB7Ci0gIC8vIFBvcCBvZmYgdGhlIGVsZW1lbnQgdHlwZS4gIHN0YXRlVHJhbnNpdGlvbiB0YWtlcyBjYXJlIG9mIHBvcHBpbmcgb2ZmIG91cnMuCi0gIHRzX3N0YWNrXy5wb3BfYmFjaygpOwotICBzdGF0ZVRyYW5zaXRpb24oKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjp3cml0ZUJvb2woY29uc3QgYm9vbCB2YWx1ZSkgewotICBjaGVja1RUeXBlKFRfQk9PTCk7Ci0gIHN0YXRlVHJhbnNpdGlvbigpOwotICByZXR1cm4gVEJpbmFyeVByb3RvY29sOjp3cml0ZUJvb2wodmFsdWUpOwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6d3JpdGVCeXRlKGNvbnN0IGludDhfdCBieXRlKSB7Ci0gIGNoZWNrVFR5cGUoVF9CWVRFKTsKLSAgc3RhdGVUcmFuc2l0aW9uKCk7Ci0gIHJldHVybiBUQmluYXJ5UHJvdG9jb2w6OndyaXRlQnl0ZShieXRlKTsKLX0KLQotdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OndyaXRlSTE2KGNvbnN0IGludDE2X3QgaTE2KSB7Ci0gIGNoZWNrVFR5cGUoVF9JMTYpOwotICBzdGF0ZVRyYW5zaXRpb24oKTsKLSAgcmV0dXJuIHZscVdyaXRlKGkxNik7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjp3cml0ZUkzMihjb25zdCBpbnQzMl90IGkzMikgewotICBjaGVja1RUeXBlKFRfSTMyKTsKLSAgc3RhdGVUcmFuc2l0aW9uKCk7Ci0gIHJldHVybiB2bHFXcml0ZShpMzIpOwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6d3JpdGVJNjQoY29uc3QgaW50NjRfdCBpNjQpIHsKLSAgY2hlY2tUVHlwZShUX0k2NCk7Ci0gIHN0YXRlVHJhbnNpdGlvbigpOwotICByZXR1cm4gdmxxV3JpdGUoaTY0KTsKLX0KLQotdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OndyaXRlRG91YmxlKGNvbnN0IGRvdWJsZSBkdWIpIHsKLSAgY2hlY2tUVHlwZShUX0RPVUJMRSk7Ci0gIHN0YXRlVHJhbnNpdGlvbigpOwotICByZXR1cm4gVEJpbmFyeVByb3RvY29sOjp3cml0ZURvdWJsZShkdWIpOwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6d3JpdGVTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgewotICBjaGVja1RUeXBlKFRfU1RSSU5HKTsKLSAgc3RhdGVUcmFuc2l0aW9uKCk7Ci0gIHJldHVybiBzdWJXcml0ZVN0cmluZyhzdHIpOwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6d3JpdGVCaW5hcnkoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgewotICByZXR1cm4gVERlbnNlUHJvdG9jb2w6OndyaXRlU3RyaW5nKHN0cik7Ci19Ci0KLWlubGluZSB1aW50MzJfdCBURGVuc2VQcm90b2NvbDo6c3ViV3JpdGVJMzIoY29uc3QgaW50MzJfdCBpMzIpIHsKLSAgcmV0dXJuIHZscVdyaXRlKGkzMik7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjpzdWJXcml0ZVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7Ci0gIGlmKHN0ci5zaXplKCkgPiBzdGF0aWNfY2FzdDxzaXplX3Q+KChzdGQ6Om51bWVyaWNfbGltaXRzPGludDMyX3Q+OjptYXgpKCkpKQotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OlNJWkVfTElNSVQpOwotICB1aW50MzJfdCBzaXplID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHN0ci5zaXplKCkpOwotICB1aW50MzJfdCB4ZmVyID0gc3ViV3JpdGVJMzIoKGludDMyX3Qpc2l6ZSk7Ci0gIGlmIChzaXplID4gMCkgewotICAgIHRyYW5zXy0+d3JpdGUoKHVpbnQ4X3QqKXN0ci5kYXRhKCksIHNpemUpOwotICB9Ci0gIHJldHVybiB4ZmVyICsgc2l6ZTsKLX0KLQotCi0KLS8qCi0gKiBSZWFkaW5nIGZ1bmN0aW9ucwotICoKLSAqIFRoZXNlIGhhdmUgYSBsb3Qgb2YgdGhlIHNhbWUgbG9naWMgYXMgdGhlIHdyaXRpbmcgZnVuY3Rpb25zLCBzbyBpZgotICogc29tZXRoaW5nIGlzIGNvbmZ1c2luZywgbG9vayBmb3IgY29tbWVudHMgaW4gdGhlIGNvcnJlc3BvbmRpbmcgd3JpdGVyLgotICovCi0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjpyZWFkTWVzc2FnZUJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE1lc3NhZ2VUeXBlJiBtZXNzYWdlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIHNlcWlkKSB7Ci0gIHRocm93IFRFeGNlcHRpb24oIlREZW5zZVByb3RvY29sIGRvZXNuJ3Qgd29yayB3aXRoIG1lc3NhZ2VzICh5ZXQpLiIpOwotCi0gIHVpbnQzMl90IHhmZXIgPSAwOwotICBpbnQzMl90IHN6OwotICB4ZmVyICs9IHN1YlJlYWRJMzIoc3opOwotCi0gIGlmIChzeiA8IDApIHsKLSAgICAvLyBDaGVjayBmb3IgY29ycmVjdCB2ZXJzaW9uIG51bWJlcgotICAgIGludDMyX3QgdmVyc2lvbiA9IHN6ICYgVkVSU0lPTl9NQVNLOwotICAgIGlmICh2ZXJzaW9uICE9IFZFUlNJT05fMikgewotICAgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6QkFEX1ZFUlNJT04sICJCYWQgdmVyc2lvbiBpZGVudGlmaWVyIik7Ci0gICAgfQotICAgIG1lc3NhZ2VUeXBlID0gKFRNZXNzYWdlVHlwZSkoc3ogJiAweDAwMDAwMGZmKTsKLSAgICB4ZmVyICs9IHN1YlJlYWRTdHJpbmcobmFtZSk7Ci0gICAgeGZlciArPSBzdWJSZWFkSTMyKHNlcWlkKTsKLSAgfSBlbHNlIHsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpCQURfVkVSU0lPTiwgIk5vIHZlcnNpb24gaWRlbnRpZmllci4uLiBvbGQgcHJvdG9jb2wgY2xpZW50IGluIHN0cmljdCBtb2RlPyIpOwotICB9Ci0gIHJldHVybiB4ZmVyOwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6cmVhZE1lc3NhZ2VFbmQoKSB7Ci0gIHJldHVybiAwOwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6cmVhZFN0cnVjdEJlZ2luKHN0cmluZyYgbmFtZSkgewotICAodm9pZCkgbmFtZTsKLSAgdWludDMyX3QgeGZlciA9IDA7Ci0KLSAgaWYgKHRzX3N0YWNrXy5lbXB0eSgpKSB7Ci0gICAgYXNzZXJ0KHN0YW5kYWxvbmVfKTsKLQotICAgIGlmICh0eXBlX3NwZWNfID09IE5VTEwpIHsKLSAgICAgIHJlc2V0U3RhdGUoKTsKLSAgICAgIHRocm93IFRFeGNlcHRpb24oIlREZW5zZVByb3RvY29sOiBObyB0eXBlIHNwZWNpZmllZC4iKTsKLSAgICB9IGVsc2UgewotICAgICAgYXNzZXJ0KHR5cGVfc3BlY18tPnR0eXBlID09IFRfU1RSVUNUKTsKLSAgICAgIHRzX3N0YWNrXy5wdXNoX2JhY2sodHlwZV9zcGVjXyk7Ci0KLSAgICAgIC8vIENoZWNrIHRoZSBmaW5nZXJwcmludCBwcmVmaXguCi0gICAgICB1aW50OF90IGJ1ZltGUF9QUkVGSVhfTEVOXTsKLSAgICAgIHhmZXIgKz0gdHJhbnNfLT5yZWFkKGJ1ZiwgRlBfUFJFRklYX0xFTik7Ci0gICAgICBpZiAoc3RkOjptZW1jbXAoYnVmLCB0eXBlX3NwZWNfLT5mcF9wcmVmaXgsIEZQX1BSRUZJWF9MRU4pICE9IDApIHsKLSAgICAgICAgcmVzZXRTdGF0ZSgpOwotICAgICAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEsCi0gICAgICAgICAgICAiRmluZ2VycHJpbnQgaW4gZGF0YSBkb2VzIG5vdCBtYXRjaCB0eXBlX3NwZWMuIik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLy8gV2UgbmVlZCBhIG5ldyBmaWVsZCBpbmRleCBmb3IgdGhpcyBzdHJ1Y3R1cmUuCi0gIGlkeF9zdGFja18ucHVzaF9iYWNrKDApOwotICByZXR1cm4gMDsKLX0KLQotdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OnJlYWRTdHJ1Y3RFbmQoKSB7Ci0gIGlkeF9zdGFja18ucG9wX2JhY2soKTsKLSAgc3RhdGVUcmFuc2l0aW9uKCk7Ci0gIHJldHVybiAwOwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6cmVhZEZpZWxkQmVnaW4oc3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUeXBlJiBmaWVsZFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCYgZmllbGRJZCkgewotICAodm9pZCkgbmFtZTsKLSAgdWludDMyX3QgeGZlciA9IDA7Ci0KLSAgLy8gRm9yIG9wdGlvbmFsIGZpZWxkcywgY2hlY2sgdG8gc2VlIGlmIHRoZXkgYXJlIHRoZXJlLgotICB3aGlsZSAoRk1ULmlzX29wdGlvbmFsKSB7Ci0gICAgYm9vbCBpc19wcmVzZW50OwotICAgIHhmZXIgKz0gc3ViUmVhZEJvb2woaXNfcHJlc2VudCk7Ci0gICAgaWYgKGlzX3ByZXNlbnQpIHsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBJRFgrKzsKLSAgfQotCi0gIC8vIE9uY2Ugd2UgaGl0IGEgbWFuZGF0b3J5IGZpZWxkLCBvciBhbiBvcHRpb25hbCBmaWVsZCB0aGF0IGlzIHByZXNlbnQsCi0gIC8vIHdlIGtub3cgdGhhdCBGTVQgYW5kIEZUUyBwb2ludCB0byB0aGUgYXBwcm9wcmlhdGUgZmllbGQuCi0KLSAgZmllbGRJZCAgID0gRk1ULnRhZzsKLSAgZmllbGRUeXBlID0gRlRTLT50dHlwZTsKLQotICAvLyBOb3JtYWxseSwgd2UgcHVzaCB0aGUgVHlwZVNwZWMgdGhhdCB3ZSBhcmUgYWJvdXQgdG8gcmVhZCwKLSAgLy8gYnV0IG5vIHJlYWRpbmcgaXMgZG9uZSBmb3IgVF9TVE9QLgotICBpZiAoRlRTLT50dHlwZSAhPSBUX1NUT1ApIHsKLSAgICB0c19zdGFja18ucHVzaF9iYWNrKEZUUyk7Ci0gIH0KLSAgcmV0dXJuIHhmZXI7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjpyZWFkRmllbGRFbmQoKSB7Ci0gIElEWCsrOwotICByZXR1cm4gMDsKLX0KLQotdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OnJlYWRNYXBCZWdpbihUVHlwZSYga2V5VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGUmIHZhbFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBzaXplKSB7Ci0gIGNoZWNrVFR5cGUoVF9NQVApOwotCi0gIHVpbnQzMl90IHhmZXIgPSAwOwotICBpbnQzMl90IHNpemVpOwotICB4ZmVyICs9IHN1YlJlYWRJMzIoc2l6ZWkpOwotICBpZiAoc2l6ZWkgPCAwKSB7Ci0gICAgcmVzZXRTdGF0ZSgpOwotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5FR0FUSVZFX1NJWkUpOwotICB9IGVsc2UgaWYgKGNvbnRhaW5lcl9saW1pdF8gJiYgc2l6ZWkgPiBjb250YWluZXJfbGltaXRfKSB7Ci0gICAgcmVzZXRTdGF0ZSgpOwotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OlNJWkVfTElNSVQpOwotICB9Ci0gIHNpemUgPSAodWludDMyX3Qpc2l6ZWk7Ci0KLSAga2V5VHlwZSA9IFNUMS0+dHR5cGU7Ci0gIHZhbFR5cGUgPSBTVDItPnR0eXBlOwotCi0gIHRzX3N0YWNrXy5wdXNoX2JhY2soU1QxKTsKLSAgbWt2X3N0YWNrXy5wdXNoX2JhY2sodHJ1ZSk7Ci0KLSAgcmV0dXJuIHhmZXI7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjpyZWFkTWFwRW5kKCkgewotICB0c19zdGFja18ucG9wX2JhY2soKTsKLSAgbWt2X3N0YWNrXy5wb3BfYmFjaygpOwotICBzdGF0ZVRyYW5zaXRpb24oKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjpyZWFkTGlzdEJlZ2luKFRUeXBlJiBlbGVtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBzaXplKSB7Ci0gIGNoZWNrVFR5cGUoVF9MSVNUKTsKLQotICB1aW50MzJfdCB4ZmVyID0gMDsKLSAgaW50MzJfdCBzaXplaTsKLSAgeGZlciArPSBzdWJSZWFkSTMyKHNpemVpKTsKLSAgaWYgKHNpemVpIDwgMCkgewotICAgIHJlc2V0U3RhdGUoKTsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpORUdBVElWRV9TSVpFKTsKLSAgfSBlbHNlIGlmIChjb250YWluZXJfbGltaXRfICYmIHNpemVpID4gY29udGFpbmVyX2xpbWl0XykgewotICAgIHJlc2V0U3RhdGUoKTsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpTSVpFX0xJTUlUKTsKLSAgfQotICBzaXplID0gKHVpbnQzMl90KXNpemVpOwotCi0gIGVsZW1UeXBlID0gU1QxLT50dHlwZTsKLQotICB0c19zdGFja18ucHVzaF9iYWNrKFNUMSk7Ci0KLSAgcmV0dXJuIHhmZXI7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjpyZWFkTGlzdEVuZCgpIHsKLSAgdHNfc3RhY2tfLnBvcF9iYWNrKCk7Ci0gIHN0YXRlVHJhbnNpdGlvbigpOwotICByZXR1cm4gMDsKLX0KLQotdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OnJlYWRTZXRCZWdpbihUVHlwZSYgZWxlbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBzaXplKSB7Ci0gIGNoZWNrVFR5cGUoVF9TRVQpOwotCi0gIHVpbnQzMl90IHhmZXIgPSAwOwotICBpbnQzMl90IHNpemVpOwotICB4ZmVyICs9IHN1YlJlYWRJMzIoc2l6ZWkpOwotICBpZiAoc2l6ZWkgPCAwKSB7Ci0gICAgcmVzZXRTdGF0ZSgpOwotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5FR0FUSVZFX1NJWkUpOwotICB9IGVsc2UgaWYgKGNvbnRhaW5lcl9saW1pdF8gJiYgc2l6ZWkgPiBjb250YWluZXJfbGltaXRfKSB7Ci0gICAgcmVzZXRTdGF0ZSgpOwotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OlNJWkVfTElNSVQpOwotICB9Ci0gIHNpemUgPSAodWludDMyX3Qpc2l6ZWk7Ci0KLSAgZWxlbVR5cGUgPSBTVDEtPnR0eXBlOwotCi0gIHRzX3N0YWNrXy5wdXNoX2JhY2soU1QxKTsKLQotICByZXR1cm4geGZlcjsKLX0KLQotdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OnJlYWRTZXRFbmQoKSB7Ci0gIHRzX3N0YWNrXy5wb3BfYmFjaygpOwotICBzdGF0ZVRyYW5zaXRpb24oKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjpyZWFkQm9vbChib29sJiB2YWx1ZSkgewotICBjaGVja1RUeXBlKFRfQk9PTCk7Ci0gIHN0YXRlVHJhbnNpdGlvbigpOwotICByZXR1cm4gVEJpbmFyeVByb3RvY29sOjpyZWFkQm9vbCh2YWx1ZSk7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjpyZWFkQnl0ZShpbnQ4X3QmIGJ5dGUpIHsKLSAgY2hlY2tUVHlwZShUX0JZVEUpOwotICBzdGF0ZVRyYW5zaXRpb24oKTsKLSAgcmV0dXJuIFRCaW5hcnlQcm90b2NvbDo6cmVhZEJ5dGUoYnl0ZSk7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjpyZWFkSTE2KGludDE2X3QmIGkxNikgewotICBjaGVja1RUeXBlKFRfSTE2KTsKLSAgc3RhdGVUcmFuc2l0aW9uKCk7Ci0gIHVpbnQ2NF90IHU2NDsKLSAgdWludDMyX3QgcnYgPSB2bHFSZWFkKHU2NCk7Ci0gIGludDY0X3QgdmFsID0gKGludDY0X3QpdTY0OwotICBpZiAoVU5MSUtFTFkodmFsID4gSU5UMTZfTUFYIHx8IHZhbCA8IElOVDE2X01JTikpIHsKLSAgICByZXNldFN0YXRlKCk7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaTE2IG91dCBvZiByYW5nZS4iKTsKLSAgfQotICBpMTYgPSAoaW50MTZfdCl2YWw7Ci0gIHJldHVybiBydjsKLX0KLQotdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OnJlYWRJMzIoaW50MzJfdCYgaTMyKSB7Ci0gIGNoZWNrVFR5cGUoVF9JMzIpOwotICBzdGF0ZVRyYW5zaXRpb24oKTsKLSAgdWludDY0X3QgdTY0OwotICB1aW50MzJfdCBydiA9IHZscVJlYWQodTY0KTsKLSAgaW50NjRfdCB2YWwgPSAoaW50NjRfdCl1NjQ7Ci0gIGlmIChVTkxJS0VMWSh2YWwgPiBJTlQzMl9NQVggfHwgdmFsIDwgSU5UMzJfTUlOKSkgewotICAgIHJlc2V0U3RhdGUoKTsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpMzIgb3V0IG9mIHJhbmdlLiIpOwotICB9Ci0gIGkzMiA9IChpbnQzMl90KXZhbDsKLSAgcmV0dXJuIHJ2OwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6cmVhZEk2NChpbnQ2NF90JiBpNjQpIHsKLSAgY2hlY2tUVHlwZShUX0k2NCk7Ci0gIHN0YXRlVHJhbnNpdGlvbigpOwotICB1aW50NjRfdCB1NjQ7Ci0gIHVpbnQzMl90IHJ2ID0gdmxxUmVhZCh1NjQpOwotICBpbnQ2NF90IHZhbCA9IChpbnQ2NF90KXU2NDsKLSAgaWYgKFVOTElLRUxZKHZhbCA+IElOVDY0X01BWCB8fCB2YWwgPCBJTlQ2NF9NSU4pKSB7Ci0gICAgcmVzZXRTdGF0ZSgpOwotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImk2NCBvdXQgb2YgcmFuZ2UuIik7Ci0gIH0KLSAgaTY0ID0gKGludDY0X3QpdmFsOwotICByZXR1cm4gcnY7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjpyZWFkRG91YmxlKGRvdWJsZSYgZHViKSB7Ci0gIGNoZWNrVFR5cGUoVF9ET1VCTEUpOwotICBzdGF0ZVRyYW5zaXRpb24oKTsKLSAgcmV0dXJuIFRCaW5hcnlQcm90b2NvbDo6cmVhZERvdWJsZShkdWIpOwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6cmVhZFN0cmluZyhzdGQ6OnN0cmluZyYgc3RyKSB7Ci0gIGNoZWNrVFR5cGUoVF9TVFJJTkcpOwotICBzdGF0ZVRyYW5zaXRpb24oKTsKLSAgcmV0dXJuIHN1YlJlYWRTdHJpbmcoc3RyKTsKLX0KLQotdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OnJlYWRCaW5hcnkoc3RkOjpzdHJpbmcmIHN0cikgewotICByZXR1cm4gVERlbnNlUHJvdG9jb2w6OnJlYWRTdHJpbmcoc3RyKTsKLX0KLQotdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OnN1YlJlYWRJMzIoaW50MzJfdCYgaTMyKSB7Ci0gIHVpbnQ2NF90IHU2NDsKLSAgdWludDMyX3QgcnYgPSB2bHFSZWFkKHU2NCk7Ci0gIGludDY0X3QgdmFsID0gKGludDY0X3QpdTY0OwotICBpZiAoVU5MSUtFTFkodmFsID4gSU5UMzJfTUFYIHx8IHZhbCA8IElOVDMyX01JTikpIHsKLSAgICByZXNldFN0YXRlKCk7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaTMyIG91dCBvZiByYW5nZS4iKTsKLSAgfQotICBpMzIgPSAoaW50MzJfdCl2YWw7Ci0gIHJldHVybiBydjsKLX0KLQotdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OnN1YlJlYWRTdHJpbmcoc3RkOjpzdHJpbmcmIHN0cikgewotICB1aW50MzJfdCB4ZmVyOwotICBpbnQzMl90IHNpemU7Ci0gIHhmZXIgPSBzdWJSZWFkSTMyKHNpemUpOwotICByZXR1cm4geGZlciArIHJlYWRTdHJpbmdCb2R5KHN0ciwgc2l6ZSk7Ci19Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2wKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9URGVuc2VQcm90b2NvbC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1REZW5zZVByb3RvY29sLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4MDhkNzkuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1REZW5zZVByb3RvY29sLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfUFJPVE9DT0xfVERFTlNFUFJPVE9DT0xfSF8KLSNkZWZpbmUgX1RIUklGVF9QUk9UT0NPTF9UREVOU0VQUk9UT0NPTF9IXyAxCi0KLSNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHByb3RvY29sIHsKLQotLyoqCi0gKiAhISFXQVJOSU5HISEhCi0gKiBUaGlzIGNsYXNzIGlzIHN0aWxsIGhpZ2hseSBleHBlcmltZW50YWwuICBJbmNvbXBhdGlibGUgY2hhbmdlcwotICogV0lMTCBiZSBtYWRlIHRvIGl0IHdpdGhvdXQgbm90aWNlLiAgRE8gTk9UIFVTRSBJVCBZRVQgdW5sZXNzCi0gKiB5b3UgYXJlIGNvb3JkaW5hdGluZyB5b3VyIHRlc3Rpbmcgd2l0aCB0aGUgYXV0aG9yLgotICoKLSAqIFRoZSBkZW5zZSBwcm90b2NvbCBpcyBkZXNpZ25lZCB0byB1c2UgYXMgbGl0dGxlIHNwYWNlIGFzIHBvc3NpYmxlLgotICoKLSAqIFRoZXJlIGFyZSB0d28gdHlwZXMgb2YgZGVuc2UgcHJvdG9jb2wgaW5zdGFuY2VzLiAgU3RhbmRhbG9uZSBpbnN0YW5jZXMKLSAqIGFyZSBub3QgdXNlZCBmb3IgUlBDIGFuZCBqdXN0IGVuY29kZWQgYW5kIGRlY29kZSBzdHJ1Y3R1cmVzIG9mCi0gKiBhIHByZWRldGVybWluZWQgdHlwZS4gIE5vbi1zdGFuZGFsb25lIGluc3RhbmNlcyBhcmUgdXNlZCBmb3IgUlBDLgotICogQ3VycmVudGx5LCBvbmx5IHN0YW5kYWxvbmUgaW5zdGFuY2VzIGV4aXN0LgotICoKLSAqIFRvIHVzZSBhIHN0YW5kYWxvbmUgZGVuc2UgcHJvdG9jb2wgb2JqZWN0LCB5b3UgbXVzdCBzZXQgdGhlIHR5cGVfc3BlYwotICogcHJvcGVydHkgKGVpdGhlciBpbiB0aGUgY29uc3RydWN0b3IsIG9yIHdpdGggc2V0VHlwZVNwZWMpIHRvIHRoZSBsb2NhbAotICogcmVmbGVjdGlvbiBUeXBlU3BlYyBvZiB0aGUgc3RydWN0dXJlcyB5b3Ugd2lsbCB3cml0ZSB0byAob3IgcmVhZCBmcm9tKSB0aGUKLSAqIHByb3RvY29sIGluc3RhbmNlLgotICoKLSAqIEJFU1QgUFJBQ1RJQ0VTOgotICogLSBOZXZlciB1c2Ugb3B0aW9uYWwgZm9yIHByaW1pdGl2ZXMgb3IgY29udGFpbmVycy4KLSAqIC0gT25seSB1c2Ugb3B0aW9uYWwgZm9yIHN0cnVjdHVyZXMgaWYgdGhleSBhcmUgdmVyeSBiaWcgYW5kIHZlcnkgcmFyZWx5IHNldC4KLSAqIC0gQWxsIGludGVnZXJzIGFyZSB2YXJpYWJsZS1sZW5ndGgsIHNvIHlvdSBjYW4gdXNlIGk2NCB3aXRob3V0IGJsb2F0aW5nLgotICogLSBORVZFUiBFVkVSIGNoYW5nZSB0aGUgc3RydWN0IGRlZmluaXRpb25zIElOIEFOWSBXQVkgd2l0aG91dCBlaXRoZXIKLSAqICAgY2hhbmdpbmcgeW91ciBjYWNoZSBrZXlzIG9yIHRhbGtpbmcgdG8gZHJlaXNzLgotICoKLSAqIFRPRE8oZHJlaXNzKTogTmV3IGNsYXNzIHdyaXRlIHdpdGggb2xkIG1ldGEuCi0gKgotICogV2Ugb3ZlcnJpZGUgYWxsIG9mIFRCaW5hcnlQcm90b2NvbCdzIG1ldGhvZHMuCi0gKiBXZSBpbmhlcml0IHNvIHRoYXQgd2UgY2FuIGNhbiBleHBsaWNpdGx5IGNhbGwgVEJQcydzIHByaW1pdGl2ZS13cml0aW5nCi0gKiBtZXRob2RzIHdpdGhpbiBvdXIgdmVyc2lvbnMuCi0gKgotICovCi1jbGFzcyBURGVuc2VQcm90b2NvbAotICA6IHB1YmxpYyBUVmlydHVhbFByb3RvY29sPFREZW5zZVByb3RvY29sLCBUQmluYXJ5UHJvdG9jb2w+IHsKLSBwcm90ZWN0ZWQ6Ci0gIHN0YXRpYyBjb25zdCBpbnQzMl90IFZFUlNJT05fTUFTSyA9ICgoaW50MzJfdCkweGZmZmYwMDAwKTsKLSAgLy8gVkVSU0lPTl8xICgweDgwMDEwMDAwKSAgaXMgdGFrZW4gYnkgVEJpbmFyeVByb3RvY29sLgotICBzdGF0aWMgY29uc3QgaW50MzJfdCBWRVJTSU9OXzIgPSAoKGludDMyX3QpMHg4MDAyMDAwMCk7Ci0KLSBwdWJsaWM6Ci0gIHR5cGVkZWYgYXBhY2hlOjp0aHJpZnQ6OnJlZmxlY3Rpb246OmxvY2FsOjpUeXBlU3BlYyBUeXBlU3BlYzsKLSAgc3RhdGljIGNvbnN0IGludCBGUF9QUkVGSVhfTEVOOwotCi0gIC8qKgotICAgKiBAcGFyYW0gdHJhbiAgICAgICBUaGUgdHJhbnNwb3J0IHRvIHVzZS4KLSAgICogQHBhcmFtIHR5cGVfc3BlYyAgVGhlIFR5cGVTcGVjIG9mIHRoZSBzdHJ1Y3R1cmVzIHVzaW5nIHRoaXMgcHJvdG9jb2wuCi0gICAqLwotICBURGVuc2VQcm90b2NvbChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFucywKLSAgICAgICAgICAgICAgICAgVHlwZVNwZWMqIHR5cGVfc3BlYyA9IE5VTEwpIDoKLSAgICBUVmlydHVhbFByb3RvY29sPFREZW5zZVByb3RvY29sLCBUQmluYXJ5UHJvdG9jb2w+KHRyYW5zKSwKLSAgICB0eXBlX3NwZWNfKHR5cGVfc3BlYyksCi0gICAgc3RhbmRhbG9uZV8odHJ1ZSkKLSAge30KLQotICB2b2lkIHNldFR5cGVTcGVjKFR5cGVTcGVjKiB0eXBlX3NwZWMpIHsKLSAgICB0eXBlX3NwZWNfID0gdHlwZV9zcGVjOwotICB9Ci0gIFR5cGVTcGVjKiBnZXRUeXBlU3BlYygpIHsKLSAgICByZXR1cm4gdHlwZV9zcGVjXzsKLSAgfQotCi0KLSAgLyoKLSAgICogV3JpdGluZyBmdW5jdGlvbnMuCi0gICAqLwotCi0gIHVpbnQzMl90IHdyaXRlTWVzc2FnZUJlZ2luKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUTWVzc2FnZVR5cGUgbWVzc2FnZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3Qgc2VxaWQpOwotCi0gIHVpbnQzMl90IHdyaXRlTWVzc2FnZUVuZCgpOwotCi0KLSAgdWludDMyX3Qgd3JpdGVTdHJ1Y3RCZWdpbihjb25zdCBjaGFyKiBuYW1lKTsKLQotICB1aW50MzJfdCB3cml0ZVN0cnVjdEVuZCgpOwotCi0gIHVpbnQzMl90IHdyaXRlRmllbGRCZWdpbihjb25zdCBjaGFyKiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFR5cGUgZmllbGRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCBmaWVsZElkKTsKLQotICB1aW50MzJfdCB3cml0ZUZpZWxkRW5kKCk7Ci0KLSAgdWludDMyX3Qgd3JpdGVGaWVsZFN0b3AoKTsKLQotICB1aW50MzJfdCB3cml0ZU1hcEJlZ2luKGNvbnN0IFRUeXBlIGtleVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFR5cGUgdmFsVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKTsKLQotICB1aW50MzJfdCB3cml0ZU1hcEVuZCgpOwotCi0gIHVpbnQzMl90IHdyaXRlTGlzdEJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLCBjb25zdCB1aW50MzJfdCBzaXplKTsKLQotICB1aW50MzJfdCB3cml0ZUxpc3RFbmQoKTsKLQotICB1aW50MzJfdCB3cml0ZVNldEJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLCBjb25zdCB1aW50MzJfdCBzaXplKTsKLQotICB1aW50MzJfdCB3cml0ZVNldEVuZCgpOwotCi0gIHVpbnQzMl90IHdyaXRlQm9vbChjb25zdCBib29sIHZhbHVlKTsKLQotICB1aW50MzJfdCB3cml0ZUJ5dGUoY29uc3QgaW50OF90IGJ5dGUpOwotCi0gIHVpbnQzMl90IHdyaXRlSTE2KGNvbnN0IGludDE2X3QgaTE2KTsKLQotICB1aW50MzJfdCB3cml0ZUkzMihjb25zdCBpbnQzMl90IGkzMik7Ci0KLSAgdWludDMyX3Qgd3JpdGVJNjQoY29uc3QgaW50NjRfdCBpNjQpOwotCi0gIHVpbnQzMl90IHdyaXRlRG91YmxlKGNvbnN0IGRvdWJsZSBkdWIpOwotCi0gIHVpbnQzMl90IHdyaXRlU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpOwotCi0gIHVpbnQzMl90IHdyaXRlQmluYXJ5KGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpOwotCi0KLSAgLyoKLSAgICogSGVscGVyIHdyaXRpbmcgZnVuY3Rpb25zIChkb24ndCBkbyBzdGF0ZSB0cmFuc2l0aW9ucykuCi0gICAqLwotICBpbmxpbmUgdWludDMyX3Qgc3ViV3JpdGVJMzIoY29uc3QgaW50MzJfdCBpMzIpOwotCi0gIGlubGluZSB1aW50MzJfdCBzdWJXcml0ZVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgc3RyKTsKLQotICB1aW50MzJfdCBzdWJXcml0ZUJvb2woY29uc3QgYm9vbCB2YWx1ZSkgewotICAgIHJldHVybiBUQmluYXJ5UHJvdG9jb2w6OndyaXRlQm9vbCh2YWx1ZSk7Ci0gIH0KLQotCi0gIC8qCi0gICAqIFJlYWRpbmcgZnVuY3Rpb25zCi0gICAqLwotCi0gIHVpbnQzMl90IHJlYWRNZXNzYWdlQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVE1lc3NhZ2VUeXBlJiBtZXNzYWdlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBzZXFpZCk7Ci0KLSAgdWludDMyX3QgcmVhZE1lc3NhZ2VFbmQoKTsKLQotICB1aW50MzJfdCByZWFkU3RydWN0QmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUpOwotCi0gIHVpbnQzMl90IHJlYWRTdHJ1Y3RFbmQoKTsKLQotICB1aW50MzJfdCByZWFkRmllbGRCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGUmIGZpZWxkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCYgZmllbGRJZCk7Ci0KLSAgdWludDMyX3QgcmVhZEZpZWxkRW5kKCk7Ci0KLSAgdWludDMyX3QgcmVhZE1hcEJlZ2luKFRUeXBlJiBrZXlUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGUmIHZhbFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2l6ZSk7Ci0KLSAgdWludDMyX3QgcmVhZE1hcEVuZCgpOwotCi0gIHVpbnQzMl90IHJlYWRMaXN0QmVnaW4oVFR5cGUmIGVsZW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBzaXplKTsKLQotICB1aW50MzJfdCByZWFkTGlzdEVuZCgpOwotCi0gIHVpbnQzMl90IHJlYWRTZXRCZWdpbihUVHlwZSYgZWxlbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2l6ZSk7Ci0KLSAgdWludDMyX3QgcmVhZFNldEVuZCgpOwotCi0gIHVpbnQzMl90IHJlYWRCb29sKGJvb2wmIHZhbHVlKTsKLSAgLy8gUHJvdmlkZSB0aGUgZGVmYXVsdCByZWFkQm9vbCgpIGltcGxlbWVudGF0aW9uIGZvciBzdGQ6OnZlY3Rvcjxib29sPgotICB1c2luZyBUVmlydHVhbFByb3RvY29sPFREZW5zZVByb3RvY29sLCBUQmluYXJ5UHJvdG9jb2w+OjpyZWFkQm9vbDsKLQotICB1aW50MzJfdCByZWFkQnl0ZShpbnQ4X3QmIGJ5dGUpOwotCi0gIHVpbnQzMl90IHJlYWRJMTYoaW50MTZfdCYgaTE2KTsKLQotICB1aW50MzJfdCByZWFkSTMyKGludDMyX3QmIGkzMik7Ci0KLSAgdWludDMyX3QgcmVhZEk2NChpbnQ2NF90JiBpNjQpOwotCi0gIHVpbnQzMl90IHJlYWREb3VibGUoZG91YmxlJiBkdWIpOwotCi0gIHVpbnQzMl90IHJlYWRTdHJpbmcoc3RkOjpzdHJpbmcmIHN0cik7Ci0KLSAgdWludDMyX3QgcmVhZEJpbmFyeShzdGQ6OnN0cmluZyYgc3RyKTsKLQotICAvKgotICAgKiBIZWxwZXIgcmVhZGluZyBmdW5jdGlvbnMgKGRvbid0IGRvIHN0YXRlIHRyYW5zaXRpb25zKS4KLSAgICovCi0gIGlubGluZSB1aW50MzJfdCBzdWJSZWFkSTMyKGludDMyX3QmIGkzMik7Ci0KLSAgaW5saW5lIHVpbnQzMl90IHN1YlJlYWRTdHJpbmcoc3RkOjpzdHJpbmcmIHN0cik7Ci0KLSAgdWludDMyX3Qgc3ViUmVhZEJvb2woYm9vbCYgdmFsdWUpIHsKLSAgICByZXR1cm4gVEJpbmFyeVByb3RvY29sOjpyZWFkQm9vbCh2YWx1ZSk7Ci0gIH0KLQotCi0gcHJpdmF0ZToKLQotICAvLyBJbXBsZW1lbnRhdGlvbiBmdW5jdGlvbnMsIGRvY3VtZW50ZWQgaW4gdGhlIC5jcHAuCi0gIGlubGluZSB2b2lkIGNoZWNrVFR5cGUoY29uc3QgVFR5cGUgdHR5cGUpOwotICBpbmxpbmUgdm9pZCBzdGF0ZVRyYW5zaXRpb24oKTsKLQotICAvLyBSZWFkIGFuZCB3cml0ZSB2YXJpYWJsZS1sZW5ndGggaW50ZWdlcnMuCi0gIC8vIFVzZXMgdGhlIHNhbWUgdGVjaG5pcXVlIGFzIHRoZSBNSURJIGZpbGUgZm9ybWF0LgotICBpbmxpbmUgdWludDMyX3QgdmxxUmVhZCh1aW50NjRfdCYgdmxxKTsKLSAgaW5saW5lIHVpbnQzMl90IHZscVdyaXRlKHVpbnQ2NF90IHZscSk7Ci0KLSAgLy8gQ2FsbGVkIGJlZm9yZSB0aHJvd2luZyBhbiBleGNlcHRpb24gdG8gbWFrZSB0aGUgb2JqZWN0IHJldXNhYmxlLgotICB2b2lkIHJlc2V0U3RhdGUoKSB7Ci0gICAgdHNfc3RhY2tfLmNsZWFyKCk7Ci0gICAgaWR4X3N0YWNrXy5jbGVhcigpOwotICAgIG1rdl9zdGFja18uY2xlYXIoKTsKLSAgfQotCi0gIC8vIFR5cGVTcGVjIG9mIHRoZSB0b3AtbGV2ZWwgc3RydWN0dXJlIHRvIHdyaXRlLAotICAvLyBmb3Igc3RhbmRhbG9uZSBwcm90b2NvbCBvYmplY3RzLgotICBUeXBlU3BlYyogdHlwZV9zcGVjXzsKLQotICBzdGQ6OnZlY3RvcjxUeXBlU3BlYyo+IHRzX3N0YWNrXzsgICAvLyBUeXBlU3BlYyBzdGFjay4KLSAgc3RkOjp2ZWN0b3I8aW50PiAgICAgICBpZHhfc3RhY2tfOyAgLy8gSW5EZVggc3RhY2suCi0gIHN0ZDo6dmVjdG9yPGJvb2w+ICAgICAgbWt2X3N0YWNrXzsgIC8vIE1hcCBLZXkvVmx1ZSBzdGFjay4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHJ1ZSA9IGtleSwgRmFsc2UgPSB2YWx1ZS4KLQotICAvLyBUcnVlIGlmZiB0aGlzIGlzIGEgc3RhbmRhbG9uZSBpbnN0YW5jZSAobm8gUlBDKS4KLSAgYm9vbCBzdGFuZGFsb25lXzsKLX07Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2wKLQotI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9QUk9UT0NPTF9UREVOU0VQUk9UT0NPTF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RIZWFkZXJQcm90b2NvbC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVEhlYWRlclByb3RvY29sLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjQyZTMwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RIZWFkZXJQcm90b2NvbC5jcHAKQEAgLTAsMCArMSwyNTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgVEhSSUZUX1BST1RPQ09MX1RIRUFERVJQUk9UT0NPTF9DUFBfCisjZGVmaW5lIFRIUklGVF9QUk9UT0NPTF9USEVBREVSUFJPVE9DT0xfQ1BQXyAxCisKKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEhlYWRlclByb3RvY29sLmg+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+IG91dFRyYW5zKSB7CisgICAgVEhlYWRlclByb3RvY29sKiBoZWFkZXJQcm90b2NvbCA9IG5ldyBUSGVhZGVyUHJvdG9jb2woaW5UcmFucywgb3V0VHJhbnMsIFRfQklOQVJZX1BST1RPQ09MKTsKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4oaGVhZGVyUHJvdG9jb2wpOworICB9Cit9OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2wKKworI2VuZGlmIC8vICNpZm5kZWYgVEhSSUZUX1BST1RPQ09MX1RIRUFERVJQUk9UT0NPTF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2wuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2wuY3BwCmluZGV4IGEwY2M4ZTIuLjQ1NzZmYTEgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9USlNPTlByb3RvY29sLmNwcAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5jcHAKQEAgLTE5LDE1ICsxOSwyNSBAQAogCiAjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2wuaD4KIAotI2luY2x1ZGUgPG1hdGguaD4KLSNpbmNsdWRlIDxib29zdC9sZXhpY2FsX2Nhc3QuaHBwPgorI2luY2x1ZGUgPGJvb3N0L2xvY2FsZS5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvbWF0aC9zcGVjaWFsX2Z1bmN0aW9ucy9mcGNsYXNzaWZ5LmhwcD4KKyNpbmNsdWRlIDxib29zdC9tYXRoL3NwZWNpYWxfZnVuY3Rpb25zL3NpZ24uaHBwPgorCisjaW5jbHVkZSA8Y21hdGg+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPGxvY2FsZT4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKwogI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQmFzZTY0VXRpbHMuaD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uaD4KKyNpbmNsdWRlIDx0aHJpZnQvVFRvU3RyaW5nLmg+CiAKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OwogCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBwcm90b2NvbCB7Ci0KK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgcHJvdG9jb2wgewogCiAvLyBTdGF0aWMgZGF0YQogCkBAIC0zNSwxMiArNDUsMTAgQEAKIHN0YXRpYyBjb25zdCB1aW50OF90IGtKU09OT2JqZWN0RW5kID0gJ30nOwogc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0pTT05BcnJheVN0YXJ0ID0gJ1snOwogc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0pTT05BcnJheUVuZCA9ICddJzsKLXN0YXRpYyBjb25zdCB1aW50OF90IGtKU09OTmV3bGluZSA9ICdcbic7CiBzdGF0aWMgY29uc3QgdWludDhfdCBrSlNPTlBhaXJTZXBhcmF0b3IgPSAnOic7CiBzdGF0aWMgY29uc3QgdWludDhfdCBrSlNPTkVsZW1TZXBhcmF0b3IgPSAnLCc7CiBzdGF0aWMgY29uc3QgdWludDhfdCBrSlNPTkJhY2tzbGFzaCA9ICdcXCc7CiBzdGF0aWMgY29uc3QgdWludDhfdCBrSlNPTlN0cmluZ0RlbGltaXRlciA9ICciJzsKLXN0YXRpYyBjb25zdCB1aW50OF90IGtKU09OWmVyb0NoYXIgPSAnMCc7CiBzdGF0aWMgY29uc3QgdWludDhfdCBrSlNPTkVzY2FwZUNoYXIgPSAndSc7CiAKIHN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrSlNPTkVzY2FwZVByZWZpeCgiXFx1MDAiKTsKQEAgLTYzLDcgKzcxLDcgQEAKIHN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrVHlwZU5hbWVMaXN0KCJsc3QiKTsKIHN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrVHlwZU5hbWVTZXQoInNldCIpOwogCi1zdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgJmdldFR5cGVOYW1lRm9yVHlwZUlEKFRUeXBlIHR5cGVJRCkgeworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRUeXBlTmFtZUZvclR5cGVJRChUVHlwZSB0eXBlSUQpIHsKICAgc3dpdGNoICh0eXBlSUQpIHsKICAgY2FzZSBUX0JPT0w6CiAgICAgcmV0dXJuIGtUeXBlTmFtZUJvb2w7CkBAIC04OCwxMiArOTYsMTEgQEAKICAgY2FzZSBUX0xJU1Q6CiAgICAgcmV0dXJuIGtUeXBlTmFtZUxpc3Q7CiAgIGRlZmF1bHQ6Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5yZWNvZ25pemVkIHR5cGUiKTsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsICJVbnJlY29nbml6ZWQgdHlwZSIpOwogICB9CiB9CiAKLXN0YXRpYyBUVHlwZSBnZXRUeXBlSURGb3JUeXBlTmFtZShjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkgeworc3RhdGljIFRUeXBlIGdldFR5cGVJREZvclR5cGVOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSB7CiAgIFRUeXBlIHJlc3VsdCA9IFRfU1RPUDsgLy8gU2VudGluZWwgdmFsdWUKICAgaWYgKG5hbWUubGVuZ3RoKCkgPiAxKSB7CiAgICAgc3dpdGNoIChuYW1lWzBdKSB7CkBAIC0xMjgsOCArMTM1LDcgQEAKICAgICBjYXNlICdzJzoKICAgICAgIGlmIChuYW1lWzFdID09ICd0JykgewogICAgICAgICByZXN1bHQgPSBUX1NUUklORzsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKG5hbWVbMV0gPT0gJ2UnKSB7CisgICAgICB9IGVsc2UgaWYgKG5hbWVbMV0gPT0gJ2UnKSB7CiAgICAgICAgIHJlc3VsdCA9IFRfU0VUOwogICAgICAgfQogICAgICAgYnJlYWs7CkBAIC0xMzksMjUgKzE0NSw2NyBAQAogICAgIH0KICAgfQogICBpZiAocmVzdWx0ID09IFRfU1RPUCkgewotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVucmVjb2duaXplZCB0eXBlIik7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELCAiVW5yZWNvZ25pemVkIHR5cGUiKTsKICAgfQogICByZXR1cm4gcmVzdWx0OwogfQogCi0KIC8vIFRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBoYW5kbGluZyBmb3IgdGhlIGZpcnN0IDB4MzAgY2hhcmFjdGVycwogLy8gIDAgOiBlc2NhcGUgdXNpbmcgIlx1MDB4eCIgbm90YXRpb24KIC8vICAxIDoganVzdCBvdXRwdXQgaW5kZXgKIC8vIDxvdGhlcj4gOiBlc2NhcGUgdXNpbmcgIlw8b3RoZXI+IiBub3RhdGlvbgogc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0pTT05DaGFyVGFibGVbMHgzMF0gPSB7Ci0vLyAgMCAgIDEgICAyICAgMyAgIDQgICA1ICAgNiAgIDcgICA4ICAgOSAgIEEgICBCICAgQyAgIEQgICBFICAgRgotICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCdiJywndCcsJ24nLCAgMCwnZicsJ3InLCAgMCwgIDAsIC8vIDAKLSAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAvLyAxCi0gICAgMSwgIDEsJyInLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgLy8gMgorICAgIC8vICAwICAgMSAgIDIgICAzICAgNCAgIDUgICA2ICAgNyAgIDggICA5ICAgQSAgIEIgICBDICAgRCAgIEUgICBGCisgICAgMCwKKyAgICAwLAorICAgIDAsCisgICAgMCwKKyAgICAwLAorICAgIDAsCisgICAgMCwKKyAgICAwLAorICAgICdiJywKKyAgICAndCcsCisgICAgJ24nLAorICAgIDAsCisgICAgJ2YnLAorICAgICdyJywKKyAgICAwLAorICAgIDAsIC8vIDAKKyAgICAwLAorICAgIDAsCisgICAgMCwKKyAgICAwLAorICAgIDAsCisgICAgMCwKKyAgICAwLAorICAgIDAsCisgICAgMCwKKyAgICAwLAorICAgIDAsCisgICAgMCwKKyAgICAwLAorICAgIDAsCisgICAgMCwKKyAgICAwLCAvLyAxCisgICAgMSwKKyAgICAxLAorICAgICciJywKKyAgICAxLAorICAgIDEsCisgICAgMSwKKyAgICAxLAorICAgIDEsCisgICAgMSwKKyAgICAxLAorICAgIDEsCisgICAgMSwKKyAgICAxLAorICAgIDEsCisgICAgMSwKKyAgICAxLCAvLyAyCiB9OwogCi0KIC8vIFRoaXMgc3RyaW5nJ3MgY2hhcmFjdGVycyBtdXN0IG1hdGNoIHVwIHdpdGggdGhlIGVsZW1lbnRzIGluIGtFc2NhcGVDaGFyVmFscy4KIC8vIEkgZG9uJ3QgaGF2ZSAnLycgb24gdGhpcyBsaXN0IGV2ZW4gdGhvdWdoIGl0IGFwcGVhcnMgb24gd3d3Lmpzb24ub3JnIC0tCiAvLyBpdCBpcyBub3QgaW4gdGhlIFJGQwpAQCAtMTY2LDIzICsyMTQsMjYgQEAKIC8vIFRoZSBlbGVtZW50cyBvZiB0aGlzIGFycmF5IG11c3QgbWF0Y2ggdXAgd2l0aCB0aGUgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyBpbgogLy8ga0VzY2FwZUNoYXJzCiBjb25zdCBzdGF0aWMgdWludDhfdCBrRXNjYXBlQ2hhclZhbHNbN10gPSB7Ci0gICciJywgJ1xcJywgJ1xiJywgJ1xmJywgJ1xuJywgJ1xyJywgJ1x0JywKKyAgICAnIicsCisgICAgJ1xcJywKKyAgICAnXGInLAorICAgICdcZicsCisgICAgJ1xuJywKKyAgICAnXHInLAorICAgICdcdCcsCiB9OwogCi0KIC8vIFN0YXRpYyBoZWxwZXIgZnVuY3Rpb25zCiAKIC8vIFJlYWQgMSBjaGFyYWN0ZXIgZnJvbSB0aGUgdHJhbnNwb3J0IHRyYW5zIGFuZCB2ZXJpZnkgdGhhdCBpdCBpcyB0aGUKIC8vIGV4cGVjdGVkIGNoYXJhY3RlciBjaC4KIC8vIFRocm93IGEgcHJvdG9jb2wgZXhjZXB0aW9uIGlmIGl0IGlzIG5vdC4KLXN0YXRpYyB1aW50MzJfdCByZWFkU3ludGF4Q2hhcihUSlNPTlByb3RvY29sOjpMb29rYWhlYWRSZWFkZXIgJnJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNoKSB7CitzdGF0aWMgdWludDMyX3QgcmVhZFN5bnRheENoYXIoVEpTT05Qcm90b2NvbDo6TG9va2FoZWFkUmVhZGVyJiByZWFkZXIsIHVpbnQ4X3QgY2gpIHsKICAgdWludDhfdCBjaDIgPSByZWFkZXIucmVhZCgpOwogICBpZiAoY2gyICE9IGNoKSB7CiAgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgXCciICsgc3RkOjpzdHJpbmcoKGNoYXIgKikmY2gsIDEpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwnOyBnb3QgXCciICsgc3RkOjpzdHJpbmcoKGNoYXIgKikmY2gyLCAxKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcJy4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIFwnIiArIHN0ZDo6c3RyaW5nKChjaGFyKikmY2gsIDEpICsgIlwnOyBnb3QgXCciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc3RkOjpzdHJpbmcoKGNoYXIqKSZjaDIsIDEpICsgIlwnLiIpOwogICB9CiAgIHJldHVybiAxOwogfQpAQCAtMTkyLDE0ICsyNDMsMTIgQEAKIHN0YXRpYyB1aW50OF90IGhleFZhbCh1aW50OF90IGNoKSB7CiAgIGlmICgoY2ggPj0gJzAnKSAmJiAoY2ggPD0gJzknKSkgewogICAgIHJldHVybiBjaCAtICcwJzsKLSAgfQotICBlbHNlIGlmICgoY2ggPj0gJ2EnKSAmJiAoY2ggPD0gJ2YnKSkgeworICB9IGVsc2UgaWYgKChjaCA+PSAnYScpICYmIChjaCA8PSAnZicpKSB7CiAgICAgcmV0dXJuIGNoIC0gJ2EnICsgMTA7Ci0gIH0KLSAgZWxzZSB7CisgIH0gZWxzZSB7CiAgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgaGV4IHZhbCAoWzAtOWEtZl0pOyBnb3QgXCciCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzdGQ6OnN0cmluZygoY2hhciAqKSZjaCwgMSkgKyAiXCcuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBoZXggdmFsIChbMC05YS1mXSk7IGdvdCBcJyIgKyBzdGQ6OnN0cmluZygoY2hhciopJmNoLCAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJcJy4iKTsKICAgfQogfQogCkBAIC0yMDksOCArMjU4LDcgQEAKICAgdmFsICY9IDB4MEY7CiAgIGlmICh2YWwgPCAxMCkgewogICAgIHJldHVybiB2YWwgKyAnMCc7Ci0gIH0KLSAgZWxzZSB7CisgIH0gZWxzZSB7CiAgICAgcmV0dXJuIHZhbCAtIDEwICsgJ2EnOwogICB9CiB9CkBAIC0yMzgsNiArMjg2LDE1IEBACiAgIHJldHVybiBmYWxzZTsKIH0KIAorLy8gUmV0dXJuIHRydWUgaWYgdGhlIGNvZGUgdW5pdCBpcyBoaWdoIHN1cnJvZ2F0ZQorc3RhdGljIGJvb2wgaXNIaWdoU3Vycm9nYXRlKHVpbnQxNl90IHZhbCkgeworICByZXR1cm4gdmFsID49IDB4RDgwMCAmJiB2YWwgPD0gMHhEQkZGOworfQorCisvLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgY29kZSB1bml0IGlzIGxvdyBzdXJyb2dhdGUKK3N0YXRpYyBib29sIGlzTG93U3Vycm9nYXRlKHVpbnQxNl90IHZhbCkgeworICByZXR1cm4gdmFsID49IDB4REMwMCAmJiB2YWwgPD0gMHhERkZGOworfQogCiAvKioKICAqIENsYXNzIHRvIHNlcnZlIGFzIGJhc2UgSlNPTiBjb250ZXh0IGFuZCBhcyBiYXNlIGNsYXNzIGZvciBvdGhlciBjb250ZXh0CkBAIC0yNDUsMjUgKzMwMiwyNCBAQAogICovCiBjbGFzcyBUSlNPTkNvbnRleHQgewogCi0gcHVibGljOgorcHVibGljOgorICBUSlNPTkNvbnRleHQoKXt9OwogCi0gIFRKU09OQ29udGV4dCgpIHt9OwotCi0gIHZpcnR1YWwgflRKU09OQ29udGV4dCgpIHt9OworICB2aXJ0dWFsIH5USlNPTkNvbnRleHQoKXt9OwogCiAgIC8qKgogICAgKiBXcml0ZSBjb250ZXh0IGRhdGEgdG8gdGhlIHRyYW5zcG9ydC4gRGVmYXVsdCBpcyB0byBkbyBub3RoaW5nLgogICAgKi8KLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZShUVHJhbnNwb3J0ICZ0cmFucykgewotICAgICh2b2lkKSB0cmFuczsKKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZShUVHJhbnNwb3J0JiB0cmFucykgeworICAgICh2b2lkKXRyYW5zOwogICAgIHJldHVybiAwOwogICB9OwogCiAgIC8qKgogICAgKiBSZWFkIGNvbnRleHQgZGF0YSBmcm9tIHRoZSB0cmFuc3BvcnQuIERlZmF1bHQgaXMgdG8gZG8gbm90aGluZy4KICAgICovCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZChUSlNPTlByb3RvY29sOjpMb29rYWhlYWRSZWFkZXIgJnJlYWRlcikgewotICAgICh2b2lkKSByZWFkZXI7CisgIHZpcnR1YWwgdWludDMyX3QgcmVhZChUSlNPTlByb3RvY29sOjpMb29rYWhlYWRSZWFkZXImIHJlYWRlcikgeworICAgICh2b2lkKXJlYWRlcjsKICAgICByZXR1cm4gMDsKICAgfTsKIApAQCAtMjcxLDQxICszMjcsMzMgQEAKICAgICogUmV0dXJuIHRydWUgaWYgbnVtYmVycyBuZWVkIHRvIGJlIGVzY2FwZWQgYXMgc3RyaW5ncyBpbiB0aGlzIGNvbnRleHQuCiAgICAqIERlZmF1bHQgYmVoYXZpb3IgaXMgdG8gcmV0dXJuIGZhbHNlLgogICAgKi8KLSAgdmlydHVhbCBib29sIGVzY2FwZU51bSgpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KKyAgdmlydHVhbCBib29sIGVzY2FwZU51bSgpIHsgcmV0dXJuIGZhbHNlOyB9CiB9OwogCiAvLyBDb250ZXh0IGNsYXNzIGZvciBvYmplY3QgbWVtYmVyIGtleS12YWx1ZSBwYWlycwogY2xhc3MgSlNPTlBhaXJDb250ZXh0IDogcHVibGljIFRKU09OQ29udGV4dCB7CiAKIHB1YmxpYzoKKyAgSlNPTlBhaXJDb250ZXh0KCkgOiBmaXJzdF8odHJ1ZSksIGNvbG9uXyh0cnVlKSB7fQogCi0gIEpTT05QYWlyQ29udGV4dCgpIDoKLSAgICBmaXJzdF8odHJ1ZSksCi0gICAgY29sb25fKHRydWUpIHsKLSAgfQotCi0gIHVpbnQzMl90IHdyaXRlKFRUcmFuc3BvcnQgJnRyYW5zKSB7CisgIHVpbnQzMl90IHdyaXRlKFRUcmFuc3BvcnQmIHRyYW5zKSB7CiAgICAgaWYgKGZpcnN0XykgewogICAgICAgZmlyc3RfID0gZmFsc2U7CiAgICAgICBjb2xvbl8gPSB0cnVlOwogICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGVsc2UgeworICAgIH0gZWxzZSB7CiAgICAgICB0cmFucy53cml0ZShjb2xvbl8gPyAma0pTT05QYWlyU2VwYXJhdG9yIDogJmtKU09ORWxlbVNlcGFyYXRvciwgMSk7CiAgICAgICBjb2xvbl8gPSAhY29sb25fOwogICAgICAgcmV0dXJuIDE7CiAgICAgfQogICB9CiAKLSAgdWludDMyX3QgcmVhZChUSlNPTlByb3RvY29sOjpMb29rYWhlYWRSZWFkZXIgJnJlYWRlcikgeworICB1aW50MzJfdCByZWFkKFRKU09OUHJvdG9jb2w6Okxvb2thaGVhZFJlYWRlciYgcmVhZGVyKSB7CiAgICAgaWYgKGZpcnN0XykgewogICAgICAgZmlyc3RfID0gZmFsc2U7CiAgICAgICBjb2xvbl8gPSB0cnVlOwogICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGVsc2UgeworICAgIH0gZWxzZSB7CiAgICAgICB1aW50OF90IGNoID0gKGNvbG9uXyA/IGtKU09OUGFpclNlcGFyYXRvciA6IGtKU09ORWxlbVNlcGFyYXRvcik7CiAgICAgICBjb2xvbl8gPSAhY29sb25fOwogICAgICAgcmV0dXJuIHJlYWRTeW50YXhDaGFyKHJlYWRlciwgY2gpOwpAQCAtMzEzLDYxICszNjEsNTMgQEAKICAgfQogCiAgIC8vIE51bWJlcnMgbXVzdCBiZSB0dXJuZWQgaW50byBzdHJpbmdzIGlmIHRoZXkgYXJlIHRoZSBrZXkgcGFydCBvZiBhIHBhaXIKLSAgdmlydHVhbCBib29sIGVzY2FwZU51bSgpIHsKLSAgICByZXR1cm4gY29sb25fOwotICB9CisgIHZpcnR1YWwgYm9vbCBlc2NhcGVOdW0oKSB7IHJldHVybiBjb2xvbl87IH0KIAotICBwcml2YXRlOgotCi0gICAgYm9vbCBmaXJzdF87Ci0gICAgYm9vbCBjb2xvbl87Citwcml2YXRlOgorICBib29sIGZpcnN0XzsKKyAgYm9vbCBjb2xvbl87CiB9OwogCiAvLyBDb250ZXh0IGNsYXNzIGZvciBsaXN0cwogY2xhc3MgSlNPTkxpc3RDb250ZXh0IDogcHVibGljIFRKU09OQ29udGV4dCB7CiAKIHB1YmxpYzoKKyAgSlNPTkxpc3RDb250ZXh0KCkgOiBmaXJzdF8odHJ1ZSkge30KIAotICBKU09OTGlzdENvbnRleHQoKSA6Ci0gICAgZmlyc3RfKHRydWUpIHsKLSAgfQotCi0gIHVpbnQzMl90IHdyaXRlKFRUcmFuc3BvcnQgJnRyYW5zKSB7CisgIHVpbnQzMl90IHdyaXRlKFRUcmFuc3BvcnQmIHRyYW5zKSB7CiAgICAgaWYgKGZpcnN0XykgewogICAgICAgZmlyc3RfID0gZmFsc2U7CiAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgZWxzZSB7CisgICAgfSBlbHNlIHsKICAgICAgIHRyYW5zLndyaXRlKCZrSlNPTkVsZW1TZXBhcmF0b3IsIDEpOwogICAgICAgcmV0dXJuIDE7CiAgICAgfQogICB9CiAKLSAgdWludDMyX3QgcmVhZChUSlNPTlByb3RvY29sOjpMb29rYWhlYWRSZWFkZXIgJnJlYWRlcikgeworICB1aW50MzJfdCByZWFkKFRKU09OUHJvdG9jb2w6Okxvb2thaGVhZFJlYWRlciYgcmVhZGVyKSB7CiAgICAgaWYgKGZpcnN0XykgewogICAgICAgZmlyc3RfID0gZmFsc2U7CiAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgZWxzZSB7CisgICAgfSBlbHNlIHsKICAgICAgIHJldHVybiByZWFkU3ludGF4Q2hhcihyZWFkZXIsIGtKU09ORWxlbVNlcGFyYXRvcik7CiAgICAgfQogICB9CiAKLSAgcHJpdmF0ZToKLSAgICBib29sIGZpcnN0XzsKK3ByaXZhdGU6CisgIGJvb2wgZmlyc3RfOwogfTsKIAotCi1USlNPTlByb3RvY29sOjpUSlNPTlByb3RvY29sKGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHB0cmFucykgOgotICBUVmlydHVhbFByb3RvY29sPFRKU09OUHJvdG9jb2w+KHB0cmFucyksCi0gIHRyYW5zXyhwdHJhbnMuZ2V0KCkpLAotICBjb250ZXh0XyhuZXcgVEpTT05Db250ZXh0KCkpLAotICByZWFkZXJfKCpwdHJhbnMpIHsKK1RKU09OUHJvdG9jb2w6OlRKU09OUHJvdG9jb2woc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHB0cmFucykKKyAgOiBUVmlydHVhbFByb3RvY29sPFRKU09OUHJvdG9jb2w+KHB0cmFucyksCisgICAgdHJhbnNfKHB0cmFucy5nZXQoKSksCisgICAgY29udGV4dF8obmV3IFRKU09OQ29udGV4dCgpKSwKKyAgICByZWFkZXJfKCpwdHJhbnMpIHsKIH0KIAotVEpTT05Qcm90b2NvbDo6flRKU09OUHJvdG9jb2woKSB7fQorVEpTT05Qcm90b2NvbDo6flRKU09OUHJvdG9jb2woKSB7Cit9CiAKLXZvaWQgVEpTT05Qcm90b2NvbDo6cHVzaENvbnRleHQoYm9vc3Q6OnNoYXJlZF9wdHI8VEpTT05Db250ZXh0PiBjKSB7Cit2b2lkIFRKU09OUHJvdG9jb2w6OnB1c2hDb250ZXh0KHN0ZDo6c2hhcmVkX3B0cjxUSlNPTkNvbnRleHQ+IGMpIHsKICAgY29udGV4dHNfLnB1c2goY29udGV4dF8pOwogICBjb250ZXh0XyA9IGM7CiB9CkBAIC0zNzksNyArNDE5LDcgQEAKIAogLy8gV3JpdGUgdGhlIGNoYXJhY3RlciBjaCBhcyBhIEpTT04gZXNjYXBlIHNlcXVlbmNlICgiXHUwMHh4IikKIHVpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlSlNPTkVzY2FwZUNoYXIodWludDhfdCBjaCkgewotICB0cmFuc18tPndyaXRlKChjb25zdCB1aW50OF90ICopa0pTT05Fc2NhcGVQcmVmaXguY19zdHIoKSwKKyAgdHJhbnNfLT53cml0ZSgoY29uc3QgdWludDhfdCopa0pTT05Fc2NhcGVQcmVmaXguY19zdHIoKSwKICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4oa0pTT05Fc2NhcGVQcmVmaXgubGVuZ3RoKCkpKTsKICAgdWludDhfdCBvdXRDaCA9IGhleENoYXIoY2ggPj4gNCk7CiAgIHRyYW5zXy0+d3JpdGUoJm91dENoLCAxKTsKQEAgLTM5NSwyNSArNDM1LDIxIEBACiAgICAgICB0cmFuc18tPndyaXRlKCZrSlNPTkJhY2tzbGFzaCwgMSk7CiAgICAgICB0cmFuc18tPndyaXRlKCZrSlNPTkJhY2tzbGFzaCwgMSk7CiAgICAgICByZXR1cm4gMjsKLSAgICB9Ci0gICAgZWxzZSB7CisgICAgfSBlbHNlIHsKICAgICAgIHRyYW5zXy0+d3JpdGUoJmNoLCAxKTsKICAgICAgIHJldHVybiAxOwogICAgIH0KLSAgfQotICBlbHNlIHsKKyAgfSBlbHNlIHsKICAgICB1aW50OF90IG91dENoID0ga0pTT05DaGFyVGFibGVbY2hdOwogICAgIC8vIENoZWNrIGlmIHJlZ3VsYXIgY2hhcmFjdGVyLCBiYWNrc2xhc2ggZXNjYXBlZCwgb3IgSlNPTiBlc2NhcGVkCiAgICAgaWYgKG91dENoID09IDEpIHsKICAgICAgIHRyYW5zXy0+d3JpdGUoJmNoLCAxKTsKICAgICAgIHJldHVybiAxOwotICAgIH0KLSAgICBlbHNlIGlmIChvdXRDaCA+IDEpIHsKKyAgICB9IGVsc2UgaWYgKG91dENoID4gMSkgewogICAgICAgdHJhbnNfLT53cml0ZSgma0pTT05CYWNrc2xhc2gsIDEpOwogICAgICAgdHJhbnNfLT53cml0ZSgmb3V0Q2gsIDEpOwogICAgICAgcmV0dXJuIDI7Ci0gICAgfQotICAgIGVsc2UgeworICAgIH0gZWxzZSB7CiAgICAgICByZXR1cm4gd3JpdGVKU09ORXNjYXBlQ2hhcihjaCk7CiAgICAgfQogICB9CkBAIC00MjEsNyArNDU3LDcgQEAKIAogLy8gV3JpdGUgb3V0IHRoZSBjb250ZW50cyBvZiB0aGUgc3RyaW5nIHN0ciBhcyBhIEpTT04gc3RyaW5nLCBlc2NhcGluZwogLy8gY2hhcmFjdGVycyBhcyBhcHByb3ByaWF0ZS4KLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlSlNPTlN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyAmc3RyKSB7Cit1aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZUpTT05TdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgewogICB1aW50MzJfdCByZXN1bHQgPSBjb250ZXh0Xy0+d3JpdGUoKnRyYW5zXyk7CiAgIHJlc3VsdCArPSAyOyAvLyBGb3IgcXVvdGVzCiAgIHRyYW5zXy0+d3JpdGUoJmtKU09OU3RyaW5nRGVsaW1pdGVyLCAxKTsKQEAgLTQzNiwxMyArNDcyLDEzIEBACiAKIC8vIFdyaXRlIG91dCB0aGUgY29udGVudHMgb2YgdGhlIHN0cmluZyBhcyBKU09OIHN0cmluZywgYmFzZTY0LWVuY29kaW5nCiAvLyB0aGUgc3RyaW5nJ3MgY29udGVudHMsIGFuZCBlc2NhcGluZyBhcyBhcHByb3ByaWF0ZQotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVKU09OQmFzZTY0KGNvbnN0IHN0ZDo6c3RyaW5nICZzdHIpIHsKK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlSlNPTkJhc2U2NChjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7CiAgIHVpbnQzMl90IHJlc3VsdCA9IGNvbnRleHRfLT53cml0ZSgqdHJhbnNfKTsKICAgcmVzdWx0ICs9IDI7IC8vIEZvciBxdW90ZXMKICAgdHJhbnNfLT53cml0ZSgma0pTT05TdHJpbmdEZWxpbWl0ZXIsIDEpOwogICB1aW50OF90IGJbNF07Ci0gIGNvbnN0IHVpbnQ4X3QgKmJ5dGVzID0gKGNvbnN0IHVpbnQ4X3QgKilzdHIuY19zdHIoKTsKLSAgaWYoc3RyLmxlbmd0aCgpID4gKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgpKCkpCisgIGNvbnN0IHVpbnQ4X3QqIGJ5dGVzID0gKGNvbnN0IHVpbnQ4X3QqKXN0ci5jX3N0cigpOworICBpZiAoc3RyLmxlbmd0aCgpID4gKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgpKCkpCiAgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6U0laRV9MSU1JVCk7CiAgIHVpbnQzMl90IGxlbiA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihzdHIubGVuZ3RoKCkpOwogICB3aGlsZSAobGVuID49IDMpIHsKQEAgLTQ1MSw3ICs0ODcsNyBAQAogICAgIHRyYW5zXy0+d3JpdGUoYiwgNCk7CiAgICAgcmVzdWx0ICs9IDQ7CiAgICAgYnl0ZXMgKz0gMzsKLSAgICBsZW4gLT0zOworICAgIGxlbiAtPSAzOwogICB9CiAgIGlmIChsZW4pIHsgLy8gSGFuZGxlIHJlbWFpbmRlcgogICAgIGJhc2U2NF9lbmNvZGUoYnl0ZXMsIGxlbiwgYik7CkBAIC00NjcsMTUgKzUwMywxNSBAQAogdGVtcGxhdGUgPHR5cGVuYW1lIE51bWJlclR5cGU+CiB1aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZUpTT05JbnRlZ2VyKE51bWJlclR5cGUgbnVtKSB7CiAgIHVpbnQzMl90IHJlc3VsdCA9IGNvbnRleHRfLT53cml0ZSgqdHJhbnNfKTsKLSAgc3RkOjpzdHJpbmcgdmFsKGJvb3N0OjpsZXhpY2FsX2Nhc3Q8c3RkOjpzdHJpbmc+KG51bSkpOworICBzdGQ6OnN0cmluZyB2YWwodG9fc3RyaW5nKG51bSkpOwogICBib29sIGVzY2FwZU51bSA9IGNvbnRleHRfLT5lc2NhcGVOdW0oKTsKICAgaWYgKGVzY2FwZU51bSkgewogICAgIHRyYW5zXy0+d3JpdGUoJmtKU09OU3RyaW5nRGVsaW1pdGVyLCAxKTsKICAgICByZXN1bHQgKz0gMTsKICAgfQotICBpZih2YWwubGVuZ3RoKCkgPiAoc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCkoKSkKKyAgaWYgKHZhbC5sZW5ndGgoKSA+IChzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KSgpKQogICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OlNJWkVfTElNSVQpOwotICB0cmFuc18tPndyaXRlKChjb25zdCB1aW50OF90ICopdmFsLmNfc3RyKCksIHN0YXRpY19jYXN0PHVpbnQzMl90Pih2YWwubGVuZ3RoKCkpKTsKKyAgdHJhbnNfLT53cml0ZSgoY29uc3QgdWludDhfdCopdmFsLmNfc3RyKCksIHN0YXRpY19jYXN0PHVpbnQzMl90Pih2YWwubGVuZ3RoKCkpKTsKICAgcmVzdWx0ICs9IHN0YXRpY19jYXN0PHVpbnQzMl90Pih2YWwubGVuZ3RoKCkpOwogICBpZiAoZXNjYXBlTnVtKSB7CiAgICAgdHJhbnNfLT53cml0ZSgma0pTT05TdHJpbmdEZWxpbWl0ZXIsIDEpOwpAQCAtNDg0LDMwICs1MjAsMzkgQEAKICAgcmV0dXJuIHJlc3VsdDsKIH0KIAorbmFtZXNwYWNlIHsKK3N0ZDo6c3RyaW5nIGRvdWJsZVRvU3RyaW5nKGRvdWJsZSBkKSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzdHI7CisgIHN0ci5pbWJ1ZShzdGQ6OmxvY2FsZTo6Y2xhc3NpYygpKTsKKyAgY29uc3Qgc3RkOjpzdHJlYW1zaXplIG1heF9kaWdpdHMxMCA9IDIgKyBzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmRpZ2l0czEwOworICBzdHIucHJlY2lzaW9uKG1heF9kaWdpdHMxMCk7CisgIHN0ciA8PCBkOworICByZXR1cm4gc3RyLnN0cigpOworfQorfQorCiAvLyBDb252ZXJ0IHRoZSBnaXZlbiBkb3VibGUgdG8gYSBKU09OIHN0cmluZywgd2hpY2ggaXMgZWl0aGVyIHRoZSBudW1iZXIsCiAvLyAiTmFOIiBvciAiSW5maW5pdHkiIG9yICItSW5maW5pdHkiLgogdWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVKU09ORG91YmxlKGRvdWJsZSBudW0pIHsKICAgdWludDMyX3QgcmVzdWx0ID0gY29udGV4dF8tPndyaXRlKCp0cmFuc18pOwotICBzdGQ6OnN0cmluZyB2YWwoYm9vc3Q6OmxleGljYWxfY2FzdDxzdGQ6OnN0cmluZz4obnVtKSk7CisgIHN0ZDo6c3RyaW5nIHZhbDsKIAotICAvLyBOb3JtYWxpemUgb3V0cHV0IG9mIGJvb3N0OjpsZXhpY2FsX2Nhc3QgZm9yIE5hTnMgYW5kIEluZmluaXRpZXMKICAgYm9vbCBzcGVjaWFsID0gZmFsc2U7Ci0gIHN3aXRjaCAodmFsWzBdKSB7Ci0gIGNhc2UgJ04nOgotICBjYXNlICduJzoKKyAgc3dpdGNoIChib29zdDo6bWF0aDo6ZnBjbGFzc2lmeShudW0pKSB7CisgIGNhc2UgRlBfSU5GSU5JVEU6CisgICAgaWYgKGJvb3N0OjptYXRoOjpzaWduYml0KG51bSkpIHsKKyAgICAgIHZhbCA9IGtUaHJpZnROZWdhdGl2ZUluZmluaXR5OworICAgIH0gZWxzZSB7CisgICAgICB2YWwgPSBrVGhyaWZ0SW5maW5pdHk7CisgICAgfQorICAgIHNwZWNpYWwgPSB0cnVlOworICAgIGJyZWFrOworICBjYXNlIEZQX05BTjoKICAgICB2YWwgPSBrVGhyaWZ0TmFuOwogICAgIHNwZWNpYWwgPSB0cnVlOwogICAgIGJyZWFrOwotICBjYXNlICdJJzoKLSAgY2FzZSAnaSc6Ci0gICAgdmFsID0ga1RocmlmdEluZmluaXR5OwotICAgIHNwZWNpYWwgPSB0cnVlOwotICAgIGJyZWFrOwotICBjYXNlICctJzoKLSAgICBpZiAoKHZhbFsxXSA9PSAnSScpIHx8ICh2YWxbMV0gPT0gJ2knKSkgewotICAgICAgdmFsID0ga1RocmlmdE5lZ2F0aXZlSW5maW5pdHk7Ci0gICAgICBzcGVjaWFsID0gdHJ1ZTsKLSAgICB9CisgIGRlZmF1bHQ6CisgICAgdmFsID0gZG91YmxlVG9TdHJpbmcobnVtKTsKICAgICBicmVhazsKICAgfQogCkBAIC01MTYsOSArNTYxLDkgQEAKICAgICB0cmFuc18tPndyaXRlKCZrSlNPTlN0cmluZ0RlbGltaXRlciwgMSk7CiAgICAgcmVzdWx0ICs9IDE7CiAgIH0KLSAgaWYodmFsLmxlbmd0aCgpID4gKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgpKCkpCisgIGlmICh2YWwubGVuZ3RoKCkgPiAoc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCkoKSkKICAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpTSVpFX0xJTUlUKTsKLSAgdHJhbnNfLT53cml0ZSgoY29uc3QgdWludDhfdCAqKXZhbC5jX3N0cigpLCBzdGF0aWNfY2FzdDx1aW50MzJfdD4odmFsLmxlbmd0aCgpKSk7CisgIHRyYW5zXy0+d3JpdGUoKGNvbnN0IHVpbnQ4X3QqKXZhbC5jX3N0cigpLCBzdGF0aWNfY2FzdDx1aW50MzJfdD4odmFsLmxlbmd0aCgpKSk7CiAgIHJlc3VsdCArPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4odmFsLmxlbmd0aCgpKTsKICAgaWYgKGVzY2FwZU51bSkgewogICAgIHRyYW5zXy0+d3JpdGUoJmtKU09OU3RyaW5nRGVsaW1pdGVyLCAxKTsKQEAgLTUzMCw3ICs1NzUsNyBAQAogdWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVKU09OT2JqZWN0U3RhcnQoKSB7CiAgIHVpbnQzMl90IHJlc3VsdCA9IGNvbnRleHRfLT53cml0ZSgqdHJhbnNfKTsKICAgdHJhbnNfLT53cml0ZSgma0pTT05PYmplY3RTdGFydCwgMSk7Ci0gIHB1c2hDb250ZXh0KGJvb3N0OjpzaGFyZWRfcHRyPFRKU09OQ29udGV4dD4obmV3IEpTT05QYWlyQ29udGV4dCgpKSk7CisgIHB1c2hDb250ZXh0KHN0ZDo6c2hhcmVkX3B0cjxUSlNPTkNvbnRleHQ+KG5ldyBKU09OUGFpckNvbnRleHQoKSkpOwogICByZXR1cm4gcmVzdWx0ICsgMTsKIH0KIApAQCAtNTQzLDcgKzU4OCw3IEBACiB1aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZUpTT05BcnJheVN0YXJ0KCkgewogICB1aW50MzJfdCByZXN1bHQgPSBjb250ZXh0Xy0+d3JpdGUoKnRyYW5zXyk7CiAgIHRyYW5zXy0+d3JpdGUoJmtKU09OQXJyYXlTdGFydCwgMSk7Ci0gIHB1c2hDb250ZXh0KGJvb3N0OjpzaGFyZWRfcHRyPFRKU09OQ29udGV4dD4obmV3IEpTT05MaXN0Q29udGV4dCgpKSk7CisgIHB1c2hDb250ZXh0KHN0ZDo6c2hhcmVkX3B0cjxUSlNPTkNvbnRleHQ+KG5ldyBKU09OTGlzdENvbnRleHQoKSkpOwogICByZXR1cm4gcmVzdWx0ICsgMTsKIH0KIApAQCAtNTY5LDcgKzYxNCw3IEBACiB9CiAKIHVpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlU3RydWN0QmVnaW4oY29uc3QgY2hhciogbmFtZSkgewotICAodm9pZCkgbmFtZTsKKyAgKHZvaWQpbmFtZTsKICAgcmV0dXJuIHdyaXRlSlNPTk9iamVjdFN0YXJ0KCk7CiB9CiAKQEAgLTU4MCw3ICs2MjUsNyBAQAogdWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVGaWVsZEJlZ2luKGNvbnN0IGNoYXIqIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFR5cGUgZmllbGRUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgZmllbGRJZCkgewotICAodm9pZCkgbmFtZTsKKyAgKHZvaWQpbmFtZTsKICAgdWludDMyX3QgcmVzdWx0ID0gd3JpdGVKU09OSW50ZWdlcihmaWVsZElkKTsKICAgcmVzdWx0ICs9IHdyaXRlSlNPTk9iamVjdFN0YXJ0KCk7CiAgIHJlc3VsdCArPSB3cml0ZUpTT05TdHJpbmcoZ2V0VHlwZU5hbWVGb3JUeXBlSUQoZmllbGRUeXBlKSk7CkBAIC02MDcsMTEgKzY1MiwxMiBAQAogfQogCiB1aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZU1hcEVuZCgpIHsKLSAgcmV0dXJuIHdyaXRlSlNPTk9iamVjdEVuZCgpICsgd3JpdGVKU09OQXJyYXlFbmQoKTsKKyAgdWludDMyX3QgcmVzdWx0ID0gd3JpdGVKU09OT2JqZWN0RW5kKCk7CisgIHJlc3VsdCArPSB3cml0ZUpTT05BcnJheUVuZCgpOworICByZXR1cm4gcmVzdWx0OwogfQogCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZUxpc3RCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlTGlzdEJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLCBjb25zdCB1aW50MzJfdCBzaXplKSB7CiAgIHVpbnQzMl90IHJlc3VsdCA9IHdyaXRlSlNPTkFycmF5U3RhcnQoKTsKICAgcmVzdWx0ICs9IHdyaXRlSlNPTlN0cmluZyhnZXRUeXBlTmFtZUZvclR5cGVJRChlbGVtVHlwZSkpOwogICByZXN1bHQgKz0gd3JpdGVKU09OSW50ZWdlcigoaW50NjRfdClzaXplKTsKQEAgLTYyMiw4ICs2NjgsNyBAQAogICByZXR1cm4gd3JpdGVKU09OQXJyYXlFbmQoKTsKIH0KIAotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVTZXRCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSkgewordWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVTZXRCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSkgewogICB1aW50MzJfdCByZXN1bHQgPSB3cml0ZUpTT05BcnJheVN0YXJ0KCk7CiAgIHJlc3VsdCArPSB3cml0ZUpTT05TdHJpbmcoZ2V0VHlwZU5hbWVGb3JUeXBlSUQoZWxlbVR5cGUpKTsKICAgcmVzdWx0ICs9IHdyaXRlSlNPTkludGVnZXIoKGludDY0X3Qpc2l6ZSk7CkBAIC02MzksNyArNjg0LDcgQEAKIH0KIAogdWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVCeXRlKGNvbnN0IGludDhfdCBieXRlKSB7Ci0gIC8vIHdyaXRlQnl0ZSgpIG11c3QgYmUgaGFuZGxlZCBzcGVjaWFsbHkgYmVjdWFzZSBib29zdDo6bGV4aWNhbCBjYXN0IHNlZXMKKyAgLy8gd3JpdGVCeXRlKCkgbXVzdCBiZSBoYW5kbGVkIHNwZWNpYWxseSBiZWNhdXNlIHRvX3N0cmluZyBzZWVzCiAgIC8vIGludDhfdCBhcyBhIHRleHQgdHlwZSBpbnN0ZWFkIG9mIGFuIGludGVnZXIgdHlwZQogICByZXR1cm4gd3JpdGVKU09OSW50ZWdlcigoaW50MTZfdClieXRlKTsKIH0KQEAgLTY2OCw5ICs3MTMsOSBAQAogICByZXR1cm4gd3JpdGVKU09OQmFzZTY0KHN0cik7CiB9CiAKLSAgLyoqCi0gICAqIFJlYWRpbmcgZnVuY3Rpb25zCi0gICAqLworLyoqCisgKiBSZWFkaW5nIGZ1bmN0aW9ucworICovCiAKIC8vIFJlYWRzIDEgYnl0ZSBhbmQgdmVyaWZpZXMgdGhhdCBpdCBtYXRjaGVzIGNoLgogdWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZEpTT05TeW50YXhDaGFyKHVpbnQ4X3QgY2gpIHsKQEAgLTY3OCwyMSArNzIzLDI1IEBACiB9CiAKIC8vIERlY29kZXMgdGhlIGZvdXIgaGV4IHBhcnRzIG9mIGEgSlNPTiBlc2NhcGVkIHN0cmluZyBjaGFyYWN0ZXIgYW5kIHJldHVybnMKLS8vIHRoZSBjaGFyYWN0ZXIgdmlhIG91dC4gVGhlIGZpcnN0IHR3byBjaGFyYWN0ZXJzIG11c3QgYmUgIjAwIi4KLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRKU09ORXNjYXBlQ2hhcih1aW50OF90ICpvdXQpIHsKLSAgdWludDhfdCBiWzJdOwotICByZWFkSlNPTlN5bnRheENoYXIoa0pTT05aZXJvQ2hhcik7Ci0gIHJlYWRKU09OU3ludGF4Q2hhcihrSlNPTlplcm9DaGFyKTsKKy8vIHRoZSBVVEYtMTYgY29kZSB1bml0IHZpYSBvdXQuCit1aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkSlNPTkVzY2FwZUNoYXIodWludDE2X3QqIG91dCkgeworICB1aW50OF90IGJbNF07CiAgIGJbMF0gPSByZWFkZXJfLnJlYWQoKTsKICAgYlsxXSA9IHJlYWRlcl8ucmVhZCgpOwotICAqb3V0ID0gKGhleFZhbChiWzBdKSA8PCA0KSArIGhleFZhbChiWzFdKTsKKyAgYlsyXSA9IHJlYWRlcl8ucmVhZCgpOworICBiWzNdID0gcmVhZGVyXy5yZWFkKCk7CisKKyAgKm91dCA9IChoZXhWYWwoYlswXSkgPDwgMTIpCisgICAgKyAoaGV4VmFsKGJbMV0pIDw8IDgpICsgKGhleFZhbChiWzJdKSA8PCA0KSArIGhleFZhbChiWzNdKTsKKwogICByZXR1cm4gNDsKIH0KIAogLy8gRGVjb2RlcyBhIEpTT04gc3RyaW5nLCBpbmNsdWRpbmcgdW5lc2NhcGluZywgYW5kIHJldHVybnMgdGhlIHN0cmluZyB2aWEgc3RyCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkSlNPTlN0cmluZyhzdGQ6OnN0cmluZyAmc3RyLCBib29sIHNraXBDb250ZXh0KSB7Cit1aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkSlNPTlN0cmluZyhzdGQ6OnN0cmluZyYgc3RyLCBib29sIHNraXBDb250ZXh0KSB7CiAgIHVpbnQzMl90IHJlc3VsdCA9IChza2lwQ29udGV4dCA/IDAgOiBjb250ZXh0Xy0+cmVhZChyZWFkZXJfKSk7CiAgIHJlc3VsdCArPSByZWFkSlNPTlN5bnRheENoYXIoa0pTT05TdHJpbmdEZWxpbWl0ZXIpOworICBzdGQ6OnZlY3Rvcjx1aW50MTZfdD4gY29kZXVuaXRzOwogICB1aW50OF90IGNoOwogICBzdHIuY2xlYXIoKTsKICAgd2hpbGUgKHRydWUpIHsKQEAgLTcwNSwzNSArNzU0LDY1IEBACiAgICAgICBjaCA9IHJlYWRlcl8ucmVhZCgpOwogICAgICAgKytyZXN1bHQ7CiAgICAgICBpZiAoY2ggPT0ga0pTT05Fc2NhcGVDaGFyKSB7Ci0gICAgICAgIHJlc3VsdCArPSByZWFkSlNPTkVzY2FwZUNoYXIoJmNoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgeworICAgICAgICB1aW50MTZfdCBjcDsKKyAgICAgICAgcmVzdWx0ICs9IHJlYWRKU09ORXNjYXBlQ2hhcigmY3ApOworICAgICAgICBpZiAoaXNIaWdoU3Vycm9nYXRlKGNwKSkgeworICAgICAgICAgIGNvZGV1bml0cy5wdXNoX2JhY2soY3ApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlmIChpc0xvd1N1cnJvZ2F0ZShjcCkKKyAgICAgICAgICAgICAgICYmIGNvZGV1bml0cy5lbXB0eSgpKSB7CisgICAgICAgICAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1pc3NpbmcgVVRGLTE2IGhpZ2ggc3Vycm9nYXRlIHBhaXIuIik7CisgICAgICAgICAgfQorICAgICAgICAgIGNvZGV1bml0cy5wdXNoX2JhY2soY3ApOworICAgICAgICAgIGNvZGV1bml0cy5wdXNoX2JhY2soMCk7CisgICAgICAgICAgc3RyICs9IGJvb3N0Ojpsb2NhbGU6OmNvbnY6OnV0Zl90b191dGY8Y2hhcj4oY29kZXVuaXRzLmRhdGEoKSk7CisgICAgICAgICAgY29kZXVuaXRzLmNsZWFyKCk7CisgICAgICAgIH0KKyAgICAgICAgY29udGludWU7CisgICAgICB9IGVsc2UgewogICAgICAgICBzaXplX3QgcG9zID0ga0VzY2FwZUNoYXJzLmZpbmQoY2gpOwotICAgICAgICBpZiAocG9zID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgIGlmIChwb3MgPT0ga0VzY2FwZUNoYXJzLm5wb3MpIHsKICAgICAgICAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBjb250cm9sIGNoYXIsIGdvdCAnIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKChjb25zdCBjaGFyICopJmNoLCAxKSAgKyAiJy4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGNvbnRyb2wgY2hhciwgZ290ICciICsgc3RkOjpzdHJpbmcoKGNvbnN0IGNoYXIqKSZjaCwgMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiJy4iKTsKICAgICAgICAgfQogICAgICAgICBjaCA9IGtFc2NhcGVDaGFyVmFsc1twb3NdOwogICAgICAgfQogICAgIH0KKyAgICBpZiAoIWNvZGV1bml0cy5lbXB0eSgpKSB7CisgICAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1pc3NpbmcgVVRGLTE2IGxvdyBzdXJyb2dhdGUgcGFpci4iKTsKKyAgICB9CiAgICAgc3RyICs9IGNoOwogICB9CisKKyAgaWYgKCFjb2RldW5pdHMuZW1wdHkoKSkgeworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1pc3NpbmcgVVRGLTE2IGxvdyBzdXJyb2dhdGUgcGFpci4iKTsKKyAgfQogICByZXR1cm4gcmVzdWx0OwogfQogCiAvLyBSZWFkcyBhIGJsb2NrIG9mIGJhc2U2NCBjaGFyYWN0ZXJzLCBkZWNvZGluZyBpdCwgYW5kIHJldHVybnMgdmlhIHN0cgotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZEpTT05CYXNlNjQoc3RkOjpzdHJpbmcgJnN0cikgewordWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZEpTT05CYXNlNjQoc3RkOjpzdHJpbmcmIHN0cikgewogICBzdGQ6OnN0cmluZyB0bXA7CiAgIHVpbnQzMl90IHJlc3VsdCA9IHJlYWRKU09OU3RyaW5nKHRtcCk7Ci0gIHVpbnQ4X3QgKmIgPSAodWludDhfdCAqKXRtcC5jX3N0cigpOwotICBpZih0bXAubGVuZ3RoKCkgPiAoc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCkoKSkKKyAgdWludDhfdCogYiA9ICh1aW50OF90Kil0bXAuY19zdHIoKTsKKyAgaWYgKHRtcC5sZW5ndGgoKSA+IChzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KSgpKQogICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OlNJWkVfTElNSVQpOwogICB1aW50MzJfdCBsZW4gPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4odG1wLmxlbmd0aCgpKTsKICAgc3RyLmNsZWFyKCk7CisgIC8vIElnbm9yZSBwYWRkaW5nCisgIGlmIChsZW4gPj0gMikgIHsKKyAgICB1aW50MzJfdCBib3VuZCA9IGxlbiAtIDI7CisgICAgZm9yICh1aW50MzJfdCBpID0gbGVuIC0gMTsgaSA+PSBib3VuZCAmJiBiW2ldID09ICc9JzsgLS1pKSB7CisgICAgICAtLWxlbjsKKyAgICB9CisgIH0KICAgd2hpbGUgKGxlbiA+PSA0KSB7CiAgICAgYmFzZTY0X2RlY29kZShiLCA0KTsKLSAgICBzdHIuYXBwZW5kKChjb25zdCBjaGFyICopYiwgMyk7CisgICAgc3RyLmFwcGVuZCgoY29uc3QgY2hhciopYiwgMyk7CiAgICAgYiArPSA0OwogICAgIGxlbiAtPSA0OwogICB9CkBAIC03NDEsMTQgKzgyMCwxNCBAQAogICAvLyBiYXNlNjQgYnV0IGxlZ2FsIGZvciBza2lwIG9mIHJlZ3VsYXIgc3RyaW5nIHR5cGUpCiAgIGlmIChsZW4gPiAxKSB7CiAgICAgYmFzZTY0X2RlY29kZShiLCBsZW4pOwotICAgIHN0ci5hcHBlbmQoKGNvbnN0IGNoYXIgKiliLCBsZW4gLSAxKTsKKyAgICBzdHIuYXBwZW5kKChjb25zdCBjaGFyKiliLCBsZW4gLSAxKTsKICAgfQogICByZXR1cm4gcmVzdWx0OwogfQogCiAvLyBSZWFkcyBhIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMsIHN0b3BwaW5nIGF0IHRoZSBmaXJzdCBvbmUgdGhhdCBpcyBub3QKIC8vIGEgdmFsaWQgSlNPTiBudW1lcmljIGNoYXJhY3Rlci4KLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRKU09OTnVtZXJpY0NoYXJzKHN0ZDo6c3RyaW5nICZzdHIpIHsKK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRKU09OTnVtZXJpY0NoYXJzKHN0ZDo6c3RyaW5nJiBzdHIpIHsKICAgdWludDMyX3QgcmVzdWx0ID0gMDsKICAgc3RyLmNsZWFyKCk7CiAgIHdoaWxlICh0cnVlKSB7CkBAIC03NjMsMTAgKzg0MiwyMyBAQAogICByZXR1cm4gcmVzdWx0OwogfQogCituYW1lc3BhY2UgewordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitUIGZyb21TdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHMpIHsKKyAgVCB0OworICBzdGQ6OmlzdHJpbmdzdHJlYW0gc3RyKHMpOworICBzdHIuaW1idWUoc3RkOjpsb2NhbGU6OmNsYXNzaWMoKSk7CisgIHN0ciA+PiB0OworICBpZiAoc3RyLmJhZCgpIHx8ICFzdHIuZW9mKCkpCisgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKHMpOworICByZXR1cm4gdDsKK30KK30KKwogLy8gUmVhZHMgYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIGFuZCBhc3NlbWJsZXMgdGhlbSBpbnRvIGEgbnVtYmVyLAogLy8gcmV0dXJuaW5nIHRoZW0gdmlhIG51bQogdGVtcGxhdGUgPHR5cGVuYW1lIE51bWJlclR5cGU+Ci11aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkSlNPTkludGVnZXIoTnVtYmVyVHlwZSAmbnVtKSB7Cit1aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkSlNPTkludGVnZXIoTnVtYmVyVHlwZSYgbnVtKSB7CiAgIHVpbnQzMl90IHJlc3VsdCA9IGNvbnRleHRfLT5yZWFkKHJlYWRlcl8pOwogICBpZiAoY29udGV4dF8tPmVzY2FwZU51bSgpKSB7CiAgICAgcmVzdWx0ICs9IHJlYWRKU09OU3ludGF4Q2hhcihrSlNPTlN0cmluZ0RlbGltaXRlcik7CkBAIC03NzQsMTIgKzg2NiwxMCBAQAogICBzdGQ6OnN0cmluZyBzdHI7CiAgIHJlc3VsdCArPSByZWFkSlNPTk51bWVyaWNDaGFycyhzdHIpOwogICB0cnkgewotICAgIG51bSA9IGJvb3N0OjpsZXhpY2FsX2Nhc3Q8TnVtYmVyVHlwZT4oc3RyKTsKLSAgfQotICBjYXRjaCAoYm9vc3Q6OmJhZF9sZXhpY2FsX2Nhc3QgZSkgewotICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgbnVtZXJpYyB2YWx1ZTsgZ290IFwiIiArIHN0ciArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiIik7CisgICAgbnVtID0gZnJvbVN0cmluZzxOdW1iZXJUeXBlPihzdHIpOworICB9IGNhdGNoIChjb25zdCBzdGQ6OnJ1bnRpbWVfZXJyb3ImKSB7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgbnVtZXJpYyB2YWx1ZTsgZ290IFwiIiArIHN0ciArICJcIiIpOwogICB9CiAgIGlmIChjb250ZXh0Xy0+ZXNjYXBlTnVtKCkpIHsKICAgICByZXN1bHQgKz0gcmVhZEpTT05TeW50YXhDaGFyKGtKU09OU3RyaW5nRGVsaW1pdGVyKTsKQEAgLTc4OCw1MCArODc4LDQyIEBACiB9CiAKIC8vIFJlYWRzIGEgSlNPTiBudW1iZXIgb3Igc3RyaW5nIGFuZCBpbnRlcnByZXRzIGl0IGFzIGEgZG91YmxlLgotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZEpTT05Eb3VibGUoZG91YmxlICZudW0pIHsKK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRKU09ORG91YmxlKGRvdWJsZSYgbnVtKSB7CiAgIHVpbnQzMl90IHJlc3VsdCA9IGNvbnRleHRfLT5yZWFkKHJlYWRlcl8pOwogICBzdGQ6OnN0cmluZyBzdHI7CiAgIGlmIChyZWFkZXJfLnBlZWsoKSA9PSBrSlNPTlN0cmluZ0RlbGltaXRlcikgewogICAgIHJlc3VsdCArPSByZWFkSlNPTlN0cmluZyhzdHIsIHRydWUpOwogICAgIC8vIENoZWNrIGZvciBOYU4sIEluZmluaXR5IGFuZCAtSW5maW5pdHkKICAgICBpZiAoc3RyID09IGtUaHJpZnROYW4pIHsKLSAgICAgIG51bSA9IEhVR0VfVkFML0hVR0VfVkFMOyAvLyBnZW5lcmF0ZXMgTmFOCi0gICAgfQotICAgIGVsc2UgaWYgKHN0ciA9PSBrVGhyaWZ0SW5maW5pdHkpIHsKKyAgICAgIG51bSA9IEhVR0VfVkFMIC8gSFVHRV9WQUw7IC8vIGdlbmVyYXRlcyBOYU4KKyAgICB9IGVsc2UgaWYgKHN0ciA9PSBrVGhyaWZ0SW5maW5pdHkpIHsKICAgICAgIG51bSA9IEhVR0VfVkFMOwotICAgIH0KLSAgICBlbHNlIGlmIChzdHIgPT0ga1RocmlmdE5lZ2F0aXZlSW5maW5pdHkpIHsKKyAgICB9IGVsc2UgaWYgKHN0ciA9PSBrVGhyaWZ0TmVnYXRpdmVJbmZpbml0eSkgewogICAgICAgbnVtID0gLUhVR0VfVkFMOwotICAgIH0KLSAgICBlbHNlIHsKKyAgICB9IGVsc2UgewogICAgICAgaWYgKCFjb250ZXh0Xy0+ZXNjYXBlTnVtKCkpIHsKICAgICAgICAgLy8gVGhyb3cgZXhjZXB0aW9uIC0tIHdlIHNob3VsZCBub3QgYmUgaW4gYSBzdHJpbmcgaW4gdGhpcyBjYXNlCi0gICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEsCisgICAgICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTnVtZXJpYyBkYXRhIHVuZXhwZWN0ZWRseSBxdW90ZWQiKTsKICAgICAgIH0KICAgICAgIHRyeSB7Ci0gICAgICAgIG51bSA9IGJvb3N0OjpsZXhpY2FsX2Nhc3Q8ZG91YmxlPihzdHIpOwotICAgICAgfQotICAgICAgY2F0Y2ggKGJvb3N0OjpiYWRfbGV4aWNhbF9jYXN0IGUpIHsKLSAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgbnVtZXJpYyB2YWx1ZTsgZ290IFwiIiArIHN0ciArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiIik7CisgICAgICAgIG51bSA9IGZyb21TdHJpbmc8ZG91YmxlPihzdHIpOworICAgICAgfSBjYXRjaCAoc3RkOjpydW50aW1lX2Vycm9yJiBlKSB7CisgICAgICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgbnVtZXJpYyB2YWx1ZTsgZ290IFwiIiArIHN0ciArICJcIiIpOwogICAgICAgfQogICAgIH0KLSAgfQotICBlbHNlIHsKKyAgfSBlbHNlIHsKICAgICBpZiAoY29udGV4dF8tPmVzY2FwZU51bSgpKSB7CiAgICAgICAvLyBUaGlzIHdpbGwgdGhyb3cgLSB3ZSBzaG91bGQgaGF2ZSBoYWQgYSBxdW90ZSBpZiBlc2NhcGVOdW0gPT0gdHJ1ZQogICAgICAgcmVhZEpTT05TeW50YXhDaGFyKGtKU09OU3RyaW5nRGVsaW1pdGVyKTsKICAgICB9CiAgICAgcmVzdWx0ICs9IHJlYWRKU09OTnVtZXJpY0NoYXJzKHN0cik7CiAgICAgdHJ5IHsKLSAgICAgIG51bSA9IGJvb3N0OjpsZXhpY2FsX2Nhc3Q8ZG91YmxlPihzdHIpOwotICAgIH0KLSAgICBjYXRjaCAoYm9vc3Q6OmJhZF9sZXhpY2FsX2Nhc3QgZSkgewotICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIG51bWVyaWMgdmFsdWU7IGdvdCBcIiIgKyBzdHIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIiKTsKKyAgICAgIG51bSA9IGZyb21TdHJpbmc8ZG91YmxlPihzdHIpOworICAgIH0gY2F0Y2ggKHN0ZDo6cnVudGltZV9lcnJvciYgZSkgeworICAgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgbnVtZXJpYyB2YWx1ZTsgZ290IFwiIiArIHN0ciArICJcIiIpOwogICAgIH0KICAgfQogICByZXR1cm4gcmVzdWx0OwpAQCAtODQwLDcgKzkyMiw3IEBACiB1aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkSlNPTk9iamVjdFN0YXJ0KCkgewogICB1aW50MzJfdCByZXN1bHQgPSBjb250ZXh0Xy0+cmVhZChyZWFkZXJfKTsKICAgcmVzdWx0ICs9IHJlYWRKU09OU3ludGF4Q2hhcihrSlNPTk9iamVjdFN0YXJ0KTsKLSAgcHVzaENvbnRleHQoYm9vc3Q6OnNoYXJlZF9wdHI8VEpTT05Db250ZXh0PihuZXcgSlNPTlBhaXJDb250ZXh0KCkpKTsKKyAgcHVzaENvbnRleHQoc3RkOjpzaGFyZWRfcHRyPFRKU09OQ29udGV4dD4obmV3IEpTT05QYWlyQ29udGV4dCgpKSk7CiAgIHJldHVybiByZXN1bHQ7CiB9CiAKQEAgLTg1Myw3ICs5MzUsNyBAQAogdWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZEpTT05BcnJheVN0YXJ0KCkgewogICB1aW50MzJfdCByZXN1bHQgPSBjb250ZXh0Xy0+cmVhZChyZWFkZXJfKTsKICAgcmVzdWx0ICs9IHJlYWRKU09OU3ludGF4Q2hhcihrSlNPTkFycmF5U3RhcnQpOwotICBwdXNoQ29udGV4dChib29zdDo6c2hhcmVkX3B0cjxUSlNPTkNvbnRleHQ+KG5ldyBKU09OTGlzdENvbnRleHQoKSkpOworICBwdXNoQ29udGV4dChzdGQ6OnNoYXJlZF9wdHI8VEpTT05Db250ZXh0PihuZXcgSlNPTkxpc3RDb250ZXh0KCkpKTsKICAgcmV0dXJuIHJlc3VsdDsKIH0KIApAQCAtODcwLDE0ICs5NTIsMTMgQEAKICAgdWludDY0X3QgdG1wVmFsID0gMDsKICAgcmVzdWx0ICs9IHJlYWRKU09OSW50ZWdlcih0bXBWYWwpOwogICBpZiAodG1wVmFsICE9IGtUaHJpZnRWZXJzaW9uMSkgewotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OkJBRF9WRVJTSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWVzc2FnZSBjb250YWluZWQgYmFkIHZlcnNpb24uIik7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6QkFEX1ZFUlNJT04sICJNZXNzYWdlIGNvbnRhaW5lZCBiYWQgdmVyc2lvbi4iKTsKICAgfQogICByZXN1bHQgKz0gcmVhZEpTT05TdHJpbmcobmFtZSk7CiAgIHJlc3VsdCArPSByZWFkSlNPTkludGVnZXIodG1wVmFsKTsKICAgbWVzc2FnZVR5cGUgPSAoVE1lc3NhZ2VUeXBlKXRtcFZhbDsKICAgcmVzdWx0ICs9IHJlYWRKU09OSW50ZWdlcih0bXBWYWwpOwotICBpZih0bXBWYWwgPiBzdGF0aWNfY2FzdDx1aW50NjRfdD4oKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1heCkoKSkpCisgIGlmICh0bXBWYWwgPiBzdGF0aWNfY2FzdDx1aW50NjRfdD4oKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1heCkoKSkpCiAgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6U0laRV9MSU1JVCk7CiAgIHNlcWlkID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4odG1wVmFsKTsKICAgcmV0dXJuIHJlc3VsdDsKQEAgLTg4OCw3ICs5NjksNyBAQAogfQogCiB1aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkU3RydWN0QmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUpIHsKLSAgKHZvaWQpIG5hbWU7CisgICh2b2lkKW5hbWU7CiAgIHJldHVybiByZWFkSlNPTk9iamVjdFN0YXJ0KCk7CiB9CiAKQEAgLTg5NiwyMSArOTc3LDE4IEBACiAgIHJldHVybiByZWFkSlNPTk9iamVjdEVuZCgpOwogfQogCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkRmllbGRCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUeXBlJiBmaWVsZFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90JiBmaWVsZElkKSB7Ci0gICh2b2lkKSBuYW1lOwordWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZEZpZWxkQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsIFRUeXBlJiBmaWVsZFR5cGUsIGludDE2X3QmIGZpZWxkSWQpIHsKKyAgKHZvaWQpbmFtZTsKICAgdWludDMyX3QgcmVzdWx0ID0gMDsKICAgLy8gQ2hlY2sgaWYgd2UgaGl0IHRoZSBlbmQgb2YgdGhlIGxpc3QKICAgdWludDhfdCBjaCA9IHJlYWRlcl8ucGVlaygpOwogICBpZiAoY2ggPT0ga0pTT05PYmplY3RFbmQpIHsKICAgICBmaWVsZFR5cGUgPSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfU1RPUDsKLSAgfQotICBlbHNlIHsKKyAgfSBlbHNlIHsKICAgICB1aW50NjRfdCB0bXBWYWwgPSAwOwogICAgIHN0ZDo6c3RyaW5nIHRtcFN0cjsKICAgICByZXN1bHQgKz0gcmVhZEpTT05JbnRlZ2VyKHRtcFZhbCk7Ci0gICAgaWYodG1wVmFsID4gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KChzdGQ6Om51bWVyaWNfbGltaXRzPGludDE2X3Q+OjptYXgpKCkpKQorICAgIGlmICh0bXBWYWwgPiBzdGF0aWNfY2FzdDx1aW50MzJfdD4oKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MTZfdD46Om1heCkoKSkpCiAgICAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpTSVpFX0xJTUlUKTsKICAgICBmaWVsZElkID0gc3RhdGljX2Nhc3Q8aW50MTZfdD4odG1wVmFsKTsKICAgICByZXN1bHQgKz0gcmVhZEpTT05PYmplY3RTdGFydCgpOwpAQCAtOTI0LDkgKzEwMDIsNyBAQAogICByZXR1cm4gcmVhZEpTT05PYmplY3RFbmQoKTsKIH0KIAotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZE1hcEJlZ2luKFRUeXBlJiBrZXlUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUeXBlJiB2YWxUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBzaXplKSB7Cit1aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkTWFwQmVnaW4oVFR5cGUmIGtleVR5cGUsIFRUeXBlJiB2YWxUeXBlLCB1aW50MzJfdCYgc2l6ZSkgewogICB1aW50NjRfdCB0bXBWYWwgPSAwOwogICBzdGQ6OnN0cmluZyB0bXBTdHI7CiAgIHVpbnQzMl90IHJlc3VsdCA9IHJlYWRKU09OQXJyYXlTdGFydCgpOwpAQCAtOTM1LDcgKzEwMTEsNyBAQAogICByZXN1bHQgKz0gcmVhZEpTT05TdHJpbmcodG1wU3RyKTsKICAgdmFsVHlwZSA9IGdldFR5cGVJREZvclR5cGVOYW1lKHRtcFN0cik7CiAgIHJlc3VsdCArPSByZWFkSlNPTkludGVnZXIodG1wVmFsKTsKLSAgaWYodG1wVmFsID4gKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgpKCkpCisgIGlmICh0bXBWYWwgPiAoc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCkoKSkKICAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpTSVpFX0xJTUlUKTsKICAgc2l6ZSA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pih0bXBWYWwpOwogICByZXN1bHQgKz0gcmVhZEpTT05PYmplY3RTdGFydCgpOwpAQCAtOTQzLDE4ICsxMDE5LDE5IEBACiB9CiAKIHVpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRNYXBFbmQoKSB7Ci0gIHJldHVybiByZWFkSlNPTk9iamVjdEVuZCgpICsgcmVhZEpTT05BcnJheUVuZCgpOworICB1aW50MzJfdCByZXN1bHQgPSByZWFkSlNPTk9iamVjdEVuZCgpOworICByZXN1bHQgKz0gcmVhZEpTT05BcnJheUVuZCgpOworICByZXR1cm4gcmVzdWx0OwogfQogCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkTGlzdEJlZ2luKFRUeXBlJiBlbGVtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIHNpemUpIHsKK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRMaXN0QmVnaW4oVFR5cGUmIGVsZW1UeXBlLCB1aW50MzJfdCYgc2l6ZSkgewogICB1aW50NjRfdCB0bXBWYWwgPSAwOwogICBzdGQ6OnN0cmluZyB0bXBTdHI7CiAgIHVpbnQzMl90IHJlc3VsdCA9IHJlYWRKU09OQXJyYXlTdGFydCgpOwogICByZXN1bHQgKz0gcmVhZEpTT05TdHJpbmcodG1wU3RyKTsKICAgZWxlbVR5cGUgPSBnZXRUeXBlSURGb3JUeXBlTmFtZSh0bXBTdHIpOwogICByZXN1bHQgKz0gcmVhZEpTT05JbnRlZ2VyKHRtcFZhbCk7Ci0gIGlmKHRtcFZhbCA+IChzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KSgpKQorICBpZiAodG1wVmFsID4gKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgpKCkpCiAgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6U0laRV9MSU1JVCk7CiAgIHNpemUgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4odG1wVmFsKTsKICAgcmV0dXJuIHJlc3VsdDsKQEAgLTk2NCwxNSArMTA0MSwxNCBAQAogICByZXR1cm4gcmVhZEpTT05BcnJheUVuZCgpOwogfQogCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkU2V0QmVnaW4oVFR5cGUmIGVsZW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBzaXplKSB7Cit1aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkU2V0QmVnaW4oVFR5cGUmIGVsZW1UeXBlLCB1aW50MzJfdCYgc2l6ZSkgewogICB1aW50NjRfdCB0bXBWYWwgPSAwOwogICBzdGQ6OnN0cmluZyB0bXBTdHI7CiAgIHVpbnQzMl90IHJlc3VsdCA9IHJlYWRKU09OQXJyYXlTdGFydCgpOwogICByZXN1bHQgKz0gcmVhZEpTT05TdHJpbmcodG1wU3RyKTsKICAgZWxlbVR5cGUgPSBnZXRUeXBlSURGb3JUeXBlTmFtZSh0bXBTdHIpOwogICByZXN1bHQgKz0gcmVhZEpTT05JbnRlZ2VyKHRtcFZhbCk7Ci0gIGlmKHRtcFZhbCA+IChzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KSgpKQorICBpZiAodG1wVmFsID4gKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgpKCkpCiAgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6U0laRV9MSU1JVCk7CiAgIHNpemUgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4odG1wVmFsKTsKICAgcmV0dXJuIHJlc3VsdDsKQEAgLTk4NiwxMSArMTA2MiwxMSBAQAogICByZXR1cm4gcmVhZEpTT05JbnRlZ2VyKHZhbHVlKTsKIH0KIAotLy8gcmVhZEJ5dGUoKSBtdXN0IGJlIGhhbmRsZWQgcHJvcGVybHkgYmVjdWFzZSBib29zdDo6bGV4aWNhbCBjYXN0IHNlZXMgaW50OF90CisvLyByZWFkQnl0ZSgpIG11c3QgYmUgaGFuZGxlZCBwcm9wZXJseSBiZWNhdXNlIGJvb3N0OjpsZXhpY2FsIGNhc3Qgc2VlcyBpbnQ4X3QKIC8vIGFzIGEgdGV4dCB0eXBlIGluc3RlYWQgb2YgYW4gaW50ZWdlciB0eXBlCiB1aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkQnl0ZShpbnQ4X3QmIGJ5dGUpIHsKLSAgaW50MTZfdCB0bXAgPSAoaW50MTZfdCkgYnl0ZTsKLSAgdWludDMyX3QgcmVzdWx0ID0gIHJlYWRKU09OSW50ZWdlcih0bXApOworICBpbnQxNl90IHRtcCA9IChpbnQxNl90KWJ5dGU7CisgIHVpbnQzMl90IHJlc3VsdCA9IHJlYWRKU09OSW50ZWdlcih0bXApOwogICBhc3NlcnQodG1wIDwgMjU2KTsKICAgYnl0ZSA9IChpbnQ4X3QpdG1wOwogICByZXR1cm4gcmVzdWx0OwpAQCAtMTAxMiwxMiArMTA4OCwxMyBAQAogICByZXR1cm4gcmVhZEpTT05Eb3VibGUoZHViKTsKIH0KIAotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZFN0cmluZyhzdGQ6OnN0cmluZyAmc3RyKSB7Cit1aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkU3RyaW5nKHN0ZDo6c3RyaW5nJiBzdHIpIHsKICAgcmV0dXJuIHJlYWRKU09OU3RyaW5nKHN0cik7CiB9CiAKLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRCaW5hcnkoc3RkOjpzdHJpbmcgJnN0cikgewordWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZEJpbmFyeShzdGQ6OnN0cmluZyYgc3RyKSB7CiAgIHJldHVybiByZWFkSlNPTkJhc2U2NChzdHIpOwogfQotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sCit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2wuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9USlNPTlByb3RvY29sLmgKaW5kZXggZWRmYzc0NC4uOWMyZjg3MiAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2wuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5oCkBAIC0yNCw3ICsyNCw5IEBACiAKICNpbmNsdWRlIDxzdGFjaz4KIAotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgcHJvdG9jb2wgeworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBwcm90b2NvbCB7CiAKIC8vIEZvcndhcmQgZGVjbGFyYXRpb24KIGNsYXNzIFRKU09OQ29udGV4dDsKQEAgLTQxLDcgKzQzLDcgQEAKICAqIDIuIFRocmlmdCBkb3VibGVzIGFyZSByZXByZXNlbnRlZCBhcyBKU09OIG51bWJlcnMuIFNvbWUgc3BlY2lhbCB2YWx1ZXMgYXJlCiAgKiAgICByZXByZXNlbnRlZCBhcyBzdHJpbmdzOgogICogICAgYS4gIk5hTiIgZm9yIG5vdC1hLW51bWJlciB2YWx1ZXMKLSAqICAgIGIuICJJbmZpbml0eSIgZm9yIHBvc3RpdmUgaW5maW5pdHkKKyAqICAgIGIuICJJbmZpbml0eSIgZm9yIHBvc2l0aXZlIGluZmluaXR5CiAgKiAgICBjLiAiLUluZmluaXR5IiBmb3IgbmVnYXRpdmUgaW5maW5pdHkKICAqCiAgKiAzLiBUaHJpZnQgc3RyaW5nIHZhbHVlcyBhcmUgZW1pdHRlZCBhcyBKU09OIHN0cmluZ3MsIHdpdGggYXBwcm9wcmlhdGUKQEAgLTUxLDYgKzUzLDEwIEBACiAgKiAgICBUaGUgcmVhZEJpbmFyeSgpIG1ldGhvZCBpcyB3cml0dGVuIHN1Y2ggdGhhdCBpdCB3aWxsIHByb3Blcmx5IHNraXAgaWYKICAqICAgIGNhbGxlZCBvbiBhIFRocmlmdCBzdHJpbmcgKGFsdGhvdWdoIGl0IHdpbGwgZGVjb2RlIGdhcmJhZ2UgZGF0YSkuCiAgKgorICogICAgTk9URTogQmFzZTY0IHBhZGRpbmcgaXMgb3B0aW9uYWwgZm9yIFRocmlmdCBiaW5hcnkgdmFsdWUgZW5jb2RpbmcuIFNvCisgKiAgICB0aGUgcmVhZEJpbmFyeSgpIG1ldGhvZCBuZWVkcyB0byBkZWNvZGUgYm90aCBpbnB1dCBzdHJpbmdzIHdpdGggcGFkZGluZworICogICAgYW5kIHRob3NlIHdpdGhvdXQgb25lLgorICoKICAqIDUuIFRocmlmdCBzdHJ1Y3RzIGFyZSByZXByZXNlbnRlZCBhcyBKU09OIG9iamVjdHMsIHdpdGggdGhlIGZpZWxkIElEIGFzIHRoZQogICogICAga2V5LCBhbmQgdGhlIGZpZWxkIHZhbHVlIHJlcHJlc2VudGVkIGFzIGEgSlNPTiBvYmplY3Qgd2l0aCBhIHNpbmdsZQogICogICAga2V5LXZhbHVlIHBhaXIuIFRoZSBrZXkgaXMgYSBzaG9ydCBzdHJpbmcgaWRlbnRpZmllciBmb3IgdGhhdCB0eXBlLApAQCAtODEsMjIgKzg3LDIxIEBACiAgKiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBpcyB0byBtYXRjaCBhcyBjbG9zZWx5IGFzIHBvc3NpYmxlIHRoZSBiZWhhdmlvcgogICogb2YgSmF2YSdzIERvdWJsZS50b1N0cmluZygpLCB3aGljaCBoYXMgbm8gcHJlY2lzaW9uIGxvc3MuICBJbXBsZW1lbnRvcnMgaW4KICAqIG90aGVyIGxhbmd1YWdlcyBzaG91bGQgc3RyaXZlIHRvIGFjaGlldmUgdGhhdCB3aGVyZSBwb3NzaWJsZS4gSSBoYXZlIG5vdAotICogeWV0IHZlcmlmaWVkIHdoZXRoZXIgYm9vc3Q6bGV4aWNhbF9jYXN0LCB3aGljaCBpcyBkb2luZyB0aGF0IHdvcmsgZm9yIG1lIGluCi0gKiBDKyssIGxvc2VzIGFueSBwcmVjaXNpb24sIGJ1dCBJIGFtIGxlYXZpbmcgdGhpcyBhcyBhIGZ1dHVyZSBpbXByb3ZlbWVudC4gSQotICogbWF5IHRyeSB0byBwcm92aWRlIGEgQyBjb21wb25lbnQgZm9yIHRoaXMsIHNvIHRoYXQgb3RoZXIgbGFuZ3VhZ2VzIGNvdWxkCi0gKiBiaW5kIHRvIHRoZSBzYW1lIHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24gZm9yIG1heGltdW0gY29uc2lzdGVuY3kuCisgKiB5ZXQgdmVyaWZpZWQgd2hldGhlciBzdGQ6OmlzdHJpbmdzdHJlYW06Om9wZXJhdG9yPj4sIHdoaWNoIGlzIGRvaW5nIHRoYXQKKyAqIHdvcmsgZm9yIG1lIGluIEMrKywgbG9zZXMgYW55IHByZWNpc2lvbiwgYnV0IEkgYW0gbGVhdmluZyB0aGlzIGFzIGEgZnV0dXJlCisgKiBpbXByb3ZlbWVudC4gSSBtYXkgdHJ5IHRvIHByb3ZpZGUgYSBDIGNvbXBvbmVudCBmb3IgdGhpcywgc28gdGhhdCBvdGhlcgorICogbGFuZ3VhZ2VzIGNvdWxkIGJpbmQgdG8gdGhlIHNhbWUgdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbiBmb3IgbWF4aW11bQorICogY29uc2lzdGVuY3kuCiAgKgogICovCiBjbGFzcyBUSlNPTlByb3RvY29sIDogcHVibGljIFRWaXJ0dWFsUHJvdG9jb2w8VEpTT05Qcm90b2NvbD4gewotIHB1YmxpYzoKLQotICBUSlNPTlByb3RvY29sKGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHB0cmFucyk7CitwdWJsaWM6CisgIFRKU09OUHJvdG9jb2woc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHB0cmFucyk7CiAKICAgflRKU09OUHJvdG9jb2woKTsKIAotIHByaXZhdGU6Ci0KLSAgdm9pZCBwdXNoQ29udGV4dChib29zdDo6c2hhcmVkX3B0cjxUSlNPTkNvbnRleHQ+IGMpOworcHJpdmF0ZToKKyAgdm9pZCBwdXNoQ29udGV4dChzdGQ6OnNoYXJlZF9wdHI8VEpTT05Db250ZXh0PiBjKTsKIAogICB2b2lkIHBvcENvbnRleHQoKTsKIApAQCAtMTA0LDE2ICsxMDksMTYgQEAKIAogICB1aW50MzJfdCB3cml0ZUpTT05DaGFyKHVpbnQ4X3QgY2gpOwogCi0gIHVpbnQzMl90IHdyaXRlSlNPTlN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyAmc3RyKTsKKyAgdWludDMyX3Qgd3JpdGVKU09OU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpOwogCi0gIHVpbnQzMl90IHdyaXRlSlNPTkJhc2U2NChjb25zdCBzdGQ6OnN0cmluZyAmc3RyKTsKKyAgdWludDMyX3Qgd3JpdGVKU09OQmFzZTY0KGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpOwogCiAgIHRlbXBsYXRlIDx0eXBlbmFtZSBOdW1iZXJUeXBlPgogICB1aW50MzJfdCB3cml0ZUpTT05JbnRlZ2VyKE51bWJlclR5cGUgbnVtKTsKIAogICB1aW50MzJfdCB3cml0ZUpTT05Eb3VibGUoZG91YmxlIG51bSk7CiAKLSAgdWludDMyX3Qgd3JpdGVKU09OT2JqZWN0U3RhcnQoKSA7CisgIHVpbnQzMl90IHdyaXRlSlNPTk9iamVjdFN0YXJ0KCk7CiAKICAgdWludDMyX3Qgd3JpdGVKU09OT2JqZWN0RW5kKCk7CiAKQEAgLTEyMywxOCArMTI4LDE4IEBACiAKICAgdWludDMyX3QgcmVhZEpTT05TeW50YXhDaGFyKHVpbnQ4X3QgY2gpOwogCi0gIHVpbnQzMl90IHJlYWRKU09ORXNjYXBlQ2hhcih1aW50OF90ICpvdXQpOworICB1aW50MzJfdCByZWFkSlNPTkVzY2FwZUNoYXIodWludDE2X3QqIG91dCk7CiAKLSAgdWludDMyX3QgcmVhZEpTT05TdHJpbmcoc3RkOjpzdHJpbmcgJnN0ciwgYm9vbCBza2lwQ29udGV4dCA9IGZhbHNlKTsKKyAgdWludDMyX3QgcmVhZEpTT05TdHJpbmcoc3RkOjpzdHJpbmcmIHN0ciwgYm9vbCBza2lwQ29udGV4dCA9IGZhbHNlKTsKIAotICB1aW50MzJfdCByZWFkSlNPTkJhc2U2NChzdGQ6OnN0cmluZyAmc3RyKTsKKyAgdWludDMyX3QgcmVhZEpTT05CYXNlNjQoc3RkOjpzdHJpbmcmIHN0cik7CiAKLSAgdWludDMyX3QgcmVhZEpTT05OdW1lcmljQ2hhcnMoc3RkOjpzdHJpbmcgJnN0cik7CisgIHVpbnQzMl90IHJlYWRKU09OTnVtZXJpY0NoYXJzKHN0ZDo6c3RyaW5nJiBzdHIpOwogCiAgIHRlbXBsYXRlIDx0eXBlbmFtZSBOdW1iZXJUeXBlPgotICB1aW50MzJfdCByZWFkSlNPTkludGVnZXIoTnVtYmVyVHlwZSAmbnVtKTsKKyAgdWludDMyX3QgcmVhZEpTT05JbnRlZ2VyKE51bWJlclR5cGUmIG51bSk7CiAKLSAgdWludDMyX3QgcmVhZEpTT05Eb3VibGUoZG91YmxlICZudW0pOworICB1aW50MzJfdCByZWFkSlNPTkRvdWJsZShkb3VibGUmIG51bSk7CiAKICAgdWludDMyX3QgcmVhZEpTT05PYmplY3RTdGFydCgpOwogCkBAIC0xNDQsOCArMTQ5LDcgQEAKIAogICB1aW50MzJfdCByZWFkSlNPTkFycmF5RW5kKCk7CiAKLSBwdWJsaWM6Ci0KK3B1YmxpYzoKICAgLyoqCiAgICAqIFdyaXRpbmcgZnVuY3Rpb25zLgogICAgKi8KQEAgLTE2MCwyNyArMTY0LDIxIEBACiAKICAgdWludDMyX3Qgd3JpdGVTdHJ1Y3RFbmQoKTsKIAotICB1aW50MzJfdCB3cml0ZUZpZWxkQmVnaW4oY29uc3QgY2hhciogbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIGZpZWxkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgZmllbGRJZCk7CisgIHVpbnQzMl90IHdyaXRlRmllbGRCZWdpbihjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBUVHlwZSBmaWVsZFR5cGUsIGNvbnN0IGludDE2X3QgZmllbGRJZCk7CiAKICAgdWludDMyX3Qgd3JpdGVGaWVsZEVuZCgpOwogCiAgIHVpbnQzMl90IHdyaXRlRmllbGRTdG9wKCk7CiAKLSAgdWludDMyX3Qgd3JpdGVNYXBCZWdpbihjb25zdCBUVHlwZSBrZXlUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIHZhbFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSk7CisgIHVpbnQzMl90IHdyaXRlTWFwQmVnaW4oY29uc3QgVFR5cGUga2V5VHlwZSwgY29uc3QgVFR5cGUgdmFsVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSk7CiAKICAgdWludDMyX3Qgd3JpdGVNYXBFbmQoKTsKIAotICB1aW50MzJfdCB3cml0ZUxpc3RCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSk7CisgIHVpbnQzMl90IHdyaXRlTGlzdEJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLCBjb25zdCB1aW50MzJfdCBzaXplKTsKIAogICB1aW50MzJfdCB3cml0ZUxpc3RFbmQoKTsKIAotICB1aW50MzJfdCB3cml0ZVNldEJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpOworICB1aW50MzJfdCB3cml0ZVNldEJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLCBjb25zdCB1aW50MzJfdCBzaXplKTsKIAogICB1aW50MzJfdCB3cml0ZVNldEVuZCgpOwogCkBAIC0yMDQsOSArMjAyLDcgQEAKICAgICogUmVhZGluZyBmdW5jdGlvbnMKICAgICovCiAKLSAgdWludDMyX3QgcmVhZE1lc3NhZ2VCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTWVzc2FnZVR5cGUmIG1lc3NhZ2VUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIHNlcWlkKTsKKyAgdWludDMyX3QgcmVhZE1lc3NhZ2VCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSwgVE1lc3NhZ2VUeXBlJiBtZXNzYWdlVHlwZSwgaW50MzJfdCYgc2VxaWQpOwogCiAgIHVpbnQzMl90IHJlYWRNZXNzYWdlRW5kKCk7CiAKQEAgLTIxNCwyNSArMjEwLDE5IEBACiAKICAgdWludDMyX3QgcmVhZFN0cnVjdEVuZCgpOwogCi0gIHVpbnQzMl90IHJlYWRGaWVsZEJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZSYgZmllbGRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90JiBmaWVsZElkKTsKKyAgdWludDMyX3QgcmVhZEZpZWxkQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsIFRUeXBlJiBmaWVsZFR5cGUsIGludDE2X3QmIGZpZWxkSWQpOwogCiAgIHVpbnQzMl90IHJlYWRGaWVsZEVuZCgpOwogCi0gIHVpbnQzMl90IHJlYWRNYXBCZWdpbihUVHlwZSYga2V5VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFRUeXBlJiB2YWxUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIHNpemUpOworICB1aW50MzJfdCByZWFkTWFwQmVnaW4oVFR5cGUmIGtleVR5cGUsIFRUeXBlJiB2YWxUeXBlLCB1aW50MzJfdCYgc2l6ZSk7CiAKICAgdWludDMyX3QgcmVhZE1hcEVuZCgpOwogCi0gIHVpbnQzMl90IHJlYWRMaXN0QmVnaW4oVFR5cGUmIGVsZW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBzaXplKTsKKyAgdWludDMyX3QgcmVhZExpc3RCZWdpbihUVHlwZSYgZWxlbVR5cGUsIHVpbnQzMl90JiBzaXplKTsKIAogICB1aW50MzJfdCByZWFkTGlzdEVuZCgpOwogCi0gIHVpbnQzMl90IHJlYWRTZXRCZWdpbihUVHlwZSYgZWxlbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2l6ZSk7CisgIHVpbnQzMl90IHJlYWRTZXRCZWdpbihUVHlwZSYgZWxlbVR5cGUsIHVpbnQzMl90JiBzaXplKTsKIAogICB1aW50MzJfdCByZWFkU2V0RW5kKCk7CiAKQEAgLTI1NywxOCArMjQ3LDEzIEBACiAKICAgY2xhc3MgTG9va2FoZWFkUmVhZGVyIHsKIAotICAgcHVibGljOgotCi0gICAgTG9va2FoZWFkUmVhZGVyKFRUcmFuc3BvcnQgJnRyYW5zKSA6Ci0gICAgICB0cmFuc18oJnRyYW5zKSwKLSAgICAgIGhhc0RhdGFfKGZhbHNlKSB7Ci0gICAgfQorICBwdWJsaWM6CisgICAgTG9va2FoZWFkUmVhZGVyKFRUcmFuc3BvcnQmIHRyYW5zKSA6IHRyYW5zXygmdHJhbnMpLCBoYXNEYXRhXyhmYWxzZSkge30KIAogICAgIHVpbnQ4X3QgcmVhZCgpIHsKICAgICAgIGlmIChoYXNEYXRhXykgewogICAgICAgICBoYXNEYXRhXyA9IGZhbHNlOwotICAgICAgfQotICAgICAgZWxzZSB7CisgICAgICB9IGVsc2UgewogICAgICAgICB0cmFuc18tPnJlYWRBbGwoJmRhdGFfLCAxKTsKICAgICAgIH0KICAgICAgIHJldHVybiBkYXRhXzsKQEAgLTI4MiwxNyArMjY3LDE3IEBACiAgICAgICByZXR1cm4gZGF0YV87CiAgICAgfQogCi0gICBwcml2YXRlOgotICAgIFRUcmFuc3BvcnQgKnRyYW5zXzsKKyAgcHJpdmF0ZToKKyAgICBUVHJhbnNwb3J0KiB0cmFuc187CiAgICAgYm9vbCBoYXNEYXRhXzsKICAgICB1aW50OF90IGRhdGFfOwogICB9OwogCi0gcHJpdmF0ZToKK3ByaXZhdGU6CiAgIFRUcmFuc3BvcnQqIHRyYW5zXzsKIAotICBzdGQ6OnN0YWNrPGJvb3N0OjpzaGFyZWRfcHRyPFRKU09OQ29udGV4dD4gPiBjb250ZXh0c187Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRKU09OQ29udGV4dD4gY29udGV4dF87CisgIHN0ZDo6c3RhY2s8c3RkOjpzaGFyZWRfcHRyPFRKU09OQ29udGV4dD4gPiBjb250ZXh0c187CisgIHN0ZDo6c2hhcmVkX3B0cjxUSlNPTkNvbnRleHQ+IGNvbnRleHRfOwogICBMb29rYWhlYWRSZWFkZXIgcmVhZGVyXzsKIH07CiAKQEAgLTMwMCwzMCArMjg1LDMxIEBACiAgKiBDb25zdHJ1Y3RzIGlucHV0IGFuZCBvdXRwdXQgcHJvdG9jb2wgb2JqZWN0cyBnaXZlbiB0cmFuc3BvcnRzLgogICovCiBjbGFzcyBUSlNPTlByb3RvY29sRmFjdG9yeSA6IHB1YmxpYyBUUHJvdG9jb2xGYWN0b3J5IHsKLSBwdWJsaWM6CitwdWJsaWM6CiAgIFRKU09OUHJvdG9jb2xGYWN0b3J5KCkge30KIAogICB2aXJ0dWFsIH5USlNPTlByb3RvY29sRmFjdG9yeSgpIHt9CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBnZXRQcm90b2NvbChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFucykgewotICAgIHJldHVybiBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+KG5ldyBUSlNPTlByb3RvY29sKHRyYW5zKSk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGdldFByb3RvY29sKHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFucykgeworICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPihuZXcgVEpTT05Qcm90b2NvbCh0cmFucykpOwogICB9CiB9OwotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sCi0KK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sCiAKIC8vIFRPRE8oZHJlaXNzKTogTW92ZSBwYXJ0IG9mIFRocmlmdEpTT05TdHJpbmcgaW50byBhIC5jcHAgZmlsZSBhbmQgcmVtb3ZlIHRoaXMuCiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgogCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgewogCi10ZW1wbGF0ZTx0eXBlbmFtZSBUaHJpZnRTdHJ1Y3Q+Ci0gIHN0ZDo6c3RyaW5nIFRocmlmdEpTT05TdHJpbmcoY29uc3QgVGhyaWZ0U3RydWN0JiB0cykgewordGVtcGxhdGUgPHR5cGVuYW1lIFRocmlmdFN0cnVjdD4KK3N0ZDo6c3RyaW5nIFRocmlmdEpTT05TdHJpbmcoY29uc3QgVGhyaWZ0U3RydWN0JiB0cykgewogICB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDsKICAgdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDsKICAgVE1lbW9yeUJ1ZmZlciogYnVmZmVyID0gbmV3IFRNZW1vcnlCdWZmZXI7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKGJ1ZmZlcik7CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFucyhidWZmZXIpOwogICBUSlNPTlByb3RvY29sIHByb3RvY29sKHRyYW5zKTsKIAogICB0cy53cml0ZSgmcHJvdG9jb2wpOwpAQCAtMzMzLDcgKzMxOSw3IEBACiAgIGJ1ZmZlci0+Z2V0QnVmZmVyKCZidWYsICZzaXplKTsKICAgcmV0dXJuIHN0ZDo6c3RyaW5nKChjaGFyKilidWYsICh1bnNpZ25lZCBpbnQpc2l6ZSk7CiB9Ci0KLX19IC8vIGFwYWNoZTo6dGhyaWZ0Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0CiAKICNlbmRpZiAvLyAjZGVmaW5lIF9USFJJRlRfUFJPVE9DT0xfVEpTT05QUk9UT0NPTF9IXyAxCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLmNwcAppbmRleCA3NTZiOWI5Li5mMGRjNjllIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wuY3BwCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5jcHAKQEAgLTIxLDI3ICsyMSwyMCBAQAogI2luY2x1ZGUgPHRocmlmdC9wcm9jZXNzb3IvVE11bHRpcGxleGVkUHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5oPgogCi1uYW1lc3BhY2UgYXBhY2hlCi17Ci0gICAgbmFtZXNwYWNlIHRocmlmdAotICAgIHsKLSAgICAgICAgbmFtZXNwYWNlIHByb3RvY29sCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVpbnQzMl90IFRNdWx0aXBsZXhlZFByb3RvY29sOjp3cml0ZU1lc3NhZ2VCZWdpbl92aXJ0KAotICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBfbmFtZSwKLSAgICAgICAgICAgICAgICBjb25zdCBUTWVzc2FnZVR5cGUgX3R5cGUsCi0gICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBfc2VxaWQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoIF90eXBlID09IFRfQ0FMTCB8fCBfdHlwZSA9PSBUX09ORVdBWSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFByb3RvY29sRGVjb3JhdG9yOjp3cml0ZU1lc3NhZ2VCZWdpbl92aXJ0KCBzZXJ2aWNlTmFtZSArIHNlcGFyYXRvciArIF9uYW1lLCBfdHlwZSwgX3NlcWlkICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBUUHJvdG9jb2xEZWNvcmF0b3I6OndyaXRlTWVzc2FnZUJlZ2luX3ZpcnQoX25hbWUsIF90eXBlLCBfc2VxaWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgcHJvdG9jb2wgewordWludDMyX3QgVE11bHRpcGxleGVkUHJvdG9jb2w6OndyaXRlTWVzc2FnZUJlZ2luX3ZpcnQoY29uc3Qgc3RkOjpzdHJpbmcmIF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVE1lc3NhZ2VUeXBlIF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBfc2VxaWQpIHsKKyAgaWYgKF90eXBlID09IFRfQ0FMTCB8fCBfdHlwZSA9PSBUX09ORVdBWSkgeworICAgIHJldHVybiBUUHJvdG9jb2xEZWNvcmF0b3I6OndyaXRlTWVzc2FnZUJlZ2luX3ZpcnQoc2VydmljZU5hbWUgKyBzZXBhcmF0b3IgKyBfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlcWlkKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gVFByb3RvY29sRGVjb3JhdG9yOjp3cml0ZU1lc3NhZ2VCZWdpbl92aXJ0KF9uYW1lLCBfdHlwZSwgX3NlcWlkKTsKKyAgfQogfQotCit9Cit9Cit9CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5oCmluZGV4IGU5M2YzNzEuLjk0YmQ4MmUgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5oCkBAIC0yMiw4MiArMjIsNzQgQEAKIAogI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xEZWNvcmF0b3IuaD4KIAotbmFtZXNwYWNlIGFwYWNoZQotewotICAgIG5hbWVzcGFjZSB0aHJpZnQKLSAgICB7Ci0gICAgICAgIG5hbWVzcGFjZSBwcm90b2NvbAotICAgICAgICB7Ci0gICAgICAgICAgICB1c2luZyBib29zdDo6c2hhcmVkX3B0cjsKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgcHJvdG9jb2wgewordXNpbmcgc3RkOjpzaGFyZWRfcHRyOwogCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIDxjb2RlPlRNdWx0aXBsZXhlZFByb3RvY29sPC9jb2RlPiBpcyBhIHByb3RvY29sLWluZGVwZW5kZW50IGNvbmNyZXRlIGRlY29yYXRvcgotICAgICAgICAgICAgICogdGhhdCBhbGxvd3MgYSBUaHJpZnQgY2xpZW50IHRvIGNvbW11bmljYXRlIHdpdGggYSBtdWx0aXBsZXhpbmcgVGhyaWZ0IHNlcnZlciwKLSAgICAgICAgICAgICAqIGJ5IHByZXBlbmRpbmcgdGhlIHNlcnZpY2UgbmFtZSB0byB0aGUgZnVuY3Rpb24gbmFtZSBkdXJpbmcgZnVuY3Rpb24gY2FsbHMuCi0gICAgICAgICAgICAgKgotICAgICAgICAgICAgICogXG5vdGUgVEhJUyBJUyBOT1QgVVNFRCBCWSBTRVJWRVJTLiAgT24gdGhlIHNlcnZlciwgdXNlCi0gICAgICAgICAgICAgKiB7QGxpbmsgYXBhY2hlOjp0aHJpZnQ6OlRNdWx0aXBsZXhlZFByb2Nlc3NvciBUTXVsdGlwbGV4ZWRQcm9jZXNzb3J9IHRvIGhhbmRsZSByZXF1ZXN0cwotICAgICAgICAgICAgICogZnJvbSBhIG11bHRpcGxleGluZyBjbGllbnQuCi0gICAgICAgICAgICAgKgotICAgICAgICAgICAgICogVGhpcyBleGFtcGxlIHVzZXMgYSBzaW5nbGUgc29ja2V0IHRyYW5zcG9ydCB0byBpbnZva2UgdHdvIHNlcnZpY2VzOgotICAgICAgICAgICAgICoKLSAgICAgICAgICAgICAqIDxibG9ja3F1b3RlPjxjb2RlPgotICAgICAgICAgICAgICogICAgIHNoYXJlZF9wdHI8VFNvY2tldD4gdHJhbnNwb3J0KG5ldyBUU29ja2V0KCJsb2NhbGhvc3QiLCA5MDkwKSk7Ci0gICAgICAgICAgICAgKiAgICAgdHJhbnNwb3J0LT5vcGVuKCk7Ci0gICAgICAgICAgICAgKgotICAgICAgICAgICAgICogICAgIHNoYXJlZF9wdHI8VEJpbmFyeVByb3RvY29sPiBwcm90b2NvbChuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCkpOwotICAgICAgICAgICAgICoKLSAgICAgICAgICAgICAqICAgICBzaGFyZWRfcHRyPFRNdWx0aXBsZXhlZFByb3RvY29sPiBtcDEobmV3IFRNdWx0aXBsZXhlZFByb3RvY29sKHByb3RvY29sLCAiQ2FsY3VsYXRvciIpKTsKLSAgICAgICAgICAgICAqICAgICBzaGFyZWRfcHRyPENhbGN1bGF0b3JDbGllbnQ+IHNlcnZpY2UxKG5ldyBDYWxjdWxhdG9yQ2xpZW50KG1wMSkpOwotICAgICAgICAgICAgICoKLSAgICAgICAgICAgICAqICAgICBzaGFyZWRfcHRyPFRNdWx0aXBsZXhlZFByb3RvY29sPiBtcDIobmV3IFRNdWx0aXBsZXhlZFByb3RvY29sKHByb3RvY29sLCAiV2VhdGhlclJlcG9ydCIpKTsKLSAgICAgICAgICAgICAqICAgICBzaGFyZWRfcHRyPFdlYXRoZXJSZXBvcnRDbGllbnQ+IHNlcnZpY2UyKG5ldyBXZWF0aGVyUmVwb3J0Q2xpZW50KG1wMikpOwotICAgICAgICAgICAgICoKLSAgICAgICAgICAgICAqICAgICBzZXJ2aWNlMS0+YWRkKDIsMik7Ci0gICAgICAgICAgICAgKiAgICAgaW50IHRlbXAgPSBzZXJ2aWNlMi0+Z2V0VGVtcGVyYXR1cmUoKTsKLSAgICAgICAgICAgICAqIDwvY29kZT48L2Jsb2NrcXVvdGU+Ci0gICAgICAgICAgICAgKgotICAgICAgICAgICAgICogQHNlZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbERlY29yYXRvcgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgY2xhc3MgVE11bHRpcGxleGVkUHJvdG9jb2wgOiBwdWJsaWMgVFByb3RvY29sRGVjb3JhdG9yCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICBwdWJsaWM6Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogV3JhcCB0aGUgc3BlY2lmaWVkIHByb3RvY29sLCBhbGxvd2luZyBpdCB0byBiZSB1c2VkIHRvIGNvbW11bmljYXRlIHdpdGggYQotICAgICAgICAgICAgICAgICAqIG11bHRpcGxleGluZyBzZXJ2ZXIuICBUaGUgPGNvZGU+c2VydmljZU5hbWU8L2NvZGU+IGlzIHJlcXVpcmVkIGFzIGl0IGlzCi0gICAgICAgICAgICAgICAgICogcHJlcGVuZGVkIHRvIHRoZSBtZXNzYWdlIGhlYWRlciBzbyB0aGF0IHRoZSBtdWx0aXBsZXhpbmcgc2VydmVyIGNhbiBicm9rZXIKLSAgICAgICAgICAgICAgICAgKiB0aGUgZnVuY3Rpb24gY2FsbCB0byB0aGUgcHJvcGVyIHNlcnZpY2UuCi0gICAgICAgICAgICAgICAgICoKLSAgICAgICAgICAgICAgICAgKiBccGFyYW0gX3Byb3RvY29sICAgIFlvdXIgY29tbXVuaWNhdGlvbiBwcm90b2NvbCBvZiBjaG9pY2UsIGUuZy4gPGNvZGU+VEJpbmFyeVByb3RvY29sPC9jb2RlPi4KLSAgICAgICAgICAgICAgICAgKiBccGFyYW0gX3NlcnZpY2VOYW1lIFRoZSBzZXJ2aWNlIG5hbWUgb2YgdGhlIHNlcnZpY2UgY29tbXVuaWNhdGluZyB2aWEgdGhpcyBwcm90b2NvbC4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgVE11bHRpcGxleGVkUHJvdG9jb2woIHNoYXJlZF9wdHI8VFByb3RvY29sPiBfcHJvdG9jb2wsIGNvbnN0IHN0ZDo6c3RyaW5nJiBfc2VydmljZU5hbWUgKQotICAgICAgICAgICAgICAgICAgICA6IFRQcm90b2NvbERlY29yYXRvcihfcHJvdG9jb2wpLAotICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VOYW1lKF9zZXJ2aWNlTmFtZSksCi0gICAgICAgICAgICAgICAgICAgICAgc2VwYXJhdG9yKCI6IikKLSAgICAgICAgICAgICAgICB7IH0KLSAgICAgICAgICAgICAgICB2aXJ0dWFsIH5UTXVsdGlwbGV4ZWRQcm90b2NvbCgpIHt9CisvKioKKyAqIDxjb2RlPlRNdWx0aXBsZXhlZFByb3RvY29sPC9jb2RlPiBpcyBhIHByb3RvY29sLWluZGVwZW5kZW50IGNvbmNyZXRlIGRlY29yYXRvcgorICogdGhhdCBhbGxvd3MgYSBUaHJpZnQgY2xpZW50IHRvIGNvbW11bmljYXRlIHdpdGggYSBtdWx0aXBsZXhpbmcgVGhyaWZ0IHNlcnZlciwKKyAqIGJ5IHByZXBlbmRpbmcgdGhlIHNlcnZpY2UgbmFtZSB0byB0aGUgZnVuY3Rpb24gbmFtZSBkdXJpbmcgZnVuY3Rpb24gY2FsbHMuCisgKgorICogXG5vdGUgVEhJUyBJUyBOT1QgVVNFRCBCWSBTRVJWRVJTLiAgT24gdGhlIHNlcnZlciwgdXNlCisgKiB7QGxpbmsgYXBhY2hlOjp0aHJpZnQ6OlRNdWx0aXBsZXhlZFByb2Nlc3NvciBUTXVsdGlwbGV4ZWRQcm9jZXNzb3J9IHRvIGhhbmRsZSByZXF1ZXN0cworICogZnJvbSBhIG11bHRpcGxleGluZyBjbGllbnQuCisgKgorICogVGhpcyBleGFtcGxlIHVzZXMgYSBzaW5nbGUgc29ja2V0IHRyYW5zcG9ydCB0byBpbnZva2UgdHdvIHNlcnZpY2VzOgorICoKKyAqIDxibG9ja3F1b3RlPjxjb2RlPgorICogICAgIHNoYXJlZF9wdHI8VFNvY2tldD4gdHJhbnNwb3J0KG5ldyBUU29ja2V0KCJsb2NhbGhvc3QiLCA5MDkwKSk7CisgKiAgICAgdHJhbnNwb3J0LT5vcGVuKCk7CisgKgorICogICAgIHNoYXJlZF9wdHI8VEJpbmFyeVByb3RvY29sPiBwcm90b2NvbChuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCkpOworICoKKyAqICAgICBzaGFyZWRfcHRyPFRNdWx0aXBsZXhlZFByb3RvY29sPiBtcDEobmV3IFRNdWx0aXBsZXhlZFByb3RvY29sKHByb3RvY29sLCAiQ2FsY3VsYXRvciIpKTsKKyAqICAgICBzaGFyZWRfcHRyPENhbGN1bGF0b3JDbGllbnQ+IHNlcnZpY2UxKG5ldyBDYWxjdWxhdG9yQ2xpZW50KG1wMSkpOworICoKKyAqICAgICBzaGFyZWRfcHRyPFRNdWx0aXBsZXhlZFByb3RvY29sPiBtcDIobmV3IFRNdWx0aXBsZXhlZFByb3RvY29sKHByb3RvY29sLCAiV2VhdGhlclJlcG9ydCIpKTsKKyAqICAgICBzaGFyZWRfcHRyPFdlYXRoZXJSZXBvcnRDbGllbnQ+IHNlcnZpY2UyKG5ldyBXZWF0aGVyUmVwb3J0Q2xpZW50KG1wMikpOworICoKKyAqICAgICBzZXJ2aWNlMS0+YWRkKDIsMik7CisgKiAgICAgaW50IHRlbXAgPSBzZXJ2aWNlMi0+Z2V0VGVtcGVyYXR1cmUoKTsKKyAqIDwvY29kZT48L2Jsb2NrcXVvdGU+CisgKgorICogQHNlZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbERlY29yYXRvcgorICovCitjbGFzcyBUTXVsdGlwbGV4ZWRQcm90b2NvbCA6IHB1YmxpYyBUUHJvdG9jb2xEZWNvcmF0b3IgeworcHVibGljOgorICAvKioKKyAgICogV3JhcCB0aGUgc3BlY2lmaWVkIHByb3RvY29sLCBhbGxvd2luZyBpdCB0byBiZSB1c2VkIHRvIGNvbW11bmljYXRlIHdpdGggYQorICAgKiBtdWx0aXBsZXhpbmcgc2VydmVyLiAgVGhlIDxjb2RlPnNlcnZpY2VOYW1lPC9jb2RlPiBpcyByZXF1aXJlZCBhcyBpdCBpcworICAgKiBwcmVwZW5kZWQgdG8gdGhlIG1lc3NhZ2UgaGVhZGVyIHNvIHRoYXQgdGhlIG11bHRpcGxleGluZyBzZXJ2ZXIgY2FuIGJyb2tlcgorICAgKiB0aGUgZnVuY3Rpb24gY2FsbCB0byB0aGUgcHJvcGVyIHNlcnZpY2UuCisgICAqCisgICAqIFxwYXJhbSBfcHJvdG9jb2wgICAgWW91ciBjb21tdW5pY2F0aW9uIHByb3RvY29sIG9mIGNob2ljZSwgZS5nLiA8Y29kZT5UQmluYXJ5UHJvdG9jb2w8L2NvZGU+LgorICAgKiBccGFyYW0gX3NlcnZpY2VOYW1lIFRoZSBzZXJ2aWNlIG5hbWUgb2YgdGhlIHNlcnZpY2UgY29tbXVuaWNhdGluZyB2aWEgdGhpcyBwcm90b2NvbC4KKyAgICovCisgIFRNdWx0aXBsZXhlZFByb3RvY29sKHNoYXJlZF9wdHI8VFByb3RvY29sPiBfcHJvdG9jb2wsIGNvbnN0IHN0ZDo6c3RyaW5nJiBfc2VydmljZU5hbWUpCisgICAgOiBUUHJvdG9jb2xEZWNvcmF0b3IoX3Byb3RvY29sKSwgc2VydmljZU5hbWUoX3NlcnZpY2VOYW1lKSwgc2VwYXJhdG9yKCI6Iikge30KKyAgdmlydHVhbCB+VE11bHRpcGxleGVkUHJvdG9jb2woKSB7fQogCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogUHJlcGVuZHMgdGhlIHNlcnZpY2UgbmFtZSB0byB0aGUgZnVuY3Rpb24gbmFtZSwgc2VwYXJhdGVkIGJ5IFRNdWx0aXBsZXhlZFByb3RvY29sOjpTRVBBUkFUT1IuCi0gICAgICAgICAgICAgICAgICoKLSAgICAgICAgICAgICAgICAgKiBccGFyYW0gW2luXSBfbmFtZSAgIFRoZSBuYW1lIG9mIHRoZSBtZXRob2QgdG8gYmUgY2FsbGVkIGluIHRoZSBzZXJ2aWNlLgotICAgICAgICAgICAgICAgICAqIFxwYXJhbSBbaW5dIF90eXBlICAgVGhlIHR5cGUgb2YgbWVzc2FnZQotICAgICAgICAgICAgICAgICAqIFxwYXJhbSBbaW5dIF9uYW1lICAgVGhlIHNlcXVlbnRpYWwgaWQgb2YgdGhlIG1lc3NhZ2UKLSAgICAgICAgICAgICAgICAgKgotICAgICAgICAgICAgICAgICAqIFx0aHJvd3MgVEV4Y2VwdGlvbiAgUGFzc2VkIHRocm91Z2ggZnJvbSB3cmFwcGVkIDxjb2RlPlRQcm90b2NvbDwvY29kZT4gaW5zdGFuY2UuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgdWludDMyX3Qgd3JpdGVNZXNzYWdlQmVnaW5fdmlydCgKLSAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIF9uYW1lLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBUTWVzc2FnZVR5cGUgX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgX3NlcWlkKTsKLSAgICAgICAgICAgIHByaXZhdGU6Ci0gICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgc2VydmljZU5hbWU7Ci0gICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgc2VwYXJhdG9yOwotICAgICAgICAgICAgfTsKKyAgLyoqCisgICAqIFByZXBlbmRzIHRoZSBzZXJ2aWNlIG5hbWUgdG8gdGhlIGZ1bmN0aW9uIG5hbWUsIHNlcGFyYXRlZCBieSBUTXVsdGlwbGV4ZWRQcm90b2NvbDo6U0VQQVJBVE9SLgorICAgKgorICAgKiBccGFyYW0gW2luXSBfbmFtZSAgIFRoZSBuYW1lIG9mIHRoZSBtZXRob2QgdG8gYmUgY2FsbGVkIGluIHRoZSBzZXJ2aWNlLgorICAgKiBccGFyYW0gW2luXSBfdHlwZSAgIFRoZSB0eXBlIG9mIG1lc3NhZ2UKKyAgICogXHBhcmFtIFtpbl0gX25hbWUgICBUaGUgc2VxdWVudGlhbCBpZCBvZiB0aGUgbWVzc2FnZQorICAgKgorICAgKiBcdGhyb3dzIFRFeGNlcHRpb24gIFBhc3NlZCB0aHJvdWdoIGZyb20gd3JhcHBlZCA8Y29kZT5UUHJvdG9jb2w8L2NvZGU+IGluc3RhbmNlLgorICAgKi8KKyAgdWludDMyX3Qgd3JpdGVNZXNzYWdlQmVnaW5fdmlydChjb25zdCBzdGQ6OnN0cmluZyYgX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVE1lc3NhZ2VUeXBlIF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgX3NlcWlkKTsKIAotICAgICAgICB9Ci0gICAgfQorcHJpdmF0ZToKKyAgY29uc3Qgc3RkOjpzdHJpbmcgc2VydmljZU5hbWU7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIHNlcGFyYXRvcjsKK307Cit9Cit9CiB9CiAKICNlbmRpZiAvLyBUSFJJRlRfVE1VTFRJUExFWEVEUFJPVE9DT0xfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM3OGFjYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuY3BwCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBwcm90b2NvbCB7CisKK1RQcm90b2NvbDo6flRQcm90b2NvbCgpIHt9Cit1aW50MzJfdCBUUHJvdG9jb2w6OnNraXBfdmlydChUVHlwZSB0eXBlKSB7CisgIHJldHVybiA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6c2tpcCgqdGhpcywgdHlwZSk7Cit9CisKK1RQcm90b2NvbEZhY3Rvcnk6On5UUHJvdG9jb2xGYWN0b3J5KCkge30KKworfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbC5oCmluZGV4IGQ0YzM0M2QuLmJiYzY4MTYgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmgKQEAgLTIwLDExICsyMCwxNSBAQAogI2lmbmRlZiBfVEhSSUZUX1BST1RPQ09MX1RQUk9UT0NPTF9IXwogI2RlZmluZSBfVEhSSUZUX1BST1RPQ09MX1RQUk9UT0NPTF9IXyAxCiAKKyNpZmRlZiBfV0lOMzIKKy8vIE5lZWQgdG8gY29tZSBiZWZvcmUgYW55IFdpbmRvd3MuaCBpbmNsdWRlcworI2luY2x1ZGUgPFdpbnNvY2syLmg+CisjZW5kaWYKKwogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydC5oPgogI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xFeGNlcHRpb24uaD4KIAotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgotI2luY2x1ZGUgPGJvb3N0L3N0YXRpY19hc3NlcnQuaHBwPgorI2luY2x1ZGUgPG1lbW9yeT4KIAogI2lmZGVmIEhBVkVfTkVUSU5FVF9JTl9ICiAjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgpAQCAtMzMsMTggKzM3LDE3IEBACiAjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPG1hcD4KICNpbmNsdWRlIDx2ZWN0b3I+Ci0KKyNpbmNsdWRlIDxjbGltaXRzPgogCiAvLyBVc2UgdGhpcyB0byBnZXQgYXJvdW5kIHN0cmljdCBhbGlhc2luZyBydWxlcy4KIC8vIEZvciBleGFtcGxlLCB1aW50NjRfdCBpID0gYml0d2lzZV9jYXN0PHVpbnQ2NF90PihyZXR1cm5zX2RvdWJsZSgpKTsKIC8vIFRoZSBtb3N0IG9idmlvdXMgaW1wbGVtZW50YXRpb24gaXMgdG8ganVzdCBjYXN0IGEgcG9pbnRlciwKIC8vIGJ1dCB0aGF0IGRvZXNuJ3Qgd29yay4KIC8vIEZvciBhIHByZXR0eSBpbi1kZXB0aCBleHBsYW5hdGlvbiBvZiB0aGUgcHJvYmxlbSwgc2VlCi0vLyBodHRwOi8vd3d3LmNlbGxwZXJmb3JtYW5jZS5jb20vbWlrZV9hY3Rvbi8yMDA2LzA2LyAoLi4uKQotLy8gdW5kZXJzdGFuZGluZ19zdHJpY3RfYWxpYXNpbmcuaHRtbAorLy8gaHR0cDovL2NlbGxwZXJmb3JtYW5jZS5iZXlvbmQzZC5jb20vYXJ0aWNsZXMvMjAwNi8wNi91bmRlcnN0YW5kaW5nLXN0cmljdC1hbGlhc2luZy5odG1sCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVG8sIHR5cGVuYW1lIEZyb20+CiBzdGF0aWMgaW5saW5lIFRvIGJpdHdpc2VfY2FzdChGcm9tIGZyb20pIHsKLSAgQk9PU1RfU1RBVElDX0FTU0VSVChzaXplb2YoRnJvbSkgPT0gc2l6ZW9mKFRvKSk7CisgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEZyb20pID09IHNpemVvZihUbyksICJzaXplb2YoRnJvbSkgPT0gc2l6ZW9mKFRvKSIpOwogCiAgIC8vIEJBRCEhISAgVGhlc2UgYXJlIGFsbCBicm9rZW4gd2l0aCAtTzIuCiAgIC8vcmV0dXJuICpyZWludGVycHJldF9jYXN0PFRvKj4oJmZyb20pOyAgLy8gQkFEISEhCkBAIC05OSwxMiArMTAyLDE4IEBACiAjZW5kaWYKIAogI2lmIF9fVEhSSUZUX0JZVEVfT1JERVIgPT0gX19USFJJRlRfQklHX0VORElBTgotIyAgZGVmaW5lIG50b2hsbChuKSAobikKLSMgIGRlZmluZSBodG9ubGwobikgKG4pCisjIGlmICFkZWZpbmVkKFRIUklGVF9udG9obGwpCisjICBkZWZpbmUgVEhSSUZUX250b2hsbChuKSAobikKKyMgIGRlZmluZSBUSFJJRlRfaHRvbmxsKG4pIChuKQorIyBlbmRpZgogIyBpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9fR0xJQkNfXykKICMgIGluY2x1ZGUgPGJ5dGVzd2FwLmg+Ci0jICBkZWZpbmUgaHRvbGVsbChuKSBic3dhcF82NChuKQotIyAgZGVmaW5lIGxldG9obGwobikgYnN3YXBfNjQobikKKyMgIGRlZmluZSBUSFJJRlRfaHRvbGVsbChuKSBic3dhcF82NChuKQorIyAgZGVmaW5lIFRIUklGVF9sZXRvaGxsKG4pIGJzd2FwXzY0KG4pCisjICBkZWZpbmUgVEhSSUZUX2h0b2xlbChuKSBic3dhcF8zMihuKQorIyAgZGVmaW5lIFRIUklGVF9sZXRvaGwobikgYnN3YXBfMzIobikKKyMgIGRlZmluZSBUSFJJRlRfaHRvbGVzKG4pIGJzd2FwXzE2KG4pCisjICBkZWZpbmUgVEhSSUZUX2xldG9ocyhuKSBic3dhcF8xNihuKQogIyBlbHNlIC8qIEdOVUMgJiBHTElCQyAqLwogIyAgZGVmaW5lIGJzd2FwXzY0KG4pIFwKICAgICAgICggKCgobikgJiAweGZmMDAwMDAwMDAwMDAwMDB1bGwpID4+IDU2KSBcCkBAIC0xMTUsMjggKzEyNCw0NiBAQAogICAgICAgfCAoKChuKSAmIDB4MDAwMDAwMDAwMGZmMDAwMHVsbCkgPDwgMjQpIFwKICAgICAgIHwgKCgobikgJiAweDAwMDAwMDAwMDAwMGZmMDB1bGwpIDw8IDQwKSBcCiAgICAgICB8ICgoKG4pICYgMHgwMDAwMDAwMDAwMDAwMGZmdWxsKSA8PCA1NikgKQotIyAgZGVmaW5lIGh0b2xlbGwobikgYnN3YXBfNjQobikKLSMgIGRlZmluZSBsZXRvaGxsKG4pIGJzd2FwXzY0KG4pCisjICBkZWZpbmUgYnN3YXBfMzIobikgXAorICAgICAgKCAoKChuKSAmIDB4ZmYwMDAwMDB1bCkgPj4gMjQpIFwKKyAgICAgIHwgKCgobikgJiAweDAwZmYwMDAwdWwpID4+IDgpICBcCisgICAgICB8ICgoKG4pICYgMHgwMDAwZmYwMHVsKSA8PCA4KSAgXAorICAgICAgfCAoKChuKSAmIDB4MDAwMDAwZmZ1bCkgPDwgMjQpICkKKyMgIGRlZmluZSBic3dhcF8xNihuKSBcCisgICAgICAoICgoKG4pICYgKCh1bnNpZ25lZCBzaG9ydCkweGZmMDB1bCkpID4+IDgpICBcCisgICAgICB8ICgoKG4pICYgKCh1bnNpZ25lZCBzaG9ydCkweDAwZmZ1bCkpIDw8IDgpICApCisjICBkZWZpbmUgVEhSSUZUX2h0b2xlbGwobikgYnN3YXBfNjQobikKKyMgIGRlZmluZSBUSFJJRlRfbGV0b2hsbChuKSBic3dhcF82NChuKQorIyAgZGVmaW5lIFRIUklGVF9odG9sZWwobikgYnN3YXBfMzIobikKKyMgIGRlZmluZSBUSFJJRlRfbGV0b2hsKG4pIGJzd2FwXzMyKG4pCisjICBkZWZpbmUgVEhSSUZUX2h0b2xlcyhuKSBic3dhcF8xNihuKQorIyAgZGVmaW5lIFRIUklGVF9sZXRvaHMobikgYnN3YXBfMTYobikKICMgZW5kaWYgLyogR05VQyAmIEdMSUJDICovCiAjZWxpZiBfX1RIUklGVF9CWVRFX09SREVSID09IF9fVEhSSUZUX0xJVFRMRV9FTkRJQU4KLSMgIGRlZmluZSBodG9sZWxsKG4pIChuKQotIyAgZGVmaW5lIGxldG9obGwobikgKG4pCisjICBkZWZpbmUgVEhSSUZUX2h0b2xlbGwobikgKG4pCisjICBkZWZpbmUgVEhSSUZUX2xldG9obGwobikgKG4pCisjICBkZWZpbmUgVEhSSUZUX2h0b2xlbChuKSAobikKKyMgIGRlZmluZSBUSFJJRlRfbGV0b2hsKG4pIChuKQorIyAgZGVmaW5lIFRIUklGVF9odG9sZXMobikgKG4pCisjICBkZWZpbmUgVEhSSUZUX2xldG9ocyhuKSAobikKICMgaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX0dMSUJDX18pCiAjICBpbmNsdWRlIDxieXRlc3dhcC5oPgotIyAgZGVmaW5lIG50b2hsbChuKSBic3dhcF82NChuKQotIyAgZGVmaW5lIGh0b25sbChuKSBic3dhcF82NChuKQorIyAgZGVmaW5lIFRIUklGVF9udG9obGwobikgYnN3YXBfNjQobikKKyMgIGRlZmluZSBUSFJJRlRfaHRvbmxsKG4pIGJzd2FwXzY0KG4pCiAjIGVsaWYgZGVmaW5lZChfTVNDX1ZFUikgLyogTWljcm9zb2Z0IFZpc3VhbCBDKysgKi8KLSMgIGRlZmluZSBudG9obGwobikgKCBfYnl0ZXN3YXBfdWludDY0KCh1aW50NjRfdCluKSApCi0jICBkZWZpbmUgaHRvbmxsKG4pICggX2J5dGVzd2FwX3VpbnQ2NCgodWludDY0X3QpbikgKQotIyBlbHNlIC8qIE5vdCBHTlVDL0dMSUJDIG9yIE1TVkMgKi8KLSMgIGRlZmluZSBudG9obGwobikgKCAoKCh1aW50NjRfdCludG9obCgodWludDMyX3QpbikpIDw8IDMyKSArIG50b2hsKCh1aW50MzJfdCkobiA+PiAzMikpICkKLSMgIGRlZmluZSBodG9ubGwobikgKCAoKCh1aW50NjRfdClodG9ubCgodWludDMyX3QpbikpIDw8IDMyKSArIGh0b25sKCh1aW50MzJfdCkobiA+PiAzMikpICkKKyMgIGRlZmluZSBUSFJJRlRfbnRvaGxsKG4pICggX2J5dGVzd2FwX3VpbnQ2NCgodWludDY0X3QpbikgKQorIyAgZGVmaW5lIFRIUklGVF9odG9ubGwobikgKCBfYnl0ZXN3YXBfdWludDY0KCh1aW50NjRfdCluKSApCisjIGVsaWYgIWRlZmluZWQoVEhSSUZUX250b2hsbCkgLyogTm90IEdOVUMvR0xJQkMgb3IgTVNWQyAqLworIyAgZGVmaW5lIFRIUklGVF9udG9obGwobikgKCAoKCh1aW50NjRfdCludG9obCgodWludDMyX3QpbikpIDw8IDMyKSArIG50b2hsKCh1aW50MzJfdCkobiA+PiAzMikpICkKKyMgIGRlZmluZSBUSFJJRlRfaHRvbmxsKG4pICggKCgodWludDY0X3QpaHRvbmwoKHVpbnQzMl90KW4pKSA8PCAzMikgKyBodG9ubCgodWludDMyX3QpKG4gPj4gMzIpKSApCiAjIGVuZGlmIC8qIEdOVUMvR0xJQkMgb3IgTVNWQyBvciBzb21ldGhpbmcgZWxzZSAqLwogI2Vsc2UgLyogX19USFJJRlRfQllURV9PUkRFUiAqLwotIyBlcnJvciAiQ2FuJ3QgZGVmaW5lIGh0b25sbCBvciBudG9obGwhIgorIyBlcnJvciAiQ2FuJ3QgZGVmaW5lIFRIUklGVF9odG9ubGwgb3IgVEhSSUZUX250b2hsbCEiCiAjZW5kaWYKIAotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgcHJvdG9jb2wgeworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBwcm90b2NvbCB7CiAKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ7CiAKQEAgLTE3NywxMTIgKzIwNCw2IEBACiAgIFRfT05FV0FZICAgICA9IDQKIH07CiAKLQotLyoqCi0gKiBIZWxwZXIgdGVtcGxhdGUgZm9yIGltcGxlbWVudGluZyBUUHJvdG9jb2w6OnNraXAoKS4KLSAqCi0gKiBUZW1wbGF0aXplZCB0byBhdm9pZCBoYXZpbmcgdG8gbWFrZSB2aXJ0dWFsIGZ1bmN0aW9uIGNhbGxzLgotICovCi10ZW1wbGF0ZSA8Y2xhc3MgUHJvdG9jb2xfPgotdWludDMyX3Qgc2tpcChQcm90b2NvbF8mIHByb3QsIFRUeXBlIHR5cGUpIHsKLSAgc3dpdGNoICh0eXBlKSB7Ci0gIGNhc2UgVF9CT09MOgotICAgIHsKLSAgICAgIGJvb2wgYm9vbHY7Ci0gICAgICByZXR1cm4gcHJvdC5yZWFkQm9vbChib29sdik7Ci0gICAgfQotICBjYXNlIFRfQllURToKLSAgICB7Ci0gICAgICBpbnQ4X3QgYnl0ZXY7Ci0gICAgICByZXR1cm4gcHJvdC5yZWFkQnl0ZShieXRldik7Ci0gICAgfQotICBjYXNlIFRfSTE2OgotICAgIHsKLSAgICAgIGludDE2X3QgaTE2OwotICAgICAgcmV0dXJuIHByb3QucmVhZEkxNihpMTYpOwotICAgIH0KLSAgY2FzZSBUX0kzMjoKLSAgICB7Ci0gICAgICBpbnQzMl90IGkzMjsKLSAgICAgIHJldHVybiBwcm90LnJlYWRJMzIoaTMyKTsKLSAgICB9Ci0gIGNhc2UgVF9JNjQ6Ci0gICAgewotICAgICAgaW50NjRfdCBpNjQ7Ci0gICAgICByZXR1cm4gcHJvdC5yZWFkSTY0KGk2NCk7Ci0gICAgfQotICBjYXNlIFRfRE9VQkxFOgotICAgIHsKLSAgICAgIGRvdWJsZSBkdWI7Ci0gICAgICByZXR1cm4gcHJvdC5yZWFkRG91YmxlKGR1Yik7Ci0gICAgfQotICBjYXNlIFRfU1RSSU5HOgotICAgIHsKLSAgICAgIHN0ZDo6c3RyaW5nIHN0cjsKLSAgICAgIHJldHVybiBwcm90LnJlYWRCaW5hcnkoc3RyKTsKLSAgICB9Ci0gIGNhc2UgVF9TVFJVQ1Q6Ci0gICAgewotICAgICAgdWludDMyX3QgcmVzdWx0ID0gMDsKLSAgICAgIHN0ZDo6c3RyaW5nIG5hbWU7Ci0gICAgICBpbnQxNl90IGZpZDsKLSAgICAgIFRUeXBlIGZ0eXBlOwotICAgICAgcmVzdWx0ICs9IHByb3QucmVhZFN0cnVjdEJlZ2luKG5hbWUpOwotICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgcmVzdWx0ICs9IHByb3QucmVhZEZpZWxkQmVnaW4obmFtZSwgZnR5cGUsIGZpZCk7Ci0gICAgICAgIGlmIChmdHlwZSA9PSBUX1NUT1ApIHsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICByZXN1bHQgKz0gc2tpcChwcm90LCBmdHlwZSk7Ci0gICAgICAgIHJlc3VsdCArPSBwcm90LnJlYWRGaWVsZEVuZCgpOwotICAgICAgfQotICAgICAgcmVzdWx0ICs9IHByb3QucmVhZFN0cnVjdEVuZCgpOwotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gIGNhc2UgVF9NQVA6Ci0gICAgewotICAgICAgdWludDMyX3QgcmVzdWx0ID0gMDsKLSAgICAgIFRUeXBlIGtleVR5cGU7Ci0gICAgICBUVHlwZSB2YWxUeXBlOwotICAgICAgdWludDMyX3QgaSwgc2l6ZTsKLSAgICAgIHJlc3VsdCArPSBwcm90LnJlYWRNYXBCZWdpbihrZXlUeXBlLCB2YWxUeXBlLCBzaXplKTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgcmVzdWx0ICs9IHNraXAocHJvdCwga2V5VHlwZSk7Ci0gICAgICAgIHJlc3VsdCArPSBza2lwKHByb3QsIHZhbFR5cGUpOwotICAgICAgfQotICAgICAgcmVzdWx0ICs9IHByb3QucmVhZE1hcEVuZCgpOwotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gIGNhc2UgVF9TRVQ6Ci0gICAgewotICAgICAgdWludDMyX3QgcmVzdWx0ID0gMDsKLSAgICAgIFRUeXBlIGVsZW1UeXBlOwotICAgICAgdWludDMyX3QgaSwgc2l6ZTsKLSAgICAgIHJlc3VsdCArPSBwcm90LnJlYWRTZXRCZWdpbihlbGVtVHlwZSwgc2l6ZSk7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgIHJlc3VsdCArPSBza2lwKHByb3QsIGVsZW1UeXBlKTsKLSAgICAgIH0KLSAgICAgIHJlc3VsdCArPSBwcm90LnJlYWRTZXRFbmQoKTsKLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICBjYXNlIFRfTElTVDoKLSAgICB7Ci0gICAgICB1aW50MzJfdCByZXN1bHQgPSAwOwotICAgICAgVFR5cGUgZWxlbVR5cGU7Ci0gICAgICB1aW50MzJfdCBpLCBzaXplOwotICAgICAgcmVzdWx0ICs9IHByb3QucmVhZExpc3RCZWdpbihlbGVtVHlwZSwgc2l6ZSk7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgIHJlc3VsdCArPSBza2lwKHByb3QsIGVsZW1UeXBlKTsKLSAgICAgIH0KLSAgICAgIHJlc3VsdCArPSBwcm90LnJlYWRMaXN0RW5kKCk7Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgY2FzZSBUX1NUT1A6IGNhc2UgVF9WT0lEOiBjYXNlIFRfVTY0OiBjYXNlIFRfVVRGODogY2FzZSBUX1VURjE2OgotICAgIGJyZWFrOwotICB9Ci0gIHJldHVybiAwOwotfQotCiBzdGF0aWMgY29uc3QgdWludDMyX3QgREVGQVVMVF9SRUNVUlNJT05fTElNSVQgPSA2NDsKIAogLyoqCkBAIC0zMDAsOCArMjIxLDggQEAKICAqCiAgKi8KIGNsYXNzIFRQcm90b2NvbCB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5UUHJvdG9jb2woKSB7fQorcHVibGljOgorICB2aXJ0dWFsIH5UUHJvdG9jb2woKTsKIAogICAvKioKICAgICogV3JpdGluZyBmdW5jdGlvbnMuCkBAIC0zMTMsNyArMjM0LDYgQEAKIAogICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlTWVzc2FnZUVuZF92aXJ0KCkgPSAwOwogCi0KICAgdmlydHVhbCB1aW50MzJfdCB3cml0ZVN0cnVjdEJlZ2luX3ZpcnQoY29uc3QgY2hhciogbmFtZSkgPSAwOwogCiAgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVTdHJ1Y3RFbmRfdmlydCgpID0gMDsKQEAgLTMyNiwxOSArMjQ2LDE2IEBACiAKICAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUZpZWxkU3RvcF92aXJ0KCkgPSAwOwogCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVNYXBCZWdpbl92aXJ0KGNvbnN0IFRUeXBlIGtleVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIHZhbFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpID0gMDsKKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZU1hcEJlZ2luX3ZpcnQoY29uc3QgVFR5cGUga2V5VHlwZSwgY29uc3QgVFR5cGUgdmFsVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSkKKyAgICAgID0gMDsKIAogICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlTWFwRW5kX3ZpcnQoKSA9IDA7CiAKLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUxpc3RCZWdpbl92aXJ0KGNvbnN0IFRUeXBlIGVsZW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSkgPSAwOworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlTGlzdEJlZ2luX3ZpcnQoY29uc3QgVFR5cGUgZWxlbVR5cGUsIGNvbnN0IHVpbnQzMl90IHNpemUpID0gMDsKIAogICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlTGlzdEVuZF92aXJ0KCkgPSAwOwogCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVTZXRCZWdpbl92aXJ0KGNvbnN0IFRUeXBlIGVsZW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKSA9IDA7CisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVTZXRCZWdpbl92aXJ0KGNvbnN0IFRUeXBlIGVsZW1UeXBlLCBjb25zdCB1aW50MzJfdCBzaXplKSA9IDA7CiAKICAgdmlydHVhbCB1aW50MzJfdCB3cml0ZVNldEVuZF92aXJ0KCkgPSAwOwogCkBAIC0zNzAsNyArMjg3LDYgQEAKICAgICByZXR1cm4gd3JpdGVNZXNzYWdlRW5kX3ZpcnQoKTsKICAgfQogCi0KICAgdWludDMyX3Qgd3JpdGVTdHJ1Y3RCZWdpbihjb25zdCBjaGFyKiBuYW1lKSB7CiAgICAgVF9WSVJUVUFMX0NBTEwoKTsKICAgICByZXR1cm4gd3JpdGVTdHJ1Y3RCZWdpbl92aXJ0KG5hbWUpOwpAQCAtMzgxLDkgKzI5Nyw3IEBACiAgICAgcmV0dXJuIHdyaXRlU3RydWN0RW5kX3ZpcnQoKTsKICAgfQogCi0gIHVpbnQzMl90IHdyaXRlRmllbGRCZWdpbihjb25zdCBjaGFyKiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFR5cGUgZmllbGRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCBmaWVsZElkKSB7CisgIHVpbnQzMl90IHdyaXRlRmllbGRCZWdpbihjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBUVHlwZSBmaWVsZFR5cGUsIGNvbnN0IGludDE2X3QgZmllbGRJZCkgewogICAgIFRfVklSVFVBTF9DQUxMKCk7CiAgICAgcmV0dXJuIHdyaXRlRmllbGRCZWdpbl92aXJ0KG5hbWUsIGZpZWxkVHlwZSwgZmllbGRJZCk7CiAgIH0KQEAgLTM5OCw5ICszMTIsNyBAQAogICAgIHJldHVybiB3cml0ZUZpZWxkU3RvcF92aXJ0KCk7CiAgIH0KIAotICB1aW50MzJfdCB3cml0ZU1hcEJlZ2luKGNvbnN0IFRUeXBlIGtleVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFR5cGUgdmFsVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKSB7CisgIHVpbnQzMl90IHdyaXRlTWFwQmVnaW4oY29uc3QgVFR5cGUga2V5VHlwZSwgY29uc3QgVFR5cGUgdmFsVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSkgewogICAgIFRfVklSVFVBTF9DQUxMKCk7CiAgICAgcmV0dXJuIHdyaXRlTWFwQmVnaW5fdmlydChrZXlUeXBlLCB2YWxUeXBlLCBzaXplKTsKICAgfQpAQCAtNDg0LDI1ICszOTYsMTkgQEAKIAogICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRTdHJ1Y3RFbmRfdmlydCgpID0gMDsKIAotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRGaWVsZEJlZ2luX3ZpcnQoc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZSYgZmllbGRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCYgZmllbGRJZCkgPSAwOworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRGaWVsZEJlZ2luX3ZpcnQoc3RkOjpzdHJpbmcmIG5hbWUsIFRUeXBlJiBmaWVsZFR5cGUsIGludDE2X3QmIGZpZWxkSWQpID0gMDsKIAogICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRGaWVsZEVuZF92aXJ0KCkgPSAwOwogCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZE1hcEJlZ2luX3ZpcnQoVFR5cGUmIGtleVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGUmIHZhbFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIHNpemUpID0gMDsKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkTWFwQmVnaW5fdmlydChUVHlwZSYga2V5VHlwZSwgVFR5cGUmIHZhbFR5cGUsIHVpbnQzMl90JiBzaXplKSA9IDA7CiAKICAgdmlydHVhbCB1aW50MzJfdCByZWFkTWFwRW5kX3ZpcnQoKSA9IDA7CiAKLSAgdmlydHVhbCB1aW50MzJfdCByZWFkTGlzdEJlZ2luX3ZpcnQoVFR5cGUmIGVsZW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2l6ZSkgPSAwOworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRMaXN0QmVnaW5fdmlydChUVHlwZSYgZWxlbVR5cGUsIHVpbnQzMl90JiBzaXplKSA9IDA7CiAKICAgdmlydHVhbCB1aW50MzJfdCByZWFkTGlzdEVuZF92aXJ0KCkgPSAwOwogCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZFNldEJlZ2luX3ZpcnQoVFR5cGUmIGVsZW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBzaXplKSA9IDA7CisgIHZpcnR1YWwgdWludDMyX3QgcmVhZFNldEJlZ2luX3ZpcnQoVFR5cGUmIGVsZW1UeXBlLCB1aW50MzJfdCYgc2l6ZSkgPSAwOwogCiAgIHZpcnR1YWwgdWludDMyX3QgcmVhZFNldEVuZF92aXJ0KCkgPSAwOwogCkBAIC01MjQsOSArNDMwLDcgQEAKIAogICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRCaW5hcnlfdmlydChzdGQ6OnN0cmluZyYgc3RyKSA9IDA7CiAKLSAgdWludDMyX3QgcmVhZE1lc3NhZ2VCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTWVzc2FnZVR5cGUmIG1lc3NhZ2VUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIHNlcWlkKSB7CisgIHVpbnQzMl90IHJlYWRNZXNzYWdlQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsIFRNZXNzYWdlVHlwZSYgbWVzc2FnZVR5cGUsIGludDMyX3QmIHNlcWlkKSB7CiAgICAgVF9WSVJUVUFMX0NBTEwoKTsKICAgICByZXR1cm4gcmVhZE1lc3NhZ2VCZWdpbl92aXJ0KG5hbWUsIG1lc3NhZ2VUeXBlLCBzZXFpZCk7CiAgIH0KQEAgLTU0Niw5ICs0NTAsNyBAQAogICAgIHJldHVybiByZWFkU3RydWN0RW5kX3ZpcnQoKTsKICAgfQogCi0gIHVpbnQzMl90IHJlYWRGaWVsZEJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZSYgZmllbGRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90JiBmaWVsZElkKSB7CisgIHVpbnQzMl90IHJlYWRGaWVsZEJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLCBUVHlwZSYgZmllbGRUeXBlLCBpbnQxNl90JiBmaWVsZElkKSB7CiAgICAgVF9WSVJUVUFMX0NBTEwoKTsKICAgICByZXR1cm4gcmVhZEZpZWxkQmVnaW5fdmlydChuYW1lLCBmaWVsZFR5cGUsIGZpZWxkSWQpOwogICB9CkBAIC02NDUsNDQgKzU0Nyw0NSBAQAogICAgIFRfVklSVFVBTF9DQUxMKCk7CiAgICAgcmV0dXJuIHNraXBfdmlydCh0eXBlKTsKICAgfQotICB2aXJ0dWFsIHVpbnQzMl90IHNraXBfdmlydChUVHlwZSB0eXBlKSB7Ci0gICAgcmV0dXJuIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpza2lwKCp0aGlzLCB0eXBlKTsKLSAgfQorICB2aXJ0dWFsIHVpbnQzMl90IHNraXBfdmlydChUVHlwZSB0eXBlKTsKIAotICBpbmxpbmUgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZ2V0VHJhbnNwb3J0KCkgewotICAgIHJldHVybiBwdHJhbnNfOwotICB9CisgIGlubGluZSBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZ2V0VHJhbnNwb3J0KCkgeyByZXR1cm4gcHRyYW5zXzsgfQogCiAgIC8vIFRPRE86IHJlbW92ZSB0aGVzZSB0d28gY2FsbHMsIHRoZXkgYXJlIGZvciBiYWNrd2FyZHMKICAgLy8gY29tcGF0aWJpbGl0eQotICBpbmxpbmUgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZ2V0SW5wdXRUcmFuc3BvcnQoKSB7Ci0gICAgcmV0dXJuIHB0cmFuc187Ci0gIH0KLSAgaW5saW5lIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldE91dHB1dFRyYW5zcG9ydCgpIHsKLSAgICByZXR1cm4gcHRyYW5zXzsKLSAgfQorICBpbmxpbmUgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldElucHV0VHJhbnNwb3J0KCkgeyByZXR1cm4gcHRyYW5zXzsgfQorICBpbmxpbmUgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldE91dHB1dFRyYW5zcG9ydCgpIHsgcmV0dXJuIHB0cmFuc187IH0KIAotICB2b2lkIGluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkgewotICAgIGlmIChyZWN1cnNpb25fbGltaXRfIDwgKytyZWN1cnNpb25fZGVwdGhfKSB7CisgIC8vIGlucHV0IGFuZCBvdXRwdXQgcmVjdXJzaW9uIGRlcHRoIGFyZSBrZXB0IHNlcGFyYXRlIHNvIHRoYXQgb25lIHByb3RvY29sCisgIC8vIGNhbiBiZSB1c2VkIGNvbmN1cnJlbnRseSBmb3IgYm90aCBpbnB1dCBhbmQgb3V0cHV0LgorICB2b2lkIGluY3JlbWVudElucHV0UmVjdXJzaW9uRGVwdGgoKSB7CisgICAgaWYgKHJlY3Vyc2lvbl9saW1pdF8gPCArK2lucHV0X3JlY3Vyc2lvbl9kZXB0aF8pIHsKICAgICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OkRFUFRIX0xJTUlUKTsKICAgICB9CiAgIH0KKyAgdm9pZCBkZWNyZW1lbnRJbnB1dFJlY3Vyc2lvbkRlcHRoKCkgeyAtLWlucHV0X3JlY3Vyc2lvbl9kZXB0aF87IH0KIAotICB2b2lkIGRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkgewotICAgIC0tcmVjdXJzaW9uX2RlcHRoXzsKKyAgdm9pZCBpbmNyZW1lbnRPdXRwdXRSZWN1cnNpb25EZXB0aCgpIHsKKyAgICBpZiAocmVjdXJzaW9uX2xpbWl0XyA8ICsrb3V0cHV0X3JlY3Vyc2lvbl9kZXB0aF8pIHsKKyAgICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OkRFUFRIX0xJTUlUKTsKKyAgICB9CiAgIH0KKyAgdm9pZCBkZWNyZW1lbnRPdXRwdXRSZWN1cnNpb25EZXB0aCgpIHsgLS1vdXRwdXRfcmVjdXJzaW9uX2RlcHRoXzsgfQogCi0gcHJvdGVjdGVkOgotICBUUHJvdG9jb2woYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gcHRyYW5zKQotICAgIDogcHRyYW5zXyhwdHJhbnMpCi0gICAgLCByZWN1cnNpb25fZGVwdGhfKDApCi0gICAgLCByZWN1cnNpb25fbGltaXRfKERFRkFVTFRfUkVDVVJTSU9OX0xJTUlUKSB7fQorICB1aW50MzJfdCBnZXRSZWN1cnNpb25MaW1pdCgpIGNvbnN0IHtyZXR1cm4gcmVjdXJzaW9uX2xpbWl0Xzt9CisgIHZvaWQgc2V0UmVjdXJpc2lvbkxpbWl0KHVpbnQzMl90IGRlcHRoKSB7cmVjdXJzaW9uX2xpbWl0XyA9IGRlcHRoO30KIAotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBwdHJhbnNfOworcHJvdGVjdGVkOgorICBUUHJvdG9jb2woc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHB0cmFucykKKyAgICA6IHB0cmFuc18ocHRyYW5zKSwgaW5wdXRfcmVjdXJzaW9uX2RlcHRoXygwKSwgb3V0cHV0X3JlY3Vyc2lvbl9kZXB0aF8oMCksIHJlY3Vyc2lvbl9saW1pdF8oREVGQVVMVF9SRUNVUlNJT05fTElNSVQpCisgIHt9CiAKLSBwcml2YXRlOgorICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gcHRyYW5zXzsKKworcHJpdmF0ZToKICAgVFByb3RvY29sKCkge30KLSAgdWludDMyX3QgcmVjdXJzaW9uX2RlcHRoXzsKKyAgdWludDMyX3QgaW5wdXRfcmVjdXJzaW9uX2RlcHRoXzsKKyAgdWludDMyX3Qgb3V0cHV0X3JlY3Vyc2lvbl9kZXB0aF87CiAgIHVpbnQzMl90IHJlY3Vyc2lvbl9saW1pdF87CiB9OwogCkBAIC02OTAsMTIgKzU5MywxNyBAQAogICogQ29uc3RydWN0cyBpbnB1dCBhbmQgb3V0cHV0IHByb3RvY29sIG9iamVjdHMgZ2l2ZW4gdHJhbnNwb3J0cy4KICAqLwogY2xhc3MgVFByb3RvY29sRmFjdG9yeSB7Ci0gcHVibGljOgorcHVibGljOgogICBUUHJvdG9jb2xGYWN0b3J5KCkge30KIAotICB2aXJ0dWFsIH5UUHJvdG9jb2xGYWN0b3J5KCkge30KKyAgdmlydHVhbCB+VFByb3RvY29sRmFjdG9yeSgpOwogCi0gIHZpcnR1YWwgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBnZXRQcm90b2NvbChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFucykgPSAwOworICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGdldFByb3RvY29sKHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFucykgPSAwOworICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGdldFByb3RvY29sKHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBpblRyYW5zLAorICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IG91dFRyYW5zKSB7CisgICAgKHZvaWQpb3V0VHJhbnM7CisgICAgcmV0dXJuIGdldFByb3RvY29sKGluVHJhbnMpOworICB9CiB9OwogCiAvKioKQEAgLTcwNCw5ICs2MTIsMTUyIEBACiAgKiBUaGlzIGNsYXNzIGRvZXMgbm90aGluZywgYW5kIHNob3VsZCBuZXZlciBiZSBpbnN0YW50aWF0ZWQuCiAgKiBJdCBpcyB1c2VkIG9ubHkgYnkgdGhlIGdlbmVyYXRvciBjb2RlLgogICovCi1jbGFzcyBURHVtbXlQcm90b2NvbCA6IHB1YmxpYyBUUHJvdG9jb2wgeworY2xhc3MgVER1bW15UHJvdG9jb2wgOiBwdWJsaWMgVFByb3RvY29sIHt9OworCisvLyBUaGlzIGlzIHRoZSBkZWZhdWx0IC8gbGVnYWN5IGNob2ljZQorc3RydWN0IFROZXR3b3JrQmlnRW5kaWFuCit7CisgIHN0YXRpYyB1aW50MTZfdCB0b1dpcmUxNih1aW50MTZfdCB4KSAgIHtyZXR1cm4gaHRvbnMoeCk7fQorICBzdGF0aWMgdWludDMyX3QgdG9XaXJlMzIodWludDMyX3QgeCkgICB7cmV0dXJuIGh0b25sKHgpO30KKyAgc3RhdGljIHVpbnQ2NF90IHRvV2lyZTY0KHVpbnQ2NF90IHgpICAge3JldHVybiBUSFJJRlRfaHRvbmxsKHgpO30KKyAgc3RhdGljIHVpbnQxNl90IGZyb21XaXJlMTYodWludDE2X3QgeCkge3JldHVybiBudG9ocyh4KTt9CisgIHN0YXRpYyB1aW50MzJfdCBmcm9tV2lyZTMyKHVpbnQzMl90IHgpIHtyZXR1cm4gbnRvaGwoeCk7fQorICBzdGF0aWMgdWludDY0X3QgZnJvbVdpcmU2NCh1aW50NjRfdCB4KSB7cmV0dXJuIFRIUklGVF9udG9obGwoeCk7fQogfTsKIAorLy8gT24gbW9zdCBzeXN0ZW1zLCB0aGlzIHdpbGwgYmUgYSBiaXQgZmFzdGVyIHRoYW4gVE5ldHdvcmtCaWdFbmRpYW4KK3N0cnVjdCBUTmV0d29ya0xpdHRsZUVuZGlhbgoreworICBzdGF0aWMgdWludDE2X3QgdG9XaXJlMTYodWludDE2X3QgeCkgICB7cmV0dXJuIFRIUklGVF9odG9sZXMoeCk7fQorICBzdGF0aWMgdWludDMyX3QgdG9XaXJlMzIodWludDMyX3QgeCkgICB7cmV0dXJuIFRIUklGVF9odG9sZWwoeCk7fQorICBzdGF0aWMgdWludDY0X3QgdG9XaXJlNjQodWludDY0X3QgeCkgICB7cmV0dXJuIFRIUklGVF9odG9sZWxsKHgpO30KKyAgc3RhdGljIHVpbnQxNl90IGZyb21XaXJlMTYodWludDE2X3QgeCkge3JldHVybiBUSFJJRlRfbGV0b2hzKHgpO30KKyAgc3RhdGljIHVpbnQzMl90IGZyb21XaXJlMzIodWludDMyX3QgeCkge3JldHVybiBUSFJJRlRfbGV0b2hsKHgpO30KKyAgc3RhdGljIHVpbnQ2NF90IGZyb21XaXJlNjQodWludDY0X3QgeCkge3JldHVybiBUSFJJRlRfbGV0b2hsbCh4KTt9Cit9OworCitzdHJ1Y3QgVE91dHB1dFJlY3Vyc2lvblRyYWNrZXIgeworICBUUHJvdG9jb2wgJnByb3RfOworICBUT3V0cHV0UmVjdXJzaW9uVHJhY2tlcihUUHJvdG9jb2wgJnByb3QpIDogcHJvdF8ocHJvdCkgeworICAgIHByb3RfLmluY3JlbWVudE91dHB1dFJlY3Vyc2lvbkRlcHRoKCk7CisgIH0KKyAgflRPdXRwdXRSZWN1cnNpb25UcmFja2VyKCkgeworICAgIHByb3RfLmRlY3JlbWVudE91dHB1dFJlY3Vyc2lvbkRlcHRoKCk7CisgIH0KK307CisKK3N0cnVjdCBUSW5wdXRSZWN1cnNpb25UcmFja2VyIHsKKyAgVFByb3RvY29sICZwcm90XzsKKyAgVElucHV0UmVjdXJzaW9uVHJhY2tlcihUUHJvdG9jb2wgJnByb3QpIDogcHJvdF8ocHJvdCkgeworICAgIHByb3RfLmluY3JlbWVudElucHV0UmVjdXJzaW9uRGVwdGgoKTsKKyAgfQorICB+VElucHV0UmVjdXJzaW9uVHJhY2tlcigpIHsKKyAgICBwcm90Xy5kZWNyZW1lbnRJbnB1dFJlY3Vyc2lvbkRlcHRoKCk7CisgIH0KK307CisKKy8qKgorICogSGVscGVyIHRlbXBsYXRlIGZvciBpbXBsZW1lbnRpbmcgVFByb3RvY29sOjpza2lwKCkuCisgKgorICogVGVtcGxhdGl6ZWQgdG8gYXZvaWQgaGF2aW5nIHRvIG1ha2UgdmlydHVhbCBmdW5jdGlvbiBjYWxscy4KKyAqLwordGVtcGxhdGUgPGNsYXNzIFByb3RvY29sXz4KK3VpbnQzMl90IHNraXAoUHJvdG9jb2xfJiBwcm90LCBUVHlwZSB0eXBlKSB7CisgIFRJbnB1dFJlY3Vyc2lvblRyYWNrZXIgdHJhY2tlcihwcm90KTsKKworICBzd2l0Y2ggKHR5cGUpIHsKKyAgY2FzZSBUX0JPT0w6IHsKKyAgICBib29sIGJvb2x2OworICAgIHJldHVybiBwcm90LnJlYWRCb29sKGJvb2x2KTsKKyAgfQorICBjYXNlIFRfQllURTogeworICAgIGludDhfdCBieXRldiA9IDA7CisgICAgcmV0dXJuIHByb3QucmVhZEJ5dGUoYnl0ZXYpOworICB9CisgIGNhc2UgVF9JMTY6IHsKKyAgICBpbnQxNl90IGkxNjsKKyAgICByZXR1cm4gcHJvdC5yZWFkSTE2KGkxNik7CisgIH0KKyAgY2FzZSBUX0kzMjogeworICAgIGludDMyX3QgaTMyOworICAgIHJldHVybiBwcm90LnJlYWRJMzIoaTMyKTsKKyAgfQorICBjYXNlIFRfSTY0OiB7CisgICAgaW50NjRfdCBpNjQ7CisgICAgcmV0dXJuIHByb3QucmVhZEk2NChpNjQpOworICB9CisgIGNhc2UgVF9ET1VCTEU6IHsKKyAgICBkb3VibGUgZHViOworICAgIHJldHVybiBwcm90LnJlYWREb3VibGUoZHViKTsKKyAgfQorICBjYXNlIFRfU1RSSU5HOiB7CisgICAgc3RkOjpzdHJpbmcgc3RyOworICAgIHJldHVybiBwcm90LnJlYWRCaW5hcnkoc3RyKTsKKyAgfQorICBjYXNlIFRfU1RSVUNUOiB7CisgICAgdWludDMyX3QgcmVzdWx0ID0gMDsKKyAgICBzdGQ6OnN0cmluZyBuYW1lOworICAgIGludDE2X3QgZmlkOworICAgIFRUeXBlIGZ0eXBlOworICAgIHJlc3VsdCArPSBwcm90LnJlYWRTdHJ1Y3RCZWdpbihuYW1lKTsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgcmVzdWx0ICs9IHByb3QucmVhZEZpZWxkQmVnaW4obmFtZSwgZnR5cGUsIGZpZCk7CisgICAgICBpZiAoZnR5cGUgPT0gVF9TVE9QKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgcmVzdWx0ICs9IHNraXAocHJvdCwgZnR5cGUpOworICAgICAgcmVzdWx0ICs9IHByb3QucmVhZEZpZWxkRW5kKCk7CisgICAgfQorICAgIHJlc3VsdCArPSBwcm90LnJlYWRTdHJ1Y3RFbmQoKTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisgIGNhc2UgVF9NQVA6IHsKKyAgICB1aW50MzJfdCByZXN1bHQgPSAwOworICAgIFRUeXBlIGtleVR5cGU7CisgICAgVFR5cGUgdmFsVHlwZTsKKyAgICB1aW50MzJfdCBpLCBzaXplOworICAgIHJlc3VsdCArPSBwcm90LnJlYWRNYXBCZWdpbihrZXlUeXBlLCB2YWxUeXBlLCBzaXplKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICByZXN1bHQgKz0gc2tpcChwcm90LCBrZXlUeXBlKTsKKyAgICAgIHJlc3VsdCArPSBza2lwKHByb3QsIHZhbFR5cGUpOworICAgIH0KKyAgICByZXN1bHQgKz0gcHJvdC5yZWFkTWFwRW5kKCk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorICBjYXNlIFRfU0VUOiB7CisgICAgdWludDMyX3QgcmVzdWx0ID0gMDsKKyAgICBUVHlwZSBlbGVtVHlwZTsKKyAgICB1aW50MzJfdCBpLCBzaXplOworICAgIHJlc3VsdCArPSBwcm90LnJlYWRTZXRCZWdpbihlbGVtVHlwZSwgc2l6ZSk7CisgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgcmVzdWx0ICs9IHNraXAocHJvdCwgZWxlbVR5cGUpOworICAgIH0KKyAgICByZXN1bHQgKz0gcHJvdC5yZWFkU2V0RW5kKCk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorICBjYXNlIFRfTElTVDogeworICAgIHVpbnQzMl90IHJlc3VsdCA9IDA7CisgICAgVFR5cGUgZWxlbVR5cGU7CisgICAgdWludDMyX3QgaSwgc2l6ZTsKKyAgICByZXN1bHQgKz0gcHJvdC5yZWFkTGlzdEJlZ2luKGVsZW1UeXBlLCBzaXplKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICByZXN1bHQgKz0gc2tpcChwcm90LCBlbGVtVHlwZSk7CisgICAgfQorICAgIHJlc3VsdCArPSBwcm90LnJlYWRMaXN0RW5kKCk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorICBjYXNlIFRfU1RPUDoKKyAgY2FzZSBUX1ZPSUQ6CisgIGNhc2UgVF9VNjQ6CisgIGNhc2UgVF9VVEY4OgorICBjYXNlIFRfVVRGMTY6CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBKTsKKyAgfQorICByZXR1cm4gMDsKK30KKwogfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbAogCiAjZW5kaWYgLy8gI2RlZmluZSBfVEhSSUZUX1BST1RPQ09MX1RQUk9UT0NPTF9IXyAxCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLmggYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLmgKaW5kZXggNTcwZTk3Ny4uNzQzYTBmNCAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xEZWNvcmF0b3IuaApAQCAtMjEsMTEzICsyMSwxMzEgQEAKICNkZWZpbmUgVEhSSUZUX1RQUk9UT0NPTERFQ09SQVRPUl9IXyAxCiAKICNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmg+Ci0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+CisjaW5jbHVkZSA8bWVtb3J5PgogCi1uYW1lc3BhY2UgYXBhY2hlCi17Ci0gICAgbmFtZXNwYWNlIHRocmlmdAotICAgIHsKLSAgICAgICAgbmFtZXNwYWNlIHByb3RvY29sCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBwcm90b2NvbCB7Cit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7CiAKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogPGNvZGU+VFByb3RvY29sRGVjb3JhdG9yPC9jb2RlPiBmb3J3YXJkcyBhbGwgcmVxdWVzdHMgdG8gYW4gZW5jbG9zZWQKLSAgICAgICAgICAgICAqIDxjb2RlPlRQcm90b2NvbDwvY29kZT4gaW5zdGFuY2UsIHByb3ZpZGluZyBhIHdheSB0byBhdXRob3IgY29uY2lzZQotICAgICAgICAgICAgICogY29uY3JldGUgZGVjb3JhdG9yIHN1YmNsYXNzZXMuCi0gICAgICAgICAgICAgKgotICAgICAgICAgICAgICogPHA+U2VlIHAuMTc1IG9mIERlc2lnbiBQYXR0ZXJucyAoYnkgR2FtbWEgZXQgYWwuKTwvcD4KLSAgICAgICAgICAgICAqCi0gICAgICAgICAgICAgKiBAc2VlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VE11bHRpcGxleGVkUHJvdG9jb2wKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgY2xhc3MgVFByb3RvY29sRGVjb3JhdG9yIDogcHVibGljIFRQcm90b2NvbAotICAgICAgICAgICAgewotICAgICAgICAgICAgcHVibGljOgotICAgICAgICAgICAgICAgIHZpcnR1YWwgflRQcm90b2NvbERlY29yYXRvcigpIHt9CisvKioKKyAqIDxjb2RlPlRQcm90b2NvbERlY29yYXRvcjwvY29kZT4gZm9yd2FyZHMgYWxsIHJlcXVlc3RzIHRvIGFuIGVuY2xvc2VkCisgKiA8Y29kZT5UUHJvdG9jb2w8L2NvZGU+IGluc3RhbmNlLCBwcm92aWRpbmcgYSB3YXkgdG8gYXV0aG9yIGNvbmNpc2UKKyAqIGNvbmNyZXRlIGRlY29yYXRvciBzdWJjbGFzc2VzLgorICoKKyAqIDxwPlNlZSBwLjE3NSBvZiBEZXNpZ24gUGF0dGVybnMgKGJ5IEdhbW1hIGV0IGFsLik8L3A+CisgKgorICogQHNlZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRNdWx0aXBsZXhlZFByb3RvY29sCisgKi8KK2NsYXNzIFRQcm90b2NvbERlY29yYXRvciA6IHB1YmxpYyBUUHJvdG9jb2wgeworcHVibGljOgorICB2aXJ0dWFsIH5UUHJvdG9jb2xEZWNvcmF0b3IoKSB7fQogCi0gICAgICAgICAgICAgICAgLy8gRGVzYzogSW5pdGlhbGl6ZXMgdGhlIHByb3RvY29sIGRlY29yYXRvciBvYmplY3QuCi0gICAgICAgICAgICAgICAgVFByb3RvY29sRGVjb3JhdG9yKCBzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG8gKQotICAgICAgICAgICAgICAgICAgICA6IFRQcm90b2NvbChwcm90by0+Z2V0VHJhbnNwb3J0KCkpLCBwcm90b2NvbChwcm90bykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgfQorICAvLyBEZXNjOiBJbml0aWFsaXplcyB0aGUgcHJvdG9jb2wgZGVjb3JhdG9yIG9iamVjdC4KKyAgVFByb3RvY29sRGVjb3JhdG9yKHNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90bykKKyAgICA6IFRQcm90b2NvbChwcm90by0+Z2V0VHJhbnNwb3J0KCkpLCBwcm90b2NvbChwcm90bykge30KIAotICAgICAgICAgICAgICAgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVNZXNzYWdlQmVnaW5fdmlydCgKLSAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IFRNZXNzYWdlVHlwZSBtZXNzYWdlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBzZXFpZCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm90b2NvbC0+d3JpdGVNZXNzYWdlQmVnaW4obmFtZSwgbWVzc2FnZVR5cGUsIHNlcWlkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdmlydHVhbCB1aW50MzJfdCB3cml0ZU1lc3NhZ2VFbmRfdmlydCgpIHsgcmV0dXJuIHByb3RvY29sLT53cml0ZU1lc3NhZ2VFbmQoKTsgfQotICAgICAgICAgICAgICAgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVTdHJ1Y3RCZWdpbl92aXJ0KGNvbnN0IGNoYXIqIG5hbWUpIHsgcmV0dXJuIHByb3RvY29sLT53cml0ZVN0cnVjdEJlZ2luKG5hbWUpOyB9Ci0gICAgICAgICAgICAgICAgdmlydHVhbCB1aW50MzJfdCB3cml0ZVN0cnVjdEVuZF92aXJ0KCkgeyByZXR1cm4gcHJvdG9jb2wtPndyaXRlU3RydWN0RW5kKCk7IH0KKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZU1lc3NhZ2VCZWdpbl92aXJ0KGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVE1lc3NhZ2VUeXBlIG1lc3NhZ2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBzZXFpZCkgeworICAgIHJldHVybiBwcm90b2NvbC0+d3JpdGVNZXNzYWdlQmVnaW4obmFtZSwgbWVzc2FnZVR5cGUsIHNlcWlkKTsKKyAgfQorICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlTWVzc2FnZUVuZF92aXJ0KCkgeyByZXR1cm4gcHJvdG9jb2wtPndyaXRlTWVzc2FnZUVuZCgpOyB9CisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVTdHJ1Y3RCZWdpbl92aXJ0KGNvbnN0IGNoYXIqIG5hbWUpIHsKKyAgICByZXR1cm4gcHJvdG9jb2wtPndyaXRlU3RydWN0QmVnaW4obmFtZSk7CisgIH0KKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZVN0cnVjdEVuZF92aXJ0KCkgeyByZXR1cm4gcHJvdG9jb2wtPndyaXRlU3RydWN0RW5kKCk7IH0KIAotICAgICAgICAgICAgICAgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVGaWVsZEJlZ2luX3ZpcnQoY29uc3QgY2hhciogbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgVFR5cGUgZmllbGRUeXBlLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90IGZpZWxkSWQpIHsgcmV0dXJuIHByb3RvY29sLT53cml0ZUZpZWxkQmVnaW4obmFtZSxmaWVsZFR5cGUsZmllbGRJZCk7IH0KKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUZpZWxkQmVnaW5fdmlydChjb25zdCBjaGFyKiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIGZpZWxkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90IGZpZWxkSWQpIHsKKyAgICByZXR1cm4gcHJvdG9jb2wtPndyaXRlRmllbGRCZWdpbihuYW1lLCBmaWVsZFR5cGUsIGZpZWxkSWQpOworICB9CiAKLSAgICAgICAgICAgICAgICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlRmllbGRFbmRfdmlydCgpICB7IHJldHVybiBwcm90b2NvbC0+d3JpdGVGaWVsZEVuZCgpOyB9Ci0gICAgICAgICAgICAgICAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUZpZWxkU3RvcF92aXJ0KCkgeyByZXR1cm4gcHJvdG9jb2wtPndyaXRlRmllbGRTdG9wKCk7IH0KKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUZpZWxkRW5kX3ZpcnQoKSB7IHJldHVybiBwcm90b2NvbC0+d3JpdGVGaWVsZEVuZCgpOyB9CisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVGaWVsZFN0b3BfdmlydCgpIHsgcmV0dXJuIHByb3RvY29sLT53cml0ZUZpZWxkU3RvcCgpOyB9CiAKLSAgICAgICAgICAgICAgICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlTWFwQmVnaW5fdmlydChjb25zdCBUVHlwZSBrZXlUeXBlLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSB2YWxUeXBlLAotICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKSB7IHJldHVybiBwcm90b2NvbC0+d3JpdGVNYXBCZWdpbihrZXlUeXBlLHZhbFR5cGUsc2l6ZSk7IH0KKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZU1hcEJlZ2luX3ZpcnQoY29uc3QgVFR5cGUga2V5VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFR5cGUgdmFsVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSkgeworICAgIHJldHVybiBwcm90b2NvbC0+d3JpdGVNYXBCZWdpbihrZXlUeXBlLCB2YWxUeXBlLCBzaXplKTsKKyAgfQogCi0gICAgICAgICAgICAgICAgdmlydHVhbCB1aW50MzJfdCB3cml0ZU1hcEVuZF92aXJ0KCkgeyByZXR1cm4gcHJvdG9jb2wtPndyaXRlTWFwRW5kKCk7IH0KKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZU1hcEVuZF92aXJ0KCkgeyByZXR1cm4gcHJvdG9jb2wtPndyaXRlTWFwRW5kKCk7IH0KIAotICAgICAgICAgICAgICAgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVMaXN0QmVnaW5fdmlydChjb25zdCBUVHlwZSBlbGVtVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSkgeyByZXR1cm4gcHJvdG9jb2wtPndyaXRlTGlzdEJlZ2luKGVsZW1UeXBlLHNpemUpOyB9Ci0gICAgICAgICAgICAgICAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUxpc3RFbmRfdmlydCgpIHsgcmV0dXJuIHByb3RvY29sLT53cml0ZUxpc3RFbmQoKTsgfQorICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlTGlzdEJlZ2luX3ZpcnQoY29uc3QgVFR5cGUgZWxlbVR5cGUsIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKKyAgICByZXR1cm4gcHJvdG9jb2wtPndyaXRlTGlzdEJlZ2luKGVsZW1UeXBlLCBzaXplKTsKKyAgfQorICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlTGlzdEVuZF92aXJ0KCkgeyByZXR1cm4gcHJvdG9jb2wtPndyaXRlTGlzdEVuZCgpOyB9CiAKLSAgICAgICAgICAgICAgICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlU2V0QmVnaW5fdmlydChjb25zdCBUVHlwZSBlbGVtVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSkgeyByZXR1cm4gcHJvdG9jb2wtPndyaXRlU2V0QmVnaW4oZWxlbVR5cGUsc2l6ZSk7IH0KLSAgICAgICAgICAgICAgICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlU2V0RW5kX3ZpcnQoKSB7IHJldHVybiBwcm90b2NvbC0+d3JpdGVTZXRFbmQoKTsgfQorICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlU2V0QmVnaW5fdmlydChjb25zdCBUVHlwZSBlbGVtVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSkgeworICAgIHJldHVybiBwcm90b2NvbC0+d3JpdGVTZXRCZWdpbihlbGVtVHlwZSwgc2l6ZSk7CisgIH0KKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZVNldEVuZF92aXJ0KCkgeyByZXR1cm4gcHJvdG9jb2wtPndyaXRlU2V0RW5kKCk7IH0KIAotICAgICAgICAgICAgICAgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVCb29sX3ZpcnQoY29uc3QgYm9vbCB2YWx1ZSkgIHsgcmV0dXJuIHByb3RvY29sLT53cml0ZUJvb2wodmFsdWUpOyB9Ci0gICAgICAgICAgICAgICAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUJ5dGVfdmlydChjb25zdCBpbnQ4X3QgYnl0ZSkgeyByZXR1cm4gcHJvdG9jb2wtPndyaXRlQnl0ZShieXRlKTsgfQotICAgICAgICAgICAgICAgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVJMTZfdmlydChjb25zdCBpbnQxNl90IGkxNikgIHsgcmV0dXJuIHByb3RvY29sLT53cml0ZUkxNihpMTYpOyB9Ci0gICAgICAgICAgICAgICAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUkzMl92aXJ0KGNvbnN0IGludDMyX3QgaTMyKSAgeyByZXR1cm4gcHJvdG9jb2wtPndyaXRlSTMyKGkzMik7IH0KLSAgICAgICAgICAgICAgICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlSTY0X3ZpcnQoY29uc3QgaW50NjRfdCBpNjQpICB7IHJldHVybiBwcm90b2NvbC0+d3JpdGVJNjQoaTY0KTsgfQorICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlQm9vbF92aXJ0KGNvbnN0IGJvb2wgdmFsdWUpIHsgcmV0dXJuIHByb3RvY29sLT53cml0ZUJvb2wodmFsdWUpOyB9CisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVCeXRlX3ZpcnQoY29uc3QgaW50OF90IGJ5dGUpIHsgcmV0dXJuIHByb3RvY29sLT53cml0ZUJ5dGUoYnl0ZSk7IH0KKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUkxNl92aXJ0KGNvbnN0IGludDE2X3QgaTE2KSB7IHJldHVybiBwcm90b2NvbC0+d3JpdGVJMTYoaTE2KTsgfQorICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlSTMyX3ZpcnQoY29uc3QgaW50MzJfdCBpMzIpIHsgcmV0dXJuIHByb3RvY29sLT53cml0ZUkzMihpMzIpOyB9CisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVJNjRfdmlydChjb25zdCBpbnQ2NF90IGk2NCkgeyByZXR1cm4gcHJvdG9jb2wtPndyaXRlSTY0KGk2NCk7IH0KIAotICAgICAgICAgICAgICAgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVEb3VibGVfdmlydChjb25zdCBkb3VibGUgZHViKSB7IHJldHVybiBwcm90b2NvbC0+d3JpdGVEb3VibGUoZHViKTsgfQotICAgICAgICAgICAgICAgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVTdHJpbmdfdmlydChjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7IHJldHVybiBwcm90b2NvbC0+d3JpdGVTdHJpbmcoc3RyKTsgfQotICAgICAgICAgICAgICAgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVCaW5hcnlfdmlydChjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7IHJldHVybiBwcm90b2NvbC0+d3JpdGVCaW5hcnkoc3RyKTsgfQorICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlRG91YmxlX3ZpcnQoY29uc3QgZG91YmxlIGR1YikgeyByZXR1cm4gcHJvdG9jb2wtPndyaXRlRG91YmxlKGR1Yik7IH0KKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZVN0cmluZ192aXJ0KGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsgcmV0dXJuIHByb3RvY29sLT53cml0ZVN0cmluZyhzdHIpOyB9CisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVCaW5hcnlfdmlydChjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7IHJldHVybiBwcm90b2NvbC0+d3JpdGVCaW5hcnkoc3RyKTsgfQogCi0gICAgICAgICAgICAgICAgdmlydHVhbCB1aW50MzJfdCByZWFkTWVzc2FnZUJlZ2luX3ZpcnQoc3RkOjpzdHJpbmcmIG5hbWUsIFRNZXNzYWdlVHlwZSYgbWVzc2FnZVR5cGUsIGludDMyX3QmIHNlcWlkKSB7IHJldHVybiBwcm90b2NvbC0+cmVhZE1lc3NhZ2VCZWdpbihuYW1lLG1lc3NhZ2VUeXBlLHNlcWlkKTsgfQotICAgICAgICAgICAgICAgIHZpcnR1YWwgdWludDMyX3QgcmVhZE1lc3NhZ2VFbmRfdmlydCgpIHsgcmV0dXJuIHByb3RvY29sLT5yZWFkTWVzc2FnZUVuZCgpOyB9CisgIHZpcnR1YWwgdWludDMyX3QgcmVhZE1lc3NhZ2VCZWdpbl92aXJ0KHN0ZDo6c3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTWVzc2FnZVR5cGUmIG1lc3NhZ2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBzZXFpZCkgeworICAgIHJldHVybiBwcm90b2NvbC0+cmVhZE1lc3NhZ2VCZWdpbihuYW1lLCBtZXNzYWdlVHlwZSwgc2VxaWQpOworICB9CisgIHZpcnR1YWwgdWludDMyX3QgcmVhZE1lc3NhZ2VFbmRfdmlydCgpIHsgcmV0dXJuIHByb3RvY29sLT5yZWFkTWVzc2FnZUVuZCgpOyB9CiAKLSAgICAgICAgICAgICAgICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRTdHJ1Y3RCZWdpbl92aXJ0KHN0ZDo6c3RyaW5nJiBuYW1lKSB7IHJldHVybiBwcm90b2NvbC0+cmVhZFN0cnVjdEJlZ2luKG5hbWUpOyB9Ci0gICAgICAgICAgICAgICAgdmlydHVhbCB1aW50MzJfdCByZWFkU3RydWN0RW5kX3ZpcnQoKSB7IHJldHVybiBwcm90b2NvbC0+cmVhZFN0cnVjdEVuZCgpOyB9CisgIHZpcnR1YWwgdWludDMyX3QgcmVhZFN0cnVjdEJlZ2luX3ZpcnQoc3RkOjpzdHJpbmcmIG5hbWUpIHsKKyAgICByZXR1cm4gcHJvdG9jb2wtPnJlYWRTdHJ1Y3RCZWdpbihuYW1lKTsKKyAgfQorICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRTdHJ1Y3RFbmRfdmlydCgpIHsgcmV0dXJuIHByb3RvY29sLT5yZWFkU3RydWN0RW5kKCk7IH0KIAotICAgICAgICAgICAgICAgIHZpcnR1YWwgdWludDMyX3QgcmVhZEZpZWxkQmVnaW5fdmlydChzdGQ6OnN0cmluZyYgbmFtZSwgVFR5cGUmIGZpZWxkVHlwZSwgaW50MTZfdCYgZmllbGRJZCkgeyByZXR1cm4gcHJvdG9jb2wtPnJlYWRGaWVsZEJlZ2luKG5hbWUsIGZpZWxkVHlwZSwgZmllbGRJZCk7IH0KLSAgICAgICAgICAgICAgICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRGaWVsZEVuZF92aXJ0KCkgeyByZXR1cm4gcHJvdG9jb2wtPnJlYWRGaWVsZEVuZCgpOyB9CisgIHZpcnR1YWwgdWludDMyX3QgcmVhZEZpZWxkQmVnaW5fdmlydChzdGQ6OnN0cmluZyYgbmFtZSwgVFR5cGUmIGZpZWxkVHlwZSwgaW50MTZfdCYgZmllbGRJZCkgeworICAgIHJldHVybiBwcm90b2NvbC0+cmVhZEZpZWxkQmVnaW4obmFtZSwgZmllbGRUeXBlLCBmaWVsZElkKTsKKyAgfQorICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRGaWVsZEVuZF92aXJ0KCkgeyByZXR1cm4gcHJvdG9jb2wtPnJlYWRGaWVsZEVuZCgpOyB9CiAKLSAgICAgICAgICAgICAgICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRNYXBCZWdpbl92aXJ0KFRUeXBlJiBrZXlUeXBlLCBUVHlwZSYgdmFsVHlwZSwgdWludDMyX3QmIHNpemUpIHsgcmV0dXJuIHByb3RvY29sLT5yZWFkTWFwQmVnaW4oa2V5VHlwZSx2YWxUeXBlLHNpemUpOyB9Ci0gICAgICAgICAgICAgICAgdmlydHVhbCB1aW50MzJfdCByZWFkTWFwRW5kX3ZpcnQoKSB7IHJldHVybiBwcm90b2NvbC0+cmVhZE1hcEVuZCgpOyB9CisgIHZpcnR1YWwgdWludDMyX3QgcmVhZE1hcEJlZ2luX3ZpcnQoVFR5cGUmIGtleVR5cGUsIFRUeXBlJiB2YWxUeXBlLCB1aW50MzJfdCYgc2l6ZSkgeworICAgIHJldHVybiBwcm90b2NvbC0+cmVhZE1hcEJlZ2luKGtleVR5cGUsIHZhbFR5cGUsIHNpemUpOworICB9CisgIHZpcnR1YWwgdWludDMyX3QgcmVhZE1hcEVuZF92aXJ0KCkgeyByZXR1cm4gcHJvdG9jb2wtPnJlYWRNYXBFbmQoKTsgfQogCi0gICAgICAgICAgICAgICAgdmlydHVhbCB1aW50MzJfdCByZWFkTGlzdEJlZ2luX3ZpcnQoVFR5cGUmIGVsZW1UeXBlLCB1aW50MzJfdCYgc2l6ZSkgeyByZXR1cm4gcHJvdG9jb2wtPnJlYWRMaXN0QmVnaW4oZWxlbVR5cGUsc2l6ZSk7IH0KLSAgICAgICAgICAgICAgICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRMaXN0RW5kX3ZpcnQoKSB7IHJldHVybiBwcm90b2NvbC0+cmVhZExpc3RFbmQoKTsgfQorICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRMaXN0QmVnaW5fdmlydChUVHlwZSYgZWxlbVR5cGUsIHVpbnQzMl90JiBzaXplKSB7CisgICAgcmV0dXJuIHByb3RvY29sLT5yZWFkTGlzdEJlZ2luKGVsZW1UeXBlLCBzaXplKTsKKyAgfQorICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRMaXN0RW5kX3ZpcnQoKSB7IHJldHVybiBwcm90b2NvbC0+cmVhZExpc3RFbmQoKTsgfQogCi0gICAgICAgICAgICAgICAgdmlydHVhbCB1aW50MzJfdCByZWFkU2V0QmVnaW5fdmlydChUVHlwZSYgZWxlbVR5cGUsIHVpbnQzMl90JiBzaXplKSB7IHJldHVybiBwcm90b2NvbC0+cmVhZFNldEJlZ2luKGVsZW1UeXBlLHNpemUpOyB9Ci0gICAgICAgICAgICAgICAgdmlydHVhbCB1aW50MzJfdCByZWFkU2V0RW5kX3ZpcnQoKSB7IHJldHVybiBwcm90b2NvbC0+cmVhZFNldEVuZCgpOyB9CisgIHZpcnR1YWwgdWludDMyX3QgcmVhZFNldEJlZ2luX3ZpcnQoVFR5cGUmIGVsZW1UeXBlLCB1aW50MzJfdCYgc2l6ZSkgeworICAgIHJldHVybiBwcm90b2NvbC0+cmVhZFNldEJlZ2luKGVsZW1UeXBlLCBzaXplKTsKKyAgfQorICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRTZXRFbmRfdmlydCgpIHsgcmV0dXJuIHByb3RvY29sLT5yZWFkU2V0RW5kKCk7IH0KIAotICAgICAgICAgICAgICAgIHZpcnR1YWwgdWludDMyX3QgcmVhZEJvb2xfdmlydChib29sJiB2YWx1ZSkgeyByZXR1cm4gcHJvdG9jb2wtPnJlYWRCb29sKHZhbHVlKTsgfQotICAgICAgICAgICAgICAgIHZpcnR1YWwgdWludDMyX3QgcmVhZEJvb2xfdmlydChzdGQ6OnZlY3Rvcjxib29sPjo6cmVmZXJlbmNlIHZhbHVlKSB7IHJldHVybiBwcm90b2NvbC0+cmVhZEJvb2wodmFsdWUpOyB9CisgIHZpcnR1YWwgdWludDMyX3QgcmVhZEJvb2xfdmlydChib29sJiB2YWx1ZSkgeyByZXR1cm4gcHJvdG9jb2wtPnJlYWRCb29sKHZhbHVlKTsgfQorICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRCb29sX3ZpcnQoc3RkOjp2ZWN0b3I8Ym9vbD46OnJlZmVyZW5jZSB2YWx1ZSkgeworICAgIHJldHVybiBwcm90b2NvbC0+cmVhZEJvb2wodmFsdWUpOworICB9CiAKLSAgICAgICAgICAgICAgICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRCeXRlX3ZpcnQoaW50OF90JiBieXRlKSB7IHJldHVybiBwcm90b2NvbC0+cmVhZEJ5dGUoYnl0ZSk7IH0KKyAgdmlydHVhbCB1aW50MzJfdCByZWFkQnl0ZV92aXJ0KGludDhfdCYgYnl0ZSkgeyByZXR1cm4gcHJvdG9jb2wtPnJlYWRCeXRlKGJ5dGUpOyB9CiAKLSAgICAgICAgICAgICAgICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRJMTZfdmlydChpbnQxNl90JiBpMTYpIHsgcmV0dXJuIHByb3RvY29sLT5yZWFkSTE2KGkxNik7IH0KLSAgICAgICAgICAgICAgICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRJMzJfdmlydChpbnQzMl90JiBpMzIpIHsgcmV0dXJuIHByb3RvY29sLT5yZWFkSTMyKGkzMik7IH0KLSAgICAgICAgICAgICAgICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRJNjRfdmlydChpbnQ2NF90JiBpNjQpIHsgcmV0dXJuIHByb3RvY29sLT5yZWFkSTY0KGk2NCk7IH0KKyAgdmlydHVhbCB1aW50MzJfdCByZWFkSTE2X3ZpcnQoaW50MTZfdCYgaTE2KSB7IHJldHVybiBwcm90b2NvbC0+cmVhZEkxNihpMTYpOyB9CisgIHZpcnR1YWwgdWludDMyX3QgcmVhZEkzMl92aXJ0KGludDMyX3QmIGkzMikgeyByZXR1cm4gcHJvdG9jb2wtPnJlYWRJMzIoaTMyKTsgfQorICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRJNjRfdmlydChpbnQ2NF90JiBpNjQpIHsgcmV0dXJuIHByb3RvY29sLT5yZWFkSTY0KGk2NCk7IH0KIAotICAgICAgICAgICAgICAgIHZpcnR1YWwgdWludDMyX3QgcmVhZERvdWJsZV92aXJ0KGRvdWJsZSYgZHViKSB7IHJldHVybiBwcm90b2NvbC0+cmVhZERvdWJsZShkdWIpOyB9CisgIHZpcnR1YWwgdWludDMyX3QgcmVhZERvdWJsZV92aXJ0KGRvdWJsZSYgZHViKSB7IHJldHVybiBwcm90b2NvbC0+cmVhZERvdWJsZShkdWIpOyB9CiAKLSAgICAgICAgICAgICAgICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRTdHJpbmdfdmlydChzdGQ6OnN0cmluZyYgc3RyKSB7IHJldHVybiBwcm90b2NvbC0+cmVhZFN0cmluZyhzdHIpOyB9Ci0gICAgICAgICAgICAgICAgdmlydHVhbCB1aW50MzJfdCByZWFkQmluYXJ5X3ZpcnQoc3RkOjpzdHJpbmcmIHN0cikgeyByZXR1cm4gcHJvdG9jb2wtPnJlYWRCaW5hcnkoc3RyKTsgfQorICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRTdHJpbmdfdmlydChzdGQ6OnN0cmluZyYgc3RyKSB7IHJldHVybiBwcm90b2NvbC0+cmVhZFN0cmluZyhzdHIpOyB9CisgIHZpcnR1YWwgdWludDMyX3QgcmVhZEJpbmFyeV92aXJ0KHN0ZDo6c3RyaW5nJiBzdHIpIHsgcmV0dXJuIHByb3RvY29sLT5yZWFkQmluYXJ5KHN0cik7IH0KIAotICAgICAgICAgICAgcHJpdmF0ZToKLSAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG9jb2w7Ci0gICAgICAgICAgICB9OwotICAgICAgICB9Ci0gICAgfQorcHJpdmF0ZToKKyAgc2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvY29sOworfTsKK30KK30KIH0KIAogI2VuZGlmIC8vIFRIUklGVF9UUFJPVE9DT0xERUNPUkFUT1JfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xFeGNlcHRpb24uaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xFeGNlcHRpb24uaAppbmRleCA0ZGRiODFlLi4xMDE3OGUxIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sRXhjZXB0aW9uLmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbEV4Y2VwdGlvbi5oCkBAIC0yMiw3ICsyMiw5IEBACiAKICNpbmNsdWRlIDxzdHJpbmc+CiAKLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHByb3RvY29sIHsKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgcHJvdG9jb2wgewogCiAvKioKICAqIENsYXNzIHRvIGVuY2Fwc3VsYXRlIGFsbCB0aGUgcG9zc2libGUgdHlwZXMgb2YgcHJvdG9jb2wgZXJyb3JzIHRoYXQgbWF5CkBAIC0zMywzOCArMzUsMzEgQEAKICAqCiAgKi8KIGNsYXNzIFRQcm90b2NvbEV4Y2VwdGlvbiA6IHB1YmxpYyBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbiB7Ci0gcHVibGljOgotCitwdWJsaWM6CiAgIC8qKgogICAgKiBFcnJvciBjb2RlcyBmb3IgdGhlIHZhcmlvdXMgdHlwZXMgb2YgZXhjZXB0aW9ucy4KICAgICovCi0gIGVudW0gVFByb3RvY29sRXhjZXB0aW9uVHlwZQotICB7IFVOS05PV04gPSAwCi0gICwgSU5WQUxJRF9EQVRBID0gMQotICAsIE5FR0FUSVZFX1NJWkUgPSAyCi0gICwgU0laRV9MSU1JVCA9IDMKLSAgLCBCQURfVkVSU0lPTiA9IDQKLSAgLCBOT1RfSU1QTEVNRU5URUQgPSA1Ci0gICwgREVQVEhfTElNSVQgPSA2CisgIGVudW0gVFByb3RvY29sRXhjZXB0aW9uVHlwZSB7CisgICAgVU5LTk9XTiA9IDAsCisgICAgSU5WQUxJRF9EQVRBID0gMSwKKyAgICBORUdBVElWRV9TSVpFID0gMiwKKyAgICBTSVpFX0xJTUlUID0gMywKKyAgICBCQURfVkVSU0lPTiA9IDQsCisgICAgTk9UX0lNUExFTUVOVEVEID0gNSwKKyAgICBERVBUSF9MSU1JVCA9IDYKICAgfTsKIAotICBUUHJvdG9jb2xFeGNlcHRpb24oKSA6Ci0gICAgYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24oKSwKLSAgICB0eXBlXyhVTktOT1dOKSB7fQorICBUUHJvdG9jb2xFeGNlcHRpb24oKSA6IGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uKCksIHR5cGVfKFVOS05PV04pIHt9CiAKLSAgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvblR5cGUgdHlwZSkgOgotICAgIGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uKCksCi0gICAgdHlwZV8odHlwZSkge30KKyAgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvblR5cGUgdHlwZSkgOiBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbigpLCB0eXBlXyh0eXBlKSB7fQogCi0gIFRQcm90b2NvbEV4Y2VwdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkgOgotICAgIGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uKG1lc3NhZ2UpLAotICAgIHR5cGVfKFVOS05PV04pIHt9CisgIFRQcm90b2NvbEV4Y2VwdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkKKyAgICA6IGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uKG1lc3NhZ2UpLCB0eXBlXyhVTktOT1dOKSB7fQogCi0gIFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb25UeXBlIHR5cGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSA6Ci0gICAgYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24obWVzc2FnZSksCi0gICAgdHlwZV8odHlwZSkge30KKyAgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvblR5cGUgdHlwZSwgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpCisgICAgOiBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbihtZXNzYWdlKSwgdHlwZV8odHlwZSkge30KIAotICB2aXJ0dWFsIH5UUHJvdG9jb2xFeGNlcHRpb24oKSB0aHJvdygpIHt9CisgIHZpcnR1YWwgflRQcm90b2NvbEV4Y2VwdGlvbigpIG5vZXhjZXB0IHt9CiAKICAgLyoqCiAgICAqIFJldHVybnMgYW4gZXJyb3IgY29kZSB0aGF0IHByb3ZpZGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0eXBlIG9mIGVycm9yCkBAIC03MiwzNCArNjcsMzkgQEAKICAgICoKICAgICogQHJldHVybiBFcnJvciBjb2RlCiAgICAqLwotICBUUHJvdG9jb2xFeGNlcHRpb25UeXBlIGdldFR5cGUoKSB7Ci0gICAgcmV0dXJuIHR5cGVfOwotICB9CisgIFRQcm90b2NvbEV4Y2VwdGlvblR5cGUgZ2V0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIHR5cGVfOyB9CiAKLSAgdmlydHVhbCBjb25zdCBjaGFyKiB3aGF0KCkgY29uc3QgdGhyb3coKSB7CisgIHZpcnR1YWwgY29uc3QgY2hhciogd2hhdCgpIGNvbnN0IG5vZXhjZXB0IHsKICAgICBpZiAobWVzc2FnZV8uZW1wdHkoKSkgewogICAgICAgc3dpdGNoICh0eXBlXykgewotICAgICAgICBjYXNlIFVOS05PV04gICAgICAgICA6IHJldHVybiAiVFByb3RvY29sRXhjZXB0aW9uOiBVbmtub3duIHByb3RvY29sIGV4Y2VwdGlvbiI7Ci0gICAgICAgIGNhc2UgSU5WQUxJRF9EQVRBICAgIDogcmV0dXJuICJUUHJvdG9jb2xFeGNlcHRpb246IEludmFsaWQgZGF0YSI7Ci0gICAgICAgIGNhc2UgTkVHQVRJVkVfU0laRSAgIDogcmV0dXJuICJUUHJvdG9jb2xFeGNlcHRpb246IE5lZ2F0aXZlIHNpemUiOwotICAgICAgICBjYXNlIFNJWkVfTElNSVQgICAgICA6IHJldHVybiAiVFByb3RvY29sRXhjZXB0aW9uOiBFeGNlZWRlZCBzaXplIGxpbWl0IjsKLSAgICAgICAgY2FzZSBCQURfVkVSU0lPTiAgICAgOiByZXR1cm4gIlRQcm90b2NvbEV4Y2VwdGlvbjogSW52YWxpZCB2ZXJzaW9uIjsKLSAgICAgICAgY2FzZSBOT1RfSU1QTEVNRU5URUQgOiByZXR1cm4gIlRQcm90b2NvbEV4Y2VwdGlvbjogTm90IGltcGxlbWVudGVkIjsKLSAgICAgICAgZGVmYXVsdCAgICAgICAgICAgICAgOiByZXR1cm4gIlRQcm90b2NvbEV4Y2VwdGlvbjogKEludmFsaWQgZXhjZXB0aW9uIHR5cGUpIjsKKyAgICAgIGNhc2UgVU5LTk9XTjoKKyAgICAgICAgcmV0dXJuICJUUHJvdG9jb2xFeGNlcHRpb246IFVua25vd24gcHJvdG9jb2wgZXhjZXB0aW9uIjsKKyAgICAgIGNhc2UgSU5WQUxJRF9EQVRBOgorICAgICAgICByZXR1cm4gIlRQcm90b2NvbEV4Y2VwdGlvbjogSW52YWxpZCBkYXRhIjsKKyAgICAgIGNhc2UgTkVHQVRJVkVfU0laRToKKyAgICAgICAgcmV0dXJuICJUUHJvdG9jb2xFeGNlcHRpb246IE5lZ2F0aXZlIHNpemUiOworICAgICAgY2FzZSBTSVpFX0xJTUlUOgorICAgICAgICByZXR1cm4gIlRQcm90b2NvbEV4Y2VwdGlvbjogRXhjZWVkZWQgc2l6ZSBsaW1pdCI7CisgICAgICBjYXNlIEJBRF9WRVJTSU9OOgorICAgICAgICByZXR1cm4gIlRQcm90b2NvbEV4Y2VwdGlvbjogSW52YWxpZCB2ZXJzaW9uIjsKKyAgICAgIGNhc2UgTk9UX0lNUExFTUVOVEVEOgorICAgICAgICByZXR1cm4gIlRQcm90b2NvbEV4Y2VwdGlvbjogTm90IGltcGxlbWVudGVkIjsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAiVFByb3RvY29sRXhjZXB0aW9uOiAoSW52YWxpZCBleGNlcHRpb24gdHlwZSkiOwogICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICByZXR1cm4gbWVzc2FnZV8uY19zdHIoKTsKICAgICB9CiAgIH0KIAotIHByb3RlY3RlZDoKK3Byb3RlY3RlZDoKICAgLyoqCiAgICAqIEVycm9yIGNvZGUKICAgICovCiAgIFRQcm90b2NvbEV4Y2VwdGlvblR5cGUgdHlwZV87Ci0KIH07Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2wKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sCiAKICNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfUFJPVE9DT0xfVFBST1RPQ09MRVhDRVBUSU9OX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sVGFwLmggYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sVGFwLmgKaW5kZXggZjQ5M2Y4OC4uZDAwMGJhNiAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbFRhcC5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xUYXAuaApAQCAtMjIsNyArMjIsOSBAQAogCiAjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RWaXJ0dWFsUHJvdG9jb2wuaD4KIAotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgcHJvdG9jb2wgeworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBwcm90b2NvbCB7CiAKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ7CiAKQEAgLTMzLDE3ICszNSwxMSBAQAogICoKICAqLwogY2xhc3MgVFByb3RvY29sVGFwIDogcHVibGljIFRWaXJ0dWFsUHJvdG9jb2w8VFByb3RvY29sVGFwPiB7Ci0gcHVibGljOgotICAgVFByb3RvY29sVGFwKGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gc291cmNlLAotICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gc2luaykKLSAgICAgOiBUVmlydHVhbFByb3RvY29sPFRQcm90b2NvbFRhcD4oc291cmNlLT5nZXRUcmFuc3BvcnQoKSkKLSAgICAgLCBzb3VyY2VfKHNvdXJjZSkKLSAgICAgLCBzaW5rXyhzaW5rKQotICB7fQorcHVibGljOgorICBUUHJvdG9jb2xUYXAoc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gc291cmNlLCBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBzaW5rKQorICAgIDogVFZpcnR1YWxQcm90b2NvbDxUUHJvdG9jb2xUYXA+KHNvdXJjZS0+Z2V0VHJhbnNwb3J0KCkpLCBzb3VyY2VfKHNvdXJjZSksIHNpbmtfKHNpbmspIHt9CiAKLSAgdWludDMyX3QgcmVhZE1lc3NhZ2VCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTWVzc2FnZVR5cGUmIG1lc3NhZ2VUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIHNlcWlkKSB7CisgIHVpbnQzMl90IHJlYWRNZXNzYWdlQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsIFRNZXNzYWdlVHlwZSYgbWVzc2FnZVR5cGUsIGludDMyX3QmIHNlcWlkKSB7CiAgICAgdWludDMyX3QgcnYgPSBzb3VyY2VfLT5yZWFkTWVzc2FnZUJlZ2luKG5hbWUsIG1lc3NhZ2VUeXBlLCBzZXFpZCk7CiAgICAgc2lua18tPndyaXRlTWVzc2FnZUJlZ2luKG5hbWUsIG1lc3NhZ2VUeXBlLCBzZXFpZCk7CiAgICAgcmV0dXJuIHJ2OwpAQCAtNjcsOSArNjMsNyBAQAogICAgIHJldHVybiBydjsKICAgfQogCi0gIHVpbnQzMl90IHJlYWRGaWVsZEJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZSYgZmllbGRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90JiBmaWVsZElkKSB7CisgIHVpbnQzMl90IHJlYWRGaWVsZEJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLCBUVHlwZSYgZmllbGRUeXBlLCBpbnQxNl90JiBmaWVsZElkKSB7CiAgICAgdWludDMyX3QgcnYgPSBzb3VyY2VfLT5yZWFkRmllbGRCZWdpbihuYW1lLCBmaWVsZFR5cGUsIGZpZWxkSWQpOwogICAgIGlmIChmaWVsZFR5cGUgPT0gVF9TVE9QKSB7CiAgICAgICBzaW5rXy0+d3JpdGVGaWVsZFN0b3AoKTsKQEAgLTc5LDIyICs3MywxOCBAQAogICAgIHJldHVybiBydjsKICAgfQogCi0KICAgdWludDMyX3QgcmVhZEZpZWxkRW5kKCkgewogICAgIHVpbnQzMl90IHJ2ID0gc291cmNlXy0+cmVhZEZpZWxkRW5kKCk7CiAgICAgc2lua18tPndyaXRlRmllbGRFbmQoKTsKICAgICByZXR1cm4gcnY7CiAgIH0KIAotICB1aW50MzJfdCByZWFkTWFwQmVnaW4oVFR5cGUmIGtleVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBUVHlwZSYgdmFsVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBzaXplKSB7CisgIHVpbnQzMl90IHJlYWRNYXBCZWdpbihUVHlwZSYga2V5VHlwZSwgVFR5cGUmIHZhbFR5cGUsIHVpbnQzMl90JiBzaXplKSB7CiAgICAgdWludDMyX3QgcnYgPSBzb3VyY2VfLT5yZWFkTWFwQmVnaW4oa2V5VHlwZSwgdmFsVHlwZSwgc2l6ZSk7CiAgICAgc2lua18tPndyaXRlTWFwQmVnaW4oa2V5VHlwZSwgdmFsVHlwZSwgc2l6ZSk7CiAgICAgcmV0dXJuIHJ2OwogICB9CiAKLQogICB1aW50MzJfdCByZWFkTWFwRW5kKCkgewogICAgIHVpbnQzMl90IHJ2ID0gc291cmNlXy0+cmVhZE1hcEVuZCgpOwogICAgIHNpbmtfLT53cml0ZU1hcEVuZCgpOwpAQCAtMTA3LDcgKzk3LDYgQEAKICAgICByZXR1cm4gcnY7CiAgIH0KIAotCiAgIHVpbnQzMl90IHJlYWRMaXN0RW5kKCkgewogICAgIHVpbnQzMl90IHJ2ID0gc291cmNlXy0+cmVhZExpc3RFbmQoKTsKICAgICBzaW5rXy0+d3JpdGVMaXN0RW5kKCk7CkBAIC0xMjAsNyArMTA5LDYgQEAKICAgICByZXR1cm4gcnY7CiAgIH0KIAotCiAgIHVpbnQzMl90IHJlYWRTZXRFbmQoKSB7CiAgICAgdWludDMyX3QgcnYgPSBzb3VyY2VfLT5yZWFkU2V0RW5kKCk7CiAgICAgc2lua18tPndyaXRlU2V0RW5kKCk7CkBAIC0xNzgsMTEgKzE2NiwxMiBAQAogICAgIHJldHVybiBydjsKICAgfQogCi0gcHJpdmF0ZToKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBzb3VyY2VfOwotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IHNpbmtfOworcHJpdmF0ZToKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gc291cmNlXzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gc2lua187CiB9OwotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sCit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbAogCiAjZW5kaWYgLy8gI2RlZmluZSBfVEhSSUZUX1BST1RPQ09MX1RQUk9UT0NPTFRBUF9IXyAxCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sVHlwZXMuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xUeXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4OThiMjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sVHlwZXMuaApAQCAtMCwwICsxLDM2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVEhSSUZUX1BST1RPQ09MX1RQUk9UT0NPTFRZUEVTX0hfCisjZGVmaW5lIFRIUklGVF9QUk9UT0NPTF9UUFJPVE9DT0xUWVBFU19IXyAxCisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgcHJvdG9jb2wgeworCitlbnVtIFBST1RPQ09MX1RZUEVTIHsKKyAgVF9CSU5BUllfUFJPVE9DT0wgPSAwLAorICBUX0pTT05fUFJPVE9DT0wgPSAxLAorICBUX0NPTVBBQ1RfUFJPVE9DT0wgPSAyLAorfTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sCisKKyNlbmRpZiAvLyAjZGVmaW5lIF9USFJJRlRfUFJPVE9DT0xfVFBST1RPQ09MVFlQRVNfSF8gMQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RWaXJ0dWFsUHJvdG9jb2wuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UVmlydHVhbFByb3RvY29sLmgKaW5kZXggZTA2ODcyNS4uNGVlYTU3OSAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RWaXJ0dWFsUHJvdG9jb2wuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVFZpcnR1YWxQcm90b2NvbC5oCkBAIC0yMiw3ICsyMiw5IEBACiAKICNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmg+CiAKLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHByb3RvY29sIHsKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgcHJvdG9jb2wgewogCiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0OwogCkBAIC0zOCwxMyArNDAsMTEgQEAKICAqIGluc3RlYWQuCiAgKi8KIGNsYXNzIFRQcm90b2NvbERlZmF1bHRzIDogcHVibGljIFRQcm90b2NvbCB7Ci0gcHVibGljOgotICB1aW50MzJfdCByZWFkTWVzc2FnZUJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRNZXNzYWdlVHlwZSYgbWVzc2FnZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgc2VxaWQpIHsKLSAgICAodm9pZCkgbmFtZTsKLSAgICAodm9pZCkgbWVzc2FnZVR5cGU7Ci0gICAgKHZvaWQpIHNlcWlkOworcHVibGljOgorICB1aW50MzJfdCByZWFkTWVzc2FnZUJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLCBUTWVzc2FnZVR5cGUmIG1lc3NhZ2VUeXBlLCBpbnQzMl90JiBzZXFpZCkgeworICAgICh2b2lkKW5hbWU7CisgICAgKHZvaWQpbWVzc2FnZVR5cGU7CisgICAgKHZvaWQpc2VxaWQ7CiAgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHJlYWRpbmcgKHlldCkuIik7CiAgIH0KQEAgLTU1LDcgKzU1LDcgQEAKICAgfQogCiAgIHVpbnQzMl90IHJlYWRTdHJ1Y3RCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSkgewotICAgICh2b2lkKSBuYW1lOworICAgICh2b2lkKW5hbWU7CiAgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHJlYWRpbmcgKHlldCkuIik7CiAgIH0KQEAgLTY1LDEyICs2NSwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHJlYWRpbmcgKHlldCkuIik7CiAgIH0KIAotICB1aW50MzJfdCByZWFkRmllbGRCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGUmIGZpZWxkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCYgZmllbGRJZCkgewotICAgICh2b2lkKSBuYW1lOwotICAgICh2b2lkKSBmaWVsZFR5cGU7Ci0gICAgKHZvaWQpIGZpZWxkSWQ7CisgIHVpbnQzMl90IHJlYWRGaWVsZEJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLCBUVHlwZSYgZmllbGRUeXBlLCBpbnQxNl90JiBmaWVsZElkKSB7CisgICAgKHZvaWQpbmFtZTsKKyAgICAodm9pZClmaWVsZFR5cGU7CisgICAgKHZvaWQpZmllbGRJZDsKICAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyAoeWV0KS4iKTsKICAgfQpAQCAtODEsOSArNzksOSBAQAogICB9CiAKICAgdWludDMyX3QgcmVhZE1hcEJlZ2luKFRUeXBlJiBrZXlUeXBlLCBUVHlwZSYgdmFsVHlwZSwgdWludDMyX3QmIHNpemUpIHsKLSAgICAodm9pZCkga2V5VHlwZTsKLSAgICAodm9pZCkgdmFsVHlwZTsKLSAgICAodm9pZCkgc2l6ZTsKKyAgICAodm9pZClrZXlUeXBlOworICAgICh2b2lkKXZhbFR5cGU7CisgICAgKHZvaWQpc2l6ZTsKICAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyAoeWV0KS4iKTsKICAgfQpAQCAtOTQsOCArOTIsOCBAQAogICB9CiAKICAgdWludDMyX3QgcmVhZExpc3RCZWdpbihUVHlwZSYgZWxlbVR5cGUsIHVpbnQzMl90JiBzaXplKSB7Ci0gICAgKHZvaWQpIGVsZW1UeXBlOwotICAgICh2b2lkKSBzaXplOworICAgICh2b2lkKWVsZW1UeXBlOworICAgICh2b2lkKXNpemU7CiAgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHJlYWRpbmcgKHlldCkuIik7CiAgIH0KQEAgLTEwNiw4ICsxMDQsOCBAQAogICB9CiAKICAgdWludDMyX3QgcmVhZFNldEJlZ2luKFRUeXBlJiBlbGVtVHlwZSwgdWludDMyX3QmIHNpemUpIHsKLSAgICAodm9pZCkgZWxlbVR5cGU7Ci0gICAgKHZvaWQpIHNpemU7CisgICAgKHZvaWQpZWxlbVR5cGU7CisgICAgKHZvaWQpc2l6ZTsKICAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyAoeWV0KS4iKTsKICAgfQpAQCAtMTE4LDU1ICsxMTYsNTUgQEAKICAgfQogCiAgIHVpbnQzMl90IHJlYWRCb29sKGJvb2wmIHZhbHVlKSB7Ci0gICAgKHZvaWQpIHZhbHVlOworICAgICh2b2lkKXZhbHVlOwogICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nICh5ZXQpLiIpOwogICB9CiAKICAgdWludDMyX3QgcmVhZEJvb2woc3RkOjp2ZWN0b3I8Ym9vbD46OnJlZmVyZW5jZSB2YWx1ZSkgewotICAgICh2b2lkKSB2YWx1ZTsKKyAgICAodm9pZCl2YWx1ZTsKICAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyAoeWV0KS4iKTsKICAgfQogCiAgIHVpbnQzMl90IHJlYWRCeXRlKGludDhfdCYgYnl0ZSkgewotICAgICh2b2lkKSBieXRlOworICAgICh2b2lkKWJ5dGU7CiAgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHJlYWRpbmcgKHlldCkuIik7CiAgIH0KIAogICB1aW50MzJfdCByZWFkSTE2KGludDE2X3QmIGkxNikgewotICAgICh2b2lkKSBpMTY7CisgICAgKHZvaWQpaTE2OwogICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nICh5ZXQpLiIpOwogICB9CiAKICAgdWludDMyX3QgcmVhZEkzMihpbnQzMl90JiBpMzIpIHsKLSAgICAodm9pZCkgaTMyOworICAgICh2b2lkKWkzMjsKICAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyAoeWV0KS4iKTsKICAgfQogCiAgIHVpbnQzMl90IHJlYWRJNjQoaW50NjRfdCYgaTY0KSB7Ci0gICAgKHZvaWQpIGk2NDsKKyAgICAodm9pZClpNjQ7CiAgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHJlYWRpbmcgKHlldCkuIik7CiAgIH0KIAogICB1aW50MzJfdCByZWFkRG91YmxlKGRvdWJsZSYgZHViKSB7Ci0gICAgKHZvaWQpIGR1YjsKKyAgICAodm9pZClkdWI7CiAgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHJlYWRpbmcgKHlldCkuIik7CiAgIH0KIAogICB1aW50MzJfdCByZWFkU3RyaW5nKHN0ZDo6c3RyaW5nJiBzdHIpIHsKLSAgICAodm9pZCkgc3RyOworICAgICh2b2lkKXN0cjsKICAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyAoeWV0KS4iKTsKICAgfQogCiAgIHVpbnQzMl90IHJlYWRCaW5hcnkoc3RkOjpzdHJpbmcmIHN0cikgewotICAgICh2b2lkKSBzdHI7CisgICAgKHZvaWQpc3RyOwogICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nICh5ZXQpLiIpOwogICB9CkBAIC0xNzQsOSArMTcyLDkgQEAKICAgdWludDMyX3Qgd3JpdGVNZXNzYWdlQmVnaW4oY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRNZXNzYWdlVHlwZSBtZXNzYWdlVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBzZXFpZCkgewotICAgICh2b2lkKSBuYW1lOwotICAgICh2b2lkKSBtZXNzYWdlVHlwZTsKLSAgICAodm9pZCkgc2VxaWQ7CisgICAgKHZvaWQpbmFtZTsKKyAgICAodm9pZCltZXNzYWdlVHlwZTsKKyAgICAodm9pZClzZXFpZDsKICAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgd3JpdGluZyAoeWV0KS4iKTsKICAgfQpAQCAtMTg2LDkgKzE4NCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgd3JpdGluZyAoeWV0KS4iKTsKICAgfQogCi0KICAgdWludDMyX3Qgd3JpdGVTdHJ1Y3RCZWdpbihjb25zdCBjaGFyKiBuYW1lKSB7Ci0gICAgKHZvaWQpIG5hbWU7CisgICAgKHZvaWQpbmFtZTsKICAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgd3JpdGluZyAoeWV0KS4iKTsKICAgfQpAQCAtMTk4LDEyICsxOTUsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCB3cml0aW5nICh5ZXQpLiIpOwogICB9CiAKLSAgdWludDMyX3Qgd3JpdGVGaWVsZEJlZ2luKGNvbnN0IGNoYXIqIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSBmaWVsZFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90IGZpZWxkSWQpIHsKLSAgICAodm9pZCkgbmFtZTsKLSAgICAodm9pZCkgZmllbGRUeXBlOwotICAgICh2b2lkKSBmaWVsZElkOworICB1aW50MzJfdCB3cml0ZUZpZWxkQmVnaW4oY29uc3QgY2hhciogbmFtZSwgY29uc3QgVFR5cGUgZmllbGRUeXBlLCBjb25zdCBpbnQxNl90IGZpZWxkSWQpIHsKKyAgICAodm9pZCluYW1lOworICAgICh2b2lkKWZpZWxkVHlwZTsKKyAgICAodm9pZClmaWVsZElkOwogICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCB3cml0aW5nICh5ZXQpLiIpOwogICB9CkBAIC0yMTgsMTIgKzIxMywxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHdyaXRpbmcgKHlldCkuIik7CiAgIH0KIAotICB1aW50MzJfdCB3cml0ZU1hcEJlZ2luKGNvbnN0IFRUeXBlIGtleVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFR5cGUgdmFsVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKSB7Ci0gICAgKHZvaWQpIGtleVR5cGU7Ci0gICAgKHZvaWQpIHZhbFR5cGU7Ci0gICAgKHZvaWQpIHNpemU7CisgIHVpbnQzMl90IHdyaXRlTWFwQmVnaW4oY29uc3QgVFR5cGUga2V5VHlwZSwgY29uc3QgVFR5cGUgdmFsVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSkgeworICAgICh2b2lkKWtleVR5cGU7CisgICAgKHZvaWQpdmFsVHlwZTsKKyAgICAodm9pZClzaXplOwogICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCB3cml0aW5nICh5ZXQpLiIpOwogICB9CkBAIC0yMzQsOCArMjI3LDggQEAKICAgfQogCiAgIHVpbnQzMl90IHdyaXRlTGlzdEJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLCBjb25zdCB1aW50MzJfdCBzaXplKSB7Ci0gICAgKHZvaWQpIGVsZW1UeXBlOwotICAgICh2b2lkKSBzaXplOworICAgICh2b2lkKWVsZW1UeXBlOworICAgICh2b2lkKXNpemU7CiAgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHdyaXRpbmcgKHlldCkuIik7CiAgIH0KQEAgLTI0Niw4ICsyMzksOCBAQAogICB9CiAKICAgdWludDMyX3Qgd3JpdGVTZXRCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSkgewotICAgICh2b2lkKSBlbGVtVHlwZTsKLSAgICAodm9pZCkgc2l6ZTsKKyAgICAodm9pZCllbGVtVHlwZTsKKyAgICAodm9pZClzaXplOwogICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCB3cml0aW5nICh5ZXQpLiIpOwogICB9CkBAIC0yNTgsNzAgKzI1MSw2NiBAQAogICB9CiAKICAgdWludDMyX3Qgd3JpdGVCb29sKGNvbnN0IGJvb2wgdmFsdWUpIHsKLSAgICAodm9pZCkgdmFsdWU7CisgICAgKHZvaWQpdmFsdWU7CiAgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHdyaXRpbmcgKHlldCkuIik7CiAgIH0KIAogICB1aW50MzJfdCB3cml0ZUJ5dGUoY29uc3QgaW50OF90IGJ5dGUpIHsKLSAgICAodm9pZCkgYnl0ZTsKKyAgICAodm9pZClieXRlOwogICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCB3cml0aW5nICh5ZXQpLiIpOwogICB9CiAKICAgdWludDMyX3Qgd3JpdGVJMTYoY29uc3QgaW50MTZfdCBpMTYpIHsKLSAgICAodm9pZCkgaTE2OworICAgICh2b2lkKWkxNjsKICAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgd3JpdGluZyAoeWV0KS4iKTsKICAgfQogCiAgIHVpbnQzMl90IHdyaXRlSTMyKGNvbnN0IGludDMyX3QgaTMyKSB7Ci0gICAgKHZvaWQpIGkzMjsKKyAgICAodm9pZClpMzI7CiAgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHdyaXRpbmcgKHlldCkuIik7CiAgIH0KIAogICB1aW50MzJfdCB3cml0ZUk2NChjb25zdCBpbnQ2NF90IGk2NCkgewotICAgICh2b2lkKSBpNjQ7CisgICAgKHZvaWQpaTY0OwogICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCB3cml0aW5nICh5ZXQpLiIpOwogICB9CiAKICAgdWludDMyX3Qgd3JpdGVEb3VibGUoY29uc3QgZG91YmxlIGR1YikgewotICAgICh2b2lkKSBkdWI7CisgICAgKHZvaWQpZHViOwogICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCB3cml0aW5nICh5ZXQpLiIpOwogICB9CiAKICAgdWludDMyX3Qgd3JpdGVTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgewotICAgICh2b2lkKSBzdHI7CisgICAgKHZvaWQpc3RyOwogICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCB3cml0aW5nICh5ZXQpLiIpOwogICB9CiAKICAgdWludDMyX3Qgd3JpdGVCaW5hcnkoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgewotICAgICh2b2lkKSBzdHI7CisgICAgKHZvaWQpc3RyOwogICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCB3cml0aW5nICh5ZXQpLiIpOwogICB9CiAKLSAgdWludDMyX3Qgc2tpcChUVHlwZSB0eXBlKSB7Ci0gICAgcmV0dXJuIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpza2lwKCp0aGlzLCB0eXBlKTsKLSAgfQorICB1aW50MzJfdCBza2lwKFRUeXBlIHR5cGUpIHsgcmV0dXJuIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpza2lwKCp0aGlzLCB0eXBlKTsgfQogCi0gcHJvdGVjdGVkOgotICBUUHJvdG9jb2xEZWZhdWx0cyhib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBwdHJhbnMpCi0gICAgOiBUUHJvdG9jb2wocHRyYW5zKQotICB7fQorcHJvdGVjdGVkOgorICBUUHJvdG9jb2xEZWZhdWx0cyhzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gcHRyYW5zKSA6IFRQcm90b2NvbChwdHJhbnMpIHt9CiB9OwogCiAvKioKICAqIENvbmNyZXRlIFRQcm90b2NvbCBjbGFzc2VzIHNob3VsZCBpbmhlcml0IGZyb20gVFZpcnR1YWxQcm90b2NvbAogICogc28gdGhleSBkb24ndCBoYXZlIHRvIG1hbnVhbGx5IG92ZXJyaWRlIHZpcnR1YWwgbWV0aG9kcy4KICAqLwotdGVtcGxhdGUgPGNsYXNzIFByb3RvY29sXywgY2xhc3MgU3VwZXJfPVRQcm90b2NvbERlZmF1bHRzPgordGVtcGxhdGUgPGNsYXNzIFByb3RvY29sXywgY2xhc3MgU3VwZXJfID0gVFByb3RvY29sRGVmYXVsdHM+CiBjbGFzcyBUVmlydHVhbFByb3RvY29sIDogcHVibGljIFN1cGVyXyB7Ci0gcHVibGljOgorcHVibGljOgogICAvKioKICAgICogV3JpdGluZyBmdW5jdGlvbnMuCiAgICAqLwpAQCAtMzI5LDM3ICszMTgsMjggQEAKICAgdmlydHVhbCB1aW50MzJfdCB3cml0ZU1lc3NhZ2VCZWdpbl92aXJ0KGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVE1lc3NhZ2VUeXBlIG1lc3NhZ2VUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBzZXFpZCkgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+d3JpdGVNZXNzYWdlQmVnaW4obmFtZSwgbWVzc2FnZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXFpZCk7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT53cml0ZU1lc3NhZ2VCZWdpbihuYW1lLCBtZXNzYWdlVHlwZSwgc2VxaWQpOwogICB9CiAKICAgdmlydHVhbCB1aW50MzJfdCB3cml0ZU1lc3NhZ2VFbmRfdmlydCgpIHsKICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPndyaXRlTWVzc2FnZUVuZCgpOwogICB9CiAKLQogICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlU3RydWN0QmVnaW5fdmlydChjb25zdCBjaGFyKiBuYW1lKSB7CiAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT53cml0ZVN0cnVjdEJlZ2luKG5hbWUpOwogICB9CiAKLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZVN0cnVjdEVuZF92aXJ0KCkgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+d3JpdGVTdHJ1Y3RFbmQoKTsKLSAgfQorICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlU3RydWN0RW5kX3ZpcnQoKSB7IHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+d3JpdGVTdHJ1Y3RFbmQoKTsgfQogCiAgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVGaWVsZEJlZ2luX3ZpcnQoY29uc3QgY2hhciogbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSBmaWVsZFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCBmaWVsZElkKSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT53cml0ZUZpZWxkQmVnaW4obmFtZSwgZmllbGRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkSWQpOworICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+d3JpdGVGaWVsZEJlZ2luKG5hbWUsIGZpZWxkVHlwZSwgZmllbGRJZCk7CiAgIH0KIAotICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlRmllbGRFbmRfdmlydCgpIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPndyaXRlRmllbGRFbmQoKTsKLSAgfQorICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlRmllbGRFbmRfdmlydCgpIHsgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT53cml0ZUZpZWxkRW5kKCk7IH0KIAotICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlRmllbGRTdG9wX3ZpcnQoKSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT53cml0ZUZpZWxkU3RvcCgpOwotICB9CisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVGaWVsZFN0b3BfdmlydCgpIHsgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT53cml0ZUZpZWxkU3RvcCgpOyB9CiAKICAgdmlydHVhbCB1aW50MzJfdCB3cml0ZU1hcEJlZ2luX3ZpcnQoY29uc3QgVFR5cGUga2V5VHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFR5cGUgdmFsVHlwZSwKQEAgLTM2NywyNyArMzQ3LDE5IEBACiAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT53cml0ZU1hcEJlZ2luKGtleVR5cGUsIHZhbFR5cGUsIHNpemUpOwogICB9CiAKLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZU1hcEVuZF92aXJ0KCkgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+d3JpdGVNYXBFbmQoKTsKLSAgfQorICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlTWFwRW5kX3ZpcnQoKSB7IHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+d3JpdGVNYXBFbmQoKTsgfQogCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVMaXN0QmVnaW5fdmlydChjb25zdCBUVHlwZSBlbGVtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUxpc3RCZWdpbl92aXJ0KGNvbnN0IFRUeXBlIGVsZW1UeXBlLCBjb25zdCB1aW50MzJfdCBzaXplKSB7CiAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT53cml0ZUxpc3RCZWdpbihlbGVtVHlwZSwgc2l6ZSk7CiAgIH0KIAotICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlTGlzdEVuZF92aXJ0KCkgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+d3JpdGVMaXN0RW5kKCk7Ci0gIH0KKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUxpc3RFbmRfdmlydCgpIHsgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT53cml0ZUxpc3RFbmQoKTsgfQogCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVTZXRCZWdpbl92aXJ0KGNvbnN0IFRUeXBlIGVsZW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKSB7CisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVTZXRCZWdpbl92aXJ0KGNvbnN0IFRUeXBlIGVsZW1UeXBlLCBjb25zdCB1aW50MzJfdCBzaXplKSB7CiAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT53cml0ZVNldEJlZ2luKGVsZW1UeXBlLCBzaXplKTsKICAgfQogCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVTZXRFbmRfdmlydCgpIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPndyaXRlU2V0RW5kKCk7Ci0gIH0KKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZVNldEVuZF92aXJ0KCkgeyByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPndyaXRlU2V0RW5kKCk7IH0KIAogICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlQm9vbF92aXJ0KGNvbnN0IGJvb2wgdmFsdWUpIHsKICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPndyaXRlQm9vbCh2YWx1ZSk7CkBAIC00MjgsNjAgKzQwMCw0MCBAQAogICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRNZXNzYWdlQmVnaW5fdmlydChzdGQ6OnN0cmluZyYgbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE1lc3NhZ2VUeXBlJiBtZXNzYWdlVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgc2VxaWQpIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPnJlYWRNZXNzYWdlQmVnaW4obmFtZSwgbWVzc2FnZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcWlkKTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPnJlYWRNZXNzYWdlQmVnaW4obmFtZSwgbWVzc2FnZVR5cGUsIHNlcWlkKTsKICAgfQogCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZE1lc3NhZ2VFbmRfdmlydCgpIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPnJlYWRNZXNzYWdlRW5kKCk7Ci0gIH0KKyAgdmlydHVhbCB1aW50MzJfdCByZWFkTWVzc2FnZUVuZF92aXJ0KCkgeyByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPnJlYWRNZXNzYWdlRW5kKCk7IH0KIAogICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRTdHJ1Y3RCZWdpbl92aXJ0KHN0ZDo6c3RyaW5nJiBuYW1lKSB7CiAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT5yZWFkU3RydWN0QmVnaW4obmFtZSk7CiAgIH0KIAotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRTdHJ1Y3RFbmRfdmlydCgpIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPnJlYWRTdHJ1Y3RFbmQoKTsKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkU3RydWN0RW5kX3ZpcnQoKSB7IHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+cmVhZFN0cnVjdEVuZCgpOyB9CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkRmllbGRCZWdpbl92aXJ0KHN0ZDo6c3RyaW5nJiBuYW1lLCBUVHlwZSYgZmllbGRUeXBlLCBpbnQxNl90JiBmaWVsZElkKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT5yZWFkRmllbGRCZWdpbihuYW1lLCBmaWVsZFR5cGUsIGZpZWxkSWQpOwogICB9CiAKLSAgdmlydHVhbCB1aW50MzJfdCByZWFkRmllbGRCZWdpbl92aXJ0KHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGUmIGZpZWxkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QmIGZpZWxkSWQpIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPnJlYWRGaWVsZEJlZ2luKG5hbWUsIGZpZWxkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkSWQpOwotICB9CisgIHZpcnR1YWwgdWludDMyX3QgcmVhZEZpZWxkRW5kX3ZpcnQoKSB7IHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+cmVhZEZpZWxkRW5kKCk7IH0KIAotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRGaWVsZEVuZF92aXJ0KCkgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+cmVhZEZpZWxkRW5kKCk7Ci0gIH0KLQotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRNYXBCZWdpbl92aXJ0KFRUeXBlJiBrZXlUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUeXBlJiB2YWxUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBzaXplKSB7CisgIHZpcnR1YWwgdWludDMyX3QgcmVhZE1hcEJlZ2luX3ZpcnQoVFR5cGUmIGtleVR5cGUsIFRUeXBlJiB2YWxUeXBlLCB1aW50MzJfdCYgc2l6ZSkgewogICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+cmVhZE1hcEJlZ2luKGtleVR5cGUsIHZhbFR5cGUsIHNpemUpOwogICB9CiAKLSAgdmlydHVhbCB1aW50MzJfdCByZWFkTWFwRW5kX3ZpcnQoKSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT5yZWFkTWFwRW5kKCk7Ci0gIH0KKyAgdmlydHVhbCB1aW50MzJfdCByZWFkTWFwRW5kX3ZpcnQoKSB7IHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+cmVhZE1hcEVuZCgpOyB9CiAKLSAgdmlydHVhbCB1aW50MzJfdCByZWFkTGlzdEJlZ2luX3ZpcnQoVFR5cGUmIGVsZW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2l6ZSkgeworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRMaXN0QmVnaW5fdmlydChUVHlwZSYgZWxlbVR5cGUsIHVpbnQzMl90JiBzaXplKSB7CiAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT5yZWFkTGlzdEJlZ2luKGVsZW1UeXBlLCBzaXplKTsKICAgfQogCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZExpc3RFbmRfdmlydCgpIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPnJlYWRMaXN0RW5kKCk7Ci0gIH0KKyAgdmlydHVhbCB1aW50MzJfdCByZWFkTGlzdEVuZF92aXJ0KCkgeyByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPnJlYWRMaXN0RW5kKCk7IH0KIAotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRTZXRCZWdpbl92aXJ0KFRUeXBlJiBlbGVtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2l6ZSkgeworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRTZXRCZWdpbl92aXJ0KFRUeXBlJiBlbGVtVHlwZSwgdWludDMyX3QmIHNpemUpIHsKICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPnJlYWRTZXRCZWdpbihlbGVtVHlwZSwgc2l6ZSk7CiAgIH0KIAotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRTZXRFbmRfdmlydCgpIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPnJlYWRTZXRFbmQoKTsKLSAgfQorICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRTZXRFbmRfdmlydCgpIHsgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT5yZWFkU2V0RW5kKCk7IH0KIAogICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRCb29sX3ZpcnQoYm9vbCYgdmFsdWUpIHsKICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPnJlYWRCb29sKHZhbHVlKTsKQEAgLTUxOSw5ICs0NzEsNyBAQAogICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+cmVhZEJpbmFyeShzdHIpOwogICB9CiAKLSAgdmlydHVhbCB1aW50MzJfdCBza2lwX3ZpcnQoVFR5cGUgdHlwZSkgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+c2tpcCh0eXBlKTsKLSAgfQorICB2aXJ0dWFsIHVpbnQzMl90IHNraXBfdmlydChUVHlwZSB0eXBlKSB7IHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+c2tpcCh0eXBlKTsgfQogCiAgIC8qCiAgICAqIFByb3ZpZGUgYSBkZWZhdWx0IHNraXAoKSBpbXBsZW1lbnRhdGlvbiB0aGF0IHVzZXMgbm9uLXZpcnR1YWwgcmVhZApAQCAtNTUzLDEyICs1MDMsMTEgQEAKICAgfQogICB1c2luZyBTdXBlcl86OnJlYWRCb29sOyAvLyBzbyB3ZSBkb24ndCBoaWRlIHJlYWRCb29sKGJvb2wmKQogCi0gcHJvdGVjdGVkOgotICBUVmlydHVhbFByb3RvY29sKGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHB0cmFucykKLSAgICA6IFN1cGVyXyhwdHJhbnMpCi0gIHt9Citwcm90ZWN0ZWQ6CisgIFRWaXJ0dWFsUHJvdG9jb2woc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHB0cmFucykgOiBTdXBlcl8ocHRyYW5zKSB7fQogfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbAorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2wKIAogI2VuZGlmIC8vICNkZWZpbmUgX1RIUklGVF9QUk9UT0NPTF9UVklSVFVBTFBST1RPQ09MX0hfIDEKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9xdC9DTWFrZUxpc3RzLnR4dCBiL2xpYi9jcHAvc3JjL3RocmlmdC9xdC9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGE5YTMxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3F0L0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMjggQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitzZXQoIHRocmlmdGNwcHF0NV9TT1VSQ0VTCisgICAgVFFJT0RldmljZVRyYW5zcG9ydC5jcHAKKyAgICBUUVRjcFNlcnZlci5jcHAKKykKK3NldChDTUFLRV9BVVRPTU9DIE9OKQorZmluZF9wYWNrYWdlKFF0NSBSRVFVSVJFRCBDT01QT05FTlRTIENvcmUgTmV0d29yaykKK0FERF9MSUJSQVJZX1RIUklGVCh0aHJpZnRxdDUgJHt0aHJpZnRjcHBxdDVfU09VUkNFU30pCitUQVJHRVRfTElOS19MSUJSQVJJRVNfVEhSSUZUKHRocmlmdHF0NSBRdDU6OkNvcmUgUXQ1OjpOZXR3b3JrKQorVEFSR0VUX0xJTktfTElCUkFSSUVTX1RIUklGVF9BR0FJTlNUX1RIUklGVF9MSUJSQVJZKHRocmlmdHF0NSB0aHJpZnQpCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcXQvVFFJT0RldmljZVRyYW5zcG9ydC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvcXQvVFFJT0RldmljZVRyYW5zcG9ydC5jcHAKaW5kZXggMmM4Mjg0Ny4uZjc3Yzk5MyAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3F0L1RRSU9EZXZpY2VUcmFuc3BvcnQuY3BwCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9xdC9UUUlPRGV2aWNlVHJhbnNwb3J0LmNwcApAQCAtMjMsNDYgKzIzLDQyIEBACiAjaW5jbHVkZSA8UUlPRGV2aWNlPgogCiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgorI2luY2x1ZGUgPG1lbW9yeT4KIAotdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7CituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgewogCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0cmFuc3BvcnQgewordXNpbmcgc3RkOjpzaGFyZWRfcHRyOwogCi1UUUlPRGV2aWNlVHJhbnNwb3J0OjpUUUlPRGV2aWNlVHJhbnNwb3J0KHNoYXJlZF9wdHI8UUlPRGV2aWNlPiBkZXYpCi0gIDogZGV2XyhkZXYpCi17CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKKworVFFJT0RldmljZVRyYW5zcG9ydDo6VFFJT0RldmljZVRyYW5zcG9ydChzaGFyZWRfcHRyPFFJT0RldmljZT4gZGV2KSA6IGRldl8oZGV2KSB7CiB9CiAKLVRRSU9EZXZpY2VUcmFuc3BvcnQ6On5UUUlPRGV2aWNlVHJhbnNwb3J0KCkKLXsKK1RRSU9EZXZpY2VUcmFuc3BvcnQ6On5UUUlPRGV2aWNlVHJhbnNwb3J0KCkgewogICBkZXZfLT5jbG9zZSgpOwogfQogCi12b2lkIFRRSU9EZXZpY2VUcmFuc3BvcnQ6Om9wZW4oKQotewordm9pZCBUUUlPRGV2aWNlVHJhbnNwb3J0OjpvcGVuKCkgewogICBpZiAoIWlzT3BlbigpKSB7CiAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcGVuKCk6IHVuZGVybHlpbmcgUUlPRGV2aWNlIGlzbid0IG9wZW4iKTsKICAgfQogfQogCi1ib29sIFRRSU9EZXZpY2VUcmFuc3BvcnQ6OmlzT3BlbigpCi17Citib29sIFRRSU9EZXZpY2VUcmFuc3BvcnQ6OmlzT3BlbigpIHsKICAgcmV0dXJuIGRldl8tPmlzT3BlbigpOwogfQogCi1ib29sIFRRSU9EZXZpY2VUcmFuc3BvcnQ6OnBlZWsoKQoteworYm9vbCBUUUlPRGV2aWNlVHJhbnNwb3J0OjpwZWVrKCkgewogICByZXR1cm4gZGV2Xy0+Ynl0ZXNBdmFpbGFibGUoKSA+IDA7CiB9CiAKLXZvaWQgVFFJT0RldmljZVRyYW5zcG9ydDo6Y2xvc2UoKQotewordm9pZCBUUUlPRGV2aWNlVHJhbnNwb3J0OjpjbG9zZSgpIHsKICAgZGV2Xy0+Y2xvc2UoKTsKIH0KIAotdWludDMyX3QgVFFJT0RldmljZVRyYW5zcG9ydDo6cmVhZEFsbCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikKLXsKK3VpbnQzMl90IFRRSU9EZXZpY2VUcmFuc3BvcnQ6OnJlYWRBbGwodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKICAgdWludDMyX3QgcmVxdWVzdExlbiA9IGxlbjsKICAgd2hpbGUgKGxlbikgewogICAgIHVpbnQzMl90IHJlYWRTaXplOwpAQCAtODYsOCArODIsNyBAQAogICByZXR1cm4gcmVxdWVzdExlbjsKIH0KIAotdWludDMyX3QgVFFJT0RldmljZVRyYW5zcG9ydDo6cmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikKLXsKK3VpbnQzMl90IFRRSU9EZXZpY2VUcmFuc3BvcnQ6OnJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKICAgdWludDMyX3QgYWN0dWFsU2l6ZTsKICAgcWludDY0IHJlYWRTaXplOwogCkBAIC05NiwyNSArOTEsMjMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkKCk6IHVuZGVybHlpbmcgUUlPRGV2aWNlIGlzIG5vdCBvcGVuIik7CiAgIH0KIAotICBhY3R1YWxTaXplID0gKHVpbnQzMl90KXN0ZDo6bWluKChxaW50NjQpbGVuLCBkZXZfLT5ieXRlc0F2YWlsYWJsZSgpKTsKLSAgcmVhZFNpemUgPSBkZXZfLT5yZWFkKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhciAqPihidWYpLCBhY3R1YWxTaXplKTsKKyAgYWN0dWFsU2l6ZSA9ICh1aW50MzJfdCkoc3RkOjptaW4pKChxaW50NjQpbGVuLCBkZXZfLT5ieXRlc0F2YWlsYWJsZSgpKTsKKyAgcmVhZFNpemUgPSBkZXZfLT5yZWFkKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGJ1ZiksIGFjdHVhbFNpemUpOwogCiAgIGlmIChyZWFkU2l6ZSA8IDApIHsKICAgICBRQWJzdHJhY3RTb2NrZXQqIHNvY2tldDsKLSAgICBpZiAoKHNvY2tldCA9IHFvYmplY3RfY2FzdDxRQWJzdHJhY3RTb2NrZXQqID4oZGV2Xy5nZXQoKSkpKSB7CisgICAgaWYgKChzb2NrZXQgPSBxb2JqZWN0X2Nhc3Q8UUFic3RyYWN0U29ja2V0Kj4oZGV2Xy5nZXQoKSkpKSB7CiAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gcmVhZCgpIGZyb20gUUFic3RyYWN0U29ja2V0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0LT5lcnJvcigpKTsKICAgICB9Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byByZWFkIGZyb20gZnJvbSBRSU9EZXZpY2UiKTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sICJGYWlsZWQgdG8gcmVhZCBmcm9tIGZyb20gUUlPRGV2aWNlIik7CiAgIH0KIAogICByZXR1cm4gKHVpbnQzMl90KXJlYWRTaXplOwogfQogCi12b2lkIFRRSU9EZXZpY2VUcmFuc3BvcnQ6OndyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKQotewordm9pZCBUUUlPRGV2aWNlVHJhbnNwb3J0Ojp3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewogICB3aGlsZSAobGVuKSB7CiAgICAgdWludDMyX3Qgd3JpdHRlbiA9IHdyaXRlX3BhcnRpYWwoYnVmLCBsZW4pOwogICAgIGxlbiAtPSB3cml0dGVuOwpAQCAtMTIyLDggKzExNSw3IEBACiAgIH0KIH0KIAotdWludDMyX3QgVFFJT0RldmljZVRyYW5zcG9ydDo6d3JpdGVfcGFydGlhbChjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikKLXsKK3VpbnQzMl90IFRRSU9EZXZpY2VUcmFuc3BvcnQ6OndyaXRlX3BhcnRpYWwoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKICAgcWludDY0IHdyaXR0ZW47CiAKICAgaWYgKCFkZXZfLT5pc09wZW4oKSkgewpAQCAtMTM2LDcgKzEyOCw4IEBACiAgICAgUUFic3RyYWN0U29ja2V0KiBzb2NrZXQ7CiAgICAgaWYgKChzb2NrZXQgPSBxb2JqZWN0X2Nhc3Q8UUFic3RyYWN0U29ja2V0Kj4oZGV2Xy5nZXQoKSkpKSB7CiAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3cml0ZV9wYXJ0aWFsKCk6IGZhaWxlZCB0byB3cml0ZSB0byBRQWJzdHJhY3RTb2NrZXQiLCBzb2NrZXQtPmVycm9yKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid3JpdGVfcGFydGlhbCgpOiBmYWlsZWQgdG8gd3JpdGUgdG8gUUFic3RyYWN0U29ja2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0LT5lcnJvcigpKTsKICAgICB9CiAKICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sCkBAIC0xNDYsOCArMTM5LDcgQEAKICAgcmV0dXJuICh1aW50MzJfdCl3cml0dGVuOwogfQogCi12b2lkIFRRSU9EZXZpY2VUcmFuc3BvcnQ6OmZsdXNoKCkKLXsKK3ZvaWQgVFFJT0RldmljZVRyYW5zcG9ydDo6Zmx1c2goKSB7CiAgIGlmICghZGV2Xy0+aXNPcGVuKCkpIHsKICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZsdXNoKCk6IHVuZGVybHlpbmcgUUlPRGV2aWNlIGlzIG5vdCBvcGVuIik7CkBAIC0xNjIsMTggKzE1NCwxNiBAQAogICB9CiB9CiAKLXVpbnQ4X3QqIFRRSU9EZXZpY2VUcmFuc3BvcnQ6OmJvcnJvdyh1aW50OF90KiBidWYsIHVpbnQzMl90KiBsZW4pCi17Ci0gICh2b2lkKSBidWY7Ci0gICh2b2lkKSBsZW47Cit1aW50OF90KiBUUUlPRGV2aWNlVHJhbnNwb3J0Ojpib3Jyb3codWludDhfdCogYnVmLCB1aW50MzJfdCogbGVuKSB7CisgICh2b2lkKWJ1ZjsKKyAgKHZvaWQpbGVuOwogICByZXR1cm4gTlVMTDsKIH0KIAotdm9pZCBUUUlPRGV2aWNlVHJhbnNwb3J0Ojpjb25zdW1lKHVpbnQzMl90IGxlbikKLXsKLSAgKHZvaWQpIGxlbjsKK3ZvaWQgVFFJT0RldmljZVRyYW5zcG9ydDo6Y29uc3VtZSh1aW50MzJfdCBsZW4pIHsKKyAgKHZvaWQpbGVuOwogICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04pOwogfQotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAotCit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9xdC9UUUlPRGV2aWNlVHJhbnNwb3J0LmggYi9saWIvY3BwL3NyYy90aHJpZnQvcXQvVFFJT0RldmljZVRyYW5zcG9ydC5oCmluZGV4IGM1MjIxZGQuLjkxY2U4ZDUgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9xdC9UUUlPRGV2aWNlVHJhbnNwb3J0LmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3F0L1RRSU9EZXZpY2VUcmFuc3BvcnQuaApAQCAtMjAsMjAgKzIwLDIzIEBACiAjaWZuZGVmIF9USFJJRlRfQVNZTkNfVFFJT0RFVklDRV9UUkFOU1BPUlRfSF8KICNkZWZpbmUgX1RIUklGVF9BU1lOQ19UUUlPREVWSUNFX1RSQU5TUE9SVF9IXyAxCiAKLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KKyNpbmNsdWRlIDxtZW1vcnk+CiAKICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RWaXJ0dWFsVHJhbnNwb3J0Lmg+CiAKIGNsYXNzIFFJT0RldmljZTsKIAotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKIAogLyoqCiAgKiAgVHJhbnNwb3J0IHRoYXQgb3BlcmF0ZXMgb24gYSBRSU9EZXZpY2UgKHNvY2tldCwgZmlsZSwgZXRjKS4KICAqLwotY2xhc3MgVFFJT0RldmljZVRyYW5zcG9ydCA6IHB1YmxpYyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVmlydHVhbFRyYW5zcG9ydDxUUUlPRGV2aWNlVHJhbnNwb3J0PiB7Ci0gcHVibGljOgotICBleHBsaWNpdCBUUUlPRGV2aWNlVHJhbnNwb3J0KGJvb3N0OjpzaGFyZWRfcHRyPFFJT0RldmljZT4gZGV2KTsKK2NsYXNzIFRRSU9EZXZpY2VUcmFuc3BvcnQKKyAgICA6IHB1YmxpYyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVmlydHVhbFRyYW5zcG9ydDxUUUlPRGV2aWNlVHJhbnNwb3J0PiB7CitwdWJsaWM6CisgIGV4cGxpY2l0IFRRSU9EZXZpY2VUcmFuc3BvcnQoc3RkOjpzaGFyZWRfcHRyPFFJT0RldmljZT4gZGV2KTsKICAgdmlydHVhbCB+VFFJT0RldmljZVRyYW5zcG9ydCgpOwogCiAgIHZvaWQgb3BlbigpOwpAQCAtNDEsNyArNDQsNyBAQAogICBib29sIHBlZWsoKTsKICAgdm9pZCBjbG9zZSgpOwogCi0gIHVpbnQzMl90IHJlYWRBbGwodWludDhfdCAqYnVmLCB1aW50MzJfdCBsZW4pOworICB1aW50MzJfdCByZWFkQWxsKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKICAgdWludDMyX3QgcmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7CiAKICAgdm9pZCB3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7CkBAIC01MiwxMyArNTUsMTQgQEAKICAgdWludDhfdCogYm9ycm93KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QqIGxlbik7CiAgIHZvaWQgY29uc3VtZSh1aW50MzJfdCBsZW4pOwogCi0gcHJpdmF0ZToKLSAgIFRRSU9EZXZpY2VUcmFuc3BvcnQoY29uc3QgVFFJT0RldmljZVRyYW5zcG9ydCYpOwotICAgVFFJT0RldmljZVRyYW5zcG9ydCYgb3BlcmF0b3I9KGNvbnN0IFRRSU9EZXZpY2VUcmFuc3BvcnQmKTsKK3ByaXZhdGU6CisgIFRRSU9EZXZpY2VUcmFuc3BvcnQoY29uc3QgVFFJT0RldmljZVRyYW5zcG9ydCYpOworICBUUUlPRGV2aWNlVHJhbnNwb3J0JiBvcGVyYXRvcj0oY29uc3QgVFFJT0RldmljZVRyYW5zcG9ydCYpOwogCi0gICBib29zdDo6c2hhcmVkX3B0cjxRSU9EZXZpY2U+IGRldl87CisgIHN0ZDo6c2hhcmVkX3B0cjxRSU9EZXZpY2U+IGRldl87CiB9OwotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAogCiAjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX0FTWU5DX1RRSU9ERVZJQ0VfVFJBTlNQT1JUX0hfCi0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9xdC9UUVRjcFNlcnZlci5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvcXQvVFFUY3BTZXJ2ZXIuY3BwCmluZGV4IDJiM2NmOTguLjk5YWFkMDcgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9xdC9UUVRjcFNlcnZlci5jcHAKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3F0L1RRVGNwU2VydmVyLmNwcApAQCAtMTcsMjggKzE3LDMzIEBACiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxtZW1vcnk+CisKICNpbmNsdWRlIDx0aHJpZnQvcXQvVFFUY3BTZXJ2ZXIuaD4KICNpbmNsdWRlIDx0aHJpZnQvcXQvVFFJT0RldmljZVRyYW5zcG9ydC5oPgogCisjaW5jbHVkZSA8UU1ldGFUeXBlPgogI2luY2x1ZGUgPFFUY3BTb2NrZXQ+CiAKLSNpbmNsdWRlIDx0aHJpZnQvY3h4ZnVuY3Rpb25hbC5oPgotCiAjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbC5oPgogI2luY2x1ZGUgPHRocmlmdC9hc3luYy9UQXN5bmNQcm9jZXNzb3IuaD4KIAotdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbDsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeTsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFFJT0RldmljZVRyYW5zcG9ydDsKLXVzaW5nIGFwYWNoZTo6dGhyaWZ0OjpzdGRjeHg6OmZ1bmN0aW9uOwotdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnN0ZGN4eDo6YmluZDsKK3VzaW5nIHN0ZDo6YmluZDsKK3VzaW5nIHN0ZDo6ZnVuY3Rpb247Cit1c2luZyBzdGQ6OnBsYWNlaG9sZGVyczo6XzE7Cit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7CiAKIFFUX1VTRV9OQU1FU1BBQ0UKIAotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgYXN5bmMgeworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBhc3luYyB7CiAKIHN0cnVjdCBUUVRjcFNlcnZlcjo6Q29ubmVjdGlvbkNvbnRleHQgewogICBzaGFyZWRfcHRyPFFUY3BTb2NrZXQ+IGNvbm5lY3Rpb25fOwpAQCAtNTAsMzEgKzU1LDIyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRQcm90b2NvbD4gaXByb3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8VFByb3RvY29sPiBvcHJvdCkKLSAgICA6IGNvbm5lY3Rpb25fKGNvbm5lY3Rpb24pCi0gICAgLCB0cmFuc3BvcnRfKHRyYW5zcG9ydCkKLSAgICAsIGlwcm90XyhpcHJvdCkKLSAgICAsIG9wcm90XyhvcHJvdCkKLSAge30KKyAgICA6IGNvbm5lY3Rpb25fKGNvbm5lY3Rpb24pLCB0cmFuc3BvcnRfKHRyYW5zcG9ydCksIGlwcm90XyhpcHJvdCksIG9wcm90XyhvcHJvdCkge30KIH07CiAKIFRRVGNwU2VydmVyOjpUUVRjcFNlcnZlcihzaGFyZWRfcHRyPFFUY3BTZXJ2ZXI+IHNlcnZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRBc3luY1Byb2Nlc3Nvcj4gcHJvY2Vzc29yLAogICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcGZhY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgUU9iamVjdCogcGFyZW50KQotICA6IFFPYmplY3QocGFyZW50KQotICAsIHNlcnZlcl8oc2VydmVyKQotICAsIHByb2Nlc3Nvcl8ocHJvY2Vzc29yKQotICAsIHBmYWN0XyhwZmFjdCkKLXsKKyAgOiBRT2JqZWN0KHBhcmVudCksIHNlcnZlcl8oc2VydmVyKSwgcHJvY2Vzc29yXyhwcm9jZXNzb3IpLCBwZmFjdF8ocGZhY3QpIHsKKyAgcVJlZ2lzdGVyTWV0YVR5cGU8UVRjcFNvY2tldCo+KCJRVGNwU29ja2V0KiIpOwogICBjb25uZWN0KHNlcnZlci5nZXQoKSwgU0lHTkFMKG5ld0Nvbm5lY3Rpb24oKSksIFNMT1QocHJvY2Vzc0luY29taW5nKCkpKTsKIH0KIAotVFFUY3BTZXJ2ZXI6On5UUVRjcFNlcnZlcigpCi17CitUUVRjcFNlcnZlcjo6flRRVGNwU2VydmVyKCkgewogfQogCi12b2lkIFRRVGNwU2VydmVyOjpwcm9jZXNzSW5jb21pbmcoKQotewordm9pZCBUUVRjcFNlcnZlcjo6cHJvY2Vzc0luY29taW5nKCkgewogICB3aGlsZSAoc2VydmVyXy0+aGFzUGVuZGluZ0Nvbm5lY3Rpb25zKCkpIHsKICAgICAvLyB0YWtlIG93bmVyc2hpcCBvZiB0aGUgUVRjcFNvY2tldDsgdGVjaG5pY2FsbHkgaXQgY291bGQgYmUgZGVsZXRlZAogICAgIC8vIHdoZW4gdGhlIFFUY3BTZXJ2ZXIgaXMgZGVzdHJveWVkLCBidXQgYW55IHJlYWwgYXBwIHNob3VsZCBkZWxldGUgdGhpcwpAQCAtODksMjUgKzg1LDIxIEBACiAgICAgICB0cmFuc3BvcnQgPSBzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+KG5ldyBUUUlPRGV2aWNlVHJhbnNwb3J0KGNvbm5lY3Rpb24pKTsKICAgICAgIGlwcm90ID0gc2hhcmVkX3B0cjxUUHJvdG9jb2w+KHBmYWN0Xy0+Z2V0UHJvdG9jb2wodHJhbnNwb3J0KSk7CiAgICAgICBvcHJvdCA9IHNoYXJlZF9wdHI8VFByb3RvY29sPihwZmFjdF8tPmdldFByb3RvY29sKHRyYW5zcG9ydCkpOwotICAgIH0gY2F0Y2goLi4uKSB7CisgICAgfSBjYXRjaCAoLi4uKSB7CiAgICAgICBxV2FybmluZygiW1RRVGNwU2VydmVyXSBGYWlsZWQgdG8gaW5pdGlhbGl6ZSB0cmFuc3BvcnRzL3Byb3RvY29scyIpOwogICAgICAgY29udGludWU7CiAgICAgfQogCi0gICAgY3R4TWFwX1tjb25uZWN0aW9uLmdldCgpXSA9Ci0gICAgICBzaGFyZWRfcHRyPENvbm5lY3Rpb25Db250ZXh0PigKLSAgICAgICAgIG5ldyBDb25uZWN0aW9uQ29udGV4dChjb25uZWN0aW9uLCB0cmFuc3BvcnQsIGlwcm90LCBvcHJvdCkpOworICAgIGN0eE1hcF9bY29ubmVjdGlvbi5nZXQoKV0KKyAgICAgICAgPSBzaGFyZWRfcHRyPENvbm5lY3Rpb25Db250ZXh0PihuZXcgQ29ubmVjdGlvbkNvbnRleHQoY29ubmVjdGlvbiwgdHJhbnNwb3J0LCBpcHJvdCwgb3Byb3QpKTsKIAogICAgIGNvbm5lY3QoY29ubmVjdGlvbi5nZXQoKSwgU0lHTkFMKHJlYWR5UmVhZCgpKSwgU0xPVChiZWdpbkRlY29kZSgpKSk7CiAKLSAgICAvLyBuZWVkIHRvIHVzZSBRdWV1ZWRDb25uZWN0aW9uIHNpbmNlIHdlIHdpbGwgYmUgZGVsZXRpbmcgdGhlIHNvY2tldCBpbiB0aGUgc2xvdAotICAgIGNvbm5lY3QoY29ubmVjdGlvbi5nZXQoKSwgU0lHTkFMKGRpc2Nvbm5lY3RlZCgpKSwgU0xPVChzb2NrZXRDbG9zZWQoKSksCi0gICAgICAgICAgICBRdDo6UXVldWVkQ29ubmVjdGlvbik7CisgICAgY29ubmVjdChjb25uZWN0aW9uLmdldCgpLCBTSUdOQUwoZGlzY29ubmVjdGVkKCkpLCBTTE9UKHNvY2tldENsb3NlZCgpKSk7CiAgIH0KIH0KIAotdm9pZCBUUVRjcFNlcnZlcjo6YmVnaW5EZWNvZGUoKQotewordm9pZCBUUVRjcFNlcnZlcjo6YmVnaW5EZWNvZGUoKSB7CiAgIFFUY3BTb2NrZXQqIGNvbm5lY3Rpb24ocW9iamVjdF9jYXN0PFFUY3BTb2NrZXQqPihzZW5kZXIoKSkpOwogICBRX0FTU0VSVChjb25uZWN0aW9uKTsKIApAQCAtMTE5LDM5ICsxMTEsNDIgQEAKICAgc2hhcmVkX3B0cjxDb25uZWN0aW9uQ29udGV4dD4gY3R4ID0gY3R4TWFwX1tjb25uZWN0aW9uXTsKIAogICB0cnkgewotICAgIHByb2Nlc3Nvcl8tPnByb2Nlc3MoCi0gICAgICBiaW5kKCZUUVRjcFNlcnZlcjo6ZmluaXNoLCB0aGlzLAotICAgICAgICAgICBjdHgsIGFwYWNoZTo6dGhyaWZ0OjpzdGRjeHg6OnBsYWNlaG9sZGVyczo6XzEpLAotICAgICAgY3R4LT5pcHJvdF8sIGN0eC0+b3Byb3RfKTsKLSAgfSBjYXRjaChjb25zdCBUVHJhbnNwb3J0RXhjZXB0aW9uJiBleCkgewotICAgIHFXYXJuaW5nKCJbVFFUY3BTZXJ2ZXJdIFRUcmFuc3BvcnRFeGNlcHRpb24gZHVyaW5nIHByb2Nlc3Npbmc6ICclcyciLAotICAgICAgICAgICAgIGV4LndoYXQoKSk7Ci0gICAgY3R4TWFwXy5lcmFzZShjb25uZWN0aW9uKTsKLSAgfSBjYXRjaCguLi4pIHsKKyAgICBwcm9jZXNzb3JfCisgICAgICAgIC0+cHJvY2VzcyhiaW5kKCZUUVRjcFNlcnZlcjo6ZmluaXNoLCB0aGlzLCBjdHgsIF8xKSwKKyAgICAgICAgICAgICAgICAgIGN0eC0+aXByb3RfLAorICAgICAgICAgICAgICAgICAgY3R4LT5vcHJvdF8pOworICB9IGNhdGNoIChjb25zdCBUVHJhbnNwb3J0RXhjZXB0aW9uJiBleCkgeworICAgIHFXYXJuaW5nKCJbVFFUY3BTZXJ2ZXJdIFRUcmFuc3BvcnRFeGNlcHRpb24gZHVyaW5nIHByb2Nlc3Npbmc6ICclcyciLCBleC53aGF0KCkpOworICAgIHNjaGVkdWxlRGVsZXRlQ29ubmVjdGlvbkNvbnRleHQoY29ubmVjdGlvbik7CisgIH0gY2F0Y2ggKC4uLikgewogICAgIHFXYXJuaW5nKCJbVFFUY3BTZXJ2ZXJdIFVua25vd24gcHJvY2Vzc29yIGV4Y2VwdGlvbiIpOwotICAgIGN0eE1hcF8uZXJhc2UoY29ubmVjdGlvbik7CisgICAgc2NoZWR1bGVEZWxldGVDb25uZWN0aW9uQ29udGV4dChjb25uZWN0aW9uKTsKICAgfQogfQogCi12b2lkIFRRVGNwU2VydmVyOjpzb2NrZXRDbG9zZWQoKQotewordm9pZCBUUVRjcFNlcnZlcjo6c29ja2V0Q2xvc2VkKCkgewogICBRVGNwU29ja2V0KiBjb25uZWN0aW9uKHFvYmplY3RfY2FzdDxRVGNwU29ja2V0Kj4oc2VuZGVyKCkpKTsKICAgUV9BU1NFUlQoY29ubmVjdGlvbik7Ci0KLSAgaWYgKGN0eE1hcF8uZmluZChjb25uZWN0aW9uKSA9PSBjdHhNYXBfLmVuZCgpKSB7Ci0gICAgcVdhcm5pbmcoIltUUVRjcFNlcnZlcl0gVW5rbm93biBRVGNwU29ja2V0IGNsb3NlZCIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGN0eE1hcF8uZXJhc2UoY29ubmVjdGlvbik7CisgIHNjaGVkdWxlRGVsZXRlQ29ubmVjdGlvbkNvbnRleHQoY29ubmVjdGlvbik7CiB9CiAKLXZvaWQgVFFUY3BTZXJ2ZXI6OmZpbmlzaChzaGFyZWRfcHRyPENvbm5lY3Rpb25Db250ZXh0PiBjdHgsIGJvb2wgaGVhbHRoeSkKLXsKK3ZvaWQgVFFUY3BTZXJ2ZXI6OmRlbGV0ZUNvbm5lY3Rpb25Db250ZXh0KFFUY3BTb2NrZXQqIGNvbm5lY3Rpb24pIHsKKyAgY29uc3QgQ29ubmVjdGlvbkNvbnRleHRNYXA6OnNpemVfdHlwZSBkZWxldGVkID0gY3R4TWFwXy5lcmFzZShjb25uZWN0aW9uKTsKKyAgaWYgKDAgPT0gZGVsZXRlZCkgeworICAgICAgcVdhcm5pbmcoIltUUVRjcFNlcnZlcl0gVW5rbm93biBRVGNwU29ja2V0Iik7CisgIH0KK30KKwordm9pZCBUUVRjcFNlcnZlcjo6c2NoZWR1bGVEZWxldGVDb25uZWN0aW9uQ29udGV4dChRVGNwU29ja2V0KiBjb25uZWN0aW9uKSB7CisgIFFNZXRhT2JqZWN0OjppbnZva2VNZXRob2QodGhpcywgImRlbGV0ZUNvbm5lY3Rpb25Db250ZXh0IiwgUXQ6OlF1ZXVlZENvbm5lY3Rpb24sIFFfQVJHKFFUY3BTb2NrZXQqLCBjb25uZWN0aW9uKSk7Cit9CisKK3ZvaWQgVFFUY3BTZXJ2ZXI6OmZpbmlzaChzaGFyZWRfcHRyPENvbm5lY3Rpb25Db250ZXh0PiBjdHgsIGJvb2wgaGVhbHRoeSkgewogICBpZiAoIWhlYWx0aHkpIHsKICAgICBxV2FybmluZygiW1RRVGNwU2VydmVyXSBQcm9jZXNzb3IgZmFpbGVkIHRvIHByb2Nlc3MgZGF0YSBzdWNjZXNzZnVsbHkiKTsKLSAgICBjdHhNYXBfLmVyYXNlKGN0eC0+Y29ubmVjdGlvbl8uZ2V0KCkpOworICAgIGRlbGV0ZUNvbm5lY3Rpb25Db250ZXh0KGN0eC0+Y29ubmVjdGlvbl8uZ2V0KCkpOwogICB9CiB9Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6YXN5bmMKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmFzeW5jCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcXQvVFFUY3BTZXJ2ZXIuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9xdC9UUVRjcFNlcnZlci5oCmluZGV4IDJlZjY0YTcuLjhlM2ZlM2EgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9xdC9UUVRjcFNlcnZlci5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9xdC9UUVRjcFNlcnZlci5oCkBAIC0yMywxMyArMjMsMTkgQEAKICNpbmNsdWRlIDxRT2JqZWN0PgogI2luY2x1ZGUgPFFUY3BTZXJ2ZXI+CiAKLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KKyNpbmNsdWRlIDxtZW1vcnk+CiAKLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHByb3RvY29sIHsKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgcHJvdG9jb2wgewogY2xhc3MgVFByb3RvY29sRmFjdG9yeTsKLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2wKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sCiAKLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIGFzeW5jIHsKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgYXN5bmMgewogCiBjbGFzcyBUQXN5bmNQcm9jZXNzb3I7CiAKQEAgLTM5LDM0ICs0NSwzNyBAQAogICogIHByb2Nlc3NvciBhbmQgYSBwcm90b2NvbCBmYWN0b3J5LCBhbmQgdGhlbiBydW4gdGhlIFF0IGV2ZW50IGxvb3AuCiAgKi8KIGNsYXNzIFRRVGNwU2VydmVyIDogcHVibGljIFFPYmplY3QgewotIFFfT0JKRUNUCi0gcHVibGljOgotICBUUVRjcFNlcnZlcihib29zdDo6c2hhcmVkX3B0cjxRVGNwU2VydmVyPiBzZXJ2ZXIsCi0gICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRBc3luY1Byb2Nlc3Nvcj4gcHJvY2Vzc29yLAotICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgUVRfUFJFUEVORF9OQU1FU1BBQ0UoUU9iamVjdCkqIHBhcmVudCA9IE5VTEwpOworICBRX09CSkVDVAorcHVibGljOgorICBUUVRjcFNlcnZlcihzdGQ6OnNoYXJlZF9wdHI8UVRjcFNlcnZlcj4gc2VydmVyLAorICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VEFzeW5jUHJvY2Vzc29yPiBwcm9jZXNzb3IsCisgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgUU9iamVjdCogcGFyZW50ID0gTlVMTCk7CiAgIHZpcnR1YWwgflRRVGNwU2VydmVyKCk7CiAKLSBwcml2YXRlIFFfU0xPVFM6Citwcml2YXRlIFFfU0xPVFM6CiAgIHZvaWQgcHJvY2Vzc0luY29taW5nKCk7CiAgIHZvaWQgYmVnaW5EZWNvZGUoKTsKICAgdm9pZCBzb2NrZXRDbG9zZWQoKTsKKyAgdm9pZCBkZWxldGVDb25uZWN0aW9uQ29udGV4dChRVGNwU29ja2V0KiBjb25uZWN0aW9uKTsKIAotIHByaXZhdGU6Ci0gIFRRVGNwU2VydmVyKGNvbnN0IFRRVGNwU2VydmVyJik7Ci0gIFRRVGNwU2VydmVyJiBvcGVyYXRvcj0oY29uc3QgVFFUY3BTZXJ2ZXImKTsKK3ByaXZhdGU6CisgIFFfRElTQUJMRV9DT1BZKFRRVGNwU2VydmVyKQogCiAgIHN0cnVjdCBDb25uZWN0aW9uQ29udGV4dDsKIAotICB2b2lkIGZpbmlzaChib29zdDo6c2hhcmVkX3B0cjxDb25uZWN0aW9uQ29udGV4dD4gY3R4LCBib29sIGhlYWx0aHkpOworICB2b2lkIHNjaGVkdWxlRGVsZXRlQ29ubmVjdGlvbkNvbnRleHQoUVRjcFNvY2tldCogY29ubmVjdGlvbik7CisgIHZvaWQgZmluaXNoKHN0ZDo6c2hhcmVkX3B0cjxDb25uZWN0aW9uQ29udGV4dD4gY3R4LCBib29sIGhlYWx0aHkpOwogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFFUY3BTZXJ2ZXI+IHNlcnZlcl87Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRBc3luY1Byb2Nlc3Nvcj4gcHJvY2Vzc29yXzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiBwZmFjdF87CisgIHN0ZDo6c2hhcmVkX3B0cjxRVGNwU2VydmVyPiBzZXJ2ZXJfOworICBzdGQ6OnNoYXJlZF9wdHI8VEFzeW5jUHJvY2Vzc29yPiBwcm9jZXNzb3JfOworICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiBwZmFjdF87CiAKLSAgc3RkOjptYXA8UVRfUFJFUEVORF9OQU1FU1BBQ0UoUVRjcFNvY2tldCkqLCBib29zdDo6c2hhcmVkX3B0cjxDb25uZWN0aW9uQ29udGV4dD4gPiBjdHhNYXBfOworICB0eXBlZGVmIHN0ZDo6bWFwPFFUY3BTb2NrZXQqLCBzdGQ6OnNoYXJlZF9wdHI8Q29ubmVjdGlvbkNvbnRleHQ+ID4gQ29ubmVjdGlvbkNvbnRleHRNYXA7CisgIENvbm5lY3Rpb25Db250ZXh0TWFwIGN0eE1hcF87CiB9OwotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OmFzeW5jCit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojphc3luYwogCiAjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RBU1lOQ19RVENQX1NFUlZFUl9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UQ29ubmVjdGVkQ2xpZW50LmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVENvbm5lY3RlZENsaWVudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNkYWE3NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVENvbm5lY3RlZENsaWVudC5jcHAKQEAgLTAsMCArMSwxMjMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVENvbm5lY3RlZENsaWVudC5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHNlcnZlciB7CisKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6c2VydmVyOjpUU2VydmVyRXZlbnRIYW5kbGVyOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRFeGNlcHRpb247Cit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7Cit1c2luZyBzdGQ6OnN0cmluZzsKKworVENvbm5lY3RlZENsaWVudDo6VENvbm5lY3RlZENsaWVudChjb25zdCBzaGFyZWRfcHRyPFRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFByb3RvY29sPiYgaW5wdXRQcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUUHJvdG9jb2w+JiBvdXRwdXRQcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUU2VydmVyRXZlbnRIYW5kbGVyPiYgZXZlbnRIYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+JiBjbGllbnQpCisKKyAgOiBwcm9jZXNzb3JfKHByb2Nlc3NvciksCisgICAgaW5wdXRQcm90b2NvbF8oaW5wdXRQcm90b2NvbCksCisgICAgb3V0cHV0UHJvdG9jb2xfKG91dHB1dFByb3RvY29sKSwKKyAgICBldmVudEhhbmRsZXJfKGV2ZW50SGFuZGxlciksCisgICAgY2xpZW50XyhjbGllbnQpLAorICAgIG9wYXF1ZUNvbnRleHRfKDApIHsKK30KKworVENvbm5lY3RlZENsaWVudDo6flRDb25uZWN0ZWRDbGllbnQoKSB7Cit9CisKK3ZvaWQgVENvbm5lY3RlZENsaWVudDo6cnVuKCkgeworICBpZiAoZXZlbnRIYW5kbGVyXykgeworICAgIG9wYXF1ZUNvbnRleHRfID0gZXZlbnRIYW5kbGVyXy0+Y3JlYXRlQ29udGV4dChpbnB1dFByb3RvY29sXywgb3V0cHV0UHJvdG9jb2xfKTsKKyAgfQorCisgIGZvciAoYm9vbCBkb25lID0gZmFsc2U7ICFkb25lOykgeworICAgIGlmIChldmVudEhhbmRsZXJfKSB7CisgICAgICBldmVudEhhbmRsZXJfLT5wcm9jZXNzQ29udGV4dChvcGFxdWVDb250ZXh0XywgY2xpZW50Xyk7CisgICAgfQorCisgICAgdHJ5IHsKKyAgICAgIGlmICghcHJvY2Vzc29yXy0+cHJvY2VzcyhpbnB1dFByb3RvY29sXywgb3V0cHV0UHJvdG9jb2xfLCBvcGFxdWVDb250ZXh0XykpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfSBjYXRjaCAoY29uc3QgVFRyYW5zcG9ydEV4Y2VwdGlvbiYgdHR4KSB7CisgICAgICBzd2l0Y2ggKHR0eC5nZXRUeXBlKCkpIHsKKyAgICAgICAgY2FzZSBUVHJhbnNwb3J0RXhjZXB0aW9uOjpFTkRfT0ZfRklMRToKKyAgICAgICAgY2FzZSBUVHJhbnNwb3J0RXhjZXB0aW9uOjpJTlRFUlJVUFRFRDoKKyAgICAgICAgY2FzZSBUVHJhbnNwb3J0RXhjZXB0aW9uOjpUSU1FRF9PVVQ6CisgICAgICAgICAgLy8gQ2xpZW50IGRpc2Nvbm5lY3RlZCBvciB3YXMgaW50ZXJydXB0ZWQgb3IgZGlkIG5vdCByZXNwb25kIHdpdGhpbiB0aGUgcmVjZWl2ZSB0aW1lb3V0LgorICAgICAgICAgIC8vIE5vIGxvZ2dpbmcgbmVlZGVkLiAgRG9uZS4KKyAgICAgICAgICBkb25lID0gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgLy8gQWxsIG90aGVyIHRyYW5zcG9ydCBleGNlcHRpb25zIGFyZSBsb2dnZWQuCisgICAgICAgICAgLy8gU3RhdGUgb2YgY29ubmVjdGlvbiBpcyB1bmtub3duLiAgRG9uZS4KKyAgICAgICAgICBzdHJpbmcgZXJyU3RyID0gc3RyaW5nKCJUQ29ubmVjdGVkQ2xpZW50IGRpZWQ6ICIpICsgdHR4LndoYXQoKTsKKyAgICAgICAgICBHbG9iYWxPdXRwdXQoZXJyU3RyLmNfc3RyKCkpOworICAgICAgICAgIGRvbmUgPSB0cnVlOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgfSBjYXRjaCAoY29uc3QgVEV4Y2VwdGlvbiYgdGV4KSB7CisgICAgICBzdHJpbmcgZXJyU3RyID0gc3RyaW5nKCJUQ29ubmVjdGVkQ2xpZW50IHByb2Nlc3NpbmcgZXhjZXB0aW9uOiAiKSArIHRleC53aGF0KCk7CisgICAgICBHbG9iYWxPdXRwdXQoZXJyU3RyLmNfc3RyKCkpOworICAgICAgLy8gRGlzY29ubmVjdCBmcm9tIGNsaWVudCwgYmVjYXVzZSB3ZSBjb3VsZCBub3QgcHJvY2VzcyB0aGUgbWVzc2FnZS4KKyAgICAgIGRvbmUgPSB0cnVlOworICAgIH0KKyAgfQorCisgIGNsZWFudXAoKTsKK30KKwordm9pZCBUQ29ubmVjdGVkQ2xpZW50OjpjbGVhbnVwKCkgeworICBpZiAoZXZlbnRIYW5kbGVyXykgeworICAgIGV2ZW50SGFuZGxlcl8tPmRlbGV0ZUNvbnRleHQob3BhcXVlQ29udGV4dF8sIGlucHV0UHJvdG9jb2xfLCBvdXRwdXRQcm90b2NvbF8pOworICB9CisKKyAgdHJ5IHsKKyAgICBpbnB1dFByb3RvY29sXy0+Z2V0VHJhbnNwb3J0KCktPmNsb3NlKCk7CisgIH0gY2F0Y2ggKGNvbnN0IFRUcmFuc3BvcnRFeGNlcHRpb24mIHR0eCkgeworICAgIHN0cmluZyBlcnJTdHIgPSBzdHJpbmcoIlRDb25uZWN0ZWRDbGllbnQgaW5wdXQgY2xvc2UgZmFpbGVkOiAiKSArIHR0eC53aGF0KCk7CisgICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKKyAgfQorCisgIHRyeSB7CisgICAgb3V0cHV0UHJvdG9jb2xfLT5nZXRUcmFuc3BvcnQoKS0+Y2xvc2UoKTsKKyAgfSBjYXRjaCAoY29uc3QgVFRyYW5zcG9ydEV4Y2VwdGlvbiYgdHR4KSB7CisgICAgc3RyaW5nIGVyclN0ciA9IHN0cmluZygiVENvbm5lY3RlZENsaWVudCBvdXRwdXQgY2xvc2UgZmFpbGVkOiAiKSArIHR0eC53aGF0KCk7CisgICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKKyAgfQorCisgIHRyeSB7CisgICAgY2xpZW50Xy0+Y2xvc2UoKTsKKyAgfSBjYXRjaCAoY29uc3QgVFRyYW5zcG9ydEV4Y2VwdGlvbiYgdHR4KSB7CisgICAgc3RyaW5nIGVyclN0ciA9IHN0cmluZygiVENvbm5lY3RlZENsaWVudCBjbGllbnQgY2xvc2UgZmFpbGVkOiAiKSArIHR0eC53aGF0KCk7CisgICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKKyAgfQorfQorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6c2VydmVyCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RDb25uZWN0ZWRDbGllbnQuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVENvbm5lY3RlZENsaWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5ZTcwYzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RDb25uZWN0ZWRDbGllbnQuaApAQCAtMCwwICsxLDExMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfU0VSVkVSX1RDT05ORUNURURDTElFTlRfSF8KKyNkZWZpbmUgX1RIUklGVF9TRVJWRVJfVENPTk5FQ1RFRENMSUVOVF9IXyAxCisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dGhyaWZ0L1RQcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UU2VydmVyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0Lmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2Ugc2VydmVyIHsKKworLyoqCisgKiBUaGlzIHJlcHJlc2VudHMgYSBjbGllbnQgY29ubmVjdGVkIHRvIGEgVFNlcnZlci4gIFRoZQorICogcHJvY2Vzc2luZyBsb29wIGZvciBhIGNsaWVudCBtdXN0IHByb3ZpZGUgc29tZSByZXF1aXJlZAorICogZnVuY3Rpb25hbGl0eSBjb21tb24gdG8gYWxsIGltcGxlbWVudGF0aW9ucyBzbyBpdCBpcworICogZW5jYXBzdWxhdGVkIGhlcmUuCisgKi8KKworY2xhc3MgVENvbm5lY3RlZENsaWVudCA6IHB1YmxpYyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlJ1bm5hYmxlIHsKK3B1YmxpYzoKKyAgLyoqCisgICAqIENvbnN0cnVjdG9yLgorICAgKgorICAgKiBAcGFyYW1baW5dIHByb2Nlc3NvciAgICAgIHRoZSBUUHJvY2Vzc29yCisgICAqIEBwYXJhbVtpbl0gaW5wdXRQcm90b2NvbCAgdGhlIGlucHV0IFRQcm90b2NvbAorICAgKiBAcGFyYW1baW5dIG91dHB1dFByb3RvY29sIHRoZSBvdXRwdXQgVFByb3RvY29sCisgICAqIEBwYXJhbVtpbl0gZXZlbnRIYW5kbGVyICAgdGhlIHNlcnZlciBldmVudCBoYW5kbGVyCisgICAqIEBwYXJhbVtpbl0gY2xpZW50ICAgICAgICAgdGhlIFRUcmFuc3BvcnQgcmVwcmVzZW50aW5nIHRoZSBjbGllbnQKKyAgICovCisgIFRDb25uZWN0ZWRDbGllbnQoCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+JiBpbnB1dFByb3RvY29sLAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiYgb3V0cHV0UHJvdG9jb2wsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnNlcnZlcjo6VFNlcnZlckV2ZW50SGFuZGxlcj4mIGV2ZW50SGFuZGxlciwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0PiYgY2xpZW50KTsKKworICAvKioKKyAgICogRGVzdHJ1Y3Rvci4KKyAgICovCisgIHZpcnR1YWwgflRDb25uZWN0ZWRDbGllbnQoKTsKKworICAvKioKKyAgICogRHJpdmUgdGhlIGNsaWVudCB1bnRpbCBpdCBpcyBkb25lLgorICAgKiBUaGUgY2xpZW50IHByb2Nlc3NpbmcgbG9vcCBpczoKKyAgICoKKyAgICogW29wdGlvbmFsXSBjYWxsIGV2ZW50SGFuZGxlci0+Y3JlYXRlQ29udGV4dCBvbmNlCisgICAqIFtvcHRpb25hbF0gY2FsbCBldmVudEhhbmRsZXItPnByb2Nlc3NDb250ZXh0IHBlciByZXF1ZXN0CisgICAqICAgICAgICAgICAgY2FsbCBwcm9jZXNzb3ItPnByb2Nlc3MgcGVyIHJlcXVlc3QKKyAgICogICAgICAgICAgICAgIGhhbmRsZSBleHBlY3RlZCB0cmFuc3BvcnQgZXhjZXB0aW9uczoKKyAgICogICAgICAgICAgICAgICAgRU5EX09GX0ZJTEUgbWVhbnMgdGhlIGNsaWVudCBpcyBnb25lCisgICAqICAgICAgICAgICAgICAgIElOVEVSUlVQVEVEIG1lYW5zIHRoZSBjbGllbnQgd2FzIGludGVycnVwdGVkCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IFRTZXJ2ZXJUcmFuc3BvcnQ6OmludGVycnVwdENoaWxkcmVuKCkKKyAgICogICAgICAgICAgICAgIGhhbmRsZSB1bmV4cGVjdGVkIHRyYW5zcG9ydCBleGNlcHRpb25zIGJ5IGxvZ2dpbmcKKyAgICogICAgICAgICAgICAgIGhhbmRsZSBzdGFuZGFyZCBleGNlcHRpb25zIGJ5IGxvZ2dpbmcKKyAgICogICAgICAgICAgICAgIGhhbmRsZSB1bmV4cGVjdGVkIGV4Y2VwdGlvbnMgYnkgbG9nZ2luZworICAgKiAgICAgICAgICAgIGNsZWFudXAoKQorICAgKi8KKyAgdmlydHVhbCB2b2lkIHJ1bigpIC8qIG92ZXJyaWRlICovOworCitwcm90ZWN0ZWQ6CisgIC8qKgorICAgKiBDbGVhbnVwIGFmdGVyIGEgY2xpZW50LiAgVGhpcyBoYXBwZW5zIGlmIHRoZSBjbGllbnQgZGlzY29ubmVjdHMsCisgICAqIG9yIGlmIHRoZSBzZXJ2ZXIgaXMgc3RvcHBlZCwgb3IgaWYgYW4gZXhjZXB0aW9uIG9jY3Vycy4KKyAgICoKKyAgICogVGhlIGNsZWFudXAgcHJvY2Vzc2luZyBpczoKKyAgICogW29wdGlvbmFsXSBjYWxsIGV2ZW50SGFuZGxlci0+ZGVsZXRlQ29udGV4dCBvbmNlCisgICAqICAgICAgICAgICAgY2xvc2UgdGhlIGlucHV0UHJvdG9jb2wncyBUVHJhbnNwb3J0CisgICAqICAgICAgICAgICAgY2xvc2UgdGhlIG91dHB1dFByb3RvY29sJ3MgVFRyYW5zcG9ydAorICAgKiAgICAgICAgICAgIGNsb3NlIHRoZSBjbGllbnQKKyAgICovCisgIHZpcnR1YWwgdm9pZCBjbGVhbnVwKCk7CisKK3ByaXZhdGU6CisgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3Nvcj4gcHJvY2Vzc29yXzsKKyAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBpbnB1dFByb3RvY29sXzsKKyAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBvdXRwdXRQcm90b2NvbF87CisgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6c2VydmVyOjpUU2VydmVyRXZlbnRIYW5kbGVyPiBldmVudEhhbmRsZXJfOworICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydD4gY2xpZW50XzsKKworICAvKioKKyAgICogQ29udGV4dCBhY3F1aXJlZCBmcm9tIHRoZSBldmVudEhhbmRsZXJfIGlmIG9uZSBleGlzdHMuCisgICAqLworICB2b2lkKiBvcGFxdWVDb250ZXh0XzsKK307Cit9Cit9Cit9CisKKyNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfU0VSVkVSX1RDT05ORUNURURDTElFTlRfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVE5vbmJsb2NraW5nU2VydmVyLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVE5vbmJsb2NraW5nU2VydmVyLmNwcAppbmRleCA4NmE5NmM2Li5mMTZmY2U3IDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5jcHAKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UTm9uYmxvY2tpbmdTZXJ2ZXIuY3BwCkBAIC0xNyw4ICsxNyw2IEBACiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jZGVmaW5lIF9fU1REQ19GT1JNQVRfTUFDUk9TCi0KICNpbmNsdWRlIDx0aHJpZnQvdGhyaWZ0LWNvbmZpZy5oPgogCiAjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UTm9uYmxvY2tpbmdTZXJ2ZXIuaD4KQEAgLTI3LDggKzI1LDE3IEBACiAjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1BsYXRmb3JtVGhyZWFkRmFjdG9yeS5oPgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvUGxhdGZvcm1Tb2NrZXQuaD4KIAorI2luY2x1ZGUgPGFsZ29yaXRobT4KICNpbmNsdWRlIDxpb3N0cmVhbT4KIAorI2lmZGVmIEhBVkVfUE9MTF9ICisjaW5jbHVkZSA8cG9sbC5oPgorI2VsaWYgSEFWRV9TWVNfUE9MTF9ICisjaW5jbHVkZSA8c3lzL3BvbGwuaD4KKyNlbGlmIEhBVkVfU1lTX1NFTEVDVF9ICisjaW5jbHVkZSA8c3lzL3NlbGVjdC5oPgorI2VuZGlmCisKICNpZmRlZiBIQVZFX1NZU19TT0NLRVRfSAogI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KICNlbmRpZgpAQCAtNjAsMjcgKzY3LDI3IEBACiAjZGVmaW5lIEFGX0xPQ0FMIEFGX1VOSVgKICNlbmRpZgogCi0jaWYgIWRlZmluZWQoUFJJdTMyKQotI2RlZmluZSBQUkl1MzIgIkkzMnUiCi0jZGVmaW5lIFBSSXU2NCAiSTY0dSIKKyNpZmRlZiBIQVZFX0lOVFRZUEVTX0gKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgogI2VuZGlmCiAKLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHNlcnZlciB7CisjaWZkZWYgSEFWRV9TVERJTlRfSAorI2luY2x1ZGUgPHN0ZGludC5oPgorI2VuZGlmCisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2Ugc2VydmVyIHsKIAogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDsKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OwogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTsKLXVzaW5nIG5hbWVzcGFjZSBzdGQ7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU29ja2V0OwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjsKLXVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOwogCiAvLy8gVGhyZWUgc3RhdGVzIGZvciBzb2NrZXRzOiByZWN2IGZyYW1lIHNpemUsIHJlY3YgZGF0YSwgYW5kIHNlbmQgbW9kZQotZW51bSBUU29ja2V0U3RhdGUgewotICBTT0NLRVRfUkVDVl9GUkFNSU5HLAotICBTT0NLRVRfUkVDViwKLSAgU09DS0VUX1NFTkQKLX07CitlbnVtIFRTb2NrZXRTdGF0ZSB7IFNPQ0tFVF9SRUNWX0ZSQU1JTkcsIFNPQ0tFVF9SRUNWLCBTT0NLRVRfU0VORCB9OwogCiAvKioKICAqIEZpdmUgc3RhdGVzIGZvciB0aGUgbm9uYmxvY2tpbmcgc2VydmVyOgpAQCAtMTA0LDcgKzExMSw3IEBACiAgKiBlc3NlbnRpYWxseSBlbmNhcHN1bGF0ZXMgYSBzb2NrZXQgdGhhdCBoYXMgc29tZSBhc3NvY2lhdGVkIGxpYmV2ZW50IHN0YXRlLgogICovCiBjbGFzcyBUTm9uYmxvY2tpbmdTZXJ2ZXI6OlRDb25uZWN0aW9uIHsKLSBwcml2YXRlOgorcHJpdmF0ZToKICAgLy8vIFNlcnZlciBJTyBUaHJlYWQgaGFuZGxpbmcgdGhpcyBjb25uZWN0aW9uCiAgIFROb25ibG9ja2luZ0lPVGhyZWFkKiBpb1RocmVhZF87CiAKQEAgLTExMiwxMCArMTE5LDEwIEBACiAgIFROb25ibG9ja2luZ1NlcnZlciogc2VydmVyXzsKIAogICAvLy8gVFByb2Nlc3NvcgotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3JfOworICBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yXzsKIAogICAvLy8gT2JqZWN0IHdyYXBwaW5nIG5ldHdvcmsgc29ja2V0Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTb2NrZXQ+IHRTb2NrZXRfOworICBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gdFNvY2tldF87CiAKICAgLy8vIExpYmV2ZW50IG9iamVjdAogICBzdHJ1Y3QgZXZlbnQgZXZlbnRfOwpAQCAtMTU3LDQxICsxNjQsMzUgQEAKICAgaW50MzJfdCBjYWxsc0ZvclJlc2l6ZV87CiAKICAgLy8vIFRyYW5zcG9ydCB0byByZWFkIGZyb20KLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gaW5wdXRUcmFuc3BvcnRfOworICBzdGQ6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gaW5wdXRUcmFuc3BvcnRfOwogCiAgIC8vLyBUcmFuc3BvcnQgdGhhdCBwcm9jZXNzb3Igd3JpdGVzIHRvCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IG91dHB1dFRyYW5zcG9ydF87CisgIHN0ZDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBvdXRwdXRUcmFuc3BvcnRfOwogCiAgIC8vLyBleHRyYSB0cmFuc3BvcnQgZ2VuZXJhdGVkIGJ5IHRyYW5zcG9ydCBmYWN0b3J5IChlLmcuIEJ1ZmZlcmVkUm91dGVyVHJhbnNwb3J0KQotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBmYWN0b3J5SW5wdXRUcmFuc3BvcnRfOwotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBmYWN0b3J5T3V0cHV0VHJhbnNwb3J0XzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGZhY3RvcnlJbnB1dFRyYW5zcG9ydF87CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBmYWN0b3J5T3V0cHV0VHJhbnNwb3J0XzsKIAogICAvLy8gUHJvdG9jb2wgZGVjb2RlcgotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGlucHV0UHJvdG9jb2xfOworICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBpbnB1dFByb3RvY29sXzsKIAogICAvLy8gUHJvdG9jb2wgZW5jb2RlcgotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IG91dHB1dFByb3RvY29sXzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gb3V0cHV0UHJvdG9jb2xfOwogCiAgIC8vLyBTZXJ2ZXIgZXZlbnQgaGFuZGxlciwgaWYgYW55Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJFdmVudEhhbmRsZXI+IHNlcnZlckV2ZW50SGFuZGxlcl87CisgIHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyRXZlbnRIYW5kbGVyPiBzZXJ2ZXJFdmVudEhhbmRsZXJfOwogCiAgIC8vLyBUaHJpZnQgY2FsbCBjb250ZXh0LCBpZiBhbnkKLSAgdm9pZCAqY29ubmVjdGlvbkNvbnRleHRfOworICB2b2lkKiBjb25uZWN0aW9uQ29udGV4dF87CiAKICAgLy8vIEdvIGludG8gcmVhZCBtb2RlCi0gIHZvaWQgc2V0UmVhZCgpIHsKLSAgICBzZXRGbGFncyhFVl9SRUFEIHwgRVZfUEVSU0lTVCk7Ci0gIH0KKyAgdm9pZCBzZXRSZWFkKCkgeyBzZXRGbGFncyhFVl9SRUFEIHwgRVZfUEVSU0lTVCk7IH0KIAogICAvLy8gR28gaW50byB3cml0ZSBtb2RlCi0gIHZvaWQgc2V0V3JpdGUoKSB7Ci0gICAgc2V0RmxhZ3MoRVZfV1JJVEUgfCBFVl9QRVJTSVNUKTsKLSAgfQorICB2b2lkIHNldFdyaXRlKCkgeyBzZXRGbGFncyhFVl9XUklURSB8IEVWX1BFUlNJU1QpOyB9CiAKICAgLy8vIFNldCBzb2NrZXQgaWRsZQotICB2b2lkIHNldElkbGUoKSB7Ci0gICAgc2V0RmxhZ3MoMCk7Ci0gIH0KKyAgdm9pZCBzZXRJZGxlKCkgeyBzZXRGbGFncygwKTsgfQogCiAgIC8qKgogICAgKiBTZXQgZXZlbnQgZmxhZ3MgZm9yIHRoaXMgY29ubmVjdGlvbi4KQEAgLTIwOCwxMyArMjA5LDEyIEBACiAgICAqLwogICB2b2lkIHdvcmtTb2NrZXQoKTsKIAotIHB1YmxpYzoKLQorcHVibGljOgogICBjbGFzcyBUYXNrOwogCiAgIC8vLyBDb25zdHJ1Y3RvcgotICBUQ29ubmVjdGlvbihUSFJJRlRfU09DS0VUIHNvY2tldCwgVE5vbmJsb2NraW5nSU9UaHJlYWQqIGlvVGhyZWFkLAotICAgICAgICAgICAgICBjb25zdCBzb2NrYWRkciogYWRkciwgc29ja2xlbl90IGFkZHJMZW4pIHsKKyAgVENvbm5lY3Rpb24oc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+IHNvY2tldCwKKyAgICAgICAgICAgICAgVE5vbmJsb2NraW5nSU9UaHJlYWQqIGlvVGhyZWFkKSB7CiAgICAgcmVhZEJ1ZmZlcl8gPSBOVUxMOwogICAgIHJlYWRCdWZmZXJTaXplXyA9IDA7CiAKQEAgLTIyNSwyOSArMjI1LDMxIEBACiAgICAgLy8gb25jZSBwZXIgVENvbm5lY3Rpb24gKHRoZXkgZG9uJ3QgbmVlZCB0byBiZSByZWFsbG9jYXRlZCBvbiBpbml0KCkgY2FsbCkKICAgICBpbnB1dFRyYW5zcG9ydF8ucmVzZXQobmV3IFRNZW1vcnlCdWZmZXIocmVhZEJ1ZmZlcl8sIHJlYWRCdWZmZXJTaXplXykpOwogICAgIG91dHB1dFRyYW5zcG9ydF8ucmVzZXQoCi0gICAgICBuZXcgVE1lbW9yeUJ1ZmZlcihzdGF0aWNfY2FzdDx1aW50MzJfdD4oc2VydmVyXy0+Z2V0V3JpdGVCdWZmZXJEZWZhdWx0U2l6ZSgpKSkpOwotICAgIHRTb2NrZXRfLnJlc2V0KG5ldyBUU29ja2V0KCkpOwotICAgIGluaXQoc29ja2V0LCBpb1RocmVhZCwgYWRkciwgYWRkckxlbik7CisgICAgICAgIG5ldyBUTWVtb3J5QnVmZmVyKHN0YXRpY19jYXN0PHVpbnQzMl90PihzZXJ2ZXJfLT5nZXRXcml0ZUJ1ZmZlckRlZmF1bHRTaXplKCkpKSk7CisKKyAgICB0U29ja2V0XyA9ICBzb2NrZXQ7CisKKyAgICBpbml0KGlvVGhyZWFkKTsKICAgfQogCi0gIH5UQ29ubmVjdGlvbigpIHsKLSAgICBzdGQ6OmZyZWUocmVhZEJ1ZmZlcl8pOwotICB9CisgIH5UQ29ubmVjdGlvbigpIHsgc3RkOjpmcmVlKHJlYWRCdWZmZXJfKTsgfQogCiAgIC8vLyBDbG9zZSB0aGlzIGNvbm5lY3Rpb24gYW5kIGZyZWUgb3IgcmVzZXQgaXRzIHJlc291cmNlcy4KICAgdm9pZCBjbG9zZSgpOwogCi0gLyoqCi0gICAqIENoZWNrIGJ1ZmZlcnMgYWdhaW5zdCBhbnkgc2l6ZSBsaW1pdHMgYW5kIHNocmluayBpdCBpZiBleGNlZWRlZC4KLSAgICoKLSAgICogQHBhcmFtIHJlYWRMaW1pdCB3ZSByZWR1Y2UgcmVhZCBidWZmZXIgc2l6ZSB0byB0aGlzIChpZiBub256ZXJvKS4KLSAgICogQHBhcmFtIHdyaXRlTGltaXQgaWYgbm9uemVybyBhbmQgd3JpdGUgYnVmZmVyIGlzIGxhcmdlciwgcmVwbGFjZSBpdC4KLSAgICovCisgIC8qKgorICAgICogQ2hlY2sgYnVmZmVycyBhZ2FpbnN0IGFueSBzaXplIGxpbWl0cyBhbmQgc2hyaW5rIGl0IGlmIGV4Y2VlZGVkLgorICAgICoKKyAgICAqIEBwYXJhbSByZWFkTGltaXQgd2UgcmVkdWNlIHJlYWQgYnVmZmVyIHNpemUgdG8gdGhpcyAoaWYgbm9uemVybykuCisgICAgKiBAcGFyYW0gd3JpdGVMaW1pdCBpZiBub256ZXJvIGFuZCB3cml0ZSBidWZmZXIgaXMgbGFyZ2VyLCByZXBsYWNlIGl0LgorICAgICovCiAgIHZvaWQgY2hlY2tJZGxlQnVmZmVyTWVtTGltaXQoc2l6ZV90IHJlYWRMaW1pdCwgc2l6ZV90IHdyaXRlTGltaXQpOwogCiAgIC8vLyBJbml0aWFsaXplCi0gIHZvaWQgaW5pdChUSFJJRlRfU09DS0VUIHNvY2tldCwgVE5vbmJsb2NraW5nSU9UaHJlYWQqIGlvVGhyZWFkLAotICAgICAgICAgICAgY29uc3Qgc29ja2FkZHIqIGFkZHIsIHNvY2tsZW5fdCBhZGRyTGVuKTsKKyAgdm9pZCBpbml0KFROb25ibG9ja2luZ0lPVGhyZWFkKiBpb1RocmVhZCk7CisKKyAgLy8vIHNldCBzb2NrZXQgZm9yIGNvbm5lY3Rpb24KKyAgdm9pZCBzZXRTb2NrZXQoc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+IHNvY2tldCk7CiAKICAgLyoqCiAgICAqIFRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlIGFwcGxpY2F0aW9uIHRyYW5zaXRpb25zIGZyb20gb25lIHN0YXRlIGludG8KQEAgLTI3OCw2NSArMjgwLDUyIEBACiAgICAqCiAgICAqIEByZXR1cm4gdHJ1ZSBpZiBzdWNjZXNzZnVsLCBmYWxzZSBpZiB1bmFibGUgdG8gbm90aWZ5IChjaGVjayBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUikuCiAgICAqLwotICBib29sIG5vdGlmeUlPVGhyZWFkKCkgewotICAgIHJldHVybiBpb1RocmVhZF8tPm5vdGlmeSh0aGlzKTsKLSAgfQorICBib29sIG5vdGlmeUlPVGhyZWFkKCkgeyByZXR1cm4gaW9UaHJlYWRfLT5ub3RpZnkodGhpcyk7IH0KIAogICAvKgogICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdGhpcyBjb25uZWN0aW9uJ3MgY3VycmVudGx5IGFzc2lnbmVkIElPCiAgICAqIHRocmVhZC4KICAgICovCi0gIGludCBnZXRJT1RocmVhZE51bWJlcigpIGNvbnN0IHsKLSAgICByZXR1cm4gaW9UaHJlYWRfLT5nZXRUaHJlYWROdW1iZXIoKTsKLSAgfQorICBpbnQgZ2V0SU9UaHJlYWROdW1iZXIoKSBjb25zdCB7IHJldHVybiBpb1RocmVhZF8tPmdldFRocmVhZE51bWJlcigpOyB9CiAKICAgLy8vIEZvcmNlIGNvbm5lY3Rpb24gc2h1dGRvd24gZm9yIHRoaXMgY29ubmVjdGlvbi4KICAgdm9pZCBmb3JjZUNsb3NlKCkgewogICAgIGFwcFN0YXRlXyA9IEFQUF9DTE9TRV9DT05ORUNUSU9OOwogICAgIGlmICghbm90aWZ5SU9UaHJlYWQoKSkgeworICAgICAgc2VydmVyXy0+ZGVjcmVtZW50QWN0aXZlUHJvY2Vzc29ycygpOworICAgICAgY2xvc2UoKTsKICAgICAgIHRocm93IFRFeGNlcHRpb24oIlRDb25uZWN0aW9uOjpmb3JjZUNsb3NlOiBmYWlsZWQgd3JpdGUgb24gbm90aWZ5IHBpcGUiKTsKICAgICB9CiAgIH0KIAogICAvLy8gcmV0dXJuIHRoZSBzZXJ2ZXIgdGhpcyBjb25uZWN0aW9uIHdhcyBpbml0aWFsaXplZCBmb3IuCi0gIFROb25ibG9ja2luZ1NlcnZlciogZ2V0U2VydmVyKCkgY29uc3QgewotICAgIHJldHVybiBzZXJ2ZXJfOwotICB9CisgIFROb25ibG9ja2luZ1NlcnZlciogZ2V0U2VydmVyKCkgY29uc3QgeyByZXR1cm4gc2VydmVyXzsgfQogCiAgIC8vLyBnZXQgc3RhdGUgb2YgY29ubmVjdGlvbi4KLSAgVEFwcFN0YXRlIGdldFN0YXRlKCkgY29uc3QgewotICAgIHJldHVybiBhcHBTdGF0ZV87Ci0gIH0KKyAgVEFwcFN0YXRlIGdldFN0YXRlKCkgY29uc3QgeyByZXR1cm4gYXBwU3RhdGVfOyB9CiAKICAgLy8vIHJldHVybiB0aGUgVFNvY2tldCB0cmFuc3BvcnQgd3JhcHBpbmcgdGhpcyBuZXR3b3JrIGNvbm5lY3Rpb24KLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNvY2tldD4gZ2V0VFNvY2tldCgpIGNvbnN0IHsKLSAgICByZXR1cm4gdFNvY2tldF87Ci0gIH0KKyAgc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+IGdldFRTb2NrZXQoKSBjb25zdCB7IHJldHVybiB0U29ja2V0XzsgfQogCiAgIC8vLyByZXR1cm4gdGhlIHNlcnZlciBldmVudCBoYW5kbGVyIGlmIGFueQotICBib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyRXZlbnRIYW5kbGVyPiBnZXRTZXJ2ZXJFdmVudEhhbmRsZXIoKSB7Ci0gICAgcmV0dXJuIHNlcnZlckV2ZW50SGFuZGxlcl87Ci0gIH0KKyAgc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXJFdmVudEhhbmRsZXI+IGdldFNlcnZlckV2ZW50SGFuZGxlcigpIHsgcmV0dXJuIHNlcnZlckV2ZW50SGFuZGxlcl87IH0KIAogICAvLy8gcmV0dXJuIHRoZSBUaHJpZnQgY29ubmVjdGlvbiBjb250ZXh0IGlmIGFueQotICB2b2lkKiBnZXRDb25uZWN0aW9uQ29udGV4dCgpIHsKLSAgICByZXR1cm4gY29ubmVjdGlvbkNvbnRleHRfOwotICB9Ci0KKyAgdm9pZCogZ2V0Q29ubmVjdGlvbkNvbnRleHQoKSB7IHJldHVybiBjb25uZWN0aW9uQ29udGV4dF87IH0KIH07CiAKLWNsYXNzIFROb25ibG9ja2luZ1NlcnZlcjo6VENvbm5lY3Rpb246OlRhc2s6IHB1YmxpYyBSdW5uYWJsZSB7Ci0gcHVibGljOgotICBUYXNrKGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvciwKLSAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGlucHV0LAotICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gb3V0cHV0LAotICAgICAgIFRDb25uZWN0aW9uKiBjb25uZWN0aW9uKSA6Ci0gICAgcHJvY2Vzc29yXyhwcm9jZXNzb3IpLAotICAgIGlucHV0XyhpbnB1dCksCi0gICAgb3V0cHV0XyhvdXRwdXQpLAotICAgIGNvbm5lY3Rpb25fKGNvbm5lY3Rpb24pLAotICAgIHNlcnZlckV2ZW50SGFuZGxlcl8oY29ubmVjdGlvbl8tPmdldFNlcnZlckV2ZW50SGFuZGxlcigpKSwKLSAgICBjb25uZWN0aW9uQ29udGV4dF8oY29ubmVjdGlvbl8tPmdldENvbm5lY3Rpb25Db250ZXh0KCkpIHt9CitjbGFzcyBUTm9uYmxvY2tpbmdTZXJ2ZXI6OlRDb25uZWN0aW9uOjpUYXNrIDogcHVibGljIFJ1bm5hYmxlIHsKK3B1YmxpYzoKKyAgVGFzayhzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yLAorICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGlucHV0LAorICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IG91dHB1dCwKKyAgICAgICBUQ29ubmVjdGlvbiogY29ubmVjdGlvbikKKyAgICA6IHByb2Nlc3Nvcl8ocHJvY2Vzc29yKSwKKyAgICAgIGlucHV0XyhpbnB1dCksCisgICAgICBvdXRwdXRfKG91dHB1dCksCisgICAgICBjb25uZWN0aW9uXyhjb25uZWN0aW9uKSwKKyAgICAgIHNlcnZlckV2ZW50SGFuZGxlcl8oY29ubmVjdGlvbl8tPmdldFNlcnZlckV2ZW50SGFuZGxlcigpKSwKKyAgICAgIGNvbm5lY3Rpb25Db250ZXh0Xyhjb25uZWN0aW9uXy0+Z2V0Q29ubmVjdGlvbkNvbnRleHQoKSkge30KIAogICB2b2lkIHJ1bigpIHsKICAgICB0cnkgewpAQCAtMzQ0LDUwICszMzMsNDUgQEAKICAgICAgICAgaWYgKHNlcnZlckV2ZW50SGFuZGxlcl8pIHsKICAgICAgICAgICBzZXJ2ZXJFdmVudEhhbmRsZXJfLT5wcm9jZXNzQ29udGV4dChjb25uZWN0aW9uQ29udGV4dF8sIGNvbm5lY3Rpb25fLT5nZXRUU29ja2V0KCkpOwogICAgICAgICB9Ci0gICAgICAgIGlmICghcHJvY2Vzc29yXy0+cHJvY2VzcyhpbnB1dF8sIG91dHB1dF8sIGNvbm5lY3Rpb25Db250ZXh0XykgfHwKLSAgICAgICAgICAgICFpbnB1dF8tPmdldFRyYW5zcG9ydCgpLT5wZWVrKCkpIHsKKyAgICAgICAgaWYgKCFwcm9jZXNzb3JfLT5wcm9jZXNzKGlucHV0Xywgb3V0cHV0XywgY29ubmVjdGlvbkNvbnRleHRfKQorICAgICAgICAgICAgfHwgIWlucHV0Xy0+Z2V0VHJhbnNwb3J0KCktPnBlZWsoKSkgewogICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICB9CiAgICAgfSBjYXRjaCAoY29uc3QgVFRyYW5zcG9ydEV4Y2VwdGlvbiYgdHR4KSB7CiAgICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJUTm9uYmxvY2tpbmdTZXJ2ZXI6IGNsaWVudCBkaWVkOiAlcyIsIHR0eC53aGF0KCkpOwotICAgIH0gY2F0Y2ggKGNvbnN0IGJhZF9hbGxvYyYpIHsKKyAgICB9IGNhdGNoIChjb25zdCBzdGQ6OmJhZF9hbGxvYyYpIHsKICAgICAgIEdsb2JhbE91dHB1dCgiVE5vbmJsb2NraW5nU2VydmVyOiBjYXVnaHQgYmFkX2FsbG9jIGV4Y2VwdGlvbi4iKTsKICAgICAgIGV4aXQoMSk7CiAgICAgfSBjYXRjaCAoY29uc3Qgc3RkOjpleGNlcHRpb24mIHgpIHsKICAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoIlROb25ibG9ja2luZ1NlcnZlcjogcHJvY2VzcygpIGV4Y2VwdGlvbjogJXM6ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZWlkKHgpLm5hbWUoKSwgeC53aGF0KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlaWQoeCkubmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICB4LndoYXQoKSk7CiAgICAgfSBjYXRjaCAoLi4uKSB7Ci0gICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKAotICAgICAgICAiVE5vbmJsb2NraW5nU2VydmVyOiB1bmtub3duIGV4Y2VwdGlvbiB3aGlsZSBwcm9jZXNzaW5nLiIpOworICAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiVE5vbmJsb2NraW5nU2VydmVyOiB1bmtub3duIGV4Y2VwdGlvbiB3aGlsZSBwcm9jZXNzaW5nLiIpOwogICAgIH0KIAogICAgIC8vIFNpZ25hbCBjb21wbGV0aW9uIGJhY2sgdG8gdGhlIGxpYmV2ZW50IHRocmVhZCB2aWEgYSBwaXBlCiAgICAgaWYgKCFjb25uZWN0aW9uXy0+bm90aWZ5SU9UaHJlYWQoKSkgeworICAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiVE5vbmJsb2NraW5nU2VydmVyOiBmYWlsZWQgdG8gbm90aWZ5SU9UaHJlYWQsIGNsb3NpbmcuIik7CisgICAgICBjb25uZWN0aW9uXy0+c2VydmVyXy0+ZGVjcmVtZW50QWN0aXZlUHJvY2Vzc29ycygpOworICAgICAgY29ubmVjdGlvbl8tPmNsb3NlKCk7CiAgICAgICB0aHJvdyBURXhjZXB0aW9uKCJUTm9uYmxvY2tpbmdTZXJ2ZXI6OlRhc2s6OnJ1bjogZmFpbGVkIHdyaXRlIG9uIG5vdGlmeSBwaXBlIik7CiAgICAgfQogICB9CiAKLSAgVENvbm5lY3Rpb24qIGdldFRDb25uZWN0aW9uKCkgewotICAgIHJldHVybiBjb25uZWN0aW9uXzsKLSAgfQorICBUQ29ubmVjdGlvbiogZ2V0VENvbm5lY3Rpb24oKSB7IHJldHVybiBjb25uZWN0aW9uXzsgfQogCi0gcHJpdmF0ZToKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yXzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBpbnB1dF87Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gb3V0cHV0XzsKK3ByaXZhdGU6CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3JfOworICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBpbnB1dF87CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IG91dHB1dF87CiAgIFRDb25uZWN0aW9uKiBjb25uZWN0aW9uXzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlckV2ZW50SGFuZGxlcj4gc2VydmVyRXZlbnRIYW5kbGVyXzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXJFdmVudEhhbmRsZXI+IHNlcnZlckV2ZW50SGFuZGxlcl87CiAgIHZvaWQqIGNvbm5lY3Rpb25Db250ZXh0XzsKIH07CiAKLXZvaWQgVE5vbmJsb2NraW5nU2VydmVyOjpUQ29ubmVjdGlvbjo6aW5pdChUSFJJRlRfU09DS0VUIHNvY2tldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTm9uYmxvY2tpbmdJT1RocmVhZCogaW9UaHJlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc29ja2FkZHIqIGFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2xlbl90IGFkZHJMZW4pIHsKLSAgdFNvY2tldF8tPnNldFNvY2tldEZEKHNvY2tldCk7Ci0gIHRTb2NrZXRfLT5zZXRDYWNoZWRBZGRyZXNzKGFkZHIsIGFkZHJMZW4pOwotCit2b2lkIFROb25ibG9ja2luZ1NlcnZlcjo6VENvbm5lY3Rpb246OmluaXQoVE5vbmJsb2NraW5nSU9UaHJlYWQqIGlvVGhyZWFkKSB7CiAgIGlvVGhyZWFkXyA9IGlvVGhyZWFkOwogICBzZXJ2ZXJfID0gaW9UaHJlYWQtPmdldFNlcnZlcigpOwogICBhcHBTdGF0ZV8gPSBBUFBfSU5JVDsKQEAgLTQwNSwyMiArMzg5LDIzIEBACiAgIGNhbGxzRm9yUmVzaXplXyA9IDA7CiAKICAgLy8gZ2V0IGlucHV0L3RyYW5zcG9ydHMKLSAgZmFjdG9yeUlucHV0VHJhbnNwb3J0XyA9IHNlcnZlcl8tPmdldElucHV0VHJhbnNwb3J0RmFjdG9yeSgpLT5nZXRUcmFuc3BvcnQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0VHJhbnNwb3J0Xyk7Ci0gIGZhY3RvcnlPdXRwdXRUcmFuc3BvcnRfID0gc2VydmVyXy0+Z2V0T3V0cHV0VHJhbnNwb3J0RmFjdG9yeSgpLT5nZXRUcmFuc3BvcnQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFRyYW5zcG9ydF8pOworICBmYWN0b3J5SW5wdXRUcmFuc3BvcnRfID0gc2VydmVyXy0+Z2V0SW5wdXRUcmFuc3BvcnRGYWN0b3J5KCktPmdldFRyYW5zcG9ydChpbnB1dFRyYW5zcG9ydF8pOworICBmYWN0b3J5T3V0cHV0VHJhbnNwb3J0XyA9IHNlcnZlcl8tPmdldE91dHB1dFRyYW5zcG9ydEZhY3RvcnkoKS0+Z2V0VHJhbnNwb3J0KG91dHB1dFRyYW5zcG9ydF8pOwogCiAgIC8vIENyZWF0ZSBwcm90b2NvbAotICBpbnB1dFByb3RvY29sXyA9IHNlcnZlcl8tPmdldElucHV0UHJvdG9jb2xGYWN0b3J5KCktPmdldFByb3RvY29sKAotICAgICAgICAgICAgICAgICAgICAgZmFjdG9yeUlucHV0VHJhbnNwb3J0Xyk7Ci0gIG91dHB1dFByb3RvY29sXyA9IHNlcnZlcl8tPmdldE91dHB1dFByb3RvY29sRmFjdG9yeSgpLT5nZXRQcm90b2NvbCgKLSAgICAgICAgICAgICAgICAgICAgIGZhY3RvcnlPdXRwdXRUcmFuc3BvcnRfKTsKKyAgaWYgKHNlcnZlcl8tPmdldEhlYWRlclRyYW5zcG9ydCgpKSB7CisgICAgaW5wdXRQcm90b2NvbF8gPSBzZXJ2ZXJfLT5nZXRJbnB1dFByb3RvY29sRmFjdG9yeSgpLT5nZXRQcm90b2NvbChmYWN0b3J5SW5wdXRUcmFuc3BvcnRfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yeU91dHB1dFRyYW5zcG9ydF8pOworICAgIG91dHB1dFByb3RvY29sXyA9IGlucHV0UHJvdG9jb2xfOworICB9IGVsc2UgeworICAgIGlucHV0UHJvdG9jb2xfID0gc2VydmVyXy0+Z2V0SW5wdXRQcm90b2NvbEZhY3RvcnkoKS0+Z2V0UHJvdG9jb2woZmFjdG9yeUlucHV0VHJhbnNwb3J0Xyk7CisgICAgb3V0cHV0UHJvdG9jb2xfID0gc2VydmVyXy0+Z2V0T3V0cHV0UHJvdG9jb2xGYWN0b3J5KCktPmdldFByb3RvY29sKGZhY3RvcnlPdXRwdXRUcmFuc3BvcnRfKTsKKyAgfQogCiAgIC8vIFNldCB1cCBmb3IgYW55IHNlcnZlciBldmVudCBoYW5kbGVyCiAgIHNlcnZlckV2ZW50SGFuZGxlcl8gPSBzZXJ2ZXJfLT5nZXRFdmVudEhhbmRsZXIoKTsKICAgaWYgKHNlcnZlckV2ZW50SGFuZGxlcl8pIHsKLSAgICBjb25uZWN0aW9uQ29udGV4dF8gPSBzZXJ2ZXJFdmVudEhhbmRsZXJfLT5jcmVhdGVDb250ZXh0KGlucHV0UHJvdG9jb2xfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2xfKTsKKyAgICBjb25uZWN0aW9uQ29udGV4dF8gPSBzZXJ2ZXJFdmVudEhhbmRsZXJfLT5jcmVhdGVDb250ZXh0KGlucHV0UHJvdG9jb2xfLCBvdXRwdXRQcm90b2NvbF8pOwogICB9IGVsc2UgewogICAgIGNvbm5lY3Rpb25Db250ZXh0XyA9IE5VTEw7CiAgIH0KQEAgLTQyOSw4ICs0MTQsMTIgQEAKICAgcHJvY2Vzc29yXyA9IHNlcnZlcl8tPmdldFByb2Nlc3NvcihpbnB1dFByb3RvY29sXywgb3V0cHV0UHJvdG9jb2xfLCB0U29ja2V0Xyk7CiB9CiAKK3ZvaWQgVE5vbmJsb2NraW5nU2VydmVyOjpUQ29ubmVjdGlvbjo6c2V0U29ja2V0KHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0PiBzb2NrZXQpIHsKKyAgdFNvY2tldF8gPSBzb2NrZXQ7Cit9CisKIHZvaWQgVE5vbmJsb2NraW5nU2VydmVyOjpUQ29ubmVjdGlvbjo6d29ya1NvY2tldCgpIHsKLSAgaW50IGdvdD0wLCBsZWZ0PTAsIHNlbnQ9MDsKKyAgaW50IGdvdCA9IDAsIGxlZnQgPSAwLCBzZW50ID0gMDsKICAgdWludDMyX3QgZmV0Y2ggPSAwOwogCiAgIHN3aXRjaCAoc29ja2V0U3RhdGVfKSB7CkBAIC00NTQsMTAgKzQ0MywxNCBAQAogICAgICAgfQogICAgICAgcmVhZEJ1ZmZlclBvc18gKz0gZmV0Y2g7CiAgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYgdGUpIHsKLSAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoIlRDb25uZWN0aW9uOjp3b3JrU29ja2V0KCk6ICVzIiwgdGUud2hhdCgpKTsKLSAgICAgIGNsb3NlKCk7CisgICAgICAvL0luIE5vbmJsb2NraW5nIFNTTFNvY2tldCBzb21lIG9wZXJhdGlvbnMgbmVlZCB0byBiZSByZXRyaWVkIGFnYWluLgorICAgICAgLy9DdXJyZW50IGFwcHJvYWNoIGlzIHBhcnNpbmcgZXhjZXB0aW9uIG1lc3NhZ2UsIGJ1dCBhIGJldHRlciBzb2x1dGlvbiBuZWVkcyB0byBiZSBpbnZlc3RpZ2F0ZWQuCisgICAgICBpZighc3Ryc3RyKHRlLndoYXQoKSwgInJldHJ5IikpIHsKKyAgICAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiVENvbm5lY3Rpb246OndvcmtTb2NrZXQoKTogJXMiLCB0ZS53aGF0KCkpOworICAgICAgICBjbG9zZSgpOwogCi0gICAgICByZXR1cm47CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KICAgICB9CiAKICAgICBpZiAocmVhZEJ1ZmZlclBvc18gPCBzaXplb2YoZnJhbWluZy5zaXplKSkgewpAQCAtNDcwLDE3ICs0NjMsMzEgQEAKICAgICBpZiAocmVhZFdhbnRfID4gc2VydmVyXy0+Z2V0TWF4RnJhbWVTaXplKCkpIHsKICAgICAgIC8vIERvbid0IGFsbG93IGdpYW50IGZyYW1lIHNpemVzLiAgVGhpcyBwcmV2ZW50cyBiYWQgY2xpZW50cyBmcm9tCiAgICAgICAvLyBjYXVzaW5nIHVzIHRvIHRyeSBhbmQgYWxsb2NhdGUgYSBnaWFudCBidWZmZXIuCi0gICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJUTm9uYmxvY2tpbmdTZXJ2ZXI6IGZyYW1lIHNpemUgdG9vIGxhcmdlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIiglIiBQUkl1MzIgIiA+ICUiIFBSSXU2NCAiKSBmcm9tIGNsaWVudCAlcy4gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVtb3RlIHNpZGUgbm90IHVzaW5nIFRGcmFtZWRUcmFuc3BvcnQ/IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZFdhbnRfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDY0X3Qpc2VydmVyXy0+Z2V0TWF4RnJhbWVTaXplKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHRTb2NrZXRfLT5nZXRTb2NrZXRJbmZvKCkuY19zdHIoKSk7CisgICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKAorICAgICAgICAgICJUTm9uYmxvY2tpbmdTZXJ2ZXI6IGZyYW1lIHNpemUgdG9vIGxhcmdlICIKKyAgICAgICAgICAiKCUiIFBSSXUzMiAiID4gJSIgUFJJdTY0CisgICAgICAgICAgIikgZnJvbSBjbGllbnQgJXMuICIKKyAgICAgICAgICAiUmVtb3RlIHNpZGUgbm90IHVzaW5nIFRGcmFtZWRUcmFuc3BvcnQ/IiwKKyAgICAgICAgICByZWFkV2FudF8sCisgICAgICAgICAgKHVpbnQ2NF90KXNlcnZlcl8tPmdldE1heEZyYW1lU2l6ZSgpLAorICAgICAgICAgIHRTb2NrZXRfLT5nZXRTb2NrZXRJbmZvKCkuY19zdHIoKSk7CiAgICAgICBjbG9zZSgpOwogICAgICAgcmV0dXJuOwogICAgIH0KICAgICAvLyBzaXplIGtub3duOyBub3cgZ2V0IHRoZSByZXN0IG9mIHRoZSBmcmFtZQogICAgIHRyYW5zaXRpb24oKTsKKworICAgIC8vIElmIHRoZSBzb2NrZXQgaGFzIG1vcmUgZGF0YSB0aGFuIHRoZSBmcmFtZSBoZWFkZXIsIGNvbnRpbnVlIHRvIHdvcmsgb24gaXQuIFRoaXMgaXMgbm90IHN0cmljdGx5IG5lY2Vzc2FyeSBmb3IKKyAgICAvLyByZWd1bGFyIHNvY2tldHMsIGJlY2F1c2UgaWYgdGhlcmUgaXMgbW9yZSBkYXRhLCBsaWJldmVudCB3aWxsIGZpcmUgdGhlIGV2ZW50IGhhbmRsZXIgcmVnaXN0ZXJlZCBmb3IgcmVhZAorICAgIC8vIHJlYWRpbmVzcywgd2hpY2ggd2lsbCBpbiB0dXJuIGNhbGwgd29ya1NvY2tldCgpLiBIb3dldmVyLCBzb21lIHNvY2tldCB0eXBlcyAoc3VjaCBhcyBUU1NMU29ja2V0KSBtYXkgaGF2ZSB0aGUKKyAgICAvLyBkYXRhIHNpdHRpbmcgaW4gdGhlaXIgaW50ZXJuYWwgYnVmZmVycyBhbmQgZnJvbSBsaWJldmVudCdzIHBlcnNwZWN0aXZlLCB0aGVyZSBpcyBubyBmdXJ0aGVyIGRhdGEgYXZhaWxhYmxlLiBJbgorICAgIC8vIHRoYXQgY2FzZSwgbm90IGhhdmluZyB0aGlzIHdvcmtTb2NrZXQoKSBjYWxsIGhlcmUgd291bGQgcmVzdWx0IGluIGEgaGFuZyBhcyB3ZSB3aWxsIG5ldmVyIGdldCB0byB3b3JrIHRoZSBzb2NrZXQsCisgICAgLy8gZGVzcGl0ZSBoYXZpbmcgbW9yZSBkYXRhLgorICAgIGlmICh0U29ja2V0Xy0+aGFzUGVuZGluZ0RhdGFUb1JlYWQoKSkKKyAgICB7CisgICAgICAgIHdvcmtTb2NrZXQoKTsKKyAgICB9CisKICAgICByZXR1cm47CiAKICAgY2FzZSBTT0NLRVRfUkVDVjoKQEAgLTQ5MSwxMCArNDk4LDEzIEBACiAgICAgICAvLyBSZWFkIGZyb20gdGhlIHNvY2tldAogICAgICAgZmV0Y2ggPSByZWFkV2FudF8gLSByZWFkQnVmZmVyUG9zXzsKICAgICAgIGdvdCA9IHRTb2NrZXRfLT5yZWFkKHJlYWRCdWZmZXJfICsgcmVhZEJ1ZmZlclBvc18sIGZldGNoKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mIHRlKSB7Ci0gICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJUQ29ubmVjdGlvbjo6d29ya1NvY2tldCgpOiAlcyIsIHRlLndoYXQoKSk7Ci0gICAgICBjbG9zZSgpOworICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mIHRlKSB7CisgICAgICAvL0luIE5vbmJsb2NraW5nIFNTTFNvY2tldCBzb21lIG9wZXJhdGlvbnMgbmVlZCB0byBiZSByZXRyaWVkIGFnYWluLgorICAgICAgLy9DdXJyZW50IGFwcHJvYWNoIGlzIHBhcnNpbmcgZXhjZXB0aW9uIG1lc3NhZ2UsIGJ1dCBhIGJldHRlciBzb2x1dGlvbiBuZWVkcyB0byBiZSBpbnZlc3RpZ2F0ZWQuCisgICAgICBpZighc3Ryc3RyKHRlLndoYXQoKSwgInJldHJ5IikpIHsKKyAgICAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiVENvbm5lY3Rpb246OndvcmtTb2NrZXQoKTogJXMiLCB0ZS53aGF0KCkpOworICAgICAgICBjbG9zZSgpOworICAgICAgfQogCiAgICAgICByZXR1cm47CiAgICAgfQpAQCAtNTI0LDcgKzUzNCw3IEBACiAKICAgICAvLyBJZiB0aGVyZSBpcyBubyBkYXRhIHRvIHNlbmQsIHRoZW4gbGV0IHVzIG1vdmUgb24KICAgICBpZiAod3JpdGVCdWZmZXJQb3NfID09IHdyaXRlQnVmZmVyU2l6ZV8pIHsKLSAgICAgIEdsb2JhbE91dHB1dCgiV0FSTklORzogU2VuZCBzdGF0ZSB3aXRoIG5vIGRhdGEgdG8gc2VuZFxuIik7CisgICAgICBHbG9iYWxPdXRwdXQoIldBUk5JTkc6IFNlbmQgc3RhdGUgd2l0aCBubyBkYXRhIHRvIHNlbmQiKTsKICAgICAgIHRyYW5zaXRpb24oKTsKICAgICAgIHJldHVybjsKICAgICB9CkBAIC01MzIsOCArNTQyLDcgQEAKICAgICB0cnkgewogICAgICAgbGVmdCA9IHdyaXRlQnVmZmVyU2l6ZV8gLSB3cml0ZUJ1ZmZlclBvc187CiAgICAgICBzZW50ID0gdFNvY2tldF8tPndyaXRlX3BhcnRpYWwod3JpdGVCdWZmZXJfICsgd3JpdGVCdWZmZXJQb3NfLCBsZWZ0KTsKLSAgICB9Ci0gICAgY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mIHRlKSB7CisgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYgdGUpIHsKICAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoIlRDb25uZWN0aW9uOjp3b3JrU29ja2V0KCk6ICVzICIsIHRlLndoYXQoKSk7CiAgICAgICBjbG9zZSgpOwogICAgICAgcmV0dXJuOwpAQCAtNTU3LDYgKzU2NiwxMyBAQAogICB9CiB9CiAKK2Jvb2wgVE5vbmJsb2NraW5nU2VydmVyOjpnZXRIZWFkZXJUcmFuc3BvcnQoKSB7CisgIC8vIEN1cnJlbnRseSBpZiB0aGVyZSBpcyBubyBvdXRwdXQgcHJvdG9jb2wgZmFjdG9yeSwKKyAgLy8gd2UgYXNzdW1lIGhlYWRlciB0cmFuc3BvcnQgKHdpdGhvdXQgaGF2aW5nIHRvIGNyZWF0ZQorICAvLyBhIG5ldyB0cmFuc3BvcnQgYW5kIGNoZWNrKQorICByZXR1cm4gZ2V0T3V0cHV0UHJvdG9jb2xGYWN0b3J5KCkgPT0gTlVMTDsKK30KKwogLyoqCiAgKiBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBhcHBsaWNhdGlvbiB0cmFuc2l0aW9ucyBmcm9tIG9uZSBzdGF0ZSBpbnRvCiAgKiBhbm90aGVyLiBUaGlzIG1lYW5zIHRoYXQgaXQgaGFzIGZpbmlzaGVkIHdyaXRpbmcgdGhlIGRhdGEgdGhhdCBpdCBuZWVkZWQKQEAgLTU3MywxMiArNTg5LDIwIEBACiAgIGNhc2UgQVBQX1JFQURfUkVRVUVTVDoKICAgICAvLyBXZSBhcmUgZG9uZSByZWFkaW5nIHRoZSByZXF1ZXN0LCBwYWNrYWdlIHRoZSByZWFkIGJ1ZmZlciBpbnRvIHRyYW5zcG9ydAogICAgIC8vIGFuZCBnZXQgYmFjayBzb21lIGRhdGEgZnJvbSB0aGUgZGlzcGF0Y2ggZnVuY3Rpb24KLSAgICBpbnB1dFRyYW5zcG9ydF8tPnJlc2V0QnVmZmVyKHJlYWRCdWZmZXJfLCByZWFkQnVmZmVyUG9zXyk7Ci0gICAgb3V0cHV0VHJhbnNwb3J0Xy0+cmVzZXRCdWZmZXIoKTsKLSAgICAvLyBQcmVwZW5kIGZvdXIgYnl0ZXMgb2YgYmxhbmsgc3BhY2UgdG8gdGhlIGJ1ZmZlciBzbyB3ZSBjYW4KLSAgICAvLyB3cml0ZSB0aGUgZnJhbWUgc2l6ZSB0aGVyZSBsYXRlci4KLSAgICBvdXRwdXRUcmFuc3BvcnRfLT5nZXRXcml0ZVB0cig0KTsKLSAgICBvdXRwdXRUcmFuc3BvcnRfLT53cm90ZUJ5dGVzKDQpOworICAgIGlmIChzZXJ2ZXJfLT5nZXRIZWFkZXJUcmFuc3BvcnQoKSkgeworICAgICAgaW5wdXRUcmFuc3BvcnRfLT5yZXNldEJ1ZmZlcihyZWFkQnVmZmVyXywgcmVhZEJ1ZmZlclBvc18pOworICAgICAgb3V0cHV0VHJhbnNwb3J0Xy0+cmVzZXRCdWZmZXIoKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gV2Ugc2F2ZWQgcm9vbSBmb3IgdGhlIGZyYW1pbmcgc2l6ZSBpbiBjYXNlIGhlYWRlciB0cmFuc3BvcnQgbmVlZGVkIGl0LAorICAgICAgLy8gYnV0IGp1c3Qgc2tpcCBpdCBmb3IgdGhlIG5vbi1oZWFkZXIgY2FzZQorICAgICAgaW5wdXRUcmFuc3BvcnRfLT5yZXNldEJ1ZmZlcihyZWFkQnVmZmVyXyArIDQsIHJlYWRCdWZmZXJQb3NfIC0gNCk7CisgICAgICBvdXRwdXRUcmFuc3BvcnRfLT5yZXNldEJ1ZmZlcigpOworCisgICAgICAvLyBQcmVwZW5kIGZvdXIgYnl0ZXMgb2YgYmxhbmsgc3BhY2UgdG8gdGhlIGJ1ZmZlciBzbyB3ZSBjYW4KKyAgICAgIC8vIHdyaXRlIHRoZSBmcmFtZSBzaXplIHRoZXJlIGxhdGVyLgorICAgICAgb3V0cHV0VHJhbnNwb3J0Xy0+Z2V0V3JpdGVQdHIoNCk7CisgICAgICBvdXRwdXRUcmFuc3BvcnRfLT53cm90ZUJ5dGVzKDQpOworICAgIH0KIAogICAgIHNlcnZlcl8tPmluY3JlbWVudEFjdGl2ZVByb2Nlc3NvcnMoKTsKIApAQCAtNTg2LDQ1ICs2MTAsNDkgQEAKICAgICAgIC8vIFdlIGFyZSBzZXR0aW5nIHVwIGEgVGFzayB0byBkbyB0aGlzIHdvcmsgYW5kIHdlIHdpbGwgd2FpdCBvbiBpdAogCiAgICAgICAvLyBDcmVhdGUgdGFzayBhbmQgZGlzcGF0Y2ggdG8gdGhlIHRocmVhZCBtYW5hZ2VyCi0gICAgICBib29zdDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzayA9Ci0gICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFJ1bm5hYmxlPihuZXcgVGFzayhwcm9jZXNzb3JfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRQcm90b2NvbF8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQcm90b2NvbF8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzKSk7CisgICAgICBzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+IHRhc2sgPSBzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+KAorICAgICAgICAgIG5ldyBUYXNrKHByb2Nlc3Nvcl8sIGlucHV0UHJvdG9jb2xfLCBvdXRwdXRQcm90b2NvbF8sIHRoaXMpKTsKICAgICAgIC8vIFRoZSBhcHBsaWNhdGlvbiBpcyBub3cgd2FpdGluZyBvbiB0aGUgdGFzayB0byBmaW5pc2gKICAgICAgIGFwcFN0YXRlXyA9IEFQUF9XQUlUX1RBU0s7CiAKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICBzZXJ2ZXJfLT5hZGRUYXNrKHRhc2spOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gJiBpc2UpIHsKLSAgICAgICAgICAvLyBUaGUgVGhyZWFkTWFuYWdlciBpcyBub3QgcmVhZHkgdG8gaGFuZGxlIGFueSBtb3JlIHRhc2tzIChpdCdzIHByb2JhYmx5IHNodXR0aW5nIGRvd24pLgotICAgICAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbjogU2VydmVyOjpwcm9jZXNzKCkgJXMiLCBpc2Uud2hhdCgpKTsKLSAgICAgICAgICBjbG9zZSgpOwotICAgICAgICB9Ci0KICAgICAgIC8vIFNldCB0aGlzIGNvbm5lY3Rpb24gaWRsZSBzbyB0aGF0IGxpYmV2ZW50IGRvZXNuJ3QgcHJvY2VzcyBtb3JlCiAgICAgICAvLyBkYXRhIG9uIGl0IHdoaWxlIHdlJ3JlIHN0aWxsIHdhaXRpbmcgZm9yIHRoZSB0aHJlYWRtYW5hZ2VyIHRvCiAgICAgICAvLyBmaW5pc2ggdGhpcyB0YXNrCiAgICAgICBzZXRJZGxlKCk7CisKKyAgICAgIHRyeSB7CisgICAgICAgIHNlcnZlcl8tPmFkZFRhc2sodGFzayk7CisgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24mIGlzZSkgeworICAgICAgICAvLyBUaGUgVGhyZWFkTWFuYWdlciBpcyBub3QgcmVhZHkgdG8gaGFuZGxlIGFueSBtb3JlIHRhc2tzIChpdCdzIHByb2JhYmx5IHNodXR0aW5nIGRvd24pLgorICAgICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJJbGxlZ2FsU3RhdGVFeGNlcHRpb246IFNlcnZlcjo6cHJvY2VzcygpICVzIiwgaXNlLndoYXQoKSk7CisgICAgICAgIHNlcnZlcl8tPmRlY3JlbWVudEFjdGl2ZVByb2Nlc3NvcnMoKTsKKyAgICAgICAgY2xvc2UoKTsKKyAgICAgIH0gY2F0Y2ggKFRpbWVkT3V0RXhjZXB0aW9uJiB0bykgeworICAgICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJbRVJST1JdIFRpbWVkT3V0RXhjZXB0aW9uOiBTZXJ2ZXI6OnByb2Nlc3MoKSAlcyIsIHRvLndoYXQoKSk7CisgICAgICAgIHNlcnZlcl8tPmRlY3JlbWVudEFjdGl2ZVByb2Nlc3NvcnMoKTsKKyAgICAgICAgY2xvc2UoKTsKKyAgICAgIH0KKwogICAgICAgcmV0dXJuOwogICAgIH0gZWxzZSB7CiAgICAgICB0cnkgewogICAgICAgICBpZiAoc2VydmVyRXZlbnRIYW5kbGVyXykgewotICAgICAgICAgIHNlcnZlckV2ZW50SGFuZGxlcl8tPnByb2Nlc3NDb250ZXh0KGNvbm5lY3Rpb25Db250ZXh0XywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRUU29ja2V0KCkpOworICAgICAgICAgIHNlcnZlckV2ZW50SGFuZGxlcl8tPnByb2Nlc3NDb250ZXh0KGNvbm5lY3Rpb25Db250ZXh0XywgZ2V0VFNvY2tldCgpKTsKICAgICAgICAgfQogICAgICAgICAvLyBJbnZva2UgdGhlIHByb2Nlc3NvcgotICAgICAgICBwcm9jZXNzb3JfLT5wcm9jZXNzKGlucHV0UHJvdG9jb2xfLCBvdXRwdXRQcm90b2NvbF8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbkNvbnRleHRfKTsKLSAgICAgIH0gY2F0Y2ggKGNvbnN0IFRUcmFuc3BvcnRFeGNlcHRpb24gJnR0eCkgewotICAgICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJUTm9uYmxvY2tpbmdTZXJ2ZXIgdHJhbnNwb3J0IGVycm9yIGluICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvY2VzcygpOiAlcyIsIHR0eC53aGF0KCkpOworICAgICAgICBwcm9jZXNzb3JfLT5wcm9jZXNzKGlucHV0UHJvdG9jb2xfLCBvdXRwdXRQcm90b2NvbF8sIGNvbm5lY3Rpb25Db250ZXh0Xyk7CisgICAgICB9IGNhdGNoIChjb25zdCBUVHJhbnNwb3J0RXhjZXB0aW9uJiB0dHgpIHsKKyAgICAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigKKyAgICAgICAgICAgICJUTm9uYmxvY2tpbmdTZXJ2ZXIgdHJhbnNwb3J0IGVycm9yIGluICIKKyAgICAgICAgICAgICJwcm9jZXNzKCk6ICVzIiwKKyAgICAgICAgICAgIHR0eC53aGF0KCkpOwogICAgICAgICBzZXJ2ZXJfLT5kZWNyZW1lbnRBY3RpdmVQcm9jZXNzb3JzKCk7CiAgICAgICAgIGNsb3NlKCk7CiAgICAgICAgIHJldHVybjsKLSAgICAgIH0gY2F0Y2ggKGNvbnN0IHN0ZDo6ZXhjZXB0aW9uICZ4KSB7CisgICAgICB9IGNhdGNoIChjb25zdCBzdGQ6OmV4Y2VwdGlvbiYgeCkgewogICAgICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJTZXJ2ZXI6OnByb2Nlc3MoKSB1bmNhdWdodCBleGNlcHRpb246ICVzOiAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZWlkKHgpLm5hbWUoKSwgeC53aGF0KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVpZCh4KS5uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeC53aGF0KCkpOwogICAgICAgICBzZXJ2ZXJfLT5kZWNyZW1lbnRBY3RpdmVQcm9jZXNzb3JzKCk7CiAgICAgICAgIGNsb3NlKCk7CiAgICAgICAgIHJldHVybjsKQEAgLTYzNSw5ICs2NjMsMTAgQEAKICAgICAgICAgcmV0dXJuOwogICAgICAgfQogICAgIH0KKyAgICAvLyBmYWxsdGhyb3VnaAogCi0gICAgLy8gSW50ZW50aW9uYWxseSBmYWxsIHRocm91Z2ggaGVyZSwgdGhlIGNhbGwgdG8gcHJvY2VzcyBoYXMgd3JpdHRlbiBpbnRvCi0gICAgLy8gdGhlIHdyaXRlQnVmZmVyXworICAvLyBJbnRlbnRpb25hbGx5IGZhbGwgdGhyb3VnaCBoZXJlLCB0aGUgY2FsbCB0byBwcm9jZXNzIGhhcyB3cml0dGVuIGludG8KKyAgLy8gdGhlIHdyaXRlQnVmZmVyXwogCiAgIGNhc2UgQVBQX1dBSVRfVEFTSzoKICAgICAvLyBXZSBoYXZlIG5vdyBmaW5pc2hlZCBwcm9jZXNzaW5nIGEgdGFzayBhbmQgdGhlIHJlc3VsdCBoYXMgYmVlbiB3cml0dGVuCkBAIC02NjUsOSArNjk0LDYgQEAKICAgICAgIGFwcFN0YXRlXyA9IEFQUF9TRU5EX1JFU1VMVDsKICAgICAgIHNldFdyaXRlKCk7CiAKLSAgICAgIC8vIFRyeSB0byB3b3JrIHRoZSBzb2NrZXQgaW1tZWRpYXRlbHkKLSAgICAgIC8vIHdvcmtTb2NrZXQoKTsKLQogICAgICAgcmV0dXJuOwogICAgIH0KIApAQCAtNjg2LDggKzcxMiw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJfLT5nZXRJZGxlV3JpdGVCdWZmZXJMaW1pdCgpKTsKICAgICAgIGNhbGxzRm9yUmVzaXplXyA9IDA7CiAgICAgfQorICAgIC8vIGZhbGx0aHJvdWdoCiAKLSAgICAvLyBOLkIuOiBXZSBhbHNvIGludGVudGlvbmFsbHkgZmFsbCB0aHJvdWdoIGhlcmUgaW50byB0aGUgSU5JVCBzdGF0ZSEKKyAgLy8gTi5CLjogV2UgYWxzbyBpbnRlbnRpb25hbGx5IGZhbGwgdGhyb3VnaCBoZXJlIGludG8gdGhlIElOSVQgc3RhdGUhCiAKICAgTEFCRUxfQVBQX0lOSVQ6CiAgIGNhc2UgQVBQX0lOSVQ6CkBAIC03MDYsMTIgKzczMywxMSBAQAogICAgIC8vIFJlZ2lzdGVyIHJlYWQgZXZlbnQKICAgICBzZXRSZWFkKCk7CiAKLSAgICAvLyBUcnkgdG8gd29yayB0aGUgc29ja2V0IHJpZ2h0IGF3YXkKLSAgICAvLyB3b3JrU29ja2V0KCk7Ci0KICAgICByZXR1cm47CiAKICAgY2FzZSBBUFBfUkVBRF9GUkFNRV9TSVpFOgorICAgIHJlYWRXYW50XyArPSA0OworCiAgICAgLy8gV2UganVzdCByZWFkIHRoZSByZXF1ZXN0IGxlbmd0aAogICAgIC8vIERvdWJsZSB0aGUgYnVmZmVyIHNpemUgdW50aWwgaXQgaXMgYmlnIGVub3VnaAogICAgIGlmIChyZWFkV2FudF8gPiByZWFkQnVmZmVyU2l6ZV8pIHsKQEAgLTczMiwxNSArNzU4LDEzIEBACiAgICAgICByZWFkQnVmZmVyU2l6ZV8gPSBuZXdTaXplOwogICAgIH0KIAotICAgIHJlYWRCdWZmZXJQb3NfPSAwOworICAgIHJlYWRCdWZmZXJQb3NfID0gNDsKKyAgICAqKCh1aW50MzJfdCopcmVhZEJ1ZmZlcl8pID0gaHRvbmwocmVhZFdhbnRfIC0gNCk7CiAKICAgICAvLyBNb3ZlIGludG8gcmVhZCByZXF1ZXN0IHN0YXRlCiAgICAgc29ja2V0U3RhdGVfID0gU09DS0VUX1JFQ1Y7CiAgICAgYXBwU3RhdGVfID0gQVBQX1JFQURfUkVRVUVTVDsKIAotICAgIC8vIFdvcmsgdGhlIHNvY2tldCByaWdodCBhd2F5Ci0gICAgLy8gd29ya1NvY2tldCgpOwotCiAgICAgcmV0dXJuOwogCiAgIGNhc2UgQVBQX0NMT1NFX0NPTk5FQ1RJT046CkBAIC03NjEsMTEgKzc4NSw5IEBACiAgIH0KIAogICAvLyBEZWxldGUgYSBwcmV2aW91c2x5IGV4aXN0aW5nIGV2ZW50Ci0gIGlmIChldmVudEZsYWdzXyAhPSAwKSB7Ci0gICAgaWYgKGV2ZW50X2RlbCgmZXZlbnRfKSA9PSAtMSkgewotICAgICAgR2xvYmFsT3V0cHV0KCJUQ29ubmVjdGlvbjo6c2V0RmxhZ3MgZXZlbnRfZGVsIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQorICBpZiAoZXZlbnRGbGFnc18gJiYgZXZlbnRfZGVsKCZldmVudF8pID09IC0xKSB7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVENvbm5lY3Rpb246OnNldEZsYWdzKCkgZXZlbnRfZGVsIiwgVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IpOworICAgIHJldHVybjsKICAgfQogCiAgIC8vIFVwZGF0ZSBpbiBtZW1vcnkgc3RydWN0dXJlCkBAIC04MDMsMTMgKzgyNSwxMiBAQAogICAgKiBldiBzdHJ1Y3R1cmUgZm9yIG11bHRpcGxlIG1vbml0b3JlZCBkZXNjcmlwdG9yczsgZWFjaCBkZXNjcmlwdG9yIG5lZWRzCiAgICAqIGl0cyBvd24gZXYuCiAgICAqLwotICBldmVudF9zZXQoJmV2ZW50XywgdFNvY2tldF8tPmdldFNvY2tldEZEKCksIGV2ZW50RmxhZ3NfLAotICAgICAgICAgICAgVENvbm5lY3Rpb246OmV2ZW50SGFuZGxlciwgdGhpcyk7CisgIGV2ZW50X3NldCgmZXZlbnRfLCB0U29ja2V0Xy0+Z2V0U29ja2V0RkQoKSwgZXZlbnRGbGFnc18sIFRDb25uZWN0aW9uOjpldmVudEhhbmRsZXIsIHRoaXMpOwogICBldmVudF9iYXNlX3NldChpb1RocmVhZF8tPmdldEV2ZW50QmFzZSgpLCAmZXZlbnRfKTsKIAogICAvLyBBZGQgdGhlIGV2ZW50CiAgIGlmIChldmVudF9hZGQoJmV2ZW50XywgMCkgPT0gLTEpIHsKLSAgICBHbG9iYWxPdXRwdXQoIlRDb25uZWN0aW9uOjpzZXRGbGFncygpOiBjb3VsZCBub3QgZXZlbnRfYWRkIik7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVENvbm5lY3Rpb246OnNldEZsYWdzKCk6IGNvdWxkIG5vdCBldmVudF9hZGQiLCBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUik7CiAgIH0KIH0KIApAQCAtODE3LDEwICs4MzgsNyBAQAogICogQ2xvc2VzIGEgY29ubmVjdGlvbgogICovCiB2b2lkIFROb25ibG9ja2luZ1NlcnZlcjo6VENvbm5lY3Rpb246OmNsb3NlKCkgewotICAvLyBEZWxldGUgdGhlIHJlZ2lzdGVyZWQgbGliZXZlbnQKLSAgaWYgKGV2ZW50X2RlbCgmZXZlbnRfKSA9PSAtMSkgewotICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRDb25uZWN0aW9uOjpjbG9zZSgpIGV2ZW50X2RlbCIsIFRIUklGVF9HRVRfU09DS0VUX0VSUk9SKTsKLSAgfQorICBzZXRJZGxlKCk7CiAKICAgaWYgKHNlcnZlckV2ZW50SGFuZGxlcl8pIHsKICAgICBzZXJ2ZXJFdmVudEhhbmRsZXJfLT5kZWxldGVDb250ZXh0KGNvbm5lY3Rpb25Db250ZXh0XywgaW5wdXRQcm90b2NvbF8sIG91dHB1dFByb3RvY29sXyk7CkBAIC04NDEsOSArODU5LDcgQEAKICAgc2VydmVyXy0+cmV0dXJuQ29ubmVjdGlvbih0aGlzKTsKIH0KIAotdm9pZCBUTm9uYmxvY2tpbmdTZXJ2ZXI6OlRDb25uZWN0aW9uOjpjaGVja0lkbGVCdWZmZXJNZW1MaW1pdCgKLSAgICBzaXplX3QgcmVhZExpbWl0LAotICAgIHNpemVfdCB3cml0ZUxpbWl0KSB7Cit2b2lkIFROb25ibG9ja2luZ1NlcnZlcjo6VENvbm5lY3Rpb246OmNoZWNrSWRsZUJ1ZmZlck1lbUxpbWl0KHNpemVfdCByZWFkTGltaXQsIHNpemVfdCB3cml0ZUxpbWl0KSB7CiAgIGlmIChyZWFkTGltaXQgPiAwICYmIHJlYWRCdWZmZXJTaXplXyA+IHJlYWRMaW1pdCkgewogICAgIGZyZWUocmVhZEJ1ZmZlcl8pOwogICAgIHJlYWRCdWZmZXJfID0gTlVMTDsKQEAgLTg2MCw3ICs4NzYsNyBAQAogVE5vbmJsb2NraW5nU2VydmVyOjp+VE5vbmJsb2NraW5nU2VydmVyKCkgewogICAvLyBDbG9zZSBhbnkgYWN0aXZlIGNvbm5lY3Rpb25zIChtb3ZlcyB0aGVtIHRvIHRoZSBpZGxlIGNvbm5lY3Rpb24gc3RhY2spCiAgIHdoaWxlIChhY3RpdmVDb25uZWN0aW9uc18uc2l6ZSgpKSB7Ci0JICBhY3RpdmVDb25uZWN0aW9uc18uZnJvbnQoKS0+Y2xvc2UoKTsKKyAgICBhY3RpdmVDb25uZWN0aW9uc18uZnJvbnQoKS0+Y2xvc2UoKTsKICAgfQogICAvLyBDbGVhbiB1cCB1bnVzZWQgVENvbm5lY3Rpb24gb2JqZWN0cyBpbiBjb25uZWN0aW9uU3RhY2tfCiAgIHdoaWxlICghY29ubmVjdGlvblN0YWNrXy5lbXB0eSgpKSB7CkBAIC04NzIsOSArODg4LDkgQEAKICAgLy8gb2JqZWN0cyBhbmQgdGhlIFRocmVhZCBvYmplY3RzIGhhdmUgc2hhcmVkX3B0cnMgdG8gdGhlIFROb25ibG9ja2luZ0lPVGhyZWFkCiAgIC8vIG9iamVjdHMgKGFzIHJ1bm5hYmxlKSBzbyB0aGVzZSBvYmplY3RzIHdpbGwgbmV2ZXIgZGVhbGxvY2F0ZSB3aXRob3V0IGhlbHAuCiAgIHdoaWxlICghaW9UaHJlYWRzXy5lbXB0eSgpKSB7Ci0JICBib29zdDo6c2hhcmVkX3B0cjxUTm9uYmxvY2tpbmdJT1RocmVhZD4gaW90ID0gaW9UaHJlYWRzXy5iYWNrKCk7Ci0JICBpb1RocmVhZHNfLnBvcF9iYWNrKCk7Ci0JICBpb3QtPnNldFRocmVhZChib29zdDo6c2hhcmVkX3B0cjxUaHJlYWQ+KCkpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUTm9uYmxvY2tpbmdJT1RocmVhZD4gaW90ID0gaW9UaHJlYWRzXy5iYWNrKCk7CisgICAgaW9UaHJlYWRzXy5wb3BfYmFjaygpOworICAgIGlvdC0+c2V0VGhyZWFkKHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWQ+KCkpOwogICB9CiB9CiAKQEAgLTg4Miw4ICs4OTgsNyBAQAogICogQ3JlYXRlcyBhIG5ldyBjb25uZWN0aW9uIGVpdGhlciBieSByZXVzaW5nIGFuIG9iamVjdCBvZmYgdGhlIHN0YWNrIG9yCiAgKiBieSBhbGxvY2F0aW5nIGEgbmV3IG9uZSBlbnRpcmVseQogICovCi1UTm9uYmxvY2tpbmdTZXJ2ZXI6OlRDb25uZWN0aW9uKiBUTm9uYmxvY2tpbmdTZXJ2ZXI6OmNyZWF0ZUNvbm5lY3Rpb24oCi0gICAgVEhSSUZUX1NPQ0tFVCBzb2NrZXQsIGNvbnN0IHNvY2thZGRyKiBhZGRyLCBzb2NrbGVuX3QgYWRkckxlbikgeworVE5vbmJsb2NraW5nU2VydmVyOjpUQ29ubmVjdGlvbiogVE5vbmJsb2NraW5nU2VydmVyOjpjcmVhdGVDb25uZWN0aW9uKHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0PiBzb2NrZXQpIHsKICAgLy8gQ2hlY2sgdGhlIHN0YWNrCiAgIEd1YXJkIGcoY29ubk11dGV4Xyk7CiAKQEAgLTg5NywxMiArOTEyLDEzIEBACiAgIC8vIENoZWNrIHRoZSBjb25uZWN0aW9uIHN0YWNrIHRvIHNlZSBpZiB3ZSBjYW4gcmUtdXNlCiAgIFRDb25uZWN0aW9uKiByZXN1bHQgPSBOVUxMOwogICBpZiAoY29ubmVjdGlvblN0YWNrXy5lbXB0eSgpKSB7Ci0gICAgcmVzdWx0ID0gbmV3IFRDb25uZWN0aW9uKHNvY2tldCwgaW9UaHJlYWQsIGFkZHIsIGFkZHJMZW4pOworICAgIHJlc3VsdCA9IG5ldyBUQ29ubmVjdGlvbihzb2NrZXQsIGlvVGhyZWFkKTsKICAgICArK251bVRDb25uZWN0aW9uc187CiAgIH0gZWxzZSB7CiAgICAgcmVzdWx0ID0gY29ubmVjdGlvblN0YWNrXy50b3AoKTsKICAgICBjb25uZWN0aW9uU3RhY2tfLnBvcCgpOwotICAgIHJlc3VsdC0+aW5pdChzb2NrZXQsIGlvVGhyZWFkLCBhZGRyLCBhZGRyTGVuKTsKKyAgICByZXN1bHQtPnNldFNvY2tldChzb2NrZXQpOworICAgIHJlc3VsdC0+aW5pdChpb1RocmVhZCk7CiAgIH0KICAgYWN0aXZlQ29ubmVjdGlvbnNfLnB1c2hfYmFjayhyZXN1bHQpOwogICByZXR1cm4gcmVzdWx0OwpAQCAtOTE0LDEwICs5MzAsMTIgQEAKIHZvaWQgVE5vbmJsb2NraW5nU2VydmVyOjpyZXR1cm5Db25uZWN0aW9uKFRDb25uZWN0aW9uKiBjb25uZWN0aW9uKSB7CiAgIEd1YXJkIGcoY29ubk11dGV4Xyk7CiAKLSAgYWN0aXZlQ29ubmVjdGlvbnNfLmVyYXNlKHN0ZDo6cmVtb3ZlKGFjdGl2ZUNvbm5lY3Rpb25zXy5iZWdpbigpLCBhY3RpdmVDb25uZWN0aW9uc18uZW5kKCksIGNvbm5lY3Rpb24pLCBhY3RpdmVDb25uZWN0aW9uc18uZW5kKCkpOworICBhY3RpdmVDb25uZWN0aW9uc18uZXJhc2Uoc3RkOjpyZW1vdmUoYWN0aXZlQ29ubmVjdGlvbnNfLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVDb25uZWN0aW9uc18uZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZUNvbm5lY3Rpb25zXy5lbmQoKSk7CiAKLSAgaWYgKGNvbm5lY3Rpb25TdGFja0xpbWl0XyAmJgotICAgICAgKGNvbm5lY3Rpb25TdGFja18uc2l6ZSgpID49IGNvbm5lY3Rpb25TdGFja0xpbWl0XykpIHsKKyAgaWYgKGNvbm5lY3Rpb25TdGFja0xpbWl0XyAmJiAoY29ubmVjdGlvblN0YWNrXy5zaXplKCkgPj0gY29ubmVjdGlvblN0YWNrTGltaXRfKSkgewogICAgIGRlbGV0ZSBjb25uZWN0aW9uOwogICAgIC0tbnVtVENvbm5lY3Rpb25zXzsKICAgfSBlbHNlIHsKQEAgLTkzMSw1NyArOTQ5LDM5IEBACiAgKiBjb25uZWN0aW9ucyBvbiBmZCBhbmQgYXNzaWduIFRDb25uZWN0aW9uIG9iamVjdHMgdG8gaGFuZGxlIHRob3NlIHJlcXVlc3RzLgogICovCiB2b2lkIFROb25ibG9ja2luZ1NlcnZlcjo6aGFuZGxlRXZlbnQoVEhSSUZUX1NPQ0tFVCBmZCwgc2hvcnQgd2hpY2gpIHsKLSAgKHZvaWQpIHdoaWNoOworICAodm9pZCl3aGljaDsKICAgLy8gTWFrZSBzdXJlIHRoYXQgbGliZXZlbnQgZGlkbid0IG1lc3MgdXAgdGhlIHNvY2tldCBoYW5kbGVzCiAgIGFzc2VydChmZCA9PSBzZXJ2ZXJTb2NrZXRfKTsKIAotICAvLyBTZXJ2ZXIgc29ja2V0IGFjY2VwdGVkIGEgbmV3IGNvbm5lY3Rpb24KLSAgc29ja2xlbl90IGFkZHJMZW47Ci0gIHNvY2thZGRyX3N0b3JhZ2UgYWRkclN0b3JhZ2U7Ci0gIHNvY2thZGRyKiBhZGRycCA9IChzb2NrYWRkciopJmFkZHJTdG9yYWdlOwotICBhZGRyTGVuID0gc2l6ZW9mKGFkZHJTdG9yYWdlKTsKLQogICAvLyBHb2luZyB0byBhY2NlcHQgYSBuZXcgY2xpZW50IHNvY2tldAotICBUSFJJRlRfU09DS0VUIGNsaWVudFNvY2tldDsKKyAgc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+IGNsaWVudFNvY2tldDsKIAotICAvLyBBY2NlcHQgYXMgbWFueSBuZXcgY2xpZW50cyBhcyBwb3NzaWJsZSwgZXZlbiB0aG91Z2ggbGliZXZlbnQgc2lnbmFsZWQgb25seQotICAvLyBvbmUsIHRoaXMgaGVscHMgdXMgdG8gYXZvaWQgaGF2aW5nIHRvIGdvIGJhY2sgaW50byB0aGUgbGliZXZlbnQgZW5naW5lIHNvCi0gIC8vIG1hbnkgdGltZXMKLSAgd2hpbGUgKChjbGllbnRTb2NrZXQgPSA6OmFjY2VwdChmZCwgYWRkcnAsICZhZGRyTGVuKSkgIT0gLTEpIHsKKyAgY2xpZW50U29ja2V0ID0gc2VydmVyVHJhbnNwb3J0Xy0+YWNjZXB0KCk7CisgIGlmIChjbGllbnRTb2NrZXQpIHsKICAgICAvLyBJZiB3ZSdyZSBvdmVybG9hZGVkLCB0YWtlIGFjdGlvbiBoZXJlCiAgICAgaWYgKG92ZXJsb2FkQWN0aW9uXyAhPSBUX09WRVJMT0FEX05PX0FDVElPTiAmJiBzZXJ2ZXJPdmVybG9hZGVkKCkpIHsKICAgICAgIEd1YXJkIGcoY29ubk11dGV4Xyk7CiAgICAgICBuQ29ubmVjdGlvbnNEcm9wcGVkXysrOwogICAgICAgblRvdGFsQ29ubmVjdGlvbnNEcm9wcGVkXysrOwogICAgICAgaWYgKG92ZXJsb2FkQWN0aW9uXyA9PSBUX09WRVJMT0FEX0NMT1NFX09OX0FDQ0VQVCkgewotICAgICAgICA6OlRIUklGVF9DTE9TRVNPQ0tFVChjbGllbnRTb2NrZXQpOworICAgICAgICBjbGllbnRTb2NrZXQtPmNsb3NlKCk7CiAgICAgICAgIHJldHVybjsKICAgICAgIH0gZWxzZSBpZiAob3ZlcmxvYWRBY3Rpb25fID09IFRfT1ZFUkxPQURfRFJBSU5fVEFTS19RVUVVRSkgewogICAgICAgICBpZiAoIWRyYWluUGVuZGluZ1Rhc2soKSkgewogICAgICAgICAgIC8vIE5vdGhpbmcgbGVmdCB0byBkaXNjYXJkLCBzbyB3ZSBkcm9wIGNvbm5lY3Rpb24gaW5zdGVhZC4KLSAgICAgICAgICA6OlRIUklGVF9DTE9TRVNPQ0tFVChjbGllbnRTb2NrZXQpOworICAgICAgICAgIGNsaWVudFNvY2tldC0+Y2xvc2UoKTsKICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CiAKLSAgICAvLyBFeHBsaWNpdGx5IHNldCB0aGlzIHNvY2tldCB0byBOT05CTE9DSyBtb2RlCi0gICAgaW50IGZsYWdzOwotICAgIGlmICgoZmxhZ3MgPSBUSFJJRlRfRkNOVEwoY2xpZW50U29ja2V0LCBUSFJJRlRfRl9HRVRGTCwgMCkpIDwgMCB8fAotICAgICAgICBUSFJJRlRfRkNOVEwoY2xpZW50U29ja2V0LCBUSFJJRlRfRl9TRVRGTCwgZmxhZ3MgfCBUSFJJRlRfT19OT05CTE9DSykgPCAwKSB7Ci0gICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJ0aHJpZnRTZXJ2ZXJFdmVudEhhbmRsZXI6IHNldCBUSFJJRlRfT19OT05CTE9DSyAoVEhSSUZUX0ZDTlRMKSAiLCBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUik7Ci0gICAgICA6OlRIUklGVF9DTE9TRVNPQ0tFVChjbGllbnRTb2NrZXQpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQogICAgIC8vIENyZWF0ZSBhIG5ldyBUQ29ubmVjdGlvbiBmb3IgdGhpcyBjbGllbnQgc29ja2V0LgotICAgIFRDb25uZWN0aW9uKiBjbGllbnRDb25uZWN0aW9uID0KLSAgICAgIGNyZWF0ZUNvbm5lY3Rpb24oY2xpZW50U29ja2V0LCBhZGRycCwgYWRkckxlbik7CisgICAgVENvbm5lY3Rpb24qIGNsaWVudENvbm5lY3Rpb24gPSBjcmVhdGVDb25uZWN0aW9uKGNsaWVudFNvY2tldCk7CiAKICAgICAvLyBGYWlsIGZhc3QgaWYgd2UgY291bGQgbm90IGNyZWF0ZSBhIFRDb25uZWN0aW9uIG9iamVjdAogICAgIGlmIChjbGllbnRDb25uZWN0aW9uID09IE5VTEwpIHsKICAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoInRocmlmdFNlcnZlckV2ZW50SGFuZGxlcjogZmFpbGVkIFRDb25uZWN0aW9uIGZhY3RvcnkiKTsKLSAgICAgIDo6VEhSSUZUX0NMT1NFU09DS0VUKGNsaWVudFNvY2tldCk7CisgICAgICBjbGllbnRTb2NrZXQtPmNsb3NlKCk7CiAgICAgICByZXR1cm47CiAgICAgfQogCkBAIC0xMDAwLDE4ICsxMDAwLDExIEBACiAgICAgaWYgKGNsaWVudENvbm5lY3Rpb24tPmdldElPVGhyZWFkTnVtYmVyKCkgPT0gMCkgewogICAgICAgY2xpZW50Q29ubmVjdGlvbi0+dHJhbnNpdGlvbigpOwogICAgIH0gZWxzZSB7Ci0gICAgICBjbGllbnRDb25uZWN0aW9uLT5ub3RpZnlJT1RocmVhZCgpOworICAgICAgaWYgKCFjbGllbnRDb25uZWN0aW9uLT5ub3RpZnlJT1RocmVhZCgpKSB7CisgICAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIltFUlJPUl0gbm90aWZ5SU9UaHJlYWQgZmFpbGVkIG9uIGZyZXNoIGNvbm5lY3Rpb24sIGNsb3NpbmciLCBlcnJubyk7CisgICAgICAgIGNsaWVudENvbm5lY3Rpb24tPmNsb3NlKCk7CisgICAgICB9CiAgICAgfQotCi0gICAgLy8gYWRkckxlbiBpcyB3cml0dGVuIGJ5IHRoZSBhY2NlcHQoKSBjYWxsLCBzbyBuZWVkcyB0byBiZSBzZXQgYmVmb3JlIHRoZSBuZXh0IGNhbGwuCi0gICAgYWRkckxlbiA9IHNpemVvZihhZGRyU3RvcmFnZSk7Ci0gIH0KLQotCi0gIC8vIERvbmUgbG9vcGluZyBhY2NlcHQsIG5vdyB3ZSBoYXZlIHRvIG1ha2Ugc3VyZSB0aGUgZXJyb3IgaXMgZHVlIHRvCi0gIC8vIGJsb2NraW5nLiBBbnkgb3RoZXIgZXJyb3IgaXMgYSBwcm9ibGVtCi0gIGlmIChUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUiAhPSBUSFJJRlRfRUFHQUlOICYmIFRIUklGVF9HRVRfU09DS0VUX0VSUk9SICE9IFRIUklGVF9FV09VTERCTE9DSykgewotICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoInRocmlmdFNlcnZlckV2ZW50SGFuZGxlcjogYWNjZXB0KCkgIiwgVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IpOwogICB9CiB9CiAKQEAgLTEwMTksMTM3ICsxMDEyLDM5IEBACiAgKiBDcmVhdGVzIGEgc29ja2V0IHRvIGxpc3RlbiBvbiBhbmQgYmluZHMgaXQgdG8gdGhlIGxvY2FsIHBvcnQuCiAgKi8KIHZvaWQgVE5vbmJsb2NraW5nU2VydmVyOjpjcmVhdGVBbmRMaXN0ZW5PblNvY2tldCgpIHsKLSAgVEhSSUZUX1NPQ0tFVCBzOwotCi0gIHN0cnVjdCBhZGRyaW5mbyBoaW50cywgKnJlcywgKnJlczA7Ci0gIGludCBlcnJvcjsKLQotICBjaGFyIHBvcnRbc2l6ZW9mKCI2NTUzNiIpICsgMV07Ci0gIG1lbXNldCgmaGludHMsIDAsIHNpemVvZihoaW50cykpOwotICBoaW50cy5haV9mYW1pbHkgPSBQRl9VTlNQRUM7Ci0gIGhpbnRzLmFpX3NvY2t0eXBlID0gU09DS19TVFJFQU07Ci0gIGhpbnRzLmFpX2ZsYWdzID0gQUlfUEFTU0lWRSB8IEFJX0FERFJDT05GSUc7Ci0gIHNwcmludGYocG9ydCwgIiVkIiwgcG9ydF8pOwotCi0gIC8vIFdpbGRjYXJkIGFkZHJlc3MKLSAgZXJyb3IgPSBnZXRhZGRyaW5mbyhOVUxMLCBwb3J0LCAmaGludHMsICZyZXMwKTsKLSAgaWYgKGVycm9yKSB7Ci0gICAgdGhyb3cgVEV4Y2VwdGlvbigiVE5vbmJsb2NraW5nU2VydmVyOjpzZXJ2ZSgpIGdldGFkZHJpbmZvICIgKwotICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKFRIUklGVF9HQUlfU1RSRVJST1IoZXJyb3IpKSk7Ci0gIH0KLQotICAvLyBQaWNrIHRoZSBpcHY2IGFkZHJlc3MgZmlyc3Qgc2luY2UgaXB2NCBhZGRyZXNzZXMgY2FuIGJlIG1hcHBlZAotICAvLyBpbnRvIGlwdjYgc3BhY2UuCi0gIGZvciAocmVzID0gcmVzMDsgcmVzOyByZXMgPSByZXMtPmFpX25leHQpIHsKLSAgICBpZiAocmVzLT5haV9mYW1pbHkgPT0gQUZfSU5FVDYgfHwgcmVzLT5haV9uZXh0ID09IE5VTEwpCi0gICAgICBicmVhazsKLSAgfQotCi0gIC8vIENyZWF0ZSB0aGUgc2VydmVyIHNvY2tldAotICBzID0gc29ja2V0KHJlcy0+YWlfZmFtaWx5LCByZXMtPmFpX3NvY2t0eXBlLCByZXMtPmFpX3Byb3RvY29sKTsKLSAgaWYgKHMgPT0gLTEpIHsKLSAgICBmcmVlYWRkcmluZm8ocmVzMCk7Ci0gICAgdGhyb3cgVEV4Y2VwdGlvbigiVE5vbmJsb2NraW5nU2VydmVyOjpzZXJ2ZSgpIHNvY2tldCgpIC0xIik7Ci0gIH0KLQotICAjaWZkZWYgSVBWNl9WNk9OTFkKLSAgaWYgKHJlcy0+YWlfZmFtaWx5ID09IEFGX0lORVQ2KSB7Ci0gICAgaW50IHplcm8gPSAwOwotICAgIGlmICgtMSA9PSBzZXRzb2Nrb3B0KHMsIElQUFJPVE9fSVBWNiwgSVBWNl9WNk9OTFksIGNvbnN0X2Nhc3Rfc29ja29wdCgmemVybyksIHNpemVvZih6ZXJvKSkpIHsKLSAgICAgIEdsb2JhbE91dHB1dCgiVFNlcnZlclNvY2tldDo6bGlzdGVuKCkgSVBWNl9WNk9OTFkiKTsKLSAgICB9Ci0gIH0KLSAgI2VuZGlmIC8vICNpZmRlZiBJUFY2X1Y2T05MWQotCi0KLSAgaW50IG9uZSA9IDE7Ci0KLSAgLy8gU2V0IFRIUklGVF9OT19TT0NLRVRfQ0FDSElORyB0byBhdm9pZCAyTVNMIGRlbGF5IG9uIHNlcnZlciByZXN0YXJ0Ci0gIHNldHNvY2tvcHQocywgU09MX1NPQ0tFVCwgVEhSSUZUX05PX1NPQ0tFVF9DQUNISU5HLCBjb25zdF9jYXN0X3NvY2tvcHQoJm9uZSksIHNpemVvZihvbmUpKTsKLQotICBpZiAoOjpiaW5kKHMsIHJlcy0+YWlfYWRkciwgc3RhdGljX2Nhc3Q8aW50PihyZXMtPmFpX2FkZHJsZW4pKSA9PSAtMSkgewotICAgIDo6VEhSSUZUX0NMT1NFU09DS0VUKHMpOwotICAgIGZyZWVhZGRyaW5mbyhyZXMwKTsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlROb25ibG9ja2luZ1NlcnZlcjo6c2VydmUoKSBiaW5kIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIUklGVF9HRVRfU09DS0VUX0VSUk9SKTsKLSAgfQotCi0gIC8vIERvbmUgd2l0aCB0aGUgYWRkciBpbmZvCi0gIGZyZWVhZGRyaW5mbyhyZXMwKTsKLQotICAvLyBTZXQgdXAgdGhpcyBmaWxlIGRlc2NyaXB0b3IgZm9yIGxpc3RlbmluZwotICBsaXN0ZW5Tb2NrZXQocyk7CisgIHNlcnZlclRyYW5zcG9ydF8tPmxpc3RlbigpOworICBzZXJ2ZXJTb2NrZXRfID0gc2VydmVyVHJhbnNwb3J0Xy0+Z2V0U29ja2V0RkQoKTsKIH0KIAotLyoqCi0gKiBUYWtlcyBhIHNvY2tldCBjcmVhdGVkIGJ5IGxpc3RlblNvY2tldCgpIGFuZCBzZXRzIHZhcmlvdXMgb3B0aW9ucyBvbiBpdAotICogdG8gcHJlcGFyZSBmb3IgdXNlIGluIHRoZSBzZXJ2ZXIuCi0gKi8KLXZvaWQgVE5vbmJsb2NraW5nU2VydmVyOjpsaXN0ZW5Tb2NrZXQoVEhSSUZUX1NPQ0tFVCBzKSB7Ci0gIC8vIFNldCBzb2NrZXQgdG8gbm9uYmxvY2tpbmcgbW9kZQotICBpbnQgZmxhZ3M7Ci0gIGlmICgoZmxhZ3MgPSBUSFJJRlRfRkNOVEwocywgVEhSSUZUX0ZfR0VURkwsIDApKSA8IDAgfHwKLSAgICAgIFRIUklGVF9GQ05UTChzLCBUSFJJRlRfRl9TRVRGTCwgZmxhZ3MgfCBUSFJJRlRfT19OT05CTE9DSykgPCAwKSB7Ci0gICAgOjpUSFJJRlRfQ0xPU0VTT0NLRVQocyk7Ci0gICAgdGhyb3cgVEV4Y2VwdGlvbigiVE5vbmJsb2NraW5nU2VydmVyOjpzZXJ2ZSgpIFRIUklGVF9PX05PTkJMT0NLIik7Ci0gIH0KIAotICBpbnQgb25lID0gMTsKLSAgc3RydWN0IGxpbmdlciBsaW5nID0gezAsIDB9OwotCi0gIC8vIEtlZXBhbGl2ZSB0byBlbnN1cmUgZnVsbCByZXN1bHQgZmx1c2hpbmcKLSAgc2V0c29ja29wdChzLCBTT0xfU09DS0VULCBTT19LRUVQQUxJVkUsIGNvbnN0X2Nhc3Rfc29ja29wdCgmb25lKSwgc2l6ZW9mKG9uZSkpOwotCi0gIC8vIFR1cm4gbGluZ2VyIG9mZiB0byBhdm9pZCBodW5nIHNvY2tldHMKLSAgc2V0c29ja29wdChzLCBTT0xfU09DS0VULCBTT19MSU5HRVIsIGNvbnN0X2Nhc3Rfc29ja29wdCgmbGluZyksIHNpemVvZihsaW5nKSk7Ci0KLSAgLy8gU2V0IFRDUCBub2RlbGF5IGlmIGF2YWlsYWJsZSwgTUFDIE9TIFggSGFjawotICAvLyBTZWUgaHR0cDovL2xpc3RzLmRhbmdhLmNvbS9waXBlcm1haWwvbWVtY2FjaGVkLzIwMDUtTWFyY2gvMDAxMjQwLmh0bWwKLSAgI2lmbmRlZiBUQ1BfTk9QVVNICi0gIHNldHNvY2tvcHQocywgSVBQUk9UT19UQ1AsIFRDUF9OT0RFTEFZLCBjb25zdF9jYXN0X3NvY2tvcHQoJm9uZSksIHNpemVvZihvbmUpKTsKLSAgI2VuZGlmCi0KLSAgI2lmZGVmIFRDUF9MT1dfTUlOX1JUTwotICBpZiAoVFNvY2tldDo6Z2V0VXNlTG93TWluUnRvKCkpIHsKLSAgICBzZXRzb2Nrb3B0KHMsIElQUFJPVE9fVENQLCBUQ1BfTE9XX01JTl9SVE8sIGNvbnN0X2Nhc3Rfc29ja29wdCgmb25lKSwgc2l6ZW9mKG9uZSkpOwotICB9Ci0gICNlbmRpZgotCi0gIGlmIChsaXN0ZW4ocywgTElTVEVOX0JBQ0tMT0cpID09IC0xKSB7Ci0gICAgOjpUSFJJRlRfQ0xPU0VTT0NLRVQocyk7Ci0gICAgdGhyb3cgVEV4Y2VwdGlvbigiVE5vbmJsb2NraW5nU2VydmVyOjpzZXJ2ZSgpIGxpc3RlbiIpOwotICB9Ci0KLSAgLy8gQ29vbCwgdGhpcyBzb2NrZXQgaXMgZ29vZCB0byBnbywgc2V0IGl0IGFzIHRoZSBzZXJ2ZXJTb2NrZXRfCi0gIHNlcnZlclNvY2tldF8gPSBzOwotfQotCi12b2lkIFROb25ibG9ja2luZ1NlcnZlcjo6c2V0VGhyZWFkTWFuYWdlcihib29zdDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyKSB7Cit2b2lkIFROb25ibG9ja2luZ1NlcnZlcjo6c2V0VGhyZWFkTWFuYWdlcihzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlcikgewogICB0aHJlYWRNYW5hZ2VyXyA9IHRocmVhZE1hbmFnZXI7CiAgIGlmICh0aHJlYWRNYW5hZ2VyKSB7Ci0gICAgdGhyZWFkTWFuYWdlci0+c2V0RXhwaXJlQ2FsbGJhY2soYXBhY2hlOjp0aHJpZnQ6OnN0ZGN4eDo6YmluZCgmVE5vbmJsb2NraW5nU2VydmVyOjpleHBpcmVDbG9zZSwgdGhpcywgYXBhY2hlOjp0aHJpZnQ6OnN0ZGN4eDo6cGxhY2Vob2xkZXJzOjpfMSkpOworICAgIHRocmVhZE1hbmFnZXItPnNldEV4cGlyZUNhbGxiYWNrKAorICAgICAgICBzdGQ6OmJpbmQoJlROb25ibG9ja2luZ1NlcnZlcjo6ZXhwaXJlQ2xvc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnBsYWNlaG9sZGVyczo6XzEpKTsKICAgICB0aHJlYWRQb29sUHJvY2Vzc2luZ18gPSB0cnVlOwogICB9IGVsc2UgewogICAgIHRocmVhZFBvb2xQcm9jZXNzaW5nXyA9IGZhbHNlOwogICB9CiB9CiAKLWJvb2wgIFROb25ibG9ja2luZ1NlcnZlcjo6c2VydmVyT3ZlcmxvYWRlZCgpIHsKK2Jvb2wgVE5vbmJsb2NraW5nU2VydmVyOjpzZXJ2ZXJPdmVybG9hZGVkKCkgewogICBzaXplX3QgYWN0aXZlQ29ubmVjdGlvbnMgPSBudW1UQ29ubmVjdGlvbnNfIC0gY29ubmVjdGlvblN0YWNrXy5zaXplKCk7Ci0gIGlmIChudW1BY3RpdmVQcm9jZXNzb3JzXyA+IG1heEFjdGl2ZVByb2Nlc3NvcnNfIHx8Ci0gICAgICBhY3RpdmVDb25uZWN0aW9ucyA+IG1heENvbm5lY3Rpb25zXykgeworICBpZiAobnVtQWN0aXZlUHJvY2Vzc29yc18gPiBtYXhBY3RpdmVQcm9jZXNzb3JzXyB8fCBhY3RpdmVDb25uZWN0aW9ucyA+IG1heENvbm5lY3Rpb25zXykgewogICAgIGlmICghb3ZlcmxvYWRlZF8pIHsKLSAgICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJUTm9uYmxvY2tpbmdTZXJ2ZXI6IG92ZXJsb2FkIGNvbmRpdGlvbiBiZWd1bi4iKTsKKyAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoIlROb25ibG9ja2luZ1NlcnZlcjogb3ZlcmxvYWQgY29uZGl0aW9uIGJlZ3VuLiIpOwogICAgICAgb3ZlcmxvYWRlZF8gPSB0cnVlOwogICAgIH0KICAgfSBlbHNlIHsKLSAgICBpZiAob3ZlcmxvYWRlZF8gJiYKLSAgICAgICAgKG51bUFjdGl2ZVByb2Nlc3NvcnNfIDw9IG92ZXJsb2FkSHlzdGVyZXNpc18gKiBtYXhBY3RpdmVQcm9jZXNzb3JzXykgJiYKLSAgICAgICAgKGFjdGl2ZUNvbm5lY3Rpb25zIDw9IG92ZXJsb2FkSHlzdGVyZXNpc18gKiBtYXhDb25uZWN0aW9uc18pKSB7Ci0gICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJUTm9uYmxvY2tpbmdTZXJ2ZXI6IG92ZXJsb2FkIGVuZGVkOyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICIldSBkcm9wcGVkICglbGx1IHRvdGFsKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG5Db25uZWN0aW9uc0Ryb3BwZWRfLCBuVG90YWxDb25uZWN0aW9uc0Ryb3BwZWRfKTsKKyAgICBpZiAob3ZlcmxvYWRlZF8gJiYgKG51bUFjdGl2ZVByb2Nlc3NvcnNfIDw9IG92ZXJsb2FkSHlzdGVyZXNpc18gKiBtYXhBY3RpdmVQcm9jZXNzb3JzXykKKyAgICAgICAgJiYgKGFjdGl2ZUNvbm5lY3Rpb25zIDw9IG92ZXJsb2FkSHlzdGVyZXNpc18gKiBtYXhDb25uZWN0aW9uc18pKSB7CisgICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKAorICAgICAgICAgICJUTm9uYmxvY2tpbmdTZXJ2ZXI6IG92ZXJsb2FkIGVuZGVkOyAiCisgICAgICAgICAgIiV1IGRyb3BwZWQgKCVsbHUgdG90YWwpIiwKKyAgICAgICAgICBuQ29ubmVjdGlvbnNEcm9wcGVkXywKKyAgICAgICAgICBuVG90YWxDb25uZWN0aW9uc0Ryb3BwZWRfKTsKICAgICAgIG5Db25uZWN0aW9uc0Ryb3BwZWRfID0gMDsKICAgICAgIG92ZXJsb2FkZWRfID0gZmFsc2U7CiAgICAgfQpAQCAtMTE2MCwxMiArMTA1NSwxMCBAQAogCiBib29sIFROb25ibG9ja2luZ1NlcnZlcjo6ZHJhaW5QZW5kaW5nVGFzaygpIHsKICAgaWYgKHRocmVhZE1hbmFnZXJfKSB7Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8UnVubmFibGU+IHRhc2sgPSB0aHJlYWRNYW5hZ2VyXy0+cmVtb3ZlTmV4dFBlbmRpbmcoKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+IHRhc2sgPSB0aHJlYWRNYW5hZ2VyXy0+cmVtb3ZlTmV4dFBlbmRpbmcoKTsKICAgICBpZiAodGFzaykgewotICAgICAgVENvbm5lY3Rpb24qIGNvbm5lY3Rpb24gPQotICAgICAgICBzdGF0aWNfY2FzdDxUQ29ubmVjdGlvbjo6VGFzayo+KHRhc2suZ2V0KCkpLT5nZXRUQ29ubmVjdGlvbigpOwotICAgICAgYXNzZXJ0KGNvbm5lY3Rpb24gJiYgY29ubmVjdGlvbi0+Z2V0U2VydmVyKCkKLSAgICAgICAgICAgICAmJiBjb25uZWN0aW9uLT5nZXRTdGF0ZSgpID09IEFQUF9XQUlUX1RBU0spOworICAgICAgVENvbm5lY3Rpb24qIGNvbm5lY3Rpb24gPSBzdGF0aWNfY2FzdDxUQ29ubmVjdGlvbjo6VGFzayo+KHRhc2suZ2V0KCkpLT5nZXRUQ29ubmVjdGlvbigpOworICAgICAgYXNzZXJ0KGNvbm5lY3Rpb24gJiYgY29ubmVjdGlvbi0+Z2V0U2VydmVyKCkgJiYgY29ubmVjdGlvbi0+Z2V0U3RhdGUoKSA9PSBBUFBfV0FJVF9UQVNLKTsKICAgICAgIGNvbm5lY3Rpb24tPmZvcmNlQ2xvc2UoKTsKICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KQEAgLTExNzMsMTEgKzEwNjYsOSBAQAogICByZXR1cm4gZmFsc2U7CiB9CiAKLXZvaWQgVE5vbmJsb2NraW5nU2VydmVyOjpleHBpcmVDbG9zZShib29zdDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzaykgewotICBUQ29ubmVjdGlvbiogY29ubmVjdGlvbiA9Ci0gICAgc3RhdGljX2Nhc3Q8VENvbm5lY3Rpb246OlRhc2sqPih0YXNrLmdldCgpKS0+Z2V0VENvbm5lY3Rpb24oKTsKLSAgYXNzZXJ0KGNvbm5lY3Rpb24gJiYgY29ubmVjdGlvbi0+Z2V0U2VydmVyKCkgJiYKLSAgICAgICAgIGNvbm5lY3Rpb24tPmdldFN0YXRlKCkgPT0gQVBQX1dBSVRfVEFTSyk7Cit2b2lkIFROb25ibG9ja2luZ1NlcnZlcjo6ZXhwaXJlQ2xvc2Uoc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrKSB7CisgIFRDb25uZWN0aW9uKiBjb25uZWN0aW9uID0gc3RhdGljX2Nhc3Q8VENvbm5lY3Rpb246OlRhc2sqPih0YXNrLmdldCgpKS0+Z2V0VENvbm5lY3Rpb24oKTsKKyAgYXNzZXJ0KGNvbm5lY3Rpb24gJiYgY29ubmVjdGlvbi0+Z2V0U2VydmVyKCkgJiYgY29ubmVjdGlvbi0+Z2V0U3RhdGUoKSA9PSBBUFBfV0FJVF9UQVNLKTsKICAgY29ubmVjdGlvbi0+Zm9yY2VDbG9zZSgpOwogfQogCkBAIC0xMjAwLDEzICsxMDkxLDE1IEBACiAgIGlmICghbnVtSU9UaHJlYWRzXykgewogICAgIG51bUlPVGhyZWFkc18gPSBERUZBVUxUX0lPX1RIUkVBRFM7CiAgIH0KKyAgLy8gVXNlci1wcm92aWRlZCBldmVudC1iYXNlIGRvZXNuJ3Qgd29ya3MgZm9yIG11bHRpLXRocmVhZGVkIHNlcnZlcnMKKyAgYXNzZXJ0KG51bUlPVGhyZWFkc18gPT0gMSB8fCAhdXNlckV2ZW50QmFzZV8pOwogCiAgIGZvciAodWludDMyX3QgaWQgPSAwOyBpZCA8IG51bUlPVGhyZWFkc187ICsraWQpIHsKICAgICAvLyB0aGUgZmlyc3QgSU8gdGhyZWFkIGFsc28gZG9lcyB0aGUgbGlzdGVuaW5nIG9uIHNlcnZlciBzb2NrZXQKICAgICBUSFJJRlRfU09DS0VUIGxpc3RlbkZkID0gKGlkID09IDAgPyBzZXJ2ZXJTb2NrZXRfIDogVEhSSUZUX0lOVkFMSURfU09DS0VUKTsKIAogICAgIHNoYXJlZF9wdHI8VE5vbmJsb2NraW5nSU9UaHJlYWQ+IHRocmVhZCgKLSAgICAgIG5ldyBUTm9uYmxvY2tpbmdJT1RocmVhZCh0aGlzLCBpZCwgbGlzdGVuRmQsIHVzZUhpZ2hQcmlvcml0eUlPVGhyZWFkc18pKTsKKyAgICAgICAgbmV3IFROb25ibG9ja2luZ0lPVGhyZWFkKHRoaXMsIGlkLCBsaXN0ZW5GZCwgdXNlSGlnaFByaW9yaXR5SU9UaHJlYWRzXykpOwogICAgIGlvVGhyZWFkc18ucHVzaF9iYWNrKHRocmVhZCk7CiAgIH0KIApAQCAtMTIyMCwxOSArMTExMywxOSBAQAogICBhc3NlcnQoaW9UaHJlYWRzXy5zaXplKCkgPT0gbnVtSU9UaHJlYWRzXyk7CiAgIGFzc2VydChpb1RocmVhZHNfLnNpemUoKSA+IDApOwogCi0gIEdsb2JhbE91dHB1dC5wcmludGYoIlROb25ibG9ja2luZ1NlcnZlcjogU2VydmluZyBvbiBwb3J0ICVkLCAlZCBpbyB0aHJlYWRzLiIsCi0gICAgICAgICAgICAgICBwb3J0XywgaW9UaHJlYWRzXy5zaXplKCkpOworICBHbG9iYWxPdXRwdXQucHJpbnRmKCJUTm9uYmxvY2tpbmdTZXJ2ZXI6IFNlcnZpbmcgd2l0aCAlZCBpbyB0aHJlYWRzLiIsCisgICAgICAgICAgICAgICAgICAgICAgaW9UaHJlYWRzXy5zaXplKCkpOwogCiAgIC8vIExhdW5jaCBhbGwgdGhlIHNlY29uZGFyeSBJTyB0aHJlYWRzIGluIHNlcGFyYXRlIHRocmVhZHMKICAgaWYgKGlvVGhyZWFkc18uc2l6ZSgpID4gMSkgewogICAgIGlvVGhyZWFkRmFjdG9yeV8ucmVzZXQobmV3IFBsYXRmb3JtVGhyZWFkRmFjdG9yeSgKLSNpZiAhZGVmaW5lZChVU0VfQk9PU1RfVEhSRUFEKSAmJiAhZGVmaW5lZChVU0VfU1REX1RIUkVBRCkKLSAgICAgIFBsYXRmb3JtVGhyZWFkRmFjdG9yeTo6T1RIRVIsICAvLyBzY2hlZHVsZXIKLSAgICAgIFBsYXRmb3JtVGhyZWFkRmFjdG9yeTo6Tk9STUFMLCAvLyBwcmlvcml0eQotICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0YWNrIHNpemUgKE1CKQorI2lmICFVU0VfU1REX1RIUkVBRAorICAgICAgICBQbGF0Zm9ybVRocmVhZEZhY3Rvcnk6Ok9USEVSLCAgLy8gc2NoZWR1bGVyCisgICAgICAgIFBsYXRmb3JtVGhyZWFkRmFjdG9yeTo6Tk9STUFMLCAvLyBwcmlvcml0eQorICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RhY2sgc2l6ZSAoTUIpCiAjZW5kaWYKLSAgICAgIGZhbHNlICAgICAgICAgICAgICAgICAgICAgICAvLyBkZXRhY2hlZAotICAgICkpOworICAgICAgICBmYWxzZSAvLyBkZXRhY2hlZAorICAgICAgICApKTsKIAogICAgIGFzc2VydChpb1RocmVhZEZhY3RvcnlfLmdldCgpKTsKIApAQCAtMTI1NCw3ICsxMTQ3LDggQEAKICAqLwogdm9pZCBUTm9uYmxvY2tpbmdTZXJ2ZXI6OnNlcnZlKCkgewogCi0gIHJlZ2lzdGVyRXZlbnRzKE5VTEwpOworICBpZiAoaW9UaHJlYWRzXy5lbXB0eSgpKQorICAgIHJlZ2lzdGVyRXZlbnRzKE5VTEwpOwogCiAgIC8vIFJ1biB0aGUgcHJpbWFyeSAobGlzdGVuZXIpIElPIHRocmVhZCBsb29wIGluIG91ciBtYWluIHRocmVhZDsgdGhpcyB3aWxsCiAgIC8vIG9ubHkgcmV0dXJuIHdoZW4gdGhlIHNlcnZlciBpcyBzaHV0dGluZyBkb3duLgpAQCAtMTI3MSwxMiArMTE2NSwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1iZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX1NPQ0tFVCBsaXN0ZW5Tb2NrZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB1c2VIaWdoUHJpb3JpdHkpCi0gICAgICA6IHNlcnZlcl8oc2VydmVyKQotICAgICAgLCBudW1iZXJfKG51bWJlcikKLSAgICAgICwgbGlzdGVuU29ja2V0XyhsaXN0ZW5Tb2NrZXQpCi0gICAgICAsIHVzZUhpZ2hQcmlvcml0eV8odXNlSGlnaFByaW9yaXR5KQotICAgICAgLCBldmVudEJhc2VfKE5VTEwpCi0gICAgICAsIG93bkV2ZW50QmFzZV8oZmFsc2UpIHsKKyAgOiBzZXJ2ZXJfKHNlcnZlciksCisgICAgbnVtYmVyXyhudW1iZXIpLAorICAgIGxpc3RlblNvY2tldF8obGlzdGVuU29ja2V0KSwKKyAgICB1c2VIaWdoUHJpb3JpdHlfKHVzZUhpZ2hQcmlvcml0eSksCisgICAgZXZlbnRCYXNlXyhOVUxMKSwKKyAgICBvd25FdmVudEJhc2VfKGZhbHNlKSB7CiAgIG5vdGlmaWNhdGlvblBpcGVGRHNfWzBdID0gLTE7CiAgIG5vdGlmaWNhdGlvblBpcGVGRHNfWzFdID0gLTE7CiB9CkBAIC0xMjkwLDEwICsxMTg0LDkgQEAKICAgICBvd25FdmVudEJhc2VfID0gZmFsc2U7CiAgIH0KIAotICBpZiAobGlzdGVuU29ja2V0XyA+PSAwKSB7CisgIGlmIChsaXN0ZW5Tb2NrZXRfICE9IFRIUklGVF9JTlZBTElEX1NPQ0tFVCkgewogICAgIGlmICgwICE9IDo6VEhSSUZUX0NMT1NFU09DS0VUKGxpc3RlblNvY2tldF8pKSB7Ci0gICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUTm9uYmxvY2tpbmdJT1RocmVhZCBsaXN0ZW5Tb2NrZXRfIGNsb3NlKCk6ICIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFRIUklGVF9HRVRfU09DS0VUX0VSUk9SKTsKKyAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlROb25ibG9ja2luZ0lPVGhyZWFkIGxpc3RlblNvY2tldF8gY2xvc2UoKTogIiwgVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IpOwogICAgIH0KICAgICBsaXN0ZW5Tb2NrZXRfID0gVEhSSUZUX0lOVkFMSURfU09DS0VUOwogICB9CkBAIC0xMzEwLDEyICsxMjAzLDEyIEBACiB9CiAKIHZvaWQgVE5vbmJsb2NraW5nSU9UaHJlYWQ6OmNyZWF0ZU5vdGlmaWNhdGlvblBpcGUoKSB7Ci0gIGlmKGV2dXRpbF9zb2NrZXRwYWlyKEFGX0xPQ0FMLCBTT0NLX1NUUkVBTSwgMCwgbm90aWZpY2F0aW9uUGlwZUZEc18pID09IC0xKSB7CisgIGlmIChldnV0aWxfc29ja2V0cGFpcihBRl9MT0NBTCwgU09DS19TVFJFQU0sIDAsIG5vdGlmaWNhdGlvblBpcGVGRHNfKSA9PSAtMSkgewogICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlROb25ibG9ja2luZ1NlcnZlcjo6Y3JlYXRlTm90aWZpY2F0aW9uUGlwZSAiLCBFVlVUSUxfU09DS0VUX0VSUk9SKCkpOwogICAgIHRocm93IFRFeGNlcHRpb24oImNhbid0IGNyZWF0ZSBub3RpZmljYXRpb24gcGlwZSIpOwogICB9Ci0gIGlmKGV2dXRpbF9tYWtlX3NvY2tldF9ub25ibG9ja2luZyhub3RpZmljYXRpb25QaXBlRkRzX1swXSk8MCB8fAotICAgICBldnV0aWxfbWFrZV9zb2NrZXRfbm9uYmxvY2tpbmcobm90aWZpY2F0aW9uUGlwZUZEc19bMV0pPDApIHsKKyAgaWYgKGV2dXRpbF9tYWtlX3NvY2tldF9ub25ibG9ja2luZyhub3RpZmljYXRpb25QaXBlRkRzX1swXSkgPCAwCisgICAgICB8fCBldnV0aWxfbWFrZV9zb2NrZXRfbm9uYmxvY2tpbmcobm90aWZpY2F0aW9uUGlwZUZEc19bMV0pIDwgMCkgewogICAgIDo6VEhSSUZUX0NMT1NFU09DS0VUKG5vdGlmaWNhdGlvblBpcGVGRHNfWzBdKTsKICAgICA6OlRIUklGVF9DTE9TRVNPQ0tFVChub3RpZmljYXRpb25QaXBlRkRzX1sxXSk7CiAgICAgdGhyb3cgVEV4Y2VwdGlvbigiVE5vbmJsb2NraW5nU2VydmVyOjpjcmVhdGVOb3RpZmljYXRpb25QaXBlKCkgVEhSSUZUX09fTk9OQkxPQ0siKTsKQEAgLTEzMjMsMTUgKzEyMTYsMTYgQEAKICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKICNpZiBMSUJFVkVOVF9WRVJTSU9OX05VTUJFUiA8IDB4MDIwMDAwMDAKICAgICBpbnQgZmxhZ3M7Ci0gICAgaWYgKChmbGFncyA9IFRIUklGVF9GQ05UTChub3RpZmljYXRpb25QaXBlRkRzX1tpXSwgRl9HRVRGRCwgMCkpIDwgMCB8fAotICAgICAgICBUSFJJRlRfRkNOVEwobm90aWZpY2F0aW9uUGlwZUZEc19baV0sIEZfU0VURkQsIGZsYWdzIHwgRkRfQ0xPRVhFQykgPCAwKSB7CisgICAgaWYgKChmbGFncyA9IFRIUklGVF9GQ05UTChub3RpZmljYXRpb25QaXBlRkRzX1tpXSwgRl9HRVRGRCwgMCkpIDwgMAorICAgICAgICB8fCBUSFJJRlRfRkNOVEwobm90aWZpY2F0aW9uUGlwZUZEc19baV0sIEZfU0VURkQsIGZsYWdzIHwgRkRfQ0xPRVhFQykgPCAwKSB7CiAjZWxzZQogICAgIGlmIChldnV0aWxfbWFrZV9zb2NrZXRfY2xvc2VvbmV4ZWMobm90aWZpY2F0aW9uUGlwZUZEc19baV0pIDwgMCkgewogI2VuZGlmCiAgICAgICA6OlRIUklGVF9DTE9TRVNPQ0tFVChub3RpZmljYXRpb25QaXBlRkRzX1swXSk7CiAgICAgICA6OlRIUklGVF9DTE9TRVNPQ0tFVChub3RpZmljYXRpb25QaXBlRkRzX1sxXSk7Ci0gICAgICB0aHJvdyBURXhjZXB0aW9uKCJUTm9uYmxvY2tpbmdTZXJ2ZXI6OmNyZWF0ZU5vdGlmaWNhdGlvblBpcGUoKSAiCi0gICAgICAgICJGRF9DTE9FWEVDIik7CisgICAgICB0aHJvdyBURXhjZXB0aW9uKAorICAgICAgICAgICJUTm9uYmxvY2tpbmdTZXJ2ZXI6OmNyZWF0ZU5vdGlmaWNhdGlvblBpcGUoKSAiCisgICAgICAgICAgIkZEX0NMT0VYRUMiKTsKICAgICB9CiAgIH0KIH0KQEAgLTEzNTIsMTEgKzEyNDYsMTEgQEAKICAgLy8gUHJpbnQgc29tZSBsaWJldmVudCBzdGF0cwogICBpZiAobnVtYmVyXyA9PSAwKSB7CiAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiVE5vbmJsb2NraW5nU2VydmVyOiB1c2luZyBsaWJldmVudCAlcyBtZXRob2QgJXMiLAotICAgICAgICAgICAgZXZlbnRfZ2V0X3ZlcnNpb24oKSwKLSAgICAgICAgICAgIGV2ZW50X2Jhc2VfZ2V0X21ldGhvZChldmVudEJhc2VfKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBldmVudF9nZXRfdmVyc2lvbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRfYmFzZV9nZXRfbWV0aG9kKGV2ZW50QmFzZV8pKTsKICAgfQogCi0gIGlmIChsaXN0ZW5Tb2NrZXRfID49IDApIHsKKyAgaWYgKGxpc3RlblNvY2tldF8gIT0gVEhSSUZUX0lOVkFMSURfU09DS0VUKSB7CiAgICAgLy8gUmVnaXN0ZXIgdGhlIHNlcnZlciBldmVudAogICAgIGV2ZW50X3NldCgmc2VydmVyRXZlbnRfLAogICAgICAgICAgICAgICBsaXN0ZW5Tb2NrZXRfLApAQCAtMTM2NywxMSArMTI2MSwxMSBAQAogCiAgICAgLy8gQWRkIHRoZSBldmVudCBhbmQgc3RhcnQgdXAgdGhlIHNlcnZlcgogICAgIGlmICgtMSA9PSBldmVudF9hZGQoJnNlcnZlckV2ZW50XywgMCkpIHsKLSAgICAgIHRocm93IFRFeGNlcHRpb24oIlROb25ibG9ja2luZ1NlcnZlcjo6c2VydmUoKTogIgotICAgICAgICAgICAgICAgICAgICAgICAiZXZlbnRfYWRkKCkgZmFpbGVkIG9uIHNlcnZlciBsaXN0ZW4gZXZlbnQiKTsKKyAgICAgIHRocm93IFRFeGNlcHRpb24oCisgICAgICAgICAgIlROb25ibG9ja2luZ1NlcnZlcjo6c2VydmUoKTogIgorICAgICAgICAgICJldmVudF9hZGQoKSBmYWlsZWQgb24gc2VydmVyIGxpc3RlbiBldmVudCIpOwogICAgIH0KLSAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJUTm9uYmxvY2tpbmc6IElPIHRocmVhZCAjJWQgcmVnaXN0ZXJlZCBmb3IgbGlzdGVuLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBudW1iZXJfKTsKKyAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJUTm9uYmxvY2tpbmc6IElPIHRocmVhZCAjJWQgcmVnaXN0ZXJlZCBmb3IgbGlzdGVuLiIsIG51bWJlcl8pOwogICB9CiAKICAgY3JlYXRlTm90aWZpY2F0aW9uUGlwZSgpOwpAQCAtMTM4OCwxMSArMTI4MiwxMSBAQAogCiAgIC8vIEFkZCB0aGUgZXZlbnQgYW5kIHN0YXJ0IHVwIHRoZSBzZXJ2ZXIKICAgaWYgKC0xID09IGV2ZW50X2FkZCgmbm90aWZpY2F0aW9uRXZlbnRfLCAwKSkgewotICAgIHRocm93IFRFeGNlcHRpb24oIlROb25ibG9ja2luZ1NlcnZlcjo6c2VydmUoKTogIgotICAgICAgICAgICAgICAgICAgICAgImV2ZW50X2FkZCgpIGZhaWxlZCBvbiB0YXNrLWRvbmUgbm90aWZpY2F0aW9uIGV2ZW50Iik7CisgICAgdGhyb3cgVEV4Y2VwdGlvbigKKyAgICAgICAgIlROb25ibG9ja2luZ1NlcnZlcjo6c2VydmUoKTogIgorICAgICAgICAiZXZlbnRfYWRkKCkgZmFpbGVkIG9uIHRhc2stZG9uZSBub3RpZmljYXRpb24gZXZlbnQiKTsKICAgfQotICBHbG9iYWxPdXRwdXQucHJpbnRmKCJUTm9uYmxvY2tpbmc6IElPIHRocmVhZCAjJWQgcmVnaXN0ZXJlZCBmb3Igbm90aWZ5LiIsCi0gICAgICAgICAgICAgICAgICAgICAgbnVtYmVyXyk7CisgIEdsb2JhbE91dHB1dC5wcmludGYoIlROb25ibG9ja2luZzogSU8gdGhyZWFkICMlZCByZWdpc3RlcmVkIGZvciBub3RpZnkuIiwgbnVtYmVyXyk7CiB9CiAKIGJvb2wgVE5vbmJsb2NraW5nSU9UaHJlYWQ6Om5vdGlmeShUTm9uYmxvY2tpbmdTZXJ2ZXI6OlRDb25uZWN0aW9uKiBjb25uKSB7CkBAIC0xNDAxLDE3ICsxMjk1LDg1IEBACiAgICAgcmV0dXJuIGZhbHNlOwogICB9CiAKLSAgY29uc3QgaW50IGtTaXplID0gc2l6ZW9mKGNvbm4pOwotICBpZiAoc2VuZChmZCwgY29uc3RfY2FzdF9zb2Nrb3B0KCZjb25uKSwga1NpemUsIDApICE9IGtTaXplKSB7Ci0gICAgcmV0dXJuIGZhbHNlOworICBpbnQgcmV0ID0gLTE7CisgIGxvbmcga1NpemUgPSBzaXplb2YoY29ubik7CisgIGNvbnN0IGNoYXIgKiBwb3MgPSAoY29uc3QgY2hhciAqKWNvbnN0X2Nhc3Rfc29ja29wdCgmY29ubik7CisKKyNpZiBkZWZpbmVkKEhBVkVfUE9MTF9IKSB8fCBkZWZpbmVkKEhBVkVfU1lTX1BPTExfSCkKKyAgc3RydWN0IHBvbGxmZCBwZmQgPSB7ZmQsIFBPTExPVVQsIDB9OworCisgIHdoaWxlIChrU2l6ZSA+IDApIHsKKyAgICBwZmQucmV2ZW50cyA9IDA7CisgICAgcmV0ID0gcG9sbCgmcGZkLCAxLCAtMSk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9IGVsc2UgaWYgKHJldCA9PSAwKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBpZiAocGZkLnJldmVudHMgJiBQT0xMSFVQIHx8IHBmZC5yZXZlbnRzICYgUE9MTEVSUikgeworICAgICAgOjpUSFJJRlRfQ0xPU0VTT0NLRVQoZmQpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChwZmQucmV2ZW50cyAmIFBPTExPVVQpIHsKKyAgICAgIHJldCA9IHNlbmQoZmQsIHBvcywga1NpemUsIDApOworICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgaWYgKGVycm5vID09IEVBR0FJTikgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgOjpUSFJJRlRfQ0xPU0VTT0NLRVQoZmQpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIGtTaXplIC09IHJldDsKKyAgICAgIHBvcyArPSByZXQ7CisgICAgfQogICB9CisjZWxzZQorICBmZF9zZXQgd2ZkcywgZWZkczsKKworICB3aGlsZSAoa1NpemUgPiAwKSB7CisgICAgRkRfWkVSTygmd2Zkcyk7CisgICAgRkRfWkVSTygmZWZkcyk7CisgICAgRkRfU0VUKGZkLCAmd2Zkcyk7CisgICAgRkRfU0VUKGZkLCAmZWZkcyk7CisgICAgcmV0ID0gc2VsZWN0KHN0YXRpY19jYXN0PGludD4oZmQgKyAxKSwgTlVMTCwgJndmZHMsICZlZmRzLCBOVUxMKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0gZWxzZSBpZiAocmV0ID09IDApIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIGlmIChGRF9JU1NFVChmZCwgJmVmZHMpKSB7CisgICAgICA6OlRIUklGVF9DTE9TRVNPQ0tFVChmZCk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKEZEX0lTU0VUKGZkLCAmd2ZkcykpIHsKKyAgICAgIHJldCA9IHNlbmQoZmQsIHBvcywga1NpemUsIDApOworICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgaWYgKGVycm5vID09IEVBR0FJTikgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgOjpUSFJJRlRfQ0xPU0VTT0NLRVQoZmQpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIGtTaXplIC09IHJldDsKKyAgICAgIHBvcyArPSByZXQ7CisgICAgfQorICB9CisjZW5kaWYKIAogICByZXR1cm4gdHJ1ZTsKIH0KIAogLyogc3RhdGljICovCiB2b2lkIFROb25ibG9ja2luZ0lPVGhyZWFkOjpub3RpZnlIYW5kbGVyKGV2dXRpbF9zb2NrZXRfdCBmZCwgc2hvcnQgd2hpY2gsIHZvaWQqIHYpIHsKLSAgVE5vbmJsb2NraW5nSU9UaHJlYWQqIGlvVGhyZWFkID0gKFROb25ibG9ja2luZ0lPVGhyZWFkKikgdjsKKyAgVE5vbmJsb2NraW5nSU9UaHJlYWQqIGlvVGhyZWFkID0gKFROb25ibG9ja2luZ0lPVGhyZWFkKil2OwogICBhc3NlcnQoaW9UaHJlYWQpOwogICAodm9pZCl3aGljaDsKIApAQCAtMTQyMiwyNSArMTM4NCwyNiBAQAogICAgIGlmIChuQnl0ZXMgPT0ga1NpemUpIHsKICAgICAgIGlmIChjb25uZWN0aW9uID09IE5VTEwpIHsKICAgICAgICAgLy8gdGhpcyBpcyB0aGUgY29tbWFuZCB0byBzdG9wIG91ciB0aHJlYWQsIGV4aXQgdGhlIGhhbmRsZXIhCisgICAgICAgIGlvVGhyZWFkLT5icmVha0xvb3AoZmFsc2UpOwogICAgICAgICByZXR1cm47CiAgICAgICB9CiAgICAgICBjb25uZWN0aW9uLT50cmFuc2l0aW9uKCk7CiAgICAgfSBlbHNlIGlmIChuQnl0ZXMgPiAwKSB7CiAgICAgICAvLyB0aHJvdyBhd2F5IHRoZXNlIGJ5dGVzIGFuZCBob3BlIHRoYXQgbmV4dCB0aW1lIHdlIGdldCBhIHNvbGlkIHJlYWQKLSAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoIm5vdGlmeUhhbmRsZXI6IEJhZCByZWFkIG9mICVkIGJ5dGVzLCB3YW50ZWQgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBuQnl0ZXMsIGtTaXplKTsKKyAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoIm5vdGlmeUhhbmRsZXI6IEJhZCByZWFkIG9mICVkIGJ5dGVzLCB3YW50ZWQgJWQiLCBuQnl0ZXMsIGtTaXplKTsKICAgICAgIGlvVGhyZWFkLT5icmVha0xvb3AodHJ1ZSk7CiAgICAgICByZXR1cm47CiAgICAgfSBlbHNlIGlmIChuQnl0ZXMgPT0gMCkgewogICAgICAgR2xvYmFsT3V0cHV0LnByaW50Zigibm90aWZ5SGFuZGxlcjogTm90aWZ5IHNvY2tldCBjbG9zZWQhIik7CisgICAgICBpb1RocmVhZC0+YnJlYWtMb29wKGZhbHNlKTsKICAgICAgIC8vIGV4aXQgdGhlIGxvb3AKICAgICAgIGJyZWFrOwogICAgIH0gZWxzZSB7IC8vIG5CeXRlcyA8IDAKLSAgICAgIGlmIChUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUiAhPSBUSFJJRlRfRVdPVUxEQkxPQ0sgJiYgVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IgIT0gVEhSSUZUX0VBR0FJTikgewotICAgICAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoCi0gICAgICAgICAgICAiVE5vbmJsb2NraW5nOiBub3RpZnlIYW5kbGVyIHJlYWQoKSBmYWlsZWQ6ICIsIFRIUklGVF9HRVRfU09DS0VUX0VSUk9SKTsKLSAgICAgICAgICBpb1RocmVhZC0+YnJlYWtMb29wKHRydWUpOwotICAgICAgICAgIHJldHVybjsKKyAgICAgIGlmIChUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUiAhPSBUSFJJRlRfRVdPVUxEQkxPQ0sKKyAgICAgICAgICAmJiBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUiAhPSBUSFJJRlRfRUFHQUlOKSB7CisgICAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlROb25ibG9ja2luZzogbm90aWZ5SGFuZGxlciByZWFkKCkgZmFpbGVkOiAiLCBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUik7CisgICAgICAgIGlvVGhyZWFkLT5icmVha0xvb3AodHJ1ZSk7CisgICAgICAgIHJldHVybjsKICAgICAgIH0KICAgICAgIC8vIGV4aXQgdGhlIGxvb3AKICAgICAgIGJyZWFrOwpAQCAtMTQ1MCwyNyArMTQxMywyMiBAQAogCiB2b2lkIFROb25ibG9ja2luZ0lPVGhyZWFkOjpicmVha0xvb3AoYm9vbCBlcnJvcikgewogICBpZiAoZXJyb3IpIHsKLSAgICBHbG9iYWxPdXRwdXQucHJpbnRmKAotICAgICAgIlROb25ibG9ja2luZ1NlcnZlcjogSU8gdGhyZWFkICMlZCBleGl0aW5nIHdpdGggZXJyb3IuIiwgbnVtYmVyXyk7CisgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiVE5vbmJsb2NraW5nU2VydmVyOiBJTyB0aHJlYWQgIyVkIGV4aXRpbmcgd2l0aCBlcnJvci4iLCBudW1iZXJfKTsKICAgICAvLyBUT0RPOiBmaWd1cmUgb3V0IHNvbWV0aGluZyBiZXR0ZXIgdG8gZG8gaGVyZSwgYnV0IGZvciBub3cga2lsbCB0aGUKICAgICAvLyB3aG9sZSBwcm9jZXNzLgogICAgIEdsb2JhbE91dHB1dC5wcmludGYoIlROb25ibG9ja2luZ1NlcnZlcjogYWJvcnRpbmcgcHJvY2Vzcy4iKTsKICAgICA6OmFib3J0KCk7CiAgIH0KIAotICAvLyBzZXRzIGEgZmxhZyBzbyB0aGF0IHRoZSBsb29wIGV4aXRzIG9uIHRoZSBuZXh0IGV2ZW50Ci0gIGV2ZW50X2Jhc2VfbG9vcGJyZWFrKGV2ZW50QmFzZV8pOwotCi0gIC8vIGV2ZW50X2Jhc2VfbG9vcGJyZWFrKCkgb25seSBjYXVzZXMgdGhlIGxvb3AgdG8gZXhpdCB0aGUgbmV4dCB0aW1lCi0gIC8vIGl0IHdha2VzIHVwLiAgV2UgbmVlZCB0byBmb3JjZSBpdCB0byB3YWtlIHVwLCBpbiBjYXNlIHRoZXJlIGFyZQotICAvLyBubyByZWFsIGV2ZW50cyBpdCBuZWVkcyB0byBwcm9jZXNzLgotICAvLwogICAvLyBJZiB3ZSdyZSBydW5uaW5nIGluIHRoZSBzYW1lIHRocmVhZCwgd2UgY2FuJ3QgdXNlIHRoZSBub3RpZnkoMCkKICAgLy8gbWVjaGFuaXNtIHRvIHN0b3AgdGhlIHRocmVhZCwgYnV0IGhhcHBpbHkgaWYgd2UncmUgcnVubmluZyBpbiB0aGUKICAgLy8gc2FtZSB0aHJlYWQsIHRoaXMgbWVhbnMgdGhlIHRocmVhZCBjYW4ndCBiZSBibG9ja2luZyBpbiB0aGUgZXZlbnQKICAgLy8gbG9vcCBlaXRoZXIuCiAgIGlmICghVGhyZWFkOjppc19jdXJyZW50KHRocmVhZElkXykpIHsKICAgICBub3RpZnkoTlVMTCk7CisgIH0gZWxzZSB7CisgICAgLy8gY2F1c2UgdGhlIGxvb3AgdG8gc3RvcCBBU0FQIC0gZXZlbiBpZiBpdCBoYXMgdGhpbmdzIHRvIGRvIGluIGl0CisgICAgZXZlbnRfYmFzZV9sb29wYnJlYWsoZXZlbnRCYXNlXyk7CiAgIH0KIH0KIApAQCAtMTQ3OCw3ICsxNDM2LDcgQEAKICNpZmRlZiBIQVZFX1NDSEVEX0gKICAgLy8gU3RhcnQgb3V0IHdpdGggYSBzdGFuZGFyZCwgbG93LXByaW9yaXR5IHNldHVwIGZvciB0aGUgc2NoZWQgcGFyYW1zLgogICBzdHJ1Y3Qgc2NoZWRfcGFyYW0gc3A7Ci0gIGJ6ZXJvKCh2b2lkKikgJnNwLCBzaXplb2Yoc3ApKTsKKyAgYnplcm8oKHZvaWQqKSZzcCwgc2l6ZW9mKHNwKSk7CiAgIGludCBwb2xpY3kgPSBTQ0hFRF9PVEhFUjsKIAogICAvLyBJZiBkZXNpcmVkLCBzZXQgdXAgaGlnaC1wcmlvcml0eSBzY2hlZCBwYXJhbXMgc3RydWN0dXJlLgpAQCAtMTQ4NywxNiArMTQ0NSwxNCBAQAogICAgIHBvbGljeSA9IFNDSEVEX0ZJRk87CiAgICAgLy8gVGhlIHByaW9yaXR5IG9ubHkgY29tcGFyZXMgdXMgdG8gb3RoZXIgU0NIRURfRklGTyB0aHJlYWRzLCBzbyB3ZQogICAgIC8vIGp1c3QgcGljayBhIHJhbmRvbSBwcmlvcml0eSBoYWxmd2F5IGJldHdlZW4gbWluICYgbWF4LgotICAgIGNvbnN0IGludCBwcmlvcml0eSA9IChzY2hlZF9nZXRfcHJpb3JpdHlfbWF4KHBvbGljeSkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlZF9nZXRfcHJpb3JpdHlfbWluKHBvbGljeSkpIC8gMjsKKyAgICBjb25zdCBpbnQgcHJpb3JpdHkgPSAoc2NoZWRfZ2V0X3ByaW9yaXR5X21heChwb2xpY3kpICsgc2NoZWRfZ2V0X3ByaW9yaXR5X21pbihwb2xpY3kpKSAvIDI7CiAKICAgICBzcC5zY2hlZF9wcmlvcml0eSA9IHByaW9yaXR5OwogICB9CiAKICAgLy8gQWN0dWFsbHkgc2V0IHRoZSBzY2hlZCBwYXJhbXMgZm9yIHRoZSBjdXJyZW50IHRocmVhZC4KICAgaWYgKDAgPT0gcHRocmVhZF9zZXRzY2hlZHBhcmFtKHB0aHJlYWRfc2VsZigpLCBwb2xpY3ksICZzcCkpIHsKLSAgICBHbG9iYWxPdXRwdXQucHJpbnRmKAotICAgICAgIlROb25ibG9ja2luZzogSU8gVGhyZWFkICMlZCB1c2luZyBoaWdoLXByaW9yaXR5IHNjaGVkdWxlciEiLCBudW1iZXJfKTsKKyAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJUTm9uYmxvY2tpbmc6IElPIFRocmVhZCAjJWQgdXNpbmcgaGlnaC1wcmlvcml0eSBzY2hlZHVsZXIhIiwgbnVtYmVyXyk7CiAgIH0gZWxzZSB7CiAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVE5vbmJsb2NraW5nOiBwdGhyZWFkX3NldHNjaGVkcGFyYW0oKTogIiwgVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IpOwogICB9CkBAIC0xNTA2LDMzICsxNDYyLDMzIEBACiB9CiAKIHZvaWQgVE5vbmJsb2NraW5nSU9UaHJlYWQ6OnJ1bigpIHsKLSAgaWYgKGV2ZW50QmFzZV8gPT0gTlVMTCkKKyAgaWYgKGV2ZW50QmFzZV8gPT0gTlVMTCkgewogICAgIHJlZ2lzdGVyRXZlbnRzKCk7Ci0KLSAgR2xvYmFsT3V0cHV0LnByaW50ZigiVE5vbmJsb2NraW5nU2VydmVyOiBJTyB0aHJlYWQgIyVkIGVudGVyaW5nIGxvb3AuLi4iLAotICAgICAgICAgICAgICAgICAgICAgIG51bWJlcl8pOwotCisgIH0KICAgaWYgKHVzZUhpZ2hQcmlvcml0eV8pIHsKICAgICBzZXRDdXJyZW50VGhyZWFkSGlnaFByaW9yaXR5KHRydWUpOwogICB9CiAKLSAgLy8gUnVuIGxpYmV2ZW50IGVuZ2luZSwgbmV2ZXIgcmV0dXJucywgaW52b2tlcyBjYWxscyB0byBldmVudEhhbmRsZXIKLSAgZXZlbnRfYmFzZV9sb29wKGV2ZW50QmFzZV8sIDApOworICBpZiAoZXZlbnRCYXNlXyAhPSBOVUxMKQorICB7CisgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiVE5vbmJsb2NraW5nU2VydmVyOiBJTyB0aHJlYWQgIyVkIGVudGVyaW5nIGxvb3AuLi4iLCBudW1iZXJfKTsKKyAgICAvLyBSdW4gbGliZXZlbnQgZW5naW5lLCBuZXZlciByZXR1cm5zLCBpbnZva2VzIGNhbGxzIHRvIGV2ZW50SGFuZGxlcgorICAgIGV2ZW50X2Jhc2VfbG9vcChldmVudEJhc2VfLCAwKTsKIAotICBpZiAodXNlSGlnaFByaW9yaXR5XykgewotICAgIHNldEN1cnJlbnRUaHJlYWRIaWdoUHJpb3JpdHkoZmFsc2UpOworICAgIGlmICh1c2VIaWdoUHJpb3JpdHlfKSB7CisgICAgICBzZXRDdXJyZW50VGhyZWFkSGlnaFByaW9yaXR5KGZhbHNlKTsKKyAgICB9CisKKyAgICAvLyBjbGVhbnMgdXAgb3VyIHJlZ2lzdGVyZWQgZXZlbnRzCisgICAgY2xlYW51cEV2ZW50cygpOwogICB9CiAKLSAgLy8gY2xlYW5zIHVwIG91ciByZWdpc3RlcmVkIGV2ZW50cwotICBjbGVhbnVwRXZlbnRzKCk7Ci0KLSAgR2xvYmFsT3V0cHV0LnByaW50ZigiVE5vbmJsb2NraW5nU2VydmVyOiBJTyB0aHJlYWQgIyVkIHJ1bigpIGRvbmUhIiwKLSAgICBudW1iZXJfKTsKKyAgR2xvYmFsT3V0cHV0LnByaW50ZigiVE5vbmJsb2NraW5nU2VydmVyOiBJTyB0aHJlYWQgIyVkIHJ1bigpIGRvbmUhIiwgbnVtYmVyXyk7CiB9CiAKIHZvaWQgVE5vbmJsb2NraW5nSU9UaHJlYWQ6OmNsZWFudXBFdmVudHMoKSB7CiAgIC8vIHN0b3AgdGhlIGxpc3RlbiBzb2NrZXQsIGlmIGFueQotICBpZiAobGlzdGVuU29ja2V0XyA+PSAwKSB7CisgIGlmIChsaXN0ZW5Tb2NrZXRfICE9IFRIUklGVF9JTlZBTElEX1NPQ0tFVCkgewogICAgIGlmIChldmVudF9kZWwoJnNlcnZlckV2ZW50XykgPT0gLTEpIHsKICAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlROb25ibG9ja2luZ0lPVGhyZWFkOjpzdG9wKCkgZXZlbnRfZGVsOiAiLCBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUik7CiAgICAgfQpAQCAtMTU0MSw3ICsxNDk3LDYgQEAKICAgZXZlbnRfZGVsKCZub3RpZmljYXRpb25FdmVudF8pOwogfQogCi0KIHZvaWQgVE5vbmJsb2NraW5nSU9UaHJlYWQ6OnN0b3AoKSB7CiAgIC8vIFRoaXMgc2hvdWxkIGNhdXNlIHRoZSB0aHJlYWQgdG8gZmFsbCBvdXQgb2YgaXRzIGV2ZW50IGxvb3AgQVNBUC4KICAgYnJlYWtMb29wKGZhbHNlKTsKQEAgLTE1NTUsMTAgKzE1MTAsMTEgQEAKICAgICAgIC8vIE5vdGUgdGhhdCBpdCBpcyBzYWZlIHRvIGJvdGggam9pbigpIG91cnNlbHZlcyB0d2ljZSwgYXMgd2VsbCBhcyBqb2luCiAgICAgICAvLyB0aGUgY3VycmVudCB0aHJlYWQgYXMgdGhlIHB0aHJlYWQgaW1wbGVtZW50YXRpb24gY2hlY2tzIGZvciBkZWFkbG9jay4KICAgICAgIHRocmVhZF8tPmpvaW4oKTsKLSAgICB9IGNhdGNoKC4uLikgeworICAgIH0gY2F0Y2ggKC4uLikgewogICAgICAgLy8gc3dhbGxvdyBldmVyeXRoaW5nCiAgICAgfQogICB9CiB9Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6c2VydmVyCit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXIKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVE5vbmJsb2NraW5nU2VydmVyLmggYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5oCmluZGV4IDUzMmQ0YWUuLmU3OWMyNGYgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVE5vbmJsb2NraW5nU2VydmVyLmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UTm9uYmxvY2tpbmdTZXJ2ZXIuaApAQCAtMjEsMTAgKzIxLDEyIEBACiAjZGVmaW5lIF9USFJJRlRfU0VSVkVSX1ROT05CTE9DS0lOR1NFUlZFUl9IXyAxCiAKICNpbmNsdWRlIDx0aHJpZnQvVGhyaWZ0Lmg+CisjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFNlcnZlci5oPgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvUGxhdGZvcm1Tb2NrZXQuaD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQuaD4KICNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5oPgogI2luY2x1ZGUgPGNsaW1pdHM+CiAjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZC5oPgpAQCAtMzgsMTMgKzQwLDE2IEBACiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjZW5kaWYKICNpbmNsdWRlIDxldmVudC5oPgorI2luY2x1ZGUgPGV2ZW50Mi9ldmVudF9jb21wYXQuaD4KKyNpbmNsdWRlIDxldmVudDIvZXZlbnRfc3RydWN0Lmg+CiAKLQotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBzZXJ2ZXIgeworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBzZXJ2ZXIgewogCiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyOwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNvY2tldDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydDsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sOwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpSdW5uYWJsZTsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkTWFuYWdlcjsKQEAgLTYzLDI3ICs2OCwyOCBAQAogI2RlZmluZSBMSUJFVkVOVF9WRVJTSU9OX01BSk9SIDEKICNkZWZpbmUgTElCRVZFTlRfVkVSU0lPTl9NSU5PUiAxNAogI2RlZmluZSBMSUJFVkVOVF9WRVJTSU9OX1JFTCAxMwotI2RlZmluZSBMSUJFVkVOVF9WRVJTSU9OX05VTUJFUiAoKExJQkVWRU5UX1ZFUlNJT05fTUFKT1IgPDwgMjQpIHwgKExJQkVWRU5UX1ZFUlNJT05fTUlOT1IgPDwgMTYpIHwgKExJQkVWRU5UX1ZFUlNJT05fUkVMIDw8IDgpKQorI2RlZmluZSBMSUJFVkVOVF9WRVJTSU9OX05VTUJFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKExJQkVWRU5UX1ZFUlNJT05fTUFKT1IgPDwgMjQpIHwgKExJQkVWRU5UX1ZFUlNJT05fTUlOT1IgPDwgMTYpIHwgKExJQkVWRU5UX1ZFUlNJT05fUkVMIDw8IDgpKQogI2VuZGlmCiAKICNpZiBMSUJFVkVOVF9WRVJTSU9OX05VTUJFUiA8IDB4MDIwMDAwMDAKLSB0eXBlZGVmIFRIUklGVF9TT0NLRVQgZXZ1dGlsX3NvY2tldF90OwordHlwZWRlZiBUSFJJRlRfU09DS0VUIGV2dXRpbF9zb2NrZXRfdDsKICNlbmRpZgogCiAjaWZuZGVmIFNPQ0tPUFRfQ0FTVF9UCi0jICAgaWZuZGVmIF9XSU4zMgotIyAgICAgICBkZWZpbmUgU09DS09QVF9DQVNUX1Qgdm9pZAotIyAgIGVsc2UKLSMgICAgICAgZGVmaW5lIFNPQ0tPUFRfQ0FTVF9UIGNoYXIKLSMgICBlbmRpZiAvLyBfV0lOMzIKKyNpZm5kZWYgX1dJTjMyCisjZGVmaW5lIFNPQ0tPUFRfQ0FTVF9UIHZvaWQKKyNlbHNlCisjZGVmaW5lIFNPQ0tPUFRfQ0FTVF9UIGNoYXIKKyNlbmRpZiAvLyBfV0lOMzIKICNlbmRpZgogCi10ZW1wbGF0ZTxjbGFzcyBUPgordGVtcGxhdGUgPGNsYXNzIFQ+CiBpbmxpbmUgY29uc3QgU09DS09QVF9DQVNUX1QqIGNvbnN0X2Nhc3Rfc29ja29wdChjb25zdCBUKiB2KSB7CiAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IFNPQ0tPUFRfQ0FTVF9UKj4odik7CiB9CiAKLXRlbXBsYXRlPGNsYXNzIFQ+Cit0ZW1wbGF0ZSA8Y2xhc3MgVD4KIGlubGluZSBTT0NLT1BUX0NBU1RfVCogY2FzdF9zb2Nrb3B0KFQqIHYpIHsKICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8U09DS09QVF9DQVNUX1QqPih2KTsKIH0KQEAgLTkzLDI4ICs5OSwyNCBAQAogICogb3BlcmF0ZXMgYSBzZXQgb2YgSU8gdGhyZWFkcyAoYnkgZGVmYXVsdCBvbmx5IG9uZSkuIEl0IGFzc3VtZXMgdGhhdAogICogYWxsIGluY29taW5nIHJlcXVlc3RzIGFyZSBmcmFtZWQgd2l0aCBhIDQgYnl0ZSBsZW5ndGggaW5kaWNhdG9yIGFuZAogICogd3JpdGVzIG91dCByZXNwb25zZXMgdXNpbmcgdGhlIHNhbWUgZnJhbWluZy4KLSAqCi0gKiBJdCBkb2VzIG5vdCB1c2UgdGhlIFRTZXJ2ZXJUcmFuc3BvcnQgZnJhbWV3b3JrLCBidXQgcmF0aGVyIGhhcyBzb2NrZXQKLSAqIG9wZXJhdGlvbnMgaGFyZGNvZGVkIGZvciB1c2Ugd2l0aCBzZWxlY3QuCi0gKgogICovCiAKLQogLy8vIE92ZXJsb2FkIGNvbmRpdGlvbiBhY3Rpb25zLgogZW51bSBUT3ZlcmxvYWRBY3Rpb24gewotICBUX09WRVJMT0FEX05PX0FDVElPTiwgICAgICAgIC8vLzwgRG9uJ3QgaGFuZGxlIG92ZXJsb2FkICovCi0gIFRfT1ZFUkxPQURfQ0xPU0VfT05fQUNDRVBULCAgLy8vPCBEcm9wIG5ldyBjb25uZWN0aW9ucyBpbW1lZGlhdGVseSAqLwotICBUX09WRVJMT0FEX0RSQUlOX1RBU0tfUVVFVUUgIC8vLzwgRHJvcCBzb21lIHRhc2tzIGZyb20gaGVhZCBvZiB0YXNrIHF1ZXVlICovCisgIFRfT1ZFUkxPQURfTk9fQUNUSU9OLCAgICAgICAvLy88IERvbid0IGhhbmRsZSBvdmVybG9hZCAqLworICBUX09WRVJMT0FEX0NMT1NFX09OX0FDQ0VQVCwgLy8vPCBEcm9wIG5ldyBjb25uZWN0aW9ucyBpbW1lZGlhdGVseSAqLworICBUX09WRVJMT0FEX0RSQUlOX1RBU0tfUVVFVUUgLy8vPCBEcm9wIHNvbWUgdGFza3MgZnJvbSBoZWFkIG9mIHRhc2sgcXVldWUgKi8KIH07CiAKIGNsYXNzIFROb25ibG9ja2luZ0lPVGhyZWFkOwogCiBjbGFzcyBUTm9uYmxvY2tpbmdTZXJ2ZXIgOiBwdWJsaWMgVFNlcnZlciB7Ci0gcHJpdmF0ZToKK3ByaXZhdGU6CiAgIGNsYXNzIFRDb25uZWN0aW9uOwogCiAgIGZyaWVuZCBjbGFzcyBUTm9uYmxvY2tpbmdJT1RocmVhZDsKLSBwcml2YXRlOgorCitwcml2YXRlOgogICAvLy8gTGlzdGVuIGJhY2tsb2cKICAgc3RhdGljIGNvbnN0IGludCBMSVNURU5fQkFDS0xPRyA9IDEwMjQ7CiAKQEAgLTE1NCwyMyArMTU2LDIwIEBACiAgIC8vLyBTZXJ2ZXIgc29ja2V0IGZpbGUgZGVzY3JpcHRvcgogICBUSFJJRlRfU09DS0VUIHNlcnZlclNvY2tldF87CiAKLSAgLy8vIFBvcnQgc2VydmVyIHJ1bnMgb24KLSAgaW50IHBvcnRfOwotCiAgIC8vLyBUaGUgb3B0aW9uYWwgdXNlci1wcm92aWRlZCBldmVudC1iYXNlIChmb3Igc2luZ2xlLXRocmVhZCBzZXJ2ZXJzKQogICBldmVudF9iYXNlKiB1c2VyRXZlbnRCYXNlXzsKIAogICAvLy8gRm9yIHByb2Nlc3NpbmcgdmlhIHRocmVhZCBwb29sLCBtYXkgYmUgTlVMTAotICBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyXzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IHRocmVhZE1hbmFnZXJfOwogCiAgIC8vLyBJcyB0aHJlYWQgcG9vbCBwcm9jZXNzaW5nPwogICBib29sIHRocmVhZFBvb2xQcm9jZXNzaW5nXzsKIAogICAvLyBGYWN0b3J5IHRvIGNyZWF0ZSB0aGUgSU8gdGhyZWFkcwotICBib29zdDo6c2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+IGlvVGhyZWFkRmFjdG9yeV87CisgIHN0ZDo6c2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+IGlvVGhyZWFkRmFjdG9yeV87CiAKICAgLy8gVmVjdG9yIG9mIElPVGhyZWFkIG9iamVjdHMgdGhhdCB3aWxsIGhhbmRsZSBvdXIgSU8KLSAgc3RkOjp2ZWN0b3I8Ym9vc3Q6OnNoYXJlZF9wdHI8VE5vbmJsb2NraW5nSU9UaHJlYWQ+ID4gaW9UaHJlYWRzXzsKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPFROb25ibG9ja2luZ0lPVGhyZWFkPiA+IGlvVGhyZWFkc187CiAKICAgLy8gSW5kZXggb2YgbmV4dCBJTyBUaHJlYWQgdG8gYmUgdXNlZCAoZm9yIHJvdW5kLXJvYmluKQogICB1aW50MzJfdCBuZXh0SU9UaHJlYWRfOwpAQCAtMjYzLDIyICsyNjIsMjQgQEAKICAgICovCiAgIHN0ZDo6dmVjdG9yPFRDb25uZWN0aW9uKj4gYWN0aXZlQ29ubmVjdGlvbnNfOwogCisgIC8qCisgICovCisgIHN0ZDo6c2hhcmVkX3B0cjxUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQ+IHNlcnZlclRyYW5zcG9ydF87CisKICAgLyoqCiAgICAqIENhbGxlZCB3aGVuIHNlcnZlciBzb2NrZXQgaGFkIHNvbWV0aGluZyBoYXBwZW4uICBXZSBhY2NlcHQgYWxsIHdhaXRpbmcKICAgICogY2xpZW50IGNvbm5lY3Rpb25zIG9uIGxpc3RlbiBzb2NrZXQgZmQgYW5kIGFzc2lnbiBUQ29ubmVjdGlvbiBvYmplY3RzCiAgICAqIHRvIGhhbmRsZSB0aG9zZSByZXF1ZXN0cy4KICAgICoKLSAgICogQHBhcmFtIGZkIHRoZSBsaXN0ZW4gc29ja2V0LgogICAgKiBAcGFyYW0gd2hpY2ggdGhlIGV2ZW50IGZsYWcgdGhhdCB0cmlnZ2VyZWQgdGhlIGhhbmRsZXIuCiAgICAqLwogICB2b2lkIGhhbmRsZUV2ZW50KFRIUklGVF9TT0NLRVQgZmQsIHNob3J0IHdoaWNoKTsKIAotICB2b2lkIGluaXQoaW50IHBvcnQpIHsKKyAgdm9pZCBpbml0KCkgewogICAgIHNlcnZlclNvY2tldF8gPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQ7CiAgICAgbnVtSU9UaHJlYWRzXyA9IERFRkFVTFRfSU9fVEhSRUFEUzsKICAgICBuZXh0SU9UaHJlYWRfID0gMDsKICAgICB1c2VIaWdoUHJpb3JpdHlJT1RocmVhZHNfID0gZmFsc2U7Ci0gICAgcG9ydF8gPSBwb3J0OwogICAgIHVzZXJFdmVudEJhc2VfID0gTlVMTDsKICAgICB0aHJlYWRQb29sUHJvY2Vzc2luZ18gPSBmYWxzZTsKICAgICBudW1UQ29ubmVjdGlvbnNfID0gMDsKQEAgLTI5OSw3MiArMzAwLDU2IEBACiAgICAgblRvdGFsQ29ubmVjdGlvbnNEcm9wcGVkXyA9IDA7CiAgIH0KIAotIHB1YmxpYzoKLSAgdGVtcGxhdGU8dHlwZW5hbWUgUHJvY2Vzc29yRmFjdG9yeT4KLSAgVE5vbmJsb2NraW5nU2VydmVyKAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8UHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCi0gICAgICBpbnQgcG9ydCwKLSAgICAgIFRIUklGVF9PVkVSTE9BRF9JRihQcm9jZXNzb3JGYWN0b3J5LCBUUHJvY2Vzc29yRmFjdG9yeSkpIDoKLSAgICBUU2VydmVyKHByb2Nlc3NvckZhY3RvcnkpIHsKLSAgICBpbml0KHBvcnQpOworcHVibGljOgorICBUTm9uYmxvY2tpbmdTZXJ2ZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQpCisgICAgOiBUU2VydmVyKHByb2Nlc3NvckZhY3RvcnkpLCBzZXJ2ZXJUcmFuc3BvcnRfKHNlcnZlclRyYW5zcG9ydCkgeworICAgIGluaXQoKTsKICAgfQogCi0gIHRlbXBsYXRlPHR5cGVuYW1lIFByb2Nlc3Nvcj4KLSAgVE5vbmJsb2NraW5nU2VydmVyKGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgICAgIGludCBwb3J0LAotICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX09WRVJMT0FEX0lGKFByb2Nlc3NvciwgVFByb2Nlc3NvcikpIDoKLSAgICBUU2VydmVyKHByb2Nlc3NvcikgewotICAgIGluaXQocG9ydCk7CisgIFROb25ibG9ja2luZ1NlcnZlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQpCisgICAgOiBUU2VydmVyKHByb2Nlc3NvciksIHNlcnZlclRyYW5zcG9ydF8oc2VydmVyVHJhbnNwb3J0KSB7CisgICAgaW5pdCgpOwogICB9CiAKLSAgdGVtcGxhdGU8dHlwZW5hbWUgUHJvY2Vzc29yRmFjdG9yeT4KLSAgVE5vbmJsb2NraW5nU2VydmVyKAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8UHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5LAotICAgICAgaW50IHBvcnQsCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiYgdGhyZWFkTWFuYWdlciA9Ci0gICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+KCksCi0gICAgICBUSFJJRlRfT1ZFUkxPQURfSUYoUHJvY2Vzc29yRmFjdG9yeSwgVFByb2Nlc3NvckZhY3RvcnkpKSA6Ci0gICAgVFNlcnZlcihwcm9jZXNzb3JGYWN0b3J5KSB7CiAKLSAgICBpbml0KHBvcnQpOworICBUTm9uYmxvY2tpbmdTZXJ2ZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiYgdGhyZWFkTWFuYWdlcgorICAgICAgICAgICAgICAgICAgICAgPSBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4oKSkKKyAgICA6IFRTZXJ2ZXIocHJvY2Vzc29yRmFjdG9yeSksIHNlcnZlclRyYW5zcG9ydF8oc2VydmVyVHJhbnNwb3J0KSB7CisgICAgaW5pdCgpOwogCiAgICAgc2V0SW5wdXRQcm90b2NvbEZhY3RvcnkocHJvdG9jb2xGYWN0b3J5KTsKICAgICBzZXRPdXRwdXRQcm90b2NvbEZhY3RvcnkocHJvdG9jb2xGYWN0b3J5KTsKICAgICBzZXRUaHJlYWRNYW5hZ2VyKHRocmVhZE1hbmFnZXIpOwogICB9CiAKLSAgdGVtcGxhdGU8dHlwZW5hbWUgUHJvY2Vzc29yPgotICBUTm9uYmxvY2tpbmdTZXJ2ZXIoCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5LAotICAgICAgaW50IHBvcnQsCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiYgdGhyZWFkTWFuYWdlciA9Ci0gICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+KCksCi0gICAgICBUSFJJRlRfT1ZFUkxPQURfSUYoUHJvY2Vzc29yLCBUUHJvY2Vzc29yKSkgOgotICAgIFRTZXJ2ZXIocHJvY2Vzc29yKSB7Ci0KLSAgICBpbml0KHBvcnQpOworICBUTm9uYmxvY2tpbmdTZXJ2ZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4mIHRocmVhZE1hbmFnZXIKKyAgICAgICAgICAgICAgICAgICAgID0gc3RkOjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+KCkpCisgICAgOiBUU2VydmVyKHByb2Nlc3NvciksIHNlcnZlclRyYW5zcG9ydF8oc2VydmVyVHJhbnNwb3J0KSB7CisgICAgaW5pdCgpOwogCiAgICAgc2V0SW5wdXRQcm90b2NvbEZhY3RvcnkocHJvdG9jb2xGYWN0b3J5KTsKICAgICBzZXRPdXRwdXRQcm90b2NvbEZhY3RvcnkocHJvdG9jb2xGYWN0b3J5KTsKICAgICBzZXRUaHJlYWRNYW5hZ2VyKHRocmVhZE1hbmFnZXIpOwogICB9CiAKLSAgdGVtcGxhdGU8dHlwZW5hbWUgUHJvY2Vzc29yRmFjdG9yeT4KLSAgVE5vbmJsb2NraW5nU2VydmVyKAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8UHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBpbnB1dFByb3RvY29sRmFjdG9yeSwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBvdXRwdXRQcm90b2NvbEZhY3RvcnksCi0gICAgICBpbnQgcG9ydCwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+JiB0aHJlYWRNYW5hZ2VyID0KLSAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4oKSwKLSAgICAgIFRIUklGVF9PVkVSTE9BRF9JRihQcm9jZXNzb3JGYWN0b3J5LCBUUHJvY2Vzc29yRmFjdG9yeSkpIDoKLSAgICBUU2VydmVyKHByb2Nlc3NvckZhY3RvcnkpIHsKLQotICAgIGluaXQocG9ydCk7CisgIFROb25ibG9ja2luZ1NlcnZlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIG91dHB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4mIHRocmVhZE1hbmFnZXIKKyAgICAgICAgICAgICAgICAgICAgID0gc3RkOjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+KCkpCisgICAgOiBUU2VydmVyKHByb2Nlc3NvckZhY3RvcnkpLCBzZXJ2ZXJUcmFuc3BvcnRfKHNlcnZlclRyYW5zcG9ydCkgeworICAgIGluaXQoKTsKIAogICAgIHNldElucHV0VHJhbnNwb3J0RmFjdG9yeShpbnB1dFRyYW5zcG9ydEZhY3RvcnkpOwogICAgIHNldE91dHB1dFRyYW5zcG9ydEZhY3Rvcnkob3V0cHV0VHJhbnNwb3J0RmFjdG9yeSk7CkBAIC0zNzMsMjAgKzM1OCwxNiBAQAogICAgIHNldFRocmVhZE1hbmFnZXIodGhyZWFkTWFuYWdlcik7CiAgIH0KIAotICB0ZW1wbGF0ZTx0eXBlbmFtZSBQcm9jZXNzb3I+Ci0gIFROb25ibG9ja2luZ1NlcnZlcigKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIGlucHV0UHJvdG9jb2xGYWN0b3J5LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIG91dHB1dFByb3RvY29sRmFjdG9yeSwKLSAgICAgIGludCBwb3J0LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4mIHRocmVhZE1hbmFnZXIgPQotICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPigpLAotICAgICAgVEhSSUZUX09WRVJMT0FEX0lGKFByb2Nlc3NvciwgVFByb2Nlc3NvcikpIDoKLSAgICBUU2VydmVyKHByb2Nlc3NvcikgewotCi0gICAgaW5pdChwb3J0KTsKKyAgVE5vbmJsb2NraW5nU2VydmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIG91dHB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4mIHRocmVhZE1hbmFnZXIKKyAgICAgICAgICAgICAgICAgICAgID0gc3RkOjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+KCkpCisgICAgOiBUU2VydmVyKHByb2Nlc3NvciksIHNlcnZlclRyYW5zcG9ydF8oc2VydmVyVHJhbnNwb3J0KSB7CisgICAgaW5pdCgpOwogCiAgICAgc2V0SW5wdXRUcmFuc3BvcnRGYWN0b3J5KGlucHV0VHJhbnNwb3J0RmFjdG9yeSk7CiAgICAgc2V0T3V0cHV0VHJhbnNwb3J0RmFjdG9yeShvdXRwdXRUcmFuc3BvcnRGYWN0b3J5KTsKQEAgLTM5NywxMSArMzc4LDExIEBACiAKICAgflROb25ibG9ja2luZ1NlcnZlcigpOwogCi0gIHZvaWQgc2V0VGhyZWFkTWFuYWdlcihib29zdDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyKTsKKyAgdm9pZCBzZXRUaHJlYWRNYW5hZ2VyKHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyKTsKIAotICBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiBnZXRUaHJlYWRNYW5hZ2VyKCkgewotICAgIHJldHVybiB0aHJlYWRNYW5hZ2VyXzsKLSAgfQorICBpbnQgZ2V0TGlzdGVuUG9ydCgpIHsgcmV0dXJuIHNlcnZlclRyYW5zcG9ydF8tPmdldExpc3RlblBvcnQoKTsgfQorCisgIHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiBnZXRUaHJlYWRNYW5hZ2VyKCkgeyByZXR1cm4gdGhyZWFkTWFuYWdlcl87IH0KIAogICAvKioKICAgICogU2V0cyB0aGUgbnVtYmVyIG9mIElPIHRocmVhZHMgdXNlZCBieSB0aGlzIHNlcnZlci4gQ2FuIG9ubHkgYmUgdXNlZCBiZWZvcmUKQEAgLTQxMSw0NiArMzkyLDM2IEBACiAgICAqLwogICB2b2lkIHNldE51bUlPVGhyZWFkcyhzaXplX3QgbnVtVGhyZWFkcykgewogICAgIG51bUlPVGhyZWFkc18gPSBudW1UaHJlYWRzOworICAgIC8vIFVzZXItcHJvdmlkZWQgZXZlbnQtYmFzZSBkb2Vzbid0IHdvcmtzIGZvciBtdWx0aS10aHJlYWRlZCBzZXJ2ZXJzCisgICAgYXNzZXJ0KG51bUlPVGhyZWFkc18gPD0gMSB8fCAhdXNlckV2ZW50QmFzZV8pOwogICB9CiAKICAgLyoqIFJldHVybiB3aGV0aGVyIHRoZSBJTyB0aHJlYWRzIHdpbGwgZ2V0IGhpZ2ggc2NoZWR1bGluZyBwcmlvcml0eSAqLwotICBib29sIHVzZUhpZ2hQcmlvcml0eUlPVGhyZWFkcygpIGNvbnN0IHsKLSAgICByZXR1cm4gdXNlSGlnaFByaW9yaXR5SU9UaHJlYWRzXzsKLSAgfQorICBib29sIHVzZUhpZ2hQcmlvcml0eUlPVGhyZWFkcygpIGNvbnN0IHsgcmV0dXJuIHVzZUhpZ2hQcmlvcml0eUlPVGhyZWFkc187IH0KIAogICAvKiogU2V0IHdoZXRoZXIgdGhlIElPIHRocmVhZHMgd2lsbCBnZXQgaGlnaCBzY2hlZHVsaW5nIHByaW9yaXR5LiAqLwotICB2b2lkIHNldFVzZUhpZ2hQcmlvcml0eUlPVGhyZWFkcyhib29sIHZhbCkgewotICAgIHVzZUhpZ2hQcmlvcml0eUlPVGhyZWFkc18gPSB2YWw7Ci0gIH0KKyAgdm9pZCBzZXRVc2VIaWdoUHJpb3JpdHlJT1RocmVhZHMoYm9vbCB2YWwpIHsgdXNlSGlnaFByaW9yaXR5SU9UaHJlYWRzXyA9IHZhbDsgfQogCiAgIC8qKiBSZXR1cm4gdGhlIG51bWJlciBvZiBJTyB0aHJlYWRzIHVzZWQgYnkgdGhpcyBzZXJ2ZXIuICovCi0gIHNpemVfdCBnZXROdW1JT1RocmVhZHMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG51bUlPVGhyZWFkc187Ci0gIH0KKyAgc2l6ZV90IGdldE51bUlPVGhyZWFkcygpIGNvbnN0IHsgcmV0dXJuIG51bUlPVGhyZWFkc187IH0KIAogICAvKioKICAgICogR2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiB1bnVzZWQgVENvbm5lY3Rpb24gd2Ugd2lsbCBob2xkIGluIHJlc2VydmUuCiAgICAqCiAgICAqIEByZXR1cm4gdGhlIGN1cnJlbnQgbGltaXQgb24gVENvbm5lY3Rpb24gcG9vbCBzaXplLgogICAgKi8KLSAgc2l6ZV90IGdldENvbm5lY3Rpb25TdGFja0xpbWl0KCkgY29uc3QgewotICAgIHJldHVybiBjb25uZWN0aW9uU3RhY2tMaW1pdF87Ci0gIH0KKyAgc2l6ZV90IGdldENvbm5lY3Rpb25TdGFja0xpbWl0KCkgY29uc3QgeyByZXR1cm4gY29ubmVjdGlvblN0YWNrTGltaXRfOyB9CiAKICAgLyoqCiAgICAqIFNldCB0aGUgbWF4aW11bSBudW1iZXIgb2YgdW51c2VkIFRDb25uZWN0aW9uIHdlIHdpbGwgaG9sZCBpbiByZXNlcnZlLgogICAgKgogICAgKiBAcGFyYW0gc3ogdGhlIG5ldyBsaW1pdCBmb3IgVENvbm5lY3Rpb24gcG9vbCBzaXplLgogICAgKi8KLSAgdm9pZCBzZXRDb25uZWN0aW9uU3RhY2tMaW1pdChzaXplX3Qgc3opIHsKLSAgICBjb25uZWN0aW9uU3RhY2tMaW1pdF8gPSBzejsKLSAgfQorICB2b2lkIHNldENvbm5lY3Rpb25TdGFja0xpbWl0KHNpemVfdCBzeikgeyBjb25uZWN0aW9uU3RhY2tMaW1pdF8gPSBzejsgfQogCi0gIGJvb2wgaXNUaHJlYWRQb29sUHJvY2Vzc2luZygpIGNvbnN0IHsKLSAgICByZXR1cm4gdGhyZWFkUG9vbFByb2Nlc3NpbmdfOwotICB9CisgIGJvb2wgaXNUaHJlYWRQb29sUHJvY2Vzc2luZygpIGNvbnN0IHsgcmV0dXJuIHRocmVhZFBvb2xQcm9jZXNzaW5nXzsgfQogCi0gIHZvaWQgYWRkVGFzayhib29zdDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzaykgeworICB2b2lkIGFkZFRhc2soc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrKSB7CiAgICAgdGhyZWFkTWFuYWdlcl8tPmFkZCh0YXNrLCAwTEwsIHRhc2tFeHBpcmVUaW1lXyk7CiAgIH0KIApAQCAtNDU5LDI3ICs0MzAsMjEgQEAKICAgICoKICAgICogQHJldHVybiBjb3VudCBvZiBjb25uZWN0ZWQgc29ja2V0cy4KICAgICovCi0gIHNpemVfdCBnZXROdW1Db25uZWN0aW9ucygpIGNvbnN0IHsKLSAgICByZXR1cm4gbnVtVENvbm5lY3Rpb25zXzsKLSAgfQorICBzaXplX3QgZ2V0TnVtQ29ubmVjdGlvbnMoKSBjb25zdCB7IHJldHVybiBudW1UQ29ubmVjdGlvbnNfOyB9CiAKICAgLyoqCiAgICAqIFJldHVybiB0aGUgY291bnQgb2Ygc29ja2V0cyBjdXJyZW50bHkgY29ubmVjdGVkIHRvLgogICAgKgogICAgKiBAcmV0dXJuIGNvdW50IG9mIGNvbm5lY3RlZCBzb2NrZXRzLgogICAgKi8KLSAgc2l6ZV90IGdldE51bUFjdGl2ZUNvbm5lY3Rpb25zKCkgY29uc3QgewotICAgIHJldHVybiBnZXROdW1Db25uZWN0aW9ucygpIC0gZ2V0TnVtSWRsZUNvbm5lY3Rpb25zKCk7Ci0gIH0KKyAgc2l6ZV90IGdldE51bUFjdGl2ZUNvbm5lY3Rpb25zKCkgY29uc3QgeyByZXR1cm4gZ2V0TnVtQ29ubmVjdGlvbnMoKSAtIGdldE51bUlkbGVDb25uZWN0aW9ucygpOyB9CiAKICAgLyoqCiAgICAqIFJldHVybiB0aGUgY291bnQgb2YgY29ubmVjdGlvbiBvYmplY3RzIGFsbG9jYXRlZCBidXQgbm90IGluIHVzZS4KICAgICoKICAgICogQHJldHVybiBjb3VudCBvZiBpZGxlIGNvbm5lY3Rpb24gb2JqZWN0cy4KICAgICovCi0gIHNpemVfdCBnZXROdW1JZGxlQ29ubmVjdGlvbnMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGNvbm5lY3Rpb25TdGFja18uc2l6ZSgpOwotICB9CisgIHNpemVfdCBnZXROdW1JZGxlQ29ubmVjdGlvbnMoKSBjb25zdCB7IHJldHVybiBjb25uZWN0aW9uU3RhY2tfLnNpemUoKTsgfQogCiAgIC8qKgogICAgKiBSZXR1cm4gY291bnQgb2YgbnVtYmVyIG9mIGNvbm5lY3Rpb25zIHdoaWNoIGFyZSBjdXJyZW50bHkgcHJvY2Vzc2luZy4KQEAgLTQ4OSw5ICs0NTQsNyBAQAogICAgKgogICAgKiBAcmV0dXJuICMgb2YgY29ubmVjdGlvbnMgY3VycmVudGx5IHByb2Nlc3NpbmcuCiAgICAqLwotICBzaXplX3QgZ2V0TnVtQWN0aXZlUHJvY2Vzc29ycygpIGNvbnN0IHsKLSAgICByZXR1cm4gbnVtQWN0aXZlUHJvY2Vzc29yc187Ci0gIH0KKyAgc2l6ZV90IGdldE51bUFjdGl2ZVByb2Nlc3NvcnMoKSBjb25zdCB7IHJldHVybiBudW1BY3RpdmVQcm9jZXNzb3JzXzsgfQogCiAgIC8vLyBJbmNyZW1lbnQgdGhlIGNvdW50IG9mIGNvbm5lY3Rpb25zIGN1cnJlbnRseSBwcm9jZXNzaW5nLgogICB2b2lkIGluY3JlbWVudEFjdGl2ZVByb2Nlc3NvcnMoKSB7CkBAIC01MTIsMjcgKzQ3NSwyMSBAQAogICAgKgogICAgKiBAcmV0dXJuIGN1cnJlbnQgc2V0dGluZy4KICAgICovCi0gIHNpemVfdCBnZXRNYXhDb25uZWN0aW9ucygpIGNvbnN0IHsKLSAgICByZXR1cm4gbWF4Q29ubmVjdGlvbnNfOwotICB9CisgIHNpemVfdCBnZXRNYXhDb25uZWN0aW9ucygpIGNvbnN0IHsgcmV0dXJuIG1heENvbm5lY3Rpb25zXzsgfQogCiAgIC8qKgogICAgKiBTZXQgdGhlIG1heGltdW0gIyBvZiBjb25uZWN0aW9ucyBhbGxvd2VkIGJlZm9yZSBvdmVybG9hZC4KICAgICoKICAgICogQHBhcmFtIG1heENvbm5lY3Rpb25zIG5ldyBzZXR0aW5nIGZvciBtYXhpbXVtICMgb2YgY29ubmVjdGlvbnMuCiAgICAqLwotICB2b2lkIHNldE1heENvbm5lY3Rpb25zKHNpemVfdCBtYXhDb25uZWN0aW9ucykgewotICAgIG1heENvbm5lY3Rpb25zXyA9IG1heENvbm5lY3Rpb25zOwotICB9CisgIHZvaWQgc2V0TWF4Q29ubmVjdGlvbnMoc2l6ZV90IG1heENvbm5lY3Rpb25zKSB7IG1heENvbm5lY3Rpb25zXyA9IG1heENvbm5lY3Rpb25zOyB9CiAKICAgLyoqCiAgICAqIEdldCB0aGUgbWF4aW11bSAjIG9mIGNvbm5lY3Rpb25zIHdhaXRpbmcgaW4gaGFuZGxlci90YXNrIGJlZm9yZSBvdmVybG9hZC4KICAgICoKICAgICogQHJldHVybiBjdXJyZW50IHNldHRpbmcuCiAgICAqLwotICBzaXplX3QgZ2V0TWF4QWN0aXZlUHJvY2Vzc29ycygpIGNvbnN0IHsKLSAgICByZXR1cm4gbWF4QWN0aXZlUHJvY2Vzc29yc187Ci0gIH0KKyAgc2l6ZV90IGdldE1heEFjdGl2ZVByb2Nlc3NvcnMoKSBjb25zdCB7IHJldHVybiBtYXhBY3RpdmVQcm9jZXNzb3JzXzsgfQogCiAgIC8qKgogICAgKiBTZXQgdGhlIG1heGltdW0gIyBvZiBjb25uZWN0aW9ucyB3YWl0aW5nIGluIGhhbmRsZXIvdGFzayBiZWZvcmUgb3ZlcmxvYWQuCkBAIC01NTEsMjcgKzUwOCwyMSBAQAogICAgKgogICAgKiBAcmV0dXJuIE1heGl1bSBmcmFtZSBzaXplLCBpbiBieXRlcy4KICAgICovCi0gIHNpemVfdCBnZXRNYXhGcmFtZVNpemUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1heEZyYW1lU2l6ZV87Ci0gIH0KKyAgc2l6ZV90IGdldE1heEZyYW1lU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1heEZyYW1lU2l6ZV87IH0KIAogICAvKioKICAgICogU2V0IHRoZSBtYXhpbXVtIGFsbG93ZWQgZnJhbWUgc2l6ZS4KICAgICoKICAgICogQHBhcmFtIG1heEZyYW1lU2l6ZSBUaGUgbmV3IG1heGltdW0gZnJhbWUgc2l6ZS4KICAgICovCi0gIHZvaWQgc2V0TWF4RnJhbWVTaXplKHNpemVfdCBtYXhGcmFtZVNpemUpIHsKLSAgICBtYXhGcmFtZVNpemVfID0gbWF4RnJhbWVTaXplOwotICB9CisgIHZvaWQgc2V0TWF4RnJhbWVTaXplKHNpemVfdCBtYXhGcmFtZVNpemUpIHsgbWF4RnJhbWVTaXplXyA9IG1heEZyYW1lU2l6ZTsgfQogCiAgIC8qKgogICAgKiBHZXQgZnJhY3Rpb24gb2YgbWF4aW11bSBsaW1pdHMgYmVmb3JlIGFuIG92ZXJsb2FkIGNvbmRpdGlvbiBpcyBjbGVhcmVkLgogICAgKgogICAgKiBAcmV0dXJuIGh5c3RlcmVzaXMgZnJhY3Rpb24KICAgICovCi0gIGRvdWJsZSBnZXRPdmVybG9hZEh5c3RlcmVzaXMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG92ZXJsb2FkSHlzdGVyZXNpc187Ci0gIH0KKyAgZG91YmxlIGdldE92ZXJsb2FkSHlzdGVyZXNpcygpIGNvbnN0IHsgcmV0dXJuIG92ZXJsb2FkSHlzdGVyZXNpc187IH0KIAogICAvKioKICAgICogU2V0IGZyYWN0aW9uIG9mIG1heGltdW0gbGltaXRzIGJlZm9yZSBhbiBvdmVybG9hZCBjb25kaXRpb24gaXMgY2xlYXJlZC4KQEAgLTU5MCwzNiArNTQxLDI4IEBACiAgICAqCiAgICAqIEByZXR1cm4gYSBUT3ZlcmxvYWRBY3Rpb24gZW51bSB2YWx1ZSBmb3IgdGhlIGN1cnJlbnRseSBzZXQgYWN0aW9uLgogICAgKi8KLSAgVE92ZXJsb2FkQWN0aW9uIGdldE92ZXJsb2FkQWN0aW9uKCkgY29uc3QgewotICAgIHJldHVybiBvdmVybG9hZEFjdGlvbl87Ci0gIH0KKyAgVE92ZXJsb2FkQWN0aW9uIGdldE92ZXJsb2FkQWN0aW9uKCkgY29uc3QgeyByZXR1cm4gb3ZlcmxvYWRBY3Rpb25fOyB9CiAKICAgLyoqCiAgICAqIFNldCB0aGUgYWN0aW9uIHRoZSBzZXJ2ZXIgaXMgdG8gdGFrZSBvbiBvdmVybG9hZC4KICAgICoKICAgICogQHBhcmFtIG92ZXJsb2FkQWN0aW9uIGEgVE92ZXJsb2FkQWN0aW9uIGVudW0gdmFsdWUgZm9yIHRoZSBhY3Rpb24uCiAgICAqLwotICB2b2lkIHNldE92ZXJsb2FkQWN0aW9uKFRPdmVybG9hZEFjdGlvbiBvdmVybG9hZEFjdGlvbikgewotICAgIG92ZXJsb2FkQWN0aW9uXyA9IG92ZXJsb2FkQWN0aW9uOwotICB9CisgIHZvaWQgc2V0T3ZlcmxvYWRBY3Rpb24oVE92ZXJsb2FkQWN0aW9uIG92ZXJsb2FkQWN0aW9uKSB7IG92ZXJsb2FkQWN0aW9uXyA9IG92ZXJsb2FkQWN0aW9uOyB9CiAKICAgLyoqCiAgICAqIEdldCB0aGUgdGltZSBpbiBtaWxsaXNlY29uZHMgYWZ0ZXIgd2hpY2ggYSB0YXNrIGV4cGlyZXMgKDAgPT0gaW5maW5pdGUpLgogICAgKgogICAgKiBAcmV0dXJuIGEgNjQtYml0IHRpbWUgaW4gbWlsbGlzZWNvbmRzLgogICAgKi8KLSAgaW50NjRfdCBnZXRUYXNrRXhwaXJlVGltZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gdGFza0V4cGlyZVRpbWVfOwotICB9CisgIGludDY0X3QgZ2V0VGFza0V4cGlyZVRpbWUoKSBjb25zdCB7IHJldHVybiB0YXNrRXhwaXJlVGltZV87IH0KIAogICAvKioKICAgICogU2V0IHRoZSB0aW1lIGluIG1pbGxpc2Vjb25kcyBhZnRlciB3aGljaCBhIHRhc2sgZXhwaXJlcyAoMCA9PSBpbmZpbml0ZSkuCiAgICAqCiAgICAqIEBwYXJhbSB0YXNrRXhwaXJlVGltZSBhIDY0LWJpdCB0aW1lIGluIG1pbGxpc2Vjb25kcy4KICAgICovCi0gIHZvaWQgc2V0VGFza0V4cGlyZVRpbWUoaW50NjRfdCB0YXNrRXhwaXJlVGltZSkgewotICAgIHRhc2tFeHBpcmVUaW1lXyA9IHRhc2tFeHBpcmVUaW1lOwotICB9CisgIHZvaWQgc2V0VGFza0V4cGlyZVRpbWUoaW50NjRfdCB0YXNrRXhwaXJlVGltZSkgeyB0YXNrRXhwaXJlVGltZV8gPSB0YXNrRXhwaXJlVGltZTsgfQogCiAgIC8qKgogICAgKiBEZXRlcm1pbmUgaWYgdGhlIHNlcnZlciBpcyBjdXJyZW50bHkgb3ZlcmxvYWRlZC4KQEAgLTY0MywyNyArNTg2LDIxIEBACiAgICAqCiAgICAqIEByZXR1cm4gIyBieXRlcyB3ZSBpbml0aWFsaXplIGEgVENvbm5lY3Rpb24gb2JqZWN0J3Mgd3JpdGUgYnVmZmVyIHRvLgogICAgKi8KLSAgc2l6ZV90IGdldFdyaXRlQnVmZmVyRGVmYXVsdFNpemUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHdyaXRlQnVmZmVyRGVmYXVsdFNpemVfOwotICB9CisgIHNpemVfdCBnZXRXcml0ZUJ1ZmZlckRlZmF1bHRTaXplKCkgY29uc3QgeyByZXR1cm4gd3JpdGVCdWZmZXJEZWZhdWx0U2l6ZV87IH0KIAogICAvKioKICAgICogU2V0IHRoZSBzdGFydGluZyBzaXplIG9mIGEgVENvbm5lY3Rpb24gb2JqZWN0J3Mgd3JpdGUgYnVmZmVyLgogICAgKgogICAgKiBAcGFyYW0gc2l6ZSAjIGJ5dGVzIHdlIGluaXRpYWxpemUgYSBUQ29ubmVjdGlvbiBvYmplY3QncyB3cml0ZSBidWZmZXIgdG8uCiAgICAqLwotICB2b2lkIHNldFdyaXRlQnVmZmVyRGVmYXVsdFNpemUoc2l6ZV90IHNpemUpIHsKLSAgICB3cml0ZUJ1ZmZlckRlZmF1bHRTaXplXyA9IHNpemU7Ci0gIH0KKyAgdm9pZCBzZXRXcml0ZUJ1ZmZlckRlZmF1bHRTaXplKHNpemVfdCBzaXplKSB7IHdyaXRlQnVmZmVyRGVmYXVsdFNpemVfID0gc2l6ZTsgfQogCiAgIC8qKgogICAgKiBHZXQgdGhlIG1heGltdW0gc2l6ZSBvZiByZWFkIGJ1ZmZlciBhbGxvY2F0ZWQgdG8gaWRsZSBUQ29ubmVjdGlvbiBvYmplY3RzLgogICAgKgogICAgKiBAcmV0dXJuICMgYnl0ZXMgYmV5b25kIHdoaWNoIHdlIHdpbGwgZGVhbGxvYyBpZGxlIGJ1ZmZlci4KICAgICovCi0gIHNpemVfdCBnZXRJZGxlUmVhZEJ1ZmZlckxpbWl0KCkgY29uc3QgewotICAgIHJldHVybiBpZGxlUmVhZEJ1ZmZlckxpbWl0XzsKLSAgfQorICBzaXplX3QgZ2V0SWRsZVJlYWRCdWZmZXJMaW1pdCgpIGNvbnN0IHsgcmV0dXJuIGlkbGVSZWFkQnVmZmVyTGltaXRfOyB9CiAKICAgLyoqCiAgICAqIFtOT1RFOiBUaGlzIGlzIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgdXNlIGdldElkbGVSZWFkQnVmZmVyTGltaXQoKS5dCkBAIC02NzEsOSArNjA4LDcgQEAKICAgICoKICAgICogQHJldHVybiAjIGJ5dGVzIGJleW9uZCB3aGljaCB3ZSB3aWxsIGRlYWxsb2MgaWRsZSBidWZmZXIuCiAgICAqLwotICBzaXplX3QgZ2V0SWRsZUJ1ZmZlck1lbUxpbWl0KCkgY29uc3QgewotICAgIHJldHVybiBpZGxlUmVhZEJ1ZmZlckxpbWl0XzsKLSAgfQorICBzaXplX3QgZ2V0SWRsZUJ1ZmZlck1lbUxpbWl0KCkgY29uc3QgeyByZXR1cm4gaWRsZVJlYWRCdWZmZXJMaW1pdF87IH0KIAogICAvKioKICAgICogU2V0IHRoZSBtYXhpbXVtIHNpemUgcmVhZCBidWZmZXIgYWxsb2NhdGVkIHRvIGlkbGUgVENvbm5lY3Rpb24gb2JqZWN0cy4KQEAgLTY4NCw5ICs2MTksNyBAQAogICAgKgogICAgKiBAcGFyYW0gbGltaXQgb2YgYnl0ZXMgYmV5b25kIHdoaWNoIHdlIHdpbGwgc2hyaW5rIGJ1ZmZlcnMgd2hlbiBjaGVja2VkLgogICAgKi8KLSAgdm9pZCBzZXRJZGxlUmVhZEJ1ZmZlckxpbWl0KHNpemVfdCBsaW1pdCkgewotICAgIGlkbGVSZWFkQnVmZmVyTGltaXRfID0gbGltaXQ7Ci0gIH0KKyAgdm9pZCBzZXRJZGxlUmVhZEJ1ZmZlckxpbWl0KHNpemVfdCBsaW1pdCkgeyBpZGxlUmVhZEJ1ZmZlckxpbWl0XyA9IGxpbWl0OyB9CiAKICAgLyoqCiAgICAqIFtOT1RFOiBUaGlzIGlzIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgdXNlIHNldElkbGVSZWFkQnVmZmVyTGltaXQoKS5dCkBAIC02OTgsMjAgKzYzMSwxNCBAQAogICAgKgogICAgKiBAcGFyYW0gbGltaXQgb2YgYnl0ZXMgYmV5b25kIHdoaWNoIHdlIHdpbGwgc2hyaW5rIGJ1ZmZlcnMgd2hlbiBjaGVja2VkLgogICAgKi8KLSAgdm9pZCBzZXRJZGxlQnVmZmVyTWVtTGltaXQoc2l6ZV90IGxpbWl0KSB7Ci0gICAgaWRsZVJlYWRCdWZmZXJMaW1pdF8gPSBsaW1pdDsKLSAgfQotCi0KKyAgdm9pZCBzZXRJZGxlQnVmZmVyTWVtTGltaXQoc2l6ZV90IGxpbWl0KSB7IGlkbGVSZWFkQnVmZmVyTGltaXRfID0gbGltaXQ7IH0KIAogICAvKioKICAgICogR2V0IHRoZSBtYXhpbXVtIHNpemUgb2Ygd3JpdGUgYnVmZmVyIGFsbG9jYXRlZCB0byBpZGxlIFRDb25uZWN0aW9uIG9iamVjdHMuCiAgICAqCiAgICAqIEByZXR1cm4gIyBieXRlcyBiZXlvbmQgd2hpY2ggd2Ugd2lsbCByZWFsbG9jYXRlIGJ1ZmZlcnMgd2hlbiBjaGVja2VkLgogICAgKi8KLSAgc2l6ZV90IGdldElkbGVXcml0ZUJ1ZmZlckxpbWl0KCkgY29uc3QgewotICAgIHJldHVybiBpZGxlV3JpdGVCdWZmZXJMaW1pdF87Ci0gIH0KKyAgc2l6ZV90IGdldElkbGVXcml0ZUJ1ZmZlckxpbWl0KCkgY29uc3QgeyByZXR1cm4gaWRsZVdyaXRlQnVmZmVyTGltaXRfOyB9CiAKICAgLyoqCiAgICAqIFNldCB0aGUgbWF4aW11bSBzaXplIHdyaXRlIGJ1ZmZlciBhbGxvY2F0ZWQgdG8gaWRsZSBUQ29ubmVjdGlvbiBvYmplY3RzLgpAQCAtNzIyLDI5ICs2NDksMjMgQEAKICAgICoKICAgICogQHBhcmFtIGxpbWl0IG9mIGJ5dGVzIGJleW9uZCB3aGljaCB3ZSB3aWxsIHNocmluayBidWZmZXJzIHdoZW4gaWRsZS4KICAgICovCi0gIHZvaWQgc2V0SWRsZVdyaXRlQnVmZmVyTGltaXQoc2l6ZV90IGxpbWl0KSB7Ci0gICAgaWRsZVdyaXRlQnVmZmVyTGltaXRfID0gbGltaXQ7Ci0gIH0KKyAgdm9pZCBzZXRJZGxlV3JpdGVCdWZmZXJMaW1pdChzaXplX3QgbGltaXQpIHsgaWRsZVdyaXRlQnVmZmVyTGltaXRfID0gbGltaXQ7IH0KIAogICAvKioKICAgICogR2V0ICMgb2YgY2FsbHMgbWFkZSBiZXR3ZWVuIGJ1ZmZlciBzaXplIGNoZWNrcy4gIDAgbWVhbnMgZGlzYWJsZWQuCiAgICAqCiAgICAqIEByZXR1cm4gIyBvZiBjYWxscyBiZXR3ZWVuIGJ1ZmZlciBzaXplIGNoZWNrcy4KICAgICovCi0gIGludDMyX3QgZ2V0UmVzaXplQnVmZmVyRXZlcnlOKCkgY29uc3QgewotICAgIHJldHVybiByZXNpemVCdWZmZXJFdmVyeU5fOwotICB9CisgIGludDMyX3QgZ2V0UmVzaXplQnVmZmVyRXZlcnlOKCkgY29uc3QgeyByZXR1cm4gcmVzaXplQnVmZmVyRXZlcnlOXzsgfQogCiAgIC8qKgogICAgKiBDaGVjayBidWZmZXIgc2l6ZXMgZXZlcnkgImNvdW50IiBjYWxscy4gIFRoaXMgYWxsb3dzIGJ1ZmZlciBsaW1pdHMKLSAgICogdG8gYmUgZW5mb3JjZWQgZm9yIHBlcnNpc3RhbnQgY29ubmVjdGlvbnMgd2l0aCBhIGNvbnRyb2xsYWJsZSBkZWdyZWUKKyAgICogdG8gYmUgZW5mb3JjZWQgZm9yIHBlcnNpc3RlbnQgY29ubmVjdGlvbnMgd2l0aCBhIGNvbnRyb2xsYWJsZSBkZWdyZWUKICAgICogb2Ygb3ZlcmhlYWQuIDAgZGlzYWJsZXMgY2hlY2tzIGV4Y2VwdCBhdCBjb25uZWN0aW9uIGNsb3NlLgogICAgKgogICAgKiBAcGFyYW0gY291bnQgdGhlIG51bWJlciBvZiBjYWxscyBiZXR3ZWVuIGNoZWNrcywgb3IgMCB0byBkaXNhYmxlCiAgICAqLwotICB2b2lkIHNldFJlc2l6ZUJ1ZmZlckV2ZXJ5TihpbnQzMl90IGNvdW50KSB7Ci0gICAgcmVzaXplQnVmZmVyRXZlcnlOXyA9IGNvdW50OwotICB9CisgIHZvaWQgc2V0UmVzaXplQnVmZmVyRXZlcnlOKGludDMyX3QgY291bnQpIHsgcmVzaXplQnVmZmVyRXZlcnlOXyA9IGNvdW50OyB9CiAKICAgLyoqCiAgICAqIE1haW4gd29ya2hvcnNlIGZ1bmN0aW9uLCBzdGFydHMgdXAgdGhlIHNlcnZlciBsaXN0ZW5pbmcgb24gYSBwb3J0IGFuZApAQCAtNzYxLDE0ICs2ODIsNiBAQAogICB2b2lkIGNyZWF0ZUFuZExpc3Rlbk9uU29ja2V0KCk7CiAKICAgLyoqCi0gICAqIFRha2VzIGEgc29ja2V0IGNyZWF0ZWQgYnkgY3JlYXRlQW5kTGlzdGVuT25Tb2NrZXQoKSBhbmQgc2V0cyB2YXJpb3VzCi0gICAqIG9wdGlvbnMgb24gaXQgdG8gcHJlcGFyZSBmb3IgdXNlIGluIHRoZSBzZXJ2ZXIuCi0gICAqCi0gICAqIEBwYXJhbSBmZCBkZXNjcmlwdG9yIG9mIHNvY2tldCB0byBiZSBpbml0aWFsaXplZC8KLSAgICovCi0gIHZvaWQgbGlzdGVuU29ja2V0KFRIUklGVF9TT0NLRVQgZmQpOwotCi0gIC8qKgogICAgKiBSZWdpc3RlciB0aGUgb3B0aW9uYWwgdXNlci1wcm92aWRlZCBldmVudC1iYXNlIChmb3Igc2luZ2xlLXRocmVhZCBzZXJ2ZXJzKQogICAgKgogICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgdXNlZCB3aGVuIHRoZSBzZXJ2ZXIgaXMgcnVubmluZyBpbiBhIHNpbmdsZS10aHJlYWQKQEAgLTc4NCwxNCArNjk3LDE5IEBACiAgICAqLwogICBldmVudF9iYXNlKiBnZXRVc2VyRXZlbnRCYXNlKCkgY29uc3QgeyByZXR1cm4gdXNlckV2ZW50QmFzZV87IH0KIAotIHByaXZhdGU6CisgIC8qKiBTb21lIHRyYW5zcG9ydHMsIGxpa2UgVEhlYWRlclRyYW5zcG9ydCwgcmVxdWlyZSBwYXNzaW5nIHRocm91Z2gKKyAgICogdGhlIGZyYW1pbmcgc2l6ZSBpbnN0ZWFkIG9mIHN0cmlwcGluZyBpdC4KKyAgICovCisgIGJvb2wgZ2V0SGVhZGVyVHJhbnNwb3J0KCk7CisKK3ByaXZhdGU6CiAgIC8qKgogICAgKiBDYWxsYmFjayBmdW5jdGlvbiB0aGF0IHRoZSB0aHJlYWRtYW5hZ2VyIGNhbGxzIHdoZW4gYSB0YXNrIHJlYWNoZXMKICAgICogaXRzIGV4cGlyYXRpb24gdGltZS4gIEl0IGlzIG5lZWRlZCB0byBjbGVhbiB1cCB0aGUgZXhwaXJlZCBjb25uZWN0aW9uLgogICAgKgogICAgKiBAcGFyYW0gdGFzayB0aGUgcnVubmFibGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBleHBpcmVkIHRhc2suCiAgICAqLwotICB2b2lkIGV4cGlyZUNsb3NlKGJvb3N0OjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrKTsKKyAgdm9pZCBleHBpcmVDbG9zZShzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+IHRhc2spOwogCiAgIC8qKgogICAgKiBSZXR1cm4gYW4gaW5pdGlhbGl6ZWQgY29ubmVjdGlvbiBvYmplY3QuICBDcmVhdGVzIG9yIHJlY292ZXJzIGZyb20KQEAgLTgwMyw4ICs3MjEsNyBAQAogICAgKiBAcGFyYW0gYWRkckxlbiB0aGUgbGVuZ3RoIG9mIGFkZHIKICAgICogQHJldHVybiBwb2ludGVyIHRvIGluaXRpYWxpemVkIFRDb25uZWN0aW9uIG9iamVjdC4KICAgICovCi0gIFRDb25uZWN0aW9uKiBjcmVhdGVDb25uZWN0aW9uKFRIUklGVF9TT0NLRVQgc29ja2V0LCBjb25zdCBzb2NrYWRkciogYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2xlbl90IGFkZHJMZW4pOworICBUQ29ubmVjdGlvbiogY3JlYXRlQ29ubmVjdGlvbihzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gc29ja2V0KTsKIAogICAvKioKICAgICogUmV0dXJucyBhIGNvbm5lY3Rpb24gdG8gcG9vbCBvciBkZWxldGlvbi4gIElmIHRoZSBjb25uZWN0aW9uIHBvb2wKQEAgLTgxNyw3ICs3MzQsNyBAQAogfTsKIAogY2xhc3MgVE5vbmJsb2NraW5nSU9UaHJlYWQgOiBwdWJsaWMgUnVubmFibGUgewotIHB1YmxpYzoKK3B1YmxpYzoKICAgLy8gQ3JlYXRlcyBhbiBJTyB0aHJlYWQgYW5kIHNldHMgdXAgdGhlIGV2ZW50IGJhc2UuICBUaGUgbGlzdGVuU29ja2V0IHNob3VsZAogICAvLyBiZSBhIHZhbGlkIEZEIG9uIHdoaWNoIGxpc3RlbigpIGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkLiAgSWYgdGhlCiAgIC8vIGxpc3RlblNvY2tldCBpcyA8IDAsIGFjY2VwdGluZyB3aWxsIG5vdCBiZSBkb25lLgpAQCAtODQ4LDEwICs3NjUsMTAgQEAKICAgZXZ1dGlsX3NvY2tldF90IGdldE5vdGlmaWNhdGlvblJlY3ZGRCgpIGNvbnN0IHsgcmV0dXJuIG5vdGlmaWNhdGlvblBpcGVGRHNfWzBdOyB9CiAKICAgLy8gUmV0dXJucyB0aGUgYWN0dWFsIHRocmVhZCBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgSU8gdGhyZWFkLgotICBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWQ+IGdldFRocmVhZCgpIGNvbnN0IHsgcmV0dXJuIHRocmVhZF87IH0KKyAgc3RkOjpzaGFyZWRfcHRyPFRocmVhZD4gZ2V0VGhyZWFkKCkgY29uc3QgeyByZXR1cm4gdGhyZWFkXzsgfQogCiAgIC8vIFNldHMgdGhlIGFjdHVhbCB0aHJlYWQgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIElPIHRocmVhZC4KLSAgdm9pZCBzZXRUaHJlYWQoY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkPiYgdCkgeyB0aHJlYWRfID0gdDsgfQorICB2b2lkIHNldFRocmVhZChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkPiYgdCkgeyB0aHJlYWRfID0gdDsgfQogCiAgIC8vIFVzZWQgYnkgVENvbm5lY3Rpb24gb2JqZWN0cyB0byBpbmRpY2F0ZSBwcm9jZXNzaW5nIGhhcyBmaW5pc2hlZC4KICAgYm9vbCBub3RpZnkoVE5vbmJsb2NraW5nU2VydmVyOjpUQ29ubmVjdGlvbiogY29ubik7CkBAIC04NjgsNyArNzg1LDcgQEAKICAgLy8vIFJlZ2lzdGVycyB0aGUgZXZlbnRzIGZvciB0aGUgbm90aWZpY2F0aW9uICYgbGlzdGVuIHNvY2tldHMKICAgdm9pZCByZWdpc3RlckV2ZW50cygpOwogCi0gcHJpdmF0ZToKK3ByaXZhdGU6CiAgIC8qKgogICAgKiBDLWNhbGxhYmxlIGV2ZW50IGhhbmRsZXIgZm9yIHNpZ25hbGluZyB0YXNrIGNvbXBsZXRpb24uICBQcm92aWRlcyBhCiAgICAqIGNhbGxiYWNrIHRoYXQgbGliZXZlbnQgY2FuIHVuZGVyc3RhbmQgdGhhdCB3aWxsIHJlYWQgYSBjb25uZWN0aW9uCkBAIC04ODMsNyArODAwLDcgQEAKICAgICogQy1jYWxsYWJsZSBldmVudCBoYW5kbGVyIGZvciBsaXN0ZW5lciBldmVudHMuICBQcm92aWRlcyBhIGNhbGxiYWNrCiAgICAqIHRoYXQgbGliZXZlbnQgY2FuIHVuZGVyc3RhbmQgd2hpY2ggaW52b2tlcyBzZXJ2ZXItPmhhbmRsZUV2ZW50KCkuCiAgICAqCi0gICAqIEBwYXJhbSBmZCB0aGUgZGVzY3JpcHRvciB0aGUgZXZlbnQgb2NjdXJlZCBvbi4KKyAgICogQHBhcmFtIGZkIHRoZSBkZXNjcmlwdG9yIHRoZSBldmVudCBvY2N1cnJlZCBvbi4KICAgICogQHBhcmFtIHdoaWNoIHRoZSBmbGFncyBhc3NvY2lhdGVkIHdpdGggdGhlIGV2ZW50LgogICAgKiBAcGFyYW0gdiB2b2lkKiBjYWxsYmFjayBhcmcgd2hlcmUgd2UgcGxhY2VkIFROb25ibG9ja2luZ1NlcnZlcidzICJ0aGlzIi4KICAgICovCkBAIC05MDMsNyArODIwLDcgQEAKICAgLy8vIFNldHMgKG9yIGNsZWFycykgaGlnaCBwcmlvcml0eSBzY2hlZHVsaW5nIHN0YXR1cyBmb3IgdGhlIGN1cnJlbnQgdGhyZWFkLgogICB2b2lkIHNldEN1cnJlbnRUaHJlYWRIaWdoUHJpb3JpdHkoYm9vbCB2YWx1ZSk7CiAKLSBwcml2YXRlOgorcHJpdmF0ZToKICAgLy8vIGFzc29jaWF0ZWQgc2VydmVyCiAgIFROb25ibG9ja2luZ1NlcnZlciogc2VydmVyXzsKIApAQCAtOTMyLDEzICs4NDksMTQgQEAKICAgLy8vIFVzZWQgd2l0aCBldmVudEJhc2VfIGZvciB0YXNrIGNvbXBsZXRpb24gbm90aWZpY2F0aW9uCiAgIHN0cnVjdCBldmVudCBub3RpZmljYXRpb25FdmVudF87CiAKLSAvLy8gRmlsZSBkZXNjcmlwdG9ycyBmb3IgcGlwZSB1c2VkIGZvciB0YXNrIGNvbXBsZXRpb24gbm90aWZpY2F0aW9uLgorICAvLy8gRmlsZSBkZXNjcmlwdG9ycyBmb3IgcGlwZSB1c2VkIGZvciB0YXNrIGNvbXBsZXRpb24gbm90aWZpY2F0aW9uLgogICBldnV0aWxfc29ja2V0X3Qgbm90aWZpY2F0aW9uUGlwZUZEc19bMl07CiAKICAgLy8vIEFjdHVhbCBJTyBUaHJlYWQKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkPiB0aHJlYWRfOworICBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkPiB0aHJlYWRfOwogfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXIKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcgogCiAjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1NFUlZFUl9UTk9OQkxPQ0tJTkdTRVJWRVJfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFNlcnZlci5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RTZXJ2ZXIuY3BwCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggNWU4MmNlNi4uZGY3MzFjMgotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RTZXJ2ZXIuY3BwCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFNlcnZlci5jcHAKQEAgLTMwLDIwICszMCwyMyBAQAogI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2VuZGlmCiAKLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHNlcnZlciB7CituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHNlcnZlciB7CiAKICNpZmRlZiBIQVZFX1NZU19SRVNPVVJDRV9ICi1pbnQgaW5jcmVhc2VfbWF4X2ZkcyhpbnQgbWF4X2Zkcz0oMTw8MjQpKSAgeworaW50IGluY3JlYXNlX21heF9mZHMoaW50IG1heF9mZHMgPSAoMSA8PCAyNCkpIHsKICAgc3RydWN0IHJsaW1pdCBmZG1heHJsOwogCi0gIGZvcihmZG1heHJsLnJsaW1fY3VyID0gbWF4X2ZkcywgZmRtYXhybC5ybGltX21heCA9IG1heF9mZHM7Ci0gICAgICBtYXhfZmRzICYmIChzZXRybGltaXQoUkxJTUlUX05PRklMRSwgJmZkbWF4cmwpIDwgMCk7Ci0gICAgICBmZG1heHJsLnJsaW1fY3VyID0gbWF4X2ZkcywgZmRtYXhybC5ybGltX21heCA9IG1heF9mZHMpIHsKKyAgZm9yIChmZG1heHJsLnJsaW1fY3VyID0gbWF4X2ZkcywgZmRtYXhybC5ybGltX21heCA9IG1heF9mZHM7CisgICAgICAgbWF4X2ZkcyAmJiAoc2V0cmxpbWl0KFJMSU1JVF9OT0ZJTEUsICZmZG1heHJsKSA8IDApOworICAgICAgIGZkbWF4cmwucmxpbV9jdXIgPSBtYXhfZmRzLCBmZG1heHJsLnJsaW1fbWF4ID0gbWF4X2ZkcykgewogICAgIG1heF9mZHMgLz0gMjsKICAgfQogCiAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KGZkbWF4cmwucmxpbV9jdXIpOwogfQogI2VuZGlmCi0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6c2VydmVyCit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXIKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFNlcnZlci5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UU2VydmVyLmgKaW5kZXggN2Y3MThkYS4uM2M2ZDgxOCAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UU2VydmVyLmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UU2VydmVyLmgKQEAgLTI1LDkgKzI1LDExIEBACiAjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPgogI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9UaHJlYWQuaD4KIAotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgorI2luY2x1ZGUgPG1lbW9yeT4KIAotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2Ugc2VydmVyIHsKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2Ugc2VydmVyIHsKIAogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3I7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRCaW5hcnlQcm90b2NvbEZhY3Rvcnk7CkBAIC00NSw4ICs0Nyw3IEBACiAgKiBpbnN0YW5jZSdzIHN0YXRlKS4KICAqLwogY2xhc3MgVFNlcnZlckV2ZW50SGFuZGxlciB7Ci0gcHVibGljOgotCitwdWJsaWM6CiAgIHZpcnR1YWwgflRTZXJ2ZXJFdmVudEhhbmRsZXIoKSB7fQogCiAgIC8qKgpAQCAtNTcsOCArNTgsOCBAQAogICAvKioKICAgICogQ2FsbGVkIHdoZW4gYSBuZXcgY2xpZW50IGhhcyBjb25uZWN0ZWQgYW5kIGlzIGFib3V0IHRvIGJlaW5nIHByb2Nlc3NpbmcuCiAgICAqLwotICB2aXJ0dWFsIHZvaWQqIGNyZWF0ZUNvbnRleHQoYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gb3V0cHV0KSB7CisgIHZpcnR1YWwgdm9pZCogY3JlYXRlQ29udGV4dChzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IG91dHB1dCkgewogICAgICh2b2lkKWlucHV0OwogICAgICh2b2lkKW91dHB1dDsKICAgICByZXR1cm4gTlVMTDsKQEAgLTY5LDggKzcwLDggQEAKICAgICogY29udGV4dC4KICAgICovCiAgIHZpcnR1YWwgdm9pZCBkZWxldGVDb250ZXh0KHZvaWQqIHNlcnZlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD5pbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPm91dHB1dCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gb3V0cHV0KSB7CiAgICAgKHZvaWQpc2VydmVyQ29udGV4dDsKICAgICAodm9pZClpbnB1dDsKICAgICAodm9pZClvdXRwdXQ7CkBAIC03OSwxOSArODAsMTYgQEAKICAgLyoqCiAgICAqIENhbGxlZCB3aGVuIGEgY2xpZW50IGlzIGFib3V0IHRvIGNhbGwgdGhlIHByb2Nlc3Nvci4KICAgICovCi0gIHZpcnR1YWwgdm9pZCBwcm9jZXNzQ29udGV4dCh2b2lkKiBzZXJ2ZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0KSB7CisgIHZpcnR1YWwgdm9pZCBwcm9jZXNzQ29udGV4dCh2b2lkKiBzZXJ2ZXJDb250ZXh0LCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0KSB7CiAgICAgKHZvaWQpc2VydmVyQ29udGV4dDsKICAgICAodm9pZCl0cmFuc3BvcnQ7Ci19CisgIH0KIAotIHByb3RlY3RlZDoKLQorcHJvdGVjdGVkOgogICAvKioKICAgICogUHJldmVudCBkaXJlY3QgaW5zdGFudGlhdGlvbi4KICAgICovCiAgIFRTZXJ2ZXJFdmVudEhhbmRsZXIoKSB7fQotCiB9OwogCiAvKioKQEAgLTk5LDggKzk3LDcgQEAKICAqCiAgKi8KIGNsYXNzIFRTZXJ2ZXIgOiBwdWJsaWMgY29uY3VycmVuY3k6OlJ1bm5hYmxlIHsKLSBwdWJsaWM6Ci0KK3B1YmxpYzoKICAgdmlydHVhbCB+VFNlcnZlcigpIHt9CiAKICAgdmlydHVhbCB2b2lkIHNlcnZlKCkgPSAwOwpAQCAtMTA4LDE0NiArMTA1LDEwNyBAQAogICB2aXJ0dWFsIHZvaWQgc3RvcCgpIHt9CiAKICAgLy8gQWxsb3dzIHJ1bm5pbmcgdGhlIHNlcnZlciBhcyBhIFJ1bm5hYmxlIHRocmVhZAotICB2aXJ0dWFsIHZvaWQgcnVuKCkgewotICAgIHNlcnZlKCk7Ci0gIH0KKyAgdmlydHVhbCB2b2lkIHJ1bigpIHsgc2VydmUoKTsgfQogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3JGYWN0b3J5PiBnZXRQcm9jZXNzb3JGYWN0b3J5KCkgewotICAgIHJldHVybiBwcm9jZXNzb3JGYWN0b3J5XzsKLSAgfQorICBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3NvckZhY3Rvcnk+IGdldFByb2Nlc3NvckZhY3RvcnkoKSB7IHJldHVybiBwcm9jZXNzb3JGYWN0b3J5XzsgfQogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+IGdldFNlcnZlclRyYW5zcG9ydCgpIHsKLSAgICByZXR1cm4gc2VydmVyVHJhbnNwb3J0XzsKLSAgfQorICBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4gZ2V0U2VydmVyVHJhbnNwb3J0KCkgeyByZXR1cm4gc2VydmVyVHJhbnNwb3J0XzsgfQogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiBnZXRJbnB1dFRyYW5zcG9ydEZhY3RvcnkoKSB7Ci0gICAgcmV0dXJuIGlucHV0VHJhbnNwb3J0RmFjdG9yeV87Ci0gIH0KKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiBnZXRJbnB1dFRyYW5zcG9ydEZhY3RvcnkoKSB7IHJldHVybiBpbnB1dFRyYW5zcG9ydEZhY3RvcnlfOyB9CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IGdldE91dHB1dFRyYW5zcG9ydEZhY3RvcnkoKSB7CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gZ2V0T3V0cHV0VHJhbnNwb3J0RmFjdG9yeSgpIHsKICAgICByZXR1cm4gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeV87CiAgIH0KIAotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBnZXRJbnB1dFByb3RvY29sRmFjdG9yeSgpIHsKLSAgICByZXR1cm4gaW5wdXRQcm90b2NvbEZhY3RvcnlfOwotICB9CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBnZXRJbnB1dFByb3RvY29sRmFjdG9yeSgpIHsgcmV0dXJuIGlucHV0UHJvdG9jb2xGYWN0b3J5XzsgfQogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IGdldE91dHB1dFByb3RvY29sRmFjdG9yeSgpIHsKLSAgICByZXR1cm4gb3V0cHV0UHJvdG9jb2xGYWN0b3J5XzsKLSAgfQorICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gZ2V0T3V0cHV0UHJvdG9jb2xGYWN0b3J5KCkgeyByZXR1cm4gb3V0cHV0UHJvdG9jb2xGYWN0b3J5XzsgfQogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJFdmVudEhhbmRsZXI+IGdldEV2ZW50SGFuZGxlcigpIHsKLSAgICByZXR1cm4gZXZlbnRIYW5kbGVyXzsKLSAgfQorICBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlckV2ZW50SGFuZGxlcj4gZ2V0RXZlbnRIYW5kbGVyKCkgeyByZXR1cm4gZXZlbnRIYW5kbGVyXzsgfQogCiBwcm90ZWN0ZWQ6Ci0gIHRlbXBsYXRlPHR5cGVuYW1lIFByb2Nlc3NvckZhY3Rvcnk+Ci0gIFRTZXJ2ZXIoY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8UHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCi0gICAgICAgICAgVEhSSUZUX09WRVJMT0FEX0lGKFByb2Nlc3NvckZhY3RvcnksIFRQcm9jZXNzb3JGYWN0b3J5KSk6Ci0gICAgcHJvY2Vzc29yRmFjdG9yeV8ocHJvY2Vzc29yRmFjdG9yeSkgewotICAgIHNldElucHV0VHJhbnNwb3J0RmFjdG9yeShib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4oCi0gICAgICAgICAgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCkpKTsKLSAgICBzZXRPdXRwdXRUcmFuc3BvcnRGYWN0b3J5KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PigKLSAgICAgICAgICBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSkpOwotICAgIHNldElucHV0UHJvdG9jb2xGYWN0b3J5KGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+KAotICAgICAgICAgIG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpKTsKLSAgICBzZXRPdXRwdXRQcm90b2NvbEZhY3RvcnkoYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4oCi0gICAgICAgICAgbmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSkpOworICBUU2VydmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnkpCisgICAgOiBwcm9jZXNzb3JGYWN0b3J5Xyhwcm9jZXNzb3JGYWN0b3J5KSB7CisgICAgc2V0SW5wdXRUcmFuc3BvcnRGYWN0b3J5KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4obmV3IFRUcmFuc3BvcnRGYWN0b3J5KCkpKTsKKyAgICBzZXRPdXRwdXRUcmFuc3BvcnRGYWN0b3J5KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4obmV3IFRUcmFuc3BvcnRGYWN0b3J5KCkpKTsKKyAgICBzZXRJbnB1dFByb3RvY29sRmFjdG9yeShzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4obmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSkpOworICAgIHNldE91dHB1dFByb3RvY29sRmFjdG9yeShzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4obmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSkpOwogICB9CiAKLSAgdGVtcGxhdGU8dHlwZW5hbWUgUHJvY2Vzc29yPgotICBUU2VydmVyKGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKLSAgICAgICAgICBUSFJJRlRfT1ZFUkxPQURfSUYoUHJvY2Vzc29yLCBUUHJvY2Vzc29yKSk6Ci0gICAgcHJvY2Vzc29yRmFjdG9yeV8obmV3IFRTaW5nbGV0b25Qcm9jZXNzb3JGYWN0b3J5KHByb2Nlc3NvcikpIHsKLSAgICBzZXRJbnB1dFRyYW5zcG9ydEZhY3RvcnkoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+KG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpKSk7Ci0gICAgc2V0T3V0cHV0VHJhbnNwb3J0RmFjdG9yeShib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4obmV3IFRUcmFuc3BvcnRGYWN0b3J5KCkpKTsKLSAgICBzZXRJbnB1dFByb3RvY29sRmFjdG9yeShib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PihuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKSk7Ci0gICAgc2V0T3V0cHV0UHJvdG9jb2xGYWN0b3J5KGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpKTsKKyAgVFNlcnZlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4mIHByb2Nlc3NvcikKKyAgICA6IHByb2Nlc3NvckZhY3RvcnlfKG5ldyBUU2luZ2xldG9uUHJvY2Vzc29yRmFjdG9yeShwcm9jZXNzb3IpKSB7CisgICAgc2V0SW5wdXRUcmFuc3BvcnRGYWN0b3J5KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4obmV3IFRUcmFuc3BvcnRGYWN0b3J5KCkpKTsKKyAgICBzZXRPdXRwdXRUcmFuc3BvcnRGYWN0b3J5KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4obmV3IFRUcmFuc3BvcnRGYWN0b3J5KCkpKTsKKyAgICBzZXRJbnB1dFByb3RvY29sRmFjdG9yeShzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4obmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSkpOworICAgIHNldE91dHB1dFByb3RvY29sRmFjdG9yeShzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4obmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSkpOwogICB9CiAKLSAgdGVtcGxhdGU8dHlwZW5hbWUgUHJvY2Vzc29yRmFjdG9yeT4KLSAgVFNlcnZlcihjb25zdCBib29zdDo6c2hhcmVkX3B0cjxQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwKLSAgICAgICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgIFRIUklGVF9PVkVSTE9BRF9JRihQcm9jZXNzb3JGYWN0b3J5LCBUUHJvY2Vzc29yRmFjdG9yeSkpOgotICAgIHByb2Nlc3NvckZhY3RvcnlfKHByb2Nlc3NvckZhY3RvcnkpLAotICAgIHNlcnZlclRyYW5zcG9ydF8oc2VydmVyVHJhbnNwb3J0KSB7Ci0gICAgc2V0SW5wdXRUcmFuc3BvcnRGYWN0b3J5KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PigKLSAgICAgICAgICBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSkpOwotICAgIHNldE91dHB1dFRyYW5zcG9ydEZhY3RvcnkoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+KAotICAgICAgICAgIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpKSk7Ci0gICAgc2V0SW5wdXRQcm90b2NvbEZhY3RvcnkoYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4oCi0gICAgICAgICAgbmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSkpOwotICAgIHNldE91dHB1dFByb3RvY29sRmFjdG9yeShib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PigKLSAgICAgICAgICBuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKSk7CisgIFRTZXJ2ZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCkKKyAgICA6IHByb2Nlc3NvckZhY3RvcnlfKHByb2Nlc3NvckZhY3RvcnkpLCBzZXJ2ZXJUcmFuc3BvcnRfKHNlcnZlclRyYW5zcG9ydCkgeworICAgIHNldElucHV0VHJhbnNwb3J0RmFjdG9yeShzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+KG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpKSk7CisgICAgc2V0T3V0cHV0VHJhbnNwb3J0RmFjdG9yeShzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+KG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpKSk7CisgICAgc2V0SW5wdXRQcm90b2NvbEZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpKTsKKyAgICBzZXRPdXRwdXRQcm90b2NvbEZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpKTsKICAgfQogCi0gIHRlbXBsYXRlPHR5cGVuYW1lIFByb2Nlc3Nvcj4KLSAgVFNlcnZlcihjb25zdCBib29zdDo6c2hhcmVkX3B0cjxQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCi0gICAgICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgICBUSFJJRlRfT1ZFUkxPQURfSUYoUHJvY2Vzc29yLCBUUHJvY2Vzc29yKSk6Ci0gICAgcHJvY2Vzc29yRmFjdG9yeV8obmV3IFRTaW5nbGV0b25Qcm9jZXNzb3JGYWN0b3J5KHByb2Nlc3NvcikpLAotICAgIHNlcnZlclRyYW5zcG9ydF8oc2VydmVyVHJhbnNwb3J0KSB7Ci0gICAgc2V0SW5wdXRUcmFuc3BvcnRGYWN0b3J5KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PihuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSkpOwotICAgIHNldE91dHB1dFRyYW5zcG9ydEZhY3RvcnkoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+KG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpKSk7Ci0gICAgc2V0SW5wdXRQcm90b2NvbEZhY3RvcnkoYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4obmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSkpOwotICAgIHNldE91dHB1dFByb3RvY29sRmFjdG9yeShib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PihuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKSk7CisgIFRTZXJ2ZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCisgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQpCisgICAgOiBwcm9jZXNzb3JGYWN0b3J5XyhuZXcgVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkocHJvY2Vzc29yKSksCisgICAgICBzZXJ2ZXJUcmFuc3BvcnRfKHNlcnZlclRyYW5zcG9ydCkgeworICAgIHNldElucHV0VHJhbnNwb3J0RmFjdG9yeShzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+KG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpKSk7CisgICAgc2V0T3V0cHV0VHJhbnNwb3J0RmFjdG9yeShzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+KG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpKSk7CisgICAgc2V0SW5wdXRQcm90b2NvbEZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpKTsKKyAgICBzZXRPdXRwdXRQcm90b2NvbEZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpKTsKICAgfQogCi0gIHRlbXBsYXRlPHR5cGVuYW1lIFByb2Nlc3NvckZhY3Rvcnk+Ci0gIFRTZXJ2ZXIoY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8UHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCi0gICAgICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICBUSFJJRlRfT1ZFUkxPQURfSUYoUHJvY2Vzc29yRmFjdG9yeSwgVFByb2Nlc3NvckZhY3RvcnkpKToKLSAgICBwcm9jZXNzb3JGYWN0b3J5Xyhwcm9jZXNzb3JGYWN0b3J5KSwKLSAgICBzZXJ2ZXJUcmFuc3BvcnRfKHNlcnZlclRyYW5zcG9ydCksCi0gICAgaW5wdXRUcmFuc3BvcnRGYWN0b3J5Xyh0cmFuc3BvcnRGYWN0b3J5KSwKLSAgICBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5Xyh0cmFuc3BvcnRGYWN0b3J5KSwKLSAgICBpbnB1dFByb3RvY29sRmFjdG9yeV8ocHJvdG9jb2xGYWN0b3J5KSwKLSAgICBvdXRwdXRQcm90b2NvbEZhY3RvcnlfKHByb3RvY29sRmFjdG9yeSkge30KKyAgVFNlcnZlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnkpCisgICAgOiBwcm9jZXNzb3JGYWN0b3J5Xyhwcm9jZXNzb3JGYWN0b3J5KSwKKyAgICAgIHNlcnZlclRyYW5zcG9ydF8oc2VydmVyVHJhbnNwb3J0KSwKKyAgICAgIGlucHV0VHJhbnNwb3J0RmFjdG9yeV8odHJhbnNwb3J0RmFjdG9yeSksCisgICAgICBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5Xyh0cmFuc3BvcnRGYWN0b3J5KSwKKyAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5Xyhwcm90b2NvbEZhY3RvcnkpLAorICAgICAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5Xyhwcm90b2NvbEZhY3RvcnkpIHt9CiAKLSAgdGVtcGxhdGU8dHlwZW5hbWUgUHJvY2Vzc29yPgotICBUU2VydmVyKGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKLSAgICAgICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgIFRIUklGVF9PVkVSTE9BRF9JRihQcm9jZXNzb3IsIFRQcm9jZXNzb3IpKToKLSAgICBwcm9jZXNzb3JGYWN0b3J5XyhuZXcgVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkocHJvY2Vzc29yKSksCi0gICAgc2VydmVyVHJhbnNwb3J0XyhzZXJ2ZXJUcmFuc3BvcnQpLAotICAgIGlucHV0VHJhbnNwb3J0RmFjdG9yeV8odHJhbnNwb3J0RmFjdG9yeSksCi0gICAgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeV8odHJhbnNwb3J0RmFjdG9yeSksCi0gICAgaW5wdXRQcm90b2NvbEZhY3RvcnlfKHByb3RvY29sRmFjdG9yeSksCi0gICAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5Xyhwcm90b2NvbEZhY3RvcnkpIHt9CisgIFRTZXJ2ZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCisgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSkKKyAgICA6IHByb2Nlc3NvckZhY3RvcnlfKG5ldyBUU2luZ2xldG9uUHJvY2Vzc29yRmFjdG9yeShwcm9jZXNzb3IpKSwKKyAgICAgIHNlcnZlclRyYW5zcG9ydF8oc2VydmVyVHJhbnNwb3J0KSwKKyAgICAgIGlucHV0VHJhbnNwb3J0RmFjdG9yeV8odHJhbnNwb3J0RmFjdG9yeSksCisgICAgICBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5Xyh0cmFuc3BvcnRGYWN0b3J5KSwKKyAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5Xyhwcm90b2NvbEZhY3RvcnkpLAorICAgICAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5Xyhwcm90b2NvbEZhY3RvcnkpIHt9CiAKLSAgdGVtcGxhdGU8dHlwZW5hbWUgUHJvY2Vzc29yRmFjdG9yeT4KLSAgVFNlcnZlcihjb25zdCBib29zdDo6c2hhcmVkX3B0cjxQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwKLSAgICAgICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgaW5wdXRQcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIG91dHB1dFByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICBUSFJJRlRfT1ZFUkxPQURfSUYoUHJvY2Vzc29yRmFjdG9yeSwgVFByb2Nlc3NvckZhY3RvcnkpKToKLSAgICBwcm9jZXNzb3JGYWN0b3J5Xyhwcm9jZXNzb3JGYWN0b3J5KSwKLSAgICBzZXJ2ZXJUcmFuc3BvcnRfKHNlcnZlclRyYW5zcG9ydCksCi0gICAgaW5wdXRUcmFuc3BvcnRGYWN0b3J5XyhpbnB1dFRyYW5zcG9ydEZhY3RvcnkpLAotICAgIG91dHB1dFRyYW5zcG9ydEZhY3RvcnlfKG91dHB1dFRyYW5zcG9ydEZhY3RvcnkpLAotICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5XyhpbnB1dFByb3RvY29sRmFjdG9yeSksCi0gICAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5XyhvdXRwdXRQcm90b2NvbEZhY3RvcnkpIHt9CisgIFRTZXJ2ZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KQorICAgIDogcHJvY2Vzc29yRmFjdG9yeV8ocHJvY2Vzc29yRmFjdG9yeSksCisgICAgICBzZXJ2ZXJUcmFuc3BvcnRfKHNlcnZlclRyYW5zcG9ydCksCisgICAgICBpbnB1dFRyYW5zcG9ydEZhY3RvcnlfKGlucHV0VHJhbnNwb3J0RmFjdG9yeSksCisgICAgICBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5XyhvdXRwdXRUcmFuc3BvcnRGYWN0b3J5KSwKKyAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5XyhpbnB1dFByb3RvY29sRmFjdG9yeSksCisgICAgICBvdXRwdXRQcm90b2NvbEZhY3RvcnlfKG91dHB1dFByb3RvY29sRmFjdG9yeSkge30KIAotICB0ZW1wbGF0ZTx0eXBlbmFtZSBQcm9jZXNzb3I+Ci0gIFRTZXJ2ZXIoY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8UHJvY2Vzc29yPiYgcHJvY2Vzc29yLAotICAgICAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBpbnB1dFByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgIFRIUklGVF9PVkVSTE9BRF9JRihQcm9jZXNzb3IsIFRQcm9jZXNzb3IpKToKLSAgICBwcm9jZXNzb3JGYWN0b3J5XyhuZXcgVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkocHJvY2Vzc29yKSksCi0gICAgc2VydmVyVHJhbnNwb3J0XyhzZXJ2ZXJUcmFuc3BvcnQpLAotICAgIGlucHV0VHJhbnNwb3J0RmFjdG9yeV8oaW5wdXRUcmFuc3BvcnRGYWN0b3J5KSwKLSAgICBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5XyhvdXRwdXRUcmFuc3BvcnRGYWN0b3J5KSwKLSAgICBpbnB1dFByb3RvY29sRmFjdG9yeV8oaW5wdXRQcm90b2NvbEZhY3RvcnkpLAotICAgIG91dHB1dFByb3RvY29sRmFjdG9yeV8ob3V0cHV0UHJvdG9jb2xGYWN0b3J5KSB7fQorICBUU2VydmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAorICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBvdXRwdXRQcm90b2NvbEZhY3RvcnkpCisgICAgOiBwcm9jZXNzb3JGYWN0b3J5XyhuZXcgVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkocHJvY2Vzc29yKSksCisgICAgICBzZXJ2ZXJUcmFuc3BvcnRfKHNlcnZlclRyYW5zcG9ydCksCisgICAgICBpbnB1dFRyYW5zcG9ydEZhY3RvcnlfKGlucHV0VHJhbnNwb3J0RmFjdG9yeSksCisgICAgICBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5XyhvdXRwdXRUcmFuc3BvcnRGYWN0b3J5KSwKKyAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5XyhpbnB1dFByb3RvY29sRmFjdG9yeSksCisgICAgICBvdXRwdXRQcm90b2NvbEZhY3RvcnlfKG91dHB1dFByb3RvY29sRmFjdG9yeSkge30KIAogICAvKioKICAgICogR2V0IGEgVFByb2Nlc3NvciB0byBoYW5kbGUgY2FsbHMgb24gYSBwYXJ0aWN1bGFyIGNvbm5lY3Rpb24uCkBAIC0yNTYsMTAgKzIxNCw5IEBACiAgICAqIGNhbGwpLiAgVGhpcyBhbGxvd3MgdGhlIFRQcm9jZXNzb3JGYWN0b3J5IHRvIHJldHVybiBhIGRpZmZlcmVudCBwcm9jZXNzb3IKICAgICogZm9yIGVhY2ggY29ubmVjdGlvbiBpZiBpdCBkZXNpcmVzLgogICAgKi8KLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gZ2V0UHJvY2Vzc29yKAotICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBpbnB1dFByb3RvY29sLAotICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBvdXRwdXRQcm90b2NvbCwKLSAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCkgeworICBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gZ2V0UHJvY2Vzc29yKHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGlucHV0UHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBvdXRwdXRQcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQpIHsKICAgICBUQ29ubmVjdGlvbkluZm8gY29ubkluZm87CiAgICAgY29ubkluZm8uaW5wdXQgPSBpbnB1dFByb3RvY29sOwogICAgIGNvbm5JbmZvLm91dHB1dCA9IG91dHB1dFByb3RvY29sOwpAQCAtMjY4LDM4ICsyMjUsMzcgQEAKICAgfQogCiAgIC8vIENsYXNzIHZhcmlhYmxlcwotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yRmFjdG9yeT4gcHJvY2Vzc29yRmFjdG9yeV87Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+IHNlcnZlclRyYW5zcG9ydF87CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yRmFjdG9yeT4gcHJvY2Vzc29yRmFjdG9yeV87CisgIHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiBzZXJ2ZXJUcmFuc3BvcnRfOwogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiBpbnB1dFRyYW5zcG9ydEZhY3RvcnlfOwotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeV87CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gaW5wdXRUcmFuc3BvcnRGYWN0b3J5XzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5XzsKIAotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBpbnB1dFByb3RvY29sRmFjdG9yeV87Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IG91dHB1dFByb3RvY29sRmFjdG9yeV87CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBpbnB1dFByb3RvY29sRmFjdG9yeV87CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBvdXRwdXRQcm90b2NvbEZhY3RvcnlfOwogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJFdmVudEhhbmRsZXI+IGV2ZW50SGFuZGxlcl87CisgIHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyRXZlbnRIYW5kbGVyPiBldmVudEhhbmRsZXJfOwogCiBwdWJsaWM6Ci0gIHZvaWQgc2V0SW5wdXRUcmFuc3BvcnRGYWN0b3J5KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiBpbnB1dFRyYW5zcG9ydEZhY3RvcnkpIHsKKyAgdm9pZCBzZXRJbnB1dFRyYW5zcG9ydEZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiBpbnB1dFRyYW5zcG9ydEZhY3RvcnkpIHsKICAgICBpbnB1dFRyYW5zcG9ydEZhY3RvcnlfID0gaW5wdXRUcmFuc3BvcnRGYWN0b3J5OwogICB9CiAKLSAgdm9pZCBzZXRPdXRwdXRUcmFuc3BvcnRGYWN0b3J5KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5KSB7CisgIHZvaWQgc2V0T3V0cHV0VHJhbnNwb3J0RmFjdG9yeShzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IG91dHB1dFRyYW5zcG9ydEZhY3RvcnkpIHsKICAgICBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5XyA9IG91dHB1dFRyYW5zcG9ydEZhY3Rvcnk7CiAgIH0KIAotICB2b2lkIHNldElucHV0UHJvdG9jb2xGYWN0b3J5KGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IGlucHV0UHJvdG9jb2xGYWN0b3J5KSB7CisgIHZvaWQgc2V0SW5wdXRQcm90b2NvbEZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IGlucHV0UHJvdG9jb2xGYWN0b3J5KSB7CiAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnlfID0gaW5wdXRQcm90b2NvbEZhY3Rvcnk7CiAgIH0KIAotICB2b2lkIHNldE91dHB1dFByb3RvY29sRmFjdG9yeShib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBvdXRwdXRQcm90b2NvbEZhY3RvcnkpIHsKKyAgdm9pZCBzZXRPdXRwdXRQcm90b2NvbEZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IG91dHB1dFByb3RvY29sRmFjdG9yeSkgewogICAgIG91dHB1dFByb3RvY29sRmFjdG9yeV8gPSBvdXRwdXRQcm90b2NvbEZhY3Rvcnk7CiAgIH0KIAotICB2b2lkIHNldFNlcnZlckV2ZW50SGFuZGxlcihib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyRXZlbnRIYW5kbGVyPiBldmVudEhhbmRsZXIpIHsKKyAgdm9pZCBzZXRTZXJ2ZXJFdmVudEhhbmRsZXIoc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXJFdmVudEhhbmRsZXI+IGV2ZW50SGFuZGxlcikgewogICAgIGV2ZW50SGFuZGxlcl8gPSBldmVudEhhbmRsZXI7CiAgIH0KLQogfTsKIAogLyoqCkBAIC0zMDgsOSArMjY0LDEwIEBACiAgKiBCeSBkZWZhdWx0LCB0cmllcyB0byBpbmNyZWFzZSBpdCB0byBhcyBtdWNoIGFzIDJeMjQuCiAgKi8KICNpZmRlZiBIQVZFX1NZU19SRVNPVVJDRV9ICi0gaW50IGluY3JlYXNlX21heF9mZHMoaW50IG1heF9mZHM9KDE8PDI0KSk7CitpbnQgaW5jcmVhc2VfbWF4X2ZkcyhpbnQgbWF4X2ZkcyA9ICgxIDw8IDI0KSk7CiAjZW5kaWYKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXIKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcgogCiAjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1NFUlZFUl9UU0VSVkVSX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RTZXJ2ZXJGcmFtZXdvcmsuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UU2VydmVyRnJhbWV3b3JrLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmVhYTI0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UU2VydmVyRnJhbWV3b3JrLmNwcApAQCAtMCwwICsxLDI0NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RTZXJ2ZXJGcmFtZXdvcmsuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBzZXJ2ZXIgeworCit1c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlN5bmNocm9uaXplZDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5OwordXNpbmcgc3RkOjpiaW5kOwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk7Cit1c2luZyBzdGQ6OnN0cmluZzsKKworVFNlcnZlckZyYW1ld29yazo6VFNlcnZlckZyYW1ld29yayhjb25zdCBzaGFyZWRfcHRyPFRQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5KQorICA6IFRTZXJ2ZXIocHJvY2Vzc29yRmFjdG9yeSwgc2VydmVyVHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpLAorICAgIGNsaWVudHNfKDApLAorICAgIGh3bV8oMCksCisgICAgbGltaXRfKElOVDY0X01BWCkgeworfQorCitUU2VydmVyRnJhbWV3b3JrOjpUU2VydmVyRnJhbWV3b3JrKGNvbnN0IHNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5KQorICA6IFRTZXJ2ZXIocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSksCisgICAgY2xpZW50c18oMCksCisgICAgaHdtXygwKSwKKyAgICBsaW1pdF8oSU5UNjRfTUFYKSB7Cit9CisKK1RTZXJ2ZXJGcmFtZXdvcms6OlRTZXJ2ZXJGcmFtZXdvcmsoY29uc3Qgc2hhcmVkX3B0cjxUUHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBvdXRwdXRQcm90b2NvbEZhY3RvcnkpCisgIDogVFNlcnZlcihwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KSwKKyAgICBjbGllbnRzXygwKSwKKyAgICBod21fKDApLAorICAgIGxpbWl0XyhJTlQ2NF9NQVgpIHsKK30KKworVFNlcnZlckZyYW1ld29yazo6VFNlcnZlckZyYW1ld29yayhjb25zdCBzaGFyZWRfcHRyPFRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBvdXRwdXRQcm90b2NvbEZhY3RvcnkpCisgIDogVFNlcnZlcihwcm9jZXNzb3IsCisgICAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICBvdXRwdXRQcm90b2NvbEZhY3RvcnkpLAorICAgIGNsaWVudHNfKDApLAorICAgIGh3bV8oMCksCisgICAgbGltaXRfKElOVDY0X01BWCkgeworfQorCitUU2VydmVyRnJhbWV3b3JrOjp+VFNlcnZlckZyYW1ld29yaygpIHsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdGF0aWMgdm9pZCByZWxlYXNlT25lRGVzY3JpcHRvcihjb25zdCBzdHJpbmcmIG5hbWUsIFQmIHBUcmFuc3BvcnQpIHsKKyAgaWYgKHBUcmFuc3BvcnQpIHsKKyAgICB0cnkgeworICAgICAgcFRyYW5zcG9ydC0+Y2xvc2UoKTsKKyAgICB9IGNhdGNoIChjb25zdCBUVHJhbnNwb3J0RXhjZXB0aW9uJiB0dHgpIHsKKyAgICAgIHN0cmluZyBlcnJTdHIgPSBzdHJpbmcoIlRTZXJ2ZXJGcmFtZXdvcmsgIiArIG5hbWUgKyAiIGNsb3NlIGZhaWxlZDogIikgKyB0dHgud2hhdCgpOworICAgICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKKyAgICB9CisgIH0KK30KKwordm9pZCBUU2VydmVyRnJhbWV3b3JrOjpzZXJ2ZSgpIHsKKyAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBjbGllbnQ7CisgIHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gaW5wdXRUcmFuc3BvcnQ7CisgIHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gb3V0cHV0VHJhbnNwb3J0OworICBzaGFyZWRfcHRyPFRQcm90b2NvbD4gaW5wdXRQcm90b2NvbDsKKyAgc2hhcmVkX3B0cjxUUHJvdG9jb2w+IG91dHB1dFByb3RvY29sOworCisgIC8vIFN0YXJ0IHRoZSBzZXJ2ZXIgbGlzdGVuaW5nCisgIHNlcnZlclRyYW5zcG9ydF8tPmxpc3RlbigpOworCisgIC8vIFJ1biB0aGUgcHJlU2VydmUgZXZlbnQgdG8gaW5kaWNhdGUgc2VydmVyIGlzIG5vdyBsaXN0ZW5pbmcKKyAgLy8gYW5kIHRoYXQgaXQgaXMgc2FmZSB0byBjb25uZWN0LgorICBpZiAoZXZlbnRIYW5kbGVyXykgeworICAgIGV2ZW50SGFuZGxlcl8tPnByZVNlcnZlKCk7CisgIH0KKworICAvLyBGZXRjaCBjbGllbnQgZnJvbSBzZXJ2ZXIKKyAgZm9yICg7OykgeworICAgIHRyeSB7CisgICAgICAvLyBEZXJlZmVyZW5jZSBhbnkgcmVzb3VyY2VzIGZyb20gYW55IHByZXZpb3VzIGNsaWVudCBjcmVhdGlvbgorICAgICAgLy8gc3VjaCB0aGF0IGEgYmxvY2tpbmcgYWNjZXB0IGRvZXMgbm90IGhvbGQgdGhlbSBpbmRlZmluaXRlbHkuCisgICAgICBvdXRwdXRQcm90b2NvbC5yZXNldCgpOworICAgICAgaW5wdXRQcm90b2NvbC5yZXNldCgpOworICAgICAgb3V0cHV0VHJhbnNwb3J0LnJlc2V0KCk7CisgICAgICBpbnB1dFRyYW5zcG9ydC5yZXNldCgpOworICAgICAgY2xpZW50LnJlc2V0KCk7CisKKyAgICAgIC8vIElmIHdlIGhhdmUgcmVhY2hlZCB0aGUgbGltaXQgb24gdGhlIG51bWJlciBvZiBjb25jdXJyZW50CisgICAgICAvLyBjbGllbnRzIGFsbG93ZWQsIHdhaXQgZm9yIG9uZSBvciBtb3JlIGNsaWVudHMgdG8gZHJhaW4gYmVmb3JlCisgICAgICAvLyBhY2NlcHRpbmcgYW5vdGhlci4KKyAgICAgIHsKKyAgICAgICAgU3luY2hyb25pemVkIHN5bmMobW9uXyk7CisgICAgICAgIHdoaWxlIChjbGllbnRzXyA+PSBsaW1pdF8pIHsKKyAgICAgICAgICBtb25fLndhaXQoKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBjbGllbnQgPSBzZXJ2ZXJUcmFuc3BvcnRfLT5hY2NlcHQoKTsKKworICAgICAgaW5wdXRUcmFuc3BvcnQgPSBpbnB1dFRyYW5zcG9ydEZhY3RvcnlfLT5nZXRUcmFuc3BvcnQoY2xpZW50KTsKKyAgICAgIG91dHB1dFRyYW5zcG9ydCA9IG91dHB1dFRyYW5zcG9ydEZhY3RvcnlfLT5nZXRUcmFuc3BvcnQoY2xpZW50KTsKKyAgICAgIGlmICghb3V0cHV0UHJvdG9jb2xGYWN0b3J5XykgeworICAgICAgICBpbnB1dFByb3RvY29sID0gaW5wdXRQcm90b2NvbEZhY3RvcnlfLT5nZXRQcm90b2NvbChpbnB1dFRyYW5zcG9ydCwgb3V0cHV0VHJhbnNwb3J0KTsKKyAgICAgICAgb3V0cHV0UHJvdG9jb2wgPSBpbnB1dFByb3RvY29sOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5wdXRQcm90b2NvbCA9IGlucHV0UHJvdG9jb2xGYWN0b3J5Xy0+Z2V0UHJvdG9jb2woaW5wdXRUcmFuc3BvcnQpOworICAgICAgICBvdXRwdXRQcm90b2NvbCA9IG91dHB1dFByb3RvY29sRmFjdG9yeV8tPmdldFByb3RvY29sKG91dHB1dFRyYW5zcG9ydCk7CisgICAgICB9CisKKyAgICAgIG5ld2x5Q29ubmVjdGVkQ2xpZW50KHNoYXJlZF9wdHI8VENvbm5lY3RlZENsaWVudD4oCisgICAgICAgICAgbmV3IFRDb25uZWN0ZWRDbGllbnQoZ2V0UHJvY2Vzc29yKGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sLCBjbGllbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0UHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRIYW5kbGVyXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQpLAorICAgICAgICAgIGJpbmQoJlRTZXJ2ZXJGcmFtZXdvcms6OmRpc3Bvc2VDb25uZWN0ZWRDbGllbnQsIHRoaXMsIHN0ZDo6cGxhY2Vob2xkZXJzOjpfMSkpKTsKKworICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mIHR0eCkgeworICAgICAgcmVsZWFzZU9uZURlc2NyaXB0b3IoImlucHV0VHJhbnNwb3J0IiwgaW5wdXRUcmFuc3BvcnQpOworICAgICAgcmVsZWFzZU9uZURlc2NyaXB0b3IoIm91dHB1dFRyYW5zcG9ydCIsIG91dHB1dFRyYW5zcG9ydCk7CisgICAgICByZWxlYXNlT25lRGVzY3JpcHRvcigiY2xpZW50IiwgY2xpZW50KTsKKyAgICAgIGlmICh0dHguZ2V0VHlwZSgpID09IFRUcmFuc3BvcnRFeGNlcHRpb246OlRJTUVEX09VVCkgeworICAgICAgICAvLyBBY2NlcHQgdGltZW91dCAtIGNvbnRpbnVlIHByb2Nlc3NpbmcuCisgICAgICAgIGNvbnRpbnVlOworICAgICAgfSBlbHNlIGlmICh0dHguZ2V0VHlwZSgpID09IFRUcmFuc3BvcnRFeGNlcHRpb246OkVORF9PRl9GSUxFCisgICAgICAgICAgICAgICAgIHx8IHR0eC5nZXRUeXBlKCkgPT0gVFRyYW5zcG9ydEV4Y2VwdGlvbjo6SU5URVJSVVBURUQpIHsKKyAgICAgICAgLy8gU2VydmVyIHdhcyBpbnRlcnJ1cHRlZC4gIFRoaXMgb25seSBoYXBwZW5zIHdoZW4gc3RvcHBpbmcuCisgICAgICAgIGJyZWFrOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gQWxsIG90aGVyIHRyYW5zcG9ydCBleGNlcHRpb25zIGFyZSBsb2dnZWQuCisgICAgICAgIC8vIFN0YXRlIG9mIGNvbm5lY3Rpb24gaXMgdW5rbm93bi4gIERvbmUuCisgICAgICAgIHN0cmluZyBlcnJTdHIgPSBzdHJpbmcoIlRTZXJ2ZXJUcmFuc3BvcnQgZGllZDogIikgKyB0dHgud2hhdCgpOworICAgICAgICBHbG9iYWxPdXRwdXQoZXJyU3RyLmNfc3RyKCkpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZWxlYXNlT25lRGVzY3JpcHRvcigic2VydmVyVHJhbnNwb3J0Iiwgc2VydmVyVHJhbnNwb3J0Xyk7Cit9CisKK2ludDY0X3QgVFNlcnZlckZyYW1ld29yazo6Z2V0Q29uY3VycmVudENsaWVudExpbWl0KCkgY29uc3QgeworICBTeW5jaHJvbml6ZWQgc3luYyhtb25fKTsKKyAgcmV0dXJuIGxpbWl0XzsKK30KKworaW50NjRfdCBUU2VydmVyRnJhbWV3b3JrOjpnZXRDb25jdXJyZW50Q2xpZW50Q291bnQoKSBjb25zdCB7CisgIFN5bmNocm9uaXplZCBzeW5jKG1vbl8pOworICByZXR1cm4gY2xpZW50c187Cit9CisKK2ludDY0X3QgVFNlcnZlckZyYW1ld29yazo6Z2V0Q29uY3VycmVudENsaWVudENvdW50SFdNKCkgY29uc3QgeworICBTeW5jaHJvbml6ZWQgc3luYyhtb25fKTsKKyAgcmV0dXJuIGh3bV87Cit9CisKK3ZvaWQgVFNlcnZlckZyYW1ld29yazo6c2V0Q29uY3VycmVudENsaWVudExpbWl0KGludDY0X3QgbmV3TGltaXQpIHsKKyAgaWYgKG5ld0xpbWl0IDwgMSkgeworICAgIHRocm93IHN0ZDo6aW52YWxpZF9hcmd1bWVudCgibmV3TGltaXQgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVybyIpOworICB9CisgIFN5bmNocm9uaXplZCBzeW5jKG1vbl8pOworICBsaW1pdF8gPSBuZXdMaW1pdDsKKyAgaWYgKGxpbWl0XyAtIGNsaWVudHNfID4gMCkgeworICAgIG1vbl8ubm90aWZ5KCk7CisgIH0KK30KKwordm9pZCBUU2VydmVyRnJhbWV3b3JrOjpzdG9wKCkgeworICAvLyBPcmRlciBpcyBpbXBvcnRhbnQgYmVjYXVzZSBzZXJ2ZSgpIHJlbGVhc2VzIHNlcnZlclRyYW5zcG9ydF8gd2hlbiBpdCBpcworICAvLyBpbnRlcnJ1cHRlZCwgd2hpY2ggY2xvc2VzIHRoZSBzb2NrZXQgdGhhdCBpbnRlcnJ1cHRDaGlsZHJlbiB1c2VzLgorICBzZXJ2ZXJUcmFuc3BvcnRfLT5pbnRlcnJ1cHRDaGlsZHJlbigpOworICBzZXJ2ZXJUcmFuc3BvcnRfLT5pbnRlcnJ1cHQoKTsKK30KKwordm9pZCBUU2VydmVyRnJhbWV3b3JrOjpuZXdseUNvbm5lY3RlZENsaWVudChjb25zdCBzaGFyZWRfcHRyPFRDb25uZWN0ZWRDbGllbnQ+JiBwQ2xpZW50KSB7CisgIHsKKyAgICBTeW5jaHJvbml6ZWQgc3luYyhtb25fKTsKKyAgICArK2NsaWVudHNfOworICAgIGh3bV8gPSAoc3RkOjptYXgpKGh3bV8sIGNsaWVudHNfKTsKKyAgfQorCisgIG9uQ2xpZW50Q29ubmVjdGVkKHBDbGllbnQpOworfQorCit2b2lkIFRTZXJ2ZXJGcmFtZXdvcms6OmRpc3Bvc2VDb25uZWN0ZWRDbGllbnQoVENvbm5lY3RlZENsaWVudCogcENsaWVudCkgeworICBvbkNsaWVudERpc2Nvbm5lY3RlZChwQ2xpZW50KTsKKyAgZGVsZXRlIHBDbGllbnQ7CisKKyAgU3luY2hyb25pemVkIHN5bmMobW9uXyk7CisgIGlmIChsaW1pdF8gLSAtLWNsaWVudHNfID4gMCkgeworICAgIG1vbl8ubm90aWZ5KCk7CisgIH0KK30KKworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6c2VydmVyCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RTZXJ2ZXJGcmFtZXdvcmsuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFNlcnZlckZyYW1ld29yay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhYWNjZTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RTZXJ2ZXJGcmFtZXdvcmsuaApAQCAtMCwwICsxLDE4NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfU0VSVkVSX1RTRVJWRVJGUkFNRVdPUktfSF8KKyNkZWZpbmUgX1RIUklGVF9TRVJWRVJfVFNFUlZFUkZSQU1FV09SS19IXyAxCisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L1RQcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTW9uaXRvci5oPgorI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVENvbm5lY3RlZENsaWVudC5oPgorI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFNlcnZlci5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNlcnZlclRyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydC5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHNlcnZlciB7CisKKy8qKgorICogVFNlcnZlckZyYW1ld29yayBwcm92aWRlcyBhIHNpbmdsZSBjb25zb2xpZGF0ZWQgcHJvY2Vzc2luZyBsb29wIGZvcgorICogc2VydmVycy4gIEJ5IGhhdmluZyBhIHNpbmdsZSBwcm9jZXNzaW5nIGxvb3AsIGJlaGF2aW9yIGJldHdlZW4gc2VydmVycworICogaXMgbW9yZSBwcmVkaWN0YWJsZSBhbmQgbWFpbnRlbmFuY2UgY29zdCBpcyBsb3dlcmVkLiAgSW1wbGVtZW50YXRpb25zCisgKiBvZiBUU2VydmVyRnJhbWV3b3JrIG11c3QgcHJvdmlkZSBhIG1ldGhvZCB0byBkZWFsIHdpdGggYSBjbGllbnQgdGhhdAorICogY29ubmVjdHMgYW5kIG9uZSB0aGF0IGRpc2Nvbm5lY3RzLgorICoKKyAqIFdoaWxlIHRoaXMgZnVuY3Rpb25hbGl0eSBjb3VsZCBiZSByb2xsZWQgZGlyZWN0bHkgaW50byBUU2VydmVyLCBhbmQKKyAqIHByb2JhYmx5IHNob3VsZCBiZSwgaXQgd291bGQgYnJlYWsgdGhlIFRTZXJ2ZXIgaW50ZXJmYWNlIGNvbnRyYWN0IHNvCisgKiB0byBtYWludGFpbiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBmb3IgdGhpcmQgcGFydHkgc2VydmVycywgbm8gVFNlcnZlcnMKKyAqIHdlcmUgaGFybWVkIGluIHRoZSBtYWtpbmcgb2YgdGhpcyBjbGFzcy4KKyAqLworY2xhc3MgVFNlcnZlckZyYW1ld29yayA6IHB1YmxpYyBUU2VydmVyIHsKK3B1YmxpYzoKKyAgVFNlcnZlckZyYW1ld29yaygKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSk7CisKKyAgVFNlcnZlckZyYW1ld29yaygKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnkpOworCisgIFRTZXJ2ZXJGcmFtZXdvcmsoCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBvdXRwdXRQcm90b2NvbEZhY3RvcnkpOworCisgIFRTZXJ2ZXJGcmFtZXdvcmsoCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KTsKKworICB2aXJ0dWFsIH5UU2VydmVyRnJhbWV3b3JrKCk7CisKKyAgLyoqCisgICAqIEFjY2VwdCBjbGllbnRzIGZyb20gdGhlIFRTZXJ2ZXJUcmFuc3BvcnQgYW5kIGFkZCB0aGVtIGZvciBwcm9jZXNzaW5nLgorICAgKiBDYWxsIHN0b3AoKSBvbiBhbm90aGVyIHRocmVhZCB0byBpbnRlcnJ1cHQgcHJvY2Vzc2luZworICAgKiBhbmQgcmV0dXJuIGNvbnRyb2wgdG8gdGhlIGNhbGxlci4KKyAgICogUG9zdC1jb25kaXRpb25zIChyZXR1cm4gZ3VhcmFudGVlcyk6CisgICAqICAgVGhlIHNlcnZlclRyYW5zcG9ydCB3aWxsIGJlIGNsb3NlZC4KKyAgICovCisgIHZpcnR1YWwgdm9pZCBzZXJ2ZSgpOworCisgIC8qKgorICAgKiBJbnRlcnJ1cHQgc2VydmUoKSBzbyB0aGF0IGl0IG1lZXRzIHBvc3QtY29uZGl0aW9ucyBhbmQgcmV0dXJucy4KKyAgICovCisgIHZpcnR1YWwgdm9pZCBzdG9wKCk7CisKKyAgLyoqCisgICAqIEdldCB0aGUgY29uY3VycmVudCBjbGllbnQgbGltaXQuCisgICAqIFxyZXR1cm5zIHRoZSBjb25jdXJyZW50IGNsaWVudCBsaW1pdAorICAgKi8KKyAgdmlydHVhbCBpbnQ2NF90IGdldENvbmN1cnJlbnRDbGllbnRMaW1pdCgpIGNvbnN0OworCisgIC8qKgorICAgKiBHZXQgdGhlIG51bWJlciBvZiBjdXJyZW50bHkgY29ubmVjdGVkIGNsaWVudHMuCisgICAqIFxyZXR1cm5zIHRoZSBudW1iZXIgb2YgY3VycmVudGx5IGNvbm5lY3RlZCBjbGllbnRzCisgICAqLworICB2aXJ0dWFsIGludDY0X3QgZ2V0Q29uY3VycmVudENsaWVudENvdW50KCkgY29uc3Q7CisKKyAgLyoqCisgICAqIEdldCB0aGUgaGlnaGVzdCBudW1iZXIgb2YgY29uY3VycmVudCBjbGllbnRzLgorICAgKiBccmV0dXJucyB0aGUgaGlnaGVzdCBudW1iZXIgb2YgY29uY3VycmVudCBjbGllbnRzCisgICAqLworICB2aXJ0dWFsIGludDY0X3QgZ2V0Q29uY3VycmVudENsaWVudENvdW50SFdNKCkgY29uc3Q7CisKKyAgLyoqCisgICAqIFNldCB0aGUgY29uY3VycmVudCBjbGllbnQgbGltaXQuICBUaGlzIGNhbiBiZSBjaGFuZ2VkIHdoaWxlCisgICAqIHRoZSBzZXJ2ZXIgaXMgc2VydmluZyBob3dldmVyIGl0IHdpbGwgbm90IG5lY2Vzc2FyaWx5IGJlCisgICAqIGVuZm9yY2VkIHVudGlsIHRoZSBuZXh0IGNsaWVudCBpcyBhY2NlcHRlZCBhbmQgYWRkZWQuICBJZiB0aGUKKyAgICogbGltaXQgaXMgbG93ZXJlZCBiZWxvdyB0aGUgbnVtYmVyIG9mIGNvbm5lY3RlZCBjbGllbnRzLCBubworICAgKiBhY3Rpb24gaXMgdGFrZW4gdG8gZGlzY29ubmVjdCB0aGUgY2xpZW50cy4KKyAgICogVGhlIGRlZmF1bHQgdmFsdWUgdXNlZCBpZiB0aGlzIGlzIG5vdCBjYWxsZWQgaXMgSU5UNjRfTUFYLgorICAgKiBccGFyYW1baW5dICBuZXdMaW1pdCAgdGhlIG5ldyBsaW1pdCBvZiBjb25jdXJyZW50IGNsaWVudHMKKyAgICogXHRocm93cyBzdGQ6OmludmFsaWRfYXJndW1lbnQgaWYgbmV3TGltaXQgaXMgbGVzcyB0aGFuIDEKKyAgICovCisgIHZpcnR1YWwgdm9pZCBzZXRDb25jdXJyZW50Q2xpZW50TGltaXQoaW50NjRfdCBuZXdMaW1pdCk7CisKK3Byb3RlY3RlZDoKKyAgLyoqCisgICAqIEEgY2xpZW50IGhhcyBjb25uZWN0ZWQuICBUaGUgaW1wbGVtZW50YXRpb24gaXMgcmVzcG9uc2libGUgZm9yIG1hbmFnaW5nIHRoZQorICAgKiBsaWZldGltZSBvZiB0aGUgY2xpZW50IG9iamVjdC4gIFRoaXMgaXMgY2FsbGVkIGR1cmluZyB0aGUgc2VydmUoKSB0aHJlYWQsCisgICAqIHRoZXJlZm9yZSBhIGZhaWx1cmUgdG8gcmV0dXJuIHF1aWNrbHkgd2lsbCByZXN1bHQgaW4gbmV3IGNsaWVudCBjb25uZWN0aW9uCisgICAqIGRlbGF5cy4KKyAgICoKKyAgICogXHBhcmFtW2luXSAgcENsaWVudCAgdGhlIG5ld2x5IGNvbm5lY3RlZCBjbGllbnQKKyAgICovCisgIHZpcnR1YWwgdm9pZCBvbkNsaWVudENvbm5lY3RlZChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VENvbm5lY3RlZENsaWVudD4mIHBDbGllbnQpID0gMDsKKworICAvKioKKyAgICogQSBjbGllbnQgaGFzIGRpc2Nvbm5lY3RlZC4KKyAgICogV2hlbiBjYWxsZWQ6CisgICAqICAgVGhlIHNlcnZlciBubyBsb25nZXIgdHJhY2tzIHRoZSBjbGllbnQuCisgICAqICAgVGhlIGNsaWVudCBUVHJhbnNwb3J0IGhhcyBhbHJlYWR5IGJlZW4gY2xvc2VkLgorICAgKiAgIFRoZSBpbXBsZW1lbnRhdGlvbiBtdXN0IG5vdCBkZWxldGUgdGhlIHBvaW50ZXIuCisgICAqCisgICAqIFxwYXJhbVtpbl0gIHBDbGllbnQgIHRoZSBkaXNjb25uZWN0ZWQgY2xpZW50CisgICAqLworICB2aXJ0dWFsIHZvaWQgb25DbGllbnREaXNjb25uZWN0ZWQoVENvbm5lY3RlZENsaWVudCogcENsaWVudCkgPSAwOworCitwcml2YXRlOgorICAvKioKKyAgICogQ29tbW9uIGhhbmRsaW5nIGZvciBuZXcgY29ubmVjdGVkIGNsaWVudHMuICBJbXBsZW1lbnRzIGNvbmN1cnJlbnQKKyAgICogY2xpZW50IHJhdGUgbGltaXRpbmcgYWZ0ZXIgb25DbGllbnRDb25uZWN0ZWQgcmV0dXJucyBieSBibG9ja2luZyB0aGUKKyAgICogc2VydmUoKSB0aHJlYWQgaWYgdGhlIGxpbWl0IGhhcyBiZWVuIHJlYWNoZWQuCisgICAqLworICB2b2lkIG5ld2x5Q29ubmVjdGVkQ2xpZW50KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUQ29ubmVjdGVkQ2xpZW50PiYgcENsaWVudCk7CisKKyAgLyoqCisgICAqIFNtYXJ0IHBvaW50ZXIgY2xpZW50IGRlbGV0aW9uLgorICAgKiBDYWxscyBvbkNsaWVudERpc2Nvbm5lY3RlZCBhbmQgdGhlbiBkZWxldGVzIHBDbGllbnQuCisgICAqLworICB2b2lkIGRpc3Bvc2VDb25uZWN0ZWRDbGllbnQoVENvbm5lY3RlZENsaWVudCogcENsaWVudCk7CisKKyAgLyoqCisgICAqIE1vbml0b3IgZm9yIGxpbWl0aW5nIHRoZSBudW1iZXIgb2YgY29uY3VycmVudCBjbGllbnRzLgorICAgKi8KKyAgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpNb25pdG9yIG1vbl87CisKKyAgLyoqCisgICAqIFRoZSBudW1iZXIgb2YgY29uY3VycmVudCBjbGllbnRzLgorICAgKi8KKyAgaW50NjRfdCBjbGllbnRzXzsKKworICAvKioKKyAgICogVGhlIGhpZ2ggd2F0ZXIgbWFyayBvZiBjb25jdXJyZW50IGNsaWVudHMuCisgICAqLworICBpbnQ2NF90IGh3bV87CisKKyAgLyoqCisgICAqIFRoZSBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIGNvbmN1cnJlbnQgY2xpZW50cy4KKyAgICovCisgIGludDY0X3QgbGltaXRfOworfTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcgorCisjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1NFUlZFUl9UU0VSVkVSRlJBTUVXT1JLX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UU2ltcGxlU2VydmVyLmNwcAppbmRleCA1ZmM0Yzk3Li43MTYyMzRkIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuY3BwCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5jcHAKQEAgLTE4LDEzNiArMTgsOTAgQEAKICAqLwogCiAjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UU2ltcGxlU2VydmVyLmg+Ci0jaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmg+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPGlvc3RyZWFtPgogCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBzZXJ2ZXIgeworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBzZXJ2ZXIgewogCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OwotdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDsKLXVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OwotdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeTsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5OwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOwordXNpbmcgc3RkOjpzdHJpbmc7CiAKLS8qKgotICogQSBzaW1wbGUgc2luZ2xlLXRocmVhZGVkIGFwcGxpY2F0aW9uIHNlcnZlci4gUGVyZmVjdCBmb3IgdW5pdCB0ZXN0cyEKLSAqCi0gKi8KLXZvaWQgVFNpbXBsZVNlcnZlcjo6c2VydmUoKSB7Ci0KLSAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBjbGllbnQ7Ci0gIHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gaW5wdXRUcmFuc3BvcnQ7Ci0gIHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gb3V0cHV0VHJhbnNwb3J0OwotICBzaGFyZWRfcHRyPFRQcm90b2NvbD4gaW5wdXRQcm90b2NvbDsKLSAgc2hhcmVkX3B0cjxUUHJvdG9jb2w+IG91dHB1dFByb3RvY29sOwotCi0gIC8vIFN0YXJ0IHRoZSBzZXJ2ZXIgbGlzdGVuaW5nCi0gIHNlcnZlclRyYW5zcG9ydF8tPmxpc3RlbigpOwotCi0gIC8vIFJ1biB0aGUgcHJlU2VydmUgZXZlbnQKLSAgaWYgKGV2ZW50SGFuZGxlcl8pIHsKLSAgICBldmVudEhhbmRsZXJfLT5wcmVTZXJ2ZSgpOwotICB9Ci0KLSAgLy8gRmV0Y2ggY2xpZW50IGZyb20gc2VydmVyCi0gIHdoaWxlICghc3RvcF8pIHsKLSAgICB0cnkgewotICAgICAgY2xpZW50ID0gc2VydmVyVHJhbnNwb3J0Xy0+YWNjZXB0KCk7Ci0gICAgICBpbnB1dFRyYW5zcG9ydCA9IGlucHV0VHJhbnNwb3J0RmFjdG9yeV8tPmdldFRyYW5zcG9ydChjbGllbnQpOwotICAgICAgb3V0cHV0VHJhbnNwb3J0ID0gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeV8tPmdldFRyYW5zcG9ydChjbGllbnQpOwotICAgICAgaW5wdXRQcm90b2NvbCA9IGlucHV0UHJvdG9jb2xGYWN0b3J5Xy0+Z2V0UHJvdG9jb2woaW5wdXRUcmFuc3BvcnQpOwotICAgICAgb3V0cHV0UHJvdG9jb2wgPSBvdXRwdXRQcm90b2NvbEZhY3RvcnlfLT5nZXRQcm90b2NvbChvdXRwdXRUcmFuc3BvcnQpOwotICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mIHR0eCkgewotICAgICAgaWYgKGlucHV0VHJhbnNwb3J0KSB7IGlucHV0VHJhbnNwb3J0LT5jbG9zZSgpOyB9Ci0gICAgICBpZiAob3V0cHV0VHJhbnNwb3J0KSB7IG91dHB1dFRyYW5zcG9ydC0+Y2xvc2UoKTsgfQotICAgICAgaWYgKGNsaWVudCkgeyBjbGllbnQtPmNsb3NlKCk7IH0KLSAgICAgIGlmICghc3RvcF8gfHwgdHR4LmdldFR5cGUoKSAhPSBUVHJhbnNwb3J0RXhjZXB0aW9uOjpJTlRFUlJVUFRFRCkgewotICAgICAgICAgIHN0cmluZyBlcnJTdHIgPSBzdHJpbmcoIlRTZXJ2ZXJUcmFuc3BvcnQgZGllZCBvbiBhY2NlcHQ6ICIpICsgdHR4LndoYXQoKTsKLSAgICAgICAgICBHbG9iYWxPdXRwdXQoZXJyU3RyLmNfc3RyKCkpOwotICAgICAgfQotICAgICAgY29udGludWU7Ci0gICAgfSBjYXRjaCAoVEV4Y2VwdGlvbiYgdHgpIHsKLSAgICAgIGlmIChpbnB1dFRyYW5zcG9ydCkgeyBpbnB1dFRyYW5zcG9ydC0+Y2xvc2UoKTsgfQotICAgICAgaWYgKG91dHB1dFRyYW5zcG9ydCkgeyBvdXRwdXRUcmFuc3BvcnQtPmNsb3NlKCk7IH0KLSAgICAgIGlmIChjbGllbnQpIHsgY2xpZW50LT5jbG9zZSgpOyB9Ci0gICAgICBzdHJpbmcgZXJyU3RyID0gc3RyaW5nKCJTb21lIGtpbmQgb2YgYWNjZXB0IGV4Y2VwdGlvbjogIikgKyB0eC53aGF0KCk7Ci0gICAgICBHbG9iYWxPdXRwdXQoZXJyU3RyLmNfc3RyKCkpOwotICAgICAgY29udGludWU7Ci0gICAgfSBjYXRjaCAoc3RyaW5nIHMpIHsKLSAgICAgIGlmIChpbnB1dFRyYW5zcG9ydCkgeyBpbnB1dFRyYW5zcG9ydC0+Y2xvc2UoKTsgfQotICAgICAgaWYgKG91dHB1dFRyYW5zcG9ydCkgeyBvdXRwdXRUcmFuc3BvcnQtPmNsb3NlKCk7IH0KLSAgICAgIGlmIChjbGllbnQpIHsgY2xpZW50LT5jbG9zZSgpOyB9Ci0gICAgICBzdHJpbmcgZXJyU3RyID0gc3RyaW5nKCJTb21lIGtpbmQgb2YgYWNjZXB0IGV4Y2VwdGlvbjogIikgKyBzOwotICAgICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIC8vIEdldCB0aGUgcHJvY2Vzc29yCi0gICAgc2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IgPSBnZXRQcm9jZXNzb3IoaW5wdXRQcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQcm90b2NvbCwgY2xpZW50KTsKLQotICAgIHZvaWQqIGNvbm5lY3Rpb25Db250ZXh0ID0gTlVMTDsKLSAgICBpZiAoZXZlbnRIYW5kbGVyXykgewotICAgICAgY29ubmVjdGlvbkNvbnRleHQgPSBldmVudEhhbmRsZXJfLT5jcmVhdGVDb250ZXh0KGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKTsKLSAgICB9Ci0gICAgdHJ5IHsKLSAgICAgIGZvciAoOzspIHsKLSAgICAgICAgaWYgKGV2ZW50SGFuZGxlcl8pIHsKLSAgICAgICAgICBldmVudEhhbmRsZXJfLT5wcm9jZXNzQ29udGV4dChjb25uZWN0aW9uQ29udGV4dCwgY2xpZW50KTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIXByb2Nlc3Nvci0+cHJvY2VzcyhpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbkNvbnRleHQpIHx8Ci0gICAgICAgICAgLy8gUGVlayBhaGVhZCwgaXMgdGhlIHJlbW90ZSBzaWRlIGNsb3NlZD8KLSAgICAgICAgICAgICFpbnB1dFByb3RvY29sLT5nZXRUcmFuc3BvcnQoKS0+cGVlaygpKSB7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGNhdGNoIChjb25zdCBUVHJhbnNwb3J0RXhjZXB0aW9uJiB0dHgpIHsKLSAgICAgIHN0cmluZyBlcnJTdHIgPSBzdHJpbmcoIlRTaW1wbGVTZXJ2ZXIgY2xpZW50IGRpZWQ6ICIpICsgdHR4LndoYXQoKTsKLSAgICAgIEdsb2JhbE91dHB1dChlcnJTdHIuY19zdHIoKSk7Ci0gICAgfSBjYXRjaCAoY29uc3Qgc3RkOjpleGNlcHRpb24mIHgpIHsKLSAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoIlRTaW1wbGVTZXJ2ZXIgZXhjZXB0aW9uOiAlczogJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlaWQoeCkubmFtZSgpLCB4LndoYXQoKSk7Ci0gICAgfSBjYXRjaCAoLi4uKSB7Ci0gICAgICBHbG9iYWxPdXRwdXQoIlRTaW1wbGVTZXJ2ZXIgdW5jYXVnaHQgZXhjZXB0aW9uLiIpOwotICAgIH0KLSAgICBpZiAoZXZlbnRIYW5kbGVyXykgewotICAgICAgZXZlbnRIYW5kbGVyXy0+ZGVsZXRlQ29udGV4dChjb25uZWN0aW9uQ29udGV4dCwgaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpOwotICAgIH0KLQotICAgIHRyeSB7Ci0gICAgICBpbnB1dFRyYW5zcG9ydC0+Y2xvc2UoKTsKLSAgICB9IGNhdGNoIChjb25zdCBUVHJhbnNwb3J0RXhjZXB0aW9uJiB0dHgpIHsKLSAgICAgIHN0cmluZyBlcnJTdHIgPSBzdHJpbmcoIlRTaW1wbGVTZXJ2ZXIgaW5wdXQgY2xvc2UgZmFpbGVkOiAiKQotICAgICAgICArIHR0eC53aGF0KCk7Ci0gICAgICBHbG9iYWxPdXRwdXQoZXJyU3RyLmNfc3RyKCkpOwotICAgIH0KLSAgICB0cnkgewotICAgICAgb3V0cHV0VHJhbnNwb3J0LT5jbG9zZSgpOwotICAgIH0gY2F0Y2ggKGNvbnN0IFRUcmFuc3BvcnRFeGNlcHRpb24mIHR0eCkgewotICAgICAgc3RyaW5nIGVyclN0ciA9IHN0cmluZygiVFNpbXBsZVNlcnZlciBvdXRwdXQgY2xvc2UgZmFpbGVkOiAiKQotICAgICAgICArIHR0eC53aGF0KCk7Ci0gICAgICBHbG9iYWxPdXRwdXQoZXJyU3RyLmNfc3RyKCkpOwotICAgIH0KLSAgICB0cnkgewotICAgICAgY2xpZW50LT5jbG9zZSgpOwotICAgIH0gY2F0Y2ggKGNvbnN0IFRUcmFuc3BvcnRFeGNlcHRpb24mIHR0eCkgewotICAgICAgc3RyaW5nIGVyclN0ciA9IHN0cmluZygiVFNpbXBsZVNlcnZlciBjbGllbnQgY2xvc2UgZmFpbGVkOiAiKQotICAgICAgICArIHR0eC53aGF0KCk7Ci0gICAgICBHbG9iYWxPdXRwdXQoZXJyU3RyLmNfc3RyKCkpOwotICAgIH0KLSAgfQotCi0gIGlmIChzdG9wXykgewotICAgIHRyeSB7Ci0gICAgICBzZXJ2ZXJUcmFuc3BvcnRfLT5jbG9zZSgpOwotICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gJnR0eCkgewotICAgICAgc3RyaW5nIGVyclN0ciA9IHN0cmluZygiVFNlcnZlclRyYW5zcG9ydCBmYWlsZWQgb24gY2xvc2U6ICIpICsgdHR4LndoYXQoKTsKLSAgICAgIEdsb2JhbE91dHB1dChlcnJTdHIuY19zdHIoKSk7Ci0gICAgfQotICAgIHN0b3BfID0gZmFsc2U7Ci0gIH0KK1RTaW1wbGVTZXJ2ZXI6OlRTaW1wbGVTZXJ2ZXIoY29uc3Qgc2hhcmVkX3B0cjxUUHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSkKKyAgOiBUU2VydmVyRnJhbWV3b3JrKHByb2Nlc3NvckZhY3RvcnksIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KSB7CisgIFRTZXJ2ZXJGcmFtZXdvcms6OnNldENvbmN1cnJlbnRDbGllbnRMaW1pdCgxKTsKIH0KIAotfX19IC8vIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXIKK1RTaW1wbGVTZXJ2ZXI6OlRTaW1wbGVTZXJ2ZXIoY29uc3Qgc2hhcmVkX3B0cjxUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnkpCisgIDogVFNlcnZlckZyYW1ld29yayhwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KSB7CisgIFRTZXJ2ZXJGcmFtZXdvcms6OnNldENvbmN1cnJlbnRDbGllbnRMaW1pdCgxKTsKK30KKworVFNpbXBsZVNlcnZlcjo6VFNpbXBsZVNlcnZlcihjb25zdCBzaGFyZWRfcHRyPFRQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIG91dHB1dFByb3RvY29sRmFjdG9yeSkKKyAgOiBUU2VydmVyRnJhbWV3b3JrKHByb2Nlc3NvckZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQcm90b2NvbEZhY3RvcnkpIHsKKyAgVFNlcnZlckZyYW1ld29yazo6c2V0Q29uY3VycmVudENsaWVudExpbWl0KDEpOworfQorCitUU2ltcGxlU2VydmVyOjpUU2ltcGxlU2VydmVyKGNvbnN0IHNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIG91dHB1dFByb3RvY29sRmFjdG9yeSkKKyAgOiBUU2VydmVyRnJhbWV3b3JrKHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIG91dHB1dFByb3RvY29sRmFjdG9yeSkgeworICBUU2VydmVyRnJhbWV3b3JrOjpzZXRDb25jdXJyZW50Q2xpZW50TGltaXQoMSk7Cit9CisKK1RTaW1wbGVTZXJ2ZXI6On5UU2ltcGxlU2VydmVyKCkgeworfQorCisvKioKKyAqIFRoZSBtYWluIGJvZHkgb2YgY3VzdG9taXplZCBpbXBsZW1lbnRhdGlvbiBmb3IgVFNpbXBsZVNlcnZlciBpcyBxdWl0ZSBzaW1wbGU6CisgKiBXaGVuIGEgY2xpZW50IGNvbm5lY3RzLCB1c2UgdGhlIHNlcnZlKCkgdGhyZWFkIHRvIGRyaXZlIGl0IHRvIGNvbXBsZXRpb24gdGh1cworICogYmxvY2tpbmcgbmV3IGNvbm5lY3Rpb25zLgorICovCit2b2lkIFRTaW1wbGVTZXJ2ZXI6Om9uQ2xpZW50Q29ubmVjdGVkKGNvbnN0IHNoYXJlZF9wdHI8VENvbm5lY3RlZENsaWVudD4mIHBDbGllbnQpIHsKKyAgcENsaWVudC0+cnVuKCk7Cit9CisKKy8qKgorICogVFNpbXBsZVNlcnZlciBkb2VzIG5vdCB0cmFjayBjbGllbnRzIHNvIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8gaGVyZS4KKyAqLwordm9pZCBUU2ltcGxlU2VydmVyOjpvbkNsaWVudERpc2Nvbm5lY3RlZChUQ29ubmVjdGVkQ2xpZW50KikgeworfQorCisvKioKKyAqIFRoaXMgbWFrZXMgbGl0dGxlIHNlbnNlIHRvIHRoZSBzaW1wbGUgc2VydmVyIGJlY2F1c2UgaXQgaXMgbm90IGNhcGFibGUKKyAqIG9mIGhhdmluZyBtb3JlIHRoYW4gb25lIGNsaWVudCBhdCBhIHRpbWUsIHNvIHdlIGhpZGUgaXQuCisgKi8KK3ZvaWQgVFNpbXBsZVNlcnZlcjo6c2V0Q29uY3VycmVudENsaWVudExpbWl0KGludDY0X3QpIHsKK30KK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcgpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UU2ltcGxlU2VydmVyLmggYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuaAppbmRleCBmOWUwZTJiLi40NTQ5MjI1IDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuaApAQCAtMjAsODMgKzIwLDU4IEBACiAjaWZuZGVmIF9USFJJRlRfU0VSVkVSX1RTSU1QTEVTRVJWRVJfSF8KICNkZWZpbmUgX1RIUklGVF9TRVJWRVJfVFNJTVBMRVNFUlZFUl9IXyAxCiAKLSNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RTZXJ2ZXIuaD4KLSNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJUcmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RTZXJ2ZXJGcmFtZXdvcmsuaD4KIAotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2Ugc2VydmVyIHsKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2Ugc2VydmVyIHsKIAogLyoqCiAgKiBUaGlzIGlzIHRoZSBtb3N0IGJhc2ljIHNpbXBsZSBzZXJ2ZXIuIEl0IGlzIHNpbmdsZS10aHJlYWRlZCBhbmQgcnVucyBhCiAgKiBjb250aW51b3VzIGxvb3Agb2YgYWNjZXB0aW5nIGEgc2luZ2xlIGNvbm5lY3Rpb24sIHByb2Nlc3NpbmcgcmVxdWVzdHMgb24KLSAqIHRoYXQgY29ubmVjdGlvbiB1bnRpbCBpdCBjbG9zZXMsIGFuZCB0aGVuIHJlcGVhdGluZy4gSXQgaXMgYSBnb29kIGV4YW1wbGUKLSAqIG9mIGhvdyB0byBleHRlbmQgdGhlIFRTZXJ2ZXIgaW50ZXJmYWNlLgotICoKKyAqIHRoYXQgY29ubmVjdGlvbiB1bnRpbCBpdCBjbG9zZXMsIGFuZCB0aGVuIHJlcGVhdGluZy4KICAqLwotY2xhc3MgVFNpbXBsZVNlcnZlciA6IHB1YmxpYyBUU2VydmVyIHsKLSBwdWJsaWM6Ci0gIHRlbXBsYXRlPHR5cGVuYW1lIFByb2Nlc3NvckZhY3Rvcnk+CitjbGFzcyBUU2ltcGxlU2VydmVyIDogcHVibGljIFRTZXJ2ZXJGcmFtZXdvcmsgeworcHVibGljOgogICBUU2ltcGxlU2VydmVyKAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8UHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSwKLSAgICAgIFRIUklGVF9PVkVSTE9BRF9JRihQcm9jZXNzb3JGYWN0b3J5LCBUUHJvY2Vzc29yRmFjdG9yeSkpIDoKLSAgICBUU2VydmVyKHByb2Nlc3NvckZhY3RvcnksIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICAgIHByb3RvY29sRmFjdG9yeSksCi0gICAgc3RvcF8oZmFsc2UpIHt9CisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnkpOwogCi0gIHRlbXBsYXRlPHR5cGVuYW1lIFByb2Nlc3Nvcj4KICAgVFNpbXBsZVNlcnZlcigKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5LAotICAgICAgVEhSSUZUX09WRVJMT0FEX0lGKFByb2Nlc3NvciwgVFByb2Nlc3NvcikpIDoKLSAgICBUU2VydmVyKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpLAotICAgIHN0b3BfKGZhbHNlKSB7fQorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSk7CiAKLSAgdGVtcGxhdGU8dHlwZW5hbWUgUHJvY2Vzc29yRmFjdG9yeT4KICAgVFNpbXBsZVNlcnZlcigKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIGlucHV0UHJvdG9jb2xGYWN0b3J5LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIG91dHB1dFByb3RvY29sRmFjdG9yeSwKLSAgICAgIFRIUklGVF9PVkVSTE9BRF9JRihQcm9jZXNzb3JGYWN0b3J5LCBUUHJvY2Vzc29yRmFjdG9yeSkpIDoKLSAgICBUU2VydmVyKHByb2Nlc3NvckZhY3RvcnksIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgICAgIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5LCBvdXRwdXRQcm90b2NvbEZhY3RvcnkpLAotICAgIHN0b3BfKGZhbHNlKSB7fQorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KTsKIAotICB0ZW1wbGF0ZTx0eXBlbmFtZSBQcm9jZXNzb3I+CiAgIFRTaW1wbGVTZXJ2ZXIoCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgaW5wdXRQcm90b2NvbEZhY3RvcnksCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAotICAgICAgVEhSSUZUX09WRVJMT0FEX0lGKFByb2Nlc3NvciwgVFByb2Nlc3NvcikpIDoKLSAgICBUU2VydmVyKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgICAgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LCBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnksIG91dHB1dFByb3RvY29sRmFjdG9yeSksCi0gICAgc3RvcF8oZmFsc2UpIHt9CisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KTsKIAotICB+VFNpbXBsZVNlcnZlcigpIHt9CisgIHZpcnR1YWwgflRTaW1wbGVTZXJ2ZXIoKTsKIAotICB2b2lkIHNlcnZlKCk7Citwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgdm9pZCBvbkNsaWVudENvbm5lY3RlZChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VENvbm5lY3RlZENsaWVudD4mIHBDbGllbnQpIC8qIG92ZXJyaWRlICovOworICB2aXJ0dWFsIHZvaWQgb25DbGllbnREaXNjb25uZWN0ZWQoVENvbm5lY3RlZENsaWVudCogcENsaWVudCkgLyogb3ZlcnJpZGUgKi87CiAKLSAgdm9pZCBzdG9wKCkgewotICAgIHN0b3BfID0gdHJ1ZTsKLSAgICBzZXJ2ZXJUcmFuc3BvcnRfLT5pbnRlcnJ1cHQoKTsKLSAgfQotCi0gcHJvdGVjdGVkOgotICBib29sIHN0b3BfOwotCitwcml2YXRlOgorICB2b2lkIHNldENvbmN1cnJlbnRDbGllbnRMaW1pdChpbnQ2NF90IG5ld0xpbWl0KTsgLy8gaGlkZQogfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXIKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcgogCiAjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1NFUlZFUl9UU0lNUExFU0VSVkVSX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuY3BwCmluZGV4IGRhMzNlYzIuLmVlMzQ1YTkgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuY3BwCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuY3BwCkBAIC0xNywxNzkgKzE3LDg2IEBACiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaW5jbHVkZSA8dGhyaWZ0L3RocmlmdC1jb25maWcuaD4KLQogI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuaD4KLSNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uaD4KLSNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkLmg+Ci0jaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXIuaD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+CiAKLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHNlcnZlciB7CituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHNlcnZlciB7CiAKLXVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOwotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLXVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDsKLXVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k7Ci11c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOwotdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZE1hbmFnZXI7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeTsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5OwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOwordXNpbmcgc3RkOjpzdHJpbmc7CiAKLWNsYXNzIFRUaHJlYWRQb29sU2VydmVyOjpUYXNrIDogcHVibGljIFJ1bm5hYmxlIHsKK1RUaHJlYWRQb29sU2VydmVyOjpUVGhyZWFkUG9vbFNlcnZlcihjb25zdCBzaGFyZWRfcHRyPFRQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4mIHRocmVhZE1hbmFnZXIpCisgIDogVFNlcnZlckZyYW1ld29yayhwcm9jZXNzb3JGYWN0b3J5LCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSksCisgICAgdGhyZWFkTWFuYWdlcl8odGhyZWFkTWFuYWdlciksCisgICAgdGltZW91dF8oMCksCisgICAgdGFza0V4cGlyYXRpb25fKDApIHsKK30KIAotcHVibGljOgorVFRocmVhZFBvb2xTZXJ2ZXI6OlRUaHJlYWRQb29sU2VydmVyKGNvbnN0IHNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4mIHRocmVhZE1hbmFnZXIpCisgIDogVFNlcnZlckZyYW1ld29yayhwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KSwKKyAgICB0aHJlYWRNYW5hZ2VyXyh0aHJlYWRNYW5hZ2VyKSwKKyAgICB0aW1lb3V0XygwKSwKKyAgICB0YXNrRXhwaXJhdGlvbl8oMCkgeworfQogCi0gIFRhc2soVFRocmVhZFBvb2xTZXJ2ZXIgJnNlcnZlciwKLSAgICAgICBzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvciwKLSAgICAgICBzaGFyZWRfcHRyPFRQcm90b2NvbD4gaW5wdXQsCi0gICAgICAgc2hhcmVkX3B0cjxUUHJvdG9jb2w+IG91dHB1dCwKLSAgICAgICBzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCkgOgotICAgIHNlcnZlcl8oc2VydmVyKSwKLSAgICBwcm9jZXNzb3JfKHByb2Nlc3NvciksCi0gICAgaW5wdXRfKGlucHV0KSwKLSAgICBvdXRwdXRfKG91dHB1dCksCi0gICAgdHJhbnNwb3J0Xyh0cmFuc3BvcnQpIHsKLSAgfQorVFRocmVhZFBvb2xTZXJ2ZXI6OlRUaHJlYWRQb29sU2VydmVyKGNvbnN0IHNoYXJlZF9wdHI8VFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIG91dHB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+JiB0aHJlYWRNYW5hZ2VyKQorICA6IFRTZXJ2ZXJGcmFtZXdvcmsocHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIG91dHB1dFByb3RvY29sRmFjdG9yeSksCisgICAgdGhyZWFkTWFuYWdlcl8odGhyZWFkTWFuYWdlciksCisgICAgdGltZW91dF8oMCksCisgICAgdGFza0V4cGlyYXRpb25fKDApIHsKK30KIAotICB+VGFzaygpIHt9CitUVGhyZWFkUG9vbFNlcnZlcjo6VFRocmVhZFBvb2xTZXJ2ZXIoY29uc3Qgc2hhcmVkX3B0cjxUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIG91dHB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+JiB0aHJlYWRNYW5hZ2VyKQorICA6IFRTZXJ2ZXJGcmFtZXdvcmsocHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KSwKKyAgICB0aHJlYWRNYW5hZ2VyXyh0aHJlYWRNYW5hZ2VyKSwKKyAgICB0aW1lb3V0XygwKSwKKyAgICB0YXNrRXhwaXJhdGlvbl8oMCkgeworfQogCi0gIHZvaWQgcnVuKCkgewotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJFdmVudEhhbmRsZXI+IGV2ZW50SGFuZGxlciA9Ci0gICAgICBzZXJ2ZXJfLmdldEV2ZW50SGFuZGxlcigpOwotICAgIHZvaWQqIGNvbm5lY3Rpb25Db250ZXh0ID0gTlVMTDsKLSAgICBpZiAoZXZlbnRIYW5kbGVyKSB7Ci0gICAgICBjb25uZWN0aW9uQ29udGV4dCA9IGV2ZW50SGFuZGxlci0+Y3JlYXRlQ29udGV4dChpbnB1dF8sIG91dHB1dF8pOwotICAgIH0KLSAgICB0cnkgewotICAgICAgZm9yICg7OykgewotICAgICAgICBpZiAoZXZlbnRIYW5kbGVyKSB7Ci0gICAgICAgICAgZXZlbnRIYW5kbGVyLT5wcm9jZXNzQ29udGV4dChjb25uZWN0aW9uQ29udGV4dCwgdHJhbnNwb3J0Xyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFwcm9jZXNzb3JfLT5wcm9jZXNzKGlucHV0Xywgb3V0cHV0XywgY29ubmVjdGlvbkNvbnRleHQpIHx8Ci0gICAgICAgICAgICAhaW5wdXRfLT5nZXRUcmFuc3BvcnQoKS0+cGVlaygpKSB7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGNhdGNoIChjb25zdCBUVHJhbnNwb3J0RXhjZXB0aW9uJikgewotICAgICAgLy8gVGhpcyBpcyByZWFzb25hYmx5IGV4cGVjdGVkLCBjbGllbnQgZGlkbid0IHNlbmQgYSBmdWxsIHJlcXVlc3Qgc28ganVzdAotICAgICAgLy8gaWdub3JlIGhpbQotICAgICAgLy8gc3RyaW5nIGVyclN0ciA9IHN0cmluZygiVFRocmVhZFBvb2xTZXJ2ZXIgY2xpZW50IGRpZWQ6ICIpICsgdHR4LndoYXQoKTsKLSAgICAgIC8vIEdsb2JhbE91dHB1dChlcnJTdHIuY19zdHIoKSk7Ci0gICAgfSBjYXRjaCAoY29uc3Qgc3RkOjpleGNlcHRpb24mIHgpIHsKLSAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoIlRUaHJlYWRQb29sU2VydmVyIGV4Y2VwdGlvbiAlczogJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlaWQoeCkubmFtZSgpLCB4LndoYXQoKSk7Ci0gICAgfSBjYXRjaCAoLi4uKSB7Ci0gICAgICBHbG9iYWxPdXRwdXQoIlRUaHJlYWRQb29sU2VydmVyLCB1bmV4cGVjdGVkIGV4Y2VwdGlvbiBpbiAiCi0gICAgICAgICAgICAgICAgICAgIlRUaHJlYWRQb29sU2VydmVyOjpUYXNrOjpydW4oKSIpOwotICAgIH0KLQotICAgIGlmIChldmVudEhhbmRsZXIpIHsKLSAgICAgIGV2ZW50SGFuZGxlci0+ZGVsZXRlQ29udGV4dChjb25uZWN0aW9uQ29udGV4dCwgaW5wdXRfLCBvdXRwdXRfKTsKLSAgICB9Ci0KLSAgICB0cnkgewotICAgICAgaW5wdXRfLT5nZXRUcmFuc3BvcnQoKS0+Y2xvc2UoKTsKLSAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJiB0dHgpIHsKLSAgICAgIHN0cmluZyBlcnJTdHIgPSBzdHJpbmcoIlRUaHJlYWRQb29sU2VydmVyIGlucHV0IGNsb3NlIGZhaWxlZDogIikgKyB0dHgud2hhdCgpOwotICAgICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKLSAgICB9Ci0gICAgdHJ5IHsKLSAgICAgIG91dHB1dF8tPmdldFRyYW5zcG9ydCgpLT5jbG9zZSgpOwotICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mIHR0eCkgewotICAgICAgc3RyaW5nIGVyclN0ciA9IHN0cmluZygiVFRocmVhZFBvb2xTZXJ2ZXIgb3V0cHV0IGNsb3NlIGZhaWxlZDogIikgKyB0dHgud2hhdCgpOwotICAgICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKLSAgICB9Ci0KLSAgfQotCi0gcHJpdmF0ZToKLSAgVFNlcnZlciYgc2VydmVyXzsKLSAgc2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3JfOwotICBzaGFyZWRfcHRyPFRQcm90b2NvbD4gaW5wdXRfOwotICBzaGFyZWRfcHRyPFRQcm90b2NvbD4gb3V0cHV0XzsKLSAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnRfOwotfTsKLQotVFRocmVhZFBvb2xTZXJ2ZXI6On5UVGhyZWFkUG9vbFNlcnZlcigpIHt9CitUVGhyZWFkUG9vbFNlcnZlcjo6flRUaHJlYWRQb29sU2VydmVyKCkgeworfQogCiB2b2lkIFRUaHJlYWRQb29sU2VydmVyOjpzZXJ2ZSgpIHsKLSAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBjbGllbnQ7Ci0gIHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gaW5wdXRUcmFuc3BvcnQ7Ci0gIHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gb3V0cHV0VHJhbnNwb3J0OwotICBzaGFyZWRfcHRyPFRQcm90b2NvbD4gaW5wdXRQcm90b2NvbDsKLSAgc2hhcmVkX3B0cjxUUHJvdG9jb2w+IG91dHB1dFByb3RvY29sOwotCi0gIC8vIFN0YXJ0IHRoZSBzZXJ2ZXIgbGlzdGVuaW5nCi0gIHNlcnZlclRyYW5zcG9ydF8tPmxpc3RlbigpOwotCi0gIC8vIFJ1biB0aGUgcHJlU2VydmUgZXZlbnQKLSAgaWYgKGV2ZW50SGFuZGxlcl8pIHsKLSAgICBldmVudEhhbmRsZXJfLT5wcmVTZXJ2ZSgpOwotICB9Ci0KLSAgd2hpbGUgKCFzdG9wXykgewotICAgIHRyeSB7Ci0gICAgICBjbGllbnQucmVzZXQoKTsKLSAgICAgIGlucHV0VHJhbnNwb3J0LnJlc2V0KCk7Ci0gICAgICBvdXRwdXRUcmFuc3BvcnQucmVzZXQoKTsKLSAgICAgIGlucHV0UHJvdG9jb2wucmVzZXQoKTsKLSAgICAgIG91dHB1dFByb3RvY29sLnJlc2V0KCk7Ci0KLSAgICAgIC8vIEZldGNoIGNsaWVudCBmcm9tIHNlcnZlcgotICAgICAgY2xpZW50ID0gc2VydmVyVHJhbnNwb3J0Xy0+YWNjZXB0KCk7Ci0KLSAgICAgIC8vIE1ha2UgSU8gdHJhbnNwb3J0cwotICAgICAgaW5wdXRUcmFuc3BvcnQgPSBpbnB1dFRyYW5zcG9ydEZhY3RvcnlfLT5nZXRUcmFuc3BvcnQoY2xpZW50KTsKLSAgICAgIG91dHB1dFRyYW5zcG9ydCA9IG91dHB1dFRyYW5zcG9ydEZhY3RvcnlfLT5nZXRUcmFuc3BvcnQoY2xpZW50KTsKLSAgICAgIGlucHV0UHJvdG9jb2wgPSBpbnB1dFByb3RvY29sRmFjdG9yeV8tPmdldFByb3RvY29sKGlucHV0VHJhbnNwb3J0KTsKLSAgICAgIG91dHB1dFByb3RvY29sID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5Xy0+Z2V0UHJvdG9jb2wob3V0cHV0VHJhbnNwb3J0KTsKLQotICAgICAgc2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IgPSBnZXRQcm9jZXNzb3IoaW5wdXRQcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFByb3RvY29sLCBjbGllbnQpOwotCi0gICAgICAvLyBBZGQgdG8gdGhyZWFkbWFuYWdlciBwb29sCi0gICAgICBzaGFyZWRfcHRyPFRUaHJlYWRQb29sU2VydmVyOjpUYXNrPiB0YXNrKG5ldyBUVGhyZWFkUG9vbFNlcnZlcjo6VGFzaygKLSAgICAgICAgICAgICp0aGlzLCBwcm9jZXNzb3IsIGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sLCBjbGllbnQpKTsKLSAgICAgIHRocmVhZE1hbmFnZXJfLT5hZGQodGFzaywgdGltZW91dF8sIHRhc2tFeHBpcmF0aW9uXyk7Ci0KLSAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJiB0dHgpIHsKLSAgICAgIGlmIChpbnB1dFRyYW5zcG9ydCkgeyBpbnB1dFRyYW5zcG9ydC0+Y2xvc2UoKTsgfQotICAgICAgaWYgKG91dHB1dFRyYW5zcG9ydCkgeyBvdXRwdXRUcmFuc3BvcnQtPmNsb3NlKCk7IH0KLSAgICAgIGlmIChjbGllbnQpIHsgY2xpZW50LT5jbG9zZSgpOyB9Ci0gICAgICBpZiAoIXN0b3BfIHx8IHR0eC5nZXRUeXBlKCkgIT0gVFRyYW5zcG9ydEV4Y2VwdGlvbjo6SU5URVJSVVBURUQpIHsKLSAgICAgICAgc3RyaW5nIGVyclN0ciA9IHN0cmluZygiVFRocmVhZFBvb2xTZXJ2ZXI6IFRTZXJ2ZXJUcmFuc3BvcnQgZGllZCBvbiBhY2NlcHQ6ICIpICsgdHR4LndoYXQoKTsKLSAgICAgICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKLSAgICAgIH0KLSAgICAgIGNvbnRpbnVlOwotICAgIH0gY2F0Y2ggKFRFeGNlcHRpb24mIHR4KSB7Ci0gICAgICBpZiAoaW5wdXRUcmFuc3BvcnQpIHsgaW5wdXRUcmFuc3BvcnQtPmNsb3NlKCk7IH0KLSAgICAgIGlmIChvdXRwdXRUcmFuc3BvcnQpIHsgb3V0cHV0VHJhbnNwb3J0LT5jbG9zZSgpOyB9Ci0gICAgICBpZiAoY2xpZW50KSB7IGNsaWVudC0+Y2xvc2UoKTsgfQotICAgICAgc3RyaW5nIGVyclN0ciA9IHN0cmluZygiVFRocmVhZFBvb2xTZXJ2ZXI6IENhdWdodCBURXhjZXB0aW9uOiAiKSArIHR4LndoYXQoKTsKLSAgICAgIEdsb2JhbE91dHB1dChlcnJTdHIuY19zdHIoKSk7Ci0gICAgICBjb250aW51ZTsKLSAgICB9IGNhdGNoIChzdHJpbmcgcykgewotICAgICAgaWYgKGlucHV0VHJhbnNwb3J0KSB7IGlucHV0VHJhbnNwb3J0LT5jbG9zZSgpOyB9Ci0gICAgICBpZiAob3V0cHV0VHJhbnNwb3J0KSB7IG91dHB1dFRyYW5zcG9ydC0+Y2xvc2UoKTsgfQotICAgICAgaWYgKGNsaWVudCkgeyBjbGllbnQtPmNsb3NlKCk7IH0KLSAgICAgIHN0cmluZyBlcnJTdHIgPSAiVFRocmVhZFBvb2xTZXJ2ZXI6IFVua25vd24gZXhjZXB0aW9uOiAiICsgczsKLSAgICAgIEdsb2JhbE91dHB1dChlcnJTdHIuY19zdHIoKSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICAvLyBJZiBzdG9wcGVkIG1hbnVhbGx5LCBqb2luIHRoZSBleGlzdGluZyB0aHJlYWRzCi0gIGlmIChzdG9wXykgewotICAgIHRyeSB7Ci0gICAgICBzZXJ2ZXJUcmFuc3BvcnRfLT5jbG9zZSgpOwotICAgICAgdGhyZWFkTWFuYWdlcl8tPmpvaW4oKTsKLSAgICB9IGNhdGNoIChURXhjZXB0aW9uICZ0eCkgewotICAgICAgc3RyaW5nIGVyclN0ciA9IHN0cmluZygiVFRocmVhZFBvb2xTZXJ2ZXI6IEV4Y2VwdGlvbiBzaHV0dGluZyBkb3duOiAiKSArIHR4LndoYXQoKTsKLSAgICAgIEdsb2JhbE91dHB1dChlcnJTdHIuY19zdHIoKSk7Ci0gICAgfQotICAgIHN0b3BfID0gZmFsc2U7Ci0gIH0KLQorICBUU2VydmVyRnJhbWV3b3JrOjpzZXJ2ZSgpOworICB0aHJlYWRNYW5hZ2VyXy0+c3RvcCgpOwogfQogCiBpbnQ2NF90IFRUaHJlYWRQb29sU2VydmVyOjpnZXRUaW1lb3V0KCkgY29uc3QgewpAQCAtMjA4LDQgKzExNSwxOCBAQAogICB0YXNrRXhwaXJhdGlvbl8gPSB2YWx1ZTsKIH0KIAotfX19IC8vIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXIKK3N0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZE1hbmFnZXI+CitUVGhyZWFkUG9vbFNlcnZlcjo6Z2V0VGhyZWFkTWFuYWdlcigpIGNvbnN0IHsKKyAgcmV0dXJuIHRocmVhZE1hbmFnZXJfOworfQorCit2b2lkIFRUaHJlYWRQb29sU2VydmVyOjpvbkNsaWVudENvbm5lY3RlZChjb25zdCBzaGFyZWRfcHRyPFRDb25uZWN0ZWRDbGllbnQ+JiBwQ2xpZW50KSB7CisgIHRocmVhZE1hbmFnZXJfLT5hZGQocENsaWVudCwgZ2V0VGltZW91dCgpLCBnZXRUYXNrRXhwaXJhdGlvbigpKTsKK30KKwordm9pZCBUVGhyZWFkUG9vbFNlcnZlcjo6b25DbGllbnREaXNjb25uZWN0ZWQoVENvbm5lY3RlZENsaWVudCopIHsKK30KKworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6c2VydmVyCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmggYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmgKaW5kZXggOGExZmMxNi4uMTIxOTk4YyAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuaApAQCAtMjAsMTE3ICsyMCw4MiBAQAogI2lmbmRlZiBfVEhSSUZUX1NFUlZFUl9UVEhSRUFEUE9PTFNFUlZFUl9IXwogI2RlZmluZSBfVEhSSUZUX1NFUlZFUl9UVEhSRUFEUE9PTFNFUlZFUl9IXyAxCiAKKyNpbmNsdWRlIDxhdG9taWM+CiAjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXIuaD4KLSNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RTZXJ2ZXIuaD4KLSNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJUcmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RTZXJ2ZXJGcmFtZXdvcmsuaD4KIAotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgorbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBzZXJ2ZXIgewogCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBzZXJ2ZXIgewotCi11c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZE1hbmFnZXI7Ci11c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk7Ci11c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0OwotdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk7Ci0KLWNsYXNzIFRUaHJlYWRQb29sU2VydmVyIDogcHVibGljIFRTZXJ2ZXIgewotIHB1YmxpYzoKLSAgY2xhc3MgVGFzazsKLQotICB0ZW1wbGF0ZTx0eXBlbmFtZSBQcm9jZXNzb3JGYWN0b3J5PgorLyoqCisgKiBNYW5hZ2UgY2xpZW50cyB1c2luZyBhIHRocmVhZCBwb29sLgorICovCitjbGFzcyBUVGhyZWFkUG9vbFNlcnZlciA6IHB1YmxpYyBUU2VydmVyRnJhbWV3b3JrIHsKK3B1YmxpYzoKICAgVFRocmVhZFBvb2xTZXJ2ZXIoCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4mIHRocmVhZE1hbmFnZXIsCi0gICAgICBUSFJJRlRfT1ZFUkxPQURfSUYoUHJvY2Vzc29yRmFjdG9yeSwgVFByb2Nlc3NvckZhY3RvcnkpKSA6Ci0gICAgVFNlcnZlcihwcm9jZXNzb3JGYWN0b3J5LCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICBwcm90b2NvbEZhY3RvcnkpLAotICAgIHRocmVhZE1hbmFnZXJfKHRocmVhZE1hbmFnZXIpLAotICAgIHN0b3BfKGZhbHNlKSwKLSAgICB0aW1lb3V0XygwKSwKLSAgICB0YXNrRXhwaXJhdGlvbl8oMCkge30KKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZE1hbmFnZXI+JiB0aHJlYWRNYW5hZ2VyCisgICAgICA9IGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkTWFuYWdlcjo6bmV3U2ltcGxlVGhyZWFkTWFuYWdlcigpKTsKIAotICB0ZW1wbGF0ZTx0eXBlbmFtZSBQcm9jZXNzb3I+CiAgIFRUaHJlYWRQb29sU2VydmVyKAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8UHJvY2Vzc29yPiYgcHJvY2Vzc29yLAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnksCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiYgdGhyZWFkTWFuYWdlciwKLSAgICAgIFRIUklGVF9PVkVSTE9BRF9JRihQcm9jZXNzb3IsIFRQcm9jZXNzb3IpKSA6Ci0gICAgVFNlcnZlcihwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KSwKLSAgICB0aHJlYWRNYW5hZ2VyXyh0aHJlYWRNYW5hZ2VyKSwKLSAgICBzdG9wXyhmYWxzZSksCi0gICAgdGltZW91dF8oMCksCi0gICAgdGFza0V4cGlyYXRpb25fKDApIHt9CisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkTWFuYWdlcj4mIHRocmVhZE1hbmFnZXIKKyAgICAgID0gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRNYW5hZ2VyOjpuZXdTaW1wbGVUaHJlYWRNYW5hZ2VyKCkpOwogCi0gIHRlbXBsYXRlPHR5cGVuYW1lIFByb2Nlc3NvckZhY3Rvcnk+CiAgIFRUaHJlYWRQb29sU2VydmVyKAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8UHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgaW5wdXRQcm90b2NvbEZhY3RvcnksCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4mIHRocmVhZE1hbmFnZXIsCi0gICAgICBUSFJJRlRfT1ZFUkxPQURfSUYoUHJvY2Vzc29yRmFjdG9yeSwgVFByb2Nlc3NvckZhY3RvcnkpKSA6Ci0gICAgVFNlcnZlcihwcm9jZXNzb3JGYWN0b3J5LCBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICAgICBpbnB1dFRyYW5zcG9ydEZhY3RvcnksIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KSwKLSAgICB0aHJlYWRNYW5hZ2VyXyh0aHJlYWRNYW5hZ2VyKSwKLSAgICBzdG9wXyhmYWxzZSksCi0gICAgdGltZW91dF8oMCksCi0gICAgdGFza0V4cGlyYXRpb25fKDApIHt9CisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBvdXRwdXRQcm90b2NvbEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRNYW5hZ2VyPiYgdGhyZWFkTWFuYWdlcgorICAgICAgPSBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZE1hbmFnZXI6Om5ld1NpbXBsZVRocmVhZE1hbmFnZXIoKSk7CiAKLSAgdGVtcGxhdGU8dHlwZW5hbWUgUHJvY2Vzc29yPgogICBUVGhyZWFkUG9vbFNlcnZlcigKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBpbnB1dFByb3RvY29sRmFjdG9yeSwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBvdXRwdXRQcm90b2NvbEZhY3RvcnksCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiYgdGhyZWFkTWFuYWdlciwKLSAgICAgIFRIUklGVF9PVkVSTE9BRF9JRihQcm9jZXNzb3IsIFRQcm9jZXNzb3IpKSA6Ci0gICAgVFNlcnZlcihwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgICAgIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5LCBvdXRwdXRQcm90b2NvbEZhY3RvcnkpLAotICAgIHRocmVhZE1hbmFnZXJfKHRocmVhZE1hbmFnZXIpLAotICAgIHN0b3BfKGZhbHNlKSwKLSAgICB0aW1lb3V0XygwKSwKLSAgICB0YXNrRXhwaXJhdGlvbl8oMCkge30KKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBvdXRwdXRQcm90b2NvbEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRNYW5hZ2VyPiYgdGhyZWFkTWFuYWdlcgorICAgICAgPSBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZE1hbmFnZXI6Om5ld1NpbXBsZVRocmVhZE1hbmFnZXIoKSk7CiAKICAgdmlydHVhbCB+VFRocmVhZFBvb2xTZXJ2ZXIoKTsKIAorICAvKioKKyAgICogUG9zdC1jb25kaXRpb25zIChyZXR1cm4gZ3VhcmFudGVlcyk6CisgICAqICAgVGhlcmUgd2lsbCBiZSBubyBjbGllbnRzIGNvbm5lY3RlZC4KKyAgICovCiAgIHZpcnR1YWwgdm9pZCBzZXJ2ZSgpOwogCiAgIHZpcnR1YWwgaW50NjRfdCBnZXRUaW1lb3V0KCkgY29uc3Q7Ci0KICAgdmlydHVhbCB2b2lkIHNldFRpbWVvdXQoaW50NjRfdCB2YWx1ZSk7CiAKLSAgdmlydHVhbCB2b2lkIHN0b3AoKSB7Ci0gICAgc3RvcF8gPSB0cnVlOwotICAgIHNlcnZlclRyYW5zcG9ydF8tPmludGVycnVwdCgpOwotICB9Ci0KICAgdmlydHVhbCBpbnQ2NF90IGdldFRhc2tFeHBpcmF0aW9uKCkgY29uc3Q7Ci0KICAgdmlydHVhbCB2b2lkIHNldFRhc2tFeHBpcmF0aW9uKGludDY0X3QgdmFsdWUpOwogCi0gcHJvdGVjdGVkOgorICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZE1hbmFnZXI+IGdldFRocmVhZE1hbmFnZXIoKSBjb25zdDsKIAotICBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyXzsKK3Byb3RlY3RlZDoKKyAgdmlydHVhbCB2b2lkIG9uQ2xpZW50Q29ubmVjdGVkKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUQ29ubmVjdGVkQ2xpZW50PiYgcENsaWVudCkgLyogb3ZlcnJpZGUgKi87CisgIHZpcnR1YWwgdm9pZCBvbkNsaWVudERpc2Nvbm5lY3RlZChUQ29ubmVjdGVkQ2xpZW50KiBwQ2xpZW50KSAvKiBvdmVycmlkZSAqLzsKIAotICB2b2xhdGlsZSBib29sIHN0b3BfOwotCi0gIHZvbGF0aWxlIGludDY0X3QgdGltZW91dF87Ci0KLSAgdm9sYXRpbGUgaW50NjRfdCB0YXNrRXhwaXJhdGlvbl87Ci0KKyAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlcl87CisgIHN0ZDo6YXRvbWljPGludDY0X3Q+IHRpbWVvdXRfOworICBzdGQ6OmF0b21pYzxpbnQ2NF90PiB0YXNrRXhwaXJhdGlvbl87CiB9OwogCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcgorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6c2VydmVyCiAKICNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfU0VSVkVSX1RUSFJFQURQT09MU0VSVkVSX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RUaHJlYWRlZFNlcnZlci5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RUaHJlYWRlZFNlcnZlci5jcHAKaW5kZXggOTA5YzNjZS4uMjI2NGRmNyAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UVGhyZWFkZWRTZXJ2ZXIuY3BwCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFRocmVhZGVkU2VydmVyLmNwcApAQCAtMTcsMjI1ICsxNywxMzcgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RUaHJlYWRlZFNlcnZlci5oPgotI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5oPgotI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9QbGF0Zm9ybVRocmVhZEZhY3RvcnkuaD4KLQogI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1BsYXRmb3JtVGhyZWFkRmFjdG9yeS5oPgorI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFRocmVhZGVkU2VydmVyLmg+CiAKLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2Ugc2VydmVyIHsKIAotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2Ugc2VydmVyIHsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6UnVubmFibGU7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlN5bmNocm9uaXplZDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRGYWN0b3J5OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk7Cit1c2luZyBzdGQ6Om1ha2Vfc2hhcmVkOwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk7CiAKLXVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOwotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLXVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDsKLXVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w7Ci11c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDsKLXVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k7Ci0KLWNsYXNzIFRUaHJlYWRlZFNlcnZlcjo6VGFzazogcHVibGljIFJ1bm5hYmxlIHsKLQotcHVibGljOgotCi0gIFRhc2soVFRocmVhZGVkU2VydmVyJiBzZXJ2ZXIsCi0gICAgICAgc2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IsCi0gICAgICAgc2hhcmVkX3B0cjxUUHJvdG9jb2w+IGlucHV0LAotICAgICAgIHNoYXJlZF9wdHI8VFByb3RvY29sPiBvdXRwdXQsCi0gICAgICAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQpIDoKLSAgICBzZXJ2ZXJfKHNlcnZlciksCi0gICAgcHJvY2Vzc29yXyhwcm9jZXNzb3IpLAotICAgIGlucHV0XyhpbnB1dCksCi0gICAgb3V0cHV0XyhvdXRwdXQpLAotICAgIHRyYW5zcG9ydF8odHJhbnNwb3J0KSB7Ci0gIH0KLQotICB+VGFzaygpIHt9Ci0KLSAgdm9pZCBydW4oKSB7Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlckV2ZW50SGFuZGxlcj4gZXZlbnRIYW5kbGVyID0KLSAgICAgIHNlcnZlcl8uZ2V0RXZlbnRIYW5kbGVyKCk7Ci0gICAgdm9pZCogY29ubmVjdGlvbkNvbnRleHQgPSBOVUxMOwotICAgIGlmIChldmVudEhhbmRsZXIpIHsKLSAgICAgIGNvbm5lY3Rpb25Db250ZXh0ID0gZXZlbnRIYW5kbGVyLT5jcmVhdGVDb250ZXh0KGlucHV0Xywgb3V0cHV0Xyk7Ci0gICAgfQotICAgIHRyeSB7Ci0gICAgICBmb3IgKDs7KSB7Ci0gICAgICAgIGlmIChldmVudEhhbmRsZXIpIHsKLSAgICAgICAgICBldmVudEhhbmRsZXItPnByb2Nlc3NDb250ZXh0KGNvbm5lY3Rpb25Db250ZXh0LCB0cmFuc3BvcnRfKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIXByb2Nlc3Nvcl8tPnByb2Nlc3MoaW5wdXRfLCBvdXRwdXRfLCBjb25uZWN0aW9uQ29udGV4dCkgfHwKLSAgICAgICAgICAgICFpbnB1dF8tPmdldFRyYW5zcG9ydCgpLT5wZWVrKCkpIHsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gY2F0Y2ggKGNvbnN0IFRUcmFuc3BvcnRFeGNlcHRpb24mIHR0eCkgewotICAgICAgaWYgKHR0eC5nZXRUeXBlKCkgIT0gVFRyYW5zcG9ydEV4Y2VwdGlvbjo6RU5EX09GX0ZJTEUpIHsKLSAgICAgICAgc3RyaW5nIGVyclN0ciA9IHN0cmluZygiVFRocmVhZGVkU2VydmVyIGNsaWVudCBkaWVkOiAiKSArIHR0eC53aGF0KCk7Ci0gICAgICAgIEdsb2JhbE91dHB1dChlcnJTdHIuY19zdHIoKSk7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoY29uc3Qgc3RkOjpleGNlcHRpb24gJngpIHsKLSAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoIlRUaHJlYWRlZFNlcnZlciBleGNlcHRpb246ICVzOiAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVpZCh4KS5uYW1lKCksIHgud2hhdCgpKTsKLSAgICB9IGNhdGNoICguLi4pIHsKLSAgICAgIEdsb2JhbE91dHB1dCgiVFRocmVhZGVkU2VydmVyIHVuY2F1Z2h0IGV4Y2VwdGlvbi4iKTsKLSAgICB9Ci0gICAgaWYgKGV2ZW50SGFuZGxlcikgewotICAgICAgZXZlbnRIYW5kbGVyLT5kZWxldGVDb250ZXh0KGNvbm5lY3Rpb25Db250ZXh0LCBpbnB1dF8sIG91dHB1dF8pOwotICAgIH0KLQotICAgIHRyeSB7Ci0gICAgICBpbnB1dF8tPmdldFRyYW5zcG9ydCgpLT5jbG9zZSgpOwotICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mIHR0eCkgewotICAgICAgc3RyaW5nIGVyclN0ciA9IHN0cmluZygiVFRocmVhZGVkU2VydmVyIGlucHV0IGNsb3NlIGZhaWxlZDogIikgKyB0dHgud2hhdCgpOwotICAgICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKLSAgICB9Ci0gICAgdHJ5IHsKLSAgICAgIG91dHB1dF8tPmdldFRyYW5zcG9ydCgpLT5jbG9zZSgpOwotICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mIHR0eCkgewotICAgICAgc3RyaW5nIGVyclN0ciA9IHN0cmluZygiVFRocmVhZGVkU2VydmVyIG91dHB1dCBjbG9zZSBmYWlsZWQ6ICIpICsgdHR4LndoYXQoKTsKLSAgICAgIEdsb2JhbE91dHB1dChlcnJTdHIuY19zdHIoKSk7Ci0gICAgfQotCi0gICAgLy8gUmVtb3ZlIHRoaXMgdGFzayBmcm9tIHBhcmVudCBib29ra2VlcGluZwotICAgIHsKLSAgICAgIFN5bmNocm9uaXplZCBzKHNlcnZlcl8udGFza3NNb25pdG9yXyk7Ci0gICAgICBzZXJ2ZXJfLnRhc2tzXy5lcmFzZSh0aGlzKTsKLSAgICAgIGlmIChzZXJ2ZXJfLnRhc2tzXy5lbXB0eSgpKSB7Ci0gICAgICAgIHNlcnZlcl8udGFza3NNb25pdG9yXy5ub3RpZnkoKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgfQotCi0gcHJpdmF0ZToKLSAgVFRocmVhZGVkU2VydmVyJiBzZXJ2ZXJfOwotICBmcmllbmQgY2xhc3MgVFRocmVhZGVkU2VydmVyOwotCi0gIHNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yXzsKLSAgc2hhcmVkX3B0cjxUUHJvdG9jb2w+IGlucHV0XzsKLSAgc2hhcmVkX3B0cjxUUHJvdG9jb2w+IG91dHB1dF87Ci0gIHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0XzsKLX07Ci0KLXZvaWQgVFRocmVhZGVkU2VydmVyOjppbml0KCkgewotICBzdG9wXyA9IGZhbHNlOwotCi0gIGlmICghdGhyZWFkRmFjdG9yeV8pIHsKLSAgICB0aHJlYWRGYWN0b3J5Xy5yZXNldChuZXcgUGxhdGZvcm1UaHJlYWRGYWN0b3J5KTsKLSAgfQorVFRocmVhZGVkU2VydmVyOjpUVGhyZWFkZWRTZXJ2ZXIoY29uc3Qgc2hhcmVkX3B0cjxUUHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VGhyZWFkRmFjdG9yeT4mIHRocmVhZEZhY3RvcnkpCisgIDogVFNlcnZlckZyYW1ld29yayhwcm9jZXNzb3JGYWN0b3J5LCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSksCisgICAgdGhyZWFkRmFjdG9yeV8odGhyZWFkRmFjdG9yeSkgewogfQogCi1UVGhyZWFkZWRTZXJ2ZXI6On5UVGhyZWFkZWRTZXJ2ZXIoKSB7fQorVFRocmVhZGVkU2VydmVyOjpUVGhyZWFkZWRTZXJ2ZXIoY29uc3Qgc2hhcmVkX3B0cjxUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRocmVhZEZhY3Rvcnk+JiB0aHJlYWRGYWN0b3J5KQorICA6IFRTZXJ2ZXJGcmFtZXdvcmsocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSksCisgICAgdGhyZWFkRmFjdG9yeV8odGhyZWFkRmFjdG9yeSkgeworfQorCitUVGhyZWFkZWRTZXJ2ZXI6OlRUaHJlYWRlZFNlcnZlcihjb25zdCBzaGFyZWRfcHRyPFRQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUaHJlYWRGYWN0b3J5PiYgdGhyZWFkRmFjdG9yeSkKKyAgOiBUU2VydmVyRnJhbWV3b3JrKHByb2Nlc3NvckZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQcm90b2NvbEZhY3RvcnkpLAorICAgIHRocmVhZEZhY3RvcnlfKHRocmVhZEZhY3RvcnkpIHsKK30KKworVFRocmVhZGVkU2VydmVyOjpUVGhyZWFkZWRTZXJ2ZXIoY29uc3Qgc2hhcmVkX3B0cjxUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBvdXRwdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRocmVhZEZhY3Rvcnk+JiB0aHJlYWRGYWN0b3J5KQorICA6IFRTZXJ2ZXJGcmFtZXdvcmsocHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KSwKKyAgICB0aHJlYWRGYWN0b3J5Xyh0aHJlYWRGYWN0b3J5KSB7Cit9CisKK1RUaHJlYWRlZFNlcnZlcjo6flRUaHJlYWRlZFNlcnZlcigpIHsKK30KIAogdm9pZCBUVGhyZWFkZWRTZXJ2ZXI6OnNlcnZlKCkgeworICBUU2VydmVyRnJhbWV3b3JrOjpzZXJ2ZSgpOwogCi0gIHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gY2xpZW50OwotICBzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGlucHV0VHJhbnNwb3J0OwotICBzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IG91dHB1dFRyYW5zcG9ydDsKLSAgc2hhcmVkX3B0cjxUUHJvdG9jb2w+IGlucHV0UHJvdG9jb2w7Ci0gIHNoYXJlZF9wdHI8VFByb3RvY29sPiBvdXRwdXRQcm90b2NvbDsKLQotICAvLyBTdGFydCB0aGUgc2VydmVyIGxpc3RlbmluZwotICBzZXJ2ZXJUcmFuc3BvcnRfLT5saXN0ZW4oKTsKLQotICAvLyBSdW4gdGhlIHByZVNlcnZlIGV2ZW50Ci0gIGlmIChldmVudEhhbmRsZXJfKSB7Ci0gICAgZXZlbnRIYW5kbGVyXy0+cHJlU2VydmUoKTsKKyAgLy8gRW5zdXJlIHBvc3QtY29uZGl0aW9uIG9mIG5vIGFjdGl2ZSBjbGllbnRzCisgIFN5bmNocm9uaXplZCBzKGNsaWVudE1vbml0b3JfKTsKKyAgd2hpbGUgKCFhY3RpdmVDbGllbnRNYXBfLmVtcHR5KCkpIHsKKyAgICBjbGllbnRNb25pdG9yXy53YWl0KCk7CiAgIH0KIAotICB3aGlsZSAoIXN0b3BfKSB7Ci0gICAgdHJ5IHsKLSAgICAgIGNsaWVudC5yZXNldCgpOwotICAgICAgaW5wdXRUcmFuc3BvcnQucmVzZXQoKTsKLSAgICAgIG91dHB1dFRyYW5zcG9ydC5yZXNldCgpOwotICAgICAgaW5wdXRQcm90b2NvbC5yZXNldCgpOwotICAgICAgb3V0cHV0UHJvdG9jb2wucmVzZXQoKTsKLQotICAgICAgLy8gRmV0Y2ggY2xpZW50IGZyb20gc2VydmVyCi0gICAgICBjbGllbnQgPSBzZXJ2ZXJUcmFuc3BvcnRfLT5hY2NlcHQoKTsKLQotICAgICAgLy8gTWFrZSBJTyB0cmFuc3BvcnRzCi0gICAgICBpbnB1dFRyYW5zcG9ydCA9IGlucHV0VHJhbnNwb3J0RmFjdG9yeV8tPmdldFRyYW5zcG9ydChjbGllbnQpOwotICAgICAgb3V0cHV0VHJhbnNwb3J0ID0gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeV8tPmdldFRyYW5zcG9ydChjbGllbnQpOwotICAgICAgaW5wdXRQcm90b2NvbCA9IGlucHV0UHJvdG9jb2xGYWN0b3J5Xy0+Z2V0UHJvdG9jb2woaW5wdXRUcmFuc3BvcnQpOwotICAgICAgb3V0cHV0UHJvdG9jb2wgPSBvdXRwdXRQcm90b2NvbEZhY3RvcnlfLT5nZXRQcm90b2NvbChvdXRwdXRUcmFuc3BvcnQpOwotCi0gICAgICBzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvciA9IGdldFByb2Nlc3NvcihpbnB1dFByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2wsIGNsaWVudCk7Ci0KLSAgICAgIFRUaHJlYWRlZFNlcnZlcjo6VGFzayogdGFzayA9IG5ldyBUVGhyZWFkZWRTZXJ2ZXI6OlRhc2soKnRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRQcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudCk7Ci0KLSAgICAgIC8vIENyZWF0ZSBhIHRhc2sKLSAgICAgIHNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlID0KLSAgICAgICAgc2hhcmVkX3B0cjxSdW5uYWJsZT4odGFzayk7Ci0KLSAgICAgIC8vIENyZWF0ZSBhIHRocmVhZCBmb3IgdGhpcyB0YXNrCi0gICAgICBzaGFyZWRfcHRyPFRocmVhZD4gdGhyZWFkID0KLSAgICAgICAgc2hhcmVkX3B0cjxUaHJlYWQ+KHRocmVhZEZhY3RvcnlfLT5uZXdUaHJlYWQocnVubmFibGUpKTsKLQotICAgICAgLy8gSW5zZXJ0IHRocmVhZCBpbnRvIHRoZSBzZXQgb2YgdGhyZWFkcwotICAgICAgewotICAgICAgICBTeW5jaHJvbml6ZWQgcyh0YXNrc01vbml0b3JfKTsKLSAgICAgICAgdGFza3NfLmluc2VydCh0YXNrKTsKLSAgICAgIH0KLQotICAgICAgLy8gU3RhcnQgdGhlIHRocmVhZCEKLSAgICAgIHRocmVhZC0+c3RhcnQoKTsKLQotICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mIHR0eCkgewotICAgICAgaWYgKGlucHV0VHJhbnNwb3J0KSB7IGlucHV0VHJhbnNwb3J0LT5jbG9zZSgpOyB9Ci0gICAgICBpZiAob3V0cHV0VHJhbnNwb3J0KSB7IG91dHB1dFRyYW5zcG9ydC0+Y2xvc2UoKTsgfQotICAgICAgaWYgKGNsaWVudCkgeyBjbGllbnQtPmNsb3NlKCk7IH0KLSAgICAgIGlmICghc3RvcF8gfHwgdHR4LmdldFR5cGUoKSAhPSBUVHJhbnNwb3J0RXhjZXB0aW9uOjpJTlRFUlJVUFRFRCkgewotICAgICAgICBzdHJpbmcgZXJyU3RyID0gc3RyaW5nKCJUVGhyZWFkZWRTZXJ2ZXI6IFRTZXJ2ZXJUcmFuc3BvcnQgZGllZCBvbiBhY2NlcHQ6ICIpICsgdHR4LndoYXQoKTsKLSAgICAgICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKLSAgICAgIH0KLSAgICAgIGNvbnRpbnVlOwotICAgIH0gY2F0Y2ggKFRFeGNlcHRpb24mIHR4KSB7Ci0gICAgICBpZiAoaW5wdXRUcmFuc3BvcnQpIHsgaW5wdXRUcmFuc3BvcnQtPmNsb3NlKCk7IH0KLSAgICAgIGlmIChvdXRwdXRUcmFuc3BvcnQpIHsgb3V0cHV0VHJhbnNwb3J0LT5jbG9zZSgpOyB9Ci0gICAgICBpZiAoY2xpZW50KSB7IGNsaWVudC0+Y2xvc2UoKTsgfQotICAgICAgc3RyaW5nIGVyclN0ciA9IHN0cmluZygiVFRocmVhZGVkU2VydmVyOiBDYXVnaHQgVEV4Y2VwdGlvbjogIikgKyB0eC53aGF0KCk7Ci0gICAgICBHbG9iYWxPdXRwdXQoZXJyU3RyLmNfc3RyKCkpOwotICAgICAgY29udGludWU7Ci0gICAgfSBjYXRjaCAoc3RyaW5nIHMpIHsKLSAgICAgIGlmIChpbnB1dFRyYW5zcG9ydCkgeyBpbnB1dFRyYW5zcG9ydC0+Y2xvc2UoKTsgfQotICAgICAgaWYgKG91dHB1dFRyYW5zcG9ydCkgeyBvdXRwdXRUcmFuc3BvcnQtPmNsb3NlKCk7IH0KLSAgICAgIGlmIChjbGllbnQpIHsgY2xpZW50LT5jbG9zZSgpOyB9Ci0gICAgICBzdHJpbmcgZXJyU3RyID0gIlRUaHJlYWRlZFNlcnZlcjogVW5rbm93biBleGNlcHRpb246ICIgKyBzOwotICAgICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi0gIC8vIElmIHN0b3BwZWQgbWFudWFsbHksIG1ha2Ugc3VyZSB0byBjbG9zZSBzZXJ2ZXIgdHJhbnNwb3J0Ci0gIGlmIChzdG9wXykgewotICAgIHRyeSB7Ci0gICAgICBzZXJ2ZXJUcmFuc3BvcnRfLT5jbG9zZSgpOwotICAgIH0gY2F0Y2ggKFRFeGNlcHRpb24gJnR4KSB7Ci0gICAgICBzdHJpbmcgZXJyU3RyID0gc3RyaW5nKCJUVGhyZWFkZWRTZXJ2ZXI6IEV4Y2VwdGlvbiBzaHV0dGluZyBkb3duOiAiKSArIHR4LndoYXQoKTsKLSAgICAgIEdsb2JhbE91dHB1dChlcnJTdHIuY19zdHIoKSk7Ci0gICAgfQotICAgIHRyeSB7Ci0gICAgICBTeW5jaHJvbml6ZWQgcyh0YXNrc01vbml0b3JfKTsKLSAgICAgIHdoaWxlICghdGFza3NfLmVtcHR5KCkpIHsKLSAgICAgICAgdGFza3NNb25pdG9yXy53YWl0KCk7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVEV4Y2VwdGlvbiAmdHgpIHsKLSAgICAgIHN0cmluZyBlcnJTdHIgPSBzdHJpbmcoIlRUaHJlYWRlZFNlcnZlcjogRXhjZXB0aW9uIGpvaW5pbmcgd29ya2VyczogIikgKyB0eC53aGF0KCk7Ci0gICAgICBHbG9iYWxPdXRwdXQoZXJyU3RyLmNfc3RyKCkpOwotICAgIH0KLSAgICBzdG9wXyA9IGZhbHNlOwotICB9Ci0KKyAgZHJhaW5EZWFkQ2xpZW50cygpOwogfQogCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcgordm9pZCBUVGhyZWFkZWRTZXJ2ZXI6OmRyYWluRGVhZENsaWVudHMoKSB7CisgIC8vIHdlJ3JlIGluIGEgbW9uaXRvciBoZXJlCisgIHdoaWxlICghZGVhZENsaWVudE1hcF8uZW1wdHkoKSkgeworICAgIENsaWVudE1hcDo6aXRlcmF0b3IgaXQgPSBkZWFkQ2xpZW50TWFwXy5iZWdpbigpOworICAgIGl0LT5zZWNvbmQtPmpvaW4oKTsKKyAgICBkZWFkQ2xpZW50TWFwXy5lcmFzZShpdCk7CisgIH0KK30KKwordm9pZCBUVGhyZWFkZWRTZXJ2ZXI6Om9uQ2xpZW50Q29ubmVjdGVkKGNvbnN0IHNoYXJlZF9wdHI8VENvbm5lY3RlZENsaWVudD4mIHBDbGllbnQpIHsKKyAgU3luY2hyb25pemVkIHN5bmMoY2xpZW50TW9uaXRvcl8pOworICBzaGFyZWRfcHRyPFRDb25uZWN0ZWRDbGllbnRSdW5uZXI+IHBSdW5uYWJsZSA9IG1ha2Vfc2hhcmVkPFRDb25uZWN0ZWRDbGllbnRSdW5uZXI+KHBDbGllbnQpOworICBzaGFyZWRfcHRyPFRocmVhZD4gcFRocmVhZCA9IHRocmVhZEZhY3RvcnlfLT5uZXdUaHJlYWQocFJ1bm5hYmxlKTsKKyAgcFJ1bm5hYmxlLT50aHJlYWQocFRocmVhZCk7CisgIGFjdGl2ZUNsaWVudE1hcF8uaW5zZXJ0KENsaWVudE1hcDo6dmFsdWVfdHlwZShwQ2xpZW50LmdldCgpLCBwVGhyZWFkKSk7CisgIHBUaHJlYWQtPnN0YXJ0KCk7Cit9CisKK3ZvaWQgVFRocmVhZGVkU2VydmVyOjpvbkNsaWVudERpc2Nvbm5lY3RlZChUQ29ubmVjdGVkQ2xpZW50KiBwQ2xpZW50KSB7CisgIFN5bmNocm9uaXplZCBzeW5jKGNsaWVudE1vbml0b3JfKTsKKyAgZHJhaW5EZWFkQ2xpZW50cygpOyAvLyB1c2UgdGhlIG91dGdvaW5nIHRocmVhZCB0byBkbyBzb21lIG1haW50ZW5hbmNlIG9uIG91ciBkZWFkIGNsaWVudCBiYWNrbG9nCisgIENsaWVudE1hcDo6aXRlcmF0b3IgaXQgPSBhY3RpdmVDbGllbnRNYXBfLmZpbmQocENsaWVudCk7CisgIGlmIChpdCAhPSBhY3RpdmVDbGllbnRNYXBfLmVuZCgpKSB7CisgICAgQ2xpZW50TWFwOjppdGVyYXRvciBlbmQgPSBpdDsKKyAgICBkZWFkQ2xpZW50TWFwXy5pbnNlcnQoaXQsICsrZW5kKTsKKyAgICBhY3RpdmVDbGllbnRNYXBfLmVyYXNlKGl0KTsKKyAgfQorICBpZiAoYWN0aXZlQ2xpZW50TWFwXy5lbXB0eSgpKSB7CisgICAgY2xpZW50TW9uaXRvcl8ubm90aWZ5KCk7CisgIH0KK30KKworVFRocmVhZGVkU2VydmVyOjpUQ29ubmVjdGVkQ2xpZW50UnVubmVyOjpUQ29ubmVjdGVkQ2xpZW50UnVubmVyKGNvbnN0IHNoYXJlZF9wdHI8VENvbm5lY3RlZENsaWVudD4mIHBDbGllbnQpCisgIDogcENsaWVudF8ocENsaWVudCkgeworfQorCitUVGhyZWFkZWRTZXJ2ZXI6OlRDb25uZWN0ZWRDbGllbnRSdW5uZXI6On5UQ29ubmVjdGVkQ2xpZW50UnVubmVyKCkgeworfQorCit2b2lkIFRUaHJlYWRlZFNlcnZlcjo6VENvbm5lY3RlZENsaWVudFJ1bm5lcjo6cnVuKCkgLyogb3ZlcnJpZGUgKi8geworICBwQ2xpZW50Xy0+cnVuKCk7ICAvLyBSdW4gdGhlIGNsaWVudAorICBwQ2xpZW50Xy5yZXNldCgpOyAvLyBUaGUgY2xpZW50IGlzIGRvbmUgLSByZWxlYXNlIGl0IGhlcmUgcmF0aGVyIHRoYW4gaW4gdGhlIGRlc3RydWN0b3IgZm9yIHNhZmV0eQorfQorCit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXIKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFRocmVhZGVkU2VydmVyLmggYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RUaHJlYWRlZFNlcnZlci5oCmluZGV4IGY5NjVmY2QuLmM1Y2NkMDMgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFRocmVhZGVkU2VydmVyLmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UVGhyZWFkZWRTZXJ2ZXIuaApAQCAtMjAsMTI2ICsyMCwxMjQgQEAKICNpZm5kZWYgX1RIUklGVF9TRVJWRVJfVFRIUkVBREVEU0VSVkVSX0hfCiAjZGVmaW5lIF9USFJJRlRfU0VSVkVSX1RUSFJFQURFRFNFUlZFUl9IXyAxCiAKLSNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RTZXJ2ZXIuaD4KLSNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJUcmFuc3BvcnQuaD4KKyNpbmNsdWRlIDxtYXA+CiAjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L01vbml0b3IuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvUGxhdGZvcm1UaHJlYWRGYWN0b3J5Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZC5oPgorI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFNlcnZlckZyYW1ld29yay5oPgogCi0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+CituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHNlcnZlciB7CiAKLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHNlcnZlciB7CisvKioKKyAqIE1hbmFnZSBjbGllbnRzIHVzaW5nIHRocmVhZHMgLSB0aHJlYWRzIGFyZSBjcmVhdGVkIG9uZSBmb3IgZWFjaCBjbGllbnQgYW5kIGFyZQorICogcmVsZWFzZWQgd2hlbiB0aGUgY2xpZW50IGRpc2Nvbm5lY3RzLiAgVGhpcyBzZXJ2ZXIgaXMgdXNlZCB0byBtYWtlIGEgZHluYW1pY2FsbHkKKyAqIHNjYWxhYmxlIHNlcnZlciB1cCB0byB0aGUgY29uY3VycmVudCBjb25uZWN0aW9uIGxpbWl0LgorICovCitjbGFzcyBUVGhyZWFkZWRTZXJ2ZXIgOiBwdWJsaWMgVFNlcnZlckZyYW1ld29yayB7CitwdWJsaWM6CisgIFRUaHJlYWRlZFNlcnZlcigKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZEZhY3Rvcnk+JiB0aHJlYWRGYWN0b3J5CisgICAgICA9IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZEZhY3Rvcnk+KAorICAgICAgICAgIG5ldyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlBsYXRmb3JtVGhyZWFkRmFjdG9yeShmYWxzZSkpKTsKIAotdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3I7Ci11c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0OwotdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk7Ci11c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6Ok1vbml0b3I7Ci11c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZEZhY3Rvcnk7CisgIFRUaHJlYWRlZFNlcnZlcigKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRGYWN0b3J5PiYgdGhyZWFkRmFjdG9yeQorICAgICAgPSBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRGYWN0b3J5PigKKyAgICAgICAgICBuZXcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpQbGF0Zm9ybVRocmVhZEZhY3RvcnkoZmFsc2UpKSk7CiAKLWNsYXNzIFRUaHJlYWRlZFNlcnZlciA6IHB1YmxpYyBUU2VydmVyIHsKKyAgVFRocmVhZGVkU2VydmVyKAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkRmFjdG9yeT4mIHRocmVhZEZhY3RvcnkKKyAgICAgID0gc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkRmFjdG9yeT4oCisgICAgICAgICAgbmV3IGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6UGxhdGZvcm1UaHJlYWRGYWN0b3J5KGZhbHNlKSkpOwogCi0gcHVibGljOgotICBjbGFzcyBUYXNrOwotCi0gIHRlbXBsYXRlPHR5cGVuYW1lIFByb2Nlc3NvckZhY3Rvcnk+Ci0gIFRUaHJlYWRlZFNlcnZlcihjb25zdCBib29zdDo6c2hhcmVkX3B0cjxQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgVEhSSUZUX09WRVJMT0FEX0lGKFByb2Nlc3NvckZhY3RvcnksIFRQcm9jZXNzb3JGYWN0b3J5KSk7Ci0KLSAgdGVtcGxhdGU8dHlwZW5hbWUgUHJvY2Vzc29yRmFjdG9yeT4KLSAgVFRocmVhZGVkU2VydmVyKGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWRGYWN0b3J5PiYgdGhyZWFkRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgIFRIUklGVF9PVkVSTE9BRF9JRihQcm9jZXNzb3JGYWN0b3J5LCBUUHJvY2Vzc29yRmFjdG9yeSkpOwotCi0gIHRlbXBsYXRlPHR5cGVuYW1lIFByb2Nlc3Nvcj4KLSAgVFRocmVhZGVkU2VydmVyKGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgVEhSSUZUX09WRVJMT0FEX0lGKFByb2Nlc3NvciwgVFByb2Nlc3NvcikpOwotCi0gIHRlbXBsYXRlPHR5cGVuYW1lIFByb2Nlc3Nvcj4KLSAgVFRocmVhZGVkU2VydmVyKGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkRmFjdG9yeT4mIHRocmVhZEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICBUSFJJRlRfT1ZFUkxPQURfSUYoUHJvY2Vzc29yLCBUUHJvY2Vzc29yKSk7CisgIFRUaHJlYWRlZFNlcnZlcigKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBvdXRwdXRQcm90b2NvbEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRGYWN0b3J5PiYgdGhyZWFkRmFjdG9yeQorICAgICAgPSBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRGYWN0b3J5PigKKyAgICAgICAgICBuZXcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpQbGF0Zm9ybVRocmVhZEZhY3RvcnkoZmFsc2UpKSk7CiAKICAgdmlydHVhbCB+VFRocmVhZGVkU2VydmVyKCk7CiAKKyAgLyoqCisgICAqIFBvc3QtY29uZGl0aW9ucyAocmV0dXJuIGd1YXJhbnRlZXMpOgorICAgKiAgIFRoZXJlIHdpbGwgYmUgbm8gY2xpZW50cyBjb25uZWN0ZWQuCisgICAqLwogICB2aXJ0dWFsIHZvaWQgc2VydmUoKTsKIAotICB2b2lkIHN0b3AoKSB7Ci0gICAgc3RvcF8gPSB0cnVlOwotICAgIHNlcnZlclRyYW5zcG9ydF8tPmludGVycnVwdCgpOwotICB9Citwcm90ZWN0ZWQ6CisgIC8qKgorICAgKiBEcmFpbiByZWNlbnRseSBjb25uZWN0ZWQgY2xpZW50cyBieSBqb2luaW5nIHRoZWlyIHRocmVhZHMgLSB0aGlzIGlzIGRvbmUgbGF6aWx5IGJlY2F1c2UKKyAgICogd2UgY2Fubm90IGRvIGl0IGluc2lkZSB0aGUgdGhyZWFkIGNvbnRleHQgdGhhdCBpcyBkaXNjb25uZWN0aW5nLgorICAgKi8KKyAgdmlydHVhbCB2b2lkIGRyYWluRGVhZENsaWVudHMoKTsKIAotIHByb3RlY3RlZDoKLSAgdm9pZCBpbml0KCk7CisgIC8qKgorICAgKiBJbXBsZW1lbnRhdGlvbiBvZiBUU2VydmVyRnJhbWV3b3JrOjpvbkNsaWVudENvbm5lY3RlZAorICAgKi8KKyAgdmlydHVhbCB2b2lkIG9uQ2xpZW50Q29ubmVjdGVkKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUQ29ubmVjdGVkQ2xpZW50PiYgcENsaWVudCkgLyogb3ZlcnJpZGUgKi87CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkRmFjdG9yeT4gdGhyZWFkRmFjdG9yeV87Ci0gIHZvbGF0aWxlIGJvb2wgc3RvcF87CisgIC8qKgorICAgKiBJbXBsZW1lbnRhdGlvbiBvZiBUU2VydmVyRnJhbWV3b3JrOjpvbkNsaWVudERpc2Nvbm5lY3RlZAorICAgKi8KKyAgdmlydHVhbCB2b2lkIG9uQ2xpZW50RGlzY29ubmVjdGVkKFRDb25uZWN0ZWRDbGllbnQgKnBDbGllbnQpIC8qIG92ZXJyaWRlICovOwogCi0gIE1vbml0b3IgdGFza3NNb25pdG9yXzsKLSAgc3RkOjpzZXQ8VGFzayo+IHRhc2tzXzsKKyAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkRmFjdG9yeT4gdGhyZWFkRmFjdG9yeV87CiAKKyAgLyoqCisgICAqIEEgaGVscGVyIHdyYXBwZXIgdXNlZCB0byB3cmFwIHRoZSBjbGllbnQgaW4gc29tZXRoaW5nIHdlIGNhbiB1c2UgdG8gbWFpbnRhaW4KKyAgICogdGhlIGxpZmV0aW1lIG9mIHRoZSBjb25uZWN0ZWQgY2xpZW50IHdpdGhpbiBhIGRldGFjaGVkIHRocmVhZC4gIFdlIGNhbm5vdCBzaW1wbHkKKyAgICogdHJhY2sgdGhlIHRocmVhZHMgYmVjYXVzZSBhIHNoYXJlZF9wdHI8VGhyZWFkPiBoYW5ncyBvbiB0byB0aGUgUnVubmFibGUgaXQgaXMKKyAgICogcGFzc2VkLCBhbmQgVFNlcnZlckZyYW1ld29yayByZXF1aXJlcyB0aGUgcnVubmFibGUgKFRDb25uZWN0ZWRDbGllbnQpIHRvIGJlCisgICAqIGRlc3Ryb3llZCBpbiBvcmRlciB0byB3b3JrIHByb3Blcmx5LgorICAgKi8KKyAgY2xhc3MgVENvbm5lY3RlZENsaWVudFJ1bm5lciA6IHB1YmxpYyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlJ1bm5hYmxlCisgIHsKKyAgcHVibGljOgorICAgIFRDb25uZWN0ZWRDbGllbnRSdW5uZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRDb25uZWN0ZWRDbGllbnQ+JiBwQ2xpZW50KTsKKyAgICB2aXJ0dWFsIH5UQ29ubmVjdGVkQ2xpZW50UnVubmVyKCk7CisgICAgdm9pZCBydW4oKSAvKiBvdmVycmlkZSAqLzsKKyAgcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VENvbm5lY3RlZENsaWVudD4gcENsaWVudF87CisgIH07CisKKyAgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpNb25pdG9yIGNsaWVudE1vbml0b3JfOworCisgIHR5cGVkZWYgc3RkOjptYXA8VENvbm5lY3RlZENsaWVudCAqLCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWQ+ID4gQ2xpZW50TWFwOworCisgIC8qKgorICAgKiBBIG1hcCBvZiBhY3RpdmUgY2xpZW50cworICAgKi8KKyAgQ2xpZW50TWFwIGFjdGl2ZUNsaWVudE1hcF87CisKKyAgLyoqCisgICAqIEEgbWFwIG9mIGNsaWVudHMgdGhhdCBoYXZlIGRpc2Nvbm5lY3RlZCBidXQgdGhlaXIgdGhyZWFkcyBoYXZlIG5vdCBiZWVuIGpvaW5lZAorICAgKi8KKyAgQ2xpZW50TWFwIGRlYWRDbGllbnRNYXBfOwogfTsKIAotdGVtcGxhdGU8dHlwZW5hbWUgUHJvY2Vzc29yRmFjdG9yeT4KLVRUaHJlYWRlZFNlcnZlcjo6VFRocmVhZGVkU2VydmVyKAotICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5LAotICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiB0cmFuc3BvcnRGYWN0b3J5LAotICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnksCi0gICAgVEhSSUZUX09WRVJMT0FEX0lGX0RFRk4oUHJvY2Vzc29yRmFjdG9yeSwgVFByb2Nlc3NvckZhY3RvcnkpKSA6Ci0gIFRTZXJ2ZXIocHJvY2Vzc29yRmFjdG9yeSwgc2VydmVyVHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgIHByb3RvY29sRmFjdG9yeSkgewotICBpbml0KCk7CiB9Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIFByb2Nlc3NvckZhY3Rvcnk+Ci1UVGhyZWFkZWRTZXJ2ZXI6OlRUaHJlYWRlZFNlcnZlcigKLSAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwKLSAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAotICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKLSAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5LAotICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZEZhY3Rvcnk+JiB0aHJlYWRGYWN0b3J5LAotICAgIFRIUklGVF9PVkVSTE9BRF9JRl9ERUZOKFByb2Nlc3NvckZhY3RvcnksIFRQcm9jZXNzb3JGYWN0b3J5KSkgOgotICBUU2VydmVyKHByb2Nlc3NvckZhY3RvcnksIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICBwcm90b2NvbEZhY3RvcnkpLAotICB0aHJlYWRGYWN0b3J5Xyh0aHJlYWRGYWN0b3J5KSB7Ci0gIGluaXQoKTsKIH0KLQotdGVtcGxhdGU8dHlwZW5hbWUgUHJvY2Vzc29yPgotVFRocmVhZGVkU2VydmVyOjpUVGhyZWFkZWRTZXJ2ZXIoCi0gICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8UHJvY2Vzc29yPiYgcHJvY2Vzc29yLAotICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiB0cmFuc3BvcnRGYWN0b3J5LAotICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnksCi0gICAgVEhSSUZUX09WRVJMT0FEX0lGX0RFRk4oUHJvY2Vzc29yLCBUUHJvY2Vzc29yKSkgOgotICBUU2VydmVyKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpIHsKLSAgaW5pdCgpOwotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBQcm9jZXNzb3I+Ci1UVGhyZWFkZWRTZXJ2ZXI6OlRUaHJlYWRlZFNlcnZlcigKLSAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCi0gICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKLSAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCi0gICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSwKLSAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWRGYWN0b3J5PiYgdGhyZWFkRmFjdG9yeSwKLSAgICBUSFJJRlRfT1ZFUkxPQURfSUZfREVGTihQcm9jZXNzb3IsIFRQcm9jZXNzb3IpKSA6Ci0gIFRTZXJ2ZXIocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSksCi0gIHRocmVhZEZhY3RvcnlfKHRocmVhZEZhY3RvcnkpIHsKLSAgaW5pdCgpOwotfQotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcgorfSAvLyBhcGFjaGU6OnRocmlmdDo6c2VydmVyCiAKICNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfU0VSVkVSX1RUSFJFQURFRFNFUlZFUl9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RocmlmdC1jb25maWcuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC90aHJpZnQtY29uZmlnLmgKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCBiMWJjY2NiLi5kNjQ4NzA2Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC90aHJpZnQtY29uZmlnLmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RocmlmdC1jb25maWcuaApAQCAtMTgsNyArMTgsNyBAQAogICovCiAKICNpZmRlZiBfV0lOMzIKLSMgaW5jbHVkZSA8dGhyaWZ0L3dpbmRvd3MvY29uZmlnLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3dpbmRvd3MvY29uZmlnLmg+CiAjZWxzZQotIyBpbmNsdWRlIDx0aHJpZnQvY29uZmlnLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmZpZy5oPgogI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1BsYXRmb3JtU29ja2V0LmggYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1BsYXRmb3JtU29ja2V0LmgKaW5kZXggZDI4OTc4ZS4uOTU5MTA1OCAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9QbGF0Zm9ybVNvY2tldC5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvUGxhdGZvcm1Tb2NrZXQuaApAQCAtMTcsMTAgKzE3LDEzIEBACiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisvLyBjbGFuZy1mb3JtYXQgb2ZmCisKICNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfUExBVEZPUk1fU09DS0VUX0hfCiAjICBkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfUExBVEZPUk1fU09DS0VUX0hfCiAKICNpZmRlZiBfV0lOMzIKKyMgIGluY2x1ZGUgPHdpbnNvY2syLmg+CiAjICBkZWZpbmUgVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IgOjpXU0FHZXRMYXN0RXJyb3IoKQogIyAgZGVmaW5lIFRIUklGVF9FUlJOTyAoKl9lcnJubygpKQogIyAgZGVmaW5lIFRIUklGVF9FSU5QUk9HUkVTUyBXU0FFSU5QUk9HUkVTUwpAQCAtNDgsNiArNTEsOCBAQAogIyAgZGVmaW5lIFRIUklGVF9MU0VFSyBfbHNlZWsKICMgIGRlZmluZSBUSFJJRlRfV1JJVEUgX3dyaXRlCiAjICBkZWZpbmUgVEhSSUZUX1JFQUQgX3JlYWQKKyMgIGRlZmluZSBUSFJJRlRfSU9DVExfU09DS0VUIGlvY3Rsc29ja2V0CisjICBkZWZpbmUgVEhSSUZUX0lPQ1RMX1NPQ0tFVF9OVU1fQllURVNfVFlQRSB1X2xvbmcKICMgIGRlZmluZSBUSFJJRlRfRlNUQVQgX2ZzdGF0CiAjICBkZWZpbmUgVEhSSUZUX1NUQVQgX3N0YXQKICMgIGlmZGVmIF9XSU4zMl9XQ0UKQEAgLTU2LDcgKzYxLDExIEBACiAjICAgIGRlZmluZSBUSFJJRlRfR0FJX1NUUkVSUk9SIGdhaV9zdHJlcnJvckEKICMgIGVuZGlmCiAjICBkZWZpbmUgVEhSSUZUX1NTSVpFVCBwdHJkaWZmX3QKLSMgIGRlZmluZSBUSFJJRlRfU05QUklOVEYgX3NucHJpbnRmCisjICBpZiAoX01TQ19WRVIgPCAxOTAwKQorIyAgICBkZWZpbmUgVEhSSUZUX1NOUFJJTlRGIF9zbnByaW50ZgorIyAgZWxzZQorIyAgICBkZWZpbmUgVEhSSUZUX1NOUFJJTlRGIHNucHJpbnRmCisjICBlbmRpZgogIyAgZGVmaW5lIFRIUklGVF9TTEVFUF9TRUMgdGhyaWZ0X3NsZWVwCiAjICBkZWZpbmUgVEhSSUZUX1NMRUVQX1VTRUMgdGhyaWZ0X3VzbGVlcAogIyAgZGVmaW5lIFRIUklGVF9USU1FU1BFQyB0aHJpZnRfdGltZXNwZWMKQEAgLTcyLDYgKzgxLDkgQEAKICMgICAgZGVmaW5lIFRIUklGVF9QT0xMT1VUIFBPTExPVVQKICMgIGVuZGlmIC8vV0lOVkVSCiAjICBkZWZpbmUgVEhSSUZUX1NIVVRfUkRXUiBTRF9CT1RICisjICBpZiAhZGVmaW5lZChBSV9BRERSQ09ORklHKQorIyAgICBkZWZpbmUgQUlfQUREUkNPTkZJRyAweDAwMDAwNDAwCisjICBlbmRpZgogI2Vsc2UgLy9ub3QgX1dJTjMyCiAjICBpbmNsdWRlIDxlcnJuby5oPgogIyAgZGVmaW5lIFRIUklGVF9HRVRfU09DS0VUX0VSUk9SIGVycm5vCkBAIC0xMDEsNiArMTEzLDggQEAKICMgIGRlZmluZSBUSFJJRlRfTFNFRUsgbHNlZWsKICMgIGRlZmluZSBUSFJJRlRfV1JJVEUgd3JpdGUKICMgIGRlZmluZSBUSFJJRlRfUkVBRCByZWFkCisjICBkZWZpbmUgVEhSSUZUX0lPQ1RMX1NPQ0tFVCBpb2N0bAorIyAgZGVmaW5lIFRIUklGVF9JT0NUTF9TT0NLRVRfTlVNX0JZVEVTX1RZUEUgaW50CiAjICBkZWZpbmUgVEhSSUZUX1NUQVQgc3RhdAogIyAgZGVmaW5lIFRIUklGVF9GU1RBVCBmc3RhdAogIyAgZGVmaW5lIFRIUklGVF9HQUlfU1RSRVJST1IgZ2FpX3N0cmVycm9yCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuY3BwCmluZGV4IDE1ZDhmNTkuLjlhYzJmODQgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuY3BwCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuY3BwCkBAIC0yNCw4ICsyNCw5IEBACiAKIHVzaW5nIHN0ZDo6c3RyaW5nOwogCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0cmFuc3BvcnQgewotCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CiAKIHVpbnQzMl90IFRCdWZmZXJlZFRyYW5zcG9ydDo6cmVhZFNsb3codWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKICAgdWludDMyX3QgaGF2ZSA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihyQm91bmRfIC0gckJhc2VfKTsKQEAgLTYyLDcgKzYzLDcgQEAKIHZvaWQgVEJ1ZmZlcmVkVHJhbnNwb3J0Ojp3cml0ZVNsb3coY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKICAgdWludDMyX3QgaGF2ZV9ieXRlcyA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pih3QmFzZV8gLSB3QnVmXy5nZXQoKSk7CiAgIHVpbnQzMl90IHNwYWNlID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHdCb3VuZF8gLSB3QmFzZV8pOwotICAvLyBXZSBzaG91bGQgb25seSB0YWtlIHRoZSBzbG93IHBhdGggaWYgd2UgY2FuJ3QgYWNjb21vZGF0ZSB0aGUgd3JpdGUKKyAgLy8gV2Ugc2hvdWxkIG9ubHkgdGFrZSB0aGUgc2xvdyBwYXRoIGlmIHdlIGNhbid0IGFjY29tbW9kYXRlIHRoZSB3cml0ZQogICAvLyB3aXRoIHRoZSBmcmVlIHNwYWNlIGFscmVhZHkgaW4gdGhlIGJ1ZmZlci4KICAgYXNzZXJ0KHdCb3VuZF8gLSB3QmFzZV8gPCBzdGF0aWNfY2FzdDxwdHJkaWZmX3Q+KGxlbikpOwogCkBAIC04NSw3ICs4Niw3IEBACiAgIC8vIFRoZSBjYXNlIHdoZXJlIHdlIGhhdmUgdG8gZG8gdHdvIHN5c2NhbGxzLgogICAvLyBUaGlzIGNhc2UgYWxzbyBjb3ZlcnMgdGhlIGNhc2Ugd2hlcmUgdGhlIGJ1ZmZlciBpcyBlbXB0eSwKICAgLy8gYnV0IGl0IGlzIGNsZWFyZXIgKEkgdGhpbmspIHRvIHRoaW5rIG9mIGl0IGFzIHR3byBzZXBhcmF0ZSBjYXNlcy4KLSAgaWYgKChoYXZlX2J5dGVzICsgbGVuID49IDIqd0J1ZlNpemVfKSB8fCAoaGF2ZV9ieXRlcyA9PSAwKSkgeworICBpZiAoKGhhdmVfYnl0ZXMgKyBsZW4gPj0gMiAqIHdCdWZTaXplXykgfHwgKGhhdmVfYnl0ZXMgPT0gMCkpIHsKICAgICAvLyBUT0RPKGRyZWlzcyk6IHdyaXRldgogICAgIGlmIChoYXZlX2J5dGVzID4gMCkgewogICAgICAgdHJhbnNwb3J0Xy0+d3JpdGUod0J1Zl8uZ2V0KCksIGhhdmVfYnl0ZXMpOwpAQCAtMTA5LDE0ICsxMTAsMTQgQEAKIH0KIAogY29uc3QgdWludDhfdCogVEJ1ZmZlcmVkVHJhbnNwb3J0Ojpib3Jyb3dTbG93KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QqIGxlbikgewotICAodm9pZCkgYnVmOwotICAodm9pZCkgbGVuOworICAodm9pZClidWY7CisgICh2b2lkKWxlbjsKICAgLy8gU2ltcGx5IHJldHVybiBOVUxMLiAgV2UgZG9uJ3Qga25vdyBpZiB0aGVyZSBpcyBhY3R1YWxseSBkYXRhIGF2YWlsYWJsZSBvbgogICAvLyB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQsIHNvIGNhbGxpbmcgcmVhZCgpIG1pZ2h0IGJsb2NrLgogICByZXR1cm4gTlVMTDsKIH0KIAotdm9pZCBUQnVmZmVyZWRUcmFuc3BvcnQ6OmZsdXNoKCkgIHsKK3ZvaWQgVEJ1ZmZlcmVkVHJhbnNwb3J0OjpmbHVzaCgpIHsKICAgLy8gV3JpdGUgb3V0IGFueSBkYXRhIHdhaXRpbmcgaW4gdGhlIHdyaXRlIGJ1ZmZlci4KICAgdWludDMyX3QgaGF2ZV9ieXRlcyA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pih3QmFzZV8gLSB3QnVmXy5nZXQoKSk7CiAgIGlmIChoYXZlX2J5dGVzID4gMCkgewpAQCAtMTMxLDcgKzEzMiw2IEBACiAgIHRyYW5zcG9ydF8tPmZsdXNoKCk7CiB9CiAKLQogdWludDMyX3QgVEZyYW1lZFRyYW5zcG9ydDo6cmVhZFNsb3codWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKICAgdWludDMyX3Qgd2FudCA9IGxlbjsKICAgdWludDMyX3QgaGF2ZSA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihyQm91bmRfIC0gckJhc2VfKTsKQEAgLTE3OSw5ICsxNzksOCBAQAogICB1aW50MzJfdCBzaXplX2J5dGVzX3JlYWQgPSAwOwogICB3aGlsZSAoc2l6ZV9ieXRlc19yZWFkIDwgc2l6ZW9mKHN6KSkgewogICAgIHVpbnQ4X3QqIHN6cCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KCZzeikgKyBzaXplX2J5dGVzX3JlYWQ7Ci0gICAgdWludDMyX3QgYnl0ZXNfcmVhZCA9IHRyYW5zcG9ydF8tPnJlYWQoCi0gICAgICBzenAsCi0gICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc2l6ZW9mKHN6KSkgLSBzaXplX2J5dGVzX3JlYWQpOworICAgIHVpbnQzMl90IGJ5dGVzX3JlYWQKKyAgICAgICAgPSB0cmFuc3BvcnRfLT5yZWFkKHN6cCwgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHNpemVvZihzeikpIC0gc2l6ZV9ieXRlc19yZWFkKTsKICAgICBpZiAoYnl0ZXNfcmVhZCA9PSAwKSB7CiAgICAgICBpZiAoc2l6ZV9ieXRlc19yZWFkID09IDApIHsKICAgICAgICAgLy8gRU9GIGJlZm9yZSBhbnkgZGF0YSB3YXMgcmVhZC4KQEAgLTIwMiw2ICsyMDEsMTAgQEAKICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJGcmFtZSBzaXplIGhhcyBuZWdhdGl2ZSB2YWx1ZSIpOwogICB9CiAKKyAgLy8gQ2hlY2sgZm9yIG92ZXJzaXplZCBmcmFtZQorICBpZiAoc3ogPiBzdGF0aWNfY2FzdDxpbnQzMl90PihtYXhGcmFtZVNpemVfKSkKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkNPUlJVUFRFRF9EQVRBLCAiUmVjZWl2ZWQgYW4gb3ZlcnNpemVkIGZyYW1lIik7CisKICAgLy8gUmVhZCB0aGUgZnJhbWUgcGF5bG9hZCwgYW5kIHJlc2V0IG1hcmtlcnMuCiAgIGlmIChzeiA+IHN0YXRpY19jYXN0PGludDMyX3Q+KHJCdWZTaXplXykpIHsKICAgICByQnVmXy5yZXNldChuZXcgdWludDhfdFtzel0pOwpAQCAtMjE4LDcgKzIyMSw3IEBACiAgIHVpbnQzMl90IG5ld19zaXplID0gd0J1ZlNpemVfOwogICBpZiAobGVuICsgaGF2ZSA8IGhhdmUgLyogb3ZlcmZsb3cgKi8gfHwgbGVuICsgaGF2ZSA+IDB4N2ZmZmZmZmYpIHsKICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkJBRF9BUkdTLAotICAgICAgICAiQXR0ZW1wdGVkIHRvIHdyaXRlIG92ZXIgMiBHQiB0byBURnJhbWVkVHJhbnNwb3J0LiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkF0dGVtcHRlZCB0byB3cml0ZSBvdmVyIDIgR0IgdG8gVEZyYW1lZFRyYW5zcG9ydC4iKTsKICAgfQogICB3aGlsZSAobmV3X3NpemUgPCBsZW4gKyBoYXZlKSB7CiAgICAgbmV3X3NpemUgPSBuZXdfc2l6ZSA+IDAgPyBuZXdfc2l6ZSAqIDIgOiAxOwpAQCAtMjQ0LDcgKzI0Nyw3IEBACiAgIHdCYXNlXyArPSBsZW47CiB9CiAKLXZvaWQgVEZyYW1lZFRyYW5zcG9ydDo6Zmx1c2goKSAgewordm9pZCBURnJhbWVkVHJhbnNwb3J0OjpmbHVzaCgpIHsKICAgaW50MzJfdCBzel9oYm8sIHN6X25ibzsKICAgYXNzZXJ0KHdCdWZTaXplXyA+IHNpemVvZihzel9uYm8pKTsKIApAQCAtMjYxLDkgKzI2NCw3IEBACiAgICAgd0Jhc2VfID0gd0J1Zl8uZ2V0KCkgKyBzaXplb2Yoc3pfbmJvKTsKIAogICAgIC8vIFdyaXRlIHNpemUgYW5kIGZyYW1lIGJvZHkuCi0gICAgdHJhbnNwb3J0Xy0+d3JpdGUoCi0gICAgICB3QnVmXy5nZXQoKSwKLSAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihzaXplb2Yoc3pfbmJvKSkrc3pfaGJvKTsKKyAgICB0cmFuc3BvcnRfLT53cml0ZSh3QnVmXy5nZXQoKSwgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHNpemVvZihzel9uYm8pKSArIHN6X2hibyk7CiAgIH0KIAogICAvLyBGbHVzaCB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQuCkBAIC0yODYsOCArMjg3LDggQEAKIH0KIAogY29uc3QgdWludDhfdCogVEZyYW1lZFRyYW5zcG9ydDo6Ym9ycm93U2xvdyh1aW50OF90KiBidWYsIHVpbnQzMl90KiBsZW4pIHsKLSAgKHZvaWQpIGJ1ZjsKLSAgKHZvaWQpIGxlbjsKKyAgKHZvaWQpYnVmOworICAodm9pZClsZW47CiAgIC8vIERvbid0IHRyeSB0byBiZSBjbGV2ZXIgd2l0aCBzaGlmdGluZyBidWZmZXJzLgogICAvLyBJZiB0aGUgZmFzdCBwYXRoIGZhaWxlZCBsZXQgdGhlIHByb3RvY29sIHVzZSBpdHMgc2xvdyBwYXRoLgogICAvLyBCZXNpZGVzLCB3aG8gaXMgZ29pbmcgdG8gdHJ5IHRvIGJvcnJvdyBhY3Jvc3MgbWVzc2FnZXM/CkBAIC0yOTksOSArMzAwLDkgQEAKICAgdWludDMyX3QgYnl0ZXNfcmVhZCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihyQm91bmRfIC0gckJ1Zl8uZ2V0KCkgKyBzaXplb2YodWludDMyX3QpKTsKIAogICBpZiAockJ1ZlNpemVfID4gYnVmUmVjbGFpbVRocmVzaF8pIHsKLSAgICAgIHJCdWZTaXplXyA9IDA7Ci0gICAgICByQnVmXy5yZXNldCgpOwotICAgICAgc2V0UmVhZEJ1ZmZlcihyQnVmXy5nZXQoKSwgckJ1ZlNpemVfKTsKKyAgICByQnVmU2l6ZV8gPSAwOworICAgIHJCdWZfLnJlc2V0KCk7CisgICAgc2V0UmVhZEJ1ZmZlcihyQnVmXy5nZXQoKSwgckJ1ZlNpemVfKTsKICAgfQogCiAgIHJldHVybiBieXRlc19yZWFkOwpAQCAtMzYwLDI1ICszNjEsMjggQEAKICAgfQogCiAgIC8vIEdyb3cgdGhlIGJ1ZmZlciBhcyBuZWNlc3NhcnkuCi0gIHVpbnQzMl90IG5ld19zaXplID0gYnVmZmVyU2l6ZV87CisgIHVpbnQ2NF90IG5ld19zaXplID0gYnVmZmVyU2l6ZV87CiAgIHdoaWxlIChsZW4gPiBhdmFpbCkgewogICAgIG5ld19zaXplID0gbmV3X3NpemUgPiAwID8gbmV3X3NpemUgKiAyIDogMTsKLSAgICBhdmFpbCA9IGF2YWlsYWJsZV93cml0ZSgpICsgKG5ld19zaXplIC0gYnVmZmVyU2l6ZV8pOworICAgIGlmIChuZXdfc2l6ZSA+IG1heEJ1ZmZlclNpemVfKSB7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkJBRF9BUkdTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW50ZXJuYWwgYnVmZmVyIHNpemUgb3ZlcmZsb3ciKTsKKyAgICB9CisgICAgYXZhaWwgPSBhdmFpbGFibGVfd3JpdGUoKSArIChzdGF0aWNfY2FzdDx1aW50MzJfdD4obmV3X3NpemUpIC0gYnVmZmVyU2l6ZV8pOwogICB9CiAKICAgLy8gQWxsb2NhdGUgaW50byBhIG5ldyBwb2ludGVyIHNvIHdlIGRvbid0IGJvcmsgb3VycyBpZiBpdCBmYWlscy4KLSAgdm9pZCogbmV3X2J1ZmZlciA9IHN0ZDo6cmVhbGxvYyhidWZmZXJfLCBuZXdfc2l6ZSk7CisgIHVpbnQ4X3QqIG5ld19idWZmZXIgPSBzdGF0aWNfY2FzdDx1aW50OF90Kj4oc3RkOjpyZWFsbG9jKGJ1ZmZlcl8sIG5ld19zaXplKSk7CiAgIGlmIChuZXdfYnVmZmVyID09IE5VTEwpIHsKICAgICB0aHJvdyBzdGQ6OmJhZF9hbGxvYygpOwogICB9Ci0gIGJ1ZmZlclNpemVfID0gbmV3X3NpemU7CiAKLSAgcHRyZGlmZl90IG9mZnNldCA9ICh1aW50OF90KiluZXdfYnVmZmVyIC0gYnVmZmVyXzsKLSAgYnVmZmVyXyArPSBvZmZzZXQ7Ci0gIHJCYXNlXyArPSBvZmZzZXQ7Ci0gIHJCb3VuZF8gKz0gb2Zmc2V0OwotICB3QmFzZV8gKz0gb2Zmc2V0OwotICB3Qm91bmRfID0gYnVmZmVyXyArIGJ1ZmZlclNpemVfOworICByQmFzZV8gPSBuZXdfYnVmZmVyICsgKHJCYXNlXyAtIGJ1ZmZlcl8pOworICByQm91bmRfID0gbmV3X2J1ZmZlciArIChyQm91bmRfIC0gYnVmZmVyXyk7CisgIHdCYXNlXyA9IG5ld19idWZmZXIgKyAod0Jhc2VfIC0gYnVmZmVyXyk7CisgIHdCb3VuZF8gPSBuZXdfYnVmZmVyICsgbmV3X3NpemU7CisgIGJ1ZmZlcl8gPSBuZXdfYnVmZmVyOworICBidWZmZXJTaXplXyA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihuZXdfc2l6ZSk7CiB9CiAKIHZvaWQgVE1lbW9yeUJ1ZmZlcjo6d3JpdGVTbG93KGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CkBAIC0zOTgsNyArNDAyLDcgQEAKIH0KIAogY29uc3QgdWludDhfdCogVE1lbW9yeUJ1ZmZlcjo6Ym9ycm93U2xvdyh1aW50OF90KiBidWYsIHVpbnQzMl90KiBsZW4pIHsKLSAgKHZvaWQpIGJ1ZjsKKyAgKHZvaWQpYnVmOwogICByQm91bmRfID0gd0Jhc2VfOwogICBpZiAoYXZhaWxhYmxlX3JlYWQoKSA+PSAqbGVuKSB7CiAgICAgKmxlbiA9IGF2YWlsYWJsZV9yZWFkKCk7CkBAIC00MDYsNSArNDEwLDYgQEAKICAgfQogICByZXR1cm4gTlVMTDsKIH0KLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oCmluZGV4IDJlZTlhZGYuLmM0MjNmOWMgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmgKQEAgLTIwLDYgKzIwLDcgQEAKICNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVEJVRkZFUlRSQU5TUE9SVFNfSF8KICNkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfVEJVRkZFUlRSQU5TUE9SVFNfSF8gMQogCisjaW5jbHVkZSA8Y3N0ZGxpYj4KICNpbmNsdWRlIDxjc3RyaW5nPgogI2luY2x1ZGUgPGxpbWl0cz4KICNpbmNsdWRlIDxib29zdC9zY29wZWRfYXJyYXkuaHBwPgpAQCAtMzUsOCArMzYsOSBAQAogI2RlZmluZSBUREJfVU5MSUtFTFkodmFsKSAodmFsKQogI2VuZGlmCiAKLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHRyYW5zcG9ydCB7Ci0KK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKIAogLyoqCiAgKiBCYXNlIGNsYXNzIGZvciBhbGwgdHJhbnNwb3J0cyB0aGF0IHVzZSByZWFkL3dyaXRlIGJ1ZmZlcnMgZm9yIHBlcmZvcm1hbmNlLgpAQCAtNTAsOCArNTIsNyBAQAogICovCiBjbGFzcyBUQnVmZmVyQmFzZSA6IHB1YmxpYyBUVmlydHVhbFRyYW5zcG9ydDxUQnVmZmVyQmFzZT4gewogCi0gcHVibGljOgotCitwdWJsaWM6CiAgIC8qKgogICAgKiBGYXN0LXBhdGggcmVhZC4KICAgICoKQEAgLTg2LDcgKzg3LDcgQEAKICAgLyoqCiAgICAqIEZhc3QtcGF0aCB3cml0ZS4KICAgICoKLSAgICogV2hlbiB3ZSBoYXZlIGVub3VnaCBlbXB0eSBzcGFjZSBpbiBvdXIgYnVmZmVyIHRvIGFjY29tb2RhdGUgdGhlIHdyaXRlLCB3ZQorICAgKiBXaGVuIHdlIGhhdmUgZW5vdWdoIGVtcHR5IHNwYWNlIGluIG91ciBidWZmZXIgdG8gYWNjb21tb2RhdGUgdGhlIHdyaXRlLCB3ZQogICAgKiBjYW4gc2F0aXNmeSBpdCB3aXRoIGEgc2luZ2xlIG1lbWNweSwgdGhlbiBhZGp1c3Qgb3VyIGludGVybmFsIHBvaW50ZXJzLgogICAgKiBJZiB0aGUgYnVmZmVyIGlzIGZ1bGwsIHdlIGNhbGwgb3V0IHRvIG91ciBzbG93IHBhdGgsIGltcGxlbWVudGVkIGJ5IGEKICAgICogc3ViY2xhc3MuICBUaGlzIG1ldGhvZCBpcyBtZWFudCB0byBldmVudHVhbGx5IGJlIG5vbnZpcnR1YWwgYW5kCkBAIC0xMjIsMTMgKzEyMywxMSBAQAogICAgIGlmIChUREJfTElLRUxZKHN0YXRpY19jYXN0PHB0cmRpZmZfdD4obGVuKSA8PSByQm91bmRfIC0gckJhc2VfKSkgewogICAgICAgckJhc2VfICs9IGxlbjsKICAgICB9IGVsc2UgewotICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpCQURfQVJHUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnN1bWUgZGlkIG5vdCBmb2xsb3cgYSBib3Jyb3cuIik7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkJBRF9BUkdTLCAiY29uc3VtZSBkaWQgbm90IGZvbGxvdyBhIGJvcnJvdy4iKTsKICAgICB9CiAgIH0KIAotIHByb3RlY3RlZDoKLQorcHJvdGVjdGVkOgogICAvLy8gU2xvdyBwYXRoIHJlYWQuCiAgIHZpcnR1YWwgdWludDMyX3QgcmVhZFNsb3codWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pID0gMDsKIApAQCAtMTQ5LDIzICsxNDgsMTggQEAKICAgICogcGVyZm9ybWFuY2Utc2Vuc2l0aXZlIG9wZXJhdGlvbiwgc28gaXQgaXMgb2theSB0byBqdXN0IGxlYXZlIGl0IHRvCiAgICAqIHRoZSBjb25jcmV0ZSBjbGFzcyB0byBzZXQgdXAgcG9pbnRlcnMgY29ycmVjdGx5LgogICAgKi8KLSAgVEJ1ZmZlckJhc2UoKQotICAgIDogckJhc2VfKE5VTEwpCi0gICAgLCByQm91bmRfKE5VTEwpCi0gICAgLCB3QmFzZV8oTlVMTCkKLSAgICAsIHdCb3VuZF8oTlVMTCkKLSAge30KKyAgVEJ1ZmZlckJhc2UoKSA6IHJCYXNlXyhOVUxMKSwgckJvdW5kXyhOVUxMKSwgd0Jhc2VfKE5VTEwpLCB3Qm91bmRfKE5VTEwpIHt9CiAKICAgLy8vIENvbnZlbmllbmNlIG11dGF0b3IgZm9yIHNldHRpbmcgdGhlIHJlYWQgYnVmZmVyLgogICB2b2lkIHNldFJlYWRCdWZmZXIodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKICAgICByQmFzZV8gPSBidWY7Ci0gICAgckJvdW5kXyA9IGJ1ZitsZW47CisgICAgckJvdW5kXyA9IGJ1ZiArIGxlbjsKICAgfQogCiAgIC8vLyBDb252ZW5pZW5jZSBtdXRhdG9yIGZvciBzZXR0aW5nIHRoZSB3cml0ZSBidWZmZXIuCiAgIHZvaWQgc2V0V3JpdGVCdWZmZXIodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKICAgICB3QmFzZV8gPSBidWY7Ci0gICAgd0JvdW5kXyA9IGJ1ZitsZW47CisgICAgd0JvdW5kXyA9IGJ1ZiArIGxlbjsKICAgfQogCiAgIHZpcnR1YWwgflRCdWZmZXJCYXNlKCkge30KQEAgLTE4MSw1OSArMTc1LDQ5IEBACiAgIHVpbnQ4X3QqIHdCb3VuZF87CiB9OwogCi0KIC8qKgogICogQnVmZmVyZWQgdHJhbnNwb3J0LiBGb3IgcmVhZHMgaXQgd2lsbCByZWFkIG1vcmUgZGF0YSB0aGFuIGlzIHJlcXVlc3RlZAogICogYW5kIHdpbGwgc2VydmUgZnV0dXJlIGRhdGEgb3V0IG9mIGEgbG9jYWwgYnVmZmVyLiBGb3Igd3JpdGVzLCBkYXRhIGlzCiAgKiBzdG9yZWQgdG8gYW4gaW4gbWVtb3J5IGJ1ZmZlciBiZWZvcmUgYmVpbmcgd3JpdHRlbiBvdXQuCiAgKgogICovCi1jbGFzcyBUQnVmZmVyZWRUcmFuc3BvcnQKLSAgOiBwdWJsaWMgVFZpcnR1YWxUcmFuc3BvcnQ8VEJ1ZmZlcmVkVHJhbnNwb3J0LCBUQnVmZmVyQmFzZT4gewotIHB1YmxpYzoKLQorY2xhc3MgVEJ1ZmZlcmVkVHJhbnNwb3J0IDogcHVibGljIFRWaXJ0dWFsVHJhbnNwb3J0PFRCdWZmZXJlZFRyYW5zcG9ydCwgVEJ1ZmZlckJhc2U+IHsKK3B1YmxpYzoKICAgc3RhdGljIGNvbnN0IGludCBERUZBVUxUX0JVRkZFUl9TSVpFID0gNTEyOwogCiAgIC8vLyBVc2UgZGVmYXVsdCBidWZmZXIgc2l6ZXMuCi0gIFRCdWZmZXJlZFRyYW5zcG9ydChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQpCi0gICAgOiB0cmFuc3BvcnRfKHRyYW5zcG9ydCkKLSAgICAsIHJCdWZTaXplXyhERUZBVUxUX0JVRkZFUl9TSVpFKQotICAgICwgd0J1ZlNpemVfKERFRkFVTFRfQlVGRkVSX1NJWkUpCi0gICAgLCByQnVmXyhuZXcgdWludDhfdFtyQnVmU2l6ZV9dKQotICAgICwgd0J1Zl8obmV3IHVpbnQ4X3Rbd0J1ZlNpemVfXSkKLSAgeworICBUQnVmZmVyZWRUcmFuc3BvcnQoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCkKKyAgICA6IHRyYW5zcG9ydF8odHJhbnNwb3J0KSwKKyAgICAgIHJCdWZTaXplXyhERUZBVUxUX0JVRkZFUl9TSVpFKSwKKyAgICAgIHdCdWZTaXplXyhERUZBVUxUX0JVRkZFUl9TSVpFKSwKKyAgICAgIHJCdWZfKG5ldyB1aW50OF90W3JCdWZTaXplX10pLAorICAgICAgd0J1Zl8obmV3IHVpbnQ4X3Rbd0J1ZlNpemVfXSkgewogICAgIGluaXRQb2ludGVycygpOwogICB9CiAKICAgLy8vIFVzZSBzcGVjaWZpZWQgYnVmZmVyIHNpemVzLgotICBUQnVmZmVyZWRUcmFuc3BvcnQoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0LCB1aW50MzJfdCBzeikKLSAgICA6IHRyYW5zcG9ydF8odHJhbnNwb3J0KQotICAgICwgckJ1ZlNpemVfKHN6KQotICAgICwgd0J1ZlNpemVfKHN6KQotICAgICwgckJ1Zl8obmV3IHVpbnQ4X3RbckJ1ZlNpemVfXSkKLSAgICAsIHdCdWZfKG5ldyB1aW50OF90W3dCdWZTaXplX10pCi0gIHsKKyAgVEJ1ZmZlcmVkVHJhbnNwb3J0KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQsIHVpbnQzMl90IHN6KQorICAgIDogdHJhbnNwb3J0Xyh0cmFuc3BvcnQpLAorICAgICAgckJ1ZlNpemVfKHN6KSwKKyAgICAgIHdCdWZTaXplXyhzeiksCisgICAgICByQnVmXyhuZXcgdWludDhfdFtyQnVmU2l6ZV9dKSwKKyAgICAgIHdCdWZfKG5ldyB1aW50OF90W3dCdWZTaXplX10pIHsKICAgICBpbml0UG9pbnRlcnMoKTsKICAgfQogCiAgIC8vLyBVc2Ugc3BlY2lmaWVkIHJlYWQgYW5kIHdyaXRlIGJ1ZmZlciBzaXplcy4KLSAgVEJ1ZmZlcmVkVHJhbnNwb3J0KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCwgdWludDMyX3QgcnN6LCB1aW50MzJfdCB3c3opCi0gICAgOiB0cmFuc3BvcnRfKHRyYW5zcG9ydCkKLSAgICAsIHJCdWZTaXplXyhyc3opCi0gICAgLCB3QnVmU2l6ZV8od3N6KQotICAgICwgckJ1Zl8obmV3IHVpbnQ4X3RbckJ1ZlNpemVfXSkKLSAgICAsIHdCdWZfKG5ldyB1aW50OF90W3dCdWZTaXplX10pCi0gIHsKKyAgVEJ1ZmZlcmVkVHJhbnNwb3J0KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQsIHVpbnQzMl90IHJzeiwgdWludDMyX3Qgd3N6KQorICAgIDogdHJhbnNwb3J0Xyh0cmFuc3BvcnQpLAorICAgICAgckJ1ZlNpemVfKHJzeiksCisgICAgICB3QnVmU2l6ZV8od3N6KSwKKyAgICAgIHJCdWZfKG5ldyB1aW50OF90W3JCdWZTaXplX10pLAorICAgICAgd0J1Zl8obmV3IHVpbnQ4X3Rbd0J1ZlNpemVfXSkgewogICAgIGluaXRQb2ludGVycygpOwogICB9CiAKLSAgdm9pZCBvcGVuKCkgewotICAgIHRyYW5zcG9ydF8tPm9wZW4oKTsKLSAgfQorICB2b2lkIG9wZW4oKSB7IHRyYW5zcG9ydF8tPm9wZW4oKTsgfQogCi0gIGJvb2wgaXNPcGVuKCkgewotICAgIHJldHVybiB0cmFuc3BvcnRfLT5pc09wZW4oKTsKLSAgfQorICBib29sIGlzT3BlbigpIHsgcmV0dXJuIHRyYW5zcG9ydF8tPmlzT3BlbigpOyB9CiAKICAgYm9vbCBwZWVrKCkgewogICAgIGlmIChyQmFzZV8gPT0gckJvdW5kXykgewpAQCAtMjU2LDkgKzI0MCw3IEBACiAgIC8qKgogICAgKiBSZXR1cm5zIHRoZSBvcmlnaW4gb2YgdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0CiAgICAqLwotICB2aXJ0dWFsIGNvbnN0IHN0ZDo6c3RyaW5nIGdldE9yaWdpbigpIHsKLSAgICByZXR1cm4gdHJhbnNwb3J0Xy0+Z2V0T3JpZ2luKCk7Ci0gIH0KKyAgdmlydHVhbCBjb25zdCBzdGQ6OnN0cmluZyBnZXRPcmlnaW4oKSB7IHJldHVybiB0cmFuc3BvcnRfLT5nZXRPcmlnaW4oKTsgfQogCiAgIC8qKgogICAgKiBUaGUgZm9sbG93aW5nIGJlaGF2aW9yIGlzIGN1cnJlbnRseSBpbXBsZW1lbnRlZCBieSBUQnVmZmVyZWRUcmFuc3BvcnQsCkBAIC0yNzMsMjYgKzI1NSwyMiBAQAogICAgKi8KICAgdmlydHVhbCBjb25zdCB1aW50OF90KiBib3Jyb3dTbG93KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QqIGxlbik7CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZ2V0VW5kZXJseWluZ1RyYW5zcG9ydCgpIHsKLSAgICByZXR1cm4gdHJhbnNwb3J0XzsKLSAgfQorICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZ2V0VW5kZXJseWluZ1RyYW5zcG9ydCgpIHsgcmV0dXJuIHRyYW5zcG9ydF87IH0KIAogICAvKgogICAgKiBUVmlydHVhbFRyYW5zcG9ydCBwcm92aWRlcyBhIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgcmVhZEFsbCgpLgogICAgKiBXZSB3YW50IHRvIHVzZSB0aGUgVEJ1ZmZlckJhc2UgdmVyc2lvbiBpbnN0ZWFkLgogICAgKi8KLSAgdWludDMyX3QgcmVhZEFsbCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewotICAgIHJldHVybiBUQnVmZmVyQmFzZTo6cmVhZEFsbChidWYsIGxlbik7Ci0gIH0KKyAgdWludDMyX3QgcmVhZEFsbCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeyByZXR1cm4gVEJ1ZmZlckJhc2U6OnJlYWRBbGwoYnVmLCBsZW4pOyB9CiAKLSBwcm90ZWN0ZWQ6Citwcm90ZWN0ZWQ6CiAgIHZvaWQgaW5pdFBvaW50ZXJzKCkgewogICAgIHNldFJlYWRCdWZmZXIockJ1Zl8uZ2V0KCksIDApOwogICAgIHNldFdyaXRlQnVmZmVyKHdCdWZfLmdldCgpLCB3QnVmU2l6ZV8pOwogICAgIC8vIFdyaXRlIHNpemUgbmV2ZXIgY2hhbmdlcy4KICAgfQogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydF87CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnRfOwogCiAgIHVpbnQzMl90IHJCdWZTaXplXzsKICAgdWludDMyX3Qgd0J1ZlNpemVfOwpAQCAtMzAwLDEzICsyNzgsMTIgQEAKICAgYm9vc3Q6OnNjb3BlZF9hcnJheTx1aW50OF90PiB3QnVmXzsKIH07CiAKLQogLyoqCiAgKiBXcmFwcyBhIHRyYW5zcG9ydCBpbnRvIGEgYnVmZmVyZWQgb25lLgogICoKICAqLwogY2xhc3MgVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSA6IHB1YmxpYyBUVHJhbnNwb3J0RmFjdG9yeSB7Ci0gcHVibGljOgorcHVibGljOgogICBUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KCkge30KIAogICB2aXJ0dWFsIH5UQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KCkge30KQEAgLTMxNCwxMyArMjkxLDExIEBACiAgIC8qKgogICAgKiBXcmFwcyB0aGUgdHJhbnNwb3J0IGludG8gYSBidWZmZXJlZCBvbmUuCiAgICAqLwotICB2aXJ0dWFsIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldFRyYW5zcG9ydChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFucykgewotICAgIHJldHVybiBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PihuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KHRyYW5zKSk7CisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldFRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMpIHsKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+KG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQodHJhbnMpKTsKICAgfQotCiB9OwogCi0KIC8qKgogICogRnJhbWVkIHRyYW5zcG9ydC4gQWxsIHdyaXRlcyBnbyBpbnRvIGFuIGluLW1lbW9yeSBidWZmZXIgdW50aWwgZmx1c2ggaXMKICAqIGNhbGxlZCwgYXQgd2hpY2ggcG9pbnQgdGhlIHRyYW5zcG9ydCB3cml0ZXMgdGhlIGxlbmd0aCBvZiB0aGUgZW50aXJlCkBAIC0zMjgsNDcgKzMwMyw1MSBAQAogICogb3RoZXIgZW5kIHRvIGFsd2F5cyBkbyBmaXhlZC1sZW5ndGggcmVhZHMuCiAgKgogICovCi1jbGFzcyBURnJhbWVkVHJhbnNwb3J0Ci0gIDogcHVibGljIFRWaXJ0dWFsVHJhbnNwb3J0PFRGcmFtZWRUcmFuc3BvcnQsIFRCdWZmZXJCYXNlPiB7Ci0gcHVibGljOgotCitjbGFzcyBURnJhbWVkVHJhbnNwb3J0IDogcHVibGljIFRWaXJ0dWFsVHJhbnNwb3J0PFRGcmFtZWRUcmFuc3BvcnQsIFRCdWZmZXJCYXNlPiB7CitwdWJsaWM6CiAgIHN0YXRpYyBjb25zdCBpbnQgREVGQVVMVF9CVUZGRVJfU0laRSA9IDUxMjsKKyAgc3RhdGljIGNvbnN0IGludCBERUZBVUxUX01BWF9GUkFNRV9TSVpFID0gMjU2ICogMTAyNCAqIDEwMjQ7CiAKICAgLy8vIFVzZSBkZWZhdWx0IGJ1ZmZlciBzaXplcy4KLSAgVEZyYW1lZFRyYW5zcG9ydChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQpCi0gICAgOiB0cmFuc3BvcnRfKHRyYW5zcG9ydCkKLSAgICAsIHJCdWZTaXplXygwKQotICAgICwgd0J1ZlNpemVfKERFRkFVTFRfQlVGRkVSX1NJWkUpCi0gICAgLCByQnVmXygpCi0gICAgLCB3QnVmXyhuZXcgdWludDhfdFt3QnVmU2l6ZV9dKQotICAgICwgYnVmUmVjbGFpbVRocmVzaF8oKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgpKCkpCi0gIHsKKyAgVEZyYW1lZFRyYW5zcG9ydCgpCisgICAgOiB0cmFuc3BvcnRfKCksCisgICAgICByQnVmU2l6ZV8oMCksCisgICAgICB3QnVmU2l6ZV8oREVGQVVMVF9CVUZGRVJfU0laRSksCisgICAgICByQnVmXygpLAorICAgICAgd0J1Zl8obmV3IHVpbnQ4X3Rbd0J1ZlNpemVfXSksCisgICAgICBidWZSZWNsYWltVGhyZXNoXygoc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCkoKSkgewogICAgIGluaXRQb2ludGVycygpOwogICB9CiAKLSAgVEZyYW1lZFRyYW5zcG9ydChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQsIHVpbnQzMl90IHN6LAotICAgICAgICAgIHVpbnQzMl90IGJ1ZlJlY2xhaW1UaHJlc2ggPSAoc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCkoKSkKLSAgICA6IHRyYW5zcG9ydF8odHJhbnNwb3J0KQotICAgICwgckJ1ZlNpemVfKDApCi0gICAgLCB3QnVmU2l6ZV8oc3opCi0gICAgLCByQnVmXygpCi0gICAgLCB3QnVmXyhuZXcgdWludDhfdFt3QnVmU2l6ZV9dKQotICAgICwgYnVmUmVjbGFpbVRocmVzaF8oYnVmUmVjbGFpbVRocmVzaCkKLSAgeworICBURnJhbWVkVHJhbnNwb3J0KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQpCisgICAgOiB0cmFuc3BvcnRfKHRyYW5zcG9ydCksCisgICAgICByQnVmU2l6ZV8oMCksCisgICAgICB3QnVmU2l6ZV8oREVGQVVMVF9CVUZGRVJfU0laRSksCisgICAgICByQnVmXygpLAorICAgICAgd0J1Zl8obmV3IHVpbnQ4X3Rbd0J1ZlNpemVfXSksCisgICAgICBidWZSZWNsYWltVGhyZXNoXygoc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCkoKSksCisgICAgICBtYXhGcmFtZVNpemVfKERFRkFVTFRfTUFYX0ZSQU1FX1NJWkUpIHsKICAgICBpbml0UG9pbnRlcnMoKTsKICAgfQogCi0gIHZvaWQgb3BlbigpIHsKLSAgICB0cmFuc3BvcnRfLT5vcGVuKCk7CisgIFRGcmFtZWRUcmFuc3BvcnQoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzeiwKKyAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBidWZSZWNsYWltVGhyZXNoID0gKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgpKCkpCisgICAgOiB0cmFuc3BvcnRfKHRyYW5zcG9ydCksCisgICAgICByQnVmU2l6ZV8oMCksCisgICAgICB3QnVmU2l6ZV8oc3opLAorICAgICAgckJ1Zl8oKSwKKyAgICAgIHdCdWZfKG5ldyB1aW50OF90W3dCdWZTaXplX10pLAorICAgICAgYnVmUmVjbGFpbVRocmVzaF8oYnVmUmVjbGFpbVRocmVzaCksCisgICAgICBtYXhGcmFtZVNpemVfKERFRkFVTFRfTUFYX0ZSQU1FX1NJWkUpIHsKKyAgICBpbml0UG9pbnRlcnMoKTsKICAgfQogCi0gIGJvb2wgaXNPcGVuKCkgewotICAgIHJldHVybiB0cmFuc3BvcnRfLT5pc09wZW4oKTsKLSAgfQorICB2b2lkIG9wZW4oKSB7IHRyYW5zcG9ydF8tPm9wZW4oKTsgfQogCi0gIGJvb2wgcGVlaygpIHsKLSAgICByZXR1cm4gKHJCYXNlXyA8IHJCb3VuZF8pIHx8IHRyYW5zcG9ydF8tPnBlZWsoKTsKLSAgfQorICBib29sIGlzT3BlbigpIHsgcmV0dXJuIHRyYW5zcG9ydF8tPmlzT3BlbigpOyB9CisKKyAgYm9vbCBwZWVrKCkgeyByZXR1cm4gKHJCYXNlXyA8IHJCb3VuZF8pIHx8IHRyYW5zcG9ydF8tPnBlZWsoKTsgfQogCiAgIHZvaWQgY2xvc2UoKSB7CiAgICAgZmx1c2goKTsKQEAgLTM4NywzMyArMzY2LDM3IEBACiAKICAgY29uc3QgdWludDhfdCogYm9ycm93U2xvdyh1aW50OF90KiBidWYsIHVpbnQzMl90KiBsZW4pOwogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldFVuZGVybHlpbmdUcmFuc3BvcnQoKSB7Ci0gICAgcmV0dXJuIHRyYW5zcG9ydF87Ci0gIH0KKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldFVuZGVybHlpbmdUcmFuc3BvcnQoKSB7IHJldHVybiB0cmFuc3BvcnRfOyB9CiAKICAgLyoKICAgICogVFZpcnR1YWxUcmFuc3BvcnQgcHJvdmlkZXMgYSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHJlYWRBbGwoKS4KICAgICogV2Ugd2FudCB0byB1c2UgdGhlIFRCdWZmZXJCYXNlIHZlcnNpb24gaW5zdGVhZC4KICAgICovCi0gIHVpbnQzMl90IHJlYWRBbGwodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKLSAgICByZXR1cm4gVEJ1ZmZlckJhc2U6OnJlYWRBbGwoYnVmLGxlbik7Ci0gIH0KKyAgdXNpbmcgVEJ1ZmZlckJhc2U6OnJlYWRBbGw7CiAKICAgLyoqCiAgICAqIFJldHVybnMgdGhlIG9yaWdpbiBvZiB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQKICAgICovCi0gIHZpcnR1YWwgY29uc3Qgc3RkOjpzdHJpbmcgZ2V0T3JpZ2luKCkgewotICAgIHJldHVybiB0cmFuc3BvcnRfLT5nZXRPcmlnaW4oKTsKLSAgfQorICB2aXJ0dWFsIGNvbnN0IHN0ZDo6c3RyaW5nIGdldE9yaWdpbigpIHsgcmV0dXJuIHRyYW5zcG9ydF8tPmdldE9yaWdpbigpOyB9CiAKLSBwcm90ZWN0ZWQ6CisgIC8qKgorICAgKiBTZXQgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgZnJhbWUgYXQgcmVhZAorICAgKi8KKyAgdm9pZCBzZXRNYXhGcmFtZVNpemUodWludDMyX3QgbWF4RnJhbWVTaXplKSB7IG1heEZyYW1lU2l6ZV8gPSBtYXhGcmFtZVNpemU7IH0KKworICAvKioKKyAgICogR2V0IHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIGZyYW1lIGF0IHJlYWQKKyAgICovCisgIHVpbnQzMl90IGdldE1heEZyYW1lU2l6ZSgpIHsgcmV0dXJuIG1heEZyYW1lU2l6ZV87IH0KKworcHJvdGVjdGVkOgogICAvKioKICAgICogUmVhZHMgYSBmcmFtZSBvZiBpbnB1dCBmcm9tIHRoZSB1bmRlcmx5aW5nIHN0cmVhbS4KICAgICoKICAgICogUmV0dXJucyB0cnVlIGlmIGEgZnJhbWUgd2FzIHJlYWQgc3VjY2Vzc2Z1bGx5LCBvciBmYWxzZSBvbiBFT0YuCiAgICAqIChSYWlzZXMgYSBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIEVPRiBvY2N1cnMgYWZ0ZXIgYSBwYXJ0aWFsIGZyYW1lLikKICAgICovCi0gIGJvb2wgcmVhZEZyYW1lKCk7CisgIHZpcnR1YWwgYm9vbCByZWFkRnJhbWUoKTsKIAogICB2b2lkIGluaXRQb2ludGVycygpIHsKICAgICBzZXRSZWFkQnVmZmVyKE5VTEwsIDApOwpAQCAtNDI0LDEzICs0MDcsMTQgQEAKICAgICB0aGlzLT53cml0ZSgodWludDhfdCopJnBhZCwgc2l6ZW9mKHBhZCkpOwogICB9CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0XzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydF87CiAKICAgdWludDMyX3QgckJ1ZlNpemVfOwogICB1aW50MzJfdCB3QnVmU2l6ZV87CiAgIGJvb3N0OjpzY29wZWRfYXJyYXk8dWludDhfdD4gckJ1Zl87CiAgIGJvb3N0OjpzY29wZWRfYXJyYXk8dWludDhfdD4gd0J1Zl87CiAgIHVpbnQzMl90IGJ1ZlJlY2xhaW1UaHJlc2hfOworICB1aW50MzJfdCBtYXhGcmFtZVNpemVfOwogfTsKIAogLyoqCkBAIC00MzgsNyArNDIyLDcgQEAKICAqCiAgKi8KIGNsYXNzIFRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5IDogcHVibGljIFRUcmFuc3BvcnRGYWN0b3J5IHsKLSBwdWJsaWM6CitwdWJsaWM6CiAgIFRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5KCkge30KIAogICB2aXJ0dWFsIH5URnJhbWVkVHJhbnNwb3J0RmFjdG9yeSgpIHt9CkBAIC00NDYsMTMgKzQzMCwxMSBAQAogICAvKioKICAgICogV3JhcHMgdGhlIHRyYW5zcG9ydCBpbnRvIGEgZnJhbWVkIG9uZS4KICAgICovCi0gIHZpcnR1YWwgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZ2V0VHJhbnNwb3J0KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKSB7Ci0gICAgcmV0dXJuIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+KG5ldyBURnJhbWVkVHJhbnNwb3J0KHRyYW5zKSk7CisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldFRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMpIHsKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+KG5ldyBURnJhbWVkVHJhbnNwb3J0KHRyYW5zKSk7CiAgIH0KLQogfTsKIAotCiAvKioKICAqIEEgbWVtb3J5IGJ1ZmZlciBpcyBhIHRyYW5wc29ydCB0aGF0IHNpbXBseSByZWFkcyBmcm9tIGFuZCB3cml0ZXMgdG8gYW4KICAqIGluIG1lbW9yeSBidWZmZXIuIEFueXRpbWUgeW91IGNhbGwgd3JpdGUgb24gaXQsIHRoZSBkYXRhIGlzIHNpbXBseSBwbGFjZWQKQEAgLTQ2MywxNSArNDQ1LDE3IEBACiAgKgogICovCiBjbGFzcyBUTWVtb3J5QnVmZmVyIDogcHVibGljIFRWaXJ0dWFsVHJhbnNwb3J0PFRNZW1vcnlCdWZmZXIsIFRCdWZmZXJCYXNlPiB7Ci0gcHJpdmF0ZToKLQorcHJpdmF0ZToKICAgLy8gQ29tbW9uIGluaXRpYWxpemF0aW9uIGRvbmUgYnkgYWxsIGNvbnN0cnVjdG9ycy4KICAgdm9pZCBpbml0Q29tbW9uKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3Qgc2l6ZSwgYm9vbCBvd25lciwgdWludDMyX3Qgd1BvcykgeworCisgICAgbWF4QnVmZmVyU2l6ZV8gPSAoc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCkoKTsKKwogICAgIGlmIChidWYgPT0gTlVMTCAmJiBzaXplICE9IDApIHsKICAgICAgIGFzc2VydChvd25lcik7CiAgICAgICBidWYgPSAodWludDhfdCopc3RkOjptYWxsb2Moc2l6ZSk7CiAgICAgICBpZiAoYnVmID09IE5VTEwpIHsKLSAgICAgICAgdGhyb3cgc3RkOjpiYWRfYWxsb2MoKTsKKwl0aHJvdyBzdGQ6OmJhZF9hbGxvYygpOwogICAgICAgfQogICAgIH0KIApAQCAtNDkwLDcgKzQ3NCw3IEBACiAgICAgLy8gZXF1YWwgdG8gd0Jhc2VfLiAgV2UgdXBkYXRlIGl0IGluIGEgZmV3IHBsYWNlcyAoY29tcHV0ZVJlYWQsIGV0Yy4pLgogICB9CiAKLSBwdWJsaWM6CitwdWJsaWM6CiAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBkZWZhdWx0U2l6ZSA9IDEwMjQ7CiAKICAgLyoqCkBAIC01MTMsMTkgKzQ5NywxMyBAQAogICAgKiAgIGFuZCB3aWxsIGJlIHJlc3BvbnNpYmxlIGZvciBmcmVlaW5nIGl0LgogICAgKiAgIFRoZSBtZW1ib3J5IG11c3QgaGF2ZSBiZWVuIGFsbG9jYXRlZCB3aXRoIG1hbGxvYy4KICAgICovCi0gIGVudW0gTWVtb3J5UG9saWN5Ci0gIHsgT0JTRVJWRSA9IDEKLSAgLCBDT1BZID0gMgotICAsIFRBS0VfT1dORVJTSElQID0gMwotICB9OworICBlbnVtIE1lbW9yeVBvbGljeSB7IE9CU0VSVkUgPSAxLCBDT1BZID0gMiwgVEFLRV9PV05FUlNISVAgPSAzIH07CiAKICAgLyoqCiAgICAqIENvbnN0cnVjdCBhIFRNZW1vcnlCdWZmZXIgd2l0aCBhIGRlZmF1bHQtc2l6ZWQgYnVmZmVyLAogICAgKiBvd25lZCBieSB0aGUgVE1lbW9yeUJ1ZmZlciBvYmplY3QuCiAgICAqLwotICBUTWVtb3J5QnVmZmVyKCkgewotICAgIGluaXRDb21tb24oTlVMTCwgZGVmYXVsdFNpemUsIHRydWUsIDApOwotICB9CisgIFRNZW1vcnlCdWZmZXIoKSB7IGluaXRDb21tb24oTlVMTCwgZGVmYXVsdFNpemUsIHRydWUsIDApOyB9CiAKICAgLyoqCiAgICAqIENvbnN0cnVjdCBhIFRNZW1vcnlCdWZmZXIgd2l0aCBhIGJ1ZmZlciBvZiBhIHNwZWNpZmllZCBzaXplLApAQCAtNTMzLDkgKzUxMSw3IEBACiAgICAqCiAgICAqIEBwYXJhbSBzeiAgVGhlIGluaXRpYWwgc2l6ZSBvZiB0aGUgYnVmZmVyLgogICAgKi8KLSAgVE1lbW9yeUJ1ZmZlcih1aW50MzJfdCBzeikgewotICAgIGluaXRDb21tb24oTlVMTCwgc3osIHRydWUsIDApOwotICB9CisgIFRNZW1vcnlCdWZmZXIodWludDMyX3Qgc3opIHsgaW5pdENvbW1vbihOVUxMLCBzeiwgdHJ1ZSwgMCk7IH0KIAogICAvKioKICAgICogQ29uc3RydWN0IGEgVE1lbW9yeUJ1ZmZlciB3aXRoIGJ1ZiBhcyBpdHMgaW5pdGlhbCBjb250ZW50cy4KQEAgLTU1NCwxNyArNTMwLDE3IEBACiAgICAgfQogCiAgICAgc3dpdGNoIChwb2xpY3kpIHsKLSAgICAgIGNhc2UgT0JTRVJWRToKLSAgICAgIGNhc2UgVEFLRV9PV05FUlNISVA6Ci0gICAgICAgIGluaXRDb21tb24oYnVmLCBzeiwgcG9saWN5ID09IFRBS0VfT1dORVJTSElQLCBzeik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBDT1BZOgotICAgICAgICBpbml0Q29tbW9uKE5VTEwsIHN6LCB0cnVlLCAwKTsKLSAgICAgICAgdGhpcy0+d3JpdGUoYnVmLCBzeik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpCQURfQVJHUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBNZW1vcnlQb2xpY3kgZm9yIFRNZW1vcnlCdWZmZXIiKTsKKyAgICBjYXNlIE9CU0VSVkU6CisgICAgY2FzZSBUQUtFX09XTkVSU0hJUDoKKyAgICAgIGluaXRDb21tb24oYnVmLCBzeiwgcG9saWN5ID09IFRBS0VfT1dORVJTSElQLCBzeik7CisgICAgICBicmVhazsKKyAgICBjYXNlIENPUFk6CisgICAgICBpbml0Q29tbW9uKE5VTEwsIHN6LCB0cnVlLCAwKTsKKyAgICAgIHRoaXMtPndyaXRlKGJ1Ziwgc3opOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6QkFEX0FSR1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIE1lbW9yeVBvbGljeSBmb3IgVE1lbW9yeUJ1ZmZlciIpOwogICAgIH0KICAgfQogCkBAIC01NzQsMTMgKzU1MCw5IEBACiAgICAgfQogICB9CiAKLSAgYm9vbCBpc09wZW4oKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KKyAgYm9vbCBpc09wZW4oKSB7IHJldHVybiB0cnVlOyB9CiAKLSAgYm9vbCBwZWVrKCkgewotICAgIHJldHVybiAockJhc2VfIDwgd0Jhc2VfKTsKLSAgfQorICBib29sIHBlZWsoKSB7IHJldHVybiAockJhc2VfIDwgd0Jhc2VfKTsgfQogCiAgIHZvaWQgb3BlbigpIHt9CiAKQEAgLTY2Myw3ICs2MzUsNyBAQAogCiAgIC8vIHJldHVybiBudW1iZXIgb2YgYnl0ZXMgcmVhZAogICB1aW50MzJfdCByZWFkRW5kKCkgewotICAgIC8vVGhpcyBjYXN0IHNob3VsZCBiZSBzYWZlLCBiZWNhdXNlIGJ1ZmZlcl8ncyBzaXplIGlzIGEgdWludDMyX3QKKyAgICAvLyBUaGlzIGNhc3Qgc2hvdWxkIGJlIHNhZmUsIGJlY2F1c2UgYnVmZmVyXydzIHNpemUgaXMgYSB1aW50MzJfdAogICAgIHVpbnQzMl90IGJ5dGVzID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHJCYXNlXyAtIGJ1ZmZlcl8pOwogICAgIGlmIChyQmFzZV8gPT0gd0Jhc2VfKSB7CiAgICAgICByZXNldEJ1ZmZlcigpOwpAQCAtNjczLDcgKzY0NSw3IEBACiAKICAgLy8gUmV0dXJuIG51bWJlciBvZiBieXRlcyB3cml0dGVuCiAgIHVpbnQzMl90IHdyaXRlRW5kKCkgewotICAgIC8vVGhpcyBjYXN0IHNob3VsZCBiZSBzYWZlLCBiZWNhdXNlIGJ1ZmZlcl8ncyBzaXplIGlzIGEgdWludDMyX3QKKyAgICAvLyBUaGlzIGNhc3Qgc2hvdWxkIGJlIHNhZmUsIGJlY2F1c2UgYnVmZmVyXydzIHNpemUgaXMgYSB1aW50MzJfdAogICAgIHJldHVybiBzdGF0aWNfY2FzdDx1aW50MzJfdD4od0Jhc2VfIC0gYnVmZmVyXyk7CiAgIH0KIApAQCAtNjgyLDEyICs2NTQsMTAgQEAKICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHdCYXNlXyAtIHJCYXNlXyk7CiAgIH0KIAotICB1aW50MzJfdCBhdmFpbGFibGVfd3JpdGUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQzMl90Pih3Qm91bmRfIC0gd0Jhc2VfKTsKLSAgfQorICB1aW50MzJfdCBhdmFpbGFibGVfd3JpdGUoKSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDx1aW50MzJfdD4od0JvdW5kXyAtIHdCYXNlXyk7IH0KIAogICAvLyBSZXR1cm5zIGEgcG9pbnRlciB0byB3aGVyZSB0aGUgY2xpZW50IGNhbiB3cml0ZSBkYXRhIHRvIGFwcGVuZCB0bwotICAvLyB0aGUgVE1lbW9yeUJ1ZmZlciwgYW5kIGVuc3VyZXMgdGhlIGJ1ZmZlciBpcyBiaWcgZW5vdWdoIHRvIGFjY29tb2RhdGUgYQorICAvLyB0aGUgVE1lbW9yeUJ1ZmZlciwgYW5kIGVuc3VyZXMgdGhlIGJ1ZmZlciBpcyBiaWcgZW5vdWdoIHRvIGFjY29tbW9kYXRlIGEKICAgLy8gd3JpdGUgb2YgdGhlIHByb3ZpZGVkIGxlbmd0aC4gIFRoZSByZXR1cm5lZCBwb2ludGVyIGlzIHZlcnkgY29udmVuaWVudCBmb3IKICAgLy8gcGFzc2luZyB0byByZWFkKCksIHJlY3YoKSwgb3Igc2ltaWxhci4gWW91IG11c3QgY2FsbCB3cm90ZUJ5dGVzKCkgYXMgc29vbgogICAvLyBhcyBkYXRhIGlzIHdyaXR0ZW4gb3IgdGhlIGJ1ZmZlciB3aWxsIG5vdCBiZSBhd2FyZSB0aGF0IGRhdGEgaGFzIGNoYW5nZWQuCkBAIC03MDQsMjIgKzY3NCw0MyBAQAogICAgKiBUVmlydHVhbFRyYW5zcG9ydCBwcm92aWRlcyBhIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgcmVhZEFsbCgpLgogICAgKiBXZSB3YW50IHRvIHVzZSB0aGUgVEJ1ZmZlckJhc2UgdmVyc2lvbiBpbnN0ZWFkLgogICAgKi8KLSAgdWludDMyX3QgcmVhZEFsbCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewotICAgIHJldHVybiBUQnVmZmVyQmFzZTo6cmVhZEFsbChidWYsbGVuKTsKKyAgdWludDMyX3QgcmVhZEFsbCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeyByZXR1cm4gVEJ1ZmZlckJhc2U6OnJlYWRBbGwoYnVmLCBsZW4pOyB9CisKKyAgLy8hIFxicmllZiBHZXQgdGhlIGN1cnJlbnQgYnVmZmVyIHNpemUKKyAgLy8hIFxyZXR1cm5zIHRoZSBjdXJyZW50IGJ1ZmZlciBzaXplCisgIHVpbnQzMl90IGdldEJ1ZmZlclNpemUoKSBjb25zdCB7CisgICAgcmV0dXJuIGJ1ZmZlclNpemVfOwogICB9CiAKLSBwcm90ZWN0ZWQ6CisgIC8vISBcYnJpZWYgR2V0IHRoZSBjdXJyZW50IG1heGltdW0gYnVmZmVyIHNpemUKKyAgLy8hIFxyZXR1cm5zIHRoZSBjdXJyZW50IG1heGltdW0gYnVmZmVyIHNpemUKKyAgdWludDMyX3QgZ2V0TWF4QnVmZmVyU2l6ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbWF4QnVmZmVyU2l6ZV87CisgIH0KKworICAvLyEgXGJyaWVmIENoYW5nZSB0aGUgbWF4aW11bSBidWZmZXIgc2l6ZQorICAvLyEgXHBhcmFtW2luXSAgbWF4U2l6ZSAgdGhlIG5ldyBtYXhpbXVtIGJ1ZmZlciBzaXplIGFsbG93ZWQgdG8gZ3JvdyB0bworICAvLyEgXHRocm93cyAgVFRyYW5zcG9ydEV4Y2VwdGlvbihCQURfQVJHUykgaWYgbWF4U2l6ZSBpcyBsZXNzIHRoYW4gdGhlIGN1cnJlbnQgYnVmZmVyIHNpemUKKyAgdm9pZCBzZXRNYXhCdWZmZXJTaXplKHVpbnQzMl90IG1heFNpemUpIHsKKyAgICBpZiAobWF4U2l6ZSA8IGJ1ZmZlclNpemVfKSB7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkJBRF9BUkdTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWF4aW11bSBidWZmZXIgc2l6ZSB3b3VsZCBiZSBsZXNzIHRoYW4gY3VycmVudCBidWZmZXIgc2l6ZSIpOworICAgIH0KKyAgICBtYXhCdWZmZXJTaXplXyA9IG1heFNpemU7CisgIH0KKworcHJvdGVjdGVkOgogICB2b2lkIHN3YXAoVE1lbW9yeUJ1ZmZlciYgdGhhdCkgewogICAgIHVzaW5nIHN0ZDo6c3dhcDsKLSAgICBzd2FwKGJ1ZmZlcl8sICAgICB0aGF0LmJ1ZmZlcl8pOworICAgIHN3YXAoYnVmZmVyXywgdGhhdC5idWZmZXJfKTsKICAgICBzd2FwKGJ1ZmZlclNpemVfLCB0aGF0LmJ1ZmZlclNpemVfKTsKIAotICAgIHN3YXAockJhc2VfLCAgICAgIHRoYXQuckJhc2VfKTsKLSAgICBzd2FwKHJCb3VuZF8sICAgICB0aGF0LnJCb3VuZF8pOwotICAgIHN3YXAod0Jhc2VfLCAgICAgIHRoYXQud0Jhc2VfKTsKLSAgICBzd2FwKHdCb3VuZF8sICAgICB0aGF0LndCb3VuZF8pOworICAgIHN3YXAockJhc2VfLCB0aGF0LnJCYXNlXyk7CisgICAgc3dhcChyQm91bmRfLCB0aGF0LnJCb3VuZF8pOworICAgIHN3YXAod0Jhc2VfLCB0aGF0LndCYXNlXyk7CisgICAgc3dhcCh3Qm91bmRfLCB0aGF0LndCb3VuZF8pOwogCi0gICAgc3dhcChvd25lcl8sICAgICAgdGhhdC5vd25lcl8pOworICAgIHN3YXAob3duZXJfLCB0aGF0Lm93bmVyXyk7CiAgIH0KIAogICAvLyBNYWtlIHN1cmUgdGhlcmUncyBhdCBsZWFzdCAnbGVuJyBieXRlcyBhdmFpbGFibGUgZm9yIHdyaXRpbmcuCkBAIC03NDAsMTMgKzczMSwxNyBAQAogICAvLyBBbGxvY2F0ZWQgYnVmZmVyIHNpemUKICAgdWludDMyX3QgYnVmZmVyU2l6ZV87CiAKKyAgLy8gTWF4aW11bSBhbGxvd2VkIHNpemUKKyAgdWludDMyX3QgbWF4QnVmZmVyU2l6ZV87CisKICAgLy8gSXMgdGhpcyBvYmplY3QgdGhlIG93bmVyIG9mIHRoZSBidWZmZXI/CiAgIGJvb2wgb3duZXJfOwogCiAgIC8vIERvbid0IGZvcmdldCB0byB1cGRhdGUgY29uc3RyY3RvcnMsIGluaXRDb21tb24sIGFuZCBzd2FwIGlmCiAgIC8vIHlvdSBhZGQgbmV3IG1lbWJlcnMuCiB9OwotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CiAKICNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RCVUZGRVJUUkFOU1BPUlRTX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RGRFRyYW5zcG9ydC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RGRFRyYW5zcG9ydC5jcHAKaW5kZXggMjYzNjVmMC4uOTNkZDEwMCAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9URkRUcmFuc3BvcnQuY3BwCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEZEVHJhbnNwb3J0LmNwcApAQCAtMzEsOSArMzEsMTEgQEAKICNpbmNsdWRlIDxpby5oPgogI2VuZGlmCiAKLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Cit1c2luZyBzdGQ6OnN0cmluZzsKIAotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKIAogdm9pZCBURkRUcmFuc3BvcnQ6OmNsb3NlKCkgewogICBpZiAoIWlzT3BlbigpKSB7CkBAIC00NSw5ICs0Nyw3IEBACiAgIGZkXyA9IC0xOwogICAvLyBIYXZlIHRvIGNoZWNrIHVuY2F1Z2h0X2V4Y2VwdGlvbiBiZWNhdXNlIHRoaXMgaXMgY2FsbGVkIGluIHRoZSBkZXN0cnVjdG9yLgogICBpZiAocnYgPCAwICYmICFzdGQ6OnVuY2F1Z2h0X2V4Y2VwdGlvbigpKSB7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRGRFRyYW5zcG9ydDo6Y2xvc2UoKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sICJURkRUcmFuc3BvcnQ6OmNsb3NlKCkiLCBlcnJub19jb3B5KTsKICAgfQogfQogCkBAIC02MiwxMyArNjIsMTEgQEAKICAgICAgICAgKytyZXRyaWVzOwogICAgICAgICBjb250aW51ZTsKICAgICAgIH0KLQkgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0VSUk5POwotICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVEZEVHJhbnNwb3J0OjpyZWFkKCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKKyAgICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0VSUk5POworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLCAiVEZEVHJhbnNwb3J0OjpyZWFkKCkiLCBlcnJub19jb3B5KTsKICAgICB9Ci0gICAgLy90aGlzIHNob3VsZCBiZSBmaW5lLCBzaW5jZSB3ZSBhbHJlYWR5IGNoZWNrZWQgZm9yIG5lZ2F0aXZlIHZhbHVlcywKLSAgICAvL2FuZCA6OnJlYWQgc2hvdWxkIG9ubHkgcmV0dXJuIGEgMzItYml0IHZhbHVlIHNpbmNlIGxlbiBpcyAzMi1iaXQuCisgICAgLy8gdGhpcyBzaG91bGQgYmUgZmluZSwgc2luY2Ugd2UgYWxyZWFkeSBjaGVja2VkIGZvciBuZWdhdGl2ZSB2YWx1ZXMsCisgICAgLy8gYW5kIDo6cmVhZCBzaG91bGQgb25seSByZXR1cm4gYSAzMi1iaXQgdmFsdWUgc2luY2UgbGVuIGlzIDMyLWJpdC4KICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHJ2KTsKICAgfQogfQpAQCAtNzgsMjAgKzc2LDE4IEBACiAgICAgVEhSSUZUX1NTSVpFVCBydiA9IDo6VEhSSUZUX1dSSVRFKGZkXywgYnVmLCBsZW4pOwogCiAgICAgaWYgKHJ2IDwgMCkgewotCQlpbnQgZXJybm9fY29weSA9IFRIUklGVF9FUlJOTzsKLSAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRGRFRyYW5zcG9ydDo6d3JpdGUoKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vX2NvcHkpOworICAgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfRVJSTk87CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sICJURkRUcmFuc3BvcnQ6OndyaXRlKCkiLCBlcnJub19jb3B5KTsKICAgICB9IGVsc2UgaWYgKHJ2ID09IDApIHsKLSAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6RU5EX09GX0ZJTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJURkRUcmFuc3BvcnQ6OndyaXRlKCkiKTsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6RU5EX09GX0ZJTEUsICJURkRUcmFuc3BvcnQ6OndyaXRlKCkiKTsKICAgICB9CiAKICAgICBidWYgKz0gcnY7Ci0gICAgLy90aGlzIHNob3VsZCBiZSBmaW5lLCBhcyB3ZSd2ZSBhbHJlYWR5IGNoZWNrZWQgZm9yIG5lZ2F0aXZlIHZhbHVlcywgYW5kCisgICAgLy8gdGhpcyBzaG91bGQgYmUgZmluZSwgYXMgd2UndmUgYWxyZWFkeSBjaGVja2VkIGZvciBuZWdhdGl2ZSB2YWx1ZXMsIGFuZAogICAgIC8vOjp3cml0ZSBzaG91bGRuJ3QgcmV0dXJuIG1vcmUgdGhhbiBhIHVpbnQzMl90IHNpbmNlIGxlbiBpcyBhIHVpbnQzMl90CiAgICAgbGVuIC09IHN0YXRpY19jYXN0PHVpbnQzMl90Pihydik7CiAgIH0KIH0KLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9URkRUcmFuc3BvcnQuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEZEVHJhbnNwb3J0LmgKaW5kZXggYTMzN2Q4ZC4uNTU5M2Q0MyAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9URkRUcmFuc3BvcnQuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RGRFRyYW5zcG9ydC5oCkBAIC0yOCwzMSArMjgsMjcgQEAKICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RWaXJ0dWFsVHJhbnNwb3J0Lmg+CiAKLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHRyYW5zcG9ydCB7CituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CiAKIC8qKgogICogRGVhZC1zaW1wbGUgd3JhcHBlciBhcm91bmQgYSBmaWxlIGRlc2NyaXB0b3IuCiAgKgogICovCiBjbGFzcyBURkRUcmFuc3BvcnQgOiBwdWJsaWMgVFZpcnR1YWxUcmFuc3BvcnQ8VEZEVHJhbnNwb3J0PiB7Ci0gcHVibGljOgotICBlbnVtIENsb3NlUG9saWN5Ci0gIHsgTk9fQ0xPU0VfT05fREVTVFJPWSA9IDAKLSAgLCBDTE9TRV9PTl9ERVNUUk9ZID0gMQotICB9OworcHVibGljOgorICBlbnVtIENsb3NlUG9saWN5IHsgTk9fQ0xPU0VfT05fREVTVFJPWSA9IDAsIENMT1NFX09OX0RFU1RST1kgPSAxIH07CiAKICAgVEZEVHJhbnNwb3J0KGludCBmZCwgQ2xvc2VQb2xpY3kgY2xvc2VfcG9saWN5ID0gTk9fQ0xPU0VfT05fREVTVFJPWSkKLSAgICA6IGZkXyhmZCkKLSAgICAsIGNsb3NlX3BvbGljeV8oY2xvc2VfcG9saWN5KQotICB7fQorICAgIDogZmRfKGZkKSwgY2xvc2VfcG9saWN5XyhjbG9zZV9wb2xpY3kpIHt9CiAKICAgflRGRFRyYW5zcG9ydCgpIHsKICAgICBpZiAoY2xvc2VfcG9saWN5XyA9PSBDTE9TRV9PTl9ERVNUUk9ZKSB7CiAgICAgICB0cnkgewogICAgICAgICBjbG9zZSgpOwotICAgICAgfSBjYXRjaChUVHJhbnNwb3J0RXhjZXB0aW9uJiBleCkgewotICAgICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJ+VEZEVHJhbnNwb3J0IFRUcmFuc3BvcnRFeGNlcHRpb246ICclcyciLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4LndoYXQoKSk7CisgICAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJiBleCkgeworICAgICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJ+VEZEVHJhbnNwb3J0IFRUcmFuc3BvcnRFeGNlcHRpb246ICclcyciLCBleC53aGF0KCkpOwogICAgICAgfQogICAgIH0KICAgfQpAQCAtNzAsMTEgKzY2LDEyIEBACiAgIHZvaWQgc2V0RkQoaW50IGZkKSB7IGZkXyA9IGZkOyB9CiAgIGludCBnZXRGRCgpIHsgcmV0dXJuIGZkXzsgfQogCi0gcHJvdGVjdGVkOgorcHJvdGVjdGVkOgogICBpbnQgZmRfOwogICBDbG9zZVBvbGljeSBjbG9zZV9wb2xpY3lfOwogfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAogCiAjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9URkRUUkFOU1BPUlRfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEZpbGVUcmFuc3BvcnQuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9URmlsZVRyYW5zcG9ydC5jcHAKaW5kZXggNjI1Yzg3Ny4uYWZiNDQxMSAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9URmlsZVRyYW5zcG9ydC5jcHAKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9URmlsZVRyYW5zcG9ydC5jcHAKQEAgLTI0LDYgKzI0LDggQEAKICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1BsYXRmb3JtU29ja2V0Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L0Z1bmN0aW9uUnVubmVyLmg+CiAKKyNpbmNsdWRlIDxib29zdC92ZXJzaW9uLmhwcD4KKwogI2lmZGVmIEhBVkVfU1lTX1RJTUVfSAogI2luY2x1ZGUgPHN5cy90aW1lLmg+CiAjZWxzZQpAQCAtNDAsNiArNDIsNyBAQAogI2luY2x1ZGUgPGNzdHJpbmc+CiAjaW5jbHVkZSA8aW9zdHJlYW0+CiAjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPG1lbW9yeT4KICNpZmRlZiBIQVZFX1NZU19TVEFUX0gKICNpbmNsdWRlIDxzeXMvc3RhdC5oPgogI2VuZGlmCkBAIC00OCw0NCArNTEsNDcgQEAKICNpbmNsdWRlIDxpby5oPgogI2VuZGlmCiAKLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHRyYW5zcG9ydCB7CituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CiAKLXVzaW5nIGJvb3N0OjpzY29wZWRfcHRyOwotdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7Ci11c2luZyBuYW1lc3BhY2Ugc3RkOwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOwordXNpbmcgc3RkOjpjZXJyOwordXNpbmcgc3RkOjpjb3V0OwordXNpbmcgc3RkOjplbmRsOwordXNpbmcgc3RkOjpzdHJpbmc7CiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOwogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTsKIAogVEZpbGVUcmFuc3BvcnQ6OlRGaWxlVHJhbnNwb3J0KHN0cmluZyBwYXRoLCBib29sIHJlYWRPbmx5KQotICA6IHJlYWRTdGF0ZV8oKQotICAsIHJlYWRCdWZmXyhOVUxMKQotICAsIGN1cnJlbnRFdmVudF8oTlVMTCkKLSAgLCByZWFkQnVmZlNpemVfKERFRkFVTFRfUkVBRF9CVUZGX1NJWkUpCi0gICwgcmVhZFRpbWVvdXRfKE5PX1RBSUxfUkVBRF9USU1FT1VUKQotICAsIGNodW5rU2l6ZV8oREVGQVVMVF9DSFVOS19TSVpFKQotICAsIGV2ZW50QnVmZmVyU2l6ZV8oREVGQVVMVF9FVkVOVF9CVUZGRVJfU0laRSkKLSAgLCBmbHVzaE1heFVzXyhERUZBVUxUX0ZMVVNIX01BWF9VUykKLSAgLCBmbHVzaE1heEJ5dGVzXyhERUZBVUxUX0ZMVVNIX01BWF9CWVRFUykKLSAgLCBtYXhFdmVudFNpemVfKERFRkFVTFRfTUFYX0VWRU5UX1NJWkUpCi0gICwgbWF4Q29ycnVwdGVkRXZlbnRzXyhERUZBVUxUX01BWF9DT1JSVVBURURfRVZFTlRTKQotICAsIGVvZlNsZWVwVGltZV8oREVGQVVMVF9FT0ZfU0xFRVBfVElNRV9VUykKLSAgLCBjb3JydXB0ZWRFdmVudFNsZWVwVGltZV8oREVGQVVMVF9DT1JSVVBURURfU0xFRVBfVElNRV9VUykKLSAgLCB3cml0ZXJUaHJlYWRJT0Vycm9yU2xlZXBUaW1lXyhERUZBVUxUX1dSSVRFUl9USFJFQURfU0xFRVBfVElNRV9VUykKLSAgLCBkZXF1ZXVlQnVmZmVyXyhOVUxMKQotICAsIGVucXVldWVCdWZmZXJfKE5VTEwpCi0gICwgbm90RnVsbF8oJm11dGV4XykKLSAgLCBub3RFbXB0eV8oJm11dGV4XykKLSAgLCBjbG9zaW5nXyhmYWxzZSkKLSAgLCBmbHVzaGVkXygmbXV0ZXhfKQotICAsIGZvcmNlRmx1c2hfKGZhbHNlKQotICAsIGZpbGVuYW1lXyhwYXRoKQotICAsIGZkXygwKQotICAsIGJ1ZmZlckFuZFRocmVhZEluaXRpYWxpemVkXyhmYWxzZSkKLSAgLCBvZmZzZXRfKDApCi0gICwgbGFzdEJhZENodW5rXygwKQotICAsIG51bUNvcnJ1cHRlZEV2ZW50c0luQ2h1bmtfKDApCi0gICwgcmVhZE9ubHlfKHJlYWRPbmx5KQoteworICA6IHJlYWRTdGF0ZV8oKSwKKyAgICByZWFkQnVmZl8oTlVMTCksCisgICAgY3VycmVudEV2ZW50XyhOVUxMKSwKKyAgICByZWFkQnVmZlNpemVfKERFRkFVTFRfUkVBRF9CVUZGX1NJWkUpLAorICAgIHJlYWRUaW1lb3V0XyhOT19UQUlMX1JFQURfVElNRU9VVCksCisgICAgY2h1bmtTaXplXyhERUZBVUxUX0NIVU5LX1NJWkUpLAorICAgIGV2ZW50QnVmZmVyU2l6ZV8oREVGQVVMVF9FVkVOVF9CVUZGRVJfU0laRSksCisgICAgZmx1c2hNYXhVc18oREVGQVVMVF9GTFVTSF9NQVhfVVMpLAorICAgIGZsdXNoTWF4Qnl0ZXNfKERFRkFVTFRfRkxVU0hfTUFYX0JZVEVTKSwKKyAgICBtYXhFdmVudFNpemVfKERFRkFVTFRfTUFYX0VWRU5UX1NJWkUpLAorICAgIG1heENvcnJ1cHRlZEV2ZW50c18oREVGQVVMVF9NQVhfQ09SUlVQVEVEX0VWRU5UUyksCisgICAgZW9mU2xlZXBUaW1lXyhERUZBVUxUX0VPRl9TTEVFUF9USU1FX1VTKSwKKyAgICBjb3JydXB0ZWRFdmVudFNsZWVwVGltZV8oREVGQVVMVF9DT1JSVVBURURfU0xFRVBfVElNRV9VUyksCisgICAgd3JpdGVyVGhyZWFkSU9FcnJvclNsZWVwVGltZV8oREVGQVVMVF9XUklURVJfVEhSRUFEX1NMRUVQX1RJTUVfVVMpLAorICAgIGRlcXVldWVCdWZmZXJfKE5VTEwpLAorICAgIGVucXVldWVCdWZmZXJfKE5VTEwpLAorICAgIG5vdEZ1bGxfKCZtdXRleF8pLAorICAgIG5vdEVtcHR5XygmbXV0ZXhfKSwKKyAgICBjbG9zaW5nXyhmYWxzZSksCisgICAgZmx1c2hlZF8oJm11dGV4XyksCisgICAgZm9yY2VGbHVzaF8oZmFsc2UpLAorICAgIGZpbGVuYW1lXyhwYXRoKSwKKyAgICBmZF8oMCksCisgICAgYnVmZmVyQW5kVGhyZWFkSW5pdGlhbGl6ZWRfKGZhbHNlKSwKKyAgICBvZmZzZXRfKDApLAorICAgIGxhc3RCYWRDaHVua18oMCksCisgICAgbnVtQ29ycnVwdGVkRXZlbnRzSW5DaHVua18oMCksCisgICAgcmVhZE9ubHlfKHJlYWRPbmx5KSB7CiAgIHRocmVhZEZhY3RvcnlfLnNldERldGFjaGVkKGZhbHNlKTsKICAgb3BlbkxvZ0ZpbGUoKTsKIH0KQEAgLTEwMiw5ICsxMDgsMTEgQEAKICAgICBpZiAoLTEgPT0gOjpUSFJJRlRfQ0xPU0UoZmRfKSkgewogICAgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfRVJSTk87CiAgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJURmlsZVRyYW5zcG9ydDogcmVzZXRPdXRwdXRGaWxlKCkgOjpjbG9zZSgpICIsIGVycm5vX2NvcHkpOwotICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLCAiVEZpbGVUcmFuc3BvcnQ6IGVycm9yIGluIGZpbGUgY2xvc2UiLCBlcnJub19jb3B5KTsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRGaWxlVHJhbnNwb3J0OiBlcnJvciBpbiBmaWxlIGNsb3NlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJybm9fY29weSk7CiAgICAgfSBlbHNlIHsKLSAgICAgIC8vc3VjY2Vzc2Z1bGx5IGNsb3NlZCBmZAorICAgICAgLy8gc3VjY2Vzc2Z1bGx5IGNsb3NlZCBmZAogICAgICAgZmRfID0gMDsKICAgICB9CiAgIH0KQEAgLTExNywxMCArMTI1LDkgQEAKICAgfQogfQogCi0KIFRGaWxlVHJhbnNwb3J0Ojp+VEZpbGVUcmFuc3BvcnQoKSB7CiAgIC8vIGZsdXNoIHRoZSBidWZmZXIgaWYgYSB3cml0ZXIgdGhyZWFkIGlzIGFjdGl2ZQotICBpZih3cml0ZXJUaHJlYWRfLmdldCgpKSB7CisgIGlmICh3cml0ZXJUaHJlYWRfLmdldCgpKSB7CiAgICAgLy8gc2V0IHN0YXRlIHRvIGNsb3NpbmcKICAgICBjbG9zaW5nXyA9IHRydWU7CiAKQEAgLTE1NCwxMCArMTYxLDEwIEBACiAKICAgLy8gY2xvc2UgbG9nZmlsZQogICBpZiAoZmRfID4gMCkgewotICAgIGlmKC0xID09IDo6VEhSSUZUX0NMT1NFKGZkXykpIHsKKyAgICBpZiAoLTEgPT0gOjpUSFJJRlRfQ0xPU0UoZmRfKSkgewogICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVEZpbGVUcmFuc3BvcnQ6IH5URmlsZVRyYW5zcG9ydCgpIDo6Y2xvc2UoKSAiLCBUSFJJRlRfRVJSTk8pOwogICAgIH0gZWxzZSB7Ci0gICAgICAvL3N1Y2Nlc3NmdWxseSBjbG9zZWQgZmQKKyAgICAgIC8vIHN1Y2Nlc3NmdWxseSBjbG9zZWQgZmQKICAgICAgIGZkXyA9IDA7CiAgICAgfQogICB9CkBAIC0xNjksOSArMTc2LDkgQEAKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KIAotICBpZighd3JpdGVyVGhyZWFkXy5nZXQoKSkgeworICBpZiAoIXdyaXRlclRocmVhZF8uZ2V0KCkpIHsKICAgICB3cml0ZXJUaHJlYWRfID0gdGhyZWFkRmFjdG9yeV8ubmV3VGhyZWFkKAotICAgICAgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpGdW5jdGlvblJ1bm5lcjo6Y3JlYXRlKHN0YXJ0V3JpdGVyVGhyZWFkLCB0aGlzKSk7CisgICAgICAgIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6RnVuY3Rpb25SdW5uZXI6OmNyZWF0ZShzdGFydFdyaXRlclRocmVhZCwgdGhpcykpOwogICAgIHdyaXRlclRocmVhZF8tPnN0YXJ0KCk7CiAgIH0KIApAQCAtMTkwLDYgKzE5NywxMiBAQAogICBlbnF1ZXVlRXZlbnQoYnVmLCBsZW4pOwogfQogCit0ZW1wbGF0ZSA8Y2xhc3MgX1Q+CitzdHJ1Y3QgdW5pcXVlRGVsZXRlcgoreworICB2b2lkIG9wZXJhdG9yKCkoX1QgKnB0cikgY29uc3QgeyBkZWxldGUgcHRyOyB9Cit9OworCiB2b2lkIFRGaWxlVHJhbnNwb3J0OjplbnF1ZXVlRXZlbnQoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBldmVudExlbikgewogICAvLyBjYW4ndCBlbnF1ZXVlIG1vcmUgZXZlbnRzIGlmIGZpbGUgaXMgZ29pbmcgdG8gY2xvc2UKICAgaWYgKGNsb3NpbmdfKSB7CkBAIC0xOTcsNyArMjEwLDcgQEAKICAgfQogCiAgIC8vIG1ha2Ugc3VyZSB0aGF0IGV2ZW50IHNpemUgaXMgdmFsaWQKLSAgaWYgKCAobWF4RXZlbnRTaXplXyA+IDApICYmIChldmVudExlbiA+IG1heEV2ZW50U2l6ZV8pICkgeworICBpZiAoKG1heEV2ZW50U2l6ZV8gPiAwKSAmJiAoZXZlbnRMZW4gPiBtYXhFdmVudFNpemVfKSkgewogICAgIFRfRVJST1IoIm1zZyBzaXplIGlzIGdyZWF0ZXIgdGhhbiBtYXggZXZlbnQgc2l6ZTogJXUgPiAldVxuIiwgZXZlbnRMZW4sIG1heEV2ZW50U2l6ZV8pOwogICAgIHJldHVybjsKICAgfQpAQCAtMjA3LDEyICsyMjAsOSBAQAogICAgIHJldHVybjsKICAgfQogCi0gIGV2ZW50SW5mbyogdG9FbnF1ZXVlID0gbmV3IGV2ZW50SW5mbygpOwotICB0b0VucXVldWUtPmV2ZW50QnVmZl8gPSAodWludDhfdCAqKXN0ZDo6bWFsbG9jKChzaXplb2YodWludDhfdCkgKiBldmVudExlbikgKyA0KTsKLSAgaWYgKHRvRW5xdWV1ZS0+ZXZlbnRCdWZmXyA9PSBOVUxMKSB7Ci0gICAgZGVsZXRlIHRvRW5xdWV1ZTsKLSAgICB0aHJvdyBzdGQ6OmJhZF9hbGxvYygpOwotICB9CisgIHN0ZDo6dW5pcXVlX3B0cjxldmVudEluZm8sIHVuaXF1ZURlbGV0ZXI8ZXZlbnRJbmZvPiA+IHRvRW5xdWV1ZShuZXcgZXZlbnRJbmZvKCkpOworICB0b0VucXVldWUtPmV2ZW50QnVmZl8gPSBuZXcgdWludDhfdFsoc2l6ZW9mKHVpbnQ4X3QpICogZXZlbnRMZW4pICsgNF07CisKICAgLy8gZmlyc3QgNCBieXRlcyBpcyB0aGUgZXZlbnQgbGVuZ3RoCiAgIG1lbWNweSh0b0VucXVldWUtPmV2ZW50QnVmZl8sICh2b2lkKikoJmV2ZW50TGVuKSwgNCk7CiAgIC8vIGFjdHVhbCBldmVudCBjb250ZW50cwpAQCAtMjI1LDE0ICsyMzUsMTMgQEAKICAgLy8gbWFrZSBzdXJlIHRoYXQgZW5xdWV1ZSBidWZmZXIgaXMgaW5pdGlhbGl6ZWQgYW5kIHdyaXRlciB0aHJlYWQgaXMgcnVubmluZwogICBpZiAoIWJ1ZmZlckFuZFRocmVhZEluaXRpYWxpemVkXykgewogICAgIGlmICghaW5pdEJ1ZmZlckFuZFdyaXRlVGhyZWFkKCkpIHsKLSAgICAgIGRlbGV0ZSB0b0VucXVldWU7CiAgICAgICByZXR1cm47CiAgICAgfQogICB9CiAKICAgLy8gQ2FuJ3QgZW5xdWV1ZSB3aGlsZSBidWZmZXIgaXMgZnVsbAogICB3aGlsZSAoZW5xdWV1ZUJ1ZmZlcl8tPmlzRnVsbCgpKSB7Ci0JICBub3RGdWxsXy53YWl0KCk7CisgICAgbm90RnVsbF8ud2FpdCgpOwogICB9CiAKICAgLy8gV2Ugc2hvdWxkbid0IGJlIHRyeWluZyB0byBlbnF1ZXVlIG5ldyBkYXRhIHdoaWxlIGEgZm9yY2VkIGZsdXNoIGlzCkBAIC0yNDEsOCArMjUwLDkgQEAKICAgYXNzZXJ0KCFmb3JjZUZsdXNoXyk7CiAKICAgLy8gYWRkIHRvIHRoZSBidWZmZXIKLSAgaWYgKCFlbnF1ZXVlQnVmZmVyXy0+YWRkRXZlbnQodG9FbnF1ZXVlKSkgewotICAgIGRlbGV0ZSB0b0VucXVldWU7CisgIGV2ZW50SW5mbyogcEV2ZW50ID0gdG9FbnF1ZXVlLnJlbGVhc2UoKTsKKyAgaWYgKCFlbnF1ZXVlQnVmZmVyXy0+YWRkRXZlbnQocEV2ZW50KSkgeworICAgIGRlbGV0ZSBwRXZlbnQ7CiAgICAgcmV0dXJuOwogICB9CiAKQEAgLTI3OCwyNSArMjg4LDIzIEBACiAgIH0KIAogICBpZiAoc3dhcCkgewotICAgIFRGaWxlVHJhbnNwb3J0QnVmZmVyICp0ZW1wID0gZW5xdWV1ZUJ1ZmZlcl87CisgICAgVEZpbGVUcmFuc3BvcnRCdWZmZXIqIHRlbXAgPSBlbnF1ZXVlQnVmZmVyXzsKICAgICBlbnF1ZXVlQnVmZmVyXyA9IGRlcXVldWVCdWZmZXJfOwogICAgIGRlcXVldWVCdWZmZXJfID0gdGVtcDsKICAgfQogCi0KICAgaWYgKHN3YXApIHsKLQkgIG5vdEZ1bGxfLm5vdGlmeSgpOworICAgIG5vdEZ1bGxfLm5vdGlmeSgpOwogICB9CiAKICAgcmV0dXJuIHN3YXA7CiB9CiAKLQogdm9pZCBURmlsZVRyYW5zcG9ydDo6d3JpdGVyVGhyZWFkKCkgewogICBib29sIGhhc0lPRXJyb3IgPSBmYWxzZTsKIAogICAvLyBvcGVuIGZpbGUgaWYgaXQgaXMgbm90IG9wZW4KLSAgaWYoIWZkXykgeworICBpZiAoIWZkXykgewogICAgIHRyeSB7CiAgICAgICBvcGVuTG9nRmlsZSgpOwogICAgIH0gY2F0Y2ggKC4uLikgewpAQCAtMzEzLDggKzMyMSwxMyBAQAogICAgICAgc2Vla1RvRW5kKCk7CiAgICAgICAvLyB0aHJvdyBhd2F5IGFueSBwYXJ0aWFsIGV2ZW50cwogICAgICAgb2Zmc2V0XyArPSByZWFkU3RhdGVfLmxhc3REaXNwYXRjaFB0cl87Ci0JICBUSFJJRlRfRlRSVU5DQVRFKGZkXywgb2Zmc2V0Xyk7Ci0gICAgICByZWFkU3RhdGVfLnJlc2V0QWxsVmFsdWVzKCk7CisgICAgICBpZiAoMCA9PSBUSFJJRlRfRlRSVU5DQVRFKGZkXywgb2Zmc2V0XykpIHsKKyAgICAgICAgcmVhZFN0YXRlXy5yZXNldEFsbFZhbHVlcygpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfRVJSTk87CisgICAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRGaWxlVHJhbnNwb3J0OiB3cml0ZXJUaHJlYWQoKSB0cnVuY2F0ZSAiLCBlcnJub19jb3B5KTsKKyAgICAgICAgaGFzSU9FcnJvciA9IHRydWU7CisgICAgICB9CiAgICAgfSBjYXRjaCAoLi4uKSB7CiAgICAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9FUlJOTzsKICAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRGaWxlVHJhbnNwb3J0OiB3cml0ZXJUaHJlYWQoKSBpbml0aWFsaXphdGlvbiAiLCBlcnJub19jb3B5KTsKQEAgLTMzNiwxMiArMzQ5LDEyIEBACiAKICAgICAgIC8vIFRyeSB0byBlbXB0eSBidWZmZXJzIGJlZm9yZSBleGl0CiAgICAgICBpZiAoZW5xdWV1ZUJ1ZmZlcl8tPmlzRW1wdHkoKSAmJiBkZXF1ZXVlQnVmZmVyXy0+aXNFbXB0eSgpKSB7Ci0JCTo6VEhSSUZUX0ZTWU5DKGZkXyk7CisgICAgICAgIDo6VEhSSUZUX0ZTWU5DKGZkXyk7CiAgICAgICAgIGlmICgtMSA9PSA6OlRIUklGVF9DTE9TRShmZF8pKSB7CiAgICAgICAgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfRVJSTk87CiAgICAgICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVEZpbGVUcmFuc3BvcnQ6IHdyaXRlclRocmVhZCgpIDo6Y2xvc2UoKSAiLCBlcnJub19jb3B5KTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAvL2ZkIHN1Y2Nlc3NmdWxseSBjbG9zZWQKKyAgICAgICAgICAvLyBmZCBzdWNjZXNzZnVsbHkgY2xvc2VkCiAgICAgICAgICAgZmRfID0gMDsKICAgICAgICAgfQogICAgICAgICByZXR1cm47CkBAIC0zNTEsMTMgKzM2NCwxOCBAQAogICAgIGlmIChzd2FwRXZlbnRCdWZmZXJzKCZ0c19uZXh0X2ZsdXNoKSkgewogICAgICAgZXZlbnRJbmZvKiBvdXRFdmVudDsKICAgICAgIHdoaWxlIChOVUxMICE9IChvdXRFdmVudCA9IGRlcXVldWVCdWZmZXJfLT5nZXROZXh0KCkpKSB7Ci0gICAgICAgIC8vIFJlbW92ZSBhbiBldmVudCBmcm9tIHRoZSBidWZmZXIgYW5kIHdyaXRlIGl0IG91dCB0byBkaXNrLiBJZiB0aGVyZSBpcyBhbnkgSU8gZXJyb3IsIGZvciBpbnN0YW5jZSwKLSAgICAgICAgLy8gdGhlIG91dHB1dCBmaWxlIGlzIHVubW91bnRlZCBvciBkZWxldGVkLCB0aGVuIHRoaXMgZXZlbnQgaXMgZHJvcHBlZC4gSG93ZXZlciwgdGhlIHdyaXRlciB0aHJlYWQKLSAgICAgICAgLy8gd2lsbDogKDEpIHNsZWVwIGZvciBhIHNob3J0IHdoaWxlOyAoMikgdHJ5IHRvIHJlb3BlbiB0aGUgZmlsZTsgKDMpIGlmIHN1Y2Nlc3NmdWwgdGhlbiBzdGFydCB3cml0aW5nCisgICAgICAgIC8vIFJlbW92ZSBhbiBldmVudCBmcm9tIHRoZSBidWZmZXIgYW5kIHdyaXRlIGl0IG91dCB0byBkaXNrLiBJZiB0aGVyZSBpcyBhbnkgSU8gZXJyb3IsIGZvcgorICAgICAgICAvLyBpbnN0YW5jZSwKKyAgICAgICAgLy8gdGhlIG91dHB1dCBmaWxlIGlzIHVubW91bnRlZCBvciBkZWxldGVkLCB0aGVuIHRoaXMgZXZlbnQgaXMgZHJvcHBlZC4gSG93ZXZlciwgdGhlIHdyaXRlcgorICAgICAgICAvLyB0aHJlYWQKKyAgICAgICAgLy8gd2lsbDogKDEpIHNsZWVwIGZvciBhIHNob3J0IHdoaWxlOyAoMikgdHJ5IHRvIHJlb3BlbiB0aGUgZmlsZTsgKDMpIGlmIHN1Y2Nlc3NmdWwgdGhlbgorICAgICAgICAvLyBzdGFydCB3cml0aW5nCiAgICAgICAgIC8vIGZyb20gdGhlIGVuZC4KIAogICAgICAgICB3aGlsZSAoaGFzSU9FcnJvcikgewotICAgICAgICAgIFRfRVJST1IoIlRGaWxlVHJhbnNwb3J0OiB3cml0ZXIgdGhyZWFkIGdvaW5nIHRvIHNsZWVwIGZvciAlZCBtaWNyb3NlY29uZHMgZHVlIHRvIElPIGVycm9ycyIsIHdyaXRlclRocmVhZElPRXJyb3JTbGVlcFRpbWVfKTsKKyAgICAgICAgICBUX0VSUk9SKAorICAgICAgICAgICAgICAiVEZpbGVUcmFuc3BvcnQ6IHdyaXRlciB0aHJlYWQgZ29pbmcgdG8gc2xlZXAgZm9yICV1IG1pY3Jvc2Vjb25kcyBkdWUgdG8gSU8gZXJyb3JzIiwKKyAgICAgICAgICAgICAgd3JpdGVyVGhyZWFkSU9FcnJvclNsZWVwVGltZV8pOwogICAgICAgICAgIFRIUklGVF9TTEVFUF9VU0VDKHdyaXRlclRocmVhZElPRXJyb3JTbGVlcFRpbWVfKTsKICAgICAgICAgICBpZiAoY2xvc2luZ18pIHsKICAgICAgICAgICAgIHJldHVybjsKQEAgLTM3MSwxNSArMzg5LDIwIEBACiAgICAgICAgICAgICBzZWVrVG9FbmQoKTsKICAgICAgICAgICAgIHVuZmx1c2hlZCA9IDA7CiAgICAgICAgICAgICBoYXNJT0Vycm9yID0gZmFsc2U7Ci0gICAgICAgICAgICBUX0xPR19PUEVSKCJURmlsZVRyYW5zcG9ydDogbG9nIGZpbGUgJXMgcmVvcGVuZWQgYnkgd3JpdGVyIHRocmVhZCBkdXJpbmcgZXJyb3IgcmVjb3ZlcnkiLCBmaWxlbmFtZV8uY19zdHIoKSk7CisgICAgICAgICAgICBUX0xPR19PUEVSKAorICAgICAgICAgICAgICAgICJURmlsZVRyYW5zcG9ydDogbG9nIGZpbGUgJXMgcmVvcGVuZWQgYnkgd3JpdGVyIHRocmVhZCBkdXJpbmcgZXJyb3IgcmVjb3ZlcnkiLAorICAgICAgICAgICAgICAgIGZpbGVuYW1lXy5jX3N0cigpKTsKICAgICAgICAgICB9IGNhdGNoICguLi4pIHsKLSAgICAgICAgICAgIFRfRVJST1IoIlRGaWxlVHJhbnNwb3J0OiB1bmFibGUgdG8gcmVvcGVuIGxvZyBmaWxlICVzIGR1cmluZyBlcnJvciByZWNvdmVyeSIsIGZpbGVuYW1lXy5jX3N0cigpKTsKKyAgICAgICAgICAgIFRfRVJST1IoIlRGaWxlVHJhbnNwb3J0OiB1bmFibGUgdG8gcmVvcGVuIGxvZyBmaWxlICVzIGR1cmluZyBlcnJvciByZWNvdmVyeSIsCisgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lXy5jX3N0cigpKTsKICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICAvLyBzYW5pdHkgY2hlY2sgb24gZXZlbnQKICAgICAgICAgaWYgKChtYXhFdmVudFNpemVfID4gMCkgJiYgKG91dEV2ZW50LT5ldmVudFNpemVfID4gbWF4RXZlbnRTaXplXykpIHsKLSAgICAgICAgICBUX0VSUk9SKCJtc2cgc2l6ZSBpcyBncmVhdGVyIHRoYW4gbWF4IGV2ZW50IHNpemU6ICV1ID4gJXVcbiIsIG91dEV2ZW50LT5ldmVudFNpemVfLCBtYXhFdmVudFNpemVfKTsKKyAgICAgICAgICBUX0VSUk9SKCJtc2cgc2l6ZSBpcyBncmVhdGVyIHRoYW4gbWF4IGV2ZW50IHNpemU6ICV1ID4gJXVcbiIsCisgICAgICAgICAgICAgICAgICBvdXRFdmVudC0+ZXZlbnRTaXplXywKKyAgICAgICAgICAgICAgICAgIG1heEV2ZW50U2l6ZV8pOwogICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAKQEAgLTM4NywxMiArNDEwLDE0IEBACiAgICAgICAgIGlmICgob3V0RXZlbnQtPmV2ZW50U2l6ZV8gPiAwKSAmJiAoY2h1bmtTaXplXyAhPSAwKSkgewogICAgICAgICAgIC8vIGV2ZW50IHNpemUgbXVzdCBiZSBsZXNzIHRoYW4gY2h1bmsgc2l6ZQogICAgICAgICAgIGlmIChvdXRFdmVudC0+ZXZlbnRTaXplXyA+IGNodW5rU2l6ZV8pIHsKLSAgICAgICAgICAgIFRfRVJST1IoIlRGaWxlVHJhbnNwb3J0OiBldmVudCBzaXplKCV1KSA+IGNodW5rIHNpemUoJXUpOiBza2lwcGluZyBldmVudCIsIG91dEV2ZW50LT5ldmVudFNpemVfLCBjaHVua1NpemVfKTsKKyAgICAgICAgICAgIFRfRVJST1IoIlRGaWxlVHJhbnNwb3J0OiBldmVudCBzaXplKCV1KSA+IGNodW5rIHNpemUoJXUpOiBza2lwcGluZyBldmVudCIsCisgICAgICAgICAgICAgICAgICAgIG91dEV2ZW50LT5ldmVudFNpemVfLAorICAgICAgICAgICAgICAgICAgICBjaHVua1NpemVfKTsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgIH0KIAotICAgICAgICAgIGludDY0X3QgY2h1bmsxID0gb2Zmc2V0Xy9jaHVua1NpemVfOwotICAgICAgICAgIGludDY0X3QgY2h1bmsyID0gKG9mZnNldF8gKyBvdXRFdmVudC0+ZXZlbnRTaXplXyAtIDEpL2NodW5rU2l6ZV87CisgICAgICAgICAgaW50NjRfdCBjaHVuazEgPSBvZmZzZXRfIC8gY2h1bmtTaXplXzsKKyAgICAgICAgICBpbnQ2NF90IGNodW5rMiA9IChvZmZzZXRfICsgb3V0RXZlbnQtPmV2ZW50U2l6ZV8gLSAxKSAvIGNodW5rU2l6ZV87CiAKICAgICAgICAgICAvLyBpZiBhZGRpbmcgdGhpcyBldmVudCB3aWxsIGNyb3NzIGEgY2h1bmsgYm91bmRhcnksIHBhZCB0aGUgY2h1bmsgd2l0aCB6ZXJvcwogICAgICAgICAgIGlmIChjaHVuazEgIT0gY2h1bmsyKSB7CkBAIC00MDUsNyArNDMwLDggQEAKICAgICAgICAgICAgIGJvb3N0OjpzY29wZWRfYXJyYXk8dWludDhfdD4gYXJyYXkoemVyb3MpOwogICAgICAgICAgICAgaWYgKC0xID09IDo6d3JpdGUoZmRfLCB6ZXJvcywgcGFkZGluZykpIHsKICAgICAgICAgICAgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfRVJSTk87Ci0gICAgICAgICAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRGaWxlVHJhbnNwb3J0OiB3cml0ZXJUaHJlYWQoKSBlcnJvciB3aGlsZSBwYWRkaW5nIHplcm9zICIsIGVycm5vX2NvcHkpOworICAgICAgICAgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJURmlsZVRyYW5zcG9ydDogd3JpdGVyVGhyZWFkKCkgZXJyb3Igd2hpbGUgcGFkZGluZyB6ZXJvcyAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vX2NvcHkpOwogICAgICAgICAgICAgICBoYXNJT0Vycm9yID0gdHJ1ZTsKICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CkBAIC00NDAsMjQgKzQ2NiwyNCBAQAogICAgIC8vIHRpbWUsIGl0IGNvdWxkIGhhdmUgY2hhbmdlZCBzdGF0ZSBpbiBiZXR3ZWVuLiAgVGhpcyB3aWxsIHJlc3VsdCBpbiB1cwogICAgIC8vIG1ha2luZyBpbmNvbnNpc3RlbnQgZGVjaXNpb25zLgogICAgIGJvb2wgZm9yY2VkX2ZsdXNoID0gZmFsc2U7Ci0JewotICAgIEd1YXJkIGcobXV0ZXhfKTsKLSAgICBpZiAoZm9yY2VGbHVzaF8pIHsKLSAgICAgIGlmICghZW5xdWV1ZUJ1ZmZlcl8tPmlzRW1wdHkoKSkgewotICAgICAgICAvLyBJZiBmb3JjZUZsdXNoXyBpcyB0cnVlLCB3ZSBuZWVkIHRvIGZsdXNoIGFsbCBhdmFpbGFibGUgZGF0YS4KLSAgICAgICAgLy8gSWYgZW5xdWV1ZUJ1ZmZlcl8gaXMgbm90IGVtcHR5LCBnbyBiYWNrIHRvIHRoZSBzdGFydCBvZiB0aGUgbG9vcCB0bwotICAgICAgICAvLyB3cml0ZSBpdCBvdXQuCi0gICAgICAgIC8vCi0gICAgICAgIC8vIFdlIGtub3cgdGhlIG1haW4gdGhyZWFkIGlzIHdhaXRpbmcgb24gZm9yY2VGbHVzaF8gdG8gYmUgY2xlYXJlZCwKLSAgICAgICAgLy8gc28gbm8gbmV3IGV2ZW50cyB3aWxsIGJlIGFkZGVkIHRvIGVucXVldWVCdWZmZXJfIHVudGlsIHdlIGNsZWFyCi0gICAgICAgIC8vIGZvcmNlRmx1c2hfLiAgVGhlcmVmb3JlIHRoZSBuZXh0IHRpbWUgYXJvdW5kIHRoZSBsb29wIGVucXVldWVCdWZmZXJfCi0gICAgICAgIC8vIGlzIGd1YXJhbnRlZWQgdG8gYmUgZW1wdHkuICAoSS5lLiwgd2UncmUgZ3VhcmFudGVlZCB0byBtYWtlIHByb2dyZXNzCi0gICAgICAgIC8vIGFuZCBjbGVhciBmb3JjZUZsdXNoXyB0aGUgbmV4dCB0aW1lIGFyb3VuZCB0aGUgbG9vcC4pCi0gICAgICAgIGNvbnRpbnVlOworICAgIHsKKyAgICAgIEd1YXJkIGcobXV0ZXhfKTsKKyAgICAgIGlmIChmb3JjZUZsdXNoXykgeworICAgICAgICBpZiAoIWVucXVldWVCdWZmZXJfLT5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAvLyBJZiBmb3JjZUZsdXNoXyBpcyB0cnVlLCB3ZSBuZWVkIHRvIGZsdXNoIGFsbCBhdmFpbGFibGUgZGF0YS4KKyAgICAgICAgICAvLyBJZiBlbnF1ZXVlQnVmZmVyXyBpcyBub3QgZW1wdHksIGdvIGJhY2sgdG8gdGhlIHN0YXJ0IG9mIHRoZSBsb29wIHRvCisgICAgICAgICAgLy8gd3JpdGUgaXQgb3V0LgorICAgICAgICAgIC8vCisgICAgICAgICAgLy8gV2Uga25vdyB0aGUgbWFpbiB0aHJlYWQgaXMgd2FpdGluZyBvbiBmb3JjZUZsdXNoXyB0byBiZSBjbGVhcmVkLAorICAgICAgICAgIC8vIHNvIG5vIG5ldyBldmVudHMgd2lsbCBiZSBhZGRlZCB0byBlbnF1ZXVlQnVmZmVyXyB1bnRpbCB3ZSBjbGVhcgorICAgICAgICAgIC8vIGZvcmNlRmx1c2hfLiAgVGhlcmVmb3JlIHRoZSBuZXh0IHRpbWUgYXJvdW5kIHRoZSBsb29wIGVucXVldWVCdWZmZXJfCisgICAgICAgICAgLy8gaXMgZ3VhcmFudGVlZCB0byBiZSBlbXB0eS4gIChJLmUuLCB3ZSdyZSBndWFyYW50ZWVkIHRvIG1ha2UgcHJvZ3Jlc3MKKyAgICAgICAgICAvLyBhbmQgY2xlYXIgZm9yY2VGbHVzaF8gdGhlIG5leHQgdGltZSBhcm91bmQgdGhlIGxvb3AuKQorICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGZvcmNlZF9mbHVzaCA9IHRydWU7CiAgICAgICB9Ci0gICAgICBmb3JjZWRfZmx1c2ggPSB0cnVlOwotCX0KLQl9CisgICAgfQogCiAgICAgLy8gZGV0ZXJtaW5lIGlmIHdlIG5lZWQgdG8gcGVyZm9ybSBhbiBmc3luYwogICAgIGJvb2wgZmx1c2ggPSBmYWxzZTsKQEAgLTQ2Niw5ICs0OTIsOSBAQAogICAgIH0gZWxzZSB7CiAgICAgICBzdHJ1Y3QgdGltZXZhbCBjdXJyZW50X3RpbWU7CiAgICAgICBUSFJJRlRfR0VUVElNRU9GREFZKCZjdXJyZW50X3RpbWUsIE5VTEwpOwotICAgICAgaWYgKGN1cnJlbnRfdGltZS50dl9zZWMgPiB0c19uZXh0X2ZsdXNoLnR2X3NlYyB8fAotICAgICAgICAgIChjdXJyZW50X3RpbWUudHZfc2VjID09IHRzX25leHRfZmx1c2gudHZfc2VjICYmCi0gICAgICAgICAgIGN1cnJlbnRfdGltZS50dl91c2VjID4gdHNfbmV4dF9mbHVzaC50dl91c2VjKSkgeworICAgICAgaWYgKGN1cnJlbnRfdGltZS50dl9zZWMgPiB0c19uZXh0X2ZsdXNoLnR2X3NlYworICAgICAgICAgIHx8IChjdXJyZW50X3RpbWUudHZfc2VjID09IHRzX25leHRfZmx1c2gudHZfc2VjCisgICAgICAgICAgICAgICYmIGN1cnJlbnRfdGltZS50dl91c2VjID4gdHNfbmV4dF9mbHVzaC50dl91c2VjKSkgewogICAgICAgICBpZiAodW5mbHVzaGVkID4gMCkgewogICAgICAgICAgIGZsdXNoID0gdHJ1ZTsKICAgICAgICAgfSBlbHNlIHsKQEAgLTQ4MSw3ICs1MDcsNyBAQAogCiAgICAgaWYgKGZsdXNoKSB7CiAgICAgICAvLyBzeW5jIChmb3JjZSBmbHVzaCkgZmlsZSB0byBkaXNrCi0JICBUSFJJRlRfRlNZTkMoZmRfKTsKKyAgICAgIFRIUklGVF9GU1lOQyhmZF8pOwogICAgICAgdW5mbHVzaGVkID0gMDsKICAgICAgIGdldE5leHRGbHVzaFRpbWUoJnRzX25leHRfZmx1c2gpOwogCkBAIC00OTEsNyArNTE3LDcgQEAKICAgICAgICAgZm9yY2VGbHVzaF8gPSBmYWxzZTsKICAgICAgICAgYXNzZXJ0KGVucXVldWVCdWZmZXJfLT5pc0VtcHR5KCkpOwogICAgICAgICBhc3NlcnQoZGVxdWV1ZUJ1ZmZlcl8tPmlzRW1wdHkoKSk7Ci0JCWZsdXNoZWRfLm5vdGlmeUFsbCgpOworICAgICAgICBmbHVzaGVkXy5ub3RpZnlBbGwoKTsKICAgICAgIH0KICAgICB9CiAgIH0KQEAgLTUxNSwxMyArNTQxLDEyIEBACiAgIH0KIH0KIAotCiB1aW50MzJfdCBURmlsZVRyYW5zcG9ydDo6cmVhZEFsbCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewogICB1aW50MzJfdCBoYXZlID0gMDsKICAgdWludDMyX3QgZ2V0ID0gMDsKIAogICB3aGlsZSAoaGF2ZSA8IGxlbikgewotICAgIGdldCA9IHJlYWQoYnVmK2hhdmUsIGxlbi1oYXZlKTsKKyAgICBnZXQgPSByZWFkKGJ1ZiArIGhhdmUsIGxlbiAtIGhhdmUpOwogICAgIGlmIChnZXQgPD0gMCkgewogICAgICAgdGhyb3cgVEVPRkV4Y2VwdGlvbigpOwogICAgIH0KQEAgLTU2NCwxMSArNTg5LDkgQEAKICAgaWYgKHJlbWFpbmluZyA8PSAoaW50MzJfdClsZW4pIHsKICAgICAvLyBjb3B5IG92ZXIgYW55dGhpbmcgdGhhdHMgcmVtYWluaW5nCiAgICAgaWYgKHJlbWFpbmluZyA+IDApIHsKLSAgICAgIG1lbWNweShidWYsCi0gICAgICAgICAgICAgY3VycmVudEV2ZW50Xy0+ZXZlbnRCdWZmXyArIGN1cnJlbnRFdmVudF8tPmV2ZW50QnVmZlBvc18sCi0gICAgICAgICAgICAgcmVtYWluaW5nKTsKKyAgICAgIG1lbWNweShidWYsIGN1cnJlbnRFdmVudF8tPmV2ZW50QnVmZl8gKyBjdXJyZW50RXZlbnRfLT5ldmVudEJ1ZmZQb3NfLCByZW1haW5pbmcpOwogICAgIH0KLSAgICBkZWxldGUoY3VycmVudEV2ZW50Xyk7CisgICAgZGVsZXRlIChjdXJyZW50RXZlbnRfKTsKICAgICBjdXJyZW50RXZlbnRfID0gTlVMTDsKICAgICByZXR1cm4gcmVtYWluaW5nOwogICB9CkBAIC01OTIsNyArNjE1LDcgQEAKICAgICBpZiAocmVhZFN0YXRlXy5idWZmZXJQdHJfID09IHJlYWRTdGF0ZV8uYnVmZmVyTGVuXykgewogICAgICAgLy8gYWR2YW5jZSB0aGUgb2Zmc2V0IHBvaW50ZXIKICAgICAgIG9mZnNldF8gKz0gcmVhZFN0YXRlXy5idWZmZXJMZW5fOwotCSAgcmVhZFN0YXRlXy5idWZmZXJMZW5fID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KDo6VEhSSUZUX1JFQUQoZmRfLCByZWFkQnVmZl8sIHJlYWRCdWZmU2l6ZV8pKTsKKyAgICAgIHJlYWRTdGF0ZV8uYnVmZmVyTGVuXyA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pig6OlRIUklGVF9SRUFEKGZkXywgcmVhZEJ1ZmZfLCByZWFkQnVmZlNpemVfKSk7CiAgICAgICAvLyAgICAgICBpZiAocmVhZFN0YXRlXy5idWZmZXJMZW5fKSB7CiAgICAgICAvLyAgICAgICAgIFRfREVCVUdfTCgxLCAiQW1vdW50IHJlYWQ6ICV1IChvZmZzZXQ6ICVsdSkiLCByZWFkU3RhdGVfLmJ1ZmZlckxlbl8sIG9mZnNldF8pOwogICAgICAgLy8gICAgICAgfQpAQCAtNjA0LDcgKzYyNyw3IEBACiAgICAgICAgIHJlYWRTdGF0ZV8ucmVzZXRBbGxWYWx1ZXMoKTsKICAgICAgICAgR2xvYmFsT3V0cHV0KCJURmlsZVRyYW5zcG9ydDogZXJyb3Igd2hpbGUgcmVhZGluZyBmcm9tIGZpbGUiKTsKICAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbigiVEZpbGVUcmFuc3BvcnQ6IGVycm9yIHdoaWxlIHJlYWRpbmcgZnJvbSBmaWxlIik7Ci0gICAgICB9IGVsc2UgaWYgKHJlYWRTdGF0ZV8uYnVmZmVyTGVuXyA9PSAwKSB7ICAvLyBFT0YKKyAgICAgIH0gZWxzZSBpZiAocmVhZFN0YXRlXy5idWZmZXJMZW5fID09IDApIHsgLy8gRU9GCiAgICAgICAgIC8vIHdhaXQgaW5kZWZpbml0ZWx5IGlmIHRoZXJlIGlzIG5vIHRpbWVvdXQKICAgICAgICAgaWYgKHJlYWRUaW1lb3V0XyA9PSBUQUlMX1JFQURfVElNRU9VVCkgewogICAgICAgICAgIFRIUklGVF9TTEVFUF9VU0VDKGVvZlNsZWVwVGltZV8pOwpAQCAtNjMwLDExICs2NTMsMTEgQEAKICAgICByZWFkVHJpZXMgPSAwOwogCiAgICAgLy8gYXR0ZW1wdCB0byByZWFkIGFuIGV2ZW50IGZyb20gdGhlIGJ1ZmZlcgotICAgIHdoaWxlKHJlYWRTdGF0ZV8uYnVmZmVyUHRyXyA8IHJlYWRTdGF0ZV8uYnVmZmVyTGVuXykgeworICAgIHdoaWxlIChyZWFkU3RhdGVfLmJ1ZmZlclB0cl8gPCByZWFkU3RhdGVfLmJ1ZmZlckxlbl8pIHsKICAgICAgIGlmIChyZWFkU3RhdGVfLnJlYWRpbmdTaXplXykgewotICAgICAgICBpZihyZWFkU3RhdGVfLmV2ZW50U2l6ZUJ1ZmZQb3NfID09IDApIHsKLSAgICAgICAgICBpZiAoIChvZmZzZXRfICsgcmVhZFN0YXRlXy5idWZmZXJQdHJfKS9jaHVua1NpemVfICE9Ci0gICAgICAgICAgICAgICAoKG9mZnNldF8gKyByZWFkU3RhdGVfLmJ1ZmZlclB0cl8gKyAzKS9jaHVua1NpemVfKSkgeworICAgICAgICBpZiAocmVhZFN0YXRlXy5ldmVudFNpemVCdWZmUG9zXyA9PSAwKSB7CisgICAgICAgICAgaWYgKChvZmZzZXRfICsgcmVhZFN0YXRlXy5idWZmZXJQdHJfKSAvIGNodW5rU2l6ZV8KKyAgICAgICAgICAgICAgIT0gKChvZmZzZXRfICsgcmVhZFN0YXRlXy5idWZmZXJQdHJfICsgMykgLyBjaHVua1NpemVfKSkgewogICAgICAgICAgICAgLy8gc2tpcCBvbmUgYnl0ZSB0b3dhcmRzIGNodW5rIGJvdW5kYXJ5CiAgICAgICAgICAgICAvLyAgICAgICAgICAgIFRfREVCVUdfTCgxLCAiU2tpcHBpbmcgYSBieXRlIik7CiAgICAgICAgICAgICByZWFkU3RhdGVfLmJ1ZmZlclB0cl8rKzsKQEAgLTY0Miw4ICs2NjUsOCBAQAogICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIHJlYWRTdGF0ZV8uZXZlbnRTaXplQnVmZl9bcmVhZFN0YXRlXy5ldmVudFNpemVCdWZmUG9zXysrXSA9Ci0gICAgICAgICAgcmVhZEJ1ZmZfW3JlYWRTdGF0ZV8uYnVmZmVyUHRyXysrXTsKKyAgICAgICAgcmVhZFN0YXRlXy5ldmVudFNpemVCdWZmX1tyZWFkU3RhdGVfLmV2ZW50U2l6ZUJ1ZmZQb3NfKytdCisgICAgICAgICAgICA9IHJlYWRCdWZmX1tyZWFkU3RhdGVfLmJ1ZmZlclB0cl8rK107CiAKICAgICAgICAgaWYgKHJlYWRTdGF0ZV8uZXZlbnRTaXplQnVmZlBvc18gPT0gNCkgewogICAgICAgICAgIGlmIChyZWFkU3RhdGVfLmdldEV2ZW50U2l6ZSgpID09IDApIHsKQEAgLTY1NSw3ICs2NzgsNyBAQAogICAgICAgICAgIC8vIGdvdCBhIHZhbGlkIGV2ZW50CiAgICAgICAgICAgcmVhZFN0YXRlXy5yZWFkaW5nU2l6ZV8gPSBmYWxzZTsKICAgICAgICAgICBpZiAocmVhZFN0YXRlXy5ldmVudF8pIHsKLSAgICAgICAgICAgIGRlbGV0ZShyZWFkU3RhdGVfLmV2ZW50Xyk7CisgICAgICAgICAgICBkZWxldGUgKHJlYWRTdGF0ZV8uZXZlbnRfKTsKICAgICAgICAgICB9CiAgICAgICAgICAgcmVhZFN0YXRlXy5ldmVudF8gPSBuZXcgZXZlbnRJbmZvKCk7CiAgICAgICAgICAgcmVhZFN0YXRlXy5ldmVudF8tPmV2ZW50U2l6ZV8gPSByZWFkU3RhdGVfLmdldEV2ZW50U2l6ZSgpOwpAQCAtNjczLDggKzY5Niw4IEBACiAgICAgICAgICAgcmVhZFN0YXRlXy5ldmVudF8tPmV2ZW50QnVmZlBvc18gPSAwOwogICAgICAgICB9CiAgICAgICAgIC8vIHRha2UgZWl0aGVyIHRoZSBlbnRpcmUgZXZlbnQgb3IgdGhlIHJlbWFpbmluZyBieXRlcyBpbiB0aGUgYnVmZmVyCi0gICAgICAgIGludCByZWNsYWltQnVmZmVyID0gbWluKCh1aW50MzJfdCkocmVhZFN0YXRlXy5idWZmZXJMZW5fIC0gcmVhZFN0YXRlXy5idWZmZXJQdHJfKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZFN0YXRlXy5ldmVudF8tPmV2ZW50U2l6ZV8gLSByZWFkU3RhdGVfLmV2ZW50Xy0+ZXZlbnRCdWZmUG9zXyk7CisgICAgICAgIGludCByZWNsYWltQnVmZmVyID0gKHN0ZDo6bWluKSgodWludDMyX3QpKHJlYWRTdGF0ZV8uYnVmZmVyTGVuXyAtIHJlYWRTdGF0ZV8uYnVmZmVyUHRyXyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkU3RhdGVfLmV2ZW50Xy0+ZXZlbnRTaXplXyAtIHJlYWRTdGF0ZV8uZXZlbnRfLT5ldmVudEJ1ZmZQb3NfKTsKIAogICAgICAgICAvLyBjb3B5IGRhdGEgZnJvbSByZWFkIGJ1ZmZlciBpbnRvIGV2ZW50IGJ1ZmZlcgogICAgICAgICBtZW1jcHkocmVhZFN0YXRlXy5ldmVudF8tPmV2ZW50QnVmZl8gKyByZWFkU3RhdGVfLmV2ZW50Xy0+ZXZlbnRCdWZmUG9zXywKQEAgLTY5OSwyNCArNzIyLDI2IEBACiAgICAgICAgIH0KICAgICAgIH0KICAgICB9Ci0KICAgfQogfQogCiBib29sIFRGaWxlVHJhbnNwb3J0Ojppc0V2ZW50Q29ycnVwdGVkKCkgewogICAvLyBhbiBlcnJvciBpcyB0cmlnZ2VyZWQgaWY6Ci0gIGlmICggKG1heEV2ZW50U2l6ZV8gPiAwKSAmJiAgKHJlYWRTdGF0ZV8uZXZlbnRfLT5ldmVudFNpemVfID4gbWF4RXZlbnRTaXplXykpIHsKKyAgaWYgKChtYXhFdmVudFNpemVfID4gMCkgJiYgKHJlYWRTdGF0ZV8uZXZlbnRfLT5ldmVudFNpemVfID4gbWF4RXZlbnRTaXplXykpIHsKICAgICAvLyAxLiBFdmVudCBzaXplIGlzIGxhcmdlciB0aGFuIHVzZXItc3BlZmljaWVkIG1heC1ldmVudCBzaXplCiAgICAgVF9FUlJPUigiUmVhZCBjb3JydXB0IGV2ZW50LiBFdmVudCBzaXplKCV1KSBncmVhdGVyIHRoYW4gbWF4IGV2ZW50IHNpemUgKCV1KSIsCi0gICAgICAgICAgICByZWFkU3RhdGVfLmV2ZW50Xy0+ZXZlbnRTaXplXywgbWF4RXZlbnRTaXplXyk7CisgICAgICAgICAgICByZWFkU3RhdGVfLmV2ZW50Xy0+ZXZlbnRTaXplXywKKyAgICAgICAgICAgIG1heEV2ZW50U2l6ZV8pOwogICAgIHJldHVybiB0cnVlOwogICB9IGVsc2UgaWYgKHJlYWRTdGF0ZV8uZXZlbnRfLT5ldmVudFNpemVfID4gY2h1bmtTaXplXykgewogICAgIC8vIDIuIEV2ZW50IHNpemUgaXMgbGFyZ2VyIHRoYW4gY2h1bmsgc2l6ZQogICAgIFRfRVJST1IoIlJlYWQgY29ycnVwdCBldmVudC4gRXZlbnQgc2l6ZSgldSkgZ3JlYXRlciB0aGFuIGNodW5rIHNpemUgKCV1KSIsCi0gICAgICAgICAgICAgICByZWFkU3RhdGVfLmV2ZW50Xy0+ZXZlbnRTaXplXywgY2h1bmtTaXplXyk7CisgICAgICAgICAgICByZWFkU3RhdGVfLmV2ZW50Xy0+ZXZlbnRTaXplXywKKyAgICAgICAgICAgIGNodW5rU2l6ZV8pOwogICAgIHJldHVybiB0cnVlOwotICB9IGVsc2UgaWYoICgob2Zmc2V0XyArIHJlYWRTdGF0ZV8uYnVmZmVyUHRyXyAtIDQpL2NodW5rU2l6ZV8pICE9Ci0gICAgICAgICAgICAgKChvZmZzZXRfICsgcmVhZFN0YXRlXy5idWZmZXJQdHJfICsgcmVhZFN0YXRlXy5ldmVudF8tPmV2ZW50U2l6ZV8gLSAxKS9jaHVua1NpemVfKSApIHsKKyAgfSBlbHNlIGlmICgoKG9mZnNldF8gKyByZWFkU3RhdGVfLmJ1ZmZlclB0cl8gLSA0KSAvIGNodW5rU2l6ZV8pCisgICAgICAgICAgICAgIT0gKChvZmZzZXRfICsgcmVhZFN0YXRlXy5idWZmZXJQdHJfICsgcmVhZFN0YXRlXy5ldmVudF8tPmV2ZW50U2l6ZV8gLSAxKQorICAgICAgICAgICAgICAgICAvIGNodW5rU2l6ZV8pKSB7CiAgICAgLy8gMy4gc2l6ZSBpbmRpY2F0ZXMgdGhhdCBldmVudCBjcm9zc2VzIGNodW5rIGJvdW5kYXJ5CiAgICAgVF9FUlJPUigiUmVhZCBjb3JydXB0IGV2ZW50LiBFdmVudCBjcm9zc2VzIGNodW5rIGJvdW5kYXJ5LiBFdmVudCBzaXplOiV1ICBPZmZzZXQ6JWx1IiwKICAgICAgICAgICAgIHJlYWRTdGF0ZV8uZXZlbnRfLT5ldmVudFNpemVfLApAQCAtNzUwLDcgKzc3NSw3IEBACiAgICAgfSBlbHNlIGlmIChyZWFkVGltZW91dF8gPT0gVEFJTF9SRUFEX1RJTUVPVVQpIHsKICAgICAgIC8vIGlmIHRhaWxpbmcgdGhlIGZpbGUsIHdhaXQgdW50aWwgdGhlcmUgaXMgZW5vdWdoIGRhdGEgdG8gc3RhcnQKICAgICAgIC8vIHRoZSBuZXh0IGNodW5rCi0gICAgICB3aGlsZShjdXJDaHVuayA9PSAoZ2V0TnVtQ2h1bmtzKCkgLSAxKSkgeworICAgICAgd2hpbGUgKGN1ckNodW5rID09IChnZXROdW1DaHVua3MoKSAtIDEpKSB7CiAgICAgICAgIFRIUklGVF9TTEVFUF9VU0VDKGNvcnJ1cHRlZEV2ZW50U2xlZXBUaW1lXyk7CiAgICAgICB9CiAgICAgICBzZWVrVG9DaHVuayhjdXJDaHVuayArIDEpOwpAQCAtNzYwLDE0ICs3ODUsMTQgQEAKICAgICAgIHJlYWRTdGF0ZV8ucmVzZXRTdGF0ZShyZWFkU3RhdGVfLmxhc3REaXNwYXRjaFB0cl8pOwogICAgICAgY3VycmVudEV2ZW50XyA9IE5VTEw7CiAgICAgICBjaGFyIGVycm9yTXNnWzEwMjRdOwotICAgICAgc3ByaW50ZihlcnJvck1zZywgIlRGaWxlVHJhbnNwb3J0OiBsb2cgZmlsZSBjb3JydXB0ZWQgYXQgb2Zmc2V0OiAlbHUiLAorICAgICAgc3ByaW50ZihlcnJvck1zZywKKyAgICAgICAgICAgICAgIlRGaWxlVHJhbnNwb3J0OiBsb2cgZmlsZSBjb3JydXB0ZWQgYXQgb2Zmc2V0OiAlbHUiLAogICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPihvZmZzZXRfICsgcmVhZFN0YXRlXy5sYXN0RGlzcGF0Y2hQdHJfKSk7CiAKICAgICAgIEdsb2JhbE91dHB1dChlcnJvck1zZyk7CiAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKGVycm9yTXNnKTsKICAgICB9CiAgIH0KLQogfQogCiB2b2lkIFRGaWxlVHJhbnNwb3J0OjpzZWVrVG9DaHVuayhpbnQzMl90IGNodW5rKSB7CkBAIC04MTgsNyArODQzLDcgQEAKICAgICB1aW50MzJfdCBvbGRSZWFkVGltZW91dCA9IGdldFJlYWRUaW1lb3V0KCk7CiAgICAgc2V0UmVhZFRpbWVvdXQoTk9fVEFJTF9SRUFEX1RJTUVPVVQpOwogICAgIC8vIGtlZXAgb24gcmVhZGluZyB1bnRpIHRoZSBsYXN0IGV2ZW50IGF0IHBvaW50IG9mIHNlZWtDaHVuayBjYWxsCi0gICAgYm9vc3Q6OnNjb3BlZF9wdHI8ZXZlbnRJbmZvPiBldmVudDsKKyAgICBzaGFyZWRfcHRyPGV2ZW50SW5mbz4gZXZlbnQ7CiAgICAgd2hpbGUgKChvZmZzZXRfICsgcmVhZFN0YXRlXy5idWZmZXJQdHJfKSA8IG1pbkVuZE9mZnNldCkgewogICAgICAgZXZlbnQucmVzZXQocmVhZEV2ZW50KCkpOwogICAgICAgaWYgKGV2ZW50LmdldCgpID09IE5VTEwpIHsKQEAgLTgyNyw3ICs4NTIsNiBAQAogICAgIH0KICAgICBzZXRSZWFkVGltZW91dChvbGRSZWFkVGltZW91dCk7CiAgIH0KLQogfQogCiB2b2lkIFRGaWxlVHJhbnNwb3J0OjpzZWVrVG9FbmQoKSB7CkBAIC04NTAsNyArODc0LDcgQEAKICAgfQogCiAgIGlmIChmX2luZm8uc3Rfc2l6ZSA+IDApIHsKLSAgICBzaXplX3QgbnVtQ2h1bmtzID0gKChmX2luZm8uc3Rfc2l6ZSkvY2h1bmtTaXplXykgKyAxOworICAgIHNpemVfdCBudW1DaHVua3MgPSAoKGZfaW5mby5zdF9zaXplKSAvIGNodW5rU2l6ZV8pICsgMTsKICAgICBpZiAobnVtQ2h1bmtzID4gKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgpKCkpCiAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJUb28gbWFueSBjaHVua3MiKTsKICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KG51bUNodW5rcyk7CkBAIC04NjEsMTMgKzg4NSwxMyBAQAogfQogCiB1aW50MzJfdCBURmlsZVRyYW5zcG9ydDo6Z2V0Q3VyQ2h1bmsoKSB7Ci0gIHJldHVybiBzdGF0aWNfY2FzdDx1aW50MzJfdD4ob2Zmc2V0Xy9jaHVua1NpemVfKTsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQzMl90PihvZmZzZXRfIC8gY2h1bmtTaXplXyk7CiB9CiAKIC8vIFV0aWxpdHkgRnVuY3Rpb25zCiB2b2lkIFRGaWxlVHJhbnNwb3J0OjpvcGVuTG9nRmlsZSgpIHsKICNpZm5kZWYgX1dJTjMyCi0gIG1vZGVfdCBtb2RlID0gcmVhZE9ubHlfID8gU19JUlVTUiB8IFNfSVJHUlAgfCBTX0lST1RIIDogU19JUlVTUiB8IFNfSVdVU1J8IFNfSVJHUlAgfCBTX0lST1RIOworICBtb2RlX3QgbW9kZSA9IHJlYWRPbmx5XyA/IFNfSVJVU1IgfCBTX0lSR1JQIHwgU19JUk9USCA6IFNfSVJVU1IgfCBTX0lXVVNSIHwgU19JUkdSUCB8IFNfSVJPVEg7CiAgIGludCBmbGFncyA9IHJlYWRPbmx5XyA/IE9fUkRPTkxZIDogT19SRFdSIHwgT19DUkVBVCB8IE9fQVBQRU5EOwogI2Vsc2UKICAgaW50IG1vZGUgPSByZWFkT25seV8gPyBfU19JUkVBRCA6IF9TX0lSRUFEIHwgX1NfSVdSSVRFOwpAQCAtODc3LDEyICs5MDEsMTEgQEAKICAgb2Zmc2V0XyA9IDA7CiAKICAgLy8gbWFrZSBzdXJlIG9wZW4gY2FsbCB3YXMgc3VjY2Vzc2Z1bAotICBpZihmZF8gPT0gLTEpIHsKKyAgaWYgKGZkXyA9PSAtMSkgewogICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0VSUk5POwogICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRGaWxlVHJhbnNwb3J0OiBvcGVuTG9nRmlsZSgpIDo6b3BlbigpIGZpbGU6ICIgKyBmaWxlbmFtZV8sIGVycm5vX2NvcHkpOwogICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sIGZpbGVuYW1lXywgZXJybm9fY29weSk7CiAgIH0KLQogfQogCiB2b2lkIFRGaWxlVHJhbnNwb3J0OjpnZXROZXh0Rmx1c2hUaW1lKHN0cnVjdCB0aW1ldmFsKiB0c19uZXh0X2ZsdXNoKSB7CkBAIC04OTcsMTIgKzkyMCw4IEBACiB9CiAKIFRGaWxlVHJhbnNwb3J0QnVmZmVyOjpURmlsZVRyYW5zcG9ydEJ1ZmZlcih1aW50MzJfdCBzaXplKQotICA6IGJ1ZmZlck1vZGVfKFdSSVRFKQotICAsIHdyaXRlUG9pbnRfKDApCi0gICwgcmVhZFBvaW50XygwKQotICAsIHNpemVfKHNpemUpCi17Ci0gIGJ1ZmZlcl8gPSBuZXcgZXZlbnRJbmZvKltzaXplXTsKKyAgOiBidWZmZXJNb2RlXyhXUklURSksIHdyaXRlUG9pbnRfKDApLCByZWFkUG9pbnRfKDApLCBzaXplXyhzaXplKSB7CisgIGJ1ZmZlcl8gPSBuZXcgZXZlbnRJbmZvKiBbc2l6ZV07CiB9CiAKIFRGaWxlVHJhbnNwb3J0QnVmZmVyOjp+VEZpbGVUcmFuc3BvcnRCdWZmZXIoKSB7CkBAIC05MTUsNyArOTM0LDcgQEAKICAgfQogfQogCi1ib29sIFRGaWxlVHJhbnNwb3J0QnVmZmVyOjphZGRFdmVudChldmVudEluZm8gKmV2ZW50KSB7Citib29sIFRGaWxlVHJhbnNwb3J0QnVmZmVyOjphZGRFdmVudChldmVudEluZm8qIGV2ZW50KSB7CiAgIGlmIChidWZmZXJNb2RlXyA9PSBSRUFEKSB7CiAgICAgR2xvYmFsT3V0cHV0KCJUcnlpbmcgdG8gd3JpdGUgdG8gYSBidWZmZXIgaW4gcmVhZCBtb2RlIik7CiAgIH0KQEAgLTk2MywxMSArOTgyLDExIEBACiAKIFRGaWxlUHJvY2Vzc29yOjpURmlsZVByb2Nlc3NvcihzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PiBpbnB1dFRyYW5zcG9ydCk6Ci0gIHByb2Nlc3Nvcl8ocHJvY2Vzc29yKSwKLSAgaW5wdXRQcm90b2NvbEZhY3RvcnlfKHByb3RvY29sRmFjdG9yeSksCi0gIG91dHB1dFByb3RvY29sRmFjdG9yeV8ocHJvdG9jb2xGYWN0b3J5KSwKLSAgaW5wdXRUcmFuc3BvcnRfKGlucHV0VHJhbnNwb3J0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxURmlsZVJlYWRlclRyYW5zcG9ydD4gaW5wdXRUcmFuc3BvcnQpCisgIDogcHJvY2Vzc29yXyhwcm9jZXNzb3IpLAorICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5Xyhwcm90b2NvbEZhY3RvcnkpLAorICAgIG91dHB1dFByb3RvY29sRmFjdG9yeV8ocHJvdG9jb2xGYWN0b3J5KSwKKyAgICBpbnB1dFRyYW5zcG9ydF8oaW5wdXRUcmFuc3BvcnQpIHsKIAogICAvLyBkZWZhdWx0IHRoZSBvdXRwdXQgdHJhbnNwb3J0IHRvIGEgbnVsbCB0cmFuc3BvcnQgKGNvbW1vbiBjYXNlKQogICBvdXRwdXRUcmFuc3BvcnRfID0gc2hhcmVkX3B0cjxUTnVsbFRyYW5zcG9ydD4obmV3IFROdWxsVHJhbnNwb3J0KCkpOwpAQCAtOTc2LDExICs5OTUsMTEgQEAKIFRGaWxlUHJvY2Vzc29yOjpURmlsZVByb2Nlc3NvcihzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IGlucHV0UHJvdG9jb2xGYWN0b3J5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8VEZpbGVSZWFkZXJUcmFuc3BvcnQ+IGlucHV0VHJhbnNwb3J0KToKLSAgcHJvY2Vzc29yXyhwcm9jZXNzb3IpLAotICBpbnB1dFByb3RvY29sRmFjdG9yeV8oaW5wdXRQcm90b2NvbEZhY3RvcnkpLAotICBvdXRwdXRQcm90b2NvbEZhY3RvcnlfKG91dHB1dFByb3RvY29sRmFjdG9yeSksCi0gIGlucHV0VHJhbnNwb3J0XyhpbnB1dFRyYW5zcG9ydCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8VEZpbGVSZWFkZXJUcmFuc3BvcnQ+IGlucHV0VHJhbnNwb3J0KQorICA6IHByb2Nlc3Nvcl8ocHJvY2Vzc29yKSwKKyAgICBpbnB1dFByb3RvY29sRmFjdG9yeV8oaW5wdXRQcm90b2NvbEZhY3RvcnkpLAorICAgIG91dHB1dFByb3RvY29sRmFjdG9yeV8ob3V0cHV0UHJvdG9jb2xGYWN0b3J5KSwKKyAgICBpbnB1dFRyYW5zcG9ydF8oaW5wdXRUcmFuc3BvcnQpIHsKIAogICAvLyBkZWZhdWx0IHRoZSBvdXRwdXQgdHJhbnNwb3J0IHRvIGEgbnVsbCB0cmFuc3BvcnQgKGNvbW1vbiBjYXNlKQogICBvdXRwdXRUcmFuc3BvcnRfID0gc2hhcmVkX3B0cjxUTnVsbFRyYW5zcG9ydD4obmV3IFROdWxsVHJhbnNwb3J0KCkpOwpAQCAtOTg5LDEyICsxMDA4LDEzIEBACiBURmlsZVByb2Nlc3Nvcjo6VEZpbGVQcm9jZXNzb3Ioc2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxURmlsZVJlYWRlclRyYW5zcG9ydD4gaW5wdXRUcmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBvdXRwdXRUcmFuc3BvcnQpOgotICBwcm9jZXNzb3JfKHByb2Nlc3NvciksCi0gIGlucHV0UHJvdG9jb2xGYWN0b3J5Xyhwcm90b2NvbEZhY3RvcnkpLAotICBvdXRwdXRQcm90b2NvbEZhY3RvcnlfKHByb3RvY29sRmFjdG9yeSksCi0gIGlucHV0VHJhbnNwb3J0XyhpbnB1dFRyYW5zcG9ydCksCi0gIG91dHB1dFRyYW5zcG9ydF8ob3V0cHV0VHJhbnNwb3J0KSB7fQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gb3V0cHV0VHJhbnNwb3J0KQorICA6IHByb2Nlc3Nvcl8ocHJvY2Vzc29yKSwKKyAgICBpbnB1dFByb3RvY29sRmFjdG9yeV8ocHJvdG9jb2xGYWN0b3J5KSwKKyAgICBvdXRwdXRQcm90b2NvbEZhY3RvcnlfKHByb3RvY29sRmFjdG9yeSksCisgICAgaW5wdXRUcmFuc3BvcnRfKGlucHV0VHJhbnNwb3J0KSwKKyAgICBvdXRwdXRUcmFuc3BvcnRfKG91dHB1dFRyYW5zcG9ydCkgeworfQogCiB2b2lkIFRGaWxlUHJvY2Vzc29yOjpwcm9jZXNzKHVpbnQzMl90IG51bUV2ZW50cywgYm9vbCB0YWlsKSB7CiAgIHNoYXJlZF9wdHI8VFByb3RvY29sPiBpbnB1dFByb3RvY29sID0gaW5wdXRQcm90b2NvbEZhY3RvcnlfLT5nZXRQcm90b2NvbChpbnB1dFRyYW5zcG9ydF8pOwpAQCAtMTAwOCwyMCArMTAyOCwyMCBAQAogICB9CiAKICAgdWludDMyX3QgbnVtUHJvY2Vzc2VkID0gMDsKLSAgd2hpbGUoMSkgeworICB3aGlsZSAoMSkgewogICAgIC8vIGJhZCBmb3JtIHRvIHVzZSBleGNlcHRpb25zIGZvciBmbG93IGNvbnRyb2wgYnV0IHRoZXJlIGlzIHJlYWxseQogICAgIC8vIG5vIG90aGVyIHdheSBhcm91bmQgaXQKICAgICB0cnkgewogICAgICAgcHJvY2Vzc29yXy0+cHJvY2VzcyhpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCwgTlVMTCk7CiAgICAgICBudW1Qcm9jZXNzZWQrKzsKLSAgICAgIGlmICggKG51bUV2ZW50cyA+IDApICYmIChudW1Qcm9jZXNzZWQgPT0gbnVtRXZlbnRzKSkgeworICAgICAgaWYgKChudW1FdmVudHMgPiAwKSAmJiAobnVtUHJvY2Vzc2VkID09IG51bUV2ZW50cykpIHsKICAgICAgICAgcmV0dXJuOwogICAgICAgfQogICAgIH0gY2F0Y2ggKFRFT0ZFeGNlcHRpb24mKSB7CiAgICAgICBpZiAoIXRhaWwpIHsKICAgICAgICAgYnJlYWs7CiAgICAgICB9Ci0gICAgfSBjYXRjaCAoVEV4Y2VwdGlvbiAmdGUpIHsKKyAgICB9IGNhdGNoIChURXhjZXB0aW9uJiB0ZSkgewogICAgICAgY2VyciA8PCB0ZS53aGF0KCkgPDwgZW5kbDsKICAgICAgIGJyZWFrOwogICAgIH0KQEAgLTEwMzEsNyArMTA1MSw2IEBACiAgIGlmICh0YWlsKSB7CiAgICAgaW5wdXRUcmFuc3BvcnRfLT5zZXRSZWFkVGltZW91dChvbGRSZWFkVGltZW91dCk7CiAgIH0KLQogfQogCiB2b2lkIFRGaWxlUHJvY2Vzc29yOjpwcm9jZXNzQ2h1bmsoKSB7CkBAIC0xMDQwLDcgKzEwNTksNyBAQAogCiAgIHVpbnQzMl90IGN1ckNodW5rID0gaW5wdXRUcmFuc3BvcnRfLT5nZXRDdXJDaHVuaygpOwogCi0gIHdoaWxlKDEpIHsKKyAgd2hpbGUgKDEpIHsKICAgICAvLyBiYWQgZm9ybSB0byB1c2UgZXhjZXB0aW9ucyBmb3IgZmxvdyBjb250cm9sIGJ1dCB0aGVyZSBpcyByZWFsbHkKICAgICAvLyBubyBvdGhlciB3YXkgYXJvdW5kIGl0CiAgICAgdHJ5IHsKQEAgLTEwNTAsMTEgKzEwNjksMTIgQEAKICAgICAgIH0KICAgICB9IGNhdGNoIChURU9GRXhjZXB0aW9uJikgewogICAgICAgYnJlYWs7Ci0gICAgfSBjYXRjaCAoVEV4Y2VwdGlvbiAmdGUpIHsKKyAgICB9IGNhdGNoIChURXhjZXB0aW9uJiB0ZSkgewogICAgICAgY2VyciA8PCB0ZS53aGF0KCkgPDwgZW5kbDsKICAgICAgIGJyZWFrOwogICAgIH0KICAgfQogfQotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RGaWxlVHJhbnNwb3J0LmggYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RGaWxlVHJhbnNwb3J0LmgKaW5kZXggNzU5NDFjZi4uNmNjN2JkMiAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9URmlsZVRyYW5zcG9ydC5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEZpbGVUcmFuc3BvcnQuaApAQCAtMjQsMTggKzI0LDE4IEBACiAjaW5jbHVkZSA8dGhyaWZ0L1RocmlmdC5oPgogI2luY2x1ZGUgPHRocmlmdC9UUHJvY2Vzc29yLmg+CiAKKyNpbmNsdWRlIDxhdG9taWM+CiAjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAKLSNpbmNsdWRlIDxib29zdC9zY29wZWRfcHRyLmhwcD4KLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KLQogI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9NdXRleC5oPgogI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1BsYXRmb3JtVGhyZWFkRmFjdG9yeS5oPgogI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9UaHJlYWQuaD4KIAotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKIAogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3I7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk7CkBAIC00OCw3ICs0OCw3IEBACiAgIHVpbnQzMl90IGV2ZW50U2l6ZV87CiAgIHVpbnQzMl90IGV2ZW50QnVmZlBvc187CiAKLSAgZXZlbnRJbmZvKCk6ZXZlbnRCdWZmXyhOVUxMKSwgZXZlbnRTaXplXygwKSwgZXZlbnRCdWZmUG9zXygwKXt9OworICBldmVudEluZm8oKSA6IGV2ZW50QnVmZl8oTlVMTCksIGV2ZW50U2l6ZV8oMCksIGV2ZW50QnVmZlBvc18oMCl7fTsKICAgfmV2ZW50SW5mbygpIHsKICAgICBpZiAoZXZlbnRCdWZmXykgewogICAgICAgZGVsZXRlW10gZXZlbnRCdWZmXzsKQEAgLTYxLDEzICs2MSwxMyBAQAogICBldmVudEluZm8qIGV2ZW50XzsKIAogICAvLyBrZWVwIHRyYWNrIG9mIGV2ZW50IHNpemUKLSAgdWludDhfdCAgIGV2ZW50U2l6ZUJ1ZmZfWzRdOwotICB1aW50OF90ICAgZXZlbnRTaXplQnVmZlBvc187Ci0gIGJvb2wgICAgICByZWFkaW5nU2l6ZV87CisgIHVpbnQ4X3QgZXZlbnRTaXplQnVmZl9bNF07CisgIHVpbnQ4X3QgZXZlbnRTaXplQnVmZlBvc187CisgIGJvb2wgcmVhZGluZ1NpemVfOwogCiAgIC8vIHJlYWQgYnVmZmVyIHZhcmlhYmxlcwotICBpbnQzMl90ICBidWZmZXJQdHJfOwotICBpbnQzMl90ICBidWZmZXJMZW5fOworICBpbnQzMl90IGJ1ZmZlclB0cl87CisgIGludDMyX3QgYnVmZmVyTGVuXzsKIAogICAvLyBsYXN0IHN1Y2Nlc3NmdWwgZGlzcGF0Y2ggcG9pbnQKICAgaW50MzJfdCBsYXN0RGlzcGF0Y2hQdHJfOwpAQCAtODMsMjQgKzgzLDI0IEBACiAgICAgYnVmZmVyUHRyXyA9IDA7CiAgICAgYnVmZmVyTGVuXyA9IDA7CiAgICAgaWYgKGV2ZW50XykgewotICAgICAgZGVsZXRlKGV2ZW50Xyk7CisgICAgICBkZWxldGUgKGV2ZW50Xyk7CiAgICAgfQogICAgIGV2ZW50XyA9IDA7CiAgIH0KIAogICBpbmxpbmUgdWludDMyX3QgZ2V0RXZlbnRTaXplKCkgewotICAJICBjb25zdCB2b2lkICpidWZmZXI9cmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkICo+KGV2ZW50U2l6ZUJ1ZmZfKTsKLQkgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50MzJfdCAqPihidWZmZXIpOworICAgIGNvbnN0IHZvaWQqIGJ1ZmZlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KGV2ZW50U2l6ZUJ1ZmZfKTsKKyAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDMyX3QqPihidWZmZXIpOwogICB9CiAKICAgcmVhZFN0YXRlKCkgewogICAgIGV2ZW50XyA9IDA7Ci0gICByZXNldEFsbFZhbHVlcygpOworICAgIHJlc2V0QWxsVmFsdWVzKCk7CiAgIH0KIAogICB+cmVhZFN0YXRlKCkgewogICAgIGlmIChldmVudF8pIHsKLSAgICAgIGRlbGV0ZShldmVudF8pOworICAgICAgZGVsZXRlIChldmVudF8pOwogICAgIH0KICAgfQogCkBAIC0xMjEsMzYgKzEyMSwzMyBAQAogICoKICAqLwogY2xhc3MgVEZpbGVUcmFuc3BvcnRCdWZmZXIgewotICBwdWJsaWM6Ci0gICAgVEZpbGVUcmFuc3BvcnRCdWZmZXIodWludDMyX3Qgc2l6ZSk7Ci0gICAgflRGaWxlVHJhbnNwb3J0QnVmZmVyKCk7CitwdWJsaWM6CisgIFRGaWxlVHJhbnNwb3J0QnVmZmVyKHVpbnQzMl90IHNpemUpOworICB+VEZpbGVUcmFuc3BvcnRCdWZmZXIoKTsKIAotICAgIGJvb2wgYWRkRXZlbnQoZXZlbnRJbmZvICpldmVudCk7Ci0gICAgZXZlbnRJbmZvKiBnZXROZXh0KCk7Ci0gICAgdm9pZCByZXNldCgpOwotICAgIGJvb2wgaXNGdWxsKCk7Ci0gICAgYm9vbCBpc0VtcHR5KCk7CisgIGJvb2wgYWRkRXZlbnQoZXZlbnRJbmZvKiBldmVudCk7CisgIGV2ZW50SW5mbyogZ2V0TmV4dCgpOworICB2b2lkIHJlc2V0KCk7CisgIGJvb2wgaXNGdWxsKCk7CisgIGJvb2wgaXNFbXB0eSgpOwogCi0gIHByaXZhdGU6Ci0gICAgVEZpbGVUcmFuc3BvcnRCdWZmZXIoKTsgLy8gc2hvdWxkIG5vdCBiZSB1c2VkCitwcml2YXRlOgorICBURmlsZVRyYW5zcG9ydEJ1ZmZlcigpOyAvLyBzaG91bGQgbm90IGJlIHVzZWQKIAotICAgIGVudW0gbW9kZSB7Ci0gICAgICBXUklURSwKLSAgICAgIFJFQUQKLSAgICB9OwotICAgIG1vZGUgYnVmZmVyTW9kZV87CisgIGVudW0gbW9kZSB7IFdSSVRFLCBSRUFEIH07CisgIG1vZGUgYnVmZmVyTW9kZV87CiAKLSAgICB1aW50MzJfdCB3cml0ZVBvaW50XzsKLSAgICB1aW50MzJfdCByZWFkUG9pbnRfOwotICAgIHVpbnQzMl90IHNpemVfOwotICAgIGV2ZW50SW5mbyoqIGJ1ZmZlcl87CisgIHVpbnQzMl90IHdyaXRlUG9pbnRfOworICB1aW50MzJfdCByZWFkUG9pbnRfOworICB1aW50MzJfdCBzaXplXzsKKyAgZXZlbnRJbmZvKiogYnVmZmVyXzsKIH07CiAKIC8qKgogICogQWJzdHJhY3QgaW50ZXJmYWNlIGZvciB0cmFuc3BvcnRzIHVzZWQgdG8gcmVhZCBmaWxlcwogICovCiBjbGFzcyBURmlsZVJlYWRlclRyYW5zcG9ydCA6IHZpcnR1YWwgcHVibGljIFRUcmFuc3BvcnQgewotIHB1YmxpYzoKK3B1YmxpYzoKICAgdmlydHVhbCBpbnQzMl90IGdldFJlYWRUaW1lb3V0KCkgPSAwOwogICB2aXJ0dWFsIHZvaWQgc2V0UmVhZFRpbWVvdXQoaW50MzJfdCByZWFkVGltZW91dCkgPSAwOwogCkBAIC0xNjQsNyArMTYxLDcgQEAKICAqIEFic3RyYWN0IGludGVyZmFjZSBmb3IgdHJhbnNwb3J0cyB1c2VkIHRvIHdyaXRlIGZpbGVzCiAgKi8KIGNsYXNzIFRGaWxlV3JpdGVyVHJhbnNwb3J0IDogdmlydHVhbCBwdWJsaWMgVFRyYW5zcG9ydCB7Ci0gcHVibGljOgorcHVibGljOgogICB2aXJ0dWFsIHVpbnQzMl90IGdldENodW5rU2l6ZSgpID0gMDsKICAgdmlydHVhbCB2b2lkIHNldENodW5rU2l6ZSh1aW50MzJfdCBjaHVua1NpemUpID0gMDsKIH07CkBAIC0xNzQsMTcgKzE3MSwxNCBAQAogICogZmlsZSBvbiBkaXNrLgogICoKICAqLwotY2xhc3MgVEZpbGVUcmFuc3BvcnQgOiBwdWJsaWMgVEZpbGVSZWFkZXJUcmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBURmlsZVdyaXRlclRyYW5zcG9ydCB7Ci0gcHVibGljOgotICBURmlsZVRyYW5zcG9ydChzdGQ6OnN0cmluZyBwYXRoLCBib29sIHJlYWRPbmx5PWZhbHNlKTsKK2NsYXNzIFRGaWxlVHJhbnNwb3J0IDogcHVibGljIFRGaWxlUmVhZGVyVHJhbnNwb3J0LCBwdWJsaWMgVEZpbGVXcml0ZXJUcmFuc3BvcnQgeworcHVibGljOgorICBURmlsZVRyYW5zcG9ydChzdGQ6OnN0cmluZyBwYXRoLCBib29sIHJlYWRPbmx5ID0gZmFsc2UpOwogICB+VEZpbGVUcmFuc3BvcnQoKTsKIAogICAvLyBUT0RPOiB3aGF0IGlzIHRoZSBjb3JyZWN0IGJlaGF2aW91ciBmb3IgdGhpcz8KICAgLy8gdGhlIGxvZyBmaWxlIGlzIGdlbmVyYWxseSBhbHdheXMgb3BlbgotICBib29sIGlzT3BlbigpIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQorICBib29sIGlzT3BlbigpIHsgcmV0dXJuIHRydWU7IH0KIAogICB2b2lkIHdyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKICAgdm9pZCBmbHVzaCgpOwpAQCAtMjA4LDI3ICsyMDIsMTkgQEAKICAgICAgIHJlYWRCdWZmU2l6ZV8gPSByZWFkQnVmZlNpemU7CiAgICAgfQogICB9Ci0gIHVpbnQzMl90IGdldFJlYWRCdWZmU2l6ZSgpIHsKLSAgICByZXR1cm4gcmVhZEJ1ZmZTaXplXzsKLSAgfQorICB1aW50MzJfdCBnZXRSZWFkQnVmZlNpemUoKSB7IHJldHVybiByZWFkQnVmZlNpemVfOyB9CiAKICAgc3RhdGljIGNvbnN0IGludDMyX3QgVEFJTF9SRUFEX1RJTUVPVVQgPSAtMTsKICAgc3RhdGljIGNvbnN0IGludDMyX3QgTk9fVEFJTF9SRUFEX1RJTUVPVVQgPSAwOwotICB2b2lkIHNldFJlYWRUaW1lb3V0KGludDMyX3QgcmVhZFRpbWVvdXQpIHsKLSAgICByZWFkVGltZW91dF8gPSByZWFkVGltZW91dDsKLSAgfQotICBpbnQzMl90IGdldFJlYWRUaW1lb3V0KCkgewotICAgIHJldHVybiByZWFkVGltZW91dF87Ci0gIH0KKyAgdm9pZCBzZXRSZWFkVGltZW91dChpbnQzMl90IHJlYWRUaW1lb3V0KSB7IHJlYWRUaW1lb3V0XyA9IHJlYWRUaW1lb3V0OyB9CisgIGludDMyX3QgZ2V0UmVhZFRpbWVvdXQoKSB7IHJldHVybiByZWFkVGltZW91dF87IH0KIAogICB2b2lkIHNldENodW5rU2l6ZSh1aW50MzJfdCBjaHVua1NpemUpIHsKICAgICBpZiAoY2h1bmtTaXplKSB7CiAgICAgICBjaHVua1NpemVfID0gY2h1bmtTaXplOwogICAgIH0KICAgfQotICB1aW50MzJfdCBnZXRDaHVua1NpemUoKSB7Ci0gICAgcmV0dXJuIGNodW5rU2l6ZV87Ci0gIH0KKyAgdWludDMyX3QgZ2V0Q2h1bmtTaXplKCkgeyByZXR1cm4gY2h1bmtTaXplXzsgfQogCiAgIHZvaWQgc2V0RXZlbnRCdWZmZXJTaXplKHVpbnQzMl90IGJ1ZmZlclNpemUpIHsKICAgICBpZiAoYnVmZmVyQW5kVGhyZWFkSW5pdGlhbGl6ZWRfKSB7CkBAIC0yMzgsNjcgKzIyNCw0NyBAQAogICAgIGV2ZW50QnVmZmVyU2l6ZV8gPSBidWZmZXJTaXplOwogICB9CiAKLSAgdWludDMyX3QgZ2V0RXZlbnRCdWZmZXJTaXplKCkgewotICAgIHJldHVybiBldmVudEJ1ZmZlclNpemVfOwotICB9CisgIHVpbnQzMl90IGdldEV2ZW50QnVmZmVyU2l6ZSgpIHsgcmV0dXJuIGV2ZW50QnVmZmVyU2l6ZV87IH0KIAogICB2b2lkIHNldEZsdXNoTWF4VXModWludDMyX3QgZmx1c2hNYXhVcykgewogICAgIGlmIChmbHVzaE1heFVzKSB7CiAgICAgICBmbHVzaE1heFVzXyA9IGZsdXNoTWF4VXM7CiAgICAgfQogICB9Ci0gIHVpbnQzMl90IGdldEZsdXNoTWF4VXMoKSB7Ci0gICAgcmV0dXJuIGZsdXNoTWF4VXNfOwotICB9CisgIHVpbnQzMl90IGdldEZsdXNoTWF4VXMoKSB7IHJldHVybiBmbHVzaE1heFVzXzsgfQogCiAgIHZvaWQgc2V0Rmx1c2hNYXhCeXRlcyh1aW50MzJfdCBmbHVzaE1heEJ5dGVzKSB7CiAgICAgaWYgKGZsdXNoTWF4Qnl0ZXMpIHsKICAgICAgIGZsdXNoTWF4Qnl0ZXNfID0gZmx1c2hNYXhCeXRlczsKICAgICB9CiAgIH0KLSAgdWludDMyX3QgZ2V0Rmx1c2hNYXhCeXRlcygpIHsKLSAgICByZXR1cm4gZmx1c2hNYXhCeXRlc187Ci0gIH0KKyAgdWludDMyX3QgZ2V0Rmx1c2hNYXhCeXRlcygpIHsgcmV0dXJuIGZsdXNoTWF4Qnl0ZXNfOyB9CiAKLSAgdm9pZCBzZXRNYXhFdmVudFNpemUodWludDMyX3QgbWF4RXZlbnRTaXplKSB7Ci0gICAgbWF4RXZlbnRTaXplXyA9IG1heEV2ZW50U2l6ZTsKLSAgfQotICB1aW50MzJfdCBnZXRNYXhFdmVudFNpemUoKSB7Ci0gICAgcmV0dXJuIG1heEV2ZW50U2l6ZV87Ci0gIH0KKyAgdm9pZCBzZXRNYXhFdmVudFNpemUodWludDMyX3QgbWF4RXZlbnRTaXplKSB7IG1heEV2ZW50U2l6ZV8gPSBtYXhFdmVudFNpemU7IH0KKyAgdWludDMyX3QgZ2V0TWF4RXZlbnRTaXplKCkgeyByZXR1cm4gbWF4RXZlbnRTaXplXzsgfQogCiAgIHZvaWQgc2V0TWF4Q29ycnVwdGVkRXZlbnRzKHVpbnQzMl90IG1heENvcnJ1cHRlZEV2ZW50cykgewogICAgIG1heENvcnJ1cHRlZEV2ZW50c18gPSBtYXhDb3JydXB0ZWRFdmVudHM7CiAgIH0KLSAgdWludDMyX3QgZ2V0TWF4Q29ycnVwdGVkRXZlbnRzKCkgewotICAgIHJldHVybiBtYXhDb3JydXB0ZWRFdmVudHNfOwotICB9CisgIHVpbnQzMl90IGdldE1heENvcnJ1cHRlZEV2ZW50cygpIHsgcmV0dXJuIG1heENvcnJ1cHRlZEV2ZW50c187IH0KIAogICB2b2lkIHNldEVvZlNsZWVwVGltZVVzKHVpbnQzMl90IGVvZlNsZWVwVGltZSkgewogICAgIGlmIChlb2ZTbGVlcFRpbWUpIHsKICAgICAgIGVvZlNsZWVwVGltZV8gPSBlb2ZTbGVlcFRpbWU7CiAgICAgfQogICB9Ci0gIHVpbnQzMl90IGdldEVvZlNsZWVwVGltZVVzKCkgewotICAgIHJldHVybiBlb2ZTbGVlcFRpbWVfOwotICB9CisgIHVpbnQzMl90IGdldEVvZlNsZWVwVGltZVVzKCkgeyByZXR1cm4gZW9mU2xlZXBUaW1lXzsgfQogCiAgIC8qCiAgICAqIE92ZXJyaWRlIFRUcmFuc3BvcnQgKl92aXJ0KCkgZnVuY3Rpb25zIHRvIGludm9rZSBvdXIgaW1wbGVtZW50YXRpb25zLgogICAgKiBXZSBjYW5ub3QgdXNlIFRWaXJ0dWFsVHJhbnNwb3J0IHRvIHByb3ZpZGUgdGhlc2UsIHNpbmNlIHdlIG5lZWQgdG8gaW5oZXJpdAogICAgKiB2aXJ0dWFsbHkgZnJvbSBUVHJhbnNwb3J0LgogICAgKi8KLSAgdmlydHVhbCB1aW50MzJfdCByZWFkX3ZpcnQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKLSAgICByZXR1cm4gdGhpcy0+cmVhZChidWYsIGxlbik7Ci0gIH0KLSAgdmlydHVhbCB1aW50MzJfdCByZWFkQWxsX3ZpcnQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKLSAgICByZXR1cm4gdGhpcy0+cmVhZEFsbChidWYsIGxlbik7Ci0gIH0KLSAgdmlydHVhbCB2b2lkIHdyaXRlX3ZpcnQoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKLSAgICB0aGlzLT53cml0ZShidWYsIGxlbik7Ci0gIH0KKyAgdmlydHVhbCB1aW50MzJfdCByZWFkX3ZpcnQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsgcmV0dXJuIHRoaXMtPnJlYWQoYnVmLCBsZW4pOyB9CisgIHZpcnR1YWwgdWludDMyX3QgcmVhZEFsbF92aXJ0KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7IHJldHVybiB0aGlzLT5yZWFkQWxsKGJ1ZiwgbGVuKTsgfQorICB2aXJ0dWFsIHZvaWQgd3JpdGVfdmlydChjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeyB0aGlzLT53cml0ZShidWYsIGxlbik7IH0KIAotIHByaXZhdGU6Citwcml2YXRlOgogICAvLyBoZWxwZXIgZnVuY3Rpb25zIGZvciB3cml0aW5nIHRvIGEgZmlsZQogICB2b2lkIGVucXVldWVFdmVudChjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGV2ZW50TGVuKTsKICAgYm9vbCBzd2FwRXZlbnRCdWZmZXJzKHN0cnVjdCB0aW1ldmFsKiBkZWFkbGluZSk7CkBAIC0zNzEsMjAgKzMzNywyMCBAQAogCiAgIC8vIHdyaXRlciB0aHJlYWQKICAgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpQbGF0Zm9ybVRocmVhZEZhY3RvcnkgdGhyZWFkRmFjdG9yeV87Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkPiB3cml0ZXJUaHJlYWRfOworICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWQ+IHdyaXRlclRocmVhZF87CiAKICAgLy8gYnVmZmVycyB0byBob2xkIGRhdGEgYmVmb3JlIGl0IGlzIGZsdXNoZWQuIEVhY2ggZWxlbWVudCBvZiB0aGUgYnVmZmVyIHN0b3JlcyBhIG1zZyB0aGF0CiAgIC8vIG5lZWRzIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIGZpbGUuICBUaGUgYnVmZmVycyBhcmUgc3dhcHBlZCBieSB0aGUgd3JpdGVyIHRocmVhZC4KLSAgVEZpbGVUcmFuc3BvcnRCdWZmZXIgKmRlcXVldWVCdWZmZXJfOwotICBURmlsZVRyYW5zcG9ydEJ1ZmZlciAqZW5xdWV1ZUJ1ZmZlcl87CisgIFRGaWxlVHJhbnNwb3J0QnVmZmVyKiBkZXF1ZXVlQnVmZmVyXzsKKyAgVEZpbGVUcmFuc3BvcnRCdWZmZXIqIGVucXVldWVCdWZmZXJfOwogCiAgIC8vIGNvbmRpdGlvbnMgdXNlZCB0byBibG9jayB3aGVuIHRoZSBidWZmZXIgaXMgZnVsbCBvciBlbXB0eQogICBNb25pdG9yIG5vdEZ1bGxfLCBub3RFbXB0eV87Ci0gIHZvbGF0aWxlIGJvb2wgY2xvc2luZ187CisgIHN0ZDo6YXRvbWljPGJvb2w+IGNsb3NpbmdfOwogCiAgIC8vIFRvIGtlZXAgdHJhY2sgb2Ygd2hldGhlciB0aGUgYnVmZmVyIGhhcyBiZWVuIGZsdXNoZWQKICAgTW9uaXRvciBmbHVzaGVkXzsKLSAgdm9sYXRpbGUgYm9vbCBmb3JjZUZsdXNoXzsKKyAgc3RkOjphdG9taWM8Ym9vbD4gZm9yY2VGbHVzaF87CiAKICAgLy8gTXV0ZXggdGhhdCBpcyBncmFiYmVkIHdoZW4gZW5xdWV1ZWluZyBhbmQgc3dhcHBpbmcgdGhlIHJlYWQvd3JpdGUgYnVmZmVycwogICBNdXRleCBtdXRleF87CkBAIC00MDgsMTUgKzM3NCwxMyBAQAogCiAvLyBFeGNlcHRpb24gdGhyb3duIHdoZW4gRU9GIGlzIGhpdAogY2xhc3MgVEVPRkV4Y2VwdGlvbiA6IHB1YmxpYyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKLSBwdWJsaWM6Ci0gIFRFT0ZFeGNlcHRpb24oKToKLSAgICBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkVORF9PRl9GSUxFKSB7fTsKK3B1YmxpYzoKKyAgVEVPRkV4Y2VwdGlvbigpIDogVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpFTkRfT0ZfRklMRSl7fTsKIH07CiAKLQogLy8gd3JhcHBlciBjbGFzcyB0byBwcm9jZXNzIGV2ZW50cyBmcm9tIGEgZmlsZSBjb250YWluaW5nIHRocmlmdCBldmVudHMKIGNsYXNzIFRGaWxlUHJvY2Vzc29yIHsKLSBwdWJsaWM6CitwdWJsaWM6CiAgIC8qKgogICAgKiBDb25zdHJ1Y3RvciB0aGF0IGRlZmF1bHRzIG91dHB1dCB0cmFuc3BvcnQgdG8gbnVsbCB0cmFuc3BvcnQKICAgICoKQEAgLTQyNCwxNCArMzg4LDE0IEBACiAgICAqIEBwYXJhbSBwcm90b2NvbEZhY3RvcnkgcHJvdG9jb2wgZmFjdG9yeQogICAgKiBAcGFyYW0gaW5wdXRUcmFuc3BvcnQgZmlsZSB0cmFuc3BvcnQKICAgICovCi0gIFRGaWxlUHJvY2Vzc29yKGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxURmlsZVJlYWRlclRyYW5zcG9ydD4gaW5wdXRUcmFuc3BvcnQpOworICBURmlsZVByb2Nlc3NvcihzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VEZpbGVSZWFkZXJUcmFuc3BvcnQ+IGlucHV0VHJhbnNwb3J0KTsKIAotICBURmlsZVByb2Nlc3Nvcihib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IsCi0gICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IGlucHV0UHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBvdXRwdXRQcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PiBpbnB1dFRyYW5zcG9ydCk7CisgIFRGaWxlUHJvY2Vzc29yKHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IG91dHB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PiBpbnB1dFRyYW5zcG9ydCk7CiAKICAgLyoqCiAgICAqIENvbnN0cnVjdG9yCkBAIC00NDEsMTAgKzQwNSwxMCBAQAogICAgKiBAcGFyYW0gaW5wdXRUcmFuc3BvcnQgaW5wdXQgZmlsZSB0cmFuc3BvcnQKICAgICogQHBhcmFtIG91dHB1dCBvdXRwdXQgdHJhbnNwb3J0CiAgICAqLwotICBURmlsZVByb2Nlc3Nvcihib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IsCi0gICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VEZpbGVSZWFkZXJUcmFuc3BvcnQ+IGlucHV0VHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBvdXRwdXRUcmFuc3BvcnQpOworICBURmlsZVByb2Nlc3NvcihzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VEZpbGVSZWFkZXJUcmFuc3BvcnQ+IGlucHV0VHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gb3V0cHV0VHJhbnNwb3J0KTsKIAogICAvKioKICAgICogcHJvY2Vzc2VzIGV2ZW50cyBmcm9tIHRoZSBmaWxlCkBAIC00NjAsMTUgKzQyNCwxNiBAQAogICAgKi8KICAgdm9pZCBwcm9jZXNzQ2h1bmsoKTsKIAotIHByaXZhdGU6Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3Nvcl87Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IGlucHV0UHJvdG9jb2xGYWN0b3J5XzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gb3V0cHV0UHJvdG9jb2xGYWN0b3J5XzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VEZpbGVSZWFkZXJUcmFuc3BvcnQ+IGlucHV0VHJhbnNwb3J0XzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gb3V0cHV0VHJhbnNwb3J0XzsKK3ByaXZhdGU6CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3JfOworICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gaW5wdXRQcm90b2NvbEZhY3RvcnlfOworICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gb3V0cHV0UHJvdG9jb2xGYWN0b3J5XzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PiBpbnB1dFRyYW5zcG9ydF87CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBvdXRwdXRUcmFuc3BvcnRfOwogfTsKLQotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CiAKICNlbmRpZiAvLyBfVEhSSUZUX1RSQU5TUE9SVF9URklMRVRSQU5TUE9SVF9IXworCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RIZWFkZXJUcmFuc3BvcnQuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9USGVhZGVyVHJhbnNwb3J0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTA4NGVjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9USGVhZGVyVHJhbnNwb3J0LmNwcApAQCAtMCwwICsxLDYxMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9USGVhZGVyVHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5oPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xUeXBlcy5oPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5oPgorCisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHpsaWIuaD4KKwordXNpbmcgc3RkOjptYXA7Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6dmVjdG9yOworCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworCit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7CisKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworCit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUQmluYXJ5UHJvdG9jb2w7CisKK3VpbnQzMl90IFRIZWFkZXJUcmFuc3BvcnQ6OnJlYWRTbG93KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CisgIGlmIChjbGllbnRUeXBlID09IFRIUklGVF9VTkZSQU1FRF9CSU5BUlkgfHwgY2xpZW50VHlwZSA9PSBUSFJJRlRfVU5GUkFNRURfQ09NUEFDVCkgeworICAgIHJldHVybiB0cmFuc3BvcnRfLT5yZWFkKGJ1ZiwgbGVuKTsKKyAgfQorCisgIHJldHVybiBURnJhbWVkVHJhbnNwb3J0OjpyZWFkU2xvdyhidWYsIGxlbik7Cit9CisKK3VpbnQxNl90IFRIZWFkZXJUcmFuc3BvcnQ6OmdldFByb3RvY29sSWQoKSBjb25zdCB7CisgIGlmIChjbGllbnRUeXBlID09IFRIUklGVF9IRUFERVJfQ0xJRU5UX1RZUEUpIHsKKyAgICByZXR1cm4gcHJvdG9JZDsKKyAgfSBlbHNlIGlmIChjbGllbnRUeXBlID09IFRIUklGVF9VTkZSQU1FRF9DT01QQUNUIHx8IGNsaWVudFR5cGUgPT0gVEhSSUZUX0ZSQU1FRF9DT01QQUNUKSB7CisgICAgcmV0dXJuIFRfQ09NUEFDVF9QUk9UT0NPTDsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gVF9CSU5BUllfUFJPVE9DT0w7IC8vIEFzc3VtZSBvdGhlciB0cmFuc3BvcnRzIHVzZSBUQmluYXJ5CisgIH0KK30KKwordm9pZCBUSGVhZGVyVHJhbnNwb3J0OjplbnN1cmVSZWFkQnVmZmVyKHVpbnQzMl90IHN6KSB7CisgIGlmIChzeiA+IHJCdWZTaXplXykgeworICAgIHJCdWZfLnJlc2V0KG5ldyB1aW50OF90W3N6XSk7CisgICAgckJ1ZlNpemVfID0gc3o7CisgIH0KK30KKworYm9vbCBUSGVhZGVyVHJhbnNwb3J0OjpyZWFkRnJhbWUoKSB7CisgIC8vIHN6TiBpcyBuZXR3b3JrIGJ5dGUgb3JkZXIgb2Ygc3oKKyAgdWludDMyX3Qgc3pOOworICB1aW50MzJfdCBzejsKKworICAvLyBSZWFkIHRoZSBzaXplIG9mIHRoZSBuZXh0IGZyYW1lLgorICAvLyBXZSBjYW4ndCB1c2UgcmVhZEFsbCgmc3osIHNpemVvZihzeikpLCBzaW5jZSB0aGF0IGFsd2F5cyB0aHJvd3MgYW4KKyAgLy8gZXhjZXB0aW9uIG9uIEVPRi4gIFdlIHdhbnQgdG8gdGhyb3cgYW4gZXhjZXB0aW9uIG9ubHkgaWYgRU9GIG9jY3VycyBhZnRlcgorICAvLyBwYXJ0aWFsIHNpemUgZGF0YS4KKyAgdWludDMyX3Qgc2l6ZUJ5dGVzUmVhZCA9IDA7CisgIHdoaWxlIChzaXplQnl0ZXNSZWFkIDwgc2l6ZW9mKHN6TikpIHsKKyAgICB1aW50OF90KiBzenAgPSByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPigmc3pOKSArIHNpemVCeXRlc1JlYWQ7CisgICAgdWludDMyX3QgYnl0ZXNSZWFkID0gdHJhbnNwb3J0Xy0+cmVhZChzenAsIHNpemVvZihzek4pIC0gc2l6ZUJ5dGVzUmVhZCk7CisgICAgaWYgKGJ5dGVzUmVhZCA9PSAwKSB7CisgICAgICBpZiAoc2l6ZUJ5dGVzUmVhZCA9PSAwKSB7CisgICAgICAgIC8vIEVPRiBiZWZvcmUgYW55IGRhdGEgd2FzIHJlYWQuCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEVPRiBhZnRlciBhIHBhcnRpYWwgZnJhbWUgaGVhZGVyLiAgUmFpc2UgYW4gZXhjZXB0aW9uLgorICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkVORF9PRl9GSUxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJObyBtb3JlIGRhdGEgdG8gcmVhZCBhZnRlciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcnRpYWwgZnJhbWUgaGVhZGVyLiIpOworICAgICAgfQorICAgIH0KKyAgICBzaXplQnl0ZXNSZWFkICs9IGJ5dGVzUmVhZDsKKyAgfQorCisgIHN6ID0gbnRvaGwoc3pOKTsKKworICBlbnN1cmVSZWFkQnVmZmVyKDQpOworCisgIGlmICgoc3ogJiBUQmluYXJ5UHJvdG9jb2w6OlZFUlNJT05fTUFTSykgPT0gKHVpbnQzMl90KVRCaW5hcnlQcm90b2NvbDo6VkVSU0lPTl8xKSB7CisgICAgLy8gdW5mcmFtZWQKKyAgICBjbGllbnRUeXBlID0gVEhSSUZUX1VORlJBTUVEX0JJTkFSWTsKKyAgICBtZW1jcHkockJ1Zl8uZ2V0KCksICZzek4sIHNpemVvZihzek4pKTsKKyAgICBzZXRSZWFkQnVmZmVyKHJCdWZfLmdldCgpLCA0KTsKKyAgfSBlbHNlIGlmIChzdGF0aWNfY2FzdDxpbnQ4X3Q+KHN6ID4+IDI0KSA9PSBUQ29tcGFjdFByb3RvY29sOjpQUk9UT0NPTF9JRAorICAgICAgICAgICAgICYmIChzdGF0aWNfY2FzdDxpbnQ4X3Q+KHN6ID4+IDE2KSAmIFRDb21wYWN0UHJvdG9jb2w6OlZFUlNJT05fTUFTSykKKyAgICAgICAgICAgICAgICAgICAgPT0gVENvbXBhY3RQcm90b2NvbDo6VkVSU0lPTl9OKSB7CisgICAgY2xpZW50VHlwZSA9IFRIUklGVF9VTkZSQU1FRF9DT01QQUNUOworICAgIG1lbWNweShyQnVmXy5nZXQoKSwgJnN6Tiwgc2l6ZW9mKHN6TikpOworICAgIHNldFJlYWRCdWZmZXIockJ1Zl8uZ2V0KCksIDQpOworICB9IGVsc2UgeworICAgIC8vIENvdWxkIGJlIGhlYWRlciBmb3JtYXQgb3IgZnJhbWVkLiBDaGVjayBuZXh0IHVpbnQzMgorICAgIHVpbnQzMl90IG1hZ2ljX247CisgICAgdWludDMyX3QgbWFnaWM7CisKKyAgICBpZiAoc3ogPiBNQVhfRlJBTUVfU0laRSkgeworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpDT1JSVVBURURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlYWRlciB0cmFuc3BvcnQgZnJhbWUgaXMgdG9vIGxhcmdlIik7CisgICAgfQorCisgICAgZW5zdXJlUmVhZEJ1ZmZlcihzeik7CisKKyAgICAvLyBXZSBjYW4gdXNlIHJlYWRBbGwgaGVyZSwgYmVjYXVzZSBpdCB3b3VsZCBiZSBhbiBpbnZhbGlkIGZyYW1lIG90aGVyd2lzZQorICAgIHRyYW5zcG9ydF8tPnJlYWRBbGwocmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oJm1hZ2ljX24pLCBzaXplb2YobWFnaWNfbikpOworICAgIG1lbWNweShyQnVmXy5nZXQoKSwgJm1hZ2ljX24sIHNpemVvZihtYWdpY19uKSk7CisgICAgbWFnaWMgPSBudG9obChtYWdpY19uKTsKKworICAgIGlmICgobWFnaWMgJiBUQmluYXJ5UHJvdG9jb2w6OlZFUlNJT05fTUFTSykgPT0gKHVpbnQzMl90KVRCaW5hcnlQcm90b2NvbDo6VkVSU0lPTl8xKSB7CisgICAgICAvLyBmcmFtZWQKKyAgICAgIGNsaWVudFR5cGUgPSBUSFJJRlRfRlJBTUVEX0JJTkFSWTsKKyAgICAgIHRyYW5zcG9ydF8tPnJlYWRBbGwockJ1Zl8uZ2V0KCkgKyA0LCBzeiAtIDQpOworICAgICAgc2V0UmVhZEJ1ZmZlcihyQnVmXy5nZXQoKSwgc3opOworICAgIH0gZWxzZSBpZiAoc3RhdGljX2Nhc3Q8aW50OF90PihtYWdpYyA+PiAyNCkgPT0gVENvbXBhY3RQcm90b2NvbDo6UFJPVE9DT0xfSUQKKyAgICAgICAgICAgICAgICYmIChzdGF0aWNfY2FzdDxpbnQ4X3Q+KG1hZ2ljID4+IDE2KSAmIFRDb21wYWN0UHJvdG9jb2w6OlZFUlNJT05fTUFTSykKKyAgICAgICAgICAgICAgICAgICAgICA9PSBUQ29tcGFjdFByb3RvY29sOjpWRVJTSU9OX04pIHsKKyAgICAgIGNsaWVudFR5cGUgPSBUSFJJRlRfRlJBTUVEX0NPTVBBQ1Q7CisgICAgICB0cmFuc3BvcnRfLT5yZWFkQWxsKHJCdWZfLmdldCgpICsgNCwgc3ogLSA0KTsKKyAgICAgIHNldFJlYWRCdWZmZXIockJ1Zl8uZ2V0KCksIHN6KTsKKyAgICB9IGVsc2UgaWYgKEhFQURFUl9NQUdJQyA9PSAobWFnaWMgJiBIRUFERVJfTUFTSykpIHsKKyAgICAgIGlmIChzeiA8IDEwKSB7CisgICAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Q09SUlVQVEVEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlYWRlciB0cmFuc3BvcnQgZnJhbWUgaXMgdG9vIHNtYWxsIik7CisgICAgICB9CisKKyAgICAgIHRyYW5zcG9ydF8tPnJlYWRBbGwockJ1Zl8uZ2V0KCkgKyA0LCBzeiAtIDQpOworCisgICAgICAvLyBoZWFkZXIgZm9ybWF0CisgICAgICBjbGllbnRUeXBlID0gVEhSSUZUX0hFQURFUl9DTElFTlRfVFlQRTsKKyAgICAgIC8vIGZsYWdzCisgICAgICBmbGFncyA9IG1hZ2ljICYgRkxBR1NfTUFTSzsKKyAgICAgIC8vIHNlcUlkCisgICAgICB1aW50MzJfdCBzZXFJZF9uOworICAgICAgbWVtY3B5KCZzZXFJZF9uLCByQnVmXy5nZXQoKSArIDQsIHNpemVvZihzZXFJZF9uKSk7CisgICAgICBzZXFJZCA9IG50b2hsKHNlcUlkX24pOworICAgICAgLy8gaGVhZGVyIHNpemUKKyAgICAgIHVpbnQxNl90IGhlYWRlclNpemVfbjsKKyAgICAgIG1lbWNweSgmaGVhZGVyU2l6ZV9uLCByQnVmXy5nZXQoKSArIDgsIHNpemVvZihoZWFkZXJTaXplX24pKTsKKyAgICAgIHVpbnQxNl90IGhlYWRlclNpemUgPSBudG9ocyhoZWFkZXJTaXplX24pOworICAgICAgc2V0UmVhZEJ1ZmZlcihyQnVmXy5nZXQoKSwgc3opOworICAgICAgcmVhZEhlYWRlckZvcm1hdChoZWFkZXJTaXplLCBzeik7CisgICAgfSBlbHNlIHsKKyAgICAgIGNsaWVudFR5cGUgPSBUSFJJRlRfVU5LTk9XTl9DTElFTlRfVFlQRTsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6QkFEX0FSR1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgZGV0ZWN0IGNsaWVudCB0cmFuc3BvcnQgdHlwZSIpOworICAgIH0KKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvKioKKyAqIFJlYWRzIGEgc3RyaW5nIGZyb20gcHRyLCB0YWtpbmcgY2FyZSBub3QgdG8gcmVhY2ggaGVhZGVyQm91bmRhcnkKKyAqIEFkdmFuY2VzIHB0ciBvbiBzdWNjZXNzCisgKgorICogQHBhcmFtICAgc3RyICAgICAgICAgICAgIG91dHB1dCBzdHJpbmcKKyAqIEB0aHJvd3MgIENPUlJVUFRFRF9EQVRBICBpZiBzaXplIG9mIHN0cmluZyBleGNlZWRzIGJvdW5kYXJ5CisgKi8KK3ZvaWQgVEhlYWRlclRyYW5zcG9ydDo6cmVhZFN0cmluZyh1aW50OF90KiYgcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG91dCAqLyBzdHJpbmcmIHN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNvbnN0KiBoZWFkZXJCb3VuZGFyeSkgeworICBpbnQzMl90IHN0ckxlbjsKKworICB1aW50MzJfdCBieXRlcyA9IHJlYWRWYXJpbnQzMihwdHIsICZzdHJMZW4sIGhlYWRlckJvdW5kYXJ5KTsKKyAgaWYgKHN0ckxlbiA+IGhlYWRlckJvdW5kYXJ5IC0gcHRyKSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpDT1JSVVBURURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmZvIGhlYWRlciBsZW5ndGggZXhjZWVkcyBoZWFkZXIgc2l6ZSIpOworICB9CisgIHB0ciArPSBieXRlczsKKyAgc3RyLmFzc2lnbihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihwdHIpLCBzdHJMZW4pOworICBwdHIgKz0gc3RyTGVuOworfQorCit2b2lkIFRIZWFkZXJUcmFuc3BvcnQ6OnJlYWRIZWFkZXJGb3JtYXQodWludDE2X3QgaGVhZGVyU2l6ZSwgdWludDMyX3Qgc3opIHsKKyAgcmVhZFRyYW5zXy5jbGVhcigpOyAgIC8vIENsZWFyIG91dCBhbnkgcHJldmlvdXMgdHJhbnNmb3Jtcy4KKyAgcmVhZEhlYWRlcnNfLmNsZWFyKCk7IC8vIENsZWFyIG91dCBhbnkgcHJldmlvdXMgaGVhZGVycy4KKworICAvLyBza2lwIG92ZXIgYWxyZWFkeSBwcm9jZXNzZWQgbWFnaWMoNCksIHNlcUlkKDQpLCBoZWFkZXJTaXplKDIpCisgIHVpbnQ4X3QqIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KHJCdWZfLmdldCgpICsgMTApOworCisgIC8vIENhdGNoIGludGVnZXIgb3ZlcmZsb3csIGNoZWNrIGZvciByZWFzb25hYmxlIGhlYWRlciBzaXplCisgIGlmIChoZWFkZXJTaXplID49IDE2Mzg0KSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpDT1JSVVBURURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWFkZXIgc2l6ZSBpcyB1bnJlYXNvbmFibGUiKTsKKyAgfQorICBoZWFkZXJTaXplICo9IDQ7CisgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGhlYWRlckJvdW5kYXJ5ID0gcHRyICsgaGVhZGVyU2l6ZTsKKyAgaWYgKGhlYWRlclNpemUgPiBzeikgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Q09SUlVQVEVEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVhZGVyIHNpemUgaXMgbGFyZ2VyIHRoYW4gZnJhbWUiKTsKKyAgfQorICB1aW50OF90KiBkYXRhID0gcHRyICsgaGVhZGVyU2l6ZTsKKyAgcHRyICs9IHJlYWRWYXJpbnQxNihwdHIsICZwcm90b0lkLCBoZWFkZXJCb3VuZGFyeSk7CisgIGludDE2X3QgbnVtVHJhbnNmb3JtczsKKyAgcHRyICs9IHJlYWRWYXJpbnQxNihwdHIsICZudW1UcmFuc2Zvcm1zLCBoZWFkZXJCb3VuZGFyeSk7CisKKyAgLy8gRm9yIG5vdyBhbGwgdHJhbnNmb3JtcyBjb25zaXN0IG9mIG9ubHkgdGhlIElELCBub3QgZGF0YS4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1UcmFuc2Zvcm1zOyBpKyspIHsKKyAgICBpbnQzMl90IHRyYW5zSWQ7CisgICAgcHRyICs9IHJlYWRWYXJpbnQzMihwdHIsICZ0cmFuc0lkLCBoZWFkZXJCb3VuZGFyeSk7CisKKyAgICByZWFkVHJhbnNfLnB1c2hfYmFjayh0cmFuc0lkKTsKKyAgfQorCisgIC8vIEluZm8gaGVhZGVycworICB3aGlsZSAocHRyIDwgaGVhZGVyQm91bmRhcnkpIHsKKyAgICBpbnQzMl90IGluZm9JZDsKKyAgICBwdHIgKz0gcmVhZFZhcmludDMyKHB0ciwgJmluZm9JZCwgaGVhZGVyQm91bmRhcnkpOworCisgICAgaWYgKGluZm9JZCA9PSAwKSB7CisgICAgICAvLyBoZWFkZXIgcGFkZGluZworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChpbmZvSWQgPj0gaW5mb0lkVHlwZTo6RU5EKSB7CisgICAgICAvLyBjYW5ub3QgaGFuZGxlIGluZm9JZAorICAgICAgYnJlYWs7CisgICAgfQorICAgIHN3aXRjaCAoaW5mb0lkKSB7CisgICAgY2FzZSBpbmZvSWRUeXBlOjpLRVlWQUxVRToKKyAgICAgIC8vIFByb2Nlc3Mga2V5LXZhbHVlIGhlYWRlcnMKKyAgICAgIHVpbnQzMl90IG51bUtWSGVhZGVyczsKKyAgICAgIHB0ciArPSByZWFkVmFyaW50MzIocHRyLCAoaW50MzJfdCopJm51bUtWSGVhZGVycywgaGVhZGVyQm91bmRhcnkpOworICAgICAgLy8gY29udGludWUgdW50aWwgd2UgcmVhY2ggKHBhZGRlZCkgZW5kIG9mIHBhY2tldAorICAgICAgd2hpbGUgKG51bUtWSGVhZGVycy0tICYmIHB0ciA8IGhlYWRlckJvdW5kYXJ5KSB7CisgICAgICAgIC8vIGZvcm1hdDoga2V5OyB2YWx1ZQorICAgICAgICAvLyBib3RoOiBsZW5ndGggKHZhcmludDMyKTsgdmFsdWUgKHN0cmluZykKKyAgICAgICAgc3RyaW5nIGtleSwgdmFsdWU7CisgICAgICAgIHJlYWRTdHJpbmcocHRyLCBrZXksIGhlYWRlckJvdW5kYXJ5KTsKKyAgICAgICAgLy8gdmFsdWUKKyAgICAgICAgcmVhZFN0cmluZyhwdHIsIHZhbHVlLCBoZWFkZXJCb3VuZGFyeSk7CisgICAgICAgIC8vIHNhdmUgdG8gaGVhZGVycworICAgICAgICByZWFkSGVhZGVyc19ba2V5XSA9IHZhbHVlOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgLy8gVW50cmFuc2Zvcm0gdGhlIGRhdGEgc2VjdGlvbi4gIHJCdWYgd2lsbCBjb250YWluIHJlc3VsdC4KKyAgdW50cmFuc2Zvcm0oZGF0YSwgc2FmZV9udW1lcmljX2Nhc3Q8dWludDMyX3Q+KHN0YXRpY19jYXN0PHB0cmRpZmZfdD4oc3opIC0gKGRhdGEgLSByQnVmXy5nZXQoKSkpKTsKK30KKwordm9pZCBUSGVhZGVyVHJhbnNwb3J0Ojp1bnRyYW5zZm9ybSh1aW50OF90KiBwdHIsIHVpbnQzMl90IHN6KSB7CisgIC8vIFVwZGF0ZSB0aGUgdHJhbnNmb3JtIGJ1ZmZlciBzaXplIGlmIG5lZWRlZAorICByZXNpemVUcmFuc2Zvcm1CdWZmZXIoKTsKKworICBmb3IgKHZlY3Rvcjx1aW50MTZfdD46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gcmVhZFRyYW5zXy5iZWdpbigpOyBpdCAhPSByZWFkVHJhbnNfLmVuZCgpOyArK2l0KSB7CisgICAgY29uc3QgdWludDE2X3QgdHJhbnNJZCA9ICppdDsKKworICAgIGlmICh0cmFuc0lkID09IFpMSUJfVFJBTlNGT1JNKSB7CisgICAgICB6X3N0cmVhbSBzdHJlYW07CisgICAgICBpbnQgZXJyOworCisgICAgICBzdHJlYW0ubmV4dF9pbiA9IHB0cjsKKyAgICAgIHN0cmVhbS5hdmFpbF9pbiA9IHN6OworCisgICAgICAvLyBTZXR0aW5nIHRoZXNlIHRvIDAgbWVhbnMgdXNlIHRoZSBkZWZhdWx0IGZyZWUvYWxsb2MgZnVuY3Rpb25zCisgICAgICBzdHJlYW0uemFsbG9jID0gKGFsbG9jX2Z1bmMpMDsKKyAgICAgIHN0cmVhbS56ZnJlZSA9IChmcmVlX2Z1bmMpMDsKKyAgICAgIHN0cmVhbS5vcGFxdWUgPSAodm9pZHBmKTA7CisgICAgICBlcnIgPSBpbmZsYXRlSW5pdCgmc3RyZWFtKTsKKyAgICAgIGlmIChlcnIgIT0gWl9PSykgeworICAgICAgICB0aHJvdyBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uOjpNSVNTSU5HX1JFU1VMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciB3aGlsZSB6bGliIGRlZmxhdGVJbml0Iik7CisgICAgICB9CisgICAgICBzdHJlYW0ubmV4dF9vdXQgPSB0QnVmXy5nZXQoKTsKKyAgICAgIHN0cmVhbS5hdmFpbF9vdXQgPSB0QnVmU2l6ZV87CisgICAgICBlcnIgPSBpbmZsYXRlKCZzdHJlYW0sIFpfRklOSVNIKTsKKyAgICAgIGlmIChlcnIgIT0gWl9TVFJFQU1fRU5EIHx8IHN0cmVhbS5hdmFpbF9vdXQgPT0gMCkgeworICAgICAgICB0aHJvdyBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uOjpNSVNTSU5HX1JFU1VMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciB3aGlsZSB6bGliIGRlZmxhdGUiKTsKKyAgICAgIH0KKyAgICAgIHN6ID0gc3RyZWFtLnRvdGFsX291dDsKKworICAgICAgZXJyID0gaW5mbGF0ZUVuZCgmc3RyZWFtKTsKKyAgICAgIGlmIChlcnIgIT0gWl9PSykgeworICAgICAgICB0aHJvdyBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uOjpNSVNTSU5HX1JFU1VMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciB3aGlsZSB6bGliIGRlZmxhdGVFbmQiKTsKKyAgICAgIH0KKworICAgICAgbWVtY3B5KHB0ciwgdEJ1Zl8uZ2V0KCksIHN6KTsKKyAgICB9IGVsc2UgeworICAgICAgdGhyb3cgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6TUlTU0lOR19SRVNVTFQsICJVbmtub3duIHRyYW5zZm9ybSIpOworICAgIH0KKyAgfQorCisgIHNldFJlYWRCdWZmZXIocHRyLCBzeik7Cit9CisKKy8qKgorICogV2UgbWF5IGhhdmUgdXBkYXRlZCB0aGUgd0J1ZiBzaXplLCB1cGRhdGUgdGhlIHRCdWYgc2l6ZSB0byBtYXRjaC4KKyAqIFNob3VsZCBiZSBjYWxsZWQgaW4gdHJhbnNmb3JtLgorICoKKyAqIFRoZSBidWZmZXIgc2hvdWxkIGJlIHNsaWdodGx5IGxhcmdlciB0aGFuIHdyaXRlIGJ1ZmZlciBzaXplIGR1ZSB0bworICogY29tcHJlc3Npb24gdHJhbnNmb3JtcyAodGhhdCBtYXkgc2xpZ2h0bHkgZ3JvdyBvbiBzbWFsbCBmcmFtZSBzaXplcykKKyAqLwordm9pZCBUSGVhZGVyVHJhbnNwb3J0OjpyZXNpemVUcmFuc2Zvcm1CdWZmZXIodWludDMyX3QgYWRkaXRpb25hbFNpemUpIHsKKyAgaWYgKHRCdWZTaXplXyA8IHdCdWZTaXplXyArIERFRkFVTFRfQlVGRkVSX1NJWkUpIHsKKyAgICB1aW50MzJfdCBuZXdfc2l6ZSA9IHdCdWZTaXplXyArIERFRkFVTFRfQlVGRkVSX1NJWkUgKyBhZGRpdGlvbmFsU2l6ZTsKKyAgICB1aW50OF90KiBuZXdfYnVmID0gbmV3IHVpbnQ4X3RbbmV3X3NpemVdOworICAgIHRCdWZfLnJlc2V0KG5ld19idWYpOworICAgIHRCdWZTaXplXyA9IG5ld19zaXplOworICB9Cit9CisKK3ZvaWQgVEhlYWRlclRyYW5zcG9ydDo6dHJhbnNmb3JtKHVpbnQ4X3QqIHB0ciwgdWludDMyX3Qgc3opIHsKKyAgLy8gVXBkYXRlIHRoZSB0cmFuc2Zvcm0gYnVmZmVyIHNpemUgaWYgbmVlZGVkCisgIHJlc2l6ZVRyYW5zZm9ybUJ1ZmZlcigpOworCisgIGZvciAodmVjdG9yPHVpbnQxNl90Pjo6Y29uc3RfaXRlcmF0b3IgaXQgPSB3cml0ZVRyYW5zXy5iZWdpbigpOyBpdCAhPSB3cml0ZVRyYW5zXy5lbmQoKTsgKytpdCkgeworICAgIGNvbnN0IHVpbnQxNl90IHRyYW5zSWQgPSAqaXQ7CisKKyAgICBpZiAodHJhbnNJZCA9PSBaTElCX1RSQU5TRk9STSkgeworICAgICAgel9zdHJlYW0gc3RyZWFtOworICAgICAgaW50IGVycjsKKworICAgICAgc3RyZWFtLm5leHRfaW4gPSBwdHI7CisgICAgICBzdHJlYW0uYXZhaWxfaW4gPSBzejsKKworICAgICAgc3RyZWFtLnphbGxvYyA9IChhbGxvY19mdW5jKTA7CisgICAgICBzdHJlYW0uemZyZWUgPSAoZnJlZV9mdW5jKTA7CisgICAgICBzdHJlYW0ub3BhcXVlID0gKHZvaWRwZikwOworICAgICAgZXJyID0gZGVmbGF0ZUluaXQoJnN0cmVhbSwgWl9ERUZBVUxUX0NPTVBSRVNTSU9OKTsKKyAgICAgIGlmIChlcnIgIT0gWl9PSykgeworICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkNPUlJVUFRFRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciB3aGlsZSB6bGliIGRlZmxhdGVJbml0Iik7CisgICAgICB9CisgICAgICB1aW50MzJfdCB0YnVmX3NpemUgPSAwOworICAgICAgd2hpbGUgKGVyciA9PSBaX09LKSB7CisgICAgICAgIHJlc2l6ZVRyYW5zZm9ybUJ1ZmZlcih0YnVmX3NpemUpOworCisgICAgICAgIHN0cmVhbS5uZXh0X291dCA9IHRCdWZfLmdldCgpOworICAgICAgICBzdHJlYW0uYXZhaWxfb3V0ID0gdEJ1ZlNpemVfOworICAgICAgICBlcnIgPSBkZWZsYXRlKCZzdHJlYW0sIFpfRklOSVNIKTsKKyAgICAgICAgdGJ1Zl9zaXplICs9IERFRkFVTFRfQlVGRkVSX1NJWkU7CisgICAgICB9CisgICAgICBzeiA9IHN0cmVhbS50b3RhbF9vdXQ7CisKKyAgICAgIGVyciA9IGRlZmxhdGVFbmQoJnN0cmVhbSk7CisgICAgICBpZiAoZXJyICE9IFpfT0spIHsKKyAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpDT1JSVVBURURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3Igd2hpbGUgemxpYiBkZWZsYXRlRW5kIik7CisgICAgICB9CisKKyAgICAgIG1lbWNweShwdHIsIHRCdWZfLmdldCgpLCBzeik7CisgICAgfSBlbHNlIHsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Q09SUlVQVEVEX0RBVEEsICJVbmtub3duIHRyYW5zZm9ybSIpOworICAgIH0KKyAgfQorCisgIHdCYXNlXyA9IHdCdWZfLmdldCgpICsgc3o7Cit9CisKK3ZvaWQgVEhlYWRlclRyYW5zcG9ydDo6cmVzZXRQcm90b2NvbCgpIHsKKyAgLy8gU2V0IHRvIGFueXRoaW5nIGV4Y2VwdCBIVFRQIHR5cGUgc28gd2UgZG9uJ3QgZmx1c2ggYWdhaW4KKyAgY2xpZW50VHlwZSA9IFRIUklGVF9IRUFERVJfQ0xJRU5UX1RZUEU7CisKKyAgLy8gUmVhZCB0aGUgaGVhZGVyIGFuZCBkZWNpZGUgd2hpY2ggcHJvdG9jb2wgdG8gZ28gd2l0aAorICByZWFkRnJhbWUoKTsKK30KKwordWludDMyX3QgVEhlYWRlclRyYW5zcG9ydDo6Z2V0V3JpdGVCeXRlcygpIHsKKyAgcmV0dXJuIHNhZmVfbnVtZXJpY19jYXN0PHVpbnQzMl90Pih3QmFzZV8gLSB3QnVmXy5nZXQoKSk7Cit9CisKKy8qKgorICogV3JpdGVzIGEgc3RyaW5nIHRvIGEgYnl0ZSBidWZmZXIsIGFzIHNpemUgKHZhcmludDMyKSArIHN0cmluZyAobm9uLW51bGwKKyAqIHRlcm1pbmF0ZWQpCisgKiBBdXRvbWF0aWNhbGx5IGFkdmFuY2VzIHB0ciB0byBhZnRlciB0aGUgd3JpdHRlbiBwb3J0aW9uCisgKi8KK3ZvaWQgVEhlYWRlclRyYW5zcG9ydDo6d3JpdGVTdHJpbmcodWludDhfdComIHB0ciwgY29uc3Qgc3RyaW5nJiBzdHIpIHsKKyAgaW50MzJfdCBzdHJMZW4gPSBzYWZlX251bWVyaWNfY2FzdDxpbnQzMl90PihzdHIubGVuZ3RoKCkpOworICBwdHIgKz0gd3JpdGVWYXJpbnQzMihzdHJMZW4sIHB0cik7CisgIG1lbWNweShwdHIsIHN0ci5jX3N0cigpLCBzdHJMZW4pOyAvLyBubyBuZWVkIHRvIHdyaXRlIFwwCisgIHB0ciArPSBzdHJMZW47Cit9CisKK3ZvaWQgVEhlYWRlclRyYW5zcG9ydDo6c2V0SGVhZGVyKGNvbnN0IHN0cmluZyYga2V5LCBjb25zdCBzdHJpbmcmIHZhbHVlKSB7CisgIHdyaXRlSGVhZGVyc19ba2V5XSA9IHZhbHVlOworfQorCit1aW50MzJfdCBUSGVhZGVyVHJhbnNwb3J0OjpnZXRNYXhXcml0ZUhlYWRlcnNTaXplKCkgY29uc3QgeworICBzaXplX3QgbWF4V3JpdGVIZWFkZXJzU2l6ZSA9IDA7CisgIFRIZWFkZXJUcmFuc3BvcnQ6OlN0cmluZ1RvU3RyaW5nTWFwOjpjb25zdF9pdGVyYXRvciBpdDsKKyAgZm9yIChpdCA9IHdyaXRlSGVhZGVyc18uYmVnaW4oKTsgaXQgIT0gd3JpdGVIZWFkZXJzXy5lbmQoKTsgKytpdCkgeworICAgIC8vIGFkZCBzaXplcyBvZiBrZXkgYW5kIHZhbHVlIHRvIG1heFdyaXRlSGVhZGVyc1NpemUKKyAgICAvLyAyIHZhcmludHMzMiArIHRoZSBzdHJpbmdzIHRoZW1zZWx2ZXMKKyAgICBtYXhXcml0ZUhlYWRlcnNTaXplICs9IDUgKyA1ICsgKGl0LT5maXJzdCkubGVuZ3RoKCkgKyAoaXQtPnNlY29uZCkubGVuZ3RoKCk7CisgIH0KKyAgcmV0dXJuIHNhZmVfbnVtZXJpY19jYXN0PHVpbnQzMl90PihtYXhXcml0ZUhlYWRlcnNTaXplKTsKK30KKwordm9pZCBUSGVhZGVyVHJhbnNwb3J0OjpjbGVhckhlYWRlcnMoKSB7CisgIHdyaXRlSGVhZGVyc18uY2xlYXIoKTsKK30KKwordm9pZCBUSGVhZGVyVHJhbnNwb3J0OjpmbHVzaCgpIHsKKyAgLy8gV3JpdGUgb3V0IGFueSBkYXRhIHdhaXRpbmcgaW4gdGhlIHdyaXRlIGJ1ZmZlci4KKyAgdWludDMyX3QgaGF2ZUJ5dGVzID0gZ2V0V3JpdGVCeXRlcygpOworCisgIGlmIChjbGllbnRUeXBlID09IFRIUklGVF9IRUFERVJfQ0xJRU5UX1RZUEUpIHsKKyAgICB0cmFuc2Zvcm0od0J1Zl8uZ2V0KCksIGhhdmVCeXRlcyk7CisgICAgaGF2ZUJ5dGVzID0gZ2V0V3JpdGVCeXRlcygpOyAvLyB0cmFuc2Zvcm0gbWF5IGhhdmUgY2hhbmdlZCB0aGUgc2l6ZQorICB9CisKKyAgLy8gTm90ZSB0aGF0IHdlIHJlc2V0IHdCYXNlXyBwcmlvciB0byB0aGUgdW5kZXJseWluZyB3cml0ZQorICAvLyB0byBlbnN1cmUgd2UncmUgaW4gYSBzYW5lIHN0YXRlIChpLmUuIGludGVybmFsIGJ1ZmZlciBjbGVhbmVkKQorICAvLyBpZiB0aGUgdW5kZXJseWluZyB3cml0ZSB0aHJvd3MgdXAgYW4gZXhjZXB0aW9uCisgIHdCYXNlXyA9IHdCdWZfLmdldCgpOworCisgIGlmIChoYXZlQnl0ZXMgPiBNQVhfRlJBTUVfU0laRSkgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Q09SUlVQVEVEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXR0ZW1wdGluZyB0byBzZW5kIGZyYW1lIHRoYXQgaXMgdG9vIGxhcmdlIik7CisgIH0KKworICBpZiAoY2xpZW50VHlwZSA9PSBUSFJJRlRfSEVBREVSX0NMSUVOVF9UWVBFKSB7CisgICAgLy8gaGVhZGVyIHNpemUgd2lsbCBuZWVkIHRvIGJlIHVwZGF0ZWQgYXQgdGhlIGVuZCBiZWNhdXNlIG9mIHZhcmludHMuCisgICAgLy8gTWFrZSBpdCBiaWcgZW5vdWdoIGhlcmUgZm9yIG1heCB2YXJpbnQgc2l6ZSwgcGx1cyA0IGZvciBwYWRkaW5nLgorICAgIHVpbnQzMl90IGhlYWRlclNpemUgPSAoMiArIGdldE51bVRyYW5zZm9ybXMoKSkgKiBUSFJJRlRfTUFYX1ZBUklOVDMyX0JZVEVTICsgNDsKKyAgICAvLyBhZGQgYXBwcm94aW1hdGUgc2l6ZSBvZiBpbmZvIGhlYWRlcnMKKyAgICBoZWFkZXJTaXplICs9IGdldE1heFdyaXRlSGVhZGVyc1NpemUoKTsKKworICAgIC8vIFBrdCBzaXplCisgICAgdWludDMyX3QgbWF4U3pIYm8gPSBoZWFkZXJTaXplICsgaGF2ZUJ5dGVzIC8vIHRocmlmdCBoZWFkZXIgKyBwYXlsb2FkCisgICAgICAgICAgICAgICAgICAgICAgICArIDEwOyAgICAgICAgICAgICAgICAgIC8vIGNvbW1vbiBoZWFkZXIgc2VjdGlvbgorICAgIHVpbnQ4X3QqIHBrdCA9IHRCdWZfLmdldCgpOworICAgIHVpbnQ4X3QqIGhlYWRlclN0YXJ0OworICAgIHVpbnQ4X3QqIGhlYWRlclNpemVQdHI7CisgICAgdWludDhfdCogcGt0U3RhcnQgPSBwa3Q7CisKKyAgICBpZiAobWF4U3pIYm8gPiB0QnVmU2l6ZV8pIHsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Q09SUlVQVEVEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBdHRlbXB0aW5nIHRvIGhlYWRlciBmcmFtZSB0aGF0IGlzIHRvbyBsYXJnZSIpOworICAgIH0KKworICAgIHVpbnQzMl90IHN6SGJvOworICAgIHVpbnQzMl90IHN6TmJvOworICAgIHVpbnQxNl90IGhlYWRlclNpemVOOworCisgICAgLy8gRml4dXAgc3pIYm8gbGF0ZXIKKyAgICBwa3QgKz0gc2l6ZW9mKHN6TmJvKTsKKyAgICB1aW50MTZfdCBoZWFkZXJOID0gaHRvbnMoSEVBREVSX01BR0lDID4+IDE2KTsKKyAgICBtZW1jcHkocGt0LCAmaGVhZGVyTiwgc2l6ZW9mKGhlYWRlck4pKTsKKyAgICBwa3QgKz0gc2l6ZW9mKGhlYWRlck4pOworICAgIHVpbnQxNl90IGZsYWdzTiA9IGh0b25zKGZsYWdzKTsKKyAgICBtZW1jcHkocGt0LCAmZmxhZ3NOLCBzaXplb2YoZmxhZ3NOKSk7CisgICAgcGt0ICs9IHNpemVvZihmbGFnc04pOworICAgIHVpbnQzMl90IHNlcUlkTiA9IGh0b25sKHNlcUlkKTsKKyAgICBtZW1jcHkocGt0LCAmc2VxSWROLCBzaXplb2Yoc2VxSWROKSk7CisgICAgcGt0ICs9IHNpemVvZihzZXFJZE4pOworICAgIGhlYWRlclNpemVQdHIgPSBwa3Q7CisgICAgLy8gRml4dXAgaGVhZGVyU2l6ZU4gbGF0ZXIKKyAgICBwa3QgKz0gc2l6ZW9mKGhlYWRlclNpemVOKTsKKyAgICBoZWFkZXJTdGFydCA9IHBrdDsKKworICAgIHBrdCArPSB3cml0ZVZhcmludDMyKHByb3RvSWQsIHBrdCk7CisgICAgcGt0ICs9IHdyaXRlVmFyaW50MzIoZ2V0TnVtVHJhbnNmb3JtcygpLCBwa3QpOworCisgICAgLy8gRm9yIG5vdywgZWFjaCB0cmFuc2Zvcm0gaXMgb25seSB0aGUgSUQsIG5vIGZvbGxvd2luZyBkYXRhLgorICAgIGZvciAodmVjdG9yPHVpbnQxNl90Pjo6Y29uc3RfaXRlcmF0b3IgaXQgPSB3cml0ZVRyYW5zXy5iZWdpbigpOyBpdCAhPSB3cml0ZVRyYW5zXy5lbmQoKTsgKytpdCkgeworICAgICAgcGt0ICs9IHdyaXRlVmFyaW50MzIoKml0LCBwa3QpOworICAgIH0KKworICAgIC8vIHdyaXRlIGluZm8gaGVhZGVycworCisgICAgLy8gZm9yIG5vdyBvbmx5IHdyaXRlIGt2LWhlYWRlcnMKKyAgICBpbnQzMl90IGhlYWRlckNvdW50ID0gc2FmZV9udW1lcmljX2Nhc3Q8aW50MzJfdD4od3JpdGVIZWFkZXJzXy5zaXplKCkpOworICAgIGlmIChoZWFkZXJDb3VudCA+IDApIHsKKyAgICAgIHBrdCArPSB3cml0ZVZhcmludDMyKGluZm9JZFR5cGU6OktFWVZBTFVFLCBwa3QpOworICAgICAgLy8gV3JpdGUga2V5LXZhbHVlIGhlYWRlcnMgY291bnQKKyAgICAgIHBrdCArPSB3cml0ZVZhcmludDMyKHN0YXRpY19jYXN0PGludDMyX3Q+KGhlYWRlckNvdW50KSwgcGt0KTsKKyAgICAgIC8vIFdyaXRlIGluZm8gaGVhZGVycworICAgICAgbWFwPHN0cmluZywgc3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXQ7CisgICAgICBmb3IgKGl0ID0gd3JpdGVIZWFkZXJzXy5iZWdpbigpOyBpdCAhPSB3cml0ZUhlYWRlcnNfLmVuZCgpOyArK2l0KSB7CisgICAgICAgIHdyaXRlU3RyaW5nKHBrdCwgaXQtPmZpcnN0KTsgIC8vIGtleQorICAgICAgICB3cml0ZVN0cmluZyhwa3QsIGl0LT5zZWNvbmQpOyAvLyB2YWx1ZQorICAgICAgfQorICAgICAgd3JpdGVIZWFkZXJzXy5jbGVhcigpOworICAgIH0KKworICAgIC8vIEZpeHVwcyBhZnRlciB2YXJpbnQgc2l6ZSBjYWxjdWxhdGlvbnMKKyAgICBoZWFkZXJTaXplID0gc2FmZV9udW1lcmljX2Nhc3Q8dWludDMyX3Q+KHBrdCAtIGhlYWRlclN0YXJ0KTsKKyAgICB1aW50OF90IHBhZGRpbmcgPSA0IC0gKGhlYWRlclNpemUgJSA0KTsKKyAgICBoZWFkZXJTaXplICs9IHBhZGRpbmc7CisKKyAgICAvLyBQYWQgb3V0IHBrdCB3aXRoIDB4MDAKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhZGRpbmc7IGkrKykgeworICAgICAgKihwa3QrKykgPSAweDAwOworICAgIH0KKworICAgIC8vIFBrdCBzaXplCisgICAgcHRyZGlmZl90IHN6SGJwID0gKGhlYWRlclN0YXJ0IC0gcGt0U3RhcnQgLSA0KTsKKyAgICBpZiAoc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHN6SGJwKSA+IHN0YXRpY19jYXN0PHVpbnQ2NF90Pigoc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD4oKS5tYXgpKCkpIC0gKGhlYWRlclNpemUgKyBoYXZlQnl0ZXMpKSB7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkNPUlJVUFRFRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVhZGVyIHNlY3Rpb24gc2l6ZSBpcyB1bnJlYXNvbmFibGUiKTsKKyAgICB9CisgICAgc3pIYm8gPSBoZWFkZXJTaXplICsgaGF2ZUJ5dGVzICAgICAgICAgIC8vIHRocmlmdCBoZWFkZXIgKyBwYXlsb2FkCisgICAgICAgICAgICArIHN0YXRpY19jYXN0PHVpbnQzMl90PihzekhicCk7IC8vIGNvbW1vbiBoZWFkZXIgc2VjdGlvbgorICAgIGhlYWRlclNpemVOID0gaHRvbnMoaGVhZGVyU2l6ZSAvIDQpOworICAgIG1lbWNweShoZWFkZXJTaXplUHRyLCAmaGVhZGVyU2l6ZU4sIHNpemVvZihoZWFkZXJTaXplTikpOworCisgICAgLy8gU2V0IGZyYW1pbmcgc2l6ZS4KKyAgICBzek5ibyA9IGh0b25sKHN6SGJvKTsKKyAgICBtZW1jcHkocGt0U3RhcnQsICZzek5ibywgc2l6ZW9mKHN6TmJvKSk7CisKKyAgICBvdXRUcmFuc3BvcnRfLT53cml0ZShwa3RTdGFydCwgc3pIYm8gLSBoYXZlQnl0ZXMgKyA0KTsKKyAgICBvdXRUcmFuc3BvcnRfLT53cml0ZSh3QnVmXy5nZXQoKSwgaGF2ZUJ5dGVzKTsKKyAgfSBlbHNlIGlmIChjbGllbnRUeXBlID09IFRIUklGVF9GUkFNRURfQklOQVJZIHx8IGNsaWVudFR5cGUgPT0gVEhSSUZUX0ZSQU1FRF9DT01QQUNUKSB7CisgICAgdWludDMyX3Qgc3pIYm8gPSAodWludDMyX3QpaGF2ZUJ5dGVzOworICAgIHVpbnQzMl90IHN6TmJvID0gaHRvbmwoc3pIYm8pOworCisgICAgb3V0VHJhbnNwb3J0Xy0+d3JpdGUocmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oJnN6TmJvKSwgNCk7CisgICAgb3V0VHJhbnNwb3J0Xy0+d3JpdGUod0J1Zl8uZ2V0KCksIGhhdmVCeXRlcyk7CisgIH0gZWxzZSBpZiAoY2xpZW50VHlwZSA9PSBUSFJJRlRfVU5GUkFNRURfQklOQVJZIHx8IGNsaWVudFR5cGUgPT0gVEhSSUZUX1VORlJBTUVEX0NPTVBBQ1QpIHsKKyAgICBvdXRUcmFuc3BvcnRfLT53cml0ZSh3QnVmXy5nZXQoKSwgaGF2ZUJ5dGVzKTsKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkJBRF9BUkdTLCAiVW5rbm93biBjbGllbnQgdHlwZSIpOworICB9CisKKyAgLy8gRmx1c2ggdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0LgorICBvdXRUcmFuc3BvcnRfLT5mbHVzaCgpOworfQorCisvKioKKyAqIFJlYWQgYW4gaTE2IGZyb20gdGhlIHdpcmUgYXMgYSB2YXJpbnQuIFRoZSBNU0Igb2YgZWFjaCBieXRlIGlzIHNldAorICogaWYgdGhlcmUgaXMgYW5vdGhlciBieXRlIHRvIGZvbGxvdy4gVGhpcyBjYW4gcmVhZCB1cCB0byAzIGJ5dGVzLgorICovCit1aW50MzJfdCBUSGVhZGVyVHJhbnNwb3J0OjpyZWFkVmFyaW50MTYodWludDhfdCBjb25zdCogcHRyLCBpbnQxNl90KiBpMTYsIHVpbnQ4X3QgY29uc3QqIGJvdW5kYXJ5KSB7CisgIGludDMyX3QgdmFsOworICB1aW50MzJfdCByc2l6ZSA9IHJlYWRWYXJpbnQzMihwdHIsICZ2YWwsIGJvdW5kYXJ5KTsKKyAgKmkxNiA9IChpbnQxNl90KXZhbDsKKyAgcmV0dXJuIHJzaXplOworfQorCisvKioKKyAqIFJlYWQgYW4gaTMyIGZyb20gdGhlIHdpcmUgYXMgYSB2YXJpbnQuIFRoZSBNU0Igb2YgZWFjaCBieXRlIGlzIHNldAorICogaWYgdGhlcmUgaXMgYW5vdGhlciBieXRlIHRvIGZvbGxvdy4gVGhpcyBjYW4gcmVhZCB1cCB0byA1IGJ5dGVzLgorICovCit1aW50MzJfdCBUSGVhZGVyVHJhbnNwb3J0OjpyZWFkVmFyaW50MzIodWludDhfdCBjb25zdCogcHRyLCBpbnQzMl90KiBpMzIsIHVpbnQ4X3QgY29uc3QqIGJvdW5kYXJ5KSB7CisKKyAgdWludDMyX3QgcnNpemUgPSAwOworICB1aW50MzJfdCB2YWwgPSAwOworICBpbnQgc2hpZnQgPSAwOworCisgIHdoaWxlICh0cnVlKSB7CisgICAgaWYgKHB0ciA9PSBib3VuZGFyeSkgeworICAgICAgdGhyb3cgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6SU5WQUxJRF9NRVNTQUdFX1RZUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRyeWluZyB0byByZWFkIHBhc3QgaGVhZGVyIGJvdW5kYXJ5Iik7CisgICAgfQorICAgIHVpbnQ4X3QgYnl0ZSA9ICoocHRyKyspOworICAgIHJzaXplKys7CisgICAgdmFsIHw9ICh1aW50NjRfdCkoYnl0ZSAmIDB4N2YpIDw8IHNoaWZ0OworICAgIHNoaWZ0ICs9IDc7CisgICAgaWYgKCEoYnl0ZSAmIDB4ODApKSB7CisgICAgICAqaTMyID0gdmFsOworICAgICAgcmV0dXJuIHJzaXplOworICAgIH0KKyAgfQorfQorCisvKioKKyAqIFdyaXRlIGFuIGkzMiBhcyBhIHZhcmludC4gUmVzdWx0cyBpbiAxLTUgYnl0ZXMgb24gdGhlIHdpcmUuCisgKi8KK3VpbnQzMl90IFRIZWFkZXJUcmFuc3BvcnQ6OndyaXRlVmFyaW50MzIoaW50MzJfdCBuLCB1aW50OF90KiBwa3QpIHsKKyAgdWludDhfdCBidWZbNV07CisgIHVpbnQzMl90IHdzaXplID0gMDsKKworICB3aGlsZSAodHJ1ZSkgeworICAgIGlmICgobiAmIH4weDdGKSA9PSAwKSB7CisgICAgICBidWZbd3NpemUrK10gPSAoaW50OF90KW47CisgICAgICBicmVhazsKKyAgICB9IGVsc2UgeworICAgICAgYnVmW3dzaXplKytdID0gKGludDhfdCkoKG4gJiAweDdGKSB8IDB4ODApOworICAgICAgbiA+Pj0gNzsKKyAgICB9CisgIH0KKworICAvLyBDYWxsZXIgd2lsbCBhZHZhbmNlIHBrdC4KKyAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHdzaXplOyBpKyspIHsKKyAgICBwa3RbaV0gPSBidWZbaV07CisgIH0KKworICByZXR1cm4gd3NpemU7Cit9CisKK3VpbnQzMl90IFRIZWFkZXJUcmFuc3BvcnQ6OndyaXRlVmFyaW50MTYoaW50MTZfdCBuLCB1aW50OF90KiBwa3QpIHsKKyAgcmV0dXJuIHdyaXRlVmFyaW50MzIobiwgcGt0KTsKK30KK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9USGVhZGVyVHJhbnNwb3J0LmggYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RIZWFkZXJUcmFuc3BvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmM1N2U2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9USGVhZGVyVHJhbnNwb3J0LmgKQEAgLTAsMCArMSwyNzUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUSFJJRlRfVFJBTlNQT1JUX1RIRUFERVJUUkFOU1BPUlRfSF8KKyNkZWZpbmUgVEhSSUZUX1RSQU5TUE9SVF9USEVBREVSVFJBTlNQT1JUX0hfIDEKKworI2luY2x1ZGUgPGJpdHNldD4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8bWFwPgorCisjaWZkZWYgSEFWRV9TVERJTlRfSAorI2luY2x1ZGUgPHN0ZGludC5oPgorI2VsaWYgSEFWRV9JTlRUWVBFU19ICisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8Ym9vc3Qvc2NvcGVkX2FycmF5LmhwcD4KKworI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xUeXBlcy5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RWaXJ0dWFsVHJhbnNwb3J0Lmg+CisKK2VudW0gQ0xJRU5UX1RZUEUgeworICBUSFJJRlRfSEVBREVSX0NMSUVOVF9UWVBFID0gMCwKKyAgVEhSSUZUX0ZSQU1FRF9CSU5BUlkgPSAxLAorICBUSFJJRlRfVU5GUkFNRURfQklOQVJZID0gMiwKKyAgVEhSSUZUX0ZSQU1FRF9DT01QQUNUID0gMywKKyAgVEhSSUZUX1VORlJBTUVEX0NPTVBBQ1QgPSA0LAorICBUSFJJRlRfVU5LTk9XTl9DTElFTlRfVFlQRSA9IDUsCit9OworCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CisKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9DT01QQUNUX1BST1RPQ09MOworCisvKioKKyAqIEhlYWRlciB0cmFuc3BvcnQuIEFsbCB3cml0ZXMgZ28gaW50byBhbiBpbi1tZW1vcnkgYnVmZmVyIHVudGlsIGZsdXNoIGlzCisgKiBjYWxsZWQsIGF0IHdoaWNoIHBvaW50IHRoZSB0cmFuc3BvcnQgd3JpdGVzIHRoZSBsZW5ndGggb2YgdGhlIGVudGlyZQorICogYmluYXJ5IGNodW5rIGZvbGxvd2VkIGJ5IHRoZSBkYXRhIHBheWxvYWQuIFRoaXMgYWxsb3dzIHRoZSByZWNlaXZlciBvbiB0aGUKKyAqIG90aGVyIGVuZCB0byBhbHdheXMgZG8gZml4ZWQtbGVuZ3RoIHJlYWRzLgorICoKKyAqIFN1YmNsYXNzIFRGcmFtZWRUcmFuc3BvcnQgYmVjYXVzZSBtb3N0IG9mIHRoZSByZWFkL3dyaXRlIG1ldGhvZHMgYXJlIHNpbWlsYXIKKyAqIGFuZCBuZWVkIHNpbWlsYXIgYnVmZmVycy4gIE1ham9yIGNoYW5nZXMgYXJlIHJlYWRGcmFtZSAmIGZsdXNoLgorICoKKyAqIEhlYWRlciBUcmFuc3BvcnQgKm11c3QqIGJlIHRoZSBzYW1lIHRyYW5zcG9ydCBmb3IgYm90aCBpbnB1dCBhbmQKKyAqIG91dHB1dCB3aGVuIHVzZWQgb24gdGhlIHNlcnZlciBzaWRlIC0gY2xpZW50IHJlc3BvbnNlcyBzaG91bGQgYmUKKyAqIHRoZSBzYW1lIHByb3RvY29sIGFzIHRob3NlIGluIHRoZSByZXF1ZXN0LgorICovCitjbGFzcyBUSGVhZGVyVHJhbnNwb3J0IDogcHVibGljIFRWaXJ0dWFsVHJhbnNwb3J0PFRIZWFkZXJUcmFuc3BvcnQsIFRGcmFtZWRUcmFuc3BvcnQ+IHsKK3B1YmxpYzoKKyAgc3RhdGljIGNvbnN0IGludCBERUZBVUxUX0JVRkZFUl9TSVpFID0gNTEydTsKKyAgc3RhdGljIGNvbnN0IGludCBUSFJJRlRfTUFYX1ZBUklOVDMyX0JZVEVTID0gNTsKKworICAvLy8gVXNlIGRlZmF1bHQgYnVmZmVyIHNpemVzLgorICBleHBsaWNpdCBUSGVhZGVyVHJhbnNwb3J0KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiYgdHJhbnNwb3J0KQorICAgIDogVFZpcnR1YWxUcmFuc3BvcnQodHJhbnNwb3J0KSwKKyAgICAgIG91dFRyYW5zcG9ydF8odHJhbnNwb3J0KSwKKyAgICAgIHByb3RvSWQoVF9DT01QQUNUX1BST1RPQ09MKSwKKyAgICAgIGNsaWVudFR5cGUoVEhSSUZUX0hFQURFUl9DTElFTlRfVFlQRSksCisgICAgICBzZXFJZCgwKSwKKyAgICAgIGZsYWdzKDApLAorICAgICAgdEJ1ZlNpemVfKDApLAorICAgICAgdEJ1Zl8oTlVMTCkgeworICAgIGlmICghdHJhbnNwb3J0XykgdGhyb3cgc3RkOjppbnZhbGlkX2FyZ3VtZW50KCJ0cmFuc3BvcnQgaXMgZW1wdHkiKTsKKyAgICBpbml0QnVmZmVycygpOworICB9CisKKyAgVEhlYWRlclRyYW5zcG9ydChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gaW5UcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IG91dFRyYW5zcG9ydCkKKyAgICA6IFRWaXJ0dWFsVHJhbnNwb3J0KGluVHJhbnNwb3J0KSwKKyAgICAgIG91dFRyYW5zcG9ydF8ob3V0VHJhbnNwb3J0KSwKKyAgICAgIHByb3RvSWQoVF9DT01QQUNUX1BST1RPQ09MKSwKKyAgICAgIGNsaWVudFR5cGUoVEhSSUZUX0hFQURFUl9DTElFTlRfVFlQRSksCisgICAgICBzZXFJZCgwKSwKKyAgICAgIGZsYWdzKDApLAorICAgICAgdEJ1ZlNpemVfKDApLAorICAgICAgdEJ1Zl8oTlVMTCkgeworICAgIGlmICghdHJhbnNwb3J0XykgdGhyb3cgc3RkOjppbnZhbGlkX2FyZ3VtZW50KCJpblRyYW5zcG9ydCBpcyBlbXB0eSIpOworICAgIGlmICghb3V0VHJhbnNwb3J0XykgdGhyb3cgc3RkOjppbnZhbGlkX2FyZ3VtZW50KCJvdXRUcmFuc3BvcnQgaXMgZW1wdHkiKTsKKyAgICBpbml0QnVmZmVycygpOworICB9CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkU2xvdyh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7CisgIHZpcnR1YWwgdm9pZCBmbHVzaCgpOworCisgIHZvaWQgcmVzaXplVHJhbnNmb3JtQnVmZmVyKHVpbnQzMl90IGFkZGl0aW9uYWxTaXplID0gMCk7CisKKyAgdWludDE2X3QgZ2V0UHJvdG9jb2xJZCgpIGNvbnN0OworICB2b2lkIHNldFByb3RvY29sSWQodWludDE2X3QgcHJvdG9JZCkgeyB0aGlzLT5wcm90b0lkID0gcHJvdG9JZDsgfQorCisgIHZvaWQgcmVzZXRQcm90b2NvbCgpOworCisgIC8qKgorICAgKiBXZSBrbm93IHdlIGdvdCBhIHBhY2tldCBpbiBoZWFkZXIgZm9ybWF0IGhlcmUsIHRyeSB0byBwYXJzZSB0aGUgaGVhZGVyCisgICAqCisgICAqIEBwYXJhbSBoZWFkZXJTaXplIHNpemUgb2YgdGhlIGhlYWRlciBwb3J0aW9uCisgICAqIEBwYXJhbSBzeiBTaXplIG9mIHRoZSB3aG9sZSBtZXNzYWdlLCBpbmNsdWRpbmcgaGVhZGVyCisgICAqLworICB2b2lkIHJlYWRIZWFkZXJGb3JtYXQodWludDE2X3QgaGVhZGVyU2l6ZSwgdWludDMyX3Qgc3opOworCisgIC8qKgorICAgKiBVbnRyYW5zZm9ybSB0aGUgZGF0YSBiYXNlZCBvbiB0aGUgcmVjZWl2ZWQgaGVhZGVyIGZsYWdzCisgICAqIE9uIGNvbmNsdXNpb24gb2YgZnVuY3Rpb24sIHNldFJlYWRCdWZmZXIgaXMgY2FsbGVkIHdpdGggdGhlCisgICAqIHVudHJhbnNmb3JtZWQgZGF0YS4KKyAgICoKKyAgICogQHBhcmFtIHB0ciBwdHIgdG8gZGF0YQorICAgKiBAcGFyYW0gc2l6ZSBvZiBkYXRhCisgICAqLworICB2b2lkIHVudHJhbnNmb3JtKHVpbnQ4X3QqIHB0ciwgdWludDMyX3Qgc3opOworCisgIC8qKgorICAgKiBUcmFuc2Zvcm0gdGhlIGRhdGEgYmFzZWQgb24gb3VyIHdyaXRlIHRyYW5zZm9ybSBmbGFncworICAgKiBBdCBjb25jbHVzaW9uIG9mIGZ1bmN0aW9uIHRoZSB3cml0ZSBidWZmZXIgaXMgc2V0IHRvIHRoZQorICAgKiB0cmFuc2Zvcm1lZCBkYXRhLgorICAgKgorICAgKiBAcGFyYW0gcHRyIFB0ciB0byBkYXRhIHRvIHRyYW5zZm9ybQorICAgKiBAcGFyYW0gc3ogU2l6ZSBvZiBkYXRhIGJ1ZmZlcgorICAgKi8KKyAgdm9pZCB0cmFuc2Zvcm0odWludDhfdCogcHRyLCB1aW50MzJfdCBzeik7CisKKyAgdWludDE2X3QgZ2V0TnVtVHJhbnNmb3JtcygpIGNvbnN0IHsKKyAgICByZXR1cm4gc2FmZV9udW1lcmljX2Nhc3Q8dWludDE2X3Q+KHdyaXRlVHJhbnNfLnNpemUoKSk7CisgIH0KKworICB2b2lkIHNldFRyYW5zZm9ybSh1aW50MTZfdCB0cmFuc0lkKSB7IHdyaXRlVHJhbnNfLnB1c2hfYmFjayh0cmFuc0lkKTsgfQorCisgIC8vIEluZm8gaGVhZGVycworCisgIHR5cGVkZWYgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBTdHJpbmdUb1N0cmluZ01hcDsKKworICAvLyB0aGVzZSB3b3JrIHdpdGggd3JpdGUgaGVhZGVycworICB2b2lkIHNldEhlYWRlcihjb25zdCBzdGQ6OnN0cmluZyYga2V5LCBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpOworCisgIHZvaWQgY2xlYXJIZWFkZXJzKCk7CisKKyAgU3RyaW5nVG9TdHJpbmdNYXAmIGdldFdyaXRlSGVhZGVycygpIHsgcmV0dXJuIHdyaXRlSGVhZGVyc187IH0KKworICAvLyB0aGVzZSB3b3JrIHdpdGggcmVhZCBoZWFkZXJzCisgIGNvbnN0IFN0cmluZ1RvU3RyaW5nTWFwJiBnZXRIZWFkZXJzKCkgY29uc3QgeyByZXR1cm4gcmVhZEhlYWRlcnNfOyB9CisKKyAgLy8gYWNjZXNzb3JzIGZvciBzZXFJZAorICBpbnQzMl90IGdldFNlcXVlbmNlTnVtYmVyKCkgY29uc3QgeyByZXR1cm4gc2VxSWQ7IH0KKyAgdm9pZCBzZXRTZXF1ZW5jZU51bWJlcihpbnQzMl90IHNlcUlkKSB7IHRoaXMtPnNlcUlkID0gc2VxSWQ7IH0KKworICBlbnVtIFRSQU5TRk9STVMgeworICAgIFpMSUJfVFJBTlNGT1JNID0gMHgwMSwKKyAgfTsKKworcHJvdGVjdGVkOgorICAvKioKKyAgICogUmVhZHMgYSBmcmFtZSBvZiBpbnB1dCBmcm9tIHRoZSB1bmRlcmx5aW5nIHN0cmVhbS4KKyAgICoKKyAgICogUmV0dXJucyB0cnVlIGlmIGEgZnJhbWUgd2FzIHJlYWQgc3VjY2Vzc2Z1bGx5LCBvciBmYWxzZSBvbiBFT0YuCisgICAqIChSYWlzZXMgYSBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIEVPRiBvY2N1cnMgYWZ0ZXIgYSBwYXJ0aWFsIGZyYW1lLikKKyAgICovCisgIHZpcnR1YWwgYm9vbCByZWFkRnJhbWUoKTsKKworICB2b2lkIGVuc3VyZVJlYWRCdWZmZXIodWludDMyX3Qgc3opOworICB1aW50MzJfdCBnZXRXcml0ZUJ5dGVzKCk7CisKKyAgdm9pZCBpbml0QnVmZmVycygpIHsKKyAgICBzZXRSZWFkQnVmZmVyKE5VTEwsIDApOworICAgIHNldFdyaXRlQnVmZmVyKHdCdWZfLmdldCgpLCB3QnVmU2l6ZV8pOworICB9CisKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IG91dFRyYW5zcG9ydF87CisKKyAgLy8gMCBhbmQgMTZ0aCBiaXRzIG11c3QgYmUgMCB0byBkaWZmZXJlbnRpYXRlIGZyb20gZnJhbWVkICYgdW5mcmFtZWQKKyAgc3RhdGljIGNvbnN0IHVpbnQzMl90IEhFQURFUl9NQUdJQyA9IDB4MEZGRjAwMDA7CisgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBIRUFERVJfTUFTSyA9IDB4RkZGRjAwMDA7CisgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBGTEFHU19NQVNLID0gMHgwMDAwRkZGRjsKKworICBzdGF0aWMgY29uc3QgdWludDMyX3QgTUFYX0ZSQU1FX1NJWkUgPSAweDNGRkZGRkZGOworCisgIGludDE2X3QgcHJvdG9JZDsKKyAgdWludDE2X3QgY2xpZW50VHlwZTsKKyAgdWludDMyX3Qgc2VxSWQ7CisgIHVpbnQxNl90IGZsYWdzOworCisgIHN0ZDo6dmVjdG9yPHVpbnQxNl90PiByZWFkVHJhbnNfOworICBzdGQ6OnZlY3Rvcjx1aW50MTZfdD4gd3JpdGVUcmFuc187CisKKyAgLy8gTWFwIHRvIHVzZSBmb3IgaGVhZGVycworICBTdHJpbmdUb1N0cmluZ01hcCByZWFkSGVhZGVyc187CisgIFN0cmluZ1RvU3RyaW5nTWFwIHdyaXRlSGVhZGVyc187CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd3JpdGUgay92IGhlYWRlcnMgY2FuIHRha2UKKyAgICovCisgIHVpbnQzMl90IGdldE1heFdyaXRlSGVhZGVyc1NpemUoKSBjb25zdDsKKworICBzdHJ1Y3QgaW5mb0lkVHlwZSB7CisgICAgZW51bSBpZFR5cGUgeworICAgICAgLy8gc3RhcnQgYXQgMSB0byBhdm9pZCBjb25mdXNpbmcgaGVhZGVyIHBhZGRpbmcgZm9yIGFuIGluZm9JZAorICAgICAgS0VZVkFMVUUgPSAxLAorICAgICAgRU5EIC8vIHNpZ25hbCB0aGUgZW5kIG9mIGluZm9JZHMgd2UgY2FuIGhhbmRsZQorICAgIH07CisgIH07CisKKyAgLy8gQnVmZmVycyB0byB1c2UgZm9yIHRyYW5zZm9ybSBwcm9jZXNzaW5nCisgIHVpbnQzMl90IHRCdWZTaXplXzsKKyAgYm9vc3Q6OnNjb3BlZF9hcnJheTx1aW50OF90PiB0QnVmXzsKKworICB2b2lkIHJlYWRTdHJpbmcodWludDhfdComIHB0ciwgLyogb3V0ICovIHN0ZDo6c3RyaW5nJiBzdHIsIHVpbnQ4X3QgY29uc3QqIGhlYWRlckJvdW5kYXJ5KTsKKworICB2b2lkIHdyaXRlU3RyaW5nKHVpbnQ4X3QqJiBwdHIsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpOworCisgIC8vIFZhcmludCB1dGlscworICAvKioKKyAgICogUmVhZCBhbiBpMTYgZnJvbSB0aGUgd2lyZSBhcyBhIHZhcmludC4gVGhlIE1TQiBvZiBlYWNoIGJ5dGUgaXMgc2V0CisgICAqIGlmIHRoZXJlIGlzIGFub3RoZXIgYnl0ZSB0byBmb2xsb3cuIFRoaXMgY2FuIHJlYWQgdXAgdG8gMyBieXRlcy4KKyAgICovCisgIHVpbnQzMl90IHJlYWRWYXJpbnQxNih1aW50OF90IGNvbnN0KiBwdHIsIGludDE2X3QqIGkxNiwgdWludDhfdCBjb25zdCogYm91bmRhcnkpOworCisgIC8qKgorICAgKiBSZWFkIGFuIGkzMiBmcm9tIHRoZSB3aXJlIGFzIGEgdmFyaW50LiBUaGUgTVNCIG9mIGVhY2ggYnl0ZSBpcyBzZXQKKyAgICogaWYgdGhlcmUgaXMgYW5vdGhlciBieXRlIHRvIGZvbGxvdy4gVGhpcyBjYW4gcmVhZCB1cCB0byA1IGJ5dGVzLgorICAgKi8KKyAgdWludDMyX3QgcmVhZFZhcmludDMyKHVpbnQ4X3QgY29uc3QqIHB0ciwgaW50MzJfdCogaTMyLCB1aW50OF90IGNvbnN0KiBib3VuZGFyeSk7CisKKyAgLyoqCisgICAqIFdyaXRlIGFuIGkzMiBhcyBhIHZhcmludC4gUmVzdWx0cyBpbiAxLTUgYnl0ZXMgb24gdGhlIHdpcmUuCisgICAqLworICB1aW50MzJfdCB3cml0ZVZhcmludDMyKGludDMyX3QgbiwgdWludDhfdCogcGt0KTsKKworICAvKioKKyAgICogV3JpdGUgYW4gaTE2IGFzIGEgdmFyaW50LiBSZXN1bHRzIGluIDEtMyBieXRlcyBvbiB0aGUgd2lyZS4KKyAgICovCisgIHVpbnQzMl90IHdyaXRlVmFyaW50MTYoaW50MTZfdCBuLCB1aW50OF90KiBwa3QpOworfTsKKworLyoqCisgKiBXcmFwcyBhIHRyYW5zcG9ydCBpbnRvIGEgaGVhZGVyIG9uZS4KKyAqCisgKi8KK2NsYXNzIFRIZWFkZXJUcmFuc3BvcnRGYWN0b3J5IDogcHVibGljIFRUcmFuc3BvcnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgVEhlYWRlclRyYW5zcG9ydEZhY3RvcnkoKSB7fQorCisgIHZpcnR1YWwgflRIZWFkZXJUcmFuc3BvcnRGYWN0b3J5KCkge30KKworICAvKioKKyAgICogV3JhcHMgdGhlIHRyYW5zcG9ydCBpbnRvIGEgaGVhZGVyIG9uZS4KKyAgICovCisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldFRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMpIHsKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+KG5ldyBUSGVhZGVyVHJhbnNwb3J0KHRyYW5zKSk7CisgIH0KK307Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKKworI2VuZGlmIC8vICNpZm5kZWYgVEhSSUZUX1RSQU5TUE9SVF9USEVBREVSVFJBTlNQT1JUX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwQ2xpZW50LmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBDbGllbnQuY3BwCmluZGV4IGNiOTRkNWUuLmQxNTIxOTcgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBDbGllbnQuY3BwCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBDbGllbnQuY3BwCkBAIC0yMiwyOSArMjIsMzcgQEAKICNpbmNsdWRlIDxzc3RyZWFtPgogI2luY2x1ZGUgPGJvb3N0L2FsZ29yaXRobS9zdHJpbmcuaHBwPgogCisjaW5jbHVkZSA8dGhyaWZ0L2NvbmZpZy5oPgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEh0dHBDbGllbnQuaD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaD4KIAotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKK3VzaW5nIHN0ZDo6c3RyaW5nOwogCi11c2luZyBuYW1lc3BhY2Ugc3RkOworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgewogCi1USHR0cENsaWVudDo6VEh0dHBDbGllbnQoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0LCBzdGQ6OnN0cmluZyBob3N0LCBzdGQ6OnN0cmluZyBwYXRoKSA6Ci0gIFRIdHRwVHJhbnNwb3J0KHRyYW5zcG9ydCksIGhvc3RfKGhvc3QpLCBwYXRoXyhwYXRoKSB7CitUSHR0cENsaWVudDo6VEh0dHBDbGllbnQoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBob3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHBhdGgpCisgIDogVEh0dHBUcmFuc3BvcnQodHJhbnNwb3J0KSwgaG9zdF8oaG9zdCksIHBhdGhfKHBhdGgpIHsKIH0KIAotVEh0dHBDbGllbnQ6OlRIdHRwQ2xpZW50KHN0cmluZyBob3N0LCBpbnQgcG9ydCwgc3RyaW5nIHBhdGgpIDoKLSAgVEh0dHBUcmFuc3BvcnQoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4obmV3IFRTb2NrZXQoaG9zdCwgcG9ydCkpKSwgaG9zdF8oaG9zdCksIHBhdGhfKHBhdGgpIHsKK1RIdHRwQ2xpZW50OjpUSHR0cENsaWVudChzdHJpbmcgaG9zdCwgaW50IHBvcnQsIHN0cmluZyBwYXRoKQorICA6IFRIdHRwVHJhbnNwb3J0KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PihuZXcgVFNvY2tldChob3N0LCBwb3J0KSkpLAorICAgIGhvc3RfKGhvc3QpLAorICAgIHBhdGhfKHBhdGgpIHsKIH0KIAotVEh0dHBDbGllbnQ6On5USHR0cENsaWVudCgpIHt9CitUSHR0cENsaWVudDo6flRIdHRwQ2xpZW50KCkgeworfQogCiB2b2lkIFRIdHRwQ2xpZW50OjpwYXJzZUhlYWRlcihjaGFyKiBoZWFkZXIpIHsKICAgY2hhciogY29sb24gPSBzdHJjaHIoaGVhZGVyLCAnOicpOwogICBpZiAoY29sb24gPT0gTlVMTCkgewogICAgIHJldHVybjsKICAgfQotICBjaGFyKiB2YWx1ZSA9IGNvbG9uKzE7CisgIGNoYXIqIHZhbHVlID0gY29sb24gKyAxOwogCiAgIGlmIChib29zdDo6aXN0YXJ0c193aXRoKGhlYWRlciwgIlRyYW5zZmVyLUVuY29kaW5nIikpIHsKICAgICBpZiAoYm9vc3Q6OmllbmRzX3dpdGgodmFsdWUsICJjaHVua2VkIikpIHsKQEAgLTY1LDcgKzczLDggQEAKICAgfQogCiAgICpjb2RlID0gJ1wwJzsKLSAgd2hpbGUgKCooY29kZSsrKSA9PSAnICcpIHt9OworICB3aGlsZSAoKihjb2RlKyspID09ICcgJykgeworICB9OwogCiAgIGNoYXIqIG1zZyA9IHN0cmNocihjb2RlLCAnICcpOwogICBpZiAobXNnID09IE5VTEwpIHsKQEAgLTkyLDE3ICsxMDEsMTMgQEAKIAogICAvLyBDb25zdHJ1Y3QgdGhlIEhUVFAgaGVhZGVyCiAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBoOwotICBoIDw8Ci0gICAgIlBPU1QgIiA8PCBwYXRoXyA8PCAiIEhUVFAvMS4xIiA8PCBDUkxGIDw8Ci0gICAgIkhvc3Q6ICIgPDwgaG9zdF8gPDwgQ1JMRiA8PAotICAgICJDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtdGhyaWZ0IiA8PCBDUkxGIDw8Ci0gICAgIkNvbnRlbnQtTGVuZ3RoOiAiIDw8IGxlbiA8PCBDUkxGIDw8Ci0gICAgIkFjY2VwdDogYXBwbGljYXRpb24veC10aHJpZnQiIDw8IENSTEYgPDwKLSAgICAiVXNlci1BZ2VudDogVGhyaWZ0LyIgPDwgVkVSU0lPTiA8PCAiIChDKysvVEh0dHBDbGllbnQpIiA8PCBDUkxGIDw8Ci0gICAgQ1JMRjsKKyAgaCA8PCAiUE9TVCAiIDw8IHBhdGhfIDw8ICIgSFRUUC8xLjEiIDw8IENSTEYgPDwgIkhvc3Q6ICIgPDwgaG9zdF8gPDwgQ1JMRgorICAgIDw8ICJDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtdGhyaWZ0IiA8PCBDUkxGIDw8ICJDb250ZW50LUxlbmd0aDogIiA8PCBsZW4gPDwgQ1JMRgorICAgIDw8ICJBY2NlcHQ6IGFwcGxpY2F0aW9uL3gtdGhyaWZ0IiA8PCBDUkxGIDw8ICJVc2VyLUFnZW50OiBUaHJpZnQvIiA8PCBQQUNLQUdFX1ZFUlNJT04KKyAgICA8PCAiIChDKysvVEh0dHBDbGllbnQpIiA8PCBDUkxGIDw8IENSTEY7CiAgIHN0cmluZyBoZWFkZXIgPSBoLnN0cigpOwogCi0gIGlmKGhlYWRlci5zaXplKCkgPiAoc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCkoKSkKKyAgaWYgKGhlYWRlci5zaXplKCkgPiAoc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCkoKSkKICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJIZWFkZXIgdG9vIGJpZyIpOwogICAvLyBXcml0ZSB0aGUgaGVhZGVyLCB0aGVuIHRoZSBkYXRhLCB0aGVuIGZsdXNoCiAgIHRyYW5zcG9ydF8tPndyaXRlKChjb25zdCB1aW50OF90KiloZWFkZXIuY19zdHIoKSwgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGhlYWRlci5zaXplKCkpKTsKQEAgLTExMyw1ICsxMTgsNiBAQAogICB3cml0ZUJ1ZmZlcl8ucmVzZXRCdWZmZXIoKTsKICAgcmVhZEhlYWRlcnNfID0gdHJ1ZTsKIH0KLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cENsaWVudC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cENsaWVudC5oCmluZGV4IDA4OThiMTEuLmY0ZmIxMmEgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBDbGllbnQuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwQ2xpZW50LmgKQEAgLTIyLDI4ICsyMiwyOSBAQAogCiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9USHR0cFRyYW5zcG9ydC5oPgogCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0cmFuc3BvcnQgeworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgewogCiBjbGFzcyBUSHR0cENsaWVudCA6IHB1YmxpYyBUSHR0cFRyYW5zcG9ydCB7Ci0gcHVibGljOgotICBUSHR0cENsaWVudChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQsIHN0ZDo6c3RyaW5nIGhvc3QsIHN0ZDo6c3RyaW5nIHBhdGg9IiIpOworcHVibGljOgorICBUSHR0cENsaWVudChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0LCBzdGQ6OnN0cmluZyBob3N0LCBzdGQ6OnN0cmluZyBwYXRoID0gIiIpOwogCi0gIFRIdHRwQ2xpZW50KHN0ZDo6c3RyaW5nIGhvc3QsIGludCBwb3J0LCBzdGQ6OnN0cmluZyBwYXRoPSIiKTsKKyAgVEh0dHBDbGllbnQoc3RkOjpzdHJpbmcgaG9zdCwgaW50IHBvcnQsIHN0ZDo6c3RyaW5nIHBhdGggPSAiIik7CiAKICAgdmlydHVhbCB+VEh0dHBDbGllbnQoKTsKIAogICB2aXJ0dWFsIHZvaWQgZmx1c2goKTsKIAotIHByb3RlY3RlZDoKLQorcHJvdGVjdGVkOgogICBzdGQ6OnN0cmluZyBob3N0XzsKICAgc3RkOjpzdHJpbmcgcGF0aF87CiAKICAgdmlydHVhbCB2b2lkIHBhcnNlSGVhZGVyKGNoYXIqIGhlYWRlcik7CiAgIHZpcnR1YWwgYm9vbCBwYXJzZVN0YXR1c0xpbmUoY2hhciogc3RhdHVzKTsKLQogfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAogCiAjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9USFRUUENMSUVOVF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cFNlcnZlci5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwU2VydmVyLmNwcAppbmRleCA2MjBiYmQyLi45NmIyNDgwIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwU2VydmVyLmNwcAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwU2VydmVyLmNwcApAQCAtMjEsMTggKzIxLDM0IEBACiAjaW5jbHVkZSA8c3N0cmVhbT4KICNpbmNsdWRlIDxpb3N0cmVhbT4KIAorI2luY2x1ZGUgPHRocmlmdC9jb25maWcuaD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RIdHRwU2VydmVyLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0Lmg+CisjaWYgZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfX01JTkdXMzJfXykKKyAgI2luY2x1ZGUgPFNobHdhcGkuaD4KKyNlbmRpZgogCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0cmFuc3BvcnQgewordXNpbmcgc3RkOjpzdHJpbmc7CiAKLXVzaW5nIG5hbWVzcGFjZSBzdGQ7CituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CiAKLVRIdHRwU2VydmVyOjpUSHR0cFNlcnZlcihib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQpIDoKLSAgVEh0dHBUcmFuc3BvcnQodHJhbnNwb3J0KSB7CitUSHR0cFNlcnZlcjo6VEh0dHBTZXJ2ZXIoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCkgOiBUSHR0cFRyYW5zcG9ydCh0cmFuc3BvcnQpIHsKIH0KIAotVEh0dHBTZXJ2ZXI6On5USHR0cFNlcnZlcigpIHt9CitUSHR0cFNlcnZlcjo6flRIdHRwU2VydmVyKCkgeworfQorCisjaWYgZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfX01JTkdXMzJfXykKKyAgI2RlZmluZSBUSFJJRlRfR01USU1FKFRNLCBUSU1FKSAgICAgICAgICAgICBnbXRpbWVfcygmVE0sICZUSU1FKQorICAjZGVmaW5lIFRIUklGVF9zdHJuY2FzZWNtcChzdHIxLCBzdHIyLCBsZW4pIF9zdHJuaWNtcChzdHIxLCBzdHIyLCBsZW4pCisgICNkZWZpbmUgVEhSSUZUX3N0cmNhc2VzdHIoaGF5c3RhY2ssIG5lZWRsZSkgU3RyU3RySUEoaGF5c3RhY2ssIG5lZWRsZSkKKyNlbHNlCisgICNkZWZpbmUgVEhSSUZUX0dNVElNRShUTSwgVElNRSkgICAgICAgICAgICAgZ210aW1lX3IoJlRJTUUsICZUTSkKKyAgI2RlZmluZSBUSFJJRlRfc3RybmNhc2VjbXAoc3RyMSwgc3RyMiwgbGVuKSBzdHJuY2FzZWNtcChzdHIxLCBzdHIyLCBsZW4pCisgICNkZWZpbmUgVEhSSUZUX3N0cmNhc2VzdHIoaGF5c3RhY2ssIG5lZWRsZSkgc3RyY2FzZXN0cihoYXlzdGFjaywgbmVlZGxlKQorI2VuZGlmCiAKIHZvaWQgVEh0dHBTZXJ2ZXI6OnBhcnNlSGVhZGVyKGNoYXIqIGhlYWRlcikgewogICBjaGFyKiBjb2xvbiA9IHN0cmNocihoZWFkZXIsICc6Jyk7CkBAIC00MCwxMyArNTYsMTMgQEAKICAgICByZXR1cm47CiAgIH0KICAgc2l6ZV90IHN6ID0gY29sb24gLSBoZWFkZXI7Ci0gIGNoYXIqIHZhbHVlID0gY29sb24rMTsKKyAgY2hhciogdmFsdWUgPSBjb2xvbiArIDE7CiAKLSAgaWYgKHN0cm5jbXAoaGVhZGVyLCAiVHJhbnNmZXItRW5jb2RpbmciLCBzeikgPT0gMCkgewotICAgIGlmIChzdHJzdHIodmFsdWUsICJjaHVua2VkIikgIT0gTlVMTCkgeworICBpZiAoVEhSSUZUX3N0cm5jYXNlY21wKGhlYWRlciwgIlRyYW5zZmVyLUVuY29kaW5nIiwgc3opID09IDApIHsKKyAgICBpZiAoVEhSSUZUX3N0cmNhc2VzdHIodmFsdWUsICJjaHVua2VkIikgIT0gTlVMTCkgewogICAgICAgY2h1bmtlZF8gPSB0cnVlOwogICAgIH0KLSAgfSBlbHNlIGlmIChzdHJuY21wKGhlYWRlciwgIkNvbnRlbnQtTGVuZ3RoIiwgc3opID09IDApIHsKKyAgfSBlbHNlIGlmIChUSFJJRlRfc3RybmNhc2VjbXAoaGVhZGVyLCAiQ29udGVudC1sZW5ndGgiLCBzeikgPT0gMCkgewogICAgIGNodW5rZWRfID0gZmFsc2U7CiAgICAgY29udGVudExlbmd0aF8gPSBhdG9pKHZhbHVlKTsKICAgfSBlbHNlIGlmIChzdHJuY21wKGhlYWRlciwgIlgtRm9yd2FyZGVkLUZvciIsIHN6KSA9PSAwKSB7CkBAIC02Myw3ICs3OSw4IEBACiAgIH0KIAogICAqcGF0aCA9ICdcMCc7Ci0gIHdoaWxlICgqKCsrcGF0aCkgPT0gJyAnKSB7fTsKKyAgd2hpbGUgKCooKytwYXRoKSA9PSAnICcpIHsKKyAgfTsKIAogICBjaGFyKiBodHRwID0gc3RyY2hyKHBhdGgsICcgJyk7CiAgIGlmIChodHRwID09IE5VTEwpIHsKQEAgLTc0LDggKzkxLDcgQEAKICAgaWYgKHN0cmNtcChtZXRob2QsICJQT1NUIikgPT0gMCkgewogICAgIC8vIFBPU1QgbWV0aG9kIG9rLCBsb29raW5nIGZvciBjb250ZW50LgogICAgIHJldHVybiB0cnVlOwotICB9Ci0gIGVsc2UgaWYgKHN0cmNtcChtZXRob2QsICJPUFRJT05TIikgPT0gMCkgeworICB9IGVsc2UgaWYgKHN0cmNtcChtZXRob2QsICJPUFRJT05TIikgPT0gMCkgewogICAgIC8vIHByZWZsaWdodCBPUFRJT05TIG1ldGhvZCwgd2UgZG9uJ3QgbmVlZCBmdXJ0aGVyIGNvbnRlbnQuCiAgICAgLy8gaG93IHRvIGdyYWNpb3VzbHkgY2xvc2UgY29ubmVjdGlvbj8KICAgICB1aW50OF90KiBidWY7CkBAIC04NCwxMyArMTAwLDkgQEAKIAogICAgIC8vIENvbnN0cnVjdCB0aGUgSFRUUCBoZWFkZXIKICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gaDsKLSAgICBoIDw8Ci0gICAgICAiSFRUUC8xLjEgMjAwIE9LIiA8PCBDUkxGIDw8Ci0gICAgICAiRGF0ZTogIiA8PCBnZXRUaW1lUkZDMTEyMygpIDw8IENSTEYgPDwKLSAgICAgICJBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW46ICoiIDw8IENSTEYgPDwKLSAgICAgICJBY2Nlc3MtQ29udHJvbC1BbGxvdy1NZXRob2RzOiBQT1NULCBPUFRJT05TIiA8PCBDUkxGIDw8Ci0gICAgICAiQWNjZXNzLUNvbnRyb2wtQWxsb3ctSGVhZGVyczogQ29udGVudC1UeXBlIiA8PCBDUkxGIDw8Ci0gICAgICBDUkxGOworICAgIGggPDwgIkhUVFAvMS4xIDIwMCBPSyIgPDwgQ1JMRiA8PCAiRGF0ZTogIiA8PCBnZXRUaW1lUkZDMTEyMygpIDw8IENSTEYKKyAgICAgIDw8ICJBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW46ICoiIDw8IENSTEYgPDwgIkFjY2Vzcy1Db250cm9sLUFsbG93LU1ldGhvZHM6IFBPU1QsIE9QVElPTlMiCisgICAgICA8PCBDUkxGIDw8ICJBY2Nlc3MtQ29udHJvbC1BbGxvdy1IZWFkZXJzOiBDb250ZW50LVR5cGUiIDw8IENSTEYgPDwgQ1JMRjsKICAgICBzdHJpbmcgaGVhZGVyID0gaC5zdHIoKTsKIAogICAgIC8vIFdyaXRlIHRoZSBoZWFkZXIsIHRoZW4gdGhlIGRhdGEsIHRoZW4gZmx1c2gKQEAgLTExNCwxNSArMTI2LDEwIEBACiAKICAgLy8gQ29uc3RydWN0IHRoZSBIVFRQIGhlYWRlcgogICBzdGQ6Om9zdHJpbmdzdHJlYW0gaDsKLSAgaCA8PAotICAgICJIVFRQLzEuMSAyMDAgT0siIDw8IENSTEYgPDwKLSAgICAiRGF0ZTogIiA8PCBnZXRUaW1lUkZDMTEyMygpIDw8IENSTEYgPDwKLSAgICAiU2VydmVyOiBUaHJpZnQvIiA8PCBWRVJTSU9OIDw8IENSTEYgPDwKLSAgICAiQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luOiAqIiA8PCBDUkxGIDw8Ci0gICAgIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC10aHJpZnQiIDw8IENSTEYgPDwKLSAgICAiQ29udGVudC1MZW5ndGg6ICIgPDwgbGVuIDw8IENSTEYgPDwKLSAgICAiQ29ubmVjdGlvbjogS2VlcC1BbGl2ZSIgPDwgQ1JMRiA8PAotICAgIENSTEY7CisgIGggPDwgIkhUVFAvMS4xIDIwMCBPSyIgPDwgQ1JMRiA8PCAiRGF0ZTogIiA8PCBnZXRUaW1lUkZDMTEyMygpIDw8IENSTEYgPDwgIlNlcnZlcjogVGhyaWZ0LyIKKyAgICA8PCBQQUNLQUdFX1ZFUlNJT04gPDwgQ1JMRiA8PCAiQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luOiAqIiA8PCBDUkxGCisgICAgPDwgIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC10aHJpZnQiIDw8IENSTEYgPDwgIkNvbnRlbnQtTGVuZ3RoOiAiIDw8IGxlbiA8PCBDUkxGCisgICAgPDwgIkNvbm5lY3Rpb246IEtlZXAtQWxpdmUiIDw8IENSTEYgPDwgQ1JMRjsKICAgc3RyaW5nIGhlYWRlciA9IGguc3RyKCk7CiAKICAgLy8gV3JpdGUgdGhlIGhlYWRlciwgdGhlbiB0aGUgZGF0YSwgdGhlbiBmbHVzaApAQCAtMTM2LDE5ICsxNDMsMjcgQEAKICAgcmVhZEhlYWRlcnNfID0gdHJ1ZTsKIH0KIAotc3RkOjpzdHJpbmcgVEh0dHBTZXJ2ZXI6OmdldFRpbWVSRkMxMTIzKCkKLXsKLSAgc3RhdGljIGNvbnN0IGNoYXIqIERheXNbXSA9IHsiU3VuIiwiTW9uIiwiVHVlIiwiV2VkIiwiVGh1IiwiRnJpIiwiU2F0In07Ci0gIHN0YXRpYyBjb25zdCBjaGFyKiBNb250aHNbXSA9IHsiSmFuIiwiRmViIiwiTWFyIiwgIkFwciIsICJNYXkiLCAiSnVuIiwgIkp1bCIsIkF1ZyIsICJTZXAiLCAiT2N0IiwiTm92IiwiRGVjIn07CitzdGQ6OnN0cmluZyBUSHR0cFNlcnZlcjo6Z2V0VGltZVJGQzExMjMoKSB7CisgIHN0YXRpYyBjb25zdCBjaGFyKiBEYXlzW10gPSB7IlN1biIsICJNb24iLCAiVHVlIiwgIldlZCIsICJUaHUiLCAiRnJpIiwgIlNhdCJ9OworICBzdGF0aWMgY29uc3QgY2hhciogTW9udGhzW10KKyAgICAgID0geyJKYW4iLCAiRmViIiwgIk1hciIsICJBcHIiLCAiTWF5IiwgIkp1biIsICJKdWwiLCAiQXVnIiwgIlNlcCIsICJPY3QiLCAiTm92IiwgIkRlYyJ9OwogICBjaGFyIGJ1ZmZbMTI4XTsKLSAgdGltZV90IHQgPSB0aW1lKE5VTEwpOwotICB0bSogYnJva2VuX3QgPSBnbXRpbWUoJnQpOwogCi0gIHNwcmludGYoYnVmZiwiJXMsICVkICVzICVkICVkOiVkOiVkIEdNVCIsCi0gICAgICAgICAgRGF5c1ticm9rZW5fdC0+dG1fd2RheV0sIGJyb2tlbl90LT50bV9tZGF5LCBNb250aHNbYnJva2VuX3QtPnRtX21vbl0sCi0gICAgICAgICAgYnJva2VuX3QtPnRtX3llYXIgKyAxOTAwLAotICAgICAgICAgIGJyb2tlbl90LT50bV9ob3VyLGJyb2tlbl90LT50bV9taW4sYnJva2VuX3QtPnRtX3NlYyk7CisgIHRpbWVfdCB0ID0gdGltZShOVUxMKTsKKyAgc3RydWN0IHRtIHRtYjsKKyAgVEhSSUZUX0dNVElNRSh0bWIsIHQpOworCisgIHNwcmludGYoYnVmZiwKKyAgICAgICAgICAiJXMsICVkICVzICVkICVkOiVkOiVkIEdNVCIsCisgICAgICAgICAgRGF5c1t0bWIudG1fd2RheV0sCisgICAgICAgICAgdG1iLnRtX21kYXksCisgICAgICAgICAgTW9udGhzW3RtYi50bV9tb25dLAorICAgICAgICAgIHRtYi50bV95ZWFyICsgMTkwMCwKKyAgICAgICAgICB0bWIudG1faG91ciwKKyAgICAgICAgICB0bWIudG1fbWluLAorICAgICAgICAgIHRtYi50bV9zZWMpOwogICByZXR1cm4gc3RkOjpzdHJpbmcoYnVmZik7CiB9Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBTZXJ2ZXIuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBTZXJ2ZXIuaAppbmRleCBiZjY5ZGJlLi5jMzg2MDZmIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwU2VydmVyLmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cFNlcnZlci5oCkBAIC0yMiwzMCArMjIsMzAgQEAKIAogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEh0dHBUcmFuc3BvcnQuaD4KIAotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKIAogY2xhc3MgVEh0dHBTZXJ2ZXIgOiBwdWJsaWMgVEh0dHBUcmFuc3BvcnQgewotIHB1YmxpYzoKLSAgVEh0dHBTZXJ2ZXIoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0KTsKK3B1YmxpYzoKKyAgVEh0dHBTZXJ2ZXIoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCk7CiAKICAgdmlydHVhbCB+VEh0dHBTZXJ2ZXIoKTsKIAogICB2aXJ0dWFsIHZvaWQgZmx1c2goKTsKIAotIHByb3RlY3RlZDoKLQorcHJvdGVjdGVkOgogICB2b2lkIHJlYWRIZWFkZXJzKCk7CiAgIHZpcnR1YWwgdm9pZCBwYXJzZUhlYWRlcihjaGFyKiBoZWFkZXIpOwogICB2aXJ0dWFsIGJvb2wgcGFyc2VTdGF0dXNMaW5lKGNoYXIqIHN0YXR1cyk7CiAgIHN0ZDo6c3RyaW5nIGdldFRpbWVSRkMxMTIzKCk7Ci0KIH07CiAKIC8qKgogICogV3JhcHMgYSB0cmFuc3BvcnQgaW50byBIVFRQIHByb3RvY29sCiAgKi8KIGNsYXNzIFRIdHRwU2VydmVyVHJhbnNwb3J0RmFjdG9yeSA6IHB1YmxpYyBUVHJhbnNwb3J0RmFjdG9yeSB7Ci0gcHVibGljOgorcHVibGljOgogICBUSHR0cFNlcnZlclRyYW5zcG9ydEZhY3RvcnkoKSB7fQogCiAgIHZpcnR1YWwgflRIdHRwU2VydmVyVHJhbnNwb3J0RmFjdG9yeSgpIHt9CkBAIC01MywxMiArNTMsMTIgQEAKICAgLyoqCiAgICAqIFdyYXBzIHRoZSB0cmFuc3BvcnQgaW50byBhIGJ1ZmZlcmVkIG9uZS4KICAgICovCi0gIHZpcnR1YWwgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZ2V0VHJhbnNwb3J0KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKSB7Ci0gICAgcmV0dXJuIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+KG5ldyBUSHR0cFNlcnZlcih0cmFucykpOworICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRUcmFuc3BvcnQoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKSB7CisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PihuZXcgVEh0dHBTZXJ2ZXIodHJhbnMpKTsKICAgfQotCiB9OwotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CiAKICNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RIVFRQU0VSVkVSX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwVHJhbnNwb3J0LmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBUcmFuc3BvcnQuY3BwCmluZGV4IDc5ZWU3ZDUuLjZjY2MwMzQgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBUcmFuc3BvcnQuY3BwCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBUcmFuc3BvcnQuY3BwCkBAIC0yMSwzMSArMjEsMzMgQEAKIAogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEh0dHBUcmFuc3BvcnQuaD4KIAotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKK3VzaW5nIHN0ZDo6c3RyaW5nOwogCi11c2luZyBuYW1lc3BhY2Ugc3RkOworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgewogCiAvLyBZZWFoLCB5ZWFoLCBoYWNreSB0byBwdXQgdGhlc2UgaGVyZSwgSSBrbm93LgogY29uc3QgY2hhciogVEh0dHBUcmFuc3BvcnQ6OkNSTEYgPSAiXHJcbiI7CiBjb25zdCBpbnQgVEh0dHBUcmFuc3BvcnQ6OkNSTEZfTEVOID0gMjsKIAotVEh0dHBUcmFuc3BvcnQ6OlRIdHRwVHJhbnNwb3J0KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCkgOgotICB0cmFuc3BvcnRfKHRyYW5zcG9ydCksCi0gIG9yaWdpbl8oIiIpLAotICByZWFkSGVhZGVyc18odHJ1ZSksCi0gIGNodW5rZWRfKGZhbHNlKSwKLSAgY2h1bmtlZERvbmVfKGZhbHNlKSwKLSAgY2h1bmtTaXplXygwKSwKLSAgY29udGVudExlbmd0aF8oMCksCi0gIGh0dHBCdWZfKE5VTEwpLAotICBodHRwUG9zXygwKSwKLSAgaHR0cEJ1Zkxlbl8oMCksCi0gIGh0dHBCdWZTaXplXygxMDI0KSB7CitUSHR0cFRyYW5zcG9ydDo6VEh0dHBUcmFuc3BvcnQoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCkKKyAgOiB0cmFuc3BvcnRfKHRyYW5zcG9ydCksCisgICAgb3JpZ2luXygiIiksCisgICAgcmVhZEhlYWRlcnNfKHRydWUpLAorICAgIGNodW5rZWRfKGZhbHNlKSwKKyAgICBjaHVua2VkRG9uZV8oZmFsc2UpLAorICAgIGNodW5rU2l6ZV8oMCksCisgICAgY29udGVudExlbmd0aF8oMCksCisgICAgaHR0cEJ1Zl8oTlVMTCksCisgICAgaHR0cFBvc18oMCksCisgICAgaHR0cEJ1Zkxlbl8oMCksCisgICAgaHR0cEJ1ZlNpemVfKDEwMjQpIHsKICAgaW5pdCgpOwogfQogCiB2b2lkIFRIdHRwVHJhbnNwb3J0Ojppbml0KCkgewotICBodHRwQnVmXyA9IChjaGFyKilzdGQ6Om1hbGxvYyhodHRwQnVmU2l6ZV8rMSk7CisgIGh0dHBCdWZfID0gKGNoYXIqKXN0ZDo6bWFsbG9jKGh0dHBCdWZTaXplXyArIDEpOwogICBpZiAoaHR0cEJ1Zl8gPT0gTlVMTCkgewogICAgIHRocm93IHN0ZDo6YmFkX2FsbG9jKCk7CiAgIH0KQEAgLTgyLDggKzg0LDEwIEBACiB1aW50MzJfdCBUSHR0cFRyYW5zcG9ydDo6cmVhZE1vcmVEYXRhKCkgewogICB1aW50MzJfdCBzaXplOwogCi0gIC8vIEdldCBtb3JlIGRhdGEhCi0gIHJlZmlsbCgpOworICBpZiAoaHR0cFBvc18gPT0gaHR0cEJ1Zkxlbl8pIHsKKyAgICAvLyBHZXQgbW9yZSBkYXRhIQorICAgIHJlZmlsbCgpOworICB9CiAKICAgaWYgKHJlYWRIZWFkZXJzXykgewogICAgIHJlYWRIZWFkZXJzKCk7CkBAIC05Myw4ICs5Nyw5IEBACiAgICAgc2l6ZSA9IHJlYWRDaHVua2VkKCk7CiAgIH0gZWxzZSB7CiAgICAgc2l6ZSA9IHJlYWRDb250ZW50KGNvbnRlbnRMZW5ndGhfKTsKKyAgICByZWFkSGVhZGVyc18gPSB0cnVlOwogICB9Ci0gIHJlYWRIZWFkZXJzXyA9IHRydWU7CisKICAgcmV0dXJuIHNpemU7CiB9CiAKQEAgLTE1Miw3ICsxNTcsNyBAQAogICAgIGlmIChuZWVkIDwgZ2l2ZSkgewogICAgICAgZ2l2ZSA9IG5lZWQ7CiAgICAgfQotICAgIHJlYWRCdWZmZXJfLndyaXRlKCh1aW50OF90KikoaHR0cEJ1Zl8raHR0cFBvc18pLCBnaXZlKTsKKyAgICByZWFkQnVmZmVyXy53cml0ZSgodWludDhfdCopKGh0dHBCdWZfICsgaHR0cFBvc18pLCBnaXZlKTsKICAgICBodHRwUG9zXyArPSBnaXZlOwogICAgIG5lZWQgLT0gZ2l2ZTsKICAgfQpAQCAtMTYzLDcgKzE2OCw3IEBACiAgIHdoaWxlICh0cnVlKSB7CiAgICAgY2hhciogZW9sID0gTlVMTDsKIAotICAgIGVvbCA9IHN0cnN0cihodHRwQnVmXytodHRwUG9zXywgQ1JMRik7CisgICAgZW9sID0gc3Ryc3RyKGh0dHBCdWZfICsgaHR0cFBvc18sIENSTEYpOwogCiAgICAgLy8gTm8gQ1JMRiB5ZXQ/CiAgICAgaWYgKGVvbCA9PSBOVUxMKSB7CkBAIC0xNzMsMTkgKzE3OCwxOCBAQAogICAgIH0gZWxzZSB7CiAgICAgICAvLyBSZXR1cm4gcG9pbnRlciB0byBuZXh0IGxpbmUKICAgICAgICplb2wgPSAnXDAnOwotICAgICAgY2hhciogbGluZSA9IGh0dHBCdWZfK2h0dHBQb3NfOwotICAgICAgaHR0cFBvc18gPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oKGVvbC1odHRwQnVmXykgKyBDUkxGX0xFTik7CisgICAgICBjaGFyKiBsaW5lID0gaHR0cEJ1Zl8gKyBodHRwUG9zXzsKKyAgICAgIGh0dHBQb3NfID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KChlb2wgLSBodHRwQnVmXykgKyBDUkxGX0xFTik7CiAgICAgICByZXR1cm4gbGluZTsKICAgICB9CiAgIH0KLQogfQogCiB2b2lkIFRIdHRwVHJhbnNwb3J0OjpzaGlmdCgpIHsKICAgaWYgKGh0dHBCdWZMZW5fID4gaHR0cFBvc18pIHsKICAgICAvLyBTaGlmdCBkb3duIHJlbWFpbmluZyBkYXRhIGFuZCByZWFkIG1vcmUKICAgICB1aW50MzJfdCBsZW5ndGggPSBodHRwQnVmTGVuXyAtIGh0dHBQb3NfOwotICAgIG1lbW1vdmUoaHR0cEJ1Zl8sIGh0dHBCdWZfK2h0dHBQb3NfLCBsZW5ndGgpOworICAgIG1lbW1vdmUoaHR0cEJ1Zl8sIGh0dHBCdWZfICsgaHR0cFBvc18sIGxlbmd0aCk7CiAgICAgaHR0cEJ1Zkxlbl8gPSBsZW5ndGg7CiAgIH0gZWxzZSB7CiAgICAgaHR0cEJ1Zkxlbl8gPSAwOwpAQCAtMTk4LDE5ICsyMDIsMjAgQEAKICAgdWludDMyX3QgYXZhaWwgPSBodHRwQnVmU2l6ZV8gLSBodHRwQnVmTGVuXzsKICAgaWYgKGF2YWlsIDw9IChodHRwQnVmU2l6ZV8gLyA0KSkgewogICAgIGh0dHBCdWZTaXplXyAqPSAyOwotICAgIGh0dHBCdWZfID0gKGNoYXIqKXN0ZDo6cmVhbGxvYyhodHRwQnVmXywgaHR0cEJ1ZlNpemVfKzEpOwotICAgIGlmIChodHRwQnVmXyA9PSBOVUxMKSB7CisgICAgY2hhciogdG1wQnVmID0gKGNoYXIqKXN0ZDo6cmVhbGxvYyhodHRwQnVmXywgaHR0cEJ1ZlNpemVfICsgMSk7CisgICAgaWYgKHRtcEJ1ZiA9PSBOVUxMKSB7CiAgICAgICB0aHJvdyBzdGQ6OmJhZF9hbGxvYygpOwogICAgIH0KKyAgICBodHRwQnVmXyA9IHRtcEJ1ZjsKICAgfQogCiAgIC8vIFJlYWQgbW9yZSBkYXRhCi0gIHVpbnQzMl90IGdvdCA9IHRyYW5zcG9ydF8tPnJlYWQoKHVpbnQ4X3QqKShodHRwQnVmXytodHRwQnVmTGVuXyksIGh0dHBCdWZTaXplXy1odHRwQnVmTGVuXyk7CisgIHVpbnQzMl90IGdvdCA9IHRyYW5zcG9ydF8tPnJlYWQoKHVpbnQ4X3QqKShodHRwQnVmXyArIGh0dHBCdWZMZW5fKSwgaHR0cEJ1ZlNpemVfIC0gaHR0cEJ1Zkxlbl8pOwogICBodHRwQnVmTGVuXyArPSBnb3Q7CiAgIGh0dHBCdWZfW2h0dHBCdWZMZW5fXSA9ICdcMCc7CiAKICAgaWYgKGdvdCA9PSAwKSB7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQ291bGQgbm90IHJlZmlsbCBidWZmZXIiKTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkVORF9PRl9GSUxFLCAiQ291bGQgbm90IHJlZmlsbCBidWZmZXIiKTsKICAgfQogfQogCkBAIC0yNTQsMTEgKzI1OSwxMiBAQAogCiBjb25zdCBzdGQ6OnN0cmluZyBUSHR0cFRyYW5zcG9ydDo6Z2V0T3JpZ2luKCkgewogICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOwotICBpZiAoICFvcmlnaW5fLmVtcHR5KCkpIHsKKyAgaWYgKCFvcmlnaW5fLmVtcHR5KCkpIHsKICAgICBvc3MgPDwgb3JpZ2luXyA8PCAiLCAiOwogICB9CiAgIG9zcyA8PCB0cmFuc3BvcnRfLT5nZXRPcmlnaW4oKTsKICAgcmV0dXJuIG9zcy5zdHIoKTsKIH0KLQotfX19Cit9Cit9Cit9CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwVHJhbnNwb3J0LmggYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwVHJhbnNwb3J0LmgKaW5kZXggODk2N2M3NC4uZTQ2YWI3ZiAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cFRyYW5zcG9ydC5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBUcmFuc3BvcnQuaApAQCAtMjMsNyArMjMsOSBAQAogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RWaXJ0dWFsVHJhbnNwb3J0Lmg+CiAKLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHRyYW5zcG9ydCB7CituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CiAKIC8qKgogICogSFRUUCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgdGhyaWZ0IHRyYW5zcG9ydC4gVGhpcyB3YXMgaXJyaXRhdGluZwpAQCAtMzMsMjYgKzM1LDE4IEBACiAgKiBjaHVua2VkIHRyYW5zZmVyIGVuY29kaW5nLCBrZWVwYWxpdmUsIGV0Yy4gVGVzdGVkIGFnYWluc3QgQXBhY2hlLgogICovCiBjbGFzcyBUSHR0cFRyYW5zcG9ydCA6IHB1YmxpYyBUVmlydHVhbFRyYW5zcG9ydDxUSHR0cFRyYW5zcG9ydD4gewotIHB1YmxpYzoKLSAgVEh0dHBUcmFuc3BvcnQoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0KTsKK3B1YmxpYzoKKyAgVEh0dHBUcmFuc3BvcnQoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCk7CiAKICAgdmlydHVhbCB+VEh0dHBUcmFuc3BvcnQoKTsKIAotICB2b2lkIG9wZW4oKSB7Ci0gICAgdHJhbnNwb3J0Xy0+b3BlbigpOwotICB9CisgIHZvaWQgb3BlbigpIHsgdHJhbnNwb3J0Xy0+b3BlbigpOyB9CiAKLSAgYm9vbCBpc09wZW4oKSB7Ci0gICAgcmV0dXJuIHRyYW5zcG9ydF8tPmlzT3BlbigpOwotICB9CisgIGJvb2wgaXNPcGVuKCkgeyByZXR1cm4gdHJhbnNwb3J0Xy0+aXNPcGVuKCk7IH0KIAotICBib29sIHBlZWsoKSB7Ci0gICAgcmV0dXJuIHRyYW5zcG9ydF8tPnBlZWsoKTsKLSAgfQorICBib29sIHBlZWsoKSB7IHJldHVybiB0cmFuc3BvcnRfLT5wZWVrKCk7IH0KIAotICB2b2lkIGNsb3NlKCkgewotICAgIHRyYW5zcG9ydF8tPmNsb3NlKCk7Ci0gIH0KKyAgdm9pZCBjbG9zZSgpIHsgdHJhbnNwb3J0Xy0+Y2xvc2UoKTsgfQogCiAgIHVpbnQzMl90IHJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOwogCkBAIC02NCw5ICs1OCw4IEBACiAKICAgdmlydHVhbCBjb25zdCBzdGQ6OnN0cmluZyBnZXRPcmlnaW4oKTsKIAotIHByb3RlY3RlZDoKLQotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnRfOworcHJvdGVjdGVkOgorICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0XzsKICAgc3RkOjpzdHJpbmcgb3JpZ2luXzsKIAogICBUTWVtb3J5QnVmZmVyIHdyaXRlQnVmZmVyXzsKQEAgLTEwNCw3ICs5Nyw4IEBACiAgIHN0YXRpYyBjb25zdCBjaGFyKiBDUkxGOwogICBzdGF0aWMgY29uc3QgaW50IENSTEZfTEVOOwogfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAogCiAjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9USFRUUENMSUVOVF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkZWM1ZDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NTTFNlcnZlclNvY2tldC5jcHAKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTU0xTb2NrZXQuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworCisvKioKKyAqIE5vbmJsb2NraW5nIFNTTCBzZXJ2ZXIgc29ja2V0IGltcGxlbWVudGF0aW9uLgorICovCitUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQ6OlROb25ibG9ja2luZ1NTTFNlcnZlclNvY2tldChpbnQgcG9ydCwgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBmYWN0b3J5KQorICA6IFROb25ibG9ja2luZ1NlcnZlclNvY2tldChwb3J0KSwgZmFjdG9yeV8oZmFjdG9yeSkgeworICBmYWN0b3J5Xy0+c2VydmVyKHRydWUpOworfQorCitUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQ6OlROb25ibG9ja2luZ1NTTFNlcnZlclNvY2tldChjb25zdCBzdGQ6OnN0cmluZyYgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gZmFjdG9yeSkKKyAgOiBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQoYWRkcmVzcywgcG9ydCksIGZhY3RvcnlfKGZhY3RvcnkpIHsKKyAgZmFjdG9yeV8tPnNlcnZlcih0cnVlKTsKK30KKworVE5vbmJsb2NraW5nU1NMU2VydmVyU29ja2V0OjpUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQoaW50IHBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZW5kVGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlY3ZUaW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IGZhY3RvcnkpCisgIDogVE5vbmJsb2NraW5nU2VydmVyU29ja2V0KHBvcnQsIHNlbmRUaW1lb3V0LCByZWN2VGltZW91dCksIGZhY3RvcnlfKGZhY3RvcnkpIHsKKyAgZmFjdG9yeV8tPnNlcnZlcih0cnVlKTsKK30KKworc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+IFROb25ibG9ja2luZ1NTTFNlcnZlclNvY2tldDo6Y3JlYXRlU29ja2V0KFRIUklGVF9TT0NLRVQgY2xpZW50KSB7CisgIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiB0U1NMU29ja2V0OworICB0U1NMU29ja2V0ID0gZmFjdG9yeV8tPmNyZWF0ZVNvY2tldChjbGllbnQpOworICB0U1NMU29ja2V0LT5zZXRMaWJldmVudFNhZmUoKTsKKyAgcmV0dXJuIHRTU0xTb2NrZXQ7Cit9Cit9Cit9Cit9CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NTTFNlcnZlclNvY2tldC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTVjNDA1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQuaApAQCAtMCwwICsxLDc2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVE5PTkJMT0NLSU5HU1NMU0VSVkVSU09DS0VUX0hfCisjZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1ROT05CTE9DS0lOR1NTTFNFUlZFUlNPQ0tFVF9IXyAxCisKKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NlcnZlclNvY2tldC5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CisKK2NsYXNzIFRTU0xTb2NrZXRGYWN0b3J5OworCisvKioKKyAqIE5vbmJsb2NraW5nIFNlcnZlciBzb2NrZXQgdGhhdCBhY2NlcHRzIFNTTCBjb25uZWN0aW9ucy4KKyAqLworY2xhc3MgVE5vbmJsb2NraW5nU1NMU2VydmVyU29ja2V0IDogcHVibGljIFROb25ibG9ja2luZ1NlcnZlclNvY2tldCB7CitwdWJsaWM6CisgIC8qKgorICAgKiBDb25zdHJ1Y3Rvci4gIEJpbmRzIHRvIGFsbCBpbnRlcmZhY2VzLgorICAgKgorICAgKiBAcGFyYW0gcG9ydCAgICBMaXN0ZW5pbmcgcG9ydAorICAgKiBAcGFyYW0gZmFjdG9yeSBTU0wgc29ja2V0IGZhY3RvcnkgaW1wbGVtZW50YXRpb24KKyAgICovCisgIFROb25ibG9ja2luZ1NTTFNlcnZlclNvY2tldChpbnQgcG9ydCwgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBmYWN0b3J5KTsKKworICAvKioKKyAgICogQ29uc3RydWN0b3IuICBCaW5kcyB0byB0aGUgc3BlY2lmaWVkIGFkZHJlc3MuCisgICAqCisgICAqIEBwYXJhbSBhZGRyZXNzIEFkZHJlc3MgdG8gYmluZCB0bworICAgKiBAcGFyYW0gcG9ydCAgICBMaXN0ZW5pbmcgcG9ydAorICAgKiBAcGFyYW0gZmFjdG9yeSBTU0wgc29ja2V0IGZhY3RvcnkgaW1wbGVtZW50YXRpb24KKyAgICovCisgIFROb25ibG9ja2luZ1NTTFNlcnZlclNvY2tldChjb25zdCBzdGQ6OnN0cmluZyYgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICBpbnQgcG9ydCwKKyAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IGZhY3RvcnkpOworCisgIC8qKgorICAgKiBDb25zdHJ1Y3Rvci4gIEJpbmRzIHRvIGFsbCBpbnRlcmZhY2VzLgorICAgKgorICAgKiBAcGFyYW0gcG9ydCAgICAgICAgTGlzdGVuaW5nIHBvcnQKKyAgICogQHBhcmFtIHNlbmRUaW1lb3V0IFNvY2tldCBzZW5kIHRpbWVvdXQKKyAgICogQHBhcmFtIHJlY3ZUaW1lb3V0IFNvY2tldCByZWNlaXZlIHRpbWVvdXQKKyAgICogQHBhcmFtIGZhY3RvcnkgICAgIFNTTCBzb2NrZXQgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbgorICAgKi8KKyAgVE5vbmJsb2NraW5nU1NMU2VydmVyU29ja2V0KGludCBwb3J0LAorICAgICAgICAgICAgICAgICAgIGludCBzZW5kVGltZW91dCwKKyAgICAgICAgICAgICAgICAgICBpbnQgcmVjdlRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBmYWN0b3J5KTsKKworcHJvdGVjdGVkOgorICBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gY3JlYXRlU29ja2V0KFRIUklGVF9TT0NLRVQgc29ja2V0KTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBmYWN0b3J5XzsKK307Cit9Cit9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkMzRjY2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NlcnZlclNvY2tldC5jcHAKQEAgLTAsMCArMSw1NDggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC90aHJpZnQtY29uZmlnLmg+CisKKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpZmRlZiBIQVZFX1NZU19TT0NLRVRfSAorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfU1lTX1VOX0gKKyNpbmNsdWRlIDxzeXMvdW4uaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfU1lTX1BPTExfSAorI2luY2x1ZGUgPHN5cy9wb2xsLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX05FVElORVRfSU5fSAorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxuZXRpbmV0L3RjcC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9ORVREQl9ICisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaWZkZWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NlcnZlclNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvUGxhdGZvcm1Tb2NrZXQuaD4KKworI2lmbmRlZiBBRl9MT0NBTAorI2RlZmluZSBBRl9MT0NBTCBBRl9VTklYCisjZW5kaWYKKworI2lmbmRlZiBTT0NLT1BUX0NBU1RfVAorI2lmbmRlZiBfV0lOMzIKKyNkZWZpbmUgU09DS09QVF9DQVNUX1Qgdm9pZAorI2Vsc2UKKyNkZWZpbmUgU09DS09QVF9DQVNUX1QgY2hhcgorI2VuZGlmIC8vIF9XSU4zMgorI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBUPgoraW5saW5lIGNvbnN0IFNPQ0tPUFRfQ0FTVF9UKiBjb25zdF9jYXN0X3NvY2tvcHQoY29uc3QgVCogdikgeworICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBTT0NLT1BUX0NBU1RfVCo+KHYpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2lubGluZSBTT0NLT1BUX0NBU1RfVCogY2FzdF9zb2Nrb3B0KFQqIHYpIHsKKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8U09DS09QVF9DQVNUX1QqPih2KTsKK30KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworCit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKKworVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjpUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQoaW50IHBvcnQpCisgIDogcG9ydF8ocG9ydCksCisgICAgbGlzdGVuUG9ydF8ocG9ydCksCisgICAgc2VydmVyU29ja2V0XyhUSFJJRlRfSU5WQUxJRF9TT0NLRVQpLAorICAgIGFjY2VwdEJhY2tsb2dfKERFRkFVTFRfQkFDS0xPRyksCisgICAgc2VuZFRpbWVvdXRfKDApLAorICAgIHJlY3ZUaW1lb3V0XygwKSwKKyAgICByZXRyeUxpbWl0XygwKSwKKyAgICByZXRyeURlbGF5XygwKSwKKyAgICB0Y3BTZW5kQnVmZmVyXygwKSwKKyAgICB0Y3BSZWN2QnVmZmVyXygwKSwKKyAgICBrZWVwQWxpdmVfKGZhbHNlKSwKKyAgICBsaXN0ZW5pbmdfKGZhbHNlKSB7Cit9CisKK1ROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6VE5vbmJsb2NraW5nU2VydmVyU29ja2V0KGludCBwb3J0LCBpbnQgc2VuZFRpbWVvdXQsIGludCByZWN2VGltZW91dCkKKyAgOiBwb3J0Xyhwb3J0KSwKKyAgICBsaXN0ZW5Qb3J0Xyhwb3J0KSwKKyAgICBzZXJ2ZXJTb2NrZXRfKFRIUklGVF9JTlZBTElEX1NPQ0tFVCksCisgICAgYWNjZXB0QmFja2xvZ18oREVGQVVMVF9CQUNLTE9HKSwKKyAgICBzZW5kVGltZW91dF8oc2VuZFRpbWVvdXQpLAorICAgIHJlY3ZUaW1lb3V0XyhyZWN2VGltZW91dCksCisgICAgcmV0cnlMaW1pdF8oMCksCisgICAgcmV0cnlEZWxheV8oMCksCisgICAgdGNwU2VuZEJ1ZmZlcl8oMCksCisgICAgdGNwUmVjdkJ1ZmZlcl8oMCksCisgICAga2VlcEFsaXZlXyhmYWxzZSksCisgICAgbGlzdGVuaW5nXyhmYWxzZSkgeworfQorCitUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6OlROb25ibG9ja2luZ1NlcnZlclNvY2tldChjb25zdCBzdHJpbmcmIGFkZHJlc3MsIGludCBwb3J0KQorICA6IHBvcnRfKHBvcnQpLAorICAgIGxpc3RlblBvcnRfKHBvcnQpLAorICAgIGFkZHJlc3NfKGFkZHJlc3MpLAorICAgIHNlcnZlclNvY2tldF8oVEhSSUZUX0lOVkFMSURfU09DS0VUKSwKKyAgICBhY2NlcHRCYWNrbG9nXyhERUZBVUxUX0JBQ0tMT0cpLAorICAgIHNlbmRUaW1lb3V0XygwKSwKKyAgICByZWN2VGltZW91dF8oMCksCisgICAgcmV0cnlMaW1pdF8oMCksCisgICAgcmV0cnlEZWxheV8oMCksCisgICAgdGNwU2VuZEJ1ZmZlcl8oMCksCisgICAgdGNwUmVjdkJ1ZmZlcl8oMCksCisgICAga2VlcEFsaXZlXyhmYWxzZSksCisgICAgbGlzdGVuaW5nXyhmYWxzZSkgeworfQorCitUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6OlROb25ibG9ja2luZ1NlcnZlclNvY2tldChjb25zdCBzdHJpbmcmIHBhdGgpCisgIDogcG9ydF8oMCksCisgICAgbGlzdGVuUG9ydF8oMCksCisgICAgcGF0aF8ocGF0aCksCisgICAgc2VydmVyU29ja2V0XyhUSFJJRlRfSU5WQUxJRF9TT0NLRVQpLAorICAgIGFjY2VwdEJhY2tsb2dfKERFRkFVTFRfQkFDS0xPRyksCisgICAgc2VuZFRpbWVvdXRfKDApLAorICAgIHJlY3ZUaW1lb3V0XygwKSwKKyAgICByZXRyeUxpbWl0XygwKSwKKyAgICByZXRyeURlbGF5XygwKSwKKyAgICB0Y3BTZW5kQnVmZmVyXygwKSwKKyAgICB0Y3BSZWN2QnVmZmVyXygwKSwKKyAgICBrZWVwQWxpdmVfKGZhbHNlKSwKKyAgICBsaXN0ZW5pbmdfKGZhbHNlKSB7Cit9CisKK1ROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6flROb25ibG9ja2luZ1NlcnZlclNvY2tldCgpIHsKKyAgY2xvc2UoKTsKK30KKwordm9pZCBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6OnNldFNlbmRUaW1lb3V0KGludCBzZW5kVGltZW91dCkgeworICBzZW5kVGltZW91dF8gPSBzZW5kVGltZW91dDsKK30KKwordm9pZCBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6OnNldFJlY3ZUaW1lb3V0KGludCByZWN2VGltZW91dCkgeworICByZWN2VGltZW91dF8gPSByZWN2VGltZW91dDsKK30KKwordm9pZCBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6OnNldEFjY2VwdEJhY2tsb2coaW50IGFjY0JhY2tsb2cpIHsKKyAgYWNjZXB0QmFja2xvZ18gPSBhY2NCYWNrbG9nOworfQorCit2b2lkIFROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6c2V0UmV0cnlMaW1pdChpbnQgcmV0cnlMaW1pdCkgeworICByZXRyeUxpbWl0XyA9IHJldHJ5TGltaXQ7Cit9CisKK3ZvaWQgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjpzZXRSZXRyeURlbGF5KGludCByZXRyeURlbGF5KSB7CisgIHJldHJ5RGVsYXlfID0gcmV0cnlEZWxheTsKK30KKwordm9pZCBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6OnNldFRjcFNlbmRCdWZmZXIoaW50IHRjcFNlbmRCdWZmZXIpIHsKKyAgdGNwU2VuZEJ1ZmZlcl8gPSB0Y3BTZW5kQnVmZmVyOworfQorCit2b2lkIFROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6c2V0VGNwUmVjdkJ1ZmZlcihpbnQgdGNwUmVjdkJ1ZmZlcikgeworICB0Y3BSZWN2QnVmZmVyXyA9IHRjcFJlY3ZCdWZmZXI7Cit9CisKK3ZvaWQgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjpsaXN0ZW4oKSB7CisgIGxpc3RlbmluZ18gPSB0cnVlOworI2lmZGVmIF9XSU4zMgorICBUV2luc29ja1NpbmdsZXRvbjo6Y3JlYXRlKCk7CisjZW5kaWYgLy8gX1dJTjMyCisgIAorICAvLyBWYWxpZGF0ZSBwb3J0IG51bWJlcgorICBpZiAocG9ydF8gPCAwIHx8IHBvcnRfID4gMHhGRkZGKSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpCQURfQVJHUywgIlNwZWNpZmllZCBwb3J0IGlzIGludmFsaWQiKTsKKyAgfQorCisgIGNvbnN0IHN0cnVjdCBhZGRyaW5mbyAqcmVzOworICBpbnQgZXJyb3I7CisgIGNoYXIgcG9ydFtzaXplb2YoIjY1NTM1IildOworICBUSFJJRlRfU05QUklOVEYocG9ydCwgc2l6ZW9mKHBvcnQpLCAiJWQiLCBwb3J0Xyk7CisKKyAgc3RydWN0IGFkZHJpbmZvIGhpbnRzOworICBzdGQ6Om1lbXNldCgmaGludHMsIDAsIHNpemVvZihoaW50cykpOworICBoaW50cy5haV9mYW1pbHkgPSBQRl9VTlNQRUM7CisgIGhpbnRzLmFpX3NvY2t0eXBlID0gU09DS19TVFJFQU07CisgIGhpbnRzLmFpX2ZsYWdzID0gQUlfUEFTU0lWRSB8IEFJX0FERFJDT05GSUc7CisKKyAgLy8gSWYgYWRkcmVzcyBpcyBub3Qgc3BlY2lmaWVkIHVzZSB3aWxkY2FyZCBhZGRyZXNzIChOVUxMKQorICBUR2V0QWRkckluZm9XcmFwcGVyIGluZm8oYWRkcmVzc18uZW1wdHkoKSA/IE5VTEwgOiAmYWRkcmVzc19bMF0sIHBvcnQsICZoaW50cyk7CisKKyAgZXJyb3IgPSBpbmZvLmluaXQoKTsKKyAgaWYgKGVycm9yKSB7CisgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiZ2V0YWRkcmluZm8gJWQ6ICVzIiwgZXJyb3IsIFRIUklGVF9HQUlfU1RSRVJST1IoZXJyb3IpKTsKKyAgICBjbG9zZSgpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IHJlc29sdmUgaG9zdCBmb3Igc2VydmVyIHNvY2tldC4iKTsKKyAgfQorCisgIC8vIFBpY2sgdGhlIGlwdjYgYWRkcmVzcyBmaXJzdCBzaW5jZSBpcHY0IGFkZHJlc3NlcyBjYW4gYmUgbWFwcGVkCisgIC8vIGludG8gaXB2NiBzcGFjZS4KKyAgZm9yIChyZXMgPSBpbmZvLnJlcygpOyByZXM7IHJlcyA9IHJlcy0+YWlfbmV4dCkgeworICAgIGlmIChyZXMtPmFpX2ZhbWlseSA9PSBBRl9JTkVUNiB8fCByZXMtPmFpX25leHQgPT0gTlVMTCkKKyAgICAgIGJyZWFrOworICB9CisKKyAgaWYgKCFwYXRoXy5lbXB0eSgpKSB7CisgICAgc2VydmVyU29ja2V0XyA9IHNvY2tldChQRl9VTklYLCBTT0NLX1NUUkVBTSwgSVBQUk9UT19JUCk7CisgIH0gZWxzZSBpZiAocmVzICE9IE5VTEwpIHsKKyAgICBzZXJ2ZXJTb2NrZXRfID0gc29ja2V0KHJlcy0+YWlfZmFtaWx5LCByZXMtPmFpX3NvY2t0eXBlLCByZXMtPmFpX3Byb3RvY29sKTsKKyAgfQorCisgIGlmIChzZXJ2ZXJTb2NrZXRfID09IFRIUklGVF9JTlZBTElEX1NPQ0tFVCkgeworICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBzb2NrZXQoKSAiLCBlcnJub19jb3B5KTsKKyAgICBjbG9zZSgpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGNyZWF0ZSBzZXJ2ZXIgc29ja2V0LiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKKyAgfQorCisgIC8vIFNldCBUSFJJRlRfTk9fU09DS0VUX0NBQ0hJTkcgdG8gcHJldmVudCAyTVNMIGRlbGF5IG9uIGFjY2VwdAorICBpbnQgb25lID0gMTsKKyAgaWYgKC0xID09IHNldHNvY2tvcHQoc2VydmVyU29ja2V0XywKKyAgICAgICAgICAgICAgICAgICAgICAgU09MX1NPQ0tFVCwKKyAgICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX05PX1NPQ0tFVF9DQUNISU5HLAorICAgICAgICAgICAgICAgICAgICAgICBjYXN0X3NvY2tvcHQoJm9uZSksCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvbmUpKSkgeworLy8gaWdub3JlIGVycm9ycyBjb21pbmcgb3V0IG9mIHRoaXMgc2V0c29ja29wdCBvbiBXaW5kb3dzLiAgVGhpcyBpcyBiZWNhdXNlCisvLyBTT19FWENMVVNJVkVBRERSVVNFIHJlcXVpcmVzIGFkbWluIHByaXZpbGVnZXMgb24gV2luWFAsIGJ1dCB3ZSBkb24ndAorLy8gd2FudCB0byBmb3JjZSBzZXJ2ZXJzIHRvIGJlIGFuIGFkbWluLgorI2lmbmRlZiBfV0lOMzIKKyAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6bGlzdGVuKCkgc2V0c29ja29wdCgpIFRIUklGVF9OT19TT0NLRVRfQ0FDSElORyAiLAorICAgICAgICAgICAgICAgICAgICAgICAgZXJybm9fY29weSk7CisgICAgY2xvc2UoKTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBzZXQgVEhSSUZUX05PX1NPQ0tFVF9DQUNISU5HIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vX2NvcHkpOworI2VuZGlmCisgIH0KKworICAvLyBTZXQgVENQIGJ1ZmZlciBzaXplcworICBpZiAodGNwU2VuZEJ1ZmZlcl8gPiAwKSB7CisgICAgaWYgKC0xID09IHNldHNvY2tvcHQoc2VydmVyU29ja2V0XywKKyAgICAgICAgICAgICAgICAgICAgICAgICBTT0xfU09DS0VULAorICAgICAgICAgICAgICAgICAgICAgICAgIFNPX1NOREJVRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0X3NvY2tvcHQoJnRjcFNlbmRCdWZmZXJfKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodGNwU2VuZEJ1ZmZlcl8pKSkgeworICAgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6bGlzdGVuKCkgc2V0c29ja29wdCgpIFNPX1NOREJVRiAiLCBlcnJub19jb3B5KTsKKyAgICAgIGNsb3NlKCk7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IHNldCBTT19TTkRCVUYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKKyAgICB9CisgIH0KKworICBpZiAodGNwUmVjdkJ1ZmZlcl8gPiAwKSB7CisgICAgaWYgKC0xID09IHNldHNvY2tvcHQoc2VydmVyU29ja2V0XywKKyAgICAgICAgICAgICAgICAgICAgICAgICBTT0xfU09DS0VULAorICAgICAgICAgICAgICAgICAgICAgICAgIFNPX1JDVkJVRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0X3NvY2tvcHQoJnRjcFJlY3ZCdWZmZXJfKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodGNwUmVjdkJ1ZmZlcl8pKSkgeworICAgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6bGlzdGVuKCkgc2V0c29ja29wdCgpIFNPX1JDVkJVRiAiLCBlcnJub19jb3B5KTsKKyAgICAgIGNsb3NlKCk7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IHNldCBTT19SQ1ZCVUYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKKyAgICB9CisgIH0KKworI2lmZGVmIElQVjZfVjZPTkxZCisgIGlmIChyZXMtPmFpX2ZhbWlseSA9PSBBRl9JTkVUNiAmJiBwYXRoXy5lbXB0eSgpKSB7CisgICAgaW50IHplcm8gPSAwOworICAgIGlmICgtMSA9PSBzZXRzb2Nrb3B0KHNlcnZlclNvY2tldF8sCisgICAgICAgICAgICAgICAgICAgICAgICAgSVBQUk9UT19JUFY2LAorICAgICAgICAgICAgICAgICAgICAgICAgIElQVjZfVjZPTkxZLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNhc3Rfc29ja29wdCgmemVybyksCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHplcm8pKSkgeworICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBJUFY2X1Y2T05MWSAiLCBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUik7CisgICAgfQorICB9CisjZW5kaWYgLy8gI2lmZGVmIElQVjZfVjZPTkxZCisKKyAgLy8gVHVybiBsaW5nZXIgb2ZmLCBkb24ndCB3YW50IHRvIGJsb2NrIG9uIGNhbGxzIHRvIGNsb3NlCisgIHN0cnVjdCBsaW5nZXIgbGluZyA9IHswLCAwfTsKKyAgaWYgKC0xID09IHNldHNvY2tvcHQoc2VydmVyU29ja2V0XywgU09MX1NPQ0tFVCwgU09fTElOR0VSLCBjYXN0X3NvY2tvcHQoJmxpbmcpLCBzaXplb2YobGluZykpKSB7CisgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIHNldHNvY2tvcHQoKSBTT19MSU5HRVIgIiwgZXJybm9fY29weSk7CisgICAgY2xvc2UoKTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiQ291bGQgbm90IHNldCBTT19MSU5HRVIiLCBlcnJub19jb3B5KTsKKyAgfQorCisgIC8vIEtlZXBhbGl2ZSB0byBlbnN1cmUgZnVsbCByZXN1bHQgZmx1c2hpbmcKKyAgaWYgKC0xID09IHNldHNvY2tvcHQoc2VydmVyU29ja2V0XywgU09MX1NPQ0tFVCwgU09fS0VFUEFMSVZFLCBjb25zdF9jYXN0X3NvY2tvcHQoJm9uZSksIHNpemVvZihvbmUpKSkgeworICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBzZXRzb2Nrb3B0KCkgU09fS0VFUEFMSVZFICIsIGVycm5vX2NvcHkpOworICAgIGNsb3NlKCk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKKyAgICAgICJDb3VsZCBub3Qgc2V0IFRDUF9OT0RFTEFZIiwKKyAgICAgIGVycm5vX2NvcHkpOworICB9CisKKyAgLy8gU2V0IFRDUCBub2RlbGF5IGlmIGF2YWlsYWJsZSwgTUFDIE9TIFggSGFjaworICAvLyBTZWUgaHR0cDovL2xpc3RzLmRhbmdhLmNvbS9waXBlcm1haWwvbWVtY2FjaGVkLzIwMDUtTWFyY2gvMDAxMjQwLmh0bWwKKyNpZm5kZWYgVENQX05PUFVTSAorICAvLyBVbml4IFNvY2tldHMgZG8gbm90IG5lZWQgdGhhdAorICBpZiAocGF0aF8uZW1wdHkoKSkgeworICAgIC8vIFRDUCBOb2RlbGF5LCBzcGVlZCBvdmVyIGJhbmR3aWR0aAorICAgIGlmICgtMQorICAgICAgICA9PSBzZXRzb2Nrb3B0KHNlcnZlclNvY2tldF8sIElQUFJPVE9fVENQLCBUQ1BfTk9ERUxBWSwgY2FzdF9zb2Nrb3B0KCZvbmUpLCBzaXplb2Yob25lKSkpIHsKKyAgICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIHNldHNvY2tvcHQoKSBUQ1BfTk9ERUxBWSAiLCBlcnJub19jb3B5KTsKKyAgICAgIGNsb3NlKCk7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IHNldCBUQ1BfTk9ERUxBWSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vX2NvcHkpOworICAgIH0KKyAgfQorI2VuZGlmCisKKyAgLy8gU2V0IE5PTkJMT0NLIG9uIHRoZSBhY2NlcHQgc29ja2V0CisgIGludCBmbGFncyA9IFRIUklGVF9GQ05UTChzZXJ2ZXJTb2NrZXRfLCBUSFJJRlRfRl9HRVRGTCwgMCk7CisgIGlmIChmbGFncyA9PSAtMSkgeworICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBUSFJJRlRfRkNOVEwoKSBUSFJJRlRfRl9HRVRGTCAiLCBlcnJub19jb3B5KTsKKyAgICBjbG9zZSgpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVEhSSUZUX0ZDTlRMKCkgVEhSSUZUX0ZfR0VURkwgZmFpbGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vX2NvcHkpOworICB9CisKKyAgaWYgKC0xID09IFRIUklGVF9GQ05UTChzZXJ2ZXJTb2NrZXRfLCBUSFJJRlRfRl9TRVRGTCwgZmxhZ3MgfCBUSFJJRlRfT19OT05CTE9DSykpIHsKKyAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6bGlzdGVuKCkgVEhSSUZUX0ZDTlRMKCkgVEhSSUZUX09fTk9OQkxPQ0sgIiwgZXJybm9fY29weSk7CisgICAgY2xvc2UoKTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRIUklGVF9GQ05UTCgpIFRIUklGVF9GX1NFVEZMIFRIUklGVF9PX05PTkJMT0NLIGZhaWxlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKKyAgfQorCisjaWZkZWYgVENQX0xPV19NSU5fUlRPCisgIGlmIChUU29ja2V0OjpnZXRVc2VMb3dNaW5SdG8oKSkgeworICAgIGlmICgtMSA9PSBzZXRzb2Nrb3B0KHMsIElQUFJPVE9fVENQLCBUQ1BfTE9XX01JTl9SVE8sIGNvbnN0X2Nhc3Rfc29ja29wdCgmb25lKSwgc2l6ZW9mKG9uZSkpKSB7CisgICAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBzZXRzb2Nrb3B0KCkgVENQX0xPV19NSU5fUlRPICIsIGVycm5vX2NvcHkpOworICAgICAgY2xvc2UoKTsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAgICJDb3VsZCBub3Qgc2V0IFRDUF9OT0RFTEFZIiwKKyAgICAgICAgZXJybm9fY29weSk7CisgICAgfQorICB9CisjZW5kaWYKKworICAvLyBwcmVwYXJlIHRoZSBwb3J0IGluZm9ybWF0aW9uCisgIC8vIHdlIG1heSB3YW50IHRvIHRyeSB0byBiaW5kIG1vcmUgdGhhbiBvbmNlLCBzaW5jZSBUSFJJRlRfTk9fU09DS0VUX0NBQ0hJTkcgZG9lc24ndAorICAvLyBhbHdheXMgc2VlbSB0byB3b3JrLiBUaGUgY2xpZW50IGNhbiBjb25maWd1cmUgdGhlIHJldHJ5IHZhcmlhYmxlcy4KKyAgaW50IHJldHJpZXMgPSAwOworICBpbnQgZXJybm9fY29weSA9IDA7CisKKyAgaWYgKCFwYXRoXy5lbXB0eSgpKSB7CisKKyNpZm5kZWYgX1dJTjMyCisKKyAgICAvLyBVbml4IERvbWFpbiBTb2NrZXQKKyAgICBzaXplX3QgbGVuID0gcGF0aF8uc2l6ZSgpICsgMTsKKyAgICBpZiAobGVuID4gc2l6ZW9mKCgoc29ja2FkZHJfdW4qKU5VTEwpLT5zdW5fcGF0aCkpIHsKKyAgICAgIGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTb2NrZXQ6Omxpc3RlbigpIFVuaXggRG9tYWluIHNvY2tldCBwYXRoIHRvbyBsb25nIiwgZXJybm9fY29weSk7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5peCBEb21haW4gc29ja2V0IHBhdGggdG9vIGxvbmciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKKyAgICB9CisKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfdW4gYWRkcmVzczsKKyAgICBhZGRyZXNzLnN1bl9mYW1pbHkgPSBBRl9VTklYOworICAgIG1lbWNweShhZGRyZXNzLnN1bl9wYXRoLCBwYXRoXy5jX3N0cigpLCBsZW4pOworCisgICAgc29ja2xlbl90IHN0cnVjdGxlbiA9IHN0YXRpY19jYXN0PHNvY2tsZW5fdD4oc2l6ZW9mKGFkZHJlc3MpKTsKKworICAgIGlmICghYWRkcmVzcy5zdW5fcGF0aFswXSkgeyAvLyBhYnN0cmFjdCBuYW1lc3BhY2Ugc29ja2V0CisjaWZkZWYgX19saW51eF9fCisgICAgICAvLyBzdW5fcGF0aCBpcyBub3QgbnVsbC10ZXJtaW5hdGVkIGluIHRoaXMgY2FzZSBhbmQgc3RydWN0bGVuIGRldGVybWluZXMgaXRzIGxlbmd0aAorICAgICAgc3RydWN0bGVuIC09IHNpemVvZihhZGRyZXNzLnN1bl9wYXRoKSAtIGxlbjsKKyNlbHNlCisgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU29ja2V0OjpvcGVuKCkgQWJzdHJhY3QgTmFtZXNwYWNlIERvbWFpbiBzb2NrZXRzIG9ubHkgc3VwcG9ydGVkIG9uIGxpbnV4OiAiLCAtOTkpOworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBBYnN0cmFjdCBOYW1lc3BhY2UgRG9tYWluIHNvY2tldCBwYXRoIG5vdCBzdXBwb3J0ZWQiKTsKKyNlbmRpZgorICAgIH0KKworICAgIGRvIHsKKyAgICAgIGlmICgwID09IDo6YmluZChzZXJ2ZXJTb2NrZXRfLCAoc3RydWN0IHNvY2thZGRyKikmYWRkcmVzcywgc3RydWN0bGVuKSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICAgIC8vIHVzZSBzaG9ydCBjaXJjdWl0IGV2YWx1YXRpb24gaGVyZSB0byBvbmx5IHNsZWVwIGlmIHdlIG5lZWQgdG8KKyAgICB9IHdoaWxlICgocmV0cmllcysrIDwgcmV0cnlMaW1pdF8pICYmIChUSFJJRlRfU0xFRVBfU0VDKHJldHJ5RGVsYXlfKSA9PSAwKSk7CisjZWxzZQorICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTb2NrZXQ6Om9wZW4oKSBVbml4IERvbWFpbiBzb2NrZXQgcGF0aCBub3Qgc3VwcG9ydGVkIG9uIHdpbmRvd3MiLCAtOTkpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIFVuaXggRG9tYWluIHNvY2tldCBwYXRoIG5vdCBzdXBwb3J0ZWQiKTsKKyNlbmRpZgorICB9IGVsc2UgeworICAgIGRvIHsKKyAgICAgIGlmICgwID09IDo6YmluZChzZXJ2ZXJTb2NrZXRfLCByZXMtPmFpX2FkZHIsIHN0YXRpY19jYXN0PGludD4ocmVzLT5haV9hZGRybGVuKSkpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgICAvLyB1c2Ugc2hvcnQgY2lyY3VpdCBldmFsdWF0aW9uIGhlcmUgdG8gb25seSBzbGVlcCBpZiB3ZSBuZWVkIHRvCisgICAgfSB3aGlsZSAoKHJldHJpZXMrKyA8IHJldHJ5TGltaXRfKSAmJiAoVEhSSUZUX1NMRUVQX1NFQyhyZXRyeURlbGF5XykgPT0gMCkpOworCisgICAgLy8gcmV0cmlldmUgYmluZCBpbmZvCisgICAgaWYgKHBvcnRfID09IDAgJiYgcmV0cmllcyA8PSByZXRyeUxpbWl0XykgeworICAgICAgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2Ugc2E7CisgICAgICBzb2NrbGVuX3QgbGVuID0gc2l6ZW9mKHNhKTsKKyAgICAgIHN0ZDo6bWVtc2V0KCZzYSwgMCwgbGVuKTsKKyAgICAgIGlmICg6OmdldHNvY2tuYW1lKHNlcnZlclNvY2tldF8sIHJlaW50ZXJwcmV0X2Nhc3Q8c3RydWN0IHNvY2thZGRyKj4oJnNhKSwgJmxlbikgPCAwKSB7CisgICAgICAgIGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjpnZXRQb3J0KCkgZ2V0c29ja25hbWUoKSAiLCBlcnJub19jb3B5KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChzYS5zc19mYW1pbHkgPT0gQUZfSU5FVDYpIHsKKyAgICAgICAgICBjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW42KiBzaW4gPSByZWludGVycHJldF9jYXN0PGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbjYqPigmc2EpOworICAgICAgICAgIGxpc3RlblBvcnRfID0gbnRvaHMoc2luLT5zaW42X3BvcnQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbiogc2luID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW4qPigmc2EpOworICAgICAgICAgIGxpc3RlblBvcnRfID0gbnRvaHMoc2luLT5zaW5fcG9ydCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyB0aHJvdyBhbiBlcnJvciBpZiB3ZSBmYWlsZWQgdG8gYmluZCBwcm9wZXJseQorICBpZiAocmV0cmllcyA+IHJldHJ5TGltaXRfKSB7CisgICAgY2hhciBlcnJidWZbMTAyNF07CisgICAgaWYgKCFwYXRoXy5lbXB0eSgpKSB7CisgICAgICBUSFJJRlRfU05QUklOVEYoZXJyYnVmLCBzaXplb2YoZXJyYnVmKSwgIlROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6bGlzdGVuKCkgUEFUSCAlcyIsIHBhdGhfLmNfc3RyKCkpOworICAgIH0gZWxzZSB7CisgICAgICBUSFJJRlRfU05QUklOVEYoZXJyYnVmLCBzaXplb2YoZXJyYnVmKSwgIlROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6bGlzdGVuKCkgQklORCAlZCIsIHBvcnRfKTsKKyAgICB9CisgICAgR2xvYmFsT3V0cHV0KGVycmJ1Zik7CisgICAgY2xvc2UoKTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBiaW5kIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vX2NvcHkpOworICB9CisKKyAgaWYgKGxpc3RlbkNhbGxiYWNrXykKKyAgICBsaXN0ZW5DYWxsYmFja18oc2VydmVyU29ja2V0Xyk7CisKKyAgLy8gQ2FsbCBsaXN0ZW4KKyAgaWYgKC0xID09IDo6bGlzdGVuKHNlcnZlclNvY2tldF8sIGFjY2VwdEJhY2tsb2dfKSkgeworICAgIGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIGxpc3RlbigpICIsIGVycm5vX2NvcHkpOworICAgIGNsb3NlKCk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIkNvdWxkIG5vdCBsaXN0ZW4iLCBlcnJub19jb3B5KTsKKyAgfQorCisgIC8vIFRoZSBzb2NrZXQgaXMgbm93IGxpc3RlbmluZyEKK30KKworaW50IFROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6Z2V0UG9ydCgpIHsKKyAgcmV0dXJuIHBvcnRfOworfQorCitpbnQgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjpnZXRMaXN0ZW5Qb3J0KCkgeworICByZXR1cm4gbGlzdGVuUG9ydF87Cit9CisKK3NoYXJlZF9wdHI8VFNvY2tldD4gVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjphY2NlcHRJbXBsKCkgeworICBpZiAoc2VydmVyU29ja2V0XyA9PSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQpIHsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiVE5vbmJsb2NraW5nU2VydmVyU29ja2V0IG5vdCBsaXN0ZW5pbmciKTsKKyAgfQorICAKKyAgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgY2xpZW50QWRkcmVzczsKKyAgaW50IHNpemUgPSBzaXplb2YoY2xpZW50QWRkcmVzcyk7CisgIFRIUklGVF9TT0NLRVQgY2xpZW50U29ja2V0CisgICAgICA9IDo6YWNjZXB0KHNlcnZlclNvY2tldF8sIChzdHJ1Y3Qgc29ja2FkZHIqKSZjbGllbnRBZGRyZXNzLCAoc29ja2xlbl90Kikmc2l6ZSk7CisKKyAgaWYgKGNsaWVudFNvY2tldCA9PSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQpIHsKKyAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6YWNjZXB0SW1wbCgpIDo6YWNjZXB0KCkgIiwgZXJybm9fY29weSk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLCAiYWNjZXB0KCkiLCBlcnJub19jb3B5KTsKKyAgfQorCisgIC8vIEV4cGxpY2l0bHkgc2V0IHRoaXMgc29ja2V0IHRvIE5PTkJMT0NLIG1vZGUKKyAgaW50IGZsYWdzID0gVEhSSUZUX0ZDTlRMKGNsaWVudFNvY2tldCwgVEhSSUZUX0ZfR0VURkwsIDApOworICBpZiAoZmxhZ3MgPT0gLTEpIHsKKyAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgIDo6VEhSSUZUX0NMT1NFU09DS0VUKGNsaWVudFNvY2tldCk7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjphY2NlcHRJbXBsKCkgVEhSSUZUX0ZDTlRMKCkgVEhSSUZUX0ZfR0VURkwgIiwgZXJybm9fY29weSk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRIUklGVF9GQ05UTChUSFJJRlRfRl9HRVRGTCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJybm9fY29weSk7CisgIH0KKworICBpZiAoLTEgPT0gVEhSSUZUX0ZDTlRMKGNsaWVudFNvY2tldCwgVEhSSUZUX0ZfU0VURkwsIGZsYWdzIHwgVEhSSUZUX09fTk9OQkxPQ0spKSB7CisgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICA6OlRIUklGVF9DTE9TRVNPQ0tFVChjbGllbnRTb2NrZXQpOworICAgIEdsb2JhbE91dHB1dAorICAgICAgICAucGVycm9yKCJUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6OmFjY2VwdEltcGwoKSBUSFJJRlRfRkNOVEwoKSBUSFJJRlRfRl9TRVRGTCB+VEhSSUZUX09fTk9OQkxPQ0sgIiwKKyAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVEhSSUZUX0ZDTlRMKFRIUklGVF9GX1NFVEZMKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKKyAgfQorCisgIHNoYXJlZF9wdHI8VFNvY2tldD4gY2xpZW50ID0gY3JlYXRlU29ja2V0KGNsaWVudFNvY2tldCk7CisgIGlmIChzZW5kVGltZW91dF8gPiAwKSB7CisgICAgY2xpZW50LT5zZXRTZW5kVGltZW91dChzZW5kVGltZW91dF8pOworICB9CisgIGlmIChyZWN2VGltZW91dF8gPiAwKSB7CisgICAgY2xpZW50LT5zZXRSZWN2VGltZW91dChyZWN2VGltZW91dF8pOworICB9CisgIGlmIChrZWVwQWxpdmVfKSB7CisgICAgY2xpZW50LT5zZXRLZWVwQWxpdmUoa2VlcEFsaXZlXyk7CisgIH0KKyAgY2xpZW50LT5zZXRDYWNoZWRBZGRyZXNzKChzb2NrYWRkciopJmNsaWVudEFkZHJlc3MsIHNpemUpOworCisgIGlmIChhY2NlcHRDYWxsYmFja18pCisgICAgYWNjZXB0Q2FsbGJhY2tfKGNsaWVudFNvY2tldCk7CisKKyAgcmV0dXJuIGNsaWVudDsKK30KKworc2hhcmVkX3B0cjxUU29ja2V0PiBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6OmNyZWF0ZVNvY2tldChUSFJJRlRfU09DS0VUIGNsaWVudFNvY2tldCkgeworICByZXR1cm4gc2hhcmVkX3B0cjxUU29ja2V0PihuZXcgVFNvY2tldChjbGllbnRTb2NrZXQpKTsKK30KKwordm9pZCBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6OmNsb3NlKCkgeworICBpZiAoc2VydmVyU29ja2V0XyAhPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQpIHsKKyAgICBzaHV0ZG93bihzZXJ2ZXJTb2NrZXRfLCBUSFJJRlRfU0hVVF9SRFdSKTsKKyAgICA6OlRIUklGVF9DTE9TRVNPQ0tFVChzZXJ2ZXJTb2NrZXRfKTsKKyAgfQorICBzZXJ2ZXJTb2NrZXRfID0gVEhSSUZUX0lOVkFMSURfU09DS0VUOworICBsaXN0ZW5pbmdfID0gZmFsc2U7Cit9Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU2VydmVyU29ja2V0LmggYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NlcnZlclNvY2tldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1ODZmZjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NlcnZlclNvY2tldC5oCkBAIC0wLDAgKzEsMTM2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVE5PTkJMT0NLSU5HU0VSVkVSU09DS0VUX0hfCisjZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1ROT05CTE9DS0lOR1NFUlZFUlNPQ0tFVF9IXyAxCisKKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvUGxhdGZvcm1Tb2NrZXQuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworCitjbGFzcyBUU29ja2V0OworCisvKioKKyAqIE5vbmJsb2NraW5nIFNlcnZlciBzb2NrZXQgaW1wbGVtZW50YXRpb24gb2YgVE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0LiBXcmFwcGVyIGFyb3VuZCBhIHVuaXgKKyAqIHNvY2tldCBsaXN0ZW4gYW5kIGFjY2VwdCBjYWxscy4KKyAqCisgKi8KK2NsYXNzIFROb25ibG9ja2luZ1NlcnZlclNvY2tldCA6IHB1YmxpYyBUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQgeworcHVibGljOgorICB0eXBlZGVmIHN0ZDo6ZnVuY3Rpb248dm9pZChUSFJJRlRfU09DS0VUIGZkKT4gc29ja2V0X2Z1bmNfdDsKKworICBjb25zdCBzdGF0aWMgaW50IERFRkFVTFRfQkFDS0xPRyA9IDEwMjQ7CisKKyAgLyoqCisgICAqIENvbnN0cnVjdG9yLgorICAgKgorICAgKiBAcGFyYW0gcG9ydCAgICBQb3J0IG51bWJlciB0byBiaW5kIHRvCisgICAqLworICBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQoaW50IHBvcnQpOworCisgIC8qKgorICAgKiBDb25zdHJ1Y3Rvci4KKyAgICoKKyAgICogQHBhcmFtIHBvcnQgICAgICAgIFBvcnQgbnVtYmVyIHRvIGJpbmQgdG8KKyAgICogQHBhcmFtIHNlbmRUaW1lb3V0IFNvY2tldCBzZW5kIHRpbWVvdXQKKyAgICogQHBhcmFtIHJlY3ZUaW1lb3V0IFNvY2tldCByZWNlaXZlIHRpbWVvdXQKKyAgICovCisgIFROb25ibG9ja2luZ1NlcnZlclNvY2tldChpbnQgcG9ydCwgaW50IHNlbmRUaW1lb3V0LCBpbnQgcmVjdlRpbWVvdXQpOworCisgIC8qKgorICAgKiBDb25zdHJ1Y3Rvci4KKyAgICoKKyAgICogQHBhcmFtIGFkZHJlc3MgQWRkcmVzcyB0byBiaW5kIHRvCisgICAqIEBwYXJhbSBwb3J0ICAgIFBvcnQgbnVtYmVyIHRvIGJpbmQgdG8KKyAgICovCisgIFROb25ibG9ja2luZ1NlcnZlclNvY2tldChjb25zdCBzdGQ6OnN0cmluZyYgYWRkcmVzcywgaW50IHBvcnQpOworCisgIC8qKgorICAgKiBDb25zdHJ1Y3RvciB1c2VkIGZvciB1bml4IHNvY2tldHMuCisgICAqCisgICAqIEBwYXJhbSBwYXRoIFBhdGhuYW1lIGZvciB1bml4IHNvY2tldC4KKyAgICovCisgIFROb25ibG9ja2luZ1NlcnZlclNvY2tldChjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCk7CisKKyAgdmlydHVhbCB+VE5vbmJsb2NraW5nU2VydmVyU29ja2V0KCk7CisKKyAgdm9pZCBzZXRTZW5kVGltZW91dChpbnQgc2VuZFRpbWVvdXQpOworICB2b2lkIHNldFJlY3ZUaW1lb3V0KGludCByZWN2VGltZW91dCk7CisKKyAgdm9pZCBzZXRBY2NlcHRCYWNrbG9nKGludCBhY2NCYWNrbG9nKTsKKworICB2b2lkIHNldFJldHJ5TGltaXQoaW50IHJldHJ5TGltaXQpOworICB2b2lkIHNldFJldHJ5RGVsYXkoaW50IHJldHJ5RGVsYXkpOworCisgIHZvaWQgc2V0S2VlcEFsaXZlKGJvb2wga2VlcEFsaXZlKSB7IGtlZXBBbGl2ZV8gPSBrZWVwQWxpdmU7IH0KKworICB2b2lkIHNldFRjcFNlbmRCdWZmZXIoaW50IHRjcFNlbmRCdWZmZXIpOworICB2b2lkIHNldFRjcFJlY3ZCdWZmZXIoaW50IHRjcFJlY3ZCdWZmZXIpOworCisgIC8vIGxpc3RlbkNhbGxiYWNrIGdldHMgY2FsbGVkIGp1c3QgYmVmb3JlIGxpc3RlbiwgYW5kIGFmdGVyIGFsbCBUaHJpZnQKKyAgLy8gc2V0c29ja29wdCBjYWxscyBoYXZlIGJlZW4gbWFkZS4gIElmIHlvdSBoYXZlIGN1c3RvbSBzZXRzb2Nrb3B0CisgIC8vIHRoaW5ncyB0aGF0IG5lZWQgdG8gaGFwcGVuIG9uIHRoZSBsaXN0ZW5pbmcgc29ja2V0LCB0aGlzIGlzIHRoZSBwbGFjZSB0byBkbyBpdC4KKyAgdm9pZCBzZXRMaXN0ZW5DYWxsYmFjayhjb25zdCBzb2NrZXRfZnVuY190JiBsaXN0ZW5DYWxsYmFjaykgeyBsaXN0ZW5DYWxsYmFja18gPSBsaXN0ZW5DYWxsYmFjazsgfQorCisgIC8vIGFjY2VwdENhbGxiYWNrIGdldHMgY2FsbGVkIGFmdGVyIGVhY2ggYWNjZXB0IGNhbGwsIG9uIHRoZSBuZXdseSBjcmVhdGVkIHNvY2tldC4KKyAgLy8gSXQgaXMgY2FsbGVkIGFmdGVyIGFsbCBUaHJpZnQgc2V0c29ja29wdCBjYWxscyBoYXZlIGJlZW4gbWFkZS4gIElmIHlvdSBoYXZlCisgIC8vIGN1c3RvbSBzZXRzb2Nrb3B0IHRoaW5ncyB0aGF0IG5lZWQgdG8gaGFwcGVuIG9uIHRoZSBhY2NlcHRlZAorICAvLyBzb2NrZXQsIHRoaXMgaXMgdGhlIHBsYWNlIHRvIGRvIGl0LgorICB2b2lkIHNldEFjY2VwdENhbGxiYWNrKGNvbnN0IHNvY2tldF9mdW5jX3QmIGFjY2VwdENhbGxiYWNrKSB7IGFjY2VwdENhbGxiYWNrXyA9IGFjY2VwdENhbGxiYWNrOyB9CisKKyAgVEhSSUZUX1NPQ0tFVCBnZXRTb2NrZXRGRCgpIHsgcmV0dXJuIHNlcnZlclNvY2tldF87IH0KKworICBpbnQgZ2V0UG9ydCgpOworICAKKyAgaW50IGdldExpc3RlblBvcnQoKTsKKworICB2b2lkIGxpc3RlbigpOworICB2b2lkIGNsb3NlKCk7CisKK3Byb3RlY3RlZDoKKyAgc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+IGFjY2VwdEltcGwoKTsKKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gY3JlYXRlU29ja2V0KFRIUklGVF9TT0NLRVQgY2xpZW50KTsKKworcHJpdmF0ZToKKyAgaW50IHBvcnRfOworICBpbnQgbGlzdGVuUG9ydF87CisgIHN0ZDo6c3RyaW5nIGFkZHJlc3NfOworICBzdGQ6OnN0cmluZyBwYXRoXzsKKyAgVEhSSUZUX1NPQ0tFVCBzZXJ2ZXJTb2NrZXRfOworICBpbnQgYWNjZXB0QmFja2xvZ187CisgIGludCBzZW5kVGltZW91dF87CisgIGludCByZWN2VGltZW91dF87CisgIGludCByZXRyeUxpbWl0XzsKKyAgaW50IHJldHJ5RGVsYXlfOworICBpbnQgdGNwU2VuZEJ1ZmZlcl87CisgIGludCB0Y3BSZWN2QnVmZmVyXzsKKyAgYm9vbCBrZWVwQWxpdmVfOworICBib29sIGxpc3RlbmluZ187CisKKyAgc29ja2V0X2Z1bmNfdCBsaXN0ZW5DYWxsYmFja187CisgIHNvY2tldF9mdW5jX3QgYWNjZXB0Q2FsbGJhY2tfOworfTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAorCisjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UTk9OQkxPQ0tJTkdTRVJWRVJTT0NLRVRfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0LmggYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxNDJlMTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydC5oCkBAIC0wLDAgKzEsMTAwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVE5PTkJMT0NLSU5HU0VSVkVSVFJBTlNQT1JUX0hfCisjZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1ROT05CTE9DS0lOR1NFUlZFUlRSQU5TUE9SVF9IXyAxCisKKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworCisvKioKKyAqIFNlcnZlciB0cmFuc3BvcnQgZnJhbWV3b3JrLiBBIHNlcnZlciBuZWVkcyB0byBoYXZlIHNvbWUgZmFjaWxpdHkgZm9yCisgKiBjcmVhdGluZyBiYXNlIHRyYW5zcG9ydHMgdG8gcmVhZC93cml0ZSBmcm9tLiAgVGhlIHNlcnZlciBpcyBleHBlY3RlZAorICogdG8ga2VlcCB0cmFjayBvZiBUVHJhbnNwb3J0IGNoaWxkcmVuIHRoYXQgaXQgY3JlYXRlcyBmb3IgcHVycG9zZXMgb2YKKyAqIGNvbnRyb2xsaW5nIHRoZWlyIGxpZmV0aW1lLgorICovCitjbGFzcyBUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQgeworcHVibGljOgorICB2aXJ0dWFsIH5UTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQoKSB7fQorCisgIC8qKgorICAgKiBTdGFydHMgdGhlIHNlcnZlciB0cmFuc3BvcnQgbGlzdGVuaW5nIGZvciBuZXcgY29ubmVjdGlvbnMuIFByaW9yIHRvIHRoaXMKKyAgICogY2FsbCBtb3N0IHRyYW5zcG9ydHMgd2lsbCBub3QgcmV0dXJuIGFueXRoaW5nIHdoZW4gYWNjZXB0IGlzIGNhbGxlZC4KKyAgICoKKyAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIHdlIHdlcmUgdW5hYmxlIHRvIGxpc3RlbgorICAgKi8KKyAgdmlydHVhbCB2b2lkIGxpc3RlbigpIHt9CisKKyAgLyoqCisgICAqIEdldHMgYSBuZXcgZHluYW1pY2FsbHkgYWxsb2NhdGVkIHRyYW5zcG9ydCBvYmplY3QgYW5kIHBhc3NlcyBpdCB0byB0aGUKKyAgICogY2FsbGVyLiBOb3RlIHRoYXQgaXQgaXMgdGhlIGV4cGxpY2l0IGR1dHkgb2YgdGhlIGNhbGxlciB0byBmcmVlIHRoZQorICAgKiBhbGxvY2F0ZWQgb2JqZWN0LiBUaGUgcmV0dXJuZWQgVFRyYW5zcG9ydCBvYmplY3QgbXVzdCBhbHdheXMgYmUgaW4gdGhlCisgICAqIG9wZW5lZCBzdGF0ZS4gTlVMTCBzaG91bGQgbmV2ZXIgYmUgcmV0dXJuZWQsIGluc3RlYWQgYW4gRXhjZXB0aW9uIHNob3VsZAorICAgKiBhbHdheXMgYmUgdGhyb3duLgorICAgKgorICAgKiBAcmV0dXJuIEEgbmV3IFRUcmFuc3BvcnQgb2JqZWN0CisgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbiBlcnJvcgorICAgKi8KKyAgc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+IGFjY2VwdCgpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gcmVzdWx0ID0gYWNjZXB0SW1wbCgpOworICAgIGlmICghcmVzdWx0KSB7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJhY2NlcHQoKSBtYXkgbm90IHJldHVybiBOVUxMIik7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICAvKioKKyAgKiBVdGlsaXR5IG1ldGhvZAorICAqIAorICAqIEByZXR1cm4gc2VydmVyIHNvY2tldCBmaWxlIGRlc2NyaXB0b3IgCisgICogQHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24gSWYgYW4gZXJyb3Igb2NjdXJzCisgICovCisKKyAgdmlydHVhbCBUSFJJRlRfU09DS0VUIGdldFNvY2tldEZEKCkgPSAwOworCisgIHZpcnR1YWwgaW50IGdldFBvcnQoKSA9IDA7CisKKyAgdmlydHVhbCBpbnQgZ2V0TGlzdGVuUG9ydCgpID0gMDsKKworICAvKioKKyAgICogQ2xvc2VzIHRoaXMgdHJhbnNwb3J0IHN1Y2ggdGhhdCBmdXR1cmUgY2FsbHMgdG8gYWNjZXB0IHdpbGwgZG8gbm90aGluZy4KKyAgICovCisgIHZpcnR1YWwgdm9pZCBjbG9zZSgpID0gMDsKKworcHJvdGVjdGVkOgorICBUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQoKSB7fQorCisgIC8qKgorICAgKiBTdWJjbGFzc2VzIHNob3VsZCBpbXBsZW1lbnQgdGhpcyBmdW5jdGlvbiBmb3IgYWNjZXB0LgorICAgKgorICAgKiBAcmV0dXJuIEEgbmV3bHkgYWxsb2NhdGVkIFRUcmFuc3BvcnQgb2JqZWN0CisgICAqIEB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uIElmIGFuIGVycm9yIG9jY3VycworICAgKi8KKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gYWNjZXB0SW1wbCgpID0gMDsKKworfTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAorCisjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UTk9OQkxPQ0tJTkdTRVJWRVJUUkFOU1BPUlRfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFBpcGUuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UUGlwZS5jcHAKaW5kZXggM2JiM2RhYy4uOGE4NDQ1NyAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UUGlwZS5jcHAKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UUGlwZS5jcHAKQEAgLTIwLDEzICsyMCwxMyBAQAogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5oPgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFBpcGUuaD4KICNpZmRlZiBfV0lOMzIKLSAgI2luY2x1ZGUgPHRocmlmdC93aW5kb3dzL092ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkLmg+Ci0gICNpbmNsdWRlIDx0aHJpZnQvd2luZG93cy9TeW5jLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3dpbmRvd3MvT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvd2luZG93cy9TeW5jLmg+CiAjZW5kaWYKIAotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKLQotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKIAogLyoqCiAqIFRQaXBlIGltcGxlbWVudGF0aW9uLgpAQCAtNDMsMTIgKzQzLDEyIEBACiBjbGFzcyBUUGlwZUltcGwgOiBib29zdDo6bm9uY29weWFibGUgewogcHVibGljOgogICBUUGlwZUltcGwoKSB7fQotICB2aXJ0dWFsIH5UUGlwZUltcGwoKSA9IDAge30KKyAgdmlydHVhbCB+VFBpcGVJbXBsKCkge30KICAgdmlydHVhbCB1aW50MzJfdCByZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSA9IDA7CiAgIHZpcnR1YWwgdm9pZCB3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgPSAwOwotICB2aXJ0dWFsIEhBTkRMRSBnZXRQaXBlSGFuZGxlKCkgPSAwOyAvL2RvdWJsZXMgYXMgdGhlIHJlYWQgaGFuZGxlIGZvciBhbm9uIHBpcGUKKyAgdmlydHVhbCBIQU5ETEUgZ2V0UGlwZUhhbmRsZSgpID0gMDsgLy8gZG91YmxlcyBhcyB0aGUgcmVhZCBoYW5kbGUgZm9yIGFub24gcGlwZQogICB2aXJ0dWFsIHZvaWQgc2V0UGlwZUhhbmRsZShIQU5ETEUgcGlwZWhhbmRsZSkgPSAwOwotICB2aXJ0dWFsIEhBTkRMRSBnZXRXcnRQaXBlSGFuZGxlKCkge3JldHVybiBJTlZBTElEX0hBTkRMRV9WQUxVRTt9CisgIHZpcnR1YWwgSEFORExFIGdldFdydFBpcGVIYW5kbGUoKSB7IHJldHVybiBJTlZBTElEX0hBTkRMRV9WQUxVRTsgfQogICB2aXJ0dWFsIHZvaWQgc2V0V3J0UGlwZUhhbmRsZShIQU5ETEUpIHt9CiAgIHZpcnR1YWwgYm9vbCBpc0J1ZmZlcmVkRGF0YUF2YWlsYWJsZSgpIHsgcmV0dXJuIGZhbHNlOyB9CiAgIHZpcnR1YWwgSEFORExFIGdldE5hdGl2ZVdhaXRIYW5kbGUoKSB7IHJldHVybiBJTlZBTElEX0hBTkRMRV9WQUxVRTsgfQpAQCAtNTYsMTcgKzU2LDE4IEBACiAKIGNsYXNzIFROYW1lZFBpcGVJbXBsIDogcHVibGljIFRQaXBlSW1wbCB7CiBwdWJsaWM6Ci0gIGV4cGxpY2l0IFROYW1lZFBpcGVJbXBsKEhBTkRMRSBwaXBlaGFuZGxlKSA6IFBpcGVfKHBpcGVoYW5kbGUpIHt9CisgIGV4cGxpY2l0IFROYW1lZFBpcGVJbXBsKFRBdXRvSGFuZGxlICZwaXBlaGFuZGxlKSA6IFBpcGVfKHBpcGVoYW5kbGUucmVsZWFzZSgpKSB7fQogICB2aXJ0dWFsIH5UTmFtZWRQaXBlSW1wbCgpIHt9Ci0gIHZpcnR1YWwgdWludDMyX3QgcmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgICAgewotICAgIHJldHVybiBwc2V1ZG9fc3luY19yZWFkIChQaXBlXy5oLCByZWFkX2V2ZW50Xy5oLCBidWYsIGxlbik7CisgIHZpcnR1YWwgdWludDMyX3QgcmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICAgIHJldHVybiBwc2V1ZG9fc3luY19yZWFkKFBpcGVfLmgsIHJlYWRfZXZlbnRfLmgsIGJ1ZiwgbGVuKTsKICAgfQogICB2aXJ0dWFsIHZvaWQgd3JpdGUoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKICAgICBwc2V1ZG9fc3luY193cml0ZShQaXBlXy5oLCB3cml0ZV9ldmVudF8uaCwgYnVmLCBsZW4pOwogICB9CiAKLSAgdmlydHVhbCBIQU5ETEUgZ2V0UGlwZUhhbmRsZSgpIHtyZXR1cm4gUGlwZV8uaDt9Ci0gIHZpcnR1YWwgdm9pZCBzZXRQaXBlSGFuZGxlKEhBTkRMRSBwaXBlaGFuZGxlKSB7UGlwZV8ucmVzZXQocGlwZWhhbmRsZSk7fQorICB2aXJ0dWFsIEhBTkRMRSBnZXRQaXBlSGFuZGxlKCkgeyByZXR1cm4gUGlwZV8uaDsgfQorICB2aXJ0dWFsIHZvaWQgc2V0UGlwZUhhbmRsZShIQU5ETEUgcGlwZWhhbmRsZSkgeyBQaXBlXy5yZXNldChwaXBlaGFuZGxlKTsgfQorCiBwcml2YXRlOgogICBUTWFudWFsUmVzZXRFdmVudCByZWFkX2V2ZW50XzsKICAgVE1hbnVhbFJlc2V0RXZlbnQgd3JpdGVfZXZlbnRfOwpAQCAtNzcsMTMgKzc4LDE0IEBACiBwdWJsaWM6CiAgIFRBbm9uUGlwZUltcGwoSEFORExFIFBpcGVSZCwgSEFORExFIFBpcGVXcnQpIDogUGlwZVJkXyhQaXBlUmQpLCBQaXBlV3J0XyhQaXBlV3J0KSB7fQogICB2aXJ0dWFsIH5UQW5vblBpcGVJbXBsKCkge30KLSAgdmlydHVhbCB1aW50MzJfdCByZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSAgICB7cmV0dXJuIHBpcGVfcmVhZCAoUGlwZVJkXy5oLCAgYnVmLCBsZW4pO30KLSAgdmlydHVhbCB2b2lkIHdyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7ICAgICAgIHBpcGVfd3JpdGUoUGlwZVdydF8uaCwgYnVmLCBsZW4pO30KKyAgdmlydHVhbCB1aW50MzJfdCByZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7IHJldHVybiBwaXBlX3JlYWQoUGlwZVJkXy5oLCBidWYsIGxlbik7IH0KKyAgdmlydHVhbCB2b2lkIHdyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7IHBpcGVfd3JpdGUoUGlwZVdydF8uaCwgYnVmLCBsZW4pOyB9CiAKLSAgdmlydHVhbCBIQU5ETEUgZ2V0UGlwZUhhbmRsZSgpICAgICAgICAgICAgICAgIHtyZXR1cm4gUGlwZVJkXy5oO30KLSAgdmlydHVhbCB2b2lkIHNldFBpcGVIYW5kbGUoSEFORExFIFBpcGVSZCkgICAgIHtQaXBlUmRfLnJlc2V0KFBpcGVSZCk7fQotICB2aXJ0dWFsIEhBTkRMRSBnZXRXcnRQaXBlSGFuZGxlKCkgICAgICAgICAgICAge3JldHVybiBQaXBlV3J0Xy5oO30KLSAgdmlydHVhbCB2b2lkIHNldFdydFBpcGVIYW5kbGUoSEFORExFIFBpcGVXcnQpIHtQaXBlV3J0Xy5yZXNldChQaXBlV3J0KTt9CisgIHZpcnR1YWwgSEFORExFIGdldFBpcGVIYW5kbGUoKSB7IHJldHVybiBQaXBlUmRfLmg7IH0KKyAgdmlydHVhbCB2b2lkIHNldFBpcGVIYW5kbGUoSEFORExFIFBpcGVSZCkgeyBQaXBlUmRfLnJlc2V0KFBpcGVSZCk7IH0KKyAgdmlydHVhbCBIQU5ETEUgZ2V0V3J0UGlwZUhhbmRsZSgpIHsgcmV0dXJuIFBpcGVXcnRfLmg7IH0KKyAgdmlydHVhbCB2b2lkIHNldFdydFBpcGVIYW5kbGUoSEFORExFIFBpcGVXcnQpIHsgUGlwZVdydF8ucmVzZXQoUGlwZVdydCk7IH0KKwogcHJpdmF0ZToKICAgVEF1dG9IYW5kbGUgUGlwZVJkXzsKICAgVEF1dG9IYW5kbGUgUGlwZVdydF87CkBAIC05NCwyMSArOTYsMTkgQEAKIC8vIHRoYW4gdXNpbmcgdGhlIHJlZ3VsYXIgbmFtZWQgcGlwZSBpbXBsZW1lbnRhdGlvbgogY2xhc3MgVFdhaXRhYmxlTmFtZWRQaXBlSW1wbCA6IHB1YmxpYyBUUGlwZUltcGwgewogcHVibGljOgotICBleHBsaWNpdCBUV2FpdGFibGVOYW1lZFBpcGVJbXBsKEhBTkRMRSBwaXBlaGFuZGxlKSA6Ci0gICAgUGlwZV8ocGlwZWhhbmRsZSksCi0gICAgYmVnaW5fdW5yZWFkX2lkeF8oMCksCi0gICAgZW5kX3VucmVhZF9pZHhfKDApCi0gIHsKKyAgZXhwbGljaXQgVFdhaXRhYmxlTmFtZWRQaXBlSW1wbChUQXV0b0hhbmRsZSAmcGlwZWhhbmRsZSkKKyAgICA6IGJlZ2luX3VucmVhZF9pZHhfKDApLCBlbmRfdW5yZWFkX2lkeF8oMCkgewogICAgIHJlYWRPdmVybGFwXy5hY3Rpb24gPSBUT3ZlcmxhcHBlZFdvcmtJdGVtOjpSRUFEOwotICAgIHJlYWRPdmVybGFwXy5oID0gUGlwZV8uaDsKKyAgICByZWFkT3ZlcmxhcF8uaCA9IHBpcGVoYW5kbGUuaDsKICAgICBjYW5jZWxPdmVybGFwXy5hY3Rpb24gPSBUT3ZlcmxhcHBlZFdvcmtJdGVtOjpDQU5DRUxJTzsKLSAgICBjYW5jZWxPdmVybGFwXy5oID0gUGlwZV8uaDsKKyAgICBjYW5jZWxPdmVybGFwXy5oID0gcGlwZWhhbmRsZS5oOwogICAgIGJ1ZmZlcl8ucmVzaXplKDEwMjQgLyphcmJpdHJhcnkgYnVmZmVyIHNpemUqLywgJ1wwJyk7CiAgICAgYmVnaW5Bc3luY1JlYWQoJmJ1ZmZlcl9bMF0sIHN0YXRpY19jYXN0PHVpbnQzMl90PihidWZmZXJfLnNpemUoKSkpOworICAgIFBpcGVfLnJlc2V0KHBpcGVoYW5kbGUucmVsZWFzZSgpKTsKICAgfQogICB2aXJ0dWFsIH5UV2FpdGFibGVOYW1lZFBpcGVJbXBsKCkgewogICAgIC8vIHNlZSBpZiB0aGVyZSBpcyBhbiBvdXRzdGFuZGluZyByZWFkIHJlcXVlc3QKLSAgICBpZihiZWdpbl91bnJlYWRfaWR4XyA9PSBlbmRfdW5yZWFkX2lkeF8pIHsKKyAgICBpZiAoYmVnaW5fdW5yZWFkX2lkeF8gPT0gZW5kX3VucmVhZF9pZHhfKSB7CiAgICAgICAvLyBpZiBzbywgY2FuY2VsIGl0LCBhbmQgd2FpdCBmb3IgdGhlIGRlYWQgY29tcGxldGlvbgogICAgICAgdGhyZWFkXy0+YWRkV29ya0l0ZW0oJmNhbmNlbE92ZXJsYXBfKTsKICAgICAgIHJlYWRPdmVybGFwXy5vdmVybGFwcGVkUmVzdWx0cyhmYWxzZSAvKmlnbm9yZSBlcnJvcnMqLyk7CkBAIC0xMTksMTAgKzExOSwxMSBAQAogICAgIHBzZXVkb19zeW5jX3dyaXRlKFBpcGVfLmgsIHdyaXRlX2V2ZW50Xy5oLCBidWYsIGxlbik7CiAgIH0KIAotICB2aXJ0dWFsIEhBTkRMRSBnZXRQaXBlSGFuZGxlKCkge3JldHVybiBQaXBlXy5oO30KLSAgdmlydHVhbCB2b2lkIHNldFBpcGVIYW5kbGUoSEFORExFIHBpcGVoYW5kbGUpIHtQaXBlXy5yZXNldChwaXBlaGFuZGxlKTt9Ci0gIHZpcnR1YWwgYm9vbCBpc0J1ZmZlcmVkRGF0YUF2YWlsYWJsZSgpIHtyZXR1cm4gYmVnaW5fdW5yZWFkX2lkeF8gPCBlbmRfdW5yZWFkX2lkeF87fQorICB2aXJ0dWFsIEhBTkRMRSBnZXRQaXBlSGFuZGxlKCkgeyByZXR1cm4gUGlwZV8uaDsgfQorICB2aXJ0dWFsIHZvaWQgc2V0UGlwZUhhbmRsZShIQU5ETEUgcGlwZWhhbmRsZSkgeyBQaXBlXy5yZXNldChwaXBlaGFuZGxlKTsgfQorICB2aXJ0dWFsIGJvb2wgaXNCdWZmZXJlZERhdGFBdmFpbGFibGUoKSB7IHJldHVybiBiZWdpbl91bnJlYWRfaWR4XyA8IGVuZF91bnJlYWRfaWR4XzsgfQogICB2aXJ0dWFsIEhBTkRMRSBnZXROYXRpdmVXYWl0SGFuZGxlKCkgeyByZXR1cm4gcmVhZHlfZXZlbnRfLmg7IH0KKwogcHJpdmF0ZToKICAgdm9pZCBiZWdpbkFzeW5jUmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7CiAgIHVpbnQzMl90IGVuZEFzeW5jUmVhZCgpOwpAQCAtMTM4LDM0ICsxMzksMzAgQEAKICAgdWludDMyX3QgZW5kX3VucmVhZF9pZHhfOwogfTsKIAotdm9pZCBUV2FpdGFibGVOYW1lZFBpcGVJbXBsOjpiZWdpbkFzeW5jUmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikKLXsKK3ZvaWQgVFdhaXRhYmxlTmFtZWRQaXBlSW1wbDo6YmVnaW5Bc3luY1JlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKICAgYmVnaW5fdW5yZWFkX2lkeF8gPSBlbmRfdW5yZWFkX2lkeF8gPSAwOwogICByZWFkT3ZlcmxhcF8ucmVzZXQoYnVmLCBsZW4sIHJlYWR5X2V2ZW50Xy5oKTsKICAgdGhyZWFkXy0+YWRkV29ya0l0ZW0oJnJlYWRPdmVybGFwXyk7Ci0gIGlmKHJlYWRPdmVybGFwXy5zdWNjZXNzID09IEZBTFNFICYmIHJlYWRPdmVybGFwXy5sYXN0X2Vycm9yICE9IEVSUk9SX0lPX1BFTkRJTkcpCi0gIHsKKyAgaWYgKHJlYWRPdmVybGFwXy5zdWNjZXNzID09IEZBTFNFICYmIHJlYWRPdmVybGFwXy5sYXN0X2Vycm9yICE9IEVSUk9SX0lPX1BFTkRJTkcpIHsKICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUUGlwZSA6OlJlYWRGaWxlIGVycm9yZWQgR0xFPSIsIHJlYWRPdmVybGFwXy5sYXN0X2Vycm9yKTsKICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sICJUUGlwZTogUmVhZEZpbGUgZmFpbGVkIik7CiAgIH0KIH0KIAotdWludDMyX3QgVFdhaXRhYmxlTmFtZWRQaXBlSW1wbDo6ZW5kQXN5bmNSZWFkKCkKLXsKK3VpbnQzMl90IFRXYWl0YWJsZU5hbWVkUGlwZUltcGw6OmVuZEFzeW5jUmVhZCgpIHsKICAgcmV0dXJuIHJlYWRPdmVybGFwXy5vdmVybGFwcGVkUmVzdWx0cygpOwogfQogCi11aW50MzJfdCBUV2FpdGFibGVOYW1lZFBpcGVJbXBsOjpyZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKQotewotICBpZihiZWdpbl91bnJlYWRfaWR4XyA9PSBlbmRfdW5yZWFkX2lkeF8pIHsKK3VpbnQzMl90IFRXYWl0YWJsZU5hbWVkUGlwZUltcGw6OnJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgaWYgKGJlZ2luX3VucmVhZF9pZHhfID09IGVuZF91bnJlYWRfaWR4XykgewogICAgIGVuZF91bnJlYWRfaWR4XyA9IGVuZEFzeW5jUmVhZCgpOwogICB9CiAKLSAgdWludDMyX3QgYnl0ZXNfdG9fY29weSA9IChzdGQ6Om1pbikobGVuLCBlbmRfdW5yZWFkX2lkeF8tYmVnaW5fdW5yZWFkX2lkeF8pOworICB1aW50MzJfdCBfX2lkeHNpemUgPSBlbmRfdW5yZWFkX2lkeF8gLSBiZWdpbl91bnJlYWRfaWR4XzsKKyAgdWludDMyX3QgYnl0ZXNfdG9fY29weSA9IChsZW4gPCBfX2lkeHNpemUpID8gbGVuIDogX19pZHhzaXplOwogICBtZW1jcHkoYnVmLCAmYnVmZmVyX1tiZWdpbl91bnJlYWRfaWR4X10sIGJ5dGVzX3RvX2NvcHkpOwogICBiZWdpbl91bnJlYWRfaWR4XyArPSBieXRlc190b19jb3B5OwotICBpZihiZWdpbl91bnJlYWRfaWR4XyAhPSBlbmRfdW5yZWFkX2lkeF8pCi0gIHsKKyAgaWYgKGJlZ2luX3VucmVhZF9pZHhfICE9IGVuZF91bnJlYWRfaWR4XykgewogICAgIGFzc2VydChsZW4gPT0gYnl0ZXNfdG9fY29weSk7CiAgICAgLy8gd2Ugd2VyZSBhYmxlIHRvIGZ1bGZpbGwgdGhlIHJlYWQgd2l0aCBqdXN0IHRoZSBieXRlcyBpbiBvdXIKICAgICAvLyBidWZmZXIsIGFuZCB3ZSBzdGlsbCBoYXZlIGJ1ZmZlciBsZWZ0CkBAIC0xNzMsMzMgKzE3MCwyOSBAQAogICB9CiAgIHVpbnQzMl90IGJ5dGVzX2NvcGllZCA9IGJ5dGVzX3RvX2NvcHk7CiAKLSAgLy9hbGwgb2YgdGhlIHJlcXVlc3RlZCBkYXRhIGhhcyBiZWVuIHJlYWQuICBLaWNrIG9mZiBhbiBhc3luYyByZWFkIGZvciB0aGUgbmV4dCByb3VuZC4KKyAgLy8gYWxsIG9mIHRoZSByZXF1ZXN0ZWQgZGF0YSBoYXMgYmVlbiByZWFkLiAgS2ljayBvZmYgYW4gYXN5bmMgcmVhZCBmb3IgdGhlIG5leHQgcm91bmQuCiAgIGJlZ2luQXN5bmNSZWFkKCZidWZmZXJfWzBdLCBzdGF0aWNfY2FzdDx1aW50MzJfdD4oYnVmZmVyXy5zaXplKCkpKTsKIAogICByZXR1cm4gYnl0ZXNfY29waWVkOwogfQogCi12b2lkIHBzZXVkb19zeW5jX3dyaXRlKEhBTkRMRSBwaXBlLCBIQU5ETEUgZXZlbnQsIGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKQotewordm9pZCBwc2V1ZG9fc3luY193cml0ZShIQU5ETEUgcGlwZSwgSEFORExFIGV2ZW50LCBjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewogICBPVkVSTEFQUEVEIHRlbXBPdmVybGFwOwotICBtZW1zZXQoICZ0ZW1wT3ZlcmxhcCwgMCwgc2l6ZW9mKHRlbXBPdmVybGFwKSk7CisgIG1lbXNldCgmdGVtcE92ZXJsYXAsIDAsIHNpemVvZih0ZW1wT3ZlcmxhcCkpOwogICB0ZW1wT3ZlcmxhcC5oRXZlbnQgPSBldmVudDsKIAogICB1aW50MzJfdCB3cml0dGVuID0gMDsKLSAgd2hpbGUod3JpdHRlbiA8IGxlbikKLSAgewotICAgIEJPT0wgcmVzdWx0ID0gOjpXcml0ZUZpbGUocGlwZSwgYnVmK3dyaXR0ZW4sIGxlbi13cml0dGVuLCBOVUxMLCAmdGVtcE92ZXJsYXApOworICB3aGlsZSAod3JpdHRlbiA8IGxlbikgeworICAgIEJPT0wgcmVzdWx0ID0gOjpXcml0ZUZpbGUocGlwZSwgYnVmICsgd3JpdHRlbiwgbGVuIC0gd3JpdHRlbiwgTlVMTCwgJnRlbXBPdmVybGFwKTsKIAotICAgIGlmKHJlc3VsdCA9PSBGQUxTRSAmJiA6OkdldExhc3RFcnJvcigpICE9IEVSUk9SX0lPX1BFTkRJTkcpCi0gICAgeworICAgIGlmIChyZXN1bHQgPT0gRkFMU0UgJiYgOjpHZXRMYXN0RXJyb3IoKSAhPSBFUlJPUl9JT19QRU5ESU5HKSB7CiAgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUUGlwZSA6OldyaXRlRmlsZSBlcnJvcmVkIEdMRT0iLCA6OkdldExhc3RFcnJvcigpKTsKICAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTiwgIlRQaXBlOiB3cml0ZSBmYWlsZWQiKTsKICAgICB9CiAKICAgICBEV09SRCBieXRlcyA9IDA7CiAgICAgcmVzdWx0ID0gOjpHZXRPdmVybGFwcGVkUmVzdWx0KHBpcGUsICZ0ZW1wT3ZlcmxhcCwgJmJ5dGVzLCBUUlVFKTsKLSAgICBpZighcmVzdWx0KQotICAgIHsKKyAgICBpZiAoIXJlc3VsdCkgewogICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFBpcGUgOjpHZXRPdmVybGFwcGVkUmVzdWx0IGVycm9yZWQgR0xFPSIsIDo6R2V0TGFzdEVycm9yKCkpOwogICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLCAiVFBpcGU6IEdldE92ZXJsYXBwZWRSZXN1bHQgZmFpbGVkIik7CiAgICAgfQpAQCAtMjA3LDI0ICsyMDAsMjEgQEAKICAgfQogfQogCi11aW50MzJfdCBwc2V1ZG9fc3luY19yZWFkKEhBTkRMRSBwaXBlLCBIQU5ETEUgZXZlbnQsIHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKQotewordWludDMyX3QgcHNldWRvX3N5bmNfcmVhZChIQU5ETEUgcGlwZSwgSEFORExFIGV2ZW50LCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewogICBPVkVSTEFQUEVEIHRlbXBPdmVybGFwOwotICBtZW1zZXQoICZ0ZW1wT3ZlcmxhcCwgMCwgc2l6ZW9mKHRlbXBPdmVybGFwKSk7CisgIG1lbXNldCgmdGVtcE92ZXJsYXAsIDAsIHNpemVvZih0ZW1wT3ZlcmxhcCkpOwogICB0ZW1wT3ZlcmxhcC5oRXZlbnQgPSBldmVudDsKIAogICBCT09MIHJlc3VsdCA9IDo6UmVhZEZpbGUocGlwZSwgYnVmLCBsZW4sIE5VTEwsICZ0ZW1wT3ZlcmxhcCk7CiAKLSAgaWYocmVzdWx0ID09IEZBTFNFICYmIDo6R2V0TGFzdEVycm9yKCkgIT0gRVJST1JfSU9fUEVORElORykKLSAgeworICBpZiAocmVzdWx0ID09IEZBTFNFICYmIDo6R2V0TGFzdEVycm9yKCkgIT0gRVJST1JfSU9fUEVORElORykgewogICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRQaXBlIDo6UmVhZEZpbGUgZXJyb3JlZCBHTEU9IiwgOjpHZXRMYXN0RXJyb3IoKSk7CiAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLCAiVFBpcGU6IHJlYWQgZmFpbGVkIik7CiAgIH0KIAogICBEV09SRCBieXRlcyA9IDA7CiAgIHJlc3VsdCA9IDo6R2V0T3ZlcmxhcHBlZFJlc3VsdChwaXBlLCAmdGVtcE92ZXJsYXAsICZieXRlcywgVFJVRSk7Ci0gIGlmKCFyZXN1bHQpCi0gIHsKKyAgaWYgKCFyZXN1bHQpIHsKICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUUGlwZSA6OkdldE92ZXJsYXBwZWRSZXN1bHQgZXJyb3JlZCBHTEU9IiwgOjpHZXRMYXN0RXJyb3IoKSk7CiAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLCAiVFBpcGU6IEdldE92ZXJsYXBwZWRSZXN1bHQgZmFpbGVkIik7CiAgIH0KQEAgLTIzMiwzOCArMjIyLDM0IEBACiB9CiAKIC8vLS0tLSBDb25zdHJ1Y3RvcnMgLS0tLQotVFBpcGU6OlRQaXBlKEhBTkRMRSBQaXBlKSA6Ci0gIGltcGxfKG5ldyBUV2FpdGFibGVOYW1lZFBpcGVJbXBsKFBpcGUpKSwKLSAgVGltZW91dFNlY29uZHNfKDMpLAotICBpc0Fub255bW91c18oZmFsc2UpCi17fQorVFBpcGU6OlRQaXBlKFRBdXRvSGFuZGxlICZQaXBlKQorICA6IGltcGxfKG5ldyBUV2FpdGFibGVOYW1lZFBpcGVJbXBsKFBpcGUpKSwgVGltZW91dFNlY29uZHNfKDMpLCBpc0Fub255bW91c18oZmFsc2UpIHsKK30KIAotVFBpcGU6OlRQaXBlKGNvbnN0IGNoYXIgKnBpcGVuYW1lKSA6Ci0gIFRpbWVvdXRTZWNvbmRzXygzKSwKLSAgaXNBbm9ueW1vdXNfKGZhbHNlKQorVFBpcGU6OlRQaXBlKEhBTkRMRSBQaXBlKQorICA6IFRpbWVvdXRTZWNvbmRzXygzKSwgaXNBbm9ueW1vdXNfKGZhbHNlKQogeworICBUQXV0b0hhbmRsZSBwaXBlSGFuZGxlKFBpcGUpOworICBpbXBsXy5yZXNldChuZXcgVFdhaXRhYmxlTmFtZWRQaXBlSW1wbChwaXBlSGFuZGxlKSk7Cit9CisKK1RQaXBlOjpUUGlwZShjb25zdCBjaGFyKiBwaXBlbmFtZSkgOiBUaW1lb3V0U2Vjb25kc18oMyksIGlzQW5vbnltb3VzXyhmYWxzZSkgewogICBzZXRQaXBlbmFtZShwaXBlbmFtZSk7CiB9CiAKLVRQaXBlOjpUUGlwZShjb25zdCBzdGQ6OnN0cmluZyAmcGlwZW5hbWUpIDoKLSAgVGltZW91dFNlY29uZHNfKDMpLAotICBpc0Fub255bW91c18oZmFsc2UpCi17CitUUGlwZTo6VFBpcGUoY29uc3Qgc3RkOjpzdHJpbmcmIHBpcGVuYW1lKSA6IFRpbWVvdXRTZWNvbmRzXygzKSwgaXNBbm9ueW1vdXNfKGZhbHNlKSB7CiAgIHNldFBpcGVuYW1lKHBpcGVuYW1lKTsKIH0KIAotVFBpcGU6OlRQaXBlKEhBTkRMRSBQaXBlUmQsIEhBTkRMRSBQaXBlV3J0KSA6Ci0gIGltcGxfKG5ldyBUQW5vblBpcGVJbXBsKFBpcGVSZCwgUGlwZVdydCkpLAotICBUaW1lb3V0U2Vjb25kc18oMyksCi0gIGlzQW5vbnltb3VzXyh0cnVlKQote30KK1RQaXBlOjpUUGlwZShIQU5ETEUgUGlwZVJkLCBIQU5ETEUgUGlwZVdydCkKKyAgOiBpbXBsXyhuZXcgVEFub25QaXBlSW1wbChQaXBlUmQsIFBpcGVXcnQpKSwgVGltZW91dFNlY29uZHNfKDMpLCBpc0Fub255bW91c18odHJ1ZSkgeworfQogCi1UUGlwZTo6VFBpcGUoKSA6Ci0gIFRpbWVvdXRTZWNvbmRzXygzKSwKLSAgaXNBbm9ueW1vdXNfKGZhbHNlKQote30KK1RQaXBlOjpUUGlwZSgpIDogVGltZW91dFNlY29uZHNfKDMpLCBpc0Fub255bW91c18oZmFsc2UpIHsKK30KIAotVFBpcGU6On5UUGlwZSgpIHt9CitUUGlwZTo6flRQaXBlKCkgeworfQogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gVHJhbnNwb3J0IGNhbGxiYWNrcwpAQCAtMjgzLDM2ICsyNjksMzEgQEAKICAgVEF1dG9IYW5kbGUgaFBpcGU7CiAgIGRvIHsKICAgICBEV09SRCBmbGFncyA9IEZJTEVfRkxBR19PVkVSTEFQUEVEOyAvLyBhc3luYyBtb2RlLCBzbyB3ZSBjYW4gZG8gcmVhZHMgYXQgdGhlIHNhbWUgdGltZSBhcyB3cml0ZXMKLSAgICBoUGlwZS5yZXNldChDcmVhdGVGaWxlKAotICAgICAgcGlwZW5hbWVfLmNfc3RyKCksCi0gICAgICBHRU5FUklDX1JFQUQgfCBHRU5FUklDX1dSSVRFLAotICAgICAgMCwgICAgICAgICAgICAgICAgICAgIC8vIG5vIHNoYXJpbmcKLSAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAvLyBkZWZhdWx0IHNlY3VyaXR5IGF0dHJpYnV0ZXMKLSAgICAgIE9QRU5fRVhJU1RJTkcsICAgICAgICAvLyBvcGVucyBleGlzdGluZyBwaXBlCi0gICAgICBmbGFncywKLSAgICAgIE5VTEwpKTsgICAgICAgICAgICAgICAvLyBubyB0ZW1wbGF0ZSBmaWxlCisgICAgaFBpcGUucmVzZXQoQ3JlYXRlRmlsZUEocGlwZW5hbWVfLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VORVJJQ19SRUFEIHwgR0VORVJJQ19XUklURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAvLyBubyBzaGFyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgICAgICAgICAgLy8gZGVmYXVsdCBzZWN1cml0eSBhdHRyaWJ1dGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BFTl9FWElTVElORywgLy8gb3BlbnMgZXhpc3RpbmcgcGlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKTsgLy8gbm8gdGVtcGxhdGUgZmlsZQogCiAgICAgaWYgKGhQaXBlLmggIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpCi0gICAgICBicmVhazsgLy9zdWNjZXNzIQorICAgICAgYnJlYWs7IC8vIHN1Y2Nlc3MhCiAKLSAgICBpZig6OkdldExhc3RFcnJvcigpICE9IEVSUk9SX1BJUEVfQlVTWSkKLSAgICB7CisgICAgaWYgKDo6R2V0TGFzdEVycm9yKCkgIT0gRVJST1JfUElQRV9CVVNZKSB7CiAgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUUGlwZTo6b3BlbiA6OkNyZWF0ZUZpbGUgZXJyb3JlZCBHTEU9IiwgOjpHZXRMYXN0RXJyb3IoKSk7CiAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiVW5hYmxlIHRvIG9wZW4gcGlwZSIpOwogICAgIH0KLSAgfSB3aGlsZSggOjpXYWl0TmFtZWRQaXBlKHBpcGVuYW1lXy5jX3N0cigpLCBUaW1lb3V0U2Vjb25kc18qMTAwMCkgKTsKKyAgfSB3aGlsZSAoOjpXYWl0TmFtZWRQaXBlQShwaXBlbmFtZV8uY19zdHIoKSwgVGltZW91dFNlY29uZHNfICogMTAwMCkpOwogCi0gIGlmKGhQaXBlLmggPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpCi0gIHsKKyAgaWYgKGhQaXBlLmggPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUUGlwZTo6b3BlbiA6OkNyZWF0ZUZpbGUgZXJyb3JlZCBHTEU9IiwgOjpHZXRMYXN0RXJyb3IoKSk7CiAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIlVuYWJsZSB0byBvcGVuIHBpcGUiKTsKICAgfQogCi0gIGltcGxfLnJlc2V0KG5ldyBUTmFtZWRQaXBlSW1wbChoUGlwZS5oKSk7Ci0gIGhQaXBlLnJlbGVhc2UoKTsKKyAgaW1wbF8ucmVzZXQobmV3IFROYW1lZFBpcGVJbXBsKGhQaXBlKSk7CiB9CiAKLQogdm9pZCBUUGlwZTo6Y2xvc2UoKSB7CiAgIGltcGxfLnJlc2V0KCk7CiB9CkBAIC0zMjMsMTcgKzMwNCwxNSBAQAogICByZXR1cm4gaW1wbF8tPnJlYWQoYnVmLCBsZW4pOwogfQogCi11aW50MzJfdCBwaXBlX3JlYWQoSEFORExFIHBpcGUsIHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKQotewotICBEV09SRCAgY2JSZWFkOwotICBpbnQgZlN1Y2Nlc3MgPSBSZWFkRmlsZSgKLSAgICAgICAgICAgICAgcGlwZSwgICAgIC8vIHBpcGUgaGFuZGxlCi0gICAgICAgICAgICAgIGJ1ZiwgICAgICAvLyBidWZmZXIgdG8gcmVjZWl2ZSByZXBseQotICAgICAgICAgICAgICBsZW4sICAgICAgLy8gc2l6ZSBvZiBidWZmZXIKLSAgICAgICAgICAgICAgJmNiUmVhZCwgIC8vIG51bWJlciBvZiBieXRlcyByZWFkCi0gICAgICAgICAgICAgIE5VTEwpOyAgICAvLyBub3Qgb3ZlcmxhcHBlZAordWludDMyX3QgcGlwZV9yZWFkKEhBTkRMRSBwaXBlLCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICBEV09SRCBjYlJlYWQ7CisgIGludCBmU3VjY2VzcyA9IFJlYWRGaWxlKHBpcGUsICAgIC8vIHBpcGUgaGFuZGxlCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiwgICAgIC8vIGJ1ZmZlciB0byByZWNlaXZlIHJlcGx5CisgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwgICAgIC8vIHNpemUgb2YgYnVmZmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjYlJlYWQsIC8vIG51bWJlciBvZiBieXRlcyByZWFkCisgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOyAgIC8vIG5vdCBvdmVybGFwcGVkCiAKLSAgaWYgKCAhZlN1Y2Nlc3MgJiYgR2V0TGFzdEVycm9yKCkgIT0gRVJST1JfTU9SRV9EQVRBICkKKyAgaWYgKCFmU3VjY2VzcyAmJiBHZXRMYXN0RXJyb3IoKSAhPSBFUlJPUl9NT1JFX0RBVEEpCiAgICAgcmV0dXJuIDA7IC8vIE5vIG1vcmUgZGF0YSwgcG9zc2libHkgYmVjYXVzZSBjbGllbnQgZGlzY29ubmVjdGVkLgogCiAgIHJldHVybiBjYlJlYWQ7CkBAIC0zNDUsMTcgKzMyNCwxNSBAQAogICBpbXBsXy0+d3JpdGUoYnVmLCBsZW4pOwogfQogCi12b2lkIHBpcGVfd3JpdGUoSEFORExFIHBpcGUsIGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKQotewotICBEV09SRCAgY2JXcml0dGVuOwotICBpbnQgZlN1Y2Nlc3MgPSBXcml0ZUZpbGUoCi0gICAgICAgICAgICAgIHBpcGUsICAgICAgIC8vIHBpcGUgaGFuZGxlCi0gICAgICAgICAgICAgIGJ1ZiwgICAgICAgIC8vIG1lc3NhZ2UKLSAgICAgICAgICAgICAgbGVuLCAgICAgICAgLy8gbWVzc2FnZSBsZW5ndGgKLSAgICAgICAgICAgICAgJmNiV3JpdHRlbiwgLy8gYnl0ZXMgd3JpdHRlbgotICAgICAgICAgICAgICBOVUxMKTsgICAgICAvLyBub3Qgb3ZlcmxhcHBlZAordm9pZCBwaXBlX3dyaXRlKEhBTkRMRSBwaXBlLCBjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICBEV09SRCBjYldyaXR0ZW47CisgIGludCBmU3VjY2VzcyA9IFdyaXRlRmlsZShwaXBlLCAgICAgICAvLyBwaXBlIGhhbmRsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmLCAgICAgICAgLy8gbWVzc2FnZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLCAgICAgICAgLy8gbWVzc2FnZSBsZW5ndGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZjYldyaXR0ZW4sIC8vIGJ5dGVzIHdyaXR0ZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOyAgICAgIC8vIG5vdCBvdmVybGFwcGVkCiAKLSAgaWYgKCAhZlN1Y2Nlc3MpCisgIGlmICghZlN1Y2Nlc3MpCiAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIldyaXRlIHRvIHBpcGUgZmFpbGVkIik7CiB9CiAKQEAgLTM2Myw1MSArMzQwLDU5IEBACiAvLyBBY2Nlc3NvcnMKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLXN0cmluZyBUUGlwZTo6Z2V0UGlwZW5hbWUoKSB7CitzdGQ6OnN0cmluZyBUUGlwZTo6Z2V0UGlwZW5hbWUoKSB7CiAgIHJldHVybiBwaXBlbmFtZV87CiB9CiAKLXZvaWQgVFBpcGU6OnNldFBpcGVuYW1lKGNvbnN0IHN0ZDo6c3RyaW5nICZwaXBlbmFtZSkgewotICBpZihwaXBlbmFtZS5maW5kKCJcXFxcIikgPT0gLTEpCit2b2lkIFRQaXBlOjpzZXRQaXBlbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgcGlwZW5hbWUpIHsKKyAgaWYgKHBpcGVuYW1lLmZpbmQoIlxcXFwiKSA9PSBzdGQ6OnN0cmluZzo6bnBvcykKICAgICBwaXBlbmFtZV8gPSAiXFxcXC5cXHBpcGVcXCIgKyBwaXBlbmFtZTsKICAgZWxzZQogICAgIHBpcGVuYW1lXyA9IHBpcGVuYW1lOwogfQogCiBIQU5ETEUgVFBpcGU6OmdldFBpcGVIYW5kbGUoKSB7Ci0gIGlmKGltcGxfKSByZXR1cm4gaW1wbF8tPmdldFBpcGVIYW5kbGUoKTsKKyAgaWYgKGltcGxfKQorICAgIHJldHVybiBpbXBsXy0+Z2V0UGlwZUhhbmRsZSgpOwogICByZXR1cm4gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CiB9CiAKIHZvaWQgVFBpcGU6OnNldFBpcGVIYW5kbGUoSEFORExFIHBpcGVoYW5kbGUpIHsKLSAgaWYoaXNBbm9ueW1vdXNfKQorICBpZiAoaXNBbm9ueW1vdXNfKQogICAgIGltcGxfLT5zZXRQaXBlSGFuZGxlKHBpcGVoYW5kbGUpOwogICBlbHNlCi0gICAgaW1wbF8ucmVzZXQobmV3IFROYW1lZFBpcGVJbXBsKHBpcGVoYW5kbGUpKTsKKyAgeworICAgIFRBdXRvSGFuZGxlIHBpcGUocGlwZWhhbmRsZSk7CisgICAgaW1wbF8ucmVzZXQobmV3IFROYW1lZFBpcGVJbXBsKHBpcGUpKTsKKyAgfQogfQogCiBIQU5ETEUgVFBpcGU6OmdldFdydFBpcGVIYW5kbGUoKSB7Ci0gIGlmKGltcGxfKSByZXR1cm4gaW1wbF8tPmdldFdydFBpcGVIYW5kbGUoKTsKKyAgaWYgKGltcGxfKQorICAgIHJldHVybiBpbXBsXy0+Z2V0V3J0UGlwZUhhbmRsZSgpOwogICByZXR1cm4gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CiB9CiAKIHZvaWQgVFBpcGU6OnNldFdydFBpcGVIYW5kbGUoSEFORExFIHBpcGVoYW5kbGUpIHsKLSAgaWYoaW1wbF8pIGltcGxfLT5zZXRXcnRQaXBlSGFuZGxlKHBpcGVoYW5kbGUpOworICBpZiAoaW1wbF8pCisgICAgaW1wbF8tPnNldFdydFBpcGVIYW5kbGUocGlwZWhhbmRsZSk7CiB9CiAKIEhBTkRMRSBUUGlwZTo6Z2V0TmF0aXZlV2FpdEhhbmRsZSgpIHsKLSAgaWYoaW1wbF8pIHJldHVybiBpbXBsXy0+Z2V0TmF0aXZlV2FpdEhhbmRsZSgpOworICBpZiAoaW1wbF8pCisgICAgcmV0dXJuIGltcGxfLT5nZXROYXRpdmVXYWl0SGFuZGxlKCk7CiAgIHJldHVybiBJTlZBTElEX0hBTkRMRV9WQUxVRTsKIH0KIAotbG9uZyBUUGlwZTo6Z2V0Q29ubmVjdFRpbWVvdXQoKSB7Citsb25nIFRQaXBlOjpnZXRDb25uVGltZW91dCgpIHsKICAgcmV0dXJuIFRpbWVvdXRTZWNvbmRzXzsKIH0KIAotdm9pZCBUUGlwZTo6c2V0Q29ubmVjdFRpbWVvdXQobG9uZyBzZWNvbmRzKSB7Cit2b2lkIFRQaXBlOjpzZXRDb25uVGltZW91dChsb25nIHNlY29uZHMpIHsKICAgVGltZW91dFNlY29uZHNfID0gc2Vjb25kczsKIH0KIAogI2VuZGlmIC8vX1dJTjMyCi0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFBpcGUuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFBpcGUuaAppbmRleCAyZTQ1MzljLi5hYTE0Zjk1IDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RQaXBlLmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UUGlwZS5oCkBAIC0yMywxMSArMjMsMTkgQEAKICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RWaXJ0dWFsVHJhbnNwb3J0Lmg+CiAjaWZuZGVmIF9XSU4zMgotIyAgaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0Lmg+CisjZW5kaWYKKyNpZmRlZiBfV0lOMzIKKyNpbmNsdWRlIDx0aHJpZnQvd2luZG93cy9TeW5jLmg+CiAjZW5kaWYKICNpbmNsdWRlIDxib29zdC9ub25jb3B5YWJsZS5ocHA+CisjaWZkZWYgX1dJTjMyCisjaW5jbHVkZSA8dGhyaWZ0L3dpbmRvd3MvU3luYy5oPgorI2VuZGlmCiAKLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHRyYW5zcG9ydCB7CituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CiAKIC8qKgogICogV2luZG93cyBQaXBlcyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVFRyYW5zcG9ydCBpbnRlcmZhY2UuCkBAIC0zOSwxNCArNDcsMTUgQEAKIGNsYXNzIFRQaXBlSW1wbDsKIAogY2xhc3MgVFBpcGUgOiBwdWJsaWMgVFZpcnR1YWxUcmFuc3BvcnQ8VFBpcGU+IHsKLSBwdWJsaWM6CitwdWJsaWM6CiAgIC8vIENvbnN0cnVjdHMgYSBuZXcgcGlwZSBvYmplY3QuCiAgIFRQaXBlKCk7CiAgIC8vIE5hbWVkIHBpcGUgY29uc3RydWN0b3JzIC0KLSAgZXhwbGljaXQgVFBpcGUoSEFORExFIFBpcGUpOyAvL0hBTkRMRSBpcyBhIHZvaWQqCi0gIC8vbmVlZCBhIGNvbnN0IGNoYXIgKiBvdmVybG9hZCBzbyBzdHJpbmcgbGl0ZXJhbHMgZG9uJ3QgZ28gdG8gdGhlIEhBTkRMRSBvdmVybG9hZAotICBleHBsaWNpdCBUUGlwZShjb25zdCBjaGFyICpwaXBlbmFtZSk7Ci0gIGV4cGxpY2l0IFRQaXBlKGNvbnN0IHN0ZDo6c3RyaW5nICZwaXBlbmFtZSk7CisgIGV4cGxpY2l0IFRQaXBlKEhBTkRMRSBQaXBlKTsgICAgICAgLy8gSEFORExFIGlzIGEgdm9pZCoKKyAgZXhwbGljaXQgVFBpcGUoVEF1dG9IYW5kbGUmIFBpcGUpOyAvLyB0aGlzIGN0b3Igd2lsbCBjbGVhciBvdXQgLyBtb3ZlIGZyb20gUGlwZQorICAvLyBuZWVkIGEgY29uc3QgY2hhciAqIG92ZXJsb2FkIHNvIHN0cmluZyBsaXRlcmFscyBkb24ndCBnbyB0byB0aGUgSEFORExFIG92ZXJsb2FkCisgIGV4cGxpY2l0IFRQaXBlKGNvbnN0IGNoYXIqIHBpcGVuYW1lKTsKKyAgZXhwbGljaXQgVFBpcGUoY29uc3Qgc3RkOjpzdHJpbmcmIHBpcGVuYW1lKTsKICAgLy8gQW5vbnltb3VzIHBpcGUgLQogICBUUGlwZShIQU5ETEUgUGlwZVJkLCBIQU5ETEUgUGlwZVdydCk7CiAKQEAgLTcxLDIyICs4MCwyMiBAQAogICAvLyBXcml0ZXMgdG8gdGhlIHBpcGUuCiAgIHZpcnR1YWwgdm9pZCB3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7CiAKLQotICAvL0FjY2Vzc29ycworICAvLyBBY2Nlc3NvcnMKICAgc3RkOjpzdHJpbmcgZ2V0UGlwZW5hbWUoKTsKLSAgdm9pZCBzZXRQaXBlbmFtZShjb25zdCBzdGQ6OnN0cmluZyAmcGlwZW5hbWUpOwotICBIQU5ETEUgZ2V0UGlwZUhhbmRsZSgpOyAvL2RvdWJsZXMgYXMgdGhlIHJlYWQgaGFuZGxlIGZvciBhbm9uIHBpcGUKKyAgdm9pZCBzZXRQaXBlbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgcGlwZW5hbWUpOworICBIQU5ETEUgZ2V0UGlwZUhhbmRsZSgpOyAvLyBkb3VibGVzIGFzIHRoZSByZWFkIGhhbmRsZSBmb3IgYW5vbiBwaXBlCiAgIHZvaWQgc2V0UGlwZUhhbmRsZShIQU5ETEUgcGlwZWhhbmRsZSk7CiAgIEhBTkRMRSBnZXRXcnRQaXBlSGFuZGxlKCk7CiAgIHZvaWQgc2V0V3J0UGlwZUhhbmRsZShIQU5ETEUgcGlwZWhhbmRsZSk7Ci0gIGxvbmcgZ2V0Q29ubmVjdFRpbWVvdXQoKTsKLSAgdm9pZCBzZXRDb25uZWN0VGltZW91dChsb25nIHNlY29uZHMpOworICBsb25nIGdldENvbm5UaW1lb3V0KCk7CisgIHZvaWQgc2V0Q29ublRpbWVvdXQobG9uZyBzZWNvbmRzKTsKIAotICAvL3RoaXMgZnVuY3Rpb24gaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBpbiBnZW5lcmljIC8gdGVtcGxhdGUgc2l0dWF0aW9ucywKLSAgLy9zbyBpdHMgbmFtZSBuZWVkcyB0byBiZSB0aGUgc2FtZSBhcyBUUGlwZVNlcnZlcidzCisgIC8vIHRoaXMgZnVuY3Rpb24gaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBpbiBnZW5lcmljIC8gdGVtcGxhdGUgc2l0dWF0aW9ucywKKyAgLy8gc28gaXRzIG5hbWUgbmVlZHMgdG8gYmUgdGhlIHNhbWUgYXMgVFBpcGVTZXJ2ZXIncwogICBIQU5ETEUgZ2V0TmF0aXZlV2FpdEhhbmRsZSgpOwotIHByaXZhdGU6Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQaXBlSW1wbD4gaW1wbF87CisKK3ByaXZhdGU6CisgIHN0ZDo6c2hhcmVkX3B0cjxUUGlwZUltcGw+IGltcGxfOwogCiAgIHN0ZDo6c3RyaW5nIHBpcGVuYW1lXzsKIApAQCAtOTcsOCArMTA2LDggQEAKICNlbHNlCiB0eXBlZGVmIFRTb2NrZXQgVFBpcGU7CiAjZW5kaWYKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAogCiAjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UUElQRV9IXwotCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RQaXBlU2VydmVyLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFBpcGVTZXJ2ZXIuY3BwCmluZGV4IGUxNGE5NGEuLjU1YzM1ODAgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFBpcGVTZXJ2ZXIuY3BwCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFBpcGVTZXJ2ZXIuY3BwCkBAIC0yMiw3MyArMjIsNzIgQEAKIAogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFBpcGUuaD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RQaXBlU2VydmVyLmg+Ci0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+CiAjaW5jbHVkZSA8Ym9vc3Qvbm9uY29weWFibGUuaHBwPgogCiAjaWZkZWYgX1dJTjMyCi0jICBpbmNsdWRlIDx0aHJpZnQvd2luZG93cy9PdmVybGFwcGVkU3VibWlzc2lvblRocmVhZC5oPgotIyAgaW5jbHVkZSA8QWNjQ3RybC5oPgotIyAgaW5jbHVkZSA8QWNsYXBpLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3dpbmRvd3MvT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQuaD4KKyNpbmNsdWRlIDxBY2NDdHJsLmg+CisjaW5jbHVkZSA8QWNsYXBpLmg+CiAjZW5kaWYgLy9fV0lOMzIKIAotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKIAogI2lmZGVmIF9XSU4zMgogCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7Cit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7CiAKIGNsYXNzIFRQaXBlU2VydmVySW1wbCA6IGJvb3N0Ojpub25jb3B5YWJsZSB7CiBwdWJsaWM6CiAgIFRQaXBlU2VydmVySW1wbCgpIHt9Ci0gIHZpcnR1YWwgflRQaXBlU2VydmVySW1wbCgpID0gMCB7fQorICB2aXJ0dWFsIH5UUGlwZVNlcnZlckltcGwoKSB7fQogICB2aXJ0dWFsIHZvaWQgaW50ZXJydXB0KCkgPSAwOwotICB2aXJ0dWFsIHZvaWQgY2xvc2UoKSA9IDA7Ci0gIHZpcnR1YWwgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gYWNjZXB0SW1wbCgpID0gMDsKKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gYWNjZXB0SW1wbCgpID0gMDsKIAogICB2aXJ0dWFsIEhBTkRMRSBnZXRQaXBlSGFuZGxlKCkgPSAwOwogICB2aXJ0dWFsIEhBTkRMRSBnZXRXcnRQaXBlSGFuZGxlKCkgPSAwOwotICB2aXJ0dWFsIEhBTkRMRSBnZXRDbGllbnRSZFBpcGVIYW5kbGUoKT0gMDsKLSAgdmlydHVhbCBIQU5ETEUgZ2V0Q2xpZW50V3J0UGlwZUhhbmRsZSgpPSAwOwotICB2aXJ0dWFsIEhBTkRMRSBnZXROYXRpdmVXYWl0SGFuZGxlKCkge3JldHVybiBOVUxMO30KKyAgdmlydHVhbCBIQU5ETEUgZ2V0Q2xpZW50UmRQaXBlSGFuZGxlKCkgPSAwOworICB2aXJ0dWFsIEhBTkRMRSBnZXRDbGllbnRXcnRQaXBlSGFuZGxlKCkgPSAwOworICB2aXJ0dWFsIEhBTkRMRSBnZXROYXRpdmVXYWl0SGFuZGxlKCkgeyByZXR1cm4gTlVMTDsgfQogfTsKIAogY2xhc3MgVEFub25QaXBlU2VydmVyIDogcHVibGljIFRQaXBlU2VydmVySW1wbCB7CiBwdWJsaWM6Ci0gIFRBbm9uUGlwZVNlcnZlcigpCi0gIHsKLSAgICAvL1RoZSBhbm9ueW1vdXMgcGlwZSBuZWVkcyB0byBiZSBjcmVhdGVkIGZpcnN0IHNvIHRoYXQgdGhlIHNlcnZlciBjYW4KLSAgICAvL3Bhc3MgdGhlIGhhbmRsZXMgb24gdG8gdGhlIGNsaWVudCBiZWZvcmUgdGhlIHNlcnZlIChhY2NlcHRJbXBsKQotICAgIC8vYmxvY2tpbmcgY2FsbC4KKyAgVEFub25QaXBlU2VydmVyKCkgeworICAgIC8vIFRoZSBhbm9ueW1vdXMgcGlwZSBuZWVkcyB0byBiZSBjcmVhdGVkIGZpcnN0IHNvIHRoYXQgdGhlIHNlcnZlciBjYW4KKyAgICAvLyBwYXNzIHRoZSBoYW5kbGVzIG9uIHRvIHRoZSBjbGllbnQgYmVmb3JlIHRoZSBzZXJ2ZSAoYWNjZXB0SW1wbCkKKyAgICAvLyBibG9ja2luZyBjYWxsLgogICAgIGlmICghY3JlYXRlQW5vblBpcGUoKSkgewogICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFBpcGVTZXJ2ZXIgQ3JlYXRlKEFub24pUGlwZSBmYWlsZWQsIEdMRT0iLCBHZXRMYXN0RXJyb3IoKSk7Ci0gICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiIFRQaXBlU2VydmVyIENyZWF0ZShBbm9uKVBpcGUgZmFpbGVkIik7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIFRQaXBlU2VydmVyIENyZWF0ZShBbm9uKVBpcGUgZmFpbGVkIik7CiAgICAgfQogICB9CiAKLSAgdmlydHVhbCB+VEFub25QaXBlU2VydmVyKCkge30KLQotICB2aXJ0dWFsIHZvaWQgaW50ZXJydXB0KCkge30gLy9ub3QgY3VycmVudGx5IGltcGxlbWVudGVkCi0gIHZpcnR1YWwgdm9pZCBjbG9zZSgpIHsKKyAgdmlydHVhbCB+VEFub25QaXBlU2VydmVyKCkgewogICAgIFBpcGVSXy5yZXNldCgpOwogICAgIFBpcGVXXy5yZXNldCgpOwogICAgIENsaWVudEFub25SZWFkXy5yZXNldCgpOwogICAgIENsaWVudEFub25Xcml0ZV8ucmVzZXQoKTsKICAgfQogCi0gIHZpcnR1YWwgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gYWNjZXB0SW1wbCgpOworICB2aXJ0dWFsIHZvaWQgaW50ZXJydXB0KCkge30gLy8gbm90IGN1cnJlbnRseSBpbXBsZW1lbnRlZAogCi0gIHZpcnR1YWwgSEFORExFIGdldFBpcGVIYW5kbGUoKSAgICAgICAgICB7cmV0dXJuIFBpcGVSXy5oO30KLSAgdmlydHVhbCBIQU5ETEUgZ2V0V3J0UGlwZUhhbmRsZSgpICAgICAgIHtyZXR1cm4gUGlwZVdfLmg7fQotICB2aXJ0dWFsIEhBTkRMRSBnZXRDbGllbnRSZFBpcGVIYW5kbGUoKSAge3JldHVybiBDbGllbnRBbm9uUmVhZF8uaDt9Ci0gIHZpcnR1YWwgSEFORExFIGdldENsaWVudFdydFBpcGVIYW5kbGUoKSB7cmV0dXJuIENsaWVudEFub25Xcml0ZV8uaDt9CisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGFjY2VwdEltcGwoKTsKKworICB2aXJ0dWFsIEhBTkRMRSBnZXRQaXBlSGFuZGxlKCkgeyByZXR1cm4gUGlwZVJfLmg7IH0KKyAgdmlydHVhbCBIQU5ETEUgZ2V0V3J0UGlwZUhhbmRsZSgpIHsgcmV0dXJuIFBpcGVXXy5oOyB9CisgIHZpcnR1YWwgSEFORExFIGdldENsaWVudFJkUGlwZUhhbmRsZSgpIHsgcmV0dXJuIENsaWVudEFub25SZWFkXy5oOyB9CisgIHZpcnR1YWwgSEFORExFIGdldENsaWVudFdydFBpcGVIYW5kbGUoKSB7IHJldHVybiBDbGllbnRBbm9uV3JpdGVfLmg7IH0KKwogcHJpdmF0ZToKICAgYm9vbCBjcmVhdGVBbm9uUGlwZSgpOwogCiAgIFRBdXRvSGFuZGxlIFBpcGVSXzsgLy8gQW5vbnltb3VzIFBpcGUgKFIpCiAgIFRBdXRvSGFuZGxlIFBpcGVXXzsgLy8gQW5vbnltb3VzIFBpcGUgKFcpCiAKLSAgLy9DbGllbnQgc2lkZSBhbm9ueW1vdXMgcGlwZSBoYW5kbGVzCisgIC8vIENsaWVudCBzaWRlIGFub255bW91cyBwaXBlIGhhbmRsZXMKICAgLy8/IERvIHdlIG5lZWQgZHVwbGljYXRlcyB0byBzZW5kIHRvIGNsaWVudD8KICAgVEF1dG9IYW5kbGUgQ2xpZW50QW5vblJlYWRfOwogICBUQXV0b0hhbmRsZSBDbGllbnRBbm9uV3JpdGVfOwpAQCAtOTYsNDggKzk1LDM4IEBACiAKIGNsYXNzIFROYW1lZFBpcGVTZXJ2ZXIgOiBwdWJsaWMgVFBpcGVTZXJ2ZXJJbXBsIHsKIHB1YmxpYzoKLSAgVE5hbWVkUGlwZVNlcnZlcigKLSAgICBjb25zdCBzdGQ6OnN0cmluZyAmcGlwZW5hbWUsCi0gICAgdWludDMyX3QgYnVmc2l6ZSwKLSAgICB1aW50MzJfdCBtYXhjb25uZWN0aW9ucykgOgotICAgICAgc3RvcHBpbmdfKGZhbHNlKSwKLSAgICAgIHBpcGVuYW1lXyhwaXBlbmFtZSksCi0gICAgICBidWZzaXplXyhidWZzaXplKSwKLSAgICAgIG1heGNvbm5zXyhtYXhjb25uZWN0aW9ucykKKyAgVE5hbWVkUGlwZVNlcnZlcihjb25zdCBzdGQ6OnN0cmluZyYgcGlwZW5hbWUsIHVpbnQzMl90IGJ1ZnNpemUsIHVpbnQzMl90IG1heGNvbm5lY3Rpb25zKQorICAgIDogc3RvcHBpbmdfKGZhbHNlKSwgcGlwZW5hbWVfKHBpcGVuYW1lKSwgYnVmc2l6ZV8oYnVmc2l6ZSksIG1heGNvbm5zXyhtYXhjb25uZWN0aW9ucykKICAgewogICAgIGNvbm5lY3RPdmVybGFwXy5hY3Rpb24gPSBUT3ZlcmxhcHBlZFdvcmtJdGVtOjpDT05ORUNUOwogICAgIGNhbmNlbE92ZXJsYXBfLmFjdGlvbiA9IFRPdmVybGFwcGVkV29ya0l0ZW06OkNBTkNFTElPOwotICAgIGluaXRpYXRlTmFtZWRDb25uZWN0KCk7CisgICAgVEF1dG9Dcml0IGxvY2socGlwZV9wcm90ZWN0Xyk7CisgICAgaW5pdGlhdGVOYW1lZENvbm5lY3QobG9jayk7CiAgIH0KICAgdmlydHVhbCB+VE5hbWVkUGlwZVNlcnZlcigpIHt9CiAKLSAgdmlydHVhbCB2b2lkIGludGVycnVwdCgpCi0gIHsKKyAgdmlydHVhbCB2b2lkIGludGVycnVwdCgpIHsKICAgICBUQXV0b0NyaXQgbG9jayhwaXBlX3Byb3RlY3RfKTsKICAgICBjYWNoZWRfY2xpZW50Xy5yZXNldCgpOwotICAgIGlmKFBpcGVfLmggIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKKyAgICBpZiAoUGlwZV8uaCAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgewogICAgICAgc3RvcHBpbmdfID0gdHJ1ZTsKICAgICAgIGNhbmNlbE92ZXJsYXBfLmggPSBQaXBlXy5oOwogICAgICAgLy8gVGhpcyBzaG91bGQgd2FrZSB1cCBHZXRPdmVybGFwcGVkUmVzdWx0CiAgICAgICB0aHJlYWRfLT5hZGRXb3JrSXRlbSgmY2FuY2VsT3ZlcmxhcF8pOwotICAgICAgY2xvc2UoKTsKICAgICB9CiAgIH0KIAotICB2aXJ0dWFsIHZvaWQgY2xvc2UoKSB7Ci0gICAgUGlwZV8ucmVzZXQoKTsKLSAgfQorICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBhY2NlcHRJbXBsKCk7CiAKLSAgdmlydHVhbCBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBhY2NlcHRJbXBsKCk7CisgIHZpcnR1YWwgSEFORExFIGdldFBpcGVIYW5kbGUoKSB7IHJldHVybiBQaXBlXy5oOyB9CisgIHZpcnR1YWwgSEFORExFIGdldFdydFBpcGVIYW5kbGUoKSB7IHJldHVybiBJTlZBTElEX0hBTkRMRV9WQUxVRTsgfQorICB2aXJ0dWFsIEhBTkRMRSBnZXRDbGllbnRSZFBpcGVIYW5kbGUoKSB7IHJldHVybiBJTlZBTElEX0hBTkRMRV9WQUxVRTsgfQorICB2aXJ0dWFsIEhBTkRMRSBnZXRDbGllbnRXcnRQaXBlSGFuZGxlKCkgeyByZXR1cm4gSU5WQUxJRF9IQU5ETEVfVkFMVUU7IH0KKyAgdmlydHVhbCBIQU5ETEUgZ2V0TmF0aXZlV2FpdEhhbmRsZSgpIHsgcmV0dXJuIGxpc3Rlbl9ldmVudF8uaDsgfQogCi0gIHZpcnR1YWwgSEFORExFIGdldFBpcGVIYW5kbGUoKSAgICAgICAgICB7cmV0dXJuIFBpcGVfLmg7fQotICB2aXJ0dWFsIEhBTkRMRSBnZXRXcnRQaXBlSGFuZGxlKCkgICAgICAge3JldHVybiBJTlZBTElEX0hBTkRMRV9WQUxVRTt9Ci0gIHZpcnR1YWwgSEFORExFIGdldENsaWVudFJkUGlwZUhhbmRsZSgpICB7cmV0dXJuIElOVkFMSURfSEFORExFX1ZBTFVFO30KLSAgdmlydHVhbCBIQU5ETEUgZ2V0Q2xpZW50V3J0UGlwZUhhbmRsZSgpIHtyZXR1cm4gSU5WQUxJRF9IQU5ETEVfVkFMVUU7fQotICB2aXJ0dWFsIEhBTkRMRSBnZXROYXRpdmVXYWl0SGFuZGxlKCkgICAge3JldHVybiBsaXN0ZW5fZXZlbnRfLmg7fQogcHJpdmF0ZToKLSAgYm9vbCBjcmVhdGVOYW1lZFBpcGUoKTsKLSAgdm9pZCBpbml0aWF0ZU5hbWVkQ29ubmVjdCgpOworICBib29sIGNyZWF0ZU5hbWVkUGlwZShjb25zdCBUQXV0b0NyaXQgJmxvY2tQcm9vZik7CisgIHZvaWQgaW5pdGlhdGVOYW1lZENvbm5lY3QoY29uc3QgVEF1dG9Dcml0ICZsb2NrUHJvb2YpOwogCiAgIFRBdXRvT3ZlcmxhcFRocmVhZCB0aHJlYWRfOwogICBUT3ZlcmxhcHBlZFdvcmtJdGVtIGNvbm5lY3RPdmVybGFwXzsKQEAgLTE0OCw1NCArMTM3LDQzIEBACiAgIHVpbnQzMl90IGJ1ZnNpemVfOwogICB1aW50MzJfdCBtYXhjb25uc187CiAgIFRNYW51YWxSZXNldEV2ZW50IGxpc3Rlbl9ldmVudF87Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQaXBlPiBjYWNoZWRfY2xpZW50XzsKLSAgVEF1dG9IYW5kbGUgUGlwZV87CisKICAgVENyaXRpY2FsU2VjdGlvbiBwaXBlX3Byb3RlY3RfOworICAvLyBvbmx5IHJlYWQgb3Igd3JpdGUgdGhlc2UgdmFyaWFibGVzIHVuZGVybmVhdGggYSBsb2NrZWQgcGlwZV9wcm90ZWN0XworICBzdGQ6OnNoYXJlZF9wdHI8VFBpcGU+IGNhY2hlZF9jbGllbnRfOworICBUQXV0b0hhbmRsZSBQaXBlXzsKIH07CiAKLUhBTkRMRSBUUGlwZVNlcnZlcjo6Z2V0TmF0aXZlV2FpdEhhbmRsZSgpCi17Ci0gIGlmKGltcGxfKSByZXR1cm4gaW1wbF8tPmdldE5hdGl2ZVdhaXRIYW5kbGUoKTsKK0hBTkRMRSBUUGlwZVNlcnZlcjo6Z2V0TmF0aXZlV2FpdEhhbmRsZSgpIHsKKyAgaWYgKGltcGxfKQorICAgIHJldHVybiBpbXBsXy0+Z2V0TmF0aXZlV2FpdEhhbmRsZSgpOwogICByZXR1cm4gTlVMTDsKIH0KIAogLy8tLS0tIENvbnN0cnVjdG9ycyAtLS0tCi1UUGlwZVNlcnZlcjo6VFBpcGVTZXJ2ZXIoY29uc3Qgc3RkOjpzdHJpbmcgJnBpcGVuYW1lLCB1aW50MzJfdCBidWZzaXplKSA6Ci0gIGJ1ZnNpemVfKGJ1ZnNpemUpLAotICBpc0Fub255bW91c18oZmFsc2UpCi17CitUUGlwZVNlcnZlcjo6VFBpcGVTZXJ2ZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHBpcGVuYW1lLCB1aW50MzJfdCBidWZzaXplKQorICA6IGJ1ZnNpemVfKGJ1ZnNpemUpLCBpc0Fub255bW91c18oZmFsc2UpIHsKICAgc2V0TWF4Q29ubmVjdGlvbnMoVFBJUEVfU0VSVkVSX01BWF9DT05OU19ERUZBVUxUKTsKICAgc2V0UGlwZW5hbWUocGlwZW5hbWUpOwogfQogCi1UUGlwZVNlcnZlcjo6VFBpcGVTZXJ2ZXIoY29uc3Qgc3RkOjpzdHJpbmcgJnBpcGVuYW1lLCB1aW50MzJfdCBidWZzaXplLCB1aW50MzJfdCBtYXhjb25uZWN0aW9ucykgOgotICBidWZzaXplXyhidWZzaXplKSwKLSAgaXNBbm9ueW1vdXNfKGZhbHNlKQoteworVFBpcGVTZXJ2ZXI6OlRQaXBlU2VydmVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBwaXBlbmFtZSwgdWludDMyX3QgYnVmc2l6ZSwgdWludDMyX3QgbWF4Y29ubmVjdGlvbnMpCisgIDogYnVmc2l6ZV8oYnVmc2l6ZSksIGlzQW5vbnltb3VzXyhmYWxzZSkgewogICBzZXRNYXhDb25uZWN0aW9ucyhtYXhjb25uZWN0aW9ucyk7CiAgIHNldFBpcGVuYW1lKHBpcGVuYW1lKTsKIH0KIAotVFBpcGVTZXJ2ZXI6OlRQaXBlU2VydmVyKGNvbnN0IHN0ZDo6c3RyaW5nICZwaXBlbmFtZSkgOgotICBidWZzaXplXygxMDI0KSwKLSAgaXNBbm9ueW1vdXNfKGZhbHNlKQoteworVFBpcGVTZXJ2ZXI6OlRQaXBlU2VydmVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBwaXBlbmFtZSkgOiBidWZzaXplXygxMDI0KSwgaXNBbm9ueW1vdXNfKGZhbHNlKSB7CiAgIHNldE1heENvbm5lY3Rpb25zKFRQSVBFX1NFUlZFUl9NQVhfQ09OTlNfREVGQVVMVCk7CiAgIHNldFBpcGVuYW1lKHBpcGVuYW1lKTsKIH0KIAotVFBpcGVTZXJ2ZXI6OlRQaXBlU2VydmVyKGludCBidWZzaXplKSA6Ci0gIGJ1ZnNpemVfKGJ1ZnNpemUpLAotICBpc0Fub255bW91c18odHJ1ZSkKLXsKK1RQaXBlU2VydmVyOjpUUGlwZVNlcnZlcihpbnQgYnVmc2l6ZSkgOiBidWZzaXplXyhidWZzaXplKSwgaXNBbm9ueW1vdXNfKHRydWUpIHsKICAgc2V0TWF4Q29ubmVjdGlvbnMoMSk7CiAgIGltcGxfLnJlc2V0KG5ldyBUQW5vblBpcGVTZXJ2ZXIpOwogfQogCi1UUGlwZVNlcnZlcjo6VFBpcGVTZXJ2ZXIoKSA6Ci0gIGJ1ZnNpemVfKDEwMjQpLAotICBpc0Fub255bW91c18odHJ1ZSkKLXsKK1RQaXBlU2VydmVyOjpUUGlwZVNlcnZlcigpIDogYnVmc2l6ZV8oMTAyNCksIGlzQW5vbnltb3VzXyh0cnVlKSB7CiAgIHNldE1heENvbm5lY3Rpb25zKDEpOwogICBpbXBsXy5yZXNldChuZXcgVEFub25QaXBlU2VydmVyKTsKIH0KQEAgLTIwNyw3ICsxODUsOCBAQAogLy8gVHJhbnNwb3J0IGNhbGxiYWNrcwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIHZvaWQgVFBpcGVTZXJ2ZXI6Omxpc3RlbigpIHsKLSAgaWYoaXNBbm9ueW1vdXNfKSByZXR1cm47CisgIGlmIChpc0Fub255bW91c18pCisgICAgcmV0dXJuOwogICBpbXBsXy5yZXNldChuZXcgVE5hbWVkUGlwZVNlcnZlcihwaXBlbmFtZV8sIGJ1ZnNpemVfLCBtYXhjb25uc18pKTsKIH0KIApAQCAtMjE2LDI3ICsxOTUsMjggQEAKIH0KIAogc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBUQW5vblBpcGVTZXJ2ZXI6OmFjY2VwdEltcGwoKSB7Ci0gIC8vVGhpcyAwLWJ5dGUgcmVhZCBzZXJ2ZXMgbWVyZWx5IGFzIGEgYmxvY2tpbmcgY2FsbC4KKyAgLy8gVGhpcyAwLWJ5dGUgcmVhZCBzZXJ2ZXMgbWVyZWx5IGFzIGEgYmxvY2tpbmcgY2FsbC4KICAgYnl0ZSBidWY7CiAgIERXT1JEIGJyOwotICBpbnQgZlN1Y2Nlc3MgPSBSZWFkRmlsZSgKLSAgICAgICAgUGlwZVJfLmgsIC8vIHBpcGUgaGFuZGxlCi0gICAgICAgICZidWYsICAgLy8gYnVmZmVyIHRvIHJlY2VpdmUgcmVwbHkKLSAgICAgICAgMCwgICAgICAvLyBzaXplIG9mIGJ1ZmZlcgotICAgICAgICAmYnIsICAgIC8vIG51bWJlciBvZiBieXRlcyByZWFkCi0gICAgICAgIE5VTEwpOyAgLy8gbm90IG92ZXJsYXBwZWQKKyAgaW50IGZTdWNjZXNzID0gUmVhZEZpbGUoUGlwZVJfLmgsIC8vIHBpcGUgaGFuZGxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICZidWYsICAgICAvLyBidWZmZXIgdG8gcmVjZWl2ZSByZXBseQorICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgLy8gc2l6ZSBvZiBidWZmZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmJyLCAgICAgIC8vIG51bWJlciBvZiBieXRlcyByZWFkCisgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOyAgICAvLyBub3Qgb3ZlcmxhcHBlZAogCi0gIGlmICggIWZTdWNjZXNzICYmIEdldExhc3RFcnJvcigpICE9IEVSUk9SX01PUkVfREFUQSApIHsKKyAgaWYgKCFmU3VjY2VzcyAmJiBHZXRMYXN0RXJyb3IoKSAhPSBFUlJPUl9NT1JFX0RBVEEpIHsKICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUUGlwZVNlcnZlciB1bmFibGUgdG8gaW5pdGlhdGUgcGlwZSBjb21tcywgR0xFPSIsIEdldExhc3RFcnJvcigpKTsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiIFRQaXBlU2VydmVyIHVuYWJsZSB0byBpbml0aWF0ZSBwaXBlIGNvbW1zIik7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgVFBpcGVTZXJ2ZXIgdW5hYmxlIHRvIGluaXRpYXRlIHBpcGUgY29tbXMiKTsKICAgfQogICBzaGFyZWRfcHRyPFRQaXBlPiBjbGllbnQobmV3IFRQaXBlKFBpcGVSXy5oLCBQaXBlV18uaCkpOwogICByZXR1cm4gY2xpZW50OwogfQogCi12b2lkIFROYW1lZFBpcGVTZXJ2ZXI6OmluaXRpYXRlTmFtZWRDb25uZWN0KCkgewotICBpZiAoc3RvcHBpbmdfKSByZXR1cm47Ci0gIGlmICghY3JlYXRlTmFtZWRQaXBlKCkpIHsKK3ZvaWQgVE5hbWVkUGlwZVNlcnZlcjo6aW5pdGlhdGVOYW1lZENvbm5lY3QoY29uc3QgVEF1dG9Dcml0ICZsb2NrUHJvb2YpIHsKKyAgaWYgKHN0b3BwaW5nXykKKyAgICByZXR1cm47CisgIGlmICghY3JlYXRlTmFtZWRQaXBlKGxvY2tQcm9vZikpIHsKICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUUGlwZVNlcnZlciBDcmVhdGVOYW1lZFBpcGUgZmFpbGVkLCBHTEU9IiwgR2V0TGFzdEVycm9yKCkpOwogICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICIgVFBpcGVTZXJ2ZXIgQ3JlYXRlTmFtZWRQaXBlIGZhaWxlZCIpOwogICB9CkBAIC0yNTAsODkgKzIzMCw5NSBAQAogICAvLyBXYWl0IGZvciB0aGUgY2xpZW50IHRvIGNvbm5lY3Q7IGlmIGl0IHN1Y2NlZWRzLCB0aGUKICAgLy8gZnVuY3Rpb24gcmV0dXJucyBhIG5vbnplcm8gdmFsdWUuIElmIHRoZSBmdW5jdGlvbiByZXR1cm5zCiAgIC8vIHplcm8sIEdldExhc3RFcnJvciBzaG91bGQgcmV0dXJuIEVSUk9SX1BJUEVfQ09OTkVDVEVELgotICBpZiggY29ubmVjdE92ZXJsYXBfLnN1Y2Nlc3MgKQotICB7CisgIGlmIChjb25uZWN0T3ZlcmxhcF8uc3VjY2VzcykgewogICAgIEdsb2JhbE91dHB1dC5wcmludGYoIkNsaWVudCBjb25uZWN0ZWQuIik7Ci0gICAgY2FjaGVkX2NsaWVudF8ucmVzZXQobmV3IFRQaXBlKFBpcGVfLmgpKTsKLSAgICBQaXBlXy5yZWxlYXNlKCk7CisgICAgY2FjaGVkX2NsaWVudF8ucmVzZXQobmV3IFRQaXBlKFBpcGVfKSk7CiAgICAgLy8gbWFrZSBzdXJlIHBlb3BsZSBrbm93IHRoYXQgYSBjb25uZWN0aW9uIGlzIHJlYWR5CiAgICAgU2V0RXZlbnQobGlzdGVuX2V2ZW50Xy5oKTsKICAgICByZXR1cm47CiAgIH0KIAogICBEV09SRCBkd0VyciA9IGNvbm5lY3RPdmVybGFwXy5sYXN0X2Vycm9yOwotICBzd2l0Y2goIGR3RXJyKQotICB7CisgIHN3aXRjaCAoZHdFcnIpIHsKICAgY2FzZSBFUlJPUl9QSVBFX0NPTk5FQ1RFRDoKICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJDbGllbnQgY29ubmVjdGVkLiIpOwotICAgIGNhY2hlZF9jbGllbnRfLnJlc2V0KG5ldyBUUGlwZShQaXBlXy5oKSk7Ci0gICAgUGlwZV8ucmVsZWFzZSgpOworICAgIGNhY2hlZF9jbGllbnRfLnJlc2V0KG5ldyBUUGlwZShQaXBlXykpOwogICAgIC8vIG1ha2Ugc3VyZSBwZW9wbGUga25vdyB0aGF0IGEgY29ubmVjdGlvbiBpcyByZWFkeQogICAgIFNldEV2ZW50KGxpc3Rlbl9ldmVudF8uaCk7CiAgICAgcmV0dXJuOwogICBjYXNlIEVSUk9SX0lPX1BFTkRJTkc6Ci0gICAgcmV0dXJuOyAvL2FjY2VwdEltcGwgd2lsbCBkbyB0aGUgYXBwcm9wcmlhdGUgV2FpdEZvck11bHRpcGxlT2JqZWN0cworICAgIHJldHVybjsgLy8gYWNjZXB0SW1wbCB3aWxsIGRvIHRoZSBhcHByb3ByaWF0ZSBXYWl0Rm9yTXVsdGlwbGVPYmplY3RzCiAgIGRlZmF1bHQ6CiAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFBpcGVTZXJ2ZXIgQ29ubmVjdE5hbWVkUGlwZSBmYWlsZWQsIEdMRT0iLCBkd0Vycik7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIiBUUGlwZVNlcnZlciBDb25uZWN0TmFtZWRQaXBlIGZhaWxlZCIpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIFRQaXBlU2VydmVyIENvbm5lY3ROYW1lZFBpcGUgZmFpbGVkIik7CiAgIH0KIH0KIAogc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBUTmFtZWRQaXBlU2VydmVyOjphY2NlcHRJbXBsKCkgewogICB7CiAgICAgVEF1dG9Dcml0IGxvY2socGlwZV9wcm90ZWN0Xyk7Ci0gICAgaWYoY2FjaGVkX2NsaWVudF8uZ2V0KCkgIT0gTlVMTCkKLSAgICB7CisgICAgaWYgKGNhY2hlZF9jbGllbnRfLmdldCgpICE9IE5VTEwpIHsKICAgICAgIHNoYXJlZF9wdHI8VFBpcGU+IGNsaWVudDsKLSAgICAgIC8vemVybyBvdXQgY2FjaGVkX2NsaWVudCwgc2luY2Ugd2UgYXJlIGFib3V0IHRvIHJldHVybiBpdC4KKyAgICAgIC8vIHplcm8gb3V0IGNhY2hlZF9jbGllbnQsIHNpbmNlIHdlIGFyZSBhYm91dCB0byByZXR1cm4gaXQuCiAgICAgICBjbGllbnQuc3dhcChjYWNoZWRfY2xpZW50Xyk7CiAKLSAgICAgIC8va2ljayBvZmYgdGhlIG5leHQgY29ubmVjdGlvbiBiZWZvcmUgcmV0dXJuaW5nCi0gICAgICBpbml0aWF0ZU5hbWVkQ29ubmVjdCgpOwotICAgICAgcmV0dXJuIGNsaWVudDsgIC8vc3VjY2VzcyEKKyAgICAgIC8vIGtpY2sgb2ZmIHRoZSBuZXh0IGNvbm5lY3Rpb24gYmVmb3JlIHJldHVybmluZworICAgICAgaW5pdGlhdGVOYW1lZENvbm5lY3QobG9jayk7CisgICAgICByZXR1cm4gY2xpZW50OyAvLyBzdWNjZXNzIQogICAgIH0KICAgfQogCi0gIGlmKFBpcGVfLmggPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKAotICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCi0gICAgICAiVE5hbWVkUGlwZVNlcnZlcjogc29tZW9uZSBjYWxsZWQgYWNjZXB0IG9uIGEgY2xvc2VkIHBpcGUgc2VydmVyIik7CisgIGlmIChQaXBlXy5oID09IElOVkFMSURfSEFORExFX1ZBTFVFKSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUTmFtZWRQaXBlU2VydmVyOiBzb21lb25lIGNhbGxlZCBhY2NlcHQgb24gYSBjbG9zZWQgcGlwZSBzZXJ2ZXIiKTsKICAgfQogCiAgIERXT1JEIGR3RHVtbXkgPSAwOwotICBpZihHZXRPdmVybGFwcGVkUmVzdWx0KFBpcGVfLmgsICZjb25uZWN0T3ZlcmxhcF8ub3ZlcmxhcCwgJmR3RHVtbXksIFRSVUUpKQotICB7CisKKyAgLy8gRm9yIHRoZSBtb3N0IHBhcnQsIFBpcGVfIHNob3VsZCBiZSBwcm90ZWN0ZWQgd2l0aCBwaXBlX3Byb3RlY3RfLiAgV2UgY2FuJ3QKKyAgLy8gcmVhc29uYWJseSBkbyB0aGF0IGhlcmUgdGhvdWdoIHdpdGhvdXQgYnJlYWtpbmcgaW50ZXJydXB0YWJpbGl0eS4gIEhvd2V2ZXIsCisgIC8vIHRoaXMgc2hvdWxkIGJlIHNhZmUsIHRob3VnaCBJJ20gbm90IGhhcHB5IGFib3V0IGl0LiAgV2Ugb25seSBuZWVkIHRvIGVuc3VyZQorICAvLyB0aGF0IG5vIG9uZSB3cml0ZXMgLyBtb2RpZmllcyBQaXBlXy5oIHdoaWxlIHdlIGFyZSByZWFkaW5nIGl0LiAgV2VsbCwgdGhlCisgIC8vIG9ubHkgdHdvIHRoaW5ncyB0aGF0IHNob3VsZCBiZSBtb2RpZnlpbmcgUGlwZV8gYXJlIGFjY2VwdEltcGwsIHRoZQorICAvLyBmdW5jdGlvbnMgaXQgY2FsbHMsIGFuZCB0aGUgZGVzdHJ1Y3Rvci4gIFRob3NlIHRoaW5ncyBzaG91bGRuJ3QgYmUgcnVuCisgIC8vIGNvbmN1cnJlbnRseSBhbnl3YXkuICBTbyB0aGlzIGNhbGwgaXMgJ3JlYWxseScganVzdCBhIHJlYWQgdGhhdCBtYXkgaGFwcGVuCisgIC8vIGNvbmN1cnJlbnRseSB3aXRoIGludGVycnVwdCwgYW5kIHRoYXQgc2hvdWxkIGJlIGZpbmUuCisgIGlmIChHZXRPdmVybGFwcGVkUmVzdWx0KFBpcGVfLmgsICZjb25uZWN0T3ZlcmxhcF8ub3ZlcmxhcCwgJmR3RHVtbXksIFRSVUUpKSB7CiAgICAgVEF1dG9Dcml0IGxvY2socGlwZV9wcm90ZWN0Xyk7CiAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiQ2xpZW50IGNvbm5lY3RlZC4iKTsKLSAgICBzaGFyZWRfcHRyPFRQaXBlPiBjbGllbnQobmV3IFRQaXBlKFBpcGVfLmgpKTsKLSAgICBQaXBlXy5yZWxlYXNlKCk7Ci0gICAgLy9raWNrIG9mZiB0aGUgbmV4dCBjb25uZWN0aW9uIGJlZm9yZSByZXR1cm5pbmcKLSAgICBpbml0aWF0ZU5hbWVkQ29ubmVjdCgpOwotICAgIHJldHVybiBjbGllbnQ7IC8vc3VjY2VzcyEKKyAgICBzaGFyZWRfcHRyPFRQaXBlPiBjbGllbnQobmV3IFRQaXBlKFBpcGVfKSk7CisgICAgLy8ga2ljayBvZmYgdGhlIG5leHQgY29ubmVjdGlvbiBiZWZvcmUgcmV0dXJuaW5nCisgICAgaW5pdGlhdGVOYW1lZENvbm5lY3QobG9jayk7CisgICAgcmV0dXJuIGNsaWVudDsgLy8gc3VjY2VzcyEKICAgfQotICAvL2lmIHdlIGdvdCBoZXJlLCB0aGVuIHdlIGFyZSBpbiBhbiBlcnJvciAvIHNodXRkb3duIGNhc2UKLSAgRFdPUkQgZ2xlID0gR2V0TGFzdEVycm9yKCk7IC8vc2F2ZSBlcnJvciBiZWZvcmUgZG9pbmcgY2xlYW51cAotICBjbG9zZSgpOworICAvLyBpZiB3ZSBnb3QgaGVyZSwgdGhlbiB3ZSBhcmUgaW4gYW4gZXJyb3IgLyBzaHV0ZG93biBjYXNlCisgIERXT1JEIGdsZSA9IEdldExhc3RFcnJvcigpOyAvLyBzYXZlIGVycm9yIGJlZm9yZSBkb2luZyBjbGVhbnVwCiAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRQaXBlU2VydmVyIENvbm5lY3ROYW1lZFBpcGUgR0xFPSIsIGdsZSk7CisgIGlmKGdsZSA9PSBFUlJPUl9PUEVSQVRJT05fQUJPUlRFRCkgeworICAgIFRBdXRvQ3JpdCBsb2NrKHBpcGVfcHJvdGVjdF8pOyAgICAJLy8gTmVlZGVkIHRvIGluc3VyZSBjb25jdXJyZW50IHRocmVhZCB0byBiZSBvdXQgb2YgaW50ZXJydXB0LgorICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6SU5URVJSVVBURUQsICJUUGlwZVNlcnZlcjogc2VydmVyIGludGVydXB0ZWQiKTsKKyAgfQogICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiVFBpcGVTZXJ2ZXI6IGNsaWVudCBjb25uZWN0aW9uIGZhaWxlZCIpOwogfQogCiB2b2lkIFRQaXBlU2VydmVyOjppbnRlcnJ1cHQoKSB7Ci0gIGlmKGltcGxfKSBpbXBsXy0+aW50ZXJydXB0KCk7CisgIGlmIChpbXBsXykKKyAgICBpbXBsXy0+aW50ZXJydXB0KCk7CiB9CiAKIHZvaWQgVFBpcGVTZXJ2ZXI6OmNsb3NlKCkgewotICBpZihpbXBsXykgaW1wbF8tPmNsb3NlKCk7CisgIGltcGxfLnJlc2V0KCk7CiB9CiAKK2Jvb2wgVE5hbWVkUGlwZVNlcnZlcjo6Y3JlYXRlTmFtZWRQaXBlKGNvbnN0IFRBdXRvQ3JpdCAmIC8qbG9ja1Byb29mKi8pIHsKIAotYm9vbCBUTmFtZWRQaXBlU2VydmVyOjpjcmVhdGVOYW1lZFBpcGUoKSB7Ci0KLSAgLy9XaW5kb3dzIC0gc2V0IHNlY3VyaXR5IHRvIGFsbG93IG5vbi1lbGV2YXRlZCBhcHBzCi0gIC8vdG8gYWNjZXNzIHBpcGVzIGNyZWF0ZWQgYnkgZWxldmF0ZWQgYXBwcy4KKyAgLy8gV2luZG93cyAtIHNldCBzZWN1cml0eSB0byBhbGxvdyBub24tZWxldmF0ZWQgYXBwcworICAvLyB0byBhY2Nlc3MgcGlwZXMgY3JlYXRlZCBieSBlbGV2YXRlZCBhcHBzLgogICBTSURfSURFTlRJRklFUl9BVVRIT1JJVFkgU0lEQXV0aFdvcmxkID0gU0VDVVJJVFlfV09STERfU0lEX0FVVEhPUklUWTsKICAgUFNJRCBldmVyeW9uZV9zaWQgPSBOVUxMOwotICBBbGxvY2F0ZUFuZEluaXRpYWxpemVTaWQoJlNJREF1dGhXb3JsZCwgMSwgU0VDVVJJVFlfV09STERfUklELCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAmZXZlcnlvbmVfc2lkKTsKKyAgQWxsb2NhdGVBbmRJbml0aWFsaXplU2lkKAorICAgICAgJlNJREF1dGhXb3JsZCwgMSwgU0VDVVJJVFlfV09STERfUklELCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAmZXZlcnlvbmVfc2lkKTsKIAogICBFWFBMSUNJVF9BQ0NFU1MgZWE7CiAgIFplcm9NZW1vcnkoJmVhLCBzaXplb2YoRVhQTElDSVRfQUNDRVNTKSk7CkBAIC0zNDEsMTIgKzMyNywxMiBAQAogICBlYS5ncmZJbmhlcml0YW5jZSA9IE5PX0lOSEVSSVRBTkNFOwogICBlYS5UcnVzdGVlLlRydXN0ZWVGb3JtID0gVFJVU1RFRV9JU19TSUQ7CiAgIGVhLlRydXN0ZWUuVHJ1c3RlZVR5cGUgPSBUUlVTVEVFX0lTX1dFTExfS05PV05fR1JPVVA7Ci0gIGVhLlRydXN0ZWUucHRzdHJOYW1lICA9IChMUFNUUilldmVyeW9uZV9zaWQ7CisgIGVhLlRydXN0ZWUucHRzdHJOYW1lID0gc3RhdGljX2Nhc3Q8TFBUU1RSPihldmVyeW9uZV9zaWQpOwogCiAgIFBBQ0wgYWNsID0gTlVMTDsKICAgU2V0RW50cmllc0luQWNsKDEsICZlYSwgTlVMTCwgJmFjbCk7CiAKLSAgUFNFQ1VSSVRZX0RFU0NSSVBUT1Igc2QgPSAoUFNFQ1VSSVRZX0RFU0NSSVBUT1IpTG9jYWxBbGxvYyhMUFRSLFNFQ1VSSVRZX0RFU0NSSVBUT1JfTUlOX0xFTkdUSCk7CisgIFBTRUNVUklUWV9ERVNDUklQVE9SIHNkID0gKFBTRUNVUklUWV9ERVNDUklQVE9SKUxvY2FsQWxsb2MoTFBUUiwgU0VDVVJJVFlfREVTQ1JJUFRPUl9NSU5fTEVOR1RIKTsKICAgSW5pdGlhbGl6ZVNlY3VyaXR5RGVzY3JpcHRvcihzZCwgU0VDVVJJVFlfREVTQ1JJUFRPUl9SRVZJU0lPTik7CiAgIFNldFNlY3VyaXR5RGVzY3JpcHRvckRhY2woc2QsIFRSVUUsIGFjbCwgRkFMU0UpOwogCkBAIC0zNTYsMjMgKzM0MiwyOCBAQAogICBzYS5iSW5oZXJpdEhhbmRsZSA9IEZBTFNFOwogCiAgIC8vIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgbmFtZWQgcGlwZQotICBUQXV0b0hhbmRsZSBoUGlwZShDcmVhdGVOYW1lZFBpcGUoCi0gICAgICAgIHBpcGVuYW1lXy5jX3N0cigpLCAgICAgICAgLy8gcGlwZSBuYW1lCi0gICAgICAgIFBJUEVfQUNDRVNTX0RVUExFWCB8ICAgICAgLy8gcmVhZC93cml0ZSBhY2Nlc3MKLSAgICAgICAgRklMRV9GTEFHX09WRVJMQVBQRUQsICAgICAvLyBhc3luYyBtb2RlCi0gICAgICAgIFBJUEVfVFlQRV9CWVRFIHwgICAgICAgICAgLy8gYnl0ZSB0eXBlIHBpcGUKLSAgICAgICAgUElQRV9SRUFETU9ERV9CWVRFLCAgICAgICAvLyBieXRlIHJlYWQgbW9kZQotICAgICAgICBtYXhjb25uc18sICAgICAgICAgICAgICAgIC8vIG1heC4gaW5zdGFuY2VzCi0gICAgICAgIGJ1ZnNpemVfLCAgICAgICAgICAgICAgICAgLy8gb3V0cHV0IGJ1ZmZlciBzaXplCi0gICAgICAgIGJ1ZnNpemVfLCAgICAgICAgICAgICAgICAgLy8gaW5wdXQgYnVmZmVyIHNpemUKLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBjbGllbnQgdGltZS1vdXQKLSAgICAgICAgJnNhKSk7ICAgICAgICAgICAgICAgICAgICAvLyBzZWN1cml0eSBhdHRyaWJ1dGVzCisgIFRBdXRvSGFuZGxlIGhQaXBlKENyZWF0ZU5hbWVkUGlwZUEocGlwZW5hbWVfLmNfc3RyKCksICAgIC8vIHBpcGUgbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBJUEVfQUNDRVNTX0RVUExFWCB8ICAvLyByZWFkL3dyaXRlIGFjY2VzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJTEVfRkxBR19PVkVSTEFQUEVELCAvLyBhc3luYyBtb2RlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUElQRV9UWVBFX0JZVEUgfCAgICAgIC8vIGJ5dGUgdHlwZSBwaXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUElQRV9SRUFETU9ERV9CWVRFLCAgIC8vIGJ5dGUgcmVhZCBtb2RlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4Y29ubnNfLCAgICAgICAgICAgIC8vIG1heC4gaW5zdGFuY2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmc2l6ZV8sICAgICAgICAgICAgIC8vIG91dHB1dCBidWZmZXIgc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZnNpemVfLCAgICAgICAgICAgICAvLyBpbnB1dCBidWZmZXIgc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAvLyBjbGllbnQgdGltZS1vdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2EpKTsgICAgICAgICAgICAgICAgLy8gc2VjdXJpdHkgYXR0cmlidXRlcwogCi0gIGlmKGhQaXBlLmggPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpCi0gIHsKKyAgRFdPUkQgbGFzdEVycm9yID0gR2V0TGFzdEVycm9yKCk7CisgIExvY2FsRnJlZShzZCk7CisgIExvY2FsRnJlZShhY2wpOworICBGcmVlU2lkKGV2ZXJ5b25lX3NpZCk7CisKKyAgaWYgKGhQaXBlLmggPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKICAgICBQaXBlXy5yZXNldCgpOwotICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRQaXBlU2VydmVyOjpUQ3JlYXRlTmFtZWRQaXBlKCkgR0xFPSIsIEdldExhc3RFcnJvcigpKTsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiVENyZWF0ZU5hbWVkUGlwZSgpIGZhaWxlZCIsIEdldExhc3RFcnJvcigpKTsKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUUGlwZVNlcnZlcjo6VENyZWF0ZU5hbWVkUGlwZSgpIEdMRT0iLCBsYXN0RXJyb3IpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVENyZWF0ZU5hbWVkUGlwZSgpIGZhaWxlZCIsCisgICAgICAgICAgICAgICAgbGFzdEVycm9yKTsKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KIApAQCAtMzgyLDIxICszNzMsMjEgQEAKIAogYm9vbCBUQW5vblBpcGVTZXJ2ZXI6OmNyZWF0ZUFub25QaXBlKCkgewogICBTRUNVUklUWV9BVFRSSUJVVEVTIHNhOwotICBTRUNVUklUWV9ERVNDUklQVE9SIHNkOyAvL3NlY3VyaXR5IGluZm9ybWF0aW9uIGZvciBwaXBlcworICBTRUNVUklUWV9ERVNDUklQVE9SIHNkOyAvLyBzZWN1cml0eSBpbmZvcm1hdGlvbiBmb3IgcGlwZXMKIAotICBJbml0aWFsaXplU2VjdXJpdHlEZXNjcmlwdG9yKCZzZCxTRUNVUklUWV9ERVNDUklQVE9SX1JFVklTSU9OKTsKKyAgSW5pdGlhbGl6ZVNlY3VyaXR5RGVzY3JpcHRvcigmc2QsIFNFQ1VSSVRZX0RFU0NSSVBUT1JfUkVWSVNJT04pOwogICBTZXRTZWN1cml0eURlc2NyaXB0b3JEYWNsKCZzZCwgdHJ1ZSwgTlVMTCwgZmFsc2UpOwogICBzYS5scFNlY3VyaXR5RGVzY3JpcHRvciA9ICZzZDsKICAgc2Eubkxlbmd0aCA9IHNpemVvZihTRUNVUklUWV9BVFRSSUJVVEVTKTsKLSAgc2EuYkluaGVyaXRIYW5kbGUgPSB0cnVlOyAvL2FsbG93IHBhc3NpbmcgaGFuZGxlIHRvIGNoaWxkCisgIHNhLmJJbmhlcml0SGFuZGxlID0gdHJ1ZTsgLy8gYWxsb3cgcGFzc2luZyBoYW5kbGUgdG8gY2hpbGQKIAogICBIQU5ETEUgQ2xpZW50QW5vblJlYWRILCBQaXBlV19ILCBDbGllbnRBbm9uV3JpdGVILCBQaXBlX0g7Ci0gIGlmICghQ3JlYXRlUGlwZSgmQ2xpZW50QW5vblJlYWRILCZQaXBlV19ILCZzYSwwKSkgICAvL2NyZWF0ZSBzdGRpbiBwaXBlCisgIGlmICghQ3JlYXRlUGlwZSgmQ2xpZW50QW5vblJlYWRILCAmUGlwZVdfSCwgJnNhLCAwKSkgLy8gY3JlYXRlIHN0ZGluIHBpcGUKICAgewogICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRQaXBlU2VydmVyIENyZWF0ZVBpcGUgKGFub24pIGZhaWxlZCwgR0xFPSIsIEdldExhc3RFcnJvcigpKTsKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KLSAgaWYgKCFDcmVhdGVQaXBlKCZQaXBlX0gsJkNsaWVudEFub25Xcml0ZUgsJnNhLDApKSAgLy9jcmVhdGUgc3Rkb3V0IHBpcGUKKyAgaWYgKCFDcmVhdGVQaXBlKCZQaXBlX0gsICZDbGllbnRBbm9uV3JpdGVILCAmc2EsIDApKSAvLyBjcmVhdGUgc3Rkb3V0IHBpcGUKICAgewogICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRQaXBlU2VydmVyIENyZWF0ZVBpcGUgKGFub24pIGZhaWxlZCwgR0xFPSIsIEdldExhc3RFcnJvcigpKTsKICAgICBDbG9zZUhhbmRsZShDbGllbnRBbm9uUmVhZEgpOwpAQCAtNDE1LDI5ICs0MDYsNDYgQEAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBBY2Nlc3NvcnMKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1zdHJpbmcgVFBpcGVTZXJ2ZXI6OmdldFBpcGVuYW1lKCkge3JldHVybiBwaXBlbmFtZV87fQorc3RkOjpzdHJpbmcgVFBpcGVTZXJ2ZXI6OmdldFBpcGVuYW1lKCkgeworICByZXR1cm4gcGlwZW5hbWVfOworfQogCi12b2lkIFRQaXBlU2VydmVyOjpzZXRQaXBlbmFtZShjb25zdCBzdGQ6OnN0cmluZyAmcGlwZW5hbWUpIHsKLSAgaWYocGlwZW5hbWUuZmluZCgiXFxcXCIpID09IC0xKQordm9pZCBUUGlwZVNlcnZlcjo6c2V0UGlwZW5hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHBpcGVuYW1lKSB7CisgIGlmIChwaXBlbmFtZS5maW5kKCJcXFxcIikgPT0gc3RkOjpzdHJpbmc6Om5wb3MpCiAgICAgcGlwZW5hbWVfID0gIlxcXFwuXFxwaXBlXFwiICsgcGlwZW5hbWU7CiAgIGVsc2UKICAgICBwaXBlbmFtZV8gPSBwaXBlbmFtZTsKIH0KIAotaW50ICBUUGlwZVNlcnZlcjo6Z2V0QnVmZmVyU2l6ZSgpIHtyZXR1cm4gYnVmc2l6ZV87fQotdm9pZCBUUGlwZVNlcnZlcjo6c2V0QnVmZmVyU2l6ZShpbnQgYnVmc2l6ZSkge2J1ZnNpemVfID0gYnVmc2l6ZTt9CitpbnQgVFBpcGVTZXJ2ZXI6OmdldEJ1ZmZlclNpemUoKSB7CisgIHJldHVybiBidWZzaXplXzsKK30KK3ZvaWQgVFBpcGVTZXJ2ZXI6OnNldEJ1ZmZlclNpemUoaW50IGJ1ZnNpemUpIHsKKyAgYnVmc2l6ZV8gPSBidWZzaXplOworfQogCi1IQU5ETEUgVFBpcGVTZXJ2ZXI6OmdldFBpcGVIYW5kbGUoKSAgICAgICAgICB7cmV0dXJuIGltcGxfP2ltcGxfLT5nZXRQaXBlSGFuZGxlKCkgICAgICAgICA6SU5WQUxJRF9IQU5ETEVfVkFMVUU7fQotSEFORExFIFRQaXBlU2VydmVyOjpnZXRXcnRQaXBlSGFuZGxlKCkgICAgICAge3JldHVybiBpbXBsXz9pbXBsXy0+Z2V0V3J0UGlwZUhhbmRsZSgpICAgICAgOklOVkFMSURfSEFORExFX1ZBTFVFO30KLUhBTkRMRSBUUGlwZVNlcnZlcjo6Z2V0Q2xpZW50UmRQaXBlSGFuZGxlKCkgIHtyZXR1cm4gaW1wbF8/aW1wbF8tPmdldENsaWVudFJkUGlwZUhhbmRsZSgpIDpJTlZBTElEX0hBTkRMRV9WQUxVRTt9Ci1IQU5ETEUgVFBpcGVTZXJ2ZXI6OmdldENsaWVudFdydFBpcGVIYW5kbGUoKSB7cmV0dXJuIGltcGxfP2ltcGxfLT5nZXRDbGllbnRXcnRQaXBlSGFuZGxlKCk6SU5WQUxJRF9IQU5ETEVfVkFMVUU7fQorSEFORExFIFRQaXBlU2VydmVyOjpnZXRQaXBlSGFuZGxlKCkgeworICByZXR1cm4gaW1wbF8gPyBpbXBsXy0+Z2V0UGlwZUhhbmRsZSgpIDogSU5WQUxJRF9IQU5ETEVfVkFMVUU7Cit9CitIQU5ETEUgVFBpcGVTZXJ2ZXI6OmdldFdydFBpcGVIYW5kbGUoKSB7CisgIHJldHVybiBpbXBsXyA/IGltcGxfLT5nZXRXcnRQaXBlSGFuZGxlKCkgOiBJTlZBTElEX0hBTkRMRV9WQUxVRTsKK30KK0hBTkRMRSBUUGlwZVNlcnZlcjo6Z2V0Q2xpZW50UmRQaXBlSGFuZGxlKCkgeworICByZXR1cm4gaW1wbF8gPyBpbXBsXy0+Z2V0Q2xpZW50UmRQaXBlSGFuZGxlKCkgOiBJTlZBTElEX0hBTkRMRV9WQUxVRTsKK30KK0hBTkRMRSBUUGlwZVNlcnZlcjo6Z2V0Q2xpZW50V3J0UGlwZUhhbmRsZSgpIHsKKyAgcmV0dXJuIGltcGxfID8gaW1wbF8tPmdldENsaWVudFdydFBpcGVIYW5kbGUoKSA6IElOVkFMSURfSEFORExFX1ZBTFVFOworfQogCi1ib29sIFRQaXBlU2VydmVyOjpnZXRBbm9ueW1vdXMoKSB7IHJldHVybiBpc0Fub255bW91c187IH0KLXZvaWQgVFBpcGVTZXJ2ZXI6OnNldEFub255bW91cyhib29sIGFub24pIHsgaXNBbm9ueW1vdXNfID0gYW5vbjt9Citib29sIFRQaXBlU2VydmVyOjpnZXRBbm9ueW1vdXMoKSB7CisgIHJldHVybiBpc0Fub255bW91c187Cit9Cit2b2lkIFRQaXBlU2VydmVyOjpzZXRBbm9ueW1vdXMoYm9vbCBhbm9uKSB7CisgIGlzQW5vbnltb3VzXyA9IGFub247Cit9CiAKLXZvaWQgVFBpcGVTZXJ2ZXI6OnNldE1heENvbm5lY3Rpb25zKHVpbnQzMl90IG1heGNvbm5lY3Rpb25zKQotewotICBpZihtYXhjb25uZWN0aW9ucyA9PSAwKQordm9pZCBUUGlwZVNlcnZlcjo6c2V0TWF4Q29ubmVjdGlvbnModWludDMyX3QgbWF4Y29ubmVjdGlvbnMpIHsKKyAgaWYgKG1heGNvbm5lY3Rpb25zID09IDApCiAgICAgbWF4Y29ubnNfID0gMTsKICAgZWxzZSBpZiAobWF4Y29ubmVjdGlvbnMgPiBQSVBFX1VOTElNSVRFRF9JTlNUQU5DRVMpCiAgICAgbWF4Y29ubnNfID0gUElQRV9VTkxJTUlURURfSU5TVEFOQ0VTOwpAQCAtNDQ2LDUgKzQ1NCw2IEBACiB9CiAKICNlbmRpZiAvL19XSU4zMgotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RQaXBlU2VydmVyLmggYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RQaXBlU2VydmVyLmgKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCA5OGVjZGUwLi5jOWIxM2U1Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFBpcGVTZXJ2ZXIuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RQaXBlU2VydmVyLmgKQEAgLTIwLDE4ICsyMCwyMCBAQAogI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UU0VSVkVSV0lOUElQRVNfSF8KICNkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfVFNFUlZFUldJTlBJUEVTX0hfIDEKIAorI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJUcmFuc3BvcnQuaD4KLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KICNpZm5kZWYgX1dJTjMyCi0jICBpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuaD4KICNlbmRpZgogI2lmZGVmIF9XSU4zMgotIyAgaW5jbHVkZSA8dGhyaWZ0L3dpbmRvd3MvU3luYy5oPgorI2luY2x1ZGUgPHRocmlmdC93aW5kb3dzL1N5bmMuaD4KICNlbmRpZgogCiAjZGVmaW5lIFRQSVBFX1NFUlZFUl9NQVhfQ09OTlNfREVGQVVMVCBQSVBFX1VOTElNSVRFRF9JTlNUQU5DRVMKIAotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKIAogLyoqCiAgKiBXaW5kb3dzIFBpcGVzIGltcGxlbWVudGF0aW9uIG9mIFRTZXJ2ZXJUcmFuc3BvcnQuCkBAIC00NCwzMCArNDYsMzAgQEAKIGNsYXNzIFRQaXBlOwogCiBjbGFzcyBUUGlwZVNlcnZlciA6IHB1YmxpYyBUU2VydmVyVHJhbnNwb3J0IHsKLSBwdWJsaWM6Ci0gIC8vQ29uc3RydWN0b3JzCitwdWJsaWM6CisgIC8vIENvbnN0cnVjdG9ycwogICAvLyBOYW1lZCBQaXBlIC0KLSAgVFBpcGVTZXJ2ZXIoY29uc3Qgc3RkOjpzdHJpbmcgJnBpcGVuYW1lLCB1aW50MzJfdCBidWZzaXplKTsKLSAgVFBpcGVTZXJ2ZXIoY29uc3Qgc3RkOjpzdHJpbmcgJnBpcGVuYW1lLCB1aW50MzJfdCBidWZzaXplLCB1aW50MzJfdCBtYXhjb25uZWN0aW9ucyk7Ci0gIFRQaXBlU2VydmVyKGNvbnN0IHN0ZDo6c3RyaW5nICZwaXBlbmFtZSk7CisgIFRQaXBlU2VydmVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBwaXBlbmFtZSwgdWludDMyX3QgYnVmc2l6ZSk7CisgIFRQaXBlU2VydmVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBwaXBlbmFtZSwgdWludDMyX3QgYnVmc2l6ZSwgdWludDMyX3QgbWF4Y29ubmVjdGlvbnMpOworICBUUGlwZVNlcnZlcihjb25zdCBzdGQ6OnN0cmluZyYgcGlwZW5hbWUpOwogICAvLyBBbm9ueW1vdXMgcGlwZSAtCiAgIFRQaXBlU2VydmVyKGludCBidWZzaXplKTsKICAgVFBpcGVTZXJ2ZXIoKTsKIAotICAvL0Rlc3RydWN0b3IKKyAgLy8gRGVzdHJ1Y3RvcgogICB2aXJ0dWFsIH5UUGlwZVNlcnZlcigpOwogCi0gIC8vU3RhbmRhcmQgdHJhbnNwb3J0IGNhbGxiYWNrcworICAvLyBTdGFuZGFyZCB0cmFuc3BvcnQgY2FsbGJhY2tzCiAgIHZpcnR1YWwgdm9pZCBpbnRlcnJ1cHQoKTsKICAgdmlydHVhbCB2b2lkIGNsb3NlKCk7CiAgIHZpcnR1YWwgdm9pZCBsaXN0ZW4oKTsKIAotICAvL0FjY2Vzc29ycworICAvLyBBY2Nlc3NvcnMKICAgc3RkOjpzdHJpbmcgZ2V0UGlwZW5hbWUoKTsKLSAgdm9pZCBzZXRQaXBlbmFtZShjb25zdCBzdGQ6OnN0cmluZyAmcGlwZW5hbWUpOwotICBpbnQgIGdldEJ1ZmZlclNpemUoKTsKKyAgdm9pZCBzZXRQaXBlbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgcGlwZW5hbWUpOworICBpbnQgZ2V0QnVmZmVyU2l6ZSgpOwogICB2b2lkIHNldEJ1ZmZlclNpemUoaW50IGJ1ZnNpemUpOwotICBIQU5ETEUgZ2V0UGlwZUhhbmRsZSgpOyAgLy9OYW1lZCBQaXBlIFIvVyAtb3ItIEFub255bW91cyBwaXBlIFJlYWQgaGFuZGxlCisgIEhBTkRMRSBnZXRQaXBlSGFuZGxlKCk7IC8vIE5hbWVkIFBpcGUgUi9XIC1vci0gQW5vbnltb3VzIHBpcGUgUmVhZCBoYW5kbGUKICAgSEFORExFIGdldFdydFBpcGVIYW5kbGUoKTsKICAgSEFORExFIGdldENsaWVudFJkUGlwZUhhbmRsZSgpOwogICBIQU5ETEUgZ2V0Q2xpZW50V3J0UGlwZUhhbmRsZSgpOwpAQCAtNzUsMTQgKzc3LDE1IEBACiAgIHZvaWQgc2V0QW5vbnltb3VzKGJvb2wgYW5vbik7CiAgIHZvaWQgc2V0TWF4Q29ubmVjdGlvbnModWludDMyX3QgbWF4Y29ubmVjdGlvbnMpOwogCi0gIC8vdGhpcyBmdW5jdGlvbiBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGluIGdlbmVyaWMgLyB0ZW1wbGF0ZSBzaXR1YXRpb25zLAotICAvL3NvIGl0cyBuYW1lIG5lZWRzIHRvIGJlIHRoZSBzYW1lIGFzIFRQaXBlJ3MKKyAgLy8gdGhpcyBmdW5jdGlvbiBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGluIGdlbmVyaWMgLyB0ZW1wbGF0ZSBzaXR1YXRpb25zLAorICAvLyBzbyBpdHMgbmFtZSBuZWVkcyB0byBiZSB0aGUgc2FtZSBhcyBUUGlwZSdzCiAgIEhBTkRMRSBnZXROYXRpdmVXYWl0SGFuZGxlKCk7Ci1wcm90ZWN0ZWQ6Ci0gIHZpcnR1YWwgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gYWNjZXB0SW1wbCgpOwogCi0gcHJpdmF0ZToKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFBpcGVTZXJ2ZXJJbXBsPiBpbXBsXzsKK3Byb3RlY3RlZDoKKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gYWNjZXB0SW1wbCgpOworCitwcml2YXRlOgorICBzdGQ6OnNoYXJlZF9wdHI8VFBpcGVTZXJ2ZXJJbXBsPiBpbXBsXzsKIAogICBzdGQ6OnN0cmluZyBwaXBlbmFtZV87CiAgIHVpbnQzMl90IGJ1ZnNpemVfOwpAQCAtOTMsNyArOTYsOCBAQAogLy8qTklYIG5hbWVkIHBpcGUgaW1wbGVtZW50YXRpb24gdXNlcyBkb21haW4gc29ja2V0CiB0eXBlZGVmIFRTZXJ2ZXJTb2NrZXQgVFBpcGVTZXJ2ZXI7CiAjZW5kaWYKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAogCiAjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UU0VSVkVSV0lOUElQRVNfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNTTFNlcnZlclNvY2tldC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTU0xTZXJ2ZXJTb2NrZXQuY3BwCmluZGV4IDQ1MzAxZjguLjM0NjA1YzAgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNTTFNlcnZlclNvY2tldC5jcHAKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU1NMU2VydmVyU29ja2V0LmNwcApAQCAtMjAsMjYgKzIwLDQxIEBACiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU1NMU2VydmVyU29ja2V0Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU1NMU29ja2V0Lmg+CiAKLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHRyYW5zcG9ydCB7CituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CiAKIC8qKgogICogU1NMIHNlcnZlciBzb2NrZXQgaW1wbGVtZW50YXRpb24uCiAgKi8KLVRTU0xTZXJ2ZXJTb2NrZXQ6OlRTU0xTZXJ2ZXJTb2NrZXQoVEhSSUZUX1NPQ0tFVCBwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gZmFjdG9yeSk6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRTZXJ2ZXJTb2NrZXQocG9ydCksIGZhY3RvcnlfKGZhY3RvcnkpIHsKK1RTU0xTZXJ2ZXJTb2NrZXQ6OlRTU0xTZXJ2ZXJTb2NrZXQoaW50IHBvcnQsIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gZmFjdG9yeSkKKyAgOiBUU2VydmVyU29ja2V0KHBvcnQpLCBmYWN0b3J5XyhmYWN0b3J5KSB7CiAgIGZhY3RvcnlfLT5zZXJ2ZXIodHJ1ZSk7CiB9CiAKLVRTU0xTZXJ2ZXJTb2NrZXQ6OlRTU0xTZXJ2ZXJTb2NrZXQoaW50IHBvcnQsIGludCBzZW5kVGltZW91dCwgaW50IHJlY3ZUaW1lb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gZmFjdG9yeSk6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRTZXJ2ZXJTb2NrZXQocG9ydCwgc2VuZFRpbWVvdXQsIHJlY3ZUaW1lb3V0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yeV8oZmFjdG9yeSkgeworVFNTTFNlcnZlclNvY2tldDo6VFNTTFNlcnZlclNvY2tldChjb25zdCBzdGQ6OnN0cmluZyYgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gZmFjdG9yeSkKKyAgOiBUU2VydmVyU29ja2V0KGFkZHJlc3MsIHBvcnQpLCBmYWN0b3J5XyhmYWN0b3J5KSB7CiAgIGZhY3RvcnlfLT5zZXJ2ZXIodHJ1ZSk7CiB9CiAKLWJvb3N0OjpzaGFyZWRfcHRyPFRTb2NrZXQ+IFRTU0xTZXJ2ZXJTb2NrZXQ6OmNyZWF0ZVNvY2tldChUSFJJRlRfU09DS0VUIGNsaWVudCkgewotICByZXR1cm4gZmFjdG9yeV8tPmNyZWF0ZVNvY2tldChjbGllbnQpOworVFNTTFNlcnZlclNvY2tldDo6VFNTTFNlcnZlclNvY2tldChpbnQgcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlbmRUaW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVjdlRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gZmFjdG9yeSkKKyAgOiBUU2VydmVyU29ja2V0KHBvcnQsIHNlbmRUaW1lb3V0LCByZWN2VGltZW91dCksIGZhY3RvcnlfKGZhY3RvcnkpIHsKKyAgZmFjdG9yeV8tPnNlcnZlcih0cnVlKTsKIH0KIAotfX19CitzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gVFNTTFNlcnZlclNvY2tldDo6Y3JlYXRlU29ja2V0KFRIUklGVF9TT0NLRVQgY2xpZW50KSB7CisgIGlmIChpbnRlcnJ1cHRhYmxlQ2hpbGRyZW5fKSB7CisgICAgICByZXR1cm4gZmFjdG9yeV8tPmNyZWF0ZVNvY2tldChjbGllbnQsIHBDaGlsZEludGVycnVwdFNvY2tSZWFkZXJfKTsKKworICB9IGVsc2UgeworICAgICAgcmV0dXJuIGZhY3RvcnlfLT5jcmVhdGVTb2NrZXQoY2xpZW50KTsKKyAgfQorfQorfQorfQorfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU1NMU2VydmVyU29ja2V0LmggYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTU0xTZXJ2ZXJTb2NrZXQuaAppbmRleCAzYTRiNDRkLi44Yjc1ZGU4IDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTU0xTZXJ2ZXJTb2NrZXQuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTU0xTZXJ2ZXJTb2NrZXQuaApAQCAtMjAsNDAgKzIwLDU3IEBACiAjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RTU0xTRVJWRVJTT0NLRVRfSF8KICNkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfVFNTTFNFUlZFUlNPQ0tFVF9IXyAxCiAKLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuaD4KIAotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKIAogY2xhc3MgVFNTTFNvY2tldEZhY3Rvcnk7CiAKIC8qKgogICogU2VydmVyIHNvY2tldCB0aGF0IGFjY2VwdHMgU1NMIGNvbm5lY3Rpb25zLgogICovCi1jbGFzcyBUU1NMU2VydmVyU29ja2V0OiBwdWJsaWMgVFNlcnZlclNvY2tldCB7Ci0gcHVibGljOgorY2xhc3MgVFNTTFNlcnZlclNvY2tldCA6IHB1YmxpYyBUU2VydmVyU29ja2V0IHsKK3B1YmxpYzoKICAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgorICAgKiBDb25zdHJ1Y3Rvci4gIEJpbmRzIHRvIGFsbCBpbnRlcmZhY2VzLgogICAgKgogICAgKiBAcGFyYW0gcG9ydCAgICBMaXN0ZW5pbmcgcG9ydAogICAgKiBAcGFyYW0gZmFjdG9yeSBTU0wgc29ja2V0IGZhY3RvcnkgaW1wbGVtZW50YXRpb24KICAgICovCi0gIFRTU0xTZXJ2ZXJTb2NrZXQoVEhSSUZUX1NPQ0tFVCBwb3J0LCBib29zdDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gZmFjdG9yeSk7CisgIFRTU0xTZXJ2ZXJTb2NrZXQoaW50IHBvcnQsIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gZmFjdG9yeSk7CisKICAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgorICAgKiBDb25zdHJ1Y3Rvci4gIEJpbmRzIHRvIHRoZSBzcGVjaWZpZWQgYWRkcmVzcy4KKyAgICoKKyAgICogQHBhcmFtIGFkZHJlc3MgQWRkcmVzcyB0byBiaW5kIHRvCisgICAqIEBwYXJhbSBwb3J0ICAgIExpc3RlbmluZyBwb3J0CisgICAqIEBwYXJhbSBmYWN0b3J5IFNTTCBzb2NrZXQgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbgorICAgKi8KKyAgVFNTTFNlcnZlclNvY2tldChjb25zdCBzdGQ6OnN0cmluZyYgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICBpbnQgcG9ydCwKKyAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IGZhY3RvcnkpOworCisgIC8qKgorICAgKiBDb25zdHJ1Y3Rvci4gIEJpbmRzIHRvIGFsbCBpbnRlcmZhY2VzLgogICAgKgogICAgKiBAcGFyYW0gcG9ydCAgICAgICAgTGlzdGVuaW5nIHBvcnQKICAgICogQHBhcmFtIHNlbmRUaW1lb3V0IFNvY2tldCBzZW5kIHRpbWVvdXQKICAgICogQHBhcmFtIHJlY3ZUaW1lb3V0IFNvY2tldCByZWNlaXZlIHRpbWVvdXQKICAgICogQHBhcmFtIGZhY3RvcnkgICAgIFNTTCBzb2NrZXQgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbgogICAgKi8KLSAgVFNTTFNlcnZlclNvY2tldChpbnQgcG9ydCwgaW50IHNlbmRUaW1lb3V0LCBpbnQgcmVjdlRpbWVvdXQsCi0gICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IGZhY3RvcnkpOwotIHByb3RlY3RlZDoKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNvY2tldD4gY3JlYXRlU29ja2V0KFRIUklGVF9TT0NLRVQgc29ja2V0KTsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IGZhY3RvcnlfOwotfTsKKyAgVFNTTFNlcnZlclNvY2tldChpbnQgcG9ydCwKKyAgICAgICAgICAgICAgICAgICBpbnQgc2VuZFRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgaW50IHJlY3ZUaW1lb3V0LAorICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gZmFjdG9yeSk7CiAKLX19fQorcHJvdGVjdGVkOgorICBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gY3JlYXRlU29ja2V0KFRIUklGVF9TT0NLRVQgc29ja2V0KTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBmYWN0b3J5XzsKK307Cit9Cit9Cit9CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU1NMU29ja2V0LmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNTTFNvY2tldC5jcHAKaW5kZXggZmQyODVkYi4uNzE4ZTliMSAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU1NMU29ja2V0LmNwcAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTU0xTb2NrZXQuY3BwCkBAIC0yMSw2ICsyMSw3IEBACiAKICNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxjc3RyaW5nPgogI2lmZGVmIEhBVkVfQVJQQV9JTkVUX0gKICNpbmNsdWRlIDxhcnBhL2luZXQuaD4KICNlbmRpZgpAQCAtMjgsOCArMjksMjEgQEAKICNpZmRlZiBIQVZFX1NZU19TT0NLRVRfSAogI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KICNlbmRpZgotI2luY2x1ZGUgPGJvb3N0L2xleGljYWxfY2FzdC5ocHA+CisjaWZkZWYgSEFWRV9TWVNfUE9MTF9ICisjaW5jbHVkZSA8c3lzL3BvbGwuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfRkNOVExfSAorI2luY2x1ZGUgPGZjbnRsLmg+CisjZW5kaWYKKworI2RlZmluZSBPUEVOU1NMX1ZFUlNJT05fTk9fVEhSRUFEX0lEX0JFRk9SRSAgICAweDEwMDAwMDAwTAorI2RlZmluZSBPUEVOU1NMX0VOR0lORV9DTEVBTlVQX1JFUVVJUkVEX0JFRk9SRSAweDEwMTAwMDAwTAorCiAjaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX2FycmF5LmhwcD4KKyNpbmNsdWRlIDxvcGVuc3NsL29wZW5zc2x2Lmg+CisjaWYgKE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPCBPUEVOU1NMX0VOR0lORV9DTEVBTlVQX1JFUVVJUkVEX0JFRk9SRSkKKyNpbmNsdWRlIDxvcGVuc3NsL2VuZ2luZS5oPgorI2VuZGlmCiAjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KICNpbmNsdWRlIDxvcGVuc3NsL3JhbmQuaD4KICNpbmNsdWRlIDxvcGVuc3NsL3NzbC5oPgpAQCAtMzcsMTcgKzUxLDE4IEBACiAjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L011dGV4Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU1NMU29ja2V0Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9QbGF0Zm9ybVNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC9UVG9TdHJpbmcuaD4KIAotI2RlZmluZSBPUEVOU1NMX1ZFUlNJT05fTk9fVEhSRUFEX0lEIDB4MTAwMDAwMDBMCi0KLXVzaW5nIG5hbWVzcGFjZSBzdGQ7CiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OwordXNpbmcgc3RkOjpzdHJpbmc7CiAKIHN0cnVjdCBDUllQVE9fZHlubG9ja192YWx1ZSB7CiAgIE11dGV4IG11dGV4OwogfTsKIAotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKIAogLy8gT3BlblNTTCBpbml0aWFsaXphdGlvbi9jbGVhbnVwCiAKQEAgLTU2LDE1ICs3MSwyMiBAQAogCiBzdGF0aWMgdm9pZCBjYWxsYmFja0xvY2tpbmcoaW50IG1vZGUsIGludCBuLCBjb25zdCBjaGFyKiwgaW50KSB7CiAgIGlmIChtb2RlICYgQ1JZUFRPX0xPQ0spIHsKKyAgICAvLyBhc3NlcnRpb24gb2YgKHB4ICE9IDApIGhlcmUgdHlwaWNhbGx5IG1lYW5zIHRoYXQgYSBUU1NMU29ja2V0J3MgbGlmZXRpbWUKKyAgICAvLyBleGNlZWRlZCB0aGUgbGlmZXRpbWUgb2YgdGhlIFRTU0xTb2NrZXRGYWN0b3J5IHRoYXQgY3JlYXRlZCBpdCwgYW5kIHRoZQorICAgIC8vIFRTU0xTb2NrZXRGYWN0b3J5IGFscmVhZHkgcmFuIGNsZWFudXBPcGVuU1NMKCksIHdoaWNoIGRlbGV0ZWQgIm11dGV4ZXMiLgogICAgIG11dGV4ZXNbbl0ubG9jaygpOwogICB9IGVsc2UgewogICAgIG11dGV4ZXNbbl0udW5sb2NrKCk7CiAgIH0KIH0KIAotI2lmIChPUEVOU1NMX1ZFUlNJT05fTlVNQkVSIDwgT1BFTlNTTF9WRVJTSU9OX05PX1RIUkVBRF9JRCkKKyNpZiAoT1BFTlNTTF9WRVJTSU9OX05VTUJFUiA8IE9QRU5TU0xfVkVSU0lPTl9OT19USFJFQURfSURfQkVGT1JFKQogc3RhdGljIHVuc2lnbmVkIGxvbmcgY2FsbGJhY2tUaHJlYWRJRCgpIHsKLSAgcmV0dXJuICh1bnNpZ25lZCBsb25nKSBwdGhyZWFkX3NlbGYoKTsKKyNpZmRlZiBfV0lOMzIKKyAgcmV0dXJuICh1bnNpZ25lZCBsb25nKUdldEN1cnJlbnRUaHJlYWRJZCgpOworI2Vsc2UKKyAgcmV0dXJuICh1bnNpZ25lZCBsb25nKXB0aHJlYWRfc2VsZigpOworI2VuZGlmCiB9CiAjZW5kaWYKIApAQCAtNzIsOSArOTQsNyBAQAogICByZXR1cm4gbmV3IENSWVBUT19keW5sb2NrX3ZhbHVlOwogfQogCi1zdGF0aWMgdm9pZCBkeW5fbG9jayhpbnQgbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBDUllQVE9fZHlubG9ja192YWx1ZSogbG9jaywKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqLCBpbnQpIHsKK3N0YXRpYyB2b2lkIGR5bl9sb2NrKGludCBtb2RlLCBzdHJ1Y3QgQ1JZUFRPX2R5bmxvY2tfdmFsdWUqIGxvY2ssIGNvbnN0IGNoYXIqLCBpbnQpIHsKICAgaWYgKGxvY2sgIT0gTlVMTCkgewogICAgIGlmIChtb2RlICYgQ1JZUFRPX0xPQ0spIHsKICAgICAgIGxvY2stPm11dGV4LmxvY2soKTsKQEAgLTk1LDE3ICsxMTUsMjIgQEAKICAgb3BlblNTTEluaXRpYWxpemVkID0gdHJ1ZTsKICAgU1NMX2xpYnJhcnlfaW5pdCgpOwogICBTU0xfbG9hZF9lcnJvcl9zdHJpbmdzKCk7CisgIEVSUl9sb2FkX2NyeXB0b19zdHJpbmdzKCk7CisKICAgLy8gc3RhdGljIGxvY2tpbmcKLSAgbXV0ZXhlcyA9IGJvb3N0OjpzaGFyZWRfYXJyYXk8TXV0ZXg+KG5ldyBNdXRleFs6OkNSWVBUT19udW1fbG9ja3MoKV0pOwotICBpZiAobXV0ZXhlcyA9PSBOVUxMKSB7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpJTlRFUk5BTF9FUlJPUiwKLSAgICAgICAgICAiaW5pdGlhbGl6ZU9wZW5TU0woKSBmYWlsZWQsICIKLSAgICAgICAgICAib3V0IG9mIG1lbW9yeSB3aGlsZSBjcmVhdGluZyBtdXRleCBhcnJheSIpOwotICB9Ci0jaWYgKE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPCBPUEVOU1NMX1ZFUlNJT05fTk9fVEhSRUFEX0lEKQorICAvLyBuZXdlciB2ZXJzaW9ucyBvZiBPcGVuU1NMIGNoYW5nZWQgQ1JZUFRPX251bV9sb2NrcyAtIHNlZSBUSFJJRlQtMzg3OAorI2lmZGVmIENSWVBUT19udW1fbG9ja3MKKyAgbXV0ZXhlcyA9IGJvb3N0OjpzaGFyZWRfYXJyYXk8TXV0ZXg+KG5ldyBNdXRleFtDUllQVE9fbnVtX2xvY2tzKCldKTsKKyNlbHNlCisgIG11dGV4ZXMgPSBib29zdDo6c2hhcmVkX2FycmF5PE11dGV4PihuZXcgTXV0ZXhbIDo6Q1JZUFRPX251bV9sb2NrcygpXSk7CisjZW5kaWYKKworI2lmIChPUEVOU1NMX1ZFUlNJT05fTlVNQkVSIDwgT1BFTlNTTF9WRVJTSU9OX05PX1RIUkVBRF9JRF9CRUZPUkUpCiAgIENSWVBUT19zZXRfaWRfY2FsbGJhY2soY2FsbGJhY2tUaHJlYWRJRCk7CiAjZW5kaWYKKwogICBDUllQVE9fc2V0X2xvY2tpbmdfY2FsbGJhY2soY2FsbGJhY2tMb2NraW5nKTsKKwogICAvLyBkeW5hbWljIGxvY2tpbmcKICAgQ1JZUFRPX3NldF9keW5sb2NrX2NyZWF0ZV9jYWxsYmFjayhkeW5fY3JlYXRlKTsKICAgQ1JZUFRPX3NldF9keW5sb2NrX2xvY2tfY2FsbGJhY2soZHluX2xvY2spOwpAQCAtMTE3LDQ4ICsxNDIsNDAgQEAKICAgICByZXR1cm47CiAgIH0KICAgb3BlblNTTEluaXRpYWxpemVkID0gZmFsc2U7Ci0jaWYgKE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPCBPUEVOU1NMX1ZFUlNJT05fTk9fVEhSRUFEX0lEKQotICBDUllQVE9fc2V0X2lkX2NhbGxiYWNrKE5VTEwpOworCisgIC8vIGh0dHBzOi8vd2lraS5vcGVuc3NsLm9yZy9pbmRleC5waHAvTGlicmFyeV9Jbml0aWFsaXphdGlvbiNDbGVhbnVwCisgIC8vIHdlIHB1cnBvc2VmdWxseSBkbyBOT1QgY2FsbCBGSVBTX21vZGVfc2V0KDApIGFuZCBsZWF2ZSBpdCB1cCB0byB0aGUgZW5jbG9zaW5nIGFwcGxpY2F0aW9uIHRvIG1hbmFnZSBGSVBTIGVudGlyZWx5CisjaWYgKE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPCBPUEVOU1NMX0VOR0lORV9DTEVBTlVQX1JFUVVJUkVEX0JFRk9SRSkKKyAgRU5HSU5FX2NsZWFudXAoKTsgICAgICAgICAgICAgLy8gaHR0cHM6Ly93d3cub3BlbnNzbC5vcmcvZG9jcy9tYW4xLjEuMC9jcnlwdG8vRU5HSU5FX2NsZWFudXAuaHRtbCAtIGNsZWFudXAgY2FsbCBpcyBuZWVkZWQgYmVmb3JlIDEuMS4wCiAjZW5kaWYKLSAgQ1JZUFRPX3NldF9sb2NraW5nX2NhbGxiYWNrKE5VTEwpOwotICBDUllQVE9fc2V0X2R5bmxvY2tfY3JlYXRlX2NhbGxiYWNrKE5VTEwpOwotICBDUllQVE9fc2V0X2R5bmxvY2tfbG9ja19jYWxsYmFjayhOVUxMKTsKLSAgQ1JZUFRPX3NldF9keW5sb2NrX2Rlc3Ryb3lfY2FsbGJhY2soTlVMTCk7Ci0gIENSWVBUT19jbGVhbnVwX2FsbF9leF9kYXRhKCk7Ci0gIEVSUl9mcmVlX3N0cmluZ3MoKTsKKyAgQ09ORl9tb2R1bGVzX3VubG9hZCgxKTsKICAgRVZQX2NsZWFudXAoKTsKKyAgQ1JZUFRPX2NsZWFudXBfYWxsX2V4X2RhdGEoKTsKICAgRVJSX3JlbW92ZV9zdGF0ZSgwKTsKKyAgRVJSX2ZyZWVfc3RyaW5ncygpOworCiAgIG11dGV4ZXMucmVzZXQoKTsKIH0KIAotc3RhdGljIHZvaWQgYnVpbGRFcnJvcnMoc3RyaW5nJiBtZXNzYWdlLCBpbnQgZXJyb3IgPSAwKTsKK3N0YXRpYyB2b2lkIGJ1aWxkRXJyb3JzKHN0cmluZyYgbWVzc2FnZSwgaW50IGVycm5vX2NvcHkgPSAwLCBpbnQgc3NsZXJybm8gPSAwKTsKIHN0YXRpYyBib29sIG1hdGNoTmFtZShjb25zdCBjaGFyKiBob3N0LCBjb25zdCBjaGFyKiBwYXR0ZXJuLCBpbnQgc2l6ZSk7CiBzdGF0aWMgY2hhciB1cHBlcmNhc2UoY2hhciBjKTsKIAogLy8gU1NMQ29udGV4dCBpbXBsZW1lbnRhdGlvbgogU1NMQ29udGV4dDo6U1NMQ29udGV4dChjb25zdCBTU0xQcm90b2NvbCYgcHJvdG9jb2wpIHsKLSAgaWYocHJvdG9jb2wgPT0gU1NMVExTKQotICB7CisgIGlmIChwcm90b2NvbCA9PSBTU0xUTFMpIHsKICAgICBjdHhfID0gU1NMX0NUWF9uZXcoU1NMdjIzX21ldGhvZCgpKTsKLSAgfQotICBlbHNlIGlmKHByb3RvY29sID09IFNTTHYzKQotICB7CisjaWZuZGVmIE9QRU5TU0xfTk9fU1NMMworICB9IGVsc2UgaWYgKHByb3RvY29sID09IFNTTHYzKSB7CiAgICAgY3R4XyA9IFNTTF9DVFhfbmV3KFNTTHYzX21ldGhvZCgpKTsKLSAgfQotICBlbHNlIGlmKHByb3RvY29sID09IFRMU3YxXzApCi0gIHsKKyNlbmRpZgorICB9IGVsc2UgaWYgKHByb3RvY29sID09IFRMU3YxXzApIHsKICAgICBjdHhfID0gU1NMX0NUWF9uZXcoVExTdjFfbWV0aG9kKCkpOwotICB9Ci0gIGVsc2UgaWYocHJvdG9jb2wgPT0gVExTdjFfMSkKLSAgeworICB9IGVsc2UgaWYgKHByb3RvY29sID09IFRMU3YxXzEpIHsKICAgICBjdHhfID0gU1NMX0NUWF9uZXcoVExTdjFfMV9tZXRob2QoKSk7Ci0gIH0KLSAgZWxzZSBpZihwcm90b2NvbCA9PSBUTFN2MV8yKQotICB7CisgIH0gZWxzZSBpZiAocHJvdG9jb2wgPT0gVExTdjFfMikgewogICAgIGN0eF8gPSBTU0xfQ1RYX25ldyhUTFN2MV8yX21ldGhvZCgpKTsKLSAgfQotICBlbHNlCi0gIHsKKyAgfSBlbHNlIHsKICAgICAvLy8gVU5LTk9XTiBQUk9UT0NPTCEKICAgICB0aHJvdyBUU1NMRXhjZXB0aW9uKCJTU0xfQ1RYX25ldzogVW5rbm93biBwcm90b2NvbCIpOwogICB9CkBAIC0xNzAsMTAgKzE4NywxMSBAQAogICB9CiAgIFNTTF9DVFhfc2V0X21vZGUoY3R4XywgU1NMX01PREVfQVVUT19SRVRSWSk7CiAKLSAgLy8gRGlzYWJsZSBob3JyaWJseSBpbnNlY3VyZSBTU0x2MiEKLSAgaWYocHJvdG9jb2wgPT0gU1NMVExTKQotICB7Ci0gICAgU1NMX0NUWF9zZXRfb3B0aW9ucyhjdHhfLCBTU0xfT1BfTk9fU1NMdjIpOworICAvLyBEaXNhYmxlIGhvcnJpYmx5IGluc2VjdXJlIFNTTHYyIGFuZCBTU0x2MyBwcm90b2NvbHMgYnV0IGFsbG93IGEgaGFuZHNoYWtlCisgIC8vIHdpdGggb2xkZXIgY2xpZW50cyBzbyB0aGV5IGdldCBhIGdyYWNlZnVsIGRlbmlhbC4KKyAgaWYgKHByb3RvY29sID09IFNTTFRMUykgeworICAgICAgU1NMX0NUWF9zZXRfb3B0aW9ucyhjdHhfLCBTU0xfT1BfTk9fU1NMdjIpOworICAgICAgU1NMX0NUWF9zZXRfb3B0aW9ucyhjdHhfLCBTU0xfT1BfTk9fU1NMdjMpOyAgIC8vIFRIUklGVC0zMTY0CiAgIH0KIH0KIApAQCAtMTk1LDUzICsyMTMsMTEzIEBACiB9CiAKIC8vIFRTU0xTb2NrZXQgaW1wbGVtZW50YXRpb24KLVRTU0xTb2NrZXQ6OlRTU0xTb2NrZXQoYm9vc3Q6OnNoYXJlZF9wdHI8U1NMQ29udGV4dD4gY3R4KToKLSAgVFNvY2tldCgpLCBzZXJ2ZXJfKGZhbHNlKSwgc3NsXyhOVUxMKSwgY3R4XyhjdHgpIHsKK1RTU0xTb2NrZXQ6OlRTU0xTb2NrZXQoc3RkOjpzaGFyZWRfcHRyPFNTTENvbnRleHQ+IGN0eCkKKyAgOiBUU29ja2V0KCksIHNlcnZlcl8oZmFsc2UpLCBzc2xfKE5VTEwpLCBjdHhfKGN0eCkgeworICBpbml0KCk7CiB9CiAKLVRTU0xTb2NrZXQ6OlRTU0xTb2NrZXQoYm9vc3Q6OnNoYXJlZF9wdHI8U1NMQ29udGV4dD4gY3R4LCBUSFJJRlRfU09DS0VUIHNvY2tldCk6Ci0gIFRTb2NrZXQoc29ja2V0KSwgc2VydmVyXyhmYWxzZSksIHNzbF8oTlVMTCksIGN0eF8oY3R4KSB7CitUU1NMU29ja2V0OjpUU1NMU29ja2V0KHN0ZDo6c2hhcmVkX3B0cjxTU0xDb250ZXh0PiBjdHgsIHN0ZDo6c2hhcmVkX3B0cjxUSFJJRlRfU09DS0VUPiBpbnRlcnJ1cHRMaXN0ZW5lcikKKyAgICAgICAgOiBUU29ja2V0KCksIHNlcnZlcl8oZmFsc2UpLCBzc2xfKE5VTEwpLCBjdHhfKGN0eCkgeworICBpbml0KCk7CisgIGludGVycnVwdExpc3RlbmVyXyA9IGludGVycnVwdExpc3RlbmVyOwogfQogCi1UU1NMU29ja2V0OjpUU1NMU29ja2V0KGJvb3N0OjpzaGFyZWRfcHRyPFNTTENvbnRleHQ+IGN0eCwgc3RyaW5nIGhvc3QsIGludCBwb3J0KToKLSAgVFNvY2tldChob3N0LCBwb3J0KSwgc2VydmVyXyhmYWxzZSksIHNzbF8oTlVMTCksIGN0eF8oY3R4KSB7CitUU1NMU29ja2V0OjpUU1NMU29ja2V0KHN0ZDo6c2hhcmVkX3B0cjxTU0xDb250ZXh0PiBjdHgsIFRIUklGVF9TT0NLRVQgc29ja2V0KQorICA6IFRTb2NrZXQoc29ja2V0KSwgc2VydmVyXyhmYWxzZSksIHNzbF8oTlVMTCksIGN0eF8oY3R4KSB7CisgIGluaXQoKTsKK30KKworVFNTTFNvY2tldDo6VFNTTFNvY2tldChzdGQ6OnNoYXJlZF9wdHI8U1NMQ29udGV4dD4gY3R4LCBUSFJJRlRfU09DS0VUIHNvY2tldCwgc3RkOjpzaGFyZWRfcHRyPFRIUklGVF9TT0NLRVQ+IGludGVycnVwdExpc3RlbmVyKQorICAgICAgICA6IFRTb2NrZXQoc29ja2V0LCBpbnRlcnJ1cHRMaXN0ZW5lciksIHNlcnZlcl8oZmFsc2UpLCBzc2xfKE5VTEwpLCBjdHhfKGN0eCkgeworICBpbml0KCk7Cit9CisKK1RTU0xTb2NrZXQ6OlRTU0xTb2NrZXQoc3RkOjpzaGFyZWRfcHRyPFNTTENvbnRleHQ+IGN0eCwgc3RyaW5nIGhvc3QsIGludCBwb3J0KQorICA6IFRTb2NrZXQoaG9zdCwgcG9ydCksIHNlcnZlcl8oZmFsc2UpLCBzc2xfKE5VTEwpLCBjdHhfKGN0eCkgeworICBpbml0KCk7Cit9CisKK1RTU0xTb2NrZXQ6OlRTU0xTb2NrZXQoc3RkOjpzaGFyZWRfcHRyPFNTTENvbnRleHQ+IGN0eCwgc3RyaW5nIGhvc3QsIGludCBwb3J0LCBzdGQ6OnNoYXJlZF9wdHI8VEhSSUZUX1NPQ0tFVD4gaW50ZXJydXB0TGlzdGVuZXIpCisgICAgICAgIDogVFNvY2tldChob3N0LCBwb3J0KSwgc2VydmVyXyhmYWxzZSksIHNzbF8oTlVMTCksIGN0eF8oY3R4KSB7CisgIGluaXQoKTsKKyAgaW50ZXJydXB0TGlzdGVuZXJfID0gaW50ZXJydXB0TGlzdGVuZXI7CiB9CiAKIFRTU0xTb2NrZXQ6On5UU1NMU29ja2V0KCkgewogICBjbG9zZSgpOwogfQogCitib29sIFRTU0xTb2NrZXQ6Omhhc1BlbmRpbmdEYXRhVG9SZWFkKCkgeworICBpZiAoIWlzT3BlbigpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGluaXRpYWxpemVIYW5kc2hha2UoKTsKKyAgaWYgKCFjaGVja0hhbmRzaGFrZSgpKQorICAgIHRocm93IFRTU0xFeGNlcHRpb24oIlRTU0xTb2NrZXQ6Omhhc1BlbmRpbmdEYXRhVG9SZWFkOiBIYW5kc2hha2UgaXMgbm90IGNvbXBsZXRlZCIpOworICAvLyBkYXRhIG1heSBiZSBhdmFpbGFibGUgaW4gU1NMIGJ1ZmZlcnMgKG5vdGU6IFNTTF9wZW5kaW5nIGRvZXMgbm90IGhhdmUgYSBmYWlsdXJlIG1vZGUpCisgIHJldHVybiBTU0xfcGVuZGluZyhzc2xfKSA+IDAgfHwgVFNvY2tldDo6aGFzUGVuZGluZ0RhdGFUb1JlYWQoKTsKK30KKwordm9pZCBUU1NMU29ja2V0Ojppbml0KCkgeworICBoYW5kc2hha2VDb21wbGV0ZWRfID0gZmFsc2U7CisgIHJlYWRSZXRyeUNvdW50XyA9IDA7CisgIGV2ZW50U2FmZV8gPSBmYWxzZTsKK30KKwogYm9vbCBUU1NMU29ja2V0Ojppc09wZW4oKSB7CiAgIGlmIChzc2xfID09IE5VTEwgfHwgIVRTb2NrZXQ6OmlzT3BlbigpKSB7CiAgICAgcmV0dXJuIGZhbHNlOwogICB9CiAgIGludCBzaHV0ZG93biA9IFNTTF9nZXRfc2h1dGRvd24oc3NsXyk7Ci0gIC8vICIhISIgaXMgc3F1ZWxjaGluZyBDNDgwMCAiZm9yY2luZyBib29sIC0+IHRydWUgb3IgZmFsc2UiIHBlcmZvbWFuY2Ugd2FybmluZworICAvLyAiISEiIGlzIHNxdWVsY2hpbmcgQzQ4MDAgImZvcmNpbmcgYm9vbCAtPiB0cnVlIG9yIGZhbHNlIiBwZXJmb3JtYW5jZSB3YXJuaW5nCiAgIGJvb2wgc2h1dGRvd25SZWNlaXZlZCA9ICEhKHNodXRkb3duICYgU1NMX1JFQ0VJVkVEX1NIVVRET1dOKTsKLSAgYm9vbCBzaHV0ZG93blNlbnQgICAgID0gISEoc2h1dGRvd24gJiBTU0xfU0VOVF9TSFVURE9XTik7CisgIGJvb2wgc2h1dGRvd25TZW50ID0gISEoc2h1dGRvd24gJiBTU0xfU0VOVF9TSFVURE9XTik7CiAgIGlmIChzaHV0ZG93blJlY2VpdmVkICYmIHNodXRkb3duU2VudCkgewogICAgIHJldHVybiBmYWxzZTsKICAgfQogICByZXR1cm4gdHJ1ZTsKIH0KIAorLyoKKyAqIE5vdGU6IFRoaXMgbWV0aG9kIGlzIG5vdCBsaWJldmVudCBzYWZlLgorKi8KIGJvb2wgVFNTTFNvY2tldDo6cGVlaygpIHsKICAgaWYgKCFpc09wZW4oKSkgewogICAgIHJldHVybiBmYWxzZTsKICAgfQotICBjaGVja0hhbmRzaGFrZSgpOworICBpbml0aWFsaXplSGFuZHNoYWtlKCk7CisgIGlmICghY2hlY2tIYW5kc2hha2UoKSkKKyAgICB0aHJvdyBUU1NMRXhjZXB0aW9uKCJTU0xfcGVlazogSGFuZHNoYWtlIGlzIG5vdCBjb21wbGV0ZWQiKTsKICAgaW50IHJjOwogICB1aW50OF90IGJ5dGU7Ci0gIHJjID0gU1NMX3BlZWsoc3NsXywgJmJ5dGUsIDEpOwotICBpZiAocmMgPCAwKSB7Ci0gICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKLSAgICBzdHJpbmcgZXJyb3JzOwotICAgIGJ1aWxkRXJyb3JzKGVycm9ycywgZXJybm9fY29weSk7Ci0gICAgdGhyb3cgVFNTTEV4Y2VwdGlvbigiU1NMX3BlZWs6ICIgKyBlcnJvcnMpOwotICB9Ci0gIGlmIChyYyA9PSAwKSB7Ci0gICAgRVJSX2NsZWFyX2Vycm9yKCk7Ci0gIH0KKyAgZG8geworICAgIHJjID0gU1NMX3BlZWsoc3NsXywgJmJ5dGUsIDEpOworICAgIGlmIChyYyA8IDApIHsKKworICAgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICAgIGludCBlcnJvciA9IFNTTF9nZXRfZXJyb3Ioc3NsXywgcmMpOworICAgICAgc3dpdGNoIChlcnJvcikgeworICAgICAgICBjYXNlIFNTTF9FUlJPUl9TWVNDQUxMOgorICAgICAgICAgIGlmICgoZXJybm9fY29weSAhPSBUSFJJRlRfRUlOVFIpCisgICAgICAgICAgICAgICYmIChlcnJub19jb3B5ICE9IFRIUklGVF9FQUdBSU4pKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIC8vIGZhbGx0aHJvdWdoCisgICAgICAgIGNhc2UgU1NMX0VSUk9SX1dBTlRfUkVBRDoKKyAgICAgICAgY2FzZSBTU0xfRVJST1JfV0FOVF9XUklURToKKyAgICAgICAgICAvLyBpbiB0aGUgY2FzZSBvZiBTU0xfRVJST1JfU1lTQ0FMTCB3ZSB3YW50IHRvIHdhaXQgZm9yIGFuIHJlYWQgZXZlbnQgYWdhaW4KKyAgICAgICAgICB3YWl0Rm9yRXZlbnQoZXJyb3IgIT0gU1NMX0VSUk9SX1dBTlRfV1JJVEUpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBkZWZhdWx0OjsvLyBkbyBub3RoaW5nCisgICAgICB9CisgICAgICBzdHJpbmcgZXJyb3JzOworICAgICAgYnVpbGRFcnJvcnMoZXJyb3JzLCBlcnJub19jb3B5LCBlcnJvcik7CisgICAgICB0aHJvdyBUU1NMRXhjZXB0aW9uKCJTU0xfcGVlazogIiArIGVycm9ycyk7CisgICAgfSBlbHNlIGlmIChyYyA9PSAwKSB7CisgICAgICBFUlJfY2xlYXJfZXJyb3IoKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfSB3aGlsZSAodHJ1ZSk7CiAgIHJldHVybiAocmMgPiAwKTsKIH0KIApAQCAtMjUyLDY3ICszMzAsMjM0IEBACiAgIFRTb2NrZXQ6Om9wZW4oKTsKIH0KIAorLyoKKyAqIE5vdGU6IFRoaXMgbWV0aG9kIGlzIG5vdCBsaWJldmVudCBzYWZlLgorKi8KIHZvaWQgVFNTTFNvY2tldDo6Y2xvc2UoKSB7CiAgIGlmIChzc2xfICE9IE5VTEwpIHsKLSAgICBpbnQgcmMgPSBTU0xfc2h1dGRvd24oc3NsXyk7Ci0gICAgaWYgKHJjID09IDApIHsKLSAgICAgIHJjID0gU1NMX3NodXRkb3duKHNzbF8pOwotICAgIH0KLSAgICBpZiAocmMgPCAwKSB7Ci0gICAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOwotICAgICAgc3RyaW5nIGVycm9yczsKLSAgICAgIGJ1aWxkRXJyb3JzKGVycm9ycywgZXJybm9fY29weSk7Ci0gICAgICBHbG9iYWxPdXRwdXQoKCJTU0xfc2h1dGRvd246ICIgKyBlcnJvcnMpLmNfc3RyKCkpOworICAgIHRyeSB7CisgICAgICBpbnQgcmM7CisgICAgICBpbnQgZXJybm9fY29weSA9IDA7CisgICAgICBpbnQgZXJyb3IgPSAwOworCisgICAgICBkbyB7CisgICAgICAgIHJjID0gU1NMX3NodXRkb3duKHNzbF8pOworICAgICAgICBpZiAocmMgPD0gMCkgeworICAgICAgICAgIGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICAgICAgICBlcnJvciA9IFNTTF9nZXRfZXJyb3Ioc3NsXywgcmMpOworICAgICAgICAgIHN3aXRjaCAoZXJyb3IpIHsKKyAgICAgICAgICAgIGNhc2UgU1NMX0VSUk9SX1NZU0NBTEw6CisgICAgICAgICAgICAgIGlmICgoZXJybm9fY29weSAhPSBUSFJJRlRfRUlOVFIpCisgICAgICAgICAgICAgICAgICAmJiAoZXJybm9fY29weSAhPSBUSFJJRlRfRUFHQUlOKSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBmYWxsdGhyb3VnaAorICAgICAgICAgICAgY2FzZSBTU0xfRVJST1JfV0FOVF9SRUFEOgorICAgICAgICAgICAgY2FzZSBTU0xfRVJST1JfV0FOVF9XUklURToKKyAgICAgICAgICAgICAgLy8gaW4gdGhlIGNhc2Ugb2YgU1NMX0VSUk9SX1NZU0NBTEwgd2Ugd2FudCB0byB3YWl0IGZvciBhbiB3cml0ZS9yZWFkIGV2ZW50IGFnYWluCisgICAgICAgICAgICAgIHdhaXRGb3JFdmVudChlcnJvciA9PSBTU0xfRVJST1JfV0FOVF9SRUFEKTsKKyAgICAgICAgICAgICAgcmMgPSAyOworICAgICAgICAgICAgZGVmYXVsdDo7Ly8gZG8gbm90aGluZworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSB3aGlsZSAocmMgPT0gMik7CisKKyAgICAgIGlmIChyYyA8IDApIHsKKyAgICAgICAgc3RyaW5nIGVycm9yczsKKyAgICAgICAgYnVpbGRFcnJvcnMoZXJyb3JzLCBlcnJub19jb3B5LCBlcnJvcik7CisgICAgICAgIEdsb2JhbE91dHB1dCgoIlNTTF9zaHV0ZG93bjogIiArIGVycm9ycykuY19zdHIoKSk7CisgICAgICB9CisgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYgdGUpIHsKKyAgICAgIC8vIERvbid0IGVtaXQgYW4gZXhjZXB0aW9uIGJlY2F1c2UgdGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZQorICAgICAgLy8gZGVzdHJ1Y3Rvci4gVGhlcmUncyBhbHNvIG5vdCBtdWNoIHRoYXQgYSB1c2VyIGNhbiBkbyB0byByZWNvdmVyLCBzbworICAgICAgLy8ganVzdCBjbGVhbiB1cCBhcyBtdWNoIGFzIHBvc3NpYmxlIHdpdGhvdXQgdGhyb3dpbmcsIHNpbWlsYXIgdG8gdGhlIHJjCisgICAgICAvLyA8IDAgY2FzZSBhYm92ZS4KKyAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoIlNTTF9zaHV0ZG93bjogJXMiLCB0ZS53aGF0KCkpOwogICAgIH0KICAgICBTU0xfZnJlZShzc2xfKTsKICAgICBzc2xfID0gTlVMTDsKKyAgICBoYW5kc2hha2VDb21wbGV0ZWRfID0gZmFsc2U7CiAgICAgRVJSX3JlbW92ZV9zdGF0ZSgwKTsKICAgfQogICBUU29ja2V0OjpjbG9zZSgpOwogfQogCisvKgorICogUmV0dXJucyBudW1iZXIgb2YgYnl0ZXMgcmVhZCBpbiBTU0wgU29ja2V0LgorICogSWYgZXZlbnRTYWZlIGlzIHNldCwgYW5kIGl0IG1heSByZXR1cm5zIDAgYnl0ZXMgdGhlbiByZWFkIG1ldGhvZAorICogbmVlZHMgdG8gYmUgY2FsbGVkIGFnYWluIHVudGlsIGl0IGlzIHN1Y2Nlc3NmdWxsIG9yIGl0IHRocm93cworICogZXhjZXB0aW9uIGluY2FzZSBvZiBmYWlsdXJlLgorKi8KIHVpbnQzMl90IFRTU0xTb2NrZXQ6OnJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKLSAgY2hlY2tIYW5kc2hha2UoKTsKKyAgaW5pdGlhbGl6ZUhhbmRzaGFrZSgpOworICBpZiAoIWNoZWNrSGFuZHNoYWtlKCkpCisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLCAicmV0cnkgYWdhaW4iKTsKICAgaW50MzJfdCBieXRlcyA9IDA7Ci0gIGZvciAoaW50MzJfdCByZXRyaWVzID0gMDsgcmV0cmllcyA8IG1heFJlY3ZSZXRyaWVzXzsgcmV0cmllcysrKXsKKyAgd2hpbGUgKHJlYWRSZXRyeUNvdW50XyA8IG1heFJlY3ZSZXRyaWVzXykgewogICAgIGJ5dGVzID0gU1NMX3JlYWQoc3NsXywgYnVmLCBsZW4pOwotICAgIGlmIChieXRlcyA+PSAwKQorICAgIGludDMyX3QgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgIGludDMyX3QgZXJyb3IgPSBTU0xfZ2V0X2Vycm9yKHNzbF8sIGJ5dGVzKTsKKyAgICByZWFkUmV0cnlDb3VudF8rKzsKKyAgICBpZiAoZXJyb3IgPT0gU1NMX0VSUk9SX05PTkUpIHsKKyAgICAgIHJlYWRSZXRyeUNvdW50XyA9IDA7CiAgICAgICBicmVhazsKLSAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOwotICAgIGlmIChTU0xfZ2V0X2Vycm9yKHNzbF8sIGJ5dGVzKSA9PSBTU0xfRVJST1JfU1lTQ0FMTCkgewotICAgICAgaWYgKEVSUl9nZXRfZXJyb3IoKSA9PSAwICYmIGVycm5vX2NvcHkgPT0gVEhSSUZUX0VJTlRSKSB7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQorICAgIH0KKyAgICB1bnNpZ25lZCBpbnQgd2FpdEV2ZW50UmV0dXJuOworICAgIGJvb2wgYnJlYWtvdXQgPSBmYWxzZTsKKyAgICBzd2l0Y2ggKGVycm9yKSB7CisgICAgICBjYXNlIFNTTF9FUlJPUl9aRVJPX1JFVFVSTjoKKyAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpFTkRfT0ZfRklMRSwgImNsaWVudCBkaXNjb25uZWN0ZWQiKTsKKworICAgICAgY2FzZSBTU0xfRVJST1JfU1lTQ0FMTDoKKyAgICAgICAgaWYgKGVycm5vX2NvcHkgPT0gMCAmJiBFUlJfcGVla19lcnJvcigpID09IDApIHsKKyAgICAgICAgICBicmVha291dCA9IHRydWU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChlcnJub19jb3B5ICE9IFRIUklGVF9FSU5UUikKKyAgICAgICAgICAgICYmIChlcnJub19jb3B5ICE9IFRIUklGVF9FQUdBSU4pKSB7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChyZWFkUmV0cnlDb3VudF8gPj0gbWF4UmVjdlJldHJpZXNfKSB7CisgICAgICAgICAgLy8gVEhSSUZUX0VJTlRSIG5lZWRzIHRvIGJlIGhhbmRsZWQgbWFudWFsbHkgYW5kIHdlIGNhbiB0b2xlcmF0ZQorICAgICAgICAgIC8vIGEgY2VydGFpbiBudW1iZXIKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgLy8gZmFsbHRocm91Z2gKKworICAgICAgY2FzZSBTU0xfRVJST1JfV0FOVF9SRUFEOgorICAgICAgY2FzZSBTU0xfRVJST1JfV0FOVF9XUklURToKKyAgICAgICAgaWYgKGlzTGliZXZlbnRTYWZlKCkpIHsKKyAgICAgICAgICBpZiAocmVhZFJldHJ5Q291bnRfIDwgbWF4UmVjdlJldHJpZXNfKSB7CisgICAgICAgICAgICAvLyBUSFJJRlRfRUlOVFIgbmVlZHMgdG8gYmUgaGFuZGxlZCBtYW51YWxseSBhbmQgd2UgY2FuIHRvbGVyYXRlCisgICAgICAgICAgICAvLyBhIGNlcnRhaW4gbnVtYmVyCisgICAgICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sICJyZXRyeSBhZ2FpbiIpOworICAgICAgICAgIH0KKyAgICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OklOVEVSTkFMX0VSUk9SLCAidG9vIG11Y2ggcmVjdiByZXRyaWVzIik7CisgICAgICAgIH0KKyAgICAgICAgLy8gaW4gdGhlIGNhc2Ugb2YgU1NMX0VSUk9SX1NZU0NBTEwgd2Ugd2FudCB0byB3YWl0IGZvciBhbiByZWFkIGV2ZW50IGFnYWluCisgICAgICAgIGVsc2UgaWYgKCh3YWl0RXZlbnRSZXR1cm4gPSB3YWl0Rm9yRXZlbnQoZXJyb3IgIT0gU1NMX0VSUk9SX1dBTlRfV1JJVEUpKSA9PSBUU1NMX0VJTlRSICkgeworICAgICAgICAgIC8vIHJlcGVhdCBvcGVyYXRpb24KKyAgICAgICAgICBpZiAocmVhZFJldHJ5Q291bnRfIDwgbWF4UmVjdlJldHJpZXNfKSB7CisgICAgICAgICAgICAvLyBUSFJJRlRfRUlOVFIgbmVlZHMgdG8gYmUgaGFuZGxlZCBtYW51YWxseSBhbmQgd2UgY2FuIHRvbGVyYXRlCisgICAgICAgICAgICAvLyBhIGNlcnRhaW4gbnVtYmVyCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpJTlRFUk5BTF9FUlJPUiwgInRvbyBtdWNoIHJlY3YgcmV0cmllcyIpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHdhaXRFdmVudFJldHVybiA9PSBUU1NMX0RBVEEpIHsKKyAgICAgICAgICAgIC8vIGluIGNhc2Ugb2YgU1NMIGFuZCBodWdlIHRocmlmdCBwYWNrZXRzLCB0aGVyZSBtYXkgYmUgYSBudW1iZXIgb2YKKyAgICAgICAgICAgIC8vIHNvY2tldCBvcGVyYXRpb25zLCBiZWZvcmUgYW55IGRhdGEgYmVjb21lcyBhdmFpbGFibGUgYnkgU1NMX3JlYWQoKS4KKyAgICAgICAgICAgIC8vIFRoZXJlZm9yZSB0aGUgbnVtYmVyIG9mIHJldHJpZXMgc2hvdWxkIG5vdCBiZSBpbmNyZWFzZWQgYW5kCisgICAgICAgICAgICAvLyB0aGUgb3BlcmF0aW9uIHNob3VsZCBiZSByZXBlYXRlZC4KKyAgICAgICAgICAgIHJlYWRSZXRyeUNvdW50Xy0tOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpJTlRFUk5BTF9FUlJPUiwgInVua293biB3YWl0Rm9yRXZlbnQgcmV0dXJuIHZhbHVlIik7CisgICAgICBkZWZhdWx0OjsvLyBkbyBub3RoaW5nCisgICAgfQorICAgIGlmIChicmVha291dCkgeworICAgICAgYnJlYWs7CiAgICAgfQogICAgIHN0cmluZyBlcnJvcnM7Ci0gICAgYnVpbGRFcnJvcnMoZXJyb3JzLCBlcnJub19jb3B5KTsKKyAgICBidWlsZEVycm9ycyhlcnJvcnMsIGVycm5vX2NvcHksIGVycm9yKTsKICAgICB0aHJvdyBUU1NMRXhjZXB0aW9uKCJTU0xfcmVhZDogIiArIGVycm9ycyk7CiAgIH0KICAgcmV0dXJuIGJ5dGVzOwogfQogCiB2b2lkIFRTU0xTb2NrZXQ6OndyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7Ci0gIGNoZWNrSGFuZHNoYWtlKCk7CisgIGluaXRpYWxpemVIYW5kc2hha2UoKTsKKyAgaWYgKCFjaGVja0hhbmRzaGFrZSgpKQorICAgIHJldHVybjsKICAgLy8gbG9vcCBpbiBjYXNlIFNTTF9NT0RFX0VOQUJMRV9QQVJUSUFMX1dSSVRFIGlzIHNldCBpbiBTU0xfQ1RYLgogICB1aW50MzJfdCB3cml0dGVuID0gMDsKICAgd2hpbGUgKHdyaXR0ZW4gPCBsZW4pIHsKKyAgICBFUlJfY2xlYXJfZXJyb3IoKTsKICAgICBpbnQzMl90IGJ5dGVzID0gU1NMX3dyaXRlKHNzbF8sICZidWZbd3JpdHRlbl0sIGxlbiAtIHdyaXR0ZW4pOwogICAgIGlmIChieXRlcyA8PSAwKSB7CiAgICAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgICAgaW50IGVycm9yID0gU1NMX2dldF9lcnJvcihzc2xfLCBieXRlcyk7CisgICAgICBzd2l0Y2ggKGVycm9yKSB7CisgICAgICAgIGNhc2UgU1NMX0VSUk9SX1NZU0NBTEw6CisgICAgICAgICAgaWYgKChlcnJub19jb3B5ICE9IFRIUklGVF9FSU5UUikKKyAgICAgICAgICAgICAgJiYgKGVycm5vX2NvcHkgIT0gVEhSSUZUX0VBR0FJTikpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgLy8gZmFsbHRocm91Z2ggICAgICAgIAorICAgICAgICBjYXNlIFNTTF9FUlJPUl9XQU5UX1JFQUQ6CisgICAgICAgIGNhc2UgU1NMX0VSUk9SX1dBTlRfV1JJVEU6CisgICAgICAgICAgaWYgKGlzTGliZXZlbnRTYWZlKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvLyBpbiB0aGUgY2FzZSBvZiBTU0xfRVJST1JfU1lTQ0FMTCB3ZSB3YW50IHRvIHdhaXQgZm9yIGFuIHdyaXRlIGV2ZW50IGFnYWluCisgICAgICAgICAgICB3YWl0Rm9yRXZlbnQoZXJyb3IgPT0gU1NMX0VSUk9SX1dBTlRfUkVBRCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6Oy8vIGRvIG5vdGhpbmcKKyAgICAgIH0KICAgICAgIHN0cmluZyBlcnJvcnM7Ci0gICAgICBidWlsZEVycm9ycyhlcnJvcnMsIGVycm5vX2NvcHkpOworICAgICAgYnVpbGRFcnJvcnMoZXJyb3JzLCBlcnJub19jb3B5LCBlcnJvcik7CiAgICAgICB0aHJvdyBUU1NMRXhjZXB0aW9uKCJTU0xfd3JpdGU6ICIgKyBlcnJvcnMpOwogICAgIH0KICAgICB3cml0dGVuICs9IGJ5dGVzOwogICB9CiB9CiAKKy8qCisgKiBSZXR1cm5zIG51bWJlciBvZiBieXRlcyB3cml0dGVuIGluIFNTTCBTb2NrZXQuCisgKiBJZiBldmVudFNhZmUgaXMgc2V0LCBhbmQgaXQgbWF5IHJldHVybnMgMCBieXRlcyB0aGVuIHdyaXRlIG1ldGhvZAorICogbmVlZHMgdG8gYmUgY2FsbGVkIGFnYWluIHVudGlsIGl0IGlzIHN1Y2Nlc3NmdWxsIG9yIGl0IHRocm93cworICogZXhjZXB0aW9uIGluY2FzZSBvZiBmYWlsdXJlLgorKi8KK3VpbnQzMl90IFRTU0xTb2NrZXQ6OndyaXRlX3BhcnRpYWwoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgaW5pdGlhbGl6ZUhhbmRzaGFrZSgpOworICBpZiAoIWNoZWNrSGFuZHNoYWtlKCkpCisgICAgcmV0dXJuIDA7CisgIC8vIGxvb3AgaW4gY2FzZSBTU0xfTU9ERV9FTkFCTEVfUEFSVElBTF9XUklURSBpcyBzZXQgaW4gU1NMX0NUWC4KKyAgdWludDMyX3Qgd3JpdHRlbiA9IDA7CisgIHdoaWxlICh3cml0dGVuIDwgbGVuKSB7CisgICAgRVJSX2NsZWFyX2Vycm9yKCk7CisgICAgaW50MzJfdCBieXRlcyA9IFNTTF93cml0ZShzc2xfLCAmYnVmW3dyaXR0ZW5dLCBsZW4gLSB3cml0dGVuKTsKKyAgICBpZiAoYnl0ZXMgPD0gMCkgeworICAgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICAgIGludCBlcnJvciA9IFNTTF9nZXRfZXJyb3Ioc3NsXywgYnl0ZXMpOworICAgICAgc3dpdGNoIChlcnJvcikgeworICAgICAgICBjYXNlIFNTTF9FUlJPUl9TWVNDQUxMOgorICAgICAgICAgIGlmICgoZXJybm9fY29weSAhPSBUSFJJRlRfRUlOVFIpCisgICAgICAgICAgICAgICYmIChlcnJub19jb3B5ICE9IFRIUklGVF9FQUdBSU4pKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIC8vIGZhbGx0aHJvdWdoCisgICAgICAgIGNhc2UgU1NMX0VSUk9SX1dBTlRfUkVBRDoKKyAgICAgICAgY2FzZSBTU0xfRVJST1JfV0FOVF9XUklURToKKyAgICAgICAgICBpZiAoaXNMaWJldmVudFNhZmUoKSkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLy8gaW4gdGhlIGNhc2Ugb2YgU1NMX0VSUk9SX1NZU0NBTEwgd2Ugd2FudCB0byB3YWl0IGZvciBhbiB3cml0ZSBldmVudCBhZ2FpbgorICAgICAgICAgICAgd2FpdEZvckV2ZW50KGVycm9yID09IFNTTF9FUlJPUl9XQU5UX1JFQUQpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorICAgICAgICBkZWZhdWx0OjsvLyBkbyBub3RoaW5nCisgICAgICB9CisgICAgICBzdHJpbmcgZXJyb3JzOworICAgICAgYnVpbGRFcnJvcnMoZXJyb3JzLCBlcnJub19jb3B5LCBlcnJvcik7CisgICAgICB0aHJvdyBUU1NMRXhjZXB0aW9uKCJTU0xfd3JpdGU6ICIgKyBlcnJvcnMpOworICAgIH0KKyAgICB3cml0dGVuICs9IGJ5dGVzOworICB9CisgIHJldHVybiB3cml0dGVuOworfQorCiB2b2lkIFRTU0xTb2NrZXQ6OmZsdXNoKCkgewogICAvLyBEb24ndCB0aHJvdyBleGNlcHRpb24gaWYgbm90IG9wZW4uIFRocmlmdCBzZXJ2ZXJzIGNsb3NlIHNvY2tldCB0d2ljZS4KICAgaWYgKHNzbF8gPT0gTlVMTCkgewogICAgIHJldHVybjsKICAgfQotICBjaGVja0hhbmRzaGFrZSgpOworICBpbml0aWFsaXplSGFuZHNoYWtlKCk7CisgIGlmICghY2hlY2tIYW5kc2hha2UoKSkKKyAgICB0aHJvdyBUU1NMRXhjZXB0aW9uKCJCSU9fZmx1c2g6IEhhbmRzaGFrZSBpcyBub3QgY29tcGxldGVkIik7CiAgIEJJTyogYmlvID0gU1NMX2dldF93YmlvKHNzbF8pOwogICBpZiAoYmlvID09IE5VTEwpIHsKICAgICB0aHJvdyBUU1NMRXhjZXB0aW9uKCJTU0xfZ2V0X3diaW8gcmV0dXJucyBOVUxMIik7CkBAIC0zMjUsMzYgKzU3MCwxMTYgQEAKICAgfQogfQogCi12b2lkIFRTU0xTb2NrZXQ6OmNoZWNrSGFuZHNoYWtlKCkgewotICBpZiAoIVRTb2NrZXQ6OmlzT3BlbigpKSB7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTik7Ci0gIH0KLSAgaWYgKHNzbF8gIT0gTlVMTCkgewordm9pZCBUU1NMU29ja2V0Ojppbml0aWFsaXplSGFuZHNoYWtlUGFyYW1zKCkgeworICAvLyBzZXQgdW5kZXJseWluZyBzb2NrZXQgdG8gbm9uLWJsb2NraW5nCisgIGludCBmbGFnczsKKyAgaWYgKChmbGFncyA9IFRIUklGVF9GQ05UTChzb2NrZXRfLCBUSFJJRlRfRl9HRVRGTCwgMCkpIDwgMAorICAgICAgfHwgVEhSSUZUX0ZDTlRMKHNvY2tldF8sIFRIUklGVF9GX1NFVEZMLCBmbGFncyB8IFRIUklGVF9PX05PTkJMT0NLKSA8IDApIHsKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJ0aHJpZnRTZXJ2ZXJFdmVudEhhbmRsZXI6IHNldCBUSFJJRlRfT19OT05CTE9DSyAoVEhSSUZUX0ZDTlRMKSAiLAorICAgICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IpOworICAgIDo6VEhSSUZUX0NMT1NFU09DS0VUKHNvY2tldF8pOwogICAgIHJldHVybjsKICAgfQogICBzc2xfID0gY3R4Xy0+Y3JlYXRlU1NMKCk7Ci0gIFNTTF9zZXRfZmQoc3NsXywgc29ja2V0Xyk7CisKKyAgU1NMX3NldF9mZChzc2xfLCBzdGF0aWNfY2FzdDxpbnQ+KHNvY2tldF8pKTsKK30KKworYm9vbCBUU1NMU29ja2V0OjpjaGVja0hhbmRzaGFrZSgpIHsKKyAgcmV0dXJuIGhhbmRzaGFrZUNvbXBsZXRlZF87Cit9CisKK3ZvaWQgVFNTTFNvY2tldDo6aW5pdGlhbGl6ZUhhbmRzaGFrZSgpIHsKKyAgaWYgKCFUU29ja2V0Ojppc09wZW4oKSkgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4pOworICB9CisgIGlmIChjaGVja0hhbmRzaGFrZSgpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKHNzbF8gPT0gTlVMTCkgeworICAgIGluaXRpYWxpemVIYW5kc2hha2VQYXJhbXMoKTsKKyAgfQorCiAgIGludCByYzsKKyAgaW50IGVycm5vX2NvcHkgPSAwOworICBpbnQgZXJyb3IgPSAwOwogICBpZiAoc2VydmVyKCkpIHsKLSAgICByYyA9IFNTTF9hY2NlcHQoc3NsXyk7CisgICAgZG8geworICAgICAgcmMgPSBTU0xfYWNjZXB0KHNzbF8pOworICAgICAgaWYgKHJjIDw9IDApIHsKKyAgICAgICAgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgICAgICBlcnJvciA9IFNTTF9nZXRfZXJyb3Ioc3NsXywgcmMpOworICAgICAgICBzd2l0Y2ggKGVycm9yKSB7CisgICAgICAgICAgY2FzZSBTU0xfRVJST1JfU1lTQ0FMTDoKKyAgICAgICAgICAgIGlmICgoZXJybm9fY29weSAhPSBUSFJJRlRfRUlOVFIpCisgICAgICAgICAgICAgICAgJiYgKGVycm5vX2NvcHkgIT0gVEhSSUZUX0VBR0FJTikpIHsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgLy8gZmFsbHRocm91Z2gKKyAgICAgICAgICBjYXNlIFNTTF9FUlJPUl9XQU5UX1JFQUQ6CisgICAgICAgICAgY2FzZSBTU0xfRVJST1JfV0FOVF9XUklURToKKyAgICAgICAgICAgIGlmIChpc0xpYmV2ZW50U2FmZSgpKSB7CisgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAvLyByZXBlYXQgb3BlcmF0aW9uCisgICAgICAgICAgICAgIC8vIGluIHRoZSBjYXNlIG9mIFNTTF9FUlJPUl9TWVNDQUxMIHdlIHdhbnQgdG8gd2FpdCBmb3IgYW4gd3JpdGUvcmVhZCBldmVudCBhZ2FpbgorICAgICAgICAgICAgICB3YWl0Rm9yRXZlbnQoZXJyb3IgPT0gU1NMX0VSUk9SX1dBTlRfUkVBRCk7CisgICAgICAgICAgICAgIHJjID0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBkZWZhdWx0OjsvLyBkbyBub3RoaW5nCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IHdoaWxlIChyYyA9PSAyKTsKICAgfSBlbHNlIHsKLSAgICByYyA9IFNTTF9jb25uZWN0KHNzbF8pOworICAgIC8vIE9wZW5TU0wgPCAwLjkuOGYgZG9lcyBub3QgaGF2ZSBTU0xfc2V0X3Rsc2V4dF9ob3N0X25hbWUoKQorICAgICNpZiBkZWZpbmVkKFNTTF9zZXRfdGxzZXh0X2hvc3RfbmFtZSkKKyAgICAgIC8vIHNldCB0aGUgU05JIGhvc3RuYW1lCisgICAgICBTU0xfc2V0X3Rsc2V4dF9ob3N0X25hbWUoc3NsXywgZ2V0SG9zdCgpLmNfc3RyKCkpOworICAgICNlbmRpZgorICAgIGRvIHsKKyAgICAgIHJjID0gU1NMX2Nvbm5lY3Qoc3NsXyk7CisgICAgICBpZiAocmMgPD0gMCkgeworICAgICAgICBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgICAgIGVycm9yID0gU1NMX2dldF9lcnJvcihzc2xfLCByYyk7CisgICAgICAgIHN3aXRjaCAoZXJyb3IpIHsKKyAgICAgICAgICBjYXNlIFNTTF9FUlJPUl9TWVNDQUxMOgorICAgICAgICAgICAgaWYgKChlcnJub19jb3B5ICE9IFRIUklGVF9FSU5UUikKKyAgICAgICAgICAgICAgICAmJiAoZXJybm9fY29weSAhPSBUSFJJRlRfRUFHQUlOKSkgeworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAvLyBmYWxsdGhyb3VnaAorICAgICAgICAgIGNhc2UgU1NMX0VSUk9SX1dBTlRfUkVBRDoKKyAgICAgICAgICBjYXNlIFNTTF9FUlJPUl9XQU5UX1dSSVRFOgorICAgICAgICAgICAgaWYgKGlzTGliZXZlbnRTYWZlKCkpIHsKKyAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgIC8vIHJlcGVhdCBvcGVyYXRpb24KKyAgICAgICAgICAgICAgLy8gaW4gdGhlIGNhc2Ugb2YgU1NMX0VSUk9SX1NZU0NBTEwgd2Ugd2FudCB0byB3YWl0IGZvciBhbiB3cml0ZS9yZWFkIGV2ZW50IGFnYWluCisgICAgICAgICAgICAgIHdhaXRGb3JFdmVudChlcnJvciA9PSBTU0xfRVJST1JfV0FOVF9SRUFEKTsKKyAgICAgICAgICAgICAgcmMgPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgIGRlZmF1bHQ6Oy8vIGRvIG5vdGhpbmcKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gd2hpbGUgKHJjID09IDIpOwogICB9CiAgIGlmIChyYyA8PSAwKSB7Ci0gICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKICAgICBzdHJpbmcgZm5hbWUoc2VydmVyKCkgPyAiU1NMX2FjY2VwdCIgOiAiU1NMX2Nvbm5lY3QiKTsKICAgICBzdHJpbmcgZXJyb3JzOwotICAgIGJ1aWxkRXJyb3JzKGVycm9ycywgZXJybm9fY29weSk7CisgICAgYnVpbGRFcnJvcnMoZXJyb3JzLCBlcnJub19jb3B5LCBlcnJvcik7CiAgICAgdGhyb3cgVFNTTEV4Y2VwdGlvbihmbmFtZSArICI6ICIgKyBlcnJvcnMpOwogICB9CiAgIGF1dGhvcml6ZSgpOworICBoYW5kc2hha2VDb21wbGV0ZWRfID0gdHJ1ZTsKIH0KIAogdm9pZCBUU1NMU29ja2V0OjphdXRob3JpemUoKSB7CiAgIGludCByYyA9IFNTTF9nZXRfdmVyaWZ5X3Jlc3VsdChzc2xfKTsKLSAgaWYgKHJjICE9IFg1MDlfVl9PSykgeyAgLy8gdmVyaWZ5IGF1dGhlbnRpY2F0aW9uIHJlc3VsdAotICAgIHRocm93IFRTU0xFeGNlcHRpb24oc3RyaW5nKCJTU0xfZ2V0X3ZlcmlmeV9yZXN1bHQoKSwgIikgKwotICAgICAgICAgICAgICAgICAgICAgICAgWDUwOV92ZXJpZnlfY2VydF9lcnJvcl9zdHJpbmcocmMpKTsKKyAgaWYgKHJjICE9IFg1MDlfVl9PSykgeyAvLyB2ZXJpZnkgYXV0aGVudGljYXRpb24gcmVzdWx0CisgICAgdGhyb3cgVFNTTEV4Y2VwdGlvbihzdHJpbmcoIlNTTF9nZXRfdmVyaWZ5X3Jlc3VsdCgpLCAiKSArIFg1MDlfdmVyaWZ5X2NlcnRfZXJyb3Jfc3RyaW5nKHJjKSk7CiAgIH0KIAogICBYNTA5KiBjZXJ0ID0gU1NMX2dldF9wZWVyX2NlcnRpZmljYXRlKHNzbF8pOwpAQCAtMzk1LDggKzcyMCw4IEBACiAgIH0KIAogICAvLyBleHRyYWN0IHN1YmplY3RBbHRlcm5hdGl2ZU5hbWUKLSAgU1RBQ0tfT0YoR0VORVJBTF9OQU1FKSogYWx0ZXJuYXRpdmVzID0gKFNUQUNLX09GKEdFTkVSQUxfTkFNRSkqKQotICAgICAgICAgICAgICAgICAgICAgICBYNTA5X2dldF9leHRfZDJpKGNlcnQsIE5JRF9zdWJqZWN0X2FsdF9uYW1lLCBOVUxMLCBOVUxMKTsKKyAgU1RBQ0tfT0YoR0VORVJBTF9OQU1FKSogYWx0ZXJuYXRpdmVzCisgICAgICA9IChTVEFDS19PRihHRU5FUkFMX05BTUUpKilYNTA5X2dldF9leHRfZDJpKGNlcnQsIE5JRF9zdWJqZWN0X2FsdF9uYW1lLCBOVUxMLCBOVUxMKTsKICAgaWYgKGFsdGVybmF0aXZlcyAhPSBOVUxMKSB7CiAgICAgY29uc3QgaW50IGNvdW50ID0gc2tfR0VORVJBTF9OQU1FX251bShhbHRlcm5hdGl2ZXMpOwogICAgIGZvciAoaW50IGkgPSAwOyBkZWNpc2lvbiA9PSBBY2Nlc3NNYW5hZ2VyOjpTS0lQICYmIGkgPCBjb3VudDsgaSsrKSB7CkBAIC00MDcsMTUgKzczMiwxNSBAQAogICAgICAgY2hhciogZGF0YSA9IChjaGFyKilBU04xX1NUUklOR19kYXRhKG5hbWUtPmQuaWE1KTsKICAgICAgIGludCBsZW5ndGggPSBBU04xX1NUUklOR19sZW5ndGgobmFtZS0+ZC5pYTUpOwogICAgICAgc3dpdGNoIChuYW1lLT50eXBlKSB7Ci0gICAgICAgIGNhc2UgR0VOX0ROUzoKLSAgICAgICAgICBpZiAoaG9zdC5lbXB0eSgpKSB7Ci0gICAgICAgICAgICBob3N0ID0gKHNlcnZlcigpID8gZ2V0UGVlckhvc3QoKSA6IGdldEhvc3QoKSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGRlY2lzaW9uID0gYWNjZXNzXy0+dmVyaWZ5KGhvc3QsIGRhdGEsIGxlbmd0aCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgR0VOX0lQQUREOgotICAgICAgICAgIGRlY2lzaW9uID0gYWNjZXNzXy0+dmVyaWZ5KHNhLCBkYXRhLCBsZW5ndGgpOwotICAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHRU5fRE5TOgorICAgICAgICBpZiAoaG9zdC5lbXB0eSgpKSB7CisgICAgICAgICAgaG9zdCA9IChzZXJ2ZXIoKSA/IGdldFBlZXJIb3N0KCkgOiBnZXRIb3N0KCkpOworICAgICAgICB9CisgICAgICAgIGRlY2lzaW9uID0gYWNjZXNzXy0+dmVyaWZ5KGhvc3QsIGRhdGEsIGxlbmd0aCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHRU5fSVBBREQ6CisgICAgICAgIGRlY2lzaW9uID0gYWNjZXNzXy0+dmVyaWZ5KHNhLCBkYXRhLCBsZW5ndGgpOworICAgICAgICBicmVhazsKICAgICAgIH0KICAgICB9CiAgICAgc2tfR0VORVJBTF9OQU1FX3BvcF9mcmVlKGFsdGVybmF0aXZlcywgR0VORVJBTF9OQU1FX2ZyZWUpOwpAQCAtNDU3LDEyICs3ODIsNzMgQEAKICAgfQogfQogCisvKgorICogTm90ZTogVGhpcyBtZXRob2QgaXMgbm90IGxpYmV2ZW50IHNhZmUuCisqLwordW5zaWduZWQgaW50IFRTU0xTb2NrZXQ6OndhaXRGb3JFdmVudChib29sIHdhbnRSZWFkKSB7CisgIGludCBmZFNvY2tldDsKKyAgQklPKiBiaW87CisKKyAgaWYgKHdhbnRSZWFkKSB7CisgICAgYmlvID0gU1NMX2dldF9yYmlvKHNzbF8pOworICB9IGVsc2UgeworICAgIGJpbyA9IFNTTF9nZXRfd2Jpbyhzc2xfKTsKKyAgfQorCisgIGlmIChiaW8gPT0gTlVMTCkgeworICAgIHRocm93IFRTU0xFeGNlcHRpb24oIlNTTF9nZXRfP2JpbyByZXR1cm5lZCBOVUxMIik7CisgIH0KKworICBpZiAoQklPX2dldF9mZChiaW8sICZmZFNvY2tldCkgPD0gMCkgeworICAgIHRocm93IFRTU0xFeGNlcHRpb24oIkJJT19nZXRfZmQgZmFpbGVkIik7CisgIH0KKworICBzdHJ1Y3QgVEhSSUZUX1BPTExGRCBmZHNbMl07CisgIG1lbXNldChmZHMsIDAsIHNpemVvZihmZHMpKTsKKyAgZmRzWzBdLmZkID0gZmRTb2NrZXQ7CisgIC8vIHVzZSBQT0xMSU4gYWxzbyBvbiB3cml0ZSBvcGVyYXRpb25zIHRvbywgdGhpcyBpcyBuZWVkZWQgZm9yIG9wZXJhdGlvbnMKKyAgLy8gd2hpY2ggcmVxdWlyZXMgcmVhZCBhbmQgd3JpdGUgb24gdGhlIHNvY2tldC4KKyAgZmRzWzBdLmV2ZW50cyA9IHdhbnRSZWFkID8gVEhSSUZUX1BPTExJTiA6IFRIUklGVF9QT0xMSU4gfCBUSFJJRlRfUE9MTE9VVDsKKworICBpZiAoaW50ZXJydXB0TGlzdGVuZXJfKSB7CisgICAgZmRzWzFdLmZkID0gKihpbnRlcnJ1cHRMaXN0ZW5lcl8uZ2V0KCkpOworICAgIGZkc1sxXS5ldmVudHMgPSBUSFJJRlRfUE9MTElOOworICB9CisKKyAgaW50IHRpbWVvdXQgPSAtMTsKKyAgaWYgKHdhbnRSZWFkICYmIHJlY3ZUaW1lb3V0XykgeworICAgIHRpbWVvdXQgPSByZWN2VGltZW91dF87CisgIH0KKyAgaWYgKCF3YW50UmVhZCAmJiBzZW5kVGltZW91dF8pIHsKKyAgICB0aW1lb3V0ID0gc2VuZFRpbWVvdXRfOworICB9CisKKyAgaW50IHJldCA9IFRIUklGVF9QT0xMKGZkcywgaW50ZXJydXB0TGlzdGVuZXJfID8gMiA6IDEsIHRpbWVvdXQpOworCisgIGlmIChyZXQgPCAwKSB7CisgICAgLy8gZXJyb3IgY2FzZXMKKyAgICBpZiAoVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IgPT0gVEhSSUZUX0VJTlRSKSB7CisgICAgICByZXR1cm4gVFNTTF9FSU5UUjsgLy8gcmVwZWF0IG9wZXJhdGlvbgorICAgIH0KKyAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTU0xTb2NrZXQ6OnJlYWQgVEhSSUZUX1BPTEwoKSAiLCBlcnJub19jb3B5KTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sICJVbmtub3duIiwgZXJybm9fY29weSk7CisgIH0gZWxzZSBpZiAocmV0ID4gMCl7CisgICAgaWYgKGZkc1sxXS5yZXZlbnRzICYgVEhSSUZUX1BPTExJTikgeworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpJTlRFUlJVUFRFRCwgIkludGVycnVwdGVkIik7CisgICAgfQorICAgIHJldHVybiBUU1NMX0RBVEE7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpUSU1FRF9PVVQsICJUSFJJRlRfUE9MTCAodGltZWQgb3V0KSIpOworICB9Cit9CisKIC8vIFRTU0xTb2NrZXRGYWN0b3J5IGltcGxlbWVudGF0aW9uCiB1aW50NjRfdCBUU1NMU29ja2V0RmFjdG9yeTo6Y291bnRfID0gMDsKLU11dGV4ICAgIFRTU0xTb2NrZXRGYWN0b3J5OjptdXRleF87Ci1ib29sICAgICBUU1NMU29ja2V0RmFjdG9yeTo6bWFudWFsT3BlblNTTEluaXRpYWxpemF0aW9uXyA9IGZhbHNlOworTXV0ZXggVFNTTFNvY2tldEZhY3Rvcnk6Om11dGV4XzsKK2Jvb2wgVFNTTFNvY2tldEZhY3Rvcnk6Om1hbnVhbE9wZW5TU0xJbml0aWFsaXphdGlvbl8gPSBmYWxzZTsKIAotVFNTTFNvY2tldEZhY3Rvcnk6OlRTU0xTb2NrZXRGYWN0b3J5KGNvbnN0IFNTTFByb3RvY29sJiBwcm90b2NvbCk6IHNlcnZlcl8oZmFsc2UpIHsKK1RTU0xTb2NrZXRGYWN0b3J5OjpUU1NMU29ja2V0RmFjdG9yeShTU0xQcm90b2NvbCBwcm90b2NvbCkgOiBzZXJ2ZXJfKGZhbHNlKSB7CiAgIEd1YXJkIGd1YXJkKG11dGV4Xyk7CiAgIGlmIChjb3VudF8gPT0gMCkgewogICAgIGlmICghbWFudWFsT3BlblNTTEluaXRpYWxpemF0aW9uXykgewpAQCAtNDcxLDcgKzg1Nyw3IEBACiAgICAgcmFuZG9taXplKCk7CiAgIH0KICAgY291bnRfKys7Ci0gIGN0eF8gPSBib29zdDo6c2hhcmVkX3B0cjxTU0xDb250ZXh0PihuZXcgU1NMQ29udGV4dChwcm90b2NvbCkpOworICBjdHhfID0gc3RkOjpzaGFyZWRfcHRyPFNTTENvbnRleHQ+KG5ldyBTU0xDb250ZXh0KHByb3RvY29sKSk7CiB9CiAKIFRTU0xTb2NrZXRGYWN0b3J5Ojp+VFNTTFNvY2tldEZhY3RvcnkoKSB7CkBAIC00ODMsMjkgKzg2OSw0NyBAQAogICB9CiB9CiAKLWJvb3N0OjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IFRTU0xTb2NrZXRGYWN0b3J5OjpjcmVhdGVTb2NrZXQoKSB7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IHNzbChuZXcgVFNTTFNvY2tldChjdHhfKSk7CitzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gVFNTTFNvY2tldEZhY3Rvcnk6OmNyZWF0ZVNvY2tldCgpIHsKKyAgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IHNzbChuZXcgVFNTTFNvY2tldChjdHhfKSk7CiAgIHNldHVwKHNzbCk7CiAgIHJldHVybiBzc2w7CiB9CiAKLWJvb3N0OjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IFRTU0xTb2NrZXRGYWN0b3J5OjpjcmVhdGVTb2NrZXQoVEhSSUZUX1NPQ0tFVCBzb2NrZXQpIHsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gc3NsKG5ldyBUU1NMU29ja2V0KGN0eF8sIHNvY2tldCkpOworc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IFRTU0xTb2NrZXRGYWN0b3J5OjpjcmVhdGVTb2NrZXQoc3RkOjpzaGFyZWRfcHRyPFRIUklGVF9TT0NLRVQ+IGludGVycnVwdExpc3RlbmVyKSB7CisgIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBzc2wobmV3IFRTU0xTb2NrZXQoY3R4XywgaW50ZXJydXB0TGlzdGVuZXIpKTsKICAgc2V0dXAoc3NsKTsKICAgcmV0dXJuIHNzbDsKIH0KIAotYm9vc3Q6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gVFNTTFNvY2tldEZhY3Rvcnk6OmNyZWF0ZVNvY2tldChjb25zdCBzdHJpbmcmIGhvc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBvcnQpIHsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gc3NsKG5ldyBUU1NMU29ja2V0KGN0eF8sIGhvc3QsIHBvcnQpKTsKK3N0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBUU1NMU29ja2V0RmFjdG9yeTo6Y3JlYXRlU29ja2V0KFRIUklGVF9TT0NLRVQgc29ja2V0KSB7CisgIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBzc2wobmV3IFRTU0xTb2NrZXQoY3R4Xywgc29ja2V0KSk7CiAgIHNldHVwKHNzbCk7CiAgIHJldHVybiBzc2w7CiB9CiAKLXZvaWQgVFNTTFNvY2tldEZhY3Rvcnk6OnNldHVwKGJvb3N0OjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IHNzbCkgeworc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IFRTU0xTb2NrZXRGYWN0b3J5OjpjcmVhdGVTb2NrZXQoVEhSSUZUX1NPQ0tFVCBzb2NrZXQsIHN0ZDo6c2hhcmVkX3B0cjxUSFJJRlRfU09DS0VUPiBpbnRlcnJ1cHRMaXN0ZW5lcikgeworICBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gc3NsKG5ldyBUU1NMU29ja2V0KGN0eF8sIHNvY2tldCwgaW50ZXJydXB0TGlzdGVuZXIpKTsKKyAgc2V0dXAoc3NsKTsKKyAgcmV0dXJuIHNzbDsKK30KKworc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IFRTU0xTb2NrZXRGYWN0b3J5OjpjcmVhdGVTb2NrZXQoY29uc3Qgc3RyaW5nJiBob3N0LCBpbnQgcG9ydCkgeworICBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gc3NsKG5ldyBUU1NMU29ja2V0KGN0eF8sIGhvc3QsIHBvcnQpKTsKKyAgc2V0dXAoc3NsKTsKKyAgcmV0dXJuIHNzbDsKK30KKworc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IFRTU0xTb2NrZXRGYWN0b3J5OjpjcmVhdGVTb2NrZXQoY29uc3Qgc3RyaW5nJiBob3N0LCBpbnQgcG9ydCwgc3RkOjpzaGFyZWRfcHRyPFRIUklGVF9TT0NLRVQ+IGludGVycnVwdExpc3RlbmVyKSB7CisgIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBzc2wobmV3IFRTU0xTb2NrZXQoY3R4XywgaG9zdCwgcG9ydCwgaW50ZXJydXB0TGlzdGVuZXIpKTsKKyAgc2V0dXAoc3NsKTsKKyAgcmV0dXJuIHNzbDsKK30KKworCit2b2lkIFRTU0xTb2NrZXRGYWN0b3J5OjpzZXR1cChzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gc3NsKSB7CiAgIHNzbC0+c2VydmVyKHNlcnZlcigpKTsKICAgaWYgKGFjY2Vzc18gPT0gTlVMTCAmJiAhc2VydmVyKCkpIHsKLSAgICBhY2Nlc3NfID0gYm9vc3Q6OnNoYXJlZF9wdHI8QWNjZXNzTWFuYWdlcj4obmV3IERlZmF1bHRDbGllbnRBY2Nlc3NNYW5hZ2VyKTsKKyAgICBhY2Nlc3NfID0gc3RkOjpzaGFyZWRfcHRyPEFjY2Vzc01hbmFnZXI+KG5ldyBEZWZhdWx0Q2xpZW50QWNjZXNzTWFuYWdlcik7CiAgIH0KICAgaWYgKGFjY2Vzc18gIT0gTlVMTCkgewogICAgIHNzbC0+YWNjZXNzKGFjY2Vzc18pOwpAQCAtNTI3LDcgKzkzMSw3IEBACiB2b2lkIFRTU0xTb2NrZXRGYWN0b3J5OjphdXRoZW50aWNhdGUoYm9vbCByZXF1aXJlZCkgewogICBpbnQgbW9kZTsKICAgaWYgKHJlcXVpcmVkKSB7Ci0gICAgbW9kZSAgPSBTU0xfVkVSSUZZX1BFRVIgfCBTU0xfVkVSSUZZX0ZBSUxfSUZfTk9fUEVFUl9DRVJUIHwgU1NMX1ZFUklGWV9DTElFTlRfT05DRTsKKyAgICBtb2RlID0gU1NMX1ZFUklGWV9QRUVSIHwgU1NMX1ZFUklGWV9GQUlMX0lGX05PX1BFRVJfQ0VSVCB8IFNTTF9WRVJJRllfQ0xJRU5UX09OQ0U7CiAgIH0gZWxzZSB7CiAgICAgbW9kZSA9IFNTTF9WRVJJRllfTk9ORTsKICAgfQpAQCAtNTM3LDcgKzk0MSw3IEBACiB2b2lkIFRTU0xTb2NrZXRGYWN0b3J5Ojpsb2FkQ2VydGlmaWNhdGUoY29uc3QgY2hhciogcGF0aCwgY29uc3QgY2hhciogZm9ybWF0KSB7CiAgIGlmIChwYXRoID09IE5VTEwgfHwgZm9ybWF0ID09IE5VTEwpIHsKICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkJBRF9BUkdTLAotICAgICAgICAgImxvYWRDZXJ0aWZpY2F0ZUNoYWluOiBlaXRoZXIgPHBhdGg+IG9yIDxmb3JtYXQ+IGlzIE5VTEwiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsb2FkQ2VydGlmaWNhdGVDaGFpbjogZWl0aGVyIDxwYXRoPiBvciA8Zm9ybWF0PiBpcyBOVUxMIik7CiAgIH0KICAgaWYgKHN0cmNtcChmb3JtYXQsICJQRU0iKSA9PSAwKSB7CiAgICAgaWYgKFNTTF9DVFhfdXNlX2NlcnRpZmljYXRlX2NoYWluX2ZpbGUoY3R4Xy0+Z2V0KCksIHBhdGgpID09IDApIHsKQEAgLTU1NCw3ICs5NTgsNyBAQAogdm9pZCBUU1NMU29ja2V0RmFjdG9yeTo6bG9hZFByaXZhdGVLZXkoY29uc3QgY2hhciogcGF0aCwgY29uc3QgY2hhciogZm9ybWF0KSB7CiAgIGlmIChwYXRoID09IE5VTEwgfHwgZm9ybWF0ID09IE5VTEwpIHsKICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkJBRF9BUkdTLAotICAgICAgICAgImxvYWRQcml2YXRlS2V5OiBlaXRoZXIgPHBhdGg+IG9yIDxmb3JtYXQ+IGlzIE5VTEwiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsb2FkUHJpdmF0ZUtleTogZWl0aGVyIDxwYXRoPiBvciA8Zm9ybWF0PiBpcyBOVUxMIik7CiAgIH0KICAgaWYgKHN0cmNtcChmb3JtYXQsICJQRU0iKSA9PSAwKSB7CiAgICAgaWYgKFNTTF9DVFhfdXNlX1ByaXZhdGVLZXlfZmlsZShjdHhfLT5nZXQoKSwgcGF0aCwgU1NMX0ZJTEVUWVBFX1BFTSkgPT0gMCkgewpAQCAtNTY2LDEyICs5NzAsMTIgQEAKICAgfQogfQogCi12b2lkIFRTU0xTb2NrZXRGYWN0b3J5Ojpsb2FkVHJ1c3RlZENlcnRpZmljYXRlcyhjb25zdCBjaGFyKiBwYXRoKSB7Cit2b2lkIFRTU0xTb2NrZXRGYWN0b3J5Ojpsb2FkVHJ1c3RlZENlcnRpZmljYXRlcyhjb25zdCBjaGFyKiBwYXRoLCBjb25zdCBjaGFyKiBjYXBhdGgpIHsKICAgaWYgKHBhdGggPT0gTlVMTCkgewogICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6QkFEX0FSR1MsCi0gICAgICAgICAibG9hZFRydXN0ZWRDZXJ0aWZpY2F0ZXM6IDxwYXRoPiBpcyBOVUxMIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibG9hZFRydXN0ZWRDZXJ0aWZpY2F0ZXM6IDxwYXRoPiBpcyBOVUxMIik7CiAgIH0KLSAgaWYgKFNTTF9DVFhfbG9hZF92ZXJpZnlfbG9jYXRpb25zKGN0eF8tPmdldCgpLCBwYXRoLCBOVUxMKSA9PSAwKSB7CisgIGlmIChTU0xfQ1RYX2xvYWRfdmVyaWZ5X2xvY2F0aW9ucyhjdHhfLT5nZXQoKSwgcGF0aCwgY2FwYXRoKSA9PSAwKSB7CiAgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKICAgICBzdHJpbmcgZXJyb3JzOwogICAgIGJ1aWxkRXJyb3JzKGVycm9ycywgZXJybm9fY29weSk7CkBAIC01ODgsMjUgKzk5MiwyMyBAQAogICBTU0xfQ1RYX3NldF9kZWZhdWx0X3Bhc3N3ZF9jYl91c2VyZGF0YShjdHhfLT5nZXQoKSwgdGhpcyk7CiB9CiAKLWludCBUU1NMU29ja2V0RmFjdG9yeTo6cGFzc3dvcmRDYWxsYmFjayhjaGFyKiBwYXNzd29yZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogZGF0YSkgeworaW50IFRTU0xTb2NrZXRGYWN0b3J5OjpwYXNzd29yZENhbGxiYWNrKGNoYXIqIHBhc3N3b3JkLCBpbnQgc2l6ZSwgaW50LCB2b2lkKiBkYXRhKSB7CiAgIFRTU0xTb2NrZXRGYWN0b3J5KiBmYWN0b3J5ID0gKFRTU0xTb2NrZXRGYWN0b3J5KilkYXRhOwogICBzdHJpbmcgdXNlclBhc3N3b3JkOwogICBmYWN0b3J5LT5nZXRQYXNzd29yZCh1c2VyUGFzc3dvcmQsIHNpemUpOwotICBpbnQgbGVuZ3RoID0gdXNlclBhc3N3b3JkLnNpemUoKTsKKyAgaW50IGxlbmd0aCA9IHN0YXRpY19jYXN0PGludD4odXNlclBhc3N3b3JkLnNpemUoKSk7CiAgIGlmIChsZW5ndGggPiBzaXplKSB7CiAgICAgbGVuZ3RoID0gc2l6ZTsKICAgfQogICBzdHJuY3B5KHBhc3N3b3JkLCB1c2VyUGFzc3dvcmQuY19zdHIoKSwgbGVuZ3RoKTsKKyAgdXNlclBhc3N3b3JkLmFzc2lnbih1c2VyUGFzc3dvcmQuc2l6ZSgpLCAnKicpOwogICByZXR1cm4gbGVuZ3RoOwogfQogCiAvLyBleHRyYWN0IGVycm9yIG1lc3NhZ2VzIGZyb20gZXJyb3IgcXVldWUKLXZvaWQgYnVpbGRFcnJvcnMoc3RyaW5nJiBlcnJvcnMsIGludCBlcnJub19jb3B5KSB7Ci0gIHVuc2lnbmVkIGxvbmcgIGVycm9yQ29kZTsKLSAgY2hhciAgIG1lc3NhZ2VbMjU2XTsKK3ZvaWQgYnVpbGRFcnJvcnMoc3RyaW5nJiBlcnJvcnMsIGludCBlcnJub19jb3B5LCBpbnQgc3NsZXJybm8pIHsKKyAgdW5zaWduZWQgbG9uZyBlcnJvckNvZGU7CisgIGNoYXIgbWVzc2FnZVsyNTZdOwogCiAgIGVycm9ycy5yZXNlcnZlKDUxMik7CiAgIHdoaWxlICgoZXJyb3JDb2RlID0gRVJSX2dldF9lcnJvcigpKSAhPSAwKSB7CkBAIC02MjYsMjIgKzEwMjgsMzIgQEAKICAgICB9CiAgIH0KICAgaWYgKGVycm9ycy5lbXB0eSgpKSB7Ci0gICAgZXJyb3JzID0gImVycm9yIGNvZGU6ICIgKyBib29zdDo6bGV4aWNhbF9jYXN0PHN0cmluZz4oZXJybm9fY29weSk7CisgICAgZXJyb3JzID0gImVycm9yIGNvZGU6ICIgKyB0b19zdHJpbmcoZXJybm9fY29weSk7CisgIH0KKyAgaWYgKHNzbGVycm5vKSB7CisgICAgZXJyb3JzICs9ICIgKFNTTF9lcnJvcl9jb2RlID0gIiArIHRvX3N0cmluZyhzc2xlcnJubykgKyAiKSI7CisgICAgaWYgKHNzbGVycm5vID09IFNTTF9FUlJPUl9TWVNDQUxMKSB7CisgICAgICBjaGFyIGJ1Zls0MDk2XTsKKyAgICAgIGludCBlcnI7CisgICAgICB3aGlsZSAoKGVyciA9IEVSUl9nZXRfZXJyb3IoKSkgIT0gMCkgeworICAgICAgICBlcnJvcnMgKz0gIiAiOworICAgICAgICBlcnJvcnMgKz0gRVJSX2Vycm9yX3N0cmluZyhlcnIsIGJ1Zik7CisgICAgICB9CisgICAgfQogICB9CiB9CiAKIC8qKgogICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBBY2Nlc3NNYW5hZ2VyCiAgKi8KLURlY2lzaW9uIERlZmF1bHRDbGllbnRBY2Nlc3NNYW5hZ2VyOjp2ZXJpZnkoY29uc3Qgc29ja2FkZHJfc3RvcmFnZSYgc2EpCi0gIHRocm93KCkgewotICAodm9pZCkgc2E7CitEZWNpc2lvbiBEZWZhdWx0Q2xpZW50QWNjZXNzTWFuYWdlcjo6dmVyaWZ5KGNvbnN0IHNvY2thZGRyX3N0b3JhZ2UmIHNhKSBub2V4Y2VwdCB7CisgICh2b2lkKXNhOwogICByZXR1cm4gU0tJUDsKIH0KIAogRGVjaXNpb24gRGVmYXVsdENsaWVudEFjY2Vzc01hbmFnZXI6OnZlcmlmeShjb25zdCBzdHJpbmcmIGhvc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplKSB0aHJvdygpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemUpIG5vZXhjZXB0IHsKICAgaWYgKGhvc3QuZW1wdHkoKSB8fCBuYW1lID09IE5VTEwgfHwgc2l6ZSA8PSAwKSB7CiAgICAgcmV0dXJuIFNLSVA7CiAgIH0KQEAgLTY1MCw3ICsxMDYyLDcgQEAKIAogRGVjaXNpb24gRGVmYXVsdENsaWVudEFjY2Vzc01hbmFnZXI6OnZlcmlmeShjb25zdCBzb2NrYWRkcl9zdG9yYWdlJiBzYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemUpIHRocm93KCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSkgbm9leGNlcHQgewogICBib29sIG1hdGNoID0gZmFsc2U7CiAgIGlmIChzYS5zc19mYW1pbHkgPT0gQUZfSU5FVCAmJiBzaXplID09IHNpemVvZihpbl9hZGRyKSkgewogICAgIG1hdGNoID0gKG1lbWNtcCgmKChzb2NrYWRkcl9pbiopJnNhKS0+c2luX2FkZHIsIGRhdGEsIHNpemUpID09IDApOwpAQCAtNjkxLDE2ICsxMTAzLDE2IEBACiAgICAgbWF0Y2ggPSB0cnVlOwogICB9CiAgIHJldHVybiBtYXRjaDsKLQogfQogCiAvLyBUaGlzIGlzIHRvIHdvcmsgYXJvdW5kIHRoZSBUdXJraXNoIGxvY2FsZSBpc3N1ZSwgaS5lLiwKIC8vIHRvdXBwZXIoJ2knKSAhPSB0b3VwcGVyKCdJJykgaWYgbG9jYWxlIGlzICJ0cl9UUiIKLWNoYXIgdXBwZXJjYXNlIChjaGFyIGMpIHsKK2NoYXIgdXBwZXJjYXNlKGNoYXIgYykgewogICBpZiAoJ2EnIDw9IGMgJiYgYyA8PSAneicpIHsKICAgICByZXR1cm4gYyArICgnQScgLSAnYScpOwogICB9CiAgIHJldHVybiBjOwogfQotCi19fX0KK30KK30KK30KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNTTFNvY2tldC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU1NMU29ja2V0LmgKaW5kZXggYTRiODA1Yi4uNWE4N2QxZSAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU1NMU29ja2V0LmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU1NMU29ja2V0LmgKQEAgLTIwLDI2ICsyMCwzMiBAQAogI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UU1NMU09DS0VUX0hfCiAjZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1RTU0xTT0NLRVRfSF8gMQogCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgotI2luY2x1ZGUgPG9wZW5zc2wvc3NsLmg+Ci0jaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L011dGV4Lmg+CisvLyBQdXQgdGhpcyBmaXJzdCB0byBhdm9pZCBXSU4zMiBidWlsZCBmYWlsdXJlCiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0Lmg+CiAKLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHRyYW5zcG9ydCB7CisjaW5jbHVkZSA8b3BlbnNzbC9zc2wuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L011dGV4Lmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKIAogY2xhc3MgQWNjZXNzTWFuYWdlcjsKIGNsYXNzIFNTTENvbnRleHQ7CiAKIGVudW0gU1NMUHJvdG9jb2wgewotCVNTTFRMUwkJPSAwLAkvLyBTdXBwb3J0cyBTU0x2MyBhbmQgVExTdjEuCi0JLy9TU0x2MgkJPSAxLAkvLyBIT1JSSUJMWSBJTlNFQ1VSRSEKLQlTU0x2MwkJPSAyLAkvLyBTdXBwb3J0cyBTU0x2MyBvbmx5LgotCVRMU3YxXzAJCT0gMywJLy8gU3VwcG9ydHMgVExTdjFfMCBvbmx5LgotCVRMU3YxXzEJCT0gNCwJLy8gU3VwcG9ydHMgVExTdjFfMSBvbmx5LgotCVRMU3YxXzIJCT0gNSAJLy8gU3VwcG9ydHMgVExTdjFfMiBvbmx5LgorICBTU0xUTFMgID0gMCwgIC8vIFN1cHBvcnRzIFNTTHYyIGFuZCBTU0x2MyBoYW5kc2hha2UgYnV0IG9ubHkgbmVnb3RpYXRlcyBhdCBUTFN2MV8wIG9yIGxhdGVyLgorLy9TU0x2MiAgID0gMSwgIC8vIEhPUlJJQkxZIElOU0VDVVJFIQorICBTU0x2MyAgID0gMiwgIC8vIFN1cHBvcnRzIFNTTHYzIG9ubHkgLSBhbHNvIGhvcnJpYmx5IGluc2VjdXJlIQorICBUTFN2MV8wID0gMywgIC8vIFN1cHBvcnRzIFRMU3YxXzAgb3IgbGF0ZXIuCisgIFRMU3YxXzEgPSA0LCAgLy8gU3VwcG9ydHMgVExTdjFfMSBvciBsYXRlci4KKyAgVExTdjFfMiA9IDUsICAvLyBTdXBwb3J0cyBUTFN2MV8yIG9yIGxhdGVyLgorICBMQVRFU1QgID0gVExTdjFfMgogfTsKIAorI2RlZmluZSBUU1NMX0VJTlRSIDAKKyNkZWZpbmUgVFNTTF9EQVRBIDEKIAogLyoqCiAgKiBJbml0aWFsaXplIE9wZW5TU0wgbGlicmFyeS4gIFRoaXMgZnVuY3Rpb24sIG9yIHNvbWUgb3RoZXIKQEAgLTYxLDI0ICs2NywyNiBAQAogLyoqCiAgKiBPcGVuU1NMIGltcGxlbWVudGF0aW9uIGZvciBTU0wgc29ja2V0IGludGVyZmFjZS4KICAqLwotY2xhc3MgVFNTTFNvY2tldDogcHVibGljIFRTb2NrZXQgewotIHB1YmxpYzoKLSB+VFNTTFNvY2tldCgpOworY2xhc3MgVFNTTFNvY2tldCA6IHB1YmxpYyBUU29ja2V0IHsKK3B1YmxpYzoKKyAgflRTU0xTb2NrZXQoKTsKICAgLyoqCiAgICAqIFRUcmFuc3BvcnQgaW50ZXJmYWNlLgogICAgKi8KLSAgYm9vbCAgICAgaXNPcGVuKCk7Ci0gIGJvb2wgICAgIHBlZWsoKTsKLSAgdm9pZCAgICAgb3BlbigpOwotICB2b2lkICAgICBjbG9zZSgpOworICBib29sIGlzT3BlbigpOworICBib29sIHBlZWsoKTsKKyAgdm9pZCBvcGVuKCk7CisgIHZvaWQgY2xvc2UoKTsKKyAgYm9vbCBoYXNQZW5kaW5nRGF0YVRvUmVhZCgpOwogICB1aW50MzJfdCByZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKLSAgdm9pZCAgICAgd3JpdGUoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOwotICB2b2lkICAgICBmbHVzaCgpOwotICAgLyoqCi0gICAqIFNldCB3aGV0aGVyIHRvIHVzZSBjbGllbnQgb3Igc2VydmVyIHNpZGUgU1NMIGhhbmRzaGFrZSBwcm90b2NvbC4KLSAgICoKLSAgICogQHBhcmFtIGZsYWcgIFVzZSBzZXJ2ZXIgc2lkZSBoYW5kc2hha2UgcHJvdG9jb2wgaWYgdHJ1ZS4KLSAgICovCisgIHZvaWQgd3JpdGUoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOworICB1aW50MzJfdCB3cml0ZV9wYXJ0aWFsKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKKyAgdm9pZCBmbHVzaCgpOworICAvKioKKyAgKiBTZXQgd2hldGhlciB0byB1c2UgY2xpZW50IG9yIHNlcnZlciBzaWRlIFNTTCBoYW5kc2hha2UgcHJvdG9jb2wuCisgICoKKyAgKiBAcGFyYW0gZmxhZyAgVXNlIHNlcnZlciBzaWRlIGhhbmRzaGFrZSBwcm90b2NvbCBpZiB0cnVlLgorICAqLwogICB2b2lkIHNlcnZlcihib29sIGZsYWcpIHsgc2VydmVyXyA9IGZsYWc7IH0KICAgLyoqCiAgICAqIERldGVybWluZSB3aGV0aGVyIHRoZSBTU0wgc29ja2V0IGlzIHNlcnZlciBvciBjbGllbnQgbW9kZS4KQEAgLTg5LDI5ICs5Nyw1MSBAQAogICAgKgogICAgKiBAcGFyYW0gbWFuYWdlciAgSW5zdGFuY2Ugb2YgQWNjZXNzTWFuYWdlcgogICAgKi8KLSAgdmlydHVhbCB2b2lkIGFjY2Vzcyhib29zdDo6c2hhcmVkX3B0cjxBY2Nlc3NNYW5hZ2VyPiBtYW5hZ2VyKSB7Ci0gICAgYWNjZXNzXyA9IG1hbmFnZXI7Ci0gIH0KKyAgdmlydHVhbCB2b2lkIGFjY2VzcyhzdGQ6OnNoYXJlZF9wdHI8QWNjZXNzTWFuYWdlcj4gbWFuYWdlcikgeyBhY2Nlc3NfID0gbWFuYWdlcjsgfQorICAvKioKKyAgICogU2V0IGV2ZW50U2FmZSBmbGFnIGlmIGxpYmV2ZW50IGlzIHVzZWQuCisgICAqLworICB2b2lkIHNldExpYmV2ZW50U2FmZSgpIHsgZXZlbnRTYWZlXyA9IHRydWU7IH0KKyAgLyoqCisgICAqIERldGVybWluZXMgd2hldGhlciBTU0wgU29ja2V0IGlzIGxpYmV2ZW50IHNhZmUgb3Igbm90LgorICAgKi8KKyAgYm9vbCBpc0xpYmV2ZW50U2FmZSgpIGNvbnN0IHsgcmV0dXJuIGV2ZW50U2FmZV87IH0KKwogcHJvdGVjdGVkOgogICAvKioKICAgICogQ29uc3RydWN0b3IuCiAgICAqLwotICBUU1NMU29ja2V0KGJvb3N0OjpzaGFyZWRfcHRyPFNTTENvbnRleHQ+IGN0eCk7CisgIFRTU0xTb2NrZXQoc3RkOjpzaGFyZWRfcHRyPFNTTENvbnRleHQ+IGN0eCk7CisgIC8qKgorICAgKiBDb25zdHJ1Y3RvciB3aXRoIGFuIGludGVycnVwdCBzaWduYWwuCisgICAqLworICBUU1NMU29ja2V0KHN0ZDo6c2hhcmVkX3B0cjxTU0xDb250ZXh0PiBjdHgsIHN0ZDo6c2hhcmVkX3B0cjxUSFJJRlRfU09DS0VUPiBpbnRlcnJ1cHRMaXN0ZW5lcik7CiAgIC8qKgogICAgKiBDb25zdHJ1Y3RvciwgY3JlYXRlIGFuIGluc3RhbmNlIG9mIFRTU0xTb2NrZXQgZ2l2ZW4gYW4gZXhpc3Rpbmcgc29ja2V0LgogICAgKgogICAgKiBAcGFyYW0gc29ja2V0IEFuIGV4aXN0aW5nIHNvY2tldAogICAgKi8KLSAgVFNTTFNvY2tldChib29zdDo6c2hhcmVkX3B0cjxTU0xDb250ZXh0PiBjdHgsIFRIUklGVF9TT0NLRVQgc29ja2V0KTsKKyAgVFNTTFNvY2tldChzdGQ6OnNoYXJlZF9wdHI8U1NMQ29udGV4dD4gY3R4LCBUSFJJRlRfU09DS0VUIHNvY2tldCk7CiAgIC8qKgorICAgKiBDb25zdHJ1Y3RvciwgY3JlYXRlIGFuIGluc3RhbmNlIG9mIFRTU0xTb2NrZXQgZ2l2ZW4gYW4gZXhpc3Rpbmcgc29ja2V0IHRoYXQgY2FuIGJlIGludGVycnVwdGVkLgorICAgKgorICAgKiBAcGFyYW0gc29ja2V0IEFuIGV4aXN0aW5nIHNvY2tldAorICAgKi8KKyAgVFNTTFNvY2tldChzdGQ6OnNoYXJlZF9wdHI8U1NMQ29udGV4dD4gY3R4LCBUSFJJRlRfU09DS0VUIHNvY2tldCwgc3RkOjpzaGFyZWRfcHRyPFRIUklGVF9TT0NLRVQ+IGludGVycnVwdExpc3RlbmVyKTsKKyAgIC8qKgogICAgKiBDb25zdHJ1Y3Rvci4KICAgICoKICAgICogQHBhcmFtIGhvc3QgIFJlbW90ZSBob3N0IG5hbWUKICAgICogQHBhcmFtIHBvcnQgIFJlbW90ZSBwb3J0IG51bWJlcgogICAgKi8KLSAgVFNTTFNvY2tldChib29zdDo6c2hhcmVkX3B0cjxTU0xDb250ZXh0PiBjdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaG9zdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwb3J0KTsKKyAgVFNTTFNvY2tldChzdGQ6OnNoYXJlZF9wdHI8U1NMQ29udGV4dD4gY3R4LCBzdGQ6OnN0cmluZyBob3N0LCBpbnQgcG9ydCk7CisgICAgLyoqCisgICogQ29uc3RydWN0b3Igd2l0aCBhbiBpbnRlcnJ1cHQgc2lnbmFsLgorICAqCisgICogQHBhcmFtIGhvc3QgIFJlbW90ZSBob3N0IG5hbWUKKyAgKiBAcGFyYW0gcG9ydCAgUmVtb3RlIHBvcnQgbnVtYmVyCisgICovCisgICAgVFNTTFNvY2tldChzdGQ6OnNoYXJlZF9wdHI8U1NMQ29udGV4dD4gY3R4LCBzdGQ6OnN0cmluZyBob3N0LCBpbnQgcG9ydCwgc3RkOjpzaGFyZWRfcHRyPFRIUklGVF9TT0NLRVQ+IGludGVycnVwdExpc3RlbmVyKTsKICAgLyoqCiAgICAqIEF1dGhvcml6ZSBwZWVyIGFjY2VzcyBhZnRlciBTU0wgaGFuZHNoYWtlIGNvbXBsZXRlcy4KICAgICovCkBAIC0xMTksNDUgKzE0OSw5OSBAQAogICAvKioKICAgICogSW5pdGlhdGUgU1NMIGhhbmRzaGFrZSBpZiBub3QgYWxyZWFkeSBpbml0aWF0ZWQuCiAgICAqLwotICB2b2lkIGNoZWNrSGFuZHNoYWtlKCk7CisgIHZvaWQgaW5pdGlhbGl6ZUhhbmRzaGFrZSgpOworICAvKioKKyAgICogSW5pdGlhdGUgU1NMIGhhbmRzaGFrZSBwYXJhbXMuCisgICAqLworICB2b2lkIGluaXRpYWxpemVIYW5kc2hha2VQYXJhbXMoKTsKKyAgLyoqCisgICAqIENoZWNrIGlmICBTU0wgaGFuZHNoYWtlIGlzIGNvbXBsZXRlZCBvciBub3QuCisgICAqLworICBib29sIGNoZWNrSGFuZHNoYWtlKCk7CisgIC8qKgorICAgKiBXYWl0cyBmb3IgYW4gc29ja2V0IG9yIHNodXRkb3duIGV2ZW50LgorICAgKgorICAgKiBAdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbjo6SU5URVJSVVBURUQgaWYgaW50ZXJydXB0ZWQgaXMgc2lnbmFsZWQuCisgICAqCisgICAqIEByZXR1cm4gVFNTTF9FSU5UUiBpZiBFSU5UUiBoYXBwZW5lZCBvbiB0aGUgdW5kZXJseWluZyBzb2NrZXQKKyAgICogICAgICAgICBUU1NMX0RBVEEgIGlmIGRhdGEgaXMgYXZhaWxhYmxlIG9uIHRoZSBzb2NrZXQuCisgICAqLworICB1bnNpZ25lZCBpbnQgd2FpdEZvckV2ZW50KGJvb2wgd2FudFJlYWQpOwogCiAgIGJvb2wgc2VydmVyXzsKICAgU1NMKiBzc2xfOwotICBib29zdDo6c2hhcmVkX3B0cjxTU0xDb250ZXh0PiBjdHhfOwotICBib29zdDo6c2hhcmVkX3B0cjxBY2Nlc3NNYW5hZ2VyPiBhY2Nlc3NfOworICBzdGQ6OnNoYXJlZF9wdHI8U1NMQ29udGV4dD4gY3R4XzsKKyAgc3RkOjpzaGFyZWRfcHRyPEFjY2Vzc01hbmFnZXI+IGFjY2Vzc187CiAgIGZyaWVuZCBjbGFzcyBUU1NMU29ja2V0RmFjdG9yeTsKKworcHJpdmF0ZToKKyAgYm9vbCBoYW5kc2hha2VDb21wbGV0ZWRfOworICBpbnQgcmVhZFJldHJ5Q291bnRfOworICBib29sIGV2ZW50U2FmZV87CisKKyAgdm9pZCBpbml0KCk7CiB9OwogCiAvKioKICAqIFNTTCBzb2NrZXQgZmFjdG9yeS4gU1NMIHNvY2tldHMgc2hvdWxkIGJlIGNyZWF0ZWQgdmlhIFNTTCBmYWN0b3J5LgorICogVGhlIGZhY3Rvcnkgd2lsbCBhdXRvbWF0aWNhbGx5IGluaXRpYWxpemUgYW5kIGNsZWFudXAgb3BlbnNzbCBhcyBsb25nIGFzCisgKiB0aGVyZSBpcyBhIFRTU0xTb2NrZXRGYWN0b3J5IGluc3RhbnRpYXRlZCwgYW5kIGFzIGxvbmcgYXMgdGhlIHN0YXRpYworICogYm9vbGVhbiBtYW51YWxPcGVuU1NMSW5pdGlhbGl6YXRpb25fIGlzIHNldCB0byBmYWxzZSwgdGhlIGRlZmF1bHQuCisgKgorICogSWYgeW91IHdvdWxkIGxpa2UgdG8gaW5pdGlhbGl6ZSBhbmQgY2xlYW51cCBvcGVuc3NsIHlvdXJzZWxmLCBzZXQKKyAqIG1hbnVhbE9wZW5TU0xJbml0aWFsaXphdGlvbl8gdG8gdHJ1ZSBhbmQgVFNTTFNvY2tldEZhY3Rvcnkgd2lsbCBubworICogbG9uZ2VyIGJlIHJlc3BvbnNpYmxlIGZvciBvcGVuc3NsIGluaXRpYWxpemF0aW9uIGFuZCB0ZWFyZG93bi4KKyAqCisgKiBJdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIGNvZGUgdXNpbmcgVFNTTFNvY2tldEZhY3RvcnkgdG8KKyAqIGVuc3VyZSB0aGF0IHRoZSBmYWN0b3J5IGxpZmV0aW1lIGV4Y2VlZHMgdGhlIGxpZmV0aW1lIG9mIGFueSBzb2NrZXRzCisgKiBpdCBtaWdodCBjcmVhdGUuICBJZiB0aGlzIGlzIG5vdCBndWFyYW50ZWVkLCBhIHNvY2tldCBtYXkgY2FsbCBpbnRvCisgKiBvcGVuc3NsIGFmdGVyIHRoZSBzb2NrZXQgZmFjdG9yeSBoYXMgY2xlYW5lZCB1cCBvcGVuc3NsISAgVGhpcworICogZ3VhcmFudGVlIGlzIHVubmVjZXNzYXJ5IGlmIG1hbnVhbE9wZW5TU0xJbml0aWFsaXphdGlvbl8gaXMgdHJ1ZSwKKyAqIGhvd2V2ZXIsIHNpbmNlIGl0IHdvdWxkIGJlIHVwIHRvIHRoZSBjb25zdW1pbmcgYXBwbGljYXRpb24gaW5zdGVhZC4KICAqLwogY2xhc3MgVFNTTFNvY2tldEZhY3RvcnkgewotIHB1YmxpYzoKK3B1YmxpYzoKICAgLyoqCiAgICAqIENvbnN0cnVjdG9yL0Rlc3RydWN0b3IKICAgICoKICAgICogQHBhcmFtIHByb3RvY29sIFRoZSBTU0wvVExTIHByb3RvY29sIHRvIHVzZS4KICAgICovCi0gIFRTU0xTb2NrZXRGYWN0b3J5KGNvbnN0IFNTTFByb3RvY29sJiBwcm90b2NvbCA9IFNTTFRMUyk7CisgIFRTU0xTb2NrZXRGYWN0b3J5KFNTTFByb3RvY29sIHByb3RvY29sID0gU1NMVExTKTsKICAgdmlydHVhbCB+VFNTTFNvY2tldEZhY3RvcnkoKTsKICAgLyoqCiAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBUU1NMU29ja2V0IHdpdGggYSBmcmVzaCBuZXcgc29ja2V0LgogICAgKi8KLSAgdmlydHVhbCBib29zdDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBjcmVhdGVTb2NrZXQoKTsKKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gY3JlYXRlU29ja2V0KCk7CisgIC8qKgorICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgVFNTTFNvY2tldCB3aXRoIGEgZnJlc2ggbmV3IHNvY2tldCwgd2hpY2ggaXMgaW50ZXJydXB0YWJsZS4KKyAgICovCisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IGNyZWF0ZVNvY2tldChzdGQ6OnNoYXJlZF9wdHI8VEhSSUZUX1NPQ0tFVD4gaW50ZXJydXB0TGlzdGVuZXIpOwogICAvKioKICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIFRTU0xTb2NrZXQgd2l0aCB0aGUgZ2l2ZW4gc29ja2V0LgogICAgKgogICAgKiBAcGFyYW0gc29ja2V0IEFuIGV4aXN0aW5nIHNvY2tldC4KICAgICovCi0gIHZpcnR1YWwgYm9vc3Q6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gY3JlYXRlU29ja2V0KFRIUklGVF9TT0NLRVQgc29ja2V0KTsKLSAgIC8qKgotICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgVFNTTFNvY2tldC4KKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gY3JlYXRlU29ja2V0KFRIUklGVF9TT0NLRVQgc29ja2V0KTsKKyAgLyoqCisgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBUU1NMU29ja2V0IHdpdGggdGhlIGdpdmVuIHNvY2tldCB3aGljaCBpcyBpbnRlcnJ1cHRhYmxlLgogICAgKgotICAgKiBAcGFyYW0gaG9zdCAgUmVtb3RlIGhvc3QgdG8gYmUgY29ubmVjdGVkIHRvCi0gICAqIEBwYXJhbSBwb3J0ICBSZW1vdGUgcG9ydCB0byBiZSBjb25uZWN0ZWQgdG8KKyAgICogQHBhcmFtIHNvY2tldCBBbiBleGlzdGluZyBzb2NrZXQuCiAgICAqLwotICB2aXJ0dWFsIGJvb3N0OjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IGNyZWF0ZVNvY2tldChjb25zdCBzdGQ6OnN0cmluZyYgaG9zdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBvcnQpOworICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBjcmVhdGVTb2NrZXQoVEhSSUZUX1NPQ0tFVCBzb2NrZXQsIHN0ZDo6c2hhcmVkX3B0cjxUSFJJRlRfU09DS0VUPiBpbnRlcnJ1cHRMaXN0ZW5lcik7CisgIC8qKgorICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBUU1NMU29ja2V0LgorICAqCisgICogQHBhcmFtIGhvc3QgIFJlbW90ZSBob3N0IHRvIGJlIGNvbm5lY3RlZCB0bworICAqIEBwYXJhbSBwb3J0ICBSZW1vdGUgcG9ydCB0byBiZSBjb25uZWN0ZWQgdG8KKyAgKi8KKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gY3JlYXRlU29ja2V0KGNvbnN0IHN0ZDo6c3RyaW5nJiBob3N0LCBpbnQgcG9ydCk7CisgIC8qKgorICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBUU1NMU29ja2V0LgorICAqCisgICogQHBhcmFtIGhvc3QgIFJlbW90ZSBob3N0IHRvIGJlIGNvbm5lY3RlZCB0bworICAqIEBwYXJhbSBwb3J0ICBSZW1vdGUgcG9ydCB0byBiZSBjb25uZWN0ZWQgdG8KKyAgKi8KKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gY3JlYXRlU29ja2V0KGNvbnN0IHN0ZDo6c3RyaW5nJiBob3N0LCBpbnQgcG9ydCwgc3RkOjpzaGFyZWRfcHRyPFRIUklGVF9TT0NLRVQ+IGludGVycnVwdExpc3RlbmVyKTsKICAgLyoqCiAgICAqIFNldCBjaXBoZXJzIHRvIGJlIHVzZWQgaW4gU1NMIGhhbmRzaGFrZSBwcm9jZXNzLgogICAgKgpAQCAtMTg5LDcgKzI3Myw3IEBACiAgICAqCiAgICAqIEBwYXJhbSBwYXRoIFBhdGggdG8gdHJ1c3RlZCBjZXJ0aWZpY2F0ZSBmaWxlCiAgICAqLwotICB2aXJ0dWFsIHZvaWQgbG9hZFRydXN0ZWRDZXJ0aWZpY2F0ZXMoY29uc3QgY2hhciogcGF0aCk7CisgIHZpcnR1YWwgdm9pZCBsb2FkVHJ1c3RlZENlcnRpZmljYXRlcyhjb25zdCBjaGFyKiBwYXRoLCBjb25zdCBjaGFyKiBjYXBhdGggPSBOVUxMKTsKICAgLyoqCiAgICAqIERlZmF1bHQgcmFuZG9taXplIG1ldGhvZC4KICAgICovCkBAIC0yMTUsMTQgKzI5OSwxMyBAQAogICAgKgogICAgKiBAcGFyYW0gbWFuYWdlciAgVGhlIEFjY2Vzc01hbmFnZXIgaW5zdGFuY2UKICAgICovCi0gIHZpcnR1YWwgdm9pZCBhY2Nlc3MoYm9vc3Q6OnNoYXJlZF9wdHI8QWNjZXNzTWFuYWdlcj4gbWFuYWdlcikgewotICAgIGFjY2Vzc18gPSBtYW5hZ2VyOwotICB9CisgIHZpcnR1YWwgdm9pZCBhY2Nlc3Moc3RkOjpzaGFyZWRfcHRyPEFjY2Vzc01hbmFnZXI+IG1hbmFnZXIpIHsgYWNjZXNzXyA9IG1hbmFnZXI7IH0KICAgc3RhdGljIHZvaWQgc2V0TWFudWFsT3BlblNTTEluaXRpYWxpemF0aW9uKGJvb2wgbWFudWFsT3BlblNTTEluaXRpYWxpemF0aW9uKSB7CiAgICAgbWFudWFsT3BlblNTTEluaXRpYWxpemF0aW9uXyA9IG1hbnVhbE9wZW5TU0xJbml0aWFsaXphdGlvbjsKICAgfQotIHByb3RlY3RlZDoKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8U1NMQ29udGV4dD4gY3R4XzsKKworcHJvdGVjdGVkOgorICBzdGQ6OnNoYXJlZF9wdHI8U1NMQ29udGV4dD4gY3R4XzsKIAogICAvKioKICAgICogT3ZlcnJpZGUgdGhpcyBtZXRob2QgZm9yIGN1c3RvbSBwYXNzd29yZCBjYWxsYmFjay4gSXQgbWF5IGJlIGNhbGxlZApAQCAtMjMyLDI1ICszMTUsMjYgQEAKICAgICogQHBhcmFtIHNpemUgICAgIE1heGltdW0gbGVuZ3RoIG9mIHBhc3N3b3JkIGluY2x1ZGluZyBOVUxMIGNoYXJhY3RlcgogICAgKi8KICAgdmlydHVhbCB2b2lkIGdldFBhc3N3b3JkKHN0ZDo6c3RyaW5nJiAvKiBwYXNzd29yZCAqLywgaW50IC8qIHNpemUgKi8pIHt9Ci0gcHJpdmF0ZToKKworcHJpdmF0ZToKICAgYm9vbCBzZXJ2ZXJfOwotICBib29zdDo6c2hhcmVkX3B0cjxBY2Nlc3NNYW5hZ2VyPiBhY2Nlc3NfOworICBzdGQ6OnNoYXJlZF9wdHI8QWNjZXNzTWFuYWdlcj4gYWNjZXNzXzsKICAgc3RhdGljIGNvbmN1cnJlbmN5OjpNdXRleCBtdXRleF87CiAgIHN0YXRpYyB1aW50NjRfdCBjb3VudF87CiAgIHN0YXRpYyBib29sIG1hbnVhbE9wZW5TU0xJbml0aWFsaXphdGlvbl87Ci0gIHZvaWQgc2V0dXAoYm9vc3Q6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gc3NsKTsKKyAgdm9pZCBzZXR1cChzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gc3NsKTsKICAgc3RhdGljIGludCBwYXNzd29yZENhbGxiYWNrKGNoYXIqIHBhc3N3b3JkLCBpbnQgc2l6ZSwgaW50LCB2b2lkKiBkYXRhKTsKIH07CiAKIC8qKgogICogU1NMIGV4Y2VwdGlvbi4KICAqLwotY2xhc3MgVFNTTEV4Y2VwdGlvbjogcHVibGljIFRUcmFuc3BvcnRFeGNlcHRpb24gewotIHB1YmxpYzoKLSAgVFNTTEV4Y2VwdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSk6Ci0gICAgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpJTlRFUk5BTF9FUlJPUiwgbWVzc2FnZSkge30KK2NsYXNzIFRTU0xFeGNlcHRpb24gOiBwdWJsaWMgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CitwdWJsaWM6CisgIFRTU0xFeGNlcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpCisgICAgOiBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OklOVEVSTkFMX0VSUk9SLCBtZXNzYWdlKSB7fQogCi0gIHZpcnR1YWwgY29uc3QgY2hhciogd2hhdCgpIGNvbnN0IHRocm93KCkgeworICB2aXJ0dWFsIGNvbnN0IGNoYXIqIHdoYXQoKSBjb25zdCBub2V4Y2VwdCB7CiAgICAgaWYgKG1lc3NhZ2VfLmVtcHR5KCkpIHsKICAgICAgIHJldHVybiAiVFNTTEV4Y2VwdGlvbiI7CiAgICAgfSBlbHNlIHsKQEAgLTI2MywxMiArMzQ3LDEzIEBACiAgKiBXcmFwIE9wZW5TU0wgU1NMX0NUWCBpbnRvIGEgY2xhc3MuCiAgKi8KIGNsYXNzIFNTTENvbnRleHQgewotIHB1YmxpYzoKK3B1YmxpYzoKICAgU1NMQ29udGV4dChjb25zdCBTU0xQcm90b2NvbCYgcHJvdG9jb2wgPSBTU0xUTFMpOwogICB2aXJ0dWFsIH5TU0xDb250ZXh0KCk7CiAgIFNTTCogY3JlYXRlU1NMKCk7CiAgIFNTTF9DVFgqIGdldCgpIHsgcmV0dXJuIGN0eF87IH0KLSBwcml2YXRlOgorCitwcml2YXRlOgogICBTU0xfQ1RYKiBjdHhfOwogfTsKIApAQCAtMjc5LDY3ICszNjQsNzMgQEAKICAqIG9iamVjdC4KICAqLwogY2xhc3MgQWNjZXNzTWFuYWdlciB7Ci0gcHVibGljOgorcHVibGljOgogICBlbnVtIERlY2lzaW9uIHsKLSAgICBERU5ZICAgPSAtMSwgICAgLy8gZGVueSBhY2Nlc3MKLSAgICBTS0lQICAgPSAgMCwgICAgLy8gY2Fubm90IG1ha2UgZGVjaXNpb24sIG1vdmUgb24gdG8gbmV4dCAoaWYgYW55KQotICAgIEFMTE9XICA9ICAxICAgICAvLyBhbGxvdyBhY2Nlc3MKKyAgICBERU5ZID0gLTEsIC8vIGRlbnkgYWNjZXNzCisgICAgU0tJUCA9IDAsICAvLyBjYW5ub3QgbWFrZSBkZWNpc2lvbiwgbW92ZSBvbiB0byBuZXh0IChpZiBhbnkpCisgICAgQUxMT1cgPSAxICAvLyBhbGxvdyBhY2Nlc3MKICAgfTsKLSAvKioKLSAgKiBEZXN0cnVjdG9yCi0gICovCi0gdmlydHVhbCB+QWNjZXNzTWFuYWdlcigpIHt9Ci0gLyoqCi0gICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHBlZXIgc2hvdWxkIGJlIGdyYW50ZWQgYWNjZXNzIG9yIG5vdC4gSXQncyBjYWxsZWQKLSAgKiBvbmNlIGFmdGVyIHRoZSBTU0wgaGFuZHNoYWtlIGNvbXBsZXRlcyBzdWNjZXNzZnVsbHksIGJlZm9yZSBwZWVyIGNlcnRpZmljYXRlCi0gICogaXMgZXhhbWluZWQuCi0gICoKLSAgKiBJZiBhIHZhbGlkIGRlY2lzaW9uIChBTExPVyBvciBERU5ZKSBpcyByZXR1cm5lZCwgdGhlIHBlZXIgY2VydGlmaWNhdGUgaXMKLSAgKiBub3QgdG8gYmUgdmVyaWZpZWQuCi0gICoKLSAgKiBAcGFyYW0gIHNhIFBlZXIgSVAgYWRkcmVzcwotICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgcGVlciBpcyB0cnVzdGVkLCBmYWxzZSBvdGhlcndpc2UKLSAgKi8KLSB2aXJ0dWFsIERlY2lzaW9uIHZlcmlmeShjb25zdCBzb2NrYWRkcl9zdG9yYWdlJiAvKiBzYSAqLyApIHRocm93KCkgeyByZXR1cm4gREVOWTsgfQotIC8qKgotICAqIERldGVybWluZSB3aGV0aGVyIHRoZSBwZWVyIHNob3VsZCBiZSBncmFudGVkIGFjY2VzcyBvciBub3QuIEl0J3MgY2FsbGVkCi0gICogZXZlcnkgdGltZSBhIEROUyBzdWJqZWN0QWx0TmFtZS9jb21tb24gbmFtZSBpcyBleHRyYWN0ZWQgZnJvbSBwZWVyJ3MKLSAgKiBjZXJ0aWZpY2F0ZS4KLSAgKgotICAqIEBwYXJhbSAgaG9zdCBDbGllbnQgbW9kZTogaG9zdCBuYW1lIHJldHVybmVkIGJ5IFRTb2NrZXQ6OmdldEhvc3QoKQotICAqICAgICAgICAgICAgICBTZXJ2ZXIgbW9kZTogaG9zdCBuYW1lIHJldHVybmVkIGJ5IFRTb2NrZXQ6OmdldFBlZXJIb3N0KCkKLSAgKiBAcGFyYW0gIG5hbWUgU3ViamVjdEFsdE5hbWUgb3IgY29tbW9uIG5hbWUgZXh0cmFjdGVkIGZyb20gcGVlciBjZXJ0aWZpY2F0ZQotICAqIEBwYXJhbSAgc2l6ZSBMZW5ndGggb2YgbmFtZQotICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgcGVlciBpcyB0cnVzdGVkLCBmYWxzZSBvdGhlcndpc2UKLSAgKgotICAqIE5vdGU6IFRoZSAibmFtZSIgcGFyYW1ldGVyIG1heSBiZSBVVEY4IGVuY29kZWQuCi0gICovCi0gdmlydHVhbCBEZWNpc2lvbiB2ZXJpZnkoY29uc3Qgc3RkOjpzdHJpbmcmIC8qIGhvc3QgKi8sIGNvbnN0IGNoYXIqIC8qIG5hbWUgKi8sIGludCAvKiBzaXplICovKQotICAgdGhyb3coKSB7IHJldHVybiBERU5ZOyB9Ci0gLyoqCi0gICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHBlZXIgc2hvdWxkIGJlIGdyYW50ZWQgYWNjZXNzIG9yIG5vdC4gSXQncyBjYWxsZWQKLSAgKiBldmVyeSB0aW1lIGFuIElQIHN1YmplY3RBbHROYW1lIGlzIGV4dHJhY3RlZCBmcm9tIHBlZXIncyBjZXJ0aWZpY2F0ZS4KLSAgKgotICAqIEBwYXJhbSAgc2EgICBQZWVyIElQIGFkZHJlc3MgcmV0cmlldmVkIGZyb20gdGhlIHVuZGVybHlpbmcgc29ja2V0Ci0gICogQHBhcmFtICBkYXRhIElQIGFkZHJlc3MgZXh0cmFjdGVkIGZyb20gY2VydGlmaWNhdGUKLSAgKiBAcGFyYW0gIHNpemUgTGVuZ3RoIG9mIHRoZSBJUCBhZGRyZXNzCi0gICogQHJldHVybiBUcnVlIGlmIHRoZSBwZWVyIGlzIHRydXN0ZWQsIGZhbHNlIG90aGVyd2lzZQotICAqLwotIHZpcnR1YWwgRGVjaXNpb24gdmVyaWZ5KGNvbnN0IHNvY2thZGRyX3N0b3JhZ2UmIC8qIHNhICovLCBjb25zdCBjaGFyKiAvKiBkYXRhICovLCBpbnQgLyogc2l6ZSAqLykKLSAgIHRocm93KCkgeyByZXR1cm4gREVOWTsgfQorICAvKioKKyAgICogRGVzdHJ1Y3RvcgorICAgKi8KKyAgdmlydHVhbCB+QWNjZXNzTWFuYWdlcigpIHt9CisgIC8qKgorICAgKiBEZXRlcm1pbmUgd2hldGhlciB0aGUgcGVlciBzaG91bGQgYmUgZ3JhbnRlZCBhY2Nlc3Mgb3Igbm90LiBJdCdzIGNhbGxlZAorICAgKiBvbmNlIGFmdGVyIHRoZSBTU0wgaGFuZHNoYWtlIGNvbXBsZXRlcyBzdWNjZXNzZnVsbHksIGJlZm9yZSBwZWVyIGNlcnRpZmljYXRlCisgICAqIGlzIGV4YW1pbmVkLgorICAgKgorICAgKiBJZiBhIHZhbGlkIGRlY2lzaW9uIChBTExPVyBvciBERU5ZKSBpcyByZXR1cm5lZCwgdGhlIHBlZXIgY2VydGlmaWNhdGUgaXMKKyAgICogbm90IHRvIGJlIHZlcmlmaWVkLgorICAgKgorICAgKiBAcGFyYW0gIHNhIFBlZXIgSVAgYWRkcmVzcworICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHBlZXIgaXMgdHJ1c3RlZCwgZmFsc2Ugb3RoZXJ3aXNlCisgICAqLworICB2aXJ0dWFsIERlY2lzaW9uIHZlcmlmeShjb25zdCBzb2NrYWRkcl9zdG9yYWdlJiAvKiBzYSAqLykgbm9leGNlcHQgeyByZXR1cm4gREVOWTsgfQorICAvKioKKyAgICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHBlZXIgc2hvdWxkIGJlIGdyYW50ZWQgYWNjZXNzIG9yIG5vdC4gSXQncyBjYWxsZWQKKyAgICogZXZlcnkgdGltZSBhIEROUyBzdWJqZWN0QWx0TmFtZS9jb21tb24gbmFtZSBpcyBleHRyYWN0ZWQgZnJvbSBwZWVyJ3MKKyAgICogY2VydGlmaWNhdGUuCisgICAqCisgICAqIEBwYXJhbSAgaG9zdCBDbGllbnQgbW9kZTogaG9zdCBuYW1lIHJldHVybmVkIGJ5IFRTb2NrZXQ6OmdldEhvc3QoKQorICAgKiAgICAgICAgICAgICAgU2VydmVyIG1vZGU6IGhvc3QgbmFtZSByZXR1cm5lZCBieSBUU29ja2V0OjpnZXRQZWVySG9zdCgpCisgICAqIEBwYXJhbSAgbmFtZSBTdWJqZWN0QWx0TmFtZSBvciBjb21tb24gbmFtZSBleHRyYWN0ZWQgZnJvbSBwZWVyIGNlcnRpZmljYXRlCisgICAqIEBwYXJhbSAgc2l6ZSBMZW5ndGggb2YgbmFtZQorICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHBlZXIgaXMgdHJ1c3RlZCwgZmFsc2Ugb3RoZXJ3aXNlCisgICAqCisgICAqIE5vdGU6IFRoZSAibmFtZSIgcGFyYW1ldGVyIG1heSBiZSBVVEY4IGVuY29kZWQuCisgICAqLworICB2aXJ0dWFsIERlY2lzaW9uIHZlcmlmeShjb25zdCBzdGQ6OnN0cmluZyYgLyogaG9zdCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogLyogbmFtZSAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qIHNpemUgKi8pIG5vZXhjZXB0IHsKKyAgICByZXR1cm4gREVOWTsKKyAgfQorICAvKioKKyAgICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHBlZXIgc2hvdWxkIGJlIGdyYW50ZWQgYWNjZXNzIG9yIG5vdC4gSXQncyBjYWxsZWQKKyAgICogZXZlcnkgdGltZSBhbiBJUCBzdWJqZWN0QWx0TmFtZSBpcyBleHRyYWN0ZWQgZnJvbSBwZWVyJ3MgY2VydGlmaWNhdGUuCisgICAqCisgICAqIEBwYXJhbSAgc2EgICBQZWVyIElQIGFkZHJlc3MgcmV0cmlldmVkIGZyb20gdGhlIHVuZGVybHlpbmcgc29ja2V0CisgICAqIEBwYXJhbSAgZGF0YSBJUCBhZGRyZXNzIGV4dHJhY3RlZCBmcm9tIGNlcnRpZmljYXRlCisgICAqIEBwYXJhbSAgc2l6ZSBMZW5ndGggb2YgdGhlIElQIGFkZHJlc3MKKyAgICogQHJldHVybiBUcnVlIGlmIHRoZSBwZWVyIGlzIHRydXN0ZWQsIGZhbHNlIG90aGVyd2lzZQorICAgKi8KKyAgdmlydHVhbCBEZWNpc2lvbiB2ZXJpZnkoY29uc3Qgc29ja2FkZHJfc3RvcmFnZSYgLyogc2EgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIC8qIGRhdGEgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKiBzaXplICovKSBub2V4Y2VwdCB7CisgICAgcmV0dXJuIERFTlk7CisgIH0KIH07CiAKIHR5cGVkZWYgQWNjZXNzTWFuYWdlcjo6RGVjaXNpb24gRGVjaXNpb247CiAKLWNsYXNzIERlZmF1bHRDbGllbnRBY2Nlc3NNYW5hZ2VyOiBwdWJsaWMgQWNjZXNzTWFuYWdlciB7Ci0gcHVibGljOgorY2xhc3MgRGVmYXVsdENsaWVudEFjY2Vzc01hbmFnZXIgOiBwdWJsaWMgQWNjZXNzTWFuYWdlciB7CitwdWJsaWM6CiAgIC8vIEFjY2Vzc01hbmFnZXIgaW50ZXJmYWNlCi0gIERlY2lzaW9uIHZlcmlmeShjb25zdCBzb2NrYWRkcl9zdG9yYWdlJiBzYSkgdGhyb3coKTsKLSAgRGVjaXNpb24gdmVyaWZ5KGNvbnN0IHN0ZDo6c3RyaW5nJiBob3N0LCBjb25zdCBjaGFyKiBuYW1lLCBpbnQgc2l6ZSkgdGhyb3coKTsKLSAgRGVjaXNpb24gdmVyaWZ5KGNvbnN0IHNvY2thZGRyX3N0b3JhZ2UmIHNhLCBjb25zdCBjaGFyKiBkYXRhLCBpbnQgc2l6ZSkgdGhyb3coKTsKKyAgRGVjaXNpb24gdmVyaWZ5KGNvbnN0IHNvY2thZGRyX3N0b3JhZ2UmIHNhKSBub2V4Y2VwdDsKKyAgRGVjaXNpb24gdmVyaWZ5KGNvbnN0IHN0ZDo6c3RyaW5nJiBob3N0LCBjb25zdCBjaGFyKiBuYW1lLCBpbnQgc2l6ZSkgbm9leGNlcHQ7CisgIERlY2lzaW9uIHZlcmlmeShjb25zdCBzb2NrYWRkcl9zdG9yYWdlJiBzYSwgY29uc3QgY2hhciogZGF0YSwgaW50IHNpemUpIG5vZXhjZXB0OwogfTsKLQotCi19fX0KK30KK30KK30KIAogI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0LmNwcApvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IGZlOWY3ZTguLjExOGI5OTMKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0LmNwcAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuY3BwCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8dGhyaWZ0L3RocmlmdC1jb25maWcuaD4KIAogI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8c3RkZXhjZXB0PgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2lmZGVmIEhBVkVfU1lTX1NPQ0tFVF9ICiAjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgpAQCAtNDUsODMgKzQ2LDEzOSBAQAogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oPgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oPgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvUGxhdGZvcm1Tb2NrZXQuaD4KLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KIAogI2lmbmRlZiBBRl9MT0NBTAogI2RlZmluZSBBRl9MT0NBTCBBRl9VTklYCiAjZW5kaWYKIAogI2lmbmRlZiBTT0NLT1BUX0NBU1RfVAotIyAgIGlmbmRlZiBfV0lOMzIKLSMgICAgICAgZGVmaW5lIFNPQ0tPUFRfQ0FTVF9UIHZvaWQKLSMgICBlbHNlCi0jICAgICAgIGRlZmluZSBTT0NLT1BUX0NBU1RfVCBjaGFyCi0jICAgZW5kaWYgLy8gX1dJTjMyCisjaWZuZGVmIF9XSU4zMgorI2RlZmluZSBTT0NLT1BUX0NBU1RfVCB2b2lkCisjZWxzZQorI2RlZmluZSBTT0NLT1BUX0NBU1RfVCBjaGFyCisjZW5kaWYgLy8gX1dJTjMyCiAjZW5kaWYKIAotdGVtcGxhdGU8Y2xhc3MgVD4KK3RlbXBsYXRlIDxjbGFzcyBUPgogaW5saW5lIGNvbnN0IFNPQ0tPUFRfQ0FTVF9UKiBjb25zdF9jYXN0X3NvY2tvcHQoY29uc3QgVCogdikgewotICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IFNPQ0tPUFRfQ0FTVF9UKj4odik7CisgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IFNPQ0tPUFRfQ0FTVF9UKj4odik7CiB9CiAKLXRlbXBsYXRlPGNsYXNzIFQ+Cit0ZW1wbGF0ZSA8Y2xhc3MgVD4KIGlubGluZSBTT0NLT1BUX0NBU1RfVCogY2FzdF9zb2Nrb3B0KFQqIHYpIHsKLSAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxTT0NLT1BUX0NBU1RfVCo+KHYpOworICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxTT0NLT1BUX0NBU1RfVCo+KHYpOwogfQogCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0cmFuc3BvcnQgewordm9pZCBkZXN0cm95ZXJfb2ZfZmluZV9zb2NrZXRzKFRIUklGVF9TT0NLRVQqIHNzb2NrKSB7CisgIDo6VEhSSUZUX0NMT1NFU09DS0VUKCpzc29jayk7CisgIGRlbGV0ZSBzc29jazsKK30KIAotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLXVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOwordXNpbmcgc3RkOjpzdHJpbmc7CiAKLVRTZXJ2ZXJTb2NrZXQ6OlRTZXJ2ZXJTb2NrZXQoaW50IHBvcnQpIDoKLSAgcG9ydF8ocG9ydCksCi0gIHNlcnZlclNvY2tldF8oVEhSSUZUX0lOVkFMSURfU09DS0VUKSwKLSAgYWNjZXB0QmFja2xvZ18oREVGQVVMVF9CQUNLTE9HKSwKLSAgc2VuZFRpbWVvdXRfKDApLAotICByZWN2VGltZW91dF8oMCksCi0gIGFjY1RpbWVvdXRfKC0xKSwKLSAgcmV0cnlMaW1pdF8oMCksCi0gIHJldHJ5RGVsYXlfKDApLAotICB0Y3BTZW5kQnVmZmVyXygwKSwKLSAgdGNwUmVjdkJ1ZmZlcl8oMCksCi0gIGtlZXBBbGl2ZV8oZmFsc2UpLAotICBpbnRTb2NrMV8oVEhSSUZUX0lOVkFMSURfU09DS0VUKSwKLSAgaW50U29jazJfKFRIUklGVF9JTlZBTElEX1NPQ0tFVCkKLXt9CituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CiAKLVRTZXJ2ZXJTb2NrZXQ6OlRTZXJ2ZXJTb2NrZXQoaW50IHBvcnQsIGludCBzZW5kVGltZW91dCwgaW50IHJlY3ZUaW1lb3V0KSA6Ci0gIHBvcnRfKHBvcnQpLAotICBzZXJ2ZXJTb2NrZXRfKFRIUklGVF9JTlZBTElEX1NPQ0tFVCksCi0gIGFjY2VwdEJhY2tsb2dfKERFRkFVTFRfQkFDS0xPRyksCi0gIHNlbmRUaW1lb3V0XyhzZW5kVGltZW91dCksCi0gIHJlY3ZUaW1lb3V0XyhyZWN2VGltZW91dCksCi0gIGFjY1RpbWVvdXRfKC0xKSwKLSAgcmV0cnlMaW1pdF8oMCksCi0gIHJldHJ5RGVsYXlfKDApLAotICB0Y3BTZW5kQnVmZmVyXygwKSwKLSAgdGNwUmVjdkJ1ZmZlcl8oMCksCi0gIGtlZXBBbGl2ZV8oZmFsc2UpLAotICBpbnRTb2NrMV8oVEhSSUZUX0lOVkFMSURfU09DS0VUKSwKLSAgaW50U29jazJfKFRIUklGVF9JTlZBTElEX1NPQ0tFVCkKLXt9Cit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7CiAKLVRTZXJ2ZXJTb2NrZXQ6OlRTZXJ2ZXJTb2NrZXQoc3RyaW5nIHBhdGgpIDoKLSAgcG9ydF8oMCksCi0gIHBhdGhfKHBhdGgpLAotICBzZXJ2ZXJTb2NrZXRfKFRIUklGVF9JTlZBTElEX1NPQ0tFVCksCi0gIGFjY2VwdEJhY2tsb2dfKERFRkFVTFRfQkFDS0xPRyksCi0gIHNlbmRUaW1lb3V0XygwKSwKLSAgcmVjdlRpbWVvdXRfKDApLAotICBhY2NUaW1lb3V0XygtMSksCi0gIHJldHJ5TGltaXRfKDApLAotICByZXRyeURlbGF5XygwKSwKLSAgdGNwU2VuZEJ1ZmZlcl8oMCksCi0gIHRjcFJlY3ZCdWZmZXJfKDApLAotICBrZWVwQWxpdmVfKGZhbHNlKSwKLSAgaW50U29jazFfKFRIUklGVF9JTlZBTElEX1NPQ0tFVCksCi0gIGludFNvY2syXyhUSFJJRlRfSU5WQUxJRF9TT0NLRVQpCi17fQorVEdldEFkZHJJbmZvV3JhcHBlcjo6VEdldEFkZHJJbmZvV3JhcHBlcihjb25zdCBjaGFyKiBub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYWRkcmluZm8qIGhpbnRzKQorICA6IG5vZGVfKG5vZGUpLCBzZXJ2aWNlXyhzZXJ2aWNlKSwgaGludHNfKGhpbnRzKSwgcmVzXyhOVUxMKSB7fQorCitUR2V0QWRkckluZm9XcmFwcGVyOjp+VEdldEFkZHJJbmZvV3JhcHBlcigpIHsKKyAgaWYgKHRoaXMtPnJlc18gIT0gTlVMTCkKKyAgICBmcmVlYWRkcmluZm8odGhpcy0+cmVzXyk7Cit9CisKK2ludCBUR2V0QWRkckluZm9XcmFwcGVyOjppbml0KCkgeworICBpZiAodGhpcy0+cmVzXyA9PSBOVUxMKQorICAgIHJldHVybiBnZXRhZGRyaW5mbyh0aGlzLT5ub2RlXywgdGhpcy0+c2VydmljZV8sIHRoaXMtPmhpbnRzXywgJih0aGlzLT5yZXNfKSk7CisgIHJldHVybiAwOworfQorCitjb25zdCBzdHJ1Y3QgYWRkcmluZm8qIFRHZXRBZGRySW5mb1dyYXBwZXI6OnJlcygpIHsKKyAgcmV0dXJuIHRoaXMtPnJlc187Cit9CisKK1RTZXJ2ZXJTb2NrZXQ6OlRTZXJ2ZXJTb2NrZXQoaW50IHBvcnQpCisgIDogaW50ZXJydXB0YWJsZUNoaWxkcmVuXyh0cnVlKSwKKyAgICBwb3J0Xyhwb3J0KSwKKyAgICBzZXJ2ZXJTb2NrZXRfKFRIUklGVF9JTlZBTElEX1NPQ0tFVCksCisgICAgYWNjZXB0QmFja2xvZ18oREVGQVVMVF9CQUNLTE9HKSwKKyAgICBzZW5kVGltZW91dF8oMCksCisgICAgcmVjdlRpbWVvdXRfKDApLAorICAgIGFjY1RpbWVvdXRfKC0xKSwKKyAgICByZXRyeUxpbWl0XygwKSwKKyAgICByZXRyeURlbGF5XygwKSwKKyAgICB0Y3BTZW5kQnVmZmVyXygwKSwKKyAgICB0Y3BSZWN2QnVmZmVyXygwKSwKKyAgICBrZWVwQWxpdmVfKGZhbHNlKSwKKyAgICBsaXN0ZW5pbmdfKGZhbHNlKSwKKyAgICBpbnRlcnJ1cHRTb2NrV3JpdGVyXyhUSFJJRlRfSU5WQUxJRF9TT0NLRVQpLAorICAgIGludGVycnVwdFNvY2tSZWFkZXJfKFRIUklGVF9JTlZBTElEX1NPQ0tFVCksCisgICAgY2hpbGRJbnRlcnJ1cHRTb2NrV3JpdGVyXyhUSFJJRlRfSU5WQUxJRF9TT0NLRVQpIHsKK30KKworVFNlcnZlclNvY2tldDo6VFNlcnZlclNvY2tldChpbnQgcG9ydCwgaW50IHNlbmRUaW1lb3V0LCBpbnQgcmVjdlRpbWVvdXQpCisgIDogaW50ZXJydXB0YWJsZUNoaWxkcmVuXyh0cnVlKSwKKyAgICBwb3J0Xyhwb3J0KSwKKyAgICBzZXJ2ZXJTb2NrZXRfKFRIUklGVF9JTlZBTElEX1NPQ0tFVCksCisgICAgYWNjZXB0QmFja2xvZ18oREVGQVVMVF9CQUNLTE9HKSwKKyAgICBzZW5kVGltZW91dF8oc2VuZFRpbWVvdXQpLAorICAgIHJlY3ZUaW1lb3V0XyhyZWN2VGltZW91dCksCisgICAgYWNjVGltZW91dF8oLTEpLAorICAgIHJldHJ5TGltaXRfKDApLAorICAgIHJldHJ5RGVsYXlfKDApLAorICAgIHRjcFNlbmRCdWZmZXJfKDApLAorICAgIHRjcFJlY3ZCdWZmZXJfKDApLAorICAgIGtlZXBBbGl2ZV8oZmFsc2UpLAorICAgIGxpc3RlbmluZ18oZmFsc2UpLAorICAgIGludGVycnVwdFNvY2tXcml0ZXJfKFRIUklGVF9JTlZBTElEX1NPQ0tFVCksCisgICAgaW50ZXJydXB0U29ja1JlYWRlcl8oVEhSSUZUX0lOVkFMSURfU09DS0VUKSwKKyAgICBjaGlsZEludGVycnVwdFNvY2tXcml0ZXJfKFRIUklGVF9JTlZBTElEX1NPQ0tFVCkgeworfQorCitUU2VydmVyU29ja2V0OjpUU2VydmVyU29ja2V0KGNvbnN0IHN0cmluZyYgYWRkcmVzcywgaW50IHBvcnQpCisgIDogaW50ZXJydXB0YWJsZUNoaWxkcmVuXyh0cnVlKSwKKyAgICBwb3J0Xyhwb3J0KSwKKyAgICBhZGRyZXNzXyhhZGRyZXNzKSwKKyAgICBzZXJ2ZXJTb2NrZXRfKFRIUklGVF9JTlZBTElEX1NPQ0tFVCksCisgICAgYWNjZXB0QmFja2xvZ18oREVGQVVMVF9CQUNLTE9HKSwKKyAgICBzZW5kVGltZW91dF8oMCksCisgICAgcmVjdlRpbWVvdXRfKDApLAorICAgIGFjY1RpbWVvdXRfKC0xKSwKKyAgICByZXRyeUxpbWl0XygwKSwKKyAgICByZXRyeURlbGF5XygwKSwKKyAgICB0Y3BTZW5kQnVmZmVyXygwKSwKKyAgICB0Y3BSZWN2QnVmZmVyXygwKSwKKyAgICBrZWVwQWxpdmVfKGZhbHNlKSwKKyAgICBsaXN0ZW5pbmdfKGZhbHNlKSwKKyAgICBpbnRlcnJ1cHRTb2NrV3JpdGVyXyhUSFJJRlRfSU5WQUxJRF9TT0NLRVQpLAorICAgIGludGVycnVwdFNvY2tSZWFkZXJfKFRIUklGVF9JTlZBTElEX1NPQ0tFVCksCisgICAgY2hpbGRJbnRlcnJ1cHRTb2NrV3JpdGVyXyhUSFJJRlRfSU5WQUxJRF9TT0NLRVQpIHsKK30KKworVFNlcnZlclNvY2tldDo6VFNlcnZlclNvY2tldChjb25zdCBzdHJpbmcmIHBhdGgpCisgIDogaW50ZXJydXB0YWJsZUNoaWxkcmVuXyh0cnVlKSwKKyAgICBwb3J0XygwKSwKKyAgICBwYXRoXyhwYXRoKSwKKyAgICBzZXJ2ZXJTb2NrZXRfKFRIUklGVF9JTlZBTElEX1NPQ0tFVCksCisgICAgYWNjZXB0QmFja2xvZ18oREVGQVVMVF9CQUNLTE9HKSwKKyAgICBzZW5kVGltZW91dF8oMCksCisgICAgcmVjdlRpbWVvdXRfKDApLAorICAgIGFjY1RpbWVvdXRfKC0xKSwKKyAgICByZXRyeUxpbWl0XygwKSwKKyAgICByZXRyeURlbGF5XygwKSwKKyAgICB0Y3BTZW5kQnVmZmVyXygwKSwKKyAgICB0Y3BSZWN2QnVmZmVyXygwKSwKKyAgICBrZWVwQWxpdmVfKGZhbHNlKSwKKyAgICBsaXN0ZW5pbmdfKGZhbHNlKSwKKyAgICBpbnRlcnJ1cHRTb2NrV3JpdGVyXyhUSFJJRlRfSU5WQUxJRF9TT0NLRVQpLAorICAgIGludGVycnVwdFNvY2tSZWFkZXJfKFRIUklGVF9JTlZBTElEX1NPQ0tFVCksCisgICAgY2hpbGRJbnRlcnJ1cHRTb2NrV3JpdGVyXyhUSFJJRlRfSU5WQUxJRF9TT0NLRVQpIHsKK30KIAogVFNlcnZlclNvY2tldDo6flRTZXJ2ZXJTb2NrZXQoKSB7CiAgIGNsb3NlKCk7CkBAIC0xNTksNDcgKzIxNiw3OCBAQAogICB0Y3BSZWN2QnVmZmVyXyA9IHRjcFJlY3ZCdWZmZXI7CiB9CiAKK3ZvaWQgVFNlcnZlclNvY2tldDo6c2V0SW50ZXJydXB0YWJsZUNoaWxkcmVuKGJvb2wgZW5hYmxlKSB7CisgIGlmIChsaXN0ZW5pbmdfKSB7CisgICAgdGhyb3cgc3RkOjpsb2dpY19lcnJvcigic2V0SW50ZXJydXB0YWJsZUNoaWxkcmVuIGNhbm5vdCBiZSBjYWxsZWQgYWZ0ZXIgbGlzdGVuKCkiKTsKKyAgfQorICBpbnRlcnJ1cHRhYmxlQ2hpbGRyZW5fID0gZW5hYmxlOworfQorCiB2b2lkIFRTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIHsKKyAgbGlzdGVuaW5nXyA9IHRydWU7CiAjaWZkZWYgX1dJTjMyCi0gICAgVFdpbnNvY2tTaW5nbGV0b246OmNyZWF0ZSgpOworICBUV2luc29ja1NpbmdsZXRvbjo6Y3JlYXRlKCk7CiAjZW5kaWYgLy8gX1dJTjMyCiAgIFRIUklGVF9TT0NLRVQgc3ZbMl07CisgIC8vIENyZWF0ZSB0aGUgc29ja2V0IHBhaXIgdXNlZCB0byBpbnRlcnJ1cHQKICAgaWYgKC0xID09IFRIUklGVF9TT0NLRVRQQUlSKEFGX0xPQ0FMLCBTT0NLX1NUUkVBTSwgMCwgc3YpKSB7Ci0gICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNlcnZlclNvY2tldDo6bGlzdGVuKCkgc29ja2V0cGFpcigpICIsIFRIUklGVF9HRVRfU09DS0VUX0VSUk9SKTsKLSAgICBpbnRTb2NrMV8gPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQ7Ci0gICAgaW50U29jazJfID0gVEhSSUZUX0lOVkFMSURfU09DS0VUOworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIHNvY2tldHBhaXIoKSBpbnRlcnJ1cHQiLCBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUik7CisgICAgaW50ZXJydXB0U29ja1dyaXRlcl8gPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQ7CisgICAgaW50ZXJydXB0U29ja1JlYWRlcl8gPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQ7CiAgIH0gZWxzZSB7Ci0gICAgaW50U29jazFfID0gc3ZbMV07Ci0gICAgaW50U29jazJfID0gc3ZbMF07CisgICAgaW50ZXJydXB0U29ja1dyaXRlcl8gPSBzdlsxXTsKKyAgICBpbnRlcnJ1cHRTb2NrUmVhZGVyXyA9IHN2WzBdOwogICB9CiAKLSAgc3RydWN0IGFkZHJpbmZvIGhpbnRzLCAqcmVzLCAqcmVzMDsKKyAgLy8gQ3JlYXRlIHRoZSBzb2NrZXQgcGFpciB1c2VkIHRvIGludGVycnVwdCBhbGwgY2xpZW50cworICBpZiAoLTEgPT0gVEhSSUZUX1NPQ0tFVFBBSVIoQUZfTE9DQUwsIFNPQ0tfU1RSRUFNLCAwLCBzdikpIHsKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBzb2NrZXRwYWlyKCkgY2hpbGRJbnRlcnJ1cHQiLAorICAgICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IpOworICAgIGNoaWxkSW50ZXJydXB0U29ja1dyaXRlcl8gPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQ7CisgICAgcENoaWxkSW50ZXJydXB0U29ja1JlYWRlcl8ucmVzZXQoKTsKKyAgfSBlbHNlIHsKKyAgICBjaGlsZEludGVycnVwdFNvY2tXcml0ZXJfID0gc3ZbMV07CisgICAgcENoaWxkSW50ZXJydXB0U29ja1JlYWRlcl8KKyAgICAgICAgPSBzdGQ6OnNoYXJlZF9wdHI8VEhSSUZUX1NPQ0tFVD4obmV3IFRIUklGVF9TT0NLRVQoc3ZbMF0pLCBkZXN0cm95ZXJfb2ZfZmluZV9zb2NrZXRzKTsKKyAgfQorCisgIC8vIFZhbGlkYXRlIHBvcnQgbnVtYmVyCisgIGlmIChwb3J0XyA8IDAgfHwgcG9ydF8gPiAweEZGRkYpIHsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkJBRF9BUkdTLCAiU3BlY2lmaWVkIHBvcnQgaXMgaW52YWxpZCIpOworICB9CisKKyAgY29uc3Qgc3RydWN0IGFkZHJpbmZvICpyZXM7CiAgIGludCBlcnJvcjsKLSAgY2hhciBwb3J0W3NpemVvZigiNjU1MzYiKSArIDFdOworICBjaGFyIHBvcnRbc2l6ZW9mKCI2NTUzNSIpXTsKKyAgVEhSSUZUX1NOUFJJTlRGKHBvcnQsIHNpemVvZihwb3J0KSwgIiVkIiwgcG9ydF8pOworCisgIHN0cnVjdCBhZGRyaW5mbyBoaW50czsKICAgc3RkOjptZW1zZXQoJmhpbnRzLCAwLCBzaXplb2YoaGludHMpKTsKICAgaGludHMuYWlfZmFtaWx5ID0gUEZfVU5TUEVDOwogICBoaW50cy5haV9zb2NrdHlwZSA9IFNPQ0tfU1RSRUFNOwogICBoaW50cy5haV9mbGFncyA9IEFJX1BBU1NJVkUgfCBBSV9BRERSQ09ORklHOwotICBzcHJpbnRmKHBvcnQsICIlZCIsIHBvcnRfKTsKIAotICAvLyBXaWxkY2FyZCBhZGRyZXNzCi0gIGVycm9yID0gZ2V0YWRkcmluZm8oTlVMTCwgcG9ydCwgJmhpbnRzLCAmcmVzMCk7CisgIC8vIElmIGFkZHJlc3MgaXMgbm90IHNwZWNpZmllZCB1c2Ugd2lsZGNhcmQgYWRkcmVzcyAoTlVMTCkKKyAgVEdldEFkZHJJbmZvV3JhcHBlciBpbmZvKGFkZHJlc3NfLmVtcHR5KCkgPyBOVUxMIDogJmFkZHJlc3NfWzBdLCBwb3J0LCAmaGludHMpOworCisgIGVycm9yID0gaW5mby5pbml0KCk7CiAgIGlmIChlcnJvcikgewogICAgIEdsb2JhbE91dHB1dC5wcmludGYoImdldGFkZHJpbmZvICVkOiAlcyIsIGVycm9yLCBUSFJJRlRfR0FJX1NUUkVSUk9SKGVycm9yKSk7CiAgICAgY2xvc2UoKTsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiQ291bGQgbm90IHJlc29sdmUgaG9zdCBmb3Igc2VydmVyIHNvY2tldC4iKTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCByZXNvbHZlIGhvc3QgZm9yIHNlcnZlciBzb2NrZXQuIik7CiAgIH0KIAogICAvLyBQaWNrIHRoZSBpcHY2IGFkZHJlc3MgZmlyc3Qgc2luY2UgaXB2NCBhZGRyZXNzZXMgY2FuIGJlIG1hcHBlZAogICAvLyBpbnRvIGlwdjYgc3BhY2UuCi0gIGZvciAocmVzID0gcmVzMDsgcmVzOyByZXMgPSByZXMtPmFpX25leHQpIHsKKyAgZm9yIChyZXMgPSBpbmZvLnJlcygpOyByZXM7IHJlcyA9IHJlcy0+YWlfbmV4dCkgewogICAgIGlmIChyZXMtPmFpX2ZhbWlseSA9PSBBRl9JTkVUNiB8fCByZXMtPmFpX25leHQgPT0gTlVMTCkKICAgICAgIGJyZWFrOwogICB9CiAKLSAgaWYgKCEgcGF0aF8uZW1wdHkoKSkgeworICBpZiAoIXBhdGhfLmVtcHR5KCkpIHsKICAgICBzZXJ2ZXJTb2NrZXRfID0gc29ja2V0KFBGX1VOSVgsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX0lQKTsKLSAgfSBlbHNlIHsKKyAgfSBlbHNlIGlmIChyZXMgIT0gTlVMTCkgewogICAgIHNlcnZlclNvY2tldF8gPSBzb2NrZXQocmVzLT5haV9mYW1pbHksIHJlcy0+YWlfc29ja3R5cGUsIHJlcy0+YWlfcHJvdG9jb2wpOwogICB9CiAKQEAgLTIwNyw3MCArMjk1LDkzIEBACiAgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBzb2NrZXQoKSAiLCBlcnJub19jb3B5KTsKICAgICBjbG9zZSgpOwotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJDb3VsZCBub3QgY3JlYXRlIHNlcnZlciBzb2NrZXQuIiwgZXJybm9fY29weSk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgY3JlYXRlIHNlcnZlciBzb2NrZXQuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vX2NvcHkpOwogICB9CiAKICAgLy8gU2V0IFRIUklGVF9OT19TT0NLRVRfQ0FDSElORyB0byBwcmV2ZW50IDJNU0wgZGVsYXkgb24gYWNjZXB0CiAgIGludCBvbmUgPSAxOwotICBpZiAoLTEgPT0gc2V0c29ja29wdChzZXJ2ZXJTb2NrZXRfLCBTT0xfU09DS0VULCBUSFJJRlRfTk9fU09DS0VUX0NBQ0hJTkcsCi0gICAgICAgICAgICAgICAgICAgICAgIGNhc3Rfc29ja29wdCgmb25lKSwgc2l6ZW9mKG9uZSkpKSB7Ci0gICAgLy9pZ25vcmUgZXJyb3JzIGNvbWluZyBvdXQgb2YgdGhpcyBzZXRzb2Nrb3B0IG9uIFdpbmRvd3MuICBUaGlzIGlzIGJlY2F1c2UKLSAgICAvL1NPX0VYQ0xVU0lWRUFERFJVU0UgcmVxdWlyZXMgYWRtaW4gcHJpdmlsZWdlcyBvbiBXaW5YUCwgYnV0IHdlIGRvbid0Ci0gICAgLy93YW50IHRvIGZvcmNlIHNlcnZlcnMgdG8gYmUgYW4gYWRtaW4uCisgIGlmICgtMSA9PSBzZXRzb2Nrb3B0KHNlcnZlclNvY2tldF8sCisgICAgICAgICAgICAgICAgICAgICAgIFNPTF9TT0NLRVQsCisgICAgICAgICAgICAgICAgICAgICAgIFRIUklGVF9OT19TT0NLRVRfQ0FDSElORywKKyAgICAgICAgICAgICAgICAgICAgICAgY2FzdF9zb2Nrb3B0KCZvbmUpLAorICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob25lKSkpIHsKKy8vIGlnbm9yZSBlcnJvcnMgY29taW5nIG91dCBvZiB0aGlzIHNldHNvY2tvcHQgb24gV2luZG93cy4gIFRoaXMgaXMgYmVjYXVzZQorLy8gU09fRVhDTFVTSVZFQUREUlVTRSByZXF1aXJlcyBhZG1pbiBwcml2aWxlZ2VzIG9uIFdpblhQLCBidXQgd2UgZG9uJ3QKKy8vIHdhbnQgdG8gZm9yY2Ugc2VydmVycyB0byBiZSBhbiBhZG1pbi4KICNpZm5kZWYgX1dJTjMyCiAgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKLSAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBzZXRzb2Nrb3B0KCkgVEhSSUZUX05PX1NPQ0tFVF9DQUNISU5HICIsIGVycm5vX2NvcHkpOworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIHNldHNvY2tvcHQoKSBUSFJJRlRfTk9fU09DS0VUX0NBQ0hJTkcgIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vX2NvcHkpOwogICAgIGNsb3NlKCk7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIkNvdWxkIG5vdCBzZXQgVEhSSUZUX05PX1NPQ0tFVF9DQUNISU5HIiwgZXJybm9fY29weSk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3Qgc2V0IFRIUklGVF9OT19TT0NLRVRfQ0FDSElORyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKICNlbmRpZgogICB9CiAKICAgLy8gU2V0IFRDUCBidWZmZXIgc2l6ZXMKICAgaWYgKHRjcFNlbmRCdWZmZXJfID4gMCkgewotICAgIGlmICgtMSA9PSBzZXRzb2Nrb3B0KHNlcnZlclNvY2tldF8sIFNPTF9TT0NLRVQsIFNPX1NOREJVRiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0X3NvY2tvcHQoJnRjcFNlbmRCdWZmZXJfKSwgc2l6ZW9mKHRjcFNlbmRCdWZmZXJfKSkpIHsKKyAgICBpZiAoLTEgPT0gc2V0c29ja29wdChzZXJ2ZXJTb2NrZXRfLAorICAgICAgICAgICAgICAgICAgICAgICAgIFNPTF9TT0NLRVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgU09fU05EQlVGLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNhc3Rfc29ja29wdCgmdGNwU2VuZEJ1ZmZlcl8pLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0Y3BTZW5kQnVmZmVyXykpKSB7CiAgICAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOwogICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNlcnZlclNvY2tldDo6bGlzdGVuKCkgc2V0c29ja29wdCgpIFNPX1NOREJVRiAiLCBlcnJub19jb3B5KTsKICAgICAgIGNsb3NlKCk7Ci0gICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiQ291bGQgbm90IHNldCBTT19TTkRCVUYiLCBlcnJub19jb3B5KTsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3Qgc2V0IFNPX1NOREJVRiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vX2NvcHkpOwogICAgIH0KICAgfQogCiAgIGlmICh0Y3BSZWN2QnVmZmVyXyA+IDApIHsKLSAgICBpZiAoLTEgPT0gc2V0c29ja29wdChzZXJ2ZXJTb2NrZXRfLCBTT0xfU09DS0VULCBTT19SQ1ZCVUYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2FzdF9zb2Nrb3B0KCZ0Y3BSZWN2QnVmZmVyXyksIHNpemVvZih0Y3BSZWN2QnVmZmVyXykpKSB7CisgICAgaWYgKC0xID09IHNldHNvY2tvcHQoc2VydmVyU29ja2V0XywKKyAgICAgICAgICAgICAgICAgICAgICAgICBTT0xfU09DS0VULAorICAgICAgICAgICAgICAgICAgICAgICAgIFNPX1JDVkJVRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0X3NvY2tvcHQoJnRjcFJlY3ZCdWZmZXJfKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodGNwUmVjdkJ1ZmZlcl8pKSkgewogICAgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKICAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIHNldHNvY2tvcHQoKSBTT19SQ1ZCVUYgIiwgZXJybm9fY29weSk7CiAgICAgICBjbG9zZSgpOwotICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIkNvdWxkIG5vdCBzZXQgU09fUkNWQlVGIiwgZXJybm9fY29weSk7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IHNldCBTT19SQ1ZCVUYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKICAgICB9CiAgIH0KIAotICAvLyBEZWZlciBhY2NlcHQKLSAgI2lmZGVmIFRDUF9ERUZFUl9BQ0NFUFQKLSAgaWYgKC0xID09IHNldHNvY2tvcHQoc2VydmVyU29ja2V0XywgSVBQUk9UT19UQ1AsIFRDUF9ERUZFUl9BQ0NFUFQsCi0gICAgICAgICAgICAgICAgICAgICAgICZvbmUsIHNpemVvZihvbmUpKSkgewotICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7Ci0gICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNlcnZlclNvY2tldDo6bGlzdGVuKCkgc2V0c29ja29wdCgpIFRDUF9ERUZFUl9BQ0NFUFQgIiwgZXJybm9fY29weSk7Ci0gICAgY2xvc2UoKTsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiQ291bGQgbm90IHNldCBUQ1BfREVGRVJfQUNDRVBUIiwgZXJybm9fY29weSk7CisvLyBEZWZlciBhY2NlcHQKKyNpZmRlZiBUQ1BfREVGRVJfQUNDRVBUCisgIGlmIChwYXRoXy5lbXB0eSgpKSB7CisgICAgaWYgKC0xID09IHNldHNvY2tvcHQoc2VydmVyU29ja2V0XywgSVBQUk9UT19UQ1AsIFRDUF9ERUZFUl9BQ0NFUFQsICZvbmUsIHNpemVvZihvbmUpKSkgeworICAgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIHNldHNvY2tvcHQoKSBUQ1BfREVGRVJfQUNDRVBUICIsIGVycm5vX2NvcHkpOworICAgICAgY2xvc2UoKTsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3Qgc2V0IFRDUF9ERUZFUl9BQ0NFUFQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKKyAgICB9CiAgIH0KLSAgI2VuZGlmIC8vICNpZmRlZiBUQ1BfREVGRVJfQUNDRVBUCisjZW5kaWYgLy8gI2lmZGVmIFRDUF9ERUZFUl9BQ0NFUFQKIAotICAjaWZkZWYgSVBWNl9WNk9OTFkKKyNpZmRlZiBJUFY2X1Y2T05MWQogICBpZiAocmVzLT5haV9mYW1pbHkgPT0gQUZfSU5FVDYgJiYgcGF0aF8uZW1wdHkoKSkgewogICAgIGludCB6ZXJvID0gMDsKLSAgICBpZiAoLTEgPT0gc2V0c29ja29wdChzZXJ2ZXJTb2NrZXRfLCBJUFBST1RPX0lQVjYsIElQVjZfVjZPTkxZLAotICAgICAgICAgIGNhc3Rfc29ja29wdCgmemVybyksIHNpemVvZih6ZXJvKSkpIHsKKyAgICBpZiAoLTEgPT0gc2V0c29ja29wdChzZXJ2ZXJTb2NrZXRfLAorICAgICAgICAgICAgICAgICAgICAgICAgIElQUFJPVE9fSVBWNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBJUFY2X1Y2T05MWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0X3NvY2tvcHQoJnplcm8pLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih6ZXJvKSkpIHsKICAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIElQVjZfVjZPTkxZICIsIFRIUklGVF9HRVRfU09DS0VUX0VSUk9SKTsKICAgICB9CiAgIH0KLSAgI2VuZGlmIC8vICNpZmRlZiBJUFY2X1Y2T05MWQorI2VuZGlmIC8vICNpZmRlZiBJUFY2X1Y2T05MWQogCiAgIC8vIFR1cm4gbGluZ2VyIG9mZiwgZG9uJ3Qgd2FudCB0byBibG9jayBvbiBjYWxscyB0byBjbG9zZQogICBzdHJ1Y3QgbGluZ2VyIGxpbmcgPSB7MCwgMH07Ci0gIGlmICgtMSA9PSBzZXRzb2Nrb3B0KHNlcnZlclNvY2tldF8sIFNPTF9TT0NLRVQsIFNPX0xJTkdFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgY2FzdF9zb2Nrb3B0KCZsaW5nKSwgc2l6ZW9mKGxpbmcpKSkgeworICBpZiAoLTEgPT0gc2V0c29ja29wdChzZXJ2ZXJTb2NrZXRfLCBTT0xfU09DS0VULCBTT19MSU5HRVIsIGNhc3Rfc29ja29wdCgmbGluZyksIHNpemVvZihsaW5nKSkpIHsKICAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOwogICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIHNldHNvY2tvcHQoKSBTT19MSU5HRVIgIiwgZXJybm9fY29weSk7CiAgICAgY2xvc2UoKTsKQEAgLTI4MCwxMiArMzkxLDE0IEBACiAgIC8vIFVuaXggU29ja2V0cyBkbyBub3QgbmVlZCB0aGF0CiAgIGlmIChwYXRoXy5lbXB0eSgpKSB7CiAgICAgLy8gVENQIE5vZGVsYXksIHNwZWVkIG92ZXIgYmFuZHdpZHRoCi0gICAgaWYgKC0xID09IHNldHNvY2tvcHQoc2VydmVyU29ja2V0XywgSVBQUk9UT19UQ1AsIFRDUF9OT0RFTEFZLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNhc3Rfc29ja29wdCgmb25lKSwgc2l6ZW9mKG9uZSkpKSB7CisgICAgaWYgKC0xCisgICAgICAgID09IHNldHNvY2tvcHQoc2VydmVyU29ja2V0XywgSVBQUk9UT19UQ1AsIFRDUF9OT0RFTEFZLCBjYXN0X3NvY2tvcHQoJm9uZSksIHNpemVvZihvbmUpKSkgewogICAgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKICAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIHNldHNvY2tvcHQoKSBUQ1BfTk9ERUxBWSAiLCBlcnJub19jb3B5KTsKICAgICAgIGNsb3NlKCk7Ci0gICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiQ291bGQgbm90IHNldCBUQ1BfTk9ERUxBWSIsIGVycm5vX2NvcHkpOworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBzZXQgVENQX05PREVMQVkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKICAgICB9CiAgIH0KIApAQCAtMjk0LDc2ICs0MDcsOTMgQEAKICAgaWYgKGZsYWdzID09IC0xKSB7CiAgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBUSFJJRlRfRkNOVEwoKSBUSFJJRlRfRl9HRVRGTCAiLCBlcnJub19jb3B5KTsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiVEhSSUZUX0ZDTlRMKCkgZmFpbGVkIiwgZXJybm9fY29weSk7CisgICAgY2xvc2UoKTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRIUklGVF9GQ05UTCgpIFRIUklGVF9GX0dFVEZMIGZhaWxlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKICAgfQogCiAgIGlmICgtMSA9PSBUSFJJRlRfRkNOVEwoc2VydmVyU29ja2V0XywgVEhSSUZUX0ZfU0VURkwsIGZsYWdzIHwgVEhSSUZUX09fTk9OQkxPQ0spKSB7CiAgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBUSFJJRlRfRkNOVEwoKSBUSFJJRlRfT19OT05CTE9DSyAiLCBlcnJub19jb3B5KTsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiVEhSSUZUX0ZDTlRMKCkgZmFpbGVkIiwgZXJybm9fY29weSk7CisgICAgY2xvc2UoKTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRIUklGVF9GQ05UTCgpIFRIUklGVF9GX1NFVEZMIFRIUklGVF9PX05PTkJMT0NLIGZhaWxlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKICAgfQogCiAgIC8vIHByZXBhcmUgdGhlIHBvcnQgaW5mb3JtYXRpb24KICAgLy8gd2UgbWF5IHdhbnQgdG8gdHJ5IHRvIGJpbmQgbW9yZSB0aGFuIG9uY2UsIHNpbmNlIFRIUklGVF9OT19TT0NLRVRfQ0FDSElORyBkb2Vzbid0CiAgIC8vIGFsd2F5cyBzZWVtIHRvIHdvcmsuIFRoZSBjbGllbnQgY2FuIGNvbmZpZ3VyZSB0aGUgcmV0cnkgdmFyaWFibGVzLgogICBpbnQgcmV0cmllcyA9IDA7CisgIGludCBlcnJub19jb3B5ID0gMDsKIAotICBpZiAoISBwYXRoXy5lbXB0eSgpKSB7CisgIGlmICghcGF0aF8uZW1wdHkoKSkgewogCiAjaWZuZGVmIF9XSU4zMgogCiAgICAgLy8gVW5peCBEb21haW4gU29ja2V0CiAgICAgc2l6ZV90IGxlbiA9IHBhdGhfLnNpemUoKSArIDE7CiAgICAgaWYgKGxlbiA+IHNpemVvZigoKHNvY2thZGRyX3VuKilOVUxMKS0+c3VuX3BhdGgpKSB7Ci0gICAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgICAgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOwogICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNvY2tldDo6bGlzdGVuKCkgVW5peCBEb21haW4gc29ja2V0IHBhdGggdG9vIGxvbmciLCBlcnJub19jb3B5KTsKLSAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICIgVW5peCBEb21haW4gc29ja2V0IHBhdGggdG9vIGxvbmciKTsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbml4IERvbWFpbiBzb2NrZXQgcGF0aCB0b28gbG9uZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vX2NvcHkpOwogICAgIH0KIAogICAgIHN0cnVjdCBzb2NrYWRkcl91biBhZGRyZXNzOwogICAgIGFkZHJlc3Muc3VuX2ZhbWlseSA9IEFGX1VOSVg7CiAgICAgbWVtY3B5KGFkZHJlc3Muc3VuX3BhdGgsIHBhdGhfLmNfc3RyKCksIGxlbik7CisKICAgICBzb2NrbGVuX3Qgc3RydWN0bGVuID0gc3RhdGljX2Nhc3Q8c29ja2xlbl90PihzaXplb2YoYWRkcmVzcykpOwogCisgICAgaWYgKCFhZGRyZXNzLnN1bl9wYXRoWzBdKSB7IC8vIGFic3RyYWN0IG5hbWVzcGFjZSBzb2NrZXQKKyNpZmRlZiBfX2xpbnV4X18KKyAgICAgIC8vIHN1bl9wYXRoIGlzIG5vdCBudWxsLXRlcm1pbmF0ZWQgaW4gdGhpcyBjYXNlIGFuZCBzdHJ1Y3RsZW4gZGV0ZXJtaW5lcyBpdHMgbGVuZ3RoCisgICAgICBzdHJ1Y3RsZW4gLT0gc2l6ZW9mKGFkZHJlc3Muc3VuX3BhdGgpIC0gbGVuOworI2Vsc2UKKyAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTb2NrZXQ6Om9wZW4oKSBBYnN0cmFjdCBOYW1lc3BhY2UgRG9tYWluIHNvY2tldHMgb25seSBzdXBwb3J0ZWQgb24gbGludXg6ICIsIC05OSk7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIEFic3RyYWN0IE5hbWVzcGFjZSBEb21haW4gc29ja2V0IHBhdGggbm90IHN1cHBvcnRlZCIpOworI2VuZGlmCisgICAgfQorCiAgICAgZG8gewotICAgICAgaWYgKDAgPT0gOjpiaW5kKHNlcnZlclNvY2tldF8sIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmFkZHJlc3MsIHN0cnVjdGxlbikpIHsKKyAgICAgIGlmICgwID09IDo6YmluZChzZXJ2ZXJTb2NrZXRfLCAoc3RydWN0IHNvY2thZGRyKikmYWRkcmVzcywgc3RydWN0bGVuKSkgewogICAgICAgICBicmVhazsKICAgICAgIH0KKyAgICAgIGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKICAgICAgIC8vIHVzZSBzaG9ydCBjaXJjdWl0IGV2YWx1YXRpb24gaGVyZSB0byBvbmx5IHNsZWVwIGlmIHdlIG5lZWQgdG8KICAgICB9IHdoaWxlICgocmV0cmllcysrIDwgcmV0cnlMaW1pdF8pICYmIChUSFJJRlRfU0xFRVBfU0VDKHJldHJ5RGVsYXlfKSA9PSAwKSk7CiAjZWxzZQogICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTb2NrZXQ6Om9wZW4oKSBVbml4IERvbWFpbiBzb2NrZXQgcGF0aCBub3Qgc3VwcG9ydGVkIG9uIHdpbmRvd3MiLCAtOTkpOwotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICIgVW5peCBEb21haW4gc29ja2V0IHBhdGggbm90IHN1cHBvcnRlZCIpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIFVuaXggRG9tYWluIHNvY2tldCBwYXRoIG5vdCBzdXBwb3J0ZWQiKTsKICNlbmRpZgogICB9IGVsc2UgewogICAgIGRvIHsKICAgICAgIGlmICgwID09IDo6YmluZChzZXJ2ZXJTb2NrZXRfLCByZXMtPmFpX2FkZHIsIHN0YXRpY19jYXN0PGludD4ocmVzLT5haV9hZGRybGVuKSkpIHsKICAgICAgICAgYnJlYWs7CiAgICAgICB9CisgICAgICBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CiAgICAgICAvLyB1c2Ugc2hvcnQgY2lyY3VpdCBldmFsdWF0aW9uIGhlcmUgdG8gb25seSBzbGVlcCBpZiB3ZSBuZWVkIHRvCiAgICAgfSB3aGlsZSAoKHJldHJpZXMrKyA8IHJldHJ5TGltaXRfKSAmJiAoVEhSSUZUX1NMRUVQX1NFQyhyZXRyeURlbGF5XykgPT0gMCkpOwogCi0gICAgLy8gZnJlZSBhZGRyaW5mbwotICAgIGZyZWVhZGRyaW5mbyhyZXMwKTsKLQogICAgIC8vIHJldHJpZXZlIGJpbmQgaW5mbwogICAgIGlmIChwb3J0XyA9PSAwICYmIHJldHJpZXMgPD0gcmV0cnlMaW1pdF8pIHsKLSAgICAgIHN0cnVjdCBzb2NrYWRkciBzYTsKKyAgICAgIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIHNhOwogICAgICAgc29ja2xlbl90IGxlbiA9IHNpemVvZihzYSk7CiAgICAgICBzdGQ6Om1lbXNldCgmc2EsIDAsIGxlbik7Ci0gICAgICBpZiAoOjpnZXRzb2NrbmFtZShzZXJ2ZXJTb2NrZXRfLCAmc2EsICZsZW4pIDwgMCkgewotICAgICAgICBpbnQgZXJybm9fY29weSA9IGVycm5vOworICAgICAgaWYgKDo6Z2V0c29ja25hbWUoc2VydmVyU29ja2V0XywgcmVpbnRlcnByZXRfY2FzdDxzdHJ1Y3Qgc29ja2FkZHIqPigmc2EpLCAmbGVuKSA8IDApIHsKKyAgICAgICAgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOwogICAgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU2VydmVyU29ja2V0OjpnZXRQb3J0KCkgZ2V0c29ja25hbWUoKSAiLCBlcnJub19jb3B5KTsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICBpZiAoc2Euc2FfZmFtaWx5ID09IEFGX0lORVQ2KSB7Ci0gICAgICAgICAgY29uc3Qgc3RydWN0IHNvY2thZGRyX2luNioKLSAgICAgICAgICAgIHNpbiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc3RydWN0IHNvY2thZGRyX2luNiAqPigmc2EpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHNhLnNzX2ZhbWlseSA9PSBBRl9JTkVUNikgeworICAgICAgICAgIGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbjYqIHNpbiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc3RydWN0IHNvY2thZGRyX2luNio+KCZzYSk7CiAgICAgICAgICAgcG9ydF8gPSBudG9ocyhzaW4tPnNpbjZfcG9ydCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgY29uc3Qgc3RydWN0IHNvY2thZGRyX2luKgotICAgICAgICAgICAgc2luID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKj4oJnNhKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW4qIHNpbiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc3RydWN0IHNvY2thZGRyX2luKj4oJnNhKTsKICAgICAgICAgICBwb3J0XyA9IG50b2hzKHNpbi0+c2luX3BvcnQpOwogICAgICAgICB9CiAgICAgICB9CkBAIC0zNzMsMjMgKzUwMywyNCBAQAogICAvLyB0aHJvdyBhbiBlcnJvciBpZiB3ZSBmYWlsZWQgdG8gYmluZCBwcm9wZXJseQogICBpZiAocmV0cmllcyA+IHJldHJ5TGltaXRfKSB7CiAgICAgY2hhciBlcnJidWZbMTAyNF07Ci0gICAgaWYgKCEgcGF0aF8uZW1wdHkoKSkgewotICAgICAgc3ByaW50ZihlcnJidWYsICJUU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBQQVRIICVzIiwgcGF0aF8uY19zdHIoKSk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgc3ByaW50ZihlcnJidWYsICJUU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBCSU5EICVkIiwgcG9ydF8pOworICAgIGlmICghcGF0aF8uZW1wdHkoKSkgeworICAgICAgVEhSSUZUX1NOUFJJTlRGKGVycmJ1Ziwgc2l6ZW9mKGVycmJ1ZiksICJUU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBQQVRIICVzIiwgcGF0aF8uY19zdHIoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIFRIUklGVF9TTlBSSU5URihlcnJidWYsIHNpemVvZihlcnJidWYpLCAiVFNlcnZlclNvY2tldDo6bGlzdGVuKCkgQklORCAlZCIsIHBvcnRfKTsKICAgICB9CiAgICAgR2xvYmFsT3V0cHV0KGVycmJ1Zik7CiAgICAgY2xvc2UoKTsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiQ291bGQgbm90IGJpbmQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGJpbmQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJybm9fY29weSk7CiAgIH0KIAotICBpZihsaXN0ZW5DYWxsYmFja18pIGxpc3RlbkNhbGxiYWNrXyhzZXJ2ZXJTb2NrZXRfKTsKKyAgaWYgKGxpc3RlbkNhbGxiYWNrXykKKyAgICBsaXN0ZW5DYWxsYmFja18oc2VydmVyU29ja2V0Xyk7CiAKICAgLy8gQ2FsbCBsaXN0ZW4KICAgaWYgKC0xID09IDo6bGlzdGVuKHNlcnZlclNvY2tldF8sIGFjY2VwdEJhY2tsb2dfKSkgewotICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOwogICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIGxpc3RlbigpICIsIGVycm5vX2NvcHkpOwogICAgIGNsb3NlKCk7CiAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIkNvdWxkIG5vdCBsaXN0ZW4iLCBlcnJub19jb3B5KTsKQEAgLTM5OSw3ICs1MzAsNyBAQAogfQogCiBpbnQgVFNlcnZlclNvY2tldDo6Z2V0UG9ydCgpIHsKLSAgICByZXR1cm4gcG9ydF87CisgIHJldHVybiBwb3J0XzsKIH0KIAogc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBUU2VydmVyU29ja2V0OjphY2NlcHRJbXBsKCkgewpAQCAtNDEzLDExICs1NDQsMTEgQEAKICAgaW50IG51bUVpbnRycyA9IDA7CiAKICAgd2hpbGUgKHRydWUpIHsKLSAgICBzdGQ6Om1lbXNldChmZHMsIDAgLCBzaXplb2YoZmRzKSk7CisgICAgc3RkOjptZW1zZXQoZmRzLCAwLCBzaXplb2YoZmRzKSk7CiAgICAgZmRzWzBdLmZkID0gc2VydmVyU29ja2V0XzsKICAgICBmZHNbMF0uZXZlbnRzID0gVEhSSUZUX1BPTExJTjsKLSAgICBpZiAoaW50U29jazJfICE9IFRIUklGVF9JTlZBTElEX1NPQ0tFVCkgewotICAgICAgZmRzWzFdLmZkID0gaW50U29jazJfOworICAgIGlmIChpbnRlcnJ1cHRTb2NrUmVhZGVyXyAhPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQpIHsKKyAgICAgIGZkc1sxXS5mZCA9IGludGVycnVwdFNvY2tSZWFkZXJfOwogICAgICAgZmRzWzFdLmV2ZW50cyA9IFRIUklGVF9QT0xMSU47CiAgICAgfQogICAgIC8qCkBAIC00MzgsMTEgKzU2OSwxMSBAQAogICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLCAiVW5rbm93biIsIGVycm5vX2NvcHkpOwogICAgIH0gZWxzZSBpZiAocmV0ID4gMCkgewogICAgICAgLy8gQ2hlY2sgZm9yIGFuIGludGVycnVwdCBzaWduYWwKLSAgICAgIGlmIChpbnRTb2NrMl8gIT0gVEhSSUZUX0lOVkFMSURfU09DS0VUCi0gICAgICAgICAgJiYgKGZkc1sxXS5yZXZlbnRzICYgVEhSSUZUX1BPTExJTikpIHsKKyAgICAgIGlmIChpbnRlcnJ1cHRTb2NrUmVhZGVyXyAhPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQgJiYgKGZkc1sxXS5yZXZlbnRzICYgVEhSSUZUX1BPTExJTikpIHsKICAgICAgICAgaW50OF90IGJ1ZjsKLSAgICAgICAgaWYgKC0xID09IHJlY3YoaW50U29jazJfLCBjYXN0X3NvY2tvcHQoJmJ1ZiksIHNpemVvZihpbnQ4X3QpLCAwKSkgewotICAgICAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTZXJ2ZXJTb2NrZXQ6OmFjY2VwdEltcGwoKSByZWN2KCkgaW50ZXJydXB0ICIsIFRIUklGVF9HRVRfU09DS0VUX0VSUk9SKTsKKyAgICAgICAgaWYgKC0xID09IHJlY3YoaW50ZXJydXB0U29ja1JlYWRlcl8sIGNhc3Rfc29ja29wdCgmYnVmKSwgc2l6ZW9mKGludDhfdCksIDApKSB7CisgICAgICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNlcnZlclNvY2tldDo6YWNjZXB0SW1wbCgpIHJlY3YoKSBpbnRlcnJ1cHQgIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIUklGVF9HRVRfU09DS0VUX0VSUk9SKTsKICAgICAgICAgfQogICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OklOVEVSUlVQVEVEKTsKICAgICAgIH0KQEAgLTQ1OSwxMSArNTkwLDEwIEBACiAKICAgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgY2xpZW50QWRkcmVzczsKICAgaW50IHNpemUgPSBzaXplb2YoY2xpZW50QWRkcmVzcyk7Ci0gIFRIUklGVF9TT0NLRVQgY2xpZW50U29ja2V0ID0gOjphY2NlcHQoc2VydmVyU29ja2V0XywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmNsaWVudEFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc29ja2xlbl90ICopICZzaXplKTsKKyAgVEhSSUZUX1NPQ0tFVCBjbGllbnRTb2NrZXQKKyAgICAgID0gOjphY2NlcHQoc2VydmVyU29ja2V0XywgKHN0cnVjdCBzb2NrYWRkciopJmNsaWVudEFkZHJlc3MsIChzb2NrbGVuX3QqKSZzaXplKTsKIAotICBpZiAoY2xpZW50U29ja2V0ID09IC0xKSB7CisgIGlmIChjbGllbnRTb2NrZXQgPT0gVEhSSUZUX0lOVkFMSURfU09DS0VUKSB7CiAgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU2VydmVyU29ja2V0OjphY2NlcHRJbXBsKCkgOjphY2NlcHQoKSAiLCBlcnJub19jb3B5KTsKICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sICJhY2NlcHQoKSIsIGVycm5vX2NvcHkpOwpAQCAtNDczLDE0ICs2MDMsMjIgQEAKICAgaW50IGZsYWdzID0gVEhSSUZUX0ZDTlRMKGNsaWVudFNvY2tldCwgVEhSSUZUX0ZfR0VURkwsIDApOwogICBpZiAoZmxhZ3MgPT0gLTEpIHsKICAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgIDo6VEhSSUZUX0NMT1NFU09DS0VUKGNsaWVudFNvY2tldCk7CiAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNlcnZlclNvY2tldDo6YWNjZXB0SW1wbCgpIFRIUklGVF9GQ05UTCgpIFRIUklGVF9GX0dFVEZMICIsIGVycm5vX2NvcHkpOwotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTiwgIlRIUklGVF9GQ05UTChUSFJJRlRfRl9HRVRGTCkiLCBlcnJub19jb3B5KTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVEhSSUZUX0ZDTlRMKFRIUklGVF9GX0dFVEZMKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKICAgfQogCiAgIGlmICgtMSA9PSBUSFJJRlRfRkNOVEwoY2xpZW50U29ja2V0LCBUSFJJRlRfRl9TRVRGTCwgZmxhZ3MgJiB+VEhSSUZUX09fTk9OQkxPQ0spKSB7CiAgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKLSAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU2VydmVyU29ja2V0OjphY2NlcHRJbXBsKCkgVEhSSUZUX0ZDTlRMKCkgVEhSSUZUX0ZfU0VURkwgflRIUklGVF9PX05PTkJMT0NLICIsIGVycm5vX2NvcHkpOwotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTiwgIlRIUklGVF9GQ05UTChUSFJJRlRfRl9TRVRGTCkiLCBlcnJub19jb3B5KTsKKyAgICA6OlRIUklGVF9DTE9TRVNPQ0tFVChjbGllbnRTb2NrZXQpOworICAgIEdsb2JhbE91dHB1dAorICAgICAgICAucGVycm9yKCJUU2VydmVyU29ja2V0OjphY2NlcHRJbXBsKCkgVEhSSUZUX0ZDTlRMKCkgVEhSSUZUX0ZfU0VURkwgflRIUklGVF9PX05PTkJMT0NLICIsCisgICAgICAgICAgICAgICAgZXJybm9fY29weSk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRIUklGVF9GQ05UTChUSFJJRlRfRl9TRVRGTCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJybm9fY29weSk7CiAgIH0KIAogICBzaGFyZWRfcHRyPFRTb2NrZXQ+IGNsaWVudCA9IGNyZWF0ZVNvY2tldChjbGllbnRTb2NrZXQpOwpAQCAtNDkzLDQwICs2MzEsNjcgQEAKICAgaWYgKGtlZXBBbGl2ZV8pIHsKICAgICBjbGllbnQtPnNldEtlZXBBbGl2ZShrZWVwQWxpdmVfKTsKICAgfQotICBjbGllbnQtPnNldENhY2hlZEFkZHJlc3MoKHNvY2thZGRyKikgJmNsaWVudEFkZHJlc3MsIHNpemUpOworICBjbGllbnQtPnNldENhY2hlZEFkZHJlc3MoKHNvY2thZGRyKikmY2xpZW50QWRkcmVzcywgc2l6ZSk7CiAKLSAgaWYoYWNjZXB0Q2FsbGJhY2tfKSBhY2NlcHRDYWxsYmFja18oY2xpZW50U29ja2V0KTsKKyAgaWYgKGFjY2VwdENhbGxiYWNrXykKKyAgICBhY2NlcHRDYWxsYmFja18oY2xpZW50U29ja2V0KTsKIAogICByZXR1cm4gY2xpZW50OwogfQogCiBzaGFyZWRfcHRyPFRTb2NrZXQ+IFRTZXJ2ZXJTb2NrZXQ6OmNyZWF0ZVNvY2tldChUSFJJRlRfU09DS0VUIGNsaWVudFNvY2tldCkgewotICByZXR1cm4gc2hhcmVkX3B0cjxUU29ja2V0PihuZXcgVFNvY2tldChjbGllbnRTb2NrZXQpKTsKKyAgaWYgKGludGVycnVwdGFibGVDaGlsZHJlbl8pIHsKKyAgICByZXR1cm4gc2hhcmVkX3B0cjxUU29ja2V0PihuZXcgVFNvY2tldChjbGllbnRTb2NrZXQsIHBDaGlsZEludGVycnVwdFNvY2tSZWFkZXJfKSk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIHNoYXJlZF9wdHI8VFNvY2tldD4obmV3IFRTb2NrZXQoY2xpZW50U29ja2V0KSk7CisgIH0KIH0KIAotdm9pZCBUU2VydmVyU29ja2V0OjppbnRlcnJ1cHQoKSB7Ci0gIGlmIChpbnRTb2NrMV8gIT0gVEhSSUZUX0lOVkFMSURfU09DS0VUKSB7Cit2b2lkIFRTZXJ2ZXJTb2NrZXQ6Om5vdGlmeShUSFJJRlRfU09DS0VUIG5vdGlmeVNvY2tldCkgeworICBpZiAobm90aWZ5U29ja2V0ICE9IFRIUklGVF9JTlZBTElEX1NPQ0tFVCkgewogICAgIGludDhfdCBieXRlID0gMDsKLSAgICBpZiAoLTEgPT0gc2VuZChpbnRTb2NrMV8sIGNhc3Rfc29ja29wdCgmYnl0ZSksIHNpemVvZihpbnQ4X3QpLCAwKSkgewotICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNlcnZlclNvY2tldDo6aW50ZXJydXB0KCkgc2VuZCgpICIsIFRIUklGVF9HRVRfU09DS0VUX0VSUk9SKTsKKyAgICBpZiAoLTEgPT0gc2VuZChub3RpZnlTb2NrZXQsIGNhc3Rfc29ja29wdCgmYnl0ZSksIHNpemVvZihpbnQ4X3QpLCAwKSkgeworICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNlcnZlclNvY2tldDo6bm90aWZ5KCkgc2VuZCgpICIsIFRIUklGVF9HRVRfU09DS0VUX0VSUk9SKTsKICAgICB9CiAgIH0KIH0KIAordm9pZCBUU2VydmVyU29ja2V0OjppbnRlcnJ1cHQoKSB7CisgIGNvbmN1cnJlbmN5OjpHdWFyZCBnKHJ3TXV0ZXhfKTsKKyAgaWYgKGludGVycnVwdFNvY2tXcml0ZXJfICE9IFRIUklGVF9JTlZBTElEX1NPQ0tFVCkgeworICAgIG5vdGlmeShpbnRlcnJ1cHRTb2NrV3JpdGVyXyk7CisgIH0KK30KKwordm9pZCBUU2VydmVyU29ja2V0OjppbnRlcnJ1cHRDaGlsZHJlbigpIHsKKyAgY29uY3VycmVuY3k6Okd1YXJkIGcocndNdXRleF8pOworICBpZiAoY2hpbGRJbnRlcnJ1cHRTb2NrV3JpdGVyXyAhPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQpIHsKKyAgICBub3RpZnkoY2hpbGRJbnRlcnJ1cHRTb2NrV3JpdGVyXyk7CisgIH0KK30KKwogdm9pZCBUU2VydmVyU29ja2V0OjpjbG9zZSgpIHsKKyAgY29uY3VycmVuY3k6Okd1YXJkIGcocndNdXRleF8pOwogICBpZiAoc2VydmVyU29ja2V0XyAhPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQpIHsKICAgICBzaHV0ZG93bihzZXJ2ZXJTb2NrZXRfLCBUSFJJRlRfU0hVVF9SRFdSKTsKICAgICA6OlRIUklGVF9DTE9TRVNPQ0tFVChzZXJ2ZXJTb2NrZXRfKTsKICAgfQotICBpZiAoaW50U29jazFfICE9IFRIUklGVF9JTlZBTElEX1NPQ0tFVCkgewotICAgICAgOjpUSFJJRlRfQ0xPU0VTT0NLRVQoaW50U29jazFfKTsKKyAgaWYgKGludGVycnVwdFNvY2tXcml0ZXJfICE9IFRIUklGVF9JTlZBTElEX1NPQ0tFVCkgeworICAgIDo6VEhSSUZUX0NMT1NFU09DS0VUKGludGVycnVwdFNvY2tXcml0ZXJfKTsKICAgfQotICBpZiAoaW50U29jazJfICE9IFRIUklGVF9JTlZBTElEX1NPQ0tFVCkgewotICAgIDo6VEhSSUZUX0NMT1NFU09DS0VUKGludFNvY2syXyk7CisgIGlmIChpbnRlcnJ1cHRTb2NrUmVhZGVyXyAhPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQpIHsKKyAgICA6OlRIUklGVF9DTE9TRVNPQ0tFVChpbnRlcnJ1cHRTb2NrUmVhZGVyXyk7CisgIH0KKyAgaWYgKGNoaWxkSW50ZXJydXB0U29ja1dyaXRlcl8gIT0gVEhSSUZUX0lOVkFMSURfU09DS0VUKSB7CisgICAgOjpUSFJJRlRfQ0xPU0VTT0NLRVQoY2hpbGRJbnRlcnJ1cHRTb2NrV3JpdGVyXyk7CiAgIH0KICAgc2VydmVyU29ja2V0XyA9IFRIUklGVF9JTlZBTElEX1NPQ0tFVDsKLSAgaW50U29jazFfID0gVEhSSUZUX0lOVkFMSURfU09DS0VUOwotICBpbnRTb2NrMl8gPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQ7CisgIGludGVycnVwdFNvY2tXcml0ZXJfID0gVEhSSUZUX0lOVkFMSURfU09DS0VUOworICBpbnRlcnJ1cHRTb2NrUmVhZGVyXyA9IFRIUklGVF9JTlZBTElEX1NPQ0tFVDsKKyAgY2hpbGRJbnRlcnJ1cHRTb2NrV3JpdGVyXyA9IFRIUklGVF9JTlZBTElEX1NPQ0tFVDsKKyAgcENoaWxkSW50ZXJydXB0U29ja1JlYWRlcl8ucmVzZXQoKTsKKyAgbGlzdGVuaW5nXyA9IGZhbHNlOwogfQotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oCmluZGV4IDU2ZWMyYjUuLmIyM2QyYzEgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oCkBAIC0yMCwzMSArMjAsODMgQEAKICNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVFNFUlZFUlNPQ0tFVF9IXwogI2RlZmluZSBfVEhSSUZUX1RSQU5TUE9SVF9UU0VSVkVSU09DS0VUX0hfIDEKIAotI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNlcnZlclRyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9NdXRleC5oPgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvUGxhdGZvcm1Tb2NrZXQuaD4KLSNpbmNsdWRlIDx0aHJpZnQvY3h4ZnVuY3Rpb25hbC5oPgotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNlcnZlclRyYW5zcG9ydC5oPgogCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0cmFuc3BvcnQgeworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2lmZGVmIEhBVkVfU1lTX1NPQ0tFVF9ICisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9ORVREQl9ICisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNlbmRpZgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CiAKIGNsYXNzIFRTb2NrZXQ7CiAKK2NsYXNzIFRHZXRBZGRySW5mb1dyYXBwZXIgeworcHVibGljOgorICBUR2V0QWRkckluZm9XcmFwcGVyKGNvbnN0IGNoYXIqIG5vZGUsIGNvbnN0IGNoYXIqIHNlcnZpY2UsIGNvbnN0IHN0cnVjdCBhZGRyaW5mbyogaGludHMpOworCisgIHZpcnR1YWwgflRHZXRBZGRySW5mb1dyYXBwZXIoKTsKKworICBpbnQgaW5pdCgpOworICBjb25zdCBzdHJ1Y3QgYWRkcmluZm8qIHJlcygpOworCitwcml2YXRlOgorICBjb25zdCBjaGFyKiBub2RlXzsKKyAgY29uc3QgY2hhciogc2VydmljZV87CisgIGNvbnN0IHN0cnVjdCBhZGRyaW5mbyogaGludHNfOworICBzdHJ1Y3QgYWRkcmluZm8qIHJlc187Cit9OworCiAvKioKICAqIFNlcnZlciBzb2NrZXQgaW1wbGVtZW50YXRpb24gb2YgVFNlcnZlclRyYW5zcG9ydC4gV3JhcHBlciBhcm91bmQgYSB1bml4CiAgKiBzb2NrZXQgbGlzdGVuIGFuZCBhY2NlcHQgY2FsbHMuCiAgKgogICovCiBjbGFzcyBUU2VydmVyU29ja2V0IDogcHVibGljIFRTZXJ2ZXJUcmFuc3BvcnQgewotIHB1YmxpYzoKLSAgdHlwZWRlZiBhcGFjaGU6OnRocmlmdDo6c3RkY3h4OjpmdW5jdGlvbjx2b2lkKFRIUklGVF9TT0NLRVQgZmQpPiBzb2NrZXRfZnVuY190OworcHVibGljOgorICB0eXBlZGVmIHN0ZDo6ZnVuY3Rpb248dm9pZChUSFJJRlRfU09DS0VUIGZkKT4gc29ja2V0X2Z1bmNfdDsKIAogICBjb25zdCBzdGF0aWMgaW50IERFRkFVTFRfQkFDS0xPRyA9IDEwMjQ7CiAKKyAgLyoqCisgICAqIENvbnN0cnVjdG9yLgorICAgKgorICAgKiBAcGFyYW0gcG9ydCAgICBQb3J0IG51bWJlciB0byBiaW5kIHRvCisgICAqLwogICBUU2VydmVyU29ja2V0KGludCBwb3J0KTsKLSAgVFNlcnZlclNvY2tldChpbnQgcG9ydCwgaW50IHNlbmRUaW1lb3V0LCBpbnQgcmVjdlRpbWVvdXQpOwotICBUU2VydmVyU29ja2V0KHN0ZDo6c3RyaW5nIHBhdGgpOwogCi0gIH5UU2VydmVyU29ja2V0KCk7CisgIC8qKgorICAgKiBDb25zdHJ1Y3Rvci4KKyAgICoKKyAgICogQHBhcmFtIHBvcnQgICAgICAgIFBvcnQgbnVtYmVyIHRvIGJpbmQgdG8KKyAgICogQHBhcmFtIHNlbmRUaW1lb3V0IFNvY2tldCBzZW5kIHRpbWVvdXQKKyAgICogQHBhcmFtIHJlY3ZUaW1lb3V0IFNvY2tldCByZWNlaXZlIHRpbWVvdXQKKyAgICovCisgIFRTZXJ2ZXJTb2NrZXQoaW50IHBvcnQsIGludCBzZW5kVGltZW91dCwgaW50IHJlY3ZUaW1lb3V0KTsKKworICAvKioKKyAgICogQ29uc3RydWN0b3IuCisgICAqCisgICAqIEBwYXJhbSBhZGRyZXNzIEFkZHJlc3MgdG8gYmluZCB0bworICAgKiBAcGFyYW0gcG9ydCAgICBQb3J0IG51bWJlciB0byBiaW5kIHRvCisgICAqLworICBUU2VydmVyU29ja2V0KGNvbnN0IHN0ZDo6c3RyaW5nJiBhZGRyZXNzLCBpbnQgcG9ydCk7CisKKyAgLyoqCisgICAqIENvbnN0cnVjdG9yIHVzZWQgZm9yIHVuaXggc29ja2V0cy4KKyAgICoKKyAgICogQHBhcmFtIHBhdGggUGF0aG5hbWUgZm9yIHVuaXggc29ja2V0LgorICAgKi8KKyAgVFNlcnZlclNvY2tldChjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCk7CisKKyAgdmlydHVhbCB+VFNlcnZlclNvY2tldCgpOwogCiAgIHZvaWQgc2V0U2VuZFRpbWVvdXQoaW50IHNlbmRUaW1lb3V0KTsKICAgdm9pZCBzZXRSZWN2VGltZW91dChpbnQgcmVjdlRpbWVvdXQpOwpAQCAtNTUsNyArMTA3LDcgQEAKICAgdm9pZCBzZXRSZXRyeUxpbWl0KGludCByZXRyeUxpbWl0KTsKICAgdm9pZCBzZXRSZXRyeURlbGF5KGludCByZXRyeURlbGF5KTsKIAotICB2b2lkIHNldEtlZXBBbGl2ZShib29sIGtlZXBBbGl2ZSkge2tlZXBBbGl2ZV8gPSBrZWVwQWxpdmU7fQorICB2b2lkIHNldEtlZXBBbGl2ZShib29sIGtlZXBBbGl2ZSkgeyBrZWVwQWxpdmVfID0ga2VlcEFsaXZlOyB9CiAKICAgdm9pZCBzZXRUY3BTZW5kQnVmZmVyKGludCB0Y3BTZW5kQnVmZmVyKTsKICAgdm9pZCBzZXRUY3BSZWN2QnVmZmVyKGludCB0Y3BSZWN2QnVmZmVyKTsKQEAgLTYzLDI2ICsxMTUsNDcgQEAKICAgLy8gbGlzdGVuQ2FsbGJhY2sgZ2V0cyBjYWxsZWQganVzdCBiZWZvcmUgbGlzdGVuLCBhbmQgYWZ0ZXIgYWxsIFRocmlmdAogICAvLyBzZXRzb2Nrb3B0IGNhbGxzIGhhdmUgYmVlbiBtYWRlLiAgSWYgeW91IGhhdmUgY3VzdG9tIHNldHNvY2tvcHQKICAgLy8gdGhpbmdzIHRoYXQgbmVlZCB0byBoYXBwZW4gb24gdGhlIGxpc3RlbmluZyBzb2NrZXQsIHRoaXMgaXMgdGhlIHBsYWNlIHRvIGRvIGl0LgotICB2b2lkIHNldExpc3RlbkNhbGxiYWNrKGNvbnN0IHNvY2tldF9mdW5jX3QgJmxpc3RlbkNhbGxiYWNrKSB7IGxpc3RlbkNhbGxiYWNrXyA9IGxpc3RlbkNhbGxiYWNrOyB9CisgIHZvaWQgc2V0TGlzdGVuQ2FsbGJhY2soY29uc3Qgc29ja2V0X2Z1bmNfdCYgbGlzdGVuQ2FsbGJhY2spIHsgbGlzdGVuQ2FsbGJhY2tfID0gbGlzdGVuQ2FsbGJhY2s7IH0KIAogICAvLyBhY2NlcHRDYWxsYmFjayBnZXRzIGNhbGxlZCBhZnRlciBlYWNoIGFjY2VwdCBjYWxsLCBvbiB0aGUgbmV3bHkgY3JlYXRlZCBzb2NrZXQuCiAgIC8vIEl0IGlzIGNhbGxlZCBhZnRlciBhbGwgVGhyaWZ0IHNldHNvY2tvcHQgY2FsbHMgaGF2ZSBiZWVuIG1hZGUuICBJZiB5b3UgaGF2ZQogICAvLyBjdXN0b20gc2V0c29ja29wdCB0aGluZ3MgdGhhdCBuZWVkIHRvIGhhcHBlbiBvbiB0aGUgYWNjZXB0ZWQKICAgLy8gc29ja2V0LCB0aGlzIGlzIHRoZSBwbGFjZSB0byBkbyBpdC4KLSAgdm9pZCBzZXRBY2NlcHRDYWxsYmFjayhjb25zdCBzb2NrZXRfZnVuY190ICZhY2NlcHRDYWxsYmFjaykgeyBhY2NlcHRDYWxsYmFja18gPSBhY2NlcHRDYWxsYmFjazsgfQorICB2b2lkIHNldEFjY2VwdENhbGxiYWNrKGNvbnN0IHNvY2tldF9mdW5jX3QmIGFjY2VwdENhbGxiYWNrKSB7IGFjY2VwdENhbGxiYWNrXyA9IGFjY2VwdENhbGxiYWNrOyB9CiAKLSAgdm9pZCBsaXN0ZW4oKTsKLSAgdm9pZCBjbG9zZSgpOworICAvLyBXaGVuIGVuYWJsZWQgKHRoZSBkZWZhdWx0KSwgbmV3IGNoaWxkcmVuIFRTb2NrZXRzIHdpbGwgYmUgY29uc3RydWN0ZWQgc28KKyAgLy8gdGhleSBjYW4gYmUgaW50ZXJydXB0ZWQgYnkgVFNlcnZlclRyYW5zcG9ydDo6aW50ZXJydXB0Q2hpbGRyZW4oKS4KKyAgLy8gVGhpcyBpcyBtb3JlIGV4cGVuc2l2ZSBpbiB0ZXJtcyBvZiBzeXN0ZW0gY2FsbHMgKHBvbGwgKyByZWN2KSBob3dldmVyCisgIC8vIGVuc3VyZXMgYSBjb25uZWN0ZWQgY2xpZW50IGNhbm5vdCBpbnRlcmZlcmUgd2l0aCBUU2VydmVyOjpzdG9wKCkuCisgIC8vCisgIC8vIFdoZW4gZGlzYWJsZWQsIFRTb2NrZXQgY2hpbGRyZW4gZG8gbm90IGluY3VyIGFuIGFkZGl0aW9uYWwgcG9sbCgpIGNhbGwuCisgIC8vIFNlcnZlci1zaWRlIHJlYWRzIGFyZSBtb3JlIGVmZmljaWVudCwgaG93ZXZlciBhIGNsaWVudCBjYW4gaW50ZXJmZXJlIHdpdGgKKyAgLy8gdGhlIHNlcnZlcidzIGFiaWxpdHkgdG8gc2h1dGRvd24gcHJvcGVybHkgYnkgc3RheWluZyBjb25uZWN0ZWQuCisgIC8vCisgIC8vIE11c3QgYmUgY2FsbGVkIGJlZm9yZSBsaXN0ZW4oKTsgbW9kZSBjYW5ub3QgYmUgc3dpdGNoZWQgYWZ0ZXIgdGhhdC4KKyAgLy8gXHRocm93cyBzdGQ6OmxvZ2ljX2Vycm9yIGlmIGxpc3RlbigpIGhhcyBiZWVuIGNhbGxlZAorICB2b2lkIHNldEludGVycnVwdGFibGVDaGlsZHJlbihib29sIGVuYWJsZSk7CiAKLSAgdm9pZCBpbnRlcnJ1cHQoKTsKKyAgVEhSSUZUX1NPQ0tFVCBnZXRTb2NrZXRGRCgpIHsgcmV0dXJuIHNlcnZlclNvY2tldF87IH0KKwogICBpbnQgZ2V0UG9ydCgpOwogCi0gcHJvdGVjdGVkOgotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBhY2NlcHRJbXBsKCk7Ci0gIHZpcnR1YWwgYm9vc3Q6OnNoYXJlZF9wdHI8VFNvY2tldD4gY3JlYXRlU29ja2V0KFRIUklGVF9TT0NLRVQgY2xpZW50KTsKKyAgdm9pZCBsaXN0ZW4oKTsKKyAgdm9pZCBpbnRlcnJ1cHQoKTsKKyAgdm9pZCBpbnRlcnJ1cHRDaGlsZHJlbigpOworICB2b2lkIGNsb3NlKCk7CiAKLSBwcml2YXRlOgorcHJvdGVjdGVkOgorICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gYWNjZXB0SW1wbCgpOworICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0PiBjcmVhdGVTb2NrZXQoVEhSSUZUX1NPQ0tFVCBjbGllbnQpOworICBib29sIGludGVycnVwdGFibGVDaGlsZHJlbl87CisgIHN0ZDo6c2hhcmVkX3B0cjxUSFJJRlRfU09DS0VUPiBwQ2hpbGRJbnRlcnJ1cHRTb2NrUmVhZGVyXzsgLy8gaWYgaW50ZXJydXB0YWJsZUNoaWxkcmVuXyB0aGlzIGlzIHNoYXJlZCB3aXRoIGNoaWxkIFRTb2NrZXRzCisKK3ByaXZhdGU6CisgIHZvaWQgbm90aWZ5KFRIUklGVF9TT0NLRVQgbm90aWZ5U29jayk7CisKICAgaW50IHBvcnRfOworICBzdGQ6OnN0cmluZyBhZGRyZXNzXzsKICAgc3RkOjpzdHJpbmcgcGF0aF87CiAgIFRIUklGVF9TT0NLRVQgc2VydmVyU29ja2V0XzsKICAgaW50IGFjY2VwdEJhY2tsb2dfOwpAQCAtOTQsMTQgKzE2NywxOCBAQAogICBpbnQgdGNwU2VuZEJ1ZmZlcl87CiAgIGludCB0Y3BSZWN2QnVmZmVyXzsKICAgYm9vbCBrZWVwQWxpdmVfOworICBib29sIGxpc3RlbmluZ187CiAKLSAgVEhSSUZUX1NPQ0tFVCBpbnRTb2NrMV87Ci0gIFRIUklGVF9TT0NLRVQgaW50U29jazJfOworICBjb25jdXJyZW5jeTo6TXV0ZXggcndNdXRleF87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhyZWFkLXNhZmUgaW50ZXJydXB0CisgIFRIUklGVF9TT0NLRVQgaW50ZXJydXB0U29ja1dyaXRlcl87ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBub3RpZmllZCBvbiBpbnRlcnJ1cHQoKQorICBUSFJJRlRfU09DS0VUIGludGVycnVwdFNvY2tSZWFkZXJfOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgdXNlZCBpbiBzZWxlY3QvcG9sbCB3aXRoIHNlcnZlclNvY2tldF8gZm9yIGludGVycnVwdGFiaWxpdHkKKyAgVEhSSUZUX1NPQ0tFVCBjaGlsZEludGVycnVwdFNvY2tXcml0ZXJfOyAgICAgICAgICAgICAgICAgICAgIC8vIGlzIG5vdGlmaWVkIG9uIGludGVycnVwdENoaWxkcmVuKCkKIAogICBzb2NrZXRfZnVuY190IGxpc3RlbkNhbGxiYWNrXzsKICAgc29ja2V0X2Z1bmNfdCBhY2NlcHRDYWxsYmFja187CiB9OwotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CiAKICNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RTRVJWRVJTT0NLRVRfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNlcnZlclRyYW5zcG9ydC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyVHJhbnNwb3J0LmgKaW5kZXggMmRkZWUwZC4uZGI3NjMyYSAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyVHJhbnNwb3J0LmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyVHJhbnNwb3J0LmgKQEAgLTIyLDE3ICsyMiwxOSBAQAogCiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmg+Ci0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+CiAKLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHRyYW5zcG9ydCB7CituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CiAKIC8qKgogICogU2VydmVyIHRyYW5zcG9ydCBmcmFtZXdvcmsuIEEgc2VydmVyIG5lZWRzIHRvIGhhdmUgc29tZSBmYWNpbGl0eSBmb3IKLSAqIGNyZWF0aW5nIGJhc2UgdHJhbnNwb3J0cyB0byByZWFkL3dyaXRlIGZyb20uCi0gKgorICogY3JlYXRpbmcgYmFzZSB0cmFuc3BvcnRzIHRvIHJlYWQvd3JpdGUgZnJvbS4gIFRoZSBzZXJ2ZXIgaXMgZXhwZWN0ZWQKKyAqIHRvIGtlZXAgdHJhY2sgb2YgVFRyYW5zcG9ydCBjaGlsZHJlbiB0aGF0IGl0IGNyZWF0ZXMgZm9yIHB1cnBvc2VzIG9mCisgKiBjb250cm9sbGluZyB0aGVpciBsaWZldGltZS4KICAqLwogY2xhc3MgVFNlcnZlclRyYW5zcG9ydCB7Ci0gcHVibGljOgorcHVibGljOgogICB2aXJ0dWFsIH5UU2VydmVyVHJhbnNwb3J0KCkge30KIAogICAvKioKQEAgLTUzLDggKzU1LDggQEAKICAgICogQHJldHVybiBBIG5ldyBUVHJhbnNwb3J0IG9iamVjdAogICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgdGhlcmUgaXMgYW4gZXJyb3IKICAgICovCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGFjY2VwdCgpIHsKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiByZXN1bHQgPSBhY2NlcHRJbXBsKCk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBhY2NlcHQoKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHJlc3VsdCA9IGFjY2VwdEltcGwoKTsKICAgICBpZiAoIXJlc3VsdCkgewogICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbigiYWNjZXB0KCkgbWF5IG5vdCByZXR1cm4gTlVMTCIpOwogICAgIH0KQEAgLTY1LDE2ICs2NywzNSBAQAogICAgKiBGb3IgInNtYXJ0IiBUU2VydmVyVHJhbnNwb3J0IGltcGxlbWVudGF0aW9ucyB0aGF0IHdvcmsgaW4gYSBtdWx0aQogICAgKiB0aHJlYWRlZCBjb250ZXh0IHRoaXMgY2FuIGJlIHVzZWQgdG8gYnJlYWsgb3V0IG9mIGFuIGFjY2VwdCgpIGNhbGwuCiAgICAqIEl0IGlzIGV4cGVjdGVkIHRoYXQgdGhlIHRyYW5zcG9ydCB3aWxsIHRocm93IGEgVFRyYW5zcG9ydEV4Y2VwdGlvbgotICAgKiB3aXRoIHRoZSBpbnRlcnJ1cHRlZCBlcnJvciBjb2RlLgorICAgKiB3aXRoIHRoZSBJTlRFUlJVUFRFRCBlcnJvciBjb2RlLgorICAgKgorICAgKiBUaGlzIHdpbGwgbm90IG1ha2UgYW4gYXR0ZW1wdCB0byBpbnRlcnJ1cHQgYW55IFRUcmFuc3BvcnQgY2hpbGRyZW4uCiAgICAqLwogICB2aXJ0dWFsIHZvaWQgaW50ZXJydXB0KCkge30KIAogICAvKioKKyAgICogVGhpcyB3aWxsIGludGVycnVwdCB0aGUgY2hpbGRyZW4gY3JlYXRlZCBieSB0aGUgc2VydmVyIHRyYW5zcG9ydC4KKyAgICogYWxsb3dpbmcgdGhlbSB0byBicmVhayBvdXQgb2YgYW55IGJsb2NraW5nIGRhdGEgcmVjZXB0aW9uIGNhbGwuCisgICAqIEl0IGlzIGV4cGVjdGVkIHRoYXQgdGhlIGNoaWxkcmVuIHdpbGwgdGhyb3cgYSBUVHJhbnNwb3J0RXhjZXB0aW9uCisgICAqIHdpdGggdGhlIElOVEVSUlVQVEVEIGVycm9yIGNvZGUuCisgICAqLworICB2aXJ0dWFsIHZvaWQgaW50ZXJydXB0Q2hpbGRyZW4oKSB7fQorCisgIC8qKgorICAqIFV0aWxpdHkgbWV0aG9kCisgICoKKyAgKiBAcmV0dXJuIHNlcnZlciBzb2NrZXQgZmlsZSBkZXNjcmlwdG9yCisgICogQHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24gSWYgYW4gZXJyb3Igb2NjdXJzCisgICovCisKKyAgdmlydHVhbCBUSFJJRlRfU09DS0VUIGdldFNvY2tldEZEKCkgeyByZXR1cm4gLTE7IH0KKworICAvKioKICAgICogQ2xvc2VzIHRoaXMgdHJhbnNwb3J0IHN1Y2ggdGhhdCBmdXR1cmUgY2FsbHMgdG8gYWNjZXB0IHdpbGwgZG8gbm90aGluZy4KICAgICovCiAgIHZpcnR1YWwgdm9pZCBjbG9zZSgpID0gMDsKIAotIHByb3RlY3RlZDoKK3Byb3RlY3RlZDoKICAgVFNlcnZlclRyYW5zcG9ydCgpIHt9CiAKICAgLyoqCkBAIC04MywxMCArMTA0LDEwIEBACiAgICAqIEByZXR1cm4gQSBuZXdseSBhbGxvY2F0ZWQgVFRyYW5zcG9ydCBvYmplY3QKICAgICogQHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24gSWYgYW4gZXJyb3Igb2NjdXJzCiAgICAqLwotICB2aXJ0dWFsIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGFjY2VwdEltcGwoKSA9IDA7Ci0KKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gYWNjZXB0SW1wbCgpID0gMDsKIH07Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKIAogI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVFNFUlZFUlRSQU5TUE9SVF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU2hvcnRSZWFkVHJhbnNwb3J0LmggYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTaG9ydFJlYWRUcmFuc3BvcnQuaAppbmRleCA4ZGVmMzU0Li4xMTgyNTJkIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTaG9ydFJlYWRUcmFuc3BvcnQuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTaG9ydFJlYWRUcmFuc3BvcnQuaApAQCAtMjUsNyArMjUsMTAgQEAKICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RWaXJ0dWFsVHJhbnNwb3J0Lmg+CiAKLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHRyYW5zcG9ydCB7IG5hbWVzcGFjZSB0ZXN0IHsKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKK25hbWVzcGFjZSB0ZXN0IHsKIAogLyoqCiAgKiBUaGlzIGNsYXNzIGlzIG9ubHkgbWVhbnQgZm9yIHRlc3RpbmcuICBJdCB3cmFwcyBhbm90aGVyIHRyYW5zcG9ydC4KQEAgLTM0LDY0ICszNyw0NiBAQAogICoKICAqLwogY2xhc3MgVFNob3J0UmVhZFRyYW5zcG9ydCA6IHB1YmxpYyBUVmlydHVhbFRyYW5zcG9ydDxUU2hvcnRSZWFkVHJhbnNwb3J0PiB7Ci0gcHVibGljOgotICBUU2hvcnRSZWFkVHJhbnNwb3J0KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCwgZG91YmxlIGZ1bGxfcHJvYikKLSAgICA6IHRyYW5zcG9ydF8odHJhbnNwb3J0KQotICAgICwgZnVsbFByb2JfKGZ1bGxfcHJvYikKLSAge30KK3B1YmxpYzoKKyAgVFNob3J0UmVhZFRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0LCBkb3VibGUgZnVsbF9wcm9iKQorICAgIDogdHJhbnNwb3J0Xyh0cmFuc3BvcnQpLCBmdWxsUHJvYl8oZnVsbF9wcm9iKSB7fQogCi0gIGJvb2wgaXNPcGVuKCkgewotICAgIHJldHVybiB0cmFuc3BvcnRfLT5pc09wZW4oKTsKLSAgfQorICBib29sIGlzT3BlbigpIHsgcmV0dXJuIHRyYW5zcG9ydF8tPmlzT3BlbigpOyB9CiAKLSAgYm9vbCBwZWVrKCkgewotICAgIHJldHVybiB0cmFuc3BvcnRfLT5wZWVrKCk7Ci0gIH0KKyAgYm9vbCBwZWVrKCkgeyByZXR1cm4gdHJhbnNwb3J0Xy0+cGVlaygpOyB9CiAKLSAgdm9pZCBvcGVuKCkgewotICAgIHRyYW5zcG9ydF8tPm9wZW4oKTsKLSAgfQorICB2b2lkIG9wZW4oKSB7IHRyYW5zcG9ydF8tPm9wZW4oKTsgfQogCi0gIHZvaWQgY2xvc2UoKSB7Ci0gICAgdHJhbnNwb3J0Xy0+Y2xvc2UoKTsKLSAgfQorICB2b2lkIGNsb3NlKCkgeyB0cmFuc3BvcnRfLT5jbG9zZSgpOyB9CiAKICAgdWludDMyX3QgcmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewogICAgIGlmIChsZW4gPT0gMCkgewogICAgICAgcmV0dXJuIDA7CiAgICAgfQogCi0gICAgaWYgKHJhbmQoKS8oZG91YmxlKVJBTkRfTUFYID49IGZ1bGxQcm9iXykgewotICAgICAgbGVuID0gMSArIHJhbmQoKSVsZW47CisgICAgaWYgKHJhbmQoKSAvIChkb3VibGUpUkFORF9NQVggPj0gZnVsbFByb2JfKSB7CisgICAgICBsZW4gPSAxICsgcmFuZCgpICUgbGVuOwogICAgIH0KICAgICByZXR1cm4gdHJhbnNwb3J0Xy0+cmVhZChidWYsIGxlbik7CiAgIH0KIAotICB2b2lkIHdyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7Ci0gICAgdHJhbnNwb3J0Xy0+d3JpdGUoYnVmLCBsZW4pOwotICB9CisgIHZvaWQgd3JpdGUoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsgdHJhbnNwb3J0Xy0+d3JpdGUoYnVmLCBsZW4pOyB9CiAKLSAgdm9pZCBmbHVzaCgpIHsKLSAgICB0cmFuc3BvcnRfLT5mbHVzaCgpOwotICB9CisgIHZvaWQgZmx1c2goKSB7IHRyYW5zcG9ydF8tPmZsdXNoKCk7IH0KIAotICBjb25zdCB1aW50OF90KiBib3Jyb3codWludDhfdCogYnVmLCB1aW50MzJfdCogbGVuKSB7Ci0gICAgcmV0dXJuIHRyYW5zcG9ydF8tPmJvcnJvdyhidWYsIGxlbik7Ci0gIH0KKyAgY29uc3QgdWludDhfdCogYm9ycm93KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QqIGxlbikgeyByZXR1cm4gdHJhbnNwb3J0Xy0+Ym9ycm93KGJ1ZiwgbGVuKTsgfQogCi0gIHZvaWQgY29uc3VtZSh1aW50MzJfdCBsZW4pIHsKLSAgICByZXR1cm4gdHJhbnNwb3J0Xy0+Y29uc3VtZShsZW4pOwotICB9CisgIHZvaWQgY29uc3VtZSh1aW50MzJfdCBsZW4pIHsgcmV0dXJuIHRyYW5zcG9ydF8tPmNvbnN1bWUobGVuKTsgfQogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldFVuZGVybHlpbmdUcmFuc3BvcnQoKSB7Ci0gICAgcmV0dXJuIHRyYW5zcG9ydF87Ci0gIH0KKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldFVuZGVybHlpbmdUcmFuc3BvcnQoKSB7IHJldHVybiB0cmFuc3BvcnRfOyB9CiAKLSBwcm90ZWN0ZWQ6Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydF87Citwcm90ZWN0ZWQ6CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnRfOwogICBkb3VibGUgZnVsbFByb2JfOwogfTsKLQotfX19fSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0Ojp0ZXN0Cit9Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OnRlc3QKIAogI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVFNIT1JUUkVBRFRSQU5TUE9SVF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU2ltcGxlRmlsZVRyYW5zcG9ydC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTaW1wbGVGaWxlVHJhbnNwb3J0LmNwcAppbmRleCA2YmQ3MTZlLi40YjEzOTllIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTaW1wbGVGaWxlVHJhbnNwb3J0LmNwcAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTaW1wbGVGaWxlVHJhbnNwb3J0LmNwcApAQCAtMzEsMTEgKzMxLDEyIEBACiAjaW5jbHVkZSA8aW8uaD4KICNlbmRpZgogCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0cmFuc3BvcnQgeworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgewogCi1UU2ltcGxlRmlsZVRyYW5zcG9ydDo6Ci1UU2ltcGxlRmlsZVRyYW5zcG9ydChjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwgYm9vbCByZWFkLCBib29sIHdyaXRlKQotICAgIDogVEZEVHJhbnNwb3J0KC0xLCBURkRUcmFuc3BvcnQ6OkNMT1NFX09OX0RFU1RST1kpIHsKK1RTaW1wbGVGaWxlVHJhbnNwb3J0OjpUU2ltcGxlRmlsZVRyYW5zcG9ydChjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwgYm9vbCByZWFkLCBib29sIHdyaXRlKQorICA6IFRGRFRyYW5zcG9ydCgtMSwgVEZEVHJhbnNwb3J0OjpDTE9TRV9PTl9ERVNUUk9ZKSB7CiAgIGludCBmbGFncyA9IDA7CiAgIGlmIChyZWFkICYmIHdyaXRlKSB7CiAgICAgZmxhZ3MgPSBPX1JEV1I7CkBAIC01MCwxOCArNTEsMTcgQEAKICAgICBmbGFncyB8PSBPX0NSRUFUIHwgT19BUFBFTkQ7CiAgIH0KICNpZm5kZWYgX1dJTjMyCi0gIG1vZGVfdCBtb2RlID0gU19JUlVTUiB8IFNfSVdVU1J8IFNfSVJHUlAgfCBTX0lST1RIOworICBtb2RlX3QgbW9kZSA9IFNfSVJVU1IgfCBTX0lXVVNSIHwgU19JUkdSUCB8IFNfSVJPVEg7CiAjZWxzZQogICBpbnQgbW9kZSA9IF9TX0lSRUFEIHwgX1NfSVdSSVRFOwogI2VuZGlmCi0gIGludCBmZCA9IDo6VEhSSUZUX09QRU4ocGF0aC5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICBtb2RlKTsKKyAgaW50IGZkID0gOjpUSFJJRlRfT1BFTihwYXRoLmNfc3RyKCksIGZsYWdzLCBtb2RlKTsKICAgaWYgKGZkIDwgMCkgewogICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oImZhaWxlZCB0byBvcGVuIGZpbGUgZm9yIHdyaXRpbmc6ICIgKyBwYXRoKTsKICAgfQogICBzZXRGRChmZCk7CiAgIG9wZW4oKTsKIH0KLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU2ltcGxlRmlsZVRyYW5zcG9ydC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU2ltcGxlRmlsZVRyYW5zcG9ydC5oCmluZGV4IDk4NWExZDMuLjMyZTE4OTcgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNpbXBsZUZpbGVUcmFuc3BvcnQuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTaW1wbGVGaWxlVHJhbnNwb3J0LmgKQEAgLTIyLDcgKzIyLDkgQEAKIAogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEZEVHJhbnNwb3J0Lmg+CiAKLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHRyYW5zcG9ydCB7CituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CiAKIC8qKgogICogRGVhZC1zaW1wbGUgd3JhcHBlciBhcm91bmQgYSBmaWxlLgpAQCAtMzAsMTIgKzMyLDExIEBACiAgKiBXcml0ZWFibGUgZmlsZXMgYXJlIG9wZW5lZCB3aXRoIE9fQ1JFQVQgYW5kIE9fQVBQRU5ECiAgKi8KIGNsYXNzIFRTaW1wbGVGaWxlVHJhbnNwb3J0IDogcHVibGljIFRGRFRyYW5zcG9ydCB7Ci0gcHVibGljOgotICBUU2ltcGxlRmlsZVRyYW5zcG9ydChjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZWFkID0gIHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgIGJvb2wgd3JpdGUgPSBmYWxzZSk7CitwdWJsaWM6CisgIFRTaW1wbGVGaWxlVHJhbnNwb3J0KGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoLCBib29sIHJlYWQgPSB0cnVlLCBib29sIHdyaXRlID0gZmFsc2UpOwogfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAogCiAjZW5kaWYgLy8gIF9USFJJRlRfVFJBTlNQT1JUX1RTSU1QTEVGSUxFVFJBTlNQT1JUX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0LmNwcAppbmRleCBhZjcyNDBhLi5jNmMyYmZhIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuY3BwCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNvY2tldC5jcHAKQEAgLTIxLDYgKzIxLDkgQEAKIAogI2luY2x1ZGUgPGNzdHJpbmc+CiAjaW5jbHVkZSA8c3N0cmVhbT4KKyNpZmRlZiBIQVZFX1NZU19JT0NUTF9ICisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjZW5kaWYKICNpZmRlZiBIQVZFX1NZU19TT0NLRVRfSAogI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KICNlbmRpZgpAQCAtNDYsOTUgKzQ5LDExNCBAQAogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvUGxhdGZvcm1Tb2NrZXQuaD4KIAogI2lmbmRlZiBTT0NLT1BUX0NBU1RfVAotIyAgIGlmbmRlZiBfV0lOMzIKLSMgICAgICAgZGVmaW5lIFNPQ0tPUFRfQ0FTVF9UIHZvaWQKLSMgICBlbHNlCi0jICAgICAgIGRlZmluZSBTT0NLT1BUX0NBU1RfVCBjaGFyCi0jICAgZW5kaWYgLy8gX1dJTjMyCisjaWZuZGVmIF9XSU4zMgorI2RlZmluZSBTT0NLT1BUX0NBU1RfVCB2b2lkCisjZWxzZQorI2RlZmluZSBTT0NLT1BUX0NBU1RfVCBjaGFyCisjZW5kaWYgLy8gX1dJTjMyCiAjZW5kaWYKIAotdGVtcGxhdGU8Y2xhc3MgVD4KK3RlbXBsYXRlIDxjbGFzcyBUPgogaW5saW5lIGNvbnN0IFNPQ0tPUFRfQ0FTVF9UKiBjb25zdF9jYXN0X3NvY2tvcHQoY29uc3QgVCogdikgewotICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IFNPQ0tPUFRfQ0FTVF9UKj4odik7CisgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IFNPQ0tPUFRfQ0FTVF9UKj4odik7CiB9CiAKLXRlbXBsYXRlPGNsYXNzIFQ+Cit0ZW1wbGF0ZSA8Y2xhc3MgVD4KIGlubGluZSBTT0NLT1BUX0NBU1RfVCogY2FzdF9zb2Nrb3B0KFQqIHYpIHsKLSAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxTT0NLT1BUX0NBU1RfVCo+KHYpOworICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxTT0NLT1BUX0NBU1RfVCo+KHYpOwogfQogCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0cmFuc3BvcnQgewordXNpbmcgc3RkOjpzdHJpbmc7CiAKLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0KLS8vIEdsb2JhbCB2YXIgdG8gdHJhY2sgdG90YWwgc29ja2V0IHN5cyBjYWxscwotdWludDMyX3QgZ19zb2NrZXRfc3lzY2FsbHMgPSAwOworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgewogCiAvKioKICAqIFRTb2NrZXQgaW1wbGVtZW50YXRpb24uCiAgKgogICovCiAKLVRTb2NrZXQ6OlRTb2NrZXQoc3RyaW5nIGhvc3QsIGludCBwb3J0KSA6Ci0gIGhvc3RfKGhvc3QpLAotICBwb3J0Xyhwb3J0KSwKLSAgcGF0aF8oIiIpLAotICBzb2NrZXRfKFRIUklGVF9JTlZBTElEX1NPQ0tFVCksCi0gIGNvbm5UaW1lb3V0XygwKSwKLSAgc2VuZFRpbWVvdXRfKDApLAotICByZWN2VGltZW91dF8oMCksCi0gIGtlZXBBbGl2ZV8oZmFsc2UpLAotICBsaW5nZXJPbl8oMSksCi0gIGxpbmdlclZhbF8oMCksCi0gIG5vRGVsYXlfKDEpLAotICBtYXhSZWN2UmV0cmllc18oNSkgeworVFNvY2tldDo6VFNvY2tldChjb25zdCBzdHJpbmcmIGhvc3QsIGludCBwb3J0KQorICA6IGhvc3RfKGhvc3QpLAorICAgIHBvcnRfKHBvcnQpLAorICAgIHNvY2tldF8oVEhSSUZUX0lOVkFMSURfU09DS0VUKSwKKyAgICBwZWVyUG9ydF8oMCksCisgICAgY29ublRpbWVvdXRfKDApLAorICAgIHNlbmRUaW1lb3V0XygwKSwKKyAgICByZWN2VGltZW91dF8oMCksCisgICAga2VlcEFsaXZlXyhmYWxzZSksCisgICAgbGluZ2VyT25fKDEpLAorICAgIGxpbmdlclZhbF8oMCksCisgICAgbm9EZWxheV8oMSksCisgICAgbWF4UmVjdlJldHJpZXNfKDUpIHsKIH0KIAotVFNvY2tldDo6VFNvY2tldChzdHJpbmcgcGF0aCkgOgotICBob3N0XygiIiksCi0gIHBvcnRfKDApLAotICBwYXRoXyhwYXRoKSwKLSAgc29ja2V0XyhUSFJJRlRfSU5WQUxJRF9TT0NLRVQpLAotICBjb25uVGltZW91dF8oMCksCi0gIHNlbmRUaW1lb3V0XygwKSwKLSAgcmVjdlRpbWVvdXRfKDApLAotICBrZWVwQWxpdmVfKGZhbHNlKSwKLSAgbGluZ2VyT25fKDEpLAotICBsaW5nZXJWYWxfKDApLAotICBub0RlbGF5XygxKSwKLSAgbWF4UmVjdlJldHJpZXNfKDUpIHsKK1RTb2NrZXQ6OlRTb2NrZXQoY29uc3Qgc3RyaW5nJiBwYXRoKQorICA6IHBvcnRfKDApLAorICAgIHBhdGhfKHBhdGgpLAorICAgIHNvY2tldF8oVEhSSUZUX0lOVkFMSURfU09DS0VUKSwKKyAgICBwZWVyUG9ydF8oMCksCisgICAgY29ublRpbWVvdXRfKDApLAorICAgIHNlbmRUaW1lb3V0XygwKSwKKyAgICByZWN2VGltZW91dF8oMCksCisgICAga2VlcEFsaXZlXyhmYWxzZSksCisgICAgbGluZ2VyT25fKDEpLAorICAgIGxpbmdlclZhbF8oMCksCisgICAgbm9EZWxheV8oMSksCisgICAgbWF4UmVjdlJldHJpZXNfKDUpIHsKICAgY2FjaGVkUGVlckFkZHJfLmlwdjQuc2luX2ZhbWlseSA9IEFGX1VOU1BFQzsKIH0KIAotVFNvY2tldDo6VFNvY2tldCgpIDoKLSAgaG9zdF8oIiIpLAotICBwb3J0XygwKSwKLSAgcGF0aF8oIiIpLAotICBzb2NrZXRfKFRIUklGVF9JTlZBTElEX1NPQ0tFVCksCi0gIGNvbm5UaW1lb3V0XygwKSwKLSAgc2VuZFRpbWVvdXRfKDApLAotICByZWN2VGltZW91dF8oMCksCi0gIGtlZXBBbGl2ZV8oZmFsc2UpLAotICBsaW5nZXJPbl8oMSksCi0gIGxpbmdlclZhbF8oMCksCi0gIG5vRGVsYXlfKDEpLAotICBtYXhSZWN2UmV0cmllc18oNSkgeworVFNvY2tldDo6VFNvY2tldCgpCisgIDogcG9ydF8oMCksCisgICAgc29ja2V0XyhUSFJJRlRfSU5WQUxJRF9TT0NLRVQpLAorICAgIHBlZXJQb3J0XygwKSwKKyAgICBjb25uVGltZW91dF8oMCksCisgICAgc2VuZFRpbWVvdXRfKDApLAorICAgIHJlY3ZUaW1lb3V0XygwKSwKKyAgICBrZWVwQWxpdmVfKGZhbHNlKSwKKyAgICBsaW5nZXJPbl8oMSksCisgICAgbGluZ2VyVmFsXygwKSwKKyAgICBub0RlbGF5XygxKSwKKyAgICBtYXhSZWN2UmV0cmllc18oNSkgewogICBjYWNoZWRQZWVyQWRkcl8uaXB2NC5zaW5fZmFtaWx5ID0gQUZfVU5TUEVDOwogfQogCi1UU29ja2V0OjpUU29ja2V0KFRIUklGVF9TT0NLRVQgc29ja2V0KSA6Ci0gIGhvc3RfKCIiKSwKLSAgcG9ydF8oMCksCi0gIHBhdGhfKCIiKSwKLSAgc29ja2V0Xyhzb2NrZXQpLAotICBjb25uVGltZW91dF8oMCksCi0gIHNlbmRUaW1lb3V0XygwKSwKLSAgcmVjdlRpbWVvdXRfKDApLAotICBrZWVwQWxpdmVfKGZhbHNlKSwKLSAgbGluZ2VyT25fKDEpLAotICBsaW5nZXJWYWxfKDApLAotICBub0RlbGF5XygxKSwKLSAgbWF4UmVjdlJldHJpZXNfKDUpIHsKK1RTb2NrZXQ6OlRTb2NrZXQoVEhSSUZUX1NPQ0tFVCBzb2NrZXQpCisgIDogcG9ydF8oMCksCisgICAgc29ja2V0Xyhzb2NrZXQpLAorICAgIHBlZXJQb3J0XygwKSwKKyAgICBjb25uVGltZW91dF8oMCksCisgICAgc2VuZFRpbWVvdXRfKDApLAorICAgIHJlY3ZUaW1lb3V0XygwKSwKKyAgICBrZWVwQWxpdmVfKGZhbHNlKSwKKyAgICBsaW5nZXJPbl8oMSksCisgICAgbGluZ2VyVmFsXygwKSwKKyAgICBub0RlbGF5XygxKSwKKyAgICBtYXhSZWN2UmV0cmllc18oNSkgeworICBjYWNoZWRQZWVyQWRkcl8uaXB2NC5zaW5fZmFtaWx5ID0gQUZfVU5TUEVDOworI2lmZGVmIFNPX05PU0lHUElQRQorICB7CisgICAgaW50IG9uZSA9IDE7CisgICAgc2V0c29ja29wdChzb2NrZXRfLCBTT0xfU09DS0VULCBTT19OT1NJR1BJUEUsICZvbmUsIHNpemVvZihvbmUpKTsKKyAgfQorI2VuZGlmCit9CisKK1RTb2NrZXQ6OlRTb2NrZXQoVEhSSUZUX1NPQ0tFVCBzb2NrZXQsIHN0ZDo6c2hhcmVkX3B0cjxUSFJJRlRfU09DS0VUPiBpbnRlcnJ1cHRMaXN0ZW5lcikKKyAgOiBwb3J0XygwKSwKKyAgICBzb2NrZXRfKHNvY2tldCksCisgICAgcGVlclBvcnRfKDApLAorICAgIGludGVycnVwdExpc3RlbmVyXyhpbnRlcnJ1cHRMaXN0ZW5lciksCisgICAgY29ublRpbWVvdXRfKDApLAorICAgIHNlbmRUaW1lb3V0XygwKSwKKyAgICByZWN2VGltZW91dF8oMCksCisgICAga2VlcEFsaXZlXyhmYWxzZSksCisgICAgbGluZ2VyT25fKDEpLAorICAgIGxpbmdlclZhbF8oMCksCisgICAgbm9EZWxheV8oMSksCisgICAgbWF4UmVjdlJldHJpZXNfKDUpIHsKICAgY2FjaGVkUGVlckFkZHJfLmlwdjQuc2luX2ZhbWlseSA9IEFGX1VOU1BFQzsKICNpZmRlZiBTT19OT1NJR1BJUEUKICAgewpAQCAtMTQ4LDYgKzE3MCwyNiBAQAogICBjbG9zZSgpOwogfQogCitib29sIFRTb2NrZXQ6Omhhc1BlbmRpbmdEYXRhVG9SZWFkKCkgeworICBpZiAoIWlzT3BlbigpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaW50MzJfdCByZXRyaWVzID0gMDsKKyAgVEhSSUZUX0lPQ1RMX1NPQ0tFVF9OVU1fQllURVNfVFlQRSBudW1CeXRlc0F2YWlsYWJsZTsKK3RyeV9hZ2FpbjoKKyAgaW50IHIgPSBUSFJJRlRfSU9DVExfU09DS0VUKHNvY2tldF8sIEZJT05SRUFELCAmbnVtQnl0ZXNBdmFpbGFibGUpOworICBpZiAociA9PSAtMSkgeworICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgaWYgKGVycm5vX2NvcHkgPT0gVEhSSUZUX0VJTlRSICYmIChyZXRyaWVzKysgPCBtYXhSZWN2UmV0cmllc18pKSB7CisgICAgICBnb3RvIHRyeV9hZ2FpbjsKKyAgICB9CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNvY2tldDo6aGFzUGVuZGluZ0RhdGFUb1JlYWQoKSBUSFJJRlRfSU9DVExfU09DS0VUKCkgIiArIGdldFNvY2tldEluZm8oKSwgZXJybm9fY29weSk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLCAiVW5rbm93biIsIGVycm5vX2NvcHkpOworICB9CisgIHJldHVybiBudW1CeXRlc0F2YWlsYWJsZSA+IDA7Cit9CisKIGJvb2wgVFNvY2tldDo6aXNPcGVuKCkgewogICByZXR1cm4gKHNvY2tldF8gIT0gVEhSSUZUX0lOVkFMSURfU09DS0VUKTsKIH0KQEAgLTE1NiwzNCArMTk4LDY0IEBACiAgIGlmICghaXNPcGVuKCkpIHsKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KKyAgaWYgKGludGVycnVwdExpc3RlbmVyXykgeworICAgIGZvciAoaW50IHJldHJpZXMgPSAwOzspIHsKKyAgICAgIHN0cnVjdCBUSFJJRlRfUE9MTEZEIGZkc1syXTsKKyAgICAgIHN0ZDo6bWVtc2V0KGZkcywgMCwgc2l6ZW9mKGZkcykpOworICAgICAgZmRzWzBdLmZkID0gc29ja2V0XzsKKyAgICAgIGZkc1swXS5ldmVudHMgPSBUSFJJRlRfUE9MTElOOworICAgICAgZmRzWzFdLmZkID0gKihpbnRlcnJ1cHRMaXN0ZW5lcl8uZ2V0KCkpOworICAgICAgZmRzWzFdLmV2ZW50cyA9IFRIUklGVF9QT0xMSU47CisgICAgICBpbnQgcmV0ID0gVEhSSUZUX1BPTEwoZmRzLCAyLCAocmVjdlRpbWVvdXRfID09IDApID8gLTEgOiByZWN2VGltZW91dF8pOworICAgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIC8vIGVycm9yIGNhc2VzCisgICAgICAgIGlmIChlcnJub19jb3B5ID09IFRIUklGVF9FSU5UUiAmJiAocmV0cmllcysrIDwgbWF4UmVjdlJldHJpZXNfKSkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTb2NrZXQ6OnBlZWsoKSBUSFJJRlRfUE9MTCgpICIsIGVycm5vX2NvcHkpOworICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sICJVbmtub3duIiwgZXJybm9fY29weSk7CisgICAgICB9IGVsc2UgaWYgKHJldCA+IDApIHsKKyAgICAgICAgLy8gQ2hlY2sgdGhlIGludGVycnVwdExpc3RlbmVyCisgICAgICAgIGlmIChmZHNbMV0ucmV2ZW50cyAmIFRIUklGVF9QT0xMSU4pIHsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgLy8gVGhlcmUgbXVzdCBiZSBkYXRhIG9yIGEgZGlzY29ubmVjdGlvbiwgZmFsbCB0aHJvdWdoIHRvIHRoZSBQRUVLCisgICAgICAgIGJyZWFrOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gdGltZW91dAorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gQ2hlY2sgdG8gc2VlIGlmIGRhdGEgaXMgYXZhaWxhYmxlIG9yIGlmIHRoZSByZW1vdGUgc2lkZSBjbG9zZWQKICAgdWludDhfdCBidWY7CiAgIGludCByID0gc3RhdGljX2Nhc3Q8aW50PihyZWN2KHNvY2tldF8sIGNhc3Rfc29ja29wdCgmYnVmKSwgMSwgTVNHX1BFRUspKTsKICAgaWYgKHIgPT0gLTEpIHsKICAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOwotICAgICNpZiBkZWZpbmVkIF9fRnJlZUJTRF9fIHx8IGRlZmluZWQgX19NQUNIX18KKyNpZiBkZWZpbmVkIF9fRnJlZUJTRF9fIHx8IGRlZmluZWQgX19NQUNIX18KICAgICAvKiBzaGlnaW46CiAgICAgICogZnJlZWJzZCByZXR1cm5zIC0xIGFuZCBUSFJJRlRfRUNPTk5SRVNFVCBpZiBzb2NrZXQgd2FzIGNsb3NlZCBieQogICAgICAqIHRoZSBvdGhlciBzaWRlCiAgICAgICovCi0gICAgaWYgKGVycm5vX2NvcHkgPT0gVEhSSUZUX0VDT05OUkVTRVQpCi0gICAgewotICAgICAgY2xvc2UoKTsKKyAgICBpZiAoZXJybm9fY29weSA9PSBUSFJJRlRfRUNPTk5SRVNFVCkgewogICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICAjZW5kaWYKKyNlbmRpZgogICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTb2NrZXQ6OnBlZWsoKSByZWN2KCkgIiArIGdldFNvY2tldEluZm8oKSwgZXJybm9fY29weSk7CiAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLCAicmVjdigpIiwgZXJybm9fY29weSk7CiAgIH0KICAgcmV0dXJuIChyID4gMCk7CiB9CiAKLXZvaWQgVFNvY2tldDo6b3BlbkNvbm5lY3Rpb24oc3RydWN0IGFkZHJpbmZvICpyZXMpIHsKK3ZvaWQgVFNvY2tldDo6b3BlbkNvbm5lY3Rpb24oc3RydWN0IGFkZHJpbmZvKiByZXMpIHsKIAogICBpZiAoaXNPcGVuKCkpIHsKICAgICByZXR1cm47CiAgIH0KIAotICBpZiAoISBwYXRoXy5lbXB0eSgpKSB7CisgIGlmICghcGF0aF8uZW1wdHkoKSkgewogICAgIHNvY2tldF8gPSBzb2NrZXQoUEZfVU5JWCwgU09DS19TVFJFQU0sIElQUFJPVE9fSVApOwogICB9IGVsc2UgewogICAgIHNvY2tldF8gPSBzb2NrZXQocmVzLT5haV9mYW1pbHksIHJlcy0+YWlfc29ja3R5cGUsIHJlcy0+YWlfcHJvdG9jb2wpOwpAQCAtMjA1LDcgKzI3Nyw3IEBACiAgICAgc2V0UmVjdlRpbWVvdXQocmVjdlRpbWVvdXRfKTsKICAgfQogCi0gIGlmKGtlZXBBbGl2ZV8pIHsKKyAgaWYgKGtlZXBBbGl2ZV8pIHsKICAgICBzZXRLZWVwQWxpdmUoa2VlcEFsaXZlXyk7CiAgIH0KIApAQCAtMjIyLDcgKzI5NCw3IEBACiAgIH0KICNlbmRpZgogCi0gIC8vIFVzZXMgYSBsb3cgbWluIFJUTyBpZiBhc2tlZCB0by4KKy8vIFVzZXMgYSBsb3cgbWluIFJUTyBpZiBhc2tlZCB0by4KICNpZmRlZiBUQ1BfTE9XX01JTl9SVE8KICAgaWYgKGdldFVzZUxvd01pblJ0bygpKSB7CiAgICAgaW50IG9uZSA9IDE7CkBAIC0yMzAsNyArMzAyLDYgQEAKICAgfQogI2VuZGlmCiAKLQogICAvLyBTZXQgdGhlIHNvY2tldCB0byBiZSBub24gYmxvY2tpbmcgZm9yIGNvbm5lY3QgaWYgYSB0aW1lb3V0IGV4aXN0cwogICBpbnQgZmxhZ3MgPSBUSFJJRlRfRkNOVEwoc29ja2V0XywgVEhSSUZUX0ZfR0VURkwsIDApOwogICBpZiAoY29ublRpbWVvdXRfID4gMCkgewpAQCAtMjQ5LDcgKzMyMCw3IEBACiAKICAgLy8gQ29ubmVjdCB0aGUgc29ja2V0CiAgIGludCByZXQ7Ci0gIGlmICghIHBhdGhfLmVtcHR5KCkpIHsKKyAgaWYgKCFwYXRoXy5lbXB0eSgpKSB7CiAKICNpZm5kZWYgX1dJTjMyCiAgICAgc2l6ZV90IGxlbiA9IHBhdGhfLnNpemUoKSArIDE7CkBAIC0yNjIsMTEgKzMzMywyNSBAQAogICAgIHN0cnVjdCBzb2NrYWRkcl91biBhZGRyZXNzOwogICAgIGFkZHJlc3Muc3VuX2ZhbWlseSA9IEFGX1VOSVg7CiAgICAgbWVtY3B5KGFkZHJlc3Muc3VuX3BhdGgsIHBhdGhfLmNfc3RyKCksIGxlbik7CisKICAgICBzb2NrbGVuX3Qgc3RydWN0bGVuID0gc3RhdGljX2Nhc3Q8c29ja2xlbl90PihzaXplb2YoYWRkcmVzcykpOwotICAgIHJldCA9IGNvbm5lY3Qoc29ja2V0XywgKHN0cnVjdCBzb2NrYWRkciAqKSAmYWRkcmVzcywgc3RydWN0bGVuKTsKKworICAgIGlmICghYWRkcmVzcy5zdW5fcGF0aFswXSkgeyAvLyBhYnN0cmFjdCBuYW1lc3BhY2Ugc29ja2V0CisjaWZkZWYgX19saW51eF9fCisgICAgICAvLyBzdW5fcGF0aCBpcyBub3QgbnVsbC10ZXJtaW5hdGVkIGluIHRoaXMgY2FzZSBhbmQgc3RydWN0bGVuIGRldGVybWluZXMgaXRzIGxlbmd0aAorICAgICAgc3RydWN0bGVuIC09IHNpemVvZihhZGRyZXNzLnN1bl9wYXRoKSAtIGxlbjsKICNlbHNlCi0gICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU29ja2V0OjpvcGVuKCkgVW5peCBEb21haW4gc29ja2V0IHBhdGggbm90IHN1cHBvcnRlZCBvbiB3aW5kb3dzIiwgLTk5KTsKLSAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICIgVW5peCBEb21haW4gc29ja2V0IHBhdGggbm90IHN1cHBvcnRlZCIpOworICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNvY2tldDo6b3BlbigpIEFic3RyYWN0IE5hbWVzcGFjZSBEb21haW4gc29ja2V0cyBvbmx5IHN1cHBvcnRlZCBvbiBsaW51eDogIiwgLTk5KTsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgQWJzdHJhY3QgTmFtZXNwYWNlIERvbWFpbiBzb2NrZXQgcGF0aCBub3Qgc3VwcG9ydGVkIik7CisjZW5kaWYKKyAgICB9CisKKyAgICByZXQgPSBjb25uZWN0KHNvY2tldF8sIChzdHJ1Y3Qgc29ja2FkZHIqKSZhZGRyZXNzLCBzdHJ1Y3RsZW4pOworI2Vsc2UKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU29ja2V0OjpvcGVuKCkgVW5peCBEb21haW4gc29ja2V0IHBhdGggbm90IHN1cHBvcnRlZCBvbiB3aW5kb3dzIiwgLTk5KTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBVbml4IERvbWFpbiBzb2NrZXQgcGF0aCBub3Qgc3VwcG9ydGVkIik7CiAjZW5kaWYKIAogICB9IGVsc2UgewpAQCAtMjc4LDE1ICszNjMsMTUgQEAKICAgICBnb3RvIGRvbmU7CiAgIH0KIAotICBpZiAoKFRIUklGVF9HRVRfU09DS0VUX0VSUk9SICE9IFRIUklGVF9FSU5QUk9HUkVTUykgJiYgKFRIUklGVF9HRVRfU09DS0VUX0VSUk9SICE9IFRIUklGVF9FV09VTERCTE9DSykpIHsKKyAgaWYgKChUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUiAhPSBUSFJJRlRfRUlOUFJPR1JFU1MpCisgICAgICAmJiAoVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IgIT0gVEhSSUZUX0VXT1VMREJMT0NLKSkgewogICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CiAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNvY2tldDo6b3BlbigpIGNvbm5lY3QoKSAiICsgZ2V0U29ja2V0SW5mbygpLCBlcnJub19jb3B5KTsKICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiY29ubmVjdCgpIGZhaWxlZCIsIGVycm5vX2NvcHkpOwogICB9CiAKLQogICBzdHJ1Y3QgVEhSSUZUX1BPTExGRCBmZHNbMV07Ci0gIHN0ZDo6bWVtc2V0KGZkcywgMCAsIHNpemVvZihmZHMpKTsKKyAgc3RkOjptZW1zZXQoZmRzLCAwLCBzaXplb2YoZmRzKSk7CiAgIGZkc1swXS5mZCA9IHNvY2tldF87CiAgIGZkc1swXS5ldmVudHMgPSBUSFJJRlRfUE9MTE9VVDsKICAgcmV0ID0gVEhSSUZUX1BPTEwoZmRzLCAxLCBjb25uVGltZW91dF8pOwpAQCAtMzA2LDcgKzM5MSw4IEBACiAgICAgaWYgKHZhbCA9PSAwKSB7CiAgICAgICBnb3RvIGRvbmU7CiAgICAgfQotICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTb2NrZXQ6Om9wZW4oKSBlcnJvciBvbiBzb2NrZXQgKGFmdGVyIFRIUklGVF9QT0xMKSAiICsgZ2V0U29ja2V0SW5mbygpLCB2YWwpOworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTb2NrZXQ6Om9wZW4oKSBlcnJvciBvbiBzb2NrZXQgKGFmdGVyIFRIUklGVF9QT0xMKSAiICsgZ2V0U29ja2V0SW5mbygpLAorICAgICAgICAgICAgICAgICAgICAgICAgdmFsKTsKICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAic29ja2V0IG9wZW4oKSBlcnJvciIsIHZhbCk7CiAgIH0gZWxzZSBpZiAocmV0ID09IDApIHsKICAgICAvLyBzb2NrZXQgdGltZWQgb3V0CkBAIC0zMjAsOSArNDA2LDEzIEBACiAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIlRIUklGVF9QT0xMKCkgZmFpbGVkIiwgZXJybm9fY29weSk7CiAgIH0KIAotIGRvbmU6Citkb25lOgogICAvLyBTZXQgc29ja2V0IGJhY2sgdG8gbm9ybWFsIG1vZGUgKGJsb2NraW5nKQotICBUSFJJRlRfRkNOVEwoc29ja2V0XywgVEhSSUZUX0ZfU0VURkwsIGZsYWdzKTsKKyAgaWYgKC0xID09IFRIUklGVF9GQ05UTChzb2NrZXRfLCBUSFJJRlRfRl9TRVRGTCwgZmxhZ3MpKSB7CisgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU29ja2V0OjpvcGVuKCkgVEhSSUZUX0ZDTlRMICIgKyBnZXRTb2NrZXRJbmZvKCksIGVycm5vX2NvcHkpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJUSFJJRlRfRkNOVEwoKSBmYWlsZWQiLCBlcnJub19jb3B5KTsKKyAgfQogCiAgIGlmIChwYXRoXy5lbXB0eSgpKSB7CiAgICAgc2V0Q2FjaGVkQWRkcmVzcyhyZXMtPmFpX2FkZHIsIHN0YXRpY19jYXN0PHNvY2tsZW5fdD4ocmVzLT5haV9hZGRybGVuKSk7CkBAIC0zMzMsMjQgKzQyMywyNCBAQAogICBpZiAoaXNPcGVuKCkpIHsKICAgICByZXR1cm47CiAgIH0KLSAgaWYgKCEgcGF0aF8uZW1wdHkoKSkgeworICBpZiAoIXBhdGhfLmVtcHR5KCkpIHsKICAgICB1bml4X29wZW4oKTsKICAgfSBlbHNlIHsKICAgICBsb2NhbF9vcGVuKCk7CiAgIH0KIH0KIAotdm9pZCBUU29ja2V0Ojp1bml4X29wZW4oKXsKLSAgaWYgKCEgcGF0aF8uZW1wdHkoKSkgewordm9pZCBUU29ja2V0Ojp1bml4X29wZW4oKSB7CisgIGlmICghcGF0aF8uZW1wdHkoKSkgewogICAgIC8vIFVuaXggRG9tYWluIFNPY2tldCBkb2VzIG5vdCBuZWVkIGFkZHJpbmZvIHN0cnVjdCwgc28gd2UgcGFzcyBOVUxMCiAgICAgb3BlbkNvbm5lY3Rpb24oTlVMTCk7CiAgIH0KIH0KIAotdm9pZCBUU29ja2V0Ojpsb2NhbF9vcGVuKCl7Cit2b2lkIFRTb2NrZXQ6OmxvY2FsX29wZW4oKSB7CiAKICNpZmRlZiBfV0lOMzIKLSAgICBUV2luc29ja1NpbmdsZXRvbjo6Y3JlYXRlKCk7CisgIFRXaW5zb2NrU2luZ2xldG9uOjpjcmVhdGUoKTsKICNlbmRpZiAvLyBfV0lOMzIKIAogICBpZiAoaXNPcGVuKCkpIHsKQEAgLTM1OSw3ICs0NDksNyBAQAogCiAgIC8vIFZhbGlkYXRlIHBvcnQgbnVtYmVyCiAgIGlmIChwb3J0XyA8IDAgfHwgcG9ydF8gPiAweEZGRkYpIHsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiU3BlY2lmaWVkIHBvcnQgaXMgaW52YWxpZCIpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6QkFEX0FSR1MsICJTcGVjaWZpZWQgcG9ydCBpcyBpbnZhbGlkIik7CiAgIH0KIAogICBzdHJ1Y3QgYWRkcmluZm8gaGludHMsICpyZXMsICpyZXMwOwpAQCAtMzgzLDEwICs0NzMsMTIgQEAKICNlbmRpZgogCiAgIGlmIChlcnJvcikgewotICAgIHN0cmluZyBlcnJTdHIgPSAiVFNvY2tldDo6b3BlbigpIGdldGFkZHJpbmZvKCkgIiArIGdldFNvY2tldEluZm8oKSArIHN0cmluZyhUSFJJRlRfR0FJX1NUUkVSUk9SKGVycm9yKSk7CisgICAgc3RyaW5nIGVyclN0ciA9ICJUU29ja2V0OjpvcGVuKCkgZ2V0YWRkcmluZm8oKSAiICsgZ2V0U29ja2V0SW5mbygpCisgICAgICAgICAgICAgICAgICAgICsgc3RyaW5nKFRIUklGVF9HQUlfU1RSRVJST1IoZXJyb3IpKTsKICAgICBHbG9iYWxPdXRwdXQoZXJyU3RyLmNfc3RyKCkpOwogICAgIGNsb3NlKCk7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIkNvdWxkIG5vdCByZXNvbHZlIGhvc3QgZm9yIGNsaWVudCBzb2NrZXQuIik7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgcmVzb2x2ZSBob3N0IGZvciBjbGllbnQgc29ja2V0LiIpOwogICB9CiAKICAgLy8gQ3ljbGUgdGhyb3VnaCBhbGwgdGhlIHJldHVybmVkIGFkZHJlc3NlcyB1bnRpbCBvbmUKQEAgLTQ0MSwxMCArNTMzLDEwIEBACiAgICAgLy8gaWYgYSByZWFkVGltZW91dCBpcyBzcGVjaWZpZWQgYWxvbmcgd2l0aCBhIG1heCBudW1iZXIgb2YgcmVjdiByZXRyaWVzLCB0aGVuCiAgICAgLy8gdGhlIHRocmVzaG9sZCB3aWxsIGVuc3VyZSB0aGF0IHRoZSByZWFkIHRpbWVvdXQgaXMgbm90IGV4Y2VlZGVkIGV2ZW4gaW4gdGhlCiAgICAgLy8gY2FzZSBvZiByZXNvdXJjZSBlcnJvcnMKLSAgICBlYWdhaW5UaHJlc2hvbGRNaWNyb3MgPSAocmVjdlRpbWVvdXRfKjEwMDApLyAoKG1heFJlY3ZSZXRyaWVzXz4wKSA/IG1heFJlY3ZSZXRyaWVzXyA6IDIpOworICAgIGVhZ2FpblRocmVzaG9sZE1pY3JvcyA9IChyZWN2VGltZW91dF8gKiAxMDAwKSAvICgobWF4UmVjdlJldHJpZXNfID4gMCkgPyBtYXhSZWN2UmV0cmllc18gOiAyKTsKICAgfQogCi0gdHJ5X2FnYWluOgordHJ5X2FnYWluOgogICAvLyBSZWFkIGZyb20gdGhlIHNvY2tldAogICBzdHJ1Y3QgdGltZXZhbCBiZWdpbjsKICAgaWYgKHJlY3ZUaW1lb3V0XyA+IDApIHsKQEAgLTQ1NCw5ICs1NDYsNDEgQEAKICAgICAvLyBhbiBUSFJJRlRfRUFHQUlOIGlzIGR1ZSB0byBhIHRpbWVvdXQgb3IgYW4gb3V0LW9mLXJlc291cmNlIGNvbmRpdGlvbi4KICAgICBiZWdpbi50dl9zZWMgPSBiZWdpbi50dl91c2VjID0gMDsKICAgfQotICBpbnQgZ290ID0gc3RhdGljX2Nhc3Q8aW50PihyZWN2KHNvY2tldF8sIGNhc3Rfc29ja29wdChidWYpLCBsZW4sIDApKTsKLSAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsgLy9USFJJRlRfR0VUVElNRU9GREFZIGNhbiBjaGFuZ2UgVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IKLSAgKytnX3NvY2tldF9zeXNjYWxsczsKKworICBpbnQgZ290ID0gMDsKKworICBpZiAoaW50ZXJydXB0TGlzdGVuZXJfKSB7CisgICAgc3RydWN0IFRIUklGVF9QT0xMRkQgZmRzWzJdOworICAgIHN0ZDo6bWVtc2V0KGZkcywgMCwgc2l6ZW9mKGZkcykpOworICAgIGZkc1swXS5mZCA9IHNvY2tldF87CisgICAgZmRzWzBdLmV2ZW50cyA9IFRIUklGVF9QT0xMSU47CisgICAgZmRzWzFdLmZkID0gKihpbnRlcnJ1cHRMaXN0ZW5lcl8uZ2V0KCkpOworICAgIGZkc1sxXS5ldmVudHMgPSBUSFJJRlRfUE9MTElOOworCisgICAgaW50IHJldCA9IFRIUklGVF9QT0xMKGZkcywgMiwgKHJlY3ZUaW1lb3V0XyA9PSAwKSA/IC0xIDogcmVjdlRpbWVvdXRfKTsKKyAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAvLyBlcnJvciBjYXNlcworICAgICAgaWYgKGVycm5vX2NvcHkgPT0gVEhSSUZUX0VJTlRSICYmIChyZXRyaWVzKysgPCBtYXhSZWN2UmV0cmllc18pKSB7CisgICAgICAgIGdvdG8gdHJ5X2FnYWluOworICAgICAgfQorICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNvY2tldDo6cmVhZCgpIFRIUklGVF9QT0xMKCkgIiwgZXJybm9fY29weSk7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sICJVbmtub3duIiwgZXJybm9fY29weSk7CisgICAgfSBlbHNlIGlmIChyZXQgPiAwKSB7CisgICAgICAvLyBDaGVjayB0aGUgaW50ZXJydXB0TGlzdGVuZXIKKyAgICAgIGlmIChmZHNbMV0ucmV2ZW50cyAmIFRIUklGVF9QT0xMSU4pIHsKKyAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpJTlRFUlJVUFRFRCwgIkludGVycnVwdGVkIik7CisgICAgICB9CisgICAgfSBlbHNlIC8qIHJldCA9PSAwICovIHsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VElNRURfT1VULCAiVEhSSUZUX0VBR0FJTiAodGltZWQgb3V0KSIpOworICAgIH0KKworICAgIC8vIGZhbGxpbmcgdGhyb3VnaCBtZWFucyB0aGVyZSBpcyBzb21ldGhpbmcgdG8gcmVjdiBhbmQgaXQgY2Fubm90IGJsb2NrCisgIH0KKworICBnb3QgPSBzdGF0aWNfY2FzdDxpbnQ+KHJlY3Yoc29ja2V0XywgY2FzdF9zb2Nrb3B0KGJ1ZiksIGxlbiwgMCkpOworICAvLyBUSFJJRlRfR0VUVElNRU9GREFZIGNhbiBjaGFuZ2UgVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IKKyAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKIAogICAvLyBDaGVjayBmb3IgZXJyb3Igb24gcmVhZAogICBpZiAoZ290IDwgMCkgewpAQCAtNDY0LDE0ICs1ODgsMTMgQEAKICAgICAgIC8vIGlmIG5vIHRpbWVvdXQgd2UgY2FuIGFzc3VtZSB0aGF0IHJlc291cmNlIGV4aGF1c3Rpb24gaGFzIG9jY3VycmVkLgogICAgICAgaWYgKHJlY3ZUaW1lb3V0XyA9PSAwKSB7CiAgICAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VElNRURfT1VULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRIUklGVF9FQUdBSU4gKHVuYXZhaWxhYmxlIHJlc291cmNlcykiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVEhSSUZUX0VBR0FJTiAodW5hdmFpbGFibGUgcmVzb3VyY2VzKSIpOwogICAgICAgfQogICAgICAgLy8gY2hlY2sgaWYgdGhpcyBpcyB0aGUgbGFjayBvZiByZXNvdXJjZXMgb3IgdGltZW91dCBjYXNlCiAgICAgICBzdHJ1Y3QgdGltZXZhbCBlbmQ7CiAgICAgICBUSFJJRlRfR0VUVElNRU9GREFZKCZlbmQsIE5VTEwpOwotICAgICAgdWludDMyX3QgcmVhZEVsYXBzZWRNaWNyb3MgPSAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KAotICAgICAgICAgKChlbmQudHZfc2VjIC0gYmVnaW4udHZfc2VjKSAqIDEwMDAgKiAxMDAwKQotICAgICAgICAgKyAoKCh1aW50NjRfdCkoZW5kLnR2X3VzZWMgLSBiZWdpbi50dl91c2VjKSkpKTsKKyAgICAgIHVpbnQzMl90IHJlYWRFbGFwc2VkTWljcm9zID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KCgoZW5kLnR2X3NlYyAtIGJlZ2luLnR2X3NlYykgKiAxMDAwICogMTAwMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKGVuZC50dl91c2VjIC0gYmVnaW4udHZfdXNlYykpOwogCiAgICAgICBpZiAoIWVhZ2FpblRocmVzaG9sZE1pY3JvcyB8fCAocmVhZEVsYXBzZWRNaWNyb3MgPCBlYWdhaW5UaHJlc2hvbGRNaWNyb3MpKSB7CiAgICAgICAgIGlmIChyZXRyaWVzKysgPCBtYXhSZWN2UmV0cmllc18pIHsKQEAgLTQ4Myw4ICs2MDYsNyBAQAogICAgICAgICB9CiAgICAgICB9IGVsc2UgewogICAgICAgICAvLyBpbmZlciB0aGF0IHRpbWVvdXQgaGFzIGJlZW4gaGl0Ci0gICAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VElNRURfT1VULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUSFJJRlRfRUFHQUlOICh0aW1lZCBvdXQpIik7CisgICAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VElNRURfT1VULCAiVEhSSUZUX0VBR0FJTiAodGltZWQgb3V0KSIpOwogICAgICAgfQogICAgIH0KIApAQCAtNDkzLDI5ICs2MTUsOSBAQAogICAgICAgZ290byB0cnlfYWdhaW47CiAgICAgfQogCi0gICAgI2lmIGRlZmluZWQgX19GcmVlQlNEX18gfHwgZGVmaW5lZCBfX01BQ0hfXwogICAgIGlmIChlcnJub19jb3B5ID09IFRIUklGVF9FQ09OTlJFU0VUKSB7Ci0gICAgICAvKiBzaGlnaW46IGZyZWVic2QgZG9lc24ndCBmb2xsb3cgUE9TSVggc2VtYW50aWMgb2YgcmVjdiBhbmQgZmFpbHMgd2l0aAotICAgICAgICogVEhSSUZUX0VDT05OUkVTRVQgaWYgcGVlciBwZXJmb3JtZWQgc2h1dGRvd24KLSAgICAgICAqIGVkaGFsbDogZWxpbWluYXRlZCBjbG9zZSgpIHNpbmNlIHdlIGRvIHRoYXQgaW4gdGhlIGRlc3RydWN0b3IuCi0gICAgICAgKi8KICAgICAgIHJldHVybiAwOwogICAgIH0KLSAgICAjZW5kaWYKLQotI2lmZGVmIF9XSU4zMgotICAgIGlmKGVycm5vX2NvcHkgPT0gV1NBRUNPTk5SRVNFVCkgewotICAgICAgcmV0dXJuIDA7IC8vIEVPRgotICAgIH0KLSNlbmRpZgotCi0gICAgLy8gTm93IGl0J3Mgbm90IGEgdHJ5IGFnYWluIGNhc2UsIGJ1dCBhIHJlYWwgcHJvYmJsZXoKLSAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU29ja2V0OjpyZWFkKCkgcmVjdigpICIgKyBnZXRTb2NrZXRJbmZvKCksIGVycm5vX2NvcHkpOwotCi0gICAgLy8gSWYgd2UgZGlzY29ubmVjdCB3aXRoIG5vIGxpbmdlciB0aW1lCi0gICAgaWYgKGVycm5vX2NvcHkgPT0gVEhSSUZUX0VDT05OUkVTRVQpIHsKLSAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJUSFJJRlRfRUNPTk5SRVNFVCIpOwotICAgIH0KIAogICAgIC8vIFRoaXMgaXNoIGlzbid0IG9wZW4KICAgICBpZiAoZXJybm9fY29weSA9PSBUSFJJRlRfRU5PVENPTk4pIHsKQEAgLTUyNywxOCArNjI5LDEzIEBACiAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlRJTUVEX09VVCwgIlRIUklGVF9FVElNRURPVVQiKTsKICAgICB9CiAKKyAgICAvLyBOb3cgaXQncyBub3QgYSB0cnkgYWdhaW4gY2FzZSwgYnV0IGEgcmVhbCBwcm9iYmxlegorICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTb2NrZXQ6OnJlYWQoKSByZWN2KCkgIiArIGdldFNvY2tldEluZm8oKSwgZXJybm9fY29weSk7CisKICAgICAvLyBTb21lIG90aGVyIGVycm9yLCB3aGF0ZXZ6CiAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLCAiVW5rbm93biIsIGVycm5vX2NvcHkpOwogICB9CiAKLSAgLy8gVGhlIHJlbW90ZSBob3N0IGhhcyBjbG9zZWQgdGhlIHNvY2tldAotICBpZiAoZ290ID09IDApIHsKLSAgICAvLyBlZGhhbGw6IHdlIHVzZWQgdG8gY2FsbCBjbG9zZSgpIGhlcmUsIGJ1dCBvdXIgY2FsbGVyIG1heSB3YW50IHRvIGRlYWwKLSAgICAvLyB3aXRoIHRoZSBzb2NrZXQgZmQgYW5kIHdlJ2xsIGNsb3NlKCkgaW4gb3VyIGRlc3RydWN0b3IgaW4gYW55IGNhc2UuCi0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICAvLyBQYWNrIGRhdGEgaW50byBzdHJpbmcKICAgcmV0dXJuIGdvdDsKIH0KIApAQCAtNTUwLDggKzY0Nyw3IEBACiAgICAgaWYgKGIgPT0gMCkgewogICAgICAgLy8gVGhpcyBzaG91bGQgb25seSBoYXBwZW4gaWYgdGhlIHRpbWVvdXQgc2V0IHdpdGggU09fU05EVElNRU8gZXhwaXJlZC4KICAgICAgIC8vIFJhaXNlIGFuIGV4Y2VwdGlvbi4KLSAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VElNRURfT1VULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2VuZCB0aW1lb3V0IGV4cGlyZWQiKTsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VElNRURfT1VULCAic2VuZCB0aW1lb3V0IGV4cGlyZWQiKTsKICAgICB9CiAgICAgc2VudCArPSBiOwogICB9CkBAIC01NzIsNyArNjY4LDYgQEAKICNlbmRpZiAvLyBpZmRlZiBNU0dfTk9TSUdOQUwKIAogICBpbnQgYiA9IHN0YXRpY19jYXN0PGludD4oc2VuZChzb2NrZXRfLCBjb25zdF9jYXN0X3NvY2tvcHQoYnVmICsgc2VudCksIGxlbiAtIHNlbnQsIGZsYWdzKSk7Ci0gICsrZ19zb2NrZXRfc3lzY2FsbHM7CiAKICAgaWYgKGIgPCAwKSB7CiAgICAgaWYgKFRIUklGVF9HRVRfU09DS0VUX0VSUk9SID09IFRIUklGVF9FV09VTERCTE9DSyB8fCBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUiA9PSBUSFJJRlRfRUFHQUlOKSB7CkBAIC01ODIsOCArNjc3LDggQEAKICAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOwogICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTb2NrZXQ6OndyaXRlX3BhcnRpYWwoKSBzZW5kKCkgIiArIGdldFNvY2tldEluZm8oKSwgZXJybm9fY29weSk7CiAKLSAgICBpZiAoZXJybm9fY29weSA9PSBUSFJJRlRfRVBJUEUgfHwgZXJybm9fY29weSA9PSBUSFJJRlRfRUNPTk5SRVNFVCB8fCBlcnJub19jb3B5ID09IFRIUklGVF9FTk9UQ09OTikgewotICAgICAgY2xvc2UoKTsKKyAgICBpZiAoZXJybm9fY29weSA9PSBUSFJJRlRfRVBJUEUgfHwgZXJybm9fY29weSA9PSBUSFJJRlRfRUNPTk5SRVNFVAorICAgICAgICB8fCBlcnJub19jb3B5ID09IFRIUklGVF9FTk9UQ09OTikgewogICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIndyaXRlKCkgc2VuZCgpIiwgZXJybm9fY29weSk7CiAgICAgfQogCkBAIC02MjMsMTIgKzcxOCwxMyBAQAogI2lmbmRlZiBfV0lOMzIKICAgc3RydWN0IGxpbmdlciBsID0geyhsaW5nZXJPbl8gPyAxIDogMCksIGxpbmdlclZhbF99OwogI2Vsc2UKLSAgc3RydWN0IGxpbmdlciBsID0geyhsaW5nZXJPbl8gPyAxIDogMCksIHN0YXRpY19jYXN0PHVfc2hvcnQ+KGxpbmdlclZhbF8pfTsKKyAgc3RydWN0IGxpbmdlciBsID0ge3N0YXRpY19jYXN0PHVfc2hvcnQ+KGxpbmdlck9uXyA/IDEgOiAwKSwgc3RhdGljX2Nhc3Q8dV9zaG9ydD4obGluZ2VyVmFsXyl9OwogI2VuZGlmCiAKICAgaW50IHJldCA9IHNldHNvY2tvcHQoc29ja2V0XywgU09MX1NPQ0tFVCwgU09fTElOR0VSLCBjYXN0X3NvY2tvcHQoJmwpLCBzaXplb2YobCkpOwogICBpZiAocmV0ID09IC0xKSB7Ci0gICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsgIC8vIENvcHkgVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IgYmVjYXVzZSB3ZSdyZSBhbGxvY2F0aW5nIG1lbW9yeS4KKyAgICBpbnQgZXJybm9fY29weQorICAgICAgICA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOyAvLyBDb3B5IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SIGJlY2F1c2Ugd2UncmUgYWxsb2NhdGluZyBtZW1vcnkuCiAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNvY2tldDo6c2V0TGluZ2VyKCkgc2V0c29ja29wdCgpICIgKyBnZXRTb2NrZXRJbmZvKCksIGVycm5vX2NvcHkpOwogICB9CiB9CkBAIC02NDMsNyArNzM5LDggQEAKICAgaW50IHYgPSBub0RlbGF5XyA/IDEgOiAwOwogICBpbnQgcmV0ID0gc2V0c29ja29wdChzb2NrZXRfLCBJUFBST1RPX1RDUCwgVENQX05PREVMQVksIGNhc3Rfc29ja29wdCgmdiksIHNpemVvZih2KSk7CiAgIGlmIChyZXQgPT0gLTEpIHsKLSAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOyAgLy8gQ29weSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUiBiZWNhdXNlIHdlJ3JlIGFsbG9jYXRpbmcgbWVtb3J5LgorICAgIGludCBlcnJub19jb3B5CisgICAgICAgID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7IC8vIENvcHkgVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IgYmVjYXVzZSB3ZSdyZSBhbGxvY2F0aW5nIG1lbW9yeS4KICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU29ja2V0OjpzZXROb0RlbGF5KCkgc2V0c29ja29wdCgpICIgKyBnZXRTb2NrZXRJbmZvKCksIGVycm5vX2NvcHkpOwogICB9CiB9CkBAIC02NTIsOCArNzQ5LDcgQEAKICAgY29ublRpbWVvdXRfID0gbXM7CiB9CiAKLXZvaWQgc2V0R2VuZXJpY1RpbWVvdXQoVEhSSUZUX1NPQ0tFVCBzLCBpbnQgdGltZW91dF9tcywgaW50IG9wdG5hbWUpCi17Cit2b2lkIHNldEdlbmVyaWNUaW1lb3V0KFRIUklGVF9TT0NLRVQgcywgaW50IHRpbWVvdXRfbXMsIGludCBvcHRuYW1lKSB7CiAgIGlmICh0aW1lb3V0X21zIDwgMCkgewogICAgIGNoYXIgZXJyQnVmWzUxMl07CiAgICAgc3ByaW50ZihlcnJCdWYsICJUU29ja2V0OjpzZXRHZW5lcmljVGltZW91dCB3aXRoIG5lZ2F0aXZlIGlucHV0OiAlZFxuIiwgdGltZW91dF9tcyk7CkBAIC02NjUsMTcgKzc2MSwxNiBAQAogICAgIHJldHVybjsKICAgfQogCi0gICNpZmRlZiBfV0lOMzIKKyNpZmRlZiBfV0lOMzIKICAgRFdPUkQgcGxhdGZvcm1fdGltZSA9IHN0YXRpY19jYXN0PERXT1JEPih0aW1lb3V0X21zKTsKLSAgI2Vsc2UKLSAgc3RydWN0IHRpbWV2YWwgcGxhdGZvcm1fdGltZSA9IHsKLSAgICAoaW50KSh0aW1lb3V0X21zLzEwMDApLAotICAgIChpbnQpKCh0aW1lb3V0X21zJTEwMDApKjEwMDApfTsKLSAgI2VuZGlmCisjZWxzZQorICBzdHJ1Y3QgdGltZXZhbCBwbGF0Zm9ybV90aW1lID0geyhpbnQpKHRpbWVvdXRfbXMgLyAxMDAwKSwgKGludCkoKHRpbWVvdXRfbXMgJSAxMDAwKSAqIDEwMDApfTsKKyNlbmRpZgogCiAgIGludCByZXQgPSBzZXRzb2Nrb3B0KHMsIFNPTF9TT0NLRVQsIG9wdG5hbWUsIGNhc3Rfc29ja29wdCgmcGxhdGZvcm1fdGltZSksIHNpemVvZihwbGF0Zm9ybV90aW1lKSk7CiAgIGlmIChyZXQgPT0gLTEpIHsKLSAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOyAgLy8gQ29weSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUiBiZWNhdXNlIHdlJ3JlIGFsbG9jYXRpbmcgbWVtb3J5LgorICAgIGludCBlcnJub19jb3B5CisgICAgICAgID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7IC8vIENvcHkgVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IgYmVjYXVzZSB3ZSdyZSBhbGxvY2F0aW5nIG1lbW9yeS4KICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU29ja2V0OjpzZXRHZW5lcmljVGltZW91dCgpIHNldHNvY2tvcHQoKSAiLCBlcnJub19jb3B5KTsKICAgfQogfQpAQCAtNjkzLDE1ICs3ODgsMTcgQEAKIHZvaWQgVFNvY2tldDo6c2V0S2VlcEFsaXZlKGJvb2wga2VlcEFsaXZlKSB7CiAgIGtlZXBBbGl2ZV8gPSBrZWVwQWxpdmU7CiAKLSAgaWYgKHNvY2tldF8gPT0gLTEpIHsKKyAgaWYgKHNvY2tldF8gPT0gVEhSSUZUX0lOVkFMSURfU09DS0VUKSB7CiAgICAgcmV0dXJuOwogICB9CiAKICAgaW50IHZhbHVlID0ga2VlcEFsaXZlXzsKLSAgaW50IHJldCA9IHNldHNvY2tvcHQoc29ja2V0XywgU09MX1NPQ0tFVCwgU09fS0VFUEFMSVZFLCBjb25zdF9jYXN0X3NvY2tvcHQoJnZhbHVlKSwgc2l6ZW9mKHZhbHVlKSk7CisgIGludCByZXQKKyAgICAgID0gc2V0c29ja29wdChzb2NrZXRfLCBTT0xfU09DS0VULCBTT19LRUVQQUxJVkUsIGNvbnN0X2Nhc3Rfc29ja29wdCgmdmFsdWUpLCBzaXplb2YodmFsdWUpKTsKIAogICBpZiAocmV0ID09IC0xKSB7Ci0gICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsgIC8vIENvcHkgVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IgYmVjYXVzZSB3ZSdyZSBhbGxvY2F0aW5nIG1lbW9yeS4KKyAgICBpbnQgZXJybm9fY29weQorICAgICAgICA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOyAvLyBDb3B5IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SIGJlY2F1c2Ugd2UncmUgYWxsb2NhdGluZyBtZW1vcnkuCiAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNvY2tldDo6c2V0S2VlcEFsaXZlKCkgc2V0c29ja29wdCgpICIgKyBnZXRTb2NrZXRJbmZvKCksIGVycm5vX2NvcHkpOwogICB9CiB9CkBAIC03MTIsMTEgKzgwOSwxNSBAQAogCiBzdHJpbmcgVFNvY2tldDo6Z2V0U29ja2V0SW5mbygpIHsKICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKLSAgaWYgKGhvc3RfLmVtcHR5KCkgfHwgcG9ydF8gPT0gMCkgewotICAgIG9zcyA8PCAiPEhvc3Q6ICIgPDwgZ2V0UGVlckFkZHJlc3MoKTsKLSAgICBvc3MgPDwgIiBQb3J0OiAiIDw8IGdldFBlZXJQb3J0KCkgPDwgIj4iOworICBpZiAocGF0aF8uZW1wdHkoKSkgeworICAgIGlmIChob3N0Xy5lbXB0eSgpIHx8IHBvcnRfID09IDApIHsKKyAgICAgIG9zcyA8PCAiPEhvc3Q6ICIgPDwgZ2V0UGVlckFkZHJlc3MoKTsKKyAgICAgIG9zcyA8PCAiIFBvcnQ6ICIgPDwgZ2V0UGVlclBvcnQoKSA8PCAiPiI7CisgICAgfSBlbHNlIHsKKyAgICAgIG9zcyA8PCAiPEhvc3Q6ICIgPDwgaG9zdF8gPDwgIiBQb3J0OiAiIDw8IHBvcnRfIDw8ICI+IjsKKyAgICB9CiAgIH0gZWxzZSB7Ci0gICAgb3NzIDw8ICI8SG9zdDogIiA8PCBob3N0XyA8PCAiIFBvcnQ6ICIgPDwgcG9ydF8gPDwgIj4iOworICAgIG9zcyA8PCAiPFBhdGg6ICIgPDwgcGF0aF8gPDwgIj4iOwogICB9CiAgIHJldHVybiBvc3Muc3RyKCk7CiB9CkBAIC03MzUsNyArODM2LDcgQEAKIAogICAgIGlmIChhZGRyUHRyID09IE5VTEwpIHsKICAgICAgIGFkZHJMZW4gPSBzaXplb2YoYWRkcik7Ci0gICAgICBpZiAoZ2V0cGVlcm5hbWUoc29ja2V0XywgKHNvY2thZGRyKikgJmFkZHIsICZhZGRyTGVuKSAhPSAwKSB7CisgICAgICBpZiAoZ2V0cGVlcm5hbWUoc29ja2V0XywgKHNvY2thZGRyKikmYWRkciwgJmFkZHJMZW4pICE9IDApIHsKICAgICAgICAgcmV0dXJuIHBlZXJIb3N0XzsKICAgICAgIH0KICAgICAgIGFkZHJQdHIgPSAoc29ja2FkZHIqKSZhZGRyOwpAQCAtNzQ2LDkgKzg0NywxMyBAQAogICAgIGNoYXIgY2xpZW50aG9zdFtOSV9NQVhIT1NUXTsKICAgICBjaGFyIGNsaWVudHNlcnZpY2VbTklfTUFYU0VSVl07CiAKLSAgICBnZXRuYW1laW5mbygoc29ja2FkZHIqKSBhZGRyUHRyLCBhZGRyTGVuLAotICAgICAgICAgICAgICAgIGNsaWVudGhvc3QsIHNpemVvZihjbGllbnRob3N0KSwKLSAgICAgICAgICAgICAgICBjbGllbnRzZXJ2aWNlLCBzaXplb2YoY2xpZW50c2VydmljZSksIDApOworICAgIGdldG5hbWVpbmZvKChzb2NrYWRkciopYWRkclB0ciwKKyAgICAgICAgICAgICAgICBhZGRyTGVuLAorICAgICAgICAgICAgICAgIGNsaWVudGhvc3QsCisgICAgICAgICAgICAgICAgc2l6ZW9mKGNsaWVudGhvc3QpLAorICAgICAgICAgICAgICAgIGNsaWVudHNlcnZpY2UsCisgICAgICAgICAgICAgICAgc2l6ZW9mKGNsaWVudHNlcnZpY2UpLAorICAgICAgICAgICAgICAgIDApOwogCiAgICAgcGVlckhvc3RfID0gY2xpZW50aG9zdDsKICAgfQpAQCAtNzY5LDcgKzg3NCw3IEBACiAKICAgICBpZiAoYWRkclB0ciA9PSBOVUxMKSB7CiAgICAgICBhZGRyTGVuID0gc2l6ZW9mKGFkZHIpOwotICAgICAgaWYgKGdldHBlZXJuYW1lKHNvY2tldF8sIChzb2NrYWRkciopICZhZGRyLCAmYWRkckxlbikgIT0gMCkgeworICAgICAgaWYgKGdldHBlZXJuYW1lKHNvY2tldF8sIChzb2NrYWRkciopJmFkZHIsICZhZGRyTGVuKSAhPSAwKSB7CiAgICAgICAgIHJldHVybiBwZWVyQWRkcmVzc187CiAgICAgICB9CiAgICAgICBhZGRyUHRyID0gKHNvY2thZGRyKikmYWRkcjsKQEAgLTc4MCwxMCArODg1LDEzIEBACiAgICAgY2hhciBjbGllbnRob3N0W05JX01BWEhPU1RdOwogICAgIGNoYXIgY2xpZW50c2VydmljZVtOSV9NQVhTRVJWXTsKIAotICAgIGdldG5hbWVpbmZvKGFkZHJQdHIsIGFkZHJMZW4sCi0gICAgICAgICAgICAgICAgY2xpZW50aG9zdCwgc2l6ZW9mKGNsaWVudGhvc3QpLAotICAgICAgICAgICAgICAgIGNsaWVudHNlcnZpY2UsIHNpemVvZihjbGllbnRzZXJ2aWNlKSwKLSAgICAgICAgICAgICAgICBOSV9OVU1FUklDSE9TVHxOSV9OVU1FUklDU0VSVik7CisgICAgZ2V0bmFtZWluZm8oYWRkclB0ciwKKyAgICAgICAgICAgICAgICBhZGRyTGVuLAorICAgICAgICAgICAgICAgIGNsaWVudGhvc3QsCisgICAgICAgICAgICAgICAgc2l6ZW9mKGNsaWVudGhvc3QpLAorICAgICAgICAgICAgICAgIGNsaWVudHNlcnZpY2UsCisgICAgICAgICAgICAgICAgc2l6ZW9mKGNsaWVudHNlcnZpY2UpLAorICAgICAgICAgICAgICAgIE5JX05VTUVSSUNIT1NUIHwgTklfTlVNRVJJQ1NFUlYpOwogCiAgICAgcGVlckFkZHJlc3NfID0gY2xpZW50aG9zdDsKICAgICBwZWVyUG9ydF8gPSBzdGQ6OmF0b2koY2xpZW50c2VydmljZSk7CkBAIC04MTQsMTcgKzkyMiwxOSBAQAogICAgIH0KICAgICBicmVhazsKICAgfQorICBwZWVyQWRkcmVzc18uY2xlYXIoKTsKKyAgcGVlckhvc3RfLmNsZWFyKCk7CiB9CiAKIHNvY2thZGRyKiBUU29ja2V0OjpnZXRDYWNoZWRBZGRyZXNzKHNvY2tsZW5fdCogbGVuKSBjb25zdCB7CiAgIHN3aXRjaCAoY2FjaGVkUGVlckFkZHJfLmlwdjQuc2luX2ZhbWlseSkgewogICBjYXNlIEFGX0lORVQ6CiAgICAgKmxlbiA9IHNpemVvZihzb2NrYWRkcl9pbik7Ci0gICAgcmV0dXJuIChzb2NrYWRkciopICZjYWNoZWRQZWVyQWRkcl8uaXB2NDsKKyAgICByZXR1cm4gKHNvY2thZGRyKikmY2FjaGVkUGVlckFkZHJfLmlwdjQ7CiAKICAgY2FzZSBBRl9JTkVUNjoKICAgICAqbGVuID0gc2l6ZW9mKHNvY2thZGRyX2luNik7Ci0gICAgcmV0dXJuIChzb2NrYWRkciopICZjYWNoZWRQZWVyQWRkcl8uaXB2NjsKKyAgICByZXR1cm4gKHNvY2thZGRyKikmY2FjaGVkUGVlckFkZHJfLmlwdjY7CiAKICAgZGVmYXVsdDoKICAgICByZXR1cm4gTlVMTDsKQEAgLTg0NCw1ICs5NTQsNiBAQAogICBvc3MgPDwgZ2V0UGVlckhvc3QoKSA8PCAiOiIgPDwgZ2V0UGVlclBvcnQoKTsKICAgcmV0dXJuIG9zcy5zdHIoKTsKIH0KLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0LmggYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaAppbmRleCBjODczMjE4Li40MDMwZDQ2IDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaApAQCAtMzcsMTQgKzM3LDE2IEBACiAjaW5jbHVkZSA8bmV0ZGIuaD4KICNlbmRpZgogCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0cmFuc3BvcnQgeworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgewogCiAvKioKICAqIFRDUCBTb2NrZXQgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRUcmFuc3BvcnQgaW50ZXJmYWNlLgogICoKICAqLwogY2xhc3MgVFNvY2tldCA6IHB1YmxpYyBUVmlydHVhbFRyYW5zcG9ydDxUU29ja2V0PiB7Ci0gcHVibGljOgorcHVibGljOgogICAvKioKICAgICogQ29uc3RydWN0cyBhIG5ldyBzb2NrZXQuIE5vdGUgdGhhdCB0aGlzIGRvZXMgTk9UIGFjdHVhbGx5IGNvbm5lY3QgdGhlCiAgICAqIHNvY2tldC4KQEAgLTU5LDcgKzYxLDcgQEAKICAgICogQHBhcmFtIGhvc3QgQW4gSVAgYWRkcmVzcyBvciBob3N0bmFtZSB0byBjb25uZWN0IHRvCiAgICAqIEBwYXJhbSBwb3J0IFRoZSBwb3J0IHRvIGNvbm5lY3Qgb24KICAgICovCi0gIFRTb2NrZXQoc3RkOjpzdHJpbmcgaG9zdCwgaW50IHBvcnQpOworICBUU29ja2V0KGNvbnN0IHN0ZDo6c3RyaW5nJiBob3N0LCBpbnQgcG9ydCk7CiAKICAgLyoqCiAgICAqIENvbnN0cnVjdHMgYSBuZXcgVW5peCBkb21haW4gc29ja2V0LgpAQCAtNjcsNyArNjksNyBAQAogICAgKgogICAgKiBAcGFyYW0gcGF0aCBUaGUgVW5peCBkb21haW4gc29ja2V0IGUuZy4gIi90bXAvVGhyaWZ0VGVzdC5iaW5hcnkudGhyaWZ0IgogICAgKi8KLSAgVFNvY2tldChzdGQ6OnN0cmluZyBwYXRoKTsKKyAgVFNvY2tldChjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCk7CiAKICAgLyoqCiAgICAqIERlc3Ryb3llcyB0aGUgc29ja2V0IG9iamVjdCwgY2xvc2luZyBpdCBpZiBuZWNlc3NhcnkuCkBAIC04Miw3ICs4NCw5IEBACiAgIHZpcnR1YWwgYm9vbCBpc09wZW4oKTsKIAogICAvKioKLSAgICogQ2FsbHMgc2VsZWN0IG9uIHRoZSBzb2NrZXQgdG8gc2VlIGlmIHRoZXJlIGlzIG1vcmUgZGF0YSBhdmFpbGFibGUuCisgICAqIENoZWNrcyB3aGV0aGVyIHRoZXJlIGlzIG1vcmUgZGF0YSBhdmFpbGFibGUgaW4gdGhlIHNvY2tldCB0byByZWFkLgorICAgKgorICAgKiBUaGlzIGNhbGwgYmxvY2tzIHVudGlsIGF0IGxlYXN0IG9uZSBieXRlIGlzIGF2YWlsYWJsZSBvciB0aGUgc29ja2V0IGlzIGNsb3NlZC4KICAgICovCiAgIHZpcnR1YWwgYm9vbCBwZWVrKCk7CiAKQEAgLTk5LDcgKzEwMywyNSBAQAogICB2aXJ0dWFsIHZvaWQgY2xvc2UoKTsKIAogICAvKioKKyAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZXJlIGlzIHBlbmRpbmcgZGF0YSB0byByZWFkIG9yIG5vdC4KKyAgICoKKyAgICogVGhpcyBjYWxsIGRvZXMgbm90IGJsb2NrLgorICAgKiBcdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gb2YgdHlwZXM6CisgICAqICAgICAgICAgICBOT1RfT1BFTiBtZWFucyB0aGUgc29ja2V0IGhhcyBiZWVuIGNsb3NlZAorICAgKiAgICAgICAgICAgVU5LTk9XTiBtZWFucyBzb21ldGhpbmcgdW5leHBlY3RlZCBoYXBwZW5lZAorICAgKiBccmV0dXJucyB0cnVlIGlmIHRoZXJlIGlzIHBlbmRpbmcgZGF0YSB0byByZWFkLCBmYWxzZSBvdGhlcndpc2UKKyAgICovCisgIHZpcnR1YWwgYm9vbCBoYXNQZW5kaW5nRGF0YVRvUmVhZCgpOworCisgIC8qKgogICAgKiBSZWFkcyBmcm9tIHRoZSB1bmRlcmx5aW5nIHNvY2tldC4KKyAgICogXHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWFkIG9yIDAgaW5kaWNhdGVzIEVPRgorICAgKiBcdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gb2YgdHlwZXM6CisgICAqICAgICAgICAgICBJTlRFUlJVUFRFRCBtZWFucyB0aGUgc29ja2V0IHdhcyBpbnRlcnJ1cHRlZAorICAgKiAgICAgICAgICAgICAgICAgICAgICAgb3V0IG9mIGEgYmxvY2tpbmcgY2FsbAorICAgKiAgICAgICAgICAgTk9UX09QRU4gbWVhbnMgdGhlIHNvY2tldCBoYXMgYmVlbiBjbG9zZWQKKyAgICogICAgICAgICAgIFRJTUVEX09VVCBtZWFucyB0aGUgcmVjZWl2ZSB0aW1lb3V0IGV4cGlyZWQKKyAgICogICAgICAgICAgIFVOS05PV04gbWVhbnMgc29tZXRoaW5nIHVuZXhwZWN0ZWQgaGFwcGVuZWQKICAgICovCiAgIHZpcnR1YWwgdWludDMyX3QgcmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7CiAKQEAgLTExMSw3ICsxMzMsNyBAQAogICAvKioKICAgICogV3JpdGVzIHRvIHRoZSB1bmRlcmx5aW5nIHNvY2tldC4gIERvZXMgc2luZ2xlIHNlbmQoKSBhbmQgcmV0dXJucyByZXN1bHQuCiAgICAqLwotICB1aW50MzJfdCB3cml0ZV9wYXJ0aWFsKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZV9wYXJ0aWFsKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKIAogICAvKioKICAgICogR2V0IHRoZSBob3N0IHRoYXQgdGhlIHNvY2tldCBpcyBjb25uZWN0ZWQgdG8KQEAgLTE4NCw3ICsyMDYsNyBAQAogICB2b2lkIHNldEtlZXBBbGl2ZShib29sIGtlZXBBbGl2ZSk7CiAKICAgLyoqCi0gICAqIEdldCBzb2NrZXQgaW5mb3JtYXRpb24gZm9ybWF0ZWQgYXMgYSBzdHJpbmcgPEhvc3Q6IHggUG9ydDogeD4KKyAgICogR2V0IHNvY2tldCBpbmZvcm1hdGlvbiBmb3JtYXR0ZWQgYXMgYSBzdHJpbmcgPEhvc3Q6IHggUG9ydDogeD4KICAgICovCiAgIHN0ZDo6c3RyaW5nIGdldFNvY2tldEluZm8oKTsKIApAQCAtMjA2LDkgKzIyOCw3IEBACiAgIC8qKgogICAgKiBSZXR1cm5zIHRoZSB1bmRlcmx5aW5nIHNvY2tldCBmaWxlIGRlc2NyaXB0b3IuCiAgICAqLwotICBUSFJJRlRfU09DS0VUIGdldFNvY2tldEZEKCkgewotICAgIHJldHVybiBzb2NrZXRfOwotICB9CisgIFRIUklGVF9TT0NLRVQgZ2V0U29ja2V0RkQoKSB7IHJldHVybiBzb2NrZXRfOyB9CiAKICAgLyoqCiAgICAqIChSZS0paW5pdGlhbGl6ZSBhIFRTb2NrZXQgZm9yIHRoZSBzdXBwbGllZCBkZXNjcmlwdG9yLiAgVGhpcyBpcyBvbmx5CkBAIC0yNDIsMjMgKzI2MiwzOCBAQAogICB2aXJ0dWFsIGNvbnN0IHN0ZDo6c3RyaW5nIGdldE9yaWdpbigpOwogCiAgIC8qKgotICAgKiBDb25zdHJ1Y3RvciB0byBjcmVhdGUgc29ja2V0IGZyb20gcmF3IFVOSVggaGFuZGxlLgorICAgKiBDb25zdHJ1Y3RvciB0byBjcmVhdGUgc29ja2V0IGZyb20gZmlsZSBkZXNjcmlwdG9yLgogICAgKi8KICAgVFNvY2tldChUSFJJRlRfU09DS0VUIHNvY2tldCk7CiAKICAgLyoqCisgICAqIENvbnN0cnVjdG9yIHRvIGNyZWF0ZSBzb2NrZXQgZnJvbSBmaWxlIGRlc2NyaXB0b3IgdGhhdAorICAgKiBjYW4gYmUgaW50ZXJydXB0ZWQgc2FmZWx5LgorICAgKi8KKyAgVFNvY2tldChUSFJJRlRfU09DS0VUIHNvY2tldCwgc3RkOjpzaGFyZWRfcHRyPFRIUklGVF9TT0NLRVQ+IGludGVycnVwdExpc3RlbmVyKTsKKworICAvKioKICAgICogU2V0IGEgY2FjaGUgb2YgdGhlIHBlZXIgYWRkcmVzcyAodXNlZCB3aGVuIHRyaXZpYWxseSBhdmFpbGFibGU6IGUuZy4KICAgICogYWNjZXB0KCkgb3IgY29ubmVjdCgpKS4gT25seSBjYWNoZXMgSVBWNCBhbmQgSVBWNjsgdW5zZXQgZm9yIG90aGVycy4KICAgICovCiAgIHZvaWQgc2V0Q2FjaGVkQWRkcmVzcyhjb25zdCBzb2NrYWRkciogYWRkciwgc29ja2xlbl90IGxlbik7CiAKLSBwcm90ZWN0ZWQ6Citwcm90ZWN0ZWQ6CiAgIC8qKiBjb25uZWN0LCBjYWxsZWQgYnkgb3BlbiAqLwotICB2b2lkIG9wZW5Db25uZWN0aW9uKHN0cnVjdCBhZGRyaW5mbyAqcmVzKTsKKyAgdm9pZCBvcGVuQ29ubmVjdGlvbihzdHJ1Y3QgYWRkcmluZm8qIHJlcyk7CiAKICAgLyoqIEhvc3QgdG8gY29ubmVjdCB0byAqLwogICBzdGQ6OnN0cmluZyBob3N0XzsKIAorICAvKiogUG9ydCBudW1iZXIgdG8gY29ubmVjdCBvbiAqLworICBpbnQgcG9ydF87CisKKyAgLyoqIFVOSVggZG9tYWluIHNvY2tldCBwYXRoICovCisgIHN0ZDo6c3RyaW5nIHBhdGhfOworCisgIC8qKiBVbmRlcmx5aW5nIHNvY2tldCBoYW5kbGUgKi8KKyAgVEhSSUZUX1NPQ0tFVCBzb2NrZXRfOworCiAgIC8qKiBQZWVyIGhvc3RuYW1lICovCiAgIHN0ZDo6c3RyaW5nIHBlZXJIb3N0XzsKIApAQCAtMjY4LDE0ICszMDMsMTEgQEAKICAgLyoqIFBlZXIgcG9ydCAqLwogICBpbnQgcGVlclBvcnRfOwogCi0gIC8qKiBQb3J0IG51bWJlciB0byBjb25uZWN0IG9uICovCi0gIGludCBwb3J0XzsKLQotICAvKiogVU5JWCBkb21haW4gc29ja2V0IHBhdGggKi8KLSAgc3RkOjpzdHJpbmcgcGF0aF87Ci0KLSAgLyoqIFVuZGVybHlpbmcgVU5JWCBzb2NrZXQgaGFuZGxlICovCi0gIFRIUklGVF9TT0NLRVQgc29ja2V0XzsKKyAgLyoqCisgICAqIEEgc2hhcmVkIHNvY2tldCBwb2ludGVyIHRoYXQgd2lsbCBpbnRlcnJ1cHQgYSBibG9ja2luZyByZWFkIGlmIGRhdGEKKyAgICogYmVjb21lcyBhdmFpbGFibGUgb24gaXQKKyAgICovCisgIHN0ZDo6c2hhcmVkX3B0cjxUSFJJRlRfU09DS0VUPiBpbnRlcnJ1cHRMaXN0ZW5lcl87CiAKICAgLyoqIENvbm5lY3QgdGltZW91dCBpbiBtcyAqLwogICBpbnQgY29ublRpbWVvdXRfOwpAQCAtMzEwLDEyICszNDIsMTIgQEAKICAgLyoqIFdoZXRoZXIgdG8gdXNlIGxvdyBtaW5pbXVtIFRDUCByZXRyYW5zbWlzc2lvbiB0aW1lb3V0ICovCiAgIHN0YXRpYyBib29sIHVzZUxvd01pblJ0b187CiAKLSBwcml2YXRlOgorcHJpdmF0ZToKICAgdm9pZCB1bml4X29wZW4oKTsKICAgdm9pZCBsb2NhbF9vcGVuKCk7CiB9OwotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CiAKICNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RTT0NLRVRfSF8KLQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0UG9vbC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXRQb29sLmNwcAppbmRleCBlMGIyODZhLi41NDc3YmJiIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXRQb29sLmNwcAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXRQb29sLmNwcApAQCAtMjEsNTcgKzIxLDYyIEBACiAKICNpbmNsdWRlIDxhbGdvcml0aG0+CiAjaW5jbHVkZSA8aW9zdHJlYW0+CisjaWYgX19jcGx1c3BsdXMgPj0gMjAxNzAzTAorI2luY2x1ZGUgPHJhbmRvbT4KKyNlbmRpZgogCiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0UG9vbC5oPgogCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0cmFuc3BvcnQgewordXNpbmcgc3RkOjpwYWlyOwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnZlY3RvcjsKIAotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKIAotdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7Cit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7CiAKIC8qKgogICogVFNvY2tldFBvb2xTZXJ2ZXIgaW1wbGVtZW50YXRpb24KICAqCiAgKi8KIFRTb2NrZXRQb29sU2VydmVyOjpUU29ja2V0UG9vbFNlcnZlcigpCi0gIDogaG9zdF8oIiIpLAotICAgIHBvcnRfKDApLAotICAgIHNvY2tldF8oVEhSSUZUX0lOVkFMSURfU09DS0VUKSwKLSAgICBsYXN0RmFpbFRpbWVfKDApLAotICAgIGNvbnNlY3V0aXZlRmFpbHVyZXNfKDApIHt9CisgIDogaG9zdF8oIiIpLCBwb3J0XygwKSwgc29ja2V0XyhUSFJJRlRfSU5WQUxJRF9TT0NLRVQpLCBsYXN0RmFpbFRpbWVfKDApLCBjb25zZWN1dGl2ZUZhaWx1cmVzXygwKSB7Cit9CiAKIC8qKgogICogQ29uc3RydWN0b3IgZm9yIFRTb2NrZXRQb29sIHNlcnZlcgogICovCi1UU29ja2V0UG9vbFNlcnZlcjo6VFNvY2tldFBvb2xTZXJ2ZXIoY29uc3Qgc3RyaW5nICZob3N0LCBpbnQgcG9ydCkKK1RTb2NrZXRQb29sU2VydmVyOjpUU29ja2V0UG9vbFNlcnZlcihjb25zdCBzdHJpbmcmIGhvc3QsIGludCBwb3J0KQogICA6IGhvc3RfKGhvc3QpLAogICAgIHBvcnRfKHBvcnQpLAogICAgIHNvY2tldF8oVEhSSUZUX0lOVkFMSURfU09DS0VUKSwKICAgICBsYXN0RmFpbFRpbWVfKDApLAotICAgIGNvbnNlY3V0aXZlRmFpbHVyZXNfKDApIHt9CisgICAgY29uc2VjdXRpdmVGYWlsdXJlc18oMCkgeworfQogCiAvKioKICAqIFRTb2NrZXRQb29sIGltcGxlbWVudGF0aW9uLgogICoKICAqLwogCi1UU29ja2V0UG9vbDo6VFNvY2tldFBvb2woKSA6IFRTb2NrZXQoKSwKLSAgbnVtUmV0cmllc18oMSksCi0gIHJldHJ5SW50ZXJ2YWxfKDYwKSwKLSAgbWF4Q29uc2VjdXRpdmVGYWlsdXJlc18oMSksCi0gIHJhbmRvbWl6ZV8odHJ1ZSksCi0gIGFsd2F5c1RyeUxhc3RfKHRydWUpIHsKK1RTb2NrZXRQb29sOjpUU29ja2V0UG9vbCgpCisgIDogVFNvY2tldCgpLAorICAgIG51bVJldHJpZXNfKDEpLAorICAgIHJldHJ5SW50ZXJ2YWxfKDYwKSwKKyAgICBtYXhDb25zZWN1dGl2ZUZhaWx1cmVzXygxKSwKKyAgICByYW5kb21pemVfKHRydWUpLAorICAgIGFsd2F5c1RyeUxhc3RfKHRydWUpIHsKIH0KIAotVFNvY2tldFBvb2w6OlRTb2NrZXRQb29sKGNvbnN0IHZlY3RvcjxzdHJpbmc+ICZob3N0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZWN0b3I8aW50PiAmcG9ydHMpIDogVFNvY2tldCgpLAotICBudW1SZXRyaWVzXygxKSwKLSAgcmV0cnlJbnRlcnZhbF8oNjApLAotICBtYXhDb25zZWN1dGl2ZUZhaWx1cmVzXygxKSwKLSAgcmFuZG9taXplXyh0cnVlKSwKLSAgYWx3YXlzVHJ5TGFzdF8odHJ1ZSkKLXsKK1RTb2NrZXRQb29sOjpUU29ja2V0UG9vbChjb25zdCB2ZWN0b3I8c3RyaW5nPiYgaG9zdHMsIGNvbnN0IHZlY3RvcjxpbnQ+JiBwb3J0cykKKyAgOiBUU29ja2V0KCksCisgICAgbnVtUmV0cmllc18oMSksCisgICAgcmV0cnlJbnRlcnZhbF8oNjApLAorICAgIG1heENvbnNlY3V0aXZlRmFpbHVyZXNfKDEpLAorICAgIHJhbmRvbWl6ZV8odHJ1ZSksCisgICAgYWx3YXlzVHJ5TGFzdF8odHJ1ZSkgewogICBpZiAoaG9zdHMuc2l6ZSgpICE9IHBvcnRzLnNpemUoKSkgewogICAgIEdsb2JhbE91dHB1dCgiVFNvY2tldFBvb2w6OlRTb2NrZXRQb29sOiBob3N0cy5zaXplICE9IHBvcnRzLnNpemUiKTsKICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkJBRF9BUkdTKTsKQEAgLTgyLDQxICs4Nyw0MSBAQAogICB9CiB9CiAKLVRTb2NrZXRQb29sOjpUU29ja2V0UG9vbChjb25zdCB2ZWN0b3I8cGFpcjxzdHJpbmcsIGludD4gPiYgc2VydmVycykgOiBUU29ja2V0KCksCi0gIG51bVJldHJpZXNfKDEpLAotICByZXRyeUludGVydmFsXyg2MCksCi0gIG1heENvbnNlY3V0aXZlRmFpbHVyZXNfKDEpLAotICByYW5kb21pemVfKHRydWUpLAotICBhbHdheXNUcnlMYXN0Xyh0cnVlKQoteworVFNvY2tldFBvb2w6OlRTb2NrZXRQb29sKGNvbnN0IHZlY3RvcjxwYWlyPHN0cmluZywgaW50PiA+JiBzZXJ2ZXJzKQorICA6IFRTb2NrZXQoKSwKKyAgICBudW1SZXRyaWVzXygxKSwKKyAgICByZXRyeUludGVydmFsXyg2MCksCisgICAgbWF4Q29uc2VjdXRpdmVGYWlsdXJlc18oMSksCisgICAgcmFuZG9taXplXyh0cnVlKSwKKyAgICBhbHdheXNUcnlMYXN0Xyh0cnVlKSB7CiAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBzZXJ2ZXJzLnNpemUoKTsgKytpKSB7CiAgICAgYWRkU2VydmVyKHNlcnZlcnNbaV0uZmlyc3QsIHNlcnZlcnNbaV0uc2Vjb25kKTsKICAgfQogfQogCi1UU29ja2V0UG9vbDo6VFNvY2tldFBvb2woY29uc3QgdmVjdG9yPCBzaGFyZWRfcHRyPFRTb2NrZXRQb29sU2VydmVyPiA+JiBzZXJ2ZXJzKSA6IFRTb2NrZXQoKSwKLSAgc2VydmVyc18oc2VydmVycyksCi0gIG51bVJldHJpZXNfKDEpLAotICByZXRyeUludGVydmFsXyg2MCksCi0gIG1heENvbnNlY3V0aXZlRmFpbHVyZXNfKDEpLAotICByYW5kb21pemVfKHRydWUpLAotICBhbHdheXNUcnlMYXN0Xyh0cnVlKQoteworVFNvY2tldFBvb2w6OlRTb2NrZXRQb29sKGNvbnN0IHZlY3RvcjxzaGFyZWRfcHRyPFRTb2NrZXRQb29sU2VydmVyPiA+JiBzZXJ2ZXJzKQorICA6IFRTb2NrZXQoKSwKKyAgICBzZXJ2ZXJzXyhzZXJ2ZXJzKSwKKyAgICBudW1SZXRyaWVzXygxKSwKKyAgICByZXRyeUludGVydmFsXyg2MCksCisgICAgbWF4Q29uc2VjdXRpdmVGYWlsdXJlc18oMSksCisgICAgcmFuZG9taXplXyh0cnVlKSwKKyAgICBhbHdheXNUcnlMYXN0Xyh0cnVlKSB7CiB9CiAKLVRTb2NrZXRQb29sOjpUU29ja2V0UG9vbChjb25zdCBzdHJpbmcmIGhvc3QsIGludCBwb3J0KSA6IFRTb2NrZXQoKSwKLSAgbnVtUmV0cmllc18oMSksCi0gIHJldHJ5SW50ZXJ2YWxfKDYwKSwKLSAgbWF4Q29uc2VjdXRpdmVGYWlsdXJlc18oMSksCi0gIHJhbmRvbWl6ZV8odHJ1ZSksCi0gIGFsd2F5c1RyeUxhc3RfKHRydWUpCi17CitUU29ja2V0UG9vbDo6VFNvY2tldFBvb2woY29uc3Qgc3RyaW5nJiBob3N0LCBpbnQgcG9ydCkKKyAgOiBUU29ja2V0KCksCisgICAgbnVtUmV0cmllc18oMSksCisgICAgcmV0cnlJbnRlcnZhbF8oNjApLAorICAgIG1heENvbnNlY3V0aXZlRmFpbHVyZXNfKDEpLAorICAgIHJhbmRvbWl6ZV8odHJ1ZSksCisgICAgYWx3YXlzVHJ5TGFzdF8odHJ1ZSkgewogICBhZGRTZXJ2ZXIoaG9zdCwgcG9ydCk7CiB9CiAKIFRTb2NrZXRQb29sOjp+VFNvY2tldFBvb2woKSB7Ci0gIHZlY3Rvcjwgc2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4gPjo6Y29uc3RfaXRlcmF0b3IgaXRlciA9IHNlcnZlcnNfLmJlZ2luKCk7Ci0gIHZlY3Rvcjwgc2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4gPjo6Y29uc3RfaXRlcmF0b3IgaXRlckVuZCA9IHNlcnZlcnNfLmVuZCgpOworICB2ZWN0b3I8c2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4gPjo6Y29uc3RfaXRlcmF0b3IgaXRlciA9IHNlcnZlcnNfLmJlZ2luKCk7CisgIHZlY3RvcjxzaGFyZWRfcHRyPFRTb2NrZXRQb29sU2VydmVyPiA+Ojpjb25zdF9pdGVyYXRvciBpdGVyRW5kID0gc2VydmVyc18uZW5kKCk7CiAgIGZvciAoOyBpdGVyICE9IGl0ZXJFbmQ7ICsraXRlcikgewogICAgIHNldEN1cnJlbnRTZXJ2ZXIoKml0ZXIpOwogICAgIFRTb2NrZXRQb29sOjpjbG9zZSgpOwpAQCAtMTI3LDE3ICsxMzIsMTcgQEAKICAgc2VydmVyc18ucHVzaF9iYWNrKHNoYXJlZF9wdHI8VFNvY2tldFBvb2xTZXJ2ZXI+KG5ldyBUU29ja2V0UG9vbFNlcnZlcihob3N0LCBwb3J0KSkpOwogfQogCi12b2lkIFRTb2NrZXRQb29sOjphZGRTZXJ2ZXIoc2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4gJnNlcnZlcikgewordm9pZCBUU29ja2V0UG9vbDo6YWRkU2VydmVyKHNoYXJlZF9wdHI8VFNvY2tldFBvb2xTZXJ2ZXI+JiBzZXJ2ZXIpIHsKICAgaWYgKHNlcnZlcikgewogICAgIHNlcnZlcnNfLnB1c2hfYmFjayhzZXJ2ZXIpOwogICB9CiB9CiAKLXZvaWQgVFNvY2tldFBvb2w6OnNldFNlcnZlcnMoY29uc3QgdmVjdG9yPCBzaGFyZWRfcHRyPFRTb2NrZXRQb29sU2VydmVyPiA+JiBzZXJ2ZXJzKSB7Cit2b2lkIFRTb2NrZXRQb29sOjpzZXRTZXJ2ZXJzKGNvbnN0IHZlY3RvcjxzaGFyZWRfcHRyPFRTb2NrZXRQb29sU2VydmVyPiA+JiBzZXJ2ZXJzKSB7CiAgIHNlcnZlcnNfID0gc2VydmVyczsKIH0KIAotdm9pZCBUU29ja2V0UG9vbDo6Z2V0U2VydmVycyh2ZWN0b3I8IHNoYXJlZF9wdHI8VFNvY2tldFBvb2xTZXJ2ZXI+ID4mIHNlcnZlcnMpIHsKK3ZvaWQgVFNvY2tldFBvb2w6OmdldFNlcnZlcnModmVjdG9yPHNoYXJlZF9wdHI8VFNvY2tldFBvb2xTZXJ2ZXI+ID4mIHNlcnZlcnMpIHsKICAgc2VydmVycyA9IHNlcnZlcnNfOwogfQogCkBAIC0xNDksNyArMTU0LDYgQEAKICAgcmV0cnlJbnRlcnZhbF8gPSByZXRyeUludGVydmFsOwogfQogCi0KIHZvaWQgVFNvY2tldFBvb2w6OnNldE1heENvbnNlY3V0aXZlRmFpbHVyZXMoaW50IG1heENvbnNlY3V0aXZlRmFpbHVyZXMpIHsKICAgbWF4Q29uc2VjdXRpdmVGYWlsdXJlc18gPSBtYXhDb25zZWN1dGl2ZUZhaWx1cmVzOwogfQpAQCAtMTYyLDcgKzE2Niw3IEBACiAgIGFsd2F5c1RyeUxhc3RfID0gYWx3YXlzVHJ5TGFzdDsKIH0KIAotdm9pZCBUU29ja2V0UG9vbDo6c2V0Q3VycmVudFNlcnZlcihjb25zdCBzaGFyZWRfcHRyPFRTb2NrZXRQb29sU2VydmVyPiAmc2VydmVyKSB7Cit2b2lkIFRTb2NrZXRQb29sOjpzZXRDdXJyZW50U2VydmVyKGNvbnN0IHNoYXJlZF9wdHI8VFNvY2tldFBvb2xTZXJ2ZXI+JiBzZXJ2ZXIpIHsKICAgY3VycmVudFNlcnZlcl8gPSBzZXJ2ZXI7CiAgIGhvc3RfID0gc2VydmVyLT5ob3N0XzsKICAgcG9ydF8gPSBzZXJ2ZXItPnBvcnRfOwpAQCAtMTg3LDEyICsxOTEsMTggQEAKICAgfQogCiAgIGlmIChyYW5kb21pemVfICYmIG51bVNlcnZlcnMgPiAxKSB7Ci0gICAgcmFuZG9tX3NodWZmbGUoc2VydmVyc18uYmVnaW4oKSwgc2VydmVyc18uZW5kKCkpOworI2lmIF9fY3BsdXNwbHVzID49IDIwMTcwM0wKKyAgICBzdGQ6OnJhbmRvbV9kZXZpY2Ugcm5nOworICAgIHN0ZDo6bXQxOTkzNyB1cm5nKHJuZygpKTsKKyAgICBzdGQ6OnNodWZmbGUoc2VydmVyc18uYmVnaW4oKSwgc2VydmVyc18uZW5kKCksIHVybmcpOworI2Vsc2UKKyAgICBzdGQ6OnJhbmRvbV9zaHVmZmxlKHNlcnZlcnNfLmJlZ2luKCksIHNlcnZlcnNfLmVuZCgpKTsKKyNlbmRpZgogICB9CiAKICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1TZXJ2ZXJzOyArK2kpIHsKIAotICAgIHNoYXJlZF9wdHI8VFNvY2tldFBvb2xTZXJ2ZXI+ICZzZXJ2ZXIgPSBzZXJ2ZXJzX1tpXTsKKyAgICBzaGFyZWRfcHRyPFRTb2NrZXRQb29sU2VydmVyPiYgc2VydmVyID0gc2VydmVyc19baV07CiAgICAgLy8gSW1wZXJzb25hdGUgdGhlIHNlcnZlciBzb2NrZXQKICAgICBzZXRDdXJyZW50U2VydmVyKHNlcnZlcik7CiAKQEAgLTIxNiw4ICsyMjYsOCBAQAogICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBudW1SZXRyaWVzXzsgKytqKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgVFNvY2tldDo6b3BlbigpOwotICAgICAgICB9IGNhdGNoIChURXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICBzdHJpbmcgZXJyU3RyID0gIlRTb2NrZXRQb29sOjpvcGVuIGZhaWxlZCAiK2dldFNvY2tldEluZm8oKSsiOiAiK2Uud2hhdCgpOworICAgICAgICB9IGNhdGNoIChjb25zdCBURXhjZXB0aW9uICZlKSB7CisgICAgICAgICAgc3RyaW5nIGVyclN0ciA9ICJUU29ja2V0UG9vbDo6b3BlbiBmYWlsZWQgIiArIGdldFNvY2tldEluZm8oKSArICI6ICIgKyBlLndoYXQoKTsKICAgICAgICAgICBHbG9iYWxPdXRwdXQoZXJyU3RyLmNfc3RyKCkpOwogICAgICAgICAgIHNvY2tldF8gPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQ7CiAgICAgICAgICAgY29udGludWU7CkBAIC0yNTAsNSArMjYwLDYgQEAKICAgICBjdXJyZW50U2VydmVyXy0+c29ja2V0XyA9IFRIUklGVF9JTlZBTElEX1NPQ0tFVDsKICAgfQogfQotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXRQb29sLmggYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXRQb29sLmgKaW5kZXggNzcyODI1Ny4uMThmMTAxYyAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0UG9vbC5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNvY2tldFBvb2wuaApAQCAtMjMsMTUgKzIzLDE3IEBACiAjaW5jbHVkZSA8dmVjdG9yPgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oPgogCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0cmFuc3BvcnQgeworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgewogCi0gLyoqCi0gICogQ2xhc3MgdG8gaG9sZCBzZXJ2ZXIgaW5mb3JtYXRpb24gZm9yIFRTb2NrZXRQb29sCi0gICoKLSAgKi8KKy8qKgorICogQ2xhc3MgdG8gaG9sZCBzZXJ2ZXIgaW5mb3JtYXRpb24gZm9yIFRTb2NrZXRQb29sCisgKgorICovCiBjbGFzcyBUU29ja2V0UG9vbFNlcnZlciB7CiAKLSAgcHVibGljOgorcHVibGljOgogICAvKioKICAgICogRGVmYXVsdCBjb25zdHJ1Y3RvciBmb3Igc2VydmVyIGluZm8KICAgICovCkBAIC00MCw3ICs0Miw3IEBACiAgIC8qKgogICAgKiBDb25zdHJ1Y3RvciBmb3IgVFNvY2tldFBvb2wgc2VydmVyCiAgICAqLwotICBUU29ja2V0UG9vbFNlcnZlcihjb25zdCBzdGQ6OnN0cmluZyAmaG9zdCwgaW50IHBvcnQpOworICBUU29ja2V0UG9vbFNlcnZlcihjb25zdCBzdGQ6OnN0cmluZyYgaG9zdCwgaW50IHBvcnQpOwogCiAgIC8vIEhvc3QgbmFtZQogICBzdGQ6OnN0cmluZyBob3N0XzsKQEAgLTY0LDEzMyArNjYsMTMwIEBACiAgKi8KIGNsYXNzIFRTb2NrZXRQb29sIDogcHVibGljIFRTb2NrZXQgewogCi0gcHVibGljOgorcHVibGljOgorICAvKioKKyAgICogU29ja2V0IHBvb2wgY29uc3RydWN0b3IKKyAgICovCisgIFRTb2NrZXRQb29sKCk7CiAKLSAgIC8qKgotICAgICogU29ja2V0IHBvb2wgY29uc3RydWN0b3IKLSAgICAqLwotICAgVFNvY2tldFBvb2woKTsKKyAgLyoqCisgICAqIFNvY2tldCBwb29sIGNvbnN0cnVjdG9yCisgICAqCisgICAqIEBwYXJhbSBob3N0cyBsaXN0IG9mIGhvc3QgbmFtZXMKKyAgICogQHBhcmFtIHBvcnRzIGxpc3Qgb2YgcG9ydCBuYW1lcworICAgKi8KKyAgVFNvY2tldFBvb2woY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBob3N0cywgY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYgcG9ydHMpOwogCi0gICAvKioKLSAgICAqIFNvY2tldCBwb29sIGNvbnN0cnVjdG9yCi0gICAgKgotICAgICogQHBhcmFtIGhvc3RzIGxpc3Qgb2YgaG9zdCBuYW1lcwotICAgICogQHBhcmFtIHBvcnRzIGxpc3Qgb2YgcG9ydCBuYW1lcwotICAgICovCi0gICBUU29ja2V0UG9vbChjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJmhvc3RzLAotICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiAmcG9ydHMpOworICAvKioKKyAgICogU29ja2V0IHBvb2wgY29uc3RydWN0b3IKKyAgICoKKyAgICogQHBhcmFtIHNlcnZlcnMgbGlzdCBvZiBwYWlycyBvZiBob3N0IG5hbWUgYW5kIHBvcnQKKyAgICovCisgIFRTb2NrZXRQb29sKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgaW50PiA+JiBzZXJ2ZXJzKTsKIAotICAgLyoqCi0gICAgKiBTb2NrZXQgcG9vbCBjb25zdHJ1Y3RvcgotICAgICoKLSAgICAqIEBwYXJhbSBzZXJ2ZXJzIGxpc3Qgb2YgcGFpcnMgb2YgaG9zdCBuYW1lIGFuZCBwb3J0Ci0gICAgKi8KLSAgIFRTb2NrZXRQb29sKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgaW50PiA+JiBzZXJ2ZXJzKTsKKyAgLyoqCisgICAqIFNvY2tldCBwb29sIGNvbnN0cnVjdG9yCisgICAqCisgICAqIEBwYXJhbSBzZXJ2ZXJzIGxpc3Qgb2YgVFNvY2tldFBvb2xTZXJ2ZXJzCisgICAqLworICBUU29ja2V0UG9vbChjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldFBvb2xTZXJ2ZXI+ID4mIHNlcnZlcnMpOwogCi0gICAvKioKLSAgICAqIFNvY2tldCBwb29sIGNvbnN0cnVjdG9yCi0gICAgKgotICAgICogQHBhcmFtIHNlcnZlcnMgbGlzdCBvZiBUU29ja2V0UG9vbFNlcnZlcnMKLSAgICAqLwotICBUU29ja2V0UG9vbChjb25zdCBzdGQ6OnZlY3RvcjwgYm9vc3Q6OnNoYXJlZF9wdHI8VFNvY2tldFBvb2xTZXJ2ZXI+ID4mIHNlcnZlcnMpOworICAvKioKKyAgICogU29ja2V0IHBvb2wgY29uc3RydWN0b3IKKyAgICoKKyAgICogQHBhcmFtIGhvc3Qgc2luZ2xlIGhvc3QKKyAgICogQHBhcmFtIHBvcnQgc2luZ2xlIHBvcnQKKyAgICovCisgIFRTb2NrZXRQb29sKGNvbnN0IHN0ZDo6c3RyaW5nJiBob3N0LCBpbnQgcG9ydCk7CiAKLSAgIC8qKgotICAgICogU29ja2V0IHBvb2wgY29uc3RydWN0b3IKLSAgICAqCi0gICAgKiBAcGFyYW0gaG9zdCBzaW5nbGUgaG9zdAotICAgICogQHBhcmFtIHBvcnQgc2luZ2xlIHBvcnQKLSAgICAqLwotICAgVFNvY2tldFBvb2woY29uc3Qgc3RkOjpzdHJpbmcmIGhvc3QsIGludCBwb3J0KTsKKyAgLyoqCisgICAqIERlc3Ryb3llcyB0aGUgc29ja2V0IG9iamVjdCwgY2xvc2luZyBpdCBpZiBuZWNlc3NhcnkuCisgICAqLworICB2aXJ0dWFsIH5UU29ja2V0UG9vbCgpOwogCi0gICAvKioKLSAgICAqIERlc3Ryb3llcyB0aGUgc29ja2V0IG9iamVjdCwgY2xvc2luZyBpdCBpZiBuZWNlc3NhcnkuCi0gICAgKi8KLSAgIHZpcnR1YWwgflRTb2NrZXRQb29sKCk7CisgIC8qKgorICAgKiBBZGQgYSBzZXJ2ZXIgdG8gdGhlIHBvb2wKKyAgICovCisgIHZvaWQgYWRkU2VydmVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBob3N0LCBpbnQgcG9ydCk7CiAKLSAgIC8qKgotICAgICogQWRkIGEgc2VydmVyIHRvIHRoZSBwb29sCi0gICAgKi8KLSAgIHZvaWQgYWRkU2VydmVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBob3N0LCBpbnQgcG9ydCk7CisgIC8qKgorICAgKiBBZGQgYSBzZXJ2ZXIgdG8gdGhlIHBvb2wKKyAgICovCisgIHZvaWQgYWRkU2VydmVyKHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4mIHNlcnZlcik7CiAKLSAgIC8qKgotICAgICogQWRkIGEgc2VydmVyIHRvIHRoZSBwb29sCi0gICAgKi8KLSAgdm9pZCBhZGRTZXJ2ZXIoYm9vc3Q6OnNoYXJlZF9wdHI8VFNvY2tldFBvb2xTZXJ2ZXI+ICZzZXJ2ZXIpOworICAvKioKKyAgICogU2V0IGxpc3Qgb2Ygc2VydmVycyBpbiB0aGlzIHBvb2wKKyAgICovCisgIHZvaWQgc2V0U2VydmVycyhjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldFBvb2xTZXJ2ZXI+ID4mIHNlcnZlcnMpOwogCi0gICAvKioKLSAgICAqIFNldCBsaXN0IG9mIHNlcnZlcnMgaW4gdGhpcyBwb29sCi0gICAgKi8KLSAgdm9pZCBzZXRTZXJ2ZXJzKGNvbnN0IHN0ZDo6dmVjdG9yPCBib29zdDo6c2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4gPiYgc2VydmVycyk7CisgIC8qKgorICAgKiBHZXQgbGlzdCBvZiBzZXJ2ZXJzIGluIHRoaXMgcG9vbAorICAgKi8KKyAgdm9pZCBnZXRTZXJ2ZXJzKHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4gPiYgc2VydmVycyk7CiAKLSAgIC8qKgotICAgICogR2V0IGxpc3Qgb2Ygc2VydmVycyBpbiB0aGlzIHBvb2wKLSAgICAqLwotICB2b2lkIGdldFNlcnZlcnMoc3RkOjp2ZWN0b3I8IGJvb3N0OjpzaGFyZWRfcHRyPFRTb2NrZXRQb29sU2VydmVyPiA+JiBzZXJ2ZXJzKTsKKyAgLyoqCisgICAqIFNldHMgaG93IG1hbnkgdGltZXMgdG8ga2VlcCByZXRyeWluZyBhIGhvc3QgaW4gdGhlIGNvbm5lY3QgZnVuY3Rpb24uCisgICAqLworICB2b2lkIHNldE51bVJldHJpZXMoaW50IG51bVJldHJpZXMpOwogCi0gICAvKioKLSAgICAqIFNldHMgaG93IG1hbnkgdGltZXMgdG8ga2VlcCByZXRyeWluZyBhIGhvc3QgaW4gdGhlIGNvbm5lY3QgZnVuY3Rpb24uCi0gICAgKi8KLSAgIHZvaWQgc2V0TnVtUmV0cmllcyhpbnQgbnVtUmV0cmllcyk7CisgIC8qKgorICAgKiBTZXRzIGhvdyBsb25nIHRvIHdhaXQgdW50aWwgcmV0cnlpbmcgYSBob3N0IGlmIGl0IHdhcyBtYXJrZWQgZG93bgorICAgKi8KKyAgdm9pZCBzZXRSZXRyeUludGVydmFsKGludCByZXRyeUludGVydmFsKTsKIAotICAgLyoqCi0gICAgKiBTZXRzIGhvdyBsb25nIHRvIHdhaXQgdW50aWwgcmV0cnlpbmcgYSBob3N0IGlmIGl0IHdhcyBtYXJrZWQgZG93bgotICAgICovCi0gICB2b2lkIHNldFJldHJ5SW50ZXJ2YWwoaW50IHJldHJ5SW50ZXJ2YWwpOworICAvKioKKyAgICogU2V0cyBob3cgbWFueSB0aW1lcyB0byBrZWVwIHJldHJ5aW5nIGEgaG9zdCBiZWZvcmUgbWFya2luZyBpdCBhcyBkb3duLgorICAgKi8KKyAgdm9pZCBzZXRNYXhDb25zZWN1dGl2ZUZhaWx1cmVzKGludCBtYXhDb25zZWN1dGl2ZUZhaWx1cmVzKTsKIAotICAgLyoqCi0gICAgKiBTZXRzIGhvdyBtYW55IHRpbWVzIHRvIGtlZXAgcmV0cnlpbmcgYSBob3N0IGJlZm9yZSBtYXJraW5nIGl0IGFzIGRvd24uCi0gICAgKi8KLSAgIHZvaWQgc2V0TWF4Q29uc2VjdXRpdmVGYWlsdXJlcyhpbnQgbWF4Q29uc2VjdXRpdmVGYWlsdXJlcyk7CisgIC8qKgorICAgKiBUdXJucyByYW5kb21pemF0aW9uIGluIGNvbm5lY3Qgb3JkZXIgb24gb3Igb2ZmLgorICAgKi8KKyAgdm9pZCBzZXRSYW5kb21pemUoYm9vbCByYW5kb21pemUpOwogCi0gICAvKioKLSAgICAqIFR1cm5zIHJhbmRvbWl6YXRpb24gaW4gY29ubmVjdCBvcmRlciBvbiBvciBvZmYuCi0gICAgKi8KLSAgIHZvaWQgc2V0UmFuZG9taXplKGJvb2wgcmFuZG9taXplKTsKKyAgLyoqCisgICAqIFdoZXRoZXIgdG8gYWx3YXlzIHRyeSB0aGUgbGFzdCBzZXJ2ZXIuCisgICAqLworICB2b2lkIHNldEFsd2F5c1RyeUxhc3QoYm9vbCBhbHdheXNUcnlMYXN0KTsKIAotICAgLyoqCi0gICAgKiBXaGV0aGVyIHRvIGFsd2F5cyB0cnkgdGhlIGxhc3Qgc2VydmVyLgotICAgICovCi0gICB2b2lkIHNldEFsd2F5c1RyeUxhc3QoYm9vbCBhbHdheXNUcnlMYXN0KTsKKyAgLyoqCisgICAqIENyZWF0ZXMgYW5kIG9wZW5zIHRoZSBVTklYIHNvY2tldC4KKyAgICovCisgIHZvaWQgb3BlbigpOwogCi0gICAvKioKLSAgICAqIENyZWF0ZXMgYW5kIG9wZW5zIHRoZSBVTklYIHNvY2tldC4KLSAgICAqLwotICAgdm9pZCBvcGVuKCk7CisgIC8qCisgICAqIENsb3NlcyB0aGUgVU5JWCBzb2NrZXQKKyAgICovCisgIHZvaWQgY2xvc2UoKTsKIAotICAgLyoKLSAgICAqIENsb3NlcyB0aGUgVU5JWCBzb2NrZXQKLSAgICAqLwotICAgdm9pZCBjbG9zZSgpOworcHJvdGVjdGVkOgorICB2b2lkIHNldEN1cnJlbnRTZXJ2ZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXRQb29sU2VydmVyPiYgc2VydmVyKTsKIAotIHByb3RlY3RlZDoKLQotICB2b2lkIHNldEN1cnJlbnRTZXJ2ZXIoY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFNvY2tldFBvb2xTZXJ2ZXI+ICZzZXJ2ZXIpOwotCi0gICAvKiogTGlzdCBvZiBzZXJ2ZXJzIHRvIGNvbm5lY3QgdG8gKi8KLSAgc3RkOjp2ZWN0b3I8IGJvb3N0OjpzaGFyZWRfcHRyPFRTb2NrZXRQb29sU2VydmVyPiA+IHNlcnZlcnNfOworICAvKiogTGlzdCBvZiBzZXJ2ZXJzIHRvIGNvbm5lY3QgdG8gKi8KKyAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPFRTb2NrZXRQb29sU2VydmVyPiA+IHNlcnZlcnNfOwogCiAgIC8qKiBDdXJyZW50IHNlcnZlciAqLwotICBib29zdDo6c2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4gY3VycmVudFNlcnZlcl87CisgIHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4gY3VycmVudFNlcnZlcl87CiAKLSAgIC8qKiBIb3cgbWFueSB0aW1lcyB0byByZXRyeSBlYWNoIGhvc3QgaW4gY29ubmVjdCAqLwotICAgaW50IG51bVJldHJpZXNfOworICAvKiogSG93IG1hbnkgdGltZXMgdG8gcmV0cnkgZWFjaCBob3N0IGluIGNvbm5lY3QgKi8KKyAgaW50IG51bVJldHJpZXNfOwogCi0gICAvKiogUmV0cnkgaW50ZXJ2YWwgaW4gc2Vjb25kcywgaG93IGxvbmcgdG8gbm90IHRyeSBhIGhvc3QgaWYgaXQgaGFzIGJlZW4KLSAgICAqIG1hcmtlZCBhcyBkb3duLgotICAgICovCi0gICB0aW1lX3QgcmV0cnlJbnRlcnZhbF87CisgIC8qKiBSZXRyeSBpbnRlcnZhbCBpbiBzZWNvbmRzLCBob3cgbG9uZyB0byBub3QgdHJ5IGEgaG9zdCBpZiBpdCBoYXMgYmVlbgorICAgKiBtYXJrZWQgYXMgZG93bi4KKyAgICovCisgIHRpbWVfdCByZXRyeUludGVydmFsXzsKIAotICAgLyoqIE1heCBjb25zZWN1dGl2ZSBmYWlsdXJlcyBiZWZvcmUgbWFya2luZyBhIGhvc3QgZG93bi4gKi8KLSAgIGludCBtYXhDb25zZWN1dGl2ZUZhaWx1cmVzXzsKKyAgLyoqIE1heCBjb25zZWN1dGl2ZSBmYWlsdXJlcyBiZWZvcmUgbWFya2luZyBhIGhvc3QgZG93bi4gKi8KKyAgaW50IG1heENvbnNlY3V0aXZlRmFpbHVyZXNfOwogCi0gICAvKiogVHJ5IGhvc3RzIGluIG9yZGVyPyBvciBSYW5kb21pemVkPyAqLwotICAgYm9vbCByYW5kb21pemVfOworICAvKiogVHJ5IGhvc3RzIGluIG9yZGVyPyBvciBSYW5kb21pemVkPyAqLworICBib29sIHJhbmRvbWl6ZV87CiAKLSAgIC8qKiBBbHdheXMgdHJ5IGxhc3QgaG9zdCwgZXZlbiBpZiBtYXJrZWQgZG93bj8gKi8KLSAgIGJvb2wgYWx3YXlzVHJ5TGFzdF87CisgIC8qKiBBbHdheXMgdHJ5IGxhc3QgaG9zdCwgZXZlbiBpZiBtYXJrZWQgZG93bj8gKi8KKyAgYm9vbCBhbHdheXNUcnlMYXN0XzsKIH07Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKIAogI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVFNPQ0tFVFBPT0xfSF8KLQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0LmggYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaAppbmRleCA2ZTlhNjk4Li5kODQ0MjM5IDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaApAQCAtMjEsMjUgKzIxLDI2IEBACiAjZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1RUUkFOU1BPUlRfSF8gMQogCiAjaW5jbHVkZSA8dGhyaWZ0L1RocmlmdC5oPgotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5oPgorI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDxzdHJpbmc+CiAKLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHRyYW5zcG9ydCB7CituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CiAKIC8qKgogICogSGVscGVyIHRlbXBsYXRlIHRvIGhvaXN0IHJlYWRBbGwgaW1wbGVtZW50YXRpb24gb3V0IG9mIFRUcmFuc3BvcnQKICAqLwogdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Ci11aW50MzJfdCByZWFkQWxsKFRyYW5zcG9ydF8gJnRyYW5zLCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewordWludDMyX3QgcmVhZEFsbChUcmFuc3BvcnRfJiB0cmFucywgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKICAgdWludDMyX3QgaGF2ZSA9IDA7CiAgIHVpbnQzMl90IGdldCA9IDA7CiAKICAgd2hpbGUgKGhhdmUgPCBsZW4pIHsKLSAgICBnZXQgPSB0cmFucy5yZWFkKGJ1ZitoYXZlLCBsZW4taGF2ZSk7CisgICAgZ2V0ID0gdHJhbnMucmVhZChidWYgKyBoYXZlLCBsZW4gLSBoYXZlKTsKICAgICBpZiAoZ2V0IDw9IDApIHsKLSAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6RU5EX09GX0ZJTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJObyBtb3JlIGRhdGEgdG8gcmVhZC4iKTsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6RU5EX09GX0ZJTEUsICJObyBtb3JlIGRhdGEgdG8gcmVhZC4iKTsKICAgICB9CiAgICAgaGF2ZSArPSBnZXQ7CiAgIH0KQEAgLTQ3LDE0ICs0OCwxMyBAQAogICByZXR1cm4gaGF2ZTsKIH0KIAotCiAvKioKICAqIEdlbmVyaWMgaW50ZXJmYWNlIGZvciBhIG1ldGhvZCBvZiB0cmFuc3BvcnRpbmcgZGF0YS4gQSBUVHJhbnNwb3J0IG1heSBiZQogICogY2FwYWJsZSBvZiBlaXRoZXIgcmVhZGluZyBvciB3cml0aW5nLCBidXQgbm90IG5lY2Vzc2FyaWx5IGJvdGguCiAgKgogICovCiBjbGFzcyBUVHJhbnNwb3J0IHsKLSBwdWJsaWM6CitwdWJsaWM6CiAgIC8qKgogICAgKiBWaXJ0dWFsIGRlY29uc3RydWN0b3IuCiAgICAqLwpAQCAtNjMsOSArNjMsNyBAQAogICAvKioKICAgICogV2hldGhlciB0aGlzIHRyYW5zcG9ydCBpcyBvcGVuLgogICAgKi8KLSAgdmlydHVhbCBib29sIGlzT3BlbigpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KKyAgdmlydHVhbCBib29sIGlzT3BlbigpIHsgcmV0dXJuIGZhbHNlOyB9CiAKICAgLyoqCiAgICAqIFRlc3RzIHdoZXRoZXIgdGhlcmUgaXMgbW9yZSBkYXRhIHRvIHJlYWQgb3IgaWYgdGhlIHJlbW90ZSBzaWRlIGlzCkBAIC03NSw5ICs3Myw3IEBACiAgICAqIFRoaXMgaXMgdXNlZCBieSBhIHNlcnZlciB0byBjaGVjayBpZiBpdCBzaG91bGQgbGlzdGVuIGZvciBhbm90aGVyCiAgICAqIHJlcXVlc3QuCiAgICAqLwotICB2aXJ0dWFsIGJvb2wgcGVlaygpIHsKLSAgICByZXR1cm4gaXNPcGVuKCk7Ci0gIH0KKyAgdmlydHVhbCBib29sIHBlZWsoKSB7IHJldHVybiBpc09wZW4oKTsgfQogCiAgIC8qKgogICAgKiBPcGVucyB0aGUgdHJhbnNwb3J0IGZvciBjb21tdW5pY2F0aW9ucy4KQEAgLTEwOSw4ICsxMDUsNyBAQAogICAgIHJldHVybiByZWFkX3ZpcnQoYnVmLCBsZW4pOwogICB9CiAgIHZpcnR1YWwgdWludDMyX3QgcmVhZF92aXJ0KHVpbnQ4X3QqIC8qIGJ1ZiAqLywgdWludDMyX3QgLyogbGVuICovKSB7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCYXNlIFRUcmFuc3BvcnQgY2Fubm90IHJlYWQuIik7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIkJhc2UgVFRyYW5zcG9ydCBjYW5ub3QgcmVhZC4iKTsKICAgfQogCiAgIC8qKgpAQCAtMTU4LDggKzE1Myw3IEBACiAgICAgd3JpdGVfdmlydChidWYsIGxlbik7CiAgIH0KICAgdmlydHVhbCB2b2lkIHdyaXRlX3ZpcnQoY29uc3QgdWludDhfdCogLyogYnVmICovLCB1aW50MzJfdCAvKiBsZW4gKi8pIHsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJhc2UgVFRyYW5zcG9ydCBjYW5ub3Qgd3JpdGUuIik7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIkJhc2UgVFRyYW5zcG9ydCBjYW5ub3Qgd3JpdGUuIik7CiAgIH0KIAogICAvKioKQEAgLTIxNSw5ICsyMDksNyBAQAogICAgIFRfVklSVFVBTF9DQUxMKCk7CiAgICAgcmV0dXJuIGJvcnJvd192aXJ0KGJ1ZiwgbGVuKTsKICAgfQotICB2aXJ0dWFsIGNvbnN0IHVpbnQ4X3QqIGJvcnJvd192aXJ0KHVpbnQ4X3QqIC8qIGJ1ZiAqLywgdWludDMyX3QqIC8qIGxlbiAqLykgewotICAgIHJldHVybiBOVUxMOwotICB9CisgIHZpcnR1YWwgY29uc3QgdWludDhfdCogYm9ycm93X3ZpcnQodWludDhfdCogLyogYnVmICovLCB1aW50MzJfdCogLyogbGVuICovKSB7IHJldHVybiBOVUxMOyB9CiAKICAgLyoqCiAgICAqIFJlbW92ZSBsZW4gYnl0ZXMgZnJvbSB0aGUgdHJhbnNwb3J0LiAgVGhpcyBzaG91bGQgYWx3YXlzIGZvbGxvdyBhIGJvcnJvdwpAQCAtMjMzLDggKzIyNSw3IEBACiAgICAgY29uc3VtZV92aXJ0KGxlbik7CiAgIH0KICAgdmlydHVhbCB2b2lkIGNvbnN1bWVfdmlydCh1aW50MzJfdCAvKiBsZW4gKi8pIHsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJhc2UgVFRyYW5zcG9ydCBjYW5ub3QgY29uc3VtZS4iKTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiQmFzZSBUVHJhbnNwb3J0IGNhbm5vdCBjb25zdW1lLiIpOwogICB9CiAKICAgLyoqCkBAIC0yNDUsMTEgKzIzNiw5IEBACiAgICAqCiAgICAqIFRoZSByZXR1cm5lZCB2YWx1ZSBjYW4gYmUgdXNlZCBpbiBhIGxvZyBtZXNzYWdlIGZvciBleGFtcGxlCiAgICAqLwotICB2aXJ0dWFsIGNvbnN0IHN0ZDo6c3RyaW5nIGdldE9yaWdpbigpIHsKLSAgICByZXR1cm4gIlVua25vd24iOwotICB9CisgIHZpcnR1YWwgY29uc3Qgc3RkOjpzdHJpbmcgZ2V0T3JpZ2luKCkgeyByZXR1cm4gIlVua25vd24iOyB9CiAKLSBwcm90ZWN0ZWQ6Citwcm90ZWN0ZWQ6CiAgIC8qKgogICAgKiBTaW1wbGUgY29uc3RydWN0b3IuCiAgICAqLwpAQCAtMjYzLDcgKzI1Miw3IEBACiAgKgogICovCiBjbGFzcyBUVHJhbnNwb3J0RmFjdG9yeSB7Ci0gcHVibGljOgorcHVibGljOgogICBUVHJhbnNwb3J0RmFjdG9yeSgpIHt9CiAKICAgdmlydHVhbCB+VFRyYW5zcG9ydEZhY3RvcnkoKSB7fQpAQCAtMjcxLDEyICsyNjAsMTIgQEAKICAgLyoqCiAgICAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLCBqdXN0IHJldHVybnMgdGhlIHRyYW5zcG9ydCBnaXZlbi4KICAgICovCi0gIHZpcnR1YWwgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZ2V0VHJhbnNwb3J0KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKSB7CisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldFRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMpIHsKICAgICByZXR1cm4gdHJhbnM7CiAgIH0KLQogfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAogCiAjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UVFJBTlNQT1JUX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmNwcAppbmRleCAyYjE0MzBjLi5hNTI3MzE3IDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uY3BwCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5jcHAKQEAgLTE4LDMzICsxOCw0MiBAQAogICovCiAKICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uaD4KLSNpbmNsdWRlIDxib29zdC9sZXhpY2FsX2Nhc3QuaHBwPgogI2luY2x1ZGUgPGNzdHJpbmc+CiAKICNpbmNsdWRlIDx0aHJpZnQvdGhyaWZ0LWNvbmZpZy5oPgogCiB1c2luZyBzdGQ6OnN0cmluZzsKLXVzaW5nIGJvb3N0OjpsZXhpY2FsX2Nhc3Q7CiAKLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHRyYW5zcG9ydCB7CituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CiAKLSAgY29uc3QgY2hhciogVFRyYW5zcG9ydEV4Y2VwdGlvbjo6d2hhdCgpIGNvbnN0IHRocm93KCkgewotICAgIGlmIChtZXNzYWdlXy5lbXB0eSgpKSB7Ci0gICAgICBzd2l0Y2ggKHR5cGVfKSB7Ci0gICAgICAgIGNhc2UgVU5LTk9XTiAgICAgICAgOiByZXR1cm4gIlRUcmFuc3BvcnRFeGNlcHRpb246IFVua25vd24gdHJhbnNwb3J0IGV4Y2VwdGlvbiI7Ci0gICAgICAgIGNhc2UgTk9UX09QRU4gICAgICAgOiByZXR1cm4gIlRUcmFuc3BvcnRFeGNlcHRpb246IFRyYW5zcG9ydCBub3Qgb3BlbiI7Ci0gICAgICAgIGNhc2UgVElNRURfT1VUICAgICAgOiByZXR1cm4gIlRUcmFuc3BvcnRFeGNlcHRpb246IFRpbWVkIG91dCI7Ci0gICAgICAgIGNhc2UgRU5EX09GX0ZJTEUgICAgOiByZXR1cm4gIlRUcmFuc3BvcnRFeGNlcHRpb246IEVuZCBvZiBmaWxlIjsKLSAgICAgICAgY2FzZSBJTlRFUlJVUFRFRCAgICA6IHJldHVybiAiVFRyYW5zcG9ydEV4Y2VwdGlvbjogSW50ZXJydXB0ZWQiOwotICAgICAgICBjYXNlIEJBRF9BUkdTICAgICAgIDogcmV0dXJuICJUVHJhbnNwb3J0RXhjZXB0aW9uOiBJbnZhbGlkIGFyZ3VtZW50cyI7Ci0gICAgICAgIGNhc2UgQ09SUlVQVEVEX0RBVEEgOiByZXR1cm4gIlRUcmFuc3BvcnRFeGNlcHRpb246IENvcnJ1cHRlZCBEYXRhIjsKLSAgICAgICAgY2FzZSBJTlRFUk5BTF9FUlJPUiA6IHJldHVybiAiVFRyYW5zcG9ydEV4Y2VwdGlvbjogSW50ZXJuYWwgZXJyb3IiOwotICAgICAgICBkZWZhdWx0ICAgICAgICAgICAgIDogcmV0dXJuICJUVHJhbnNwb3J0RXhjZXB0aW9uOiAoSW52YWxpZCBleGNlcHRpb24gdHlwZSkiOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gbWVzc2FnZV8uY19zdHIoKTsKK2NvbnN0IGNoYXIqIFRUcmFuc3BvcnRFeGNlcHRpb246OndoYXQoKSBjb25zdCBub2V4Y2VwdCB7CisgIGlmIChtZXNzYWdlXy5lbXB0eSgpKSB7CisgICAgc3dpdGNoICh0eXBlXykgeworICAgIGNhc2UgVU5LTk9XTjoKKyAgICAgIHJldHVybiAiVFRyYW5zcG9ydEV4Y2VwdGlvbjogVW5rbm93biB0cmFuc3BvcnQgZXhjZXB0aW9uIjsKKyAgICBjYXNlIE5PVF9PUEVOOgorICAgICAgcmV0dXJuICJUVHJhbnNwb3J0RXhjZXB0aW9uOiBUcmFuc3BvcnQgbm90IG9wZW4iOworICAgIGNhc2UgVElNRURfT1VUOgorICAgICAgcmV0dXJuICJUVHJhbnNwb3J0RXhjZXB0aW9uOiBUaW1lZCBvdXQiOworICAgIGNhc2UgRU5EX09GX0ZJTEU6CisgICAgICByZXR1cm4gIlRUcmFuc3BvcnRFeGNlcHRpb246IEVuZCBvZiBmaWxlIjsKKyAgICBjYXNlIElOVEVSUlVQVEVEOgorICAgICAgcmV0dXJuICJUVHJhbnNwb3J0RXhjZXB0aW9uOiBJbnRlcnJ1cHRlZCI7CisgICAgY2FzZSBCQURfQVJHUzoKKyAgICAgIHJldHVybiAiVFRyYW5zcG9ydEV4Y2VwdGlvbjogSW52YWxpZCBhcmd1bWVudHMiOworICAgIGNhc2UgQ09SUlVQVEVEX0RBVEE6CisgICAgICByZXR1cm4gIlRUcmFuc3BvcnRFeGNlcHRpb246IENvcnJ1cHRlZCBEYXRhIjsKKyAgICBjYXNlIElOVEVSTkFMX0VSUk9SOgorICAgICAgcmV0dXJuICJUVHJhbnNwb3J0RXhjZXB0aW9uOiBJbnRlcm5hbCBlcnJvciI7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAiVFRyYW5zcG9ydEV4Y2VwdGlvbjogKEludmFsaWQgZXhjZXB0aW9uIHR5cGUpIjsKICAgICB9CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIG1lc3NhZ2VfLmNfc3RyKCk7CiAgIH0KLQotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAorfQorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uaCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5oCmluZGV4IDg1NTg4MzcuLmZiNWYwMGMgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5oCkBAIC0yMCwxMCArMjAsMTMgQEAKICNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVFRSQU5TUE9SVEVYQ0VQVElPTl9IXwogI2RlZmluZSBfVEhSSUZUX1RSQU5TUE9SVF9UVFJBTlNQT1JURVhDRVBUSU9OX0hfIDEKIAorI2luY2x1ZGUgPGJvb3N0L251bWVyaWMvY29udmVyc2lvbi9jYXN0LmhwcD4KICNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8dGhyaWZ0L1RocmlmdC5oPgogCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0cmFuc3BvcnQgeworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgewogCiAvKioKICAqIENsYXNzIHRvIGVuY2Fwc3VsYXRlIGFsbCB0aGUgcG9zc2libGUgdHlwZXMgb2YgdHJhbnNwb3J0IGVycm9ycyB0aGF0IG1heQpAQCAtMzQsNDQgKzM3LDM1IEBACiAgKgogICovCiBjbGFzcyBUVHJhbnNwb3J0RXhjZXB0aW9uIDogcHVibGljIGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uIHsKLSBwdWJsaWM6CitwdWJsaWM6CiAgIC8qKgogICAgKiBFcnJvciBjb2RlcyBmb3IgdGhlIHZhcmlvdXMgdHlwZXMgb2YgZXhjZXB0aW9ucy4KICAgICovCi0gIGVudW0gVFRyYW5zcG9ydEV4Y2VwdGlvblR5cGUKLSAgeyBVTktOT1dOID0gMAotICAsIE5PVF9PUEVOID0gMQotICAsIFRJTUVEX09VVCA9IDIKLSAgLCBFTkRfT0ZfRklMRSA9IDMKLSAgLCBJTlRFUlJVUFRFRCA9IDQKLSAgLCBCQURfQVJHUyA9IDUKLSAgLCBDT1JSVVBURURfREFUQSA9IDYKLSAgLCBJTlRFUk5BTF9FUlJPUiA9IDcKKyAgZW51bSBUVHJhbnNwb3J0RXhjZXB0aW9uVHlwZSB7CisgICAgVU5LTk9XTiA9IDAsCisgICAgTk9UX09QRU4gPSAxLAorICAgIFRJTUVEX09VVCA9IDIsCisgICAgRU5EX09GX0ZJTEUgPSAzLAorICAgIElOVEVSUlVQVEVEID0gNCwKKyAgICBCQURfQVJHUyA9IDUsCisgICAgQ09SUlVQVEVEX0RBVEEgPSA2LAorICAgIElOVEVSTkFMX0VSUk9SID0gNwogICB9OwogCi0gIFRUcmFuc3BvcnRFeGNlcHRpb24oKSA6Ci0gICAgYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24oKSwKLSAgICB0eXBlXyhVTktOT1dOKSB7fQorICBUVHJhbnNwb3J0RXhjZXB0aW9uKCkgOiBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbigpLCB0eXBlXyhVTktOT1dOKSB7fQogCi0gIFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvblR5cGUgdHlwZSkgOgotICAgIGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uKCksCi0gICAgdHlwZV8odHlwZSkge30KKyAgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uVHlwZSB0eXBlKSA6IGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uKCksIHR5cGVfKHR5cGUpIHt9CiAKLSAgVFRyYW5zcG9ydEV4Y2VwdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkgOgotICAgIGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uKG1lc3NhZ2UpLAotICAgIHR5cGVfKFVOS05PV04pIHt9CisgIFRUcmFuc3BvcnRFeGNlcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpCisgICAgOiBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbihtZXNzYWdlKSwgdHlwZV8oVU5LTk9XTikge30KIAotICBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb25UeXBlIHR5cGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSA6Ci0gICAgYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24obWVzc2FnZSksCi0gICAgdHlwZV8odHlwZSkge30KKyAgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uVHlwZSB0eXBlLCBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkKKyAgICA6IGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uKG1lc3NhZ2UpLCB0eXBlXyh0eXBlKSB7fQogCi0gIFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvblR5cGUgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJybm9fY29weSkgOgotICAgIGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uKG1lc3NhZ2UgKyAiOiAiICsgVE91dHB1dDo6c3RyZXJyb3JfcyhlcnJub19jb3B5KSksCi0gICAgdHlwZV8odHlwZSkge30KKyAgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uVHlwZSB0eXBlLCBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSwgaW50IGVycm5vX2NvcHkpCisgICAgOiBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbihtZXNzYWdlICsgIjogIiArIFRPdXRwdXQ6OnN0cmVycm9yX3MoZXJybm9fY29weSkpLCB0eXBlXyh0eXBlKSB7fQogCi0gIHZpcnR1YWwgflRUcmFuc3BvcnRFeGNlcHRpb24oKSB0aHJvdygpIHt9CisgIHZpcnR1YWwgflRUcmFuc3BvcnRFeGNlcHRpb24oKSBub2V4Y2VwdCB7fQogCiAgIC8qKgogICAgKiBSZXR1cm5zIGFuIGVycm9yIGNvZGUgdGhhdCBwcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdHlwZSBvZiBlcnJvcgpAQCAtNzksMjEgKzczLDM0IEBACiAgICAqCiAgICAqIEByZXR1cm4gRXJyb3IgY29kZQogICAgKi8KLSAgVFRyYW5zcG9ydEV4Y2VwdGlvblR5cGUgZ2V0VHlwZSgpIGNvbnN0IHRocm93KCkgewotICAgIHJldHVybiB0eXBlXzsKLSAgfQorICBUVHJhbnNwb3J0RXhjZXB0aW9uVHlwZSBnZXRUeXBlKCkgY29uc3Qgbm9leGNlcHQgeyByZXR1cm4gdHlwZV87IH0KIAotICB2aXJ0dWFsIGNvbnN0IGNoYXIqIHdoYXQoKSBjb25zdCB0aHJvdygpOworICB2aXJ0dWFsIGNvbnN0IGNoYXIqIHdoYXQoKSBjb25zdCBub2V4Y2VwdDsKIAotIHByb3RlY3RlZDoKK3Byb3RlY3RlZDoKICAgLyoqIEp1c3QgbGlrZSBzdHJlcnJvcl9yIGJ1dCByZXR1cm5zIGEgQysrIHN0cmluZyBvYmplY3QuICovCiAgIHN0ZDo6c3RyaW5nIHN0cmVycm9yX3MoaW50IGVycm5vX2NvcHkpOwogCiAgIC8qKiBFcnJvciBjb2RlICovCiAgIFRUcmFuc3BvcnRFeGNlcHRpb25UeXBlIHR5cGVfOwotCiB9OwogCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAorLyoqCisgKiBMZWdhY3kgY29kZSBpbiB0cmFuc3BvcnQgaW1wbGVtZW50YXRpb25zIGhhdmUgb3ZlcmZsb3cgaXNzdWVzCisgKiB0aGF0IG5lZWQgdG8gYmUgZW5mb3JjZWQuCisgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBUbywgdHlwZW5hbWUgRnJvbT4gVG8gc2FmZV9udW1lcmljX2Nhc3QoRnJvbSBpKSB7CisgIHRyeSB7CisgICAgcmV0dXJuIGJvb3N0OjpudW1lcmljX2Nhc3Q8VG8+KGkpOworICB9CisgIGNhdGNoIChjb25zdCBzdGQ6OmJhZF9jYXN0JiBiYykgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Q09SUlVQVEVEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYy53aGF0KCkpOworICB9Cit9CisKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAogCiAjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UVFJBTlNQT1JURVhDRVBUSU9OX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRVdGlscy5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRVdGlscy5jcHAKaW5kZXggNDRmNjEwMS4uNmY0N2M3OSAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0VXRpbHMuY3BwCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmNwcApAQCAtMjEsMzkgKzIxLDQ0IEBACiAKIHVzaW5nIHN0ZDo6c3RyaW5nOwogCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0cmFuc3BvcnQgeworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgewogCiB1aW50MzJfdCBUUGlwZWRUcmFuc3BvcnQ6OnJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKICAgdWludDMyX3QgbmVlZCA9IGxlbjsKIAogICAvLyBXZSBkb24ndCBoYXZlIGVub3VnaCBkYXRhIHlldAotICBpZiAockxlbl8tclBvc18gPCBuZWVkKSB7CisgIGlmIChyTGVuXyAtIHJQb3NfIDwgbmVlZCkgewogICAgIC8vIENvcHkgb3V0IHdoYXRldmVyIHdlIGhhdmUKLSAgICBpZiAockxlbl8tclBvc18gPiAwKSB7Ci0gICAgICBtZW1jcHkoYnVmLCByQnVmXytyUG9zXywgckxlbl8tclBvc18pOwotICAgICAgbmVlZCAtPSByTGVuXy1yUG9zXzsKLSAgICAgIGJ1ZiArPSByTGVuXy1yUG9zXzsKKyAgICBpZiAockxlbl8gLSByUG9zXyA+IDApIHsKKyAgICAgIG1lbWNweShidWYsIHJCdWZfICsgclBvc18sIHJMZW5fIC0gclBvc18pOworICAgICAgbmVlZCAtPSByTGVuXyAtIHJQb3NfOworICAgICAgYnVmICs9IHJMZW5fIC0gclBvc187CiAgICAgICByUG9zXyA9IHJMZW5fOwogICAgIH0KIAogICAgIC8vIERvdWJsZSB0aGUgc2l6ZSBvZiB0aGUgdW5kZXJseWluZyBidWZmZXIgaWYgaXQgaXMgZnVsbAogICAgIGlmIChyTGVuXyA9PSByQnVmU2l6ZV8pIHsKLSAgICAgIHJCdWZTaXplXyAqPTI7Ci0gICAgICByQnVmXyA9ICh1aW50OF90ICopc3RkOjpyZWFsbG9jKHJCdWZfLCBzaXplb2YodWludDhfdCkgKiByQnVmU2l6ZV8pOworICAgICAgckJ1ZlNpemVfICo9IDI7CisgICAgICB1aW50OF90ICp0bXBCdWYgPSAodWludDhfdCopc3RkOjpyZWFsbG9jKHJCdWZfLCBzaXplb2YodWludDhfdCkgKiByQnVmU2l6ZV8pOworICAgICAgaWYgKHRtcEJ1ZiA9PSBOVUxMKSB7CisgICAgICAgdGhyb3cgc3RkOjpiYWRfYWxsb2MoKTsKKyAgICAgIH0KKyAgICAgIHJCdWZfID0gdG1wQnVmOwogICAgIH0KIAogICAgIC8vIHRyeSB0byBmaWxsIHVwIHRoZSBidWZmZXIKLSAgICByTGVuXyArPSBzcmNUcmFuc18tPnJlYWQockJ1Zl8rclBvc18sIHJCdWZTaXplXyAtIHJQb3NfKTsKKyAgICByTGVuXyArPSBzcmNUcmFuc18tPnJlYWQockJ1Zl8gKyByUG9zXywgckJ1ZlNpemVfIC0gclBvc18pOwogICB9CiAKLQogICAvLyBIYW5kIG92ZXIgd2hhdGV2ZXIgd2UgaGF2ZQogICB1aW50MzJfdCBnaXZlID0gbmVlZDsKLSAgaWYgKHJMZW5fLXJQb3NfIDwgZ2l2ZSkgewotICAgIGdpdmUgPSByTGVuXy1yUG9zXzsKKyAgaWYgKHJMZW5fIC0gclBvc18gPCBnaXZlKSB7CisgICAgZ2l2ZSA9IHJMZW5fIC0gclBvc187CiAgIH0KICAgaWYgKGdpdmUgPiAwKSB7Ci0gICAgbWVtY3B5KGJ1ZiwgckJ1Zl8rclBvc18sIGdpdmUpOworICAgIG1lbWNweShidWYsIHJCdWZfICsgclBvc18sIGdpdmUpOwogICAgIHJQb3NfICs9IGdpdmU7CiAgICAgbmVlZCAtPSBnaXZlOwogICB9CkBAIC02OCwxMSArNzMsMTYgQEAKIAogICAvLyBNYWtlIHRoZSBidWZmZXIgYXMgYmlnIGFzIGl0IG5lZWRzIHRvIGJlCiAgIGlmICgobGVuICsgd0xlbl8pID49IHdCdWZTaXplXykgewotICAgIHVpbnQzMl90IG5ld0J1ZlNpemUgPSB3QnVmU2l6ZV8qMjsKKyAgICB1aW50MzJfdCBuZXdCdWZTaXplID0gd0J1ZlNpemVfICogMjsKICAgICB3aGlsZSAoKGxlbiArIHdMZW5fKSA+PSBuZXdCdWZTaXplKSB7CiAgICAgICBuZXdCdWZTaXplICo9IDI7CiAgICAgfQotICAgIHdCdWZfID0gKHVpbnQ4X3QgKilzdGQ6OnJlYWxsb2Mod0J1Zl8sIHNpemVvZih1aW50OF90KSAqIG5ld0J1ZlNpemUpOworICAgIHVpbnQ4X3QgKnRtcEJ1Zj0gKHVpbnQ4X3QqKXN0ZDo6cmVhbGxvYyh3QnVmXywgc2l6ZW9mKHVpbnQ4X3QpICogbmV3QnVmU2l6ZSk7CisgICAgaWYgKHRtcEJ1ZiA9PSBOVUxMKSB7CisgICAgICB0aHJvdyBzdGQ6OmJhZF9hbGxvYygpOworICAgIH0KKyAgICB3QnVmXyA9IHRtcEJ1ZjsKKwogICAgIHdCdWZTaXplXyA9IG5ld0J1ZlNpemU7CiAgIH0KIApAQCAtODEsNyArOTEsNyBAQAogICB3TGVuXyArPSBsZW47CiB9CiAKLXZvaWQgVFBpcGVkVHJhbnNwb3J0OjpmbHVzaCgpICB7Cit2b2lkIFRQaXBlZFRyYW5zcG9ydDo6Zmx1c2goKSB7CiAgIC8vIFdyaXRlIG91dCBhbnkgZGF0YSB3YWl0aW5nIGluIHRoZSB3cml0ZSBidWZmZXIKICAgaWYgKHdMZW5fID4gMCkgewogICAgIHNyY1RyYW5zXy0+d3JpdGUod0J1Zl8sIHdMZW5fKTsKQEAgLTkyLDkgKzEwMiwxMCBAQAogICBzcmNUcmFuc18tPmZsdXNoKCk7CiB9CiAKLVRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQ6OlRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQoYm9vc3Q6OnNoYXJlZF9wdHI8VEZpbGVSZWFkZXJUcmFuc3BvcnQ+IHNyY1RyYW5zLCBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBkc3RUcmFucykKLSAgOiBUUGlwZWRUcmFuc3BvcnQoc3JjVHJhbnMsIGRzdFRyYW5zKSwKLSAgICBzcmNUcmFuc18oc3JjVHJhbnMpIHsKK1RQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQ6OlRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQoCisgICAgc3RkOjpzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PiBzcmNUcmFucywKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZHN0VHJhbnMpCisgIDogVFBpcGVkVHJhbnNwb3J0KHNyY1RyYW5zLCBkc3RUcmFucyksIHNyY1RyYW5zXyhzcmNUcmFucykgewogfQogCiBUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0Ojp+VFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydCgpIHsKQEAgLTEyNSw3ICsxMzYsNyBAQAogICB1aW50MzJfdCBnZXQgPSAwOwogCiAgIHdoaWxlIChoYXZlIDwgbGVuKSB7Ci0gICAgZ2V0ID0gcmVhZChidWYraGF2ZSwgbGVuLWhhdmUpOworICAgIGdldCA9IHJlYWQoYnVmICsgaGF2ZSwgbGVuIC0gaGF2ZSk7CiAgICAgaWYgKGdldCA8PSAwKSB7CiAgICAgICB0aHJvdyBURU9GRXhjZXB0aW9uKCk7CiAgICAgfQpAQCAtMTc0LDUgKzE4NSw2IEBACiB2b2lkIFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQ6OnNlZWtUb0VuZCgpIHsKICAgc3JjVHJhbnNfLT5zZWVrVG9FbmQoKTsKIH0KLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0VXRpbHMuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmgKaW5kZXggYWEyOTRiNC4uNGM4MmRkMyAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0VXRpbHMuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRVdGlscy5oCkBAIC0yOSw3ICsyOSw5IEBACiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEZpbGVUcmFuc3BvcnQuaD4KIAotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKIAogLyoqCiAgKiBUaGUgbnVsbCB0cmFuc3BvcnQgaXMgYSBkdW1teSB0cmFuc3BvcnQgdGhhdCBkb2Vzbid0IGFjdHVhbGx5IGRvIGFueXRoaW5nLgpAQCAtMzksMjQgKzQxLDE4IEBACiAgKgogICovCiBjbGFzcyBUTnVsbFRyYW5zcG9ydCA6IHB1YmxpYyBUVmlydHVhbFRyYW5zcG9ydDxUTnVsbFRyYW5zcG9ydD4gewotIHB1YmxpYzoKK3B1YmxpYzoKICAgVE51bGxUcmFuc3BvcnQoKSB7fQogCiAgIH5UTnVsbFRyYW5zcG9ydCgpIHt9CiAKLSAgYm9vbCBpc09wZW4oKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KKyAgYm9vbCBpc09wZW4oKSB7IHJldHVybiB0cnVlOyB9CiAKICAgdm9pZCBvcGVuKCkge30KIAotICB2b2lkIHdyaXRlKGNvbnN0IHVpbnQ4X3QqIC8qIGJ1ZiAqLywgdWludDMyX3QgLyogbGVuICovKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KKyAgdm9pZCB3cml0ZShjb25zdCB1aW50OF90KiAvKiBidWYgKi8sIHVpbnQzMl90IC8qIGxlbiAqLykgeyByZXR1cm47IH0KIH07CiAKLQogLyoqCiAgKiBUUGlwZWRUcmFuc3BvcnQuIFRoaXMgdHJhbnNwb3J0IGFsbG93cyBwaXBpbmcgb2YgYSByZXF1ZXN0IGZyb20gb25lCiAgKiB0cmFuc3BvcnQgdG8gYW5vdGhlciBlaXRoZXIgd2hlbiByZWFkRW5kKCkgb3Igd3JpdGVFbmQoKS4gVGhlIHR5cGljYWwKQEAgLTY2LDQxICs2Miw0NiBAQAogICoKICAqLwogY2xhc3MgVFBpcGVkVHJhbnNwb3J0IDogdmlydHVhbCBwdWJsaWMgVFRyYW5zcG9ydCB7Ci0gcHVibGljOgotICBUUGlwZWRUcmFuc3BvcnQoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gc3JjVHJhbnMsCi0gICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBkc3RUcmFucykgOgotICAgIHNyY1RyYW5zXyhzcmNUcmFucyksCi0gICAgZHN0VHJhbnNfKGRzdFRyYW5zKSwKLSAgICByQnVmU2l6ZV8oNTEyKSwgclBvc18oMCksIHJMZW5fKDApLAotICAgIHdCdWZTaXplXyg1MTIpLCB3TGVuXygwKSB7CitwdWJsaWM6CisgIFRQaXBlZFRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gc3JjVHJhbnMsIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBkc3RUcmFucykKKyAgICA6IHNyY1RyYW5zXyhzcmNUcmFucyksCisgICAgICBkc3RUcmFuc18oZHN0VHJhbnMpLAorICAgICAgckJ1ZlNpemVfKDUxMiksCisgICAgICByUG9zXygwKSwKKyAgICAgIHJMZW5fKDApLAorICAgICAgd0J1ZlNpemVfKDUxMiksCisgICAgICB3TGVuXygwKSB7CiAKICAgICAvLyBkZWZhdWx0IGlzIHRvIHRvIHBpcGUgdGhlIHJlcXVlc3Qgd2hlbiByZWFkRW5kKCkgaXMgY2FsbGVkCiAgICAgcGlwZU9uUmVhZF8gPSB0cnVlOwogICAgIHBpcGVPbldyaXRlXyA9IGZhbHNlOwogCi0gICAgckJ1Zl8gPSAodWludDhfdCopIHN0ZDo6bWFsbG9jKHNpemVvZih1aW50OF90KSAqIHJCdWZTaXplXyk7CisgICAgckJ1Zl8gPSAodWludDhfdCopc3RkOjptYWxsb2Moc2l6ZW9mKHVpbnQ4X3QpICogckJ1ZlNpemVfKTsKICAgICBpZiAockJ1Zl8gPT0gTlVMTCkgewogICAgICAgdGhyb3cgc3RkOjpiYWRfYWxsb2MoKTsKICAgICB9Ci0gICAgd0J1Zl8gPSAodWludDhfdCopIHN0ZDo6bWFsbG9jKHNpemVvZih1aW50OF90KSAqIHdCdWZTaXplXyk7CisgICAgd0J1Zl8gPSAodWludDhfdCopc3RkOjptYWxsb2Moc2l6ZW9mKHVpbnQ4X3QpICogd0J1ZlNpemVfKTsKICAgICBpZiAod0J1Zl8gPT0gTlVMTCkgewogICAgICAgdGhyb3cgc3RkOjpiYWRfYWxsb2MoKTsKICAgICB9CiAgIH0KIAotICBUUGlwZWRUcmFuc3BvcnQoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gc3JjVHJhbnMsCi0gICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBkc3RUcmFucywKLSAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN6KSA6Ci0gICAgc3JjVHJhbnNfKHNyY1RyYW5zKSwKLSAgICBkc3RUcmFuc18oZHN0VHJhbnMpLAotICAgIHJCdWZTaXplXyg1MTIpLCByUG9zXygwKSwgckxlbl8oMCksCi0gICAgd0J1ZlNpemVfKHN6KSwgd0xlbl8oMCkgeworICBUUGlwZWRUcmFuc3BvcnQoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHNyY1RyYW5zLAorICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGRzdFRyYW5zLAorICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3opCisgICAgOiBzcmNUcmFuc18oc3JjVHJhbnMpLAorICAgICAgZHN0VHJhbnNfKGRzdFRyYW5zKSwKKyAgICAgIHJCdWZTaXplXyg1MTIpLAorICAgICAgclBvc18oMCksCisgICAgICByTGVuXygwKSwKKyAgICAgIHdCdWZTaXplXyhzeiksCisgICAgICB3TGVuXygwKSB7CiAKLSAgICByQnVmXyA9ICh1aW50OF90Kikgc3RkOjptYWxsb2Moc2l6ZW9mKHVpbnQ4X3QpICogckJ1ZlNpemVfKTsKKyAgICByQnVmXyA9ICh1aW50OF90KilzdGQ6Om1hbGxvYyhzaXplb2YodWludDhfdCkgKiByQnVmU2l6ZV8pOwogICAgIGlmIChyQnVmXyA9PSBOVUxMKSB7CiAgICAgICB0aHJvdyBzdGQ6OmJhZF9hbGxvYygpOwogICAgIH0KLSAgICB3QnVmXyA9ICh1aW50OF90Kikgc3RkOjptYWxsb2Moc2l6ZW9mKHVpbnQ4X3QpICogd0J1ZlNpemVfKTsKKyAgICB3QnVmXyA9ICh1aW50OF90KilzdGQ6Om1hbGxvYyhzaXplb2YodWludDhfdCkgKiB3QnVmU2l6ZV8pOwogICAgIGlmICh3QnVmXyA9PSBOVUxMKSB7CiAgICAgICB0aHJvdyBzdGQ6OmJhZF9hbGxvYygpOwogICAgIH0KQEAgLTExMSw0MCArMTEyLDMzIEBACiAgICAgc3RkOjpmcmVlKHdCdWZfKTsKICAgfQogCi0gIGJvb2wgaXNPcGVuKCkgewotICAgIHJldHVybiBzcmNUcmFuc18tPmlzT3BlbigpOwotICB9CisgIGJvb2wgaXNPcGVuKCkgeyByZXR1cm4gc3JjVHJhbnNfLT5pc09wZW4oKTsgfQogCiAgIGJvb2wgcGVlaygpIHsKICAgICBpZiAoclBvc18gPj0gckxlbl8pIHsKICAgICAgIC8vIERvdWJsZSB0aGUgc2l6ZSBvZiB0aGUgdW5kZXJseWluZyBidWZmZXIgaWYgaXQgaXMgZnVsbAogICAgICAgaWYgKHJMZW5fID09IHJCdWZTaXplXykgewotICAgICAgICByQnVmU2l6ZV8gKj0yOwotICAgICAgICByQnVmXyA9ICh1aW50OF90ICopc3RkOjpyZWFsbG9jKHJCdWZfLCBzaXplb2YodWludDhfdCkgKiByQnVmU2l6ZV8pOworICAgICAgICByQnVmU2l6ZV8gKj0gMjsKKyAgICAgICAgdWludDhfdCAqIHRtcEJ1ZiA9ICh1aW50OF90KilzdGQ6OnJlYWxsb2MockJ1Zl8sIHNpemVvZih1aW50OF90KSAqIHJCdWZTaXplXyk7CisJaWYgKHRtcEJ1ZiA9PSBOVUxMKSB7CisJICB0aHJvdyBzdGQ6OmJhZF9hbGxvYygpOworCX0KKwlyQnVmXyA9IHRtcEJ1ZjsKICAgICAgIH0KIAogICAgICAgLy8gdHJ5IHRvIGZpbGwgdXAgdGhlIGJ1ZmZlcgotICAgICAgckxlbl8gKz0gc3JjVHJhbnNfLT5yZWFkKHJCdWZfK3JQb3NfLCByQnVmU2l6ZV8gLSByUG9zXyk7CisgICAgICByTGVuXyArPSBzcmNUcmFuc18tPnJlYWQockJ1Zl8gKyByUG9zXywgckJ1ZlNpemVfIC0gclBvc18pOwogICAgIH0KICAgICByZXR1cm4gKHJMZW5fID4gclBvc18pOwogICB9CiAKKyAgdm9pZCBvcGVuKCkgeyBzcmNUcmFuc18tPm9wZW4oKTsgfQogCi0gIHZvaWQgb3BlbigpIHsKLSAgICBzcmNUcmFuc18tPm9wZW4oKTsKLSAgfQorICB2b2lkIGNsb3NlKCkgeyBzcmNUcmFuc18tPmNsb3NlKCk7IH0KIAotICB2b2lkIGNsb3NlKCkgewotICAgIHNyY1RyYW5zXy0+Y2xvc2UoKTsKLSAgfQorICB2b2lkIHNldFBpcGVPblJlYWQoYm9vbCBwaXBlVmFsKSB7IHBpcGVPblJlYWRfID0gcGlwZVZhbDsgfQogCi0gIHZvaWQgc2V0UGlwZU9uUmVhZChib29sIHBpcGVWYWwpIHsKLSAgICBwaXBlT25SZWFkXyA9IHBpcGVWYWw7Ci0gIH0KLQotICB2b2lkIHNldFBpcGVPbldyaXRlKGJvb2wgcGlwZVZhbCkgewotICAgIHBpcGVPbldyaXRlXyA9IHBpcGVWYWw7Ci0gIH0KKyAgdm9pZCBzZXRQaXBlT25Xcml0ZShib29sIHBpcGVWYWwpIHsgcGlwZU9uV3JpdGVfID0gcGlwZVZhbDsgfQogCiAgIHVpbnQzMl90IHJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOwogCkBAIC0xODAsMjUgKzE3NCwxOSBAQAogCiAgIHZvaWQgZmx1c2goKTsKIAotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRUYXJnZXRUcmFuc3BvcnQoKSB7Ci0gICAgcmV0dXJuIGRzdFRyYW5zXzsKLSAgfQorICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZ2V0VGFyZ2V0VHJhbnNwb3J0KCkgeyByZXR1cm4gZHN0VHJhbnNfOyB9CiAKICAgLyoKICAgICogT3ZlcnJpZGUgVFRyYW5zcG9ydCAqX3ZpcnQoKSBmdW5jdGlvbnMgdG8gaW52b2tlIG91ciBpbXBsZW1lbnRhdGlvbnMuCiAgICAqIFdlIGNhbm5vdCB1c2UgVFZpcnR1YWxUcmFuc3BvcnQgdG8gcHJvdmlkZSB0aGVzZSwgc2luY2Ugd2UgbmVlZCB0byBpbmhlcml0CiAgICAqIHZpcnR1YWxseSBmcm9tIFRUcmFuc3BvcnQuCiAgICAqLwotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRfdmlydCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewotICAgIHJldHVybiB0aGlzLT5yZWFkKGJ1ZiwgbGVuKTsKLSAgfQotICB2aXJ0dWFsIHZvaWQgd3JpdGVfdmlydChjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewotICAgIHRoaXMtPndyaXRlKGJ1ZiwgbGVuKTsKLSAgfQorICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRfdmlydCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeyByZXR1cm4gdGhpcy0+cmVhZChidWYsIGxlbik7IH0KKyAgdmlydHVhbCB2b2lkIHdyaXRlX3ZpcnQoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsgdGhpcy0+d3JpdGUoYnVmLCBsZW4pOyB9CiAKLSBwcm90ZWN0ZWQ6Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHNyY1RyYW5zXzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZHN0VHJhbnNfOworcHJvdGVjdGVkOgorICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gc3JjVHJhbnNfOworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZHN0VHJhbnNfOwogCiAgIHVpbnQ4X3QqIHJCdWZfOwogICB1aW50MzJfdCByQnVmU2l6ZV87CkBAIC0yMTMsMTUgKzIwMSwxNCBAQAogICBib29sIHBpcGVPbldyaXRlXzsKIH07CiAKLQogLyoqCiAgKiBXcmFwcyBhIHRyYW5zcG9ydCBpbnRvIGEgcGlwZWRUcmFuc3BvcnQgaW5zdGFuY2UuCiAgKgogICovCiBjbGFzcyBUUGlwZWRUcmFuc3BvcnRGYWN0b3J5IDogcHVibGljIFRUcmFuc3BvcnRGYWN0b3J5IHsKLSBwdWJsaWM6CitwdWJsaWM6CiAgIFRQaXBlZFRyYW5zcG9ydEZhY3RvcnkoKSB7fQotICBUUGlwZWRUcmFuc3BvcnRGYWN0b3J5KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGRzdFRyYW5zKSB7CisgIFRQaXBlZFRyYW5zcG9ydEZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGRzdFRyYW5zKSB7CiAgICAgaW5pdGlhbGl6ZVRhcmdldFRyYW5zcG9ydChkc3RUcmFucyk7CiAgIH0KICAgdmlydHVhbCB+VFBpcGVkVHJhbnNwb3J0RmFjdG9yeSgpIHt9CkBAIC0yMjksMTEgKzIxNiwxMSBAQAogICAvKioKICAgICogV3JhcHMgdGhlIGJhc2UgdHJhbnNwb3J0IGludG8gYSBwaXBlZCB0cmFuc3BvcnQuCiAgICAqLwotICB2aXJ0dWFsIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldFRyYW5zcG9ydChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBzcmNUcmFucykgewotICAgIHJldHVybiBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PihuZXcgVFBpcGVkVHJhbnNwb3J0KHNyY1RyYW5zLCBkc3RUcmFuc18pKTsKKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZ2V0VHJhbnNwb3J0KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBzcmNUcmFucykgeworICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4obmV3IFRQaXBlZFRyYW5zcG9ydChzcmNUcmFucywgZHN0VHJhbnNfKSk7CiAgIH0KIAotICB2aXJ0dWFsIHZvaWQgaW5pdGlhbGl6ZVRhcmdldFRyYW5zcG9ydChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBkc3RUcmFucykgeworICB2aXJ0dWFsIHZvaWQgaW5pdGlhbGl6ZVRhcmdldFRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZHN0VHJhbnMpIHsKICAgICBpZiAoZHN0VHJhbnNfLmdldCgpID09IE5VTEwpIHsKICAgICAgIGRzdFRyYW5zXyA9IGRzdFRyYW5zOwogICAgIH0gZWxzZSB7CkBAIC0yNDEsOCArMjI4LDggQEAKICAgICB9CiAgIH0KIAotIHByb3RlY3RlZDoKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZHN0VHJhbnNfOworcHJvdGVjdGVkOgorICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZHN0VHJhbnNfOwogfTsKIAogLyoqCkBAIC0yNTEsMTAgKzIzOCwxMCBAQAogICogVFRyYW5zcG9ydCBjYW4gc3RpbGwgYWNjZXNzIHRoZSBvcmlnaW5hbCB0cmFuc3BvcnQuCiAgKgogICovCi1jbGFzcyBUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0IDogcHVibGljIFRQaXBlZFRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgVEZpbGVSZWFkZXJUcmFuc3BvcnQgewotIHB1YmxpYzoKLSAgVFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydChib29zdDo6c2hhcmVkX3B0cjxURmlsZVJlYWRlclRyYW5zcG9ydD4gc3JjVHJhbnMsIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGRzdFRyYW5zKTsKK2NsYXNzIFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQgOiBwdWJsaWMgVFBpcGVkVHJhbnNwb3J0LCBwdWJsaWMgVEZpbGVSZWFkZXJUcmFuc3BvcnQgeworcHVibGljOgorICBUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0KHN0ZDo6c2hhcmVkX3B0cjxURmlsZVJlYWRlclRyYW5zcG9ydD4gc3JjVHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGRzdFRyYW5zKTsKIAogICB+VFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydCgpOwogCkBAIC0yODMsMjAgKzI3MCwxNCBAQAogICAgKiBXZSBjYW5ub3QgdXNlIFRWaXJ0dWFsVHJhbnNwb3J0IHRvIHByb3ZpZGUgdGhlc2UsIHNpbmNlIHdlIG5lZWQgdG8gaW5oZXJpdAogICAgKiB2aXJ0dWFsbHkgZnJvbSBUVHJhbnNwb3J0LgogICAgKi8KLSAgdmlydHVhbCB1aW50MzJfdCByZWFkX3ZpcnQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKLSAgICByZXR1cm4gdGhpcy0+cmVhZChidWYsIGxlbik7Ci0gIH0KLSAgdmlydHVhbCB1aW50MzJfdCByZWFkQWxsX3ZpcnQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKLSAgICByZXR1cm4gdGhpcy0+cmVhZEFsbChidWYsIGxlbik7Ci0gIH0KLSAgdmlydHVhbCB2b2lkIHdyaXRlX3ZpcnQoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKLSAgICB0aGlzLT53cml0ZShidWYsIGxlbik7Ci0gIH0KKyAgdmlydHVhbCB1aW50MzJfdCByZWFkX3ZpcnQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsgcmV0dXJuIHRoaXMtPnJlYWQoYnVmLCBsZW4pOyB9CisgIHZpcnR1YWwgdWludDMyX3QgcmVhZEFsbF92aXJ0KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7IHJldHVybiB0aGlzLT5yZWFkQWxsKGJ1ZiwgbGVuKTsgfQorICB2aXJ0dWFsIHZvaWQgd3JpdGVfdmlydChjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeyB0aGlzLT53cml0ZShidWYsIGxlbik7IH0KIAotIHByb3RlY3RlZDoKK3Byb3RlY3RlZDoKICAgLy8gc2hvdWxkbid0IGJlIHVzZWQKICAgVFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydCgpOwotICBib29zdDo6c2hhcmVkX3B0cjxURmlsZVJlYWRlclRyYW5zcG9ydD4gc3JjVHJhbnNfOworICBzdGQ6OnNoYXJlZF9wdHI8VEZpbGVSZWFkZXJUcmFuc3BvcnQ+IHNyY1RyYW5zXzsKIH07CiAKIC8qKgpAQCAtMzA0LDI3ICsyODUsMzAgQEAKICAqCiAgKi8KIGNsYXNzIFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnRGYWN0b3J5IDogcHVibGljIFRQaXBlZFRyYW5zcG9ydEZhY3RvcnkgewotIHB1YmxpYzoKK3B1YmxpYzoKICAgVFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydEZhY3RvcnkoKSB7fQotICBUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0RmFjdG9yeShib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBkc3RUcmFucykKLSAgICA6IFRQaXBlZFRyYW5zcG9ydEZhY3RvcnkoZHN0VHJhbnMpCi0gIHt9CisgIFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnRGYWN0b3J5KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBkc3RUcmFucykKKyAgICA6IFRQaXBlZFRyYW5zcG9ydEZhY3RvcnkoZHN0VHJhbnMpIHt9CiAgIHZpcnR1YWwgflRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnRGYWN0b3J5KCkge30KIAotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRUcmFuc3BvcnQoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gc3JjVHJhbnMpIHsKLSAgICBib29zdDo6c2hhcmVkX3B0cjxURmlsZVJlYWRlclRyYW5zcG9ydD4gcEZpbGVSZWFkZXJUcmFuc3BvcnQgPSBib29zdDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8VEZpbGVSZWFkZXJUcmFuc3BvcnQ+KHNyY1RyYW5zKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldFRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gc3JjVHJhbnMpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VEZpbGVSZWFkZXJUcmFuc3BvcnQ+IHBGaWxlUmVhZGVyVHJhbnNwb3J0CisgICAgICAgID0gc3RkOjpkeW5hbWljX3BvaW50ZXJfY2FzdDxURmlsZVJlYWRlclRyYW5zcG9ydD4oc3JjVHJhbnMpOwogICAgIGlmIChwRmlsZVJlYWRlclRyYW5zcG9ydC5nZXQoKSAhPSBOVUxMKSB7CiAgICAgICByZXR1cm4gZ2V0RmlsZVJlYWRlclRyYW5zcG9ydChwRmlsZVJlYWRlclRyYW5zcG9ydCk7CiAgICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PigpOworICAgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PigpOwogICAgIH0KICAgfQogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PiBnZXRGaWxlUmVhZGVyVHJhbnNwb3J0KGJvb3N0OjpzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PiBzcmNUcmFucykgewotICAgIHJldHVybiBib29zdDo6c2hhcmVkX3B0cjxURmlsZVJlYWRlclRyYW5zcG9ydD4obmV3IFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQoc3JjVHJhbnMsIGRzdFRyYW5zXykpOworICBzdGQ6OnNoYXJlZF9wdHI8VEZpbGVSZWFkZXJUcmFuc3BvcnQ+IGdldEZpbGVSZWFkZXJUcmFuc3BvcnQoCisgICAgICBzdGQ6OnNoYXJlZF9wdHI8VEZpbGVSZWFkZXJUcmFuc3BvcnQ+IHNyY1RyYW5zKSB7CisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxURmlsZVJlYWRlclRyYW5zcG9ydD4oCisgICAgICAgIG5ldyBUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0KHNyY1RyYW5zLCBkc3RUcmFuc18pKTsKICAgfQogfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAogCiAjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UVFJBTlNQT1JUVVRJTFNfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFZpcnR1YWxUcmFuc3BvcnQuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFZpcnR1YWxUcmFuc3BvcnQuaAppbmRleCA1NzVmNTQ3Li4wY2FjZjYxIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RWaXJ0dWFsVHJhbnNwb3J0LmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UVmlydHVhbFRyYW5zcG9ydC5oCkBAIC0yMiw4ICsyMiw5IEBACiAKICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaD4KIAotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKLQorbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgewogCiAvKioKICAqIEhlbHBlciBjbGFzcyB0aGF0IHByb3ZpZGVzIGRlZmF1bHQgaW1wbGVtZW50YXRpb25zIG9mIFRUcmFuc3BvcnQgbWV0aG9kcy4KQEAgLTQyLDI4ICs0MywyMCBAQAogICogcmVhZF92aXJ0KCkuKQogICovCiBjbGFzcyBUVHJhbnNwb3J0RGVmYXVsdHMgOiBwdWJsaWMgVFRyYW5zcG9ydCB7Ci0gcHVibGljOgorcHVibGljOgogICAvKgogICAgKiBUVHJhbnNwb3J0ICpfdmlydCgpIG1ldGhvZHMgcHJvdmlkZSByZWFzb25hYmxlIGRlZmF1bHQgaW1wbGVtZW50YXRpb25zLgogICAgKiBJbnZva2UgdGhlbSBub24tdmlydHVhbGx5LgogICAgKi8KLSAgdWludDMyX3QgcmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewotICAgIHJldHVybiB0aGlzLT5UVHJhbnNwb3J0OjpyZWFkX3ZpcnQoYnVmLCBsZW4pOwotICB9Ci0gIHVpbnQzMl90IHJlYWRBbGwodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKLSAgICByZXR1cm4gdGhpcy0+VFRyYW5zcG9ydDo6cmVhZEFsbF92aXJ0KGJ1ZiwgbGVuKTsKLSAgfQotICB2b2lkIHdyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7Ci0gICAgdGhpcy0+VFRyYW5zcG9ydDo6d3JpdGVfdmlydChidWYsIGxlbik7Ci0gIH0KKyAgdWludDMyX3QgcmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeyByZXR1cm4gdGhpcy0+VFRyYW5zcG9ydDo6cmVhZF92aXJ0KGJ1ZiwgbGVuKTsgfQorICB1aW50MzJfdCByZWFkQWxsKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7IHJldHVybiB0aGlzLT5UVHJhbnNwb3J0OjpyZWFkQWxsX3ZpcnQoYnVmLCBsZW4pOyB9CisgIHZvaWQgd3JpdGUoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsgdGhpcy0+VFRyYW5zcG9ydDo6d3JpdGVfdmlydChidWYsIGxlbik7IH0KICAgY29uc3QgdWludDhfdCogYm9ycm93KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QqIGxlbikgewogICAgIHJldHVybiB0aGlzLT5UVHJhbnNwb3J0Ojpib3Jyb3dfdmlydChidWYsIGxlbik7CiAgIH0KLSAgdm9pZCBjb25zdW1lKHVpbnQzMl90IGxlbikgewotICAgIHRoaXMtPlRUcmFuc3BvcnQ6OmNvbnN1bWVfdmlydChsZW4pOwotICB9CisgIHZvaWQgY29uc3VtZSh1aW50MzJfdCBsZW4pIHsgdGhpcy0+VFRyYW5zcG9ydDo6Y29uc3VtZV92aXJ0KGxlbik7IH0KIAotIHByb3RlY3RlZDoKK3Byb3RlY3RlZDoKICAgVFRyYW5zcG9ydERlZmF1bHRzKCkge30KIH07CiAKQEAgLTg0LDkgKzc3LDkgQEAKICAqCiAgKiBAYXV0aG9yIENoYWQgV2FsdGVycyA8Y2hhZEBwb3dlcnNldC5jb20+CiAgKi8KLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBTdXBlcl89VFRyYW5zcG9ydERlZmF1bHRzPgordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIFN1cGVyXyA9IFRUcmFuc3BvcnREZWZhdWx0cz4KIGNsYXNzIFRWaXJ0dWFsVHJhbnNwb3J0IDogcHVibGljIFN1cGVyXyB7Ci0gcHVibGljOgorcHVibGljOgogICAvKgogICAgKiBJbXBsZW1lbnRhdGlvbnMgb2YgdGhlICpfdmlydCgpIGZ1bmN0aW9ucywgdG8gY2FsbCB0aGUgc3ViY2xhc3MncwogICAgKiBub24tdmlydHVhbCBpbXBsZW1lbnRhdGlvbiBmdW5jdGlvbi4KQEAgLTEwNyw5ICsxMDAsNyBAQAogICAgIHJldHVybiBzdGF0aWNfY2FzdDxUcmFuc3BvcnRfKj4odGhpcyktPmJvcnJvdyhidWYsIGxlbik7CiAgIH0KIAotICB2aXJ0dWFsIHZvaWQgY29uc3VtZV92aXJ0KHVpbnQzMl90IGxlbikgewotICAgIHN0YXRpY19jYXN0PFRyYW5zcG9ydF8qPih0aGlzKS0+Y29uc3VtZShsZW4pOwotICB9CisgIHZpcnR1YWwgdm9pZCBjb25zdW1lX3ZpcnQodWludDMyX3QgbGVuKSB7IHN0YXRpY19jYXN0PFRyYW5zcG9ydF8qPih0aGlzKS0+Y29uc3VtZShsZW4pOyB9CiAKICAgLyoKICAgICogUHJvdmlkZSBhIGRlZmF1bHQgcmVhZEFsbCgpIGltcGxlbWVudGF0aW9uIHRoYXQgaW52b2tlcwpAQCAtMTI2LDcgKzExNyw3IEBACiAgICAgcmV0dXJuIDo6YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6cmVhZEFsbCgqdHJhbnMsIGJ1ZiwgbGVuKTsKICAgfQogCi0gcHJvdGVjdGVkOgorcHJvdGVjdGVkOgogICBUVmlydHVhbFRyYW5zcG9ydCgpIHt9CiAKICAgLyoKQEAgLTEzNSwxMiArMTI2LDE1IEBACiAgICAqIGFkZGl0aW9uYWwgdmVyc2lvbnMgY2FuIGJlIGFkZGVkIGFzIG5lZWRlZC4KICAgICovCiAgIHRlbXBsYXRlIDx0eXBlbmFtZSBBcmdfPgotICBUVmlydHVhbFRyYW5zcG9ydChBcmdfIGNvbnN0JiBhcmcpIDogU3VwZXJfKGFyZykgeyB9CisgIFRWaXJ0dWFsVHJhbnNwb3J0KEFyZ18gY29uc3QmIGFyZykKKyAgICA6IFN1cGVyXyhhcmcpIHt9CiAKICAgdGVtcGxhdGUgPHR5cGVuYW1lIEFyZzFfLCB0eXBlbmFtZSBBcmcyXz4KLSAgVFZpcnR1YWxUcmFuc3BvcnQoQXJnMV8gY29uc3QmIGExLCBBcmcyXyBjb25zdCYgYTIpIDogU3VwZXJfKGExLCBhMikgeyB9CisgIFRWaXJ0dWFsVHJhbnNwb3J0KEFyZzFfIGNvbnN0JiBhMSwgQXJnMl8gY29uc3QmIGEyKQorICAgIDogU3VwZXJfKGExLCBhMikge30KIH07Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKIAogI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVFZJUlRVQUxUUkFOU1BPUlRfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFpsaWJUcmFuc3BvcnQuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UWmxpYlRyYW5zcG9ydC5jcHAKaW5kZXggY2RkZTdjMy4uZTQyNmRjMyAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UWmxpYlRyYW5zcG9ydC5jcHAKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UWmxpYlRyYW5zcG9ydC5jcHAKQEAgLTI0LDcgKzI0LDkgQEAKIAogdXNpbmcgc3RkOjpzdHJpbmc7CiAKLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHRyYW5zcG9ydCB7CituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CiAKIC8vIERvbid0IGNhbGwgdGhpcyBvdXRzaWRlIG9mIHRoZSBjb25zdHJ1Y3Rvci4KIHZvaWQgVFpsaWJUcmFuc3BvcnQ6OmluaXRabGliKCkgewpAQCAtMzYsMTcgKzM4LDE3IEBACiAKICAgICByc3RyZWFtXy0+emFsbG9jID0gWl9OVUxMOwogICAgIHdzdHJlYW1fLT56YWxsb2MgPSBaX05VTEw7Ci0gICAgcnN0cmVhbV8tPnpmcmVlICA9IFpfTlVMTDsKLSAgICB3c3RyZWFtXy0+emZyZWUgID0gWl9OVUxMOworICAgIHJzdHJlYW1fLT56ZnJlZSA9IFpfTlVMTDsKKyAgICB3c3RyZWFtXy0+emZyZWUgPSBaX05VTEw7CiAgICAgcnN0cmVhbV8tPm9wYXF1ZSA9IFpfTlVMTDsKICAgICB3c3RyZWFtXy0+b3BhcXVlID0gWl9OVUxMOwogCi0gICAgcnN0cmVhbV8tPm5leHRfaW4gICA9IGNyYnVmXzsKLSAgICB3c3RyZWFtXy0+bmV4dF9pbiAgID0gdXdidWZfOwotICAgIHJzdHJlYW1fLT5uZXh0X291dCAgPSB1cmJ1Zl87Ci0gICAgd3N0cmVhbV8tPm5leHRfb3V0ICA9IGN3YnVmXzsKLSAgICByc3RyZWFtXy0+YXZhaWxfaW4gID0gMDsKLSAgICB3c3RyZWFtXy0+YXZhaWxfaW4gID0gMDsKKyAgICByc3RyZWFtXy0+bmV4dF9pbiA9IGNyYnVmXzsKKyAgICB3c3RyZWFtXy0+bmV4dF9pbiA9IHV3YnVmXzsKKyAgICByc3RyZWFtXy0+bmV4dF9vdXQgPSB1cmJ1Zl87CisgICAgd3N0cmVhbV8tPm5leHRfb3V0ID0gY3didWZfOworICAgIHJzdHJlYW1fLT5hdmFpbF9pbiA9IDA7CisgICAgd3N0cmVhbV8tPmF2YWlsX2luID0gMDsKICAgICByc3RyZWFtXy0+YXZhaWxfb3V0ID0gdXJidWZfc2l6ZV87CiAgICAgd3N0cmVhbV8tPmF2YWlsX291dCA9IGN3YnVmX3NpemVfOwogCkBAIC03OSw4ICs4MSw4IEBACiAKIGlubGluZSB2b2lkIFRabGliVHJhbnNwb3J0OjpjaGVja1psaWJSdk5vdGhyb3coaW50IHN0YXR1cywgY29uc3QgY2hhciogbWVzc2FnZSkgewogICBpZiAoc3RhdHVzICE9IFpfT0spIHsKLSAgICBzdHJpbmcgb3V0cHV0ID0gIlRabGliVHJhbnNwb3J0OiB6bGliIGZhaWx1cmUgaW4gZGVzdHJ1Y3RvcjogIiArCi0gICAgICBUWmxpYlRyYW5zcG9ydEV4Y2VwdGlvbjo6ZXJyb3JNZXNzYWdlKHN0YXR1cywgbWVzc2FnZSk7CisgICAgc3RyaW5nIG91dHB1dCA9ICJUWmxpYlRyYW5zcG9ydDogemxpYiBmYWlsdXJlIGluIGRlc3RydWN0b3I6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBUWmxpYlRyYW5zcG9ydEV4Y2VwdGlvbjo6ZXJyb3JNZXNzYWdlKHN0YXR1cywgbWVzc2FnZSk7CiAgICAgR2xvYmFsT3V0cHV0KG91dHB1dC5jX3N0cigpKTsKICAgfQogfQpAQCAtMTE2LDggKzExOCw2IEBACiAgIHJldHVybiAocmVhZEF2YWlsKCkgPiAwKSB8fCAocnN0cmVhbV8tPmF2YWlsX2luID4gMCkgfHwgdHJhbnNwb3J0Xy0+cGVlaygpOwogfQogCi0KLQogLy8gUkVBRElORyBTVFJBVEVHWQogLy8KIC8vIFdlIGhhdmUgdHdvIGJ1ZmZlcnMgZm9yIHJlYWRpbmc6IG9uZSBjb250YWluaW5nIHRoZSBjb21wcmVzc2VkIGRhdGEgKGNyYnVmXykKQEAgLTE0Myw3ICsxNDMsNyBAQAogICB3aGlsZSAodHJ1ZSkgewogICAgIC8vIENvcHkgb3V0IHdoYXRldmVyIHdlIGhhdmUgYXZhaWxhYmxlLCB0aGVuIGdpdmUgdGhlbSB0aGUgbWluIG9mCiAgICAgLy8gd2hhdCB3ZSBoYXZlIGFuZCB3aGF0IHRoZXkgd2FudCwgdGhlbiBhZHZhbmNlIGluZGljZXMuCi0gICAgaW50IGdpdmUgPSAoc3RkOjptaW4pKCh1aW50MzJfdCkgcmVhZEF2YWlsKCksIG5lZWQpOworICAgIGludCBnaXZlID0gKHN0ZDo6bWluKSgodWludDMyX3QpcmVhZEF2YWlsKCksIG5lZWQpOwogICAgIG1lbWNweShidWYsIHVyYnVmXyArIHVycG9zXywgZ2l2ZSk7CiAgICAgbmVlZCAtPSBnaXZlOwogICAgIGJ1ZiArPSBnaXZlOwpAQCAtMTcwLDcgKzE3MCw3IEBACiAgICAgfQogCiAgICAgLy8gVGhlIHVuY29tcHJlc3NlZCByZWFkIGJ1ZmZlciBpcyBlbXB0eSwgc28gcmVzZXQgdGhlIHN0cmVhbSBmaWVsZHMuCi0gICAgcnN0cmVhbV8tPm5leHRfb3V0ICA9IHVyYnVmXzsKKyAgICByc3RyZWFtXy0+bmV4dF9vdXQgPSB1cmJ1Zl87CiAgICAgcnN0cmVhbV8tPmF2YWlsX291dCA9IHVyYnVmX3NpemVfOwogICAgIHVycG9zXyA9IDA7CiAKQEAgLTE5NSw3ICsxOTUsNyBAQAogICAgIGlmIChnb3QgPT0gMCkgewogICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICByc3RyZWFtXy0+bmV4dF9pbiAgPSBjcmJ1Zl87CisgICAgcnN0cmVhbV8tPm5leHRfaW4gPSBjcmJ1Zl87CiAgICAgcnN0cmVhbV8tPmF2YWlsX2luID0gZ290OwogICB9CiAKQEAgLTIxMSw3ICsyMTEsNiBAQAogICByZXR1cm4gdHJ1ZTsKIH0KIAotCiAvLyBXUklUSU5HIFNUUkFURUdZCiAvLwogLy8gV2UgYnVmZmVyIHVwIHNtYWxsIHdyaXRlcyBiZWZvcmUgc2VuZGluZyB0aGVtIHRvIHpsaWIsIHNvIG91ciBsb2dpYyBpczoKQEAgLTIzMiw4ICsyMzEsNyBAQAogCiB2b2lkIFRabGliVHJhbnNwb3J0Ojp3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewogICBpZiAob3V0cHV0X2ZpbmlzaGVkXykgewotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6QkFEX0FSR1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid3JpdGUoKSBjYWxsZWQgYWZ0ZXIgZmluaXNoKCkiKTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkJBRF9BUkdTLCAid3JpdGUoKSBjYWxsZWQgYWZ0ZXIgZmluaXNoKCkiKTsKICAgfQogCiAgIC8vIHpsaWIncyAiZGVmbGF0ZSIgZnVuY3Rpb24gaGFzIGVub3VnaCBsb2dpYyBpbiBpdCB0aGF0IEkgdGhpbmsKQEAgLTI1MiwyNSArMjUwLDMyIEBACiAgIH0KIH0KIAotdm9pZCBUWmxpYlRyYW5zcG9ydDo6Zmx1c2goKSAgewordm9pZCBUWmxpYlRyYW5zcG9ydDo6Zmx1c2goKSB7CiAgIGlmIChvdXRwdXRfZmluaXNoZWRfKSB7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpCQURfQVJHUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmbHVzaCgpIGNhbGxlZCBhZnRlciBmaW5pc2goKSIpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6QkFEX0FSR1MsICJmbHVzaCgpIGNhbGxlZCBhZnRlciBmaW5pc2goKSIpOworICB9CisKKyAgZmx1c2hUb1psaWIodXdidWZfLCB1d3Bvc18sIFpfQkxPQ0spOworICB1d3Bvc18gPSAwOworCisgIGlmKHdzdHJlYW1fLT5hdmFpbF9vdXQgPCA2KXsKKyAgICB0cmFuc3BvcnRfLT53cml0ZShjd2J1Zl8sIGN3YnVmX3NpemVfIC0gd3N0cmVhbV8tPmF2YWlsX291dCk7CisgICAgd3N0cmVhbV8tPm5leHRfb3V0ID0gY3didWZfOworICAgIHdzdHJlYW1fLT5hdmFpbF9vdXQgPSBjd2J1Zl9zaXplXzsKICAgfQogCiAgIGZsdXNoVG9UcmFuc3BvcnQoWl9GVUxMX0ZMVVNIKTsKIH0KIAotdm9pZCBUWmxpYlRyYW5zcG9ydDo6ZmluaXNoKCkgIHsKK3ZvaWQgVFpsaWJUcmFuc3BvcnQ6OmZpbmlzaCgpIHsKICAgaWYgKG91dHB1dF9maW5pc2hlZF8pIHsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkJBRF9BUkdTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZpbmlzaCgpIGNhbGxlZCBtb3JlIHRoYW4gb25jZSIpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6QkFEX0FSR1MsICJmaW5pc2goKSBjYWxsZWQgbW9yZSB0aGFuIG9uY2UiKTsKICAgfQogCiAgIGZsdXNoVG9UcmFuc3BvcnQoWl9GSU5JU0gpOwogfQogCi12b2lkIFRabGliVHJhbnNwb3J0OjpmbHVzaFRvVHJhbnNwb3J0KGludCBmbHVzaCkgIHsKK3ZvaWQgVFpsaWJUcmFuc3BvcnQ6OmZsdXNoVG9UcmFuc3BvcnQoaW50IGZsdXNoKSB7CiAgIC8vIHdyaXRlIHBlbmRpbmcgZGF0YSBpbiB1d2J1Zl8gdG8gemxpYgogICBmbHVzaFRvWmxpYih1d2J1Zl8sIHV3cG9zXywgZmx1c2gpOwogICB1d3Bvc18gPSAwOwpAQCAtMjg1LDE4ICsyOTAsMTggQEAKIH0KIAogdm9pZCBUWmxpYlRyYW5zcG9ydDo6Zmx1c2hUb1psaWIoY29uc3QgdWludDhfdCogYnVmLCBpbnQgbGVuLCBpbnQgZmx1c2gpIHsKLSAgd3N0cmVhbV8tPm5leHRfaW4gID0gY29uc3RfY2FzdDx1aW50OF90Kj4oYnVmKTsKKyAgd3N0cmVhbV8tPm5leHRfaW4gPSBjb25zdF9jYXN0PHVpbnQ4X3QqPihidWYpOwogICB3c3RyZWFtXy0+YXZhaWxfaW4gPSBsZW47CiAKICAgd2hpbGUgKHRydWUpIHsKLSAgICBpZiAoZmx1c2ggPT0gWl9OT19GTFVTSCAmJiB3c3RyZWFtXy0+YXZhaWxfaW4gPT0gMCkgeworICAgIGlmICgoZmx1c2ggPT0gWl9OT19GTFVTSCB8fCBmbHVzaCA9PSBaX0JMT0NLKSAmJiB3c3RyZWFtXy0+YXZhaWxfaW4gPT0gMCkgewogICAgICAgYnJlYWs7CiAgICAgfQogCiAgICAgLy8gSWYgb3VyIG91cHV0IGJ1ZmZlciBpcyBmdWxsLCBmbHVzaCB0byB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQuCiAgICAgaWYgKHdzdHJlYW1fLT5hdmFpbF9vdXQgPT0gMCkgewogICAgICAgdHJhbnNwb3J0Xy0+d3JpdGUoY3didWZfLCBjd2J1Zl9zaXplXyk7Ci0gICAgICB3c3RyZWFtXy0+bmV4dF9vdXQgID0gY3didWZfOworICAgICAgd3N0cmVhbV8tPm5leHRfb3V0ID0gY3didWZfOwogICAgICAgd3N0cmVhbV8tPmF2YWlsX291dCA9IGN3YnVmX3NpemVfOwogICAgIH0KIApAQCAtMzEwLDE1ICszMTUsMTUgQEAKIAogICAgIGNoZWNrWmxpYlJ2KHpsaWJfcnYsIHdzdHJlYW1fLT5tc2cpOwogCi0gICAgaWYgKChmbHVzaCA9PSBaX1NZTkNfRkxVU0ggfHwgZmx1c2ggPT0gWl9GVUxMX0ZMVVNIKSAmJgotICAgICAgICB3c3RyZWFtXy0+YXZhaWxfaW4gPT0gMCAmJiB3c3RyZWFtXy0+YXZhaWxfb3V0ICE9IDApIHsKKyAgICBpZiAoKGZsdXNoID09IFpfU1lOQ19GTFVTSCB8fCBmbHVzaCA9PSBaX0ZVTExfRkxVU0gpICYmIHdzdHJlYW1fLT5hdmFpbF9pbiA9PSAwCisgICAgICAgICYmIHdzdHJlYW1fLT5hdmFpbF9vdXQgIT0gMCkgewogICAgICAgYnJlYWs7CiAgICAgfQogICB9CiB9CiAKIGNvbnN0IHVpbnQ4X3QqIFRabGliVHJhbnNwb3J0Ojpib3Jyb3codWludDhfdCogYnVmLCB1aW50MzJfdCogbGVuKSB7Ci0gICh2b2lkKSBidWY7CisgICh2b2lkKWJ1ZjsKICAgLy8gRG9uJ3QgdHJ5IHRvIGJlIGNsZXZlciB3aXRoIHNoaWZ0aW5nIGJ1ZmZlcnMuCiAgIC8vIElmIHdlIGhhdmUgZW5vdWdoIGRhdGEsIGdpdmUgYSBwb2ludGVyIHRvIGl0LAogICAvLyBvdGhlcndpc2UgbGV0IHRoZSBwcm90Y29sIHVzZSBpdHMgc2xvdyBwYXRoLgpAQCAtMzMzLDggKzMzOCw3IEBACiAgIGlmIChyZWFkQXZhaWwoKSA+PSAoaW50KWxlbikgewogICAgIHVycG9zXyArPSBsZW47CiAgIH0gZWxzZSB7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpCQURfQVJHUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb25zdW1lIGRpZCBub3QgZm9sbG93IGEgYm9ycm93LiIpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6QkFEX0FSR1MsICJjb25zdW1lIGRpZCBub3QgZm9sbG93IGEgYm9ycm93LiIpOwogICB9CiB9CiAKQEAgLTM0OCwxNCArMzUyLDEzIEBACiAgIC8vIFRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIHdoZW4gcmVhZGluZyBpcyBjb21wbGV0ZS4KICAgLy8gSWYgdGhlIGNhbGxlciBzdGlsbCBoYXMgdW5yZWFkIGRhdGEsIHRocm93IGFuIGV4Y2VwdGlvbi4KICAgaWYgKHJlYWRBdmFpbCgpID4gMCkgewotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oCi0gICAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb246OkNPUlJVUFRFRF9EQVRBLAotICAgICAgICAidmVyaWZ5Q2hlY2tzdW0oKSBjYWxsZWQgYmVmb3JlIGVuZCBvZiB6bGliIHN0cmVhbSIpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Q09SUlVQVEVEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmVyaWZ5Q2hlY2tzdW0oKSBjYWxsZWQgYmVmb3JlIGVuZCBvZiB6bGliIHN0cmVhbSIpOwogICB9CiAKICAgLy8gUmVzZXQgdGhlIHJzdHJlYW0gZmllbGRzLCBpbiBjYXNlIGF2YWlsX291dCBpcyAwLgogICAvLyAoU2luY2UgcmVhZEF2YWlsKCkgaXMgMCwgd2Uga25vdyB0aGVyZSBpcyBubyB1bnJlYWQgZGF0YSBpbiB1cmJ1Zl8pCi0gIHJzdHJlYW1fLT5uZXh0X291dCAgPSB1cmJ1Zl87CisgIHJzdHJlYW1fLT5uZXh0X291dCA9IHVyYnVmXzsKICAgcnN0cmVhbV8tPmF2YWlsX291dCA9IHVyYnVmX3NpemVfOwogICB1cnBvc18gPSAwOwogCkBAIC0zOTQsNiArMzk3LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmVyaWZ5Q2hlY2tzdW0oKSBjYWxsZWQgYmVmb3JlIGVuZCBvZiAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInpsaWIgc3RyZWFtIik7CiB9Ci0KLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UWmxpYlRyYW5zcG9ydC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UWmxpYlRyYW5zcG9ydC5oCmluZGV4IDU2NWVjYWEuLmI0NWVjNDMgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFpsaWJUcmFuc3BvcnQuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RabGliVHJhbnNwb3J0LmgKQEAgLTIwLDI0ICsyMCwyNSBAQAogI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UWkxJQlRSQU5TUE9SVF9IXwogI2RlZmluZSBfVEhSSUZUX1RSQU5TUE9SVF9UWkxJQlRSQU5TUE9SVF9IXyAxCiAKLSNpbmNsdWRlIDxib29zdC9sZXhpY2FsX2Nhc3QuaHBwPgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydC5oPgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFZpcnR1YWxUcmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvVFRvU3RyaW5nLmg+CiAjaW5jbHVkZSA8emxpYi5oPgogCiBzdHJ1Y3Qgel9zdHJlYW1fczsKIAotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKIAogY2xhc3MgVFpsaWJUcmFuc3BvcnRFeGNlcHRpb24gOiBwdWJsaWMgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7Ci0gcHVibGljOgotICBUWmxpYlRyYW5zcG9ydEV4Y2VwdGlvbihpbnQgc3RhdHVzLCBjb25zdCBjaGFyKiBtc2cpIDoKLSAgICBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OklOVEVSTkFMX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlKHN0YXR1cywgbXNnKSksCi0gICAgemxpYl9zdGF0dXNfKHN0YXR1cyksCi0gICAgemxpYl9tc2dfKG1zZyA9PSBOVUxMID8gIihudWxsKSIgOiBtc2cpIHt9CitwdWJsaWM6CisgIFRabGliVHJhbnNwb3J0RXhjZXB0aW9uKGludCBzdGF0dXMsIGNvbnN0IGNoYXIqIG1zZykKKyAgICA6IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6SU5URVJOQUxfRVJST1IsIGVycm9yTWVzc2FnZShzdGF0dXMsIG1zZykpLAorICAgICAgemxpYl9zdGF0dXNfKHN0YXR1cyksCisgICAgICB6bGliX21zZ18obXNnID09IE5VTEwgPyAiKG51bGwpIiA6IG1zZykge30KIAotICB2aXJ0dWFsIH5UWmxpYlRyYW5zcG9ydEV4Y2VwdGlvbigpIHRocm93KCkge30KKyAgdmlydHVhbCB+VFpsaWJUcmFuc3BvcnRFeGNlcHRpb24oKSBub2V4Y2VwdCB7fQogCiAgIGludCBnZXRabGliU3RhdHVzKCkgeyByZXR1cm4gemxpYl9zdGF0dXNfOyB9CiAgIHN0ZDo6c3RyaW5nIGdldFpsaWJNZXNzYWdlKCkgeyByZXR1cm4gemxpYl9tc2dfOyB9CkBAIC01MCw3ICs1MSw3IEBACiAgICAgICBydiArPSAiKG5vIG1lc3NhZ2UpIjsKICAgICB9CiAgICAgcnYgKz0gIiAoc3RhdHVzID0gIjsKLSAgICBydiArPSBib29zdDo6bGV4aWNhbF9jYXN0PHN0ZDo6c3RyaW5nPihzdGF0dXMpOworICAgIHJ2ICs9IHRvX3N0cmluZyhzdGF0dXMpOwogICAgIHJ2ICs9ICIpIjsKICAgICByZXR1cm4gcnY7CiAgIH0KQEAgLTY3LDggKzY4LDcgQEAKICAqCiAgKi8KIGNsYXNzIFRabGliVHJhbnNwb3J0IDogcHVibGljIFRWaXJ0dWFsVHJhbnNwb3J0PFRabGliVHJhbnNwb3J0PiB7Ci0gcHVibGljOgotCitwdWJsaWM6CiAgIC8qKgogICAgKiBAcGFyYW0gdHJhbnNwb3J0ICAgIFRoZSB0cmFuc3BvcnQgdG8gcmVhZCBjb21wcmVzc2VkIGRhdGEgZnJvbQogICAgKiAgICAgICAgICAgICAgICAgICAgIGFuZCB3cml0ZSBjb21wcmVzc2VkIGRhdGEgdG8uCkBAIC03OCwzNiArNzgsMzQgQEAKICAgICogQHBhcmFtIGN3YnVmX3NpemUgICBDb21wcmVzc2VkIGJ1ZmZlciBzaXplIGZvciB3cml0aW5nLgogICAgKiBAcGFyYW0gY29tcF9sZXZlbCAgIENvbXByZXNzaW9uIGxldmVsICgwPW5vbmVbZmFzdF0sIDY9ZGVmYXVsdCwgOT1tYXhbc2xvd10pLgogICAgKi8KLSAgVFpsaWJUcmFuc3BvcnQoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0LAorICBUWmxpYlRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0LAogICAgICAgICAgICAgICAgICBpbnQgdXJidWZfc2l6ZSA9IERFRkFVTFRfVVJCVUZfU0laRSwKICAgICAgICAgICAgICAgICAgaW50IGNyYnVmX3NpemUgPSBERUZBVUxUX0NSQlVGX1NJWkUsCiAgICAgICAgICAgICAgICAgIGludCB1d2J1Zl9zaXplID0gREVGQVVMVF9VV0JVRl9TSVpFLAogICAgICAgICAgICAgICAgICBpbnQgY3didWZfc2l6ZSA9IERFRkFVTFRfQ1dCVUZfU0laRSwKLSAgICAgICAgICAgICAgICAgaW50MTZfdCBjb21wX2xldmVsID0gWl9ERUZBVUxUX0NPTVBSRVNTSU9OKSA6Ci0gICAgdHJhbnNwb3J0Xyh0cmFuc3BvcnQpLAotICAgIHVycG9zXygwKSwKLSAgICB1d3Bvc18oMCksCi0gICAgaW5wdXRfZW5kZWRfKGZhbHNlKSwKLSAgICBvdXRwdXRfZmluaXNoZWRfKGZhbHNlKSwKLSAgICB1cmJ1Zl9zaXplXyh1cmJ1Zl9zaXplKSwKLSAgICBjcmJ1Zl9zaXplXyhjcmJ1Zl9zaXplKSwKLSAgICB1d2J1Zl9zaXplXyh1d2J1Zl9zaXplKSwKLSAgICBjd2J1Zl9zaXplXyhjd2J1Zl9zaXplKSwKLSAgICB1cmJ1Zl8oTlVMTCksCi0gICAgY3JidWZfKE5VTEwpLAotICAgIHV3YnVmXyhOVUxMKSwKLSAgICBjd2J1Zl8oTlVMTCksCi0gICAgcnN0cmVhbV8oTlVMTCksCi0gICAgd3N0cmVhbV8oTlVMTCksCi0gICAgY29tcF9sZXZlbF8oY29tcF9sZXZlbCkKLSAgeworICAgICAgICAgICAgICAgICBpbnQxNl90IGNvbXBfbGV2ZWwgPSBaX0RFRkFVTFRfQ09NUFJFU1NJT04pCisgICAgOiB0cmFuc3BvcnRfKHRyYW5zcG9ydCksCisgICAgICB1cnBvc18oMCksCisgICAgICB1d3Bvc18oMCksCisgICAgICBpbnB1dF9lbmRlZF8oZmFsc2UpLAorICAgICAgb3V0cHV0X2ZpbmlzaGVkXyhmYWxzZSksCisgICAgICB1cmJ1Zl9zaXplXyh1cmJ1Zl9zaXplKSwKKyAgICAgIGNyYnVmX3NpemVfKGNyYnVmX3NpemUpLAorICAgICAgdXdidWZfc2l6ZV8odXdidWZfc2l6ZSksCisgICAgICBjd2J1Zl9zaXplXyhjd2J1Zl9zaXplKSwKKyAgICAgIHVyYnVmXyhOVUxMKSwKKyAgICAgIGNyYnVmXyhOVUxMKSwKKyAgICAgIHV3YnVmXyhOVUxMKSwKKyAgICAgIGN3YnVmXyhOVUxMKSwKKyAgICAgIHJzdHJlYW1fKE5VTEwpLAorICAgICAgd3N0cmVhbV8oTlVMTCksCisgICAgICBjb21wX2xldmVsXyhjb21wX2xldmVsKSB7CiAgICAgaWYgKHV3YnVmX3NpemVfIDwgTUlOX0RJUkVDVF9ERUZMQVRFX1NJWkUpIHsKICAgICAgIC8vIEhhdmUgdG8gY29weSB0aGlzIGludG8gYSBsb2NhbCBiZWNhdXNlIG9mIGEgbGlua2luZyBpc3N1ZS4KICAgICAgIGludCBtaW5pbXVtID0gTUlOX0RJUkVDVF9ERUZMQVRFX1NJWkU7Ci0gICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKAotICAgICAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb246OkJBRF9BUkdTLAotICAgICAgICAgICJUWkxpYlRyYW5zcG9ydDogdW5jb21wcmVzc2VkIHdyaXRlIGJ1ZmZlciBtdXN0IGJlIGF0IGxlYXN0IgotICAgICAgICAgICsgYm9vc3Q6OmxleGljYWxfY2FzdDxzdGQ6OnN0cmluZz4obWluaW11bSkgKyAiLiIpOworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpCQURfQVJHUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRaTGliVHJhbnNwb3J0OiB1bmNvbXByZXNzZWQgd3JpdGUgYnVmZmVyIG11c3QgYmUgYXQgbGVhc3QiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdG9fc3RyaW5nKG1pbmltdW0pICsgIi4iKTsKICAgICB9CiAKICAgICB0cnkgewpAQCAtMTQzLDEzICsxNDEsOSBAQAogICBib29sIGlzT3BlbigpOwogICBib29sIHBlZWsoKTsKIAotICB2b2lkIG9wZW4oKSB7Ci0gICAgdHJhbnNwb3J0Xy0+b3BlbigpOwotICB9CisgIHZvaWQgb3BlbigpIHsgdHJhbnNwb3J0Xy0+b3BlbigpOyB9CiAKLSAgdm9pZCBjbG9zZSgpIHsKLSAgICB0cmFuc3BvcnRfLT5jbG9zZSgpOwotICB9CisgIHZvaWQgY2xvc2UoKSB7IHRyYW5zcG9ydF8tPmNsb3NlKCk7IH0KIAogICB1aW50MzJfdCByZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKIApAQCAtMTc4LDE2ICsxNzIsMTcgQEAKICAgICovCiAgIHZvaWQgdmVyaWZ5Q2hlY2tzdW0oKTsKIAotICAgLyoqCi0gICAgKiBUT0RPKHNvbWVvbmVfc21hcnQpOiBDaG9vc2Ugc21hcnQgZGVmYXVsdHMuCi0gICAgKi8KKyAgLyoqCisgICAqIFRPRE8oc29tZW9uZV9zbWFydCk6IENob29zZSBzbWFydCBkZWZhdWx0cy4KKyAgICovCiAgIHN0YXRpYyBjb25zdCBpbnQgREVGQVVMVF9VUkJVRl9TSVpFID0gMTI4OwogICBzdGF0aWMgY29uc3QgaW50IERFRkFVTFRfQ1JCVUZfU0laRSA9IDEwMjQ7CiAgIHN0YXRpYyBjb25zdCBpbnQgREVGQVVMVF9VV0JVRl9TSVpFID0gMTI4OwogICBzdGF0aWMgY29uc3QgaW50IERFRkFVTFRfQ1dCVUZfU0laRSA9IDEwMjQ7CiAKLSBwcm90ZWN0ZWQ6CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRVbmRlcmx5aW5nVHJhbnNwb3J0KCkgY29uc3QgeyByZXR1cm4gdHJhbnNwb3J0XzsgfQogCitwcm90ZWN0ZWQ6CiAgIGlubGluZSB2b2lkIGNoZWNrWmxpYlJ2KGludCBzdGF0dXMsIGNvbnN0IGNoYXIqIG1zZyk7CiAgIGlubGluZSB2b2lkIGNoZWNrWmxpYlJ2Tm90aHJvdyhpbnQgc3RhdHVzLCBjb25zdCBjaGFyKiBtc2cpOwogICBpbmxpbmUgaW50IHJlYWRBdmFpbCgpOwpAQCAtMTk1LDEyICsxOTAsMTIgQEAKICAgdm9pZCBmbHVzaFRvWmxpYihjb25zdCB1aW50OF90KiBidWYsIGludCBsZW4sIGludCBmbHVzaCk7CiAgIGJvb2wgcmVhZEZyb21abGliKCk7CiAKLSBwcm90ZWN0ZWQ6Citwcm90ZWN0ZWQ6CiAgIC8vIFdyaXRlcyBzbWFsbGVyIHRoYW4gdGhpcyBhcmUgYnVmZmVyZWQgdXAuCiAgIC8vIExhcmdlciAob3IgZXF1YWwpIHdyaXRlcyBhcmUgZHVtcGVkIHN0cmFpZ2h0IHRvIHpsaWIuCiAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBNSU5fRElSRUNUX0RFRkxBVEVfU0laRSA9IDMyOwogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydF87CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnRfOwogCiAgIGludCB1cnBvc187CiAgIGludCB1d3Bvc187CkBAIC0yMjYsMjQgKzIyMSwyMiBAQAogICBjb25zdCBpbnQgY29tcF9sZXZlbF87CiB9OwogCi0KIC8qKgogICogV3JhcHMgYSB0cmFuc3BvcnQgaW50byBhIHpsaWJiZWQgb25lLgogICoKICAqLwogY2xhc3MgVFpsaWJUcmFuc3BvcnRGYWN0b3J5IDogcHVibGljIFRUcmFuc3BvcnRGYWN0b3J5IHsKLSBwdWJsaWM6CitwdWJsaWM6CiAgIFRabGliVHJhbnNwb3J0RmFjdG9yeSgpIHt9CiAKICAgdmlydHVhbCB+VFpsaWJUcmFuc3BvcnRGYWN0b3J5KCkge30KIAotICB2aXJ0dWFsIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldFRyYW5zcG9ydCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMpIHsKLSAgICByZXR1cm4gYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4obmV3IFRabGliVHJhbnNwb3J0KHRyYW5zKSk7CisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldFRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMpIHsKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+KG5ldyBUWmxpYlRyYW5zcG9ydCh0cmFucykpOwogICB9CiB9OwotCi0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKIAogI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVFpMSUJUUkFOU1BPUlRfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL0dldFRpbWVPZkRheS5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9HZXRUaW1lT2ZEYXkuY3BwCmluZGV4IGM1NjY3ZTQuLjgyMDgyOGYgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL0dldFRpbWVPZkRheS5jcHAKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvR2V0VGltZU9mRGF5LmNwcApAQCAtMjEsOTIgKzIxLDg2IEBACiAjaW5jbHVkZSA8dGhyaWZ0L3RocmlmdC1jb25maWcuaD4KIAogLy8gd2luMzIKLSNpbmNsdWRlIDx0aW1lLmg+Ci0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9NU0NfRVhURU5TSU9OUykKLSMgICBkZWZpbmUgREVMVEFfRVBPQ0hfSU5fTUlDUk9TRUNTICAxMTY0NDQ3MzYwMDAwMDAwMFVpNjQKLSNlbHNlCi0jICAgZGVmaW5lIERFTFRBX0VQT0NIX0lOX01JQ1JPU0VDUyAgMTE2NDQ0NzM2MDAwMDAwMDBVTEwKKyNpZiBkZWZpbmVkKF9fTUlOR1czMl9fKQorICAjaW5jbHVkZSA8c3lzL3RpbWUuaD4KICNlbmRpZgogCi1zdHJ1Y3QgdGltZXpvbmUKLXsKLSAgICBpbnQgIHR6X21pbnV0ZXN3ZXN0OyAvKiBtaW51dGVzIFcgb2YgR3JlZW53aWNoICovCi0gICAgaW50ICB0el9kc3R0aW1lOyAgICAgLyogdHlwZSBvZiBkc3QgY29ycmVjdGlvbiAqLworI2lmIGRlZmluZWQoX01TQ19WRVIpIHx8IGRlZmluZWQoX01TQ19FWFRFTlNJT05TKQorI2RlZmluZSBERUxUQV9FUE9DSF9JTl9NSUNST1NFQ1MgMTE2NDQ0NzM2MDAwMDAwMDBVaTY0CisjZWxzZQorI2RlZmluZSBERUxUQV9FUE9DSF9JTl9NSUNST1NFQ1MgMTE2NDQ0NzM2MDAwMDAwMDBVTEwKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoX19NSU5HVzMyX18pCitzdHJ1Y3QgdGltZXpvbmUgeworICBpbnQgdHpfbWludXRlc3dlc3Q7IC8qIG1pbnV0ZXMgVyBvZiBHcmVlbndpY2ggKi8KKyAgaW50IHR6X2RzdHRpbWU7ICAgICAvKiB0eXBlIG9mIGRzdCBjb3JyZWN0aW9uICovCiB9OworI2VuZGlmCiAKLWludCB0aHJpZnRfZ2V0dGltZW9mZGF5KHN0cnVjdCB0aW1ldmFsICogdHYsIHN0cnVjdCB0aW1lem9uZSAqIHR6KQotewotICAgIEZJTEVUSU1FICAgICAgICAgZnQ7Ci0gICAgdW5zaWduZWQgX19pbnQ2NCB0bXByZXMoMCk7Ci0gICAgc3RhdGljIGludCAgICAgICB0emZsYWc7Ci0KLSAgICBpZiAoTlVMTCAhPSB0dikKLSAgICB7Ci0gICAgICAgIEdldFN5c3RlbVRpbWVBc0ZpbGVUaW1lKCZmdCk7Ci0KLSAgICAgICAgdG1wcmVzIHw9IGZ0LmR3SGlnaERhdGVUaW1lOwotICAgICAgICB0bXByZXMgPDw9IDMyOwotICAgICAgICB0bXByZXMgfD0gZnQuZHdMb3dEYXRlVGltZTsKLQotICAgICAgICAvKmNvbnZlcnRpbmcgZmlsZSB0aW1lIHRvIHVuaXggZXBvY2gqLwotICAgICAgICB0bXByZXMgLT0gREVMVEFfRVBPQ0hfSU5fTUlDUk9TRUNTOwotICAgICAgICB0bXByZXMgLz0gMTA7ICAvKmNvbnZlcnQgaW50byBtaWNyb3NlY29uZHMqLwotICAgICAgICB0di0+dHZfc2VjID0gKGxvbmcpKHRtcHJlcyAvIDEwMDAwMDBVTCk7Ci0gICAgICAgIHR2LT50dl91c2VjID0gKGxvbmcpKHRtcHJlcyAlIDEwMDAwMDBVTCk7Ci0gICAgfQotCi0gICAgaWYgKE5VTEwgIT0gdHopCi0gICAgewotICAgICAgICBpZiAoIXR6ZmxhZykKLSAgICAgICAgewotICAgICAgICAgICAgX3R6c2V0KCk7Ci0gICAgICAgICAgICB0emZsYWcrKzsKLSAgICAgICAgfQotCi0gICAgICAgIGxvbmcgdGltZV96b25lKDApOwotICAgICAgICBlcnJub190IGVycihfZ2V0X3RpbWV6b25lKCZ0aW1lX3pvbmUpKTsKLSAgICAgICAgaWYgKGVyciA9PSBOT19FUlJPUikKLSAgICAgICAgewotICAgICAgICAgICAgdHotPnR6X21pbnV0ZXN3ZXN0ID0gdGltZV96b25lIC8gNjA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgZGF5X2xpZ2h0KDApOwotICAgICAgICBlcnIgPSAoX2dldF9kYXlsaWdodCgmZGF5X2xpZ2h0KSk7Ci0gICAgICAgIGlmIChlcnIgPT0gTk9fRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHR6LT50el9kc3R0aW1lID0gZGF5X2xpZ2h0OwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKKyNpZiBkZWZpbmVkKF9fTUlOR1czMl9fKQoraW50IHRocmlmdF9nZXR0aW1lb2ZkYXkoc3RydWN0IHRpbWV2YWwqIHR2LCBzdHJ1Y3QgdGltZXpvbmUqIHR6KSB7CisgIHJldHVybiBnZXR0aW1lb2ZkYXkodHYsdHopOwogfQorI2Vsc2UKK2ludCB0aHJpZnRfZ2V0dGltZW9mZGF5KHN0cnVjdCB0aW1ldmFsKiB0diwgc3RydWN0IHRpbWV6b25lKiB0eikgeworICBGSUxFVElNRSBmdDsKKyAgdW5zaWduZWQgX19pbnQ2NCB0bXByZXMoMCk7CisgIHN0YXRpYyBpbnQgdHpmbGFnOwogCi1pbnQgdGhyaWZ0X3NsZWVwKHVuc2lnbmVkIGludCBzZWNvbmRzKQoteworICBpZiAoTlVMTCAhPSB0dikgeworICAgIEdldFN5c3RlbVRpbWVBc0ZpbGVUaW1lKCZmdCk7CisKKyAgICB0bXByZXMgfD0gZnQuZHdIaWdoRGF0ZVRpbWU7CisgICAgdG1wcmVzIDw8PSAzMjsKKyAgICB0bXByZXMgfD0gZnQuZHdMb3dEYXRlVGltZTsKKworICAgIC8qY29udmVydGluZyBmaWxlIHRpbWUgdG8gdW5peCBlcG9jaCovCisgICAgdG1wcmVzIC09IERFTFRBX0VQT0NIX0lOX01JQ1JPU0VDUzsKKyAgICB0bXByZXMgLz0gMTA7IC8qY29udmVydCBpbnRvIG1pY3Jvc2Vjb25kcyovCisgICAgdHYtPnR2X3NlYyA9IChsb25nKSh0bXByZXMgLyAxMDAwMDAwVUwpOworICAgIHR2LT50dl91c2VjID0gKGxvbmcpKHRtcHJlcyAlIDEwMDAwMDBVTCk7CisgIH0KKworICBpZiAoTlVMTCAhPSB0eikgeworICAgIGlmICghdHpmbGFnKSB7CisgICAgICBfdHpzZXQoKTsKKyAgICAgIHR6ZmxhZysrOworICAgIH0KKworICAgIGxvbmcgdGltZV96b25lKDApOworICAgIGVycm5vX3QgZXJyKF9nZXRfdGltZXpvbmUoJnRpbWVfem9uZSkpOworICAgIGlmIChlcnIgPT0gTk9fRVJST1IpIHsKKyAgICAgIHR6LT50el9taW51dGVzd2VzdCA9IHRpbWVfem9uZSAvIDYwOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaW50IGRheV9saWdodCgwKTsKKyAgICBlcnIgPSAoX2dldF9kYXlsaWdodCgmZGF5X2xpZ2h0KSk7CisgICAgaWYgKGVyciA9PSBOT19FUlJPUikgeworICAgICAgdHotPnR6X2RzdHRpbWUgPSBkYXlfbGlnaHQ7CisgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgfQorCisgIHJldHVybiAwOworfQorI2VuZGlmCisKK2ludCB0aHJpZnRfc2xlZXAodW5zaWduZWQgaW50IHNlY29uZHMpIHsKICAgOjpTbGVlcChzZWNvbmRzICogMTAwMCk7CiAgIHJldHVybiAwOwogfQotaW50IHRocmlmdF91c2xlZXAodW5zaWduZWQgaW50IG1pY3Jvc2Vjb25kcykKLXsKLSAgdW5zaWduZWQgaW50IG1pbGxpc2Vjb25kcyA9IChtaWNyb3NlY29uZHMgKyA5OTkpLyAxMDAwOworaW50IHRocmlmdF91c2xlZXAodW5zaWduZWQgaW50IG1pY3Jvc2Vjb25kcykgeworICB1bnNpZ25lZCBpbnQgbWlsbGlzZWNvbmRzID0gKG1pY3Jvc2Vjb25kcyArIDk5OSkgLyAxMDAwOwogICA6OlNsZWVwKG1pbGxpc2Vjb25kcyk7CiAgIHJldHVybiAwOwogfQogCi1jaGFyICp0aHJpZnRfY3RpbWVfcihjb25zdCB0aW1lX3QgKl9jbG9jaywgY2hhciAqX2J1ZikKLXsKLSAgIHN0cmNweShfYnVmLCBjdGltZShfY2xvY2spKTsKLSAgIHJldHVybiBfYnVmOworY2hhciogdGhyaWZ0X2N0aW1lX3IoY29uc3QgdGltZV90KiBfY2xvY2ssIGNoYXIqIF9idWYpIHsKKyAgc3RyY3B5KF9idWYsIGN0aW1lKF9jbG9jaykpOworICByZXR1cm4gX2J1ZjsKIH0KLQotCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9HZXRUaW1lT2ZEYXkuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL0dldFRpbWVPZkRheS5oCmluZGV4IDI3YjhhODQuLjc2MmFjNWUgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL0dldFRpbWVPZkRheS5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL0dldFRpbWVPZkRheS5oCkBAIC0yOSwxNSArMjksMTYgQEAKICNlbmRpZgogCiAjaW5jbHVkZSA8dGhyaWZ0L3RocmlmdC1jb25maWcuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CiAKIHN0cnVjdCB0aHJpZnRfdGltZXNwZWMgewogICBpbnQ2NF90IHR2X3NlYzsKICAgaW50NjRfdCB0dl9uc2VjOwogfTsKIAotaW50IHRocmlmdF9nZXR0aW1lb2ZkYXkoc3RydWN0IHRpbWV2YWwgKiB0diwgc3RydWN0IHRpbWV6b25lICogdHopOworaW50IHRocmlmdF9nZXR0aW1lb2ZkYXkoc3RydWN0IHRpbWV2YWwqIHR2LCBzdHJ1Y3QgdGltZXpvbmUqIHR6KTsKIGludCB0aHJpZnRfc2xlZXAodW5zaWduZWQgaW50IHNlY29uZHMpOwogaW50IHRocmlmdF91c2xlZXAodW5zaWduZWQgaW50IG1pY3JvX3NlY29uZHMpOwotY2hhciAqdGhyaWZ0X2N0aW1lX3IoY29uc3QgdGltZV90ICpfY2xvY2ssIGNoYXIgKl9idWYpOworY2hhciogdGhyaWZ0X2N0aW1lX3IoY29uc3QgdGltZV90KiBfY2xvY2ssIGNoYXIqIF9idWYpOwogCiAjZW5kaWYgLy8gX1RIUklGVF9XSU5ET1dTX0dFVFRJTUVPRkRBWV9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvT3BlcmF0b3JzLmggYi9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9PcGVyYXRvcnMuaAppbmRleCA5NWQ4ZTNlLi45Yjg2MDk2IDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9PcGVyYXRvcnMuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9PcGVyYXRvcnMuaApAQCAtMjQsMTcgKzI0LDE3IEBACiAjcHJhZ21hIG9uY2UKICNlbmRpZiAvLyBfTVNDX1ZFUgogCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgewogCiBjbGFzcyBURW51bUl0ZXJhdG9yOwogCi1pbmxpbmUgYm9vbCBvcGVyYXRvciA9PSAoY29uc3QgVEVudW1JdGVyYXRvciYsIGNvbnN0IFRFbnVtSXRlcmF0b3ImKQotewotICAgIC8vIE5vdCBlbnRpcmVseSBzdXJlIHdoYXQgdGhlIHRlc3Qgc2hvdWxkIGJlIGhlcmUuIEl0IGlzIG9ubHkgdG8gZW5hYmxlCi0gICAgLy8gaXRlcmF0b3IgZGVidWdnaW5nIGFuZCBpcyBub3QgdXNlZCBpbiByZWxlYXNlIG1vZGUuCi0gICAgcmV0dXJuIHRydWU7CitpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFRFbnVtSXRlcmF0b3ImLCBjb25zdCBURW51bUl0ZXJhdG9yJikgeworICAvLyBOb3QgZW50aXJlbHkgc3VyZSB3aGF0IHRoZSB0ZXN0IHNob3VsZCBiZSBoZXJlLiBJdCBpcyBvbmx5IHRvIGVuYWJsZQorICAvLyBpdGVyYXRvciBkZWJ1Z2dpbmcgYW5kIGlzIG5vdCB1c2VkIGluIHJlbGVhc2UgbW9kZS4KKyAgcmV0dXJuIHRydWU7CiB9Ci0KLX19IC8vIGFwYWNoZTo6dGhyaWZ0Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0CiAKICNlbmRpZiAvLyBfVEhSSUZUX1dJTkRPV1NfT1BFUkFUT1JTX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9PdmVybGFwcGVkU3VibWlzc2lvblRocmVhZC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9PdmVybGFwcGVkU3VibWlzc2lvblRocmVhZC5jcHAKaW5kZXggNWRlYzM5MC4uNWFjNmZlMCAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQuY3BwCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL092ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkLmNwcApAQCAtMjMsMjEgKzIzLDIzIEBACiAjaW5jbHVkZSA8Ym9vc3Qvc2NvcGVfZXhpdC5ocHA+CiAjaW5jbHVkZSA8cHJvY2Vzcy5oPgogCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0cmFuc3BvcnQgeworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgewogCi1UT3ZlcmxhcHBlZFdvcmtJdGVtOjpUT3ZlcmxhcHBlZFdvcmtJdGVtKCkgOgotICBTTElTVF9FTlRSWSgpLAotICBhY3Rpb24oVU5LTk9XTiksCi0gIGgoSU5WQUxJRF9IQU5ETEVfVkFMVUUpLAotICBidWZmZXIoTlVMTCksCi0gIGJ1ZmZlcl9sZW4oMCksCi0gIG92ZXJsYXAoKSwKLSAgbGFzdF9lcnJvcigwKSwKLSAgc3VjY2VzcyhUUlVFKQote30KK1RPdmVybGFwcGVkV29ya0l0ZW06OlRPdmVybGFwcGVkV29ya0l0ZW0oKQorICA6IFNMSVNUX0VOVFJZKCksCisgICAgYWN0aW9uKFVOS05PV04pLAorICAgIGgoSU5WQUxJRF9IQU5ETEVfVkFMVUUpLAorICAgIGJ1ZmZlcihOVUxMKSwKKyAgICBidWZmZXJfbGVuKDApLAorICAgIG92ZXJsYXAoKSwKKyAgICBsYXN0X2Vycm9yKDApLAorICAgIHN1Y2Nlc3MoVFJVRSkgeworfQogCi12b2lkIFRPdmVybGFwcGVkV29ya0l0ZW06OnJlc2V0KHVpbnQ4X3QgKmJ1ZiwgdWludDMyX3QgbGVuLCBIQU5ETEUgZXZlbnQpIHsKLSAgbWVtc2V0KCAmb3ZlcmxhcCwgMCwgc2l6ZW9mKG92ZXJsYXApKTsKK3ZvaWQgVE92ZXJsYXBwZWRXb3JrSXRlbTo6cmVzZXQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4sIEhBTkRMRSBldmVudCkgeworICBtZW1zZXQoJm92ZXJsYXAsIDAsIHNpemVvZihvdmVybGFwKSk7CiAgIG92ZXJsYXAuaEV2ZW50ID0gZXZlbnQ7CiAgIGJ1ZmZlciA9IGJ1ZjsKICAgYnVmZmVyX2xlbiA9IGxlbjsKQEAgLTQ4LDcgKzUwLDcgQEAKIHVpbnQzMl90IFRPdmVybGFwcGVkV29ya0l0ZW06Om92ZXJsYXBwZWRSZXN1bHRzKGJvb2wgc2lnbmFsX2ZhaWx1cmUpIHsKICAgRFdPUkQgYnl0ZXMgPSAwOwogICBCT09MIHJlc3VsdCA9IDo6R2V0T3ZlcmxhcHBlZFJlc3VsdChoLCAmb3ZlcmxhcCwgJmJ5dGVzLCBUUlVFKTsKLSAgaWYoc2lnbmFsX2ZhaWx1cmUgJiYgIXJlc3VsdCkgLy9nZXQgb3ZlcmxhcHBlZCBlcnJvciBjYXNlCisgIGlmIChzaWduYWxfZmFpbHVyZSAmJiAhcmVzdWx0KSAvLyBnZXQgb3ZlcmxhcHBlZCBlcnJvciBjYXNlCiAgIHsKICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUUGlwZSA6OkdldE92ZXJsYXBwZWRSZXN1bHQgZXJyb3JlZCBHTEU9IiwgOjpHZXRMYXN0RXJyb3IoKSk7CiAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLCAiVFBpcGU6IEdldE92ZXJsYXBwZWRSZXN1bHQgZmFpbGVkIik7CkBAIC01Nyw0MiArNTksNDAgQEAKIH0KIAogYm9vbCBUT3ZlcmxhcHBlZFdvcmtJdGVtOjpwcm9jZXNzKCkgewotICBCT09TVF9TQ09QRV9FWElUKCAoJmRvbmVTdWJtaXR0aW5nRXZlbnQpICkgewotICAgIFNldEV2ZW50KGRvbmVTdWJtaXR0aW5nRXZlbnQuaCk7Ci0gIH0gQk9PU1RfU0NPUEVfRVhJVF9FTkQKKyAgQk9PU1RfU0NPUEVfRVhJVCgoJmRvbmVTdWJtaXR0aW5nRXZlbnQpKSB7IFNldEV2ZW50KGRvbmVTdWJtaXR0aW5nRXZlbnQuaCk7IH0KKyAgQk9PU1RfU0NPUEVfRVhJVF9FTkQKIAotICBzd2l0Y2goYWN0aW9uKSB7Ci0gIGNhc2UoQ09OTkVDVCk6CisgIHN3aXRjaCAoYWN0aW9uKSB7CisgIGNhc2UgKENPTk5FQ1QpOgogICAgIHN1Y2Nlc3MgPSA6OkNvbm5lY3ROYW1lZFBpcGUoaCwgJm92ZXJsYXApOwotICAgIGlmKHN1Y2Nlc3MgPT0gRkFMU0UpCisgICAgaWYgKHN1Y2Nlc3MgPT0gRkFMU0UpCiAgICAgICBsYXN0X2Vycm9yID0gOjpHZXRMYXN0RXJyb3IoKTsKICAgICByZXR1cm4gdHJ1ZTsKLSAgY2FzZShSRUFEKToKKyAgY2FzZSAoUkVBRCk6CiAgICAgc3VjY2VzcyA9IDo6UmVhZEZpbGUoaCwgYnVmZmVyLCBidWZmZXJfbGVuLCBOVUxMLCAmb3ZlcmxhcCk7Ci0gICAgaWYoc3VjY2VzcyA9PSBGQUxTRSkKKyAgICBpZiAoc3VjY2VzcyA9PSBGQUxTRSkKICAgICAgIGxhc3RfZXJyb3IgPSA6OkdldExhc3RFcnJvcigpOwogICAgIHJldHVybiB0cnVlOwotICBjYXNlKENBTkNFTElPKToKKyAgY2FzZSAoQ0FOQ0VMSU8pOgogICAgIHN1Y2Nlc3MgPSA6OkNhbmNlbElvKGgpOwotICAgIGlmKHN1Y2Nlc3MgPT0gRkFMU0UpCisgICAgaWYgKHN1Y2Nlc3MgPT0gRkFMU0UpCiAgICAgICBsYXN0X2Vycm9yID0gOjpHZXRMYXN0RXJyb3IoKTsKICAgICByZXR1cm4gdHJ1ZTsKLSAgY2FzZShTVE9QKToKKyAgY2FzZSAoU1RPUCk6CiAgIGRlZmF1bHQ6CiAgICAgcmV0dXJuIGZhbHNlOwogICB9CiB9CiAKLXZvaWQgVE92ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkOjphZGRXb3JrSXRlbShUT3ZlcmxhcHBlZFdvcmtJdGVtICppdGVtKSB7Cit2b2lkIFRPdmVybGFwcGVkU3VibWlzc2lvblRocmVhZDo6YWRkV29ya0l0ZW0oVE92ZXJsYXBwZWRXb3JrSXRlbSogaXRlbSkgewogICBJbnRlcmxvY2tlZFB1c2hFbnRyeVNMaXN0KCZ3b3JrTGlzdF8sIGl0ZW0pOwogICBTZXRFdmVudCh3b3JrQXZhaWxhYmxlRXZlbnRfLmgpOwogICBXYWl0Rm9yU2luZ2xlT2JqZWN0KGl0ZW0tPmRvbmVTdWJtaXR0aW5nRXZlbnQuaCwgSU5GSU5JVEUpOwogfQogCi1UT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQgKlRPdmVybGFwcGVkU3VibWlzc2lvblRocmVhZDo6YWNxdWlyZV9pbnN0YW5jZSgpIHsKK1RPdmVybGFwcGVkU3VibWlzc2lvblRocmVhZCogVE92ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkOjphY3F1aXJlX2luc3RhbmNlKCkgewogICBUQXV0b0NyaXQgbG9jayhpbnN0YW5jZUd1YXJkXyk7Ci0gIGlmKGluc3RhbmNlXyA9PSBOVUxMKQotICB7CisgIGlmIChpbnN0YW5jZV8gPT0gTlVMTCkgewogICAgIGFzc2VydChpbnN0YW5jZVJlZkNvdW50XyA9PSAwKTsKICAgICBpbnN0YW5jZV8gPSBuZXcgVE92ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkOwogICB9CkBAIC0xMDEsOCArMTAxLDcgQEAKIH0KIHZvaWQgVE92ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkOjpyZWxlYXNlX2luc3RhbmNlKCkgewogICBUQXV0b0NyaXQgbG9jayhpbnN0YW5jZUd1YXJkXyk7Ci0gIGlmKC0taW5zdGFuY2VSZWZDb3VudF8gPT0gMCkKLSAgeworICBpZiAoLS1pbnN0YW5jZVJlZkNvdW50XyA9PSAwKSB7CiAgICAgZGVsZXRlIGluc3RhbmNlXzsKICAgICBpbnN0YW5jZV8gPSBOVUxMOwogICB9CkBAIC0xMTIsMTYgKzExMSwxMSBAQAogICBzdG9wSXRlbV8uYWN0aW9uID0gVE92ZXJsYXBwZWRXb3JrSXRlbTo6U1RPUDsKIAogICBJbml0aWFsaXplU0xpc3RIZWFkKCZ3b3JrTGlzdF8pOwotICB0aHJlYWRfID0gKEhBTkRMRSlfYmVnaW50aHJlYWRleCgKLSAgICBOVUxMLAotICAgIDAsCi0gICAgdGhyZWFkX3Byb2MsCi0gICAgdGhpcywKLSAgICAwLAotICAgIE5VTEwpOwotICBpZih0aHJlYWRfID09IDApIHsKKyAgdGhyZWFkXyA9IChIQU5ETEUpX2JlZ2ludGhyZWFkZXgoTlVMTCwgMCwgdGhyZWFkX3Byb2MsIHRoaXMsIDAsIE5VTEwpOworICBpZiAodGhyZWFkXyA9PSAwKSB7CiAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVE92ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkIHVuYWJsZSB0byBjcmVhdGUgdGhyZWFkLCBlcnJubz0iLCBlcnJubyk7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIiBUT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQgdW5hYmxlIHRvIGNyZWF0ZSB0aHJlYWQiKTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBUT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQgdW5hYmxlIHRvIGNyZWF0ZSB0aHJlYWQiKTsKICAgfQogfQogCkBAIC0xMzIsMjUgKzEyNiwyNiBAQAogfQogCiB2b2lkIFRPdmVybGFwcGVkU3VibWlzc2lvblRocmVhZDo6cnVuKCkgewotICBmb3IoOzspIHsKKyAgZm9yICg7OykgewogICAgIFdhaXRGb3JTaW5nbGVPYmplY3Qod29ya0F2YWlsYWJsZUV2ZW50Xy5oLCBJTkZJTklURSk7Ci0gICAgLy90b2RvIGNoZWNrIHJlc3VsdAotICAgIFNMSVNUX0VOVFJZICplbnRyeSA9IE5VTEw7Ci0gICAgd2hpbGUoIChlbnRyeSA9IEludGVybG9ja2VkUG9wRW50cnlTTGlzdCgmd29ya0xpc3RfKSkgIT0gTlVMTCkgewotICAgICAgVE92ZXJsYXBwZWRXb3JrSXRlbSAmaXRlbSA9ICpzdGF0aWNfY2FzdDxUT3ZlcmxhcHBlZFdvcmtJdGVtICo+KGVudHJ5KTsKLSAgICAgIGlmKCFpdGVtLnByb2Nlc3MoKSkKKyAgICAvLyB0b2RvIGNoZWNrIHJlc3VsdAorICAgIFNMSVNUX0VOVFJZKiBlbnRyeSA9IE5VTEw7CisgICAgd2hpbGUgKChlbnRyeSA9IEludGVybG9ja2VkUG9wRW50cnlTTGlzdCgmd29ya0xpc3RfKSkgIT0gTlVMTCkgeworICAgICAgVE92ZXJsYXBwZWRXb3JrSXRlbSYgaXRlbSA9ICpzdGF0aWNfY2FzdDxUT3ZlcmxhcHBlZFdvcmtJdGVtKj4oZW50cnkpOworICAgICAgaWYgKCFpdGVtLnByb2Nlc3MoKSkKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgfQogfQogCi11bnNpZ25lZCBfX3N0ZGNhbGwgVE92ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkOjp0aHJlYWRfcHJvYyh2b2lkICphZGRyKSB7Ci0gIHN0YXRpY19jYXN0PFRPdmVybGFwcGVkU3VibWlzc2lvblRocmVhZCAqPihhZGRyKS0+cnVuKCk7Cit1bnNpZ25lZCBfX3N0ZGNhbGwgVE92ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkOjp0aHJlYWRfcHJvYyh2b2lkKiBhZGRyKSB7CisgIHN0YXRpY19jYXN0PFRPdmVybGFwcGVkU3VibWlzc2lvblRocmVhZCo+KGFkZHIpLT5ydW4oKTsKICAgcmV0dXJuIDA7CiB9CiAKIFRDcml0aWNhbFNlY3Rpb24gVE92ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkOjppbnN0YW5jZUd1YXJkXzsKIFRPdmVybGFwcGVkU3VibWlzc2lvblRocmVhZCogVE92ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkOjppbnN0YW5jZV87Ci11aW50MzJfdCBUT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQ6Omluc3RhbmNlUmVmQ291bnRfPTA7Ci0KLX19fSAvL2FwYWNoOjp0aHJpZnQ6OnRyYW5zcG9ydAordWludDMyX3QgVE92ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkOjppbnN0YW5jZVJlZkNvdW50XyA9IDA7Cit9Cit9Cit9IC8vIGFwYWNoOjp0aHJpZnQ6OnRyYW5zcG9ydApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL092ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkLmgKaW5kZXggMTZiN2UyNC4uZGQwYzVjOSAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9PdmVybGFwcGVkU3VibWlzc2lvblRocmVhZC5oCkBAIC01OSwxMyArNTksMTUgQEAKICAgdW50aWwgdGhlIG9wZXJhdGlvbiBoYXMgY29tcGxldGVkLgogKi8KIAotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKIAotREVDTFNQRUNfQUxJR04oTUVNT1JZX0FMTE9DQVRJT05fQUxJR05NRU5UKSBzdHJ1Y3QgVE92ZXJsYXBwZWRXb3JrSXRlbSA6IHB1YmxpYyBTTElTVF9FTlRSWSB7CitzdHJ1Y3QgREVDTFNQRUNfQUxJR04oTUVNT1JZX0FMTE9DQVRJT05fQUxJR05NRU5UKSBUT3ZlcmxhcHBlZFdvcmtJdGVtIDogcHVibGljIFNMSVNUX0VOVFJZIHsKICAgVE92ZXJsYXBwZWRXb3JrSXRlbSgpOwogCiAgIGVudW0gYWN0aW9uX3QgewotICAgIFVOS05PV04gID0gMzAwMCwKKyAgICBVTktOT1dOID0gMzAwMCwKICAgICBDT05ORUNULAogICAgIFJFQUQsCiAgICAgQ0FOQ0VMSU8sCkBAIC03NSwzOCArNzcsMzggQEAKICAgVEF1dG9SZXNldEV2ZW50IGRvbmVTdWJtaXR0aW5nRXZlbnQ7CiAgIGFjdGlvbl90IGFjdGlvbjsKICAgSEFORExFIGg7Ci0gIHVpbnQ4X3QgKmJ1ZmZlcjsKKyAgdWludDhfdCogYnVmZmVyOwogICB1aW50MzJfdCBidWZmZXJfbGVuOwogICBPVkVSTEFQUEVEIG92ZXJsYXA7CiAKICAgRFdPUkQgbGFzdF9lcnJvcjsKICAgQk9PTCBzdWNjZXNzOwogCi0gIHZvaWQgcmVzZXQodWludDhfdCAqYnVmLCB1aW50MzJfdCBsZW4sIEhBTkRMRSBldmVudCk7CisgIHZvaWQgcmVzZXQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4sIEhBTkRMRSBldmVudCk7CiAgIHVpbnQzMl90IG92ZXJsYXBwZWRSZXN1bHRzKGJvb2wgc2lnbmFsX2ZhaWx1cmUgPSB0cnVlKTsKICAgYm9vbCBwcm9jZXNzKCk7CiB9OwogCi1jbGFzcyBUT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQgOiBib29zdDo6bm9uY29weWFibGUKLXsKK2NsYXNzIFRPdmVybGFwcGVkU3VibWlzc2lvblRocmVhZCA6IGJvb3N0Ojpub25jb3B5YWJsZSB7CiBwdWJsaWM6Ci0gIHZvaWQgYWRkV29ya0l0ZW0oVE92ZXJsYXBwZWRXb3JrSXRlbSAqaXRlbSk7CisgIHZvaWQgYWRkV29ya0l0ZW0oVE92ZXJsYXBwZWRXb3JrSXRlbSogaXRlbSk7CiAKLS8vc2luZ2xldG9uIHN0dWZmCisgIC8vIHNpbmdsZXRvbiBzdHVmZgogcHVibGljOgotICBzdGF0aWMgVE92ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkICphY3F1aXJlX2luc3RhbmNlKCk7CisgIHN0YXRpYyBUT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQqIGFjcXVpcmVfaW5zdGFuY2UoKTsKICAgc3RhdGljIHZvaWQgcmVsZWFzZV9pbnN0YW5jZSgpOworCiBwcml2YXRlOgogICBzdGF0aWMgVENyaXRpY2FsU2VjdGlvbiBpbnN0YW5jZUd1YXJkXzsKLSAgc3RhdGljIFRPdmVybGFwcGVkU3VibWlzc2lvblRocmVhZCAqaW5zdGFuY2VfOworICBzdGF0aWMgVE92ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkKiBpbnN0YW5jZV87CiAgIHN0YXRpYyB1aW50MzJfdCBpbnN0YW5jZVJlZkNvdW50XzsKIAotLy90aHJlYWQgZGV0YWlscworICAvLyB0aHJlYWQgZGV0YWlscwogcHJpdmF0ZToKICAgVE92ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkKCk7CiAgIH5UT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQoKTsKICAgdm9pZCBydW4oKTsKLSAgc3RhdGljIHVuc2lnbmVkIF9fc3RkY2FsbCB0aHJlYWRfcHJvYyh2b2lkICphZGRyKTsKKyAgc3RhdGljIHVuc2lnbmVkIF9fc3RkY2FsbCB0aHJlYWRfcHJvYyh2b2lkKiBhZGRyKTsKIAogcHJpdmF0ZToKICAgREVDTFNQRUNfQUxJR04oTUVNT1JZX0FMTE9DQVRJT05fQUxJR05NRU5UKSBTTElTVF9IRUFERVIgd29ya0xpc3RfOwpAQCAtMTE3LDEzICsxMTksMTUgQEAKIAogY2xhc3MgVEF1dG9PdmVybGFwVGhyZWFkIDogYm9vc3Q6Om5vbmNvcHlhYmxlIHsKIHByaXZhdGU6Ci0gIFRPdmVybGFwcGVkU3VibWlzc2lvblRocmVhZCAqcDsKKyAgVE92ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkKiBwOworCiBwdWJsaWM6CiAgIFRBdXRvT3ZlcmxhcFRocmVhZCgpIDogcChUT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQ6OmFjcXVpcmVfaW5zdGFuY2UoKSkge30KLSAgflRBdXRvT3ZlcmxhcFRocmVhZCgpIHtUT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQ6OnJlbGVhc2VfaW5zdGFuY2UoKTt9Ci0gIFRPdmVybGFwcGVkU3VibWlzc2lvblRocmVhZCAqb3BlcmF0b3ItPigpIHtyZXR1cm4gcDt9CisgIH5UQXV0b092ZXJsYXBUaHJlYWQoKSB7IFRPdmVybGFwcGVkU3VibWlzc2lvblRocmVhZDo6cmVsZWFzZV9pbnN0YW5jZSgpOyB9CisgIFRPdmVybGFwcGVkU3VibWlzc2lvblRocmVhZCogb3BlcmF0b3ItPigpIHsgcmV0dXJuIHA7IH0KIH07Ci0KLX19fSAvL2FwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL1NvY2tldFBhaXIuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvU29ja2V0UGFpci5jcHAKaW5kZXggNGI2NWU2Yi4uNzIyODgzMiAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvU29ja2V0UGFpci5jcHAKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvU29ja2V0UGFpci5jcHAKQEAgLTM2LDY3ICszNiw2NSBAQAogLy8gV2luMzIKICNpbmNsdWRlIDxXUzJ0Y3BpcC5oPgogCi1pbnQgdGhyaWZ0X3NvY2tldHBhaXIoaW50IGQsIGludCB0eXBlLCBpbnQgcHJvdG9jb2wsIFRIUklGVF9TT0NLRVQgc3ZbMl0pCi17Ci0gICAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRShwcm90b2NvbCk7Ci0gICAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRSh0eXBlKTsKLSAgICBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFKGQpOworaW50IHRocmlmdF9zb2NrZXRwYWlyKGludCBkLCBpbnQgdHlwZSwgaW50IHByb3RvY29sLCBUSFJJRlRfU09DS0VUIHN2WzJdKSB7CisgIFRIUklGVF9VTlVTRURfVkFSSUFCTEUocHJvdG9jb2wpOworICBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFKHR5cGUpOworICBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFKGQpOwogCi0gICAgdW5pb24gewotICAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBpbmFkZHI7Ci0gICAgICAgc3RydWN0IHNvY2thZGRyIGFkZHI7Ci0gICAgfSBhOwotICAgIFRIUklGVF9TT0NLRVQgbGlzdGVuZXI7Ci0gICAgaW50IGU7Ci0gICAgc29ja2xlbl90IGFkZHJsZW4gPSBzaXplb2YoYS5pbmFkZHIpOwotICAgIERXT1JEIGZsYWdzID0gMDsKLSAgICBpbnQgcmV1c2UgPSAxOworICB1bmlvbiB7CisgICAgc3RydWN0IHNvY2thZGRyX2luIGluYWRkcjsKKyAgICBzdHJ1Y3Qgc29ja2FkZHIgYWRkcjsKKyAgfSBhOworICBUSFJJRlRfU09DS0VUIGxpc3RlbmVyOworICBpbnQgZTsKKyAgc29ja2xlbl90IGFkZHJsZW4gPSBzaXplb2YoYS5pbmFkZHIpOworICBEV09SRCBmbGFncyA9IDA7CisgIGludCByZXVzZSA9IDE7CiAKLSAgICBpZiAoc3YgPT0gMCkgewotICAgICAgV1NBU2V0TGFzdEVycm9yKFdTQUVJTlZBTCk7Ci0gICAgICByZXR1cm4gU09DS0VUX0VSUk9SOwotICAgIH0KLQotICAgIGxpc3RlbmVyID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX1RDUCk7Ci0gICAgaWYgKGxpc3RlbmVyID09IElOVkFMSURfU09DS0VUKQotICAgICAgICByZXR1cm4gU09DS0VUX0VSUk9SOwotCi0gICAgbWVtc2V0KCZhLCAwLCBzaXplb2YoYSkpOwotICAgIGEuaW5hZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOwotICAgIGEuaW5hZGRyLnNpbl9hZGRyLnNfYWRkciA9IGh0b25sKElOQUREUl9MT09QQkFDSyk7Ci0gICAgYS5pbmFkZHIuc2luX3BvcnQgPSAwOwotCi0gICAgc3ZbMF0gPSBzdlsxXSA9IElOVkFMSURfU09DS0VUOwotICAgIGRvIHsKLSAgICAgICAgLy9pZ25vcmUgZXJyb3JzIGNvbWluZyBvdXQgb2YgdGhpcyBzZXRzb2Nrb3B0LiAgVGhpcyBpcyBiZWNhdXNlCi0gICAgICAgIC8vU09fRVhDTFVTSVZFQUREUlVTRSByZXF1aXJlcyBhZG1pbiBwcml2aWxlZ2VzIG9uIFdpblhQLCBidXQgd2UgZG9uJ3QKLSAgICAgICAgLy93YW50IHRvIGZvcmNlIHNvY2tldCBwYWlycyB0byBiZSBhbiBhZG1pbi4KLSAgICAgICAgc2V0c29ja29wdChsaXN0ZW5lciwgU09MX1NPQ0tFVCwgU09fRVhDTFVTSVZFQUREUlVTRSwKLSAgICAgICAgICAgICAgIChjaGFyKikgJnJldXNlLCAoc29ja2xlbl90KSBzaXplb2YocmV1c2UpKTsKLSAgICAgICAgaWYgIChiaW5kKGxpc3RlbmVyLCAmYS5hZGRyLCBzaXplb2YoYS5pbmFkZHIpKSA9PSBTT0NLRVRfRVJST1IpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgaWYgIChnZXRzb2NrbmFtZShsaXN0ZW5lciwgJmEuYWRkciwgJmFkZHJsZW4pID09IFNPQ0tFVF9FUlJPUikKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBpZiAobGlzdGVuKGxpc3RlbmVyLCAxKSA9PSBTT0NLRVRfRVJST1IpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgc3ZbMF0gPSBXU0FTb2NrZXQoQUZfSU5FVCwgU09DS19TVFJFQU0sIDAsIE5VTEwsIDAsIGZsYWdzKTsKLSAgICAgICAgaWYgKHN2WzBdID09IElOVkFMSURfU09DS0VUKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGlmIChjb25uZWN0KHN2WzBdLCAmYS5hZGRyLCBzaXplb2YoYS5pbmFkZHIpKSA9PSBTT0NLRVRfRVJST1IpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgc3ZbMV0gPSBhY2NlcHQobGlzdGVuZXIsIE5VTEwsIE5VTEwpOwotICAgICAgICBpZiAoc3ZbMV0gPT0gSU5WQUxJRF9TT0NLRVQpCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjbG9zZXNvY2tldChsaXN0ZW5lcik7Ci0gICAgICAgIHJldHVybiAwOwotCi0gICAgfSB3aGlsZSAoMCk7Ci0KLSAgICBlID0gV1NBR2V0TGFzdEVycm9yKCk7Ci0gICAgY2xvc2Vzb2NrZXQobGlzdGVuZXIpOwotICAgIGNsb3Nlc29ja2V0KHN2WzBdKTsKLSAgICBjbG9zZXNvY2tldChzdlsxXSk7Ci0gICAgV1NBU2V0TGFzdEVycm9yKGUpOworICBpZiAoc3YgPT0gMCkgeworICAgIFdTQVNldExhc3RFcnJvcihXU0FFSU5WQUwpOwogICAgIHJldHVybiBTT0NLRVRfRVJST1I7CisgIH0KKworICBsaXN0ZW5lciA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgSVBQUk9UT19UQ1ApOworICBpZiAobGlzdGVuZXIgPT0gSU5WQUxJRF9TT0NLRVQpCisgICAgcmV0dXJuIFNPQ0tFVF9FUlJPUjsKKworICBtZW1zZXQoJmEsIDAsIHNpemVvZihhKSk7CisgIGEuaW5hZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworICBhLmluYWRkci5zaW5fYWRkci5zX2FkZHIgPSBodG9ubChJTkFERFJfTE9PUEJBQ0spOworICBhLmluYWRkci5zaW5fcG9ydCA9IDA7CisKKyAgc3ZbMF0gPSBzdlsxXSA9IElOVkFMSURfU09DS0VUOworICBkbyB7CisgICAgLy8gaWdub3JlIGVycm9ycyBjb21pbmcgb3V0IG9mIHRoaXMgc2V0c29ja29wdC4gIFRoaXMgaXMgYmVjYXVzZQorICAgIC8vIFNPX0VYQ0xVU0lWRUFERFJVU0UgcmVxdWlyZXMgYWRtaW4gcHJpdmlsZWdlcyBvbiBXaW5YUCwgYnV0IHdlIGRvbid0CisgICAgLy8gd2FudCB0byBmb3JjZSBzb2NrZXQgcGFpcnMgdG8gYmUgYW4gYWRtaW4uCisgICAgc2V0c29ja29wdChsaXN0ZW5lciwgU09MX1NPQ0tFVCwgU09fRVhDTFVTSVZFQUREUlVTRSwgKGNoYXIqKSZyZXVzZSwgKHNvY2tsZW5fdClzaXplb2YocmV1c2UpKTsKKyAgICBpZiAoYmluZChsaXN0ZW5lciwgJmEuYWRkciwgc2l6ZW9mKGEuaW5hZGRyKSkgPT0gU09DS0VUX0VSUk9SKQorICAgICAgYnJlYWs7CisgICAgaWYgKGdldHNvY2tuYW1lKGxpc3RlbmVyLCAmYS5hZGRyLCAmYWRkcmxlbikgPT0gU09DS0VUX0VSUk9SKQorICAgICAgYnJlYWs7CisgICAgaWYgKGxpc3RlbihsaXN0ZW5lciwgMSkgPT0gU09DS0VUX0VSUk9SKQorICAgICAgYnJlYWs7CisgICAgc3ZbMF0gPSBXU0FTb2NrZXQoQUZfSU5FVCwgU09DS19TVFJFQU0sIDAsIE5VTEwsIDAsIGZsYWdzKTsKKyAgICBpZiAoc3ZbMF0gPT0gSU5WQUxJRF9TT0NLRVQpCisgICAgICBicmVhazsKKyAgICBpZiAoY29ubmVjdChzdlswXSwgJmEuYWRkciwgc2l6ZW9mKGEuaW5hZGRyKSkgPT0gU09DS0VUX0VSUk9SKQorICAgICAgYnJlYWs7CisgICAgc3ZbMV0gPSBhY2NlcHQobGlzdGVuZXIsIE5VTEwsIE5VTEwpOworICAgIGlmIChzdlsxXSA9PSBJTlZBTElEX1NPQ0tFVCkKKyAgICAgIGJyZWFrOworCisgICAgY2xvc2Vzb2NrZXQobGlzdGVuZXIpOworICAgIHJldHVybiAwOworCisgIH0gd2hpbGUgKDApOworCisgIGUgPSBXU0FHZXRMYXN0RXJyb3IoKTsKKyAgY2xvc2Vzb2NrZXQobGlzdGVuZXIpOworICBjbG9zZXNvY2tldChzdlswXSk7CisgIGNsb3Nlc29ja2V0KHN2WzFdKTsKKyAgV1NBU2V0TGFzdEVycm9yKGUpOworICByZXR1cm4gU09DS0VUX0VSUk9SOwogfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvU3luYy5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvU3luYy5oCmluZGV4IGRlZDZlYTMuLjVkMzIxOTkgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL1N5bmMuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9TeW5jLmgKQEAgLTMzLDUzICszMyw1NSBAQAogICBjb2RlLCB1c2UgdGhlIGNsYXNzZXMgZm91bmQgaW4gdGhlIGNvbmN1cnJlbmN5IG5hbWVzcGFjZQogKi8KIAotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKIAogc3RydWN0IFRDcml0aWNhbFNlY3Rpb24gOiBib29zdDo6bm9uY29weWFibGUgewogICBDUklUSUNBTF9TRUNUSU9OIGNzOwotICBUQ3JpdGljYWxTZWN0aW9uKCkge0luaXRpYWxpemVDcml0aWNhbFNlY3Rpb24oJmNzKTt9Ci0gIH5UQ3JpdGljYWxTZWN0aW9uKCkge0RlbGV0ZUNyaXRpY2FsU2VjdGlvbigmY3MpO30KKyAgVENyaXRpY2FsU2VjdGlvbigpIHsgSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbigmY3MpOyB9CisgIH5UQ3JpdGljYWxTZWN0aW9uKCkgeyBEZWxldGVDcml0aWNhbFNlY3Rpb24oJmNzKTsgfQogfTsKIAogY2xhc3MgVEF1dG9Dcml0IDogYm9vc3Q6Om5vbmNvcHlhYmxlIHsKIHByaXZhdGU6Ci0gIENSSVRJQ0FMX1NFQ1RJT04gKmNzXzsKKyAgQ1JJVElDQUxfU0VDVElPTiogY3NfOworCiBwdWJsaWM6Ci0gIGV4cGxpY2l0IFRBdXRvQ3JpdChUQ3JpdGljYWxTZWN0aW9uICZjcykgOiBjc18oJmNzLmNzKSB7RW50ZXJDcml0aWNhbFNlY3Rpb24oY3NfKTt9Ci0gIH5UQXV0b0NyaXQoKSB7TGVhdmVDcml0aWNhbFNlY3Rpb24oY3NfKTt9CisgIGV4cGxpY2l0IFRBdXRvQ3JpdChUQ3JpdGljYWxTZWN0aW9uJiBjcykgOiBjc18oJmNzLmNzKSB7IEVudGVyQ3JpdGljYWxTZWN0aW9uKGNzXyk7IH0KKyAgflRBdXRvQ3JpdCgpIHsgTGVhdmVDcml0aWNhbFNlY3Rpb24oY3NfKTsgfQogfTsKIAogc3RydWN0IFRBdXRvUmVzZXRFdmVudCA6IGJvb3N0Ojpub25jb3B5YWJsZSB7CiAgIEhBTkRMRSBoOwogCiAgIFRBdXRvUmVzZXRFdmVudCgpIHsKLSAgICBoID0gQ3JlYXRlRXZlbnQoIE5VTEwsIEZBTFNFLCBGQUxTRSwgTlVMTCk7Ci0gICAgaWYoaCA9PSBOVUxMKSB7CisgICAgaCA9IENyZWF0ZUV2ZW50KE5VTEwsIEZBTFNFLCBGQUxTRSwgTlVMTCk7CisgICAgaWYgKGggPT0gTlVMTCkgewogICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVEF1dG9SZXNldEV2ZW50IHVuYWJsZSB0byBjcmVhdGUgZXZlbnQsIEdMRT0iLCBHZXRMYXN0RXJyb3IoKSk7CiAgICAgICB0aHJvdyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlN5c3RlbVJlc291cmNlRXhjZXB0aW9uKCJDcmVhdGVFdmVudCBmYWlsZWQiKTsKICAgICB9CiAgIH0KLSAgflRBdXRvUmVzZXRFdmVudCgpIHtDbG9zZUhhbmRsZShoKTt9CisgIH5UQXV0b1Jlc2V0RXZlbnQoKSB7IENsb3NlSGFuZGxlKGgpOyB9CiB9OwogCiBzdHJ1Y3QgVE1hbnVhbFJlc2V0RXZlbnQgOiBib29zdDo6bm9uY29weWFibGUgewogICBIQU5ETEUgaDsKIAogICBUTWFudWFsUmVzZXRFdmVudCgpIHsKLSAgICBoID0gQ3JlYXRlRXZlbnQoIE5VTEwsIFRSVUUsIEZBTFNFLCBOVUxMKTsKLSAgICBpZihoID09IE5VTEwpIHsKKyAgICBoID0gQ3JlYXRlRXZlbnQoTlVMTCwgVFJVRSwgRkFMU0UsIE5VTEwpOworICAgIGlmIChoID09IE5VTEwpIHsKICAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRNYW51YWxSZXNldEV2ZW50IHVuYWJsZSB0byBjcmVhdGUgZXZlbnQsIEdMRT0iLCBHZXRMYXN0RXJyb3IoKSk7CiAgICAgICB0aHJvdyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlN5c3RlbVJlc291cmNlRXhjZXB0aW9uKCJDcmVhdGVFdmVudCBmYWlsZWQiKTsKICAgICB9CiAgIH0KLSAgflRNYW51YWxSZXNldEV2ZW50KCkge0Nsb3NlSGFuZGxlKGgpO30KKyAgflRNYW51YWxSZXNldEV2ZW50KCkgeyBDbG9zZUhhbmRsZShoKTsgfQogfTsKIAogc3RydWN0IFRBdXRvSGFuZGxlIDogYm9vc3Q6Om5vbmNvcHlhYmxlIHsKICAgSEFORExFIGg7CiAgIGV4cGxpY2l0IFRBdXRvSGFuZGxlKEhBTkRMRSBoXyA9IElOVkFMSURfSEFORExFX1ZBTFVFKSA6IGgoaF8pIHt9CiAgIH5UQXV0b0hhbmRsZSgpIHsKLSAgICBpZihoICE9IElOVkFMSURfSEFORExFX1ZBTFVFKQorICAgIGlmIChoICE9IElOVkFMSURfSEFORExFX1ZBTFVFKQogICAgICAgQ2xvc2VIYW5kbGUoaCk7CiAgIH0KIApAQCAtODksMTQgKzkxLDE0IEBACiAgICAgcmV0dXJuIHJldHZhbDsKICAgfQogICB2b2lkIHJlc2V0KEhBTkRMRSBoXyA9IElOVkFMSURfSEFORExFX1ZBTFVFKSB7Ci0gICAgaWYoaF8gPT0gaCkKKyAgICBpZiAoaF8gPT0gaCkKICAgICAgIHJldHVybjsKLSAgICBpZihoICE9IElOVkFMSURfSEFORExFX1ZBTFVFKQorICAgIGlmIChoICE9IElOVkFMSURfSEFORExFX1ZBTFVFKQogICAgICAgQ2xvc2VIYW5kbGUoaCk7CiAgICAgaCA9IGhfOwogICB9CiB9OwotCi19fSAvL2FwYWNoZTo6dGhyaWZ0Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvVFdpbnNvY2tTaW5nbGV0b24uY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvVFdpbnNvY2tTaW5nbGV0b24uY3BwCmluZGV4IDJlMzA2YzYuLmQyNjgzYjAgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL1RXaW5zb2NrU2luZ2xldG9uLmNwcAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9UV2luc29ja1NpbmdsZXRvbi5jcHAKQEAgLTIzLDUxICsyMywzOSBAQAogI2luY2x1ZGUgPGJvb3N0L2Fzc2VydC5ocHA+CiAjaW5jbHVkZSA8c3RkZXhjZXB0PgogCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0cmFuc3BvcnQgeworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgewogCiBUV2luc29ja1NpbmdsZXRvbjo6aW5zdGFuY2VfcHRyIFRXaW5zb2NrU2luZ2xldG9uOjppbnN0YW5jZV9wdHJfKE5VTEwpOwotI2lmIFVTRV9CT09TVF9USFJFQUQKLWJvb3N0OjpvbmNlX2ZsYWcgICAgICAgICAgICAgICAgVFdpbnNvY2tTaW5nbGV0b246OmZsYWdzXyA9IEJPT1NUX09OQ0VfSU5JVDsKLSNlbGlmIFVTRV9TVERfVEhSRUFECi1zdGQ6Om9uY2VfZmxhZyAgICAgICAgICAgICAgICAgIFRXaW5zb2NrU2luZ2xldG9uOjpmbGFnc187Ci0jZWxzZQotI2Vycm9yIEZvciB3aW5kb3dzIHlvdSBtdXN0IGNob29zZSBVU0VfQk9PU1RfVEhSRUFEIG9yIFVTRV9TVERfVEhSRUFECi0jZW5kaWYKK3N0ZDo6b25jZV9mbGFnIFRXaW5zb2NrU2luZ2xldG9uOjpmbGFnc187CiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1UV2luc29ja1NpbmdsZXRvbjo6VFdpbnNvY2tTaW5nbGV0b24odm9pZCkKLXsKLSAgICBXT1JEICAgIHZlcnNpb24oTUFLRVdPUkQoMiwgMikpOwotICAgIFdTQURhdGEgZGF0YSA9IHswfTsKK1RXaW5zb2NrU2luZ2xldG9uOjpUV2luc29ja1NpbmdsZXRvbih2b2lkKSB7CisgIFdPUkQgdmVyc2lvbihNQUtFV09SRCgyLCAyKSk7CisgIFdTQURhdGEgZGF0YSA9IHswfTsKIAotICAgIGludCBlcnJvcihXU0FTdGFydHVwKHZlcnNpb24sICZkYXRhKSk7Ci0gICAgaWYgKGVycm9yICE9IDApCi0gICAgewotICAgICAgICBCT09TVF9BU1NFUlQoZmFsc2UpOwotICAgICAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoIkZhaWxlZCB0byBpbml0aWFsaXNlIFdpbnNvY2suIik7Ci0gICAgfQorICBpbnQgZXJyb3IoV1NBU3RhcnR1cCh2ZXJzaW9uLCAmZGF0YSkpOworICBpZiAoZXJyb3IgIT0gMCkgeworICAgIEJPT1NUX0FTU0VSVChmYWxzZSk7CisgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCJGYWlsZWQgdG8gaW5pdGlhbGlzZSBXaW5zb2NrLiIpOworICB9CiB9CiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1UV2luc29ja1NpbmdsZXRvbjo6flRXaW5zb2NrU2luZ2xldG9uKHZvaWQpCi17Ci0gICAgV1NBQ2xlYW51cCgpOworVFdpbnNvY2tTaW5nbGV0b246On5UV2luc29ja1NpbmdsZXRvbih2b2lkKSB7CisgIFdTQUNsZWFudXAoKTsKIH0KIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXZvaWQgVFdpbnNvY2tTaW5nbGV0b246OmNyZWF0ZSh2b2lkKQotewotI2lmIFVTRV9CT09TVF9USFJFQUQKLSAgICBib29zdDo6Y2FsbF9vbmNlKGluaXQsIGZsYWdzXyk7Ci0jZWxpZiBVU0VfU1REX1RIUkVBRAotICAgIHN0ZDo6Y2FsbF9vbmNlKGZsYWdzXywgaW5pdCk7Ci0jZW5kaWYKK3ZvaWQgVFdpbnNvY2tTaW5nbGV0b246OmNyZWF0ZSh2b2lkKSB7CisgIHN0ZDo6Y2FsbF9vbmNlKGZsYWdzXywgaW5pdCk7CiB9CiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi12b2lkIFRXaW5zb2NrU2luZ2xldG9uOjppbml0KHZvaWQpCi17Ci0gICAgaW5zdGFuY2VfcHRyXy5yZXNldChuZXcgVFdpbnNvY2tTaW5nbGV0b24pOwordm9pZCBUV2luc29ja1NpbmdsZXRvbjo6aW5pdCh2b2lkKSB7CisgIGluc3RhbmNlX3B0cl8ucmVzZXQobmV3IFRXaW5zb2NrU2luZ2xldG9uKTsKIH0KLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvVFdpbnNvY2tTaW5nbGV0b24uaCBiL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL1RXaW5zb2NrU2luZ2xldG9uLmgKaW5kZXggYWIxMmMyMi4uYTMwODA2YiAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvVFdpbnNvY2tTaW5nbGV0b24uaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9UV2luc29ja1NpbmdsZXRvbi5oCkBAIC0zMiw1NyArMzIsNDIgQEAKIAogLy8gYm9vc3QKICNpbmNsdWRlIDxib29zdC9ub25jb3B5YWJsZS5ocHA+Ci0jaW5jbHVkZSA8Ym9vc3Qvc2NvcGVkX3B0ci5ocHA+CiAKLSNpZiBVU0VfQk9PU1RfVEhSRUFECi0jaW5jbHVkZSA8Ym9vc3QvdGhyZWFkL29uY2UuaHBwPgotI2VsaWYgVVNFX1NURF9USFJFQUQKKyNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8bXV0ZXg+Ci0jZWxzZQotI2Vycm9yIEZvciB3aW5kb3dzIHlvdSBtdXN0IGNob29zZSBVU0VfQk9PU1RfVEhSRUFEIG9yIFVTRV9TVERfVEhSRUFECi0jZW5kaWYKIAotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgewogCiAvKioKICAqIFdpbnNvY2syIG11c3QgYmUgaW50aWFsaXNlZCBvbmNlIG9ubHkgaW4gb3JkZXIgdG8gY3JlYXRlIHNvY2tldHMuIFRoaXMgY2xhc3MKICAqIHBlcmZvcm1zIGEgb25lIHRpbWUgaW5pdGlhbGlzYXRpb24gd2hlbiBjcmVhdGUgaXMgY2FsbGVkLgogICovCi1jbGFzcyBUV2luc29ja1NpbmdsZXRvbiA6IHByaXZhdGUgYm9vc3Q6Om5vbmNvcHlhYmxlCi17CitjbGFzcyBUV2luc29ja1NpbmdsZXRvbiA6IHByaXZhdGUgYm9vc3Q6Om5vbmNvcHlhYmxlIHsKIAogcHVibGljOgotCi0gICAgdHlwZWRlZiBib29zdDo6c2NvcGVkX3B0cjxUV2luc29ja1NpbmdsZXRvbj4gaW5zdGFuY2VfcHRyOworICB0eXBlZGVmIHN0ZDo6c2hhcmVkX3B0cjxUV2luc29ja1NpbmdsZXRvbj4gaW5zdGFuY2VfcHRyOwogCiBwcml2YXRlOgotCi0gICAgVFdpbnNvY2tTaW5nbGV0b24odm9pZCk7CisgIFRXaW5zb2NrU2luZ2xldG9uKHZvaWQpOwogCiBwdWJsaWM6Ci0KLSAgICB+VFdpbnNvY2tTaW5nbGV0b24odm9pZCk7CisgIH5UV2luc29ja1NpbmdsZXRvbih2b2lkKTsKIAogcHVibGljOgotCi0gICAgc3RhdGljIHZvaWQgY3JlYXRlKHZvaWQpOworICBzdGF0aWMgdm9pZCBjcmVhdGUodm9pZCk7CiAKIHByaXZhdGU6Ci0KLSAgICBzdGF0aWMgdm9pZCBpbml0KHZvaWQpOworICBzdGF0aWMgdm9pZCBpbml0KHZvaWQpOwogCiBwcml2YXRlOgotCi0gICAgc3RhdGljIGluc3RhbmNlX3B0ciAgICAgaW5zdGFuY2VfcHRyXzsKLSNpZiBVU0VfQk9PU1RfVEhSRUFECi0gICAgc3RhdGljIGJvb3N0OjpvbmNlX2ZsYWcgZmxhZ3NfOwotI2VsaWYgVVNFX1NURF9USFJFQUQKLSAgICBzdGF0aWMgc3RkOjpvbmNlX2ZsYWcgZmxhZ3NfOwotI2Vsc2UKLSNlcnJvciBOZWVkIGEgbm9uLUJvb3N0IG5vbi1DKysxMSB3YXkgdG8gdHJhY2sgc2luZ2xlIGluaXRpYWxpemF0aW9uIGhlcmUuCi0jZW5kaWYKKyAgc3RhdGljIGluc3RhbmNlX3B0ciBpbnN0YW5jZV9wdHJfOworICBzdGF0aWMgc3RkOjpvbmNlX2ZsYWcgZmxhZ3NfOwogfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAogCiAjZW5kaWYgLy8gX1RIUklGVF9UUkFOU1BPUlRfV0lORE9XU19UV0lOU09DS1NJTkdMRVRPTl9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvV2luRmNudGwuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvV2luRmNudGwuY3BwCmluZGV4IDNkZDRlM2QuLmM5MDdlOTIgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL1dpbkZjbnRsLmNwcAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9XaW5GY250bC5jcHAKQEAgLTE5LDU0ICsxOSw0NiBAQAogCiAjaW5jbHVkZSA8dGhyaWZ0L3dpbmRvd3MvV2luRmNudGwuaD4KIAotaW50IHRocmlmdF9mY250bChUSFJJRlRfU09DS0VUIGZkLCBpbnQgY21kLCBpbnQgZmxhZ3MpCi17Ci0gICAgaWYoY21kICE9IFRIUklGVF9GX0dFVEZMICYmIGNtZCAhPSBUSFJJRlRfRl9TRVRGTCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9CitpbnQgdGhyaWZ0X2ZjbnRsKFRIUklGVF9TT0NLRVQgZmQsIGludCBjbWQsIGludCBmbGFncykgeworICBpZiAoY21kICE9IFRIUklGVF9GX0dFVEZMICYmIGNtZCAhPSBUSFJJRlRfRl9TRVRGTCkgeworICAgIHJldHVybiAtMTsKKyAgfQogCi0gICAgaWYoZmxhZ3MgIT0gVEhSSUZUX09fTk9OQkxPQ0sgJiYgZmxhZ3MgIT0gMCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9CisgIGlmIChmbGFncyAhPSBUSFJJRlRfT19OT05CTE9DSyAmJiBmbGFncyAhPSAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CiAKLSAgICBpZihjbWQgPT0gVEhSSUZUX0ZfR0VURkwpCi0gICAgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9CisgIGlmIChjbWQgPT0gVEhSSUZUX0ZfR0VURkwpIHsKKyAgICByZXR1cm4gMDsKKyAgfQogCi0gICAgaW50IHJlczsKLSAgICBpZihmbGFncykKLSAgICB7Ci0gICAgICAgIHJlcyA9IGlvY3Rsc29ja2V0KGZkLCBGSU9OQklPLCByZWludGVycHJldF9jYXN0PHVfbG9uZyAqPigmKGZsYWdzID0gMSkpKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcmVzID0gaW9jdGxzb2NrZXQoZmQsIEZJT05CSU8sIHJlaW50ZXJwcmV0X2Nhc3Q8dV9sb25nICo+KCYoZmxhZ3MgPSAwKSkpOwotICAgIH0KKyAgaW50IHJlczsKKyAgaWYgKGZsYWdzKSB7CisgICAgcmVzID0gaW9jdGxzb2NrZXQoZmQsIEZJT05CSU8sIHJlaW50ZXJwcmV0X2Nhc3Q8dV9sb25nKj4oJihmbGFncyA9IDEpKSk7CisgIH0gZWxzZSB7CisgICAgcmVzID0gaW9jdGxzb2NrZXQoZmQsIEZJT05CSU8sIHJlaW50ZXJwcmV0X2Nhc3Q8dV9sb25nKj4oJihmbGFncyA9IDApKSk7CisgIH0KIAotICAgIHJldHVybiByZXM7CisgIHJldHVybiByZXM7CiB9CiAKLSNpZiBXSU5WRVIgPD0gMHgwNTAyIC8vWFAsIFNlcnZlcjIwMDMKLWludCB0aHJpZnRfcG9sbChUSFJJRlRfUE9MTEZEICpmZEFycmF5LCBVTE9ORyBuZmRzLCBJTlQgdGltZW91dCkKLXsKKyNpZiBXSU5WRVIgPD0gMHgwNTAyIC8vIFhQLCBTZXJ2ZXIyMDAzCitpbnQgdGhyaWZ0X3BvbGwoVEhSSUZUX1BPTExGRCogZmRBcnJheSwgVUxPTkcgbmZkcywgSU5UIHRpbWVvdXQpIHsKICAgZmRfc2V0IHJlYWRfZmRzLCB3cml0ZV9mZHM7Ci0gIGZkX3NldCogcmVhZF9mZHNfcHRyICA9IE5VTEw7CisgIGZkX3NldCogcmVhZF9mZHNfcHRyID0gTlVMTDsKICAgZmRfc2V0KiB3cml0ZV9mZHNfcHRyID0gTlVMTDsKIAogICBGRF9aRVJPKCZyZWFkX2Zkcyk7CiAgIEZEX1pFUk8oJndyaXRlX2Zkcyk7CiAKLSAgZm9yKFVMT05HIGk9MDsgaTxuZmRzOyBpKyspIHsKLSAgICAvL1JlYWQgKGluKSBzb2NrZXQKLSAgICBpZigoZmRBcnJheVtpXS5ldmVudHMgJiBUSFJJRlRfUE9MTElOKSA9PSBUSFJJRlRfUE9MTElOKSB7CisgIGZvciAoVUxPTkcgaSA9IDA7IGkgPCBuZmRzOyBpKyspIHsKKyAgICAvLyBSZWFkIChpbikgc29ja2V0CisgICAgaWYgKChmZEFycmF5W2ldLmV2ZW50cyAmIFRIUklGVF9QT0xMSU4pID09IFRIUklGVF9QT0xMSU4pIHsKICAgICAgIHJlYWRfZmRzX3B0ciA9ICZyZWFkX2ZkczsKICAgICAgIEZEX1NFVChmZEFycmF5W2ldLmZkLCAmcmVhZF9mZHMpOwogICAgIH0KLSAgICAvL1dyaXRlIChvdXQpIHNvY2tldAotICAgIGVsc2UgaWYoKGZkQXJyYXlbaV0uZXZlbnRzICYgVEhSSUZUX1BPTExPVVQpID09IFRIUklGVF9QT0xMT1VUKSB7CisgICAgLy8gV3JpdGUgKG91dCkgc29ja2V0CisgICAgZWxzZSBpZiAoKGZkQXJyYXlbaV0uZXZlbnRzICYgVEhSSUZUX1BPTExPVVQpID09IFRIUklGVF9QT0xMT1VUKSB7CiAgICAgICB3cml0ZV9mZHNfcHRyID0gJndyaXRlX2ZkczsKICAgICAgIEZEX1NFVChmZEFycmF5W2ldLmZkLCAmd3JpdGVfZmRzKTsKICAgICB9CkBAIC03NCwzNyArNjYsMzYgQEAKIAogICB0aW1ldmFsIHRpbWVfb3V0OwogICB0aW1ldmFsKiB0aW1lX291dF9wdHIgPSBOVUxMOwotICBpZih0aW1lb3V0ID49IDApIHsKLSAgICB0aW1ldmFsIHRpbWVfb3V0ID0ge3RpbWVvdXQgLyAxMDAwLCAodGltZW91dCAlIDEwMDApICogMTAwMH07CisgIGlmICh0aW1lb3V0ID49IDApIHsKKyAgICB0aW1lX291dC50dl9zZWMgPSB0aW1lb3V0IC8gMTAwMDsKKyAgICB0aW1lX291dC50dl91c2VjID0gKHRpbWVvdXQgJSAxMDAwKSAqIDEwMDA7CiAgICAgdGltZV9vdXRfcHRyID0gJnRpbWVfb3V0OwotICB9Ci0gIGVsc2UgeyAvL3RvIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmdzCisgIH0gZWxzZSB7IC8vIHRvIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmdzCiAgICAgKHZvaWQpdGltZV9vdXQ7CiAgICAgKHZvaWQpdGltZW91dDsKICAgfQogCiAgIGludCBza3RyZWFkeSA9IHNlbGVjdCgxLCByZWFkX2Zkc19wdHIsIHdyaXRlX2Zkc19wdHIsIE5VTEwsIHRpbWVfb3V0X3B0cik7Ci0gIGlmKHNrdHJlYWR5ID4gMCkgewotICAgIGZvcihVTE9ORyBpPTA7IGk8bmZkczsgaSsrKSB7CisgIGlmIChza3RyZWFkeSA+IDApIHsKKyAgICBmb3IgKFVMT05HIGkgPSAwOyBpIDwgbmZkczsgaSsrKSB7CiAgICAgICBmZEFycmF5W2ldLnJldmVudHMgPSAwOwotICAgICAgaWYoRkRfSVNTRVQoZmRBcnJheVtpXS5mZCwgJnJlYWRfZmRzKSkKKyAgICAgIGlmIChGRF9JU1NFVChmZEFycmF5W2ldLmZkLCAmcmVhZF9mZHMpKQogICAgICAgICBmZEFycmF5W2ldLnJldmVudHMgfD0gVEhSSUZUX1BPTExJTjsKLSAgICAgIGlmKEZEX0lTU0VUKGZkQXJyYXlbaV0uZmQsICZ3cml0ZV9mZHMpKQorICAgICAgaWYgKEZEX0lTU0VUKGZkQXJyYXlbaV0uZmQsICZ3cml0ZV9mZHMpKQogICAgICAgICBmZEFycmF5W2ldLnJldmVudHMgfD0gVEhSSUZUX1BPTExPVVQ7CiAgICAgfQogICB9CiAgIHJldHVybiBza3RyZWFkeTsKIH0KLSNlbHNlIC8vVmlzdGEsIFdpbjcuLi4KLWludCB0aHJpZnRfcG9sbChUSFJJRlRfUE9MTEZEICpmZEFycmF5LCBVTE9ORyBuZmRzLCBJTlQgdGltZW91dCkKLXsKKyNlbHNlICAvLyBWaXN0YSwgV2luNy4uLgoraW50IHRocmlmdF9wb2xsKFRIUklGVF9QT0xMRkQqIGZkQXJyYXksIFVMT05HIG5mZHMsIElOVCB0aW1lb3V0KSB7CiAgIHJldHVybiBXU0FQb2xsKGZkQXJyYXksIG5mZHMsIHRpbWVvdXQpOwogfQogI2VuZGlmIC8vIFdJTlZFUgogCiAjaWZkZWYgX1dJTjMyX1dDRQogc3RkOjpzdHJpbmcgdGhyaWZ0X3dzdHIyc3RyKHN0ZDo6d3N0cmluZyB3cykgewotCXN0ZDo6c3RyaW5nIHMod3MuYmVnaW4oKSwgd3MuZW5kKCkpOwotCXJldHVybiBzOworICBzdGQ6OnN0cmluZyBzKHdzLmJlZ2luKCksIHdzLmVuZCgpKTsKKyAgcmV0dXJuIHM7CiB9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL1dpbkZjbnRsLmggYi9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9XaW5GY250bC5oCmluZGV4IDExOGM5YTQuLjZjNmJlOTcgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL1dpbkZjbnRsLmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvV2luRmNudGwuaApAQCAtMzYsMTcgKzM2LDE3IEBACiAjaW5jbHVkZSA8V2luc29jazIuaD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1BsYXRmb3JtU29ja2V0Lmg+CiAKLSNpZiBXSU5WRVIgPD0gMHgwNTAyIC8vWFAsIFNlcnZlcjIwMDMKKyNpZiBXSU5WRVIgPD0gMHgwNTAyIC8vIFhQLCBTZXJ2ZXIyMDAzCiBzdHJ1Y3QgdGhyaWZ0X3BvbGxmZCB7Ci0gIFRIUklGVF9TT0NLRVQgIGZkOwotICBTSE9SVCAgIGV2ZW50czsKLSAgU0hPUlQgICByZXZlbnRzOworICBUSFJJRlRfU09DS0VUIGZkOworICBTSE9SVCBldmVudHM7CisgIFNIT1JUIHJldmVudHM7CiB9OwogI2VuZGlmCiAKIGV4dGVybiAiQyIgewogaW50IHRocmlmdF9mY250bChUSFJJRlRfU09DS0VUIGZkLCBpbnQgY21kLCBpbnQgZmxhZ3MpOwotaW50IHRocmlmdF9wb2xsKFRIUklGVF9QT0xMRkQgKmZkQXJyYXksIFVMT05HIG5mZHMsIElOVCB0aW1lb3V0KTsKK2ludCB0aHJpZnRfcG9sbChUSFJJRlRfUE9MTEZEKiBmZEFycmF5LCBVTE9ORyBuZmRzLCBJTlQgdGltZW91dCk7CiB9CiAKICNpZmRlZiBfV0lOMzJfV0NFCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9jb25maWcuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL2NvbmZpZy5oCmluZGV4IDZhZjAxZDMuLmE1ZjQ0NTcgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL2NvbmZpZy5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL2NvbmZpZy5oCkBAIC0yNSw1OCArMjUsNjUgQEAKICNlbmRpZiAvLyBfTVNDX1ZFUgogCiAjaWZuZGVmIF9XSU4zMgotI2Vycm9yIFRoaXMgaXMgYSBNU1ZDIGhlYWRlciBvbmx5LgorI2Vycm9yICJUaGlzIGlzIGEgV2luZG93cyBoZWFkZXIgb25seSIKICNlbmRpZgogCi0vLyB1c2Ugc3RkOjp0aHJlYWQgaW4gTVNWQzExICgyMDEyKSBvciBuZXdlcgotI2lmIF9NU0NfVkVSID49IDE3MDAKLSMgIGRlZmluZSBVU0VfU1REX1RIUkVBRCAxCi0vLyBvdGhlcndpc2UgdXNlIGJvb3N0IHRocmVhZHMKLSNlbHNlCi0jICBkZWZpbmUgVVNFX0JPT1NUX1RIUkVBRCAxCisvLyB1c2Ugc3RkOjp0aHJlYWQgaW4gTVNWQzExICgyMDEyKSBvciBuZXdlciBhbmQgaW4gTWluR1cKKyNpZiAoX01TQ19WRVIgPj0gMTcwMCkgfHwgZGVmaW5lZChfX01JTkdXMzJfXykKKyNkZWZpbmUgVVNFX1NURF9USFJFQUQgMQorI2VuZGlmCisKKy8vIFNvbWV0aGluZyB0aGF0IGRlZmluZXMgUFJJZDY0IGlzIHJlcXVpcmVkIHRvIGJ1aWxkCisjZGVmaW5lIEhBVkVfSU5UVFlQRVNfSCAxCisKKy8vIFZTMjAxMCBvciBsYXRlciBoYXMgc3RkaW50LmggYXMgZG9lcyBNaW5HVworI2lmIChfTVNDX1ZFUiA+PSAxNjAwKSB8fCBkZWZpbmVkKF9fTUlOR1czMl9fKQorI2RlZmluZSBIQVZFX1NURElOVF9IIDEKICNlbmRpZgogCiAjaWZuZGVmIFRBUkdFVF9XSU5fWFAKLSMgIGRlZmluZSBUQVJHRVRfV0lOX1hQIDEKKyNkZWZpbmUgVEFSR0VUX1dJTl9YUCAxCiAjZW5kaWYKIAogI2lmIFRBUkdFVF9XSU5fWFAKLSMgIGlmbmRlZiBXSU5WRVIKLSMgICAgZGVmaW5lIFdJTlZFUiAweDA1MDEKLSMgIGVuZGlmCi0jICBpZm5kZWYgX1dJTjMyX1dJTk5UCi0jICAgIGRlZmluZSBfV0lOMzJfV0lOTlQgMHgwNTAxCi0jICBlbmRpZgorI2lmbmRlZiBXSU5WRVIKKyNkZWZpbmUgV0lOVkVSIDB4MDUwMQorI2VuZGlmCisjaWZuZGVmIF9XSU4zMl9XSU5OVAorI2RlZmluZSBfV0lOMzJfV0lOTlQgMHgwNTAxCisjZW5kaWYKICNlbmRpZgogCiAjaWZuZGVmIF9XSU4zMl9XSU5OVAotIyAgZGVmaW5lIF9XSU4zMl9XSU5OVCAweDA2MDEKKyNkZWZpbmUgX1dJTjMyX1dJTk5UIDB4MDYwMQogI2VuZGlmCiAKICNpZiBkZWZpbmVkKF9NX0lYODYpIHx8IGRlZmluZWQoX01fWDY0KQotIyAgZGVmaW5lIEFSSVRITUVUSUNfUklHSFRfU0hJRlQgMQotIyAgZGVmaW5lIFNJR05FRF9SSUdIVF9TSElGVF9JUyAxCisjZGVmaW5lIEFSSVRITUVUSUNfUklHSFRfU0hJRlQgMQorI2RlZmluZSBTSUdORURfUklHSFRfU0hJRlRfSVMgMQogI2VuZGlmCiAKLSNwcmFnbWEgd2FybmluZyhkaXNhYmxlOiA0OTk2KSAvLyBEZXByZWNhdGVkIHBvc2l4IG5hbWUuCisjaWZuZGVmIF9fTUlOR1czMl9fCisjcHJhZ21hIHdhcm5pbmcoZGlzYWJsZSA6IDQ5OTYpIC8vIERlcHJlY2F0ZWQgcG9zaXggbmFtZS4KKyNlbmRpZgogCi0jZGVmaW5lIFZFUlNJT04gIjAuOS4yIgogI2RlZmluZSBIQVZFX0dFVFRJTUVPRkRBWSAxCiAjZGVmaW5lIEhBVkVfU1lTX1NUQVRfSCAxCiAKKy8vIE11c3QgYmUgdXNpbmcgVlMyMDEwIG9yIGxhdGVyLCBvciBib29zdCwgc28gdGhhdCBDOTkgdHlwZXMgYXJlIGRlZmluZWQgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UKICNpZmRlZiBIQVZFX1NURElOVF9ICi0jICBpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KICNlbHNlCi0jICBpbmNsdWRlIDxib29zdC9jc3RkaW50LmhwcD4KKyNpbmNsdWRlIDxib29zdC9jc3RkaW50LmhwcD4KIAotdHlwZWRlZiBib29zdDo6aW50NjRfdCAgICBpbnQ2NF90OwotdHlwZWRlZiBib29zdDo6dWludDY0X3QgIHVpbnQ2NF90OwotdHlwZWRlZiBib29zdDo6aW50MzJfdCAgICBpbnQzMl90OwotdHlwZWRlZiBib29zdDo6dWludDMyX3QgIHVpbnQzMl90OwotdHlwZWRlZiBib29zdDo6aW50MTZfdCAgICBpbnQxNl90OwotdHlwZWRlZiBib29zdDo6dWludDE2X3QgIHVpbnQxNl90OwotdHlwZWRlZiBib29zdDo6aW50OF90ICAgICAgaW50OF90OwotdHlwZWRlZiBib29zdDo6dWludDhfdCAgICB1aW50OF90OwordHlwZWRlZiBib29zdDo6aW50NjRfdCBpbnQ2NF90OwordHlwZWRlZiBib29zdDo6dWludDY0X3QgdWludDY0X3Q7Cit0eXBlZGVmIGJvb3N0OjppbnQzMl90IGludDMyX3Q7Cit0eXBlZGVmIGJvb3N0Ojp1aW50MzJfdCB1aW50MzJfdDsKK3R5cGVkZWYgYm9vc3Q6OmludDE2X3QgaW50MTZfdDsKK3R5cGVkZWYgYm9vc3Q6OnVpbnQxNl90IHVpbnQxNl90OwordHlwZWRlZiBib29zdDo6aW50OF90IGludDhfdDsKK3R5cGVkZWYgYm9vc3Q6OnVpbnQ4X3QgdWludDhfdDsKICNlbmRpZgogCiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9QbGF0Zm9ybVNvY2tldC5oPgpAQCAtODksMTAgKzk2LDE0IEBACiAvLyB3aW5kb3dzCiAjaW5jbHVkZSA8V2luc29jazIuaD4KICNpbmNsdWRlIDx3czJ0Y3BpcC5oPgotI2lmZGVmIF9XSU4zMl9XQ0UKLSNwcmFnbWEgY29tbWVudChsaWIsICJXczIubGliIikKLSNlbHNlCi0jcHJhZ21hIGNvbW1lbnQobGliLCAiV3MyXzMyLmxpYiIpCi0jcHJhZ21hIGNvbW1lbnQobGliLCAiYWR2YXBpMzIubGliIikgLy9Gb3Igc2VjdXJpdHkgQVBJcyBpbiBUUGlwZVNlcnZlcgotI2VuZGlmCisjaWZuZGVmIF9fTUlOR1czMl9fCisgICNpZmRlZiBfV0lOMzJfV0NFCisgICNwcmFnbWEgY29tbWVudChsaWIsICJXczIubGliIikKKyAgI2Vsc2UKKyAgI3ByYWdtYSBjb21tZW50KGxpYiwgIldzMl8zMi5saWIiKQorICAjcHJhZ21hIGNvbW1lbnQobGliLCAiYWR2YXBpMzIubGliIikgLy8gRm9yIHNlY3VyaXR5IEFQSXMgaW4gVFBpcGVTZXJ2ZXIKKyAgI3ByYWdtYSBjb21tZW50KGxpYiwgIlNobHdhcGkubGliIikgIC8vIEZvciBTdHJTdHJJQSBpbiBUUGlwZVNlcnZlcgorICAjZW5kaWYKKyNlbmRpZiAvLyBfX01JTkdXMzJfXworCiAjZW5kaWYgLy8gX1RIUklGVF9XSU5ET1dTX0NPTkZJR19IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L0FsbFByb3RvY29sVGVzdHMuY3BwIGIvbGliL2NwcC90ZXN0L0FsbFByb3RvY29sVGVzdHMuY3BwCmluZGV4IDY1ZDE5MjcuLjZiNWM3YzQgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvdGVzdC9BbGxQcm90b2NvbFRlc3RzLmNwcAorKysgYi9saWIvY3BwL3Rlc3QvQWxsUHJvdG9jb2xUZXN0cy5jcHAKQEAgLTIyLDYgKzIyLDEwIEBACiAjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPgogI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgorCisjZGVmaW5lIEJPT1NUX1RFU1RfTU9EVUxFIEFsbFByb3RvY29sVGVzdHMKKyNpbmNsdWRlIDxib29zdC90ZXN0L3VuaXRfdGVzdC5ocHA+CisKICNpbmNsdWRlICJBbGxQcm90b2NvbFRlc3RzLnRjYyIKIAogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OwpAQCAtMzAsMTUgKzM0LDE0IEBACiAKIGNoYXIgZXJyb3JNZXNzYWdlW0VSUl9MRU5dOwogCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKLSAgKHZvaWQpIGFyZ2M7Ci0gICh2b2lkKSBhcmd2OwotICB0cnkgewotICAgIHRlc3RQcm90b2NvbDxUQmluYXJ5UHJvdG9jb2w+KCJUQmluYXJ5UHJvdG9jb2wiKTsKLSAgICB0ZXN0UHJvdG9jb2w8VENvbXBhY3RQcm90b2NvbD4oIlRDb21wYWN0UHJvdG9jb2wiKTsKLSAgfSBjYXRjaCAoVEV4Y2VwdGlvbiBlKSB7Ci0gICAgcHJpbnRmKCIlc1xuIiwgZS53aGF0KCkpOwotICAgIHJldHVybiAxOwotICB9Ci0gIHJldHVybiAwOworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9iaW5hcnlfcHJvdG9jb2wpIHsKKyAgdGVzdFByb3RvY29sPFRCaW5hcnlQcm90b2NvbD4oIlRCaW5hcnlQcm90b2NvbCIpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2xpdHRsZV9iaW5hcnlfcHJvdG9jb2wpIHsKKyAgdGVzdFByb3RvY29sPFRMRUJpbmFyeVByb3RvY29sPigiVExFQmluYXJ5UHJvdG9jb2wiKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9jb21wYWN0X3Byb3RvY29sKSB7CisgIHRlc3RQcm90b2NvbDxUQ29tcGFjdFByb3RvY29sPigiVENvbXBhY3RQcm90b2NvbCIpOwogfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L0FsbFByb3RvY29sVGVzdHMudGNjIGIvbGliL2NwcC90ZXN0L0FsbFByb3RvY29sVGVzdHMudGNjCmluZGV4IDNjOTg5NDMuLmE3ZWFiMDcgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvdGVzdC9BbGxQcm90b2NvbFRlc3RzLnRjYworKysgYi9saWIvY3BwL3Rlc3QvQWxsUHJvdG9jb2xUZXN0cy50Y2MKQEAgLTI4LDcgKzI4LDcgQEAKIAogI2luY2x1ZGUgIkdlbmVyaWNIZWxwZXJzLmgiCiAKLXVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOwogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OwogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDsKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OwpAQCAtNDUsNyArNDUsMTAgQEAKICAgVmFsIG91dDsKICAgR2VuZXJpY0lPOjpyZWFkKHByb3RvY29sLCBvdXQpOwogICBpZiAob3V0ICE9IHZhbCkgewotICAgIFRIUklGVF9TTlBSSU5URihlcnJvck1lc3NhZ2UsIEVSUl9MRU4sICJJbnZhbGlkIG5ha2VkIHRlc3QgKHR5cGU6ICVzKSIsIENsYXNzTmFtZXM6OmdldE5hbWU8VmFsPigpKTsKKyAgICBUSFJJRlRfU05QUklOVEYoZXJyb3JNZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICBFUlJfTEVOLAorICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBuYWtlZCB0ZXN0ICh0eXBlOiAlcykiLAorICAgICAgICAgICAgICAgICAgICBDbGFzc05hbWVzOjpnZXROYW1lPFZhbD4oKSk7CiAgICAgdGhyb3cgVEV4Y2VwdGlvbihlcnJvck1lc3NhZ2UpOwogICB9CiB9CkBAIC05NywyMiArMTAwLDE4IEBACiAgICAgY29uc3QgY2hhciogbmFtZTsKICAgICBUTWVzc2FnZVR5cGUgdHlwZTsKICAgICBpbnQzMl90IHNlcWlkOwotICB9IG1lc3NhZ2VzW10gPSB7Ci0gICAgeyJzaG9ydCBtZXNzYWdlIG5hbWUiLCBUX0NBTEwsIDB9LAotICAgIHsiMSIsIFRfUkVQTFksIDEyMzQ1fSwKLSAgICB7Imxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciLCBUX0VYQ0VQVElPTiwgMSA8PCAxNn0sCi0gICAgeyJvbmUgd2F5IHB1c2giLCBUX09ORVdBWSwgMTJ9LAotICAgIHsiSmFua3kiLCBUX0NBTEwsIDB9Ci0gIH07CisgIH0gbWVzc2FnZXNbXSA9IHt7InNob3J0IG1lc3NhZ2UgbmFtZSIsIFRfQ0FMTCwgMH0sCisgICAgICAgICAgICAgICAgICB7IjEiLCBUX1JFUExZLCAxMjM0NX0sCisgICAgICAgICAgICAgICAgICB7Imxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciLCBUX0VYQ0VQVElPTiwgMSA8PCAxNn0sCisgICAgICAgICAgICAgICAgICB7Im9uZSB3YXkgcHVzaCIsIFRfT05FV0FZLCAxMn0sCisgICAgICAgICAgICAgICAgICB7Ikphbmt5IiwgVF9DQUxMLCAwfX07CiAgIGNvbnN0IGludCBtZXNzYWdlc19jb3VudCA9IHNpemVvZihtZXNzYWdlcykgLyBzaXplb2YoVE1lc3NhZ2UpOwogCiAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZXNfY291bnQ7IGkrKykgewogICAgIHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0KG5ldyBUTWVtb3J5QnVmZmVyKCkpOwogICAgIHNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90b2NvbChuZXcgVFByb3RvKHRyYW5zcG9ydCkpOwogCi0gICAgcHJvdG9jb2wtPndyaXRlTWVzc2FnZUJlZ2luKG1lc3NhZ2VzW2ldLm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzW2ldLnR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzW2ldLnNlcWlkKTsKKyAgICBwcm90b2NvbC0+d3JpdGVNZXNzYWdlQmVnaW4obWVzc2FnZXNbaV0ubmFtZSwgbWVzc2FnZXNbaV0udHlwZSwgbWVzc2FnZXNbaV0uc2VxaWQpOwogICAgIHByb3RvY29sLT53cml0ZU1lc3NhZ2VFbmQoKTsKIAogICAgIHN0ZDo6c3RyaW5nIG5hbWU7CkBAIC0xMjAsOSArMTE5LDcgQEAKICAgICBpbnQzMl90IHNlcWlkOwogCiAgICAgcHJvdG9jb2wtPnJlYWRNZXNzYWdlQmVnaW4obmFtZSwgdHlwZSwgc2VxaWQpOwotICAgIGlmIChuYW1lICE9IG1lc3NhZ2VzW2ldLm5hbWUgfHwKLSAgICAgICAgdHlwZSAhPSBtZXNzYWdlc1tpXS50eXBlIHx8Ci0gICAgICAgIHNlcWlkICE9IG1lc3NhZ2VzW2ldLnNlcWlkKSB7CisgICAgaWYgKG5hbWUgIT0gbWVzc2FnZXNbaV0ubmFtZSB8fCB0eXBlICE9IG1lc3NhZ2VzW2ldLnR5cGUgfHwgc2VxaWQgIT0gbWVzc2FnZXNbaV0uc2VxaWQpIHsKICAgICAgIHRocm93IFRFeGNlcHRpb24oInJlYWRNZXNzYWdlQmVnaW4gZmFpbGVkLiIpOwogICAgIH0KICAgfQpAQCAtMTkxLDE3ICsxODgsMTYgQEAKICAgICB0ZXN0TmFrZWQ8VFByb3RvLCBpbnQ2NF90Pigoc3RkOjpudW1lcmljX2xpbWl0czxpbnQ2NF90Pjo6bWluKSgpKTsKICAgICB0ZXN0TmFrZWQ8VFByb3RvLCBpbnQ2NF90Pigoc3RkOjpudW1lcmljX2xpbWl0czxpbnQ2NF90Pjo6bWF4KSgpKTsKIAotCiAgICAgdGVzdE5ha2VkPFRQcm90bywgaW50NjRfdD4oMCk7CiAgICAgZm9yIChpbnQ2NF90IGkgPSAwOyBpIDwgNjI7IGkrKykgewotICAgICAgdGVzdE5ha2VkPFRQcm90bywgaW50NjRfdD4oMUwgPDwgaSk7Ci0gICAgICB0ZXN0TmFrZWQ8VFByb3RvLCBpbnQ2NF90PigtKDFMIDw8IGkpKTsKKyAgICAgIHRlc3ROYWtlZDxUUHJvdG8sIGludDY0X3Q+KDFMTCA8PCBpKTsKKyAgICAgIHRlc3ROYWtlZDxUUHJvdG8sIGludDY0X3Q+KC0oMUxMIDw8IGkpKTsKICAgICB9CiAKICAgICB0ZXN0RmllbGQ8VFByb3RvLCBUX0k2NCwgaW50NjRfdD4oMCk7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA2MjsgaSsrKSB7Ci0gICAgICB0ZXN0RmllbGQ8VFByb3RvLCBUX0k2NCwgaW50NjRfdD4oMUwgPDwgaSk7Ci0gICAgICB0ZXN0RmllbGQ8VFByb3RvLCBUX0k2NCwgaW50NjRfdD4oLSgxTCA8PCBpKSk7CisgICAgICB0ZXN0RmllbGQ8VFByb3RvLCBUX0k2NCwgaW50NjRfdD4oMUxMIDw8IGkpOworICAgICAgdGVzdEZpZWxkPFRQcm90bywgVF9JNjQsIGludDY0X3Q+KC0oMUxMIDw8IGkpKTsKICAgICB9CiAKICAgICB0ZXN0TmFrZWQ8VFByb3RvLCBkb3VibGU+KDEyMy40NTYpOwpAQCAtMjEwLDcgKzIwNiw3IEBACiAgICAgdGVzdE5ha2VkPFRQcm90bywgc3RkOjpzdHJpbmc+KCJzaG9ydCIpOwogICAgIHRlc3ROYWtlZDxUUHJvdG8sIHN0ZDo6c3RyaW5nPigiYm9yZGVybGluZXRpbnkiKTsKICAgICB0ZXN0TmFrZWQ8VFByb3RvLCBzdGQ6OnN0cmluZz4oImEgYml0IGxvbmdlciB0aGFuIHRoZSBzbWFsbGVzdCBwb3NzaWJsZSIpOwotICAgIHRlc3ROYWtlZDxUUHJvdG8sIHN0ZDo6c3RyaW5nPigiXHgxXHgyXHgzXHg0XHg1XHg2XHg3XHg4XHg5XHhBIik7IC8va2luZGEgYmluYXJ5IHRlc3QKKyAgICB0ZXN0TmFrZWQ8VFByb3RvLCBzdGQ6OnN0cmluZz4oIlx4MVx4Mlx4M1x4NFx4NVx4Nlx4N1x4OFx4OVx4QSIpOyAvLyBraW5kYSBiaW5hcnkgdGVzdAogCiAgICAgdGVzdEZpZWxkPFRQcm90bywgVF9TVFJJTkcsIHN0ZDo6c3RyaW5nPigiIik7CiAgICAgdGVzdEZpZWxkPFRQcm90bywgVF9TVFJJTkcsIHN0ZDo6c3RyaW5nPigic2hvcnQiKTsKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9Bbm5vdGF0aW9uVGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvQW5ub3RhdGlvblRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlMTg4NDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvQW5ub3RhdGlvblRlc3QuY3BwCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNkZWZpbmUgQk9PU1RfVEVTVF9NT0RVTEUgQW5ub3RhdGlvblRlc3QKKyNpbmNsdWRlIDxib29zdC90ZXN0L3VuaXRfdGVzdC5ocHA+CisjaW5jbHVkZSAiZ2VuLWNwcC9Bbm5vdGF0aW9uVGVzdF90eXBlcy5oIgorI2luY2x1ZGUgPG9zdHJlYW0+CisjaW5jbHVkZSA8c3N0cmVhbT4KKworLy8gTm9ybWFsbHkgdGhyaWZ0IGdlbmVyYXRlcyBvc3RyZWFtIG9wZXJhdG9ycywgaG93ZXZlcgorLy8gd2l0aCB0aGUgYW5ub3RhdGlvbiAiY3BwLmN1c3RvbW9zdHJlYW0iIG9uZSBjYW4gdGVsbCB0aGUKKy8vIGNvbXBpbGVyIHRoZXkgYXJlIGdvaW5nIHRvIHByb3ZpZGUgdGhlaXIgb3duLCBhbmQgbm90CisvLyBlbWl0IG9wZXJhdG9yIDw8IG9yIHByaW50VG8oKS4KKworc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IG9zdHJfY3VzdG9tJiBvc2MpCit7CisgIG9zIDw8ICJ7IGJhciA9ICIgPDwgb3NjLmJhciA8PCAiOyB9IjsKKyAgcmV0dXJuIG9zOworfQorCitCT09TVF9BVVRPX1RFU1RfU1VJVEUoQk9PU1RfVEVTVF9NT0RVTEUpCisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfY3BwX2NvbXBpbGVyX2dlbmVyYXRlZF9vc3RyZWFtX29wZXJhdG9yKQoreworICBvc3RyX2RlZmF1bHQgZGVmOworICBkZWYuX19zZXRfYmFyKDEwKTsKKworICBzdGQ6OnN0cmluZ3N0cmVhbSBzc2Q7CisgIHNzZCA8PCBkZWY7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHNzZC5zdHIoKSwgIm9zdHJfZGVmYXVsdChiYXI9MTApIik7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfY3BwX2N1c3RvbW9zdHJlYW1fdXNlc19jb25zdW1pbmdfYXBwbGljYXRpb25fZGVmaW5pdGlvbikKK3sKKyAgb3N0cl9jdXN0b20gY3VzOworICBjdXMuX19zZXRfYmFyKDEwKTsKKworICBzdGQ6OnN0cmluZ3N0cmVhbSBjc2Q7CisgIGNzZCA8PCBjdXM7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGNzZC5zdHIoKSwgInsgYmFyID0gMTA7IH0iKTsKK30KKworLyoqCisgKiBEaXNhYmxlZDsgc2VlIFRIUklGVC0xNTY3IC0gbm90IHN1cmUgd2hhdCBpdCBpcyBzdXBwb3NlZCB0byBkbworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9jcHBfdHlwZSkgeworICAvLyBDaGVjayB0aGF0IHRoZSAiY3BwLnR5cGUiIGFubm90YXRpb24gY2hhbmdlcyAic3RydWN0IGZvbyIgdG8gIkRlbnNlRm9vIgorICAvLyBUaGlzIHdvbid0IGNvbXBpbGUgaWYgdGhlIGFubm90YXRpb24gaXMgbWlzaGFuZGxlZAorICBEZW5zZUZvbyBmb287CisgIGZvby5fX3NldF9iYXIoNSk7Cit9CisgKi8KKworQk9PU1RfQVVUT19URVNUX1NVSVRFX0VORCgpCmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvQmFzZTY0VGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvQmFzZTY0VGVzdC5jcHAKaW5kZXggNWNhYWFlOC4uNzY4NmU0ZSAxMDA2NDQKLS0tIGEvbGliL2NwcC90ZXN0L0Jhc2U2NFRlc3QuY3BwCisrKyBiL2xpYi9jcHAvdGVzdC9CYXNlNjRUZXN0LmNwcApAQCAtMjMsNyArMjMsNyBAQAogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpiYXNlNjRfZW5jb2RlOwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpiYXNlNjRfZGVjb2RlOwogCi1CT09TVF9BVVRPX1RFU1RfU1VJVEUoIEJhc2U2NFRlc3QgKQorQk9PU1RfQVVUT19URVNUX1NVSVRFKEJhc2U2NFRlc3QpCiAKIHZvaWQgc2V0dXBUZXN0RGF0YShpbnQgaSwgdWludDhfdCogZGF0YSwgaW50JiBsZW4pIHsKICAgbGVuID0gMDsKQEAgLTM3LDEyICszNywxNiBAQAogfQogCiB2b2lkIGNoZWNrRW5jb2RpbmcodWludDhfdCogZGF0YSwgaW50IGxlbikgeworI2lmZGVmIE5ERUJVRworICAoKHZvaWQpZGF0YSk7CisjZW5kaWYKKwogICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgQk9PU1RfQVNTRVJUKGlzYWxudW0oZGF0YVtpXSkgfHwgZGF0YVtpXSA9PSAnLycgfHwgZGF0YVtpXSA9PSAnKycpOwogICB9CiB9CiAKLUJPT1NUX0FVVE9fVEVTVF9DQVNFKCB0ZXN0X0Jhc2U2NF9FbmNvZGVfRGVjb2RlICkgeworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9CYXNlNjRfRW5jb2RlX0RlY29kZSkgewogICBpbnQgbGVuOwogICB1aW50OF90IHRlc3RJbnB1dFszXTsKICAgdWludDhfdCB0ZXN0T3V0cHV0WzRdOwpAQCAtNjQsNyArNjgsNiBAQAogICAgIC8vIGRlY29kZSBvdXRwdXQgYW5kIGNoZWNrIHRoYXQgaXQgbWF0Y2hlcyBpbnB1dAogICAgIGJhc2U2NF9kZWNvZGUodGVzdE91dHB1dCwgbGVuICsgMSk7CiAgICAgQk9PU1RfQVNTRVJUKDAgPT0gbWVtY21wKHRlc3RJbnB1dCwgdGVzdE91dHB1dCwgbGVuKSk7Ci0KICAgfQogfQogCmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvQmVuY2htYXJrLmNwcCBiL2xpYi9jcHAvdGVzdC9CZW5jaG1hcmsuY3BwCmluZGV4IDM1NzExNTAuLjVmZjc3YWEgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvdGVzdC9CZW5jaG1hcmsuY3BwCisrKyBiL2xpYi9jcHAvdGVzdC9CZW5jaG1hcmsuY3BwCkBAIC0yMSw5ICsyMSwxMSBAQAogI2luY2x1ZGUgPGNvbmZpZy5oPgogI2VuZGlmCiAjaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8Y21hdGg+Ci0jaW5jbHVkZSAidGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oIgorI2RlZmluZSBfVVNFX01BVEhfREVGSU5FUworI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSAidGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oIgorI2luY2x1ZGUgInRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaCIKICNpbmNsdWRlICJnZW4tY3BwL0RlYnVnUHJvdG9UZXN0X3R5cGVzLmgiCiAKICNpZmRlZiBIQVZFX1NZU19USU1FX0gKQEAgLTM0LDEyICszNiw4IEBACiBwdWJsaWM6CiAgIHRpbWV2YWwgdlN0YXJ0OwogCi0gIFRpbWVyKCkgewotICAgIFRIUklGVF9HRVRUSU1FT0ZEQVkoJnZTdGFydCwgMCk7Ci0gIH0KLSAgdm9pZCBzdGFydCgpIHsKLSAgICBUSFJJRlRfR0VUVElNRU9GREFZKCZ2U3RhcnQsIDApOwotICB9CisgIFRpbWVyKCkgeyBUSFJJRlRfR0VUVElNRU9GREFZKCZ2U3RhcnQsIDApOyB9CisgIHZvaWQgc3RhcnQoKSB7IFRIUklGVF9HRVRUSU1FT0ZEQVkoJnZTdGFydCwgMCk7IH0KIAogICBkb3VibGUgZnJhbWUoKSB7CiAgICAgdGltZXZhbCB2RW5kOwpAQCAtNDgsNjIgKzQ2LDE5NyBAQAogICAgIGRvdWJsZSBkZW5kID0gdkVuZC50dl9zZWMgKyAoKGRvdWJsZSl2RW5kLnR2X3VzZWMgLyAxMDAwMDAwLjApOwogICAgIHJldHVybiBkZW5kIC0gZHN0YXJ0OwogICB9Ci0KIH07CiAKIGludCBtYWluKCkgewotICB1c2luZyBuYW1lc3BhY2Ugc3RkOwogICB1c2luZyBuYW1lc3BhY2UgdGhyaWZ0Ojp0ZXN0OjpkZWJ1ZzsKICAgdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7CiAgIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w7Ci0gIHVzaW5nIG5hbWVzcGFjZSBib29zdDsKKyAgdXNpbmcgc3RkOjpjb3V0OworICB1c2luZyBzdGQ6OmVuZGw7CiAKICAgT25lT2ZFYWNoIG9vZTsKLSAgb29lLmltX3RydWUgICA9IHRydWU7Ci0gIG9vZS5pbV9mYWxzZSAgPSBmYWxzZTsKLSAgb29lLmFfYml0ZSAgICA9IDB4N2Y7CisgIG9vZS5pbV90cnVlID0gdHJ1ZTsKKyAgb29lLmltX2ZhbHNlID0gZmFsc2U7CisgIG9vZS5hX2JpdGUgPSAweDdmOwogICBvb2UuaW50ZWdlcjE2ID0gMjcwMDA7Ci0gIG9vZS5pbnRlZ2VyMzIgPSAxPDwyNDsKKyAgb29lLmludGVnZXIzMiA9IDEgPDwgMjQ7CiAgIG9vZS5pbnRlZ2VyNjQgPSAodWludDY0X3QpNjAwMCAqIDEwMDAgKiAxMDAwOwogICBvb2UuZG91YmxlX3ByZWNpc2lvbiA9IE1fUEk7Ci0gIG9vZS5zb21lX2NoYXJhY3RlcnMgID0gIkpTT04gVEhJUyEgXCJcMSI7Ci0gIG9vZS56b21nX3VuaWNvZGUgICAgID0gIlx4ZDdcblxhXHQiOworICBvb2Uuc29tZV9jaGFyYWN0ZXJzID0gIkpTT04gVEhJUyEgXCJcMSI7CisgIG9vZS56b21nX3VuaWNvZGUgPSAiXHhkN1xuXGFcdCI7CiAgIG9vZS5iYXNlNjQgPSAiXDFcMlwzXDI1NSI7CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmKG5ldyBUTWVtb3J5QnVmZmVyKCkpOworICBpbnQgbnVtID0gMTAwMDAwOworICBzdGQ6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmKG5ldyBUTWVtb3J5QnVmZmVyKG51bSoxMDAwKSk7CiAKLSAgaW50IG51bSA9IDEwMDAwMDA7CisgIHVpbnQ4X3QqIGRhdGEgPSBOVUxMOworICB1aW50MzJfdCBkYXRhc2l6ZSA9IDA7CiAKICAgeworICAgIGJ1Zi0+cmVzZXRCdWZmZXIoKTsKKyAgICBUQmluYXJ5UHJvdG9jb2xUPFRNZW1vcnlCdWZmZXI+IHByb3QoYnVmKTsKKyAgICBkb3VibGUgZWxhcHNlZCA9IDAuMDsKICAgICBUaW1lciB0aW1lcjsKIAotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtOyBpICsrKSB7Ci0gICAgICBidWYtPnJlc2V0QnVmZmVyKCk7Ci0gICAgICBUQmluYXJ5UHJvdG9jb2xUPFRCdWZmZXJCYXNlPiBwcm90KGJ1Zik7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW07IGkrKykgewogICAgICAgb29lLndyaXRlKCZwcm90KTsKICAgICB9Ci0gICAgY291dCA8PCAiV3JpdGU6ICIgPDwgbnVtIC8gKDEwMDAgKiB0aW1lci5mcmFtZSgpKSA8PCAiIGtIeiIgPDwgZW5kbDsKKyAgICBlbGFwc2VkID0gdGltZXIuZnJhbWUoKTsKKyAgICBjb3V0IDw8ICJXcml0ZSBiaWcgZW5kaWFuOiAiIDw8IG51bSAvICgxMDAwICogZWxhcHNlZCkgPDwgIiBrSHoiIDw8IGVuZGw7CiAgIH0KIAotICB1aW50OF90KiBkYXRhOwotICB1aW50MzJfdCBkYXRhc2l6ZTsKLQogICBidWYtPmdldEJ1ZmZlcigmZGF0YSwgJmRhdGFzaXplKTsKIAogICB7Ci0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmMihuZXcgVE1lbW9yeUJ1ZmZlcihkYXRhLCBkYXRhc2l6ZSkpOworICAgIFRCaW5hcnlQcm90b2NvbFQ8VE1lbW9yeUJ1ZmZlcj4gcHJvdChidWYyKTsKKyAgICBPbmVPZkVhY2ggb29lMjsKKyAgICBkb3VibGUgZWxhcHNlZCA9IDAuMDsKICAgICBUaW1lciB0aW1lcjsKIAotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtOyBpICsrKSB7Ci0gICAgICBPbmVPZkVhY2ggb29lMjsKLSAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZjIobmV3IFRNZW1vcnlCdWZmZXIoZGF0YSwgZGF0YXNpemUpKTsKLSAgICAgIC8vYnVmMi0+cmVzZXRCdWZmZXIoZGF0YSwgZGF0YXNpemUpOwotICAgICAgVEJpbmFyeVByb3RvY29sVDxUQnVmZmVyQmFzZT4gcHJvdChidWYyKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bTsgaSsrKSB7CiAgICAgICBvb2UyLnJlYWQoJnByb3QpOwotCi0gICAgICAvL2NvdXQgPDwgYXBhY2hlOjp0aHJpZnQ6OlRocmlmdERlYnVnU3RyaW5nKG9vZTIpIDw8IGVuZGwgPDwgZW5kbDsKICAgICB9Ci0gICAgY291dCA8PCAiIFJlYWQ6ICIgPDwgbnVtIC8gKDEwMDAgKiB0aW1lci5mcmFtZSgpKSA8PCAiIGtIeiIgPDwgZW5kbDsKKyAgICBlbGFwc2VkID0gdGltZXIuZnJhbWUoKTsKKyAgICBjb3V0IDw8ICIgUmVhZCBiaWcgZW5kaWFuOiAiIDw8IG51bSAvICgxMDAwICogZWxhcHNlZCkgPDwgIiBrSHoiIDw8IGVuZGw7CisgIH0KKworICB7CisgICAgYnVmLT5yZXNldEJ1ZmZlcigpOworICAgIFRCaW5hcnlQcm90b2NvbFQ8VE1lbW9yeUJ1ZmZlciwgVE5ldHdvcmtMaXR0bGVFbmRpYW4+IHByb3QoYnVmKTsKKyAgICBkb3VibGUgZWxhcHNlZCA9IDAuMDsKKyAgICBUaW1lciB0aW1lcjsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKKyAgICAgIG9vZS53cml0ZSgmcHJvdCk7CisgICAgfQorICAgIGVsYXBzZWQgPSB0aW1lci5mcmFtZSgpOworICAgIGNvdXQgPDwgIldyaXRlIGxpdHRsZSBlbmRpYW46ICIgPDwgbnVtIC8gKDEwMDAgKiBlbGFwc2VkKSA8PCAiIGtIeiIgPDwgZW5kbDsKKyAgfQorCisgIHsKKyAgICBPbmVPZkVhY2ggb29lMjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmMihuZXcgVE1lbW9yeUJ1ZmZlcihkYXRhLCBkYXRhc2l6ZSkpOworICAgIFRCaW5hcnlQcm90b2NvbFQ8VE1lbW9yeUJ1ZmZlciwgVE5ldHdvcmtMaXR0bGVFbmRpYW4+IHByb3QoYnVmMik7CisgICAgZG91YmxlIGVsYXBzZWQgPSAwLjA7CisgICAgVGltZXIgdGltZXI7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bTsgaSsrKSB7CisgICAgICBvb2UyLnJlYWQoJnByb3QpOworICAgIH0KKyAgICBlbGFwc2VkID0gdGltZXIuZnJhbWUoKTsKKyAgICBjb3V0IDw8ICIgUmVhZCBsaXR0bGUgZW5kaWFuOiAiIDw8IG51bSAvICgxMDAwICogZWxhcHNlZCkgPDwgIiBrSHoiIDw8IGVuZGw7CisgIH0KKworICB7CisgICAgYnVmLT5yZXNldEJ1ZmZlcigpOworICAgIFRCaW5hcnlQcm90b2NvbFQ8VE1lbW9yeUJ1ZmZlcj4gcHJvdChidWYpOworICAgIGRvdWJsZSBlbGFwc2VkID0gMC4wOworICAgIFRpbWVyIHRpbWVyOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW07IGkrKykgeworICAgICAgb29lLndyaXRlKCZwcm90KTsKKyAgICB9CisgICAgZWxhcHNlZCA9IHRpbWVyLmZyYW1lKCk7CisgICAgY291dCA8PCAiV3JpdGUgYmlnIGVuZGlhbjogIiA8PCBudW0gLyAoMTAwMCAqIGVsYXBzZWQpIDw8ICIga0h6IiA8PCBlbmRsOworICB9CisKKyAgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWYyKG5ldyBUTWVtb3J5QnVmZmVyKGRhdGEsIGRhdGFzaXplKSk7CisgICAgVEJpbmFyeVByb3RvY29sVDxUTWVtb3J5QnVmZmVyPiBwcm90KGJ1ZjIpOworICAgIE9uZU9mRWFjaCBvb2UyOworICAgIGRvdWJsZSBlbGFwc2VkID0gMC4wOworICAgIFRpbWVyIHRpbWVyOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW07IGkrKykgeworICAgICAgb29lMi5yZWFkKCZwcm90KTsKKyAgICB9CisgICAgZWxhcHNlZCA9IHRpbWVyLmZyYW1lKCk7CisgICAgY291dCA8PCAiIFJlYWQgYmlnIGVuZGlhbjogIiA8PCBudW0gLyAoMTAwMCAqIGVsYXBzZWQpIDw8ICIga0h6IiA8PCBlbmRsOworICB9CisKKworICBkYXRhID0gTlVMTDsKKyAgZGF0YXNpemUgPSAwOworICBudW0gPSAxMDAwMDAwMDsKKworICBMaXN0RG91YmxlUGVyZiBsaXN0RG91YmxlUGVyZjsKKyAgbGlzdERvdWJsZVBlcmYuZmllbGQucmVzZXJ2ZShudW0pOworICBmb3IgKGludCB4ID0gMDsgeCA8IG51bTsgKyt4KQorICAgIGxpc3REb3VibGVQZXJmLmZpZWxkLnB1c2hfYmFjayhkb3VibGUoeCkpOworCisgIGJ1Zi5yZXNldChuZXcgVE1lbW9yeUJ1ZmZlcihudW0gKiAxMDApKTsKKworICB7CisgICAgYnVmLT5yZXNldEJ1ZmZlcigpOworICAgIFRCaW5hcnlQcm90b2NvbFQ8VE1lbW9yeUJ1ZmZlcj4gcHJvdChidWYpOworICAgIGRvdWJsZSBlbGFwc2VkID0gMC4wOworICAgIFRpbWVyIHRpbWVyOworCisgICAgbGlzdERvdWJsZVBlcmYud3JpdGUoJnByb3QpOworICAgIGVsYXBzZWQgPSB0aW1lci5mcmFtZSgpOworICAgIGNvdXQgPDwgIkRvdWJsZSB3cml0ZSBiaWcgZW5kaWFuOiAiIDw8IG51bSAvICgxMDAwICogZWxhcHNlZCkgPDwgIiBrSHoiIDw8IGVuZGw7CisgIH0KKworICBidWYtPmdldEJ1ZmZlcigmZGF0YSwgJmRhdGFzaXplKTsKKworICB7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZjIobmV3IFRNZW1vcnlCdWZmZXIoZGF0YSwgZGF0YXNpemUpKTsKKyAgICBUQmluYXJ5UHJvdG9jb2xUPFRNZW1vcnlCdWZmZXI+IHByb3QoYnVmMik7CisgICAgTGlzdERvdWJsZVBlcmYgbGlzdERvdWJsZVBlcmYyOworICAgIGRvdWJsZSBlbGFwc2VkID0gMC4wOworICAgIFRpbWVyIHRpbWVyOworCisgICAgbGlzdERvdWJsZVBlcmYyLnJlYWQoJnByb3QpOworICAgIGVsYXBzZWQgPSB0aW1lci5mcmFtZSgpOworICAgIGNvdXQgPDwgIiBEb3VibGUgcmVhZCBiaWcgZW5kaWFuOiAiIDw8IG51bSAvICgxMDAwICogZWxhcHNlZCkgPDwgIiBrSHoiIDw8IGVuZGw7CisgIH0KKworICB7CisgICAgYnVmLT5yZXNldEJ1ZmZlcigpOworICAgIFRCaW5hcnlQcm90b2NvbFQ8VE1lbW9yeUJ1ZmZlciwgVE5ldHdvcmtMaXR0bGVFbmRpYW4+IHByb3QoYnVmKTsKKyAgICBkb3VibGUgZWxhcHNlZCA9IDAuMDsKKyAgICBUaW1lciB0aW1lcjsKKworICAgIGxpc3REb3VibGVQZXJmLndyaXRlKCZwcm90KTsKKyAgICBlbGFwc2VkID0gdGltZXIuZnJhbWUoKTsKKyAgICBjb3V0IDw8ICJEb3VibGUgd3JpdGUgbGl0dGxlIGVuZGlhbjogIiA8PCBudW0gLyAoMTAwMCAqIGVsYXBzZWQpIDw8ICIga0h6IiA8PCBlbmRsOworICB9CisKKyAgeworICAgIExpc3REb3VibGVQZXJmIGxpc3REb3VibGVQZXJmMjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmMihuZXcgVE1lbW9yeUJ1ZmZlcihkYXRhLCBkYXRhc2l6ZSkpOworICAgIFRCaW5hcnlQcm90b2NvbFQ8VE1lbW9yeUJ1ZmZlciwgVE5ldHdvcmtMaXR0bGVFbmRpYW4+IHByb3QoYnVmMik7CisgICAgZG91YmxlIGVsYXBzZWQgPSAwLjA7CisgICAgVGltZXIgdGltZXI7CisKKyAgICBsaXN0RG91YmxlUGVyZjIucmVhZCgmcHJvdCk7CisgICAgZWxhcHNlZCA9IHRpbWVyLmZyYW1lKCk7CisgICAgY291dCA8PCAiIERvdWJsZSByZWFkIGxpdHRsZSBlbmRpYW46ICIgPDwgbnVtIC8gKDEwMDAgKiBlbGFwc2VkKSA8PCAiIGtIeiIgPDwgZW5kbDsKKyAgfQorCisgIHsKKyAgICBidWYtPnJlc2V0QnVmZmVyKCk7CisgICAgVEJpbmFyeVByb3RvY29sVDxUTWVtb3J5QnVmZmVyPiBwcm90KGJ1Zik7CisgICAgZG91YmxlIGVsYXBzZWQgPSAwLjA7CisgICAgVGltZXIgdGltZXI7CisKKyAgICBsaXN0RG91YmxlUGVyZi53cml0ZSgmcHJvdCk7CisgICAgZWxhcHNlZCA9IHRpbWVyLmZyYW1lKCk7CisgICAgY291dCA8PCAiRG91YmxlIHdyaXRlIGJpZyBlbmRpYW46ICIgPDwgbnVtIC8gKDEwMDAgKiBlbGFwc2VkKSA8PCAiIGtIeiIgPDwgZW5kbDsKKyAgfQorCisgIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmMihuZXcgVE1lbW9yeUJ1ZmZlcihkYXRhLCBkYXRhc2l6ZSkpOworICAgIFRCaW5hcnlQcm90b2NvbFQ8VE1lbW9yeUJ1ZmZlcj4gcHJvdChidWYyKTsKKyAgICBMaXN0RG91YmxlUGVyZiBsaXN0RG91YmxlUGVyZjI7CisgICAgZG91YmxlIGVsYXBzZWQgPSAwLjA7CisgICAgVGltZXIgdGltZXI7CisKKyAgICBsaXN0RG91YmxlUGVyZjIucmVhZCgmcHJvdCk7CisgICAgZWxhcHNlZCA9IHRpbWVyLmZyYW1lKCk7CisgICAgY291dCA8PCAiIERvdWJsZSByZWFkIGJpZyBlbmRpYW46ICIgPDwgbnVtIC8gKDEwMDAgKiBlbGFwc2VkKSA8PCAiIGtIeiIgPDwgZW5kbDsKICAgfQogCiAKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9DTWFrZUxpc3RzLnR4dCBiL2xpYi9jcHAvdGVzdC9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmQ0N2E2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsNDA1IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworaW5jbHVkZV9kaXJlY3RvcmllcyhTWVNURU0gIiR7Qm9vc3RfSU5DTFVERV9ESVJTfSIpCisKK2lmIChXSVRIX0RZTl9MSU5LX1RFU1QpCisgICAgYWRkX2RlZmluaXRpb25zKCAtREJPT1NUX1RFU1RfRFlOX0xJTksgKQorZW5kaWYoKQorCisjIE1ha2Ugc3VyZSBnZW4tY3BwIGZpbGVzIGNhbiBiZSBpbmNsdWRlZAoraW5jbHVkZV9kaXJlY3RvcmllcygiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9IikKKworIyBDcmVhdGUgdGhlIHRocmlmdCBDKysgdGVzdCBsaWJyYXJ5CitzZXQodGVzdGdlbmNwcF9TT1VSQ0VTCisgICAgZ2VuLWNwcC9Bbm5vdGF0aW9uVGVzdF90eXBlcy5jcHAKKyAgICBnZW4tY3BwL0Fubm90YXRpb25UZXN0X3R5cGVzLmgKKyAgICBnZW4tY3BwL0RlYnVnUHJvdG9UZXN0X3R5cGVzLmNwcAorICAgIGdlbi1jcHAvRGVidWdQcm90b1Rlc3RfdHlwZXMuaAorICAgIGdlbi1jcHAvRW51bVRlc3RfdHlwZXMuY3BwCisgICAgZ2VuLWNwcC9FbnVtVGVzdF90eXBlcy5oCisgICAgZ2VuLWNwcC9PcHRpb25hbFJlcXVpcmVkVGVzdF90eXBlcy5jcHAKKyAgICBnZW4tY3BwL09wdGlvbmFsUmVxdWlyZWRUZXN0X3R5cGVzLmgKKyAgICBnZW4tY3BwL1JlY3Vyc2l2ZV90eXBlcy5jcHAKKyAgICBnZW4tY3BwL1JlY3Vyc2l2ZV90eXBlcy5oCisgICAgZ2VuLWNwcC9UaHJpZnRUZXN0X3R5cGVzLmNwcAorICAgIGdlbi1jcHAvVGhyaWZ0VGVzdF90eXBlcy5oCisgICAgZ2VuLWNwcC9PbmVXYXlUZXN0X3R5cGVzLmNwcAorICAgIGdlbi1jcHAvT25lV2F5VGVzdF90eXBlcy5oCisgICAgZ2VuLWNwcC9PbmVXYXlTZXJ2aWNlLmNwcAorICAgIGdlbi1jcHAvT25lV2F5U2VydmljZS5oCisgICAgZ2VuLWNwcC9UeXBlZGVmVGVzdF90eXBlcy5jcHAKKyAgICBnZW4tY3BwL1R5cGVkZWZUZXN0X3R5cGVzLmgKKyAgICBUaHJpZnRUZXN0X2V4dHJhcy5jcHAKKyAgICBEZWJ1Z1Byb3RvVGVzdF9leHRyYXMuY3BwCispCisKK2FkZF9saWJyYXJ5KHRlc3RnZW5jcHAgU1RBVElDICR7dGVzdGdlbmNwcF9TT1VSQ0VTfSkKKworc2V0KHRlc3RnZW5jcHBfY29iX1NPVVJDRVMKKyAgICBnZW4tY3BwL0NoaWxkU2VydmljZS5jcHAKKyAgICBnZW4tY3BwL0NoaWxkU2VydmljZS5oCisgICAgZ2VuLWNwcC9FbXB0eVNlcnZpY2UuY3BwCisgICAgZ2VuLWNwcC9FbXB0eVNlcnZpY2UuaAorICAgIGdlbi1jcHAvUGFyZW50U2VydmljZS5jcHAKKyAgICBnZW4tY3BwL1BhcmVudFNlcnZpY2UuaAorICAgIGdlbi1jcHAvcHJvY190eXBlcy5jcHAKKyAgICBnZW4tY3BwL3Byb2NfdHlwZXMuaAorKQorYWRkX2xpYnJhcnkodGVzdGdlbmNwcF9jb2IgU1RBVElDICR7dGVzdGdlbmNwcF9jb2JfU09VUkNFU30pCisKK2FkZF9leGVjdXRhYmxlKEJlbmNobWFyayBCZW5jaG1hcmsuY3BwKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKEJlbmNobWFyayB0ZXN0Z2VuY3BwKQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKEJlbmNobWFyayB0aHJpZnQpCithZGRfdGVzdChOQU1FIEJlbmNobWFyayBDT01NQU5EIEJlbmNobWFyaykKK3RhcmdldF9saW5rX2xpYnJhcmllcyhCZW5jaG1hcmsgdGVzdGdlbmNwcCkKKworc2V0KFVuaXRUZXN0X1NPVVJDRVMKKyAgICBVbml0VGVzdE1haW4uY3BwCisgICAgT25lV2F5SFRUUFRlc3QuY3BwCisgICAgVE1lbW9yeUJ1ZmZlclRlc3QuY3BwCisgICAgVEJ1ZmZlckJhc2VUZXN0LmNwcAorICAgIEJhc2U2NFRlc3QuY3BwCisgICAgVG9TdHJpbmdUZXN0LmNwcAorICAgIFR5cGVkZWZUZXN0LmNwcAorICAgIFRTZXJ2ZXJTb2NrZXRUZXN0LmNwcAorICAgIFRTZXJ2ZXJUcmFuc3BvcnRUZXN0LmNwcAorKQorCitpZihOT1QgV0lUSF9TVERUSFJFQURTIEFORCBOT1QgTVNWQyBBTkQgTk9UIE1JTkdXKQorICAgIGxpc3QoQVBQRU5EIFVuaXRUZXN0X1NPVVJDRVMgY29uY3VycmVuY3kvTXV0ZXhUZXN0LmNwcCkKKyAgICBsaXN0KEFQUEVORCBVbml0VGVzdF9TT1VSQ0VTIGNvbmN1cnJlbmN5L1JXTXV0ZXhTdGFydmVUZXN0LmNwcCkKK2VuZGlmKCkKKworYWRkX2V4ZWN1dGFibGUoVW5pdFRlc3RzICR7VW5pdFRlc3RfU09VUkNFU30pCit0YXJnZXRfbGlua19saWJyYXJpZXMoVW5pdFRlc3RzIHRlc3RnZW5jcHAgJHtCb29zdF9MSUJSQVJJRVN9KQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKFVuaXRUZXN0cyB0aHJpZnQpCithZGRfdGVzdChOQU1FIFVuaXRUZXN0cyBDT01NQU5EIFVuaXRUZXN0cykKK2lmICggTVNWQyApCisgICAgIyBEaXNhYmxlIEM0NTAzOiBkZWNvcmF0ZWQgbmFtZSBsZW5ndGggZXhjZWVkZWQsIG5hbWUgd2FzIHRydW5jYXRlZAorICAgICMgJ2luc2FuaXR5JyByZXN1bHRzIGluIHZlcnkgbG9uZyBkZWNvcmF0ZWQgbmFtZXMKKyAgICBzZXRfcHJvcGVydHkoIFRBUkdFVCBVbml0VGVzdHMgQVBQRU5EX1NUUklORyBQUk9QRVJUWSBDT01QSUxFX0ZMQUdTIC93ZDQ1MDMgKQorZW5kaWYgKCBNU1ZDICkKKworCitzZXQoIFRJbnRlcnJ1cHRUZXN0X1NPVVJDRVMKKyAgICAgVFNvY2tldEludGVycnVwdFRlc3QuY3BwCisgICAgIFRTU0xTb2NrZXRJbnRlcnJ1cHRUZXN0LmNwcAorKQoraWYgKFdJTjMyKQorICAgIGxpc3QoQVBQRU5EIFRJbnRlcnJ1cHRUZXN0X1NPVVJDRVMKKyAgICAgICAgVFBpcGVJbnRlcnJ1cHRUZXN0LmNwcAorICAgICkKK2VuZGlmKCkKK2FkZF9leGVjdXRhYmxlKFRJbnRlcnJ1cHRUZXN0ICR7VEludGVycnVwdFRlc3RfU09VUkNFU30pCit0YXJnZXRfbGlua19saWJyYXJpZXMoVEludGVycnVwdFRlc3QKKyAgICB0ZXN0Z2VuY3BwCisgICAgJHtCb29zdF9MSUJSQVJJRVN9CispCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoVEludGVycnVwdFRlc3QgdGhyaWZ0KQoraWYgKE5PVCBNU1ZDIEFORCBOT1QgJHtDTUFLRV9TWVNURU1fTkFNRX0gTUFUQ0hFUyAiRGFyd2luIiBBTkQgTk9UIE1JTkdXKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKFRJbnRlcnJ1cHRUZXN0IC1scnQpCitlbmRpZiAoKQorYWRkX3Rlc3QoTkFNRSBUSW50ZXJydXB0VGVzdCBDT01NQU5EIFRJbnRlcnJ1cHRUZXN0IC0tICIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vLi4vLi4vLi4vdGVzdC9rZXlzIikKKworYWRkX2V4ZWN1dGFibGUoVFNlcnZlckludGVncmF0aW9uVGVzdCBUU2VydmVySW50ZWdyYXRpb25UZXN0LmNwcCkKK3RhcmdldF9saW5rX2xpYnJhcmllcyhUU2VydmVySW50ZWdyYXRpb25UZXN0CisgICAgdGVzdGdlbmNwcF9jb2IKKyAgICAke0Jvb3N0X0xJQlJBUklFU30KKykKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShUU2VydmVySW50ZWdyYXRpb25UZXN0IHRocmlmdCkKK2lmIChOT1QgTVNWQyBBTkQgTk9UICR7Q01BS0VfU1lTVEVNX05BTUV9IE1BVENIRVMgIkRhcndpbiIgQU5EIE5PVCBNSU5HVykKK3RhcmdldF9saW5rX2xpYnJhcmllcyhUU2VydmVySW50ZWdyYXRpb25UZXN0IC1scnQpCitlbmRpZiAoKQorYWRkX3Rlc3QoTkFNRSBUU2VydmVySW50ZWdyYXRpb25UZXN0IENPTU1BTkQgVFNlcnZlckludGVncmF0aW9uVGVzdCkKKworaWYoV0lUSF9aTElCKQoraW5jbHVkZV9kaXJlY3RvcmllcyhTWVNURU0gIiR7WkxJQl9JTkNMVURFX0RJUlN9IikKK2FkZF9leGVjdXRhYmxlKFRyYW5zcG9ydFRlc3QgVHJhbnNwb3J0VGVzdC5jcHApCit0YXJnZXRfbGlua19saWJyYXJpZXMoVHJhbnNwb3J0VGVzdAorICAgIHRlc3RnZW5jcHAKKyAgICAke0Jvb3N0X0xJQlJBUklFU30KKyAgICAke1pMSUJfTElCUkFSSUVTfQorKQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKFRyYW5zcG9ydFRlc3QgdGhyaWZ0KQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKFRyYW5zcG9ydFRlc3QgdGhyaWZ0eikKK2FkZF90ZXN0KE5BTUUgVHJhbnNwb3J0VGVzdCBDT01NQU5EIFRyYW5zcG9ydFRlc3QpCisKK2FkZF9leGVjdXRhYmxlKFpsaWJUZXN0IFpsaWJUZXN0LmNwcCkKK3RhcmdldF9saW5rX2xpYnJhcmllcyhabGliVGVzdAorICAgIHRlc3RnZW5jcHAKKyAgICAke0Jvb3N0X0xJQlJBUklFU30KKyAgICAke1pMSUJfTElCUkFSSUVTfQorKQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKFpsaWJUZXN0IHRocmlmdCkKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShabGliVGVzdCB0aHJpZnR6KQorYWRkX3Rlc3QoTkFNRSBabGliVGVzdCBDT01NQU5EIFpsaWJUZXN0KQorZW5kaWYoV0lUSF9aTElCKQorCithZGRfZXhlY3V0YWJsZShBbm5vdGF0aW9uVGVzdCBBbm5vdGF0aW9uVGVzdC5jcHApCit0YXJnZXRfbGlua19saWJyYXJpZXMoQW5ub3RhdGlvblRlc3QKKyAgICB0ZXN0Z2VuY3BwCisgICAgJHtCb29zdF9MSUJSQVJJRVN9CispCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoQW5ub3RhdGlvblRlc3QgdGhyaWZ0KQorYWRkX3Rlc3QoTkFNRSBBbm5vdGF0aW9uVGVzdCBDT01NQU5EIEFubm90YXRpb25UZXN0KQorCithZGRfZXhlY3V0YWJsZShFbnVtVGVzdCBFbnVtVGVzdC5jcHApCit0YXJnZXRfbGlua19saWJyYXJpZXMoRW51bVRlc3QKKyAgICB0ZXN0Z2VuY3BwCisgICAgJHtCb29zdF9MSUJSQVJJRVN9CispCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoRW51bVRlc3QgdGhyaWZ0KQorYWRkX3Rlc3QoTkFNRSBFbnVtVGVzdCBDT01NQU5EIEVudW1UZXN0KQorCitpZihIQVZFX0dFVE9QVF9IKQorYWRkX2V4ZWN1dGFibGUoVEZpbGVUcmFuc3BvcnRUZXN0IFRGaWxlVHJhbnNwb3J0VGVzdC5jcHApCit0YXJnZXRfbGlua19saWJyYXJpZXMoVEZpbGVUcmFuc3BvcnRUZXN0CisgICAgdGVzdGdlbmNwcAorICAgICR7Qm9vc3RfTElCUkFSSUVTfQorKQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKFRGaWxlVHJhbnNwb3J0VGVzdCB0aHJpZnQpCithZGRfdGVzdChOQU1FIFRGaWxlVHJhbnNwb3J0VGVzdCBDT01NQU5EIFRGaWxlVHJhbnNwb3J0VGVzdCkKK2VuZGlmKCkKKworYWRkX2V4ZWN1dGFibGUoVEZEVHJhbnNwb3J0VGVzdCBURkRUcmFuc3BvcnRUZXN0LmNwcCkKK3RhcmdldF9saW5rX2xpYnJhcmllcyhURkRUcmFuc3BvcnRUZXN0CisgICAgJHtCb29zdF9MSUJSQVJJRVN9CispCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoVEZEVHJhbnNwb3J0VGVzdCB0aHJpZnQpCithZGRfdGVzdChOQU1FIFRGRFRyYW5zcG9ydFRlc3QgQ09NTUFORCBURkRUcmFuc3BvcnRUZXN0KQorCithZGRfZXhlY3V0YWJsZShUUGlwZWRUcmFuc3BvcnRUZXN0IFRQaXBlZFRyYW5zcG9ydFRlc3QuY3BwKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKFRQaXBlZFRyYW5zcG9ydFRlc3QKKyAgICAke0Jvb3N0X0xJQlJBUklFU30KKykKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShUUGlwZWRUcmFuc3BvcnRUZXN0IHRocmlmdCkKK2FkZF90ZXN0KE5BTUUgVFBpcGVkVHJhbnNwb3J0VGVzdCBDT01NQU5EIFRQaXBlZFRyYW5zcG9ydFRlc3QpCisKK3NldChBbGxQcm90b2NvbHNUZXN0X1NPVVJDRVMKKyAgICBBbGxQcm90b2NvbFRlc3RzLmNwcAorICAgIEFsbFByb3RvY29sVGVzdHMudGNjCisgICAgR2VuZXJpY0hlbHBlcnMKKyAgICApCisKK2FkZF9leGVjdXRhYmxlKEFsbFByb3RvY29sc1Rlc3QgJHtBbGxQcm90b2NvbHNUZXN0X1NPVVJDRVN9KQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKEFsbFByb3RvY29sc1Rlc3QKKyAgICB0ZXN0Z2VuY3BwCisgICAgJHtCb29zdF9MSUJSQVJJRVN9CispCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoQWxsUHJvdG9jb2xzVGVzdCB0aHJpZnQpCithZGRfdGVzdChOQU1FIEFsbFByb3RvY29sc1Rlc3QgQ09NTUFORCBBbGxQcm90b2NvbHNUZXN0KQorCisjIFRoZSBkZWJ1ZyBydW4tdGltZSBpbiBXaW5kb3dzIGFzc2VydHMgb24gaXNwcmludCgpIHdpdGggbmVnYXRpdmUgaW5wdXRzCitpZiAoTk9UIE1TVkMgT1IgKE1TVkMgQU5EIENNQUtFX0JVSUxEX1RZUEUgRVFVQUwgIkRFQlVHIikpCithZGRfZXhlY3V0YWJsZShEZWJ1Z1Byb3RvVGVzdCBEZWJ1Z1Byb3RvVGVzdC5jcHApCit0YXJnZXRfbGlua19saWJyYXJpZXMoRGVidWdQcm90b1Rlc3QKKyAgICB0ZXN0Z2VuY3BwCisgICAgJHtCb29zdF9MSUJSQVJJRVN9CispCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoRGVidWdQcm90b1Rlc3QgdGhyaWZ0KQorYWRkX3Rlc3QoTkFNRSBEZWJ1Z1Byb3RvVGVzdCBDT01NQU5EIERlYnVnUHJvdG9UZXN0KQorZW5kaWYoKQorCithZGRfZXhlY3V0YWJsZShKU09OUHJvdG9UZXN0IEpTT05Qcm90b1Rlc3QuY3BwKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKEpTT05Qcm90b1Rlc3QKKyAgICB0ZXN0Z2VuY3BwCisgICAgJHtCb29zdF9MSUJSQVJJRVN9CispCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoSlNPTlByb3RvVGVzdCB0aHJpZnQpCithZGRfdGVzdChOQU1FIEpTT05Qcm90b1Rlc3QgQ09NTUFORCBKU09OUHJvdG9UZXN0KQorCithZGRfZXhlY3V0YWJsZShPcHRpb25hbFJlcXVpcmVkVGVzdCBPcHRpb25hbFJlcXVpcmVkVGVzdC5jcHApCit0YXJnZXRfbGlua19saWJyYXJpZXMoT3B0aW9uYWxSZXF1aXJlZFRlc3QKKyAgICB0ZXN0Z2VuY3BwCisgICAgJHtCb29zdF9MSUJSQVJJRVN9CispCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoT3B0aW9uYWxSZXF1aXJlZFRlc3QgdGhyaWZ0KQorYWRkX3Rlc3QoTkFNRSBPcHRpb25hbFJlcXVpcmVkVGVzdCBDT01NQU5EIE9wdGlvbmFsUmVxdWlyZWRUZXN0KQorCithZGRfZXhlY3V0YWJsZShSZWN1cnNpdmVUZXN0IFJlY3Vyc2l2ZVRlc3QuY3BwKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKFJlY3Vyc2l2ZVRlc3QKKyAgICB0ZXN0Z2VuY3BwCisgICAgJHtCb29zdF9MSUJSQVJJRVN9CispCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoUmVjdXJzaXZlVGVzdCB0aHJpZnQpCithZGRfdGVzdChOQU1FIFJlY3Vyc2l2ZVRlc3QgQ09NTUFORCBSZWN1cnNpdmVUZXN0KQorCithZGRfZXhlY3V0YWJsZShTcGVjaWFsaXphdGlvblRlc3QgU3BlY2lhbGl6YXRpb25UZXN0LmNwcCkKK3RhcmdldF9saW5rX2xpYnJhcmllcyhTcGVjaWFsaXphdGlvblRlc3QKKyAgICB0ZXN0Z2VuY3BwCisgICAgJHtCb29zdF9MSUJSQVJJRVN9CispCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoU3BlY2lhbGl6YXRpb25UZXN0IHRocmlmdCkKK2FkZF90ZXN0KE5BTUUgU3BlY2lhbGl6YXRpb25UZXN0IENPTU1BTkQgU3BlY2lhbGl6YXRpb25UZXN0KQorCitzZXQoY29uY3VycmVuY3lfdGVzdF9TT1VSQ0VTCisgICAgY29uY3VycmVuY3kvVGVzdHMuY3BwCisgICAgY29uY3VycmVuY3kvVGhyZWFkRmFjdG9yeVRlc3RzLmgKKyAgICBjb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyVGVzdHMuaAorICAgIGNvbmN1cnJlbmN5L1RpbWVyTWFuYWdlclRlc3RzLmgKKykKK2FkZF9leGVjdXRhYmxlKGNvbmN1cnJlbmN5X3Rlc3QgJHtjb25jdXJyZW5jeV90ZXN0X1NPVVJDRVN9KQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKGNvbmN1cnJlbmN5X3Rlc3QgdGhyaWZ0KQorYWRkX3Rlc3QoTkFNRSBjb25jdXJyZW5jeV90ZXN0IENPTU1BTkQgY29uY3VycmVuY3lfdGVzdCkKKworc2V0KGxpbmtfdGVzdF9TT1VSQ0VTCisgICAgbGluay9MaW5rVGVzdC5jcHAKKyAgICBnZW4tY3BwL1BhcmVudFNlcnZpY2UuaAorICAgIGxpbmsvVGVtcGxhdGVkU2VydmljZTEuY3BwCisgICAgbGluay9UZW1wbGF0ZWRTZXJ2aWNlMi5jcHAKKykKKworYWRkX2V4ZWN1dGFibGUobGlua190ZXN0ICR7bGlua190ZXN0X1NPVVJDRVN9KQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKGxpbmtfdGVzdCB0ZXN0Z2VuY3BwX2NvYikKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShsaW5rX3Rlc3QgdGhyaWZ0KQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKGxpbmtfdGVzdCB0ZXN0Z2VuY3BwKQorYWRkX3Rlc3QoTkFNRSBsaW5rX3Rlc3QgQ09NTUFORCBsaW5rX3Rlc3QpCisKK2lmKFdJVEhfTElCRVZFTlQpCitzZXQocHJvY2Vzc29yX3Rlc3RfU09VUkNFUworICAgIHByb2Nlc3Nvci9Qcm9jZXNzb3JUZXN0LmNwcAorICAgIHByb2Nlc3Nvci9FdmVudExvZy5jcHAKKyAgICBwcm9jZXNzb3IvU2VydmVyVGhyZWFkLmNwcAorICAgIHByb2Nlc3Nvci9FdmVudExvZy5oCisgICAgcHJvY2Vzc29yL0hhbmRsZXJzLmgKKyAgICBwcm9jZXNzb3IvU2VydmVyVGhyZWFkLmgKKykKK2FkZF9leGVjdXRhYmxlKHByb2Nlc3Nvcl90ZXN0ICR7cHJvY2Vzc29yX3Rlc3RfU09VUkNFU30pCit0YXJnZXRfbGlua19saWJyYXJpZXMocHJvY2Vzc29yX3Rlc3QKKyAgICB0ZXN0Z2VuY3BwX2NvYgorICAgICR7Qm9vc3RfTElCUkFSSUVTfQorKQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKHByb2Nlc3Nvcl90ZXN0IHRocmlmdCkKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShwcm9jZXNzb3JfdGVzdCB0aHJpZnRuYikKK2FkZF90ZXN0KE5BTUUgcHJvY2Vzc29yX3Rlc3QgQ09NTUFORCBwcm9jZXNzb3JfdGVzdCkKKworc2V0KFROb25ibG9ja2luZ1NlcnZlclRlc3RfU09VUkNFUyBUTm9uYmxvY2tpbmdTZXJ2ZXJUZXN0LmNwcCkKK2FkZF9leGVjdXRhYmxlKFROb25ibG9ja2luZ1NlcnZlclRlc3QgJHtUTm9uYmxvY2tpbmdTZXJ2ZXJUZXN0X1NPVVJDRVN9KQoraW5jbHVkZV9kaXJlY3Rvcmllcygke0xJQkVWRU5UX0lOQ0xVREVfRElSU30pCit0YXJnZXRfbGlua19saWJyYXJpZXMoVE5vbmJsb2NraW5nU2VydmVyVGVzdAorICAgIHRlc3RnZW5jcHBfY29iCisgICAgJHtMSUJFVkVOVF9MSUJSQVJJRVN9CisgICAgJHtCb29zdF9MSUJSQVJJRVN9CispCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoVE5vbmJsb2NraW5nU2VydmVyVGVzdCB0aHJpZnQpCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoVE5vbmJsb2NraW5nU2VydmVyVGVzdCB0aHJpZnRuYikKK2FkZF90ZXN0KE5BTUUgVE5vbmJsb2NraW5nU2VydmVyVGVzdCBDT01NQU5EIFROb25ibG9ja2luZ1NlcnZlclRlc3QpCisKK2lmKE9QRU5TU0xfRk9VTkQgQU5EIFdJVEhfT1BFTlNTTCkKKyAgc2V0KFROb25ibG9ja2luZ1NTTFNlcnZlclRlc3RfU09VUkNFUyBUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJUZXN0LmNwcCkKKyAgYWRkX2V4ZWN1dGFibGUoVE5vbmJsb2NraW5nU1NMU2VydmVyVGVzdCAke1ROb25ibG9ja2luZ1NTTFNlcnZlclRlc3RfU09VUkNFU30pCisgIGluY2x1ZGVfZGlyZWN0b3JpZXMoJHtMSUJFVkVOVF9JTkNMVURFX0RJUlN9KQorICB0YXJnZXRfbGlua19saWJyYXJpZXMoVE5vbmJsb2NraW5nU1NMU2VydmVyVGVzdAorICAgIHRlc3RnZW5jcHBfY29iCisgICAgJHtMSUJFVkVOVF9MSUJSQVJJRVN9CisgICAgJHtCb29zdF9MSUJSQVJJRVN9CisgICkKKyAgTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKFROb25ibG9ja2luZ1NTTFNlcnZlclRlc3QgdGhyaWZ0KQorICBMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoVE5vbmJsb2NraW5nU1NMU2VydmVyVGVzdCB0aHJpZnRuYikKKyAgYWRkX3Rlc3QoTkFNRSBUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJUZXN0IENPTU1BTkQgVE5vbmJsb2NraW5nU1NMU2VydmVyVGVzdCAtLSAiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9Ly4uLy4uLy4uL3Rlc3Qva2V5cyIpCitlbmRpZihPUEVOU1NMX0ZPVU5EIEFORCBXSVRIX09QRU5TU0wpCitlbmRpZihXSVRIX0xJQkVWRU5UKQorCitpZihPUEVOU1NMX0ZPVU5EIEFORCBXSVRIX09QRU5TU0wpCithZGRfZXhlY3V0YWJsZShPcGVuU1NMTWFudWFsSW5pdFRlc3QgT3BlblNTTE1hbnVhbEluaXRUZXN0LmNwcCkKK3RhcmdldF9saW5rX2xpYnJhcmllcyhPcGVuU1NMTWFudWFsSW5pdFRlc3QKKyAgICAke09QRU5TU0xfTElCUkFSSUVTfQorICAgICR7Qm9vc3RfTElCUkFSSUVTfQorKQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKE9wZW5TU0xNYW51YWxJbml0VGVzdCB0aHJpZnQpCithZGRfdGVzdChOQU1FIE9wZW5TU0xNYW51YWxJbml0VGVzdCBDT01NQU5EIE9wZW5TU0xNYW51YWxJbml0VGVzdCkKKworYWRkX2V4ZWN1dGFibGUoU2VjdXJpdHlUZXN0IFNlY3VyaXR5VGVzdC5jcHApCit0YXJnZXRfbGlua19saWJyYXJpZXMoU2VjdXJpdHlUZXN0CisgICAgdGVzdGdlbmNwcAorICAgICR7Qm9vc3RfTElCUkFSSUVTfQorKQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKFNlY3VyaXR5VGVzdCB0aHJpZnQpCitpZiAoTk9UIE1TVkMgQU5EIE5PVCAke0NNQUtFX1NZU1RFTV9OQU1FfSBNQVRDSEVTICJEYXJ3aW4iIEFORCBOT1QgTUlOR1cpCit0YXJnZXRfbGlua19saWJyYXJpZXMoU2VjdXJpdHlUZXN0IC1scnQpCitlbmRpZiAoKQorYWRkX3Rlc3QoTkFNRSBTZWN1cml0eVRlc3QgQ09NTUFORCBTZWN1cml0eVRlc3QgLS0gIiR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS8uLi8uLi8uLi90ZXN0L2tleXMiKQorCitlbmRpZigpCisKK2lmKFdJVEhfUVQ0KQorc2V0KENNQUtFX0FVVE9NT0MgT04pCitmaW5kX3BhY2thZ2UoUXQ0IFJFUVVJUkVEIENPTVBPTkVOVFMgUXRUZXN0KQorc2V0KFRRVGNwU2VydmVyVGVzdF9TT1VSQ0VTCisgICAgcXQvVFFUY3BTZXJ2ZXJUZXN0LmNwcAorKQorYWRkX2V4ZWN1dGFibGUoVFFUY3BTZXJ2ZXJUZXN0ICR7VFFUY3BTZXJ2ZXJUZXN0X1NPVVJDRVN9KQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKFRRVGNwU2VydmVyVGVzdCB0ZXN0Z2VuY3BwX2NvYiB0aHJpZnRxdCBRdDQ6OlF0VGVzdCkKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShUUVRjcFNlcnZlclRlc3QgdGhyaWZ0KQorYWRkX3Rlc3QoTkFNRSBUUVRjcFNlcnZlclRlc3QgQ09NTUFORCBUUVRjcFNlcnZlclRlc3QpCitlbmRpZigpCisKK2lmKFdJVEhfUVQ1KQorYWRkX3N1YmRpcmVjdG9yeShxdCkKK2VuZGlmKCkKKworIworIyBDb21tb24gdGhyaWZ0IGNvZGUgZ2VuZXJhdGlvbiBydWxlcworIworCithZGRfY3VzdG9tX2NvbW1hbmQoT1VUUFVUIGdlbi1jcHAvQW5ub3RhdGlvblRlc3RfY29uc3RhbnRzLmNwcAorICAgICAgICAgICAgICAgICAgICAgICAgICBnZW4tY3BwL0Fubm90YXRpb25UZXN0X2NvbnN0YW50cy5oCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbi1jcHAvQW5ub3RhdGlvblRlc3RfdHlwZXMuY3BwCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbi1jcHAvQW5ub3RhdGlvblRlc3RfdHlwZXMuaAorICAgICAgICAgICAgICAgICAgICAgICAgICBnZW4tY3BwL2Zvb19zZXJ2aWNlLmNwcAorICAgICAgICAgICAgICAgICAgICAgICAgICBnZW4tY3BwL2Zvb19zZXJ2aWNlLmgKKyAgICBDT01NQU5EICR7VEhSSUZUX0NPTVBJTEVSfSAtLWdlbiBjcHAgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvQW5ub3RhdGlvblRlc3QudGhyaWZ0CispCisKK2FkZF9jdXN0b21fY29tbWFuZChPVVRQVVQgZ2VuLWNwcC9EZWJ1Z1Byb3RvVGVzdF90eXBlcy5jcHAgZ2VuLWNwcC9EZWJ1Z1Byb3RvVGVzdF90eXBlcy5oIGdlbi1jcHAvRW1wdHlTZXJ2aWNlLmNwcCBnZW4tY3BwL0VtcHR5U2VydmljZS5oCisgICAgQ09NTUFORCAke1RIUklGVF9DT01QSUxFUn0gLS1nZW4gY3BwICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L0RlYnVnUHJvdG9UZXN0LnRocmlmdAorKQorCithZGRfY3VzdG9tX2NvbW1hbmQoT1VUUFVUIGdlbi1jcHAvRW51bVRlc3RfdHlwZXMuY3BwIGdlbi1jcHAvRW51bVRlc3RfdHlwZXMuaAorICAgIENPTU1BTkQgJHtUSFJJRlRfQ09NUElMRVJ9IC0tZ2VuIGNwcCAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9FbnVtVGVzdC50aHJpZnQKKykKKworYWRkX2N1c3RvbV9jb21tYW5kKE9VVFBVVCBnZW4tY3BwL1R5cGVkZWZUZXN0X3R5cGVzLmNwcCBnZW4tY3BwL1R5cGVkZWZUZXN0X3R5cGVzLmgKKyAgICBDT01NQU5EICR7VEhSSUZUX0NPTVBJTEVSfSAtLWdlbiBjcHAgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvVHlwZWRlZlRlc3QudGhyaWZ0CispCisKK2FkZF9jdXN0b21fY29tbWFuZChPVVRQVVQgZ2VuLWNwcC9PcHRpb25hbFJlcXVpcmVkVGVzdF90eXBlcy5jcHAgZ2VuLWNwcC9PcHRpb25hbFJlcXVpcmVkVGVzdF90eXBlcy5oCisgICAgQ09NTUFORCAke1RIUklGVF9DT01QSUxFUn0gLS1nZW4gY3BwICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L09wdGlvbmFsUmVxdWlyZWRUZXN0LnRocmlmdAorKQorCithZGRfY3VzdG9tX2NvbW1hbmQoT1VUUFVUIGdlbi1jcHAvUmVjdXJzaXZlX3R5cGVzLmNwcCBnZW4tY3BwL1JlY3Vyc2l2ZV90eXBlcy5oCisgICAgQ09NTUFORCAke1RIUklGVF9DT01QSUxFUn0gLS1nZW4gY3BwICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L1JlY3Vyc2l2ZS50aHJpZnQKKykKKworYWRkX2N1c3RvbV9jb21tYW5kKE9VVFBVVCBnZW4tY3BwL1NlcnZpY2UuY3BwIGdlbi1jcHAvU3RyZXNzVGVzdF90eXBlcy5jcHAKKyAgICBDT01NQU5EICR7VEhSSUZUX0NPTVBJTEVSfSAtLWdlbiBjcHAgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvU3RyZXNzVGVzdC50aHJpZnQKKykKKworYWRkX2N1c3RvbV9jb21tYW5kKE9VVFBVVCBnZW4tY3BwL1NlY29uZFNlcnZpY2UuY3BwIGdlbi1jcHAvVGhyaWZ0VGVzdF9jb25zdGFudHMuY3BwIGdlbi1jcHAvVGhyaWZ0VGVzdC5jcHAgZ2VuLWNwcC9UaHJpZnRUZXN0X3R5cGVzLmNwcCBnZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMuaAorICAgIENPTU1BTkQgJHtUSFJJRlRfQ09NUElMRVJ9IC0tZ2VuIGNwcCAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorKQorCithZGRfY3VzdG9tX2NvbW1hbmQoT1VUUFVUIGdlbi1jcHAvT25lV2F5U2VydmljZS5jcHAgZ2VuLWNwcC9PbmVXYXlUZXN0X2NvbnN0YW50cy5jcHAgZ2VuLWNwcC9PbmVXYXlUZXN0X3R5cGVzLmggZ2VuLWNwcC9PbmVXYXlTZXJ2aWNlLmggZ2VuLWNwcC9PbmVXYXlUZXN0X2NvbnN0YW50cy5oIGdlbi1jcHAvT25lV2F5VGVzdF90eXBlcy5jcHAKKyAgICBDT01NQU5EICR7VEhSSUZUX0NPTVBJTEVSfSAtLWdlbiBjcHAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L09uZVdheVRlc3QudGhyaWZ0CispCisKK2FkZF9jdXN0b21fY29tbWFuZChPVVRQVVQgZ2VuLWNwcC9DaGlsZFNlcnZpY2UuY3BwIGdlbi1jcHAvQ2hpbGRTZXJ2aWNlLmggZ2VuLWNwcC9QYXJlbnRTZXJ2aWNlLmNwcCBnZW4tY3BwL1BhcmVudFNlcnZpY2UuaCBnZW4tY3BwL3Byb2NfdHlwZXMuY3BwIGdlbi1jcHAvcHJvY190eXBlcy5oCisgICAgQ09NTUFORCAke1RIUklGVF9DT01QSUxFUn0gLS1nZW4gY3BwOnRlbXBsYXRlcyxjb2Jfc3R5bGUgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3Byb2Nlc3Nvci9wcm9jLnRocmlmdAorKQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L0RlYnVnUHJvdG9UZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9EZWJ1Z1Byb3RvVGVzdC5jcHAKaW5kZXggNTY0OWUxOC4uMDYwZjM1NCAxMDA2NDQKLS0tIGEvbGliL2NwcC90ZXN0L0RlYnVnUHJvdG9UZXN0LmNwcAorKysgYi9saWIvY3BwL3Rlc3QvRGVidWdQcm90b1Rlc3QuY3BwCkBAIC0xOCw4OSArMTgsMjkzIEBACiAgKi8KIAogI2RlZmluZSBfVVNFX01BVEhfREVGSU5FUwotI2luY2x1ZGUgPGlvc3RyZWFtPgogI2luY2x1ZGUgPGNtYXRoPgogI2luY2x1ZGUgImdlbi1jcHAvRGVidWdQcm90b1Rlc3RfdHlwZXMuaCIKICNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVERlYnVnUHJvdG9jb2wuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CiAKLWludCBtYWluKCkgewotICB1c2luZyBzdGQ6OmNvdXQ7Ci0gIHVzaW5nIHN0ZDo6ZW5kbDsKLSAgdXNpbmcgbmFtZXNwYWNlIHRocmlmdDo6dGVzdDo6ZGVidWc7CisjZGVmaW5lIEJPT1NUX1RFU1RfTU9EVUxFIERlYnVnUHJvdG9UZXN0CisjaW5jbHVkZSA8Ym9vc3QvdGVzdC91bml0X3Rlc3QuaHBwPgogCit1c2luZyBuYW1lc3BhY2UgdGhyaWZ0Ojp0ZXN0OjpkZWJ1ZzsKIAotICBPbmVPZkVhY2ggb29lOwotICBvb2UuaW1fdHJ1ZSAgID0gdHJ1ZTsKLSAgb29lLmltX2ZhbHNlICA9IGZhbHNlOwotICBvb2UuYV9iaXRlICAgID0gMHg3ZjsKLSAgb29lLmludGVnZXIxNiA9IDI3MDAwOwotICBvb2UuaW50ZWdlcjMyID0gMTw8MjQ7Ci0gIG9vZS5pbnRlZ2VyNjQgPSAodWludDY0X3QpNjAwMCAqIDEwMDAgKiAxMDAwOwotICBvb2UuZG91YmxlX3ByZWNpc2lvbiA9IE1fUEk7Ci0gIG9vZS5zb21lX2NoYXJhY3RlcnMgID0gIkRlYnVnIFRISVMhIjsKLSAgb29lLnpvbWdfdW5pY29kZSAgICAgPSAiXHhkN1xuXGFcdCI7CitzdGF0aWMgOjpzdGQ6OnNoYXJlZF9wdHI8T25lT2ZFYWNoPiBvb2U7CiAKLSAgY291dCA8PCBhcGFjaGU6OnRocmlmdDo6VGhyaWZ0RGVidWdTdHJpbmcob29lKSA8PCBlbmRsIDw8IGVuZGw7Cit2b2lkIHRlc3RDYXNlU2V0dXBfMSgpIHsKKyAgb29lLnJlc2V0KG5ldyBPbmVPZkVhY2gpOworICBvb2UtPmltX3RydWUgPSB0cnVlOworICBvb2UtPmltX2ZhbHNlID0gZmFsc2U7CisgIG9vZS0+YV9iaXRlID0gMHg3ZjsKKyAgb29lLT5pbnRlZ2VyMTYgPSAyNzAwMDsKKyAgb29lLT5pbnRlZ2VyMzIgPSAxIDw8IDI0OworICBvb2UtPmludGVnZXI2NCA9ICh1aW50NjRfdCk2MDAwICogMTAwMCAqIDEwMDA7CisgIG9vZS0+ZG91YmxlX3ByZWNpc2lvbiA9IE1fUEk7CisgIG9vZS0+c29tZV9jaGFyYWN0ZXJzID0gIkRlYnVnIFRISVMhIjsKKyAgb29lLT56b21nX3VuaWNvZGUgPSAiXHhkN1xuXGFcdCI7Cit9CiAKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfZGVidWdfcHJvdG9fMSkgeworICB0ZXN0Q2FzZVNldHVwXzEoKTsKIAotICBOZXN0aW5nIG47Ci0gIG4ubXlfb29lID0gb29lOwotICBuLm15X29vZS5pbnRlZ2VyMTYgPSAxNjsKLSAgbi5teV9vb2UuaW50ZWdlcjMyID0gMzI7Ci0gIG4ubXlfb29lLmludGVnZXI2NCA9IDY0OwotICBuLm15X29vZS5kb3VibGVfcHJlY2lzaW9uID0gKHN0ZDo6c3FydCg1LjApKzEpLzI7Ci0gIG4ubXlfb29lLnNvbWVfY2hhcmFjdGVycyAgPSAiOlIgKG1lIGdvaW5nIFwicnJyclwiKSI7Ci0gIG4ubXlfb29lLnpvbWdfdW5pY29kZSAgICAgPSAiXHhkM1x4ODBceGUyXHg4NVx4YWVceGNlXHg5ZFx4MjAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHhkMFx4OWRceGNlXHhiZlx4ZTJceDg1XHhiZlx4ZDBceGJlXHhjOVx4YTFceGQwXHhiM1x4ZDBceGIwXHhjZlx4ODFceGUyXHg4NFx4OGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHgyMFx4Y2VceDkxXHg3NFx4NzRceGNlXHhiMVx4ZTJceDg1XHhiZFx4Y2VceGJhXHhjN1x4ODNceGUyXHg4MFx4YmMiOwotICBuLm15X2JvbmsudHlwZSAgICA9IDMxMzM3OwotICBuLm15X2JvbmsubWVzc2FnZSA9ICJJIGFtIGEgYm9uay4uLiB4b3IhIjsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0KAorICAgICJPbmVPZkVhY2gge1xuIgorICAgICIgIDAxOiBpbV90cnVlIChib29sKSA9IHRydWUsXG4iCisgICAgIiAgMDI6IGltX2ZhbHNlIChib29sKSA9IGZhbHNlLFxuIgorICAgICIgIDAzOiBhX2JpdGUgKGJ5dGUpID0gMHg3ZixcbiIKKyAgICAiICAwNDogaW50ZWdlcjE2IChpMTYpID0gMjcwMDAsXG4iCisgICAgIiAgMDU6IGludGVnZXIzMiAoaTMyKSA9IDE2Nzc3MjE2LFxuIgorICAgICIgIDA2OiBpbnRlZ2VyNjQgKGk2NCkgPSA2MDAwMDAwMDAwLFxuIgorICAgICIgIDA3OiBkb3VibGVfcHJlY2lzaW9uIChkb3VibGUpID0gMy4xNDE1OTI2NTM1ODk3OTMxLFxuIgorICAgICIgIDA4OiBzb21lX2NoYXJhY3RlcnMgKHN0cmluZykgPSBcIkRlYnVnIFRISVMhXCIsXG4iCisgICAgIiAgMDk6IHpvbWdfdW5pY29kZSAoc3RyaW5nKSA9IFwiXFx4ZDdcXG5cXGFcXHRcIixcbiIKKyAgICAiICAxMDogd2hhdF93aG8gKGJvb2wpID0gZmFsc2UsXG4iCisgICAgIiAgMTE6IGJhc2U2NCAoc3RyaW5nKSA9IFwiXCIsXG4iCisgICAgIiAgMTI6IGJ5dGVfbGlzdCAobGlzdCkgPSBsaXN0PGJ5dGU+WzNdIHtcbiIKKyAgICAiICAgIFswXSA9IDB4MDEsXG4iCisgICAgIiAgICBbMV0gPSAweDAyLFxuIgorICAgICIgICAgWzJdID0gMHgwMyxcbiIKKyAgICAiICB9LFxuIgorICAgICIgIDEzOiBpMTZfbGlzdCAobGlzdCkgPSBsaXN0PGkxNj5bM10ge1xuIgorICAgICIgICAgWzBdID0gMSxcbiIKKyAgICAiICAgIFsxXSA9IDIsXG4iCisgICAgIiAgICBbMl0gPSAzLFxuIgorICAgICIgIH0sXG4iCisgICAgIiAgMTQ6IGk2NF9saXN0IChsaXN0KSA9IGxpc3Q8aTY0PlszXSB7XG4iCisgICAgIiAgICBbMF0gPSAxLFxuIgorICAgICIgICAgWzFdID0gMixcbiIKKyAgICAiICAgIFsyXSA9IDMsXG4iCisgICAgIiAgfSxcbiIKKyAgICAifSIpOworICBjb25zdCBzdGQ6OnN0cmluZyByZXN1bHQoYXBhY2hlOjp0aHJpZnQ6OlRocmlmdERlYnVnU3RyaW5nKCpvb2UpKTsKIAotICBjb3V0IDw8IGFwYWNoZTo6dGhyaWZ0OjpUaHJpZnREZWJ1Z1N0cmluZyhuKSA8PCBlbmRsIDw8IGVuZGw7CisgIEJPT1NUX0NIRUNLX01FU1NBR0UoIWV4cGVjdGVkX3Jlc3VsdC5jb21wYXJlKHJlc3VsdCksCisgICAgIkV4cGVjdGVkOlxuIiA8PCBleHBlY3RlZF9yZXN1bHQgPDwgIlxuR290dGVuOlxuIiA8PCByZXN1bHQpOworfQogCitzdGF0aWMgOjpzdGQ6OnNoYXJlZF9wdHI8TmVzdGluZz4gbjsKIAotICBIb2x5TW9sZXkgaG07Cit2b2lkIHRlc3RDYXNlU2V0dXBfMigpIHsKKyAgdGVzdENhc2VTZXR1cF8xKCk7CiAKLSAgaG0uYmlnLnB1c2hfYmFjayhvb2UpOwotICBobS5iaWcucHVzaF9iYWNrKG4ubXlfb29lKTsKLSAgaG0uYmlnWzBdLmFfYml0ZSA9IDB4MjI7Ci0gIGhtLmJpZ1sxXS5hX2JpdGUgPSAweDMzOworICBuLnJlc2V0KG5ldyBOZXN0aW5nKTsKKyAgbi0+bXlfb29lID0gKm9vZTsKKyAgbi0+bXlfb29lLmludGVnZXIxNiA9IDE2OworICBuLT5teV9vb2UuaW50ZWdlcjMyID0gMzI7CisgIG4tPm15X29vZS5pbnRlZ2VyNjQgPSA2NDsKKyAgbi0+bXlfb29lLmRvdWJsZV9wcmVjaXNpb24gPSAoc3RkOjpzcXJ0KDUuMCkgKyAxKSAvIDI7CisgIG4tPm15X29vZS5zb21lX2NoYXJhY3RlcnMgPSAiOlIgKG1lIGdvaW5nIFwicnJyclwiKSI7CisgIG4tPm15X29vZS56b21nX3VuaWNvZGUgICAgID0gIlx4ZDNceDgwXHhlMlx4ODVceGFlXHhjZVx4OWRceDIwXHhkMFx4OWRceGNlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJceGJmXHhlMlx4ODVceGJmXHhkMFx4YmVceGM5XHhhMVx4ZDBceGIzXHhkMCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHhiMFx4Y2ZceDgxXHhlMlx4ODRceDhlXHgyMFx4Y2VceDkxXHg3NFx4NzQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4Y2VceGIxXHhlMlx4ODVceGJkXHhjZVx4YmFceGM3XHg4M1x4ZTJceDgwIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJceGJjIjsKKyAgbi0+bXlfYm9uay50eXBlID0gMzEzMzc7CisgIG4tPm15X2JvbmsubWVzc2FnZSA9ICJJIGFtIGEgYm9uay4uLiB4b3IhIjsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9kZWJ1Z19wcm90b18yKSB7CisgIHRlc3RDYXNlU2V0dXBfMigpOworCisgIGNvbnN0IHN0ZDo6c3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCgKKyAgICAiTmVzdGluZyB7XG4iCisgICAgIiAgMDE6IG15X2JvbmsgKHN0cnVjdCkgPSBCb25rIHtcbiIKKyAgICAiICAgIDAxOiB0eXBlIChpMzIpID0gMzEzMzcsXG4iCisgICAgIiAgICAwMjogbWVzc2FnZSAoc3RyaW5nKSA9IFwiSSBhbSBhIGJvbmsuLi4geG9yIVwiLFxuIgorICAgICIgIH0sXG4iCisgICAgIiAgMDI6IG15X29vZSAoc3RydWN0KSA9IE9uZU9mRWFjaCB7XG4iCisgICAgIiAgICAwMTogaW1fdHJ1ZSAoYm9vbCkgPSB0cnVlLFxuIgorICAgICIgICAgMDI6IGltX2ZhbHNlIChib29sKSA9IGZhbHNlLFxuIgorICAgICIgICAgMDM6IGFfYml0ZSAoYnl0ZSkgPSAweDdmLFxuIgorICAgICIgICAgMDQ6IGludGVnZXIxNiAoaTE2KSA9IDE2LFxuIgorICAgICIgICAgMDU6IGludGVnZXIzMiAoaTMyKSA9IDMyLFxuIgorICAgICIgICAgMDY6IGludGVnZXI2NCAoaTY0KSA9IDY0LFxuIgorICAgICIgICAgMDc6IGRvdWJsZV9wcmVjaXNpb24gKGRvdWJsZSkgPSAxLjYxODAzMzk4ODc0OTg5NDksXG4iCisgICAgIiAgICAwODogc29tZV9jaGFyYWN0ZXJzIChzdHJpbmcpID0gXCI6UiAobWUgZ29pbmcgXFxcInJycnJcXFwiKVwiLFxuIgorICAgICIgICAgMDk6IHpvbWdfdW5pY29kZSAoc3RyaW5nKSA9IFwiXFx4ZDNcXHg4MFxceGUyXFx4ODVcXHhhZVxceGNlXFx4OWQgXFx4ZCIKKyAgICAgICIwXFx4OWRcXHhjZVxceGJmXFx4ZTJcXHg4NVxceGJmXFx4ZDBcXHhiZVxceGM5XFx4YTFcXHhkMFxceGIzXFx4ZDBcXHhiMCIKKyAgICAgICJcXHhjZlxceDgxXFx4ZTJcXHg4NFxceDhlIFxceGNlXFx4OTF0dFxceGNlXFx4YjFcXHhlMlxceDg1XFx4YmRcXHhjZVxceGIiCisgICAgICAiYVxceGM3XFx4ODNcXHhlMlxceDgwXFx4YmNcIixcbiIKKyAgICAiICAgIDEwOiB3aGF0X3dobyAoYm9vbCkgPSBmYWxzZSxcbiIKKyAgICAiICAgIDExOiBiYXNlNjQgKHN0cmluZykgPSBcIlwiLFxuIgorICAgICIgICAgMTI6IGJ5dGVfbGlzdCAobGlzdCkgPSBsaXN0PGJ5dGU+WzNdIHtcbiIKKyAgICAiICAgICAgWzBdID0gMHgwMSxcbiIKKyAgICAiICAgICAgWzFdID0gMHgwMixcbiIKKyAgICAiICAgICAgWzJdID0gMHgwMyxcbiIKKyAgICAiICAgIH0sXG4iCisgICAgIiAgICAxMzogaTE2X2xpc3QgKGxpc3QpID0gbGlzdDxpMTY+WzNdIHtcbiIKKyAgICAiICAgICAgWzBdID0gMSxcbiIKKyAgICAiICAgICAgWzFdID0gMixcbiIKKyAgICAiICAgICAgWzJdID0gMyxcbiIKKyAgICAiICAgIH0sXG4iCisgICAgIiAgICAxNDogaTY0X2xpc3QgKGxpc3QpID0gbGlzdDxpNjQ+WzNdIHtcbiIKKyAgICAiICAgICAgWzBdID0gMSxcbiIKKyAgICAiICAgICAgWzFdID0gMixcbiIKKyAgICAiICAgICAgWzJdID0gMyxcbiIKKyAgICAiICAgIH0sXG4iCisgICAgIiAgfSxcbiIKKyAgICAifSIpOworICBjb25zdCBzdGQ6OnN0cmluZyByZXN1bHQoYXBhY2hlOjp0aHJpZnQ6OlRocmlmdERlYnVnU3RyaW5nKCpuKSk7CisKKyAgQk9PU1RfQ0hFQ0tfTUVTU0FHRSghZXhwZWN0ZWRfcmVzdWx0LmNvbXBhcmUocmVzdWx0KSwKKyAgICAiRXhwZWN0ZWQ6XG4iIDw8IGV4cGVjdGVkX3Jlc3VsdCA8PCAiXG5Hb3R0ZW46XG4iIDw8IHJlc3VsdCk7Cit9CisKK3N0YXRpYyA6OnN0ZDo6c2hhcmVkX3B0cjxIb2x5TW9sZXk+IGhtOworCit2b2lkIHRlc3RDYXNlU2V0dXBfMygpIHsKKyAgdGVzdENhc2VTZXR1cF8yKCk7CisKKyAgaG0ucmVzZXQobmV3IEhvbHlNb2xleSk7CisKKyAgaG0tPmJpZy5wdXNoX2JhY2soKm9vZSk7CisgIGhtLT5iaWcucHVzaF9iYWNrKG4tPm15X29vZSk7CisgIGhtLT5iaWdbMF0uYV9iaXRlID0gMHgyMjsKKyAgaG0tPmJpZ1sxXS5hX2JpdGUgPSAweDMzOwogCiAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBzdGFnZTE7CiAgIHN0YWdlMS5wdXNoX2JhY2soImFuZCBhIG9uZSIpOwogICBzdGFnZTEucHVzaF9iYWNrKCJhbmQgYSB0d28iKTsKLSAgaG0uY29udGFpbi5pbnNlcnQoc3RhZ2UxKTsKKyAgaG0tPmNvbnRhaW4uaW5zZXJ0KHN0YWdlMSk7CiAgIHN0YWdlMS5jbGVhcigpOwogICBzdGFnZTEucHVzaF9iYWNrKCJ0aGVuIGEgb25lLCB0d28iKTsKICAgc3RhZ2UxLnB1c2hfYmFjaygidGhyZWUhIik7CiAgIHN0YWdlMS5wdXNoX2JhY2soIkZPVVIhISIpOwotICBobS5jb250YWluLmluc2VydChzdGFnZTEpOworICBobS0+Y29udGFpbi5pbnNlcnQoc3RhZ2UxKTsKICAgc3RhZ2UxLmNsZWFyKCk7Ci0gIGhtLmNvbnRhaW4uaW5zZXJ0KHN0YWdlMSk7CisgIGhtLT5jb250YWluLmluc2VydChzdGFnZTEpOwogCiAgIHN0ZDo6dmVjdG9yPEJvbms+IHN0YWdlMjsKLSAgaG0uYm9ua3NbIm5vdGhpbmciXSA9IHN0YWdlMjsKLSAgc3RhZ2UyLnJlc2l6ZShzdGFnZTIuc2l6ZSgpKzEpOworICBobS0+Ym9ua3NbIm5vdGhpbmciXSA9IHN0YWdlMjsKKyAgc3RhZ2UyLnJlc2l6ZShzdGFnZTIuc2l6ZSgpICsgMSk7CiAgIHN0YWdlMi5iYWNrKCkudHlwZSA9IDE7CiAgIHN0YWdlMi5iYWNrKCkubWVzc2FnZSA9ICJXYWl0LiI7Ci0gIHN0YWdlMi5yZXNpemUoc3RhZ2UyLnNpemUoKSsxKTsKKyAgc3RhZ2UyLnJlc2l6ZShzdGFnZTIuc2l6ZSgpICsgMSk7CiAgIHN0YWdlMi5iYWNrKCkudHlwZSA9IDI7CiAgIHN0YWdlMi5iYWNrKCkubWVzc2FnZSA9ICJXaGF0PyI7Ci0gIGhtLmJvbmtzWyJzb21ldGhpbmciXSA9IHN0YWdlMjsKKyAgaG0tPmJvbmtzWyJzb21ldGhpbmciXSA9IHN0YWdlMjsKICAgc3RhZ2UyLmNsZWFyKCk7Ci0gIHN0YWdlMi5yZXNpemUoc3RhZ2UyLnNpemUoKSsxKTsKKyAgc3RhZ2UyLnJlc2l6ZShzdGFnZTIuc2l6ZSgpICsgMSk7CiAgIHN0YWdlMi5iYWNrKCkudHlwZSA9IDM7CiAgIHN0YWdlMi5iYWNrKCkubWVzc2FnZSA9ICJxdW90aCI7Ci0gIHN0YWdlMi5yZXNpemUoc3RhZ2UyLnNpemUoKSsxKTsKKyAgc3RhZ2UyLnJlc2l6ZShzdGFnZTIuc2l6ZSgpICsgMSk7CiAgIHN0YWdlMi5iYWNrKCkudHlwZSA9IDQ7CiAgIHN0YWdlMi5iYWNrKCkubWVzc2FnZSA9ICJ0aGUgcmF2ZW4iOwotICBzdGFnZTIucmVzaXplKHN0YWdlMi5zaXplKCkrMSk7CisgIHN0YWdlMi5yZXNpemUoc3RhZ2UyLnNpemUoKSArIDEpOwogICBzdGFnZTIuYmFjaygpLnR5cGUgPSA1OwogICBzdGFnZTIuYmFjaygpLm1lc3NhZ2UgPSAibmV2ZXJtb3JlIjsKLSAgaG0uYm9ua3NbInBvZSJdID0gc3RhZ2UyOworICBobS0+Ym9ua3NbInBvZSJdID0gc3RhZ2UyOworfQogCi0gIGNvdXQgPDwgYXBhY2hlOjp0aHJpZnQ6OlRocmlmdERlYnVnU3RyaW5nKGhtKSA8PCBlbmRsIDw8IGVuZGw7CitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2RlYnVnX3Byb3RvXzMpIHsKKyAgdGVzdENhc2VTZXR1cF8zKCk7CiAKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0KAorICAgICJIb2x5TW9sZXkge1xuIgorICAgICIgIDAxOiBiaWcgKGxpc3QpID0gbGlzdDxzdHJ1Y3Q+WzJdIHtcbiIKKyAgICAiICAgIFswXSA9IE9uZU9mRWFjaCB7XG4iCisgICAgIiAgICAgIDAxOiBpbV90cnVlIChib29sKSA9IHRydWUsXG4iCisgICAgIiAgICAgIDAyOiBpbV9mYWxzZSAoYm9vbCkgPSBmYWxzZSxcbiIKKyAgICAiICAgICAgMDM6IGFfYml0ZSAoYnl0ZSkgPSAweDIyLFxuIgorICAgICIgICAgICAwNDogaW50ZWdlcjE2IChpMTYpID0gMjcwMDAsXG4iCisgICAgIiAgICAgIDA1OiBpbnRlZ2VyMzIgKGkzMikgPSAxNjc3NzIxNixcbiIKKyAgICAiICAgICAgMDY6IGludGVnZXI2NCAoaTY0KSA9IDYwMDAwMDAwMDAsXG4iCisgICAgIiAgICAgIDA3OiBkb3VibGVfcHJlY2lzaW9uIChkb3VibGUpID0gMy4xNDE1OTI2NTM1ODk3OTMxLFxuIgorICAgICIgICAgICAwODogc29tZV9jaGFyYWN0ZXJzIChzdHJpbmcpID0gXCJEZWJ1ZyBUSElTIVwiLFxuIgorICAgICIgICAgICAwOTogem9tZ191bmljb2RlIChzdHJpbmcpID0gXCJcXHhkN1xcblxcYVxcdFwiLFxuIgorICAgICIgICAgICAxMDogd2hhdF93aG8gKGJvb2wpID0gZmFsc2UsXG4iCisgICAgIiAgICAgIDExOiBiYXNlNjQgKHN0cmluZykgPSBcIlwiLFxuIgorICAgICIgICAgICAxMjogYnl0ZV9saXN0IChsaXN0KSA9IGxpc3Q8Ynl0ZT5bM10ge1xuIgorICAgICIgICAgICAgIFswXSA9IDB4MDEsXG4iCisgICAgIiAgICAgICAgWzFdID0gMHgwMixcbiIKKyAgICAiICAgICAgICBbMl0gPSAweDAzLFxuIgorICAgICIgICAgICB9LFxuIgorICAgICIgICAgICAxMzogaTE2X2xpc3QgKGxpc3QpID0gbGlzdDxpMTY+WzNdIHtcbiIKKyAgICAiICAgICAgICBbMF0gPSAxLFxuIgorICAgICIgICAgICAgIFsxXSA9IDIsXG4iCisgICAgIiAgICAgICAgWzJdID0gMyxcbiIKKyAgICAiICAgICAgfSxcbiIKKyAgICAiICAgICAgMTQ6IGk2NF9saXN0IChsaXN0KSA9IGxpc3Q8aTY0PlszXSB7XG4iCisgICAgIiAgICAgICAgWzBdID0gMSxcbiIKKyAgICAiICAgICAgICBbMV0gPSAyLFxuIgorICAgICIgICAgICAgIFsyXSA9IDMsXG4iCisgICAgIiAgICAgIH0sXG4iCisgICAgIiAgICB9LFxuIgorICAgICIgICAgWzFdID0gT25lT2ZFYWNoIHtcbiIKKyAgICAiICAgICAgMDE6IGltX3RydWUgKGJvb2wpID0gdHJ1ZSxcbiIKKyAgICAiICAgICAgMDI6IGltX2ZhbHNlIChib29sKSA9IGZhbHNlLFxuIgorICAgICIgICAgICAwMzogYV9iaXRlIChieXRlKSA9IDB4MzMsXG4iCisgICAgIiAgICAgIDA0OiBpbnRlZ2VyMTYgKGkxNikgPSAxNixcbiIKKyAgICAiICAgICAgMDU6IGludGVnZXIzMiAoaTMyKSA9IDMyLFxuIgorICAgICIgICAgICAwNjogaW50ZWdlcjY0IChpNjQpID0gNjQsXG4iCisgICAgIiAgICAgIDA3OiBkb3VibGVfcHJlY2lzaW9uIChkb3VibGUpID0gMS42MTgwMzM5ODg3NDk4OTQ5LFxuIgorICAgICIgICAgICAwODogc29tZV9jaGFyYWN0ZXJzIChzdHJpbmcpID0gXCI6UiAobWUgZ29pbmcgXFxcInJycnJcXFwiKVwiLFxuIgorICAgICIgICAgICAwOTogem9tZ191bmljb2RlIChzdHJpbmcpID0gXCJcXHhkM1xceDgwXFx4ZTJcXHg4NVxceGFlXFx4Y2VcXHg5ZCBcXCIKKyAgICAgICJ4ZDBcXHg5ZFxceGNlXFx4YmZcXHhlMlxceDg1XFx4YmZcXHhkMFxceGJlXFx4YzlcXHhhMVxceGQwXFx4YjNcXHhkMFxceGIiCisgICAgICAiMFxceGNmXFx4ODFcXHhlMlxceDg0XFx4OGUgXFx4Y2VcXHg5MXR0XFx4Y2VcXHhiMVxceGUyXFx4ODVcXHhiZFxceGNlXFx4IgorICAgICAgImJhXFx4YzdcXHg4M1xceGUyXFx4ODBcXHhiY1wiLFxuIgorICAgICIgICAgICAxMDogd2hhdF93aG8gKGJvb2wpID0gZmFsc2UsXG4iCisgICAgIiAgICAgIDExOiBiYXNlNjQgKHN0cmluZykgPSBcIlwiLFxuIgorICAgICIgICAgICAxMjogYnl0ZV9saXN0IChsaXN0KSA9IGxpc3Q8Ynl0ZT5bM10ge1xuIgorICAgICIgICAgICAgIFswXSA9IDB4MDEsXG4iCisgICAgIiAgICAgICAgWzFdID0gMHgwMixcbiIKKyAgICAiICAgICAgICBbMl0gPSAweDAzLFxuIgorICAgICIgICAgICB9LFxuIgorICAgICIgICAgICAxMzogaTE2X2xpc3QgKGxpc3QpID0gbGlzdDxpMTY+WzNdIHtcbiIKKyAgICAiICAgICAgICBbMF0gPSAxLFxuIgorICAgICIgICAgICAgIFsxXSA9IDIsXG4iCisgICAgIiAgICAgICAgWzJdID0gMyxcbiIKKyAgICAiICAgICAgfSxcbiIKKyAgICAiICAgICAgMTQ6IGk2NF9saXN0IChsaXN0KSA9IGxpc3Q8aTY0PlszXSB7XG4iCisgICAgIiAgICAgICAgWzBdID0gMSxcbiIKKyAgICAiICAgICAgICBbMV0gPSAyLFxuIgorICAgICIgICAgICAgIFsyXSA9IDMsXG4iCisgICAgIiAgICAgIH0sXG4iCisgICAgIiAgICB9LFxuIgorICAgICIgIH0sXG4iCisgICAgIiAgMDI6IGNvbnRhaW4gKHNldCkgPSBzZXQ8bGlzdD5bM10ge1xuIgorICAgICIgICAgbGlzdDxzdHJpbmc+WzBdIHtcbiIKKyAgICAiICAgIH0sXG4iCisgICAgIiAgICBsaXN0PHN0cmluZz5bMl0ge1xuIgorICAgICIgICAgICBbMF0gPSBcImFuZCBhIG9uZVwiLFxuIgorICAgICIgICAgICBbMV0gPSBcImFuZCBhIHR3b1wiLFxuIgorICAgICIgICAgfSxcbiIKKyAgICAiICAgIGxpc3Q8c3RyaW5nPlszXSB7XG4iCisgICAgIiAgICAgIFswXSA9IFwidGhlbiBhIG9uZSwgdHdvXCIsXG4iCisgICAgIiAgICAgIFsxXSA9IFwidGhyZWUhXCIsXG4iCisgICAgIiAgICAgIFsyXSA9IFwiRk9VUiEhXCIsXG4iCisgICAgIiAgICB9LFxuIgorICAgICIgIH0sXG4iCisgICAgIiAgMDM6IGJvbmtzIChtYXApID0gbWFwPHN0cmluZyxsaXN0PlszXSB7XG4iCisgICAgIiAgICBcIm5vdGhpbmdcIiAtPiBsaXN0PHN0cnVjdD5bMF0ge1xuIgorICAgICIgICAgfSxcbiIKKyAgICAiICAgIFwicG9lXCIgLT4gbGlzdDxzdHJ1Y3Q+WzNdIHtcbiIKKyAgICAiICAgICAgWzBdID0gQm9uayB7XG4iCisgICAgIiAgICAgICAgMDE6IHR5cGUgKGkzMikgPSAzLFxuIgorICAgICIgICAgICAgIDAyOiBtZXNzYWdlIChzdHJpbmcpID0gXCJxdW90aFwiLFxuIgorICAgICIgICAgICB9LFxuIgorICAgICIgICAgICBbMV0gPSBCb25rIHtcbiIKKyAgICAiICAgICAgICAwMTogdHlwZSAoaTMyKSA9IDQsXG4iCisgICAgIiAgICAgICAgMDI6IG1lc3NhZ2UgKHN0cmluZykgPSBcInRoZSByYXZlblwiLFxuIgorICAgICIgICAgICB9LFxuIgorICAgICIgICAgICBbMl0gPSBCb25rIHtcbiIKKyAgICAiICAgICAgICAwMTogdHlwZSAoaTMyKSA9IDUsXG4iCisgICAgIiAgICAgICAgMDI6IG1lc3NhZ2UgKHN0cmluZykgPSBcIm5ldmVybW9yZVwiLFxuIgorICAgICIgICAgICB9LFxuIgorICAgICIgICAgfSxcbiIKKyAgICAiICAgIFwic29tZXRoaW5nXCIgLT4gbGlzdDxzdHJ1Y3Q+WzJdIHtcbiIKKyAgICAiICAgICAgWzBdID0gQm9uayB7XG4iCisgICAgIiAgICAgICAgMDE6IHR5cGUgKGkzMikgPSAxLFxuIgorICAgICIgICAgICAgIDAyOiBtZXNzYWdlIChzdHJpbmcpID0gXCJXYWl0LlwiLFxuIgorICAgICIgICAgICB9LFxuIgorICAgICIgICAgICBbMV0gPSBCb25rIHtcbiIKKyAgICAiICAgICAgICAwMTogdHlwZSAoaTMyKSA9IDIsXG4iCisgICAgIiAgICAgICAgMDI6IG1lc3NhZ2UgKHN0cmluZykgPSBcIldoYXQ/XCIsXG4iCisgICAgIiAgICAgIH0sXG4iCisgICAgIiAgICB9LFxuIgorICAgICIgIH0sXG4iCisgICAgIn0iKTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgcmVzdWx0KGFwYWNoZTo6dGhyaWZ0OjpUaHJpZnREZWJ1Z1N0cmluZygqaG0pKTsKIAotICByZXR1cm4gMDsKKyAgQk9PU1RfQ0hFQ0tfTUVTU0FHRSghZXhwZWN0ZWRfcmVzdWx0LmNvbXBhcmUocmVzdWx0KSwKKyAgICAiRXhwZWN0ZWQ6XG4iIDw8IGV4cGVjdGVkX3Jlc3VsdCA8PCAiXG5Hb3R0ZW46XG4iIDw8IHJlc3VsdCk7CiB9CmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvRGVidWdQcm90b1Rlc3RfZXh0cmFzLmNwcCBiL2xpYi9jcHAvdGVzdC9EZWJ1Z1Byb3RvVGVzdF9leHRyYXMuY3BwCmluZGV4IGM4OWRiNzQuLjVjNGZkMzUgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvdGVzdC9EZWJ1Z1Byb3RvVGVzdF9leHRyYXMuY3BwCisrKyBiL2xpYi9jcHAvdGVzdC9EZWJ1Z1Byb3RvVGVzdF9leHRyYXMuY3BwCkBAIC0yMSwxMyArMjEsMTUgQEAKIAogI2luY2x1ZGUgImdlbi1jcHAvRGVidWdQcm90b1Rlc3RfdHlwZXMuaCIKIAotCi1uYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHRlc3QgeyBuYW1lc3BhY2UgZGVidWcgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdGVzdCB7CituYW1lc3BhY2UgZGVidWcgewogCiBib29sIEVtcHR5OjpvcGVyYXRvcjwoRW1wdHkgY29uc3QmIG90aGVyKSBjb25zdCB7Ci0gICh2b2lkKSBvdGhlcjsKKyAgKHZvaWQpb3RoZXI7CiAgIC8vIEl0IGlzIGVtcHR5LCBzbyBhbGwgYXJlIGVxdWFsLgogICByZXR1cm4gZmFsc2U7CiB9Ci0KLX19fQorfQorfQorfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L0RlbnNlUHJvdG9UZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9EZW5zZVByb3RvVGVzdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3MzU3OWYuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC90ZXN0L0RlbnNlUHJvdG9UZXN0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM4NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCi0uLi9jb21waWxlci9jcHAvdGhyaWZ0IC0tZ2VuIGNwcDpkZW5zZSBEZWJ1Z1Byb3RvVGVzdC50aHJpZnQKLS4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLS1nZW4gY3BwOmRlbnNlIE9wdGlvbmFsUmVxdWlyZWRUZXN0LnRocmlmdAotZysrIC1XYWxsIC1nIC1JLi4vbGliL2NwcC9zcmMgLUkvdXNyL2xvY2FsL2luY2x1ZGUvYm9vc3QtMV8zM18xIFwKLSAgZ2VuLWNwcC9PcHRpb25hbFJlcXVpcmVkVGVzdF90eXBlcy5jcHAgXAotICBnZW4tY3BwL0RlYnVnUHJvdG9UZXN0X3R5cGVzLmNwcCBcCi0gIERlbnNlUHJvdG9UZXN0LmNwcCAuLi9saWIvY3BwLy5saWJzL2xpYnRocmlmdC5hIC1vIERlbnNlUHJvdG9UZXN0Ci0uL0RlbnNlUHJvdG9UZXN0Ci0qLwotCi0vLyBJIGRvIHRoaXMgdG8gcmVhY2ggaW50byB0aGUgZ3V0cyBvZiBURGVuc2VQcm90b2NvbC4gIFNvcnJ5LgotI2RlZmluZSBwcml2YXRlIHB1YmxpYwotI2RlZmluZSBpbmxpbmUKLQotI3VuZGVmIE5ERUJVRwotI2luY2x1ZGUgPGNzdGRsaWI+Ci0jaW5jbHVkZSA8Y2Fzc2VydD4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDxjbWF0aD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSAiZ2VuLWNwcC9EZWJ1Z1Byb3RvVGVzdF90eXBlcy5oIgotI2luY2x1ZGUgImdlbi1jcHAvT3B0aW9uYWxSZXF1aXJlZFRlc3RfdHlwZXMuaCIKLSNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVERlbnNlUHJvdG9jb2wuaD4KLSNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+Ci0KLQotLy8gQ2FuJ3QgdXNlIG1lbWNtcCBoZXJlLiAgR0NDIGlzIHRvbyBzbWFydC4KLWJvb2wgbXlfbWVtZXEoY29uc3QgY2hhciogc3RyMSwgY29uc3QgY2hhciogc3RyMiwgaW50IGxlbikgewotICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgaWYgKHN0cjFbaV0gIT0gc3RyMltpXSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi1pbnQgbWFpbigpIHsKLSAgdXNpbmcgc3RkOjpzdHJpbmc7Ci0gIHVzaW5nIHN0ZDo6Y291dDsKLSAgdXNpbmcgc3RkOjplbmRsOwotICB1c2luZyBib29zdDo6c2hhcmVkX3B0cjsKLSAgdXNpbmcgbmFtZXNwYWNlIHRocmlmdDo6dGVzdDo6ZGVidWc7Ci0gIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OwotICB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOwotCi0KLSAgT25lT2ZFYWNoIG9vZTsKLSAgb29lLmltX3RydWUgICA9IHRydWU7Ci0gIG9vZS5pbV9mYWxzZSAgPSBmYWxzZTsKLSAgb29lLmFfYml0ZSAgICA9IDB4ZDY7Ci0gIG9vZS5pbnRlZ2VyMTYgPSAyNzAwMDsKLSAgb29lLmludGVnZXIzMiA9IDE8PDI0OwotICBvb2UuaW50ZWdlcjY0ID0gKHVpbnQ2NF90KTYwMDAgKiAxMDAwICogMTAwMDsKLSAgb29lLmRvdWJsZV9wcmVjaXNpb24gPSBNX1BJOwotICBvb2Uuc29tZV9jaGFyYWN0ZXJzICA9ICJEZWJ1ZyBUSElTISI7Ci0gIG9vZS56b21nX3VuaWNvZGUgICAgID0gIlx4ZDdcblxhXHQiOwotCi0gIC8vY291dCA8PCBhcGFjaGU6OnRocmlmdDo6VGhyaWZ0RGVidWdTdHJpbmcob29lKSA8PCBlbmRsIDw8IGVuZGw7Ci0KLQotICBOZXN0aW5nIG47Ci0gIG4ubXlfb29lID0gb29lOwotICBuLm15X29vZS5pbnRlZ2VyMTYgPSAxNjsKLSAgbi5teV9vb2UuaW50ZWdlcjMyID0gMzI7Ci0gIG4ubXlfb29lLmludGVnZXI2NCA9IDY0OwotICBuLm15X29vZS5kb3VibGVfcHJlY2lzaW9uID0gKHN0ZDo6c3FydCg1KSsxKS8yOwotICBuLm15X29vZS5zb21lX2NoYXJhY3RlcnMgID0gIjpSIChtZSBnb2luZyBcInJycnJcIikiOwotICBuLm15X29vZS56b21nX3VuaWNvZGUgICAgID0gIlx4ZDNceDgwXHhlMlx4ODVceGFlXHhjZVx4OWRceDIwIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4ZDBceDlkXHhjZVx4YmZceGUyXHg4NVx4YmZceGQwXHhiZVx4YzlceGExXHhkMFx4YjNceGQwXHhiMFx4Y2ZceDgxXHhlMlx4ODRceDhlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4MjBceGNlXHg5MVx4NzRceDc0XHhjZVx4YjFceGUyXHg4NVx4YmRceGNlXHhiYVx4YzdceDgzXHhlMlx4ODBceGJjIjsKLSAgbi5teV9ib25rLnR5cGUgICAgPSAzMTMzNzsKLSAgbi5teV9ib25rLm1lc3NhZ2UgPSAiSSBhbSBhIGJvbmsuLi4geG9yISI7Ci0KLSAgLy9jb3V0IDw8IGFwYWNoZTo6dGhyaWZ0OjpUaHJpZnREZWJ1Z1N0cmluZyhuKSA8PCBlbmRsIDw8IGVuZGw7Ci0KLQotICBIb2x5TW9sZXkgaG07Ci0KLSAgaG0uYmlnLnB1c2hfYmFjayhvb2UpOwotICBobS5iaWcucHVzaF9iYWNrKG4ubXlfb29lKTsKLSAgaG0uYmlnWzBdLmFfYml0ZSA9IDB4MjI7Ci0gIGhtLmJpZ1sxXS5hX2JpdGUgPSAweDMzOwotCi0gIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBzdGFnZTE7Ci0gIHN0YWdlMS5wdXNoX2JhY2soImFuZCBhIG9uZSIpOwotICBzdGFnZTEucHVzaF9iYWNrKCJhbmQgYSB0d28iKTsKLSAgaG0uY29udGFpbi5pbnNlcnQoc3RhZ2UxKTsKLSAgc3RhZ2UxLmNsZWFyKCk7Ci0gIHN0YWdlMS5wdXNoX2JhY2soInRoZW4gYSBvbmUsIHR3byIpOwotICBzdGFnZTEucHVzaF9iYWNrKCJ0aHJlZSEiKTsKLSAgc3RhZ2UxLnB1c2hfYmFjaygiRk9VUiEhIik7Ci0gIGhtLmNvbnRhaW4uaW5zZXJ0KHN0YWdlMSk7Ci0gIHN0YWdlMS5jbGVhcigpOwotICBobS5jb250YWluLmluc2VydChzdGFnZTEpOwotCi0gIHN0ZDo6dmVjdG9yPEJvbms+IHN0YWdlMjsKLSAgaG0uYm9ua3NbIm5vdGhpbmciXSA9IHN0YWdlMjsKLSAgc3RhZ2UyLnJlc2l6ZShzdGFnZTIuc2l6ZSgpKzEpOwotICBzdGFnZTIuYmFjaygpLnR5cGUgPSAxOwotICBzdGFnZTIuYmFjaygpLm1lc3NhZ2UgPSAiV2FpdC4iOwotICBzdGFnZTIucmVzaXplKHN0YWdlMi5zaXplKCkrMSk7Ci0gIHN0YWdlMi5iYWNrKCkudHlwZSA9IDI7Ci0gIHN0YWdlMi5iYWNrKCkubWVzc2FnZSA9ICJXaGF0PyI7Ci0gIGhtLmJvbmtzWyJzb21ldGhpbmciXSA9IHN0YWdlMjsKLSAgc3RhZ2UyLmNsZWFyKCk7Ci0gIHN0YWdlMi5yZXNpemUoc3RhZ2UyLnNpemUoKSsxKTsKLSAgc3RhZ2UyLmJhY2soKS50eXBlID0gMzsKLSAgc3RhZ2UyLmJhY2soKS5tZXNzYWdlID0gInF1b3RoIjsKLSAgc3RhZ2UyLnJlc2l6ZShzdGFnZTIuc2l6ZSgpKzEpOwotICBzdGFnZTIuYmFjaygpLnR5cGUgPSA0OwotICBzdGFnZTIuYmFjaygpLm1lc3NhZ2UgPSAidGhlIHJhdmVuIjsKLSAgc3RhZ2UyLnJlc2l6ZShzdGFnZTIuc2l6ZSgpKzEpOwotICBzdGFnZTIuYmFjaygpLnR5cGUgPSA1OwotICBzdGFnZTIuYmFjaygpLm1lc3NhZ2UgPSAibmV2ZXJtb3JlIjsKLSAgaG0uYm9ua3NbInBvZSJdID0gc3RhZ2UyOwotCi0gIC8vY291dCA8PCBhcGFjaGU6OnRocmlmdDo6VGhyaWZ0RGVidWdTdHJpbmcoaG0pIDw8IGVuZGwgPDwgZW5kbDsKLQotICBzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZmZlcihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKLSAgc2hhcmVkX3B0cjxURGVuc2VQcm90b2NvbD4gcHJvdG8obmV3IFREZW5zZVByb3RvY29sKGJ1ZmZlcikpOwotICBwcm90by0+c2V0VHlwZVNwZWMoSG9seU1vbGV5Ojpsb2NhbF9yZWZsZWN0aW9uKTsKLQotICBobS53cml0ZShwcm90by5nZXQoKSk7Ci0gIEhvbHlNb2xleSBobTI7Ci0gIGhtMi5yZWFkKHByb3RvLmdldCgpKTsKLQotICBhc3NlcnQoaG0gPT0gaG0yKTsKLQotCi0gIC8vIExldCdzIHRlc3Qgb3V0IHRoZSB2YXJpYWJsZS1sZW5ndGggaW50cywgc2hhbGwgd2U/Ci0gIHVpbnQ2NF90IHZscTsKLSAgI2RlZmluZSBjaGVja291dChpLCBjKSB7IFwKLSAgICBidWZmZXItPnJlc2V0QnVmZmVyKCk7IFwKLSAgICBwcm90by0+dmxxV3JpdGUoaSk7IFwKLSAgICBwcm90by0+Z2V0VHJhbnNwb3J0KCktPmZsdXNoKCk7IFwKLSAgICBhc3NlcnQobXlfbWVtZXEoYnVmZmVyLT5nZXRCdWZmZXJBc1N0cmluZygpLmRhdGEoKSwgYywgc2l6ZW9mKGMpLTEpKTsgXAotICAgIHByb3RvLT52bHFSZWFkKHZscSk7IFwKLSAgICBhc3NlcnQodmxxID09IGkpOyBcCi0gIH0KLQotICBjaGVja291dCgweDAwMDAwMDAwLCAiXHgwMCIpOwotICBjaGVja291dCgweDAwMDAwMDQwLCAiXHg0MCIpOwotICBjaGVja291dCgweDAwMDAwMDdGLCAiXHg3RiIpOwotICBjaGVja291dCgweDAwMDAwMDgwLCAiXHg4MVx4MDAiKTsKLSAgY2hlY2tvdXQoMHgwMDAwMjAwMCwgIlx4QzBceDAwIik7Ci0gIGNoZWNrb3V0KDB4MDAwMDNGRkYsICJceEZGXHg3RiIpOwotICBjaGVja291dCgweDAwMDA0MDAwLCAiXHg4MVx4ODBceDAwIik7Ci0gIGNoZWNrb3V0KDB4MDAxMDAwMDAsICJceEMwXHg4MFx4MDAiKTsKLSAgY2hlY2tvdXQoMHgwMDFGRkZGRiwgIlx4RkZceEZGXHg3RiIpOwotICBjaGVja291dCgweDAwMjAwMDAwLCAiXHg4MVx4ODBceDgwXHgwMCIpOwotICBjaGVja291dCgweDA4MDAwMDAwLCAiXHhDMFx4ODBceDgwXHgwMCIpOwotICBjaGVja291dCgweDBGRkZGRkZGLCAiXHhGRlx4RkZceEZGXHg3RiIpOwotICBjaGVja291dCgweDEwMDAwMDAwLCAiXHg4MVx4ODBceDgwXHg4MFx4MDAiKTsKLSAgY2hlY2tvdXQoMHgyMDAwMDAwMCwgIlx4ODJceDgwXHg4MFx4ODBceDAwIik7Ci0gIGNoZWNrb3V0KDB4MUZGRkZGRkYsICJceDgxXHhGRlx4RkZceEZGXHg3RiIpOwotICBjaGVja291dCgweEZGRkZGRkZGLCAiXHg4Rlx4RkZceEZGXHhGRlx4N0YiKTsKLQotICBjaGVja291dCgweDAwMDAwMDAxMDAwMDAwMDB1bGwsICJceDkwXHg4MFx4ODBceDgwXHgwMCIpOwotICBjaGVja291dCgweDAwMDAwMDAyMDAwMDAwMDB1bGwsICJceEEwXHg4MFx4ODBceDgwXHgwMCIpOwotICBjaGVja291dCgweDAwMDAwMDAzMDAwMDAwMDB1bGwsICJceEIwXHg4MFx4ODBceDgwXHgwMCIpOwotICBjaGVja291dCgweDAwMDAwMDA3MDAwMDAwMDB1bGwsICJceEYwXHg4MFx4ODBceDgwXHgwMCIpOwotICBjaGVja291dCgweDAwMDAwMDA3RjAwMDAwMDB1bGwsICJceEZGXHg4MFx4ODBceDgwXHgwMCIpOwotICBjaGVja291dCgweDAwMDAwMDA3RkZGRkZGRkZ1bGwsICJceEZGXHhGRlx4RkZceEZGXHg3RiIpOwotICBjaGVja291dCgweDAwMDAwMDA4MDAwMDAwMDB1bGwsICJceDgxXHg4MFx4ODBceDgwXHg4MFx4MDAiKTsKLSAgY2hlY2tvdXQoMHgxRkZGRkZGRkZGRkZGRkZGdWxsLCAiXHg5Rlx4RkZceEZGXHhGRlx4RkZceEZGXHhGRlx4RkZceDdGIik7Ci0gIGNoZWNrb3V0KDB4N0ZGRkZGRkZGRkZGRkZGRnVsbCwgIlx4RkZceEZGXHhGRlx4RkZceEZGXHhGRlx4RkZceEZGXHg3RiIpOwotICBjaGVja291dCgweEZGRkZGRkZGRkZGRkZGRkZ1bGwsICJceDgxXHhGRlx4RkZceEZGXHhGRlx4RkZceEZGXHhGRlx4RkZceDdGIik7Ci0KLSAgLy8gVGVzdCBvdXQgdGhlIHNsb3cgcGF0aCB3aXRoIGEgVEJ1ZmZlcmVkVHJhbnNwb3J0LgotICBzaGFyZWRfcHRyPFRCdWZmZXJlZFRyYW5zcG9ydD4gYnVmZl90cmFucyhuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KGJ1ZmZlciwgMykpOwotICBwcm90by5yZXNldChuZXcgVERlbnNlUHJvdG9jb2woYnVmZl90cmFucykpOwotICBjaGVja291dCgweDAwMDAwMDAxMDAwMDAwMDB1bGwsICJceDkwXHg4MFx4ODBceDgwXHgwMCIpOwotICBjaGVja291dCgweDAwMDAwMDAyMDAwMDAwMDB1bGwsICJceEEwXHg4MFx4ODBceDgwXHgwMCIpOwotICBjaGVja291dCgweDAwMDAwMDAzMDAwMDAwMDB1bGwsICJceEIwXHg4MFx4ODBceDgwXHgwMCIpOwotICBjaGVja291dCgweDAwMDAwMDA3MDAwMDAwMDB1bGwsICJceEYwXHg4MFx4ODBceDgwXHgwMCIpOwotICBjaGVja291dCgweDAwMDAwMDA3RjAwMDAwMDB1bGwsICJceEZGXHg4MFx4ODBceDgwXHgwMCIpOwotICBjaGVja291dCgweDAwMDAwMDA3RkZGRkZGRkZ1bGwsICJceEZGXHhGRlx4RkZceEZGXHg3RiIpOwotICBjaGVja291dCgweDAwMDAwMDA4MDAwMDAwMDB1bGwsICJceDgxXHg4MFx4ODBceDgwXHg4MFx4MDAiKTsKLSAgY2hlY2tvdXQoMHgxRkZGRkZGRkZGRkZGRkZGdWxsLCAiXHg5Rlx4RkZceEZGXHhGRlx4RkZceEZGXHhGRlx4RkZceDdGIik7Ci0gIGNoZWNrb3V0KDB4N0ZGRkZGRkZGRkZGRkZGRnVsbCwgIlx4RkZceEZGXHhGRlx4RkZceEZGXHhGRlx4RkZceEZGXHg3RiIpOwotICBjaGVja291dCgweEZGRkZGRkZGRkZGRkZGRkZ1bGwsICJceDgxXHhGRlx4RkZceEZGXHhGRlx4RkZceEZGXHhGRlx4RkZceDdGIik7Ci0KLSAgLy8gVGVzdCBvcHRpb25hbCBzdHVmZi4KLSAgcHJvdG8ucmVzZXQobmV3IFREZW5zZVByb3RvY29sKGJ1ZmZlcikpOwotICBwcm90by0+c2V0VHlwZVNwZWMoTWFueU9wdDo6bG9jYWxfcmVmbGVjdGlvbik7Ci0gIE1hbnlPcHQgbW8xLCBtbzIsIG1vMywgbW80LCBtbzUsIG1vNjsKLSAgbW8xLm9wdDEgPSA5MjM3NTkzNDc7Ci0gIG1vMS5vcHQyID0gMzkyNzQ5Mjc0OwotICBtbzEub3B0MyA9IDM5NTczOTQwMjsKLSAgbW8xLmRlZjQgPSAyOTQ3MzA5Mjg7Ci0gIG1vMS5vcHQ1ID0gMzk0MzA5MjE4OwotICBtbzEub3B0NiA9IDgzMjE5NDcyMzsKLSAgbW8xLl9faXNzZXQub3B0MSA9IHRydWU7Ci0gIG1vMS5fX2lzc2V0Lm9wdDIgPSB0cnVlOwotICBtbzEuX19pc3NldC5vcHQzID0gdHJ1ZTsKLSAgbW8xLl9faXNzZXQuZGVmNCA9IHRydWU7Ci0gIG1vMS5fX2lzc2V0Lm9wdDUgPSB0cnVlOwotICBtbzEuX19pc3NldC5vcHQ2ID0gdHJ1ZTsKLQotICBtbzEud3JpdGUocHJvdG8uZ2V0KCkpOwotICBtbzIucmVhZChwcm90by5nZXQoKSk7Ci0KLSAgYXNzZXJ0KG1vMi5fX2lzc2V0Lm9wdDEgPT0gdHJ1ZSk7Ci0gIGFzc2VydChtbzIuX19pc3NldC5vcHQyID09IHRydWUpOwotICBhc3NlcnQobW8yLl9faXNzZXQub3B0MyA9PSB0cnVlKTsKLSAgYXNzZXJ0KG1vMi5fX2lzc2V0LmRlZjQgPT0gdHJ1ZSk7Ci0gIGFzc2VydChtbzIuX19pc3NldC5vcHQ1ID09IHRydWUpOwotICBhc3NlcnQobW8yLl9faXNzZXQub3B0NiA9PSB0cnVlKTsKLQotICBhc3NlcnQobW8xID09IG1vMik7Ci0KLSAgbW8xLl9faXNzZXQub3B0MSA9IGZhbHNlOwotICBtbzEuX19pc3NldC5vcHQzID0gZmFsc2U7Ci0gIG1vMS5fX2lzc2V0Lm9wdDUgPSBmYWxzZTsKLQotICBtbzEud3JpdGUocHJvdG8uZ2V0KCkpOwotICBtbzMucmVhZChwcm90by5nZXQoKSk7Ci0KLSAgYXNzZXJ0KG1vMy5fX2lzc2V0Lm9wdDEgPT0gZmFsc2UpOwotICBhc3NlcnQobW8zLl9faXNzZXQub3B0MiA9PSB0cnVlKTsKLSAgYXNzZXJ0KG1vMy5fX2lzc2V0Lm9wdDMgPT0gZmFsc2UpOwotICBhc3NlcnQobW8zLl9faXNzZXQuZGVmNCA9PSB0cnVlKTsKLSAgYXNzZXJ0KG1vMy5fX2lzc2V0Lm9wdDUgPT0gZmFsc2UpOwotICBhc3NlcnQobW8zLl9faXNzZXQub3B0NiA9PSB0cnVlKTsKLQotICBhc3NlcnQobW8xID09IG1vMyk7Ci0KLSAgbW8xLl9faXNzZXQub3B0MSA9IHRydWU7Ci0gIG1vMS5fX2lzc2V0Lm9wdDMgPSB0cnVlOwotICBtbzEuX19pc3NldC5vcHQ1ID0gdHJ1ZTsKLSAgbW8xLl9faXNzZXQub3B0MiA9IGZhbHNlOwotICBtbzEuX19pc3NldC5vcHQ2ID0gZmFsc2U7Ci0KLSAgbW8xLndyaXRlKHByb3RvLmdldCgpKTsKLSAgbW80LnJlYWQocHJvdG8uZ2V0KCkpOwotCi0gIGFzc2VydChtbzQuX19pc3NldC5vcHQxID09IHRydWUpOwotICBhc3NlcnQobW80Ll9faXNzZXQub3B0MiA9PSBmYWxzZSk7Ci0gIGFzc2VydChtbzQuX19pc3NldC5vcHQzID09IHRydWUpOwotICBhc3NlcnQobW80Ll9faXNzZXQuZGVmNCA9PSB0cnVlKTsKLSAgYXNzZXJ0KG1vNC5fX2lzc2V0Lm9wdDUgPT0gdHJ1ZSk7Ci0gIGFzc2VydChtbzQuX19pc3NldC5vcHQ2ID09IGZhbHNlKTsKLQotICBhc3NlcnQobW8xID09IG1vNCk7Ci0KLSAgbW8xLl9faXNzZXQub3B0MSA9IGZhbHNlOwotICBtbzEuX19pc3NldC5vcHQ1ID0gZmFsc2U7Ci0KLSAgbW8xLndyaXRlKHByb3RvLmdldCgpKTsKLSAgbW81LnJlYWQocHJvdG8uZ2V0KCkpOwotCi0gIGFzc2VydChtbzUuX19pc3NldC5vcHQxID09IGZhbHNlKTsKLSAgYXNzZXJ0KG1vNS5fX2lzc2V0Lm9wdDIgPT0gZmFsc2UpOwotICBhc3NlcnQobW81Ll9faXNzZXQub3B0MyA9PSB0cnVlKTsKLSAgYXNzZXJ0KG1vNS5fX2lzc2V0LmRlZjQgPT0gdHJ1ZSk7Ci0gIGFzc2VydChtbzUuX19pc3NldC5vcHQ1ID09IGZhbHNlKTsKLSAgYXNzZXJ0KG1vNS5fX2lzc2V0Lm9wdDYgPT0gZmFsc2UpOwotCi0gIGFzc2VydChtbzEgPT0gbW81KTsKLQotICBtbzEuX19pc3NldC5vcHQzID0gZmFsc2U7Ci0KLSAgbW8xLndyaXRlKHByb3RvLmdldCgpKTsKLSAgbW82LnJlYWQocHJvdG8uZ2V0KCkpOwotCi0gIGFzc2VydChtbzYuX19pc3NldC5vcHQxID09IGZhbHNlKTsKLSAgYXNzZXJ0KG1vNi5fX2lzc2V0Lm9wdDIgPT0gZmFsc2UpOwotICBhc3NlcnQobW82Ll9faXNzZXQub3B0MyA9PSBmYWxzZSk7Ci0gIGFzc2VydChtbzYuX19pc3NldC5kZWY0ID09IHRydWUpOwotICBhc3NlcnQobW82Ll9faXNzZXQub3B0NSA9PSBmYWxzZSk7Ci0gIGFzc2VydChtbzYuX19pc3NldC5vcHQ2ID09IGZhbHNlKTsKLQotICBhc3NlcnQobW8xID09IG1vNik7Ci0KLQotICAvLyBUZXN0IGZpbmdlcnByaW50IGNoZWNraW5nIHN0dWZmLgotCi0gIHsKLSAgICAvLyBEZWZhdWx0IGFuZCByZXF1aXJlZCBoYXZlIHRoZSBzYW1lIGZpbmdlcnByaW50LgotICAgIFRyaWNreTEgdDE7Ci0gICAgVHJpY2t5MyB0MzsKLSAgICBhc3NlcnQoc3RyaW5nKFRyaWNreTE6OmFzY2lpX2ZpbmdlcnByaW50KSA9PSBUcmlja3kzOjphc2NpaV9maW5nZXJwcmludCk7Ci0gICAgcHJvdG8tPnNldFR5cGVTcGVjKFRyaWNreTE6OmxvY2FsX3JlZmxlY3Rpb24pOwotICAgIHQxLmltX2RlZmF1bHQgPSAyMjc7Ci0gICAgdDEud3JpdGUocHJvdG8uZ2V0KCkpOwotICAgIHByb3RvLT5zZXRUeXBlU3BlYyhUcmlja3kzOjpsb2NhbF9yZWZsZWN0aW9uKTsKLSAgICB0My5yZWFkKHByb3RvLmdldCgpKTsKLSAgICBhc3NlcnQodDMuaW1fcmVxdWlyZWQgPT0gMjI3KTsKLSAgfQotCi0gIHsKLSAgICAvLyBPcHRpb25hbCBjaGFuZ2VzIHRoaW5ncy4KLSAgICBUcmlja3kxIHQxOwotICAgIFRyaWNreTIgdDI7Ci0gICAgYXNzZXJ0KHN0cmluZyhUcmlja3kxOjphc2NpaV9maW5nZXJwcmludCkgIT0gVHJpY2t5Mjo6YXNjaWlfZmluZ2VycHJpbnQpOwotICAgIHByb3RvLT5zZXRUeXBlU3BlYyhUcmlja3kxOjpsb2NhbF9yZWZsZWN0aW9uKTsKLSAgICB0MS5pbV9kZWZhdWx0ID0gMjI3OwotICAgIHQxLndyaXRlKHByb3RvLmdldCgpKTsKLSAgICB0cnkgewotICAgICAgcHJvdG8tPnNldFR5cGVTcGVjKFRyaWNreTI6OmxvY2FsX3JlZmxlY3Rpb24pOwotICAgICAgdDIucmVhZChwcm90by5nZXQoKSk7Ci0gICAgICBhc3NlcnQoZmFsc2UpOwotICAgIH0gY2F0Y2ggKFRQcm90b2NvbEV4Y2VwdGlvbiYgZXgpIHsKLSAgICAgIGJ1ZmZlci0+cmVzZXRCdWZmZXIoKTsKLSAgICB9Ci0gIH0KLQotICB7Ci0gICAgLy8gSG9seSBjb3cuICBXZSBjYW4gdXNlIHRoZSBUcmlja3kxIHR5cGVzcGVjIHdpdGggdGhlIFRyaWNreTIgc3RydWN0dXJlLgotICAgIFRyaWNreTEgdDE7Ci0gICAgVHJpY2t5MiB0MjsKLSAgICBwcm90by0+c2V0VHlwZVNwZWMoVHJpY2t5MTo6bG9jYWxfcmVmbGVjdGlvbik7Ci0gICAgdDEuaW1fZGVmYXVsdCA9IDIyNzsKLSAgICB0MS53cml0ZShwcm90by5nZXQoKSk7Ci0gICAgdDIucmVhZChwcm90by5nZXQoKSk7Ci0gICAgYXNzZXJ0KHQyLl9faXNzZXQuaW1fb3B0aW9uYWwgPT0gdHJ1ZSk7Ci0gICAgYXNzZXJ0KHQyLmltX29wdGlvbmFsID09IDIyNyk7Ci0gIH0KLQotICB7Ci0gICAgLy8gQW5kIHRvdGFsbHkgb2ZmIHRoZSB3YWxsLgotICAgIFRyaWNreTEgdDE7Ci0gICAgT25lT2ZFYWNoIG9vZTI7Ci0gICAgYXNzZXJ0KHN0cmluZyhUcmlja3kxOjphc2NpaV9maW5nZXJwcmludCkgIT0gT25lT2ZFYWNoOjphc2NpaV9maW5nZXJwcmludCk7Ci0gICAgcHJvdG8tPnNldFR5cGVTcGVjKFRyaWNreTE6OmxvY2FsX3JlZmxlY3Rpb24pOwotICAgIHQxLmltX2RlZmF1bHQgPSAyMjc7Ci0gICAgdDEud3JpdGUocHJvdG8uZ2V0KCkpOwotICAgIHRyeSB7Ci0gICAgICBwcm90by0+c2V0VHlwZVNwZWMoT25lT2ZFYWNoOjpsb2NhbF9yZWZsZWN0aW9uKTsKLSAgICAgIG9vZTIucmVhZChwcm90by5nZXQoKSk7Ci0gICAgICBhc3NlcnQoZmFsc2UpOwotICAgIH0gY2F0Y2ggKFRQcm90b2NvbEV4Y2VwdGlvbiYgZXgpIHsKLSAgICAgIGJ1ZmZlci0+cmVzZXRCdWZmZXIoKTsKLSAgICB9Ci0gIH0KLQotICAvLyBPa2F5LCB0aGlzIGlzIHJlYWxseSBvZmYgdGhlIHdhbGwuCi0gIC8vIEp1c3QgZG9uJ3QgY3Jhc2guCi0gIGNvdXQgPDwgIlN0YXJ0aW5nIGZ1enogdGVzdC4gIFRoaXMgdGFrZXMgYSB3aGlsZS4gICgyMCBkb3RzLikiIDw8IGVuZGw7Ci0gIHN0ZDo6c3JhbmQoMTIzNDUpOwotICBmb3IgKGludCBpID0gMDsgaSA8IDIwMDA7IGkrKykgewotICAgIGlmIChpICUgMTAwID09IDApIHsKLSAgICAgIGNvdXQgPDwgIi4iOwotICAgICAgY291dC5mbHVzaCgpOwotICAgIH0KLSAgICBidWZmZXItPnJlc2V0QnVmZmVyKCk7Ci0gICAgLy8gTWFrZSBzdXJlIHRoZSBmaW5nZXJwcmludCBwcmVmaXggaXMgcmlnaHQuCi0gICAgYnVmZmVyLT53cml0ZShOZXN0aW5nOjpiaW5hcnlfZmluZ2VycHJpbnQsIDQpOwotICAgIGZvciAoaW50IGogPSAwOyBqIDwgMTAyNCoxMDI0OyBqKyspIHsKLSAgICAgIHVpbnQ4X3QgciA9IHN0ZDo6cmFuZCgpOwotICAgICAgYnVmZmVyLT53cml0ZSgmciwgMSk7Ci0gICAgfQotICAgIE5lc3RpbmcgbjsKLSAgICBwcm90by0+c2V0VHlwZVNwZWMoT25lT2ZFYWNoOjpsb2NhbF9yZWZsZWN0aW9uKTsKLSAgICB0cnkgewotICAgICAgbi5yZWFkKHByb3RvLmdldCgpKTsKLSAgICB9IGNhdGNoIChUUHJvdG9jb2xFeGNlcHRpb24mIGV4KSB7Ci0gICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYgZXgpIHsKLSAgICB9Ci0gIH0KLSAgY291dCA8PCBlbmRsOwotCi0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L0VudW1UZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9FbnVtVGVzdC5jcHAKaW5kZXggNzJmOThiYi4uYzkzNWJjNCAxMDA2NDQKLS0tIGEvbGliL2NwcC90ZXN0L0VudW1UZXN0LmNwcAorKysgYi9saWIvY3BwL3Rlc3QvRW51bVRlc3QuY3BwCkBAIC0yMCw5ICsyMCwxNSBAQAogI2luY2x1ZGUgPGJvb3N0L3Rlc3QvdW5pdF90ZXN0LmhwcD4KICNpbmNsdWRlICJnZW4tY3BwL0VudW1UZXN0X3R5cGVzLmgiCiAKLUJPT1NUX0FVVE9fVEVTVF9TVUlURSggRW51bVRlc3QgKQorc3RkOjpvc3RyZWFtJiBvcGVyYXRvciA8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBNeUVudW1XaXRoQ3VzdG9tT3N0cmVhbTo6dHlwZSYgdmFsKQoreworICBvcyA8PCAieyIgPDwgKGludCl2YWwgPDwgIjpDVVNUT00hIiA8PCAifSI7CisgIHJldHVybiBvczsKK30KIAotQk9PU1RfQVVUT19URVNUX0NBU0UoIHRlc3RfZW51bSApIHsKK0JPT1NUX0FVVE9fVEVTVF9TVUlURShFbnVtVGVzdCkKKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9lbnVtX3ZhbHVlKSB7CiAgIC8vIENoZWNrIHRoYXQgYWxsIHRoZSBlbnVtIHZhbHVlcyBtYXRjaCB3aGF0IHdlIGV4cGVjdAogICBCT09TVF9DSEVDS19FUVVBTChNeUVudW0xOjpNRTFfMCwgMCk7CiAgIEJPT1NUX0NIRUNLX0VRVUFMKE15RW51bTE6Ok1FMV8xLCAxKTsKQEAgLTQ3LDkgKzUzLDM0IEBACiAgIEJPT1NUX0NIRUNLX0VRVUFMKE15RW51bTQ6Ok1FNF9BLCAweDdmZmZmZmZkKTsKICAgQk9PU1RfQ0hFQ0tfRVFVQUwoTXlFbnVtNDo6TUU0X0IsIDB4N2ZmZmZmZmUpOwogICBCT09TVF9DSEVDS19FUVVBTChNeUVudW00OjpNRTRfQywgMHg3ZmZmZmZmZik7CisKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoTXlFbnVtNTo6ZTEsIDApOworICBCT09TVF9DSEVDS19FUVVBTChNeUVudW01OjplMiwgNDIpOwogfQogCi1CT09TVF9BVVRPX1RFU1RfQ0FTRSggdGVzdF9lbnVtX2NvbnN0YW50ICkgewordGVtcGxhdGUgPGNsYXNzIF9UPgorc3RkOjpzdHJpbmcgRW51bVRvU3RyaW5nKF9UIGUpCit7CisgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICBzcyA8PCBlOworICByZXR1cm4gc3Muc3RyKCk7Cit9CisKKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9lbnVtX29zdHJlYW0pCit7CisgIEJPT1NUX0NIRUNLX0VRVUFMKEVudW1Ub1N0cmluZyhNeUVudW0xOjpNRTFfMCksICJNRTFfMCIpOworICBCT09TVF9DSEVDS19FUVVBTChFbnVtVG9TdHJpbmcoTXlFbnVtNTo6ZTIpLCAiZTIiKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoRW51bVRvU3RyaW5nKE15RW51bTM6Ok1FM19OMSksICJNRTNfTjEiKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoRW51bVRvU3RyaW5nKE15RW51bVdpdGhDdXN0b21Pc3RyZWFtOjpDdXN0b00yKSwgInsyOkNVU1RPTSF9Iik7CisKKyAgLy8gc29tZSBpbnZhbGlkIG9yIHVua25vd24gdmFsdWUKKyAgTXlFbnVtNTo6dHlwZSB1dXQgPSAoTXlFbnVtNTo6dHlwZSk0NDsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoRW51bVRvU3RyaW5nKHV1dCksICI0NCIpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2VudW1fY29uc3RhbnQpCit7CiAgIE15U3RydWN0IG1zOwogICBCT09TVF9DSEVDS19FUVVBTChtcy5tZTJfMiwgMik7CiAgIEJPT1NUX0NIRUNLX0VRVUFMKG1zLm1lM19uMiwgLTIpOwpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L0dlbmVyaWNIZWxwZXJzLmggYi9saWIvY3BwL3Rlc3QvR2VuZXJpY0hlbHBlcnMuaAppbmRleCAxODUzYTM3Li5iY2VmOWYyIDEwMDY0NAotLS0gYS9saWIvY3BwL3Rlc3QvR2VuZXJpY0hlbHBlcnMuaAorKysgYi9saWIvY3BwL3Rlc3QvR2VuZXJpY0hlbHBlcnMuaApAQCAtMjAsODMgKzIwLDg4IEBACiAjaWZuZGVmIF9USFJJRlRfVEVTVF9HRU5FUklDSEVMUEVSU19IXwogI2RlZmluZSBfVEhSSUZUX1RFU1RfR0VORVJJQ0hFTFBFUlNfSF8gMQogCi0jaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPgotI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmg+CisjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHRocmlmdC9UaHJpZnQuaD4KIAotdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7Ci11c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOwotCiAvKiBDbGFzc05hbWUgSGVscGVyIGZvciBjbGVhbmVyIGV4Y2VwdGlvbnMgKi8KIGNsYXNzIENsYXNzTmFtZXMgewotIHB1YmxpYzoKK3B1YmxpYzoKICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIHN0YXRpYyBjb25zdCBjaGFyKiBnZXROYW1lKCkgeyByZXR1cm4gIlVua25vd24gdHlwZSI7IH0KKyAgc3RhdGljIGNvbnN0IGNoYXIqIGdldE5hbWUoKSB7CisgICAgcmV0dXJuICJVbmtub3duIHR5cGUiOworICB9CiB9OwogCi10ZW1wbGF0ZSA8PiBjb25zdCBjaGFyKiBDbGFzc05hbWVzOjpnZXROYW1lPGludDhfdD4oKSB7IHJldHVybiAiYnl0ZSI7IH0KLXRlbXBsYXRlIDw+IGNvbnN0IGNoYXIqIENsYXNzTmFtZXM6OmdldE5hbWU8aW50MTZfdD4oKSB7IHJldHVybiAic2hvcnQiOyB9Ci10ZW1wbGF0ZSA8PiBjb25zdCBjaGFyKiBDbGFzc05hbWVzOjpnZXROYW1lPGludDMyX3Q+KCkgeyByZXR1cm4gImludCI7IH0KLXRlbXBsYXRlIDw+IGNvbnN0IGNoYXIqIENsYXNzTmFtZXM6OmdldE5hbWU8aW50NjRfdD4oKSB7IHJldHVybiAibG9uZyI7IH0KLXRlbXBsYXRlIDw+IGNvbnN0IGNoYXIqIENsYXNzTmFtZXM6OmdldE5hbWU8ZG91YmxlPigpIHsgcmV0dXJuICJkb3VibGUiOyB9Ci10ZW1wbGF0ZSA8PiBjb25zdCBjaGFyKiBDbGFzc05hbWVzOjpnZXROYW1lPHN0ZDo6c3RyaW5nPigpIHsgcmV0dXJuICJzdHJpbmciOyB9Cit0ZW1wbGF0ZSA8PgorY29uc3QgY2hhciogQ2xhc3NOYW1lczo6Z2V0TmFtZTxpbnQ4X3Q+KCkgeworICByZXR1cm4gImJ5dGUiOworfQordGVtcGxhdGUgPD4KK2NvbnN0IGNoYXIqIENsYXNzTmFtZXM6OmdldE5hbWU8aW50MTZfdD4oKSB7CisgIHJldHVybiAic2hvcnQiOworfQordGVtcGxhdGUgPD4KK2NvbnN0IGNoYXIqIENsYXNzTmFtZXM6OmdldE5hbWU8aW50MzJfdD4oKSB7CisgIHJldHVybiAiaW50IjsKK30KK3RlbXBsYXRlIDw+Citjb25zdCBjaGFyKiBDbGFzc05hbWVzOjpnZXROYW1lPGludDY0X3Q+KCkgeworICByZXR1cm4gImxvbmciOworfQordGVtcGxhdGUgPD4KK2NvbnN0IGNoYXIqIENsYXNzTmFtZXM6OmdldE5hbWU8ZG91YmxlPigpIHsKKyAgcmV0dXJuICJkb3VibGUiOworfQordGVtcGxhdGUgPD4KK2NvbnN0IGNoYXIqIENsYXNzTmFtZXM6OmdldE5hbWU8c3RkOjpzdHJpbmc+KCkgeworICByZXR1cm4gInN0cmluZyI7Cit9CiAKIC8qIEdlbmVyaWMgUHJvdG9jb2wgSS9PIGZ1bmN0aW9uIGZvciB0ZXN0cyAqLwogY2xhc3MgR2VuZXJpY0lPIHsKLSBwdWJsaWM6Ci0KK3B1YmxpYzoKICAgLyogV3JpdGUgZnVuY3Rpb25zICovCiAKLSAgc3RhdGljIHVpbnQzMl90IHdyaXRlKHNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90bywgY29uc3QgaW50OF90JiB2YWwpIHsKKyAgc3RhdGljIHVpbnQzMl90IHdyaXRlKHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gcHJvdG8sIGNvbnN0IGludDhfdCYgdmFsKSB7CiAgICAgcmV0dXJuIHByb3RvLT53cml0ZUJ5dGUodmFsKTsKICAgfQogCi0gIHN0YXRpYyB1aW50MzJfdCB3cml0ZShzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG8sIGNvbnN0IGludDE2X3QmIHZhbCkgeworICBzdGF0aWMgdWludDMyX3Qgd3JpdGUoc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBwcm90bywgY29uc3QgaW50MTZfdCYgdmFsKSB7CiAgICAgcmV0dXJuIHByb3RvLT53cml0ZUkxNih2YWwpOwogICB9CiAKLSAgc3RhdGljIHVpbnQzMl90IHdyaXRlKHNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90bywgY29uc3QgaW50MzJfdCYgdmFsKSB7CisgIHN0YXRpYyB1aW50MzJfdCB3cml0ZShzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IHByb3RvLCBjb25zdCBpbnQzMl90JiB2YWwpIHsKICAgICByZXR1cm4gcHJvdG8tPndyaXRlSTMyKHZhbCk7CiAgIH0KIAotICBzdGF0aWMgdWludDMyX3Qgd3JpdGUoc2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvLCBjb25zdCBkb3VibGUmIHZhbCkgeworICBzdGF0aWMgdWludDMyX3Qgd3JpdGUoc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBwcm90bywgY29uc3QgZG91YmxlJiB2YWwpIHsKICAgICByZXR1cm4gcHJvdG8tPndyaXRlRG91YmxlKHZhbCk7CiAgIH0KIAotICBzdGF0aWMgdWludDMyX3Qgd3JpdGUoc2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvLCBjb25zdCBpbnQ2NF90JiB2YWwpIHsKKyAgc3RhdGljIHVpbnQzMl90IHdyaXRlKHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gcHJvdG8sIGNvbnN0IGludDY0X3QmIHZhbCkgewogICAgIHJldHVybiBwcm90by0+d3JpdGVJNjQodmFsKTsKICAgfQogCi0gIHN0YXRpYyB1aW50MzJfdCB3cml0ZShzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG8sIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWwpIHsKKyAgc3RhdGljIHVpbnQzMl90IHdyaXRlKHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gcHJvdG8sIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWwpIHsKICAgICByZXR1cm4gcHJvdG8tPndyaXRlU3RyaW5nKHZhbCk7CiAgIH0KIAogICAvKiBSZWFkIGZ1bmN0aW9ucyAqLwogCi0gIHN0YXRpYyB1aW50MzJfdCByZWFkKHNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90bywgaW50OF90JiB2YWwpIHsKLSAgICByZXR1cm4gcHJvdG8tPnJlYWRCeXRlKHZhbCk7Ci0gIH0KKyAgc3RhdGljIHVpbnQzMl90IHJlYWQoc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBwcm90bywgaW50OF90JiB2YWwpIHsgcmV0dXJuIHByb3RvLT5yZWFkQnl0ZSh2YWwpOyB9CiAKLSAgc3RhdGljIHVpbnQzMl90IHJlYWQoc2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvLCBpbnQxNl90JiB2YWwpIHsKLSAgICByZXR1cm4gcHJvdG8tPnJlYWRJMTYodmFsKTsKLSAgfQorICBzdGF0aWMgdWludDMyX3QgcmVhZChzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IHByb3RvLCBpbnQxNl90JiB2YWwpIHsgcmV0dXJuIHByb3RvLT5yZWFkSTE2KHZhbCk7IH0KIAotICBzdGF0aWMgdWludDMyX3QgcmVhZChzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG8sIGludDMyX3QmIHZhbCkgewotICAgIHJldHVybiBwcm90by0+cmVhZEkzMih2YWwpOwotICB9CisgIHN0YXRpYyB1aW50MzJfdCByZWFkKHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gcHJvdG8sIGludDMyX3QmIHZhbCkgeyByZXR1cm4gcHJvdG8tPnJlYWRJMzIodmFsKTsgfQogCi0gIHN0YXRpYyB1aW50MzJfdCByZWFkKHNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90bywgaW50NjRfdCYgdmFsKSB7Ci0gICAgcmV0dXJuIHByb3RvLT5yZWFkSTY0KHZhbCk7Ci0gIH0KKyAgc3RhdGljIHVpbnQzMl90IHJlYWQoc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBwcm90bywgaW50NjRfdCYgdmFsKSB7IHJldHVybiBwcm90by0+cmVhZEk2NCh2YWwpOyB9CiAKLSAgc3RhdGljIHVpbnQzMl90IHJlYWQoc2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvLCBkb3VibGUmIHZhbCkgewotICAgIHJldHVybiBwcm90by0+cmVhZERvdWJsZSh2YWwpOwotICB9CisgIHN0YXRpYyB1aW50MzJfdCByZWFkKHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gcHJvdG8sIGRvdWJsZSYgdmFsKSB7IHJldHVybiBwcm90by0+cmVhZERvdWJsZSh2YWwpOyB9CiAKLSAgc3RhdGljIHVpbnQzMl90IHJlYWQoc2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvLCBzdGQ6OnN0cmluZyYgdmFsKSB7CisgIHN0YXRpYyB1aW50MzJfdCByZWFkKHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gcHJvdG8sIHN0ZDo6c3RyaW5nJiB2YWwpIHsKICAgICByZXR1cm4gcHJvdG8tPnJlYWRTdHJpbmcodmFsKTsKICAgfQotCiB9OwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9KU09OUHJvdG9UZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9KU09OUHJvdG9UZXN0LmNwcAppbmRleCBhMzI1OWMwLi5jMmFkNzNlIDEwMDY0NAotLS0gYS9saWIvY3BwL3Rlc3QvSlNPTlByb3RvVGVzdC5jcHAKKysrIGIvbGliL2NwcC90ZXN0L0pTT05Qcm90b1Rlc3QuY3BwCkBAIC0xOCwxMjggKzE4LDIyNiBAQAogICovCiAKICNkZWZpbmUgX1VTRV9NQVRIX0RFRklORVMKLSNpbmNsdWRlIDxpb3N0cmVhbT4KICNpbmNsdWRlIDxjbWF0aD4KLSNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+CisjaW5jbHVkZSA8aW9tYW5pcD4KKyNpbmNsdWRlIDxzc3RyZWFtPgogI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9USlNPTlByb3RvY29sLmg+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KICNpbmNsdWRlICJnZW4tY3BwL0RlYnVnUHJvdG9UZXN0X3R5cGVzLmgiCiAKLWludCBtYWluKCkgewotICB1c2luZyBzdGQ6OmNvdXQ7Ci0gIHVzaW5nIHN0ZDo6ZW5kbDsKLSAgdXNpbmcgbmFtZXNwYWNlIHRocmlmdDo6dGVzdDo6ZGVidWc7Ci0gIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXI7Ci0gIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VEpTT05Qcm90b2NvbDsKKyNkZWZpbmUgQk9PU1RfVEVTVF9NT0RVTEUgSlNPTlByb3RvVGVzdAorI2luY2x1ZGUgPGJvb3N0L3Rlc3QvdW5pdF90ZXN0LmhwcD4KIAotICBPbmVPZkVhY2ggb29lOwotICBvb2UuaW1fdHJ1ZSAgID0gdHJ1ZTsKLSAgb29lLmltX2ZhbHNlICA9IGZhbHNlOwotICBvb2UuYV9iaXRlICAgID0gMHg3ZjsKLSAgb29lLmludGVnZXIxNiA9IDI3MDAwOwotICBvb2UuaW50ZWdlcjMyID0gMTw8MjQ7Ci0gIG9vZS5pbnRlZ2VyNjQgPSAodWludDY0X3QpNjAwMCAqIDEwMDAgKiAxMDAwOwotICBvb2UuZG91YmxlX3ByZWNpc2lvbiA9IE1fUEk7Ci0gIG9vZS5zb21lX2NoYXJhY3RlcnMgID0gIkpTT04gVEhJUyEgXCJcMSI7Ci0gIG9vZS56b21nX3VuaWNvZGUgICAgID0gIlx4ZDdcblxhXHQiOwotICBvb2UuYmFzZTY0ID0gIlwxXDJcM1wyNTUiOwotICBjb3V0IDw8IGFwYWNoZTo6dGhyaWZ0OjpUaHJpZnRKU09OU3RyaW5nKG9vZSkgPDwgZW5kbCA8PCBlbmRsOwordXNpbmcgbmFtZXNwYWNlIHRocmlmdDo6dGVzdDo6ZGVidWc7Cit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUSlNPTlByb3RvY29sOwogCitzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPE9uZU9mRWFjaD4gb29lOwogCi0gIE5lc3RpbmcgbjsKLSAgbi5teV9vb2UgPSBvb2U7Ci0gIG4ubXlfb29lLmludGVnZXIxNiA9IDE2OwotICBuLm15X29vZS5pbnRlZ2VyMzIgPSAzMjsKLSAgbi5teV9vb2UuaW50ZWdlcjY0ID0gNjQ7Ci0gIG4ubXlfb29lLmRvdWJsZV9wcmVjaXNpb24gPSAoc3RkOjpzcXJ0KDUuMCkrMSkvMjsKLSAgbi5teV9vb2Uuc29tZV9jaGFyYWN0ZXJzICA9ICI6UiAobWUgZ29pbmcgXCJycnJyXCIpIjsKLSAgbi5teV9vb2Uuem9tZ191bmljb2RlICAgICA9ICJceGQzXHg4MFx4ZTJceDg1XHhhZVx4Y2VceDlkXHgyMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJceGQwXHg5ZFx4Y2VceGJmXHhlMlx4ODVceGJmXHhkMFx4YmVceGM5XHhhMVx4ZDBceGIzXHhkMFx4YjBceGNmXHg4MVx4ZTJceDg0XHg4ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJceDIwXHhjZVx4OTFceDc0XHg3NFx4Y2VceGIxXHhlMlx4ODVceGJkXHhjZVx4YmFceGM3XHg4M1x4ZTJceDgwXHhiYyI7Ci0gIG4ubXlfYm9uay50eXBlICAgID0gMzEzMzc7Ci0gIG4ubXlfYm9uay5tZXNzYWdlID0gIkkgYW0gYSBib25rLi4uIHhvciEiOwordm9pZCB0ZXN0Q2FzZVNldHVwXzEoKSB7CisgIG9vZS5yZXNldChuZXcgT25lT2ZFYWNoKTsKKyAgb29lLT5pbV90cnVlID0gdHJ1ZTsKKyAgb29lLT5pbV9mYWxzZSA9IGZhbHNlOworICBvb2UtPmFfYml0ZSA9IDB4N2Y7CisgIG9vZS0+aW50ZWdlcjE2ID0gMjcwMDA7CisgIG9vZS0+aW50ZWdlcjMyID0gMSA8PCAyNDsKKyAgb29lLT5pbnRlZ2VyNjQgPSAodWludDY0X3QpNjAwMCAqIDEwMDAgKiAxMDAwOworICBvb2UtPmRvdWJsZV9wcmVjaXNpb24gPSBNX1BJOworICBvb2UtPnNvbWVfY2hhcmFjdGVycyA9ICJKU09OIFRISVMhIFwiXDEiOworICBvb2UtPnpvbWdfdW5pY29kZSA9ICJceGQ3XG5cYVx0IjsKKyAgb29lLT5iYXNlNjQgPSAiXDFcMlwzXDI1NSI7Cit9CiAKLSAgY291dCA8PCBhcGFjaGU6OnRocmlmdDo6VGhyaWZ0SlNPTlN0cmluZyhuKSA8PCBlbmRsIDw8IGVuZGw7CitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2pzb25fcHJvdG9fMSkgeworICB0ZXN0Q2FzZVNldHVwXzEoKTsKIAorICBjb25zdCBzdGQ6OnN0cmluZyBleHBlY3RlZF9yZXN1bHQoCisgICJ7XCIxXCI6e1widGZcIjoxfSxcIjJcIjp7XCJ0ZlwiOjB9LFwiM1wiOntcImk4XCI6MTI3fSxcIjRcIjp7XCJpMTZcIjoyNzAwMH0sIgorICAiXCI1XCI6e1wiaTMyXCI6MTY3NzcyMTZ9LFwiNlwiOntcImk2NFwiOjYwMDAwMDAwMDB9LFwiN1wiOntcImRibFwiOjMuMTQxNTkyNiIKKyAgIjUzNTg5NzkzMX0sXCI4XCI6e1wic3RyXCI6XCJKU09OIFRISVMhIFxcXCJcXHUwMDAxXCJ9LFwiOVwiOntcInN0clwiOlwiXHhkN1xcIgorICAiblxcdTAwMDdcXHRcIn0sXCIxMFwiOntcInRmXCI6MH0sXCIxMVwiOntcInN0clwiOlwiQVFJRHJRXCJ9LFwiMTJcIjp7XCJsc3RcIiIKKyAgIjpbXCJpOFwiLDMsMSwyLDNdfSxcIjEzXCI6e1wibHN0XCI6W1wiaTE2XCIsMywxLDIsM119LFwiMTRcIjp7XCJsc3RcIjpbXCJpNjQiCisgICJcIiwzLDEsMiwzXX19Iik7CiAKLSAgSG9seU1vbGV5IGhtOworICBjb25zdCBzdGQ6OnN0cmluZyByZXN1bHQoYXBhY2hlOjp0aHJpZnQ6OlRocmlmdEpTT05TdHJpbmcoKm9vZSkpOwogCi0gIGhtLmJpZy5wdXNoX2JhY2sob29lKTsKLSAgaG0uYmlnLnB1c2hfYmFjayhuLm15X29vZSk7Ci0gIGhtLmJpZ1swXS5hX2JpdGUgPSAweDIyOwotICBobS5iaWdbMV0uYV9iaXRlID0gMHgzMzsKKyAgQk9PU1RfQ0hFQ0tfTUVTU0FHRSghZXhwZWN0ZWRfcmVzdWx0LmNvbXBhcmUocmVzdWx0KSwKKyAgICAiRXhwZWN0ZWQ6XG4iIDw8IGV4cGVjdGVkX3Jlc3VsdCA8PCAiXG5Hb3R0ZW46XG4iIDw8IHJlc3VsdCk7Cit9CisKK3N0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8TmVzdGluZz4gbjsKKwordm9pZCB0ZXN0Q2FzZVNldHVwXzIoKSB7CisgIHRlc3RDYXNlU2V0dXBfMSgpOworCisgIG4ucmVzZXQobmV3IE5lc3RpbmcpOworICBuLT5teV9vb2UgPSAqb29lOworICBuLT5teV9vb2UuaW50ZWdlcjE2ID0gMTY7CisgIG4tPm15X29vZS5pbnRlZ2VyMzIgPSAzMjsKKyAgbi0+bXlfb29lLmludGVnZXI2NCA9IDY0OworICBuLT5teV9vb2UuZG91YmxlX3ByZWNpc2lvbiA9IChzdGQ6OnNxcnQoNS4wKSArIDEpIC8gMjsKKyAgbi0+bXlfb29lLnNvbWVfY2hhcmFjdGVycyA9ICI6UiAobWUgZ29pbmcgXCJycnJyXCIpIjsKKyAgbi0+bXlfb29lLnpvbWdfdW5pY29kZSAgICAgPSAiXHhkM1x4ODBceGUyXHg4NVx4YWVceGNlXHg5ZFx4MjBceGQwXHg5ZFx4Y2UiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4YmZceGUyXHg4NVx4YmZceGQwXHhiZVx4YzlceGExXHhkMFx4YjNceGQwIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJceGIwXHhjZlx4ODFceGUyXHg4NFx4OGVceDIwXHhjZVx4OTFceDc0XHg3NCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHhjZVx4YjFceGUyXHg4NVx4YmRceGNlXHhiYVx4YzdceDgzXHhlMlx4ODAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4YmMiOworICBuLT5teV9ib25rLnR5cGUgPSAzMTMzNzsKKyAgbi0+bXlfYm9uay5tZXNzYWdlID0gIkkgYW0gYSBib25rLi4uIHhvciEiOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2pzb25fcHJvdG9fMikgeworICB0ZXN0Q2FzZVNldHVwXzIoKTsKKworICBjb25zdCBzdGQ6OnN0cmluZyBleHBlY3RlZF9yZXN1bHQoCisgICAgIntcIjFcIjp7XCJyZWNcIjp7XCIxXCI6e1wiaTMyXCI6MzEzMzd9LFwiMlwiOntcInN0clwiOlwiSSBhbSBhIGJvbmsuLi4geG9yIgorICAgICIhXCJ9fX0sXCIyXCI6e1wicmVjXCI6e1wiMVwiOntcInRmXCI6MX0sXCIyXCI6e1widGZcIjowfSxcIjNcIjp7XCJpOFwiOjEyNyIKKyAgICAifSxcIjRcIjp7XCJpMTZcIjoxNn0sXCI1XCI6e1wiaTMyXCI6MzJ9LFwiNlwiOntcImk2NFwiOjY0fSxcIjdcIjp7XCJkYmxcIjoiCisgICAgIjEuNjE4MDMzOTg4NzQ5ODk0OX0sXCI4XCI6e1wic3RyXCI6XCI6UiAobWUgZ29pbmcgXFxcInJycnJcXFwiKVwifSxcIjlcIjp7IgorICAgICJcInN0clwiOlwi04Diha7OnSDQnc6/4oW/0L7JodCz0LDPgeKEjiDOkXR0zrHihb3OuseD4oC8XCJ9LFwiMTBcIjp7XCJ0ZlwiOjB9LFwiMTFcIjp7XCJzdHJcIjpcIiIKKyAgICAiQVFJRHJRXCJ9LFwiMTJcIjp7XCJsc3RcIjpbXCJpOFwiLDMsMSwyLDNdfSxcIjEzXCI6e1wibHN0XCI6W1wiaTE2XCIsMywxLDIiCisgICAgIiwzXX0sXCIxNFwiOntcImxzdFwiOltcImk2NFwiLDMsMSwyLDNdfX19fSIKKyAgKTsKKworICBjb25zdCBzdGQ6OnN0cmluZyByZXN1bHQoYXBhY2hlOjp0aHJpZnQ6OlRocmlmdEpTT05TdHJpbmcoKm4pKTsKKworICBCT09TVF9DSEVDS19NRVNTQUdFKCFleHBlY3RlZF9yZXN1bHQuY29tcGFyZShyZXN1bHQpLAorICAgICJFeHBlY3RlZDpcbiIgPDwgZXhwZWN0ZWRfcmVzdWx0IDw8ICJcbkdvdHRlbjpcbiIgPDwgcmVzdWx0KTsKK30KKworc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxIb2x5TW9sZXk+IGhtOworCit2b2lkIHRlc3RDYXNlU2V0dXBfMygpIHsKKyAgdGVzdENhc2VTZXR1cF8yKCk7CisKKyAgaG0ucmVzZXQobmV3IEhvbHlNb2xleSk7CisKKyAgaG0tPmJpZy5wdXNoX2JhY2soKm9vZSk7CisgIGhtLT5iaWcucHVzaF9iYWNrKG4tPm15X29vZSk7CisgIGhtLT5iaWdbMF0uYV9iaXRlID0gMHgyMjsKKyAgaG0tPmJpZ1sxXS5hX2JpdGUgPSAweDMzOwogCiAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBzdGFnZTE7CiAgIHN0YWdlMS5wdXNoX2JhY2soImFuZCBhIG9uZSIpOwogICBzdGFnZTEucHVzaF9iYWNrKCJhbmQgYSB0d28iKTsKLSAgaG0uY29udGFpbi5pbnNlcnQoc3RhZ2UxKTsKKyAgaG0tPmNvbnRhaW4uaW5zZXJ0KHN0YWdlMSk7CiAgIHN0YWdlMS5jbGVhcigpOwogICBzdGFnZTEucHVzaF9iYWNrKCJ0aGVuIGEgb25lLCB0d28iKTsKICAgc3RhZ2UxLnB1c2hfYmFjaygidGhyZWUhIik7CiAgIHN0YWdlMS5wdXNoX2JhY2soIkZPVVIhISIpOwotICBobS5jb250YWluLmluc2VydChzdGFnZTEpOworICBobS0+Y29udGFpbi5pbnNlcnQoc3RhZ2UxKTsKICAgc3RhZ2UxLmNsZWFyKCk7Ci0gIGhtLmNvbnRhaW4uaW5zZXJ0KHN0YWdlMSk7CisgIGhtLT5jb250YWluLmluc2VydChzdGFnZTEpOwogCiAgIHN0ZDo6dmVjdG9yPEJvbms+IHN0YWdlMjsKLSAgaG0uYm9ua3NbIm5vdGhpbmciXSA9IHN0YWdlMjsKLSAgc3RhZ2UyLnJlc2l6ZShzdGFnZTIuc2l6ZSgpKzEpOworICBobS0+Ym9ua3NbIm5vdGhpbmciXSA9IHN0YWdlMjsKKyAgc3RhZ2UyLnJlc2l6ZShzdGFnZTIuc2l6ZSgpICsgMSk7CiAgIHN0YWdlMi5iYWNrKCkudHlwZSA9IDE7CiAgIHN0YWdlMi5iYWNrKCkubWVzc2FnZSA9ICJXYWl0LiI7Ci0gIHN0YWdlMi5yZXNpemUoc3RhZ2UyLnNpemUoKSsxKTsKKyAgc3RhZ2UyLnJlc2l6ZShzdGFnZTIuc2l6ZSgpICsgMSk7CiAgIHN0YWdlMi5iYWNrKCkudHlwZSA9IDI7CiAgIHN0YWdlMi5iYWNrKCkubWVzc2FnZSA9ICJXaGF0PyI7Ci0gIGhtLmJvbmtzWyJzb21ldGhpbmciXSA9IHN0YWdlMjsKKyAgaG0tPmJvbmtzWyJzb21ldGhpbmciXSA9IHN0YWdlMjsKICAgc3RhZ2UyLmNsZWFyKCk7Ci0gIHN0YWdlMi5yZXNpemUoc3RhZ2UyLnNpemUoKSsxKTsKKyAgc3RhZ2UyLnJlc2l6ZShzdGFnZTIuc2l6ZSgpICsgMSk7CiAgIHN0YWdlMi5iYWNrKCkudHlwZSA9IDM7CiAgIHN0YWdlMi5iYWNrKCkubWVzc2FnZSA9ICJxdW90aCI7Ci0gIHN0YWdlMi5yZXNpemUoc3RhZ2UyLnNpemUoKSsxKTsKKyAgc3RhZ2UyLnJlc2l6ZShzdGFnZTIuc2l6ZSgpICsgMSk7CiAgIHN0YWdlMi5iYWNrKCkudHlwZSA9IDQ7CiAgIHN0YWdlMi5iYWNrKCkubWVzc2FnZSA9ICJ0aGUgcmF2ZW4iOwotICBzdGFnZTIucmVzaXplKHN0YWdlMi5zaXplKCkrMSk7CisgIHN0YWdlMi5yZXNpemUoc3RhZ2UyLnNpemUoKSArIDEpOwogICBzdGFnZTIuYmFjaygpLnR5cGUgPSA1OwogICBzdGFnZTIuYmFjaygpLm1lc3NhZ2UgPSAibmV2ZXJtb3JlIjsKLSAgaG0uYm9ua3NbInBvZSJdID0gc3RhZ2UyOworICBobS0+Ym9ua3NbInBvZSJdID0gc3RhZ2UyOworfQogCi0gIGNvdXQgPDwgYXBhY2hlOjp0aHJpZnQ6OlRocmlmdEpTT05TdHJpbmcoaG0pIDw8IGVuZGwgPDwgZW5kbDsKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfanNvbl9wcm90b18zKSB7CisgIHRlc3RDYXNlU2V0dXBfMygpOwogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZmZlcihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VEpTT05Qcm90b2NvbD4gcHJvdG8obmV3IFRKU09OUHJvdG9jb2woYnVmZmVyKSk7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCgKKyAgIntcIjFcIjp7XCJsc3RcIjpbXCJyZWNcIiwyLHtcIjFcIjp7XCJ0ZlwiOjF9LFwiMlwiOntcInRmXCI6MH0sXCIzXCI6e1wiaThcIjoiCisgICIzNH0sXCI0XCI6e1wiaTE2XCI6MjcwMDB9LFwiNVwiOntcImkzMlwiOjE2Nzc3MjE2fSxcIjZcIjp7XCJpNjRcIjo2MDAwMDAwMDAwIgorICAifSxcIjdcIjp7XCJkYmxcIjozLjE0MTU5MjY1MzU4OTc5MzF9LFwiOFwiOntcInN0clwiOlwiSlNPTiBUSElTISBcXFwiXFx1MDAwMSIKKyAgIlwifSxcIjlcIjp7XCJzdHJcIjpcIlx4ZDdcXG5cXHUwMDA3XFx0XCJ9LFwiMTBcIjp7XCJ0ZlwiOjB9LFwiMTFcIjp7XCJzdHJcIjoiCisgICJcIkFRSURyUVwifSxcIjEyXCI6e1wibHN0XCI6W1wiaThcIiwzLDEsMiwzXX0sXCIxM1wiOntcImxzdFwiOltcImkxNlwiLDMsMSwyIgorICAiLDNdfSxcIjE0XCI6e1wibHN0XCI6W1wiaTY0XCIsMywxLDIsM119fSx7XCIxXCI6e1widGZcIjoxfSxcIjJcIjp7XCJ0ZlwiOjB9LCIKKyAgIlwiM1wiOntcImk4XCI6NTF9LFwiNFwiOntcImkxNlwiOjE2fSxcIjVcIjp7XCJpMzJcIjozMn0sXCI2XCI6e1wiaTY0XCI6NjR9LCIKKyAgIlwiN1wiOntcImRibFwiOjEuNjE4MDMzOTg4NzQ5ODk0OX0sXCI4XCI6e1wic3RyXCI6XCI6UiAobWUgZ29pbmcgXFxcInJycnJcXFwiIgorICAiKVwifSxcIjlcIjp7XCJzdHJcIjpcItOA4oWuzp0g0J3Ov+KFv9C+yaHQs9Cwz4HihI4gzpF0dM6x4oW9zrrHg+KAvFwifSxcIjEwXCI6e1widGZcIjowfSxcIjExXCI6eyIKKyAgIlwic3RyXCI6XCJBUUlEclFcIn0sXCIxMlwiOntcImxzdFwiOltcImk4XCIsMywxLDIsM119LFwiMTNcIjp7XCJsc3RcIjpbXCJpMTYiCisgICJcIiwzLDEsMiwzXX0sXCIxNFwiOntcImxzdFwiOltcImk2NFwiLDMsMSwyLDNdfX1dfSxcIjJcIjp7XCJzZXRcIjpbXCJsc3RcIiwzIgorICAiLFtcInN0clwiLDBdLFtcInN0clwiLDIsXCJhbmQgYSBvbmVcIixcImFuZCBhIHR3b1wiXSxbXCJzdHJcIiwzLFwidGhlbiBhIG9uZSIKKyAgIiwgdHdvXCIsXCJ0aHJlZSFcIixcIkZPVVIhIVwiXV19LFwiM1wiOntcIm1hcFwiOltcInN0clwiLFwibHN0XCIsMyx7XCJub3RoaW4iCisgICJnXCI6W1wicmVjXCIsMF0sXCJwb2VcIjpbXCJyZWNcIiwzLHtcIjFcIjp7XCJpMzJcIjozfSxcIjJcIjp7XCJzdHJcIjpcInF1b3RoIgorICAiXCJ9fSx7XCIxXCI6e1wiaTMyXCI6NH0sXCIyXCI6e1wic3RyXCI6XCJ0aGUgcmF2ZW5cIn19LHtcIjFcIjp7XCJpMzJcIjo1fSxcIiIKKyAgIjJcIjp7XCJzdHJcIjpcIm5ldmVybW9yZVwifX1dLFwic29tZXRoaW5nXCI6W1wicmVjXCIsMix7XCIxXCI6e1wiaTMyXCI6MX0sXCIiCisgICIyXCI6e1wic3RyXCI6XCJXYWl0LlwifX0se1wiMVwiOntcImkzMlwiOjJ9LFwiMlwiOntcInN0clwiOlwiV2hhdD9cIn19XX1dfX0iCisgICk7CiAKKyAgY29uc3Qgc3RkOjpzdHJpbmcgcmVzdWx0KGFwYWNoZTo6dGhyaWZ0OjpUaHJpZnRKU09OU3RyaW5nKCpobSkpOwogCi0gIGNvdXQgPDwgIlRlc3Rpbmcgb29lIiA8PCBlbmRsOworICBCT09TVF9DSEVDS19NRVNTQUdFKCFleHBlY3RlZF9yZXN1bHQuY29tcGFyZShyZXN1bHQpLAorICAgICJFeHBlY3RlZDpcbiIgPDwgZXhwZWN0ZWRfcmVzdWx0IDw8ICJcbkdvdHRlbjpcbiIgPDwgcmVzdWx0KTsKK30KIAotICBvb2Uud3JpdGUocHJvdG8uZ2V0KCkpOworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9qc29uX3Byb3RvXzQpIHsKKyAgdGVzdENhc2VTZXR1cF8xKCk7CisKKyAgc3RkOjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZmZlcihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRKU09OUHJvdG9jb2w+IHByb3RvKG5ldyBUSlNPTlByb3RvY29sKGJ1ZmZlcikpOworCisgIG9vZS0+d3JpdGUocHJvdG8uZ2V0KCkpOwogICBPbmVPZkVhY2ggb29lMjsKICAgb29lMi5yZWFkKHByb3RvLmdldCgpKTsKIAotICBhc3NlcnQob29lID09IG9vZTIpOworICBCT09TVF9DSEVDSygqb29lID09IG9vZTIpOworfQogCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2pzb25fcHJvdG9fNSkgeworICB0ZXN0Q2FzZVNldHVwXzMoKTsKIAotICBjb3V0IDw8ICJUZXN0aW5nIGhtIiA8PCBlbmRsOworICBzdGQ6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmZmVyKG5ldyBUTWVtb3J5QnVmZmVyKCkpOworICBzdGQ6OnNoYXJlZF9wdHI8VEpTT05Qcm90b2NvbD4gcHJvdG8obmV3IFRKU09OUHJvdG9jb2woYnVmZmVyKSk7CiAKLSAgaG0ud3JpdGUocHJvdG8uZ2V0KCkpOworICBobS0+d3JpdGUocHJvdG8uZ2V0KCkpOwogICBIb2x5TW9sZXkgaG0yOwogICBobTIucmVhZChwcm90by5nZXQoKSk7CiAKLSAgYXNzZXJ0KGhtID09IGhtMik7CisgIEJPT1NUX0NIRUNLKCpobSA9PSBobTIpOwogCiAgIGhtMi5iaWdbMF0uYV9iaXRlID0gMHgwMDsKIAotICBhc3NlcnQoaG0gIT0gaG0yKTsKKyAgQk9PU1RfQ0hFQ0soKmhtICE9IGhtMik7Cit9CiAKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfanNvbl9wcm90b182KSB7CiAgIERvdWJsZXMgZHViOwotICBkdWIubmFuID0gSFVHRV9WQUwvSFVHRV9WQUw7CisgIGR1Yi5uYW4gPSBIVUdFX1ZBTCAvIEhVR0VfVkFMOwogICBkdWIuaW5mID0gSFVHRV9WQUw7CiAgIGR1Yi5uZWdpbmYgPSAtSFVHRV9WQUw7Ci0gIGR1Yi5yZXBlYXRpbmcgPSAxMC4wLzMuMDsKKyAgZHViLnJlcGVhdGluZyA9IDEwLjAgLyAzLjA7CiAgIGR1Yi5iaWcgPSAxRSszMDU7CiAgIGR1Yi50aW55ID0gMUUtMzA1OwogICBkdWIuemVybyA9IDAuMDsKICAgZHViLm5lZ3plcm8gPSAtMC4wOwotICBjb3V0IDw8IGFwYWNoZTo6dGhyaWZ0OjpUaHJpZnRKU09OU3RyaW5nKGR1YikgPDwgZW5kbCA8PCBlbmRsOwogCi0gIGNvdXQgPDwgIlRlc3RpbmcgYmFzZSIgPDwgZW5kbDsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0KAorICAie1wiMVwiOntcImRibFwiOlwiTmFOXCJ9LFwiMlwiOntcImRibFwiOlwiSW5maW5pdHlcIn0sXCIzXCI6e1wiZGJsXCI6XCItSW5maSIKKyAgIm5pdHlcIn0sXCI0XCI6e1wiZGJsXCI6My4zMzMzMzMzMzMzMzMzMzM1fSxcIjVcIjp7XCJkYmxcIjo5Ljk5OTk5OTk5OTk5OTk5OTRlKyIKKyAgIjMwNH0sXCI2XCI6e1wiZGJsXCI6MWUtMzA1fSxcIjdcIjp7XCJkYmxcIjowfSxcIjhcIjp7XCJkYmxcIjotMH19IgorICApOworCisgIGNvbnN0IHN0ZDo6c3RyaW5nIHJlc3VsdChhcGFjaGU6OnRocmlmdDo6VGhyaWZ0SlNPTlN0cmluZyhkdWIpKTsKKworICBCT09TVF9DSEVDS19NRVNTQUdFKCFleHBlY3RlZF9yZXN1bHQuY29tcGFyZShyZXN1bHQpLAorICAgICJFeHBlY3RlZDpcbiIgPDwgZXhwZWN0ZWRfcmVzdWx0IDw8ICJcbkdvdHRlbjpcbiIgPDwgcmVzdWx0KTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9qc29uX3Byb3RvXzcpIHsKKyAgc3RkOjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZmZlcihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRKU09OUHJvdG9jb2w+IHByb3RvKG5ldyBUSlNPTlByb3RvY29sKGJ1ZmZlcikpOwogCiAgIEJhc2U2NCBiYXNlOwogICBiYXNlLmEgPSAxMjM7CkBAIC0xNTQsNyArMjUyLDkyIEBACiAgIEJhc2U2NCBiYXNlMjsKICAgYmFzZTIucmVhZChwcm90by5nZXQoKSk7CiAKLSAgYXNzZXJ0KGJhc2UgPT0gYmFzZTIpOworICBCT09TVF9DSEVDSyhiYXNlID09IGJhc2UyKTsKK30KIAotICByZXR1cm4gMDsKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfanNvbl9wcm90b184KSB7CisgIGNvbnN0IGNoYXIqIGpzb25fc3RyaW5nID0KKyAgIntcIjFcIjp7XCJ0ZlwiOjF9LFwiMlwiOntcInRmXCI6MH0sXCIzXCI6e1wiaThcIjoxMjd9LFwiNFwiOntcImkxNlwiOjI3MDAwfSwiCisgICJcIjVcIjp7XCJpMzJcIjoxNi43NzIxNn0sXCI2XCI6e1wiaTY0XCI6NjAwMDAwMDAwMH0sXCI3XCI6e1wiZGJsXCI6My4xNDE1OTI2IgorICAiNTM1ODk3OTMxfSxcIjhcIjp7XCJzdHJcIjpcIkpTT04gVEhJUyEgXFxcIlxcdTAwMDFcIn0sXCI5XCI6e1wic3RyXCI6XCJceGQ3XFwiCisgICJuXFx1MDAwN1xcdFwifSxcIjEwXCI6e1widGZcIjowfSxcIjExXCI6e1wic3RyXCI6XCJBUUlEclFcIn0sXCIxMlwiOntcImxzdFwiIgorICAiOltcImk4XCIsMywxLDIsM119LFwiMTNcIjp7XCJsc3RcIjpbXCJpMTZcIiwzLDEsMiwzXX0sXCIxNFwiOntcImxzdFwiOltcImk2NCIKKyAgIlwiLDMsMSwyLDNdfX0iOworCisgIGNvbnN0IHN0ZDo6c2l6ZV90IGJ1ZlNpeiA9IHN0cmxlbihqc29uX3N0cmluZykgKiBzaXplb2YoY2hhcik7CisgIHN0ZDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWZmZXIobmV3IFRNZW1vcnlCdWZmZXIoCisgICAgKHVpbnQ4X3QqKShqc29uX3N0cmluZyksIHN0YXRpY19jYXN0PHVpbnQzMl90PihidWZTaXopKSk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUSlNPTlByb3RvY29sPiBwcm90byhuZXcgVEpTT05Qcm90b2NvbChidWZmZXIpKTsKKworICBPbmVPZkVhY2ggb29lMjsKKworICBCT09TVF9DSEVDS19USFJPVyhvb2UyLnJlYWQocHJvdG8uZ2V0KCkpLAorICAgIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRXhjZXB0aW9uKTsKK30KKworc3RhdGljIHN0ZDo6c3RyaW5nIHRvSGV4U2VxdWVuY2UoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgeworICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgc3MgPDwgc3RkOjpoZXggPDwgc3RkOjpzZXRmaWxsKCcwJyk7CisgIGZvciAoc3RkOjpzaXplX3QgaSA9IDA7IGkgPCBzdHIuc2l6ZSgpOyBpKyspIHsKKyAgICBzcyA8PCAiXFx4IiA8PCBpbnQodWludDhfdChzdHJbaV0pKTsKKyAgfQorICByZXR1cm4gc3Muc3RyKCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfanNvbl91bmljb2RlX2VzY2FwZWQpIHsKKyAgY29uc3QgY2hhciBqc29uX3N0cmluZ1tdID0KKyAgIntcIjFcIjp7XCJ0ZlwiOjF9LFwiMlwiOntcInRmXCI6MH0sXCIzXCI6e1wiaThcIjoxMjd9LFwiNFwiOntcImkxNlwiOjI3MDAwfSwiCisgICJcIjVcIjp7XCJpMzJcIjoxNn0sXCI2XCI6e1wiaTY0XCI6NjAwMDAwMDAwMH0sXCI3XCI6e1wiZGJsXCI6My4xNDE1OTI2IgorICAiNTM1ODk3OTMxfSxcIjhcIjp7XCJzdHJcIjpcIkpTT04gVEhJUyFcIn0sXCI5XCI6e1wic3RyXCI6XCJcXHUwZTAxIFxcdWQ4MzVcXHVkZDNlXCJ9LCIKKyAgIlwiMTBcIjp7XCJ0ZlwiOjB9LFwiMTFcIjp7XCJzdHJcIjpcIjAwMDAwMFwifSxcIjEyXCI6e1wibHN0XCIiCisgICI6W1wiaThcIiwzLDEsMiwzXX0sXCIxM1wiOntcImxzdFwiOltcImkxNlwiLDMsMSwyLDNdfSxcIjE0XCI6e1wibHN0XCI6W1wiaTY0IgorICAiXCIsMywxLDIsM119fSI7CisgIGNvbnN0IGNoYXIqIGV4cGVjdGVkX3pvbWdfdW5pY29kZSA9ICJceGUwXHhiOFx4ODEgXHhmMFx4OWRceDk0XHhiZSI7CisKKyAgc3RkOjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZmZlcihuZXcgVE1lbW9yeUJ1ZmZlcigKKyAgICAodWludDhfdCopKGpzb25fc3RyaW5nKSwgc2l6ZW9mKGpzb25fc3RyaW5nKSkpOworICBzdGQ6OnNoYXJlZF9wdHI8VEpTT05Qcm90b2NvbD4gcHJvdG8obmV3IFRKU09OUHJvdG9jb2woYnVmZmVyKSk7CisKKyAgT25lT2ZFYWNoIG9vZTI7CisgIG9vZTIucmVhZChwcm90by5nZXQoKSk7CisgIEJPT1NUX0NIRUNLX01FU1NBR0UoIW9vZTIuem9tZ191bmljb2RlLmNvbXBhcmUoZXhwZWN0ZWRfem9tZ191bmljb2RlKSwKKyAgICAiRXhwZWN0ZWQ6XG4iIDw8IHRvSGV4U2VxdWVuY2UoZXhwZWN0ZWRfem9tZ191bmljb2RlKSA8PCAiXG5Hb3R0ZW46XG4iCisgICAgICAgICAgICAgICAgICA8PCB0b0hleFNlcXVlbmNlKG9vZTIuem9tZ191bmljb2RlKSk7CisKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9qc29uX3VuaWNvZGVfZXNjYXBlZF9taXNzaW5nX2xvd19zdXJyb2dhdGUpIHsKKyAgY29uc3QgY2hhciBqc29uX3N0cmluZ1tdID0KKyAgIntcIjFcIjp7XCJ0ZlwiOjF9LFwiMlwiOntcInRmXCI6MH0sXCIzXCI6e1wiaThcIjoxMjd9LFwiNFwiOntcImkxNlwiOjI3MDAwfSwiCisgICJcIjVcIjp7XCJpMzJcIjoxNn0sXCI2XCI6e1wiaTY0XCI6NjAwMDAwMDAwMH0sXCI3XCI6e1wiZGJsXCI6My4xNDE1OTI2IgorICAiNTM1ODk3OTMxfSxcIjhcIjp7XCJzdHJcIjpcIkpTT04gVEhJUyFcIn0sXCI5XCI6e1wic3RyXCI6XCJcXHVkODM1XCJ9LCIKKyAgIlwiMTBcIjp7XCJ0ZlwiOjB9LFwiMTFcIjp7XCJzdHJcIjpcIjAwMDAwMFwifSxcIjEyXCI6e1wibHN0XCIiCisgICI6W1wiaThcIiwzLDEsMiwzXX0sXCIxM1wiOntcImxzdFwiOltcImkxNlwiLDMsMSwyLDNdfSxcIjE0XCI6e1wibHN0XCI6W1wiaTY0IgorICAiXCIsMywxLDIsM119fSI7CisKKyAgc3RkOjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZmZlcihuZXcgVE1lbW9yeUJ1ZmZlcigKKyAgICAodWludDhfdCopKGpzb25fc3RyaW5nKSwgc2l6ZW9mKGpzb25fc3RyaW5nKSkpOworICBzdGQ6OnNoYXJlZF9wdHI8VEpTT05Qcm90b2NvbD4gcHJvdG8obmV3IFRKU09OUHJvdG9jb2woYnVmZmVyKSk7CisKKyAgT25lT2ZFYWNoIG9vZTI7CisgIEJPT1NUX0NIRUNLX1RIUk9XKG9vZTIucmVhZChwcm90by5nZXQoKSksCisgICAgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xFeGNlcHRpb24pOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2pzb25fdW5pY29kZV9lc2NhcGVkX21pc3NpbmdfaGlfc3Vycm9nYXRlKSB7CisgIGNvbnN0IGNoYXIganNvbl9zdHJpbmdbXSA9CisgICJ7XCIxXCI6e1widGZcIjoxfSxcIjJcIjp7XCJ0ZlwiOjB9LFwiM1wiOntcImk4XCI6MTI3fSxcIjRcIjp7XCJpMTZcIjoyNzAwMH0sIgorICAiXCI1XCI6e1wiaTMyXCI6MTZ9LFwiNlwiOntcImk2NFwiOjYwMDAwMDAwMDB9LFwiN1wiOntcImRibFwiOjMuMTQxNTkyNiIKKyAgIjUzNTg5NzkzMX0sXCI4XCI6e1wic3RyXCI6XCJKU09OIFRISVMhXCJ9LFwiOVwiOntcInN0clwiOlwiXFx1ZGQzZVwifSwiCisgICJcIjEwXCI6e1widGZcIjowfSxcIjExXCI6e1wic3RyXCI6XCIwMDAwMDBcIn0sXCIxMlwiOntcImxzdFwiIgorICAiOltcImk4XCIsMywxLDIsM119LFwiMTNcIjp7XCJsc3RcIjpbXCJpMTZcIiwzLDEsMiwzXX0sXCIxNFwiOntcImxzdFwiOltcImk2NCIKKyAgIlwiLDMsMSwyLDNdfX0iOworCisgIHN0ZDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWZmZXIobmV3IFRNZW1vcnlCdWZmZXIoCisgICAgKHVpbnQ4X3QqKShqc29uX3N0cmluZyksIHNpemVvZihqc29uX3N0cmluZykpKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRKU09OUHJvdG9jb2w+IHByb3RvKG5ldyBUSlNPTlByb3RvY29sKGJ1ZmZlcikpOworCisgIE9uZU9mRWFjaCBvb2UyOworICBCT09TVF9DSEVDS19USFJPVyhvb2UyLnJlYWQocHJvdG8uZ2V0KCkpLAorICAgIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRXhjZXB0aW9uKTsKIH0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9NYWtlZmlsZS5hbSBiL2xpYi9jcHAvdGVzdC9NYWtlZmlsZS5hbQppbmRleCA5MTExMjAxLi5kNjQ1YTY1IDEwMDc1NQotLS0gYS9saWIvY3BwL3Rlc3QvTWFrZWZpbGUuYW0KKysrIGIvbGliL2NwcC90ZXN0L01ha2VmaWxlLmFtCkBAIC0xOCwxMCArMTgsMjkgQEAKICMKIEFVVE9NQUtFX09QVElPTlMgPSBzdWJkaXItb2JqZWN0cyBzZXJpYWwtdGVzdHMKIAorQlVJTFRfU09VUkNFUyA9IGdlbi1jcHAvQW5ub3RhdGlvblRlc3RfdHlwZXMuaCBcCisgICAgICAgICAgICAgICAgZ2VuLWNwcC9EZWJ1Z1Byb3RvVGVzdF90eXBlcy5oIFwKKyAgICAgICAgICAgICAgICBnZW4tY3BwL0VudW1UZXN0X3R5cGVzLmggXAorICAgICAgICAgICAgICAgIGdlbi1jcHAvT3B0aW9uYWxSZXF1aXJlZFRlc3RfdHlwZXMuaCBcCisgICAgICAgICAgICAgICAgZ2VuLWNwcC9SZWN1cnNpdmVfdHlwZXMuaCBcCisgICAgICAgICAgICAgICAgZ2VuLWNwcC9UaHJpZnRUZXN0X3R5cGVzLmggXAorICAgICAgICAgICAgICAgIGdlbi1jcHAvVHlwZWRlZlRlc3RfdHlwZXMuaCBcCisgICAgICAgICAgICAgICAgZ2VuLWNwcC9DaGlsZFNlcnZpY2UuaCBcCisgICAgICAgICAgICAgICAgZ2VuLWNwcC9FbXB0eVNlcnZpY2UuaCBcCisgICAgICAgICAgICAgICAgZ2VuLWNwcC9QYXJlbnRTZXJ2aWNlLmggXAorCQlnZW4tY3BwL09uZVdheVRlc3RfdHlwZXMuaCBcCisJCWdlbi1jcHAvT25lV2F5U2VydmljZS5oIFwKKwkJZ2VuLWNwcC9PbmVXYXlUZXN0X2NvbnN0YW50cy5oIFwKKyAgICAgICAgICAgICAgICBnZW4tY3BwL3Byb2NfdHlwZXMuaAorCiBub2luc3RfTFRMSUJSQVJJRVMgPSBsaWJ0ZXN0Z2VuY3BwLmxhIGxpYnByb2Nlc3NvcnRlc3QubGEKIG5vZGlzdF9saWJ0ZXN0Z2VuY3BwX2xhX1NPVVJDRVMgPSBcCisJZ2VuLWNwcC9Bbm5vdGF0aW9uVGVzdF90eXBlcy5jcHAgXAorCWdlbi1jcHAvQW5ub3RhdGlvblRlc3RfdHlwZXMuaCBcCiAJZ2VuLWNwcC9EZWJ1Z1Byb3RvVGVzdF90eXBlcy5jcHAgXAogCWdlbi1jcHAvRGVidWdQcm90b1Rlc3RfdHlwZXMuaCBcCisJZ2VuLWNwcC9Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5jcHAgXAorCWdlbi1jcHAvRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuaCBcCiAJZ2VuLWNwcC9FbnVtVGVzdF90eXBlcy5jcHAgXAogCWdlbi1jcHAvRW51bVRlc3RfdHlwZXMuaCBcCiAJZ2VuLWNwcC9PcHRpb25hbFJlcXVpcmVkVGVzdF90eXBlcy5jcHAgXApAQCAtMzQsMTIgKzUzLDIwIEBACiAJZ2VuLWNwcC9UaHJpZnRUZXN0X2NvbnN0YW50cy5oIFwKIAlnZW4tY3BwL1R5cGVkZWZUZXN0X3R5cGVzLmNwcCBcCiAJZ2VuLWNwcC9UeXBlZGVmVGVzdF90eXBlcy5oIFwKKwlnZW4tY3BwL09uZVdheVNlcnZpY2UuY3BwIFwKKwlnZW4tY3BwL09uZVdheVRlc3RfY29uc3RhbnRzLmNwcCBcCisJZ2VuLWNwcC9PbmVXYXlUZXN0X3R5cGVzLmggXAorCWdlbi1jcHAvT25lV2F5U2VydmljZS5oIFwKKwlnZW4tY3BwL09uZVdheVRlc3RfY29uc3RhbnRzLmggXAorCWdlbi1jcHAvT25lV2F5VGVzdF90eXBlcy5jcHAgXAogCVRocmlmdFRlc3RfZXh0cmFzLmNwcCBcCiAJRGVidWdQcm90b1Rlc3RfZXh0cmFzLmNwcAogCiBub2Rpc3RfbGlicHJvY2Vzc29ydGVzdF9sYV9TT1VSQ0VTID0gXAogCWdlbi1jcHAvQ2hpbGRTZXJ2aWNlLmNwcCBcCiAJZ2VuLWNwcC9DaGlsZFNlcnZpY2UuaCBcCisJZ2VuLWNwcC9FbXB0eVNlcnZpY2UuY3BwIFwKKwlnZW4tY3BwL0VtcHR5U2VydmljZS5oIFwKIAlnZW4tY3BwL1BhcmVudFNlcnZpY2UuY3BwIFwKIAlnZW4tY3BwL1BhcmVudFNlcnZpY2UuaCBcCiAJZ2VuLWNwcC9wcm9jX3R5cGVzLmNwcCBcCkBAIC01MSw3ICs3OCw2IEBACiBsaWJ0ZXN0Z2VuY3BwX2xhX0xJQkFERCA9ICQodG9wX2J1aWxkZGlyKS9saWIvY3BwL2xpYnRocmlmdC5sYQogCiBub2luc3RfUFJPR1JBTVMgPSBCZW5jaG1hcmsgXAotCXByb2Nlc3Nvcl90ZXN0IFwKIAljb25jdXJyZW5jeV90ZXN0CiAKIEJlbmNobWFya19TT1VSQ0VTID0gXApAQCAtNjAsNiArODYsNyBAQAogQmVuY2htYXJrX0xEQUREID0gbGlidGVzdGdlbmNwcC5sYQogCiBjaGVja19QUk9HUkFNUyA9IFwKKwlVbml0VGVzdHMgXAogCVRGRFRyYW5zcG9ydFRlc3QgXAogCVRQaXBlZFRyYW5zcG9ydFRlc3QgXAogCURlYnVnUHJvdG9UZXN0IFwKQEAgLTY5LDM3ICs5Niw4NyBAQAogCVNwZWNpYWxpemF0aW9uVGVzdCBcCiAJQWxsUHJvdG9jb2xzVGVzdCBcCiAJVHJhbnNwb3J0VGVzdCBcCisJVEludGVycnVwdFRlc3QgXAorCVRTZXJ2ZXJJbnRlZ3JhdGlvblRlc3QgXAorCVNlY3VyaXR5VGVzdCBcCiAJWmxpYlRlc3QgXAogCVRGaWxlVHJhbnNwb3J0VGVzdCBcCi0JVW5pdFRlc3RzIFwKIAlsaW5rX3Rlc3QgXAogCU9wZW5TU0xNYW51YWxJbml0VGVzdCBcCi0JRW51bVRlc3QKKwlFbnVtVGVzdCBcCisJUmVuZGVyZWREb3VibGVDb25zdGFudHNUZXN0IFwKKyAgICAgICAgQW5ub3RhdGlvblRlc3QKKworaWYgQU1YX0hBVkVfTElCRVZFTlQKK25vaW5zdF9QUk9HUkFNUyArPSBcCisJcHJvY2Vzc29yX3Rlc3QKK2NoZWNrX1BST0dSQU1TICs9IFwKKwlUTm9uYmxvY2tpbmdTZXJ2ZXJUZXN0IFwKKwlUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJUZXN0CitlbmRpZgogCiBURVNUU19FTlZJUk9OTUVOVD0gXAogCUJPT1NUX1RFU1RfTE9HX1NJTks9dGVzdHMueG1sIFwKIAlCT09TVF9URVNUX0xPR19MRVZFTD10ZXN0X3N1aXRlIFwKLQlCT09TVF9URVNUX0xPR19GT1JNQVQ9eG1sCisJQk9PU1RfVEVTVF9MT0dfRk9STUFUPVhNTAogCiBURVNUUyA9IFwKIAkkKGNoZWNrX1BST0dSQU1TKQogCiBVbml0VGVzdHNfU09VUkNFUyA9IFwKIAlVbml0VGVzdE1haW4uY3BwIFwKKwlPbmVXYXlIVFRQVGVzdC5jcHAgXAogCVRNZW1vcnlCdWZmZXJUZXN0LmNwcCBcCiAJVEJ1ZmZlckJhc2VUZXN0LmNwcCBcCiAJQmFzZTY0VGVzdC5jcHAgXAogCVRvU3RyaW5nVGVzdC5jcHAgXAotCVR5cGVkZWZUZXN0LmNwcAorCVR5cGVkZWZUZXN0LmNwcCBcCisJVFNlcnZlclNvY2tldFRlc3QuY3BwIFwKKwlUU2VydmVyVHJhbnNwb3J0VGVzdC5jcHAgXAorCVRUcmFuc3BvcnRDaGVja1Rocm93LmgKIAotaWYgIVdJVEhfQk9PU1RUSFJFQURTCiBVbml0VGVzdHNfU09VUkNFUyArPSBcCi0gICAgICAgIFJXTXV0ZXhTdGFydmVUZXN0LmNwcAotZW5kaWYKKyAgY29uY3VycmVuY3kvTXV0ZXhUZXN0LmNwcCBcCisgIGNvbmN1cnJlbmN5L1JXTXV0ZXhTdGFydmVUZXN0LmNwcAogCiBVbml0VGVzdHNfTERBREQgPSBcCiAgIGxpYnRlc3RnZW5jcHAubGEgXAotICAtbDpsaWJib29zdF91bml0X3Rlc3RfZnJhbWV3b3JrLmEKKyAgJChCT09TVF9URVNUX0xEQUREKSBcCisgICQoQk9PU1RfU1lTVEVNX0xEQUREKSBcCisgICQoQk9PU1RfVEhSRUFEX0xEQUREKQorCitUSW50ZXJydXB0VGVzdF9TT1VSQ0VTID0gXAorCVRTb2NrZXRJbnRlcnJ1cHRUZXN0LmNwcCBcCisJVFNTTFNvY2tldEludGVycnVwdFRlc3QuY3BwCisKK1RJbnRlcnJ1cHRUZXN0X0xEQUREID0gXAorICBsaWJ0ZXN0Z2VuY3BwLmxhIFwKKyAgJChCT09TVF9URVNUX0xEQUREKSBcCisgICQoQk9PU1RfRklMRVNZU1RFTV9MREFERCkgXAorICAkKEJPT1NUX0NIUk9OT19MREFERCkgXAorICAkKEJPT1NUX1NZU1RFTV9MREFERCkgXAorICAkKEJPT1NUX1RIUkVBRF9MREFERCkKKworVFNlcnZlckludGVncmF0aW9uVGVzdF9TT1VSQ0VTID0gXAorCVRTZXJ2ZXJJbnRlZ3JhdGlvblRlc3QuY3BwCisKK1RTZXJ2ZXJJbnRlZ3JhdGlvblRlc3RfTERBREQgPSBcCisgIGxpYnRlc3RnZW5jcHAubGEgXAorICBsaWJwcm9jZXNzb3J0ZXN0LmxhIFwKKyAgJChCT09TVF9URVNUX0xEQUREKSBcCisgICQoQk9PU1RfU1lTVEVNX0xEQUREKSBcCisgICQoQk9PU1RfVEhSRUFEX0xEQUREKQorCitTZWN1cml0eVRlc3RfU09VUkNFUyA9IFwKKwlTZWN1cml0eVRlc3QuY3BwCisKK1NlY3VyaXR5VGVzdF9MREFERCA9IFwKKyAgbGlidGVzdGdlbmNwcC5sYSBcCisgIGxpYnByb2Nlc3NvcnRlc3QubGEgXAorICAkKEJPT1NUX1RFU1RfTERBREQpIFwKKyAgJChCT09TVF9GSUxFU1lTVEVNX0xEQUREKSBcCisgICQoQk9PU1RfU1lTVEVNX0xEQUREKSBcCisgICQoQk9PU1RfVEhSRUFEX0xEQUREKQogCiBUcmFuc3BvcnRUZXN0X1NPVVJDRVMgPSBcCiAJVHJhbnNwb3J0VGVzdC5jcHAKQEAgLTEwNyw3ICsxODQsNyBAQAogVHJhbnNwb3J0VGVzdF9MREFERCA9IFwKICAgbGlidGVzdGdlbmNwcC5sYSBcCiAgICQodG9wX2J1aWxkZGlyKS9saWIvY3BwL2xpYnRocmlmdHoubGEgXAotICAtbDpsaWJib29zdF91bml0X3Rlc3RfZnJhbWV3b3JrLmEgXAorICAkKEJPT1NUX1RFU1RfTERBREQpIFwKICAgLWx6CiAKIFpsaWJUZXN0X1NPVVJDRVMgPSBcCkBAIC0xMTYsMjIgKzE5MywzMyBAQAogWmxpYlRlc3RfTERBREQgPSBcCiAgIGxpYnRlc3RnZW5jcHAubGEgXAogICAkKHRvcF9idWlsZGRpcikvbGliL2NwcC9saWJ0aHJpZnR6LmxhIFwKLSAgLWw6bGliYm9vc3RfdW5pdF90ZXN0X2ZyYW1ld29yay5hIFwKKyAgJChCT09TVF9URVNUX0xEQUREKSBcCiAgIC1segogCiBFbnVtVGVzdF9TT1VSQ0VTID0gXAotICBFbnVtVGVzdC5jcHAKKwlFbnVtVGVzdC5jcHAKIAogRW51bVRlc3RfTERBREQgPSBcCiAgIGxpYnRlc3RnZW5jcHAubGEgXAotICAtbDpsaWJib29zdF91bml0X3Rlc3RfZnJhbWV3b3JrLmEKKyAgJChCT09TVF9URVNUX0xEQUREKQorCitSZW5kZXJlZERvdWJsZUNvbnN0YW50c1Rlc3RfU09VUkNFUyA9IFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzVGVzdC5jcHAKKworUmVuZGVyZWREb3VibGVDb25zdGFudHNUZXN0X0xEQUREID0gbGlidGVzdGdlbmNwcC5sYSAkKEJPT1NUX1RFU1RfTERBREQpCisKK0Fubm90YXRpb25UZXN0X1NPVVJDRVMgPSBcCisJQW5ub3RhdGlvblRlc3QuY3BwCisKK0Fubm90YXRpb25UZXN0X0xEQUREID0gXAorICBsaWJ0ZXN0Z2VuY3BwLmxhIFwKKyAgJChCT09TVF9URVNUX0xEQUREKQogCiBURmlsZVRyYW5zcG9ydFRlc3RfU09VUkNFUyA9IFwKIAlURmlsZVRyYW5zcG9ydFRlc3QuY3BwCiAKIFRGaWxlVHJhbnNwb3J0VGVzdF9MREFERCA9IFwKICAgbGlidGVzdGdlbmNwcC5sYSBcCi0gIC1sOmxpYmJvb3N0X3VuaXRfdGVzdF9mcmFtZXdvcmsuYQorICAkKEJPT1NUX1RFU1RfTERBREQpCiAKICMKICMgVEZEVHJhbnNwb3J0VGVzdApAQCAtMTM5LDE4ICsyMjcsMjQgQEAKIFRGRFRyYW5zcG9ydFRlc3RfU09VUkNFUyA9IFwKIAlURkRUcmFuc3BvcnRUZXN0LmNwcAogCi1URkRUcmFuc3BvcnRUZXN0X0xEQUREID0gXAotCSQodG9wX2J1aWxkZGlyKS9saWIvY3BwL2xpYnRocmlmdC5sYQorVEZEVHJhbnNwb3J0VGVzdF9MREFERCA9ICBcCisJJCh0b3BfYnVpbGRkaXIpL2xpYi9jcHAvbGlidGhyaWZ0LmxhIFwKKwkkKEJPT1NUX1RFU1RfTERBREQpCiAKIAogIwogIyBUUGlwZWRUcmFuc3BvcnRUZXN0CiAjCiBUUGlwZWRUcmFuc3BvcnRUZXN0X1NPVVJDRVMgPSBcCi0JVFBpcGVkVHJhbnNwb3J0VGVzdC5jcHAKKwlUUGlwZWRUcmFuc3BvcnRUZXN0LmNwcCBcCisJVFBpcGVJbnRlcnJ1cHRUZXN0LmNwcAogCiBUUGlwZWRUcmFuc3BvcnRUZXN0X0xEQUREID0gXAotCSQodG9wX2J1aWxkZGlyKS9saWIvY3BwL2xpYnRocmlmdC5sYQorCWxpYnRlc3RnZW5jcHAubGEgXAorCSQodG9wX2J1aWxkZGlyKS9saWIvY3BwL2xpYnRocmlmdC5sYSBcCisJJChCT09TVF9URVNUX0xEQUREKSBcCisJJChCT09TVF9TWVNURU1fTERBREQpIFwKKwkkKEJPT1NUX1RIUkVBRF9MREFERCkKIAogIwogIyBBbGxQcm90b2NvbHNUZXN0CkBAIC0xNjAsNyArMjU0LDkgQEAKIAlBbGxQcm90b2NvbFRlc3RzLnRjYyBcCiAJR2VuZXJpY0hlbHBlcnMuaAogCi1BbGxQcm90b2NvbHNUZXN0X0xEQUREID0gbGlidGVzdGdlbmNwcC5sYQorQWxsUHJvdG9jb2xzVGVzdF9MREFERCA9IFwKKyAgbGlidGVzdGdlbmNwcC5sYSBcCisgICQoQk9PU1RfVEVTVF9MREFERCkKIAogIwogIyBEZWJ1Z1Byb3RvVGVzdApAQCAtMTY4LDcgKzI2NCw5IEBACiBEZWJ1Z1Byb3RvVGVzdF9TT1VSQ0VTID0gXAogCURlYnVnUHJvdG9UZXN0LmNwcAogCi1EZWJ1Z1Byb3RvVGVzdF9MREFERCA9IGxpYnRlc3RnZW5jcHAubGEKK0RlYnVnUHJvdG9UZXN0X0xEQUREID0gXAorCWxpYnRlc3RnZW5jcHAubGEgXAorCSQoQk9PU1RfVEVTVF9MREFERCkKIAogCiAjCkBAIC0xNzcsNyArMjc1LDM2IEBACiBKU09OUHJvdG9UZXN0X1NPVVJDRVMgPSBcCiAJSlNPTlByb3RvVGVzdC5jcHAKIAotSlNPTlByb3RvVGVzdF9MREFERCA9IGxpYnRlc3RnZW5jcHAubGEKK0pTT05Qcm90b1Rlc3RfTERBREQgPSBcCisJbGlidGVzdGdlbmNwcC5sYSBcCisJJChCT09TVF9URVNUX0xEQUREKQorCisjCisjIFROb25ibG9ja2luZ1NlcnZlclRlc3QKKyMKK1ROb25ibG9ja2luZ1NlcnZlclRlc3RfU09VUkNFUyA9IFROb25ibG9ja2luZ1NlcnZlclRlc3QuY3BwCisKK1ROb25ibG9ja2luZ1NlcnZlclRlc3RfTERBREQgPSBsaWJwcm9jZXNzb3J0ZXN0LmxhIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRvcF9idWlsZGRpcikvbGliL2NwcC9saWJ0aHJpZnQubGEgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodG9wX2J1aWxkZGlyKS9saWIvY3BwL2xpYnRocmlmdG5iLmxhIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKEJPT1NUX1RFU1RfTERBREQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKEJPT1NUX0xERkxBR1MpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKExJQkVWRU5UX0xJQlMpCisjCisjIFROb25ibG9ja2luZ1NTTFNlcnZlclRlc3QKKyMKK1ROb25ibG9ja2luZ1NTTFNlcnZlclRlc3RfU09VUkNFUyA9IFROb25ibG9ja2luZ1NTTFNlcnZlclRlc3QuY3BwCisKK1ROb25ibG9ja2luZ1NTTFNlcnZlclRlc3RfTERBREQgPSBsaWJwcm9jZXNzb3J0ZXN0LmxhIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRvcF9idWlsZGRpcikvbGliL2NwcC9saWJ0aHJpZnQubGEgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodG9wX2J1aWxkZGlyKS9saWIvY3BwL2xpYnRocmlmdG5iLmxhIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKEJPT1NUX1RFU1RfTERBREQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKEJPT1NUX0xERkxBR1MpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKEJPT1NUX0ZJTEVTWVNURU1fTERBREQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKEJPT1NUX0NIUk9OT19MREFERCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoQk9PU1RfU1lTVEVNX0xEQUREKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChCT09TVF9USFJFQURfTERBREQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKExJQkVWRU5UX0xJQlMpCiAKICMKICMgT3B0aW9uYWxSZXF1aXJlZFRlc3QKQEAgLTE4NSw3ICszMTIsOSBAQAogT3B0aW9uYWxSZXF1aXJlZFRlc3RfU09VUkNFUyA9IFwKIAlPcHRpb25hbFJlcXVpcmVkVGVzdC5jcHAKIAotT3B0aW9uYWxSZXF1aXJlZFRlc3RfTERBREQgPSBsaWJ0ZXN0Z2VuY3BwLmxhCitPcHRpb25hbFJlcXVpcmVkVGVzdF9MREFERCA9IFwKKwlsaWJ0ZXN0Z2VuY3BwLmxhIFwKKwkkKEJPT1NUX1RFU1RfTERBREQpCiAKICMKICMgT3B0aW9uYWxSZXF1aXJlZFRlc3QKQEAgLTE5Myw3ICszMjIsOSBAQAogUmVjdXJzaXZlVGVzdF9TT1VSQ0VTID0gXAogCVJlY3Vyc2l2ZVRlc3QuY3BwCiAKLVJlY3Vyc2l2ZVRlc3RfTERBREQgPSBsaWJ0ZXN0Z2VuY3BwLmxhCitSZWN1cnNpdmVUZXN0X0xEQUREID0gXAorCWxpYnRlc3RnZW5jcHAubGEgXAorCSQoQk9PU1RfVEVTVF9MREFERCkKIAogIwogIyBTcGVjaWFsaXphdGlvblRlc3QKQEAgLTIwMSw3ICszMzIsOSBAQAogU3BlY2lhbGl6YXRpb25UZXN0X1NPVVJDRVMgPSBcCiAJU3BlY2lhbGl6YXRpb25UZXN0LmNwcAogCi1TcGVjaWFsaXphdGlvblRlc3RfTERBREQgPSBsaWJ0ZXN0Z2VuY3BwLmxhCitTcGVjaWFsaXphdGlvblRlc3RfTERBREQgPSBcCisJbGlidGVzdGdlbmNwcC5sYSBcCisJJChCT09TVF9URVNUX0xEQUREKQogCiBjb25jdXJyZW5jeV90ZXN0X1NPVVJDRVMgPSBcCiAJY29uY3VycmVuY3kvVGVzdHMuY3BwIFwKQEAgLTIyOCwyNCArMzYxLDMyIEBACiBwcm9jZXNzb3JfdGVzdF9MREFERCA9IGxpYnByb2Nlc3NvcnRlc3QubGEgXAogICAgICAgICAgICAgICAgICAgICAgICAkKHRvcF9idWlsZGRpcikvbGliL2NwcC9saWJ0aHJpZnQubGEgXAogICAgICAgICAgICAgICAgICAgICAgICAkKHRvcF9idWlsZGRpcikvbGliL2NwcC9saWJ0aHJpZnRuYi5sYSBcCisgICAgICAgICAgICAgICAgICAgICAgICQoQk9PU1RfVEVTVF9MREFERCkgXAogICAgICAgICAgICAgICAgICAgICAgICAkKEJPT1NUX0xERkxBR1MpIFwKLSAgICAgICAgICAgICAgICAgICAgICAgLWxldmVudCBcCi0gICAgICAgICAgICAgICAgICAgICAgIC1sOmxpYmJvb3N0X3VuaXRfdGVzdF9mcmFtZXdvcmsuYQorICAgICAgICAgICAgICAgICAgICAgICAkKExJQkVWRU5UX0xJQlMpCiAKIE9wZW5TU0xNYW51YWxJbml0VGVzdF9TT1VSQ0VTID0gXAogCU9wZW5TU0xNYW51YWxJbml0VGVzdC5jcHAKIAogT3BlblNTTE1hbnVhbEluaXRUZXN0X0xEQUREID0gXAogCSQodG9wX2J1aWxkZGlyKS9saWIvY3BwL2xpYnRocmlmdC5sYSBcCi0JLWw6bGliYm9vc3RfdW5pdF90ZXN0X2ZyYW1ld29yay5hCisJJChCT09TVF9URVNUX0xEQUREKSBcCisJJChPUEVOU1NMX0xERkxBR1MpIFwKKwkkKE9QRU5TU0xfTElCUykKIAogIwogIyBDb21tb24gdGhyaWZ0IGNvZGUgZ2VuZXJhdGlvbiBydWxlcwogIwotVEhSSUZUID0gJCh0b3BfYnVpbGRkaXIpL2NvbXBpbGVyL2NwcC90aHJpZnQKIAotZ2VuLWNwcC9EZWJ1Z1Byb3RvVGVzdF90eXBlcy5jcHAgZ2VuLWNwcC9EZWJ1Z1Byb3RvVGVzdF90eXBlcy5oOiAkKHRvcF9zcmNkaXIpL3Rlc3QvRGVidWdQcm90b1Rlc3QudGhyaWZ0Ci0JJChUSFJJRlQpIC0tZ2VuIGNwcDpkZW5zZSAkPAorZ2VuLWNwcC9Bbm5vdGF0aW9uVGVzdF9jb25zdGFudHMuY3BwIGdlbi1jcHAvQW5ub3RhdGlvblRlc3RfY29uc3RhbnRzLmggZ2VuLWNwcC9Bbm5vdGF0aW9uVGVzdF90eXBlcy5jcHAgZ2VuLWNwcC9Bbm5vdGF0aW9uVGVzdF90eXBlcy5oOiAkKHRvcF9zcmNkaXIpL3Rlc3QvQW5ub3RhdGlvblRlc3QudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIGNwcCAkPAorCitnZW4tY3BwL0RlYnVnUHJvdG9UZXN0X3R5cGVzLmNwcCBnZW4tY3BwL0RlYnVnUHJvdG9UZXN0X3R5cGVzLmggZ2VuLWNwcC9FbXB0eVNlcnZpY2UuY3BwIGdlbi1jcHAvRW1wdHlTZXJ2aWNlLmg6ICQodG9wX3NyY2RpcikvdGVzdC9EZWJ1Z1Byb3RvVGVzdC50aHJpZnQKKwkkKFRIUklGVCkgLS1nZW4gY3BwICQ8CisKK2dlbi1jcHAvRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuY3BwIGdlbi1jcHAvRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuaDogJCh0b3Bfc3JjZGlyKS90ZXN0L0RvdWJsZUNvbnN0YW50c1Rlc3QudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIGNwcCAkPAorCiAKIGdlbi1jcHAvRW51bVRlc3RfdHlwZXMuY3BwIGdlbi1jcHAvRW51bVRlc3RfdHlwZXMuaDogJCh0b3Bfc3JjZGlyKS90ZXN0L0VudW1UZXN0LnRocmlmdAogCSQoVEhSSUZUKSAtLWdlbiBjcHAgJDwKQEAgLTI1NCwzMCArMzk1LDM1IEBACiAJJChUSFJJRlQpIC0tZ2VuIGNwcCAkPAogCiBnZW4tY3BwL09wdGlvbmFsUmVxdWlyZWRUZXN0X3R5cGVzLmNwcCBnZW4tY3BwL09wdGlvbmFsUmVxdWlyZWRUZXN0X3R5cGVzLmg6ICQodG9wX3NyY2RpcikvdGVzdC9PcHRpb25hbFJlcXVpcmVkVGVzdC50aHJpZnQKLQkkKFRIUklGVCkgLS1nZW4gY3BwOmRlbnNlICQ8CisJJChUSFJJRlQpIC0tZ2VuIGNwcCAkPAogCiBnZW4tY3BwL1JlY3Vyc2l2ZV90eXBlcy5jcHAgZ2VuLWNwcC9SZWN1cnNpdmVfdHlwZXMuaDogJCh0b3Bfc3JjZGlyKS90ZXN0L1JlY3Vyc2l2ZS50aHJpZnQKIAkkKFRIUklGVCkgLS1nZW4gY3BwICQ8CiAKIGdlbi1jcHAvU2VydmljZS5jcHAgZ2VuLWNwcC9TdHJlc3NUZXN0X3R5cGVzLmNwcDogJCh0b3Bfc3JjZGlyKS90ZXN0L1N0cmVzc1Rlc3QudGhyaWZ0Ci0JJChUSFJJRlQpIC0tZ2VuIGNwcDpkZW5zZSAkPAorCSQoVEhSSUZUKSAtLWdlbiBjcHAgJDwKIAogZ2VuLWNwcC9TZWNvbmRTZXJ2aWNlLmNwcCBnZW4tY3BwL1RocmlmdFRlc3RfY29uc3RhbnRzLmNwcCBnZW4tY3BwL1RocmlmdFRlc3QuY3BwIGdlbi1jcHAvVGhyaWZ0VGVzdF90eXBlcy5jcHAgZ2VuLWNwcC9UaHJpZnRUZXN0X3R5cGVzLmg6ICQodG9wX3NyY2RpcikvdGVzdC9UaHJpZnRUZXN0LnRocmlmdAotCSQoVEhSSUZUKSAtLWdlbiBjcHA6ZGVuc2UgJDwKKwkkKFRIUklGVCkgLS1nZW4gY3BwICQ8CisKK2dlbi1jcHAvT25lV2F5U2VydmljZS5jcHAgZ2VuLWNwcC9PbmVXYXlUZXN0X2NvbnN0YW50cy5jcHAgZ2VuLWNwcC9PbmVXYXlUZXN0X3R5cGVzLmggZ2VuLWNwcC9PbmVXYXlTZXJ2aWNlLmggZ2VuLWNwcC9PbmVXYXlUZXN0X2NvbnN0YW50cy5oIGdlbi1jcHAvT25lV2F5VGVzdF90eXBlcy5jcHA6IE9uZVdheVRlc3QudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIGNwcCAkPAogCiBnZW4tY3BwL0NoaWxkU2VydmljZS5jcHAgZ2VuLWNwcC9DaGlsZFNlcnZpY2UuaCBnZW4tY3BwL1BhcmVudFNlcnZpY2UuY3BwIGdlbi1jcHAvUGFyZW50U2VydmljZS5oIGdlbi1jcHAvcHJvY190eXBlcy5jcHAgZ2VuLWNwcC9wcm9jX3R5cGVzLmg6IHByb2Nlc3Nvci9wcm9jLnRocmlmdAogCSQoVEhSSUZUKSAtLWdlbiBjcHA6dGVtcGxhdGVzLGNvYl9zdHlsZSAkPAogCi1BTV9DUFBGTEFHUyA9ICQoQk9PU1RfQ1BQRkxBR1MpIC1JJCh0b3Bfc3JjZGlyKS9saWIvY3BwL3NyYworQU1fQ1BQRkxBR1MgPSAkKEJPT1NUX0NQUEZMQUdTKSAtSSQodG9wX3NyY2RpcikvbGliL2NwcC9zcmMgLURfX1NURENfRk9STUFUX01BQ1JPUyAtRF9fU1REQ19MSU1JVF9NQUNST1MgLUkuCiBBTV9MREZMQUdTID0gJChCT09TVF9MREZMQUdTKQogQU1fQ1hYRkxBR1MgPSAtV2FsbCAtV2V4dHJhIC1wZWRhbnRpYwogCiBjbGVhbi1sb2NhbDoKLQkkKFJNKSAtciBnZW4tY3BwCisJJChSTSkgZ2VuLWNwcC8qCiAKIEVYVFJBX0RJU1QgPSBcCi0JRGVuc2VQcm90b1Rlc3QuY3BwIFwKLQlUaHJpZnRUZXN0X2V4dHJhcy5jcHAgXAotCURlYnVnUHJvdG9UZXN0X2V4dHJhcy5jcHAgXAogCWNvbmN1cnJlbmN5IFwKLQlwcm9jZXNzb3IKKwlwcm9jZXNzb3IgXAorCXF0IFwKKwlDTWFrZUxpc3RzLnR4dCBcCisJRGVidWdQcm90b1Rlc3RfZXh0cmFzLmNwcCBcCisJVGhyaWZ0VGVzdF9leHRyYXMuY3BwIFwKKwlPbmVXYXlUZXN0LnRocmlmdApkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L09uZVdheUhUVFBUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9PbmVXYXlIVFRQVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODlmYTE2NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvdGVzdC9PbmVXYXlIVFRQVGVzdC5jcHAKQEAgLTAsMCArMSwyNDIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGJvb3N0L3Rlc3QvYXV0b191bml0X3Rlc3QuaHBwPgorI2luY2x1ZGUgPGJvb3N0L3RocmVhZC5ocHA+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8Y2xpbWl0cz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L01vbml0b3IuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RUaHJlYWRlZFNlcnZlci5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEh0dHBTZXJ2ZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RIdHRwQ2xpZW50Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0Lmg+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KKyNpbmNsdWRlICJnZW4tY3BwL09uZVdheVNlcnZpY2UuaCIKKworQk9PU1RfQVVUT19URVNUX1NVSVRFKE9uZVdheUhUVFBUZXN0KQorCit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VEJpbmFyeVByb3RvY29sOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUQmluYXJ5UHJvdG9jb2xGYWN0b3J5OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUSlNPTlByb3RvY29sOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUSlNPTlByb3RvY29sRmFjdG9yeTsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXI6OlRUaHJlYWRlZFNlcnZlcjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXI6OlRTZXJ2ZXJFdmVudEhhbmRsZXI7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VEh0dHBTZXJ2ZXI7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUSHR0cFNlcnZlclRyYW5zcG9ydEZhY3Rvcnk7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUSHR0cENsaWVudDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRCdWZmZXJlZFRyYW5zcG9ydDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRCdWZmZXJlZFRyYW5zcG9ydEZhY3Rvcnk7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclNvY2tldDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTb2NrZXQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOwordXNpbmcgc3RkOjpjb3V0OwordXNpbmcgc3RkOjpjZXJyOwordXNpbmcgc3RkOjplbmRsOwordXNpbmcgc3RkOjpzdHJpbmc7CituYW1lc3BhY2UgdXRmID0gYm9vc3Q6OnVuaXRfdGVzdDsKKworLy8gRGVmaW5lIHRoaXMgZW52IHZhciB0byBlbmFibGUgc29tZSBsb2dnaW5nIChpbiBjYXNlIHlvdSBuZWVkIHRvIGRlYnVnKQorI3VuZGVmIEVOQUJMRV9TVERFUlJfTE9HR0lORworCitjbGFzcyBPbmVXYXlTZXJ2aWNlSGFuZGxlciA6IHB1YmxpYyBvbmV3YXl0ZXN0OjpPbmVXYXlTZXJ2aWNlSWYgeworcHVibGljOgorICBPbmVXYXlTZXJ2aWNlSGFuZGxlcigpIHt9CisKKyAgdm9pZCByb3VuZFRyaXBSUEMoKSBvdmVycmlkZSB7CisjaWZkZWYgRU5BQkxFX1NUREVSUl9MT0dHSU5HCisgICAgY2VyciA8PCAicm91bmRUcmlwUlBDKCkiIDw8IGVuZGw7CisjZW5kaWYKKyAgfQorICB2b2lkIG9uZVdheVJQQygpIHsKKyNpZmRlZiBFTkFCTEVfU1RERVJSX0xPR0dJTkcKKyAgICBjZXJyIDw8ICJvbmVXYXlSUEMoKSIgPDwgc3RkOjplbmRsIDsKKyNlbmRpZgorIH0KK307CisKK2NsYXNzIE9uZVdheVNlcnZpY2VDbG9uZUZhY3RvcnkgOiB2aXJ0dWFsIHB1YmxpYyBvbmV3YXl0ZXN0OjpPbmVXYXlTZXJ2aWNlSWZGYWN0b3J5IHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgfk9uZVdheVNlcnZpY2VDbG9uZUZhY3RvcnkoKSB7fQorICB2aXJ0dWFsIG9uZXdheXRlc3Q6Ok9uZVdheVNlcnZpY2VJZiogZ2V0SGFuZGxlcihjb25zdCA6OmFwYWNoZTo6dGhyaWZ0OjpUQ29ubmVjdGlvbkluZm8mIGNvbm5JbmZvKQorICB7CisgICAgKHZvaWQpY29ubkluZm8gOworICAgIHJldHVybiBuZXcgT25lV2F5U2VydmljZUhhbmRsZXI7CisgIH0KKyAgdmlydHVhbCB2b2lkIHJlbGVhc2VIYW5kbGVyKCBvbmV3YXl0ZXN0OjpPbmVXYXlTZXJ2aWNlSWYqIGhhbmRsZXIpIHsKKyAgICBkZWxldGUgaGFuZGxlcjsKKyAgfQorfTsKKworY2xhc3MgUlBDMFRocmVhZENsYXNzIHsKK3B1YmxpYzoKKyAgUlBDMFRocmVhZENsYXNzKFRUaHJlYWRlZFNlcnZlciYgc2VydmVyKSA6IHNlcnZlcl8oc2VydmVyKSB7IH0gLy8gQ29uc3RydWN0b3IKK35SUEMwVGhyZWFkQ2xhc3MoKSB7IH0gLy8gRGVzdHJ1Y3RvcgorCit2b2lkIFJ1bigpIHsKKyAgc2VydmVyXy5zZXJ2ZSgpIDsKK30KKyBUVGhyZWFkZWRTZXJ2ZXImIHNlcnZlcl8gOworfSA7CisKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6TW9uaXRvcjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6TXV0ZXg7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlN5bmNocm9uaXplZDsKKworLy8gY29waWVkIGZyb20gSW50ZWdyYXRpb25UZXN0CitjbGFzcyBUU2VydmVyUmVhZHlFdmVudEhhbmRsZXIgOiBwdWJsaWMgVFNlcnZlckV2ZW50SGFuZGxlciwgcHVibGljIE1vbml0b3IgeworcHVibGljOgorICBUU2VydmVyUmVhZHlFdmVudEhhbmRsZXIoKSA6IGlzTGlzdGVuaW5nXyhmYWxzZSksIGFjY2VwdGVkXygwKSB7fQorICB2aXJ0dWFsIH5UU2VydmVyUmVhZHlFdmVudEhhbmRsZXIoKSB7fQorICB2aXJ0dWFsIHZvaWQgcHJlU2VydmUoKSB7CisgICAgU3luY2hyb25pemVkIHN5bmMoKnRoaXMpOworICAgIGlzTGlzdGVuaW5nXyA9IHRydWU7CisgICAgbm90aWZ5KCk7CisgIH0KKyAgdmlydHVhbCB2b2lkKiBjcmVhdGVDb250ZXh0KHNoYXJlZF9wdHI8VFByb3RvY29sPiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8VFByb3RvY29sPiBvdXRwdXQpIHsKKyAgICBTeW5jaHJvbml6ZWQgc3luYygqdGhpcyk7CisgICAgKythY2NlcHRlZF87CisgICAgbm90aWZ5KCk7CisKKyAgICAodm9pZClpbnB1dDsKKyAgICAodm9pZClvdXRwdXQ7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgYm9vbCBpc0xpc3RlbmluZygpIGNvbnN0IHsgcmV0dXJuIGlzTGlzdGVuaW5nXzsgfQorICB1aW50NjRfdCBhY2NlcHRlZENvdW50KCkgY29uc3QgeyByZXR1cm4gYWNjZXB0ZWRfOyB9CisKK3ByaXZhdGU6CisgIGJvb2wgaXNMaXN0ZW5pbmdfOworICB1aW50NjRfdCBhY2NlcHRlZF87Cit9OworCitjbGFzcyBUQmxvY2thYmxlQnVmZmVyZWRUcmFuc3BvcnQgOiBwdWJsaWMgVEJ1ZmZlcmVkVHJhbnNwb3J0IHsKKyBwdWJsaWM6CisgIFRCbG9ja2FibGVCdWZmZXJlZFRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0KQorICAgIDogVEJ1ZmZlcmVkVHJhbnNwb3J0KHRyYW5zcG9ydCwgMTAyNDApLAorICAgIGJsb2NrZWRfKGZhbHNlKSB7CisgIH0KKworICB1aW50MzJfdCB3cml0ZV9idWZmZXJfbGVuZ3RoKCkgeworICAgIHVpbnQzMl90IGhhdmVfYnl0ZXMgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4od0Jhc2VfIC0gd0J1Zl8uZ2V0KCkpOworICAgIHJldHVybiBoYXZlX2J5dGVzIDsKKyAgfQorCisgIHZvaWQgYmxvY2soKSB7CisgICAgYmxvY2tlZF8gPSB0cnVlIDsKKyNpZmRlZiBFTkFCTEVfU1RERVJSX0xPR0dJTkcKKyAgICBjZXJyIDw8ICJibG9jayBmbHVzaGluZ1xuIiA7CisjZW5kaWYKKyB9CisgIHZvaWQgdW5ibG9jaygpIHsKKyAgICBibG9ja2VkXyA9IGZhbHNlIDsKKyNpZmRlZiBFTkFCTEVfU1RERVJSX0xPR0dJTkcKKyAgICBjZXJyIDw8ICJ1bmJsb2NrIGZsdXNoaW5nLCBidWZmZXIgaXNcbjw8IiA8PCBzdGQ6OnN0cmluZygoY2hhciAqKXdCdWZfLmdldCgpLCB3cml0ZV9idWZmZXJfbGVuZ3RoKCkpIDw8ICI+PlxuIiA7CisjZW5kaWYKKyB9CisKKyAgdm9pZCBmbHVzaCgpIG92ZXJyaWRlIHsKKyAgICBpZiAoYmxvY2tlZF8pIHsKKyNpZmRlZiBFTkFCTEVfU1RERVJSX0xPR0dJTkcKKyAgICAgIGNlcnIgPDwgImZsdXNoIHdhcyBibG9ja2VkXG4iIDsKKyNlbmRpZgorICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgVEJ1ZmZlcmVkVHJhbnNwb3J0OjpmbHVzaCgpIDsKKyAgfQorCisgIGJvb2wgYmxvY2tlZF8gOworfSA7CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKCBKU09OX0J1ZmZlcmVkSFRUUCApCit7CisgIHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyU29ja2V0PiBzcyA9IHN0ZDo6bWFrZV9zaGFyZWQ8VFNlcnZlclNvY2tldD4oMCkgOworICBUVGhyZWFkZWRTZXJ2ZXIgc2VydmVyKAorICAgIHN0ZDo6bWFrZV9zaGFyZWQ8b25ld2F5dGVzdDo6T25lV2F5U2VydmljZVByb2Nlc3NvckZhY3Rvcnk+KHN0ZDo6bWFrZV9zaGFyZWQ8T25lV2F5U2VydmljZUNsb25lRmFjdG9yeT4oKSksCisgICAgc3MsIC8vcG9ydAorICAgIHN0ZDo6bWFrZV9zaGFyZWQ8VEh0dHBTZXJ2ZXJUcmFuc3BvcnRGYWN0b3J5PigpLAorICAgIHN0ZDo6bWFrZV9zaGFyZWQ8VEpTT05Qcm90b2NvbEZhY3Rvcnk+KCkpOworCisgIHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyUmVhZHlFdmVudEhhbmRsZXI+IHBFdmVudEhhbmRsZXIobmV3IFRTZXJ2ZXJSZWFkeUV2ZW50SGFuZGxlcikgOworICBzZXJ2ZXIuc2V0U2VydmVyRXZlbnRIYW5kbGVyKHBFdmVudEhhbmRsZXIpOworCisjaWZkZWYgRU5BQkxFX1NUREVSUl9MT0dHSU5HCisgIGNlcnIgPDwgIlN0YXJ0aW5nIHRoZSBzZXJ2ZXIuLi5cbiI7CisjZW5kaWYKKyAgUlBDMFRocmVhZENsYXNzIHQoc2VydmVyKSA7CisgIGJvb3N0Ojp0aHJlYWQgdGhyZWFkKCZSUEMwVGhyZWFkQ2xhc3M6OlJ1biwgJnQpOworCisgIHsKKyAgICBTeW5jaHJvbml6ZWQgc3luYygqKHBFdmVudEhhbmRsZXIuZ2V0KCkpKTsKKyAgICB3aGlsZSAoIXBFdmVudEhhbmRsZXItPmlzTGlzdGVuaW5nKCkpIHsKKyAgICAgIHBFdmVudEhhbmRsZXItPndhaXQoKTsKKyAgICB9CisgIH0KKworICBpbnQgcG9ydCA9IHNzLT5nZXRQb3J0KCkgOworI2lmZGVmIEVOQUJMRV9TVERFUlJfTE9HR0lORworICBjZXJyIDw8ICJwb3J0ICIgPDwgcG9ydCA8PCBlbmRsIDsKKyNlbmRpZgorCisgIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gc29ja2V0KG5ldyBUU29ja2V0KCJsb2NhbGhvc3QiLCBwb3J0KSk7CisgICAgc29ja2V0LT5zZXRSZWN2VGltZW91dCgxMDAwMCkgOyAvLyAxMDAwbXNlYyBzaG91bGQgYmUgZW5vdWdoCisgICAgc3RkOjpzaGFyZWRfcHRyPFRCbG9ja2FibGVCdWZmZXJlZFRyYW5zcG9ydD4gYmxvY2thYmxlX3RyYW5zcG9ydChuZXcgVEJsb2NrYWJsZUJ1ZmZlcmVkVHJhbnNwb3J0KHNvY2tldCkpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQobmV3IFRIdHRwQ2xpZW50KGJsb2NrYWJsZV90cmFuc3BvcnQsICJsb2NhbGhvc3QiLCAiL3NlcnZpY2UiKSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG9jb2wobmV3IFRKU09OUHJvdG9jb2wodHJhbnNwb3J0KSk7CisgICAgb25ld2F5dGVzdDo6T25lV2F5U2VydmljZUNsaWVudCBjbGllbnQocHJvdG9jb2wpOworCisKKyAgICB0cmFuc3BvcnQtPm9wZW4oKTsKKyAgICBjbGllbnQucm91bmRUcmlwUlBDKCk7CisgICAgYmxvY2thYmxlX3RyYW5zcG9ydC0+YmxvY2soKSA7CisgICAgdWludDMyX3Qgc2l6ZTAgPSBibG9ja2FibGVfdHJhbnNwb3J0LT53cml0ZV9idWZmZXJfbGVuZ3RoKCkgOworICAgIGNsaWVudC5zZW5kX29uZVdheVJQQygpIDsKKyAgICB1aW50MzJfdCBzaXplMSA9IGJsb2NrYWJsZV90cmFuc3BvcnQtPndyaXRlX2J1ZmZlcl9sZW5ndGgoKSA7CisgICAgY2xpZW50LnNlbmRfb25lV2F5UlBDKCkgOworICAgIHVpbnQzMl90IHNpemUyID0gYmxvY2thYmxlX3RyYW5zcG9ydC0+d3JpdGVfYnVmZmVyX2xlbmd0aCgpIDsKKyAgICBCT09TVF9DSEVDSygoc2l6ZTEgLSBzaXplMCkgPT0gKHNpemUyIC0gc2l6ZTEpKSA7CisgICAgYmxvY2thYmxlX3RyYW5zcG9ydC0+dW5ibG9jaygpIDsKKyAgICBjbGllbnQuc2VuZF9yb3VuZFRyaXBSUEMoKSA7CisgICAgYmxvY2thYmxlX3RyYW5zcG9ydC0+Zmx1c2goKSA7CisgICAgdHJ5IHsKKyAgICAgIGNsaWVudC5yZWN2X3JvdW5kVHJpcFJQQygpIDsKKyAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIGUpIHsKKyAgICAgIEJPT1NUX0VSUk9SKCAid2Ugc2hvdWxkIG5vdCBnZXQgYSB0cmFuc3BvcnQgZXhjZXB0aW9uIC0tIHRoaXMgbWVhbnMgd2UgZmFpbGVkOiAiICsgc3RkOjpzdHJpbmcoZS53aGF0KCkpICkgOworICAgIH0KKyAgICB0cmFuc3BvcnQtPmNsb3NlKCk7CisgIH0KKyAgc2VydmVyLnN0b3AoKTsKKyAgdGhyZWFkLmpvaW4oKSA7CisjaWZkZWYgRU5BQkxFX1NUREVSUl9MT0dHSU5HCisgIGNlcnIgPDwgImZpbmlzaGVkLlxuIjsKKyNlbmRpZgorfQorCitCT09TVF9BVVRPX1RFU1RfU1VJVEVfRU5EKCkKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9PbmVXYXlUZXN0LnRocmlmdCBiL2xpYi9jcHAvdGVzdC9PbmVXYXlUZXN0LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjdlOWZmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L09uZVdheVRlc3QudGhyaWZ0CkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KKyAqIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCisgKiBkZXRhaWxzLgorICovCisKK25hbWVzcGFjZSBjX2dsaWIgT25lV2F5VGVzdAorbmFtZXNwYWNlIGphdmEgb25ld2F5dGVzdAorbmFtZXNwYWNlIGNwcCBvbmV3YXl0ZXN0CituYW1lc3BhY2UgcmIgT25ld2F5dGVzdAorbmFtZXNwYWNlIHBlcmwgT25lV2F5VGVzdAorbmFtZXNwYWNlIGNzaGFycCBPbmV3YXl0ZXN0CituYW1lc3BhY2UganMgT25lV2F5VGVzdAorbmFtZXNwYWNlIHN0IE9uZVdheVRlc3QKK25hbWVzcGFjZSBweSBPbmVXYXlUZXN0CituYW1lc3BhY2UgcHkudHdpc3RlZCBPbmVXYXlUZXN0CituYW1lc3BhY2UgZ28gb25ld2F5dGVzdAorbmFtZXNwYWNlIHBocCBPbmVXYXlUZXN0CituYW1lc3BhY2UgZGVscGhpIE9uZXdheXRlc3QKK25hbWVzcGFjZSBjb2NvYSBPbmVXYXlUZXN0CituYW1lc3BhY2UgbHVhIE9uZVdheVRlc3QKK25hbWVzcGFjZSB4c2QgdGVzdCAodXJpID0gJ2h0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZy9ucy9PbmVXYXlUZXN0JykKK25hbWVzcGFjZSBuZXRjb3JlIFRocmlmdEFzeW5jLk9uZVdheVRlc3QKKworLy8gYSBtaW5pbWFsIFRocmlmdCBzZXJ2aWNlLCBmb3IgdXNlIGluIE9uZVdheUhUVFBUdGVzdC5jcHAKK3NlcnZpY2UgT25lV2F5U2VydmljZSB7CisgIHZvaWQgcm91bmRUcmlwUlBDKCksCisgIG9uZXdheSB2b2lkIG9uZVdheVJQQygpCit9CmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvT3BlblNTTE1hbnVhbEluaXRUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9PcGVuU1NMTWFudWFsSW5pdFRlc3QuY3BwCmluZGV4IGM0MDNiMTguLmEzMGIzMDMgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvdGVzdC9PcGVuU1NMTWFudWFsSW5pdFRlc3QuY3BwCisrKyBiL2xpYi9jcHAvdGVzdC9PcGVuU1NMTWFudWFsSW5pdFRlc3QuY3BwCkBAIC0yMCwxNCArMjAsMTQgQEAKIC8vIE1BTlVBTF9PUEVOU1NMX0lOSVQgdG8gMCB0byBjYXVzZSBhdXRvbWF0aWMgT3BlblNTTCBpbml0L2NsZWFudXAsCiAvLyB3aGljaCB3aWxsIGNhdXNlIHRoZSB0ZXN0IHRvIGZhaWwKICNkZWZpbmUgTUFOVUFMX09QRU5TU0xfSU5JVCAxCisjaWZkZWYgX1dJTjMyCisjaW5jbHVkZSA8V2luU29jazIuaD4KKyNlbmRpZgogCiAjaW5jbHVkZSA8Ym9vc3QvdGVzdC91bml0X3Rlc3QuaHBwPgotCiAjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KLQogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNTTFNvY2tldC5oPgogCi11c2luZyBuYW1lc3BhY2Ugc3RkOwogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7CiAKIHZvaWQgbWFrZV9pc29sYXRlZF9zc2xzb2NrZXRmYWN0b3J5KCkgewpAQCAtNjYsMTIgKzY2LDI4IEBACiAgIG9wZW5zc2xfY2xlYW51cCgpOwogfQogCisjaWZkZWYgQk9PU1RfVEVTVF9EWU5fTElOSworYm9vbCBpbml0X3VuaXRfdGVzdF9zdWl0ZSgpIHsKKyAgYm9vc3Q6OnVuaXRfdGVzdDo6dGVzdF9zdWl0ZSogc3VpdGUgPSAmYm9vc3Q6OnVuaXRfdGVzdDo6ZnJhbWV3b3JrOjptYXN0ZXJfdGVzdF9zdWl0ZSgpOworICBzdWl0ZS0+cF9uYW1lLnZhbHVlID0gIk9wZW5TU0xNYW51YWxJbml0IjsKKworICBzdWl0ZS0+YWRkKEJPT1NUX1RFU1RfQ0FTRSh0ZXN0X29wZW5zc2xfYXZhaWxhYmlsaXR5KSk7CisKKyAgcmV0dXJuIHRydWU7Cit9CisgCitpbnQgbWFpbiggaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSApIHsKKyAgcmV0dXJuIDo6Ym9vc3Q6OnVuaXRfdGVzdDo6dW5pdF90ZXN0X21haW4oJmluaXRfdW5pdF90ZXN0X3N1aXRlLGFyZ2MsYXJndik7Cit9CisjZWxzZQogYm9vc3Q6OnVuaXRfdGVzdDo6dGVzdF9zdWl0ZSogaW5pdF91bml0X3Rlc3Rfc3VpdGUoaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgewotICBib29zdDo6dW5pdF90ZXN0Ojp0ZXN0X3N1aXRlKiBzdWl0ZSA9Ci0gICAgJmJvb3N0Ojp1bml0X3Rlc3Q6OmZyYW1ld29yazo6bWFzdGVyX3Rlc3Rfc3VpdGUoKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRShhcmdjKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRShhcmd2KTsKKyAgYm9vc3Q6OnVuaXRfdGVzdDo6dGVzdF9zdWl0ZSogc3VpdGUgPSAmYm9vc3Q6OnVuaXRfdGVzdDo6ZnJhbWV3b3JrOjptYXN0ZXJfdGVzdF9zdWl0ZSgpOwogICBzdWl0ZS0+cF9uYW1lLnZhbHVlID0gIk9wZW5TU0xNYW51YWxJbml0IjsKIAogICBzdWl0ZS0+YWRkKEJPT1NUX1RFU1RfQ0FTRSh0ZXN0X29wZW5zc2xfYXZhaWxhYmlsaXR5KSk7CiAKICAgcmV0dXJuIE5VTEw7CiB9CisjZW5kaWYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvT3B0aW9uYWxSZXF1aXJlZFRlc3QuY3BwIGIvbGliL2NwcC90ZXN0L09wdGlvbmFsUmVxdWlyZWRUZXN0LmNwcAppbmRleCA0NGI2ODg1Li40YzQzNTQ2IDEwMDY0NAotLS0gYS9saWIvY3BwL3Rlc3QvT3B0aW9uYWxSZXF1aXJlZFRlc3QuY3BwCisrKyBiL2xpYi9jcHAvdGVzdC9PcHRpb25hbFJlcXVpcmVkVGVzdC5jcHAKQEAgLTIxLDI0MiArMjEsMzY2IEBACiAgKiBkZXRhaWxzLgogICovCiAKLSNpbmNsdWRlIDxjYXNzZXJ0PgogI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KICNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVERlYnVnUHJvdG9jb2wuaD4KICNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgogI2luY2x1ZGUgImdlbi1jcHAvT3B0aW9uYWxSZXF1aXJlZFRlc3RfdHlwZXMuaCIKIAotdXNpbmcgc3RkOjpjb3V0OwotdXNpbmcgc3RkOjplbmRsOwotdXNpbmcgc3RkOjptYXA7Ci11c2luZyBzdGQ6OnN0cmluZzsKKyNkZWZpbmUgQk9PU1RfVEVTVF9NT0RVTEUgT3B0aW9uYWxSZXF1aXJlZFRlc3QKKyNpbmNsdWRlIDxib29zdC90ZXN0L3VuaXRfdGVzdC5ocHA+CisKIHVzaW5nIG5hbWVzcGFjZSB0aHJpZnQ6OnRlc3Q7CiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ7CiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDsKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w7CiAKLQogLyoKIHRlbXBsYXRlPHR5cGVuYW1lIFN0cnVjdD4KIHZvaWQgdHJ5d3JpdGUoY29uc3QgU3RydWN0JiBzLCBib29sIHNob3VsZF93b3JrKSB7CiAgIGJvb2wgd29ya2VkOwogICB0cnkgewotICAgIFRCaW5hcnlQcm90b2NvbCBwcm90b2NvbChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PihuZXcgVE1lbW9yeUJ1ZmZlcikpOworICAgIFRCaW5hcnlQcm90b2NvbCBwcm90b2NvbChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4obmV3IFRNZW1vcnlCdWZmZXIpKTsKICAgICBzLndyaXRlKCZwcm90b2NvbCk7CiAgICAgd29ya2VkID0gdHJ1ZTsKICAgfSBjYXRjaCAoVFByb3RvY29sRXhjZXB0aW9uICYgZXgpIHsKICAgICB3b3JrZWQgPSBmYWxzZTsKICAgfQotICBhc3NlcnQod29ya2VkID09IHNob3VsZF93b3JrKTsKKyAgQk9PU1RfQ0hFQ0sod29ya2VkID09IHNob3VsZF93b3JrKTsKIH0KICovCiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBTdHJ1Y3QxLCB0eXBlbmFtZSBTdHJ1Y3QyPgotdm9pZCB3cml0ZV90b19yZWFkKGNvbnN0IFN0cnVjdDEgJiB3LCBTdHJ1Y3QyICYgcikgewotICBUQmluYXJ5UHJvdG9jb2wgcHJvdG9jb2woYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4obmV3IFRNZW1vcnlCdWZmZXIpKTsKK3ZvaWQgd3JpdGVfdG9fcmVhZChjb25zdCBTdHJ1Y3QxJiB3LCBTdHJ1Y3QyJiByKSB7CisgIFRCaW5hcnlQcm90b2NvbCBwcm90b2NvbChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4obmV3IFRNZW1vcnlCdWZmZXIpKTsKICAgdy53cml0ZSgmcHJvdG9jb2wpOwogICByLnJlYWQoJnByb3RvY29sKTsKIH0KIAorQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9vcHRpb25hbF9yZXF1aXJlZF8xKSB7CisgIE9sZFNjaG9vbCBvOwogCi1pbnQgbWFpbigpIHsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0KAorICAgICJPbGRTY2hvb2wge1xuIgorICAgICIgIDAxOiBpbV9pbnQgKGkxNikgPSAwLFxuIgorICAgICIgIDAyOiBpbV9zdHIgKHN0cmluZykgPSBcIlwiLFxuIgorICAgICIgIDAzOiBpbV9iaWcgKGxpc3QpID0gbGlzdDxtYXA+WzBdIHtcbiIKKyAgICAiICB9LFxuIgorICAgICJ9Iik7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIHJlc3VsdChhcGFjaGU6OnRocmlmdDo6VGhyaWZ0RGVidWdTdHJpbmcobykpOwogCi0gIGNvdXQgPDwgIlRoaXMgb2xkIHNjaG9vbCBzdHJ1Y3Qgc2hvdWxkIGhhdmUgdGhyZWUgZmllbGRzLiIgPDwgZW5kbDsKLSAgewotICAgIE9sZFNjaG9vbCBvOwotICAgIGNvdXQgPDwgVGhyaWZ0RGVidWdTdHJpbmcobykgPDwgZW5kbDsKLSAgfQotICBjb3V0IDw8IGVuZGw7CisgIEJPT1NUX0NIRUNLX01FU1NBR0UoIWV4cGVjdGVkX3Jlc3VsdC5jb21wYXJlKHJlc3VsdCksCisgICAgIkV4cGVjdGVkOlxuIiA8PCBleHBlY3RlZF9yZXN1bHQgPDwgIlxuR290dGVuOlxuIiA8PCByZXN1bHQpOworfQogCi0gIGNvdXQgPDwgIlNldHRpbmcgYSB2YWx1ZSBiZWZvcmUgc2V0dGluZyBpc3NldC4iIDw8IGVuZGw7Ci0gIHsKLSAgICBTaW1wbGUgczsKLSAgICBjb3V0IDw8IFRocmlmdERlYnVnU3RyaW5nKHMpIDw8IGVuZGw7Ci0gICAgcy5pbV9vcHRpb25hbCA9IDEwOwotICAgIGNvdXQgPDwgVGhyaWZ0RGVidWdTdHJpbmcocykgPDwgZW5kbDsKLSAgICBzLl9faXNzZXQuaW1fb3B0aW9uYWwgPSB0cnVlOwotICAgIGNvdXQgPDwgVGhyaWZ0RGVidWdTdHJpbmcocykgPDwgZW5kbDsKLSAgfQotICBjb3V0IDw8IGVuZGw7CitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X29wdGlvbmFsX3JlcXVpcmVkXzJfMSkgeworICBTaW1wbGUgczsKIAotICBjb3V0IDw8ICJTZXR0aW5nIGlzc2V0IGJlZm9yZSBzZXR0aW5nIGEgdmFsdWUuIiA8PCBlbmRsOwotICB7Ci0gICAgU2ltcGxlIHM7Ci0gICAgY291dCA8PCBUaHJpZnREZWJ1Z1N0cmluZyhzKSA8PCBlbmRsOwotICAgIHMuX19pc3NldC5pbV9vcHRpb25hbCA9IHRydWU7Ci0gICAgY291dCA8PCBUaHJpZnREZWJ1Z1N0cmluZyhzKSA8PCBlbmRsOwotICAgIHMuaW1fb3B0aW9uYWwgPSAxMDsKLSAgICBjb3V0IDw8IFRocmlmdERlYnVnU3RyaW5nKHMpIDw8IGVuZGw7Ci0gIH0KLSAgY291dCA8PCBlbmRsOworICBjb25zdCBzdGQ6OnN0cmluZyBleHBlY3RlZF9yZXN1bHQoCisgICAgIlNpbXBsZSB7XG4iCisgICAgIiAgMDE6IGltX2RlZmF1bHQgKGkxNikgPSAwLFxuIgorICAgICIgIDAyOiBpbV9yZXF1aXJlZCAoaTE2KSA9IDAsXG4iCisgICAgIn0iKTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgcmVzdWx0KGFwYWNoZTo6dGhyaWZ0OjpUaHJpZnREZWJ1Z1N0cmluZyhzKSk7CiAKKyAgQk9PU1RfQ0hFQ0tfTUVTU0FHRSghZXhwZWN0ZWRfcmVzdWx0LmNvbXBhcmUocmVzdWx0KSwKKyAgICAiRXhwZWN0ZWQ6XG4iIDw8IGV4cGVjdGVkX3Jlc3VsdCA8PCAiXG5Hb3R0ZW46XG4iIDw8IHJlc3VsdCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3Rfb3B0aW9uYWxfcmVxdWlyZWRfMl8yKSB7CisgIFNpbXBsZSBzOworICBzLmltX29wdGlvbmFsID0gMTA7CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0KAorICAgICJTaW1wbGUge1xuIgorICAgICIgIDAxOiBpbV9kZWZhdWx0IChpMTYpID0gMCxcbiIKKyAgICAiICAwMjogaW1fcmVxdWlyZWQgKGkxNikgPSAwLFxuIgorICAgICJ9Iik7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIHJlc3VsdChhcGFjaGU6OnRocmlmdDo6VGhyaWZ0RGVidWdTdHJpbmcocykpOworCisgIEJPT1NUX0NIRUNLX01FU1NBR0UoIWV4cGVjdGVkX3Jlc3VsdC5jb21wYXJlKHJlc3VsdCksCisgICAgIkV4cGVjdGVkOlxuIiA8PCBleHBlY3RlZF9yZXN1bHQgPDwgIlxuR290dGVuOlxuIiA8PCByZXN1bHQpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X29wdGlvbmFsX3JlcXVpcmVkXzJfMykgeworICBTaW1wbGUgczsKKyAgcy5pbV9vcHRpb25hbCA9IDEwOworICBzLl9faXNzZXQuaW1fb3B0aW9uYWwgPSB0cnVlOworCisgIGNvbnN0IHN0ZDo6c3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCgKKyAgICAiU2ltcGxlIHtcbiIKKyAgICAiICAwMTogaW1fZGVmYXVsdCAoaTE2KSA9IDAsXG4iCisgICAgIiAgMDI6IGltX3JlcXVpcmVkIChpMTYpID0gMCxcbiIKKyAgICAiICAwMzogaW1fb3B0aW9uYWwgKGkxNikgPSAxMCxcbiIKKyAgICAifSIpOworICBjb25zdCBzdGQ6OnN0cmluZyByZXN1bHQoYXBhY2hlOjp0aHJpZnQ6OlRocmlmdERlYnVnU3RyaW5nKHMpKTsKKworICBCT09TVF9DSEVDS19NRVNTQUdFKCFleHBlY3RlZF9yZXN1bHQuY29tcGFyZShyZXN1bHQpLAorICAgICJFeHBlY3RlZDpcbiIgPDwgZXhwZWN0ZWRfcmVzdWx0IDw8ICJcbkdvdHRlbjpcbiIgPDwgcmVzdWx0KTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9vcHRpb25hbF9yZXF1aXJlZF8yXzQpIHsKKyAgU2ltcGxlIHM7CisgIHMuX19pc3NldC5pbV9vcHRpb25hbCA9IHRydWU7CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0KAorICAgICJTaW1wbGUge1xuIgorICAgICIgIDAxOiBpbV9kZWZhdWx0IChpMTYpID0gMCxcbiIKKyAgICAiICAwMjogaW1fcmVxdWlyZWQgKGkxNikgPSAwLFxuIgorICAgICIgIDAzOiBpbV9vcHRpb25hbCAoaTE2KSA9IDAsXG4iCisgICAgIn0iKTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgcmVzdWx0KGFwYWNoZTo6dGhyaWZ0OjpUaHJpZnREZWJ1Z1N0cmluZyhzKSk7CisKKyAgQk9PU1RfQ0hFQ0tfTUVTU0FHRSghZXhwZWN0ZWRfcmVzdWx0LmNvbXBhcmUocmVzdWx0KSwKKyAgICAiRXhwZWN0ZWQ6XG4iIDw8IGV4cGVjdGVkX3Jlc3VsdCA8PCAiXG5Hb3R0ZW46XG4iIDw8IHJlc3VsdCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3Rfb3B0aW9uYWxfcmVxdWlyZWRfMl81KSB7CisgIFNpbXBsZSBzOworICBzLl9faXNzZXQuaW1fb3B0aW9uYWwgPSB0cnVlOworICBzLmltX29wdGlvbmFsID0gMTA7CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0KAorICAgICJTaW1wbGUge1xuIgorICAgICIgIDAxOiBpbV9kZWZhdWx0IChpMTYpID0gMCxcbiIKKyAgICAiICAwMjogaW1fcmVxdWlyZWQgKGkxNikgPSAwLFxuIgorICAgICIgIDAzOiBpbV9vcHRpb25hbCAoaTE2KSA9IDEwLFxuIgorICAgICJ9Iik7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIHJlc3VsdChhcGFjaGU6OnRocmlmdDo6VGhyaWZ0RGVidWdTdHJpbmcocykpOworCisgIEJPT1NUX0NIRUNLX01FU1NBR0UoIWV4cGVjdGVkX3Jlc3VsdC5jb21wYXJlKHJlc3VsdCksCisgICAgIkV4cGVjdGVkOlxuIiA8PCBleHBlY3RlZF9yZXN1bHQgPDwgIlxuR290dGVuOlxuIiA8PCByZXN1bHQpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X29wdGlvbmFsX3JlcXVpcmVkXzMpIHsKKyAgLy8gYXNzaWduL2NvcHktY29uc3RydWN0IHdpdGggbm9uLXJlcXVpcmVkIGZpZWxkcworCisgIFNpbXBsZSBzMSwgczI7CisgIHMxLl9faXNzZXQuaW1fZGVmYXVsdCA9IHRydWU7CisgIHMxLl9fc2V0X2ltX29wdGlvbmFsKDEwKTsKKyAgQk9PU1RfQ0hFQ0soczEuX19pc3NldC5pbV9kZWZhdWx0KTsKKyAgQk9PU1RfQ0hFQ0soczEuX19pc3NldC5pbV9vcHRpb25hbCk7CisKKyAgczIgPSBzMTsKKworICBCT09TVF9DSEVDSyhzMi5fX2lzc2V0LmltX2RlZmF1bHQpOworICBCT09TVF9DSEVDSyhzMi5fX2lzc2V0LmltX29wdGlvbmFsKTsKKworICBTaW1wbGUgczMoczEpOworCisgIEJPT1NUX0NIRUNLKHMzLl9faXNzZXQuaW1fZGVmYXVsdCk7CisgIEJPT1NUX0NIRUNLKHMzLl9faXNzZXQuaW1fb3B0aW9uYWwpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X29wdGlvbmFsX3JlcXVpcmVkXzQpIHsKICAgLy8gV3JpdGUtdG8tcmVhZCB3aXRoIG9wdGlvbmFsIGZpZWxkcy4KLSAgewotICAgIFNpbXBsZSBzMSwgczIsIHMzOwotICAgIHMxLmltX29wdGlvbmFsID0gMTA7Ci0gICAgYXNzZXJ0KCFzMS5fX2lzc2V0LmltX2RlZmF1bHQpOwotICAvL2Fzc2VydCghczEuX19pc3NldC5pbV9yZXF1aXJlZCk7ICAvLyBDb21waWxlIGVycm9yLgotICAgIGFzc2VydCghczEuX19pc3NldC5pbV9vcHRpb25hbCk7CiAKLSAgICB3cml0ZV90b19yZWFkKHMxLCBzMik7CisgIFNpbXBsZSBzMSwgczIsIHMzOworICBzMS5pbV9vcHRpb25hbCA9IDEwOworICBCT09TVF9DSEVDSyghczEuX19pc3NldC5pbV9kZWZhdWx0KTsKKyAgLy8gQk9PU1RfQ0hFQ0soIXMxLl9faXNzZXQuaW1fcmVxdWlyZWQpOyAgLy8gQ29tcGlsZSBlcnJvci4KKyAgQk9PU1RfQ0hFQ0soIXMxLl9faXNzZXQuaW1fb3B0aW9uYWwpOwogCi0gICAgYXNzZXJ0KCBzMi5fX2lzc2V0LmltX2RlZmF1bHQpOwotICAvL2Fzc2VydCggczIuX19pc3NldC5pbV9yZXF1aXJlZCk7ICAvLyBDb21waWxlIGVycm9yLgotICAgIGFzc2VydCghczIuX19pc3NldC5pbV9vcHRpb25hbCk7Ci0gICAgYXNzZXJ0KHMzLmltX29wdGlvbmFsID09IDApOworICB3cml0ZV90b19yZWFkKHMxLCBzMik7CiAKLSAgICBzMS5fX2lzc2V0LmltX29wdGlvbmFsID0gdHJ1ZTsKLSAgICB3cml0ZV90b19yZWFkKHMxLCBzMyk7CisgIEJPT1NUX0NIRUNLKHMyLl9faXNzZXQuaW1fZGVmYXVsdCk7CisgIC8vIEJPT1NUX0NIRUNLKCBzMi5fX2lzc2V0LmltX3JlcXVpcmVkKTsgIC8vIENvbXBpbGUgZXJyb3IuCisgIEJPT1NUX0NIRUNLKCFzMi5fX2lzc2V0LmltX29wdGlvbmFsKTsKKyAgQk9PU1RfQ0hFQ0soczMuaW1fb3B0aW9uYWwgPT0gMCk7CiAKLSAgICBhc3NlcnQoIHMzLl9faXNzZXQuaW1fZGVmYXVsdCk7Ci0gIC8vYXNzZXJ0KCBzMy5fX2lzc2V0LmltX3JlcXVpcmVkKTsgIC8vIENvbXBpbGUgZXJyb3IuCi0gICAgYXNzZXJ0KCBzMy5fX2lzc2V0LmltX29wdGlvbmFsKTsKLSAgICBhc3NlcnQoczMuaW1fb3B0aW9uYWwgPT0gMTApOwotICB9CisgIHMxLl9faXNzZXQuaW1fb3B0aW9uYWwgPSB0cnVlOworICB3cml0ZV90b19yZWFkKHMxLCBzMyk7CiAKKyAgQk9PU1RfQ0hFQ0soczMuX19pc3NldC5pbV9kZWZhdWx0KTsKKyAgLy8gQk9PU1RfQ0hFQ0soIHMzLl9faXNzZXQuaW1fcmVxdWlyZWQpOyAgLy8gQ29tcGlsZSBlcnJvci4KKyAgQk9PU1RfQ0hFQ0soczMuX19pc3NldC5pbV9vcHRpb25hbCk7CisgIEJPT1NUX0NIRUNLKHMzLmltX29wdGlvbmFsID09IDEwKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9vcHRpb25hbF9yZXF1aXJlZF81KSB7CiAgIC8vIFdyaXRpbmcgYmV0d2VlbiBvcHRpb25hbCBhbmQgZGVmYXVsdC4KLSAgewotICAgIFRyaWNreTEgdDE7Ci0gICAgVHJpY2t5MiB0MjsKIAotICAgIHQyLmltX29wdGlvbmFsID0gMTA7Ci0gICAgd3JpdGVfdG9fcmVhZCh0MiwgdDEpOwotICAgIHdyaXRlX3RvX3JlYWQodDEsIHQyKTsKLSAgICBhc3NlcnQoIXQxLl9faXNzZXQuaW1fZGVmYXVsdCk7Ci0gICAgYXNzZXJ0KCB0Mi5fX2lzc2V0LmltX29wdGlvbmFsKTsKLSAgICBhc3NlcnQodDEuaW1fZGVmYXVsdCA9PSB0Mi5pbV9vcHRpb25hbCk7Ci0gICAgYXNzZXJ0KHQxLmltX2RlZmF1bHQgPT0gMCk7Ci0gIH0KKyAgVHJpY2t5MSB0MTsKKyAgVHJpY2t5MiB0MjsKIAorICB0Mi5pbV9vcHRpb25hbCA9IDEwOworICB3cml0ZV90b19yZWFkKHQyLCB0MSk7CisgIHdyaXRlX3RvX3JlYWQodDEsIHQyKTsKKyAgQk9PU1RfQ0hFQ0soIXQxLl9faXNzZXQuaW1fZGVmYXVsdCk7CisgIEJPT1NUX0NIRUNLKHQyLl9faXNzZXQuaW1fb3B0aW9uYWwpOworICBCT09TVF9DSEVDSyh0MS5pbV9kZWZhdWx0ID09IHQyLmltX29wdGlvbmFsKTsKKyAgQk9PU1RfQ0hFQ0sodDEuaW1fZGVmYXVsdCA9PSAwKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9vcHRpb25hbF9yZXF1aXJlZF82KSB7CiAgIC8vIFdyaXRpbmcgYmV0d2VlbiBkZWZhdWx0IGFuZCByZXF1aXJlZC4KLSAgewotICAgIFRyaWNreTEgdDE7Ci0gICAgVHJpY2t5MyB0MzsKLSAgICB3cml0ZV90b19yZWFkKHQxLCB0Myk7Ci0gICAgd3JpdGVfdG9fcmVhZCh0MywgdDEpOwotICAgIGFzc2VydCh0MS5fX2lzc2V0LmltX2RlZmF1bHQpOwotICB9CiAKKyAgVHJpY2t5MSB0MTsKKyAgVHJpY2t5MyB0MzsKKyAgd3JpdGVfdG9fcmVhZCh0MSwgdDMpOworICB3cml0ZV90b19yZWFkKHQzLCB0MSk7CisgIEJPT1NUX0NIRUNLKHQxLl9faXNzZXQuaW1fZGVmYXVsdCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3Rfb3B0aW9uYWxfcmVxdWlyZWRfNykgewogICAvLyBXcml0aW5nIGJldHdlZW4gb3B0aW9uYWwgYW5kIHJlcXVpcmVkLgotICB7Ci0gICAgVHJpY2t5MiB0MjsKLSAgICBUcmlja3kzIHQzOwotICAgIHQyLl9faXNzZXQuaW1fb3B0aW9uYWwgPSB0cnVlOwotICAgIHdyaXRlX3RvX3JlYWQodDIsIHQzKTsKLSAgICB3cml0ZV90b19yZWFkKHQzLCB0Mik7Ci0gIH0KIAorICBUcmlja3kyIHQyOworICBUcmlja3kzIHQzOworICB0Mi5fX2lzc2V0LmltX29wdGlvbmFsID0gdHJ1ZTsKKyAgd3JpdGVfdG9fcmVhZCh0MiwgdDMpOworICB3cml0ZV90b19yZWFkKHQzLCB0Mik7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3Rfb3B0aW9uYWxfcmVxdWlyZWRfOCkgewogICAvLyBNdS1odS1oYS1oYS1oYSEKLSAgewotICAgIFRyaWNreTIgdDI7Ci0gICAgVHJpY2t5MyB0MzsKLSAgICB0cnkgewotICAgICAgd3JpdGVfdG9fcmVhZCh0MiwgdDMpOwotICAgICAgYWJvcnQoKTsKLSAgICB9Ci0gICAgY2F0Y2ggKGNvbnN0IFRQcm90b2NvbEV4Y2VwdGlvbiYpIHt9CiAKLSAgICB3cml0ZV90b19yZWFkKHQzLCB0Mik7Ci0gICAgYXNzZXJ0KHQyLl9faXNzZXQuaW1fb3B0aW9uYWwpOworICBUcmlja3kyIHQyOworICBUcmlja3kzIHQzOworICB0cnkgeworICAgIHdyaXRlX3RvX3JlYWQodDIsIHQzKTsKKyAgICBhYm9ydCgpOworICB9IGNhdGNoIChjb25zdCBUUHJvdG9jb2xFeGNlcHRpb24mKSB7CiAgIH0KIAotICBjb3V0IDw8ICJDb21wbGV4IHN0cnVjdCwgc2ltcGxlIHRlc3QuIiA8PCBlbmRsOwotICB7Ci0gICAgQ29tcGxleCBjOwotICAgIGNvdXQgPDwgVGhyaWZ0RGVidWdTdHJpbmcoYykgPDwgZW5kbDsKLSAgfQorICB3cml0ZV90b19yZWFkKHQzLCB0Mik7CisgIEJPT1NUX0NIRUNLKHQyLl9faXNzZXQuaW1fb3B0aW9uYWwpOworfQogCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X29wdGlvbmFsX3JlcXVpcmVkXzkpIHsKKyAgQ29tcGxleCBjOwogCi0gIHsKLSAgICBUcmlja3kxIHQxOwotICAgIFRyaWNreTIgdDI7Ci0gICAgLy8gQ29tcGlsZSBlcnJvci4KLSAgICAvLyh2b2lkKSh0MSA9PSB0Mik7Ci0gIH0KKyAgY29uc3Qgc3RkOjpzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0KAorICAgICJDb21wbGV4IHtcbiIKKyAgICAiICAwMTogY3BfZGVmYXVsdCAoaTE2KSA9IDAsXG4iCisgICAgIiAgMDI6IGNwX3JlcXVpcmVkIChpMTYpID0gMCxcbiIKKyAgICAiICAwNDogdGhlX21hcCAobWFwKSA9IG1hcDxpMTYsc3RydWN0PlswXSB7XG4iCisgICAgIiAgfSxcbiIKKyAgICAiICAwNTogcmVxX3NpbXAgKHN0cnVjdCkgPSBTaW1wbGUge1xuIgorICAgICIgICAgMDE6IGltX2RlZmF1bHQgKGkxNikgPSAwLFxuIgorICAgICIgICAgMDI6IGltX3JlcXVpcmVkIChpMTYpID0gMCxcbiIKKyAgICAiICB9LFxuIgorICAgICJ9Iik7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIHJlc3VsdChhcGFjaGU6OnRocmlmdDo6VGhyaWZ0RGVidWdTdHJpbmcoYykpOwogCi0gIHsKLSAgICBPbGRTY2hvb2wgbzEsIG8yLCBvMzsKLSAgICBhc3NlcnQobzEgPT0gbzIpOwotICAgIG8xLmltX2ludCA9IG8yLmltX2ludCA9IDEwOwotICAgIGFzc2VydChvMSA9PSBvMik7Ci0gICAgbzEuX19pc3NldC5pbV9pbnQgPSB0cnVlOwotICAgIG8yLl9faXNzZXQuaW1faW50ID0gZmFsc2U7Ci0gICAgYXNzZXJ0KG8xID09IG8yKTsKLSAgICBvMS5pbV9pbnQgPSAyMDsKLSAgICBvMS5fX2lzc2V0LmltX2ludCA9IGZhbHNlOwotICAgIGFzc2VydChvMSAhPSBvMik7Ci0gICAgbzEuaW1faW50ID0gMTA7Ci0gICAgYXNzZXJ0KG8xID09IG8yKTsKLSAgICBvMS5pbV9zdHIgPSBvMi5pbV9zdHIgPSAiZm9vIjsKLSAgICBhc3NlcnQobzEgPT0gbzIpOwotICAgIG8xLl9faXNzZXQuaW1fc3RyID0gbzIuX19pc3NldC5pbV9zdHIgPSB0cnVlOwotICAgIGFzc2VydChvMSA9PSBvMik7Ci0gICAgbWFwPGludDMyX3Qsc3RyaW5nPiBteW1hcDsKLSAgICBteW1hcFsxXSA9ICJiYXIiOwotICAgIG15bWFwWzJdID0gImJheiI7Ci0gICAgbzEuaW1fYmlnLnB1c2hfYmFjayhtYXA8aW50MzJfdCxzdHJpbmc+KCkpOwotICAgIGFzc2VydChvMSAhPSBvMik7Ci0gICAgbzIuaW1fYmlnLnB1c2hfYmFjayhtYXA8aW50MzJfdCxzdHJpbmc+KCkpOwotICAgIGFzc2VydChvMSA9PSBvMik7Ci0gICAgbzIuaW1fYmlnLnB1c2hfYmFjayhteW1hcCk7Ci0gICAgYXNzZXJ0KG8xICE9IG8yKTsKLSAgICBvMS5pbV9iaWcucHVzaF9iYWNrKG15bWFwKTsKLSAgICBhc3NlcnQobzEgPT0gbzIpOworICBCT09TVF9DSEVDS19NRVNTQUdFKCFleHBlY3RlZF9yZXN1bHQuY29tcGFyZShyZXN1bHQpLAorICAgICJFeHBlY3RlZDpcbiIgPDwgZXhwZWN0ZWRfcmVzdWx0IDw8ICJcbkdvdHRlbjpcbiIgPDwgcmVzdWx0KTsKK30KIAotICAgIFRCaW5hcnlQcm90b2NvbCBwcm90b2NvbChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PihuZXcgVE1lbW9yeUJ1ZmZlcikpOwotICAgIG8xLndyaXRlKCZwcm90b2NvbCk7CitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X29wdGlvbmFsX3JlcXVpcmVkXzEwKSB7CisgIFRyaWNreTEgdDE7CisgIFRyaWNreTIgdDI7CisgIC8vIENvbXBpbGUgZXJyb3IuCisgIC8vKHZvaWQpKHQxID09IHQyKTsKK30KIAotICAgIG8xLmltX2JpZy5wdXNoX2JhY2sobXltYXApOwotICAgIG15bWFwWzNdID0gInF1eCI7Ci0gICAgbzIuaW1fYmlnLnB1c2hfYmFjayhteW1hcCk7Ci0gICAgYXNzZXJ0KG8xICE9IG8yKTsKLSAgICBvMS5pbV9iaWcuYmFjaygpWzNdID0gInF1eCI7Ci0gICAgYXNzZXJ0KG8xID09IG8yKTsKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3Rfb3B0aW9uYWxfcmVxdWlyZWRfMTEpIHsKKyAgT2xkU2Nob29sIG8xLCBvMiwgbzM7CisgIEJPT1NUX0NIRUNLKG8xID09IG8yKTsKKyAgbzEuaW1faW50ID0gbzIuaW1faW50ID0gMTA7CisgIEJPT1NUX0NIRUNLKG8xID09IG8yKTsKKyAgbzEuX19pc3NldC5pbV9pbnQgPSB0cnVlOworICBvMi5fX2lzc2V0LmltX2ludCA9IGZhbHNlOworICBCT09TVF9DSEVDSyhvMSA9PSBvMik7CisgIG8xLmltX2ludCA9IDIwOworICBvMS5fX2lzc2V0LmltX2ludCA9IGZhbHNlOworICBCT09TVF9DSEVDSyhvMSAhPSBvMik7CisgIG8xLmltX2ludCA9IDEwOworICBCT09TVF9DSEVDSyhvMSA9PSBvMik7CisgIG8xLmltX3N0ciA9IG8yLmltX3N0ciA9ICJmb28iOworICBCT09TVF9DSEVDSyhvMSA9PSBvMik7CisgIG8xLl9faXNzZXQuaW1fc3RyID0gbzIuX19pc3NldC5pbV9zdHIgPSB0cnVlOworICBCT09TVF9DSEVDSyhvMSA9PSBvMik7CisgIHN0ZDo6bWFwPGludDMyX3QsIHN0ZDo6c3RyaW5nPiBteW1hcDsKKyAgbXltYXBbMV0gPSAiYmFyIjsKKyAgbXltYXBbMl0gPSAiYmF6IjsKKyAgbzEuaW1fYmlnLnB1c2hfYmFjayhzdGQ6Om1hcDxpbnQzMl90LCBzdGQ6OnN0cmluZz4oKSk7CisgIEJPT1NUX0NIRUNLKG8xICE9IG8yKTsKKyAgbzIuaW1fYmlnLnB1c2hfYmFjayhzdGQ6Om1hcDxpbnQzMl90LCBzdGQ6OnN0cmluZz4oKSk7CisgIEJPT1NUX0NIRUNLKG8xID09IG8yKTsKKyAgbzIuaW1fYmlnLnB1c2hfYmFjayhteW1hcCk7CisgIEJPT1NUX0NIRUNLKG8xICE9IG8yKTsKKyAgbzEuaW1fYmlnLnB1c2hfYmFjayhteW1hcCk7CisgIEJPT1NUX0NIRUNLKG8xID09IG8yKTsKIAotICAgIG8zLnJlYWQoJnByb3RvY29sKTsKLSAgICBvMy5pbV9iaWcucHVzaF9iYWNrKG15bWFwKTsKLSAgICBhc3NlcnQobzEgPT0gbzMpOworICBUQmluYXJ5UHJvdG9jb2wgcHJvdG9jb2woc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+KG5ldyBUTWVtb3J5QnVmZmVyKSk7CisgIG8xLndyaXRlKCZwcm90b2NvbCk7CiAKLSAgICAvL2NvdXQgPDwgVGhyaWZ0RGVidWdTdHJpbmcobzMpIDw8IGVuZGw7Ci0gIH0KKyAgbzEuaW1fYmlnLnB1c2hfYmFjayhteW1hcCk7CisgIG15bWFwWzNdID0gInF1eCI7CisgIG8yLmltX2JpZy5wdXNoX2JhY2sobXltYXApOworICBCT09TVF9DSEVDSyhvMSAhPSBvMik7CisgIG8xLmltX2JpZy5iYWNrKClbM10gPSAicXV4IjsKKyAgQk9PU1RfQ0hFQ0sobzEgPT0gbzIpOworICAKKyAgbzMucmVhZCgmcHJvdG9jb2wpOworICBvMy5pbV9iaWcucHVzaF9iYWNrKG15bWFwKTsKKyAgQk9PU1RfQ0hFQ0sobzEgPT0gbzMpOwogCi0gIHsKLSAgICBUcmlja3kyIHQxLCB0MjsKLSAgICBhc3NlcnQodDEuX19pc3NldC5pbV9vcHRpb25hbCA9PSBmYWxzZSk7Ci0gICAgYXNzZXJ0KHQyLl9faXNzZXQuaW1fb3B0aW9uYWwgPT0gZmFsc2UpOwotICAgIGFzc2VydCh0MSA9PSB0Mik7Ci0gICAgdDEuaW1fb3B0aW9uYWwgPSA1OwotICAgIGFzc2VydCh0MSA9PSB0Mik7Ci0gICAgdDIuaW1fb3B0aW9uYWwgPSA1OwotICAgIGFzc2VydCh0MSA9PSB0Mik7Ci0gICAgdDEuX19pc3NldC5pbV9vcHRpb25hbCA9IHRydWU7Ci0gICAgYXNzZXJ0KHQxICE9IHQyKTsKLSAgICB0Mi5fX2lzc2V0LmltX29wdGlvbmFsID0gdHJ1ZTsKLSAgICBhc3NlcnQodDEgPT0gdDIpOwotICAgIHQxLmltX29wdGlvbmFsID0gMTA7Ci0gICAgYXNzZXJ0KHQxICE9IHQyKTsKLSAgICB0Mi5fX2lzc2V0LmltX29wdGlvbmFsID0gZmFsc2U7Ci0gICAgYXNzZXJ0KHQxICE9IHQyKTsKLSAgfQorICBjb25zdCBzdGQ6OnN0cmluZyBleHBlY3RlZF9yZXN1bHQoCisgICAgIk9sZFNjaG9vbCB7XG4iCisgICAgIiAgMDE6IGltX2ludCAoaTE2KSA9IDEwLFxuIgorICAgICIgIDAyOiBpbV9zdHIgKHN0cmluZykgPSBcImZvb1wiLFxuIgorICAgICIgIDAzOiBpbV9iaWcgKGxpc3QpID0gbGlzdDxtYXA+WzNdIHtcbiIKKyAgICAiICAgIFswXSA9IG1hcDxpMzIsc3RyaW5nPlswXSB7XG4iCisgICAgIiAgICB9LFxuIgorICAgICIgICAgWzFdID0gbWFwPGkzMixzdHJpbmc+WzJdIHtcbiIKKyAgICAiICAgICAgMSAtPiBcImJhclwiLFxuIgorICAgICIgICAgICAyIC0+IFwiYmF6XCIsXG4iCisgICAgIiAgICB9LFxuIgorICAgICIgICAgWzJdID0gbWFwPGkzMixzdHJpbmc+WzNdIHtcbiIKKyAgICAiICAgICAgMSAtPiBcImJhclwiLFxuIgorICAgICIgICAgICAyIC0+IFwiYmF6XCIsXG4iCisgICAgIiAgICAgIDMgLT4gXCJxdXhcIixcbiIKKyAgICAiICAgIH0sXG4iCisgICAgIiAgfSxcbiIKKyAgICAifSIpOworICBjb25zdCBzdGQ6OnN0cmluZyByZXN1bHQoYXBhY2hlOjp0aHJpZnQ6OlRocmlmdERlYnVnU3RyaW5nKG8zKSk7CiAKLSAgewotICAgIE9wdGlvbmFsRGVmYXVsdCB0MSwgdDI7Ci0gICAgY291dCA8PCBUaHJpZnREZWJ1Z1N0cmluZyh0MSkgPDwgZW5kbDsKLSAgICBhc3NlcnQodDEuX19pc3NldC5vcHRfaW50ID09IHRydWUpOwotICAgIGFzc2VydCh0MS5fX2lzc2V0Lm9wdF9zdHIgPT0gdHJ1ZSk7Ci0gICAgYXNzZXJ0KHQxLm9wdF9pbnQgPT0gdDIub3B0X2ludCk7Ci0gICAgYXNzZXJ0KHQxLm9wdF9zdHIgPT0gdDIub3B0X3N0cik7CisgIEJPT1NUX0NIRUNLX01FU1NBR0UoIWV4cGVjdGVkX3Jlc3VsdC5jb21wYXJlKHJlc3VsdCksCisgICAgIkV4cGVjdGVkOlxuIiA8PCBleHBlY3RlZF9yZXN1bHQgPDwgIlxuR290dGVuOlxuIiA8PCByZXN1bHQpOworfQogCi0gICAgd3JpdGVfdG9fcmVhZCh0MSwgdDIpOwotICAgIGNvdXQgPDwgVGhyaWZ0RGVidWdTdHJpbmcodDIpIDw8IGVuZGw7Ci0gICAgYXNzZXJ0KHQyLl9faXNzZXQub3B0X2ludCA9PSB0cnVlKTsKLSAgICBhc3NlcnQodDIuX19pc3NldC5vcHRfc3RyID09IHRydWUpOwotICAgIGFzc2VydCh0MS5vcHRfaW50ID09IHQyLm9wdF9pbnQpOwotICAgIGFzc2VydCh0MS5vcHRfc3RyID09IHQyLm9wdF9zdHIpOwotICB9CitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X29wdGlvbmFsX3JlcXVpcmVkXzEyKSB7CisgIFRyaWNreTIgdDEsIHQyOworICBCT09TVF9DSEVDSyh0MS5fX2lzc2V0LmltX29wdGlvbmFsID09IGZhbHNlKTsKKyAgQk9PU1RfQ0hFQ0sodDIuX19pc3NldC5pbV9vcHRpb25hbCA9PSBmYWxzZSk7CisgIEJPT1NUX0NIRUNLKHQxID09IHQyKTsKKyAgdDEuaW1fb3B0aW9uYWwgPSA1OworICBCT09TVF9DSEVDSyh0MSA9PSB0Mik7CisgIHQyLmltX29wdGlvbmFsID0gNTsKKyAgQk9PU1RfQ0hFQ0sodDEgPT0gdDIpOworICB0MS5fX2lzc2V0LmltX29wdGlvbmFsID0gdHJ1ZTsKKyAgQk9PU1RfQ0hFQ0sodDEgIT0gdDIpOworICB0Mi5fX2lzc2V0LmltX29wdGlvbmFsID0gdHJ1ZTsKKyAgQk9PU1RfQ0hFQ0sodDEgPT0gdDIpOworICB0MS5pbV9vcHRpb25hbCA9IDEwOworICBCT09TVF9DSEVDSyh0MSAhPSB0Mik7CisgIHQyLl9faXNzZXQuaW1fb3B0aW9uYWwgPSBmYWxzZTsKKyAgQk9PU1RfQ0hFQ0sodDEgIT0gdDIpOworfQogCi0gIHJldHVybiAwOworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9vcHRpb25hbF9yZXF1aXJlZF8xMykgeworICBPcHRpb25hbERlZmF1bHQgdDEsIHQyOworCisgIEJPT1NUX0NIRUNLKHQxLl9faXNzZXQub3B0X2ludCA9PSB0cnVlKTsKKyAgQk9PU1RfQ0hFQ0sodDEuX19pc3NldC5vcHRfc3RyID09IHRydWUpOworICBCT09TVF9DSEVDSyh0MS5vcHRfaW50ID09IHQyLm9wdF9pbnQpOworICBCT09TVF9DSEVDSyh0MS5vcHRfc3RyID09IHQyLm9wdF9zdHIpOworCisgIHdyaXRlX3RvX3JlYWQodDEsIHQyKTsKKyAgQk9PU1RfQ0hFQ0sodDIuX19pc3NldC5vcHRfaW50ID09IHRydWUpOworICBCT09TVF9DSEVDSyh0Mi5fX2lzc2V0Lm9wdF9zdHIgPT0gdHJ1ZSk7CisgIEJPT1NUX0NIRUNLKHQxLm9wdF9pbnQgPT0gdDIub3B0X2ludCk7CisgIEJPT1NUX0NIRUNLKHQxLm9wdF9zdHIgPT0gdDIub3B0X3N0cik7CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0KAorICAgICJPcHRpb25hbERlZmF1bHQge1xuIgorICAgICIgIDAxOiBvcHRfaW50IChpMTYpID0gMTIzNCxcbiIKKyAgICAiICAwMjogb3B0X3N0ciAoc3RyaW5nKSA9IFwiZGVmYXVsdFwiLFxuIgorICAgICJ9Iik7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIHJlc3VsdChhcGFjaGU6OnRocmlmdDo6VGhyaWZ0RGVidWdTdHJpbmcodDIpKTsKKworICBCT09TVF9DSEVDS19NRVNTQUdFKCFleHBlY3RlZF9yZXN1bHQuY29tcGFyZShyZXN1bHQpLAorICAgICJFeHBlY3RlZDpcbiIgPDwgZXhwZWN0ZWRfcmVzdWx0IDw8ICJcbkdvdHRlbjpcbiIgPDwgcmVzdWx0KTsKIH0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9SV011dGV4U3RhcnZlVGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvUldNdXRleFN0YXJ2ZVRlc3QuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmNjY2YyLi4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvdGVzdC9SV011dGV4U3RhcnZlVGVzdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KLSNpbmNsdWRlIDxib29zdC90ZXN0L3VuaXRfdGVzdC5ocHA+Ci0KLSNpbmNsdWRlICJ0aHJpZnQvY29uY3VycmVuY3kvTXV0ZXguaCIKLSNpbmNsdWRlICJ0aHJpZnQvY29uY3VycmVuY3kvUG9zaXhUaHJlYWRGYWN0b3J5LmgiCi0KLXVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOwotdXNpbmcgYm9vc3Q6OnVuaXRfdGVzdDo6dGVzdF9zdWl0ZTsKLXVzaW5nIGJvb3N0Ojp1bml0X3Rlc3Q6OmZyYW1ld29yazo6bWFzdGVyX3Rlc3Rfc3VpdGU7Ci0KLXVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k7Ci11c2luZyBuYW1lc3BhY2Ugc3RkOwotCi1jbGFzcyBMb2NrZXIgOiBwdWJsaWMgUnVubmFibGUKLXsKLXByb3RlY3RlZDoKLSAgTG9ja2VyKGJvb3N0OjpzaGFyZWRfcHRyPFJlYWRXcml0ZU11dGV4PiByd2xvY2ssIGJvb2wgd3JpdGVyKSA6Ci0gICAgcndsb2NrXyhyd2xvY2spLCB3cml0ZXJfKHdyaXRlciksCi0gICAgc3RhcnRlZF8oZmFsc2UpLCBnb3RMb2NrXyhmYWxzZSksIHNpZ25hbGVkXyhmYWxzZSkgeyB9Ci0KLXB1YmxpYzoKLSAgdmlydHVhbCB2b2lkIHJ1bigpCi0gIHsKLSAgICBzdGFydGVkXyA9IHRydWU7Ci0gICAgaWYgKHdyaXRlcl8pIHsKLSAgICAgIHJ3bG9ja18tPmFjcXVpcmVXcml0ZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICByd2xvY2tfLT5hY3F1aXJlUmVhZCgpOwotICAgIH0KLSAgICBnb3RMb2NrXyA9IHRydWU7Ci0gICAgd2hpbGUgKCFzaWduYWxlZF8pIHsKLSAgICAgIHVzbGVlcCg1MDAwKTsKLSAgICB9Ci0gICAgcndsb2NrXy0+cmVsZWFzZSgpOwotICB9Ci0KLSAgYm9vbCBzdGFydGVkKCkgY29uc3QgeyByZXR1cm4gc3RhcnRlZF87IH0KLSAgYm9vbCBnb3RMb2NrKCkgY29uc3QgeyByZXR1cm4gZ290TG9ja187IH0KLSAgdm9pZCBzaWduYWwoKSB7IHNpZ25hbGVkXyA9IHRydWU7IH0KLQotcHJvdGVjdGVkOgotICBib29zdDo6c2hhcmVkX3B0cjxSZWFkV3JpdGVNdXRleD4gcndsb2NrXzsKLSAgYm9vbCB3cml0ZXJfOwotICB2b2xhdGlsZSBib29sIHN0YXJ0ZWRfOwotICB2b2xhdGlsZSBib29sIGdvdExvY2tfOwotICB2b2xhdGlsZSBib29sIHNpZ25hbGVkXzsKLX07Ci0KLWNsYXNzIFJlYWRlciA6IHB1YmxpYyBMb2NrZXIKLXsKLXB1YmxpYzoKLSAgUmVhZGVyKGJvb3N0OjpzaGFyZWRfcHRyPFJlYWRXcml0ZU11dGV4PiByd2xvY2spIDogTG9ja2VyKHJ3bG9jaywgZmFsc2UpIHsgfQotfTsKLQotY2xhc3MgV3JpdGVyIDogcHVibGljIExvY2tlcgotewotcHVibGljOgotICBXcml0ZXIoYm9vc3Q6OnNoYXJlZF9wdHI8UmVhZFdyaXRlTXV0ZXg+IHJ3bG9jaykgOiBMb2NrZXIocndsb2NrLCB0cnVlKSB7IH0KLX07Ci0KLXZvaWQgdGVzdF9zdGFydmUoUG9zaXhUaHJlYWRGYWN0b3J5OjpQT0xJQ1kgcG9saWN5KQotewotICAvLyB0aGUgbWFuIHBhZ2VzIGZvciBwdGhyZWFkX3dybG9ja19yZGxvY2sgc3VnZ2VzdCB0aGF0IGFueSBPUyBndWFyYW50ZWUgYWJvdXQKLSAgLy8gd3JpdGVyIHN0YXJ2YXRpb24gbWF5IGJlIGluZmx1ZW5jZWQgYnkgdGhlIHNjaGVkdWxpbmcgcG9saWN5LCBzbyBsZXQncyB0cnkKLSAgLy8gYWxsIDMgcG9saWNpZXMgdG8gc2VlIGlmIGFueSBvZiB0aGVtIHdvcmsuCi0gIFBvc2l4VGhyZWFkRmFjdG9yeSBmYWN0b3J5KHBvbGljeSk7Ci0gIGZhY3Rvcnkuc2V0RGV0YWNoZWQoZmFsc2UpOwotCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFJlYWRXcml0ZU11dGV4PiByd2xvY2sobmV3IE5vU3RhcnZlUmVhZFdyaXRlTXV0ZXgoKSk7Ci0KLSAgYm9vc3Q6OnNoYXJlZF9wdHI8UmVhZGVyPiByZWFkZXIxKG5ldyBSZWFkZXIocndsb2NrKSk7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFJlYWRlcj4gcmVhZGVyMihuZXcgUmVhZGVyKHJ3bG9jaykpOwotICBib29zdDo6c2hhcmVkX3B0cjxXcml0ZXI+IHdyaXRlcihuZXcgV3JpdGVyKHJ3bG9jaykpOwotCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZD4gdHJlYWRlcjEgPSBmYWN0b3J5Lm5ld1RocmVhZChyZWFkZXIxKTsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkPiB0cmVhZGVyMiA9IGZhY3RvcnkubmV3VGhyZWFkKHJlYWRlcjIpOwotICBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWQ+IHR3cml0ZXIgPSBmYWN0b3J5Lm5ld1RocmVhZCh3cml0ZXIpOwotCi0gIC8vIGxhdW5jaCBhIHJlYWRlciBhbmQgbWFrZSBzdXJlIGhlIGhhcyB0aGUgbG9jawotICB0cmVhZGVyMS0+c3RhcnQoKTsKLSAgd2hpbGUgKCFyZWFkZXIxLT5nb3RMb2NrKCkpIHsKLSAgICB1c2xlZXAoMjAwMCk7Ci0gIH0KLQotICAvLyBsYXVuY2ggYSB3cml0ZXIgYW5kIG1ha2Ugc3VyZSBoZSdzIGJsb2NrZWQgb24gdGhlIGxvY2sKLSAgdHdyaXRlci0+c3RhcnQoKTsKLSAgd2hpbGUgKCF3cml0ZXItPnN0YXJ0ZWQoKSkgewotICAgIHVzbGVlcCgyMDAwKTsKLSAgfQotICAvLyB0cmlja3kgcGFydC4uLiB3ZSBjYW4gbmV2ZXIgYmUgMTAwJSBzdXJlIHRoYXQgdGhlIHdyaXRlciBpcyBhY3R1YWxseQotICAvLyBibG9ja2VkIG9uIHRoZSBsb2NrLCBidXQgd2UgY2FuIHByZXR0eSByZWFzb25hYmx5IHN1cmUgYmVjYXVzZSB3ZSBrbm93Ci0gIC8vIGhlIGp1c3QgZXhlY3V0ZWQgdGhlIGxpbmUgaW1tZWRpYXRlbHkgYmVmb3JlIGdldHRpbmcgdGhlIGxvY2ssIGFuZAotICAvLyB3ZSdsbCB3YWl0IGEgZnVsbCBzZWNvbmQgZm9yIGhpbSB0byBnZXQgb24gaXQuCi0gIHNsZWVwKDEpOwotCi0gIC8vIGxhdW5jaCBhIHNlY29uZCByZWFkZXIuLi4gaWYgdGhlIFJXTXV0ZXggZ3VhcmFudGVlcyB0aGF0IHdyaXRlcnMgd29uJ3QKLSAgLy8gc3RhcnZlLCB0aGlzIHJlYWRlciBzaG91bGQgbm90IGJlIGFibGUgdG8gYWNxdWlyZSB0aGUgbG9jayB1bnRpbCB0aGUgd3JpdGVyCi0gIC8vIGhhcyBhY3F1aXJlZCBhbmQgcmVsZWFzZWQgaXQuCi0gIHRyZWFkZXIyLT5zdGFydCgpOwotICB3aGlsZSAoIXJlYWRlcjItPnN0YXJ0ZWQoKSkgewotICAgIHVzbGVlcCgyMDAwKTsKLSAgfQotICAvLyBhZ2Fpbi4uLiBjYW4ndCBiZSAxMDAlIHN1cmUgdGhlIHJlYWRlciBpcyB3YWl0aW5nIG9uIChvciBoYXMpIHRoZSBsb2NrCi0gIC8vIGJ1dCB3ZSBjYW4gYmUgY2xvc2UuCi0gIHNsZWVwKDEpOwotCi0gIC8vIHRlbGwgcmVhZGVyIDEgdG8gbGV0IGdvIG9mIHRoZSBsb2NrCi0gIHJlYWRlcjEtPnNpZ25hbCgpOwotCi0gIC8vIHdhaXQgZm9yIHNvbWVvbmUgdG8gZ2V0IHRoZSBsb2NrCi0gIHdoaWxlICghcmVhZGVyMi0+Z290TG9jaygpICYmICF3cml0ZXItPmdvdExvY2soKSkgewotICAgIHVzbGVlcCgyMDAwKTsKLSAgfQotCi0gIC8vIHRoZSB0ZXN0IHN1Y2NlZWRlZCBpZiB0aGUgV1JJVEVSIGdvdCB0aGUgbG9jay4KLSAgYm9vbCBzdWNjZXNzID0gd3JpdGVyLT5nb3RMb2NrKCk7Ci0KLSAgLy8gdGVsbCBldmVyeW9uZSB3ZSdyZSBkb25lIGFuZCB3YWl0IGZvciB0aGVtIHRvIGZpbmlzaAotICByZWFkZXIyLT5zaWduYWwoKTsKLSAgd3JpdGVyLT5zaWduYWwoKTsKLSAgdHJlYWRlcjEtPmpvaW4oKTsKLSAgdHJlYWRlcjItPmpvaW4oKTsKLSAgdHdyaXRlci0+am9pbigpOwotCi0gIC8vIG1ha2Ugc3VyZSBpdCB3b3JrZWQuCi0gIEJPT1NUX0NIRUNLX01FU1NBR0Uoc3VjY2VzcywgIndyaXRlciBpcyBzdGFydmluZyIpOwotfQotCi1CT09TVF9BVVRPX1RFU1RfU1VJVEUoIFJXTXV0ZXhTdGFydmVUZXN0ICkKLQotQk9PU1RfQVVUT19URVNUX0NBU0UoIHRlc3Rfc3RhcnZlX290aGVyICkKLXsKLSAgdGVzdF9zdGFydmUoUG9zaXhUaHJlYWRGYWN0b3J5OjpPVEhFUik7Ci19Ci0KLUJPT1NUX0FVVE9fVEVTVF9DQVNFKCB0ZXN0X3N0YXJ2ZV9yciApCi17Ci0gIHRlc3Rfc3RhcnZlKFBvc2l4VGhyZWFkRmFjdG9yeTo6Uk9VTkRfUk9CSU4pOwotfQotCi1CT09TVF9BVVRPX1RFU1RfQ0FTRSggdGVzdF9zdGFydmVfZmlmbyApCi17Ci0gIHRlc3Rfc3RhcnZlKFBvc2l4VGhyZWFkRmFjdG9yeTo6RklGTyk7Ci19Ci0KLUJPT1NUX0FVVE9fVEVTVF9TVUlURV9FTkQoKQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L1JlY3Vyc2l2ZVRlc3QuY3BwIGIvbGliL2NwcC90ZXN0L1JlY3Vyc2l2ZVRlc3QuY3BwCmluZGV4IDI0YzBmN2MuLjE1ZjIzNGMgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvdGVzdC9SZWN1cnNpdmVUZXN0LmNwcAorKysgYi9saWIvY3BwL3Rlc3QvUmVjdXJzaXZlVGVzdC5jcHAKQEAgLTIyLDE0ICsyMiwxOCBAQAogICovCiAKICNpbmNsdWRlICJnZW4tY3BwL1JlY3Vyc2l2ZV90eXBlcy5oIgotI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KICNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KKworI2RlZmluZSBCT09TVF9URVNUX01PRFVMRSBSZWN1cnNpdmVUZXN0CisjaW5jbHVkZSA8Ym9vc3QvdGVzdC91bml0X3Rlc3QuaHBwPgogCiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyOwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUQmluYXJ5UHJvdG9jb2w7Ci0gICAgdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7Cit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7CiAKLWludCBtYWluKCkgeworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9yZWN1cnNpdmVfMSkgewogICBzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKICAgc2hhcmVkX3B0cjxUQmluYXJ5UHJvdG9jb2w+IHByb3QobmV3IFRCaW5hcnlQcm90b2NvbChidWYpKTsKIApAQCAtNDEsMzUgKzQ1LDQ4IEBACiAKICAgUmVjVHJlZSByZXN1bHQ7CiAgIHJlc3VsdC5yZWFkKHByb3QuZ2V0KCkpOwotICBhc3NlcnQodHJlZSA9PSByZXN1bHQpOworICBCT09TVF9DSEVDSyh0cmVlID09IHJlc3VsdCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfcmVjdXJzaXZlXzIpIHsKKyAgc2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWYobmV3IFRNZW1vcnlCdWZmZXIoKSk7CisgIHNoYXJlZF9wdHI8VEJpbmFyeVByb3RvY29sPiBwcm90KG5ldyBUQmluYXJ5UHJvdG9jb2woYnVmKSk7CiAKICAgUmVjTGlzdCBsOwotICBib29zdDo6c2hhcmVkX3B0cjxSZWNMaXN0PiBsMihuZXcgUmVjTGlzdCk7CisgIHNoYXJlZF9wdHI8UmVjTGlzdD4gbDIobmV3IFJlY0xpc3QpOwogICBsLm5leHRpdGVtID0gbDI7CiAKICAgbC53cml0ZShwcm90LmdldCgpKTsKIAogICBSZWNMaXN0IHJlc3VsdGxpc3Q7CiAgIHJlc3VsdGxpc3QucmVhZChwcm90LmdldCgpKTsKLSAgYXNzZXJ0KHJlc3VsdGxpc3QubmV4dGl0ZW0gIT0gTlVMTCk7Ci0gIGFzc2VydChyZXN1bHRsaXN0Lm5leHRpdGVtLT5uZXh0aXRlbSA9PSBOVUxMKTsKKyAgQk9PU1RfQ0hFQ0socmVzdWx0bGlzdC5uZXh0aXRlbSAhPSBOVUxMKTsKKyAgQk9PU1RfQ0hFQ0socmVzdWx0bGlzdC5uZXh0aXRlbS0+bmV4dGl0ZW0gPT0gTlVMTCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfcmVjdXJzaXZlXzMpIHsKKyAgc2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWYobmV3IFRNZW1vcnlCdWZmZXIoKSk7CisgIHNoYXJlZF9wdHI8VEJpbmFyeVByb3RvY29sPiBwcm90KG5ldyBUQmluYXJ5UHJvdG9jb2woYnVmKSk7CiAKICAgQ29SZWMgYzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8Q29SZWMyPiByKG5ldyBDb1JlYzIpOworICBzaGFyZWRfcHRyPENvUmVjMj4gcihuZXcgQ29SZWMyKTsKICAgYy5vdGhlciA9IHI7CiAKICAgYy53cml0ZShwcm90LmdldCgpKTsKIAogICBjLnJlYWQocHJvdC5nZXQoKSk7Ci0gIGFzc2VydChjLm90aGVyICE9IE5VTEwpOwotICBhc3NlcnQoYy5vdGhlci0+b3RoZXIub3RoZXIgPT0gTlVMTCk7CisgIEJPT1NUX0NIRUNLKGMub3RoZXIgIT0gTlVMTCk7CisgIEJPT1NUX0NIRUNLKGMub3RoZXItPm90aGVyLm90aGVyID09IE5VTEwpOworfQogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFJlY0xpc3Q+IGRlcHRoTGltaXQobmV3IFJlY0xpc3QpOworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9yZWN1cnNpdmVfNCkgeworICBzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKKyAgc2hhcmVkX3B0cjxUQmluYXJ5UHJvdG9jb2w+IHByb3QobmV3IFRCaW5hcnlQcm90b2NvbChidWYpKTsKKworICBzaGFyZWRfcHRyPFJlY0xpc3Q+IGRlcHRoTGltaXQobmV3IFJlY0xpc3QpOwogICBkZXB0aExpbWl0LT5uZXh0aXRlbSA9IGRlcHRoTGltaXQ7Ci0gIHRyeSB7Ci0gICAgZGVwdGhMaW1pdC0+d3JpdGUocHJvdC5nZXQoKSk7Ci0gICAgYXNzZXJ0KGZhbHNlKTsKLSAgfSBjYXRjaCAoY29uc3QgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xFeGNlcHRpb24mIGUpIHsKLSAgfQorICBCT09TVF9DSEVDS19USFJPVyhkZXB0aExpbWl0LT53cml0ZShwcm90LmdldCgpKSwKKyAgICBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEV4Y2VwdGlvbik7CiAKKyAgZGVwdGhMaW1pdC0+bmV4dGl0ZW0ucmVzZXQoKTsKIH0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9SZW5kZXJlZERvdWJsZUNvbnN0YW50c1Rlc3QuY3BwIGIvbGliL2NwcC90ZXN0L1JlbmRlcmVkRG91YmxlQ29uc3RhbnRzVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNhMDQyYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvdGVzdC9SZW5kZXJlZERvdWJsZUNvbnN0YW50c1Rlc3QuY3BwCkBAIC0wLDAgKzEsMTIyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjZGVmaW5lIEVQU0lMT04gMC4wMDAwMDAxCisjaW5jbHVkZSA8dHlwZWluZGV4PgorI2luY2x1ZGUgPHR5cGVpbmZvPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImdlbi1jcHAvRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuaCIKK3VzaW5nIG5hbWVzcGFjZSB0aHJpZnQ6OnRlc3Q7CisKKyNkZWZpbmUgQk9PU1RfVEVTVF9NT0RVTEUgUmVuZGVyZWREb3VibGVDb25zdGFudHNUZXN0CisjaW5jbHVkZSA8Ym9vc3QvdGVzdC91bml0X3Rlc3QuaHBwPgorCitCT09TVF9BVVRPX1RFU1RfU1VJVEUoUmVuZGVyZWREb3VibGVDb25zdGFudHNUZXN0KQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X3JlbmRlcmVkX2RvdWJsZV9jb25zdGFudHMpIHsKKyAgICBjb25zdCBkb3VibGUgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0lOVF9DT05TVEFOVCA9IDEuMDsKKyAgICBjb25zdCBkb3VibGUgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0lOVF9DT05TVEFOVCA9IC0xMDAuMDsKKyAgICBjb25zdCBkb3VibGUgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFU1RfSU5UX0NPTlNUQU5UID0gOTIyMzM3MjAzNjg1NDc3NTgwNy4wOworICAgIGNvbnN0IGRvdWJsZSBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fU01BTExFU1RfSU5UX0NPTlNUQU5UID0gLTkyMjMzNzIwMzY4NTQ3NzU4MDcuMDsKKyAgICBjb25zdCBkb3VibGUgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0RPVUJMRV9XSVRIX01BTllfREVDSU1BTFMgPSAzLjE0MTU5MjY1MzU5OworICAgIGNvbnN0IGRvdWJsZSBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fRlJBQ1RJT05BTF9ET1VCTEUgPSAxMDAwMDAwLjE7CisgICAgY29uc3QgZG91YmxlIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9GUkFDVElPTkFMX0RPVUJMRSA9IC0xMDAwMDAwLjE7CisgICAgY29uc3QgZG91YmxlIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9ET1VCTEUgPSAxLjdlKzMwODsKKyAgICBjb25zdCBkb3VibGUgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFID0gOTIyMzM3MjAzNjg1NDc3NTgxNi40MzsKKyAgICBjb25zdCBkb3VibGUgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMX0RPVUJMRSA9IC0xLjdlKzMwODsKKyAgICBjb25zdCBkb3VibGUgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0JVVF9MQVJHRV9GUkFDVElPTkFMX0RPVUJMRSA9IC05MjIzMzcyMDM2ODU0Nzc1ODE2LjQzOworICAgIEJPT1NUX0NIRUNLX0NMT1NFKAorICAgICAgICBnX0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19JTlRfQ09OU1RBTlRfVEVTVCwKKyAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0lOVF9DT05TVEFOVCwgRVBTSUxPTik7CisgICAgQk9PU1RfQ0hFQ0tfQ0xPU0UoCisgICAgICAgIGdfRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0lOVF9DT05TVEFOVF9URVNULAorICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfSU5UX0NPTlNUQU5ULCBFUFNJTE9OKTsKKyAgICBCT09TVF9DSEVDS19DTE9TRSgKKyAgICAgICAgZ19Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VTVF9JTlRfQ09OU1RBTlRfVEVTVCwKKyAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFU1RfSU5UX0NPTlNUQU5ULCBFUFNJTE9OKTsKKyAgICBCT09TVF9DSEVDS19DTE9TRSgKKyAgICAgICAgZ19Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fU01BTExFU1RfSU5UX0NPTlNUQU5UX1RFU1QsCisgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19TTUFMTEVTVF9JTlRfQ09OU1RBTlQsIEVQU0lMT04pOworICAgIEJPT1NUX0NIRUNLX0NMT1NFKAorICAgICAgICBnX0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ET1VCTEVfV0lUSF9NQU5ZX0RFQ0lNQUxTX1RFU1QsCisgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ET1VCTEVfV0lUSF9NQU5ZX0RFQ0lNQUxTLCBFUFNJTE9OKTsKKyAgICBCT09TVF9DSEVDS19DTE9TRSgKKyAgICAgICAgZ19Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCwKKyAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0ZSQUNUSU9OQUxfRE9VQkxFLCBFUFNJTE9OKTsKKyAgICBCT09TVF9DSEVDS19DTE9TRSgKKyAgICAgICAgZ19Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCwKKyAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0ZSQUNUSU9OQUxfRE9VQkxFLCBFUFNJTE9OKTsKKyAgICBCT09TVF9DSEVDS19DTE9TRSgKKyAgICAgICAgZ19Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRE9VQkxFX1RFU1QsCisgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9ET1VCTEUsIEVQU0lMT04pOworICAgIEJPT1NUX0NIRUNLX0NMT1NFKAorICAgICAgICBnX0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNULAorICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEUsIEVQU0lMT04pOworICAgIEJPT1NUX0NIRUNLX0NMT1NFKAorICAgICAgICBnX0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19TTUFMTF9ET1VCTEVfVEVTVCwKKyAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMX0RPVUJMRSwgRVBTSUxPTik7CisgICAgQk9PU1RfQ0hFQ0tfQ0xPU0UoCisgICAgICAgIGdfRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0JVVF9MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNULAorICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfQlVUX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFLCBFUFNJTE9OKTsKKyAgICBCT09TVF9DSEVDSygKKyAgICAgICAgdHlwZWlkKGdfRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0lOVF9DT05TVEFOVF9URVNUKS5oYXNoX2NvZGUoKSA9PQorICAgICAgICB0eXBlaWQoRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0lOVF9DT05TVEFOVCkuaGFzaF9jb2RlKCkpOworICAgIEJPT1NUX0NIRUNLKAorICAgICAgICB0eXBlaWQoZ19Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfSU5UX0NPTlNUQU5UX1RFU1QpLmhhc2hfY29kZSgpID09CisgICAgICAgIHR5cGVpZChFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfSU5UX0NPTlNUQU5UKS5oYXNoX2NvZGUoKSk7CisgICAgQk9PU1RfQ0hFQ0soCisgICAgICAgIHR5cGVpZChnX0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRVNUX0lOVF9DT05TVEFOVF9URVNUKS5oYXNoX2NvZGUoKSA9PQorICAgICAgICB0eXBlaWQoRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFU1RfSU5UX0NPTlNUQU5UKS5oYXNoX2NvZGUoKSk7CisgICAgQk9PU1RfQ0hFQ0soCisgICAgICAgIHR5cGVpZChnX0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19TTUFMTEVTVF9JTlRfQ09OU1RBTlRfVEVTVCkuaGFzaF9jb2RlKCkgPT0KKyAgICAgICAgdHlwZWlkKEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19TTUFMTEVTVF9JTlRfQ09OU1RBTlQpLmhhc2hfY29kZSgpKTsKKyAgICBCT09TVF9DSEVDSygKKyAgICAgICAgdHlwZWlkKGdfRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0RPVUJMRV9XSVRIX01BTllfREVDSU1BTFNfVEVTVCkuaGFzaF9jb2RlKCkgPT0KKyAgICAgICAgdHlwZWlkKEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ET1VCTEVfV0lUSF9NQU5ZX0RFQ0lNQUxTKS5oYXNoX2NvZGUoKSk7CisgICAgQk9PU1RfQ0hFQ0soCisgICAgICAgIHR5cGVpZChnX0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19GUkFDVElPTkFMX0RPVUJMRV9URVNUKS5oYXNoX2NvZGUoKSA9PQorICAgICAgICB0eXBlaWQoRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0ZSQUNUSU9OQUxfRE9VQkxFKS5oYXNoX2NvZGUoKSk7CisgICAgQk9PU1RfQ0hFQ0soCisgICAgICAgIHR5cGVpZChnX0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9GUkFDVElPTkFMX0RPVUJMRV9URVNUKS5oYXNoX2NvZGUoKSA9PQorICAgICAgICB0eXBlaWQoRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0ZSQUNUSU9OQUxfRE9VQkxFKS5oYXNoX2NvZGUoKSk7CisgICAgQk9PU1RfQ0hFQ0soCisgICAgICAgIHR5cGVpZChnX0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9ET1VCTEVfVEVTVCkuaGFzaF9jb2RlKCkgPT0KKyAgICAgICAgdHlwZWlkKEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9ET1VCTEUpLmhhc2hfY29kZSgpKTsKKyAgICBCT09TVF9DSEVDSygKKyAgICAgICAgdHlwZWlkKGdfRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QpLmhhc2hfY29kZSgpID09CisgICAgICAgIHR5cGVpZChFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEUpLmhhc2hfY29kZSgpKTsKKyAgICBCT09TVF9DSEVDSygKKyAgICAgICAgdHlwZWlkKGdfRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMX0RPVUJMRV9URVNUKS5oYXNoX2NvZGUoKSA9PQorICAgICAgICB0eXBlaWQoRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMX0RPVUJMRSkuaGFzaF9jb2RlKCkpOworICAgIEJPT1NUX0NIRUNLKAorICAgICAgICB0eXBlaWQoZ19Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfQlVUX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QpCisgICAgICAgICAgICAuaGFzaF9jb2RlKCkgPT0KKyAgICAgICAgdHlwZWlkKEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9CVVRfTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEUpLmhhc2hfY29kZSgpKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9yZW5kZXJlZF9kb3VibGVfbGlzdCkgeworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGRvdWJsZT4gRVhQRUNURURfRE9VQkxFX0xJU1R7MS4wLC0xMDAuMCwxMDAuMCw5MjIzMzcyMDM2ODU0Nzc1ODA3LjAsLTkyMjMzNzIwMzY4NTQ3NzU4MDcuMCwKKyAgICAgICAgMy4xNDE1OTI2NTM1OSwxMDAwMDAwLjEsLTEwMDAwMDAuMSwxLjdlKzMwOCwtMS43ZSszMDgsOTIyMzM3MjAzNjg1NDc3NTgxNi40MywtOTIyMzM3MjAzNjg1NDc3NTgxNi40M307CisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoZ19Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5ET1VCTEVfTElTVF9URVNULnNpemUoKSwgRVhQRUNURURfRE9VQkxFX0xJU1Quc2l6ZSgpKTsKKyAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IEVYUEVDVEVEX0RPVUJMRV9MSVNULnNpemUoKTsgKytpKSB7CisgICAgICAgIEJPT1NUX0NIRUNLX0NMT1NFKGdfRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuRE9VQkxFX0xJU1RfVEVTVFtpXSwgRVhQRUNURURfRE9VQkxFX0xJU1RbaV0sIEVQU0lMT04pOworICAgIH0KK30KKworQk9PU1RfQVVUT19URVNUX1NVSVRFX0VORCgpCmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvU2VjdXJpdHlUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9TZWN1cml0eVRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4MmE0ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvU2VjdXJpdHlUZXN0LmNwcApAQCAtMCwwICsxLDI3OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIEJPT1NUX1RFU1RfTU9EVUxFIFNlY3VyaXR5VGVzdAorI2luY2x1ZGUgPGJvb3N0L3Rlc3QvdW5pdF90ZXN0LmhwcD4KKyNpbmNsdWRlIDxib29zdC9maWxlc3lzdGVtLmhwcD4KKyNpbmNsdWRlIDxib29zdC9mb3JlYWNoLmhwcD4KKyNpbmNsdWRlIDxib29zdC9mb3JtYXQuaHBwPgorI2luY2x1ZGUgPGJvb3N0L3RocmVhZC5ocHA+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNTTFNlcnZlclNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNTTFNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpZmRlZiBfX2xpbnV4X18KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNlbmRpZgorCit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU1NMU2VydmVyU29ja2V0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTU0xTb2NrZXQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU1NMU29ja2V0RmFjdG9yeTsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk7CisKK3VzaW5nIHN0ZDo6YmluZDsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKKworYm9vc3Q6OmZpbGVzeXN0ZW06OnBhdGgga2V5RGlyOworYm9vc3Q6OmZpbGVzeXN0ZW06OnBhdGggY2VydEZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lKQoreworICAgIHJldHVybiBrZXlEaXIgLyBmaWxlbmFtZTsKK30KK2Jvb3N0OjptdXRleCBnTXV0ZXg7CisKK3N0cnVjdCBHbG9iYWxGaXh0dXJlCit7CisgICAgR2xvYmFsRml4dHVyZSgpCisgICAgeworICAgICAgICB1c2luZyBuYW1lc3BhY2UgYm9vc3Q6OnVuaXRfdGVzdDo6ZnJhbWV3b3JrOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFzdGVyX3Rlc3Rfc3VpdGUoKS5hcmdjOyArK2kpCisgICAgeworICAgICAgQk9PU1RfVEVTVF9NRVNTQUdFKGJvb3N0Ojpmb3JtYXQoImFyZ3ZbJTElXSA9IFwiJTIlXCIiKSAlIGkgJSBtYXN0ZXJfdGVzdF9zdWl0ZSgpLmFyZ3ZbaV0pOworICAgIH0KKworICAgICNpZmRlZiBfX2xpbnV4X18KKyAgICAvLyBPcGVuU1NMIGNhbGxzIHNlbmQoKSB3aXRob3V0IE1TR19OT1NJR1BJUEUgc28gd3JpdGluZyB0byBhIHNvY2tldCB0aGF0IGhhcworICAgIC8vIGRpc2Nvbm5lY3RlZCBjYW4gY2F1c2UgYSBTSUdQSVBFIHNpZ25hbC4uLgorICAgIHNpZ25hbChTSUdQSVBFLCBTSUdfSUdOKTsKKyAgICAjZW5kaWYKKworICAgIFRTU0xTb2NrZXRGYWN0b3J5OjpzZXRNYW51YWxPcGVuU1NMSW5pdGlhbGl6YXRpb24odHJ1ZSk7CisgICAgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6aW5pdGlhbGl6ZU9wZW5TU0woKTsKKworICAgIGtleURpciA9IGJvb3N0OjpmaWxlc3lzdGVtOjpjdXJyZW50X3BhdGgoKS5wYXJlbnRfcGF0aCgpLnBhcmVudF9wYXRoKCkucGFyZW50X3BhdGgoKSAvICJ0ZXN0IiAvICJrZXlzIjsKKyAgICBpZiAoIWJvb3N0OjpmaWxlc3lzdGVtOjpleGlzdHMoY2VydEZpbGUoInNlcnZlci5jcnQiKSkpCisgICAgeworICAgICAga2V5RGlyID0gYm9vc3Q6OmZpbGVzeXN0ZW06OnBhdGgobWFzdGVyX3Rlc3Rfc3VpdGUoKS5hcmd2W21hc3Rlcl90ZXN0X3N1aXRlKCkuYXJnYyAtIDFdKTsKKyAgICAgIGlmICghYm9vc3Q6OmZpbGVzeXN0ZW06OmV4aXN0cyhjZXJ0RmlsZSgic2VydmVyLmNydCIpKSkKKyAgICAgIHsKKyAgICAgICAgdGhyb3cgc3RkOjppbnZhbGlkX2FyZ3VtZW50KCJUaGUgbGFzdCBhcmd1bWVudCB0byB0aGlzIHRlc3QgbXVzdCBiZSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIHRlc3QgY2VydGlmaWNhdGUocykuIik7CisgICAgICB9CisgICAgfQorICAgIH0KKworICAgIHZpcnR1YWwgfkdsb2JhbEZpeHR1cmUoKQorICAgIHsKKyAgICBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpjbGVhbnVwT3BlblNTTCgpOworI2lmZGVmIF9fbGludXhfXworICAgIHNpZ25hbChTSUdQSVBFLCBTSUdfREZMKTsKKyNlbmRpZgorICAgIH0KK307CisKKyNpZiAoQk9PU1RfVkVSU0lPTiA+PSAxMDU5MDApCitCT09TVF9HTE9CQUxfRklYVFVSRShHbG9iYWxGaXh0dXJlKTsKKyNlbHNlCitCT09TVF9HTE9CQUxfRklYVFVSRShHbG9iYWxGaXh0dXJlKQorI2VuZGlmCisKK3N0cnVjdCBTZWN1cml0eUZpeHR1cmUKK3sKKyAgICB2b2lkIHNlcnZlcihhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpTU0xQcm90b2NvbCBwcm90b2NvbCkKKyAgICB7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBib29zdDo6bXV0ZXg6OnNjb3BlZF9sb2NrIGxvY2sobU11dGV4KTsKKworICAgICAgICAgICAgc2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gcFNlcnZlclNvY2tldEZhY3Rvcnk7CisgICAgICAgICAgICBzaGFyZWRfcHRyPFRTU0xTZXJ2ZXJTb2NrZXQ+IHBTZXJ2ZXJTb2NrZXQ7CisKKyAgICAgICAgICAgIHBTZXJ2ZXJTb2NrZXRGYWN0b3J5LnJlc2V0KG5ldyBUU1NMU29ja2V0RmFjdG9yeShzdGF0aWNfY2FzdDxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpTU0xQcm90b2NvbD4ocHJvdG9jb2wpKSk7CisgICAgICAgICAgICBwU2VydmVyU29ja2V0RmFjdG9yeS0+Y2lwaGVycygiQUxMOiFBREg6IUxPVzohRVhQOiFNRDU6QFNUUkVOR1RIIik7CisgICAgICAgICAgICBwU2VydmVyU29ja2V0RmFjdG9yeS0+bG9hZENlcnRpZmljYXRlKGNlcnRGaWxlKCJzZXJ2ZXIuY3J0Iikuc3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgICAgICBwU2VydmVyU29ja2V0RmFjdG9yeS0+bG9hZFByaXZhdGVLZXkoY2VydEZpbGUoInNlcnZlci5rZXkiKS5zdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgICAgIHBTZXJ2ZXJTb2NrZXRGYWN0b3J5LT5zZXJ2ZXIodHJ1ZSk7CisgICAgICAgICAgICBwU2VydmVyU29ja2V0LnJlc2V0KG5ldyBUU1NMU2VydmVyU29ja2V0KCJsb2NhbGhvc3QiLCAwLCBwU2VydmVyU29ja2V0RmFjdG9yeSkpOworICAgICAgICAgICAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBjb25uZWN0ZWRDbGllbnQ7CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBTZXJ2ZXJTb2NrZXQtPmxpc3RlbigpOworICAgICAgICAgICAgICAgIG1Qb3J0ID0gcFNlcnZlclNvY2tldC0+Z2V0UG9ydCgpOworICAgICAgICAgICAgICAgIG1DVmFyLm5vdGlmeV9vbmUoKTsKKyAgICAgICAgICAgICAgICBsb2NrLnVubG9jaygpOworCisgICAgICAgICAgICAgICAgY29ubmVjdGVkQ2xpZW50ID0gcFNlcnZlclNvY2tldC0+YWNjZXB0KCk7CisgICAgICAgICAgICAgICAgdWludDhfdCBidWZbMl07CisgICAgICAgICAgICAgICAgYnVmWzBdID0gJ08nOworICAgICAgICAgICAgICAgIGJ1ZlsxXSA9ICdLJzsKKyAgICAgICAgICAgICAgICBjb25uZWN0ZWRDbGllbnQtPndyaXRlKCZidWZbMF0sIDIpOworICAgICAgICAgICAgICAgIGNvbm5lY3RlZENsaWVudC0+Zmx1c2goKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2F0Y2ggKGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRFeGNlcHRpb24mIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJvb3N0OjptdXRleDo6c2NvcGVkX2xvY2sgbG9jayhnTXV0ZXgpOworICAgICAgICAgICAgICAgIEJPT1NUX1RFU1RfTUVTU0FHRShib29zdDo6Zm9ybWF0KCJTUlYgJTElIEV4Y2VwdGlvbjogJTIlIikgJSBib29zdDo6dGhpc190aHJlYWQ6OmdldF9pZCgpICUgZXgud2hhdCgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNvbm5lY3RlZENsaWVudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25uZWN0ZWRDbGllbnQtPmNsb3NlKCk7CisgICAgICAgICAgICAgICAgY29ubmVjdGVkQ2xpZW50LnJlc2V0KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHBTZXJ2ZXJTb2NrZXQtPmNsb3NlKCk7CisgICAgICAgICAgICBwU2VydmVyU29ja2V0LnJlc2V0KCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKHN0ZDo6ZXhjZXB0aW9uJiBleCkKKyAgICAgICAgeworICAgICAgICAgICAgQk9PU1RfRkFJTChib29zdDo6Zm9ybWF0KCIlMSU6ICUyJSIpICUgdHlwZWlkKGV4KS5uYW1lKCkgJSBleC53aGF0KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBjbGllbnQoYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6U1NMUHJvdG9jb2wgcHJvdG9jb2wpCisgICAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgc2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gcENsaWVudFNvY2tldEZhY3Rvcnk7CisgICAgICAgICAgICBzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IHBDbGllbnRTb2NrZXQ7CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBDbGllbnRTb2NrZXRGYWN0b3J5LnJlc2V0KG5ldyBUU1NMU29ja2V0RmFjdG9yeShzdGF0aWNfY2FzdDxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpTU0xQcm90b2NvbD4ocHJvdG9jb2wpKSk7CisgICAgICAgICAgICAgICAgcENsaWVudFNvY2tldEZhY3RvcnktPmF1dGhlbnRpY2F0ZSh0cnVlKTsKKyAgICAgICAgICAgICAgICBwQ2xpZW50U29ja2V0RmFjdG9yeS0+bG9hZENlcnRpZmljYXRlKGNlcnRGaWxlKCJjbGllbnQuY3J0Iikuc3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgcENsaWVudFNvY2tldEZhY3RvcnktPmxvYWRQcml2YXRlS2V5KGNlcnRGaWxlKCJjbGllbnQua2V5Iikuc3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgcENsaWVudFNvY2tldEZhY3RvcnktPmxvYWRUcnVzdGVkQ2VydGlmaWNhdGVzKGNlcnRGaWxlKCJDQS5wZW0iKS5zdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBwQ2xpZW50U29ja2V0ID0gcENsaWVudFNvY2tldEZhY3RvcnktPmNyZWF0ZVNvY2tldCgibG9jYWxob3N0IiwgbVBvcnQpOworICAgICAgICAgICAgICAgIHBDbGllbnRTb2NrZXQtPm9wZW4oKTsKKworICAgICAgICAgICAgICAgIHVpbnQ4X3QgYnVmWzNdOworICAgICAgICAgICAgICAgIGJ1ZlswXSA9IDA7CisgICAgICAgICAgICAgICAgYnVmWzFdID0gMDsKKyAgICAgICAgICAgICAgICBCT09TVF9DSEVDS19FUVVBTCgyLCBwQ2xpZW50U29ja2V0LT5yZWFkKCZidWZbMF0sIDIpKTsKKyAgICAgICAgICAgICAgICBCT09TVF9DSEVDS19FUVVBTCgwLCBtZW1jbXAoJmJ1ZlswXSwgIk9LIiwgMikpOworICAgICAgICAgICAgICAgIG1Db25uZWN0ZWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRFeGNlcHRpb24mIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJvb3N0OjptdXRleDo6c2NvcGVkX2xvY2sgbG9jayhnTXV0ZXgpOworICAgICAgICAgICAgICAgIEJPT1NUX1RFU1RfTUVTU0FHRShib29zdDo6Zm9ybWF0KCJDTEkgJTElIEV4Y2VwdGlvbjogJTIlIikgJSBib29zdDo6dGhpc190aHJlYWQ6OmdldF9pZCgpICUgZXgud2hhdCgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHBDbGllbnRTb2NrZXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcENsaWVudFNvY2tldC0+Y2xvc2UoKTsKKyAgICAgICAgICAgICAgICBwQ2xpZW50U29ja2V0LnJlc2V0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKHN0ZDo6ZXhjZXB0aW9uJiBleCkKKyAgICAgICAgeworICAgICAgICAgICAgQk9PU1RfRkFJTChib29zdDo6Zm9ybWF0KCIlMSU6ICUyJSIpICUgdHlwZWlkKGV4KS5uYW1lKCkgJSBleC53aGF0KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIGNvbnN0IGNoYXIgKnByb3RvY29sMnN0cihzaXplX3QgcHJvdG9jb2wpCisgICAgeworICAgICAgICBzdGF0aWMgY29uc3QgY2hhciAqc3RyaW5nc1thcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpMQVRFU1QgKyAxXSA9CisgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiU1NMVExTIiwKKyAgICAgICAgICAgICAgICAiU1NMdjIiLAorICAgICAgICAgICAgICAgICJTU0x2MyIsCisgICAgICAgICAgICAgICAgIlRMU3YxXzAiLAorICAgICAgICAgICAgICAgICJUTFN2MV8xIiwKKyAgICAgICAgICAgICAgICAiVExTdjFfMiIKKyAgICAgICAgfTsKKyAgICAgICAgcmV0dXJuIHN0cmluZ3NbcHJvdG9jb2xdOworICAgIH0KKworICAgIGJvb3N0OjptdXRleCBtTXV0ZXg7CisgICAgYm9vc3Q6OmNvbmRpdGlvbl92YXJpYWJsZSBtQ1ZhcjsKKyAgICBpbnQgbVBvcnQ7CisgICAgYm9vbCBtQ29ubmVjdGVkOworfTsKKworQk9PU1RfRklYVFVSRV9URVNUX1NVSVRFKEJPT1NUX1RFU1RfTU9EVUxFLCBTZWN1cml0eUZpeHR1cmUpCisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHNzbF9zZWN1cml0eV9tYXRyaXgpCit7CisgICAgdHJ5CisgICAgeworICAgICAgICAvLyBtYXRyaXggb2YgY29ubmVjdGlvbiBzdWNjZXNzIGJldHdlZW4gY2xpZW50IGFuZCBzZXJ2ZXIgd2l0aCBkaWZmZXJlbnQgU1NMUHJvdG9jb2wgc2VsZWN0aW9ucworICAgICAgICBib29sIG1hdHJpeFthcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpMQVRFU1QgKyAxXVthcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpMQVRFU1QgKyAxXSA9CisgICAgICAgIHsKKyAgICAvLyAgIHNlcnZlciAgICA9IFNTTFRMUyAgIFNTTHYyICAgIFNTTHYzICAgIFRMU3YxXzAgIFRMU3YxXzEgIFRMU3YxXzIKKyAgICAvLyBjbGllbnQKKyAgICAvKiBTU0xUTFMgICovICB7IHRydWUsICAgIGZhbHNlLCAgIGZhbHNlLCAgIHRydWUsICAgIHRydWUsICAgIHRydWUgICAgfSwKKyAgICAvKiBTU0x2MiAgICovICB7IGZhbHNlLCAgIGZhbHNlLCAgIGZhbHNlLCAgIGZhbHNlLCAgIGZhbHNlLCAgIGZhbHNlICAgfSwKKyAgICAvKiBTU0x2MyAgICovICB7IGZhbHNlLCAgIGZhbHNlLCAgIHRydWUsICAgIGZhbHNlLCAgIGZhbHNlLCAgIGZhbHNlICAgfSwKKyAgICAvKiBUTFN2MV8wICovICB7IHRydWUsICAgIGZhbHNlLCAgIGZhbHNlLCAgIHRydWUsICAgIGZhbHNlLCAgIGZhbHNlICAgfSwKKyAgICAvKiBUTFN2MV8xICovICB7IHRydWUsICAgIGZhbHNlLCAgIGZhbHNlLCAgIGZhbHNlLCAgIHRydWUsICAgIGZhbHNlICAgfSwKKyAgICAvKiBUTFN2MV8yICovICB7IHRydWUsICAgIGZhbHNlLCAgIGZhbHNlLCAgIGZhbHNlLCAgIGZhbHNlLCAgIHRydWUgICAgfQorICAgICAgICB9OworCisgICAgICAgIGZvciAoc2l6ZV90IHNpID0gMDsgc2kgPD0gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6TEFURVNUOyArK3NpKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBjaSA9IDA7IGNpIDw9IGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OkxBVEVTVDsgKytjaSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoc2kgPT0gMSB8fCBjaSA9PSAxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gU2tpcCBhbGwgU1NMdjIgY2FzZXMgLSBwcm90b2NvbCBub3Qgc3VwcG9ydGVkCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworI2lmZGVmIE9QRU5TU0xfTk9fU1NMMworICAgICAgICAgICAgICAgIGlmIChzaSA9PSAyIHx8IGNpID09IDIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIGFsbCBTU0x2MyBjYXNlcyAtIHByb3RvY29sIG5vdCBzdXBwb3J0ZWQKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgICAgICAgICBib29zdDo6bXV0ZXg6OnNjb3BlZF9sb2NrIGxvY2sobU11dGV4KTsKKworICAgICAgICAgICAgICAgIEJPT1NUX1RFU1RfTUVTU0FHRShib29zdDo6Zm9ybWF0KCJURVNUOiBTZXJ2ZXIgPSAlMSUsIENsaWVudCA9ICUyJSIpCisgICAgICAgICAgICAgICAgICAgICUgcHJvdG9jb2wyc3RyKHNpKSAlIHByb3RvY29sMnN0cihjaSkpOworCisgICAgICAgICAgICAgICAgbUNvbm5lY3RlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIC8vIHRocmVhZF9ncm91cCBtYW5hZ2VzIHRoZSB0aHJlYWQgbGlmZXRpbWUgLSBpZ25vcmUgdGhlIHJldHVybiB2YWx1ZSBvZiBjcmVhdGVfdGhyZWFkCisgICAgICAgICAgICAgICAgYm9vc3Q6OnRocmVhZF9ncm91cCB0aHJlYWRzOworICAgICAgICAgICAgICAgICh2b2lkKXRocmVhZHMuY3JlYXRlX3RocmVhZChiaW5kKCZTZWN1cml0eUZpeHR1cmU6OnNlcnZlciwgdGhpcywgc3RhdGljX2Nhc3Q8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6U1NMUHJvdG9jb2w+KHNpKSkpOworICAgICAgICAgICAgICAgIG1DVmFyLndhaXQobG9jayk7ICAgICAgICAgICAvLyB3YWl0IGZvciBsaXN0ZW4oKSB0byBzdWNjZWVkCisgICAgICAgICAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgICAgICAodm9pZCl0aHJlYWRzLmNyZWF0ZV90aHJlYWQoYmluZCgmU2VjdXJpdHlGaXh0dXJlOjpjbGllbnQsIHRoaXMsIHN0YXRpY19jYXN0PGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlNTTFByb3RvY29sPihjaSkpKTsKKyAgICAgICAgICAgICAgICB0aHJlYWRzLmpvaW5fYWxsKCk7CisKKyAgICAgICAgICAgICAgICBCT09TVF9DSEVDS19NRVNTQUdFKG1Db25uZWN0ZWQgPT0gbWF0cml4W2NpXVtzaV0sCisgICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6Zm9ybWF0KCIgICAgICBTZXJ2ZXIgPSAlMSUsIENsaWVudCA9ICUyJSBleHBlY3RlZCBtQ29ubmVjdGVkID09ICUzJSBidXQgd2FzICU0JSIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSBwcm90b2NvbDJzdHIoc2kpICUgcHJvdG9jb2wyc3RyKGNpKSAlIG1hdHJpeFtjaV1bc2ldICUgbUNvbm5lY3RlZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgY2F0Y2ggKHN0ZDo6ZXhjZXB0aW9uJiBleCkKKyAgICB7CisgICAgICAgIEJPT1NUX0ZBSUwoYm9vc3Q6OmZvcm1hdCgiJTElOiAlMiUiKSAlIHR5cGVpZChleCkubmFtZSgpICUgZXgud2hhdCgpKTsKKyAgICB9Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURV9FTkQoKQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L1NwZWNpYWxpemF0aW9uVGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvU3BlY2lhbGl6YXRpb25UZXN0LmNwcAppbmRleCAwYmVmMTJhLi4wMDg4MzdkIDEwMDY0NAotLS0gYS9saWIvY3BwL3Rlc3QvU3BlY2lhbGl6YXRpb25UZXN0LmNwcAorKysgYi9saWIvY3BwL3Rlc3QvU3BlY2lhbGl6YXRpb25UZXN0LmNwcApAQCAtMSwzMSArMSwzMCBAQAogI2RlZmluZSBfVVNFX01BVEhfREVGSU5FUwotI2luY2x1ZGUgPGlvc3RyZWFtPgogI2luY2x1ZGUgPGNtYXRoPgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPgogI2luY2x1ZGUgPGdlbi1jcHAvRGVidWdQcm90b1Rlc3RfdHlwZXMuaD4KIAotdXNpbmcgc3RkOjpjb3V0OwotdXNpbmcgc3RkOjplbmRsOwogdXNpbmcgbmFtZXNwYWNlIHRocmlmdDo6dGVzdDo6ZGVidWc7CiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDsKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w7CiAKKyNkZWZpbmUgQk9PU1RfVEVTVF9NT0RVTEUgU3BlY2lhbGl6YXRpb25UZXN0CisjaW5jbHVkZSA8Ym9vc3QvdGVzdC91bml0X3Rlc3QuaHBwPgorCiB0eXBlZGVmIFRCaW5hcnlQcm90b2NvbFQ8VE1lbW9yeUJ1ZmZlcj4gTXlQcm90b2NvbDsKLS8vdHlwZWRlZiBUQmluYXJ5UHJvdG9jb2xUPFRUcmFuc3BvcnQ+IE15UHJvdG9jb2w7CisvLyB0eXBlZGVmIFRCaW5hcnlQcm90b2NvbFQ8VFRyYW5zcG9ydD4gTXlQcm90b2NvbDsKIAotaW50IG1haW4oKSB7Ci0KK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3Rfc3BlY2lhbGl6YXRpb25fMSkgewogICBPbmVPZkVhY2ggb29lOwotICBvb2UuaW1fdHJ1ZSAgID0gdHJ1ZTsKLSAgb29lLmltX2ZhbHNlICA9IGZhbHNlOwotICBvb2UuYV9iaXRlICAgID0gMHg3ZjsKKyAgb29lLmltX3RydWUgPSB0cnVlOworICBvb2UuaW1fZmFsc2UgPSBmYWxzZTsKKyAgb29lLmFfYml0ZSA9IDB4N2Y7CiAgIG9vZS5pbnRlZ2VyMTYgPSAyNzAwMDsKLSAgb29lLmludGVnZXIzMiA9IDE8PDI0OworICBvb2UuaW50ZWdlcjMyID0gMSA8PCAyNDsKICAgb29lLmludGVnZXI2NCA9ICh1aW50NjRfdCk2MDAwICogMTAwMCAqIDEwMDA7CiAgIG9vZS5kb3VibGVfcHJlY2lzaW9uID0gTV9QSTsKLSAgb29lLnNvbWVfY2hhcmFjdGVycyAgPSAiSlNPTiBUSElTISBcIlwxIjsKLSAgb29lLnpvbWdfdW5pY29kZSAgICAgPSAiXHhkN1xuXGFcdCI7CisgIG9vZS5zb21lX2NoYXJhY3RlcnMgPSAiSlNPTiBUSElTISBcIlwxIjsKKyAgb29lLnpvbWdfdW5pY29kZSA9ICJceGQ3XG5cYVx0IjsKICAgb29lLmJhc2U2NCA9ICJcMVwyXDNcMjU1IjsKIAogICBOZXN0aW5nIG47CkBAIC0zMywxMiArMzIsMTQgQEAKICAgbi5teV9vb2UuaW50ZWdlcjE2ID0gMTY7CiAgIG4ubXlfb29lLmludGVnZXIzMiA9IDMyOwogICBuLm15X29vZS5pbnRlZ2VyNjQgPSA2NDsKLSAgbi5teV9vb2UuZG91YmxlX3ByZWNpc2lvbiA9IChzdGQ6OnNxcnQoNS4wKSsxKS8yOwotICBuLm15X29vZS5zb21lX2NoYXJhY3RlcnMgID0gIjpSIChtZSBnb2luZyBcInJycnJcIikiOwotICBuLm15X29vZS56b21nX3VuaWNvZGUgICAgID0gIlx4ZDNceDgwXHhlMlx4ODVceGFlXHhjZVx4OWRceDIwIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4ZDBceDlkXHhjZVx4YmZceGUyXHg4NVx4YmZceGQwXHhiZVx4YzlceGExXHhkMFx4YjNceGQwXHhiMFx4Y2ZceDgxXHhlMlx4ODRceDhlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4MjBceGNlXHg5MVx4NzRceDc0XHhjZVx4YjFceGUyXHg4NVx4YmRceGNlXHhiYVx4YzdceDgzXHhlMlx4ODBceGJjIjsKLSAgbi5teV9ib25rLnR5cGUgICAgPSAzMTMzNzsKKyAgbi5teV9vb2UuZG91YmxlX3ByZWNpc2lvbiA9IChzdGQ6OnNxcnQoNS4wKSArIDEpIC8gMjsKKyAgbi5teV9vb2Uuc29tZV9jaGFyYWN0ZXJzID0gIjpSIChtZSBnb2luZyBcInJycnJcIikiOworICBuLm15X29vZS56b21nX3VuaWNvZGUgICAgID0gIlx4ZDNceDgwXHhlMlx4ODVceGFlXHhjZVx4OWRceDIwXHhkMFx4OWRceGNlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4YmZceGUyXHg4NVx4YmZceGQwXHhiZVx4YzlceGExXHhkMFx4YjNceGQwIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4YjBceGNmXHg4MVx4ZTJceDg0XHg4ZVx4MjBceGNlXHg5MVx4NzRceDc0IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4Y2VceGIxXHhlMlx4ODVceGJkXHhjZVx4YmFceGM3XHg4M1x4ZTJceDgwIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4YmMiOworICBuLm15X2JvbmsudHlwZSA9IDMxMzM3OwogICBuLm15X2JvbmsubWVzc2FnZSA9ICJJIGFtIGEgYm9uay4uLiB4b3IhIjsKIAogICBIb2x5TW9sZXkgaG07CkBAIC02Miw0OCArNjMsNDEgQEAKIAogICBzdGQ6OnZlY3RvcjxCb25rPiBzdGFnZTI7CiAgIGhtLmJvbmtzWyJub3RoaW5nIl0gPSBzdGFnZTI7Ci0gIHN0YWdlMi5yZXNpemUoc3RhZ2UyLnNpemUoKSsxKTsKKyAgc3RhZ2UyLnJlc2l6ZShzdGFnZTIuc2l6ZSgpICsgMSk7CiAgIHN0YWdlMi5iYWNrKCkudHlwZSA9IDE7CiAgIHN0YWdlMi5iYWNrKCkubWVzc2FnZSA9ICJXYWl0LiI7Ci0gIHN0YWdlMi5yZXNpemUoc3RhZ2UyLnNpemUoKSsxKTsKKyAgc3RhZ2UyLnJlc2l6ZShzdGFnZTIuc2l6ZSgpICsgMSk7CiAgIHN0YWdlMi5iYWNrKCkudHlwZSA9IDI7CiAgIHN0YWdlMi5iYWNrKCkubWVzc2FnZSA9ICJXaGF0PyI7CiAgIGhtLmJvbmtzWyJzb21ldGhpbmciXSA9IHN0YWdlMjsKICAgc3RhZ2UyLmNsZWFyKCk7Ci0gIHN0YWdlMi5yZXNpemUoc3RhZ2UyLnNpemUoKSsxKTsKKyAgc3RhZ2UyLnJlc2l6ZShzdGFnZTIuc2l6ZSgpICsgMSk7CiAgIHN0YWdlMi5iYWNrKCkudHlwZSA9IDM7CiAgIHN0YWdlMi5iYWNrKCkubWVzc2FnZSA9ICJxdW90aCI7Ci0gIHN0YWdlMi5yZXNpemUoc3RhZ2UyLnNpemUoKSsxKTsKKyAgc3RhZ2UyLnJlc2l6ZShzdGFnZTIuc2l6ZSgpICsgMSk7CiAgIHN0YWdlMi5iYWNrKCkudHlwZSA9IDQ7CiAgIHN0YWdlMi5iYWNrKCkubWVzc2FnZSA9ICJ0aGUgcmF2ZW4iOwotICBzdGFnZTIucmVzaXplKHN0YWdlMi5zaXplKCkrMSk7CisgIHN0YWdlMi5yZXNpemUoc3RhZ2UyLnNpemUoKSArIDEpOwogICBzdGFnZTIuYmFjaygpLnR5cGUgPSA1OwogICBzdGFnZTIuYmFjaygpLm1lc3NhZ2UgPSAibmV2ZXJtb3JlIjsKICAgaG0uYm9ua3NbInBvZSJdID0gc3RhZ2UyOwogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZmZlcihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90byhuZXcgTXlQcm90b2NvbChidWZmZXIpKTsKLQotICBjb3V0IDw8ICJUZXN0aW5nIG9vZSIgPDwgZW5kbDsKKyAgc3RkOjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZmZlcihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG8obmV3IE15UHJvdG9jb2woYnVmZmVyKSk7CiAKICAgb29lLndyaXRlKHByb3RvLmdldCgpKTsKICAgT25lT2ZFYWNoIG9vZTI7CiAgIG9vZTIucmVhZChwcm90by5nZXQoKSk7CiAKLSAgYXNzZXJ0KG9vZSA9PSBvb2UyKTsKLQotCi0gIGNvdXQgPDwgIlRlc3RpbmcgaG0iIDw8IGVuZGw7CisgIEJPT1NUX0NIRUNLKG9vZSA9PSBvb2UyKTsKIAogICBobS53cml0ZShwcm90by5nZXQoKSk7CiAgIEhvbHlNb2xleSBobTI7CiAgIGhtMi5yZWFkKHByb3RvLmdldCgpKTsKIAotICBhc3NlcnQoaG0gPT0gaG0yKTsKKyAgQk9PU1RfQ0hFQ0soaG0gPT0gaG0yKTsKIAogICBobTIuYmlnWzBdLmFfYml0ZSA9IDB4MDA7CiAKLSAgYXNzZXJ0KGhtICE9IGhtMik7Ci0KLSAgcmV0dXJuIDA7CisgIEJPT1NUX0NIRUNLKGhtICE9IGhtMik7CiB9CmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvVEJ1ZmZlckJhc2VUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9UQnVmZmVyQmFzZVRlc3QuY3BwCmluZGV4IDVkMGJmNDUuLjQzMDMwMmMgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvdGVzdC9UQnVmZmVyQmFzZVRlc3QuY3BwCisrKyBiL2xpYi9jcHAvdGVzdC9UQnVmZmVyQmFzZVRlc3QuY3BwCkBAIC0yMSwxMyArMjEsMTQgQEAKICNpbmNsdWRlIDxib29zdC90ZXN0L2F1dG9fdW5pdF90ZXN0LmhwcD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU2hvcnRSZWFkVHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8bWVtb3J5PgogCi11c2luZyBzdGQ6OnN0cmluZzsKLXVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlcjsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRCdWZmZXJlZFRyYW5zcG9ydDsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRGcmFtZWRUcmFuc3BvcnQ7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0Ojp0ZXN0OjpUU2hvcnRSZWFkVHJhbnNwb3J0OwordXNpbmcgc3RkOjpzdHJpbmc7CiAKIC8vIFNoYW1lbGVzc2x5IGNvcGllZCBmcm9tIFpsaWJUcmFuc3BvcnQuICBUT0RPOiByZWZhY3Rvci4KIHVuc2lnbmVkIGludCBkaXN0W11bNTAwMF0gPSB7CkBAIC01NjYsNyArNTY3LDcgQEAKICAgICAgIGZvciAoaW50IGQxID0gMDsgZDEgPCAzOyBkMSsrKSB7CiAgICAgICAgIHNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmZmVyKG5ldyBUTWVtb3J5QnVmZmVyKDE2KSk7CiAgICAgICAgIFRGcmFtZWRUcmFuc3BvcnQgdHJhbnMoYnVmZmVyLCBzaXplKTsKLSAgICAgICAgdWludDhfdCBkYXRhX291dFsxPDwxNV07CisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRhdGFfb3V0KDE8PDE3LCAwKTsKICAgICAgICAgc3RkOjp2ZWN0b3I8aW50PiBmbHVzaF9zaXplczsKIAogICAgICAgICBpbnQgd3JpdGVfb2Zmc2V0ID0gMDsKQEAgLTYwNCw3ICs2MDUsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoKHVuc2lnbmVkIGludClyZWFkX29mZnNldCwgc2l6ZW9mKGRhdGEpKTsKLSAgICAgICAgQk9PU1RfQ0hFQ0soIW1lbWNtcChkYXRhLCBkYXRhX291dCwgc2l6ZW9mKGRhdGEpKSk7CisgICAgICAgIEJPT1NUX0NIRUNLKCFtZW1jbXAoZGF0YSwgJmRhdGFfb3V0WzBdLCBzaXplb2YoZGF0YSkpKTsKICAgICAgIH0KICAgICB9CiAgIH0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9URkRUcmFuc3BvcnRUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9URkRUcmFuc3BvcnRUZXN0LmNwcAppbmRleCA3Yjk2MmQ4Li4wYmEwMzVhIDEwMDY0NAotLS0gYS9saWIvY3BwL3Rlc3QvVEZEVHJhbnNwb3J0VGVzdC5jcHAKKysrIGIvbGliL2NwcC90ZXN0L1RGRFRyYW5zcG9ydFRlc3QuY3BwCkBAIC0xOSw0MiArMTksMzIgQEAKIAogI2luY2x1ZGUgPGNzdGRsaWI+CiAjaW5jbHVkZSA8c3RkZXhjZXB0PgotI2luY2x1ZGUgPGlvc3RyZWFtPgogI2luY2x1ZGUgPHRocmlmdC9UaHJpZnQuaD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RGRFRyYW5zcG9ydC5oPgorCisjZGVmaW5lIEJPT1NUX1RFU1RfTU9EVUxFIFRGRFRyYW5zcG9ydFRlc3QKKyNpbmNsdWRlIDxib29zdC90ZXN0L3VuaXRfdGVzdC5ocHA+CisKKy8vIERpc2FibGVkIG9uIE1TVkMgYmVjYXVzZSB0aGUgUlRMIGFzc2VydHMgb24gYW4gaW52YWxpZCBmaWxlIGRlc2NyaXB0b3IKKy8vIGluIGJvdGggZGVidWcgYW5kIHJlbGVhc2UgbW9kZTsgYXQgbGVhc3QgaW4gTVNWQ1IxMDAgKFZpc3VhbCBTdHVkaW8gMjAxMCkKKyNpZiAhZGVmaW5lZChXSU4zMikKKwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRGRFRyYW5zcG9ydDsKIAotY2xhc3MgRHVtbXlFeGNlcHRpb24gOiBzdGQ6OmV4Y2VwdGlvbiB7Ci19OwotCi1pbnQgbWFpbigpIHsKLSAgewotICAgIFRGRFRyYW5zcG9ydCB0KDI1NiwgVEZEVHJhbnNwb3J0OjpOT19DTE9TRV9PTl9ERVNUUk9ZKTsKLSAgfQotCi0gIHRyeSB7Ci0gICAgewotICAgICAgVEZEVHJhbnNwb3J0IHQoMjU2LCBURkRUcmFuc3BvcnQ6OkNMT1NFX09OX0RFU1RST1kpOwotICAgICAgdC5jbG9zZSgpOwotICAgIH0KLSAgICBzdGQ6OmNvdXQgPDwgIk5PVCBPSyAwISIgPDwgc3RkOjplbmRsOwotICAgIHN0ZDo6YWJvcnQoKTsKLSAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbikgewotICAgIHN0ZDo6Y291dCA8PCAiT0shIiA8PCBzdGQ6OmVuZGw7Ci0gIH0KLQotICB0cnkgewotICAgIHsKLSAgICAgIFRGRFRyYW5zcG9ydCB0KDI1NiwgVEZEVHJhbnNwb3J0OjpDTE9TRV9PTl9ERVNUUk9ZKTsKLSAgICAgIHRocm93IER1bW15RXhjZXB0aW9uKCk7Ci0gICAgfQotICAgIHN0ZDo6YWJvcnQoKTsKLSAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYpIHsKLSAgICBzdGQ6OmFib3J0KCk7Ci0gIH0gY2F0Y2ggKER1bW15RXhjZXB0aW9uJikgewotICB9Ci0KLSAgcmV0dXJuIDA7Ci0KK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfdGZkdHJhbnNwb3J0XzEpIHsKKyAgQk9PU1RfQ0hFQ0tfTk9fVEhST1coVEZEVHJhbnNwb3J0IHQoMjU2LCBURkRUcmFuc3BvcnQ6OkNMT1NFX09OX0RFU1RST1kpKTsKIH0KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF90ZmR0cmFuc3BvcnRfMikgeworICBURkRUcmFuc3BvcnQgdCgyNTYsIFRGRFRyYW5zcG9ydDo6Q0xPU0VfT05fREVTVFJPWSk7CisgIEJPT1NUX0NIRUNLX1RIUk9XKHQuY2xvc2UoKSwgVFRyYW5zcG9ydEV4Y2VwdGlvbik7Cit9CisKKyNlbHNlCisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfdGZkdHJhbnNwb3J0X2R1bW15KSB7CisgIEJPT1NUX0NIRUNLKHRydWUpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9URmlsZVRyYW5zcG9ydFRlc3QuY3BwIGIvbGliL2NwcC90ZXN0L1RGaWxlVHJhbnNwb3J0VGVzdC5jcHAKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCA2N2UwNWUzLi5kMGMyNmIzCi0tLSBhL2xpYi9jcHAvdGVzdC9URmlsZVRyYW5zcG9ydFRlc3QuY3BwCisrKyBiL2xpYi9jcHAvdGVzdC9URmlsZVRyYW5zcG9ydFRlc3QuY3BwCkBAIC0zMCw2ICszMCwxNCBAQAogCiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9URmlsZVRyYW5zcG9ydC5oPgogCisjaWZkZWYgX19NSU5HVzMyX18KKyAgI2luY2x1ZGUgPGlvLmg+CisgICNpbmNsdWRlIDx1bmlzdGQuaD4KKyAgI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorICAjaW5jbHVkZSA8ZmNudGwuaD4KKyAgI2luY2x1ZGUgPHN5c1xzdGF0Lmg+CisjZW5kaWYKKwogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNDEsMzAgKzQ5LDE1IEBACiBjbGFzcyBGc3luY0xvZzsKIEZzeW5jTG9nKiBmc3luY19sb2c7CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBIZWxwZXIgY29kZQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0vLyBQcm92aWRlIEJPT1NUX1dBUk5fTFQoKSBhbmQgQk9PU1RfV0FSTl9HVCgpLCBpbiBjYXNlIHdlJ3JlIGNvbXBpbGVkCi0vLyB3aXRoIGFuIG9sZGVyIHZlcnNpb24gb2YgYm9vc3QKLSNpZm5kZWYgQk9PU1RfV0FSTl9MVAotI2RlZmluZSBCT09TVF9XQVJOX0NNUChhLCBiLCBvcCwgY2hlY2tfZm4pIFwKLSAgY2hlY2tfZm4oKGEpIG9wIChiKSwgXAotICAgICAgICAgICAiY2hlY2sgIiBCT09TVF9TVFJJTkdJWkUoYSkgIiAiIEJPT1NUX1NUUklOR0laRShvcCkgIiAiIFwKLSAgICAgICAgICAgQk9PU1RfU1RSSU5HSVpFKGIpICIgZmFpbGVkOiAiIEJPT1NUX1NUUklOR0laRShhKSAiPSIgPDwgKGEpIDw8IFwKLSAgICAgICAgICAgIiAiIEJPT1NUX1NUUklOR0laRShiKSAiPSIgPDwgKGIpKQotCi0jZGVmaW5lIEJPT1NUX1dBUk5fTFQoYSwgYikgQk9PU1RfV0FSTl9DTVAoYSwgYiwgPCwgQk9PU1RfV0FSTl9NRVNTQUdFKQotI2RlZmluZSBCT09TVF9XQVJOX0dUKGEsIGIpIEJPT1NUX1dBUk5fQ01QKGEsIGIsID4sIEJPT1NUX1dBUk5fTUVTU0FHRSkKLSNkZWZpbmUgQk9PU1RfV0FSTl9MVChhLCBiKSBCT09TVF9XQVJOX0NNUChhLCBiLCA8LCBCT09TVF9XQVJOX01FU1NBR0UpCi0jZW5kaWYgLy8gQk9PU1RfV0FSTl9MVAotCiAvKioKICAqIENsYXNzIHRvIHJlY29yZCBjYWxscyB0byBmc3luYwogICovCiBjbGFzcyBGc3luY0xvZyB7Ci0gcHVibGljOgorcHVibGljOgogICBzdHJ1Y3QgRnN5bmNDYWxsIHsKICAgICBzdHJ1Y3QgdGltZXZhbCB0aW1lOwogICAgIGludCBmZDsKQEAgLTc0LDE3ICs2NywxNSBAQAogICBGc3luY0xvZygpIHt9CiAKICAgdm9pZCBmc3luYyhpbnQgZmQpIHsKLSAgICAodm9pZCkgZmQ7CisgICAgKHZvaWQpZmQ7CiAgICAgRnN5bmNDYWxsIGNhbGw7Ci0gICAgZ2V0dGltZW9mZGF5KCZjYWxsLnRpbWUsIE5VTEwpOworICAgIFRIUklGVF9HRVRUSU1FT0ZEQVkoJmNhbGwudGltZSwgTlVMTCk7CiAgICAgY2FsbHNfLnB1c2hfYmFjayhjYWxsKTsKICAgfQogCi0gIGNvbnN0IENhbGxMaXN0KiBnZXRDYWxscygpIGNvbnN0IHsKLSAgICByZXR1cm4gJmNhbGxzXzsKLSAgfQorICBjb25zdCBDYWxsTGlzdCogZ2V0Q2FsbHMoKSBjb25zdCB7IHJldHVybiAmY2FsbHNfOyB9CiAKLSBwcml2YXRlOgorcHJpdmF0ZToKICAgQ2FsbExpc3QgY2FsbHNfOwogfTsKIApAQCAtOTIsOCArODMsMjIgQEAKICAqIEhlbHBlciBjbGFzcyB0byBjbGVhbiB1cCB0ZW1wb3JhcnkgZmlsZXMKICAqLwogY2xhc3MgVGVtcEZpbGUgewotIHB1YmxpYzoKK3B1YmxpYzoKICAgVGVtcEZpbGUoY29uc3QgY2hhciogZGlyZWN0b3J5LCBjb25zdCBjaGFyKiBwcmVmaXgpIHsKKyAgI2lmZGVmIF9fTUlOR1czMl9fCisgICAgKCh2b2lkKWRpcmVjdG9yeSk7CisgICAgc2l6ZV90IHBhdGhfbGVuID0gc3RybGVuKHByZWZpeCkgKyA4OworICAgIHBhdGhfID0gbmV3IGNoYXJbcGF0aF9sZW5dOworICAgIHNucHJpbnRmKHBhdGhfLCBwYXRoX2xlbiwgIiVzWFhYWFhYIiwgcHJlZml4KTsKKyAgICBpZiAoX21rdGVtcF9zKHBhdGhfLHBhdGhfbGVuKSA9PSAwKSB7CisgICAgICBmZF8gPSBvcGVuKHBhdGhfLE9fQ1JFQVQgfCBPX1JEV1IgfCBPX0JJTkFSWSxTX0lSRUFEIHwgU19JV1JJVEUpOworICAgICAgaWYgKGZkXyA8IDApIHsKKyAgICAgICAgdGhyb3cgYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24oIl9ta3RlbXBfcygpIGZhaWxlZCIpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICB0aHJvdyBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbigiX21rdGVtcF9zKCkgZmFpbGVkIik7CisgICAgfQorICAjZWxzZQogICAgIHNpemVfdCBwYXRoX2xlbiA9IHN0cmxlbihkaXJlY3RvcnkpICsgc3RybGVuKHByZWZpeCkgKyA4OwogICAgIHBhdGhfID0gbmV3IGNoYXJbcGF0aF9sZW5dOwogICAgIHNucHJpbnRmKHBhdGhfLCBwYXRoX2xlbiwgIiVzLyVzWFhYWFhYIiwgZGlyZWN0b3J5LCBwcmVmaXgpOwpAQCAtMTAyLDYgKzEwNyw3IEBACiAgICAgaWYgKGZkXyA8IDApIHsKICAgICAgIHRocm93IGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uKCJta3N0ZW1wKCkgZmFpbGVkIik7CiAgICAgfQorICAjZW5kaWYKICAgfQogCiAgIH5UZW1wRmlsZSgpIHsKQEAgLTEwOSwxMyArMTE1LDkgQEAKICAgICBjbG9zZSgpOwogICB9CiAKLSAgY29uc3QgY2hhciogZ2V0UGF0aCgpIGNvbnN0IHsKLSAgICByZXR1cm4gcGF0aF87Ci0gIH0KKyAgY29uc3QgY2hhciogZ2V0UGF0aCgpIGNvbnN0IHsgcmV0dXJuIHBhdGhfOyB9CiAKLSAgaW50IGdldEZEKCkgY29uc3QgewotICAgIHJldHVybiBmZF87Ci0gIH0KKyAgaW50IGdldEZEKCkgY29uc3QgeyByZXR1cm4gZmRfOyB9CiAKICAgdm9pZCB1bmxpbmsoKSB7CiAgICAgaWYgKHBhdGhfKSB7CkBAIC0xMzQsNyArMTM2LDcgQEAKICAgICBmZF8gPSAtMTsKICAgfQogCi0gcHJpdmF0ZToKK3ByaXZhdGU6CiAgIGNoYXIqIHBhdGhfOwogICBpbnQgZmRfOwogfTsKQEAgLTE0Miw4ICsxNDQsNyBAQAogLy8gVXNlIG91ciBvd24gdmVyc2lvbiBvZiBmc3luYygpIGZvciB0ZXN0aW5nLgogLy8gVGhpcyByZXR1cm5zIGltbWVkaWF0ZWx5LCBzbyB0aW1pbmcgaW4gdGVzdF9kZXN0cnVjdG9yKCkgaXNuJ3QgYWZmZWN0ZWQgYnkKIC8vIHdhaXRpbmcgb24gdGhlIGFjdHVhbCBmaWxlc3lzdGVtLgotZXh0ZXJuICJDIgotaW50IGZzeW5jKGludCBmZCkgeworZXh0ZXJuICJDIiBpbnQgZnN5bmMoaW50IGZkKSB7CiAgIGlmIChmc3luY19sb2cpIHsKICAgICBmc3luY19sb2ctPmZzeW5jKGZkKTsKICAgfQpAQCAtMTU0LDcgKzE1NSw2IEBACiAgIHJldHVybiAodDItPnR2X3VzZWMgLSB0MS0+dHZfdXNlYykgKyAodDItPnR2X3NlYyAtIHQxLT50dl9zZWMpICogMTAwMDAwMDsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFRlc3QgY2FzZXMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTE3Niw3ICsxNzYsNyBAQAogCiAgIHVuc2lnbmVkIGludCBudW1fb3ZlciA9IDA7CiAgIGZvciAodW5zaWduZWQgaW50IG4gPSAwOyBuIDwgTlVNX0lURVJBVElPTlM7ICsrbikgewotICAgIGZ0cnVuY2F0ZShmLmdldEZEKCksIDApOworICAgIEJPT1NUX0NIRUNLX0VRVUFMKDAsIGZ0cnVuY2F0ZShmLmdldEZEKCksIDApKTsKIAogICAgIFRGaWxlVHJhbnNwb3J0KiB0cmFuc3BvcnQgPSBuZXcgVEZpbGVUcmFuc3BvcnQoZi5nZXRQYXRoKCkpOwogCkBAIC0xOTUsMTYgKzE5NSwxNiBAQAogICAgIHN0cnVjdCB0aW1ldmFsIHN0YXJ0OwogICAgIHN0cnVjdCB0aW1ldmFsIGVuZDsKIAotICAgIGdldHRpbWVvZmRheSgmc3RhcnQsIE5VTEwpOworICAgIFRIUklGVF9HRVRUSU1FT0ZEQVkoJnN0YXJ0LCBOVUxMKTsKICAgICBkZWxldGUgdHJhbnNwb3J0OwotICAgIGdldHRpbWVvZmRheSgmZW5kLCBOVUxMKTsKKyAgICBUSFJJRlRfR0VUVElNRU9GREFZKCZlbmQsIE5VTEwpOwogCiAgICAgaW50IGRlbHRhID0gdGltZV9kaWZmKCZzdGFydCwgJmVuZCk7CiAKICAgICAvLyBJZiBhbnkgYXR0ZW1wdCB0YWtlcyBtb3JlIHRoYW4gNTAwbXMsIHRyZWF0IHRoYXQgYXMgYSBmYWlsdXJlLgogICAgIC8vIFRyZWF0IHRoaXMgYXMgYSBmYXRhbCBmYWlsdXJlLCBzbyB3ZSdsbCByZXR1cm4gbm93IGluc3RlYWQgb2YKICAgICAvLyBsb29waW5nIG92ZXIgYSB2ZXJ5IHNsb3cgb3BlcmF0aW9uLgotICAgIEJPT1NUX1dBUk5fTFQoZGVsdGEsIDUwMDAwMCk7CisgICAgQk9PU1RfV0FSTiggZGVsdGEgPCA1MDAwMDAgKTsKIAogICAgIC8vIE5vcm1hbGx5LCBpdCB0YWtlcyBsZXNzIHRoYW4gMTAwbXMgb24gbXkgZGV2IGJveC4KICAgICAvLyBIb3dldmVyLCBpZiB0aGUgYm94IGlzIGhlYXZpbHkgbG9hZGVkLCBzb21lIG9mIHRoZSB0ZXN0IHJ1bnMKQEAgLTIyMSw4ICsyMjEsNyBAQAogLyoqCiAgKiBNYWtlIHN1cmUgc2V0Rmx1c2hNYXhVcygpIGlzIGhvbm9yZWQuCiAgKi8KLXZvaWQgdGVzdF9mbHVzaF9tYXhfdXNfaW1wbCh1aW50MzJfdCBmbHVzaF91cywgdWludDMyX3Qgd3JpdGVfdXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdGVzdF91cykgewordm9pZCB0ZXN0X2ZsdXNoX21heF91c19pbXBsKHVpbnQzMl90IGZsdXNoX3VzLCB1aW50MzJfdCB3cml0ZV91cywgdWludDMyX3QgdGVzdF91cykgewogICAvLyBURmlsZVRyYW5zcG9ydCBvbmx5IGNhbGxzIGZzeW5jKCkgaWYgZGF0YSBoYXMgYmVlbiB3cml0dGVuLAogICAvLyBzbyBtYWtlIHN1cmUgdGhlIHdyaXRlIGludGVydmFsIGlzIHNtYWxsZXIgdGhhbiB0aGUgZmx1c2ggaW50ZXJ2YWwuCiAgIEJPT1NUX1dBUk4od3JpdGVfdXMgPCBmbHVzaF91cyk7CkBAIC0yNzcsMTYgKzI3NiwxMyBAQAogICBjb25zdCBGc3luY0xvZzo6Q2FsbExpc3QqIGNhbGxzID0gbG9nLmdldENhbGxzKCk7CiAgIC8vIFdlIGFkZGVkIDEgZnN5bmMgY2FsbCBhYm92ZS4KICAgLy8gTWFrZSBzdXJlIFRGaWxlVHJhbnNwb3J0IGNhbGxlZCBmc3luYyBhdCBsZWFzdCBvbmNlCi0gIEJPT1NUX1dBUk5fR0UoY2FsbHMtPnNpemUoKSwKLSAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RnN5bmNMb2c6OkNhbGxMaXN0OjpzaXplX3R5cGU+KDEpKTsKKyAgQk9PU1RfV0FSTl9HRShjYWxscy0+c2l6ZSgpLCBzdGF0aWNfY2FzdDxGc3luY0xvZzo6Q2FsbExpc3Q6OnNpemVfdHlwZT4oMSkpOwogCiAgIGNvbnN0IHN0cnVjdCB0aW1ldmFsKiBwcmV2X3RpbWUgPSBOVUxMOwotICBmb3IgKEZzeW5jTG9nOjpDYWxsTGlzdDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBjYWxscy0+YmVnaW4oKTsKLSAgICAgICBpdCAhPSBjYWxscy0+ZW5kKCk7Ci0gICAgICAgKytpdCkgeworICBmb3IgKEZzeW5jTG9nOjpDYWxsTGlzdDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBjYWxscy0+YmVnaW4oKTsgaXQgIT0gY2FsbHMtPmVuZCgpOyArK2l0KSB7CiAgICAgaWYgKHByZXZfdGltZSkgewogICAgICAgaW50IGRlbHRhID0gdGltZV9kaWZmKHByZXZfdGltZSwgJml0LT50aW1lKTsKLSAgICAgIEJPT1NUX1dBUk5fTFQoZGVsdGEsIG1heF9hbGxvd2VkX2RlbHRhKTsKKyAgICAgIEJPT1NUX1dBUk4oIGRlbHRhIDwgbWF4X2FsbG93ZWRfZGVsdGEgKTsKICAgICB9CiAgICAgcHJldl90aW1lID0gJml0LT50aW1lOwogICB9CkBAIC0zMjIsMTMgKzMxOCwxMyBAQAogICB0cmFuc3BvcnQud3JpdGUoYnVmLCAxKTsKIAogICBzdHJ1Y3QgdGltZXZhbCBzdGFydDsKLSAgZ2V0dGltZW9mZGF5KCZzdGFydCwgTlVMTCk7CisgIFRIUklGVF9HRVRUSU1FT0ZEQVkoJnN0YXJ0LCBOVUxMKTsKIAogICBmb3IgKHVuc2lnbmVkIGludCBuID0gMDsgbiA8IDEwOyArK24pIHsKICAgICB0cmFuc3BvcnQuZmx1c2goKTsKIAogICAgIHN0cnVjdCB0aW1ldmFsIG5vdzsKLSAgICBnZXR0aW1lb2ZkYXkoJm5vdywgTlVMTCk7CisgICAgVEhSSUZUX0dFVFRJTUVPRkRBWSgmbm93LCBOVUxMKTsKIAogICAgIC8vIEZhaWwgaWYgYXQgYW55IHBvaW50IHdlJ3ZlIGJlZW4gcnVubmluZyBmb3IgbG9uZ2VyIHRoYW4gaGFsZiBhIHNlY29uZC4KICAgICAvLyAoV2l0aCB0aGUgYnVnZ3kgY29kZSwgVEZpbGVUcmFuc3BvcnQgdXNlZCB0byB0YWtlIDMgc2Vjb25kcyBwZXIgZmx1c2goKSkKQEAgLTMzNiw3ICszMzIsNyBAQAogICAgIC8vIFVzZSBhIGZhdGFsIGZhaWwgc28gd2UgYnJlYWsgb3V0IGVhcmx5LCByYXRoZXIgdGhhbiBjb250aW51aW5nIHRvIG1ha2UKICAgICAvLyBtYW55IG1vcmUgc2xvdyBmbHVzaCgpIGNhbGxzLgogICAgIGludCBkZWx0YSA9IHRpbWVfZGlmZigmc3RhcnQsICZub3cpOwotICAgIEJPT1NUX1dBUk5fTFQoZGVsdGEsIDIwMDAwMDApOworICAgIEJPT1NUX1dBUk4oIGRlbHRhIDwgMjAwMDAwMCApOwogICB9CiB9CiAKQEAgLTM1MiwxMSArMzQ4LDggQEAKIH0KIAogdm9pZCBwYXJzZV9hcmdzKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKLSAgc3RydWN0IG9wdGlvbiBsb25nX29wdHNbXSA9IHsKLSAgICB7ICJoZWxwIiwgZmFsc2UsIE5VTEwsICdoJyB9LAotICAgIHsgInRtcC1kaXIiLCB0cnVlLCBOVUxMLCAndCcgfSwKLSAgICB7IE5VTEwsIDAsIE5VTEwsIDAgfQotICB9OworICBzdHJ1Y3Qgb3B0aW9uIGxvbmdfb3B0c1tdCisgICAgICA9IHt7ImhlbHAiLCBmYWxzZSwgTlVMTCwgJ2gnfSwgeyJ0bXAtZGlyIiwgdHJ1ZSwgTlVMTCwgJ3QnfSwge05VTEwsIDAsIE5VTEwsIDB9fTsKIAogICB3aGlsZSAodHJ1ZSkgewogICAgIG9wdG9wdCA9IDE7CkBAIC0zNjYsMjggKzM1OSw0NiBAQAogICAgIH0KIAogICAgIHN3aXRjaCAob3B0Y2hhcikgewotICAgICAgY2FzZSAndCc6Ci0gICAgICAgIHRtcF9kaXIgPSBvcHRhcmc7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAnaCc6Ci0gICAgICAgIHByaW50X3VzYWdlKHN0ZG91dCwgYXJndlswXSk7Ci0gICAgICAgIGV4aXQoMCk7Ci0gICAgICBjYXNlICc/JzoKLSAgICAgICAgZXhpdCgxKTsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIC8vIE9ubHkgaGFwcGVucyBpZiBzb21lb25lIGFkZHMgYW5vdGhlciBvcHRpb24gdG8gdGhlIG9wdGFyZyBzdHJpbmcsCi0gICAgICAgIC8vIGJ1dCBkb2Vzbid0IHVwZGF0ZSB0aGUgc3dpdGNoIHN0YXRlbWVudCB0byBoYW5kbGUgaXQuCi0gICAgICAgIGZwcmludGYoc3RkZXJyLCAidW5rbm93biBvcHRpb24gXCItJWNcIlxuIiwgb3B0Y2hhcik7Ci0gICAgICAgIGV4aXQoMSk7CisgICAgY2FzZSAndCc6CisgICAgICB0bXBfZGlyID0gb3B0YXJnOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnaCc6CisgICAgICBwcmludF91c2FnZShzdGRvdXQsIGFyZ3ZbMF0pOworICAgICAgZXhpdCgwKTsKKyAgICBjYXNlICc/JzoKKyAgICAgIGV4aXQoMSk7CisgICAgZGVmYXVsdDoKKyAgICAgIC8vIE9ubHkgaGFwcGVucyBpZiBzb21lb25lIGFkZHMgYW5vdGhlciBvcHRpb24gdG8gdGhlIG9wdGFyZyBzdHJpbmcsCisgICAgICAvLyBidXQgZG9lc24ndCB1cGRhdGUgdGhlIHN3aXRjaCBzdGF0ZW1lbnQgdG8gaGFuZGxlIGl0LgorICAgICAgZnByaW50ZihzdGRlcnIsICJ1bmtub3duIG9wdGlvbiBcIi0lY1wiXG4iLCBvcHRjaGFyKTsKKyAgICAgIGV4aXQoMSk7CiAgICAgfQogICB9CiB9CiAKKyNpZmRlZiBCT09TVF9URVNUX0RZTl9MSU5LCitzdGF0aWMgaW50IG15QXJnYyA9IDA7CitzdGF0aWMgY2hhciAqKm15QXJndiA9IE5VTEw7CisKK2Jvb2wgaW5pdF91bml0X3Rlc3Rfc3VpdGUoKSB7CisgIGJvb3N0Ojp1bml0X3Rlc3Q6OmZyYW1ld29yazo6bWFzdGVyX3Rlc3Rfc3VpdGUoKS5wX25hbWUudmFsdWUgPSAiVEZpbGVUcmFuc3BvcnRUZXN0IjsKKworICAvLyBQYXJzZSBhcmd1bWVudHMKKyAgcGFyc2VfYXJncyhteUFyZ2MsbXlBcmd2KTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2ludCBtYWluKCBpbnQgYXJnYywgY2hhciogYXJndltdICkgeworICBteUFyZ2MgPSBhcmdjOworICBteUFyZ3YgPSBhcmd2OworICByZXR1cm4gOjpib29zdDo6dW5pdF90ZXN0Ojp1bml0X3Rlc3RfbWFpbigmaW5pdF91bml0X3Rlc3Rfc3VpdGUsYXJnYyxhcmd2KTsKK30KKyNlbHNlCiBib29zdDo6dW5pdF90ZXN0Ojp0ZXN0X3N1aXRlKiBpbml0X3VuaXRfdGVzdF9zdWl0ZShpbnQgYXJnYywgY2hhciogYXJndltdKSB7Ci0gIGJvb3N0Ojp1bml0X3Rlc3Q6OmZyYW1ld29yazo6bWFzdGVyX3Rlc3Rfc3VpdGUoKS5wX25hbWUudmFsdWUgPQotICAgICJURmlsZVRyYW5zcG9ydFRlc3QiOworICBib29zdDo6dW5pdF90ZXN0OjpmcmFtZXdvcms6Om1hc3Rlcl90ZXN0X3N1aXRlKCkucF9uYW1lLnZhbHVlID0gIlRGaWxlVHJhbnNwb3J0VGVzdCI7CiAKICAgLy8gUGFyc2UgYXJndW1lbnRzCiAgIHBhcnNlX2FyZ3MoYXJnYywgYXJndik7CiAgIHJldHVybiBOVUxMOwogfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvVE1lbW9yeUJ1ZmZlclRlc3QuY3BwIGIvbGliL2NwcC90ZXN0L1RNZW1vcnlCdWZmZXJUZXN0LmNwcAppbmRleCBiODFhNjY3Li45MjA2ODcyIDEwMDY0NAotLS0gYS9saWIvY3BwL3Rlc3QvVE1lbW9yeUJ1ZmZlclRlc3QuY3BwCisrKyBiL2xpYi9jcHAvdGVzdC9UTWVtb3J5QnVmZmVyVGVzdC5jcHAKQEAgLTIwLDg5ICsyMCwxNDEgQEAKICNpbmNsdWRlIDxib29zdC90ZXN0L2F1dG9fdW5pdF90ZXN0LmhwcD4KICNpbmNsdWRlIDxpb3N0cmVhbT4KICNpbmNsdWRlIDxjbGltaXRzPgotI2luY2x1ZGUgPGNhc3NlcnQ+Ci0jaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgorI2luY2x1ZGUgPHZlY3Rvcj4KICNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KICNpbmNsdWRlICJnZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMuaCIKIAotQk9PU1RfQVVUT19URVNUX1NVSVRFKCBUTWVtb3J5QnVmZmVyVGVzdCApCitCT09TVF9BVVRPX1RFU1RfU1VJVEUoVE1lbW9yeUJ1ZmZlclRlc3QpCiAKLUJPT1NUX0FVVE9fVEVTVF9DQVNFKCB0ZXN0X3JvdW5kdHJpcCApIHsKLSAgICB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyOwotICAgIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VEJpbmFyeVByb3RvY29sOwotICAgIHVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUQmluYXJ5UHJvdG9jb2w7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKK3VzaW5nIHN0ZDo6Y291dDsKK3VzaW5nIHN0ZDo6ZW5kbDsKK3VzaW5nIHN0ZDo6c3RyaW5nOwogCi0gICAgc2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBzdHJCdWZmZXIobmV3IFRNZW1vcnlCdWZmZXIoKSk7Ci0gICAgc2hhcmVkX3B0cjxUQmluYXJ5UHJvdG9jb2w+IGJpbmFyeVByb3Rjb2wobmV3IFRCaW5hcnlQcm90b2NvbChzdHJCdWZmZXIpKTsKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfcmVhZF93cml0ZV9ncm93KSB7CisgIC8vIEFkZGVkIHRvIHRlc3QgdGhlIGZpeCBmb3IgVEhSSUZULTEyNDgKKyAgVE1lbW9yeUJ1ZmZlciB1dXQ7CisgIGNvbnN0IGludCBtYXhTaXplID0gNjU1MzY7CisgIHVpbnQ4X3QgdmVyaWZ5W21heFNpemVdOworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBidWY7CisgIGJ1Zi5yZXNpemUobWF4U2l6ZSk7CiAKLSAgICB0aHJpZnQ6OnRlc3Q6Olh0cnVjdCBhOwotICAgIGEuaTMyX3RoaW5nID0gMTA7Ci0gICAgYS5pNjRfdGhpbmcgPSAzMDsKLSAgICBhLnN0cmluZ190aGluZyA9ImhvbGxhIGJhY2sgYSI7Ci0KLSAgICBhLndyaXRlKGJpbmFyeVByb3Rjb2wuZ2V0KCkpOwotICAgIHN0ZDo6c3RyaW5nIHNlcmlhbGl6ZWQgPSBzdHJCdWZmZXItPmdldEJ1ZmZlckFzU3RyaW5nKCk7Ci0KLSAgICBzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IHN0ckJ1ZmZlcjIobmV3IFRNZW1vcnlCdWZmZXIoKSk7Ci0gICAgc2hhcmVkX3B0cjxUQmluYXJ5UHJvdG9jb2w+IGJpbmFyeVByb3Rjb2wyKG5ldyBUQmluYXJ5UHJvdG9jb2woc3RyQnVmZmVyMikpOwotCi0gICAgc3RyQnVmZmVyMi0+cmVzZXRCdWZmZXIoKHVpbnQ4X3QqKXNlcmlhbGl6ZWQuZGF0YSgpLCBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc2VyaWFsaXplZC5sZW5ndGgoKSkpOwotICAgIHRocmlmdDo6dGVzdDo6WHRydWN0IGEyOwotICAgIGEyLnJlYWQoYmluYXJ5UHJvdGNvbDIuZ2V0KCkpOwotCi0gICAgYXNzZXJ0KGEgPT0gYTIpOworICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbWF4U2l6ZTsgKytpKSB7CisgICAgYnVmW2ldID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oaSk7CiAgIH0KIAotQk9PU1RfQVVUT19URVNUX0NBU0UoIHRlc3RfY29weSApCisgIGZvciAodWludDMyX3QgaSA9IDE7IGkgPCBtYXhTaXplOyBpICo9IDIpIHsKKyAgICB1dXQud3JpdGUoJmJ1ZlswXSwgaSk7CisgIH0KKworICBmb3IgKHVpbnQzMl90IGkgPSAxOyBpIDwgbWF4U2l6ZTsgaSAqPSAyKSB7CisgICAgdXV0LnJlYWQodmVyaWZ5LCBpKTsKKyAgICBCT09TVF9DSEVDS19FUVVBTCgwLCA6Om1lbWNtcCh2ZXJpZnksICZidWZbMF0sIGkpKTsKKyAgfQorfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X3JvdW5kdHJpcCkgeworICBzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IHN0ckJ1ZmZlcihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKKyAgc2hhcmVkX3B0cjxUQmluYXJ5UHJvdG9jb2w+IGJpbmFyeVByb3Rjb2wobmV3IFRCaW5hcnlQcm90b2NvbChzdHJCdWZmZXIpKTsKKworICB0aHJpZnQ6OnRlc3Q6Olh0cnVjdCBhOworICBhLmkzMl90aGluZyA9IDEwOworICBhLmk2NF90aGluZyA9IDMwOworICBhLnN0cmluZ190aGluZyA9ICJob2xsYSBiYWNrIGEiOworCisgIGEud3JpdGUoYmluYXJ5UHJvdGNvbC5nZXQoKSk7CisgIHN0ZDo6c3RyaW5nIHNlcmlhbGl6ZWQgPSBzdHJCdWZmZXItPmdldEJ1ZmZlckFzU3RyaW5nKCk7CisKKyAgc2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBzdHJCdWZmZXIyKG5ldyBUTWVtb3J5QnVmZmVyKCkpOworICBzaGFyZWRfcHRyPFRCaW5hcnlQcm90b2NvbD4gYmluYXJ5UHJvdGNvbDIobmV3IFRCaW5hcnlQcm90b2NvbChzdHJCdWZmZXIyKSk7CisKKyAgc3RyQnVmZmVyMi0+cmVzZXRCdWZmZXIoKHVpbnQ4X3QqKXNlcmlhbGl6ZWQuZGF0YSgpLCBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc2VyaWFsaXplZC5sZW5ndGgoKSkpOworICB0aHJpZnQ6OnRlc3Q6Olh0cnVjdCBhMjsKKyAgYTIucmVhZChiaW5hcnlQcm90Y29sMi5nZXQoKSk7CisKKyAgQk9PU1RfQ0hFQ0soYSA9PSBhMik7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfcmVhZEFwcGVuZFRvU3RyaW5nKSB7CisgIHN0cmluZyogc3RyMSA9IG5ldyBzdHJpbmcoImFiY2QxMjM0Iik7CisgIFRNZW1vcnlCdWZmZXIgYnVmKCh1aW50OF90KilzdHIxLT5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihzdHIxLT5sZW5ndGgoKSksCisgICAgICAgICAgICAgICAgICAgIFRNZW1vcnlCdWZmZXI6OkNPUFkpOworCisgIHN0cmluZyBzdHIzID0gInd4eXoiLCBzdHI0ID0gIjY3ODkiOworICBidWYucmVhZEFwcGVuZFRvU3RyaW5nKHN0cjMsIDQpOworICBidWYucmVhZEFwcGVuZFRvU3RyaW5nKHN0cjQsIElOVF9NQVgpOworCisgIEJPT1NUX0NIRUNLKHN0cjMgPT0gInd4eXphYmNkIik7CisgIEJPT1NUX0NIRUNLKHN0cjQgPT0gIjY3ODkxMjM0Iik7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfZXhjZXB0aW9ucykgeworICBjaGFyIGRhdGFbXSA9ICJmb29cMGJhciI7CisKKyAgVE1lbW9yeUJ1ZmZlciBidWYxKCh1aW50OF90KilkYXRhLCA3LCBUTWVtb3J5QnVmZmVyOjpPQlNFUlZFKTsKKyAgc3RyaW5nIHN0ciA9IGJ1ZjEuZ2V0QnVmZmVyQXNTdHJpbmcoKTsKKyAgQk9PU1RfQ0hFQ0soc3RyLmxlbmd0aCgpID09IDcpOworCisgIGJ1ZjEucmVzZXRCdWZmZXIoKTsKKworICBCT09TVF9DSEVDS19USFJPVyhidWYxLndyaXRlKChjb25zdCB1aW50OF90KikiZm9vIiwgMyksIFRUcmFuc3BvcnRFeGNlcHRpb24pOworCisgIFRNZW1vcnlCdWZmZXIgYnVmMigodWludDhfdCopZGF0YSwgNywgVE1lbW9yeUJ1ZmZlcjo6Q09QWSk7CisgIEJPT1NUX0NIRUNLX05PX1RIUk9XKGJ1ZjIud3JpdGUoKGNvbnN0IHVpbnQ4X3QqKSJiYXIiLCAzKSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfZGVmYXVsdF9tYXhpbXVtX2J1ZmZlcl9zaXplKQoreworICBCT09TVF9DSEVDS19FUVVBTCgoc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCkoKSwgVE1lbW9yeUJ1ZmZlcigpLmdldE1heEJ1ZmZlclNpemUoKSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfZGVmYXVsdF9idWZmZXJfc2l6ZSkKK3sKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoMTAyNCwgVE1lbW9yeUJ1ZmZlcigpLmdldEJ1ZmZlclNpemUoKSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfZXJyb3Jfc2V0X21heF9idWZmZXJfc2l6ZV90b29fc21hbGwpCit7CisgIFRNZW1vcnlCdWZmZXIgYnVmOworICBCT09TVF9DSEVDS19USFJPVyhidWYuc2V0TWF4QnVmZmVyU2l6ZShidWYuZ2V0QnVmZmVyU2l6ZSgpIC0gMSksIFRUcmFuc3BvcnRFeGNlcHRpb24pOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X21heGltdW1fYnVmZmVyX3NpemUpCit7CisgIFRNZW1vcnlCdWZmZXIgYnVmOworICBidWYuc2V0TWF4QnVmZmVyU2l6ZSg4MTkyKTsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gc21hbGxfYnVmZigxKTsKKworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IDgxOTI7ICsraSkKICAgewotICAgIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXI7Ci0gICAgdXNpbmcgc3RkOjpzdHJpbmc7Ci0gICAgdXNpbmcgc3RkOjpjb3V0OwotICAgIHVzaW5nIHN0ZDo6ZW5kbDsKLQotICAgIHN0cmluZyogc3RyMSA9IG5ldyBzdHJpbmcoImFiY2QxMjM0Iik7Ci0gICAgY29uc3QgY2hhciogZGF0YTEgPSBzdHIxLT5kYXRhKCk7Ci0gICAgVE1lbW9yeUJ1ZmZlciBidWYoKHVpbnQ4X3QqKXN0cjEtPmRhdGEoKSwgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHN0cjEtPmxlbmd0aCgpKSwgVE1lbW9yeUJ1ZmZlcjo6Q09QWSk7Ci0gICAgZGVsZXRlIHN0cjE7Ci0gICAgc3RyaW5nKiBzdHIyID0gbmV3IHN0cmluZygicGxzcmV1c2UiKTsKLSAgICBib29sIG9ial9yZXVzZSA9IChzdHIxID09IHN0cjIpOwotICAgIGJvb2wgZGF0X3JldXNlID0gKGRhdGExID09IHN0cjItPmRhdGEoKSk7Ci0gICAgY291dCA8PCAiT2JqZWN0IHJldXNlOiAiIDw8IG9ial9yZXVzZSA8PCAiICAgRGF0YSByZXVzZTogIiA8PCBkYXRfcmV1c2UKLSAgICAgIDw8ICgob2JqX3JldXNlICYmIGRhdF9yZXVzZSkgPyAiICAgWUFZISIgOiAiIikgPDwgZW5kbDsKLSAgICBkZWxldGUgc3RyMjsKLQotICAgIHN0cmluZyBzdHIzID0gInd4eXoiLCBzdHI0ID0gIjY3ODkiOwotICAgIGJ1Zi5yZWFkQXBwZW5kVG9TdHJpbmcoc3RyMywgNCk7Ci0gICAgYnVmLnJlYWRBcHBlbmRUb1N0cmluZyhzdHI0LCBJTlRfTUFYKTsKLQotICAgIGFzc2VydChzdHIzID09ICJ3eHl6YWJjZCIpOwotICAgIGFzc2VydChzdHI0ID09ICI2Nzg5MTIzNCIpOworICAgIGJ1Zi53cml0ZSgmc21hbGxfYnVmZlswXSwgMSk7CiAgIH0KIAotQk9PU1RfQVVUT19URVNUX0NBU0UoIHRlc3RfZXhjZXB0aW9ucyApCi0gIHsKLSAgICB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOwotICAgIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXI7Ci0gICAgdXNpbmcgc3RkOjpzdHJpbmc7CisgIEJPT1NUX0NIRUNLX1RIUk9XKGJ1Zi53cml0ZSgmc21hbGxfYnVmZlswXSwgMSksIFRUcmFuc3BvcnRFeGNlcHRpb24pOworfQogCi0gICAgY2hhciBkYXRhW10gPSAiZm9vXDBiYXIiOworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9tZW1vcnlfYnVmZmVyX3RvX2dldF9zaXplb2Zfb2JqZWN0cykKK3sKKyAgLy8gVGhpcyBpcyBhIGRlbW9uc3RyYXRpb24gb2YgaG93IHRvIHVzZSBUTWVtb3J5QnVmZmVyIHRvIGRldGVybWluZQorICAvLyB0aGUgc2VyaWFsaXplZCBzaXplIG9mIGEgdGhyaWZ0IG9iamVjdCBpbiB0aGUgQmluYXJ5IHByb3RvY29sLgorICAvLyBTZWUgVEhSSUZULTM0ODAKIAotICAgIFRNZW1vcnlCdWZmZXIgYnVmMSgodWludDhfdCopZGF0YSwgNywgVE1lbW9yeUJ1ZmZlcjo6T0JTRVJWRSk7Ci0gICAgc3RyaW5nIHN0ciA9IGJ1ZjEuZ2V0QnVmZmVyQXNTdHJpbmcoKTsKLSAgICBhc3NlcnQoc3RyLmxlbmd0aCgpID09IDcpOwotICAgIGJ1ZjEucmVzZXRCdWZmZXIoKTsKLSAgICB0cnkgewotICAgICAgYnVmMS53cml0ZSgoY29uc3QgdWludDhfdCopImZvbyIsIDMpOwotICAgICAgYXNzZXJ0KGZhbHNlKTsKLSAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJikge30KKyAgc2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBtZW1CdWZmZXIobmV3IFRNZW1vcnlCdWZmZXIoKSk7CisgIHNoYXJlZF9wdHI8VEJpbmFyeVByb3RvY29sPiBiaW5hcnlQcm90Y29sKG5ldyBUQmluYXJ5UHJvdG9jb2wobWVtQnVmZmVyKSk7CiAKLSAgICBUTWVtb3J5QnVmZmVyIGJ1ZjIoKHVpbnQ4X3QqKWRhdGEsIDcsIFRNZW1vcnlCdWZmZXI6OkNPUFkpOwotICAgIHRyeSB7Ci0gICAgICBidWYyLndyaXRlKChjb25zdCB1aW50OF90KikiYmFyIiwgMyk7Ci0gICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYpIHsKLSAgICAgIGFzc2VydChmYWxzZSk7Ci0gICAgfQotICB9CisgIHRocmlmdDo6dGVzdDo6WHRydWN0IG9iamVjdDsKKyAgb2JqZWN0LmkzMl90aGluZyA9IDEwOworICBvYmplY3QuaTY0X3RoaW5nID0gMzA7CisgIG9iamVjdC5zdHJpbmdfdGhpbmcgPSAid2hvJ3MgeW91ciBkYWRkeT8iOworCisgIHVpbnQzMl90IHNpemUgPSBvYmplY3Qud3JpdGUoYmluYXJ5UHJvdGNvbC5nZXQoKSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKDQ3LCBzaXplKTsKK30KIAogQk9PU1RfQVVUT19URVNUX1NVSVRFX0VORCgpCi0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9UTm9uYmxvY2tpbmdTU0xTZXJ2ZXJUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9UTm9uYmxvY2tpbmdTU0xTZXJ2ZXJUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzAzODBiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L1ROb25ibG9ja2luZ1NTTFNlcnZlclRlc3QuY3BwCkBAIC0wLDAgKzEsMjkxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgQk9PU1RfVEVTVF9NT0RVTEUgVE5vbmJsb2NraW5nU1NMU2VydmVyVGVzdAorI2luY2x1ZGUgPGJvb3N0L3Rlc3QvdW5pdF90ZXN0LmhwcD4KKyNpbmNsdWRlIDxib29zdC9maWxlc3lzdGVtLmhwcD4KKyNpbmNsdWRlIDxib29zdC9mb3JtYXQuaHBwPgorCisjaW5jbHVkZSAidGhyaWZ0L3NlcnZlci9UTm9uYmxvY2tpbmdTZXJ2ZXIuaCIKKyNpbmNsdWRlICJ0aHJpZnQvdHJhbnNwb3J0L1RTU0xTb2NrZXQuaCIKKyNpbmNsdWRlICJ0aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NTTFNlcnZlclNvY2tldC5oIgorCisjaW5jbHVkZSAiZ2VuLWNwcC9QYXJlbnRTZXJ2aWNlLmgiCisKKyNpbmNsdWRlIDxldmVudC5oPgorCit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6Okd1YXJkOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpNb25pdG9yOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpNdXRleDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXI6OlRTZXJ2ZXJFdmVudEhhbmRsZXI7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU1NMU29ja2V0RmFjdG9yeTsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTU0xTb2NrZXQ7CisKK3N0cnVjdCBIYW5kbGVyIDogcHVibGljIHRlc3Q6OlBhcmVudFNlcnZpY2VJZiB7CisgIHZvaWQgYWRkU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzKSB7IHN0cmluZ3NfLnB1c2hfYmFjayhzKTsgfQorICB2b2lkIGdldFN0cmluZ3Moc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+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+aW50ZXJydXB0KCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHN0cmVzc19waXBlX2FjY2VwdF9pbnRlcnJ1cHRpb24pIHsKKyAgaW50IGludGVycnVwdEl0ZXJzID0gMTA7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnRlcnJ1cHRJdGVyczsgKytpKQorICB7CisgICAgVFBpcGVTZXJ2ZXIgcGlwZVNlcnZlcigiVFBpcGVJbnRlcnJ1cHRUZXN0Iik7CisgICAgcGlwZVNlcnZlci5saXN0ZW4oKTsKKyAgICBib29zdDo6dGhyZWFkIGFjY2VwdFRocmVhZChzdGQ6OmJpbmQoYWNjZXB0V29ya2VyLCAmcGlwZVNlcnZlcikpOworICAgIGJvb3N0Ojp0aHJlYWQgaW50ZXJydXB0VGhyZWFkKHN0ZDo6YmluZChpbnRlcnJ1cHRXb3JrZXIsICZwaXBlU2VydmVyKSk7CisgICAgdHJ5CisgICAgeworICAgICAgZm9yICg7OykKKyAgICAgIHsKKyAgICAgICAgVFBpcGUgY2xpZW50KCJUUGlwZUludGVycnVwdFRlc3QiKTsKKyAgICAgICAgY2xpZW50LnNldENvbm5UaW1lb3V0KDEpOworICAgICAgICBjbGllbnQub3BlbigpOworICAgICAgfQorICAgIH0gY2F0Y2ggKC4uLikgeyAvKmp1c3QgdGVzdGluZyBmb3IgY3Jhc2hlcyovIH0KKyAgICBpbnRlcnJ1cHRUaHJlYWQuam9pbigpOworICAgIGFjY2VwdFRocmVhZC5qb2luKCk7CisgIH0KK30KKworQk9PU1RfQVVUT19URVNUX1NVSVRFX0VORCgpCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9UUGlwZWRUcmFuc3BvcnRUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9UUGlwZWRUcmFuc3BvcnRUZXN0LmNwcAppbmRleCA3NzYyZjA1Li5mMzA5MWE0IDEwMDY0NAotLS0gYS9saWIvY3BwL3Rlc3QvVFBpcGVkVHJhbnNwb3J0VGVzdC5jcHAKKysrIGIvbGliL2NwcC90ZXN0L1RQaXBlZFRyYW5zcG9ydFRlc3QuY3BwCkBAIC0xNywzNyArMTcsMzcgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlIDxjc3RkbGliPgotI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KICNpbmNsdWRlIDx0aHJpZnQvVGhyaWZ0Lmg+CisjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworI2RlZmluZSBCT09TVF9URVNUX01PRFVMRSBUUGlwZWRUcmFuc3BvcnRUZXN0CisjaW5jbHVkZSA8Ym9vc3QvdGVzdC91bml0X3Rlc3QuaHBwPgorCiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFBpcGVkVHJhbnNwb3J0OwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlcjsKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDsKIAotaW50IG1haW4oKSB7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IHVuZGVybHlpbmcobmV3IFRNZW1vcnlCdWZmZXIpOwotICBib29zdDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBwaXBlKG5ldyBUTWVtb3J5QnVmZmVyKTsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFBpcGVkVHJhbnNwb3J0PiB0cmFucyhuZXcgVFBpcGVkVHJhbnNwb3J0KHVuZGVybHlpbmcsIHBpcGUpKTsKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfcmVhZF93cml0ZSkgeworICBzdGQ6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gdW5kZXJseWluZyhuZXcgVE1lbW9yeUJ1ZmZlcik7CisgIHN0ZDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBwaXBlKG5ldyBUTWVtb3J5QnVmZmVyKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRQaXBlZFRyYW5zcG9ydD4gdHJhbnMobmV3IFRQaXBlZFRyYW5zcG9ydCh1bmRlcmx5aW5nLCBwaXBlKSk7CiAKICAgdWludDhfdCBidWZmZXJbNF07CiAKICAgdW5kZXJseWluZy0+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+IGFjY2VwdGVkID0gc29jazEuYWNjZXB0KCk7CisgIGJvb3N0Ojp0aHJlYWQgcmVhZFRocmVhZChzdGQ6OmJpbmQocmVhZGVyV29ya2VyLCBhY2NlcHRlZCwgMCkpOworICBib29zdDo6dGhpc190aHJlYWQ6OnNsZWVwKGJvb3N0Ojpwb3NpeF90aW1lOjptaWxsaXNlY29uZHMoNTApKTsKKyAgLy8gcmVhZFRocmVhZCBpcyBwcmFjdGljYWxseSBndWFyYW50ZWVkIHRvIGJlIGJsb2NraW5nIGhlcmUKKyAgc29jazEuaW50ZXJydXB0Q2hpbGRyZW4oKTsKKyAgQk9PU1RfQ0hFQ0tfTUVTU0FHRSghcmVhZFRocmVhZC50cnlfam9pbl9mb3IoYm9vc3Q6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDIwMCkpLAorICAgICAgICAgICAgICAgICAgICAgICJzZXJ2ZXIgc29ja2V0IGludGVycnVwdENoaWxkcmVuIGludGVycnVwdGVkIGNoaWxkIHJlYWQiKTsKKworICAvLyBvbmx5IHdheSB0byBwcm9jZWVkIGlzIHRvIGhhdmUgdGhlIGNsaWVudCBkaXNjb25uZWN0CisgIGNsaWVudFNvY2suY2xvc2UoKTsKKyAgcmVhZFRocmVhZC5qb2luKCk7CisgIGFjY2VwdGVkLT5jbG9zZSgpOworICBzb2NrMS5jbG9zZSgpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2Nhbm5vdF9jaGFuZ2VfYWZ0ZXJfbGlzdGVuKSB7CisgIFRTZXJ2ZXJTb2NrZXQgc29jazEoImxvY2FsaG9zdCIsIDApOworICBzb2NrMS5saXN0ZW4oKTsKKyAgQk9PU1RfQ0hFQ0tfVEhST1coc29jazEuc2V0SW50ZXJydXB0YWJsZUNoaWxkcmVuKGZhbHNlKSwgc3RkOjpsb2dpY19lcnJvcik7CisgIHNvY2sxLmNsb3NlKCk7Cit9CisKK3ZvaWQgcGVla2VyV29ya2VyKHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0dCwgYm9vbCBleHBlY3RlZFJlc3VsdCkgeworICBCT09TVF9DSEVDS19FUVVBTChleHBlY3RlZFJlc3VsdCwgdHQtPnBlZWsoKSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfaW50ZXJydXB0YWJsZV9jaGlsZF9wZWVrKSB7CisgIFRTZXJ2ZXJTb2NrZXQgc29jazEoImxvY2FsaG9zdCIsIDApOworICBzb2NrMS5saXN0ZW4oKTsKKyAgaW50IHBvcnQgPSBzb2NrMS5nZXRQb3J0KCk7CisgIFRTb2NrZXQgY2xpZW50U29jaygibG9jYWxob3N0IiwgcG9ydCk7CisgIGNsaWVudFNvY2sub3BlbigpOworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gYWNjZXB0ZWQgPSBzb2NrMS5hY2NlcHQoKTsKKyAgLy8gcGVlaygpIHdpbGwgcmV0dXJuIGZhbHNlIGlmIGNoaWxkIGlzIGludGVycnVwdGVkCisgIGJvb3N0Ojp0aHJlYWQgcGVla1RocmVhZChzdGQ6OmJpbmQocGVla2VyV29ya2VyLCBhY2NlcHRlZCwgZmFsc2UpKTsKKyAgYm9vc3Q6OnRoaXNfdGhyZWFkOjpzbGVlcChib29zdDo6cG9zaXhfdGltZTo6bWlsbGlzZWNvbmRzKDUwKSk7CisgIC8vIHBlZWtUaHJlYWQgaXMgcHJhY3RpY2FsbHkgZ3VhcmFudGVlZCB0byBiZSBibG9ja2luZyBub3cKKyAgc29jazEuaW50ZXJydXB0Q2hpbGRyZW4oKTsKKyAgQk9PU1RfQ0hFQ0tfTUVTU0FHRShwZWVrVGhyZWFkLnRyeV9qb2luX2Zvcihib29zdDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMjAwKSksCisgICAgICAgICAgICAgICAgICAgICAgInNlcnZlciBzb2NrZXQgaW50ZXJydXB0Q2hpbGRyZW4gZGlkIG5vdCBpbnRlcnJ1cHQgY2hpbGQgcGVlayIpOworICBjbGllbnRTb2NrLmNsb3NlKCk7CisgIGFjY2VwdGVkLT5jbG9zZSgpOworICBzb2NrMS5jbG9zZSgpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X25vbl9pbnRlcnJ1cHRhYmxlX2NoaWxkX3BlZWspIHsKKyAgVFNlcnZlclNvY2tldCBzb2NrMSgibG9jYWxob3N0IiwgMCk7CisgIHNvY2sxLnNldEludGVycnVwdGFibGVDaGlsZHJlbihmYWxzZSk7IC8vIHJldHVybnMgdG8gcHJlLVRIUklGVC0yNDQxIGJlaGF2aW9yCisgIHNvY2sxLmxpc3RlbigpOworICBpbnQgcG9ydCA9IHNvY2sxLmdldFBvcnQoKTsKKyAgVFNvY2tldCBjbGllbnRTb2NrKCJsb2NhbGhvc3QiLCBwb3J0KTsKKyAgY2xpZW50U29jay5vcGVuKCk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBhY2NlcHRlZCA9IHNvY2sxLmFjY2VwdCgpOworICAvLyBwZWVrKCkgd2lsbCByZXR1cm4gZmFsc2Ugd2hlbiByZW1vdGUgc2lkZSBpcyBjbG9zZWQKKyAgYm9vc3Q6OnRocmVhZCBwZWVrVGhyZWFkKHN0ZDo6YmluZChwZWVrZXJXb3JrZXIsIGFjY2VwdGVkLCBmYWxzZSkpOworICBib29zdDo6dGhpc190aHJlYWQ6OnNsZWVwKGJvb3N0Ojpwb3NpeF90aW1lOjptaWxsaXNlY29uZHMoNTApKTsKKyAgLy8gcGVla1RocmVhZCBpcyBwcmFjdGljYWxseSBndWFyYW50ZWVkIHRvIGJlIGJsb2NraW5nIG5vdworICBzb2NrMS5pbnRlcnJ1cHRDaGlsZHJlbigpOworICBCT09TVF9DSEVDS19NRVNTQUdFKCFwZWVrVGhyZWFkLnRyeV9qb2luX2Zvcihib29zdDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMjAwKSksCisgICAgICAgICAgICAgICAgICAgICAgInNlcnZlciBzb2NrZXQgaW50ZXJydXB0Q2hpbGRyZW4gaW50ZXJydXB0ZWQgY2hpbGQgcGVlayIpOworCisgIC8vIG9ubHkgd2F5IHRvIHByb2NlZWQgaXMgdG8gaGF2ZSB0aGUgY2xpZW50IGRpc2Nvbm5lY3QKKyAgY2xpZW50U29jay5jbG9zZSgpOworICBwZWVrVGhyZWFkLmpvaW4oKTsKKyAgYWNjZXB0ZWQtPmNsb3NlKCk7CisgIHNvY2sxLmNsb3NlKCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURV9FTkQoKQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L1RUcmFuc3BvcnRDaGVja1Rocm93LmggYi9saWIvY3BwL3Rlc3QvVFRyYW5zcG9ydENoZWNrVGhyb3cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjI3N2I0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L1RUcmFuc3BvcnRDaGVja1Rocm93LmgKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2RlZmluZSBUVFJBTlNQT1JUX0NIRUNLX1RIUk9XKF9DQUxMLCBfVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGJvb2wgY2F1Z2h0ID0gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRyeSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKF9DQUxMKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gJiBleCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoZXguZ2V0VHlwZSgpLCBfVFlQRSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY2F1Z2h0ID0gdHJ1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEJPT1NUX0NIRUNLX01FU1NBR0UoY2F1Z2h0LCAiZXhwZWN0ZWQgVFRyYW5zcG9ydEV4Y2VwdGlvbiBidXQgbm90aGluZyB3YXMgdGhyb3duIik7ICAgICAgICAgICAgXAorICB9CisKKyNkZWZpbmUgVFRSQU5TUE9SVF9SRVFVSVJFX1RIUk9XKF9DQUxMLCBfVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBib29sIGNhdWdodCA9IGZhbHNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0cnkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIChfQ0FMTCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uICYgZXgpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIEJPT1NUX1JFUVVJUkVfRVFVQUwoZXguZ2V0VHlwZSgpLCBfVFlQRSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNhdWdodCA9IHRydWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBCT09TVF9SRVFVSVJFX01FU1NBR0UoY2F1Z2h0LCAiZXhwZWN0ZWQgVFRyYW5zcG9ydEV4Y2VwdGlvbiBidXQgbm90aGluZyB3YXMgdGhyb3duIik7ICAgICAgICAgIFwKKyAgfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L1RocmlmdFRlc3RfZXh0cmFzLmNwcCBiL2xpYi9jcHAvdGVzdC9UaHJpZnRUZXN0X2V4dHJhcy5jcHAKaW5kZXggMzNmNjgxZi4uYWY1NjA2ZSAxMDA2NDQKLS0tIGEvbGliL2NwcC90ZXN0L1RocmlmdFRlc3RfZXh0cmFzLmNwcAorKysgYi9saWIvY3BwL3Rlc3QvVGhyaWZ0VGVzdF9leHRyYXMuY3BwCkBAIC0yMiwxMiArMjIsMTIgQEAKICNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVERlYnVnUHJvdG9jb2wuaD4KICNpbmNsdWRlICJnZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMuaCIKIAotCi1uYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHRlc3QgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdGVzdCB7CiAKIGJvb2wgSW5zYW5pdHk6Om9wZXJhdG9yPCh0aHJpZnQ6OnRlc3Q6Okluc2FuaXR5IGNvbnN0JiBvdGhlcikgY29uc3QgewogICB1c2luZyBhcGFjaGU6OnRocmlmdDo6VGhyaWZ0RGVidWdTdHJpbmc7CiAgIHJldHVybiBUaHJpZnREZWJ1Z1N0cmluZygqdGhpcykgPCBUaHJpZnREZWJ1Z1N0cmluZyhvdGhlcik7CiB9Ci0KLX19Cit9Cit9CmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvVG9TdHJpbmdUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9Ub1N0cmluZ1Rlc3QuY3BwCmluZGV4IDFhODljMTEuLmQyMDRjYjMgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvdGVzdC9Ub1N0cmluZ1Rlc3QuY3BwCisrKyBiL2xpYi9jcHAvdGVzdC9Ub1N0cmluZ1Rlc3QuY3BwCkBAIC0zMCw5ICszMCw5IEBACiAKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0b19zdHJpbmc7CiAKLUJPT1NUX0FVVE9fVEVTVF9TVUlURSggVG9TdHJpbmdUZXN0ICkKK0JPT1NUX0FVVE9fVEVTVF9TVUlURShUb1N0cmluZ1Rlc3QpCiAKLUJPT1NUX0FVVE9fVEVTVF9DQVNFKCBiYXNlX3R5cGVzX3RvX3N0cmluZyApIHsKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKGJhc2VfdHlwZXNfdG9fc3RyaW5nKSB7CiAgIEJPT1NUX0NIRUNLX0VRVUFMKHRvX3N0cmluZygxMCksICIxMCIpOwogICBCT09TVF9DSEVDS19FUVVBTCh0b19zdHJpbmcodHJ1ZSksICIxIik7CiAgIEJPT1NUX0NIRUNLX0VRVUFMKHRvX3N0cmluZygnYScpLCAiYSIpOwpAQCAtNDAsOTEgKzQwLDkxIEBACiAgIEJPT1NUX0NIRUNLX0VRVUFMKHRvX3N0cmluZygiYWJjIiksICJhYmMiKTsKIH0KIAotQk9PU1RfQVVUT19URVNUX0NBU0UoIGVtcHR5X3ZlY3Rvcl90b19zdHJpbmcgKSB7CitCT09TVF9BVVRPX1RFU1RfQ0FTRShlbXB0eV92ZWN0b3JfdG9fc3RyaW5nKSB7CiAgIHN0ZDo6dmVjdG9yPGludD4gbDsKICAgQk9PU1RfQ0hFQ0tfRVFVQUwodG9fc3RyaW5nKGwpLCAiW10iKTsKIH0KIAotQk9PU1RfQVVUT19URVNUX0NBU0UoIHNpbmdsZV9pdGVtX3ZlY3Rvcl90b19zdHJpbmcgKSB7CitCT09TVF9BVVRPX1RFU1RfQ0FTRShzaW5nbGVfaXRlbV92ZWN0b3JfdG9fc3RyaW5nKSB7CiAgIHN0ZDo6dmVjdG9yPGludD4gbDsKICAgbC5wdXNoX2JhY2soMTAwKTsKICAgQk9PU1RfQ0hFQ0tfRVFVQUwodG9fc3RyaW5nKGwpLCAiWzEwMF0iKTsKIH0KIAotQk9PU1RfQVVUT19URVNUX0NBU0UoIG11bHRpcGxlX2l0ZW1fdmVjdG9yX3RvX3N0cmluZyApIHsKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKG11bHRpcGxlX2l0ZW1fdmVjdG9yX3RvX3N0cmluZykgewogICBzdGQ6OnZlY3RvcjxpbnQ+IGw7CiAgIGwucHVzaF9iYWNrKDEwMCk7CiAgIGwucHVzaF9iYWNrKDE1MCk7CiAgIEJPT1NUX0NIRUNLX0VRVUFMKHRvX3N0cmluZyhsKSwgIlsxMDAsIDE1MF0iKTsKIH0KIAotQk9PU1RfQVVUT19URVNUX0NBU0UoIGVtcHR5X21hcF90b19zdHJpbmcgKSB7CitCT09TVF9BVVRPX1RFU1RfQ0FTRShlbXB0eV9tYXBfdG9fc3RyaW5nKSB7CiAgIHN0ZDo6bWFwPGludCwgc3RkOjpzdHJpbmc+IG07CiAgIEJPT1NUX0NIRUNLX0VRVUFMKHRvX3N0cmluZyhtKSwgInt9Iik7CiB9CiAKLUJPT1NUX0FVVE9fVEVTVF9DQVNFKCBzaW5nbGVfaXRlbV9tYXBfdG9fc3RyaW5nICkgeworQk9PU1RfQVVUT19URVNUX0NBU0Uoc2luZ2xlX2l0ZW1fbWFwX3RvX3N0cmluZykgewogICBzdGQ6Om1hcDxpbnQsIHN0ZDo6c3RyaW5nPiBtOwogICBtWzEyXSA9ICJhYmMiOwogICBCT09TVF9DSEVDS19FUVVBTCh0b19zdHJpbmcobSksICJ7MTI6IGFiY30iKTsKIH0KIAotQk9PU1RfQVVUT19URVNUX0NBU0UoIG11bHRpX2l0ZW1fbWFwX3RvX3N0cmluZyApIHsKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKG11bHRpX2l0ZW1fbWFwX3RvX3N0cmluZykgewogICBzdGQ6Om1hcDxpbnQsIHN0ZDo6c3RyaW5nPiBtOwogICBtWzEyXSA9ICJhYmMiOwogICBtWzMxXSA9ICJ4eXoiOwogICBCT09TVF9DSEVDS19FUVVBTCh0b19zdHJpbmcobSksICJ7MTI6IGFiYywgMzE6IHh5en0iKTsKIH0KIAotQk9PU1RfQVVUT19URVNUX0NBU0UoIGVtcHR5X3NldF90b19zdHJpbmcgKSB7CitCT09TVF9BVVRPX1RFU1RfQ0FTRShlbXB0eV9zZXRfdG9fc3RyaW5nKSB7CiAgIHN0ZDo6c2V0PGNoYXI+IHM7CiAgIEJPT1NUX0NIRUNLX0VRVUFMKHRvX3N0cmluZyhzKSwgInt9Iik7CiB9CiAKLUJPT1NUX0FVVE9fVEVTVF9DQVNFKCBzaW5nbGVfaXRlbV9zZXRfdG9fc3RyaW5nICkgeworQk9PU1RfQVVUT19URVNUX0NBU0Uoc2luZ2xlX2l0ZW1fc2V0X3RvX3N0cmluZykgewogICBzdGQ6OnNldDxjaGFyPiBzOwogICBzLmluc2VydCgnYycpOwogICBCT09TVF9DSEVDS19FUVVBTCh0b19zdHJpbmcocyksICJ7Y30iKTsKIH0KIAotQk9PU1RfQVVUT19URVNUX0NBU0UoIG11bHRpX2l0ZW1fc2V0X3RvX3N0cmluZyApIHsKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKG11bHRpX2l0ZW1fc2V0X3RvX3N0cmluZykgewogICBzdGQ6OnNldDxjaGFyPiBzOwogICBzLmluc2VydCgnYScpOwogICBzLmluc2VydCgneicpOwogICBCT09TVF9DSEVDS19FUVVBTCh0b19zdHJpbmcocyksICJ7YSwgen0iKTsKIH0KIAotQk9PU1RfQVVUT19URVNUX0NBU0UoIGdlbmVyYXRlZF9lbXB0eV9vYmplY3RfdG9fc3RyaW5nICkgeworQk9PU1RfQVVUT19URVNUX0NBU0UoZ2VuZXJhdGVkX2VtcHR5X29iamVjdF90b19zdHJpbmcpIHsKICAgdGhyaWZ0Ojp0ZXN0OjpFbXB0eVN0cnVjdCBlOwogICBCT09TVF9DSEVDS19FUVVBTCh0b19zdHJpbmcoZSksICJFbXB0eVN0cnVjdCgpIik7CiB9CiAKLUJPT1NUX0FVVE9fVEVTVF9DQVNFKCBnZW5lcmF0ZWRfc2luZ2xlX2Jhc2ljX2ZpZWxkX29iamVjdF90b19zdHJpbmcgKSB7CitCT09TVF9BVVRPX1RFU1RfQ0FTRShnZW5lcmF0ZWRfc2luZ2xlX2Jhc2ljX2ZpZWxkX29iamVjdF90b19zdHJpbmcpIHsKICAgdGhyaWZ0Ojp0ZXN0OjpTdHJ1Y3RBIGE7CiAgIGEuX19zZXRfcygiYWJjZCIpOwogICBCT09TVF9DSEVDS19FUVVBTCh0b19zdHJpbmcoYSksICJTdHJ1Y3RBKHM9YWJjZCkiKTsKIH0KIAotQk9PU1RfQVVUT19URVNUX0NBU0UoIGdlbmVyYXRlZF90d29fYmFzaWNfZmllbGRzX29iamVjdF90b19zdHJpbmcgKSB7CitCT09TVF9BVVRPX1RFU1RfQ0FTRShnZW5lcmF0ZWRfdHdvX2Jhc2ljX2ZpZWxkc19vYmplY3RfdG9fc3RyaW5nKSB7CiAgIHRocmlmdDo6dGVzdDo6Qm9uayBhOwogICBhLl9fc2V0X21lc3NhZ2UoImFiY2QiKTsKICAgYS5fX3NldF90eXBlKDEyMzQpOwogICBCT09TVF9DSEVDS19FUVVBTCh0b19zdHJpbmcoYSksICJCb25rKG1lc3NhZ2U9YWJjZCwgdHlwZT0xMjM0KSIpOwogfQogCi1CT09TVF9BVVRPX1RFU1RfQ0FTRSggZ2VuZXJhdGVkX29wdGlvbmFsX2ZpZWxkc19vYmplY3RfdG9fc3RyaW5nICkgeworQk9PU1RfQVVUT19URVNUX0NBU0UoZ2VuZXJhdGVkX29wdGlvbmFsX2ZpZWxkc19vYmplY3RfdG9fc3RyaW5nKSB7CiAgIHRocmlmdDo6dGVzdDo6VHJpY2t5MiBhOwogICBCT09TVF9DSEVDS19FUVVBTCh0b19zdHJpbmcoYSksICJUcmlja3kyKGltX29wdGlvbmFsPTxudWxsPikiKTsKICAgYS5fX3NldF9pbV9vcHRpb25hbCgxMjMpOwogICBCT09TVF9DSEVDS19FUVVBTCh0b19zdHJpbmcoYSksICJUcmlja3kyKGltX29wdGlvbmFsPTEyMykiKTsKIH0KIAotQk9PU1RfQVVUT19URVNUX0NBU0UoIGdlbmVyYXRlZF9uZXN0ZWRfb2JqZWN0X3RvX3N0cmluZyApIHsKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKGdlbmVyYXRlZF9uZXN0ZWRfb2JqZWN0X3RvX3N0cmluZykgewogICB0aHJpZnQ6OnRlc3Q6Ok9uZUZpZWxkIGE7CiAgIEJPT1NUX0NIRUNLX0VRVUFMKHRvX3N0cmluZyhhKSwgIk9uZUZpZWxkKGZpZWxkPUVtcHR5U3RydWN0KCkpIik7CiB9CiAKLUJPT1NUX0FVVE9fVEVTVF9DQVNFKCBnZW5lcmF0ZWRfbmVzdGVkX2xpc3Rfb2JqZWN0X3RvX3N0cmluZyApIHsKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKGdlbmVyYXRlZF9uZXN0ZWRfbGlzdF9vYmplY3RfdG9fc3RyaW5nKSB7CiAgIHRocmlmdDo6dGVzdDo6TGlzdEJvbmtzIGw7CiAgIGwuYm9uay5hc3NpZ24oMiwgdGhyaWZ0Ojp0ZXN0OjpCb25rKCkpOwogICBsLmJvbmtbMF0uX19zZXRfbWVzc2FnZSgiYSIpOwpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L1RyYW5zcG9ydFRlc3QuY3BwIGIvbGliL2NwcC90ZXN0L1RyYW5zcG9ydFRlc3QuY3BwCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggNzhjMjc2NC4uY2UxOTU0NAotLS0gYS9saWIvY3BwL3Rlc3QvVHJhbnNwb3J0VGVzdC5jcHAKKysrIGIvbGliL2NwcC90ZXN0L1RyYW5zcG9ydFRlc3QuY3BwCkBAIC0xNiwxNyArMTYsMjMgQEAKICAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCisKKyNpbmNsdWRlIDx0aHJpZnQvdGhyaWZ0LWNvbmZpZy5oPgorCiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8dGltZS5oPgorI2lmZGVmIEhBVkVfU1lTX1NPQ0tFVF9ICisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2VuZGlmCiAjaW5jbHVkZSA8c3N0cmVhbT4KICNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPHRocmlmdC9jeHhmdW5jdGlvbmFsLmg+CiAKICNpbmNsdWRlIDxib29zdC9tcGwvbGlzdC5ocHA+CiAjaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX2FycmF5LmhwcD4KICNpbmNsdWRlIDxib29zdC9yYW5kb20uaHBwPgogI2luY2x1ZGUgPGJvb3N0L3R5cGVfdHJhaXRzLmhwcD4KICNpbmNsdWRlIDxib29zdC90ZXN0L3VuaXRfdGVzdC5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvdmVyc2lvbi5ocHA+CiAKICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9URkRUcmFuc3BvcnQuaD4KQEAgLTM2LDExICs0MiwxMiBAQAogCiAjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L0Z1bmN0aW9uUnVubmVyLmg+CiAjaWYgX1dJTjMyCi0gICNpbmNsdWRlIDx0aHJpZnQvd2luZG93cy9UV2luc29ja1NpbmdsZXRvbi5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFBpcGUuaD4KKyNpbmNsdWRlIDx0aHJpZnQvd2luZG93cy9UV2luc29ja1NpbmdsZXRvbi5oPgogI2VuZGlmCiAKLQogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7Cit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ7CiAKIHN0YXRpYyBib29zdDo6bXQxOTkzNyBybmc7CiAKQEAgLTQ5LDE0ICs1NiwxNCBAQAogfQogCiBjbGFzcyBTaXplR2VuZXJhdG9yIHsKLSBwdWJsaWM6CitwdWJsaWM6CiAgIHZpcnR1YWwgflNpemVHZW5lcmF0b3IoKSB7fQogICB2aXJ0dWFsIHVpbnQzMl90IG5leHRTaXplKCkgPSAwOwogICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGRlc2NyaWJlKCkgY29uc3QgPSAwOwogfTsKIAogY2xhc3MgQ29uc3RhbnRTaXplR2VuZXJhdG9yIDogcHVibGljIFNpemVHZW5lcmF0b3IgewotIHB1YmxpYzoKK3B1YmxpYzoKICAgQ29uc3RhbnRTaXplR2VuZXJhdG9yKHVpbnQzMl90IHZhbHVlKSA6IHZhbHVlXyh2YWx1ZSkge30KICAgdWludDMyX3QgbmV4dFNpemUoKSB7IHJldHVybiB2YWx1ZV87IH0KICAgc3RkOjpzdHJpbmcgZGVzY3JpYmUoKSBjb25zdCB7CkBAIC02NSwxNCArNzIsMTQgQEAKICAgICByZXR1cm4gZGVzYy5zdHIoKTsKICAgfQogCi0gcHJpdmF0ZToKK3ByaXZhdGU6CiAgIHVpbnQzMl90IHZhbHVlXzsKIH07CiAKIGNsYXNzIFJhbmRvbVNpemVHZW5lcmF0b3IgOiBwdWJsaWMgU2l6ZUdlbmVyYXRvciB7Ci0gcHVibGljOgotICBSYW5kb21TaXplR2VuZXJhdG9yKHVpbnQzMl90IG1pbiwgdWludDMyX3QgbWF4KSA6Ci0gICAgZ2VuZXJhdG9yXyhybmcsIGJvb3N0Ojp1bmlmb3JtX2ludDxpbnQ+KG1pbiwgbWF4KSkge30KK3B1YmxpYzoKKyAgUmFuZG9tU2l6ZUdlbmVyYXRvcih1aW50MzJfdCBtaW4sIHVpbnQzMl90IG1heCkKKyAgICA6IGdlbmVyYXRvcl8ocm5nLCBib29zdDo6dW5pZm9ybV9pbnQ8aW50PihtaW4sIG1heCkpIHt9CiAKICAgdWludDMyX3QgbmV4dFNpemUoKSB7IHJldHVybiBnZW5lcmF0b3JfKCk7IH0KIApAQCAtODUsOSArOTIsOCBAQAogICB1aW50MzJfdCBnZXRNaW4oKSBjb25zdCB7IHJldHVybiAoZ2VuZXJhdG9yXy5kaXN0cmlidXRpb24oKS5taW4pKCk7IH0KICAgdWludDMyX3QgZ2V0TWF4KCkgY29uc3QgeyByZXR1cm4gKGdlbmVyYXRvcl8uZGlzdHJpYnV0aW9uKCkubWF4KSgpOyB9CiAKLSBwcml2YXRlOgotICBib29zdDo6dmFyaWF0ZV9nZW5lcmF0b3I8IGJvb3N0OjptdDE5OTM3JiwgYm9vc3Q6OnVuaWZvcm1faW50PGludD4gPgotICAgIGdlbmVyYXRvcl87Citwcml2YXRlOgorICBib29zdDo6dmFyaWF0ZV9nZW5lcmF0b3I8Ym9vc3Q6Om10MTk5MzcmLCBib29zdDo6dW5pZm9ybV9pbnQ8aW50PiA+IGdlbmVyYXRvcl87CiB9OwogCiAvKioKQEAgLTk4LDE3ICsxMDQsMTYgQEAKICAqICAgdG8gbWFrZSBhIGNvcHkgb2YgdGhlIGdlbmVyYXRvciB0byBiaW5kIGl0IHRvIHRoZSB0ZXN0IGZ1bmN0aW9uLikKICAqLwogY2xhc3MgR2VuZXJpY1NpemVHZW5lcmF0b3IgOiBwdWJsaWMgU2l6ZUdlbmVyYXRvciB7Ci0gcHVibGljOgotICBHZW5lcmljU2l6ZUdlbmVyYXRvcih1aW50MzJfdCB2YWx1ZSkgOgotICAgIGdlbmVyYXRvcl8obmV3IENvbnN0YW50U2l6ZUdlbmVyYXRvcih2YWx1ZSkpIHt9Ci0gIEdlbmVyaWNTaXplR2VuZXJhdG9yKHVpbnQzMl90IG1pbiwgdWludDMyX3QgbWF4KSA6Ci0gICAgZ2VuZXJhdG9yXyhuZXcgUmFuZG9tU2l6ZUdlbmVyYXRvcihtaW4sIG1heCkpIHt9CitwdWJsaWM6CisgIEdlbmVyaWNTaXplR2VuZXJhdG9yKHVpbnQzMl90IHZhbHVlKSA6IGdlbmVyYXRvcl8obmV3IENvbnN0YW50U2l6ZUdlbmVyYXRvcih2YWx1ZSkpIHt9CisgIEdlbmVyaWNTaXplR2VuZXJhdG9yKHVpbnQzMl90IG1pbiwgdWludDMyX3QgbWF4KQorICAgIDogZ2VuZXJhdG9yXyhuZXcgUmFuZG9tU2l6ZUdlbmVyYXRvcihtaW4sIG1heCkpIHt9CiAKICAgdWludDMyX3QgbmV4dFNpemUoKSB7IHJldHVybiBnZW5lcmF0b3JfLT5uZXh0U2l6ZSgpOyB9CiAgIHN0ZDo6c3RyaW5nIGRlc2NyaWJlKCkgY29uc3QgeyByZXR1cm4gZ2VuZXJhdG9yXy0+ZGVzY3JpYmUoKTsgfQogCi0gcHJpdmF0ZToKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8U2l6ZUdlbmVyYXRvcj4gZ2VuZXJhdG9yXzsKK3ByaXZhdGU6CisgIHN0ZDo6c2hhcmVkX3B0cjxTaXplR2VuZXJhdG9yPiBnZW5lcmF0b3JfOwogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xMjUsMzIgKzEzMCwzMSBAQAogICovCiB0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KIGNsYXNzIENvdXBsZWRUcmFuc3BvcnRzIHsKLSBwdWJsaWM6CitwdWJsaWM6CiAgIHZpcnR1YWwgfkNvdXBsZWRUcmFuc3BvcnRzKCkge30KICAgdHlwZWRlZiBUcmFuc3BvcnRfIFRyYW5zcG9ydFR5cGU7CiAKICAgQ291cGxlZFRyYW5zcG9ydHMoKSA6IGluKCksIG91dCgpIHt9CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VHJhbnNwb3J0Xz4gaW47Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRyYW5zcG9ydF8+IG91dDsKKyAgc3RkOjpzaGFyZWRfcHRyPFRyYW5zcG9ydF8+IGluOworICBzdGQ6OnNoYXJlZF9wdHI8VHJhbnNwb3J0Xz4gb3V0OwogCi0gcHJpdmF0ZToKK3ByaXZhdGU6CiAgIENvdXBsZWRUcmFuc3BvcnRzKGNvbnN0IENvdXBsZWRUcmFuc3BvcnRzJik7Ci0gIENvdXBsZWRUcmFuc3BvcnRzICZvcGVyYXRvcj0oY29uc3QgQ291cGxlZFRyYW5zcG9ydHMmKTsKKyAgQ291cGxlZFRyYW5zcG9ydHMmIG9wZXJhdG9yPShjb25zdCBDb3VwbGVkVHJhbnNwb3J0cyYpOwogfTsKIAogLyoqCiAgKiBDb3VwbGVkIFRNZW1vcnlCdWZmZXJzCiAgKi8KIGNsYXNzIENvdXBsZWRNZW1vcnlCdWZmZXJzIDogcHVibGljIENvdXBsZWRUcmFuc3BvcnRzPFRNZW1vcnlCdWZmZXI+IHsKLSBwdWJsaWM6Ci0gIENvdXBsZWRNZW1vcnlCdWZmZXJzKCkgOgotICAgIGJ1ZihuZXcgVE1lbW9yeUJ1ZmZlcikgeworcHVibGljOgorICBDb3VwbGVkTWVtb3J5QnVmZmVycygpIDogYnVmKG5ldyBUTWVtb3J5QnVmZmVyKSB7CiAgICAgaW4gPSBidWY7CiAgICAgb3V0ID0gYnVmOwogICB9CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmOworICBzdGQ6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmOwogfTsKIAogLyoqCkBAIC0xNTksNyArMTYzLDcgQEAKICAqLwogdGVtcGxhdGUgPGNsYXNzIFdyYXBwZXJUcmFuc3BvcnRfLCBjbGFzcyBJbm5lckNvdXBsZWRUcmFuc3BvcnRzXz4KIGNsYXNzIENvdXBsZWRXcmFwcGVyVHJhbnNwb3J0c1QgOiBwdWJsaWMgQ291cGxlZFRyYW5zcG9ydHM8V3JhcHBlclRyYW5zcG9ydF8+IHsKLSBwdWJsaWM6CitwdWJsaWM6CiAgIENvdXBsZWRXcmFwcGVyVHJhbnNwb3J0c1QoKSB7CiAgICAgaWYgKGlubmVyXy5pbikgewogICAgICAgdGhpcy0+aW4ucmVzZXQobmV3IFdyYXBwZXJUcmFuc3BvcnRfKGlubmVyXy5pbikpOwpAQCAtMTc2LDM0ICsxODAsMjcgQEAKICAqIENvdXBsZWQgVEJ1ZmZlcmVkVHJhbnNwb3J0cy4KICAqLwogdGVtcGxhdGUgPGNsYXNzIElubmVyVHJhbnNwb3J0Xz4KLWNsYXNzIENvdXBsZWRCdWZmZXJlZFRyYW5zcG9ydHNUIDoKLSAgcHVibGljIENvdXBsZWRXcmFwcGVyVHJhbnNwb3J0c1Q8VEJ1ZmZlcmVkVHJhbnNwb3J0LCBJbm5lclRyYW5zcG9ydF8+IHsKLX07CitjbGFzcyBDb3VwbGVkQnVmZmVyZWRUcmFuc3BvcnRzVAorICAgIDogcHVibGljIENvdXBsZWRXcmFwcGVyVHJhbnNwb3J0c1Q8VEJ1ZmZlcmVkVHJhbnNwb3J0LCBJbm5lclRyYW5zcG9ydF8+IHt9OwogCi10eXBlZGVmIENvdXBsZWRCdWZmZXJlZFRyYW5zcG9ydHNUPENvdXBsZWRNZW1vcnlCdWZmZXJzPgotICBDb3VwbGVkQnVmZmVyZWRUcmFuc3BvcnRzOwordHlwZWRlZiBDb3VwbGVkQnVmZmVyZWRUcmFuc3BvcnRzVDxDb3VwbGVkTWVtb3J5QnVmZmVycz4gQ291cGxlZEJ1ZmZlcmVkVHJhbnNwb3J0czsKIAogLyoqCiAgKiBDb3VwbGVkIFRGcmFtZWRUcmFuc3BvcnRzLgogICovCiB0ZW1wbGF0ZSA8Y2xhc3MgSW5uZXJUcmFuc3BvcnRfPgotY2xhc3MgQ291cGxlZEZyYW1lZFRyYW5zcG9ydHNUIDoKLSAgcHVibGljIENvdXBsZWRXcmFwcGVyVHJhbnNwb3J0c1Q8VEZyYW1lZFRyYW5zcG9ydCwgSW5uZXJUcmFuc3BvcnRfPiB7Ci19OworY2xhc3MgQ291cGxlZEZyYW1lZFRyYW5zcG9ydHNUCisgICAgOiBwdWJsaWMgQ291cGxlZFdyYXBwZXJUcmFuc3BvcnRzVDxURnJhbWVkVHJhbnNwb3J0LCBJbm5lclRyYW5zcG9ydF8+IHt9OwogCi10eXBlZGVmIENvdXBsZWRGcmFtZWRUcmFuc3BvcnRzVDxDb3VwbGVkTWVtb3J5QnVmZmVycz4KLSAgQ291cGxlZEZyYW1lZFRyYW5zcG9ydHM7Cit0eXBlZGVmIENvdXBsZWRGcmFtZWRUcmFuc3BvcnRzVDxDb3VwbGVkTWVtb3J5QnVmZmVycz4gQ291cGxlZEZyYW1lZFRyYW5zcG9ydHM7CiAKIC8qKgogICogQ291cGxlZCBUWmxpYlRyYW5zcG9ydHMuCiAgKi8KIHRlbXBsYXRlIDxjbGFzcyBJbm5lclRyYW5zcG9ydF8+Ci1jbGFzcyBDb3VwbGVkWmxpYlRyYW5zcG9ydHNUIDoKLSAgcHVibGljIENvdXBsZWRXcmFwcGVyVHJhbnNwb3J0c1Q8VFpsaWJUcmFuc3BvcnQsIElubmVyVHJhbnNwb3J0Xz4gewotfTsKK2NsYXNzIENvdXBsZWRabGliVHJhbnNwb3J0c1QgOiBwdWJsaWMgQ291cGxlZFdyYXBwZXJUcmFuc3BvcnRzVDxUWmxpYlRyYW5zcG9ydCwgSW5uZXJUcmFuc3BvcnRfPiB7fTsKIAotdHlwZWRlZiBDb3VwbGVkWmxpYlRyYW5zcG9ydHNUPENvdXBsZWRNZW1vcnlCdWZmZXJzPgotICBDb3VwbGVkWmxpYlRyYW5zcG9ydHM7Cit0eXBlZGVmIENvdXBsZWRabGliVHJhbnNwb3J0c1Q8Q291cGxlZE1lbW9yeUJ1ZmZlcnM+IENvdXBsZWRabGliVHJhbnNwb3J0czsKIAogI2lmbmRlZiBfV0lOMzIKIC8vIEZEIHRyYW5zcG9ydCBkb2Vzbid0IG1ha2UgbXVjaCBzZW5zZSBvbiBXaW5kb3dzLgpAQCAtMjExLDcgKzIwOCw3IEBACiAgKiBDb3VwbGVkIFRGRFRyYW5zcG9ydHMuCiAgKi8KIGNsYXNzIENvdXBsZWRGRFRyYW5zcG9ydHMgOiBwdWJsaWMgQ291cGxlZFRyYW5zcG9ydHM8VEZEVHJhbnNwb3J0PiB7Ci0gcHVibGljOgorcHVibGljOgogICBDb3VwbGVkRkRUcmFuc3BvcnRzKCkgewogICAgIGludCBwaXBlc1syXTsKIApAQCAtMjIzLDEzICsyMjAsMjkgQEAKICAgICBvdXQucmVzZXQobmV3IFRGRFRyYW5zcG9ydChwaXBlc1sxXSwgVEZEVHJhbnNwb3J0OjpDTE9TRV9PTl9ERVNUUk9ZKSk7CiAgIH0KIH07CisjZWxzZQorLyoqCisgKiBDb3VwbGVkIHBpcGUgdHJhbnNwb3J0cworICovCitjbGFzcyBDb3VwbGVkUGlwZVRyYW5zcG9ydHMgOiBwdWJsaWMgQ291cGxlZFRyYW5zcG9ydHM8VFBpcGU+IHsKK3B1YmxpYzoKKyAgSEFORExFIGhSZWFkOworICBIQU5ETEUgaFdyaXRlOworCisgIENvdXBsZWRQaXBlVHJhbnNwb3J0cygpIHsKKyAgICBCT09TVF9SRVFVSVJFKENyZWF0ZVBpcGUoJmhSZWFkLCAmaFdyaXRlLCBOVUxMLCAxMDQ4NTc2ICogMikpOworICAgIGluLnJlc2V0KG5ldyBUUGlwZShoUmVhZCwgaFdyaXRlKSk7CisgICAgaW4tPm9wZW4oKTsKKyAgICBvdXQgPSBpbjsKKyAgfQorfTsKICNlbmRpZgogCiAvKioKICAqIENvdXBsZWQgVFNvY2tldHMKICAqLwogY2xhc3MgQ291cGxlZFNvY2tldFRyYW5zcG9ydHMgOiBwdWJsaWMgQ291cGxlZFRyYW5zcG9ydHM8VFNvY2tldD4gewotIHB1YmxpYzoKK3B1YmxpYzoKICAgQ291cGxlZFNvY2tldFRyYW5zcG9ydHMoKSB7CiAgICAgVEhSSUZUX1NPQ0tFVCBzb2NrZXRzWzJdID0gezB9OwogICAgIGlmIChUSFJJRlRfU09DS0VUUEFJUihQRl9VTklYLCBTT0NLX1NUUkVBTSwgMCwgc29ja2V0cykgIT0gMCkgewpAQCAtMjQyLDM5ICsyNTUsMzQgQEAKICAgfQogfTsKIAotLy9UaGVzZSBjb3VsZCBiZSBtYWRlIHRvIHdvcmsgb24gV2luZG93cywgYnV0IEkgZG9uJ3QgY2FyZSBlbm91Z2ggdG8gbWFrZSBpdCBoYXBwZW4KKy8vIFRoZXNlIGNvdWxkIGJlIG1hZGUgdG8gd29yayBvbiBXaW5kb3dzLCBidXQgSSBkb24ndCBjYXJlIGVub3VnaCB0byBtYWtlIGl0IGhhcHBlbgogI2lmbmRlZiBfV0lOMzIKIC8qKgogICogQ291cGxlZCBURmlsZVRyYW5zcG9ydHMKICAqLwogY2xhc3MgQ291cGxlZEZpbGVUcmFuc3BvcnRzIDogcHVibGljIENvdXBsZWRUcmFuc3BvcnRzPFRGaWxlVHJhbnNwb3J0PiB7Ci0gcHVibGljOgorcHVibGljOgogICBDb3VwbGVkRmlsZVRyYW5zcG9ydHMoKSB7CiAjaWZuZGVmIF9XSU4zMgogICAgIGNvbnN0IGNoYXIqIHRtcF9kaXIgPSAiL3RtcCI7Ci0gICAgI2RlZmluZSBGSUxFTkFNRV9TVUZGSVggIi90aHJpZnQudHJhbnNwb3J0X3Rlc3QiCisjZGVmaW5lIEZJTEVOQU1FX1NVRkZJWCAiL3RocmlmdC50cmFuc3BvcnRfdGVzdCIKICNlbHNlCiAgICAgY29uc3QgY2hhciogdG1wX2RpciA9IGdldGVudigiVE1QIik7Ci0gICAgI2RlZmluZSBGSUxFTkFNRV9TVUZGSVggIlxcdGhyaWZ0LnRyYW5zcG9ydF90ZXN0IgorI2RlZmluZSBGSUxFTkFNRV9TVUZGSVggIlxcdGhyaWZ0LnRyYW5zcG9ydF90ZXN0IgogI2VuZGlmCiAKICAgICAvLyBDcmVhdGUgYSB0ZW1wb3JhcnkgZmlsZSB0byB1c2UKICAgICBmaWxlbmFtZS5yZXNpemUoc3RybGVuKHRtcF9kaXIpICsgc3RybGVuKEZJTEVOQU1FX1NVRkZJWCkpOwotICAgIFRIUklGVF9TTlBSSU5URigmZmlsZW5hbWVbMF0sIGZpbGVuYW1lLnNpemUoKSwKLSAgICAgICAgICAgICAiJXMiIEZJTEVOQU1FX1NVRkZJWCwgdG1wX2Rpcik7Ci0gICAgI3VuZGVmIEZJTEVOQU1FX1NVRkZJWAorICAgIFRIUklGVF9TTlBSSU5URigmZmlsZW5hbWVbMF0sIGZpbGVuYW1lLnNpemUoKSwgIiVzIiBGSUxFTkFNRV9TVUZGSVgsIHRtcF9kaXIpOworI3VuZGVmIEZJTEVOQU1FX1NVRkZJWAogCi0gICAgewotICAgICAgc3RkOjpvZnN0cmVhbSBkdW1teV9jcmVhdGlvbihmaWxlbmFtZS5jX3N0cigpLCBzdGQ6Om9mc3RyZWFtOjp0cnVuYyk7Ci0gICAgfQorICAgIHsgc3RkOjpvZnN0cmVhbSBkdW1teV9jcmVhdGlvbihmaWxlbmFtZS5jX3N0cigpLCBzdGQ6Om9mc3RyZWFtOjp0cnVuYyk7IH0KIAogICAgIGluLnJlc2V0KG5ldyBURmlsZVRyYW5zcG9ydChmaWxlbmFtZSwgdHJ1ZSkpOwogICAgIG91dC5yZXNldChuZXcgVEZpbGVUcmFuc3BvcnQoZmlsZW5hbWUpKTsKICAgfQogCi0gIH5Db3VwbGVkRmlsZVRyYW5zcG9ydHMoKSB7Ci0gICAgcmVtb3ZlKGZpbGVuYW1lLmNfc3RyKCkpOwotICB9CisgIH5Db3VwbGVkRmlsZVRyYW5zcG9ydHMoKSB7IHJlbW92ZShmaWxlbmFtZS5jX3N0cigpKTsgfQogCiAgIHN0ZDo6c3RyaW5nIGZpbGVuYW1lOwogfTsKQEAgLTI5MCw3ICsyOTgsNyBAQAogICovCiB0ZW1wbGF0ZSA8Y2xhc3MgQ291cGxlZFRyYW5zcG9ydHNfPgogY2xhc3MgQ291cGxlZFRUcmFuc3BvcnRzIDogcHVibGljIENvdXBsZWRUcmFuc3BvcnRzPFRUcmFuc3BvcnQ+IHsKLSBwdWJsaWM6CitwdWJsaWM6CiAgIENvdXBsZWRUVHJhbnNwb3J0cygpIDogdHJhbnNwb3J0cygpIHsKICAgICBpbiA9IHRyYW5zcG9ydHMuaW47CiAgICAgb3V0ID0gdHJhbnNwb3J0cy5vdXQ7CkBAIC0zMDgsNyArMzE2LDcgQEAKICAqLwogdGVtcGxhdGUgPGNsYXNzIENvdXBsZWRUcmFuc3BvcnRzXz4KIGNsYXNzIENvdXBsZWRCdWZmZXJCYXNlcyA6IHB1YmxpYyBDb3VwbGVkVHJhbnNwb3J0czxUQnVmZmVyQmFzZT4gewotIHB1YmxpYzoKK3B1YmxpYzoKICAgQ291cGxlZEJ1ZmZlckJhc2VzKCkgOiB0cmFuc3BvcnRzKCkgewogICAgIGluID0gdHJhbnNwb3J0cy5pbjsKICAgICBvdXQgPSB0cmFuc3BvcnRzLm91dDsKQEAgLTMzMiwxNSArMzQwLDExIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0cnVjdCBUcmlnZ2VySW5mbyB7Ci0gIFRyaWdnZXJJbmZvKGludCBzZWNvbmRzLCBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiYgdHJhbnNwb3J0LAotICAgICAgICAgICAgICB1aW50MzJfdCB3cml0ZUxlbmd0aCkgOgotICAgIHRpbWVvdXRTZWNvbmRzKHNlY29uZHMpLAotICAgIHRyYW5zcG9ydCh0cmFuc3BvcnQpLAotICAgIHdyaXRlTGVuZ3RoKHdyaXRlTGVuZ3RoKSwKLSAgICBuZXh0KE5VTEwpIHt9CisgIFRyaWdnZXJJbmZvKGludCBzZWNvbmRzLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4mIHRyYW5zcG9ydCwgdWludDMyX3Qgd3JpdGVMZW5ndGgpCisgICAgOiB0aW1lb3V0U2Vjb25kcyhzZWNvbmRzKSwgdHJhbnNwb3J0KHRyYW5zcG9ydCksIHdyaXRlTGVuZ3RoKHdyaXRlTGVuZ3RoKSwgbmV4dChOVUxMKSB7fQogCiAgIGludCB0aW1lb3V0U2Vjb25kczsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0OworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0OwogICB1aW50MzJfdCB3cml0ZUxlbmd0aDsKICAgVHJpZ2dlckluZm8qIG5leHQ7CiB9OwpAQCAtMzUxLDcgKzM1NSw3IEBACiBib29sIGdfdGVhcmRvd24gPSBmYWxzZTsKIAogdm9pZCBhbGFybV9oYW5kbGVyKCkgewotICBUcmlnZ2VySW5mbyAqaW5mbyA9IE5VTEw7CisgIFRyaWdnZXJJbmZvKiBpbmZvID0gTlVMTDsKICAgewogICAgIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6U3luY2hyb25pemVkIHMoZ19hbGFybV9tb25pdG9yKTsKICAgICAvLyBUaGUgYWxhcm0gdGltZWQgb3V0LCB3aGljaCBhbG1vc3QgY2VydGFpbmx5IG1lYW5zIHdlJ3JlIHN0dWNrCkBAIC0zODMsMjYgKzM4NywyNiBAQAogfQogCiB2b2lkIGFsYXJtX2hhbmRsZXJfd3JhcHBlcigpIHsKLSAgaW50NjRfdCB0aW1lb3V0ID0gMDsgIC8vdGltZW91dCBvZiAwIG1lYW5zIHdhaXQgZm9yZXZlcgotICB3aGlsZSh0cnVlKSB7CisgIGludDY0X3QgdGltZW91dCA9IDA7IC8vIHRpbWVvdXQgb2YgMCBtZWFucyB3YWl0IGZvcmV2ZXIKKyAgd2hpbGUgKHRydWUpIHsKICAgICBib29sIGZpcmVIYW5kbGVyID0gZmFsc2U7CiAgICAgewogICAgICAgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpTeW5jaHJvbml6ZWQgcyhnX2FsYXJtX21vbml0b3IpOwotICAgICAgaWYoZ190ZWFyZG93bikKLSAgICAgICAgIHJldHVybjsKLSAgICAgIC8vY2FsY3VsYXRlIHRpbWVvdXQKKyAgICAgIGlmIChnX3RlYXJkb3duKQorICAgICAgICByZXR1cm47CisgICAgICAvLyBjYWxjdWxhdGUgdGltZW91dAogICAgICAgaWYgKGdfdHJpZ2dlckluZm8gPT0gTlVMTCkgewogICAgICAgICB0aW1lb3V0ID0gMDsKICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICB0aW1lb3V0ID0gZ190cmlnZ2VySW5mby0+dGltZW91dFNlY29uZHMgKiAxMDAwOworICAgICAgICB0aW1lb3V0ID0gZ190cmlnZ2VySW5mby0+dGltZW91dFNlY29uZHMgKiAxMDAwOwogICAgICAgfQogCiAgICAgICBpbnQgd2FpdFJlc3VsdCA9IGdfYWxhcm1fbW9uaXRvci53YWl0Rm9yVGltZVJlbGF0aXZlKHRpbWVvdXQpOwotICAgICAgaWYod2FpdFJlc3VsdCA9PSBUSFJJRlRfRVRJTUVET1VUKQorICAgICAgaWYgKHdhaXRSZXN1bHQgPT0gVEhSSUZUX0VUSU1FRE9VVCkKICAgICAgICAgZmlyZUhhbmRsZXIgPSB0cnVlOwogICAgIH0KLSAgICBpZihmaXJlSGFuZGxlcikKLSAgICAgIGFsYXJtX2hhbmRsZXIoKTsgLy9jYWxsaW5nIG91dHNpZGUgdGhlIGxvY2sKKyAgICBpZiAoZmlyZUhhbmRsZXIpCisgICAgICBhbGFybV9oYW5kbGVyKCk7IC8vIGNhbGxpbmcgb3V0c2lkZSB0aGUgbG9jawogICB9CiB9CiAKQEAgLTQxNSw3ICs0MTksNyBAQAogICogdG8gdGhlIGVuZC4pCiAgKi8KIHZvaWQgYWRkX3RyaWdnZXIodW5zaWduZWQgaW50IHNlY29uZHMsCi0gICAgICAgICAgICAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+ICZ0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiYgdHJhbnNwb3J0LAogICAgICAgICAgICAgICAgICB1aW50MzJfdCB3cml0ZV9sZW4pIHsKICAgVHJpZ2dlckluZm8qIGluZm8gPSBuZXcgVHJpZ2dlckluZm8oc2Vjb25kcywgdHJhbnNwb3J0LCB3cml0ZV9sZW4pOwogICB7CkBAIC00MzcsNyArNDQxLDcgQEAKIH0KIAogdm9pZCBjbGVhcl90cmlnZ2VycygpIHsKLSAgVHJpZ2dlckluZm8gKmluZm8gPSBOVUxMOworICBUcmlnZ2VySW5mbyogaW5mbyA9IE5VTEw7CiAKICAgewogICAgIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6U3luY2hyb25pemVkIHMoZ19hbGFybV9tb25pdG9yKTsKQEAgLTQ1NSw3ICs0NTksNyBAQAogfQogCiB2b2lkIHNldF90cmlnZ2VyKHVuc2lnbmVkIGludCBzZWNvbmRzLAotICAgICAgICAgICAgICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiAmdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4mIHRyYW5zcG9ydCwKICAgICAgICAgICAgICAgICAgdWludDMyX3Qgd3JpdGVfbGVuKSB7CiAgIGNsZWFyX3RyaWdnZXJzKCk7CiAgIGFkZF90cmlnZ2VyKHNlY29uZHMsIHRyYW5zcG9ydCwgd3JpdGVfbGVuKTsKQEAgLTQ5OSwxMCArNTAzLDggQEAKICAgQk9PU1RfUkVRVUlSRSh0cmFuc3BvcnRzLmluICE9IE5VTEwpOwogICBCT09TVF9SRVFVSVJFKHRyYW5zcG9ydHMub3V0ICE9IE5VTEwpOwogCi0gIGJvb3N0OjpzaGFyZWRfYXJyYXk8dWludDhfdD4gd2J1ZiA9Ci0gICAgYm9vc3Q6OnNoYXJlZF9hcnJheTx1aW50OF90PihuZXcgdWludDhfdFt0b3RhbFNpemVdKTsKLSAgYm9vc3Q6OnNoYXJlZF9hcnJheTx1aW50OF90PiByYnVmID0KLSAgICBib29zdDo6c2hhcmVkX2FycmF5PHVpbnQ4X3Q+KG5ldyB1aW50OF90W3RvdGFsU2l6ZV0pOworICBib29zdDo6c2hhcmVkX2FycmF5PHVpbnQ4X3Q+IHdidWYgPSBib29zdDo6c2hhcmVkX2FycmF5PHVpbnQ4X3Q+KG5ldyB1aW50OF90W3RvdGFsU2l6ZV0pOworICBib29zdDo6c2hhcmVkX2FycmF5PHVpbnQ4X3Q+IHJidWYgPSBib29zdDo6c2hhcmVkX2FycmF5PHVpbnQ4X3Q+KG5ldyB1aW50OF90W3RvdGFsU2l6ZV0pOwogCiAgIC8vIHN0b3JlIHNvbWUgZGF0YSBpbiB3YnVmCiAgIGZvciAodWludDMyX3QgbiA9IDA7IG4gPCB0b3RhbFNpemU7ICsrbikgewpAQCAtNTIyLDggKzUyNCw3IEBACiAKICAgICAvLyBNYWtlIHN1cmUgKHRvdGFsX3dyaXR0ZW4gLSB0b3RhbF9yZWFkKSArIHdjaHVua19zaXplCiAgICAgLy8gaXMgbGVzcyB0aGFuIG1heE91dHN0YW5kaW5nCi0gICAgaWYgKG1heE91dHN0YW5kaW5nID4gMCAmJgotICAgICAgICB3Y2h1bmtfc2l6ZSA+IG1heE91dHN0YW5kaW5nIC0gKHRvdGFsX3dyaXR0ZW4gLSB0b3RhbF9yZWFkKSkgeworICAgIGlmIChtYXhPdXRzdGFuZGluZyA+IDAgJiYgd2NodW5rX3NpemUgPiBtYXhPdXRzdGFuZGluZyAtICh0b3RhbF93cml0dGVuIC0gdG90YWxfcmVhZCkpIHsKICAgICAgIHdjaHVua19zaXplID0gbWF4T3V0c3RhbmRpbmcgLSAodG90YWxfd3JpdHRlbiAtIHRvdGFsX3JlYWQpOwogICAgIH0KIApAQCAtNTM3LDggKzUzOCw3IEBACiAKICAgICAgIHRyeSB7CiAgICAgICAgIHRyYW5zcG9ydHMub3V0LT53cml0ZSh3YnVmLmdldCgpICsgdG90YWxfd3JpdHRlbiwgd3JpdGVfc2l6ZSk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiAmIHRlKSB7CisgICAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJiB0ZSkgewogICAgICAgICBpZiAodGUuZ2V0VHlwZSgpID09IFRUcmFuc3BvcnRFeGNlcHRpb246OlRJTUVEX09VVCkKICAgICAgICAgICBicmVhazsKICAgICAgICAgdGhyb3cgdGU7CkBAIC01NzIsMTcgKzU3MiwxNSBAQAogICAgICAgdHJ5IHsKICAgICAgICAgYnl0ZXNfcmVhZCA9IHRyYW5zcG9ydHMuaW4tPnJlYWQocmJ1Zi5nZXQoKSArIHRvdGFsX3JlYWQsIHJlYWRfc2l6ZSk7CiAgICAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJiBlKSB7Ci0gICAgICAgIEJPT1NUX0ZBSUwoInJlYWQocG9zPSIgPDwgdG90YWxfcmVhZCA8PCAiLCBzaXplPSIgPDwgcmVhZF9zaXplIDw8Ci0gICAgICAgICAgICAgICAgICAgIikgdGhyZXcgZXhjZXB0aW9uIFwiIiA8PCBlLndoYXQoKSA8PAotICAgICAgICAgICAgICAgICAgICJcIjsgd3JpdHRlbiBzbyBmYXI6ICIgPDwgdG90YWxfd3JpdHRlbiA8PCAiIC8gIiA8PAotICAgICAgICAgICAgICAgICAgIHRvdGFsU2l6ZSA8PCAiIGJ5dGVzIik7CisgICAgICAgIEJPT1NUX0ZBSUwoInJlYWQocG9zPSIgPDwgdG90YWxfcmVhZCA8PCAiLCBzaXplPSIgPDwgcmVhZF9zaXplIDw8ICIpIHRocmV3IGV4Y2VwdGlvbiBcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlLndoYXQoKSA8PCAiXCI7IHdyaXR0ZW4gc28gZmFyOiAiIDw8IHRvdGFsX3dyaXR0ZW4gPDwgIiAvICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCB0b3RhbFNpemUgPDwgIiBieXRlcyIpOwogICAgICAgfQogCiAgICAgICBCT09TVF9SRVFVSVJFX01FU1NBR0UoYnl0ZXNfcmVhZCA+IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlYWQocG9zPSIgPDwgdG90YWxfcmVhZCA8PCAiLCBzaXplPSIgPDwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkX3NpemUgPDwgIikgcmV0dXJuZWQgIiA8PCBieXRlc19yZWFkIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIjsgd3JpdHRlbiBzbyBmYXI6ICIgPDwgdG90YWxfd3JpdHRlbiA8PCAiIC8gIiA8PAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsU2l6ZSA8PCAiIGJ5dGVzIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlYWQocG9zPSIgPDwgdG90YWxfcmVhZCA8PCAiLCBzaXplPSIgPDwgcmVhZF9zaXplIDw8ICIpIHJldHVybmVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBieXRlc19yZWFkIDw8ICI7IHdyaXR0ZW4gc28gZmFyOiAiIDw8IHRvdGFsX3dyaXR0ZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIC8gIiA8PCB0b3RhbFNpemUgPDwgIiBieXRlcyIpOwogICAgICAgY2h1bmtfcmVhZCArPSBieXRlc19yZWFkOwogICAgICAgdG90YWxfcmVhZCArPSBieXRlc19yZWFkOwogICAgIH0KQEAgLTU5Miw3ICs1OTAsNiBAQAogICBCT09TVF9DSEVDS19FUVVBTChtZW1jbXAocmJ1Zi5nZXQoKSwgd2J1Zi5nZXQoKSwgdG90YWxTaXplKSwgMCk7CiB9CiAKLQogdGVtcGxhdGUgPGNsYXNzIENvdXBsZWRUcmFuc3BvcnRzPgogdm9pZCB0ZXN0X3JlYWRfcGFydF9hdmFpbGFibGUoKSB7CiAgIENvdXBsZWRUcmFuc3BvcnRzIHRyYW5zcG9ydHM7CkBAIC02MDksOCArNjA2LDggQEAKICAgdHJhbnNwb3J0cy5vdXQtPmZsdXNoKCk7CiAgIHNldF90cmlnZ2VyKDMsIHRyYW5zcG9ydHMub3V0LCAxKTsKICAgdWludDMyX3QgYnl0ZXNfcmVhZCA9IHRyYW5zcG9ydHMuaW4tPnJlYWQocmVhZF9idWYsIDEwKTsKLSAgQk9PU1RfQ0hFQ0tfRVFVQUwoZ19udW1UcmlnZ2Vyc0ZpcmVkLCAodW5zaWduZWQgaW50KSAwKTsKLSAgQk9PU1RfQ0hFQ0tfRVFVQUwoYnl0ZXNfcmVhZCwgKHVpbnQzMl90KSA5KTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZ19udW1UcmlnZ2Vyc0ZpcmVkLCAodW5zaWduZWQgaW50KTApOworICBCT09TVF9DSEVDS19FUVVBTChieXRlc19yZWFkLCAodWludDMyX3QpOSk7CiAKICAgY2xlYXJfdHJpZ2dlcnMoKTsKIH0KQEAgLTY3Niw3ICs2NzMsNyBAQAogCiAgIC8vIE5vdyByZWFkIDQgYnl0ZXMsIHNvIHRoYXQgd2UgYXJlIHBhcnR3YXkgdGhyb3VnaCB0aGUgd3JpdHRlbiBkYXRhLgogICB1aW50MzJfdCBieXRlc19yZWFkID0gdHJhbnNwb3J0cy5pbi0+cmVhZChyZWFkX2J1ZiwgNCk7Ci0gIEJPT1NUX0NIRUNLX0VRVUFMKGJ5dGVzX3JlYWQsICh1aW50MzJfdCkgNCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGJ5dGVzX3JlYWQsICh1aW50MzJfdCk0KTsKIAogICAvLyBOb3cgYXR0ZW1wdCB0byByZWFkIDEwIGJ5dGVzLiAgT25seSA5IG1vcmUgYXJlIGF2YWlsYWJsZS4KICAgLy8KQEAgLTY4OSwxMyArNjg2LDEzIEBACiAgIHdoaWxlICh0b3RhbF9yZWFkIDwgOSkgewogICAgIHNldF90cmlnZ2VyKDMsIHRyYW5zcG9ydHMub3V0LCAxKTsKICAgICBieXRlc19yZWFkID0gdHJhbnNwb3J0cy5pbi0+cmVhZChyZWFkX2J1ZiwgMTApOwotICAgIEJPT1NUX1JFUVVJUkVfRVFVQUwoZ19udW1UcmlnZ2Vyc0ZpcmVkLCAodW5zaWduZWQgaW50KSAwKTsKLSAgICBCT09TVF9SRVFVSVJFX0dUKGJ5dGVzX3JlYWQsICh1aW50MzJfdCkgMCk7CisgICAgQk9PU1RfUkVRVUlSRV9FUVVBTChnX251bVRyaWdnZXJzRmlyZWQsICh1bnNpZ25lZCBpbnQpMCk7CisgICAgQk9PU1RfUkVRVUlSRV9HVChieXRlc19yZWFkLCAodWludDMyX3QpMCk7CiAgICAgdG90YWxfcmVhZCArPSBieXRlc19yZWFkOwotICAgIEJPT1NUX1JFUVVJUkVfTEUodG90YWxfcmVhZCwgKHVpbnQzMl90KSA5KTsKKyAgICBCT09TVF9SRVFVSVJFX0xFKHRvdGFsX3JlYWQsICh1aW50MzJfdCk5KTsKICAgfQogCi0gIEJPT1NUX0NIRUNLX0VRVUFMKHRvdGFsX3JlYWQsICh1aW50MzJfdCkgOSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHRvdGFsX3JlYWQsICh1aW50MzJfdCk5KTsKIAogICBjbGVhcl90cmlnZ2VycygpOwogfQpAQCAtNzE3LDcgKzcxNCw3IEBACiAgIHNldF90cmlnZ2VyKDMsIHRyYW5zcG9ydHMub3V0LCAxKTsKICAgdWludDMyX3QgYm9ycm93X2xlbiA9IDEwOwogICBjb25zdCB1aW50OF90KiBib3Jyb3dlZF9idWYgPSB0cmFuc3BvcnRzLmluLT5ib3Jyb3cocmVhZF9idWYsICZib3Jyb3dfbGVuKTsKLSAgQk9PU1RfQ0hFQ0tfRVFVQUwoZ19udW1UcmlnZ2Vyc0ZpcmVkLCAodW5zaWduZWQgaW50KSAwKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZ19udW1UcmlnZ2Vyc0ZpcmVkLCAodW5zaWduZWQgaW50KTApOwogICBCT09TVF9DSEVDSyhib3Jyb3dlZF9idWYgPT0gTlVMTCk7CiAKICAgY2xlYXJfdHJpZ2dlcnMoKTsKQEAgLTc0MywxMSArNzQwLDExIEBACiAgIGFkZF90cmlnZ2VyKDEsIHRyYW5zcG9ydHMub3V0LCA4KTsKICAgdWludDMyX3QgYnl0ZXNfcmVhZCA9IHRyYW5zcG9ydHMuaW4tPnJlYWQocmVhZF9idWYsIDEwKTsKICAgaWYgKGJ5dGVzX3JlYWQgPT0gMCkgewotICAgIEJPT1NUX0NIRUNLX0VRVUFMKGdfbnVtVHJpZ2dlcnNGaXJlZCwgKHVuc2lnbmVkIGludCkgMCk7CisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoZ19udW1UcmlnZ2Vyc0ZpcmVkLCAodW5zaWduZWQgaW50KTApOwogICAgIGNsZWFyX3RyaWdnZXJzKCk7CiAgIH0gZWxzZSB7Ci0gICAgQk9PU1RfQ0hFQ0tfRVFVQUwoZ19udW1UcmlnZ2Vyc0ZpcmVkLCAodW5zaWduZWQgaW50KSAxKTsKLSAgICBCT09TVF9DSEVDS19FUVVBTChieXRlc19yZWFkLCAodWludDMyX3QpIDIpOworICAgIEJPT1NUX0NIRUNLX0VRVUFMKGdfbnVtVHJpZ2dlcnNGaXJlZCwgKHVuc2lnbmVkIGludCkxKTsKKyAgICBCT09TVF9DSEVDS19FUVVBTChieXRlc19yZWFkLCAodWludDMyX3QpMik7CiAgIH0KIAogICBjbGVhcl90cmlnZ2VycygpOwpAQCAtNzY3LDcgKzc2NCw3IEBACiAgIHVpbnQzMl90IGJvcnJvd19sZW4gPSAxMDsKICAgY29uc3QgdWludDhfdCogYm9ycm93ZWRfYnVmID0gdHJhbnNwb3J0cy5pbi0+Ym9ycm93KE5VTEwsICZib3Jyb3dfbGVuKTsKICAgQk9PU1RfQ0hFQ0soYm9ycm93ZWRfYnVmID09IE5VTEwpOwotICBCT09TVF9DSEVDS19FUVVBTChnX251bVRyaWdnZXJzRmlyZWQsICh1bnNpZ25lZCBpbnQpIDApOworICBCT09TVF9DSEVDS19FUVVBTChnX251bVRyaWdnZXJzRmlyZWQsICh1bnNpZ25lZCBpbnQpMCk7CiAKICAgY2xlYXJfdHJpZ2dlcnMoKTsKIH0KQEAgLTc4Miw1MyArNzc5LDQ2IEBACiAgKiAtIENvbWJpbmluZyBtYW55IHRlc3RzIGludG8gYSBzaW5nbGUgZnVuY3Rpb24gbWFrZXMgaXQgbW9yZSBkaWZmaWN1bHQgdG8KICAqICAgdGVsbCBwcmVjaXNlbHkgd2hpY2ggdGVzdHMgZmFpbGVkLiAgSXQgYWxzbyBtZWFucyB5b3UgY2FuJ3QgZ2V0IGEgcHJvZ3Jlc3MKICAqICAgdXBkYXRlIGFmdGVyIGVhY2ggdGVzdCwgYW5kIHRoZSB0ZXN0cyBhcmUgYWxyZWFkeSBmYWlybHkgc2xvdy4KLSAqIC0gU2ltaWxhciByZWdpc3RyYXRpb24gY291bGQgYmUgYWNoZWl2ZWQgd2l0aCBCT09TVF9URVNUX0NBU0VfVEVNUExBVEUsCisgKiAtIFNpbWlsYXIgcmVnaXN0cmF0aW9uIGNvdWxkIGJlIGFjaGlldmVkIHdpdGggQk9PU1RfVEVTVF9DQVNFX1RFTVBMQVRFLAogICogICBidXQgaXQgcmVxdWlyZXMgYSBsb3Qgb2YgYXdrd2FyZCBNUEwgY29kZSwgYW5kIHJlc3VsdHMgaW4gdXNlbGVzcyB0ZXN0CiAgKiAgIGNhc2UgbmFtZXMuICAoVGhlIG5hbWVzIGFyZSBnZW5lcmF0ZWQgZnJvbSBzdGQ6OnR5cGVfaW5mbzo6bmFtZSgpLCB3aGljaAogICogICBpcyBjb21waWxlci1kZXBlbmRlbnQuICBnY2MgcmV0dXJucyBtYW5nbGVkIG5hbWVzLikKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2RlZmluZSBBRERfVEVTVF9SVyhDb3VwbGVkVHJhbnNwb3J0cywgdG90YWxTaXplLCAuLi4pIFwKLSAgICBhZGRUZXN0Ulc8IENvdXBsZWRUcmFuc3BvcnRzID4oQk9PU1RfU1RSSU5HSVpFKENvdXBsZWRUcmFuc3BvcnRzKSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFNpemUsICMjIF9fVkFfQVJHU19fKTsKKyNkZWZpbmUgQUREX1RFU1RfUlcoQ291cGxlZFRyYW5zcG9ydHMsIHRvdGFsU2l6ZSwgLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYWRkVGVzdFJXPENvdXBsZWRUcmFuc3BvcnRzPihCT09TVF9TVFJJTkdJWkUoQ291cGxlZFRyYW5zcG9ydHMpLCB0b3RhbFNpemUsICMjX19WQV9BUkdTX18pOwogCi0jZGVmaW5lIFRFU1RfUlcoQ291cGxlZFRyYW5zcG9ydHMsIHRvdGFsU2l6ZSwgLi4uKSBcCi0gIGRvIHsgXAotICAgIC8qIEFkZCB0aGUgdGVzdCBhcyBzcGVjaWZpZWQsIHRvIHRlc3QgdGhlIG5vbi12aXJ0dWFsIGZ1bmN0aW9uIGNhbGxzICovIFwKLSAgICBBRERfVEVTVF9SVyhDb3VwbGVkVHJhbnNwb3J0cywgdG90YWxTaXplLCAjIyBfX1ZBX0FSR1NfXyk7IFwKLSAgICAvKiBcCi0gICAgICogQWxzbyB0ZXN0IHVzaW5nIHRoZSB0cmFuc3BvcnQgYXMgYSBUVHJhbnNwb3J0KiwgdG8gdGVzdCBcCi0gICAgICogdGhlIHJlYWRfdmlydCgpL3dyaXRlX3ZpcnQoKSBjYWxscyBcCi0gICAgICovIFwKLSAgICBBRERfVEVTVF9SVyhDb3VwbGVkVFRyYW5zcG9ydHM8Q291cGxlZFRyYW5zcG9ydHM+LCBcCi0gICAgICAgICAgICAgICAgdG90YWxTaXplLCAjIyBfX1ZBX0FSR1NfXyk7IFwKLSAgICAvKiBUZXN0IHdyYXBwaW5nIHRoZSB0cmFuc3BvcnQgd2l0aCBUQnVmZmVyZWRUcmFuc3BvcnQgKi8gXAotICAgIEFERF9URVNUX1JXKENvdXBsZWRCdWZmZXJlZFRyYW5zcG9ydHNUPENvdXBsZWRUcmFuc3BvcnRzPiwgXAotICAgICAgICAgICAgICAgIHRvdGFsU2l6ZSwgIyMgX19WQV9BUkdTX18pOyBcCi0gICAgLyogVGVzdCB3cmFwcGluZyB0aGUgdHJhbnNwb3J0IHdpdGggVEZyYW1lZFRyYW5zcG9ydHMgKi8gXAotICAgIEFERF9URVNUX1JXKENvdXBsZWRGcmFtZWRUcmFuc3BvcnRzVDxDb3VwbGVkVHJhbnNwb3J0cz4sIFwKLSAgICAgICAgICAgICAgICB0b3RhbFNpemUsICMjIF9fVkFfQVJHU19fKTsgXAotICAgIC8qIFRlc3Qgd3JhcHBpbmcgdGhlIHRyYW5zcG9ydCB3aXRoIFRabGliVHJhbnNwb3J0ICovIFwKLSAgICBBRERfVEVTVF9SVyhDb3VwbGVkWmxpYlRyYW5zcG9ydHNUPENvdXBsZWRUcmFuc3BvcnRzPiwgXAotICAgICAgICAgICAgICAgIHRvdGFsU2l6ZSwgIyMgX19WQV9BUkdTX18pOyBcCisjZGVmaW5lIFRFU1RfUlcoQ291cGxlZFRyYW5zcG9ydHMsIHRvdGFsU2l6ZSwgLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogQWRkIHRoZSB0ZXN0IGFzIHNwZWNpZmllZCwgdG8gdGVzdCB0aGUgbm9uLXZpcnR1YWwgZnVuY3Rpb24gY2FsbHMgKi8gICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQUREX1RFU1RfUlcoQ291cGxlZFRyYW5zcG9ydHMsIHRvdGFsU2l6ZSwgIyNfX1ZBX0FSR1NfXyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICogQWxzbyB0ZXN0IHVzaW5nIHRoZSB0cmFuc3BvcnQgYXMgYSBUVHJhbnNwb3J0KiwgdG8gdGVzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICogdGhlIHJlYWRfdmlydCgpL3dyaXRlX3ZpcnQoKSBjYWxscyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQUREX1RFU1RfUlcoQ291cGxlZFRUcmFuc3BvcnRzPENvdXBsZWRUcmFuc3BvcnRzPiwgdG90YWxTaXplLCAjI19fVkFfQVJHU19fKTsgICAgICAgICAgICAgICAgICBcCisgICAgLyogVGVzdCB3cmFwcGluZyB0aGUgdHJhbnNwb3J0IHdpdGggVEJ1ZmZlcmVkVHJhbnNwb3J0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQUREX1RFU1RfUlcoQ291cGxlZEJ1ZmZlcmVkVHJhbnNwb3J0c1Q8Q291cGxlZFRyYW5zcG9ydHM+LCB0b3RhbFNpemUsICMjX19WQV9BUkdTX18pOyAgICAgICAgICBcCisgICAgLyogVGVzdCB3cmFwcGluZyB0aGUgdHJhbnNwb3J0IHdpdGggVEZyYW1lZFRyYW5zcG9ydHMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQUREX1RFU1RfUlcoQ291cGxlZEZyYW1lZFRyYW5zcG9ydHNUPENvdXBsZWRUcmFuc3BvcnRzPiwgdG90YWxTaXplLCAjI19fVkFfQVJHU19fKTsgICAgICAgICAgICBcCisgICAgLyogVGVzdCB3cmFwcGluZyB0aGUgdHJhbnNwb3J0IHdpdGggVFpsaWJUcmFuc3BvcnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQUREX1RFU1RfUlcoQ291cGxlZFpsaWJUcmFuc3BvcnRzVDxDb3VwbGVkVHJhbnNwb3J0cz4sIHRvdGFsU2l6ZSwgIyNfX1ZBX0FSR1NfXyk7ICAgICAgICAgICAgICBcCiAgIH0gd2hpbGUgKDApCiAKLSNkZWZpbmUgQUREX1RFU1RfQkxPQ0tJTkcoQ291cGxlZFRyYW5zcG9ydHMpIFwKLSAgICBhZGRUZXN0QmxvY2tpbmc8IENvdXBsZWRUcmFuc3BvcnRzID4oQk9PU1RfU1RSSU5HSVpFKENvdXBsZWRUcmFuc3BvcnRzKSk7CisjZGVmaW5lIEFERF9URVNUX0JMT0NLSU5HKENvdXBsZWRUcmFuc3BvcnRzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGFkZFRlc3RCbG9ja2luZzxDb3VwbGVkVHJhbnNwb3J0cz4oQk9PU1RfU1RSSU5HSVpFKENvdXBsZWRUcmFuc3BvcnRzKSk7CiAKLSNkZWZpbmUgVEVTVF9CTE9DS0lOR19CRUhBVklPUihDb3VwbGVkVHJhbnNwb3J0cykgXAotICBBRERfVEVTVF9CTE9DS0lORyhDb3VwbGVkVHJhbnNwb3J0cyk7IFwKLSAgQUREX1RFU1RfQkxPQ0tJTkcoQ291cGxlZFRUcmFuc3BvcnRzPENvdXBsZWRUcmFuc3BvcnRzPik7IFwKLSAgQUREX1RFU1RfQkxPQ0tJTkcoQ291cGxlZEJ1ZmZlcmVkVHJhbnNwb3J0c1Q8Q291cGxlZFRyYW5zcG9ydHM+KTsgXAotICBBRERfVEVTVF9CTE9DS0lORyhDb3VwbGVkRnJhbWVkVHJhbnNwb3J0c1Q8Q291cGxlZFRyYW5zcG9ydHM+KTsgXAorI2RlZmluZSBURVNUX0JMT0NLSU5HX0JFSEFWSU9SKENvdXBsZWRUcmFuc3BvcnRzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBBRERfVEVTVF9CTE9DS0lORyhDb3VwbGVkVHJhbnNwb3J0cyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBBRERfVEVTVF9CTE9DS0lORyhDb3VwbGVkVFRyYW5zcG9ydHM8Q291cGxlZFRyYW5zcG9ydHM+KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBBRERfVEVTVF9CTE9DS0lORyhDb3VwbGVkQnVmZmVyZWRUcmFuc3BvcnRzVDxDb3VwbGVkVHJhbnNwb3J0cz4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBBRERfVEVTVF9CTE9DS0lORyhDb3VwbGVkRnJhbWVkVHJhbnNwb3J0c1Q8Q291cGxlZFRyYW5zcG9ydHM+KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICBBRERfVEVTVF9CTE9DS0lORyhDb3VwbGVkWmxpYlRyYW5zcG9ydHNUPENvdXBsZWRUcmFuc3BvcnRzPik7CiAKIGNsYXNzIFRyYW5zcG9ydFRlc3RHZW4gewotIHB1YmxpYzoKLSAgVHJhbnNwb3J0VGVzdEdlbihib29zdDo6dW5pdF90ZXN0Ojp0ZXN0X3N1aXRlKiBzdWl0ZSwKLSAgICAgICAgICAgICAgICAgICBmbG9hdCBzaXplTXVsdGlwbGllcikgOgotICAgICAgc3VpdGVfKHN1aXRlKSwKLSAgICAgIHNpemVNdWx0aXBsaWVyXyhzaXplTXVsdGlwbGllcikge30KK3B1YmxpYzoKKyAgVHJhbnNwb3J0VGVzdEdlbihib29zdDo6dW5pdF90ZXN0Ojp0ZXN0X3N1aXRlKiBzdWl0ZSwgZmxvYXQgc2l6ZU11bHRpcGxpZXIpCisgICAgOiBzdWl0ZV8oc3VpdGUpLCBzaXplTXVsdGlwbGllcl8oc2l6ZU11bHRpcGxpZXIpIHt9CiAKICAgdm9pZCBnZW5lcmF0ZSgpIHsKICAgICBHZW5lcmljU2l6ZUdlbmVyYXRvciByYW5kNGsoMSwgNDA5Nik7CkBAIC04MzksMTUgKzgyOSwxNSBAQAogICAgICAqLwogCiAgICAgLy8gVE1lbW9yeUJ1ZmZlciB0ZXN0cwotICAgIFRFU1RfUlcoQ291cGxlZE1lbW9yeUJ1ZmZlcnMsIDEwMjQqMTAyNCwgMCwgMCk7Ci0gICAgVEVTVF9SVyhDb3VwbGVkTWVtb3J5QnVmZmVycywgMTAyNCoyNTYsIHJhbmQ0aywgcmFuZDRrKTsKLSAgICBURVNUX1JXKENvdXBsZWRNZW1vcnlCdWZmZXJzLCAxMDI0KjI1NiwgMTY3LCAxNjMpOwotICAgIFRFU1RfUlcoQ291cGxlZE1lbW9yeUJ1ZmZlcnMsIDEwMjQqMTYsIDEsIDEpOworICAgIFRFU1RfUlcoQ291cGxlZE1lbW9yeUJ1ZmZlcnMsIDEwMjQgKiAxMDI0LCAwLCAwKTsKKyAgICBURVNUX1JXKENvdXBsZWRNZW1vcnlCdWZmZXJzLCAxMDI0ICogMjU2LCByYW5kNGssIHJhbmQ0ayk7CisgICAgVEVTVF9SVyhDb3VwbGVkTWVtb3J5QnVmZmVycywgMTAyNCAqIDI1NiwgMTY3LCAxNjMpOworICAgIFRFU1RfUlcoQ291cGxlZE1lbW9yeUJ1ZmZlcnMsIDEwMjQgKiAxNiwgMSwgMSk7CiAKLSAgICBURVNUX1JXKENvdXBsZWRNZW1vcnlCdWZmZXJzLCAxMDI0KjI1NiwgMCwgMCwgcmFuZDRrLCByYW5kNGspOwotICAgIFRFU1RfUlcoQ291cGxlZE1lbW9yeUJ1ZmZlcnMsIDEwMjQqMjU2LCByYW5kNGssIHJhbmQ0aywgcmFuZDRrLCByYW5kNGspOwotICAgIFRFU1RfUlcoQ291cGxlZE1lbW9yeUJ1ZmZlcnMsIDEwMjQqMjU2LCAxNjcsIDE2MywgcmFuZDRrLCByYW5kNGspOwotICAgIFRFU1RfUlcoQ291cGxlZE1lbW9yeUJ1ZmZlcnMsIDEwMjQqMTYsIDEsIDEsIHJhbmQ0aywgcmFuZDRrKTsKKyAgICBURVNUX1JXKENvdXBsZWRNZW1vcnlCdWZmZXJzLCAxMDI0ICogMjU2LCAwLCAwLCByYW5kNGssIHJhbmQ0ayk7CisgICAgVEVTVF9SVyhDb3VwbGVkTWVtb3J5QnVmZmVycywgMTAyNCAqIDI1NiwgcmFuZDRrLCByYW5kNGssIHJhbmQ0aywgcmFuZDRrKTsKKyAgICBURVNUX1JXKENvdXBsZWRNZW1vcnlCdWZmZXJzLCAxMDI0ICogMjU2LCAxNjcsIDE2MywgcmFuZDRrLCByYW5kNGspOworICAgIFRFU1RfUlcoQ291cGxlZE1lbW9yeUJ1ZmZlcnMsIDEwMjQgKiAxNiwgMSwgMSwgcmFuZDRrLCByYW5kNGspOwogCiAgICAgVEVTVF9CTE9DS0lOR19CRUhBVklPUihDb3VwbGVkTWVtb3J5QnVmZmVycyk7CiAKQEAgLTg1Niw2OCArODQ2LDcwIEBACiAgICAgLy8gU2luY2UgQ291cGxlZEZEVHJhbnNwb3J0cyB0ZXN0cyB3aXRoIGEgcGlwZSwgd3JpdGVzIHdpbGwgYmxvY2sKICAgICAvLyBpZiB0aGVyZSBpcyB0b28gbXVjaCBvdXRzdGFuZGluZyB1bnJlYWQgZGF0YSBpbiB0aGUgcGlwZS4KICAgICB1aW50MzJfdCBmZF9tYXhfb3V0c3RhbmRpbmcgPSA0MDk2OwotICAgIFRFU1RfUlcoQ291cGxlZEZEVHJhbnNwb3J0cywgMTAyNCoxMDI0LCAwLCAwLAotICAgICAgICAgICAgMCwgMCwgZmRfbWF4X291dHN0YW5kaW5nKTsKLSAgICBURVNUX1JXKENvdXBsZWRGRFRyYW5zcG9ydHMsIDEwMjQqMjU2LCByYW5kNGssIHJhbmQ0aywKLSAgICAgICAgICAgIDAsIDAsIGZkX21heF9vdXRzdGFuZGluZyk7Ci0gICAgVEVTVF9SVyhDb3VwbGVkRkRUcmFuc3BvcnRzLCAxMDI0KjI1NiwgMTY3LCAxNjMsCi0gICAgICAgICAgICAwLCAwLCBmZF9tYXhfb3V0c3RhbmRpbmcpOwotICAgIFRFU1RfUlcoQ291cGxlZEZEVHJhbnNwb3J0cywgMTAyNCoxNiwgMSwgMSwKLSAgICAgICAgICAgIDAsIDAsIGZkX21heF9vdXRzdGFuZGluZyk7CisgICAgVEVTVF9SVyhDb3VwbGVkRkRUcmFuc3BvcnRzLCAxMDI0ICogMTAyNCwgMCwgMCwgMCwgMCwgZmRfbWF4X291dHN0YW5kaW5nKTsKKyAgICBURVNUX1JXKENvdXBsZWRGRFRyYW5zcG9ydHMsIDEwMjQgKiAyNTYsIHJhbmQ0aywgcmFuZDRrLCAwLCAwLCBmZF9tYXhfb3V0c3RhbmRpbmcpOworICAgIFRFU1RfUlcoQ291cGxlZEZEVHJhbnNwb3J0cywgMTAyNCAqIDI1NiwgMTY3LCAxNjMsIDAsIDAsIGZkX21heF9vdXRzdGFuZGluZyk7CisgICAgVEVTVF9SVyhDb3VwbGVkRkRUcmFuc3BvcnRzLCAxMDI0ICogMTYsIDEsIDEsIDAsIDAsIGZkX21heF9vdXRzdGFuZGluZyk7CiAKLSAgICBURVNUX1JXKENvdXBsZWRGRFRyYW5zcG9ydHMsIDEwMjQqMjU2LCAwLCAwLAotICAgICAgICAgICAgcmFuZDRrLCByYW5kNGssIGZkX21heF9vdXRzdGFuZGluZyk7Ci0gICAgVEVTVF9SVyhDb3VwbGVkRkRUcmFuc3BvcnRzLCAxMDI0KjI1NiwgcmFuZDRrLCByYW5kNGssCi0gICAgICAgICAgICByYW5kNGssIHJhbmQ0aywgZmRfbWF4X291dHN0YW5kaW5nKTsKLSAgICBURVNUX1JXKENvdXBsZWRGRFRyYW5zcG9ydHMsIDEwMjQqMjU2LCAxNjcsIDE2MywKLSAgICAgICAgICAgIHJhbmQ0aywgcmFuZDRrLCBmZF9tYXhfb3V0c3RhbmRpbmcpOwotICAgIFRFU1RfUlcoQ291cGxlZEZEVHJhbnNwb3J0cywgMTAyNCoxNiwgMSwgMSwKLSAgICAgICAgICAgIHJhbmQ0aywgcmFuZDRrLCBmZF9tYXhfb3V0c3RhbmRpbmcpOworICAgIFRFU1RfUlcoQ291cGxlZEZEVHJhbnNwb3J0cywgMTAyNCAqIDI1NiwgMCwgMCwgcmFuZDRrLCByYW5kNGssIGZkX21heF9vdXRzdGFuZGluZyk7CisgICAgVEVTVF9SVyhDb3VwbGVkRkRUcmFuc3BvcnRzLCAxMDI0ICogMjU2LCByYW5kNGssIHJhbmQ0aywgcmFuZDRrLCByYW5kNGssIGZkX21heF9vdXRzdGFuZGluZyk7CisgICAgVEVTVF9SVyhDb3VwbGVkRkRUcmFuc3BvcnRzLCAxMDI0ICogMjU2LCAxNjcsIDE2MywgcmFuZDRrLCByYW5kNGssIGZkX21heF9vdXRzdGFuZGluZyk7CisgICAgVEVTVF9SVyhDb3VwbGVkRkRUcmFuc3BvcnRzLCAxMDI0ICogMTYsIDEsIDEsIHJhbmQ0aywgcmFuZDRrLCBmZF9tYXhfb3V0c3RhbmRpbmcpOwogCiAgICAgVEVTVF9CTE9DS0lOR19CRUhBVklPUihDb3VwbGVkRkRUcmFuc3BvcnRzKTsKKyNlbHNlCisgICAgLy8gVFBpcGUgdGVzdHMgKFdJTjMyIG9ubHkpCisgICAgVEVTVF9SVyhDb3VwbGVkUGlwZVRyYW5zcG9ydHMsIDEwMjQgKiAxMDI0LCAwLCAwKTsKKyAgICBURVNUX1JXKENvdXBsZWRQaXBlVHJhbnNwb3J0cywgMTAyNCAqIDI1NiwgcmFuZDRrLCByYW5kNGspOworICAgIFRFU1RfUlcoQ291cGxlZFBpcGVUcmFuc3BvcnRzLCAxMDI0ICogMjU2LCAxNjcsIDE2Myk7CisgICAgVEVTVF9SVyhDb3VwbGVkUGlwZVRyYW5zcG9ydHMsIDEwMjQgKiAxNiwgMSwgMSk7CisKKyAgICBURVNUX1JXKENvdXBsZWRQaXBlVHJhbnNwb3J0cywgMTAyNCAqIDI1NiwgMCwgMCwgcmFuZDRrLCByYW5kNGspOworICAgIFRFU1RfUlcoQ291cGxlZFBpcGVUcmFuc3BvcnRzLCAxMDI0ICogMjU2LCByYW5kNGssIHJhbmQ0aywgcmFuZDRrLCByYW5kNGspOworICAgIFRFU1RfUlcoQ291cGxlZFBpcGVUcmFuc3BvcnRzLCAxMDI0ICogMjU2LCAxNjcsIDE2MywgcmFuZDRrLCByYW5kNGspOworICAgIFRFU1RfUlcoQ291cGxlZFBpcGVUcmFuc3BvcnRzLCAxMDI0ICogMTYsIDEsIDEsIHJhbmQ0aywgcmFuZDRrKTsKKworICAgIFRFU1RfQkxPQ0tJTkdfQkVIQVZJT1IoQ291cGxlZFBpcGVUcmFuc3BvcnRzKTsKICNlbmRpZiAvL19XSU4zMgogCiAgICAgLy8gVFNvY2tldCB0ZXN0cwogICAgIHVpbnQzMl90IHNvY2tldF9tYXhfb3V0c3RhbmRpbmcgPSA0MDk2OwotICAgIFRFU1RfUlcoQ291cGxlZFNvY2tldFRyYW5zcG9ydHMsIDEwMjQqMTAyNCwgMCwgMCwKLSAgICAgICAgICAgIDAsIDAsIHNvY2tldF9tYXhfb3V0c3RhbmRpbmcpOwotICAgIFRFU1RfUlcoQ291cGxlZFNvY2tldFRyYW5zcG9ydHMsIDEwMjQqMjU2LCByYW5kNGssIHJhbmQ0aywKLSAgICAgICAgICAgIDAsIDAsIHNvY2tldF9tYXhfb3V0c3RhbmRpbmcpOwotICAgIFRFU1RfUlcoQ291cGxlZFNvY2tldFRyYW5zcG9ydHMsIDEwMjQqMjU2LCAxNjcsIDE2MywKLSAgICAgICAgICAgIDAsIDAsIHNvY2tldF9tYXhfb3V0c3RhbmRpbmcpOworICAgIFRFU1RfUlcoQ291cGxlZFNvY2tldFRyYW5zcG9ydHMsIDEwMjQgKiAxMDI0LCAwLCAwLCAwLCAwLCBzb2NrZXRfbWF4X291dHN0YW5kaW5nKTsKKyAgICBURVNUX1JXKENvdXBsZWRTb2NrZXRUcmFuc3BvcnRzLCAxMDI0ICogMjU2LCByYW5kNGssIHJhbmQ0aywgMCwgMCwgc29ja2V0X21heF9vdXRzdGFuZGluZyk7CisgICAgVEVTVF9SVyhDb3VwbGVkU29ja2V0VHJhbnNwb3J0cywgMTAyNCAqIDI1NiwgMTY3LCAxNjMsIDAsIDAsIHNvY2tldF9tYXhfb3V0c3RhbmRpbmcpOwogICAgIC8vIERvaC4gIEFwcGFyZW50bHkgd3JpdGluZyB0byBhIHNvY2tldCBoYXMgc29tZSBhZGRpdGlvbmFsIG92ZXJoZWFkIGZvcgogICAgIC8vIGVhY2ggc2VuZCgpIGNhbGwuICBJZiB3ZSBoYXZlIG1vcmUgdGhhbiB+NDAwIG91dHN0YW5kaW5nIDEtYnl0ZSB3cml0ZQogICAgIC8vIHJlcXVlc3RzLCBhZGRpdGlvbmFsIHNlbmQoKSBjYWxscyBzdGFydCBibG9ja2luZy4KLSAgICBURVNUX1JXKENvdXBsZWRTb2NrZXRUcmFuc3BvcnRzLCAxMDI0KjE2LCAxLCAxLAotICAgICAgICAgICAgMCwgMCwgc29ja2V0X21heF9vdXRzdGFuZGluZyk7Ci0gICAgVEVTVF9SVyhDb3VwbGVkU29ja2V0VHJhbnNwb3J0cywgMTAyNCoyNTYsIDAsIDAsCi0gICAgICAgICAgICByYW5kNGssIHJhbmQ0aywgc29ja2V0X21heF9vdXRzdGFuZGluZyk7Ci0gICAgVEVTVF9SVyhDb3VwbGVkU29ja2V0VHJhbnNwb3J0cywgMTAyNCoyNTYsIHJhbmQ0aywgcmFuZDRrLAotICAgICAgICAgICAgcmFuZDRrLCByYW5kNGssIHNvY2tldF9tYXhfb3V0c3RhbmRpbmcpOwotICAgIFRFU1RfUlcoQ291cGxlZFNvY2tldFRyYW5zcG9ydHMsIDEwMjQqMjU2LCAxNjcsIDE2MywKLSAgICAgICAgICAgIHJhbmQ0aywgcmFuZDRrLCBzb2NrZXRfbWF4X291dHN0YW5kaW5nKTsKLSAgICBURVNUX1JXKENvdXBsZWRTb2NrZXRUcmFuc3BvcnRzLCAxMDI0KjE2LCAxLCAxLAotICAgICAgICAgICAgcmFuZDRrLCByYW5kNGssIHNvY2tldF9tYXhfb3V0c3RhbmRpbmcpOworICAgIFRFU1RfUlcoQ291cGxlZFNvY2tldFRyYW5zcG9ydHMsIDEwMjQgKiAxNiwgMSwgMSwgMCwgMCwgc29ja2V0X21heF9vdXRzdGFuZGluZyk7CisgICAgVEVTVF9SVyhDb3VwbGVkU29ja2V0VHJhbnNwb3J0cywgMTAyNCAqIDI1NiwgMCwgMCwgcmFuZDRrLCByYW5kNGssIHNvY2tldF9tYXhfb3V0c3RhbmRpbmcpOworICAgIFRFU1RfUlcoQ291cGxlZFNvY2tldFRyYW5zcG9ydHMsCisgICAgICAgICAgICAxMDI0ICogMjU2LAorICAgICAgICAgICAgcmFuZDRrLAorICAgICAgICAgICAgcmFuZDRrLAorICAgICAgICAgICAgcmFuZDRrLAorICAgICAgICAgICAgcmFuZDRrLAorICAgICAgICAgICAgc29ja2V0X21heF9vdXRzdGFuZGluZyk7CisgICAgVEVTVF9SVyhDb3VwbGVkU29ja2V0VHJhbnNwb3J0cywgMTAyNCAqIDI1NiwgMTY3LCAxNjMsIHJhbmQ0aywgcmFuZDRrLCBzb2NrZXRfbWF4X291dHN0YW5kaW5nKTsKKyAgICBURVNUX1JXKENvdXBsZWRTb2NrZXRUcmFuc3BvcnRzLCAxMDI0ICogMTYsIDEsIDEsIHJhbmQ0aywgcmFuZDRrLCBzb2NrZXRfbWF4X291dHN0YW5kaW5nKTsKIAogICAgIFRFU1RfQkxPQ0tJTkdfQkVIQVZJT1IoQ291cGxlZFNvY2tldFRyYW5zcG9ydHMpOwogCi0vL1RoZXNlIGNvdWxkIGJlIG1hZGUgdG8gd29yayBvbiBXaW5kb3dzLCBidXQgSSBkb24ndCBjYXJlIGVub3VnaCB0byBtYWtlIGl0IGhhcHBlbgorLy8gVGhlc2UgY291bGQgYmUgbWFkZSB0byB3b3JrIG9uIFdpbmRvd3MsIGJ1dCBJIGRvbid0IGNhcmUgZW5vdWdoIHRvIG1ha2UgaXQgaGFwcGVuCiAjaWZuZGVmIF9XSU4zMgogICAgIC8vIFRGaWxlVHJhbnNwb3J0IHRlc3RzCiAgICAgLy8gV2UgdXNlIHNtYWxsZXIgYnVmZmVyIHNpemVzIGhlcmUsIHNpbmNlIFRGaWxlVHJhbnNwb3J0IGlzIGZhaXJseSBzbG93LgogICAgIC8vCiAgICAgLy8gVEZpbGVUcmFuc3BvcnQgY2FuJ3Qgd3JpdGUgbW9yZSB0aGFuIDE2TUIgYXQgb25jZQotICAgIHVpbnQzMl90IG1heF93cml0ZV9hdF9vbmNlID0gMTAyNCoxMDI0KjE2IC0gNDsKLSAgICBURVNUX1JXKENvdXBsZWRGaWxlVHJhbnNwb3J0cywgMTAyNCoxMDI0LCBtYXhfd3JpdGVfYXRfb25jZSwgMCk7Ci0gICAgVEVTVF9SVyhDb3VwbGVkRmlsZVRyYW5zcG9ydHMsIDEwMjQqMTI4LCByYW5kNGssIHJhbmQ0ayk7Ci0gICAgVEVTVF9SVyhDb3VwbGVkRmlsZVRyYW5zcG9ydHMsIDEwMjQqMTI4LCAxNjcsIDE2Myk7Ci0gICAgVEVTVF9SVyhDb3VwbGVkRmlsZVRyYW5zcG9ydHMsIDEwMjQqMiwgMSwgMSk7CisgICAgdWludDMyX3QgbWF4X3dyaXRlX2F0X29uY2UgPSAxMDI0ICogMTAyNCAqIDE2IC0gNDsKKyAgICBURVNUX1JXKENvdXBsZWRGaWxlVHJhbnNwb3J0cywgMTAyNCAqIDEwMjQsIG1heF93cml0ZV9hdF9vbmNlLCAwKTsKKyAgICBURVNUX1JXKENvdXBsZWRGaWxlVHJhbnNwb3J0cywgMTAyNCAqIDEyOCwgcmFuZDRrLCByYW5kNGspOworICAgIFRFU1RfUlcoQ291cGxlZEZpbGVUcmFuc3BvcnRzLCAxMDI0ICogMTI4LCAxNjcsIDE2Myk7CisgICAgVEVTVF9SVyhDb3VwbGVkRmlsZVRyYW5zcG9ydHMsIDEwMjQgKiAyLCAxLCAxKTsKIAotICAgIFRFU1RfUlcoQ291cGxlZEZpbGVUcmFuc3BvcnRzLCAxMDI0KjY0LCAwLCAwLCByYW5kNGssIHJhbmQ0ayk7Ci0gICAgVEVTVF9SVyhDb3VwbGVkRmlsZVRyYW5zcG9ydHMsIDEwMjQqNjQsCi0gICAgICAgICAgICByYW5kNGssIHJhbmQ0aywgcmFuZDRrLCByYW5kNGspOwotICAgIFRFU1RfUlcoQ291cGxlZEZpbGVUcmFuc3BvcnRzLCAxMDI0KjY0LCAxNjcsIDE2MywgcmFuZDRrLCByYW5kNGspOwotICAgIFRFU1RfUlcoQ291cGxlZEZpbGVUcmFuc3BvcnRzLCAxMDI0KjIsIDEsIDEsIHJhbmQ0aywgcmFuZDRrKTsKKyAgICBURVNUX1JXKENvdXBsZWRGaWxlVHJhbnNwb3J0cywgMTAyNCAqIDY0LCAwLCAwLCByYW5kNGssIHJhbmQ0ayk7CisgICAgVEVTVF9SVyhDb3VwbGVkRmlsZVRyYW5zcG9ydHMsIDEwMjQgKiA2NCwgcmFuZDRrLCByYW5kNGssIHJhbmQ0aywgcmFuZDRrKTsKKyAgICBURVNUX1JXKENvdXBsZWRGaWxlVHJhbnNwb3J0cywgMTAyNCAqIDY0LCAxNjcsIDE2MywgcmFuZDRrLCByYW5kNGspOworICAgIFRFU1RfUlcoQ291cGxlZEZpbGVUcmFuc3BvcnRzLCAxMDI0ICogMiwgMSwgMSwgcmFuZDRrLCByYW5kNGspOwogCiAgICAgVEVTVF9CTE9DS0lOR19CRUhBVklPUihDb3VwbGVkRmlsZVRyYW5zcG9ydHMpOwogI2VuZGlmCkBAIC05MjUsMjMgKzkxNyw1MSBAQAogICAgIC8vIEFkZCBzb21lIHRlc3RzIHRoYXQgYWNjZXNzIFRCdWZmZXJlZFRyYW5zcG9ydCBhbmQgVEZyYW1lZFRyYW5zcG9ydAogICAgIC8vIHZpYSBUVHJhbnNwb3J0IHBvaW50ZXJzIGFuZCBUQnVmZmVyQmFzZSBwb2ludGVycy4KICAgICBBRERfVEVTVF9SVyhDb3VwbGVkVFRyYW5zcG9ydHM8Q291cGxlZEJ1ZmZlcmVkVHJhbnNwb3J0cz4sCi0gICAgICAgICAgICAgICAgMTAyNCoxMDI0LCByYW5kNGssIHJhbmQ0aywgcmFuZDRrLCByYW5kNGspOworICAgICAgICAgICAgICAgIDEwMjQgKiAxMDI0LAorICAgICAgICAgICAgICAgIHJhbmQ0aywKKyAgICAgICAgICAgICAgICByYW5kNGssCisgICAgICAgICAgICAgICAgcmFuZDRrLAorICAgICAgICAgICAgICAgIHJhbmQ0ayk7CiAgICAgQUREX1RFU1RfUlcoQ291cGxlZEJ1ZmZlckJhc2VzPENvdXBsZWRCdWZmZXJlZFRyYW5zcG9ydHM+LAotICAgICAgICAgICAgICAgIDEwMjQqMTAyNCwgcmFuZDRrLCByYW5kNGssIHJhbmQ0aywgcmFuZDRrKTsKKyAgICAgICAgICAgICAgICAxMDI0ICogMTAyNCwKKyAgICAgICAgICAgICAgICByYW5kNGssCisgICAgICAgICAgICAgICAgcmFuZDRrLAorICAgICAgICAgICAgICAgIHJhbmQ0aywKKyAgICAgICAgICAgICAgICByYW5kNGspOwogICAgIEFERF9URVNUX1JXKENvdXBsZWRUVHJhbnNwb3J0czxDb3VwbGVkRnJhbWVkVHJhbnNwb3J0cz4sCi0gICAgICAgICAgICAgICAgMTAyNCoxMDI0LCByYW5kNGssIHJhbmQ0aywgcmFuZDRrLCByYW5kNGspOworICAgICAgICAgICAgICAgIDEwMjQgKiAxMDI0LAorICAgICAgICAgICAgICAgIHJhbmQ0aywKKyAgICAgICAgICAgICAgICByYW5kNGssCisgICAgICAgICAgICAgICAgcmFuZDRrLAorICAgICAgICAgICAgICAgIHJhbmQ0ayk7CiAgICAgQUREX1RFU1RfUlcoQ291cGxlZEJ1ZmZlckJhc2VzPENvdXBsZWRGcmFtZWRUcmFuc3BvcnRzPiwKLSAgICAgICAgICAgICAgICAxMDI0KjEwMjQsIHJhbmQ0aywgcmFuZDRrLCByYW5kNGssIHJhbmQ0ayk7CisgICAgICAgICAgICAgICAgMTAyNCAqIDEwMjQsCisgICAgICAgICAgICAgICAgcmFuZDRrLAorICAgICAgICAgICAgICAgIHJhbmQ0aywKKyAgICAgICAgICAgICAgICByYW5kNGssCisgICAgICAgICAgICAgICAgcmFuZDRrKTsKIAogICAgIC8vIFRlc3QgdXNpbmcgVFpsaWJUcmFuc3BvcnQgdmlhIGEgVFRyYW5zcG9ydCBwb2ludGVyCiAgICAgQUREX1RFU1RfUlcoQ291cGxlZFRUcmFuc3BvcnRzPENvdXBsZWRabGliVHJhbnNwb3J0cz4sCi0gICAgICAgICAgICAgICAgMTAyNCoxMDI0LCByYW5kNGssIHJhbmQ0aywgcmFuZDRrLCByYW5kNGspOworICAgICAgICAgICAgICAgIDEwMjQgKiAxMDI0LAorICAgICAgICAgICAgICAgIHJhbmQ0aywKKyAgICAgICAgICAgICAgICByYW5kNGssCisgICAgICAgICAgICAgICAgcmFuZDRrLAorICAgICAgICAgICAgICAgIHJhbmQ0ayk7CiAgIH0KIAotIHByaXZhdGU6CisjaWYgKEJPT1NUX1ZFUlNJT04gPj0gMTA1OTAwKQorI2RlZmluZSBNQUtFX1RFU1RfQ0FTRShfRlVOQywgX05BTUUpIGJvb3N0Ojp1bml0X3Rlc3Q6Om1ha2VfdGVzdF9jYXNlKF9GVU5DLCBfTkFNRSwgX19GSUxFX18sIF9fTElORV9fKQorI2Vsc2UKKyNkZWZpbmUgTUFLRV9URVNUX0NBU0UoX0ZVTkMsIF9OQU1FKSBib29zdDo6dW5pdF90ZXN0OjptYWtlX3Rlc3RfY2FzZShfRlVOQywgX05BTUUpCisjZW5kaWYKKworcHJpdmF0ZToKICAgdGVtcGxhdGUgPGNsYXNzIENvdXBsZWRUcmFuc3BvcnRzPgotICB2b2lkIGFkZFRlc3RSVyhjb25zdCBjaGFyKiB0cmFuc3BvcnRfbmFtZSwgdWludDMyX3QgdG90YWxTaXplLAotICAgICAgICAgICAgICAgICBHZW5lcmljU2l6ZUdlbmVyYXRvciB3U2l6ZUdlbiwgR2VuZXJpY1NpemVHZW5lcmF0b3IgclNpemVHZW4sCisgIHZvaWQgYWRkVGVzdFJXKGNvbnN0IGNoYXIqIHRyYW5zcG9ydF9uYW1lLAorICAgICAgICAgICAgICAgICB1aW50MzJfdCB0b3RhbFNpemUsCisgICAgICAgICAgICAgICAgIEdlbmVyaWNTaXplR2VuZXJhdG9yIHdTaXplR2VuLAorICAgICAgICAgICAgICAgICBHZW5lcmljU2l6ZUdlbmVyYXRvciByU2l6ZUdlbiwKICAgICAgICAgICAgICAgICAgR2VuZXJpY1NpemVHZW5lcmF0b3Igd0NodW5rU2l6ZUdlbiA9IDAsCiAgICAgICAgICAgICAgICAgIEdlbmVyaWNTaXplR2VuZXJhdG9yIHJDaHVua1NpemVHZW4gPSAwLAogICAgICAgICAgICAgICAgICB1aW50MzJfdCBtYXhPdXRzdGFuZGluZyA9IDAsCkBAIC05NTAsNjEgKzk3MCw0NiBAQAogICAgIHRvdGFsU2l6ZSA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pih0b3RhbFNpemUgKiBzaXplTXVsdGlwbGllcl8pOwogCiAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG5hbWU7Ci0gICAgbmFtZSA8PCB0cmFuc3BvcnRfbmFtZSA8PCAiOjp0ZXN0X3J3KCIgPDwgdG90YWxTaXplIDw8ICIsICIgPDwKLSAgICAgIHdTaXplR2VuLmRlc2NyaWJlKCkgPDwgIiwgIiA8PCByU2l6ZUdlbi5kZXNjcmliZSgpIDw8ICIsICIgPDwKLSAgICAgIHdDaHVua1NpemVHZW4uZGVzY3JpYmUoKSA8PCAiLCAiIDw8IHJDaHVua1NpemVHZW4uZGVzY3JpYmUoKSA8PCAiLCAiIDw8Ci0gICAgICBtYXhPdXRzdGFuZGluZyA8PCAiKSI7CisgICAgbmFtZSA8PCB0cmFuc3BvcnRfbmFtZSA8PCAiOjp0ZXN0X3J3KCIgPDwgdG90YWxTaXplIDw8ICIsICIgPDwgd1NpemVHZW4uZGVzY3JpYmUoKSA8PCAiLCAiCisgICAgICAgICA8PCByU2l6ZUdlbi5kZXNjcmliZSgpIDw8ICIsICIgPDwgd0NodW5rU2l6ZUdlbi5kZXNjcmliZSgpIDw8ICIsICIKKyAgICAgICAgIDw8IHJDaHVua1NpemVHZW4uZGVzY3JpYmUoKSA8PCAiLCAiIDw8IG1heE91dHN0YW5kaW5nIDw8ICIpIjsKIAotICAgIGJvb3N0Ojp1bml0X3Rlc3Q6OmNhbGxiYWNrMDw+IHRlc3RfZnVuYyA9Ci0gICAgICBhcGFjaGU6OnRocmlmdDo6c3RkY3h4OjpiaW5kKHRlc3Rfcnc8Q291cGxlZFRyYW5zcG9ydHM+LCB0b3RhbFNpemUsCi0gICAgICAgICAgICAgICAgICAgICB3U2l6ZUdlbiwgclNpemVHZW4sIHdDaHVua1NpemVHZW4sIHJDaHVua1NpemVHZW4sCi0gICAgICAgICAgICAgICAgICAgICBtYXhPdXRzdGFuZGluZyk7Ci0gICAgYm9vc3Q6OnVuaXRfdGVzdDo6dGVzdF9jYXNlKiB0YyA9Ci0gICAgICBib29zdDo6dW5pdF90ZXN0OjptYWtlX3Rlc3RfY2FzZSh0ZXN0X2Z1bmMsIG5hbWUuc3RyKCkpOwotICAgIHN1aXRlXy0+YWRkKHRjLCBleHBlY3RlZEZhaWx1cmVzKTsKKyNpZiAoQk9PU1RfVkVSU0lPTiA+PSAxMDU5MDApCisgICAgc3RkOjpmdW5jdGlvbjx2b2lkICgpPiB0ZXN0X2Z1bmMKKyNlbHNlCisgICAgYm9vc3Q6OnVuaXRfdGVzdDo6Y2FsbGJhY2swPD4gdGVzdF9mdW5jCisjZW5kaWYKKyAgICAgICAgPSBzdGQ6OmJpbmQodGVzdF9ydzxDb3VwbGVkVHJhbnNwb3J0cz4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3U2l6ZUdlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJTaXplR2VuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd0NodW5rU2l6ZUdlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJDaHVua1NpemVHZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPdXRzdGFuZGluZyk7CisgICAgc3VpdGVfLT5hZGQoTUFLRV9URVNUX0NBU0UodGVzdF9mdW5jLCBuYW1lLnN0cigpKSwgZXhwZWN0ZWRGYWlsdXJlcyk7CiAgIH0KIAogICB0ZW1wbGF0ZSA8Y2xhc3MgQ291cGxlZFRyYW5zcG9ydHM+Ci0gIHZvaWQgYWRkVGVzdEJsb2NraW5nKGNvbnN0IGNoYXIqIHRyYW5zcG9ydE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGV4cGVjdGVkRmFpbHVyZXMgPSAwKSB7CisgIHZvaWQgYWRkVGVzdEJsb2NraW5nKGNvbnN0IGNoYXIqIHRyYW5zcG9ydE5hbWUsIHVpbnQzMl90IGV4cGVjdGVkRmFpbHVyZXMgPSAwKSB7CiAgICAgY2hhciBuYW1lWzEwMjRdOwotICAgIGJvb3N0Ojp1bml0X3Rlc3Q6OnRlc3RfY2FzZSogdGM7CiAKLSAgICBUSFJJRlRfU05QUklOVEYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiJXM6OnRlc3RfcmVhZF9wYXJ0X2F2YWlsYWJsZSgpIiwKLSAgICAgICAgICAgICB0cmFuc3BvcnROYW1lKTsKLSAgICB0YyA9IGJvb3N0Ojp1bml0X3Rlc3Q6Om1ha2VfdGVzdF9jYXNlKAotICAgICAgICAgIHRlc3RfcmVhZF9wYXJ0X2F2YWlsYWJsZTxDb3VwbGVkVHJhbnNwb3J0cz4sIG5hbWUpOwotICAgIHN1aXRlXy0+YWRkKHRjLCBleHBlY3RlZEZhaWx1cmVzKTsKKyAgICBUSFJJRlRfU05QUklOVEYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiJXM6OnRlc3RfcmVhZF9wYXJ0X2F2YWlsYWJsZSgpIiwgdHJhbnNwb3J0TmFtZSk7CisgICAgc3VpdGVfLT5hZGQoTUFLRV9URVNUX0NBU0UodGVzdF9yZWFkX3BhcnRfYXZhaWxhYmxlPENvdXBsZWRUcmFuc3BvcnRzPiwgbmFtZSksIGV4cGVjdGVkRmFpbHVyZXMpOwogCi0gICAgVEhSSUZUX1NOUFJJTlRGKG5hbWUsIHNpemVvZihuYW1lKSwgIiVzOjp0ZXN0X3JlYWRfcGFydF9hdmFpbGFibGVfaW5fY2h1bmtzKCkiLAotICAgICAgICAgICAgIHRyYW5zcG9ydE5hbWUpOwotICAgIHRjID0gYm9vc3Q6OnVuaXRfdGVzdDo6bWFrZV90ZXN0X2Nhc2UoCi0gICAgICAgICAgdGVzdF9yZWFkX3BhcnRfYXZhaWxhYmxlX2luX2NodW5rczxDb3VwbGVkVHJhbnNwb3J0cz4sIG5hbWUpOwotICAgIHN1aXRlXy0+YWRkKHRjLCBleHBlY3RlZEZhaWx1cmVzKTsKKyAgICBUSFJJRlRfU05QUklOVEYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiJXM6OnRlc3RfcmVhZF9wYXJ0X2F2YWlsYWJsZV9pbl9jaHVua3MoKSIsIHRyYW5zcG9ydE5hbWUpOworICAgIHN1aXRlXy0+YWRkKE1BS0VfVEVTVF9DQVNFKHRlc3RfcmVhZF9wYXJ0X2F2YWlsYWJsZV9pbl9jaHVua3M8Q291cGxlZFRyYW5zcG9ydHM+LCBuYW1lKSwgZXhwZWN0ZWRGYWlsdXJlcyk7CiAKLSAgICBUSFJJRlRfU05QUklOVEYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiJXM6OnRlc3RfcmVhZF9wYXJ0aWFsX21pZGZyYW1lKCkiLAotICAgICAgICAgICAgIHRyYW5zcG9ydE5hbWUpOwotICAgIHRjID0gYm9vc3Q6OnVuaXRfdGVzdDo6bWFrZV90ZXN0X2Nhc2UoCi0gICAgICAgICAgdGVzdF9yZWFkX3BhcnRpYWxfbWlkZnJhbWU8Q291cGxlZFRyYW5zcG9ydHM+LCBuYW1lKTsKLSAgICBzdWl0ZV8tPmFkZCh0YywgZXhwZWN0ZWRGYWlsdXJlcyk7CisgICAgVEhSSUZUX1NOUFJJTlRGKG5hbWUsIHNpemVvZihuYW1lKSwgIiVzOjp0ZXN0X3JlYWRfcGFydGlhbF9taWRmcmFtZSgpIiwgdHJhbnNwb3J0TmFtZSk7CisgICAgc3VpdGVfLT5hZGQoTUFLRV9URVNUX0NBU0UodGVzdF9yZWFkX3BhcnRpYWxfbWlkZnJhbWU8Q291cGxlZFRyYW5zcG9ydHM+LCBuYW1lKSwgZXhwZWN0ZWRGYWlsdXJlcyk7CiAKLSAgICBUSFJJRlRfU05QUklOVEYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiJXM6OnRlc3RfcmVhZF9ub25lX2F2YWlsYWJsZSgpIiwKLSAgICAgICAgICAgICB0cmFuc3BvcnROYW1lKTsKLSAgICB0YyA9IGJvb3N0Ojp1bml0X3Rlc3Q6Om1ha2VfdGVzdF9jYXNlKAotICAgICAgICAgIHRlc3RfcmVhZF9ub25lX2F2YWlsYWJsZTxDb3VwbGVkVHJhbnNwb3J0cz4sIG5hbWUpOwotICAgIHN1aXRlXy0+YWRkKHRjLCBleHBlY3RlZEZhaWx1cmVzKTsKKyAgICBUSFJJRlRfU05QUklOVEYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiJXM6OnRlc3RfcmVhZF9ub25lX2F2YWlsYWJsZSgpIiwgdHJhbnNwb3J0TmFtZSk7CisgICAgc3VpdGVfLT5hZGQoTUFLRV9URVNUX0NBU0UodGVzdF9yZWFkX25vbmVfYXZhaWxhYmxlPENvdXBsZWRUcmFuc3BvcnRzPiwgbmFtZSksIGV4cGVjdGVkRmFpbHVyZXMpOwogCi0gICAgVEhSSUZUX1NOUFJJTlRGKG5hbWUsIHNpemVvZihuYW1lKSwgIiVzOjp0ZXN0X2JvcnJvd19wYXJ0X2F2YWlsYWJsZSgpIiwKLSAgICAgICAgICAgICB0cmFuc3BvcnROYW1lKTsKLSAgICB0YyA9IGJvb3N0Ojp1bml0X3Rlc3Q6Om1ha2VfdGVzdF9jYXNlKAotICAgICAgICAgIHRlc3RfYm9ycm93X3BhcnRfYXZhaWxhYmxlPENvdXBsZWRUcmFuc3BvcnRzPiwgbmFtZSk7Ci0gICAgc3VpdGVfLT5hZGQodGMsIGV4cGVjdGVkRmFpbHVyZXMpOworICAgIFRIUklGVF9TTlBSSU5URihuYW1lLCBzaXplb2YobmFtZSksICIlczo6dGVzdF9ib3Jyb3dfcGFydF9hdmFpbGFibGUoKSIsIHRyYW5zcG9ydE5hbWUpOworICAgIHN1aXRlXy0+YWRkKE1BS0VfVEVTVF9DQVNFKHRlc3RfYm9ycm93X3BhcnRfYXZhaWxhYmxlPENvdXBsZWRUcmFuc3BvcnRzPiwgbmFtZSksIGV4cGVjdGVkRmFpbHVyZXMpOwogCi0gICAgVEhSSUZUX1NOUFJJTlRGKG5hbWUsIHNpemVvZihuYW1lKSwgIiVzOjp0ZXN0X2JvcnJvd19ub25lX2F2YWlsYWJsZSgpIiwKLSAgICAgICAgICAgICB0cmFuc3BvcnROYW1lKTsKLSAgICB0YyA9IGJvb3N0Ojp1bml0X3Rlc3Q6Om1ha2VfdGVzdF9jYXNlKAotICAgICAgICAgIHRlc3RfYm9ycm93X25vbmVfYXZhaWxhYmxlPENvdXBsZWRUcmFuc3BvcnRzPiwgbmFtZSk7Ci0gICAgc3VpdGVfLT5hZGQodGMsIGV4cGVjdGVkRmFpbHVyZXMpOworICAgIFRIUklGVF9TTlBSSU5URihuYW1lLCBzaXplb2YobmFtZSksICIlczo6dGVzdF9ib3Jyb3dfbm9uZV9hdmFpbGFibGUoKSIsIHRyYW5zcG9ydE5hbWUpOworICAgIHN1aXRlXy0+YWRkKE1BS0VfVEVTVF9DQVNFKHRlc3RfYm9ycm93X25vbmVfYXZhaWxhYmxlPENvdXBsZWRUcmFuc3BvcnRzPiwgbmFtZSksIGV4cGVjdGVkRmFpbHVyZXMpOwogICB9CiAKICAgYm9vc3Q6OnVuaXRfdGVzdDo6dGVzdF9zdWl0ZSogc3VpdGVfOwpAQCAtMTAyMCwxNyArMTAyNSwxNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdHJ1Y3QgZ2xvYmFsX2ZpeHR1cmUgewotICBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZD4gYWxhcm1UaHJlYWRfOworICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWQ+IGFsYXJtVGhyZWFkXzsKICAgZ2xvYmFsX2ZpeHR1cmUoKSB7Ci0gICNpZiBfV0lOMzIKKyNpZiBfV0lOMzIKICAgICBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUV2luc29ja1NpbmdsZXRvbjo6Y3JlYXRlKCk7Ci0gICNlbmRpZgorI2VuZGlmCiAKICAgICBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlBsYXRmb3JtVGhyZWFkRmFjdG9yeSBmYWN0b3J5OwogICAgIGZhY3Rvcnkuc2V0RGV0YWNoZWQoZmFsc2UpOwogCiAgICAgYWxhcm1UaHJlYWRfID0gZmFjdG9yeS5uZXdUaHJlYWQoCi0gICAgICBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OkZ1bmN0aW9uUnVubmVyOjpjcmVhdGUoYWxhcm1faGFuZGxlcl93cmFwcGVyKSk7CisgICAgICAgIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6RnVuY3Rpb25SdW5uZXI6OmNyZWF0ZShhbGFybV9oYW5kbGVyX3dyYXBwZXIpKTsKICAgICBhbGFybVRocmVhZF8tPnN0YXJ0KCk7CiAgIH0KICAgfmdsb2JhbF9maXh0dXJlKCkgewpAQCAtMTA0MywxOSArMTA0OCw0NCBAQAogICB9CiB9OwogCisjaWYgKEJPT1NUX1ZFUlNJT04gPj0gMTA1OTAwKQorQk9PU1RfR0xPQkFMX0ZJWFRVUkUoZ2xvYmFsX2ZpeHR1cmUpOworI2Vsc2UKIEJPT1NUX0dMT0JBTF9GSVhUVVJFKGdsb2JhbF9maXh0dXJlKQorI2VuZGlmCiAKLWJvb3N0Ojp1bml0X3Rlc3Q6OnRlc3Rfc3VpdGUqIGluaXRfdW5pdF90ZXN0X3N1aXRlKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKKyNpZmRlZiBCT09TVF9URVNUX0RZTl9MSU5LCitib29sIGluaXRfdW5pdF90ZXN0X3N1aXRlKCkgewogICBzdHJ1Y3QgdGltZXZhbCB0djsKICAgVEhSSUZUX0dFVFRJTUVPRkRBWSgmdHYsIE5VTEwpOwogICBpbnQgc2VlZCA9IHR2LnR2X3NlYyBeIHR2LnR2X3VzZWM7CiAKICAgaW5pdHJhbmQoc2VlZCk7CiAKLSAgYm9vc3Q6OnVuaXRfdGVzdDo6dGVzdF9zdWl0ZSogc3VpdGUgPQotICAgICZib29zdDo6dW5pdF90ZXN0OjpmcmFtZXdvcms6Om1hc3Rlcl90ZXN0X3N1aXRlKCk7CisgIGJvb3N0Ojp1bml0X3Rlc3Q6OnRlc3Rfc3VpdGUqIHN1aXRlID0gJmJvb3N0Ojp1bml0X3Rlc3Q6OmZyYW1ld29yazo6bWFzdGVyX3Rlc3Rfc3VpdGUoKTsKKyAgc3VpdGUtPnBfbmFtZS52YWx1ZSA9ICJUcmFuc3BvcnRUZXN0IjsKKyAgVHJhbnNwb3J0VGVzdEdlbiB0cmFuc3BvcnRfdGVzdF9nZW5lcmF0b3Ioc3VpdGUsIDEpOworICB0cmFuc3BvcnRfdGVzdF9nZW5lcmF0b3IuZ2VuZXJhdGUoKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2ludCBtYWluKCBpbnQgYXJnYywgY2hhciogYXJndltdICkgeworICByZXR1cm4gOjpib29zdDo6dW5pdF90ZXN0Ojp1bml0X3Rlc3RfbWFpbigmaW5pdF91bml0X3Rlc3Rfc3VpdGUsYXJnYyxhcmd2KTsKK30KKyNlbHNlCitib29zdDo6dW5pdF90ZXN0Ojp0ZXN0X3N1aXRlKiBpbml0X3VuaXRfdGVzdF9zdWl0ZShpbnQgYXJnYywgY2hhciogYXJndltdKSB7CisgIFRIUklGVF9VTlVTRURfVkFSSUFCTEUoYXJnYyk7CisgIFRIUklGVF9VTlVTRURfVkFSSUFCTEUoYXJndik7CisgIHN0cnVjdCB0aW1ldmFsIHR2OworICBUSFJJRlRfR0VUVElNRU9GREFZKCZ0diwgTlVMTCk7CisgIGludCBzZWVkID0gdHYudHZfc2VjIF4gdHYudHZfdXNlYzsKKworICBpbml0cmFuZChzZWVkKTsKKworICBib29zdDo6dW5pdF90ZXN0Ojp0ZXN0X3N1aXRlKiBzdWl0ZSA9ICZib29zdDo6dW5pdF90ZXN0OjpmcmFtZXdvcms6Om1hc3Rlcl90ZXN0X3N1aXRlKCk7CiAgIHN1aXRlLT5wX25hbWUudmFsdWUgPSAiVHJhbnNwb3J0VGVzdCI7CiAgIFRyYW5zcG9ydFRlc3RHZW4gdHJhbnNwb3J0X3Rlc3RfZ2VuZXJhdG9yKHN1aXRlLCAxKTsKICAgdHJhbnNwb3J0X3Rlc3RfZ2VuZXJhdG9yLmdlbmVyYXRlKCk7CiAgIHJldHVybiBOVUxMOwogfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvVHlwZWRlZlRlc3QuY3BwIGIvbGliL2NwcC90ZXN0L1R5cGVkZWZUZXN0LmNwcAppbmRleCA0NWViMWU3Li4yNGU5MjY1IDEwMDY0NAotLS0gYS9saWIvY3BwL3Rlc3QvVHlwZWRlZlRlc3QuY3BwCisrKyBiL2xpYi9jcHAvdGVzdC9UeXBlZGVmVGVzdC5jcHAKQEAgLTIyLDYgKzIyLDcgQEAKIAogI2luY2x1ZGUgImdlbi1jcHAvVHlwZWRlZlRlc3RfdHlwZXMuaCIKIAotQk9PU1RfU1RBVElDX0FTU0VSVChib29zdDo6aXNfc2FtZTxpbnQzMl90LCB0aHJpZnQ6OnRlc3Q6Ok15SW50MzI+Ojp2YWx1ZSk7Ci1CT09TVF9TVEFUSUNfQVNTRVJUKGJvb3N0Ojppc19zYW1lPHN0ZDo6c3RyaW5nLCB0aHJpZnQ6OnRlc3Q6Ok15U3RyaW5nPjo6dmFsdWUpOwotQk9PU1RfU1RBVElDX0FTU0VSVChib29zdDo6aXNfc2FtZTx0aHJpZnQ6OnRlc3Q6OlR5cGVkZWZUZXN0U3RydWN0LCB0aHJpZnQ6OnRlc3Q6Ok15U3RydWN0Pjo6dmFsdWUpOworQk9PU1RfU1RBVElDX0FTU0VSVCgoYm9vc3Q6OmlzX3NhbWU8aW50MzJfdCwgdGhyaWZ0Ojp0ZXN0OjpNeUludDMyPjo6dmFsdWUpKTsKK0JPT1NUX1NUQVRJQ19BU1NFUlQoKGJvb3N0Ojppc19zYW1lPHN0ZDo6c3RyaW5nLCB0aHJpZnQ6OnRlc3Q6Ok15U3RyaW5nPjo6dmFsdWUpKTsKK0JPT1NUX1NUQVRJQ19BU1NFUlQoCisgICAgKGJvb3N0Ojppc19zYW1lPHRocmlmdDo6dGVzdDo6VHlwZWRlZlRlc3RTdHJ1Y3QsIHRocmlmdDo6dGVzdDo6TXlTdHJ1Y3Q+Ojp2YWx1ZSkpOwpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L1psaWJUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9abGliVGVzdC5jcHAKaW5kZXggMWU4YjY0Ni4uYzgyNjgxNCAxMDA2NDQKLS0tIGEvbGliL2NwcC90ZXN0L1psaWJUZXN0LmNwcAorKysgYi9saWIvY3BwL3Rlc3QvWmxpYlRlc3QuY3BwCkBAIC0xNywyOSArMTcsMzggQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNkZWZpbmUgX19TVERDX0xJTUlUX01BQ1JPUwotI2RlZmluZSBfX1NURENfRk9STUFUX01BQ1JPUwotCiAjaWZuZGVmIF9HTlVfU09VUkNFCiAjZGVmaW5lIF9HTlVfU09VUkNFIC8vIG5lZWRlZCBmb3IgZ2V0b3B0X2xvbmcKICNlbmRpZgogCisjaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSIDw9IDE3MDApCisvLyBwb2x5bm9taWFsIGFuZCBzdGQ6OmZpbGxfdCB3YXJuaW5nIGhhcHBlbnMgaW4gTVNWQyAyMDEwLCAyMDEzLCBtYXliZSBvdGhlcnMKKy8vIGh0dHBzOi8vc3ZuLmJvb3N0Lm9yZy90cmFjL2Jvb3N0L3RpY2tldC8xMTQyNgorI3ByYWdtYSB3YXJuaW5nKGRpc2FibGU6NDk5NikKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9TVERJTlRfSAogI2luY2x1ZGUgPHN0ZGludC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9JTlRUWVBFU19ICiAjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNlbmRpZgogI2luY2x1ZGUgPGNzdGRkZWY+CiAjaW5jbHVkZSA8ZnN0cmVhbT4KICNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDx0aHJpZnQvY3h4ZnVuY3Rpb25hbC5oPgorI2luY2x1ZGUgPG1lbW9yeT4KIAogI2luY2x1ZGUgPGJvb3N0L3JhbmRvbS5ocHA+CiAjaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX2FycmF5LmhwcD4KICNpbmNsdWRlIDxib29zdC90ZXN0L3VuaXRfdGVzdC5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvdmVyc2lvbi5ocHA+CiAKICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UWmxpYlRyYW5zcG9ydC5oPgogCi11c2luZyBuYW1lc3BhY2Ugc3RkOwogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7Cit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7Cit1c2luZyBzdGQ6OnN0cmluZzsKIAogYm9vc3Q6Om10MTk5Mzcgcm5nOwogCkBAIC00OCwyNiArNTcsMjQgQEAKICAqLwogCiBjbGFzcyBTaXplR2VuZXJhdG9yIHsKLSBwdWJsaWM6CitwdWJsaWM6CiAgIHZpcnR1YWwgflNpemVHZW5lcmF0b3IoKSB7fQogICB2aXJ0dWFsIHVuc2lnbmVkIGludCBnZXRTaXplKCkgPSAwOwogfTsKIAogY2xhc3MgQ29uc3RhbnRTaXplR2VuZXJhdG9yIDogcHVibGljIFNpemVHZW5lcmF0b3IgewotIHB1YmxpYzoKK3B1YmxpYzoKICAgQ29uc3RhbnRTaXplR2VuZXJhdG9yKHVuc2lnbmVkIGludCB2YWx1ZSkgOiB2YWx1ZV8odmFsdWUpIHt9Ci0gIHZpcnR1YWwgdW5zaWduZWQgaW50IGdldFNpemUoKSB7Ci0gICAgcmV0dXJuIHZhbHVlXzsKLSAgfQorICB2aXJ0dWFsIHVuc2lnbmVkIGludCBnZXRTaXplKCkgeyByZXR1cm4gdmFsdWVfOyB9CiAKLSBwcml2YXRlOgorcHJpdmF0ZToKICAgdW5zaWduZWQgaW50IHZhbHVlXzsKIH07CiAKIGNsYXNzIExvZ05vcm1hbFNpemVHZW5lcmF0b3IgOiBwdWJsaWMgU2l6ZUdlbmVyYXRvciB7Ci0gcHVibGljOgotICBMb2dOb3JtYWxTaXplR2VuZXJhdG9yKGRvdWJsZSBtZWFuLCBkb3VibGUgc3RkX2RldikgOgotICAgICAgZ2VuXyhybmcsIGJvb3N0Ojpsb2dub3JtYWxfZGlzdHJpYnV0aW9uPGRvdWJsZT4obWVhbiwgc3RkX2RldikpIHt9CitwdWJsaWM6CisgIExvZ05vcm1hbFNpemVHZW5lcmF0b3IoZG91YmxlIG1lYW4sIGRvdWJsZSBzdGRfZGV2KQorICAgIDogZ2VuXyhybmcsIGJvb3N0Ojpsb2dub3JtYWxfZGlzdHJpYnV0aW9uPGRvdWJsZT4obWVhbiwgc3RkX2RldikpIHt9CiAKICAgdmlydHVhbCB1bnNpZ25lZCBpbnQgZ2V0U2l6ZSgpIHsKICAgICAvLyBMb29wIHVudGlsIHdlIGdldCBhIHNpemUgb2YgMSBvciBtb3JlCkBAIC03OSwyNiArODYsMjYgQEAKICAgICB9CiAgIH0KIAotIHByaXZhdGU6Ci0gIGJvb3N0Ojp2YXJpYXRlX2dlbmVyYXRvcjwgYm9vc3Q6Om10MTk5MzcsIGJvb3N0Ojpsb2dub3JtYWxfZGlzdHJpYnV0aW9uPGRvdWJsZT4gPiBnZW5fOworcHJpdmF0ZToKKyAgYm9vc3Q6OnZhcmlhdGVfZ2VuZXJhdG9yPGJvb3N0OjptdDE5OTM3LCBib29zdDo6bG9nbm9ybWFsX2Rpc3RyaWJ1dGlvbjxkb3VibGU+ID4gZ2VuXzsKIH07CiAKLXVpbnQ4X3QqIGdlbl91bmlmb3JtX2J1ZmZlcih1aW50MzJfdCBidWZfbGVuLCB1aW50OF90IGMpIHsKK2Jvb3N0OjpzaGFyZWRfYXJyYXk8dWludDhfdD4gZ2VuX3VuaWZvcm1fYnVmZmVyKHVpbnQzMl90IGJ1Zl9sZW4sIHVpbnQ4X3QgYykgewogICB1aW50OF90KiBidWYgPSBuZXcgdWludDhfdFtidWZfbGVuXTsKICAgbWVtc2V0KGJ1ZiwgYywgYnVmX2xlbik7Ci0gIHJldHVybiBidWY7CisgIHJldHVybiBib29zdDo6c2hhcmVkX2FycmF5PHVpbnQ4X3Q+KGJ1Zik7CiB9CiAKLXVpbnQ4X3QqIGdlbl9jb21wcmVzc2libGVfYnVmZmVyKHVpbnQzMl90IGJ1Zl9sZW4pIHsKK2Jvb3N0OjpzaGFyZWRfYXJyYXk8dWludDhfdD4gZ2VuX2NvbXByZXNzaWJsZV9idWZmZXIodWludDMyX3QgYnVmX2xlbikgewogICB1aW50OF90KiBidWYgPSBuZXcgdWludDhfdFtidWZfbGVuXTsKIAogICAvLyBHZW5lcmF0ZSBzbWFsbCBydW5zIG9mIGFsdGVybmF0ZWx5IGluY3JlYXNpbmcgYW5kIGRlY3JlYXNpbmcgYnl0ZXMKICAgYm9vc3Q6OnVuaWZvcm1fc21hbGxpbnQ8dWludDMyX3Q+IHJ1bl9sZW5ndGhfZGlzdHJpYnV0aW9uKDEsIDY0KTsKICAgYm9vc3Q6OnVuaWZvcm1fc21hbGxpbnQ8dWludDhfdD4gYnl0ZV9kaXN0cmlidXRpb24oMCwgVUlOVDhfTUFYKTsKLSAgYm9vc3Q6OnZhcmlhdGVfZ2VuZXJhdG9yPCBib29zdDo6bXQxOTkzNywgYm9vc3Q6OnVuaWZvcm1fc21hbGxpbnQ8dWludDhfdD4gPgotICAgIGJ5dGVfZ2VuZXJhdG9yKHJuZywgYnl0ZV9kaXN0cmlidXRpb24pOwotICBib29zdDo6dmFyaWF0ZV9nZW5lcmF0b3I8IGJvb3N0OjptdDE5OTM3LCBib29zdDo6dW5pZm9ybV9zbWFsbGludDx1aW50MzJfdD4gPgotICAgIHJ1bl9sZW5fZ2VuZXJhdG9yKHJuZywgcnVuX2xlbmd0aF9kaXN0cmlidXRpb24pOworICBib29zdDo6dmFyaWF0ZV9nZW5lcmF0b3I8Ym9vc3Q6Om10MTk5MzcsIGJvb3N0Ojp1bmlmb3JtX3NtYWxsaW50PHVpbnQ4X3Q+ID4KKyAgICAgIGJ5dGVfZ2VuZXJhdG9yKHJuZywgYnl0ZV9kaXN0cmlidXRpb24pOworICBib29zdDo6dmFyaWF0ZV9nZW5lcmF0b3I8Ym9vc3Q6Om10MTk5MzcsIGJvb3N0Ojp1bmlmb3JtX3NtYWxsaW50PHVpbnQzMl90PiA+CisgICAgICBydW5fbGVuX2dlbmVyYXRvcihybmcsIHJ1bl9sZW5ndGhfZGlzdHJpYnV0aW9uKTsKIAogICB1aW50MzJfdCBpZHggPSAwOwogICBpbnQ4X3Qgc3RlcCA9IDE7CkBAIC0xMTgsODIgKzEyNSw4MSBAQAogICAgIHN0ZXAgKj0gLTE7CiAgIH0KIAotICByZXR1cm4gYnVmOworICByZXR1cm4gYm9vc3Q6OnNoYXJlZF9hcnJheTx1aW50OF90PihidWYpOwogfQogCi11aW50OF90KiBnZW5fcmFuZG9tX2J1ZmZlcih1aW50MzJfdCBidWZfbGVuKSB7Citib29zdDo6c2hhcmVkX2FycmF5PHVpbnQ4X3Q+IGdlbl9yYW5kb21fYnVmZmVyKHVpbnQzMl90IGJ1Zl9sZW4pIHsKICAgdWludDhfdCogYnVmID0gbmV3IHVpbnQ4X3RbYnVmX2xlbl07CiAKICAgYm9vc3Q6OnVuaWZvcm1fc21hbGxpbnQ8dWludDhfdD4gZGlzdHJpYnV0aW9uKDAsIFVJTlQ4X01BWCk7Ci0gIGJvb3N0Ojp2YXJpYXRlX2dlbmVyYXRvcjwgYm9vc3Q6Om10MTk5MzcsIGJvb3N0Ojp1bmlmb3JtX3NtYWxsaW50PHVpbnQ4X3Q+ID4KLSAgICBnZW5lcmF0b3Iocm5nLCBkaXN0cmlidXRpb24pOworICBib29zdDo6dmFyaWF0ZV9nZW5lcmF0b3I8Ym9vc3Q6Om10MTk5MzcsIGJvb3N0Ojp1bmlmb3JtX3NtYWxsaW50PHVpbnQ4X3Q+ID4KKyAgICAgIGdlbmVyYXRvcihybmcsIGRpc3RyaWJ1dGlvbik7CiAKICAgZm9yICh1aW50MzJfdCBuID0gMDsgbiA8IGJ1Zl9sZW47ICsrbikgewogICAgIGJ1ZltuXSA9IGdlbmVyYXRvcigpOwogICB9CiAKLSAgcmV0dXJuIGJ1ZjsKKyAgcmV0dXJuIGJvb3N0OjpzaGFyZWRfYXJyYXk8dWludDhfdD4oYnVmKTsKIH0KIAogLyoKICAqIFRlc3QgZnVuY3Rpb25zCiAgKi8KIAotdm9pZCB0ZXN0X3dyaXRlX3RoZW5fcmVhZChjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGJ1Zl9sZW4pIHsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gbWVtYnVmKG5ldyBUTWVtb3J5QnVmZmVyKCkpOwotICBib29zdDo6c2hhcmVkX3B0cjxUWmxpYlRyYW5zcG9ydD4gemxpYl90cmFucyhuZXcgVFpsaWJUcmFuc3BvcnQobWVtYnVmKSk7Ci0gIHpsaWJfdHJhbnMtPndyaXRlKGJ1ZiwgYnVmX2xlbik7Cit2b2lkIHRlc3Rfd3JpdGVfdGhlbl9yZWFkKGNvbnN0IGJvb3N0OjpzaGFyZWRfYXJyYXk8dWludDhfdD4gYnVmLCB1aW50MzJfdCBidWZfbGVuKSB7CisgIHNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gbWVtYnVmKG5ldyBUTWVtb3J5QnVmZmVyKCkpOworICBzaGFyZWRfcHRyPFRabGliVHJhbnNwb3J0PiB6bGliX3RyYW5zKG5ldyBUWmxpYlRyYW5zcG9ydChtZW1idWYpKTsKKyAgemxpYl90cmFucy0+d3JpdGUoYnVmLmdldCgpLCBidWZfbGVuKTsKICAgemxpYl90cmFucy0+ZmluaXNoKCk7CiAKICAgYm9vc3Q6OnNoYXJlZF9hcnJheTx1aW50OF90PiBtaXJyb3IobmV3IHVpbnQ4X3RbYnVmX2xlbl0pOwogICB1aW50MzJfdCBnb3QgPSB6bGliX3RyYW5zLT5yZWFkQWxsKG1pcnJvci5nZXQoKSwgYnVmX2xlbik7CiAgIEJPT1NUX1JFUVVJUkVfRVFVQUwoZ290LCBidWZfbGVuKTsKLSAgQk9PU1RfQ0hFQ0tfRVFVQUwobWVtY21wKG1pcnJvci5nZXQoKSwgYnVmLCBidWZfbGVuKSwgMCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKG1lbWNtcChtaXJyb3IuZ2V0KCksIGJ1Zi5nZXQoKSwgYnVmX2xlbiksIDApOwogICB6bGliX3RyYW5zLT52ZXJpZnlDaGVja3N1bSgpOwogfQogCi12b2lkIHRlc3Rfc2VwYXJhdGVfY2hlY2tzdW0oY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBidWZfbGVuKSB7Cit2b2lkIHRlc3Rfc2VwYXJhdGVfY2hlY2tzdW0oY29uc3QgYm9vc3Q6OnNoYXJlZF9hcnJheTx1aW50OF90PiBidWYsIHVpbnQzMl90IGJ1Zl9sZW4pIHsKICAgLy8gVGhpcyBvbmUgaXMgdHJpY2t5LiAgSSBzZXBhcmF0ZSB0aGUgbGFzdCBieXRlIG9mIHRoZSBzdHJlYW0gb3V0CiAgIC8vIGludG8gYSBzZXBhcmF0ZSBjcmJ1Zl8uICBUaGUgbGFzdCBieXRlIGlzIHBhcnQgb2YgdGhlIGNoZWNrc3VtLAogICAvLyBzbyB0aGUgZW50aXJlIHJlYWQgZ29lcyBmaW5lLCBidXQgd2hlbiBJIGdvIHRvIHZlcmlmeSB0aGUgY2hlY2tzdW0KICAgLy8gaXQgaXNuJ3QgdGhlcmUuICBUaGUgb3JpZ2luYWwgaW1wbGVtZW50YXRpb24gY29tcGxhaW5lZCB0aGF0CiAgIC8vIHRoZSBzdHJlYW0gd2FzIG5vdCBjb21wbGV0ZS4gIEknbSBhYm91dCB0byBnbyBmaXggdGhhdC4KICAgLy8gSXQgd29ya2VkLiAgQXdlc29tZS4KLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gbWVtYnVmKG5ldyBUTWVtb3J5QnVmZmVyKCkpOwotICBib29zdDo6c2hhcmVkX3B0cjxUWmxpYlRyYW5zcG9ydD4gemxpYl90cmFucyhuZXcgVFpsaWJUcmFuc3BvcnQobWVtYnVmKSk7Ci0gIHpsaWJfdHJhbnMtPndyaXRlKGJ1ZiwgYnVmX2xlbik7CisgIHNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gbWVtYnVmKG5ldyBUTWVtb3J5QnVmZmVyKCkpOworICBzaGFyZWRfcHRyPFRabGliVHJhbnNwb3J0PiB6bGliX3RyYW5zKG5ldyBUWmxpYlRyYW5zcG9ydChtZW1idWYpKTsKKyAgemxpYl90cmFucy0+d3JpdGUoYnVmLmdldCgpLCBidWZfbGVuKTsKICAgemxpYl90cmFucy0+ZmluaXNoKCk7CiAgIHN0cmluZyB0bXBfYnVmOwogICBtZW1idWYtPmFwcGVuZEJ1ZmZlclRvU3RyaW5nKHRtcF9idWYpOwogICB6bGliX3RyYW5zLnJlc2V0KG5ldyBUWmxpYlRyYW5zcG9ydChtZW1idWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRabGliVHJhbnNwb3J0OjpERUZBVUxUX1VSQlVGX1NJWkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90Pih0bXBfYnVmLmxlbmd0aCgpLTEpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90Pih0bXBfYnVmLmxlbmd0aCgpIC0gMSkpKTsKIAogICBib29zdDo6c2hhcmVkX2FycmF5PHVpbnQ4X3Q+IG1pcnJvcihuZXcgdWludDhfdFtidWZfbGVuXSk7CiAgIHVpbnQzMl90IGdvdCA9IHpsaWJfdHJhbnMtPnJlYWRBbGwobWlycm9yLmdldCgpLCBidWZfbGVuKTsKICAgQk9PU1RfUkVRVUlSRV9FUVVBTChnb3QsIGJ1Zl9sZW4pOwotICBCT09TVF9DSEVDS19FUVVBTChtZW1jbXAobWlycm9yLmdldCgpLCBidWYsIGJ1Zl9sZW4pLCAwKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobWVtY21wKG1pcnJvci5nZXQoKSwgYnVmLmdldCgpLCBidWZfbGVuKSwgMCk7CiAgIHpsaWJfdHJhbnMtPnZlcmlmeUNoZWNrc3VtKCk7CiB9CiAKLXZvaWQgdGVzdF9pbmNvbXBsZXRlX2NoZWNrc3VtKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgYnVmX2xlbikgewordm9pZCB0ZXN0X2luY29tcGxldGVfY2hlY2tzdW0oY29uc3QgYm9vc3Q6OnNoYXJlZF9hcnJheTx1aW50OF90PiBidWYsIHVpbnQzMl90IGJ1Zl9sZW4pIHsKICAgLy8gTWFrZSBzdXJlIHdlIHN0aWxsIGdldCB0aGF0ICJub3QgY29tcGxldGUiIGVycm9yIGlmCiAgIC8vIGl0IHJlYWxseSBpc24ndCBjb21wbGV0ZS4KLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gbWVtYnVmKG5ldyBUTWVtb3J5QnVmZmVyKCkpOwotICBib29zdDo6c2hhcmVkX3B0cjxUWmxpYlRyYW5zcG9ydD4gemxpYl90cmFucyhuZXcgVFpsaWJUcmFuc3BvcnQobWVtYnVmKSk7Ci0gIHpsaWJfdHJhbnMtPndyaXRlKGJ1ZiwgYnVmX2xlbik7CisgIHNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gbWVtYnVmKG5ldyBUTWVtb3J5QnVmZmVyKCkpOworICBzaGFyZWRfcHRyPFRabGliVHJhbnNwb3J0PiB6bGliX3RyYW5zKG5ldyBUWmxpYlRyYW5zcG9ydChtZW1idWYpKTsKKyAgemxpYl90cmFucy0+d3JpdGUoYnVmLmdldCgpLCBidWZfbGVuKTsKICAgemxpYl90cmFucy0+ZmluaXNoKCk7CiAgIHN0cmluZyB0bXBfYnVmOwogICBtZW1idWYtPmFwcGVuZEJ1ZmZlclRvU3RyaW5nKHRtcF9idWYpOwogICB0bXBfYnVmLmVyYXNlKHRtcF9idWYubGVuZ3RoKCkgLSAxKTsKLSAgbWVtYnVmLT5yZXNldEJ1ZmZlcihjb25zdF9jYXN0PHVpbnQ4X3QqPigKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHRtcF9idWYuZGF0YSgpKSksCisgIG1lbWJ1Zi0+cmVzZXRCdWZmZXIoY29uc3RfY2FzdDx1aW50OF90Kj4ocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4odG1wX2J1Zi5kYXRhKCkpKSwKICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4odG1wX2J1Zi5sZW5ndGgoKSkpOwogCiAgIGJvb3N0OjpzaGFyZWRfYXJyYXk8dWludDhfdD4gbWlycm9yKG5ldyB1aW50OF90W2J1Zl9sZW5dKTsKICAgdWludDMyX3QgZ290ID0gemxpYl90cmFucy0+cmVhZEFsbChtaXJyb3IuZ2V0KCksIGJ1Zl9sZW4pOwogICBCT09TVF9SRVFVSVJFX0VRVUFMKGdvdCwgYnVmX2xlbik7Ci0gIEJPT1NUX0NIRUNLX0VRVUFMKG1lbWNtcChtaXJyb3IuZ2V0KCksIGJ1ZiwgYnVmX2xlbiksIDApOworICBCT09TVF9DSEVDS19FUVVBTChtZW1jbXAobWlycm9yLmdldCgpLCBidWYuZ2V0KCksIGJ1Zl9sZW4pLCAwKTsKICAgdHJ5IHsKICAgICB6bGliX3RyYW5zLT52ZXJpZnlDaGVja3N1bSgpOwogICAgIEJPT1NUX0VSUk9SKCJ2ZXJpZnlDaGVja3N1bSgpIGRpZCBub3QgcmVwb3J0IGFuIGVycm9yIik7CkBAIC0yMDIsMTIgKzIwOCwxMyBAQAogICB9CiB9CiAKLXZvaWQgdGVzdF9yZWFkX3dyaXRlX21peChjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGJ1Zl9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8U2l6ZUdlbmVyYXRvcj4mIHdyaXRlX2dlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxTaXplR2VuZXJhdG9yPiYgcmVhZF9nZW4pIHsKK3ZvaWQgdGVzdF9yZWFkX3dyaXRlX21peChjb25zdCBib29zdDo6c2hhcmVkX2FycmF5PHVpbnQ4X3Q+IGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBidWZfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8U2l6ZUdlbmVyYXRvcj4mIHdyaXRlX2dlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFNpemVHZW5lcmF0b3I+JiByZWFkX2dlbikgewogICAvLyBUcnkgaXQgd2l0aCBhIG1peCBvZiByZWFkL3dyaXRlIHNpemVzLgotICBib29zdDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBtZW1idWYobmV3IFRNZW1vcnlCdWZmZXIoKSk7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRabGliVHJhbnNwb3J0PiB6bGliX3RyYW5zKG5ldyBUWmxpYlRyYW5zcG9ydChtZW1idWYpKTsKKyAgc2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBtZW1idWYobmV3IFRNZW1vcnlCdWZmZXIoKSk7CisgIHNoYXJlZF9wdHI8VFpsaWJUcmFuc3BvcnQ+IHpsaWJfdHJhbnMobmV3IFRabGliVHJhbnNwb3J0KG1lbWJ1ZikpOwogICB1bnNpZ25lZCBpbnQgdG90OwogCiAgIHRvdCA9IDA7CkBAIC0yMTYsNyArMjIzLDcgQEAKICAgICBpZiAodG90ICsgd3JpdGVfbGVuID4gYnVmX2xlbikgewogICAgICAgd3JpdGVfbGVuID0gYnVmX2xlbiAtIHRvdDsKICAgICB9Ci0gICAgemxpYl90cmFucy0+d3JpdGUoYnVmICsgdG90LCB3cml0ZV9sZW4pOworICAgIHpsaWJfdHJhbnMtPndyaXRlKGJ1Zi5nZXQoKSArIHRvdCwgd3JpdGVfbGVuKTsKICAgICB0b3QgKz0gd3JpdGVfbGVuOwogICB9CiAKQEAgLTIzMiwxOSArMjM5LDE5IEBACiAgICAgfQogICAgIHVpbnQzMl90IGdvdCA9IHpsaWJfdHJhbnMtPnJlYWQobWlycm9yLmdldCgpICsgdG90LCByZWFkX2xlbik7CiAgICAgQk9PU1RfUkVRVUlSRV9MRShnb3QsIGV4cGVjdGVkX3JlYWRfbGVuKTsKLSAgICBCT09TVF9SRVFVSVJFX05FKGdvdCwgKHVpbnQzMl90KSAwKTsKKyAgICBCT09TVF9SRVFVSVJFX05FKGdvdCwgKHVpbnQzMl90KTApOwogICAgIHRvdCArPSBnb3Q7CiAgIH0KIAotICBCT09TVF9DSEVDS19FUVVBTChtZW1jbXAobWlycm9yLmdldCgpLCBidWYsIGJ1Zl9sZW4pLCAwKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobWVtY21wKG1pcnJvci5nZXQoKSwgYnVmLmdldCgpLCBidWZfbGVuKSwgMCk7CiAgIHpsaWJfdHJhbnMtPnZlcmlmeUNoZWNrc3VtKCk7CiB9CiAKLXZvaWQgdGVzdF9pbnZhbGlkX2NoZWNrc3VtKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgYnVmX2xlbikgewordm9pZCB0ZXN0X2ludmFsaWRfY2hlY2tzdW0oY29uc3QgYm9vc3Q6OnNoYXJlZF9hcnJheTx1aW50OF90PiBidWYsIHVpbnQzMl90IGJ1Zl9sZW4pIHsKICAgLy8gVmVyaWZ5IGNoZWNrc3VtIGNoZWNraW5nLgotICBib29zdDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBtZW1idWYobmV3IFRNZW1vcnlCdWZmZXIoKSk7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRabGliVHJhbnNwb3J0PiB6bGliX3RyYW5zKG5ldyBUWmxpYlRyYW5zcG9ydChtZW1idWYpKTsKLSAgemxpYl90cmFucy0+d3JpdGUoYnVmLCBidWZfbGVuKTsKKyAgc2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBtZW1idWYobmV3IFRNZW1vcnlCdWZmZXIoKSk7CisgIHNoYXJlZF9wdHI8VFpsaWJUcmFuc3BvcnQ+IHpsaWJfdHJhbnMobmV3IFRabGliVHJhbnNwb3J0KG1lbWJ1ZikpOworICB6bGliX3RyYW5zLT53cml0ZShidWYuZ2V0KCksIGJ1Zl9sZW4pOwogICB6bGliX3RyYW5zLT5maW5pc2goKTsKICAgc3RyaW5nIHRtcF9idWY7CiAgIG1lbWJ1Zi0+YXBwZW5kQnVmZmVyVG9TdHJpbmcodG1wX2J1Zik7CkBAIC0yNjQsOCArMjcxLDcgQEAKICAgLy8gZXJyb3Igd2hlbiBvbmx5IG1vZGlmeWluZyBjaGVja3N1bSBieXRlcy4KICAgaW50IGluZGV4ID0gc3RhdGljX2Nhc3Q8aW50Pih0bXBfYnVmLnNpemUoKSAtIDEpOwogICB0bXBfYnVmW2luZGV4XSsrOwotICBtZW1idWYtPnJlc2V0QnVmZmVyKGNvbnN0X2Nhc3Q8dWludDhfdCo+KAotICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4odG1wX2J1Zi5kYXRhKCkpKSwKKyAgbWVtYnVmLT5yZXNldEJ1ZmZlcihjb25zdF9jYXN0PHVpbnQ4X3QqPihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPih0bXBfYnVmLmRhdGEoKSkpLAogICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90Pih0bXBfYnVmLmxlbmd0aCgpKSk7CiAKICAgYm9vc3Q6OnNoYXJlZF9hcnJheTx1aW50OF90PiBtaXJyb3IobmV3IHVpbnQ4X3RbYnVmX2xlbl0pOwpAQCAtMjc4LDExICsyODQsMTEgQEAKICAgfQogfQogCi12b2lkIHRlc3Rfd3JpdGVfYWZ0ZXJfZmx1c2goY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBidWZfbGVuKSB7Cit2b2lkIHRlc3Rfd3JpdGVfYWZ0ZXJfZmx1c2goY29uc3QgYm9vc3Q6OnNoYXJlZF9hcnJheTx1aW50OF90PiBidWYsIHVpbnQzMl90IGJ1Zl9sZW4pIHsKICAgLy8gd3JpdGUgc29tZSBkYXRhCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IG1lbWJ1ZihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFpsaWJUcmFuc3BvcnQ+IHpsaWJfdHJhbnMobmV3IFRabGliVHJhbnNwb3J0KG1lbWJ1ZikpOwotICB6bGliX3RyYW5zLT53cml0ZShidWYsIGJ1Zl9sZW4pOworICBzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IG1lbWJ1ZihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKKyAgc2hhcmVkX3B0cjxUWmxpYlRyYW5zcG9ydD4gemxpYl90cmFucyhuZXcgVFpsaWJUcmFuc3BvcnQobWVtYnVmKSk7CisgIHpsaWJfdHJhbnMtPndyaXRlKGJ1Zi5nZXQoKSwgYnVmX2xlbik7CiAKICAgLy8gY2FsbCBmaW5pc2goKQogICB6bGliX3RyYW5zLT5maW5pc2goKTsKQEAgLTMxNiwzMiArMzIyLDUyIEBACiB2b2lkIHRlc3Rfbm9fd3JpdGUoKSB7CiAgIC8vIFZlcmlmeSB0aGF0IG5vIGRhdGEgaXMgd3JpdHRlbiB0byB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQgaWYgd2UKICAgLy8gbmV2ZXIgd3JpdGUgZGF0YSB0byB0aGUgVFpsaWJUcmFuc3BvcnQuCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IG1lbWJ1ZihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKKyAgc2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBtZW1idWYobmV3IFRNZW1vcnlCdWZmZXIoKSk7CiAgIHsKICAgICAvLyBDcmVhdGUgYSBUWmxpYlRyYW5zcG9ydCBvYmplY3QsIGFuZCBpbW1lZGlhdGVseSBkZXN0cm95IGl0CiAgICAgLy8gd2hlbiBpdCBnb2VzIG91dCBvZiBzY29wZS4KICAgICBUWmxpYlRyYW5zcG9ydCB3X3psaWJfdHJhbnMobWVtYnVmKTsKICAgfQogCi0gIEJPT1NUX0NIRUNLX0VRVUFMKG1lbWJ1Zi0+YXZhaWxhYmxlX3JlYWQoKSwgKHVpbnQzMl90KSAwKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobWVtYnVmLT5hdmFpbGFibGVfcmVhZCgpLCAodWludDMyX3QpMCk7Cit9CisKK3ZvaWQgdGVzdF9nZXRfdW5kZXJseWluZ190cmFuc3BvcnQoKSB7CisgIHNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gbWVtYnVmKG5ldyBUTWVtb3J5QnVmZmVyKCkpOworICBzaGFyZWRfcHRyPFRabGliVHJhbnNwb3J0PiB6bGliX3RyYW5zKG5ldyBUWmxpYlRyYW5zcG9ydChtZW1idWYpKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobWVtYnVmLmdldCgpLCB6bGliX3RyYW5zLT5nZXRVbmRlcmx5aW5nVHJhbnNwb3J0KCkuZ2V0KCkpOwogfQogCiAvKgogICogSW5pdGlhbGl6YXRpb24KICAqLwogCi0jZGVmaW5lIEFERF9URVNUX0NBU0Uoc3VpdGUsIG5hbWUsIGZ1bmN0aW9uLCAuLi4pIFwKLSAgZG8geyBcCi0gICAgOjpzdGQ6Om9zdHJpbmdzdHJlYW0gbmFtZV9zczsgXAotICAgIG5hbWVfc3MgPDwgbmFtZSA8PCAiLSIgPDwgQk9PU1RfU1RSSU5HSVpFKGZ1bmN0aW9uKTsgXAotICAgIDo6Ym9vc3Q6OnVuaXRfdGVzdDo6dGVzdF9jYXNlKiB0YyA9IDo6Ym9vc3Q6OnVuaXRfdGVzdDo6bWFrZV90ZXN0X2Nhc2UoIFwKLSAgICAgICAgOjphcGFjaGU6OnRocmlmdDo6c3RkY3h4OjpiaW5kKGZ1bmN0aW9uLCAjIyBfX1ZBX0FSR1NfXyksIFwKLSAgICAgICAgbmFtZV9zcy5zdHIoKSk7IFwKLSAgICAoc3VpdGUpLT5hZGQodGMpOyBcCisjaWYgKEJPT1NUX1ZFUlNJT04gPj0gMTA1OTAwKQorI2RlZmluZSBBRERfVEVTVF9DQVNFKHN1aXRlLCBuYW1lLCBfRlVOQywgLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIDo6c3RkOjpvc3RyaW5nc3RyZWFtIG5hbWVfc3M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG5hbWVfc3MgPDwgbmFtZSA8PCAiLSIgPDwgQk9PU1RfU1RSSU5HSVpFKF9GVU5DKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIDo6c3RkOjpmdW5jdGlvbjx2b2lkICgpPiB0ZXN0X2Z1bmMgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIDo6c3RkOjpiaW5kKF9GVU5DLCAjI19fVkFfQVJHU19fKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICA6OmJvb3N0Ojp1bml0X3Rlc3Q6OnRlc3RfY2FzZSogdGMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgPSA6OmJvb3N0Ojp1bml0X3Rlc3Q6Om1ha2VfdGVzdF9jYXNlKHRlc3RfZnVuYywgbmFtZV9zcy5zdHIoKSwgX19GSUxFX18sIF9fTElORV9fKTsgICAgICAgIFwKKyAgICAoc3VpdGUpLT5hZGQodGMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgfSB3aGlsZSAoMCkKKyNlbHNlCisjZGVmaW5lIEFERF9URVNUX0NBU0Uoc3VpdGUsIG5hbWUsIF9GVU5DLCAuLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgOjpzdGQ6Om9zdHJpbmdzdHJlYW0gbmFtZV9zczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbmFtZV9zcyA8PCBuYW1lIDw8ICItIiA8PCBCT09TVF9TVFJJTkdJWkUoX0ZVTkMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgOjpib29zdDo6dW5pdF90ZXN0Ojp0ZXN0X2Nhc2UqIHRjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgID0gOjpib29zdDo6dW5pdF90ZXN0OjptYWtlX3Rlc3RfY2FzZSg6OnN0ZDo6YmluZChfRlVOQywgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjI19fVkFfQVJHU19fKSwgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVfc3Muc3RyKCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoc3VpdGUpLT5hZGQodGMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKyNlbmRpZgogCiB2b2lkIGFkZF90ZXN0cyhib29zdDo6dW5pdF90ZXN0Ojp0ZXN0X3N1aXRlKiBzdWl0ZSwKLSAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGJ1ZiwKKyAgICAgICAgICAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfYXJyYXk8dWludDhfdD4mIGJ1ZiwKICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBuYW1lKSB7CiAgIEFERF9URVNUX0NBU0Uoc3VpdGUsIG5hbWUsIHRlc3Rfd3JpdGVfdGhlbl9yZWFkLCBidWYsIGJ1Zl9sZW4pOwpAQCAtMzUwLDIwICszNzYsMzAgQEAKICAgQUREX1RFU1RfQ0FTRShzdWl0ZSwgbmFtZSwgdGVzdF9pbnZhbGlkX2NoZWNrc3VtLCBidWYsIGJ1Zl9sZW4pOwogICBBRERfVEVTVF9DQVNFKHN1aXRlLCBuYW1lLCB0ZXN0X3dyaXRlX2FmdGVyX2ZsdXNoLCBidWYsIGJ1Zl9sZW4pOwogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFNpemVHZW5lcmF0b3I+IHNpemVfMzJrKG5ldyBDb25zdGFudFNpemVHZW5lcmF0b3IoMTw8MTUpKTsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8U2l6ZUdlbmVyYXRvcj4gc2l6ZV9sb2dub3JtYWwobmV3IExvZ05vcm1hbFNpemVHZW5lcmF0b3IoMjAsIDMwKSk7Ci0gIEFERF9URVNUX0NBU0Uoc3VpdGUsIG5hbWUgPDwgIi1jb25zdGFudCIsCi0gICAgICAgICAgICAgICAgdGVzdF9yZWFkX3dyaXRlX21peCwgYnVmLCBidWZfbGVuLAotICAgICAgICAgICAgICAgIHNpemVfMzJrLCBzaXplXzMyayk7Ci0gIEFERF9URVNUX0NBU0Uoc3VpdGUsIG5hbWUgPDwgIi1sb2dub3JtYWwtd3JpdGUiLAotICAgICAgICAgICAgICAgIHRlc3RfcmVhZF93cml0ZV9taXgsIGJ1ZiwgYnVmX2xlbiwKLSAgICAgICAgICAgICAgICBzaXplX2xvZ25vcm1hbCwgc2l6ZV8zMmspOwotICBBRERfVEVTVF9DQVNFKHN1aXRlLCBuYW1lIDw8ICItbG9nbm9ybWFsLXJlYWQiLAotICAgICAgICAgICAgICAgIHRlc3RfcmVhZF93cml0ZV9taXgsIGJ1ZiwgYnVmX2xlbiwKLSAgICAgICAgICAgICAgICBzaXplXzMyaywgc2l6ZV9sb2dub3JtYWwpOwotICBBRERfVEVTVF9DQVNFKHN1aXRlLCBuYW1lIDw8ICItbG9nbm9ybWFsLWJvdGgiLAotICAgICAgICAgICAgICAgIHRlc3RfcmVhZF93cml0ZV9taXgsIGJ1ZiwgYnVmX2xlbiwKLSAgICAgICAgICAgICAgICBzaXplX2xvZ25vcm1hbCwgc2l6ZV9sb2dub3JtYWwpOworICBzaGFyZWRfcHRyPFNpemVHZW5lcmF0b3I+IHNpemVfMzJrKG5ldyBDb25zdGFudFNpemVHZW5lcmF0b3IoMSA8PCAxNSkpOworICBzaGFyZWRfcHRyPFNpemVHZW5lcmF0b3I+IHNpemVfbG9nbm9ybWFsKG5ldyBMb2dOb3JtYWxTaXplR2VuZXJhdG9yKDIwLCAzMCkpOworICBBRERfVEVTVF9DQVNFKHN1aXRlLCBuYW1lIDw8ICItY29uc3RhbnQiLCB0ZXN0X3JlYWRfd3JpdGVfbWl4LCBidWYsIGJ1Zl9sZW4sIHNpemVfMzJrLCBzaXplXzMyayk7CisgIEFERF9URVNUX0NBU0Uoc3VpdGUsCisgICAgICAgICAgICAgICAgbmFtZSA8PCAiLWxvZ25vcm1hbC13cml0ZSIsCisgICAgICAgICAgICAgICAgdGVzdF9yZWFkX3dyaXRlX21peCwKKyAgICAgICAgICAgICAgICBidWYsCisgICAgICAgICAgICAgICAgYnVmX2xlbiwKKyAgICAgICAgICAgICAgICBzaXplX2xvZ25vcm1hbCwKKyAgICAgICAgICAgICAgICBzaXplXzMyayk7CisgIEFERF9URVNUX0NBU0Uoc3VpdGUsCisgICAgICAgICAgICAgICAgbmFtZSA8PCAiLWxvZ25vcm1hbC1yZWFkIiwKKyAgICAgICAgICAgICAgICB0ZXN0X3JlYWRfd3JpdGVfbWl4LAorICAgICAgICAgICAgICAgIGJ1ZiwKKyAgICAgICAgICAgICAgICBidWZfbGVuLAorICAgICAgICAgICAgICAgIHNpemVfMzJrLAorICAgICAgICAgICAgICAgIHNpemVfbG9nbm9ybWFsKTsKKyAgQUREX1RFU1RfQ0FTRShzdWl0ZSwKKyAgICAgICAgICAgICAgICBuYW1lIDw8ICItbG9nbm9ybWFsLWJvdGgiLAorICAgICAgICAgICAgICAgIHRlc3RfcmVhZF93cml0ZV9taXgsCisgICAgICAgICAgICAgICAgYnVmLAorICAgICAgICAgICAgICAgIGJ1Zl9sZW4sCisgICAgICAgICAgICAgICAgc2l6ZV9sb2dub3JtYWwsCisgICAgICAgICAgICAgICAgc2l6ZV9sb2dub3JtYWwpOwogCiAgIC8vIFRlc3Qgd2l0aCBhIHJhbmRvbSBzaXplIGRpc3RyaWJ1dGlvbiwKICAgLy8gYnV0IHVzZSB0aGUgZXhhY3Qgc2FtZSBkaXN0cmlidXRpb24gZm9yIHJlYWRpbmcgYXMgZm9yIHdyaXRpbmcuCkBAIC0zNzEsMTEgKzQwNywxNSBAQAogICAvLyBCZWNhdXNlIHRoZSBTaXplR2VuZXJhdG9yIG1ha2VzIGEgY29weSBvZiB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IsCiAgIC8vIGJvdGggU2l6ZUdlbmVyYXRvcnMgc2hvdWxkIHJldHVybiB0aGUgZXhhY3Qgc2FtZSBzZXQgb2YgdmFsdWVzLCBzaW5jZSB0aGV5CiAgIC8vIGJvdGggc3RhcnQgd2l0aCByYW5kb20gbnVtYmVyIGdlbmVyYXRvcnMgaW4gdGhlIHNhbWUgc3RhdGUuCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFNpemVHZW5lcmF0b3I+IHdyaXRlX3NpemVfZ2VuKG5ldyBMb2dOb3JtYWxTaXplR2VuZXJhdG9yKDIwLCAzMCkpOwotICBib29zdDo6c2hhcmVkX3B0cjxTaXplR2VuZXJhdG9yPiByZWFkX3NpemVfZ2VuKG5ldyBMb2dOb3JtYWxTaXplR2VuZXJhdG9yKDIwLCAzMCkpOwotICBBRERfVEVTVF9DQVNFKHN1aXRlLCBuYW1lIDw8ICItbG9nbm9ybWFsLXNhbWUtZGlzdHJpYnV0aW9uIiwKLSAgICAgICAgICAgICAgICB0ZXN0X3JlYWRfd3JpdGVfbWl4LCBidWYsIGJ1Zl9sZW4sCi0gICAgICAgICAgICAgICAgd3JpdGVfc2l6ZV9nZW4sIHJlYWRfc2l6ZV9nZW4pOworICBzaGFyZWRfcHRyPFNpemVHZW5lcmF0b3I+IHdyaXRlX3NpemVfZ2VuKG5ldyBMb2dOb3JtYWxTaXplR2VuZXJhdG9yKDIwLCAzMCkpOworICBzaGFyZWRfcHRyPFNpemVHZW5lcmF0b3I+IHJlYWRfc2l6ZV9nZW4obmV3IExvZ05vcm1hbFNpemVHZW5lcmF0b3IoMjAsIDMwKSk7CisgIEFERF9URVNUX0NBU0Uoc3VpdGUsCisgICAgICAgICAgICAgICAgbmFtZSA8PCAiLWxvZ25vcm1hbC1zYW1lLWRpc3RyaWJ1dGlvbiIsCisgICAgICAgICAgICAgICAgdGVzdF9yZWFkX3dyaXRlX21peCwKKyAgICAgICAgICAgICAgICBidWYsCisgICAgICAgICAgICAgICAgYnVmX2xlbiwKKyAgICAgICAgICAgICAgICB3cml0ZV9zaXplX2dlbiwKKyAgICAgICAgICAgICAgICByZWFkX3NpemVfZ2VuKTsKIH0KIAogdm9pZCBwcmludF91c2FnZShGSUxFKiBmLCBjb25zdCBjaGFyKiBhcmd2MCkgewpAQCAtMzg1LDE2ICs0MjUsNDUgQEAKICAgZnByaW50ZihmLCAiICAtLWhlbHBcbiIpOwogfQogCi1ib29zdDo6dW5pdF90ZXN0Ojp0ZXN0X3N1aXRlKiBpbml0X3VuaXRfdGVzdF9zdWl0ZShpbnQgYXJnYywgY2hhciogYXJndltdKSB7CisjaWZkZWYgQk9PU1RfVEVTVF9EWU5fTElOSworYm9vbCBpbml0X3VuaXRfdGVzdF9zdWl0ZSgpIHsKICAgdWludDMyX3Qgc2VlZCA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pih0aW1lKE5VTEwpKTsKKyNpZmRlZiBIQVZFX0lOVFRZUEVTX0gKICAgcHJpbnRmKCJzZWVkOiAlIiBQUkl1MzIgIlxuIiwgc2VlZCk7CisjZW5kaWYKICAgcm5nLnNlZWQoc2VlZCk7CiAKLSAgYm9vc3Q6OnVuaXRfdGVzdDo6dGVzdF9zdWl0ZSogc3VpdGUgPQotICAgICZib29zdDo6dW5pdF90ZXN0OjpmcmFtZXdvcms6Om1hc3Rlcl90ZXN0X3N1aXRlKCk7CisgIGJvb3N0Ojp1bml0X3Rlc3Q6OnRlc3Rfc3VpdGUqIHN1aXRlID0gJmJvb3N0Ojp1bml0X3Rlc3Q6OmZyYW1ld29yazo6bWFzdGVyX3Rlc3Rfc3VpdGUoKTsKICAgc3VpdGUtPnBfbmFtZS52YWx1ZSA9ICJabGliVGVzdCI7CiAKLSAgdWludDMyX3QgYnVmX2xlbiA9IDEwMjQqMzI7CisgIHVpbnQzMl90IGJ1Zl9sZW4gPSAxMDI0ICogMzI7CisgIGFkZF90ZXN0cyhzdWl0ZSwgZ2VuX3VuaWZvcm1fYnVmZmVyKGJ1Zl9sZW4sICdhJyksIGJ1Zl9sZW4sICJ1bmlmb3JtIik7CisgIGFkZF90ZXN0cyhzdWl0ZSwgZ2VuX2NvbXByZXNzaWJsZV9idWZmZXIoYnVmX2xlbiksIGJ1Zl9sZW4sICJjb21wcmVzc2libGUiKTsKKyAgYWRkX3Rlc3RzKHN1aXRlLCBnZW5fcmFuZG9tX2J1ZmZlcihidWZfbGVuKSwgYnVmX2xlbiwgInJhbmRvbSIpOworCisgIHN1aXRlLT5hZGQoQk9PU1RfVEVTVF9DQVNFKHRlc3Rfbm9fd3JpdGUpKTsKKyAgc3VpdGUtPmFkZChCT09TVF9URVNUX0NBU0UodGVzdF9nZXRfdW5kZXJseWluZ190cmFuc3BvcnQpKTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworaW50IG1haW4oIGludCBhcmdjLCBjaGFyKiBhcmd2W10gKSB7CisgIHJldHVybiA6OmJvb3N0Ojp1bml0X3Rlc3Q6OnVuaXRfdGVzdF9tYWluKCZpbml0X3VuaXRfdGVzdF9zdWl0ZSxhcmdjLGFyZ3YpOworfQorI2Vsc2UKK2Jvb3N0Ojp1bml0X3Rlc3Q6OnRlc3Rfc3VpdGUqIGluaXRfdW5pdF90ZXN0X3N1aXRlKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKKyAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRShhcmdjKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRShhcmd2KTsKKyAgdWludDMyX3Qgc2VlZCA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pih0aW1lKE5VTEwpKTsKKyNpZmRlZiBIQVZFX0lOVFRZUEVTX0gKKyAgcHJpbnRmKCJzZWVkOiAlIiBQUkl1MzIgIlxuIiwgc2VlZCk7CisjZW5kaWYKKyAgcm5nLnNlZWQoc2VlZCk7CisKKyAgYm9vc3Q6OnVuaXRfdGVzdDo6dGVzdF9zdWl0ZSogc3VpdGUgPSAmYm9vc3Q6OnVuaXRfdGVzdDo6ZnJhbWV3b3JrOjptYXN0ZXJfdGVzdF9zdWl0ZSgpOworICBzdWl0ZS0+cF9uYW1lLnZhbHVlID0gIlpsaWJUZXN0IjsKKworICB1aW50MzJfdCBidWZfbGVuID0gMTAyNCAqIDMyOwogICBhZGRfdGVzdHMoc3VpdGUsIGdlbl91bmlmb3JtX2J1ZmZlcihidWZfbGVuLCAnYScpLCBidWZfbGVuLCAidW5pZm9ybSIpOwogICBhZGRfdGVzdHMoc3VpdGUsIGdlbl9jb21wcmVzc2libGVfYnVmZmVyKGJ1Zl9sZW4pLCBidWZfbGVuLCAiY29tcHJlc3NpYmxlIik7CiAgIGFkZF90ZXN0cyhzdWl0ZSwgZ2VuX3JhbmRvbV9idWZmZXIoYnVmX2xlbiksIGJ1Zl9sZW4sICJyYW5kb20iKTsKQEAgLTQwMywzICs0NzIsNCBAQAogCiAgIHJldHVybiBOVUxMOwogfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvY29uY3VycmVuY3kvTXV0ZXhUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9jb25jdXJyZW5jeS9NdXRleFRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4MWVjMWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvY29uY3VycmVuY3kvTXV0ZXhUZXN0LmNwcApAQCAtMCwwICsxLDEyMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBUaGlzIGlzIGxpbmtlZCBpbnRvIHRoZSBVbml0VGVzdHMgdGVzdCBleGVjdXRhYmxlCisKKyNpbmNsdWRlIDxib29zdC90ZXN0L3VuaXRfdGVzdC5ocHA+CisKKyNpbmNsdWRlICJ0aHJpZnQvY29uY3VycmVuY3kvRXhjZXB0aW9uLmgiCisjaW5jbHVkZSAidGhyaWZ0L2NvbmN1cnJlbmN5L011dGV4LmgiCisKK3VzaW5nIGJvb3N0Ojp1bml0X3Rlc3Q6OnRlc3Rfc3VpdGU7Cit1c2luZyBib29zdDo6dW5pdF90ZXN0OjpmcmFtZXdvcms6Om1hc3Rlcl90ZXN0X3N1aXRlOworCit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OworCitzdHJ1Y3QgTEZBVAoreworICBMRkFUKCkKKyAgICA6IHV1dChNdXRleDo6RVJST1JDSEVDS19JTklUSUFMSVpFUikKKyAgeworICAgIEJPT1NUX0NIRUNLX0VRVUFMKDAsIHB0aHJlYWRfbXV0ZXhfaW5pdCgmbXgsIDApKTsKKyAgICBCT09TVF9DSEVDS19FUVVBTCgwLCBwdGhyZWFkX2NvbmRfaW5pdCgmY3YsIDApKTsKKyAgfQorCisgIE11dGV4IHV1dDsKKyAgcHRocmVhZF9tdXRleF90IG14OworICBwdGhyZWFkX2NvbmRfdCBjdjsKK307CisKKy8vIEhlbHBlciBmb3IgdGVzdGluZyBtdXRleCBiZWhhdmlvciB3aGVuIGxvY2tlZCBieSBhbm90aGVyIHRocmVhZAordm9pZCAqIGxvY2tGcm9tQW5vdGhlclRocmVhZCh2b2lkICpwdHIpCit7CisgIHN0cnVjdCBMRkFUICpsZmF0ID0gKExGQVQgKilwdHI7CisgIEJPT1NUX0NIRUNLX0VRVUFMICAgKDAsIHB0aHJlYWRfbXV0ZXhfbG9jaygmbGZhdC0+bXgpKTsgICAgICAgICAgIC8vIHN5bmNocm9uaXplIHdpdGggdGVzdGluZyB0aHJlYWQKKyAgQk9PU1RfQ0hFQ0tfTk9fVEhST1coIGxmYXQtPnV1dC5sb2NrKCkpOworICBCT09TVF9DSEVDS19FUVVBTCAgICgwLCBwdGhyZWFkX2NvbmRfc2lnbmFsKCZsZmF0LT5jdikpOyAgICAgICAgICAvLyB0ZWxsIHRlc3RpbmcgdGhyZWFkIHdlIGhhdmUgbG9ja2VkIHRoZSBtdXRleAorICBCT09TVF9DSEVDS19FUVVBTCAgICgwLCBwdGhyZWFkX2NvbmRfd2FpdCgmbGZhdC0+Y3YsICZsZmF0LT5teCkpOyAvLyB3YWl0IGZvciB0ZXN0aW5nIHRocmVhZCB0byBzaWduYWwgY29uZGl0aW9uIHZhcmlhYmxlIHRlbGxpbmcgdXMgdG8gdW5sb2NrCisgIEJPT1NUX0NIRUNLX05PX1RIUk9XKCBsZmF0LT51dXQudW5sb2NrKCkpOworICByZXR1cm4gcHRyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZXN0aW5nIHRocmVhZCBzaG91bGQgam9pbiB0byBlbnN1cmUgY29tcGxldGVuZXNzCit9CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURShNdXRleFRlc3QpCisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKGhhcHB5X3BhdGgpCit7CisgIE11dGV4IHV1dChNdXRleDo6RVJST1JDSEVDS19JTklUSUFMSVpFUik7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5lZWRlZCB0byB0ZXN0IHVubG9ja2luZyB0d2ljZSB3aXRob3V0IHVuZGVmaW5lZCBiZWhhdmlvcgorCisgIEJPT1NUX0NIRUNLX05PX1RIUk9XKCB1dXQubG9jaygpKTsKKyAgQk9PU1RfQ0hFQ0tfVEhST1cgICAoIHV1dC5sb2NrKCksIFN5c3RlbVJlc291cmNlRXhjZXB0aW9uKTsgICAgICAgLy8gRURFQURMSyAodGhpcyB0aHJlYWQgb3ducyBpdCkKKyAgQk9PU1RfQ0hFQ0tfTk9fVEhST1coIHV1dC51bmxvY2soKSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHJlY3Vyc2l2ZV9oYXBweV9wYXRoKQoreworICBNdXRleCB1dXQoTXV0ZXg6OlJFQ1VSU0lWRV9JTklUSUFMSVpFUik7CisKKyAgQk9PU1RfQ0hFQ0tfTk9fVEhST1coIHV1dC5sb2NrKCkpOworICBCT09TVF9DSEVDS19OT19USFJPVyggdXV0LmxvY2soKSk7CisgIEJPT1NUX0NIRUNLX05PX1RIUk9XKCB1dXQudW5sb2NrKCkpOworICBCT09TVF9DSEVDS19OT19USFJPVyggdXV0LmxvY2soKSk7CisgIEJPT1NUX0NIRUNLX05PX1RIUk9XKCB1dXQubG9jaygpKTsKKyAgQk9PU1RfQ0hFQ0tfTk9fVEhST1coIHV1dC51bmxvY2soKSk7CisgIEJPT1NUX0NIRUNLX05PX1RIUk9XKCB1dXQubG9jaygpKTsKKyAgQk9PU1RfQ0hFQ0tfTk9fVEhST1coIHV1dC51bmxvY2soKSk7CisgIEJPT1NUX0NIRUNLX05PX1RIUk9XKCB1dXQudW5sb2NrKCkpOworICBCT09TVF9DSEVDS19OT19USFJPVyggdXV0LnVubG9jaygpKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodHJ5bG9jaykKK3sKKyAgTXV0ZXggdXV0KE11dGV4OjpBREFQVElWRV9JTklUSUFMSVpFUik7ICAgLy8ganVzdCB1c2luZyBhbm90aGVyIGluaXRpYWxpemVyIGZvciBjb3ZlcmFnZQorCisgIEJPT1NUX0NIRUNLICAgICAgICAgKCB1dXQudHJ5bG9jaygpKTsKKyAgQk9PU1RfQ0hFQ0sgICAgICAgICAoIXV1dC50cnlsb2NrKCkpOworICBCT09TVF9DSEVDS19OT19USFJPVyggdXV0LnVubG9jaygpKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGltZWRsb2NrKQoreworICBwdGhyZWFkX3QgdGg7CisgIHN0cnVjdCBMRkFUIGxmYXQ7CisKKyAgQk9PU1RfQ0hFQ0sgICAgICAgICAoIGxmYXQudXV0LnRpbWVkbG9jaygxMDApKTsKKyAgQk9PU1RfQ0hFQ0tfVEhST1cgICAoIGxmYXQudXV0LnRpbWVkbG9jaygxMDApLAorICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtUmVzb3VyY2VFeGNlcHRpb24pOyAgICAgICAgICAgICAgICAgICAvLyBFREVBRExLIChjdXJyZW50IHRocmVhZCBvd25zIG11dGV4IC0gbG9naWMgZXJyb3IpCisgIEJPT1NUX0NIRUNLX05PX1RIUk9XKCBsZmF0LnV1dC51bmxvY2soKSk7CisKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwgICAoMCwgcHRocmVhZF9tdXRleF9sb2NrKCZsZmF0Lm14KSk7ICAgICAgICAgICAgLy8gc3luY2hyb25pemUgd2l0aCBoZWxwZXIgdGhyZWFkCisgIEJPT1NUX0NIRUNLX0VRVUFMICAgKDAsIHB0aHJlYWRfY3JlYXRlKCZ0aCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NrRnJvbUFub3RoZXJUaHJlYWQsICZsZmF0KSk7ICAgICAgICAgLy8gY3JlYXRlIGhlbHBlciB0aHJlYWQKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwgICAoMCwgcHRocmVhZF9jb25kX3dhaXQoJmxmYXQuY3YsICZsZmF0Lm14KSk7ICAgLy8gd2FpdCBmb3IgaGVscGVyIHRocmVhZCB0byBsb2NrIG11dGV4CisKKyAgQk9PU1RfQ0hFQ0sgICAgICAgICAoIWxmYXQudXV0LnRpbWVkbG9jaygxMDApKTsgICAgICAgICAgICAgICAgICAgLy8gZmFsc2U6IGFub3RoZXIgdGhyZWFkIG93bnMgdGhlIGxvY2sKKworICBCT09TVF9DSEVDS19FUVVBTCAgICgwLCBwdGhyZWFkX2NvbmRfc2lnbmFsKCZsZmF0LmN2KSk7ICAgICAgICAgICAvLyB0ZWxsIGhlbHBlciB0aHJlYWQgd2UgYXJlIGRvbmUKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwgICAoMCwgcHRocmVhZF9tdXRleF91bmxvY2soJmxmYXQubXgpKTsgICAgICAgICAgLy8gbGV0IGhlbHBlciB0aHJlYWQgY2xlYW4gdXAKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwgICAoMCwgcHRocmVhZF9qb2luKHRoLCAwKSk7ICAgICAgICAgICAgICAgICAgICAgLy8gd2FpdCBmb3IgdGVzdGluZyB0aHJlYWQgdG8gdW5sb2NrIGFuZCBiZSBkb25lCit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHVuZGVybHlpbmcpCit7CisgIE11dGV4IHV1dDsKKworICBCT09TVF9DSEVDSyAgICAgICAgICggdXV0LmdldFVuZGVybHlpbmdJbXBsKCkpOworfQorCitCT09TVF9BVVRPX1RFU1RfU1VJVEVfRU5EKCkKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9jb25jdXJyZW5jeS9SV011dGV4U3RhcnZlVGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvY29uY3VycmVuY3kvUldNdXRleFN0YXJ2ZVRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4NWEyMzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvY29uY3VycmVuY3kvUldNdXRleFN0YXJ2ZVRlc3QuY3BwCkBAIC0wLDAgKzEsMTU3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIFRoaXMgaXMgbGlua2VkIGludG8gdGhlIFVuaXRUZXN0cyB0ZXN0IGV4ZWN1dGFibGUKKworI2luY2x1ZGUgPGJvb3N0L3Rlc3QvdW5pdF90ZXN0LmhwcD4KKworI2luY2x1ZGUgInRocmlmdC9jb25jdXJyZW5jeS9NdXRleC5oIgorI2luY2x1ZGUgInRocmlmdC9jb25jdXJyZW5jeS9Qb3NpeFRocmVhZEZhY3RvcnkuaCIKKyNpbmNsdWRlIDxtZW1vcnk+CisKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKK3VzaW5nIGJvb3N0Ojp1bml0X3Rlc3Q6OnRlc3Rfc3VpdGU7Cit1c2luZyBib29zdDo6dW5pdF90ZXN0OjpmcmFtZXdvcms6Om1hc3Rlcl90ZXN0X3N1aXRlOworCit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OworCitjbGFzcyBMb2NrZXIgOiBwdWJsaWMgUnVubmFibGUgeworcHJvdGVjdGVkOgorICBMb2NrZXIoc2hhcmVkX3B0cjxSZWFkV3JpdGVNdXRleD4gcndsb2NrLCBib29sIHdyaXRlcikKKyAgICA6IHJ3bG9ja18ocndsb2NrKSwgd3JpdGVyXyh3cml0ZXIpLCBzdGFydGVkXyhmYWxzZSksIGdvdExvY2tfKGZhbHNlKSwgc2lnbmFsZWRfKGZhbHNlKSB7fQorCitwdWJsaWM6CisgIHZpcnR1YWwgdm9pZCBydW4oKSB7CisgICAgc3RhcnRlZF8gPSB0cnVlOworICAgIGlmICh3cml0ZXJfKSB7CisgICAgICByd2xvY2tfLT5hY3F1aXJlV3JpdGUoKTsKKyAgICB9IGVsc2UgeworICAgICAgcndsb2NrXy0+YWNxdWlyZVJlYWQoKTsKKyAgICB9CisgICAgZ290TG9ja18gPSB0cnVlOworICAgIHdoaWxlICghc2lnbmFsZWRfKSB7CisgICAgICB1c2xlZXAoNTAwMCk7CisgICAgfQorICAgIHJ3bG9ja18tPnJlbGVhc2UoKTsKKyAgfQorCisgIGJvb2wgc3RhcnRlZCgpIGNvbnN0IHsgcmV0dXJuIHN0YXJ0ZWRfOyB9CisgIGJvb2wgZ290TG9jaygpIGNvbnN0IHsgcmV0dXJuIGdvdExvY2tfOyB9CisgIHZvaWQgc2lnbmFsKCkgeyBzaWduYWxlZF8gPSB0cnVlOyB9CisKK3Byb3RlY3RlZDoKKyAgc2hhcmVkX3B0cjxSZWFkV3JpdGVNdXRleD4gcndsb2NrXzsKKyAgYm9vbCB3cml0ZXJfOworICB2b2xhdGlsZSBib29sIHN0YXJ0ZWRfOworICB2b2xhdGlsZSBib29sIGdvdExvY2tfOworICB2b2xhdGlsZSBib29sIHNpZ25hbGVkXzsKK307CisKK2NsYXNzIFJlYWRlciA6IHB1YmxpYyBMb2NrZXIgeworcHVibGljOgorICBSZWFkZXIoc2hhcmVkX3B0cjxSZWFkV3JpdGVNdXRleD4gcndsb2NrKSA6IExvY2tlcihyd2xvY2ssIGZhbHNlKSB7fQorfTsKKworY2xhc3MgV3JpdGVyIDogcHVibGljIExvY2tlciB7CitwdWJsaWM6CisgIFdyaXRlcihzaGFyZWRfcHRyPFJlYWRXcml0ZU11dGV4PiByd2xvY2spIDogTG9ja2VyKHJ3bG9jaywgdHJ1ZSkge30KK307CisKK3ZvaWQgdGVzdF9zdGFydmUoUG9zaXhUaHJlYWRGYWN0b3J5OjpQT0xJQ1kgcG9saWN5KSB7CisgIC8vIHRoZSBtYW4gcGFnZXMgZm9yIHB0aHJlYWRfd3Jsb2NrX3JkbG9jayBzdWdnZXN0IHRoYXQgYW55IE9TIGd1YXJhbnRlZSBhYm91dAorICAvLyB3cml0ZXIgc3RhcnZhdGlvbiBtYXkgYmUgaW5mbHVlbmNlZCBieSB0aGUgc2NoZWR1bGluZyBwb2xpY3ksIHNvIGxldCdzIHRyeQorICAvLyBhbGwgMyBwb2xpY2llcyB0byBzZWUgaWYgYW55IG9mIHRoZW0gd29yay4KKyAgUG9zaXhUaHJlYWRGYWN0b3J5IGZhY3RvcnkocG9saWN5KTsKKyAgZmFjdG9yeS5zZXREZXRhY2hlZChmYWxzZSk7CisKKyAgc2hhcmVkX3B0cjxSZWFkV3JpdGVNdXRleD4gcndsb2NrKG5ldyBOb1N0YXJ2ZVJlYWRXcml0ZU11dGV4KCkpOworCisgIHNoYXJlZF9wdHI8UmVhZGVyPiByZWFkZXIxKG5ldyBSZWFkZXIocndsb2NrKSk7CisgIHNoYXJlZF9wdHI8UmVhZGVyPiByZWFkZXIyKG5ldyBSZWFkZXIocndsb2NrKSk7CisgIHNoYXJlZF9wdHI8V3JpdGVyPiB3cml0ZXIobmV3IFdyaXRlcihyd2xvY2spKTsKKworICBzaGFyZWRfcHRyPFRocmVhZD4gdHJlYWRlcjEgPSBmYWN0b3J5Lm5ld1RocmVhZChyZWFkZXIxKTsKKyAgc2hhcmVkX3B0cjxUaHJlYWQ+IHRyZWFkZXIyID0gZmFjdG9yeS5uZXdUaHJlYWQocmVhZGVyMik7CisgIHNoYXJlZF9wdHI8VGhyZWFkPiB0d3JpdGVyID0gZmFjdG9yeS5uZXdUaHJlYWQod3JpdGVyKTsKKworICAvLyBsYXVuY2ggYSByZWFkZXIgYW5kIG1ha2Ugc3VyZSBoZSBoYXMgdGhlIGxvY2sKKyAgdHJlYWRlcjEtPnN0YXJ0KCk7CisgIHdoaWxlICghcmVhZGVyMS0+Z290TG9jaygpKSB7CisgICAgdXNsZWVwKDIwMDApOworICB9CisKKyAgLy8gbGF1bmNoIGEgd3JpdGVyIGFuZCBtYWtlIHN1cmUgaGUncyBibG9ja2VkIG9uIHRoZSBsb2NrCisgIHR3cml0ZXItPnN0YXJ0KCk7CisgIHdoaWxlICghd3JpdGVyLT5zdGFydGVkKCkpIHsKKyAgICB1c2xlZXAoMjAwMCk7CisgIH0KKyAgLy8gdHJpY2t5IHBhcnQuLi4gd2UgY2FuIG5ldmVyIGJlIDEwMCUgc3VyZSB0aGF0IHRoZSB3cml0ZXIgaXMgYWN0dWFsbHkKKyAgLy8gYmxvY2tlZCBvbiB0aGUgbG9jaywgYnV0IHdlIGNhbiBwcmV0dHkgcmVhc29uYWJseSBzdXJlIGJlY2F1c2Ugd2Uga25vdworICAvLyBoZSBqdXN0IGV4ZWN1dGVkIHRoZSBsaW5lIGltbWVkaWF0ZWx5IGJlZm9yZSBnZXR0aW5nIHRoZSBsb2NrLCBhbmQKKyAgLy8gd2UnbGwgd2FpdCBhIGZ1bGwgc2Vjb25kIGZvciBoaW0gdG8gZ2V0IG9uIGl0LgorICBzbGVlcCgxKTsKKworICAvLyBsYXVuY2ggYSBzZWNvbmQgcmVhZGVyLi4uIGlmIHRoZSBSV011dGV4IGd1YXJhbnRlZXMgdGhhdCB3cml0ZXJzIHdvbid0CisgIC8vIHN0YXJ2ZSwgdGhpcyByZWFkZXIgc2hvdWxkIG5vdCBiZSBhYmxlIHRvIGFjcXVpcmUgdGhlIGxvY2sgdW50aWwgdGhlIHdyaXRlcgorICAvLyBoYXMgYWNxdWlyZWQgYW5kIHJlbGVhc2VkIGl0LgorICB0cmVhZGVyMi0+c3RhcnQoKTsKKyAgd2hpbGUgKCFyZWFkZXIyLT5zdGFydGVkKCkpIHsKKyAgICB1c2xlZXAoMjAwMCk7CisgIH0KKyAgLy8gYWdhaW4uLi4gY2FuJ3QgYmUgMTAwJSBzdXJlIHRoZSByZWFkZXIgaXMgd2FpdGluZyBvbiAob3IgaGFzKSB0aGUgbG9jaworICAvLyBidXQgd2UgY2FuIGJlIGNsb3NlLgorICBzbGVlcCgxKTsKKworICAvLyB0ZWxsIHJlYWRlciAxIHRvIGxldCBnbyBvZiB0aGUgbG9jaworICByZWFkZXIxLT5zaWduYWwoKTsKKworICAvLyB3YWl0IGZvciBzb21lb25lIHRvIGdldCB0aGUgbG9jaworICB3aGlsZSAoIXJlYWRlcjItPmdvdExvY2soKSAmJiAhd3JpdGVyLT5nb3RMb2NrKCkpIHsKKyAgICB1c2xlZXAoMjAwMCk7CisgIH0KKworICAvLyB0aGUgdGVzdCBzdWNjZWVkZWQgaWYgdGhlIFdSSVRFUiBnb3QgdGhlIGxvY2suCisgIGJvb2wgc3VjY2VzcyA9IHdyaXRlci0+Z290TG9jaygpOworCisgIC8vIHRlbGwgZXZlcnlvbmUgd2UncmUgZG9uZSBhbmQgd2FpdCBmb3IgdGhlbSB0byBmaW5pc2gKKyAgcmVhZGVyMi0+c2lnbmFsKCk7CisgIHdyaXRlci0+c2lnbmFsKCk7CisgIHRyZWFkZXIxLT5qb2luKCk7CisgIHRyZWFkZXIyLT5qb2luKCk7CisgIHR3cml0ZXItPmpvaW4oKTsKKworICAvLyBtYWtlIHN1cmUgaXQgd29ya2VkLgorICBCT09TVF9DSEVDS19NRVNTQUdFKHN1Y2Nlc3MsICJ3cml0ZXIgaXMgc3RhcnZpbmciKTsKK30KKworQk9PU1RfQVVUT19URVNUX1NVSVRFKFJXTXV0ZXhTdGFydmVUZXN0KQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X3N0YXJ2ZV9vdGhlcikgeworICB0ZXN0X3N0YXJ2ZShQb3NpeFRocmVhZEZhY3Rvcnk6Ok9USEVSKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9zdGFydmVfcnIpIHsKKyAgdGVzdF9zdGFydmUoUG9zaXhUaHJlYWRGYWN0b3J5OjpST1VORF9ST0JJTik7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3Rfc3RhcnZlX2ZpZm8pIHsKKyAgdGVzdF9zdGFydmUoUG9zaXhUaHJlYWRGYWN0b3J5OjpGSUZPKTsKK30KKworQk9PU1RfQVVUT19URVNUX1NVSVRFX0VORCgpCmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvY29uY3VycmVuY3kvVGVzdHMuY3BwIGIvbGliL2NwcC90ZXN0L2NvbmN1cnJlbmN5L1Rlc3RzLmNwcAppbmRleCBjODBiYjg4Li5mYzBiYTdmIDEwMDY0NAotLS0gYS9saWIvY3BwL3Rlc3QvY29uY3VycmVuY3kvVGVzdHMuY3BwCisrKyBiL2xpYi9jcHAvdGVzdC9jb25jdXJyZW5jeS9UZXN0cy5jcHAKQEAgLTI1LDExICsyNSwxNSBAQAogI2luY2x1ZGUgIlRpbWVyTWFuYWdlclRlc3RzLmgiCiAjaW5jbHVkZSAiVGhyZWFkTWFuYWdlclRlc3RzLmgiCiAKKy8vIFRoZSB0ZXN0IHdlaWdodCwgd2hlcmUgMTAgaXMgMTAgdGltZXMgbW9yZSB0aHJlYWRzIHRoYW4gYmFzZWxpbmUKKy8vIGFuZCB0aGUgYmFzZWxpbmUgaXMgb3B0aW1pemVkIGZvciBydW5uaW5nIGluIHZhbGdyaW5kCitzdGF0aWMgaW50IFdFSUdIVCA9IDEwOworCiBpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKIAogICBzdGQ6OnN0cmluZyBhcmc7CiAKLSAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICBhcmdzKGFyZ2MgLSAxID4gMSA/IGFyZ2MgLSAxIDogMSk7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBhcmdzKGFyZ2MgLSAxID4gMSA/IGFyZ2MgLSAxIDogMSk7CiAKICAgYXJnc1swXSA9ICJhbGwiOwogCkBAIC0zNyw2ICs0MSwxMSBAQAogICAgIGFyZ3NbaXggLSAxXSA9IHN0ZDo6c3RyaW5nKGFyZ3ZbaXhdKTsKICAgfQogCisgIGlmIChnZXRlbnYoIlZBTEdSSU5EIikgIT0gMCkgeworCSAgLy8gbG93ZXIgdGhlIHNjYWxlIG9mIGV2ZXJ5IHRlc3QKKwkgIFdFSUdIVCA9IDE7CisgIH0KKwogICBib29sIHJ1bkFsbCA9IGFyZ3NbMF0uY29tcGFyZSgiYWxsIikgPT0gMDsKIAogICBpZiAocnVuQWxsIHx8IGFyZ3NbMF0uY29tcGFyZSgidGhyZWFkLWZhY3RvcnkiKSA9PSAwKSB7CkBAIC00NSwyNSArNTQsMzggQEAKIAogICAgIHN0ZDo6Y291dCA8PCAiVGhyZWFkRmFjdG9yeSB0ZXN0cy4uLiIgPDwgc3RkOjplbmRsOwogCi0gICAgc2l6ZV90IGNvdW50ID0gIDEwMDA7Ci0gICAgc2l6ZV90IGZsb29kTG9vcHMgPSAgMTsKLSAgICBzaXplX3QgZmxvb2RDb3VudCA9ICAxMDAwMDA7CisgICAgaW50IHJlYXBMb29wcyA9IDIgKiBXRUlHSFQ7CisgICAgaW50IHJlYXBDb3VudCA9IDEwMCAqIFdFSUdIVDsKKyAgICBzaXplX3QgZmxvb2RMb29wcyA9IDM7CisgICAgc2l6ZV90IGZsb29kQ291bnQgPSA1MDAgKiBXRUlHSFQ7CiAKLSAgICBzdGQ6OmNvdXQgPDwgIlx0XHRUaHJlYWRGYWN0b3J5IHJlYXAgTiB0aHJlYWRzIHRlc3Q6IE4gPSAiIDw8IGNvdW50IDw8IHN0ZDo6ZW5kbDsKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRUaHJlYWRGYWN0b3J5IHJlYXAgTiB0aHJlYWRzIHRlc3Q6IE4gPSAiIDw8IHJlYXBMb29wcyA8PCAieCIgPDwgcmVhcENvdW50IDw8IHN0ZDo6ZW5kbDsKIAotICAgIGFzc2VydCh0aHJlYWRGYWN0b3J5VGVzdHMucmVhcE5UaHJlYWRzKGNvdW50KSk7CisgICAgaWYgKCF0aHJlYWRGYWN0b3J5VGVzdHMucmVhcE5UaHJlYWRzKHJlYXBMb29wcywgcmVhcENvdW50KSkgeworICAgICAgc3RkOjpjZXJyIDw8ICJcdFx0dFRocmVhZEZhY3RvcnkgcmVhcCBOIHRocmVhZHMgRkFJTEVEIiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gMTsKKyAgICB9CiAKLSAgICBzdGQ6OmNvdXQgPDwgIlx0XHRUaHJlYWRGYWN0b3J5IGZsb29kTiB0aHJlYWRzIHRlc3Q6IE4gPSAiIDw8IGZsb29kQ291bnQgPDwgc3RkOjplbmRsOworICAgIHN0ZDo6Y291dCA8PCAiXHRcdFRocmVhZEZhY3RvcnkgZmxvb2QgTiB0aHJlYWRzIHRlc3Q6IE4gPSAiIDw8IGZsb29kTG9vcHMgPDwgIngiIDw8IGZsb29kQ291bnQgPDwgc3RkOjplbmRsOwogCi0gICAgYXNzZXJ0KHRocmVhZEZhY3RvcnlUZXN0cy5mbG9vZE5UZXN0KGZsb29kTG9vcHMsIGZsb29kQ291bnQpKTsKKyAgICBpZiAoIXRocmVhZEZhY3RvcnlUZXN0cy5mbG9vZE5UZXN0KGZsb29kTG9vcHMsIGZsb29kQ291bnQpKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgIlx0XHR0VGhyZWFkRmFjdG9yeSBmbG9vZCBOIHRocmVhZHMgRkFJTEVEIiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gMTsKKyAgICB9CiAKICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRUaHJlYWRGYWN0b3J5IHN5bmNocm9ub3VzIHN0YXJ0IHRlc3QiIDw8IHN0ZDo6ZW5kbDsKIAotICAgIGFzc2VydCh0aHJlYWRGYWN0b3J5VGVzdHMuc3luY2hTdGFydFRlc3QoKSk7CisgICAgaWYgKCF0aHJlYWRGYWN0b3J5VGVzdHMuc3luY2hTdGFydFRlc3QoKSkgeworICAgICAgc3RkOjpjZXJyIDw8ICJcdFx0dFRocmVhZEZhY3Rvcnkgc3luY2hyb25vdXMgc3RhcnQgRkFJTEVEIiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gMTsKKyAgICB9CiAKICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRUaHJlYWRGYWN0b3J5IG1vbml0b3IgdGltZW91dCB0ZXN0IiA8PCBzdGQ6OmVuZGw7CiAKLSAgICBhc3NlcnQodGhyZWFkRmFjdG9yeVRlc3RzLm1vbml0b3JUaW1lb3V0VGVzdCgpKTsKKyAgICBpZiAoIXRocmVhZEZhY3RvcnlUZXN0cy5tb25pdG9yVGltZW91dFRlc3QoKSkgeworICAgICAgc3RkOjpjZXJyIDw8ICJcdFx0dFRocmVhZEZhY3RvcnkgbW9uaXRvciB0aW1lb3V0IEZBSUxFRCIgPDwgc3RkOjplbmRsOworICAgICAgcmV0dXJuIDE7CisgICAgfQogICB9CiAKICAgaWYgKHJ1bkFsbCB8fCBhcmdzWzBdLmNvbXBhcmUoInV0aWwiKSA9PSAwKSB7CkBAIC04OSw3ICsxMTEsNiBAQAogICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0c2NhbGwgcGVyIG1zOiAiIDw8IGNvdW50IC8gKHRpbWUwMSAtIHRpbWUwMCkgPDwgc3RkOjplbmRsOwogICB9CiAKLQogICBpZiAocnVuQWxsIHx8IGFyZ3NbMF0uY29tcGFyZSgidGltZXItbWFuYWdlciIpID09IDApIHsKIAogICAgIHN0ZDo6Y291dCA8PCAiVGltZXJNYW5hZ2VyIHRlc3RzLi4uIiA8PCBzdGQ6OmVuZGw7CkBAIC05OCw3ICsxMTksMzggQEAKIAogICAgIFRpbWVyTWFuYWdlclRlc3RzIHRpbWVyTWFuYWdlclRlc3RzOwogCi0gICAgYXNzZXJ0KHRpbWVyTWFuYWdlclRlc3RzLnRlc3QwMCgpKTsKKyAgICBpZiAoIXRpbWVyTWFuYWdlclRlc3RzLnRlc3QwMCgpKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgIlx0XHRUaW1lck1hbmFnZXIgdGVzdHMgRkFJTEVEIiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRUaW1lck1hbmFnZXIgdGVzdDAxIiA8PCBzdGQ6OmVuZGw7CisKKyAgICBpZiAoIXRpbWVyTWFuYWdlclRlc3RzLnRlc3QwMSgpKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgIlx0XHRUaW1lck1hbmFnZXIgdGVzdHMgRkFJTEVEIiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRUaW1lck1hbmFnZXIgdGVzdDAyIiA8PCBzdGQ6OmVuZGw7CisKKyAgICBpZiAoIXRpbWVyTWFuYWdlclRlc3RzLnRlc3QwMigpKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgIlx0XHRUaW1lck1hbmFnZXIgdGVzdHMgRkFJTEVEIiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRUaW1lck1hbmFnZXIgdGVzdDAzIiA8PCBzdGQ6OmVuZGw7CisKKyAgICBpZiAoIXRpbWVyTWFuYWdlclRlc3RzLnRlc3QwMygpKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgIlx0XHRUaW1lck1hbmFnZXIgdGVzdHMgRkFJTEVEIiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRUaW1lck1hbmFnZXIgdGVzdDA0IiA8PCBzdGQ6OmVuZGw7CisKKyAgICBpZiAoIXRpbWVyTWFuYWdlclRlc3RzLnRlc3QwNCgpKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgIlx0XHRUaW1lck1hbmFnZXIgdGVzdHMgRkFJTEVEIiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gMTsKKyAgICB9CiAgIH0KIAogICBpZiAocnVuQWxsIHx8IGFyZ3NbMF0uY29tcGFyZSgidGhyZWFkLW1hbmFnZXIiKSA9PSAwKSB7CkBAIC0xMDYsMjMgKzE1OCwzNCBAQAogICAgIHN0ZDo6Y291dCA8PCAiVGhyZWFkTWFuYWdlciB0ZXN0cy4uLiIgPDwgc3RkOjplbmRsOwogCiAgICAgewotCi0gICAgICBzaXplX3Qgd29ya2VyQ291bnQgPSAxMDA7Ci0KLSAgICAgIHNpemVfdCB0YXNrQ291bnQgPSAxMDAwMDA7Ci0KKyAgICAgIHNpemVfdCB3b3JrZXJDb3VudCA9IDEwICogV0VJR0hUOworICAgICAgc2l6ZV90IHRhc2tDb3VudCA9IDUwMCAqIFdFSUdIVDsKICAgICAgIGludDY0X3QgZGVsYXkgPSAxMExMOwogCi0gICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRUaHJlYWRNYW5hZ2VyIGxvYWQgdGVzdDogd29ya2VyIGNvdW50OiAiIDw8IHdvcmtlckNvdW50IDw8ICIgdGFzayBjb3VudDogIiA8PCB0YXNrQ291bnQgPDwgIiBkZWxheTogIiA8PCBkZWxheSA8PCBzdGQ6OmVuZGw7Ci0KICAgICAgIFRocmVhZE1hbmFnZXJUZXN0cyB0aHJlYWRNYW5hZ2VyVGVzdHM7CiAKLSAgICAgIGFzc2VydCh0aHJlYWRNYW5hZ2VyVGVzdHMubG9hZFRlc3QodGFza0NvdW50LCBkZWxheSwgd29ya2VyQ291bnQpKTsKKyAgICAgIHN0ZDo6Y291dCA8PCAiXHRcdFRocmVhZE1hbmFnZXIgYXBpIHRlc3Q6IiA8PCBzdGQ6OmVuZGw7CiAKLSAgICAgIHN0ZDo6Y291dCA8PCAiXHRcdFRocmVhZE1hbmFnZXIgYmxvY2sgdGVzdDogd29ya2VyIGNvdW50OiAiIDw8IHdvcmtlckNvdW50IDw8ICIgZGVsYXk6ICIgPDwgZGVsYXkgPDwgc3RkOjplbmRsOworICAgICAgaWYgKCF0aHJlYWRNYW5hZ2VyVGVzdHMuYXBpVGVzdCgpKSB7CisgICAgICAgIHN0ZDo6Y2VyciA8PCAiXHRcdFRocmVhZE1hbmFnZXIgYXBpVGVzdCBGQUlMRUQiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CiAKLSAgICAgIGFzc2VydCh0aHJlYWRNYW5hZ2VyVGVzdHMuYmxvY2tUZXN0KGRlbGF5LCB3b3JrZXJDb3VudCkpOworICAgICAgc3RkOjpjb3V0IDw8ICJcdFx0VGhyZWFkTWFuYWdlciBsb2FkIHRlc3Q6IHdvcmtlciBjb3VudDogIiA8PCB3b3JrZXJDb3VudAorICAgICAgICAgICAgICAgIDw8ICIgdGFzayBjb3VudDogIiA8PCB0YXNrQ291bnQgPDwgIiBkZWxheTogIiA8PCBkZWxheSA8PCBzdGQ6OmVuZGw7CiAKKyAgICAgIGlmICghdGhyZWFkTWFuYWdlclRlc3RzLmxvYWRUZXN0KHRhc2tDb3VudCwgZGVsYXksIHdvcmtlckNvdW50KSkgeworICAgICAgICBzdGQ6OmNlcnIgPDwgIlx0XHRUaHJlYWRNYW5hZ2VyIGxvYWRUZXN0IEZBSUxFRCIgPDwgc3RkOjplbmRsOworICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KKworICAgICAgc3RkOjpjb3V0IDw8ICJcdFx0VGhyZWFkTWFuYWdlciBibG9jayB0ZXN0OiB3b3JrZXIgY291bnQ6ICIgPDwgd29ya2VyQ291bnQKKyAgICAgICAgICAgICAgICA8PCAiIGRlbGF5OiAiIDw8IGRlbGF5IDw8IHN0ZDo6ZW5kbDsKKworICAgICAgaWYgKCF0aHJlYWRNYW5hZ2VyVGVzdHMuYmxvY2tUZXN0KGRlbGF5LCB3b3JrZXJDb3VudCkpIHsKKyAgICAgICAgc3RkOjpjZXJyIDw8ICJcdFx0VGhyZWFkTWFuYWdlciBibG9ja1Rlc3QgRkFJTEVEIiA8PCBzdGQ6OmVuZGw7CisgICAgICAgIHJldHVybiAxOworICAgICAgfQogICAgIH0KICAgfQogCkBAIC0xMzQsMjIgKzE5NywzMCBAQAogCiAgICAgICBzaXplX3QgbWluV29ya2VyQ291bnQgPSAyOwogCi0gICAgICBzaXplX3QgbWF4V29ya2VyQ291bnQgPSA1MTI7CisgICAgICBzaXplX3QgbWF4V29ya2VyQ291bnQgPSA4OwogCi0gICAgICBzaXplX3QgdGFza3NQZXJXb3JrZXIgPSAxMDAwOworICAgICAgc2l6ZV90IHRhc2tzUGVyV29ya2VyID0gMTAwICogV0VJR0hUOwogCi0gICAgICBpbnQ2NF90IGRlbGF5ID0gMTBMTDsKKyAgICAgIGludDY0X3QgZGVsYXkgPSA1TEw7CiAKLSAgICAgIGZvciAoc2l6ZV90IHdvcmtlckNvdW50ID0gbWluV29ya2VyQ291bnQ7IHdvcmtlckNvdW50IDwgbWF4V29ya2VyQ291bnQ7IHdvcmtlckNvdW50Kj0gMikgeworICAgICAgZm9yIChzaXplX3Qgd29ya2VyQ291bnQgPSBtaW5Xb3JrZXJDb3VudDsgd29ya2VyQ291bnQgPD0gbWF4V29ya2VyQ291bnQ7IHdvcmtlckNvdW50ICo9IDQpIHsKIAogICAgICAgICBzaXplX3QgdGFza0NvdW50ID0gd29ya2VyQ291bnQgKiB0YXNrc1BlcldvcmtlcjsKIAotICAgICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRUaHJlYWRNYW5hZ2VyIGxvYWQgdGVzdDogd29ya2VyIGNvdW50OiAiIDw8IHdvcmtlckNvdW50IDw8ICIgdGFzayBjb3VudDogIiA8PCB0YXNrQ291bnQgPDwgIiBkZWxheTogIiA8PCBkZWxheSA8PCBzdGQ6OmVuZGw7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiXHRcdFRocmVhZE1hbmFnZXIgbG9hZCB0ZXN0OiB3b3JrZXIgY291bnQ6ICIgPDwgd29ya2VyQ291bnQKKyAgICAgICAgICAgICAgICAgIDw8ICIgdGFzayBjb3VudDogIiA8PCB0YXNrQ291bnQgPDwgIiBkZWxheTogIiA8PCBkZWxheSA8PCBzdGQ6OmVuZGw7CiAKICAgICAgICAgVGhyZWFkTWFuYWdlclRlc3RzIHRocmVhZE1hbmFnZXJUZXN0czsKIAotICAgICAgICB0aHJlYWRNYW5hZ2VyVGVzdHMubG9hZFRlc3QodGFza0NvdW50LCBkZWxheSwgd29ya2VyQ291bnQpOworICAgICAgICBpZiAoIXRocmVhZE1hbmFnZXJUZXN0cy5sb2FkVGVzdCh0YXNrQ291bnQsIGRlbGF5LCB3b3JrZXJDb3VudCkpCisgICAgICAgIHsKKyAgICAgICAgICBzdGQ6OmNlcnIgPDwgIlx0XHRUaHJlYWRNYW5hZ2VyIGxvYWRUZXN0IEZBSUxFRCIgPDwgc3RkOjplbmRsOworICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CiAgICAgICB9CiAgICAgfQogICB9CisKKyAgc3RkOjpjb3V0IDw8ICJBTEwgVEVTVFMgUEFTU0VEIiA8PCBzdGQ6OmVuZGw7CisgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L2NvbmN1cnJlbmN5L1RocmVhZEZhY3RvcnlUZXN0cy5oIGIvbGliL2NwcC90ZXN0L2NvbmN1cnJlbmN5L1RocmVhZEZhY3RvcnlUZXN0cy5oCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggMmQ5NzMzNy4uYmE5ODUwMgotLS0gYS9saWIvY3BwL3Rlc3QvY29uY3VycmVuY3kvVGhyZWFkRmFjdG9yeVRlc3RzLmgKKysrIGIvbGliL2NwcC90ZXN0L2NvbmN1cnJlbmN5L1RocmVhZEZhY3RvcnlUZXN0cy5oCkBAIC0yMSwxNSArMjEsMTkgQEAKICNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1BsYXRmb3JtVGhyZWFkRmFjdG9yeS5oPgogI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L011dGV4Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1V0aWwuaD4KIAogI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDx2ZWN0b3I+CiAKLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsgbmFtZXNwYWNlIHRlc3QgeworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBjb25jdXJyZW5jeSB7CituYW1lc3BhY2UgdGVzdCB7CiAKLXVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOwogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTsKIAogLyoqCkBAIC00MCwxMzIgKzQ0LDg0IEBACiBjbGFzcyBUaHJlYWRGYWN0b3J5VGVzdHMgewogCiBwdWJsaWM6Ci0KLSAgc3RhdGljIGNvbnN0IGRvdWJsZSBURVNUX1RPTEVSQU5DRTsKLQotICBjbGFzcyBUYXNrOiBwdWJsaWMgUnVubmFibGUgewotCi0gIHB1YmxpYzoKLQotICAgIFRhc2soKSB7fQotCi0gICAgdm9pZCBydW4oKSB7Ci0gICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdEhlbGxvIFdvcmxkIiA8PCBzdGQ6OmVuZGw7Ci0gICAgfQotICB9OwotCi0gIC8qKgotICAgKiBIZWxsbyB3b3JsZCB0ZXN0Ci0gICAqLwotICBib29sIGhlbGxvV29ybGRUZXN0KCkgewotCi0gICAgUGxhdGZvcm1UaHJlYWRGYWN0b3J5IHRocmVhZEZhY3RvcnkgPSBQbGF0Zm9ybVRocmVhZEZhY3RvcnkoKTsKLQotICAgIHNoYXJlZF9wdHI8VGFzaz4gdGFzayA9IHNoYXJlZF9wdHI8VGFzaz4obmV3IFRocmVhZEZhY3RvcnlUZXN0czo6VGFzaygpKTsKLQotICAgIHNoYXJlZF9wdHI8VGhyZWFkPiB0aHJlYWQgPSB0aHJlYWRGYWN0b3J5Lm5ld1RocmVhZCh0YXNrKTsKLQotICAgIHRocmVhZC0+c3RhcnQoKTsKLQotICAgIHRocmVhZC0+am9pbigpOwotCi0gICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRTdWNjZXNzISIgPDwgc3RkOjplbmRsOwotCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQogICAvKioKICAgICogUmVhcCBOIHRocmVhZHMKICAgICovCi0gIGNsYXNzIFJlYXBOVGFzazogcHVibGljIFJ1bm5hYmxlIHsKKyAgY2xhc3MgUmVhcE5UYXNrIDogcHVibGljIFJ1bm5hYmxlIHsKIAotICAgcHVibGljOgotCi0gICAgUmVhcE5UYXNrKE1vbml0b3ImIG1vbml0b3IsIGludCYgYWN0aXZlQ291bnQpIDoKLSAgICAgIF9tb25pdG9yKG1vbml0b3IpLAotICAgICAgX2NvdW50KGFjdGl2ZUNvdW50KSB7fQorICBwdWJsaWM6CisgICAgUmVhcE5UYXNrKE1vbml0b3ImIG1vbml0b3IsIGludCYgYWN0aXZlQ291bnQpIDogX21vbml0b3IobW9uaXRvciksIF9jb3VudChhY3RpdmVDb3VudCkge30KIAogICAgIHZvaWQgcnVuKCkgewogICAgICAgU3luY2hyb25pemVkIHMoX21vbml0b3IpOwotCi0gICAgICBfY291bnQtLTsKLQotICAgICAgLy9zdGQ6OmNvdXQgPDwgIlx0XHRcdHRocmVhZCBjb3VudDogIiA8PCBfY291bnQgPDwgc3RkOjplbmRsOwotCi0gICAgICBpZiAoX2NvdW50ID09IDApIHsKKyAgICAgIAorICAgICAgaWYgKC0tX2NvdW50ID09IDApIHsKICAgICAgICAgX21vbml0b3Iubm90aWZ5KCk7CiAgICAgICB9CiAgICAgfQogCiAgICAgTW9uaXRvciYgX21vbml0b3I7Ci0KICAgICBpbnQmIF9jb3VudDsKICAgfTsKIAotICBib29sIHJlYXBOVGhyZWFkcyhpbnQgbG9vcD0xLCBpbnQgY291bnQ9MTApIHsKKyAgYm9vbCByZWFwTlRocmVhZHMoaW50IGxvb3AgPSAxLCBpbnQgY291bnQgPSAxMCkgewogCi0gICAgUGxhdGZvcm1UaHJlYWRGYWN0b3J5IHRocmVhZEZhY3RvcnkgPSAgUGxhdGZvcm1UaHJlYWRGYWN0b3J5KCk7CisgICAgUGxhdGZvcm1UaHJlYWRGYWN0b3J5IHRocmVhZEZhY3RvcnkgPSBQbGF0Zm9ybVRocmVhZEZhY3RvcnkoKTsKKyAgICBzaGFyZWRfcHRyPE1vbml0b3I+IG1vbml0b3IobmV3IE1vbml0b3IpOwogCi0gICAgTW9uaXRvciogbW9uaXRvciA9IG5ldyBNb25pdG9yKCk7CisgICAgZm9yIChpbnQgbGl4ID0gMDsgbGl4IDwgbG9vcDsgbGl4KyspIHsKIAotICAgIGZvcihpbnQgbGl4ID0gMDsgbGl4IDwgbG9vcDsgbGl4KyspIHsKKyAgICAgIGludCBhY3RpdmVDb3VudCA9IDA7CiAKLSAgICAgIGludCogYWN0aXZlQ291bnQgID0gbmV3IGludChjb3VudCk7Ci0KLSAgICAgIHN0ZDo6c2V0PHNoYXJlZF9wdHI8VGhyZWFkPiA+IHRocmVhZHM7Ci0KKyAgICAgIHN0ZDo6dmVjdG9yPHNoYXJlZF9wdHI8VGhyZWFkPiA+IHRocmVhZHM7CiAgICAgICBpbnQgdGl4OwogCiAgICAgICBmb3IgKHRpeCA9IDA7IHRpeCA8IGNvdW50OyB0aXgrKykgewogICAgICAgICB0cnkgewotICAgICAgICAgIHRocmVhZHMuaW5zZXJ0KHRocmVhZEZhY3RvcnkubmV3VGhyZWFkKHNoYXJlZF9wdHI8UnVubmFibGU+KG5ldyBSZWFwTlRhc2soKm1vbml0b3IsICphY3RpdmVDb3VudCkpKSk7Ci0gICAgICAgIH0gY2F0Y2goU3lzdGVtUmVzb3VyY2VFeGNlcHRpb24mIGUpIHsKLSAgICAgICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdGZhaWxlZCB0byBjcmVhdGUgIiA8PCBsaXggKiBjb3VudCArIHRpeCA8PCAiIHRocmVhZCAiIDw8IGUud2hhdCgpIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICArK2FjdGl2ZUNvdW50OworICAgICAgICAgIHRocmVhZHMucHVzaF9iYWNrKAorICAgICAgICAgICAgICB0aHJlYWRGYWN0b3J5Lm5ld1RocmVhZChzaGFyZWRfcHRyPFJ1bm5hYmxlPihuZXcgUmVhcE5UYXNrKCptb25pdG9yLCBhY3RpdmVDb3VudCkpKSk7CisgICAgICAgIH0gY2F0Y2ggKFN5c3RlbVJlc291cmNlRXhjZXB0aW9uJiBlKSB7CisgICAgICAgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRmYWlsZWQgdG8gY3JlYXRlICIgPDwgbGl4KiBjb3VudCArIHRpeCA8PCAiIHRocmVhZCAiIDw8IGUud2hhdCgpCisgICAgICAgICAgICAgICAgICAgIDw8IHN0ZDo6ZW5kbDsKICAgICAgICAgICB0aHJvdyBlOwogICAgICAgICB9CiAgICAgICB9CiAKICAgICAgIHRpeCA9IDA7Ci0gICAgICBmb3IgKHN0ZDo6c2V0PHNoYXJlZF9wdHI8VGhyZWFkPiA+Ojpjb25zdF9pdGVyYXRvciB0aHJlYWQgPSB0aHJlYWRzLmJlZ2luKCk7IHRocmVhZCAhPSB0aHJlYWRzLmVuZCgpOyB0aXgrKywgKyt0aHJlYWQpIHsKKyAgICAgIGZvciAoc3RkOjp2ZWN0b3I8c2hhcmVkX3B0cjxUaHJlYWQ+ID46OmNvbnN0X2l0ZXJhdG9yIHRocmVhZCA9IHRocmVhZHMuYmVnaW4oKTsKKyAgICAgICAgICAgdGhyZWFkICE9IHRocmVhZHMuZW5kKCk7CisgICAgICAgICAgIHRpeCsrLCArK3RocmVhZCkgewogCiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgKCp0aHJlYWQpLT5zdGFydCgpOwotICAgICAgICB9IGNhdGNoKFN5c3RlbVJlc291cmNlRXhjZXB0aW9uJiBlKSB7Ci0gICAgICAgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRmYWlsZWQgdG8gc3RhcnQgICIgPDwgbGl4ICogY291bnQgKyB0aXggPDwgIiB0aHJlYWQgIiA8PCBlLndoYXQoKSA8PCBzdGQ6OmVuZGw7CisgICAgICAgIH0gY2F0Y2ggKFN5c3RlbVJlc291cmNlRXhjZXB0aW9uJiBlKSB7CisgICAgICAgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRmYWlsZWQgdG8gc3RhcnQgICIgPDwgbGl4KiBjb3VudCArIHRpeCA8PCAiIHRocmVhZCAiIDw8IGUud2hhdCgpCisgICAgICAgICAgICAgICAgICAgIDw8IHN0ZDo6ZW5kbDsKICAgICAgICAgICB0aHJvdyBlOwogICAgICAgICB9CiAgICAgICB9CiAKICAgICAgIHsKICAgICAgICAgU3luY2hyb25pemVkIHMoKm1vbml0b3IpOwotICAgICAgICB3aGlsZSAoKmFjdGl2ZUNvdW50ID4gMCkgeworICAgICAgICB3aGlsZSAoYWN0aXZlQ291bnQgPiAwKSB7CiAgICAgICAgICAgbW9uaXRvci0+d2FpdCgxMDAwKTsKICAgICAgICAgfQogICAgICAgfQotICAgICAgZGVsZXRlIGFjdGl2ZUNvdW50OwotICAgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRyZWFwZWQgIiA8PCBsaXggKiBjb3VudCA8PCAiIHRocmVhZHMiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIAorICAgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRyZWFwZWQgIiA8PCBsaXgqIGNvdW50IDw8ICIgdGhyZWFkcyIgPDwgc3RkOjplbmRsOwogICAgIH0KIAogICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0U3VjY2VzcyEiIDw8IHN0ZDo6ZW5kbDsKLQogICAgIHJldHVybiB0cnVlOwogICB9CiAKLSAgY2xhc3MgU3luY2hTdGFydFRhc2s6IHB1YmxpYyBSdW5uYWJsZSB7CisgIGNsYXNzIFN5bmNoU3RhcnRUYXNrIDogcHVibGljIFJ1bm5hYmxlIHsKIAotICAgcHVibGljOgorICBwdWJsaWM6CisgICAgZW51bSBTVEFURSB7IFVOSU5JVElBTElaRUQsIFNUQVJUSU5HLCBTVEFSVEVELCBTVE9QUElORywgU1RPUFBFRCB9OwogCi0gICAgZW51bSBTVEFURSB7Ci0gICAgICBVTklOSVRJQUxJWkVELAotICAgICAgU1RBUlRJTkcsCi0gICAgICBTVEFSVEVELAotICAgICAgU1RPUFBJTkcsCi0gICAgICBTVE9QUEVECi0gICAgfTsKLQotICAgIFN5bmNoU3RhcnRUYXNrKE1vbml0b3ImIG1vbml0b3IsIHZvbGF0aWxlICBTVEFURSYgc3RhdGUpIDoKLSAgICAgIF9tb25pdG9yKG1vbml0b3IpLAotICAgICAgX3N0YXRlKHN0YXRlKSB7fQorICAgIFN5bmNoU3RhcnRUYXNrKE1vbml0b3ImIG1vbml0b3IsIHZvbGF0aWxlIFNUQVRFJiBzdGF0ZSkgOiBfbW9uaXRvcihtb25pdG9yKSwgX3N0YXRlKHN0YXRlKSB7fQogCiAgICAgdm9pZCBydW4oKSB7CiAgICAgICB7CkBAIC0xODksOSArMTQ1LDkgQEAKICAgICAgIH0KICAgICB9CiAKLSAgIHByaXZhdGU6CisgIHByaXZhdGU6CiAgICAgTW9uaXRvciYgX21vbml0b3I7Ci0gICAgdm9sYXRpbGUgIFNUQVRFJiBfc3RhdGU7CisgICAgdm9sYXRpbGUgU1RBVEUmIF9zdGF0ZTsKICAgfTsKIAogICBib29sIHN5bmNoU3RhcnRUZXN0KCkgewpAQCAtMjAwLDkgKzE1NiwxMCBAQAogCiAgICAgU3luY2hTdGFydFRhc2s6OlNUQVRFIHN0YXRlID0gU3luY2hTdGFydFRhc2s6OlVOSU5JVElBTElaRUQ7CiAKLSAgICBzaGFyZWRfcHRyPFN5bmNoU3RhcnRUYXNrPiB0YXNrID0gc2hhcmVkX3B0cjxTeW5jaFN0YXJ0VGFzaz4obmV3IFN5bmNoU3RhcnRUYXNrKG1vbml0b3IsIHN0YXRlKSk7CisgICAgc2hhcmVkX3B0cjxTeW5jaFN0YXJ0VGFzaz4gdGFzaworICAgICAgICA9IHNoYXJlZF9wdHI8U3luY2hTdGFydFRhc2s+KG5ldyBTeW5jaFN0YXJ0VGFzayhtb25pdG9yLCBzdGF0ZSkpOwogCi0gICAgUGxhdGZvcm1UaHJlYWRGYWN0b3J5IHRocmVhZEZhY3RvcnkgPSAgUGxhdGZvcm1UaHJlYWRGYWN0b3J5KCk7CisgICAgUGxhdGZvcm1UaHJlYWRGYWN0b3J5IHRocmVhZEZhY3RvcnkgPSBQbGF0Zm9ybVRocmVhZEZhY3RvcnkoKTsKIAogICAgIHNoYXJlZF9wdHI8VGhyZWFkPiB0aHJlYWQgPSB0aHJlYWRGYWN0b3J5Lm5ld1RocmVhZCh0YXNrKTsKIApAQCAtMjI2LDggKzE4Myw4IEBACiAgICAgICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yKTsKIAogICAgICAgdHJ5IHsKLSAgICAgICAgICBtb25pdG9yLndhaXQoMTAwKTsKLSAgICAgIH0gY2F0Y2goVGltZWRPdXRFeGNlcHRpb24mIGUpIHsKKyAgICAgICAgbW9uaXRvci53YWl0KDEwMCk7CisgICAgICB9IGNhdGNoIChUaW1lZE91dEV4Y2VwdGlvbiYpIHsKICAgICAgIH0KIAogICAgICAgaWYgKHN0YXRlID09IFN5bmNoU3RhcnRUYXNrOjpTVEFSVEVEKSB7CkBAIC0yNTEsMTAzICsyMDgsMTAyIEBACiAgICAgcmV0dXJuIHRydWU7CiAgIH0KIAotICAvKiogU2VlIGhvdyBhY2N1cmF0ZSBtb25pdG9yIHRpbWVvdXQgaXMuICovCisgIC8qKgorICAgKiBUaGUgb25seSBndWFyYW50ZWUgYSBtb25pdG9yIHRpbWVvdXQgY2FuIGdpdmUgeW91IGlzIHRoYXQKKyAgICogaXQgd2lsbCB0YWtlICJhdCBsZWFzdCIgYXMgbG9uZyBhcyB0aGUgdGltZW91dCwgbm8gbGVzcy4KKyAgICogVGhlcmUgaXMgYWJzb2x1dGVseSBubyBndWFyYW50ZWUgYXJvdW5kIHJlZ2FpbmluZyBleGVjdXRpb24KKyAgICogbmVhciB0aGUgdGltZW91dC4gIE9uIGEgYnVzeSBzeXN0ZW0gKGxpa2UgaW5zaWRlIGEgdGhpcmQgcGFydHkKKyAgICogQ0kgZW52aXJvbm1lbnQpIGl0IGNvdWxkIHRha2UgcXVpdGUgYSBiaXQgbG9uZ2VyIHRoYW4gdGhlCisgICAqIHJlcXVlc3RlZCB0aW1lb3V0LCBhbmQgdGhhdCdzIG9rLgorICAgKi8KIAotICBib29sIG1vbml0b3JUaW1lb3V0VGVzdChzaXplX3QgY291bnQ9MTAwMCwgaW50NjRfdCB0aW1lb3V0PTEwKSB7CisgIGJvb2wgbW9uaXRvclRpbWVvdXRUZXN0KGludDY0X3QgY291bnQgPSAxMDAwLCBpbnQ2NF90IHRpbWVvdXQgPSAyKSB7CiAKICAgICBNb25pdG9yIG1vbml0b3I7CiAKICAgICBpbnQ2NF90IHN0YXJ0VGltZSA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7CiAKLSAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgY291bnQ7IGl4KyspIHsKKyAgICBmb3IgKGludDY0X3QgaXggPSAwOyBpeCA8IGNvdW50OyBpeCsrKSB7CiAgICAgICB7CiAgICAgICAgIFN5bmNocm9uaXplZCBzKG1vbml0b3IpOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgbW9uaXRvci53YWl0KHRpbWVvdXQpOwotICAgICAgICB9IGNhdGNoKFRpbWVkT3V0RXhjZXB0aW9uJiBlKSB7CisgICAgICAgICAgbW9uaXRvci53YWl0KHRpbWVvdXQpOworICAgICAgICB9IGNhdGNoIChUaW1lZE91dEV4Y2VwdGlvbiYpIHsKICAgICAgICAgfQogICAgICAgfQogICAgIH0KIAogICAgIGludDY0X3QgZW5kVGltZSA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7CiAKLSAgICBkb3VibGUgZXJyb3IgPSAoKGVuZFRpbWUgLSBzdGFydFRpbWUpIC0gKGNvdW50ICogdGltZW91dCkpIC8gKGRvdWJsZSkoY291bnQgKiB0aW1lb3V0KTsKKyAgYm9vbCBzdWNjZXNzID0gKGVuZFRpbWUgLSBzdGFydFRpbWUpID49IChjb3VudCAqIHRpbWVvdXQpOwogCi0gICAgaWYgKGVycm9yIDwgMC4wKSAgewotCi0gICAgICBlcnJvciAqPSAxLjA7Ci0gICAgfQotCi0gICAgYm9vbCBzdWNjZXNzID0gZXJyb3IgPCBUaHJlYWRGYWN0b3J5VGVzdHM6OlRFU1RfVE9MRVJBTkNFOwotCi0gICAgc3RkOjpjb3V0IDw8ICJcdFx0XHQiIDw8IChzdWNjZXNzID8gIlN1Y2Nlc3MiIDogIkZhaWx1cmUiKSA8PCAiISBleHBlY3RlZCB0aW1lOiAiIDw8IGNvdW50ICogdGltZW91dCA8PCAibXMgZWxhcHNlZCB0aW1lOiAiPDwgZW5kVGltZSAtIHN0YXJ0VGltZSA8PCAibXMgZXJyb3IlOiAiIDw8IGVycm9yICogMTAwLjAgPDwgc3RkOjplbmRsOworICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0IiA8PCAoc3VjY2VzcyA/ICJTdWNjZXNzIiA6ICJGYWlsdXJlIikKKyAgICAgICAgICAgICAgPDwgIjogbWluaW11bSByZXF1aXJlZCB0aW1lIHRvIGVsYXBzZSAiIDw8IGNvdW50ICogdGltZW91dAorICAgICAgICAgICAgICA8PCAibXM7IGFjdHVhbCBlbGFwc2VkIHRpbWUgIiA8PCBlbmRUaW1lIC0gc3RhcnRUaW1lIDw8ICJtcyIKKyAgICAgICAgICAgICAgPDwgc3RkOjplbmRsOwogCiAgICAgcmV0dXJuIHN1Y2Nlc3M7CiAgIH0KIAotCiAgIGNsYXNzIEZsb29kVGFzayA6IHB1YmxpYyBSdW5uYWJsZSB7CiAgIHB1YmxpYzoKLQotICAgIEZsb29kVGFzayhjb25zdCBzaXplX3QgaWQpIDpfaWQoaWQpIHt9Ci0gICAgfkZsb29kVGFzaygpewotICAgICAgaWYoX2lkICUgMTAwMCA9PSAwKSB7CisgICAgRmxvb2RUYXNrKGNvbnN0IHNpemVfdCBpZCwgTW9uaXRvciYgbW9uKSA6IF9pZChpZCksIF9tb24obW9uKSB7fQorICAgIH5GbG9vZFRhc2soKSB7CisgICAgICBpZiAoX2lkICUgMTAwMDAgPT0gMCkgeworCQlTeW5jaHJvbml6ZWQgc3luYyhfbW9uKTsKICAgICAgICAgc3RkOjpjb3V0IDw8ICJcdFx0dGhyZWFkICIgPDwgX2lkIDw8ICIgZG9uZSIgPDwgc3RkOjplbmRsOwogICAgICAgfQogICAgIH0KIAotICAgIHZvaWQgcnVuKCl7Ci0gICAgICBpZihfaWQgJSAxMDAwID09IDApIHsKKyAgICB2b2lkIHJ1bigpIHsKKyAgICAgIGlmIChfaWQgJSAxMDAwMCA9PSAwKSB7CisJCVN5bmNocm9uaXplZCBzeW5jKF9tb24pOwogICAgICAgICBzdGQ6OmNvdXQgPDwgIlx0XHR0aHJlYWQgIiA8PCBfaWQgPDwgIiBzdGFydGVkIiA8PCBzdGQ6OmVuZGw7CiAgICAgICB9Ci0KLSAgICAgIFRIUklGVF9TTEVFUF9VU0VDKDEpOwogICAgIH0KICAgICBjb25zdCBzaXplX3QgX2lkOworICAgIE1vbml0b3ImIF9tb247CiAgIH07CiAKLSAgdm9pZCBmb28oUGxhdGZvcm1UaHJlYWRGYWN0b3J5ICp0ZikgewotICAgICh2b2lkKSB0ZjsKLSAgfQorICB2b2lkIGZvbyhQbGF0Zm9ybVRocmVhZEZhY3RvcnkqIHRmKSB7ICh2b2lkKXRmOyB9CiAKLSAgYm9vbCBmbG9vZE5UZXN0KHNpemVfdCBsb29wPTEsIHNpemVfdCBjb3VudD0xMDAwMDApIHsKKyAgYm9vbCBmbG9vZE5UZXN0KHNpemVfdCBsb29wID0gMSwgc2l6ZV90IGNvdW50ID0gMTAwMDAwKSB7CiAKICAgICBib29sIHN1Y2Nlc3MgPSBmYWxzZTsKLQotICAgIGZvcihzaXplX3QgbGl4ID0gMDsgbGl4IDwgbG9vcDsgbGl4KyspIHsKKyAgICBNb25pdG9yIG1vbjsKKwkKKyAgICBmb3IgKHNpemVfdCBsaXggPSAwOyBsaXggPCBsb29wOyBsaXgrKykgewogCiAgICAgICBQbGF0Zm9ybVRocmVhZEZhY3RvcnkgdGhyZWFkRmFjdG9yeSA9IFBsYXRmb3JtVGhyZWFkRmFjdG9yeSgpOwogICAgICAgdGhyZWFkRmFjdG9yeS5zZXREZXRhY2hlZCh0cnVlKTsKIAotICAgICAgICBmb3Ioc2l6ZV90IHRpeCA9IDA7IHRpeCA8IGNvdW50OyB0aXgrKykgeworICAgICAgZm9yIChzaXplX3QgdGl4ID0gMDsgdGl4IDwgY291bnQ7IHRpeCsrKSB7CiAKLSAgICAgICAgICB0cnkgeworICAgICAgICB0cnkgewogCi0gICAgICAgICAgICBzaGFyZWRfcHRyPEZsb29kVGFzaz4gdGFzayhuZXcgRmxvb2RUYXNrKGxpeCAqIGNvdW50ICsgdGl4ICkpOworICAgICAgICAgIHNoYXJlZF9wdHI8Rmxvb2RUYXNrPiB0YXNrKG5ldyBGbG9vZFRhc2sobGl4ICogY291bnQgKyB0aXgsIG1vbikpOworICAgICAgICAgIHNoYXJlZF9wdHI8VGhyZWFkPiB0aHJlYWQgPSB0aHJlYWRGYWN0b3J5Lm5ld1RocmVhZCh0YXNrKTsKKyAgICAgICAgICB0aHJlYWQtPnN0YXJ0KCk7CiAKLSAgICAgICAgICAgIHNoYXJlZF9wdHI8VGhyZWFkPiB0aHJlYWQgPSB0aHJlYWRGYWN0b3J5Lm5ld1RocmVhZCh0YXNrKTsKKyAgICAgICAgfSBjYXRjaCAoVEV4Y2VwdGlvbiYgZSkgewogCi0gICAgICAgICAgICB0aHJlYWQtPnN0YXJ0KCk7CisgICAgICAgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRmYWlsZWQgdG8gc3RhcnQgICIgPDwgbGl4KiBjb3VudCArIHRpeCA8PCAiIHRocmVhZCAiIDw8IGUud2hhdCgpCisgICAgICAgICAgICAgICAgICAgIDw8IHN0ZDo6ZW5kbDsKIAotICAgICAgICAgICAgVEhSSUZUX1NMRUVQX1VTRUMoMSk7Ci0KLSAgICAgICAgICB9IGNhdGNoIChURXhjZXB0aW9uJiBlKSB7Ci0KLSAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0ZmFpbGVkIHRvIHN0YXJ0ICAiIDw8IGxpeCAqIGNvdW50ICsgdGl4IDw8ICIgdGhyZWFkICIgPDwgZS53aGF0KCkgPDwgc3RkOjplbmRsOwotCi0gICAgICAgICAgICByZXR1cm4gc3VjY2VzczsKLSAgICAgICAgICB9CisgICAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7CiAgICAgICAgIH0KKyAgICAgIH0KIAotICAgICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdGZsb29kZWQgIiA8PCAobGl4ICsgMSkgKiBjb3VudCA8PCAiIHRocmVhZHMiIDw8IHN0ZDo6ZW5kbDsKLQotICAgICAgICBzdWNjZXNzID0gdHJ1ZTsKKyAgICAgIFN5bmNocm9uaXplZCBzeW5jKG1vbik7CisgICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdGZsb29kZWQgIiA8PCAobGl4ICsgMSkgKiBjb3VudCA8PCAiIHRocmVhZHMiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHN1Y2Nlc3MgPSB0cnVlOwogICAgIH0KIAogICAgIHJldHVybiBzdWNjZXNzOwogICB9CiB9OwogCi1jb25zdCBkb3VibGUgVGhyZWFkRmFjdG9yeVRlc3RzOjpURVNUX1RPTEVSQU5DRSA9IC4yMDsKLQotfX19fSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OnRlc3QKK30KK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5Ojp0ZXN0CmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlclRlc3RzLmggYi9saWIvY3BwL3Rlc3QvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlclRlc3RzLmgKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCBjMDg0NDhiLi5kNmMwOTJkCi0tLSBhL2xpYi9jcHAvdGVzdC9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyVGVzdHMuaAorKysgYi9saWIvY3BwL3Rlc3QvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlclRlc3RzLmgKQEAgLTI0LDQ1ICsyNCw1MSBAQAogI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9VdGlsLmg+CiAKICNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxkZXF1ZT4KICNpbmNsdWRlIDxzZXQ+CiAjaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8c2V0PgogI2luY2x1ZGUgPHN0ZGludC5oPgogCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBjb25jdXJyZW5jeSB7IG5hbWVzcGFjZSB0ZXN0IHsKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgY29uY3VycmVuY3kgeworbmFtZXNwYWNlIHRlc3QgewogCiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OwogCitzdGF0aWMgc3RkOjpkZXF1ZTxzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+ID4gbV9leHBpcmVkOworc3RhdGljIHZvaWQgZXhwaXJlZE5vdGlmaWVyKHN0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGUpCit7CisgIG1fZXhwaXJlZC5wdXNoX2JhY2socnVubmFibGUpOworfQorCitzdGF0aWMgdm9pZCBzbGVlcF8oaW50NjRfdCBtaWxsaXNlYykgeworICBNb25pdG9yIF9zbGVlcDsKKyAgU3luY2hyb25pemVkIHMoX3NsZWVwKTsKKworICB0cnkgeworICAgIF9zbGVlcC53YWl0KG1pbGxpc2VjKTsKKyAgfSBjYXRjaCAoVGltZWRPdXRFeGNlcHRpb24mKSB7CisgICAgOworICB9IGNhdGNoICguLi4pIHsKKyAgICBhc3NlcnQoMCk7CisgIH0KK30KKwogY2xhc3MgVGhyZWFkTWFuYWdlclRlc3RzIHsKIAotICBzdGF0aWMgY29uc3QgZG91YmxlIFRFU1RfVE9MRVJBTkNFOwotCiBwdWJsaWM6Ci0gIGNsYXNzIFRhc2s6IHB1YmxpYyBSdW5uYWJsZSB7CisgIGNsYXNzIFRhc2sgOiBwdWJsaWMgUnVubmFibGUgewogCiAgIHB1YmxpYzoKLQotICAgIFRhc2soTW9uaXRvciYgbW9uaXRvciwgc2l6ZV90JiBjb3VudCwgaW50NjRfdCB0aW1lb3V0KSA6Ci0gICAgICBfbW9uaXRvcihtb25pdG9yKSwKLSAgICAgIF9jb3VudChjb3VudCksCi0gICAgICBfdGltZW91dCh0aW1lb3V0KSwKLSAgICAgIF9kb25lKGZhbHNlKSB7fQorICAgIFRhc2soTW9uaXRvciYgbW9uaXRvciwgc2l6ZV90JiBjb3VudCwgaW50NjRfdCB0aW1lb3V0KQorICAgICAgOiBfbW9uaXRvcihtb25pdG9yKSwgX2NvdW50KGNvdW50KSwgX3RpbWVvdXQodGltZW91dCksIF9zdGFydFRpbWUoMCksIF9lbmRUaW1lKDApLCBfZG9uZShmYWxzZSkge30KIAogICAgIHZvaWQgcnVuKCkgewogCiAgICAgICBfc3RhcnRUaW1lID0gVXRpbDo6Y3VycmVudFRpbWUoKTsKIAotICAgICAgewotICAgICAgICBTeW5jaHJvbml6ZWQgcyhfc2xlZXApOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgX3NsZWVwLndhaXQoX3RpbWVvdXQpOwotICAgICAgICB9IGNhdGNoKFRpbWVkT3V0RXhjZXB0aW9uJiBlKSB7Ci0gICAgICAgICAgOwotICAgICAgICB9Y2F0Y2goLi4uKSB7Ci0gICAgICAgICAgYXNzZXJ0KDApOwotICAgICAgICB9Ci0gICAgICB9CisgICAgICBzbGVlcF8oX3RpbWVvdXQpOwogCiAgICAgICBfZW5kVGltZSA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7CiAKQEAgLTc0LDkgKzgwLDcgQEAKICAgICAgICAgLy8gc3RkOjpjb3V0IDw8ICJUaHJlYWQgIiA8PCBfY291bnQgPDwgIiBjb21wbGV0ZWQgIiA8PCBzdGQ6OmVuZGw7CiAKICAgICAgICAgX2NvdW50LS07Ci0KLSAgICAgICAgaWYgKF9jb3VudCA9PSAwKSB7Ci0KKyAgICAgICAgaWYgKF9jb3VudCAlIDEwMDAwID09IDApIHsKICAgICAgICAgICBfbW9uaXRvci5ub3RpZnkoKTsKICAgICAgICAgfQogICAgICAgfQpAQCAtOTYsNyArMTAwLDcgQEAKICAgICogY29tcGxldGVzLiBWZXJpZnkgdGhhdCBhbGwgdGFza3MgY29tcGxldGVkIGFuZCB0aGF0IHRocmVhZCBtYW5hZ2VyIGNsZWFucwogICAgKiB1cCBwcm9wZXJseSBvbiBkZWxldGUuCiAgICAqLwotICBib29sIGxvYWRUZXN0KHNpemVfdCBjb3VudD0xMDAsIGludDY0X3QgdGltZW91dD0xMDBMTCwgc2l6ZV90IHdvcmtlckNvdW50PTQpIHsKKyAgYm9vbCBsb2FkVGVzdChzaXplX3QgY291bnQgPSAxMDAsIGludDY0X3QgdGltZW91dCA9IDEwMExMLCBzaXplX3Qgd29ya2VyQ291bnQgPSA0KSB7CiAKICAgICBNb25pdG9yIG1vbml0b3I7CiAKQEAgLTEwNCw5ICsxMDgsMTAgQEAKIAogICAgIHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlciA9IFRocmVhZE1hbmFnZXI6Om5ld1NpbXBsZVRocmVhZE1hbmFnZXIod29ya2VyQ291bnQpOwogCi0gICAgc2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnkgPSBzaGFyZWRfcHRyPFBsYXRmb3JtVGhyZWFkRmFjdG9yeT4obmV3IFBsYXRmb3JtVGhyZWFkRmFjdG9yeSgpKTsKKyAgICBzaGFyZWRfcHRyPFBsYXRmb3JtVGhyZWFkRmFjdG9yeT4gdGhyZWFkRmFjdG9yeQorICAgICAgICA9IHNoYXJlZF9wdHI8UGxhdGZvcm1UaHJlYWRGYWN0b3J5PihuZXcgUGxhdGZvcm1UaHJlYWRGYWN0b3J5KGZhbHNlKSk7CiAKLSNpZm5kZWYgVVNFX0JPT1NUX1RIUkVBRAorI2lmICFVU0VfU1REX1RIUkVBRAogICAgIHRocmVhZEZhY3RvcnktPnNldFByaW9yaXR5KFBvc2l4VGhyZWFkRmFjdG9yeTo6SElHSEVTVCk7CiAjZW5kaWYKICAgICB0aHJlYWRNYW5hZ2VyLT50aHJlYWRGYWN0b3J5KHRocmVhZEZhY3RvcnkpOwpAQCAtMTE3LDIxICsxMjIsMjYgQEAKIAogICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCBjb3VudDsgaXgrKykgewogCi0gICAgICB0YXNrcy5pbnNlcnQoc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyVGVzdHM6OlRhc2s+KG5ldyBUaHJlYWRNYW5hZ2VyVGVzdHM6OlRhc2sobW9uaXRvciwgYWN0aXZlQ291bnQsIHRpbWVvdXQpKSk7CisgICAgICB0YXNrcy5pbnNlcnQoc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyVGVzdHM6OlRhc2s+KAorICAgICAgICAgIG5ldyBUaHJlYWRNYW5hZ2VyVGVzdHM6OlRhc2sobW9uaXRvciwgYWN0aXZlQ291bnQsIHRpbWVvdXQpKSk7CiAgICAgfQogCiAgICAgaW50NjRfdCB0aW1lMDAgPSBVdGlsOjpjdXJyZW50VGltZSgpOwogCi0gICAgZm9yIChzdGQ6OnNldDxzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXJUZXN0czo6VGFzaz4gPjo6aXRlcmF0b3IgaXggPSB0YXNrcy5iZWdpbigpOyBpeCAhPSB0YXNrcy5lbmQoKTsgaXgrKykgeworICAgIGZvciAoc3RkOjpzZXQ8c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyVGVzdHM6OlRhc2s+ID46Oml0ZXJhdG9yIGl4ID0gdGFza3MuYmVnaW4oKTsKKyAgICAgICAgIGl4ICE9IHRhc2tzLmVuZCgpOworICAgICAgICAgaXgrKykgewogCi0gICAgICAgIHRocmVhZE1hbmFnZXItPmFkZCgqaXgpOworICAgICAgdGhyZWFkTWFuYWdlci0+YWRkKCppeCk7CiAgICAgfQogCisgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRcdGxvYWRlZCAiIDw8IGNvdW50IDw8ICIgdGFza3MgdG8gZXhlY3V0ZSIgPDwgc3RkOjplbmRsOworCiAgICAgewogICAgICAgU3luY2hyb25pemVkIHMobW9uaXRvcik7CiAKLSAgICAgIHdoaWxlKGFjdGl2ZUNvdW50ID4gMCkgewotCisgICAgICB3aGlsZSAoYWN0aXZlQ291bnQgPiAwKSB7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0XHRhY3RpdmVDb3VudCA9ICIgPDwgYWN0aXZlQ291bnQgPDwgc3RkOjplbmRsOwogICAgICAgICBtb25pdG9yLndhaXQoKTsKICAgICAgIH0KICAgICB9CkBAIC0xNDUsNyArMTU1LDkgQEAKICAgICBpbnQ2NF90IG1pblRpbWUgPSA5MjIzMzcyMDM2ODU0Nzc1ODA3TEw7CiAgICAgaW50NjRfdCBtYXhUaW1lID0gMDsKIAotICAgIGZvciAoc3RkOjpzZXQ8c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyVGVzdHM6OlRhc2s+ID46Oml0ZXJhdG9yIGl4ID0gdGFza3MuYmVnaW4oKTsgaXggIT0gdGFza3MuZW5kKCk7IGl4KyspIHsKKyAgICBmb3IgKHN0ZDo6c2V0PHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlclRlc3RzOjpUYXNrPiA+OjppdGVyYXRvciBpeCA9IHRhc2tzLmJlZ2luKCk7CisgICAgICAgICBpeCAhPSB0YXNrcy5lbmQoKTsKKyAgICAgICAgIGl4KyspIHsKIAogICAgICAgc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyVGVzdHM6OlRhc2s+IHRhc2sgPSAqaXg7CiAKQEAgLTE2OSw1OSArMTgxLDU3IEBACiAgICAgICAgIG1heFRpbWUgPSBkZWx0YTsKICAgICAgIH0KIAotICAgICAgYXZlcmFnZVRpbWUrPSBkZWx0YTsKKyAgICAgIGF2ZXJhZ2VUaW1lICs9IGRlbHRhOwogICAgIH0KIAogICAgIGF2ZXJhZ2VUaW1lIC89IGNvdW50OwogCi0gICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRmaXJzdCBzdGFydDogIiA8PCBmaXJzdFRpbWUgPDwgIm1zIExhc3QgZW5kOiAiIDw8IGxhc3RUaW1lIDw8ICJtcyBtaW46ICIgPDwgbWluVGltZSA8PCAibXMgbWF4OiAiIDw8IG1heFRpbWUgPDwgIm1zIGF2ZXJhZ2U6ICIgPDwgYXZlcmFnZVRpbWUgPDwgIm1zIiA8PCBzdGQ6OmVuZGw7CisgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRmaXJzdCBzdGFydDogIiA8PCBmaXJzdFRpbWUgPDwgIiBMYXN0IGVuZDogIiA8PCBsYXN0VGltZQorICAgICAgICAgICAgICA8PCAiIG1pbjogIiA8PCBtaW5UaW1lIDw8ICJtcyBtYXg6ICIgPDwgbWF4VGltZSA8PCAibXMgYXZlcmFnZTogIiA8PCBhdmVyYWdlVGltZQorICAgICAgICAgICAgICA8PCAibXMiIDw8IHN0ZDo6ZW5kbDsKIAotICAgIGRvdWJsZSBleHBlY3RlZFRpbWUgPSAoKGNvdW50ICsgKHdvcmtlckNvdW50IC0gMSkpIC8gd29ya2VyQ291bnQpICogdGltZW91dDsKKyAgICBib29sIHN1Y2Nlc3MgPSAodGltZTAxIC0gdGltZTAwKSA+PSAoKGludDY0X3QpY291bnQgKiB0aW1lb3V0KSAvIChpbnQ2NF90KXdvcmtlckNvdW50OwogCi0gICAgZG91YmxlIGVycm9yID0gKCh0aW1lMDEgLSB0aW1lMDApIC0gZXhwZWN0ZWRUaW1lKSAvIGV4cGVjdGVkVGltZTsKLQotICAgIGlmIChlcnJvciA8IDApIHsKLSAgICAgIGVycm9yKj0gLTEuMDsKLSAgICB9Ci0KLSAgICBib29sIHN1Y2Nlc3MgPSBlcnJvciA8IFRFU1RfVE9MRVJBTkNFOwotCi0gICAgc3RkOjpjb3V0IDw8ICJcdFx0XHQiIDw8IChzdWNjZXNzID8gIlN1Y2Nlc3MiIDogIkZhaWx1cmUiKSA8PCAiISBleHBlY3RlZCB0aW1lOiAiIDw8IGV4cGVjdGVkVGltZSA8PCAibXMgZWxhcHNlZCB0aW1lOiAiPDwgdGltZTAxIC0gdGltZTAwIDw8ICJtcyBlcnJvciU6ICIgPDwgZXJyb3IgKiAxMDAuMCA8PCBzdGQ6OmVuZGw7CisgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHQiIDw8IChzdWNjZXNzID8gIlN1Y2Nlc3MiIDogIkZhaWx1cmUiKQorICAgICAgICAgICAgICA8PCAiISBleHBlY3RlZCB0aW1lOiAiIDw8ICgoaW50NjRfdCljb3VudCAqIHRpbWVvdXQpIC8gKGludDY0X3Qpd29ya2VyQ291bnQgPDwgIm1zIGVsYXBzZWQgdGltZTogIiA8PCB0aW1lMDEgLSB0aW1lMDAKKyAgICAgICAgICAgICAgPDwgIm1zIiA8PCBzdGQ6OmVuZGw7CiAKICAgICByZXR1cm4gc3VjY2VzczsKICAgfQogCi0gIGNsYXNzIEJsb2NrVGFzazogcHVibGljIFJ1bm5hYmxlIHsKKyAgY2xhc3MgQmxvY2tUYXNrIDogcHVibGljIFJ1bm5hYmxlIHsKIAogICBwdWJsaWM6Ci0KLSAgICBCbG9ja1Rhc2soTW9uaXRvciYgbW9uaXRvciwgTW9uaXRvciYgYm1vbml0b3IsIHNpemVfdCYgY291bnQpIDoKLSAgICAgIF9tb25pdG9yKG1vbml0b3IpLAotICAgICAgX2Jtb25pdG9yKGJtb25pdG9yKSwKLSAgICAgIF9jb3VudChjb3VudCkge30KKyAgICBCbG9ja1Rhc2soTW9uaXRvciYgZW50cnlNb25pdG9yLCBNb25pdG9yJiBibG9ja01vbml0b3IsIGJvb2wmIGJsb2NrZWQsIE1vbml0b3ImIGRvbmVNb25pdG9yLCBzaXplX3QmIGNvdW50KQorICAgICAgOiBfZW50cnlNb25pdG9yKGVudHJ5TW9uaXRvciksIF9lbnRlcmVkKGZhbHNlKSwgX2Jsb2NrTW9uaXRvcihibG9ja01vbml0b3IpLCBfYmxvY2tlZChibG9ja2VkKSwgX2RvbmVNb25pdG9yKGRvbmVNb25pdG9yKSwgX2NvdW50KGNvdW50KSB7fQogCiAgICAgdm9pZCBydW4oKSB7CiAgICAgICB7Ci0gICAgICAgIFN5bmNocm9uaXplZCBzKF9ibW9uaXRvcik7Ci0KLSAgICAgICAgX2Jtb25pdG9yLndhaXQoKTsKLQorICAgICAgICBTeW5jaHJvbml6ZWQgcyhfZW50cnlNb25pdG9yKTsKKyAgICAgICAgX2VudGVyZWQgPSB0cnVlOworICAgICAgICBfZW50cnlNb25pdG9yLm5vdGlmeSgpOwogICAgICAgfQogCiAgICAgICB7Ci0gICAgICAgIFN5bmNocm9uaXplZCBzKF9tb25pdG9yKTsKKyAgICAgICAgU3luY2hyb25pemVkIHMoX2Jsb2NrTW9uaXRvcik7CisgICAgICAgIHdoaWxlIChfYmxvY2tlZCkgeworICAgICAgICAgIF9ibG9ja01vbml0b3Iud2FpdCgpOworICAgICAgICB9CisgICAgICB9CiAKLSAgICAgICAgX2NvdW50LS07Ci0KLSAgICAgICAgaWYgKF9jb3VudCA9PSAwKSB7Ci0KLSAgICAgICAgICBfbW9uaXRvci5ub3RpZnkoKTsKKyAgICAgIHsKKyAgICAgICAgU3luY2hyb25pemVkIHMoX2RvbmVNb25pdG9yKTsKKyAgICAgICAgaWYgKC0tX2NvdW50ID09IDApIHsKKyAgICAgICAgICBfZG9uZU1vbml0b3Iubm90aWZ5KCk7CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CiAKLSAgICBNb25pdG9yJiBfbW9uaXRvcjsKLSAgICBNb25pdG9yJiBfYm1vbml0b3I7CisgICAgTW9uaXRvciYgX2VudHJ5TW9uaXRvcjsKKyAgICBib29sIF9lbnRlcmVkOworICAgIE1vbml0b3ImIF9ibG9ja01vbml0b3I7CisgICAgYm9vbCYgX2Jsb2NrZWQ7CisgICAgTW9uaXRvciYgX2RvbmVNb25pdG9yOwogICAgIHNpemVfdCYgX2NvdW50OwogICB9OwogCkBAIC0yMjksMTQ2ICsyMzksNDQ3IEBACiAgICAqIEJsb2NrIHRlc3QuICBDcmVhdGUgcGVuZGluZ1Rhc2tDb3VudE1heCB0YXNrcy4gIFZlcmlmeSB0aGF0IHdlIGJsb2NrIGFkZGluZyB0aGUKICAgICogcGVuZGluZ1Rhc2tDb3VudE1heCArIDF0aCB0YXNrLiAgVmVyaWZ5IHRoYXQgd2UgdW5ibG9jayB3aGVuIGEgdGFzayBjb21wbGV0ZXMgKi8KIAotICBib29sIGJsb2NrVGVzdChpbnQ2NF90IHRpbWVvdXQ9MTAwTEwsIHNpemVfdCB3b3JrZXJDb3VudD0yKSB7Ci0gICAgKHZvaWQpIHRpbWVvdXQ7CisgIGJvb2wgYmxvY2tUZXN0KGludDY0X3QgdGltZW91dCA9IDEwMExMLCBzaXplX3Qgd29ya2VyQ291bnQgPSAyKSB7CisgICAgKHZvaWQpdGltZW91dDsKICAgICBib29sIHN1Y2Nlc3MgPSBmYWxzZTsKIAogICAgIHRyeSB7CiAKLSAgICAgIE1vbml0b3IgYm1vbml0b3I7Ci0gICAgICBNb25pdG9yIG1vbml0b3I7CisgICAgICBNb25pdG9yIGVudHJ5TW9uaXRvcjsgICAvLyBub3QgdXNlZCBieSB0aGlzIHRlc3QKKyAgICAgIE1vbml0b3IgYmxvY2tNb25pdG9yOworICAgICAgYm9vbCBibG9ja2VkW10gPSB7dHJ1ZSwgdHJ1ZSwgdHJ1ZX07CisgICAgICBNb25pdG9yIGRvbmVNb25pdG9yOwogCiAgICAgICBzaXplX3QgcGVuZGluZ1Rhc2tNYXhDb3VudCA9IHdvcmtlckNvdW50OwogCiAgICAgICBzaXplX3QgYWN0aXZlQ291bnRzW10gPSB7d29ya2VyQ291bnQsIHBlbmRpbmdUYXNrTWF4Q291bnQsIDF9OwogCi0gICAgICBzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IHRocmVhZE1hbmFnZXIgPSBUaHJlYWRNYW5hZ2VyOjpuZXdTaW1wbGVUaHJlYWRNYW5hZ2VyKHdvcmtlckNvdW50LCBwZW5kaW5nVGFza01heENvdW50KTsKKyAgICAgIHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlcgorICAgICAgICAgID0gVGhyZWFkTWFuYWdlcjo6bmV3U2ltcGxlVGhyZWFkTWFuYWdlcih3b3JrZXJDb3VudCwgcGVuZGluZ1Rhc2tNYXhDb3VudCk7CiAKLSAgICAgIHNoYXJlZF9wdHI8UGxhdGZvcm1UaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5ID0gc2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+KG5ldyBQbGF0Zm9ybVRocmVhZEZhY3RvcnkoKSk7CisgICAgICBzaGFyZWRfcHRyPFBsYXRmb3JtVGhyZWFkRmFjdG9yeT4gdGhyZWFkRmFjdG9yeQorICAgICAgICAgID0gc2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+KG5ldyBQbGF0Zm9ybVRocmVhZEZhY3RvcnkoKSk7CiAKLSNpZm5kZWYgVVNFX0JPT1NUX1RIUkVBRAorI2lmICFVU0VfU1REX1RIUkVBRAogICAgICAgdGhyZWFkRmFjdG9yeS0+c2V0UHJpb3JpdHkoUG9zaXhUaHJlYWRGYWN0b3J5OjpISUdIRVNUKTsKICNlbmRpZgogICAgICAgdGhyZWFkTWFuYWdlci0+dGhyZWFkRmFjdG9yeSh0aHJlYWRGYWN0b3J5KTsKIAogICAgICAgdGhyZWFkTWFuYWdlci0+c3RhcnQoKTsKIAotICAgICAgc3RkOjpzZXQ8c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyVGVzdHM6OkJsb2NrVGFzaz4gPiB0YXNrczsKKyAgICAgIHN0ZDo6dmVjdG9yPHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlclRlc3RzOjpCbG9ja1Rhc2s+ID4gdGFza3M7CisgICAgICB0YXNrcy5yZXNlcnZlKHdvcmtlckNvdW50ICsgcGVuZGluZ1Rhc2tNYXhDb3VudCk7CiAKICAgICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCB3b3JrZXJDb3VudDsgaXgrKykgewogCi0gICAgICAgIHRhc2tzLmluc2VydChzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXJUZXN0czo6QmxvY2tUYXNrPihuZXcgVGhyZWFkTWFuYWdlclRlc3RzOjpCbG9ja1Rhc2sobW9uaXRvciwgYm1vbml0b3IsYWN0aXZlQ291bnRzWzBdKSkpOworICAgICAgICB0YXNrcy5wdXNoX2JhY2soc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyVGVzdHM6OkJsb2NrVGFzaz4oCisgICAgICAgICAgICBuZXcgVGhyZWFkTWFuYWdlclRlc3RzOjpCbG9ja1Rhc2soZW50cnlNb25pdG9yLCBibG9ja01vbml0b3IsIGJsb2NrZWRbMF0sIGRvbmVNb25pdG9yLCBhY3RpdmVDb3VudHNbMF0pKSk7CiAgICAgICB9CiAKICAgICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCBwZW5kaW5nVGFza01heENvdW50OyBpeCsrKSB7CiAKLSAgICAgICAgdGFza3MuaW5zZXJ0KHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlclRlc3RzOjpCbG9ja1Rhc2s+KG5ldyBUaHJlYWRNYW5hZ2VyVGVzdHM6OkJsb2NrVGFzayhtb25pdG9yLCBibW9uaXRvcixhY3RpdmVDb3VudHNbMV0pKSk7CisgICAgICAgIHRhc2tzLnB1c2hfYmFjayhzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXJUZXN0czo6QmxvY2tUYXNrPigKKyAgICAgICAgICAgIG5ldyBUaHJlYWRNYW5hZ2VyVGVzdHM6OkJsb2NrVGFzayhlbnRyeU1vbml0b3IsIGJsb2NrTW9uaXRvciwgYmxvY2tlZFsxXSwgZG9uZU1vbml0b3IsIGFjdGl2ZUNvdW50c1sxXSkpKTsKICAgICAgIH0KIAotICAgICAgZm9yIChzdGQ6OnNldDxzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXJUZXN0czo6QmxvY2tUYXNrPiA+OjppdGVyYXRvciBpeCA9IHRhc2tzLmJlZ2luKCk7IGl4ICE9IHRhc2tzLmVuZCgpOyBpeCsrKSB7CisgICAgICBmb3IgKHN0ZDo6dmVjdG9yPHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlclRlc3RzOjpCbG9ja1Rhc2s+ID46Oml0ZXJhdG9yIGl4ID0gdGFza3MuYmVnaW4oKTsKKyAgICAgICAgICAgaXggIT0gdGFza3MuZW5kKCk7CisgICAgICAgICAgIGl4KyspIHsKICAgICAgICAgdGhyZWFkTWFuYWdlci0+YWRkKCppeCk7CiAgICAgICB9CiAKLSAgICAgIGlmKCEoc3VjY2VzcyA9ICh0aHJlYWRNYW5hZ2VyLT50b3RhbFRhc2tDb3VudCgpID09IHBlbmRpbmdUYXNrTWF4Q291bnQgKyB3b3JrZXJDb3VudCkpKSB7CisgICAgICBpZiAoIShzdWNjZXNzID0gKHRocmVhZE1hbmFnZXItPnRvdGFsVGFza0NvdW50KCkgPT0gcGVuZGluZ1Rhc2tNYXhDb3VudCArIHdvcmtlckNvdW50KSkpIHsKICAgICAgICAgdGhyb3cgVEV4Y2VwdGlvbigiVW5leHBlY3RlZCBwZW5kaW5nIHRhc2sgY291bnQiKTsKICAgICAgIH0KIAotICAgICAgc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyVGVzdHM6OkJsb2NrVGFzaz4gZXh0cmFUYXNrKG5ldyBUaHJlYWRNYW5hZ2VyVGVzdHM6OkJsb2NrVGFzayhtb25pdG9yLCBibW9uaXRvciwgYWN0aXZlQ291bnRzWzJdKSk7CisgICAgICBzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXJUZXN0czo6QmxvY2tUYXNrPiBleHRyYVRhc2soCisgICAgICAgICAgbmV3IFRocmVhZE1hbmFnZXJUZXN0czo6QmxvY2tUYXNrKGVudHJ5TW9uaXRvciwgYmxvY2tNb25pdG9yLCBibG9ja2VkWzJdLCBkb25lTW9uaXRvciwgYWN0aXZlQ291bnRzWzJdKSk7CiAKICAgICAgIHRyeSB7CiAgICAgICAgIHRocmVhZE1hbmFnZXItPmFkZChleHRyYVRhc2ssIDEpOwogICAgICAgICB0aHJvdyBURXhjZXB0aW9uKCJVbmV4cGVjdGVkIHN1Y2Nlc3MgYWRkaW5nIHRhc2sgaW4gZXhjZXNzIG9mIHBlbmRpbmcgdGFzayBjb3VudCIpOwotICAgICAgfSBjYXRjaChUb29NYW55UGVuZGluZ1Rhc2tzRXhjZXB0aW9uJiBlKSB7CisgICAgICB9IGNhdGNoIChUb29NYW55UGVuZGluZ1Rhc2tzRXhjZXB0aW9uJikgewogICAgICAgICB0aHJvdyBURXhjZXB0aW9uKCJTaG91bGQgaGF2ZSB0aW1lZCBvdXQgYWRkaW5nIHRhc2sgaW4gZXhjZXNzIG9mIHBlbmRpbmcgdGFzayBjb3VudCIpOwotICAgICAgfSBjYXRjaChUaW1lZE91dEV4Y2VwdGlvbiYgZSkgeworICAgICAgfSBjYXRjaCAoVGltZWRPdXRFeGNlcHRpb24mKSB7CiAgICAgICAgIC8vIEV4cGVjdGVkIHJlc3VsdAogICAgICAgfQogCiAgICAgICB0cnkgewogICAgICAgICB0aHJlYWRNYW5hZ2VyLT5hZGQoZXh0cmFUYXNrLCAtMSk7CiAgICAgICAgIHRocm93IFRFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc3VjY2VzcyBhZGRpbmcgdGFzayBpbiBleGNlc3Mgb2YgcGVuZGluZyB0YXNrIGNvdW50Iik7Ci0gICAgICB9IGNhdGNoKFRpbWVkT3V0RXhjZXB0aW9uJiBlKSB7CisgICAgICB9IGNhdGNoIChUaW1lZE91dEV4Y2VwdGlvbiYpIHsKICAgICAgICAgdGhyb3cgVEV4Y2VwdGlvbigiVW5leHBlY3RlZCB0aW1lb3V0IGFkZGluZyB0YXNrIGluIGV4Y2VzcyBvZiBwZW5kaW5nIHRhc2sgY291bnQiKTsKLSAgICAgIH0gY2F0Y2goVG9vTWFueVBlbmRpbmdUYXNrc0V4Y2VwdGlvbiYgZSkgeworICAgICAgfSBjYXRjaCAoVG9vTWFueVBlbmRpbmdUYXNrc0V4Y2VwdGlvbiYpIHsKICAgICAgICAgLy8gRXhwZWN0ZWQgcmVzdWx0CiAgICAgICB9CiAKLSAgICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0IiA8PCAiUGVuZGluZyB0YXNrcyAiIDw8IHRocmVhZE1hbmFnZXItPnBlbmRpbmdUYXNrQ291bnQoKSAgPDwgc3RkOjplbmRsOworICAgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHQiCisgICAgICAgICAgICAgICAgPDwgIlBlbmRpbmcgdGFza3MgIiA8PCB0aHJlYWRNYW5hZ2VyLT5wZW5kaW5nVGFza0NvdW50KCkgPDwgc3RkOjplbmRsOwogCiAgICAgICB7Ci0gICAgICAgIFN5bmNocm9uaXplZCBzKGJtb25pdG9yKTsKLQotICAgICAgICBibW9uaXRvci5ub3RpZnlBbGwoKTsKKyAgICAgICAgU3luY2hyb25pemVkIHMoYmxvY2tNb25pdG9yKTsKKyAgICAgICAgYmxvY2tlZFswXSA9IGZhbHNlOworICAgICAgICBibG9ja01vbml0b3Iubm90aWZ5QWxsKCk7CiAgICAgICB9CiAKICAgICAgIHsKLSAgICAgICAgU3luY2hyb25pemVkIHMobW9uaXRvcik7Ci0KLSAgICAgICAgd2hpbGUoYWN0aXZlQ291bnRzWzBdICE9IDApIHsKLSAgICAgICAgICBtb25pdG9yLndhaXQoKTsKKyAgICAgICAgU3luY2hyb25pemVkIHMoZG9uZU1vbml0b3IpOworICAgICAgICB3aGlsZSAoYWN0aXZlQ291bnRzWzBdICE9IDApIHsKKyAgICAgICAgICBkb25lTW9uaXRvci53YWl0KCk7CiAgICAgICAgIH0KICAgICAgIH0KIAotICAgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHQiIDw8ICJQZW5kaW5nIHRhc2tzICIgPDwgdGhyZWFkTWFuYWdlci0+cGVuZGluZ1Rhc2tDb3VudCgpIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0IgorICAgICAgICAgICAgICAgIDw8ICJQZW5kaW5nIHRhc2tzICIgPDwgdGhyZWFkTWFuYWdlci0+cGVuZGluZ1Rhc2tDb3VudCgpIDw8IHN0ZDo6ZW5kbDsKIAogICAgICAgdHJ5IHsKICAgICAgICAgdGhyZWFkTWFuYWdlci0+YWRkKGV4dHJhVGFzaywgMSk7Ci0gICAgICB9IGNhdGNoKFRpbWVkT3V0RXhjZXB0aW9uJiBlKSB7Ci0gICAgICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0IiA8PCAiYWRkIHRpbWVkIG91dCB1bmV4cGVjdGVkbHkiICA8PCBzdGQ6OmVuZGw7CisgICAgICB9IGNhdGNoIChUaW1lZE91dEV4Y2VwdGlvbiYpIHsKKyAgICAgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHQiCisgICAgICAgICAgICAgICAgICA8PCAiYWRkIHRpbWVkIG91dCB1bmV4cGVjdGVkbHkiIDw8IHN0ZDo6ZW5kbDsKICAgICAgICAgdGhyb3cgVEV4Y2VwdGlvbigiVW5leHBlY3RlZCB0aW1lb3V0IGFkZGluZyB0YXNrIik7CiAKLSAgICAgIH0gY2F0Y2goVG9vTWFueVBlbmRpbmdUYXNrc0V4Y2VwdGlvbiYgZSkgewotICAgICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdCIgPDwgImFkZCBlbmNvdW50ZXJlZCB0b28gbWFueSBwZW5kaW5nIGV4ZXBjdGlvbnMiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIH0gY2F0Y2ggKFRvb01hbnlQZW5kaW5nVGFza3NFeGNlcHRpb24mKSB7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0IgorICAgICAgICAgICAgICAgICAgPDwgImFkZCBlbmNvdW50ZXJlZCB0b28gbWFueSBwZW5kaW5nIGV4ZXBjdGlvbnMiIDw8IHN0ZDo6ZW5kbDsKICAgICAgICAgdGhyb3cgVEV4Y2VwdGlvbigiVW5leHBlY3RlZCB0aW1lb3V0IGFkZGluZyB0YXNrIik7CiAgICAgICB9CiAKICAgICAgIC8vIFdha2UgdXAgdGFza3MgdGhhdCB3ZXJlIHBlbmRpbmcgYmVmb3JlIGFuZCB3YWl0IGZvciB0aGVtIHRvIGNvbXBsZXRlCiAKICAgICAgIHsKLSAgICAgICAgU3luY2hyb25pemVkIHMoYm1vbml0b3IpOwotCi0gICAgICAgIGJtb25pdG9yLm5vdGlmeUFsbCgpOworICAgICAgICBTeW5jaHJvbml6ZWQgcyhibG9ja01vbml0b3IpOworICAgICAgICBibG9ja2VkWzFdID0gZmFsc2U7CisgICAgICAgIGJsb2NrTW9uaXRvci5ub3RpZnlBbGwoKTsKICAgICAgIH0KIAogICAgICAgewotICAgICAgICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yKTsKLQotICAgICAgICB3aGlsZShhY3RpdmVDb3VudHNbMV0gIT0gMCkgewotICAgICAgICAgIG1vbml0b3Iud2FpdCgpOworICAgICAgICBTeW5jaHJvbml6ZWQgcyhkb25lTW9uaXRvcik7CisgICAgICAgIHdoaWxlIChhY3RpdmVDb3VudHNbMV0gIT0gMCkgeworICAgICAgICAgIGRvbmVNb25pdG9yLndhaXQoKTsKICAgICAgICAgfQogICAgICAgfQogCiAgICAgICAvLyBXYWtlIHVwIHRoZSBleHRyYSB0YXNrIGFuZCB3YWl0IGZvciBpdCB0byBjb21wbGV0ZQogCiAgICAgICB7Ci0gICAgICAgIFN5bmNocm9uaXplZCBzKGJtb25pdG9yKTsKLQotICAgICAgICBibW9uaXRvci5ub3RpZnlBbGwoKTsKKyAgICAgICAgU3luY2hyb25pemVkIHMoYmxvY2tNb25pdG9yKTsKKyAgICAgICAgYmxvY2tlZFsyXSA9IGZhbHNlOworICAgICAgICBibG9ja01vbml0b3Iubm90aWZ5QWxsKCk7CiAgICAgICB9CiAKICAgICAgIHsKLSAgICAgICAgU3luY2hyb25pemVkIHMobW9uaXRvcik7Ci0KLSAgICAgICAgd2hpbGUoYWN0aXZlQ291bnRzWzJdICE9IDApIHsKLSAgICAgICAgICBtb25pdG9yLndhaXQoKTsKKyAgICAgICAgU3luY2hyb25pemVkIHMoZG9uZU1vbml0b3IpOworICAgICAgICB3aGlsZSAoYWN0aXZlQ291bnRzWzJdICE9IDApIHsKKyAgICAgICAgICBkb25lTW9uaXRvci53YWl0KCk7CiAgICAgICAgIH0KICAgICAgIH0KIAotICAgICAgaWYoIShzdWNjZXNzID0gKHRocmVhZE1hbmFnZXItPnRvdGFsVGFza0NvdW50KCkgPT0gMCkpKSB7Ci0gICAgICAgIHRocm93IFRFeGNlcHRpb24oIlVuZXhwZWN0ZWQgcGVuZGluZyB0YXNrIGNvdW50Iik7CisgICAgICB0aHJlYWRNYW5hZ2VyLT5zdG9wKCk7CisKKyAgICAgIGlmICghKHN1Y2Nlc3MgPSAodGhyZWFkTWFuYWdlci0+dG90YWxUYXNrQ291bnQoKSA9PSAwKSkpIHsKKyAgICAgICAgdGhyb3cgVEV4Y2VwdGlvbigiVW5leHBlY3RlZCB0b3RhbCB0YXNrIGNvdW50Iik7CiAgICAgICB9CiAKLSAgICB9IGNhdGNoKFRFeGNlcHRpb24mIGUpIHsKKyAgICB9IGNhdGNoIChURXhjZXB0aW9uJiBlKSB7CiAgICAgICBzdGQ6OmNvdXQgPDwgIkVSUk9SOiAiIDw8IGUud2hhdCgpIDw8IHN0ZDo6ZW5kbDsKICAgICB9CiAKICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdCIgPDwgKHN1Y2Nlc3MgPyAiU3VjY2VzcyIgOiAiRmFpbHVyZSIpIDw8IHN0ZDo6ZW5kbDsKICAgICByZXR1cm4gc3VjY2VzczsKLSB9CisgIH0KKworCisgIGJvb2wgYXBpVGVzdCgpIHsKKworICAgIC8vIHByb3ZlIGN1cnJlbnRUaW1lIGhhcyBtaWxsaXNlY29uZHMgZ3JhbnVsYXJpdHkgc2luY2UgbWFueSBvdGhlciB0aGluZ3MgZGVwZW5kIG9uIGl0CisgICAgaW50NjRfdCBhID0gVXRpbDo6Y3VycmVudFRpbWUoKTsKKyAgICBzbGVlcF8oMTAwKTsKKyAgICBpbnQ2NF90IGIgPSBVdGlsOjpjdXJyZW50VGltZSgpOworICAgIGlmIChiIC0gYSA8IDUwIHx8IGIgLSBhID4gMTUwKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgIlx0XHRcdGV4cGVjdGVkIDEwMG1zIGdhcCwgZm91bmQgIiA8PCAoYi1hKSA8PCAibXMgZ2FwIGluc3RlYWQuIiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisjaWYgIVVTRV9TVERfVEhSRUFECisgICAgLy8gdGVzdCBvbmNlIHdpdGggYSBkZXRhY2hlZCB0aHJlYWQgZmFjdG9yeSBhbmQgb25jZSB3aXRoIGEgam9pbmFibGUgdGhyZWFkIGZhY3RvcnkKKworICAgIHNoYXJlZF9wdHI8UG9zaXhUaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5CisgICAgICAgID0gc2hhcmVkX3B0cjxQb3NpeFRocmVhZEZhY3Rvcnk+KG5ldyBQb3NpeFRocmVhZEZhY3RvcnkoZmFsc2UpKTsKKworICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0YXBpVGVzdCB3aXRoIGpvaW5hYmxlIHRocmVhZCBmYWN0b3J5IiA8PCBzdGQ6OmVuZGw7CisgICAgaWYgKCFhcGlUZXN0V2l0aFRocmVhZEZhY3RvcnkodGhyZWFkRmFjdG9yeSkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB0aHJlYWRGYWN0b3J5LnJlc2V0KG5ldyBQb3NpeFRocmVhZEZhY3RvcnkodHJ1ZSkpOworICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0YXBpVGVzdCB3aXRoIGRldGFjaGVkIHRocmVhZCBmYWN0b3J5IiA8PCBzdGQ6OmVuZGw7CisgICAgcmV0dXJuIGFwaVRlc3RXaXRoVGhyZWFkRmFjdG9yeSh0aHJlYWRGYWN0b3J5KTsKKyNlbHNlCisgICAgcmV0dXJuIGFwaVRlc3RXaXRoVGhyZWFkRmFjdG9yeShzaGFyZWRfcHRyPFBsYXRmb3JtVGhyZWFkRmFjdG9yeT4obmV3IFBsYXRmb3JtVGhyZWFkRmFjdG9yeSgpKSk7CisjZW5kaWYKKworICB9CisKKyAgYm9vbCBhcGlUZXN0V2l0aFRocmVhZEZhY3Rvcnkoc2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnkpCisgIHsKKyAgICBzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IHRocmVhZE1hbmFnZXIgPSBUaHJlYWRNYW5hZ2VyOjpuZXdTaW1wbGVUaHJlYWRNYW5hZ2VyKDEpOworICAgIHRocmVhZE1hbmFnZXItPnRocmVhZEZhY3RvcnkodGhyZWFkRmFjdG9yeSk7CisKKyNpZiAhVVNFX1NURF9USFJFQUQKKyAgICB0aHJlYWRGYWN0b3J5LT5zZXRQcmlvcml0eShQb3NpeFRocmVhZEZhY3Rvcnk6OkhJR0hFU1QpOworCisgICAgLy8gdmVyaWZ5IHdlIGNhbm5vdCBjaGFuZ2UgdGhlIHRocmVhZCBmYWN0b3J5IHRvIG9uZSB3aXRoIHRoZSBvcHBvc2l0ZSBkZXRhY2hlZCBzZXR0aW5nCisgICAgc2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnkyCisgICAgICAgID0gc2hhcmVkX3B0cjxQb3NpeFRocmVhZEZhY3Rvcnk+KG5ldyBQbGF0Zm9ybVRocmVhZEZhY3RvcnkoCisgICAgICAgICAgUG9zaXhUaHJlYWRGYWN0b3J5OjpST1VORF9ST0JJTiwKKyAgICAgICAgICBQb3NpeFRocmVhZEZhY3Rvcnk6Ok5PUk1BTCwKKyAgICAgICAgICAxLAorICAgICAgICAgICF0aHJlYWRGYWN0b3J5LT5pc0RldGFjaGVkKCkpKTsKKyAgICB0cnkgeworICAgICAgdGhyZWFkTWFuYWdlci0+dGhyZWFkRmFjdG9yeSh0aHJlYWRGYWN0b3J5Mik7CisgICAgICAvLyBpZiB0aGUgY2FsbCBzdWNjZWVkZWQgd2UgY2hhbmdlZCB0aGUgdGhyZWFkIGZhY3RvcnkgdG8gb25lIHRoYXQgaGFkIHRoZSBvcHBvc2l0ZSBzZXR0aW5nIGZvciAiaXNEZXRhY2hlZCgpIi4KKyAgICAgIC8vIHRoaXMgaXMgYmFkLCBiZWNhdXNlIHRoZSB0aHJlYWQgbWFuYWdlciBjaGVja3Mgd2l0aCB0aGUgdGhyZWFkIGZhY3RvcnkgdG8gc2VlIGlmIGl0IHNob3VsZCBqb2luIHRocmVhZHMKKyAgICAgIC8vIGFzIHRoZXkgYXJlIGxlYXZpbmcgLSBzbyB0aGUgZGV0YWNoZWQgc3RhdHVzIG9mIG5ldyB0aHJlYWRzIGNhbm5vdCBjaGFuZ2Ugd2hpbGUgdGhlcmUgYXJlIGV4aXN0aW5nIHRocmVhZHMuCisgICAgICBzdGQ6OmNlcnIgPDwgIlx0XHRcdFNob3VsZCBub3QgYmUgYWJsZSB0byBjaGFuZ2UgdGhyZWFkIGZhY3RvcnkgZGV0YWNoZWQgZGlzcG9zaXRpb24iIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgY2F0Y2ggKEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbiYgZXgpIHsKKyAgICAgIC8qIGV4cGVjdGVkICovCisgICAgfQorI2VuZGlmCisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFx0c3RhcnRpbmcuLiAiIDw8IHN0ZDo6ZW5kbDsKKworICAgIHRocmVhZE1hbmFnZXItPnN0YXJ0KCk7CisgICAgdGhyZWFkTWFuYWdlci0+c2V0RXhwaXJlQ2FsbGJhY2soZXhwaXJlZE5vdGlmaWVyKTsgLy8gc3RkOjpiaW5kKCZUaHJlYWRNYW5hZ2VyVGVzdHM6OmV4cGlyZWROb3RpZmllciwgdGhpcykpOworCisjZGVmaW5lIEVYUEVDVChGVU5DLCBDT1VOVCkgeyBzaXplX3QgYyA9IEZVTkM7IGlmIChjICE9IENPVU5UKSB7IHN0ZDo6Y2VyciA8PCAiZXhwZWN0ZWQgIiAjRlVOQyIgdG8gYmUgIiAjQ09VTlQgIiwgYnV0IHdhcyAiIDw8IGMgPDwgc3RkOjplbmRsOyByZXR1cm4gZmFsc2U7IH0gfQorCisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPndvcmtlckNvdW50KCksIDEpOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5pZGxlV29ya2VyQ291bnQoKSwgMSk7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPnBlbmRpbmdUYXNrQ291bnQoKSwgMCk7CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFx0YWRkIDJuZCB3b3JrZXIuLiAiIDw8IHN0ZDo6ZW5kbDsKKworICAgIHRocmVhZE1hbmFnZXItPmFkZFdvcmtlcigpOworCisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPndvcmtlckNvdW50KCksIDIpOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5pZGxlV29ya2VyQ291bnQoKSwgMik7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPnBlbmRpbmdUYXNrQ291bnQoKSwgMCk7CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFx0cmVtb3ZlIDJuZCB3b3JrZXIuLiAiIDw8IHN0ZDo6ZW5kbDsKKworICAgIHRocmVhZE1hbmFnZXItPnJlbW92ZVdvcmtlcigpOworCisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPndvcmtlckNvdW50KCksIDEpOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5pZGxlV29ya2VyQ291bnQoKSwgMSk7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPnBlbmRpbmdUYXNrQ291bnQoKSwgMCk7CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFx0cmVtb3ZlIDFzdCB3b3JrZXIuLiAiIDw8IHN0ZDo6ZW5kbDsKKworICAgIHRocmVhZE1hbmFnZXItPnJlbW92ZVdvcmtlcigpOworCisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPndvcmtlckNvdW50KCksIDApOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5pZGxlV29ya2VyQ291bnQoKSwgMCk7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPnBlbmRpbmdUYXNrQ291bnQoKSwgMCk7CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFx0YWRkIGJsb2NraW5nIHRhc2suLiAiIDw8IHN0ZDo6ZW5kbDsKKworICAgIC8vIFdlJ3JlIGdvaW5nIHRvIHRocm93IGEgYmxvY2tpbmcgdGFzayBpbnRvIHRoZSBtaXgKKyAgICBNb25pdG9yIGVudHJ5TW9uaXRvcjsgICAvLyBzaWduYWxlZCB3aGVuIHRhc2sgaXMgcnVubmluZworICAgIE1vbml0b3IgYmxvY2tNb25pdG9yOyAgIC8vIHRvIGJlIHNpZ25hbGVkIHRvIHVuYmxvY2sgdGhlIHRhc2sKKyAgICBib29sIGJsb2NrZWQodHJ1ZSk7ICAgICAvLyBzZXQgdG8gZmFsc2UgYmVmb3JlIG5vdGlmeWluZworICAgIE1vbml0b3IgZG9uZU1vbml0b3I7ICAgIC8vIHNpZ25hbGVkIHdoZW4gY291bnQgcmVhY2hlcyB6ZXJvCisgICAgc2l6ZV90IGFjdGl2ZUNvdW50ID0gMTsKKyAgICBzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXJUZXN0czo6QmxvY2tUYXNrPiBibG9ja2luZ1Rhc2soCisgICAgICBuZXcgVGhyZWFkTWFuYWdlclRlc3RzOjpCbG9ja1Rhc2soZW50cnlNb25pdG9yLCBibG9ja01vbml0b3IsIGJsb2NrZWQsIGRvbmVNb25pdG9yLCBhY3RpdmVDb3VudCkpOworICAgIHRocmVhZE1hbmFnZXItPmFkZChibG9ja2luZ1Rhc2spOworCisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPndvcmtlckNvdW50KCksIDApOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5pZGxlV29ya2VyQ291bnQoKSwgMCk7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPnBlbmRpbmdUYXNrQ291bnQoKSwgMSk7CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFx0YWRkIG90aGVyIHRhc2suLiAiIDw8IHN0ZDo6ZW5kbDsKKworICAgIHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlclRlc3RzOjpUYXNrPiBvdGhlclRhc2soCisgICAgICBuZXcgVGhyZWFkTWFuYWdlclRlc3RzOjpUYXNrKGRvbmVNb25pdG9yLCBhY3RpdmVDb3VudCwgMCkpOworCisgICAgdGhyZWFkTWFuYWdlci0+YWRkKG90aGVyVGFzayk7CisKKyAgICBFWFBFQ1QodGhyZWFkTWFuYWdlci0+d29ya2VyQ291bnQoKSwgMCk7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPmlkbGVXb3JrZXJDb3VudCgpLCAwKTsKKyAgICBFWFBFQ1QodGhyZWFkTWFuYWdlci0+cGVuZGluZ1Rhc2tDb3VudCgpLCAyKTsKKworICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0XHRyZW1vdmUgYmxvY2tpbmcgdGFzayBzcGVjaWZpY2FsbHkuLiAiIDw8IHN0ZDo6ZW5kbDsKKworICAgIHRocmVhZE1hbmFnZXItPnJlbW92ZShibG9ja2luZ1Rhc2spOworCisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPndvcmtlckNvdW50KCksIDApOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5pZGxlV29ya2VyQ291bnQoKSwgMCk7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPnBlbmRpbmdUYXNrQ291bnQoKSwgMSk7CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFx0cmVtb3ZlIG5leHQgcGVuZGluZyB0YXNrLi4iIDw8IHN0ZDo6ZW5kbDsKKworICAgIHNoYXJlZF9wdHI8UnVubmFibGU+IG5leHRUYXNrID0gdGhyZWFkTWFuYWdlci0+cmVtb3ZlTmV4dFBlbmRpbmcoKTsKKyAgICBpZiAobmV4dFRhc2sgIT0gb3RoZXJUYXNrKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgIlx0XHRcdFx0XHRleHBlY3RlZCByZW1vdmVOZXh0UGVuZGluZyB0byByZXR1cm4gb3RoZXJUYXNrIiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPndvcmtlckNvdW50KCksIDApOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5pZGxlV29ya2VyQ291bnQoKSwgMCk7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPnBlbmRpbmdUYXNrQ291bnQoKSwgMCk7CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFx0cmVtb3ZlIG5leHQgcGVuZGluZyB0YXNrIChub25lIGxlZnQpLi4iIDw8IHN0ZDo6ZW5kbDsKKworICAgIG5leHRUYXNrID0gdGhyZWFkTWFuYWdlci0+cmVtb3ZlTmV4dFBlbmRpbmcoKTsKKyAgICBpZiAobmV4dFRhc2spIHsKKyAgICAgIHN0ZDo6Y2VyciA8PCAiXHRcdFx0XHRcdGV4cGVjdGVkIHJlbW92ZU5leHRQZW5kaW5nIHRvIHJldHVybiBhbiBlbXB0eSBSdW5uYWJsZSIgPDwgc3RkOjplbmRsOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0XHRhZGQgMiBleHBpcmVkIHRhc2tzIGFuZCAxIG5vdC4uIiA8PCBzdGQ6OmVuZGw7CisKKyAgICBzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXJUZXN0czo6VGFzaz4gZXhwaXJlZFRhc2soCisgICAgICBuZXcgVGhyZWFkTWFuYWdlclRlc3RzOjpUYXNrKGRvbmVNb25pdG9yLCBhY3RpdmVDb3VudCwgMCkpOworCisgICAgdGhyZWFkTWFuYWdlci0+YWRkKGV4cGlyZWRUYXNrLCAwLCAxKTsKKyAgICB0aHJlYWRNYW5hZ2VyLT5hZGQoYmxvY2tpbmdUYXNrKTsgICAgICAgLy8gYWRkIG9uZSB0aGF0IGhhc24ndCBleHBpcmVkIHRvIG1ha2Ugc3VyZSBpdCBnZXRzIHNraXBwZWQKKyAgICB0aHJlYWRNYW5hZ2VyLT5hZGQoZXhwaXJlZFRhc2ssIDAsIDEpOyAgLy8gYWRkIGEgc2Vjb25kIGV4cGlyZWQgdG8gZW5zdXJlIHJlbW92ZUV4cGlyZWRUYXNrcyByZW1vdmVzIGJvdGgKKworICAgIHNsZWVwXyg1MCk7ICAvLyBtYWtlIHN1cmUgZW5vdWdoIHRpbWUgZWxhcHNlcyBmb3IgaXQgdG8gZXhwaXJlIC0gdGhlIHNob3J0ZXN0IGV4cGlyYXRpb24gdGltZSBpcyAxIG1pbGxpc2Vjb25kCisKKyAgICBFWFBFQ1QodGhyZWFkTWFuYWdlci0+d29ya2VyQ291bnQoKSwgMCk7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPmlkbGVXb3JrZXJDb3VudCgpLCAwKTsKKyAgICBFWFBFQ1QodGhyZWFkTWFuYWdlci0+cGVuZGluZ1Rhc2tDb3VudCgpLCAzKTsKKyAgICBFWFBFQ1QodGhyZWFkTWFuYWdlci0+ZXhwaXJlZFRhc2tDb3VudCgpLCAwKTsKKworICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0XHRyZW1vdmUgZXhwaXJlZCB0YXNrcy4uIiA8PCBzdGQ6OmVuZGw7CisKKyAgICBpZiAoIW1fZXhwaXJlZC5lbXB0eSgpKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgIlx0XHRcdFx0XHRleHBlY3RlZCBtX2V4cGlyZWQgdG8gYmUgZW1wdHkiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB0aHJlYWRNYW5hZ2VyLT5yZW1vdmVFeHBpcmVkVGFza3MoKTsKKworICAgIGlmIChtX2V4cGlyZWQuc2l6ZSgpICE9IDIpIHsKKyAgICAgIHN0ZDo6Y2VyciA8PCAiXHRcdFx0XHRcdGV4cGVjdGVkIG1fZXhwaXJlZCB0byBiZSBzZXQiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAobV9leHBpcmVkLmZyb250KCkgIT0gZXhwaXJlZFRhc2spIHsKKyAgICAgIHN0ZDo6Y2VyciA8PCAiXHRcdFx0XHRcdGV4cGVjdGVkIG1fZXhwaXJlZFswXSB0byBiZSB0aGUgZXhwaXJlZCB0YXNrIiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIG1fZXhwaXJlZC5wb3BfZnJvbnQoKTsKKworICAgIGlmIChtX2V4cGlyZWQuZnJvbnQoKSAhPSBleHBpcmVkVGFzaykgeworICAgICAgc3RkOjpjZXJyIDw8ICJcdFx0XHRcdFx0ZXhwZWN0ZWQgbV9leHBpcmVkWzFdIHRvIGJlIHRoZSBleHBpcmVkIHRhc2siIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBtX2V4cGlyZWQuY2xlYXIoKTsKKworICAgIHRocmVhZE1hbmFnZXItPnJlbW92ZShibG9ja2luZ1Rhc2spOworCisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPndvcmtlckNvdW50KCksIDApOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5pZGxlV29ya2VyQ291bnQoKSwgMCk7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPnBlbmRpbmdUYXNrQ291bnQoKSwgMCk7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPmV4cGlyZWRUYXNrQ291bnQoKSwgMik7CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFx0YWRkIGV4cGlyZWQgdGFzayAoYWdhaW4pLi4iIDw8IHN0ZDo6ZW5kbDsKKworICAgIHRocmVhZE1hbmFnZXItPmFkZChleHBpcmVkVGFzaywgMCwgMSk7ICAvLyBleHBpcmVzIGluIDFtcworICAgIHNsZWVwXyg1MCk7ICAvLyBtYWtlIHN1cmUgZW5vdWdoIHRpbWUgZWxhcHNlcyBmb3IgaXQgdG8gZXhwaXJlIC0gdGhlIHNob3J0ZXN0IGV4cGlyYXRpb24gdGltZSBpcyAxbXMKKworICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0XHRhZGQgd29ya2VyIHRvIGNvbnN1bWUgZXhwaXJlZCB0YXNrLi4iIDw8IHN0ZDo6ZW5kbDsKKworICAgIHRocmVhZE1hbmFnZXItPmFkZFdvcmtlcigpOworICAgIHNsZWVwXygxMDApOyAgLy8gbWFrZSBzdXJlIGl0IGhhcyB0aW1lIHRvIHNwaW4gdXAgYW5kIGV4cGlyZSB0aGUgdGFzaworCisgICAgaWYgKG1fZXhwaXJlZC5lbXB0eSgpKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgIlx0XHRcdFx0XHRleHBlY3RlZCBtX2V4cGlyZWQgdG8gYmUgc2V0IiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKG1fZXhwaXJlZC5mcm9udCgpICE9IGV4cGlyZWRUYXNrKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgIlx0XHRcdFx0XHRleHBlY3RlZCBtX2V4cGlyZWQgdG8gYmUgdGhlIGV4cGlyZWQgdGFzayIgPDwgc3RkOjplbmRsOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG1fZXhwaXJlZC5jbGVhcigpOworCisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPndvcmtlckNvdW50KCksIDEpOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5pZGxlV29ya2VyQ291bnQoKSwgMSk7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPnBlbmRpbmdUYXNrQ291bnQoKSwgMCk7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPmV4cGlyZWRUYXNrQ291bnQoKSwgMyk7CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFx0dHJ5IHRvIHJlbW92ZSB0b28gbWFueSB3b3JrZXJzIiA8PCBzdGQ6OmVuZGw7CisgICAgdHJ5IHsKKyAgICAgIHRocmVhZE1hbmFnZXItPnJlbW92ZVdvcmtlcigyKTsKKyAgICAgIHN0ZDo6Y2VyciA8PCAiXHRcdFx0XHRcdGV4cGVjdGVkIEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbiIgPDwgc3RkOjplbmRsOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0gY2F0Y2ggKGNvbnN0IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbiYpIHsKKyAgICAgIC8qIGV4cGVjdGVkICovCisgICAgfQorCisgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRcdHJlbW92ZSB3b3JrZXIuLiAiIDw8IHN0ZDo6ZW5kbDsKKworICAgIHRocmVhZE1hbmFnZXItPnJlbW92ZVdvcmtlcigpOworCisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPndvcmtlckNvdW50KCksIDApOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5pZGxlV29ya2VyQ291bnQoKSwgMCk7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPnBlbmRpbmdUYXNrQ291bnQoKSwgMCk7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPmV4cGlyZWRUYXNrQ291bnQoKSwgMyk7CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFx0YWRkIGJsb2NraW5nIHRhc2suLiAiIDw8IHN0ZDo6ZW5kbDsKKworICAgIHRocmVhZE1hbmFnZXItPmFkZChibG9ja2luZ1Rhc2spOworCisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPndvcmtlckNvdW50KCksIDApOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5pZGxlV29ya2VyQ291bnQoKSwgMCk7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPnBlbmRpbmdUYXNrQ291bnQoKSwgMSk7CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFx0YWRkIHdvcmtlci4uICIgPDwgc3RkOjplbmRsOworCisgICAgdGhyZWFkTWFuYWdlci0+YWRkV29ya2VyKCk7CisgICAgeworICAgICAgU3luY2hyb25pemVkIHMoZW50cnlNb25pdG9yKTsKKyAgICAgIHdoaWxlICghYmxvY2tpbmdUYXNrLT5fZW50ZXJlZCkgeworICAgICAgICBlbnRyeU1vbml0b3Iud2FpdCgpOworICAgICAgfQorICAgIH0KKworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT53b3JrZXJDb3VudCgpLCAxKTsKKyAgICBFWFBFQ1QodGhyZWFkTWFuYWdlci0+aWRsZVdvcmtlckNvdW50KCksIDApOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5wZW5kaW5nVGFza0NvdW50KCksIDApOworCisgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRcdHVuYmxvY2sgdGFzayBhbmQgcmVtb3ZlIHdvcmtlci4uICIgPDwgc3RkOjplbmRsOworCisgICAgeworICAgICAgU3luY2hyb25pemVkIHMoYmxvY2tNb25pdG9yKTsKKyAgICAgIGJsb2NrZWQgPSBmYWxzZTsKKyAgICAgIGJsb2NrTW9uaXRvci5ub3RpZnlBbGwoKTsKKyAgICB9CisgICAgdGhyZWFkTWFuYWdlci0+cmVtb3ZlV29ya2VyKCk7CisKKyAgICBFWFBFQ1QodGhyZWFkTWFuYWdlci0+d29ya2VyQ291bnQoKSwgMCk7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPmlkbGVXb3JrZXJDb3VudCgpLCAwKTsKKyAgICBFWFBFQ1QodGhyZWFkTWFuYWdlci0+cGVuZGluZ1Rhc2tDb3VudCgpLCAwKTsKKworICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0XHRjbGVhbnVwLi4gIiA8PCBzdGQ6OmVuZGw7CisKKyAgICBibG9ja2luZ1Rhc2sucmVzZXQoKTsKKyAgICB0aHJlYWRNYW5hZ2VyLnJlc2V0KCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KIH07CiAKLWNvbnN0IGRvdWJsZSBUaHJlYWRNYW5hZ2VyVGVzdHM6OlRFU1RfVE9MRVJBTkNFID0gLjIwOwotCi19fX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQorfQorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKIAogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6dGVzdDsKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9jb25jdXJyZW5jeS9UaW1lck1hbmFnZXJUZXN0cy5oIGIvbGliL2NwcC90ZXN0L2NvbmN1cnJlbmN5L1RpbWVyTWFuYWdlclRlc3RzLmgKaW5kZXggNjJlYjRmNC4uMWM1MmM0NyAxMDA2NDQKLS0tIGEvbGliL2NwcC90ZXN0L2NvbmN1cnJlbmN5L1RpbWVyTWFuYWdlclRlc3RzLmgKKysrIGIvbGliL2NwcC90ZXN0L2NvbmN1cnJlbmN5L1RpbWVyTWFuYWdlclRlc3RzLmgKQEAgLTI1LDQ5ICsyNSwzNiBAQAogI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPGlvc3RyZWFtPgogCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBjb25jdXJyZW5jeSB7IG5hbWVzcGFjZSB0ZXN0IHsKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgY29uY3VycmVuY3kgeworbmFtZXNwYWNlIHRlc3QgewogCiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OwogCiBjbGFzcyBUaW1lck1hbmFnZXJUZXN0cyB7CiAKLSAgc3RhdGljIGNvbnN0IGRvdWJsZSBURVNUX1RPTEVSQU5DRTsKLQotIHB1YmxpYzoKLSAgY2xhc3MgVGFzazogcHVibGljIFJ1bm5hYmxlIHsKLSAgIHB1YmxpYzoKLQotICAgIFRhc2soTW9uaXRvciYgbW9uaXRvciwgaW50NjRfdCB0aW1lb3V0KSA6Ci0gICAgICBfdGltZW91dCh0aW1lb3V0KSwKLSAgICAgIF9zdGFydFRpbWUoVXRpbDo6Y3VycmVudFRpbWUoKSksCi0gICAgICBfbW9uaXRvcihtb25pdG9yKSwKLSAgICAgIF9zdWNjZXNzKGZhbHNlKSwKLSAgICAgIF9kb25lKGZhbHNlKSB7fQorcHVibGljOgorICBjbGFzcyBUYXNrIDogcHVibGljIFJ1bm5hYmxlIHsKKyAgcHVibGljOgorICAgIFRhc2soTW9uaXRvciYgbW9uaXRvciwgaW50NjRfdCB0aW1lb3V0KQorICAgICAgOiBfdGltZW91dCh0aW1lb3V0KSwKKyAgICAgICAgX3N0YXJ0VGltZShVdGlsOjpjdXJyZW50VGltZSgpKSwKKyAgICAgICAgX2VuZFRpbWUoMCksCisgICAgICAgIF9tb25pdG9yKG1vbml0b3IpLAorICAgICAgICBfc3VjY2VzcyhmYWxzZSksCisgICAgICAgIF9kb25lKGZhbHNlKSB7fQogCiAgICAgflRhc2soKSB7IHN0ZDo6Y2VyciA8PCB0aGlzIDw8IHN0ZDo6ZW5kbDsgfQogCiAgICAgdm9pZCBydW4oKSB7CiAKICAgICAgIF9lbmRUaW1lID0gVXRpbDo6Y3VycmVudFRpbWUoKTsKKyAgICAgIF9zdWNjZXNzID0gKF9lbmRUaW1lIC0gX3N0YXJ0VGltZSkgPj0gX3RpbWVvdXQ7CiAKLSAgICAgIC8vIEZpZ3VyZSBvdXQgZXJyb3IgcGVyY2VudGFnZQotCi0gICAgICBpbnQ2NF90IGRlbHRhID0gX2VuZFRpbWUgLSBfc3RhcnRUaW1lOwotCi0KLSAgICAgIGRlbHRhID0gZGVsdGEgPiBfdGltZW91dCA/ICBkZWx0YSAtIF90aW1lb3V0IDogX3RpbWVvdXQgLSBkZWx0YTsKLQotICAgICAgZmxvYXQgZXJyb3IgPSBkZWx0YSAvIF90aW1lb3V0OwotCi0gICAgICBpZihlcnJvciA8IFRFU1RfVE9MRVJBTkNFKSB7Ci0gICAgICAgIF9zdWNjZXNzID0gdHJ1ZTsKLSAgICAgIH0KLQotICAgICAgX2RvbmUgPSB0cnVlOwotCi0gICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFRpbWVyTWFuYWdlclRlc3RzOjpUYXNrWyIgPDwgdGhpcyA8PCAiXSBkb25lIiA8PCBzdGQ6OmVuZGw7IC8vZGVidWcKLQotICAgICAge1N5bmNocm9uaXplZCBzKF9tb25pdG9yKTsKKyAgICAgIHsKKyAgICAgICAgU3luY2hyb25pemVkIHMoX21vbml0b3IpOworICAgICAgICBfZG9uZSA9IHRydWU7CiAgICAgICAgIF9tb25pdG9yLm5vdGlmeUFsbCgpOwogICAgICAgfQogICAgIH0KQEAgLTg2LDE5ICs3MywxOSBAQAogICAgKiBwcm9wZXJseSBjbGVhbiB1cCBpdHNlbGYgYW5kIHRoZSByZW1haW5pbmcgb3JwaGFuZWQgdGltZW91dCB0YXNrIHdoZW4gdGhlCiAgICAqIG1hbmFnZXIgZ29lcyBvdXQgb2Ygc2NvcGUgYW5kIGl0cyBkZXN0cnVjdG9yIGlzIGNhbGxlZC4KICAgICovCi0gIGJvb2wgdGVzdDAwKGludDY0X3QgdGltZW91dD0xMDAwTEwpIHsKKyAgYm9vbCB0ZXN0MDAoaW50NjRfdCB0aW1lb3V0ID0gMTAwMExMKSB7CiAKLSAgICBzaGFyZWRfcHRyPFRpbWVyTWFuYWdlclRlc3RzOjpUYXNrPiBvcnBoYW5UYXNrID0gc2hhcmVkX3B0cjxUaW1lck1hbmFnZXJUZXN0czo6VGFzaz4obmV3IFRpbWVyTWFuYWdlclRlc3RzOjpUYXNrKF9tb25pdG9yLCAxMCAqIHRpbWVvdXQpKTsKKyAgICBzaGFyZWRfcHRyPFRpbWVyTWFuYWdlclRlc3RzOjpUYXNrPiBvcnBoYW5UYXNrCisgICAgICAgID0gc2hhcmVkX3B0cjxUaW1lck1hbmFnZXJUZXN0czo6VGFzaz4obmV3IFRpbWVyTWFuYWdlclRlc3RzOjpUYXNrKF9tb25pdG9yLCAxMCAqIHRpbWVvdXQpKTsKIAogICAgIHsKLQogICAgICAgVGltZXJNYW5hZ2VyIHRpbWVyTWFuYWdlcjsKLQogICAgICAgdGltZXJNYW5hZ2VyLnRocmVhZEZhY3Rvcnkoc2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+KG5ldyBQbGF0Zm9ybVRocmVhZEZhY3RvcnkoKSkpOwotCiAgICAgICB0aW1lck1hbmFnZXIuc3RhcnQoKTsKLQotICAgICAgYXNzZXJ0KHRpbWVyTWFuYWdlci5zdGF0ZSgpID09IFRpbWVyTWFuYWdlcjo6U1RBUlRFRCk7CisgICAgICBpZiAodGltZXJNYW5hZ2VyLnN0YXRlKCkgIT0gVGltZXJNYW5hZ2VyOjpTVEFSVEVEKSB7CisgICAgICAgIHN0ZDo6Y2VyciA8PCAidGltZXJNYW5hZ2VyIGlzIG5vdCBpbiB0aGUgU1RBUlRFRCBzdGF0ZSwgYnV0IHNob3VsZCBiZSIgPDwgc3RkOjplbmRsOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CiAKICAgICAgIC8vIERvbid0IGNyZWF0ZSB0YXNrIHlldCwgYmVjYXVzZSBpdHMgY29uc3RydWN0b3Igc2V0cyB0aGUgZXhwZWN0ZWQgY29tcGxldGlvbiB0aW1lLCBhbmQgd2UKICAgICAgIC8vIG5lZWQgdG8gZGVsYXkgYmV0d2VlbiBpbnNlcnRpbmcgdGhlIHR3byB0YXNrcyBpbnRvIHRoZSBydW4gcXVldWUuCkBAIC0xMDYsMzQgKzkzLDE2MSBAQAogCiAgICAgICB7CiAgICAgICAgIFN5bmNocm9uaXplZCBzKF9tb25pdG9yKTsKLQogICAgICAgICB0aW1lck1hbmFnZXIuYWRkKG9ycGhhblRhc2ssIDEwICogdGltZW91dCk7CiAKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAvLyBXYWl0IGZvciAxIHNlY29uZCBpbiBvcmRlciB0byBnaXZlIHRpbWVyTWFuYWdlciBhIGNoYW5jZSB0byBzdGFydCBzbGVlcGluZyBpbiByZXNwb25zZQotICAgICAgICAgIC8vIHRvIGFkZGluZyBvcnBoYW5UYXNrLiBXZSBuZWVkIHRvIGRvIHRoaXMgc28gd2UgY2FuIHZlcmlmeSB0aGF0IGFkZGluZyB0aGUgc2Vjb25kIHRhc2sKLSAgICAgICAgICAvLyBraWNrcyB0aGUgZGlzcGF0Y2hlciBvdXQgb2YgdGhlIGN1cnJlbnQgd2FpdCBhbmQgc3RhcnRzIHRoZSBuZXcgMSBzZWNvbmQgd2FpdC4KLSAgICAgICAgICBfbW9uaXRvci53YWl0ICgxMDAwKTsKLSAgICAgICAgICBhc3NlcnQgKDAgPT0gIkVSUk9SOiBUaGlzIHdhaXQgc2hvdWxkIHRpbWUgb3V0LiBUaW1lck1hbmFnZXIgZGlzcGF0Y2hlciBtYXkgaGF2ZSBhIHByb2JsZW0uIik7Ci0gICAgICAgIH0gY2F0Y2ggKFRpbWVkT3V0RXhjZXB0aW9uICZleCkgewotICAgICAgICB9CisgICAgICAgIFRIUklGVF9TTEVFUF9VU0VDKHRpbWVvdXQgKiAxMDAwKTsKIAotICAgICAgICB0YXNrLnJlc2V0IChuZXcgVGltZXJNYW5hZ2VyVGVzdHM6OlRhc2soX21vbml0b3IsIHRpbWVvdXQpKTsKLQorICAgICAgICB0YXNrLnJlc2V0KG5ldyBUaW1lck1hbmFnZXJUZXN0czo6VGFzayhfbW9uaXRvciwgdGltZW91dCkpOwogICAgICAgICB0aW1lck1hbmFnZXIuYWRkKHRhc2ssIHRpbWVvdXQpOwotCiAgICAgICAgIF9tb25pdG9yLndhaXQoKTsKICAgICAgIH0KIAotICAgICAgYXNzZXJ0KHRhc2stPl9kb25lKTsKLQorICAgICAgaWYgKCF0YXNrLT5fZG9uZSkgeworICAgICAgICBzdGQ6OmNlcnIgPDwgInRhc2sgaXMgbm90IGRvbmUsIGJ1dCBpdCBzaG91bGQgaGF2ZSBleGVjdXRlZCIgPDwgc3RkOjplbmRsOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CiAKICAgICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0IiA8PCAodGFzay0+X3N1Y2Nlc3MgPyAiU3VjY2VzcyIgOiAiRmFpbHVyZSIpIDw8ICIhIiA8PCBzdGQ6OmVuZGw7CiAgICAgfQogCi0gICAgLy8gdGltZXJNYW5hZ2VyLnN0b3AoKTsgVGhpcyBpcyB3aGVyZSBpdCBoYXBwZW5zIHZpYSBkZXN0cnVjdG9yCisgICAgaWYgKG9ycGhhblRhc2stPl9kb25lKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgIm9ycGhhbiB0YXNrIGlzIGRvbmUsIGJ1dCBpdCBzaG91bGQgbm90IGhhdmUgZXhlY3V0ZWQiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CiAKLSAgICBhc3NlcnQoIW9ycGhhblRhc2stPl9kb25lKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8qKgorICAgKiBUaGlzIHRlc3QgY3JlYXRlcyB0d28gdGFza3MsIHJlbW92ZXMgdGhlIGZpcnN0IG9uZSB0aGVuIHdhaXRzIGZvciB0aGUgc2Vjb25kIG9uZS4gSXQgdGhlbgorICAgKiB2ZXJpZmllcyB0aGF0IHRoZSB0aW1lciBtYW5hZ2VyIHByb3Blcmx5IGNsZWFuIHVwIGl0c2VsZiBhbmQgdGhlIHJlbWFpbmluZyBvcnBoYW5lZCB0aW1lb3V0CisgICAqIHRhc2sgd2hlbiB0aGUgbWFuYWdlciBnb2VzIG91dCBvZiBzY29wZSBhbmQgaXRzIGRlc3RydWN0b3IgaXMgY2FsbGVkLgorICAgKi8KKyAgYm9vbCB0ZXN0MDEoaW50NjRfdCB0aW1lb3V0ID0gMTAwMExMKSB7CisgICAgVGltZXJNYW5hZ2VyIHRpbWVyTWFuYWdlcjsKKyAgICB0aW1lck1hbmFnZXIudGhyZWFkRmFjdG9yeShzaGFyZWRfcHRyPFBsYXRmb3JtVGhyZWFkRmFjdG9yeT4obmV3IFBsYXRmb3JtVGhyZWFkRmFjdG9yeSgpKSk7CisgICAgdGltZXJNYW5hZ2VyLnN0YXJ0KCk7CisgICAgYXNzZXJ0KHRpbWVyTWFuYWdlci5zdGF0ZSgpID09IFRpbWVyTWFuYWdlcjo6U1RBUlRFRCk7CisKKyAgICBTeW5jaHJvbml6ZWQgcyhfbW9uaXRvcik7CisKKyAgICAvLyBTZXR1cCB0aGUgdHdvIHRhc2tzCisgICAgc2hhcmVkX3B0cjxUaW1lck1hbmFnZXJUZXN0czo6VGFzaz4gdGFza1RvUmVtb3ZlCisgICAgICA9IHNoYXJlZF9wdHI8VGltZXJNYW5hZ2VyVGVzdHM6OlRhc2s+KG5ldyBUaW1lck1hbmFnZXJUZXN0czo6VGFzayhfbW9uaXRvciwgdGltZW91dCAvIDIpKTsKKyAgICB0aW1lck1hbmFnZXIuYWRkKHRhc2tUb1JlbW92ZSwgdGFza1RvUmVtb3ZlLT5fdGltZW91dCk7CisKKyAgICBzaGFyZWRfcHRyPFRpbWVyTWFuYWdlclRlc3RzOjpUYXNrPiB0YXNrCisgICAgICA9IHNoYXJlZF9wdHI8VGltZXJNYW5hZ2VyVGVzdHM6OlRhc2s+KG5ldyBUaW1lck1hbmFnZXJUZXN0czo6VGFzayhfbW9uaXRvciwgdGltZW91dCkpOworICAgIHRpbWVyTWFuYWdlci5hZGQodGFzaywgdGFzay0+X3RpbWVvdXQpOworCisgICAgLy8gUmVtb3ZlIG9uZSB0YXNrIGFuZCB3YWl0IHVudGlsIHRoZSBvdGhlciBoYXMgY29tcGxldGVkCisgICAgdGltZXJNYW5hZ2VyLnJlbW92ZSh0YXNrVG9SZW1vdmUpOworICAgIF9tb25pdG9yLndhaXQodGltZW91dCAqIDIpOworCisgICAgYXNzZXJ0KCF0YXNrVG9SZW1vdmUtPl9kb25lKTsKKyAgICBhc3NlcnQodGFzay0+X2RvbmUpOworCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvKioKKyAgICogVGhpcyB0ZXN0IGNyZWF0ZXMgdHdvIHRhc2tzIHdpdGggdGhlIHNhbWUgY2FsbGJhY2sgYW5kIGFub3RoZXIgb25lLCB0aGVuIHJlbW92ZXMgdGhlIHR3bworICAgKiBkdXBsaWNhdGVkIHRoZW4gd2FpdHMgZm9yIHRoZSBsYXN0IG9uZS4gSXQgdGhlbiB2ZXJpZmllcyB0aGF0IHRoZSB0aW1lciBtYW5hZ2VyIHByb3Blcmx5CisgICAqIGNsZWFuIHVwIGl0c2VsZiBhbmQgdGhlIHJlbWFpbmluZyBvcnBoYW5lZCB0aW1lb3V0IHRhc2sgd2hlbiB0aGUgbWFuYWdlciBnb2VzIG91dCBvZiBzY29wZQorICAgKiBhbmQgaXRzIGRlc3RydWN0b3IgaXMgY2FsbGVkLgorICAgKi8KKyAgYm9vbCB0ZXN0MDIoaW50NjRfdCB0aW1lb3V0ID0gMTAwMExMKSB7CisgICAgVGltZXJNYW5hZ2VyIHRpbWVyTWFuYWdlcjsKKyAgICB0aW1lck1hbmFnZXIudGhyZWFkRmFjdG9yeShzaGFyZWRfcHRyPFBsYXRmb3JtVGhyZWFkRmFjdG9yeT4obmV3IFBsYXRmb3JtVGhyZWFkRmFjdG9yeSgpKSk7CisgICAgdGltZXJNYW5hZ2VyLnN0YXJ0KCk7CisgICAgYXNzZXJ0KHRpbWVyTWFuYWdlci5zdGF0ZSgpID09IFRpbWVyTWFuYWdlcjo6U1RBUlRFRCk7CisKKyAgICBTeW5jaHJvbml6ZWQgcyhfbW9uaXRvcik7CisKKyAgICAvLyBTZXR1cCB0aGUgb25lIHRhc2tzIGFuZCBhZGQgaXQgdHdpY2UKKyAgICBzaGFyZWRfcHRyPFRpbWVyTWFuYWdlclRlc3RzOjpUYXNrPiB0YXNrVG9SZW1vdmUKKyAgICAgID0gc2hhcmVkX3B0cjxUaW1lck1hbmFnZXJUZXN0czo6VGFzaz4obmV3IFRpbWVyTWFuYWdlclRlc3RzOjpUYXNrKF9tb25pdG9yLCB0aW1lb3V0IC8gMykpOworICAgIHRpbWVyTWFuYWdlci5hZGQodGFza1RvUmVtb3ZlLCB0YXNrVG9SZW1vdmUtPl90aW1lb3V0KTsKKyAgICB0aW1lck1hbmFnZXIuYWRkKHRhc2tUb1JlbW92ZSwgdGFza1RvUmVtb3ZlLT5fdGltZW91dCAqIDIpOworCisgICAgc2hhcmVkX3B0cjxUaW1lck1hbmFnZXJUZXN0czo6VGFzaz4gdGFzaworICAgICAgPSBzaGFyZWRfcHRyPFRpbWVyTWFuYWdlclRlc3RzOjpUYXNrPihuZXcgVGltZXJNYW5hZ2VyVGVzdHM6OlRhc2soX21vbml0b3IsIHRpbWVvdXQpKTsKKyAgICB0aW1lck1hbmFnZXIuYWRkKHRhc2ssIHRhc2stPl90aW1lb3V0KTsKKworICAgIC8vIFJlbW92ZSB0aGUgZmlyc3QgdGFzayAoZS5nLiB0d28gdGltZXJzKSBhbmQgd2FpdCB1bnRpbCB0aGUgb3RoZXIgaGFzIGNvbXBsZXRlZAorICAgIHRpbWVyTWFuYWdlci5yZW1vdmUodGFza1RvUmVtb3ZlKTsKKyAgICBfbW9uaXRvci53YWl0KHRpbWVvdXQgKiAyKTsKKworICAgIGFzc2VydCghdGFza1RvUmVtb3ZlLT5fZG9uZSk7CisgICAgYXNzZXJ0KHRhc2stPl9kb25lKTsKKworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLyoqCisgICAqIFRoaXMgdGVzdCBjcmVhdGVzIHR3byB0YXNrcywgcmVtb3ZlcyB0aGUgZmlyc3Qgb25lIHRoZW4gd2FpdHMgZm9yIHRoZSBzZWNvbmQgb25lLiBJdCB0aGVuCisgICAqIHZlcmlmaWVzIHRoYXQgdGhlIHRpbWVyIG1hbmFnZXIgcHJvcGVybHkgY2xlYW4gdXAgaXRzZWxmIGFuZCB0aGUgcmVtYWluaW5nIG9ycGhhbmVkIHRpbWVvdXQKKyAgICogdGFzayB3aGVuIHRoZSBtYW5hZ2VyIGdvZXMgb3V0IG9mIHNjb3BlIGFuZCBpdHMgZGVzdHJ1Y3RvciBpcyBjYWxsZWQuCisgICAqLworICBib29sIHRlc3QwMyhpbnQ2NF90IHRpbWVvdXQgPSAxMDAwTEwpIHsKKyAgICBUaW1lck1hbmFnZXIgdGltZXJNYW5hZ2VyOworICAgIHRpbWVyTWFuYWdlci50aHJlYWRGYWN0b3J5KHNoYXJlZF9wdHI8UGxhdGZvcm1UaHJlYWRGYWN0b3J5PihuZXcgUGxhdGZvcm1UaHJlYWRGYWN0b3J5KCkpKTsKKyAgICB0aW1lck1hbmFnZXIuc3RhcnQoKTsKKyAgICBhc3NlcnQodGltZXJNYW5hZ2VyLnN0YXRlKCkgPT0gVGltZXJNYW5hZ2VyOjpTVEFSVEVEKTsKKworICAgIFN5bmNocm9uaXplZCBzKF9tb25pdG9yKTsKKworICAgIC8vIFNldHVwIHRoZSB0d28gdGFza3MKKyAgICBzaGFyZWRfcHRyPFRpbWVyTWFuYWdlclRlc3RzOjpUYXNrPiB0YXNrVG9SZW1vdmUKKyAgICAgICAgPSBzaGFyZWRfcHRyPFRpbWVyTWFuYWdlclRlc3RzOjpUYXNrPihuZXcgVGltZXJNYW5hZ2VyVGVzdHM6OlRhc2soX21vbml0b3IsIHRpbWVvdXQgLyAyKSk7CisgICAgVGltZXJNYW5hZ2VyOjpUaW1lciB0aW1lciA9IHRpbWVyTWFuYWdlci5hZGQodGFza1RvUmVtb3ZlLCB0YXNrVG9SZW1vdmUtPl90aW1lb3V0KTsKKworICAgIHNoYXJlZF9wdHI8VGltZXJNYW5hZ2VyVGVzdHM6OlRhc2s+IHRhc2sKKyAgICAgID0gc2hhcmVkX3B0cjxUaW1lck1hbmFnZXJUZXN0czo6VGFzaz4obmV3IFRpbWVyTWFuYWdlclRlc3RzOjpUYXNrKF9tb25pdG9yLCB0aW1lb3V0KSk7CisgICAgdGltZXJNYW5hZ2VyLmFkZCh0YXNrLCB0YXNrLT5fdGltZW91dCk7CisKKyAgICAvLyBSZW1vdmUgb25lIHRhc2sgYW5kIHdhaXQgdW50aWwgdGhlIG90aGVyIGhhcyBjb21wbGV0ZWQKKyAgICB0aW1lck1hbmFnZXIucmVtb3ZlKHRpbWVyKTsKKyAgICBfbW9uaXRvci53YWl0KHRpbWVvdXQgKiAyKTsKKworICAgIGFzc2VydCghdGFza1RvUmVtb3ZlLT5fZG9uZSk7CisgICAgYXNzZXJ0KHRhc2stPl9kb25lKTsKKworICAgIC8vIFZlcmlmeSBiZWhhdmlvciB3aGVuIHJlbW92aW5nIHRoZSByZW1vdmVkIHRhc2sKKyAgICB0cnkgeworICAgICAgdGltZXJNYW5hZ2VyLnJlbW92ZSh0aW1lcik7CisgICAgICBhc3NlcnQoMCA9PSAiRVJST1I6IFRoaXMgcmVtb3ZlIHNob3VsZCBzZW5kIGEgTm9TdWNoVGFza0V4Y2VwdGlvbiBleGNlcHRpb24uIik7CisgICAgfSBjYXRjaCAoTm9TdWNoVGFza0V4Y2VwdGlvbiYpIHsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8qKgorICAgKiBUaGlzIHRlc3QgY3JlYXRlcyBvbmUgdGFza3MsIGFuZCB0cmllcyB0byByZW1vdmUgaXQgYWZ0ZXIgaXQgaGFzIGV4cGlyZWQuCisgICAqLworICBib29sIHRlc3QwNChpbnQ2NF90IHRpbWVvdXQgPSAxMDAwTEwpIHsKKyAgICBUaW1lck1hbmFnZXIgdGltZXJNYW5hZ2VyOworICAgIHRpbWVyTWFuYWdlci50aHJlYWRGYWN0b3J5KHNoYXJlZF9wdHI8UGxhdGZvcm1UaHJlYWRGYWN0b3J5PihuZXcgUGxhdGZvcm1UaHJlYWRGYWN0b3J5KCkpKTsKKyAgICB0aW1lck1hbmFnZXIuc3RhcnQoKTsKKyAgICBhc3NlcnQodGltZXJNYW5hZ2VyLnN0YXRlKCkgPT0gVGltZXJNYW5hZ2VyOjpTVEFSVEVEKTsKKworICAgIFN5bmNocm9uaXplZCBzKF9tb25pdG9yKTsKKworICAgIC8vIFNldHVwIHRoZSB0YXNrCisgICAgc2hhcmVkX3B0cjxUaW1lck1hbmFnZXJUZXN0czo6VGFzaz4gdGFzaworICAgICAgPSBzaGFyZWRfcHRyPFRpbWVyTWFuYWdlclRlc3RzOjpUYXNrPihuZXcgVGltZXJNYW5hZ2VyVGVzdHM6OlRhc2soX21vbml0b3IsIHRpbWVvdXQgLyAxMCkpOworICAgIFRpbWVyTWFuYWdlcjo6VGltZXIgdGltZXIgPSB0aW1lck1hbmFnZXIuYWRkKHRhc2ssIHRhc2stPl90aW1lb3V0KTsKKworICAgIC8vIFdhaXQgdW50aWwgdGhlIHRhc2sgaGFzIGNvbXBsZXRlZAorICAgIF9tb25pdG9yLndhaXQodGltZW91dCk7CisKKyAgICAvLyBWZXJpZnkgYmVoYXZpb3Igd2hlbiByZW1vdmluZyB0aGUgZXhwaXJlZCB0YXNrCisgICAgdHJ5IHsKKyAgICAgIHRpbWVyTWFuYWdlci5yZW1vdmUodGltZXIpOworICAgICAgYXNzZXJ0KDAgPT0gIkVSUk9SOiBUaGlzIHJlbW92ZSBzaG91bGQgc2VuZCBhIE5vU3VjaFRhc2tFeGNlcHRpb24gZXhjZXB0aW9uLiIpOworICAgIH0gY2F0Y2ggKE5vU3VjaFRhc2tFeGNlcHRpb24mKSB7CisgICAgfQogCiAgICAgcmV0dXJuIHRydWU7CiAgIH0KQEAgLTE0Myw2ICsyNTcsNyBAQAogICBNb25pdG9yIF9tb25pdG9yOwogfTsKIAotY29uc3QgZG91YmxlIFRpbWVyTWFuYWdlclRlc3RzOjpURVNUX1RPTEVSQU5DRSA9IC4yMDsKLQotfX19fSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKK30KK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5CmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvcHJvY2Vzc29yL0V2ZW50TG9nLmNwcCBiL2xpYi9jcHAvdGVzdC9wcm9jZXNzb3IvRXZlbnRMb2cuY3BwCmluZGV4IDBhYzMwMjguLmUzZGRiY2MgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvdGVzdC9wcm9jZXNzb3IvRXZlbnRMb2cuY3BwCisrKyBiL2xpYi9jcHAvdGVzdC9wcm9jZXNzb3IvRXZlbnRMb2cuY3BwCkBAIC0xOSwyNyArMTksMzEgQEAKICNpbmNsdWRlICJFdmVudExvZy5oIgogCiAjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CiAKLXVzaW5nIG5hbWVzcGFjZSBzdGQ7CiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OwogCiBuYW1lc3BhY2UgewogCisvLyBEZWZpbmUgZW52aXJvbm1lbnQgdmFyaWFibGUgREVCVUdfRVZFTlRMT0cgdG8gZW5hYmxlIGRlYnVnIGxvZ2dpbmcKKy8vIGV4OiAkIERFQlVHX0VWRU5UTE9HPTEgcHJvY2Vzc29yX3Rlc3QKK3N0YXRpYyBjb25zdCBjaGFyICogREVCVUdfRVZFTlRMT0cgPSBnZXRlbnYoIkRFQlVHX0VWRU5UTE9HIik7CisKIHZvaWQgZGVidWcoY29uc3QgY2hhciogZm10LCAuLi4pIHsKLSAgLy8gQ29tbWVudCBvdXQgdGhpcyByZXR1cm4gdG8gZW5hYmxlIGRlYnVnIGxvZ3MgZnJvbSB0aGUgdGVzdCBjb2RlLgotICByZXR1cm47CisgIGlmIChERUJVR19FVkVOVExPRykgeworICAgIHZhX2xpc3QgYXA7CisgICAgdmFfc3RhcnQoYXAsIGZtdCk7CisgICAgdmZwcmludGYoc3RkZXJyLCBmbXQsIGFwKTsKKyAgICB2YV9lbmQoYXApOwogCi0gIHZhX2xpc3QgYXA7Ci0gIHZhX3N0YXJ0KGFwLCBmbXQpOwotICB2ZnByaW50ZihzdGRlcnIsIGZtdCwgYXApOwotICB2YV9lbmQoYXApOwotCi0gIGZwcmludGYoc3RkZXJyLCAiXG4iKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisgIH0KK30KIH0KIAotfQotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0ZXN0IHsKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdGVzdCB7CiAKIHVpbnQzMl90IEV2ZW50TG9nOjpuZXh0SWRfID0gMDsKIApAQCAtNzQsMTEgKzc4LDEyIEBACiAgIGRlYnVnKCJOZXcgbG9nOiAlZCIsIGlkXyk7CiB9CiAKLXZvaWQgRXZlbnRMb2c6OmFwcGVuZChFdmVudFR5cGUgdHlwZSwgdWludDMyX3QgY29ubmVjdGlvbklkLCB1aW50MzJfdCBjYWxsSWQsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBtZXNzYWdlKSB7Cit2b2lkIEV2ZW50TG9nOjphcHBlbmQoRXZlbnRUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNhbGxJZCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkgewogICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yXyk7Ci0gIGRlYnVnKCIlZCA8LS0gJXUsICV1LCAlcyBcIiVzXCIiLCBpZF8sIGNvbm5lY3Rpb25JZCwgY2FsbElkLCB0eXBlLAotICAgICAgICBtZXNzYWdlLmNfc3RyKCkpOworICBkZWJ1ZygiJWQgPC0tICV1LCAldSwgJXMgXCIlc1wiIiwgaWRfLCBjb25uZWN0aW9uSWQsIGNhbGxJZCwgdHlwZSwgbWVzc2FnZS5jX3N0cigpKTsKIAogICBFdmVudCBlKHR5cGUsIGNvbm5lY3Rpb25JZCwgY2FsbElkLCBtZXNzYWdlKTsKICAgZXZlbnRzXy5wdXNoX2JhY2soZSk7CkBAIC0xMjUsNSArMTMwLDYgQEAKICAgICB9CiAgIH0KIH0KLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0ZXN0Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0ZXN0CmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvcHJvY2Vzc29yL0V2ZW50TG9nLmggYi9saWIvY3BwL3Rlc3QvcHJvY2Vzc29yL0V2ZW50TG9nLmgKaW5kZXggZDczMWNlYy4uNGY4Mjc1ZCAxMDA2NDQKLS0tIGEvbGliL2NwcC90ZXN0L3Byb2Nlc3Nvci9FdmVudExvZy5oCisrKyBiL2xpYi9jcHAvdGVzdC9wcm9jZXNzb3IvRXZlbnRMb2cuaApAQCAtMjEsNyArMjEsOSBAQAogCiAjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L01vbml0b3IuaD4KIAotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdGVzdCB7CituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRlc3QgewogCiAvLyBJbml0aWFsbHkgSSBtYWRlIEV2ZW50VHlwZSBhbiBlbnVtLCBidXQgdXNpbmcgY2hhciogcmVzdWx0cwogLy8gaW4gbXVjaCBtb3JlIHJlYWRhYmxlIGVycm9yIG1lc3NhZ2VzIHdoZW4gdGhlcmUgaXMgYSBtaXNtYXRjaC4KQEAgLTMxLDIxICszMywxNyBAQAogdHlwZWRlZiBjb25zdCBjaGFyKiBFdmVudFR5cGU7CiAKIHN0cnVjdCBFdmVudCB7Ci0gIEV2ZW50KEV2ZW50VHlwZSB0eXBlLCB1aW50MzJfdCBjb25uZWN0aW9uSWQsIHVpbnQzMl90IGNhbGxJZCwKLSAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpIDoKLSAgICAgIHR5cGUodHlwZSksCi0gICAgICBjb25uZWN0aW9uSWQoY29ubmVjdGlvbklkKSwKLSAgICAgIGNhbGxJZChjYWxsSWQpLAotICAgICAgbWVzc2FnZShtZXNzYWdlKSB7fQorICBFdmVudChFdmVudFR5cGUgdHlwZSwgdWludDMyX3QgY29ubmVjdGlvbklkLCB1aW50MzJfdCBjYWxsSWQsIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKQorICAgIDogdHlwZSh0eXBlKSwgY29ubmVjdGlvbklkKGNvbm5lY3Rpb25JZCksIGNhbGxJZChjYWxsSWQpLCBtZXNzYWdlKG1lc3NhZ2UpIHt9CiAKICAgRXZlbnRUeXBlIHR5cGU7Ci0gIHVpbnQzMl90ICBjb25uZWN0aW9uSWQ7Ci0gIHVpbnQzMl90ICBjYWxsSWQ7Ci0gIHN0ZDo6c3RyaW5nICAgIG1lc3NhZ2U7CisgIHVpbnQzMl90IGNvbm5lY3Rpb25JZDsKKyAgdWludDMyX3QgY2FsbElkOworICBzdGQ6OnN0cmluZyBtZXNzYWdlOwogfTsKIAogY2xhc3MgRXZlbnRMb2cgewotIHB1YmxpYzoKK3B1YmxpYzoKICAgc3RhdGljIEV2ZW50VHlwZSBFVF9MT0dfRU5EOwogICBzdGF0aWMgRXZlbnRUeXBlIEVUX0NPTk5fQ1JFQVRFRDsKICAgc3RhdGljIEV2ZW50VHlwZSBFVF9DT05OX0RFU1RST1lFRDsKQEAgLTczLDEzICs3MSwxNSBAQAogCiAgIEV2ZW50TG9nKCk7CiAKLSAgdm9pZCBhcHBlbmQoRXZlbnRUeXBlIHR5cGUsIHVpbnQzMl90IGNvbm5lY3Rpb25JZCwgdWludDMyX3QgY2FsbElkLAorICB2b2lkIGFwcGVuZChFdmVudFR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgdWludDMyX3QgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICB1aW50MzJfdCBjYWxsSWQsCiAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlID0gIiIpOwogCiAgIEV2ZW50IHdhaXRGb3JFdmVudChpbnQ2NF90IHRpbWVvdXQgPSA1MDApOwogICBFdmVudCB3YWl0Rm9yQ29ubkV2ZW50KHVpbnQzMl90IGNvbm5JZCwgaW50NjRfdCB0aW1lb3V0ID0gNTAwKTsKIAotIHByb3RlY3RlZDoKK3Byb3RlY3RlZDoKICAgdHlwZWRlZiBzdGQ6Omxpc3Q8RXZlbnQ+IEV2ZW50TGlzdDsKIAogICBjb25jdXJyZW5jeTo6TW9uaXRvciBtb25pdG9yXzsKQEAgLTg4LDcgKzg4LDggQEAKIAogICBzdGF0aWMgdWludDMyX3QgbmV4dElkXzsKIH07Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6dGVzdAorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dGVzdAogCiAjZW5kaWYgLy8gX1RIUklGVF9URVNUX0VWRU5UTE9HX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvcHJvY2Vzc29yL0hhbmRsZXJzLmggYi9saWIvY3BwL3Rlc3QvcHJvY2Vzc29yL0hhbmRsZXJzLmgKaW5kZXggMmJlMjYyYS4uMjk3ODRkOCAxMDA2NDQKLS0tIGEvbGliL2NwcC90ZXN0L3Byb2Nlc3Nvci9IYW5kbGVycy5oCisrKyBiL2xpYi9jcHAvdGVzdC9wcm9jZXNzb3IvSGFuZGxlcnMuaApAQCAtMjMsMTUgKzIzLDE0IEBACiAjaW5jbHVkZSAiZ2VuLWNwcC9QYXJlbnRTZXJ2aWNlLmgiCiAjaW5jbHVkZSAiZ2VuLWNwcC9DaGlsZFNlcnZpY2UuaCIKIAotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdGVzdCB7CituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRlc3QgewogCiBjbGFzcyBQYXJlbnRIYW5kbGVyIDogdmlydHVhbCBwdWJsaWMgUGFyZW50U2VydmljZUlmIHsKLSBwdWJsaWM6Ci0gIFBhcmVudEhhbmRsZXIoY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8RXZlbnRMb2c+JiBsb2cpIDoKLSAgICAgIHRyaWdnZXJNb25pdG9yKCZtdXRleF8pLAotICAgICAgZ2VuZXJhdGlvbl8oMCksCi0gICAgICB3YWl0XyhmYWxzZSksCi0gICAgICBsb2dfKGxvZykgeyB9CitwdWJsaWM6CisgIFBhcmVudEhhbmRsZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEV2ZW50TG9nPiYgbG9nKQorICAgIDogdHJpZ2dlck1vbml0b3IoJm11dGV4XyksIGdlbmVyYXRpb25fKDApLCB3YWl0XyhmYWxzZSksIGxvZ18obG9nKSB7fQogCiAgIGludDMyX3QgaW5jcmVtZW50R2VuZXJhdGlvbigpIHsKICAgICBjb25jdXJyZW5jeTo6R3VhcmQgZyhtdXRleF8pOwpAQCAtNTcsNyArNTYsNyBAQAogICAgIF9yZXR1cm4gPSBzdHJpbmdzXzsKICAgfQogCi0gIHZvaWQgZ2V0RGF0YVdhaXQoc3RkOjpzdHJpbmcmIF9yZXR1cm4sIGludDMyX3QgbGVuZ3RoKSB7CisgIHZvaWQgZ2V0RGF0YVdhaXQoc3RkOjpzdHJpbmcmIF9yZXR1cm4sIGNvbnN0IGludDMyX3QgbGVuZ3RoKSB7CiAgICAgY29uY3VycmVuY3k6Okd1YXJkIGcobXV0ZXhfKTsKICAgICBsb2dfLT5hcHBlbmQoRXZlbnRMb2c6OkVUX0NBTExfR0VUX0RBVEFfV0FJVCwgMCwgMCk7CiAKQEAgLTExNiw3ICsxMTUsNyBAQAogICAgIHRyaWdnZXJNb25pdG9yLm5vdGlmeUFsbCgpOwogICB9CiAKLSBwcm90ZWN0ZWQ6Citwcm90ZWN0ZWQ6CiAgIC8qKgogICAgKiBibG9ja1VudGlsVHJpZ2dlcmVkKCkgd29uJ3QgcmV0dXJuIHVudGlsIHRyaWdnZXJQZW5kaW5nQ2FsbHMoKSBpcyBpbnZva2VkCiAgICAqIGluIGFub3RoZXIgdGhyZWFkLgpAQCAtMTM3LDE2ICsxMzYsMTkgQEAKICAgaW50MzJfdCBnZW5lcmF0aW9uXzsKICAgYm9vbCB3YWl0XzsKICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHN0cmluZ3NfOwotICBib29zdDo6c2hhcmVkX3B0cjxFdmVudExvZz4gbG9nXzsKKyAgc3RkOjpzaGFyZWRfcHRyPEV2ZW50TG9nPiBsb2dfOwogfTsKIAotY2xhc3MgQ2hpbGRIYW5kbGVyIDogcHVibGljIFBhcmVudEhhbmRsZXIsIHZpcnR1YWwgcHVibGljIENoaWxkU2VydmljZUlmIHsKLSBwdWJsaWM6Ci0gIENoaWxkSGFuZGxlcihjb25zdCBib29zdDo6c2hhcmVkX3B0cjxFdmVudExvZz4mIGxvZykgOgotICAgICAgUGFyZW50SGFuZGxlcihsb2cpLAotICAgICAgdmFsdWVfKDApIHt9CisjaWZkZWYgX1dJTjMyCisgICNwcmFnbWEgd2FybmluZyggcHVzaCApCisgICNwcmFnbWEgd2FybmluZyAoZGlzYWJsZSA6IDQyNTAgKSAvL2luaGVyaXRpbmcgbWV0aG9kcyB2aWEgZG9taW5hbmNlCisjZW5kaWYKIAotICBpbnQzMl90IHNldFZhbHVlKGludDMyX3QgdmFsdWUpIHsKK2NsYXNzIENoaWxkSGFuZGxlciA6IHB1YmxpYyBQYXJlbnRIYW5kbGVyLCB2aXJ0dWFsIHB1YmxpYyBDaGlsZFNlcnZpY2VJZiB7CitwdWJsaWM6CisgIENoaWxkSGFuZGxlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8RXZlbnRMb2c+JiBsb2cpIDogUGFyZW50SGFuZGxlcihsb2cpLCB2YWx1ZV8oMCkge30KKworICBpbnQzMl90IHNldFZhbHVlKGNvbnN0IGludDMyX3QgdmFsdWUpIHsKICAgICBjb25jdXJyZW5jeTo6R3VhcmQgZyhtdXRleF8pOwogICAgIGxvZ18tPmFwcGVuZChFdmVudExvZzo6RVRfQ0FMTF9TRVRfVkFMVUUsIDAsIDApOwogCkBAIC0xNjIsNDYgKzE2NCw0NCBAQAogICAgIHJldHVybiB2YWx1ZV87CiAgIH0KIAotIHByb3RlY3RlZDoKK3Byb3RlY3RlZDoKICAgaW50MzJfdCB2YWx1ZV87CiB9OwogCi1zdHJ1Y3QgQ29ubkNvbnRleHQgewotIHB1YmxpYzoKLSAgQ29ubkNvbnRleHQoYm9vc3Q6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gaW4sCi0gICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IG91dCwKLSAgICAgICAgICAgICAgdWludDMyX3QgaWQpIDoKLSAgICAgIGlucHV0KGluKSwKLSAgICAgIG91dHB1dChvdXQpLAotICAgICAgaWQoaWQpIHt9CisjaWZkZWYgX1dJTjMyCisgICNwcmFnbWEgd2FybmluZyggcG9wICkKKyNlbmRpZgogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IGlucHV0OwotICBib29zdDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBvdXRwdXQ7CitzdHJ1Y3QgQ29ubkNvbnRleHQgeworcHVibGljOgorICBDb25uQ29udGV4dChzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gaW4sCisgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBvdXQsCisgICAgICAgICAgICAgIHVpbnQzMl90IGlkKQorICAgIDogaW5wdXQoaW4pLCBvdXRwdXQob3V0KSwgaWQoaWQpIHt9CisKKyAgc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IGlucHV0OworICBzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gb3V0cHV0OwogICB1aW50MzJfdCBpZDsKIH07CiAKIHN0cnVjdCBDYWxsQ29udGV4dCB7Ci0gcHVibGljOgotICBDYWxsQ29udGV4dChDb25uQ29udGV4dCAqY29udGV4dCwgdWludDMyX3QgaWQsIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSA6Ci0gICAgICBjb25uQ29udGV4dChjb250ZXh0KSwKLSAgICAgIG5hbWUobmFtZSksCi0gICAgICBpZChpZCkge30KK3B1YmxpYzoKKyAgQ2FsbENvbnRleHQoQ29ubkNvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGlkLCBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkKKyAgICA6IGNvbm5Db250ZXh0KGNvbnRleHQpLCBuYW1lKG5hbWUpLCBpZChpZCkge30KIAotICBDb25uQ29udGV4dCAqY29ubkNvbnRleHQ7CisgIENvbm5Db250ZXh0KiBjb25uQ29udGV4dDsKICAgc3RkOjpzdHJpbmcgbmFtZTsKICAgdWludDMyX3QgaWQ7CiB9OwogCiBjbGFzcyBTZXJ2ZXJFdmVudEhhbmRsZXIgOiBwdWJsaWMgc2VydmVyOjpUU2VydmVyRXZlbnRIYW5kbGVyIHsKLSBwdWJsaWM6Ci0gIFNlcnZlckV2ZW50SGFuZGxlcihjb25zdCBib29zdDo6c2hhcmVkX3B0cjxFdmVudExvZz4mIGxvZykgOgotICAgICAgbmV4dElkXygxKSwKLSAgICAgIGxvZ18obG9nKSB7fQorcHVibGljOgorICBTZXJ2ZXJFdmVudEhhbmRsZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEV2ZW50TG9nPiYgbG9nKSA6IG5leHRJZF8oMSksIGxvZ18obG9nKSB7fQogCiAgIHZpcnR1YWwgdm9pZCBwcmVTZXJ2ZSgpIHt9CiAKLSAgdmlydHVhbCB2b2lkKiBjcmVhdGVDb250ZXh0KGJvb3N0OjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gb3V0cHV0KSB7CisgIHZpcnR1YWwgdm9pZCogY3JlYXRlQ29udGV4dChzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gb3V0cHV0KSB7CiAgICAgQ29ubkNvbnRleHQqIGNvbnRleHQgPSBuZXcgQ29ubkNvbnRleHQoaW5wdXQsIG91dHB1dCwgbmV4dElkXyk7CiAgICAgKytuZXh0SWRfOwogICAgIGxvZ18tPmFwcGVuZChFdmVudExvZzo6RVRfQ09OTl9DUkVBVEVELCBjb250ZXh0LT5pZCwgMCk7CkBAIC0yMDksOCArMjA5LDggQEAKICAgfQogCiAgIHZpcnR1YWwgdm9pZCBkZWxldGVDb250ZXh0KHZvaWQqIHNlcnZlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+aW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+b3V0cHV0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IG91dHB1dCkgewogICAgIENvbm5Db250ZXh0KiBjb250ZXh0ID0gcmVpbnRlcnByZXRfY2FzdDxDb25uQ29udGV4dCo+KHNlcnZlckNvbnRleHQpOwogCiAgICAgaWYgKGlucHV0ICE9IGNvbnRleHQtPmlucHV0KSB7CkBAIC0yMjUsMzggKzIyNSwzOCBAQAogICAgIGRlbGV0ZSBjb250ZXh0OwogICB9CiAKLSAgdmlydHVhbCB2b2lkIHByb2Nlc3NDb250ZXh0KAotICAgICAgdm9pZCogc2VydmVyQ29udGV4dCwKLSAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPHRyYW5zcG9ydDo6VFRyYW5zcG9ydD4gdHJhbnNwb3J0KSB7Ci0gICAgLy8gVE9ETzogV2UgY3VycmVudGx5IGRvbid0IHRlc3QgdGhlIGJlaGF2aW9yIG9mIHRoZSBwcm9jZXNzQ29udGV4dCgpCi0gICAgLy8gY2FsbHMuICBUaGUgdmFyaW91cyBzZXJ2ZXIgaW1wbGVtZW50YXRpb25zIGNhbGwgcHJvY2Vzc0NvbnRleHQoKSBhdAotICAgIC8vIHNsaWdodGx5IGRpZmZlcmVudCB0aW1lcywgYW5kIGl0IGlzIHRvbyBhbm5veWluZyB0byB0cnkgYW5kIGFjY291bnQgZm9yCi0gICAgLy8gdGhlaXIgdmFyaW91cyBkaWZmZXJlbmNlcy4KLSAgICAvLwotICAgIC8vIFRUaHJlYWRlZFNlcnZlciwgVFRocmVhZFBvb2xTZXJ2ZXIsIGFuZCBUU2ltcGxlU2VydmVyIHVzdWFsbHkgd2FpdCB1bnRpbAotICAgIC8vIHRoZXkgc2VlIHRoZSBmaXJzdCBieXRlIG9mIGEgcmVxdWVzdCBiZWZvcmUgY2FsbGluZyBwcm9jZXNzQ29udGV4dCgpLgotICAgIC8vIEhvd2V2ZXIsIHRoZXkgZG9uJ3Qgd2FpdCBmb3IgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIHZlcnkgZmlyc3QgcmVxdWVzdCwKLSAgICAvLyBhbmQgaW5zdGVhZCBpbW1lZGlhdGVseSBjYWxsIHByb2Nlc3NDb250ZXh0KCkgYmVmb3JlIGFueSBkYXRhIGlzCi0gICAgLy8gcmVjZWl2ZWQuCi0gICAgLy8KLSAgICAvLyBUTm9uYmxvY2tpbmdTZXJ2ZXIgYWx3YXlzIHdhaXRzIHVudGlsIHJlY2VpdmluZyB0aGUgZnVsbCByZXF1ZXN0IGJlZm9yZQotICAgIC8vIGNhbGxpbmcgcHJvY2Vzc0NvbnRleHQoKS4KKyAgdmlydHVhbCB2b2lkIHByb2Nlc3NDb250ZXh0KHZvaWQqIHNlcnZlckNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8dHJhbnNwb3J0OjpUVHJhbnNwb3J0PiB0cmFuc3BvcnQpIHsKKy8vIFRPRE86IFdlIGN1cnJlbnRseSBkb24ndCB0ZXN0IHRoZSBiZWhhdmlvciBvZiB0aGUgcHJvY2Vzc0NvbnRleHQoKQorLy8gY2FsbHMuICBUaGUgdmFyaW91cyBzZXJ2ZXIgaW1wbGVtZW50YXRpb25zIGNhbGwgcHJvY2Vzc0NvbnRleHQoKSBhdAorLy8gc2xpZ2h0bHkgZGlmZmVyZW50IHRpbWVzLCBhbmQgaXQgaXMgdG9vIGFubm95aW5nIHRvIHRyeSBhbmQgYWNjb3VudCBmb3IKKy8vIHRoZWlyIHZhcmlvdXMgZGlmZmVyZW5jZXMuCisvLworLy8gVFRocmVhZGVkU2VydmVyLCBUVGhyZWFkUG9vbFNlcnZlciwgYW5kIFRTaW1wbGVTZXJ2ZXIgdXN1YWxseSB3YWl0IHVudGlsCisvLyB0aGV5IHNlZSB0aGUgZmlyc3QgYnl0ZSBvZiBhIHJlcXVlc3QgYmVmb3JlIGNhbGxpbmcgcHJvY2Vzc0NvbnRleHQoKS4KKy8vIEhvd2V2ZXIsIHRoZXkgZG9uJ3Qgd2FpdCBmb3IgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIHZlcnkgZmlyc3QgcmVxdWVzdCwKKy8vIGFuZCBpbnN0ZWFkIGltbWVkaWF0ZWx5IGNhbGwgcHJvY2Vzc0NvbnRleHQoKSBiZWZvcmUgYW55IGRhdGEgaXMKKy8vIHJlY2VpdmVkLgorLy8KKy8vIFROb25ibG9ja2luZ1NlcnZlciBhbHdheXMgd2FpdHMgdW50aWwgcmVjZWl2aW5nIHRoZSBmdWxsIHJlcXVlc3QgYmVmb3JlCisvLyBjYWxsaW5nIHByb2Nlc3NDb250ZXh0KCkuCiAjaWYgMAogICAgIENvbm5Db250ZXh0KiBjb250ZXh0ID0gcmVpbnRlcnByZXRfY2FzdDxDb25uQ29udGV4dCo+KHNlcnZlckNvbnRleHQpOwogICAgIGxvZ18tPmFwcGVuZChFdmVudExvZzo6RVRfUFJPQ0VTUywgY29udGV4dC0+aWQsIDApOworI2Vsc2UKKyAgICBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFKHNlcnZlckNvbnRleHQpOworICAgIFRIUklGVF9VTlVTRURfVkFSSUFCTEUodHJhbnNwb3J0KTsKICNlbmRpZgogICB9CiAKLSBwcm90ZWN0ZWQ6Citwcm90ZWN0ZWQ6CiAgIHVpbnQzMl90IG5leHRJZF87Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPEV2ZW50TG9nPiBsb2dfOworICBzdGQ6OnNoYXJlZF9wdHI8RXZlbnRMb2c+IGxvZ187CiB9OwogCiBjbGFzcyBQcm9jZXNzb3JFdmVudEhhbmRsZXIgOiBwdWJsaWMgVFByb2Nlc3NvckV2ZW50SGFuZGxlciB7Ci0gcHVibGljOgotICBQcm9jZXNzb3JFdmVudEhhbmRsZXIoY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8RXZlbnRMb2c+JiBsb2cpIDoKLSAgICAgIG5leHRJZF8oMSksCi0gICAgICBsb2dfKGxvZykge30KK3B1YmxpYzoKKyAgUHJvY2Vzc29yRXZlbnRIYW5kbGVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxFdmVudExvZz4mIGxvZykgOiBuZXh0SWRfKDEpLCBsb2dfKGxvZykge30KIAogICB2b2lkKiBnZXRDb250ZXh0KGNvbnN0IGNoYXIqIGZuTmFtZSwgdm9pZCogc2VydmVyQ29udGV4dCkgewogICAgIENvbm5Db250ZXh0KiBjb25uQ29udGV4dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q29ubkNvbnRleHQqPihzZXJ2ZXJDb250ZXh0KTsKQEAgLTI2NCw3OCArMjY0LDc1IEBACiAgICAgQ2FsbENvbnRleHQqIGNvbnRleHQgPSBuZXcgQ2FsbENvbnRleHQoY29ubkNvbnRleHQsIG5leHRJZF8sIGZuTmFtZSk7CiAgICAgKytuZXh0SWRfOwogCi0gICAgbG9nXy0+YXBwZW5kKEV2ZW50TG9nOjpFVF9DQUxMX1NUQVJURUQsIGNvbm5Db250ZXh0LT5pZCwgY29udGV4dC0+aWQsCi0gICAgICAgICAgICAgICAgIGZuTmFtZSk7CisgICAgbG9nXy0+YXBwZW5kKEV2ZW50TG9nOjpFVF9DQUxMX1NUQVJURUQsIGNvbm5Db250ZXh0LT5pZCwgY29udGV4dC0+aWQsIGZuTmFtZSk7CiAgICAgcmV0dXJuIGNvbnRleHQ7CiAgIH0KIAogICB2b2lkIGZyZWVDb250ZXh0KHZvaWQqIGN0eCwgY29uc3QgY2hhciogZm5OYW1lKSB7CiAgICAgQ2FsbENvbnRleHQqIGNvbnRleHQgPSByZWludGVycHJldF9jYXN0PENhbGxDb250ZXh0Kj4oY3R4KTsKICAgICBjaGVja05hbWUoY29udGV4dCwgZm5OYW1lKTsKLSAgICBsb2dfLT5hcHBlbmQoRXZlbnRMb2c6OkVUX0NBTExfRklOSVNIRUQsIGNvbnRleHQtPmNvbm5Db250ZXh0LT5pZCwKLSAgICAgICAgICAgICAgICAgY29udGV4dC0+aWQsIGZuTmFtZSk7CisgICAgbG9nXy0+YXBwZW5kKEV2ZW50TG9nOjpFVF9DQUxMX0ZJTklTSEVELCBjb250ZXh0LT5jb25uQ29udGV4dC0+aWQsIGNvbnRleHQtPmlkLCBmbk5hbWUpOwogICAgIGRlbGV0ZSBjb250ZXh0OwogICB9CiAKICAgdm9pZCBwcmVSZWFkKHZvaWQqIGN0eCwgY29uc3QgY2hhciogZm5OYW1lKSB7CiAgICAgQ2FsbENvbnRleHQqIGNvbnRleHQgPSByZWludGVycHJldF9jYXN0PENhbGxDb250ZXh0Kj4oY3R4KTsKICAgICBjaGVja05hbWUoY29udGV4dCwgZm5OYW1lKTsKLSAgICBsb2dfLT5hcHBlbmQoRXZlbnRMb2c6OkVUX1BSRV9SRUFELCBjb250ZXh0LT5jb25uQ29udGV4dC0+aWQsIGNvbnRleHQtPmlkLAotICAgICAgICAgICAgICAgICBmbk5hbWUpOworICAgIGxvZ18tPmFwcGVuZChFdmVudExvZzo6RVRfUFJFX1JFQUQsIGNvbnRleHQtPmNvbm5Db250ZXh0LT5pZCwgY29udGV4dC0+aWQsIGZuTmFtZSk7CiAgIH0KIAogICB2b2lkIHBvc3RSZWFkKHZvaWQqIGN0eCwgY29uc3QgY2hhciogZm5OYW1lLCB1aW50MzJfdCBieXRlcykgeworICAgIFRIUklGVF9VTlVTRURfVkFSSUFCTEUoYnl0ZXMpOwogICAgIENhbGxDb250ZXh0KiBjb250ZXh0ID0gcmVpbnRlcnByZXRfY2FzdDxDYWxsQ29udGV4dCo+KGN0eCk7CiAgICAgY2hlY2tOYW1lKGNvbnRleHQsIGZuTmFtZSk7Ci0gICAgbG9nXy0+YXBwZW5kKEV2ZW50TG9nOjpFVF9QT1NUX1JFQUQsIGNvbnRleHQtPmNvbm5Db250ZXh0LT5pZCwgY29udGV4dC0+aWQsCi0gICAgICAgICAgICAgICAgIGZuTmFtZSk7CisgICAgbG9nXy0+YXBwZW5kKEV2ZW50TG9nOjpFVF9QT1NUX1JFQUQsIGNvbnRleHQtPmNvbm5Db250ZXh0LT5pZCwgY29udGV4dC0+aWQsIGZuTmFtZSk7CiAgIH0KIAogICB2b2lkIHByZVdyaXRlKHZvaWQqIGN0eCwgY29uc3QgY2hhciogZm5OYW1lKSB7CiAgICAgQ2FsbENvbnRleHQqIGNvbnRleHQgPSByZWludGVycHJldF9jYXN0PENhbGxDb250ZXh0Kj4oY3R4KTsKICAgICBjaGVja05hbWUoY29udGV4dCwgZm5OYW1lKTsKLSAgICBsb2dfLT5hcHBlbmQoRXZlbnRMb2c6OkVUX1BSRV9XUklURSwgY29udGV4dC0+Y29ubkNvbnRleHQtPmlkLCBjb250ZXh0LT5pZCwKLSAgICAgICAgICAgICAgICAgZm5OYW1lKTsKKyAgICBsb2dfLT5hcHBlbmQoRXZlbnRMb2c6OkVUX1BSRV9XUklURSwgY29udGV4dC0+Y29ubkNvbnRleHQtPmlkLCBjb250ZXh0LT5pZCwgZm5OYW1lKTsKICAgfQogCiAgIHZvaWQgcG9zdFdyaXRlKHZvaWQqIGN0eCwgY29uc3QgY2hhciogZm5OYW1lLCB1aW50MzJfdCBieXRlcykgeworICAgIFRIUklGVF9VTlVTRURfVkFSSUFCTEUoYnl0ZXMpOwogICAgIENhbGxDb250ZXh0KiBjb250ZXh0ID0gcmVpbnRlcnByZXRfY2FzdDxDYWxsQ29udGV4dCo+KGN0eCk7CiAgICAgY2hlY2tOYW1lKGNvbnRleHQsIGZuTmFtZSk7Ci0gICAgbG9nXy0+YXBwZW5kKEV2ZW50TG9nOjpFVF9QT1NUX1dSSVRFLCBjb250ZXh0LT5jb25uQ29udGV4dC0+aWQsCi0gICAgICAgICAgICAgICAgIGNvbnRleHQtPmlkLCBmbk5hbWUpOworICAgIGxvZ18tPmFwcGVuZChFdmVudExvZzo6RVRfUE9TVF9XUklURSwgY29udGV4dC0+Y29ubkNvbnRleHQtPmlkLCBjb250ZXh0LT5pZCwgZm5OYW1lKTsKICAgfQogCiAgIHZvaWQgYXN5bmNDb21wbGV0ZSh2b2lkKiBjdHgsIGNvbnN0IGNoYXIqIGZuTmFtZSkgewogICAgIENhbGxDb250ZXh0KiBjb250ZXh0ID0gcmVpbnRlcnByZXRfY2FzdDxDYWxsQ29udGV4dCo+KGN0eCk7CiAgICAgY2hlY2tOYW1lKGNvbnRleHQsIGZuTmFtZSk7Ci0gICAgbG9nXy0+YXBwZW5kKEV2ZW50TG9nOjpFVF9BU1lOQ19DT01QTEVURSwgY29udGV4dC0+Y29ubkNvbnRleHQtPmlkLAotICAgICAgICAgICAgICAgICBjb250ZXh0LT5pZCwgZm5OYW1lKTsKKyAgICBsb2dfLT5hcHBlbmQoRXZlbnRMb2c6OkVUX0FTWU5DX0NPTVBMRVRFLCBjb250ZXh0LT5jb25uQ29udGV4dC0+aWQsIGNvbnRleHQtPmlkLCBmbk5hbWUpOwogICB9CiAKICAgdm9pZCBoYW5kbGVyRXJyb3Iodm9pZCogY3R4LCBjb25zdCBjaGFyKiBmbk5hbWUpIHsKICAgICBDYWxsQ29udGV4dCogY29udGV4dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q2FsbENvbnRleHQqPihjdHgpOwogICAgIGNoZWNrTmFtZShjb250ZXh0LCBmbk5hbWUpOwotICAgIGxvZ18tPmFwcGVuZChFdmVudExvZzo6RVRfSEFORExFUl9FUlJPUiwgY29udGV4dC0+Y29ubkNvbnRleHQtPmlkLAotICAgICAgICAgICAgICAgICBjb250ZXh0LT5pZCwgZm5OYW1lKTsKKyAgICBsb2dfLT5hcHBlbmQoRXZlbnRMb2c6OkVUX0hBTkRMRVJfRVJST1IsIGNvbnRleHQtPmNvbm5Db250ZXh0LT5pZCwgY29udGV4dC0+aWQsIGZuTmFtZSk7CiAgIH0KIAotIHByb3RlY3RlZDoKK3Byb3RlY3RlZDoKICAgdm9pZCBjaGVja05hbWUoY29uc3QgQ2FsbENvbnRleHQqIGNvbnRleHQsIGNvbnN0IGNoYXIqIGZuTmFtZSkgewogICAgIC8vIE5vdGU6IHdlIGNhbid0IHVzZSBCT09TVF9DSEVDS19FUVVBTCBoZXJlLCBzaW5jZSB0aGUgaGFuZGxlciBydW5zIGluIGEKICAgICAvLyBkaWZmZXJlbnQgdGhyZWFkIGZyb20gdGhlIHRlc3QgZnVuY3Rpb25zLiAgSnVzdCBhYm9ydCBpZiB0aGUgbmFtZXMgYXJlCiAgICAgLy8gZGlmZmVyZW50CiAgICAgaWYgKGNvbnRleHQtPm5hbWUgIT0gZm5OYW1lKSB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgImNhbGwgY29udGV4dCBuYW1lIG1pc21hdGNoOiBcIiVzXCIgIT0gXCIlc1wiXG4iLAotICAgICAgICAgICAgICBjb250ZXh0LT5uYW1lLmNfc3RyKCksIGZuTmFtZSk7CisgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICAgImNhbGwgY29udGV4dCBuYW1lIG1pc21hdGNoOiBcIiVzXCIgIT0gXCIlc1wiXG4iLAorICAgICAgICAgICAgICBjb250ZXh0LT5uYW1lLmNfc3RyKCksCisgICAgICAgICAgICAgIGZuTmFtZSk7CiAgICAgICBmZmx1c2goc3RkZXJyKTsKICAgICAgIGFib3J0KCk7CiAgICAgfQogICB9CiAKICAgdWludDMyX3QgbmV4dElkXzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8RXZlbnRMb2c+IGxvZ187CisgIHN0ZDo6c2hhcmVkX3B0cjxFdmVudExvZz4gbG9nXzsKIH07Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6dGVzdAorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dGVzdAogCiAjZW5kaWYgLy8gX1RIUklGVF9QUk9DRVNTT1JfVEVTVF9IQU5ETEVSU19IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L3Byb2Nlc3Nvci9Qcm9jZXNzb3JUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9wcm9jZXNzb3IvUHJvY2Vzc29yVGVzdC5jcHAKaW5kZXggMDI4M2QyMC4uMzZjZTAxMyAxMDA2NDQKLS0tIGEvbGliL2NwcC90ZXN0L3Byb2Nlc3Nvci9Qcm9jZXNzb3JUZXN0LmNwcAorKysgYi9saWIvY3BwL3Rlc3QvcHJvY2Vzc29yL1Byb2Nlc3NvclRlc3QuY3BwCkBAIC0yMywxMCArMjMsOSBAQAogICogaW1wbGVtZW50YXRpb25zLgogICovCiAKLSNpbmNsdWRlIDx0cjEvZnVuY3Rpb25hbD4KICNpbmNsdWRlIDxib29zdC90ZXN0L3VuaXRfdGVzdC5ocHA+CiAKLSNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvUG9zaXhUaHJlYWRGYWN0b3J5Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1BsYXRmb3JtVGhyZWFkRmFjdG9yeS5oPgogI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPgogI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFRocmVhZGVkU2VydmVyLmg+CkBAIC0zNCwxMzAgKzMzLDEyOSBAQAogI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVE5vbmJsb2NraW5nU2VydmVyLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UU2ltcGxlU2VydmVyLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQuaD4KIAogI2luY2x1ZGUgIkV2ZW50TG9nLmgiCiAjaW5jbHVkZSAiU2VydmVyVGhyZWFkLmgiCiAjaW5jbHVkZSAiSGFuZGxlcnMuaCIKICNpbmNsdWRlICJnZW4tY3BwL0NoaWxkU2VydmljZS5oIgogCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotdXNpbmcgbmFtZXNwYWNlIGJvb3N0OwogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OwogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTsKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w7CiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcjsKLXVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OwotCiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnRlc3Q7Cit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjp2ZWN0b3I7CiAKIC8qCiAgKiBUcmFpdHMgY2xhc3NlcyB0aGF0IGVuY2Fwc3VsYXRlIGhvdyB0byBjcmVhdGUgdmFyaW91cyB0eXBlcyBvZiBzZXJ2ZXJzLgogICovCiAKIGNsYXNzIFRTaW1wbGVTZXJ2ZXJUcmFpdHMgewotIHB1YmxpYzoKK3B1YmxpYzoKICAgdHlwZWRlZiBUU2ltcGxlU2VydmVyIFNlcnZlclR5cGU7CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNpbXBsZVNlcnZlcj4gY3JlYXRlU2VydmVyKAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKKyAgc3RkOjpzaGFyZWRfcHRyPFRTaW1wbGVTZXJ2ZXI+IGNyZWF0ZVNlcnZlcigKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAogICAgICAgdWludDE2X3QgcG9ydCwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnkpIHsKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyU29ja2V0PiBzb2NrZXQobmV3IFRTZXJ2ZXJTb2NrZXQocG9ydCkpOwotICAgIHJldHVybiBib29zdDo6c2hhcmVkX3B0cjxUU2ltcGxlU2VydmVyPihuZXcgVFNpbXBsZVNlcnZlcigKLSAgICAgICAgICBwcm9jZXNzb3IsIHNvY2tldCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KSk7CisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnkpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlclNvY2tldD4gc29ja2V0KG5ldyBUU2VydmVyU29ja2V0KHBvcnQpKTsKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPFRTaW1wbGVTZXJ2ZXI+KAorICAgICAgICBuZXcgVFNpbXBsZVNlcnZlcihwcm9jZXNzb3IsIHNvY2tldCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KSk7CiAgIH0KIH07CiAKIGNsYXNzIFRUaHJlYWRlZFNlcnZlclRyYWl0cyB7Ci0gcHVibGljOgorcHVibGljOgogICB0eXBlZGVmIFRUaHJlYWRlZFNlcnZlciBTZXJ2ZXJUeXBlOwogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUaHJlYWRlZFNlcnZlcj4gY3JlYXRlU2VydmVyKAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKKyAgc3RkOjpzaGFyZWRfcHRyPFRUaHJlYWRlZFNlcnZlcj4gY3JlYXRlU2VydmVyKAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCiAgICAgICB1aW50MTZfdCBwb3J0LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSkgewotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJTb2NrZXQ+IHNvY2tldChuZXcgVFNlcnZlclNvY2tldChwb3J0KSk7Ci0gICAgcmV0dXJuIGJvb3N0OjpzaGFyZWRfcHRyPFRUaHJlYWRlZFNlcnZlcj4obmV3IFRUaHJlYWRlZFNlcnZlcigKLSAgICAgICAgICBwcm9jZXNzb3IsIHNvY2tldCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KSk7CisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnkpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlclNvY2tldD4gc29ja2V0KG5ldyBUU2VydmVyU29ja2V0KHBvcnQpKTsKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPFRUaHJlYWRlZFNlcnZlcj4oCisgICAgICAgIG5ldyBUVGhyZWFkZWRTZXJ2ZXIocHJvY2Vzc29yLCBzb2NrZXQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSkpOwogICB9CiB9OwogCiBjbGFzcyBUVGhyZWFkUG9vbFNlcnZlclRyYWl0cyB7Ci0gcHVibGljOgorcHVibGljOgogICB0eXBlZGVmIFRUaHJlYWRQb29sU2VydmVyIFNlcnZlclR5cGU7CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRocmVhZFBvb2xTZXJ2ZXI+IGNyZWF0ZVNlcnZlcigKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCisgIHN0ZDo6c2hhcmVkX3B0cjxUVGhyZWFkUG9vbFNlcnZlcj4gY3JlYXRlU2VydmVyKAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCiAgICAgICB1aW50MTZfdCBwb3J0LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSkgewotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJTb2NrZXQ+IHNvY2tldChuZXcgVFNlcnZlclNvY2tldChwb3J0KSk7CisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnkpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlclNvY2tldD4gc29ja2V0KG5ldyBUU2VydmVyU29ja2V0KHBvcnQpKTsKIAotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFBvc2l4VGhyZWFkRmFjdG9yeT4gdGhyZWFkRmFjdG9yeShuZXcgUG9zaXhUaHJlYWRGYWN0b3J5KTsKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyID0KLSAgICAgIFRocmVhZE1hbmFnZXI6Om5ld1NpbXBsZVRocmVhZE1hbmFnZXIoOCk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFBsYXRmb3JtVGhyZWFkRmFjdG9yeT4gdGhyZWFkRmFjdG9yeShuZXcgUGxhdGZvcm1UaHJlYWRGYWN0b3J5KTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlciA9IFRocmVhZE1hbmFnZXI6Om5ld1NpbXBsZVRocmVhZE1hbmFnZXIoOCk7CiAgICAgdGhyZWFkTWFuYWdlci0+dGhyZWFkRmFjdG9yeSh0aHJlYWRGYWN0b3J5KTsKICAgICB0aHJlYWRNYW5hZ2VyLT5zdGFydCgpOwogCi0gICAgcmV0dXJuIGJvb3N0OjpzaGFyZWRfcHRyPFRUaHJlYWRQb29sU2VydmVyPihuZXcgVFRocmVhZFBvb2xTZXJ2ZXIoCi0gICAgICAgICAgcHJvY2Vzc29yLCBzb2NrZXQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICB0aHJlYWRNYW5hZ2VyKSk7CisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxUVGhyZWFkUG9vbFNlcnZlcj4oCisgICAgICAgIG5ldyBUVGhyZWFkUG9vbFNlcnZlcihwcm9jZXNzb3IsIHNvY2tldCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5LCB0aHJlYWRNYW5hZ2VyKSk7CiAgIH0KIH07CiAKIGNsYXNzIFROb25ibG9ja2luZ1NlcnZlclRyYWl0cyB7Ci0gcHVibGljOgorcHVibGljOgogICB0eXBlZGVmIFROb25ibG9ja2luZ1NlcnZlciBTZXJ2ZXJUeXBlOwogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFROb25ibG9ja2luZ1NlcnZlcj4gY3JlYXRlU2VydmVyKAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKKyAgc3RkOjpzaGFyZWRfcHRyPFROb25ibG9ja2luZ1NlcnZlcj4gY3JlYXRlU2VydmVyKAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCiAgICAgICB1aW50MTZfdCBwb3J0LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSkgeworICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5KSB7CiAgICAgLy8gVE5vbmJsb2NraW5nU2VydmVyIGF1dG9tYXRpY2FsbHkgdXNlcyBURnJhbWVkVHJhbnNwb3J0LgogICAgIC8vIFJhaXNlIGFuIGV4Y2VwdGlvbiBpZiB0aGUgc3VwcGxpZWQgdHJhbnNwb3J0IGZhY3RvcnkgaXMgbm90IGEKICAgICAvLyBURnJhbWVkVHJhbnNwb3J0RmFjdG9yeQotICAgIFRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5KiBmcmFtZWRGYWN0b3J5ID0KLSAgICAgIGR5bmFtaWNfY2FzdDxURnJhbWVkVHJhbnNwb3J0RmFjdG9yeSo+KHRyYW5zcG9ydEZhY3RvcnkuZ2V0KCkpOworICAgIFRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5KiBmcmFtZWRGYWN0b3J5CisgICAgICAgID0gZHluYW1pY19jYXN0PFRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5Kj4odHJhbnNwb3J0RmFjdG9yeS5nZXQoKSk7CiAgICAgaWYgKGZyYW1lZEZhY3RvcnkgPT0gTlVMTCkgewogICAgICAgdGhyb3cgVEV4Y2VwdGlvbigiVE5vbmJsb2NraW5nU2VydmVyIG11c3QgdXNlIFRGcmFtZWRUcmFuc3BvcnQiKTsKICAgICB9CiAKLSAgICBib29zdDo6c2hhcmVkX3B0cjxQb3NpeFRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnkobmV3IFBvc2l4VGhyZWFkRmFjdG9yeSk7Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlciA9Ci0gICAgICBUaHJlYWRNYW5hZ2VyOjpuZXdTaW1wbGVUaHJlYWRNYW5hZ2VyKDgpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ+IHNvY2tldChuZXcgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0KHBvcnQpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8UGxhdGZvcm1UaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5KG5ldyBQbGF0Zm9ybVRocmVhZEZhY3RvcnkpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyID0gVGhyZWFkTWFuYWdlcjo6bmV3U2ltcGxlVGhyZWFkTWFuYWdlcig4KTsKICAgICB0aHJlYWRNYW5hZ2VyLT50aHJlYWRGYWN0b3J5KHRocmVhZEZhY3RvcnkpOwogICAgIHRocmVhZE1hbmFnZXItPnN0YXJ0KCk7CiAKLSAgICByZXR1cm4gYm9vc3Q6OnNoYXJlZF9wdHI8VE5vbmJsb2NraW5nU2VydmVyPihuZXcgVE5vbmJsb2NraW5nU2VydmVyKAotICAgICAgICAgIHByb2Nlc3NvciwgcHJvdG9jb2xGYWN0b3J5LCBwb3J0LCB0aHJlYWRNYW5hZ2VyKSk7CisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxUTm9uYmxvY2tpbmdTZXJ2ZXI+KAorICAgICAgICBuZXcgVE5vbmJsb2NraW5nU2VydmVyKHByb2Nlc3NvciwgcHJvdG9jb2xGYWN0b3J5LCBzb2NrZXQsIHRocmVhZE1hbmFnZXIpKTsKICAgfQogfTsKIAogY2xhc3MgVE5vbmJsb2NraW5nU2VydmVyTm9UaHJlYWRzVHJhaXRzIHsKLSBwdWJsaWM6CitwdWJsaWM6CiAgIHR5cGVkZWYgVE5vbmJsb2NraW5nU2VydmVyIFNlcnZlclR5cGU7CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VE5vbmJsb2NraW5nU2VydmVyPiBjcmVhdGVTZXJ2ZXIoCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAorICBzdGQ6OnNoYXJlZF9wdHI8VE5vbmJsb2NraW5nU2VydmVyPiBjcmVhdGVTZXJ2ZXIoCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKICAgICAgIHVpbnQxNl90IHBvcnQsCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5KSB7CisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnkpIHsKICAgICAvLyBUTm9uYmxvY2tpbmdTZXJ2ZXIgYXV0b21hdGljYWxseSB1c2VzIFRGcmFtZWRUcmFuc3BvcnQuCiAgICAgLy8gUmFpc2UgYW4gZXhjZXB0aW9uIGlmIHRoZSBzdXBwbGllZCB0cmFuc3BvcnQgZmFjdG9yeSBpcyBub3QgYQogICAgIC8vIFRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5Ci0gICAgVEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkqIGZyYW1lZEZhY3RvcnkgPQotICAgICAgZHluYW1pY19jYXN0PFRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5Kj4odHJhbnNwb3J0RmFjdG9yeS5nZXQoKSk7CisgICAgVEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkqIGZyYW1lZEZhY3RvcnkKKyAgICAgICAgPSBkeW5hbWljX2Nhc3Q8VEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkqPih0cmFuc3BvcnRGYWN0b3J5LmdldCgpKTsKICAgICBpZiAoZnJhbWVkRmFjdG9yeSA9PSBOVUxMKSB7CiAgICAgICB0aHJvdyBURXhjZXB0aW9uKCJUTm9uYmxvY2tpbmdTZXJ2ZXIgbXVzdCB1c2UgVEZyYW1lZFRyYW5zcG9ydCIpOwogICAgIH0KIAorICAgIHN0ZDo6c2hhcmVkX3B0cjxUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ+IHNvY2tldChuZXcgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0KHBvcnQpKTsKICAgICAvLyBVc2UgYSBOVUxMIFRocmVhZE1hbmFnZXIKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyOwotICAgIHJldHVybiBib29zdDo6c2hhcmVkX3B0cjxUTm9uYmxvY2tpbmdTZXJ2ZXI+KG5ldyBUTm9uYmxvY2tpbmdTZXJ2ZXIoCi0gICAgICAgICAgcHJvY2Vzc29yLCBwcm90b2NvbEZhY3RvcnksIHBvcnQsIHRocmVhZE1hbmFnZXIpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlcjsKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPFROb25ibG9ja2luZ1NlcnZlcj4oCisgICAgICAgIG5ldyBUTm9uYmxvY2tpbmdTZXJ2ZXIocHJvY2Vzc29yLCBwcm90b2NvbEZhY3RvcnksIHNvY2tldCwgdGhyZWFkTWFuYWdlcikpOwogICB9CiB9OwogCkBAIC0xNzQsNyArMTcyLDcgQEAKICAqLwogCiBjbGFzcyBVbnRlbXBsYXRlZFRyYWl0cyB7Ci0gcHVibGljOgorcHVibGljOgogICB0eXBlZGVmIFRCaW5hcnlQcm90b2NvbEZhY3RvcnkgUHJvdG9jb2xGYWN0b3J5OwogICB0eXBlZGVmIFRCaW5hcnlQcm90b2NvbCBQcm90b2NvbDsKIApAQCAtMTg1LDcgKzE4Myw3IEBACiB9OwogCiBjbGFzcyBUZW1wbGF0ZWRUcmFpdHMgewotIHB1YmxpYzoKK3B1YmxpYzoKICAgdHlwZWRlZiBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5VDxUQnVmZmVyQmFzZT4gUHJvdG9jb2xGYWN0b3J5OwogICB0eXBlZGVmIFRCaW5hcnlQcm90b2NvbFQ8VEJ1ZmZlckJhc2U+IFByb3RvY29sOwogCkBAIC0xOTUsMTAgKzE5Myw5IEBACiAgIHR5cGVkZWYgQ2hpbGRTZXJ2aWNlQ2xpZW50VDxQcm90b2NvbD4gQ2hpbGRDbGllbnQ7CiB9OwogCi0KLXRlbXBsYXRlPHR5cGVuYW1lIFRlbXBsYXRlVHJhaXRzXz4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUZW1wbGF0ZVRyYWl0c18+CiBjbGFzcyBQYXJlbnRTZXJ2aWNlVHJhaXRzIHsKLSBwdWJsaWM6CitwdWJsaWM6CiAgIHR5cGVkZWYgdHlwZW5hbWUgVGVtcGxhdGVUcmFpdHNfOjpQYXJlbnRQcm9jZXNzb3IgUHJvY2Vzc29yOwogICB0eXBlZGVmIHR5cGVuYW1lIFRlbXBsYXRlVHJhaXRzXzo6UGFyZW50Q2xpZW50IENsaWVudDsKICAgdHlwZWRlZiBQYXJlbnRIYW5kbGVyIEhhbmRsZXI7CkBAIC0yMDcsOSArMjA0LDkgQEAKICAgdHlwZWRlZiB0eXBlbmFtZSBUZW1wbGF0ZVRyYWl0c186OlByb3RvY29sIFByb3RvY29sOwogfTsKIAotdGVtcGxhdGU8dHlwZW5hbWUgVGVtcGxhdGVUcmFpdHNfPgordGVtcGxhdGUgPHR5cGVuYW1lIFRlbXBsYXRlVHJhaXRzXz4KIGNsYXNzIENoaWxkU2VydmljZVRyYWl0cyB7Ci0gcHVibGljOgorcHVibGljOgogICB0eXBlZGVmIHR5cGVuYW1lIFRlbXBsYXRlVHJhaXRzXzo6Q2hpbGRQcm9jZXNzb3IgUHJvY2Vzc29yOwogICB0eXBlZGVmIHR5cGVuYW1lIFRlbXBsYXRlVHJhaXRzXzo6Q2hpbGRDbGllbnQgQ2xpZW50OwogICB0eXBlZGVmIENoaWxkSGFuZGxlciBIYW5kbGVyOwpAQCAtMjI1LDE3ICsyMjIsMTggQEAKIC8vIEl0IHdvdWxkIGFsc28gYmUgbmllYyBpZiB0aGV5IHVzZWQgY292YXJpYW50IHJldHVybiB0eXBlcy4gIFVuZm9ydHVuYXRlbHksCiAvLyBzaW5jZSB0aGV5IHJldHVybiBzaGFyZWRfcHRyIGluc3RlYWQgb2YgcmF3IHBvaW50ZXJzLCBjb3ZhcmlhbnQgcmV0dXJuIHR5cGVzCiAvLyB3b24ndCB3b3JrLgotdGVtcGxhdGU8dHlwZW5hbWUgU2VydmVyVHJhaXRzXywgdHlwZW5hbWUgU2VydmljZVRyYWl0c18sCi0gICAgICAgICB0eXBlbmFtZSBUcmFuc3BvcnRGYWN0b3J5XyA9IFRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgdHlwZW5hbWUgVHJhbnNwb3J0XyA9IFRGcmFtZWRUcmFuc3BvcnQ+Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2VydmVyVHJhaXRzXywKKyAgICAgICAgICB0eXBlbmFtZSBTZXJ2aWNlVHJhaXRzXywKKyAgICAgICAgICB0eXBlbmFtZSBUcmFuc3BvcnRGYWN0b3J5XyA9IFRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgIHR5cGVuYW1lIFRyYW5zcG9ydF8gPSBURnJhbWVkVHJhbnNwb3J0PgogY2xhc3MgU2VydmljZVN0YXRlIDogcHVibGljIFNlcnZlclN0YXRlIHsKLSBwdWJsaWM6CitwdWJsaWM6CiAgIHR5cGVkZWYgdHlwZW5hbWUgU2VydmljZVRyYWl0c186OlByb2Nlc3NvciBQcm9jZXNzb3I7CiAgIHR5cGVkZWYgdHlwZW5hbWUgU2VydmljZVRyYWl0c186OkNsaWVudCBDbGllbnQ7CiAgIHR5cGVkZWYgdHlwZW5hbWUgU2VydmljZVRyYWl0c186OkhhbmRsZXIgSGFuZGxlcjsKIAotICBTZXJ2aWNlU3RhdGUoKSA6Ci0gICAgICBwb3J0XygwKSwKKyAgU2VydmljZVN0YXRlKCkKKyAgICA6IHBvcnRfKDApLAogICAgICAgbG9nXyhuZXcgRXZlbnRMb2cpLAogICAgICAgaGFuZGxlcl8obmV3IEhhbmRsZXIobG9nXykpLAogICAgICAgcHJvY2Vzc29yXyhuZXcgUHJvY2Vzc29yKGhhbmRsZXJfKSksCkBAIC0yNDYsNjAgKzI0NCw0OCBAQAogICAgIHByb2Nlc3Nvcl8tPnNldEV2ZW50SGFuZGxlcihwcm9jZXNzb3JFdmVudEhhbmRsZXJfKTsKICAgfQogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXI+IGNyZWF0ZVNlcnZlcih1aW50MTZfdCBwb3J0KSB7CisgIHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyPiBjcmVhdGVTZXJ2ZXIodWludDE2X3QgcG9ydCkgewogICAgIFNlcnZlclRyYWl0c18gc2VydmVyVHJhaXRzOwotICAgIHJldHVybiBzZXJ2ZXJUcmFpdHMuY3JlYXRlU2VydmVyKHByb2Nlc3Nvcl8sIHBvcnQsIHRyYW5zcG9ydEZhY3RvcnlfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sRmFjdG9yeV8pOworICAgIHJldHVybiBzZXJ2ZXJUcmFpdHMuY3JlYXRlU2VydmVyKHByb2Nlc3Nvcl8sIHBvcnQsIHRyYW5zcG9ydEZhY3RvcnlfLCBwcm90b2NvbEZhY3RvcnlfKTsKICAgfQogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJFdmVudEhhbmRsZXI+IGdldFNlcnZlckV2ZW50SGFuZGxlcigpIHsKLSAgICByZXR1cm4gc2VydmVyRXZlbnRIYW5kbGVyXzsKLSAgfQorICBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlckV2ZW50SGFuZGxlcj4gZ2V0U2VydmVyRXZlbnRIYW5kbGVyKCkgeyByZXR1cm4gc2VydmVyRXZlbnRIYW5kbGVyXzsgfQogCi0gIHZvaWQgYmluZFN1Y2Nlc3NmdWwodWludDE2X3QgcG9ydCkgewotICAgIHBvcnRfID0gcG9ydDsKLSAgfQorICB2b2lkIGJpbmRTdWNjZXNzZnVsKHVpbnQxNl90IHBvcnQpIHsgcG9ydF8gPSBwb3J0OyB9CiAKLSAgdWludDE2X3QgZ2V0UG9ydCgpIGNvbnN0IHsKLSAgICByZXR1cm4gcG9ydF87Ci0gIH0KKyAgdWludDE2X3QgZ2V0UG9ydCgpIGNvbnN0IHsgcmV0dXJuIHBvcnRfOyB9CiAKLSAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8RXZlbnRMb2c+JiBnZXRMb2coKSBjb25zdCB7Ci0gICAgcmV0dXJuIGxvZ187Ci0gIH0KKyAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEV2ZW50TG9nPiYgZ2V0TG9nKCkgY29uc3QgeyByZXR1cm4gbG9nXzsgfQogCi0gIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPEhhbmRsZXI+JiBnZXRIYW5kbGVyKCkgY29uc3QgewotICAgIHJldHVybiBoYW5kbGVyXzsKLSAgfQorICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SGFuZGxlcj4mIGdldEhhbmRsZXIoKSBjb25zdCB7IHJldHVybiBoYW5kbGVyXzsgfQogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPENsaWVudD4gY3JlYXRlQ2xpZW50KCkgeworICBzdGQ6OnNoYXJlZF9wdHI8Q2xpZW50PiBjcmVhdGVDbGllbnQoKSB7CiAgICAgdHlwZWRlZiB0eXBlbmFtZSBTZXJ2aWNlVHJhaXRzXzo6UHJvdG9jb2wgUHJvdG9jb2w7CiAKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUU29ja2V0PiBzb2NrZXQobmV3IFRTb2NrZXQoIjEyNy4wLjAuMSIsIHBvcnRfKSk7Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VHJhbnNwb3J0Xz4gdHJhbnNwb3J0KG5ldyBUcmFuc3BvcnRfKHNvY2tldCkpOwotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFByb3RvY29sPiBwcm90b2NvbChuZXcgUHJvdG9jb2wodHJhbnNwb3J0KSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+IHNvY2tldChuZXcgVFNvY2tldCgiMTI3LjAuMC4xIiwgcG9ydF8pKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VHJhbnNwb3J0Xz4gdHJhbnNwb3J0KG5ldyBUcmFuc3BvcnRfKHNvY2tldCkpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxQcm90b2NvbD4gcHJvdG9jb2wobmV3IFByb3RvY29sKHRyYW5zcG9ydCkpOwogICAgIHRyYW5zcG9ydC0+b3BlbigpOwogCi0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8Q2xpZW50PiBjbGllbnQobmV3IENsaWVudChwcm90b2NvbCkpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDbGllbnQ+IGNsaWVudChuZXcgQ2xpZW50KHByb3RvY29sKSk7CiAgICAgcmV0dXJuIGNsaWVudDsKICAgfQogCi0gcHJpdmF0ZToKK3ByaXZhdGU6CiAgIHVpbnQxNl90IHBvcnRfOwotICBib29zdDo6c2hhcmVkX3B0cjxFdmVudExvZz4gbG9nXzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8SGFuZGxlcj4gaGFuZGxlcl87Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFByb2Nlc3Nvcj4gcHJvY2Vzc29yXzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IHRyYW5zcG9ydEZhY3RvcnlfOwotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnlfOwotICBib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyRXZlbnRIYW5kbGVyPiBzZXJ2ZXJFdmVudEhhbmRsZXJfOwotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yRXZlbnRIYW5kbGVyPiBwcm9jZXNzb3JFdmVudEhhbmRsZXJfOworICBzdGQ6OnNoYXJlZF9wdHI8RXZlbnRMb2c+IGxvZ187CisgIHN0ZDo6c2hhcmVkX3B0cjxIYW5kbGVyPiBoYW5kbGVyXzsKKyAgc3RkOjpzaGFyZWRfcHRyPFByb2Nlc3Nvcj4gcHJvY2Vzc29yXzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiB0cmFuc3BvcnRGYWN0b3J5XzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeV87CisgIHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyRXZlbnRIYW5kbGVyPiBzZXJ2ZXJFdmVudEhhbmRsZXJfOworICBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3NvckV2ZW50SGFuZGxlcj4gcHJvY2Vzc29yRXZlbnRIYW5kbGVyXzsKIH07CiAKLQogLyoqCiAgKiBDaGVjayB0aGF0IHRoZXJlIGFyZSBubyBtb3JlIGV2ZW50cyBpbiB0aGUgbG9nCiAgKi8KLXZvaWQgY2hlY2tOb0V2ZW50cyhjb25zdCBib29zdDo6c2hhcmVkX3B0cjxFdmVudExvZz4mIGxvZykgewordm9pZCBjaGVja05vRXZlbnRzKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxFdmVudExvZz4mIGxvZykgewogICAvLyBXYWl0IGZvciBhbiBldmVudCB3aXRoIGEgdmVyeSBzaG9ydCB0aW1lb3V0IHBlcmlvZC4gIFdlIGRvbid0IGV4cGVjdAogICAvLyBhbnl0aGluZyB0byBiZSBwcmVzZW50LCBzbyB3ZSB3aWxsIG5vcm1hbGx5IHdhaXQgZm9yIHRoZSBmdWxsIHRpbWVvdXQuCiAgIC8vIE9uIHRoZSBvdGhlciBoYW5kLCBhIG5vbi16ZXJvIHRpbWVvdXQgaXMgbmljZSBzaW5jZSBpdCBkb2VzIGdpdmUgYSBzaG9ydApAQCAtMzEzLDkgKzI5OSw5IEBACiAgKgogICogUmV0dXJucyB0aGUgY29ubmVjdGlvbiBJRCBhbGxvY2F0ZWQgYnkgdGhlIHNlcnZlci4KICAqLwotdWludDMyX3QgY2hlY2tOZXdDb25uRXZlbnRzKGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPEV2ZW50TG9nPiYgbG9nKSB7Cit1aW50MzJfdCBjaGVja05ld0Nvbm5FdmVudHMoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEV2ZW50TG9nPiYgbG9nKSB7CiAgIC8vIENoZWNrIGZvciBhbiBFVF9DT05OX0NSRUFURUQgZXZlbnQKLSAgRXZlbnQgZXZlbnQgPSBsb2ctPndhaXRGb3JFdmVudCgpOworICBFdmVudCBldmVudCA9IGxvZy0+d2FpdEZvckV2ZW50KDI1MDApOwogICBCT09TVF9DSEVDS19FUVVBTChFdmVudExvZzo6RVRfQ09OTl9DUkVBVEVELCBldmVudC50eXBlKTsKIAogICAvLyBTb21lIHNlcnZlcnMgY2FsbCB0aGUgcHJvY2Vzc0NvbnRleHQoKSBob29rIGltbWVkaWF0ZWx5LgpAQCAtMzI4LDcgKzMxNCw3IEBACiAvKioKICAqIENoZWNrIGZvciB0aGUgZXZlbnRzIHRoYXQgc2hvdWxkIGJlIGxvZ2dlZCB3aGVuIGEgY29ubmVjdGlvbiBpcyBjbG9zZWQuCiAgKi8KLXZvaWQgY2hlY2tDbG9zZUV2ZW50cyhjb25zdCBib29zdDo6c2hhcmVkX3B0cjxFdmVudExvZz4mIGxvZywgdWludDMyX3QgY29ubklkKSB7Cit2b2lkIGNoZWNrQ2xvc2VFdmVudHMoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEV2ZW50TG9nPiYgbG9nLCB1aW50MzJfdCBjb25uSWQpIHsKICAgLy8gQ2hlY2sgZm9yIGFuIEVUX0NPTk5fREVTVFJPWUVEIGV2ZW50CiAgIEV2ZW50IGV2ZW50ID0gbG9nLT53YWl0Rm9yRXZlbnQoKTsKICAgQk9PU1RfQ0hFQ0tfRVFVQUwoRXZlbnRMb2c6OkVUX0NPTk5fREVTVFJPWUVELCBldmVudC50eXBlKTsKQEAgLTM0Niw3ICszMzIsNyBAQAogICoKICAqIFJldHVybnMgdGhlIGNhbGwgSUQgYWxsb2NhdGVkIGJ5IHRoZSBzZXJ2ZXIuCiAgKi8KLXVpbnQzMl90IGNoZWNrQ2FsbEhhbmRsZXJFdmVudHMoY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8RXZlbnRMb2c+JiBsb2csCit1aW50MzJfdCBjaGVja0NhbGxIYW5kbGVyRXZlbnRzKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxFdmVudExvZz4mIGxvZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29ubklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudFR5cGUgY2FsbFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgY2FsbE5hbWUpIHsKQEAgLTM4Myw3ICszNjksNyBAQAogLyoqCiAgKiBDaGVjayBmb3IgdGhlIGV2ZW50cyB0aGF0IHNob3VsZCBiZSBhZnRlciBhIGhhbmRsZXIgcmV0dXJucy4KICAqLwotdm9pZCBjaGVja0NhbGxQb3N0SGFuZGxlckV2ZW50cyhjb25zdCBib29zdDo6c2hhcmVkX3B0cjxFdmVudExvZz4mIGxvZywKK3ZvaWQgY2hlY2tDYWxsUG9zdEhhbmRsZXJFdmVudHMoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEV2ZW50TG9nPiYgbG9nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb25uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNhbGxJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBjYWxsTmFtZSkgewpAQCAtNDIzLDcgKzQwOSw3IEBACiAgKgogICogUmV0dXJucyB0aGUgY2FsbCBJRCBhbGxvY2F0ZWQgYnkgdGhlIHNlcnZlci4KICAqLwotdWludDMyX3QgY2hlY2tDYWxsRXZlbnRzKGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPEV2ZW50TG9nPiYgbG9nLAordWludDMyX3QgY2hlY2tDYWxsRXZlbnRzKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxFdmVudExvZz4mIGxvZywKICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb25uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRUeXBlIGNhbGxUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgY2FsbE5hbWUpIHsKQEAgLTQzNyw5ICs0MjMsOSBAQAogICogVGVzdCBmdW5jdGlvbnMKICAqLwogCi10ZW1wbGF0ZTx0eXBlbmFtZSBTdGF0ZV8+Ci12b2lkIHRlc3RQYXJlbnRTZXJ2aWNlKGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFN0YXRlXz4mIHN0YXRlKSB7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPHR5cGVuYW1lIFN0YXRlXzo6Q2xpZW50PiBjbGllbnQgPSBzdGF0ZS0+Y3JlYXRlQ2xpZW50KCk7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU3RhdGVfPgordm9pZCB0ZXN0UGFyZW50U2VydmljZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8U3RhdGVfPiYgc3RhdGUpIHsKKyAgc3RkOjpzaGFyZWRfcHRyPHR5cGVuYW1lIFN0YXRlXzo6Q2xpZW50PiBjbGllbnQgPSBzdGF0ZS0+Y3JlYXRlQ2xpZW50KCk7CiAKICAgaW50MzJfdCBnZW4gPSBjbGllbnQtPmdldEdlbmVyYXRpb24oKTsKICAgaW50MzJfdCBuZXdHZW4gPSBjbGllbnQtPmluY3JlbWVudEdlbmVyYXRpb24oKTsKQEAgLTQ1OSw5ICs0NDUsOSBAQAogICBCT09TVF9SRVFVSVJFX0VRVUFMKCJhc2RmIiwgc3RyaW5nc1syXSk7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFN0YXRlXz4KLXZvaWQgdGVzdENoaWxkU2VydmljZShjb25zdCBib29zdDo6c2hhcmVkX3B0cjxTdGF0ZV8+JiBzdGF0ZSkgewotICBib29zdDo6c2hhcmVkX3B0cjx0eXBlbmFtZSBTdGF0ZV86OkNsaWVudD4gY2xpZW50ID0gc3RhdGUtPmNyZWF0ZUNsaWVudCgpOwordGVtcGxhdGUgPHR5cGVuYW1lIFN0YXRlXz4KK3ZvaWQgdGVzdENoaWxkU2VydmljZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8U3RhdGVfPiYgc3RhdGUpIHsKKyAgc3RkOjpzaGFyZWRfcHRyPHR5cGVuYW1lIFN0YXRlXzo6Q2xpZW50PiBjbGllbnQgPSBzdGF0ZS0+Y3JlYXRlQ2xpZW50KCk7CiAKICAgLy8gVGVzdCBjYWxsaW5nIHNvbWUgb2YgdGhlIHBhcmVudCBtZXRoaWRzIHZpYSB0aGUgYSBjaGlsZCBjbGllbnQKICAgaW50MzJfdCBnZW4gPSBjbGllbnQtPmdldEdlbmVyYXRpb24oKTsKQEAgLTQ3NywyNSArNDYzLDIzIEBACiAgIEJPT1NUX0NIRUNLX0VRVUFMKDk5LCBjbGllbnQtPmdldFZhbHVlKCkpOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBTZXJ2ZXJUcmFpdHMsIHR5cGVuYW1lIFRlbXBsYXRlVHJhaXRzPgordGVtcGxhdGUgPHR5cGVuYW1lIFNlcnZlclRyYWl0cywgdHlwZW5hbWUgVGVtcGxhdGVUcmFpdHM+CiB2b2lkIHRlc3RCYXNpY1NlcnZpY2UoKSB7Ci0gIHR5cGVkZWYgU2VydmljZVN0YXRlPCBTZXJ2ZXJUcmFpdHMsIFBhcmVudFNlcnZpY2VUcmFpdHM8VGVtcGxhdGVUcmFpdHM+ID4KLSAgICBTdGF0ZTsKKyAgdHlwZWRlZiBTZXJ2aWNlU3RhdGU8U2VydmVyVHJhaXRzLCBQYXJlbnRTZXJ2aWNlVHJhaXRzPFRlbXBsYXRlVHJhaXRzPiA+IFN0YXRlOwogCiAgIC8vIFN0YXJ0IHRoZSBzZXJ2ZXIKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8U3RhdGU+IHN0YXRlKG5ldyBTdGF0ZSk7CisgIHN0ZDo6c2hhcmVkX3B0cjxTdGF0ZT4gc3RhdGUobmV3IFN0YXRlKTsKICAgU2VydmVyVGhyZWFkIHNlcnZlclRocmVhZChzdGF0ZSwgdHJ1ZSk7CiAKICAgdGVzdFBhcmVudFNlcnZpY2Uoc3RhdGUpOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBTZXJ2ZXJUcmFpdHMsIHR5cGVuYW1lIFRlbXBsYXRlVHJhaXRzPgordGVtcGxhdGUgPHR5cGVuYW1lIFNlcnZlclRyYWl0cywgdHlwZW5hbWUgVGVtcGxhdGVUcmFpdHM+CiB2b2lkIHRlc3RJbmhlcml0ZWRTZXJ2aWNlKCkgewotICB0eXBlZGVmIFNlcnZpY2VTdGF0ZTwgU2VydmVyVHJhaXRzLCBDaGlsZFNlcnZpY2VUcmFpdHM8VGVtcGxhdGVUcmFpdHM+ID4KLSAgICBTdGF0ZTsKKyAgdHlwZWRlZiBTZXJ2aWNlU3RhdGU8U2VydmVyVHJhaXRzLCBDaGlsZFNlcnZpY2VUcmFpdHM8VGVtcGxhdGVUcmFpdHM+ID4gU3RhdGU7CiAKICAgLy8gU3RhcnQgdGhlIHNlcnZlcgotICBib29zdDo6c2hhcmVkX3B0cjxTdGF0ZT4gc3RhdGUobmV3IFN0YXRlKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFN0YXRlPiBzdGF0ZShuZXcgU3RhdGUpOwogICBTZXJ2ZXJUaHJlYWQgc2VydmVyVGhyZWFkKHN0YXRlLCB0cnVlKTsKIAogICB0ZXN0UGFyZW50U2VydmljZShzdGF0ZSk7CkBAIC01MDYsMjEgKzQ5MCwyMiBAQAogICogVGVzdCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgVFNlcnZlckV2ZW50SGFuZGxlciBhbmQgVFByb2Nlc3NvckV2ZW50SGFuZGxlcgogICogbWV0aG9kcyBhcmUgaW52b2tlZCBpbiB0aGUgY29ycmVjdCBvcmRlciB3aXRoIHRoZSBhY3R1YWwgZXZlbnRzLgogICovCi10ZW1wbGF0ZTx0eXBlbmFtZSBTZXJ2ZXJUcmFpdHMsIHR5cGVuYW1lIFRlbXBsYXRlVHJhaXRzPgordGVtcGxhdGUgPHR5cGVuYW1lIFNlcnZlclRyYWl0cywgdHlwZW5hbWUgVGVtcGxhdGVUcmFpdHM+CiB2b2lkIHRlc3RFdmVudFNlcXVlbmNpbmcoKSB7CiAgIC8vIFdlIHVzZSBUQnVmZmVyZWRUcmFuc3BvcnQgZm9yIHRoaXMgdGVzdCwgaW5zdGVhZCBvZiBURnJhbWVkVHJhbnNwb3J0LgogICAvLyBUaGlzIHdheSB0aGUgc2VydmVyIHdpbGwgc3RhcnQgcHJvY2Vzc2luZyBkYXRhIGFzIHNvb24gYXMgaXQgaXMgcmVjZWl2ZWQsCiAgIC8vIGluc3RlYWQgb2Ygd2FpdGluZyBmb3IgdGhlIGZ1bGwgcmVxdWVzdC4gIFRoaXMgaXMgbmVjZXNzYXJ5IHNvIHdlIGNhbgogICAvLyBzZXBhcmF0ZSB0aGUgcHJlUmVhZCgpIGFuZCBwb3N0UmVhZCgpIGV2ZW50cy4KLSAgdHlwZWRlZiBTZXJ2aWNlU3RhdGU8IFNlcnZlclRyYWl0cywgQ2hpbGRTZXJ2aWNlVHJhaXRzPFRlbXBsYXRlVHJhaXRzPiwKLSAgICAgICAgICAgICAgICAgICAgICAgIFRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnksIFRCdWZmZXJlZFRyYW5zcG9ydD4KLSAgICBTdGF0ZTsKKyAgdHlwZWRlZiBTZXJ2aWNlU3RhdGU8U2VydmVyVHJhaXRzLAorICAgICAgICAgICAgICAgICAgICAgICBDaGlsZFNlcnZpY2VUcmFpdHM8VGVtcGxhdGVUcmFpdHM+LAorICAgICAgICAgICAgICAgICAgICAgICBUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICBUQnVmZmVyZWRUcmFuc3BvcnQ+IFN0YXRlOwogCiAgIC8vIFN0YXJ0IHRoZSBzZXJ2ZXIKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8U3RhdGU+IHN0YXRlKG5ldyBTdGF0ZSk7CisgIHN0ZDo6c2hhcmVkX3B0cjxTdGF0ZT4gc3RhdGUobmV3IFN0YXRlKTsKICAgU2VydmVyVGhyZWFkIHNlcnZlclRocmVhZChzdGF0ZSwgdHJ1ZSk7CiAKLSAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8RXZlbnRMb2c+JiBsb2cgPSBzdGF0ZS0+Z2V0TG9nKCk7CisgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxFdmVudExvZz4mIGxvZyA9IHN0YXRlLT5nZXRMb2coKTsKIAogICAvLyBNYWtlIHN1cmUgd2UncmUgYXQgdGhlIGVuZCBvZiB0aGUgbG9nCiAgIGNoZWNrTm9FdmVudHMobG9nKTsKQEAgLTUyOSw3ICs1MTQsNyBAQAogCiAgIC8vIE1ha2Ugc3VyZSBjcmVhdGVDb250ZXh0KCkgaXMgY2FsbGVkIGFmdGVyIGEgY29ubmVjdGlvbiBoYXMgYmVlbgogICAvLyBlc3RhYmxpc2hlZC4gIFdlIG9wZW4gYSBwbGFpbiBzb2NrZXQgaW5zdGVhZCBvZiBjcmVhdGluZyBhIGNsaWVudC4KLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNvY2tldD4gc29ja2V0KG5ldyBUU29ja2V0KCIxMjcuMC4wLjEiLCBzdGF0ZS0+Z2V0UG9ydCgpKSk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0PiBzb2NrZXQobmV3IFRTb2NrZXQoIjEyNy4wLjAuMSIsIHN0YXRlLT5nZXRQb3J0KCkpKTsKICAgc29ja2V0LT5vcGVuKCk7CiAKICAgLy8gTWFrZSBzdXJlIHRoZSBwcm9wZXIgZXZlbnRzIG9jY3VycmVkIGFmdGVyIGEgbmV3IGNvbm5lY3Rpb24KQEAgLTUzOSw3ICs1MjQsNyBAQAogICAvLyBjYW4gdGVzdCB0aGUgdGltaW5nIGZvciB0aGUgcHJlUmVhZCgpIGNhbGwuCiAgIHN0cmluZyByZXF1ZXN0TmFtZSA9ICJnZXREYXRhV2FpdCI7CiAgIHN0cmluZyBldmVudE5hbWUgPSAiUGFyZW50U2VydmljZS5nZXREYXRhV2FpdCI7Ci0gIGludDMyX3Qgc2VxaWQgPSB0aW1lKE5VTEwpOworICBpbnQzMl90IHNlcWlkID0gaW50MzJfdCh0aW1lKE5VTEwpKTsKICAgVEJpbmFyeVByb3RvY29sIHByb3RvY29sKHNvY2tldCk7CiAgIHByb3RvY29sLndyaXRlTWVzc2FnZUJlZ2luKHJlcXVlc3ROYW1lLCBUX0NBTEwsIHNlcWlkKTsKICAgc29ja2V0LT5mbHVzaCgpOwpAQCAtNTYzLDcgKzU0OCw3IEBACiAgIC8vIFNlbmQgdGhlIHJlc3Qgb2YgdGhlIHJlcXVlc3QKICAgcHJvdG9jb2wud3JpdGVTdHJ1Y3RCZWdpbigiUGFyZW50U2VydmljZV9nZXREYXRhTm90aWZpZWRfcGFyZ3MiKTsKICAgcHJvdG9jb2wud3JpdGVGaWVsZEJlZ2luKCJsZW5ndGgiLCBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfSTMyLCAxKTsKLSAgcHJvdG9jb2wud3JpdGVJMzIoOCoxMDI0KjEwMjQpOworICBwcm90b2NvbC53cml0ZUkzMig4ICogMTAyNCAqIDEwMjQpOwogICBwcm90b2NvbC53cml0ZUZpZWxkRW5kKCk7CiAgIHByb3RvY29sLndyaXRlRmllbGRTdG9wKCk7CiAgIHByb3RvY29sLndyaXRlU3RydWN0RW5kKCk7CkBAIC02MDcsNyArNTkyLDcgQEAKICAgY2hlY2tOb0V2ZW50cyhsb2cpOwogCiAgIC8vIFJlYWQgdGhlIHJlc3BvbnNlIGhlYWRlcgotICBzdGQ6OnN0cmluZyByZXNwb25zZU5hbWU7CisgIHN0cmluZyByZXNwb25zZU5hbWU7CiAgIGludDMyX3QgcmVzcG9uc2VTZXFpZCA9IDA7CiAgIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VE1lc3NhZ2VUeXBlIHJlc3BvbnNlVHlwZTsKICAgcHJvdG9jb2wucmVhZE1lc3NhZ2VCZWdpbihyZXNwb25zZU5hbWUsIHJlc3BvbnNlVHlwZSwgcmVzcG9uc2VTZXFpZCk7CkBAIC02NDUsMjUgKzYzMCwyNCBAQAogICBjaGVja05vRXZlbnRzKGxvZyk7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFNlcnZlclRyYWl0cywgdHlwZW5hbWUgVGVtcGxhdGVUcmFpdHM+Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2VydmVyVHJhaXRzLCB0eXBlbmFtZSBUZW1wbGF0ZVRyYWl0cz4KIHZvaWQgdGVzdFNlcGFyYXRlQ29ubmVjdGlvbnMoKSB7Ci0gIHR5cGVkZWYgU2VydmljZVN0YXRlPCBTZXJ2ZXJUcmFpdHMsIENoaWxkU2VydmljZVRyYWl0czxUZW1wbGF0ZVRyYWl0cz4gPgotICAgIFN0YXRlOworICB0eXBlZGVmIFNlcnZpY2VTdGF0ZTxTZXJ2ZXJUcmFpdHMsIENoaWxkU2VydmljZVRyYWl0czxUZW1wbGF0ZVRyYWl0cz4gPiBTdGF0ZTsKIAogICAvLyBTdGFydCB0aGUgc2VydmVyCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFN0YXRlPiBzdGF0ZShuZXcgU3RhdGUpOworICBzdGQ6OnNoYXJlZF9wdHI8U3RhdGU+IHN0YXRlKG5ldyBTdGF0ZSk7CiAgIFNlcnZlclRocmVhZCBzZXJ2ZXJUaHJlYWQoc3RhdGUsIHRydWUpOwogCi0gIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPEV2ZW50TG9nPiYgbG9nID0gc3RhdGUtPmdldExvZygpOworICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8RXZlbnRMb2c+JiBsb2cgPSBzdGF0ZS0+Z2V0TG9nKCk7CiAKICAgLy8gQ3JlYXRlIGEgY2xpZW50Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPHR5cGVuYW1lIFN0YXRlOjpDbGllbnQ+IGNsaWVudDEgPSBzdGF0ZS0+Y3JlYXRlQ2xpZW50KCk7CisgIHN0ZDo6c2hhcmVkX3B0cjx0eXBlbmFtZSBTdGF0ZTo6Q2xpZW50PiBjbGllbnQxID0gc3RhdGUtPmNyZWF0ZUNsaWVudCgpOwogCiAgIC8vIE1ha2Ugc3VyZSB0aGUgZXhwZWN0ZWQgZXZlbnRzIHdlcmUgbG9nZ2VkCiAgIHVpbnQzMl90IGNsaWVudDFJZCA9IGNoZWNrTmV3Q29ubkV2ZW50cyhsb2cpOwogCiAgIC8vIENyZWF0ZSBhIHNlY29uZCBjbGllbnQKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8dHlwZW5hbWUgU3RhdGU6OkNsaWVudD4gY2xpZW50MiA9IHN0YXRlLT5jcmVhdGVDbGllbnQoKTsKKyAgc3RkOjpzaGFyZWRfcHRyPHR5cGVuYW1lIFN0YXRlOjpDbGllbnQ+IGNsaWVudDIgPSBzdGF0ZS0+Y3JlYXRlQ2xpZW50KCk7CiAKICAgLy8gTWFrZSBzdXJlIHRoZSBleHBlY3RlZCBldmVudHMgd2VyZSBsb2dnZWQKICAgdWludDMyX3QgY2xpZW50MklkID0gY2hlY2tOZXdDb25uRXZlbnRzKGxvZyk7CkBAIC02NzQsMjAgKzY1OCwxOSBAQAogICAvLyBNYWtlIGEgY2FsbCwgYW5kIGNoZWNrIGZvciB0aGUgcHJvcGVyIGV2ZW50cwogICBpbnQzMl90IHZhbHVlID0gNTsKICAgY2xpZW50MS0+c2V0VmFsdWUodmFsdWUpOwotICB1aW50MzJfdCBjYWxsMSA9IGNoZWNrQ2FsbEV2ZW50cyhsb2csIGNsaWVudDFJZCwgRXZlbnRMb2c6OkVUX0NBTExfU0VUX1ZBTFVFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDaGlsZFNlcnZpY2Uuc2V0VmFsdWUiKTsKKyAgdWludDMyX3QgY2FsbDEKKyAgICAgID0gY2hlY2tDYWxsRXZlbnRzKGxvZywgY2xpZW50MUlkLCBFdmVudExvZzo6RVRfQ0FMTF9TRVRfVkFMVUUsICJDaGlsZFNlcnZpY2Uuc2V0VmFsdWUiKTsKIAogICAvLyBNYWtlIGEgY2FsbCB3aXRoIGNsaWVudDIKICAgaW50MzJfdCB2ID0gY2xpZW50Mi0+Z2V0VmFsdWUoKTsKICAgQk9PU1RfQ0hFQ0tfRVFVQUwodmFsdWUsIHYpOwotICBjaGVja0NhbGxFdmVudHMobG9nLCBjbGllbnQySWQsIEV2ZW50TG9nOjpFVF9DQUxMX0dFVF9WQUxVRSwKLSAgICAgICAgICAgICAgICAgICJDaGlsZFNlcnZpY2UuZ2V0VmFsdWUiKTsKKyAgY2hlY2tDYWxsRXZlbnRzKGxvZywgY2xpZW50MklkLCBFdmVudExvZzo6RVRfQ0FMTF9HRVRfVkFMVUUsICJDaGlsZFNlcnZpY2UuZ2V0VmFsdWUiKTsKIAogICAvLyBNYWtlIGFub3RoZXIgY2FsbCB3aXRoIGNsaWVudDEKICAgdiA9IGNsaWVudDEtPmdldFZhbHVlKCk7CiAgIEJPT1NUX0NIRUNLX0VRVUFMKHZhbHVlLCB2KTsKLSAgdWludDMyX3QgY2FsbDIgPSBjaGVja0NhbGxFdmVudHMobG9nLCBjbGllbnQxSWQsIEV2ZW50TG9nOjpFVF9DQUxMX0dFVF9WQUxVRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2hpbGRTZXJ2aWNlLmdldFZhbHVlIik7CisgIHVpbnQzMl90IGNhbGwyCisgICAgICA9IGNoZWNrQ2FsbEV2ZW50cyhsb2csIGNsaWVudDFJZCwgRXZlbnRMb2c6OkVUX0NBTExfR0VUX1ZBTFVFLCAiQ2hpbGRTZXJ2aWNlLmdldFZhbHVlIik7CiAgIEJPT1NUX0NIRUNLX05FKGNhbGwxLCBjYWxsMik7CiAKICAgLy8gQ2xvc2UgdGhlIHNlY29uZCBjbGllbnQsIGFuZCBjaGVjayBmb3IgdGhlIGFwcHJvcHJpYXRlIGV2ZW50cwpAQCAtNjk1LDE5ICs2NzgsMTggQEAKICAgY2hlY2tDbG9zZUV2ZW50cyhsb2csIGNsaWVudDJJZCk7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFNlcnZlclRyYWl0cywgdHlwZW5hbWUgVGVtcGxhdGVUcmFpdHM+Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2VydmVyVHJhaXRzLCB0eXBlbmFtZSBUZW1wbGF0ZVRyYWl0cz4KIHZvaWQgdGVzdE9uZXdheUNhbGwoKSB7Ci0gIHR5cGVkZWYgU2VydmljZVN0YXRlPCBTZXJ2ZXJUcmFpdHMsIENoaWxkU2VydmljZVRyYWl0czxUZW1wbGF0ZVRyYWl0cz4gPgotICAgIFN0YXRlOworICB0eXBlZGVmIFNlcnZpY2VTdGF0ZTxTZXJ2ZXJUcmFpdHMsIENoaWxkU2VydmljZVRyYWl0czxUZW1wbGF0ZVRyYWl0cz4gPiBTdGF0ZTsKIAogICAvLyBTdGFydCB0aGUgc2VydmVyCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFN0YXRlPiBzdGF0ZShuZXcgU3RhdGUpOworICBzdGQ6OnNoYXJlZF9wdHI8U3RhdGU+IHN0YXRlKG5ldyBTdGF0ZSk7CiAgIFNlcnZlclRocmVhZCBzZXJ2ZXJUaHJlYWQoc3RhdGUsIHRydWUpOwogCi0gIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPEV2ZW50TG9nPiYgbG9nID0gc3RhdGUtPmdldExvZygpOworICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8RXZlbnRMb2c+JiBsb2cgPSBzdGF0ZS0+Z2V0TG9nKCk7CiAKICAgLy8gQ3JlYXRlIGEgY2xpZW50Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPHR5cGVuYW1lIFN0YXRlOjpDbGllbnQ+IGNsaWVudCA9IHN0YXRlLT5jcmVhdGVDbGllbnQoKTsKKyAgc3RkOjpzaGFyZWRfcHRyPHR5cGVuYW1lIFN0YXRlOjpDbGllbnQ+IGNsaWVudCA9IHN0YXRlLT5jcmVhdGVDbGllbnQoKTsKICAgdWludDMyX3QgY29ubklkID0gY2hlY2tOZXdDb25uRXZlbnRzKGxvZyk7CiAKICAgLy8gTWFrZSBhIG9uZXdheSBjYWxsCkBAIC03MTYsOSArNjk4LDcgQEAKICAgc3RhdGUtPmdldEhhbmRsZXIoKS0+cHJlcGFyZVRyaWdnZXJlZENhbGwoKTsKICAgY2xpZW50LT5vbmV3YXlXYWl0KCk7CiAgIHN0cmluZyBjYWxsTmFtZSA9ICJQYXJlbnRTZXJ2aWNlLm9uZXdheVdhaXQiOwotICB1aW50MzJfdCBjYWxsSWQgPSBjaGVja0NhbGxIYW5kbGVyRXZlbnRzKGxvZywgY29ubklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50TG9nOjpFVF9DQUxMX09ORVdBWV9XQUlULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxOYW1lKTsKKyAgdWludDMyX3QgY2FsbElkID0gY2hlY2tDYWxsSGFuZGxlckV2ZW50cyhsb2csIGNvbm5JZCwgRXZlbnRMb2c6OkVUX0NBTExfT05FV0FZX1dBSVQsIGNhbGxOYW1lKTsKIAogICAvLyBUaGVyZSBzaG91bGRuJ3QgYmUgYW55IG1vcmUgZXZlbnRzCiAgIGNoZWNrTm9FdmVudHMobG9nKTsKQEAgLTc1MCwxOSArNzMwLDE4IEBACiAgIGNoZWNrTm9FdmVudHMobG9nKTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgU2VydmVyVHJhaXRzLCB0eXBlbmFtZSBUZW1wbGF0ZVRyYWl0cz4KK3RlbXBsYXRlIDx0eXBlbmFtZSBTZXJ2ZXJUcmFpdHMsIHR5cGVuYW1lIFRlbXBsYXRlVHJhaXRzPgogdm9pZCB0ZXN0RXhwZWN0ZWRFcnJvcigpIHsKLSAgdHlwZWRlZiBTZXJ2aWNlU3RhdGU8IFNlcnZlclRyYWl0cywgQ2hpbGRTZXJ2aWNlVHJhaXRzPFRlbXBsYXRlVHJhaXRzPiA+Ci0gICAgU3RhdGU7CisgIHR5cGVkZWYgU2VydmljZVN0YXRlPFNlcnZlclRyYWl0cywgQ2hpbGRTZXJ2aWNlVHJhaXRzPFRlbXBsYXRlVHJhaXRzPiA+IFN0YXRlOwogCiAgIC8vIFN0YXJ0IHRoZSBzZXJ2ZXIKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8U3RhdGU+IHN0YXRlKG5ldyBTdGF0ZSk7CisgIHN0ZDo6c2hhcmVkX3B0cjxTdGF0ZT4gc3RhdGUobmV3IFN0YXRlKTsKICAgU2VydmVyVGhyZWFkIHNlcnZlclRocmVhZChzdGF0ZSwgdHJ1ZSk7CiAKLSAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8RXZlbnRMb2c+JiBsb2cgPSBzdGF0ZS0+Z2V0TG9nKCk7CisgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxFdmVudExvZz4mIGxvZyA9IHN0YXRlLT5nZXRMb2coKTsKIAogICAvLyBDcmVhdGUgYSBjbGllbnQKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8dHlwZW5hbWUgU3RhdGU6OkNsaWVudD4gY2xpZW50ID0gc3RhdGUtPmNyZWF0ZUNsaWVudCgpOworICBzdGQ6OnNoYXJlZF9wdHI8dHlwZW5hbWUgU3RhdGU6OkNsaWVudD4gY2xpZW50ID0gc3RhdGUtPmNyZWF0ZUNsaWVudCgpOwogICB1aW50MzJfdCBjb25uSWQgPSBjaGVja05ld0Nvbm5FdmVudHMobG9nKTsKIAogICAvLyBTZW5kIHRoZSBleGNlcHRpb25XYWl0KCkgY2FsbApAQCAtNzcwLDkgKzc0OSw3IEBACiAgIHN0cmluZyBtZXNzYWdlID0gInRlc3QgMTIzNCB0ZXN0IjsKICAgY2xpZW50LT5zZW5kX2V4Y2VwdGlvbldhaXQobWVzc2FnZSk7CiAgIHN0cmluZyBjYWxsTmFtZSA9ICJQYXJlbnRTZXJ2aWNlLmV4Y2VwdGlvbldhaXQiOwotICB1aW50MzJfdCBjYWxsSWQgPSBjaGVja0NhbGxIYW5kbGVyRXZlbnRzKGxvZywgY29ubklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50TG9nOjpFVF9DQUxMX0VYQ0VQVElPTl9XQUlULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxOYW1lKTsKKyAgdWludDMyX3QgY2FsbElkID0gY2hlY2tDYWxsSGFuZGxlckV2ZW50cyhsb2csIGNvbm5JZCwgRXZlbnRMb2c6OkVUX0NBTExfRVhDRVBUSU9OX1dBSVQsIGNhbGxOYW1lKTsKIAogICAvLyBUaGVyZSBzaG91bGRuJ3QgYmUgYW55IG1vcmUgZXZlbnRzCiAgIGNoZWNrTm9FdmVudHMobG9nKTsKQEAgLTc5MCw2ICs3NjcsOSBAQAogICAgIEJPT1NUX0ZBSUwoImV4cGVjdGVkIE15RXJyb3IgdG8gYmUgdGhyb3duIik7CiAgIH0gY2F0Y2ggKGNvbnN0IE15RXJyb3ImIGUpIHsKICAgICBCT09TVF9DSEVDS19FUVVBTChtZXNzYWdlLCBlLm1lc3NhZ2UpOworICAgIC8vIENoZWNrIGlmIHN0ZDo6ZXhjZXB0aW9uOjp3aGF0KCkgaXMgaGFuZGxlZCBwcm9wZXJseQorICAgIHNpemVfdCBtZXNzYWdlX3BvcyA9IHN0cmluZyhlLndoYXQoKSkuZmluZCgiVEV4Y2VwdGlvbiAtIHNlcnZpY2UgaGFzIHRocm93bjogTXlFcnJvciIpOworICAgIEJPT1NUX0NIRUNLX05FKG1lc3NhZ2VfcG9zLCBzdHJpbmc6Om5wb3MpOwogICB9CiAKICAgLy8gTm93IHdlIHNob3VsZCBzZWUgdGhlIGV2ZW50cyBmb3IgYSBub3JtYWwgY2FsbCBmaW5pc2gKQEAgLTgwNSwxOSArNzg1LDE4IEBACiAgIGNoZWNrTm9FdmVudHMobG9nKTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgU2VydmVyVHJhaXRzLCB0eXBlbmFtZSBUZW1wbGF0ZVRyYWl0cz4KK3RlbXBsYXRlIDx0eXBlbmFtZSBTZXJ2ZXJUcmFpdHMsIHR5cGVuYW1lIFRlbXBsYXRlVHJhaXRzPgogdm9pZCB0ZXN0VW5leHBlY3RlZEVycm9yKCkgewotICB0eXBlZGVmIFNlcnZpY2VTdGF0ZTwgU2VydmVyVHJhaXRzLCBDaGlsZFNlcnZpY2VUcmFpdHM8VGVtcGxhdGVUcmFpdHM+ID4KLSAgICBTdGF0ZTsKKyAgdHlwZWRlZiBTZXJ2aWNlU3RhdGU8U2VydmVyVHJhaXRzLCBDaGlsZFNlcnZpY2VUcmFpdHM8VGVtcGxhdGVUcmFpdHM+ID4gU3RhdGU7CiAKICAgLy8gU3RhcnQgdGhlIHNlcnZlcgotICBib29zdDo6c2hhcmVkX3B0cjxTdGF0ZT4gc3RhdGUobmV3IFN0YXRlKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFN0YXRlPiBzdGF0ZShuZXcgU3RhdGUpOwogICBTZXJ2ZXJUaHJlYWQgc2VydmVyVGhyZWFkKHN0YXRlLCB0cnVlKTsKIAotICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxFdmVudExvZz4mIGxvZyA9IHN0YXRlLT5nZXRMb2coKTsKKyAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEV2ZW50TG9nPiYgbG9nID0gc3RhdGUtPmdldExvZygpOwogCiAgIC8vIENyZWF0ZSBhIGNsaWVudAotICBib29zdDo6c2hhcmVkX3B0cjx0eXBlbmFtZSBTdGF0ZTo6Q2xpZW50PiBjbGllbnQgPSBzdGF0ZS0+Y3JlYXRlQ2xpZW50KCk7CisgIHN0ZDo6c2hhcmVkX3B0cjx0eXBlbmFtZSBTdGF0ZTo6Q2xpZW50PiBjbGllbnQgPSBzdGF0ZS0+Y3JlYXRlQ2xpZW50KCk7CiAgIHVpbnQzMl90IGNvbm5JZCA9IGNoZWNrTmV3Q29ubkV2ZW50cyhsb2cpOwogCiAgIC8vIFNlbmQgdGhlIHVuZXhwZWN0ZWRFeGNlcHRpb25XYWl0KCkgY2FsbApAQCAtODI1LDggKzgwNCw4IEBACiAgIHN0cmluZyBtZXNzYWdlID0gIjEyMzQgdGVzdCA1Njc4IjsKICAgY2xpZW50LT5zZW5kX3VuZXhwZWN0ZWRFeGNlcHRpb25XYWl0KG1lc3NhZ2UpOwogICBzdHJpbmcgY2FsbE5hbWUgPSAiUGFyZW50U2VydmljZS51bmV4cGVjdGVkRXhjZXB0aW9uV2FpdCI7Ci0gIHVpbnQzMl90IGNhbGxJZCA9IGNoZWNrQ2FsbEhhbmRsZXJFdmVudHMoCi0gICAgICBsb2csIGNvbm5JZCwgRXZlbnRMb2c6OkVUX0NBTExfVU5FWFBFQ1RFRF9FWENFUFRJT05fV0FJVCwgY2FsbE5hbWUpOworICB1aW50MzJfdCBjYWxsSWQKKyAgICAgID0gY2hlY2tDYWxsSGFuZGxlckV2ZW50cyhsb2csIGNvbm5JZCwgRXZlbnRMb2c6OkVUX0NBTExfVU5FWFBFQ1RFRF9FWENFUFRJT05fV0FJVCwgY2FsbE5hbWUpOwogCiAgIC8vIFRoZXJlIHNob3VsZG4ndCBiZSBhbnkgbW9yZSBldmVudHMKICAgY2hlY2tOb0V2ZW50cyhsb2cpOwpAQCAtODQyLDcgKzgyMSw3IEBACiAgIHRyeSB7CiAgICAgY2xpZW50LT5yZWN2X3VuZXhwZWN0ZWRFeGNlcHRpb25XYWl0KCk7CiAgICAgQk9PU1RfRkFJTCgiZXhwZWN0ZWQgVEFwcGxpY2F0aW9uRXJyb3IgdG8gYmUgdGhyb3duIik7Ci0gIH0gY2F0Y2ggKGNvbnN0IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiYgZSkgeworICB9IGNhdGNoIChjb25zdCBUQXBwbGljYXRpb25FeGNlcHRpb24mKSB7CiAgIH0KIAogICAvLyBOb3cgd2Ugc2hvdWxkIHNlZSBhIGhhbmRsZXIgZXJyb3IgZXZlbnQKQEAgLTg3Miw0NyArODUxLDQ2IEBACiAgIGNoZWNrTm9FdmVudHMobG9nKTsKIH0KIAotCiAvLyBNYWNybyB0byBkZWZpbmUgc2ltcGxlIHRlc3RzIHRoYXQgY2FuIGJlIHVzZWQgd2l0aCBhbGwgc2VydmVyIHR5cGVzCi0jZGVmaW5lIERFRklORV9TSU1QTEVfVEVTVFMoU2VydmVyLCBUZW1wbGF0ZSkgXAotICBCT09TVF9BVVRPX1RFU1RfQ0FTRShTZXJ2ZXIjI18jI1RlbXBsYXRlIyNfYmFzaWNTZXJ2aWNlKSB7IFwKLSAgICB0ZXN0QmFzaWNTZXJ2aWNlPFNlcnZlciMjVHJhaXRzLCBUZW1wbGF0ZSMjVHJhaXRzPigpOyBcCi0gIH0gXAotICBCT09TVF9BVVRPX1RFU1RfQ0FTRShTZXJ2ZXIjI18jI1RlbXBsYXRlIyNfaW5oZXJpdGVkU2VydmljZSkgeyBcCi0gICAgdGVzdEluaGVyaXRlZFNlcnZpY2U8U2VydmVyIyNUcmFpdHMsIFRlbXBsYXRlIyNUcmFpdHM+KCk7IFwKLSAgfSBcCi0gIEJPT1NUX0FVVE9fVEVTVF9DQVNFKFNlcnZlciMjXyMjVGVtcGxhdGUjI19vbmV3YXkpIHsgXAotICAgIHRlc3RPbmV3YXlDYWxsPFNlcnZlciMjVHJhaXRzLCBUZW1wbGF0ZSMjVHJhaXRzPigpOyBcCi0gIH0gXAotICBCT09TVF9BVVRPX1RFU1RfQ0FTRShTZXJ2ZXIjI18jI1RlbXBsYXRlIyNfZXhjZXB0aW9uKSB7IFwKLSAgICB0ZXN0RXhwZWN0ZWRFcnJvcjxTZXJ2ZXIjI1RyYWl0cywgVGVtcGxhdGUjI1RyYWl0cz4oKTsgXAotICB9IFwKLSAgQk9PU1RfQVVUT19URVNUX0NBU0UoU2VydmVyIyNfIyNUZW1wbGF0ZSMjX3VuZXhwZWN0ZWRFeGNlcHRpb24pIHsgXAotICAgIHRlc3RVbmV4cGVjdGVkRXJyb3I8U2VydmVyIyNUcmFpdHMsIFRlbXBsYXRlIyNUcmFpdHM+KCk7IFwKKyNkZWZpbmUgREVGSU5FX1NJTVBMRV9URVNUUyhTZXJ2ZXIsIFRlbXBsYXRlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQk9PU1RfQVVUT19URVNUX0NBU0UoU2VydmVyIyNfIyNUZW1wbGF0ZSMjX2Jhc2ljU2VydmljZSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZXN0QmFzaWNTZXJ2aWNlPFNlcnZlciMjVHJhaXRzLCBUZW1wbGF0ZSMjVHJhaXRzPigpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQk9PU1RfQVVUT19URVNUX0NBU0UoU2VydmVyIyNfIyNUZW1wbGF0ZSMjX2luaGVyaXRlZFNlcnZpY2UpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZXN0SW5oZXJpdGVkU2VydmljZTxTZXJ2ZXIjI1RyYWl0cywgVGVtcGxhdGUjI1RyYWl0cz4oKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQk9PU1RfQVVUT19URVNUX0NBU0UoU2VydmVyIyNfIyNUZW1wbGF0ZSMjX29uZXdheSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZXN0T25ld2F5Q2FsbDxTZXJ2ZXIjI1RyYWl0cywgVGVtcGxhdGUjI1RyYWl0cz4oKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQk9PU1RfQVVUT19URVNUX0NBU0UoU2VydmVyIyNfIyNUZW1wbGF0ZSMjX2V4Y2VwdGlvbikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZXN0RXhwZWN0ZWRFcnJvcjxTZXJ2ZXIjI1RyYWl0cywgVGVtcGxhdGUjI1RyYWl0cz4oKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQk9PU1RfQVVUT19URVNUX0NBU0UoU2VydmVyIyNfIyNUZW1wbGF0ZSMjX3VuZXhwZWN0ZWRFeGNlcHRpb24pIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZXN0VW5leHBlY3RlZEVycm9yPFNlcnZlciMjVHJhaXRzLCBUZW1wbGF0ZSMjVHJhaXRzPigpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgfQogCiAvLyBUZXN0cyB0aGF0IHJlcXVpcmUgdGhlIHNlcnZlciB0byBwcm9jZXNzIG11bHRpcGxlIGNvbm5lY3Rpb25zIGNvbmN1cnJlbnRseQogLy8gKGkuZS4sIG5vdCBUU2ltcGxlU2VydmVyKQotI2RlZmluZSBERUZJTkVfQ09OQ1VSUkVOVF9TRVJWRVJfVEVTVFMoU2VydmVyLCBUZW1wbGF0ZSkgXAotICBCT09TVF9BVVRPX1RFU1RfQ0FTRShTZXJ2ZXIjI18jI1RlbXBsYXRlIyNfc2VwYXJhdGVDb25uZWN0aW9ucykgeyBcCi0gICAgdGVzdFNlcGFyYXRlQ29ubmVjdGlvbnM8U2VydmVyIyNUcmFpdHMsIFRlbXBsYXRlIyNUcmFpdHM+KCk7IFwKKyNkZWZpbmUgREVGSU5FX0NPTkNVUlJFTlRfU0VSVkVSX1RFU1RTKFNlcnZlciwgVGVtcGxhdGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQk9PU1RfQVVUT19URVNUX0NBU0UoU2VydmVyIyNfIyNUZW1wbGF0ZSMjX3NlcGFyYXRlQ29ubmVjdGlvbnMpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZXN0U2VwYXJhdGVDb25uZWN0aW9uczxTZXJ2ZXIjI1RyYWl0cywgVGVtcGxhdGUjI1RyYWl0cz4oKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgfQogCiAvLyBUaGUgdGVzdEV2ZW50U2VxdWVuY2luZygpIHRlc3QgbWFudWFsbHkgZ2VuZXJhdGVzIGEgcmVxdWVzdCBmb3IgdGhlIHNlcnZlciwKIC8vIGFuZCBkb2Vzbid0IHdvcmsgd2l0aCBURnJhbWVkVHJhbnNwb3J0LiAgVGhlcmVmb3JlIHdlIGNhbid0IHRlc3QgaXQgd2l0aAogLy8gVE5vbmJsb2NraW5nU2VydmVyLgotI2RlZmluZSBERUZJTkVfTk9GUkFNRV9URVNUUyhTZXJ2ZXIsIFRlbXBsYXRlKSBcCi0gIEJPT1NUX0FVVE9fVEVTVF9DQVNFKFNlcnZlciMjXyMjVGVtcGxhdGUjI19ldmVudFNlcXVlbmNpbmcpIHsgXAotICAgIHRlc3RFdmVudFNlcXVlbmNpbmc8U2VydmVyIyNUcmFpdHMsIFRlbXBsYXRlIyNUcmFpdHM+KCk7IFwKKyNkZWZpbmUgREVGSU5FX05PRlJBTUVfVEVTVFMoU2VydmVyLCBUZW1wbGF0ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQk9PU1RfQVVUT19URVNUX0NBU0UoU2VydmVyIyNfIyNUZW1wbGF0ZSMjX2V2ZW50U2VxdWVuY2luZykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZXN0RXZlbnRTZXF1ZW5jaW5nPFNlcnZlciMjVHJhaXRzLCBUZW1wbGF0ZSMjVHJhaXRzPigpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgfQogCi0jZGVmaW5lIERFRklORV9UTk9OQkxPQ0tJTkdTRVJWRVJfVEVTVFMoU2VydmVyLCBUZW1wbGF0ZSkgXAotICBERUZJTkVfU0lNUExFX1RFU1RTKFNlcnZlciwgVGVtcGxhdGUpIFwKKyNkZWZpbmUgREVGSU5FX1ROT05CTE9DS0lOR1NFUlZFUl9URVNUUyhTZXJ2ZXIsIFRlbXBsYXRlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgREVGSU5FX1NJTVBMRV9URVNUUyhTZXJ2ZXIsIFRlbXBsYXRlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgREVGSU5FX0NPTkNVUlJFTlRfU0VSVkVSX1RFU1RTKFNlcnZlciwgVGVtcGxhdGUpCiAKLSNkZWZpbmUgREVGSU5FX0FMTF9TRVJWRVJfVEVTVFMoU2VydmVyLCBUZW1wbGF0ZSkgXAotICBERUZJTkVfU0lNUExFX1RFU1RTKFNlcnZlciwgVGVtcGxhdGUpIFwKLSAgREVGSU5FX0NPTkNVUlJFTlRfU0VSVkVSX1RFU1RTKFNlcnZlciwgVGVtcGxhdGUpIFwKKyNkZWZpbmUgREVGSU5FX0FMTF9TRVJWRVJfVEVTVFMoU2VydmVyLCBUZW1wbGF0ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgREVGSU5FX1NJTVBMRV9URVNUUyhTZXJ2ZXIsIFRlbXBsYXRlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgREVGSU5FX0NPTkNVUlJFTlRfU0VSVkVSX1RFU1RTKFNlcnZlciwgVGVtcGxhdGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgREVGSU5FX05PRlJBTUVfVEVTVFMoU2VydmVyLCBUZW1wbGF0ZSkKIAogREVGSU5FX0FMTF9TRVJWRVJfVEVTVFMoVFRocmVhZGVkU2VydmVyLCBUZW1wbGF0ZWQpCkBAIC05MzIsMTAgKzkxMCwyMCBAQAogCiAvLyBUT0RPOiBXZSBzaG91bGQgdGVzdCBURXZlbnRTZXJ2ZXIgaW4gdGhlIGZ1dHVyZS4KIC8vIEZvciBub3csIGl0IGlzIGtub3duIG5vdCB0byB3b3JrIGNvcnJlY3RseSB3aXRoIFRQcm9jZXNzb3JFdmVudEhhbmRsZXIuCisjaWZkZWYgQk9PU1RfVEVTVF9EWU5fTElOSworYm9vbCBpbml0X3VuaXRfdGVzdF9zdWl0ZSgpIHsKKyAgOjpib29zdDo6dW5pdF90ZXN0OjpmcmFtZXdvcms6Om1hc3Rlcl90ZXN0X3N1aXRlKCkucF9uYW1lLnZhbHVlID0gIlByb2Nlc3NvclRlc3QiOworICByZXR1cm4gdHJ1ZTsKK30KIAotdW5pdF90ZXN0Ojp0ZXN0X3N1aXRlKiBpbml0X3VuaXRfdGVzdF9zdWl0ZShpbnQgYXJnYywgY2hhciogYXJndltdKSB7Ci0gIHVuaXRfdGVzdDo6ZnJhbWV3b3JrOjptYXN0ZXJfdGVzdF9zdWl0ZSgpLnBfbmFtZS52YWx1ZSA9Ci0gICAgIlByb2Nlc3NvclRlc3QiOwotCitpbnQgbWFpbiggaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSApIHsKKyAgcmV0dXJuIDo6Ym9vc3Q6OnVuaXRfdGVzdDo6dW5pdF90ZXN0X21haW4oJmluaXRfdW5pdF90ZXN0X3N1aXRlLGFyZ2MsYXJndik7Cit9CisjZWxzZQorOjpib29zdDo6dW5pdF90ZXN0Ojp0ZXN0X3N1aXRlKiBpbml0X3VuaXRfdGVzdF9zdWl0ZShpbnQgYXJnYywgY2hhciogYXJndltdKSB7CisgIFRIUklGVF9VTlVTRURfVkFSSUFCTEUoYXJnYyk7CisgIFRIUklGVF9VTlVTRURfVkFSSUFCTEUoYXJndik7CisgIDo6Ym9vc3Q6OnVuaXRfdGVzdDo6ZnJhbWV3b3JrOjptYXN0ZXJfdGVzdF9zdWl0ZSgpLnBfbmFtZS52YWx1ZSA9ICJQcm9jZXNzb3JUZXN0IjsKICAgcmV0dXJuIE5VTEw7CiB9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9wcm9jZXNzb3IvU2VydmVyVGhyZWFkLmNwcCBiL2xpYi9jcHAvdGVzdC9wcm9jZXNzb3IvU2VydmVyVGhyZWFkLmNwcAppbmRleCA5ZjIwODdjLi40ZDFlYzRjIDEwMDY0NAotLS0gYS9saWIvY3BwL3Rlc3QvcHJvY2Vzc29yL1NlcnZlclRocmVhZC5jcHAKKysrIGIvbGliL2NwcC90ZXN0L3Byb2Nlc3Nvci9TZXJ2ZXJUaHJlYWQuY3BwCkBAIC0yMSwyMCArMjEsMjQgQEAKIAogI2luY2x1ZGUgIlNlcnZlclRocmVhZC5oIgogCi0jaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1Bvc2l4VGhyZWFkRmFjdG9yeS5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9QbGF0Zm9ybVRocmVhZEZhY3RvcnkuaD4KICNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5oPgogI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuaD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0Lmg+CiAKLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHRlc3QgeworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0ZXN0IHsKIAogdm9pZCBTZXJ2ZXJUaHJlYWQ6OnN0YXJ0KCkgewogICBhc3NlcnQoIXJ1bm5pbmdfKTsKICAgcnVubmluZ18gPSB0cnVlOwogCisgIGhlbHBlcl8ucmVzZXQobmV3IEhlbHBlcih0aGlzKSk7CisKICAgLy8gU3RhcnQgdGhlIG90aGVyIHRocmVhZAotICBjb25jdXJyZW5jeTo6UG9zaXhUaHJlYWRGYWN0b3J5IHRocmVhZEZhY3Rvcnk7CisgIGNvbmN1cnJlbmN5OjpQbGF0Zm9ybVRocmVhZEZhY3RvcnkgdGhyZWFkRmFjdG9yeTsKICAgdGhyZWFkRmFjdG9yeS5zZXREZXRhY2hlZChmYWxzZSk7CiAgIHRocmVhZF8gPSB0aHJlYWRGYWN0b3J5Lm5ld1RocmVhZChoZWxwZXJfKTsKIApAQCAtNDgsOSArNTIsOCBAQAogICB9CiAKICAgaWYgKGVycm9yXykgewotICAgIHRocm93IHRyYW5zcG9ydDo6VFRyYW5zcG9ydEV4Y2VwdGlvbigKLSAgICAgICAgdHJhbnNwb3J0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKLSAgICAgICAgImZhaWxlZCB0byBiaW5kIG9uIHNlcnZlciBzb2NrZXQiKTsKKyAgICB0aHJvdyB0cmFuc3BvcnQ6OlRUcmFuc3BvcnRFeGNlcHRpb24odHJhbnNwb3J0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZhaWxlZCB0byBiaW5kIG9uIHNlcnZlciBzb2NrZXQiKTsKICAgfQogfQogCkBAIC04OSw3ICs5Miw3IEBACiAgICAgdHJ5IHsKICAgICAgIC8vIFRyeSB0byBzZXJ2ZSByZXF1ZXN0cwogICAgICAgc2VydmVyXy0+c2VydmUoKTsKLSAgICB9IGNhdGNoIChjb25zdCBURXhjZXB0aW9uJiB4KSB7CisgICAgfSBjYXRjaCAoY29uc3QgVEV4Y2VwdGlvbiYpIHsKICAgICAgIC8vIFROb25ibG9ja2luZ1NlcnZlciB0aHJvd3MgYSBnZW5lcmljIFRFeGNlcHRpb24gaWYgaXQgZmFpbHMgdG8gYmluZC4KICAgICAgIC8vIElmIHdlIGdldCBhIFRFeGNlcHRpb24sIHdlJ2xsIG9wdGltaXN0aWNhbGx5IGFzc3VtZSB0aGUgYmluZCBmYWlsZWQuCiAgICAgICArK3BvcnRfOwpAQCAtMTI3LDggKzEzMCw4IEBACiAgIHNlcnZlclN0YXRlXy0+YmluZFN1Y2Nlc3NmdWwocG9ydF8pOwogCiAgIC8vIFNldCB0aGUgcmVhbCBzZXJ2ZXIgZXZlbnQgaGFuZGxlciAocmVwbGFjaW5nIG91cnNlbGYpCi0gIGJvb3N0OjpzaGFyZWRfcHRyPHNlcnZlcjo6VFNlcnZlckV2ZW50SGFuZGxlcj4gc2VydmVyRXZlbnRIYW5kbGVyID0KLSAgICBzZXJ2ZXJTdGF0ZV8tPmdldFNlcnZlckV2ZW50SGFuZGxlcigpOworICBzdGQ6OnNoYXJlZF9wdHI8c2VydmVyOjpUU2VydmVyRXZlbnRIYW5kbGVyPiBzZXJ2ZXJFdmVudEhhbmRsZXIKKyAgICAgID0gc2VydmVyU3RhdGVfLT5nZXRTZXJ2ZXJFdmVudEhhbmRsZXIoKTsKICAgc2VydmVyXy0+c2V0U2VydmVyRXZlbnRIYW5kbGVyKHNlcnZlckV2ZW50SGFuZGxlcik7CiAKICAgLy8gTm90aWZ5IHRoZSBtYWluIHRocmVhZCB0aGF0IHdlIGhhdmUgc3VjY2Vzc2Z1bGx5IHN0YXJ0ZWQgc2VydmluZyByZXF1ZXN0cwpAQCAtMTQyLDcgKzE0NSw4IEBACiAgICAgc2VydmVyRXZlbnRIYW5kbGVyLT5wcmVTZXJ2ZSgpOwogICB9CiB9Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6dGVzdAorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dGVzdAogCiAjZW5kaWYgLy8gX1RIUklGVF9URVNUX1NFUlZFUlRIUkVBRF9UQ0NfCmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvcHJvY2Vzc29yL1NlcnZlclRocmVhZC5oIGIvbGliL2NwcC90ZXN0L3Byb2Nlc3Nvci9TZXJ2ZXJUaHJlYWQuaAppbmRleCAwZGQ1MTI3Li42MWUzMWEzIDEwMDY0NAotLS0gYS9saWIvY3BwL3Rlc3QvcHJvY2Vzc29yL1NlcnZlclRocmVhZC5oCisrKyBiL2xpYi9jcHAvdGVzdC9wcm9jZXNzb3IvU2VydmVyVGhyZWFkLmgKQEAgLTI2LDEzICsyNiwxNSBAQAogCiAjaW5jbHVkZSAiRXZlbnRMb2cuaCIKIAotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdGVzdCB7CituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRlc3QgewogCiAvKioKICAqIEEgaGVscGVyIGNsYXNzIHRvIHRlbGwgU2VydmVyVGhyZWFkIGhvdyB0byBjcmVhdGUgdGhlIHNlcnZlcgogICovCiBjbGFzcyBTZXJ2ZXJTdGF0ZSB7Ci0gcHVibGljOgorcHVibGljOgogICB2aXJ0dWFsIH5TZXJ2ZXJTdGF0ZSgpIHt9CiAKICAgLyoqCkBAIC00MSw3ICs0Myw3IEBACiAgICAqIElmIHRoZSBzZXJ2ZXIgcmV0dXJuZWQgZmFpbHMgdG8gYmluZCB0byB0aGUgc3BlY2lmaWVkIHBvcnQgd2hlbiBzZXJ2ZSgpIGlzCiAgICAqIGNhbGxlZCBvbiBpdCwgY3JlYXRlU2VydmVyKCkgbWF5IGJlIGNhbGxlZCBhZ2FpbiBvbiBhIGRpZmZlcmVudCBwb3J0LgogICAgKi8KLSAgdmlydHVhbCBib29zdDo6c2hhcmVkX3B0cjxzZXJ2ZXI6OlRTZXJ2ZXI+IGNyZWF0ZVNlcnZlcih1aW50MTZfdCBwb3J0KSA9IDA7CisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPHNlcnZlcjo6VFNlcnZlcj4gY3JlYXRlU2VydmVyKHVpbnQxNl90IHBvcnQpID0gMDsKIAogICAvKioKICAgICogR2V0IHRoZSBUU2VydmVyRXZlbnRIYW5kbGVyIHRvIHNldCBvbiB0aGUgc2VydmVyLgpAQCAtNTAsOSArNTIsOCBAQAogICAgKiBzdGFydCBzZXJ2aW5nIHRyYWZmaWMuICBJdCBpcyBpbnZva2VkIGZyb20gdGhlIHNlcnZlciB0aHJlYWQsIHJhdGhlciB0aGFuCiAgICAqIHRoZSBtYWluIHRocmVhZC4KICAgICovCi0gIHZpcnR1YWwgYm9vc3Q6OnNoYXJlZF9wdHI8c2VydmVyOjpUU2VydmVyRXZlbnRIYW5kbGVyPgotICAgICAgZ2V0U2VydmVyRXZlbnRIYW5kbGVyKCkgewotICAgIHJldHVybiBib29zdDo6c2hhcmVkX3B0cjxzZXJ2ZXI6OlRTZXJ2ZXJFdmVudEhhbmRsZXI+KCk7CisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPHNlcnZlcjo6VFNlcnZlckV2ZW50SGFuZGxlcj4gZ2V0U2VydmVyRXZlbnRIYW5kbGVyKCkgeworICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8c2VydmVyOjpUU2VydmVyRXZlbnRIYW5kbGVyPigpOwogICB9CiAKICAgLyoqCkBAIC02MSwxOCArNjIsMTYgQEAKICAgICogU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgaWYgdGhleSB3aXNoIHRvIHJlY29yZCB0aGUgZmluYWwKICAgICogcG9ydCB0aGF0IHdhcyB1c2VkIGZvciB0aGUgc2VydmVyLgogICAgKi8KLSAgdmlydHVhbCB2b2lkIGJpbmRTdWNjZXNzZnVsKHVpbnQxNl90IHBvcnQpIHsKLSAgfQorICB2aXJ0dWFsIHZvaWQgYmluZFN1Y2Nlc3NmdWwodWludDE2X3QgLypwb3J0Ki8pIHt9CiB9OwogCiAvKioKICAqIFNlcnZlclRocmVhZCBzdGFydHMgYSB0aHJpZnQgc2VydmVyIHJ1bm5pbmcgaW4gYSBzZXBhcmF0ZSB0aHJlYWQuCiAgKi8KIGNsYXNzIFNlcnZlclRocmVhZCB7Ci0gcHVibGljOgotICBTZXJ2ZXJUaHJlYWQoY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8U2VydmVyU3RhdGU+JiBzdGF0ZSwgYm9vbCBhdXRvU3RhcnQpIDoKLSAgICAgIGhlbHBlcl8obmV3IEhlbHBlcih0aGlzKSksCi0gICAgICBwb3J0XygwKSwKK3B1YmxpYzoKKyAgU2VydmVyVGhyZWFkKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxTZXJ2ZXJTdGF0ZT4mIHN0YXRlLCBib29sIGF1dG9TdGFydCkKKyAgICA6IHBvcnRfKDApLAogICAgICAgcnVubmluZ18oZmFsc2UpLAogICAgICAgc2VydmluZ18oZmFsc2UpLAogICAgICAgZXJyb3JfKGZhbHNlKSwKQEAgLTg1LDkgKzg0LDcgQEAKICAgdm9pZCBzdGFydCgpOwogICB2b2lkIHN0b3AoKTsKIAotICB1aW50MTZfdCBnZXRQb3J0KCkgY29uc3QgewotICAgIHJldHVybiBwb3J0XzsKLSAgfQorICB1aW50MTZfdCBnZXRQb3J0KCkgY29uc3QgeyByZXR1cm4gcG9ydF87IH0KIAogICB+U2VydmVyVGhyZWFkKCkgewogICAgIGlmIChydW5uaW5nXykgewpAQCAtOTksMzMgKzk2LDI3IEBACiAgICAgfQogICB9CiAKLSBwcm90ZWN0ZWQ6Citwcm90ZWN0ZWQ6CiAgIC8vIEFubm95aW5nLiAgdGhyaWZ0IGZvcmNlcyB1cyB0byB1c2Ugc2hhcmVkX3B0ciwgc28gd2UgaGF2ZSB0byB1c2UKICAgLy8gYSBoZWxwZXIgY2xhc3MgdGhhdCB3ZSBjYW4gYWxsb2NhdGUgb24gdGhlIGhlYXAgYW5kIGdpdmUgdG8gdGhyaWZ0LgogICAvLyBJdCB3b3VsZCBiZSBzaW1wbGVyIGlmIHdlIGNvdWxkIGp1c3QgbWFrZSBSdW5uYWJsZSBhbmQgVFNlcnZlckV2ZW50SGFuZGxlcgogICAvLyBwcml2YXRlIGJhc2UgY2xhc3NlcyBvZiBTZXJ2ZXJUaHJlYWQuCi0gIGNsYXNzIEhlbHBlciA6IHB1YmxpYyBjb25jdXJyZW5jeTo6UnVubmFibGUsCi0gICAgICAgICAgICAgICAgIHB1YmxpYyBzZXJ2ZXI6OlRTZXJ2ZXJFdmVudEhhbmRsZXIgewotICAgcHVibGljOgotICAgIEhlbHBlcihTZXJ2ZXJUaHJlYWQqIHNlcnZlclRocmVhZCkKLSAgICAgIDogc2VydmVyVGhyZWFkXyhzZXJ2ZXJUaHJlYWQpIHt9CisgIGNsYXNzIEhlbHBlciA6IHB1YmxpYyBjb25jdXJyZW5jeTo6UnVubmFibGUsIHB1YmxpYyBzZXJ2ZXI6OlRTZXJ2ZXJFdmVudEhhbmRsZXIgeworICBwdWJsaWM6CisgICAgSGVscGVyKFNlcnZlclRocmVhZCogc2VydmVyVGhyZWFkKSA6IHNlcnZlclRocmVhZF8oc2VydmVyVGhyZWFkKSB7fQogCi0gICAgdm9pZCBydW4oKSB7Ci0gICAgICBzZXJ2ZXJUaHJlYWRfLT5ydW4oKTsKLSAgICB9CisgICAgdm9pZCBydW4oKSB7IHNlcnZlclRocmVhZF8tPnJ1bigpOyB9CiAKLSAgICB2b2lkIHByZVNlcnZlKCkgewotICAgICAgc2VydmVyVGhyZWFkXy0+cHJlU2VydmUoKTsKLSAgICB9CisgICAgdm9pZCBwcmVTZXJ2ZSgpIHsgc2VydmVyVGhyZWFkXy0+cHJlU2VydmUoKTsgfQogCi0gICBwcml2YXRlOgorICBwcml2YXRlOgogICAgIFNlcnZlclRocmVhZCogc2VydmVyVGhyZWFkXzsKICAgfTsKIAogICB2b2lkIHJ1bigpOwogICB2b2lkIHByZVNlcnZlKCk7CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8SGVscGVyPiBoZWxwZXJfOworICBzdGQ6OnNoYXJlZF9wdHI8SGVscGVyPiBoZWxwZXJfOwogCiAgIHVpbnQxNl90IHBvcnRfOwogICBib29sIHJ1bm5pbmdfOwpAQCAtMTMzLDExICsxMjQsMTIgQEAKICAgYm9vbCBlcnJvcl87CiAgIGNvbmN1cnJlbmN5OjpNb25pdG9yIHNlcnZlck1vbml0b3JfOwogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFNlcnZlclN0YXRlPiBzZXJ2ZXJTdGF0ZV87Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPHNlcnZlcjo6VFNlcnZlcj4gc2VydmVyXzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8Y29uY3VycmVuY3k6OlRocmVhZD4gdGhyZWFkXzsKKyAgc3RkOjpzaGFyZWRfcHRyPFNlcnZlclN0YXRlPiBzZXJ2ZXJTdGF0ZV87CisgIHN0ZDo6c2hhcmVkX3B0cjxzZXJ2ZXI6OlRTZXJ2ZXI+IHNlcnZlcl87CisgIHN0ZDo6c2hhcmVkX3B0cjxjb25jdXJyZW5jeTo6VGhyZWFkPiB0aHJlYWRfOwogfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0ZXN0Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0ZXN0CiAKICNlbmRpZiAvLyBfVEhSSUZUX1RFU1RfU0VSVkVSVEhSRUFEX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvcXQvQ01ha2VMaXN0cy50eHQgYi9saWIvY3BwL3Rlc3QvcXQvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2YzNDFjYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvdGVzdC9xdC9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDMyIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworc2V0KENNQUtFX0FVVE9NT0MgT04pCitmaW5kX3BhY2thZ2UoUXQ1IFJFUVVJUkVEIENPTVBPTkVOVFMgVGVzdCBOZXR3b3JrKQorc2V0KFRRVGNwU2VydmVyVGVzdF9RdDVfU09VUkNFUworICAgIFRRVGNwU2VydmVyVGVzdC5jcHAKKykKK2FkZF9leGVjdXRhYmxlKFRRVGNwU2VydmVyVGVzdF9RdDUgJHtUUVRjcFNlcnZlclRlc3RfUXQ1X1NPVVJDRVN9KQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKFRRVGNwU2VydmVyVGVzdF9RdDUgdGVzdGdlbmNwcF9jb2IpCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoVFFUY3BTZXJ2ZXJUZXN0X1F0NSB0aHJpZnRxdDUpCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoVFFUY3BTZXJ2ZXJUZXN0X1F0NSB0aHJpZnQpCit0YXJnZXRfbGlua19saWJyYXJpZXMoVFFUY3BTZXJ2ZXJUZXN0X1F0NSBRdDU6OlRlc3QgUXQ1OjpOZXR3b3JrKQorCithZGRfdGVzdChOQU1FIFRRVGNwU2VydmVyVGVzdF9RdDUgQ09NTUFORCBUUVRjcFNlcnZlclRlc3RfUXQ1KQorCmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvcXQvVFFUY3BTZXJ2ZXJUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9xdC9UUVRjcFNlcnZlclRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4ZDBjNmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvcXQvVFFUY3BTZXJ2ZXJUZXN0LmNwcApAQCAtMCwwICsxLDExMyBAQAorI2RlZmluZSBCT09TVF9URVNUX01PRFVMRSBUUVRjcFNlcnZlclRlc3QKKyNpbmNsdWRlIDxRVGVzdD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKworI2luY2x1ZGUgPFFUY3BTZXJ2ZXI+CisjaW5jbHVkZSA8UVRjcFNvY2tldD4KKyNpbmNsdWRlIDxRSG9zdEFkZHJlc3M+CisjaW5jbHVkZSA8UVRocmVhZD4KKworI2lmbmRlZiBRX01PQ19SVU4KKyAgI2luY2x1ZGUgInRocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaCIKKyAgI2luY2x1ZGUgInRocmlmdC9hc3luYy9UQXN5bmNQcm9jZXNzb3IuaCIKKyAgI2luY2x1ZGUgInRocmlmdC9xdC9UUVRjcFNlcnZlci5oIgorICAjaW5jbHVkZSAidGhyaWZ0L3F0L1RRSU9EZXZpY2VUcmFuc3BvcnQuaCIKKworICAjaW5jbHVkZSAiZ2VuLWNwcC9QYXJlbnRTZXJ2aWNlLmgiCisjZW5kaWYKKwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OworCitzdHJ1Y3QgQXN5bmNIYW5kbGVyIDogcHVibGljIHRlc3Q6OlBhcmVudFNlcnZpY2VDb2JTdklmIHsKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHN0cmluZ3M7CisgIHZpcnR1YWwgdm9pZCBhZGRTdHJpbmcoc3RkOjpmdW5jdGlvbjx2b2lkKCk+IGNvYiwgY29uc3Qgc3RkOjpzdHJpbmcmIHMpIHsKKyAgICBzdHJpbmdzLnB1c2hfYmFjayhzKTsKKyAgICBjb2IoKTsKKyAgfQorICB2aXJ0dWFsIHZvaWQgZ2V0U3RyaW5ncyhzdGQ6OmZ1bmN0aW9uPHZvaWQoc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGNvbnN0JiBfcmV0dXJuKT4gY29iKSB7CisgICAgY29iKHN0cmluZ3MpOworICB9CisKKyAgLy8gT3ZlcnJpZGVzIG5vdCB1c2VkIGluIHRoaXMgdGVzdAorICB2aXJ0dWFsIHZvaWQgaW5jcmVtZW50R2VuZXJhdGlvbihzdGQ6OmZ1bmN0aW9uPHZvaWQoaW50MzJfdCBjb25zdCYgX3JldHVybik+IGNvYikge30KKyAgdmlydHVhbCB2b2lkIGdldEdlbmVyYXRpb24oc3RkOjpmdW5jdGlvbjx2b2lkKGludDMyX3QgY29uc3QmIF9yZXR1cm4pPiBjb2IpIHt9CisgIHZpcnR1YWwgdm9pZCBnZXREYXRhV2FpdChzdGQ6OmZ1bmN0aW9uPHZvaWQoc3RkOjpzdHJpbmcgY29uc3QmIF9yZXR1cm4pPiBjb2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IGxlbmd0aCkge30KKyAgdmlydHVhbCB2b2lkIG9uZXdheVdhaXQoc3RkOjpmdW5jdGlvbjx2b2lkKCk+IGNvYikge30KKyAgdmlydHVhbCB2b2lkIGV4Y2VwdGlvbldhaXQoCisgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gY29iLAorICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKDo6YXBhY2hlOjp0aHJpZnQ6OlREZWxheWVkRXhjZXB0aW9uKiBfdGhyb3cpPiAvKiBleG5fY29iICovLAorICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpIHt9CisgIHZpcnR1YWwgdm9pZCB1bmV4cGVjdGVkRXhjZXB0aW9uV2FpdChzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gY29iLCBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkge30KK307CisKK2NsYXNzIFRRVGNwU2VydmVyVGVzdCA6IHB1YmxpYyBRT2JqZWN0IHsKKyAgUV9PQkpFQ1QKKworcHJpdmF0ZSBzbG90czoKKyAgdm9pZCBpbml0VGVzdENhc2UoKTsKKyAgdm9pZCBjbGVhbnVwVGVzdENhc2UoKTsKKyAgdm9pZCB0ZXN0X2NvbW11bmljYXRlKCk7CisKK3ByaXZhdGU6CisgIHN0ZDo6c2hhcmVkX3B0cjxRVGhyZWFkPiBzZXJ2ZXJUaHJlYWQ7CisgIHN0ZDo6c2hhcmVkX3B0cjxhc3luYzo6VFFUY3BTZXJ2ZXI+IHNlcnZlcjsKKyAgc3RkOjpzaGFyZWRfcHRyPHRlc3Q6OlBhcmVudFNlcnZpY2VDbGllbnQ+IGNsaWVudDsKK307CisKK3ZvaWQgVFFUY3BTZXJ2ZXJUZXN0Ojppbml0VGVzdENhc2UoKSB7CisgIC8vIHNldHVwIHNlcnZlcgorICBzdGQ6OnNoYXJlZF9wdHI8UVRjcFNlcnZlcj4gc2VydmVyU29ja2V0ID0gc3RkOjptYWtlX3NoYXJlZDxRVGNwU2VydmVyPigpOworICBzZXJ2ZXIucmVzZXQobmV3IGFzeW5jOjpUUVRjcFNlcnZlcihzZXJ2ZXJTb2NrZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8dGVzdDo6UGFyZW50U2VydmljZUFzeW5jUHJvY2Vzc29yPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxBc3luY0hhbmRsZXI+KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPHByb3RvY29sOjpUQmluYXJ5UHJvdG9jb2xGYWN0b3J5PigpKSk7CisgIFFWRVJJRlkoc2VydmVyU29ja2V0LT5saXN0ZW4oUUhvc3RBZGRyZXNzOjpMb2NhbEhvc3QpKTsKKyAgaW50IHBvcnQgPSBzZXJ2ZXJTb2NrZXQtPnNlcnZlclBvcnQoKTsKKyAgUVZFUklGWShwb3J0ID4gMCk7CisKKyAgLy9zZXR1cCBzZXJ2ZXIgdGhyZWFkIGFuZCBtb3ZlIHNlcnZlciB0byBpdAorICBzZXJ2ZXJUaHJlYWQucmVzZXQobmV3IFFUaHJlYWQoKSk7CisgIHNlcnZlclNvY2tldC0+bW92ZVRvVGhyZWFkKHNlcnZlclRocmVhZC5nZXQoKSk7CisgIHNlcnZlci0+bW92ZVRvVGhyZWFkKHNlcnZlclRocmVhZC5nZXQoKSk7CisgIHNlcnZlclRocmVhZC0+c3RhcnQoKTsKKworICAvLyBzZXR1cCBjbGllbnQKKyAgc3RkOjpzaGFyZWRfcHRyPFFUY3BTb2NrZXQ+IHNvY2tldCA9IHN0ZDo6bWFrZV9zaGFyZWQ8UVRjcFNvY2tldD4oKTsKKyAgY2xpZW50LnJlc2V0KG5ldyB0ZXN0OjpQYXJlbnRTZXJ2aWNlQ2xpZW50KHN0ZDo6bWFrZV9zaGFyZWQ8cHJvdG9jb2w6OlRCaW5hcnlQcm90b2NvbD4oCisgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPHRyYW5zcG9ydDo6VFFJT0RldmljZVRyYW5zcG9ydD4oc29ja2V0KSkpKTsKKyAgc29ja2V0LT5jb25uZWN0VG9Ib3N0KFFIb3N0QWRkcmVzczo6TG9jYWxIb3N0LCBwb3J0KTsKKyAgUVZFUklGWShzb2NrZXQtPndhaXRGb3JDb25uZWN0ZWQoKSk7Cit9CisKK3ZvaWQgVFFUY3BTZXJ2ZXJUZXN0OjpjbGVhbnVwVGVzdENhc2UoKSB7CisgIC8vZmlyc3QsIHN0b3AgdGhlIHRocmVhZCB3aGljaCBob2xkcyB0aGUgc2VydmVyCisgIHNlcnZlclRocmVhZC0+cXVpdCgpOworICBzZXJ2ZXJUaHJlYWQtPndhaXQoKTsKKyAgLy8gbm93LCBpdCBpcyBzYWZlIHRvIGRlbGV0ZSB0aGUgc2VydmVyCisgIHNlcnZlci5yZXNldCgpOworICAvLyBkZWxldGUgdGhyZWFkIG5vdworICBzZXJ2ZXJUaHJlYWQucmVzZXQoKTsKKworICAvLyBjbGVhbnVwIGNsaWVudAorICBjbGllbnQucmVzZXQoKTsKK30KKwordm9pZCBUUVRjcFNlcnZlclRlc3Q6OnRlc3RfY29tbXVuaWNhdGUoKSB7CisgIGNsaWVudC0+YWRkU3RyaW5nKCJmb28iKTsKKyAgY2xpZW50LT5hZGRTdHJpbmcoImJhciIpOworCisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiByZXBseTsKKyAgY2xpZW50LT5nZXRTdHJpbmdzKHJlcGx5KTsKKyAgUUNPTVBBUkUoUVN0cmluZzo6ZnJvbVN0ZFN0cmluZyhyZXBseVswXSksIFFTdHJpbmcoImZvbyIpKTsKKyAgUUNPTVBBUkUoUVN0cmluZzo6ZnJvbVN0ZFN0cmluZyhyZXBseVsxXSksIFFTdHJpbmcoImJhciIpKTsKK30KKworCisjaWYgKFFUX1ZFUlNJT04gPj0gUVRfVkVSU0lPTl9DSEVDSyg1LCAwLCAwKSkKK1FURVNUX0dVSUxFU1NfTUFJTihUUVRjcFNlcnZlclRlc3QpOworI2Vsc2UKKyN1bmRlZiBRVF9HVUlfTElCCitRVEVTVF9NQUlOKFRRVGNwU2VydmVyVGVzdCk7CisjZW5kaWYKKyNpbmNsdWRlICJUUVRjcFNlcnZlclRlc3QubW9jIgpkaWZmIC0tZ2l0IGEvbGliL2NwcC90aHJpZnQtcXQ1LnBjLmluIGIvbGliL2NwcC90aHJpZnQtcXQ1LnBjLmluCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmE4YjE2NjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3RocmlmdC1xdDUucGMuaW4KQEAgLTAsMCArMSwzMCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3ByZWZpeD1AcHJlZml4QAorZXhlY19wcmVmaXg9QGV4ZWNfcHJlZml4QAorbGliZGlyPUBsaWJkaXJACitpbmNsdWRlZGlyPUBpbmNsdWRlZGlyQAorCitOYW1lOiBUaHJpZnQKK0Rlc2NyaXB0aW9uOiBUaHJpZnQgUXQ1IEFQSQorVmVyc2lvbjogQFZFUlNJT05ACitSZXF1aXJlczogdGhyaWZ0ID0gQFZFUlNJT05ACitMaWJzOiAtTCR7bGliZGlyfSAtbHRocmlmdHF0NQorQ2ZsYWdzOiAtSSR7aW5jbHVkZWRpcn0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGhyaWZ0LnNsbiBiL2xpYi9jcHAvdGhyaWZ0LnNsbgppbmRleCA4OGQ3OTY4Li5jYjBmNDU1IDEwMDY0NAotLS0gYS9saWIvY3BwL3RocmlmdC5zbG4KKysrIGIvbGliL2NwcC90aHJpZnQuc2xuCkBAIC03LDcgKzcsNyBAQAogRW5kUHJvamVjdAogUHJvamVjdCgiezIxNTBFMzMzLThGREMtNDJBMy05NDc0LTFBMzk1NkQ0NkRFOH0iKSA9ICJkb2MiLCAiZG9jIiwgInswMDY5ODRFMC03Q0MxLTQ3RTItQUNEMi1BNDBGRTREMzg2OTN9IgogCVByb2plY3RTZWN0aW9uKFNvbHV0aW9uSXRlbXMpID0gcHJlUHJvamVjdAotCQlSRUFETUVfV0lORE9XUyA9IFJFQURNRV9XSU5ET1dTCisJCVJFQURNRS5tZCA9IFJFQURNRS5tZAogCUVuZFByb2plY3RTZWN0aW9uCiBFbmRQcm9qZWN0CiBHbG9iYWwKZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvTWFrZWZpbGUuYW0gYi9saWIvY3NoYXJwL01ha2VmaWxlLmFtCmluZGV4IDFjNzVhYTEuLjU2YThiMGYgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvTWFrZWZpbGUuYW0KKysrIGIvbGliL2NzaGFycC9NYWtlZmlsZS5hbQpAQCAtMTcsNyArMTcsOSBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotVEhSSUZUQ09ERT0gXAorU1VCRElSUyA9IC4gdGVzdC9NdWx0aXBsZXgKKworVEhSSUZUQ09ERSA9IFwKICAgICAgICAgICAgIHNyYy9Db2xsZWN0aW9ucy9USGFzaFNldC5jcyBcCiAgICAgICAgICAgICBzcmMvQ29sbGVjdGlvbnMvVENvbGxlY3Rpb25zLmNzIFwKICAgICAgICAgICAgIHNyYy9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcyBcCkBAIC01MCw2ICs1Miw3IEBACiAgICAgICAgICAgICBzcmMvVHJhbnNwb3J0L1RCdWZmZXJlZFRyYW5zcG9ydC5jcyBcCiAgICAgICAgICAgICBzcmMvVHJhbnNwb3J0L1RUcmFuc3BvcnQuY3MgXAogICAgICAgICAgICAgc3JjL1RyYW5zcG9ydC9UU29ja2V0LmNzIFwKKyAgICAgICAgICAgIHNyYy9UcmFuc3BvcnQvVFNvY2tldFZlcnNpb25pemVyLmNzIFwKICAgICAgICAgICAgIHNyYy9UcmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5jcyBcCiAgICAgICAgICAgICBzcmMvVHJhbnNwb3J0L1RTdHJlYW1UcmFuc3BvcnQuY3MgXAogICAgICAgICAgICAgc3JjL1RyYW5zcG9ydC9URnJhbWVkVHJhbnNwb3J0LmNzIFwKQEAgLTY0LDM1ICs2Nyw0OSBAQAogICAgICAgICAgICAgc3JjL1RyYW5zcG9ydC9UVExTU29ja2V0LmNzIFwKICAgICAgICAgICAgIHNyYy9UcmFuc3BvcnQvVFRMU1NlcnZlclNvY2tldC5jcyBcCiAgICAgICAgICAgICBzcmMvVFByb2Nlc3Nvci5jcyBcCisgICAgICAgICAgICBzcmMvVFByb2Nlc3NvckZhY3RvcnkuY3MgXAorICAgICAgICAgICAgc3JjL1RTaW5nbGV0b25Qcm9jZXNzb3JGYWN0b3J5LmNzIFwKKyAgICAgICAgICAgIHNyYy9UUHJvdG90eXBlUHJvY2Vzc29yRmFjdG9yeS5jcyBcCisgICAgICAgICAgICBzcmMvVENvbnRyb2xsaW5nSGFuZGxlci5jcyBcCiAgICAgICAgICAgICBzcmMvVEV4Y2VwdGlvbi5jcyBcCiAgICAgICAgICAgICBzcmMvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmNzCiAKLUNTQz1nbWNzCi0KLWlmIE5FVF8yXzAKLU1PTk9fREVGSU5FUz0vZDpORVRfMl8wCitpZiBNT05PX01DUworZXhwb3J0IENTQyA9IG1jcworZWxzZQorZXhwb3J0IENTQyA9IGdtY3MKIGVuZGlmCiAKLWFsbC1sb2NhbDogVGhyaWZ0LmRsbAoraWYgTkVUXzJfMAorZXhwb3J0IENTQ19ERUZJTkVTID0gLWQ6TkVUXzJfMAorZW5kaWYKKworYWxsLWxvY2FsOiBUaHJpZnQuZGxsIFRocmlmdC40NS5kbGwKIAogVGhyaWZ0LmRsbDogJChUSFJJRlRDT0RFKQotCSQoQ1NDKSAkKFRIUklGVENPREUpIC9vdXQ6VGhyaWZ0LmRsbCAvdGFyZ2V0OmxpYnJhcnkgL3JlZmVyZW5jZTpTeXN0ZW0uV2ViICQoTU9OT19ERUZJTkVTKQorCSQoQ1NDKSAkKENTQ19ERUZJTkVTKSAtb3V0OiRAIC10YXJnZXQ6bGlicmFyeSAtcmVmZXJlbmNlOlN5c3RlbS5XZWIgJChUSFJJRlRDT0RFKQorCitUaHJpZnQuNDUuZGxsOiAkKFRIUklGVENPREUpCisJJChDU0MpICQoQ1NDX0RFRklORVMpIC1vdXQ6JEAgLXRhcmdldDpsaWJyYXJ5IC1yZWZlcmVuY2U6U3lzdGVtLldlYiAkKFRIUklGVENPREUpCiAKIGNsZWFuLWxvY2FsOgotCSQoUk0pIFRocmlmdC5kbGwKLQotIyBydW4gY3NoYXJwIHRlc3RzPwotIyBjaGVjazoKLSMgCWNkIHRlc3QvVGhyaWZ0VGVzdCAmJiAuL21ha2V0ZXN0LnNoCi0jIAljZCB0ZXN0L011bHRpcGxleCAmJiAuL21ha2V0ZXN0LnNoCisJJChSTSkgVGhyaWZ0LmRsbCAgXAorCSQoUk0pIFRocmlmdC40NS5kbGwKIAogRVhUUkFfRElTVCA9IFwKLSAgICAgICAgICAgICAkKFRIUklGVENPREUpIFwKLSAgICAgICAgICAgICBUaHJpZnRNU0J1aWxkVGFzayBcCi0gICAgICAgICAgICAgc3JjL1RocmlmdC5jc3Byb2ogXAotICAgICAgICAgICAgIHNyYy9UaHJpZnQuc2xuIFwKLSAgICAgICAgICAgICBzcmMvVGhyaWZ0LldQNy5jc3Byb2ogXAotICAgICAgICAgICAgIHNyYy9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5XUDcuY3MgXAotICAgICAgICAgICAgIHNyYy9UcmFuc3BvcnQvVFNpbHZlcmxpZ2h0U29ja2V0LmNzIFwKLSAgICAgICAgICAgICB0ZXN0IFwKLSAgICAgICAgICAgICBSRUFETUUubWQKKwkkKFRIUklGVENPREUpIFwKKwlUaHJpZnRNU0J1aWxkVGFzayBcCisJc3JjL1RocmlmdC5jc3Byb2ogXAorCXNyYy9UaHJpZnQuNDUuY3Nwcm9qIFwKKwlzcmMvVGhyaWZ0LnNsbiBcCisJc3JjL05ldDM1L0V4dGVuc2lvbnNOZXQzNS5jcyBcCisJc3JjL1RyYW5zcG9ydC9UU2lsdmVybGlnaHRTb2NrZXQuY3MgXAorCXNyYy9UcmFuc3BvcnQvVEh0dHBUYXNrQXN5bmNIYW5kbGVyLmNzIFwKKwlzcmMvVEFzeW5jUHJvY2Vzc29yLmNzIFwKKwl0ZXN0IFwKKwljb2Rpbmdfc3RhbmRhcmRzLm1kIFwKKwlSRUFETUUubWQKKworTUFJTlRBSU5FUkNMRUFORklMRVMgPSBcCisJTWFrZWZpbGUgXAorCU1ha2VmaWxlLmluCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL1RocmlmdE1TQnVpbGRUYXNrL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzIGIvbGliL2NzaGFycC9UaHJpZnRNU0J1aWxkVGFzay9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwppbmRleCAwNzhlN2NiLi5jNzQxYjcyIDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL1RocmlmdE1TQnVpbGRUYXNrL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCisrKyBiL2xpYi9jc2hhcnAvVGhyaWZ0TVNCdWlsZFRhc2svUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKQEAgLTU2LDUgKzU2LDUgQEAKIC8vIFlvdSBjYW4gc3BlY2lmeSBhbGwgdGhlIHZhbHVlcyBvciB5b3UgY2FuIGRlZmF1bHQgdGhlIEJ1aWxkIGFuZCBSZXZpc2lvbiBOdW1iZXJzCiAvLyBieSB1c2luZyB0aGUgJyonIGFzIHNob3duIGJlbG93OgogLy8gW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjEuMC4qIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiMC45LjIuKiIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseUZpbGVWZXJzaW9uKCIwLjkuMi4qIildCitbYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiMS4wLjAuKiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUZpbGVWZXJzaW9uKCIxLjAuMC4qIildCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL1RocmlmdE1TQnVpbGRUYXNrL1RocmlmdE1TQnVpbGRUYXNrLmNzcHJvaiBiL2xpYi9jc2hhcnAvVGhyaWZ0TVNCdWlsZFRhc2svVGhyaWZ0TVNCdWlsZFRhc2suY3Nwcm9qCmluZGV4IGFlODYwODEuLmEzMTlkZjIgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvVGhyaWZ0TVNCdWlsZFRhc2svVGhyaWZ0TVNCdWlsZFRhc2suY3Nwcm9qCisrKyBiL2xpYi9jc2hhcnAvVGhyaWZ0TVNCdWlsZFRhc2svVGhyaWZ0TVNCdWlsZFRhc2suY3Nwcm9qCkBAIC00NSw3ICs0NSw3IEBACiAgICAgPFVwZGF0ZVJlcXVpcmVkPmZhbHNlPC9VcGRhdGVSZXF1aXJlZD4KICAgICA8TWFwRmlsZUV4dGVuc2lvbnM+dHJ1ZTwvTWFwRmlsZUV4dGVuc2lvbnM+CiAgICAgPEFwcGxpY2F0aW9uUmV2aXNpb24+MDwvQXBwbGljYXRpb25SZXZpc2lvbj4KLSAgICA8QXBwbGljYXRpb25WZXJzaW9uPjEuMC4wLiUyYTwvQXBwbGljYXRpb25WZXJzaW9uPgorICAgIDxBcHBsaWNhdGlvblZlcnNpb24+MS4wLjAuMDwvQXBwbGljYXRpb25WZXJzaW9uPgogICAgIDxJc1dlYkJvb3RzdHJhcHBlcj5mYWxzZTwvSXNXZWJCb290c3RyYXBwZXI+CiAgICAgPFVzZUFwcGxpY2F0aW9uVHJ1c3Q+ZmFsc2U8L1VzZUFwcGxpY2F0aW9uVHJ1c3Q+CiAgICAgPEJvb3RzdHJhcHBlckVuYWJsZWQ+dHJ1ZTwvQm9vdHN0cmFwcGVyRW5hYmxlZD4KQEAgLTExNSw0ICsxMTUsNCBAQAogICA8VGFyZ2V0IE5hbWU9IkFmdGVyQnVpbGQiPgogICA8L1RhcmdldD4KICAgLS0+Ci08L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorPC9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9jb2Rpbmdfc3RhbmRhcmRzLm1kIGIvbGliL2NzaGFycC9jb2Rpbmdfc3RhbmRhcmRzLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjODcxOTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL2NvZGluZ19zdGFuZGFyZHMubWQKQEAgLTAsMCArMSw2IEBACisjIyBDIyBDb2RpbmcgU3RhbmRhcmRzCisKK1BsZWFzZSBmb2xsb3c6CisgKiBbVGhyaWZ0IEdlbmVyYWwgQ29kaW5nIFN0YW5kYXJkc10oL2RvYy9jb2Rpbmdfc3RhbmRhcmRzLm1kKQorICogW01TRE4gQyMgQ29kaW5nIENvbnZlbnRpb25zXShodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvZmY5MjYwNzQuYXNweCkKKyAqIFtDIyBDb2RpbmcgR3VpZGVsaW5lc10oaHR0cDovL2NzaGFycGd1aWRlbGluZXMuY29kZXBsZXguY29tLykKZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL0NvbGxlY3Rpb25zL1RDb2xsZWN0aW9ucy5jcyBiL2xpYi9jc2hhcnAvc3JjL0NvbGxlY3Rpb25zL1RDb2xsZWN0aW9ucy5jcwppbmRleCBmMGJiMWRlLi44NGFmYjZhIDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9Db2xsZWN0aW9ucy9UQ29sbGVjdGlvbnMuY3MKKysrIGIvbGliL2NzaGFycC9zcmMvQ29sbGVjdGlvbnMvVENvbGxlY3Rpb25zLmNzCkBAIC03OSw3ICs3OSw3IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGludCBoYXNoY29kZSA9IDA7Ci0gICAgICAgICAgICBmb3JlYWNoIChPYmplY3Qgb2JqIGluIGVudW1lcmFibGUpCisgICAgICAgICAgICBmb3JlYWNoIChvYmplY3Qgb2JqIGluIGVudW1lcmFibGUpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgSUVudW1lcmFibGUgZW51bTIgPSBvYmogYXMgSUVudW1lcmFibGU7CiAgICAgICAgICAgICAgICAgaW50IG9iakhhc2ggPSBlbnVtMiA9PSBudWxsID8gb2JqLkdldEhhc2hDb2RlICgpIDogR2V0SGFzaENvZGUgKGVudW0yKTsKQEAgLTkxLDQgKzkxLDQgQEAKICAgICAgICAgICAgIHJldHVybiBoYXNoY29kZTsKICAgICAgICAgfQogICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9OZXQzNS9FeHRlbnNpb25zTmV0MzUuY3MgYi9saWIvY3NoYXJwL3NyYy9OZXQzNS9FeHRlbnNpb25zTmV0MzUuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNhNDIzMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvc3JjL05ldDM1L0V4dGVuc2lvbnNOZXQzNS5jcwpAQCAtMCwwICsxLDMxIEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7CisKKyNpZiAoIU5FVDQ1KQorbmFtZXNwYWNlIFRocmlmdAoreworICAgIHN0YXRpYyBjbGFzcyBTdHJlYW1FeHRlbnNpb25zTmV0MzUKKyAgICB7CisgICAgICAgIC8vIENvcHlUbygpIGhhcyBiZWVuIGFkZGVkIGluIDQuMAorICAgICAgICBwdWJsaWMgc3RhdGljIGxvbmcgQ29weVRvKHRoaXMgU3RyZWFtIHNvdXJjZSwgU3RyZWFtIHRhcmdldCkKKyAgICAgICAgeworICAgICAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzgxOTJdOyAgLy8gbXVsdGlwbGUgb2YgNDA5NgorICAgICAgICAgICAgbG9uZyBuVG90YWwgPSAwOworICAgICAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IG5SZWFkID0gc291cmNlLlJlYWQoYnVmZmVyLCAwLCBidWZmZXIuTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBpZiAoblJlYWQgPD0gMCkgIC8vIGRvbmU/CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuVG90YWw7CisKKyAgICAgICAgICAgICAgICB0YXJnZXQuV3JpdGUoYnVmZmVyLCAwLCBuUmVhZCk7CisgICAgICAgICAgICAgICAgblRvdGFsICs9IG5SZWFkOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCit9CisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uV1A3LmNzIGIvbGliL2NzaGFycC9zcmMvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uV1A3LmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzA4YTliLi4wMDAwMDAwCi0tLSBhL2xpYi9jc2hhcnAvc3JjL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLldQNy5jcworKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLe+7vy8qKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXVzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwotdXNpbmcgU3lzdGVtLlJ1bnRpbWUuQ29tcGlsZXJTZXJ2aWNlczsKLXVzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsKLQotLy8gR2VuZXJhbCBJbmZvcm1hdGlvbiBhYm91dCBhbiBhc3NlbWJseSBpcyBjb250cm9sbGVkIHRocm91Z2ggdGhlIGZvbGxvd2luZwotLy8gc2V0IG9mIGF0dHJpYnV0ZXMuIENoYW5nZSB0aGVzZSBhdHRyaWJ1dGUgdmFsdWVzIHRvIG1vZGlmeSB0aGUgaW5mb3JtYXRpb24KLS8vIGFzc29jaWF0ZWQgd2l0aCBhbiBhc3NlbWJseS4KLVthc3NlbWJseTogQXNzZW1ibHlUaXRsZSgiVGhyaWZ0LldQNyIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseURlc2NyaXB0aW9uKCJDIyBiaW5kaW5ncyBmb3IgdGhlIEFwYWNoZSBUaHJpZnQgUlBDIHN5c3RlbSIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseUNvbmZpZ3VyYXRpb24oIiIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseVByb2R1Y3QoIlRocmlmdCIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseUNvcHlyaWdodCgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5VHJhZGVtYXJrKCIiKV0KLVthc3NlbWJseTogQXNzZW1ibHlDdWx0dXJlKCIiKV0KLS8vQFRPRE8gd2hlcmUgdG8gcHV0IExpY2Vuc2UgaW5mb3JtYXRpb24/Ci0KLS8vIFNldHRpbmcgQ29tVmlzaWJsZSB0byBmYWxzZSBtYWtlcyB0aGUgdHlwZXMgaW4gdGhpcyBhc3NlbWJseSBub3QgdmlzaWJsZQotLy8gdG8gQ09NIGNvbXBvbmVudHMuICBJZiB5b3UgbmVlZCB0byBhY2Nlc3MgYSB0eXBlIGluIHRoaXMgYXNzZW1ibHkgZnJvbQotLy8gQ09NLCBzZXQgdGhlIENvbVZpc2libGUgYXR0cmlidXRlIHRvIHRydWUgb24gdGhhdCB0eXBlLgotW2Fzc2VtYmx5OiBDb21WaXNpYmxlKGZhbHNlKV0KLQotLy8gVGhlIGZvbGxvd2luZyBHVUlEIGlzIGZvciB0aGUgSUQgb2YgdGhlIHR5cGVsaWIgaWYgdGhpcyBwcm9qZWN0IGlzIGV4cG9zZWQgdG8gQ09NCi1bYXNzZW1ibHk6IEd1aWQoImEzNDNmODljLTU3ZGQtNGZhOC1hOWM2LTM1MzkxY2Q1ZjY1NSIpXQotCi0vLyBWZXJzaW9uIGluZm9ybWF0aW9uIGZvciBhbiBhc3NlbWJseSBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nIGZvdXIgdmFsdWVzOgotLy8KLS8vICAgICAgTWFqb3IgVmVyc2lvbgotLy8gICAgICBNaW5vciBWZXJzaW9uCi0vLyAgICAgIEJ1aWxkIE51bWJlcgotLy8gICAgICBSZXZpc2lvbgotLy8KLS8vIFlvdSBjYW4gc3BlY2lmeSBhbGwgdGhlIHZhbHVlcyBvciB5b3UgY2FuIGRlZmF1bHQgdGhlIEJ1aWxkIGFuZCBSZXZpc2lvbiBOdW1iZXJzCi0vLyBieSB1c2luZyB0aGUgJyonIGFzIHNob3duIGJlbG93OgotW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjAuOS4yLjAiKV0KLVthc3NlbWJseTogQXNzZW1ibHlGaWxlVmVyc2lvbigiMC45LjIuMCIpXQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MgYi9saWIvY3NoYXJwL3NyYy9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwppbmRleCBlNTJmNWI5Li43ZTg2NzgxIDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcworKysgYi9saWIvY3NoYXJwL3NyYy9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpAQCAtNTEsNSArNTEsNSBAQAogLy8KIC8vIFlvdSBjYW4gc3BlY2lmeSBhbGwgdGhlIHZhbHVlcyBvciB5b3UgY2FuIGRlZmF1bHQgdGhlIEJ1aWxkIGFuZCBSZXZpc2lvbiBOdW1iZXJzCiAvLyBieSB1c2luZyB0aGUgJyonIGFzIHNob3duIGJlbG93OgotW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjAuOS4yLjAiKV0KLVthc3NlbWJseTogQXNzZW1ibHlGaWxlVmVyc2lvbigiMC45LjIuMCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjEuMC4wLjAiKV0KK1thc3NlbWJseTogQXNzZW1ibHlGaWxlVmVyc2lvbigiMS4wLjAuMCIpXQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVEFic3RyYWN0QmFzZS5jcyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RBYnN0cmFjdEJhc2UuY3MKaW5kZXggYzBkNWFiZS4uZjVhNjFjZCAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVEFic3RyYWN0QmFzZS5jcworKysgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UQWJzdHJhY3RCYXNlLmNzCkBAIC0yMSw5ICsyMSw5IEBACiB7CiAgICAgcHVibGljIGludGVyZmFjZSBUQWJzdHJhY3RCYXNlCiAgICAgewotICAgICAgICAvLy8KLSAgICAgICAgLy8vIFdyaXRlcyB0aGUgb2JqZWN0cyBvdXQgdG8gdGhlIHByb3RvY29sCi0gICAgICAgIC8vLworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXcml0ZXMgdGhlIG9iamVjdHMgb3V0IHRvIHRoZSBwcm90b2NvbC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgdm9pZCBXcml0ZShUUHJvdG9jb2wgdFByb3RvY29sKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UQmFzZS5jcyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RCYXNlLmNzCmluZGV4IDM1MGZmNDkuLjQxMWU0ZDkgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RCYXNlLmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RCYXNlLmNzCkBAIC0yMSw5ICsyMSw5IEBACiB7CiAgICAgcHVibGljIGludGVyZmFjZSBUQmFzZSA6IFRBYnN0cmFjdEJhc2UKICAgICB7Ci0gICAgICAgIC8vLworICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgIC8vLyBSZWFkcyB0aGUgVE9iamVjdCBmcm9tIHRoZSBnaXZlbiBpbnB1dCBwcm90b2NvbC4KLSAgICAgICAgLy8vCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHZvaWQgUmVhZChUUHJvdG9jb2wgdFByb3RvY29sKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuY3MgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuY3MKaW5kZXggNGVjZWI4Ni4uYTRmYWE5NCAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5jcwpAQCAtMzYsMjkgKzM2LDI4IEBACiAgICAgICAgIHByb3RlY3RlZCBib29sIHN0cmljdFdyaXRlXyA9IHRydWU7CiAKICAgICAgICAgI3JlZ2lvbiBCaW5hcnlQcm90b2NvbCBGYWN0b3J5Ci0gICAgICAgICAvKioKLSAgICAgICAgICAqIEZhY3RvcnkKLSAgICAgICAgICAqLwotICAgICAgICAgIHB1YmxpYyBjbGFzcyBGYWN0b3J5IDogVFByb3RvY29sRmFjdG9yeSB7CiAKLSAgICAgICAgICAgICAgcHJvdGVjdGVkIGJvb2wgc3RyaWN0UmVhZF8gPSBmYWxzZTsKLSAgICAgICAgICAgICAgcHJvdGVjdGVkIGJvb2wgc3RyaWN0V3JpdGVfID0gdHJ1ZTsKKyAgICAgICAgcHVibGljIGNsYXNzIEZhY3RvcnkgOiBUUHJvdG9jb2xGYWN0b3J5CisgICAgICAgIHsKKyAgICAgICAgICAgIHByb3RlY3RlZCBib29sIHN0cmljdFJlYWRfID0gZmFsc2U7CisgICAgICAgICAgICBwcm90ZWN0ZWQgYm9vbCBzdHJpY3RXcml0ZV8gPSB0cnVlOwogCi0gICAgICAgICAgICAgIHB1YmxpYyBGYWN0b3J5KCkKLSAgICAgICAgICAgICAgICAgIDp0aGlzKGZhbHNlLCB0cnVlKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICBwdWJsaWMgRmFjdG9yeShib29sIHN0cmljdFJlYWQsIGJvb2wgc3RyaWN0V3JpdGUpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHN0cmljdFJlYWRfID0gc3RyaWN0UmVhZDsKLSAgICAgICAgICAgICAgICAgIHN0cmljdFdyaXRlXyA9IHN0cmljdFdyaXRlOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBUUHJvdG9jb2wgR2V0UHJvdG9jb2woVFRyYW5zcG9ydCB0cmFucykgewotICAgICAgICAgICAgICByZXR1cm4gbmV3IFRCaW5hcnlQcm90b2NvbCh0cmFucywgc3RyaWN0UmVhZF8sIHN0cmljdFdyaXRlXyk7CisgICAgICAgICAgICBwdWJsaWMgRmFjdG9yeSgpCisgICAgICAgICAgICAgICAgOiB0aGlzKGZhbHNlLCB0cnVlKQorICAgICAgICAgICAgewogICAgICAgICAgICAgfQotICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIEZhY3RvcnkoYm9vbCBzdHJpY3RSZWFkLCBib29sIHN0cmljdFdyaXRlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0cmljdFJlYWRfID0gc3RyaWN0UmVhZDsKKyAgICAgICAgICAgICAgICBzdHJpY3RXcml0ZV8gPSBzdHJpY3RXcml0ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFRQcm90b2NvbCBHZXRQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zLCBzdHJpY3RSZWFkXywgc3RyaWN0V3JpdGVfKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCiAgICAgICAgICNlbmRyZWdpb24KIApAQCAtNjgsNyArNjcsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIFRCaW5hcnlQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zLCBib29sIHN0cmljdFJlYWQsIGJvb2wgc3RyaWN0V3JpdGUpCi0gICAgICAgICAgICA6YmFzZSh0cmFucykKKyAgICAgICAgICAgIDogYmFzZSh0cmFucykKICAgICAgICAgewogICAgICAgICAgICAgc3RyaWN0UmVhZF8gPSBzdHJpY3RSZWFkOwogICAgICAgICAgICAgc3RyaWN0V3JpdGVfID0gc3RyaWN0V3JpdGU7CkBAIC0zNDUsMTYgKzM0NCwxNyBAQAogICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgbG9uZyBSZWFkSTY0KCkKICAgICAgICAgewogICAgICAgICAgICAgUmVhZEFsbChpNjRpbiwgMCwgOCk7Ci0gICAgICAgICAgICB1bmNoZWNrZWQgewotICAgICAgICAgICAgICByZXR1cm4gKGxvbmcpKAotICAgICAgICAgICAgICAgICAgKChsb25nKShpNjRpblswXSAmIDB4ZmYpIDw8IDU2KSB8Ci0gICAgICAgICAgICAgICAgICAoKGxvbmcpKGk2NGluWzFdICYgMHhmZikgPDwgNDgpIHwKLSAgICAgICAgICAgICAgICAgICgobG9uZykoaTY0aW5bMl0gJiAweGZmKSA8PCA0MCkgfAotICAgICAgICAgICAgICAgICAgKChsb25nKShpNjRpblszXSAmIDB4ZmYpIDw8IDMyKSB8Ci0gICAgICAgICAgICAgICAgICAoKGxvbmcpKGk2NGluWzRdICYgMHhmZikgPDwgMjQpIHwKLSAgICAgICAgICAgICAgICAgICgobG9uZykoaTY0aW5bNV0gJiAweGZmKSA8PCAxNikgfAotICAgICAgICAgICAgICAgICAgKChsb25nKShpNjRpbls2XSAmIDB4ZmYpIDw8IDgpIHwKLSAgICAgICAgICAgICAgICAgICgobG9uZykoaTY0aW5bN10gJiAweGZmKSkpOworICAgICAgICAgICAgdW5jaGVja2VkCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChsb25nKSgKKyAgICAgICAgICAgICAgICAgICAgKChsb25nKShpNjRpblswXSAmIDB4ZmYpIDw8IDU2KSB8CisgICAgICAgICAgICAgICAgICAgICgobG9uZykoaTY0aW5bMV0gJiAweGZmKSA8PCA0OCkgfAorICAgICAgICAgICAgICAgICAgICAoKGxvbmcpKGk2NGluWzJdICYgMHhmZikgPDwgNDApIHwKKyAgICAgICAgICAgICAgICAgICAgKChsb25nKShpNjRpblszXSAmIDB4ZmYpIDw8IDMyKSB8CisgICAgICAgICAgICAgICAgICAgICgobG9uZykoaTY0aW5bNF0gJiAweGZmKSA8PCAyNCkgfAorICAgICAgICAgICAgICAgICAgICAoKGxvbmcpKGk2NGluWzVdICYgMHhmZikgPDwgMTYpIHwKKyAgICAgICAgICAgICAgICAgICAgKChsb25nKShpNjRpbls2XSAmIDB4ZmYpIDw8IDgpIHwKKyAgICAgICAgICAgICAgICAgICAgKChsb25nKShpNjRpbls3XSAmIDB4ZmYpKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMzc4LDcgKzM3OCw3IEBACiAgICAgICAgICAgICB0cmFucy5SZWFkQWxsKGJ1ZiwgMCwgc2l6ZSk7CiAgICAgICAgICAgICByZXR1cm4gYnVmOwogICAgICAgICB9Ci0gICAgICAgIHByaXZhdGUgIHN0cmluZyBSZWFkU3RyaW5nQm9keShpbnQgc2l6ZSkKKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgUmVhZFN0cmluZ0JvZHkoaW50IHNpemUpCiAgICAgICAgIHsKICAgICAgICAgICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVtzaXplXTsKICAgICAgICAgICAgIHRyYW5zLlJlYWRBbGwoYnVmLCAwLCBzaXplKTsKZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wuY3MgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLmNzCmluZGV4IDJiNGY2ZjEuLmZmNjczOTcgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wuY3MKKysrIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5jcwpAQCAtNDQsOSArNDQsOSBAQAogICAgICAgICBwcml2YXRlIGNvbnN0IGJ5dGUgVFlQRV9CSVRTID0gMHgwNzsgLy8gMDAwMCAwMTExCiAgICAgICAgIHByaXZhdGUgY29uc3QgaW50IFRZUEVfU0hJRlRfQU1PVU5UID0gNTsKIAotICAgICAgICAvKioKLSAgICAgICAgICogQWxsIG9mIHRoZSBvbi13aXJlIHR5cGUgY29kZXMuCi0gICAgICAgICAqLworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBbGwgb2YgdGhlIG9uLXdpcmUgdHlwZSBjb2Rlcy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVHlwZXMKICAgICAgICAgewogICAgICAgICAgICAgcHVibGljIGNvbnN0IGJ5dGUgU1RPUCA9IDB4MDA7CkBAIC02NCwzMiArNjQsMjkgQEAKICAgICAgICAgICAgIHB1YmxpYyBjb25zdCBieXRlIFNUUlVDVCA9IDB4MEM7CiAgICAgICAgIH0KIAotICAgICAgICAvKioKLSAgICAgICAgICogVXNlZCB0byBrZWVwIHRyYWNrIG9mIHRoZSBsYXN0IGZpZWxkIGZvciB0aGUgY3VycmVudCBhbmQgcHJldmlvdXMgc3RydWN0cywKLSAgICAgICAgICogc28gd2UgY2FuIGRvIHRoZSBkZWx0YSBzdHVmZi4KLSAgICAgICAgICovCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFVzZWQgdG8ga2VlcCB0cmFjayBvZiB0aGUgbGFzdCBmaWVsZCBmb3IgdGhlIGN1cnJlbnQgYW5kIHByZXZpb3VzIHN0cnVjdHMsCisgICAgICAgIC8vLyBzbyB3ZSBjYW4gZG8gdGhlIGRlbHRhIHN0dWZmLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwcml2YXRlIFN0YWNrPHNob3J0PiBsYXN0RmllbGRfID0gbmV3IFN0YWNrPHNob3J0PigxNSk7CiAKICAgICAgICAgcHJpdmF0ZSBzaG9ydCBsYXN0RmllbGRJZF8gPSAwOwogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBJZiB3ZSBlbmNvdW50ZXIgYSBib29sZWFuIGZpZWxkIGJlZ2luLCBzYXZlIHRoZSBURmllbGQgaGVyZSBzbyBpdCBjYW4KLSAgICAgICAgICogaGF2ZSB0aGUgdmFsdWUgaW5jb3Jwb3JhdGVkLgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSWYgd2UgZW5jb3VudGVyIGEgYm9vbGVhbiBmaWVsZCBiZWdpbiwgc2F2ZSB0aGUgVEZpZWxkIGhlcmUgc28gaXQgY2FuCisgICAgICAgIC8vLyBoYXZlIHRoZSB2YWx1ZSBpbmNvcnBvcmF0ZWQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHByaXZhdGUgTnVsbGFibGU8VEZpZWxkPiBib29sZWFuRmllbGRfOwogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBJZiB3ZSBSZWFkIGEgZmllbGQgaGVhZGVyLCBhbmQgaXQncyBhIGJvb2xlYW4gZmllbGQsIHNhdmUgdGhlIGJvb2xlYW4KLSAgICAgICAgICogdmFsdWUgaGVyZSBzbyB0aGF0IFJlYWRCb29sIGNhbiB1c2UgaXQuCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlICBOdWxsYWJsZTxCb29sZWFuPiBib29sVmFsdWVfOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJZiB3ZSBSZWFkIGEgZmllbGQgaGVhZGVyLCBhbmQgaXQncyBhIGJvb2xlYW4gZmllbGQsIHNhdmUgdGhlIGJvb2xlYW4KKyAgICAgICAgLy8vIHZhbHVlIGhlcmUgc28gdGhhdCBSZWFkQm9vbCBjYW4gdXNlIGl0LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIE51bGxhYmxlPEJvb2xlYW4+IGJvb2xWYWx1ZV87CiAKIAogICAgICAgICAjcmVnaW9uIENvbXBhY3RQcm90b2NvbCBGYWN0b3J5CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAgKiBGYWN0b3J5Ci0gICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGNsYXNzIEZhY3RvcnkgOiBUUHJvdG9jb2xGYWN0b3J5CiAgICAgICAgIHsKICAgICAgICAgICAgIHB1YmxpYyBGYWN0b3J5KCkgeyB9CkBAIC0xMjcsMzEgKzEyNCwzMiBAQAogCiAgICAgICAgICNyZWdpb24gV3JpdGUgTWV0aG9kcwogCi0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFdyaXRlcyBhIGJ5dGUgd2l0aG91dCBhbnkgcG9zc2liaWxpdHkgb2YgYWxsIHRoYXQgZmllbGQgaGVhZGVyIG5vbnNlbnNlLgotICAgICAgICAgKiBVc2VkIGludGVybmFsbHkgYnkgb3RoZXIgd3JpdGluZyBtZXRob2RzIHRoYXQga25vdyB0aGV5IG5lZWQgdG8gV3JpdGUgYSBieXRlLgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JpdGVzIGEgYnl0ZSB3aXRob3V0IGFueSBwb3NzaWJpbGl0eSBvZiBhbGwgdGhhdCBmaWVsZCBoZWFkZXIgbm9uc2Vuc2UuCisgICAgICAgIC8vLyBVc2VkIGludGVybmFsbHkgYnkgb3RoZXIgd3JpdGluZyBtZXRob2RzIHRoYXQga25vdyB0aGV5IG5lZWQgdG8gV3JpdGUgYSBieXRlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwcml2YXRlIGJ5dGVbXSBieXRlRGlyZWN0QnVmZmVyID0gbmV3IGJ5dGVbMV07CisKICAgICAgICAgcHJpdmF0ZSB2b2lkIFdyaXRlQnl0ZURpcmVjdChieXRlIGIpCiAgICAgICAgIHsKICAgICAgICAgICAgIGJ5dGVEaXJlY3RCdWZmZXJbMF0gPSBiOwogICAgICAgICAgICAgdHJhbnMuV3JpdGUoYnl0ZURpcmVjdEJ1ZmZlcik7CiAgICAgICAgIH0KIAotICAgICAgICAvKioKLSAgICAgICAgICogV3JpdGVzIGEgYnl0ZSB3aXRob3V0IGFueSBwb3NzaWJpbGl0eSBvZiBhbGwgdGhhdCBmaWVsZCBoZWFkZXIgbm9uc2Vuc2UuCi0gICAgICAgICAqLworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXcml0ZXMgYSBieXRlIHdpdGhvdXQgYW55IHBvc3NpYmlsaXR5IG9mIGFsbCB0aGF0IGZpZWxkIGhlYWRlciBub25zZW5zZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHJpdmF0ZSB2b2lkIFdyaXRlQnl0ZURpcmVjdChpbnQgbikKICAgICAgICAgewogICAgICAgICAgICAgV3JpdGVCeXRlRGlyZWN0KChieXRlKW4pOwogICAgICAgICB9CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFdyaXRlIGFuIGkzMiBhcyBhIHZhcmludC4gUmVzdWx0cyBpbiAxLTUgYnl0ZXMgb24gdGhlIHdpcmUuCi0gICAgICAgICAqIFRPRE86IG1ha2UgYSBwZXJtYW5lbnQgYnVmZmVyIGxpa2UgV3JpdGVWYXJpbnQ2ND8KLSAgICAgICAgICovCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdyaXRlIGFuIGkzMiBhcyBhIHZhcmludC4gUmVzdWx0cyBpbiAxLTUgYnl0ZXMgb24gdGhlIHdpcmUuCisgICAgICAgIC8vLyBUT0RPOiBtYWtlIGEgcGVybWFuZW50IGJ1ZmZlciBsaWtlIFdyaXRlVmFyaW50NjQ/CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIGJ5dGVbXSBpMzJidWYgPSBuZXcgYnl0ZVs1XTsKKwogICAgICAgICBwcml2YXRlIHZvaWQgV3JpdGVWYXJpbnQzMih1aW50IG4pCiAgICAgICAgIHsKICAgICAgICAgICAgIGludCBpZHggPSAwOwpAQCAtMTc0LDEwICsxNzIsMTAgQEAKICAgICAgICAgICAgIHRyYW5zLldyaXRlKGkzMmJ1ZiwgMCwgaWR4KTsKICAgICAgICAgfQogCi0gICAgICAgIC8qKgotICAgICAgICAqIFdyaXRlIGEgbWVzc2FnZSBoZWFkZXIgdG8gdGhlIHdpcmUuIENvbXBhY3QgUHJvdG9jb2wgbWVzc2FnZXMgY29udGFpbiB0aGUKLSAgICAgICAgKiBwcm90b2NvbCB2ZXJzaW9uIHNvIHdlIGNhbiBtaWdyYXRlIGZvcndhcmRzIGluIHRoZSBmdXR1cmUgaWYgbmVlZCBiZS4KLSAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JpdGUgYSBtZXNzYWdlIGhlYWRlciB0byB0aGUgd2lyZS4gQ29tcGFjdCBQcm90b2NvbCBtZXNzYWdlcyBjb250YWluIHRoZQorICAgICAgICAvLy8gcHJvdG9jb2wgdmVyc2lvbiBzbyB3ZSBjYW4gbWlncmF0ZSBmb3J3YXJkcyBpbiB0aGUgZnV0dXJlIGlmIG5lZWQgYmUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlTWVzc2FnZUJlZ2luKFRNZXNzYWdlIG1lc3NhZ2UpCiAgICAgICAgIHsKICAgICAgICAgICAgIFdyaXRlQnl0ZURpcmVjdChQUk9UT0NPTF9JRCk7CkBAIC0xODYsMzMgKzE4NCwzMyBAQAogICAgICAgICAgICAgV3JpdGVTdHJpbmcobWVzc2FnZS5OYW1lKTsKICAgICAgICAgfQogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBXcml0ZSBhIHN0cnVjdCBiZWdpbi4gVGhpcyBkb2Vzbid0IGFjdHVhbGx5IHB1dCBhbnl0aGluZyBvbiB0aGUgd2lyZS4gV2UKLSAgICAgICAgICogdXNlIGl0IGFzIGFuIG9wcG9ydHVuaXR5IHRvIHB1dCBzcGVjaWFsIHBsYWNlaG9sZGVyIG1hcmtlcnMgb24gdGhlIGZpZWxkCi0gICAgICAgICAqIHN0YWNrIHNvIHdlIGNhbiBnZXQgdGhlIGZpZWxkIGlkIGRlbHRhcyBjb3JyZWN0LgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JpdGUgYSBzdHJ1Y3QgYmVnaW4uIFRoaXMgZG9lc24ndCBhY3R1YWxseSBwdXQgYW55dGhpbmcgb24gdGhlIHdpcmUuIFdlCisgICAgICAgIC8vLyB1c2UgaXQgYXMgYW4gb3Bwb3J0dW5pdHkgdG8gcHV0IHNwZWNpYWwgcGxhY2Vob2xkZXIgbWFya2VycyBvbiB0aGUgZmllbGQKKyAgICAgICAgLy8vIHN0YWNrIHNvIHdlIGNhbiBnZXQgdGhlIGZpZWxkIGlkIGRlbHRhcyBjb3JyZWN0LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVN0cnVjdEJlZ2luKFRTdHJ1Y3Qgc3RyY3QpCiAgICAgICAgIHsKICAgICAgICAgICAgIGxhc3RGaWVsZF8uUHVzaChsYXN0RmllbGRJZF8pOwogICAgICAgICAgICAgbGFzdEZpZWxkSWRfID0gMDsKICAgICAgICAgfQogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBXcml0ZSBhIHN0cnVjdCBlbmQuIFRoaXMgZG9lc24ndCBhY3R1YWxseSBwdXQgYW55dGhpbmcgb24gdGhlIHdpcmUuIFdlIHVzZQotICAgICAgICAgKiB0aGlzIGFzIGFuIG9wcG9ydHVuaXR5IHRvIHBvcCB0aGUgbGFzdCBmaWVsZCBmcm9tIHRoZSBjdXJyZW50IHN0cnVjdCBvZmYKLSAgICAgICAgICogb2YgdGhlIGZpZWxkIHN0YWNrLgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JpdGUgYSBzdHJ1Y3QgZW5kLiBUaGlzIGRvZXNuJ3QgYWN0dWFsbHkgcHV0IGFueXRoaW5nIG9uIHRoZSB3aXJlLiBXZSB1c2UKKyAgICAgICAgLy8vIHRoaXMgYXMgYW4gb3Bwb3J0dW5pdHkgdG8gcG9wIHRoZSBsYXN0IGZpZWxkIGZyb20gdGhlIGN1cnJlbnQgc3RydWN0IG9mZgorICAgICAgICAvLy8gb2YgdGhlIGZpZWxkIHN0YWNrLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVN0cnVjdEVuZCgpCiAgICAgICAgIHsKICAgICAgICAgICAgIGxhc3RGaWVsZElkXyA9IGxhc3RGaWVsZF8uUG9wKCk7CiAgICAgICAgIH0KIAotICAgICAgICAvKioKLSAgICAgICAgICogV3JpdGUgYSBmaWVsZCBoZWFkZXIgY29udGFpbmluZyB0aGUgZmllbGQgaWQgYW5kIGZpZWxkIHR5cGUuIElmIHRoZQotICAgICAgICAgKiBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGN1cnJlbnQgZmllbGQgaWQgYW5kIHRoZSBsYXN0IG9uZSBpcyBzbWFsbCAoPCAxNSksCi0gICAgICAgICAqIHRoZW4gdGhlIGZpZWxkIGlkIHdpbGwgYmUgZW5jb2RlZCBpbiB0aGUgNCBNU0IgYXMgYSBkZWx0YS4gT3RoZXJ3aXNlLCB0aGUKLSAgICAgICAgICogZmllbGQgaWQgd2lsbCBmb2xsb3cgdGhlIHR5cGUgaGVhZGVyIGFzIGEgemlnemFnIHZhcmludC4KLSAgICAgICAgICovCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdyaXRlIGEgZmllbGQgaGVhZGVyIGNvbnRhaW5pbmcgdGhlIGZpZWxkIGlkIGFuZCBmaWVsZCB0eXBlLiBJZiB0aGUKKyAgICAgICAgLy8vIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgY3VycmVudCBmaWVsZCBpZCBhbmQgdGhlIGxhc3Qgb25lIGlzIHNtYWxsICgmbHQ7IDE1KSwKKyAgICAgICAgLy8vIHRoZW4gdGhlIGZpZWxkIGlkIHdpbGwgYmUgZW5jb2RlZCBpbiB0aGUgNCBNU0IgYXMgYSBkZWx0YS4gT3RoZXJ3aXNlLCB0aGUKKyAgICAgICAgLy8vIGZpZWxkIGlkIHdpbGwgZm9sbG93IHRoZSB0eXBlIGhlYWRlciBhcyBhIHppZ3phZyB2YXJpbnQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlRmllbGRCZWdpbihURmllbGQgZmllbGQpCiAgICAgICAgIHsKICAgICAgICAgICAgIGlmIChmaWVsZC5UeXBlID09IFRUeXBlLkJvb2wpCkBAIC0yMjYsMTEgKzIyNCwxMSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSB3b3JraG9yc2Ugb2YgV3JpdGVGaWVsZEJlZ2luLiBJdCBoYXMgdGhlIG9wdGlvbiBvZiBkb2luZyBhCi0gICAgICAgICAqICd0eXBlIG92ZXJyaWRlJyBvZiB0aGUgdHlwZSBoZWFkZXIuIFRoaXMgaXMgdXNlZCBzcGVjaWZpY2FsbHkgaW4gdGhlCi0gICAgICAgICAqIGJvb2xlYW4gZmllbGQgY2FzZS4KLSAgICAgICAgICovCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSB3b3JraG9yc2Ugb2YgV3JpdGVGaWVsZEJlZ2luLiBJdCBoYXMgdGhlIG9wdGlvbiBvZiBkb2luZyBhCisgICAgICAgIC8vLyAndHlwZSBvdmVycmlkZScgb2YgdGhlIHR5cGUgaGVhZGVyLiBUaGlzIGlzIHVzZWQgc3BlY2lmaWNhbGx5IGluIHRoZQorICAgICAgICAvLy8gYm9vbGVhbiBmaWVsZCBjYXNlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwcml2YXRlIHZvaWQgV3JpdGVGaWVsZEJlZ2luSW50ZXJuYWwoVEZpZWxkIGZpZWxkLCBieXRlIHR5cGVPdmVycmlkZSkKICAgICAgICAgewogICAgICAgICAgICAgLy8gc2hvcnQgbGFzdEZpZWxkID0gbGFzdEZpZWxkXy5Qb3AoKTsKQEAgLTI1NSwxOCArMjUzLDE4IEBACiAgICAgICAgICAgICAvLyBsYXN0RmllbGRfLnB1c2goZmllbGQuaWQpOwogICAgICAgICB9CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFdyaXRlIHRoZSBTVE9QIHN5bWJvbCBzbyB3ZSBrbm93IHRoZXJlIGFyZSBubyBtb3JlIGZpZWxkcyBpbiB0aGlzIHN0cnVjdC4KLSAgICAgICAgICovCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdyaXRlIHRoZSBTVE9QIHN5bWJvbCBzbyB3ZSBrbm93IHRoZXJlIGFyZSBubyBtb3JlIGZpZWxkcyBpbiB0aGlzIHN0cnVjdC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVGaWVsZFN0b3AoKQogICAgICAgICB7CiAgICAgICAgICAgICBXcml0ZUJ5dGVEaXJlY3QoVHlwZXMuU1RPUCk7CiAgICAgICAgIH0KIAotICAgICAgICAvKioKLSAgICAgICAgICogV3JpdGUgYSBtYXAgaGVhZGVyLiBJZiB0aGUgbWFwIGlzIGVtcHR5LCBvbWl0IHRoZSBrZXkgYW5kIHZhbHVlIHR5cGUKLSAgICAgICAgICogaGVhZGVycywgYXMgd2UgZG9uJ3QgbmVlZCBhbnkgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB0byBza2lwIGl0LgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JpdGUgYSBtYXAgaGVhZGVyLiBJZiB0aGUgbWFwIGlzIGVtcHR5LCBvbWl0IHRoZSBrZXkgYW5kIHZhbHVlIHR5cGUKKyAgICAgICAgLy8vIGhlYWRlcnMsIGFzIHdlIGRvbid0IG5lZWQgYW55IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdG8gc2tpcCBpdC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVNYXBCZWdpbihUTWFwIG1hcCkKICAgICAgICAgewogICAgICAgICAgICAgaWYgKG1hcC5Db3VudCA9PSAwKQpAQCAtMjgwLDI4ICsyNzgsMjggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBXcml0ZSBhIGxpc3QgaGVhZGVyLgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JpdGUgYSBsaXN0IGhlYWRlci4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVMaXN0QmVnaW4oVExpc3QgbGlzdCkKICAgICAgICAgewogICAgICAgICAgICAgV3JpdGVDb2xsZWN0aW9uQmVnaW4obGlzdC5FbGVtZW50VHlwZSwgbGlzdC5Db3VudCk7CiAgICAgICAgIH0KIAotICAgICAgICAvKioKLSAgICAgICAgICogV3JpdGUgYSBzZXQgaGVhZGVyLgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JpdGUgYSBzZXQgaGVhZGVyLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVNldEJlZ2luKFRTZXQgc2V0KQogICAgICAgICB7CiAgICAgICAgICAgICBXcml0ZUNvbGxlY3Rpb25CZWdpbihzZXQuRWxlbWVudFR5cGUsIHNldC5Db3VudCk7CiAgICAgICAgIH0KIAotICAgICAgICAvKioKLSAgICAgICAgICogV3JpdGUgYSBib29sZWFuIHZhbHVlLiBQb3RlbnRpYWxseSwgdGhpcyBjb3VsZCBiZSBhIGJvb2xlYW4gZmllbGQsIGluCi0gICAgICAgICAqIHdoaWNoIGNhc2UgdGhlIGZpZWxkIGhlYWRlciBpbmZvIGlzbid0IHdyaXR0ZW4geWV0LiBJZiBzbywgZGVjaWRlIHdoYXQgdGhlCi0gICAgICAgICAqIHJpZ2h0IHR5cGUgaGVhZGVyIGlzIGZvciB0aGUgdmFsdWUgYW5kIHRoZW4gV3JpdGUgdGhlIGZpZWxkIGhlYWRlci4KLSAgICAgICAgICogT3RoZXJ3aXNlLCBXcml0ZSBhIHNpbmdsZSBieXRlLgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JpdGUgYSBib29sZWFuIHZhbHVlLiBQb3RlbnRpYWxseSwgdGhpcyBjb3VsZCBiZSBhIGJvb2xlYW4gZmllbGQsIGluCisgICAgICAgIC8vLyB3aGljaCBjYXNlIHRoZSBmaWVsZCBoZWFkZXIgaW5mbyBpc24ndCB3cml0dGVuIHlldC4gSWYgc28sIGRlY2lkZSB3aGF0IHRoZQorICAgICAgICAvLy8gcmlnaHQgdHlwZSBoZWFkZXIgaXMgZm9yIHRoZSB2YWx1ZSBhbmQgdGhlbiBXcml0ZSB0aGUgZmllbGQgaGVhZGVyLgorICAgICAgICAvLy8gT3RoZXJ3aXNlLCBXcml0ZSBhIHNpbmdsZSBieXRlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUJvb2woQm9vbGVhbiBiKQogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoYm9vbGVhbkZpZWxkXyAhPSBudWxsKQpAQCAtMzE3LDQxICszMTUsNDEgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBXcml0ZSBhIGJ5dGUuIE5vdGhpbmcgdG8gc2VlIGhlcmUhCi0gICAgICAgICAqLworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXcml0ZSBhIGJ5dGUuIE5vdGhpbmcgdG8gc2VlIGhlcmUhCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlQnl0ZShzYnl0ZSBiKQogICAgICAgICB7CiAgICAgICAgICAgICBXcml0ZUJ5dGVEaXJlY3QoKGJ5dGUpYik7CiAgICAgICAgIH0KIAotICAgICAgICAvKioKLSAgICAgICAgICogV3JpdGUgYW4gSTE2IGFzIGEgemlnemFnIHZhcmludC4KLSAgICAgICAgICovCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdyaXRlIGFuIEkxNiBhcyBhIHppZ3phZyB2YXJpbnQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlSTE2KHNob3J0IGkxNikKICAgICAgICAgewogICAgICAgICAgICAgV3JpdGVWYXJpbnQzMihpbnRUb1ppZ1phZyhpMTYpKTsKICAgICAgICAgfQogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBXcml0ZSBhbiBpMzIgYXMgYSB6aWd6YWcgdmFyaW50LgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JpdGUgYW4gaTMyIGFzIGEgemlnemFnIHZhcmludC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVJMzIoaW50IGkzMikKICAgICAgICAgewogICAgICAgICAgICAgV3JpdGVWYXJpbnQzMihpbnRUb1ppZ1phZyhpMzIpKTsKICAgICAgICAgfQogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBXcml0ZSBhbiBpNjQgYXMgYSB6aWd6YWcgdmFyaW50LgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JpdGUgYW4gaTY0IGFzIGEgemlnemFnIHZhcmludC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVJNjQobG9uZyBpNjQpCiAgICAgICAgIHsKICAgICAgICAgICAgIFdyaXRlVmFyaW50NjQobG9uZ1RvWmlnemFnKGk2NCkpOwogICAgICAgICB9CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFdyaXRlIGEgZG91YmxlIHRvIHRoZSB3aXJlIGFzIDggYnl0ZXMuCi0gICAgICAgICAqLworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXcml0ZSBhIGRvdWJsZSB0byB0aGUgd2lyZSBhcyA4IGJ5dGVzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZURvdWJsZShkb3VibGUgZHViKQogICAgICAgICB7CiAgICAgICAgICAgICBieXRlW10gZGF0YSA9IG5ldyBieXRlW10geyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH07CkBAIC0zNTksMTggKzM1NywxOCBAQAogICAgICAgICAgICAgdHJhbnMuV3JpdGUoZGF0YSk7CiAgICAgICAgIH0KIAotICAgICAgICAvKioKLSAgICAgICAgICogV3JpdGUgYSBzdHJpbmcgdG8gdGhlIHdpcmUgd2l0aCBhIHZhcmludCBzaXplIHByZWNlZGluZy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlU3RyaW5nKFN0cmluZyBzdHIpCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdyaXRlIGEgc3RyaW5nIHRvIHRoZSB3aXJlIHdpdGggYSB2YXJpbnQgc2l6ZSBwcmVjZWRpbmcuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlU3RyaW5nKHN0cmluZyBzdHIpCiAgICAgICAgIHsKICAgICAgICAgICAgIGJ5dGVbXSBieXRlcyA9IFVURjhFbmNvZGluZy5VVEY4LkdldEJ5dGVzKHN0cik7CiAgICAgICAgICAgICBXcml0ZUJpbmFyeShieXRlcywgMCwgYnl0ZXMuTGVuZ3RoKTsKICAgICAgICAgfQogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBXcml0ZSBhIGJ5dGUgYXJyYXksIHVzaW5nIGEgdmFyaW50IGZvciB0aGUgc2l6ZS4KLSAgICAgICAgICovCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdyaXRlIGEgYnl0ZSBhcnJheSwgdXNpbmcgYSB2YXJpbnQgZm9yIHRoZSBzaXplLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUJpbmFyeShieXRlW10gYmluKQogICAgICAgICB7CiAgICAgICAgICAgICBXcml0ZUJpbmFyeShiaW4sIDAsIGJpbi5MZW5ndGgpOwpAQCAtMzk3LDEwICszOTUsMTAgQEAKICAgICAgICAgLy8gSW50ZXJuYWwgd3JpdGluZyBtZXRob2RzCiAgICAgICAgIC8vCiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFic3RyYWN0IG1ldGhvZCBmb3Igd3JpdGluZyB0aGUgc3RhcnQgb2YgbGlzdHMgYW5kIHNldHMuIExpc3QgYW5kIHNldHMgb24KLSAgICAgICAgICogdGhlIHdpcmUgZGlmZmVyIG9ubHkgYnkgdGhlIHR5cGUgaW5kaWNhdG9yLgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQWJzdHJhY3QgbWV0aG9kIGZvciB3cml0aW5nIHRoZSBzdGFydCBvZiBsaXN0cyBhbmQgc2V0cy4gTGlzdCBhbmQgc2V0cyBvbgorICAgICAgICAvLy8gdGhlIHdpcmUgZGlmZmVyIG9ubHkgYnkgdGhlIHR5cGUgaW5kaWNhdG9yLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwcm90ZWN0ZWQgdm9pZCBXcml0ZUNvbGxlY3Rpb25CZWdpbihUVHlwZSBlbGVtVHlwZSwgaW50IHNpemUpCiAgICAgICAgIHsKICAgICAgICAgICAgIGlmIChzaXplIDw9IDE0KQpAQCAtNDE0LDkgKzQxMiw5IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICAvKioKLSAgICAgICAgICogV3JpdGUgYW4gaTY0IGFzIGEgdmFyaW50LiBSZXN1bHRzIGluIDEtMTAgYnl0ZXMgb24gdGhlIHdpcmUuCi0gICAgICAgICAqLworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXcml0ZSBhbiBpNjQgYXMgYSB2YXJpbnQuIFJlc3VsdHMgaW4gMS0xMCBieXRlcyBvbiB0aGUgd2lyZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgYnl0ZVtdIHZhcmludDY0b3V0ID0gbmV3IGJ5dGVbMTBdOwogICAgICAgICBwcml2YXRlIHZvaWQgV3JpdGVWYXJpbnQ2NCh1bG9uZyBuKQogICAgICAgICB7CkBAIC00MzcsMjggKzQzNSwyOCBAQAogICAgICAgICAgICAgdHJhbnMuV3JpdGUodmFyaW50NjRvdXQsIDAsIGlkeCk7CiAgICAgICAgIH0KIAotICAgICAgICAvKioKLSAgICAgICAgICogQ29udmVydCBsIGludG8gYSB6aWd6YWcgbG9uZy4gVGhpcyBhbGxvd3MgbmVnYXRpdmUgbnVtYmVycyB0byBiZQotICAgICAgICAgKiByZXByZXNlbnRlZCBjb21wYWN0bHkgYXMgYSB2YXJpbnQuCi0gICAgICAgICAqLworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb252ZXJ0IGwgaW50byBhIHppZ3phZyBsb25nLiBUaGlzIGFsbG93cyBuZWdhdGl2ZSBudW1iZXJzIHRvIGJlCisgICAgICAgIC8vLyByZXByZXNlbnRlZCBjb21wYWN0bHkgYXMgYSB2YXJpbnQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHByaXZhdGUgdWxvbmcgbG9uZ1RvWmlnemFnKGxvbmcgbikKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuICh1bG9uZykobiA8PCAxKSBeICh1bG9uZykobiA+PiA2Myk7CiAgICAgICAgIH0KIAotICAgICAgICAvKioKLSAgICAgICAgICogQ29udmVydCBuIGludG8gYSB6aWd6YWcgaW50LiBUaGlzIGFsbG93cyBuZWdhdGl2ZSBudW1iZXJzIHRvIGJlCi0gICAgICAgICAqIHJlcHJlc2VudGVkIGNvbXBhY3RseSBhcyBhIHZhcmludC4KLSAgICAgICAgICovCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENvbnZlcnQgbiBpbnRvIGEgemlnemFnIGludC4gVGhpcyBhbGxvd3MgbmVnYXRpdmUgbnVtYmVycyB0byBiZQorICAgICAgICAvLy8gcmVwcmVzZW50ZWQgY29tcGFjdGx5IGFzIGEgdmFyaW50LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwcml2YXRlIHVpbnQgaW50VG9aaWdaYWcoaW50IG4pCiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiAodWludCkobiA8PCAxKSBeICh1aW50KShuID4+IDMxKTsKICAgICAgICAgfQogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDb252ZXJ0IGEgbG9uZyBpbnRvIGxpdHRsZS1lbmRpYW4gYnl0ZXMgaW4gYnVmIHN0YXJ0aW5nIGF0IG9mZiBhbmQgZ29pbmcKLSAgICAgICAgICogdW50aWwgb2ZmKzcuCi0gICAgICAgICAqLworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb252ZXJ0IGEgbG9uZyBpbnRvIGxpdHRsZS1lbmRpYW4gYnl0ZXMgaW4gYnVmIHN0YXJ0aW5nIGF0IG9mZiBhbmQgZ29pbmcKKyAgICAgICAgLy8vIHVudGlsIG9mZis3LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwcml2YXRlIHZvaWQgZml4ZWRMb25nVG9CeXRlcyhsb25nIG4sIGJ5dGVbXSBidWYsIGludCBvZmYpCiAgICAgICAgIHsKICAgICAgICAgICAgIGJ1ZltvZmYgKyAwXSA9IChieXRlKShuICYgMHhmZik7CkBAIC00NzUsOSArNDczLDkgQEAKIAogICAgICAgICAjcmVnaW9uIFJlYWRNZXRob2RzCiAKLSAgICAgICAgLyoqCi0gICAqIFJlYWQgYSBtZXNzYWdlIGhlYWRlci4KLSAgICovCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlYWQgYSBtZXNzYWdlIGhlYWRlci4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHVibGljIG92ZXJyaWRlIFRNZXNzYWdlIFJlYWRNZXNzYWdlQmVnaW4oKQogICAgICAgICB7CiAgICAgICAgICAgICBieXRlIHByb3RvY29sSWQgPSAoYnl0ZSlSZWFkQnl0ZSgpOwpAQCAtNDkzLDE0ICs0OTEsMTQgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJ5dGUgdHlwZSA9IChieXRlKSgodmVyc2lvbkFuZFR5cGUgPj4gVFlQRV9TSElGVF9BTU9VTlQpICYgVFlQRV9CSVRTKTsKICAgICAgICAgICAgIGludCBzZXFpZCA9IChpbnQpUmVhZFZhcmludDMyKCk7Ci0gICAgICAgICAgICBTdHJpbmcgbWVzc2FnZU5hbWUgPSBSZWFkU3RyaW5nKCk7CisgICAgICAgICAgICBzdHJpbmcgbWVzc2FnZU5hbWUgPSBSZWFkU3RyaW5nKCk7CiAgICAgICAgICAgICByZXR1cm4gbmV3IFRNZXNzYWdlKG1lc3NhZ2VOYW1lLCAoVE1lc3NhZ2VUeXBlKXR5cGUsIHNlcWlkKTsKICAgICAgICAgfQogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZWFkIGEgc3RydWN0IGJlZ2luLiBUaGVyZSdzIG5vdGhpbmcgb24gdGhlIHdpcmUgZm9yIHRoaXMsIGJ1dCBpdCBpcyBvdXIKLSAgICAgICAgICogb3Bwb3J0dW5pdHkgdG8gcHVzaCBhIG5ldyBzdHJ1Y3QgYmVnaW4gbWFya2VyIG9udG8gdGhlIGZpZWxkIHN0YWNrLgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVhZCBhIHN0cnVjdCBiZWdpbi4gVGhlcmUncyBub3RoaW5nIG9uIHRoZSB3aXJlIGZvciB0aGlzLCBidXQgaXQgaXMgb3VyCisgICAgICAgIC8vLyBvcHBvcnR1bml0eSB0byBwdXNoIGEgbmV3IHN0cnVjdCBiZWdpbiBtYXJrZXIgb250byB0aGUgZmllbGQgc3RhY2suCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBUU3RydWN0IFJlYWRTdHJ1Y3RCZWdpbigpCiAgICAgICAgIHsKICAgICAgICAgICAgIGxhc3RGaWVsZF8uUHVzaChsYXN0RmllbGRJZF8pOwpAQCAtNTA4LDE5ICs1MDYsMTkgQEAKICAgICAgICAgICAgIHJldHVybiBBTk9OWU1PVVNfU1RSVUNUOwogICAgICAgICB9CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIERvZXNuJ3QgYWN0dWFsbHkgY29uc3VtZSBhbnkgd2lyZSBkYXRhLCBqdXN0IHJlbW92ZXMgdGhlIGxhc3QgZmllbGQgZm9yCi0gICAgICAgICAqIHRoaXMgc3RydWN0IGZyb20gdGhlIGZpZWxkIHN0YWNrLgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gRG9lc24ndCBhY3R1YWxseSBjb25zdW1lIGFueSB3aXJlIGRhdGEsIGp1c3QgcmVtb3ZlcyB0aGUgbGFzdCBmaWVsZCBmb3IKKyAgICAgICAgLy8vIHRoaXMgc3RydWN0IGZyb20gdGhlIGZpZWxkIHN0YWNrLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZWFkU3RydWN0RW5kKCkKICAgICAgICAgewogICAgICAgICAgICAgLy8gY29uc3VtZSB0aGUgbGFzdCBmaWVsZCB3ZSBSZWFkIG9mZiB0aGUgd2lyZS4KICAgICAgICAgICAgIGxhc3RGaWVsZElkXyA9IGxhc3RGaWVsZF8uUG9wKCk7CiAgICAgICAgIH0KIAotICAgICAgICAvKioKLSAgICAgICAgICogUmVhZCBhIGZpZWxkIGhlYWRlciBvZmYgdGhlIHdpcmUuCi0gICAgICAgICAqLworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZWFkIGEgZmllbGQgaGVhZGVyIG9mZiB0aGUgd2lyZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHVibGljIG92ZXJyaWRlIFRGaWVsZCBSZWFkRmllbGRCZWdpbigpCiAgICAgICAgIHsKICAgICAgICAgICAgIGJ5dGUgdHlwZSA9IChieXRlKVJlYWRCeXRlKCk7CkBAIC01NjAsMTEgKzU1OCwxMSBAQAogICAgICAgICAgICAgcmV0dXJuIGZpZWxkOwogICAgICAgICB9CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJlYWQgYSBtYXAgaGVhZGVyIG9mZiB0aGUgd2lyZS4gSWYgdGhlIHNpemUgaXMgemVybywgc2tpcCBSZWFkaW5nIHRoZSBrZXkKLSAgICAgICAgICogYW5kIHZhbHVlIHR5cGUuIFRoaXMgbWVhbnMgdGhhdCAwLWxlbmd0aCBtYXBzIHdpbGwgeWllbGQgVE1hcHMgd2l0aG91dCB0aGUKLSAgICAgICAgICogImNvcnJlY3QiIHR5cGVzLgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVhZCBhIG1hcCBoZWFkZXIgb2ZmIHRoZSB3aXJlLiBJZiB0aGUgc2l6ZSBpcyB6ZXJvLCBza2lwIFJlYWRpbmcgdGhlIGtleQorICAgICAgICAvLy8gYW5kIHZhbHVlIHR5cGUuIFRoaXMgbWVhbnMgdGhhdCAwLWxlbmd0aCBtYXBzIHdpbGwgeWllbGQgVE1hcHMgd2l0aG91dCB0aGUKKyAgICAgICAgLy8vICJjb3JyZWN0IiB0eXBlcy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHVibGljIG92ZXJyaWRlIFRNYXAgUmVhZE1hcEJlZ2luKCkKICAgICAgICAgewogICAgICAgICAgICAgaW50IHNpemUgPSAoaW50KVJlYWRWYXJpbnQzMigpOwpAQCAtNTcyLDEyICs1NzAsMTIgQEAKICAgICAgICAgICAgIHJldHVybiBuZXcgVE1hcChnZXRUVHlwZSgoYnl0ZSkoa2V5QW5kVmFsdWVUeXBlID4+IDQpKSwgZ2V0VFR5cGUoKGJ5dGUpKGtleUFuZFZhbHVlVHlwZSAmIDB4ZikpLCBzaXplKTsKICAgICAgICAgfQogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZWFkIGEgbGlzdCBoZWFkZXIgb2ZmIHRoZSB3aXJlLiBJZiB0aGUgbGlzdCBzaXplIGlzIDAtMTQsIHRoZSBzaXplIHdpbGwKLSAgICAgICAgICogYmUgcGFja2VkIGludG8gdGhlIGVsZW1lbnQgdHlwZSBoZWFkZXIuIElmIGl0J3MgYSBsb25nZXIgbGlzdCwgdGhlIDQgTVNCCi0gICAgICAgICAqIG9mIHRoZSBlbGVtZW50IHR5cGUgaGVhZGVyIHdpbGwgYmUgMHhGLCBhbmQgYSB2YXJpbnQgd2lsbCBmb2xsb3cgd2l0aCB0aGUKLSAgICAgICAgICogdHJ1ZSBzaXplLgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVhZCBhIGxpc3QgaGVhZGVyIG9mZiB0aGUgd2lyZS4gSWYgdGhlIGxpc3Qgc2l6ZSBpcyAwLTE0LCB0aGUgc2l6ZSB3aWxsCisgICAgICAgIC8vLyBiZSBwYWNrZWQgaW50byB0aGUgZWxlbWVudCB0eXBlIGhlYWRlci4gSWYgaXQncyBhIGxvbmdlciBsaXN0LCB0aGUgNCBNU0IKKyAgICAgICAgLy8vIG9mIHRoZSBlbGVtZW50IHR5cGUgaGVhZGVyIHdpbGwgYmUgMHhGLCBhbmQgYSB2YXJpbnQgd2lsbCBmb2xsb3cgd2l0aCB0aGUKKyAgICAgICAgLy8vIHRydWUgc2l6ZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHVibGljIG92ZXJyaWRlIFRMaXN0IFJlYWRMaXN0QmVnaW4oKQogICAgICAgICB7CiAgICAgICAgICAgICBieXRlIHNpemVfYW5kX3R5cGUgPSAoYnl0ZSlSZWFkQnl0ZSgpOwpAQCAtNTkwLDIyICs1ODgsMjIgQEAKICAgICAgICAgICAgIHJldHVybiBuZXcgVExpc3QodHlwZSwgc2l6ZSk7CiAgICAgICAgIH0KIAotICAgICAgICAvKioKLSAgICAgICAgICogUmVhZCBhIHNldCBoZWFkZXIgb2ZmIHRoZSB3aXJlLiBJZiB0aGUgc2V0IHNpemUgaXMgMC0xNCwgdGhlIHNpemUgd2lsbAotICAgICAgICAgKiBiZSBwYWNrZWQgaW50byB0aGUgZWxlbWVudCB0eXBlIGhlYWRlci4gSWYgaXQncyBhIGxvbmdlciBzZXQsIHRoZSA0IE1TQgotICAgICAgICAgKiBvZiB0aGUgZWxlbWVudCB0eXBlIGhlYWRlciB3aWxsIGJlIDB4RiwgYW5kIGEgdmFyaW50IHdpbGwgZm9sbG93IHdpdGggdGhlCi0gICAgICAgICAqIHRydWUgc2l6ZS4KLSAgICAgICAgICovCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlYWQgYSBzZXQgaGVhZGVyIG9mZiB0aGUgd2lyZS4gSWYgdGhlIHNldCBzaXplIGlzIDAtMTQsIHRoZSBzaXplIHdpbGwKKyAgICAgICAgLy8vIGJlIHBhY2tlZCBpbnRvIHRoZSBlbGVtZW50IHR5cGUgaGVhZGVyLiBJZiBpdCdzIGEgbG9uZ2VyIHNldCwgdGhlIDQgTVNCCisgICAgICAgIC8vLyBvZiB0aGUgZWxlbWVudCB0eXBlIGhlYWRlciB3aWxsIGJlIDB4RiwgYW5kIGEgdmFyaW50IHdpbGwgZm9sbG93IHdpdGggdGhlCisgICAgICAgIC8vLyB0cnVlIHNpemUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBUU2V0IFJlYWRTZXRCZWdpbigpCiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiBuZXcgVFNldChSZWFkTGlzdEJlZ2luKCkpOwogICAgICAgICB9CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJlYWQgYSBib29sZWFuIG9mZiB0aGUgd2lyZS4gSWYgdGhpcyBpcyBhIGJvb2xlYW4gZmllbGQsIHRoZSB2YWx1ZSBzaG91bGQKLSAgICAgICAgICogYWxyZWFkeSBoYXZlIGJlZW4gUmVhZCBkdXJpbmcgUmVhZEZpZWxkQmVnaW4sIHNvIHdlJ2xsIGp1c3QgY29uc3VtZSB0aGUKLSAgICAgICAgICogcHJlLXN0b3JlZCB2YWx1ZS4gT3RoZXJ3aXNlLCBSZWFkIGEgYnl0ZS4KLSAgICAgICAgICovCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlYWQgYSBib29sZWFuIG9mZiB0aGUgd2lyZS4gSWYgdGhpcyBpcyBhIGJvb2xlYW4gZmllbGQsIHRoZSB2YWx1ZSBzaG91bGQKKyAgICAgICAgLy8vIGFscmVhZHkgaGF2ZSBiZWVuIFJlYWQgZHVyaW5nIFJlYWRGaWVsZEJlZ2luLCBzbyB3ZSdsbCBqdXN0IGNvbnN1bWUgdGhlCisgICAgICAgIC8vLyBwcmUtc3RvcmVkIHZhbHVlLiBPdGhlcndpc2UsIFJlYWQgYSBieXRlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQm9vbGVhbiBSZWFkQm9vbCgpCiAgICAgICAgIHsKICAgICAgICAgICAgIGlmIChib29sVmFsdWVfICE9IG51bGwpCkBAIC02MTgsNDIgKzYxNiw0MiBAQAogICAgICAgICB9CiAKICAgICAgICAgYnl0ZVtdIGJ5dGVSYXdCdWYgPSBuZXcgYnl0ZVsxXTsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJlYWQgYSBzaW5nbGUgYnl0ZSBvZmYgdGhlIHdpcmUuIE5vdGhpbmcgaW50ZXJlc3RpbmcgaGVyZS4KLSAgICAgICAgICovCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlYWQgYSBzaW5nbGUgYnl0ZSBvZmYgdGhlIHdpcmUuIE5vdGhpbmcgaW50ZXJlc3RpbmcgaGVyZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHVibGljIG92ZXJyaWRlIHNieXRlIFJlYWRCeXRlKCkKICAgICAgICAgewogICAgICAgICAgICAgdHJhbnMuUmVhZEFsbChieXRlUmF3QnVmLCAwLCAxKTsKICAgICAgICAgICAgIHJldHVybiAoc2J5dGUpYnl0ZVJhd0J1ZlswXTsKICAgICAgICAgfQogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZWFkIGFuIGkxNiBmcm9tIHRoZSB3aXJlIGFzIGEgemlnemFnIHZhcmludC4KLSAgICAgICAgICovCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlYWQgYW4gaTE2IGZyb20gdGhlIHdpcmUgYXMgYSB6aWd6YWcgdmFyaW50LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc2hvcnQgUmVhZEkxNigpCiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiAoc2hvcnQpemlnemFnVG9JbnQoUmVhZFZhcmludDMyKCkpOwogICAgICAgICB9CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJlYWQgYW4gaTMyIGZyb20gdGhlIHdpcmUgYXMgYSB6aWd6YWcgdmFyaW50LgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVhZCBhbiBpMzIgZnJvbSB0aGUgd2lyZSBhcyBhIHppZ3phZyB2YXJpbnQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgUmVhZEkzMigpCiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiB6aWd6YWdUb0ludChSZWFkVmFyaW50MzIoKSk7CiAgICAgICAgIH0KIAotICAgICAgICAvKioKLSAgICAgICAgICogUmVhZCBhbiBpNjQgZnJvbSB0aGUgd2lyZSBhcyBhIHppZ3phZyB2YXJpbnQuCi0gICAgICAgICAqLworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZWFkIGFuIGk2NCBmcm9tIHRoZSB3aXJlIGFzIGEgemlnemFnIHZhcmludC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHVibGljIG92ZXJyaWRlIGxvbmcgUmVhZEk2NCgpCiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiB6aWd6YWdUb0xvbmcoUmVhZFZhcmludDY0KCkpOwogICAgICAgICB9CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIE5vIG1hZ2ljIGhlcmUgLSBqdXN0IFJlYWQgYSBkb3VibGUgb2ZmIHRoZSB3aXJlLgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gTm8gbWFnaWMgaGVyZSAtIGp1c3QgUmVhZCBhIGRvdWJsZSBvZmYgdGhlIHdpcmUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBkb3VibGUgUmVhZERvdWJsZSgpCiAgICAgICAgIHsKICAgICAgICAgICAgIGJ5dGVbXSBsb25nQml0cyA9IG5ldyBieXRlWzhdOwpAQCAtNjYxLDEwICs2NTksMTAgQEAKICAgICAgICAgICAgIHJldHVybiBCaXRDb252ZXJ0ZXIuSW50NjRCaXRzVG9Eb3VibGUoYnl0ZXNUb0xvbmcobG9uZ0JpdHMpKTsKICAgICAgICAgfQogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZWFkcyBhIGJ5dGVbXSAodmlhIFJlYWRCaW5hcnkpLCBhbmQgdGhlbiBVVEYtOCBkZWNvZGVzIGl0LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIFN0cmluZyBSZWFkU3RyaW5nKCkKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVhZHMgYSBieXRlW10gKHZpYSBSZWFkQmluYXJ5KSwgYW5kIHRoZW4gVVRGLTggZGVjb2RlcyBpdC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBSZWFkU3RyaW5nKCkKICAgICAgICAgewogICAgICAgICAgICAgaW50IGxlbmd0aCA9IChpbnQpUmVhZFZhcmludDMyKCk7CiAKQEAgLTY3Niw5ICs2NzQsOSBAQAogICAgICAgICAgICAgcmV0dXJuIEVuY29kaW5nLlVURjguR2V0U3RyaW5nKFJlYWRCaW5hcnkobGVuZ3RoKSk7CiAgICAgICAgIH0KIAotICAgICAgICAvKioKLSAgICAgICAgICogUmVhZCBhIGJ5dGVbXSBmcm9tIHRoZSB3aXJlLgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVhZCBhIGJ5dGVbXSBmcm9tIHRoZSB3aXJlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYnl0ZVtdIFJlYWRCaW5hcnkoKQogICAgICAgICB7CiAgICAgICAgICAgICBpbnQgbGVuZ3RoID0gKGludClSZWFkVmFyaW50MzIoKTsKQEAgLTY4OSw5ICs2ODcsOSBAQAogICAgICAgICAgICAgcmV0dXJuIGJ1ZjsKICAgICAgICAgfQogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZWFkIGEgYnl0ZVtdIG9mIGEga25vd24gbGVuZ3RoIGZyb20gdGhlIHdpcmUuCi0gICAgICAgICAqLworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZWFkIGEgYnl0ZVtdIG9mIGEga25vd24gbGVuZ3RoIGZyb20gdGhlIHdpcmUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHByaXZhdGUgYnl0ZVtdIFJlYWRCaW5hcnkoaW50IGxlbmd0aCkKICAgICAgICAgewogICAgICAgICAgICAgaWYgKGxlbmd0aCA9PSAwKSByZXR1cm4gbmV3IGJ5dGVbMF07CkBAIC03MTUsMTAgKzcxMywxMCBAQAogICAgICAgICAvLyBJbnRlcm5hbCBSZWFkaW5nIG1ldGhvZHMKICAgICAgICAgLy8KIAotICAgICAgICAvKioKLSAgICAgICAgICogUmVhZCBhbiBpMzIgZnJvbSB0aGUgd2lyZSBhcyBhIHZhcmludC4gVGhlIE1TQiBvZiBlYWNoIGJ5dGUgaXMgc2V0Ci0gICAgICAgICAqIGlmIHRoZXJlIGlzIGFub3RoZXIgYnl0ZSB0byBmb2xsb3cuIFRoaXMgY2FuIFJlYWQgdXAgdG8gNSBieXRlcy4KLSAgICAgICAgICovCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlYWQgYW4gaTMyIGZyb20gdGhlIHdpcmUgYXMgYSB2YXJpbnQuIFRoZSBNU0Igb2YgZWFjaCBieXRlIGlzIHNldAorICAgICAgICAvLy8gaWYgdGhlcmUgaXMgYW5vdGhlciBieXRlIHRvIGZvbGxvdy4gVGhpcyBjYW4gUmVhZCB1cCB0byA1IGJ5dGVzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwcml2YXRlIHVpbnQgUmVhZFZhcmludDMyKCkKICAgICAgICAgewogICAgICAgICAgICAgdWludCByZXN1bHQgPSAwOwpAQCAtNzMzLDEwICs3MzEsMTAgQEAKICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgIH0KIAotICAgICAgICAvKioKLSAgICAgICAgICogUmVhZCBhbiBpNjQgZnJvbSB0aGUgd2lyZSBhcyBhIHByb3BlciB2YXJpbnQuIFRoZSBNU0Igb2YgZWFjaCBieXRlIGlzIHNldAotICAgICAgICAgKiBpZiB0aGVyZSBpcyBhbm90aGVyIGJ5dGUgdG8gZm9sbG93LiBUaGlzIGNhbiBSZWFkIHVwIHRvIDEwIGJ5dGVzLgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVhZCBhbiBpNjQgZnJvbSB0aGUgd2lyZSBhcyBhIHByb3BlciB2YXJpbnQuIFRoZSBNU0Igb2YgZWFjaCBieXRlIGlzIHNldAorICAgICAgICAvLy8gaWYgdGhlcmUgaXMgYW5vdGhlciBieXRlIHRvIGZvbGxvdy4gVGhpcyBjYW4gUmVhZCB1cCB0byAxMCBieXRlcy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHJpdmF0ZSB1bG9uZyBSZWFkVmFyaW50NjQoKQogICAgICAgICB7CiAgICAgICAgICAgICBpbnQgc2hpZnQgPSAwOwpAQCAtNzU4LDI3ICs3NTYsMjcgQEAKICAgICAgICAgLy8gZW5jb2RpbmcgaGVscGVycwogICAgICAgICAvLwogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDb252ZXJ0IGZyb20gemlnemFnIGludCB0byBpbnQuCi0gICAgICAgICAqLworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb252ZXJ0IGZyb20gemlnemFnIGludCB0byBpbnQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHByaXZhdGUgaW50IHppZ3phZ1RvSW50KHVpbnQgbikKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIChpbnQpKG4gPj4gMSkgXiAoLShpbnQpKG4gJiAxKSk7CiAgICAgICAgIH0KIAotICAgICAgICAvKioKLSAgICAgICAgICogQ29udmVydCBmcm9tIHppZ3phZyBsb25nIHRvIGxvbmcuCi0gICAgICAgICAqLworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb252ZXJ0IGZyb20gemlnemFnIGxvbmcgdG8gbG9uZy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHJpdmF0ZSBsb25nIHppZ3phZ1RvTG9uZyh1bG9uZyBuKQogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gKGxvbmcpKG4gPj4gMSkgXiAoLShsb25nKShuICYgMSkpOwogICAgICAgICB9CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIE5vdGUgdGhhdCBpdCdzIGltcG9ydGFudCB0aGF0IHRoZSBtYXNrIGJ5dGVzIGFyZSBsb25nIGxpdGVyYWxzLAotICAgICAgICAgKiBvdGhlcndpc2UgdGhleSdsbCBkZWZhdWx0IHRvIGludHMsIGFuZCB3aGVuIHlvdSBzaGlmdCBhbiBpbnQgbGVmdCA1NiBiaXRzLAotICAgICAgICAgKiB5b3UganVzdCBnZXQgYSBtZXNzZWQgdXAgaW50LgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gTm90ZSB0aGF0IGl0J3MgaW1wb3J0YW50IHRoYXQgdGhlIG1hc2sgYnl0ZXMgYXJlIGxvbmcgbGl0ZXJhbHMsCisgICAgICAgIC8vLyBvdGhlcndpc2UgdGhleSdsbCBkZWZhdWx0IHRvIGludHMsIGFuZCB3aGVuIHlvdSBzaGlmdCBhbiBpbnQgbGVmdCA1NiBiaXRzLAorICAgICAgICAvLy8geW91IGp1c3QgZ2V0IGEgbWVzc2VkIHVwIGludC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHJpdmF0ZSBsb25nIGJ5dGVzVG9Mb25nKGJ5dGVbXSBieXRlcykKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuCkBAIC04MDIsMTAgKzgwMCwxMCBAQAogICAgICAgICAgICAgcmV0dXJuIGxvd2VyTmliYmxlID09IFR5cGVzLkJPT0xFQU5fVFJVRSB8fCBsb3dlck5pYmJsZSA9PSBUeXBlcy5CT09MRUFOX0ZBTFNFOwogICAgICAgICB9CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdpdmVuIGEgVENvbXBhY3RQcm90b2NvbC5UeXBlcyBjb25zdGFudCwgY29udmVydCBpdCB0byBpdHMgY29ycmVzcG9uZGluZwotICAgICAgICAgKiBUVHlwZSB2YWx1ZS4KLSAgICAgICAgICovCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEdpdmVuIGEgVENvbXBhY3RQcm90b2NvbC5UeXBlcyBjb25zdGFudCwgY29udmVydCBpdCB0byBpdHMgY29ycmVzcG9uZGluZworICAgICAgICAvLy8gVFR5cGUgdmFsdWUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHByaXZhdGUgVFR5cGUgZ2V0VFR5cGUoYnl0ZSB0eXBlKQogICAgICAgICB7CiAgICAgICAgICAgICBzd2l0Y2ggKChieXRlKSh0eXBlICYgMHgwZikpCkBAIC04NDAsOSArODM4LDkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHaXZlbiBhIFRUeXBlIHZhbHVlLCBmaW5kIHRoZSBhcHByb3ByaWF0ZSBUQ29tcGFjdFByb3RvY29sLlR5cGVzIGNvbnN0YW50LgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gR2l2ZW4gYSBUVHlwZSB2YWx1ZSwgZmluZCB0aGUgYXBwcm9wcmlhdGUgVENvbXBhY3RQcm90b2NvbC5UeXBlcyBjb25zdGFudC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHJpdmF0ZSBieXRlIGdldENvbXBhY3RUeXBlKFRUeXBlIHR0eXBlKQogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gdHR5cGVUb0NvbXBhY3RUeXBlWyhpbnQpdHR5cGVdOwpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVEpTT05Qcm90b2NvbC5jcyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RKU09OUHJvdG9jb2wuY3MKaW5kZXggMmU4ZDk5Zi4uOWRiZGVhOSAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVEpTT05Qcm90b2NvbC5jcworKysgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9USlNPTlByb3RvY29sLmNzCkBAIC0yOSwxOCArMjksMTggQEAKIHsKICAgICAvLy8gPHN1bW1hcnk+CiAgICAgLy8vIEpTT04gcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gZm9yIHRocmlmdC4KLSAgICAvLy8KKyAgICAvLy8gPHBhcmEvPgogICAgIC8vLyBUaGlzIGlzIGEgZnVsbC1mZWF0dXJlZCBwcm90b2NvbCBzdXBwb3J0aW5nIFdyaXRlIGFuZCBSZWFkLgotICAgIC8vLworICAgIC8vLyA8cGFyYS8+CiAgICAgLy8vIFBsZWFzZSBzZWUgdGhlIEMrKyBjbGFzcyBoZWFkZXIgZm9yIGEgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgdGhlCiAgICAgLy8vIHByb3RvY29sJ3Mgd2lyZSBmb3JtYXQuCi0gICAgLy8vCisgICAgLy8vIDxwYXJhLz4KICAgICAvLy8gQWRhcHRlZCBmcm9tIHRoZSBKYXZhIHZlcnNpb24uCiAgICAgLy8vIDwvc3VtbWFyeT4KICAgICBwdWJsaWMgY2xhc3MgVEpTT05Qcm90b2NvbCA6IFRQcm90b2NvbAogICAgIHsKICAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gRmFjdG9yeSBmb3IgSlNPTiBwcm90b2NvbCBvYmplY3RzCisgICAgICAgIC8vLyBGYWN0b3J5IGZvciBKU09OIHByb3RvY29sIG9iamVjdHMuCiAgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHB1YmxpYyBjbGFzcyBGYWN0b3J5IDogVFByb3RvY29sRmFjdG9yeQogICAgICAgICB7CkBAIC0xNzksMTEgKzE3OSwxMSBAQAogICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgfQogCi0gICAgICAgIC8vLzxzdW1tYXJ5PgorICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgIC8vLyBCYXNlIGNsYXNzIGZvciB0cmFja2luZyBKU09OIGNvbnRleHRzIHRoYXQgbWF5IHJlcXVpcmUKICAgICAgICAgLy8vIGluc2VydGluZy9SZWFkaW5nIGFkZGl0aW9uYWwgSlNPTiBzeW50YXggY2hhcmFjdGVycwogICAgICAgICAvLy8gVGhpcyBiYXNlIGNvbnRleHQgZG9lcyBub3RoaW5nLgotICAgICAgICAvLy88L3N1bW1hcnk+CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHByb3RlY3RlZCBjbGFzcyBKU09OQmFzZUNvbnRleHQKICAgICAgICAgewogICAgICAgICAgICAgcHJvdGVjdGVkIFRKU09OUHJvdG9jb2wgcHJvdG87CkBAIC0yMDAsMTAgKzIwMCwxMCBAQAogICAgICAgICAgICAgcHVibGljIHZpcnR1YWwgYm9vbCBFc2NhcGVOdW1iZXJzKCkgeyByZXR1cm4gZmFsc2U7IH0KICAgICAgICAgfQogCi0gICAgICAgIC8vLzxzdW1tYXJ5PgorICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgIC8vLyBDb250ZXh0IGZvciBKU09OIGxpc3RzLiBXaWxsIGluc2VydC9SZWFkIGNvbW1hcyBiZWZvcmUgZWFjaCBpdGVtIGV4Y2VwdAogICAgICAgICAvLy8gZm9yIHRoZSBmaXJzdCBvbmUKLSAgICAgICAgLy8vPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwcm90ZWN0ZWQgY2xhc3MgSlNPTkxpc3RDb250ZXh0IDogSlNPTkJhc2VDb250ZXh0CiAgICAgICAgIHsKICAgICAgICAgICAgIHB1YmxpYyBKU09OTGlzdENvbnRleHQoVEpTT05Qcm90b2NvbCBwcm90b2NvbCkKQEAgLTIzOSwxMiArMjM5LDEyIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICAvLy88c3VtbWFyeT4KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgICAvLy8gQ29udGV4dCBmb3IgSlNPTiByZWNvcmRzLiBXaWxsIGluc2VydC9SZWFkIGNvbG9ucyBiZWZvcmUgdGhlIHZhbHVlIHBvcnRpb24KICAgICAgICAgLy8vIG9mIGVhY2ggcmVjb3JkIHBhaXIsIGFuZCBjb21tYXMgYmVmb3JlIGVhY2gga2V5IGV4Y2VwdCB0aGUgZmlyc3QuIEluCiAgICAgICAgIC8vLyBhZGRpdGlvbiwgd2lsbCBpbmRpY2F0ZSB0aGF0IG51bWJlcnMgaW4gdGhlIGtleSBwb3NpdGlvbiBuZWVkIHRvIGJlCiAgICAgICAgIC8vLyBlc2NhcGVkIGluIHF1b3RlcyAoc2luY2UgSlNPTiBrZXlzIG11c3QgYmUgc3RyaW5ncykuCi0gICAgICAgIC8vLzwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHJvdGVjdGVkIGNsYXNzIEpTT05QYWlyQ29udGV4dCA6IEpTT05CYXNlQ29udGV4dAogICAgICAgICB7CiAgICAgICAgICAgICBwdWJsaWMgSlNPTlBhaXJDb250ZXh0KFRKU09OUHJvdG9jb2wgcHJvdG8pCkBAIC0yOTAsOSArMjkwLDkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIC8vLzxzdW1tYXJ5PgorICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgIC8vLyBIb2xkcyB1cCB0byBvbmUgYnl0ZSBmcm9tIHRoZSB0cmFuc3BvcnQKLSAgICAgICAgLy8vPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwcm90ZWN0ZWQgY2xhc3MgTG9va2FoZWFkUmVhZGVyCiAgICAgICAgIHsKICAgICAgICAgICAgIHByb3RlY3RlZCBUSlNPTlByb3RvY29sIHByb3RvOwpAQCAtMzA1LDEwICszMDUsMTAgQEAKICAgICAgICAgICAgIHByaXZhdGUgYm9vbCBoYXNEYXRhOwogICAgICAgICAgICAgcHJpdmF0ZSBieXRlW10gZGF0YSA9IG5ldyBieXRlWzFdOwogCi0gICAgICAgICAgICAvLy88c3VtbWFyeT4KKyAgICAgICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAgICAgIC8vLyBSZXR1cm4gYW5kIGNvbnN1bWUgdGhlIG5leHQgYnl0ZSB0byBiZSBSZWFkLCBlaXRoZXIgdGFraW5nIGl0IGZyb20gdGhlCiAgICAgICAgICAgICAvLy8gZGF0YSBidWZmZXIgaWYgcHJlc2VudCBvciBnZXR0aW5nIGl0IGZyb20gdGhlIHRyYW5zcG9ydCBvdGhlcndpc2UuCi0gICAgICAgICAgICAvLy88L3N1bW1hcnk+CisgICAgICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICAgICAgcHVibGljIGJ5dGUgUmVhZCgpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYgKGhhc0RhdGEpCkBAIC0zMjIsMTAgKzMyMiwxMCBAQAogICAgICAgICAgICAgICAgIHJldHVybiBkYXRhWzBdOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAvLy88c3VtbWFyeT4KKyAgICAgICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAgICAgIC8vLyBSZXR1cm4gdGhlIG5leHQgYnl0ZSB0byBiZSBSZWFkIHdpdGhvdXQgY29uc3VtaW5nLCBmaWxsaW5nIHRoZSBkYXRhCiAgICAgICAgICAgICAvLy8gYnVmZmVyIGlmIGl0IGhhcyBub3QgYmVlbiBmaWxsZWQgYWxSZWFkeS4KLSAgICAgICAgICAgIC8vLzwvc3VtbWFyeT4KKyAgICAgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgICAgICBwdWJsaWMgYnl0ZSBQZWVrKCkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpZiAoIWhhc0RhdGEpCkBAIC0zNDksMjYgKzM0OSwyNiBAQAogICAgICAgICAvLyBSZWFkZXIgdGhhdCBtYW5hZ2VzIGEgMS1ieXRlIGJ1ZmZlcgogICAgICAgICBwcm90ZWN0ZWQgTG9va2FoZWFkUmVhZGVyIHJlYWRlcjsKIAotICAgICAgICAvLy88c3VtbWFyeT4KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgICAvLy8gUHVzaCBhIG5ldyBKU09OIGNvbnRleHQgb250byB0aGUgc3RhY2suCi0gICAgICAgIC8vLzwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHJvdGVjdGVkIHZvaWQgUHVzaENvbnRleHQoSlNPTkJhc2VDb250ZXh0IGMpCiAgICAgICAgIHsKICAgICAgICAgICAgIGNvbnRleHRTdGFjay5QdXNoKGNvbnRleHQpOwogICAgICAgICAgICAgY29udGV4dCA9IGM7CiAgICAgICAgIH0KIAotICAgICAgICAvLy88c3VtbWFyeT4KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgICAvLy8gUG9wIHRoZSBsYXN0IEpTT04gY29udGV4dCBvZmYgdGhlIHN0YWNrCi0gICAgICAgIC8vLzwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHJvdGVjdGVkIHZvaWQgUG9wQ29udGV4dCgpCiAgICAgICAgIHsKICAgICAgICAgICAgIGNvbnRleHQgPSBjb250ZXh0U3RhY2suUG9wKCk7CiAgICAgICAgIH0KIAotICAgICAgICAvLy88c3VtbWFyeT4KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgICAvLy8gVEpTT05Qcm90b2NvbCBDb25zdHJ1Y3RvcgotICAgICAgICAvLy88L3N1bW1hcnk+CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHB1YmxpYyBUSlNPTlByb3RvY29sKFRUcmFuc3BvcnQgdHJhbnMpCiAgICAgICAgICAgICA6IGJhc2UodHJhbnMpCiAgICAgICAgIHsKQEAgLTM3OSwxMSArMzc5LDExIEBACiAgICAgICAgIC8vIFRlbXBvcmFyeSBidWZmZXIgdXNlZCBieSBzZXZlcmFsIG1ldGhvZHMKICAgICAgICAgcHJpdmF0ZSBieXRlW10gdGVtcEJ1ZmZlciA9IG5ldyBieXRlWzRdOwogCi0gICAgICAgIC8vLzxzdW1tYXJ5PgorICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgIC8vLyBSZWFkIGEgYnl0ZSB0aGF0IG11c3QgbWF0Y2ggYlswXTsgb3RoZXJ3aXNlIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24uCiAgICAgICAgIC8vLyBNYXJrZWQgcHJvdGVjdGVkIHRvIGF2b2lkIHN5bnRoZXRpYyBhY2Nlc3NvciBpbiBKU09OTGlzdENvbnRleHQuUmVhZAogICAgICAgICAvLy8gYW5kIEpTT05QYWlyQ29udGV4dC5SZWFkCi0gICAgICAgIC8vLzwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHJvdGVjdGVkIHZvaWQgUmVhZEpTT05TeW50YXhDaGFyKGJ5dGVbXSBiKQogICAgICAgICB7CiAgICAgICAgICAgICBieXRlIGNoID0gcmVhZGVyLlJlYWQoKTsKQEAgLTM5NCwxMCArMzk0LDEwIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICAvLy88c3VtbWFyeT4KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgICAvLy8gQ29udmVydCBhIGJ5dGUgY29udGFpbmluZyBhIGhleCBjaGFyICgnMCctJzknIG9yICdhJy0nZicpIGludG8gaXRzCiAgICAgICAgIC8vLyBjb3JyZXNwb25kaW5nIGhleCB2YWx1ZQotICAgICAgICAvLy88L3N1bW1hcnk+CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHByaXZhdGUgc3RhdGljIGJ5dGUgSGV4VmFsKGJ5dGUgY2gpCiAgICAgICAgIHsKICAgICAgICAgICAgIGlmICgoY2ggPj0gJzAnKSAmJiAoY2ggPD0gJzknKSkKQEAgLTQxNiw5ICs0MTYsOSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgLy8vPHN1bW1hcnk+CisgICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAgLy8vIENvbnZlcnQgYSBieXRlIGNvbnRhaW5pbmcgYSBoZXggdmFsdWUgdG8gaXRzIGNvcnJlc3BvbmRpbmcgaGV4IGNoYXJhY3RlcgotICAgICAgICAvLy88L3N1bW1hcnk+CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHByaXZhdGUgc3RhdGljIGJ5dGUgSGV4Q2hhcihieXRlIHZhbCkKICAgICAgICAgewogICAgICAgICAgICAgdmFsICY9IDB4MEY7CkBAIC00MzMsOSArNDMzLDkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIC8vLzxzdW1tYXJ5PgorICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgIC8vLyBXcml0ZSB0aGUgYnl0ZXMgaW4gYXJyYXkgYnVmIGFzIGEgSlNPTiBjaGFyYWN0ZXJzLCBlc2NhcGluZyBhcyBuZWVkZWQKLSAgICAgICAgLy8vPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwcml2YXRlIHZvaWQgV3JpdGVKU09OU3RyaW5nKGJ5dGVbXSBiKQogICAgICAgICB7CiAgICAgICAgICAgICBjb250ZXh0LldyaXRlKCk7CkBAIC00NzksMTQgKzQ3OSwxNCBAQAogICAgICAgICAgICAgdHJhbnMuV3JpdGUoUVVPVEUpOwogICAgICAgICB9CiAKLSAgICAgICAgLy8vPHN1bW1hcnk+CisgICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAgLy8vIFdyaXRlIG91dCBudW1iZXIgYXMgYSBKU09OIHZhbHVlLiBJZiB0aGUgY29udGV4dCBkaWN0YXRlcyBzbywgaXQgd2lsbCBiZQogICAgICAgICAvLy8gd3JhcHBlZCBpbiBxdW90ZXMgdG8gb3V0cHV0IGFzIGEgSlNPTiBzdHJpbmcuCi0gICAgICAgIC8vLzwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHJpdmF0ZSB2b2lkIFdyaXRlSlNPTkludGVnZXIobG9uZyBudW0pCiAgICAgICAgIHsKICAgICAgICAgICAgIGNvbnRleHQuV3JpdGUoKTsKLSAgICAgICAgICAgIFN0cmluZyBzdHIgPSBudW0uVG9TdHJpbmcoKTsKKyAgICAgICAgICAgIHN0cmluZyBzdHIgPSBudW0uVG9TdHJpbmcoKTsKIAogICAgICAgICAgICAgYm9vbCBlc2NhcGVOdW0gPSBjb250ZXh0LkVzY2FwZU51bWJlcnMoKTsKICAgICAgICAgICAgIGlmIChlc2NhcGVOdW0pCkBAIC00OTgsMTQgKzQ5OCwxNCBAQAogICAgICAgICAgICAgICAgIHRyYW5zLldyaXRlKFFVT1RFKTsKICAgICAgICAgfQogCi0gICAgICAgIC8vLzxzdW1tYXJ5PgorICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgIC8vLyBXcml0ZSBvdXQgYSBkb3VibGUgYXMgYSBKU09OIHZhbHVlLiBJZiBpdCBpcyBOYU4gb3IgaW5maW5pdHkgb3IgaWYgdGhlCiAgICAgICAgIC8vLyBjb250ZXh0IGRpY3RhdGVzIGVzY2FwaW5nLCBXcml0ZSBvdXQgYXMgSlNPTiBzdHJpbmcuCi0gICAgICAgIC8vLzwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHJpdmF0ZSB2b2lkIFdyaXRlSlNPTkRvdWJsZShkb3VibGUgbnVtKQogICAgICAgICB7CiAgICAgICAgICAgICBjb250ZXh0LldyaXRlKCk7Ci0gICAgICAgICAgICBTdHJpbmcgc3RyID0gbnVtLlRvU3RyaW5nKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpOworICAgICAgICAgICAgc3RyaW5nIHN0ciA9IG51bS5Ub1N0cmluZygiRzE3IiwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7CiAgICAgICAgICAgICBib29sIHNwZWNpYWwgPSBmYWxzZTsKIAogICAgICAgICAgICAgc3dpdGNoIChzdHJbMF0pCkBAIC01MzIsMTAgKzUzMiwxMCBAQAogICAgICAgICAgICAgaWYgKGVzY2FwZU51bSkKICAgICAgICAgICAgICAgICB0cmFucy5Xcml0ZShRVU9URSk7CiAgICAgICAgIH0KLSAgICAgICAgLy8vPHN1bW1hcnk+CisgICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAgLy8vIFdyaXRlIG91dCBjb250ZW50cyBvZiBieXRlIGFycmF5IGIgYXMgYSBKU09OIHN0cmluZyB3aXRoIGJhc2UtNjQgZW5jb2RlZAogICAgICAgICAvLy8gZGF0YQotICAgICAgICAvLy88L3N1bW1hcnk+CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHByaXZhdGUgdm9pZCBXcml0ZUpTT05CYXNlNjQoYnl0ZVtdIGIpCiAgICAgICAgIHsKICAgICAgICAgICAgIGNvbnRleHQuV3JpdGUoKTsKQEAgLTY5OCw3ICs2OTgsNyBAQAogICAgICAgICAgICAgV3JpdGVKU09ORG91YmxlKGR1Yik7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVN0cmluZyhTdHJpbmcgc3RyKQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVN0cmluZyhzdHJpbmcgc3RyKQogICAgICAgICB7CiAgICAgICAgICAgICBieXRlW10gYiA9IHV0ZjhFbmNvZGluZy5HZXRCeXRlcyhzdHIpOwogICAgICAgICAgICAgV3JpdGVKU09OU3RyaW5nKGIpOwpAQCAtNzEzLDEzICs3MTMsMTQgQEAKICAgICAgICAgICogUmVhZGluZyBtZXRob2RzLgogICAgICAgICAgKi8KIAotICAgICAgICAvLy88c3VtbWFyeT4KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgICAvLy8gUmVhZCBpbiBhIEpTT04gc3RyaW5nLCB1bmVzY2FwaW5nIGFzIGFwcHJvcHJpYXRlLi4gU2tpcCBSZWFkaW5nIGZyb20gdGhlCiAgICAgICAgIC8vLyBjb250ZXh0IGlmIHNraXBDb250ZXh0IGlzIHRydWUuCi0gICAgICAgIC8vLzwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHJpdmF0ZSBieXRlW10gUmVhZEpTT05TdHJpbmcoYm9vbCBza2lwQ29udGV4dCkKICAgICAgICAgewogICAgICAgICAgICAgTWVtb3J5U3RyZWFtIGJ1ZmZlciA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKKyAgICAgICAgICAgIExpc3Q8Y2hhcj4gY29kZXVuaXRzID0gbmV3IExpc3Q8Y2hhcj4oKTsKIAogCiAgICAgICAgICAgICBpZiAoIXNraXBDb250ZXh0KQpAQCAtNzY0LDE1ICs3NjUsNDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSGV4VmFsKChieXRlKXRlbXBCdWZmZXJbMV0pIDw8IDgpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSGV4VmFsKChieXRlKXRlbXBCdWZmZXJbMl0pIDw8IDQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGV4VmFsKHRlbXBCdWZmZXJbM10pKTsKLSAgICAgICAgICAgICAgICB2YXIgdG1wID0gdXRmOEVuY29kaW5nLkdldEJ5dGVzKG5ldyBjaGFyW10geyAoY2hhcil3Y2ggfSk7Ci0gICAgICAgICAgICAgICAgYnVmZmVyLldyaXRlKHRtcCwgMCwgdG1wLkxlbmd0aCk7CisgICAgICAgICAgICAgICAgaWYgKENoYXIuSXNIaWdoU3Vycm9nYXRlKChjaGFyKXdjaCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoY29kZXVuaXRzLkNvdW50ID4gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgbG93IHN1cnJvZ2F0ZSBjaGFyIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY29kZXVuaXRzLkFkZCgoY2hhcil3Y2gpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChDaGFyLklzTG93U3Vycm9nYXRlKChjaGFyKXdjaCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoY29kZXVuaXRzLkNvdW50ID09IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGhpZ2ggc3Vycm9nYXRlIGNoYXIiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjb2RldW5pdHMuQWRkKChjaGFyKXdjaCk7CisgICAgICAgICAgICAgICAgICAgIHZhciB0bXAgPSB1dGY4RW5jb2RpbmcuR2V0Qnl0ZXMoY29kZXVuaXRzLlRvQXJyYXkoKSk7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5Xcml0ZSh0bXAsIDAsIHRtcC5MZW5ndGgpOworICAgICAgICAgICAgICAgICAgICBjb2RldW5pdHMuQ2xlYXIoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHRtcCA9IHV0ZjhFbmNvZGluZy5HZXRCeXRlcyhuZXcgY2hhcltdIHsgKGNoYXIpd2NoIH0pOworICAgICAgICAgICAgICAgICAgICBidWZmZXIuV3JpdGUodG1wLCAwLCB0bXAuTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgaWYgKGNvZGV1bml0cy5Db3VudCA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGxvdyBzdXJyb2dhdGUgY2hhciIpOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICByZXR1cm4gYnVmZmVyLlRvQXJyYXkoKTsKICAgICAgICAgfQogCi0gICAgICAgIC8vLzxzdW1tYXJ5PgorICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gYnl0ZSBjb3VsZCBiZSBhIHZhbGlkIHBhcnQgb2YgYSBKU09OIG51bWJlci4KLSAgICAgICAgLy8vPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwcml2YXRlIGJvb2wgSXNKU09OTnVtZXJpYyhieXRlIGIpCiAgICAgICAgIHsKICAgICAgICAgICAgIHN3aXRjaCAoYikKQEAgLTc5NywxMSArODMwLDExIEBACiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KIAotICAgICAgICAvLy88c3VtbWFyeT4KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgICAvLy8gUmVhZCBpbiBhIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgdGhhdCBhcmUgYWxsIHZhbGlkIGluIEpTT04gbnVtYmVycy4gRG9lcwogICAgICAgICAvLy8gbm90IGRvIGEgY29tcGxldGUgcmVnZXggY2hlY2sgdG8gdmFsaWRhdGUgdGhhdCB0aGlzIGlzIGFjdHVhbGx5IGEgbnVtYmVyLgotICAgICAgICAvLy8vPC9zdW1tYXJ5PgotICAgICAgICBwcml2YXRlIFN0cmluZyBSZWFkSlNPTk51bWVyaWNDaGFycygpCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgc3RyaW5nIFJlYWRKU09OTnVtZXJpY0NoYXJzKCkKICAgICAgICAgewogICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzdHJibGQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogICAgICAgICAgICAgd2hpbGUgKHRydWUpCkBAIC04MTYsOSArODQ5LDkgQEAKICAgICAgICAgICAgIHJldHVybiBzdHJibGQuVG9TdHJpbmcoKTsKICAgICAgICAgfQogCi0gICAgICAgIC8vLzxzdW1tYXJ5PgorICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgIC8vLyBSZWFkIGluIGEgSlNPTiBudW1iZXIuIElmIHRoZSBjb250ZXh0IGRpY3RhdGVzLCBSZWFkIGluIGVuY2xvc2luZyBxdW90ZXMuCi0gICAgICAgIC8vLzwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHJpdmF0ZSBsb25nIFJlYWRKU09OSW50ZWdlcigpCiAgICAgICAgIHsKICAgICAgICAgICAgIGNvbnRleHQuUmVhZCgpOwpAQCAtODI2LDM2ICs4NTksMzcgQEAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBSZWFkSlNPTlN5bnRheENoYXIoUVVPVEUpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgU3RyaW5nIHN0ciA9IFJlYWRKU09OTnVtZXJpY0NoYXJzKCk7CisKKyAgICAgICAgICAgIHN0cmluZyBzdHIgPSBSZWFkSlNPTk51bWVyaWNDaGFycygpOwogICAgICAgICAgICAgaWYgKGNvbnRleHQuRXNjYXBlTnVtYmVycygpKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIFJlYWRKU09OU3ludGF4Q2hhcihRVU9URSk7CiAgICAgICAgICAgICB9CisKICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHJldHVybiBJbnQ2NC5QYXJzZShzdHIpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEZvcm1hdEV4Y2VwdGlvbikKKyAgICAgICAgICAgIGNhdGNoIChGb3JtYXRFeGNlcHRpb24gZmV4KQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCYWQgZGF0YSBlbmNvdW50ZWQgaW4gbnVtZXJpYyBkYXRhIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmFkIGRhdGEgZW5jb3VudGVkIGluIG51bWVyaWMgZGF0YSIsIGZleCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICAvLy88c3VtbWFyeT4KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgICAvLy8gUmVhZCBpbiBhIEpTT04gZG91YmxlIHZhbHVlLiBUaHJvdyBpZiB0aGUgdmFsdWUgaXMgbm90IHdyYXBwZWQgaW4gcXVvdGVzCiAgICAgICAgIC8vLyB3aGVuIGV4cGVjdGVkIG9yIGlmIHdyYXBwZWQgaW4gcXVvdGVzIHdoZW4gbm90IGV4cGVjdGVkLgotICAgICAgICAvLy88L3N1bW1hcnk+CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHByaXZhdGUgZG91YmxlIFJlYWRKU09ORG91YmxlKCkKICAgICAgICAgewogICAgICAgICAgICAgY29udGV4dC5SZWFkKCk7CiAgICAgICAgICAgICBpZiAocmVhZGVyLlBlZWsoKSA9PSBRVU9URVswXSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBieXRlW10gYXJyID0gUmVhZEpTT05TdHJpbmcodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgZG91YmxlIGR1YiA9IERvdWJsZS5QYXJzZSh1dGY4RW5jb2RpbmcuR2V0U3RyaW5nKGFyciwwLGFyci5MZW5ndGgpLCBDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKTsKKyAgICAgICAgICAgICAgICBkb3VibGUgZHViID0gRG91YmxlLlBhcnNlKHV0ZjhFbmNvZGluZy5HZXRTdHJpbmcoYXJyLCAwLCBhcnIuTGVuZ3RoKSwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7CiAKLSAgICAgICAgICAgICAgICBpZiAoIWNvbnRleHQuRXNjYXBlTnVtYmVycygpICYmICFEb3VibGUuSXNOYU4oZHViKSAmJgotICAgICAgICAgICAgICAgICAgICAhRG91YmxlLklzSW5maW5pdHkoZHViKSkKKyAgICAgICAgICAgICAgICBpZiAoIWNvbnRleHQuRXNjYXBlTnVtYmVycygpICYmICFEb3VibGUuSXNOYU4oZHViKSAmJiAhRG91YmxlLklzSW5maW5pdHkoZHViKSkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIC8vIFRocm93IGV4Y2VwdGlvbiAtLSB3ZSBzaG91bGQgbm90IGJlIGluIGEgc3RyaW5nIGluIHRoaXMgY2FzZQogICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCkBAIC04NzQsMTcgKzkwOCwxNyBAQAogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERvdWJsZS5QYXJzZShSZWFkSlNPTk51bWVyaWNDaGFycygpLCBDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKEZvcm1hdEV4Y2VwdGlvbikKKyAgICAgICAgICAgICAgICBjYXRjaCAoRm9ybWF0RXhjZXB0aW9uIGZleCkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmFkIGRhdGEgZW5jb3VudGVkIGluIG51bWVyaWMgZGF0YSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCYWQgZGF0YSBlbmNvdW50ZWQgaW4gbnVtZXJpYyBkYXRhIiwgZmV4KTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICAvLzxzdW1tYXJ5PgorICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgIC8vLyBSZWFkIGluIGEgSlNPTiBzdHJpbmcgY29udGFpbmluZyBiYXNlLTY0IGVuY29kZWQgZGF0YSBhbmQgZGVjb2RlIGl0LgotICAgICAgICAvLy88L3N1bW1hcnk+CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHByaXZhdGUgYnl0ZVtdIFJlYWRKU09OQmFzZTY0KCkKICAgICAgICAgewogICAgICAgICAgICAgYnl0ZVtdIGIgPSBSZWFkSlNPTlN0cmluZyhmYWxzZSk7CkBAIC05NTYsNyArOTkwLDcgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgdmFyIGJ1ZiA9IFJlYWRKU09OU3RyaW5nKGZhbHNlKTsKLSAgICAgICAgICAgIG1lc3NhZ2UuTmFtZSA9IHV0ZjhFbmNvZGluZy5HZXRTdHJpbmcoYnVmLDAsYnVmLkxlbmd0aCk7CisgICAgICAgICAgICBtZXNzYWdlLk5hbWUgPSB1dGY4RW5jb2RpbmcuR2V0U3RyaW5nKGJ1ZiwgMCwgYnVmLkxlbmd0aCk7CiAgICAgICAgICAgICBtZXNzYWdlLlR5cGUgPSAoVE1lc3NhZ2VUeXBlKVJlYWRKU09OSW50ZWdlcigpOwogICAgICAgICAgICAgbWVzc2FnZS5TZXFJRCA9IChpbnQpUmVhZEpTT05JbnRlZ2VyKCk7CiAgICAgICAgICAgICByZXR1cm4gbWVzc2FnZTsKQEAgLTEwNzUsMTAgKzExMDksMTAgQEAKICAgICAgICAgICAgIHJldHVybiBSZWFkSlNPTkRvdWJsZSgpOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIG92ZXJyaWRlIFN0cmluZyBSZWFkU3RyaW5nKCkKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBSZWFkU3RyaW5nKCkKICAgICAgICAgewogICAgICAgICAgICAgdmFyIGJ1ZiA9IFJlYWRKU09OU3RyaW5nKGZhbHNlKTsKLSAgICAgICAgICAgIHJldHVybiB1dGY4RW5jb2RpbmcuR2V0U3RyaW5nKGJ1ZiwwLGJ1Zi5MZW5ndGgpOworICAgICAgICAgICAgcmV0dXJuIHV0ZjhFbmNvZGluZy5HZXRTdHJpbmcoYnVmLCAwLCBidWYuTGVuZ3RoKTsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBieXRlW10gUmVhZEJpbmFyeSgpCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IuY3MgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IuY3MKaW5kZXggMDUwYjE2Mi4uYWE5MWM1MiAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVE11bHRpcGxleGVkUHJvY2Vzc29yLmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RNdWx0aXBsZXhlZFByb2Nlc3Nvci5jcwpAQCAtMjksNzQgKzI5LDc3IEBACiAKIG5hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2wKIHsKLQotICAgIC8qKgotICAgICAqIFRNdWx0aXBsZXhlZFByb2Nlc3NvciBpcyBhIFRQcm9jZXNzb3IgYWxsb3dpbmcgYSBzaW5nbGUgVFNlcnZlciB0byBwcm92aWRlIG11bHRpcGxlIHNlcnZpY2VzLgotICAgICAqIFRvIGRvIHNvLCB5b3UgaW5zdGFudGlhdGUgdGhlIHByb2Nlc3NvciBhbmQgdGhlbiByZWdpc3RlciBhZGRpdGlvbmFsIHByb2Nlc3NvcnMgd2l0aCBpdCwKLSAgICAgKiBhcyBzaG93biBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGU6Ci0gICAgICoKLSAgICAgKiAgICAgVE11bHRpcGxleGVkUHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IoKTsKLSAgICAgKgotICAgICAqICAgICBwcm9jZXNzb3IucmVnaXN0ZXJQcm9jZXNzb3IoCi0gICAgICogICAgICAgICAiQ2FsY3VsYXRvciIsCi0gICAgICogICAgICAgICBuZXcgQ2FsY3VsYXRvci5Qcm9jZXNzb3IobmV3IENhbGN1bGF0b3JIYW5kbGVyKCkpKTsKLSAgICAgKgotICAgICAqICAgICBwcm9jZXNzb3IucmVnaXN0ZXJQcm9jZXNzb3IoCi0gICAgICogICAgICAgICAiV2VhdGhlclJlcG9ydCIsCi0gICAgICogICAgICAgICBuZXcgV2VhdGhlclJlcG9ydC5Qcm9jZXNzb3IobmV3IFdlYXRoZXJSZXBvcnRIYW5kbGVyKCkpKTsKLSAgICAgKgotICAgICAqICAgICBUU2VydmVyVHJhbnNwb3J0IHQgPSBuZXcgVFNlcnZlclNvY2tldCg5MDkwKTsKLSAgICAgKiAgICAgVFNpbXBsZVNlcnZlciBzZXJ2ZXIgPSBuZXcgVFNpbXBsZVNlcnZlcihwcm9jZXNzb3IsIHQpOwotICAgICAqCi0gICAgICogICAgIHNlcnZlci5zZXJ2ZSgpOwotICAgICAqLworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gPHNlZSBjcmVmPSJUTXVsdGlwbGV4ZWRQcm9jZXNzb3IiLz4gaXMgYSA8c2VlIGNyZWY9IlRQcm9jZXNzb3IiLz4gYWxsb3dpbmcgYSBzaW5nbGUgPHNlZSBjcmVmPSJUaHJpZnQuU2VydmVyLlRTZXJ2ZXIiLz4KKyAgICAvLy8gdG8gcHJvdmlkZSBtdWx0aXBsZSBzZXJ2aWNlcy4KKyAgICAvLy8gPHBhcmEvPgorICAgIC8vLyBUbyBkbyBzbywgeW91IGluc3RhbnRpYXRlIHRoZSBwcm9jZXNzb3IgYW5kIHRoZW4gcmVnaXN0ZXIgYWRkaXRpb25hbCBwcm9jZXNzb3JzIHdpdGggaXQsCisgICAgLy8vIGFzIHNob3duIGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZToKKyAgICAvLy8gPHBhcmEvPgorICAgIC8vLyA8Y29kZT4KKyAgICAvLy8gICAgIFRNdWx0aXBsZXhlZFByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgVE11bHRpcGxleGVkUHJvY2Vzc29yKCk7CisgICAgLy8vCisgICAgLy8vICAgICBwcm9jZXNzb3IucmVnaXN0ZXJQcm9jZXNzb3IoCisgICAgLy8vICAgICAgICAgIkNhbGN1bGF0b3IiLAorICAgIC8vLyAgICAgICAgIG5ldyBDYWxjdWxhdG9yLlByb2Nlc3NvcihuZXcgQ2FsY3VsYXRvckhhbmRsZXIoKSkpOworICAgIC8vLworICAgIC8vLyAgICAgcHJvY2Vzc29yLnJlZ2lzdGVyUHJvY2Vzc29yKAorICAgIC8vLyAgICAgICAgICJXZWF0aGVyUmVwb3J0IiwKKyAgICAvLy8gICAgICAgICBuZXcgV2VhdGhlclJlcG9ydC5Qcm9jZXNzb3IobmV3IFdlYXRoZXJSZXBvcnRIYW5kbGVyKCkpKTsKKyAgICAvLy8KKyAgICAvLy8gICAgIFRTZXJ2ZXJUcmFuc3BvcnQgdCA9IG5ldyBUU2VydmVyU29ja2V0KDkwOTApOworICAgIC8vLyAgICAgVFNpbXBsZVNlcnZlciBzZXJ2ZXIgPSBuZXcgVFNpbXBsZVNlcnZlcihwcm9jZXNzb3IsIHQpOworICAgIC8vLworICAgIC8vLyAgICAgc2VydmVyLnNlcnZlKCk7CisgICAgLy8vIDwvY29kZT4KKyAgICAvLy8gPC9zdW1tYXJ5PgogICAgIHB1YmxpYyBjbGFzcyBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IgOiBUUHJvY2Vzc29yCiAgICAgewotICAgICAgICBwcml2YXRlIERpY3Rpb25hcnk8U3RyaW5nLFRQcm9jZXNzb3I+IFNlcnZpY2VQcm9jZXNzb3JNYXAgPSBuZXcgRGljdGlvbmFyeTxTdHJpbmcsVFByb2Nlc3Nvcj4oKTsKKyAgICAgICAgcHJpdmF0ZSBEaWN0aW9uYXJ5PHN0cmluZywgVFByb2Nlc3Nvcj4gU2VydmljZVByb2Nlc3Nvck1hcCA9IG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgVFByb2Nlc3Nvcj4oKTsKIAotICAgICAgICAvKioKLSAgICAgICAgICogJ1JlZ2lzdGVyJyBhIHNlcnZpY2Ugd2l0aCB0aGlzIFRNdWx0aXBsZXhlZFByb2Nlc3Nvci4gVGhpcyBhbGxvd3MgdXMgdG8gYnJva2VyCi0gICAgICAgICAqIHJlcXVlc3RzIHRvIGluZGl2aWR1YWwgc2VydmljZXMgYnkgdXNpbmcgdGhlIHNlcnZpY2UgbmFtZSB0byBzZWxlY3QgdGhlbSBhdCByZXF1ZXN0IHRpbWUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEFyZ3M6Ci0gICAgICAgICAqIC0gc2VydmljZU5hbWUgICAgTmFtZSBvZiBhIHNlcnZpY2UsIGhhcyB0byBiZSBpZGVudGljYWwgdG8gdGhlIG5hbWUKLSAgICAgICAgICogICAgICAgICAgICAgICAgICBkZWNsYXJlZCBpbiB0aGUgVGhyaWZ0IElETCwgZS5nLiAiV2VhdGhlclJlcG9ydCIuCi0gICAgICAgICAqIC0gcHJvY2Vzc29yICAgICAgSW1wbGVtZW50YXRpb24gb2YgYSBzZXJ2aWNlLCB1c3VzYWxseSByZWZlcnJlZCB0byBhcyAiaGFuZGxlcnMiLAotICAgICAgICAgKiAgICAgICAgICAgICAgICAgIGUuZy4gV2VhdGhlclJlcG9ydEhhbmRsZXIgaW1wbGVtZW50aW5nIFdlYXRoZXJSZXBvcnQuSWZhY2UuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBSZWdpc3RlclByb2Nlc3NvcihTdHJpbmcgc2VydmljZU5hbWUsIFRQcm9jZXNzb3IgcHJvY2Vzc29yKQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAnUmVnaXN0ZXInIGEgc2VydmljZSB3aXRoIHRoaXMgVE11bHRpcGxleGVkUHJvY2Vzc29yLiBUaGlzIGFsbG93cyB1cyB0byBicm9rZXIKKyAgICAgICAgLy8vIHJlcXVlc3RzIHRvIGluZGl2aWR1YWwgc2VydmljZXMgYnkgdXNpbmcgdGhlIHNlcnZpY2UgbmFtZSB0byBzZWxlY3QgdGhlbSBhdCByZXF1ZXN0IHRpbWUuCisgICAgICAgIC8vLworICAgICAgICAvLy8gQXJnczoKKyAgICAgICAgLy8vIC0gc2VydmljZU5hbWUgICAgTmFtZSBvZiBhIHNlcnZpY2UsIGhhcyB0byBiZSBpZGVudGljYWwgdG8gdGhlIG5hbWUKKyAgICAgICAgLy8vICAgICAgICAgICAgICAgICAgZGVjbGFyZWQgaW4gdGhlIFRocmlmdCBJREwsIGUuZy4gIldlYXRoZXJSZXBvcnQiLgorICAgICAgICAvLy8gLSBwcm9jZXNzb3IgICAgICBJbXBsZW1lbnRhdGlvbiBvZiBhIHNlcnZpY2UsIHVzdWFsbHkgcmVmZXJyZWQgdG8gYXMgImhhbmRsZXJzIiwKKyAgICAgICAgLy8vICAgICAgICAgICAgICAgICAgZS5nLiBXZWF0aGVyUmVwb3J0SGFuZGxlciBpbXBsZW1lbnRpbmcgV2VhdGhlclJlcG9ydC5JZmFjZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIHZvaWQgUmVnaXN0ZXJQcm9jZXNzb3Ioc3RyaW5nIHNlcnZpY2VOYW1lLCBUUHJvY2Vzc29yIHByb2Nlc3NvcikKICAgICAgICAgewogICAgICAgICAgICAgU2VydmljZVByb2Nlc3Nvck1hcC5BZGQoc2VydmljZU5hbWUsIHByb2Nlc3Nvcik7CiAgICAgICAgIH0KIAogCi0gICAgICAgIHByaXZhdGUgdm9pZCBGYWlsKCBUUHJvdG9jb2wgb3Byb3QsIFRNZXNzYWdlIG1lc3NhZ2UsIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlIGV4dHlwZSwgc3RyaW5nIGV0eHQpCisgICAgICAgIHByaXZhdGUgdm9pZCBGYWlsKFRQcm90b2NvbCBvcHJvdCwgVE1lc3NhZ2UgbWVzc2FnZSwgVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUgZXh0eXBlLCBzdHJpbmcgZXR4dCkKICAgICAgICAgewotICAgICAgICAgICAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGFwcGV4ID0gbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiggZXh0eXBlLCBldHh0KTsKKyAgICAgICAgICAgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBhcHBleCA9IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oZXh0eXBlLCBldHh0KTsKIAogICAgICAgICAgICAgVE1lc3NhZ2UgbmV3TWVzc2FnZSA9IG5ldyBUTWVzc2FnZShtZXNzYWdlLk5hbWUsIFRNZXNzYWdlVHlwZS5FeGNlcHRpb24sIG1lc3NhZ2UuU2VxSUQpOwogCiAgICAgICAgICAgICBvcHJvdC5Xcml0ZU1lc3NhZ2VCZWdpbihuZXdNZXNzYWdlKTsKLSAgICAgICAgICAgIGFwcGV4LldyaXRlKCBvcHJvdCk7CisgICAgICAgICAgICBhcHBleC5Xcml0ZShvcHJvdCk7CiAgICAgICAgICAgICBvcHJvdC5Xcml0ZU1lc3NhZ2VFbmQoKTsKICAgICAgICAgICAgIG9wcm90LlRyYW5zcG9ydC5GbHVzaCgpOwogICAgICAgICB9CiAKIAotICAgICAgICAvKioKLSAgICAgICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiBwcm9jZXNzIHBlcmZvcm1zIHRoZSBmb2xsb3dpbmcgc3RlcHM6Ci0gICAgICAgICAqCi0gICAgICAgICAqIC0gUmVhZCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBtZXNzYWdlLgotICAgICAgICAgKiAtIEV4dHJhY3QgdGhlIHNlcnZpY2UgbmFtZSBmcm9tIHRoZSBtZXNzYWdlLgotICAgICAgICAgKiAtIFVzaW5nIHRoZSBzZXJ2aWNlIG5hbWUgdG8gbG9jYXRlIHRoZSBhcHByb3ByaWF0ZSBwcm9jZXNzb3IuCi0gICAgICAgICAqIC0gRGlzcGF0Y2ggdG8gdGhlIHByb2Nlc3Nvciwgd2l0aCBhIGRlY29yYXRlZCBpbnN0YW5jZSBvZiBUUHJvdG9jb2wKLSAgICAgICAgICogICAgdGhhdCBhbGxvd3MgcmVhZE1lc3NhZ2VCZWdpbigpIHRvIHJldHVybiB0aGUgb3JpZ2luYWwgVE1lc3NhZ2UuCi0gICAgICAgICAqCi0gICAgICAgICAqIFRocm93cyBhbiBleGNlcHRpb24gaWYKLSAgICAgICAgICogLSB0aGUgbWVzc2FnZSB0eXBlIGlzIG5vdCBDQUxMIG9yIE9ORVdBWSwKLSAgICAgICAgICogLSB0aGUgc2VydmljZSBuYW1lIHdhcyBub3QgZm91bmQgaW4gdGhlIG1lc3NhZ2UsIG9yCi0gICAgICAgICAqIC0gdGhlIHNlcnZpY2UgbmFtZSBoYXMgbm90IGJlZW4gUmVnaXN0ZXJQcm9jZXNzb3IoKWVkLgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiBwcm9jZXNzIHBlcmZvcm1zIHRoZSBmb2xsb3dpbmcgc3RlcHM6CisgICAgICAgIC8vLworICAgICAgICAvLy8gLSBSZWFkIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG1lc3NhZ2UuCisgICAgICAgIC8vLyAtIEV4dHJhY3QgdGhlIHNlcnZpY2UgbmFtZSBmcm9tIHRoZSBtZXNzYWdlLgorICAgICAgICAvLy8gLSBVc2luZyB0aGUgc2VydmljZSBuYW1lIHRvIGxvY2F0ZSB0aGUgYXBwcm9wcmlhdGUgcHJvY2Vzc29yLgorICAgICAgICAvLy8gLSBEaXNwYXRjaCB0byB0aGUgcHJvY2Vzc29yLCB3aXRoIGEgZGVjb3JhdGVkIGluc3RhbmNlIG9mIFRQcm90b2NvbAorICAgICAgICAvLy8gICAgdGhhdCBhbGxvd3MgcmVhZE1lc3NhZ2VCZWdpbigpIHRvIHJldHVybiB0aGUgb3JpZ2luYWwgVE1lc3NhZ2UuCisgICAgICAgIC8vLyA8cGFyYS8+CisgICAgICAgIC8vLyBUaHJvd3MgYW4gZXhjZXB0aW9uIGlmCisgICAgICAgIC8vLyAtIHRoZSBtZXNzYWdlIHR5cGUgaXMgbm90IENBTEwgb3IgT05FV0FZLAorICAgICAgICAvLy8gLSB0aGUgc2VydmljZSBuYW1lIHdhcyBub3QgZm91bmQgaW4gdGhlIG1lc3NhZ2UsIG9yCisgICAgICAgIC8vLyAtIHRoZSBzZXJ2aWNlIG5hbWUgaGFzIG5vdCBiZWVuIFJlZ2lzdGVyUHJvY2Vzc29yKCllZC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHVibGljIGJvb2wgUHJvY2VzcyhUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCkKICAgICAgICAgewogICAgICAgICAgICAgLyogIFVzZSB0aGUgYWN0dWFsIHVuZGVybHlpbmcgcHJvdG9jb2wgKGUuZy4gVEJpbmFyeVByb3RvY29sKSB0byByZWFkIHRoZQpAQCAtMTU1LDE3ICsxNTgsMTcgQEAKIAogICAgICAgICB9CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqICBPdXIgZ29hbCB3YXMgdG8gd29yayB3aXRoIGFueSBwcm90b2NvbC4gIEluIG9yZGVyIHRvIGRvIHRoYXQsIHdlIG5lZWRlZAotICAgICAgICAgKiAgdG8gYWxsb3cgdGhlbSB0byBjYWxsIHJlYWRNZXNzYWdlQmVnaW4oKSBhbmQgZ2V0IGEgVE1lc3NhZ2UgaW4gZXhhY3RseQotICAgICAgICAgKiAgdGhlIHN0YW5kYXJkIGZvcm1hdCwgd2l0aG91dCB0aGUgc2VydmljZSBuYW1lIHByZXBlbmRlZCB0byBUTWVzc2FnZS5uYW1lLgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gIE91ciBnb2FsIHdhcyB0byB3b3JrIHdpdGggYW55IHByb3RvY29sLiAgSW4gb3JkZXIgdG8gZG8gdGhhdCwgd2UgbmVlZGVkCisgICAgICAgIC8vLyAgdG8gYWxsb3cgdGhlbSB0byBjYWxsIHJlYWRNZXNzYWdlQmVnaW4oKSBhbmQgZ2V0IGEgVE1lc3NhZ2UgaW4gZXhhY3RseQorICAgICAgICAvLy8gIHRoZSBzdGFuZGFyZCBmb3JtYXQsIHdpdGhvdXQgdGhlIHNlcnZpY2UgbmFtZSBwcmVwZW5kZWQgdG8gVE1lc3NhZ2UubmFtZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHJpdmF0ZSBjbGFzcyBTdG9yZWRNZXNzYWdlUHJvdG9jb2wgOiBUUHJvdG9jb2xEZWNvcmF0b3IKICAgICAgICAgewogICAgICAgICAgICAgVE1lc3NhZ2UgTXNnQmVnaW47CiAKICAgICAgICAgICAgIHB1YmxpYyBTdG9yZWRNZXNzYWdlUHJvdG9jb2woVFByb3RvY29sIHByb3RvY29sLCBUTWVzc2FnZSBtZXNzYWdlQmVnaW4pCi0gICAgICAgICAgICAgICAgOmJhc2UocHJvdG9jb2wpCisgICAgICAgICAgICAgICAgOiBiYXNlKHByb3RvY29sKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHRoaXMuTXNnQmVnaW4gPSBtZXNzYWdlQmVnaW47CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5jcyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLmNzCmluZGV4IDFlMmFmODMuLjFiZDQyMGYgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLmNzCkBAIC0yOSw2MyArMjksNjIgQEAKIG5hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2wKIHsKIAotICAgIC8qKgotICAgICAqIFRNdWx0aXBsZXhlZFByb3RvY29sIGlzIGEgcHJvdG9jb2wtaW5kZXBlbmRlbnQgY29uY3JldGUgZGVjb3JhdG9yIHRoYXQgYWxsb3dzIGEgVGhyaWZ0Ci0gICAgICogY2xpZW50IHRvIGNvbW11bmljYXRlIHdpdGggYSBtdWx0aXBsZXhpbmcgVGhyaWZ0IHNlcnZlciwgYnkgcHJlcGVuZGluZyB0aGUgc2VydmljZSBuYW1lCi0gICAgICogdG8gdGhlIGZ1bmN0aW9uIG5hbWUgZHVyaW5nIGZ1bmN0aW9uIGNhbGxzLgotICAgICAqCi0gICAgICogTk9URTogVEhJUyBJUyBOT1QgVE8gQkUgVVNFRCBCWSBTRVJWRVJTLgotICAgICAqIE9uIHRoZSBzZXJ2ZXIsIHVzZSBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IgdG8gaGFuZGxlIHJlcXVlc3RzIGZyb20gYSBtdWx0aXBsZXhpbmcgY2xpZW50LgotICAgICAqCi0gICAgICogVGhpcyBleGFtcGxlIHVzZXMgYSBzaW5nbGUgc29ja2V0IHRyYW5zcG9ydCB0byBpbnZva2UgdHdvIHNlcnZpY2VzOgotICAgICAqCi0gICAgICogICAgIFRTb2NrZXQgdHJhbnNwb3J0ID0gbmV3IFRTb2NrZXQoImxvY2FsaG9zdCIsIDkwOTApOwotICAgICAqICAgICB0cmFuc3BvcnQub3BlbigpOwotICAgICAqCi0gICAgICogICAgIFRCaW5hcnlQcm90b2NvbCBwcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2wodHJhbnNwb3J0KTsKLSAgICAgKgotICAgICAqICAgICBUTXVsdGlwbGV4ZWRQcm90b2NvbCBtcCA9IG5ldyBUTXVsdGlwbGV4ZWRQcm90b2NvbChwcm90b2NvbCwgIkNhbGN1bGF0b3IiKTsKLSAgICAgKiAgICAgQ2FsY3VsYXRvci5DbGllbnQgc2VydmljZSA9IG5ldyBDYWxjdWxhdG9yLkNsaWVudChtcCk7Ci0gICAgICoKLSAgICAgKiAgICAgVE11bHRpcGxleGVkUHJvdG9jb2wgbXAyID0gbmV3IFRNdWx0aXBsZXhlZFByb3RvY29sKHByb3RvY29sLCAiV2VhdGhlclJlcG9ydCIpOwotICAgICAqICAgICBXZWF0aGVyUmVwb3J0LkNsaWVudCBzZXJ2aWNlMiA9IG5ldyBXZWF0aGVyUmVwb3J0LkNsaWVudChtcDIpOwotICAgICAqCi0gICAgICogICAgIFN5c3RlbS5vdXQucHJpbnRsbihzZXJ2aWNlLmFkZCgyLDIpKTsKLSAgICAgKiAgICAgU3lzdGVtLm91dC5wcmludGxuKHNlcnZpY2UyLmdldFRlbXBlcmF0dXJlKCkpOwotICAgICAqCi0gICAgICovCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBUTXVsdGlwbGV4ZWRQcm90b2NvbCBpcyBhIHByb3RvY29sLWluZGVwZW5kZW50IGNvbmNyZXRlIGRlY29yYXRvciB0aGF0IGFsbG93cyBhIFRocmlmdAorICAgIC8vLyBjbGllbnQgdG8gY29tbXVuaWNhdGUgd2l0aCBhIG11bHRpcGxleGluZyBUaHJpZnQgc2VydmVyLCBieSBwcmVwZW5kaW5nIHRoZSBzZXJ2aWNlIG5hbWUKKyAgICAvLy8gdG8gdGhlIGZ1bmN0aW9uIG5hbWUgZHVyaW5nIGZ1bmN0aW9uIGNhbGxzLgorICAgIC8vLyA8cGFyYS8+CisgICAgLy8vIE5PVEU6IFRISVMgSVMgTk9UIFRPIEJFIFVTRUQgQlkgU0VSVkVSUy4KKyAgICAvLy8gT24gdGhlIHNlcnZlciwgdXNlIFRNdWx0aXBsZXhlZFByb2Nlc3NvciB0byBoYW5kbGUgcmVxdWVzdHMgZnJvbSBhIG11bHRpcGxleGluZyBjbGllbnQuCisgICAgLy8vIDxwYXJhLz4KKyAgICAvLy8gVGhpcyBleGFtcGxlIHVzZXMgYSBzaW5nbGUgc29ja2V0IHRyYW5zcG9ydCB0byBpbnZva2UgdHdvIHNlcnZpY2VzOgorICAgIC8vLyA8Y29kZT4KKyAgICAvLy8gICAgIFRTb2NrZXQgdHJhbnNwb3J0ID0gbmV3IFRTb2NrZXQoImxvY2FsaG9zdCIsIDkwOTApOworICAgIC8vLyAgICAgdHJhbnNwb3J0Lm9wZW4oKTsKKyAgICAvLy8KKyAgICAvLy8gICAgIFRCaW5hcnlQcm90b2NvbCBwcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgICAvLy8KKyAgICAvLy8gICAgIFRNdWx0aXBsZXhlZFByb3RvY29sIG1wID0gbmV3IFRNdWx0aXBsZXhlZFByb3RvY29sKHByb3RvY29sLCAiQ2FsY3VsYXRvciIpOworICAgIC8vLyAgICAgQ2FsY3VsYXRvci5DbGllbnQgc2VydmljZSA9IG5ldyBDYWxjdWxhdG9yLkNsaWVudChtcCk7CisgICAgLy8vCisgICAgLy8vICAgICBUTXVsdGlwbGV4ZWRQcm90b2NvbCBtcDIgPSBuZXcgVE11bHRpcGxleGVkUHJvdG9jb2wocHJvdG9jb2wsICJXZWF0aGVyUmVwb3J0Iik7CisgICAgLy8vICAgICBXZWF0aGVyUmVwb3J0LkNsaWVudCBzZXJ2aWNlMiA9IG5ldyBXZWF0aGVyUmVwb3J0LkNsaWVudChtcDIpOworICAgIC8vLworICAgIC8vLyAgICAgU3lzdGVtLm91dC5wcmludGxuKHNlcnZpY2UuYWRkKDIsMikpOworICAgIC8vLyAgICAgU3lzdGVtLm91dC5wcmludGxuKHNlcnZpY2UyLmdldFRlbXBlcmF0dXJlKCkpOworICAgIC8vLyA8L2NvZGU+CisgICAgLy8vIDwvc3VtbWFyeT4KICAgICBwdWJsaWMgY2xhc3MgVE11bHRpcGxleGVkUHJvdG9jb2wgOiBUUHJvdG9jb2xEZWNvcmF0b3IKICAgICB7CiAKLSAgICAgICAgLyoqIFVzZWQgdG8gZGVsaW1pdCB0aGUgc2VydmljZSBuYW1lIGZyb20gdGhlIGZ1bmN0aW9uIG5hbWUgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgU0VQQVJBVE9SID0gIjoiOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBVc2VkIHRvIGRlbGltaXQgdGhlIHNlcnZpY2UgbmFtZSBmcm9tIHRoZSBmdW5jdGlvbiBuYW1lLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgc3RhdGljIHN0cmluZyBTRVBBUkFUT1IgPSAiOiI7CiAKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgU2VydmljZU5hbWU7CisgICAgICAgIHByaXZhdGUgc3RyaW5nIFNlcnZpY2VOYW1lOwogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBXcmFwIHRoZSBzcGVjaWZpZWQgcHJvdG9jb2wsIGFsbG93aW5nIGl0IHRvIGJlIHVzZWQgdG8gY29tbXVuaWNhdGUgd2l0aCBhCi0gICAgICAgICAqIG11bHRpcGxleGluZyBzZXJ2ZXIuICBUaGUgPGNvZGU+c2VydmljZU5hbWU8L2NvZGU+IGlzIHJlcXVpcmVkIGFzIGl0IGlzCi0gICAgICAgICAqIHByZXBlbmRlZCB0byB0aGUgbWVzc2FnZSBoZWFkZXIgc28gdGhhdCB0aGUgbXVsdGlwbGV4aW5nIHNlcnZlciBjYW4gYnJva2VyCi0gICAgICAgICAqIHRoZSBmdW5jdGlvbiBjYWxsIHRvIHRoZSBwcm9wZXIgc2VydmljZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQXJnczoKLSAgICAgICAgICogIHByb3RvY29sICAgICAgICBZb3VyIGNvbW11bmljYXRpb24gcHJvdG9jb2wgb2YgY2hvaWNlLCBlLmcuIFRCaW5hcnlQcm90b2NvbAotICAgICAgICAgKiAgc2VydmljZU5hbWUgICAgIFRoZSBzZXJ2aWNlIG5hbWUgb2YgdGhlIHNlcnZpY2UgY29tbXVuaWNhdGluZyB2aWEgdGhpcyBwcm90b2NvbC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBUTXVsdGlwbGV4ZWRQcm90b2NvbChUUHJvdG9jb2wgcHJvdG9jb2wsIFN0cmluZyBzZXJ2aWNlTmFtZSkKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JhcCB0aGUgc3BlY2lmaWVkIHByb3RvY29sLCBhbGxvd2luZyBpdCB0byBiZSB1c2VkIHRvIGNvbW11bmljYXRlIHdpdGggYQorICAgICAgICAvLy8gbXVsdGlwbGV4aW5nIHNlcnZlci4gIFRoZSA8cGFyYW1yZWYgbmFtZT0ic2VydmljZU5hbWUiLz4gaXMgcmVxdWlyZWQgYXMgaXQgaXMKKyAgICAgICAgLy8vIHByZXBlbmRlZCB0byB0aGUgbWVzc2FnZSBoZWFkZXIgc28gdGhhdCB0aGUgbXVsdGlwbGV4aW5nIHNlcnZlciBjYW4gYnJva2VyCisgICAgICAgIC8vLyB0aGUgZnVuY3Rpb24gY2FsbCB0byB0aGUgcHJvcGVyIHNlcnZpY2UuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icHJvdG9jb2wiPllvdXIgY29tbXVuaWNhdGlvbiBwcm90b2NvbCBvZiBjaG9pY2UsIGUuZy4gPHNlZSBjcmVmPSJUQmluYXJ5UHJvdG9jb2wiLz4uPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJzZXJ2aWNlTmFtZSI+VGhlIHNlcnZpY2UgbmFtZSBvZiB0aGUgc2VydmljZSBjb21tdW5pY2F0aW5nIHZpYSB0aGlzIHByb3RvY29sLjwvcGFyYW0+CisgICAgICAgIHB1YmxpYyBUTXVsdGlwbGV4ZWRQcm90b2NvbChUUHJvdG9jb2wgcHJvdG9jb2wsIHN0cmluZyBzZXJ2aWNlTmFtZSkKICAgICAgICAgICAgIDogYmFzZShwcm90b2NvbCkKICAgICAgICAgewogICAgICAgICAgICAgU2VydmljZU5hbWUgPSBzZXJ2aWNlTmFtZTsKICAgICAgICAgfQogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBQcmVwZW5kcyB0aGUgc2VydmljZSBuYW1lIHRvIHRoZSBmdW5jdGlvbiBuYW1lLCBzZXBhcmF0ZWQgYnkgVE11bHRpcGxleGVkUHJvdG9jb2wuU0VQQVJBVE9SLgotICAgICAgICAgKiBBcmdzOgotICAgICAgICAgKiAgIHRNZXNzYWdlICAgICBUaGUgb3JpZ2luYWwgbWVzc2FnZS4KLSAgICAgICAgICovCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFByZXBlbmRzIHRoZSBzZXJ2aWNlIG5hbWUgdG8gdGhlIGZ1bmN0aW9uIG5hbWUsIHNlcGFyYXRlZCBieSBUTXVsdGlwbGV4ZWRQcm90b2NvbC5TRVBBUkFUT1IuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idE1lc3NhZ2UiPlRoZSBvcmlnaW5hbCBtZXNzYWdlLjwvcGFyYW0+CiAgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlTWVzc2FnZUJlZ2luKFRNZXNzYWdlIHRNZXNzYWdlKQogICAgICAgICB7Ci0gICAgICAgICAgICBzd2l0Y2godE1lc3NhZ2UuVHlwZSkKKyAgICAgICAgICAgIHN3aXRjaCAodE1lc3NhZ2UuVHlwZSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBjYXNlIFRNZXNzYWdlVHlwZS5DYWxsOgogICAgICAgICAgICAgICAgIGNhc2UgVE1lc3NhZ2VUeXBlLk9uZXdheToKQEAgLTEwMSw1ICsxMDAsNCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotCiB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UUHJvdG9jb2wuY3MgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UUHJvdG9jb2wuY3MKaW5kZXggMWY1YmQ4MS4uZGQ3YTZlMCAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFByb3RvY29sLmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RQcm90b2NvbC5jcwpAQCAtMjksMTEgKzI5LDE3IEBACiB7CiAgICAgcHVibGljIGFic3RyYWN0IGNsYXNzIFRQcm90b2NvbCA6IElEaXNwb3NhYmxlCiAgICAgeworICAgICAgICBwcml2YXRlIGNvbnN0IGludCBERUZBVUxUX1JFQ1VSU0lPTl9ERVBUSCA9IDY0OworCiAgICAgICAgIHByb3RlY3RlZCBUVHJhbnNwb3J0IHRyYW5zOworICAgICAgICBwcm90ZWN0ZWQgaW50IHJlY3Vyc2lvbkxpbWl0OworICAgICAgICBwcm90ZWN0ZWQgaW50IHJlY3Vyc2lvbkRlcHRoOwogCiAgICAgICAgIHByb3RlY3RlZCBUUHJvdG9jb2woVFRyYW5zcG9ydCB0cmFucykKICAgICAgICAgewogICAgICAgICAgICAgdGhpcy50cmFucyA9IHRyYW5zOworICAgICAgICAgICAgdGhpcy5yZWN1cnNpb25MaW1pdCA9IERFRkFVTFRfUkVDVVJTSU9OX0RFUFRIOworICAgICAgICAgICAgdGhpcy5yZWN1cnNpb25EZXB0aCA9IDA7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgVFRyYW5zcG9ydCBUcmFuc3BvcnQKQEAgLTQxLDYgKzQ3LDI1IEBACiAgICAgICAgICAgICBnZXQgeyByZXR1cm4gdHJhbnM7IH0KICAgICAgICAgfQogCisgICAgICAgIHB1YmxpYyBpbnQgUmVjdXJzaW9uTGltaXQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlY3Vyc2lvbkxpbWl0OyB9CisgICAgICAgICAgICBzZXQgeyByZWN1cnNpb25MaW1pdCA9IHZhbHVlOyB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBJbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChyZWN1cnNpb25EZXB0aCA8IHJlY3Vyc2lvbkxpbWl0KQorICAgICAgICAgICAgICAgICsrcmVjdXJzaW9uRGVwdGg7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uREVQVEhfTElNSVQsICJEZXB0aCBsaW1pdCBleGNlZWRlZCIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKQorICAgICAgICB7CisgICAgICAgICAgICAtLXJlY3Vyc2lvbkRlcHRoOworICAgICAgICB9CisKICAgICAgICAgI3JlZ2lvbiAiIElEaXNwb3NhYmxlIFN1cHBvcnQgIgogICAgICAgICBwcml2YXRlIGJvb2wgX0lzRGlzcG9zZWQ7CiAKQEAgLTgzLDcgKzEwOCw4IEBACiAgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlSTMyKGludCBpMzIpOwogICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBXcml0ZUk2NChsb25nIGk2NCk7CiAgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlRG91YmxlKGRvdWJsZSBkKTsKLSAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBXcml0ZVN0cmluZyhzdHJpbmcgcykgeworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFdyaXRlU3RyaW5nKHN0cmluZyBzKQorICAgICAgICB7CiAgICAgICAgICAgICBXcml0ZUJpbmFyeShFbmNvZGluZy5VVEY4LkdldEJ5dGVzKHMpKTsKICAgICAgICAgfQogICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBXcml0ZUJpbmFyeShieXRlW10gYik7CkBAIC0xMDYsNyArMTMyLDggQEAKICAgICAgICAgcHVibGljIGFic3RyYWN0IGludCBSZWFkSTMyKCk7CiAgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBsb25nIFJlYWRJNjQoKTsKICAgICAgICAgcHVibGljIGFic3RyYWN0IGRvdWJsZSBSZWFkRG91YmxlKCk7Ci0gICAgICAgIHB1YmxpYyB2aXJ0dWFsIHN0cmluZyBSZWFkU3RyaW5nKCkgeworICAgICAgICBwdWJsaWMgdmlydHVhbCBzdHJpbmcgUmVhZFN0cmluZygpCisgICAgICAgIHsKICAgICAgICAgICAgIHZhciBidWYgPSBSZWFkQmluYXJ5KCk7CiAgICAgICAgICAgICByZXR1cm4gRW5jb2RpbmcuVVRGOC5HZXRTdHJpbmcoYnVmLCAwLCBidWYuTGVuZ3RoKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLmNzIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLmNzCmluZGV4IDdiYzM0ZWYuLjg2MDAwMDIgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5jcworKysgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UUHJvdG9jb2xEZWNvcmF0b3IuY3MKQEAgLTI4LDI2ICsyOCwyNSBAQAogCiBuYW1lc3BhY2UgVGhyaWZ0LlByb3RvY29sCiB7Ci0KLSAgICAvKioKLSAgICAgKiBUUHJvdG9jb2xEZWNvcmF0b3IgZm9yd2FyZHMgYWxsIHJlcXVlc3RzIHRvIGFuIGVuY2xvc2VkIFRQcm90b2NvbCBpbnN0YW5jZSwKLSAgICAgKiBwcm92aWRpbmcgYSB3YXkgdG8gYXV0aG9yIGNvbmNpc2UgY29uY3JldGUgZGVjb3JhdG9yIHN1YmNsYXNzZXMuICBXaGlsZSBpdCBoYXMKLSAgICAgKiBubyBhYnN0cmFjdCBtZXRob2RzLCBpdCBpcyBtYXJrZWQgYWJzdHJhY3QgYXMgYSByZW1pbmRlciB0aGF0IGJ5IGl0c2VsZiwKLSAgICAgKiBpdCBkb2VzIG5vdCBtb2RpZnkgdGhlIGJlaGF2aW91ciBvZiB0aGUgZW5jbG9zZWQgVFByb3RvY29sLgotICAgICAqCi0gICAgICogU2VlIHAuMTc1IG9mIERlc2lnbiBQYXR0ZXJucyAoYnkgR2FtbWEgZXQgYWwuKQotICAgICAqIFNlZSBUTXVsdGlwbGV4ZWRQcm90b2NvbAotICAgICAqLworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gPHNlZSBjcmVmPSJUUHJvdG9jb2xEZWNvcmF0b3IiLz4gZm9yd2FyZHMgYWxsIHJlcXVlc3RzIHRvIGFuIGVuY2xvc2VkIDxzZWUgY3JlZj0iVFByb3RvY29sIi8+IGluc3RhbmNlLAorICAgIC8vLyBwcm92aWRpbmcgYSB3YXkgdG8gYXV0aG9yIGNvbmNpc2UgY29uY3JldGUgZGVjb3JhdG9yIHN1YmNsYXNzZXMuIFdoaWxlIGl0IGhhcworICAgIC8vLyBubyBhYnN0cmFjdCBtZXRob2RzLCBpdCBpcyBtYXJrZWQgYWJzdHJhY3QgYXMgYSByZW1pbmRlciB0aGF0IGJ5IGl0c2VsZiwKKyAgICAvLy8gaXQgZG9lcyBub3QgbW9kaWZ5IHRoZSBiZWhhdmlvdXIgb2YgdGhlIGVuY2xvc2VkIDxzZWUgY3JlZj0iVFByb3RvY29sIi8+LgorICAgIC8vLyA8cGFyYS8+CisgICAgLy8vIFNlZSBwLjE3NSBvZiBEZXNpZ24gUGF0dGVybnMgKGJ5IEdhbW1hIGV0IGFsLikKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJUTXVsdGlwbGV4ZWRQcm90b2NvbCIvPgogICAgIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUUHJvdG9jb2xEZWNvcmF0b3IgOiBUUHJvdG9jb2wKICAgICB7CiAgICAgICAgIHByaXZhdGUgVFByb3RvY29sIFdyYXBwZWRQcm90b2NvbDsKIAotICAgICAgICAvKioKLSAgICAgICAgICogRW5jbG9zZXMgdGhlIHNwZWNpZmllZCBwcm90b2NvbC4KLSAgICAgICAgICogQHBhcmFtIHByb3RvY29sIEFsbCBvcGVyYXRpb25zIHdpbGwgYmUgZm9yd2FyZCB0byB0aGlzIHByb3RvY29sLiAgTXVzdCBiZSBub24tbnVsbC4KLSAgICAgICAgICovCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEVuY2xvc2VzIHRoZSBzcGVjaWZpZWQgcHJvdG9jb2wuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icHJvdG9jb2wiPkFsbCBvcGVyYXRpb25zIHdpbGwgYmUgZm9yd2FyZCB0byB0aGlzIHByb3RvY29sLiAgTXVzdCBiZSBub24tbnVsbC48L3BhcmFtPgogICAgICAgICBwdWJsaWMgVFByb3RvY29sRGVjb3JhdG9yKFRQcm90b2NvbCBwcm90b2NvbCkKLSAgICAgICAgICAgIDogYmFzZSggcHJvdG9jb2wuVHJhbnNwb3J0KQorICAgICAgICAgICAgOiBiYXNlKHByb3RvY29sLlRyYW5zcG9ydCkKICAgICAgICAgewogCiAgICAgICAgICAgICBXcmFwcGVkUHJvdG9jb2wgPSBwcm90b2NvbDsKQEAgLTEwNCw3ICsxMDMsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVMaXN0RW5kKCkKLXsKKyAgICAgICAgewogICAgICAgICAgICAgV3JhcHBlZFByb3RvY29sLldyaXRlTGlzdEVuZCgpOwogICAgICAgICB9CiAKQEAgLTE0OCw3ICsxNDcsNyBAQAogICAgICAgICAgICAgV3JhcHBlZFByb3RvY29sLldyaXRlRG91YmxlKHYpOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVTdHJpbmcoU3RyaW5nIHMpCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlU3RyaW5nKHN0cmluZyBzKQogICAgICAgICB7CiAgICAgICAgICAgICBXcmFwcGVkUHJvdG9jb2wuV3JpdGVTdHJpbmcocyk7CiAgICAgICAgIH0KQEAgLTI0OCw3ICsyNDcsNyBAQAogICAgICAgICAgICAgcmV0dXJuIFdyYXBwZWRQcm90b2NvbC5SZWFkRG91YmxlKCk7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgU3RyaW5nIFJlYWRTdHJpbmcoKQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFJlYWRTdHJpbmcoKQogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gV3JhcHBlZFByb3RvY29sLlJlYWRTdHJpbmcoKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFByb3RvY29sRXhjZXB0aW9uLmNzIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFByb3RvY29sRXhjZXB0aW9uLmNzCmluZGV4IDc2Yzc0OWQuLmMwZjAwN2UgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RQcm90b2NvbEV4Y2VwdGlvbi5jcworKysgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UUHJvdG9jb2xFeGNlcHRpb24uY3MKQEAgLTQ4LDE0ICs0OCwxNCBAQAogICAgICAgICAgICAgdHlwZV8gPSB0eXBlOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIFRQcm90b2NvbEV4Y2VwdGlvbihpbnQgdHlwZSwgU3RyaW5nIG1lc3NhZ2UpCi0gICAgICAgICAgICA6IGJhc2UobWVzc2FnZSkKKyAgICAgICAgcHVibGljIFRQcm90b2NvbEV4Y2VwdGlvbihpbnQgdHlwZSwgc3RyaW5nIG1lc3NhZ2UsIEV4Y2VwdGlvbiBpbm5lciA9IG51bGwpCisgICAgICAgICAgICA6IGJhc2UobWVzc2FnZSwgaW5uZXIpCiAgICAgICAgIHsKICAgICAgICAgICAgIHR5cGVfID0gdHlwZTsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyBUUHJvdG9jb2xFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpCi0gICAgICAgICAgICA6IGJhc2UobWVzc2FnZSkKKyAgICAgICAgcHVibGljIFRQcm90b2NvbEV4Y2VwdGlvbihzdHJpbmcgbWVzc2FnZSwgRXhjZXB0aW9uIGlubmVyID0gbnVsbCkKKyAgICAgICAgICAgIDogYmFzZShtZXNzYWdlLCBpbm5lcikKICAgICAgICAgewogICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RQcm90b2NvbFV0aWwuY3MgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UUHJvdG9jb2xVdGlsLmNzCmluZGV4IDkxMTQwZDMuLmQ5OTVjNmMgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RQcm90b2NvbFV0aWwuY3MKKysrIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFByb3RvY29sVXRpbC5jcwpAQCAtMjksNjkgKzI5LDc5IEBACiAgICAgewogICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgU2tpcChUUHJvdG9jb2wgcHJvdCwgVFR5cGUgdHlwZSkKICAgICAgICAgewotICAgICAgICAgICAgc3dpdGNoICh0eXBlKQorICAgICAgICAgICAgcHJvdC5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOworICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5Cb29sOgotICAgICAgICAgICAgICAgICAgICBwcm90LlJlYWRCb29sKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuQnl0ZToKLSAgICAgICAgICAgICAgICAgICAgcHJvdC5SZWFkQnl0ZSgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLkkxNjoKLSAgICAgICAgICAgICAgICAgICAgcHJvdC5SZWFkSTE2KCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuSTMyOgotICAgICAgICAgICAgICAgICAgICBwcm90LlJlYWRJMzIoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5JNjQ6Ci0gICAgICAgICAgICAgICAgICAgIHByb3QuUmVhZEk2NCgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLkRvdWJsZToKLSAgICAgICAgICAgICAgICAgICAgcHJvdC5SZWFkRG91YmxlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuU3RyaW5nOgotICAgICAgICAgICAgICAgICAgICAvLyBEb24ndCB0cnkgdG8gZGVjb2RlIHRoZSBzdHJpbmcsIGp1c3Qgc2tpcCBpdC4KLSAgICAgICAgICAgICAgICAgICAgcHJvdC5SZWFkQmluYXJ5KCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuU3RydWN0OgotICAgICAgICAgICAgICAgICAgICBwcm90LlJlYWRTdHJ1Y3RCZWdpbigpOwotICAgICAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgVEZpZWxkIGZpZWxkID0gcHJvdC5SZWFkRmllbGRCZWdpbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLlR5cGUgPT0gVFR5cGUuU3RvcCkKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLkJvb2w6CisgICAgICAgICAgICAgICAgICAgICAgICBwcm90LlJlYWRCb29sKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5CeXRlOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJvdC5SZWFkQnl0ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuSTE2OgorICAgICAgICAgICAgICAgICAgICAgICAgcHJvdC5SZWFkSTE2KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5JMzI6CisgICAgICAgICAgICAgICAgICAgICAgICBwcm90LlJlYWRJMzIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLkk2NDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3QuUmVhZEk2NCgpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuRG91YmxlOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJvdC5SZWFkRG91YmxlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5TdHJpbmc6CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBEb24ndCB0cnkgdG8gZGVjb2RlIHRoZSBzdHJpbmcsIGp1c3Qgc2tpcCBpdC4KKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3QuUmVhZEJpbmFyeSgpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuU3RydWN0OgorICAgICAgICAgICAgICAgICAgICAgICAgcHJvdC5SZWFkU3RydWN0QmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKQogICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRGaWVsZCBmaWVsZCA9IHByb3QuUmVhZEZpZWxkQmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQuVHlwZSA9PSBUVHlwZS5TdG9wKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNraXAocHJvdCwgZmllbGQuVHlwZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdC5SZWFkRmllbGRFbmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIFNraXAocHJvdCwgZmllbGQuVHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm90LlJlYWRGaWVsZEVuZCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHByb3QuUmVhZFN0cnVjdEVuZCgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLk1hcDoKLSAgICAgICAgICAgICAgICAgICAgVE1hcCBtYXAgPSBwcm90LlJlYWRNYXBCZWdpbigpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1hcC5Db3VudDsgaSsrKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTa2lwKHByb3QsIG1hcC5LZXlUeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNraXAocHJvdCwgbWFwLlZhbHVlVHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcHJvdC5SZWFkTWFwRW5kKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuU2V0OgotICAgICAgICAgICAgICAgICAgICBUU2V0IHNldCA9IHByb3QuUmVhZFNldEJlZ2luKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2V0LkNvdW50OyBpKyspCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNraXAocHJvdCwgc2V0LkVsZW1lbnRUeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwcm90LlJlYWRTZXRFbmQoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5MaXN0OgotICAgICAgICAgICAgICAgICAgICBUTGlzdCBsaXN0ID0gcHJvdC5SZWFkTGlzdEJlZ2luKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5Db3VudDsgaSsrKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTa2lwKHByb3QsIGxpc3QuRWxlbWVudFR5cGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHByb3QuUmVhZExpc3RFbmQoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm90LlJlYWRTdHJ1Y3RFbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLk1hcDoKKyAgICAgICAgICAgICAgICAgICAgICAgIFRNYXAgbWFwID0gcHJvdC5SZWFkTWFwQmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFwLkNvdW50OyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tpcChwcm90LCBtYXAuS2V5VHlwZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tpcChwcm90LCBtYXAuVmFsdWVUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3QuUmVhZE1hcEVuZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuU2V0OgorICAgICAgICAgICAgICAgICAgICAgICAgVFNldCBzZXQgPSBwcm90LlJlYWRTZXRCZWdpbigpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXQuQ291bnQ7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTa2lwKHByb3QsIHNldC5FbGVtZW50VHlwZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBwcm90LlJlYWRTZXRFbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLkxpc3Q6CisgICAgICAgICAgICAgICAgICAgICAgICBUTGlzdCBsaXN0ID0gcHJvdC5SZWFkTGlzdEJlZ2luKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3QuQ291bnQ7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTa2lwKHByb3QsIGxpc3QuRWxlbWVudFR5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcHJvdC5SZWFkTGlzdEVuZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsICJVbmtub3duIGRhdGEgdHlwZSAiICsgdHlwZS5Ub1N0cmluZygiZCIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbGx5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJvdC5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvU2VydmVyL1RTZXJ2ZXIuY3MgYi9saWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFNlcnZlci5jcwppbmRleCBhMjYzMWE5Li4yYmMwNGYzIDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFNlcnZlci5jcworKysgYi9saWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFNlcnZlci5jcwpAQCAtMjgsMTAwICsyOCwxMjggQEAKIAogbmFtZXNwYWNlIFRocmlmdC5TZXJ2ZXIKIHsKLSAgcHVibGljIGFic3RyYWN0IGNsYXNzIFRTZXJ2ZXIKLSAgewotICAgIC8vQXR0cmlidXRlcwotICAgIHByb3RlY3RlZCBUUHJvY2Vzc29yIHByb2Nlc3NvcjsKLSAgICBwcm90ZWN0ZWQgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQ7Ci0gICAgcHJvdGVjdGVkIFRUcmFuc3BvcnRGYWN0b3J5IGlucHV0VHJhbnNwb3J0RmFjdG9yeTsKLSAgICBwcm90ZWN0ZWQgVFRyYW5zcG9ydEZhY3Rvcnkgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeTsKLSAgICBwcm90ZWN0ZWQgVFByb3RvY29sRmFjdG9yeSBpbnB1dFByb3RvY29sRmFjdG9yeTsKLSAgICBwcm90ZWN0ZWQgVFByb3RvY29sRmFjdG9yeSBvdXRwdXRQcm90b2NvbEZhY3Rvcnk7Ci0gICAgcHJvdGVjdGVkIFRTZXJ2ZXJFdmVudEhhbmRsZXIgc2VydmVyRXZlbnRIYW5kbGVyID0gbnVsbDsKKyAgICBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVFNlcnZlcgorICAgIHsKKyAgICAgICAgLy9BdHRyaWJ1dGVzCisgICAgICAgIHByb3RlY3RlZCBUUHJvY2Vzc29yRmFjdG9yeSBwcm9jZXNzb3JGYWN0b3J5OworICAgICAgICBwcm90ZWN0ZWQgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQ7CisgICAgICAgIHByb3RlY3RlZCBUVHJhbnNwb3J0RmFjdG9yeSBpbnB1dFRyYW5zcG9ydEZhY3Rvcnk7CisgICAgICAgIHByb3RlY3RlZCBUVHJhbnNwb3J0RmFjdG9yeSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5OworICAgICAgICBwcm90ZWN0ZWQgVFByb3RvY29sRmFjdG9yeSBpbnB1dFByb3RvY29sRmFjdG9yeTsKKyAgICAgICAgcHJvdGVjdGVkIFRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5OworICAgICAgICBwcm90ZWN0ZWQgVFNlcnZlckV2ZW50SGFuZGxlciBzZXJ2ZXJFdmVudEhhbmRsZXIgPSBudWxsOwogCi0gICAgLy9NZXRob2RzCi0gICAgcHVibGljIHZvaWQgc2V0RXZlbnRIYW5kbGVyKFRTZXJ2ZXJFdmVudEhhbmRsZXIgc2VoKQotICAgIHsKLSAgICAgIHNlcnZlckV2ZW50SGFuZGxlciA9IHNlaDsKLSAgICB9Ci0gICAgcHVibGljIFRTZXJ2ZXJFdmVudEhhbmRsZXIgZ2V0RXZlbnRIYW5kbGVyKCkKLSAgICB7Ci0gICAgICByZXR1cm4gc2VydmVyRXZlbnRIYW5kbGVyOwotICAgIH0KKyAgICAgICAgLy9NZXRob2RzCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEV2ZW50SGFuZGxlcihUU2VydmVyRXZlbnRIYW5kbGVyIHNlaCkKKyAgICAgICAgeworICAgICAgICAgICAgc2VydmVyRXZlbnRIYW5kbGVyID0gc2VoOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBUU2VydmVyRXZlbnRIYW5kbGVyIGdldEV2ZW50SGFuZGxlcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzZXJ2ZXJFdmVudEhhbmRsZXI7CisgICAgICAgIH0KIAotICAgIC8vTG9nIGRlbGVnYXRpb24KLSAgICBwdWJsaWMgZGVsZWdhdGUgdm9pZCBMb2dEZWxlZ2F0ZShzdHJpbmcgc3RyKTsKLSAgICBwcml2YXRlIExvZ0RlbGVnYXRlIF9sb2dEZWxlZ2F0ZTsKLSAgICBwcm90ZWN0ZWQgTG9nRGVsZWdhdGUgbG9nRGVsZWdhdGUKLSAgICB7Ci0gICAgICBnZXQgeyByZXR1cm4gX2xvZ0RlbGVnYXRlOyB9Ci0gICAgICBzZXQgeyBfbG9nRGVsZWdhdGUgPSAodmFsdWUgIT0gbnVsbCkgPyB2YWx1ZSA6IERlZmF1bHRMb2dEZWxlZ2F0ZTsgfQotICAgIH0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIHZvaWQgRGVmYXVsdExvZ0RlbGVnYXRlKHN0cmluZyBzKQotICAgIHsKLSAgICAgIENvbnNvbGUuRXJyb3IuV3JpdGVMaW5lKHMpOwotICAgIH0KKyAgICAgICAgLy9Mb2cgZGVsZWdhdGlvbgorICAgICAgICBwdWJsaWMgZGVsZWdhdGUgdm9pZCBMb2dEZWxlZ2F0ZShzdHJpbmcgc3RyKTsKKyAgICAgICAgcHJpdmF0ZSBMb2dEZWxlZ2F0ZSBfbG9nRGVsZWdhdGU7CisgICAgICAgIHByb3RlY3RlZCBMb2dEZWxlZ2F0ZSBsb2dEZWxlZ2F0ZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gX2xvZ0RlbGVnYXRlOyB9CisgICAgICAgICAgICBzZXQgeyBfbG9nRGVsZWdhdGUgPSAodmFsdWUgIT0gbnVsbCkgPyB2YWx1ZSA6IERlZmF1bHRMb2dEZWxlZ2F0ZTsgfQorICAgICAgICB9CisgICAgICAgIHByb3RlY3RlZCBzdGF0aWMgdm9pZCBEZWZhdWx0TG9nRGVsZWdhdGUoc3RyaW5nIHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIENvbnNvbGUuRXJyb3IuV3JpdGVMaW5lKHMpOworICAgICAgICB9CiAKLSAgICAvL0NvbnN0cnVjdGlvbgotICAgIHB1YmxpYyBUU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLAotICAgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCkKLSAgICAgIDogdGhpcyhwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLCBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksIERlZmF1bHRMb2dEZWxlZ2F0ZSkKLSAgICB7Ci0gICAgfQorICAgICAgICAvL0NvbnN0cnVjdGlvbgorICAgICAgICBwdWJsaWMgVFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0KQorICAgICAgICAgIDogdGhpcyhwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwKKyAgICAgICAgICAgICBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwKKyAgICAgICAgICAgICBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwKKyAgICAgICAgICAgICBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwKKyAgICAgICAgICAgICBEZWZhdWx0TG9nRGVsZWdhdGUpCisgICAgICAgIHsKKyAgICAgICAgfQogCi0gICAgcHVibGljIFRTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsCisgICAgICAgIHB1YmxpYyBUU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgIExvZ0RlbGVnYXRlIGxvZ0RlbGVnYXRlKQorICAgICAgICAgIDogdGhpcyhwcm9jZXNzb3IsCisgICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLAorICAgICAgICAgICAgIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLAorICAgICAgICAgICAgIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLAorICAgICAgICAgICAgIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLAorICAgICAgICAgICAgIGxvZ0RlbGVnYXRlKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgdHJhbnNwb3J0RmFjdG9yeSkKKyAgICAgICAgICA6IHRoaXMocHJvY2Vzc29yLAorICAgICAgICAgICAgIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksCisgICAgICAgICAgICAgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksCisgICAgICAgICAgICAgRGVmYXVsdExvZ0RlbGVnYXRlKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5KQorICAgICAgICAgIDogdGhpcyhwcm9jZXNzb3IsCisgICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICBwcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgcHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgRGVmYXVsdExvZ0RlbGVnYXRlKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwKICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3Rvcnkgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgIFRQcm90b2NvbEZhY3RvcnkgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IG91dHB1dFByb3RvY29sRmFjdG9yeSwKICAgICAgICAgICAgIExvZ0RlbGVnYXRlIGxvZ0RlbGVnYXRlKQotICAgICAgOiB0aGlzKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLCBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwgRGVmYXVsdExvZ0RlbGVnYXRlKQotICAgIHsKLSAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMucHJvY2Vzc29yRmFjdG9yeSA9IG5ldyBUU2luZ2xldG9uUHJvY2Vzc29yRmFjdG9yeShwcm9jZXNzb3IpOworICAgICAgICAgICAgdGhpcy5zZXJ2ZXJUcmFuc3BvcnQgPSBzZXJ2ZXJUcmFuc3BvcnQ7CisgICAgICAgICAgICB0aGlzLmlucHV0VHJhbnNwb3J0RmFjdG9yeSA9IGlucHV0VHJhbnNwb3J0RmFjdG9yeTsKKyAgICAgICAgICAgIHRoaXMub3V0cHV0VHJhbnNwb3J0RmFjdG9yeSA9IG91dHB1dFRyYW5zcG9ydEZhY3Rvcnk7CisgICAgICAgICAgICB0aGlzLmlucHV0UHJvdG9jb2xGYWN0b3J5ID0gaW5wdXRQcm90b2NvbEZhY3Rvcnk7CisgICAgICAgICAgICB0aGlzLm91dHB1dFByb3RvY29sRmFjdG9yeSA9IG91dHB1dFByb3RvY29sRmFjdG9yeTsKKyAgICAgICAgICAgIHRoaXMubG9nRGVsZWdhdGUgPSAobG9nRGVsZWdhdGUgIT0gbnVsbCkgPyBsb2dEZWxlZ2F0ZSA6IERlZmF1bHRMb2dEZWxlZ2F0ZTsKKyAgICAgICAgfQogCi0gICAgcHVibGljIFRTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsCi0gICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSB0cmFuc3BvcnRGYWN0b3J5KQotICAgICAgOiB0aGlzKHByb2Nlc3NvciwKLSAgICAgICAgIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksCi0gICAgICAgICBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwKLSAgICAgICAgIERlZmF1bHRMb2dEZWxlZ2F0ZSkKLSAgICB7Ci0gICAgfQorICAgICAgICBwdWJsaWMgVFNlcnZlcihUUHJvY2Vzc29yRmFjdG9yeSBwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgTG9nRGVsZWdhdGUgbG9nRGVsZWdhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMucHJvY2Vzc29yRmFjdG9yeSA9IHByb2Nlc3NvckZhY3Rvcnk7CisgICAgICAgICAgICB0aGlzLnNlcnZlclRyYW5zcG9ydCA9IHNlcnZlclRyYW5zcG9ydDsKKyAgICAgICAgICAgIHRoaXMuaW5wdXRUcmFuc3BvcnRGYWN0b3J5ID0gaW5wdXRUcmFuc3BvcnRGYWN0b3J5OworICAgICAgICAgICAgdGhpcy5vdXRwdXRUcmFuc3BvcnRGYWN0b3J5ID0gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeTsKKyAgICAgICAgICAgIHRoaXMuaW5wdXRQcm90b2NvbEZhY3RvcnkgPSBpbnB1dFByb3RvY29sRmFjdG9yeTsKKyAgICAgICAgICAgIHRoaXMub3V0cHV0UHJvdG9jb2xGYWN0b3J5ID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5OworICAgICAgICAgICAgdGhpcy5sb2dEZWxlZ2F0ZSA9IChsb2dEZWxlZ2F0ZSAhPSBudWxsKSA/IGxvZ0RlbGVnYXRlIDogRGVmYXVsdExvZ0RlbGVnYXRlOworICAgICAgICB9CiAKLSAgICBwdWJsaWMgVFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwKLSAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IHRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICAgIFRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5KQotICAgICAgOiB0aGlzKHByb2Nlc3NvciwKLSAgICAgICAgIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgcHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgcHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgICBEZWZhdWx0TG9nRGVsZWdhdGUpCi0gICAgeworICAgICAgICAvL0Fic3RyYWN0IEludGVyZmFjZQorICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBTZXJ2ZSgpOworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBTdG9wKCk7CiAgICAgfQotCi0gICAgcHVibGljIFRTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsCi0gICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICAgIFRQcm90b2NvbEZhY3RvcnkgaW5wdXRQcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgICAgIFRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgICAgICBMb2dEZWxlZ2F0ZSBsb2dEZWxlZ2F0ZSkKLSAgICB7Ci0gICAgICB0aGlzLnByb2Nlc3NvciA9IHByb2Nlc3NvcjsKLSAgICAgIHRoaXMuc2VydmVyVHJhbnNwb3J0ID0gc2VydmVyVHJhbnNwb3J0OwotICAgICAgdGhpcy5pbnB1dFRyYW5zcG9ydEZhY3RvcnkgPSBpbnB1dFRyYW5zcG9ydEZhY3Rvcnk7Ci0gICAgICB0aGlzLm91dHB1dFRyYW5zcG9ydEZhY3RvcnkgPSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5OwotICAgICAgdGhpcy5pbnB1dFByb3RvY29sRmFjdG9yeSA9IGlucHV0UHJvdG9jb2xGYWN0b3J5OwotICAgICAgdGhpcy5vdXRwdXRQcm90b2NvbEZhY3RvcnkgPSBvdXRwdXRQcm90b2NvbEZhY3Rvcnk7Ci0gICAgICB0aGlzLmxvZ0RlbGVnYXRlID0gKGxvZ0RlbGVnYXRlICE9IG51bGwpID8gbG9nRGVsZWdhdGUgOiBEZWZhdWx0TG9nRGVsZWdhdGU7Ci0gICAgfQotCi0gICAgLy9BYnN0cmFjdCBJbnRlcmZhY2UKLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBTZXJ2ZSgpOwotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIFN0b3AoKTsKLSAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvU2VydmVyL1RTZXJ2ZXJFdmVudEhhbmRsZXIuY3MgYi9saWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFNlcnZlckV2ZW50SGFuZGxlci5jcwppbmRleCA4NDNiMTY2Li5lODFlZmM2IDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFNlcnZlckV2ZW50SGFuZGxlci5jcworKysgYi9saWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFNlcnZlckV2ZW50SGFuZGxlci5jcwpAQCAtMjUsMjYgKzI1LDI5IEBACiAKIG5hbWVzcGFjZSBUaHJpZnQuU2VydmVyCiB7Ci0gIC8vLyA8c3VtbWFyeT4KLSAgLy8vIEludGVyZmFjZSBpbXBsZW1lbnRlZCBieSBzZXJ2ZXIgdXNlcnMgdG8gaGFuZGxlIGV2ZW50cyBmcm9tIHRoZSBzZXJ2ZXIKLSAgLy8vIDwvc3VtbWFyeT4KLSAgcHVibGljIGludGVyZmFjZSBUU2VydmVyRXZlbnRIYW5kbGVyCi0gIHsKICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIENhbGxlZCBiZWZvcmUgdGhlIHNlcnZlciBiZWdpbnMgKi8KKyAgICAvLy8gSW50ZXJmYWNlIGltcGxlbWVudGVkIGJ5IHNlcnZlciB1c2VycyB0byBoYW5kbGUgZXZlbnRzIGZyb20gdGhlIHNlcnZlci4KICAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHZvaWQgcHJlU2VydmUoKTsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIENhbGxlZCB3aGVuIGEgbmV3IGNsaWVudCBoYXMgY29ubmVjdGVkIGFuZCBpcyBhYm91dCB0byBiZWluZyBwcm9jZXNzaW5nICovCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBPYmplY3QgY3JlYXRlQ29udGV4dChUaHJpZnQuUHJvdG9jb2wuVFByb3RvY29sIGlucHV0LCBUaHJpZnQuUHJvdG9jb2wuVFByb3RvY29sIG91dHB1dCk7Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBDYWxsZWQgd2hlbiBhIGNsaWVudCBoYXMgZmluaXNoZWQgcmVxdWVzdC1oYW5kbGluZyB0byBkZWxldGUgc2VydmVyIGNvbnRleHQgKi8KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHZvaWQgZGVsZXRlQ29udGV4dChPYmplY3Qgc2VydmVyQ29udGV4dCwgVGhyaWZ0LlByb3RvY29sLlRQcm90b2NvbCBpbnB1dCwgVGhyaWZ0LlByb3RvY29sLlRQcm90b2NvbCBvdXRwdXQpOwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gQ2FsbGVkIHdoZW4gYSBjbGllbnQgaXMgYWJvdXQgdG8gY2FsbCB0aGUgcHJvY2Vzc29yICovCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICB2b2lkIHByb2Nlc3NDb250ZXh0KE9iamVjdCBzZXJ2ZXJDb250ZXh0LCBUaHJpZnQuVHJhbnNwb3J0LlRUcmFuc3BvcnQgdHJhbnNwb3J0KTsKLSAgfTsKKyAgICBwdWJsaWMgaW50ZXJmYWNlIFRTZXJ2ZXJFdmVudEhhbmRsZXIKKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENhbGxlZCBiZWZvcmUgdGhlIHNlcnZlciBiZWdpbnMuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHZvaWQgcHJlU2VydmUoKTsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDYWxsZWQgd2hlbiBhIG5ldyBjbGllbnQgaGFzIGNvbm5lY3RlZCBhbmQgaXMgYWJvdXQgdG8gYmVpbmcgcHJvY2Vzc2luZy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgb2JqZWN0IGNyZWF0ZUNvbnRleHQoVGhyaWZ0LlByb3RvY29sLlRQcm90b2NvbCBpbnB1dCwgVGhyaWZ0LlByb3RvY29sLlRQcm90b2NvbCBvdXRwdXQpOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENhbGxlZCB3aGVuIGEgY2xpZW50IGhhcyBmaW5pc2hlZCByZXF1ZXN0LWhhbmRsaW5nIHRvIGRlbGV0ZSBzZXJ2ZXIgY29udGV4dC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgdm9pZCBkZWxldGVDb250ZXh0KG9iamVjdCBzZXJ2ZXJDb250ZXh0LCBUaHJpZnQuUHJvdG9jb2wuVFByb3RvY29sIGlucHV0LCBUaHJpZnQuUHJvdG9jb2wuVFByb3RvY29sIG91dHB1dCk7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ2FsbGVkIHdoZW4gYSBjbGllbnQgaXMgYWJvdXQgdG8gY2FsbCB0aGUgcHJvY2Vzc29yLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICB2b2lkIHByb2Nlc3NDb250ZXh0KG9iamVjdCBzZXJ2ZXJDb250ZXh0LCBUaHJpZnQuVHJhbnNwb3J0LlRUcmFuc3BvcnQgdHJhbnNwb3J0KTsKKyAgICB9OwogfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvU2VydmVyL1RTaW1wbGVTZXJ2ZXIuY3MgYi9saWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFNpbXBsZVNlcnZlci5jcwppbmRleCAzNmJiZTlkLi40ZTdlYTk2IDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFNpbXBsZVNlcnZlci5jcworKysgYi9saWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFNpbXBsZVNlcnZlci5jcwpAQCAtMjcsMTM1ICsyNywxNTQgQEAKIAogbmFtZXNwYWNlIFRocmlmdC5TZXJ2ZXIKIHsKLSAgLy8vIDxzdW1tYXJ5PgotICAvLy8gU2ltcGxlIHNpbmdsZS10aHJlYWRlZCBzZXJ2ZXIgZm9yIHRlc3RpbmcKLSAgLy8vIDwvc3VtbWFyeT4KLSAgcHVibGljIGNsYXNzIFRTaW1wbGVTZXJ2ZXIgOiBUU2VydmVyCi0gIHsKLSAgICBwcml2YXRlIGJvb2wgc3RvcCA9IGZhbHNlOwotCi0gICAgcHVibGljIFRTaW1wbGVTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsCi0gICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0KQotICAgICAgOiBiYXNlKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLCBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwgRGVmYXVsdExvZ0RlbGVnYXRlKQorICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gU2ltcGxlIHNpbmdsZS10aHJlYWRlZCBzZXJ2ZXIgZm9yIHRlc3RpbmcuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgY2xhc3MgVFNpbXBsZVNlcnZlciA6IFRTZXJ2ZXIKICAgICB7Ci0gICAgfQorICAgICAgICBwcml2YXRlIGJvb2wgc3RvcCA9IGZhbHNlOwogCi0gICAgcHVibGljIFRTaW1wbGVTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsCi0gICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgICAgICBMb2dEZWxlZ2F0ZSBsb2dEZWwpCi0gICAgICA6IGJhc2UocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLCBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLCBsb2dEZWwpCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyBUU2ltcGxlU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLAotICAgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgdHJhbnNwb3J0RmFjdG9yeSkKLSAgICAgIDogYmFzZShwcm9jZXNzb3IsCi0gICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLAotICAgICAgICAgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksCi0gICAgICAgICAgIERlZmF1bHRMb2dEZWxlZ2F0ZSkKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIFRTaW1wbGVTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsCi0gICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeSkKLSAgICAgIDogYmFzZShwcm9jZXNzb3IsCi0gICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgIHByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgIHByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgIERlZmF1bHRMb2dEZWxlZ2F0ZSkKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIHZvaWQgU2VydmUoKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQuTGlzdGVuKCk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpCi0gICAgICB7Ci0gICAgICAgIGxvZ0RlbGVnYXRlKHR0eC5Ub1N0cmluZygpKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICAvL0ZpcmUgdGhlIHByZVNlcnZlIHNlcnZlciBldmVudCB3aGVuIHNlcnZlciBpcyB1cCBidXQgYmVmb3JlIGFueSBjbGllbnQgY29ubmVjdGlvbnMKLSAgICAgIGlmIChzZXJ2ZXJFdmVudEhhbmRsZXIgIT0gbnVsbCkKLSAgICAgICAgc2VydmVyRXZlbnRIYW5kbGVyLnByZVNlcnZlKCk7Ci0KLSAgICAgIHdoaWxlICghc3RvcCkKLSAgICAgIHsKLSAgICAgICAgVFRyYW5zcG9ydCBjbGllbnQgPSBudWxsOwotICAgICAgICBUVHJhbnNwb3J0IGlucHV0VHJhbnNwb3J0ID0gbnVsbDsKLSAgICAgICAgVFRyYW5zcG9ydCBvdXRwdXRUcmFuc3BvcnQgPSBudWxsOwotICAgICAgICBUUHJvdG9jb2wgaW5wdXRQcm90b2NvbCA9IG51bGw7Ci0gICAgICAgIFRQcm90b2NvbCBvdXRwdXRQcm90b2NvbCA9IG51bGw7Ci0gICAgICAgIE9iamVjdCBjb25uZWN0aW9uQ29udGV4dCA9IG51bGw7Ci0gICAgICAgIHRyeQorICAgICAgICBwdWJsaWMgVFNpbXBsZVNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0KQorICAgICAgICAgIDogYmFzZShwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLCBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksIERlZmF1bHRMb2dEZWxlZ2F0ZSkKICAgICAgICAgewotICAgICAgICAgIHVzaW5nIChjbGllbnQgPSBzZXJ2ZXJUcmFuc3BvcnQuQWNjZXB0KCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKGNsaWVudCAhPSBudWxsKQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRTaW1wbGVTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgIExvZ0RlbGVnYXRlIGxvZ0RlbCkKKyAgICAgICAgICA6IGJhc2UocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLCBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLCBsb2dEZWwpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUU2ltcGxlU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSB0cmFuc3BvcnRGYWN0b3J5KQorICAgICAgICAgIDogYmFzZShwcm9jZXNzb3IsCisgICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwKKyAgICAgICAgICAgICBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwKKyAgICAgICAgICAgICAgIERlZmF1bHRMb2dEZWxlZ2F0ZSkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRTaW1wbGVTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsCisgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeSkKKyAgICAgICAgICAgIDogYmFzZShwcm9jZXNzb3IsCisgICAgICAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgIHByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgIHByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgIERlZmF1bHRMb2dEZWxlZ2F0ZSkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRTaW1wbGVTZXJ2ZXIoVFByb2Nlc3NvckZhY3RvcnkgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5KQorICAgICAgICAgIDogYmFzZShwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgICAgICAgIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgcHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgIHByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICBEZWZhdWx0TG9nRGVsZWdhdGUpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFNlcnZlKCkKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHVzaW5nIChpbnB1dFRyYW5zcG9ydCA9IGlucHV0VHJhbnNwb3J0RmFjdG9yeS5HZXRUcmFuc3BvcnQoY2xpZW50KSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHVzaW5nIChvdXRwdXRUcmFuc3BvcnQgPSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LkdldFRyYW5zcG9ydChjbGllbnQpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGlucHV0UHJvdG9jb2wgPSBpbnB1dFByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbChpbnB1dFRyYW5zcG9ydCk7Ci0gICAgICAgICAgICAgICAgICBvdXRwdXRQcm90b2NvbCA9IG91dHB1dFByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbChvdXRwdXRUcmFuc3BvcnQpOwotCi0gICAgICAgICAgICAgICAgICAvL1JlY292ZXIgZXZlbnQgaGFuZGxlciAoaWYgYW55KSBhbmQgZmlyZSBjcmVhdGVDb250ZXh0IHNlcnZlciBldmVudCB3aGVuIGEgY2xpZW50IGNvbm5lY3RzCi0gICAgICAgICAgICAgICAgICBpZiAoc2VydmVyRXZlbnRIYW5kbGVyICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25Db250ZXh0ID0gc2VydmVyRXZlbnRIYW5kbGVyLmNyZWF0ZUNvbnRleHQoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpOwotCi0gICAgICAgICAgICAgICAgICAvL1Byb2Nlc3MgY2xpZW50IHJlcXVlc3RzIHVudGlsIGNsaWVudCBkaXNjb25uZWN0cwotICAgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghaW5wdXRUcmFuc3BvcnQuUGVlaygpKQotICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIC8vRmlyZSBwcm9jZXNzQ29udGV4dCBzZXJ2ZXIgZXZlbnQKLSAgICAgICAgICAgICAgICAgICAgLy9OLkIuIFRoaXMgaXMgdGhlIHBhdHRlcm4gaW1wbGVtZW50ZWQgaW4gQysrIGFuZCB0aGUgZXZlbnQgZmlyZXMgcHJvdmlzaW9uYWxseS4KLSAgICAgICAgICAgICAgICAgICAgLy9UaGF0IGlzIHRvIHNheSBpdCBtYXkgYmUgbWFueSBtaW51dGVzIGJldHdlZW4gdGhlIGV2ZW50IGZpcmluZyBhbmQgdGhlIGNsaWVudCByZXF1ZXN0Ci0gICAgICAgICAgICAgICAgICAgIC8vYWN0dWFsbHkgYXJyaXZpbmcgb3IgdGhlIGNsaWVudCBtYXkgaGFuZyB1cCB3aXRob3V0IGV2ZXIgbWFrZWluZyBhIHJlcXVlc3QuCi0gICAgICAgICAgICAgICAgICAgIGlmIChzZXJ2ZXJFdmVudEhhbmRsZXIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJFdmVudEhhbmRsZXIucHJvY2Vzc0NvbnRleHQoY29ubmVjdGlvbkNvbnRleHQsIGlucHV0VHJhbnNwb3J0KTsKLSAgICAgICAgICAgICAgICAgICAgLy9Qcm9jZXNzIGNsaWVudCByZXF1ZXN0IChibG9ja3MgdW50aWwgdHJhbnNwb3J0IGlzIHJlYWRhYmxlKQotICAgICAgICAgICAgICAgICAgICBpZiAoIXByb2Nlc3Nvci5Qcm9jZXNzKGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKSkKLSAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQuTGlzdGVuKCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgLy9Vc3VhbGx5IGEgY2xpZW50IGRpc2Nvbm5lY3QsIGV4cGVjdGVkCi0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiB4KQotICAgICAgICB7Ci0gICAgICAgICAgLy9VbmV4cGVjdGVkCi0gICAgICAgICAgbG9nRGVsZWdhdGUoeC5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgIGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2dEZWxlZ2F0ZSh0dHguVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvL0ZpcmUgdGhlIHByZVNlcnZlIHNlcnZlciBldmVudCB3aGVuIHNlcnZlciBpcyB1cCBidXQgYmVmb3JlIGFueSBjbGllbnQgY29ubmVjdGlvbnMKKyAgICAgICAgICAgIGlmIChzZXJ2ZXJFdmVudEhhbmRsZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBzZXJ2ZXJFdmVudEhhbmRsZXIucHJlU2VydmUoKTsKKworICAgICAgICAgICAgd2hpbGUgKCFzdG9wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFRQcm9jZXNzb3IgcHJvY2Vzc29yID0gbnVsbDsKKyAgICAgICAgICAgICAgICBUVHJhbnNwb3J0IGNsaWVudCA9IG51bGw7CisgICAgICAgICAgICAgICAgVFRyYW5zcG9ydCBpbnB1dFRyYW5zcG9ydCA9IG51bGw7CisgICAgICAgICAgICAgICAgVFRyYW5zcG9ydCBvdXRwdXRUcmFuc3BvcnQgPSBudWxsOworICAgICAgICAgICAgICAgIFRQcm90b2NvbCBpbnB1dFByb3RvY29sID0gbnVsbDsKKyAgICAgICAgICAgICAgICBUUHJvdG9jb2wgb3V0cHV0UHJvdG9jb2wgPSBudWxsOworICAgICAgICAgICAgICAgIG9iamVjdCBjb25uZWN0aW9uQ29udGV4dCA9IG51bGw7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1c2luZyAoY2xpZW50ID0gc2VydmVyVHJhbnNwb3J0LkFjY2VwdCgpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzb3IgPSBwcm9jZXNzb3JGYWN0b3J5LkdldFByb2Nlc3NvcihjbGllbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaWVudCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIChpbnB1dFRyYW5zcG9ydCA9IGlucHV0VHJhbnNwb3J0RmFjdG9yeS5HZXRUcmFuc3BvcnQoY2xpZW50KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIChvdXRwdXRUcmFuc3BvcnQgPSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LkdldFRyYW5zcG9ydChjbGllbnQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFByb3RvY29sID0gaW5wdXRQcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2woaW5wdXRUcmFuc3BvcnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2wgPSBvdXRwdXRQcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wob3V0cHV0VHJhbnNwb3J0KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9SZWNvdmVyIGV2ZW50IGhhbmRsZXIgKGlmIGFueSkgYW5kIGZpcmUgY3JlYXRlQ29udGV4dCBzZXJ2ZXIgZXZlbnQgd2hlbiBhIGNsaWVudCBjb25uZWN0cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZlckV2ZW50SGFuZGxlciAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25Db250ZXh0ID0gc2VydmVyRXZlbnRIYW5kbGVyLmNyZWF0ZUNvbnRleHQoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1Byb2Nlc3MgY2xpZW50IHJlcXVlc3RzIHVudGlsIGNsaWVudCBkaXNjb25uZWN0cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCFzdG9wKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaW5wdXRUcmFuc3BvcnQuUGVlaygpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vRmlyZSBwcm9jZXNzQ29udGV4dCBzZXJ2ZXIgZXZlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL04uQi4gVGhpcyBpcyB0aGUgcGF0dGVybiBpbXBsZW1lbnRlZCBpbiBDKysgYW5kIHRoZSBldmVudCBmaXJlcyBwcm92aXNpb25hbGx5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vVGhhdCBpcyB0byBzYXkgaXQgbWF5IGJlIG1hbnkgbWludXRlcyBiZXR3ZWVuIHRoZSBldmVudCBmaXJpbmcgYW5kIHRoZSBjbGllbnQgcmVxdWVzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vYWN0dWFsbHkgYXJyaXZpbmcgb3IgdGhlIGNsaWVudCBtYXkgaGFuZyB1cCB3aXRob3V0IGV2ZXIgbWFrZWluZyBhIHJlcXVlc3QuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZlckV2ZW50SGFuZGxlciAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJFdmVudEhhbmRsZXIucHJvY2Vzc0NvbnRleHQoY29ubmVjdGlvbkNvbnRleHQsIGlucHV0VHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1Byb2Nlc3MgY2xpZW50IHJlcXVlc3QgKGJsb2NrcyB1bnRpbCB0cmFuc3BvcnQgaXMgcmVhZGFibGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwcm9jZXNzb3IuUHJvY2VzcyhpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghc3RvcCB8fCB0dHguVHlwZSAhPSBUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuSW50ZXJydXB0ZWQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZ0RlbGVnYXRlKHR0eC5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIHgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvL1VuZXhwZWN0ZWQKKyAgICAgICAgICAgICAgICAgICAgbG9nRGVsZWdhdGUoeC5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvL0ZpcmUgZGVsZXRlQ29udGV4dCBzZXJ2ZXIgZXZlbnQgYWZ0ZXIgY2xpZW50IGRpc2Nvbm5lY3RzCisgICAgICAgICAgICAgICAgaWYgKHNlcnZlckV2ZW50SGFuZGxlciAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJFdmVudEhhbmRsZXIuZGVsZXRlQ29udGV4dChjb25uZWN0aW9uQ29udGV4dCwgaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgLy9GaXJlIGRlbGV0ZUNvbnRleHQgc2VydmVyIGV2ZW50IGFmdGVyIGNsaWVudCBkaXNjb25uZWN0cwotICAgICAgICBpZiAoc2VydmVyRXZlbnRIYW5kbGVyICE9IG51bGwpCi0gICAgICAgICAgc2VydmVyRXZlbnRIYW5kbGVyLmRlbGV0ZUNvbnRleHQoY29ubmVjdGlvbkNvbnRleHQsIGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKTsKLSAgICAgIH0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgU3RvcCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0b3AgPSB0cnVlOworICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0LkNsb3NlKCk7CisgICAgICAgIH0KICAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBTdG9wKCkKLSAgICB7Ci0gICAgICBzdG9wID0gdHJ1ZTsKLSAgICAgIHNlcnZlclRyYW5zcG9ydC5DbG9zZSgpOwotICAgIH0KLSAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvU2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmNzIGIvbGliL2NzaGFycC9zcmMvU2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmNzCmluZGV4IGFmZjU3MzMuLmE0OTRjZTcgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5jcworKysgYi9saWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuY3MKQEAgLTI4LDE4OSArMjgsMjY4IEBACiAKIG5hbWVzcGFjZSBUaHJpZnQuU2VydmVyCiB7Ci0gIC8vLyA8c3VtbWFyeT4KLSAgLy8vIFNlcnZlciB0aGF0IHVzZXMgQyMgYnVpbHQtaW4gVGhyZWFkUG9vbCB0byBzcGF3biB0aHJlYWRzIHdoZW4gaGFuZGxpbmcgcmVxdWVzdHMKLSAgLy8vIDwvc3VtbWFyeT4KLSAgcHVibGljIGNsYXNzIFRUaHJlYWRQb29sU2VydmVyIDogVFNlcnZlcgotICB7Ci0gICAgcHJpdmF0ZSBjb25zdCBpbnQgREVGQVVMVF9NSU5fVEhSRUFEUyA9IDEwOwotICAgIHByaXZhdGUgY29uc3QgaW50IERFRkFVTFRfTUFYX1RIUkVBRFMgPSAxMDA7Ci0gICAgcHJpdmF0ZSB2b2xhdGlsZSBib29sIHN0b3AgPSBmYWxzZTsKLQotICAgIHB1YmxpYyBUVGhyZWFkUG9vbFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQpCi0gICAgICA6IHRoaXMocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksCi0gICAgICAgICBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksCi0gICAgICAgICBERUZBVUxUX01JTl9USFJFQURTLCBERUZBVUxUX01BWF9USFJFQURTLCBEZWZhdWx0TG9nRGVsZWdhdGUpCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyBUVGhyZWFkUG9vbFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsIExvZ0RlbGVnYXRlIGxvZ0RlbGVnYXRlKQotICAgICAgOiB0aGlzKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLAotICAgICAgICAgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLAotICAgICAgICAgREVGQVVMVF9NSU5fVEhSRUFEUywgREVGQVVMVF9NQVhfVEhSRUFEUywgbG9nRGVsZWdhdGUpCi0gICAgewotICAgIH0KLQotCi0gICAgcHVibGljIFRUaHJlYWRQb29sU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgdHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnkpCi0gICAgICA6IHRoaXMocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LCB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgcHJvdG9jb2xGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnksCi0gICAgICAgICBERUZBVUxUX01JTl9USFJFQURTLCBERUZBVUxUX01BWF9USFJFQURTLCBEZWZhdWx0TG9nRGVsZWdhdGUpCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyBUVGhyZWFkUG9vbFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3Rvcnkgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBpbnB1dFByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBvdXRwdXRQcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgICAgICAgIGludCBtaW5UaHJlYWRQb29sVGhyZWFkcywgaW50IG1heFRocmVhZFBvb2xUaHJlYWRzLCBMb2dEZWxlZ2F0ZSBsb2dEZWwpCi0gICAgICA6IGJhc2UocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LCBsb2dEZWwpCi0gICAgewotICAgICAgbG9jayAodHlwZW9mKFRUaHJlYWRQb29sU2VydmVyKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKCFUaHJlYWRQb29sLlNldE1heFRocmVhZHMobWF4VGhyZWFkUG9vbFRocmVhZHMsIG1heFRocmVhZFBvb2xUaHJlYWRzKSkKLSAgICAgICAgewotICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIkVycm9yOiBjb3VsZCBub3QgU2V0TWF4VGhyZWFkcyBpbiBUaHJlYWRQb29sIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFUaHJlYWRQb29sLlNldE1pblRocmVhZHMobWluVGhyZWFkUG9vbFRocmVhZHMsIG1pblRocmVhZFBvb2xUaHJlYWRzKSkKLSAgICAgICAgewotICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIkVycm9yOiBjb3VsZCBub3QgU2V0TWluVGhyZWFkcyBpbiBUaHJlYWRQb29sIik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLQogICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gVXNlIG5ldyBUaHJlYWRQb29sIHRocmVhZCBmb3IgZWFjaCBuZXcgY2xpZW50IGNvbm5lY3Rpb24KKyAgICAvLy8gU2VydmVyIHRoYXQgdXNlcyBDIyBidWlsdC1pbiBUaHJlYWRQb29sIHRvIHNwYXduIHRocmVhZHMgd2hlbiBoYW5kbGluZyByZXF1ZXN0cy4KICAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFNlcnZlKCkKKyAgICBwdWJsaWMgY2xhc3MgVFRocmVhZFBvb2xTZXJ2ZXIgOiBUU2VydmVyCiAgICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIHNlcnZlclRyYW5zcG9ydC5MaXN0ZW4oKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkKLSAgICAgIHsKLSAgICAgICAgbG9nRGVsZWdhdGUoIkVycm9yLCBjb3VsZCBub3QgbGlzdGVuIG9uIFNlcnZlclRyYW5zcG9ydDogIiArIHR0eCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KKyAgICAgICAgcHJpdmF0ZSBjb25zdCBpbnQgREVGQVVMVF9NSU5fVEhSRUFEUyA9IC0xOyAgLy8gdXNlIC5ORVQgVGhyZWFkUG9vbCBkZWZhdWx0cworICAgICAgICBwcml2YXRlIGNvbnN0IGludCBERUZBVUxUX01BWF9USFJFQURTID0gLTE7ICAvLyB1c2UgLk5FVCBUaHJlYWRQb29sIGRlZmF1bHRzCisgICAgICAgIHByaXZhdGUgdm9sYXRpbGUgYm9vbCBzdG9wID0gZmFsc2U7CiAKLSAgICAgIC8vRmlyZSB0aGUgcHJlU2VydmUgc2VydmVyIGV2ZW50IHdoZW4gc2VydmVyIGlzIHVwIGJ1dCBiZWZvcmUgYW55IGNsaWVudCBjb25uZWN0aW9ucwotICAgICAgaWYgKHNlcnZlckV2ZW50SGFuZGxlciAhPSBudWxsKQotICAgICAgICBzZXJ2ZXJFdmVudEhhbmRsZXIucHJlU2VydmUoKTsKKyAgICAgICAgcHVibGljIHN0cnVjdCBDb25maWd1cmF0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgTWluV29ya2VyVGhyZWFkczsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgTWF4V29ya2VyVGhyZWFkczsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgTWluSU9UaHJlYWRzOworICAgICAgICAgICAgcHVibGljIGludCBNYXhJT1RocmVhZHM7CiAKLSAgICAgIHdoaWxlICghc3RvcCkKLSAgICAgIHsKLSAgICAgICAgaW50IGZhaWx1cmVDb3VudCA9IDA7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgVFRyYW5zcG9ydCBjbGllbnQgPSBzZXJ2ZXJUcmFuc3BvcnQuQWNjZXB0KCk7Ci0gICAgICAgICAgVGhyZWFkUG9vbC5RdWV1ZVVzZXJXb3JrSXRlbSh0aGlzLkV4ZWN1dGUsIGNsaWVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKHN0b3ApCi0gICAgICAgICAgewotICAgICAgICAgICAgbG9nRGVsZWdhdGUoIlRUaHJlYWRQb29sU2VydmVyIHdhcyBzaHV0dGluZyBkb3duLCBjYXVnaHQgIiArIHR0eC5HZXRUeXBlKCkuTmFtZSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICArK2ZhaWx1cmVDb3VudDsKLSAgICAgICAgICAgIGxvZ0RlbGVnYXRlKHR0eC5Ub1N0cmluZygpKTsKLSAgICAgICAgICB9CisgICAgICAgICAgICBwdWJsaWMgQ29uZmlndXJhdGlvbihpbnQgbWluID0gREVGQVVMVF9NSU5fVEhSRUFEUywgaW50IG1heCA9IERFRkFVTFRfTUFYX1RIUkVBRFMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTWluV29ya2VyVGhyZWFkcyA9IG1pbjsKKyAgICAgICAgICAgICAgICBNYXhXb3JrZXJUaHJlYWRzID0gbWF4OworICAgICAgICAgICAgICAgIE1pbklPVGhyZWFkcyA9IG1pbjsKKyAgICAgICAgICAgICAgICBNYXhJT1RocmVhZHMgPSBtYXg7CisgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIHB1YmxpYyBDb25maWd1cmF0aW9uKGludCBtaW5Xb3JrLCBpbnQgbWF4V29yaywgaW50IG1pbklPLCBpbnQgbWF4SU8pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTWluV29ya2VyVGhyZWFkcyA9IG1pbldvcms7CisgICAgICAgICAgICAgICAgTWF4V29ya2VyVGhyZWFkcyA9IG1heFdvcms7CisgICAgICAgICAgICAgICAgTWluSU9UaHJlYWRzID0gbWluSU87CisgICAgICAgICAgICAgICAgTWF4SU9UaHJlYWRzID0gbWF4SU87CisgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgIH0KIAotICAgICAgaWYgKHN0b3ApCi0gICAgICB7Ci0gICAgICAgIHRyeQorICAgICAgICBwdWJsaWMgVFRocmVhZFBvb2xTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0KQorICAgICAgICAgICAgOiB0aGlzKG5ldyBUU2luZ2xldG9uUHJvY2Vzc29yRmFjdG9yeShwcm9jZXNzb3IpLCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLAorICAgICAgICAgICAgIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLCBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwKKyAgICAgICAgICAgICBuZXcgQ29uZmlndXJhdGlvbigpLCBEZWZhdWx0TG9nRGVsZWdhdGUpCiAgICAgICAgIHsKLSAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQuQ2xvc2UoKTsKICAgICAgICAgfQotICAgICAgICBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpCisKKyAgICAgICAgcHVibGljIFRUaHJlYWRQb29sU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLCBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwgTG9nRGVsZWdhdGUgbG9nRGVsZWdhdGUpCisgICAgICAgICAgICA6IHRoaXMobmV3IFRTaW5nbGV0b25Qcm9jZXNzb3JGYWN0b3J5KHByb2Nlc3NvciksIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksCisgICAgICAgICAgICAgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLAorICAgICAgICAgICAgIG5ldyBDb25maWd1cmF0aW9uKCksIGxvZ0RlbGVnYXRlKQogICAgICAgICB7Ci0gICAgICAgICAgbG9nRGVsZWdhdGUoIlRTZXJ2ZXJUcmFuc3BvcnQgZmFpbGVkIG9uIGNsb3NlOiAiICsgdHR4Lk1lc3NhZ2UpOwogICAgICAgICB9Ci0gICAgICAgIHN0b3AgPSBmYWxzZTsKLSAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFRocmVhZFBvb2xTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsCisgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeSkKKyAgICAgICAgICAgIDogdGhpcyhuZXcgVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkocHJvY2Vzc29yKSwgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSwgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgIHByb3RvY29sRmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgbmV3IENvbmZpZ3VyYXRpb24oKSwgRGVmYXVsdExvZ0RlbGVnYXRlKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFRocmVhZFBvb2xTZXJ2ZXIoVFByb2Nlc3NvckZhY3RvcnkgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5KQorICAgICAgICAgICAgOiB0aGlzKHByb2Nlc3NvckZhY3RvcnksIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LCB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgIHByb3RvY29sRmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgIG5ldyBDb25maWd1cmF0aW9uKCksIERlZmF1bHRMb2dEZWxlZ2F0ZSkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRUaHJlYWRQb29sU2VydmVyKFRQcm9jZXNzb3JGYWN0b3J5IHByb2Nlc3NvckZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBvdXRwdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBpbnQgbWluVGhyZWFkUG9vbFRocmVhZHMsIGludCBtYXhUaHJlYWRQb29sVGhyZWFkcywgTG9nRGVsZWdhdGUgbG9nRGVsKQorICAgICAgICAgICAgOiB0aGlzKHByb2Nlc3NvckZhY3RvcnksIHNlcnZlclRyYW5zcG9ydCwgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LCBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5LCBvdXRwdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgbmV3IENvbmZpZ3VyYXRpb24obWluVGhyZWFkUG9vbFRocmVhZHMsIG1heFRocmVhZFBvb2xUaHJlYWRzKSwKKyAgICAgICAgICAgICBsb2dEZWwpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUVGhyZWFkUG9vbFNlcnZlcihUUHJvY2Vzc29yRmFjdG9yeSBwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbiB0aHJlYWRDb25maWcsCisgICAgICAgICAgICAgICAgICAgICBMb2dEZWxlZ2F0ZSBsb2dEZWwpCisgICAgICAgICAgICA6IGJhc2UocHJvY2Vzc29yRmFjdG9yeSwgc2VydmVyVHJhbnNwb3J0LCBpbnB1dFRyYW5zcG9ydEZhY3RvcnksIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LCBsb2dEZWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvY2sgKHR5cGVvZihUVGhyZWFkUG9vbFNlcnZlcikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCh0aHJlYWRDb25maWcuTWF4V29ya2VyVGhyZWFkcyA+IDApIHx8ICh0aHJlYWRDb25maWcuTWF4SU9UaHJlYWRzID4gMCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgd29yaywgY29tbTsKKyAgICAgICAgICAgICAgICAgICAgVGhyZWFkUG9vbC5HZXRNYXhUaHJlYWRzKG91dCB3b3JrLCBvdXQgY29tbSk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0aHJlYWRDb25maWcuTWF4V29ya2VyVGhyZWFkcyA+IDApCisgICAgICAgICAgICAgICAgICAgICAgICB3b3JrID0gdGhyZWFkQ29uZmlnLk1heFdvcmtlclRocmVhZHM7CisgICAgICAgICAgICAgICAgICAgIGlmICh0aHJlYWRDb25maWcuTWF4SU9UaHJlYWRzID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbW0gPSB0aHJlYWRDb25maWcuTWF4SU9UaHJlYWRzOworICAgICAgICAgICAgICAgICAgICBpZiAoIVRocmVhZFBvb2wuU2V0TWF4VGhyZWFkcyh3b3JrLCBjb21tKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIkVycm9yOiBjb3VsZCBub3QgU2V0TWF4VGhyZWFkcyBpbiBUaHJlYWRQb29sIik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aHJlYWRDb25maWcuTWluV29ya2VyVGhyZWFkcyA+IDApIHx8ICh0aHJlYWRDb25maWcuTWluSU9UaHJlYWRzID4gMCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgd29yaywgY29tbTsKKyAgICAgICAgICAgICAgICAgICAgVGhyZWFkUG9vbC5HZXRNaW5UaHJlYWRzKG91dCB3b3JrLCBvdXQgY29tbSk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0aHJlYWRDb25maWcuTWluV29ya2VyVGhyZWFkcyA+IDApCisgICAgICAgICAgICAgICAgICAgICAgICB3b3JrID0gdGhyZWFkQ29uZmlnLk1pbldvcmtlclRocmVhZHM7CisgICAgICAgICAgICAgICAgICAgIGlmICh0aHJlYWRDb25maWcuTWluSU9UaHJlYWRzID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbW0gPSB0aHJlYWRDb25maWcuTWluSU9UaHJlYWRzOworICAgICAgICAgICAgICAgICAgICBpZiAoIVRocmVhZFBvb2wuU2V0TWluVGhyZWFkcyh3b3JrLCBjb21tKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIkVycm9yOiBjb3VsZCBub3QgU2V0TWluVGhyZWFkcyBpbiBUaHJlYWRQb29sIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBVc2UgbmV3IFRocmVhZFBvb2wgdGhyZWFkIGZvciBlYWNoIG5ldyBjbGllbnQgY29ubmVjdGlvbi4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgU2VydmUoKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQuTGlzdGVuKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9nRGVsZWdhdGUoIkVycm9yLCBjb3VsZCBub3QgbGlzdGVuIG9uIFNlcnZlclRyYW5zcG9ydDogIiArIHR0eCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvL0ZpcmUgdGhlIHByZVNlcnZlIHNlcnZlciBldmVudCB3aGVuIHNlcnZlciBpcyB1cCBidXQgYmVmb3JlIGFueSBjbGllbnQgY29ubmVjdGlvbnMKKyAgICAgICAgICAgIGlmIChzZXJ2ZXJFdmVudEhhbmRsZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBzZXJ2ZXJFdmVudEhhbmRsZXIucHJlU2VydmUoKTsKKworICAgICAgICAgICAgd2hpbGUgKCFzdG9wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBmYWlsdXJlQ291bnQgPSAwOworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydCBjbGllbnQgPSBzZXJ2ZXJUcmFuc3BvcnQuQWNjZXB0KCk7CisgICAgICAgICAgICAgICAgICAgIFRocmVhZFBvb2wuUXVldWVVc2VyV29ya0l0ZW0odGhpcy5FeGVjdXRlLCBjbGllbnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIXN0b3AgfHwgdHR4LlR5cGUgIT0gVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkludGVycnVwdGVkKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICArK2ZhaWx1cmVDb3VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZ0RlbGVnYXRlKHR0eC5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc3RvcCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNlcnZlclRyYW5zcG9ydC5DbG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBsb2dEZWxlZ2F0ZSgiVFNlcnZlclRyYW5zcG9ydCBmYWlsZWQgb24gY2xvc2U6ICIgKyB0dHguTWVzc2FnZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0b3AgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIExvb3BzIG9uIHByb2Nlc3NpbmcgYSBjbGllbnQgZm9yZXZlcgorICAgICAgICAvLy8gdGhyZWFkQ29udGV4dCB3aWxsIGJlIGEgVFRyYW5zcG9ydCBpbnN0YW5jZQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InRocmVhZENvbnRleHQiPjwvcGFyYW0+CisgICAgICAgIHByaXZhdGUgdm9pZCBFeGVjdXRlKG9iamVjdCB0aHJlYWRDb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICB1c2luZyAoVFRyYW5zcG9ydCBjbGllbnQgPSAoVFRyYW5zcG9ydCl0aHJlYWRDb250ZXh0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFRQcm9jZXNzb3IgcHJvY2Vzc29yID0gcHJvY2Vzc29yRmFjdG9yeS5HZXRQcm9jZXNzb3IoY2xpZW50LCB0aGlzKTsKKyAgICAgICAgICAgICAgICBUVHJhbnNwb3J0IGlucHV0VHJhbnNwb3J0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICBUVHJhbnNwb3J0IG91dHB1dFRyYW5zcG9ydCA9IG51bGw7CisgICAgICAgICAgICAgICAgVFByb3RvY29sIGlucHV0UHJvdG9jb2wgPSBudWxsOworICAgICAgICAgICAgICAgIFRQcm90b2NvbCBvdXRwdXRQcm90b2NvbCA9IG51bGw7CisgICAgICAgICAgICAgICAgb2JqZWN0IGNvbm5lY3Rpb25Db250ZXh0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFRyYW5zcG9ydCA9IGlucHV0VHJhbnNwb3J0RmFjdG9yeS5HZXRUcmFuc3BvcnQoY2xpZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFRyYW5zcG9ydCA9IG91dHB1dFRyYW5zcG9ydEZhY3RvcnkuR2V0VHJhbnNwb3J0KGNsaWVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFByb3RvY29sID0gaW5wdXRQcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2woaW5wdXRUcmFuc3BvcnQpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2wgPSBvdXRwdXRQcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wob3V0cHV0VHJhbnNwb3J0KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy9SZWNvdmVyIGV2ZW50IGhhbmRsZXIgKGlmIGFueSkgYW5kIGZpcmUgY3JlYXRlQ29udGV4dCBzZXJ2ZXIgZXZlbnQgd2hlbiBhIGNsaWVudCBjb25uZWN0cworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZlckV2ZW50SGFuZGxlciAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25Db250ZXh0ID0gc2VydmVyRXZlbnRIYW5kbGVyLmNyZWF0ZUNvbnRleHQoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvL1Byb2Nlc3MgY2xpZW50IHJlcXVlc3RzIHVudGlsIGNsaWVudCBkaXNjb25uZWN0cworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCFzdG9wKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaW5wdXRUcmFuc3BvcnQuUGVlaygpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vRmlyZSBwcm9jZXNzQ29udGV4dCBzZXJ2ZXIgZXZlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL04uQi4gVGhpcyBpcyB0aGUgcGF0dGVybiBpbXBsZW1lbnRlZCBpbiBDKysgYW5kIHRoZSBldmVudCBmaXJlcyBwcm92aXNpb25hbGx5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vVGhhdCBpcyB0byBzYXkgaXQgbWF5IGJlIG1hbnkgbWludXRlcyBiZXR3ZWVuIHRoZSBldmVudCBmaXJpbmcgYW5kIHRoZSBjbGllbnQgcmVxdWVzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vYWN0dWFsbHkgYXJyaXZpbmcgb3IgdGhlIGNsaWVudCBtYXkgaGFuZyB1cCB3aXRob3V0IGV2ZXIgbWFrZWluZyBhIHJlcXVlc3QuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZlckV2ZW50SGFuZGxlciAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJFdmVudEhhbmRsZXIucHJvY2Vzc0NvbnRleHQoY29ubmVjdGlvbkNvbnRleHQsIGlucHV0VHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1Byb2Nlc3MgY2xpZW50IHJlcXVlc3QgKGJsb2NrcyB1bnRpbCB0cmFuc3BvcnQgaXMgcmVhZGFibGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwcm9jZXNzb3IuUHJvY2VzcyhpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL1VzdWFsbHkgYSBjbGllbnQgZGlzY29ubmVjdCwgZXhwZWN0ZWQKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIHgpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vVW5leHBlY3RlZAorICAgICAgICAgICAgICAgICAgICAgICAgbG9nRGVsZWdhdGUoIkVycm9yOiAiICsgeCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvL0ZpcmUgZGVsZXRlQ29udGV4dCBzZXJ2ZXIgZXZlbnQgYWZ0ZXIgY2xpZW50IGRpc2Nvbm5lY3RzCisgICAgICAgICAgICAgICAgICAgIGlmIChzZXJ2ZXJFdmVudEhhbmRsZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlckV2ZW50SGFuZGxlci5kZWxldGVDb250ZXh0KGNvbm5lY3Rpb25Db250ZXh0LCBpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCk7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmluYWxseQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy9DbG9zZSB0cmFuc3BvcnRzCisgICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dFRyYW5zcG9ydCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRUcmFuc3BvcnQuQ2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG91dHB1dFRyYW5zcG9ydCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0VHJhbnNwb3J0LkNsb3NlKCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gZGlzcG9zYWJsZSBzdHVmZiBzaG91bGQgYmUgZGlzcG9zZWQKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0UHJvdG9jb2wgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0UHJvdG9jb2wuRGlzcG9zZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0UHJvdG9jb2wgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFByb3RvY29sLkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0VHJhbnNwb3J0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFRyYW5zcG9ydC5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChvdXRwdXRUcmFuc3BvcnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFRyYW5zcG9ydC5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgU3RvcCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0b3AgPSB0cnVlOworICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0LkNsb3NlKCk7CisgICAgICAgIH0KICAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIExvb3BzIG9uIHByb2Nlc3NpbmcgYSBjbGllbnQgZm9yZXZlcgotICAgIC8vLyB0aHJlYWRDb250ZXh0IHdpbGwgYmUgYSBUVHJhbnNwb3J0IGluc3RhbmNlCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9InRocmVhZENvbnRleHQiPjwvcGFyYW0+Ci0gICAgcHJpdmF0ZSB2b2lkIEV4ZWN1dGUoT2JqZWN0IHRocmVhZENvbnRleHQpCi0gICAgewotICAgICAgVFRyYW5zcG9ydCBjbGllbnQgPSAoVFRyYW5zcG9ydCl0aHJlYWRDb250ZXh0OwotICAgICAgVFRyYW5zcG9ydCBpbnB1dFRyYW5zcG9ydCA9IG51bGw7Ci0gICAgICBUVHJhbnNwb3J0IG91dHB1dFRyYW5zcG9ydCA9IG51bGw7Ci0gICAgICBUUHJvdG9jb2wgaW5wdXRQcm90b2NvbCA9IG51bGw7Ci0gICAgICBUUHJvdG9jb2wgb3V0cHV0UHJvdG9jb2wgPSBudWxsOwotICAgICAgT2JqZWN0IGNvbm5lY3Rpb25Db250ZXh0ID0gbnVsbDsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBpbnB1dFRyYW5zcG9ydCA9IGlucHV0VHJhbnNwb3J0RmFjdG9yeS5HZXRUcmFuc3BvcnQoY2xpZW50KTsKLSAgICAgICAgb3V0cHV0VHJhbnNwb3J0ID0gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeS5HZXRUcmFuc3BvcnQoY2xpZW50KTsKLSAgICAgICAgaW5wdXRQcm90b2NvbCA9IGlucHV0UHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKGlucHV0VHJhbnNwb3J0KTsKLSAgICAgICAgb3V0cHV0UHJvdG9jb2wgPSBvdXRwdXRQcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wob3V0cHV0VHJhbnNwb3J0KTsKLQotICAgICAgICAvL1JlY292ZXIgZXZlbnQgaGFuZGxlciAoaWYgYW55KSBhbmQgZmlyZSBjcmVhdGVDb250ZXh0IHNlcnZlciBldmVudCB3aGVuIGEgY2xpZW50IGNvbm5lY3RzCi0gICAgICAgIGlmIChzZXJ2ZXJFdmVudEhhbmRsZXIgIT0gbnVsbCkKLSAgICAgICAgICBjb25uZWN0aW9uQ29udGV4dCA9IHNlcnZlckV2ZW50SGFuZGxlci5jcmVhdGVDb250ZXh0KGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKTsKLQotICAgICAgICAvL1Byb2Nlc3MgY2xpZW50IHJlcXVlc3RzIHVudGlsIGNsaWVudCBkaXNjb25uZWN0cwotICAgICAgICB3aGlsZSAodHJ1ZSkKLSAgICAgICAgewotICAgICAgICAgIGlmICghaW5wdXRUcmFuc3BvcnQuUGVlaygpKQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAvL0ZpcmUgcHJvY2Vzc0NvbnRleHQgc2VydmVyIGV2ZW50Ci0gICAgICAgICAgLy9OLkIuIFRoaXMgaXMgdGhlIHBhdHRlcm4gaW1wbGVtZW50ZWQgaW4gQysrIGFuZCB0aGUgZXZlbnQgZmlyZXMgcHJvdmlzaW9uYWxseS4KLSAgICAgICAgICAvL1RoYXQgaXMgdG8gc2F5IGl0IG1heSBiZSBtYW55IG1pbnV0ZXMgYmV0d2VlbiB0aGUgZXZlbnQgZmlyaW5nIGFuZCB0aGUgY2xpZW50IHJlcXVlc3QKLSAgICAgICAgICAvL2FjdHVhbGx5IGFycml2aW5nIG9yIHRoZSBjbGllbnQgbWF5IGhhbmcgdXAgd2l0aG91dCBldmVyIG1ha2VpbmcgYSByZXF1ZXN0LgotICAgICAgICAgIGlmIChzZXJ2ZXJFdmVudEhhbmRsZXIgIT0gbnVsbCkKLSAgICAgICAgICAgIHNlcnZlckV2ZW50SGFuZGxlci5wcm9jZXNzQ29udGV4dChjb25uZWN0aW9uQ29udGV4dCwgaW5wdXRUcmFuc3BvcnQpOwotICAgICAgICAgIC8vUHJvY2VzcyBjbGllbnQgcmVxdWVzdCAoYmxvY2tzIHVudGlsIHRyYW5zcG9ydCBpcyByZWFkYWJsZSkKLSAgICAgICAgICBpZiAoIXByb2Nlc3Nvci5Qcm9jZXNzKGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKSkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbikKLSAgICAgIHsKLSAgICAgICAgLy9Vc3VhbGx5IGEgY2xpZW50IGRpc2Nvbm5lY3QsIGV4cGVjdGVkCi0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIHgpCi0gICAgICB7Ci0gICAgICAgIC8vVW5leHBlY3RlZAotICAgICAgICBsb2dEZWxlZ2F0ZSgiRXJyb3I6ICIgKyB4KTsKLSAgICAgIH0KLQotICAgICAgLy9GaXJlIGRlbGV0ZUNvbnRleHQgc2VydmVyIGV2ZW50IGFmdGVyIGNsaWVudCBkaXNjb25uZWN0cwotICAgICAgaWYgKHNlcnZlckV2ZW50SGFuZGxlciAhPSBudWxsKQotICAgICAgICBzZXJ2ZXJFdmVudEhhbmRsZXIuZGVsZXRlQ29udGV4dChjb25uZWN0aW9uQ29udGV4dCwgaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpOwotCi0gICAgICAvL0Nsb3NlIHRyYW5zcG9ydHMKLSAgICAgIGlmIChpbnB1dFRyYW5zcG9ydCAhPSBudWxsKQotICAgICAgICBpbnB1dFRyYW5zcG9ydC5DbG9zZSgpOwotICAgICAgaWYgKG91dHB1dFRyYW5zcG9ydCAhPSBudWxsKQotICAgICAgICBvdXRwdXRUcmFuc3BvcnQuQ2xvc2UoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBTdG9wKCkKLSAgICB7Ci0gICAgICBzdG9wID0gdHJ1ZTsKLSAgICAgIHNlcnZlclRyYW5zcG9ydC5DbG9zZSgpOwotICAgIH0KLSAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvU2VydmVyL1RUaHJlYWRlZFNlcnZlci5jcyBiL2xpYi9jc2hhcnAvc3JjL1NlcnZlci9UVGhyZWFkZWRTZXJ2ZXIuY3MKaW5kZXggOWU5NjM3MS4uY2MwNTFhMyAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvU2VydmVyL1RUaHJlYWRlZFNlcnZlci5jcworKysgYi9saWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFRocmVhZGVkU2VydmVyLmNzCkBAIC0yNiwyMzIgKzI2LDI1NyBAQAogCiBuYW1lc3BhY2UgVGhyaWZ0LlNlcnZlcgogewotICAvLy8gPHN1bW1hcnk+Ci0gIC8vLyBTZXJ2ZXIgdGhhdCB1c2VzIEMjIHRocmVhZHMgKGFzIG9wcG9zZWQgdG8gdGhlIFRocmVhZFBvb2wpIHdoZW4gaGFuZGxpbmcgcmVxdWVzdHMKLSAgLy8vIDwvc3VtbWFyeT4KLSAgcHVibGljIGNsYXNzIFRUaHJlYWRlZFNlcnZlciA6IFRTZXJ2ZXIKLSAgewotICAgIHByaXZhdGUgY29uc3QgaW50IERFRkFVTFRfTUFYX1RIUkVBRFMgPSAxMDA7Ci0gICAgcHJpdmF0ZSB2b2xhdGlsZSBib29sIHN0b3AgPSBmYWxzZTsKLSAgICBwcml2YXRlIHJlYWRvbmx5IGludCBtYXhUaHJlYWRzOwotCi0gICAgcHJpdmF0ZSBRdWV1ZTxUVHJhbnNwb3J0PiBjbGllbnRRdWV1ZTsKLSAgICBwcml2YXRlIFRIYXNoU2V0PFRocmVhZD4gY2xpZW50VGhyZWFkczsKLSAgICBwcml2YXRlIG9iamVjdCBjbGllbnRMb2NrOwotICAgIHByaXZhdGUgVGhyZWFkIHdvcmtlclRocmVhZDsKLQotICAgIHB1YmxpYyBUVGhyZWFkZWRTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0KQotICAgICAgOiB0aGlzKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLAotICAgICAgICAgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLAotICAgICAgICAgREVGQVVMVF9NQVhfVEhSRUFEUywgRGVmYXVsdExvZ0RlbGVnYXRlKQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVFRocmVhZGVkU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLCBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwgTG9nRGVsZWdhdGUgbG9nRGVsZWdhdGUpCi0gICAgICA6IHRoaXMocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksCi0gICAgICAgICBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksCi0gICAgICAgICBERUZBVUxUX01BWF9USFJFQURTLCBsb2dEZWxlZ2F0ZSkKLSAgICB7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgVFRocmVhZGVkU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgdHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnkpCi0gICAgICA6IHRoaXMocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LCB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgcHJvdG9jb2xGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnksCi0gICAgICAgICBERUZBVUxUX01BWF9USFJFQURTLCBEZWZhdWx0TG9nRGVsZWdhdGUpCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyBUVGhyZWFkZWRTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsCi0gICAgICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICAgICAgIFRQcm90b2NvbEZhY3RvcnkgaW5wdXRQcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgICAgICAgIFRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgICAgICAgICBpbnQgbWF4VGhyZWFkcywgTG9nRGVsZWdhdGUgbG9nRGVsKQotICAgICAgOiBiYXNlKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCBpbnB1dFRyYW5zcG9ydEZhY3RvcnksIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnksIG91dHB1dFByb3RvY29sRmFjdG9yeSwgbG9nRGVsKQotICAgIHsKLSAgICAgIHRoaXMubWF4VGhyZWFkcyA9IG1heFRocmVhZHM7Ci0gICAgICBjbGllbnRRdWV1ZSA9IG5ldyBRdWV1ZTxUVHJhbnNwb3J0PigpOwotICAgICAgY2xpZW50TG9jayA9IG5ldyBvYmplY3QoKTsKLSAgICAgIGNsaWVudFRocmVhZHMgPSBuZXcgVEhhc2hTZXQ8VGhyZWFkPigpOwotICAgIH0KLQogICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gVXNlIG5ldyBUaHJlYWQgZm9yIGVhY2ggbmV3IGNsaWVudCBjb25uZWN0aW9uLiBibG9jayB1bnRpbCBudW1Db25uZWN0aW9ucyA8IG1heFRocmVhZHMKKyAgICAvLy8gU2VydmVyIHRoYXQgdXNlcyBDIyB0aHJlYWRzIChhcyBvcHBvc2VkIHRvIHRoZSBUaHJlYWRQb29sKSB3aGVuIGhhbmRsaW5nIHJlcXVlc3RzLgogICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIG92ZXJyaWRlIHZvaWQgU2VydmUoKQorICAgIHB1YmxpYyBjbGFzcyBUVGhyZWFkZWRTZXJ2ZXIgOiBUU2VydmVyCiAgICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIC8vc3RhcnQgd29ya2VyIHRocmVhZAotICAgICAgICB3b3JrZXJUaHJlYWQgPSBuZXcgVGhyZWFkKG5ldyBUaHJlYWRTdGFydChFeGVjdXRlKSk7Ci0gICAgICAgIHdvcmtlclRocmVhZC5TdGFydCgpOwotICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQuTGlzdGVuKCk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpCi0gICAgICB7Ci0gICAgICAgIGxvZ0RlbGVnYXRlKCJFcnJvciwgY291bGQgbm90IGxpc3RlbiBvbiBTZXJ2ZXJUcmFuc3BvcnQ6ICIgKyB0dHgpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9CisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IERFRkFVTFRfTUFYX1RIUkVBRFMgPSAxMDA7CisgICAgICAgIHByaXZhdGUgdm9sYXRpbGUgYm9vbCBzdG9wID0gZmFsc2U7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgaW50IG1heFRocmVhZHM7CiAKLSAgICAgIC8vRmlyZSB0aGUgcHJlU2VydmUgc2VydmVyIGV2ZW50IHdoZW4gc2VydmVyIGlzIHVwIGJ1dCBiZWZvcmUgYW55IGNsaWVudCBjb25uZWN0aW9ucwotICAgICAgaWYgKHNlcnZlckV2ZW50SGFuZGxlciAhPSBudWxsKQotICAgICAgICBzZXJ2ZXJFdmVudEhhbmRsZXIucHJlU2VydmUoKTsKKyAgICAgICAgcHJpdmF0ZSBRdWV1ZTxUVHJhbnNwb3J0PiBjbGllbnRRdWV1ZTsKKyAgICAgICAgcHJpdmF0ZSBUSGFzaFNldDxUaHJlYWQ+IGNsaWVudFRocmVhZHM7CisgICAgICAgIHByaXZhdGUgb2JqZWN0IGNsaWVudExvY2s7CisgICAgICAgIHByaXZhdGUgVGhyZWFkIHdvcmtlclRocmVhZDsKIAotICAgICAgd2hpbGUgKCFzdG9wKQotICAgICAgewotICAgICAgICBpbnQgZmFpbHVyZUNvdW50ID0gMDsKLSAgICAgICAgdHJ5CisgICAgICAgIHB1YmxpYyBpbnQgQ2xpZW50VGhyZWFkc0NvdW50CiAgICAgICAgIHsKLSAgICAgICAgICBUVHJhbnNwb3J0IGNsaWVudCA9IHNlcnZlclRyYW5zcG9ydC5BY2NlcHQoKTsKLSAgICAgICAgICBsb2NrIChjbGllbnRMb2NrKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGNsaWVudFF1ZXVlLkVucXVldWUoY2xpZW50KTsKLSAgICAgICAgICAgIE1vbml0b3IuUHVsc2UoY2xpZW50TG9jayk7Ci0gICAgICAgICAgfQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGNsaWVudFRocmVhZHMuQ291bnQ7IH0KICAgICAgICAgfQotICAgICAgICBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoc3RvcCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBsb2dEZWxlZ2F0ZSgiVFRocmVhZFBvb2xTZXJ2ZXIgd2FzIHNodXR0aW5nIGRvd24sIGNhdWdodCAiICsgdHR4KTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgICsrZmFpbHVyZUNvdW50OwotICAgICAgICAgICAgbG9nRGVsZWdhdGUodHR4LlRvU3RyaW5nKCkpOwotICAgICAgICAgIH0KIAorICAgICAgICBwdWJsaWMgVFRocmVhZGVkU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLCBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCkKKyAgICAgICAgICAgIDogdGhpcyhuZXcgVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkocHJvY2Vzc29yKSwgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLCBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwKKyAgICAgICAgICAgICBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksCisgICAgICAgICAgICAgREVGQVVMVF9NQVhfVEhSRUFEUywgRGVmYXVsdExvZ0RlbGVnYXRlKQorICAgICAgICB7CiAgICAgICAgIH0KLSAgICAgIH0KIAotICAgICAgaWYgKHN0b3ApCi0gICAgICB7Ci0gICAgICAgIHRyeQorICAgICAgICBwdWJsaWMgVFRocmVhZGVkU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLCBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwgTG9nRGVsZWdhdGUgbG9nRGVsZWdhdGUpCisgICAgICAgICAgICA6IHRoaXMobmV3IFRTaW5nbGV0b25Qcm9jZXNzb3JGYWN0b3J5KHByb2Nlc3NvciksIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksCisgICAgICAgICAgICAgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLAorICAgICAgICAgICAgIERFRkFVTFRfTUFYX1RIUkVBRFMsIGxvZ0RlbGVnYXRlKQogICAgICAgICB7Ci0gICAgICAgICAgc2VydmVyVHJhbnNwb3J0LkNsb3NlKCk7CiAgICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KQorCisKKyAgICAgICAgcHVibGljIFRUaHJlYWRlZFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5KQorICAgICAgICAgICAgOiB0aGlzKG5ldyBUU2luZ2xldG9uUHJvY2Vzc29yRmFjdG9yeShwcm9jZXNzb3IpLCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSwgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICBwcm90b2NvbEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICBERUZBVUxUX01BWF9USFJFQURTLCBEZWZhdWx0TG9nRGVsZWdhdGUpCiAgICAgICAgIHsKLSAgICAgICAgICBsb2dEZWxlZ2F0ZSgiVFNlcnZlVHJhbnNwb3J0IGZhaWxlZCBvbiBjbG9zZTogIiArIHR0eC5NZXNzYWdlKTsKICAgICAgICAgfQotICAgICAgICBzdG9wID0gZmFsc2U7Ci0gICAgICB9Ci0gICAgfQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBMb29wcyBvbiBwcm9jZXNzaW5nIGEgY2xpZW50IGZvcmV2ZXIKLSAgICAvLy8gdGhyZWFkQ29udGV4dCB3aWxsIGJlIGEgVFRyYW5zcG9ydCBpbnN0YW5jZQotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJ0aHJlYWRDb250ZXh0Ij48L3BhcmFtPgotICAgIHByaXZhdGUgdm9pZCBFeGVjdXRlKCkKLSAgICB7Ci0gICAgICB3aGlsZSAoIXN0b3ApCi0gICAgICB7Ci0gICAgICAgIFRUcmFuc3BvcnQgY2xpZW50OwotICAgICAgICBUaHJlYWQgdDsKLSAgICAgICAgbG9jayAoY2xpZW50TG9jaykKKyAgICAgICAgcHVibGljIFRUaHJlYWRlZFNlcnZlcihUUHJvY2Vzc29yRmFjdG9yeSBwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnkpCisgICAgICAgICAgICA6IHRoaXMocHJvY2Vzc29yRmFjdG9yeSwgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgcHJvdG9jb2xGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgREVGQVVMVF9NQVhfVEhSRUFEUywgRGVmYXVsdExvZ0RlbGVnYXRlKQogICAgICAgICB7Ci0gICAgICAgICAgLy9kb24ndCBkZXF1ZXVlIGlmIHRvbyBtYW55IGNvbm5lY3Rpb25zCi0gICAgICAgICAgd2hpbGUgKGNsaWVudFRocmVhZHMuQ291bnQgPj0gbWF4VGhyZWFkcykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBNb25pdG9yLldhaXQoY2xpZW50TG9jayk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgd2hpbGUgKGNsaWVudFF1ZXVlLkNvdW50ID09IDApCi0gICAgICAgICAgewotICAgICAgICAgICAgTW9uaXRvci5XYWl0KGNsaWVudExvY2spOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGNsaWVudCA9IGNsaWVudFF1ZXVlLkRlcXVldWUoKTsKLSAgICAgICAgICB0ID0gbmV3IFRocmVhZChuZXcgUGFyYW1ldGVyaXplZFRocmVhZFN0YXJ0KENsaWVudFdvcmtlcikpOwotICAgICAgICAgIGNsaWVudFRocmVhZHMuQWRkKHQpOwogICAgICAgICB9Ci0gICAgICAgIC8vc3RhcnQgcHJvY2Vzc2luZyByZXF1ZXN0cyBmcm9tIGNsaWVudCBvbiBuZXcgdGhyZWFkCi0gICAgICAgIHQuU3RhcnQoY2xpZW50KTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgQ2xpZW50V29ya2VyKE9iamVjdCBjb250ZXh0KQotICAgIHsKLSAgICAgIFRUcmFuc3BvcnQgY2xpZW50ID0gKFRUcmFuc3BvcnQpY29udGV4dDsKLSAgICAgIFRUcmFuc3BvcnQgaW5wdXRUcmFuc3BvcnQgPSBudWxsOwotICAgICAgVFRyYW5zcG9ydCBvdXRwdXRUcmFuc3BvcnQgPSBudWxsOwotICAgICAgVFByb3RvY29sIGlucHV0UHJvdG9jb2wgPSBudWxsOwotICAgICAgVFByb3RvY29sIG91dHB1dFByb3RvY29sID0gbnVsbDsKLSAgICAgIE9iamVjdCBjb25uZWN0aW9uQ29udGV4dCA9IG51bGw7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgdXNpbmcgKGlucHV0VHJhbnNwb3J0ID0gaW5wdXRUcmFuc3BvcnRGYWN0b3J5LkdldFRyYW5zcG9ydChjbGllbnQpKQorICAgICAgICBwdWJsaWMgVFRocmVhZGVkU2VydmVyKFRQcm9jZXNzb3JGYWN0b3J5IHByb2Nlc3NvckZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBvdXRwdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4VGhyZWFkcywgTG9nRGVsZWdhdGUgbG9nRGVsKQorICAgICAgICAgIDogYmFzZShwcm9jZXNzb3JGYWN0b3J5LCBzZXJ2ZXJUcmFuc3BvcnQsIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnksIG91dHB1dFByb3RvY29sRmFjdG9yeSwgbG9nRGVsKQogICAgICAgICB7Ci0gICAgICAgICAgdXNpbmcgKG91dHB1dFRyYW5zcG9ydCA9IG91dHB1dFRyYW5zcG9ydEZhY3RvcnkuR2V0VHJhbnNwb3J0KGNsaWVudCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgaW5wdXRQcm90b2NvbCA9IGlucHV0UHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKGlucHV0VHJhbnNwb3J0KTsKLSAgICAgICAgICAgIG91dHB1dFByb3RvY29sID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKG91dHB1dFRyYW5zcG9ydCk7CisgICAgICAgICAgICB0aGlzLm1heFRocmVhZHMgPSBtYXhUaHJlYWRzOworICAgICAgICAgICAgY2xpZW50UXVldWUgPSBuZXcgUXVldWU8VFRyYW5zcG9ydD4oKTsKKyAgICAgICAgICAgIGNsaWVudExvY2sgPSBuZXcgb2JqZWN0KCk7CisgICAgICAgICAgICBjbGllbnRUaHJlYWRzID0gbmV3IFRIYXNoU2V0PFRocmVhZD4oKTsKKyAgICAgICAgfQogCi0gICAgICAgICAgICAvL1JlY292ZXIgZXZlbnQgaGFuZGxlciAoaWYgYW55KSBhbmQgZmlyZSBjcmVhdGVDb250ZXh0IHNlcnZlciBldmVudCB3aGVuIGEgY2xpZW50IGNvbm5lY3RzCi0gICAgICAgICAgICBpZiAoc2VydmVyRXZlbnRIYW5kbGVyICE9IG51bGwpCi0gICAgICAgICAgICAgIGNvbm5lY3Rpb25Db250ZXh0ID0gc2VydmVyRXZlbnRIYW5kbGVyLmNyZWF0ZUNvbnRleHQoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpOwotCi0gICAgICAgICAgICAvL1Byb2Nlc3MgY2xpZW50IHJlcXVlc3RzIHVudGlsIGNsaWVudCBkaXNjb25uZWN0cwotICAgICAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFVzZSBuZXcgVGhyZWFkIGZvciBlYWNoIG5ldyBjbGllbnQgY29ubmVjdGlvbi4gYmxvY2sgdW50aWwgbnVtQ29ubmVjdGlvbnMgJmx0OyBtYXhUaHJlYWRzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBTZXJ2ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiAoIWlucHV0VHJhbnNwb3J0LlBlZWsoKSkKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAvL0ZpcmUgcHJvY2Vzc0NvbnRleHQgc2VydmVyIGV2ZW50Ci0gICAgICAgICAgICAgIC8vTi5CLiBUaGlzIGlzIHRoZSBwYXR0ZXJuIGltcGxlbWVudGVkIGluIEMrKyBhbmQgdGhlIGV2ZW50IGZpcmVzIHByb3Zpc2lvbmFsbHkuCi0gICAgICAgICAgICAgIC8vVGhhdCBpcyB0byBzYXkgaXQgbWF5IGJlIG1hbnkgbWludXRlcyBiZXR3ZWVuIHRoZSBldmVudCBmaXJpbmcgYW5kIHRoZSBjbGllbnQgcmVxdWVzdAotICAgICAgICAgICAgICAvL2FjdHVhbGx5IGFycml2aW5nIG9yIHRoZSBjbGllbnQgbWF5IGhhbmcgdXAgd2l0aG91dCBldmVyIG1ha2VpbmcgYSByZXF1ZXN0LgotICAgICAgICAgICAgICBpZiAoc2VydmVyRXZlbnRIYW5kbGVyICE9IG51bGwpCi0gICAgICAgICAgICAgICAgc2VydmVyRXZlbnRIYW5kbGVyLnByb2Nlc3NDb250ZXh0KGNvbm5lY3Rpb25Db250ZXh0LCBpbnB1dFRyYW5zcG9ydCk7Ci0gICAgICAgICAgICAgIC8vUHJvY2VzcyBjbGllbnQgcmVxdWVzdCAoYmxvY2tzIHVudGlsIHRyYW5zcG9ydCBpcyByZWFkYWJsZSkKLSAgICAgICAgICAgICAgaWYgKCFwcm9jZXNzb3IuUHJvY2VzcyhpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCkpCi0gICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgLy9zdGFydCB3b3JrZXIgdGhyZWFkCisgICAgICAgICAgICAgICAgd29ya2VyVGhyZWFkID0gbmV3IFRocmVhZChuZXcgVGhyZWFkU3RhcnQoRXhlY3V0ZSkpOworICAgICAgICAgICAgICAgIHdvcmtlclRocmVhZC5TdGFydCgpOworICAgICAgICAgICAgICAgIHNlcnZlclRyYW5zcG9ydC5MaXN0ZW4oKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9nRGVsZWdhdGUoIkVycm9yLCBjb3VsZCBub3QgbGlzdGVuIG9uIFNlcnZlclRyYW5zcG9ydDogIiArIHR0eCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvL0ZpcmUgdGhlIHByZVNlcnZlIHNlcnZlciBldmVudCB3aGVuIHNlcnZlciBpcyB1cCBidXQgYmVmb3JlIGFueSBjbGllbnQgY29ubmVjdGlvbnMKKyAgICAgICAgICAgIGlmIChzZXJ2ZXJFdmVudEhhbmRsZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBzZXJ2ZXJFdmVudEhhbmRsZXIucHJlU2VydmUoKTsKKworICAgICAgICAgICAgd2hpbGUgKCFzdG9wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBmYWlsdXJlQ291bnQgPSAwOworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydCBjbGllbnQgPSBzZXJ2ZXJUcmFuc3BvcnQuQWNjZXB0KCk7CisgICAgICAgICAgICAgICAgICAgIGxvY2sgKGNsaWVudExvY2spCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudFF1ZXVlLkVucXVldWUoY2xpZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1vbml0b3IuUHVsc2UoY2xpZW50TG9jayk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFzdG9wIHx8IHR0eC5UeXBlICE9IFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5JbnRlcnJ1cHRlZCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgKytmYWlsdXJlQ291bnQ7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2dEZWxlZ2F0ZSh0dHguVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHN0b3ApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQuQ2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nRGVsZWdhdGUoIlRTZXJ2ZVRyYW5zcG9ydCBmYWlsZWQgb24gY2xvc2U6ICIgKyB0dHguTWVzc2FnZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0b3AgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgfQotICAgICAgY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24pCi0gICAgICB7Ci0gICAgICAgIC8vVXN1YWxseSBhIGNsaWVudCBkaXNjb25uZWN0LCBleHBlY3RlZAotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiB4KQotICAgICAgewotICAgICAgICAvL1VuZXhwZWN0ZWQKLSAgICAgICAgbG9nRGVsZWdhdGUoIkVycm9yOiAiICsgeCk7Ci0gICAgICB9CiAKLSAgICAgIC8vRmlyZSBkZWxldGVDb250ZXh0IHNlcnZlciBldmVudCBhZnRlciBjbGllbnQgZGlzY29ubmVjdHMKLSAgICAgIGlmIChzZXJ2ZXJFdmVudEhhbmRsZXIgIT0gbnVsbCkKLSAgICAgICAgc2VydmVyRXZlbnRIYW5kbGVyLmRlbGV0ZUNvbnRleHQoY29ubmVjdGlvbkNvbnRleHQsIGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKTsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gTG9vcHMgb24gcHJvY2Vzc2luZyBhIGNsaWVudCBmb3JldmVyCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgdm9pZCBFeGVjdXRlKCkKKyAgICAgICAgeworICAgICAgICAgICAgd2hpbGUgKCFzdG9wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFRUcmFuc3BvcnQgY2xpZW50OworICAgICAgICAgICAgICAgIFRocmVhZCB0OworICAgICAgICAgICAgICAgIGxvY2sgKGNsaWVudExvY2spCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvL2Rvbid0IGRlcXVldWUgaWYgdG9vIG1hbnkgY29ubmVjdGlvbnMKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNsaWVudFRocmVhZHMuQ291bnQgPj0gbWF4VGhyZWFkcykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgTW9uaXRvci5XYWl0KGNsaWVudExvY2spOworICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgIGxvY2sgKGNsaWVudExvY2spCi0gICAgICB7Ci0gICAgICAgIGNsaWVudFRocmVhZHMuUmVtb3ZlKFRocmVhZC5DdXJyZW50VGhyZWFkKTsKLSAgICAgICAgTW9uaXRvci5QdWxzZShjbGllbnRMb2NrKTsKLSAgICAgIH0KLSAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNsaWVudFF1ZXVlLkNvdW50ID09IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1vbml0b3IuV2FpdChjbGllbnRMb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNsaWVudCA9IGNsaWVudFF1ZXVlLkRlcXVldWUoKTsKKyAgICAgICAgICAgICAgICAgICAgdCA9IG5ldyBUaHJlYWQobmV3IFBhcmFtZXRlcml6ZWRUaHJlYWRTdGFydChDbGllbnRXb3JrZXIpKTsKKyAgICAgICAgICAgICAgICAgICAgY2xpZW50VGhyZWFkcy5BZGQodCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vc3RhcnQgcHJvY2Vzc2luZyByZXF1ZXN0cyBmcm9tIGNsaWVudCBvbiBuZXcgdGhyZWFkCisgICAgICAgICAgICAgICAgdC5TdGFydChjbGllbnQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIENsaWVudFdvcmtlcihvYmplY3QgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgdXNpbmcgKFRUcmFuc3BvcnQgY2xpZW50ID0gKFRUcmFuc3BvcnQpY29udGV4dCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBUUHJvY2Vzc29yIHByb2Nlc3NvciA9IHByb2Nlc3NvckZhY3RvcnkuR2V0UHJvY2Vzc29yKGNsaWVudCk7CisgICAgICAgICAgICAgICAgVFRyYW5zcG9ydCBpbnB1dFRyYW5zcG9ydCA9IG51bGw7CisgICAgICAgICAgICAgICAgVFRyYW5zcG9ydCBvdXRwdXRUcmFuc3BvcnQgPSBudWxsOworICAgICAgICAgICAgICAgIFRQcm90b2NvbCBpbnB1dFByb3RvY29sID0gbnVsbDsKKyAgICAgICAgICAgICAgICBUUHJvdG9jb2wgb3V0cHV0UHJvdG9jb2wgPSBudWxsOworICAgICAgICAgICAgICAgIG9iamVjdCBjb25uZWN0aW9uQ29udGV4dCA9IG51bGw7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRUcmFuc3BvcnQgPSBpbnB1dFRyYW5zcG9ydEZhY3RvcnkuR2V0VHJhbnNwb3J0KGNsaWVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRUcmFuc3BvcnQgPSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LkdldFRyYW5zcG9ydChjbGllbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRQcm90b2NvbCA9IGlucHV0UHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKGlucHV0VHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFByb3RvY29sID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKG91dHB1dFRyYW5zcG9ydCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vUmVjb3ZlciBldmVudCBoYW5kbGVyIChpZiBhbnkpIGFuZCBmaXJlIGNyZWF0ZUNvbnRleHQgc2VydmVyIGV2ZW50IHdoZW4gYSBjbGllbnQgY29ubmVjdHMKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXJ2ZXJFdmVudEhhbmRsZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uQ29udGV4dCA9IHNlcnZlckV2ZW50SGFuZGxlci5jcmVhdGVDb250ZXh0KGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy9Qcm9jZXNzIGNsaWVudCByZXF1ZXN0cyB1bnRpbCBjbGllbnQgZGlzY29ubmVjdHMKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICghc3RvcCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlucHV0VHJhbnNwb3J0LlBlZWsoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0ZpcmUgcHJvY2Vzc0NvbnRleHQgc2VydmVyIGV2ZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9OLkIuIFRoaXMgaXMgdGhlIHBhdHRlcm4gaW1wbGVtZW50ZWQgaW4gQysrIGFuZCB0aGUgZXZlbnQgZmlyZXMgcHJvdmlzaW9uYWxseS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1RoYXQgaXMgdG8gc2F5IGl0IG1heSBiZSBtYW55IG1pbnV0ZXMgYmV0d2VlbiB0aGUgZXZlbnQgZmlyaW5nIGFuZCB0aGUgY2xpZW50IHJlcXVlc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2FjdHVhbGx5IGFycml2aW5nIG9yIHRoZSBjbGllbnQgbWF5IGhhbmcgdXAgd2l0aG91dCBldmVyIG1ha2VpbmcgYSByZXF1ZXN0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXJ2ZXJFdmVudEhhbmRsZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyRXZlbnRIYW5kbGVyLnByb2Nlc3NDb250ZXh0KGNvbm5lY3Rpb25Db250ZXh0LCBpbnB1dFRyYW5zcG9ydCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9Qcm9jZXNzIGNsaWVudCByZXF1ZXN0IChibG9ja3MgdW50aWwgdHJhbnNwb3J0IGlzIHJlYWRhYmxlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcHJvY2Vzc29yLlByb2Nlc3MoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy9Vc3VhbGx5IGEgY2xpZW50IGRpc2Nvbm5lY3QsIGV4cGVjdGVkCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiB4KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL1VuZXhwZWN0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZ0RlbGVnYXRlKCJFcnJvcjogIiArIHgpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy9GaXJlIGRlbGV0ZUNvbnRleHQgc2VydmVyIGV2ZW50IGFmdGVyIGNsaWVudCBkaXNjb25uZWN0cworICAgICAgICAgICAgICAgICAgICBpZiAoc2VydmVyRXZlbnRIYW5kbGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJFdmVudEhhbmRsZXIuZGVsZXRlQ29udGV4dChjb25uZWN0aW9uQ29udGV4dCwgaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpOworCisgICAgICAgICAgICAgICAgICAgIGxvY2sgKGNsaWVudExvY2spCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudFRocmVhZHMuUmVtb3ZlKFRocmVhZC5DdXJyZW50VGhyZWFkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1vbml0b3IuUHVsc2UoY2xpZW50TG9jayk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmaW5hbGx5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvL0Nsb3NlIHRyYW5zcG9ydHMKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0VHJhbnNwb3J0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFRyYW5zcG9ydC5DbG9zZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0VHJhbnNwb3J0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRUcmFuc3BvcnQuQ2xvc2UoKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBkaXNwb3NhYmxlIHN0dWZmIHNob3VsZCBiZSBkaXNwb3NlZAorICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXRQcm90b2NvbCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRQcm90b2NvbC5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChvdXRwdXRQcm90b2NvbCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2wuRGlzcG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFN0b3AoKQorICAgICAgICB7CisgICAgICAgICAgICBzdG9wID0gdHJ1ZTsKKyAgICAgICAgICAgIHNlcnZlclRyYW5zcG9ydC5DbG9zZSgpOworICAgICAgICAgICAgLy9jbGVhbiB1cCBhbGwgdGhlIHRocmVhZHMgbXlzZWxmCisgICAgICAgICAgICB3b3JrZXJUaHJlYWQuQWJvcnQoKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKFRocmVhZCB0IGluIGNsaWVudFRocmVhZHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdC5BYm9ydCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIHZvaWQgU3RvcCgpCi0gICAgewotICAgICAgc3RvcCA9IHRydWU7Ci0gICAgICBzZXJ2ZXJUcmFuc3BvcnQuQ2xvc2UoKTsKLSAgICAgIC8vY2xlYW4gdXAgYWxsIHRoZSB0aHJlYWRzIG15c2VsZgotICAgICAgd29ya2VyVGhyZWFkLkFib3J0KCk7Ci0gICAgICBmb3JlYWNoIChUaHJlYWQgdCBpbiBjbGllbnRUaHJlYWRzKQotICAgICAgewotICAgICAgICB0LkFib3J0KCk7Ci0gICAgICB9Ci0gICAgfQotICB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UQXBwbGljYXRpb25FeGNlcHRpb24uY3MgYi9saWIvY3NoYXJwL3NyYy9UQXBwbGljYXRpb25FeGNlcHRpb24uY3MKaW5kZXggNGMwZDNhMy4uOGRkN2FlNSAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5jcwpAQCAtNDAsNyArNDAsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihFeGNlcHRpb25UeXBlIHR5cGUsIHN0cmluZyBtZXNzYWdlKQotICAgICAgICAgICAgOiBiYXNlKG1lc3NhZ2UpCisgICAgICAgICAgICA6IGJhc2UobWVzc2FnZSwgbnVsbCkgLy8gVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGlzIHNlcmlhbGl6YWJsZSwgYnV0IHdlIG5ldmVyIHNlcmlhbGl6ZSBJbm5lckV4Y2VwdGlvbgogICAgICAgICB7CiAgICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwogICAgICAgICB9CkBAIC0xMDMsNyArMTAzLDcgQEAKIAogICAgICAgICAgICAgb3Byb3QuV3JpdGVTdHJ1Y3RCZWdpbihzdHJ1Yyk7CiAKLSAgICAgICAgICAgIGlmICghU3RyaW5nLklzTnVsbE9yRW1wdHkoTWVzc2FnZSkpCisgICAgICAgICAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KE1lc3NhZ2UpKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGZpZWxkLk5hbWUgPSAibWVzc2FnZSI7CiAgICAgICAgICAgICAgICAgZmllbGQuVHlwZSA9IFRUeXBlLlN0cmluZzsKQEAgLTEzNyw1ICsxMzcsMTAgQEAKICAgICAgICAgICAgIEludmFsaWRQcm90b2NvbCwKICAgICAgICAgICAgIFVuc3VwcG9ydGVkQ2xpZW50VHlwZQogICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEV4Y2VwdGlvblR5cGUgVHlwZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gdHlwZTsgfQorICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvVEFzeW5jUHJvY2Vzc29yLmNzIGIvbGliL2NzaGFycC9zcmMvVEFzeW5jUHJvY2Vzc29yLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiNDMyMjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3NyYy9UQXN5bmNQcm9jZXNzb3IuY3MKQEAgLTAsMCArMSwzOCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbDsKKworbmFtZXNwYWNlIFRocmlmdAoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gUHJvY2Vzc2VzIGEgbWVzc2FnZSBhc3luY2hyb25vdXNseS4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBpbnRlcmZhY2UgVEFzeW5jUHJvY2Vzc29yCisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBQcm9jZXNzZXMgdGhlIG5leHQgcGFydCBvZiB0aGUgbWVzc2FnZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJpcHJvdCI+VGhlIGlucHV0IHByb3RvY29sLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ib3Byb3QiPlRoZSBvdXRwdXQgcHJvdG9jb2wuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPnRydWUgaWYgdGhlcmUncyBtb3JlIHRvIHByb2Nlc3MsIGZhbHNlIG90aGVyd2lzZS48L3JldHVybnM+CisgICAgICAgIFRhc2s8Ym9vbD4gUHJvY2Vzc0FzeW5jKFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UQ29udHJvbGxpbmdIYW5kbGVyLmNzIGIvbGliL2NzaGFycC9zcmMvVENvbnRyb2xsaW5nSGFuZGxlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjUyMDNhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC9zcmMvVENvbnRyb2xsaW5nSGFuZGxlci5jcwpAQCAtMCwwICsxLDI5IEBACivvu78vKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFRocmlmdC5TZXJ2ZXI7CisKK25hbWVzcGFjZSBUaHJpZnQKK3sKKyAgICBwdWJsaWMgaW50ZXJmYWNlIFRDb250cm9sbGluZ0hhbmRsZXIKKyAgICB7CisgICAgICAgIFRTZXJ2ZXIgc2VydmVyIHsgZ2V0OyBzZXQ7IH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9URXhjZXB0aW9uLmNzIGIvbGliL2NzaGFycC9zcmMvVEV4Y2VwdGlvbi5jcwppbmRleCA2NTUwOWVjLi5hYTlhMjEwIDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9URXhjZXB0aW9uLmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RFeGNlcHRpb24uY3MKQEAgLTMxLDggKzMxLDggQEAKICAgICAgICAgewogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIFRFeGNlcHRpb24oIHN0cmluZyBtZXNzYWdlKQotICAgICAgICAgICAgOiBiYXNlKG1lc3NhZ2UpCisgICAgICAgIHB1YmxpYyBURXhjZXB0aW9uKHN0cmluZyBtZXNzYWdlLCBFeGNlcHRpb24gaW5uZXIpCisgICAgICAgICAgICA6IGJhc2UobWVzc2FnZSwgaW5uZXIpCiAgICAgICAgIHsKICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UUHJvY2Vzc29yRmFjdG9yeS5jcyBiL2xpYi9jc2hhcnAvc3JjL1RQcm9jZXNzb3JGYWN0b3J5LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkZjYzMWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3NyYy9UUHJvY2Vzc29yRmFjdG9yeS5jcwpAQCAtMCwwICsxLDMwIEBACivvu78vKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFRocmlmdC5TZXJ2ZXI7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0OworCituYW1lc3BhY2UgVGhyaWZ0Cit7CisgICAgcHVibGljIGludGVyZmFjZSBUUHJvY2Vzc29yRmFjdG9yeQorICAgIHsKKyAgICAgICAgVFByb2Nlc3NvciBHZXRQcm9jZXNzb3IoVFRyYW5zcG9ydCB0cmFucywgVFNlcnZlciBzZXJ2ZXIgPSBudWxsKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UUHJvdG90eXBlUHJvY2Vzc29yRmFjdG9yeS5jcyBiL2xpYi9jc2hhcnAvc3JjL1RQcm90b3R5cGVQcm9jZXNzb3JGYWN0b3J5LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiNDcyNjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3NyYy9UUHJvdG90eXBlUHJvY2Vzc29yRmFjdG9yeS5jcwpAQCAtMCwwICsxLDU1IEBACivvu78vKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFRocmlmdC5TZXJ2ZXI7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0OworCituYW1lc3BhY2UgVGhyaWZ0Cit7CisgICAgcHVibGljIGNsYXNzIFRQcm90b3R5cGVQcm9jZXNzb3JGYWN0b3J5PFAsIEg+IDogVFByb2Nlc3NvckZhY3Rvcnkgd2hlcmUgUCA6IFRQcm9jZXNzb3IKKyAgICB7CisgICAgICAgIG9iamVjdFtdIGhhbmRsZXJBcmdzID0gbnVsbDsKKworICAgICAgICBwdWJsaWMgVFByb3RvdHlwZVByb2Nlc3NvckZhY3RvcnkoKQorICAgICAgICB7CisgICAgICAgICAgICBoYW5kbGVyQXJncyA9IG5ldyBvYmplY3RbMF07CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFByb3RvdHlwZVByb2Nlc3NvckZhY3RvcnkocGFyYW1zIG9iamVjdFtdIGhhbmRsZXJBcmdzKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLmhhbmRsZXJBcmdzID0gaGFuZGxlckFyZ3M7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFByb2Nlc3NvciBHZXRQcm9jZXNzb3IoVFRyYW5zcG9ydCB0cmFucywgVFNlcnZlciBzZXJ2ZXIgPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBIIGhhbmRsZXIgPSAoSClBY3RpdmF0b3IuQ3JlYXRlSW5zdGFuY2UodHlwZW9mKEgpLCBoYW5kbGVyQXJncyk7CisKKyAgICAgICAgICAgIFRDb250cm9sbGluZ0hhbmRsZXIgaGFuZGxlclNlcnZlclJlZiA9IGhhbmRsZXIgYXMgVENvbnRyb2xsaW5nSGFuZGxlcjsKKyAgICAgICAgICAgIGlmIChoYW5kbGVyU2VydmVyUmVmICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaGFuZGxlclNlcnZlclJlZi5zZXJ2ZXIgPSBzZXJ2ZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQWN0aXZhdG9yLkNyZWF0ZUluc3RhbmNlKHR5cGVvZihQKSwgbmV3IG9iamVjdFtdIHsgaGFuZGxlciB9KSBhcyBUUHJvY2Vzc29yOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkuY3MgYi9saWIvY3NoYXJwL3NyYy9UU2luZ2xldG9uUHJvY2Vzc29yRmFjdG9yeS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDI4OTdiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC9zcmMvVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkuY3MKQEAgLTAsMCArMSw0MyBAQAor77u/LyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBUaHJpZnQuU2VydmVyOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydDsKKworbmFtZXNwYWNlIFRocmlmdAoreworICAgIHB1YmxpYyBjbGFzcyBUU2luZ2xldG9uUHJvY2Vzc29yRmFjdG9yeSA6IFRQcm9jZXNzb3JGYWN0b3J5CisgICAgeworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFRQcm9jZXNzb3IgcHJvY2Vzc29yXzsKKworICAgICAgICBwdWJsaWMgVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkoVFByb2Nlc3NvciBwcm9jZXNzb3IpCisgICAgICAgIHsKKyAgICAgICAgICAgIHByb2Nlc3Nvcl8gPSBwcm9jZXNzb3I7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFByb2Nlc3NvciBHZXRQcm9jZXNzb3IoVFRyYW5zcG9ydCB0cmFucywgVFNlcnZlciBzZXJ2ZXIgPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gcHJvY2Vzc29yXzsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1RocmlmdC40NS5jc3Byb2ogYi9saWIvY3NoYXJwL3NyYy9UaHJpZnQuNDUuY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlMjhiMjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3NyYy9UaHJpZnQuNDUuY3Nwcm9qCkBAIC0wLDAgKzEsMTI5IEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPFByb2plY3QgVG9vbHNWZXJzaW9uPSI0LjAiIERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+CisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxDb25maWd1cmF0aW9uIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pJyA9PSAnJyAiPkRlYnVnPC9Db25maWd1cmF0aW9uPgorICAgIDxQbGF0Zm9ybSBDb25kaXRpb249IiAnJChQbGF0Zm9ybSknID09ICcnICI+QW55Q1BVPC9QbGF0Zm9ybT4KKyAgICA8UHJvamVjdEd1aWQ+e0VCQ0UzNURBLUNGNkEtNDJCQy1BMzU3LUE5QzA5QjUzNDI5OX08L1Byb2plY3RHdWlkPgorICAgIDxPdXRwdXRUeXBlPkxpYnJhcnk8L091dHB1dFR5cGU+CisgICAgPEFwcERlc2lnbmVyRm9sZGVyPlByb3BlcnRpZXM8L0FwcERlc2lnbmVyRm9sZGVyPgorICAgIDxSb290TmFtZXNwYWNlPlRocmlmdDwvUm9vdE5hbWVzcGFjZT4KKyAgICA8QXNzZW1ibHlOYW1lPlRocmlmdDQ1PC9Bc3NlbWJseU5hbWU+CisgICAgPFRhcmdldEZyYW1ld29ya1ZlcnNpb24+djQuNTwvVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj4KKyAgICA8RmlsZUFsaWdubWVudD41MTI8L0ZpbGVBbGlnbm1lbnQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdEZWJ1Z3xBbnlDUFUnICI+CisgICAgPERlYnVnU3ltYm9scz50cnVlPC9EZWJ1Z1N5bWJvbHM+CisgICAgPERlYnVnVHlwZT5wb3J0YWJsZTwvRGVidWdUeXBlPgorICAgIDxPcHRpbWl6ZT5mYWxzZTwvT3B0aW1pemU+CisgICAgPE91dHB1dFBhdGg+YmluXERlYnVnXDwvT3V0cHV0UGF0aD4KKyAgICA8RGVmaW5lQ29uc3RhbnRzPlRSQUNFO0RFQlVHO05FVDQ1PC9EZWZpbmVDb25zdGFudHM+CisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+CisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdSZWxlYXNlfEFueUNQVScgIj4KKyAgICA8RGVidWdUeXBlPnBvcnRhYmxlPC9EZWJ1Z1R5cGU+CisgICAgPE9wdGltaXplPnRydWU8L09wdGltaXplPgorICAgIDxPdXRwdXRQYXRoPmJpblxSZWxlYXNlXDwvT3V0cHV0UGF0aD4KKyAgICA8RGVmaW5lQ29uc3RhbnRzPlRSQUNFO05FVDQ1PC9EZWZpbmVDb25zdGFudHM+CisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+CisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbSIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5Db3JlIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLldlYiIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5YbWwuTGlucSIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5EYXRhLkRhdGFTZXRFeHRlbnNpb25zIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iTWljcm9zb2Z0LkNTaGFycCIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5EYXRhIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlhtbCIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29sbGVjdGlvbnNcVENvbGxlY3Rpb25zLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbGxlY3Rpb25zXFRIYXNoU2V0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3BlcnRpZXNcQXNzZW1ibHlJbmZvLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRBYnN0cmFjdEJhc2UuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVEJhc2UuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVEJhc2U2NFV0aWxzLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRCaW5hcnlQcm90b2NvbC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUQ29tcGFjdFByb3RvY29sLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRGaWVsZC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUSlNPTlByb3RvY29sLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRMaXN0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRNYXAuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVE1lc3NhZ2UuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVE1lc3NhZ2VUeXBlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRNdWx0aXBsZXhlZFByb2Nlc3Nvci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUTXVsdGlwbGV4ZWRQcm90b2NvbC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUUHJvdG9jb2wuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVFByb3RvY29sRGVjb3JhdG9yLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRQcm90b2NvbEV4Y2VwdGlvbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUUHJvdG9jb2xGYWN0b3J5LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRQcm90b2NvbFV0aWwuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVFNldC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUU3RydWN0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRUeXBlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlNlcnZlclxUU2VydmVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlNlcnZlclxUU2VydmVyRXZlbnRIYW5kbGVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlNlcnZlclxUU2ltcGxlU2VydmVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlNlcnZlclxUVGhyZWFkZWRTZXJ2ZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iU2VydmVyXFRUaHJlYWRQb29sU2VydmVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUQXN5bmNQcm9jZXNzb3IuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVENvbnRyb2xsaW5nSGFuZGxlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJURXhjZXB0aW9uLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRQcm9jZXNzb3IuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVFByb2Nlc3NvckZhY3RvcnkuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVFByb3RvdHlwZVByb2Nlc3NvckZhY3RvcnkuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRCdWZmZXJlZFRyYW5zcG9ydC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVEZyYW1lZFRyYW5zcG9ydC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVEh0dHBDbGllbnQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRIdHRwSGFuZGxlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVEh0dHBUYXNrQXN5bmNIYW5kbGVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUTWVtb3J5QnVmZmVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUTmFtZWRQaXBlQ2xpZW50VHJhbnNwb3J0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUTmFtZWRQaXBlU2VydmVyVHJhbnNwb3J0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUU2VydmVyU29ja2V0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUU2VydmVyVHJhbnNwb3J0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUU2lsdmVybGlnaHRTb2NrZXQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRTb2NrZXQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRTb2NrZXRWZXJzaW9uaXplci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVFN0cmVhbVRyYW5zcG9ydC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVFRMU1NlcnZlclNvY2tldC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVFRMU1NvY2tldC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVFRyYW5zcG9ydC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVFRyYW5zcG9ydEV4Y2VwdGlvbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVFRyYW5zcG9ydEZhY3RvcnkuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkuY3MiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxGb2xkZXIgSW5jbHVkZT0iU2VydmVyXENvbGxlY3Rpb25zXCIgLz4KKyAgICA8Rm9sZGVyIEluY2x1ZGU9IlNlcnZlclxQcm90b2NvbFwiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZFRvb2xzUGF0aClcTWljcm9zb2Z0LkNTaGFycC50YXJnZXRzIiAvPgorICA8IS0tIFRvIG1vZGlmeSB5b3VyIGJ1aWxkIHByb2Nlc3MsIGFkZCB5b3VyIHRhc2sgaW5zaWRlIG9uZSBvZiB0aGUgdGFyZ2V0cyBiZWxvdyBhbmQgdW5jb21tZW50IGl0LiAKKyAgICAgICBPdGhlciBzaW1pbGFyIGV4dGVuc2lvbiBwb2ludHMgZXhpc3QsIHNlZSBNaWNyb3NvZnQuQ29tbW9uLnRhcmdldHMuCisgIDxUYXJnZXQgTmFtZT0iQmVmb3JlQnVpbGQiPgorICA8L1RhcmdldD4KKyAgPFRhcmdldCBOYW1lPSJBZnRlckJ1aWxkIj4KKyAgPC9UYXJnZXQ+CisgIC0tPgorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1RocmlmdC5XUDcuY3Nwcm9qIGIvbGliL2NzaGFycC9zcmMvVGhyaWZ0LldQNy5jc3Byb2oKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlNDk0MmYuLjAwMDAwMDAKLS0tIGEvbGliL2NzaGFycC9zcmMvVGhyaWZ0LldQNy5jc3Byb2oKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAot77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPFByb2plY3QgVG9vbHNWZXJzaW9uPSI0LjAiIERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+Ci0gIDxQcm9wZXJ0eUdyb3VwPgotICAgIDxDb25maWd1cmF0aW9uIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pJyA9PSAnJyAiPkRlYnVnPC9Db25maWd1cmF0aW9uPgotICAgIDxQbGF0Zm9ybSBDb25kaXRpb249IiAnJChQbGF0Zm9ybSknID09ICcnICI+QW55Q1BVPC9QbGF0Zm9ybT4KLSAgICA8UHJvZHVjdFZlcnNpb24+MTAuMC4yMDUwNjwvUHJvZHVjdFZlcnNpb24+Ci0gICAgPFNjaGVtYVZlcnNpb24+Mi4wPC9TY2hlbWFWZXJzaW9uPgotICAgIDxQcm9qZWN0R3VpZD57REY1OEJEQjAtMjQ1Ny00QTUyLTk5ODEtNjVBMEU4QjUwODMzfTwvUHJvamVjdEd1aWQ+Ci0gICAgPFByb2plY3RUeXBlR3VpZHM+e0MwODlDOEMwLTMwRTAtNEUyMi04MEMwLUNFMDkzRjExMUE0M307e2ZhZTA0ZWMwLTMwMWYtMTFkMy1iZjRiLTAwYzA0Zjc5ZWZiY308L1Byb2plY3RUeXBlR3VpZHM+Ci0gICAgPE91dHB1dFR5cGU+TGlicmFyeTwvT3V0cHV0VHlwZT4KLSAgICA8QXBwRGVzaWduZXJGb2xkZXI+UHJvcGVydGllczwvQXBwRGVzaWduZXJGb2xkZXI+Ci0gICAgPFJvb3ROYW1lc3BhY2U+VGhyaWZ0LldQNzwvUm9vdE5hbWVzcGFjZT4KLSAgICA8QXNzZW1ibHlOYW1lPlRocmlmdC5XUDc8L0Fzc2VtYmx5TmFtZT4KLSAgICA8VGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj52NC4wPC9UYXJnZXRGcmFtZXdvcmtWZXJzaW9uPgotICAgIDxTaWx2ZXJsaWdodFZlcnNpb24+JChUYXJnZXRGcmFtZXdvcmtWZXJzaW9uKTwvU2lsdmVybGlnaHRWZXJzaW9uPgotICAgIDxUYXJnZXRGcmFtZXdvcmtQcm9maWxlPldpbmRvd3NQaG9uZTcxPC9UYXJnZXRGcmFtZXdvcmtQcm9maWxlPgotICAgIDxUYXJnZXRGcmFtZXdvcmtJZGVudGlmaWVyPlNpbHZlcmxpZ2h0PC9UYXJnZXRGcmFtZXdvcmtJZGVudGlmaWVyPgotICAgIDxTaWx2ZXJsaWdodEFwcGxpY2F0aW9uPmZhbHNlPC9TaWx2ZXJsaWdodEFwcGxpY2F0aW9uPgotICAgIDxWYWxpZGF0ZVhhbWw+dHJ1ZTwvVmFsaWRhdGVYYW1sPgotICAgIDxUaHJvd0Vycm9yc0luVmFsaWRhdGlvbj50cnVlPC9UaHJvd0Vycm9yc0luVmFsaWRhdGlvbj4KLSAgPC9Qcm9wZXJ0eUdyb3VwPgotICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfEFueUNQVScgIj4KLSAgICA8RGVidWdTeW1ib2xzPnRydWU8L0RlYnVnU3ltYm9scz4KLSAgICA8RGVidWdUeXBlPmZ1bGw8L0RlYnVnVHlwZT4KLSAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPgotICAgIDxPdXRwdXRQYXRoPkJpblxEZWJ1ZzwvT3V0cHV0UGF0aD4KLSAgICA8RGVmaW5lQ29uc3RhbnRzPkRFQlVHO1RSQUNFO1NJTFZFUkxJR0hUO1dJTkRPV1NfUEhPTkU8L0RlZmluZUNvbnN0YW50cz4KLSAgICA8Tm9TdGRMaWI+dHJ1ZTwvTm9TdGRMaWI+Ci0gICAgPE5vQ29uZmlnPnRydWU8L05vQ29uZmlnPgotICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgotICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgotICA8L1Byb3BlcnR5R3JvdXA+Ci0gIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXxBbnlDUFUnICI+Ci0gICAgPERlYnVnVHlwZT5wZGJvbmx5PC9EZWJ1Z1R5cGU+Ci0gICAgPE9wdGltaXplPnRydWU8L09wdGltaXplPgotICAgIDxPdXRwdXRQYXRoPkJpblxSZWxlYXNlPC9PdXRwdXRQYXRoPgotICAgIDxEZWZpbmVDb25zdGFudHM+VFJBQ0U7U0lMVkVSTElHSFQ7V0lORE9XU19QSE9ORTwvRGVmaW5lQ29uc3RhbnRzPgotICAgIDxOb1N0ZExpYj50cnVlPC9Ob1N0ZExpYj4KLSAgICA8Tm9Db25maWc+dHJ1ZTwvTm9Db25maWc+Ci0gICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+Ci0gICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+Ci0gIDwvUHJvcGVydHlHcm91cD4KLSAgPEl0ZW1Hcm91cD4KLSAgICA8UmVmZXJlbmNlIEluY2x1ZGU9Ik1pY3Jvc29mdC5QaG9uZSIgLz4KLSAgICA8UmVmZXJlbmNlIEluY2x1ZGU9Ik1pY3Jvc29mdC5QaG9uZS5JbnRlcm9wIiAvPgotICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbiIgLz4KLSAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5TZXJ2aWNlbW9kZWwuV2ViIiAvPgotICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLldpbmRvd3MiIC8+Ci0gICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJzeXN0ZW0iIC8+Ci0gICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uQ29yZSIgLz4KLSAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5YbWwiIC8+Ci0gICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uTmV0IiAvPgotICA8L0l0ZW1Hcm91cD4KLSAgPEl0ZW1Hcm91cD4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb2xsZWN0aW9uc1xUQ29sbGVjdGlvbnMuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iQ29sbGVjdGlvbnNcVEhhc2hTZXQuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvcGVydGllc1xBc3NlbWJseUluZm8uV1A3LmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRBYnN0cmFjdEJhc2UuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVEJhc2UuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVEJhc2U2NFV0aWxzLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRCaW5hcnlQcm90b2NvbC5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxURmllbGQuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVEpTT05Qcm90b2NvbC5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUTGlzdC5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUTWFwLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRNZXNzYWdlLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRNZXNzYWdlVHlwZS5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUTXVsdGlwbGV4ZWRQcm9jZXNzb3IuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVE11bHRpcGxleGVkUHJvdG9jb2wuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVFByb3RvY29sLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRQcm90b2NvbERlY29yYXRvci5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUUHJvdG9jb2xFeGNlcHRpb24uY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVFByb3RvY29sRmFjdG9yeS5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUUHJvdG9jb2xVdGlsLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRTZXQuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVFN0cnVjdC5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUVHlwZS5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJURXhjZXB0aW9uLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJUUHJvY2Vzc29yLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxURnJhbWVkVHJhbnNwb3J0LmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUSHR0cENsaWVudC5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVFNpbHZlcmxpZ2h0U29ja2V0LmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUU3RyZWFtVHJhbnNwb3J0LmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUVHJhbnNwb3J0LmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUVHJhbnNwb3J0RXhjZXB0aW9uLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUVHJhbnNwb3J0RmFjdG9yeS5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVE1lbW9yeUJ1ZmZlci5jcyIgLz4KLSAgPC9JdGVtR3JvdXA+Ci0gIDxJbXBvcnQgUHJvamVjdD0iJChNU0J1aWxkRXh0ZW5zaW9uc1BhdGgpXE1pY3Jvc29mdFxTaWx2ZXJsaWdodCBmb3IgUGhvbmVcJChUYXJnZXRGcmFtZXdvcmtWZXJzaW9uKVxNaWNyb3NvZnQuU2lsdmVybGlnaHQuJChUYXJnZXRGcmFtZXdvcmtQcm9maWxlKS5PdmVycmlkZXMudGFyZ2V0cyIgLz4KLSAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRFeHRlbnNpb25zUGF0aClcTWljcm9zb2Z0XFNpbHZlcmxpZ2h0IGZvciBQaG9uZVwkKFRhcmdldEZyYW1ld29ya1ZlcnNpb24pXE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5DU2hhcnAudGFyZ2V0cyIgLz4KLSAgPFByb2plY3RFeHRlbnNpb25zIC8+Ci0gIDwhLS0gVG8gbW9kaWZ5IHlvdXIgYnVpbGQgcHJvY2VzcywgYWRkIHlvdXIgdGFzayBpbnNpZGUgb25lIG9mIHRoZSB0YXJnZXRzIGJlbG93IGFuZCB1bmNvbW1lbnQgaXQuCi0gICAgICAgT3RoZXIgc2ltaWxhciBleHRlbnNpb24gcG9pbnRzIGV4aXN0LCBzZWUgTWljcm9zb2Z0LkNvbW1vbi50YXJnZXRzLgotICA8VGFyZ2V0IE5hbWU9IkJlZm9yZUJ1aWxkIj4KLSAgPC9UYXJnZXQ+Ci0gIDxUYXJnZXQgTmFtZT0iQWZ0ZXJCdWlsZCI+Ci0gIDwvVGFyZ2V0PgotICAtLT4KLTwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UaHJpZnQuY3Nwcm9qIGIvbGliL2NzaGFycC9zcmMvVGhyaWZ0LmNzcHJvagppbmRleCAxOTUwMDVhLi5iZjY1NTY5IDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9UaHJpZnQuY3Nwcm9qCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RocmlmdC5jc3Byb2oKQEAgLTQ1LDI2ICs0NSwyNyBAQAogICAgIDxVcGRhdGVSZXF1aXJlZD5mYWxzZTwvVXBkYXRlUmVxdWlyZWQ+CiAgICAgPE1hcEZpbGVFeHRlbnNpb25zPnRydWU8L01hcEZpbGVFeHRlbnNpb25zPgogICAgIDxBcHBsaWNhdGlvblJldmlzaW9uPjA8L0FwcGxpY2F0aW9uUmV2aXNpb24+Ci0gICAgPEFwcGxpY2F0aW9uVmVyc2lvbj4xLjAuMC4lMmE8L0FwcGxpY2F0aW9uVmVyc2lvbj4KKyAgICA8QXBwbGljYXRpb25WZXJzaW9uPjEuMC4wLjA8L0FwcGxpY2F0aW9uVmVyc2lvbj4KICAgICA8SXNXZWJCb290c3RyYXBwZXI+ZmFsc2U8L0lzV2ViQm9vdHN0cmFwcGVyPgogICAgIDxVc2VBcHBsaWNhdGlvblRydXN0PmZhbHNlPC9Vc2VBcHBsaWNhdGlvblRydXN0PgogICAgIDxCb290c3RyYXBwZXJFbmFibGVkPnRydWU8L0Jvb3RzdHJhcHBlckVuYWJsZWQ+CiAgIDwvUHJvcGVydHlHcm91cD4KICAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdEZWJ1Z3xBbnlDUFUnICI+CiAgICAgPERlYnVnU3ltYm9scz50cnVlPC9EZWJ1Z1N5bWJvbHM+Ci0gICAgPERlYnVnVHlwZT5mdWxsPC9EZWJ1Z1R5cGU+CisgICAgPERlYnVnVHlwZT5wb3J0YWJsZTwvRGVidWdUeXBlPgogICAgIDxPcHRpbWl6ZT5mYWxzZTwvT3B0aW1pemU+CiAgICAgPE91dHB1dFBhdGg+YmluXERlYnVnXDwvT3V0cHV0UGF0aD4KLSAgICA8RGVmaW5lQ29uc3RhbnRzPkRFQlVHO1RSQUNFPC9EZWZpbmVDb25zdGFudHM+CisgICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTtERUJVRzwvRGVmaW5lQ29uc3RhbnRzPgogICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgogICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgogICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0PkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+CiAgIDwvUHJvcGVydHlHcm91cD4KICAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdSZWxlYXNlfEFueUNQVScgIj4KLSAgICA8RGVidWdUeXBlPnBkYm9ubHk8L0RlYnVnVHlwZT4KKyAgICA8RGVidWdUeXBlPnBvcnRhYmxlPC9EZWJ1Z1R5cGU+CiAgICAgPE9wdGltaXplPnRydWU8L09wdGltaXplPgogICAgIDxPdXRwdXRQYXRoPmJpblxSZWxlYXNlXDwvT3V0cHV0UGF0aD4KLSAgICA8RGVmaW5lQ29uc3RhbnRzPlRSQUNFPC9EZWZpbmVDb25zdGFudHM+CisgICAgPERlZmluZUNvbnN0YW50cz4KKyAgICA8L0RlZmluZUNvbnN0YW50cz4KICAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4KICAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4KICAgICA8Q29kZUFuYWx5c2lzUnVsZVNldD5BbGxSdWxlcy5ydWxlc2V0PC9Db2RlQW5hbHlzaXNSdWxlU2V0PgpAQCAtNzksNiArODAsNyBAQAogICA8SXRlbUdyb3VwPgogICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbGxlY3Rpb25zXFRDb2xsZWN0aW9ucy5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb2xsZWN0aW9uc1xUSGFzaFNldC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJOZXQzNVxFeHRlbnNpb25zTmV0MzUuY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvcGVydGllc1xBc3NlbWJseUluZm8uY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVEFic3RyYWN0QmFzZS5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUQmFzZS5jcyIgLz4KQEAgLTEwMSwzMCArMTAzLDM1IEBACiAgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVFNldC5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUU3RydWN0LmNzIiAvPgogICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRUeXBlLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlNlcnZlclxUVGhyZWFkZWRTZXJ2ZXIuY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iU2VydmVyXFRTZXJ2ZXIuY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iU2VydmVyXFRTZXJ2ZXJFdmVudEhhbmRsZXIuY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iU2VydmVyXFRTaW1wbGVTZXJ2ZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iU2VydmVyXFRUaHJlYWRlZFNlcnZlci5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJTZXJ2ZXJcVFRocmVhZFBvb2xTZXJ2ZXIuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iVEV4Y2VwdGlvbi5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJUQXBwbGljYXRpb25FeGNlcHRpb24uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVENvbnRyb2xsaW5nSGFuZGxlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJURXhjZXB0aW9uLmNzIiAvPgogICAgIDxDb21waWxlIEluY2x1ZGU9IlRQcm9jZXNzb3IuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVFByb2Nlc3NvckZhY3RvcnkuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVFByb3RvdHlwZVByb2Nlc3NvckZhY3RvcnkuY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRCdWZmZXJlZFRyYW5zcG9ydC5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVEZyYW1lZFRyYW5zcG9ydC5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVEh0dHBDbGllbnQuY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRIdHRwSGFuZGxlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVE1lbW9yeUJ1ZmZlci5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVE5hbWVkUGlwZUNsaWVudFRyYW5zcG9ydC5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVE5hbWVkUGlwZVNlcnZlclRyYW5zcG9ydC5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVFNlcnZlclNvY2tldC5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVFNlcnZlclRyYW5zcG9ydC5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVFNvY2tldC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVFNvY2tldFZlcnNpb25pemVyLmNzIiAvPgogICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUU3RyZWFtVHJhbnNwb3J0LmNzIiAvPgogICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUVExTU2VydmVyU29ja2V0LmNzIiAvPgogICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUVExTU29ja2V0LmNzIiAvPgogICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUVHJhbnNwb3J0LmNzIiAvPgogICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUVHJhbnNwb3J0RXhjZXB0aW9uLmNzIiAvPgogICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUVHJhbnNwb3J0RmFjdG9yeS5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVE1lbW9yeUJ1ZmZlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUU2luZ2xldG9uUHJvY2Vzc29yRmFjdG9yeS5jcyIgLz4KICAgPC9JdGVtR3JvdXA+CiAgIDxJdGVtR3JvdXA+CiAgICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0Lk5ldC5DbGllbnQuMy41Ij4KQEAgLTE0Nyw0ICsxNTQsNCBAQAogICA8UHJvamVjdEV4dGVuc2lvbnM+CiAgICAgPFZpc3VhbFN0dWRpbyBBbGxvd0V4aXN0aW5nRm9sZGVyPSJ0cnVlIiAvPgogICA8L1Byb2plY3RFeHRlbnNpb25zPgotPC9Qcm9qZWN0PgorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1RocmlmdC5zbG4gYi9saWIvY3NoYXJwL3NyYy9UaHJpZnQuc2xuCmluZGV4IGRkODQzN2QuLmEyOWU0NjggMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1RocmlmdC5zbG4KKysrIGIvbGliL2NzaGFycC9zcmMvVGhyaWZ0LnNsbgpAQCAtNCwzNSArNCw0NCBAQAogUHJvamVjdCgie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iKSA9ICJUaHJpZnQiLCAiVGhyaWZ0LmNzcHJvaiIsICJ7NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfSIKIEVuZFByb2plY3QKIFByb2plY3QoIntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9IikgPSAiVGhyaWZ0VGVzdCIsICIuLlx0ZXN0XFRocmlmdFRlc3RcVGhyaWZ0VGVzdC5jc3Byb2oiLCAiezQ4REQ3NTdGLUNBOTUtNERENy1CREE0LTU4REI2RjEwOEMyQ30iCi0gICAgUHJvamVjdFNlY3Rpb24oUHJvamVjdERlcGVuZGVuY2llcykgPSBwb3N0UHJvamVjdAotICAgICAgICB7NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfSA9IHs0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9Ci0gICAgRW5kUHJvamVjdFNlY3Rpb24KIEVuZFByb2plY3QKIFByb2plY3QoIntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9IikgPSAiVGhyaWZ0TVNCdWlsZFRhc2siLCAiLi5cVGhyaWZ0TVNCdWlsZFRhc2tcVGhyaWZ0TVNCdWlsZFRhc2suY3Nwcm9qIiwgIntFQzBBMDIzMS02NkVBLTQ1OTMtQTc5Mi1DNkNBM0JCODY2OEV9IgogRW5kUHJvamVjdAorUHJvamVjdCgie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iKSA9ICJUaHJpZnQuNDUiLCAiVGhyaWZ0LjQ1LmNzcHJvaiIsICJ7RUJDRTM1REEtQ0Y2QS00MkJDLUEzNTctQTlDMDlCNTM0Mjk5fSIKK0VuZFByb2plY3QKK1Byb2plY3QoIntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9IikgPSAiVGhyaWZ0TVZDVGVzdCIsICIuLlx0ZXN0XFRocmlmdE1WQ1Rlc3RcVGhyaWZ0TVZDVGVzdC5jc3Byb2oiLCAiezg5MUI0NDg3LUM3QkEtNDI3RS1CQkM4LTRDNTk2QzIyOUExMH0iCitFbmRQcm9qZWN0CiBHbG9iYWwKLSAgICBHbG9iYWxTZWN0aW9uKFNvbHV0aW9uQ29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwcmVTb2x1dGlvbgotICAgICAgICBEZWJ1Z3xBbnkgQ1BVID0gRGVidWd8QW55IENQVQotICAgICAgICBSZWxlYXNlfEFueSBDUFUgPSBSZWxlYXNlfEFueSBDUFUKLSAgICBFbmRHbG9iYWxTZWN0aW9uCi0gICAgR2xvYmFsU2VjdGlvbihQcm9qZWN0Q29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwb3N0U29sdXRpb24KLSAgICAgICAgezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCi0gICAgICAgIHs0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKLSAgICAgICAgezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQotICAgICAgICB7NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQotICAgICAgICB7NDhERDc1N0YtQ0E5NS00REQ3LUJEQTQtNThEQjZGMTA4QzJDfS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKLSAgICAgICAgezQ4REQ3NTdGLUNBOTUtNERENy1CREE0LTU4REI2RjEwOEMyQ30uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQotICAgICAgICB7NDhERDc1N0YtQ0E5NS00REQ3LUJEQTQtNThEQjZGMTA4QzJDfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCi0gICAgICAgIHs0OERENzU3Ri1DQTk1LTRERDctQkRBNC01OERCNkYxMDhDMkN9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCi0gICAgICAgIHtFQzBBMDIzMS02NkVBLTQ1OTMtQTc5Mi1DNkNBM0JCODY2OEV9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQotICAgICAgICB7RUMwQTAyMzEtNjZFQS00NTkzLUE3OTItQzZDQTNCQjg2NjhFfS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCi0gICAgICAgIHtFQzBBMDIzMS02NkVBLTQ1OTMtQTc5Mi1DNkNBM0JCODY2OEV9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKLSAgICAgICAge0VDMEEwMjMxLTY2RUEtNDU5My1BNzkyLUM2Q0EzQkI4NjY4RX0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKLSAgICBFbmRHbG9iYWxTZWN0aW9uCi0gICAgR2xvYmFsU2VjdGlvbihNb25vRGV2ZWxvcFByb3BlcnRpZXMpID0gcHJlU29sdXRpb24KLSAgICAgICAgU3RhcnR1cEl0ZW0gPSBUaHJpZnQuY3Nwcm9qCi0gICAgRW5kR2xvYmFsU2VjdGlvbgotICAgIEdsb2JhbFNlY3Rpb24oU29sdXRpb25Qcm9wZXJ0aWVzKSA9IHByZVNvbHV0aW9uCi0gICAgICAgIEhpZGVTb2x1dGlvbk5vZGUgPSBGQUxTRQotICAgIEVuZEdsb2JhbFNlY3Rpb24KKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uQ29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwcmVTb2x1dGlvbgorCQlEZWJ1Z3xBbnkgQ1BVID0gRGVidWd8QW55IENQVQorCQlSZWxlYXNlfEFueSBDUFUgPSBSZWxlYXNlfEFueSBDUFUKKwlFbmRHbG9iYWxTZWN0aW9uCisJR2xvYmFsU2VjdGlvbihQcm9qZWN0Q29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwb3N0U29sdXRpb24KKwkJezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXs0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7NDhERDc1N0YtQ0E5NS00REQ3LUJEQTQtNThEQjZGMTA4QzJDfS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJezQ4REQ3NTdGLUNBOTUtNERENy1CREE0LTU4REI2RjEwOEMyQ30uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7NDhERDc1N0YtQ0E5NS00REQ3LUJEQTQtNThEQjZGMTA4QzJDfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXs0OERENzU3Ri1DQTk1LTRERDctQkRBNC01OERCNkYxMDhDMkN9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtFQzBBMDIzMS02NkVBLTQ1OTMtQTc5Mi1DNkNBM0JCODY2OEV9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7RUMwQTAyMzEtNjZFQS00NTkzLUE3OTItQzZDQTNCQjg2NjhFfS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtFQzBBMDIzMS02NkVBLTQ1OTMtQTc5Mi1DNkNBM0JCODY2OEV9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0VDMEEwMjMxLTY2RUEtNDU5My1BNzkyLUM2Q0EzQkI4NjY4RX0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0VCQ0UzNURBLUNGNkEtNDJCQy1BMzU3LUE5QzA5QjUzNDI5OX0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtFQkNFMzVEQS1DRjZBLTQyQkMtQTM1Ny1BOUMwOUI1MzQyOTl9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJe0VCQ0UzNURBLUNGNkEtNDJCQy1BMzU3LUE5QzA5QjUzNDI5OX0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7RUJDRTM1REEtQ0Y2QS00MkJDLUEzNTctQTlDMDlCNTM0Mjk5fS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7ODkxQjQ0ODctQzdCQS00MjdFLUJCQzgtNEM1OTZDMjI5QTEwfS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJezg5MUI0NDg3LUM3QkEtNDI3RS1CQkM4LTRDNTk2QzIyOUExMH0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7ODkxQjQ0ODctQzdCQS00MjdFLUJCQzgtNEM1OTZDMjI5QTEwfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXs4OTFCNDQ4Ny1DN0JBLTQyN0UtQkJDOC00QzU5NkMyMjlBMTB9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJRW5kR2xvYmFsU2VjdGlvbgorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Qcm9wZXJ0aWVzKSA9IHByZVNvbHV0aW9uCisJCUhpZGVTb2x1dGlvbk5vZGUgPSBGQUxTRQorCUVuZEdsb2JhbFNlY3Rpb24KKwlHbG9iYWxTZWN0aW9uKE1vbm9EZXZlbG9wUHJvcGVydGllcykgPSBwcmVTb2x1dGlvbgorCQkgICAgICAgIFN0YXJ0dXBJdGVtID0gVGhyaWZ0LmNzcHJvagorCUVuZEdsb2JhbFNlY3Rpb24KIEVuZEdsb2JhbApkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RCdWZmZXJlZFRyYW5zcG9ydC5jcyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UQnVmZmVyZWRUcmFuc3BvcnQuY3MKaW5kZXggODliOWNhNy4uODg3MDk4OCAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RCdWZmZXJlZFRyYW5zcG9ydC5jcworKysgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVEJ1ZmZlcmVkVHJhbnNwb3J0LmNzCkBAIC0yMiwxMDUgKzIyLDE3MyBAQAogCiBuYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydAogewotICBwdWJsaWMgY2xhc3MgVEJ1ZmZlcmVkVHJhbnNwb3J0IDogVFRyYW5zcG9ydCwgSURpc3Bvc2FibGUKKyAgICBwdWJsaWMgY2xhc3MgVEJ1ZmZlcmVkVHJhbnNwb3J0IDogVFRyYW5zcG9ydCwgSURpc3Bvc2FibGUKICAgICB7Ci0gICAgICAgIHByaXZhdGUgQnVmZmVyZWRTdHJlYW0gaW5wdXRCdWZmZXI7Ci0gICAgICAgIHByaXZhdGUgQnVmZmVyZWRTdHJlYW0gb3V0cHV0QnVmZmVyOwotICAgICAgICBwcml2YXRlIGludCBidWZTaXplOwotICAgICAgICBwcml2YXRlIFRTdHJlYW1UcmFuc3BvcnQgdHJhbnNwb3J0OworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGludCBidWZTaXplOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IE1lbW9yeVN0cmVhbSBpbnB1dEJ1ZmZlciA9IG5ldyBNZW1vcnlTdHJlYW0oMCk7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgTWVtb3J5U3RyZWFtIG91dHB1dEJ1ZmZlciA9IG5ldyBNZW1vcnlTdHJlYW0oMCk7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgVFRyYW5zcG9ydCB0cmFuc3BvcnQ7CiAKLSAgICAgICAgcHVibGljIFRCdWZmZXJlZFRyYW5zcG9ydChUU3RyZWFtVHJhbnNwb3J0IHRyYW5zcG9ydCkKLSAgICAgICAgICAgIDp0aGlzKHRyYW5zcG9ydCwgMTAyNCkKKyAgICAgICAgcHVibGljIFRCdWZmZXJlZFRyYW5zcG9ydChUVHJhbnNwb3J0IHRyYW5zcG9ydCwgaW50IGJ1ZlNpemUgPSAxMDI0KQogICAgICAgICB7Ci0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBUQnVmZmVyZWRUcmFuc3BvcnQoVFN0cmVhbVRyYW5zcG9ydCB0cmFuc3BvcnQsIGludCBidWZTaXplKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmJ1ZlNpemUgPSBidWZTaXplOworICAgICAgICAgICAgaWYgKHRyYW5zcG9ydCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24oInRyYW5zcG9ydCIpOworICAgICAgICAgICAgaWYgKGJ1ZlNpemUgPD0gMCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oImJ1ZlNpemUiLCAiQnVmZmVyIHNpemUgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlci4iKTsKICAgICAgICAgICAgIHRoaXMudHJhbnNwb3J0ID0gdHJhbnNwb3J0OwotICAgICAgICAgICAgSW5pdEJ1ZmZlcnMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBJbml0QnVmZmVycygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh0cmFuc3BvcnQuSW5wdXRTdHJlYW0gIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnB1dEJ1ZmZlciA9IG5ldyBCdWZmZXJlZFN0cmVhbSh0cmFuc3BvcnQuSW5wdXRTdHJlYW0sIGJ1ZlNpemUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHRyYW5zcG9ydC5PdXRwdXRTdHJlYW0gIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBvdXRwdXRCdWZmZXIgPSBuZXcgQnVmZmVyZWRTdHJlYW0odHJhbnNwb3J0Lk91dHB1dFN0cmVhbSwgYnVmU2l6ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgQ2xvc2VCdWZmZXJzKCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGlucHV0QnVmZmVyICE9IG51bGwgJiYgaW5wdXRCdWZmZXIuQ2FuUmVhZCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnB1dEJ1ZmZlci5DbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG91dHB1dEJ1ZmZlciAhPSBudWxsICYmIG91dHB1dEJ1ZmZlci5DYW5Xcml0ZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBvdXRwdXRCdWZmZXIuQ2xvc2UoKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRoaXMuYnVmU2l6ZSA9IGJ1ZlNpemU7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgVFRyYW5zcG9ydCBVbmRlcmx5aW5nVHJhbnNwb3J0CiAgICAgICAgIHsKLSAgICAgICAgICAgIGdldCB7IHJldHVybiB0cmFuc3BvcnQ7IH0KKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENoZWNrTm90RGlzcG9zZWQoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJhbnNwb3J0OworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNPcGVuCiAgICAgICAgIHsKLSAgICAgICAgICAgIGdldCB7IHJldHVybiB0cmFuc3BvcnQuSXNPcGVuOyB9CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBXZSBjYW4gbGVnaXRpbWF0ZWx5IHRocm93IGhlcmUgYnV0IGJlIG5pY2UgYSBiaXQuCisgICAgICAgICAgICAgICAgLy8gQ2hlY2tOb3REaXNwb3NlZCgpOworICAgICAgICAgICAgICAgIHJldHVybiAhX0lzRGlzcG9zZWQgJiYgdHJhbnNwb3J0LklzT3BlbjsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIE9wZW4oKQogICAgICAgICB7CisgICAgICAgICAgICBDaGVja05vdERpc3Bvc2VkKCk7CiAgICAgICAgICAgICB0cmFuc3BvcnQuT3BlbigpOwotICAgICAgICAgICAgSW5pdEJ1ZmZlcnMoKTsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIENsb3NlKCkKICAgICAgICAgewotICAgICAgICAgICAgQ2xvc2VCdWZmZXJzKCk7CisgICAgICAgICAgICBDaGVja05vdERpc3Bvc2VkKCk7CiAgICAgICAgICAgICB0cmFuc3BvcnQuQ2xvc2UoKTsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgUmVhZChieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKQogICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gaW5wdXRCdWZmZXIuUmVhZChidWYsIG9mZiwgbGVuKTsKKyAgICAgICAgICAgIENoZWNrTm90RGlzcG9zZWQoKTsKKyAgICAgICAgICAgIFZhbGlkYXRlQnVmZmVyQXJncyhidWYsIG9mZiwgbGVuKTsKKyAgICAgICAgICAgIGlmICghSXNPcGVuKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuKTsKKworICAgICAgICAgICAgaWYgKGlucHV0QnVmZmVyLkNhcGFjaXR5IDwgYnVmU2l6ZSkKKyAgICAgICAgICAgICAgICBpbnB1dEJ1ZmZlci5DYXBhY2l0eSA9IGJ1ZlNpemU7CisKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBnb3QgPSBpbnB1dEJ1ZmZlci5SZWFkKGJ1Ziwgb2ZmLCBsZW4pOworICAgICAgICAgICAgICAgIGlmIChnb3QgPiAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ290OworCisgICAgICAgICAgICAgICAgaW5wdXRCdWZmZXIuU2VlaygwLCBTZWVrT3JpZ2luLkJlZ2luKTsKKyAgICAgICAgICAgICAgICBpbnB1dEJ1ZmZlci5TZXRMZW5ndGgoaW5wdXRCdWZmZXIuQ2FwYWNpdHkpOworICAgICAgICAgICAgICAgIGludCBmaWxsZWQgPSB0cmFuc3BvcnQuUmVhZChpbnB1dEJ1ZmZlci5HZXRCdWZmZXIoKSwgMCwgKGludClpbnB1dEJ1ZmZlci5MZW5ndGgpOworICAgICAgICAgICAgICAgIGlucHV0QnVmZmVyLlNldExlbmd0aChmaWxsZWQpOworICAgICAgICAgICAgICAgIGlmIChmaWxsZWQgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZShieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKQogICAgICAgICB7Ci0gICAgICAgICAgICBvdXRwdXRCdWZmZXIuV3JpdGUoYnVmLCBvZmYsIGxlbik7CisgICAgICAgICAgICBDaGVja05vdERpc3Bvc2VkKCk7CisgICAgICAgICAgICBWYWxpZGF0ZUJ1ZmZlckFyZ3MoYnVmLCBvZmYsIGxlbik7CisgICAgICAgICAgICBpZiAoIUlzT3BlbikKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3Blbik7CisgICAgICAgICAgICAvLyBSZWxhdGl2ZSBvZmZzZXQgZnJvbSAib2ZmIiBhcmd1bWVudAorICAgICAgICAgICAgaW50IG9mZnNldCA9IDA7CisgICAgICAgICAgICBpZiAob3V0cHV0QnVmZmVyLkxlbmd0aCA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGNhcGEgPSAoaW50KShvdXRwdXRCdWZmZXIuQ2FwYWNpdHkgLSBvdXRwdXRCdWZmZXIuTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBpbnQgd3JpdGVTaXplID0gY2FwYSA8PSBsZW4gPyBjYXBhIDogbGVuOworICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlci5Xcml0ZShidWYsIG9mZiwgd3JpdGVTaXplKTsKKyAgICAgICAgICAgICAgICBvZmZzZXQgKz0gd3JpdGVTaXplOworICAgICAgICAgICAgICAgIGlmICh3cml0ZVNpemUgPT0gY2FwYSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydC5Xcml0ZShvdXRwdXRCdWZmZXIuR2V0QnVmZmVyKCksIDAsIChpbnQpb3V0cHV0QnVmZmVyLkxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlci5TZXRMZW5ndGgoMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgd2hpbGUgKGxlbiAtIG9mZnNldCA+PSBidWZTaXplKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyYW5zcG9ydC5Xcml0ZShidWYsIG9mZiArIG9mZnNldCwgYnVmU2l6ZSk7CisgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGJ1ZlNpemU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgcmVtYWluID0gbGVuIC0gb2Zmc2V0OworICAgICAgICAgICAgaWYgKHJlbWFpbiA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKG91dHB1dEJ1ZmZlci5DYXBhY2l0eSA8IGJ1ZlNpemUpCisgICAgICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlci5DYXBhY2l0eSA9IGJ1ZlNpemU7CisgICAgICAgICAgICAgICAgb3V0cHV0QnVmZmVyLldyaXRlKGJ1Ziwgb2ZmICsgb2Zmc2V0LCByZW1haW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIEludGVybmFsRmx1c2goKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIUlzT3BlbikKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3Blbik7CisgICAgICAgICAgICBpZiAob3V0cHV0QnVmZmVyLkxlbmd0aCA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJhbnNwb3J0LldyaXRlKG91dHB1dEJ1ZmZlci5HZXRCdWZmZXIoKSwgMCwgKGludClvdXRwdXRCdWZmZXIuTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBvdXRwdXRCdWZmZXIuU2V0TGVuZ3RoKDApOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgRmx1c2goKQogICAgICAgICB7Ci0gICAgICAgICAgICBvdXRwdXRCdWZmZXIuRmx1c2goKTsKKyAgICAgICAgICAgIENoZWNrTm90RGlzcG9zZWQoKTsKKyAgICAgICAgICAgIEludGVybmFsRmx1c2goKTsKKworICAgICAgICAgICAgdHJhbnNwb3J0LkZsdXNoKCk7CiAgICAgICAgIH0KIAotICAgICNyZWdpb24gIiBJRGlzcG9zYWJsZSBTdXBwb3J0ICIKLSAgICBwcml2YXRlIGJvb2wgX0lzRGlzcG9zZWQ7Ci0KLSAgICAvLyBJRGlzcG9zYWJsZQotICAgIHByb3RlY3RlZCBvdmVycmlkZSB2b2lkIERpc3Bvc2UoYm9vbCBkaXNwb3NpbmcpCi0gICAgewotICAgICAgaWYgKCFfSXNEaXNwb3NlZCkKLSAgICAgIHsKLSAgICAgICAgaWYgKGRpc3Bvc2luZykKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIElBc3luY1Jlc3VsdCBCZWdpbkZsdXNoKEFzeW5jQ2FsbGJhY2sgY2FsbGJhY2ssIG9iamVjdCBzdGF0ZSkKICAgICAgICAgewotICAgICAgICAgIGlmIChpbnB1dEJ1ZmZlciAhPSBudWxsKQotICAgICAgICAgICAgaW5wdXRCdWZmZXIuRGlzcG9zZSgpOwotICAgICAgICAgIGlmIChvdXRwdXRCdWZmZXIgIT0gbnVsbCkKLSAgICAgICAgICAgIG91dHB1dEJ1ZmZlci5EaXNwb3NlKCk7CisgICAgICAgICAgICBDaGVja05vdERpc3Bvc2VkKCk7CisgICAgICAgICAgICBJbnRlcm5hbEZsdXNoKCk7CisKKyAgICAgICAgICAgIHJldHVybiB0cmFuc3BvcnQuQmVnaW5GbHVzaCggY2FsbGJhY2ssIHN0YXRlKTsKICAgICAgICAgfQotICAgICAgfQotICAgICAgX0lzRGlzcG9zZWQgPSB0cnVlOworCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIEVuZEZsdXNoKElBc3luY1Jlc3VsdCBhc3luY1Jlc3VsdCkKKyAgICAgICAgeworICAgICAgICAgICAgdHJhbnNwb3J0LkVuZEZsdXNoKCBhc3luY1Jlc3VsdCk7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgQ2hlY2tOb3REaXNwb3NlZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfSXNEaXNwb3NlZCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT2JqZWN0RGlzcG9zZWRFeGNlcHRpb24oIlRCdWZmZXJlZFRyYW5zcG9ydCIpOworICAgICAgICB9CisKKyAgICAgICAgI3JlZ2lvbiAiIElEaXNwb3NhYmxlIFN1cHBvcnQgIgorICAgICAgICBwcm90ZWN0ZWQgYm9vbCBfSXNEaXNwb3NlZCB7IGdldDsgcHJpdmF0ZSBzZXQ7IH0KKworICAgICAgICAvLyBJRGlzcG9zYWJsZQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBEaXNwb3NlKGJvb2wgZGlzcG9zaW5nKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIV9Jc0Rpc3Bvc2VkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChkaXNwb3NpbmcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXRCdWZmZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0QnVmZmVyLkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG91dHB1dEJ1ZmZlciAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0QnVmZmVyLkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRyYW5zcG9ydCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfSXNEaXNwb3NlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgI2VuZHJlZ2lvbgogICAgIH0KLSAgICAjZW5kcmVnaW9uCi0gIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9URnJhbWVkVHJhbnNwb3J0LmNzIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnQuY3MKaW5kZXggOGFmMjI3Zi4uYTc0NmEzMiAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnQuY3MKKysrIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnQuY3MKQEAgLTIxLDE0ICsyMSwxNCBAQAogCiBuYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydAogewotICBwdWJsaWMgY2xhc3MgVEZyYW1lZFRyYW5zcG9ydCA6IFRUcmFuc3BvcnQsIElEaXNwb3NhYmxlCisgICAgcHVibGljIGNsYXNzIFRGcmFtZWRUcmFuc3BvcnQgOiBUVHJhbnNwb3J0LCBJRGlzcG9zYWJsZQogICAgIHsKLSAgICAgICAgcHJvdGVjdGVkIFRUcmFuc3BvcnQgdHJhbnNwb3J0ID0gbnVsbDsKLSAgICAgICAgcHJvdGVjdGVkIE1lbW9yeVN0cmVhbSB3cml0ZUJ1ZmZlcjsKLSAgICAgICAgcHJvdGVjdGVkIE1lbW9yeVN0cmVhbSByZWFkQnVmZmVyID0gbnVsbDsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBUVHJhbnNwb3J0IHRyYW5zcG9ydDsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBNZW1vcnlTdHJlYW0gd3JpdGVCdWZmZXIgPSBuZXcgTWVtb3J5U3RyZWFtKDEwMjQpOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IE1lbW9yeVN0cmVhbSByZWFkQnVmZmVyID0gbmV3IE1lbW9yeVN0cmVhbSgxMDI0KTsKIAotICAgICAgICBwcml2YXRlIGNvbnN0IGludCBoZWFkZXJfc2l6ZSA9IDQ7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSBoZWFkZXJfZHVtbXkgPSBuZXcgYnl0ZVtoZWFkZXJfc2l6ZV07IC8vIHVzZWQgYXMgaGVhZGVyIHBsYWNlaG9sZGVyIHdoaWxlIGluaXRpbGl6aW5nIG5ldyB3cml0ZSBidWZmZXIKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBpbnQgSGVhZGVyU2l6ZSA9IDQ7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgYnl0ZVtdIGhlYWRlckJ1ZiA9IG5ldyBieXRlW0hlYWRlclNpemVdOwogCiAgICAgICAgIHB1YmxpYyBjbGFzcyBGYWN0b3J5IDogVFRyYW5zcG9ydEZhY3RvcnkKICAgICAgICAgewpAQCAtMzgsMTggKzM4LDE3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBwcm90ZWN0ZWQgVEZyYW1lZFRyYW5zcG9ydCgpCisgICAgICAgIHB1YmxpYyBURnJhbWVkVHJhbnNwb3J0KFRUcmFuc3BvcnQgdHJhbnNwb3J0KQogICAgICAgICB7Ci0gICAgICAgICAgICBJbml0V3JpdGVCdWZmZXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBURnJhbWVkVHJhbnNwb3J0KFRUcmFuc3BvcnQgdHJhbnNwb3J0KSA6IHRoaXMoKQotICAgICAgICB7CisgICAgICAgICAgICBpZiAodHJhbnNwb3J0ID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbigidHJhbnNwb3J0Iik7CiAgICAgICAgICAgICB0aGlzLnRyYW5zcG9ydCA9IHRyYW5zcG9ydDsKKyAgICAgICAgICAgIEluaXRXcml0ZUJ1ZmZlcigpOwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgT3BlbigpCiAgICAgICAgIHsKKyAgICAgICAgICAgIENoZWNrTm90RGlzcG9zZWQoKTsKICAgICAgICAgICAgIHRyYW5zcG9ydC5PcGVuKCk7CiAgICAgICAgIH0KIApAQCAtNTcsMjQgKzU2LDI4IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIGdldAogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiB0cmFuc3BvcnQuSXNPcGVuOworICAgICAgICAgICAgICAgIC8vIFdlIGNhbiBsZWdpdGltYXRlbHkgdGhyb3cgaGVyZSBidXQgYmUgbmljZSBhIGJpdC4KKyAgICAgICAgICAgICAgICAvLyBDaGVja05vdERpc3Bvc2VkKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuICFfSXNEaXNwb3NlZCAmJiB0cmFuc3BvcnQuSXNPcGVuOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgQ2xvc2UoKQogICAgICAgICB7CisgICAgICAgICAgICBDaGVja05vdERpc3Bvc2VkKCk7CiAgICAgICAgICAgICB0cmFuc3BvcnQuQ2xvc2UoKTsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgUmVhZChieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKQogICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocmVhZEJ1ZmZlciAhPSBudWxsKQorICAgICAgICAgICAgQ2hlY2tOb3REaXNwb3NlZCgpOworICAgICAgICAgICAgVmFsaWRhdGVCdWZmZXJBcmdzKGJ1Ziwgb2ZmLCBsZW4pOworICAgICAgICAgICAgaWYgKCFJc09wZW4pCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4pOworICAgICAgICAgICAgaW50IGdvdCA9IHJlYWRCdWZmZXIuUmVhZChidWYsIG9mZiwgbGVuKTsKKyAgICAgICAgICAgIGlmIChnb3QgPiAwKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBnb3QgPSByZWFkQnVmZmVyLlJlYWQoYnVmLCBvZmYsIGxlbik7Ci0gICAgICAgICAgICAgICAgaWYgKGdvdCA+IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ290OwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gZ290OwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBSZWFkIGFub3RoZXIgZnJhbWUgb2YgZGF0YQpAQCAtODUsNDkgKzg4LDc1IEBACiAKICAgICAgICAgcHJpdmF0ZSB2b2lkIFJlYWRGcmFtZSgpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGJ5dGVbXSBpMzJyZCA9IG5ldyBieXRlW2hlYWRlcl9zaXplXTsKLSAgICAgICAgICAgIHRyYW5zcG9ydC5SZWFkQWxsKGkzMnJkLCAwLCBoZWFkZXJfc2l6ZSk7Ci0gICAgICAgICAgICBpbnQgc2l6ZSA9IERlY29kZUZyYW1lU2l6ZShpMzJyZCk7CisgICAgICAgICAgICB0cmFuc3BvcnQuUmVhZEFsbChoZWFkZXJCdWYsIDAsIEhlYWRlclNpemUpOworICAgICAgICAgICAgaW50IHNpemUgPSBEZWNvZGVGcmFtZVNpemUoaGVhZGVyQnVmKTsKIAotICAgICAgICAgICAgYnl0ZVtdIGJ1ZmYgPSBuZXcgYnl0ZVtzaXplXTsKKyAgICAgICAgICAgIHJlYWRCdWZmZXIuU2V0TGVuZ3RoKHNpemUpOworICAgICAgICAgICAgcmVhZEJ1ZmZlci5TZWVrKDAsIFNlZWtPcmlnaW4uQmVnaW4pOworICAgICAgICAgICAgYnl0ZVtdIGJ1ZmYgPSByZWFkQnVmZmVyLkdldEJ1ZmZlcigpOwogICAgICAgICAgICAgdHJhbnNwb3J0LlJlYWRBbGwoYnVmZiwgMCwgc2l6ZSk7Ci0gICAgICAgICAgICByZWFkQnVmZmVyID0gbmV3IE1lbW9yeVN0cmVhbShidWZmKTsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pCiAgICAgICAgIHsKKyAgICAgICAgICAgIENoZWNrTm90RGlzcG9zZWQoKTsKKyAgICAgICAgICAgIFZhbGlkYXRlQnVmZmVyQXJncyhidWYsIG9mZiwgbGVuKTsKKyAgICAgICAgICAgIGlmICghSXNPcGVuKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuKTsKKyAgICAgICAgICAgIGlmICh3cml0ZUJ1ZmZlci5MZW5ndGggKyAobG9uZylsZW4gPiAobG9uZylpbnQuTWF4VmFsdWUpCisgICAgICAgICAgICAgICAgRmx1c2goKTsKICAgICAgICAgICAgIHdyaXRlQnVmZmVyLldyaXRlKGJ1Ziwgb2ZmLCBsZW4pOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgRmx1c2goKQorICAgICAgICBwcml2YXRlIHZvaWQgSW50ZXJuYWxGbHVzaCgpCiAgICAgICAgIHsKKyAgICAgICAgICAgIENoZWNrTm90RGlzcG9zZWQoKTsKKyAgICAgICAgICAgIGlmICghSXNPcGVuKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuKTsKICAgICAgICAgICAgIGJ5dGVbXSBidWYgPSB3cml0ZUJ1ZmZlci5HZXRCdWZmZXIoKTsKICAgICAgICAgICAgIGludCBsZW4gPSAoaW50KXdyaXRlQnVmZmVyLkxlbmd0aDsKLSAgICAgICAgICAgIGludCBkYXRhX2xlbiA9IGxlbiAtIGhlYWRlcl9zaXplOwotICAgICAgICAgICAgaWYgKCBkYXRhX2xlbiA8IDAgKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBTeXN0ZW0uSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbiAoKTsgLy8gbG9naWMgZXJyb3IgYWN0dWFsbHkKLQotICAgICAgICAgICAgSW5pdFdyaXRlQnVmZmVyKCk7CisgICAgICAgICAgICBpbnQgZGF0YV9sZW4gPSBsZW4gLSBIZWFkZXJTaXplOworICAgICAgICAgICAgaWYgKGRhdGFfbGVuIDwgMCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3lzdGVtLkludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oKTsgLy8gbG9naWMgZXJyb3IgYWN0dWFsbHkKIAogICAgICAgICAgICAgLy8gSW5qZWN0IG1lc3NhZ2UgaGVhZGVyIGludG8gdGhlIHJlc2VydmVkIGJ1ZmZlciBzcGFjZQotICAgICAgICAgICAgRW5jb2RlRnJhbWVTaXplKGRhdGFfbGVuLHJlZiBidWYpOworICAgICAgICAgICAgRW5jb2RlRnJhbWVTaXplKGRhdGFfbGVuLCBidWYpOwogCiAgICAgICAgICAgICAvLyBTZW5kIHRoZSBlbnRpcmUgbWVzc2FnZSBhdCBvbmNlCiAgICAgICAgICAgICB0cmFuc3BvcnQuV3JpdGUoYnVmLCAwLCBsZW4pOwogCisgICAgICAgICAgICBJbml0V3JpdGVCdWZmZXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIEZsdXNoKCkKKyAgICAgICAgeworICAgICAgICAgICAgQ2hlY2tOb3REaXNwb3NlZCgpOworICAgICAgICAgICAgSW50ZXJuYWxGbHVzaCgpOworCiAgICAgICAgICAgICB0cmFuc3BvcnQuRmx1c2goKTsKICAgICAgICAgfQogCi0gICAgICAgIHByaXZhdGUgdm9pZCBJbml0V3JpdGVCdWZmZXIgKCkKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIElBc3luY1Jlc3VsdCBCZWdpbkZsdXNoKEFzeW5jQ2FsbGJhY2sgY2FsbGJhY2ssIG9iamVjdCBzdGF0ZSkKICAgICAgICAgewotICAgICAgICAgICAgLy8gQ3JlYXRlIG5ldyBidWZmZXIgaW5zdGFuY2UKLSAgICAgICAgICAgIHdyaXRlQnVmZmVyID0gbmV3IE1lbW9yeVN0cmVhbSgxMDI0KTsKKyAgICAgICAgICAgIENoZWNrTm90RGlzcG9zZWQoKTsKKyAgICAgICAgICAgIEludGVybmFsRmx1c2goKTsKIAotICAgICAgICAgICAgLy8gUmVzZXJ2ZSBzcGFjZSBmb3IgbWVzc2FnZSBoZWFkZXIgdG8gYmUgcHV0IHJpZ2h0IGJlZm9yZSBzZW5kaW5nIGl0IG91dAotICAgICAgICAgICAgd3JpdGVCdWZmZXIuV3JpdGUgKCBoZWFkZXJfZHVtbXksIDAsIGhlYWRlcl9zaXplICk7CisgICAgICAgICAgICByZXR1cm4gdHJhbnNwb3J0LkJlZ2luRmx1c2goIGNhbGxiYWNrLCBzdGF0ZSk7CiAgICAgICAgIH0KIAotICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIEVuY29kZUZyYW1lU2l6ZShpbnQgZnJhbWVTaXplLCByZWYgYnl0ZVtdIGJ1ZikKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgRW5kRmx1c2goSUFzeW5jUmVzdWx0IGFzeW5jUmVzdWx0KQorICAgICAgICB7CisgICAgICAgICAgICB0cmFuc3BvcnQuRW5kRmx1c2goIGFzeW5jUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBJbml0V3JpdGVCdWZmZXIoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBSZXNlcnZlIHNwYWNlIGZvciBtZXNzYWdlIGhlYWRlciB0byBiZSBwdXQgcmlnaHQgYmVmb3JlIHNlbmRpbmcgaXQgb3V0CisgICAgICAgICAgICB3cml0ZUJ1ZmZlci5TZXRMZW5ndGgoSGVhZGVyU2l6ZSk7CisgICAgICAgICAgICB3cml0ZUJ1ZmZlci5TZWVrKDAsIFNlZWtPcmlnaW4uRW5kKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgRW5jb2RlRnJhbWVTaXplKGludCBmcmFtZVNpemUsIGJ5dGVbXSBidWYpCiAgICAgICAgIHsKICAgICAgICAgICAgIGJ1ZlswXSA9IChieXRlKSgweGZmICYgKGZyYW1lU2l6ZSA+PiAyNCkpOwogICAgICAgICAgICAgYnVmWzFdID0gKGJ5dGUpKDB4ZmYgJiAoZnJhbWVTaXplID4+IDE2KSk7CkBAIC0xNDAsMTEgKzE2OSwxNyBAQAogICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgICAgICAgKChidWZbMF0gJiAweGZmKSA8PCAyNCkgfAogICAgICAgICAgICAgICAgICgoYnVmWzFdICYgMHhmZikgPDwgMTYpIHwKLSAgICAgICAgICAgICAgICAoKGJ1ZlsyXSAmIDB4ZmYpIDw8ICA4KSB8CisgICAgICAgICAgICAgICAgKChidWZbMl0gJiAweGZmKSA8PCA4KSB8CiAgICAgICAgICAgICAgICAgKChidWZbM10gJiAweGZmKSk7CiAgICAgICAgIH0KIAogCisgICAgICAgIHByaXZhdGUgdm9pZCBDaGVja05vdERpc3Bvc2VkKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9Jc0Rpc3Bvc2VkKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBPYmplY3REaXNwb3NlZEV4Y2VwdGlvbigiVEZyYW1lZFRyYW5zcG9ydCIpOworICAgICAgICB9CisKICAgICAgICAgI3JlZ2lvbiAiIElEaXNwb3NhYmxlIFN1cHBvcnQgIgogICAgICAgICBwcml2YXRlIGJvb2wgX0lzRGlzcG9zZWQ7CiAKQEAgLTE1Nyw2ICsxOTIsMTAgQEAKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkQnVmZmVyICE9IG51bGwpCiAgICAgICAgICAgICAgICAgICAgICAgICByZWFkQnVmZmVyLkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHdyaXRlQnVmZmVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUJ1ZmZlci5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc3BvcnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydC5EaXNwb3NlKCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgX0lzRGlzcG9zZWQgPSB0cnVlOwpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RIdHRwQ2xpZW50LmNzIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RIdHRwQ2xpZW50LmNzCmluZGV4IGE1NmEzZTguLjY2N2ZjMjUgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9USHR0cENsaWVudC5jcworKysgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVEh0dHBDbGllbnQuY3MKQEAgLTI2LDEwICsyNiwxMCBAQAogdXNpbmcgU3lzdGVtLlRocmVhZGluZzsKIHVzaW5nIFN5c3RlbS5MaW5xOwogdXNpbmcgU3lzdGVtLlNlY3VyaXR5LkNyeXB0b2dyYXBoeS5YNTA5Q2VydGlmaWNhdGVzOwordXNpbmcgU3lzdGVtLklPLkNvbXByZXNzaW9uOwogCiBuYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydAogewotCiAgICAgcHVibGljIGNsYXNzIFRIdHRwQ2xpZW50IDogVFRyYW5zcG9ydCwgSURpc3Bvc2FibGUKICAgICB7CiAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgVXJpIHVyaTsKQEAgLTQyLDcgKzQyLDcgQEAKIAogICAgICAgICBwcml2YXRlIGludCByZWFkVGltZW91dCA9IDMwMDAwOwogCi0gICAgICAgIHByaXZhdGUgSURpY3Rpb25hcnk8U3RyaW5nLCBTdHJpbmc+IGN1c3RvbUhlYWRlcnMgPSBuZXcgRGljdGlvbmFyeTxzdHJpbmcsIHN0cmluZz4oKTsKKyAgICAgICAgcHJpdmF0ZSBJRGljdGlvbmFyeTxzdHJpbmcsIHN0cmluZz4gY3VzdG9tSGVhZGVycyA9IG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgc3RyaW5nPigpOwogCiAjaWYgIVNJTFZFUkxJR0hUCiAgICAgICAgIHByaXZhdGUgSVdlYlByb3h5IHByb3h5ID0gV2ViUmVxdWVzdC5EZWZhdWx0V2ViUHJveHk7CkBAIC02Myw3ICs2Myw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIHNldAogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgY29ubmVjdFRpbWVvdXQgPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICBjb25uZWN0VGltZW91dCA9IHZhbHVlOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTc1LDcgKzc1LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyBJRGljdGlvbmFyeTxTdHJpbmcsIFN0cmluZz4gQ3VzdG9tSGVhZGVycworICAgICAgICBwdWJsaWMgSURpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc+IEN1c3RvbUhlYWRlcnMKICAgICAgICAgewogICAgICAgICAgICAgZ2V0CiAgICAgICAgICAgICB7CkBAIC0xMzksNyArMTM5LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBpb3gpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLlVua25vd24sIGlveC5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuVW5rbm93biwgaW94LlRvU3RyaW5nKCksIGlveCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMTY2LDYgKzE2Niw3IEBACiAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBIdHRwV2ViUmVxdWVzdCBjb25uZWN0aW9uID0gQ3JlYXRlUmVxdWVzdCgpOworICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uSGVhZGVycy5BZGQoIkFjY2VwdC1FbmNvZGluZyIsICJnemlwLCBkZWZsYXRlIik7CiAKICAgICAgICAgICAgICAgICBieXRlW10gZGF0YSA9IG91dHB1dFN0cmVhbS5Ub0FycmF5KCk7CiAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi5Db250ZW50TGVuZ3RoID0gZGF0YS5MZW5ndGg7CkBAIC0xODQsMjYgKzE4NSw2OSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvcHkgdGhlIHJlc3BvbnNlIHRvIGEgbWVtb3J5IHN0cmVhbSBzbyB0aGF0IHdlIGNhbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNsZWFubHkgY2xvc2UgdGhlIHJlc3BvbnNlIGFuZCByZXNwb25zZSBzdHJlYW0uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRTdHJlYW0gPSBuZXcgTWVtb3J5U3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzgwOTZdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVs4MTkyXTsgIC8vIG11bHRpcGxlIG9mIDQwOTYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnl0ZXNSZWFkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgoYnl0ZXNSZWFkID0gcmVzcG9uc2VTdHJlYW0uUmVhZChidWZmZXIsIDAsIGJ1ZmZlci5MZW5ndGgpKSA+IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbS5Xcml0ZSAoYnVmZmVyLCAwLCBieXRlc1JlYWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbS5Xcml0ZShidWZmZXIsIDAsIGJ5dGVzUmVhZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0U3RyZWFtLlNlZWsoMCwgMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlbmNvZGluZ3MgPSByZXNwb25zZS5IZWFkZXJzLkdldFZhbHVlcygiQ29udGVudC1FbmNvZGluZyIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVuY29kaW5ncyAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBlbmNvZGluZyBpbiBlbmNvZGluZ3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGVuY29kaW5nKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJnemlwIjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNvbXByZXNzR1ppcHBlZChyZWYgaW5wdXRTdHJlYW0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiZGVmbGF0ZSI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjb21wcmVzc0RlZmxhdGVkKHJlZiBpbnB1dFN0cmVhbSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGlveCkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuVW5rbm93biwgaW94LlRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Vbmtub3duLCBpb3guVG9TdHJpbmcoKSwgaW94KTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNhdGNoIChXZWJFeGNlcHRpb24gd3gpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLlVua25vd24sICJDb3VsZG4ndCBjb25uZWN0IHRvIHNlcnZlcjogIiArIHd4KTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuVW5rbm93biwgIkNvdWxkbid0IGNvbm5lY3QgdG8gc2VydmVyOiAiICsgd3gsIHd4KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBEZWNvbXByZXNzRGVmbGF0ZWQocmVmIFN0cmVhbSBpbnB1dFN0cmVhbSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHRtcCA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKKyAgICAgICAgICAgIHVzaW5nICh2YXIgZGVjb21wID0gbmV3IERlZmxhdGVTdHJlYW0oaW5wdXRTdHJlYW0sIENvbXByZXNzaW9uTW9kZS5EZWNvbXByZXNzKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkZWNvbXAuQ29weVRvKHRtcCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnB1dFN0cmVhbS5EaXNwb3NlKCk7CisgICAgICAgICAgICBpbnB1dFN0cmVhbSA9IHRtcDsKKyAgICAgICAgICAgIGlucHV0U3RyZWFtLlNlZWsoMCwgMCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgRGVjb21wcmVzc0daaXBwZWQocmVmIFN0cmVhbSBpbnB1dFN0cmVhbSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHRtcCA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKKyAgICAgICAgICAgIHVzaW5nICh2YXIgZGVjb21wID0gbmV3IEdaaXBTdHJlYW0oaW5wdXRTdHJlYW0sIENvbXByZXNzaW9uTW9kZS5EZWNvbXByZXNzKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkZWNvbXAuQ29weVRvKHRtcCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnB1dFN0cmVhbS5EaXNwb3NlKCk7CisgICAgICAgICAgICBpbnB1dFN0cmVhbSA9IHRtcDsKKyAgICAgICAgICAgIGlucHV0U3RyZWFtLlNlZWsoMCwgMCk7CisgICAgICAgIH0KICNlbmRpZgogICAgICAgICBwcml2YXRlIEh0dHBXZWJSZXF1ZXN0IENyZWF0ZVJlcXVlc3QoKQogICAgICAgICB7CkBAIC0yNzIsNyArMzE2LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBpb3gpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oaW94LlRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKGlveC5Ub1N0cmluZygpLCBpb3gpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTI4MCw3ICszMjQsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgZmx1c2hBc3luY1Jlc3VsdCA9IChGbHVzaEFzeW5jUmVzdWx0KSBhc3luY1Jlc3VsdDsKKyAgICAgICAgICAgICAgICB2YXIgZmx1c2hBc3luY1Jlc3VsdCA9IChGbHVzaEFzeW5jUmVzdWx0KWFzeW5jUmVzdWx0OwogCiAgICAgICAgICAgICAgICAgaWYgKCFmbHVzaEFzeW5jUmVzdWx0LklzQ29tcGxldGVkKQogICAgICAgICAgICAgICAgIHsKQEAgLTI5Myw3ICszMzcsOCBAQAogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZmx1c2hBc3luY1Jlc3VsdC5Bc3luY0V4Y2VwdGlvbjsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGZpbmFsbHkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsbHkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW0gPSBuZXcgTWVtb3J5U3RyZWFtKCk7CiAgICAgICAgICAgICB9CkBAIC0zMTUsNyArMzYwLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZsdXNoQXN5bmNSZXN1bHQuQXN5bmNFeGNlcHRpb24gPSBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihleGNlcHRpb24uVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgZmx1c2hBc3luY1Jlc3VsdC5Bc3luY0V4Y2VwdGlvbiA9IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKGV4Y2VwdGlvbi5Ub1N0cmluZygpLCBleGNlcHRpb24pOwogICAgICAgICAgICAgICAgIGZsdXNoQXN5bmNSZXN1bHQuVXBkYXRlU3RhdHVzVG9Db21wbGV0ZSgpOwogICAgICAgICAgICAgICAgIGZsdXNoQXN5bmNSZXN1bHQuTm90aWZ5Q2FsbGJhY2tXaGVuQXZhaWxhYmxlKCk7CiAgICAgICAgICAgICB9CkBAIC0zMzAsNyArMzc1LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZsdXNoQXN5bmNSZXN1bHQuQXN5bmNFeGNlcHRpb24gPSBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihleGNlcHRpb24uVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgZmx1c2hBc3luY1Jlc3VsdC5Bc3luY0V4Y2VwdGlvbiA9IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKGV4Y2VwdGlvbi5Ub1N0cmluZygpLCBleGNlcHRpb24pOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZmx1c2hBc3luY1Jlc3VsdC5VcGRhdGVTdGF0dXNUb0NvbXBsZXRlKCk7CiAgICAgICAgICAgICBmbHVzaEFzeW5jUmVzdWx0Lk5vdGlmeUNhbGxiYWNrV2hlbkF2YWlsYWJsZSgpOwpAQCAtMzQyLDkgKzM4Nyw5IEBACiAgICAgICAgICAgICBwcml2YXRlIHZvbGF0aWxlIEJvb2xlYW4gX2lzQ29tcGxldGVkOwogICAgICAgICAgICAgcHJpdmF0ZSBNYW51YWxSZXNldEV2ZW50IF9ldnQ7CiAgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IEFzeW5jQ2FsbGJhY2sgX2NiTWV0aG9kOwotICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBPYmplY3QgX3N0YXRlOworICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBvYmplY3QgX3N0YXRlOwogCi0gICAgICAgICAgICBwdWJsaWMgRmx1c2hBc3luY1Jlc3VsdChBc3luY0NhbGxiYWNrIGNiTWV0aG9kLCBPYmplY3Qgc3RhdGUpCisgICAgICAgICAgICBwdWJsaWMgRmx1c2hBc3luY1Jlc3VsdChBc3luY0NhbGxiYWNrIGNiTWV0aG9kLCBvYmplY3Qgc3RhdGUpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgX2NiTWV0aG9kID0gY2JNZXRob2Q7CiAgICAgICAgICAgICAgICAgX3N0YXRlID0gc3RhdGU7CkBAIC0zNzAsNyArNDE1LDcgQEAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBnZXQgeyByZXR1cm4gX2lzQ29tcGxldGVkOyB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IE9iamVjdCBfbG9ja2VyID0gbmV3IE9iamVjdCgpOworICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBvYmplY3QgX2xvY2tlciA9IG5ldyBvYmplY3QoKTsKICAgICAgICAgICAgIHByaXZhdGUgTWFudWFsUmVzZXRFdmVudCBHZXRFdnRIYW5kbGUoKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGxvY2sgKF9sb2NrZXIpCkBAIC00MDcsNyArNDUyLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0jcmVnaW9uICIgSURpc3Bvc2FibGUgU3VwcG9ydCAiCisgICAgICAgICNyZWdpb24gIiBJRGlzcG9zYWJsZSBTdXBwb3J0ICIKICAgICAgICAgcHJpdmF0ZSBib29sIF9Jc0Rpc3Bvc2VkOwogCiAgICAgICAgIC8vIElEaXNwb3NhYmxlCkBAIC00MjUsNiArNDcwLDYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIF9Jc0Rpc3Bvc2VkID0gdHJ1ZTsKICAgICAgICAgfQotI2VuZHJlZ2lvbgorICAgICAgICAjZW5kcmVnaW9uCiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RIdHRwVGFza0FzeW5jSGFuZGxlci5jcyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9USHR0cFRhc2tBc3luY0hhbmRsZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ5MWYzMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9USHR0cFRhc2tBc3luY0hhbmRsZXIuY3MKQEAgLTAsMCArMSw5NyBAQAor77u/LyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KKyAqIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCisgKiBkZXRhaWxzLgorICovCisKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBTeXN0ZW0uV2ViOwordXNpbmcgVGhyaWZ0LlByb3RvY29sOworCituYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydAoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQW4gYXN5bmMgdGFzayBiYXNlZCBIVFRQIGhhbmRsZXIgZm9yIHByb2Nlc3NpbmcgdGhyaWZ0IHNlcnZpY2VzLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGNsYXNzIFRIdHRwVGFza0FzeW5jSGFuZGxlciA6IEh0dHBUYXNrQXN5bmNIYW5kbGVyCisgICAgeworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFRBc3luY1Byb2Nlc3NvciBfcHJvY2Vzc29yOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFRQcm90b2NvbEZhY3RvcnkgX2lucHV0UHJvdG9jb2xGYWN0b3J5OworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFRQcm90b2NvbEZhY3RvcnkgX291dHB1dFByb3RvY29sRmFjdG9yeTsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgPHNlZSBjcmVmPSJUSHR0cFRhc2tBc3luY0hhbmRsZXIiLz4gY2xhc3MKKyAgICAgICAgLy8vIHVzaW5nIHRoZSA8c2VlIGNyZWY9IlRCaW5hcnlQcm90b2NvbC5GYWN0b3J5Ii8+IGZvciBib3RoIGlucHV0IGFuZCBvdXRwdXQgc3RyZWFtcy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJwcm9jZXNzb3IiPlRoZSBhc3luYyBwcm9jZXNzb3IgaW1wbGVtZW50YXRpb24uPC9wYXJhbT4KKyAgICAgICAgcHVibGljIFRIdHRwVGFza0FzeW5jSGFuZGxlcihUQXN5bmNQcm9jZXNzb3IgcHJvY2Vzc29yKQorICAgICAgICAgICAgOiB0aGlzKHByb2Nlc3NvciwgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCkpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSA8c2VlIGNyZWY9IlRIdHRwVGFza0FzeW5jSGFuZGxlciIvPiBjbGFzcworICAgICAgICAvLy8gdXNpbmcgPHBhcmFtcmVmIG5hbWU9InByb3RvY29sRmFjdG9yeSIvPiBmb3IgYm90aCBpbnB1dCBhbmQgb3V0cHV0IHN0cmVhbXMuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icHJvY2Vzc29yIj5UaGUgYXN5bmMgcHJvY2Vzc29yIGltcGxlbWVudGF0aW9uLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icHJvdG9jb2xGYWN0b3J5Ij5UaGUgcHJvdG9jb2wgZmFjdG9yeS48L3BhcmFtPgorICAgICAgICBwdWJsaWMgVEh0dHBUYXNrQXN5bmNIYW5kbGVyKFRBc3luY1Byb2Nlc3NvciBwcm9jZXNzb3IsIFRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5KQorICAgICAgICAgICAgOiB0aGlzKHByb2Nlc3NvciwgcHJvdG9jb2xGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSA8c2VlIGNyZWY9IlRIdHRwVGFza0FzeW5jSGFuZGxlciIvPiBjbGFzcy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJwcm9jZXNzb3IiPlRoZSBhc3luYyBwcm9jZXNzb3IgaW1wbGVtZW50YXRpb24uPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJpbnB1dFByb3RvY29sRmFjdG9yeSI+VGhlIGlucHV0IHByb3RvY29sIGZhY3RvcnkuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJvdXRwdXRQcm90b2NvbEZhY3RvcnkiPlRoZSBvdXRwdXQgcHJvdG9jb2wgZmFjdG9yeS48L3BhcmFtPgorICAgICAgICBwdWJsaWMgVEh0dHBUYXNrQXN5bmNIYW5kbGVyKFRBc3luY1Byb2Nlc3NvciBwcm9jZXNzb3IsIFRQcm90b2NvbEZhY3RvcnkgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IG91dHB1dFByb3RvY29sRmFjdG9yeSkKKyAgICAgICAgeworICAgICAgICAgICAgX3Byb2Nlc3NvciA9IHByb2Nlc3NvcjsKKyAgICAgICAgICAgIF9pbnB1dFByb3RvY29sRmFjdG9yeSA9IGlucHV0UHJvdG9jb2xGYWN0b3J5OworICAgICAgICAgICAgX291dHB1dFByb3RvY29sRmFjdG9yeSA9IG91dHB1dFByb3RvY29sRmFjdG9yeTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFByb2Nlc3NSZXF1ZXN0QXN5bmMoSHR0cENvbnRleHQgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHRyYW5zcG9ydCA9IG5ldyBUU3RyZWFtVHJhbnNwb3J0KGNvbnRleHQuUmVxdWVzdC5JbnB1dFN0cmVhbSwgY29udGV4dC5SZXNwb25zZS5PdXRwdXRTdHJlYW0pOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgaW5wdXQgPSBfaW5wdXRQcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICB2YXIgb3V0cHV0ID0gX291dHB1dFByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbCh0cmFuc3BvcnQpOworCisgICAgICAgICAgICAgICAgd2hpbGUgKGF3YWl0IF9wcm9jZXNzb3IuUHJvY2Vzc0FzeW5jKGlucHV0LCBvdXRwdXQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBDbGllbnQgZGllZCwganVzdCBtb3ZlIG9uCisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbGx5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJhbnNwb3J0LkNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVE1lbW9yeUJ1ZmZlci5jcyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UTWVtb3J5QnVmZmVyLmNzCmluZGV4IGQ4ZmY5ZGMuLjMwM2QwODMgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UTWVtb3J5QnVmZmVyLmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UTWVtb3J5QnVmZmVyLmNzCkBAIC0yMiw0NSArMjIsNTYgQEAKIHVzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwogdXNpbmcgVGhyaWZ0LlByb3RvY29sOwogCi1uYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydCB7Ci0gICAgcHVibGljIGNsYXNzIFRNZW1vcnlCdWZmZXIgOiBUVHJhbnNwb3J0IHsKK25hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0Cit7CisgICAgcHVibGljIGNsYXNzIFRNZW1vcnlCdWZmZXIgOiBUVHJhbnNwb3J0CisgICAgewogCiAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgTWVtb3J5U3RyZWFtIGJ5dGVTdHJlYW07CiAKLSAgICAgICAgcHVibGljIFRNZW1vcnlCdWZmZXIoKSB7CisgICAgICAgIHB1YmxpYyBUTWVtb3J5QnVmZmVyKCkKKyAgICAgICAgewogICAgICAgICAgICAgYnl0ZVN0cmVhbSA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyBUTWVtb3J5QnVmZmVyKGJ5dGVbXSBidWYpIHsKKyAgICAgICAgcHVibGljIFRNZW1vcnlCdWZmZXIoYnl0ZVtdIGJ1ZikKKyAgICAgICAgewogICAgICAgICAgICAgYnl0ZVN0cmVhbSA9IG5ldyBNZW1vcnlTdHJlYW0oYnVmKTsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIE9wZW4oKSB7CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIE9wZW4oKQorICAgICAgICB7CiAgICAgICAgICAgICAvKiogZG8gbm90aGluZyAqKi8KICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIENsb3NlKCkgeworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBDbG9zZSgpCisgICAgICAgIHsKICAgICAgICAgICAgIC8qKiBkbyBub3RoaW5nICoqLwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBSZWFkKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pIHsKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBSZWFkKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pCisgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiBieXRlU3RyZWFtLlJlYWQoYnVmLCBvZmYsIGxlbik7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZShieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKSB7CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pCisgICAgICAgIHsKICAgICAgICAgICAgIGJ5dGVTdHJlYW0uV3JpdGUoYnVmLCBvZmYsIGxlbik7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgYnl0ZVtdIEdldEJ1ZmZlcigpIHsKKyAgICAgICAgcHVibGljIGJ5dGVbXSBHZXRCdWZmZXIoKQorICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gYnl0ZVN0cmVhbS5Ub0FycmF5KCk7CiAgICAgICAgIH0KIAogCi0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzT3BlbiB7CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzT3BlbgorICAgICAgICB7CiAgICAgICAgICAgICBnZXQgeyByZXR1cm4gdHJ1ZTsgfQogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIHN0YXRpYyBieXRlW10gU2VyaWFsaXplKFRBYnN0cmFjdEJhc2UgcykgeworICAgICAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBTZXJpYWxpemUoVEFic3RyYWN0QmFzZSBzKQorICAgICAgICB7CiAgICAgICAgICAgICB2YXIgdCA9IG5ldyBUTWVtb3J5QnVmZmVyKCk7CiAgICAgICAgICAgICB2YXIgcCA9IG5ldyBUQmluYXJ5UHJvdG9jb2wodCk7CiAKQEAgLTY5LDI2ICs4MCwzMyBAQAogICAgICAgICAgICAgcmV0dXJuIHQuR2V0QnVmZmVyKCk7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgc3RhdGljIFQgRGVTZXJpYWxpemU8VD4oYnl0ZVtdIGJ1Zikgd2hlcmUgVCA6IFRBYnN0cmFjdEJhc2UgeworICAgICAgICBwdWJsaWMgc3RhdGljIFQgRGVTZXJpYWxpemU8VD4oYnl0ZVtdIGJ1Zikgd2hlcmUgVCA6IFRBYnN0cmFjdEJhc2UKKyAgICAgICAgewogICAgICAgICAgICAgdmFyIHRyYW5zID0gbmV3IFRNZW1vcnlCdWZmZXIoYnVmKTsKICAgICAgICAgICAgIHZhciBwID0gbmV3IFRCaW5hcnlQcm90b2NvbCh0cmFucyk7Ci0gICAgICAgICAgICBpZiAodHlwZW9mIChUQmFzZSkuSXNBc3NpZ25hYmxlRnJvbSh0eXBlb2YgKFQpKSkgewotICAgICAgICAgICAgICAgIHZhciBtZXRob2QgPSB0eXBlb2YgKFQpLkdldE1ldGhvZCgiUmVhZCIsIEJpbmRpbmdGbGFncy5JbnN0YW5jZSB8IEJpbmRpbmdGbGFncy5QdWJsaWMpOworICAgICAgICAgICAgaWYgKHR5cGVvZihUQmFzZSkuSXNBc3NpZ25hYmxlRnJvbSh0eXBlb2YoVCkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBtZXRob2QgPSB0eXBlb2YoVCkuR2V0TWV0aG9kKCJSZWFkIiwgQmluZGluZ0ZsYWdzLkluc3RhbmNlIHwgQmluZGluZ0ZsYWdzLlB1YmxpYyk7CiAgICAgICAgICAgICAgICAgdmFyIHQgPSBBY3RpdmF0b3IuQ3JlYXRlSW5zdGFuY2U8VD4oKTsKLSAgICAgICAgICAgICAgICBtZXRob2QuSW52b2tlKHQsIG5ldyBvYmplY3RbXSB7cH0pOworICAgICAgICAgICAgICAgIG1ldGhvZC5JbnZva2UodCwgbmV3IG9iamVjdFtdIHsgcCB9KTsKICAgICAgICAgICAgICAgICByZXR1cm4gdDsKLSAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgIHZhciBtZXRob2QgPSB0eXBlb2YgKFQpLkdldE1ldGhvZCgiUmVhZCIsIEJpbmRpbmdGbGFncy5TdGF0aWMgfCBCaW5kaW5nRmxhZ3MuUHVibGljKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gKFQpIG1ldGhvZC5JbnZva2UobnVsbCwgbmV3IG9iamVjdFtdIHtwfSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIG1ldGhvZCA9IHR5cGVvZihUKS5HZXRNZXRob2QoIlJlYWQiLCBCaW5kaW5nRmxhZ3MuU3RhdGljIHwgQmluZGluZ0ZsYWdzLlB1YmxpYyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIChUKW1ldGhvZC5JbnZva2UobnVsbCwgbmV3IG9iamVjdFtdIHsgcCB9KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIHByaXZhdGUgYm9vbCBfSXNEaXNwb3NlZDsKIAogICAgICAgICAvLyBJRGlzcG9zYWJsZQotICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBEaXNwb3NlKGJvb2wgZGlzcG9zaW5nKSB7Ci0gICAgICAgICAgICBpZiAoIV9Jc0Rpc3Bvc2VkKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGRpc3Bvc2luZykgeworICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBEaXNwb3NlKGJvb2wgZGlzcG9zaW5nKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIV9Jc0Rpc3Bvc2VkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChkaXNwb3NpbmcpCisgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoYnl0ZVN0cmVhbSAhPSBudWxsKQogICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVN0cmVhbS5EaXNwb3NlKCk7CiAgICAgICAgICAgICAgICAgfQpAQCAtOTYsNCArMTE0LDQgQEAKICAgICAgICAgICAgIF9Jc0Rpc3Bvc2VkID0gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVE5hbWVkUGlwZUNsaWVudFRyYW5zcG9ydC5jcyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UTmFtZWRQaXBlQ2xpZW50VHJhbnNwb3J0LmNzCmluZGV4IDlmYWE2ZTcuLjQ5YTUwYWEgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UTmFtZWRQaXBlQ2xpZW50VHJhbnNwb3J0LmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UTmFtZWRQaXBlQ2xpZW50VHJhbnNwb3J0LmNzCkBAIC0yMSw3ICsyMSw5IEBACiAgKiBkZXRhaWxzLgogICovCiAKK3VzaW5nIFN5c3RlbTsKIHVzaW5nIFN5c3RlbS5JTy5QaXBlczsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7CiAKIG5hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0CiB7CkBAIC0zMCwxNyArMzIsMjAgQEAKICAgICAgICAgcHJpdmF0ZSBOYW1lZFBpcGVDbGllbnRTdHJlYW0gY2xpZW50OwogICAgICAgICBwcml2YXRlIHN0cmluZyBTZXJ2ZXJOYW1lOwogICAgICAgICBwcml2YXRlIHN0cmluZyBQaXBlTmFtZTsKKyAgICAgICAgcHJpdmF0ZSBpbnQgQ29ubmVjdFRpbWVvdXQ7CiAKLSAgICAgICAgcHVibGljIFROYW1lZFBpcGVDbGllbnRUcmFuc3BvcnQoc3RyaW5nIHBpcGUpCisgICAgICAgIHB1YmxpYyBUTmFtZWRQaXBlQ2xpZW50VHJhbnNwb3J0KHN0cmluZyBwaXBlLCBpbnQgdGltZW91dCA9IFRpbWVvdXQuSW5maW5pdGUpCiAgICAgICAgIHsKICAgICAgICAgICAgIFNlcnZlck5hbWUgPSAiLiI7CiAgICAgICAgICAgICBQaXBlTmFtZSA9IHBpcGU7CisgICAgICAgICAgICBDb25uZWN0VGltZW91dCA9IHRpbWVvdXQ7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgVE5hbWVkUGlwZUNsaWVudFRyYW5zcG9ydChzdHJpbmcgc2VydmVyLCBzdHJpbmcgcGlwZSkKKyAgICAgICAgcHVibGljIFROYW1lZFBpcGVDbGllbnRUcmFuc3BvcnQoc3RyaW5nIHNlcnZlciwgc3RyaW5nIHBpcGUsIGludCB0aW1lb3V0ID0gVGltZW91dC5JbmZpbml0ZSkKICAgICAgICAgewogICAgICAgICAgICAgU2VydmVyTmFtZSA9IChzZXJ2ZXIgIT0gIiIpID8gc2VydmVyIDogIi4iOwogICAgICAgICAgICAgUGlwZU5hbWUgPSBwaXBlOworICAgICAgICAgICAgQ29ubmVjdFRpbWVvdXQgPSB0aW1lb3V0OwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNPcGVuCkBAIC01NSw3ICs2MCw3IEBACiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkFscmVhZHlPcGVuKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNsaWVudCA9IG5ldyBOYW1lZFBpcGVDbGllbnRTdHJlYW0oU2VydmVyTmFtZSwgUGlwZU5hbWUsIFBpcGVEaXJlY3Rpb24uSW5PdXQsIFBpcGVPcHRpb25zLk5vbmUpOwotICAgICAgICAgICAgY2xpZW50LkNvbm5lY3QoKTsKKyAgICAgICAgICAgIGNsaWVudC5Db25uZWN0KENvbm5lY3RUaW1lb3V0KTsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIENsb3NlKCkKQEAgLTg0LDcgKzg5LDE4IEBACiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4pOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBjbGllbnQuV3JpdGUoYnVmLCBvZmYsIGxlbik7CisgICAgICAgICAgICAvLyBpZiBuZWNlc3NhcnksIHNlbmQgdGhlIGRhdGEgaW4gY2h1bmtzCisgICAgICAgICAgICAvLyB0aGVyZSdzIGEgc3lzdGVtIGxpbWl0IGFyb3VuZCAweDEwMDAwIGJ5dGVzIHRoYXQgd2UgaGl0IG90aGVyd2lzZQorICAgICAgICAgICAgLy8gTVNETjogIlBpcGUgd3JpdGUgb3BlcmF0aW9ucyBhY3Jvc3MgYSBuZXR3b3JrIGFyZSBsaW1pdGVkIHRvIDY1LDUzNSBieXRlcyBwZXIgd3JpdGUuIEZvciBtb3JlIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBwaXBlcywgc2VlIHRoZSBSZW1hcmtzIHNlY3Rpb24uIgorICAgICAgICAgICAgdmFyIG5CeXRlcyA9IE1hdGguTWluKGxlbiwgMTUgKiA0MDk2KTsgIC8vIDE2IHdvdWxkIGV4Y2VlZCB0aGUgbGltaXQKKyAgICAgICAgICAgIHdoaWxlIChuQnl0ZXMgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNsaWVudC5Xcml0ZShidWYsIG9mZiwgbkJ5dGVzKTsKKworICAgICAgICAgICAgICAgIG9mZiArPSBuQnl0ZXM7CisgICAgICAgICAgICAgICAgbGVuIC09IG5CeXRlczsKKyAgICAgICAgICAgICAgICBuQnl0ZXMgPSBNYXRoLk1pbihsZW4sIG5CeXRlcyk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBEaXNwb3NlKGJvb2wgZGlzcG9zaW5nKQpAQCAtOTIsNCArMTA4LDQgQEAKICAgICAgICAgICAgIGNsaWVudC5EaXNwb3NlKCk7CiAgICAgICAgIH0KICAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1ROYW1lZFBpcGVTZXJ2ZXJUcmFuc3BvcnQuY3MgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVE5hbWVkUGlwZVNlcnZlclRyYW5zcG9ydC5jcwppbmRleCBiM2YzNGViLi4zMjIxNWNmIDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVE5hbWVkUGlwZVNlcnZlclRyYW5zcG9ydC5jcworKysgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVE5hbWVkUGlwZVNlcnZlclRyYW5zcG9ydC5jcwpAQCAtMjIsOCArMjIsOSBAQAogICovCiAKIHVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwogdXNpbmcgU3lzdGVtLklPLlBpcGVzOwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5TZWN1cml0eS5QcmluY2lwYWw7CiAKIG5hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0CiB7CkBAIC0zMyw3ICszNCw4IEBACiAgICAgICAgIC8vLyBUaGlzIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBQaXBlIG9uIHRoZSBsb2NhbGhvc3QuCiAgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgc3RyaW5nIHBpcGVBZGRyZXNzOwotICAgICAgICBOYW1lZFBpcGVTZXJ2ZXJTdHJlYW0gc3RyZWFtID0gbnVsbDsKKyAgICAgICAgcHJpdmF0ZSBOYW1lZFBpcGVTZXJ2ZXJTdHJlYW0gc3RyZWFtID0gbnVsbDsKKyAgICAgICAgcHJpdmF0ZSBib29sIGFzeW5jTW9kZSA9IHRydWU7CiAKICAgICAgICAgcHVibGljIFROYW1lZFBpcGVTZXJ2ZXJUcmFuc3BvcnQoc3RyaW5nIHBpcGVBZGRyZXNzKQogICAgICAgICB7CkBAIC02MywxMSArNjUsNDQgQEAKIAogICAgICAgICBwcml2YXRlIHZvaWQgRW5zdXJlUGlwZUluc3RhbmNlKCkKICAgICAgICAgewotICAgICAgICAgICAgaWYoIHN0cmVhbSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHN0cmVhbSA9IG5ldyBOYW1lZFBpcGVTZXJ2ZXJTdHJlYW0oCi0gICAgICAgICAgICAgICAgICAgIHBpcGVBZGRyZXNzLCBQaXBlRGlyZWN0aW9uLkluT3V0LCAyNTQsCi0gICAgICAgICAgICAgICAgICAgIFBpcGVUcmFuc21pc3Npb25Nb2RlLkJ5dGUsCi0gICAgICAgICAgICAgICAgICAgIFBpcGVPcHRpb25zLk5vbmUsIDQwOTYsIDQwOTYgLypUT0RPOiBzZWN1cml0eSovKTsKKyAgICAgICAgICAgIGlmIChzdHJlYW0gPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgZGlyZWN0aW9uID0gUGlwZURpcmVjdGlvbi5Jbk91dDsKKyAgICAgICAgICAgICAgICB2YXIgbWF4Y29ubiA9IE5hbWVkUGlwZVNlcnZlclN0cmVhbS5NYXhBbGxvd2VkU2VydmVySW5zdGFuY2VzOworICAgICAgICAgICAgICAgIHZhciBtb2RlID0gUGlwZVRyYW5zbWlzc2lvbk1vZGUuQnl0ZTsKKyAgICAgICAgICAgICAgICB2YXIgb3B0aW9ucyA9IGFzeW5jTW9kZSA/IFBpcGVPcHRpb25zLkFzeW5jaHJvbm91cyA6IFBpcGVPcHRpb25zLk5vbmU7CisgICAgICAgICAgICAgICAgY29uc3QgaW50IElOQlVGX1NJWkUgPSA0MDk2OworICAgICAgICAgICAgICAgIGNvbnN0IGludCBPVVRCVUZfU0laRSA9IDQwOTY7CisKKyAgICAgICAgICAgICAgICAvLyBzZWN1cml0eQorICAgICAgICAgICAgICAgIHZhciBzZWN1cml0eSA9IG5ldyBQaXBlU2VjdXJpdHkoKTsKKyAgICAgICAgICAgICAgICBzZWN1cml0eS5BZGRBY2Nlc3NSdWxlKAorICAgICAgICAgICAgICAgICAgICBuZXcgUGlwZUFjY2Vzc1J1bGUoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU2VjdXJpdHlJZGVudGlmaWVyKFdlbGxLbm93blNpZFR5cGUuV29ybGRTaWQsIG51bGwpLAorICAgICAgICAgICAgICAgICAgICAgICAgUGlwZUFjY2Vzc1JpZ2h0cy5SZWFkIHwgUGlwZUFjY2Vzc1JpZ2h0cy5Xcml0ZSB8IFBpcGVBY2Nlc3NSaWdodHMuU3luY2hyb25pemUgfCBQaXBlQWNjZXNzUmlnaHRzLkNyZWF0ZU5ld0luc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLlNlY3VyaXR5LkFjY2Vzc0NvbnRyb2wuQWNjZXNzQ29udHJvbFR5cGUuQWxsb3cKKyAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA9IG5ldyBOYW1lZFBpcGVTZXJ2ZXJTdHJlYW0ocGlwZUFkZHJlc3MsIGRpcmVjdGlvbiwgbWF4Y29ubiwgbW9kZSwgb3B0aW9ucywgSU5CVUZfU0laRSwgT1VUQlVGX1NJWkUsIHNlY3VyaXR5KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKSAgLy8gTW9ubyBzdGlsbCBkb2VzIG5vdCBzdXBwb3J0IGFzeW5jLCBmYWxsYmFjayB0byBzeW5jCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoYXN5bmNNb2RlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zICY9ICh+UGlwZU9wdGlvbnMuQXN5bmNocm9ub3VzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA9IG5ldyBOYW1lZFBpcGVTZXJ2ZXJTdHJlYW0ocGlwZUFkZHJlc3MsIGRpcmVjdGlvbiwgbWF4Y29ubiwgbW9kZSwgb3B0aW9ucywgSU5CVUZfU0laRSwgT1VUQlVGX1NJWkUsIHNlY3VyaXR5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzeW5jTW9kZSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3c7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBUVHJhbnNwb3J0IEFjY2VwdEltcGwoKQpAQCAtNzUsMjkgKzExMCw3MSBAQAogICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgRW5zdXJlUGlwZUluc3RhbmNlKCk7Ci0gICAgICAgICAgICAgICAgc3RyZWFtLldhaXRGb3JDb25uZWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgdmFyIHRyYW5zID0gbmV3IFNlcnZlclRyYW5zcG9ydChzdHJlYW0pOworCisgICAgICAgICAgICAgICAgaWYgKGFzeW5jTW9kZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBldnQgPSBuZXcgTWFudWFsUmVzZXRFdmVudChmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIEV4Y2VwdGlvbiBlT3V0ZXIgPSBudWxsOworCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5CZWdpbldhaXRGb3JDb25uZWN0aW9uKGFzeW5jUmVzdWx0ID0+CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW0gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLkVuZFdhaXRGb3JDb25uZWN0aW9uKGFzeW5jUmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVPdXRlciA9IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5JbnRlcnJ1cHRlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlT3V0ZXIgPSBlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZU91dGVyID0gbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkludGVycnVwdGVkLCBlLk1lc3NhZ2UsIGUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZXZ0LlNldCgpOworICAgICAgICAgICAgICAgICAgICB9LCBudWxsKTsKKworICAgICAgICAgICAgICAgICAgICBldnQuV2FpdE9uZSgpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChlT3V0ZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVPdXRlcjsgLy8gcmV0aHJvdyBleGNlcHRpb24KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtLldhaXRGb3JDb25uZWN0aW9uKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdmFyIHRyYW5zID0gbmV3IFNlcnZlclRyYW5zcG9ydChzdHJlYW0sYXN5bmNNb2RlKTsKICAgICAgICAgICAgICAgICBzdHJlYW0gPSBudWxsOyAgLy8gcGFzcyBvd25lcnNoaXAgdG8gU2VydmVyVHJhbnNwb3J0CiAgICAgICAgICAgICAgICAgcmV0dXJuIHRyYW5zOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ2xvc2UoKTsKKyAgICAgICAgICAgICAgICB0aHJvdzsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBDbG9zZSgpOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuLCBlLk1lc3NhZ2UpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuLCBlLk1lc3NhZ2UsIGUpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgcHJpdmF0ZSBjbGFzcyBTZXJ2ZXJUcmFuc3BvcnQgOiBUVHJhbnNwb3J0CiAgICAgICAgIHsKLSAgICAgICAgICAgIHByaXZhdGUgTmFtZWRQaXBlU2VydmVyU3RyZWFtIHNlcnZlcjsKLSAgICAgICAgICAgIHB1YmxpYyBTZXJ2ZXJUcmFuc3BvcnQoTmFtZWRQaXBlU2VydmVyU3RyZWFtIHNlcnZlcikKKyAgICAgICAgICAgIHByaXZhdGUgTmFtZWRQaXBlU2VydmVyU3RyZWFtIHN0cmVhbTsKKyAgICAgICAgICAgIHByaXZhdGUgYm9vbCBhc3luY01vZGU7CisKKyAgICAgICAgICAgIHB1YmxpYyBTZXJ2ZXJUcmFuc3BvcnQoTmFtZWRQaXBlU2VydmVyU3RyZWFtIHN0cmVhbSwgYm9vbCBhc3luY01vZGUpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7CisgICAgICAgICAgICAgICAgdGhpcy5zdHJlYW0gPSBzdHJlYW07CisgICAgICAgICAgICAgICAgdGhpcy5hc3luY01vZGUgPSBhc3luY01vZGU7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzT3BlbgogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGdldCB7IHJldHVybiBzZXJ2ZXIgIT0gbnVsbCAmJiBzZXJ2ZXIuSXNDb25uZWN0ZWQ7IH0KKyAgICAgICAgICAgICAgICBnZXQgeyByZXR1cm4gc3RyZWFtICE9IG51bGwgJiYgc3RyZWFtLklzQ29ubmVjdGVkOyB9CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIE9wZW4oKQpAQCAtMTA2LDMwICsxODMsMTEzIEBACiAKICAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIENsb3NlKCkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoc2VydmVyICE9IG51bGwpIHNlcnZlci5DbG9zZSgpOworICAgICAgICAgICAgICAgIGlmIChzdHJlYW0gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtLkNsb3NlKCk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgUmVhZChieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChzZXJ2ZXIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBpZiAoc3RyZWFtID09IG51bGwpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3Blbik7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2ZXIuUmVhZChidWYsIG9mZiwgbGVuKTsKKworICAgICAgICAgICAgICAgIGlmIChhc3luY01vZGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBFeGNlcHRpb24gZU91dGVyID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGV2dCA9IG5ldyBNYW51YWxSZXNldEV2ZW50KGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IHJldHZhbCA9IDA7CisKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtLkJlZ2luUmVhZChidWYsIG9mZiwgbGVuLCBhc3luY1Jlc3VsdCA9PgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IHN0cmVhbS5FbmRSZWFkKGFzeW5jUmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVPdXRlciA9IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5JbnRlcnJ1cHRlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlT3V0ZXIgPSBlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZU91dGVyID0gbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkludGVycnVwdGVkLCBlLk1lc3NhZ2UsIGUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZXZ0LlNldCgpOworICAgICAgICAgICAgICAgICAgICB9LCBudWxsKTsKKworICAgICAgICAgICAgICAgICAgICBldnQuV2FpdE9uZSgpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChlT3V0ZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVPdXRlcjsgLy8gcmV0aHJvdyBleGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0cmVhbS5SZWFkKGJ1Ziwgb2ZmLCBsZW4pOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGUoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoc2VydmVyID09IG51bGwpCisgICAgICAgICAgICAgICAgaWYgKHN0cmVhbSA9PSBudWxsKQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4pOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzZXJ2ZXIuV3JpdGUoYnVmLCBvZmYsIGxlbik7CisKKyAgICAgICAgICAgICAgICAvLyBpZiBuZWNlc3NhcnksIHNlbmQgdGhlIGRhdGEgaW4gY2h1bmtzCisgICAgICAgICAgICAgICAgLy8gdGhlcmUncyBhIHN5c3RlbSBsaW1pdCBhcm91bmQgMHgxMDAwMCBieXRlcyB0aGF0IHdlIGhpdCBvdGhlcndpc2UKKyAgICAgICAgICAgICAgICAvLyBNU0ROOiAiUGlwZSB3cml0ZSBvcGVyYXRpb25zIGFjcm9zcyBhIG5ldHdvcmsgYXJlIGxpbWl0ZWQgdG8gNjUsNTM1IGJ5dGVzIHBlciB3cml0ZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHBpcGVzLCBzZWUgdGhlIFJlbWFya3Mgc2VjdGlvbi4iCisgICAgICAgICAgICAgICAgdmFyIG5CeXRlcyA9IE1hdGguTWluKGxlbiwgMTUgKiA0MDk2KTsgIC8vIDE2IHdvdWxkIGV4Y2VlZCB0aGUgbGltaXQKKyAgICAgICAgICAgICAgICB3aGlsZSAobkJ5dGVzID4gMCkKKyAgICAgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFzeW5jTW9kZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgRXhjZXB0aW9uIGVPdXRlciA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXZ0ID0gbmV3IE1hbnVhbFJlc2V0RXZlbnQoZmFsc2UpOworCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0uQmVnaW5Xcml0ZShidWYsIG9mZiwgbkJ5dGVzLCBhc3luY1Jlc3VsdCA9PgorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLkVuZFdyaXRlKGFzeW5jUmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZU91dGVyID0gbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkludGVycnVwdGVkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZU91dGVyID0gZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZU91dGVyID0gbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkludGVycnVwdGVkLCBlLk1lc3NhZ2UsIGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBldnQuU2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9LCBudWxsKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgZXZ0LldhaXRPbmUoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVPdXRlciAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVPdXRlcjsgLy8gcmV0aHJvdyBleGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5Xcml0ZShidWYsIG9mZiwgbkJ5dGVzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIG9mZiArPSBuQnl0ZXM7CisgICAgICAgICAgICAgICAgICAgIGxlbiAtPSBuQnl0ZXM7CisgICAgICAgICAgICAgICAgICAgIG5CeXRlcyA9IE1hdGguTWluKGxlbiwgbkJ5dGVzKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSB2b2lkIERpc3Bvc2UoYm9vbCBkaXNwb3NpbmcpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2VydmVyLkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RyZWFtICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5EaXNwb3NlKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFNlcnZlclNvY2tldC5jcyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU2VydmVyU29ja2V0LmNzCmluZGV4IDgyYTM2N2MuLmQ4ZWM2MmEgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU2VydmVyU29ja2V0LmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU2VydmVyU29ja2V0LmNzCkBAIC0yOSw1NiArMjksNTYgQEAKIHsKICAgICBwdWJsaWMgY2xhc3MgVFNlcnZlclNvY2tldCA6IFRTZXJ2ZXJUcmFuc3BvcnQKICAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIFVuZGVybHlpbmcgc2VydmVyIHdpdGggc29ja2V0Ci0gICAgICAgICovCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFVuZGVybHlpbmcgc2VydmVyIHdpdGggc29ja2V0LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwcml2YXRlIFRjcExpc3RlbmVyIHNlcnZlciA9IG51bGw7CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFBvcnQgdG8gbGlzdGVuIG9uCi0gICAgICAgICAqLworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBQb3J0IHRvIGxpc3RlbiBvbi4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHJpdmF0ZSBpbnQgcG9ydCA9IDA7CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRpbWVvdXQgZm9yIGNsaWVudCBzb2NrZXRzIGZyb20gYWNjZXB0Ci0gICAgICAgICAqLworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaW1lb3V0IGZvciBjbGllbnQgc29ja2V0cyBmcm9tIGFjY2VwdC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHJpdmF0ZSBpbnQgY2xpZW50VGltZW91dCA9IDA7CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFdoZXRoZXIgb3Igbm90IHRvIHdyYXAgbmV3IFRTb2NrZXQgY29ubmVjdGlvbnMgaW4gYnVmZmVycwotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV2hldGhlciBvciBub3QgdG8gd3JhcCBuZXcgVFNvY2tldCBjb25uZWN0aW9ucyBpbiBidWZmZXJzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwcml2YXRlIGJvb2wgdXNlQnVmZmVyZWRTb2NrZXRzID0gZmFsc2U7CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZXMgYSBzZXJ2ZXIgc29ja2V0IGZyb20gdW5kZXJseWluZyBzb2NrZXQgb2JqZWN0Ci0gICAgICAgICAqLworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDcmVhdGVzIGEgc2VydmVyIHNvY2tldCBmcm9tIHVuZGVybHlpbmcgc29ja2V0IG9iamVjdC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHVibGljIFRTZXJ2ZXJTb2NrZXQoVGNwTGlzdGVuZXIgbGlzdGVuZXIpCi0gICAgICAgICAgICA6dGhpcyhsaXN0ZW5lciwgMCkKKyAgICAgICAgICAgIDogdGhpcyhsaXN0ZW5lciwgMCkKICAgICAgICAgewogICAgICAgICB9CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZXMgYSBzZXJ2ZXIgc29ja2V0IGZyb20gdW5kZXJseWluZyBzb2NrZXQgb2JqZWN0Ci0gICAgICAgICAqLworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDcmVhdGVzIGEgc2VydmVyIHNvY2tldCBmcm9tIHVuZGVybHlpbmcgc29ja2V0IG9iamVjdC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHVibGljIFRTZXJ2ZXJTb2NrZXQoVGNwTGlzdGVuZXIgbGlzdGVuZXIsIGludCBjbGllbnRUaW1lb3V0KQogICAgICAgICB7CiAgICAgICAgICAgICB0aGlzLnNlcnZlciA9IGxpc3RlbmVyOwogICAgICAgICAgICAgdGhpcy5jbGllbnRUaW1lb3V0ID0gY2xpZW50VGltZW91dDsKICAgICAgICAgfQogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDcmVhdGVzIGp1c3QgYSBwb3J0IGxpc3RlbmluZyBzZXJ2ZXIgc29ja2V0Ci0gICAgICAgICAqLworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDcmVhdGVzIGp1c3QgYSBwb3J0IGxpc3RlbmluZyBzZXJ2ZXIgc29ja2V0LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwdWJsaWMgVFNlcnZlclNvY2tldChpbnQgcG9ydCkKICAgICAgICAgICAgIDogdGhpcyhwb3J0LCAwKQogICAgICAgICB7CiAgICAgICAgIH0KIAotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlcyBqdXN0IGEgcG9ydCBsaXN0ZW5pbmcgc2VydmVyIHNvY2tldAotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ3JlYXRlcyBqdXN0IGEgcG9ydCBsaXN0ZW5pbmcgc2VydmVyIHNvY2tldC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHVibGljIFRTZXJ2ZXJTb2NrZXQoaW50IHBvcnQsIGludCBjbGllbnRUaW1lb3V0KQotICAgICAgICAgICAgOnRoaXMocG9ydCwgY2xpZW50VGltZW91dCwgZmFsc2UpCisgICAgICAgICAgICA6IHRoaXMocG9ydCwgY2xpZW50VGltZW91dCwgZmFsc2UpCiAgICAgICAgIHsKICAgICAgICAgfQogCkBAIC05MCwxMyArOTAsMTMgQEAKICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIC8vIE1ha2Ugc2VydmVyIHNvY2tldAotICAgICAgICAgICAgICAgIHNlcnZlciA9IG5ldyBUY3BMaXN0ZW5lcihTeXN0ZW0uTmV0LklQQWRkcmVzcy5BbnksIHRoaXMucG9ydCk7Ci0gICAgICAgICAgICAgICAgc2VydmVyLlNlcnZlci5Ob0RlbGF5ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB0aGlzLnNlcnZlciA9IFRTb2NrZXRWZXJzaW9uaXplci5DcmVhdGVUY3BMaXN0ZW5lcih0aGlzLnBvcnQpOworICAgICAgICAgICAgICAgIHRoaXMuc2VydmVyLlNlcnZlci5Ob0RlbGF5ID0gdHJ1ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24pCisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHNlcnZlciA9IG51bGw7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkNvdWxkIG5vdCBjcmVhdGUgU2VydmVyU29ja2V0IG9uIHBvcnQgIiArIHBvcnQgKyAiLiIpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJDb3VsZCBub3QgY3JlYXRlIFNlcnZlclNvY2tldCBvbiBwb3J0ICIgKyB0aGlzLnBvcnQgKyAiLiIsIGV4KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0xMTEsNyArMTExLDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgY2F0Y2ggKFNvY2tldEV4Y2VwdGlvbiBzeCkKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJDb3VsZCBub3QgYWNjZXB0IG9uIGxpc3RlbmluZyBzb2NrZXQ6ICIgKyBzeC5NZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkNvdWxkIG5vdCBhY2NlcHQgb24gbGlzdGVuaW5nIHNvY2tldDogIiArIHN4Lk1lc3NhZ2UsIHN4KTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTE1Myw3ICsxNTMsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihleC5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihleC5Ub1N0cmluZygpLCBleCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMTY3LDcgKzE2Nyw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiV0FSTklORzogQ291bGQgbm90IGNsb3NlIHNlcnZlciBzb2NrZXQ6ICIgKyBleCk7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJXQVJOSU5HOiBDb3VsZCBub3QgY2xvc2Ugc2VydmVyIHNvY2tldDogIiArIGV4LCBleCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHNlcnZlciA9IG51bGw7CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFNlcnZlclRyYW5zcG9ydC5jcyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU2VydmVyVHJhbnNwb3J0LmNzCmluZGV4IDA1ZDdkMGYuLmU2Mzg4MGIgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU2VydmVyVHJhbnNwb3J0LmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU2VydmVyVHJhbnNwb3J0LmNzCkBAIC0zNCwxMCArMzQsMTEgQEAKICAgICAgICAgcHVibGljIFRUcmFuc3BvcnQgQWNjZXB0KCkKICAgICAgICAgewogICAgICAgICAgICAgVFRyYW5zcG9ydCB0cmFuc3BvcnQgPSBBY2NlcHRJbXBsKCk7Ci0gICAgICAgICAgICBpZiAodHJhbnNwb3J0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oImFjY2VwdCgpIG1heSBub3QgcmV0dXJuIE5VTEwiKTsKKyAgICAgICAgICAgIGlmICh0cmFuc3BvcnQgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiYWNjZXB0KCkgbWF5IG5vdCByZXR1cm4gTlVMTCIpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIHRyYW5zcG9ydDsKLSAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU2lsdmVybGlnaHRTb2NrZXQuY3MgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFNpbHZlcmxpZ2h0U29ja2V0LmNzCmluZGV4IGNiZDNiYWEuLjQwNDY5YWIgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU2lsdmVybGlnaHRTb2NrZXQuY3MKKysrIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RTaWx2ZXJsaWdodFNvY2tldC5jcwpAQCAtMTEyLDcgKzExMiw3IEBACiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkFscmVhZHlPcGVuLCAiU29ja2V0IGFscmVhZHkgY29ubmVjdGVkIik7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChTdHJpbmcuSXNOdWxsT3JFbXB0eShob3N0KSkKKyAgICAgICAgICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eShob3N0KSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3BlbiwgIkNhbm5vdCBvcGVuIG51bGwgaG9zdCIpOwogICAgICAgICAgICAgfQpAQCAtMjgyLDkgKzI4Miw5IEBACiAgICAgICAgICAgICBwcml2YXRlIHZvbGF0aWxlIEJvb2xlYW4gX2lzQ29tcGxldGVkOwogICAgICAgICAgICAgcHJpdmF0ZSBNYW51YWxSZXNldEV2ZW50IF9ldnQ7CiAgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IEFzeW5jQ2FsbGJhY2sgX2NiTWV0aG9kOwotICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBPYmplY3QgX3N0YXRlOworICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBvYmplY3QgX3N0YXRlOwogCi0gICAgICAgICAgICBwdWJsaWMgRmx1c2hBc3luY1Jlc3VsdChBc3luY0NhbGxiYWNrIGNiTWV0aG9kLCBPYmplY3Qgc3RhdGUpCisgICAgICAgICAgICBwdWJsaWMgRmx1c2hBc3luY1Jlc3VsdChBc3luY0NhbGxiYWNrIGNiTWV0aG9kLCBvYmplY3Qgc3RhdGUpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgX2NiTWV0aG9kID0gY2JNZXRob2Q7CiAgICAgICAgICAgICAgICAgX3N0YXRlID0gc3RhdGU7CkBAIC0zMTQsNyArMzE0LDcgQEAKICAgICAgICAgICAgICAgICBnZXQgeyByZXR1cm4gX2lzQ29tcGxldGVkOyB9CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgT2JqZWN0IF9sb2NrZXIgPSBuZXcgT2JqZWN0KCk7CisgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IG9iamVjdCBfbG9ja2VyID0gbmV3IG9iamVjdCgpOwogCiAgICAgICAgICAgICBwcml2YXRlIE1hbnVhbFJlc2V0RXZlbnQgR2V0RXZ0SGFuZGxlKCkKICAgICAgICAgICAgIHsKQEAgLTM2Miw3ICszNjIsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgI3JlZ2lvbiAiIElEaXNwb3NhYmxlIFN1cHBvcnQgIgorI3JlZ2lvbiAiIElEaXNwb3NhYmxlIFN1cHBvcnQgIgogICAgICAgICBwcml2YXRlIGJvb2wgX0lzRGlzcG9zZWQ7CiAKICAgICAgICAgLy8gSURpc3Bvc2FibGUKQEAgLTM4NSw3ICszODUsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgX0lzRGlzcG9zZWQgPSB0cnVlOwogICAgICAgICB9Ci0gICAgICAgICNlbmRyZWdpb24KKyNlbmRyZWdpb24KICAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU29ja2V0LmNzIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RTb2NrZXQuY3MKaW5kZXggY2YxYTQ0MC4uZDhmYTMzNSAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RTb2NrZXQuY3MKKysrIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RTb2NrZXQuY3MKQEAgLTYwLDkgKzYwLDkgQEAKIAogICAgICAgICBwcml2YXRlIHZvaWQgSW5pdFNvY2tldCgpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGNsaWVudCA9IG5ldyBUY3BDbGllbnQoKTsKLSAgICAgICAgICAgIGNsaWVudC5SZWNlaXZlVGltZW91dCA9IGNsaWVudC5TZW5kVGltZW91dCA9IHRpbWVvdXQ7Ci0gICAgICAgICAgICBjbGllbnQuQ2xpZW50Lk5vRGVsYXkgPSB0cnVlOworICAgICAgICAgICAgdGhpcy5jbGllbnQgPSBUU29ja2V0VmVyc2lvbml6ZXIuQ3JlYXRlVGNwQ2xpZW50KCk7CisgICAgICAgICAgICB0aGlzLmNsaWVudC5SZWNlaXZlVGltZW91dCA9IGNsaWVudC5TZW5kVGltZW91dCA9IHRpbWVvdXQ7CisgICAgICAgICAgICB0aGlzLmNsaWVudC5DbGllbnQuTm9EZWxheSA9IHRydWU7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgaW50IFRpbWVvdXQKQEAgLTExNyw3ICsxMTcsNyBAQAogICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5BbHJlYWR5T3BlbiwgIlNvY2tldCBhbHJlYWR5IGNvbm5lY3RlZCIpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAoU3RyaW5nLklzTnVsbE9yRW1wdHkoaG9zdCkpCisgICAgICAgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkoaG9zdCkpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4sICJDYW5ub3Qgb3BlbiBudWxsIGhvc3QiKTsKICAgICAgICAgICAgIH0KQEAgLTEzMiw3ICsxMzIsNyBAQAogICAgICAgICAgICAgICAgIEluaXRTb2NrZXQoKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYoIHRpbWVvdXQgPT0gMCkgICAgICAgICAgICAvLyBubyB0aW1lb3V0IC0+IGluZmluaXRlCisgICAgICAgICAgICBpZiAodGltZW91dCA9PSAwKSAgICAgICAgICAgIC8vIG5vIHRpbWVvdXQgLT4gaW5maW5pdGUKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBjbGllbnQuQ29ubmVjdChob3N0LCBwb3J0KTsKICAgICAgICAgICAgIH0KQEAgLTE0NSw3ICsxNDUsNyBAQAogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgbG9jayAoaGxwLk11dGV4KQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiggaGxwLkNhbGxiYWNrRG9uZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChobHAuQ2FsbGJhY2tEb25lKQogICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzeW5jcmVzLkFzeW5jV2FpdEhhbmRsZS5DbG9zZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudC5DbG9zZSgpOwpAQCAtMTc0LDcgKzE3NCw3IEBACiAKICAgICAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCBobHAuQ2xpZW50LkNsaWVudCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBpZiAoaGxwLkNsaWVudC5DbGllbnQgIT0gbnVsbCkKICAgICAgICAgICAgICAgICAgICAgICAgIGhscC5DbGllbnQuRW5kQ29ubmVjdChhc3luY3Jlcyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24pCkBAIC0xODQsMTQgKzE4NCwxOCBAQAogCiAgICAgICAgICAgICAgICAgaWYgKGhscC5Eb0NsZWFudXApCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmNyZXMuQXN5bmNXYWl0SGFuZGxlLkNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbikge30KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uKSB7IH0KIAotICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhscC5DbGllbnQgaXMgSURpc3Bvc2FibGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJRGlzcG9zYWJsZSlobHAuQ2xpZW50KS5EaXNwb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbikge30KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uKSB7IH0KICAgICAgICAgICAgICAgICAgICAgaGxwLkNsaWVudCA9IG51bGw7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtMjE5LDIzICsyMjMsMjMgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgI3JlZ2lvbiAiIElEaXNwb3NhYmxlIFN1cHBvcnQgIgotICAgIHByaXZhdGUgYm9vbCBfSXNEaXNwb3NlZDsKKyAgICAgICAgI3JlZ2lvbiAiIElEaXNwb3NhYmxlIFN1cHBvcnQgIgorICAgICAgICBwcml2YXRlIGJvb2wgX0lzRGlzcG9zZWQ7CiAKLSAgICAvLyBJRGlzcG9zYWJsZQotICAgIHByb3RlY3RlZCBvdmVycmlkZSB2b2lkIERpc3Bvc2UoYm9vbCBkaXNwb3NpbmcpCi0gICAgewotICAgICAgaWYgKCFfSXNEaXNwb3NlZCkKLSAgICAgIHsKLSAgICAgICAgaWYgKGRpc3Bvc2luZykKKyAgICAgICAgLy8gSURpc3Bvc2FibGUKKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgRGlzcG9zZShib29sIGRpc3Bvc2luZykKICAgICAgICAgewotICAgICAgICAgIGlmIChjbGllbnQgIT0gbnVsbCkKLSAgICAgICAgICAgICgoSURpc3Bvc2FibGUpY2xpZW50KS5EaXNwb3NlKCk7Ci0gICAgICAgICAgYmFzZS5EaXNwb3NlKGRpc3Bvc2luZyk7CisgICAgICAgICAgICBpZiAoIV9Jc0Rpc3Bvc2VkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChkaXNwb3NpbmcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpZW50ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAoKElEaXNwb3NhYmxlKWNsaWVudCkuRGlzcG9zZSgpOworICAgICAgICAgICAgICAgICAgICBiYXNlLkRpc3Bvc2UoZGlzcG9zaW5nKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfSXNEaXNwb3NlZCA9IHRydWU7CiAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIF9Jc0Rpc3Bvc2VkID0gdHJ1ZTsKKyAgICAgICAgI2VuZHJlZ2lvbgogICAgIH0KLSAgICAjZW5kcmVnaW9uCi0gIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU29ja2V0VmVyc2lvbml6ZXIuY3MgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFNvY2tldFZlcnNpb25pemVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmNGMwZTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFNvY2tldFZlcnNpb25pemVyLmNzCkBAIC0wLDAgKzEsNzggQEAKK++7vy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCisgKiBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgorICogZGV0YWlscy4KKyAqLworCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLk5ldC5Tb2NrZXRzOwordXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247Cit1c2luZyBTeXN0ZW0uVGV4dDsKKyNpZiBORVQ0NQordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKKyNlbmRpZgorCituYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydAoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gUHJvcGVydHlJbmZvIGZvciB0aGUgRHVhbE1vZGUgcHJvcGVydHkgb2YgdGhlIFN5c3RlbS5OZXQuU29ja2V0cy5Tb2NrZXQgY2xhc3MuIFVzZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBzb2NrZXRzIGFyZSBjYXBhYmxlIG9mCisgICAgLy8vIGF1dG9tYXRpYyBJUHY0IGFuZCBJUHY2IGhhbmRsaW5nLiBJZiBEdWFsTW9kZSBpcyBwcmVzZW50IHRoZSBzb2NrZXRzIGF1dG9tYXRpY2FsbHkgaGFuZGxlIElQdjQgYW5kIElQdjYgY29ubmVjdGlvbnMuCisgICAgLy8vIElmIHRoZSBEdWFsTW9kZSBpcyBub3QgYXZhaWxhYmxlIHRoZSBzeXN0ZW0gY29uZmlndXJhdGlvbiBkZXRlcm1pbmVzIHdoZXRoZXIgSVB2NCBvciBJUHY2IGlzIHVzZWQuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBpbnRlcm5hbCBzdGF0aWMgY2xhc3MgVFNvY2tldFZlcnNpb25pemVyCisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDcmVhdGVzIGEgVGNwQ2xpZW50IGFjY29yZGluZyB0byB0aGUgY2FwYWJpbGl0aXRlcyBvZiB0aGUgdXNlZCBmcmFtZXdvcmsKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIFRjcENsaWVudCBDcmVhdGVUY3BDbGllbnQoKQorICAgICAgICB7CisgICAgICAgICAgICBUY3BDbGllbnQgY2xpZW50ID0gbnVsbDsKKworI2lmIE5FVDQ1CisgICAgICAgICAgICBjbGllbnQgPSBuZXcgVGNwQ2xpZW50KEFkZHJlc3NGYW1pbHkuSW50ZXJOZXR3b3JrVjYpOworICAgICAgICAgICAgY2xpZW50LkNsaWVudC5EdWFsTW9kZSA9IHRydWU7CisjZWxzZQorICAgICAgICAgICAgY2xpZW50ID0gbmV3IFRjcENsaWVudChBZGRyZXNzRmFtaWx5LkludGVyTmV0d29yayk7CisjZW5kaWYKKworICAgICAgICAgICAgcmV0dXJuIGNsaWVudDsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENyZWF0ZXMgYSBUY3BMaXN0ZW5lciBhY2NvcmRpbmcgdG8gdGhlIGNhcGFiaWxpdGl0ZXMgb2YgdGhlIHVzZWQgZnJhbWV3b3JrLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBpbnRlcm5hbCBzdGF0aWMgVGNwTGlzdGVuZXIgQ3JlYXRlVGNwTGlzdGVuZXIoSW50MzIgcG9ydCkKKyAgICAgICAgeworICAgICAgICAgICAgVGNwTGlzdGVuZXIgbGlzdGVuZXIgPSBudWxsOworCisjaWYgTkVUNDUKKyAgICAgICAgICAgIGxpc3RlbmVyID0gbmV3IFRjcExpc3RlbmVyKFN5c3RlbS5OZXQuSVBBZGRyZXNzLklQdjZBbnksIHBvcnQpOworICAgICAgICAgICAgbGlzdGVuZXIuU2VydmVyLkR1YWxNb2RlID0gdHJ1ZTsKKyNlbHNlCisKKyAgICAgICAgICAgIGxpc3RlbmVyID0gbmV3IFRjcExpc3RlbmVyKFN5c3RlbS5OZXQuSVBBZGRyZXNzLkFueSwgcG9ydCk7CisjZW5kaWYKKworICAgICAgICAgICAgcmV0dXJuIGxpc3RlbmVyOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RTdHJlYW1UcmFuc3BvcnQuY3MgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFN0cmVhbVRyYW5zcG9ydC5jcwppbmRleCA0Njg3NDNjLi4zMDQ1OTlmIDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFN0cmVhbVRyYW5zcG9ydC5jcworKysgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFN0cmVhbVRyYW5zcG9ydC5jcwpAQCAtMTA1LDI0ICsxMDUsMjQgQEAKICAgICAgICAgfQogCiAKLSAgICAjcmVnaW9uICIgSURpc3Bvc2FibGUgU3VwcG9ydCAiCi0gICAgcHJpdmF0ZSBib29sIF9Jc0Rpc3Bvc2VkOworICAgICAgICAjcmVnaW9uICIgSURpc3Bvc2FibGUgU3VwcG9ydCAiCisgICAgICAgIHByaXZhdGUgYm9vbCBfSXNEaXNwb3NlZDsKIAotICAgIC8vIElEaXNwb3NhYmxlCi0gICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgRGlzcG9zZShib29sIGRpc3Bvc2luZykKLSAgICB7Ci0gICAgICBpZiAoIV9Jc0Rpc3Bvc2VkKQotICAgICAgewotICAgICAgICBpZiAoZGlzcG9zaW5nKQorICAgICAgICAvLyBJRGlzcG9zYWJsZQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBEaXNwb3NlKGJvb2wgZGlzcG9zaW5nKQogICAgICAgICB7Ci0gICAgICAgICAgaWYgKElucHV0U3RyZWFtICE9IG51bGwpCi0gICAgICAgICAgICBJbnB1dFN0cmVhbS5EaXNwb3NlKCk7Ci0gICAgICAgICAgaWYgKE91dHB1dFN0cmVhbSAhPSBudWxsKQotICAgICAgICAgICAgT3V0cHV0U3RyZWFtLkRpc3Bvc2UoKTsKKyAgICAgICAgICAgIGlmICghX0lzRGlzcG9zZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGRpc3Bvc2luZykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChJbnB1dFN0cmVhbSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0uRGlzcG9zZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoT3V0cHV0U3RyZWFtICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXRTdHJlYW0uRGlzcG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9Jc0Rpc3Bvc2VkID0gdHJ1ZTsKICAgICAgICAgfQotICAgICAgfQotICAgICAgX0lzRGlzcG9zZWQgPSB0cnVlOworICAgICAgICAjZW5kcmVnaW9uCiAgICAgfQotICAgICNlbmRyZWdpb24KLSAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RUTFNTZXJ2ZXJTb2NrZXQuY3MgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFRMU1NlcnZlclNvY2tldC5jcwppbmRleCA5NzUzZDQ3Li43MTZhOTdjIDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFRMU1NlcnZlclNvY2tldC5jcworKysgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFRMU1NlcnZlclNvY2tldC5jcwpAQCAtMTgsNyArMTgsOSBAQAogICovCiAKIHVzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5OZXQuU2VjdXJpdHk7CiB1c2luZyBTeXN0ZW0uTmV0LlNvY2tldHM7Cit1c2luZyBTeXN0ZW0uU2VjdXJpdHkuQXV0aGVudGljYXRpb247CiB1c2luZyBTeXN0ZW0uU2VjdXJpdHkuQ3J5cHRvZ3JhcGh5Llg1MDlDZXJ0aWZpY2F0ZXM7CiAKIG5hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0CkBAIC00MSw3ICs0Myw3IEBACiAgICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAgLy8vIFRpbWVvdXQgZm9yIHRoZSBjcmVhdGVkIHNlcnZlciBzb2NrZXQKICAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHJpdmF0ZSBpbnQgY2xpZW50VGltZW91dCA9IDA7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgaW50IGNsaWVudFRpbWVvdXQ7CiAKICAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgICAvLy8gV2hldGhlciBvciBub3QgdG8gd3JhcCBuZXcgVFNvY2tldCBjb25uZWN0aW9ucyBpbiBidWZmZXJzCkBAIC01Myw2ICs1NSwyMCBAQAogICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwcml2YXRlIFg1MDlDZXJ0aWZpY2F0ZSBzZXJ2ZXJDZXJ0aWZpY2F0ZTsKIAorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgZnVuY3Rpb24gdG8gdmFsaWRhdGUgdGhlIGNsaWVudCBjZXJ0aWZpY2F0ZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBSZW1vdGVDZXJ0aWZpY2F0ZVZhbGlkYXRpb25DYWxsYmFjayBjbGllbnRDZXJ0VmFsaWRhdG9yOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgd2hpY2ggY2VydGlmaWNhdGUgdG8gdXNlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIExvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayBsb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2s7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIFNzbFByb3RvY29scyB2YWx1ZSB0aGF0IHJlcHJlc2VudHMgdGhlIHByb3RvY29sIHVzZWQgZm9yIGF1dGhlbnRpY2F0aW9uLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFNzbFByb3RvY29scyBzc2xQcm90b2NvbHM7CiAKICAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgICAvLy8gSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIDxzZWUgY3JlZj0iVFRMU1NlcnZlclNvY2tldCIgLz4gY2xhc3MuCkBAIC02MCw3ICs3Niw3IEBACiAgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icG9ydCI+VGhlIHBvcnQgd2hlcmUgdGhlIHNlcnZlciBydW5zLjwvcGFyYW0+CiAgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY2VydGlmaWNhdGUiPlRoZSBjZXJ0aWZpY2F0ZSBvYmplY3QuPC9wYXJhbT4KICAgICAgICAgcHVibGljIFRUTFNTZXJ2ZXJTb2NrZXQoaW50IHBvcnQsIFg1MDlDZXJ0aWZpY2F0ZTIgY2VydGlmaWNhdGUpCi0gICAgICAgICAgICA6IHRoaXMocG9ydCwgIDAsIGNlcnRpZmljYXRlKQorICAgICAgICAgICAgOiB0aGlzKHBvcnQsIDAsIGNlcnRpZmljYXRlKQogICAgICAgICB7CiAgICAgICAgIH0KIApAQCAtODIsNyArOTgsMTggQEAKICAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjbGllbnRUaW1lb3V0Ij5TZW5kL3JlY2VpdmUgdGltZW91dC48L3BhcmFtPgogICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InVzZUJ1ZmZlcmVkU29ja2V0cyI+SWYgc2V0IHRvIDxjPnRydWU8L2M+IFt1c2UgYnVmZmVyZWQgc29ja2V0c10uPC9wYXJhbT4KICAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjZXJ0aWZpY2F0ZSI+VGhlIGNlcnRpZmljYXRlIG9iamVjdC48L3BhcmFtPgotICAgICAgICBwdWJsaWMgVFRMU1NlcnZlclNvY2tldChpbnQgcG9ydCwgaW50IGNsaWVudFRpbWVvdXQsIGJvb2wgdXNlQnVmZmVyZWRTb2NrZXRzLCBYNTA5Q2VydGlmaWNhdGUyIGNlcnRpZmljYXRlKQorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNsaWVudENlcnRWYWxpZGF0b3IiPlRoZSBjZXJ0aWZpY2F0ZSB2YWxpZGF0b3IuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJsb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2siPlRoZSBjYWxsYmFjayB0byBzZWxlY3Qgd2hpY2ggY2VydGlmaWNhdGUgdG8gdXNlLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ic3NsUHJvdG9jb2xzIj5UaGUgU3NsUHJvdG9jb2xzIHZhbHVlIHRoYXQgcmVwcmVzZW50cyB0aGUgcHJvdG9jb2wgdXNlZCBmb3IgYXV0aGVudGljYXRpb24uPC9wYXJhbT4KKyAgICAgICAgcHVibGljIFRUTFNTZXJ2ZXJTb2NrZXQoCisgICAgICAgICAgICBpbnQgcG9ydCwKKyAgICAgICAgICAgIGludCBjbGllbnRUaW1lb3V0LAorICAgICAgICAgICAgYm9vbCB1c2VCdWZmZXJlZFNvY2tldHMsCisgICAgICAgICAgICBYNTA5Q2VydGlmaWNhdGUyIGNlcnRpZmljYXRlLAorICAgICAgICAgICAgUmVtb3RlQ2VydGlmaWNhdGVWYWxpZGF0aW9uQ2FsbGJhY2sgY2xpZW50Q2VydFZhbGlkYXRvciA9IG51bGwsCisgICAgICAgICAgICBMb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrID0gbnVsbCwKKyAgICAgICAgICAgIC8vIFRPRE86IEVuYWJsZSBUbHMxMSBhbmQgVGxzMTIgKFRMUyAxLjEgYW5kIDEuMikgYnkgZGVmYXVsdCBvbmNlIHdlIHN0YXJ0IHVzaW5nIC5ORVQgNC41Ky4KKyAgICAgICAgICAgIFNzbFByb3RvY29scyBzc2xQcm90b2NvbHMgPSBTc2xQcm90b2NvbHMuVGxzKQogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIWNlcnRpZmljYXRlLkhhc1ByaXZhdGVLZXkpCiAgICAgICAgICAgICB7CkBAIC05MCwxOCArMTE3LDIyIEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHRoaXMucG9ydCA9IHBvcnQ7CisgICAgICAgICAgICB0aGlzLmNsaWVudFRpbWVvdXQgPSBjbGllbnRUaW1lb3V0OwogICAgICAgICAgICAgdGhpcy5zZXJ2ZXJDZXJ0aWZpY2F0ZSA9IGNlcnRpZmljYXRlOwogICAgICAgICAgICAgdGhpcy51c2VCdWZmZXJlZFNvY2tldHMgPSB1c2VCdWZmZXJlZFNvY2tldHM7CisgICAgICAgICAgICB0aGlzLmNsaWVudENlcnRWYWxpZGF0b3IgPSBjbGllbnRDZXJ0VmFsaWRhdG9yOworICAgICAgICAgICAgdGhpcy5sb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgPSBsb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2s7CisgICAgICAgICAgICB0aGlzLnNzbFByb3RvY29scyA9IHNzbFByb3RvY29sczsKICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBzZXJ2ZXIgc29ja2V0Ci0gICAgICAgICAgICAgICAgc2VydmVyID0gbmV3IFRjcExpc3RlbmVyKFN5c3RlbS5OZXQuSVBBZGRyZXNzLkFueSwgdGhpcy5wb3J0KTsKLSAgICAgICAgICAgICAgICBzZXJ2ZXIuU2VydmVyLk5vRGVsYXkgPSB0cnVlOworICAgICAgICAgICAgICAgIHRoaXMuc2VydmVyID0gVFNvY2tldFZlcnNpb25pemVyLkNyZWF0ZVRjcExpc3RlbmVyKHRoaXMucG9ydCk7CisgICAgICAgICAgICAgICAgdGhpcy5zZXJ2ZXIuU2VydmVyLk5vRGVsYXkgPSB0cnVlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbikKKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgc2VydmVyID0gbnVsbDsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQ291bGQgbm90IGNyZWF0ZSBTZXJ2ZXJTb2NrZXQgb24gcG9ydCAiICsgcG9ydCArICIuIik7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkNvdWxkIG5vdCBjcmVhdGUgU2VydmVyU29ja2V0IG9uIHBvcnQgIiArIHRoaXMucG9ydCArICIuIiwgZXgpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTExOSw3ICsxNTAsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjYXRjaCAoU29ja2V0RXhjZXB0aW9uIHN4KQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkNvdWxkIG5vdCBhY2NlcHQgb24gbGlzdGVuaW5nIHNvY2tldDogIiArIHN4Lk1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQ291bGQgbm90IGFjY2VwdCBvbiBsaXN0ZW5pbmcgc29ja2V0OiAiICsgc3guTWVzc2FnZSwgc3gpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMTQzLDcgKzE3NCwxMyBAQAogICAgICAgICAgICAgICAgIGNsaWVudC5TZW5kVGltZW91dCA9IGNsaWVudC5SZWNlaXZlVGltZW91dCA9IHRoaXMuY2xpZW50VGltZW91dDsKIAogICAgICAgICAgICAgICAgIC8vd3JhcCB0aGUgY2xpZW50IGluIGFuIFNTTCBTb2NrZXQgcGFzc2luZyBpbiB0aGUgU1NMIGNlcnQKLSAgICAgICAgICAgICAgICBUVExTU29ja2V0IHNvY2tldCA9IG5ldyBUVExTU29ja2V0KGNsaWVudCwgdGhpcy5zZXJ2ZXJDZXJ0aWZpY2F0ZSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgVFRMU1NvY2tldCBzb2NrZXQgPSBuZXcgVFRMU1NvY2tldCgKKyAgICAgICAgICAgICAgICAgICAgY2xpZW50LAorICAgICAgICAgICAgICAgICAgICB0aGlzLnNlcnZlckNlcnRpZmljYXRlLAorICAgICAgICAgICAgICAgICAgICB0cnVlLAorICAgICAgICAgICAgICAgICAgICB0aGlzLmNsaWVudENlcnRWYWxpZGF0b3IsCisgICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICB0aGlzLnNzbFByb3RvY29scyk7CiAKICAgICAgICAgICAgICAgICBzb2NrZXQuc2V0dXBUTFMoKTsKIApAQCAtMTYwLDcgKzE5Nyw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKGV4LlRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKGV4LlRvU3RyaW5nKCksIGV4KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0xNzcsNyArMjE0LDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJXQVJOSU5HOiBDb3VsZCBub3QgY2xvc2Ugc2VydmVyIHNvY2tldDogIiArIGV4KTsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIldBUk5JTkc6IENvdWxkIG5vdCBjbG9zZSBzZXJ2ZXIgc29ja2V0OiAiICsgZXgsIGV4KTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgdGhpcy5zZXJ2ZXIgPSBudWxsOwogICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RUTFNTb2NrZXQuY3MgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFRMU1NvY2tldC5jcwppbmRleCA5ZTFmOWYyLi5mZDAxOWMzIDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFRMU1NvY2tldC5jcworKysgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFRMU1NvY2tldC5jcwpAQCAtMzMsNDMgKzMzLDUzIEBACiAgICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAgLy8vIEludGVybmFsIFRDUCBDbGllbnQKICAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHJpdmF0ZSBUY3BDbGllbnQgY2xpZW50ID0gbnVsbDsKKyAgICAgICAgcHJpdmF0ZSBUY3BDbGllbnQgY2xpZW50OwogCiAgICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAgLy8vIFRoZSBob3N0CiAgICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHByaXZhdGUgc3RyaW5nIGhvc3QgPSBudWxsOworICAgICAgICBwcml2YXRlIHN0cmluZyBob3N0OwogCiAgICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAgLy8vIFRoZSBwb3J0CiAgICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHByaXZhdGUgaW50IHBvcnQgPSAwOworICAgICAgICBwcml2YXRlIGludCBwb3J0OwogCiAgICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAgLy8vIFRoZSB0aW1lb3V0IGZvciB0aGUgY29ubmVjdGlvbgogICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwcml2YXRlIGludCB0aW1lb3V0ID0gMDsKKyAgICAgICAgcHJpdmF0ZSBpbnQgdGltZW91dDsKIAogICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgIC8vLyBJbnRlcm5hbCBTU0wgU3RyZWFtIGZvciBJTwogICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwcml2YXRlIFNzbFN0cmVhbSBzZWN1cmVTdHJlYW0gPSBudWxsOworICAgICAgICBwcml2YXRlIFNzbFN0cmVhbSBzZWN1cmVTdHJlYW07CiAKICAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgICAvLy8gRGVmaW5lcyB3aGV0ZXIgb3Igbm90IHRoaXMgc29ja2V0IGlzIGEgc2VydmVyIHNvY2tldDxici8+CiAgICAgICAgIC8vLyBUaGlzIGlzIHVzZWQgZm9yIHRoZSBUTFMtYXV0aGVudGljYXRpb24KICAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHJpdmF0ZSBib29sIGlzU2VydmVyID0gZmFsc2U7CisgICAgICAgIHByaXZhdGUgYm9vbCBpc1NlcnZlcjsKIAogICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgIC8vLyBUaGUgY2VydGlmaWNhdGUKICAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHJpdmF0ZSBYNTA5Q2VydGlmaWNhdGUgY2VydGlmaWNhdGUgPSBudWxsOworICAgICAgICBwcml2YXRlIFg1MDlDZXJ0aWZpY2F0ZSBjZXJ0aWZpY2F0ZTsKIAogICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgIC8vLyBVc2VyIGRlZmluZWQgY2VydGlmaWNhdGUgdmFsaWRhdG9yLgogICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwcml2YXRlIFJlbW90ZUNlcnRpZmljYXRlVmFsaWRhdGlvbkNhbGxiYWNrIGNlcnRWYWxpZGF0b3IgPSBudWxsOworICAgICAgICBwcml2YXRlIFJlbW90ZUNlcnRpZmljYXRlVmFsaWRhdGlvbkNhbGxiYWNrIGNlcnRWYWxpZGF0b3I7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSB3aGljaCBjZXJ0aWZpY2F0ZSB0byB1c2UuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgTG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrIGxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjazsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgU3NsUHJvdG9jb2xzIHZhbHVlIHRoYXQgcmVwcmVzZW50cyB0aGUgcHJvdG9jb2wgdXNlZCBmb3IgYXV0aGVudGljYXRpb24uU1NMIHByb3RvY29scyB0byBiZSB1c2VkLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFNzbFByb3RvY29scyBzc2xQcm90b2NvbHM7CiAKICAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgICAvLy8gSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIDxzZWUgY3JlZj0iVFRMU1NvY2tldCIvPiBjbGFzcy4KQEAgLTc3LDExICs4NywyOCBAQAogICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNsaWVudCI+QW4gYWxyZWFkeSBjcmVhdGVkIFRDUC1jbGllbnQ8L3BhcmFtPgogICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNlcnRpZmljYXRlIj5UaGUgY2VydGlmaWNhdGUuPC9wYXJhbT4KICAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJpc1NlcnZlciI+aWYgc2V0IHRvIDxjPnRydWU8L2M+IFtpcyBzZXJ2ZXJdLjwvcGFyYW0+Ci0gICAgICAgIHB1YmxpYyBUVExTU29ja2V0KFRjcENsaWVudCBjbGllbnQsIFg1MDlDZXJ0aWZpY2F0ZSBjZXJ0aWZpY2F0ZSwgYm9vbCBpc1NlcnZlciA9IGZhbHNlKQorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNlcnRWYWxpZGF0b3IiPlVzZXIgZGVmaW5lZCBjZXJ0IHZhbGlkYXRvci48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayI+VGhlIGNhbGxiYWNrIHRvIHNlbGVjdCB3aGljaCBjZXJ0aWZpY2F0ZSB0byB1c2UuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJzc2xQcm90b2NvbHMiPlRoZSBTc2xQcm90b2NvbHMgdmFsdWUgdGhhdCByZXByZXNlbnRzIHRoZSBwcm90b2NvbCB1c2VkIGZvciBhdXRoZW50aWNhdGlvbi48L3BhcmFtPgorICAgICAgICBwdWJsaWMgVFRMU1NvY2tldCgKKyAgICAgICAgICAgIFRjcENsaWVudCBjbGllbnQsCisgICAgICAgICAgICBYNTA5Q2VydGlmaWNhdGUgY2VydGlmaWNhdGUsCisgICAgICAgICAgICBib29sIGlzU2VydmVyID0gZmFsc2UsCisgICAgICAgICAgICBSZW1vdGVDZXJ0aWZpY2F0ZVZhbGlkYXRpb25DYWxsYmFjayBjZXJ0VmFsaWRhdG9yID0gbnVsbCwKKyAgICAgICAgICAgIExvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayBsb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgPSBudWxsLAorICAgICAgICAgICAgLy8gVE9ETzogRW5hYmxlIFRsczExIGFuZCBUbHMxMiAoVExTIDEuMSBhbmQgMS4yKSBieSBkZWZhdWx0IG9uY2Ugd2Ugc3RhcnQgdXNpbmcgLk5FVCA0LjUrLgorICAgICAgICAgICAgU3NsUHJvdG9jb2xzIHNzbFByb3RvY29scyA9IFNzbFByb3RvY29scy5UbHMpCiAgICAgICAgIHsKICAgICAgICAgICAgIHRoaXMuY2xpZW50ID0gY2xpZW50OwogICAgICAgICAgICAgdGhpcy5jZXJ0aWZpY2F0ZSA9IGNlcnRpZmljYXRlOworICAgICAgICAgICAgdGhpcy5jZXJ0VmFsaWRhdG9yID0gY2VydFZhbGlkYXRvcjsKKyAgICAgICAgICAgIHRoaXMubG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrID0gbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrOworICAgICAgICAgICAgdGhpcy5zc2xQcm90b2NvbHMgPSBzc2xQcm90b2NvbHM7CiAgICAgICAgICAgICB0aGlzLmlzU2VydmVyID0gaXNTZXJ2ZXI7CisgICAgICAgICAgICBpZiAoaXNTZXJ2ZXIgJiYgY2VydGlmaWNhdGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oIlRUTFNTb2NrZXQgbmVlZHMgY2VydGlmaWNhdGUgdG8gYmUgdXNlZCBmb3Igc2VydmVyIiwgImNlcnRpZmljYXRlIik7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChJc09wZW4pCiAgICAgICAgICAgICB7CkBAIC05Nyw4ICsxMjQsMTYgQEAKICAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJwb3J0Ij5UaGUgcG9ydC48L3BhcmFtPgogICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNlcnRpZmljYXRlUGF0aCI+VGhlIGNlcnRpZmljYXRlIHBhdGguPC9wYXJhbT4KICAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjZXJ0VmFsaWRhdG9yIj5Vc2VyIGRlZmluZWQgY2VydCB2YWxpZGF0b3IuPC9wYXJhbT4KLSAgICAgICAgcHVibGljIFRUTFNTb2NrZXQoc3RyaW5nIGhvc3QsIGludCBwb3J0LCBzdHJpbmcgY2VydGlmaWNhdGVQYXRoLCBSZW1vdGVDZXJ0aWZpY2F0ZVZhbGlkYXRpb25DYWxsYmFjayBjZXJ0VmFsaWRhdG9yID0gbnVsbCkKLSAgICAgICAgICAgIDogdGhpcyhob3N0LCBwb3J0LCAwLCBYNTA5Q2VydGlmaWNhdGUuQ3JlYXRlRnJvbUNlcnRGaWxlKGNlcnRpZmljYXRlUGF0aCksIGNlcnRWYWxpZGF0b3IpCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrIj5UaGUgY2FsbGJhY2sgdG8gc2VsZWN0IHdoaWNoIGNlcnRpZmljYXRlIHRvIHVzZS48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InNzbFByb3RvY29scyI+VGhlIFNzbFByb3RvY29scyB2YWx1ZSB0aGF0IHJlcHJlc2VudHMgdGhlIHByb3RvY29sIHVzZWQgZm9yIGF1dGhlbnRpY2F0aW9uLjwvcGFyYW0+CisgICAgICAgIHB1YmxpYyBUVExTU29ja2V0KAorICAgICAgICAgICAgc3RyaW5nIGhvc3QsCisgICAgICAgICAgICBpbnQgcG9ydCwKKyAgICAgICAgICAgIHN0cmluZyBjZXJ0aWZpY2F0ZVBhdGgsCisgICAgICAgICAgICBSZW1vdGVDZXJ0aWZpY2F0ZVZhbGlkYXRpb25DYWxsYmFjayBjZXJ0VmFsaWRhdG9yID0gbnVsbCwKKyAgICAgICAgICAgIExvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayBsb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgPSBudWxsLAorICAgICAgICAgICAgU3NsUHJvdG9jb2xzIHNzbFByb3RvY29scyA9IFNzbFByb3RvY29scy5UbHMpCisgICAgICAgICAgICA6IHRoaXMoaG9zdCwgcG9ydCwgMCwgWDUwOUNlcnRpZmljYXRlLkNyZWF0ZUZyb21DZXJ0RmlsZShjZXJ0aWZpY2F0ZVBhdGgpLCBjZXJ0VmFsaWRhdG9yLCBsb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2ssIHNzbFByb3RvY29scykKICAgICAgICAgewogICAgICAgICB9CiAKQEAgLTEwOSw4ICsxNDQsMTYgQEAKICAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJwb3J0Ij5UaGUgcG9ydC48L3BhcmFtPgogICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNlcnRpZmljYXRlIj5UaGUgY2VydGlmaWNhdGUuPC9wYXJhbT4KICAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjZXJ0VmFsaWRhdG9yIj5Vc2VyIGRlZmluZWQgY2VydCB2YWxpZGF0b3IuPC9wYXJhbT4KLSAgICAgICAgcHVibGljIFRUTFNTb2NrZXQoc3RyaW5nIGhvc3QsIGludCBwb3J0LCBYNTA5Q2VydGlmaWNhdGUgY2VydGlmaWNhdGUsIFJlbW90ZUNlcnRpZmljYXRlVmFsaWRhdGlvbkNhbGxiYWNrIGNlcnRWYWxpZGF0b3IgPSBudWxsKQotICAgICAgICAgICAgOiB0aGlzKGhvc3QsIHBvcnQsIDAsIGNlcnRpZmljYXRlLCBjZXJ0VmFsaWRhdG9yKQorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayI+VGhlIGNhbGxiYWNrIHRvIHNlbGVjdCB3aGljaCBjZXJ0aWZpY2F0ZSB0byB1c2UuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJzc2xQcm90b2NvbHMiPlRoZSBTc2xQcm90b2NvbHMgdmFsdWUgdGhhdCByZXByZXNlbnRzIHRoZSBwcm90b2NvbCB1c2VkIGZvciBhdXRoZW50aWNhdGlvbi48L3BhcmFtPgorICAgICAgICBwdWJsaWMgVFRMU1NvY2tldCgKKyAgICAgICAgICAgIHN0cmluZyBob3N0LAorICAgICAgICAgICAgaW50IHBvcnQsCisgICAgICAgICAgICBYNTA5Q2VydGlmaWNhdGUgY2VydGlmaWNhdGUgPSBudWxsLAorICAgICAgICAgICAgUmVtb3RlQ2VydGlmaWNhdGVWYWxpZGF0aW9uQ2FsbGJhY2sgY2VydFZhbGlkYXRvciA9IG51bGwsCisgICAgICAgICAgICBMb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrID0gbnVsbCwKKyAgICAgICAgICAgIFNzbFByb3RvY29scyBzc2xQcm90b2NvbHMgPSBTc2xQcm90b2NvbHMuVGxzKQorICAgICAgICAgICAgOiB0aGlzKGhvc3QsIHBvcnQsIDAsIGNlcnRpZmljYXRlLCBjZXJ0VmFsaWRhdG9yLCBsb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2ssIHNzbFByb3RvY29scykKICAgICAgICAgewogICAgICAgICB9CiAKQEAgLTEyMiwxMyArMTY1LDI0IEBACiAgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idGltZW91dCI+VGhlIHRpbWVvdXQuPC9wYXJhbT4KICAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjZXJ0aWZpY2F0ZSI+VGhlIGNlcnRpZmljYXRlLjwvcGFyYW0+CiAgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY2VydFZhbGlkYXRvciI+VXNlciBkZWZpbmVkIGNlcnQgdmFsaWRhdG9yLjwvcGFyYW0+Ci0gICAgICAgIHB1YmxpYyBUVExTU29ja2V0KHN0cmluZyBob3N0LCBpbnQgcG9ydCwgaW50IHRpbWVvdXQsIFg1MDlDZXJ0aWZpY2F0ZSBjZXJ0aWZpY2F0ZSwgUmVtb3RlQ2VydGlmaWNhdGVWYWxpZGF0aW9uQ2FsbGJhY2sgY2VydFZhbGlkYXRvciA9IG51bGwpCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrIj5UaGUgY2FsbGJhY2sgdG8gc2VsZWN0IHdoaWNoIGNlcnRpZmljYXRlIHRvIHVzZS48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InNzbFByb3RvY29scyI+VGhlIFNzbFByb3RvY29scyB2YWx1ZSB0aGF0IHJlcHJlc2VudHMgdGhlIHByb3RvY29sIHVzZWQgZm9yIGF1dGhlbnRpY2F0aW9uLjwvcGFyYW0+CisgICAgICAgIHB1YmxpYyBUVExTU29ja2V0KAorICAgICAgICAgICAgc3RyaW5nIGhvc3QsCisgICAgICAgICAgICBpbnQgcG9ydCwKKyAgICAgICAgICAgIGludCB0aW1lb3V0LAorICAgICAgICAgICAgWDUwOUNlcnRpZmljYXRlIGNlcnRpZmljYXRlLAorICAgICAgICAgICAgUmVtb3RlQ2VydGlmaWNhdGVWYWxpZGF0aW9uQ2FsbGJhY2sgY2VydFZhbGlkYXRvciA9IG51bGwsCisgICAgICAgICAgICBMb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrID0gbnVsbCwKKyAgICAgICAgICAgIFNzbFByb3RvY29scyBzc2xQcm90b2NvbHMgPSBTc2xQcm90b2NvbHMuVGxzKQogICAgICAgICB7CiAgICAgICAgICAgICB0aGlzLmhvc3QgPSBob3N0OwogICAgICAgICAgICAgdGhpcy5wb3J0ID0gcG9ydDsKICAgICAgICAgICAgIHRoaXMudGltZW91dCA9IHRpbWVvdXQ7CiAgICAgICAgICAgICB0aGlzLmNlcnRpZmljYXRlID0gY2VydGlmaWNhdGU7CiAgICAgICAgICAgICB0aGlzLmNlcnRWYWxpZGF0b3IgPSBjZXJ0VmFsaWRhdG9yOworICAgICAgICAgICAgdGhpcy5sb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgPSBsb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2s7CisgICAgICAgICAgICB0aGlzLnNzbFByb3RvY29scyA9IHNzbFByb3RvY29sczsKIAogICAgICAgICAgICAgSW5pdFNvY2tldCgpOwogICAgICAgICB9CkBAIC0xMzgsNyArMTkyLDcgQEAKICAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHJpdmF0ZSB2b2lkIEluaXRTb2NrZXQoKQogICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmNsaWVudCA9IG5ldyBUY3BDbGllbnQoKTsKKyAgICAgICAgICAgIGNsaWVudCA9IFRTb2NrZXRWZXJzaW9uaXplci5DcmVhdGVUY3BDbGllbnQoKTsKICAgICAgICAgICAgIGNsaWVudC5SZWNlaXZlVGltZW91dCA9IGNsaWVudC5TZW5kVGltZW91dCA9IHRpbWVvdXQ7CiAgICAgICAgICAgICBjbGllbnQuQ2xpZW50Lk5vRGVsYXkgPSB0cnVlOwogICAgICAgICB9CkBAIC0yMDksOSArMjYzLDkgQEAKICAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJzZW5kZXIiPlRoZSBzZW5kZXItb2JqZWN0LjwvcGFyYW0+CiAgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY2VydGlmaWNhdGUiPlRoZSB1c2VkIGNlcnRpZmljYXRlLjwvcGFyYW0+CiAgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY2hhaW4iPlRoZSBjZXJ0aWZpY2F0ZSBjaGFpbi48L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InNzbFBvbGljeUVycm9ycyI+QW4gZW51bSwgd2hpY2ggbGlzdHMgYWxsIHRoZSBlcnJvcnMgZnJvbSB0aGUgLk5FVCBjZXJ0aWZpY2F0ZSBjaGVjay48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InNzbFZhbGlkYXRpb25FcnJvcnMiPkFuIGVudW0sIHdoaWNoIGxpc3RzIGFsbCB0aGUgZXJyb3JzIGZyb20gdGhlIC5ORVQgY2VydGlmaWNhdGUgY2hlY2suPC9wYXJhbT4KICAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICAgICAgcHJpdmF0ZSBib29sIENlcnRpZmljYXRlVmFsaWRhdG9yKG9iamVjdCBzZW5kZXIsIFg1MDlDZXJ0aWZpY2F0ZSBjZXJ0aWZpY2F0ZSwgWDUwOUNoYWluIGNoYWluLCBTc2xQb2xpY3lFcnJvcnMgc3NsVmFsaWRhdGlvbkVycm9ycykKKyAgICAgICAgcHJpdmF0ZSBib29sIERlZmF1bHRDZXJ0aWZpY2F0ZVZhbGlkYXRvcihvYmplY3Qgc2VuZGVyLCBYNTA5Q2VydGlmaWNhdGUgY2VydGlmaWNhdGUsIFg1MDlDaGFpbiBjaGFpbiwgU3NsUG9saWN5RXJyb3JzIHNzbFZhbGlkYXRpb25FcnJvcnMpCiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiAoc3NsVmFsaWRhdGlvbkVycm9ycyA9PSBTc2xQb2xpY3lFcnJvcnMuTm9uZSk7CiAgICAgICAgIH0KQEAgLTIyNiw3ICsyODAsNyBAQAogICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5BbHJlYWR5T3BlbiwgIlNvY2tldCBhbHJlYWR5IGNvbm5lY3RlZCIpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAoU3RyaW5nLklzTnVsbE9yRW1wdHkoaG9zdCkpCisgICAgICAgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkoaG9zdCkpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4sICJDYW5ub3Qgb3BlbiBudWxsIGhvc3QiKTsKICAgICAgICAgICAgIH0KQEAgLTI1MSwyNyArMzA1LDQ0IEBACiAgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHB1YmxpYyB2b2lkIHNldHVwVExTKCkKICAgICAgICAgewotICAgICAgICAgICAgaWYgKGlzU2VydmVyKQorICAgICAgICAgICAgUmVtb3RlQ2VydGlmaWNhdGVWYWxpZGF0aW9uQ2FsbGJhY2sgdmFsaWRhdG9yID0gdGhpcy5jZXJ0VmFsaWRhdG9yID8/IERlZmF1bHRDZXJ0aWZpY2F0ZVZhbGlkYXRvcjsKKworICAgICAgICAgICAgaWYgKHRoaXMubG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrICE9IG51bGwpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gU2VydmVyIGF1dGhlbnRpY2F0aW9uCi0gICAgICAgICAgICAgICAgdGhpcy5zZWN1cmVTdHJlYW0gPSBuZXcgU3NsU3RyZWFtKHRoaXMuY2xpZW50LkdldFN0cmVhbSgpLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgdGhpcy5zZWN1cmVTdHJlYW0uQXV0aGVudGljYXRlQXNTZXJ2ZXIodGhpcy5jZXJ0aWZpY2F0ZSwgZmFsc2UsIFNzbFByb3RvY29scy5UbHMsIHRydWUpOworICAgICAgICAgICAgICAgIHRoaXMuc2VjdXJlU3RyZWFtID0gbmV3IFNzbFN0cmVhbSgKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGllbnQuR2V0U3RyZWFtKCksCisgICAgICAgICAgICAgICAgICAgIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICB2YWxpZGF0b3IsCisgICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrCisgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBDbGllbnQgYXV0aGVudGljYXRpb24KLSAgICAgICAgICAgICAgICBYNTA5Q2VydGlmaWNhdGVDb2xsZWN0aW9uIHZhbGlkQ2VydHMgPSBuZXcgWDUwOUNlcnRpZmljYXRlQ29sbGVjdGlvbigpOwotICAgICAgICAgICAgICAgIHZhbGlkQ2VydHMuQWRkKGNlcnRpZmljYXRlKTsKKyAgICAgICAgICAgICAgICB0aGlzLnNlY3VyZVN0cmVhbSA9IG5ldyBTc2xTdHJlYW0oCisgICAgICAgICAgICAgICAgICAgIHRoaXMuY2xpZW50LkdldFN0cmVhbSgpLAorICAgICAgICAgICAgICAgICAgICBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9yCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGlmICh0aGlzLmNlcnRWYWxpZGF0b3IgIT0gbnVsbCkKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChpc1NlcnZlcikKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VjdXJlU3RyZWFtID0gbmV3IFNzbFN0cmVhbSh0aGlzLmNsaWVudC5HZXRTdHJlYW0oKSwgZmFsc2UsIG5ldyBSZW1vdGVDZXJ0aWZpY2F0ZVZhbGlkYXRpb25DYWxsYmFjayh0aGlzLmNlcnRWYWxpZGF0b3IpKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gU2VydmVyIGF1dGhlbnRpY2F0aW9uCisgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VjdXJlU3RyZWFtLkF1dGhlbnRpY2F0ZUFzU2VydmVyKHRoaXMuY2VydGlmaWNhdGUsIHRoaXMuY2VydFZhbGlkYXRvciAhPSBudWxsLCBzc2xQcm90b2NvbHMsIHRydWUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aGlzLnNlY3VyZVN0cmVhbSA9IG5ldyBTc2xTdHJlYW0odGhpcy5jbGllbnQuR2V0U3RyZWFtKCksIGZhbHNlLCBuZXcgUmVtb3RlQ2VydGlmaWNhdGVWYWxpZGF0aW9uQ2FsbGJhY2soQ2VydGlmaWNhdGVWYWxpZGF0b3IpKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ2xpZW50IGF1dGhlbnRpY2F0aW9uCisgICAgICAgICAgICAgICAgICAgIFg1MDlDZXJ0aWZpY2F0ZUNvbGxlY3Rpb24gY2VydHMgPSBjZXJ0aWZpY2F0ZSAhPSBudWxsID8gbmV3IFg1MDlDZXJ0aWZpY2F0ZUNvbGxlY3Rpb24geyBjZXJ0aWZpY2F0ZSB9IDogbmV3IFg1MDlDZXJ0aWZpY2F0ZUNvbGxlY3Rpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWN1cmVTdHJlYW0uQXV0aGVudGljYXRlQXNDbGllbnQoaG9zdCwgY2VydHMsIHNzbFByb3RvY29scywgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRoaXMuc2VjdXJlU3RyZWFtLkF1dGhlbnRpY2F0ZUFzQ2xpZW50KGhvc3QsIHZhbGlkQ2VydHMsIFNzbFByb3RvY29scy5UbHMsIHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLkNsb3NlKCk7CisgICAgICAgICAgICAgICAgdGhyb3c7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlucHV0U3RyZWFtID0gdGhpcy5zZWN1cmVTdHJlYW07CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFRyYW5zcG9ydC5jcyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UVHJhbnNwb3J0LmNzCmluZGV4IDI4MTEzOTkuLjVlNGFjMjIgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UVHJhbnNwb3J0LmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UVHJhbnNwb3J0LmNzCkBAIC0zNCw3ICszNCw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBwcml2YXRlIGJ5dGVbXSBfcGVla0J1ZmZlciA9IG5ldyBieXRlWzFdOwotICAgICAgICBwcml2YXRlIGJvb2wgX2hhc1BlZWtCeXRlID0gZmFsc2U7CisgICAgICAgIHByaXZhdGUgYm9vbCBfaGFzUGVla0J5dGU7CiAKICAgICAgICAgcHVibGljIGJvb2wgUGVlaygpCiAgICAgICAgIHsKQEAgLTUzLDkgKzUzLDkgQEAKICAgICAgICAgICAgICAgICBpZiAoYnl0ZXMgPT0gMCkKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2goIElPRXhjZXB0aW9uKQorICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgIAorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgX2hhc1BlZWtCeXRlID0gdHJ1ZTsKQEAgLTY2LDEwICs2NiwyMyBAQAogCiAgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIENsb3NlKCk7CiAKKyAgICAgICAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIFZhbGlkYXRlQnVmZmVyQXJncyhieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYnVmID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbigiYnVmIik7CisgICAgICAgICAgICBpZiAob2ZmIDwgMCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKCJCdWZmZXIgb2Zmc2V0IGlzIHNtYWxsZXIgdGhhbiB6ZXJvLiIpOworICAgICAgICAgICAgaWYgKGxlbiA8IDApCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigiQnVmZmVyIGxlbmd0aCBpcyBzbWFsbGVyIHRoYW4gemVyby4iKTsKKyAgICAgICAgICAgIGlmIChvZmYgKyBsZW4gPiBidWYuTGVuZ3RoKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oIk5vdCBlbm91Z2ggZGF0YS4iKTsKKyAgICAgICAgfQorCiAgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgUmVhZChieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKTsKIAogICAgICAgICBwdWJsaWMgaW50IFJlYWRBbGwoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikKICAgICAgICAgeworICAgICAgICAgICAgVmFsaWRhdGVCdWZmZXJBcmdzKGJ1Ziwgb2ZmLCBsZW4pOwogICAgICAgICAgICAgaW50IGdvdCA9IDA7CiAKICAgICAgICAgICAgIC8vSWYgd2UgcHJldmlvdXNseSBwZWVrZWQgYSBieXRlLCB3ZSBuZWVkIHRvIHVzZSB0aGF0IGZpcnN0LgpAQCAtOTUsNyArMTA4LDcgQEAKIAogICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFdyaXRlKGJ5dGVbXSBidWYpCiAgICAgICAgIHsKLSAgICAgICAgICAgIFdyaXRlIChidWYsIDAsIGJ1Zi5MZW5ndGgpOworICAgICAgICAgICAgV3JpdGUoYnVmLCAwLCBidWYuTGVuZ3RoKTsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pOwpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uY3MgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5jcwppbmRleCA2ZGNkOTg3Li43ZjZjYzE4IDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5jcworKysgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5jcwpAQCAtNDAsMTQgKzQwLDE0IEBACiAgICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIFRUcmFuc3BvcnRFeGNlcHRpb24oRXhjZXB0aW9uVHlwZSB0eXBlLCBzdHJpbmcgbWVzc2FnZSkKLSAgICAgICAgICAgIDogYmFzZShtZXNzYWdlKQorICAgICAgICBwdWJsaWMgVFRyYW5zcG9ydEV4Y2VwdGlvbihFeGNlcHRpb25UeXBlIHR5cGUsIHN0cmluZyBtZXNzYWdlLCBFeGNlcHRpb24gaW5uZXIgPSBudWxsKQorICAgICAgICAgICAgOiBiYXNlKG1lc3NhZ2UsIGlubmVyKQogICAgICAgICB7CiAgICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIFRUcmFuc3BvcnRFeGNlcHRpb24oc3RyaW5nIG1lc3NhZ2UpCi0gICAgICAgICAgICA6IGJhc2UobWVzc2FnZSkKKyAgICAgICAgcHVibGljIFRUcmFuc3BvcnRFeGNlcHRpb24oc3RyaW5nIG1lc3NhZ2UsIEV4Y2VwdGlvbiBpbm5lciA9IG51bGwpCisgICAgICAgICAgICA6IGJhc2UobWVzc2FnZSwgaW5uZXIpCiAgICAgICAgIHsKICAgICAgICAgfQogCkBAIC02Miw3ICs2Miw4IEBACiAgICAgICAgICAgICBOb3RPcGVuLAogICAgICAgICAgICAgQWxyZWFkeU9wZW4sCiAgICAgICAgICAgICBUaW1lZE91dCwKLSAgICAgICAgICAgIEVuZE9mRmlsZQorICAgICAgICAgICAgRW5kT2ZGaWxlLAorICAgICAgICAgICAgSW50ZXJydXB0ZWQKICAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UVHJhbnNwb3J0RmFjdG9yeS5jcyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UVHJhbnNwb3J0RmFjdG9yeS5jcwppbmRleCBmYTEwMDMzLi40N2EwYzYyIDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFRyYW5zcG9ydEZhY3RvcnkuY3MKKysrIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RUcmFuc3BvcnRGYWN0b3J5LmNzCkBAIC0yNiw3ICsyNiw3IEBACiBuYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydAogewogICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gRnJvbSBNYXJrIFNsZWUgJiBBZGl0eWEgQWdhcndhbCBvZiBGYWNlYm9vazoKKyAgICAvLy8gRnJvbSBNYXJrIFNsZWUgJmFtcDsgQWRpdHlhIEFnYXJ3YWwgb2YgRmFjZWJvb2s6CiAgICAgLy8vIEZhY3RvcnkgY2xhc3MgdXNlZCB0byBjcmVhdGUgd3JhcHBlZCBpbnN0YW5jZSBvZiBUcmFuc3BvcnRzLgogICAgIC8vLyBUaGlzIGlzIHVzZWQgcHJpbWFyaWx5IGluIHNlcnZlcnMsIHdoaWNoIGdldCBUcmFuc3BvcnRzIGZyb20KICAgICAvLy8gYSBTZXJ2ZXJUcmFuc3BvcnQgYW5kIHRoZW4gbWF5IHdhbnQgdG8gbXV0YXRlIHRoZW0gKGkuZS4gY3JlYXRlCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvSlNPTi9Qcm9ncmFtLmNzIGIvbGliL2NzaGFycC90ZXN0L0pTT04vUHJvZ3JhbS5jcwppbmRleCA5ODIzMjIxLi5mNjEzODhhIDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3Rlc3QvSlNPTi9Qcm9ncmFtLmNzCisrKyBiL2xpYi9jc2hhcnAvdGVzdC9KU09OL1Byb2dyYW0uY3MKQEAgLTM0LDYgKzM0LDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgVGVzdFRocmlmdDIzNjUoKTsgIC8vIEpTT04gYmluYXJ5IGRlY29kZXMgdG9vIG11Y2ggZGF0YQogICAgICAgICAgICAgVGVzdFRocmlmdDIzMzYoKTsgIC8vIGhleCBlbmNvZGluZyB1c2luZyBcdVhYWFggd2hlcmUgMHhYWFhYID4gMHhGRgorICAgICAgICAgICAgVGVzdFRocmlmdDM0MDMoKTsgLy8gSlNPTiBlc2NhcGVkIHVuaWNvZGUgc3Vycm9nYXRlIHBhaXIgc3VwcG9ydC4KICAgICAgICAgfQogCiAKQEAgLTc4LDUgKzc5LDE3IEBACiAgICAgICAgICAgICB2YXIgcHJvdCA9IG5ldyBUSlNPTlByb3RvY29sKHRyYW5zKTsKICAgICAgICAgICAgIERlYnVnLkFzc2VydChwcm90LlJlYWRTdHJpbmcoKSA9PSBSVVNTSUFOX1RFWFQsICJyZWFkaW5nIEpTT04gd2l0aCBoZXgtZW5jb2RlZCBjaGFycyA+IDggYml0Iik7CiAgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgVGVzdFRocmlmdDM0MDMoKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmcgR0NMRUZfVEVYVCA9ICJcdWQ4MzRcdWRkMWUiOworICAgICAgICAgICAgY29uc3Qgc3RyaW5nIEdDTEVGX0pTT04gPSAiXCJcXHVkODM0XFx1ZGQxZVwiIjsKKworICAgICAgICAgICAgLy8gcGFyc2UgYW5kIGNoZWNrCisgICAgICAgICAgICB2YXIgc3RtID0gbmV3IE1lbW9yeVN0cmVhbShFbmNvZGluZy5VVEY4LkdldEJ5dGVzKEdDTEVGX0pTT04pKTsKKyAgICAgICAgICAgIHZhciB0cmFucyA9IG5ldyBUU3RyZWFtVHJhbnNwb3J0KHN0bSwgbnVsbCk7CisgICAgICAgICAgICB2YXIgcHJvdCA9IG5ldyBUSlNPTlByb3RvY29sKHRyYW5zKTsKKyAgICAgICAgICAgIERlYnVnLkFzc2VydChwcm90LlJlYWRTdHJpbmcoKSA9PSBHQ0xFRl9URVhULCAicmVhZGluZyBKU09OIHdpdGggc3Vycm9nYXRlIHBhaXIgaGV4LWVuY29kZWQgY2hhcnMiKTsKKyAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9KU09OL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzIGIvbGliL2NzaGFycC90ZXN0L0pTT04vUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKaW5kZXggMzA0Y2NmYy4uZmRmZjRhMSAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC90ZXN0L0pTT04vUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKKysrIGIvbGliL2NzaGFycC90ZXN0L0pTT04vUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKQEAgLTI3LDkgKzI3LDkgQEAKIFthc3NlbWJseTogQXNzZW1ibHlUaXRsZSgiSlNPTlRlc3QiKV0KIFthc3NlbWJseTogQXNzZW1ibHlEZXNjcmlwdGlvbigiIildCiBbYXNzZW1ibHk6IEFzc2VtYmx5Q29uZmlndXJhdGlvbigiIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5Q29tcGFueSgiIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5UHJvZHVjdCgiSlNPTlRlc3QiKV0KLVthc3NlbWJseTogQXNzZW1ibHlDb3B5cmlnaHQoIkNvcHlyaWdodCDCqSAgMjAxNCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVByb2R1Y3QoIlRocmlmdCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvcHlyaWdodCgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCiBbYXNzZW1ibHk6IEFzc2VtYmx5VHJhZGVtYXJrKCIiKV0KIFthc3NlbWJseTogQXNzZW1ibHlDdWx0dXJlKCIiKV0KIApAQCAtNTEsNSArNTEsNSBAQAogLy8gU2llIGvDtm5uZW4gYWxsZSBXZXJ0ZSBhbmdlYmVuIG9kZXIgZGllIHN0YW5kYXJkbcOkw59pZ2VuIEJ1aWxkLSB1bmQgUmV2aXNpb25zbnVtbWVybgogLy8gw7xiZXJuZWhtZW4sIGluZGVtIFNpZSAiKiIgZWluZ2ViZW46CiAvLyBbYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiMS4wLioiKV0KLVthc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIwLjkuMi4wIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5RmlsZVZlcnNpb24oIjAuOS4yLjAiKV0KK1thc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIxLjAuMC4wIildCitbYXNzZW1ibHk6IEFzc2VtYmx5RmlsZVZlcnNpb24oIjEuMC4wLjAiKV0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvQ2xpZW50L011bHRpcGxleC5UZXN0LkNsaWVudC5jcyBiL2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvQ2xpZW50L011bHRpcGxleC5UZXN0LkNsaWVudC5jcwppbmRleCBjY2ZlMjFkLi5jODEwYTA4IDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L0NsaWVudC9NdWx0aXBsZXguVGVzdC5DbGllbnQuY3MKKysrIGIvbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9DbGllbnQvTXVsdGlwbGV4LlRlc3QuQ2xpZW50LmNzCkBAIC0yNiwxNyArMjYsMTYgQEAKIHVzaW5nIFRocmlmdDsKIHVzaW5nIFRlc3QuTXVsdGlwbGV4OwogCi0KIG5hbWVzcGFjZSBUZXN0Lk11bHRpcGxleC5DbGllbnQKIHsKICAgICBwdWJsaWMgY2xhc3MgVGVzdENsaWVudAogICAgIHsKLSAgICAgICAgcHJpdmF0ZSB2b2lkIFJ1bigpCisgICAgICAgIHN0YXRpYyB2b2lkIEV4ZWN1dGUoaW50IHBvcnQpCiAgICAgICAgIHsKICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIFRUcmFuc3BvcnQgdHJhbnM7Ci0gICAgICAgICAgICAgICAgdHJhbnMgPSBuZXcgVFNvY2tldCgibG9jYWxob3N0IiwgOTA5MCk7CisgICAgICAgICAgICAgICAgdHJhbnMgPSBuZXcgVFNvY2tldCgibG9jYWxob3N0IiwgcG9ydCk7CiAgICAgICAgICAgICAgICAgdHJhbnMgPSBuZXcgVEZyYW1lZFRyYW5zcG9ydCh0cmFucyk7CiAgICAgICAgICAgICAgICAgdHJhbnMuT3BlbigpOwogCkBAIC00NCw0NCArNDMsNDAgQEAKIAogICAgICAgICAgICAgICAgIFRNdWx0aXBsZXhlZFByb3RvY29sIG11bHRpcGxleDsKIAotICAgICAgICAgICAgICAgIG11bHRpcGxleCA9IG5ldyBUTXVsdGlwbGV4ZWRQcm90b2NvbCggUHJvdG9jb2wsIENvbnN0YW50cy5OQU1FX0JFTkNITUFSS1NFUlZJQ0UpOwotICAgICAgICAgICAgICAgIEJlbmNobWFya1NlcnZpY2UuSWZhY2UgYmVuY2ggPSBuZXcgQmVuY2htYXJrU2VydmljZS5DbGllbnQoIG11bHRpcGxleCk7CisgICAgICAgICAgICAgICAgbXVsdGlwbGV4ID0gbmV3IFRNdWx0aXBsZXhlZFByb3RvY29sKFByb3RvY29sLCBDb25zdGFudHMuTkFNRV9CRU5DSE1BUktTRVJWSUNFKTsKKyAgICAgICAgICAgICAgICBCZW5jaG1hcmtTZXJ2aWNlLklmYWNlIGJlbmNoID0gbmV3IEJlbmNobWFya1NlcnZpY2UuQ2xpZW50KG11bHRpcGxleCk7CiAKLSAgICAgICAgICAgICAgICBtdWx0aXBsZXggPSBuZXcgVE11bHRpcGxleGVkUHJvdG9jb2woIFByb3RvY29sLCBDb25zdGFudHMuTkFNRV9BR0dSKTsKLSAgICAgICAgICAgICAgICBBZ2dyLklmYWNlIGFnZ3IgPSBuZXcgQWdnci5DbGllbnQoIG11bHRpcGxleCk7CisgICAgICAgICAgICAgICAgbXVsdGlwbGV4ID0gbmV3IFRNdWx0aXBsZXhlZFByb3RvY29sKFByb3RvY29sLCBDb25zdGFudHMuTkFNRV9BR0dSKTsKKyAgICAgICAgICAgICAgICBBZ2dyLklmYWNlIGFnZ3IgPSBuZXcgQWdnci5DbGllbnQobXVsdGlwbGV4KTsKIAotICAgICAgICAgICAgICAgIHNieXRlIGk7Ci0gICAgICAgICAgICAgICAgZm9yKCBpID0gMTsgMTAgPj0gaTsgKytpKQorICAgICAgICAgICAgICAgIGZvciAoc2J5dGUgaSA9IDE7IDEwID49IGk7ICsraSkKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGFnZ3IuYWRkVmFsdWUoIGJlbmNoLmZpYm9uYWNjaShpKSk7CisgICAgICAgICAgICAgICAgICAgIGFnZ3IuYWRkVmFsdWUoYmVuY2guZmlib25hY2NpKGkpKTsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBmb3JlYWNoKCBpbnQgayBpbiBhZ2dyLmdldFZhbHVlcygpKQorICAgICAgICAgICAgICAgIGZvcmVhY2ggKGludCBrIGluIGFnZ3IuZ2V0VmFsdWVzKCkpCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKGsuVG9TdHJpbmcoKSsiICIpOworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKGsuVG9TdHJpbmcoKSArICIgIik7CiAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIiKTsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHJhbnMuQ2xvc2UoKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoKCBFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSggZS5NZXNzYWdlKTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShlLk1lc3NhZ2UpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLQotICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgRXhlY3V0ZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFRlc3RDbGllbnQgY2xpZW50ID0gbmV3IFRlc3RDbGllbnQoKTsKLSAgICAgICAgICAgIGNsaWVudC5SdW4oKTsKLSAgICAgICAgfQotCiAgICAgICAgIHN0YXRpYyB2b2lkIE1haW4oc3RyaW5nW10gYXJncykKICAgICAgICAgewotICAgICAgICAgICAgRXhlY3V0ZSgpOworICAgICAgICAgICAgaW50IHBvcnQgPSA5MDkwOworICAgICAgICAgICAgaWYgKGFyZ3MuTGVuZ3RoID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwb3J0ID0gdXNob3J0LlBhcnNlKGFyZ3NbMF0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRXhlY3V0ZShwb3J0KTsKICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJkb25lLiIpOwotICAgICAgICAgICAgQ29uc29sZS5SZWFkTGluZSgpOwogICAgICAgICB9Ci0KICAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvQ2xpZW50L011bHRpcGxleENsaWVudC5jc3Byb2ogYi9saWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L0NsaWVudC9NdWx0aXBsZXhDbGllbnQuY3Nwcm9qCmluZGV4IDYyMjFlMTQuLjIxZTFjZTEgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvQ2xpZW50L011bHRpcGxleENsaWVudC5jc3Byb2oKKysrIGIvbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9DbGllbnQvTXVsdGlwbGV4Q2xpZW50LmNzcHJvagpAQCAtNDYsNyArNDYsNyBAQAogICAgIDxVcGRhdGVSZXF1aXJlZD5mYWxzZTwvVXBkYXRlUmVxdWlyZWQ+CiAgICAgPE1hcEZpbGVFeHRlbnNpb25zPnRydWU8L01hcEZpbGVFeHRlbnNpb25zPgogICAgIDxBcHBsaWNhdGlvblJldmlzaW9uPjA8L0FwcGxpY2F0aW9uUmV2aXNpb24+Ci0gICAgPEFwcGxpY2F0aW9uVmVyc2lvbj4xLjAuMC4lMmE8L0FwcGxpY2F0aW9uVmVyc2lvbj4KKyAgICA8QXBwbGljYXRpb25WZXJzaW9uPjEuMC4wLjA8L0FwcGxpY2F0aW9uVmVyc2lvbj4KICAgICA8VXNlQXBwbGljYXRpb25UcnVzdD5mYWxzZTwvVXNlQXBwbGljYXRpb25UcnVzdD4KICAgICA8Qm9vdHN0cmFwcGVyRW5hYmxlZD50cnVlPC9Cb290c3RyYXBwZXJFbmFibGVkPgogICA8L1Byb3BlcnR5R3JvdXA+CkBAIC0xNDUsNCArMTQ1LDQgQEAKIAogPC9QcmVCdWlsZEV2ZW50PgogICA8L1Byb3BlcnR5R3JvdXA+Ci08L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorPC9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9DbGllbnQvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MgYi9saWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L0NsaWVudC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwppbmRleCAwZTU2NWMzLi5mNjg2ZGVkIDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L0NsaWVudC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcworKysgYi9saWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L0NsaWVudC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpAQCAtMjcsOSArMjcsOSBAQAogW2Fzc2VtYmx5OiBBc3NlbWJseVRpdGxlKCJNdWx0aXBsZXhDbGllbnQiKV0KIFthc3NlbWJseTogQXNzZW1ibHlEZXNjcmlwdGlvbigiIildCiBbYXNzZW1ibHk6IEFzc2VtYmx5Q29uZmlndXJhdGlvbigiIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5Q29tcGFueSgiIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5UHJvZHVjdCgiTXVsdGlwbGV4Q2xpZW50IildCi1bYXNzZW1ibHk6IEFzc2VtYmx5Q29weXJpZ2h0KCJDb3B5cmlnaHQgwqkgMjAxMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb21wYW55KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlQcm9kdWN0KCJUaHJpZnQiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb3B5cmlnaHQoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQogW2Fzc2VtYmx5OiBBc3NlbWJseVRyYWRlbWFyaygiIildCiBbYXNzZW1ibHk6IEFzc2VtYmx5Q3VsdHVyZSgiIildCiAKQEAgLTUxLDUgKzUxLDUgQEAKIC8vIFlvdSBjYW4gc3BlY2lmeSBhbGwgdGhlIHZhbHVlcyBvciB5b3UgY2FuIGRlZmF1bHQgdGhlIEJ1aWxkIGFuZCBSZXZpc2lvbiBOdW1iZXJzCiAvLyBieSB1c2luZyB0aGUgJyonIGFzIHNob3duIGJlbG93OgogLy8gW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjEuMC4qIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiMC45LjIuMCIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseUZpbGVWZXJzaW9uKCIwLjkuMi4wIildCitbYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiMS4wLjAuMCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUZpbGVWZXJzaW9uKCIxLjAuMC4wIildCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L01ha2VmaWxlLmFtIGIvbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzI1M2Q2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDUyIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworR0VORVJBVEVEID0gXAorCWdlbi1jc2hhcnAvQWdnci5jcyBcCisJZ2VuLWNzaGFycC9CZW5jaG1hcmtTZXJ2aWNlLmNzIFwKKwlnZW4tY3NoYXJwL0Vycm9yLmNzCisKK0JVSUxUX1NPVVJDRVMgPSAkKEdFTkVSQVRFRCkKKworVEhSSUZUID0gJCh0b3BfYnVpbGRkaXIpL2NvbXBpbGVyL2NwcC90aHJpZnQKKworZ2VuLWNzaGFycC9BZ2dyLmNzOiAkKHRvcF9zcmNkaXIpL2NvbnRyaWIvYXN5bmMtdGVzdC9hZ2dyLnRocmlmdAorCSQoVEhSSUZUKSAtLWdlbiBjc2hhcnAgJDwKKworZ2VuLWNzaGFycC9CZW5jaG1hcmtTZXJ2aWNlLmNzIGdlbi1jc2hhcnAvRXJyb3IuY3M6ICQodG9wX3NyY2RpcikvbGliL3JiL2JlbmNobWFyay9CZW5jaG1hcmsudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIGNzaGFycCAkPAorCitUaHJpZnRJbXBsLmRsbDogTXVsdGlwbGV4LlRlc3QuQ29tbW9uLmNzICQoR0VORVJBVEVEKSAuLi8uLi9UaHJpZnQuZGxsCisJJChDU0MpICQoQ1NDX0RFRklORVMpIC10OmxpYnJhcnkgLW91dDouL1RocmlmdEltcGwuZGxsIC1yZWZlcmVuY2U6Li4vLi4vVGhyaWZ0LmRsbCAkKEdFTkVSQVRFRCkgJDwKKworTXVsdGlwbGV4Q2xpZW50LmV4ZTogQ2xpZW50L011bHRpcGxleC5UZXN0LkNsaWVudC5jcyBUaHJpZnRJbXBsLmRsbAorCSQoQ1NDKSAkKENTQ19ERUZJTkVTKSAtb3V0OiRAIC1yZWZlcmVuY2U6Li4vLi4vVGhyaWZ0LmRsbCAtcmVmZXJlbmNlOlRocmlmdEltcGwuZGxsICQ8CisKK011bHRpcGxleFNlcnZlci5leGU6IFNlcnZlci9NdWx0aXBsZXguVGVzdC5TZXJ2ZXIuY3MgVGhyaWZ0SW1wbC5kbGwKKwkkKENTQykgJChDU0NfREVGSU5FUykgLW91dDokQCAtcmVmZXJlbmNlOi4uLy4uL1RocmlmdC5kbGwgLXJlZmVyZW5jZTpUaHJpZnRJbXBsLmRsbCAkPAorCitjbGVhbi1sb2NhbDoKKwkkKFJNKSAtcmYgZ2VuLWNzaGFycCAqLmV4ZSAqLmRsbAorCitURVNUUE9SVCA9IDk1MDEKK2NoZWNrLWxvY2FsOiBNdWx0aXBsZXhTZXJ2ZXIuZXhlIE11bHRpcGxleENsaWVudC5leGUKKwllY2hvICQoVEVTVFBPUlQpCisJTU9OT19QQVRIPS4uLy4uLyB0aW1lb3V0IDEwIG1vbm8gTXVsdGlwbGV4U2VydmVyLmV4ZSAkKFRFU1RQT1JUKSAmCisJc2xlZXAgMQorCU1PTk9fUEFUSD0uLi8uLi8gbW9ubyBNdWx0aXBsZXhDbGllbnQuZXhlICQoVEVTVFBPUlQpCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L1NlcnZlci9NdWx0aXBsZXguVGVzdC5TZXJ2ZXIuY3MgYi9saWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L1NlcnZlci9NdWx0aXBsZXguVGVzdC5TZXJ2ZXIuY3MKaW5kZXggNjFjMmQ3Yy4uOTc4NjE4OSAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9TZXJ2ZXIvTXVsdGlwbGV4LlRlc3QuU2VydmVyLmNzCisrKyBiL2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvU2VydmVyL011bHRpcGxleC5UZXN0LlNlcnZlci5jcwpAQCAtMzAsMzAgKzMwLDE0IEBACiB7CiAgICAgcHVibGljIGNsYXNzIFRlc3RTZXJ2ZXIKICAgICB7Ci0gICAgICAgIHB1YmxpYyBpbnRlcmZhY2UgSVRlc3RIYW5kbGVyCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZvaWQgU2V0U2VydmVyKCBUU2VydmVyIGFTZXJ2ZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIGNsYXNzIFRlc3RIYW5kbGVySW1wbCA6IElUZXN0SGFuZGxlcgotICAgICAgICB7Ci0gICAgICAgICAgICBwcml2YXRlIFRTZXJ2ZXIgU2VydmVyOwotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBTZXRTZXJ2ZXIoIFRTZXJ2ZXIgYVNlcnZlcikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTZXJ2ZXIgPSBhU2VydmVyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLQotICAgICAgICBwcm90ZWN0ZWQgY2xhc3MgQmVuY2htYXJrU2VydmljZUltcGwgOiBUZXN0SGFuZGxlckltcGwsIEJlbmNobWFya1NlcnZpY2UuSWZhY2UKKyAgICAgICAgY2xhc3MgQmVuY2htYXJrU2VydmljZUltcGwgOiBCZW5jaG1hcmtTZXJ2aWNlLklmYWNlCiAgICAgICAgIHsKICAgICAgICAgICAgIHB1YmxpYyBpbnQgZmlib25hY2NpKHNieXRlIG4pCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaW50IHByZXYsIG5leHQsIHJlc3VsdDsKICAgICAgICAgICAgICAgICBwcmV2ICAgPSAwOwogICAgICAgICAgICAgICAgIHJlc3VsdCA9IDE7Ci0gICAgICAgICAgICAgICAgd2hpbGUoIG4gPiAwKQorICAgICAgICAgICAgICAgIHdoaWxlIChuID4gMCkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIG5leHQgICA9IHJlc3VsdCArIHByZXY7CiAgICAgICAgICAgICAgICAgICAgIHByZXYgICA9IHJlc3VsdDsKQEAgLTY0LDE0ICs0OCwxMyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLQotICAgICAgICBwcm90ZWN0ZWQgY2xhc3MgQWdnclNlcnZpY2VJbXBsIDogVGVzdEhhbmRsZXJJbXBsLCAgQWdnci5JZmFjZQorICAgICAgICBjbGFzcyBBZ2dyU2VydmljZUltcGwgOiBBZ2dyLklmYWNlCiAgICAgICAgIHsKICAgICAgICAgICAgIExpc3Q8aW50PiB2YWx1ZXMgPSBuZXcgTGlzdDxpbnQ+KCk7CiAKICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFkZFZhbHVlKGludCB2YWx1ZSkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YWx1ZXMuQWRkKCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgdmFsdWVzLkFkZCh2YWx1ZSk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHB1YmxpYyBMaXN0PGludD4gZ2V0VmFsdWVzKCkKQEAgLTgwLDUyICs2Myw0NSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICBzdGF0aWMgdm9pZCBFeGVjdXRlKCkKLSAgICAgICB7Ci0gICAgICAgICAgIHRyeQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAvLyBjcmVhdGUgcHJvdG9jb2wgZmFjdG9yeSwgZGVmYXVsdCB0byBCaW5hcnlQcm90b2NvbAotICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBQcm90b2NvbEZhY3RvcnkgPSBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkodHJ1ZSx0cnVlKTsKLSAgICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVydHJhbnMgICAgID0gbmV3IFRTZXJ2ZXJTb2NrZXQoIDkwOTAsIDAsIGZhbHNlKTsKLSAgICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IFRyYW5zcG9ydEZhY3RvcnkgPSBuZXcgVEZyYW1lZFRyYW5zcG9ydC5GYWN0b3J5KCk7CisgICAgICAgIHN0YXRpYyB2b2lkIEV4ZWN1dGUoaW50IHBvcnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBwcm90b2NvbCBmYWN0b3J5LCBkZWZhdWx0IHRvIEJpbmFyeVByb3RvY29sCisgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBQcm90b2NvbEZhY3RvcnkgPSBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkodHJ1ZSx0cnVlKTsKKyAgICAgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlcnRyYW5zID0gbmV3IFRTZXJ2ZXJTb2NrZXQocG9ydCwgMCwgZmFsc2UpOworICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IFRyYW5zcG9ydEZhY3RvcnkgPSBuZXcgVEZyYW1lZFRyYW5zcG9ydC5GYWN0b3J5KCk7CiAKLSAgICAgICAgICAgICAgIEJlbmNobWFya1NlcnZpY2UuSWZhY2UgYmVuY2hIYW5kbGVyID0gbmV3IEJlbmNobWFya1NlcnZpY2VJbXBsKCk7Ci0gICAgICAgICAgICAgICBUUHJvY2Vzc29yIGJlbmNoUHJvY2Vzc29yID0gbmV3IEJlbmNobWFya1NlcnZpY2UuUHJvY2Vzc29yKCBiZW5jaEhhbmRsZXIpOworICAgICAgICAgICAgICAgIEJlbmNobWFya1NlcnZpY2UuSWZhY2UgYmVuY2hIYW5kbGVyID0gbmV3IEJlbmNobWFya1NlcnZpY2VJbXBsKCk7CisgICAgICAgICAgICAgICAgVFByb2Nlc3NvciBiZW5jaFByb2Nlc3NvciA9IG5ldyBCZW5jaG1hcmtTZXJ2aWNlLlByb2Nlc3NvcihiZW5jaEhhbmRsZXIpOwogCi0gICAgICAgICAgICAgICBBZ2dyLklmYWNlIGFnZ3JIYW5kbGVyID0gbmV3IEFnZ3JTZXJ2aWNlSW1wbCgpOwotICAgICAgICAgICAgICAgVFByb2Nlc3NvciBhZ2dyUHJvY2Vzc29yID0gbmV3IEFnZ3IuUHJvY2Vzc29yKCBhZ2dySGFuZGxlcik7CisgICAgICAgICAgICAgICAgQWdnci5JZmFjZSBhZ2dySGFuZGxlciA9IG5ldyBBZ2dyU2VydmljZUltcGwoKTsKKyAgICAgICAgICAgICAgICBUUHJvY2Vzc29yIGFnZ3JQcm9jZXNzb3IgPSBuZXcgQWdnci5Qcm9jZXNzb3IoYWdnckhhbmRsZXIpOwogCi0gICAgICAgICAgICAgICBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IgbXVsdGlwbGV4ID0gbmV3IFRNdWx0aXBsZXhlZFByb2Nlc3NvcigpOwotICAgICAgICAgICAgICAgbXVsdGlwbGV4LlJlZ2lzdGVyUHJvY2Vzc29yKENvbnN0YW50cy5OQU1FX0JFTkNITUFSS1NFUlZJQ0UsIGJlbmNoUHJvY2Vzc29yKTsKLSAgICAgICAgICAgICAgIG11bHRpcGxleC5SZWdpc3RlclByb2Nlc3NvcihDb25zdGFudHMuTkFNRV9BR0dSLCBhZ2dyUHJvY2Vzc29yKTsKKyAgICAgICAgICAgICAgICBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IgbXVsdGlwbGV4ID0gbmV3IFRNdWx0aXBsZXhlZFByb2Nlc3NvcigpOworICAgICAgICAgICAgICAgIG11bHRpcGxleC5SZWdpc3RlclByb2Nlc3NvcihDb25zdGFudHMuTkFNRV9CRU5DSE1BUktTRVJWSUNFLCBiZW5jaFByb2Nlc3Nvcik7CisgICAgICAgICAgICAgICAgbXVsdGlwbGV4LlJlZ2lzdGVyUHJvY2Vzc29yKENvbnN0YW50cy5OQU1FX0FHR1IsIGFnZ3JQcm9jZXNzb3IpOwogCi0gICAgICAgICAgICAgICBUU2VydmVyIFNlcnZlckVuZ2luZSA9IG5ldyBUU2ltcGxlU2VydmVyKCBtdWx0aXBsZXgsIHNlcnZlcnRyYW5zLCBUcmFuc3BvcnRGYWN0b3J5LCBQcm90b2NvbEZhY3RvcnkpOworICAgICAgICAgICAgICAgIFRTZXJ2ZXIgU2VydmVyRW5naW5lID0gbmV3IFRTaW1wbGVTZXJ2ZXIobXVsdGlwbGV4LCBzZXJ2ZXJ0cmFucywgVHJhbnNwb3J0RmFjdG9yeSwgUHJvdG9jb2xGYWN0b3J5KTsKIAotICAgICAgICAgICAgICAgKGJlbmNoSGFuZGxlciBhcyBJVGVzdEhhbmRsZXIpLlNldFNlcnZlciggU2VydmVyRW5naW5lKTsKLSAgICAgICAgICAgICAgIChhZ2dySGFuZGxlciBhcyBJVGVzdEhhbmRsZXIpLlNldFNlcnZlciggU2VydmVyRW5naW5lKTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiU3RhcnRpbmcgdGhlIHNlcnZlciAuLi4iKTsKKyAgICAgICAgICAgICAgICBTZXJ2ZXJFbmdpbmUuU2VydmUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShlLk1lc3NhZ2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLSAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJTdGFydGluZyB0aGUgc2VydmVyIC4uLiIpOwotICAgICAgICAgICAgICAgU2VydmVyRW5naW5lLlNlcnZlKCk7Ci0KLSAgICAgICAgICAgICAgIChiZW5jaEhhbmRsZXIgYXMgSVRlc3RIYW5kbGVyKS5TZXRTZXJ2ZXIobnVsbCk7Ci0gICAgICAgICAgICAgICAoYWdnckhhbmRsZXIgYXMgSVRlc3RIYW5kbGVyKS5TZXRTZXJ2ZXIobnVsbCk7Ci0KLSAgICAgICAgICAgfQotICAgICAgICAgICBjYXRjaCggRXhjZXB0aW9uIGUpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCBlLk1lc3NhZ2UpOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCAiZG9uZS4iKTsKLSAgICAgICB9Ci0KLQotICAgICAgIHN0YXRpYyB2b2lkIE1haW4oc3RyaW5nW10gYXJncykKLSAgICAgICB7Ci0gICAgICAgICAgIEV4ZWN1dGUoKTsKLSAgICAgICB9CisgICAgICAgIHN0YXRpYyB2b2lkIE1haW4oc3RyaW5nW10gYXJncykKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHBvcnQgPSA5MDkwOworICAgICAgICAgICAgaWYgKGFyZ3MuTGVuZ3RoID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwb3J0ID0gdXNob3J0LlBhcnNlKGFyZ3NbMF0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRXhlY3V0ZShwb3J0KTsKKyAgICAgICAgfQogICAgIH0KLQotCi0KIH0KIApkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9TZXJ2ZXIvTXVsdGlwbGV4U2VydmVyLmNzcHJvaiBiL2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvU2VydmVyL011bHRpcGxleFNlcnZlci5jc3Byb2oKaW5kZXggZGMxZDEyMy4uYzRhNDM5NCAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9TZXJ2ZXIvTXVsdGlwbGV4U2VydmVyLmNzcHJvagorKysgYi9saWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L1NlcnZlci9NdWx0aXBsZXhTZXJ2ZXIuY3Nwcm9qCkBAIC00Niw3ICs0Niw3IEBACiAgICAgPFVwZGF0ZVJlcXVpcmVkPmZhbHNlPC9VcGRhdGVSZXF1aXJlZD4KICAgICA8TWFwRmlsZUV4dGVuc2lvbnM+dHJ1ZTwvTWFwRmlsZUV4dGVuc2lvbnM+CiAgICAgPEFwcGxpY2F0aW9uUmV2aXNpb24+MDwvQXBwbGljYXRpb25SZXZpc2lvbj4KLSAgICA8QXBwbGljYXRpb25WZXJzaW9uPjEuMC4wLiUyYTwvQXBwbGljYXRpb25WZXJzaW9uPgorICAgIDxBcHBsaWNhdGlvblZlcnNpb24+MS4wLjAuMDwvQXBwbGljYXRpb25WZXJzaW9uPgogICAgIDxVc2VBcHBsaWNhdGlvblRydXN0PmZhbHNlPC9Vc2VBcHBsaWNhdGlvblRydXN0PgogICAgIDxCb290c3RyYXBwZXJFbmFibGVkPnRydWU8L0Jvb3RzdHJhcHBlckVuYWJsZWQ+CiAgIDwvUHJvcGVydHlHcm91cD4KQEAgLTE0NSw0ICsxNDUsNCBAQAogCiA8L1ByZUJ1aWxkRXZlbnQ+CiAgIDwvUHJvcGVydHlHcm91cD4KLTwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCis8L1Byb2plY3Q+CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L1NlcnZlci9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcyBiL2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvU2VydmVyL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCmluZGV4IGUyNDU2ZTQuLjVkNDA1NDYgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvU2VydmVyL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCisrKyBiL2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvU2VydmVyL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCkBAIC0yNyw5ICsyNyw5IEBACiBbYXNzZW1ibHk6IEFzc2VtYmx5VGl0bGUoIk11bHRpcGxleFNlcnZlciIpXQogW2Fzc2VtYmx5OiBBc3NlbWJseURlc2NyaXB0aW9uKCIiKV0KIFthc3NlbWJseTogQXNzZW1ibHlDb25maWd1cmF0aW9uKCIiKV0KLVthc3NlbWJseTogQXNzZW1ibHlDb21wYW55KCIiKV0KLVthc3NlbWJseTogQXNzZW1ibHlQcm9kdWN0KCJNdWx0aXBsZXhTZXJ2ZXIiKV0KLVthc3NlbWJseTogQXNzZW1ibHlDb3B5cmlnaHQoIkNvcHlyaWdodCDCqSAyMDEzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVByb2R1Y3QoIlRocmlmdCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvcHlyaWdodCgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCiBbYXNzZW1ibHk6IEFzc2VtYmx5VHJhZGVtYXJrKCIiKV0KIFthc3NlbWJseTogQXNzZW1ibHlDdWx0dXJlKCIiKV0KIApAQCAtNTEsNSArNTEsNSBAQAogLy8gWW91IGNhbiBzcGVjaWZ5IGFsbCB0aGUgdmFsdWVzIG9yIHlvdSBjYW4gZGVmYXVsdCB0aGUgQnVpbGQgYW5kIFJldmlzaW9uIE51bWJlcnMKIC8vIGJ5IHVzaW5nIHRoZSAnKicgYXMgc2hvd24gYmVsb3c6CiAvLyBbYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiMS4wLioiKV0KLVthc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIwLjkuMi4wIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5RmlsZVZlcnNpb24oIjAuOS4yLjAiKV0KK1thc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIxLjAuMC4wIildCitbYXNzZW1ibHk6IEFzc2VtYmx5RmlsZVZlcnNpb24oIjEuMC4wLjAiKV0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvbWFrZXRlc3Quc2ggYi9saWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L21ha2V0ZXN0LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxZjI5ZWUyLi4wMDAwMDAwCi0tLSBhL2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvbWFrZXRlc3Quc2gKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIS9iaW4vc2gKLQotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLS4uLy4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLS1nZW4gY3NoYXJwICAuLi8uLi8uLi8uLi9jb250cmliL2FzeW5jLXRlc3QvYWdnci50aHJpZnQKLS4uLy4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLS1nZW4gY3NoYXJwICAuLi8uLi8uLi9yYi9iZW5jaG1hcmsvQmVuY2htYXJrLnRocmlmdAotZ21jcyAvdDpsaWJyYXJ5IC9vdXQ6Li9UaHJpZnRJbXBsLmRsbCAvcmVjdXJzZTouL2dlbi1jc2hhcnAvKiAvcmVmZXJlbmNlOi4uLy4uL1RocmlmdC5kbGwgTXVsdGlwbGV4LlRlc3QuQ29tbW9uLmNzCi1nbWNzICAvb3V0Ok11bHRpcGxleENsaWVudC5leGUgL3JlZmVyZW5jZTouLi8uLi9UaHJpZnQuZGxsIC9yZWZlcmVuY2U6VGhyaWZ0SW1wbC5kbGwgQ2xpZW50L011bHRpcGxleC5UZXN0LkNsaWVudC5jcwotZ21jcyAgL291dDpNdWx0aXBsZXhTZXJ2ZXIuZXhlIC9yZWZlcmVuY2U6Li4vLi4vVGhyaWZ0LmRsbCAvcmVmZXJlbmNlOlRocmlmdEltcGwuZGxsIFNlcnZlci9NdWx0aXBsZXguVGVzdC5TZXJ2ZXIuY3MKLQotCi0KLWV4cG9ydCBNT05PX1BBVEg9Li4vLi4vCi0KLXRpbWVvdXQgMTIwIC4vTXVsdGlwbGV4U2VydmVyLmV4ZSAmCi1zbGVlcCAzOwotLi9NdWx0aXBsZXhDbGllbnQuZXhlCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9BcHBfU3RhcnQvRmlsdGVyQ29uZmlnLmNzIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvQXBwX1N0YXJ0L0ZpbHRlckNvbmZpZy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTUxODRmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvQXBwX1N0YXJ0L0ZpbHRlckNvbmZpZy5jcwpAQCAtMCwwICsxLDMxIEBACivvu78vKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit1c2luZyBTeXN0ZW0uV2ViLk12YzsKKworbmFtZXNwYWNlIFRocmlmdE1WQ1Rlc3QKK3sKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZpbHRlckNvbmZpZworICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIFJlZ2lzdGVyR2xvYmFsRmlsdGVycyhHbG9iYWxGaWx0ZXJDb2xsZWN0aW9uIGZpbHRlcnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZpbHRlcnMuQWRkKG5ldyBIYW5kbGVFcnJvckF0dHJpYnV0ZSgpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L0FwcF9TdGFydC9Sb3V0ZUNvbmZpZy5jcyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L0FwcF9TdGFydC9Sb3V0ZUNvbmZpZy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGI2MDIzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvQXBwX1N0YXJ0L1JvdXRlQ29uZmlnLmNzCkBAIC0wLDAgKzEsMzkgQEAKK++7vy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzaW5nIFN5c3RlbS5XZWIuTXZjOwordXNpbmcgU3lzdGVtLldlYi5Sb3V0aW5nOworCituYW1lc3BhY2UgVGhyaWZ0TVZDVGVzdAoreworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUm91dGVDb25maWcKKyAgICB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBSZWdpc3RlclJvdXRlcyhSb3V0ZUNvbGxlY3Rpb24gcm91dGVzKQorICAgICAgICB7CisgICAgICAgICAgICByb3V0ZXMuSWdub3JlUm91dGUoIntyZXNvdXJjZX0udGhyaWZ0Iik7CisgICAgICAgICAgICByb3V0ZXMuSWdub3JlUm91dGUoIntyZXNvdXJjZX0uYXhkL3sqcGF0aEluZm99Iik7CisKKyAgICAgICAgICAgIHJvdXRlcy5NYXBSb3V0ZSgKKyAgICAgICAgICAgICAgICBuYW1lOiAiRGVmYXVsdCIsCisgICAgICAgICAgICAgICAgdXJsOiAie2NvbnRyb2xsZXJ9L3thY3Rpb259L3tpZH0iLAorICAgICAgICAgICAgICAgIGRlZmF1bHRzOiBuZXcgeyBjb250cm9sbGVyID0gIkhvbWUiLCBhY3Rpb24gPSAiSW5kZXgiLCBpZCA9IFVybFBhcmFtZXRlci5PcHRpb25hbCB9CisgICAgICAgICAgICApOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvQXN5bmNIdHRwSGFuZGxlci5jcyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L0FzeW5jSHR0cEhhbmRsZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2YyNjE4NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L0FzeW5jSHR0cEhhbmRsZXIuY3MKQEAgLTAsMCArMSwzMiBAQAor77u/LyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydDsKKworbmFtZXNwYWNlIFRocmlmdE1WQ1Rlc3QKK3sKKyAgICBwdWJsaWMgY2xhc3MgQXN5bmNIdHRwSGFuZGxlciA6IFRIdHRwVGFza0FzeW5jSGFuZGxlcgorICAgIHsKKyAgICAgICAgcHVibGljIEFzeW5jSHR0cEhhbmRsZXIoKQorICAgICAgICAgICAgOiBiYXNlKAorICAgICAgICAgICAgICAgIG5ldyBUaHJpZnQuVGVzdC5TZWNvbmRTZXJ2aWNlLkFzeW5jUHJvY2Vzc29yKG5ldyBTZWNvbmRTZXJ2aWNlSW1wbCgpKSkKKyAgICAgICAgeworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L0NvbnRyb2xsZXJzL0hvbWVDb250cm9sbGVyLmNzIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvQ29udHJvbGxlcnMvSG9tZUNvbnRyb2xsZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzlhMWVjNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L0NvbnRyb2xsZXJzL0hvbWVDb250cm9sbGVyLmNzCkBAIC0wLDAgKzEsNzAgQEAKK++7vy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBTeXN0ZW0uV2ViLk12YzsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbDsKK3VzaW5nIFRocmlmdC5UZXN0OwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydDsKKworbmFtZXNwYWNlIFRocmlmdE1WQ1Rlc3QuQ29udHJvbGxlcnMKK3sKKyAgICBwdWJsaWMgY2xhc3MgSG9tZUNvbnRyb2xsZXIgOiBDb250cm9sbGVyCisgICAgeworICAgICAgICBwdWJsaWMgQWN0aW9uUmVzdWx0IEluZGV4KCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFZpZXcoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrPEFjdGlvblJlc3VsdD4gVGVzdFRocmlmdEFzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGJhc2VVcmkgPSBuZXcgVXJpKHN0cmluZy5Gb3JtYXQoInswfTovL3sxfXsyfSIsIFJlcXVlc3QuVXJsLlNjaGVtZSwgUmVxdWVzdC5VcmwuQXV0aG9yaXR5LAorICAgICAgICAgICAgICAgIFVybC5Db250ZW50KCJ+IikpKTsKKworICAgICAgICAgICAgU2Vjb25kU2VydmljZS5JQXN5bmMgYXN5bmNTZXJ2aWNlID0KKyAgICAgICAgICAgICAgICBuZXcgU2Vjb25kU2VydmljZS5DbGllbnQobmV3IFRCaW5hcnlQcm90b2NvbChuZXcgVEh0dHBDbGllbnQobmV3IFVyaShiYXNlVXJpLCAiQXN5bmMudGhyaWZ0IikpKSk7CisKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBhd2FpdCBhc3luY1NlcnZpY2Uuc2Vjb25kdGVzdFN0cmluZ0FzeW5jKCJUZXN0U3RyaW5nIik7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9ICJ0ZXN0U3RyaW5nKFwiVGVzdFN0cmluZ1wiKSIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiVGhlIHdyb25nIHJlc3VsdCB3YXMgcmV0dXJuZWQiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIFJlZGlyZWN0VG9BY3Rpb24oIkluZGV4Iik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQWN0aW9uUmVzdWx0IFRlc3RUaHJpZnRTeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGJhc2VVcmkgPSBuZXcgVXJpKHN0cmluZy5Gb3JtYXQoInswfTovL3sxfXsyfSIsIFJlcXVlc3QuVXJsLlNjaGVtZSwgUmVxdWVzdC5VcmwuQXV0aG9yaXR5LAorICAgICAgICAgICAgICAgIFVybC5Db250ZW50KCJ+IikpKTsKKworICAgICAgICAgICAgU2Vjb25kU2VydmljZS5JU3luYyBzZXJ2aWNlID0KKyAgICAgICAgICAgICAgICBuZXcgU2Vjb25kU2VydmljZS5DbGllbnQobmV3IFRCaW5hcnlQcm90b2NvbChuZXcgVEh0dHBDbGllbnQobmV3IFVyaShiYXNlVXJpLCAiU3luYy50aHJpZnQiKSkpKTsKKworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHNlcnZpY2Uuc2Vjb25kdGVzdFN0cmluZygiVGVzdFN0cmluZyIpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSAidGVzdFN0cmluZyhcIlRlc3RTdHJpbmdcIikiKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlRoZSB3cm9uZyByZXN1bHQgd2FzIHJldHVybmVkIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBSZWRpcmVjdFRvQWN0aW9uKCJJbmRleCIpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvR2xvYmFsLmFzYXggYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9HbG9iYWwuYXNheApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmI2ODhjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvR2xvYmFsLmFzYXgKQEAgLTAsMCArMSwxOSBAQAor77u/PCVAIEFwcGxpY2F0aW9uIENvZGViZWhpbmQ9Ikdsb2JhbC5hc2F4LmNzIiBJbmhlcml0cz0iVGhyaWZ0TVZDVGVzdC5NdmNBcHBsaWNhdGlvbiIgTGFuZ3VhZ2U9IkMjIiAlPgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvR2xvYmFsLmFzYXguY3MgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9HbG9iYWwuYXNheC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTczMWVmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvR2xvYmFsLmFzYXguY3MKQEAgLTAsMCArMSwzNCBAQAor77u/LyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordXNpbmcgU3lzdGVtLldlYi5NdmM7Cit1c2luZyBTeXN0ZW0uV2ViLlJvdXRpbmc7CisKK25hbWVzcGFjZSBUaHJpZnRNVkNUZXN0Cit7CisgICAgcHVibGljIGNsYXNzIE12Y0FwcGxpY2F0aW9uIDogU3lzdGVtLldlYi5IdHRwQXBwbGljYXRpb24KKyAgICB7CisgICAgICAgIHByb3RlY3RlZCB2b2lkIEFwcGxpY2F0aW9uX1N0YXJ0KCkKKyAgICAgICAgeworICAgICAgICAgICAgQXJlYVJlZ2lzdHJhdGlvbi5SZWdpc3RlckFsbEFyZWFzKCk7CisgICAgICAgICAgICBGaWx0ZXJDb25maWcuUmVnaXN0ZXJHbG9iYWxGaWx0ZXJzKEdsb2JhbEZpbHRlcnMuRmlsdGVycyk7CisgICAgICAgICAgICBSb3V0ZUNvbmZpZy5SZWdpc3RlclJvdXRlcyhSb3V0ZVRhYmxlLlJvdXRlcyk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmZTg4OTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpAQCAtMCwwICsxLDUzIEBACivvu78vKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit1c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsKKworLy8gR2VuZXJhbCBJbmZvcm1hdGlvbiBhYm91dCBhbiBhc3NlbWJseSBpcyBjb250cm9sbGVkIHRocm91Z2ggdGhlIGZvbGxvd2luZworLy8gc2V0IG9mIGF0dHJpYnV0ZXMuIENoYW5nZSB0aGVzZSBhdHRyaWJ1dGUgdmFsdWVzIHRvIG1vZGlmeSB0aGUgaW5mb3JtYXRpb24KKy8vIGFzc29jaWF0ZWQgd2l0aCBhbiBhc3NlbWJseS4KK1thc3NlbWJseTogQXNzZW1ibHlUaXRsZSgiVGhyaWZ0TVZDVGVzdCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseURlc2NyaXB0aW9uKCJBIHdlYiBwcm9qZWN0IGZvciB0ZXN0aW5nIHRoZSB0aHJpZnQgQVNQLk5FVCBmZWF0dXJlcy4iKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb25maWd1cmF0aW9uKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb21wYW55KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlQcm9kdWN0KCJUaHJpZnQiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb3B5cmlnaHQoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVRyYWRlbWFyaygiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q3VsdHVyZSgiIildCisKKy8vIFNldHRpbmcgQ29tVmlzaWJsZSB0byBmYWxzZSBtYWtlcyB0aGUgdHlwZXMgaW4gdGhpcyBhc3NlbWJseSBub3QgdmlzaWJsZQorLy8gdG8gQ09NIGNvbXBvbmVudHMuICBJZiB5b3UgbmVlZCB0byBhY2Nlc3MgYSB0eXBlIGluIHRoaXMgYXNzZW1ibHkgZnJvbQorLy8gQ09NLCBzZXQgdGhlIENvbVZpc2libGUgYXR0cmlidXRlIHRvIHRydWUgb24gdGhhdCB0eXBlLgorW2Fzc2VtYmx5OiBDb21WaXNpYmxlKGZhbHNlKV0KKworLy8gVGhlIGZvbGxvd2luZyBHVUlEIGlzIGZvciB0aGUgSUQgb2YgdGhlIHR5cGVsaWIgaWYgdGhpcyBwcm9qZWN0IGlzIGV4cG9zZWQgdG8gQ09NCitbYXNzZW1ibHk6IEd1aWQoIjM2NmY5YmQwLTNjMGUtNDhhYS1iMmNhLTYxZmQ0YTkzZTQyNyIpXQorCisvLyBWZXJzaW9uIGluZm9ybWF0aW9uIGZvciBhbiBhc3NlbWJseSBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nIGZvdXIgdmFsdWVzOgorLy8KKy8vICAgICAgTWFqb3IgVmVyc2lvbgorLy8gICAgICBNaW5vciBWZXJzaW9uCisvLyAgICAgIEJ1aWxkIE51bWJlcgorLy8gICAgICBSZXZpc2lvbgorLy8KKy8vIFlvdSBjYW4gc3BlY2lmeSBhbGwgdGhlIHZhbHVlcyBvciB5b3UgY2FuIGRlZmF1bHQgdGhlIEJ1aWxkIGFuZCBSZXZpc2lvbiBOdW1iZXJzCisvLyBieSB1c2luZyB0aGUgJyonIGFzIHNob3duIGJlbG93OgorW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjEuMC4wLjAiKV0KK1thc3NlbWJseTogQXNzZW1ibHlGaWxlVmVyc2lvbigiMS4wLjAuMCIpXQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvU2Vjb25kU2VydmljZUltcGwuY3MgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9TZWNvbmRTZXJ2aWNlSW1wbC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWQzMDFhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvU2Vjb25kU2VydmljZUltcGwuY3MKQEAgLTAsMCArMSwzNyBAQAor77u/LyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKK3VzaW5nIFRocmlmdC5UZXN0OworCituYW1lc3BhY2UgVGhyaWZ0TVZDVGVzdAoreworICAgIHB1YmxpYyBjbGFzcyBTZWNvbmRTZXJ2aWNlSW1wbCA6IFNlY29uZFNlcnZpY2UuSUFzeW5jLCBTZWNvbmRTZXJ2aWNlLklTeW5jCisgICAgeworICAgICAgICBwdWJsaWMgVGFzazxzdHJpbmc+IHNlY29uZHRlc3RTdHJpbmdBc3luYyhzdHJpbmcgdGhpbmcpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQodGhpbmcpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0cmluZyBzZWNvbmR0ZXN0U3RyaW5nKHN0cmluZyB0aGluZykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuICJ0ZXN0U3RyaW5nKFwiIiArIHRoaW5nICsgIlwiKSI7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9TeW5jSHR0cEhhbmRsZXIuY3MgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9TeW5jSHR0cEhhbmRsZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZlMjY2MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1N5bmNIdHRwSGFuZGxlci5jcwpAQCAtMCwwICsxLDMyIEBACivvu78vKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit1c2luZyBUaHJpZnQuVHJhbnNwb3J0OworCituYW1lc3BhY2UgVGhyaWZ0TVZDVGVzdAoreworICAgIHB1YmxpYyBjbGFzcyBTeW5jSHR0cEhhbmRsZXIgOiBUSHR0cEhhbmRsZXIKKyAgICB7CisgICAgICAgIHB1YmxpYyBTeW5jSHR0cEhhbmRsZXIoKQorICAgICAgICAgICAgOiBiYXNlKAorICAgICAgICAgICAgICAgIG5ldyBUaHJpZnQuVGVzdC5TZWNvbmRTZXJ2aWNlLlByb2Nlc3NvcihuZXcgU2Vjb25kU2VydmljZUltcGwoKSkpCisgICAgICAgIHsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9UaHJpZnRNVkNUZXN0LmNzcHJvaiBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1RocmlmdE1WQ1Rlc3QuY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlYjk2OWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9UaHJpZnRNVkNUZXN0LmNzcHJvagpAQCAtMCwwICsxLDIwMCBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iMTIuMCIgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRFeHRlbnNpb25zUGF0aClcJChNU0J1aWxkVG9vbHNWZXJzaW9uKVxNaWNyb3NvZnQuQ29tbW9uLnByb3BzIiBDb25kaXRpb249IkV4aXN0cygnJChNU0J1aWxkRXh0ZW5zaW9uc1BhdGgpXCQoTVNCdWlsZFRvb2xzVmVyc2lvbilcTWljcm9zb2Z0LkNvbW1vbi5wcm9wcycpIiAvPgorICA8UHJvcGVydHlHcm91cD4KKyAgICA8Q29uZmlndXJhdGlvbiBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKScgPT0gJycgIj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4KKyAgICA8UGxhdGZvcm0gQ29uZGl0aW9uPSIgJyQoUGxhdGZvcm0pJyA9PSAnJyAiPkFueUNQVTwvUGxhdGZvcm0+CisgICAgPFByb2R1Y3RWZXJzaW9uPgorICAgIDwvUHJvZHVjdFZlcnNpb24+CisgICAgPFNjaGVtYVZlcnNpb24+Mi4wPC9TY2hlbWFWZXJzaW9uPgorICAgIDxQcm9qZWN0R3VpZD57ODkxQjQ0ODctQzdCQS00MjdFLUJCQzgtNEM1OTZDMjI5QTEwfTwvUHJvamVjdEd1aWQ+CisgICAgPFByb2plY3RUeXBlR3VpZHM+ezM0OWM1ODUxLTY1ZGYtMTFkYS05Mzg0LTAwMDY1Yjg0NmYyMX07e2ZhZTA0ZWMwLTMwMWYtMTFkMy1iZjRiLTAwYzA0Zjc5ZWZiY308L1Byb2plY3RUeXBlR3VpZHM+CisgICAgPE91dHB1dFR5cGU+TGlicmFyeTwvT3V0cHV0VHlwZT4KKyAgICA8QXBwRGVzaWduZXJGb2xkZXI+UHJvcGVydGllczwvQXBwRGVzaWduZXJGb2xkZXI+CisgICAgPFJvb3ROYW1lc3BhY2U+VGhyaWZ0TVZDVGVzdDwvUm9vdE5hbWVzcGFjZT4KKyAgICA8QXNzZW1ibHlOYW1lPlRocmlmdE1WQ1Rlc3Q8L0Fzc2VtYmx5TmFtZT4KKyAgICA8VGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj52NC41PC9UYXJnZXRGcmFtZXdvcmtWZXJzaW9uPgorICAgIDxNdmNCdWlsZFZpZXdzPmZhbHNlPC9NdmNCdWlsZFZpZXdzPgorICAgIDxVc2VJSVNFeHByZXNzPnRydWU8L1VzZUlJU0V4cHJlc3M+CisgICAgPElJU0V4cHJlc3NTU0xQb3J0IC8+CisgICAgPElJU0V4cHJlc3NBbm9ueW1vdXNBdXRoZW50aWNhdGlvbiAvPgorICAgIDxJSVNFeHByZXNzV2luZG93c0F1dGhlbnRpY2F0aW9uIC8+CisgICAgPElJU0V4cHJlc3NVc2VDbGFzc2ljUGlwZWxpbmVNb2RlIC8+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdEZWJ1Z3xBbnlDUFUnICI+CisgICAgPERlYnVnU3ltYm9scz50cnVlPC9EZWJ1Z1N5bWJvbHM+CisgICAgPERlYnVnVHlwZT5mdWxsPC9EZWJ1Z1R5cGU+CisgICAgPE9wdGltaXplPmZhbHNlPC9PcHRpbWl6ZT4KKyAgICA8T3V0cHV0UGF0aD5iaW5cPC9PdXRwdXRQYXRoPgorICAgIDxEZWZpbmVDb25zdGFudHM+REVCVUc7VFJBQ0U8L0RlZmluZUNvbnN0YW50cz4KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ1JlbGVhc2V8QW55Q1BVJyAiPgorICAgIDxEZWJ1Z1R5cGU+cGRib25seTwvRGVidWdUeXBlPgorICAgIDxPcHRpbWl6ZT50cnVlPC9PcHRpbWl6ZT4KKyAgICA8T3V0cHV0UGF0aD5iaW5cPC9PdXRwdXRQYXRoPgorICAgIDxEZWZpbmVDb25zdGFudHM+VFJBQ0U8L0RlZmluZUNvbnN0YW50cz4KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iTWljcm9zb2Z0LkNTaGFycCIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbSIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5EYXRhIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkRyYXdpbmciIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uV2ViLkR5bmFtaWNEYXRhIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLldlYi5FbnRpdHkiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uV2ViLkFwcGxpY2F0aW9uU2VydmljZXMiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uQ29tcG9uZW50TW9kZWwuRGF0YUFubm90YXRpb25zIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkNvcmUiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uRGF0YS5EYXRhU2V0RXh0ZW5zaW9ucyIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5YbWwuTGlucSIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5XZWIiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uV2ViLkV4dGVuc2lvbnMiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uV2ViLkFic3RyYWN0aW9ucyIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5XZWIuUm91dGluZyIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5YbWwiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uQ29uZmlndXJhdGlvbiIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5XZWIuU2VydmljZXMiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uRW50ZXJwcmlzZVNlcnZpY2VzIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iTWljcm9zb2Z0LldlYi5JbmZyYXN0cnVjdHVyZSwgVmVyc2lvbj0xLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxYmYzODU2YWQzNjRlMzUsIHByb2Nlc3NvckFyY2hpdGVjdHVyZT1NU0lMIj4KKyAgICAgIDxQcml2YXRlPlRydWU8L1ByaXZhdGU+CisgICAgICA8SGludFBhdGg+Li5ccGFja2FnZXNcTWljcm9zb2Z0LldlYi5JbmZyYXN0cnVjdHVyZS4xLjAuMC4wXGxpYlxuZXQ0MFxNaWNyb3NvZnQuV2ViLkluZnJhc3RydWN0dXJlLmRsbDwvSGludFBhdGg+CisgICAgPC9SZWZlcmVuY2U+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uTmV0Lkh0dHAiPgorICAgIDwvUmVmZXJlbmNlPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLk5ldC5IdHRwLldlYlJlcXVlc3QiPgorICAgIDwvUmVmZXJlbmNlPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLldlYi5IZWxwZXJzLCBWZXJzaW9uPTMuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MzFiZjM4NTZhZDM2NGUzNSwgcHJvY2Vzc29yQXJjaGl0ZWN0dXJlPU1TSUwiPgorICAgICAgPFByaXZhdGU+VHJ1ZTwvUHJpdmF0ZT4KKyAgICAgIDxIaW50UGF0aD4uLlxwYWNrYWdlc1xNaWNyb3NvZnQuQXNwTmV0LldlYlBhZ2VzLjMuMi4zXGxpYlxuZXQ0NVxTeXN0ZW0uV2ViLkhlbHBlcnMuZGxsPC9IaW50UGF0aD4KKyAgICA8L1JlZmVyZW5jZT4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5XZWIuTXZjLCBWZXJzaW9uPTUuMi4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MzFiZjM4NTZhZDM2NGUzNSwgcHJvY2Vzc29yQXJjaGl0ZWN0dXJlPU1TSUwiPgorICAgICAgPFByaXZhdGU+VHJ1ZTwvUHJpdmF0ZT4KKyAgICAgIDxIaW50UGF0aD4uLlxwYWNrYWdlc1xNaWNyb3NvZnQuQXNwTmV0Lk12Yy41LjIuM1xsaWJcbmV0NDVcU3lzdGVtLldlYi5NdmMuZGxsPC9IaW50UGF0aD4KKyAgICA8L1JlZmVyZW5jZT4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5XZWIuUmF6b3IsIFZlcnNpb249My4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMWJmMzg1NmFkMzY0ZTM1LCBwcm9jZXNzb3JBcmNoaXRlY3R1cmU9TVNJTCI+CisgICAgICA8UHJpdmF0ZT5UcnVlPC9Qcml2YXRlPgorICAgICAgPEhpbnRQYXRoPi4uXHBhY2thZ2VzXE1pY3Jvc29mdC5Bc3BOZXQuUmF6b3IuMy4yLjNcbGliXG5ldDQ1XFN5c3RlbS5XZWIuUmF6b3IuZGxsPC9IaW50UGF0aD4KKyAgICA8L1JlZmVyZW5jZT4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5XZWIuV2ViUGFnZXMsIFZlcnNpb249My4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMWJmMzg1NmFkMzY0ZTM1LCBwcm9jZXNzb3JBcmNoaXRlY3R1cmU9TVNJTCI+CisgICAgICA8UHJpdmF0ZT5UcnVlPC9Qcml2YXRlPgorICAgICAgPEhpbnRQYXRoPi4uXHBhY2thZ2VzXE1pY3Jvc29mdC5Bc3BOZXQuV2ViUGFnZXMuMy4yLjNcbGliXG5ldDQ1XFN5c3RlbS5XZWIuV2ViUGFnZXMuZGxsPC9IaW50UGF0aD4KKyAgICA8L1JlZmVyZW5jZT4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5XZWIuV2ViUGFnZXMuRGVwbG95bWVudCwgVmVyc2lvbj0zLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxYmYzODU2YWQzNjRlMzUsIHByb2Nlc3NvckFyY2hpdGVjdHVyZT1NU0lMIj4KKyAgICAgIDxQcml2YXRlPlRydWU8L1ByaXZhdGU+CisgICAgICA8SGludFBhdGg+Li5ccGFja2FnZXNcTWljcm9zb2Z0LkFzcE5ldC5XZWJQYWdlcy4zLjIuM1xsaWJcbmV0NDVcU3lzdGVtLldlYi5XZWJQYWdlcy5EZXBsb3ltZW50LmRsbDwvSGludFBhdGg+CisgICAgPC9SZWZlcmVuY2U+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uV2ViLldlYlBhZ2VzLlJhem9yLCBWZXJzaW9uPTMuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MzFiZjM4NTZhZDM2NGUzNSwgcHJvY2Vzc29yQXJjaGl0ZWN0dXJlPU1TSUwiPgorICAgICAgPFByaXZhdGU+VHJ1ZTwvUHJpdmF0ZT4KKyAgICAgIDxIaW50UGF0aD4uLlxwYWNrYWdlc1xNaWNyb3NvZnQuQXNwTmV0LldlYlBhZ2VzLjMuMi4zXGxpYlxuZXQ0NVxTeXN0ZW0uV2ViLldlYlBhZ2VzLlJhem9yLmRsbDwvSGludFBhdGg+CisgICAgPC9SZWZlcmVuY2U+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJUaHJpZnRJbXBsIj4KKyAgICAgIDxIaW50UGF0aD4uXFRocmlmdEltcGwuZGxsPC9IaW50UGF0aD4KKyAgICA8L1JlZmVyZW5jZT4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQXBwX1N0YXJ0XEZpbHRlckNvbmZpZy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBcHBfU3RhcnRcUm91dGVDb25maWcuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iU3luY0h0dHBIYW5kbGVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkFzeW5jSHR0cEhhbmRsZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29udHJvbGxlcnNcSG9tZUNvbnRyb2xsZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iR2xvYmFsLmFzYXguY3MiPgorICAgICAgPERlcGVuZGVudFVwb24+R2xvYmFsLmFzYXg8L0RlcGVuZGVudFVwb24+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3BlcnRpZXNcQXNzZW1ibHlJbmZvLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlNlY29uZFNlcnZpY2VJbXBsLmNzIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Q29udGVudCBJbmNsdWRlPSJmYXZpY29uLmljbyIgLz4KKyAgICA8Q29udGVudCBJbmNsdWRlPSJHbG9iYWwuYXNheCIgLz4KKyAgICA8Q29udGVudCBJbmNsdWRlPSJXZWIuY29uZmlnIiAvPgorICAgIDxDb250ZW50IEluY2x1ZGU9IldlYi5EZWJ1Zy5jb25maWciPgorICAgICAgPERlcGVuZGVudFVwb24+V2ViLmNvbmZpZzwvRGVwZW5kZW50VXBvbj4KKyAgICA8L0NvbnRlbnQ+CisgICAgPENvbnRlbnQgSW5jbHVkZT0iV2ViLlJlbGVhc2UuY29uZmlnIj4KKyAgICAgIDxEZXBlbmRlbnRVcG9uPldlYi5jb25maWc8L0RlcGVuZGVudFVwb24+CisgICAgPC9Db250ZW50PgorICAgIDxDb250ZW50IEluY2x1ZGU9IlZpZXdzXFdlYi5jb25maWciIC8+CisgICAgPENvbnRlbnQgSW5jbHVkZT0iVmlld3NcX1ZpZXdTdGFydC5jc2h0bWwiIC8+CisgICAgPENvbnRlbnQgSW5jbHVkZT0iVmlld3NcU2hhcmVkXF9MYXlvdXQuY3NodG1sIiAvPgorICAgIDxDb250ZW50IEluY2x1ZGU9IlZpZXdzXEhvbWVcSW5kZXguY3NodG1sIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Rm9sZGVyIEluY2x1ZGU9IkFwcF9EYXRhXCIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPENvbnRlbnQgSW5jbHVkZT0icGFja2FnZXMuY29uZmlnIj4KKyAgICAgIDxTdWJUeXBlPkRlc2lnbmVyPC9TdWJUeXBlPgorICAgIDwvQ29udGVudD4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cc3JjXFRocmlmdC40NS5jc3Byb2oiPgorICAgICAgPFByb2plY3Q+e2ViY2UzNWRhLWNmNmEtNDJiYy1hMzU3LWE5YzA5YjUzNDI5OX08L1Byb2plY3Q+CisgICAgICA8TmFtZT5UaHJpZnQuNDU8L05hbWU+CisgICAgPC9Qcm9qZWN0UmVmZXJlbmNlPgorICA8L0l0ZW1Hcm91cD4KKyAgPFByb3BlcnR5R3JvdXA+CisgICAgPFZpc3VhbFN0dWRpb1ZlcnNpb24gQ29uZGl0aW9uPSInJChWaXN1YWxTdHVkaW9WZXJzaW9uKScgPT0gJyciPjEwLjA8L1Zpc3VhbFN0dWRpb1ZlcnNpb24+CisgICAgPFZTVG9vbHNQYXRoIENvbmRpdGlvbj0iJyQoVlNUb29sc1BhdGgpJyA9PSAnJyI+JChNU0J1aWxkRXh0ZW5zaW9uc1BhdGgzMilcTWljcm9zb2Z0XFZpc3VhbFN0dWRpb1x2JChWaXN1YWxTdHVkaW9WZXJzaW9uKTwvVlNUb29sc1BhdGg+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRCaW5QYXRoKVxNaWNyb3NvZnQuQ1NoYXJwLnRhcmdldHMiIC8+CisgIDxJbXBvcnQgUHJvamVjdD0iJChWU1Rvb2xzUGF0aClcV2ViQXBwbGljYXRpb25zXE1pY3Jvc29mdC5XZWJBcHBsaWNhdGlvbi50YXJnZXRzIiBDb25kaXRpb249IickKFZTVG9vbHNQYXRoKScgIT0gJyciIC8+CisgIDxJbXBvcnQgUHJvamVjdD0iJChNU0J1aWxkRXh0ZW5zaW9uc1BhdGgzMilcTWljcm9zb2Z0XFZpc3VhbFN0dWRpb1x2MTAuMFxXZWJBcHBsaWNhdGlvbnNcTWljcm9zb2Z0LldlYkFwcGxpY2F0aW9uLnRhcmdldHMiIENvbmRpdGlvbj0iZmFsc2UiIC8+CisgIDxUYXJnZXQgTmFtZT0iTXZjQnVpbGRWaWV3cyIgQWZ0ZXJUYXJnZXRzPSJBZnRlckJ1aWxkIiBDb25kaXRpb249IickKE12Y0J1aWxkVmlld3MpJz09J3RydWUnIj4KKyAgICA8QXNwTmV0Q29tcGlsZXIgVmlydHVhbFBhdGg9InRlbXAiIFBoeXNpY2FsUGF0aD0iJChXZWJQcm9qZWN0T3V0cHV0RGlyKSIgLz4KKyAgPC9UYXJnZXQ+CisgIDxQcm9qZWN0RXh0ZW5zaW9ucz4KKyAgICA8VmlzdWFsU3R1ZGlvPgorICAgICAgPEZsYXZvclByb3BlcnRpZXMgR1VJRD0iezM0OWM1ODUxLTY1ZGYtMTFkYS05Mzg0LTAwMDY1Yjg0NmYyMX0iPgorICAgICAgICA8V2ViUHJvamVjdFByb3BlcnRpZXM+CisgICAgICAgICAgPFVzZUlJUz5UcnVlPC9Vc2VJSVM+CisgICAgICAgICAgPEF1dG9Bc3NpZ25Qb3J0PlRydWU8L0F1dG9Bc3NpZ25Qb3J0PgorICAgICAgICAgIDxEZXZlbG9wbWVudFNlcnZlclBvcnQ+NTc0ODI8L0RldmVsb3BtZW50U2VydmVyUG9ydD4KKyAgICAgICAgICA8RGV2ZWxvcG1lbnRTZXJ2ZXJWUGF0aD4vPC9EZXZlbG9wbWVudFNlcnZlclZQYXRoPgorICAgICAgICAgIDxJSVNVcmw+aHR0cDovL2xvY2FsaG9zdDo1NzQ4Mi88L0lJU1VybD4KKyAgICAgICAgICA8TlRMTUF1dGhlbnRpY2F0aW9uPkZhbHNlPC9OVExNQXV0aGVudGljYXRpb24+CisgICAgICAgICAgPFVzZUN1c3RvbVNlcnZlcj5GYWxzZTwvVXNlQ3VzdG9tU2VydmVyPgorICAgICAgICAgIDxDdXN0b21TZXJ2ZXJVcmw+CisgICAgICAgICAgPC9DdXN0b21TZXJ2ZXJVcmw+CisgICAgICAgICAgPFNhdmVTZXJ2ZXJTZXR0aW5nc0luVXNlckZpbGU+RmFsc2U8L1NhdmVTZXJ2ZXJTZXR0aW5nc0luVXNlckZpbGU+CisgICAgICAgIDwvV2ViUHJvamVjdFByb3BlcnRpZXM+CisgICAgICA8L0ZsYXZvclByb3BlcnRpZXM+CisgICAgPC9WaXN1YWxTdHVkaW8+CisgIDwvUHJvamVjdEV4dGVuc2lvbnM+CisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxQcmVCdWlsZEV2ZW50PnJtZGlyIC9zIC9xICIkKFByb2plY3REaXIpZ2VuLWNzaGFycCIKK2RlbCAvZiAvcSAiJChQcm9qZWN0RGlyKVRocmlmdEltcGwuZGxsIgorU0VUIE9VVFBVVF9ESVI9JChQcm9qZWN0RGlyKQorU0VUIFRIUklGVF9GSUxFPSQoUHJvamVjdERpcilcLi5cLi5cLi5cLi5cdGVzdFxUaHJpZnRUZXN0LnRocmlmdAorZm9yICUyNSUyNUkgaW4gKCIlMjVPVVRQVVRfRElSJTI1IikgZG8gc2V0IFNIT1JUX0RJUj0lMjUlMjV+ZnNJCitmb3IgJTI1JTI1SSBpbiAoIiUyNVRIUklGVF9GSUxFJTI1IikgZG8gc2V0IFRIUklGVF9TSE9SVD0lMjUlMjV+ZnNJCisiJChQcm9qZWN0RGlyKVwuLlwuLlwuLlwuLlxjb21waWxlclxjcHBcRGVidWdcdGhyaWZ0LmV4ZSIgLS1nZW4gY3NoYXJwOmFzeW5jPXRydWUgLW8gJTI1U0hPUlRfRElSJTI1ICUyNVRIUklGVF9TSE9SVCUyNQorIiQoTVNCdWlsZFRvb2xzUGF0aClcQ3NjLmV4ZSIgL3Q6bGlicmFyeSAvb3V0OiIkKFByb2plY3REaXIpVGhyaWZ0SW1wbC5kbGwiIC9yZWN1cnNlOiIkKFByb2plY3REaXIpZ2VuLWNzaGFycCJcKiAvcmVmZXJlbmNlOiIkKFByb2plY3REaXIpLi5cLi5cc3JjXGJpblxEZWJ1Z1xUaHJpZnQ0NS5kbGwiPC9QcmVCdWlsZEV2ZW50PgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDwhLS0gVG8gbW9kaWZ5IHlvdXIgYnVpbGQgcHJvY2VzcywgYWRkIHlvdXIgdGFzayBpbnNpZGUgb25lIG9mIHRoZSB0YXJnZXRzIGJlbG93IGFuZCB1bmNvbW1lbnQgaXQuCisgICAgICAgT3RoZXIgc2ltaWxhciBleHRlbnNpb24gcG9pbnRzIGV4aXN0LCBzZWUgTWljcm9zb2Z0LkNvbW1vbi50YXJnZXRzLgorICA8VGFyZ2V0IE5hbWU9IkJlZm9yZUJ1aWxkIj4KKyAgPC9UYXJnZXQ+CisgIDxUYXJnZXQgTmFtZT0iQWZ0ZXJCdWlsZCI+CisgIDwvVGFyZ2V0PiAtLT4KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9WaWV3cy9Ib21lL0luZGV4LmNzaHRtbCBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1ZpZXdzL0hvbWUvSW5kZXguY3NodG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwY2E3ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9WaWV3cy9Ib21lL0luZGV4LmNzaHRtbApAQCAtMCwwICsxLDI1IEBACivvu79AKgorICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAgICB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICAgIHVuZGVyIHRoZSBMaWNlbnNlLgorKkAKKworQHsKKyAgICBWaWV3QmFnLlRpdGxlID0gIkhvbWUgUGFnZSI7Cit9CisKKzxwPkBIdG1sLkFjdGlvbkxpbmsoIlRlc3QgVGhyaWZ0IEFzeW5jIFNlcnZpY2UiLCAiVGVzdFRocmlmdEFzeW5jIik8L3A+Cis8cD5ASHRtbC5BY3Rpb25MaW5rKCJUZXN0IFRocmlmdCBTeW5jIFNlcnZpY2UiLCAiVGVzdFRocmlmdFN5bmMiKTwvcD4KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1ZpZXdzL1NoYXJlZC9fTGF5b3V0LmNzaHRtbCBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1ZpZXdzL1NoYXJlZC9fTGF5b3V0LmNzaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDFjOTlhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvVmlld3MvU2hhcmVkL19MYXlvdXQuY3NodG1sCkBAIC0wLDAgKzEsMzAgQEAKK++7v0AqCisgICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICAgIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgICAgdW5kZXIgdGhlIExpY2Vuc2UuCisqQAorCis8IURPQ1RZUEUgaHRtbD4KKzxodG1sPgorPGhlYWQ+CisgICAgPG1ldGEgY2hhcnNldD0idXRmLTgiIC8+CisgICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xLjAiPgorICAgIDx0aXRsZT5UaHJpZnQgQVNQLk5FVCBUZXN0PC90aXRsZT4KKzwvaGVhZD4KKzxib2R5PgorICAgIEBSZW5kZXJCb2R5KCkKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1ZpZXdzL1dlYi5jb25maWcgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9WaWV3cy9XZWIuY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMjExMzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9WaWV3cy9XZWIuY29uZmlnCkBAIC0wLDAgKzEsNjAgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGNvbmZpZ3VyYXRpb24+CisgIDxjb25maWdTZWN0aW9ucz4KKyAgICA8c2VjdGlvbkdyb3VwIG5hbWU9InN5c3RlbS53ZWIud2ViUGFnZXMucmF6b3IiIHR5cGU9IlN5c3RlbS5XZWIuV2ViUGFnZXMuUmF6b3IuQ29uZmlndXJhdGlvbi5SYXpvcldlYlNlY3Rpb25Hcm91cCwgU3lzdGVtLldlYi5XZWJQYWdlcy5SYXpvciwgVmVyc2lvbj0zLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxQkYzODU2QUQzNjRFMzUiPgorICAgICAgPHNlY3Rpb24gbmFtZT0iaG9zdCIgdHlwZT0iU3lzdGVtLldlYi5XZWJQYWdlcy5SYXpvci5Db25maWd1cmF0aW9uLkhvc3RTZWN0aW9uLCBTeXN0ZW0uV2ViLldlYlBhZ2VzLlJhem9yLCBWZXJzaW9uPTMuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MzFCRjM4NTZBRDM2NEUzNSIgcmVxdWlyZVBlcm1pc3Npb249ImZhbHNlIiAvPgorICAgICAgPHNlY3Rpb24gbmFtZT0icGFnZXMiIHR5cGU9IlN5c3RlbS5XZWIuV2ViUGFnZXMuUmF6b3IuQ29uZmlndXJhdGlvbi5SYXpvclBhZ2VzU2VjdGlvbiwgU3lzdGVtLldlYi5XZWJQYWdlcy5SYXpvciwgVmVyc2lvbj0zLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxQkYzODU2QUQzNjRFMzUiIHJlcXVpcmVQZXJtaXNzaW9uPSJmYWxzZSIgLz4KKyAgICA8L3NlY3Rpb25Hcm91cD4KKyAgPC9jb25maWdTZWN0aW9ucz4KKworICA8c3lzdGVtLndlYi53ZWJQYWdlcy5yYXpvcj4KKyAgICA8aG9zdCBmYWN0b3J5VHlwZT0iU3lzdGVtLldlYi5NdmMuTXZjV2ViUmF6b3JIb3N0RmFjdG9yeSwgU3lzdGVtLldlYi5NdmMsIFZlcnNpb249NS4yLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMUJGMzg1NkFEMzY0RTM1IiAvPgorICAgIDxwYWdlcyBwYWdlQmFzZVR5cGU9IlN5c3RlbS5XZWIuTXZjLldlYlZpZXdQYWdlIj4KKyAgICAgIDxuYW1lc3BhY2VzPgorICAgICAgICA8YWRkIG5hbWVzcGFjZT0iU3lzdGVtLldlYi5NdmMiIC8+CisgICAgICAgIDxhZGQgbmFtZXNwYWNlPSJTeXN0ZW0uV2ViLk12Yy5BamF4IiAvPgorICAgICAgICA8YWRkIG5hbWVzcGFjZT0iU3lzdGVtLldlYi5NdmMuSHRtbCIgLz4KKyAgICAgICAgPGFkZCBuYW1lc3BhY2U9IlN5c3RlbS5XZWIuT3B0aW1pemF0aW9uIi8+CisgICAgICAgIDxhZGQgbmFtZXNwYWNlPSJTeXN0ZW0uV2ViLlJvdXRpbmciIC8+CisgICAgICAgIDxhZGQgbmFtZXNwYWNlPSJUaHJpZnRNVkNUZXN0IiAvPgorICAgICAgPC9uYW1lc3BhY2VzPgorICAgIDwvcGFnZXM+CisgIDwvc3lzdGVtLndlYi53ZWJQYWdlcy5yYXpvcj4KKworICA8YXBwU2V0dGluZ3M+CisgICAgPGFkZCBrZXk9IndlYnBhZ2VzOkVuYWJsZWQiIHZhbHVlPSJmYWxzZSIgLz4KKyAgPC9hcHBTZXR0aW5ncz4KKworICA8c3lzdGVtLndlYlNlcnZlcj4KKyAgICA8aGFuZGxlcnM+CisgICAgICA8cmVtb3ZlIG5hbWU9IkJsb2NrVmlld0hhbmRsZXIiLz4KKyAgICAgIDxhZGQgbmFtZT0iQmxvY2tWaWV3SGFuZGxlciIgcGF0aD0iKiIgdmVyYj0iKiIgcHJlQ29uZGl0aW9uPSJpbnRlZ3JhdGVkTW9kZSIgdHlwZT0iU3lzdGVtLldlYi5IdHRwTm90Rm91bmRIYW5kbGVyIiAvPgorICAgIDwvaGFuZGxlcnM+CisgIDwvc3lzdGVtLndlYlNlcnZlcj4KKworICA8c3lzdGVtLndlYj4KKyAgICA8Y29tcGlsYXRpb24+CisgICAgICA8YXNzZW1ibGllcz4KKyAgICAgICAgPGFkZCBhc3NlbWJseT0iU3lzdGVtLldlYi5NdmMsIFZlcnNpb249NS4yLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMUJGMzg1NkFEMzY0RTM1IiAvPgorICAgICAgPC9hc3NlbWJsaWVzPgorICAgIDwvY29tcGlsYXRpb24+CisgIDwvc3lzdGVtLndlYj4KKzwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1ZpZXdzL19WaWV3U3RhcnQuY3NodG1sIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvVmlld3MvX1ZpZXdTdGFydC5jc2h0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNkZTJlZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1ZpZXdzL19WaWV3U3RhcnQuY3NodG1sCkBAIC0wLDAgKzEsMjIgQEAKK++7v0AqCisgICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICAgIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgICAgdW5kZXIgdGhlIExpY2Vuc2UuCisqQAorCitAeworICAgIExheW91dCA9ICJ+L1ZpZXdzL1NoYXJlZC9fTGF5b3V0LmNzaHRtbCI7Cit9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9XZWIuRGVidWcuY29uZmlnIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvV2ViLkRlYnVnLmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWQ1NmQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvV2ViLkRlYnVnLmNvbmZpZwpAQCAtMCwwICsxLDQ1IEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjb25maWd1cmF0aW9uIHhtbG5zOnhkdD0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9YTUwtRG9jdW1lbnQtVHJhbnNmb3JtIj4KKyAgPCEtLQorICAgIEluIHRoZSBleGFtcGxlIGJlbG93LCB0aGUgIlNldEF0dHJpYnV0ZXMiIHRyYW5zZm9ybSB3aWxsIGNoYW5nZSB0aGUgdmFsdWUgb2YKKyAgICAiY29ubmVjdGlvblN0cmluZyIgdG8gdXNlICJSZWxlYXNlU1FMU2VydmVyIiBvbmx5IHdoZW4gdGhlICJNYXRjaCIgbG9jYXRvcgorICAgIGZpbmRzIGFuIGF0dHJpYnV0ZSAibmFtZSIgdGhhdCBoYXMgYSB2YWx1ZSBvZiAiTXlEQiIuCisKKyAgICA8Y29ubmVjdGlvblN0cmluZ3M+CisgICAgICA8YWRkIG5hbWU9Ik15REIiCisgICAgICAgIGNvbm5lY3Rpb25TdHJpbmc9IkRhdGEgU291cmNlPVJlbGVhc2VTUUxTZXJ2ZXI7SW5pdGlhbCBDYXRhbG9nPU15UmVsZWFzZURCO0ludGVncmF0ZWQgU2VjdXJpdHk9VHJ1ZSIKKyAgICAgICAgeGR0OlRyYW5zZm9ybT0iU2V0QXR0cmlidXRlcyIgeGR0OkxvY2F0b3I9Ik1hdGNoKG5hbWUpIi8+CisgICAgPC9jb25uZWN0aW9uU3RyaW5ncz4KKyAgLS0+CisgIDxzeXN0ZW0ud2ViPgorICAgIDwhLS0KKyAgICAgIEluIHRoZSBleGFtcGxlIGJlbG93LCB0aGUgIlJlcGxhY2UiIHRyYW5zZm9ybSB3aWxsIHJlcGxhY2UgdGhlIGVudGlyZQorICAgICAgPGN1c3RvbUVycm9ycz4gc2VjdGlvbiBvZiB5b3VyIFdlYi5jb25maWcgZmlsZS4KKyAgICAgIE5vdGUgdGhhdCBiZWNhdXNlIHRoZXJlIGlzIG9ubHkgb25lIGN1c3RvbUVycm9ycyBzZWN0aW9uIHVuZGVyIHRoZQorICAgICAgPHN5c3RlbS53ZWI+IG5vZGUsIHRoZXJlIGlzIG5vIG5lZWQgdG8gdXNlIHRoZSAieGR0OkxvY2F0b3IiIGF0dHJpYnV0ZS4KKworICAgICAgPGN1c3RvbUVycm9ycyBkZWZhdWx0UmVkaXJlY3Q9IkdlbmVyaWNFcnJvci5odG0iCisgICAgICAgIG1vZGU9IlJlbW90ZU9ubHkiIHhkdDpUcmFuc2Zvcm09IlJlcGxhY2UiPgorICAgICAgICA8ZXJyb3Igc3RhdHVzQ29kZT0iNTAwIiByZWRpcmVjdD0iSW50ZXJuYWxFcnJvci5odG0iLz4KKyAgICAgIDwvY3VzdG9tRXJyb3JzPgorICAgIC0tPgorICA8L3N5c3RlbS53ZWI+Cis8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9XZWIuUmVsZWFzZS5jb25maWcgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9XZWIuUmVsZWFzZS5jb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU3YzM0MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1dlYi5SZWxlYXNlLmNvbmZpZwpAQCAtMCwwICsxLDQ2IEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjb25maWd1cmF0aW9uIHhtbG5zOnhkdD0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9YTUwtRG9jdW1lbnQtVHJhbnNmb3JtIj4KKyAgPCEtLQorICAgIEluIHRoZSBleGFtcGxlIGJlbG93LCB0aGUgIlNldEF0dHJpYnV0ZXMiIHRyYW5zZm9ybSB3aWxsIGNoYW5nZSB0aGUgdmFsdWUgb2YKKyAgICAiY29ubmVjdGlvblN0cmluZyIgdG8gdXNlICJSZWxlYXNlU1FMU2VydmVyIiBvbmx5IHdoZW4gdGhlICJNYXRjaCIgbG9jYXRvcgorICAgIGZpbmRzIGFuIGF0dHJpYnV0ZSAibmFtZSIgdGhhdCBoYXMgYSB2YWx1ZSBvZiAiTXlEQiIuCisKKyAgICA8Y29ubmVjdGlvblN0cmluZ3M+CisgICAgICA8YWRkIG5hbWU9Ik15REIiCisgICAgICAgIGNvbm5lY3Rpb25TdHJpbmc9IkRhdGEgU291cmNlPVJlbGVhc2VTUUxTZXJ2ZXI7SW5pdGlhbCBDYXRhbG9nPU15UmVsZWFzZURCO0ludGVncmF0ZWQgU2VjdXJpdHk9VHJ1ZSIKKyAgICAgICAgeGR0OlRyYW5zZm9ybT0iU2V0QXR0cmlidXRlcyIgeGR0OkxvY2F0b3I9Ik1hdGNoKG5hbWUpIi8+CisgICAgPC9jb25uZWN0aW9uU3RyaW5ncz4KKyAgLS0+CisgIDxzeXN0ZW0ud2ViPgorICAgIDxjb21waWxhdGlvbiB4ZHQ6VHJhbnNmb3JtPSJSZW1vdmVBdHRyaWJ1dGVzKGRlYnVnKSIgLz4KKyAgICA8IS0tCisgICAgICBJbiB0aGUgZXhhbXBsZSBiZWxvdywgdGhlICJSZXBsYWNlIiB0cmFuc2Zvcm0gd2lsbCByZXBsYWNlIHRoZSBlbnRpcmUKKyAgICAgIDxjdXN0b21FcnJvcnM+IHNlY3Rpb24gb2YgeW91ciBXZWIuY29uZmlnIGZpbGUuCisgICAgICBOb3RlIHRoYXQgYmVjYXVzZSB0aGVyZSBpcyBvbmx5IG9uZSBjdXN0b21FcnJvcnMgc2VjdGlvbiB1bmRlciB0aGUKKyAgICAgIDxzeXN0ZW0ud2ViPiBub2RlLCB0aGVyZSBpcyBubyBuZWVkIHRvIHVzZSB0aGUgInhkdDpMb2NhdG9yIiBhdHRyaWJ1dGUuCisKKyAgICAgIDxjdXN0b21FcnJvcnMgZGVmYXVsdFJlZGlyZWN0PSJHZW5lcmljRXJyb3IuaHRtIgorICAgICAgICBtb2RlPSJSZW1vdGVPbmx5IiB4ZHQ6VHJhbnNmb3JtPSJSZXBsYWNlIj4KKyAgICAgICAgPGVycm9yIHN0YXR1c0NvZGU9IjUwMCIgcmVkaXJlY3Q9IkludGVybmFsRXJyb3IuaHRtIi8+CisgICAgICA8L2N1c3RvbUVycm9ycz4KKyAgICAtLT4KKyAgPC9zeXN0ZW0ud2ViPgorPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvV2ViLmNvbmZpZyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1dlYi5jb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM1N2QxMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1dlYi5jb25maWcKQEAgLTAsMCArMSw5MiBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKworPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8IS0tCisgIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb25maWd1cmUgeW91ciBBU1AuTkVUIGFwcGxpY2F0aW9uLCBwbGVhc2UgdmlzaXQKKyAgaHR0cDovL2dvLm1pY3Jvc29mdC5jb20vZndsaW5rLz9MaW5rSWQ9MzAxODgwCisgIC0tPgorPGNvbmZpZ3VyYXRpb24+CisgIDxhcHBTZXR0aW5ncz4KKyAgICA8YWRkIGtleT0id2VicGFnZXM6VmVyc2lvbiIgdmFsdWU9IjMuMC4wLjAiIC8+CisgICAgPGFkZCBrZXk9IndlYnBhZ2VzOkVuYWJsZWQiIHZhbHVlPSJmYWxzZSIgLz4KKyAgICA8YWRkIGtleT0iQ2xpZW50VmFsaWRhdGlvbkVuYWJsZWQiIHZhbHVlPSJ0cnVlIiAvPgorICAgIDxhZGQga2V5PSJVbm9idHJ1c2l2ZUphdmFTY3JpcHRFbmFibGVkIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICA8YWRkIGtleT0ib3dpbjpBdXRvbWF0aWNBcHBTdGFydHVwIiB2YWx1ZT0iZmFsc2UiIC8+CisgIDwvYXBwU2V0dGluZ3M+CisgIDxzeXN0ZW0ud2ViPgorICAgIDxhdXRoZW50aWNhdGlvbiBtb2RlPSJOb25lIiAvPgorICAgIDxjb21waWxhdGlvbiBkZWJ1Zz0idHJ1ZSIgdGFyZ2V0RnJhbWV3b3JrPSI0LjUiIC8+CisgICAgPGh0dHBSdW50aW1lIHRhcmdldEZyYW1ld29yaz0iNC41IiAvPgorICA8L3N5c3RlbS53ZWI+CisgIDxzeXN0ZW0ud2ViU2VydmVyPgorICAgIDxtb2R1bGVzPgorICAgICAgPHJlbW92ZSBuYW1lPSJGb3Jtc0F1dGhlbnRpY2F0aW9uIiAvPgorICAgIDwvbW9kdWxlcz4KKyAgICA8aGFuZGxlcnM+CisgICAgICA8YWRkIG5hbWU9IkFzeW5jSHR0cEhhbmRsZXIiIHZlcmI9IioiIHBhdGg9IkFzeW5jLnRocmlmdCIgdHlwZT0iVGhyaWZ0TVZDVGVzdC5Bc3luY0h0dHBIYW5kbGVyLCBUaHJpZnRNVkNUZXN0IiAvPgorICAgICAgPGFkZCBuYW1lPSJTeW5jSHR0cEhhbmRsZXIiIHZlcmI9IioiIHBhdGg9IlN5bmMudGhyaWZ0IiB0eXBlPSJUaHJpZnRNVkNUZXN0LlN5bmNIdHRwSGFuZGxlciwgVGhyaWZ0TVZDVGVzdCIgLz4KKyAgICA8L2hhbmRsZXJzPgorICA8L3N5c3RlbS53ZWJTZXJ2ZXI+CisgIDxydW50aW1lPgorICAgIDxhc3NlbWJseUJpbmRpbmcgeG1sbnM9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206YXNtLnYxIj4KKyAgICAgIDxkZXBlbmRlbnRBc3NlbWJseT4KKyAgICAgICAgPGFzc2VtYmx5SWRlbnRpdHkgbmFtZT0iTWljcm9zb2Z0Lk93aW4uU2VjdXJpdHkiIHB1YmxpY0tleVRva2VuPSIzMWJmMzg1NmFkMzY0ZTM1IiAvPgorICAgICAgICA8YmluZGluZ1JlZGlyZWN0IG9sZFZlcnNpb249IjAuMC4wLjAtMy4wLjEuMCIgbmV3VmVyc2lvbj0iMy4wLjEuMCIgLz4KKyAgICAgIDwvZGVwZW5kZW50QXNzZW1ibHk+CisgICAgICA8ZGVwZW5kZW50QXNzZW1ibHk+CisgICAgICAgIDxhc3NlbWJseUlkZW50aXR5IG5hbWU9Ik1pY3Jvc29mdC5Pd2luLlNlY3VyaXR5Lk9BdXRoIiBwdWJsaWNLZXlUb2tlbj0iMzFiZjM4NTZhZDM2NGUzNSIgLz4KKyAgICAgICAgPGJpbmRpbmdSZWRpcmVjdCBvbGRWZXJzaW9uPSIwLjAuMC4wLTMuMC4xLjAiIG5ld1ZlcnNpb249IjMuMC4xLjAiIC8+CisgICAgICA8L2RlcGVuZGVudEFzc2VtYmx5PgorICAgICAgPGRlcGVuZGVudEFzc2VtYmx5PgorICAgICAgICA8YXNzZW1ibHlJZGVudGl0eSBuYW1lPSJNaWNyb3NvZnQuT3dpbi5TZWN1cml0eS5Db29raWVzIiBwdWJsaWNLZXlUb2tlbj0iMzFiZjM4NTZhZDM2NGUzNSIgLz4KKyAgICAgICAgPGJpbmRpbmdSZWRpcmVjdCBvbGRWZXJzaW9uPSIwLjAuMC4wLTMuMC4xLjAiIG5ld1ZlcnNpb249IjMuMC4xLjAiIC8+CisgICAgICA8L2RlcGVuZGVudEFzc2VtYmx5PgorICAgICAgPGRlcGVuZGVudEFzc2VtYmx5PgorICAgICAgICA8YXNzZW1ibHlJZGVudGl0eSBuYW1lPSJNaWNyb3NvZnQuT3dpbiIgcHVibGljS2V5VG9rZW49IjMxYmYzODU2YWQzNjRlMzUiIC8+CisgICAgICAgIDxiaW5kaW5nUmVkaXJlY3Qgb2xkVmVyc2lvbj0iMC4wLjAuMC0zLjAuMS4wIiBuZXdWZXJzaW9uPSIzLjAuMS4wIiAvPgorICAgICAgPC9kZXBlbmRlbnRBc3NlbWJseT4KKyAgICAgIDxkZXBlbmRlbnRBc3NlbWJseT4KKyAgICAgICAgPGFzc2VtYmx5SWRlbnRpdHkgbmFtZT0iTmV3dG9uc29mdC5Kc29uIiBjdWx0dXJlPSJuZXV0cmFsIiBwdWJsaWNLZXlUb2tlbj0iMzBhZDRmZTZiMmE2YWVlZCIgLz4KKyAgICAgICAgPGJpbmRpbmdSZWRpcmVjdCBvbGRWZXJzaW9uPSIwLjAuMC4wLTYuMC4wLjAiIG5ld1ZlcnNpb249IjYuMC4wLjAiIC8+CisgICAgICA8L2RlcGVuZGVudEFzc2VtYmx5PgorICAgICAgPGRlcGVuZGVudEFzc2VtYmx5PgorICAgICAgICA8YXNzZW1ibHlJZGVudGl0eSBuYW1lPSJTeXN0ZW0uV2ViLk9wdGltaXphdGlvbiIgcHVibGljS2V5VG9rZW49IjMxYmYzODU2YWQzNjRlMzUiIC8+CisgICAgICAgIDxiaW5kaW5nUmVkaXJlY3Qgb2xkVmVyc2lvbj0iMS4wLjAuMC0xLjEuMC4wIiBuZXdWZXJzaW9uPSIxLjEuMC4wIiAvPgorICAgICAgPC9kZXBlbmRlbnRBc3NlbWJseT4KKyAgICAgIDxkZXBlbmRlbnRBc3NlbWJseT4KKyAgICAgICAgPGFzc2VtYmx5SWRlbnRpdHkgbmFtZT0iV2ViR3JlYXNlIiBwdWJsaWNLZXlUb2tlbj0iMzFiZjM4NTZhZDM2NGUzNSIgLz4KKyAgICAgICAgPGJpbmRpbmdSZWRpcmVjdCBvbGRWZXJzaW9uPSIwLjAuMC4wLTEuNS4yLjE0MjM0IiBuZXdWZXJzaW9uPSIxLjUuMi4xNDIzNCIgLz4KKyAgICAgIDwvZGVwZW5kZW50QXNzZW1ibHk+CisgICAgICA8ZGVwZW5kZW50QXNzZW1ibHk+CisgICAgICAgIDxhc3NlbWJseUlkZW50aXR5IG5hbWU9IlN5c3RlbS5XZWIuSGVscGVycyIgcHVibGljS2V5VG9rZW49IjMxYmYzODU2YWQzNjRlMzUiIC8+CisgICAgICAgIDxiaW5kaW5nUmVkaXJlY3Qgb2xkVmVyc2lvbj0iMS4wLjAuMC0zLjAuMC4wIiBuZXdWZXJzaW9uPSIzLjAuMC4wIiAvPgorICAgICAgPC9kZXBlbmRlbnRBc3NlbWJseT4KKyAgICAgIDxkZXBlbmRlbnRBc3NlbWJseT4KKyAgICAgICAgPGFzc2VtYmx5SWRlbnRpdHkgbmFtZT0iU3lzdGVtLldlYi5NdmMiIHB1YmxpY0tleVRva2VuPSIzMWJmMzg1NmFkMzY0ZTM1IiAvPgorICAgICAgICA8YmluZGluZ1JlZGlyZWN0IG9sZFZlcnNpb249IjEuMC4wLjAtNS4yLjMuMCIgbmV3VmVyc2lvbj0iNS4yLjMuMCIgLz4KKyAgICAgIDwvZGVwZW5kZW50QXNzZW1ibHk+CisgICAgICA8ZGVwZW5kZW50QXNzZW1ibHk+CisgICAgICAgIDxhc3NlbWJseUlkZW50aXR5IG5hbWU9IlN5c3RlbS5XZWIuV2ViUGFnZXMiIHB1YmxpY0tleVRva2VuPSIzMWJmMzg1NmFkMzY0ZTM1IiAvPgorICAgICAgICA8YmluZGluZ1JlZGlyZWN0IG9sZFZlcnNpb249IjEuMC4wLjAtMy4wLjAuMCIgbmV3VmVyc2lvbj0iMy4wLjAuMCIgLz4KKyAgICAgIDwvZGVwZW5kZW50QXNzZW1ibHk+CisgICAgPC9hc3NlbWJseUJpbmRpbmc+CisgIDwvcnVudGltZT4KKzwvY29uZmlndXJhdGlvbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9mYXZpY29uLmljbyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L2Zhdmljb24uaWNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzYTc5OTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9mYXZpY29uLmljbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9wYWNrYWdlcy5jb25maWcgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9wYWNrYWdlcy5jb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThjODQxNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L3BhY2thZ2VzLmNvbmZpZwpAQCAtMCwwICsxLDI1IEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHBhY2thZ2VzPgorICA8cGFja2FnZSBpZD0iTWljcm9zb2Z0LkFzcE5ldC5NdmMiIHZlcnNpb249IjUuMi4zIiB0YXJnZXRGcmFtZXdvcms9Im5ldDQ1IiAvPgorICA8cGFja2FnZSBpZD0iTWljcm9zb2Z0LkFzcE5ldC5SYXpvciIgdmVyc2lvbj0iMy4yLjMiIHRhcmdldEZyYW1ld29yaz0ibmV0NDUiIC8+CisgIDxwYWNrYWdlIGlkPSJNaWNyb3NvZnQuQXNwTmV0LldlYlBhZ2VzIiB2ZXJzaW9uPSIzLjIuMyIgdGFyZ2V0RnJhbWV3b3JrPSJuZXQ0NSIgLz4KKyAgPHBhY2thZ2UgaWQ9Ik1pY3Jvc29mdC5XZWIuSW5mcmFzdHJ1Y3R1cmUiIHZlcnNpb249IjEuMC4wLjAiIHRhcmdldEZyYW1ld29yaz0ibmV0NDUiIC8+Cis8L3BhY2thZ2VzPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRUZXN0L1Byb2dyYW0uY3MgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0VGVzdC9Qcm9ncmFtLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmY2Nzk2Li4wMDAwMDAwCi0tLSBhL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRUZXN0L1Byb2dyYW0uY3MKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZQotLy8KLS8vIFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFIG9yIHZpc2l0IHRoZSBUaHJpZnQgc2l0ZSBhdDoKLS8vIGh0dHA6Ly9kZXZlbG9wZXJzLmZhY2Vib29rLmNvbS90aHJpZnQvCi0KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFRocmlmdC5UcmFuc3BvcnQ7Ci11c2luZyBUaHJpZnQuUHJvdG9jb2w7Ci11c2luZyBUaHJpZnQuVGVzdDsgLy9nZW5lcmF0ZWQgY29kZQotCi1uYW1lc3BhY2UgVGVzdAotewotICAgIGNsYXNzIFByb2dyYW0KLSAgICB7Ci0gICAgICAgIHN0YXRpYyB2b2lkIE1haW4oc3RyaW5nW10gYXJncykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGFyZ3MuTGVuZ3RoID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIm11c3QgcHJvdmlkZSAnc2VydmVyJyBvciAnY2xpZW50JyBhcmciKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHN0cmluZ1tdIHN1YkFyZ3MgPSBuZXcgc3RyaW5nW2FyZ3MuTGVuZ3RoIC0gMV07Ci0gICAgICAgICAgICBmb3IoaW50IGkgPSAxOyBpIDwgYXJncy5MZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdWJBcmdzW2ktMV0gPSBhcmdzW2ldOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGFyZ3NbMF0gPT0gImNsaWVudCIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVGVzdENsaWVudC5FeGVjdXRlKHN1YkFyZ3MpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1swXSA9PSAic2VydmVyIikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBUZXN0U2VydmVyLkV4ZWN1dGUoc3ViQXJncyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoImZpcnN0IGFyZ3VtZW50IG11c3QgYmUgJ3NlcnZlcicgb3IgJ2NsaWVudCciKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRUZXN0L1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdFRlc3QvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNTdlNDEuLjAwMDAwMDAKLS0tIGEvbGliL2NzaGFycC90ZXN0L1RocmlmdFRlc3QvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXVzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwotdXNpbmcgU3lzdGVtLlJ1bnRpbWUuQ29tcGlsZXJTZXJ2aWNlczsKLXVzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsKLQotLy8gR2VuZXJhbCBJbmZvcm1hdGlvbiBhYm91dCBhbiBhc3NlbWJseSBpcyBjb250cm9sbGVkIHRocm91Z2ggdGhlIGZvbGxvd2luZwotLy8gc2V0IG9mIGF0dHJpYnV0ZXMuIENoYW5nZSB0aGVzZSBhdHRyaWJ1dGUgdmFsdWVzIHRvIG1vZGlmeSB0aGUgaW5mb3JtYXRpb24KLS8vIGFzc29jaWF0ZWQgd2l0aCBhbiBhc3NlbWJseS4KLVthc3NlbWJseTogQXNzZW1ibHlUaXRsZSgiVGhyaWZ0VGVzdCIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseURlc2NyaXB0aW9uKCIiKV0KLVthc3NlbWJseTogQXNzZW1ibHlDb25maWd1cmF0aW9uKCIiKV0KLVthc3NlbWJseTogQXNzZW1ibHlDb21wYW55KCIiKV0KLVthc3NlbWJseTogQXNzZW1ibHlQcm9kdWN0KCJUaHJpZnRUZXN0IildCi1bYXNzZW1ibHk6IEFzc2VtYmx5Q29weXJpZ2h0KCJDb3B5cmlnaHQgwqkgMjAwOSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KLVthc3NlbWJseTogQXNzZW1ibHlUcmFkZW1hcmsoIiIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseUN1bHR1cmUoIiIpXQotCi0vLyBTZXR0aW5nIENvbVZpc2libGUgdG8gZmFsc2UgbWFrZXMgdGhlIHR5cGVzIGluIHRoaXMgYXNzZW1ibHkgbm90IHZpc2libGUKLS8vIHRvIENPTSBjb21wb25lbnRzLiAgSWYgeW91IG5lZWQgdG8gYWNjZXNzIGEgdHlwZSBpbiB0aGlzIGFzc2VtYmx5IGZyb20KLS8vIENPTSwgc2V0IHRoZSBDb21WaXNpYmxlIGF0dHJpYnV0ZSB0byB0cnVlIG9uIHRoYXQgdHlwZS4KLVthc3NlbWJseTogQ29tVmlzaWJsZShmYWxzZSldCi0KLS8vIFRoZSBmb2xsb3dpbmcgR1VJRCBpcyBmb3IgdGhlIElEIG9mIHRoZSB0eXBlbGliIGlmIHRoaXMgcHJvamVjdCBpcyBleHBvc2VkIHRvIENPTQotW2Fzc2VtYmx5OiBHdWlkKCJmNDFiMTkzYi1mMWFiLTQ4ZWUtODg0My1mODhlNDMwODRlMjYiKV0KLQotLy8gVmVyc2lvbiBpbmZvcm1hdGlvbiBmb3IgYW4gYXNzZW1ibHkgY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZyBmb3VyIHZhbHVlczoKLS8vCi0vLyAgICAgIE1ham9yIFZlcnNpb24KLS8vICAgICAgTWlub3IgVmVyc2lvbgotLy8gICAgICBCdWlsZCBOdW1iZXIKLS8vICAgICAgUmV2aXNpb24KLS8vCi0vLyBZb3UgY2FuIHNwZWNpZnkgYWxsIHRoZSB2YWx1ZXMgb3IgeW91IGNhbiBkZWZhdWx0IHRoZSBCdWlsZCBhbmQgUmV2aXNpb24gTnVtYmVycwotLy8gYnkgdXNpbmcgdGhlICcqJyBhcyBzaG93biBiZWxvdzoKLS8vIFthc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIxLjAuKiIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjAuOS4yLjAiKV0KLVthc3NlbWJseTogQXNzZW1ibHlGaWxlVmVyc2lvbigiMC45LjIuMCIpXQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC90ZXN0L1RocmlmdFRlc3QvVGVzdENsaWVudC5jcyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRUZXN0L1Rlc3RDbGllbnQuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiMzM0NzMuLjAwMDAwMDAKLS0tIGEvbGliL2NzaGFycC90ZXN0L1RocmlmdFRlc3QvVGVzdENsaWVudC5jcworKysgL2Rldi9udWxsCkBAIC0xLDQ3OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLlRocmVhZGluZzsKLXVzaW5nIFRocmlmdC5Db2xsZWN0aW9uczsKLXVzaW5nIFRocmlmdC5Qcm90b2NvbDsKLXVzaW5nIFRocmlmdC5UcmFuc3BvcnQ7Ci11c2luZyBUaHJpZnQuVGVzdDsKLQotbmFtZXNwYWNlIFRlc3QKLXsKLSAgICBwdWJsaWMgY2xhc3MgVGVzdENsaWVudAotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgaW50IG51bUl0ZXJhdGlvbnMgPSAxOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBzdHJpbmcgcHJvdG9jb2wgPSAiIjsKLQotICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgRXhlY3V0ZShzdHJpbmdbXSBhcmdzKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdHJpbmcgaG9zdCA9ICJsb2NhbGhvc3QiOwotICAgICAgICAgICAgICAgIGludCBwb3J0ID0gOTA5MDsKLSAgICAgICAgICAgICAgICBzdHJpbmcgdXJsID0gbnVsbCwgcGlwZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgaW50IG51bVRocmVhZHMgPSAxOwotICAgICAgICAgICAgICAgIGJvb2wgYnVmZmVyZWQgPSBmYWxzZSwgZnJhbWVkID0gZmFsc2UsIGVuY3J5cHRlZCA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MuTGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmdzW2ldID09ICItdSIpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsID0gYXJnc1srK2ldOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLW4iKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bUl0ZXJhdGlvbnMgPSBDb252ZXJ0LlRvSW50MzIoYXJnc1srK2ldKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi1waXBlIikgIC8vIC1waXBlIDxuYW1lPgotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGUgPSBhcmdzWysraV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlVzaW5nIG5hbWVkIHBpcGVzIHRyYW5zcG9ydCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXS5Db250YWlucygiLS1ob3N0PSIpKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3QgPSBhcmdzW2ldLlN1YnN0cmluZyhhcmdzW2ldLkluZGV4T2YoIj0iKSArIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXS5Db250YWlucygiLS1wb3J0PSIpKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQgPSBpbnQuUGFyc2UoYXJnc1tpXS5TdWJzdHJpbmcoYXJnc1tpXS5JbmRleE9mKCI9IikrMSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLWIiIHx8IGFyZ3NbaV0gPT0gIi0tYnVmZmVyZWQiIHx8IGFyZ3NbaV0gPT0gIi0tdHJhbnNwb3J0PWJ1ZmZlcmVkIikKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlVzaW5nIGJ1ZmZlcmVkIHNvY2tldHMiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi1mIiB8fCBhcmdzW2ldID09ICItLWZyYW1lZCIgIHx8IGFyZ3NbaV0gPT0gIi0tdHJhbnNwb3J0PWZyYW1lZCIpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiVXNpbmcgZnJhbWVkIHRyYW5zcG9ydCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLXQiKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bVRocmVhZHMgPSBDb252ZXJ0LlRvSW50MzIoYXJnc1srK2ldKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi0tY29tcGFjdCIgfHwgYXJnc1tpXSA9PSAiLS1wcm90b2NvbD1jb21wYWN0IikKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbCA9ICJjb21wYWN0IjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiVXNpbmcgY29tcGFjdCBwcm90b2NvbCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLS1qc29uIiB8fCBhcmdzW2ldID09ICItLXByb3RvY29sPWpzb24iKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sID0gImpzb24iOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJVc2luZyBKU09OIHByb3RvY29sIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItLXNzbCIpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiVXNpbmcgZW5jcnlwdGVkIHRyYW5zcG9ydCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGUuU3RhY2tUcmFjZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy9pc3N1ZSB0ZXN0cyBvbiBzZXBhcmF0ZSB0aHJlYWRzIHNpbXVsdGFuZW91c2x5Ci0gICAgICAgICAgICAgICAgVGhyZWFkW10gdGhyZWFkcyA9IG5ldyBUaHJlYWRbbnVtVGhyZWFkc107Ci0gICAgICAgICAgICAgICAgRGF0ZVRpbWUgc3RhcnQgPSBEYXRlVGltZS5Ob3c7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgdGVzdCA9IDA7IHRlc3QgPCBudW1UaHJlYWRzOyB0ZXN0KyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQobmV3IFBhcmFtZXRlcml6ZWRUaHJlYWRTdGFydChDbGllbnRUaHJlYWQpKTsKLSAgICAgICAgICAgICAgICAgICAgdGhyZWFkc1t0ZXN0XSA9IHQ7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh1cmwgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW5kcG9pbnQgdHJhbnNwb3J0Ci0gICAgICAgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0IHRyYW5zID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwaXBlICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSBuZXcgVE5hbWVkUGlwZUNsaWVudFRyYW5zcG9ydChwaXBlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW5jcnlwdGVkKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFucyA9IG5ldyBUVExTU29ja2V0KGhvc3QsIHBvcnQsICIuLi8uLi8uLi8uLi8uLi9rZXlzL2NsaWVudC5wZW0iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zID0gbmV3IFRTb2NrZXQoaG9zdCwgcG9ydCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxheWVyZWQgdHJhbnNwb3J0Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnVmZmVyZWQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSBuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KHRyYW5zIGFzIFRTdHJlYW1UcmFuc3BvcnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZyYW1lZCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFucyA9IG5ldyBURnJhbWVkVHJhbnNwb3J0KHRyYW5zKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy9lbnN1cmUgcHJvcGVyIG9wZW4vY2xvc2Ugb2YgdHJhbnNwb3J0Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cmFucy5PcGVuKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cmFucy5DbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgdC5TdGFydCh0cmFucyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBUSHR0cENsaWVudCBodHRwID0gbmV3IFRIdHRwQ2xpZW50KG5ldyBVcmkodXJsKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0LlN0YXJ0KGh0dHApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgdGVzdCA9IDA7IHRlc3QgPCBudW1UaHJlYWRzOyB0ZXN0KyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJlYWRzW3Rlc3RdLkpvaW4oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiVG90YWwgdGltZTogIiArIChEYXRlVGltZS5Ob3cgLSBzdGFydCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBvdXRlckV4KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKG91dGVyRXguTWVzc2FnZSArICIgU1Q6ICIgKyBvdXRlckV4LlN0YWNrVHJhY2UpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgpOwotICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBDbGllbnRUaHJlYWQob2JqZWN0IG9iaikKLSAgICAgICAgewotICAgICAgICAgICAgVFRyYW5zcG9ydCB0cmFuc3BvcnQgPSAoVFRyYW5zcG9ydClvYmo7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUl0ZXJhdGlvbnM7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDbGllbnRUZXN0KHRyYW5zcG9ydCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0cmFuc3BvcnQuQ2xvc2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBDbGllbnRUZXN0KFRUcmFuc3BvcnQgdHJhbnNwb3J0KQotICAgICAgICB7Ci0gICAgICAgICAgICBUUHJvdG9jb2wgcHJvdG87Ci0gICAgICAgICAgICBpZiAocHJvdG9jb2wgPT0gImNvbXBhY3QiKQotICAgICAgICAgICAgICAgIHByb3RvID0gbmV3IFRDb21wYWN0UHJvdG9jb2wodHJhbnNwb3J0KTsKLSAgICAgICAgICAgIGVsc2UgaWYgKHByb3RvY29sID09ICJqc29uIikKLSAgICAgICAgICAgICAgICBwcm90byA9IG5ldyBUSlNPTlByb3RvY29sKHRyYW5zcG9ydCk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcHJvdG8gPSBuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCk7Ci0KLSAgICAgICAgICAgIFRocmlmdFRlc3QuQ2xpZW50IGNsaWVudCA9IG5ldyBUaHJpZnRUZXN0LkNsaWVudChwcm90byk7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoIXRyYW5zcG9ydC5Jc09wZW4pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQuT3BlbigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiQ29ubmVjdCBmYWlsZWQ6ICIgKyB0dHguTWVzc2FnZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBsb25nIHN0YXJ0ID0gRGF0ZVRpbWUuTm93LlRvRmlsZVRpbWUoKTsKLQotICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdFZvaWQoKSIpOwotICAgICAgICAgICAgY2xpZW50LnRlc3RWb2lkKCk7Ci0gICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gdm9pZCIpOwotCi0gICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0U3RyaW5nKFwiVGVzdFwiKSIpOwotICAgICAgICAgICAgc3RyaW5nIHMgPSBjbGllbnQudGVzdFN0cmluZygiVGVzdCIpOwotICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9IFwiIiArIHMgKyAiXCIiKTsKLQotICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEJ5dGUoMSkiKTsKLSAgICAgICAgICAgIHNieXRlIGk4ID0gY2xpZW50LnRlc3RCeXRlKChzYnl0ZSkxKTsKLSAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgaTgpOwotCi0gICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0STMyKC0xKSIpOwotICAgICAgICAgICAgaW50IGkzMiA9IGNsaWVudC50ZXN0STMyKC0xKTsKLSAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgaTMyKTsKLQotICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEk2NCgtMzQzNTk3MzgzNjgpIik7Ci0gICAgICAgICAgICBsb25nIGk2NCA9IGNsaWVudC50ZXN0STY0KC0zNDM1OTczODM2OCk7Ci0gICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gIiArIGk2NCk7Ci0KLSAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3REb3VibGUoNS4zMjUwOTgyMzUpIik7Ci0gICAgICAgICAgICBkb3VibGUgZHViID0gY2xpZW50LnRlc3REb3VibGUoNS4zMjUwOTgyMzUpOwotICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyBkdWIpOwotCi0gICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0U3RydWN0KHtcIlplcm9cIiwgMSwgLTMsIC01fSkiKTsKLSAgICAgICAgICAgIFh0cnVjdCBvID0gbmV3IFh0cnVjdCgpOwotICAgICAgICAgICAgby5TdHJpbmdfdGhpbmcgPSAiWmVybyI7Ci0gICAgICAgICAgICBvLkJ5dGVfdGhpbmcgPSAoc2J5dGUpMTsKLSAgICAgICAgICAgIG8uSTMyX3RoaW5nID0gLTM7Ci0gICAgICAgICAgICBvLkk2NF90aGluZyA9IC01OwotICAgICAgICAgICAgWHRydWN0IGkgPSBjbGllbnQudGVzdFN0cnVjdChvKTsKLSAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSB7XCIiICsgaS5TdHJpbmdfdGhpbmcgKyAiXCIsICIgKyBpLkJ5dGVfdGhpbmcgKyAiLCAiICsgaS5JMzJfdGhpbmcgKyAiLCAiICsgaS5JNjRfdGhpbmcgKyAifSIpOwotCi0gICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0TmVzdCh7MSwge1wiWmVyb1wiLCAxLCAtMywgLTV9LCA1fSkiKTsKLSAgICAgICAgICAgIFh0cnVjdDIgbzIgPSBuZXcgWHRydWN0MigpOwotICAgICAgICAgICAgbzIuQnl0ZV90aGluZyA9IChzYnl0ZSkxOwotICAgICAgICAgICAgbzIuU3RydWN0X3RoaW5nID0gbzsKLSAgICAgICAgICAgIG8yLkkzMl90aGluZyA9IDU7Ci0gICAgICAgICAgICBYdHJ1Y3QyIGkyID0gY2xpZW50LnRlc3ROZXN0KG8yKTsKLSAgICAgICAgICAgIGkgPSBpMi5TdHJ1Y3RfdGhpbmc7Ci0gICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0geyIgKyBpMi5CeXRlX3RoaW5nICsgIiwge1wiIiArIGkuU3RyaW5nX3RoaW5nICsgIlwiLCAiICsgaS5CeXRlX3RoaW5nICsgIiwgIiArIGkuSTMyX3RoaW5nICsgIiwgIiArIGkuSTY0X3RoaW5nICsgIn0sICIgKyBpMi5JMzJfdGhpbmcgKyAifSIpOwotCi0gICAgICAgICAgICBEaWN0aW9uYXJ5PGludCwgaW50PiBtYXBvdXQgPSBuZXcgRGljdGlvbmFyeTxpbnQsIGludD4oKTsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgNTsgaisrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1hcG91dFtqXSA9IGogLSAxMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RNYXAoeyIpOwotICAgICAgICAgICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgICAgICAgICBmb3JlYWNoIChpbnQga2V5IGluIG1hcG91dC5LZXlzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIiwgIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoa2V5ICsgIiA9PiAiICsgbWFwb3V0W2tleV0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgifSkiKTsKLQotICAgICAgICAgICAgRGljdGlvbmFyeTxpbnQsIGludD4gbWFwaW4gPSBjbGllbnQudGVzdE1hcChtYXBvdXQpOwotCi0gICAgICAgICAgICBDb25zb2xlLldyaXRlKCIgPSB7Iik7Ci0gICAgICAgICAgICBmaXJzdCA9IHRydWU7Ci0gICAgICAgICAgICBmb3JlYWNoIChpbnQga2V5IGluIG1hcGluLktleXMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGZpcnN0KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiLCAiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZShrZXkgKyAiID0+ICIgKyBtYXBpbltrZXldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ9Iik7Ci0KLSAgICAgICAgICAgIExpc3Q8aW50PiBsaXN0b3V0ID0gbmV3IExpc3Q8aW50PigpOwotICAgICAgICAgICAgZm9yIChpbnQgaiA9IC0yOyBqIDwgMzsgaisrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxpc3RvdXQuQWRkKGopOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdExpc3QoeyIpOwotICAgICAgICAgICAgZmlyc3QgPSB0cnVlOwotICAgICAgICAgICAgZm9yZWFjaCAoaW50IGogaW4gbGlzdG91dCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCIsICIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKGopOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgifSkiKTsKLQotICAgICAgICAgICAgTGlzdDxpbnQ+IGxpc3RpbiA9IGNsaWVudC50ZXN0TGlzdChsaXN0b3V0KTsKLQotICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiID0geyIpOwotICAgICAgICAgICAgZmlyc3QgPSB0cnVlOwotICAgICAgICAgICAgZm9yZWFjaCAoaW50IGogaW4gbGlzdGluKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIiwgIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoaik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgifSIpOwotCi0gICAgICAgICAgICAvL3NldAotICAgICAgICAgICAgVEhhc2hTZXQ8aW50PiBzZXRvdXQgPSBuZXcgVEhhc2hTZXQ8aW50PigpOwotICAgICAgICAgICAgZm9yIChpbnQgaiA9IC0yOyBqIDwgMzsgaisrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNldG91dC5BZGQoaik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0U2V0KHsiKTsKLSAgICAgICAgICAgIGZpcnN0ID0gdHJ1ZTsKLSAgICAgICAgICAgIGZvcmVhY2ggKGludCBqIGluIHNldG91dCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCIsICIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKGopOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgifSkiKTsKLQotICAgICAgICAgICAgVEhhc2hTZXQ8aW50PiBzZXRpbiA9IGNsaWVudC50ZXN0U2V0KHNldG91dCk7Ci0KLSAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIiA9IHsiKTsKLSAgICAgICAgICAgIGZpcnN0ID0gdHJ1ZTsKLSAgICAgICAgICAgIGZvcmVhY2ggKGludCBqIGluIHNldGluKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIiwgIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoaik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgifSIpOwotCi0KLSAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RFbnVtKE9ORSkiKTsKLSAgICAgICAgICAgIE51bWJlcnogcmV0ID0gY2xpZW50LnRlc3RFbnVtKE51bWJlcnouT05FKTsKLSAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgcmV0KTsKLQotICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEVudW0oVFdPKSIpOwotICAgICAgICAgICAgcmV0ID0gY2xpZW50LnRlc3RFbnVtKE51bWJlcnouVFdPKTsKLSAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgcmV0KTsKLQotICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEVudW0oVEhSRUUpIik7Ci0gICAgICAgICAgICByZXQgPSBjbGllbnQudGVzdEVudW0oTnVtYmVyei5USFJFRSk7Ci0gICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gIiArIHJldCk7Ci0KLSAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RFbnVtKEZJVkUpIik7Ci0gICAgICAgICAgICByZXQgPSBjbGllbnQudGVzdEVudW0oTnVtYmVyei5GSVZFKTsKLSAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgcmV0KTsKLQotICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEVudW0oRUlHSFQpIik7Ci0gICAgICAgICAgICByZXQgPSBjbGllbnQudGVzdEVudW0oTnVtYmVyei5FSUdIVCk7Ci0gICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gIiArIHJldCk7Ci0KLSAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RUeXBlZGVmKDMwOTg1ODIzNTA4MjUyMykiKTsKLSAgICAgICAgICAgIGxvbmcgdWlkID0gY2xpZW50LnRlc3RUeXBlZGVmKDMwOTg1ODIzNTA4MjUyM0wpOwotICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyB1aWQpOwotCi0gICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0TWFwTWFwKDEpIik7Ci0gICAgICAgICAgICBEaWN0aW9uYXJ5PGludCwgRGljdGlvbmFyeTxpbnQsIGludD4+IG1tID0gY2xpZW50LnRlc3RNYXBNYXAoMSk7Ci0gICAgICAgICAgICBDb25zb2xlLldyaXRlKCIgPSB7Iik7Ci0gICAgICAgICAgICBmb3JlYWNoIChpbnQga2V5IGluIG1tLktleXMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZShrZXkgKyAiID0+IHsiKTsKLSAgICAgICAgICAgICAgICBEaWN0aW9uYXJ5PGludCwgaW50PiBtMiA9IG1tW2tleV07Ci0gICAgICAgICAgICAgICAgZm9yZWFjaCAoaW50IGsyIGluIG0yLktleXMpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKGsyICsgIiA9PiAiICsgbTJbazJdICsgIiwgIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIn0sICIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIn0iKTsKLQotICAgICAgICAgICAgSW5zYW5pdHkgaW5zYW5lID0gbmV3IEluc2FuaXR5KCk7Ci0gICAgICAgICAgICBpbnNhbmUuVXNlck1hcCA9IG5ldyBEaWN0aW9uYXJ5PE51bWJlcnosIGxvbmc+KCk7Ci0gICAgICAgICAgICBpbnNhbmUuVXNlck1hcFtOdW1iZXJ6LkZJVkVdID0gNTAwMEw7Ci0gICAgICAgICAgICBYdHJ1Y3QgdHJ1Y2sgPSBuZXcgWHRydWN0KCk7Ci0gICAgICAgICAgICB0cnVjay5TdHJpbmdfdGhpbmcgPSAiVHJ1Y2siOwotICAgICAgICAgICAgdHJ1Y2suQnl0ZV90aGluZyA9IChzYnl0ZSk4OwotICAgICAgICAgICAgdHJ1Y2suSTMyX3RoaW5nID0gODsKLSAgICAgICAgICAgIHRydWNrLkk2NF90aGluZyA9IDg7Ci0gICAgICAgICAgICBpbnNhbmUuWHRydWN0cyA9IG5ldyBMaXN0PFh0cnVjdD4oKTsKLSAgICAgICAgICAgIGluc2FuZS5YdHJ1Y3RzLkFkZCh0cnVjayk7Ci0gICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0SW5zYW5pdHkoKSIpOwotICAgICAgICAgICAgRGljdGlvbmFyeTxsb25nLCBEaWN0aW9uYXJ5PE51bWJlcnosIEluc2FuaXR5Pj4gd2hvYSA9IGNsaWVudC50ZXN0SW5zYW5pdHkoaW5zYW5lKTsKLSAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIiA9IHsiKTsKLSAgICAgICAgICAgIGZvcmVhY2ggKGxvbmcga2V5IGluIHdob2EuS2V5cykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBEaWN0aW9uYXJ5PE51bWJlcnosIEluc2FuaXR5PiB2YWwgPSB3aG9hW2tleV07Ci0gICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZShrZXkgKyAiID0+IHsiKTsKLQotICAgICAgICAgICAgICAgIGZvcmVhY2ggKE51bWJlcnogazIgaW4gdmFsLktleXMpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBJbnNhbml0eSB2MiA9IHZhbFtrMl07Ci0KLSAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZShrMiArICIgPT4geyIpOwotICAgICAgICAgICAgICAgICAgICBEaWN0aW9uYXJ5PE51bWJlcnosIGxvbmc+IHVzZXJNYXAgPSB2Mi5Vc2VyTWFwOwotCi0gICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInsiKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHVzZXJNYXAgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoTnVtYmVyeiBrMyBpbiB1c2VyTWFwLktleXMpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZShrMyArICIgPT4gIiArIHVzZXJNYXBbazNdICsgIiwgIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJudWxsIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgifSwgIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgTGlzdDxYdHJ1Y3Q+IHh0cnVjdHMgPSB2Mi5YdHJ1Y3RzOwotCi0gICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInsiKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHh0cnVjdHMgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoWHRydWN0IHggaW4geHRydWN0cykKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ7XCIiICsgeC5TdHJpbmdfdGhpbmcgKyAiXCIsICIgKyB4LkJ5dGVfdGhpbmcgKyAiLCAiICsgeC5JMzJfdGhpbmcgKyAiLCAiICsgeC5JMzJfdGhpbmcgKyAifSwgIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJudWxsIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgifSIpOwotCi0gICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIn0sICIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ9LCAiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ9Iik7Ci0KLSAgICAgICAgICAgIHNieXRlIGFyZzAgPSAxOwotICAgICAgICAgICAgaW50IGFyZzEgPSAyOwotICAgICAgICAgICAgbG9uZyBhcmcyID0gbG9uZy5NYXhWYWx1ZTsKLSAgICAgICAgICAgIERpY3Rpb25hcnk8c2hvcnQsIHN0cmluZz4gbXVsdGlEaWN0ID0gbmV3IERpY3Rpb25hcnk8c2hvcnQsIHN0cmluZz4oKTsKLSAgICAgICAgICAgIG11bHRpRGljdFsxXSA9ICJvbmUiOwotICAgICAgICAgICAgTnVtYmVyeiBhcmc0ID0gTnVtYmVyei5GSVZFOwotICAgICAgICAgICAgbG9uZyBhcmc1ID0gNTAwMDAwMDsKLSAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIlRlc3QgTXVsdGkoIiArIGFyZzAgKyAiLCIgKyBhcmcxICsgIiwiICsgYXJnMiArICIsIiArIG11bHRpRGljdCArICIsIiArIGFyZzQgKyAiLCIgKyBhcmc1ICsgIikiKTsKLSAgICAgICAgICAgIFh0cnVjdCBtdWx0aVJlc3BvbnNlID0gY2xpZW50LnRlc3RNdWx0aShhcmcwLCBhcmcxLCBhcmcyLCBtdWx0aURpY3QsIGFyZzQsIGFyZzUpOwotICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiID0gWHRydWN0KGJ5dGVfdGhpbmc6IiArIG11bHRpUmVzcG9uc2UuQnl0ZV90aGluZyArICIsU3RyaW5nX3RoaW5nOiIgKyBtdWx0aVJlc3BvbnNlLlN0cmluZ190aGluZwotICAgICAgICAgICAgICAgICAgICAgICAgKyAiLGkzMl90aGluZzoiICsgbXVsdGlSZXNwb25zZS5JMzJfdGhpbmcgKyAiLGk2NF90aGluZzoiICsgbXVsdGlSZXNwb25zZS5JNjRfdGhpbmcgKyAiKVxuIik7Ci0KLSAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJUZXN0IE9uZXdheSgxKSIpOwotICAgICAgICAgICAgY2xpZW50LnRlc3RPbmV3YXkoMSk7Ci0KLSAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIlRlc3QgQ2FsbHRpbWUoKSIpOwotICAgICAgICAgICAgdmFyIHN0YXJ0dCA9IERhdGVUaW1lLlV0Y05vdzsKLSAgICAgICAgICAgIGZvciAoIGludCBrPTA7IGs8MTAwMDsgKytrICkKLSAgICAgICAgICAgICAgICBjbGllbnQudGVzdFZvaWQoKTsKLSAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgKERhdGVUaW1lLlV0Y05vdyAtIHN0YXJ0dCkuVG90YWxTZWNvbmRzLlRvU3RyaW5nKCkgKyAiIG1zIGEgdGVzdFZvaWQoKSBjYWxsIiApOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC90ZXN0L1RocmlmdFRlc3QvVGVzdFNlcnZlci5jcyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRUZXN0L1Rlc3RTZXJ2ZXIuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5NDRlNzIuLjAwMDAwMDAKLS0tIGEvbGliL2NzaGFycC90ZXN0L1RocmlmdFRlc3QvVGVzdFNlcnZlci5jcworKysgL2Rldi9udWxsCkBAIC0xLDQ1MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZQotLy8KLS8vIFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFIG9yIHZpc2l0IHRoZSBUaHJpZnQgc2l0ZSBhdDoKLS8vIGh0dHA6Ly9kZXZlbG9wZXJzLmZhY2Vib29rLmNvbS90aHJpZnQvCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5TZWN1cml0eS5DcnlwdG9ncmFwaHkuWDUwOUNlcnRpZmljYXRlczsKLXVzaW5nIFRocmlmdC5Db2xsZWN0aW9uczsKLXVzaW5nIFRocmlmdC5UZXN0OyAvL2dlbmVyYXRlZCBjb2RlCi11c2luZyBUaHJpZnQuVHJhbnNwb3J0OwotdXNpbmcgVGhyaWZ0LlByb3RvY29sOwotdXNpbmcgVGhyaWZ0LlNlcnZlcjsKLQotbmFtZXNwYWNlIFRlc3QKLXsKLSAgICBwdWJsaWMgY2xhc3MgVGVzdFNlcnZlcgotICAgIHsKLSAgICBwdWJsaWMgY2xhc3MgVHJhZGVTZXJ2ZXJFdmVudEhhbmRsZXIgOiBUU2VydmVyRXZlbnRIYW5kbGVyCi0gICAgewotICAgICAgcHVibGljIGludCBjYWxsQ291bnQgPSAwOwotICAgICAgcHVibGljIHZvaWQgcHJlU2VydmUoKQotICAgICAgewotICAgICAgICBjYWxsQ291bnQrKzsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBPYmplY3QgY3JlYXRlQ29udGV4dChUaHJpZnQuUHJvdG9jb2wuVFByb3RvY29sIGlucHV0LCBUaHJpZnQuUHJvdG9jb2wuVFByb3RvY29sIG91dHB1dCkKLSAgICAgIHsKLSAgICAgICAgY2FsbENvdW50Kys7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgICAgfQotICAgICAgcHVibGljIHZvaWQgZGVsZXRlQ29udGV4dChPYmplY3Qgc2VydmVyQ29udGV4dCwgVGhyaWZ0LlByb3RvY29sLlRQcm90b2NvbCBpbnB1dCwgVGhyaWZ0LlByb3RvY29sLlRQcm90b2NvbCBvdXRwdXQpCi0gICAgICB7Ci0gICAgICAgIGNhbGxDb3VudCsrOwotICAgICAgfQotICAgICAgcHVibGljIHZvaWQgcHJvY2Vzc0NvbnRleHQoT2JqZWN0IHNlcnZlckNvbnRleHQsIFRocmlmdC5UcmFuc3BvcnQuVFRyYW5zcG9ydCB0cmFuc3BvcnQpCi0gICAgICB7Ci0gICAgICAgIGNhbGxDb3VudCsrOwotICAgICAgfQotICAgIH07Ci0KLSAgICAgICAgcHVibGljIGNsYXNzIFRlc3RIYW5kbGVyIDogVGhyaWZ0VGVzdC5JZmFjZQotICAgICAgICB7Ci0gICAgICAgICAgICBwdWJsaWMgVFNlcnZlciBzZXJ2ZXI7Ci0KLSAgICAgICAgICAgIHB1YmxpYyBUZXN0SGFuZGxlcigpIHsgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0Vm9pZCgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInRlc3RWb2lkKCkiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHN0cmluZyB0ZXN0U3RyaW5nKHN0cmluZyB0aGluZykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgidGVzdHN0cmluZyhcIiIgKyB0aGluZyArICJcIikiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdGhpbmc7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBzYnl0ZSB0ZXN0Qnl0ZShzYnl0ZSB0aGluZykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgidGVzdEJ5dGUoIiArIHRoaW5nICsgIikiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdGhpbmc7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBpbnQgdGVzdEkzMihpbnQgdGhpbmcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInRlc3RJMzIoIiArIHRoaW5nICsgIikiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdGhpbmc7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBsb25nIHRlc3RJNjQobG9uZyB0aGluZykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgidGVzdEk2NCgiICsgdGhpbmcgKyAiKSIpOwotICAgICAgICAgICAgICAgIHJldHVybiB0aGluZzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIGRvdWJsZSB0ZXN0RG91YmxlKGRvdWJsZSB0aGluZykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgidGVzdERvdWJsZSgiICsgdGhpbmcgKyAiKSIpOwotICAgICAgICAgICAgICAgIHJldHVybiB0aGluZzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIFh0cnVjdCB0ZXN0U3RydWN0KFh0cnVjdCB0aGluZykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgidGVzdFN0cnVjdCh7IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIiICsgdGhpbmcuU3RyaW5nX3RoaW5nICsgIlwiLCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaW5nLkJ5dGVfdGhpbmcgKyAiLCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaW5nLkkzMl90aGluZyArICIsICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpbmcuSTY0X3RoaW5nICsgIn0pIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRoaW5nOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgWHRydWN0MiB0ZXN0TmVzdChYdHJ1Y3QyIG5lc3QpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgWHRydWN0IHRoaW5nID0gbmVzdC5TdHJ1Y3RfdGhpbmc7Ci0gICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInRlc3ROZXN0KHsiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lc3QuQnl0ZV90aGluZyArICIsIHsiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiIgKyB0aGluZy5TdHJpbmdfdGhpbmcgKyAiXCIsICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpbmcuQnl0ZV90aGluZyArICIsICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpbmcuSTMyX3RoaW5nICsgIiwgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGluZy5JNjRfdGhpbmcgKyAifSwgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXN0LkkzMl90aGluZyArICJ9KSIpOwotICAgICAgICAgICAgICAgIHJldHVybiBuZXN0OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgRGljdGlvbmFyeTxpbnQsIGludD4gdGVzdE1hcChEaWN0aW9uYXJ5PGludCwgaW50PiB0aGluZykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgidGVzdE1hcCh7Iik7Ci0gICAgICAgICAgICAgICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgZm9yZWFjaCAoaW50IGtleSBpbiB0aGluZy5LZXlzKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiwgIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoa2V5ICsgIiA9PiAiICsgdGhpbmdba2V5XSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ9KSIpOwotICAgICAgICAgICAgICAgIHJldHVybiB0aGluZzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIERpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc+IHRlc3RTdHJpbmdNYXAoRGljdGlvbmFyeTxzdHJpbmcsIHN0cmluZz4gdGhpbmcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInRlc3RTdHJpbmdNYXAoeyIpOwotICAgICAgICAgICAgICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgICAgICAgICAgICAgIGZvcmVhY2ggKHN0cmluZyBrZXkgaW4gdGhpbmcuS2V5cykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIsICIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGtleSArICIgPT4gIiArIHRoaW5nW2tleV0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgifSkiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdGhpbmc7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBUSGFzaFNldDxpbnQ+IHRlc3RTZXQoVEhhc2hTZXQ8aW50PiB0aGluZykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgidGVzdFNldCh7Iik7Ci0gICAgICAgICAgICAgICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgZm9yZWFjaCAoaW50IGVsZW0gaW4gdGhpbmcpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiLCAiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShlbGVtKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIn0pIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRoaW5nOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgTGlzdDxpbnQ+IHRlc3RMaXN0KExpc3Q8aW50PiB0aGluZykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgidGVzdExpc3QoeyIpOwotICAgICAgICAgICAgICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgICAgICAgICAgICAgIGZvcmVhY2ggKGludCBlbGVtIGluIHRoaW5nKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiwgIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZWxlbSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ9KSIpOwotICAgICAgICAgICAgICAgIHJldHVybiB0aGluZzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIE51bWJlcnogdGVzdEVudW0oTnVtYmVyeiB0aGluZykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgidGVzdEVudW0oIiArIHRoaW5nICsgIikiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdGhpbmc7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBsb25nIHRlc3RUeXBlZGVmKGxvbmcgdGhpbmcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInRlc3RUeXBlZGVmKCIgKyB0aGluZyArICIpIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRoaW5nOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgRGljdGlvbmFyeTxpbnQsIERpY3Rpb25hcnk8aW50LCBpbnQ+PiB0ZXN0TWFwTWFwKGludCBoZWxsbykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgidGVzdE1hcE1hcCgiICsgaGVsbG8gKyAiKSIpOwotICAgICAgICAgICAgICAgIERpY3Rpb25hcnk8aW50LCBEaWN0aW9uYXJ5PGludCwgaW50Pj4gbWFwbWFwID0KLSAgICAgICAgICAgICAgICAgIG5ldyBEaWN0aW9uYXJ5PGludCwgRGljdGlvbmFyeTxpbnQsIGludD4+KCk7Ci0KLSAgICAgICAgICAgICAgICBEaWN0aW9uYXJ5PGludCwgaW50PiBwb3MgPSBuZXcgRGljdGlvbmFyeTxpbnQsIGludD4oKTsKLSAgICAgICAgICAgICAgICBEaWN0aW9uYXJ5PGludCwgaW50PiBuZWcgPSBuZXcgRGljdGlvbmFyeTxpbnQsIGludD4oKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IDU7IGkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBvc1tpXSA9IGk7Ci0gICAgICAgICAgICAgICAgICAgIG5lZ1staV0gPSAtaTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtYXBtYXBbNF0gPSBwb3M7Ci0gICAgICAgICAgICAgICAgbWFwbWFwWy00XSA9IG5lZzsKLQotICAgICAgICAgICAgICAgIHJldHVybiBtYXBtYXA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBEaWN0aW9uYXJ5PGxvbmcsIERpY3Rpb25hcnk8TnVtYmVyeiwgSW5zYW5pdHk+PiB0ZXN0SW5zYW5pdHkoSW5zYW5pdHkgYXJndW1lbnQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInRlc3RJbnNhbml0eSgpIik7Ci0KLSAgICAgICAgICAgICAgICBYdHJ1Y3QgaGVsbG8gPSBuZXcgWHRydWN0KCk7Ci0gICAgICAgICAgICAgICAgaGVsbG8uU3RyaW5nX3RoaW5nID0gIkhlbGxvMiI7Ci0gICAgICAgICAgICAgICAgaGVsbG8uQnl0ZV90aGluZyA9IDI7Ci0gICAgICAgICAgICAgICAgaGVsbG8uSTMyX3RoaW5nID0gMjsKLSAgICAgICAgICAgICAgICBoZWxsby5JNjRfdGhpbmcgPSAyOwotCi0gICAgICAgICAgICAgICAgWHRydWN0IGdvb2RieWUgPSBuZXcgWHRydWN0KCk7Ci0gICAgICAgICAgICAgICAgZ29vZGJ5ZS5TdHJpbmdfdGhpbmcgPSAiR29vZGJ5ZTQiOwotICAgICAgICAgICAgICAgIGdvb2RieWUuQnl0ZV90aGluZyA9IChzYnl0ZSk0OwotICAgICAgICAgICAgICAgIGdvb2RieWUuSTMyX3RoaW5nID0gNDsKLSAgICAgICAgICAgICAgICBnb29kYnllLkk2NF90aGluZyA9IChsb25nKTQ7Ci0KLSAgICAgICAgICAgICAgICBJbnNhbml0eSBjcmF6eSA9IG5ldyBJbnNhbml0eSgpOwotICAgICAgICAgICAgICAgIGNyYXp5LlVzZXJNYXAgPSBuZXcgRGljdGlvbmFyeTxOdW1iZXJ6LCBsb25nPigpOwotICAgICAgICAgICAgICAgIGNyYXp5LlVzZXJNYXBbTnVtYmVyei5FSUdIVF0gPSAobG9uZyk4OwotICAgICAgICAgICAgICAgIGNyYXp5Llh0cnVjdHMgPSBuZXcgTGlzdDxYdHJ1Y3Q+KCk7Ci0gICAgICAgICAgICAgICAgY3JhenkuWHRydWN0cy5BZGQoZ29vZGJ5ZSk7Ci0KLSAgICAgICAgICAgICAgICBJbnNhbml0eSBsb29uZXkgPSBuZXcgSW5zYW5pdHkoKTsKLSAgICAgICAgICAgICAgICBjcmF6eS5Vc2VyTWFwW051bWJlcnouRklWRV0gPSAobG9uZyk1OwotICAgICAgICAgICAgICAgIGNyYXp5Llh0cnVjdHMuQWRkKGhlbGxvKTsKLQotICAgICAgICAgICAgICAgIERpY3Rpb25hcnk8TnVtYmVyeiwgSW5zYW5pdHk+IGZpcnN0X21hcCA9IG5ldyBEaWN0aW9uYXJ5PE51bWJlcnosIEluc2FuaXR5PigpOwotICAgICAgICAgICAgICAgIERpY3Rpb25hcnk8TnVtYmVyeiwgSW5zYW5pdHk+IHNlY29uZF9tYXAgPSBuZXcgRGljdGlvbmFyeTxOdW1iZXJ6LCBJbnNhbml0eT4oKTsgOwotCi0gICAgICAgICAgICAgICAgZmlyc3RfbWFwW051bWJlcnouVFdPXSA9IGNyYXp5OwotICAgICAgICAgICAgICAgIGZpcnN0X21hcFtOdW1iZXJ6LlRIUkVFXSA9IGNyYXp5OwotCi0gICAgICAgICAgICAgICAgc2Vjb25kX21hcFtOdW1iZXJ6LlNJWF0gPSBsb29uZXk7Ci0KLSAgICAgICAgICAgICAgICBEaWN0aW9uYXJ5PGxvbmcsIERpY3Rpb25hcnk8TnVtYmVyeiwgSW5zYW5pdHk+PiBpbnNhbmUgPQotICAgICAgICAgICAgICAgICAgbmV3IERpY3Rpb25hcnk8bG9uZywgRGljdGlvbmFyeTxOdW1iZXJ6LCBJbnNhbml0eT4+KCk7Ci0gICAgICAgICAgICAgICAgaW5zYW5lWyhsb25nKTFdID0gZmlyc3RfbWFwOwotICAgICAgICAgICAgICAgIGluc2FuZVsobG9uZykyXSA9IHNlY29uZF9tYXA7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gaW5zYW5lOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgWHRydWN0IHRlc3RNdWx0aShzYnl0ZSBhcmcwLCBpbnQgYXJnMSwgbG9uZyBhcmcyLCBEaWN0aW9uYXJ5PHNob3J0LCBzdHJpbmc+IGFyZzMsIE51bWJlcnogYXJnNCwgbG9uZyBhcmc1KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ0ZXN0TXVsdGkoKSIpOwotCi0gICAgICAgICAgICAgICAgWHRydWN0IGhlbGxvID0gbmV3IFh0cnVjdCgpOyA7Ci0gICAgICAgICAgICAgICAgaGVsbG8uU3RyaW5nX3RoaW5nID0gIkhlbGxvMiI7Ci0gICAgICAgICAgICAgICAgaGVsbG8uQnl0ZV90aGluZyA9IGFyZzA7Ci0gICAgICAgICAgICAgICAgaGVsbG8uSTMyX3RoaW5nID0gYXJnMTsKLSAgICAgICAgICAgICAgICBoZWxsby5JNjRfdGhpbmcgPSBhcmcyOwotICAgICAgICAgICAgICAgIHJldHVybiBoZWxsbzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgdGVzdEV4Y2VwdGlvbihzdHJpbmcgYXJnKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ0ZXN0RXhjZXB0aW9uKCIgKyBhcmcgKyAiKSIpOwotICAgICAgICAgICAgICAgIGlmIChhcmcgPT0gIlhjZXB0aW9uIikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFhjZXB0aW9uIHggPSBuZXcgWGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgeC5FcnJvckNvZGUgPSAxMDAxOwotICAgICAgICAgICAgICAgICAgICB4Lk1lc3NhZ2UgPSAiVGhpcyBpcyBhbiBYY2VwdGlvbiI7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IHg7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIFh0cnVjdCB0ZXN0TXVsdGlFeGNlcHRpb24oc3RyaW5nIGFyZzAsIHN0cmluZyBhcmcxKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ0ZXN0TXVsdGlFeGNlcHRpb24oIiArIGFyZzAgKyAiLCAiICsgYXJnMSArICIpIik7Ci0gICAgICAgICAgICAgICAgaWYgKGFyZzAgPT0gIlhjZXB0aW9uIikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFhjZXB0aW9uIHggPSBuZXcgWGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgeC5FcnJvckNvZGUgPSAxMDAxOwotICAgICAgICAgICAgICAgICAgICB4Lk1lc3NhZ2UgPSAiVGhpcyBpcyBhbiBYY2VwdGlvbiI7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IHg7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZzAgPT0gIlhjZXB0aW9uMiIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBYY2VwdGlvbjIgeCA9IG5ldyBYY2VwdGlvbjIoKTsKLSAgICAgICAgICAgICAgICAgICAgeC5FcnJvckNvZGUgPSAyMDAyOwotICAgICAgICAgICAgICAgICAgICB4LlN0cnVjdF90aGluZyA9IG5ldyBYdHJ1Y3QoKTsKLSAgICAgICAgICAgICAgICAgICAgeC5TdHJ1Y3RfdGhpbmcuU3RyaW5nX3RoaW5nID0gIlRoaXMgaXMgYW4gWGNlcHRpb24yIjsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgeDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBYdHJ1Y3QgcmVzdWx0ID0gbmV3IFh0cnVjdCgpOwotICAgICAgICAgICAgICAgIHJlc3VsdC5TdHJpbmdfdGhpbmcgPSBhcmcxOwotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RTdG9wKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoc2VydmVyICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIuU3RvcCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgdGVzdE9uZXdheShpbnQgYXJnKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ0ZXN0T25ld2F5KCIgKyBhcmcgKyAiKSwgc2xlZXBpbmcuLi4iKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uVGhyZWFkaW5nLlRocmVhZC5TbGVlcChhcmcgKiAxMDAwKTsKLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgidGVzdE9uZXdheSBmaW5pc2hlZCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gLy8gY2xhc3MgVGVzdEhhbmRsZXIKLQotICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgRXhlY3V0ZShzdHJpbmdbXSBhcmdzKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBib29sIHVzZUJ1ZmZlcmVkU29ja2V0cyA9IGZhbHNlLCB1c2VGcmFtZWQgPSBmYWxzZSwgdXNlRW5jcnlwdGlvbiA9IGZhbHNlLCBjb21wYWN0ID0gZmFsc2UsIGpzb24gPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBpbnQgcG9ydCA9IDkwOTA7Ci0gICAgICAgICAgICAgICAgc3RyaW5nIHBpcGUgPSBudWxsOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5MZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhcmdzW2ldID09ICItcGlwZSIpICAvLyAtcGlwZSBuYW1lCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBpcGUgPSBhcmdzWysraV07Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXS5Db250YWlucygiLS1wb3J0PSIpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwb3J0ID0gaW50LlBhcnNlKGFyZ3NbaV0uU3Vic3RyaW5nKGFyZ3NbaV0uSW5kZXhPZigiPSIpKzEpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItYiIgfHwgYXJnc1tpXSA9PSAiLS1idWZmZXJlZCIgfHwgYXJnc1tpXSA9PSAiLS10cmFuc3BvcnQ9YnVmZmVyZWQiKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1c2VCdWZmZXJlZFNvY2tldHMgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi1mIiB8fCBhcmdzW2ldID09ICItLWZyYW1lZCIgIHx8IGFyZ3NbaV0gPT0gIi0tdHJhbnNwb3J0PWZyYW1lZCIpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzZUZyYW1lZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLS1jb21wYWN0IiB8fCBhcmdzW2ldID09ICItLXByb3RvY29sPWNvbXBhY3QiKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb21wYWN0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItLWpzb24iIHx8IGFyZ3NbaV0gPT0gIi0tcHJvdG9jb2w9anNvbiIpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGpzb24gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi0tc3NsIikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdXNlRW5jcnlwdGlvbiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBQcm9jZXNzb3IKLSAgICAgICAgICAgICAgICBUZXN0SGFuZGxlciB0ZXN0SGFuZGxlciA9IG5ldyBUZXN0SGFuZGxlcigpOwotICAgICAgICAgICAgICAgIFRocmlmdFRlc3QuUHJvY2Vzc29yIHRlc3RQcm9jZXNzb3IgPSBuZXcgVGhyaWZ0VGVzdC5Qcm9jZXNzb3IodGVzdEhhbmRsZXIpOwotCi0gICAgICAgICAgICAgICAgLy8gVHJhbnNwb3J0Ci0gICAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCB0cmFuczsKLSAgICAgICAgICAgICAgICBpZiggcGlwZSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSBuZXcgVE5hbWVkUGlwZVNlcnZlclRyYW5zcG9ydChwaXBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHVzZUVuY3J5cHRpb24pCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zID0gbmV3IFRUTFNTZXJ2ZXJTb2NrZXQocG9ydCwgMCwgdXNlQnVmZmVyZWRTb2NrZXRzLCBuZXcgWDUwOUNlcnRpZmljYXRlMigiLi4vLi4vLi4vLi4vLi4va2V5cy9zZXJ2ZXIucGVtIikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSBuZXcgVFNlcnZlclNvY2tldChwb3J0LCAwLCB1c2VCdWZmZXJlZFNvY2tldHMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBwcm90bzsKLSAgICAgICAgICAgICAgICBpZiAoIGNvbXBhY3QgKQotICAgICAgICAgICAgICAgICAgICBwcm90byA9IG5ldyBUQ29tcGFjdFByb3RvY29sLkZhY3RvcnkoKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICgganNvbiApCi0gICAgICAgICAgICAgICAgICAgIHByb3RvID0gbmV3IFRKU09OUHJvdG9jb2wuRmFjdG9yeSgpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgcHJvdG8gPSBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKTsKLQotICAgICAgICAgICAgICAgIC8vIFNpbXBsZSBTZXJ2ZXIKLSAgICAgICAgICAgICAgICBUU2VydmVyIHNlcnZlckVuZ2luZTsKLSAgICAgICAgICAgICAgICBpZiAoIHVzZUZyYW1lZCApCi0gICAgICAgICAgICAgICAgICAgIHNlcnZlckVuZ2luZSA9IG5ldyBUU2ltcGxlU2VydmVyKHRlc3RQcm9jZXNzb3IsIHRyYW5zLCBuZXcgVEZyYW1lZFRyYW5zcG9ydC5GYWN0b3J5KCksIHByb3RvKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHNlcnZlckVuZ2luZSA9IG5ldyBUU2ltcGxlU2VydmVyKHRlc3RQcm9jZXNzb3IsIHRyYW5zLCBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwgcHJvdG8pOwotCi0gICAgICAgICAgICAgICAgLy8gVGhyZWFkUG9vbCBTZXJ2ZXIKLSAgICAgICAgICAgICAgICAvLyBzZXJ2ZXJFbmdpbmUgPSBuZXcgVFRocmVhZFBvb2xTZXJ2ZXIodGVzdFByb2Nlc3NvciwgdFNlcnZlclNvY2tldCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBUaHJlYWRlZCBTZXJ2ZXIKLSAgICAgICAgICAgICAgICAvLyBzZXJ2ZXJFbmdpbmUgPSBuZXcgVFRocmVhZGVkU2VydmVyKHRlc3RQcm9jZXNzb3IsIHRTZXJ2ZXJTb2NrZXQpOwotCi0gICAgICAgIC8vU2VydmVyIGV2ZW50IGhhbmRsZXIKLSAgICAgICAgVHJhZGVTZXJ2ZXJFdmVudEhhbmRsZXIgc2VydmVyRXZlbnRzID0gbmV3IFRyYWRlU2VydmVyRXZlbnRIYW5kbGVyKCk7Ci0gICAgICAgIHNlcnZlckVuZ2luZS5zZXRFdmVudEhhbmRsZXIoc2VydmVyRXZlbnRzKTsKLQotICAgICAgICAgICAgICAgIHRlc3RIYW5kbGVyLnNlcnZlciA9IHNlcnZlckVuZ2luZTsKLQotICAgICAgICAgICAgICAgIC8vIFJ1biBpdAotICAgICAgICAgICAgICAgIHN0cmluZyB3aGVyZSA9ICggcGlwZSAhPSBudWxsID8gIm9uIHBpcGUgIitwaXBlIDogIm9uIHBvcnQgIiArIHBvcnQpOwotICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJTdGFydGluZyB0aGUgc2VydmVyICIgKyB3aGVyZSArCi0gICAgICAgICAgICAgICAgICAgICh1c2VCdWZmZXJlZFNvY2tldHMgPyAiIHdpdGggYnVmZmVyZWQgc29ja2V0IiA6ICIiKSArCi0gICAgICAgICAgICAgICAgICAgICh1c2VGcmFtZWQgPyAiIHdpdGggZnJhbWVkIHRyYW5zcG9ydCIgOiAiIikgKwotICAgICAgICAgICAgICAgICAgICAodXNlRW5jcnlwdGlvbiA/ICIgd2l0aCBlbmNyeXB0aW9uIiA6ICIiKSArCi0gICAgICAgICAgICAgICAgICAgIChjb21wYWN0ID8gIiB3aXRoIGNvbXBhY3QgcHJvdG9jb2wiIDogIiIpICsKLSAgICAgICAgICAgICAgICAgICAgKGpzb24gPyAiIHdpdGgganNvbiBwcm90b2NvbCIgOiAiIikgKwotICAgICAgICAgICAgICAgICAgICAiLi4uIik7Ci0gICAgICAgICAgICAgICAgc2VydmVyRW5naW5lLlNlcnZlKCk7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24geCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDb25zb2xlLkVycm9yLldyaXRlKHgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoImRvbmUuIik7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0VGVzdC9UaHJpZnRUZXN0LmNzcHJvaiBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRUZXN0L1RocmlmdFRlc3QuY3Nwcm9qCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjcxOTk3Li4wMDAwMDAwCi0tLSBhL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRUZXN0L1RocmlmdFRlc3QuY3Nwcm9qCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLe+7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iNC4wIiBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgotICA8UHJvcGVydHlHcm91cD4KLSAgICA8Q29uZmlndXJhdGlvbiBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKScgPT0gJycgIj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4KLSAgICA8UGxhdGZvcm0gQ29uZGl0aW9uPSIgJyQoUGxhdGZvcm0pJyA9PSAnJyAiPkFueUNQVTwvUGxhdGZvcm0+Ci0gICAgPFByb2R1Y3RWZXJzaW9uPjkuMC4yMTAyMjwvUHJvZHVjdFZlcnNpb24+Ci0gICAgPFNjaGVtYVZlcnNpb24+Mi4wPC9TY2hlbWFWZXJzaW9uPgotICAgIDxQcm9qZWN0R3VpZD57NDhERDc1N0YtQ0E5NS00REQ3LUJEQTQtNThEQjZGMTA4QzJDfTwvUHJvamVjdEd1aWQ+Ci0gICAgPE91dHB1dFR5cGU+RXhlPC9PdXRwdXRUeXBlPgotICAgIDxBcHBEZXNpZ25lckZvbGRlcj5Qcm9wZXJ0aWVzPC9BcHBEZXNpZ25lckZvbGRlcj4KLSAgICA8Um9vdE5hbWVzcGFjZT5UaHJpZnRUZXN0PC9Sb290TmFtZXNwYWNlPgotICAgIDxBc3NlbWJseU5hbWU+VGhyaWZ0VGVzdDwvQXNzZW1ibHlOYW1lPgotICAgIDxUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPnYzLjU8L1RhcmdldEZyYW1ld29ya1ZlcnNpb24+Ci0gICAgPEZpbGVBbGlnbm1lbnQ+NTEyPC9GaWxlQWxpZ25tZW50PgotICAgIDxJc1dlYkJvb3RzdHJhcHBlcj5mYWxzZTwvSXNXZWJCb290c3RyYXBwZXI+Ci0gICAgPEZpbGVVcGdyYWRlRmxhZ3M+Ci0gICAgPC9GaWxlVXBncmFkZUZsYWdzPgotICAgIDxPbGRUb29sc1ZlcnNpb24+My41PC9PbGRUb29sc1ZlcnNpb24+Ci0gICAgPFVwZ3JhZGVCYWNrdXBMb2NhdGlvbiAvPgotICAgIDxQdWJsaXNoVXJsPnB1Ymxpc2hcPC9QdWJsaXNoVXJsPgotICAgIDxJbnN0YWxsPnRydWU8L0luc3RhbGw+Ci0gICAgPEluc3RhbGxGcm9tPkRpc2s8L0luc3RhbGxGcm9tPgotICAgIDxVcGRhdGVFbmFibGVkPmZhbHNlPC9VcGRhdGVFbmFibGVkPgotICAgIDxVcGRhdGVNb2RlPkZvcmVncm91bmQ8L1VwZGF0ZU1vZGU+Ci0gICAgPFVwZGF0ZUludGVydmFsPjc8L1VwZGF0ZUludGVydmFsPgotICAgIDxVcGRhdGVJbnRlcnZhbFVuaXRzPkRheXM8L1VwZGF0ZUludGVydmFsVW5pdHM+Ci0gICAgPFVwZGF0ZVBlcmlvZGljYWxseT5mYWxzZTwvVXBkYXRlUGVyaW9kaWNhbGx5PgotICAgIDxVcGRhdGVSZXF1aXJlZD5mYWxzZTwvVXBkYXRlUmVxdWlyZWQ+Ci0gICAgPE1hcEZpbGVFeHRlbnNpb25zPnRydWU8L01hcEZpbGVFeHRlbnNpb25zPgotICAgIDxBcHBsaWNhdGlvblJldmlzaW9uPjA8L0FwcGxpY2F0aW9uUmV2aXNpb24+Ci0gICAgPEFwcGxpY2F0aW9uVmVyc2lvbj4xLjAuMC4lMmE8L0FwcGxpY2F0aW9uVmVyc2lvbj4KLSAgICA8VXNlQXBwbGljYXRpb25UcnVzdD5mYWxzZTwvVXNlQXBwbGljYXRpb25UcnVzdD4KLSAgICA8Qm9vdHN0cmFwcGVyRW5hYmxlZD50cnVlPC9Cb290c3RyYXBwZXJFbmFibGVkPgotICA8L1Byb3BlcnR5R3JvdXA+Ci0gIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnRGVidWd8QW55Q1BVJyAiPgotICAgIDxEZWJ1Z1N5bWJvbHM+dHJ1ZTwvRGVidWdTeW1ib2xzPgotICAgIDxEZWJ1Z1R5cGU+ZnVsbDwvRGVidWdUeXBlPgotICAgIDxPcHRpbWl6ZT5mYWxzZTwvT3B0aW1pemU+Ci0gICAgPE91dHB1dFBhdGg+YmluXERlYnVnXDwvT3V0cHV0UGF0aD4KLSAgICA8RGVmaW5lQ29uc3RhbnRzPkRFQlVHO1RSQUNFPC9EZWZpbmVDb25zdGFudHM+Ci0gICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+Ci0gICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+Ci0gICAgPENvZGVBbmFseXNpc1J1bGVTZXQ+QWxsUnVsZXMucnVsZXNldDwvQ29kZUFuYWx5c2lzUnVsZVNldD4KLSAgPC9Qcm9wZXJ0eUdyb3VwPgotICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ1JlbGVhc2V8QW55Q1BVJyAiPgotICAgIDxEZWJ1Z1R5cGU+cGRib25seTwvRGVidWdUeXBlPgotICAgIDxPcHRpbWl6ZT50cnVlPC9PcHRpbWl6ZT4KLSAgICA8T3V0cHV0UGF0aD5iaW5cUmVsZWFzZVw8L091dHB1dFBhdGg+Ci0gICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTwvRGVmaW5lQ29uc3RhbnRzPgotICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgotICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgotICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0PkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+Ci0gIDwvUHJvcGVydHlHcm91cD4KLSAgPEl0ZW1Hcm91cD4KLSAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbSIgLz4KLSAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlRocmlmdEltcGwsIFZlcnNpb249MC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBwcm9jZXNzb3JBcmNoaXRlY3R1cmU9TVNJTCI+Ci0gICAgICA8U3BlY2lmaWNWZXJzaW9uPkZhbHNlPC9TcGVjaWZpY1ZlcnNpb24+Ci0gICAgICA8SGludFBhdGg+LlxUaHJpZnRJbXBsLmRsbDwvSGludFBhdGg+Ci0gICAgPC9SZWZlcmVuY2U+Ci0gIDwvSXRlbUdyb3VwPgotICA8SXRlbUdyb3VwPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlByb2dyYW0uY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvcGVydGllc1xBc3NlbWJseUluZm8uY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdENsaWVudC5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0U2VydmVyLmNzIiAvPgotICA8L0l0ZW1Hcm91cD4KLSAgPEl0ZW1Hcm91cD4KLSAgICA8Qm9vdHN0cmFwcGVyUGFja2FnZSBJbmNsdWRlPSJNaWNyb3NvZnQuTmV0LkNsaWVudC4zLjUiPgotICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+Ci0gICAgICA8UHJvZHVjdE5hbWU+Lk5FVCBGcmFtZXdvcmsgMy41IFNQMSBDbGllbnQgUHJvZmlsZTwvUHJvZHVjdE5hbWU+Ci0gICAgICA8SW5zdGFsbD5mYWxzZTwvSW5zdGFsbD4KLSAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+Ci0gICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0Lk5ldC5GcmFtZXdvcmsuMi4wIj4KLSAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPgotICAgICAgPFByb2R1Y3ROYW1lPi5ORVQgRnJhbWV3b3JrIDIuMCAlMjh4ODYlMjk8L1Byb2R1Y3ROYW1lPgotICAgICAgPEluc3RhbGw+ZmFsc2U8L0luc3RhbGw+Ci0gICAgPC9Cb290c3RyYXBwZXJQYWNrYWdlPgotICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5OZXQuRnJhbWV3b3JrLjMuMCI+Ci0gICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4KLSAgICAgIDxQcm9kdWN0TmFtZT4uTkVUIEZyYW1ld29yayAzLjAgJTI4eDg2JTI5PC9Qcm9kdWN0TmFtZT4KLSAgICAgIDxJbnN0YWxsPmZhbHNlPC9JbnN0YWxsPgotICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4KLSAgICA8Qm9vdHN0cmFwcGVyUGFja2FnZSBJbmNsdWRlPSJNaWNyb3NvZnQuTmV0LkZyYW1ld29yay4zLjUiPgotICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+Ci0gICAgICA8UHJvZHVjdE5hbWU+Lk5FVCBGcmFtZXdvcmsgMy41PC9Qcm9kdWN0TmFtZT4KLSAgICAgIDxJbnN0YWxsPnRydWU8L0luc3RhbGw+Ci0gICAgPC9Cb290c3RyYXBwZXJQYWNrYWdlPgotICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5OZXQuRnJhbWV3b3JrLjMuNS5TUDEiPgotICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+Ci0gICAgICA8UHJvZHVjdE5hbWU+Lk5FVCBGcmFtZXdvcmsgMy41IFNQMTwvUHJvZHVjdE5hbWU+Ci0gICAgICA8SW5zdGFsbD5mYWxzZTwvSW5zdGFsbD4KLSAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+Ci0gICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0LldpbmRvd3MuSW5zdGFsbGVyLjMuMSI+Ci0gICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4KLSAgICAgIDxQcm9kdWN0TmFtZT5XaW5kb3dzIEluc3RhbGxlciAzLjE8L1Byb2R1Y3ROYW1lPgotICAgICAgPEluc3RhbGw+dHJ1ZTwvSW5zdGFsbD4KLSAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+Ci0gIDwvSXRlbUdyb3VwPgotICA8SXRlbUdyb3VwPgotICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXHNyY1xUaHJpZnQuY3Nwcm9qIj4KLSAgICAgIDxQcm9qZWN0Pns0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9PC9Qcm9qZWN0PgotICAgICAgPE5hbWU+VGhyaWZ0PC9OYW1lPgotICAgIDwvUHJvamVjdFJlZmVyZW5jZT4KLSAgPC9JdGVtR3JvdXA+Ci0gIDxJbXBvcnQgUHJvamVjdD0iJChNU0J1aWxkVG9vbHNQYXRoKVxNaWNyb3NvZnQuQ1NoYXJwLnRhcmdldHMiIC8+Ci0gIDwhLS0gVG8gbW9kaWZ5IHlvdXIgYnVpbGQgcHJvY2VzcywgYWRkIHlvdXIgdGFzayBpbnNpZGUgb25lIG9mIHRoZSB0YXJnZXRzIGJlbG93IGFuZCB1bmNvbW1lbnQgaXQuCi0gICAgICAgT3RoZXIgc2ltaWxhciBleHRlbnNpb24gcG9pbnRzIGV4aXN0LCBzZWUgTWljcm9zb2Z0LkNvbW1vbi50YXJnZXRzLgotICA8VGFyZ2V0IE5hbWU9IkJlZm9yZUJ1aWxkIj4KLSAgPC9UYXJnZXQ+Ci0gIDxUYXJnZXQgTmFtZT0iQWZ0ZXJCdWlsZCI+Ci0gIDwvVGFyZ2V0PgotICAtLT4KLSAgPFByb3BlcnR5R3JvdXA+Ci0gICAgPFByZUJ1aWxkRXZlbnQ+cm1kaXIgL3MgL3EgIiQoUHJvamVjdERpcilnZW4tY3NoYXJwIgotZGVsIC9mIC9xICIkKFByb2plY3REaXIpVGhyaWZ0SW1wbC5kbGwiCi1TRVQgT1VUUFVUX0RJUj0kKFByb2plY3REaXIpCi1TRVQgVEhSSUZUX0ZJTEU9JChQcm9qZWN0RGlyKVwuLlwuLlwuLlwuLlx0ZXN0XFRocmlmdFRlc3QudGhyaWZ0Ci1mb3IgJTI1JTI1SSBpbiAoIiUyNU9VVFBVVF9ESVIlMjUiKSBkbyBzZXQgU0hPUlRfRElSPSUyNSUyNX5mc0kKLWZvciAlMjUlMjVJIGluICgiJTI1VEhSSUZUX0ZJTEUlMjUiKSBkbyBzZXQgVEhSSUZUX1NIT1JUPSUyNSUyNX5mc0kKLSIkKFByb2plY3REaXIpXC4uXC4uXC4uXC4uXGNvbXBpbGVyXGNwcFx0aHJpZnQuZXhlIiAtLWdlbiBjc2hhcnAgLW8gJTI1U0hPUlRfRElSJTI1ICUyNVRIUklGVF9TSE9SVCUyNQotJChNU0J1aWxkVG9vbHNQYXRoKVxDc2MuZXhlIC90OmxpYnJhcnkgL291dDoiJChQcm9qZWN0RGlyKVRocmlmdEltcGwuZGxsIiAvcmVjdXJzZToiJChQcm9qZWN0RGlyKWdlbi1jc2hhcnAiXCogL3JlZmVyZW5jZToiJChQcm9qZWN0RGlyKS4uXC4uXHNyY1xiaW5cRGVidWdcVGhyaWZ0LmRsbCI8L1ByZUJ1aWxkRXZlbnQ+Ci0gIDwvUHJvcGVydHlHcm91cD4KLTwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0VGVzdC9tYWtldGVzdC5zaCBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRUZXN0L21ha2V0ZXN0LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyMTBhNTIzLi4wMDAwMDAwCi0tLSBhL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRUZXN0L21ha2V0ZXN0LnNoCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotIyEvYmluL3NoCi0KLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi0uLi8uLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC0tZ2VuIGNzaGFycCAtbyAuIC4uLy4uLy4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKLWdtY3MgL3Q6bGlicmFyeSAvb3V0Oi4vVGhyaWZ0SW1wbC5kbGwgL3JlY3Vyc2U6Li9nZW4tY3NoYXJwLyogL3JlZmVyZW5jZTouLi8uLi9UaHJpZnQuZGxsCi1nbWNzICAvb3V0OlRlc3RDbGllbnRTZXJ2ZXIuZXhlIC9yZWZlcmVuY2U6Li4vLi4vVGhyaWZ0LmRsbCAvcmVmZXJlbmNlOlRocmlmdEltcGwuZGxsIFRlc3RDbGllbnQuY3MgVGVzdFNlcnZlci5jcyBQcm9ncmFtLmNzCi0KLWV4cG9ydCBNT05PX1BBVEg9Li4vLi4vCi0KLXRpbWVvdXQgMTIwIC4vVGVzdENsaWVudFNlcnZlci5leGUgc2VydmVyICYKLXNsZWVwIDEKLS4vVGVzdENsaWVudFNlcnZlci5leGUgY2xpZW50CmRpZmYgLS1naXQgYS9saWIvZC9NYWtlZmlsZS5hbSBiL2xpYi9kL01ha2VmaWxlLmFtCmluZGV4IDMwYjVlYjMuLjJhODEyMTggMTAwNjQ0Ci0tLSBhL2xpYi9kL01ha2VmaWxlLmFtCisrKyBiL2xpYi9kL01ha2VmaWxlLmFtCkBAIC0xNzcsNyArMTc3LDcgQEAKIAl0b3VjaCAkQAogCiB1bml0dGVzdC9kZWJ1Zy8lOiBzcmMvJS5kICQoYWxsX3RhcmdldHMpIHVuaXR0ZXN0L2VtcHR5bWFpbi5kCi0JJChETUQpIC1nYyAtb2YkKHN1YnN0IC8sJChETURfT0ZfRElSU0VQKSwkQCkgJChkX3Rlc3RfZmxhZ3MpICReCisJJChETUQpIC1nIC1vZiQoc3Vic3QgLywkKERNRF9PRl9ESVJTRVApLCRAKSAkKGRfdGVzdF9mbGFncykgJF4KIAogdW5pdHRlc3QvcmVsZWFzZS8lOiBzcmMvJS5kICQoYWxsX3RhcmdldHMpIHVuaXR0ZXN0L2VtcHR5bWFpbi5kCiAJJChETUQpIC1PIC1yZWxlYXNlIC1vZiQoc3Vic3QgLywkKERNRF9PRl9ESVJTRVApLCRAKSAkKGRfdGVzdF9mbGFncykgJF4KQEAgLTE4NSw2ICsxODUsOCBAQAogVEVTVFMgPSAkKGFkZHByZWZpeCB1bml0dGVzdC9kZWJ1Zy8sICQoZF90ZXN0X21vZHVsZXMpKSBcCiAJJChhZGRwcmVmaXggdW5pdHRlc3QvcmVsZWFzZS8sICQoZF90ZXN0X21vZHVsZXMpKQogCitwcmVjcm9zczogYWxsLWxvY2FsCisJJChNQUtFKSAtQyB0ZXN0IHByZWNyb3NzCiAKIEVYVFJBX0RJU1QgPSBcCiAJc3JjIFwKZGlmZiAtLWdpdCBhL2xpYi9kL2NvZGluZ19zdGFuZGFyZHMubWQgYi9saWIvZC9jb2Rpbmdfc3RhbmRhcmRzLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMDM5MGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZC9jb2Rpbmdfc3RhbmRhcmRzLm1kCkBAIC0wLDAgKzEgQEAKK1BsZWFzZSBmb2xsb3cgW0dlbmVyYWwgQ29kaW5nIFN0YW5kYXJkc10oL2RvYy9jb2Rpbmdfc3RhbmRhcmRzLm1kKQpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC9hc3luYy9saWJldmVudC5kIGIvbGliL2Qvc3JjL3RocmlmdC9hc3luYy9saWJldmVudC5kCmluZGV4IDMzNThiZWYuLjgxMmU0YTcgMTAwNjQ0Ci0tLSBhL2xpYi9kL3NyYy90aHJpZnQvYXN5bmMvbGliZXZlbnQuZAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L2FzeW5jL2xpYmV2ZW50LmQKQEAgLTM5Miw3ICszOTIsNyBAQAogICAgICAgVEFzeW5jRXZlbnRSZWFzb24uTk9STUFMOwogICAgICgqKGNhc3QoVFNvY2tldEV2ZW50TGlzdGVuZXIqKWFyZykpKHJlYXNvbik7CiAgICAgR0MucmVtb3ZlUmFuZ2UoYXJnKTsKLSAgICBjbGVhcihhcmcpOworICAgIGRlc3Ryb3koYXJnKTsKICAgICBmcmVlKGFyZyk7CiAgIH0KIApAQCAtNDAyLDcgKzQwMiw3IEBACiAgICAgYXNzZXJ0KGZsYWdzICYgRVZfVElNRU9VVCk7CiAgICAgKCooY2FzdCh2b2lkIGRlbGVnYXRlKCkqKWFyZykpKCk7CiAgICAgR0MucmVtb3ZlUmFuZ2UoYXJnKTsKLSAgICBjbGVhcihhcmcpOworICAgIGRlc3Ryb3koYXJnKTsKICAgICBmcmVlKGFyZyk7CiAgIH0KIApAQCAtNDMwLDcgKzQzMCw3IEBACiAgIFdvcmtbXVtUQXN5bmNUcmFuc3BvcnRdIHdvcmtRdWV1ZXNfOwogCiAgIC8vLyBUaGUgdG90YWwgbnVtYmVyIG9mIHdvcmsgaXRlbXMgbm90IHlldCBmaW5pc2hlZCAocXVldWVkIGFuZCBjdXJyZW50bHkKLSAgLy8vIGV4Y2VjdXRlZCkgYW5kIGRlbGF5cyBub3QgeWV0IGV4ZWN1dGVkLgorICAvLy8gZXhlY3V0ZWQpIGFuZCBkZWxheXMgbm90IHlldCBleGVjdXRlZC4KICAgdWludCBxdWV1ZWRDb3VudF87CiAKICAgLy8vIFByb3RlY3RzIHF1ZXVlZENvdW50Xy4KQEAgLTQ0Miw4ICs0NDIsOCBAQAogCiBwcml2YXRlIHsKICAgdGltZXZhbCB0b1RpbWV2YWwoY29uc3QoRHVyYXRpb24pIGR1cikgewotICAgIHRpbWV2YWwgdHYgPSB7dHZfc2VjOiBjYXN0KGludClkdXIudG90YWwhInNlY29uZHMiKCksCi0gICAgICB0dl91c2VjOiBkdXIuZnJhY1NlYy51c2Vjc307CisgICAgdGltZXZhbCB0djsKKyAgICBkdXIuc3BsaXQhKCJzZWNvbmRzIiwgInVzZWNzIikodHYudHZfc2VjLCB0di50dl91c2VjKTsKICAgICByZXR1cm4gdHY7CiAgIH0KIApkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC9hc3luYy9zb2NrZXQuZCBiL2xpYi9kL3NyYy90aHJpZnQvYXN5bmMvc29ja2V0LmQKaW5kZXggNmRlMTNkOS4uYTA4ZjUxZCAxMDA2NDQKLS0tIGEvbGliL2Qvc3JjL3RocmlmdC9hc3luYy9zb2NrZXQuZAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L2FzeW5jL3NvY2tldC5kCkBAIC0xOCw2ICsxOCw3IEBACiAgKi8KIG1vZHVsZSB0aHJpZnQuYXN5bmMuc29ja2V0OwogCitpbXBvcnQgY29yZS5zdGRjLmVycm5vOiBFQ09OTlJFU0VUOwogaW1wb3J0IGNvcmUudGhyZWFkIDogRmliZXI7CiBpbXBvcnQgY29yZS50aW1lIDogZHVyLCBEdXJhdGlvbjsKIGltcG9ydCBzdGQuYXJyYXkgOiBlbXB0eTsKZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvYmFzZS5kIGIvbGliL2Qvc3JjL3RocmlmdC9iYXNlLmQKaW5kZXggYjM5YjFmMS4uZDVlY2U3MyAxMDA2NDQKLS0tIGEvbGliL2Qvc3JjL3RocmlmdC9iYXNlLmQKKysrIGIvbGliL2Qvc3JjL3RocmlmdC9iYXNlLmQKQEAgLTQzLDE0ICs0MywxNCBAQAogICB9CiAKICAgLy8vIFRoZSBleGNlcHRpb25zIHRocm93biBieSB0aGUgY2hpbGRyZW4gb2YgdGhlIG9wZXJhdGlvbi4gSWYgYXBwbGljYWJsZSwKLSAgLy8vIHRoZSBsaXN0IGlzIG9yZGVyZWQgaW4gdGhlIHNhbWUgd2F5IHRoZSBleGNlcHRpb25zIG9jY3VyZWQuCisgIC8vLyB0aGUgbGlzdCBpcyBvcmRlcmVkIGluIHRoZSBzYW1lIHdheSB0aGUgZXhjZXB0aW9ucyBvY2N1cnJlZC4KICAgRXhjZXB0aW9uW10gZXhjZXB0aW9uczsKIH0KIAogLy8vIFRoZSBUaHJpZnQgdmVyc2lvbiBzdHJpbmcsIHVzZWQgZm9yIGluZm9ybWF0aXZlIHB1cnBvc2VzLgogLy8gTm90ZTogVGhpcyBpcyBjdXJyZW50bHkgaGFyZGNvZGVkLCBidXQgd2lsbCBsaWtlbHkgYmUgZmlsbGVkIGluIGJ5IHRoZSBidWlsZAogLy8gc3lzdGVtIGluIGZ1dHVyZSB2ZXJzaW9ucy4KLWVudW0gVkVSU0lPTiA9ICIwLjkuMiI7CitlbnVtIFZFUlNJT04gPSAiMS4wLjAiOwogCiAvKioKICAqIEZ1bmN0aW9ucyB1c2VkIGZvciBsb2dnaW5nIGluc2lkZSBUaHJpZnQuCkBAIC02Miw3ICs2Miw3IEBACiAgKiBFeGFtcGxlczoKICAqIC0tLQogICogbG9nSW5mbygiQW4gaW5mb3JtYXRpdmUgbWVzc2FnZS4iKTsKLSAqIGxvZ0Vycm9yKCJTb21lIGVycm9yIG9jY3VyZWQ6ICVzIiwgZSk7CisgKiBsb2dFcnJvcigiU29tZSBlcnJvciBvY2N1cnJlZDogJXMiLCBlKTsKICAqIC0tLQogICovCiBhbGlhcyBsb2dGb3JtYXR0ZWQhZ19pbmZvTG9nU2luayBsb2dJbmZvOwpAQCAtOTMsNyArOTMsNyBAQAogLy8gVGhpcyBzaG91bGQgYmUgcHJpdmF0ZSwgaWYgaXQgY291bGQgc3RpbGwgYmUgdXNlZCB0aHJvdWdoIHRoZSBhbGlhc2VzIHRoZW4uCiB0ZW1wbGF0ZSBsb2dGb3JtYXR0ZWQoYWxpYXMgdGFyZ2V0KSB7CiAgIHZvaWQgbG9nRm9ybWF0dGVkKHN0cmluZyBmaWxlID0gX19GSUxFX18sIGludCBsaW5lID0gX19MSU5FX18sCi0gICAgVC4uLikoc3RyaW5nIGZvcm1hdCwgVCBhcmdzKSBpZiAoCisgICAgVC4uLikoc3RyaW5nIGZtdCwgVCBhcmdzKSBpZiAoCiAgICAgX190cmFpdHMoY29tcGlsZXMsIHsgdGFyZ2V0KCIiKTsgfSkKICAgKSB7CiAgICAgaW1wb3J0IHN0ZC5mb3JtYXQsIHN0ZC5zdGRpbzsKQEAgLTEwNyw5ICsxMDcsOSBAQAogICAgICAgZm9ybWF0dGVkV3JpdGUoZ19mb3JtYXRCdWZmZXIsICIlczolczogIiwgZmlsZSwgbGluZSk7CiAKICAgICAgIHN0YXRpYyBpZiAoVC5sZW5ndGggPT0gMCkgewotICAgICAgICBnX2Zvcm1hdEJ1ZmZlci5wdXQoZm9ybWF0KTsKKyAgICAgICAgZ19mb3JtYXRCdWZmZXIucHV0KGZtdCk7CiAgICAgICB9IGVsc2UgewotICAgICAgICBmb3JtYXR0ZWRXcml0ZShnX2Zvcm1hdEJ1ZmZlciwgZm9ybWF0LCBhcmdzKTsKKyAgICAgICAgZm9ybWF0dGVkV3JpdGUoZ19mb3JtYXRCdWZmZXIsIGZtdCwgYXJncyk7CiAgICAgICB9CiAgICAgICB0YXJnZXQoZ19mb3JtYXRCdWZmZXIuZGF0YSk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC9jb2RlZ2VuL2Jhc2UuZCBiL2xpYi9kL3NyYy90aHJpZnQvY29kZWdlbi9iYXNlLmQKaW5kZXggMzVlNTY2YS4uZGI1NDk5MiAxMDA2NDQKLS0tIGEvbGliL2Qvc3JjL3RocmlmdC9jb2RlZ2VuL2Jhc2UuZAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L2NvZGVnZW4vYmFzZS5kCkBAIC00OCw2ICs0OCw3IEBACiBpbXBvcnQgdGhyaWZ0LmJhc2U7CiBpbXBvcnQgdGhyaWZ0LmludGVybmFsLmNvZGVnZW47CiBpbXBvcnQgdGhyaWZ0LnByb3RvY29sLmJhc2U7CitpbXBvcnQgdGhyaWZ0LnV0aWwuaGFzaHNldDsKIAogLyoKICAqIFRocmlmdCBzdHJ1Y3Qvc2VydmljZSBtZXRhIGRhdGEsIHdoaWNoIGlzIHVzZWQgdG8gc3RvcmUgaW5mb3JtYXRpb24gZnJvbQpAQCAtNDE5LDYgKzQyMCwxMCBAQAogCiAgICAgICByZXR1cm4gKGNhc3QoKXN1cGVyKS5vcEVxdWFscyhvdGhlcik7CiAgICAgfQorCisgICAgb3ZlcnJpZGUgc2l6ZV90IHRvSGFzaCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiB0aHJpZnRUb0hhc2hJbXBsKCk7CisgICAgfQogICB9IGVsc2UgewogICAgIHN0cmluZyB0b1N0cmluZygpIGNvbnN0IHsKICAgICAgIHJldHVybiB0aHJpZnRUb1N0cmluZ0ltcGwoKTsKQEAgLTQyNyw2ICs0MzIsMTAgQEAKICAgICBib29sIG9wRXF1YWxzKHJlZiBjb25zdCBUaGlzIG90aGVyKSBjb25zdCB7CiAgICAgICByZXR1cm4gdGhyaWZ0T3BFcXVhbHNJbXBsKG90aGVyKTsKICAgICB9CisKKyAgICBzaXplX3QgdG9IYXNoKCkgY29uc3QgQHNhZmUgbm90aHJvdyB7CisgICAgICByZXR1cm4gdGhyaWZ0VG9IYXNoSW1wbCgpOworICAgIH0KICAgfQogCiAgIHByaXZhdGUgc3RyaW5nIHRocmlmdFRvU3RyaW5nSW1wbCgpIGNvbnN0IHsKQEAgLTQ1OSw2ICs0NjgsMTUgQEAKICAgICByZXR1cm4gdHJ1ZTsKICAgfQogCisgIHByaXZhdGUgc2l6ZV90IHRocmlmdFRvSGFzaEltcGwoKSBjb25zdCBAdHJ1c3RlZCBub3Rocm93IHsKKyAgICBzaXplX3QgaGFzaCA9IDA7CisgICAgZm9yZWFjaCAoaSwgXzsgdGhpcy50dXBsZW9mKSB7CisgICAgICBhdXRvIHZhbCA9IHRoaXMudHVwbGVvZltpXTsKKyAgICAgIGhhc2ggKz0gdHlwZWlkKHZhbCkuZ2V0SGFzaCgmdmFsKTsKKyAgICB9CisgICAgcmV0dXJuIGhhc2g7CisgIH0KKwogICBzdGF0aWMgaWYgKGFueSFgIWEuZGVmYXVsdFZhbHVlLmVtcHR5YChtZXJnZUZpZWxkTWV0YSEoVGhpcywgZmllbGRNZXRhRGF0YSkpKSB7CiAgICAgc3RhdGljIGlmIChpcyhUaGlzIF8gPT0gY2xhc3MpKSB7CiAgICAgICB0aGlzKCkgewpAQCAtNTc0LDcgKzU5Miw3IEBACiAgKiB0aGUgd2lyZSB3aXRob3V0IGFsdGVyaW5nIHRoZWlyIGRlZmluaXRpb25zLgogICovCiB2b2lkIHJlYWRTdHJ1Y3QoVCwgUHJvdG9jb2wsIGFsaWFzIGZpZWxkTWV0YURhdGEgPSBjYXN0KFRGaWVsZE1ldGFbXSludWxsLAotICBib29sIHBvaW50ZXJTdHJ1Y3QgPSBmYWxzZSkocmVmIFQgcywgUHJvdG9jb2wgcCkgaWYgKGlzVFByb3RvY29sIVByb3RvY29sKQorICBib29sIHBvaW50ZXJTdHJ1Y3QgPSBmYWxzZSkoYXV0byByZWYgVCBzLCBQcm90b2NvbCBwKSBpZiAoaXNUUHJvdG9jb2whUHJvdG9jb2wpCiB7CiAgIG1peGluKHsKICAgICBzdHJpbmcgY29kZTsKQEAgLTk0MSw2ICs5NTksMjkgQEAKICAgc3RhdGljIGFzc2VydChfX3RyYWl0cyhjb21waWxlcywgeyBUZXN0IHQ7IHQud3JpdGUoY2FzdChUUHJvdG9jb2wpbnVsbCk7IH0pKTsKIH0KIAorLy8gRW5zdXJlIG9wRXF1YWxzIGFuZCB0b0hhc2ggY29uc2lzdGVuY3kuCit1bml0dGVzdCB7CisgIHN0cnVjdCBUZXN0RXF1YWxzIHsKKyAgICBpbnQgYTE7CisKKyAgICBtaXhpbiBUU3RydWN0SGVscGVycyEoWworICAgICAgVEZpZWxkTWV0YSgiYTEiLCAxLCBUUmVxLk9QVF9JTl9SRVFfT1VUKSwKKyAgICBdKTsKKyAgfQorCisgIFRlc3RFcXVhbHMgYSwgYjsKKyAgYXNzZXJ0KGEgPT0gYik7CisgIGFzc2VydChhLnRvSGFzaCgpID09IGIudG9IYXNoKCkpOworCisgIGEuYTEgPSA0MjsKKyAgYXNzZXJ0KGEgIT0gYik7CisgIGFzc2VydChhLnRvSGFzaCgpICE9IGIudG9IYXNoKCkpOworCisgIGIuYTEgPSA0MjsKKyAgYXNzZXJ0KGEgPT0gYik7CisgIGFzc2VydChhLnRvSGFzaCgpID09IGIudG9IYXNoKCkpOworfQorCiBwcml2YXRlIHsKICAgLyoKICAgICogUmV0dXJucyBhIEQgY29kZSBzdHJpbmcgY29udGFpbmluZyB0aGUgbWF0Y2hpbmcgVFR5cGUgdmFsdWUgZm9yIGEgcGFzc2VkCmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L2NvZGVnZW4vY2xpZW50LmQgYi9saWIvZC9zcmMvdGhyaWZ0L2NvZGVnZW4vY2xpZW50LmQKaW5kZXggMDk3NTNkYS4uMTE3YjA3NiAxMDA2NDQKLS0tIGEvbGliL2Qvc3JjL3RocmlmdC9jb2RlZ2VuL2NsaWVudC5kCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvY29kZWdlbi9jbGllbnQuZApAQCAtMTkyLDcgKzE5Miw3IEBACiAgICAgICAgIGNvZGUgfj0gIm9wcm90Xy53cml0ZU1lc3NhZ2VFbmQoKTtcbiI7CiAgICAgICAgIGNvZGUgfj0gIm9wcm90Xy50cmFuc3BvcnQuZmx1c2goKTtcbiI7CiAKLSAgICAgICAgLy8gSWYgdGhpcyBpcyBub3QgYSBvbmV3YXkgbWV0aG9kLCBnZW5lcmF0ZSB0aGUgcmVjaWV2aW5nIGNvZGUuCisgICAgICAgIC8vIElmIHRoaXMgaXMgbm90IGEgb25ld2F5IG1ldGhvZCwgZ2VuZXJhdGUgdGhlIHJlY2VpdmluZyBjb2RlLgogICAgICAgICBpZiAoIW1ldGhvZE1ldGFGb3VuZCB8fCBtZXRob2RNZXRhLnR5cGUgIT0gVE1ldGhvZFR5cGUuT05FV0FZKSB7CiAgICAgICAgICAgY29kZSB+PSAiVFByZXN1bHRTdHJ1Y3QhKEludGVyZmFjZSwgYCIgfiBtZXRob2ROYW1lIH4gImApIHJlc3VsdDtcbiI7CiAKZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvY29kZWdlbi9jbGllbnRfcG9vbC5kIGIvbGliL2Qvc3JjL3RocmlmdC9jb2RlZ2VuL2NsaWVudF9wb29sLmQKaW5kZXggZWJmNWI2MC4uYzQ2Yjc0MyAxMDA2NDQKLS0tIGEvbGliL2Qvc3JjL3RocmlmdC9jb2RlZ2VuL2NsaWVudF9wb29sLmQKKysrIGIvbGliL2Qvc3JjL3RocmlmdC9jb2RlZ2VuL2NsaWVudF9wb29sLmQKQEAgLTIwNSw3ICsyMDUsNyBAQAogICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBXZSBhcmUgZGVhbGluZyB3aXRoIGEgbm9ybWFsIGV4Y2VwdGlvbiB0aHJvd24gYnkgdGhlCiAgICAgICAgICAgICAvLyBzZXJ2ZXItc2lkZSBtZXRob2QsIGp1c3QgcGFzcyBpdCBvbi4gQXMgZmFyIGFzIHdlIGFyZQotICAgICAgICAgICAgLy8gY29uY2VybmVkLCB0aGUgbWV0aG9kIGNhbGwgc3VjY2VkZWQuCisgICAgICAgICAgICAvLyBjb25jZXJuZWQsIHRoZSBtZXRob2QgY2FsbCBzdWNjZWVkZWQuCiAgICAgICAgICAgICBwb29sXy5yZWNvcmRTdWNjZXNzKGMpOwogICAgICAgICAgICAgdGhyb3cgZTsKICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L2NvZGVnZW4vaWRsZ2VuLmQgYi9saWIvZC9zcmMvdGhyaWZ0L2NvZGVnZW4vaWRsZ2VuLmQKaW5kZXggMDNlOWI5MC4uOWY4ODkzNiAxMDA2NDQKLS0tIGEvbGliL2Qvc3JjL3RocmlmdC9jb2RlZ2VuL2lkbGdlbi5kCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvY29kZWdlbi9pZGxnZW4uZApAQCAtMTU1LDEwICsxNTUsMTAgQEAKICAgICAgIC8vIHRoZSBmcm9udC4gQmVjYXVzZSB3aXRoIHRoZSBUaHJpZnQgY29tcGlsZXIgdHlwZXMgY2FuIG9ubHkgZGVwZW5kIG9uCiAgICAgICAvLyBvdGhlciB0eXBlcyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIGRlZmluZWQsIHdlIGNvbGxlY3QgYWxsIHRoZQogICAgICAgLy8gZGVwZW5kZW5jaWVzLCBwcmVwZW5kIHRoZW0gdG8gdGhlIGxpc3QsIGFuZCB0aGVuIHBydW5lIHRoZSBkdXBsaWNhdGVzCi0gICAgICAvLyAoa2VlcGluZyB0aGUgZmlyc3Qgb2NjdXJlbmNlcykuIElmIHRoaXMgcmVxdWlyZW1lbnQgc2hvdWxkIGV2ZXIgYmUKKyAgICAgIC8vIChrZWVwaW5nIHRoZSBmaXJzdCBvY2N1cnJlbmNlcykuIElmIHRoaXMgcmVxdWlyZW1lbnQgc2hvdWxkIGV2ZXIgYmUKICAgICAgIC8vIGRyb3BwZWQgZnJvbSBUaHJpZnQsIHRoaXMgY291bGQgYmUgZWFzaWx5IGFkYXB0ZWQgdG8gaGFuZGxlIGNpcmN1bGFyCiAgICAgICAvLyBkZXBlbmRlbmNpZXMgYnkgcGFzc2luZyBUeXBlVHVwbGUhKFQsIExpc3QpIHRvIEZvckFsbFdpdGhMaXN0IGluc3RlYWQKLSAgICAgIC8vIG9mIGFwcGVuZGluZyBMaXN0IGFmdGVyd2FyZHMsIGFuZCByZW1vdmluZyB0aGUgbm93IHVubmVjY2VzYXJ5CisgICAgICAvLyBvZiBhcHBlbmRpbmcgTGlzdCBhZnRlcndhcmRzLCBhbmQgcmVtb3ZpbmcgdGhlIG5vdyB1bm5lY2Vzc2FyeQogICAgICAgLy8gTm9EdXBsaWNhdGVzLgogICAgICAgYWxpYXMgTm9EdXBsaWNhdGVzISgKICAgICAgICAgRm9yQWxsV2l0aExpc3QhKApAQCAtNjQxLDEzICs2NDEsMTYgQEAKIH0KIGApOwogCi0gIHN0YXRpYyBhc3NlcnQoc3RydWN0SWRsU3RyaW5nIVdpdGhEZWZhdWx0cyA9PQoraW1wb3J0IHN0ZC5hbGdvcml0aG07CisgIHN0YXRpYyBhc3NlcnQoc3RydWN0SWRsU3RyaW5nIVdpdGhEZWZhdWx0cy5zdGFydHNXaXRoKAogYHN0cnVjdCBXaXRoRGVmYXVsdHMgewogICAtMTogc3RyaW5nIGEgPSAiYXNkZiIsCi0gIC0yOiBkb3VibGUgYiA9IDMuMTQxNSwKLSAgMTogV2l0aG91dE1ldGEgYyA9IHthOiAiZm9vIiwgYjogMywgfSwKKyAgLTI6IGRvdWJsZSBiID0gMy4xNDFgKSk7CisKKyAgc3RhdGljIGFzc2VydChzdHJ1Y3RJZGxTdHJpbmchV2l0aERlZmF1bHRzLmVuZHNXaXRoKAorYDE6IFdpdGhvdXRNZXRhIGMgPSB7YTogImZvbyIsIGI6IDMsIH0sCiB9Ci1gKTsKK2ApKTsKIAogICBzdGF0aWMgYXNzZXJ0KHN0cnVjdElkbFN0cmluZyFPbmVPZkVhY2ggPT0KIGBzdHJ1Y3QgT25lT2ZFYWNoIHsKZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvY29kZWdlbi9wcm9jZXNzb3IuZCBiL2xpYi9kL3NyYy90aHJpZnQvY29kZWdlbi9wcm9jZXNzb3IuZAppbmRleCBlNmI3N2ZhLi41Y2U3YWM2IDEwMDY0NAotLS0gYS9saWIvZC9zcmMvdGhyaWZ0L2NvZGVnZW4vcHJvY2Vzc29yLmQKKysrIGIvbGliL2Qvc3JjL3RocmlmdC9jb2RlZ2VuL3Byb2Nlc3Nvci5kCkBAIC0yNTQsNyArMjU0LDcgQEAKICAgICAgICAgY29kZSB+PSAicmVzdWx0LnNldCFgc3VjY2Vzc2AoIiB+IGNhbGwgfiAiKTtcbiI7CiAgICAgICB9CiAKLSAgICAgIC8vIElmIHRoaXMgaXMgbm90IGEgb25ld2F5IG1ldGhvZCwgZ2VuZXJhdGUgdGhlIHJlY2lldmluZyBjb2RlLgorICAgICAgLy8gSWYgdGhpcyBpcyBub3QgYSBvbmV3YXkgbWV0aG9kLCBnZW5lcmF0ZSB0aGUgcmVjZWl2aW5nIGNvZGUuCiAgICAgICBpZiAoIW1ldGhvZE1ldGFGb3VuZCB8fCBtZXRob2RNZXRhLnR5cGUgIT0gVE1ldGhvZFR5cGUuT05FV0FZKSB7CiAgICAgICAgIGlmIChtZXRob2RNZXRhRm91bmQpIHsKICAgICAgICAgICBmb3JlYWNoIChlOyBtZXRob2RNZXRhLmV4Y2VwdGlvbnMpIHsKZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvaW50ZXJuYWwvc3NsLmQgYi9saWIvZC9zcmMvdGhyaWZ0L2ludGVybmFsL3NzbC5kCmluZGV4IDYzYTBhMmIuLjNhZjU0YjUgMTAwNjQ0Ci0tLSBhL2xpYi9kL3NyYy90aHJpZnQvaW50ZXJuYWwvc3NsLmQKKysrIGIvbGliL2Qvc3JjL3RocmlmdC9pbnRlcm5hbC9zc2wuZApAQCAtMTc5LDcgKzE3OSw3IEBACiAgIEV4Y2VwdGlvbiBleGNlcHRpb247CiAKICAgdm9pZCBpbml0TWVzc2FnZSgpIHsKLSAgICBtZXNzYWdlLmNsZWFyKCk7CisgICAgbWVzc2FnZS5kZXN0cm95KCk7CiAgICAgaGFkTWVzc2FnZSA9IGZhbHNlOwogICAgIGlmICghbG9jYXRpb24uZW1wdHkpIHsKICAgICAgIG1lc3NhZ2Ugfj0gbG9jYXRpb247CmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L2ludGVybmFsL3NzbF9iaW8uZCBiL2xpYi9kL3NyYy90aHJpZnQvaW50ZXJuYWwvc3NsX2Jpby5kCmluZGV4IDc5NmJlOTEuLmFlODUwMjcgMTAwNjQ0Ci0tLSBhL2xpYi9kL3NyYy90aHJpZnQvaW50ZXJuYWwvc3NsX2Jpby5kCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvaW50ZXJuYWwvc3NsX2Jpby5kCkBAIC03Myw3ICs3Myw3IEBACiAgIHZvaWQgc2V0RXJyb3IoRXhjZXB0aW9uIGUpIG5vdGhyb3cgewogICAgIEVSUl9wdXRfZXJyb3IoRVJSX0xJQl9EX0VYQ0VQVElPTiwgRVJSX0ZfRF9FWENFUFRJT04sIEVSUl9SX0RfRVhDRVBUSU9OLAogICAgICAgRVJSX0ZJTEVfRF9FWENFUFRJT04sIEVSUl9MSU5FX0RfRVhDRVBUSU9OKTsKLSAgICB0cnkgeyBHQy5hZGRSb290KGNhc3Qodm9pZCopZSk7IH0gY2F0Y2gge30KKyAgICB0cnkgeyBHQy5hZGRSb290KGNhc3Qodm9pZCopZSk7IH0gY2F0Y2ggKFRocm93YWJsZSkge30KICAgICBFUlJfc2V0X2Vycm9yX2RhdGEoY2FzdChjaGFyKillLCBFUlJfRkxBR1NfRF9FWENFUFRJT04pOwogICB9CiAKZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvaW50ZXJuYWwvdGVzdC9zZXJ2ZXIuZCBiL2xpYi9kL3NyYy90aHJpZnQvaW50ZXJuYWwvdGVzdC9zZXJ2ZXIuZAppbmRleCBiNTM5M2YwLi5mYzVlODZiIDEwMDY0NAotLS0gYS9saWIvZC9zcmMvdGhyaWZ0L2ludGVybmFsL3Rlc3Qvc2VydmVyLmQKKysrIGIvbGliL2Qvc3JjL3RocmlmdC9pbnRlcm5hbC90ZXN0L3NlcnZlci5kCkBAIC0xMDIsNyArMTAyLDcgQEAKICAgICAgICAgc2VydmluZ0NvbmRpdGlvbi53YWl0KCk7CiAKICAgICAgICAgY2FuY2VsLnRyaWdnZXIoKTsKLSAgICAgICAgZW5mb3JjZShkb25lQ29uZGl0aW9uLndhaXQoZHVyISJtc2VjcyIoMTAwKSkpOworICAgICAgICBlbmZvcmNlKGRvbmVDb25kaXRpb24ud2FpdChkdXIhIm1zZWNzIigzKjEwMDApKSk7CiAgICAgICAgIHNlcnZlclRocmVhZC5qb2luKCk7CiAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC9wcm90b2NvbC9qc29uLmQgYi9saWIvZC9zcmMvdGhyaWZ0L3Byb3RvY29sL2pzb24uZAppbmRleCBlODlhZWUxLi41NmE3MWRhIDEwMDY0NAotLS0gYS9saWIvZC9zcmMvdGhyaWZ0L3Byb3RvY29sL2pzb24uZAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L3Byb3RvY29sL2pzb24uZApAQCAtMjYsNiArMjYsNyBAQAogaW1wb3J0IHN0ZC5zdHJpbmcgOiBmb3JtYXQ7CiBpbXBvcnQgc3RkLnRyYWl0cyA6IGlzSW50ZWdyYWw7CiBpbXBvcnQgc3RkLnR5cGV0dXBsZSA6IGFsbFNhdGlzZnksIFR5cGVUdXBsZTsKK2ltcG9ydCBzdGQudXRmIDogdG9VVEY4OwogaW1wb3J0IHRocmlmdC5wcm90b2NvbC5iYXNlOwogaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuYmFzZTsKIApAQCAtNjEsNyArNjIsNyBAQAogICB9CiAKICAgdm9pZCByZXNldCgpIHsKLSAgICBjb250ZXh0U3RhY2tfLmNsZWFyKCk7CisgICAgZGVzdHJveShjb250ZXh0U3RhY2tfKTsKICAgICBjb250ZXh0XyA9IG5ldyBDb250ZXh0KCk7CiAgICAgcmVhZGVyXyA9IG5ldyBMb29rYWhlYWRSZWFkZXIodHJhbnNfKTsKICAgfQpAQCAtMTMyLDcgKzEzMyw4IEBACiAgICAgYm9vbCBlc2NhcGVOdW0gPSB2YWx1ZSAhaXMgbnVsbCB8fCBjb250ZXh0Xy5lc2NhcGVOdW07CiAKICAgICBpZiAodmFsdWUgaXMgbnVsbCkgewotICAgICAgdmFsdWUgPSBmb3JtYXQoIiUuMTZnIiwgZHViKTsKKyAgICAgIC8qIHByZWNpc2lvbiBpcyAxNyAqLworICAgICAgdmFsdWUgPSBmb3JtYXQoIiUuMTdnIiwgZHViKTsKICAgICB9CiAKICAgICBpZiAoZXNjYXBlTnVtKSB0cmFuc18ud3JpdGUoU1RSSU5HX0RFTElNSVRFUik7CkBAIC00OTIsMTIgKzQ5NCwxNSBAQAogICAgIHJldHVybiByZWFkU3ludGF4Q2hhcihyZWFkZXJfLCBjaCk7CiAgIH0KIAotICB1Ynl0ZSByZWFkSnNvbkVzY2FwZUNoYXIoKSB7Ci0gICAgcmVhZEpzb25TeW50YXhDaGFyKFpFUk9fQ0hBUik7Ci0gICAgcmVhZEpzb25TeW50YXhDaGFyKFpFUk9fQ0hBUik7CisgIHdjaGFyIHJlYWRKc29uRXNjYXBlQ2hhcigpIHsKICAgICBhdXRvIGEgPSByZWFkZXJfLnJlYWQoKTsKICAgICBhdXRvIGIgPSByZWFkZXJfLnJlYWQoKTsKLSAgICByZXR1cm4gY2FzdCh1Ynl0ZSkoKGhleFZhbChhWzBdKSA8PCA0KSArIGhleFZhbChiWzBdKSk7CisgICAgYXV0byBjID0gcmVhZGVyXy5yZWFkKCk7CisgICAgYXV0byBkID0gcmVhZGVyXy5yZWFkKCk7CisgICAgcmV0dXJuIGNhc3QodXNob3J0KSgKKyAgICAgICAgICAoaGV4VmFsKGFbMF0pIDw8IDEyKSArIChoZXhWYWwoYlswXSkgPDwgOCkgKworICAgICAgICAgIChoZXhWYWwoY1swXSkgPDwgNCkgKyBoZXhWYWwoZFswXSkKKyAgICAgICAgKTsKICAgfQogCiAgIHN0cmluZyByZWFkSnNvblN0cmluZyhib29sIHNraXBDb250ZXh0ID0gZmFsc2UpIHsKQEAgLTUwNiw2ICs1MTEsNyBAQAogICAgIHJlYWRKc29uU3ludGF4Q2hhcihTVFJJTkdfREVMSU1JVEVSKTsKICAgICBhdXRvIGJ1ZmZlciA9IGFwcGVuZGVyIXN0cmluZygpOwogCisgICAgd2NoYXJbXSB3Y2hzOwogICAgIGludCBieXRlc1JlYWQ7CiAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgIGF1dG8gY2ggPSByZWFkZXJfLnJlYWQoKTsKQEAgLTUyMSw3ICs1MjcsMTggQEAKICAgICAgIGlmIChjaCA9PSBCQUNLU0xBU0gpIHsKICAgICAgICAgY2ggPSByZWFkZXJfLnJlYWQoKTsKICAgICAgICAgaWYgKGNoID09IEVTQ0FQRV9DSEFSKSB7Ci0gICAgICAgICAgY2ggPSByZWFkSnNvbkVzY2FwZUNoYXIoKTsKKyAgICAgICAgICBhdXRvIHdjaCA9IHJlYWRKc29uRXNjYXBlQ2hhcigpOworICAgICAgICAgIGlmICh3Y2ggPj0gMHhEODAwICYmIHdjaCA8PSAweERCRkYpIHsKKyAgICAgICAgICAgIHdjaHMgfj0gd2NoOworICAgICAgICAgIH0gZWxzZSBpZiAod2NoID49IDB4REMwMCAmJiB3Y2ggPD0gMHhERkZGICYmIHdjaHMubGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oIk1pc3NpbmcgVVRGLTE2IGhpZ2ggc3Vycm9nYXRlLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEV4Y2VwdGlvbi5UeXBlLklOVkFMSURfREFUQSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHdjaHMgfj0gd2NoOworICAgICAgICAgICAgYnVmZmVyLnB1dCh3Y2hzLnRvVVRGOCk7CisgICAgICAgICAgICB3Y2hzID0gW107CisgICAgICAgICAgfQorICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgIGF1dG8gcG9zID0gY291bnRVbnRpbChrRXNjYXBlQ2hhcnNbXSwgY2hbMF0pOwogICAgICAgICAgIGlmIChwb3MgPT0gLTEpIHsKQEAgLTUzMSw5ICs1NDgsMTcgQEAKICAgICAgICAgICBjaCA9IGtFc2NhcGVDaGFyVmFsc1twb3NdOwogICAgICAgICB9CiAgICAgICB9CisgICAgICBpZiAod2Nocy5sZW5ndGggIT0gMCkgeworICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCJNaXNzaW5nIFVURi0xNiBsb3cgc3Vycm9nYXRlLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRXhjZXB0aW9uLlR5cGUuSU5WQUxJRF9EQVRBKTsKKyAgICAgIH0KICAgICAgIGJ1ZmZlci5wdXQoY2hbMF0pOwogICAgIH0KIAorICAgIGlmICh3Y2hzLmxlbmd0aCAhPSAwKSB7CisgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCJNaXNzaW5nIFVURi0xNiBsb3cgc3Vycm9nYXRlLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEV4Y2VwdGlvbi5UeXBlLklOVkFMSURfREFUQSk7CisgICAgfQogICAgIHJldHVybiBidWZmZXIuZGF0YTsKICAgfQogCkBAIC03NzIsNiArNzk3LDM2IEBACiB9CiAKIHVuaXR0ZXN0IHsKKyAgaW1wb3J0IHN0ZC5leGNlcHRpb247CisgIGltcG9ydCB0aHJpZnQudHJhbnNwb3J0Lm1lbW9yeTsKKworICBhdXRvIGJ1ZiA9IG5ldyBUTWVtb3J5QnVmZmVyKGNhc3QodWJ5dGVbXSkiXCJcXHUwZTAxIFxcdWQ4MzVcXHVkZDNlXCIiKTsKKyAgYXV0byBqc29uID0gdEpzb25Qcm90b2NvbChidWYpOworICBhdXRvIHN0ciA9IGpzb24ucmVhZFN0cmluZygpOworICBlbmZvcmNlKHN0ciA9PSAi4LiBIPCdlL4iKTsKK30KKwordW5pdHRlc3QgeworICAvLyBUaHJvd24gaWYgbG93IHN1cnJvZ2F0ZSBpcyBtaXNzaW5nLgorICBpbXBvcnQgc3RkLmV4Y2VwdGlvbjsKKyAgaW1wb3J0IHRocmlmdC50cmFuc3BvcnQubWVtb3J5OworCisgIGF1dG8gYnVmID0gbmV3IFRNZW1vcnlCdWZmZXIoY2FzdCh1Ynl0ZVtdKSJcIlxcdTBlMDEgXFx1ZDgzNVwiIik7CisgIGF1dG8ganNvbiA9IHRKc29uUHJvdG9jb2woYnVmKTsKKyAgYXNzZXJ0VGhyb3duIVRQcm90b2NvbEV4Y2VwdGlvbihqc29uLnJlYWRTdHJpbmcoKSk7Cit9CisKK3VuaXR0ZXN0IHsKKyAgLy8gVGhyb3duIGlmIGhpZ2ggc3Vycm9nYXRlIGlzIG1pc3NpbmcuCisgIGltcG9ydCBzdGQuZXhjZXB0aW9uOworICBpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5tZW1vcnk7CisKKyAgYXV0byBidWYgPSBuZXcgVE1lbW9yeUJ1ZmZlcihjYXN0KHVieXRlW10pIlwiXFx1MGUwMSBcXHVkZDNlXCIiKTsKKyAgYXV0byBqc29uID0gdEpzb25Qcm90b2NvbChidWYpOworICBhc3NlcnRUaHJvd24hVFByb3RvY29sRXhjZXB0aW9uKGpzb24ucmVhZFN0cmluZygpKTsKK30KKwordW5pdHRlc3QgewogICBpbXBvcnQgdGhyaWZ0LmludGVybmFsLnRlc3QucHJvdG9jb2w7CiAgIHRlc3RDb250YWluZXJTaXplTGltaXQhKFRKc29uUHJvdG9jb2whKCkpKCk7CiAgIHRlc3RTdHJpbmdTaXplTGltaXQhKFRKc29uUHJvdG9jb2whKCkpKCk7CmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L3NlcnZlci9iYXNlLmQgYi9saWIvZC9zcmMvdGhyaWZ0L3NlcnZlci9iYXNlLmQKaW5kZXggYjU2YWU2Ni4uYTIzYjFjNyAxMDA2NDQKLS0tIGEvbGliL2Qvc3JjL3RocmlmdC9zZXJ2ZXIvYmFzZS5kCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvc2VydmVyL2Jhc2UuZApAQCAtMzcsNyArMzcsNyBAQAogICAvKioKICAgICogU3RhcnRzIHNlcnZpbmcuCiAgICAqCi0gICAqIEJsb2NrcyB1bnRpbCB0aGUgc2VydmVyIGZpbmlzaGVzLCBpLmUuIGEgc2VyaW91cyBwcm9ibGVtIG9jY3VyZWQgb3IgdGhlCisgICAqIEJsb2NrcyB1bnRpbCB0aGUgc2VydmVyIGZpbmlzaGVzLCBpLmUuIGEgc2VyaW91cyBwcm9ibGVtIG9jY3VycmVkIG9yIHRoZQogICAgKiBjYW5jZWxsYXRpb24gcmVxdWVzdCBoYXMgYmVlbiB0cmlnZ2VyZWQuCiAgICAqCiAgICAqIFNlcnZlciBpbXBsZW1lbnRhdGlvbnMgYXJlIGV4cGVjdGVkIHRvIGltcGxlbWVudCBjYW5jZWxsYXRpb24gaW4gYSBiZXN0LQpAQCAtMTE4LDYgKzExOCwzOCBAQAogICBUVHJhbnNwb3J0RmFjdG9yeSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5XzsKICAgVFByb3RvY29sRmFjdG9yeSBpbnB1dFByb3RvY29sRmFjdG9yeV87CiAgIFRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5XzsKKworcHVibGljOgorCisgIEBwcm9wZXJ0eSBUUHJvY2Vzc29yRmFjdG9yeSBwcm9jZXNzb3JGYWN0b3J5KCkKKyAgeworICAgIHJldHVybiBwcm9jZXNzb3JGYWN0b3J5XzsKKyAgfQorCisgIEBwcm9wZXJ0eSBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCgpCisgIHsKKyAgICByZXR1cm4gc2VydmVyVHJhbnNwb3J0XzsKKyAgfQorCisgIEBwcm9wZXJ0eSBUVHJhbnNwb3J0RmFjdG9yeSBpbnB1dFRyYW5zcG9ydEZhY3RvcnkoKQorICB7CisgICAgcmV0dXJuIGlucHV0VHJhbnNwb3J0RmFjdG9yeV87CisgIH0KKworICBAcHJvcGVydHkgVFRyYW5zcG9ydEZhY3Rvcnkgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSgpCisgIHsKKyAgICByZXR1cm4gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeV87CisgIH0KKworICBAcHJvcGVydHkgVFByb3RvY29sRmFjdG9yeSBpbnB1dFByb3RvY29sRmFjdG9yeSgpCisgIHsKKyAgICByZXR1cm4gaW5wdXRQcm90b2NvbEZhY3RvcnlfOworICB9CisKKyAgQHByb3BlcnR5IFRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KCkKKyAgeworICAgIHJldHVybiBvdXRwdXRQcm90b2NvbEZhY3RvcnlfOworICB9CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC9zZXJ2ZXIvbm9uYmxvY2tpbmcuZCBiL2xpYi9kL3NyYy90aHJpZnQvc2VydmVyL25vbmJsb2NraW5nLmQKaW5kZXggMDIxNjc5OS4uNTg2MGMwYyAxMDA2NDQKLS0tIGEvbGliL2Qvc3JjL3RocmlmdC9zZXJ2ZXIvbm9uYmxvY2tpbmcuZAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L3NlcnZlci9ub25ibG9ja2luZy5kCkBAIC04OTMsMTQgKzg5MywxNCBAQAogICAgICAgY2FsbHNTaW5jZVJlc2l6ZV8gPSAwOwogCiAgICAgICBmYWN0b3J5SW5wdXRUcmFuc3BvcnRfID0KLSAgICAgICAgc2VydmVyXy5pbnB1dFRyYW5zcG9ydEZhY3RvcnlfLmdldFRyYW5zcG9ydChpbnB1dFRyYW5zcG9ydF8pOworICAgICAgICBzZXJ2ZXJfLmlucHV0VHJhbnNwb3J0RmFjdG9yeS5nZXRUcmFuc3BvcnQoaW5wdXRUcmFuc3BvcnRfKTsKICAgICAgIGZhY3RvcnlPdXRwdXRUcmFuc3BvcnRfID0KLSAgICAgICAgc2VydmVyXy5vdXRwdXRUcmFuc3BvcnRGYWN0b3J5Xy5nZXRUcmFuc3BvcnQob3V0cHV0VHJhbnNwb3J0Xyk7CisgICAgICAgIHNlcnZlcl8ub3V0cHV0VHJhbnNwb3J0RmFjdG9yeS5nZXRUcmFuc3BvcnQob3V0cHV0VHJhbnNwb3J0Xyk7CiAKICAgICAgIGlucHV0UHJvdG9jb2xfID0KLSAgICAgICAgc2VydmVyXy5pbnB1dFByb3RvY29sRmFjdG9yeV8uZ2V0UHJvdG9jb2woZmFjdG9yeUlucHV0VHJhbnNwb3J0Xyk7CisgICAgICAgIHNlcnZlcl8uaW5wdXRQcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2woZmFjdG9yeUlucHV0VHJhbnNwb3J0Xyk7CiAgICAgICBvdXRwdXRQcm90b2NvbF8gPQotICAgICAgICBzZXJ2ZXJfLm91dHB1dFByb3RvY29sRmFjdG9yeV8uZ2V0UHJvdG9jb2woZmFjdG9yeU91dHB1dFRyYW5zcG9ydF8pOworICAgICAgICBzZXJ2ZXJfLm91dHB1dFByb3RvY29sRmFjdG9yeS5nZXRQcm90b2NvbChmYWN0b3J5T3V0cHV0VHJhbnNwb3J0Xyk7CiAKICAgICAgIGlmIChzZXJ2ZXJfLmV2ZW50SGFuZGxlcikgewogICAgICAgICBjb25uZWN0aW9uQ29udGV4dF8gPQpAQCAtOTA4LDcgKzkwOCw3IEBACiAgICAgICB9CiAKICAgICAgIGF1dG8gaW5mbyA9IFRDb25uZWN0aW9uSW5mbyhpbnB1dFByb3RvY29sXywgb3V0cHV0UHJvdG9jb2xfLCBzb2NrZXRfKTsKLSAgICAgIHByb2Nlc3Nvcl8gPSBzZXJ2ZXJfLnByb2Nlc3NvckZhY3RvcnlfLmdldFByb2Nlc3NvcihpbmZvKTsKKyAgICAgIHByb2Nlc3Nvcl8gPSBzZXJ2ZXJfLnByb2Nlc3NvckZhY3RvcnkuZ2V0UHJvY2Vzc29yKGluZm8pOwogICAgIH0KIAogICAgIH50aGlzKCkgewpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC9zZXJ2ZXIvc2ltcGxlLmQgYi9saWIvZC9zcmMvdGhyaWZ0L3NlcnZlci9zaW1wbGUuZAppbmRleCBmNzE4M2E3Li41YWJhNGMxIDEwMDY0NAotLS0gYS9saWIvZC9zcmMvdGhyaWZ0L3NlcnZlci9zaW1wbGUuZAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L3NlcnZlci9zaW1wbGUuZApAQCAtMTQwLDcgKzE0MCw5IEBACiAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkgewotICAgICAgICBsb2dFcnJvcigiQ2xpZW50IGRpZWQ6ICVzIiwgdHR4KTsKKyAgICAgICAgaWYgKHR0eC50eXBlKCkgIT0gVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLkVORF9PRl9GSUxFKSB7CisgICAgICAgICAgbG9nRXJyb3IoIkNsaWVudCBkaWVkIHVuZXhwZWN0ZWRseTogJXMiLCB0dHgpOworICAgICAgICB9CiAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICBsb2dFcnJvcigiVW5jYXVnaHQgZXhjZXB0aW9uOiAlcyIsIGUpOwogICAgICAgfQpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC9zZXJ2ZXIvdGFza3Bvb2wuZCBiL2xpYi9kL3NyYy90aHJpZnQvc2VydmVyL3Rhc2twb29sLmQKaW5kZXggYjQ3MjBhNC4uNjcwZTcyMCAxMDA2NDQKLS0tIGEvbGliL2Qvc3JjL3RocmlmdC9zZXJ2ZXIvdGFza3Bvb2wuZAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L3NlcnZlci90YXNrcG9vbC5kCkBAIC0yNjgsNyArMjY4LDkgQEAKICAgICAgICAgfQogICAgICAgfQogICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KSB7Ci0gICAgICBsb2dFcnJvcigiQ2xpZW50IGRpZWQ6ICVzIiwgdHR4KTsKKyAgICAgIGlmICh0dHgudHlwZSgpICE9IFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5FTkRfT0ZfRklMRSkgeworICAgICAgICBsb2dFcnJvcigiQ2xpZW50IGRpZWQgdW5leHBlY3RlZGx5OiAlcyIsIHR0eCk7CisgICAgICB9CiAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKICAgICAgIGxvZ0Vycm9yKCJVbmNhdWdodCBleGNlcHRpb246ICVzIiwgZSk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC9zZXJ2ZXIvdGhyZWFkZWQuZCBiL2xpYi9kL3NyYy90aHJpZnQvc2VydmVyL3RocmVhZGVkLmQKaW5kZXggMWNkZTk4My4uMzAwY2M4NCAxMDA2NDQKLS0tIGEvbGliL2Qvc3JjL3RocmlmdC9zZXJ2ZXIvdGhyZWFkZWQuZAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L3NlcnZlci90aHJlYWRlZC5kCkBAIC0xNzMsNyArMTczLDkgQEAKICAgICAgICAgfQogICAgICAgfQogICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KSB7Ci0gICAgICBsb2dFcnJvcigiQ2xpZW50IGRpZWQ6ICVzIiwgdHR4KTsKKyAgICAgIGlmICh0dHgudHlwZSgpICE9IFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5FTkRfT0ZfRklMRSkgeworICAgICAgICBsb2dFcnJvcigiQ2xpZW50IGRpZWQgdW5leHBlY3RlZGx5OiAlcyIsIHR0eCk7CisgICAgICB9CiAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKICAgICAgIGxvZ0Vycm9yKCJVbmNhdWdodCBleGNlcHRpb246ICVzIiwgZSk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC9zZXJ2ZXIvdHJhbnNwb3J0L2Jhc2UuZCBiL2xpYi9kL3NyYy90aHJpZnQvc2VydmVyL3RyYW5zcG9ydC9iYXNlLmQKaW5kZXggZGExNjVkMy4uNzA0ZTE2ZCAxMDA2NDQKLS0tIGEvbGliL2Qvc3JjL3RocmlmdC9zZXJ2ZXIvdHJhbnNwb3J0L2Jhc2UuZAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L3NlcnZlci90cmFuc3BvcnQvYmFzZS5kCkBAIC05NSwxNiArOTUsNyBAQAogCiAgIC8vLwogICB0aGlzKFR5cGUgdHlwZSwgc3RyaW5nIGZpbGUgPSBfX0ZJTEVfXywgc2l6ZV90IGxpbmUgPSBfX0xJTkVfXywgVGhyb3dhYmxlIG5leHQgPSBudWxsKSB7Ci0gICAgc3RyaW5nIG1zZyA9ICJUVHJhbnNwb3J0RXhjZXB0aW9uOiAiOwotICAgIHN3aXRjaCAodHlwZSkgewotICAgICAgY2FzZSBUeXBlLlVOS05PV046IG1zZyB+PSAiVW5rbm93biBzZXJ2ZXIgdHJhbnNwb3J0IGV4Y2VwdGlvbiI7IGJyZWFrOwotICAgICAgY2FzZSBUeXBlLk5PVF9MSVNURU5JTkc6IG1zZyB+PSAiU2VydmVyIHRyYW5zcG9ydCBub3QgbGlzdGVuaW5nIjsgYnJlYWs7Ci0gICAgICBjYXNlIFR5cGUuQUxSRUFEWV9MSVNURU5JTkc6IG1zZyB+PSAiU2VydmVyIHRyYW5zcG9ydCBhbHJlYWR5IGxpc3RlbmluZyI7IGJyZWFrOwotICAgICAgY2FzZSBUeXBlLlJFU09VUkNFX0ZBSUxFRDogbXNnIH49ICJBbiB1bmRlcmx5aW5nIHJlc291cmNlIGZhaWxlZCI7IGJyZWFrOwotICAgICAgZGVmYXVsdDogbXNnIH49ICIoSW52YWxpZCBleGNlcHRpb24gdHlwZSkiOyBicmVhazsKLSAgICB9Ci0KLSAgICB0aGlzKG1zZywgdHlwZSwgZmlsZSwgbGluZSwgbmV4dCk7CisgICAgdGhpcyhlcnJvck1zZyh0eXBlKSwgdHlwZSwgZmlsZSwgbGluZSwgbmV4dCk7CiAgIH0KIAogICAvLy8KQEAgLTEyOSw1ICsxMjAsMTggQEAKIAogcHJvdGVjdGVkOgogICBUeXBlIHR5cGVfOworCitwcml2YXRlOgorICBzdHJpbmcgZXJyb3JNc2coVHlwZSB0eXBlKSB7CisgICAgc3RyaW5nIG1zZyA9ICJUVHJhbnNwb3J0RXhjZXB0aW9uOiAiOworICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgY2FzZSBUeXBlLlVOS05PV046IG1zZyB+PSAiVW5rbm93biBzZXJ2ZXIgdHJhbnNwb3J0IGV4Y2VwdGlvbiI7IGJyZWFrOworICAgICAgY2FzZSBUeXBlLk5PVF9MSVNURU5JTkc6IG1zZyB+PSAiU2VydmVyIHRyYW5zcG9ydCBub3QgbGlzdGVuaW5nIjsgYnJlYWs7CisgICAgICBjYXNlIFR5cGUuQUxSRUFEWV9MSVNURU5JTkc6IG1zZyB+PSAiU2VydmVyIHRyYW5zcG9ydCBhbHJlYWR5IGxpc3RlbmluZyI7IGJyZWFrOworICAgICAgY2FzZSBUeXBlLlJFU09VUkNFX0ZBSUxFRDogbXNnIH49ICJBbiB1bmRlcmx5aW5nIHJlc291cmNlIGZhaWxlZCI7IGJyZWFrOworICAgICAgZGVmYXVsdDogbXNnIH49ICIoSW52YWxpZCBleGNlcHRpb24gdHlwZSkiOyBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIG1zZzsKKyAgfQogfQogCmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9maWxlLmQgYi9saWIvZC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9maWxlLmQKaW5kZXggN2M2NzA1YS4uZmU4OGU3MyAxMDA2NDQKLS0tIGEvbGliL2Qvc3JjL3RocmlmdC90cmFuc3BvcnQvZmlsZS5kCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvdHJhbnNwb3J0L2ZpbGUuZApAQCAtMzcsNyArMzcsOCBAQAogaW1wb3J0IHN0ZC5hbGdvcml0aG0gOiBtaW4sIG1heDsKIGltcG9ydCBzdGQuY29uY3VycmVuY3k7CiBpbXBvcnQgc3RkLmNvbnYgOiB0bzsKLWltcG9ydCBzdGQuZGF0ZXRpbWUgOiBBdXRvU3RhcnQsIGR1ciwgRHVyYXRpb24sIFN0b3BXYXRjaDsKK2ltcG9ydCBzdGQuZGF0ZXRpbWUgOiBkdXIsIER1cmF0aW9uOworaW1wb3J0IHN0ZC5kYXRldGltZS5zdG9wd2F0Y2ggOiBBdXRvU3RhcnQsIFN0b3BXYXRjaDsKIGltcG9ydCBzdGQuZXhjZXB0aW9uOwogaW1wb3J0IHN0ZC5zdGRpbyA6IEZpbGU7CiBpbXBvcnQgdGhyaWZ0LmJhc2U7CkBAIC0yNDYsNyArMjQ3LDcgQEAKICAgICBlbmZvcmNlKCFpc09wZW4sIG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKAogICAgICAgIkNhbm5vdCBzZXQgY2h1bmsgc2l6ZSBhZnRlciBURmlsZVJlYWRlclRyYW5zcG9ydCBoYXMgYmVlbiBvcGVuZWQuIikpOwogICAgIGVuZm9yY2UodmFsdWUgPiBFdmVudFNpemUuc2l6ZW9mLCBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQ2h1bmtzIG11c3QgIiB+Ci0gICAgICAiYmUgbGFyZ2UgZW5vdWdoIHRvIGFjY29tb2RhdGUgYXQgbGVhc3QgYSBzaW5nbGUgYnl0ZSBvZiBwYXlsb2FkIGRhdGEuIikpOworICAgICAgImJlIGxhcmdlIGVub3VnaCB0byBhY2NvbW1vZGF0ZSBhdCBsZWFzdCBhIHNpbmdsZSBieXRlIG9mIHBheWxvYWQgZGF0YS4iKSk7CiAgICAgY2h1bmtTaXplXyA9IHZhbHVlOwogICB9CiAKQEAgLTYzNyw3ICs2MzgsNyBAQAogICBvdmVycmlkZSB2b2lkIGNsb3NlKCkgewogICAgIGlmICghaXNPcGVuKSByZXR1cm47CiAKLSAgICBwcmlvcml0eVNlbmQod3JpdGVyVGhyZWFkXywgU2h1dGRvd25NZXNzYWdlKCksIHRoaXNUaWQpOyAvLyBGSVhNRTogU2hvdWxkIHVzZSBub3JtYWwgc2VuZCBoZXJlLgorICAgIHNlbmQod3JpdGVyVGhyZWFkXywgU2h1dGRvd25NZXNzYWdlKCksIHRoaXNUaWQpOwogICAgIHJlY2VpdmUoKFNodXRkb3duTWVzc2FnZSBtc2csIFRpZCB0aWQpe30pOwogICAgIGlzT3Blbl8gPSBmYWxzZTsKICAgfQpAQCAtODQ3LDcgKzg0OCw3IEBACiAgICAgICAgIChpbW11dGFibGUodWJ5dGUpW10gZGF0YSkgewogICAgICAgICAgIHdoaWxlIChlcnJvck9wZW5pbmcpIHsKICAgICAgICAgICAgIGxvZ0Vycm9yKCJXcml0ZXIgdGhyZWFkIGdvaW5nIHRvIHNsZWVwIGZvciAlcyDCtXMgZHVlIHRvIElPIGVycm9ycyIsCi0gICAgICAgICAgICAgIGlvRXJyb3JTbGVlcER1cmF0aW9uLmZyYWNTZWMudXNlY3MpOworICAgICAgICAgICAgICBpb0Vycm9yU2xlZXBEdXJhdGlvbi50b3RhbCEidXNlY3MiKTsKIAogICAgICAgICAgICAgLy8gU2xlZXAgZm9yIGlvRXJyb3JTbGVlcER1cmF0aW9uLCBiZWluZyByZWFkeSB0byBiZSBpbnRlcnJ1cHRlZAogICAgICAgICAgICAgLy8gYnkgc2h1dGRvd24gcmVxdWVzdHMuCkBAIC0xMDc2LDE1ICsxMDc3LDE1IEBACiAKICAgICAgIC8vIElmIGFueSBhdHRlbXB0IHRha2VzIG1vcmUgdGhhbiA1MDBtcywgdHJlYXQgdGhhdCBhcyBhIGZhdGFsIGZhaWx1cmUgdG8KICAgICAgIC8vIGF2b2lkIGxvb3Bpbmcgb3ZlciBhIHBvdGVudGlhbGx5IHZlcnkgc2xvdyBvcGVyYXRpb24uCi0gICAgICBlbmZvcmNlKHN3LnBlZWsoKS5tc2VjcyA8IDUwMCwKLSAgICAgICAgdGV4dCgiY2xvc2UoKSB0b29rICIsIHN3LnBlZWsoKS5tc2VjcywgIm1zLiIpKTsKKyAgICAgIGVuZm9yY2Uoc3cucGVlaygpLnRvdGFsISJtc2VjcyIgPCAxNTAwLAorICAgICAgICB0ZXh0KCJjbG9zZSgpIHRvb2sgIiwgc3cucGVlaygpLnRvdGFsISJtc2VjcyIsICJtcy4iKSk7CiAKICAgICAgIC8vIE5vcm1hbGx5LCBpdCB0YWtlcyBsZXNzIHRoYW4gNW1zIG9uIG15IGRldiBib3guCiAgICAgICAvLyBIb3dldmVyLCBpZiB0aGUgYm94IGlzIGhlYXZpbHkgbG9hZGVkLCBzb21lIG9mIHRoZSB0ZXN0IHJ1bnMgY2FuIHRha2UKICAgICAgIC8vIGxvbmdlci4gQWRkaXRpb25hbGx5LCBvbiBhIFdpbmRvd3MgU2VydmVyIDIwMDggaW5zdGFuY2UgcnVubmluZyBpbgogICAgICAgLy8gYSBWaXJ0dWFsQm94IFZNLCBpdCBoYXMgYmVlbiBvYnNlcnZlZCB0aGF0IGFib3V0IGEgcXVhcnRlciBvZiB0aGUgcnVucwogICAgICAgLy8gdGFrZXMgKDIxNyDCsSAxKSBtcywgZm9yIHJlYXNvbnMgbm90IHlldCBrbm93bi4KLSAgICAgIGlmIChzdy5wZWVrKCkubXNlY3MgPiA1KSB7CisgICAgICBpZiAoc3cucGVlaygpLnRvdGFsISJtc2VjcyIgPiA1MCkgewogICAgICAgICArK251bU92ZXI7CiAgICAgICB9CiAKZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvdHJhbnNwb3J0L2h0dHAuZCBiL2xpYi9kL3NyYy90aHJpZnQvdHJhbnNwb3J0L2h0dHAuZAppbmRleCA1MTg2ZjNkLi4wZTU4ZGVlIDEwMDY0NAotLS0gYS9saWIvZC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9odHRwLmQKKysrIGIvbGliL2Qvc3JjL3RocmlmdC90cmFuc3BvcnQvaHR0cC5kCkBAIC0xMzQsNyArMTM0LDcgQEAKICAgICB9CiAKICAgICBzdGF0aWMgYm9vbCBjb21wVG9Mb3dlcih1Ynl0ZSBhLCB1Ynl0ZSBiKSB7Ci0gICAgICByZXR1cm4gYSA9PSB0b0xvd2VyKGNhc3QoY2hhciliKTsKKyAgICAgIHJldHVybiB0b0xvd2VyKGNhc3QoY2hhcilhKSA9PSB0b0xvd2VyKGNhc3QoY2hhciliKTsKICAgICB9CiAKICAgICBpZiAoc3RhcnRzV2l0aCFjb21wVG9Mb3dlcihzcGxpdFswXSwgY2FzdCh1Ynl0ZVtdKSJ0cmFuc2Zlci1lbmNvZGluZyIpKSB7CkBAIC0zMzAsNyArMzMwLDcgQEAKICAgICAgICJIb3N0OiAiIH4gaG9zdF8gfiAiXHJcbiIgfgogICAgICAgIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC10aHJpZnRcclxuIiB+CiAgICAgICAiQ29udGVudC1MZW5ndGg6ICIgfiB0byFzdHJpbmcoZGF0YUxlbmd0aCkgfiAiXHJcbiIgfgotICAgICAgIkFjY2VwdDogYXBwbGljYXRpb24veC10aHJpZnRcclxuIgorICAgICAgIkFjY2VwdDogYXBwbGljYXRpb24veC10aHJpZnRcclxuIiB+CiAgICAgICAiVXNlci1BZ2VudDogVGhyaWZ0LyIgfiBWRVJTSU9OIH4gIiAoRC9UQ2xpZW50SHR0cFRyYW5zcG9ydClcclxuIiB+CiAgICAgICAiXHJcbiI7CiAgIH0KZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvdHJhbnNwb3J0L3NvY2tldC5kIGIvbGliL2Qvc3JjL3RocmlmdC90cmFuc3BvcnQvc29ja2V0LmQKaW5kZXggMzhiNTY3YS4uZmNiMzhkYSAxMDA2NDQKLS0tIGEvbGliL2Qvc3JjL3RocmlmdC90cmFuc3BvcnQvc29ja2V0LmQKKysrIGIvbGliL2Qvc3JjL3RocmlmdC90cmFuc3BvcnQvc29ja2V0LmQKQEAgLTE4LDYgKzE4LDcgQEAKICAqLwogbW9kdWxlIHRocmlmdC50cmFuc3BvcnQuc29ja2V0OwogCitpbXBvcnQgY29yZS5zdGRjLmVycm5vOiBFQ09OTlJFU0VUOwogaW1wb3J0IGNvcmUudGhyZWFkIDogVGhyZWFkOwogaW1wb3J0IGNvcmUudGltZSA6IGR1ciwgRHVyYXRpb247CiBpbXBvcnQgc3RkLmFycmF5IDogZW1wdHk7CkBAIC03OSw4ICs4MCw4IEBACiAgICAgdmVyc2lvbiAobm9uZSkgYXNzZXJ0KHdyaXR0ZW4gPD0gYnVmLmxlbmd0aCwgdGV4dCgiSW1wbGVtZW50YXRpb24gd3JvdGUgIiB+CiAgICAgICAibW9yZSBkYXRhIHRoYW4gcmVxdWVzdGVkIHRvPyEgKCIsIHdyaXR0ZW4sICIgdnMuICIsIGJ1Zi5sZW5ndGgsICIpIikpOwogICB9IGJvZHkgewotICAgIGFzc2VydCgwLCAiRE1EIGJ1Zz8g4oCTIFdoeSB3b3VsZCBjb250cmFjdHMgd29yayBmb3IgaW50ZXJmYWNlcywgYnV0IG5vdCAiCi0gICAgICAiZm9yIGFic3RyYWN0IG1ldGhvZHM/ICIKKyAgICBhc3NlcnQoMCwgIkRNRCBidWc/IOKAkyBXaHkgd291bGQgY29udHJhY3RzIHdvcmsgZm9yIGludGVyZmFjZXMsIGJ1dCBub3QgIiB+CisgICAgICAiZm9yIGFic3RyYWN0IG1ldGhvZHM/ICIgfgogICAgICAgIihFcnJvcjogZnVuY3Rpb24gW+KApl0gaW4gYW5kIG91dCBjb250cmFjdHMgcmVxdWlyZSBmdW5jdGlvbiBib2R5Iik7CiAgIH0KIApAQCAtMjU2LDcgKzI1Nyw3IEBACiAgICAgICAgIG5ldyBUQ29tcG91bmRPcGVyYXRpb25FeGNlcHRpb24oCiAgICAgICAgICAgdGV4dCgKICAgICAgICAgICAgICJBbGwgYWRkcmVzc2VzIHRyaWVkIGZhaWxlZCAoIiwKLSAgICAgICAgICAgIGpvaW5lcihtYXAhcXt0ZXh0KGEuXzAsIGA6ICJgLCBhLl8xLm1zZywgYCJgKX0oemlwKGFkZHJzLCBlcnJvcnMpKSwgIiwgIiksCisgICAgICAgICAgICBqb2luZXIobWFwIXF7dGV4dChhWzBdLCBgOiAiYCwgYVsxXS5tc2csIGAiYCl9KHppcChhZGRycywgZXJyb3JzKSksICIsICIpLAogICAgICAgICAgICAgIikuIgogICAgICAgICAgICksCiAgICAgICAgICAgZXJyb3JzCmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9zc2wuZCBiL2xpYi9kL3NyYy90aHJpZnQvdHJhbnNwb3J0L3NzbC5kCmluZGV4IGMxZWFiMjUuLmY4Y2U0MGUgMTAwNjQ0Ci0tLSBhL2xpYi9kL3NyYy90aHJpZnQvdHJhbnNwb3J0L3NzbC5kCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvdHJhbnNwb3J0L3NzbC5kCkBAIC0yNDksNyArMjQ5LDEzIEBACiAgICAgfQogICAgIGNvdW50XysrOwogCi0gICAgY3R4XyA9IFNTTF9DVFhfbmV3KFRMU3YxX21ldGhvZCgpKTsKKyAgICBzdGF0aWMgaWYgKE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPj0gMHgxMDEwMDAwZikgeyAvLyBPUEVOU1NMX1ZFUlNJT05fQVRfTEVBU1QoMSwgMSkpIHsKKyAgICAgICAgY3R4XyA9IFNTTF9DVFhfbmV3KFRMU19tZXRob2QoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY3R4XyA9IFNTTF9DVFhfbmV3KFNTTHYyM19tZXRob2QoKSk7CisgICAgICAgIFNTTF9DVFhfc2V0X29wdGlvbnMoY3R4XywgU1NMX09QX05PX1NTTHYyKTsKKyAgICB9CisgICAgU1NMX0NUWF9zZXRfb3B0aW9ucyhjdHhfLCBTU0xfT1BfTk9fU1NMdjMpOyAgIC8vIFRIUklGVC0zMTY0CiAgICAgZW5mb3JjZShjdHhfLCBnZXRTU0xFeGNlcHRpb24oIlNTTF9DVFhfbmV3IikpOwogICAgIFNTTF9DVFhfc2V0X21vZGUoY3R4XywgU1NMX01PREVfQVVUT19SRVRSWSk7CiAgIH0KQEAgLTQ0Niw2ICs0NTIsNyBAQAogICAgIH0KICAgICBpbml0aWFsaXplZF8gPSB0cnVlOwogCisgICBzdGF0aWMgaWYgKE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPCAweDEwMTAwMDBmKSB7IC8vIE9QRU5TU0xfVkVSU0lPTl9CRUZPUkUoMSwgMSkpIHsKICAgICBTU0xfbGlicmFyeV9pbml0KCk7CiAgICAgU1NMX2xvYWRfZXJyb3Jfc3RyaW5ncygpOwogCkBAIC00NjMsMTIgKzQ3MCwxNCBAQAogICAgIENSWVBUT19zZXRfZHlubG9ja19jcmVhdGVfY2FsbGJhY2soYXNzdW1lTm90aHJvdygmZHlubG9ja0NyZWF0ZUNhbGxiYWNrKSk7CiAgICAgQ1JZUFRPX3NldF9keW5sb2NrX2xvY2tfY2FsbGJhY2soYXNzdW1lTm90aHJvdygmZHlubG9ja0xvY2tDYWxsYmFjaykpOwogICAgIENSWVBUT19zZXRfZHlubG9ja19kZXN0cm95X2NhbGxiYWNrKGFzc3VtZU5vdGhyb3coJmR5bmxvY2tEZXN0cm95Q2FsbGJhY2spKTsKKyAgIH0KICAgfQogCiAgIHN0YXRpYyB2b2lkIGNsZWFudXBPcGVuU1NMKCkgewogICAgIGlmICghaW5pdGlhbGl6ZWRfKSByZXR1cm47CiAKICAgICBpbml0aWFsaXplZF8gPSBmYWxzZTsKKyAgIHN0YXRpYyBpZiAoT1BFTlNTTF9WRVJTSU9OX05VTUJFUiA8IDB4MTAxMDAwMGYpIHsgLy8gT1BFTlNTTF9WRVJTSU9OX0JFRk9SRSgxLCAxKSkgewogICAgIENSWVBUT19zZXRfbG9ja2luZ19jYWxsYmFjayhudWxsKTsKICAgICBDUllQVE9fc2V0X2R5bmxvY2tfY3JlYXRlX2NhbGxiYWNrKG51bGwpOwogICAgIENSWVBUT19zZXRfZHlubG9ja19sb2NrX2NhbGxiYWNrKG51bGwpOwpAQCAtNDc2LDYgKzQ4NSw3IEBACiAgICAgQ1JZUFRPX2NsZWFudXBfYWxsX2V4X2RhdGEoKTsKICAgICBFUlJfZnJlZV9zdHJpbmdzKCk7CiAgICAgRVJSX3JlbW92ZV9zdGF0ZSgwKTsKKyAgIH0KICAgfQogCiAgIHN0YXRpYyBleHRlcm4oQykgewpAQCAtNTE4LDcgKzUyOCw3IEBACiAgICAgICBjb25zdChjaGFyKSogZmlsZSwgaW50IGxpbmUpCiAgICAgewogICAgICAgR0MucmVtb3ZlUmFuZ2UobCk7Ci0gICAgICBjbGVhcihjYXN0KE11dGV4KWwpOworICAgICAgZGVzdHJveShjYXN0KE11dGV4KWwpOwogICAgICAgZnJlZShsKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvdXRpbC9mdXR1cmUuZCBiL2xpYi9kL3NyYy90aHJpZnQvdXRpbC9mdXR1cmUuZAppbmRleCA3YzEyN2M0Li4yYjMyYTAxIDEwMDY0NAotLS0gYS9saWIvZC9zcmMvdGhyaWZ0L3V0aWwvZnV0dXJlLmQKKysrIGIvbGliL2Qvc3JjL3RocmlmdC91dGlsL2Z1dHVyZS5kCkBAIC0zMTYsNyArMzE2LDcgQEAKIH0KIAogLyoqCi0gKiBDcmVhdGVzIGFuIGludGVyZmFjZSB0aGF0IGlzIHNpbWlsaWFyIHRvIGEgZ2l2ZW4gb25lLCBidXQgYWNjZXB0cyBhbgorICogQ3JlYXRlcyBhbiBpbnRlcmZhY2UgdGhhdCBpcyBzaW1pbGFyIHRvIGEgZ2l2ZW4gb25lLCBidXQgYWNjZXB0cyBhbgogICogYWRkaXRpb25hbCwgb3B0aW9uYWwgVENhbmNlbGxhdGlvbiBwYXJhbWV0ZXIgZWFjaCBtZXRob2QsIGFuZCByZXR1cm5zCiAgKiBURnV0dXJlcyBpbnN0ZWFkIG9mIHBsYWluIHJldHVybiB2YWx1ZXMuCiAgKgpAQCAtNDU0LDcgKzQ1NCw3IEBACiAKICAgICAgICsrY29tcGxldGVkQ291bnRfOwogICAgICAgaWYgKGNvbXBsZXRlZENvdW50XyA9PSBmdXR1cmVzXy5sZW5ndGgpIHsKLSAgICAgICAgLy8gVGhpcyB3YXMgdGhlIGxhc3QgZnV0dXJlIGluIHRoZSBsaXN0LCB0aGVyZSBpcyBubyBwb3NzaWJsaXR5CisgICAgICAgIC8vIFRoaXMgd2FzIHRoZSBsYXN0IGZ1dHVyZSBpbiB0aGUgbGlzdCwgdGhlcmUgaXMgbm8gcG9zc2liaWxpdHkKICAgICAgICAgLy8gYW5vdGhlciByZXN1bHQgY291bGQgZXZlciBiZWNvbWUgYXZhaWxhYmxlLgogICAgICAgICBmaW5pc2hlZF8gPSB0cnVlOwogICAgICAgfQpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC91dGlsL2hhc2hzZXQuZCBiL2xpYi9kL3NyYy90aHJpZnQvdXRpbC9oYXNoc2V0LmQKaW5kZXggM2ZhNDY2ZS4uZWRlMTIyZSAxMDA2NDQKLS0tIGEvbGliL2Qvc3JjL3RocmlmdC91dGlsL2hhc2hzZXQuZAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L3V0aWwvaGFzaHNldC5kCkBAIC0zMSw3ICszMSw3IEBACiAgKiBzdGQuY29udGFpbmVyIGdhaW5zIHNvbWV0aGluZyBzdWl0YWJsZS4KICAqLwogLy8gTm90ZTogVGhlIGZ1bmt5IHBvaW50ZXIgY2FzdHMgKGkuZS4gKihjYXN0KGltbXV0YWJsZShFKSopJmUpIGluc3RlYWQgb2YKLS8vIGp1c3QgY2FzdChpbW11dGFibGUoRSkpZSkgYXJlIGEgd29ya2Fyb3VuZCBmb3IgTERDIDIgY29tcGF0aWJpbHR5LgorLy8ganVzdCBjYXN0KGltbXV0YWJsZShFKSllKSBhcmUgYSB3b3JrYXJvdW5kIGZvciBMREMgMiBjb21wYXRpYmlsaXR5LgogZmluYWwgY2xhc3MgSGFzaFNldChFKSB7CiAgIC8vLwogICB0aGlzKCkge30KQEAgLTg4LDcgKzg4LDcgQEAKIAogICAvLy8KICAgYXV0byBvcFNsaWNlKCkgY29uc3QgewotICAgIC8vIFRPRE86IEltcGxlbWVudCB1c2luZyBBQSBrZXkgcmFuZ2Ugb25jZSBhdmFpbGFiZSBpbiByZWxlYXNlIERNRC9kcnVudGltZQorICAgIC8vIFRPRE86IEltcGxlbWVudCB1c2luZyBBQSBrZXkgcmFuZ2Ugb25jZSBhdmFpbGFibGUgaW4gcmVsZWFzZSBETUQvZHJ1bnRpbWUKICAgICAvLyB0byBhdm9pZCBhbGxvY2F0aW9uLgogICAgIHJldHVybiBjYXN0KEVbXSkoYWFfLmtleXMpOwogICB9CmRpZmYgLS1naXQgYS9saWIvZC90ZXN0L01ha2VmaWxlLmFtIGIvbGliL2QvdGVzdC9NYWtlZmlsZS5hbQppbmRleCAwNDgyNTgzLi4zYjZhNmYxIDEwMDc1NQotLS0gYS9saWIvZC90ZXN0L01ha2VmaWxlLmFtCisrKyBiL2xpYi9kL3Rlc3QvTWFrZWZpbGUuYW0KQEAgLTE5LDkgKzE5LDEwIEBACiAKIEFVVE9NQUtFX09QVElPTlMgPSBzZXJpYWwtdGVzdHMKIAotIyBUaHJpZnQgY29tcGlsZXIgcnVsZXMKK0JVSUxUX1NPVVJDRVMgPSB0cnVzdGVkLWNhLWNlcnRpZmljYXRlLnBlbSBzZXJ2ZXItY2VydGlmaWNhdGUucGVtCiAKLVRIUklGVCA9ICQodG9wX2J1aWxkZGlyKS9jb21waWxlci9jcHAvdGhyaWZ0CisKKyMgVGhyaWZ0IGNvbXBpbGVyIHJ1bGVzCiAKIGRlYnVnX3Byb3RvX2dlbiA9ICQoYWRkcHJlZml4IGdlbi1kLywgRGVidWdQcm90b1Rlc3RfdHlwZXMuZCkKIApAQCAtNzEsNyArNzIsNyBAQAogCiBpZiBXSVRIX0RfU1NMX1RFU1RTCiBkX3Rlc3RfZmxhZ3MgKz0gJChETURfT1BFTlNTTF9GTEFHUykgLi4vJChEX1NTTF9MSUJfTkFNRSkKLXRhcmdldHMgPSB0cnVzdGVkLWNhLWNlcnRpZmljYXRlLnBlbSBzZXJ2ZXItY2VydGlmaWNhdGUucGVtICQodGFyZ2V0c18pCit0YXJnZXRzID0gJCh0YXJnZXRzXykKIHJhbl90ZXN0cyA9ICQocmFuX3Rlc3RzXykKIGVsc2UKIHRhcmdldHMgPSAkKGZpbHRlci1vdXQgJChvcGVuc3NsX2RlcGVuZGVudF90YXJnZXRzKSwgJCh0YXJnZXRzXykpCkBAIC0xMjIsMyArMTIzLDUgQEAKIAl0cnVzdGVkLWNhLWNlcnRpZmljYXRlLnBlbSBzZXJ2ZXItY2VydGlmaWNhdGUucGVtCiAKIFRFU1RTID0gJChyYW5fdGVzdHMpCisKK3ByZWNyb3NzOiAkKHRhcmdldHMpCmRpZmYgLS1naXQgYS9saWIvZC90ZXN0L2FzeW5jX3Rlc3QuZCBiL2xpYi9kL3Rlc3QvYXN5bmNfdGVzdC5kCmluZGV4IDE2ZGI1MWIuLmZiNzY1YWQgMTAwNjQ0Ci0tLSBhL2xpYi9kL3Rlc3QvYXN5bmNfdGVzdC5kCisrKyBiL2xpYi9kL3Rlc3QvYXN5bmNfdGVzdC5kCkBAIC0xMzAsNyArMTMwLDcgQEAKICAgfQogCiAgIGF1dG8gbWFuYWdlcnMgPSBuZXcgVExpYmV2ZW50QXN5bmNNYW5hZ2VyW21hbmFnZXJDb3VudF07Ci0gIHNjb3BlIChleGl0KSBmb3JlYWNoIChyZWYgbTsgbWFuYWdlcnMpIGNsZWFyKG0pOworICBzY29wZSAoZXhpdCkgZm9yZWFjaCAocmVmIG07IG1hbmFnZXJzKSBkZXN0cm95KG0pOwogCiAgIGF1dG8gY2xpZW50c1RocmVhZHMgPSBuZXcgVGhyZWFkR3JvdXA7CiAgIGZvcmVhY2ggKG1hbmFnZXJJbmRleCwgcmVmIG1hbmFnZXI7IG1hbmFnZXJzKSB7CkBAIC0zNDAsOSArMzQwLDkgQEAKICAgICAgICAgICBpZiAodHJhY2VfKSB3cml0ZWZsbihgQ2FsbGluZyBkZWxheWVkRWNobygiJXMiLCAxMDAgbXMpLi4uYCwgaWQpOwogICAgICAgICAgIGF1dG8gYSA9IGNsaWVudC5kZWxheWVkRWNobyhpZCwgMTAwKTsKICAgICAgICAgICBlbmZvcmNlKCFhLmNvbXBsZXRpb24ud2FpdChkdXIhInVzZWNzIigxKSksCi0gICAgICAgICAgICB0ZXh0KCJ3YWl0KCkgc3VjY2VkZWQgZWFybHkgKCIsIGEuZ2V0KCksICIsICIsIGlkLCAiKS4iKSk7CisgICAgICAgICAgICB0ZXh0KCJ3YWl0KCkgc3VjY2VlZGVkIGVhcmx5ICgiLCBhLmdldCgpLCAiLCAiLCBpZCwgIikuIikpOwogICAgICAgICAgIGVuZm9yY2UoIWEuY29tcGxldGlvbi53YWl0KGR1ciEidXNlY3MiKDEpKSwKLSAgICAgICAgICAgIHRleHQoIndhaXQoKSBzdWNjZWRlZCBlYXJseSAoIiwgYS5nZXQoKSwgIiwgIiwgaWQsICIpLiIpKTsKKyAgICAgICAgICAgIHRleHQoIndhaXQoKSBzdWNjZWVkZWQgZWFybHkgKCIsIGEuZ2V0KCksICIsICIsIGlkLCAiKS4iKSk7CiAgICAgICAgICAgZW5mb3JjZShhLmNvbXBsZXRpb24ud2FpdChkdXIhIm1zZWNzIigyMDApKSwKICAgICAgICAgICAgIHRleHQoIndhaXQoKSBkaWRuJ3Qgc3VjY2VlZCBhcyBleHBlY3RlZCAoIiwgaWQsICIpLiIpKTsKICAgICAgICAgICBlbmZvcmNlKGEuZ2V0KCkgPT0gaWQpOwpAQCAtMzUzLDkgKzM1Myw5IEBACiAgICAgICAgICAgaWYgKHRyYWNlXykgd3JpdGVmbG4oYENhbGxpbmcgZGVsYXllZEZhaWwoIiVzIiwgMTAwIG1zKS4uLiBgLCBpZCk7CiAgICAgICAgICAgYXV0byBhID0gY2xpZW50LmRlbGF5ZWRGYWlsKGlkLCAxMDApOwogICAgICAgICAgIGVuZm9yY2UoIWEuY29tcGxldGlvbi53YWl0KGR1ciEidXNlY3MiKDEpKSwKLSAgICAgICAgICAgIHRleHQoIndhaXQoKSBzdWNjZWRlZCBlYXJseSAoIiwgaWQsICIsICIsIGNvbGxlY3RFeGNlcHRpb24oYS5nZXQoKSksICIpLiIpKTsKKyAgICAgICAgICAgIHRleHQoIndhaXQoKSBzdWNjZWVkZWQgZWFybHkgKCIsIGlkLCAiLCAiLCBjb2xsZWN0RXhjZXB0aW9uKGEuZ2V0KCkpLCAiKS4iKSk7CiAgICAgICAgICAgZW5mb3JjZSghYS5jb21wbGV0aW9uLndhaXQoZHVyISJ1c2VjcyIoMSkpLAotICAgICAgICAgICAgdGV4dCgid2FpdCgpIHN1Y2NlZGVkIGVhcmx5ICgiLCBpZCwgIiwgIiwgY29sbGVjdEV4Y2VwdGlvbihhLmdldCgpKSwgIikuIikpOworICAgICAgICAgICAgdGV4dCgid2FpdCgpIHN1Y2NlZWRlZCBlYXJseSAoIiwgaWQsICIsICIsIGNvbGxlY3RFeGNlcHRpb24oYS5nZXQoKSksICIpLiIpKTsKICAgICAgICAgICBlbmZvcmNlKGEuY29tcGxldGlvbi53YWl0KGR1ciEibXNlY3MiKDIwMCkpLAogICAgICAgICAgICAgdGV4dCgid2FpdCgpIGRpZG4ndCBzdWNjZWVkIGFzIGV4cGVjdGVkICgiLCBpZCwgIikuIikpOwogICAgICAgICAgIGF1dG8gZSA9IGNhc3QoQXN5bmNUZXN0RXhjZXB0aW9uKWNvbGxlY3RFeGNlcHRpb24oYS5nZXQoKSk7CmRpZmYgLS1naXQgYS9saWIvZC90ZXN0L2FzeW5jX3Rlc3RfcnVubmVyLnNoIGIvbGliL2QvdGVzdC9hc3luY190ZXN0X3J1bm5lci5zaApvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IDRiOWI3YzAuLjdkNTA3ZWUKLS0tIGEvbGliL2QvdGVzdC9hc3luY190ZXN0X3J1bm5lci5zaAorKysgYi9saWIvZC90ZXN0L2FzeW5jX3Rlc3RfcnVubmVyLnNoCkBAIC0xLDYgKzEsMjggQEAKICMhL2Jpbi9iYXNoCisKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitDVVI9IiQoY2QgIiQoZGlybmFtZSAiJHtCQVNIX1NPVVJDRVswXX0iKSIgJiYgcHdkKSIKKwogIyBSdW5zIHRoZSBhc3luYyB0ZXN0IGluIGJvdGggU1NMIGFuZCBub24tU1NMIG1vZGUuCi0uL2FzeW5jX3Rlc3QgPiAvZGV2L251bGwgfHwgZXhpdCAxCiske0NVUn0vYXN5bmNfdGVzdCA+IC9kZXYvbnVsbCB8fCBleGl0IDEKIGVjaG8gIk5vbi1TU0wgdGVzdHMgZG9uZS4iCi0uL2FzeW5jX3Rlc3QgLS1zc2wgPiAvZGV2L251bGwgfHwgZXhpdCAxCiske0NVUn0vYXN5bmNfdGVzdCAtLXNzbCA+IC9kZXYvbnVsbCB8fCBleGl0IDEKIGVjaG8gIlNTTCB0ZXN0cyBkb25lLiIKZGlmZiAtLWdpdCBhL2xpYi9kL3Rlc3QvY2xpZW50X3Bvb2xfdGVzdC5kIGIvbGliL2QvdGVzdC9jbGllbnRfcG9vbF90ZXN0LmQKaW5kZXggODViY2IyOS4uYjI0Yzk3YSAxMDA2NDQKLS0tIGEvbGliL2QvdGVzdC9jbGllbnRfcG9vbF90ZXN0LmQKKysrIGIvbGliL2QvdGVzdC9jbGllbnRfcG9vbF90ZXN0LmQKQEAgLTE4LDYgKzE4LDcgQEAKICAqLwogbW9kdWxlIGNsaWVudF9wb29sX3Rlc3Q7CiAKK2ltcG9ydCBjb3JlLnN5bmMuc2VtYXBob3JlIDogU2VtYXBob3JlOwogaW1wb3J0IGNvcmUudGltZSA6IER1cmF0aW9uLCBkdXI7CiBpbXBvcnQgY29yZS50aHJlYWQgOiBUaHJlYWQ7CiBpbXBvcnQgc3RkLmFsZ29yaXRobTsKQEAgLTI4LDYgKzI5LDcgQEAKIGltcG9ydCBzdGQucmFuZ2U7CiBpbXBvcnQgc3RkLnN0ZGlvOwogaW1wb3J0IHN0ZC50eXBlY29uczsKK2ltcG9ydCBzdGQudmFyaWFudCA6IFZhcmlhbnQ7CiBpbXBvcnQgdGhyaWZ0LmJhc2U7CiBpbXBvcnQgdGhyaWZ0LmFzeW5jLmxpYmV2ZW50OwogaW1wb3J0IHRocmlmdC5hc3luYy5zb2NrZXQ7CkBAIC0zNyw5ICszOSwxMiBAQAogaW1wb3J0IHRocmlmdC5jb2RlZ2VuLmNsaWVudDsKIGltcG9ydCB0aHJpZnQuY29kZWdlbi5jbGllbnRfcG9vbDsKIGltcG9ydCB0aHJpZnQuY29kZWdlbi5wcm9jZXNzb3I7CitpbXBvcnQgdGhyaWZ0LnByb3RvY29sLmJhc2U7CiBpbXBvcnQgdGhyaWZ0LnByb3RvY29sLmJpbmFyeTsKK2ltcG9ydCB0aHJpZnQuc2VydmVyLmJhc2U7CiBpbXBvcnQgdGhyaWZ0LnNlcnZlci5zaW1wbGU7CiBpbXBvcnQgdGhyaWZ0LnNlcnZlci50cmFuc3BvcnQuc29ja2V0OworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuYmFzZTsKIGltcG9ydCB0aHJpZnQudHJhbnNwb3J0LmJ1ZmZlcmVkOwogaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuc29ja2V0OwogaW1wb3J0IHRocmlmdC51dGlsLmNhbmNlbGxhdGlvbjsKQEAgLTEwOCwxMSArMTEzLDI5IEBACiAgIH0KIH0KIAorY2xhc3MgU2VydmVyUHJlU2VydmVIYW5kbGVyIDogVFNlcnZlckV2ZW50SGFuZGxlciB7CisgIHRoaXMoU2VtYXBob3JlIHNlbSkgeworICAgIHNlbV8gPSBzZW07CisgIH0KKworICBvdmVycmlkZSB2b2lkIHByZVNlcnZlKCkgeworICAgIHNlbV8ubm90aWZ5KCk7CisgIH0KKworICBWYXJpYW50IGNyZWF0ZUNvbnRleHQoVFByb3RvY29sIGlucHV0LCBUUHJvdG9jb2wgb3V0cHV0KSB7IHJldHVybiBWYXJpYW50LmluaXQ7IH0KKyAgdm9pZCBkZWxldGVDb250ZXh0KFZhcmlhbnQgc2VydmVyQ29udGV4dCwgVFByb3RvY29sIGlucHV0LCBUUHJvdG9jb2wgb3V0cHV0KSB7fQorICB2b2lkIHByZVByb2Nlc3MoVmFyaWFudCBzZXJ2ZXJDb250ZXh0LCBUVHJhbnNwb3J0IHRyYW5zcG9ydCkge30KKworcHJpdmF0ZToKKyAgU2VtYXBob3JlIHNlbV87Cit9CisKIGNsYXNzIFNlcnZlclRocmVhZCA6IFRocmVhZCB7Ci0gIHRoaXMoRXhUZXN0SGFuZGxlciBoYW5kbGVyLCBUQ2FuY2VsbGF0aW9uIGNhbmNlbGxhdGlvbikgeworICB0aGlzKEV4VGVzdEhhbmRsZXIgaGFuZGxlciwgU2VydmVyUHJlU2VydmVIYW5kbGVyIHNlcnZlckhhbmRsZXIsIFRDYW5jZWxsYXRpb24gY2FuY2VsbGF0aW9uKSB7CiAgICAgc3VwZXIoJnJ1bik7CiAgICAgaGFuZGxlcl8gPSBoYW5kbGVyOwogICAgIGNhbmNlbGxhdGlvbl8gPSBjYW5jZWxsYXRpb247CisgICAgc2VydmVySGFuZGxlcl8gPSBzZXJ2ZXJIYW5kbGVyOwogICB9CiBwcml2YXRlOgogICB2b2lkIHJ1bigpIHsKQEAgLTEyMywxNiArMTQ2LDE3IEBACiAgICAgICBzZXJ2ZXJUcmFuc3BvcnQucmVjdlRpbWVvdXQgPSBkdXIhInNlY29uZHMiKDMpOwogICAgICAgYXV0byB0cmFuc3BvcnRGYWN0b3J5ID0gbmV3IFRCdWZmZXJlZFRyYW5zcG9ydEZhY3Rvcnk7CiAKLSAgICAgIGF1dG8gc2VydmVyID0gbmV3IFRTaW1wbGVTZXJ2ZXIoCi0gICAgICAgIHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpOworICAgICAgYXV0byBzZXJ2ZXIgPSBuZXcgVFNpbXBsZVNlcnZlcihwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KTsKKyAgICAgIHNlcnZlci5ldmVudEhhbmRsZXIgPSBzZXJ2ZXJIYW5kbGVyXzsKICAgICAgIHNlcnZlci5zZXJ2ZShjYW5jZWxsYXRpb25fKTsKICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgd3JpdGVmbG4oIlNlcnZlciB0aHJlYWQgb24gcG9ydCAlcyBmYWlsZWQ6ICVzIiwgaGFuZGxlcl8ucG9ydCwgZSk7CiAgICAgfQogICB9CiAKLSAgVENhbmNlbGxhdGlvbiBjYW5jZWxsYXRpb25fOwogICBFeFRlc3RIYW5kbGVyIGhhbmRsZXJfOworICBTZXJ2ZXJQcmVTZXJ2ZUhhbmRsZXIgc2VydmVySGFuZGxlcl87CisgIFRDYW5jZWxsYXRpb24gY2FuY2VsbGF0aW9uXzsKIH0KIAogdm9pZCBtYWluKHN0cmluZ1tdIGFyZ3MpIHsKQEAgLTE0NSw2ICsxNjksOSBAQAogCiAgIGltbXV0YWJsZSBwb3J0cyA9IGNhc3QoaW1tdXRhYmxlKWFycmF5KG1hcCEiY2FzdCh1c2hvcnQpYSIoaW90YShwb3J0LCBwb3J0ICsgNikpKTsKIAorICAvLyBzZW1hcGhvcmUgdGhhdCB3aWxsIGJlIGluY3JlbWVudGVkIHdoZW5ldmVyIGVhY2ggc2VydmVyIHRocmVhZCBoYXMgYm91bmQgYW5kIHN0YXJ0ZWQgbGlzdGVuaW5nCisgIFNlbWFwaG9yZSBzZW0gPSBuZXcgU2VtYXBob3JlKDApOworCiB2ZXJzaW9uIChub25lKSB7CiAgIC8vIENhbm5vdCB1c2UgdGhpcyBkdWUgdG8gbXVsdGlwbGUgRE1EIEBAQlVHQEBzOgogICAvLyAxLiDCu2Z1bmN0aW9uIEQgbWFpbiBpcyBhIG5lc3RlZCBmdW5jdGlvbiBhbmQgY2Fubm90IGJlIGFjY2Vzc2VkIGZyb20gYXJyYXnCqwpAQCAtMTc0LDExICsyMDEsMTAgQEAKIH0KIAogICAvLyBGaXJlIHVwIHRoZSBzZXJ2ZXIgdGhyZWFkcy4KLSAgZm9yZWFjaCAoaDsgaGFuZGxlcnMpIChuZXcgU2VydmVyVGhyZWFkKGgsIHNlcnZlckNhbmNlbGxhdGlvbikpLnN0YXJ0KCk7CisgIGZvcmVhY2ggKGg7IGhhbmRsZXJzKSAobmV3IFNlcnZlclRocmVhZChoLCBuZXcgU2VydmVyUHJlU2VydmVIYW5kbGVyKHNlbSksIHNlcnZlckNhbmNlbGxhdGlvbikpLnN0YXJ0KCk7CiAKLSAgLy8gR2l2ZSB0aGUgc2VydmVycyBzb21lIHRpbWUgdG8gZ2V0IHVwLiBUaGlzIHNob3VsZCByZWFsbHkgYmUgYWNjb21wbGlzaGVkCi0gIC8vIHZpYSBhIGJhcnJpZXIgaGVyZSBhbmQgaW4gdGhlIHByZVNlcnZlKCkgaG9vay4KLSAgVGhyZWFkLnNsZWVwKGR1ciEibXNlY3MiKDEwKSk7CisgIC8vIHdhaXQgdW50aWwgYWxsIHRoZSBoYW5kbGVycyBzaWduYWwgdGhhdCB0aGV5J3JlIHJlYWR5IHRvIHNlcnZlCisgIGZvcmVhY2ggKGg7IGhhbmRsZXJzKSAoc2VtLndhaXQoZHVyIWBzZWNvbmRzYCgxKSkpOwogCiAgIHN5bmNDbGllbnRQb29sVGVzdChwb3J0cywgaGFuZGxlcnMpOwogICBhc3luY0NsaWVudFBvb2xUZXN0KHBvcnRzLCBoYW5kbGVycyk7CkBAIC00MDksOCArNDM1LDggQEAKICAgICApKCk7CiAgICAgVGhyZWFkLnNsZWVwKGR1ciEibXNlY3MiKDIwKSk7CiAgICAgYXV0byByZXN1bHRUdXBsZSA9IHBhcnRpYWxSZXN1bHQuZmluaXNoR2V0KCk7Ci0gICAgZW5mb3JjZShyZXN1bHRUdXBsZS5fMCA9PSBwb3J0c1swIC4uIDJdKTsKLSAgICBlbmZvcmNlKGVxdWFsKG1hcCEiYS5wb3J0IihjYXN0KFRlc3RTZXJ2aWNlRXhjZXB0aW9uW10pcmVzdWx0VHVwbGUuXzEpLAorICAgIGVuZm9yY2UocmVzdWx0VHVwbGVbMF0gPT0gcG9ydHNbMCAuLiAyXSk7CisgICAgZW5mb3JjZShlcXVhbChtYXAhImEucG9ydCIoY2FzdChUZXN0U2VydmljZUV4Y2VwdGlvbltdKXJlc3VsdFR1cGxlWzFdKSwKICAgICAgIHBvcnRzWzMgLi4gJCAtIDFdKSk7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9kL3Rlc3Qvc2VyaWFsaXphdGlvbl9iZW5jaG1hcmsuZCBiL2xpYi9kL3Rlc3Qvc2VyaWFsaXphdGlvbl9iZW5jaG1hcmsuZAppbmRleCAzNTUxNWM4Li40MGQwNDgwIDEwMDY0NAotLS0gYS9saWIvZC90ZXN0L3NlcmlhbGl6YXRpb25fYmVuY2htYXJrLmQKKysrIGIvbGliL2QvdGVzdC9zZXJpYWxpemF0aW9uX2JlbmNobWFyay5kCkBAIC0xMyw3ICsxMyw3IEBACiAgKi8KIG1vZHVsZSBzZXJpYWxpemF0aW9uX2JlbmNobWFyazsKIAotaW1wb3J0IHN0ZC5kYXRldGltZSA6IEF1dG9TdGFydCwgU3RvcFdhdGNoOworaW1wb3J0IHN0ZC5kYXRldGltZS5zdG9wd2F0Y2ggOiBBdXRvU3RhcnQsIFN0b3BXYXRjaDsKIGltcG9ydCBzdGQubWF0aCA6IFBJOwogaW1wb3J0IHN0ZC5zdGRpbzsKIGltcG9ydCB0aHJpZnQucHJvdG9jb2wuYmluYXJ5OwpAQCAtNDYsNyArNDYsNyBAQAogICAgIH0KICAgICBzdy5zdG9wKCk7CiAKLSAgICBhdXRvIG1zZWNzID0gc3cucGVlaygpLm1zZWNzOworICAgIGF1dG8gbXNlY3MgPSBzdy5wZWVrKCkudG90YWwhIm1zZWNzIjsKICAgICB3cml0ZWZsbigiV3JpdGU6ICVzIG1zICglcyBrSHopIiwgbXNlY3MsIElURVJBVElPTlMgLyBtc2Vjcyk7CiAgIH0KIApAQCAtNjQsNyArNjQsNyBAQAogICAgIH0KICAgICBzdy5zdG9wKCk7CiAKLSAgICBhdXRvIG1zZWNzID0gc3cucGVlaygpLm1zZWNzOworICAgIGF1dG8gbXNlY3MgPSBzdy5wZWVrKCkudG90YWwhIm1zZWNzIjsKICAgICB3cml0ZWZsbigiIFJlYWQ6ICVzIG1zICglcyBrSHopIiwgbXNlY3MsIElURVJBVElPTlMgLyBtc2Vjcyk7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9kL3Rlc3QvdGhyaWZ0X3Rlc3RfY2xpZW50LmQgYi9saWIvZC90ZXN0L3RocmlmdF90ZXN0X2NsaWVudC5kCmluZGV4IGEyNThiNjQuLjQ5NDE5ZjcgMTAwNjQ0Ci0tLSBhL2xpYi9kL3Rlc3QvdGhyaWZ0X3Rlc3RfY2xpZW50LmQKKysrIGIvbGliL2QvdGVzdC90aHJpZnRfdGVzdF9jbGllbnQuZApAQCAtMjUsNiArMjUsNyBAQAogaW1wb3J0IHN0ZC5zdGRpbzsKIGltcG9ydCBzdGQuc3RyaW5nOwogaW1wb3J0IHN0ZC50cmFpdHM7CitpbXBvcnQgdGhyaWZ0LmJhc2U7CiBpbXBvcnQgdGhyaWZ0LmNvZGVnZW4uY2xpZW50OwogaW1wb3J0IHRocmlmdC5wcm90b2NvbC5iYXNlOwogaW1wb3J0IHRocmlmdC5wcm90b2NvbC5iaW5hcnk7CkBAIC03NSw2ICs3Niw3IEBACiAgICAgInNzbCIsICZzc2wsCiAgICAgInRyYW5zcG9ydCIsICZ0cmFuc3BvcnRUeXBlLAogICAgICJ0cmFjZSIsICZ0cmFjZSwKKyAgICAicG9ydCIsICZwb3J0LAogICAgICJob3N0IiwgKHN0cmluZyBfLCBzdHJpbmcgdmFsdWUpIHsKICAgICAgIGF1dG8gcGFydHMgPSBzcGxpdCh2YWx1ZSwgIjoiKTsKICAgICAgIGlmIChwYXJ0cy5sZW5ndGggPiAxKSB7CkBAIC04NywxMyArODksMTQgQEAKICAgICAgIH0KICAgICB9CiAgICk7CisgIHBvcnQgPSB0byF1c2hvcnQocG9ydCk7CiAKICAgVFNvY2tldCBzb2NrZXQ7CiAgIGlmIChzc2wpIHsKICAgICBhdXRvIHNzbENvbnRleHQgPSBuZXcgVFNTTENvbnRleHQoKTsKICAgICBzc2xDb250ZXh0LmNpcGhlcnMgPSAiQUxMOiFBREg6IUxPVzohRVhQOiFNRDU6QFNUUkVOR1RIIjsKICAgICBzc2xDb250ZXh0LmF1dGhlbnRpY2F0ZSA9IHRydWU7Ci0gICAgc3NsQ29udGV4dC5sb2FkVHJ1c3RlZENlcnRpZmljYXRlcygiLi90cnVzdGVkLWNhLWNlcnRpZmljYXRlLnBlbSIpOworICAgIHNzbENvbnRleHQubG9hZFRydXN0ZWRDZXJ0aWZpY2F0ZXMoIi4uLy4uLy4uL3Rlc3Qva2V5cy9DQS5wZW0iKTsKICAgICBzb2NrZXQgPSBuZXcgVFNTTFNvY2tldChzc2xDb250ZXh0LCBob3N0LCBwb3J0KTsKICAgfSBlbHNlIHsKICAgICBzb2NrZXQgPSBuZXcgVFNvY2tldChob3N0LCBwb3J0KTsKQEAgLTE1OSw2ICsxNjIsOCBAQAogICAgIGlmICh0cmFjZSkgd3JpdGVmbG4oIiA9ICVzIiwgZHViKTsKICAgICBlbmZvcmNlKGR1YiA9PSAtNS4yMDk4NTIzKTsKIAorCS8vIFRPRE86IGFkZCB0ZXN0QmluYXJ5KCkgY2FsbAorCQogICAgIFh0cnVjdCBvdXQxOwogICAgIG91dDEuc3RyaW5nX3RoaW5nID0gIlplcm8iOwogICAgIG91dDEuYnl0ZV90aGluZyA9IDE7CkBAIC0yNzgsNiArMjgzLDE1IEBACiAgICAgICB9CiAKICAgICAgIHRyeSB7CisgICAgICAgIGlmICh0cmFjZSkgd3JpdGUoImNsaWVudC50ZXN0RXhjZXB0aW9uKFwiVEV4Y2VwdGlvblwiKSA9PiIpOworICAgICAgICBjbGllbnQudGVzdEV4Y2VwdGlvbigiWGNlcHRpb24iKTsKKyAgICAgICAgaWYgKHRyYWNlKSB3cml0ZWxuKCIgIHZvaWRcbkZBSUxVUkUiKTsKKyAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigidGVzdEV4Y2VwdGlvbiBmYWlsZWQuIik7CisgICAgICB9IGNhdGNoIChURXhjZXB0aW9uIGUpIHsKKyAgICAgICAgaWYgKHRyYWNlKSB3cml0ZWZsbigiICB7JXN9IiwgZS5tc2cpOworICAgICAgfQorCisgICAgICB0cnkgewogICAgICAgICBpZiAodHJhY2UpIHdyaXRlKCJjbGllbnQudGVzdEV4Y2VwdGlvbihcInN1Y2Nlc3NcIikgPT4iKTsKICAgICAgICAgY2xpZW50LnRlc3RFeGNlcHRpb24oInN1Y2Nlc3MiKTsKICAgICAgICAgaWYgKHRyYWNlKSB3cml0ZWxuKCIgIHZvaWQiKTsKZGlmZiAtLWdpdCBhL2xpYi9kL3Rlc3QvdGhyaWZ0X3Rlc3RfcnVubmVyLnNoIGIvbGliL2QvdGVzdC90aHJpZnRfdGVzdF9ydW5uZXIuc2gKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCBmYmU3NWYwLi41MWJmZTk5Ci0tLSBhL2xpYi9kL3Rlc3QvdGhyaWZ0X3Rlc3RfcnVubmVyLnNoCisrKyBiL2xpYi9kL3Rlc3QvdGhyaWZ0X3Rlc3RfcnVubmVyLnNoCkBAIC0xLDEwICsxLDM0IEBACiAjIS9iaW4vYmFzaAorCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKwogIyBSdW5zIHRoZSBEIFRocmlmdFRlc3QgY2xpZW50IGFuZCBzZXJ2ZXJzIGZvciBhbGwgY29tYmluYXRpb25zIG9mIHRyYW5zcG9ydCwKICMgcHJvdG9jb2wsIFNTTC1tb2RlIGFuZCBzZXJ2ZXIgdHlwZS4KICMgUGFzcyAtayB0byBrZWVwIGdvaW5nIGFmdGVyIGZhaWxlZCB0ZXN0cy4KIAorQ1VSPSIkKGNkICIkKGRpcm5hbWUgIiR7QkFTSF9TT1VSQ0VbMF19IikiICYmIHB3ZCkiCisKIHByb3RvY29scz0iYmluYXJ5IGNvbXBhY3QganNvbiIKLXRyYW5zcG9ydHM9ImJ1ZmZlcmVkIGZyYW1lZCBodHRwIHJhdyIKKyMgVE9ETzogZml4IGFuZCBlbmFibGUgaHR0cAorIyB0cmFuc3BvcnRzPSJidWZmZXJlZCBmcmFtZWQgcmF3IGh0dHAiCit0cmFuc3BvcnRzPSJidWZmZXJlZCBmcmFtZWQgcmF3Igogc2VydmVycz0ic2ltcGxlIHRhc2twb29sIHRocmVhZGVkIgogZnJhbWVkX29ubHlfc2VydmVycz0ibm9uYmxvY2tpbmcgcG9vbGVkTm9uYmxvY2tpbmciCiAKQEAgLTIxLDE2ICs0NSwyMCBAQAogICAgICAgICBlc2FjCiAKICAgICAgICAgYXJncz0iLS10cmFuc3BvcnQ9JHRyYW5zcG9ydCAtLXByb3RvY29sPSRwcm90b2NvbCRzc2wiCi0gICAgICAgIC4vdGhyaWZ0X3Rlc3Rfc2VydmVyICRhcmdzIC0tc2VydmVyLXR5cGU9JHNlcnZlciA+IC9kZXYvbnVsbCAmCisgICAgICAgICR7Q1VSfS90aHJpZnRfdGVzdF9zZXJ2ZXIgJGFyZ3MgLS1zZXJ2ZXItdHlwZT0kc2VydmVyID4gL2Rldi9udWxsICYKICAgICAgICAgc2VydmVyX3BpZD0kIQogCiAgICAgICAgICMgR2l2ZSB0aGUgc2VydmVyIHNvbWUgdGltZSB0byBnZXQgdXAgYW5kIGNoZWNrIGlmIGl0IHJ1bnMgKHllcywgdGhpcwogICAgICAgICAjIGlzIGEgaHVnZSBrbHVkZ2UsIHNob3VsZCBhZGQgYSBjb25uZWN0IHRpbWVvdXQgdG8gdGVzdCBjbGllbnQpLgogICAgICAgICBjbGllbnRfcmM9LTEKLSAgICAgICAgc2xlZXAgMC4wMQorICAgICAgICBpZiBbICIkc2VydmVyIiA9ICJ0YXNrcG9vbCIgXTsgdGhlbgorICAgICAgICAgIHNsZWVwIDAuNQorICAgICAgICBlbHNlCisgICAgICAgICAgc2xlZXAgMC4wMgorICAgICAgICBmaQogICAgICAgICBraWxsIC0wICRzZXJ2ZXJfcGlkIDI+L2Rldi9udWxsCiAgICAgICAgIGlmIFsgJD8gLWVxIDAgXTsgdGhlbgotICAgICAgICAgIC4vdGhyaWZ0X3Rlc3RfY2xpZW50ICRhcmdzIC0tbnVtVGVzdHM9MTAgPiAvZGV2L251bGwKKyAgICAgICAgICAke0NVUn0vdGhyaWZ0X3Rlc3RfY2xpZW50ICRhcmdzIC0tbnVtVGVzdHM9MTAgPiAvZGV2L251bGwKICAgICAgICAgICBjbGllbnRfcmM9JD8KIAogICAgICAgICAgICMgVGVtcG9yYXJpbHkgcmVkaXJlY3Qgc3RkZXJyIHRvIG51bGwgdG8gYXZvaWQgam9iIGNvbnRyb2wgbWVzc2FnZXMsCmRpZmYgLS1naXQgYS9saWIvZC90ZXN0L3RocmlmdF90ZXN0X3NlcnZlci5kIGIvbGliL2QvdGVzdC90aHJpZnRfdGVzdF9zZXJ2ZXIuZAppbmRleCA5OTNjMDYzLi5iNTgyMjUzIDEwMDY0NAotLS0gYS9saWIvZC90ZXN0L3RocmlmdF90ZXN0X3NlcnZlci5kCisrKyBiL2xpYi9kL3Rlc3QvdGhyaWZ0X3Rlc3Rfc2VydmVyLmQKQEAgLTE2LDggKzE2LDExIEBACiAgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLworCiBtb2R1bGUgdGhyaWZ0X3Rlc3Rfc2VydmVyOwogCitpbXBvcnQgY29yZS5zdGRjLmVycm5vIDogZXJybm87CitpbXBvcnQgY29yZS5zdGRjLnNpZ25hbCA6IHNpZ25hbCwgc2lnZm5fdCwgU0lHSU5ULCBTSUdfREZMLCBTSUdfRVJSOwogaW1wb3J0IGNvcmUudGhyZWFkIDogZHVyLCBUaHJlYWQ7CiBpbXBvcnQgc3RkLmFsZ29yaXRobTsKIGltcG9ydCBzdGQuZXhjZXB0aW9uIDogZW5mb3JjZTsKQEAgLTQwLDYgKzQzLDcgQEAKIGltcG9ydCB0aHJpZnQudHJhbnNwb3J0LmZyYW1lZDsKIGltcG9ydCB0aHJpZnQudHJhbnNwb3J0Lmh0dHA7CiBpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5zc2w7CitpbXBvcnQgdGhyaWZ0LnV0aWwuY2FuY2VsbGF0aW9uOwogaW1wb3J0IHRocmlmdC51dGlsLmhhc2hzZXQ7CiBpbXBvcnQgdGVzdF91dGlsczsKIApAQCAtODEsNiArODUsMTYgQEAKICAgICByZXR1cm4gdGhpbmc7CiAgIH0KIAorICBvdmVycmlkZSBzdHJpbmcgdGVzdEJpbmFyeShzdHJpbmcgdGhpbmcpIHsKKyAgICBpZiAodHJhY2VfKSB3cml0ZWZsbigidGVzdEJpbmFyeShcIiVzXCIpIiwgdGhpbmcpOworICAgIHJldHVybiB0aGluZzsKKyAgfQorCisgIG92ZXJyaWRlIGJvb2wgdGVzdEJvb2woYm9vbCB0aGluZykgeworICAgIGlmICh0cmFjZV8pIHdyaXRlZmxuKCJ0ZXN0Qm9vbChcIiVzXCIpIiwgdGhpbmcpOworICAgIHJldHVybiB0aGluZzsKKyAgfQorCiAgIG92ZXJyaWRlIFh0cnVjdCB0ZXN0U3RydWN0KHJlZiBjb25zdChYdHJ1Y3QpIHRoaW5nKSB7CiAgICAgaWYgKHRyYWNlXykgd3JpdGVmbG4oInRlc3RTdHJ1Y3Qoe1wiJXNcIiwgJXMsICVzLCAlc30pIiwKICAgICAgIHRoaW5nLnN0cmluZ190aGluZywgdGhpbmcuYnl0ZV90aGluZywgdGhpbmcuaTMyX3RoaW5nLCB0aGluZy5pNjRfdGhpbmcpOwpAQCAtMTMzLDcgKzE0NywxNyBAQAogCiAgIG92ZXJyaWRlIEluc2FuaXR5W051bWJlcnpdW1VzZXJJZF0gdGVzdEluc2FuaXR5KHJlZiBjb25zdChJbnNhbml0eSkgYXJndW1lbnQpIHsKICAgICBpZiAodHJhY2VfKSB3cml0ZWxuKCJ0ZXN0SW5zYW5pdHkoKSIpOwotICAgIHJldHVybiB0ZXN0SW5zYW5pdHlSZXR1cm47CisgICAgSW5zYW5pdHlbTnVtYmVyel1bVXNlcklkXSByZXQ7CisgICAgSW5zYW5pdHlbTnVtYmVyel0gbTE7CisgICAgSW5zYW5pdHlbTnVtYmVyel0gbTI7CisgICAgSW5zYW5pdHkgdG1wOworICAgIHRtcCA9IGNhc3QoSW5zYW5pdHkpYXJndW1lbnQ7CisgICAgbTFbTnVtYmVyei5UV09dID0gdG1wOworICAgIG0xW051bWJlcnouVEhSRUVdID0gdG1wOworICAgIG0yW051bWJlcnouU0lYXSA9IEluc2FuaXR5KCk7CisgICAgcmV0WzFdID0gbTE7CisgICAgcmV0WzJdID0gbTI7CisgICAgcmV0dXJuIHJldDsKICAgfQogCiAgIG92ZXJyaWRlIFh0cnVjdCB0ZXN0TXVsdGkoYnl0ZSBhcmcwLCBpbnQgYXJnMSwgbG9uZyBhcmcyLCBzdHJpbmdbc2hvcnRdIGFyZzMsCkBAIC0xNTAsNiArMTc0LDggQEAKICAgICAgIGUuZXJyb3JDb2RlID0gMTAwMTsKICAgICAgIGUubWVzc2FnZSA9IGFyZzsKICAgICAgIHRocm93IGU7CisgICAgfSBlbHNlIGlmIChhcmcgPT0gIlRFeGNlcHRpb24iKSB7CisgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigpOwogICAgIH0gZWxzZSBpZiAoYXJnID09ICJBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpIHsKICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCk7CiAgICAgfQpAQCAtMTgzLDE0ICsyMDksNDQgQEAKICAgYm9vbCB0cmFjZV87CiB9CiAKK3NoYXJlZChib29sKSBnU2h1dGRvd24gPSBmYWxzZTsKKworbm90aHJvdyBAbm9nYyBleHRlcm4oQykgdm9pZCBoYW5kbGVTaWduYWwoaW50IHNpZykgeworICBnU2h1dGRvd24gPSB0cnVlOworfQorCisvLyBSdW5zIGEgdGhyZWFkIHRoYXQgd2FpdHMgZm9yIHNodXRkb3duIHRvIGJlCisvLyBzaWduYWxlZCBhbmQgdGhlbiB0cmlnZ2VycyBjYW5jZWxsYXRpb24sCisvLyBjYXVzaW5nIHRoZSBzZXJ2ZXIgdG8gc3RvcC4gIFdoaWxlIHdlIGNvdWxkCisvLyB1c2UgYSBzaWduYWxmZCBmb3IgdGhpcyBwdXJwb3NlLCB3ZSBhcmUgaW5zdGVhZAorLy8gb3B0aW5nIGZvciBhIGJ1c3kgd2FpdGluZyBzY2hlbWUgZm9yIG1heGltdW0KKy8vIHBvcnRhYmlsaXR5IHNpbmNlIHNpZ25hbGZkIGlzIGEgbGludXggdGhpbmcuCisKK2NsYXNzIFNodXRkb3duVGhyZWFkIDogVGhyZWFkIHsKKyAgdGhpcyhUQ2FuY2VsbGF0aW9uT3JpZ2luIGNhbmNlbGxhdGlvbikgeworICAgIGNhbmNlbGxhdGlvbl8gPSBjYW5jZWxsYXRpb247CisgICAgc3VwZXIoJnJ1bik7CisgIH0KKyAgCitwcml2YXRlOgorICB2b2lkIHJ1bigpIHsKKyAgICB3aGlsZSAoIWdTaHV0ZG93bikgeworICAgICAgVGhyZWFkLnNsZWVwKGR1ciEoIm1zZWNzIikoMjUpKTsKKyAgICB9CisgICAgY2FuY2VsbGF0aW9uXy50cmlnZ2VyKCk7CisgIH0KKyAgCisgIFRDYW5jZWxsYXRpb25PcmlnaW4gY2FuY2VsbGF0aW9uXzsKK30KKwogdm9pZCBtYWluKHN0cmluZ1tdIGFyZ3MpIHsKICAgdXNob3J0IHBvcnQgPSA5MDkwOwogICBTZXJ2ZXJUeXBlIHNlcnZlclR5cGU7CiAgIFByb3RvY29sVHlwZSBwcm90b2NvbFR5cGU7CiAgIHNpemVfdCBudW1JT1RocmVhZHMgPSAxOwogICBUcmFuc3BvcnRUeXBlIHRyYW5zcG9ydFR5cGU7Ci0gIGJvb2wgc3NsOwotICBib29sIHRyYWNlOworICBib29sIHNzbCA9IGZhbHNlOworICBib29sIHRyYWNlID0gdHJ1ZTsKICAgc2l6ZV90IHRhc2tQb29sU2l6ZSA9IHRvdGFsQ1BVczsKIAogICBnZXRvcHQoYXJncywgInBvcnQiLCAmcG9ydCwgInByb3RvY29sIiwgJnByb3RvY29sVHlwZSwgInNlcnZlci10eXBlIiwKQEAgLTI0NCw4ICszMDAsOCBAQAogICBpZiAoc3NsKSB7CiAgICAgYXV0byBzc2xDb250ZXh0ID0gbmV3IFRTU0xDb250ZXh0KCk7CiAgICAgc3NsQ29udGV4dC5zZXJ2ZXJTaWRlID0gdHJ1ZTsKLSAgICBzc2xDb250ZXh0LmxvYWRDZXJ0aWZpY2F0ZSgiLi9zZXJ2ZXItY2VydGlmaWNhdGUucGVtIik7Ci0gICAgc3NsQ29udGV4dC5sb2FkUHJpdmF0ZUtleSgiLi9zZXJ2ZXItcHJpdmF0ZS1rZXkucGVtIik7CisgICAgc3NsQ29udGV4dC5sb2FkQ2VydGlmaWNhdGUoIi4uLy4uLy4uL3Rlc3Qva2V5cy9zZXJ2ZXIuY3J0Iik7CisgICAgc3NsQ29udGV4dC5sb2FkUHJpdmF0ZUtleSgiLi4vLi4vLi4vdGVzdC9rZXlzL3NlcnZlci5rZXkiKTsKICAgICBzc2xDb250ZXh0LmNpcGhlcnMgPSAiQUxMOiFBREg6IUxPVzohRVhQOiFNRDU6QFNUUkVOR1RIIjsKICAgICBzZXJ2ZXJTb2NrZXQgPSBuZXcgVFNTTFNlcnZlclNvY2tldChwb3J0LCBzc2xDb250ZXh0KTsKICAgfSBlbHNlIHsKQEAgLTI1Nyw4ICszMTMsMjYgQEAKICAgYXV0byBzZXJ2ZXIgPSBjcmVhdGVTZXJ2ZXIoc2VydmVyVHlwZSwgbnVtSU9UaHJlYWRzLCB0YXNrUG9vbFNpemUsCiAgICAgcHJvY2Vzc29yLCBzZXJ2ZXJTb2NrZXQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSk7CiAKKyAgLy8gU2V0IHVwIFNJR0lOVCBzaWduYWwgaGFuZGxpbmcKKyAgc2lnZm5fdCBvbGRIYW5kbGVyID0gc2lnbmFsKFNJR0lOVCwgJmhhbmRsZVNpZ25hbCk7CisgIGVuZm9yY2Uob2xkSGFuZGxlciAhPSBTSUdfRVJSLAorICAgICJDb3VsZCBub3QgcmVwbGFjZSB0aGUgU0lHSU5UIHNpZ25hbCBoYW5kbGVyOiBlcnJubyB7MH0iLmZvcm1hdChlcnJubygpKSk7CisgIAorICAvLyBTZXQgdXAgYSBzZXJ2ZXIgY2FuY2VsbGF0aW9uIHRyaWdnZXIKKyAgYXV0byBjYW5jZWwgPSBuZXcgVENhbmNlbGxhdGlvbk9yaWdpbigpOworCisgIC8vIFNldCB1cCBhIGxpc3RlbmVyIGZvciB0aGUgc2h1dGRvd24gY29uZGl0aW9uIC0gdGhpcyB3aWxsCisgIC8vIHdha2UgdXAgd2hlbiB0aGUgc2lnbmFsIG9jY3VycyBhbmQgdHJpZ2dlciBjYW5jZWxsYXRpb24uCisgIGF1dG8gc2h1dGRvd24gPSBuZXcgU2h1dGRvd25UaHJlYWQoY2FuY2VsKTsKKyAgc2h1dGRvd24uc3RhcnQoKTsKKyAgCisgIC8vIFNlcnZlIGZyb20gdGhpcyB0aHJlYWQ7IHRoZSBzaWduYWwgd2lsbCBzdG9wIHRoZSBzZXJ2ZXIKKyAgLy8gYW5kIGNvbnRyb2wgd2lsbCByZXR1cm4gaGVyZQogICB3cml0ZWZsbigiU3RhcnRpbmcgJXMvJXMgJXMgVGhyaWZ0VGVzdCBzZXJ2ZXIgJXNvbiBwb3J0ICVzLi4uIiwgcHJvdG9jb2xUeXBlLAogICAgIHRyYW5zcG9ydFR5cGUsIHNlcnZlclR5cGUsIHNzbCA/ICIodXNpbmcgU1NMKSAiOiAiIiwgcG9ydCk7Ci0gIHNlcnZlci5zZXJ2ZSgpOworICBzZXJ2ZXIuc2VydmUoY2FuY2VsKTsKKyAgc2h1dGRvd24uam9pbigpOworICBzaWduYWwoU0lHSU5ULCBTSUdfREZMKTsKKyAgICAKICAgd3JpdGVsbigiZG9uZS4iKTsKIH0KZGlmZiAtLWdpdCBhL2xpYi9kL3Rlc3QvdHJhbnNwb3J0X3Rlc3QuZCBiL2xpYi9kL3Rlc3QvdHJhbnNwb3J0X3Rlc3QuZAppbmRleCAwOWJmNmZkLi42MjNlMDNmIDEwMDY0NAotLS0gYS9saWIvZC90ZXN0L3RyYW5zcG9ydF90ZXN0LmQKKysrIGIvbGliL2QvdGVzdC90cmFuc3BvcnRfdGVzdC5kCkBAIC0xNDQsNyArMTQ0LDcgQEAKICAgfQogCiAgIH50aGlzKCkgewotICAgIGNsZWFyKGlubmVyXyk7CisgICAgZGVzdHJveShpbm5lcl8pOwogICB9CiAKIHByaXZhdGU6CmRpZmYgLS1naXQgYS9saWIvZGFydC8uYW5hbHlzaXNfb3B0aW9ucyBiL2xpYi9kYXJ0Ly5hbmFseXNpc19vcHRpb25zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExMGQ0YzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC8uYW5hbHlzaXNfb3B0aW9ucwpAQCAtMCwwICsxLDIgQEAKK2FuYWx5emVyOgorICBzdHJvbmctbW9kZTogdHJ1ZQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvTElDRU5TRSBiL2xpYi9kYXJ0L0xJQ0VOU0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVhY2I2NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L0xJQ0VOU0UKQEAgLTAsMCArMSwxNiBAQAorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKK2Rpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCityZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK3RvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKK3dpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCitodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKK3NwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKK3VuZGVyIHRoZSBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvTWFrZWZpbGUuYW0gYi9saWIvZGFydC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjZkZGMwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwzMyBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2FsbC1sb2NhbDoKKwkkKERBUlRQVUIpIGdldAorCitjbGVhbi1sb2NhbDoKKwkkKFJNKSAtciAucHViCisJZmluZCAuIC10eXBlIGQgLW5hbWUgInBhY2thZ2VzIiB8IHhhcmdzICQoUk0pIC1yCisJZmluZCAuIC10eXBlIGYgLW5hbWUgIi5wYWNrYWdlcyIgfCB4YXJncyAkKFJNKQorCWZpbmQgLiAtdHlwZSBmIC1uYW1lICJwdWJzcGVjLmxvY2siIHwgeGFyZ3MgJChSTSkKKworY2hlY2stbG9jYWw6IGFsbAorCitFWFRSQV9ESVNUID0gXAorCS5hbmFseXNpc19vcHRpb25zCisKZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L1JFQURNRS5tZCBiL2xpYi9kYXJ0L1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmUxNjhiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMjYgQEAKK1RocmlmdCBEYXJ0IExpYnJhcnkKKworTGljZW5zZQorPT09PT09PQorCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCitvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQordG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQord2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKK0tJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCitzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCit1bmRlciB0aGUgTGljZW5zZS4KKworVXNpbmcgVGhyaWZ0IHdpdGggRGFydAorPT09PT09PT09PT09PT09PT09PT0KKworRGFydCAxLjEyLjAgb3IgbmV3ZXIgaXMgcmVxdWlyZWQKZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2NvZGluZ19zdGFuZGFyZHMubWQgYi9saWIvZGFydC9jb2Rpbmdfc3RhbmRhcmRzLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyZjYwMDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9jb2Rpbmdfc3RhbmRhcmRzLm1kCkBAIC0wLDAgKzEsNiBAQAorIyBEYXJ0IENvZGluZyBTdGFuZGFyZHMKKworIyMjIFBsZWFzZSBmb2xsb3c6CisgKiBbVGhyaWZ0IEdlbmVyYWwgQ29kaW5nIFN0YW5kYXJkc10oL2RvYy9jb2Rpbmdfc3RhbmRhcmRzLm1kKQorICogW1VzZSBkYXJ0Zm10XShodHRwczovL3d3dy5kYXJ0bGFuZy5vcmcvdG9vbHMvZGFydGZtdC8pIGFuZCBmb2xsb3cgdGhlIAorICAgW0RhcnQgU3R5bGUgR3VpZGVdKGh0dHBzOi8vd3d3LmRhcnRsYW5nLm9yZy9hcnRpY2xlcy9zdHlsZS1ndWlkZS8pCmRpZmYgLS1naXQgYS9saWIvZGFydC9saWIvc3JjL2Jyb3dzZXIvdF93ZWJfc29ja2V0LmRhcnQgYi9saWIvZGFydC9saWIvc3JjL2Jyb3dzZXIvdF93ZWJfc29ja2V0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc2OTNiMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi9zcmMvYnJvd3Nlci90X3dlYl9zb2NrZXQuZGFydApAQCAtMCwwICsxLDEzMCBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK2xpYnJhcnkgdGhyaWZ0LnNyYy5icm93c2VyOworCitpbXBvcnQgJ2RhcnQ6YXN5bmMnOworaW1wb3J0ICdkYXJ0OmNvbnZlcnQnIHNob3cgQkFTRTY0OworaW1wb3J0ICdkYXJ0Omh0bWwnIHNob3cgQ2xvc2VFdmVudDsKK2ltcG9ydCAnZGFydDpodG1sJyBzaG93IEV2ZW50OworaW1wb3J0ICdkYXJ0Omh0bWwnIHNob3cgTWVzc2FnZUV2ZW50OworaW1wb3J0ICdkYXJ0Omh0bWwnIHNob3cgV2ViU29ja2V0OworaW1wb3J0ICdkYXJ0OnR5cGVkX2RhdGEnIHNob3cgVWludDhMaXN0OworCitpbXBvcnQgJ3BhY2thZ2U6dGhyaWZ0L3RocmlmdC5kYXJ0JzsKKworLy8vIEEgW1RTb2NrZXRdIGJhY2tlZCBieSBhIFtXZWJTb2NrZXRdIGZyb20gZGFydDpodG1sCitjbGFzcyBUV2ViU29ja2V0IGltcGxlbWVudHMgVFNvY2tldCB7CisgIGZpbmFsIFVyaSB1cmw7CisKKyAgZmluYWwgU3RyZWFtQ29udHJvbGxlcjxUU29ja2V0U3RhdGU+IF9vblN0YXRlQ29udHJvbGxlcjsKKyAgU3RyZWFtPFRTb2NrZXRTdGF0ZT4gZ2V0IG9uU3RhdGUgPT4gX29uU3RhdGVDb250cm9sbGVyLnN0cmVhbTsKKworICBmaW5hbCBTdHJlYW1Db250cm9sbGVyPE9iamVjdD4gX29uRXJyb3JDb250cm9sbGVyOworICBTdHJlYW08T2JqZWN0PiBnZXQgb25FcnJvciA9PiBfb25FcnJvckNvbnRyb2xsZXIuc3RyZWFtOworCisgIGZpbmFsIFN0cmVhbUNvbnRyb2xsZXI8VWludDhMaXN0PiBfb25NZXNzYWdlQ29udHJvbGxlcjsKKyAgU3RyZWFtPFVpbnQ4TGlzdD4gZ2V0IG9uTWVzc2FnZSA9PiBfb25NZXNzYWdlQ29udHJvbGxlci5zdHJlYW07CisKKyAgZmluYWwgTGlzdDxVaW50OExpc3Q+IF9yZXF1ZXN0cyA9IFtdOworCisgIFRXZWJTb2NrZXQodGhpcy51cmwpCisgICAgICA6IF9vblN0YXRlQ29udHJvbGxlciA9IG5ldyBTdHJlYW1Db250cm9sbGVyLmJyb2FkY2FzdCgpLAorICAgICAgICBfb25FcnJvckNvbnRyb2xsZXIgPSBuZXcgU3RyZWFtQ29udHJvbGxlci5icm9hZGNhc3QoKSwKKyAgICAgICAgX29uTWVzc2FnZUNvbnRyb2xsZXIgPSBuZXcgU3RyZWFtQ29udHJvbGxlci5icm9hZGNhc3QoKSB7CisgICAgaWYgKHVybCA9PSBudWxsIHx8ICF1cmwuaGFzQXV0aG9yaXR5IHx8ICF1cmwuaGFzUG9ydCkgeworICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoJ0ludmFsaWQgdXJsJyk7CisgICAgfQorICB9CisKKyAgV2ViU29ja2V0IF9zb2NrZXQ7CisKKyAgYm9vbCBnZXQgaXNPcGVuID0+IF9zb2NrZXQgIT0gbnVsbCAmJiBfc29ja2V0LnJlYWR5U3RhdGUgPT0gV2ViU29ja2V0Lk9QRU47CisKKyAgYm9vbCBnZXQgaXNDbG9zZWQgPT4KKyAgICAgIF9zb2NrZXQgPT0gbnVsbCB8fCBfc29ja2V0LnJlYWR5U3RhdGUgPT0gV2ViU29ja2V0LkNMT1NFRDsKKworICBGdXR1cmUgb3BlbigpIHsKKyAgICBpZiAoIWlzQ2xvc2VkKSB7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEVycm9yKAorICAgICAgICAgIFRUcmFuc3BvcnRFcnJvclR5cGUuQUxSRUFEWV9PUEVOLCAnU29ja2V0IGFscmVhZHkgY29ubmVjdGVkJyk7CisgICAgfQorCisgICAgX3NvY2tldCA9IG5ldyBXZWJTb2NrZXQodXJsLnRvU3RyaW5nKCkpOworICAgIF9zb2NrZXQub25FcnJvci5saXN0ZW4oX29uRXJyb3IpOworICAgIF9zb2NrZXQub25PcGVuLmxpc3Rlbihfb25PcGVuKTsKKyAgICBfc29ja2V0Lm9uQ2xvc2UubGlzdGVuKF9vbkNsb3NlKTsKKyAgICBfc29ja2V0Lm9uTWVzc2FnZS5saXN0ZW4oX29uTWVzc2FnZSk7CisKKyAgICByZXR1cm4gX3NvY2tldC5vbk9wZW4uZmlyc3Q7CisgIH0KKworICBGdXR1cmUgY2xvc2UoKSB7CisgICAgaWYgKF9zb2NrZXQgIT0gbnVsbCkgeworICAgICAgX3NvY2tldC5jbG9zZSgpOworICAgICAgcmV0dXJuIF9zb2NrZXQub25DbG9zZS5maXJzdDsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIG5ldyBGdXR1cmUudmFsdWUoKTsKKyAgICB9CisgIH0KKworICB2b2lkIHNlbmQoVWludDhMaXN0IGRhdGEpIHsKKyAgICBfcmVxdWVzdHMuYWRkKGRhdGEpOworICAgIF9zZW5kUmVxdWVzdHMoKTsKKyAgfQorCisgIHZvaWQgX3NlbmRSZXF1ZXN0cygpIHsKKyAgICB3aGlsZSAoaXNPcGVuICYmIF9yZXF1ZXN0cy5pc05vdEVtcHR5KSB7CisgICAgICBVaW50OExpc3QgZGF0YSA9IF9yZXF1ZXN0cy5yZW1vdmVBdCgwKTsKKyAgICAgIF9zb2NrZXQuc2VuZFN0cmluZyhCQVNFNjQuZW5jb2RlKGRhdGEpKTsKKyAgICB9CisgIH0KKworICB2b2lkIF9vbk9wZW4oRXZlbnQgZXZlbnQpIHsKKyAgICBfb25TdGF0ZUNvbnRyb2xsZXIuYWRkKFRTb2NrZXRTdGF0ZS5PUEVOKTsKKyAgICBfc2VuZFJlcXVlc3RzKCk7CisgIH0KKworICB2b2lkIF9vbkNsb3NlKENsb3NlRXZlbnQgZXZlbnQpIHsKKyAgICBfc29ja2V0ID0gbnVsbDsKKworICAgIGlmIChfcmVxdWVzdHMuaXNOb3RFbXB0eSkgeworICAgICAgX29uRXJyb3JDb250cm9sbGVyCisgICAgICAgICAgLmFkZChuZXcgU3RhdGVFcnJvcignU29ja2V0IHdhcyBjbG9zZWQgd2l0aCBwZW5kaW5nIHJlcXVlc3RzJykpOworICAgIH0KKyAgICBfcmVxdWVzdHMuY2xlYXIoKTsKKworICAgIF9vblN0YXRlQ29udHJvbGxlci5hZGQoVFNvY2tldFN0YXRlLkNMT1NFRCk7CisgIH0KKworICB2b2lkIF9vbk1lc3NhZ2UoTWVzc2FnZUV2ZW50IG1lc3NhZ2UpIHsKKyAgICB0cnkgeworICAgICAgVWludDhMaXN0IGRhdGEgPQorICAgICAgICAgIG5ldyBVaW50OExpc3QuZnJvbUxpc3QoQkFTRTY0LmRlY29kZShtZXNzYWdlLmRhdGEpKTsKKyAgICAgIF9vbk1lc3NhZ2VDb250cm9sbGVyLmFkZChkYXRhKTsKKyAgICB9IG9uIEZvcm1hdEV4Y2VwdGlvbiBjYXRjaCAoXykgeworICAgICAgdmFyIGVycm9yID0gbmV3IFRQcm90b2NvbEVycm9yKFRQcm90b2NvbEVycm9yVHlwZS5JTlZBTElEX0RBVEEsCisgICAgICAgICAgIkV4cGVjdGVkIGEgQmFzZSA2NCBlbmNvZGVkIHN0cmluZy4iKTsKKyAgICAgIF9vbkVycm9yQ29udHJvbGxlci5hZGQoZXJyb3IpOworICAgIH0KKyAgfQorCisgIHZvaWQgX29uRXJyb3IoRXZlbnQgZXZlbnQpIHsKKyAgICBjbG9zZSgpOworICAgIF9vbkVycm9yQ29udHJvbGxlci5hZGQoZXZlbnQudG9TdHJpbmcoKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi9zcmMvY29uc29sZS90X3RjcF9zb2NrZXQuZGFydCBiL2xpYi9kYXJ0L2xpYi9zcmMvY29uc29sZS90X3RjcF9zb2NrZXQuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzE0ODAzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3NyYy9jb25zb2xlL3RfdGNwX3NvY2tldC5kYXJ0CkBAIC0wLDAgKzEsODEgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitsaWJyYXJ5IHRocmlmdC5zcmMuY29uc29sZS50X3RjcF9zb2NrZXQ7CisKK2ltcG9ydCAnZGFydDphc3luYyc7CitpbXBvcnQgJ2RhcnQ6aW8nOworaW1wb3J0ICdkYXJ0OnR5cGVkX2RhdGEnIHNob3cgVWludDhMaXN0OworCitpbXBvcnQgJ3BhY2thZ2U6dGhyaWZ0L3RocmlmdC5kYXJ0JzsKKworLy8vIEEgW1RTb2NrZXRdIGJhY2tlZCBieSBhIFtTb2NrZXRdIGZyb20gZGFydDppbworY2xhc3MgVFRjcFNvY2tldCBpbXBsZW1lbnRzIFRTb2NrZXQgeworICBmaW5hbCBTdHJlYW1Db250cm9sbGVyPFRTb2NrZXRTdGF0ZT4gX29uU3RhdGVDb250cm9sbGVyOworICBTdHJlYW08VFNvY2tldFN0YXRlPiBnZXQgb25TdGF0ZSA9PiBfb25TdGF0ZUNvbnRyb2xsZXIuc3RyZWFtOworCisgIGZpbmFsIFN0cmVhbUNvbnRyb2xsZXI8T2JqZWN0PiBfb25FcnJvckNvbnRyb2xsZXI7CisgIFN0cmVhbTxPYmplY3Q+IGdldCBvbkVycm9yID0+IF9vbkVycm9yQ29udHJvbGxlci5zdHJlYW07CisKKyAgZmluYWwgU3RyZWFtQ29udHJvbGxlcjxVaW50OExpc3Q+IF9vbk1lc3NhZ2VDb250cm9sbGVyOworICBTdHJlYW08VWludDhMaXN0PiBnZXQgb25NZXNzYWdlID0+IF9vbk1lc3NhZ2VDb250cm9sbGVyLnN0cmVhbTsKKworICBUVGNwU29ja2V0KFNvY2tldCBzb2NrZXQpCisgICAgICA6IF9vblN0YXRlQ29udHJvbGxlciA9IG5ldyBTdHJlYW1Db250cm9sbGVyLmJyb2FkY2FzdCgpLAorICAgICAgICBfb25FcnJvckNvbnRyb2xsZXIgPSBuZXcgU3RyZWFtQ29udHJvbGxlci5icm9hZGNhc3QoKSwKKyAgICAgICAgX29uTWVzc2FnZUNvbnRyb2xsZXIgPSBuZXcgU3RyZWFtQ29udHJvbGxlci5icm9hZGNhc3QoKSB7CisgICAgaWYgKHNvY2tldCA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvci5ub3ROdWxsKCdzb2NrZXQnKTsKKyAgICB9CisKKyAgICBfc29ja2V0ID0gc29ja2V0OworICAgIF9zb2NrZXQubGlzdGVuKF9vbk1lc3NhZ2UsIG9uRXJyb3I6IF9vbkVycm9yLCBvbkRvbmU6IGNsb3NlKTsKKyAgfQorCisgIFNvY2tldCBfc29ja2V0OworCisgIGJvb2wgZ2V0IGlzT3BlbiA9PiBfc29ja2V0ICE9IG51bGw7CisKKyAgYm9vbCBnZXQgaXNDbG9zZWQgPT4gX3NvY2tldCA9PSBudWxsOworCisgIEZ1dHVyZSBvcGVuKCkgYXN5bmMgeworICAgIF9vblN0YXRlQ29udHJvbGxlci5hZGQoVFNvY2tldFN0YXRlLk9QRU4pOworICB9CisKKyAgRnV0dXJlIGNsb3NlKCkgYXN5bmMgeworICAgIGlmIChfc29ja2V0ICE9IG51bGwpIHsKKyAgICAgIGF3YWl0IF9zb2NrZXQuY2xvc2UoKTsKKyAgICAgIF9zb2NrZXQgPSBudWxsOworICAgIH0KKworICAgIF9vblN0YXRlQ29udHJvbGxlci5hZGQoVFNvY2tldFN0YXRlLkNMT1NFRCk7CisgIH0KKworICB2b2lkIHNlbmQoVWludDhMaXN0IGRhdGEpIHsKKyAgICBfc29ja2V0LmFkZChkYXRhKTsKKyAgfQorCisgIHZvaWQgX29uTWVzc2FnZShMaXN0PGludD4gbWVzc2FnZSkgeworICAgIFVpbnQ4TGlzdCBkYXRhID0gbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChtZXNzYWdlKTsKKyAgICBfb25NZXNzYWdlQ29udHJvbGxlci5hZGQoZGF0YSk7CisgIH0KKworICB2b2lkIF9vbkVycm9yKE9iamVjdCBlcnJvcikgeworICAgIGNsb3NlKCk7CisgICAgX29uRXJyb3JDb250cm9sbGVyLmFkZCgnJGVycm9yJyk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi9zcmMvY29uc29sZS90X3dlYl9zb2NrZXQuZGFydCBiL2xpYi9kYXJ0L2xpYi9zcmMvY29uc29sZS90X3dlYl9zb2NrZXQuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWQ3Mjg0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3NyYy9jb25zb2xlL3Rfd2ViX3NvY2tldC5kYXJ0CkBAIC0wLDAgKzEsODkgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitsaWJyYXJ5IHRocmlmdC5zcmMuY29uc29sZS50X3dlYl9zb2NrZXQ7CisKK2ltcG9ydCAnZGFydDphc3luYyc7CitpbXBvcnQgJ2RhcnQ6Y29udmVydCcgc2hvdyBCQVNFNjQ7CitpbXBvcnQgJ2RhcnQ6aW8nOworaW1wb3J0ICdkYXJ0OnR5cGVkX2RhdGEnIHNob3cgVWludDhMaXN0OworCitpbXBvcnQgJ3BhY2thZ2U6dGhyaWZ0L3RocmlmdC5kYXJ0JzsKKworLy8vIEEgW1RTb2NrZXRdIGJhY2tlZCBieSBhIFtXZWJTb2NrZXRdIGZyb20gZGFydDppbworY2xhc3MgVFdlYlNvY2tldCBpbXBsZW1lbnRzIFRTb2NrZXQgeworICBmaW5hbCBTdHJlYW1Db250cm9sbGVyPFRTb2NrZXRTdGF0ZT4gX29uU3RhdGVDb250cm9sbGVyOworICBTdHJlYW08VFNvY2tldFN0YXRlPiBnZXQgb25TdGF0ZSA9PiBfb25TdGF0ZUNvbnRyb2xsZXIuc3RyZWFtOworCisgIGZpbmFsIFN0cmVhbUNvbnRyb2xsZXI8T2JqZWN0PiBfb25FcnJvckNvbnRyb2xsZXI7CisgIFN0cmVhbTxPYmplY3Q+IGdldCBvbkVycm9yID0+IF9vbkVycm9yQ29udHJvbGxlci5zdHJlYW07CisKKyAgZmluYWwgU3RyZWFtQ29udHJvbGxlcjxVaW50OExpc3Q+IF9vbk1lc3NhZ2VDb250cm9sbGVyOworICBTdHJlYW08VWludDhMaXN0PiBnZXQgb25NZXNzYWdlID0+IF9vbk1lc3NhZ2VDb250cm9sbGVyLnN0cmVhbTsKKworICBUV2ViU29ja2V0KFdlYlNvY2tldCBzb2NrZXQpCisgICAgICA6IF9vblN0YXRlQ29udHJvbGxlciA9IG5ldyBTdHJlYW1Db250cm9sbGVyLmJyb2FkY2FzdCgpLAorICAgICAgICBfb25FcnJvckNvbnRyb2xsZXIgPSBuZXcgU3RyZWFtQ29udHJvbGxlci5icm9hZGNhc3QoKSwKKyAgICAgICAgX29uTWVzc2FnZUNvbnRyb2xsZXIgPSBuZXcgU3RyZWFtQ29udHJvbGxlci5icm9hZGNhc3QoKSB7CisgICAgaWYgKHNvY2tldCA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvci5ub3ROdWxsKCdzb2NrZXQnKTsKKyAgICB9CisKKyAgICBfc29ja2V0ID0gc29ja2V0OworICAgIF9zb2NrZXQubGlzdGVuKF9vbk1lc3NhZ2UsIG9uRXJyb3I6IF9vbkVycm9yLCBvbkRvbmU6IGNsb3NlKTsKKyAgfQorCisgIFdlYlNvY2tldCBfc29ja2V0OworCisgIGJvb2wgZ2V0IGlzT3BlbiA9PiBfc29ja2V0ICE9IG51bGw7CisKKyAgYm9vbCBnZXQgaXNDbG9zZWQgPT4gX3NvY2tldCA9PSBudWxsOworCisgIEZ1dHVyZSBvcGVuKCkgYXN5bmMgeworICAgIF9vblN0YXRlQ29udHJvbGxlci5hZGQoVFNvY2tldFN0YXRlLk9QRU4pOworICB9CisKKyAgRnV0dXJlIGNsb3NlKCkgYXN5bmMgeworICAgIGlmIChfc29ja2V0ICE9IG51bGwpIHsKKyAgICAgIGF3YWl0IF9zb2NrZXQuY2xvc2UoKTsKKyAgICAgIF9zb2NrZXQgPSBudWxsOworICAgIH0KKworICAgIF9vblN0YXRlQ29udHJvbGxlci5hZGQoVFNvY2tldFN0YXRlLkNMT1NFRCk7CisgIH0KKworICB2b2lkIHNlbmQoVWludDhMaXN0IGRhdGEpIHsKKyAgICBfc29ja2V0LmFkZChCQVNFNjQuZW5jb2RlKGRhdGEpKTsKKyAgfQorCisgIHZvaWQgX29uTWVzc2FnZShTdHJpbmcgbWVzc2FnZSkgeworICAgIHRyeSB7CisgICAgICBVaW50OExpc3QgZGF0YSA9CisgICAgICAgICAgbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChCQVNFNjQuZGVjb2RlKG1lc3NhZ2UpKTsKKyAgICAgIF9vbk1lc3NhZ2VDb250cm9sbGVyLmFkZChkYXRhKTsKKyAgICB9IG9uIEZvcm1hdEV4Y2VwdGlvbiBjYXRjaCAoXykgeworICAgICAgdmFyIGVycm9yID0gbmV3IFRQcm90b2NvbEVycm9yKFRQcm90b2NvbEVycm9yVHlwZS5JTlZBTElEX0RBVEEsCisgICAgICAgICAgIkV4cGVjdGVkIGEgQmFzZSA2NCBlbmNvZGVkIHN0cmluZy4iKTsKKyAgICAgIF9vbkVycm9yQ29udHJvbGxlci5hZGQoZXJyb3IpOworICAgIH0KKyAgfQorCisgIHZvaWQgX29uRXJyb3IoT2JqZWN0IGVycm9yKSB7CisgICAgY2xvc2UoKTsKKyAgICBfb25FcnJvckNvbnRyb2xsZXIuYWRkKCckZXJyb3InKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X2JpbmFyeV9wcm90b2NvbC5kYXJ0IGIvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X2JpbmFyeV9wcm90b2NvbC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3ODVkODEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfYmluYXJ5X3Byb3RvY29sLmRhcnQKQEAgLTAsMCArMSwyODEgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYXJ0IG9mIHRocmlmdDsKKworY2xhc3MgVEJpbmFyeVByb3RvY29sRmFjdG9yeSBpbXBsZW1lbnRzIFRQcm90b2NvbEZhY3Rvcnk8VEJpbmFyeVByb3RvY29sPiB7CisgIFRCaW5hcnlQcm90b2NvbEZhY3Rvcnkoe3RoaXMuc3RyaWN0UmVhZDogZmFsc2UsIHRoaXMuc3RyaWN0V3JpdGU6IHRydWV9KTsKKworICBmaW5hbCBib29sIHN0cmljdFJlYWQ7CisgIGZpbmFsIGJvb2wgc3RyaWN0V3JpdGU7CisKKyAgVEJpbmFyeVByb3RvY29sIGdldFByb3RvY29sKFRUcmFuc3BvcnQgdHJhbnNwb3J0KSB7CisgICAgcmV0dXJuIG5ldyBUQmluYXJ5UHJvdG9jb2wodHJhbnNwb3J0LAorICAgICAgICBzdHJpY3RSZWFkOiBzdHJpY3RSZWFkLCBzdHJpY3RXcml0ZTogc3RyaWN0V3JpdGUpOworICB9Cit9CisKKy8vLyBCaW5hcnkgcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gZm9yIFRocmlmdC4KKy8vLworLy8vIEFkYXB0ZWQgZnJvbSB0aGUgQyMgdmVyc2lvbi4KK2NsYXNzIFRCaW5hcnlQcm90b2NvbCBleHRlbmRzIFRQcm90b2NvbCB7CisgIHN0YXRpYyBjb25zdCBpbnQgVkVSU0lPTl9NQVNLID0gMHhmZmZmMDAwMDsKKyAgc3RhdGljIGNvbnN0IGludCBWRVJTSU9OXzEgPSAweDgwMDEwMDAwOworCisgIHN0YXRpYyBjb25zdCBVdGY4Q29kZWMgX3V0ZjhDb2RlYyA9IGNvbnN0IFV0ZjhDb2RlYygpOworCisgIGZpbmFsIGJvb2wgc3RyaWN0UmVhZDsKKyAgZmluYWwgYm9vbCBzdHJpY3RXcml0ZTsKKworICBUQmluYXJ5UHJvdG9jb2woVFRyYW5zcG9ydCB0cmFuc3BvcnQsCisgICAgICB7dGhpcy5zdHJpY3RSZWFkOiBmYWxzZSwgdGhpcy5zdHJpY3RXcml0ZTogdHJ1ZX0pCisgICAgICA6IHN1cGVyKHRyYW5zcG9ydCk7CisKKyAgLy8vIHdyaXRlCisgIHZvaWQgd3JpdGVNZXNzYWdlQmVnaW4oVE1lc3NhZ2UgbWVzc2FnZSkgeworICAgIGlmIChzdHJpY3RXcml0ZSkgeworICAgICAgaW50IHZlcnNpb24gPSBWRVJTSU9OXzEgfCBtZXNzYWdlLnR5cGU7CisgICAgICB3cml0ZUkzMih2ZXJzaW9uKTsKKyAgICAgIHdyaXRlU3RyaW5nKG1lc3NhZ2UubmFtZSk7CisgICAgICB3cml0ZUkzMihtZXNzYWdlLnNlcWlkKTsKKyAgICB9IGVsc2UgeworICAgICAgd3JpdGVTdHJpbmcobWVzc2FnZS5uYW1lKTsKKyAgICAgIHdyaXRlQnl0ZShtZXNzYWdlLnR5cGUpOworICAgICAgd3JpdGVJMzIobWVzc2FnZS5zZXFpZCk7CisgICAgfQorICB9CisKKyAgdm9pZCB3cml0ZU1lc3NhZ2VFbmQoKSB7fQorCisgIHZvaWQgd3JpdGVTdHJ1Y3RCZWdpbihUU3RydWN0IHN0cnVjdCkge30KKworICB2b2lkIHdyaXRlU3RydWN0RW5kKCkge30KKworICB2b2lkIHdyaXRlRmllbGRCZWdpbihURmllbGQgZmllbGQpIHsKKyAgICB3cml0ZUJ5dGUoZmllbGQudHlwZSk7CisgICAgd3JpdGVJMTYoZmllbGQuaWQpOworICB9CisKKyAgdm9pZCB3cml0ZUZpZWxkRW5kKCkge30KKworICB2b2lkIHdyaXRlRmllbGRTdG9wKCkgeworICAgIHdyaXRlQnl0ZShUVHlwZS5TVE9QKTsKKyAgfQorCisgIHZvaWQgd3JpdGVNYXBCZWdpbihUTWFwIG1hcCkgeworICAgIHdyaXRlQnl0ZShtYXAua2V5VHlwZSk7CisgICAgd3JpdGVCeXRlKG1hcC52YWx1ZVR5cGUpOworICAgIHdyaXRlSTMyKG1hcC5sZW5ndGgpOworICB9CisKKyAgdm9pZCB3cml0ZU1hcEVuZCgpIHt9CisKKyAgdm9pZCB3cml0ZUxpc3RCZWdpbihUTGlzdCBsaXN0KSB7CisgICAgd3JpdGVCeXRlKGxpc3QuZWxlbWVudFR5cGUpOworICAgIHdyaXRlSTMyKGxpc3QubGVuZ3RoKTsKKyAgfQorCisgIHZvaWQgd3JpdGVMaXN0RW5kKCkge30KKworICB2b2lkIHdyaXRlU2V0QmVnaW4oVFNldCBzZXQpIHsKKyAgICB3cml0ZUJ5dGUoc2V0LmVsZW1lbnRUeXBlKTsKKyAgICB3cml0ZUkzMihzZXQubGVuZ3RoKTsKKyAgfQorCisgIHZvaWQgd3JpdGVTZXRFbmQoKSB7fQorCisgIHZvaWQgd3JpdGVCb29sKGJvb2wgYikgeworICAgIGlmIChiID09IG51bGwpIGIgPSBmYWxzZTsKKyAgICB3cml0ZUJ5dGUoYiA/IDEgOiAwKTsKKyAgfQorCisgIGZpbmFsIEJ5dGVEYXRhIF9ieXRlT3V0ID0gbmV3IEJ5dGVEYXRhKDEpOworICB2b2lkIHdyaXRlQnl0ZShpbnQgYnl0ZSkgeworICAgIGlmIChieXRlID09IG51bGwpIGJ5dGUgPSAwOworICAgIF9ieXRlT3V0LnNldFVpbnQ4KDAsIGJ5dGUpOworICAgIHRyYW5zcG9ydC53cml0ZShfYnl0ZU91dC5idWZmZXIuYXNVaW50OExpc3QoKSwgMCwgMSk7CisgIH0KKworICBmaW5hbCBCeXRlRGF0YSBfaTE2T3V0ID0gbmV3IEJ5dGVEYXRhKDIpOworICB2b2lkIHdyaXRlSTE2KGludCBpMTYpIHsKKyAgICBpZiAoaTE2ID09IG51bGwpIGkxNiA9IDA7CisgICAgX2kxNk91dC5zZXRJbnQxNigwLCBpMTYpOworICAgIHRyYW5zcG9ydC53cml0ZShfaTE2T3V0LmJ1ZmZlci5hc1VpbnQ4TGlzdCgpLCAwLCAyKTsKKyAgfQorCisgIGZpbmFsIEJ5dGVEYXRhIF9pMzJPdXQgPSBuZXcgQnl0ZURhdGEoNCk7CisgIHZvaWQgd3JpdGVJMzIoaW50IGkzMikgeworICAgIGlmIChpMzIgPT0gbnVsbCkgaTMyID0gMDsKKyAgICBfaTMyT3V0LnNldEludDMyKDAsIGkzMik7CisgICAgdHJhbnNwb3J0LndyaXRlKF9pMzJPdXQuYnVmZmVyLmFzVWludDhMaXN0KCksIDAsIDQpOworICB9CisKKyAgZmluYWwgVWludDhMaXN0IF9pNjRPdXQgPSBuZXcgVWludDhMaXN0KDgpOworICB2b2lkIHdyaXRlSTY0KGludCBpNjQpIHsKKyAgICBpZiAoaTY0ID09IG51bGwpIGk2NCA9IDA7CisgICAgdmFyIGkgPSBuZXcgSW50NjQoaTY0KTsKKyAgICB2YXIgYnRzID0gaS50b0J5dGVzKCk7CisgICAgZm9yICh2YXIgaiA9IDA7IGogPCA4OyBqKyspIHsKKyAgICAgIF9pNjRPdXRbal0gPSBidHNbOCAtIGogLSAxXTsKKyAgICB9CisgICAgdHJhbnNwb3J0LndyaXRlKF9pNjRPdXQsIDAsIDgpOworICB9CisKKyAgdm9pZCB3cml0ZVN0cmluZyhTdHJpbmcgcykgeworICAgIHZhciBieXRlcyA9IHMgIT0gbnVsbCA/IF91dGY4Q29kZWMuZW5jb2RlKHMpIDogbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChbXSk7CisgICAgd3JpdGVJMzIoYnl0ZXMubGVuZ3RoKTsKKyAgICB0cmFuc3BvcnQud3JpdGUoYnl0ZXMsIDAsIGJ5dGVzLmxlbmd0aCk7CisgIH0KKworICBmaW5hbCBCeXRlRGF0YSBfZG91YmxlT3V0ID0gbmV3IEJ5dGVEYXRhKDgpOworICB2b2lkIHdyaXRlRG91YmxlKGRvdWJsZSBkKSB7CisgICAgaWYgKGQgPT0gbnVsbCkgZCA9IDAuMDsKKyAgICBfZG91YmxlT3V0LnNldEZsb2F0NjQoMCwgZCk7CisgICAgdHJhbnNwb3J0LndyaXRlKF9kb3VibGVPdXQuYnVmZmVyLmFzVWludDhMaXN0KCksIDAsIDgpOworICB9CisKKyAgdm9pZCB3cml0ZUJpbmFyeShVaW50OExpc3QgYnl0ZXMpIHsKKyAgICB2YXIgbGVuZ3RoID0gYnl0ZXMubGVuZ3RoOworICAgIHdyaXRlSTMyKGxlbmd0aCk7CisgICAgdHJhbnNwb3J0LndyaXRlKGJ5dGVzLCAwLCBsZW5ndGgpOworICB9CisKKyAgLy8vIHJlYWQKKyAgVE1lc3NhZ2UgcmVhZE1lc3NhZ2VCZWdpbigpIHsKKyAgICBTdHJpbmcgbmFtZTsKKyAgICBpbnQgdHlwZTsKKyAgICBpbnQgc2VxaWQ7CisKKyAgICBpbnQgc2l6ZSA9IHJlYWRJMzIoKTsKKyAgICBpZiAoc2l6ZSA8IDApIHsKKyAgICAgIGludCB2ZXJzaW9uID0gc2l6ZSAmIFZFUlNJT05fTUFTSzsKKyAgICAgIGlmICh2ZXJzaW9uICE9IFZFUlNJT05fMSkgeworICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXJyb3IoVFByb3RvY29sRXJyb3JUeXBlLkJBRF9WRVJTSU9OLAorICAgICAgICAgICAgIkJhZCB2ZXJzaW9uIGluIHJlYWRNZXNzYWdlQmVnaW46ICR2ZXJzaW9uIik7CisgICAgICB9CisgICAgICB0eXBlID0gc2l6ZSAmIDB4MDAwMDAwZmY7CisgICAgICBuYW1lID0gcmVhZFN0cmluZygpOworICAgICAgc2VxaWQgPSByZWFkSTMyKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChzdHJpY3RSZWFkKSB7CisgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFcnJvcihUUHJvdG9jb2xFcnJvclR5cGUuQkFEX1ZFUlNJT04sCisgICAgICAgICAgICAiTWlzc2luZyB2ZXJzaW9uIGluIHJlYWRNZXNzYWdlQmVnaW4iKTsKKyAgICAgIH0KKyAgICAgIG5hbWUgPSBfcmVhZFN0cmluZyhzaXplKTsKKyAgICAgIHR5cGUgPSByZWFkQnl0ZSgpOworICAgICAgc2VxaWQgPSByZWFkSTMyKCk7CisgICAgfQorICAgIHJldHVybiBuZXcgVE1lc3NhZ2UobmFtZSwgdHlwZSwgc2VxaWQpOworICB9CisKKyAgdm9pZCByZWFkTWVzc2FnZUVuZCgpIHt9CisKKyAgVFN0cnVjdCByZWFkU3RydWN0QmVnaW4oKSB7CisgICAgcmV0dXJuIG5ldyBUU3RydWN0KCk7CisgIH0KKworICB2b2lkIHJlYWRTdHJ1Y3RFbmQoKSB7fQorCisgIFRGaWVsZCByZWFkRmllbGRCZWdpbigpIHsKKyAgICBTdHJpbmcgbmFtZSA9ICIiOworICAgIGludCB0eXBlID0gcmVhZEJ5dGUoKTsKKyAgICBpbnQgaWQgPSB0eXBlICE9IFRUeXBlLlNUT1AgPyByZWFkSTE2KCkgOiAwOworCisgICAgcmV0dXJuIG5ldyBURmllbGQobmFtZSwgdHlwZSwgaWQpOworICB9CisKKyAgdm9pZCByZWFkRmllbGRFbmQoKSB7fQorCisgIFRNYXAgcmVhZE1hcEJlZ2luKCkgeworICAgIGludCBrZXlUeXBlID0gcmVhZEJ5dGUoKTsKKyAgICBpbnQgdmFsdWVUeXBlID0gcmVhZEJ5dGUoKTsKKyAgICBpbnQgbGVuZ3RoID0gcmVhZEkzMigpOworCisgICAgcmV0dXJuIG5ldyBUTWFwKGtleVR5cGUsIHZhbHVlVHlwZSwgbGVuZ3RoKTsKKyAgfQorCisgIHZvaWQgcmVhZE1hcEVuZCgpIHt9CisKKyAgVExpc3QgcmVhZExpc3RCZWdpbigpIHsKKyAgICBpbnQgZWxlbWVudFR5cGUgPSByZWFkQnl0ZSgpOworICAgIGludCBsZW5ndGggPSByZWFkSTMyKCk7CisKKyAgICByZXR1cm4gbmV3IFRMaXN0KGVsZW1lbnRUeXBlLCBsZW5ndGgpOworICB9CisKKyAgdm9pZCByZWFkTGlzdEVuZCgpIHt9CisKKyAgVFNldCByZWFkU2V0QmVnaW4oKSB7CisgICAgaW50IGVsZW1lbnRUeXBlID0gcmVhZEJ5dGUoKTsKKyAgICBpbnQgbGVuZ3RoID0gcmVhZEkzMigpOworCisgICAgcmV0dXJuIG5ldyBUU2V0KGVsZW1lbnRUeXBlLCBsZW5ndGgpOworICB9CisKKyAgdm9pZCByZWFkU2V0RW5kKCkge30KKworICBib29sIHJlYWRCb29sKCkgPT4gcmVhZEJ5dGUoKSA9PSAxOworCisgIGZpbmFsIFVpbnQ4TGlzdCBfYnl0ZUluID0gbmV3IFVpbnQ4TGlzdCgxKTsKKyAgaW50IHJlYWRCeXRlKCkgeworICAgIHRyYW5zcG9ydC5yZWFkQWxsKF9ieXRlSW4sIDAsIDEpOworICAgIHJldHVybiBfYnl0ZUluLmJ1ZmZlci5hc0J5dGVEYXRhKCkuZ2V0VWludDgoMCk7CisgIH0KKworICBmaW5hbCBVaW50OExpc3QgX2kxNkluID0gbmV3IFVpbnQ4TGlzdCgyKTsKKyAgaW50IHJlYWRJMTYoKSB7CisgICAgdHJhbnNwb3J0LnJlYWRBbGwoX2kxNkluLCAwLCAyKTsKKyAgICByZXR1cm4gX2kxNkluLmJ1ZmZlci5hc0J5dGVEYXRhKCkuZ2V0SW50MTYoMCk7CisgIH0KKworICBmaW5hbCBVaW50OExpc3QgX2kzMkluID0gbmV3IFVpbnQ4TGlzdCg0KTsKKyAgaW50IHJlYWRJMzIoKSB7CisgICAgdHJhbnNwb3J0LnJlYWRBbGwoX2kzMkluLCAwLCA0KTsKKyAgICByZXR1cm4gX2kzMkluLmJ1ZmZlci5hc0J5dGVEYXRhKCkuZ2V0SW50MzIoMCk7CisgIH0KKworICBmaW5hbCBVaW50OExpc3QgX2k2NEluID0gbmV3IFVpbnQ4TGlzdCg4KTsKKyAgaW50IHJlYWRJNjQoKSB7CisgICAgdHJhbnNwb3J0LnJlYWRBbGwoX2k2NEluLCAwLCA4KTsKKyAgICB2YXIgaSA9IG5ldyBJbnQ2NC5mcm9tQnl0ZXNCaWdFbmRpYW4oX2k2NEluKTsKKyAgICByZXR1cm4gaS50b0ludCgpOworICB9CisKKyAgZmluYWwgVWludDhMaXN0IF9kb3VibGVJbiA9IG5ldyBVaW50OExpc3QoOCk7CisgIGRvdWJsZSByZWFkRG91YmxlKCkgeworICAgIHRyYW5zcG9ydC5yZWFkQWxsKF9kb3VibGVJbiwgMCwgOCk7CisgICAgcmV0dXJuIF9kb3VibGVJbi5idWZmZXIuYXNCeXRlRGF0YSgpLmdldEZsb2F0NjQoMCk7CisgIH0KKworICBTdHJpbmcgcmVhZFN0cmluZygpIHsKKyAgICBpbnQgc2l6ZSA9IHJlYWRJMzIoKTsKKyAgICByZXR1cm4gX3JlYWRTdHJpbmcoc2l6ZSk7CisgIH0KKworICBTdHJpbmcgX3JlYWRTdHJpbmcoaW50IHNpemUpIHsKKyAgICBVaW50OExpc3Qgc3RyaW5nSW4gPSBuZXcgVWludDhMaXN0KHNpemUpOworICAgIHRyYW5zcG9ydC5yZWFkQWxsKHN0cmluZ0luLCAwLCBzaXplKTsKKyAgICByZXR1cm4gX3V0ZjhDb2RlYy5kZWNvZGUoc3RyaW5nSW4pOworICB9CisKKyAgVWludDhMaXN0IHJlYWRCaW5hcnkoKSB7CisgICAgaW50IGxlbmd0aCA9IHJlYWRJMzIoKTsKKyAgICBVaW50OExpc3QgYmluYXJ5SW4gPSBuZXcgVWludDhMaXN0KGxlbmd0aCk7CisgICAgdHJhbnNwb3J0LnJlYWRBbGwoYmluYXJ5SW4sIDAsIGxlbmd0aCk7CisgICAgcmV0dXJuIGJpbmFyeUluOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfY29tcGFjdF9wcm90b2NvbC5kYXJ0IGIvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X2NvbXBhY3RfcHJvdG9jb2wuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmQ3NjQxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X2NvbXBhY3RfcHJvdG9jb2wuZGFydApAQCAtMCwwICsxLDQ3MCBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICdMaWNlbnNlJyk7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gJ0FTIElTJyBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhcnQgb2YgdGhyaWZ0OworCitjbGFzcyBUQ29tcGFjdFByb3RvY29sRmFjdG9yeSBpbXBsZW1lbnRzIFRQcm90b2NvbEZhY3Rvcnk8VENvbXBhY3RQcm90b2NvbD4geworICBUQ29tcGFjdFByb3RvY29sRmFjdG9yeSgpOworCisgIFRDb21wYWN0UHJvdG9jb2wgZ2V0UHJvdG9jb2woVFRyYW5zcG9ydCB0cmFuc3BvcnQpIHsKKyAgICByZXR1cm4gbmV3IFRDb21wYWN0UHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgfQorfQorCisvLy8gQ29tcGFjdCBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBmb3IgVGhyaWZ0LgorLy8vCisvLy8gVXNlIG9mIGZpeG51bSBsaWJyYXJ5IGlzIHJlcXVpcmVkIGR1ZSB0byBidWdzIGxpa2UKKy8vLyBodHRwczovL2dpdGh1Yi5jb20vZGFydC1sYW5nL3Nkay9pc3N1ZXMvMTUzNjEKKy8vLworLy8vIEFkYXB0ZWQgZnJvbSB0aGUgSmF2YSB2ZXJzaW9uLgorY2xhc3MgVENvbXBhY3RQcm90b2NvbCBleHRlbmRzIFRQcm90b2NvbCB7CisgIHN0YXRpYyBjb25zdCBpbnQgUFJPVE9DT0xfSUQgPSAweDgyOworICBzdGF0aWMgY29uc3QgaW50IFZFUlNJT04gPSAxOworICBzdGF0aWMgY29uc3QgaW50IFZFUlNJT05fTUFTSyA9IDB4MWY7CisgIHN0YXRpYyBjb25zdCBpbnQgVFlQRV9NQVNLID0gMHhFMDsKKyAgc3RhdGljIGNvbnN0IGludCBUWVBFX0JJVFMgPSAweDA3OworICBzdGF0aWMgY29uc3QgaW50IFRZUEVfU0hJRlRfQU1PVU5UID0gNTsKKyAgc3RhdGljIGZpbmFsIFRGaWVsZCBUU1RPUCA9IG5ldyBURmllbGQoIiIsIFRUeXBlLlNUT1AsIDApOworCisgIHN0YXRpYyBjb25zdCBpbnQgVFlQRV9CT09MRUFOX1RSVUUgPSAweDAxOworICBzdGF0aWMgY29uc3QgaW50IFRZUEVfQk9PTEVBTl9GQUxTRSA9IDB4MDI7CisgIHN0YXRpYyBjb25zdCBpbnQgVFlQRV9CWVRFID0gMHgwMzsKKyAgc3RhdGljIGNvbnN0IGludCBUWVBFX0kxNiA9IDB4MDQ7CisgIHN0YXRpYyBjb25zdCBpbnQgVFlQRV9JMzIgPSAweDA1OworICBzdGF0aWMgY29uc3QgaW50IFRZUEVfSTY0ID0gMHgwNjsKKyAgc3RhdGljIGNvbnN0IGludCBUWVBFX0RPVUJMRSA9IDB4MDc7CisgIHN0YXRpYyBjb25zdCBpbnQgVFlQRV9CSU5BUlkgPSAweDA4OworICBzdGF0aWMgY29uc3QgaW50IFRZUEVfTElTVCA9IDB4MDk7CisgIHN0YXRpYyBjb25zdCBpbnQgVFlQRV9TRVQgPSAweDBBOworICBzdGF0aWMgY29uc3QgaW50IFRZUEVfTUFQID0gMHgwQjsKKyAgc3RhdGljIGNvbnN0IGludCBUWVBFX1NUUlVDVCA9IDB4MEM7CisKKyAgc3RhdGljIGZpbmFsIExpc3Q8aW50PiBfdHlwZU1hcCA9IG5ldyBMaXN0LnVubW9kaWZpYWJsZShuZXcgTGlzdCgxNikKKyAgICAuLltUVHlwZS5TVE9QXSA9IFRUeXBlLlNUT1AKKyAgICAuLltUVHlwZS5CT09MXSA9IFRZUEVfQk9PTEVBTl9UUlVFCisgICAgLi5bVFR5cGUuQllURV0gPSBUWVBFX0JZVEUKKyAgICAuLltUVHlwZS5JMTZdID0gVFlQRV9JMTYKKyAgICAuLltUVHlwZS5JMzJdID0gVFlQRV9JMzIKKyAgICAuLltUVHlwZS5JNjRdID0gVFlQRV9JNjQKKyAgICAuLltUVHlwZS5ET1VCTEVdID0gVFlQRV9ET1VCTEUKKyAgICAuLltUVHlwZS5TVFJJTkddID0gVFlQRV9CSU5BUlkKKyAgICAuLltUVHlwZS5MSVNUXSA9IFRZUEVfTElTVAorICAgIC4uW1RUeXBlLlNFVF0gPSBUWVBFX1NFVAorICAgIC4uW1RUeXBlLk1BUF0gPSBUWVBFX01BUAorICAgIC4uW1RUeXBlLlNUUlVDVF0gPSBUWVBFX1NUUlVDVCk7CisKKyAgc3RhdGljIGNvbnN0IFV0ZjhDb2RlYyBfdXRmOENvZGVjID0gY29uc3QgVXRmOENvZGVjKCk7CisKKyAgLy8gUHJldGVuZCB0aGlzIGlzIGEgc3RhY2sKKyAgRG91YmxlTGlua2VkUXVldWU8aW50PiBfbGFzdEZpZWxkID0gbmV3IERvdWJsZUxpbmtlZFF1ZXVlPGludD4oKTsKKyAgaW50IF9sYXN0RmllbGRJZCA9IDA7CisKKyAgVEZpZWxkIF9ib29sZWFuRmllbGQgPSBudWxsOworICBib29sIF9ib29sVmFsdWUgPSBudWxsOworCisgIGZpbmFsIFVpbnQ4TGlzdCB0ZW1wTGlzdCA9IG5ldyBVaW50OExpc3QoMTApOworICBmaW5hbCBCeXRlRGF0YSB0ZW1wQkQgPSBuZXcgQnl0ZURhdGEoMTApOworCisgIFRDb21wYWN0UHJvdG9jb2woVFRyYW5zcG9ydCB0cmFuc3BvcnQpIDogc3VwZXIodHJhbnNwb3J0KTsKKworICAvLy8gV3JpdGUKKyAgdm9pZCB3cml0ZU1lc3NhZ2VCZWdpbihUTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgd3JpdGVCeXRlKFBST1RPQ09MX0lEKTsKKyAgICB3cml0ZUJ5dGUoKFZFUlNJT04gJiBWRVJTSU9OX01BU0spIHwKKyAgICAgICAgKChtZXNzYWdlLnR5cGUgPDwgVFlQRV9TSElGVF9BTU9VTlQpICYgVFlQRV9NQVNLKSk7CisgICAgX3dyaXRlVmFySW50MzIobmV3IEludDMyKG1lc3NhZ2Uuc2VxaWQpKTsKKyAgICB3cml0ZVN0cmluZyhtZXNzYWdlLm5hbWUpOworICB9CisKKyAgdm9pZCB3cml0ZU1lc3NhZ2VFbmQoKSB7fQorCisgIHZvaWQgd3JpdGVTdHJ1Y3RCZWdpbihUU3RydWN0IHN0cnVjdCkgeworICAgIF9sYXN0RmllbGQuYWRkTGFzdChfbGFzdEZpZWxkSWQpOworICAgIF9sYXN0RmllbGRJZCA9IDA7CisgIH0KKworICB2b2lkIHdyaXRlU3RydWN0RW5kKCkgeworICAgIF9sYXN0RmllbGRJZCA9IF9sYXN0RmllbGQucmVtb3ZlTGFzdCgpOworICB9CisKKyAgdm9pZCB3cml0ZUZpZWxkQmVnaW4oVEZpZWxkIGZpZWxkKSB7CisgICAgaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuQk9PTCkgeworICAgICAgX2Jvb2xlYW5GaWVsZCA9IGZpZWxkOworICAgIH0gZWxzZSB7CisgICAgICBfd3JpdGVGaWVsZEJlZ2luKGZpZWxkLCAtMSk7CisgICAgfQorICB9CisKKyAgdm9pZCBfd3JpdGVGaWVsZEJlZ2luKFRGaWVsZCBmaWVsZCwgaW50IHR5cGVPdmVycmlkZSkgeworICAgIGludCB0eXBlVG9Xcml0ZSA9CisgICAgICAgIHR5cGVPdmVycmlkZSA9PSAtMSA/IF9nZXRDb21wYWN0VHlwZShmaWVsZC50eXBlKSA6IHR5cGVPdmVycmlkZTsKKworICAgIGlmIChmaWVsZC5pZCA+IF9sYXN0RmllbGRJZCAmJiBmaWVsZC5pZCAtIF9sYXN0RmllbGRJZCA8PSAxNSkgeworICAgICAgd3JpdGVCeXRlKChmaWVsZC5pZCAtIF9sYXN0RmllbGRJZCkgPDwgNCB8IHR5cGVUb1dyaXRlKTsKKyAgICB9IGVsc2UgeworICAgICAgd3JpdGVCeXRlKHR5cGVUb1dyaXRlKTsKKyAgICAgIHdyaXRlSTE2KGZpZWxkLmlkKTsKKyAgICB9CisKKyAgICBfbGFzdEZpZWxkSWQgPSBmaWVsZC5pZDsKKyAgfQorCisgIHZvaWQgd3JpdGVGaWVsZEVuZCgpIHt9CisKKyAgdm9pZCB3cml0ZUZpZWxkU3RvcCgpIHsKKyAgICB3cml0ZUJ5dGUoVFR5cGUuU1RPUCk7CisgIH0KKworICB2b2lkIHdyaXRlTWFwQmVnaW4oVE1hcCBtYXApIHsKKyAgICBpZiAobWFwLmxlbmd0aCA9PSAwKSB7CisgICAgICB3cml0ZUJ5dGUoMCk7CisgICAgfSBlbHNlIHsKKyAgICAgIF93cml0ZVZhckludDMyKG5ldyBJbnQzMihtYXAubGVuZ3RoKSk7CisgICAgICB3cml0ZUJ5dGUoCisgICAgICAgICAgX2dldENvbXBhY3RUeXBlKG1hcC5rZXlUeXBlKSA8PCA0IHwgX2dldENvbXBhY3RUeXBlKG1hcC52YWx1ZVR5cGUpKTsKKyAgICB9CisgIH0KKworICB2b2lkIHdyaXRlTWFwRW5kKCkge30KKworICB2b2lkIHdyaXRlTGlzdEJlZ2luKFRMaXN0IGxpc3QpIHsKKyAgICBfd3JpdGVDb2xsZWN0aW9uQmVnaW4obGlzdC5lbGVtZW50VHlwZSwgbGlzdC5sZW5ndGgpOworICB9CisKKyAgdm9pZCB3cml0ZUxpc3RFbmQoKSB7fQorCisgIHZvaWQgd3JpdGVTZXRCZWdpbihUU2V0IHNldCkgeworICAgIF93cml0ZUNvbGxlY3Rpb25CZWdpbihzZXQuZWxlbWVudFR5cGUsIHNldC5sZW5ndGgpOworICB9CisKKyAgdm9pZCB3cml0ZVNldEVuZCgpIHt9CisKKyAgdm9pZCB3cml0ZUJvb2woYm9vbCBiKSB7CisgICAgaWYgKGIgPT0gbnVsbCkgYiA9IGZhbHNlOworICAgIGlmIChfYm9vbGVhbkZpZWxkICE9IG51bGwpIHsKKyAgICAgIF93cml0ZUZpZWxkQmVnaW4oCisgICAgICAgICAgX2Jvb2xlYW5GaWVsZCwgYiA/IFRZUEVfQk9PTEVBTl9UUlVFIDogVFlQRV9CT09MRUFOX0ZBTFNFKTsKKyAgICAgIF9ib29sZWFuRmllbGQgPSBudWxsOworICAgIH0gZWxzZSB7CisgICAgICB3cml0ZUJ5dGUoYiA/IFRZUEVfQk9PTEVBTl9UUlVFIDogVFlQRV9CT09MRUFOX0ZBTFNFKTsKKyAgICB9CisgIH0KKworICB2b2lkIHdyaXRlQnl0ZShpbnQgYikgeworICAgIGlmIChiID09IG51bGwpIGIgPSAwOworICAgIHRlbXBMaXN0WzBdID0gYjsKKyAgICB0cmFuc3BvcnQud3JpdGUodGVtcExpc3QsIDAsIDEpOworICB9CisKKyAgdm9pZCB3cml0ZUkxNihpbnQgaTE2KSB7CisgICAgaWYgKGkxNiA9PSBudWxsKSBpMTYgPSAwOworICAgIF93cml0ZVZhckludDMyKF9pbnQzMlRvWmlnWmFnKG5ldyBJbnQzMihpMTYpKSk7CisgIH0KKworICB2b2lkIHdyaXRlSTMyKGludCBpMzIpIHsKKyAgICBpZiAoaTMyID09IG51bGwpIGkzMiA9IDA7CisgICAgX3dyaXRlVmFySW50MzIoX2ludDMyVG9aaWdaYWcobmV3IEludDMyKGkzMikpKTsKKyAgfQorCisgIHZvaWQgd3JpdGVJNjQoaW50IGk2NCkgeworICAgIGlmIChpNjQgPT0gbnVsbCkgaTY0ID0gMDsKKyAgICBfd3JpdGVWYXJJbnQ2NChfaW50NjRUb1ppZ1phZyhuZXcgSW50NjQoaTY0KSkpOworICB9CisKKyAgdm9pZCB3cml0ZURvdWJsZShkb3VibGUgZCkgeworICAgIGlmIChkID09IG51bGwpIGQgPSAwLjA7CisgICAgdGVtcEJELnNldEZsb2F0NjQoMCwgZCwgRW5kaWFubmVzcy5MSVRUTEVfRU5ESUFOKTsKKyAgICB0cmFuc3BvcnQud3JpdGUodGVtcEJELmJ1ZmZlci5hc1VpbnQ4TGlzdCgpLCAwLCA4KTsKKyAgfQorCisgIHZvaWQgd3JpdGVTdHJpbmcoU3RyaW5nIHN0cikgeworICAgIFVpbnQ4TGlzdCBieXRlcyA9CisgICAgICAgIHN0ciAhPSBudWxsID8gX3V0ZjhDb2RlYy5lbmNvZGUoc3RyKSA6IG5ldyBVaW50OExpc3QuZnJvbUxpc3QoW10pOworICAgIHdyaXRlQmluYXJ5KGJ5dGVzKTsKKyAgfQorCisgIHZvaWQgd3JpdGVCaW5hcnkoVWludDhMaXN0IGJ5dGVzKSB7CisgICAgX3dyaXRlVmFySW50MzIobmV3IEludDMyKGJ5dGVzLmxlbmd0aCkpOworICAgIHRyYW5zcG9ydC53cml0ZShieXRlcywgMCwgYnl0ZXMubGVuZ3RoKTsKKyAgfQorCisgIHZvaWQgX3dyaXRlVmFySW50MzIoSW50MzIgbikgeworICAgIGludCBpZHggPSAwOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBpZiAoKG4gJiB+MHg3RikgPT0gMCkgeworICAgICAgICB0ZW1wTGlzdFtpZHgrK10gPSAobiAmIDB4RkYpLnRvSW50KCk7CisgICAgICAgIGJyZWFrOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGVtcExpc3RbaWR4KytdID0gKCgobiAmIDB4N0YpIHwgMHg4MCkgJiAweEZGKS50b0ludCgpOworICAgICAgICBuID0gbi5zaGlmdFJpZ2h0VW5zaWduZWQoNyk7CisgICAgICB9CisgICAgfQorICAgIHRyYW5zcG9ydC53cml0ZSh0ZW1wTGlzdCwgMCwgaWR4KTsKKyAgfQorCisgIHZvaWQgX3dyaXRlVmFySW50NjQoSW50NjQgbikgeworICAgIGludCBpZHggPSAwOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBpZiAoKG4gJiB+MHg3RikgPT0gMCkgeworICAgICAgICB0ZW1wTGlzdFtpZHgrK10gPSAobiAmIDB4RkYpLnRvSW50KCk7CisgICAgICAgIGJyZWFrOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGVtcExpc3RbaWR4KytdID0gKCgobiAmIDB4N0YpIHwgMHg4MCkgJiAweEZGKS50b0ludCgpOworICAgICAgICBuID0gbi5zaGlmdFJpZ2h0VW5zaWduZWQoNyk7CisgICAgICB9CisgICAgfQorICAgIHRyYW5zcG9ydC53cml0ZSh0ZW1wTGlzdCwgMCwgaWR4KTsKKyAgfQorCisgIHZvaWQgX3dyaXRlQ29sbGVjdGlvbkJlZ2luKGludCBlbGVtVHlwZSwgaW50IGxlbmd0aCkgeworICAgIGlmIChsZW5ndGggPD0gMTQpIHsKKyAgICAgIHdyaXRlQnl0ZShsZW5ndGggPDwgNCB8IF9nZXRDb21wYWN0VHlwZShlbGVtVHlwZSkpOworICAgIH0gZWxzZSB7CisgICAgICB3cml0ZUJ5dGUoMHhGMCB8IF9nZXRDb21wYWN0VHlwZShlbGVtVHlwZSkpOworICAgICAgX3dyaXRlVmFySW50MzIobmV3IEludDMyKGxlbmd0aCkpOworICAgIH0KKyAgfQorCisgIEludDMyIF9pbnQzMlRvWmlnWmFnKEludDMyIG4pIHsKKyAgICByZXR1cm4gKG4gPDwgMSkgXiAobiA+PiAzMSk7CisgIH0KKworICBJbnQ2NCBfaW50NjRUb1ppZ1phZyhJbnQ2NCBuKSB7CisgICAgcmV0dXJuIChuIDw8IDEpIF4gKG4gPj4gNjMpOworICB9CisKKyAgLy8vIFJlYWQKKyAgVE1lc3NhZ2UgcmVhZE1lc3NhZ2VCZWdpbigpIHsKKyAgICBpbnQgcHJvdG9jb2xJZCA9IHJlYWRCeXRlKCk7CisgICAgaWYgKHByb3RvY29sSWQgIT0gUFJPVE9DT0xfSUQpIHsKKyAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFcnJvcihUUHJvdG9jb2xFcnJvclR5cGUuQkFEX1ZFUlNJT04sCisgICAgICAgICAgJ0V4cGVjdGVkIHByb3RvY29sIGlkICRQUk9UT0NPTF9JRCBidXQgZ290ICRwcm90b2NvbElkJyk7CisgICAgfQorICAgIGludCB2ZXJzaW9uQW5kVHlwZSA9IHJlYWRCeXRlKCk7CisgICAgaW50IHZlcnNpb24gPSB2ZXJzaW9uQW5kVHlwZSAmIFZFUlNJT05fTUFTSzsKKyAgICBpZiAodmVyc2lvbiAhPSBWRVJTSU9OKSB7CisgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXJyb3IoVFByb3RvY29sRXJyb3JUeXBlLkJBRF9WRVJTSU9OLAorICAgICAgICAgICdFeHBlY3RlZCB2ZXJzaW9uICRWRVJTSU9OIGJ1dCBnb3QgJHZlcnNpb24nKTsKKyAgICB9CisgICAgaW50IHR5cGUgPSAodmVyc2lvbkFuZFR5cGUgPj4gVFlQRV9TSElGVF9BTU9VTlQpICYgVFlQRV9CSVRTOworICAgIGludCBzZXFJZCA9IF9yZWFkVmFySW50MzIoKS50b0ludCgpOworICAgIFN0cmluZyBtZXNzYWdlTmFtZSA9IHJlYWRTdHJpbmcoKTsKKyAgICByZXR1cm4gbmV3IFRNZXNzYWdlKG1lc3NhZ2VOYW1lLCB0eXBlLCBzZXFJZCk7CisgIH0KKworICB2b2lkIHJlYWRNZXNzYWdlRW5kKCkge30KKworICBUU3RydWN0IHJlYWRTdHJ1Y3RCZWdpbigpIHsKKyAgICBfbGFzdEZpZWxkLmFkZExhc3QoX2xhc3RGaWVsZElkKTsKKyAgICBfbGFzdEZpZWxkSWQgPSAwOworICAgIC8vIFRPRE8gbWFrZSB0aGlzIGEgY29uc3RhbnQ/CisgICAgcmV0dXJuIG5ldyBUU3RydWN0KCk7CisgIH0KKworICB2b2lkIHJlYWRTdHJ1Y3RFbmQoKSB7CisgICAgX2xhc3RGaWVsZElkID0gX2xhc3RGaWVsZC5yZW1vdmVMYXN0KCk7CisgIH0KKworICBURmllbGQgcmVhZEZpZWxkQmVnaW4oKSB7CisgICAgaW50IHR5cGUgPSByZWFkQnl0ZSgpOworICAgIGlmICh0eXBlID09IFRUeXBlLlNUT1ApIHsKKyAgICAgIHJldHVybiBUU1RPUDsKKyAgICB9CisKKyAgICBpbnQgZmllbGRJZDsKKyAgICBpbnQgbW9kaWZpZXIgPSAodHlwZSAmIDB4RjApID4+IDQ7CisgICAgaWYgKG1vZGlmaWVyID09IDApIHsKKyAgICAgIGZpZWxkSWQgPSByZWFkSTE2KCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGZpZWxkSWQgPSBfbGFzdEZpZWxkSWQgKyBtb2RpZmllcjsKKyAgICB9CisKKyAgICBURmllbGQgZmllbGQgPSBuZXcgVEZpZWxkKCcnLCBfZ2V0VFR5cGUodHlwZSAmIDB4MEYpLCBmaWVsZElkKTsKKyAgICBpZiAoX2lzQm9vbFR5cGUodHlwZSkpIHsKKyAgICAgIF9ib29sVmFsdWUgPSAodHlwZSAmIDB4MEYpID09IFRZUEVfQk9PTEVBTl9UUlVFOworICAgIH0KKworICAgIF9sYXN0RmllbGRJZCA9IGZpZWxkLmlkOworICAgIHJldHVybiBmaWVsZDsKKyAgfQorCisgIHZvaWQgcmVhZEZpZWxkRW5kKCkge30KKworICBUTWFwIHJlYWRNYXBCZWdpbigpIHsKKyAgICBpbnQgbGVuZ3RoID0gX3JlYWRWYXJJbnQzMigpLnRvSW50KCk7CisgICAgX2NoZWNrTmVnUmVhZExlbmd0aChsZW5ndGgpOworCisgICAgaW50IGtleUFuZFZhbHVlVHlwZSA9IGxlbmd0aCA9PSAwID8gMCA6IHJlYWRCeXRlKCk7CisgICAgaW50IGtleVR5cGUgPSBfZ2V0VFR5cGUoa2V5QW5kVmFsdWVUeXBlID4+IDQpOworICAgIGludCB2YWx1ZVR5cGUgPSBfZ2V0VFR5cGUoa2V5QW5kVmFsdWVUeXBlICYgMHgwRik7CisgICAgcmV0dXJuIG5ldyBUTWFwKGtleVR5cGUsIHZhbHVlVHlwZSwgbGVuZ3RoKTsKKyAgfQorCisgIHZvaWQgcmVhZE1hcEVuZCgpIHt9CisKKyAgVExpc3QgcmVhZExpc3RCZWdpbigpIHsKKyAgICBpbnQgbGVuZ3RoQW5kVHlwZSA9IHJlYWRCeXRlKCk7CisgICAgaW50IGxlbmd0aCA9IChsZW5ndGhBbmRUeXBlID4+IDQpICYgMHgwRjsKKyAgICBpZiAobGVuZ3RoID09IDE1KSB7CisgICAgICBsZW5ndGggPSBfcmVhZFZhckludDMyKCkudG9JbnQoKTsKKyAgICB9CisgICAgX2NoZWNrTmVnUmVhZExlbmd0aChsZW5ndGgpOworICAgIGludCB0eXBlID0gX2dldFRUeXBlKGxlbmd0aEFuZFR5cGUpOworICAgIHJldHVybiBuZXcgVExpc3QodHlwZSwgbGVuZ3RoKTsKKyAgfQorCisgIHZvaWQgcmVhZExpc3RFbmQoKSB7fQorCisgIFRTZXQgcmVhZFNldEJlZ2luKCkgeworICAgIFRMaXN0IHRsaXN0ID0gcmVhZExpc3RCZWdpbigpOworICAgIHJldHVybiBuZXcgVFNldCh0bGlzdC5lbGVtZW50VHlwZSwgdGxpc3QubGVuZ3RoKTsKKyAgfQorCisgIHZvaWQgcmVhZFNldEVuZCgpIHt9CisKKyAgYm9vbCByZWFkQm9vbCgpIHsKKyAgICBpZiAoX2Jvb2xWYWx1ZSAhPSBudWxsKSB7CisgICAgICBib29sIHJlc3VsdCA9IF9ib29sVmFsdWU7CisgICAgICBfYm9vbFZhbHVlID0gbnVsbDsKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIHJldHVybiByZWFkQnl0ZSgpID09IFRZUEVfQk9PTEVBTl9UUlVFOworICB9CisKKyAgaW50IHJlYWRCeXRlKCkgeworICAgIHRyYW5zcG9ydC5yZWFkQWxsKHRlbXBMaXN0LCAwLCAxKTsKKyAgICByZXR1cm4gdGVtcExpc3QuYnVmZmVyLmFzQnl0ZURhdGEoKS5nZXRVaW50OCgwKTsKKyAgfQorCisgIGludCByZWFkSTE2KCkgeworICAgIHJldHVybiBfemlnemFnVG9JbnQzMihfcmVhZFZhckludDMyKCkpLnRvSW50KCk7CisgIH0KKworICBpbnQgcmVhZEkzMigpIHsKKyAgICByZXR1cm4gX3ppZ3phZ1RvSW50MzIoX3JlYWRWYXJJbnQzMigpKS50b0ludCgpOworICB9CisKKyAgaW50IHJlYWRJNjQoKSB7CisgICAgcmV0dXJuIF96aWd6YWdUb0ludDY0KF9yZWFkVmFySW50NjQoKSkudG9JbnQoKTsKKyAgfQorCisgIGRvdWJsZSByZWFkRG91YmxlKCkgeworICAgIHRyYW5zcG9ydC5yZWFkQWxsKHRlbXBMaXN0LCAwLCA4KTsKKyAgICByZXR1cm4gdGVtcExpc3QuYnVmZmVyLmFzQnl0ZURhdGEoKS5nZXRGbG9hdDY0KDAsIEVuZGlhbm5lc3MuTElUVExFX0VORElBTik7CisgIH0KKworICBTdHJpbmcgcmVhZFN0cmluZygpIHsKKyAgICBpbnQgbGVuZ3RoID0gX3JlYWRWYXJJbnQzMigpLnRvSW50KCk7CisgICAgX2NoZWNrTmVnUmVhZExlbmd0aChsZW5ndGgpOworCisgICAgLy8gVE9ETyBsb29rIGF0IHVzaW5nIHRlbXAgZm9yIHNtYWxsIHN0cmluZ3M/CisgICAgVWludDhMaXN0IGJ1ZmYgPSBuZXcgVWludDhMaXN0KGxlbmd0aCk7CisgICAgdHJhbnNwb3J0LnJlYWRBbGwoYnVmZiwgMCwgbGVuZ3RoKTsKKyAgICByZXR1cm4gX3V0ZjhDb2RlYy5kZWNvZGUoYnVmZik7CisgIH0KKworICBVaW50OExpc3QgcmVhZEJpbmFyeSgpIHsKKyAgICBpbnQgbGVuZ3RoID0gX3JlYWRWYXJJbnQzMigpLnRvSW50KCk7CisgICAgX2NoZWNrTmVnUmVhZExlbmd0aChsZW5ndGgpOworCisgICAgVWludDhMaXN0IGJ1ZmYgPSBuZXcgVWludDhMaXN0KGxlbmd0aCk7CisgICAgdHJhbnNwb3J0LnJlYWRBbGwoYnVmZiwgMCwgbGVuZ3RoKTsKKyAgICByZXR1cm4gYnVmZjsKKyAgfQorCisgIEludDMyIF9yZWFkVmFySW50MzIoKSB7CisgICAgSW50MzIgcmVzdWx0ID0gSW50MzIuWkVSTzsKKyAgICBpbnQgc2hpZnQgPSAwOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBJbnQzMiBiID0gbmV3IEludDMyKHJlYWRCeXRlKCkpOworICAgICAgcmVzdWx0IHw9IChiICYgMHg3ZikgPDwgc2hpZnQ7CisgICAgICBpZiAoKGIgJiAweDgwKSAhPSAweDgwKSBicmVhazsKKyAgICAgIHNoaWZ0ICs9IDc7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBJbnQ2NCBfcmVhZFZhckludDY0KCkgeworICAgIEludDY0IHJlc3VsdCA9IEludDY0LlpFUk87CisgICAgaW50IHNoaWZ0ID0gMDsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgSW50NjQgYiA9IG5ldyBJbnQ2NChyZWFkQnl0ZSgpKTsKKyAgICAgIHJlc3VsdCB8PSAoYiAmIDB4N2YpIDw8IHNoaWZ0OworICAgICAgaWYgKChiICYgMHg4MCkgIT0gMHg4MCkgYnJlYWs7CisgICAgICBzaGlmdCArPSA3OworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgSW50MzIgX3ppZ3phZ1RvSW50MzIoSW50MzIgbikgeworICAgIHJldHVybiAobi5zaGlmdFJpZ2h0VW5zaWduZWQoMSkpIF4gLShuICYgMSk7CisgIH0KKworICBJbnQ2NCBfemlnemFnVG9JbnQ2NChJbnQ2NCBuKSB7CisgICAgcmV0dXJuIChuLnNoaWZ0UmlnaHRVbnNpZ25lZCgxKSkgXiAtKG4gJiAxKTsKKyAgfQorCisgIHZvaWQgX2NoZWNrTmVnUmVhZExlbmd0aChpbnQgbGVuZ3RoKSB7CisgICAgaWYgKGxlbmd0aCA8IDApIHsKKyAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFcnJvcigKKyAgICAgICAgICBUUHJvdG9jb2xFcnJvclR5cGUuTkVHQVRJVkVfU0laRSwgJ05lZ2F0aXZlIGxlbmd0aDogJGxlbmd0aCcpOworICAgIH0KKyAgfQorCisgIGludCBfZ2V0Q29tcGFjdFR5cGUoaW50IHR0eXBlKSB7CisgICAgcmV0dXJuIF90eXBlTWFwW3R0eXBlXTsKKyAgfQorCisgIGludCBfZ2V0VFR5cGUoaW50IHR5cGUpIHsKKyAgICBzd2l0Y2ggKHR5cGUgJiAweDBGKSB7CisgICAgICBjYXNlIFRUeXBlLlNUT1A6CisgICAgICAgIHJldHVybiBUVHlwZS5TVE9QOworICAgICAgY2FzZSBUWVBFX0JPT0xFQU5fRkFMU0U6CisgICAgICBjYXNlIFRZUEVfQk9PTEVBTl9UUlVFOgorICAgICAgICByZXR1cm4gVFR5cGUuQk9PTDsKKyAgICAgIGNhc2UgVFlQRV9CWVRFOgorICAgICAgICByZXR1cm4gVFR5cGUuQllURTsKKyAgICAgIGNhc2UgVFlQRV9JMTY6CisgICAgICAgIHJldHVybiBUVHlwZS5JMTY7CisgICAgICBjYXNlIFRZUEVfSTMyOgorICAgICAgICByZXR1cm4gVFR5cGUuSTMyOworICAgICAgY2FzZSBUWVBFX0k2NDoKKyAgICAgICAgcmV0dXJuIFRUeXBlLkk2NDsKKyAgICAgIGNhc2UgVFlQRV9ET1VCTEU6CisgICAgICAgIHJldHVybiBUVHlwZS5ET1VCTEU7CisgICAgICBjYXNlIFRZUEVfQklOQVJZOgorICAgICAgICByZXR1cm4gVFR5cGUuU1RSSU5HOworICAgICAgY2FzZSBUWVBFX0xJU1Q6CisgICAgICAgIHJldHVybiBUVHlwZS5MSVNUOworICAgICAgY2FzZSBUWVBFX1NFVDoKKyAgICAgICAgcmV0dXJuIFRUeXBlLlNFVDsKKyAgICAgIGNhc2UgVFlQRV9NQVA6CisgICAgICAgIHJldHVybiBUVHlwZS5NQVA7CisgICAgICBjYXNlIFRZUEVfU1RSVUNUOgorICAgICAgICByZXR1cm4gVFR5cGUuU1RSVUNUOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEVycm9yKAorICAgICAgICAgICAgVFByb3RvY29sRXJyb3JUeXBlLklOVkFMSURfREFUQSwgIlVua25vd24gdHlwZTogJHt0eXBlICYgMHgwRn0iKTsKKyAgICB9CisgIH0KKworICBib29sIF9pc0Jvb2xUeXBlKGludCBiKSB7CisgICAgaW50IGxvd2VyTmliYmxlID0gYiAmIDB4MEY7CisgICAgcmV0dXJuIGxvd2VyTmliYmxlID09IFRZUEVfQk9PTEVBTl9UUlVFIHx8CisgICAgICAgIGxvd2VyTmliYmxlID09IFRZUEVfQk9PTEVBTl9GQUxTRTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X2ZpZWxkLmRhcnQgYi9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfZmllbGQuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDRiNGU1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X2ZpZWxkLmRhcnQKQEAgLTAsMCArMSwyNiBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhcnQgb2YgdGhyaWZ0OworCitjbGFzcyBURmllbGQgeworICBmaW5hbCBTdHJpbmcgbmFtZTsKKyAgZmluYWwgaW50IHR5cGU7CisgIGZpbmFsIGludCBpZDsKKworICBURmllbGQodGhpcy5uYW1lLCB0aGlzLnR5cGUsIHRoaXMuaWQpOworfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X2pzb25fcHJvdG9jb2wuZGFydCBiL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9qc29uX3Byb3RvY29sLmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZiYjdjNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9qc29uX3Byb3RvY29sLmRhcnQKQEAgLTAsMCArMSw3ODQgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYXJ0IG9mIHRocmlmdDsKKworY2xhc3MgVEpzb25Qcm90b2NvbEZhY3RvcnkgaW1wbGVtZW50cyBUUHJvdG9jb2xGYWN0b3J5PFRKc29uUHJvdG9jb2w+IHsKKyAgVEpzb25Qcm90b2NvbCBnZXRQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zcG9ydCkgeworICAgIHJldHVybiBuZXcgVEpzb25Qcm90b2NvbCh0cmFuc3BvcnQpOworICB9Cit9CisKKy8vLyBKU09OIHByb3RvY29sIGltcGxlbWVudGF0aW9uIGZvciBUaHJpZnQuCisvLy8KKy8vLyBBZGFwdGVkIGZyb20gdGhlIEMjIHZlcnNpb24uCitjbGFzcyBUSnNvblByb3RvY29sIGV4dGVuZHMgVFByb3RvY29sIHsKKyAgc3RhdGljIGNvbnN0IGludCBWRVJTSU9OXzEgPSAxOworCisgIHN0YXRpYyBjb25zdCBVdGY4Q29kZWMgdXRmOENvZGVjID0gY29uc3QgVXRmOENvZGVjKCk7CisKKyAgX0Jhc2VDb250ZXh0IF9jb250ZXh0OworICBfQmFzZUNvbnRleHQgX3Jvb3RDb250ZXh0OworICBfTG9va2FoZWFkUmVhZGVyIF9yZWFkZXI7CisKKyAgZmluYWwgTGlzdDxfQmFzZUNvbnRleHQ+IF9jb250ZXh0U3RhY2sgPSBbXTsKKyAgZmluYWwgVWludDhMaXN0IF90ZW1wQnVmZmVyID0gbmV3IFVpbnQ4TGlzdCg0KTsKKworICBUSnNvblByb3RvY29sKFRUcmFuc3BvcnQgdHJhbnNwb3J0KSA6IHN1cGVyKHRyYW5zcG9ydCkgeworICAgIF9yb290Q29udGV4dCA9IG5ldyBfQmFzZUNvbnRleHQodGhpcyk7CisgICAgX3JlYWRlciA9IG5ldyBfTG9va2FoZWFkUmVhZGVyKHRoaXMpOworICAgIF9yZXNldENvbnRleHQoKTsKKyAgfQorCisgIHZvaWQgX3B1c2hDb250ZXh0KF9CYXNlQ29udGV4dCBjKSB7CisgICAgX2NvbnRleHRTdGFjay5hZGQoYyk7CisgICAgX2NvbnRleHQgPSBjOworICB9CisKKyAgdm9pZCBfcG9wQ29udGV4dCgpIHsKKyAgICBfY29udGV4dFN0YWNrLnJlbW92ZUxhc3QoKTsKKyAgICBfY29udGV4dCA9IF9jb250ZXh0U3RhY2suaXNFbXB0eSA/IF9yb290Q29udGV4dCA6IF9jb250ZXh0U3RhY2subGFzdDsKKyAgfQorCisgIHZvaWQgX3Jlc2V0Q29udGV4dCgpIHsKKyAgICBfY29udGV4dFN0YWNrLmNsZWFyKCk7CisgICAgX2NvbnRleHQgPSBfcm9vdENvbnRleHQ7CisgIH0KKworICAvLy8gUmVhZCBhIGJ5dGUgdGhhdCBtdXN0IG1hdGNoIFtjaGFyXTsgb3RoZXJ3aXNlIHRocm93IGEgW1RQcm90b2NvbEVycm9yXS4KKyAgdm9pZCBfcmVhZEpzb25TeW50YXhDaGFyKGludCBjaGFyQnl0ZSkgeworICAgIGludCBieXRlID0gX3JlYWRlci5yZWFkKCk7CisgICAgaWYgKGJ5dGUgIT0gY2hhckJ5dGUpIHsKKyAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFcnJvcihUUHJvdG9jb2xFcnJvclR5cGUuSU5WQUxJRF9EQVRBLAorICAgICAgICAgICJFeHBlY3RlZCBjaGFyYWN0ZXIgJHtuZXcgU3RyaW5nLmZyb21DaGFyQ29kZShjaGFyQnl0ZSl9IGJ1dCBmb3VuZDogJHtuZXcgU3RyaW5nLmZyb21DaGFyQ29kZShieXRlKX0iKTsKKyAgICB9CisgIH0KKworICBpbnQgX2hleFZhbChpbnQgYnl0ZSkgeworICAgIGlmIChieXRlID49IF9Db25zdGFudHMuSEVYXzBfQllURVNbMF0gJiYKKyAgICAgICAgYnl0ZSA8PSBfQ29uc3RhbnRzLkhFWF85X0JZVEVTWzBdKSB7CisgICAgICByZXR1cm4gYnl0ZSAtIF9Db25zdGFudHMuSEVYXzBfQllURVNbMF07CisgICAgfSBlbHNlIGlmIChieXRlID49IF9Db25zdGFudHMuSEVYX0FfQllURVNbMF0gJiYKKyAgICAgICAgYnl0ZSA8PSBfQ29uc3RhbnRzLkhFWF9GX0JZVEVTWzBdKSB7CisgICAgICBieXRlICs9IDEwOworICAgICAgcmV0dXJuIGJ5dGUgLSBfQ29uc3RhbnRzLkhFWF9BX0JZVEVTWzBdOworICAgIH0gZWxzZSB7CisgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXJyb3IoCisgICAgICAgICAgVFByb3RvY29sRXJyb3JUeXBlLklOVkFMSURfREFUQSwgIkV4cGVjdGVkIGhleCBjaGFyYWN0ZXIiKTsKKyAgICB9CisgIH0KKworICBpbnQgX2hleENoYXIoaW50IGJ5dGUpID0+IGJ5dGUudG9SYWRpeFN0cmluZygxNikuY29kZVVuaXRBdCgwKTsKKworICAvLy8gd3JpdGUKKworICAvLy8gV3JpdGUgdGhlIFtieXRlc10gYXMgSlNPTiBjaGFyYWN0ZXJzLCBlc2NhcGluZyBhcyBuZWVkZWQuCisgIHZvaWQgX3dyaXRlSnNvblN0cmluZyhVaW50OExpc3QgYnl0ZXMpIHsKKyAgICBfY29udGV4dC53cml0ZSgpOworICAgIHRyYW5zcG9ydC53cml0ZUFsbChfQ29uc3RhbnRzLlFVT1RFX0JZVEVTKTsKKworICAgIGludCBsZW5ndGggPSBieXRlcy5sZW5ndGg7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgaW50IGJ5dGUgPSBieXRlc1tpXTsKKyAgICAgIGlmICgoYnl0ZSAmIDB4MDBGRikgPj0gMHgzMCkgeworICAgICAgICBpZiAoYnl0ZSA9PSBfQ29uc3RhbnRzLkJBQ0tTTEFTSF9CWVRFU1swXSkgeworICAgICAgICAgIHRyYW5zcG9ydC53cml0ZUFsbChfQ29uc3RhbnRzLkJBQ0tTTEFTSF9CWVRFUyk7CisgICAgICAgICAgdHJhbnNwb3J0LndyaXRlQWxsKF9Db25zdGFudHMuQkFDS1NMQVNIX0JZVEVTKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0cmFuc3BvcnQud3JpdGUoYnl0ZXMsIGksIDEpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBfdGVtcEJ1ZmZlclswXSA9IF9Db25zdGFudHMuSlNPTl9DSEFSX1RBQkxFW2J5dGVdOworICAgICAgICBpZiAoX3RlbXBCdWZmZXJbMF0gPT0gMSkgeworICAgICAgICAgIHRyYW5zcG9ydC53cml0ZShieXRlcywgaSwgMSk7CisgICAgICAgIH0gZWxzZSBpZiAoX3RlbXBCdWZmZXJbMF0gPiAxKSB7CisgICAgICAgICAgdHJhbnNwb3J0LndyaXRlQWxsKF9Db25zdGFudHMuQkFDS1NMQVNIX0JZVEVTKTsKKyAgICAgICAgICB0cmFuc3BvcnQud3JpdGUoX3RlbXBCdWZmZXIsIDAsIDEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRyYW5zcG9ydC53cml0ZUFsbChfQ29uc3RhbnRzLkVTQ1NFUV9CWVRFUyk7CisgICAgICAgICAgX3RlbXBCdWZmZXJbMF0gPSBfaGV4Q2hhcihieXRlID4+IDQpOworICAgICAgICAgIF90ZW1wQnVmZmVyWzFdID0gX2hleENoYXIoYnl0ZSk7CisgICAgICAgICAgdHJhbnNwb3J0LndyaXRlKF90ZW1wQnVmZmVyLCAwLCAyKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHRyYW5zcG9ydC53cml0ZUFsbChfQ29uc3RhbnRzLlFVT1RFX0JZVEVTKTsKKyAgfQorCisgIHZvaWQgX3dyaXRlSnNvbkludGVnZXIoaW50IGkpIHsKKyAgICBpZiAoaSA9PSBudWxsKSBpID0gMDsKKworICAgIF9jb250ZXh0LndyaXRlKCk7CisgICAgU3RyaW5nIHN0ciA9IGkudG9TdHJpbmcoKTsKKworICAgIGlmIChfY29udGV4dC5lc2NhcGVOdW1iZXJzKSB7CisgICAgICB0cmFuc3BvcnQud3JpdGVBbGwoX0NvbnN0YW50cy5RVU9URV9CWVRFUyk7CisgICAgfQorICAgIHRyYW5zcG9ydC53cml0ZUFsbCh1dGY4Q29kZWMuZW5jb2RlKHN0cikpOworICAgIGlmIChfY29udGV4dC5lc2NhcGVOdW1iZXJzKSB7CisgICAgICB0cmFuc3BvcnQud3JpdGVBbGwoX0NvbnN0YW50cy5RVU9URV9CWVRFUyk7CisgICAgfQorICB9CisKKyAgdm9pZCBfd3JpdGVKc29uRG91YmxlKGRvdWJsZSBkKSB7CisgICAgaWYgKGQgPT0gbnVsbCkgZCA9IDAuMDsKKworICAgIF9jb250ZXh0LndyaXRlKCk7CisgICAgU3RyaW5nIHN0ciA9IGQudG9TdHJpbmcoKTsKKyAgICBib29sIGVzY2FwZU51bWJlcnMgPSBkLmlzTmFOIHx8IGQuaXNJbmZpbml0ZSB8fCBfY29udGV4dC5lc2NhcGVOdW1iZXJzOworCisgICAgaWYgKGVzY2FwZU51bWJlcnMpIHsKKyAgICAgIHRyYW5zcG9ydC53cml0ZUFsbChfQ29uc3RhbnRzLlFVT1RFX0JZVEVTKTsKKyAgICB9CisgICAgdHJhbnNwb3J0LndyaXRlQWxsKHV0ZjhDb2RlYy5lbmNvZGUoc3RyKSk7CisgICAgaWYgKGVzY2FwZU51bWJlcnMpIHsKKyAgICAgIHRyYW5zcG9ydC53cml0ZUFsbChfQ29uc3RhbnRzLlFVT1RFX0JZVEVTKTsKKyAgICB9CisgIH0KKworICB2b2lkIF93cml0ZUpzb25CYXNlNjQoVWludDhMaXN0IGJ5dGVzKSB7CisgICAgX2NvbnRleHQud3JpdGUoKTsKKyAgICB0cmFuc3BvcnQud3JpdGVBbGwoX0NvbnN0YW50cy5RVU9URV9CWVRFUyk7CisKKyAgICBTdHJpbmcgYmFzZTY0ID0gQkFTRTY0LmVuY29kZShieXRlcyk7CisgICAgdHJhbnNwb3J0LndyaXRlQWxsKHV0ZjhDb2RlYy5lbmNvZGUoYmFzZTY0KSk7CisKKyAgICB0cmFuc3BvcnQud3JpdGVBbGwoX0NvbnN0YW50cy5RVU9URV9CWVRFUyk7CisgIH0KKworICB2b2lkIF93cml0ZUpzb25PYmplY3RTdGFydCgpIHsKKyAgICBfY29udGV4dC53cml0ZSgpOworICAgIHRyYW5zcG9ydC53cml0ZUFsbChfQ29uc3RhbnRzLkxCUkFDRV9CWVRFUyk7CisgICAgX3B1c2hDb250ZXh0KG5ldyBfUGFpckNvbnRleHQodGhpcykpOworICB9CisKKyAgdm9pZCBfd3JpdGVKc29uT2JqZWN0RW5kKCkgeworICAgIF9wb3BDb250ZXh0KCk7CisgICAgdHJhbnNwb3J0LndyaXRlQWxsKF9Db25zdGFudHMuUkJSQUNFX0JZVEVTKTsKKyAgfQorCisgIHZvaWQgX3dyaXRlSnNvbkFycmF5U3RhcnQoKSB7CisgICAgX2NvbnRleHQud3JpdGUoKTsKKyAgICB0cmFuc3BvcnQud3JpdGVBbGwoX0NvbnN0YW50cy5MQlJBQ0tFVF9CWVRFUyk7CisgICAgX3B1c2hDb250ZXh0KG5ldyBfTGlzdENvbnRleHQodGhpcykpOworICB9CisKKyAgdm9pZCBfd3JpdGVKc29uQXJyYXlFbmQoKSB7CisgICAgX3BvcENvbnRleHQoKTsKKyAgICB0cmFuc3BvcnQud3JpdGVBbGwoX0NvbnN0YW50cy5SQlJBQ0tFVF9CWVRFUyk7CisgIH0KKworICB2b2lkIHdyaXRlTWVzc2FnZUJlZ2luKFRNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICBfcmVzZXRDb250ZXh0KCk7CisKKyAgICBfd3JpdGVKc29uQXJyYXlTdGFydCgpOworICAgIF93cml0ZUpzb25JbnRlZ2VyKFZFUlNJT05fMSk7CisKKyAgICBfd3JpdGVKc29uU3RyaW5nKHV0ZjhDb2RlYy5lbmNvZGUobWVzc2FnZS5uYW1lKSk7CisgICAgX3dyaXRlSnNvbkludGVnZXIobWVzc2FnZS50eXBlKTsKKyAgICBfd3JpdGVKc29uSW50ZWdlcihtZXNzYWdlLnNlcWlkKTsKKyAgfQorCisgIHZvaWQgd3JpdGVNZXNzYWdlRW5kKCkgeworICAgIF93cml0ZUpzb25BcnJheUVuZCgpOworICB9CisKKyAgdm9pZCB3cml0ZVN0cnVjdEJlZ2luKFRTdHJ1Y3Qgc3RydWN0KSB7CisgICAgX3dyaXRlSnNvbk9iamVjdFN0YXJ0KCk7CisgIH0KKworICB2b2lkIHdyaXRlU3RydWN0RW5kKCkgeworICAgIF93cml0ZUpzb25PYmplY3RFbmQoKTsKKyAgfQorCisgIHZvaWQgd3JpdGVGaWVsZEJlZ2luKFRGaWVsZCBmaWVsZCkgeworICAgIF93cml0ZUpzb25JbnRlZ2VyKGZpZWxkLmlkKTsKKyAgICBfd3JpdGVKc29uT2JqZWN0U3RhcnQoKTsKKyAgICBfd3JpdGVKc29uU3RyaW5nKF9Db25zdGFudHMuZ2V0VHlwZU5hbWVCeXRlc0ZvclR5cGVJZChmaWVsZC50eXBlKSk7CisgIH0KKworICB2b2lkIHdyaXRlRmllbGRFbmQoKSB7CisgICAgX3dyaXRlSnNvbk9iamVjdEVuZCgpOworICB9CisKKyAgdm9pZCB3cml0ZUZpZWxkU3RvcCgpIHt9CisKKyAgdm9pZCB3cml0ZU1hcEJlZ2luKFRNYXAgbWFwKSB7CisgICAgX3dyaXRlSnNvbkFycmF5U3RhcnQoKTsKKyAgICBfd3JpdGVKc29uU3RyaW5nKF9Db25zdGFudHMuZ2V0VHlwZU5hbWVCeXRlc0ZvclR5cGVJZChtYXAua2V5VHlwZSkpOworICAgIF93cml0ZUpzb25TdHJpbmcoX0NvbnN0YW50cy5nZXRUeXBlTmFtZUJ5dGVzRm9yVHlwZUlkKG1hcC52YWx1ZVR5cGUpKTsKKyAgICBfd3JpdGVKc29uSW50ZWdlcihtYXAubGVuZ3RoKTsKKyAgICBfd3JpdGVKc29uT2JqZWN0U3RhcnQoKTsKKyAgfQorCisgIHZvaWQgd3JpdGVNYXBFbmQoKSB7CisgICAgX3dyaXRlSnNvbk9iamVjdEVuZCgpOworICAgIF93cml0ZUpzb25BcnJheUVuZCgpOworICB9CisKKyAgdm9pZCB3cml0ZUxpc3RCZWdpbihUTGlzdCBsaXN0KSB7CisgICAgX3dyaXRlSnNvbkFycmF5U3RhcnQoKTsKKyAgICBfd3JpdGVKc29uU3RyaW5nKF9Db25zdGFudHMuZ2V0VHlwZU5hbWVCeXRlc0ZvclR5cGVJZChsaXN0LmVsZW1lbnRUeXBlKSk7CisgICAgX3dyaXRlSnNvbkludGVnZXIobGlzdC5sZW5ndGgpOworICB9CisKKyAgdm9pZCB3cml0ZUxpc3RFbmQoKSB7CisgICAgX3dyaXRlSnNvbkFycmF5RW5kKCk7CisgIH0KKworICB2b2lkIHdyaXRlU2V0QmVnaW4oVFNldCBzZXQpIHsKKyAgICBfd3JpdGVKc29uQXJyYXlTdGFydCgpOworICAgIF93cml0ZUpzb25TdHJpbmcoX0NvbnN0YW50cy5nZXRUeXBlTmFtZUJ5dGVzRm9yVHlwZUlkKHNldC5lbGVtZW50VHlwZSkpOworICAgIF93cml0ZUpzb25JbnRlZ2VyKHNldC5sZW5ndGgpOworICB9CisKKyAgdm9pZCB3cml0ZVNldEVuZCgpIHsKKyAgICBfd3JpdGVKc29uQXJyYXlFbmQoKTsKKyAgfQorCisgIHZvaWQgd3JpdGVCb29sKGJvb2wgYikgeworICAgIGlmIChiID09IG51bGwpIGIgPSBmYWxzZTsKKyAgICBfd3JpdGVKc29uSW50ZWdlcihiID8gMSA6IDApOworICB9CisKKyAgdm9pZCB3cml0ZUJ5dGUoaW50IGIpIHsKKyAgICBfd3JpdGVKc29uSW50ZWdlcihiKTsKKyAgfQorCisgIHZvaWQgd3JpdGVJMTYoaW50IGkxNikgeworICAgIF93cml0ZUpzb25JbnRlZ2VyKGkxNik7CisgIH0KKworICB2b2lkIHdyaXRlSTMyKGludCBpMzIpIHsKKyAgICBfd3JpdGVKc29uSW50ZWdlcihpMzIpOworICB9CisKKyAgdm9pZCB3cml0ZUk2NChpbnQgaTY0KSB7CisgICAgX3dyaXRlSnNvbkludGVnZXIoaTY0KTsKKyAgfQorCisgIHZvaWQgd3JpdGVEb3VibGUoZG91YmxlIGQpIHsKKyAgICBfd3JpdGVKc29uRG91YmxlKGQpOworICB9CisKKyAgdm9pZCB3cml0ZVN0cmluZyhTdHJpbmcgcykgeworICAgIHZhciBieXRlcyA9IHMgIT0gbnVsbCA/IHV0ZjhDb2RlYy5lbmNvZGUocykgOiBuZXcgVWludDhMaXN0LmZyb21MaXN0KFtdKTsKKyAgICBfd3JpdGVKc29uU3RyaW5nKGJ5dGVzKTsKKyAgfQorCisgIHZvaWQgd3JpdGVCaW5hcnkoVWludDhMaXN0IGJ5dGVzKSB7CisgICAgX3dyaXRlSnNvbkJhc2U2NChieXRlcyk7CisgIH0KKworICBib29sIF9pc0hpZ2hTdXJyb2dhdGUoaW50IGIpID0+IGIgPj0gMHhEODAwICYmIGIgPD0gMHhEQkZGOworCisgIGJvb2wgX2lzTG93U3Vycm9nYXRlKGludCBiKSA9PiBiID49IDB4REMwMCAmJiBiIDw9IDB4REZGRjsKKworICAvLy8gcmVhZAorCisgIFVpbnQ4TGlzdCBfcmVhZEpzb25TdHJpbmcoe2Jvb2wgc2tpcENvbnRleHQ6IGZhbHNlfSkgeworICAgIExpc3Q8aW50PiBieXRlcyA9IFtdOworICAgIExpc3Q8aW50PiBjb2RldW5pdHMgPSBbXTsKKworICAgIGlmICghc2tpcENvbnRleHQpIHsKKyAgICAgIF9jb250ZXh0LnJlYWQoKTsKKyAgICB9CisKKyAgICBfcmVhZEpzb25TeW50YXhDaGFyKF9Db25zdGFudHMuUVVPVEVfQllURVNbMF0pOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBpbnQgYnl0ZSA9IF9yZWFkZXIucmVhZCgpOworICAgICAgaWYgKGJ5dGUgPT0gX0NvbnN0YW50cy5RVU9URV9CWVRFU1swXSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgLy8gZXNjYXBlZD8KKyAgICAgIGlmIChieXRlICE9IF9Db25zdGFudHMuRVNDU0VRX0JZVEVTWzBdKSB7CisgICAgICAgIGJ5dGVzLmFkZChieXRlKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGJ5dGUgPSBfcmVhZGVyLnJlYWQoKTsKKworICAgICAgLy8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBcdVhYWFggYW5kIGNvbnRyb2wgY2hhcnMgbGlrZSBcbgorICAgICAgaWYgKGJ5dGUgIT0gX0NvbnN0YW50cy5FU0NTRVFfQllURVNbMV0pIHsKKyAgICAgICAgU3RyaW5nIGNoYXIgPSBuZXcgU3RyaW5nLmZyb21DaGFyQ29kZShieXRlKTsKKyAgICAgICAgaW50IG9mZnNldCA9IF9Db25zdGFudHMuRVNDQVBFX0NIQVJTLmluZGV4T2YoY2hhcik7CisgICAgICAgIGlmIChvZmZzZXQgPT0gLTEpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXJyb3IoCisgICAgICAgICAgICAgIFRQcm90b2NvbEVycm9yVHlwZS5JTlZBTElEX0RBVEEsICJFeHBlY3RlZCBjb250cm9sIGNoYXIiKTsKKyAgICAgICAgfQorICAgICAgICBieXRlID0gX0NvbnN0YW50cy5FU0NBUEVfQ0hBUl9WQUxTLmNvZGVVbml0QXQob2Zmc2V0KTsKKyAgICAgICAgYnl0ZXMuYWRkKGJ5dGUpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgLy8gaXQncyBcdVhYWFgKKyAgICAgIHRyYW5zcG9ydC5yZWFkQWxsKF90ZW1wQnVmZmVyLCAwLCA0KTsKKyAgICAgIGJ5dGUgPSAoX2hleFZhbChfdGVtcEJ1ZmZlclswXSkgPDwgMTIpCisgICAgICAgICsgKF9oZXhWYWwoX3RlbXBCdWZmZXJbMV0pIDw8IDgpCisgICAgICAgICsgKF9oZXhWYWwoX3RlbXBCdWZmZXJbMl0pIDw8IDQpCisgICAgICAgICsgX2hleFZhbChfdGVtcEJ1ZmZlclszXSk7CisgICAgICBpZiAoX2lzSGlnaFN1cnJvZ2F0ZShieXRlKSkgeworICAgICAgICBpZiAoY29kZXVuaXRzLmlzTm90RW1wdHkpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXJyb3IoCisgICAgICAgICAgICAgIFRQcm90b2NvbEVycm9yVHlwZS5JTlZBTElEX0RBVEEsICJFeHBlY3RlZCBsb3cgc3Vycm9nYXRlIik7CisgICAgICAgIH0KKyAgICAgICAgY29kZXVuaXRzLmFkZChieXRlKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKF9pc0xvd1N1cnJvZ2F0ZShieXRlKSkgeworICAgICAgICBpZiAoY29kZXVuaXRzLmlzRW1wdHkpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXJyb3IoCisgICAgICAgICAgICAgIFRQcm90b2NvbEVycm9yVHlwZS5JTlZBTElEX0RBVEEsICJFeHBlY3RlZCBoaWdoIHN1cnJvZ2F0ZSIpOworICAgICAgICB9CisgICAgICAgIGNvZGV1bml0cy5hZGQoYnl0ZSk7CisgICAgICAgIGJ5dGVzLmFkZEFsbCh1dGY4Q29kZWMuZW5jb2RlKG5ldyBTdHJpbmcuZnJvbUNoYXJDb2Rlcyhjb2RldW5pdHMpKSk7CisgICAgICAgIGNvZGV1bml0cy5jbGVhcigpOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIGJ5dGVzLmFkZEFsbCh1dGY4Q29kZWMuZW5jb2RlKG5ldyBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ5dGUpKSk7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGNvZGV1bml0cy5pc05vdEVtcHR5KSB7CisgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXJyb3IoCisgICAgICAgICAgVFByb3RvY29sRXJyb3JUeXBlLklOVkFMSURfREFUQSwgIkV4cGVjdGVkIGxvdyBzdXJyb2dhdGUiKTsKKyAgICB9CisKKyAgICByZXR1cm4gbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChieXRlcyk7CisgIH0KKworICBTdHJpbmcgX3JlYWRKc29uTnVtZXJpY0NoYXJzKCkgeworICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIGlmICghX0NvbnN0YW50cy5pc0pzb25OdW1lcmljKF9yZWFkZXIucGVlaygpKSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGJ1ZmZlci53cml0ZShuZXcgU3RyaW5nLmZyb21DaGFyQ29kZShfcmVhZGVyLnJlYWQoKSkpOworICAgIH0KKyAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CisgIH0KKworICBpbnQgX3JlYWRKc29uSW50ZWdlcigpIHsKKyAgICBfY29udGV4dC5yZWFkKCk7CisKKyAgICBpZiAoX2NvbnRleHQuZXNjYXBlTnVtYmVycykgeworICAgICAgX3JlYWRKc29uU3ludGF4Q2hhcihfQ29uc3RhbnRzLlFVT1RFX0JZVEVTWzBdKTsKKyAgICB9CisgICAgU3RyaW5nIHN0ciA9IF9yZWFkSnNvbk51bWVyaWNDaGFycygpOworICAgIGlmIChfY29udGV4dC5lc2NhcGVOdW1iZXJzKSB7CisgICAgICBfcmVhZEpzb25TeW50YXhDaGFyKF9Db25zdGFudHMuUVVPVEVfQllURVNbMF0pOworICAgIH0KKworICAgIHRyeSB7CisgICAgICByZXR1cm4gaW50LnBhcnNlKHN0cik7CisgICAgfSBvbiBGb3JtYXRFeGNlcHRpb24gY2F0Y2ggKF8pIHsKKyAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFcnJvcihUUHJvdG9jb2xFcnJvclR5cGUuSU5WQUxJRF9EQVRBLAorICAgICAgICAgICJCYWQgZGF0YSBlbmNvdW50ZWQgaW4gbnVtZXJpYyBkYXRhIik7CisgICAgfQorICB9CisKKyAgZG91YmxlIF9yZWFkSnNvbkRvdWJsZSgpIHsKKyAgICBfY29udGV4dC5yZWFkKCk7CisKKyAgICBpZiAoX3JlYWRlci5wZWVrKCkgPT0gX0NvbnN0YW50cy5RVU9URV9CWVRFU1swXSkgeworICAgICAgVWludDhMaXN0IGJ5dGVzID0gX3JlYWRKc29uU3RyaW5nKHNraXBDb250ZXh0OiB0cnVlKTsKKyAgICAgIGRvdWJsZSBkID0gZG91YmxlLnBhcnNlKHV0ZjhDb2RlYy5kZWNvZGUoYnl0ZXMpLCAoXykgeworICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXJyb3IoVFByb3RvY29sRXJyb3JUeXBlLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICJCYWQgZGF0YSBlbmNvdW50ZWQgaW4gbnVtZXJpYyBkYXRhIik7CisgICAgICB9KTsKKyAgICAgIGlmICghX2NvbnRleHQuZXNjYXBlTnVtYmVycyAmJiAhZC5pc05hTiAmJiAhZC5pc0luZmluaXRlKSB7CisgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFcnJvcihUUHJvdG9jb2xFcnJvclR5cGUuSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgIk51bWVyaWMgZGF0YSB1bmV4cGVjdGVkbHkgcXVvdGVkIik7CisgICAgICB9CisgICAgICByZXR1cm4gZDsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKF9jb250ZXh0LmVzY2FwZU51bWJlcnMpIHsKKyAgICAgICAgLy8gVGhpcyB3aWxsIHRocm93IC0gd2Ugc2hvdWxkIGhhdmUgaGFkIGEgcXVvdGUgaWYgZXNjYXBlTnVtYmVycyA9PSB0cnVlCisgICAgICAgIF9yZWFkSnNvblN5bnRheENoYXIoX0NvbnN0YW50cy5RVU9URV9CWVRFU1swXSk7CisgICAgICB9CisgICAgICByZXR1cm4gZG91YmxlLnBhcnNlKF9yZWFkSnNvbk51bWVyaWNDaGFycygpLCAoXykgeworICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXJyb3IoVFByb3RvY29sRXJyb3JUeXBlLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICJCYWQgZGF0YSBlbmNvdW50ZWQgaW4gbnVtZXJpYyBkYXRhIik7CisgICAgICB9KTsKKyAgICB9CisgIH0KKworICBVaW50OExpc3QgX3JlYWRKc29uQmFzZTY0KCkgeworICAgIC8vIGNvbnZlcnQgVVRGLTggYnl0ZXMgb2YgYSBCYXNlIDY0IGVuY29kZWQgc3RyaW5nIHRvIGJpbmFyeSBieXRlcworICAgIFVpbnQ4TGlzdCBiYXNlNjRCeXRlcyA9IF9yZWFkSnNvblN0cmluZygpOworICAgIFN0cmluZyBiYXNlNjQgPSB1dGY4Q29kZWMuZGVjb2RlKGJhc2U2NEJ5dGVzKTsKKworICAgIHJldHVybiBuZXcgVWludDhMaXN0LmZyb21MaXN0KEJBU0U2NC5kZWNvZGUoYmFzZTY0KSk7CisgIH0KKworICB2b2lkIF9yZWFkSnNvbk9iamVjdFN0YXJ0KCkgeworICAgIF9jb250ZXh0LnJlYWQoKTsKKyAgICBfcmVhZEpzb25TeW50YXhDaGFyKF9Db25zdGFudHMuTEJSQUNFX0JZVEVTWzBdKTsKKyAgICBfcHVzaENvbnRleHQobmV3IF9QYWlyQ29udGV4dCh0aGlzKSk7CisgIH0KKworICB2b2lkIF9yZWFkSnNvbk9iamVjdEVuZCgpIHsKKyAgICBfcmVhZEpzb25TeW50YXhDaGFyKF9Db25zdGFudHMuUkJSQUNFX0JZVEVTWzBdKTsKKyAgICBfcG9wQ29udGV4dCgpOworICB9CisKKyAgdm9pZCBfcmVhZEpzb25BcnJheVN0YXJ0KCkgeworICAgIF9jb250ZXh0LnJlYWQoKTsKKyAgICBfcmVhZEpzb25TeW50YXhDaGFyKF9Db25zdGFudHMuTEJSQUNLRVRfQllURVNbMF0pOworICAgIF9wdXNoQ29udGV4dChuZXcgX0xpc3RDb250ZXh0KHRoaXMpKTsKKyAgfQorCisgIHZvaWQgX3JlYWRKc29uQXJyYXlFbmQoKSB7CisgICAgX3JlYWRKc29uU3ludGF4Q2hhcihfQ29uc3RhbnRzLlJCUkFDS0VUX0JZVEVTWzBdKTsKKyAgICBfcG9wQ29udGV4dCgpOworICB9CisKKyAgVE1lc3NhZ2UgcmVhZE1lc3NhZ2VCZWdpbigpIHsKKyAgICBfcmVzZXRDb250ZXh0KCk7CisKKyAgICBfcmVhZEpzb25BcnJheVN0YXJ0KCk7CisgICAgaWYgKF9yZWFkSnNvbkludGVnZXIoKSAhPSBWRVJTSU9OXzEpIHsKKyAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFcnJvcigKKyAgICAgICAgICBUUHJvdG9jb2xFcnJvclR5cGUuQkFEX1ZFUlNJT04sICJNZXNzYWdlIGNvbnRhaW5lZCBiYWQgdmVyc2lvbi4iKTsKKyAgICB9CisKKyAgICBVaW50OExpc3QgYnVmZmVyID0gX3JlYWRKc29uU3RyaW5nKCk7CisgICAgU3RyaW5nIG5hbWUgPSB1dGY4Q29kZWMuZGVjb2RlKGJ1ZmZlcik7CisgICAgaW50IHR5cGUgPSBfcmVhZEpzb25JbnRlZ2VyKCk7CisgICAgaW50IHNlcWlkID0gX3JlYWRKc29uSW50ZWdlcigpOworCisgICAgcmV0dXJuIG5ldyBUTWVzc2FnZShuYW1lLCB0eXBlLCBzZXFpZCk7CisgIH0KKworICB2b2lkIHJlYWRNZXNzYWdlRW5kKCkgeworICAgIF9yZWFkSnNvbkFycmF5RW5kKCk7CisgIH0KKworICBUU3RydWN0IHJlYWRTdHJ1Y3RCZWdpbigpIHsKKyAgICBfcmVhZEpzb25PYmplY3RTdGFydCgpOworICAgIHJldHVybiBuZXcgVFN0cnVjdCgpOworICB9CisKKyAgdm9pZCByZWFkU3RydWN0RW5kKCkgeworICAgIF9yZWFkSnNvbk9iamVjdEVuZCgpOworICB9CisKKyAgVEZpZWxkIHJlYWRGaWVsZEJlZ2luKCkgeworICAgIFN0cmluZyBuYW1lID0gIiI7CisgICAgaW50IHR5cGUgPSBUVHlwZS5TVE9QOworICAgIGludCBpZCA9IDA7CisKKyAgICBpZiAoX3JlYWRlci5wZWVrKCkgIT0gX0NvbnN0YW50cy5SQlJBQ0VfQllURVNbMF0pIHsKKyAgICAgIGlkID0gX3JlYWRKc29uSW50ZWdlcigpOworICAgICAgX3JlYWRKc29uT2JqZWN0U3RhcnQoKTsKKyAgICAgIHR5cGUgPSBfQ29uc3RhbnRzLmdldFR5cGVJZEZvclR5cGVOYW1lKF9yZWFkSnNvblN0cmluZygpKTsKKyAgICB9CisKKyAgICByZXR1cm4gbmV3IFRGaWVsZChuYW1lLCB0eXBlLCBpZCk7CisgIH0KKworICB2b2lkIHJlYWRGaWVsZEVuZCgpIHsKKyAgICBfcmVhZEpzb25PYmplY3RFbmQoKTsKKyAgfQorCisgIFRNYXAgcmVhZE1hcEJlZ2luKCkgeworICAgIF9yZWFkSnNvbkFycmF5U3RhcnQoKTsKKyAgICBpbnQga2V5VHlwZSA9IF9Db25zdGFudHMuZ2V0VHlwZUlkRm9yVHlwZU5hbWUoX3JlYWRKc29uU3RyaW5nKCkpOworICAgIGludCB2YWx1ZVR5cGUgPSBfQ29uc3RhbnRzLmdldFR5cGVJZEZvclR5cGVOYW1lKF9yZWFkSnNvblN0cmluZygpKTsKKyAgICBpbnQgbGVuZ3RoID0gX3JlYWRKc29uSW50ZWdlcigpOworICAgIF9yZWFkSnNvbk9iamVjdFN0YXJ0KCk7CisKKyAgICByZXR1cm4gbmV3IFRNYXAoa2V5VHlwZSwgdmFsdWVUeXBlLCBsZW5ndGgpOworICB9CisKKyAgdm9pZCByZWFkTWFwRW5kKCkgeworICAgIF9yZWFkSnNvbk9iamVjdEVuZCgpOworICAgIF9yZWFkSnNvbkFycmF5RW5kKCk7CisgIH0KKworICBUTGlzdCByZWFkTGlzdEJlZ2luKCkgeworICAgIF9yZWFkSnNvbkFycmF5U3RhcnQoKTsKKyAgICBpbnQgZWxlbWVudFR5cGUgPSBfQ29uc3RhbnRzLmdldFR5cGVJZEZvclR5cGVOYW1lKF9yZWFkSnNvblN0cmluZygpKTsKKyAgICBpbnQgbGVuZ3RoID0gX3JlYWRKc29uSW50ZWdlcigpOworCisgICAgcmV0dXJuIG5ldyBUTGlzdChlbGVtZW50VHlwZSwgbGVuZ3RoKTsKKyAgfQorCisgIHZvaWQgcmVhZExpc3RFbmQoKSB7CisgICAgX3JlYWRKc29uQXJyYXlFbmQoKTsKKyAgfQorCisgIFRTZXQgcmVhZFNldEJlZ2luKCkgeworICAgIF9yZWFkSnNvbkFycmF5U3RhcnQoKTsKKyAgICBpbnQgZWxlbWVudFR5cGUgPSBfQ29uc3RhbnRzLmdldFR5cGVJZEZvclR5cGVOYW1lKF9yZWFkSnNvblN0cmluZygpKTsKKyAgICBpbnQgbGVuZ3RoID0gX3JlYWRKc29uSW50ZWdlcigpOworCisgICAgcmV0dXJuIG5ldyBUU2V0KGVsZW1lbnRUeXBlLCBsZW5ndGgpOworICB9CisKKyAgdm9pZCByZWFkU2V0RW5kKCkgeworICAgIF9yZWFkSnNvbkFycmF5RW5kKCk7CisgIH0KKworICBib29sIHJlYWRCb29sKCkgeworICAgIHJldHVybiBfcmVhZEpzb25JbnRlZ2VyKCkgPT0gMCA/IGZhbHNlIDogdHJ1ZTsKKyAgfQorCisgIGludCByZWFkQnl0ZSgpIHsKKyAgICByZXR1cm4gX3JlYWRKc29uSW50ZWdlcigpOworICB9CisKKyAgaW50IHJlYWRJMTYoKSB7CisgICAgcmV0dXJuIF9yZWFkSnNvbkludGVnZXIoKTsKKyAgfQorCisgIGludCByZWFkSTMyKCkgeworICAgIHJldHVybiBfcmVhZEpzb25JbnRlZ2VyKCk7CisgIH0KKworICBpbnQgcmVhZEk2NCgpIHsKKyAgICByZXR1cm4gX3JlYWRKc29uSW50ZWdlcigpOworICB9CisKKyAgZG91YmxlIHJlYWREb3VibGUoKSB7CisgICAgcmV0dXJuIF9yZWFkSnNvbkRvdWJsZSgpOworICB9CisKKyAgU3RyaW5nIHJlYWRTdHJpbmcoKSB7CisgICAgcmV0dXJuIHV0ZjhDb2RlYy5kZWNvZGUoX3JlYWRKc29uU3RyaW5nKCkpOworICB9CisKKyAgVWludDhMaXN0IHJlYWRCaW5hcnkoKSB7CisgICAgcmV0dXJuIG5ldyBVaW50OExpc3QuZnJvbUxpc3QoX3JlYWRKc29uQmFzZTY0KCkpOworICB9Cit9CisKK2NsYXNzIF9Db25zdGFudHMgeworICBzdGF0aWMgY29uc3QgdXRmOGNvZGVjID0gY29uc3QgVXRmOENvZGVjKCk7CisKKyAgc3RhdGljIGZpbmFsIFVpbnQ4TGlzdCBIRVhfMF9CWVRFUyA9IG5ldyBVaW50OExpc3QuZnJvbUxpc3QoJzAnLmNvZGVVbml0cyk7CisgIHN0YXRpYyBmaW5hbCBVaW50OExpc3QgSEVYXzlfQllURVMgPSBuZXcgVWludDhMaXN0LmZyb21MaXN0KCc5Jy5jb2RlVW5pdHMpOworICBzdGF0aWMgZmluYWwgVWludDhMaXN0IEhFWF9BX0JZVEVTID0gbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdCgnYScuY29kZVVuaXRzKTsKKyAgc3RhdGljIGZpbmFsIFVpbnQ4TGlzdCBIRVhfRl9CWVRFUyA9IG5ldyBVaW50OExpc3QuZnJvbUxpc3QoJ2YnLmNvZGVVbml0cyk7CisgIHN0YXRpYyBmaW5hbCBVaW50OExpc3QgQ09NTUFfQllURVMgPSBuZXcgVWludDhMaXN0LmZyb21MaXN0KCcsJy5jb2RlVW5pdHMpOworICBzdGF0aWMgZmluYWwgVWludDhMaXN0IENPTE9OX0JZVEVTID0gbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdCgnOicuY29kZVVuaXRzKTsKKyAgc3RhdGljIGZpbmFsIFVpbnQ4TGlzdCBMQlJBQ0VfQllURVMgPSBuZXcgVWludDhMaXN0LmZyb21MaXN0KCd7Jy5jb2RlVW5pdHMpOworICBzdGF0aWMgZmluYWwgVWludDhMaXN0IFJCUkFDRV9CWVRFUyA9IG5ldyBVaW50OExpc3QuZnJvbUxpc3QoJ30nLmNvZGVVbml0cyk7CisgIHN0YXRpYyBmaW5hbCBVaW50OExpc3QgTEJSQUNLRVRfQllURVMgPSBuZXcgVWludDhMaXN0LmZyb21MaXN0KCdbJy5jb2RlVW5pdHMpOworICBzdGF0aWMgZmluYWwgVWludDhMaXN0IFJCUkFDS0VUX0JZVEVTID0gbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdCgnXScuY29kZVVuaXRzKTsKKyAgc3RhdGljIGZpbmFsIFVpbnQ4TGlzdCBRVU9URV9CWVRFUyA9IG5ldyBVaW50OExpc3QuZnJvbUxpc3QoJyInLmNvZGVVbml0cyk7CisgIHN0YXRpYyBmaW5hbCBVaW50OExpc3QgQkFDS1NMQVNIX0JZVEVTID0KKyAgICAgIG5ldyBVaW50OExpc3QuZnJvbUxpc3QocidcJy5jb2RlVW5pdHMpOworCisgIHN0YXRpYyBmaW5hbCBFU0NTRVFfQllURVMgPSBuZXcgVWludDhMaXN0LmZyb21MaXN0KHInXHUwMCcuY29kZVVuaXRzKTsKKworICBzdGF0aWMgZmluYWwgVWludDhMaXN0IEpTT05fQ0hBUl9UQUJMRSA9IG5ldyBVaW50OExpc3QuZnJvbUxpc3QoWworICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIC8vIDggYnl0ZXMKKyAgICAnYicuY29kZVVuaXRBdCgwKSwgJ3QnLmNvZGVVbml0QXQoMCksICduJy5jb2RlVW5pdEF0KDApLCAwLCAvLyA0IGJ5dGVzCisgICAgJ2YnLmNvZGVVbml0QXQoMCksICdyJy5jb2RlVW5pdEF0KDApLCAwLCAwLCAvLyA0IGJ5dGVzCisgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgLy8gOCBieXRlcworICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIC8vIDggYnl0ZXMKKyAgICAxLCAxLCAnIicuY29kZVVuaXRBdCgwKSwgMSwgMSwgMSwgMSwgMSwgLy8gOCBieXRlcworICAgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEgLy8gOCBieXRlcworICBdKTsKKworICBzdGF0aWMgY29uc3QgU3RyaW5nIEVTQ0FQRV9DSEFSUyA9IHInIlwvYmZucnQnOworICBzdGF0aWMgY29uc3QgU3RyaW5nIEVTQ0FQRV9DSEFSX1ZBTFMgPSAnIlxcL1xiXGZcblxyXHQnOworCisgIHN0YXRpYyBjb25zdCBTdHJpbmcgTkFNRV9CT09MID0gJ3RmJzsKKyAgc3RhdGljIGNvbnN0IFN0cmluZyBOQU1FX0JZVEUgPSAnaTgnOworICBzdGF0aWMgY29uc3QgU3RyaW5nIE5BTUVfSTE2ID0gJ2kxNic7CisgIHN0YXRpYyBjb25zdCBTdHJpbmcgTkFNRV9JMzIgPSAnaTMyJzsKKyAgc3RhdGljIGNvbnN0IFN0cmluZyBOQU1FX0k2NCA9ICdpNjQnOworICBzdGF0aWMgY29uc3QgU3RyaW5nIE5BTUVfRE9VQkxFID0gJ2RibCc7CisgIHN0YXRpYyBjb25zdCBTdHJpbmcgTkFNRV9TVFJVQ1QgPSAncmVjJzsKKyAgc3RhdGljIGNvbnN0IFN0cmluZyBOQU1FX1NUUklORyA9ICdzdHInOworICBzdGF0aWMgY29uc3QgU3RyaW5nIE5BTUVfTUFQID0gJ21hcCc7CisgIHN0YXRpYyBjb25zdCBTdHJpbmcgTkFNRV9MSVNUID0gJ2xzdCc7CisgIHN0YXRpYyBjb25zdCBTdHJpbmcgTkFNRV9TRVQgPSAnc2V0JzsKKworICBzdGF0aWMgZmluYWwgTWFwPGludCwgVWludDhMaXN0PiBfVFlQRV9JRF9UT19OQU1FX0JZVEVTID0KKyAgICAgIG5ldyBNYXAudW5tb2RpZmlhYmxlKHsKKyAgICBUVHlwZS5CT09MOiBuZXcgVWludDhMaXN0LmZyb21MaXN0KE5BTUVfQk9PTC5jb2RlVW5pdHMpLAorICAgIFRUeXBlLkJZVEU6IG5ldyBVaW50OExpc3QuZnJvbUxpc3QoTkFNRV9CWVRFLmNvZGVVbml0cyksCisgICAgVFR5cGUuSTE2OiBuZXcgVWludDhMaXN0LmZyb21MaXN0KE5BTUVfSTE2LmNvZGVVbml0cyksCisgICAgVFR5cGUuSTMyOiBuZXcgVWludDhMaXN0LmZyb21MaXN0KE5BTUVfSTMyLmNvZGVVbml0cyksCisgICAgVFR5cGUuSTY0OiBuZXcgVWludDhMaXN0LmZyb21MaXN0KE5BTUVfSTY0LmNvZGVVbml0cyksCisgICAgVFR5cGUuRE9VQkxFOiBuZXcgVWludDhMaXN0LmZyb21MaXN0KE5BTUVfRE9VQkxFLmNvZGVVbml0cyksCisgICAgVFR5cGUuU1RSSU5HOiBuZXcgVWludDhMaXN0LmZyb21MaXN0KE5BTUVfU1RSSU5HLmNvZGVVbml0cyksCisgICAgVFR5cGUuU1RSVUNUOiBuZXcgVWludDhMaXN0LmZyb21MaXN0KE5BTUVfU1RSVUNULmNvZGVVbml0cyksCisgICAgVFR5cGUuTUFQOiBuZXcgVWludDhMaXN0LmZyb21MaXN0KE5BTUVfTUFQLmNvZGVVbml0cyksCisgICAgVFR5cGUuU0VUOiBuZXcgVWludDhMaXN0LmZyb21MaXN0KE5BTUVfU0VULmNvZGVVbml0cyksCisgICAgVFR5cGUuTElTVDogbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChOQU1FX0xJU1QuY29kZVVuaXRzKQorICB9KTsKKworICBzdGF0aWMgVWludDhMaXN0IGdldFR5cGVOYW1lQnl0ZXNGb3JUeXBlSWQoaW50IHR5cGVJZCkgeworICAgIGlmICghX1RZUEVfSURfVE9fTkFNRV9CWVRFUy5jb250YWluc0tleSh0eXBlSWQpKSB7CisgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXJyb3IoCisgICAgICAgICAgVFByb3RvY29sRXJyb3JUeXBlLk5PVF9JTVBMRU1FTlRFRCwgIlVucmVjb2duaXplZCB0eXBlIik7CisgICAgfQorCisgICAgcmV0dXJuIF9UWVBFX0lEX1RPX05BTUVfQllURVNbdHlwZUlkXTsKKyAgfQorCisgIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBpbnQ+IF9OQU1FX1RPX1RZUEVfSUQgPSBuZXcgTWFwLnVubW9kaWZpYWJsZSh7CisgICAgTkFNRV9CT09MOiBUVHlwZS5CT09MLAorICAgIE5BTUVfQllURTogVFR5cGUuQllURSwKKyAgICBOQU1FX0kxNjogVFR5cGUuSTE2LAorICAgIE5BTUVfSTMyOiBUVHlwZS5JMzIsCisgICAgTkFNRV9JNjQ6IFRUeXBlLkk2NCwKKyAgICBOQU1FX0RPVUJMRTogVFR5cGUuRE9VQkxFLAorICAgIE5BTUVfU1RSSU5HOiBUVHlwZS5TVFJJTkcsCisgICAgTkFNRV9TVFJVQ1Q6IFRUeXBlLlNUUlVDVCwKKyAgICBOQU1FX01BUDogVFR5cGUuTUFQLAorICAgIE5BTUVfU0VUOiBUVHlwZS5TRVQsCisgICAgTkFNRV9MSVNUOiBUVHlwZS5MSVNUCisgIH0pOworCisgIHN0YXRpYyBpbnQgZ2V0VHlwZUlkRm9yVHlwZU5hbWUoVWludDhMaXN0IGJ5dGVzKSB7CisgICAgU3RyaW5nIG5hbWUgPSB1dGY4Y29kZWMuZGVjb2RlKGJ5dGVzKTsKKyAgICBpZiAoIV9OQU1FX1RPX1RZUEVfSUQuY29udGFpbnNLZXkobmFtZSkpIHsKKyAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFcnJvcigKKyAgICAgICAgICBUUHJvdG9jb2xFcnJvclR5cGUuTk9UX0lNUExFTUVOVEVELCAiVW5yZWNvZ25pemVkIHR5cGUiKTsKKyAgICB9CisKKyAgICByZXR1cm4gX05BTUVfVE9fVFlQRV9JRFtuYW1lXTsKKyAgfQorCisgIHN0YXRpYyBmaW5hbCBTZXQ8aW50PiBfSlNPTl9OVU1FUklDUyA9IG5ldyBTZXQuZnJvbShbCisgICAgJysnLmNvZGVVbml0QXQoMCksCisgICAgJy0nLmNvZGVVbml0QXQoMCksCisgICAgJy4nLmNvZGVVbml0QXQoMCksCisgICAgJzAnLmNvZGVVbml0QXQoMCksCisgICAgJzEnLmNvZGVVbml0QXQoMCksCisgICAgJzInLmNvZGVVbml0QXQoMCksCisgICAgJzMnLmNvZGVVbml0QXQoMCksCisgICAgJzQnLmNvZGVVbml0QXQoMCksCisgICAgJzUnLmNvZGVVbml0QXQoMCksCisgICAgJzYnLmNvZGVVbml0QXQoMCksCisgICAgJzcnLmNvZGVVbml0QXQoMCksCisgICAgJzgnLmNvZGVVbml0QXQoMCksCisgICAgJzknLmNvZGVVbml0QXQoMCksCisgICAgJ0UnLmNvZGVVbml0QXQoMCksCisgICAgJ2UnLmNvZGVVbml0QXQoMCkKKyAgXSk7CisKKyAgc3RhdGljIGJvb2wgaXNKc29uTnVtZXJpYyhpbnQgYnl0ZSkgeworICAgIHJldHVybiBfSlNPTl9OVU1FUklDUy5jb250YWlucyhieXRlKTsKKyAgfQorfQorCitjbGFzcyBfTG9va2FoZWFkUmVhZGVyIHsKKyAgZmluYWwgVEpzb25Qcm90b2NvbCBwcm90b2NvbDsKKworICBfTG9va2FoZWFkUmVhZGVyKHRoaXMucHJvdG9jb2wpOworCisgIGJvb2wgX2hhc0RhdGEgPSBmYWxzZTsKKyAgZmluYWwgVWludDhMaXN0IF9kYXRhID0gbmV3IFVpbnQ4TGlzdCgxKTsKKworICBpbnQgcmVhZCgpIHsKKyAgICBpZiAoX2hhc0RhdGEpIHsKKyAgICAgIF9oYXNEYXRhID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIHByb3RvY29sLnRyYW5zcG9ydC5yZWFkQWxsKF9kYXRhLCAwLCAxKTsKKyAgICB9CisKKyAgICByZXR1cm4gX2RhdGFbMF07CisgIH0KKworICBpbnQgcGVlaygpIHsKKyAgICBpZiAoIV9oYXNEYXRhKSB7CisgICAgICBwcm90b2NvbC50cmFuc3BvcnQucmVhZEFsbChfZGF0YSwgMCwgMSk7CisgICAgfQorICAgIF9oYXNEYXRhID0gdHJ1ZTsKKworICAgIHJldHVybiBfZGF0YVswXTsKKyAgfQorfQorCitjbGFzcyBfQmFzZUNvbnRleHQgeworICBmaW5hbCBUSnNvblByb3RvY29sIHByb3RvY29sOworCisgIF9CYXNlQ29udGV4dCh0aGlzLnByb3RvY29sKTsKKworICB2b2lkIHdyaXRlKCkge30KKworICB2b2lkIHJlYWQoKSB7fQorCisgIGJvb2wgZ2V0IGVzY2FwZU51bWJlcnMgPT4gZmFsc2U7CisKKyAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJ0Jhc2VDb250ZXh0JzsKK30KKworY2xhc3MgX0xpc3RDb250ZXh0IGV4dGVuZHMgX0Jhc2VDb250ZXh0IHsKKyAgX0xpc3RDb250ZXh0KFRKc29uUHJvdG9jb2wgcHJvdG9jb2wpIDogc3VwZXIocHJvdG9jb2wpOworCisgIGJvb2wgX2ZpcnN0ID0gdHJ1ZTsKKworICB2b2lkIHdyaXRlKCkgeworICAgIGlmIChfZmlyc3QpIHsKKyAgICAgIF9maXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBwcm90b2NvbC50cmFuc3BvcnQud3JpdGVBbGwoX0NvbnN0YW50cy5DT01NQV9CWVRFUyk7CisgICAgfQorICB9CisKKyAgdm9pZCByZWFkKCkgeworICAgIGlmIChfZmlyc3QpIHsKKyAgICAgIF9maXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBwcm90b2NvbC5fcmVhZEpzb25TeW50YXhDaGFyKF9Db25zdGFudHMuQ09NTUFfQllURVNbMF0pOworICAgIH0KKyAgfQorCisgIFN0cmluZyB0b1N0cmluZygpID0+ICdMaXN0Q29udGV4dCc7Cit9CisKK2NsYXNzIF9QYWlyQ29udGV4dCBleHRlbmRzIF9CYXNlQ29udGV4dCB7CisgIF9QYWlyQ29udGV4dChUSnNvblByb3RvY29sIHByb3RvY29sKSA6IHN1cGVyKHByb3RvY29sKTsKKworICBib29sIF9maXJzdCA9IHRydWU7CisgIGJvb2wgX2NvbG9uID0gdHJ1ZTsKKworICBVaW50OExpc3QgZ2V0IHN5bWJvbEJ5dGVzID0+CisgICAgICBfY29sb24gPyBfQ29uc3RhbnRzLkNPTE9OX0JZVEVTIDogX0NvbnN0YW50cy5DT01NQV9CWVRFUzsKKworICB2b2lkIHdyaXRlKCkgeworICAgIGlmIChfZmlyc3QpIHsKKyAgICAgIF9maXJzdCA9IGZhbHNlOworICAgICAgX2NvbG9uID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgcHJvdG9jb2wudHJhbnNwb3J0LndyaXRlQWxsKHN5bWJvbEJ5dGVzKTsKKyAgICAgIF9jb2xvbiA9ICFfY29sb247CisgICAgfQorICB9CisKKyAgdm9pZCByZWFkKCkgeworICAgIGlmIChfZmlyc3QpIHsKKyAgICAgIF9maXJzdCA9IGZhbHNlOworICAgICAgX2NvbG9uID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgcHJvdG9jb2wuX3JlYWRKc29uU3ludGF4Q2hhcihzeW1ib2xCeXRlc1swXSk7CisgICAgICBfY29sb24gPSAhX2NvbG9uOworICAgIH0KKyAgfQorCisgIGJvb2wgZ2V0IGVzY2FwZU51bWJlcnMgPT4gX2NvbG9uOworCisgIFN0cmluZyB0b1N0cmluZygpID0+ICdQYWlyQ29udGV4dCc7Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfbGlzdC5kYXJ0IGIvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X2xpc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWY0NjczCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X2xpc3QuZGFydApAQCAtMCwwICsxLDI1IEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFydCBvZiB0aHJpZnQ7CisKK2NsYXNzIFRMaXN0IHsKKyAgZmluYWwgaW50IGVsZW1lbnRUeXBlOworICBmaW5hbCBpbnQgbGVuZ3RoOworCisgIFRMaXN0KHRoaXMuZWxlbWVudFR5cGUsIHRoaXMubGVuZ3RoKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9tYXAuZGFydCBiL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9tYXAuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmRmNjgxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X21hcC5kYXJ0CkBAIC0wLDAgKzEsMjYgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYXJ0IG9mIHRocmlmdDsKKworY2xhc3MgVE1hcCB7CisgIGZpbmFsIGludCBrZXlUeXBlOworICBmaW5hbCBpbnQgdmFsdWVUeXBlOworICBmaW5hbCBpbnQgbGVuZ3RoOworCisgIFRNYXAodGhpcy5rZXlUeXBlLCB0aGlzLnZhbHVlVHlwZSwgdGhpcy5sZW5ndGgpOworfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X21lc3NhZ2UuZGFydCBiL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9tZXNzYWdlLmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M3Yjg4NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9tZXNzYWdlLmRhcnQKQEAgLTAsMCArMSwzNSBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhcnQgb2YgdGhyaWZ0OworCitjbGFzcyBUTWVzc2FnZVR5cGUgeworICBzdGF0aWMgY29uc3QgaW50IENBTEwgPSAxOworICBzdGF0aWMgY29uc3QgaW50IFJFUExZID0gMjsKKyAgc3RhdGljIGNvbnN0IGludCBFWENFUFRJT04gPSAzOworICBzdGF0aWMgY29uc3QgaW50IE9ORVdBWSA9IDQ7Cit9CisKK2NsYXNzIFRNZXNzYWdlIHsKKyAgZmluYWwgU3RyaW5nIG5hbWU7CisgIGZpbmFsIGludCB0eXBlOworICBmaW5hbCBpbnQgc2VxaWQ7CisKKyAgVE1lc3NhZ2UodGhpcy5uYW1lLCB0aGlzLnR5cGUsIHRoaXMuc2VxaWQpOworCisgIFN0cmluZyB0b1N0cmluZygpID0+ICI8VE1lc3NhZ2UgbmFtZTogJyRuYW1lJyB0eXBlOiAkdHlwZSBzZXFpZDogJHNlcWlkPiI7Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfbXVsdGlwbGV4ZWRfcHJvdG9jb2wuZGFydCBiL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9tdWx0aXBsZXhlZF9wcm90b2NvbC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3OGE2ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfbXVsdGlwbGV4ZWRfcHJvdG9jb2wuZGFydApAQCAtMCwwICsxLDQzIEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFydCBvZiB0aHJpZnQ7CisKKy8vLyBBZGFwdGVkIGZyb20gdGhlIEMjIHZlcnNpb24uCitjbGFzcyBUTXVsdGlwbGV4ZWRQcm90b2NvbCBleHRlbmRzIFRQcm90b2NvbERlY29yYXRvciB7CisgIHN0YXRpYyBjb25zdCBTRVBBUkFUT1IgPSAnOic7CisKKyAgZmluYWwgU3RyaW5nIF9zZXJ2aWNlTmFtZTsKKworICBUTXVsdGlwbGV4ZWRQcm90b2NvbChUUHJvdG9jb2wgcHJvdG9jb2wsIFN0cmluZyBzZXJ2aWNlTmFtZSkKKyAgICAgIDogX3NlcnZpY2VOYW1lID0gc2VydmljZU5hbWUsCisgICAgICAgIHN1cGVyKHByb3RvY29sKSB7CisgICAgaWYgKHNlcnZpY2VOYW1lID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yLm5vdE51bGwoInNlcnZpY2VOYW1lIik7CisgICAgfQorICB9CisKKyAgdm9pZCB3cml0ZU1lc3NhZ2VCZWdpbihUTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgaWYgKG1lc3NhZ2UudHlwZSA9PSBUTWVzc2FnZVR5cGUuQ0FMTCB8fAorICAgICAgICBtZXNzYWdlLnR5cGUgPT0gVE1lc3NhZ2VUeXBlLk9ORVdBWSkgeworICAgICAgU3RyaW5nIG5hbWUgPSBfc2VydmljZU5hbWUgKyBTRVBBUkFUT1IgKyBtZXNzYWdlLm5hbWU7CisgICAgICBtZXNzYWdlID0gbmV3IFRNZXNzYWdlKG5hbWUsIG1lc3NhZ2UudHlwZSwgbWVzc2FnZS5zZXFpZCk7CisgICAgfQorCisgICAgc3VwZXIud3JpdGVNZXNzYWdlQmVnaW4obWVzc2FnZSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9wcm90b2NvbC5kYXJ0IGIvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X3Byb3RvY29sLmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ5YzAzMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9wcm90b2NvbC5kYXJ0CkBAIC0wLDAgKzEsOTUgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYXJ0IG9mIHRocmlmdDsKKworYWJzdHJhY3QgY2xhc3MgVFByb3RvY29sIHsKKyAgZmluYWwgVFRyYW5zcG9ydCB0cmFuc3BvcnQ7CisKKyAgVFByb3RvY29sKHRoaXMudHJhbnNwb3J0KTsKKworICAvLy8gV3JpdGUKKyAgdm9pZCB3cml0ZU1lc3NhZ2VCZWdpbihUTWVzc2FnZSBtZXNzYWdlKTsKKyAgdm9pZCB3cml0ZU1lc3NhZ2VFbmQoKTsKKworICB2b2lkIHdyaXRlU3RydWN0QmVnaW4oVFN0cnVjdCBzdHJ1Y3QpOworICB2b2lkIHdyaXRlU3RydWN0RW5kKCk7CisKKyAgdm9pZCB3cml0ZUZpZWxkQmVnaW4oVEZpZWxkIGZpZWxkKTsKKyAgdm9pZCB3cml0ZUZpZWxkRW5kKCk7CisgIHZvaWQgd3JpdGVGaWVsZFN0b3AoKTsKKworICB2b2lkIHdyaXRlTWFwQmVnaW4oVE1hcCBtYXApOworICB2b2lkIHdyaXRlTWFwRW5kKCk7CisKKyAgdm9pZCB3cml0ZUxpc3RCZWdpbihUTGlzdCBsaXN0KTsKKyAgdm9pZCB3cml0ZUxpc3RFbmQoKTsKKworICB2b2lkIHdyaXRlU2V0QmVnaW4oVFNldCBzZXQpOworICB2b2lkIHdyaXRlU2V0RW5kKCk7CisKKyAgdm9pZCB3cml0ZUJvb2woYm9vbCBiKTsKKworICB2b2lkIHdyaXRlQnl0ZShpbnQgYik7CisKKyAgdm9pZCB3cml0ZUkxNihpbnQgaTE2KTsKKworICB2b2lkIHdyaXRlSTMyKGludCBpMzIpOworCisgIHZvaWQgd3JpdGVJNjQoaW50IGk2NCk7CisKKyAgdm9pZCB3cml0ZURvdWJsZShkb3VibGUgZCk7CisKKyAgdm9pZCB3cml0ZVN0cmluZyhTdHJpbmcgc3RyKTsKKworICB2b2lkIHdyaXRlQmluYXJ5KFVpbnQ4TGlzdCBieXRlcyk7CisKKyAgLy8vIFJlYWQKKyAgVE1lc3NhZ2UgcmVhZE1lc3NhZ2VCZWdpbigpOworICB2b2lkIHJlYWRNZXNzYWdlRW5kKCk7CisKKyAgVFN0cnVjdCByZWFkU3RydWN0QmVnaW4oKTsKKyAgdm9pZCByZWFkU3RydWN0RW5kKCk7CisKKyAgVEZpZWxkIHJlYWRGaWVsZEJlZ2luKCk7CisgIHZvaWQgcmVhZEZpZWxkRW5kKCk7CisKKyAgVE1hcCByZWFkTWFwQmVnaW4oKTsKKyAgdm9pZCByZWFkTWFwRW5kKCk7CisKKyAgVExpc3QgcmVhZExpc3RCZWdpbigpOworICB2b2lkIHJlYWRMaXN0RW5kKCk7CisKKyAgVFNldCByZWFkU2V0QmVnaW4oKTsKKyAgdm9pZCByZWFkU2V0RW5kKCk7CisKKyAgYm9vbCByZWFkQm9vbCgpOworCisgIGludCByZWFkQnl0ZSgpOworCisgIGludCByZWFkSTE2KCk7CisKKyAgaW50IHJlYWRJMzIoKTsKKworICBpbnQgcmVhZEk2NCgpOworCisgIGRvdWJsZSByZWFkRG91YmxlKCk7CisKKyAgU3RyaW5nIHJlYWRTdHJpbmcoKTsKKworICBVaW50OExpc3QgcmVhZEJpbmFyeSgpOworfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X3Byb3RvY29sX2RlY29yYXRvci5kYXJ0IGIvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X3Byb3RvY29sX2RlY29yYXRvci5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljZDAyZjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfcHJvdG9jb2xfZGVjb3JhdG9yLmRhcnQKQEAgLTAsMCArMSwxNTAgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYXJ0IG9mIHRocmlmdDsKKworLy8vIEZvcndhcmQgYWxsIG9wZXJhdGlvbnMgdG8gdGhlIHdyYXBwZWQgcHJvdG9jb2wuICBVc2VkIGFzIGEgYmFzZSBjbGFzcy4KKy8vLworLy8vIEFkYXB0ZWQgZnJvbSB0aGUgQyMgdmVyc2lvbi4KK2NsYXNzIFRQcm90b2NvbERlY29yYXRvciBleHRlbmRzIFRQcm90b2NvbCB7CisgIGZpbmFsIFRQcm90b2NvbCBfcHJvdG9jb2w7CisKKyAgVFByb3RvY29sRGVjb3JhdG9yKFRQcm90b2NvbCBwcm90b2NvbCkKKyAgICAgIDogX3Byb3RvY29sID0gcHJvdG9jb2wsCisgICAgICAgIHN1cGVyKHByb3RvY29sLnRyYW5zcG9ydCk7CisKKyAgLy8vIFdyaXRlCisKKyAgdm9pZCB3cml0ZU1lc3NhZ2VCZWdpbihUTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgX3Byb3RvY29sLndyaXRlTWVzc2FnZUJlZ2luKG1lc3NhZ2UpOworICB9CisKKyAgdm9pZCB3cml0ZU1lc3NhZ2VFbmQoKSB7CisgICAgX3Byb3RvY29sLndyaXRlTWVzc2FnZUVuZCgpOworICB9CisKKyAgdm9pZCB3cml0ZVN0cnVjdEJlZ2luKFRTdHJ1Y3Qgc3RydWN0KSB7CisgICAgX3Byb3RvY29sLndyaXRlU3RydWN0QmVnaW4oc3RydWN0KTsKKyAgfQorCisgIHZvaWQgd3JpdGVTdHJ1Y3RFbmQoKSB7CisgICAgX3Byb3RvY29sLndyaXRlU3RydWN0RW5kKCk7CisgIH0KKworICB2b2lkIHdyaXRlRmllbGRCZWdpbihURmllbGQgZmllbGQpIHsKKyAgICBfcHJvdG9jb2wud3JpdGVGaWVsZEJlZ2luKGZpZWxkKTsKKyAgfQorCisgIHZvaWQgd3JpdGVGaWVsZEVuZCgpIHsKKyAgICBfcHJvdG9jb2wud3JpdGVGaWVsZEVuZCgpOworICB9CisKKyAgdm9pZCB3cml0ZUZpZWxkU3RvcCgpIHsKKyAgICBfcHJvdG9jb2wud3JpdGVGaWVsZFN0b3AoKTsKKyAgfQorCisgIHZvaWQgd3JpdGVNYXBCZWdpbihUTWFwIG1hcCkgeworICAgIF9wcm90b2NvbC53cml0ZU1hcEJlZ2luKG1hcCk7CisgIH0KKworICB2b2lkIHdyaXRlTWFwRW5kKCkgeworICAgIF9wcm90b2NvbC53cml0ZU1hcEVuZCgpOworICB9CisKKyAgdm9pZCB3cml0ZUxpc3RCZWdpbihUTGlzdCBsaXN0KSB7CisgICAgX3Byb3RvY29sLndyaXRlTGlzdEJlZ2luKGxpc3QpOworICB9CisKKyAgdm9pZCB3cml0ZUxpc3RFbmQoKSB7CisgICAgX3Byb3RvY29sLndyaXRlTGlzdEVuZCgpOworICB9CisKKyAgdm9pZCB3cml0ZVNldEJlZ2luKFRTZXQgc2V0KSB7CisgICAgX3Byb3RvY29sLndyaXRlU2V0QmVnaW4oc2V0KTsKKyAgfQorCisgIHZvaWQgd3JpdGVTZXRFbmQoKSB7CisgICAgX3Byb3RvY29sLndyaXRlU2V0RW5kKCk7CisgIH0KKworICB2b2lkIHdyaXRlQm9vbChib29sIGIpIHsKKyAgICBfcHJvdG9jb2wud3JpdGVCb29sKGIpOworICB9CisKKyAgdm9pZCB3cml0ZUJ5dGUoaW50IGIpIHsKKyAgICBfcHJvdG9jb2wud3JpdGVCeXRlKGIpOworICB9CisKKyAgdm9pZCB3cml0ZUkxNihpbnQgaTE2KSB7CisgICAgX3Byb3RvY29sLndyaXRlSTE2KGkxNik7CisgIH0KKworICB2b2lkIHdyaXRlSTMyKGludCBpMzIpIHsKKyAgICBfcHJvdG9jb2wud3JpdGVJMzIoaTMyKTsKKyAgfQorCisgIHZvaWQgd3JpdGVJNjQoaW50IGk2NCkgeworICAgIF9wcm90b2NvbC53cml0ZUk2NChpNjQpOworICB9CisKKyAgdm9pZCB3cml0ZURvdWJsZShkb3VibGUgZCkgeworICAgIF9wcm90b2NvbC53cml0ZURvdWJsZShkKTsKKyAgfQorCisgIHZvaWQgd3JpdGVTdHJpbmcoU3RyaW5nIHN0cikgeworICAgIF9wcm90b2NvbC53cml0ZVN0cmluZyhzdHIpOworICB9CisKKyAgdm9pZCB3cml0ZUJpbmFyeShVaW50OExpc3QgYnl0ZXMpIHsKKyAgICBfcHJvdG9jb2wud3JpdGVCaW5hcnkoYnl0ZXMpOworICB9CisKKyAgLy8vIFJlYWQKKyAgVE1lc3NhZ2UgcmVhZE1lc3NhZ2VCZWdpbigpID0+IF9wcm90b2NvbC5yZWFkTWVzc2FnZUJlZ2luKCk7CisgIHZvaWQgcmVhZE1lc3NhZ2VFbmQoKSA9PiBfcHJvdG9jb2wucmVhZE1lc3NhZ2VFbmQoKTsKKworICBUU3RydWN0IHJlYWRTdHJ1Y3RCZWdpbigpID0+IF9wcm90b2NvbC5yZWFkU3RydWN0QmVnaW4oKTsKKyAgdm9pZCByZWFkU3RydWN0RW5kKCkgPT4gX3Byb3RvY29sLnJlYWRTdHJ1Y3RFbmQoKTsKKworICBURmllbGQgcmVhZEZpZWxkQmVnaW4oKSA9PiBfcHJvdG9jb2wucmVhZEZpZWxkQmVnaW4oKTsKKyAgdm9pZCByZWFkRmllbGRFbmQoKSA9PiBfcHJvdG9jb2wucmVhZEZpZWxkRW5kKCk7CisKKyAgVE1hcCByZWFkTWFwQmVnaW4oKSA9PiBfcHJvdG9jb2wucmVhZE1hcEJlZ2luKCk7CisgIHZvaWQgcmVhZE1hcEVuZCgpID0+IF9wcm90b2NvbC5yZWFkTWFwRW5kKCk7CisKKyAgVExpc3QgcmVhZExpc3RCZWdpbigpID0+IF9wcm90b2NvbC5yZWFkTGlzdEJlZ2luKCk7CisgIHZvaWQgcmVhZExpc3RFbmQoKSA9PiBfcHJvdG9jb2wucmVhZExpc3RFbmQoKTsKKworICBUU2V0IHJlYWRTZXRCZWdpbigpID0+IF9wcm90b2NvbC5yZWFkU2V0QmVnaW4oKTsKKyAgdm9pZCByZWFkU2V0RW5kKCkgPT4gX3Byb3RvY29sLnJlYWRTZXRFbmQoKTsKKworICBib29sIHJlYWRCb29sKCkgPT4gX3Byb3RvY29sLnJlYWRCb29sKCk7CisKKyAgaW50IHJlYWRCeXRlKCkgPT4gX3Byb3RvY29sLnJlYWRCeXRlKCk7CisKKyAgaW50IHJlYWRJMTYoKSA9PiBfcHJvdG9jb2wucmVhZEkxNigpOworCisgIGludCByZWFkSTMyKCkgPT4gX3Byb3RvY29sLnJlYWRJMzIoKTsKKworICBpbnQgcmVhZEk2NCgpID0+IF9wcm90b2NvbC5yZWFkSTY0KCk7CisKKyAgZG91YmxlIHJlYWREb3VibGUoKSA9PiBfcHJvdG9jb2wucmVhZERvdWJsZSgpOworCisgIFN0cmluZyByZWFkU3RyaW5nKCkgPT4gX3Byb3RvY29sLnJlYWRTdHJpbmcoKTsKKworICBVaW50OExpc3QgcmVhZEJpbmFyeSgpID0+IF9wcm90b2NvbC5yZWFkQmluYXJ5KCk7Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfcHJvdG9jb2xfZXJyb3IuZGFydCBiL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9wcm90b2NvbF9lcnJvci5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1NmJhZWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfcHJvdG9jb2xfZXJyb3IuZGFydApAQCAtMCwwICsxLDMzIEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFydCBvZiB0aHJpZnQ7CisKK2NsYXNzIFRQcm90b2NvbEVycm9yVHlwZSB7CisgIHN0YXRpYyBjb25zdCBpbnQgVU5LTk9XTiA9IDA7CisgIHN0YXRpYyBjb25zdCBpbnQgSU5WQUxJRF9EQVRBID0gMTsKKyAgc3RhdGljIGNvbnN0IGludCBORUdBVElWRV9TSVpFID0gMjsKKyAgc3RhdGljIGNvbnN0IGludCBTSVpFX0xJTUlUID0gMzsKKyAgc3RhdGljIGNvbnN0IGludCBCQURfVkVSU0lPTiA9IDQ7CisgIHN0YXRpYyBjb25zdCBpbnQgTk9UX0lNUExFTUVOVEVEID0gNTsKKyAgc3RhdGljIGNvbnN0IGludCBERVBUSF9MSU1JVCA9IDY7Cit9CisKK2NsYXNzIFRQcm90b2NvbEVycm9yIGV4dGVuZHMgVEVycm9yIHsKKyAgVFByb3RvY29sRXJyb3IoW2ludCB0eXBlID0gVFByb3RvY29sRXJyb3JUeXBlLlVOS05PV04sIFN0cmluZyBtZXNzYWdlID0gIiJdKQorICAgICAgOiBzdXBlcih0eXBlLCBtZXNzYWdlKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9wcm90b2NvbF9mYWN0b3J5LmRhcnQgYi9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfcHJvdG9jb2xfZmFjdG9yeS5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyMmM2Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfcHJvdG9jb2xfZmFjdG9yeS5kYXJ0CkBAIC0wLDAgKzEsMjIgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYXJ0IG9mIHRocmlmdDsKKworYWJzdHJhY3QgY2xhc3MgVFByb3RvY29sRmFjdG9yeTxUIGV4dGVuZHMgVFByb3RvY29sPiB7CisgIFQgZ2V0UHJvdG9jb2woVFRyYW5zcG9ydCB0cmFuc3BvcnQpOworfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X3Byb3RvY29sX3V0aWwuZGFydCBiL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9wcm90b2NvbF91dGlsLmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQyMDA2OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9wcm90b2NvbF91dGlsLmRhcnQKQEAgLTAsMCArMSwxMDcgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYXJ0IG9mIHRocmlmdDsKKworY2xhc3MgVFByb3RvY29sVXRpbCB7CisgIC8vIGVxdWFsIHRvIEphdmFTY3JpcHQgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIsIDJeNTMgLSAxCisgIHN0YXRpYyBjb25zdCBpbnQgZGVmYXVsdFJlY3Vyc2lvbkxpbWl0ID0gOTAwNzE5OTI1NDc0MDk5MTsKKworICBzdGF0aWMgaW50IG1heFJlY3Vyc2lvbkxpbWl0ID0gZGVmYXVsdFJlY3Vyc2lvbkxpbWl0OworCisgIHN0YXRpYyBza2lwKFRQcm90b2NvbCBwcm90LCBpbnQgdHlwZSkgeworICAgIF9za2lwKHByb3QsIHR5cGUsIG1heFJlY3Vyc2lvbkxpbWl0KTsKKyAgfQorCisgIHN0YXRpYyBfc2tpcChUUHJvdG9jb2wgcHJvdCwgaW50IHR5cGUsIGludCByZWN1cnNpb25MaW1pdCkgeworICAgIGlmIChyZWN1cnNpb25MaW1pdCA8PSAwKSB7CisgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXJyb3IoCisgICAgICAgICAgVFByb3RvY29sRXJyb3JUeXBlLkRFUFRIX0xJTUlULCAiRGVwdGggbGltaXQgZXhjZWVkZWQiKTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgIGNhc2UgVFR5cGUuQk9PTDoKKyAgICAgICAgcHJvdC5yZWFkQm9vbCgpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBUVHlwZS5CWVRFOgorICAgICAgICBwcm90LnJlYWRCeXRlKCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFRUeXBlLkkxNjoKKyAgICAgICAgcHJvdC5yZWFkSTE2KCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFRUeXBlLkkzMjoKKyAgICAgICAgcHJvdC5yZWFkSTMyKCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFRUeXBlLkk2NDoKKyAgICAgICAgcHJvdC5yZWFkSTY0KCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFRUeXBlLkRPVUJMRToKKyAgICAgICAgcHJvdC5yZWFkRG91YmxlKCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFRUeXBlLlNUUklORzoKKyAgICAgICAgcHJvdC5yZWFkQmluYXJ5KCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFRUeXBlLlNUUlVDVDoKKyAgICAgICAgcHJvdC5yZWFkU3RydWN0QmVnaW4oKTsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICBURmllbGQgZmllbGQgPSBwcm90LnJlYWRGaWVsZEJlZ2luKCk7CisgICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuU1RPUCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIF9za2lwKHByb3QsIGZpZWxkLnR5cGUsIHJlY3Vyc2lvbkxpbWl0IC0gMSk7CisgICAgICAgICAgcHJvdC5yZWFkRmllbGRFbmQoKTsKKyAgICAgICAgfQorICAgICAgICBwcm90LnJlYWRTdHJ1Y3RFbmQoKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgVFR5cGUuTUFQOgorICAgICAgICBUTWFwIG1hcCA9IHByb3QucmVhZE1hcEJlZ2luKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFwLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgX3NraXAocHJvdCwgbWFwLmtleVR5cGUsIHJlY3Vyc2lvbkxpbWl0IC0gMSk7CisgICAgICAgICAgX3NraXAocHJvdCwgbWFwLnZhbHVlVHlwZSwgcmVjdXJzaW9uTGltaXQgLSAxKTsKKyAgICAgICAgfQorICAgICAgICBwcm90LnJlYWRNYXBFbmQoKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgVFR5cGUuU0VUOgorICAgICAgICBUU2V0IHNldCA9IHByb3QucmVhZFNldEJlZ2luKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2V0Lmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgX3NraXAocHJvdCwgc2V0LmVsZW1lbnRUeXBlLCByZWN1cnNpb25MaW1pdCAtIDEpOworICAgICAgICB9CisgICAgICAgIHByb3QucmVhZFNldEVuZCgpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBUVHlwZS5MSVNUOgorICAgICAgICBUTGlzdCBsaXN0ID0gcHJvdC5yZWFkTGlzdEJlZ2luKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgeworICAgICAgICAgIF9za2lwKHByb3QsIGxpc3QuZWxlbWVudFR5cGUsIHJlY3Vyc2lvbkxpbWl0IC0gMSk7CisgICAgICAgIH0KKyAgICAgICAgcHJvdC5yZWFkTGlzdEVuZCgpOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3Rfc2V0LmRhcnQgYi9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3Rfc2V0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM0MjUzNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9zZXQuZGFydApAQCAtMCwwICsxLDI1IEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFydCBvZiB0aHJpZnQ7CisKK2NsYXNzIFRTZXQgeworICBmaW5hbCBpbnQgZWxlbWVudFR5cGU7CisgIGZpbmFsIGludCBsZW5ndGg7CisKKyAgVFNldCh0aGlzLmVsZW1lbnRUeXBlLCB0aGlzLmxlbmd0aCk7Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3Rfc3RydWN0LmRhcnQgYi9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3Rfc3RydWN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDMwM2Y2MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9zdHJ1Y3QuZGFydApAQCAtMCwwICsxLDI0IEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFydCBvZiB0aHJpZnQ7CisKK2NsYXNzIFRTdHJ1Y3QgeworICBmaW5hbCBTdHJpbmcgbmFtZTsKKworICBUU3RydWN0KFt0aGlzLm5hbWUgPSAiIl0pOworfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X3R5cGUuZGFydCBiL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF90eXBlLmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzkxOWQ5NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF90eXBlLmRhcnQKQEAgLTAsMCArMSwzNCBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhcnQgb2YgdGhyaWZ0OworCitjbGFzcyBUVHlwZSB7CisgIHN0YXRpYyBjb25zdCBpbnQgU1RPUCA9IDA7CisgIHN0YXRpYyBjb25zdCBpbnQgVk9JRCA9IDE7CisgIHN0YXRpYyBjb25zdCBpbnQgQk9PTCA9IDI7CisgIHN0YXRpYyBjb25zdCBpbnQgQllURSA9IDM7CisgIHN0YXRpYyBjb25zdCBpbnQgRE9VQkxFID0gNDsKKyAgc3RhdGljIGNvbnN0IGludCBJMTYgPSA2OworICBzdGF0aWMgY29uc3QgaW50IEkzMiA9IDg7CisgIHN0YXRpYyBjb25zdCBpbnQgSTY0ID0gMTA7CisgIHN0YXRpYyBjb25zdCBpbnQgU1RSSU5HID0gMTE7CisgIHN0YXRpYyBjb25zdCBpbnQgU1RSVUNUID0gMTI7CisgIHN0YXRpYyBjb25zdCBpbnQgTUFQID0gMTM7CisgIHN0YXRpYyBjb25zdCBpbnQgU0VUID0gMTQ7CisgIHN0YXRpYyBjb25zdCBpbnQgTElTVCA9IDE1OworfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3NyYy9zZXJpYWxpemVyL3RfZGVzZXJpYWxpemVyLmRhcnQgYi9saWIvZGFydC9saWIvc3JjL3NlcmlhbGl6ZXIvdF9kZXNlcmlhbGl6ZXIuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDFkMTM5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3NyYy9zZXJpYWxpemVyL3RfZGVzZXJpYWxpemVyLmRhcnQKQEAgLTAsMCArMSw1MCBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhcnQgb2YgdGhyaWZ0OworCitjbGFzcyBURGVzZXJpYWxpemVyIHsKKyAgZmluYWwgbWVzc2FnZSA9IG5ldyBUTWVzc2FnZSgnRGVzZXJpYWxpemVyJywgVE1lc3NhZ2VUeXBlLk9ORVdBWSwgMSk7CisgIFRCdWZmZXJlZFRyYW5zcG9ydCB0cmFuc3BvcnQ7CisgIFRQcm90b2NvbCBwcm90b2NvbDsKKworICBURGVzZXJpYWxpemVyKHtUUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeX0pIHsKKyAgICB0aGlzLnRyYW5zcG9ydCA9IG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQoKTsKKyAgICAKKyAgICBpZiAocHJvdG9jb2xGYWN0b3J5ID09IG51bGwpIHsKKyAgICAgICAgcHJvdG9jb2xGYWN0b3J5ID0gbmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKTsKKyAgICB9CisgICAgCisgICAgdGhpcy5wcm90b2NvbCA9IHByb3RvY29sRmFjdG9yeS5nZXRQcm90b2NvbCh0aGlzLnRyYW5zcG9ydCk7CisgIH0KKworICB2b2lkIHJlYWQoVEJhc2UgYmFzZSwgVWludDhMaXN0IGRhdGEpIHsKKyAgICB0cmFuc3BvcnQud3JpdGVBbGwoZGF0YSk7CisgICAgCisgICAgdHJhbnNwb3J0LmZsdXNoKCk7CisgICAgCisgICAgYmFzZS5yZWFkKHByb3RvY29sKTsKKyAgfQorCisgIHZvaWQgcmVhZFN0cmluZyhUQmFzZSBiYXNlLCBTdHJpbmcgZGF0YSkgeworICAgIHRyYW5zcG9ydC53cml0ZUFsbChCQVNFNjQuZGVjb2RlKGRhdGEpKTsKKyAgICAKKyAgICB0cmFuc3BvcnQuZmx1c2goKTsKKworICAgIGJhc2UucmVhZChwcm90b2NvbCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi9zcmMvc2VyaWFsaXplci90X3NlcmlhbGl6ZXIuZGFydCBiL2xpYi9kYXJ0L2xpYi9zcmMvc2VyaWFsaXplci90X3NlcmlhbGl6ZXIuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGRkYjZkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3NyYy9zZXJpYWxpemVyL3Rfc2VyaWFsaXplci5kYXJ0CkBAIC0wLDAgKzEsNDggQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYXJ0IG9mIHRocmlmdDsKKworY2xhc3MgVFNlcmlhbGl6ZXIgeworICBmaW5hbCBtZXNzYWdlID0gbmV3IFRNZXNzYWdlKCdTZXJpYWxpemVyJywgVE1lc3NhZ2VUeXBlLk9ORVdBWSwgMSk7CisgIFRCdWZmZXJlZFRyYW5zcG9ydCB0cmFuc3BvcnQ7CisgIFRQcm90b2NvbCBwcm90b2NvbDsKKworICBUU2VyaWFsaXplcih7VFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3Rvcnl9KSB7CisgICAgdGhpcy50cmFuc3BvcnQgPSBuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KCk7CisgICAgCisgICAgaWYgKHByb3RvY29sRmFjdG9yeSA9PSBudWxsKSB7CisgICAgICBwcm90b2NvbEZhY3RvcnkgPSBuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpOworICAgIH0KKworICAgIHRoaXMucHJvdG9jb2wgPSBwcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2wodGhpcy50cmFuc3BvcnQpOworICB9CisKKyAgVWludDhMaXN0IHdyaXRlKFRCYXNlIGJhc2UpIHsKKyAgICBiYXNlLndyaXRlKHByb3RvY29sKTsKKyAgICAKKyAgICByZXR1cm4gdHJhbnNwb3J0LmNvbnN1bWVXcml0ZUJ1ZmZlcigpOworICB9CisKKyAgU3RyaW5nIHdyaXRlU3RyaW5nKFRCYXNlIGJhc2UpIHsKKyAgICBiYXNlLndyaXRlKHByb3RvY29sKTsKKyAgICAKKyAgICBVaW50OExpc3QgYnl0ZXMgPSB0cmFuc3BvcnQuY29uc3VtZVdyaXRlQnVmZmVyKCk7CisgICAgCisgICAgcmV0dXJuIEJBU0U2NC5lbmNvZGUoYnl0ZXMpOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC9saWIvc3JjL3RfYXBwbGljYXRpb25fZXJyb3IuZGFydCBiL2xpYi9kYXJ0L2xpYi9zcmMvdF9hcHBsaWNhdGlvbl9lcnJvci5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmOGFiZDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvc3JjL3RfYXBwbGljYXRpb25fZXJyb3IuZGFydApAQCAtMCwwICsxLDEwNCBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhcnQgb2YgdGhyaWZ0OworCitjbGFzcyBUQXBwbGljYXRpb25FcnJvclR5cGUgeworICBzdGF0aWMgY29uc3QgaW50IFVOS05PV04gPSAwOworICBzdGF0aWMgY29uc3QgaW50IFVOS05PV05fTUVUSE9EID0gMTsKKyAgc3RhdGljIGNvbnN0IGludCBJTlZBTElEX01FU1NBR0VfVFlQRSA9IDI7CisgIHN0YXRpYyBjb25zdCBpbnQgV1JPTkdfTUVUSE9EX05BTUUgPSAzOworICBzdGF0aWMgY29uc3QgaW50IEJBRF9TRVFVRU5DRV9JRCA9IDQ7CisgIHN0YXRpYyBjb25zdCBpbnQgTUlTU0lOR19SRVNVTFQgPSA1OworICBzdGF0aWMgY29uc3QgaW50IElOVEVSTkFMX0VSUk9SID0gNjsKKyAgc3RhdGljIGNvbnN0IGludCBQUk9UT0NPTF9FUlJPUiA9IDc7CisgIHN0YXRpYyBjb25zdCBpbnQgSU5WQUxJRF9UUkFOU0ZPUk0gPSA4OworICBzdGF0aWMgY29uc3QgaW50IElOVkFMSURfUFJPVE9DT0wgPSA5OworICBzdGF0aWMgY29uc3QgaW50IFVOU1VQUE9SVEVEX0NMSUVOVF9UWVBFID0gMTA7Cit9CisKK2NsYXNzIFRBcHBsaWNhdGlvbkVycm9yIGV4dGVuZHMgVEVycm9yIHsKKyAgc3RhdGljIGZpbmFsIFRTdHJ1Y3QgX3N0cnVjdCA9IG5ldyBUU3RydWN0KCJUQXBwbGljYXRpb25FcnJvciIpOworICBzdGF0aWMgY29uc3QgaW50IE1FU1NBR0UgPSAxOworICBzdGF0aWMgZmluYWwgVEZpZWxkIF9tZXNzYWdlRmllbGQgPQorICAgICAgbmV3IFRGaWVsZCgibWVzc2FnZSIsIFRUeXBlLlNUUklORywgTUVTU0FHRSk7CisgIHN0YXRpYyBjb25zdCBpbnQgVFlQRSA9IDI7CisgIHN0YXRpYyBmaW5hbCBURmllbGQgX3R5cGVGaWVsZCA9IG5ldyBURmllbGQoInR5cGUiLCBUVHlwZS5JMzIsIFRZUEUpOworCisgIFRBcHBsaWNhdGlvbkVycm9yKAorICAgICAgW2ludCB0eXBlID0gVEFwcGxpY2F0aW9uRXJyb3JUeXBlLlVOS05PV04sIFN0cmluZyBtZXNzYWdlID0gIiJdKQorICAgICAgOiBzdXBlcih0eXBlLCBtZXNzYWdlKTsKKworICBzdGF0aWMgVEFwcGxpY2F0aW9uRXJyb3IgcmVhZChUUHJvdG9jb2wgaXByb3QpIHsKKyAgICBURmllbGQgZmllbGQ7CisKKyAgICBTdHJpbmcgbWVzc2FnZSA9IG51bGw7CisgICAgaW50IHR5cGUgPSBUQXBwbGljYXRpb25FcnJvclR5cGUuVU5LTk9XTjsKKworICAgIGlwcm90LnJlYWRTdHJ1Y3RCZWdpbigpOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBmaWVsZCA9IGlwcm90LnJlYWRGaWVsZEJlZ2luKCk7CisKKyAgICAgIGlmIChmaWVsZC50eXBlID09IFRUeXBlLlNUT1ApIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIHN3aXRjaCAoZmllbGQuaWQpIHsKKyAgICAgICAgY2FzZSBNRVNTQUdFOgorICAgICAgICAgIGlmIChmaWVsZC50eXBlID09IFRUeXBlLlNUUklORykgeworICAgICAgICAgICAgbWVzc2FnZSA9IGlwcm90LnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBUWVBFOgorICAgICAgICAgIGlmIChmaWVsZC50eXBlID09IFRUeXBlLkkzMikgeworICAgICAgICAgICAgdHlwZSA9IGlwcm90LnJlYWRJMzIoKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaXByb3QucmVhZEZpZWxkRW5kKCk7CisgICAgfQorICAgIGlwcm90LnJlYWRTdHJ1Y3RFbmQoKTsKKworICAgIHJldHVybiBuZXcgVEFwcGxpY2F0aW9uRXJyb3IodHlwZSwgbWVzc2FnZSk7CisgIH0KKworICB3cml0ZShUUHJvdG9jb2wgb3Byb3QpIHsKKyAgICBvcHJvdC53cml0ZVN0cnVjdEJlZ2luKF9zdHJ1Y3QpOworCisgICAgaWYgKG1lc3NhZ2UgIT0gbnVsbCAmJiAhbWVzc2FnZS5pc0VtcHR5KSB7CisgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oX21lc3NhZ2VGaWVsZCk7CisgICAgICBvcHJvdC53cml0ZVN0cmluZyhtZXNzYWdlKTsKKyAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKTsKKyAgICB9CisKKyAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oX3R5cGVGaWVsZCk7CisgICAgb3Byb3Qud3JpdGVJMzIodHlwZSk7CisgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpOworCisgICAgb3Byb3Qud3JpdGVGaWVsZFN0b3AoKTsKKyAgICBvcHJvdC53cml0ZVN0cnVjdEVuZCgpOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC9saWIvc3JjL3RfYmFzZS5kYXJ0IGIvbGliL2RhcnQvbGliL3NyYy90X2Jhc2UuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTU3MWI2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3NyYy90X2Jhc2UuZGFydApAQCAtMCwwICsxLDM3IEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFydCBvZiB0aHJpZnQ7CisKK2Fic3RyYWN0IGNsYXNzIFRCYXNlIHsKKyAgLy8vIFJlYWRzIHRoZSBUT2JqZWN0IGZyb20gdGhlIGdpdmVuIGlucHV0IHByb3RvY29sLgorICB2b2lkIHJlYWQoVFByb3RvY29sIGlwcm90KTsKKworICAvLy8gV3JpdGVzIHRoZSBvYmplY3RzIG91dCB0byB0aGUgW29wcm90XSBwcm90b2NvbC4KKyAgdm9pZCB3cml0ZShUUHJvdG9jb2wgb3Byb3QpOworCisgIC8vLyBDaGVjayBpZiBhIGZpZWxkIGlzIGN1cnJlbnRseSBzZXQgb3IgdW5zZXQsIHVzaW5nIHRoZSBbZmllbGRJZF0uCisgIGJvb2wgaXNTZXQoaW50IGZpZWxkSWQpOworCisgIC8vLyBHZXQgYSBmaWVsZCdzIHZhbHVlIGJ5IFtmaWVsZElkXS4gUHJpbWl0aXZlIHR5cGVzIHdpbGwgYmUgd3JhcHBlZCBpbiB0aGUKKyAgLy8vIGFwcHJvcHJpYXRlICJib3hlZCIgdHlwZXMuCisgIGdldEZpZWxkVmFsdWUoaW50IGZpZWxkSWQpOworCisgIC8vLyBTZXQgYSBmaWVsZCdzIHZhbHVlIGJ5IFtmaWVsZElkXS4gUHJpbWl0aXZlIHR5cGVzIG11c3QgYmUgImJveGVkIiBpbiB0aGUKKyAgLy8vIGFwcHJvcHJpYXRlIG9iamVjdCB3cmFwcGVyIHR5cGUuCisgIHNldEZpZWxkVmFsdWUoaW50IGZpZWxkSWQsIE9iamVjdCB2YWx1ZSk7Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC9saWIvc3JjL3RfZXJyb3IuZGFydCBiL2xpYi9kYXJ0L2xpYi9zcmMvdF9lcnJvci5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzYWI3MzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvc3JjL3RfZXJyb3IuZGFydApAQCAtMCwwICsxLDI3IEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFydCBvZiB0aHJpZnQ7CisKK2NsYXNzIFRFcnJvciBleHRlbmRzIEVycm9yIHsKKyAgZmluYWwgU3RyaW5nIG1lc3NhZ2U7CisgIGZpbmFsIGludCB0eXBlOworCisgIFRFcnJvcih0aGlzLnR5cGUsIHRoaXMubWVzc2FnZSk7CisKKyAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gIjxURXJyb3IgdHlwZTogJHR5cGUgbWVzc2FnZTogJyRtZXNzYWdlJz4iOworfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3NyYy90X3Byb2Nlc3Nvci5kYXJ0IGIvbGliL2RhcnQvbGliL3NyYy90X3Byb2Nlc3Nvci5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjZjIwZmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvc3JjL3RfcHJvY2Vzc29yLmRhcnQKQEAgLTAsMCArMSwyNCBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhcnQgb2YgdGhyaWZ0OworCisvLy8gQSBwcm9jZXNzb3IgaXMgYSBnZW5lcmljIG9iamVjdCB3aGljaCBvcGVyYXRlcyB1cG9uIGFuIGlucHV0IHN0cmVhbSBhbmQKKy8vLyB3cml0ZXMgdG8gc29tZSBvdXRwdXQgc3RyZWFtLgorYWJzdHJhY3QgY2xhc3MgVFByb2Nlc3NvciB7CisgIGJvb2wgcHJvY2VzcyhUUHJvdG9jb2wgaW5wdXQsIFRQcm90b2NvbCBvdXRwdXQpOworfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3NyYy90cmFuc3BvcnQvdF9idWZmZXJlZF90cmFuc3BvcnQuZGFydCBiL2xpYi9kYXJ0L2xpYi9zcmMvdHJhbnNwb3J0L3RfYnVmZmVyZWRfdHJhbnNwb3J0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjczYTMwYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi9zcmMvdHJhbnNwb3J0L3RfYnVmZmVyZWRfdHJhbnNwb3J0LmRhcnQKQEAgLTAsMCArMSw5OCBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhcnQgb2YgdGhyaWZ0OworCisvLy8gQnVmZmVyZWQgaW1wbGVtZW50YXRpb24gb2YgW1RUcmFuc3BvcnRdLgorY2xhc3MgVEJ1ZmZlcmVkVHJhbnNwb3J0IGV4dGVuZHMgVFRyYW5zcG9ydCB7CisgIGZpbmFsIExpc3Q8aW50PiBfd3JpdGVCdWZmZXIgPSBbXTsKKyAgSXRlcmF0b3I8aW50PiBfcmVhZEl0ZXJhdG9yOworCisgIFVpbnQ4TGlzdCBjb25zdW1lV3JpdGVCdWZmZXIoKSB7CisgICAgVWludDhMaXN0IGJ1ZmZlciA9IG5ldyBVaW50OExpc3QuZnJvbUxpc3QoX3dyaXRlQnVmZmVyKTsKKyAgICBfd3JpdGVCdWZmZXIuY2xlYXIoKTsKKyAgICByZXR1cm4gYnVmZmVyOworICB9CisKKyAgdm9pZCBfc2V0UmVhZEJ1ZmZlcihVaW50OExpc3QgcmVhZEJ1ZmZlcikgeworICAgIF9yZWFkSXRlcmF0b3IgPSByZWFkQnVmZmVyICE9IG51bGwgPyByZWFkQnVmZmVyLml0ZXJhdG9yIDogbnVsbDsKKyAgfQorCisgIHZvaWQgX3Jlc2V0KHtib29sIGlzT3BlbjogZmFsc2V9KSB7CisgICAgX2lzT3BlbiA9IGlzT3BlbjsKKyAgICBfd3JpdGVCdWZmZXIuY2xlYXIoKTsKKyAgICBfcmVhZEl0ZXJhdG9yID0gbnVsbDsKKyAgfQorCisgIGJvb2wgZ2V0IGhhc1JlYWREYXRhID0+IF9yZWFkSXRlcmF0b3IgIT0gbnVsbDsKKworICBib29sIF9pc09wZW47CisgIGJvb2wgZ2V0IGlzT3BlbiA9PiBfaXNPcGVuOworCisgIEZ1dHVyZSBvcGVuKCkgYXN5bmMgeworICAgIF9yZXNldChpc09wZW46IHRydWUpOworICB9CisKKyAgRnV0dXJlIGNsb3NlKCkgYXN5bmMgeworICAgIF9yZXNldChpc09wZW46IGZhbHNlKTsKKyAgfQorCisgIGludCByZWFkKFVpbnQ4TGlzdCBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKKyAgICBpZiAoYnVmZmVyID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yLm5vdE51bGwoImJ1ZmZlciIpOworICAgIH0KKworICAgIGlmIChvZmZzZXQgKyBsZW5ndGggPiBidWZmZXIubGVuZ3RoKSB7CisgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigiVGhlIHJhbmdlIGV4Y2VlZHMgdGhlIGJ1ZmZlciBsZW5ndGgiKTsKKyAgICB9CisKKyAgICBpZiAoX3JlYWRJdGVyYXRvciA9PSBudWxsIHx8IGxlbmd0aCA8PSAwKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpbnQgaSA9IDA7CisgICAgd2hpbGUgKGkgPCBsZW5ndGggJiYgX3JlYWRJdGVyYXRvci5tb3ZlTmV4dCgpKSB7CisgICAgICBidWZmZXJbb2Zmc2V0ICsgaV0gPSBfcmVhZEl0ZXJhdG9yLmN1cnJlbnQ7CisgICAgICBpKys7CisgICAgfQorCisgICAgLy8gY2xlYW51cCBpdGVyYXRvciB3aGVuIHdlJ3ZlIHJlYWNoZWQgdGhlIGVuZAorICAgIGlmIChfcmVhZEl0ZXJhdG9yLmN1cnJlbnQgPT0gbnVsbCkgeworICAgICAgX3JlYWRJdGVyYXRvciA9IG51bGw7CisgICAgfQorCisgICAgcmV0dXJuIGk7CisgIH0KKworICB2b2lkIHdyaXRlKFVpbnQ4TGlzdCBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKKyAgICBpZiAoYnVmZmVyID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yLm5vdE51bGwoImJ1ZmZlciIpOworICAgIH0KKworICAgIGlmIChvZmZzZXQgKyBsZW5ndGggPiBidWZmZXIubGVuZ3RoKSB7CisgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigiVGhlIHJhbmdlIGV4Y2VlZHMgdGhlIGJ1ZmZlciBsZW5ndGgiKTsKKyAgICB9CisKKyAgICBfd3JpdGVCdWZmZXIuYWRkQWxsKGJ1ZmZlci5zdWJsaXN0KG9mZnNldCwgb2Zmc2V0ICsgbGVuZ3RoKSk7CisgIH0KKworICBGdXR1cmUgZmx1c2goKSB7CisgICAgX3JlYWRJdGVyYXRvciA9IGNvbnN1bWVXcml0ZUJ1ZmZlcigpLml0ZXJhdG9yOworCisgICAgcmV0dXJuIG5ldyBGdXR1cmUudmFsdWUoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3NyYy90cmFuc3BvcnQvdF9mcmFtZWRfdHJhbnNwb3J0LmRhcnQgYi9saWIvZGFydC9saWIvc3JjL3RyYW5zcG9ydC90X2ZyYW1lZF90cmFuc3BvcnQuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWYwM2Y3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3NyYy90cmFuc3BvcnQvdF9mcmFtZWRfdHJhbnNwb3J0LmRhcnQKQEAgLTAsMCArMSwxNjkgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYXJ0IG9mIHRocmlmdDsKKworLy8vIEZyYW1lZCBbVFRyYW5zcG9ydF0uCisvLy8KKy8vLyBBZGFwdGVkIGZyb20gdGhlIEphdmEgRnJhbWVkIHRyYW5zcG9ydC4KK2NsYXNzIFRGcmFtZWRUcmFuc3BvcnQgZXh0ZW5kcyBUQnVmZmVyZWRUcmFuc3BvcnQgeworICBzdGF0aWMgY29uc3QgaW50IGhlYWRlckJ5dGVDb3VudCA9IDQ7CisKKyAgZmluYWwgVFRyYW5zcG9ydCBfdHJhbnNwb3J0OworCisgIGZpbmFsIFVpbnQ4TGlzdCBfaGVhZGVyQnl0ZXMgPSBuZXcgVWludDhMaXN0KGhlYWRlckJ5dGVDb3VudCk7CisgIGludCBfcmVjZWl2ZWRIZWFkZXJCeXRlcyA9IDA7CisKKyAgaW50IF9ib2R5U2l6ZSA9IDA7CisgIFVpbnQ4TGlzdCBfYm9keSA9IG51bGw7CisgIGludCBfcmVjZWl2ZWRCb2R5Qnl0ZXMgPSAwOworCisgIENvbXBsZXRlcjxVaW50OExpc3Q+IF9mcmFtZUNvbXBsZXRlciA9IG51bGw7CisKKyAgVEZyYW1lZFRyYW5zcG9ydChUVHJhbnNwb3J0IHRyYW5zcG9ydCkgOiBfdHJhbnNwb3J0ID0gdHJhbnNwb3J0IHsKKyAgICBpZiAodHJhbnNwb3J0ID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yLm5vdE51bGwoInRyYW5zcG9ydCIpOworICAgIH0KKyAgfQorCisgIGJvb2wgZ2V0IGlzT3BlbiA9PiBfdHJhbnNwb3J0LmlzT3BlbjsKKworICBGdXR1cmUgb3BlbigpIHsKKyAgICBfcmVzZXQoaXNPcGVuOiB0cnVlKTsKKyAgICByZXR1cm4gX3RyYW5zcG9ydC5vcGVuKCk7CisgIH0KKworICBGdXR1cmUgY2xvc2UoKSB7CisgICAgX3Jlc2V0KGlzT3BlbjogZmFsc2UpOworICAgIHJldHVybiBfdHJhbnNwb3J0LmNsb3NlKCk7CisgIH0KKworICBpbnQgcmVhZChVaW50OExpc3QgYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7CisgICAgaWYgKGhhc1JlYWREYXRhKSB7CisgICAgICBpbnQgZ290ID0gc3VwZXIucmVhZChidWZmZXIsIG9mZnNldCwgbGVuZ3RoKTsKKyAgICAgIGlmIChnb3QgPiAwKSByZXR1cm4gZ290OworICAgIH0KKworICAgIC8vIElNUE9SVEFOVDogYnkgdGhlIHRpbWUgeW91J3ZlIGdvdCBoZXJlLAorICAgIC8vIGFuIGVudGlyZSBmcmFtZSBpcyBhdmFpbGFibGUgZm9yIHJlYWRpbmcKKworICAgIHJldHVybiBzdXBlci5yZWFkKGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgpOworICB9CisKKyAgdm9pZCBfcmVhZEZyYW1lKCkgeworICAgIGlmIChfYm9keSA9PSBudWxsKSB7CisgICAgICBib29sIGdvdEZ1bGxIZWFkZXIgPSBfcmVhZEZyYW1lSGVhZGVyKCk7CisgICAgICBpZiAoIWdvdEZ1bGxIZWFkZXIpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgIH0KKworICAgIF9yZWFkRnJhbWVCb2R5KCk7CisgIH0KKworICBib29sIF9yZWFkRnJhbWVIZWFkZXIoKSB7CisgICAgdmFyIHJlbWFpbmluZ0hlYWRlckJ5dGVzID0gaGVhZGVyQnl0ZUNvdW50IC0gX3JlY2VpdmVkSGVhZGVyQnl0ZXM7CisKKyAgICBpbnQgZ290ID0gX3RyYW5zcG9ydC5yZWFkKF9oZWFkZXJCeXRlcywgX3JlY2VpdmVkSGVhZGVyQnl0ZXMsIHJlbWFpbmluZ0hlYWRlckJ5dGVzKTsKKyAgICBpZiAoZ290IDwgMCkgeworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFcnJvcigKKyAgICAgICAgICBUVHJhbnNwb3J0RXJyb3JUeXBlLlVOS05PV04sICJTb2NrZXQgY2xvc2VkIGR1cmluZyBmcmFtZSBoZWFkZXIgcmVhZCIpOworICAgIH0KKworICAgIF9yZWNlaXZlZEhlYWRlckJ5dGVzICs9IGdvdDsKKworICAgIGlmIChfcmVjZWl2ZWRIZWFkZXJCeXRlcyA9PSBoZWFkZXJCeXRlQ291bnQpIHsKKyAgICAgIGludCBzaXplID0gX2hlYWRlckJ5dGVzLmJ1ZmZlci5hc0J5dGVEYXRhKCkuZ2V0VWludDMyKDApOworCisgICAgICBfcmVjZWl2ZWRIZWFkZXJCeXRlcyA9IDA7CisKKyAgICAgIGlmIChzaXplIDwgMCkgeworICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEVycm9yKAorICAgICAgICAgICAgVFRyYW5zcG9ydEVycm9yVHlwZS5VTktOT1dOLCAiUmVhZCBhIG5lZ2F0aXZlIGZyYW1lIHNpemU6ICRzaXplIik7CisgICAgICB9CisKKyAgICAgIF9ib2R5U2l6ZSA9IHNpemU7CisgICAgICBfYm9keSA9IG5ldyBVaW50OExpc3QoX2JvZHlTaXplKTsKKyAgICAgIF9yZWNlaXZlZEJvZHlCeXRlcyA9IDA7CisKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICBfcmVnaXN0ZXJGb3JSZWFkYWJsZUJ5dGVzKCk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisKKyAgdm9pZCBfcmVhZEZyYW1lQm9keSgpIHsKKyAgICB2YXIgcmVtYWluaW5nQm9keUJ5dGVzID0gX2JvZHlTaXplIC0gX3JlY2VpdmVkQm9keUJ5dGVzOworCisgICAgaW50IGdvdCA9IF90cmFuc3BvcnQucmVhZChfYm9keSwgX3JlY2VpdmVkQm9keUJ5dGVzLCByZW1haW5pbmdCb2R5Qnl0ZXMpOworICAgIGlmIChnb3QgPCAwKSB7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEVycm9yKAorICAgICAgICAgIFRUcmFuc3BvcnRFcnJvclR5cGUuVU5LTk9XTiwgIlNvY2tldCBjbG9zZWQgZHVyaW5nIGZyYW1lIGJvZHkgcmVhZCIpOworICAgIH0KKworICAgIF9yZWNlaXZlZEJvZHlCeXRlcyArPSBnb3Q7CisKKyAgICBpZiAoX3JlY2VpdmVkQm9keUJ5dGVzID09IF9ib2R5U2l6ZSkgeworICAgICAgdmFyIGJvZHkgPSBfYm9keTsKKworICAgICAgX2JvZHlTaXplID0gMDsKKyAgICAgIF9ib2R5ID0gbnVsbDsKKyAgICAgIF9yZWNlaXZlZEJvZHlCeXRlcyA9IDA7CisKKyAgICAgIF9zZXRSZWFkQnVmZmVyKGJvZHkpOworCisgICAgICB2YXIgY29tcGxldGVyID0gX2ZyYW1lQ29tcGxldGVyOworICAgICAgX2ZyYW1lQ29tcGxldGVyID0gbnVsbDsKKyAgICAgIGNvbXBsZXRlci5jb21wbGV0ZShuZXcgVWludDhMaXN0KDApKTsKKyAgICB9IGVsc2UgeworICAgICAgX3JlZ2lzdGVyRm9yUmVhZGFibGVCeXRlcygpOworICAgIH0KKyAgfQorCisgIEZ1dHVyZSBmbHVzaCgpIHsKKyAgICBpZiAoX2ZyYW1lQ29tcGxldGVyID09IG51bGwpIHsKKyAgICAgIFVpbnQ4TGlzdCBidWZmZXIgPSBjb25zdW1lV3JpdGVCdWZmZXIoKTsKKyAgICAgIGludCBsZW5ndGggPSBidWZmZXIubGVuZ3RoOworCisgICAgICBfaGVhZGVyQnl0ZXMuYnVmZmVyLmFzQnl0ZURhdGEoKS5zZXRVaW50MzIoMCwgbGVuZ3RoKTsKKyAgICAgIF90cmFuc3BvcnQud3JpdGUoX2hlYWRlckJ5dGVzLCAwLCBoZWFkZXJCeXRlQ291bnQpOworICAgICAgX3RyYW5zcG9ydC53cml0ZShidWZmZXIsIDAsIGxlbmd0aCk7CisKKyAgICAgIF9mcmFtZUNvbXBsZXRlciAgPSBuZXcgQ29tcGxldGVyPFVpbnQ4TGlzdD4oKTsKKyAgICAgIF9yZWdpc3RlckZvclJlYWRhYmxlQnl0ZXMoKTsKKyAgICB9CisKKyAgICByZXR1cm4gX2ZyYW1lQ29tcGxldGVyLmZ1dHVyZTsKKyAgfQorCisgIHZvaWQgX3JlZ2lzdGVyRm9yUmVhZGFibGVCeXRlcygpIHsKKyAgICBfdHJhbnNwb3J0LmZsdXNoKCkudGhlbigoXykgeworICAgICAgX3JlYWRGcmFtZSgpOworICAgIH0pLmNhdGNoRXJyb3IoKGUpIHsKKyAgICAgIHZhciBjb21wbGV0ZXIgPSBfZnJhbWVDb21wbGV0ZXI7CisKKyAgICAgIF9yZWNlaXZlZEhlYWRlckJ5dGVzID0gMDsKKyAgICAgIF9ib2R5U2l6ZSA9IDA7CisgICAgICBfYm9keSA9IG51bGw7CisgICAgICBfcmVjZWl2ZWRCb2R5Qnl0ZXMgPSAwOworICAgICAgX2ZyYW1lQ29tcGxldGVyID0gbnVsbDsKKworICAgICAgY29tcGxldGVyLmNvbXBsZXRlRXJyb3IoZSk7CisgICAgfSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi9zcmMvdHJhbnNwb3J0L3RfaHR0cF90cmFuc3BvcnQuZGFydCBiL2xpYi9kYXJ0L2xpYi9zcmMvdHJhbnNwb3J0L3RfaHR0cF90cmFuc3BvcnQuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTc4ZTljCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3NyYy90cmFuc3BvcnQvdF9odHRwX3RyYW5zcG9ydC5kYXJ0CkBAIC0wLDAgKzEsMTAwIEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFydCBvZiB0aHJpZnQ7CisKKy8vLyBIVFRQIGltcGxlbWVudGF0aW9uIG9mIFtUVHJhbnNwb3J0XS4KKy8vLworLy8vIEZvciBleGFtcGxlOgorLy8vCisvLy8gICAgIHZhciB0cmFuc3BvcnQgPSBuZXcgVEh0dHBDbGllbnRUcmFuc3BvcnQobmV3IEJyb3dzZXJDbGllbnQoKSwKKy8vLyAgICAgICAgIG5ldyBUSHR0cENvbmZpZyh1cmwsIHsnWC1NeS1DdXN0b20tSGVhZGVyJzogJ215IHZhbHVlJ30pKTsKKy8vLyAgICAgdmFyIHByb3RvY29sID0gbmV3IFRKc29uUHJvdG9jb2wodHJhbnNwb3J0KTsKKy8vLyAgICAgdmFyIGNsaWVudCA9IG5ldyBNeVRocmlmdFNlcnZpY2VDbGllbnQocHJvdG9jb2wpOworLy8vICAgICB2YXIgcmVzdWx0ID0gY2xpZW50Lm15TWV0aG9kKCk7CisvLy8KKy8vLyBBZGFwdGVkIGZyb20gdGhlIEpTIFhIUiBIVFRQIHRyYW5zcG9ydC4KK2NsYXNzIFRIdHRwQ2xpZW50VHJhbnNwb3J0IGV4dGVuZHMgVEJ1ZmZlcmVkVHJhbnNwb3J0IHsKKyAgZmluYWwgQ2xpZW50IGh0dHBDbGllbnQ7CisgIGZpbmFsIFRIdHRwQ29uZmlnIGNvbmZpZzsKKworICBUSHR0cENsaWVudFRyYW5zcG9ydCh0aGlzLmh0dHBDbGllbnQsIHRoaXMuY29uZmlnKSB7CisgICAgaWYgKGh0dHBDbGllbnQgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3Iubm90TnVsbCgiaHR0cENsaWVudCIpOworICAgIH0KKyAgfQorCisgIEZ1dHVyZSBjbG9zZSgpIGFzeW5jIHsKKyAgICBfcmVzZXQoaXNPcGVuOiBmYWxzZSk7CisgICAgaHR0cENsaWVudC5jbG9zZSgpOworICB9CisKKyAgRnV0dXJlIGZsdXNoKCkgeworICAgIHZhciByZXF1ZXN0Qm9keSA9IEJBU0U2NC5lbmNvZGUoY29uc3VtZVdyaXRlQnVmZmVyKCkpOworCisgICAgLy8gVXNlIGEgc3luYyBjb21wbGV0ZXIgdG8gZW5zdXJlIHRoYXQgdGhlIGJ1ZmZlciBjYW4gYmUgcmVhZCBpbW1lZGlhdGVseQorICAgIC8vIGFmdGVyIHRoZSByZWFkIGJ1ZmZlciBpcyBzZXQsIGFuZCBhdm9pZCBhIHJhY2UgY29uZGl0aW9uIHdoZXJlIGFub3RoZXIKKyAgICAvLyByZXNwb25zZSBjb3VsZCBvdmVyd3JpdGUgdGhlIHJlYWQgYnVmZmVyLgorICAgIHZhciBjb21wbGV0ZXIgPSBuZXcgQ29tcGxldGVyLnN5bmMoKTsKKworICAgIGh0dHBDbGllbnQKKyAgICAgICAgLnBvc3QoY29uZmlnLnVybCwgaGVhZGVyczogY29uZmlnLmhlYWRlcnMsIGJvZHk6IHJlcXVlc3RCb2R5KQorICAgICAgICAudGhlbigocmVzcG9uc2UpIHsKKyAgICAgIFVpbnQ4TGlzdCBkYXRhOworICAgICAgdHJ5IHsKKyAgICAgICAgZGF0YSA9IG5ldyBVaW50OExpc3QuZnJvbUxpc3QoCisgICAgICAgICAgICBCQVNFNjQuZGVjb2RlKHJlc3BvbnNlLmJvZHkpKTsKKyAgICAgIH0gb24gRm9ybWF0RXhjZXB0aW9uIGNhdGNoIChfKSB7CisgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFcnJvcihUUHJvdG9jb2xFcnJvclR5cGUuSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgIkV4cGVjdGVkIGEgQmFzZSA2NCBlbmNvZGVkIHN0cmluZy4iKTsKKyAgICAgIH0KKworICAgICAgX3NldFJlYWRCdWZmZXIoZGF0YSk7CisgICAgICBjb21wbGV0ZXIuY29tcGxldGUoKTsKKyAgICB9KTsKKworICAgIHJldHVybiBjb21wbGV0ZXIuZnV0dXJlOworICB9Cit9CisKK2NsYXNzIFRIdHRwQ29uZmlnIHsKKyAgZmluYWwgVXJpIHVybDsKKworICBNYXA8U3RyaW5nLCBTdHJpbmc+IF9oZWFkZXJzOworICBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldCBoZWFkZXJzID0+IF9oZWFkZXJzOworCisgIFRIdHRwQ29uZmlnKHRoaXMudXJsLCBNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnMpIHsKKyAgICBpZiAodXJsID09IG51bGwgfHwgIXVybC5oYXNBdXRob3JpdHkpIHsKKyAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCJJbnZhbGlkIHVybCIpOworICAgIH0KKworICAgIF9pbml0SGVhZGVycyhoZWFkZXJzKTsKKyAgfQorCisgIHZvaWQgX2luaXRIZWFkZXJzKE1hcDxTdHJpbmcsIFN0cmluZz4gaW5pdGlhbCkgeworICAgIHZhciBoID0ge307CisKKyAgICBpZiAoaW5pdGlhbCAhPSBudWxsKSB7CisgICAgICBoLmFkZEFsbChpbml0aWFsKTsKKyAgICB9CisKKyAgICBoWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi94LXRocmlmdCc7CisgICAgaFsnQWNjZXB0J10gPSAnYXBwbGljYXRpb24veC10aHJpZnQnOworCisgICAgX2hlYWRlcnMgPSBuZXcgTWFwLnVubW9kaWZpYWJsZShoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3NyYy90cmFuc3BvcnQvdF9tZXNzYWdlX3JlYWRlci5kYXJ0IGIvbGliL2RhcnQvbGliL3NyYy90cmFuc3BvcnQvdF9tZXNzYWdlX3JlYWRlci5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjYTA3MDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvc3JjL3RyYW5zcG9ydC90X21lc3NhZ2VfcmVhZGVyLmRhcnQKQEAgLTAsMCArMSw5OSBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhcnQgb2YgdGhyaWZ0OworCisvLy8gW1RNZXNzYWdlUmVhZGVyXSBleHRyYWN0cyBhIFtUTWVzc2FnZV0gZnJvbSBieXRlcy4gIFRoaXMgaXMgdXNlZCB0byBhbGxvdyBhCisvLy8gdHJhbnNwb3J0IHRvIGluc3BlY3QgdGhlIG1lc3NhZ2Ugc2VxaWQgYW5kIG1hcCByZXNwb25zZXMgdG8gcmVxdWVzdHMuCitjbGFzcyBUTWVzc2FnZVJlYWRlciB7CisgIGZpbmFsIFRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5OworCisgIGZpbmFsIGludCBieXRlT2Zmc2V0OworICBmaW5hbCBfVE1lc3NhZ2VSZWFkZXJUcmFuc3BvcnQgX3RyYW5zcG9ydDsKKworICAvLy8gQ29uc3RydWN0IGEgW01lc3NhZ2VSZWFkZXJdLiAgVGhlIG9wdGlvbmFsIFtieXRlT2Zmc2V0XSBzcGVjaWZpZXMgdGhlCisgIC8vLyBudW1iZXIgb2YgYnl0ZXMgdG8gc2tpcCBiZWZvcmUgcmVhZGluZyB0aGUgW1RNZXNzYWdlXS4KKyAgVE1lc3NhZ2VSZWFkZXIodGhpcy5wcm90b2NvbEZhY3RvcnksIHtpbnQgYnl0ZU9mZnNldDogMH0pCisgICAgICA6IF90cmFuc3BvcnQgPSBuZXcgX1RNZXNzYWdlUmVhZGVyVHJhbnNwb3J0KCksCisgICAgICAgIHRoaXMuYnl0ZU9mZnNldCA9IGJ5dGVPZmZzZXQ7CisKKyAgVE1lc3NhZ2UgcmVhZE1lc3NhZ2UoVWludDhMaXN0IGJ5dGVzKSB7CisgICAgX3RyYW5zcG9ydC5yZXNldChieXRlcywgYnl0ZU9mZnNldCk7CisgICAgVFByb3RvY29sIHByb3RvY29sID0gcHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKF90cmFuc3BvcnQpOworICAgIFRNZXNzYWdlIG1lc3NhZ2UgPSBwcm90b2NvbC5yZWFkTWVzc2FnZUJlZ2luKCk7CisgICAgX3RyYW5zcG9ydC5yZXNldChudWxsKTsKKworICAgIHJldHVybiBtZXNzYWdlOworICB9Cit9CisKKy8vLyBBbiBpbnRlcm5hbCBjbGFzcyB1c2VkIHRvIHN1cHBvcnQgW1RNZXNzYWdlUmVhZGVyXS4KK2NsYXNzIF9UTWVzc2FnZVJlYWRlclRyYW5zcG9ydCBleHRlbmRzIFRUcmFuc3BvcnQgeworICBfVE1lc3NhZ2VSZWFkZXJUcmFuc3BvcnQoKTsKKworICBJdGVyYXRvcjxpbnQ+IF9yZWFkSXRlcmF0b3I7CisKKyAgdm9pZCByZXNldChVaW50OExpc3QgYnl0ZXMsIFtpbnQgb2Zmc2V0ID0gMF0pIHsKKyAgICBpZiAoYnl0ZXMgPT0gbnVsbCkgeworICAgICAgX3JlYWRJdGVyYXRvciA9IG51bGw7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG9mZnNldCA+IGJ5dGVzLmxlbmd0aCkgeworICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoIlRoZSBvZmZzZXQgZXhjZWVkcyB0aGUgYnl0ZXMgbGVuZ3RoIik7CisgICAgfQorCisgICAgX3JlYWRJdGVyYXRvciA9IGJ5dGVzLml0ZXJhdG9yOworCisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvZmZzZXQ7IGkrKykgeworICAgICAgX3JlYWRJdGVyYXRvci5tb3ZlTmV4dCgpOworICAgIH0KKyAgfQorCisgIGdldCBpc09wZW4gPT4gdHJ1ZTsKKworICBGdXR1cmUgb3BlbigpID0+IHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJVbnN1cHBvcnRlZCBpbiBNZXNzYWdlUmVhZGVyIik7CisKKyAgRnV0dXJlIGNsb3NlKCkgPT4gdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIlVuc3VwcG9ydGVkIGluIE1lc3NhZ2VSZWFkZXIiKTsKKworICBpbnQgcmVhZChVaW50OExpc3QgYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7CisgICAgaWYgKGJ1ZmZlciA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvci5ub3ROdWxsKCJidWZmZXIiKTsKKyAgICB9CisKKyAgICBpZiAob2Zmc2V0ICsgbGVuZ3RoID4gYnVmZmVyLmxlbmd0aCkgeworICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoIlRoZSByYW5nZSBleGNlZWRzIHRoZSBidWZmZXIgbGVuZ3RoIik7CisgICAgfQorCisgICAgaWYgKF9yZWFkSXRlcmF0b3IgPT0gbnVsbCB8fCBsZW5ndGggPD0gMCkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaW50IGkgPSAwOworICAgIHdoaWxlIChpIDwgbGVuZ3RoICYmIF9yZWFkSXRlcmF0b3IubW92ZU5leHQoKSkgeworICAgICAgYnVmZmVyW29mZnNldCArIGldID0gX3JlYWRJdGVyYXRvci5jdXJyZW50OworICAgICAgaSsrOworICAgIH0KKworICAgIHJldHVybiBpOworICB9CisKKyAgdm9pZCB3cml0ZShVaW50OExpc3QgYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSA9PgorICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIlVuc3VwcG9ydGVkIGluIE1lc3NhZ2VSZWFkZXIiKTsKKworICBGdXR1cmUgZmx1c2goKSA9PiB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiVW5zdXBwb3J0ZWQgaW4gTWVzc2FnZVJlYWRlciIpOworfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3NyYy90cmFuc3BvcnQvdF9zb2NrZXQuZGFydCBiL2xpYi9kYXJ0L2xpYi9zcmMvdHJhbnNwb3J0L3Rfc29ja2V0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJlYjZiNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi9zcmMvdHJhbnNwb3J0L3Rfc29ja2V0LmRhcnQKQEAgLTAsMCArMSwzOCBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhcnQgb2YgdGhyaWZ0OworCitlbnVtIFRTb2NrZXRTdGF0ZSB7IENMT1NFRCwgT1BFTiB9CisKK2Fic3RyYWN0IGNsYXNzIFRTb2NrZXQgeworICBTdHJlYW08VFNvY2tldFN0YXRlPiBnZXQgb25TdGF0ZTsKKworICBTdHJlYW08T2JqZWN0PiBnZXQgb25FcnJvcjsKKworICBTdHJlYW08VWludDhMaXN0PiBnZXQgb25NZXNzYWdlOworCisgIGJvb2wgZ2V0IGlzT3BlbjsKKworICBib29sIGdldCBpc0Nsb3NlZDsKKworICBGdXR1cmUgb3BlbigpOworCisgIEZ1dHVyZSBjbG9zZSgpOworCisgIHZvaWQgc2VuZChVaW50OExpc3QgZGF0YSk7Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC9saWIvc3JjL3RyYW5zcG9ydC90X3NvY2tldF90cmFuc3BvcnQuZGFydCBiL2xpYi9kYXJ0L2xpYi9zcmMvdHJhbnNwb3J0L3Rfc29ja2V0X3RyYW5zcG9ydC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MTM3NGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvc3JjL3RyYW5zcG9ydC90X3NvY2tldF90cmFuc3BvcnQuZGFydApAQCAtMCwwICsxLDE3NyBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhcnQgb2YgdGhyaWZ0OworCisvLy8gU29ja2V0IGltcGxlbWVudGF0aW9uIG9mIFtUVHJhbnNwb3J0XS4KKy8vLworLy8vIEZvciBleGFtcGxlOgorLy8vCisvLy8gICAgIHZhciB0cmFuc3BvcnQgPSBuZXcgVENsaWVudFNvY2tldFRyYW5zcG9ydChuZXcgVFdlYlNvY2tldCh1cmwpKTsKKy8vLyAgICAgdmFyIHByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpOworLy8vICAgICB2YXIgY2xpZW50ID0gbmV3IE15VGhyaWZ0U2VydmljZUNsaWVudChwcm90b2NvbCk7CisvLy8gICAgIHZhciByZXN1bHQgPSBjbGllbnQubXlNZXRob2QoKTsKKy8vLworLy8vIEFkYXB0ZWQgZnJvbSB0aGUgSlMgV2ViU29ja2V0IHRyYW5zcG9ydC4KK2Fic3RyYWN0IGNsYXNzIFRTb2NrZXRUcmFuc3BvcnQgZXh0ZW5kcyBUQnVmZmVyZWRUcmFuc3BvcnQgeworICBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gbmV3IExvZ2dlcigndGhyaWZ0LlRTb2NrZXRUcmFuc3BvcnQnKTsKKworICBmaW5hbCBUU29ja2V0IHNvY2tldDsKKworICAvLy8gQSB0cmFuc3BvcnQgdXNpbmcgdGhlIHByb3ZpZGVkIFtzb2NrZXRdLgorICBUU29ja2V0VHJhbnNwb3J0KHRoaXMuc29ja2V0KSB7CisgICAgaWYgKHNvY2tldCA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvci5ub3ROdWxsKCdzb2NrZXQnKTsKKyAgICB9CisKKyAgICBzb2NrZXQub25FcnJvci5saXN0ZW4oKGUpID0+IGxvZ2dlci53YXJuaW5nKGUpKTsKKyAgICBzb2NrZXQub25NZXNzYWdlLmxpc3RlbihoYW5kbGVJbmNvbWluZ01lc3NhZ2UpOworICB9CisKKyAgYm9vbCBnZXQgaXNPcGVuID0+IHNvY2tldC5pc09wZW47CisKKyAgRnV0dXJlIG9wZW4oKSB7CisgICAgX3Jlc2V0KGlzT3BlbjogdHJ1ZSk7CisgICAgcmV0dXJuIHNvY2tldC5vcGVuKCk7CisgIH0KKworICBGdXR1cmUgY2xvc2UoKSB7CisgICAgX3Jlc2V0KGlzT3BlbjogZmFsc2UpOworICAgIHJldHVybiBzb2NrZXQuY2xvc2UoKTsKKyAgfQorCisgIC8vLyBNYWtlIGFuIGluY29taW5nIG1lc3NhZ2UgYXZhaWxhYmxlIHRvIHJlYWQgZnJvbSB0aGUgdHJhbnNwb3J0LgorICB2b2lkIGhhbmRsZUluY29taW5nTWVzc2FnZShVaW50OExpc3QgbWVzc2FnZUJ5dGVzKSB7CisgICAgX3NldFJlYWRCdWZmZXIobWVzc2FnZUJ5dGVzKTsKKyAgfQorfQorCisvLy8gW1RDbGllbnRTb2NrZXRUcmFuc3BvcnRdIGlzIGEgYmFzaWMgY2xpZW50IHNvY2tldCB0cmFuc3BvcnQuICBJdCBzZW5kcworLy8vIG91dGdvaW5nIG1lc3NhZ2VzIGFuZCBleHBlY3RzIGEgcmVzcG9uc2UuCisvLy8KKy8vLyBOT1RFOiBUaGlzIHRyYW5zcG9ydCBleHBlY3RzIGEgc2luZ2xlIHRocmVhZGVkIHNlcnZlciwgYXMgaXQgd2lsbCBwcm9jZXNzCisvLy8gcmVzcG9uc2VzIGluIEZJRk8gb3JkZXIuCitjbGFzcyBUQ2xpZW50U29ja2V0VHJhbnNwb3J0IGV4dGVuZHMgVFNvY2tldFRyYW5zcG9ydCB7CisgIGZpbmFsIExpc3Q8Q29tcGxldGVyPFVpbnQ4TGlzdD4+IF9jb21wbGV0ZXJzID0gW107CisKKyAgVENsaWVudFNvY2tldFRyYW5zcG9ydChUU29ja2V0IHNvY2tldCkgOiBzdXBlcihzb2NrZXQpOworCisgIEZ1dHVyZSBmbHVzaCgpIHsKKyAgICBVaW50OExpc3QgYnl0ZXMgPSBjb25zdW1lV3JpdGVCdWZmZXIoKTsKKworICAgIC8vIFVzZSBhIHN5bmMgY29tcGxldGVyIHRvIGVuc3VyZSB0aGF0IHRoZSBidWZmZXIgY2FuIGJlIHJlYWQgaW1tZWRpYXRlbHkKKyAgICAvLyBhZnRlciB0aGUgcmVhZCBidWZmZXIgaXMgc2V0LCBhbmQgYXZvaWQgYSByYWNlIGNvbmRpdGlvbiB3aGVyZSBhbm90aGVyCisgICAgLy8gcmVzcG9uc2UgY291bGQgb3ZlcndyaXRlIHRoZSByZWFkIGJ1ZmZlci4KKyAgICB2YXIgY29tcGxldGVyID0gbmV3IENvbXBsZXRlcjxVaW50OExpc3Q+LnN5bmMoKTsKKyAgICBfY29tcGxldGVycy5hZGQoY29tcGxldGVyKTsKKworICAgIGlmIChieXRlcy5sZW5ndGhJbkJ5dGVzID4gMCkgeworICAgICAgc29ja2V0LnNlbmQoYnl0ZXMpOworICAgIH0KKworICAgIHJldHVybiBjb21wbGV0ZXIuZnV0dXJlOworICB9CisKKyAgdm9pZCBoYW5kbGVJbmNvbWluZ01lc3NhZ2UoVWludDhMaXN0IG1lc3NhZ2VCeXRlcykgeworICAgIHN1cGVyLmhhbmRsZUluY29taW5nTWVzc2FnZShtZXNzYWdlQnl0ZXMpOworCisgICAgaWYgKF9jb21wbGV0ZXJzLmlzTm90RW1wdHkpIHsKKyAgICAgIHZhciBjb21wbGV0ZXIgPSBfY29tcGxldGVycy5yZW1vdmVBdCgwKTsKKyAgICAgIGNvbXBsZXRlci5jb21wbGV0ZSgpOworICAgIH0KKyAgfQorfQorCisvLy8gW1RBc3luY0NsaWVudFNvY2tldFRyYW5zcG9ydF0gc2VuZHMgb3V0Z29pbmcgbWVzc2FnZXMgYW5kIGV4cGVjdHMgYW4KKy8vLyBhc3luY2hyb25vdXMgcmVzcG9uc2UuCisvLy8KKy8vLyBOT1RFOiBUaGlzIHRyYW5zcG9ydCB1c2VzIGEgW01lc3NhZ2VSZWFkZXJdIHRvIHJlYWQgYSBbVE1lc3NhZ2VdIHdoZW4gYW4KKy8vLyBpbmNvbWluZyBtZXNzYWdlIGFycml2ZXMgdG8gY29ycmVsYXRlIGEgcmVzcG9uc2UgdG8gYSByZXF1ZXN0LCB1c2luZyB0aGUKKy8vLyBzZXFpZC4KK2NsYXNzIFRBc3luY0NsaWVudFNvY2tldFRyYW5zcG9ydCBleHRlbmRzIFRTb2NrZXRUcmFuc3BvcnQgeworICBzdGF0aWMgY29uc3QgZGVmYXVsdFRpbWVvdXQgPSBjb25zdCBEdXJhdGlvbihzZWNvbmRzOiAzMCk7CisKKyAgZmluYWwgTWFwPGludCwgQ29tcGxldGVyPFVpbnQ4TGlzdD4+IF9jb21wbGV0ZXJzID0ge307CisKKyAgZmluYWwgVE1lc3NhZ2VSZWFkZXIgbWVzc2FnZVJlYWRlcjsKKworICBmaW5hbCBEdXJhdGlvbiByZXNwb25zZVRpbWVvdXQ7CisKKyAgVEFzeW5jQ2xpZW50U29ja2V0VHJhbnNwb3J0KFRTb2NrZXQgc29ja2V0LCBUTWVzc2FnZVJlYWRlciBtZXNzYWdlUmVhZGVyLAorICAgICAge0R1cmF0aW9uIHJlc3BvbnNlVGltZW91dDogZGVmYXVsdFRpbWVvdXR9KQorICAgICAgOiB0aGlzLm1lc3NhZ2VSZWFkZXIgPSBtZXNzYWdlUmVhZGVyLAorICAgICAgICB0aGlzLnJlc3BvbnNlVGltZW91dCA9IHJlc3BvbnNlVGltZW91dCwKKyAgICAgICAgc3VwZXIoc29ja2V0KTsKKworICBGdXR1cmUgZmx1c2goKSB7CisgICAgVWludDhMaXN0IGJ5dGVzID0gY29uc3VtZVdyaXRlQnVmZmVyKCk7CisgICAgVE1lc3NhZ2UgbWVzc2FnZSA9IG1lc3NhZ2VSZWFkZXIucmVhZE1lc3NhZ2UoYnl0ZXMpOworICAgIGludCBzZXFpZCA9IG1lc3NhZ2Uuc2VxaWQ7CisKKyAgICAvLyBVc2UgYSBzeW5jIGNvbXBsZXRlciB0byBlbnN1cmUgdGhhdCB0aGUgYnVmZmVyIGNhbiBiZSByZWFkIGltbWVkaWF0ZWx5CisgICAgLy8gYWZ0ZXIgdGhlIHJlYWQgYnVmZmVyIGlzIHNldCwgYW5kIGF2b2lkIGEgcmFjZSBjb25kaXRpb24gd2hlcmUgYW5vdGhlcgorICAgIC8vIHJlc3BvbnNlIGNvdWxkIG92ZXJ3cml0ZSB0aGUgcmVhZCBidWZmZXIuCisgICAgdmFyIGNvbXBsZXRlciA9IG5ldyBDb21wbGV0ZXI8VWludDhMaXN0Pi5zeW5jKCk7CisgICAgX2NvbXBsZXRlcnNbc2VxaWRdID0gY29tcGxldGVyOworCisgICAgaWYgKHJlc3BvbnNlVGltZW91dCAhPSBudWxsKSB7CisgICAgICBuZXcgRnV0dXJlLmRlbGF5ZWQocmVzcG9uc2VUaW1lb3V0LCAoKSB7CisgICAgICAgIHZhciBjb21wbGV0ZXIgPSBfY29tcGxldGVycy5yZW1vdmUoc2VxaWQpOworICAgICAgICBpZiAoY29tcGxldGVyICE9IG51bGwpIHsKKyAgICAgICAgICBjb21wbGV0ZXIuY29tcGxldGVFcnJvcigKKyAgICAgICAgICAgICAgbmV3IFRpbWVvdXRFeGNlcHRpb24oIlJlc3BvbnNlIHRpbWVkIG91dC4iLCByZXNwb25zZVRpbWVvdXQpKTsKKyAgICAgICAgfQorICAgICAgfSk7CisgICAgfQorCisgICAgc29ja2V0LnNlbmQoYnl0ZXMpOworCisgICAgcmV0dXJuIGNvbXBsZXRlci5mdXR1cmU7CisgIH0KKworICB2b2lkIGhhbmRsZUluY29taW5nTWVzc2FnZShVaW50OExpc3QgbWVzc2FnZUJ5dGVzKSB7CisgICAgc3VwZXIuaGFuZGxlSW5jb21pbmdNZXNzYWdlKG1lc3NhZ2VCeXRlcyk7CisKKyAgICBUTWVzc2FnZSBtZXNzYWdlID0gbWVzc2FnZVJlYWRlci5yZWFkTWVzc2FnZShtZXNzYWdlQnl0ZXMpOworICAgIHZhciBjb21wbGV0ZXIgPSBfY29tcGxldGVycy5yZW1vdmUobWVzc2FnZS5zZXFpZCk7CisgICAgaWYgKGNvbXBsZXRlciAhPSBudWxsKSB7CisgICAgICBjb21wbGV0ZXIuY29tcGxldGUoKTsKKyAgICB9CisgIH0KK30KKworLy8vIFtUU2VydmVyU29ja2V0VHJhbnNwb3J0XSBsaXN0ZW5zIGZvciBpbmNvbWluZyBtZXNzYWdlcy4gIFdoZW4gaXQgc2VuZHMgYQorLy8vIHJlc3BvbnNlLCBpdCBkb2VzIG5vdCBleHBlY3QgYW4gYWNrbm93bGVkZ2VtZW50LgorY2xhc3MgVFNlcnZlclNvY2tldFRyYW5zcG9ydCBleHRlbmRzIFRTb2NrZXRUcmFuc3BvcnQgeworICBmaW5hbCBTdHJlYW1Db250cm9sbGVyIF9vbkluY29taW5nTWVzc2FnZUNvbnRyb2xsZXI7CisgIFN0cmVhbSBnZXQgb25JbmNvbWluZ01lc3NhZ2UgPT4gX29uSW5jb21pbmdNZXNzYWdlQ29udHJvbGxlci5zdHJlYW07CisKKyAgVFNlcnZlclNvY2tldFRyYW5zcG9ydChUU29ja2V0IHNvY2tldCkKKyAgICAgIDogX29uSW5jb21pbmdNZXNzYWdlQ29udHJvbGxlciA9IG5ldyBTdHJlYW1Db250cm9sbGVyLmJyb2FkY2FzdCgpLAorICAgICAgICBzdXBlcihzb2NrZXQpOworCisgIEZ1dHVyZSBmbHVzaCgpIGFzeW5jIHsKKyAgICBVaW50OExpc3QgbWVzc2FnZSA9IGNvbnN1bWVXcml0ZUJ1ZmZlcigpOworICAgIHNvY2tldC5zZW5kKG1lc3NhZ2UpOworICB9CisKKyAgdm9pZCBoYW5kbGVJbmNvbWluZ01lc3NhZ2UoVWludDhMaXN0IG1lc3NhZ2VCeXRlcykgeworICAgIHN1cGVyLmhhbmRsZUluY29taW5nTWVzc2FnZShtZXNzYWdlQnl0ZXMpOworCisgICAgX29uSW5jb21pbmdNZXNzYWdlQ29udHJvbGxlci5hZGQobnVsbCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi9zcmMvdHJhbnNwb3J0L3RfdHJhbnNwb3J0LmRhcnQgYi9saWIvZGFydC9saWIvc3JjL3RyYW5zcG9ydC90X3RyYW5zcG9ydC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2M2Q1ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvc3JjL3RyYW5zcG9ydC90X3RyYW5zcG9ydC5kYXJ0CkBAIC0wLDAgKzEsNzAgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYXJ0IG9mIHRocmlmdDsKKworYWJzdHJhY3QgY2xhc3MgVFRyYW5zcG9ydCB7CisgIC8vLyBRdWVyaWVzIHdoZXRoZXIgdGhlIHRyYW5zcG9ydCBpcyBvcGVuLgorICAvLy8gUmV0dXJucyBbdHJ1ZV0gaWYgdGhlIHRyYW5zcG9ydCBpcyBvcGVuLgorICBib29sIGdldCBpc09wZW47CisKKyAgLy8vIE9wZW5zIHRoZSB0cmFuc3BvcnQgZm9yIHJlYWRpbmcvd3JpdGluZy4KKyAgLy8vIFRocm93cyBbVFRyYW5zcG9ydEVycm9yXSBpZiB0aGUgdHJhbnNwb3J0IGNvdWxkIG5vdCBiZSBvcGVuZWQuCisgIEZ1dHVyZSBvcGVuKCk7CisKKyAgLy8vIENsb3NlcyB0aGUgdHJhbnNwb3J0LgorICBGdXR1cmUgY2xvc2UoKTsKKworICAvLy8gUmVhZHMgdXAgdG8gW2xlbmd0aF0gYnl0ZXMgaW50byBbYnVmZmVyXSwgc3RhcnRpbmcgYXQgW29mZnNldF0uCisgIC8vLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgcmVhZC4KKyAgLy8vIFRocm93cyBbVFRyYW5zcG9ydEVycm9yXSBpZiB0aGVyZSB3YXMgYW4gZXJyb3IgcmVhZGluZyBkYXRhCisgIGludCByZWFkKFVpbnQ4TGlzdCBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpOworCisgIC8vLyBHdWFyYW50ZWVzIHRoYXQgYWxsIG9mIFtsZW5ndGhdIGJ5dGVzIGFyZSBhY3R1YWxseSByZWFkIG9mZiB0aGUgdHJhbnNwb3J0LgorICAvLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHJlYWQsIHdoaWNoIG11c3QgYmUgZXF1YWwgdG8KKyAgLy8vIFtsZW5ndGhdLgorICAvLy8gVGhyb3dzIFtUVHJhbnNwb3J0RXJyb3JdIGlmIHRoZXJlIHdhcyBhbiBlcnJvciByZWFkaW5nIGRhdGEKKyAgaW50IHJlYWRBbGwoVWludDhMaXN0IGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgeworICAgIGludCBnb3QgPSAwOworICAgIGludCByZXQgPSAwOworICAgIHdoaWxlIChnb3QgPCBsZW5ndGgpIHsKKyAgICAgIHJldCA9IHJlYWQoYnVmZmVyLCBvZmZzZXQgKyBnb3QsIGxlbmd0aCAtIGdvdCk7CisgICAgICBpZiAocmV0IDw9IDApIHsKKyAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFcnJvcigKKyAgICAgICAgICAgIFRUcmFuc3BvcnRFcnJvclR5cGUuVU5LTk9XTiwKKyAgICAgICAgICAgICJDYW5ub3QgcmVhZC4gUmVtb3RlIHNpZGUgaGFzIGNsb3NlZC4gVHJpZWQgdG8gcmVhZCAkbGVuZ3RoICIKKyAgICAgICAgICAgICJieXRlcywgYnV0IG9ubHkgZ290ICRnb3QgYnl0ZXMuIik7CisgICAgICB9CisgICAgICBnb3QgKz0gcmV0OworICAgIH0KKyAgICByZXR1cm4gZ290OworICB9CisKKyAgLy8vIFdyaXRlcyB1cCB0byBbbGVuXSBieXRlcyBmcm9tIHRoZSBidWZmZXIuCisgIC8vLyBUaHJvd3MgW1RUcmFuc3BvcnRFcnJvcl0gaWYgdGhlcmUgd2FzIGFuIGVycm9yIHdyaXRpbmcgZGF0YQorICB2b2lkIHdyaXRlKFVpbnQ4TGlzdCBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpOworCisgIC8vLyBXcml0ZXMgdGhlIFtieXRlc10gdG8gdGhlIG91dHB1dC4KKyAgLy8vIFRocm93cyBbVFRyYW5zcG9ydEVycm9yXSBpZiB0aGVyZSB3YXMgYW4gZXJyb3Igd3JpdGluZyBkYXRhCisgIHZvaWQgd3JpdGVBbGwoVWludDhMaXN0IGJ1ZmZlcikgeworICAgIHdyaXRlKGJ1ZmZlciwgMCwgYnVmZmVyLmxlbmd0aCk7CisgIH0KKworICAvLy8gRmx1c2ggYW55IHBlbmRpbmcgZGF0YSBvdXQgb2YgYSB0cmFuc3BvcnQgYnVmZmVyLgorICAvLy8gVGhyb3dzIFtUVHJhbnNwb3J0RXJyb3JdIGlmIHRoZXJlIHdhcyBhbiBlcnJvciB3cml0aW5nIG91dCBkYXRhLgorICBGdXR1cmUgZmx1c2goKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi9zcmMvdHJhbnNwb3J0L3RfdHJhbnNwb3J0X2Vycm9yLmRhcnQgYi9saWIvZGFydC9saWIvc3JjL3RyYW5zcG9ydC90X3RyYW5zcG9ydF9lcnJvci5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzNTA4ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvc3JjL3RyYW5zcG9ydC90X3RyYW5zcG9ydF9lcnJvci5kYXJ0CkBAIC0wLDAgKzEsMzEgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYXJ0IG9mIHRocmlmdDsKKworY2xhc3MgVFRyYW5zcG9ydEVycm9yVHlwZSB7CisgIHN0YXRpYyBjb25zdCBpbnQgVU5LTk9XTiA9IDA7CisgIHN0YXRpYyBjb25zdCBpbnQgTk9UX09QRU4gPSAxOworICBzdGF0aWMgY29uc3QgaW50IEFMUkVBRFlfT1BFTiA9IDI7CisgIHN0YXRpYyBjb25zdCBpbnQgVElNRURfT1VUID0gMzsKKyAgc3RhdGljIGNvbnN0IGludCBFTkRfT0ZfRklMRSA9IDQ7Cit9CisKK2NsYXNzIFRUcmFuc3BvcnRFcnJvciBleHRlbmRzIFRFcnJvciB7CisgIFRUcmFuc3BvcnRFcnJvcihbaW50IHR5cGUgPSBUVHJhbnNwb3J0RXJyb3JUeXBlLlVOS05PV04sIFN0cmluZyBtZXNzYWdlID0gIiJdKQorICAgICAgOiBzdXBlcih0eXBlLCBtZXNzYWdlKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi9zcmMvdHJhbnNwb3J0L3RfdHJhbnNwb3J0X2ZhY3RvcnkuZGFydCBiL2xpYi9kYXJ0L2xpYi9zcmMvdHJhbnNwb3J0L3RfdHJhbnNwb3J0X2ZhY3RvcnkuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTEwNDYxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3NyYy90cmFuc3BvcnQvdF90cmFuc3BvcnRfZmFjdG9yeS5kYXJ0CkBAIC0wLDAgKzEsMjcgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYXJ0IG9mIHRocmlmdDsKKworLy8vIEZhY3RvcnkgY2xhc3MgdXNlZCB0byBjcmVhdGUgd3JhcHBlZCBpbnN0YW5jZSBvZiBhIFtUVHJhbnNwb3J0XS4gVGhpcyBpcworLy8vIHVzZWQgcHJpbWFyaWx5IGluIHNlcnZlcnMuCisvLy8KKy8vLyBBZGFwdGVkIGZyb20gdGhlIEphdmEgdmVyc2lvbi4KK2NsYXNzIFRUcmFuc3BvcnRGYWN0b3J5IHsKKyAgRnV0dXJlPFRUcmFuc3BvcnQ+IGdldFRyYW5zcG9ydChUVHJhbnNwb3J0IHRyYW5zcG9ydCkgPT4KKyAgICAgIG5ldyBGdXR1cmUudmFsdWUodHJhbnNwb3J0KTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi90aHJpZnQuZGFydCBiL2xpYi9kYXJ0L2xpYi90aHJpZnQuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDliYjAxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3RocmlmdC5kYXJ0CkBAIC0wLDAgKzEsNjQgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitsaWJyYXJ5IHRocmlmdDsKKworaW1wb3J0ICdkYXJ0OmFzeW5jJzsKK2ltcG9ydCAnZGFydDpjb2xsZWN0aW9uJzsKK2ltcG9ydCAnZGFydDpjb252ZXJ0JyBzaG93IFV0ZjhDb2RlYywgQkFTRTY0OworaW1wb3J0ICdkYXJ0OnR5cGVkX2RhdGEnIHNob3cgQnl0ZURhdGE7CitpbXBvcnQgJ2RhcnQ6dHlwZWRfZGF0YScgc2hvdyBFbmRpYW5uZXNzOworaW1wb3J0ICdkYXJ0OnR5cGVkX2RhdGEnIHNob3cgVWludDhMaXN0OworCitpbXBvcnQgJ3BhY2thZ2U6Zml4bnVtL2ZpeG51bS5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTpodHRwL2h0dHAuZGFydCcgc2hvdyBDbGllbnQ7CitpbXBvcnQgJ3BhY2thZ2U6bG9nZ2luZy9sb2dnaW5nLmRhcnQnOworCitwYXJ0ICdzcmMvdF9hcHBsaWNhdGlvbl9lcnJvci5kYXJ0JzsKK3BhcnQgJ3NyYy90X2Jhc2UuZGFydCc7CitwYXJ0ICdzcmMvdF9lcnJvci5kYXJ0JzsKK3BhcnQgJ3NyYy90X3Byb2Nlc3Nvci5kYXJ0JzsKKworcGFydCAnc3JjL3Byb3RvY29sL3RfYmluYXJ5X3Byb3RvY29sLmRhcnQnOworcGFydCAnc3JjL3Byb3RvY29sL3RfY29tcGFjdF9wcm90b2NvbC5kYXJ0JzsKK3BhcnQgJ3NyYy9wcm90b2NvbC90X2ZpZWxkLmRhcnQnOworcGFydCAnc3JjL3Byb3RvY29sL3RfanNvbl9wcm90b2NvbC5kYXJ0JzsKK3BhcnQgJ3NyYy9wcm90b2NvbC90X2xpc3QuZGFydCc7CitwYXJ0ICdzcmMvcHJvdG9jb2wvdF9tYXAuZGFydCc7CitwYXJ0ICdzcmMvcHJvdG9jb2wvdF9tZXNzYWdlLmRhcnQnOworcGFydCAnc3JjL3Byb3RvY29sL3RfbXVsdGlwbGV4ZWRfcHJvdG9jb2wuZGFydCc7CitwYXJ0ICdzcmMvcHJvdG9jb2wvdF9wcm90b2NvbC5kYXJ0JzsKK3BhcnQgJ3NyYy9wcm90b2NvbC90X3Byb3RvY29sX2RlY29yYXRvci5kYXJ0JzsKK3BhcnQgJ3NyYy9wcm90b2NvbC90X3Byb3RvY29sX2Vycm9yLmRhcnQnOworcGFydCAnc3JjL3Byb3RvY29sL3RfcHJvdG9jb2xfZmFjdG9yeS5kYXJ0JzsKK3BhcnQgJ3NyYy9wcm90b2NvbC90X3Byb3RvY29sX3V0aWwuZGFydCc7CitwYXJ0ICdzcmMvcHJvdG9jb2wvdF9zZXQuZGFydCc7CitwYXJ0ICdzcmMvcHJvdG9jb2wvdF9zdHJ1Y3QuZGFydCc7CitwYXJ0ICdzcmMvcHJvdG9jb2wvdF90eXBlLmRhcnQnOworCitwYXJ0ICdzcmMvc2VyaWFsaXplci90X2Rlc2VyaWFsaXplci5kYXJ0JzsKK3BhcnQgJ3NyYy9zZXJpYWxpemVyL3Rfc2VyaWFsaXplci5kYXJ0JzsKKworcGFydCAnc3JjL3RyYW5zcG9ydC90X2J1ZmZlcmVkX3RyYW5zcG9ydC5kYXJ0JzsKK3BhcnQgJ3NyYy90cmFuc3BvcnQvdF9mcmFtZWRfdHJhbnNwb3J0LmRhcnQnOworcGFydCAnc3JjL3RyYW5zcG9ydC90X2h0dHBfdHJhbnNwb3J0LmRhcnQnOworcGFydCAnc3JjL3RyYW5zcG9ydC90X21lc3NhZ2VfcmVhZGVyLmRhcnQnOworcGFydCAnc3JjL3RyYW5zcG9ydC90X3NvY2tldC5kYXJ0JzsKK3BhcnQgJ3NyYy90cmFuc3BvcnQvdF90cmFuc3BvcnQuZGFydCc7CitwYXJ0ICdzcmMvdHJhbnNwb3J0L3RfdHJhbnNwb3J0X2Vycm9yLmRhcnQnOworcGFydCAnc3JjL3RyYW5zcG9ydC90X3RyYW5zcG9ydF9mYWN0b3J5LmRhcnQnOworcGFydCAnc3JjL3RyYW5zcG9ydC90X3NvY2tldF90cmFuc3BvcnQuZGFydCc7CmRpZmYgLS1naXQgYS9saWIvZGFydC9saWIvdGhyaWZ0X2Jyb3dzZXIuZGFydCBiL2xpYi9kYXJ0L2xpYi90aHJpZnRfYnJvd3Nlci5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlYmMyNTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvdGhyaWZ0X2Jyb3dzZXIuZGFydApAQCAtMCwwICsxLDIyIEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworbGlicmFyeSB0aHJpZnRfYnJvd3NlcjsKKworLy8vIENsYXNzZXMgdGhhdCBhcmUgb25seSBzdXBwb3J0ZWQgaW4gYnJvd3NlciBhcHBsaWNhdGlvbnMgZ28gaGVyZQorCitleHBvcnQgJ3NyYy9icm93c2VyL3Rfd2ViX3NvY2tldC5kYXJ0JyBzaG93IFRXZWJTb2NrZXQ7CmRpZmYgLS1naXQgYS9saWIvZGFydC9saWIvdGhyaWZ0X2NvbnNvbGUuZGFydCBiL2xpYi9kYXJ0L2xpYi90aHJpZnRfY29uc29sZS5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4YTgzZDEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvdGhyaWZ0X2NvbnNvbGUuZGFydApAQCAtMCwwICsxLDIzIEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworbGlicmFyeSB0aHJpZnRfY29uc29sZTsKKworLy8vIENsYXNzZXMgdGhhdCBhcmUgb25seSBzdXBwb3J0ZWQgaW4gY29uc29sZSBhcHBsaWNhdGlvbnMgZ28gaGVyZQorCitleHBvcnQgJ3NyYy9jb25zb2xlL3RfdGNwX3NvY2tldC5kYXJ0JyBzaG93IFRUY3BTb2NrZXQ7CitleHBvcnQgJ3NyYy9jb25zb2xlL3Rfd2ViX3NvY2tldC5kYXJ0JyBzaG93IFRXZWJTb2NrZXQ7CmRpZmYgLS1naXQgYS9saWIvZGFydC9wdWJzcGVjLnlhbWwgYi9saWIvZGFydC9wdWJzcGVjLnlhbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRjNGEwZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L3B1YnNwZWMueWFtbApAQCAtMCwwICsxLDQzIEBACisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgJ0xpY2Vuc2UnKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgJ0FTIElTJyBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK25hbWU6IHRocmlmdAordmVyc2lvbjogMS4wLjAKK2Rlc2NyaXB0aW9uOiA+CisgIEEgRGFydCBsaWJyYXJ5IGZvciBBcGFjaGUgVGhyaWZ0CithdXRob3I6IEFwYWNoZSBUaHJpZnQgRGV2ZWxvcGVycyA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPgoraG9tZXBhZ2U6IGh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZworZG9jdW1lbnRhdGlvbjogaHR0cDovL3RocmlmdC5hcGFjaGUub3JnCisKK2Vudmlyb25tZW50OgorICBzZGs6ICI+PTEuMTMuMCA8Mi4wLjAiCisKK2RlcGVuZGVuY2llczoKKyAgZml4bnVtOiBeMC4xMC4yCisgIGh0dHA6IF4wLjExLjMKKyAgbG9nZ2luZzogXjAuMTEuMAorCitkZXZfZGVwZW5kZW5jaWVzOgorICAjIHRlc3QKKyAgbW9ja2l0bzogXjEuMC4wCisgIHRlc3Q6IF4wLjEyLjAKKworICAjIGRhcnRfZGV2IC0gaHR0cHM6Ly9naXRodWIuY29tL1dvcmtpdmEvZGFydF9kZXYKKyAgZGFydF9kZXY6IF4xLjUuMAorICBjb3ZlcmFnZTogXjAuNy4zCisgIGRhcnRfc3R5bGU6ICI+PTAuMi40IDwwLjMuMCIKKyAgZGFydGRvYzogXjAuOS4wCmRpZmYgLS1naXQgYS9saWIvZGFydC90ZXN0L3Byb3RvY29sL3RfcHJvdG9jb2xfdGVzdC5kYXJ0IGIvbGliL2RhcnQvdGVzdC9wcm90b2NvbC90X3Byb3RvY29sX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTZjZGU1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvdGVzdC9wcm90b2NvbC90X3Byb3RvY29sX3Rlc3QuZGFydApAQCAtMCwwICsxLDQwNiBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworbGlicmFyeSB0aHJpZnQudGVzdC50cmFuc3BvcnQudF9qc29uX3Byb3RvY29sX3Rlc3Q7CisKK2ltcG9ydCAnZGFydDphc3luYyc7CitpbXBvcnQgJ2RhcnQ6Y29udmVydCcgc2hvdyBVVEY4OworaW1wb3J0ICdkYXJ0OnR5cGVkX2RhdGEnIHNob3cgVWludDhMaXN0OworCitpbXBvcnQgJ3BhY2thZ2U6dGVzdC90ZXN0LmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOnRocmlmdC90aHJpZnQuZGFydCc7CisKK3ZvaWQgbWFpbigpIHsKKyAgZmluYWwgbWVzc2FnZSA9IG5ldyBUTWVzc2FnZSgnbXkgbWVzc2FnZScsIFRNZXNzYWdlVHlwZS5PTkVXQVksIDEyMyk7CisKKyAgVFByb3RvY29sIHByb3RvY29sOworCisgIFByaW1pdGl2ZSBnZXRQcmltaXRpdmUoaW50IHRUeXBlKSB7CisgICAgc3dpdGNoICh0VHlwZSkgeworICAgICAgY2FzZSBUVHlwZS5CT09MOgorICAgICAgICByZXR1cm4gbmV3IFByaW1pdGl2ZShwcm90b2NvbC5yZWFkQm9vbCwgcHJvdG9jb2wud3JpdGVCb29sLCBmYWxzZSk7CisKKyAgICAgIGNhc2UgVFR5cGUuQllURToKKyAgICAgICAgcmV0dXJuIG5ldyBQcmltaXRpdmUocHJvdG9jb2wucmVhZEJ5dGUsIHByb3RvY29sLndyaXRlQnl0ZSwgMCk7CisKKyAgICAgIGNhc2UgVFR5cGUuSTE2OgorICAgICAgICByZXR1cm4gbmV3IFByaW1pdGl2ZShwcm90b2NvbC5yZWFkSTE2LCBwcm90b2NvbC53cml0ZUkxNiwgMCk7CisKKyAgICAgIGNhc2UgVFR5cGUuSTMyOgorICAgICAgICByZXR1cm4gbmV3IFByaW1pdGl2ZShwcm90b2NvbC5yZWFkSTMyLCBwcm90b2NvbC53cml0ZUkzMiwgMCk7CisKKyAgICAgIGNhc2UgVFR5cGUuSTY0OgorICAgICAgICByZXR1cm4gbmV3IFByaW1pdGl2ZShwcm90b2NvbC5yZWFkSTY0LCBwcm90b2NvbC53cml0ZUk2NCwgMCk7CisKKyAgICAgIGNhc2UgVFR5cGUuRE9VQkxFOgorICAgICAgICByZXR1cm4gbmV3IFByaW1pdGl2ZShwcm90b2NvbC5yZWFkRG91YmxlLCBwcm90b2NvbC53cml0ZURvdWJsZSwgMCk7CisKKyAgICAgIGNhc2UgVFR5cGUuU1RSSU5HOgorICAgICAgICByZXR1cm4gbmV3IFByaW1pdGl2ZShwcm90b2NvbC5yZWFkU3RyaW5nLCBwcm90b2NvbC53cml0ZVN0cmluZywgJycpOworCisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiVW5zdXBwb3J0ZWQgVFR5cGUgJHRUeXBlIik7CisgICAgfQorICB9CisKKyAgRnV0dXJlIHByaW1pdGl2ZVRlc3QoUHJpbWl0aXZlIHByaW1pdGl2ZSwgaW5wdXQpIGFzeW5jIHsKKyAgICBwcmltaXRpdmUud3JpdGUoaW5wdXQpOworICAgIHByb3RvY29sLndyaXRlTWVzc2FnZUVuZCgpOworCisgICAgYXdhaXQgcHJvdG9jb2wudHJhbnNwb3J0LmZsdXNoKCk7CisKKyAgICBwcm90b2NvbC5yZWFkTWVzc2FnZUJlZ2luKCk7CisgICAgdmFyIG91dHB1dCA9IHByaW1pdGl2ZS5yZWFkKCk7CisKKyAgICBleHBlY3Qob3V0cHV0LCBpbnB1dCk7CisgIH0KKworICBGdXR1cmUgcHJpbWl0aXZlTnVsbFRlc3QoUHJpbWl0aXZlIHByaW1pdGl2ZSkgYXN5bmMgeworICAgIHByaW1pdGl2ZS53cml0ZShudWxsKTsKKyAgICBwcm90b2NvbC53cml0ZU1lc3NhZ2VFbmQoKTsKKworICAgIGF3YWl0IHByb3RvY29sLnRyYW5zcG9ydC5mbHVzaCgpOworCisgICAgcHJvdG9jb2wucmVhZE1lc3NhZ2VCZWdpbigpOworICAgIHZhciBvdXRwdXQgPSBwcmltaXRpdmUucmVhZCgpOworCisgICAgZXhwZWN0KG91dHB1dCwgcHJpbWl0aXZlLmRlZmF1bHRWYWx1ZSk7CisgIH0KKworICB2YXIgc2hhcmVkVGVzdHMgPSAoKSB7CisgICAgdGVzdCgnVGVzdCBtZXNzYWdlJywgKCkgYXN5bmMgeworICAgICAgcHJvdG9jb2wud3JpdGVNZXNzYWdlRW5kKCk7CisKKyAgICAgIGF3YWl0IHByb3RvY29sLnRyYW5zcG9ydC5mbHVzaCgpOworCisgICAgICB2YXIgc3ViamVjdCA9IHByb3RvY29sLnJlYWRNZXNzYWdlQmVnaW4oKTsKKworICAgICAgZXhwZWN0KHN1YmplY3QubmFtZSwgbWVzc2FnZS5uYW1lKTsKKyAgICAgIGV4cGVjdChzdWJqZWN0LnR5cGUsIG1lc3NhZ2UudHlwZSk7CisgICAgICBleHBlY3Qoc3ViamVjdC5zZXFpZCwgbWVzc2FnZS5zZXFpZCk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdUZXN0IHN0cnVjdCcsICgpIGFzeW5jIHsKKyAgICAgIHZhciBpbnB1dCA9IG5ldyBUU3RydWN0KCk7CisKKyAgICAgIHByb3RvY29sLndyaXRlU3RydWN0QmVnaW4oaW5wdXQpOworICAgICAgcHJvdG9jb2wud3JpdGVTdHJ1Y3RFbmQoKTsKKyAgICAgIHByb3RvY29sLndyaXRlTWVzc2FnZUVuZCgpOworCisgICAgICBhd2FpdCBwcm90b2NvbC50cmFuc3BvcnQuZmx1c2goKTsKKworICAgICAgcHJvdG9jb2wucmVhZE1lc3NhZ2VCZWdpbigpOworICAgICAgdmFyIG91dHB1dCA9IHByb3RvY29sLnJlYWRTdHJ1Y3RCZWdpbigpOworCisgICAgICAvLyBuYW1lIGlzIG5vdCBzZXJpYWxpemVkLCBzZWUgQyMgdmVyc2lvbiBmb3IgcmVmZXJlbmNlCisgICAgICBleHBlY3Qob3V0cHV0LCBpc05vdE51bGwpOworICAgIH0pOworCisgICAgdGVzdCgnVGVzdCBmaWVsZCcsICgpIGFzeW5jIHsKKyAgICAgIHZhciBpbnB1dCA9IG5ldyBURmllbGQoJ215IGZpZWxkJywgVFR5cGUuTUFQLCAxMjMpOworCisgICAgICBwcm90b2NvbC53cml0ZUZpZWxkQmVnaW4oaW5wdXQpOworICAgICAgcHJvdG9jb2wud3JpdGVGaWVsZEVuZCgpOworICAgICAgcHJvdG9jb2wud3JpdGVNZXNzYWdlRW5kKCk7CisKKyAgICAgIGF3YWl0IHByb3RvY29sLnRyYW5zcG9ydC5mbHVzaCgpOworCisgICAgICBwcm90b2NvbC5yZWFkTWVzc2FnZUJlZ2luKCk7CisgICAgICB2YXIgb3V0cHV0ID0gcHJvdG9jb2wucmVhZEZpZWxkQmVnaW4oKTsKKworICAgICAgLy8gbmFtZSBpcyBub3Qgc2VyaWFsaXplZCwgc2VlIEMjIHZlcnNpb24gZm9yIHJlZmVyZW5jZQorICAgICAgZXhwZWN0KG91dHB1dC50eXBlLCBpbnB1dC50eXBlKTsKKyAgICAgIGV4cGVjdChvdXRwdXQuaWQsIGlucHV0LmlkKTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1Rlc3QgbWFwJywgKCkgYXN5bmMgeworICAgICAgdmFyIGlucHV0ID0gbmV3IFRNYXAoVFR5cGUuU1RSSU5HLCBUVHlwZS5TVFJVQ1QsIDEyMyk7CisKKyAgICAgIHByb3RvY29sLndyaXRlTWFwQmVnaW4oaW5wdXQpOworICAgICAgcHJvdG9jb2wud3JpdGVNYXBFbmQoKTsKKyAgICAgIHByb3RvY29sLndyaXRlTWVzc2FnZUVuZCgpOworCisgICAgICBhd2FpdCBwcm90b2NvbC50cmFuc3BvcnQuZmx1c2goKTsKKworICAgICAgcHJvdG9jb2wucmVhZE1lc3NhZ2VCZWdpbigpOworICAgICAgdmFyIG91dHB1dCA9IHByb3RvY29sLnJlYWRNYXBCZWdpbigpOworCisgICAgICBleHBlY3Qob3V0cHV0LmtleVR5cGUsIGlucHV0LmtleVR5cGUpOworICAgICAgZXhwZWN0KG91dHB1dC52YWx1ZVR5cGUsIGlucHV0LnZhbHVlVHlwZSk7CisgICAgICBleHBlY3Qob3V0cHV0Lmxlbmd0aCwgaW5wdXQubGVuZ3RoKTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1Rlc3QgbGlzdCcsICgpIGFzeW5jIHsKKyAgICAgIHZhciBpbnB1dCA9IG5ldyBUTGlzdChUVHlwZS5TVFJJTkcsIDEyMyk7CisKKyAgICAgIHByb3RvY29sLndyaXRlTGlzdEJlZ2luKGlucHV0KTsKKyAgICAgIHByb3RvY29sLndyaXRlTGlzdEVuZCgpOworICAgICAgcHJvdG9jb2wud3JpdGVNZXNzYWdlRW5kKCk7CisKKyAgICAgIGF3YWl0IHByb3RvY29sLnRyYW5zcG9ydC5mbHVzaCgpOworCisgICAgICBwcm90b2NvbC5yZWFkTWVzc2FnZUJlZ2luKCk7CisgICAgICB2YXIgb3V0cHV0ID0gcHJvdG9jb2wucmVhZExpc3RCZWdpbigpOworCisgICAgICBleHBlY3Qob3V0cHV0LmVsZW1lbnRUeXBlLCBpbnB1dC5lbGVtZW50VHlwZSk7CisgICAgICBleHBlY3Qob3V0cHV0Lmxlbmd0aCwgaW5wdXQubGVuZ3RoKTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1Rlc3Qgc2V0JywgKCkgYXN5bmMgeworICAgICAgdmFyIGlucHV0ID0gbmV3IFRTZXQoVFR5cGUuU1RSSU5HLCAxMjMpOworCisgICAgICBwcm90b2NvbC53cml0ZVNldEJlZ2luKGlucHV0KTsKKyAgICAgIHByb3RvY29sLndyaXRlU2V0RW5kKCk7CisgICAgICBwcm90b2NvbC53cml0ZU1lc3NhZ2VFbmQoKTsKKworICAgICAgYXdhaXQgcHJvdG9jb2wudHJhbnNwb3J0LmZsdXNoKCk7CisKKyAgICAgIHByb3RvY29sLnJlYWRNZXNzYWdlQmVnaW4oKTsKKyAgICAgIHZhciBvdXRwdXQgPSBwcm90b2NvbC5yZWFkTGlzdEJlZ2luKCk7CisKKyAgICAgIGV4cGVjdChvdXRwdXQuZWxlbWVudFR5cGUsIGlucHV0LmVsZW1lbnRUeXBlKTsKKyAgICAgIGV4cGVjdChvdXRwdXQubGVuZ3RoLCBpbnB1dC5sZW5ndGgpOworICAgIH0pOworCisgICAgdGVzdCgnVGVzdCBib29sJywgKCkgYXN5bmMgeworICAgICAgYXdhaXQgcHJpbWl0aXZlVGVzdChnZXRQcmltaXRpdmUoVFR5cGUuQk9PTCksIHRydWUpOworICAgIH0pOworCisgICAgdGVzdCgnVGVzdCBib29sIG51bGwnLCAoKSBhc3luYyB7CisgICAgICBhd2FpdCBwcmltaXRpdmVOdWxsVGVzdChnZXRQcmltaXRpdmUoVFR5cGUuQk9PTCkpOworICAgIH0pOworCisgICAgdGVzdCgnVGVzdCBieXRlJywgKCkgYXN5bmMgeworICAgICAgYXdhaXQgcHJpbWl0aXZlVGVzdChnZXRQcmltaXRpdmUoVFR5cGUuQllURSksIDY0KTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1Rlc3QgYnl0ZSBudWxsJywgKCkgYXN5bmMgeworICAgICAgYXdhaXQgcHJpbWl0aXZlTnVsbFRlc3QoZ2V0UHJpbWl0aXZlKFRUeXBlLkJZVEUpKTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1Rlc3QgSTE2JywgKCkgYXN5bmMgeworICAgICAgYXdhaXQgcHJpbWl0aXZlVGVzdChnZXRQcmltaXRpdmUoVFR5cGUuSTE2KSwgMzI3NjcpOworICAgIH0pOworCisgICAgdGVzdCgnVGVzdCBJMTYgbnVsbCcsICgpIGFzeW5jIHsKKyAgICAgIGF3YWl0IHByaW1pdGl2ZU51bGxUZXN0KGdldFByaW1pdGl2ZShUVHlwZS5JMTYpKTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1Rlc3QgSTMyJywgKCkgYXN5bmMgeworICAgICAgYXdhaXQgcHJpbWl0aXZlVGVzdChnZXRQcmltaXRpdmUoVFR5cGUuSTMyKSwgMjE0NzQ4MzY0Nyk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdUZXN0IEkzMiBudWxsJywgKCkgYXN5bmMgeworICAgICAgYXdhaXQgcHJpbWl0aXZlTnVsbFRlc3QoZ2V0UHJpbWl0aXZlKFRUeXBlLkkzMikpOworICAgIH0pOworCisgICAgdGVzdCgnVGVzdCBJNjQnLCAoKSBhc3luYyB7CisgICAgICBhd2FpdCBwcmltaXRpdmVUZXN0KGdldFByaW1pdGl2ZShUVHlwZS5JNjQpLCA5MjIzMzcyMDM2ODU0Nzc1ODA3KTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1Rlc3QgSTY0IG51bGwnLCAoKSBhc3luYyB7CisgICAgICBhd2FpdCBwcmltaXRpdmVOdWxsVGVzdChnZXRQcmltaXRpdmUoVFR5cGUuSTY0KSk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdUZXN0IGRvdWJsZScsICgpIGFzeW5jIHsKKyAgICAgIGF3YWl0IHByaW1pdGl2ZVRlc3QoZ2V0UHJpbWl0aXZlKFRUeXBlLkRPVUJMRSksIDMuMTQxNTkyNik7CisgICAgfSk7CisKKyAgICB0ZXN0KCdUZXN0IGRvdWJsZSBudWxsJywgKCkgYXN5bmMgeworICAgICAgYXdhaXQgcHJpbWl0aXZlTnVsbFRlc3QoZ2V0UHJpbWl0aXZlKFRUeXBlLkRPVUJMRSkpOworICAgIH0pOworCisgICAgdGVzdCgnVGVzdCBzdHJpbmcnLCAoKSBhc3luYyB7CisgICAgICB2YXIgaW5wdXQgPSAnVGhlcmUgYXJlIG9ubHkgdHdvIGhhcmQgdGhpbmdzIGluIGNvbXB1dGVyIHNjaWVuY2U6ICcKKyAgICAgICAgICAnY2FjaGUgaW52YWxpZGF0aW9uLCBuYW1pbmcgdGhpbmdzLCBhbmQgb2ZmLWJ5LW9uZSBlcnJvcnMuJzsKKyAgICAgIGF3YWl0IHByaW1pdGl2ZVRlc3QoZ2V0UHJpbWl0aXZlKFRUeXBlLlNUUklORyksIGlucHV0KTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1Rlc3Qgc3RyaW5nIG51bGwnLCAoKSBhc3luYyB7CisgICAgICBhd2FpdCBwcmltaXRpdmVOdWxsVGVzdChnZXRQcmltaXRpdmUoVFR5cGUuU1RSSU5HKSk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdUZXN0IGJpbmFyeScsICgpIGFzeW5jIHsKKyAgICAgIHZhciBpbnB1dCA9IG5ldyBVaW50OExpc3QuZnJvbUxpc3QobmV3IExpc3QuZmlsbGVkKDEwMCwgMTIzKSk7CisKKyAgICAgIHByb3RvY29sLndyaXRlQmluYXJ5KGlucHV0KTsKKyAgICAgIHByb3RvY29sLndyaXRlTWVzc2FnZUVuZCgpOworCisgICAgICBhd2FpdCBwcm90b2NvbC50cmFuc3BvcnQuZmx1c2goKTsKKworICAgICAgcHJvdG9jb2wucmVhZE1lc3NhZ2VCZWdpbigpOworICAgICAgdmFyIG91dHB1dCA9IHByb3RvY29sLnJlYWRCaW5hcnkoKTsKKworICAgICAgZXhwZWN0KG91dHB1dC5sZW5ndGgsIGlucHV0Lmxlbmd0aCk7CisgICAgICBleHBlY3Qob3V0cHV0LmV2ZXJ5KChpKSA9PiBpID09IDEyMyksIGlzVHJ1ZSk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdUZXN0IGNvbXBsZXggc3RydWN0JywgKCkgYXN5bmMgeworICAgICAgLy8gezE6IHsxMDogMjB9LCAyOiB7MzA6IDQwfX0KKyAgICAgIHByb3RvY29sLndyaXRlU3RydWN0QmVnaW4obmV3IFRTdHJ1Y3QoKSk7CisgICAgICBwcm90b2NvbC53cml0ZUZpZWxkQmVnaW4obmV3IFRGaWVsZCgnc3VjY2VzcycsIFRUeXBlLk1BUCwgMCkpOworICAgICAgcHJvdG9jb2wud3JpdGVNYXBCZWdpbihuZXcgVE1hcChUVHlwZS5JMzIsIFRUeXBlLk1BUCwgMikpOworCisgICAgICBwcm90b2NvbC53cml0ZUkzMigxKTsgLy8ga2V5CisgICAgICBwcm90b2NvbC53cml0ZU1hcEJlZ2luKG5ldyBUTWFwKFRUeXBlLkkzMiwgVFR5cGUuSTMyLCAxKSk7CisgICAgICBwcm90b2NvbC53cml0ZUkzMigxMCk7IC8vIGtleQorICAgICAgcHJvdG9jb2wud3JpdGVJMzIoMjApOyAvLyB2YWx1ZQorICAgICAgcHJvdG9jb2wud3JpdGVNYXBFbmQoKTsKKworICAgICAgcHJvdG9jb2wud3JpdGVJMzIoMik7IC8vIGtleQorICAgICAgcHJvdG9jb2wud3JpdGVNYXBCZWdpbihuZXcgVE1hcChUVHlwZS5JMzIsIFRUeXBlLkkzMiwgMSkpOworICAgICAgcHJvdG9jb2wud3JpdGVJMzIoMzApOyAvLyBrZXkKKyAgICAgIHByb3RvY29sLndyaXRlSTMyKDQwKTsgLy8gdmFsdWUKKyAgICAgIHByb3RvY29sLndyaXRlTWFwRW5kKCk7CisKKyAgICAgIHByb3RvY29sLndyaXRlTWFwRW5kKCk7CisgICAgICBwcm90b2NvbC53cml0ZUZpZWxkRW5kKCk7CisgICAgICBwcm90b2NvbC53cml0ZUZpZWxkU3RvcCgpOworICAgICAgcHJvdG9jb2wud3JpdGVTdHJ1Y3RFbmQoKTsKKyAgICAgIHByb3RvY29sLndyaXRlTWVzc2FnZUVuZCgpOworCisgICAgICBhd2FpdCBwcm90b2NvbC50cmFuc3BvcnQuZmx1c2goKTsKKworICAgICAgcHJvdG9jb2wucmVhZE1lc3NhZ2VCZWdpbigpOworICAgICAgcHJvdG9jb2wucmVhZFN0cnVjdEJlZ2luKCk7CisgICAgICBleHBlY3QocHJvdG9jb2wucmVhZEZpZWxkQmVnaW4oKS50eXBlLCBUVHlwZS5NQVApOworICAgICAgZXhwZWN0KHByb3RvY29sLnJlYWRNYXBCZWdpbigpLmxlbmd0aCwgMik7CisKKyAgICAgIGV4cGVjdChwcm90b2NvbC5yZWFkSTMyKCksIDEpOyAvLyBrZXkKKyAgICAgIGV4cGVjdChwcm90b2NvbC5yZWFkTWFwQmVnaW4oKS5sZW5ndGgsIDEpOworICAgICAgZXhwZWN0KHByb3RvY29sLnJlYWRJMzIoKSwgMTApOyAvLyBrZXkKKyAgICAgIGV4cGVjdChwcm90b2NvbC5yZWFkSTMyKCksIDIwKTsgLy8gdmFsdWUKKyAgICAgIHByb3RvY29sLnJlYWRNYXBFbmQoKTsKKworICAgICAgZXhwZWN0KHByb3RvY29sLnJlYWRJMzIoKSwgMik7IC8vIGtleQorICAgICAgZXhwZWN0KHByb3RvY29sLnJlYWRNYXBCZWdpbigpLmxlbmd0aCwgMSk7CisgICAgICBleHBlY3QocHJvdG9jb2wucmVhZEkzMigpLCAzMCk7IC8vIGtleQorICAgICAgZXhwZWN0KHByb3RvY29sLnJlYWRJMzIoKSwgNDApOyAvLyB2YWx1ZQorICAgICAgcHJvdG9jb2wucmVhZE1hcEVuZCgpOworCisgICAgICBwcm90b2NvbC5yZWFkTWFwRW5kKCk7CisgICAgICBwcm90b2NvbC5yZWFkRmllbGRFbmQoKTsKKyAgICAgIHByb3RvY29sLnJlYWRTdHJ1Y3RFbmQoKTsKKyAgICAgIHByb3RvY29sLnJlYWRNZXNzYWdlRW5kKCk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdUZXN0IG5lc3RlZCBtYXBzIGFuZCBsaXN0cycsICgpIGFzeW5jIHsKKyAgICAgIC8vIHsxOiBbezEwOiAyMH1dLCAyOiBbezMwOiA0MH1dfQorICAgICAgcHJvdG9jb2wud3JpdGVNYXBCZWdpbihuZXcgVE1hcChUVHlwZS5JMzIsIFRUeXBlLkxJU1QsIDIpKTsKKworICAgICAgcHJvdG9jb2wud3JpdGVJMzIoMSk7IC8vIGtleQorICAgICAgcHJvdG9jb2wud3JpdGVMaXN0QmVnaW4obmV3IFRMaXN0KFRUeXBlLk1BUCwgMSkpOworICAgICAgcHJvdG9jb2wud3JpdGVNYXBCZWdpbihuZXcgVE1hcChUVHlwZS5JMzIsIFRUeXBlLkkzMiwgMSkpOworICAgICAgcHJvdG9jb2wud3JpdGVJMzIoMTApOyAvLyBrZXkKKyAgICAgIHByb3RvY29sLndyaXRlSTMyKDIwKTsgLy8gdmFsdWUKKyAgICAgIHByb3RvY29sLndyaXRlTWFwRW5kKCk7CisgICAgICBwcm90b2NvbC53cml0ZUxpc3RFbmQoKTsKKworICAgICAgcHJvdG9jb2wud3JpdGVJMzIoMik7IC8vIGtleQorICAgICAgcHJvdG9jb2wud3JpdGVMaXN0QmVnaW4obmV3IFRMaXN0KFRUeXBlLk1BUCwgMSkpOworICAgICAgcHJvdG9jb2wud3JpdGVNYXBCZWdpbihuZXcgVE1hcChUVHlwZS5JMzIsIFRUeXBlLkkzMiwgMSkpOworICAgICAgcHJvdG9jb2wud3JpdGVJMzIoMzApOyAvLyBrZXkKKyAgICAgIHByb3RvY29sLndyaXRlSTMyKDQwKTsgLy8gdmFsdWUKKyAgICAgIHByb3RvY29sLndyaXRlTWFwRW5kKCk7CisgICAgICBwcm90b2NvbC53cml0ZUxpc3RFbmQoKTsKKworICAgICAgcHJvdG9jb2wud3JpdGVNYXBFbmQoKTsKKyAgICAgIHByb3RvY29sLndyaXRlTWVzc2FnZUVuZCgpOworCisgICAgICBhd2FpdCBwcm90b2NvbC50cmFuc3BvcnQuZmx1c2goKTsKKworICAgICAgcHJvdG9jb2wucmVhZE1lc3NhZ2VCZWdpbigpOworICAgICAgZXhwZWN0KHByb3RvY29sLnJlYWRNYXBCZWdpbigpLmxlbmd0aCwgMik7CisKKyAgICAgIGV4cGVjdChwcm90b2NvbC5yZWFkSTMyKCksIDEpOyAvLyBrZXkKKyAgICAgIGV4cGVjdChwcm90b2NvbC5yZWFkTGlzdEJlZ2luKCkubGVuZ3RoLCAxKTsKKyAgICAgIGV4cGVjdChwcm90b2NvbC5yZWFkTWFwQmVnaW4oKS5sZW5ndGgsIDEpOworICAgICAgZXhwZWN0KHByb3RvY29sLnJlYWRJMzIoKSwgMTApOyAvLyBrZXkKKyAgICAgIGV4cGVjdChwcm90b2NvbC5yZWFkSTMyKCksIDIwKTsgLy8gdmFsdWUKKyAgICAgIHByb3RvY29sLnJlYWRNYXBFbmQoKTsKKyAgICAgIHByb3RvY29sLnJlYWRMaXN0RW5kKCk7CisKKyAgICAgIGV4cGVjdChwcm90b2NvbC5yZWFkSTMyKCksIDIpOyAvLyBrZXkKKyAgICAgIGV4cGVjdChwcm90b2NvbC5yZWFkTGlzdEJlZ2luKCkubGVuZ3RoLCAxKTsKKyAgICAgIGV4cGVjdChwcm90b2NvbC5yZWFkTWFwQmVnaW4oKS5sZW5ndGgsIDEpOworICAgICAgZXhwZWN0KHByb3RvY29sLnJlYWRJMzIoKSwgMzApOyAvLyBrZXkKKyAgICAgIGV4cGVjdChwcm90b2NvbC5yZWFkSTMyKCksIDQwKTsgLy8gdmFsdWUKKyAgICAgIHByb3RvY29sLnJlYWRNYXBFbmQoKTsKKyAgICAgIHByb3RvY29sLnJlYWRMaXN0RW5kKCk7CisKKyAgICAgIHByb3RvY29sLnJlYWRNYXBFbmQoKTsKKyAgICAgIHByb3RvY29sLnJlYWRNZXNzYWdlRW5kKCk7CisgICAgfSk7CisgIH07CisKKyAgZ3JvdXAoJ0pTT04nLCAoKSB7CisgICAgc2V0VXAoKCkgeworICAgICAgcHJvdG9jb2wgPSBuZXcgVEpzb25Qcm90b2NvbChuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KCkpOworICAgICAgcHJvdG9jb2wud3JpdGVNZXNzYWdlQmVnaW4obWVzc2FnZSk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdUZXN0IGVzY2FwZWQgdW5pY29kZScsICgpIGFzeW5jIHsKKyAgICAgIC8qCisgICAgICAgICBLT1JfS0FJCisgICAgICAgICAgIFVURi04OiAgMHhFMCAweEI4IDB4ODEKKyAgICAgICAgICAgVVRGLTE2OiAweDBFMDEKKyAgICAgICAgIEcgY2xlZjoKKyAgICAgICAgICAgVVRGLTg6ICAweEYwIDB4OUQgMHg4NCAweDlFCisgICAgICAgICAgIFVURi0xNjogMHhEODM0IDB4REQxRQorICAgICAgICovCisgICAgICB2YXIgYnVmZmVyID0gVVRGOC5lbmNvZGUociciXHUwMDAxXHUwZTAxIFx1ZDgzNFx1ZGQxZSInKTsKKyAgICAgIHZhciB0cmFuc3BvcnQgPSBuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KCk7CisgICAgICB0cmFuc3BvcnQud3JpdGVBbGwoYnVmZmVyKTsKKworICAgICAgdmFyIHByb3RvY29sID0gbmV3IFRKc29uUHJvdG9jb2wodHJhbnNwb3J0KTsKKworICAgICAgYXdhaXQgcHJvdG9jb2wudHJhbnNwb3J0LmZsdXNoKCk7CisKKyAgICAgIHZhciBzdWJqZWN0ID0gcHJvdG9jb2wucmVhZFN0cmluZygpOworICAgICAgZXhwZWN0KHN1YmplY3QsCisgICAgICAgICAgVVRGOC5kZWNvZGUoWzB4MDEsIDB4RTAsIDB4QjgsIDB4ODEsIDB4MjAsIDB4RjAsIDB4OUQsIDB4ODQsIDB4OUVdKSk7CisgICAgfSk7CisKKyAgICBncm91cCgnc2hhcmVkIHRlc3RzJywgc2hhcmVkVGVzdHMpOworICB9KTsKKworICBncm91cCgnYmluYXJ5JywgKCkgeworICAgIHNldFVwKCgpIHsKKyAgICAgIHByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbChuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KCkpOworICAgICAgcHJvdG9jb2wud3JpdGVNZXNzYWdlQmVnaW4obWVzc2FnZSk7CisgICAgfSk7CisKKyAgICBncm91cCgnc2hhcmVkIHRlc3RzJywgc2hhcmVkVGVzdHMpOworICB9KTsKKworICBncm91cCgnY29tcGFjdCcsICgpIHsKKyAgICBzZXRVcCgoKSB7CisgICAgICBwcm90b2NvbCA9IG5ldyBUQ29tcGFjdFByb3RvY29sKG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQoKSk7CisgICAgICBwcm90b2NvbC53cml0ZU1lc3NhZ2VCZWdpbihtZXNzYWdlKTsKKyAgICB9KTsKKworICAgIGdyb3VwKCdzaGFyZWQgdGVzdHMnLCBzaGFyZWRUZXN0cyk7CisgIH0pOworfQorCitjbGFzcyBQcmltaXRpdmUgeworICBmaW5hbCBGdW5jdGlvbiByZWFkOworICBmaW5hbCBGdW5jdGlvbiB3cml0ZTsKKyAgZmluYWwgZGVmYXVsdFZhbHVlOworCisgIFByaW1pdGl2ZSh0aGlzLnJlYWQsIHRoaXMud3JpdGUsIHRoaXMuZGVmYXVsdFZhbHVlKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L3Rlc3Qvc2VyaWFsaXplci9zZXJpYWxpemVyX3Rlc3QuZGFydCBiL2xpYi9kYXJ0L3Rlc3Qvc2VyaWFsaXplci9zZXJpYWxpemVyX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjc2NTAzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvdGVzdC9zZXJpYWxpemVyL3NlcmlhbGl6ZXJfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMTE5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2xpYnJhcnkgdGhyaWZ0LnRlc3Quc2VyaWFsaXplci5zZXJpYWxpemVyX3Rlc3Q7CisKK2ltcG9ydCAncGFja2FnZTp0ZXN0L3Rlc3QuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6dGhyaWZ0L3RocmlmdC5kYXJ0JzsKK2ltcG9ydCAnc2VyaWFsaXplcl90ZXN0X2RhdGEuZGFydCc7CisKK3ZvaWQgbWFpbigpIHsKKyAgdmFyIHNlcmlhbGl6ZXIgPSAoKSB7CisgICAgVERlc2VyaWFsaXplciBkZXNlcmlhbGl6ZXI7CisgICAgVFNlcmlhbGl6ZXIgc2VyaWFsaXplcjsKKyAgICBUZXN0VE9iamVjdCB0ZXN0VE9iamVjdDsKKworICAgIHNldFVwKCgpIHsKKyAgICAgIHNlcmlhbGl6ZXIgPSBuZXcgVFNlcmlhbGl6ZXIoKTsKKyAgICAgIGRlc2VyaWFsaXplciA9IG5ldyBURGVzZXJpYWxpemVyKCk7CisgICAgICAKKyAgICAgIHRlc3RUT2JqZWN0ID0gbmV3IFRlc3RUT2JqZWN0KCk7CisgICAgICB0ZXN0VE9iamVjdC5iID0gdHJ1ZTsKKyAgICAgIHRlc3RUT2JqZWN0LnMgPSAiVEVTVCI7CisgICAgICB0ZXN0VE9iamVjdC5kID0gMTUuMjU7CisgICAgICB0ZXN0VE9iamVjdC5pID0gMTA7CisgICAgICAKKyAgICAgIHZhciB0ZXN0TGlzdCA9IG5ldyBMaXN0PFN0cmluZz4oKTsKKyAgICAgIHRlc3RMaXN0LmFkZCgiVEVTVCAxIik7CisgICAgICB0ZXN0TGlzdC5hZGQoIlRFU1QgMiIpOworICAgICAgCisgICAgICB0ZXN0VE9iamVjdC5sID0gdGVzdExpc3Q7CisgICAgfSk7CisgICAgCisgICAgYXNzZXJ0TmV3T2JqZWN0RXF1YWxzVE9iamVjdChUZXN0VE9iamVjdCBuZXdPYmplY3QpIHsKKyAgICAgIGV4cGVjdChuZXdPYmplY3QubCwgZXF1YWxzKHRlc3RUT2JqZWN0LmwpKTsKKyAgICAgIGV4cGVjdChuZXdPYmplY3QuYiwgZXF1YWxzKHRlc3RUT2JqZWN0LmIpKTsKKyAgICAgIGV4cGVjdChuZXdPYmplY3QuaSwgZXF1YWxzKHRlc3RUT2JqZWN0LmkpKTsKKyAgICAgIGV4cGVjdChuZXdPYmplY3QuZCwgZXF1YWxzKHRlc3RUT2JqZWN0LmQpKTsKKyAgICAgIGV4cGVjdChuZXdPYmplY3QucywgZXF1YWxzKHRlc3RUT2JqZWN0LnMpKTsKKyAgICB9CisgICAgCisgICAgcnVuV3JpdGVTdHJpbmdUZXN0KCkgeworICAgICAgdmFyIHMgPSBzZXJpYWxpemVyLndyaXRlU3RyaW5nKHRlc3RUT2JqZWN0KTsKKworICAgICAgdmFyIG5ld09iamVjdCA9IG5ldyBUZXN0VE9iamVjdCgpOworICAgICAgZGVzZXJpYWxpemVyLnJlYWRTdHJpbmcobmV3T2JqZWN0LCBzKTsKKworICAgICAgYXNzZXJ0TmV3T2JqZWN0RXF1YWxzVE9iamVjdChuZXdPYmplY3QpOworICAgIH07CisKKyAgICBydW5Xcml0ZVRlc3QoKSB7CisgICAgICB2YXIgcyA9IHNlcmlhbGl6ZXIud3JpdGUodGVzdFRPYmplY3QpOworCisgICAgICB2YXIgbmV3T2JqZWN0ID0gbmV3IFRlc3RUT2JqZWN0KCk7CisgICAgICBkZXNlcmlhbGl6ZXIucmVhZChuZXdPYmplY3QsIHMpOworCisgICAgICBhc3NlcnROZXdPYmplY3RFcXVhbHNUT2JqZWN0KG5ld09iamVjdCk7CisgICAgfTsKKworICAgIHRlc3QoJ0pTT04gUHJvdG9jb2wgU3RyaW5nJywgKCkgeworICAgICAgc2VyaWFsaXplci5wcm90b2NvbCA9IG5ldyBUSnNvblByb3RvY29sKHNlcmlhbGl6ZXIudHJhbnNwb3J0KTsKKyAgICAgIGRlc2VyaWFsaXplci5wcm90b2NvbCA9IG5ldyBUSnNvblByb3RvY29sKGRlc2VyaWFsaXplci50cmFuc3BvcnQpOworICAgICAgCisgICAgICBydW5Xcml0ZVN0cmluZ1Rlc3QoKTsKKyAgICB9KTsKKworICAgIHRlc3QoJ0pTT04gUHJvdG9jb2wnLCAoKSB7CisgICAgICBzZXJpYWxpemVyLnByb3RvY29sID0gbmV3IFRKc29uUHJvdG9jb2woc2VyaWFsaXplci50cmFuc3BvcnQpOworICAgICAgZGVzZXJpYWxpemVyLnByb3RvY29sID0gbmV3IFRKc29uUHJvdG9jb2woZGVzZXJpYWxpemVyLnRyYW5zcG9ydCk7CisKKyAgICAgIHJ1bldyaXRlVGVzdCgpOworICAgIH0pOworCisgICAgdGVzdCgnQmluYXJ5IFByb3RvY29sIFN0cmluZycsICgpIHsKKyAgICAgIHNlcmlhbGl6ZXIucHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKHNlcmlhbGl6ZXIudHJhbnNwb3J0KTsKKyAgICAgIGRlc2VyaWFsaXplci5wcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2woZGVzZXJpYWxpemVyLnRyYW5zcG9ydCk7CisKKyAgICAgIHJ1bldyaXRlU3RyaW5nVGVzdCgpOworICAgIH0pOworCisgICAgdGVzdCgnQmluYXJ5IFByb3RvY29sJywgKCkgeworICAgICAgc2VyaWFsaXplci5wcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2woc2VyaWFsaXplci50cmFuc3BvcnQpOworICAgICAgZGVzZXJpYWxpemVyLnByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbChkZXNlcmlhbGl6ZXIudHJhbnNwb3J0KTsKKworICAgICAgcnVuV3JpdGVUZXN0KCk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdDb21wYWN0IFByb3RvY29sIFN0cmluZycsICgpIHsKKyAgICAgIHNlcmlhbGl6ZXIucHJvdG9jb2wgPSBuZXcgVENvbXBhY3RQcm90b2NvbChzZXJpYWxpemVyLnRyYW5zcG9ydCk7CisgICAgICBkZXNlcmlhbGl6ZXIucHJvdG9jb2wgPSBuZXcgVENvbXBhY3RQcm90b2NvbChkZXNlcmlhbGl6ZXIudHJhbnNwb3J0KTsKKworICAgICAgcnVuV3JpdGVTdHJpbmdUZXN0KCk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdDb21wYWN0IFByb3RvY29sJywgKCkgeworICAgICAgc2VyaWFsaXplci5wcm90b2NvbCA9IG5ldyBUQ29tcGFjdFByb3RvY29sKHNlcmlhbGl6ZXIudHJhbnNwb3J0KTsKKyAgICAgIGRlc2VyaWFsaXplci5wcm90b2NvbCA9IG5ldyBUQ29tcGFjdFByb3RvY29sKGRlc2VyaWFsaXplci50cmFuc3BvcnQpOworCisgICAgICBydW5Xcml0ZVRlc3QoKTsKKyAgICB9KTsKKyAgfTsKKworICBncm91cCgnU2VyaWFsaXplcicsIHNlcmlhbGl6ZXIpOworfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvdGVzdC9zZXJpYWxpemVyL3NlcmlhbGl6ZXJfdGVzdF9kYXRhLmRhcnQgYi9saWIvZGFydC90ZXN0L3NlcmlhbGl6ZXIvc2VyaWFsaXplcl90ZXN0X2RhdGEuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTg2ZjA4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvdGVzdC9zZXJpYWxpemVyL3NlcmlhbGl6ZXJfdGVzdF9kYXRhLmRhcnQKQEAgLTAsMCArMSwzNDIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworbGlicmFyeSB0aHJpZnQudGVzdC5zZXJpYWxpemVyLnNlcmlhbGl6ZXJfdGVzdDsKKworaW1wb3J0ICdwYWNrYWdlOnRocmlmdC90aHJpZnQuZGFydCc7CisKKy8vLyBUZXN0VE9iamVjdCBpcyBhIHNpbXBsZSB0ZXN0IHN0cnVjdAorY2xhc3MgVGVzdFRPYmplY3QgaW1wbGVtZW50cyBUQmFzZSB7CisgIHN0YXRpYyBmaW5hbCBUU3RydWN0IF9TVFJVQ1RfREVTQyA9IG5ldyBUU3RydWN0KCJUZXN0VE9iamVjdCIpOworICBzdGF0aWMgZmluYWwgVEZpZWxkIF9JX0ZJRUxEX0RFU0MgPSBuZXcgVEZpZWxkKCJpIiwgVFR5cGUuSTMyLCAxKTsKKyAgc3RhdGljIGZpbmFsIFRGaWVsZCBfRF9GSUVMRF9ERVNDID0gbmV3IFRGaWVsZCgiZCIsIFRUeXBlLkRPVUJMRSwgMik7CisgIHN0YXRpYyBmaW5hbCBURmllbGQgX1NfRklFTERfREVTQyA9IG5ldyBURmllbGQoInMiLCBUVHlwZS5TVFJJTkcsIDMpOworICBzdGF0aWMgZmluYWwgVEZpZWxkIF9MX0ZJRUxEX0RFU0MgPSBuZXcgVEZpZWxkKCJsIiwgVFR5cGUuTElTVCwgNCk7CisgIHN0YXRpYyBmaW5hbCBURmllbGQgX0JfRklFTERfREVTQyA9IG5ldyBURmllbGQoImIiLCBUVHlwZS5CT09MLCA1KTsKKworICBpbnQgX2k7CisgIHN0YXRpYyBjb25zdCBpbnQgSSA9IDE7CisgIGRvdWJsZSBfZDsKKyAgc3RhdGljIGNvbnN0IGludCBEID0gMjsKKyAgU3RyaW5nIF9zOworICBzdGF0aWMgY29uc3QgaW50IFMgPSAzOworICBMaXN0PFN0cmluZz4gX2w7CisgIHN0YXRpYyBjb25zdCBpbnQgTCA9IDQ7CisgIGJvb2wgX2I7CisgIHN0YXRpYyBjb25zdCBpbnQgQiA9IDU7CisKKyAgYm9vbCBfX2lzc2V0X2kgPSBmYWxzZTsKKyAgYm9vbCBfX2lzc2V0X2QgPSBmYWxzZTsKKyAgYm9vbCBfX2lzc2V0X2IgPSBmYWxzZTsKKworICBUZXN0VE9iamVjdCgpIHsKKyAgfQorCisgIC8vIGkKKyAgaW50IGdldCBpID0+IHRoaXMuX2k7CisKKyAgc2V0IGkoaW50IGkpIHsKKyAgICB0aGlzLl9pID0gaTsKKyAgICB0aGlzLl9faXNzZXRfaSA9IHRydWU7CisgIH0KKworICBib29sIGlzU2V0SSgpID0+IHRoaXMuX19pc3NldF9pOworCisgIHVuc2V0SSgpIHsKKyAgICB0aGlzLl9faXNzZXRfaSA9IGZhbHNlOworICB9CisKKyAgLy8gZAorICBkb3VibGUgZ2V0IGQgPT4gdGhpcy5fZDsKKworICBzZXQgZChkb3VibGUgZCkgeworICAgIHRoaXMuX2QgPSBkOworICAgIHRoaXMuX19pc3NldF9kID0gdHJ1ZTsKKyAgfQorCisgIGJvb2wgaXNTZXREKCkgPT4gdGhpcy5fX2lzc2V0X2Q7CisKKyAgdW5zZXREKCkgeworICAgIHRoaXMuX19pc3NldF9kID0gZmFsc2U7CisgIH0KKworICAvLyBzCisgIFN0cmluZyBnZXQgcyA9PiB0aGlzLl9zOworCisgIHNldCBzKFN0cmluZyBzKSB7CisgICAgdGhpcy5fcyA9IHM7CisgIH0KKworICBib29sIGlzU2V0UygpID0+IHRoaXMucyAhPSBudWxsOworCisgIHVuc2V0UygpIHsKKyAgICB0aGlzLnMgPSBudWxsOworICB9CisKKyAgLy8gbAorICBMaXN0PFN0cmluZz4gZ2V0IGwgPT4gdGhpcy5fbDsKKworICBzZXQgbChMaXN0PFN0cmluZz4gbCkgeworICAgIHRoaXMuX2wgPSBsOworICB9CisKKyAgYm9vbCBpc1NldEwoKSA9PiB0aGlzLmwgIT0gbnVsbDsKKworICB1bnNldEwoKSB7CisgICAgdGhpcy5sID0gbnVsbDsKKyAgfQorCisgIC8vIGIKKyAgYm9vbCBnZXQgYiA9PiB0aGlzLl9iOworCisgIHNldCBiKGJvb2wgYikgeworICAgIHRoaXMuX2IgPSBiOworICAgIHRoaXMuX19pc3NldF9iID0gdHJ1ZTsKKyAgfQorCisgIGJvb2wgaXNTZXRCKCkgPT4gdGhpcy5fX2lzc2V0X2I7CisKKyAgdW5zZXRCKCkgeworICAgIHRoaXMuX19pc3NldF9iID0gZmFsc2U7CisgIH0KKworICBnZXRGaWVsZFZhbHVlKGludCBmaWVsZElEKSB7CisgICAgc3dpdGNoIChmaWVsZElEKSB7CisgICAgICBjYXNlIEk6CisgICAgICAgIHJldHVybiB0aGlzLmk7CisgICAgICBjYXNlIEQ6CisgICAgICAgIHJldHVybiB0aGlzLmQ7CisgICAgICBjYXNlIFM6CisgICAgICAgIHJldHVybiB0aGlzLnM7CisgICAgICBjYXNlIEw6CisgICAgICAgIHJldHVybiB0aGlzLmw7CisgICAgICBjYXNlIEI6CisgICAgICAgIHJldHVybiB0aGlzLmI7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigiRmllbGQgJGZpZWxkSUQgZG9lc24ndCBleGlzdCEiKTsKKyAgICB9CisgIH0KKworICBzZXRGaWVsZFZhbHVlKGludCBmaWVsZElELCBPYmplY3QgdmFsdWUpIHsKKyAgICBzd2l0Y2ggKGZpZWxkSUQpIHsKKyAgICAgIGNhc2UgSToKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICB1bnNldEkoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0aGlzLmkgPSB2YWx1ZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBEOgorICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgIHVuc2V0RCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRoaXMuZCA9IHZhbHVlOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFM6CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgdW5zZXRTKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdGhpcy5zID0gdmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgTDoKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICB1bnNldEwoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0aGlzLmwgPSB2YWx1ZSBhcyBMaXN0PFN0cmluZz47CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgQjoKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICB1bnNldEIoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0aGlzLmIgPSB2YWx1ZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoIkZpZWxkICRmaWVsZElEIGRvZXNuJ3QgZXhpc3QhIik7CisgICAgfQorICB9CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmIGZpZWxkIGNvcnJlc3BvbmRpbmcgdG8gZmllbGRJRCBpcyBzZXQgKGhhcyBiZWVuIGFzc2lnbmVkIGEgdmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UKKyAgYm9vbCBpc1NldChpbnQgZmllbGRJRCkgeworICAgIHN3aXRjaCAoZmllbGRJRCkgeworICAgICAgY2FzZSBJOgorICAgICAgICByZXR1cm4gaXNTZXRJKCk7CisgICAgICBjYXNlIEQ6CisgICAgICAgIHJldHVybiBpc1NldEQoKTsKKyAgICAgIGNhc2UgUzoKKyAgICAgICAgcmV0dXJuIGlzU2V0UygpOworICAgICAgY2FzZSBMOgorICAgICAgICByZXR1cm4gaXNTZXRMKCk7CisgICAgICBjYXNlIEI6CisgICAgICAgIHJldHVybiBpc1NldEIoKTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCJGaWVsZCAkZmllbGRJRCBkb2Vzbid0IGV4aXN0ISIpOworICAgIH0KKyAgfQorCisgIHJlYWQoVFByb3RvY29sIGlwcm90KSB7CisgICAgVEZpZWxkIGZpZWxkOworICAgIGlwcm90LnJlYWRTdHJ1Y3RCZWdpbigpOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBmaWVsZCA9IGlwcm90LnJlYWRGaWVsZEJlZ2luKCk7CisgICAgICBpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5TVE9QKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgc3dpdGNoIChmaWVsZC5pZCkgeworICAgICAgICBjYXNlIEk6CisgICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuSTMyKSB7CisgICAgICAgICAgICB0aGlzLmkgPSBpcHJvdC5yZWFkSTMyKCk7CisgICAgICAgICAgICB0aGlzLl9faXNzZXRfaSA9IHRydWU7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEQ6CisgICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuRE9VQkxFKSB7CisgICAgICAgICAgICB0aGlzLmQgPSBpcHJvdC5yZWFkRG91YmxlKCk7CisgICAgICAgICAgICB0aGlzLl9faXNzZXRfZCA9IHRydWU7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFM6CisgICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuU1RSSU5HKSB7CisgICAgICAgICAgICB0aGlzLnMgPSBpcHJvdC5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEw6CisgICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuTElTVCkgeworICAgICAgICAgICAgeworICAgICAgICAgICAgICBUTGlzdCBfbGlzdDc0ID0gaXByb3QucmVhZExpc3RCZWdpbigpOworICAgICAgICAgICAgICB0aGlzLmwgPSBuZXcgTGlzdDxTdHJpbmc+KCk7CisgICAgICAgICAgICAgIGZvciAoaW50IF9pNzUgPSAwOyBfaTc1IDwgX2xpc3Q3NC5sZW5ndGg7ICsrX2k3NSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBfZWxlbTc2OworICAgICAgICAgICAgICAgIF9lbGVtNzYgPSBpcHJvdC5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgdGhpcy5sLmFkZChfZWxlbTc2KTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBpcHJvdC5yZWFkTGlzdEVuZCgpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCOgorICAgICAgICAgIGlmIChmaWVsZC50eXBlID09IFRUeXBlLkJPT0wpIHsKKyAgICAgICAgICAgIHRoaXMuYiA9IGlwcm90LnJlYWRCb29sKCk7CisgICAgICAgICAgICB0aGlzLl9faXNzZXRfYiA9IHRydWU7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIFRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpcHJvdC5yZWFkRmllbGRFbmQoKTsKKyAgICB9CisgICAgaXByb3QucmVhZFN0cnVjdEVuZCgpOworCisgICAgLy8gY2hlY2sgZm9yIHJlcXVpcmVkIGZpZWxkcyBvZiBwcmltaXRpdmUgdHlwZSwgd2hpY2ggY2FuJ3QgYmUgY2hlY2tlZCBpbiB0aGUgdmFsaWRhdGUgbWV0aG9kCisgICAgdmFsaWRhdGUoKTsKKyAgfQorCisgIHdyaXRlKFRQcm90b2NvbCBvcHJvdCkgeworICAgIHZhbGlkYXRlKCk7CisKKyAgICBvcHJvdC53cml0ZVN0cnVjdEJlZ2luKF9TVFJVQ1RfREVTQyk7CisgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKF9JX0ZJRUxEX0RFU0MpOworICAgIG9wcm90LndyaXRlSTMyKHRoaXMuaSk7CisgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpOworICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihfRF9GSUVMRF9ERVNDKTsKKyAgICBvcHJvdC53cml0ZURvdWJsZSh0aGlzLmQpOworICAgIG9wcm90LndyaXRlRmllbGRFbmQoKTsKKyAgICBpZiAodGhpcy5zICE9IG51bGwpIHsKKyAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihfU19GSUVMRF9ERVNDKTsKKyAgICAgIG9wcm90LndyaXRlU3RyaW5nKHRoaXMucyk7CisgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCk7CisgICAgfQorICAgIGlmICh0aGlzLmwgIT0gbnVsbCkgeworICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKF9MX0ZJRUxEX0RFU0MpOworICAgICAgeworICAgICAgICBvcHJvdC53cml0ZUxpc3RCZWdpbihuZXcgVExpc3QoVFR5cGUuU1RSSU5HLCB0aGlzLmwubGVuZ3RoKSk7CisgICAgICAgIGZvciAodmFyIGVsZW03NyBpbiB0aGlzLmwpIHsKKyAgICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhlbGVtNzcpOworICAgICAgICB9CisgICAgICAgIG9wcm90LndyaXRlTGlzdEVuZCgpOworICAgICAgfQorICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpOworICAgIH0KKyAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oX0JfRklFTERfREVTQyk7CisgICAgb3Byb3Qud3JpdGVCb29sKHRoaXMuYik7CisgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpOworICAgIG9wcm90LndyaXRlRmllbGRTdG9wKCk7CisgICAgb3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKTsKKyAgfQorCisgIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICBTdHJpbmdCdWZmZXIgcmV0ID0gbmV3IFN0cmluZ0J1ZmZlcigiVGVzdFRPYmplY3QoIik7CisKKyAgICByZXQud3JpdGUoImk6Iik7CisgICAgcmV0LndyaXRlKHRoaXMuaSk7CisKKyAgICByZXQud3JpdGUoIiwgIik7CisgICAgcmV0LndyaXRlKCJkOiIpOworICAgIHJldC53cml0ZSh0aGlzLmQpOworCisgICAgcmV0LndyaXRlKCIsICIpOworICAgIHJldC53cml0ZSgiczoiKTsKKyAgICBpZiAodGhpcy5zID09IG51bGwpIHsKKyAgICAgIHJldC53cml0ZSgibnVsbCIpOworICAgIH0gZWxzZSB7CisgICAgICByZXQud3JpdGUodGhpcy5zKTsKKyAgICB9CisKKyAgICByZXQud3JpdGUoIiwgIik7CisgICAgcmV0LndyaXRlKCJsOiIpOworICAgIGlmICh0aGlzLmwgPT0gbnVsbCkgeworICAgICAgcmV0LndyaXRlKCJudWxsIik7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldC53cml0ZSh0aGlzLmwpOworICAgIH0KKworICAgIHJldC53cml0ZSgiLCAiKTsKKyAgICByZXQud3JpdGUoImI6Iik7CisgICAgcmV0LndyaXRlKHRoaXMuYik7CisKKyAgICByZXQud3JpdGUoIikiKTsKKworICAgIHJldHVybiByZXQudG9TdHJpbmcoKTsKKyAgfQorCisgIHZhbGlkYXRlKCkgeworICAgIC8vIGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMKKyAgICAvLyBjaGVjayB0aGF0IGZpZWxkcyBvZiB0eXBlIGVudW0gaGF2ZSB2YWxpZCB2YWx1ZXMKKyAgfQorCit9CmRpZmYgLS1naXQgYS9saWIvZGFydC90ZXN0L3RfYXBwbGljYXRpb25fZXJyb3JfdGVzdC5kYXJ0IGIvbGliL2RhcnQvdGVzdC90X2FwcGxpY2F0aW9uX2Vycm9yX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTFkOGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvdGVzdC90X2FwcGxpY2F0aW9uX2Vycm9yX3Rlc3QuZGFydApAQCAtMCwwICsxLDQ2IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitsaWJyYXJ5IHRocmlmdC50ZXN0LnRfYXBwbGljYXRpb25fZXJyb3JfdGVzdDsKKworaW1wb3J0ICdwYWNrYWdlOnRlc3QvdGVzdC5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTp0aHJpZnQvdGhyaWZ0LmRhcnQnOworCit2b2lkIG1haW4oKSB7CisgIFRQcm90b2NvbCBwcm90b2NvbDsKKworICBzZXRVcCgoKSB7CisgICAgcHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQoKSk7CisgIH0pOworCisgIHRlc3QoJ1dyaXRlIGFuZCByZWFkIGFuIGFwcGxpY2F0aW9uIGVycm9yJywgKCkgeworICAgIHZhciBleHBlY3RlZFR5cGUgPSBUQXBwbGljYXRpb25FcnJvclR5cGUuSU5URVJOQUxfRVJST1I7CisgICAgdmFyIGV4cGVjdGVkTWVzc2FnZSA9ICd0ZXN0IGVycm9yIG1lc3NhZ2UnOworCisgICAgVEFwcGxpY2F0aW9uRXJyb3IgZXJyb3IgPQorICAgICAgICBuZXcgVEFwcGxpY2F0aW9uRXJyb3IoZXhwZWN0ZWRUeXBlLCBleHBlY3RlZE1lc3NhZ2UpOworICAgIGVycm9yLndyaXRlKHByb3RvY29sKTsKKworICAgIHByb3RvY29sLnRyYW5zcG9ydC5mbHVzaCgpOworCisgICAgVEFwcGxpY2F0aW9uRXJyb3Igc3ViamVjdCA9IFRBcHBsaWNhdGlvbkVycm9yLnJlYWQocHJvdG9jb2wpOworCisgICAgZXhwZWN0KHN1YmplY3QsIGlzTm90TnVsbCk7CisgICAgZXhwZWN0KHN1YmplY3QudHlwZSwgZXhwZWN0ZWRUeXBlKTsKKyAgICBleHBlY3Qoc3ViamVjdC5tZXNzYWdlLCBleHBlY3RlZE1lc3NhZ2UpOworICB9KTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L3Rlc3QvdHJhbnNwb3J0L3RfZnJhbWVkX3RyYW5zcG9ydF90ZXN0LmRhcnQgYi9saWIvZGFydC90ZXN0L3RyYW5zcG9ydC90X2ZyYW1lZF90cmFuc3BvcnRfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwNzJlNjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC90ZXN0L3RyYW5zcG9ydC90X2ZyYW1lZF90cmFuc3BvcnRfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMTc1IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitsaWJyYXJ5IHRocmlmdC50ZXN0LnRyYW5zcG9ydC50X2ZyYW1lZF90cmFuc3BvcnRfdGVzdDsKKworaW1wb3J0ICdkYXJ0OmFzeW5jJzsKK2ltcG9ydCAnZGFydDpjb252ZXJ0JzsKK2ltcG9ydCAnZGFydDp0eXBlZF9kYXRhJyBzaG93IFVpbnQ4TGlzdDsKKworaW1wb3J0ICdwYWNrYWdlOnRlc3QvdGVzdC5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTp0aHJpZnQvdGhyaWZ0LmRhcnQnOworCit2b2lkIG1haW4oKSB7CisgIGdyb3VwKCdURnJhbWVkVHJhbnNwb3J0IHBhcnRpYWwgcmVhZHMnLCAoKSB7CisgICAgZmluYWwgZmx1c2hBd2FpdER1cmF0aW9uID0gbmV3IER1cmF0aW9uKHNlY29uZHM6IDEwKTsKKworICAgIEZha2VSZWFkT25seVNvY2tldCBzb2NrZXQ7CisgICAgVFNvY2tldFRyYW5zcG9ydCBzb2NrZXRUcmFuc3BvcnQ7CisgICAgVEZyYW1lZFRyYW5zcG9ydCB0cmFuc3BvcnQ7CisgICAgdmFyIG1lc3NhZ2VBdmFpbGFibGU7CisKKyAgICBzZXRVcCgoKSB7CisgICAgICBzb2NrZXQgPSBuZXcgRmFrZVJlYWRPbmx5U29ja2V0KCk7CisgICAgICBzb2NrZXRUcmFuc3BvcnQgPSBuZXcgVENsaWVudFNvY2tldFRyYW5zcG9ydChzb2NrZXQpOworICAgICAgdHJhbnNwb3J0ID0gbmV3IFRGcmFtZWRUcmFuc3BvcnQoc29ja2V0VHJhbnNwb3J0KTsKKyAgICAgIG1lc3NhZ2VBdmFpbGFibGUgPSBmYWxzZTsKKyAgICB9KTsKKworICAgIGV4cGVjdE5vUmVhZGFibGVCeXRlcygpIHsKKyAgICAgIHZhciByZWFkQnVmZmVyID0gbmV3IFVpbnQ4TGlzdCgxMjgpOworICAgICAgdmFyIHJlYWRCeXRlcyA9IHRyYW5zcG9ydC5yZWFkKHJlYWRCdWZmZXIsIDAsIHJlYWRCdWZmZXIubGVuZ3RoSW5CeXRlcyk7CisgICAgICBleHBlY3QocmVhZEJ5dGVzLCAwKTsKKyAgICAgIGV4cGVjdChtZXNzYWdlQXZhaWxhYmxlLCBmYWxzZSk7CisgICAgfQorCisgICAgdGVzdCgnVGVzdCB0cmFuc3BvcnQgcmVhZHMgbWVzc2FnZXMgd2hlcmUgaGVhZGVyIGFuZCBib2R5IGFyZSBzZW50IHNlcGFyYXRlbHknLCAoKSBhc3luYyB7CisgICAgICAvLyBidWZmZXIgaW50byB3aGljaCB3ZSdsbCByZWFkCisgICAgICB2YXIgcmVhZEJ1ZmZlciA9IG5ldyBVaW50OExpc3QoMTApOworICAgICAgdmFyIHJlYWRCeXRlczsKKworICAgICAgLy8gcmVnaXN0ZXJzIGZvciByZWFkYWJsZSBieXRlcworICAgICAgdmFyIGZsdXNoRnV0dXJlID0gdHJhbnNwb3J0LmZsdXNoKCkudGltZW91dChmbHVzaEF3YWl0RHVyYXRpb24pOworICAgICAgZmx1c2hGdXR1cmUudGhlbigoXykgeworICAgICAgICBtZXNzYWdlQXZhaWxhYmxlID0gdHJ1ZTsKKyAgICAgIH0pOworCisgICAgICAvLyB3cml0ZSBoZWFkZXIgYnl0ZXMKKyAgICAgIHNvY2tldC5tZXNzYWdlQ29udHJvbGxlci5hZGQobmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChbMHgwMCwgMHgwMCwgMHgwMCwgMHgwNl0pKTsKKworICAgICAgLy8geW91IHNob3VsZG4ndCBiZSBhYmxlIHRvIGdldCBhbnkgYnl0ZXMgZnJvbSB0aGUgcmVhZCwKKyAgICAgIC8vIGJlY2F1c2UgdGhlIGhlYWRlciBoYXMgYmVlbiBjb25zdW1lZCBpbnRlcm5hbGx5CisgICAgICBleHBlY3ROb1JlYWRhYmxlQnl0ZXMoKTsKKworICAgICAgLy8gd3JpdGUgZmlyc3QgYmF0Y2ggb2YgYm9keQorICAgICAgc29ja2V0Lm1lc3NhZ2VDb250cm9sbGVyLmFkZChuZXcgVWludDhMaXN0LmZyb21MaXN0KFVURjguZW5jb2RlKCJIZSIpKSk7CisKKyAgICAgIC8vIHlvdSBzaG91bGRuJ3QgYmUgYWJsZSB0byBnZXQgYW55IGJ5dGVzIGZyb20gdGhlIHJlYWQsCisgICAgICAvLyBiZWNhdXNlIHRoZSBmcmFtZSBoYXMgYmVlbiBjb25zdW1lZCBpbnRlcm5hbGx5CisgICAgICBleHBlY3ROb1JlYWRhYmxlQnl0ZXMoKTsKKworICAgICAgLy8gd3JpdGUgc2Vjb25kIGJhdGNoIG9mIGJvZHkKKyAgICAgIHNvY2tldC5tZXNzYWdlQ29udHJvbGxlci5hZGQobmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChVVEY4LmVuY29kZSgibGxvISIpKSk7CisKKyAgICAgIC8vIGhhdmUgdG8gd2FpdCBmb3IgdGhlIGZsdXNoIHRvIGNvbXBsZXRlLAorICAgICAgLy8gYmVjYXVzZSBpdCdzIG9ubHkgdGhlbiB0aGF0IHRoZSBmcmFtZSBpcyBhdmFpbGFibGUgZm9yIHJlYWRpbmcKKyAgICAgIGF3YWl0IGZsdXNoRnV0dXJlOworICAgICAgZXhwZWN0KG1lc3NhZ2VBdmFpbGFibGUsIHRydWUpOworCisgICAgICAvLyBhdCB0aGlzIHBvaW50IHRoZSBmcmFtZSBpcyBjb21wbGV0ZSwgc28gd2UgZXhwZWN0IHRoZSByZWFkIHRvIGNvbXBsZXRlCisgICAgICByZWFkQnl0ZXMgPSB0cmFuc3BvcnQucmVhZChyZWFkQnVmZmVyLCAwLCByZWFkQnVmZmVyLmxlbmd0aEluQnl0ZXMpOworICAgICAgZXhwZWN0KHJlYWRCeXRlcywgNik7CisgICAgICBleHBlY3QocmVhZEJ1ZmZlci5zdWJsaXN0KDAsIDYpLCBVVEY4LmVuY29kZSgiSGVsbG8hIikpOworICAgIH0pOworCisgICAgdGVzdCgnVGVzdCB0cmFuc3BvcnQgcmVhZHMgbWVzc2FnZXMgd2hlcmUgaGVhZGVyIGlzIHNlbnQgaW4gcGllY2VzICcKKyAgICAgICAgICdhbmQgYm9keSBpcyBhbHNvIHNlbnQgaW4gcGllY2VzJywgKCkgYXN5bmMgeworICAgICAgLy8gYnVmZmVyIGludG8gd2hpY2ggd2UnbGwgcmVhZAorICAgICAgdmFyIHJlYWRCdWZmZXIgPSBuZXcgVWludDhMaXN0KDEwKTsKKyAgICAgIHZhciByZWFkQnl0ZXM7CisKKyAgICAgIC8vIHJlZ2lzdGVycyBmb3IgcmVhZGFibGUgYnl0ZXMKKyAgICAgIHZhciBmbHVzaEZ1dHVyZSA9IHRyYW5zcG9ydC5mbHVzaCgpLnRpbWVvdXQoZmx1c2hBd2FpdER1cmF0aW9uKTsKKyAgICAgIGZsdXNoRnV0dXJlLnRoZW4oKF8pIHsKKyAgICAgICAgbWVzc2FnZUF2YWlsYWJsZSA9IHRydWU7CisgICAgICB9KTsKKworICAgICAgLy8gd3JpdGUgZmlyc3QgcGFydCBvZiBoZWFkZXIgYnl0ZXMKKyAgICAgIHNvY2tldC5tZXNzYWdlQ29udHJvbGxlci5hZGQobmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChbMHgwMCwgMHgwMF0pKTsKKworICAgICAgLy8geW91IHNob3VsZG4ndCBiZSBhYmxlIHRvIGdldCBhbnkgYnl0ZXMgZnJvbSB0aGUgcmVhZAorICAgICAgZXhwZWN0Tm9SZWFkYWJsZUJ5dGVzKCk7CisKKyAgICAgIC8vIHdyaXRlIHNlY29uZCBwYXJ0IG9mIGhlYWRlciBieXRlcworICAgICAgc29ja2V0Lm1lc3NhZ2VDb250cm9sbGVyLmFkZChuZXcgVWludDhMaXN0LmZyb21MaXN0KFsweDAwLCAweDAzXSkpOworCisgICAgICAvLyB5b3Ugc2hvdWxkbid0IGJlIGFibGUgdG8gZ2V0IGFueSBieXRlcyBmcm9tIHRoZSByZWFkIGFnYWluCisgICAgICAvLyBiZWNhdXNlIG9ubHkgdGhlIGhlYWRlciB3YXMgcmVhZCwgYW5kIHRoZXJlJ3Mgbm8gZnJhbWUgYm9keQorICAgICAgcmVhZEJ5dGVzID0gZXhwZWN0Tm9SZWFkYWJsZUJ5dGVzKCk7CisKKyAgICAgIC8vIHdyaXRlIGZpcnN0IGJhdGNoIG9mIGJvZHkKKyAgICAgIHNvY2tldC5tZXNzYWdlQ29udHJvbGxlci5hZGQobmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChVVEY4LmVuY29kZSgiSCIpKSk7CisKKyAgICAgIC8vIHlvdSBzaG91bGRuJ3QgYmUgYWJsZSB0byBnZXQgYW55IGJ5dGVzIGZyb20gdGhlIHJlYWQsCisgICAgICAvLyBiZWNhdXNlIHRoZSBmcmFtZSBoYXMgYmVlbiBjb25zdW1lZCBpbnRlcm5hbGx5CisgICAgICBleHBlY3ROb1JlYWRhYmxlQnl0ZXMoKTsKKworICAgICAgLy8gd3JpdGUgc2Vjb25kIGJhdGNoIG9mIGJvZHkKKyAgICAgIHNvY2tldC5tZXNzYWdlQ29udHJvbGxlci5hZGQobmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChVVEY4LmVuY29kZSgiaSEiKSkpOworCisgICAgICAvLyBoYXZlIHRvIHdhaXQgZm9yIHRoZSBmbHVzaCB0byBjb21wbGV0ZSwKKyAgICAgIC8vIGJlY2F1c2UgaXQncyBvbmx5IHRoZW4gdGhhdCB0aGUgZnJhbWUgaXMgYXZhaWxhYmxlIGZvciByZWFkaW5nCisgICAgICBhd2FpdCBmbHVzaEZ1dHVyZTsKKyAgICAgIGV4cGVjdChtZXNzYWdlQXZhaWxhYmxlLCB0cnVlKTsKKworICAgICAgLy8gYXQgdGhpcyBwb2ludCB0aGUgZnJhbWUgaXMgY29tcGxldGUsIHNvIHdlIGV4cGVjdCB0aGUgcmVhZCB0byBjb21wbGV0ZQorICAgICAgcmVhZEJ5dGVzID0gdHJhbnNwb3J0LnJlYWQocmVhZEJ1ZmZlciwgMCwgcmVhZEJ1ZmZlci5sZW5ndGhJbkJ5dGVzKTsKKyAgICAgIGV4cGVjdChyZWFkQnl0ZXMsIDMpOworICAgICAgZXhwZWN0KHJlYWRCdWZmZXIuc3VibGlzdCgwLCAzKSwgVVRGOC5lbmNvZGUoIkhpISIpKTsKKyAgICB9KTsKKyAgfSk7Cit9CisKKworCitjbGFzcyBGYWtlUmVhZE9ubHlTb2NrZXQgZXh0ZW5kcyBUU29ja2V0IHsKKworICBTdHJlYW1Db250cm9sbGVyPFVpbnQ4TGlzdD4gbWVzc2FnZUNvbnRyb2xsZXIgPSBuZXcgU3RyZWFtQ29udHJvbGxlcjxVaW50OExpc3Q+KHN5bmM6IHRydWUpOworICBTdHJlYW1Db250cm9sbGVyPE9iamVjdD4gZXJyb3JDb250cm9sbGVyID0gbmV3IFN0cmVhbUNvbnRyb2xsZXI8T2JqZWN0PigpOworICBTdHJlYW1Db250cm9sbGVyPFRTb2NrZXRTdGF0ZT4gc3RhdGVDb250cm9sbGVyID0gbmV3IFN0cmVhbUNvbnRyb2xsZXI8VFNvY2tldFN0YXRlPigpOworCisgIEBvdmVycmlkZQorICBGdXR1cmUgY2xvc2UoKSB7CisgICAgLy8gbm9vcAorICB9CisKKyAgQG92ZXJyaWRlCisgIGJvb2wgZ2V0IGlzQ2xvc2VkID0+IGZhbHNlOworCisgIEBvdmVycmlkZQorICBib29sIGdldCBpc09wZW4gPT4gdHJ1ZTsKKworICBAb3ZlcnJpZGUKKyAgU3RyZWFtPE9iamVjdD4gZ2V0IG9uRXJyb3IgPT4gZXJyb3JDb250cm9sbGVyLnN0cmVhbTsKKworICBAb3ZlcnJpZGUKKyAgU3RyZWFtPFVpbnQ4TGlzdD4gZ2V0IG9uTWVzc2FnZSA9PiBtZXNzYWdlQ29udHJvbGxlci5zdHJlYW07CisKKyAgQG92ZXJyaWRlCisgIFN0cmVhbTxUU29ja2V0U3RhdGU+IGdldCBvblN0YXRlID0+IHN0YXRlQ29udHJvbGxlci5zdHJlYW07CisKKyAgQG92ZXJyaWRlCisgIEZ1dHVyZSBvcGVuKCkgeworICAgIC8vIG5vb3AKKyAgfQorCisgIEBvdmVycmlkZQorICB2b2lkIHNlbmQoVWludDhMaXN0IGRhdGEpIHsKKyAgICAvLyBub29wCisgIH0KK30KKwpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvdGVzdC90cmFuc3BvcnQvdF9odHRwX3RyYW5zcG9ydF90ZXN0LmRhcnQgYi9saWIvZGFydC90ZXN0L3RyYW5zcG9ydC90X2h0dHBfdHJhbnNwb3J0X3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmYzZDA1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvdGVzdC90cmFuc3BvcnQvdF9odHRwX3RyYW5zcG9ydF90ZXN0LmRhcnQKQEAgLTAsMCArMSwxNjQgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK2xpYnJhcnkgdGhyaWZ0LnRlc3QudHJhbnNwb3J0LnRfc29ja2V0X3RyYW5zcG9ydF90ZXN0OworCitpbXBvcnQgJ2RhcnQ6YXN5bmMnOworaW1wb3J0ICdkYXJ0OmNvbnZlcnQnIHNob3cgRW5jb2Rpbmc7CitpbXBvcnQgJ2RhcnQ6Y29udmVydCcgc2hvdyBVdGY4Q29kZWMsIEJBU0U2NDsKK2ltcG9ydCAnZGFydDp0eXBlZF9kYXRhJyBzaG93IFVpbnQ4TGlzdDsKKworaW1wb3J0ICdwYWNrYWdlOmh0dHAvaHR0cC5kYXJ0JyBzaG93IEJhc2VSZXF1ZXN0OworaW1wb3J0ICdwYWNrYWdlOmh0dHAvaHR0cC5kYXJ0JyBzaG93IENsaWVudDsKK2ltcG9ydCAncGFja2FnZTpodHRwL2h0dHAuZGFydCcgc2hvdyBSZXNwb25zZTsKK2ltcG9ydCAncGFja2FnZTpodHRwL2h0dHAuZGFydCcgc2hvdyBTdHJlYW1lZFJlc3BvbnNlOworaW1wb3J0ICdwYWNrYWdlOnRlc3QvdGVzdC5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTp0aHJpZnQvdGhyaWZ0LmRhcnQnOworCit2b2lkIG1haW4oKSB7CisgIGNvbnN0IHV0ZjhDb2RlYyA9IGNvbnN0IFV0ZjhDb2RlYygpOworCisgIGdyb3VwKCdUSHR0cENsaWVudFRyYW5zcG9ydCcsICgpIHsKKyAgICBGYWtlSHR0cENsaWVudCBjbGllbnQ7CisgICAgVEh0dHBDbGllbnRUcmFuc3BvcnQgdHJhbnNwb3J0OworCisgICAgc2V0VXAoKCkgeworICAgICAgY2xpZW50ID0gbmV3IEZha2VIdHRwQ2xpZW50KHN5bmM6IGZhbHNlKTsKKyAgICAgIHZhciBjb25maWcgPSBuZXcgVEh0dHBDb25maWcoVXJpLnBhcnNlKCdodHRwOi8vbG9jYWxob3N0JyksIHt9KTsKKyAgICAgIHRyYW5zcG9ydCA9IG5ldyBUSHR0cENsaWVudFRyYW5zcG9ydChjbGllbnQsIGNvbmZpZyk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdUZXN0IHRyYW5zcG9ydCBzZW5kcyBib2R5JywgKCkgYXN5bmMgeworICAgICAgdmFyIGV4cGVjdGVkVGV4dCA9ICdteSByZXF1ZXN0JzsKKyAgICAgIHRyYW5zcG9ydC53cml0ZUFsbCh1dGY4Q29kZWMuZW5jb2RlKGV4cGVjdGVkVGV4dCkpOworCisgICAgICBleHBlY3QoY2xpZW50LnBvc3RSZXF1ZXN0LCBpc0VtcHR5KTsKKworICAgICAgYXdhaXQgdHJhbnNwb3J0LmZsdXNoKCk7CisKKyAgICAgIGV4cGVjdChjbGllbnQucG9zdFJlcXVlc3QsIGlzTm90RW1wdHkpOworCisgICAgICB2YXIgcmVxdWVzdFRleHQgPQorICAgICAgICAgIHV0ZjhDb2RlYy5kZWNvZGUoQkFTRTY0LmRlY29kZShjbGllbnQucG9zdFJlcXVlc3QpKTsKKyAgICAgIGV4cGVjdChyZXF1ZXN0VGV4dCwgZXhwZWN0ZWRUZXh0KTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1Rlc3QgdHJhbnNwb3J0IHJlY2VpdmVzIHJlc3BvbnNlJywgKCkgYXN5bmMgeworICAgICAgdmFyIGV4cGVjdGVkVGV4dCA9ICdteSByZXNwb25zZSc7CisgICAgICB2YXIgZXhwZWN0ZWRCeXRlcyA9IHV0ZjhDb2RlYy5lbmNvZGUoZXhwZWN0ZWRUZXh0KTsKKyAgICAgIGNsaWVudC5wb3N0UmVzcG9uc2UgPSBCQVNFNjQuZW5jb2RlKGV4cGVjdGVkQnl0ZXMpOworCisgICAgICB0cmFuc3BvcnQud3JpdGVBbGwodXRmOENvZGVjLmVuY29kZSgnbXkgcmVxdWVzdCcpKTsKKyAgICAgIGV4cGVjdCh0cmFuc3BvcnQuaGFzUmVhZERhdGEsIGlzRmFsc2UpOworCisgICAgICBhd2FpdCB0cmFuc3BvcnQuZmx1c2goKTsKKworICAgICAgZXhwZWN0KHRyYW5zcG9ydC5oYXNSZWFkRGF0YSwgaXNUcnVlKTsKKworICAgICAgdmFyIGJ1ZmZlciA9IG5ldyBVaW50OExpc3QoZXhwZWN0ZWRCeXRlcy5sZW5ndGgpOworICAgICAgdHJhbnNwb3J0LnJlYWRBbGwoYnVmZmVyLCAwLCBleHBlY3RlZEJ5dGVzLmxlbmd0aCk7CisKKyAgICAgIHZhciBidWZmZXJUZXh0ID0gdXRmOENvZGVjLmRlY29kZShidWZmZXIpOworICAgICAgZXhwZWN0KGJ1ZmZlclRleHQsIGV4cGVjdGVkVGV4dCk7CisgICAgfSk7CisgIH0pOworCisgIGdyb3VwKCdUSHR0cENsaWVudFRyYW5zcG9ydCB3aXRoIG11bHRpcGxlIG1lc3NhZ2VzJywgKCkgeworICAgIEZha2VIdHRwQ2xpZW50IGNsaWVudDsKKyAgICBUSHR0cENsaWVudFRyYW5zcG9ydCB0cmFuc3BvcnQ7CisKKyAgICBzZXRVcCgoKSB7CisgICAgICBjbGllbnQgPSBuZXcgRmFrZUh0dHBDbGllbnQoc3luYzogdHJ1ZSk7CisgICAgICB2YXIgY29uZmlnID0gbmV3IFRIdHRwQ29uZmlnKFVyaS5wYXJzZSgnaHR0cDovL2xvY2FsaG9zdCcpLCB7fSk7CisgICAgICB0cmFuc3BvcnQgPSBuZXcgVEh0dHBDbGllbnRUcmFuc3BvcnQoY2xpZW50LCBjb25maWcpOworICAgIH0pOworCisgICAgdGVzdCgnVGVzdCByZWFkIGNvcnJlY3QgYnVmZmVyIGFmdGVyIGZsdXNoJywgKCkgYXN5bmMgeworICAgICAgU3RyaW5nIGJ1ZmZlclRleHQ7CisgICAgICB2YXIgZXhwZWN0ZWRUZXh0ID0gJ3Jlc3BvbnNlIDEnOworICAgICAgdmFyIGV4cGVjdGVkQnl0ZXMgPSB1dGY4Q29kZWMuZW5jb2RlKGV4cGVjdGVkVGV4dCk7CisKKyAgICAgIC8vIHByZXBhcmUgYSByZXNwb25zZQorICAgICAgdHJhbnNwb3J0LndyaXRlQWxsKHV0ZjhDb2RlYy5lbmNvZGUoJ3JlcXVlc3QgMScpKTsKKyAgICAgIGNsaWVudC5wb3N0UmVzcG9uc2UgPSBCQVNFNjQuZW5jb2RlKGV4cGVjdGVkQnl0ZXMpOworCisgICAgICBGdXR1cmUgcmVzcG9uc2VSZWFkeSA9IHRyYW5zcG9ydC5mbHVzaCgpLnRoZW4oKF8pIHsKKyAgICAgICAgdmFyIGJ1ZmZlciA9IG5ldyBVaW50OExpc3QoZXhwZWN0ZWRCeXRlcy5sZW5ndGgpOworICAgICAgICB0cmFuc3BvcnQucmVhZEFsbChidWZmZXIsIDAsIGV4cGVjdGVkQnl0ZXMubGVuZ3RoKTsKKyAgICAgICAgYnVmZmVyVGV4dCA9IHV0ZjhDb2RlYy5kZWNvZGUoYnVmZmVyKTsKKyAgICAgIH0pOworCisgICAgICAvLyBwcmVwYXJlIGEgc2Vjb25kIHJlc3BvbnNlCisgICAgICB0cmFuc3BvcnQud3JpdGVBbGwodXRmOENvZGVjLmVuY29kZSgncmVxdWVzdCAyJykpOworICAgICAgdmFyIHJlc3BvbnNlMkJ5dGVzID0gdXRmOENvZGVjLmVuY29kZSgncmVzcG9uc2UgMicpOworICAgICAgY2xpZW50LnBvc3RSZXNwb25zZSA9IEJBU0U2NC5lbmNvZGUocmVzcG9uc2UyQnl0ZXMpOworICAgICAgYXdhaXQgdHJhbnNwb3J0LmZsdXNoKCk7CisKKyAgICAgIGF3YWl0IHJlc3BvbnNlUmVhZHk7CisgICAgICBleHBlY3QoYnVmZmVyVGV4dCwgZXhwZWN0ZWRUZXh0KTsKKyAgICB9KTsKKyAgfSk7Cit9CisKK2NsYXNzIEZha2VIdHRwQ2xpZW50IGltcGxlbWVudHMgQ2xpZW50IHsKKyAgU3RyaW5nIHBvc3RSZXNwb25zZSA9ICcnOworICBTdHJpbmcgcG9zdFJlcXVlc3QgPSAnJzsKKworICBmaW5hbCBib29sIHN5bmM7CisKKyAgRmFrZUh0dHBDbGllbnQoe3RoaXMuc3luYzogZmFsc2V9KTsKKworICBGdXR1cmU8UmVzcG9uc2U+IHBvc3QodXJsLAorICAgICAge01hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVycywgYm9keSwgRW5jb2RpbmcgZW5jb2Rpbmd9KSB7CisgICAgcG9zdFJlcXVlc3QgPSBib2R5OworICAgIHZhciByZXNwb25zZSA9IG5ldyBSZXNwb25zZShwb3N0UmVzcG9uc2UsIDIwMCk7CisKKyAgICBpZiAoc3luYykgeworICAgICAgcmV0dXJuIG5ldyBGdXR1cmUuc3luYygoKSA9PiByZXNwb25zZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBuZXcgRnV0dXJlLnZhbHVlKHJlc3BvbnNlKTsKKyAgICB9CisgIH0KKworICBGdXR1cmU8UmVzcG9uc2U+IGhlYWQodXJsLCB7TWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzfSkgPT4KKyAgICAgIHRocm93IG5ldyBVbmltcGxlbWVudGVkRXJyb3IoKTsKKworICBGdXR1cmU8UmVzcG9uc2U+IGdldCh1cmwsIHtNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnN9KSA9PgorICAgICAgdGhyb3cgbmV3IFVuaW1wbGVtZW50ZWRFcnJvcigpOworCisgIEZ1dHVyZTxSZXNwb25zZT4gcHV0KHVybCwKKyAgICAgICAgICB7TWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzLCBib2R5LCBFbmNvZGluZyBlbmNvZGluZ30pID0+CisgICAgICB0aHJvdyBuZXcgVW5pbXBsZW1lbnRlZEVycm9yKCk7CisKKyAgRnV0dXJlPFJlc3BvbnNlPiBwYXRjaCh1cmwsCisgICAgICAgICAge01hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVycywgYm9keSwgRW5jb2RpbmcgZW5jb2Rpbmd9KSA9PgorICAgICAgdGhyb3cgbmV3IFVuaW1wbGVtZW50ZWRFcnJvcigpOworCisgIEZ1dHVyZTxSZXNwb25zZT4gZGVsZXRlKHVybCwge01hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVyc30pID0+CisgICAgICB0aHJvdyBuZXcgVW5pbXBsZW1lbnRlZEVycm9yKCk7CisKKyAgRnV0dXJlPFN0cmluZz4gcmVhZCh1cmwsIHtNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnN9KSA9PgorICAgICAgdGhyb3cgbmV3IFVuaW1wbGVtZW50ZWRFcnJvcigpOworCisgIEZ1dHVyZTxVaW50OExpc3Q+IHJlYWRCeXRlcyh1cmwsIHtNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnN9KSA9PgorICAgICAgdGhyb3cgbmV3IFVuaW1wbGVtZW50ZWRFcnJvcigpOworCisgIEZ1dHVyZTxTdHJlYW1lZFJlc3BvbnNlPiBzZW5kKEJhc2VSZXF1ZXN0IHJlcXVlc3QpID0+CisgICAgICB0aHJvdyBuZXcgVW5pbXBsZW1lbnRlZEVycm9yKCk7CisKKyAgdm9pZCBjbG9zZSgpID0+IHRocm93IG5ldyBVbmltcGxlbWVudGVkRXJyb3IoKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L3Rlc3QvdHJhbnNwb3J0L3Rfc29ja2V0X3RyYW5zcG9ydF90ZXN0LmRhcnQgYi9saWIvZGFydC90ZXN0L3RyYW5zcG9ydC90X3NvY2tldF90cmFuc3BvcnRfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyOWFiMTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC90ZXN0L3RyYW5zcG9ydC90X3NvY2tldF90cmFuc3BvcnRfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMzExIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitsaWJyYXJ5IHRocmlmdC50ZXN0LnRyYW5zcG9ydC50X3NvY2tldF90cmFuc3BvcnRfdGVzdDsKKworaW1wb3J0ICdkYXJ0OmFzeW5jJzsKK2ltcG9ydCAnZGFydDpjb252ZXJ0JyBzaG93IFV0ZjhDb2RlYywgQkFTRTY0OworaW1wb3J0ICdkYXJ0OnR5cGVkX2RhdGEnIHNob3cgVWludDhMaXN0OworCitpbXBvcnQgJ3BhY2thZ2U6bW9ja2l0by9tb2NraXRvLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOnRlc3QvdGVzdC5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTp0aHJpZnQvdGhyaWZ0LmRhcnQnOworCit2b2lkIG1haW4oKSB7CisgIGNvbnN0IHV0ZjhDb2RlYyA9IGNvbnN0IFV0ZjhDb2RlYygpOworCisgIGZpbmFsIHJlcXVlc3RUZXh0ID0gJ215IHRlc3QgcmVxdWVzdCc7CisgIGZpbmFsIHJlcXVlc3RCeXRlcyA9IG5ldyBVaW50OExpc3QuZnJvbUxpc3QodXRmOENvZGVjLmVuY29kZShyZXF1ZXN0VGV4dCkpOworICBmaW5hbCByZXF1ZXN0QmFzZTY0ID0gQkFTRTY0LmVuY29kZShyZXF1ZXN0Qnl0ZXMpOworCisgIGZpbmFsIHJlc3BvbnNlVGV4dCA9ICdyZXNwb25zZSAxJzsKKyAgZmluYWwgcmVzcG9uc2VCeXRlcyA9IG5ldyBVaW50OExpc3QuZnJvbUxpc3QodXRmOENvZGVjLmVuY29kZShyZXNwb25zZVRleHQpKTsKKyAgZmluYWwgcmVzcG9uc2VCYXNlNjQgPSBCQVNFNjQuZW5jb2RlKHJlc3BvbnNlQnl0ZXMpOworCisgIGZpbmFsIGZyYW1lZFJlc3BvbnNlQmFzZTY0ID0KKyAgICAgIEJBU0U2NC5lbmNvZGUoX2dldEZyYW1lZFJlc3BvbnNlKHJlc3BvbnNlQnl0ZXMpKTsKKworICBncm91cCgnVENsaWVudFNvY2tldFRyYW5zcG9ydCcsICgpIHsKKyAgICBGYWtlU29ja2V0IHNvY2tldDsKKyAgICBUVHJhbnNwb3J0IHRyYW5zcG9ydDsKKworICAgIHNldFVwKCgpIGFzeW5jIHsKKyAgICAgIHNvY2tldCA9IG5ldyBGYWtlU29ja2V0KHN5bmM6IGZhbHNlKTsKKyAgICAgIGF3YWl0IHNvY2tldC5vcGVuKCk7CisgICAgICB0cmFuc3BvcnQgPSBuZXcgVENsaWVudFNvY2tldFRyYW5zcG9ydChzb2NrZXQpOworICAgICAgYXdhaXQgdHJhbnNwb3J0Lm9wZW4oKTsKKyAgICAgIHRyYW5zcG9ydC53cml0ZUFsbChyZXF1ZXN0Qnl0ZXMpOworICAgIH0pOworCisgICAgdGVzdCgnVGVzdCBjbGllbnQgc2VuZGluZyBkYXRhIG92ZXIgdHJhbnNwb3J0JywgKCkgYXN5bmMgeworICAgICAgZXhwZWN0KHNvY2tldC5zZW5kUGF5bG9hZCwgaXNOdWxsKTsKKworICAgICAgRnV0dXJlIHJlc3BvbnNlUmVhZHkgPSB0cmFuc3BvcnQuZmx1c2goKTsKKworICAgICAgLy8gYWxsb3cgbWljcm90YXNrIGV2ZW50cyB0byBmaW5pc2gKKyAgICAgIGF3YWl0IG5ldyBGdXR1cmUudmFsdWUoKTsKKworICAgICAgZXhwZWN0KHNvY2tldC5zZW5kUGF5bG9hZCwgaXNOb3ROdWxsKTsKKyAgICAgIGV4cGVjdChzb2NrZXQuc2VuZFBheWxvYWQsIHJlcXVlc3RCeXRlcyk7CisKKyAgICAgIC8vIHNpbXVsYXRlIGEgcmVzcG9uc2UKKyAgICAgIHNvY2tldC5yZWNlaXZlRmFrZU1lc3NhZ2UocmVzcG9uc2VCYXNlNjQpOworCisgICAgICBhd2FpdCByZXNwb25zZVJlYWR5OworICAgICAgdmFyIGJ1ZmZlciA9IG5ldyBVaW50OExpc3QocmVzcG9uc2VCeXRlcy5sZW5ndGgpOworICAgICAgdHJhbnNwb3J0LnJlYWRBbGwoYnVmZmVyLCAwLCByZXNwb25zZUJ5dGVzLmxlbmd0aCk7CisgICAgICB2YXIgYnVmZmVyVGV4dCA9IHV0ZjhDb2RlYy5kZWNvZGUoYnVmZmVyKTsKKworICAgICAgZXhwZWN0KGJ1ZmZlclRleHQsIHJlc3BvbnNlVGV4dCk7CisgICAgfSk7CisgIH0sIHRpbWVvdXQ6IG5ldyBUaW1lb3V0KG5ldyBEdXJhdGlvbihzZWNvbmRzOiAxKSkpOworCisgIGdyb3VwKCdUQ2xpZW50U29ja2V0VHJhbnNwb3J0IHdpdGggRnJhbWVkVHJhbnNwb3J0JywgKCkgeworICAgIEZha2VTb2NrZXQgc29ja2V0OworICAgIFRUcmFuc3BvcnQgdHJhbnNwb3J0OworCisgICAgc2V0VXAoKCkgYXN5bmMgeworICAgICAgc29ja2V0ID0gbmV3IEZha2VTb2NrZXQoc3luYzogdHJ1ZSk7CisgICAgICBhd2FpdCBzb2NrZXQub3BlbigpOworCisgICAgICB0cmFuc3BvcnQgPSBuZXcgVEZyYW1lZFRyYW5zcG9ydChuZXcgVENsaWVudFNvY2tldFRyYW5zcG9ydChzb2NrZXQpKTsKKyAgICAgIGF3YWl0IHRyYW5zcG9ydC5vcGVuKCk7CisgICAgICB0cmFuc3BvcnQud3JpdGVBbGwocmVxdWVzdEJ5dGVzKTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1Rlc3QgY2xpZW50IHNlbmRpbmcgZGF0YSBvdmVyIGZyYW1lZCB0cmFuc3BvcnQnLCAoKSBhc3luYyB7CisgICAgICBTdHJpbmcgYnVmZmVyVGV4dDsKKworICAgICAgRnV0dXJlIHJlc3BvbnNlUmVhZHkgPSB0cmFuc3BvcnQuZmx1c2goKS50aGVuKChfKSB7CisgICAgICAgIHZhciBidWZmZXIgPSBuZXcgVWludDhMaXN0KHJlc3BvbnNlQnl0ZXMubGVuZ3RoKTsKKyAgICAgICAgdHJhbnNwb3J0LnJlYWRBbGwoYnVmZmVyLCAwLCByZXNwb25zZUJ5dGVzLmxlbmd0aCk7CisgICAgICAgIGJ1ZmZlclRleHQgPSB1dGY4Q29kZWMuZGVjb2RlKGJ1ZmZlcik7CisgICAgICB9KTsKKworICAgICAgLy8gc2ltdWxhdGUgYSByZXNwb25zZQorICAgICAgc29ja2V0LnJlY2VpdmVGYWtlTWVzc2FnZShmcmFtZWRSZXNwb25zZUJhc2U2NCk7CisKKyAgICAgIGF3YWl0IHJlc3BvbnNlUmVhZHk7CisgICAgICBleHBlY3QoYnVmZmVyVGV4dCwgcmVzcG9uc2VUZXh0KTsKKyAgICB9KTsKKyAgfSwgdGltZW91dDogbmV3IFRpbWVvdXQobmV3IER1cmF0aW9uKHNlY29uZHM6IDEpKSk7CisKKyAgZ3JvdXAoJ1RBc3luY0NsaWVudFNvY2tldFRyYW5zcG9ydCcsICgpIHsKKyAgICBGYWtlU29ja2V0IHNvY2tldDsKKyAgICBGYWtlUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeTsKKyAgICBUVHJhbnNwb3J0IHRyYW5zcG9ydDsKKworICAgIHNldFVwKCgpIGFzeW5jIHsKKyAgICAgIHNvY2tldCA9IG5ldyBGYWtlU29ja2V0KHN5bmM6IHRydWUpOworICAgICAgYXdhaXQgc29ja2V0Lm9wZW4oKTsKKworICAgICAgcHJvdG9jb2xGYWN0b3J5ID0gbmV3IEZha2VQcm90b2NvbEZhY3RvcnkoKTsKKyAgICAgIHByb3RvY29sRmFjdG9yeS5tZXNzYWdlID0gbmV3IFRNZXNzYWdlKCdmb28nLCBUTWVzc2FnZVR5cGUuQ0FMTCwgMTIzKTsKKyAgICAgIHRyYW5zcG9ydCA9IG5ldyBUQXN5bmNDbGllbnRTb2NrZXRUcmFuc3BvcnQoCisgICAgICAgICAgc29ja2V0LCBuZXcgVE1lc3NhZ2VSZWFkZXIocHJvdG9jb2xGYWN0b3J5KSwKKyAgICAgICAgICByZXNwb25zZVRpbWVvdXQ6IER1cmF0aW9uLlpFUk8pOworICAgICAgYXdhaXQgdHJhbnNwb3J0Lm9wZW4oKTsKKyAgICAgIHRyYW5zcG9ydC53cml0ZUFsbChyZXF1ZXN0Qnl0ZXMpOworICAgIH0pOworCisgICAgdGVzdCgnVGVzdCByZXNwb25zZSBjb3JyZWxhdGVzIHRvIGNvcnJlY3QgcmVxdWVzdCcsICgpIGFzeW5jIHsKKyAgICAgIFN0cmluZyBidWZmZXJUZXh0OworCisgICAgICBGdXR1cmUgcmVzcG9uc2VSZWFkeSA9IHRyYW5zcG9ydC5mbHVzaCgpLnRoZW4oKF8pIHsKKyAgICAgICAgdmFyIGJ1ZmZlciA9IG5ldyBVaW50OExpc3QocmVzcG9uc2VCeXRlcy5sZW5ndGgpOworICAgICAgICB0cmFuc3BvcnQucmVhZEFsbChidWZmZXIsIDAsIHJlc3BvbnNlQnl0ZXMubGVuZ3RoKTsKKyAgICAgICAgYnVmZmVyVGV4dCA9IHV0ZjhDb2RlYy5kZWNvZGUoYnVmZmVyKTsKKyAgICAgIH0pOworCisgICAgICAvLyBzaW11bGF0ZSBhIHJlc3BvbnNlCisgICAgICBwcm90b2NvbEZhY3RvcnkubWVzc2FnZSA9IG5ldyBUTWVzc2FnZSgnZm9vJywgVE1lc3NhZ2VUeXBlLlJFUExZLCAxMjMpOworICAgICAgc29ja2V0LnJlY2VpdmVGYWtlTWVzc2FnZShyZXNwb25zZUJhc2U2NCk7CisKKyAgICAgIC8vIHNpbXVsYXRlIGEgc2Vjb25kIHJlc3BvbnNlCisgICAgICB2YXIgcmVzcG9uc2UyVGV4dCA9ICdyZXNwb25zZSAyJzsKKyAgICAgIHZhciByZXNwb25zZTJCeXRlcyA9CisgICAgICAgICAgbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdCh1dGY4Q29kZWMuZW5jb2RlKHJlc3BvbnNlMlRleHQpKTsKKyAgICAgIHZhciByZXNwb25zZTJCYXNlNjQgPSBCQVNFNjQuZW5jb2RlKHJlc3BvbnNlMkJ5dGVzKTsKKyAgICAgIHByb3RvY29sRmFjdG9yeS5tZXNzYWdlID0gbmV3IFRNZXNzYWdlKCdmb28yJywgVE1lc3NhZ2VUeXBlLlJFUExZLCAxMjQpOworICAgICAgc29ja2V0LnJlY2VpdmVGYWtlTWVzc2FnZShyZXNwb25zZTJCYXNlNjQpOworCisgICAgICBhd2FpdCByZXNwb25zZVJlYWR5OworICAgICAgZXhwZWN0KGJ1ZmZlclRleHQsIHJlc3BvbnNlVGV4dCk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdUZXN0IHJlc3BvbnNlIHRpbWVvdXQnLCAoKSBhc3luYyB7CisgICAgICBGdXR1cmUgcmVzcG9uc2VSZWFkeSA9IHRyYW5zcG9ydC5mbHVzaCgpOworICAgICAgZXhwZWN0KHJlc3BvbnNlUmVhZHksIHRocm93c0EobmV3IGlzSW5zdGFuY2VPZjxUaW1lb3V0RXhjZXB0aW9uPigpKSk7CisgICAgfSk7CisgIH0sIHRpbWVvdXQ6IG5ldyBUaW1lb3V0KG5ldyBEdXJhdGlvbihzZWNvbmRzOiAxKSkpOworCisgIGdyb3VwKCdUQXN5bmNDbGllbnRTb2NrZXRUcmFuc3BvcnQgd2l0aCBURnJhbWVkVHJhbnNwb3J0JywgKCkgeworICAgIEZha2VTb2NrZXQgc29ja2V0OworICAgIEZha2VQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5OworICAgIFRUcmFuc3BvcnQgdHJhbnNwb3J0OworCisgICAgc2V0VXAoKCkgYXN5bmMgeworICAgICAgc29ja2V0ID0gbmV3IEZha2VTb2NrZXQoc3luYzogdHJ1ZSk7CisgICAgICBhd2FpdCBzb2NrZXQub3BlbigpOworCisgICAgICBwcm90b2NvbEZhY3RvcnkgPSBuZXcgRmFrZVByb3RvY29sRmFjdG9yeSgpOworICAgICAgcHJvdG9jb2xGYWN0b3J5Lm1lc3NhZ2UgPSBuZXcgVE1lc3NhZ2UoJ2ZvbycsIFRNZXNzYWdlVHlwZS5DQUxMLCAxMjMpOworICAgICAgdmFyIG1lc3NhZ2VSZWFkZXIgPSBuZXcgVE1lc3NhZ2VSZWFkZXIocHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgIGJ5dGVPZmZzZXQ6IFRGcmFtZWRUcmFuc3BvcnQuaGVhZGVyQnl0ZUNvdW50KTsKKworICAgICAgdHJhbnNwb3J0ID0gbmV3IFRGcmFtZWRUcmFuc3BvcnQobmV3IFRBc3luY0NsaWVudFNvY2tldFRyYW5zcG9ydCgKKyAgICAgICAgICBzb2NrZXQsIG1lc3NhZ2VSZWFkZXIsCisgICAgICAgICAgcmVzcG9uc2VUaW1lb3V0OiBEdXJhdGlvbi5aRVJPKSk7CisgICAgICBhd2FpdCB0cmFuc3BvcnQub3BlbigpOworICAgICAgdHJhbnNwb3J0LndyaXRlQWxsKHJlcXVlc3RCeXRlcyk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdUZXN0IGFzeW5jIGNsaWVudCBzZW5kaW5nIGRhdGEgb3ZlciBmcmFtZWQgdHJhbnNwb3J0JywgKCkgYXN5bmMgeworICAgICAgU3RyaW5nIGJ1ZmZlclRleHQ7CisKKyAgICAgIEZ1dHVyZSByZXNwb25zZVJlYWR5ID0gdHJhbnNwb3J0LmZsdXNoKCkudGhlbigoXykgeworICAgICAgICB2YXIgYnVmZmVyID0gbmV3IFVpbnQ4TGlzdChyZXNwb25zZUJ5dGVzLmxlbmd0aCk7CisgICAgICAgIHRyYW5zcG9ydC5yZWFkQWxsKGJ1ZmZlciwgMCwgcmVzcG9uc2VCeXRlcy5sZW5ndGgpOworICAgICAgICBidWZmZXJUZXh0ID0gdXRmOENvZGVjLmRlY29kZShidWZmZXIpOworICAgICAgfSk7CisKKyAgICAgIC8vIHNpbXVsYXRlIGEgcmVzcG9uc2UKKyAgICAgIHByb3RvY29sRmFjdG9yeS5tZXNzYWdlID0gbmV3IFRNZXNzYWdlKCdmb28nLCBUTWVzc2FnZVR5cGUuUkVQTFksIDEyMyk7CisgICAgICBzb2NrZXQucmVjZWl2ZUZha2VNZXNzYWdlKGZyYW1lZFJlc3BvbnNlQmFzZTY0KTsKKworICAgICAgYXdhaXQgcmVzcG9uc2VSZWFkeTsKKyAgICAgIGV4cGVjdChidWZmZXJUZXh0LCByZXNwb25zZVRleHQpOworICAgIH0pOworICB9LCB0aW1lb3V0OiBuZXcgVGltZW91dChuZXcgRHVyYXRpb24oc2Vjb25kczogMSkpKTsKKworICBncm91cCgnVFNlcnZlclRyYW5zcG9ydCcsICgpIHsKKyAgICB0ZXN0KCdUZXN0IHNlcnZlciB0cmFuc3BvcnQgbGlzdGVucyB0byBzb2NrZXQnLCAoKSBhc3luYyB7CisgICAgICB2YXIgc29ja2V0ID0gbmV3IEZha2VTb2NrZXQoKTsKKyAgICAgIGF3YWl0IHNvY2tldC5vcGVuKCk7CisgICAgICBleHBlY3Qoc29ja2V0LmlzT3BlbiwgaXNUcnVlKTsKKworICAgICAgdmFyIHRyYW5zcG9ydCA9IG5ldyBUU2VydmVyU29ja2V0VHJhbnNwb3J0KHNvY2tldCk7CisgICAgICBleHBlY3QodHJhbnNwb3J0Lmhhc1JlYWREYXRhLCBpc0ZhbHNlKTsKKworICAgICAgc29ja2V0LnJlY2VpdmVGYWtlTWVzc2FnZShyZXF1ZXN0QmFzZTY0KTsKKworICAgICAgLy8gYWxsb3cgbWljcm90YXNrIGV2ZW50cyB0byBmaW5pc2gKKyAgICAgIGF3YWl0IG5ldyBGdXR1cmUudmFsdWUoKTsKKworICAgICAgZXhwZWN0KHRyYW5zcG9ydC5oYXNSZWFkRGF0YSwgaXNUcnVlKTsKKworICAgICAgdmFyIGJ1ZmZlciA9IG5ldyBVaW50OExpc3QocmVxdWVzdEJ5dGVzLmxlbmd0aCk7CisgICAgICB0cmFuc3BvcnQucmVhZEFsbChidWZmZXIsIDAsIHJlcXVlc3RCeXRlcy5sZW5ndGgpOworCisgICAgICB2YXIgYnVmZmVyVGV4dCA9IHV0ZjhDb2RlYy5kZWNvZGUoYnVmZmVyKTsKKyAgICAgIGV4cGVjdChidWZmZXJUZXh0LCByZXF1ZXN0VGV4dCk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdUZXN0IHNlcnZlciBzZW5kaW5nIGRhdGEgb3ZlciB0cmFuc3BvcnQnLCAoKSBhc3luYyB7CisgICAgICB2YXIgc29ja2V0ID0gbmV3IEZha2VTb2NrZXQoKTsKKyAgICAgIGF3YWl0IHNvY2tldC5vcGVuKCk7CisKKyAgICAgIHZhciB0cmFuc3BvcnQgPSBuZXcgVFNlcnZlclNvY2tldFRyYW5zcG9ydChzb2NrZXQpOworCisgICAgICB0cmFuc3BvcnQud3JpdGVBbGwocmVzcG9uc2VCeXRlcyk7CisgICAgICBleHBlY3Qoc29ja2V0LnNlbmRQYXlsb2FkLCBpc051bGwpOworCisgICAgICB0cmFuc3BvcnQuZmx1c2goKTsKKworICAgICAgLy8gYWxsb3cgbWljcm90YXNrIGV2ZW50cyB0byBmaW5pc2gKKyAgICAgIGF3YWl0IG5ldyBGdXR1cmUudmFsdWUoKTsKKworICAgICAgZXhwZWN0KHNvY2tldC5zZW5kUGF5bG9hZCwgaXNOb3ROdWxsKTsKKyAgICAgIGV4cGVjdChzb2NrZXQuc2VuZFBheWxvYWQsIHJlc3BvbnNlQnl0ZXMpOworICAgIH0pOworICB9LCB0aW1lb3V0OiBuZXcgVGltZW91dChuZXcgRHVyYXRpb24oc2Vjb25kczogMSkpKTsKK30KKworY2xhc3MgRmFrZVNvY2tldCBleHRlbmRzIFRTb2NrZXQgeworICBmaW5hbCBTdHJlYW1Db250cm9sbGVyPFRTb2NrZXRTdGF0ZT4gX29uU3RhdGVDb250cm9sbGVyOworICBTdHJlYW08VFNvY2tldFN0YXRlPiBnZXQgb25TdGF0ZSA9PiBfb25TdGF0ZUNvbnRyb2xsZXIuc3RyZWFtOworCisgIGZpbmFsIFN0cmVhbUNvbnRyb2xsZXI8T2JqZWN0PiBfb25FcnJvckNvbnRyb2xsZXI7CisgIFN0cmVhbTxPYmplY3Q+IGdldCBvbkVycm9yID0+IF9vbkVycm9yQ29udHJvbGxlci5zdHJlYW07CisKKyAgZmluYWwgU3RyZWFtQ29udHJvbGxlcjxVaW50OExpc3Q+IF9vbk1lc3NhZ2VDb250cm9sbGVyOworICBTdHJlYW08VWludDhMaXN0PiBnZXQgb25NZXNzYWdlID0+IF9vbk1lc3NhZ2VDb250cm9sbGVyLnN0cmVhbTsKKworICBGYWtlU29ja2V0KHtib29sIHN5bmM6IGZhbHNlfSkKKyAgICAgIDogX29uU3RhdGVDb250cm9sbGVyID0gbmV3IFN0cmVhbUNvbnRyb2xsZXIuYnJvYWRjYXN0KHN5bmM6IHN5bmMpLAorICAgICAgICBfb25FcnJvckNvbnRyb2xsZXIgPSBuZXcgU3RyZWFtQ29udHJvbGxlci5icm9hZGNhc3Qoc3luYzogc3luYyksCisgICAgICAgIF9vbk1lc3NhZ2VDb250cm9sbGVyID0gbmV3IFN0cmVhbUNvbnRyb2xsZXIuYnJvYWRjYXN0KHN5bmM6IHN5bmMpOworCisgIGJvb2wgX2lzT3BlbjsKKworICBib29sIGdldCBpc09wZW4gPT4gX2lzT3BlbjsKKworICBib29sIGdldCBpc0Nsb3NlZCA9PiAhaXNPcGVuOworCisgIEZ1dHVyZSBvcGVuKCkgYXN5bmMgeworICAgIF9pc09wZW4gPSB0cnVlOworICAgIF9vblN0YXRlQ29udHJvbGxlci5hZGQoVFNvY2tldFN0YXRlLk9QRU4pOworICB9CisKKyAgRnV0dXJlIGNsb3NlKCkgYXN5bmMgeworICAgIF9pc09wZW4gPSBmYWxzZTsKKyAgICBfb25TdGF0ZUNvbnRyb2xsZXIuYWRkKFRTb2NrZXRTdGF0ZS5DTE9TRUQpOworICB9CisKKyAgVWludDhMaXN0IF9zZW5kUGF5bG9hZDsKKyAgVWludDhMaXN0IGdldCBzZW5kUGF5bG9hZCA9PiBfc2VuZFBheWxvYWQ7CisKKyAgdm9pZCBzZW5kKFVpbnQ4TGlzdCBkYXRhKSB7CisgICAgaWYgKCFpc09wZW4pIHRocm93IG5ldyBTdGF0ZUVycm9yKCdUaGUgc29ja2V0IGlzIG5vdCBvcGVuJyk7CisKKyAgICBfc2VuZFBheWxvYWQgPSBkYXRhOworICB9CisKKyAgdm9pZCByZWNlaXZlRmFrZU1lc3NhZ2UoU3RyaW5nIGJhc2U2NCkgeworICAgIGlmICghaXNPcGVuKSB0aHJvdyBuZXcgU3RhdGVFcnJvcignVGhlIHNvY2tldCBpcyBub3Qgb3BlbicpOworCisgICAgdmFyIG1lc3NhZ2UgPQorICAgICAgICBuZXcgVWludDhMaXN0LmZyb21MaXN0KEJBU0U2NC5kZWNvZGUoYmFzZTY0KSk7CisgICAgX29uTWVzc2FnZUNvbnRyb2xsZXIuYWRkKG1lc3NhZ2UpOworICB9Cit9CisKK2NsYXNzIEZha2VQcm90b2NvbEZhY3RvcnkgaW1wbGVtZW50cyBUUHJvdG9jb2xGYWN0b3J5IHsKKyAgRmFrZVByb3RvY29sRmFjdG9yeSgpOworCisgIFRNZXNzYWdlIG1lc3NhZ2U7CisKKyAgZ2V0UHJvdG9jb2woVFRyYW5zcG9ydCB0cmFuc3BvcnQpID0+IG5ldyBGYWtlUHJvdG9jb2wobWVzc2FnZSk7Cit9CisKK2NsYXNzIEZha2VQcm90b2NvbCBleHRlbmRzIE1vY2sgaW1wbGVtZW50cyBUUHJvdG9jb2wgeworICBGYWtlUHJvdG9jb2wodGhpcy5fbWVzc2FnZSk7CisKKyAgVE1lc3NhZ2UgX21lc3NhZ2U7CisKKyAgcmVhZE1lc3NhZ2VCZWdpbigpID0+IF9tZXNzYWdlOworfQorCitVaW50OExpc3QgX2dldEZyYW1lZFJlc3BvbnNlKFVpbnQ4TGlzdCByZXNwb25zZUJ5dGVzKSB7CisgIHZhciBieXRlT2Zmc2V0ID0gVEZyYW1lZFRyYW5zcG9ydC5oZWFkZXJCeXRlQ291bnQ7CisgIHZhciByZXNwb25zZSA9IG5ldyBVaW50OExpc3QoYnl0ZU9mZnNldCArIHJlc3BvbnNlQnl0ZXMubGVuZ3RoKTsKKworICByZXNwb25zZS5idWZmZXIuYXNCeXRlRGF0YSgpLnNldEludDMyKDAsIHJlc3BvbnNlQnl0ZXMubGVuZ3RoKTsKKyAgcmVzcG9uc2Uuc2V0QWxsKGJ5dGVPZmZzZXQsIHJlc3BvbnNlQnl0ZXMpOworCisgIHJldHVybiByZXNwb25zZTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L3Rlc3QvdHJhbnNwb3J0L3RfdHJhbnNwb3J0X3Rlc3QuZGFydCBiL2xpYi9kYXJ0L3Rlc3QvdHJhbnNwb3J0L3RfdHJhbnNwb3J0X3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmIzODFhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvdGVzdC90cmFuc3BvcnQvdF90cmFuc3BvcnRfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsNDEgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK2xpYnJhcnkgdGhyaWZ0LnRlc3QudHJhbnNwb3J0LnRfc29ja2V0X3RyYW5zcG9ydF90ZXN0OworCitpbXBvcnQgJ3BhY2thZ2U6dGVzdC90ZXN0LmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOnRocmlmdC90aHJpZnQuZGFydCc7CisKKy8vLyBDb21tb24gdHJhbnNwb3J0IHRlc3RzCit2b2lkIG1haW4oKSB7CisgIGdyb3VwKCdUVHJhbnNwb3J0RmFjdG9yeScsICgpIHsKKyAgICB0ZXN0KCd0cmFuc3BvcnQgaXMgcmV0dXJuZWQgZnJvbSBiYXNlIGZhY3RvcnknLCAoKSBhc3luYyB7CisgICAgICBUVHJhbnNwb3J0IHJlc3VsdDsKKyAgICAgIFRUcmFuc3BvcnQgdHJhbnNwb3J0ID0gbnVsbDsKKworICAgICAgdmFyIGZhY3RvcnkgPSBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKTsKKworICAgICAgcmVzdWx0ID0gYXdhaXQgZmFjdG9yeS5nZXRUcmFuc3BvcnQodHJhbnNwb3J0KTsKKyAgICAgIGV4cGVjdChyZXN1bHQsIGlzTnVsbCk7CisKKyAgICAgIHRyYW5zcG9ydCA9IG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQoKTsKKyAgICAgIHJlc3VsdCA9IGF3YWl0IGZhY3RvcnkuZ2V0VHJhbnNwb3J0KHRyYW5zcG9ydCk7CisKKyAgICAgIGV4cGVjdChyZXN1bHQsIHRyYW5zcG9ydCk7CisgICAgfSk7CisgIH0pOworfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvdG9vbC9kZXYuZGFydCBiL2xpYi9kYXJ0L3Rvb2wvZGV2LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdmOGI4ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L3Rvb2wvZGV2LmRhcnQKQEAgLTAsMCArMSwzMyBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworbGlicmFyeSB0b29sLmRldjsKKworaW1wb3J0ICdwYWNrYWdlOmRhcnRfZGV2L2RhcnRfZGV2LmRhcnQnIHNob3cgZGV2LCBjb25maWc7CisKK21haW4oTGlzdDxTdHJpbmc+IGFyZ3MpIGFzeW5jIHsKKyAgLy8gaHR0cHM6Ly9naXRodWIuY29tL1dvcmtpdmEvZGFydF9kZXYKKworICB2YXIgZGlyZWN0b3JpZXMgPSBbJ2xpYi8nLCAndGVzdC8nLCAndG9vbC8nXTsKKyAgY29uZmlnLmFuYWx5emUuZW50cnlQb2ludHMgPSBkaXJlY3RvcmllczsKKyAgY29uZmlnLmZvcm1hdC5kaXJlY3RvcmllcyA9IGRpcmVjdG9yaWVzOworICBjb25maWcuY29weUxpY2Vuc2UKKyAgICAuLmxpY2Vuc2VQYXRoID0gJ0xJQ0VOU0VfSEVBREVSJworICAgIC4uZGlyZWN0b3JpZXMgPSBkaXJlY3RvcmllczsKKworICBhd2FpdCBkZXYoYXJncyk7Cit9CmRpZmYgLS1naXQgYS9saWIvZGVscGhpL0RlbHBoaVRocmlmdC5ncm91cHByb2ogYi9saWIvZGVscGhpL0RlbHBoaVRocmlmdC5ncm91cHByb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE3MmU0OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZWxwaGkvRGVscGhpVGhyaWZ0Lmdyb3VwcHJvagpAQCAtMCwwICsxLDE1NiBAQAor77u/CTxQcm9qZWN0IHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgorCQk8UHJvcGVydHlHcm91cD4KKwkJCTxQcm9qZWN0R3VpZD57NkJEMzI3QTUtNzY4OC00MjYzLUI2QTgtQjE1MjA3Q0Y0RUM1fTwvUHJvamVjdEd1aWQ+CisJCTwvUHJvcGVydHlHcm91cD4KKwkJPEl0ZW1Hcm91cD4KKwkJCTxQcm9qZWN0cyBJbmNsdWRlPSJ0ZXN0XGNsaWVudC5kcHJvaiI+CisJCQkJPERlcGVuZGVuY2llcy8+CisJCQk8L1Byb2plY3RzPgorCQkJPFByb2plY3RzIEluY2x1ZGU9InRlc3Rcc2VydmVyLmRwcm9qIj4KKwkJCQk8RGVwZW5kZW5jaWVzLz4KKwkJCTwvUHJvamVjdHM+CisJCQk8UHJvamVjdHMgSW5jbHVkZT0idGVzdFxtdWx0aXBsZXhlZFxNdWx0aXBsZXguVGVzdC5DbGllbnQuZHByb2oiPgorCQkJCTxEZXBlbmRlbmNpZXMvPgorCQkJPC9Qcm9qZWN0cz4KKwkJCTxQcm9qZWN0cyBJbmNsdWRlPSJ0ZXN0XG11bHRpcGxleGVkXE11bHRpcGxleC5UZXN0LlNlcnZlci5kcHJvaiI+CisJCQkJPERlcGVuZGVuY2llcy8+CisJCQk8L1Byb2plY3RzPgorCQkJPFByb2plY3RzIEluY2x1ZGU9InRlc3Rcc2VyaWFsaXplclxUZXN0U2VyaWFsaXplci5kcHJvaiI+CisJCQkJPERlcGVuZGVuY2llcy8+CisJCQk8L1Byb2plY3RzPgorCQkJPFByb2plY3RzIEluY2x1ZGU9InRlc3Rcc2tpcFxza2lwdGVzdF92ZXJzaW9uMS5kcHJvaiI+CisJCQkJPERlcGVuZGVuY2llcy8+CisJCQk8L1Byb2plY3RzPgorCQkJPFByb2plY3RzIEluY2x1ZGU9InRlc3Rcc2tpcFxza2lwdGVzdF92ZXJzaW9uMi5kcHJvaiI+CisJCQkJPERlcGVuZGVuY2llcy8+CisJCQk8L1Byb2plY3RzPgorCQkJPFByb2plY3RzIEluY2x1ZGU9InRlc3RcdHlwZXJlZ2lzdHJ5XFRlc3RUeXBlUmVnaXN0cnkuZHByb2oiPgorCQkJCTxEZXBlbmRlbmNpZXMvPgorCQkJPC9Qcm9qZWN0cz4KKwkJCTxQcm9qZWN0cyBJbmNsdWRlPSIuLlwuLlx0dXRvcmlhbFxkZWxwaGlcRGVscGhpU2VydmVyXERlbHBoaVNlcnZlci5kcHJvaiI+CisJCQkJPERlcGVuZGVuY2llcy8+CisJCQk8L1Byb2plY3RzPgorCQkJPFByb2plY3RzIEluY2x1ZGU9Ii4uXC4uXHR1dG9yaWFsXGRlbHBoaVxEZWxwaGlDbGllbnRcRGVscGhpQ2xpZW50LmRwcm9qIj4KKwkJCQk8RGVwZW5kZW5jaWVzLz4KKwkJCTwvUHJvamVjdHM+CisJCQk8UHJvamVjdHMgSW5jbHVkZT0idGVzdFxrZXl3b3Jkc1xSZXNlcnZlZEtleXdvcmRzLmRwcm9qIj4KKwkJCQk8RGVwZW5kZW5jaWVzLz4KKwkJCTwvUHJvamVjdHM+CisJCTwvSXRlbUdyb3VwPgorCQk8UHJvamVjdEV4dGVuc2lvbnM+CisJCQk8Qm9ybGFuZC5QZXJzb25hbGl0eT5EZWZhdWx0LlBlcnNvbmFsaXR5LjEyPC9Cb3JsYW5kLlBlcnNvbmFsaXR5PgorCQkJPEJvcmxhbmQuUHJvamVjdFR5cGUvPgorCQkJPEJvcmxhbmRQcm9qZWN0PgorCQkJCTxEZWZhdWx0LlBlcnNvbmFsaXR5Lz4KKwkJCTwvQm9ybGFuZFByb2plY3Q+CisJCTwvUHJvamVjdEV4dGVuc2lvbnM+CisJCTxUYXJnZXQgTmFtZT0iY2xpZW50Ij4KKwkJCTxNU0J1aWxkIFByb2plY3RzPSJ0ZXN0XGNsaWVudC5kcHJvaiIvPgorCQk8L1RhcmdldD4KKwkJPFRhcmdldCBOYW1lPSJjbGllbnQ6Q2xlYW4iPgorCQkJPE1TQnVpbGQgUHJvamVjdHM9InRlc3RcY2xpZW50LmRwcm9qIiBUYXJnZXRzPSJDbGVhbiIvPgorCQk8L1RhcmdldD4KKwkJPFRhcmdldCBOYW1lPSJjbGllbnQ6TWFrZSI+CisJCQk8TVNCdWlsZCBQcm9qZWN0cz0idGVzdFxjbGllbnQuZHByb2oiIFRhcmdldHM9Ik1ha2UiLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0ic2VydmVyIj4KKwkJCTxNU0J1aWxkIFByb2plY3RzPSJ0ZXN0XHNlcnZlci5kcHJvaiIvPgorCQk8L1RhcmdldD4KKwkJPFRhcmdldCBOYW1lPSJzZXJ2ZXI6Q2xlYW4iPgorCQkJPE1TQnVpbGQgUHJvamVjdHM9InRlc3Rcc2VydmVyLmRwcm9qIiBUYXJnZXRzPSJDbGVhbiIvPgorCQk8L1RhcmdldD4KKwkJPFRhcmdldCBOYW1lPSJzZXJ2ZXI6TWFrZSI+CisJCQk8TVNCdWlsZCBQcm9qZWN0cz0idGVzdFxzZXJ2ZXIuZHByb2oiIFRhcmdldHM9Ik1ha2UiLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0iTXVsdGlwbGV4X1Rlc3RfQ2xpZW50Ij4KKwkJCTxNU0J1aWxkIFByb2plY3RzPSJ0ZXN0XG11bHRpcGxleGVkXE11bHRpcGxleC5UZXN0LkNsaWVudC5kcHJvaiIvPgorCQk8L1RhcmdldD4KKwkJPFRhcmdldCBOYW1lPSJNdWx0aXBsZXhfVGVzdF9DbGllbnQ6Q2xlYW4iPgorCQkJPE1TQnVpbGQgUHJvamVjdHM9InRlc3RcbXVsdGlwbGV4ZWRcTXVsdGlwbGV4LlRlc3QuQ2xpZW50LmRwcm9qIiBUYXJnZXRzPSJDbGVhbiIvPgorCQk8L1RhcmdldD4KKwkJPFRhcmdldCBOYW1lPSJNdWx0aXBsZXhfVGVzdF9DbGllbnQ6TWFrZSI+CisJCQk8TVNCdWlsZCBQcm9qZWN0cz0idGVzdFxtdWx0aXBsZXhlZFxNdWx0aXBsZXguVGVzdC5DbGllbnQuZHByb2oiIFRhcmdldHM9Ik1ha2UiLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0iTXVsdGlwbGV4X1Rlc3RfU2VydmVyIj4KKwkJCTxNU0J1aWxkIFByb2plY3RzPSJ0ZXN0XG11bHRpcGxleGVkXE11bHRpcGxleC5UZXN0LlNlcnZlci5kcHJvaiIvPgorCQk8L1RhcmdldD4KKwkJPFRhcmdldCBOYW1lPSJNdWx0aXBsZXhfVGVzdF9TZXJ2ZXI6Q2xlYW4iPgorCQkJPE1TQnVpbGQgUHJvamVjdHM9InRlc3RcbXVsdGlwbGV4ZWRcTXVsdGlwbGV4LlRlc3QuU2VydmVyLmRwcm9qIiBUYXJnZXRzPSJDbGVhbiIvPgorCQk8L1RhcmdldD4KKwkJPFRhcmdldCBOYW1lPSJNdWx0aXBsZXhfVGVzdF9TZXJ2ZXI6TWFrZSI+CisJCQk8TVNCdWlsZCBQcm9qZWN0cz0idGVzdFxtdWx0aXBsZXhlZFxNdWx0aXBsZXguVGVzdC5TZXJ2ZXIuZHByb2oiIFRhcmdldHM9Ik1ha2UiLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0iVGVzdFNlcmlhbGl6ZXIiPgorCQkJPE1TQnVpbGQgUHJvamVjdHM9InRlc3Rcc2VyaWFsaXplclxUZXN0U2VyaWFsaXplci5kcHJvaiIvPgorCQk8L1RhcmdldD4KKwkJPFRhcmdldCBOYW1lPSJUZXN0U2VyaWFsaXplcjpDbGVhbiI+CisJCQk8TVNCdWlsZCBQcm9qZWN0cz0idGVzdFxzZXJpYWxpemVyXFRlc3RTZXJpYWxpemVyLmRwcm9qIiBUYXJnZXRzPSJDbGVhbiIvPgorCQk8L1RhcmdldD4KKwkJPFRhcmdldCBOYW1lPSJUZXN0U2VyaWFsaXplcjpNYWtlIj4KKwkJCTxNU0J1aWxkIFByb2plY3RzPSJ0ZXN0XHNlcmlhbGl6ZXJcVGVzdFNlcmlhbGl6ZXIuZHByb2oiIFRhcmdldHM9Ik1ha2UiLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0ic2tpcHRlc3RfdmVyc2lvbjEiPgorCQkJPE1TQnVpbGQgUHJvamVjdHM9InRlc3Rcc2tpcFxza2lwdGVzdF92ZXJzaW9uMS5kcHJvaiIvPgorCQk8L1RhcmdldD4KKwkJPFRhcmdldCBOYW1lPSJza2lwdGVzdF92ZXJzaW9uMTpDbGVhbiI+CisJCQk8TVNCdWlsZCBQcm9qZWN0cz0idGVzdFxza2lwXHNraXB0ZXN0X3ZlcnNpb24xLmRwcm9qIiBUYXJnZXRzPSJDbGVhbiIvPgorCQk8L1RhcmdldD4KKwkJPFRhcmdldCBOYW1lPSJza2lwdGVzdF92ZXJzaW9uMTpNYWtlIj4KKwkJCTxNU0J1aWxkIFByb2plY3RzPSJ0ZXN0XHNraXBcc2tpcHRlc3RfdmVyc2lvbjEuZHByb2oiIFRhcmdldHM9Ik1ha2UiLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0ic2tpcHRlc3RfdmVyc2lvbjIiPgorCQkJPE1TQnVpbGQgUHJvamVjdHM9InRlc3Rcc2tpcFxza2lwdGVzdF92ZXJzaW9uMi5kcHJvaiIvPgorCQk8L1RhcmdldD4KKwkJPFRhcmdldCBOYW1lPSJza2lwdGVzdF92ZXJzaW9uMjpDbGVhbiI+CisJCQk8TVNCdWlsZCBQcm9qZWN0cz0idGVzdFxza2lwXHNraXB0ZXN0X3ZlcnNpb24yLmRwcm9qIiBUYXJnZXRzPSJDbGVhbiIvPgorCQk8L1RhcmdldD4KKwkJPFRhcmdldCBOYW1lPSJza2lwdGVzdF92ZXJzaW9uMjpNYWtlIj4KKwkJCTxNU0J1aWxkIFByb2plY3RzPSJ0ZXN0XHNraXBcc2tpcHRlc3RfdmVyc2lvbjIuZHByb2oiIFRhcmdldHM9Ik1ha2UiLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0iVGVzdFR5cGVSZWdpc3RyeSI+CisJCQk8TVNCdWlsZCBQcm9qZWN0cz0idGVzdFx0eXBlcmVnaXN0cnlcVGVzdFR5cGVSZWdpc3RyeS5kcHJvaiIvPgorCQk8L1RhcmdldD4KKwkJPFRhcmdldCBOYW1lPSJUZXN0VHlwZVJlZ2lzdHJ5OkNsZWFuIj4KKwkJCTxNU0J1aWxkIFByb2plY3RzPSJ0ZXN0XHR5cGVyZWdpc3RyeVxUZXN0VHlwZVJlZ2lzdHJ5LmRwcm9qIiBUYXJnZXRzPSJDbGVhbiIvPgorCQk8L1RhcmdldD4KKwkJPFRhcmdldCBOYW1lPSJUZXN0VHlwZVJlZ2lzdHJ5Ok1ha2UiPgorCQkJPE1TQnVpbGQgUHJvamVjdHM9InRlc3RcdHlwZXJlZ2lzdHJ5XFRlc3RUeXBlUmVnaXN0cnkuZHByb2oiIFRhcmdldHM9Ik1ha2UiLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0iRGVscGhpU2VydmVyIj4KKwkJCTxNU0J1aWxkIFByb2plY3RzPSIuLlwuLlx0dXRvcmlhbFxkZWxwaGlcRGVscGhpU2VydmVyXERlbHBoaVNlcnZlci5kcHJvaiIvPgorCQk8L1RhcmdldD4KKwkJPFRhcmdldCBOYW1lPSJEZWxwaGlTZXJ2ZXI6Q2xlYW4iPgorCQkJPE1TQnVpbGQgUHJvamVjdHM9Ii4uXC4uXHR1dG9yaWFsXGRlbHBoaVxEZWxwaGlTZXJ2ZXJcRGVscGhpU2VydmVyLmRwcm9qIiBUYXJnZXRzPSJDbGVhbiIvPgorCQk8L1RhcmdldD4KKwkJPFRhcmdldCBOYW1lPSJEZWxwaGlTZXJ2ZXI6TWFrZSI+CisJCQk8TVNCdWlsZCBQcm9qZWN0cz0iLi5cLi5cdHV0b3JpYWxcZGVscGhpXERlbHBoaVNlcnZlclxEZWxwaGlTZXJ2ZXIuZHByb2oiIFRhcmdldHM9Ik1ha2UiLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0iRGVscGhpQ2xpZW50Ij4KKwkJCTxNU0J1aWxkIFByb2plY3RzPSIuLlwuLlx0dXRvcmlhbFxkZWxwaGlcRGVscGhpQ2xpZW50XERlbHBoaUNsaWVudC5kcHJvaiIvPgorCQk8L1RhcmdldD4KKwkJPFRhcmdldCBOYW1lPSJEZWxwaGlDbGllbnQ6Q2xlYW4iPgorCQkJPE1TQnVpbGQgUHJvamVjdHM9Ii4uXC4uXHR1dG9yaWFsXGRlbHBoaVxEZWxwaGlDbGllbnRcRGVscGhpQ2xpZW50LmRwcm9qIiBUYXJnZXRzPSJDbGVhbiIvPgorCQk8L1RhcmdldD4KKwkJPFRhcmdldCBOYW1lPSJEZWxwaGlDbGllbnQ6TWFrZSI+CisJCQk8TVNCdWlsZCBQcm9qZWN0cz0iLi5cLi5cdHV0b3JpYWxcZGVscGhpXERlbHBoaUNsaWVudFxEZWxwaGlDbGllbnQuZHByb2oiIFRhcmdldHM9Ik1ha2UiLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0iUmVzZXJ2ZWRLZXl3b3JkcyI+CisJCQk8TVNCdWlsZCBQcm9qZWN0cz0idGVzdFxrZXl3b3Jkc1xSZXNlcnZlZEtleXdvcmRzLmRwcm9qIi8+CisJCTwvVGFyZ2V0PgorCQk8VGFyZ2V0IE5hbWU9IlJlc2VydmVkS2V5d29yZHM6Q2xlYW4iPgorCQkJPE1TQnVpbGQgUHJvamVjdHM9InRlc3Rca2V5d29yZHNcUmVzZXJ2ZWRLZXl3b3Jkcy5kcHJvaiIgVGFyZ2V0cz0iQ2xlYW4iLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0iUmVzZXJ2ZWRLZXl3b3JkczpNYWtlIj4KKwkJCTxNU0J1aWxkIFByb2plY3RzPSJ0ZXN0XGtleXdvcmRzXFJlc2VydmVkS2V5d29yZHMuZHByb2oiIFRhcmdldHM9Ik1ha2UiLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0iQnVpbGQiPgorCQkJPENhbGxUYXJnZXQgVGFyZ2V0cz0iY2xpZW50O3NlcnZlcjtNdWx0aXBsZXhfVGVzdF9DbGllbnQ7TXVsdGlwbGV4X1Rlc3RfU2VydmVyO1Rlc3RTZXJpYWxpemVyO3NraXB0ZXN0X3ZlcnNpb24xO3NraXB0ZXN0X3ZlcnNpb24yO1Rlc3RUeXBlUmVnaXN0cnk7RGVscGhpU2VydmVyO0RlbHBoaUNsaWVudDtSZXNlcnZlZEtleXdvcmRzIi8+CisJCTwvVGFyZ2V0PgorCQk8VGFyZ2V0IE5hbWU9IkNsZWFuIj4KKwkJCTxDYWxsVGFyZ2V0IFRhcmdldHM9ImNsaWVudDpDbGVhbjtzZXJ2ZXI6Q2xlYW47TXVsdGlwbGV4X1Rlc3RfQ2xpZW50OkNsZWFuO011bHRpcGxleF9UZXN0X1NlcnZlcjpDbGVhbjtUZXN0U2VyaWFsaXplcjpDbGVhbjtza2lwdGVzdF92ZXJzaW9uMTpDbGVhbjtza2lwdGVzdF92ZXJzaW9uMjpDbGVhbjtUZXN0VHlwZVJlZ2lzdHJ5OkNsZWFuO0RlbHBoaVNlcnZlcjpDbGVhbjtEZWxwaGlDbGllbnQ6Q2xlYW47UmVzZXJ2ZWRLZXl3b3JkczpDbGVhbiIvPgorCQk8L1RhcmdldD4KKwkJPFRhcmdldCBOYW1lPSJNYWtlIj4KKwkJCTxDYWxsVGFyZ2V0IFRhcmdldHM9ImNsaWVudDpNYWtlO3NlcnZlcjpNYWtlO011bHRpcGxleF9UZXN0X0NsaWVudDpNYWtlO011bHRpcGxleF9UZXN0X1NlcnZlcjpNYWtlO1Rlc3RTZXJpYWxpemVyOk1ha2U7c2tpcHRlc3RfdmVyc2lvbjE6TWFrZTtza2lwdGVzdF92ZXJzaW9uMjpNYWtlO1Rlc3RUeXBlUmVnaXN0cnk6TWFrZTtEZWxwaGlTZXJ2ZXI6TWFrZTtEZWxwaGlDbGllbnQ6TWFrZTtSZXNlcnZlZEtleXdvcmRzOk1ha2UiLz4KKwkJPC9UYXJnZXQ+CisJCTxJbXBvcnQgQ29uZGl0aW9uPSJFeGlzdHMoJyQoQkRTKVxCaW5cQ29kZUdlYXIuR3JvdXAuVGFyZ2V0cycpIiBQcm9qZWN0PSIkKEJEUylcQmluXENvZGVHZWFyLkdyb3VwLlRhcmdldHMiLz4KKwk8L1Byb2plY3Q+CmRpZmYgLS1naXQgYS9saWIvZGVscGhpL2NvZGluZ19zdGFuZGFyZHMubWQgYi9saWIvZGVscGhpL2NvZGluZ19zdGFuZGFyZHMubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEwMzkwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZWxwaGkvY29kaW5nX3N0YW5kYXJkcy5tZApAQCAtMCwwICsxIEBACitQbGVhc2UgZm9sbG93IFtHZW5lcmFsIENvZGluZyBTdGFuZGFyZHNdKC9kb2MvY29kaW5nX3N0YW5kYXJkcy5tZCkKZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5Db25zb2xlLnBhcyBiL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5Db25zb2xlLnBhcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTUyZWViOS4uMDAwMDAwMAotLS0gYS9saWIvZGVscGhpL3NyYy9UaHJpZnQuQ29uc29sZS5wYXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotKCoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqKQotCi11bml0IFRocmlmdC5Db25zb2xlOwotCi1pbnRlcmZhY2UKLQotdXNlcwotICBTdGRDdHJsczsKLQotdHlwZQotICBUVGhyaWZ0Q29uc29sZSA9IGNsYXNzCi0gIHB1YmxpYwotICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgUzogc3RyaW5nKTsgdmlydHVhbDsKLSAgICBwcm9jZWR1cmUgV3JpdGVMaW5lKCBjb25zdCBTOiBzdHJpbmcpOyB2aXJ0dWFsOwotICBlbmQ7Ci0KLSAgVEdVSUNvbnNvbGUgPSBjbGFzcyggVFRocmlmdENvbnNvbGUgKQotICBwcml2YXRlCi0gICAgRkxpbmVCcmVhayA6IEJvb2xlYW47Ci0gICAgRk1lbW8gOiBUTWVtbzsKLQotICAgIHByb2NlZHVyZSBJbnRlcm5hbFdyaXRlKCBjb25zdCBTOiBzdHJpbmc7IGJXcml0ZUxpbmU6IEJvb2xlYW4pOwotICBwdWJsaWMKLSAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IFM6IHN0cmluZyk7IG92ZXJyaWRlOwotICAgIHByb2NlZHVyZSBXcml0ZUxpbmUoIGNvbnN0IFM6IHN0cmluZyk7IG92ZXJyaWRlOwotICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggQU1lbW86IFRNZW1vKTsKLSAgZW5kOwotCi1mdW5jdGlvbiBDb25zb2xlOiBUVGhyaWZ0Q29uc29sZTsKLXByb2NlZHVyZSBDaGFuZ2VDb25zb2xlKCBBQ29uc29sZTogVFRocmlmdENvbnNvbGUgKTsKLXByb2NlZHVyZSBSZXN0b3JlQ29uc29sZVRvRGVmYXVsdDsKLQotaW1wbGVtZW50YXRpb24KLQotdmFyCi0gIEZEZWZhdWx0Q29uc29sZSA6IFRUaHJpZnRDb25zb2xlOwotICBGQ29uc29sZSA6IFRUaHJpZnRDb25zb2xlOwotCi1mdW5jdGlvbiBDb25zb2xlOiBUVGhyaWZ0Q29uc29sZTsKLWJlZ2luCi0gIFJlc3VsdCA6PSBGQ29uc29sZTsKLWVuZDsKLQoteyBUVGhyaWZ0Q29uc29sZSB9Ci0KLXByb2NlZHVyZSBUVGhyaWZ0Q29uc29sZS5Xcml0ZShjb25zdCBTOiBzdHJpbmcpOwotYmVnaW4KLSAgU3lzdGVtLldyaXRlKCBTICk7Ci1lbmQ7Ci0KLXByb2NlZHVyZSBUVGhyaWZ0Q29uc29sZS5Xcml0ZUxpbmUoY29uc3QgUzogc3RyaW5nKTsKLWJlZ2luCi0gIFN5c3RlbS5Xcml0ZWxuKCBTICk7Ci1lbmQ7Ci0KLXByb2NlZHVyZSBDaGFuZ2VDb25zb2xlKCBBQ29uc29sZTogVFRocmlmdENvbnNvbGUgKTsKLWJlZ2luCi0gIEZDb25zb2xlIDo9IEFDb25zb2xlOwotZW5kOwotCi1wcm9jZWR1cmUgUmVzdG9yZUNvbnNvbGVUb0RlZmF1bHQ7Ci1iZWdpbgotICBGQ29uc29sZSA6PSBGRGVmYXVsdENvbnNvbGU7Ci1lbmQ7Ci0KLXsgVEdVSUNvbnNvbGUgfQotCi1jb25zdHJ1Y3RvciBUR1VJQ29uc29sZS5DcmVhdGUoIEFNZW1vOiBUTWVtbyk7Ci1iZWdpbgotICBpbmhlcml0ZWQgQ3JlYXRlOwotICBGTWVtbyA6PSBBTWVtbzsKLSAgRkxpbmVCcmVhayA6PSBUcnVlOwotZW5kOwotCi1wcm9jZWR1cmUgVEdVSUNvbnNvbGUuSW50ZXJuYWxXcml0ZShjb25zdCBTOiBzdHJpbmc7IGJXcml0ZUxpbmU6IEJvb2xlYW4pOwotdmFyCi0gIGlkeCA6IEludGVnZXI7Ci1iZWdpbgotICBpZiBGTGluZUJyZWFrIHRoZW4KLSAgYmVnaW4KLSAgICBGTWVtby5MaW5lcy5BZGQoIFMgKTsKLSAgZW5kIGVsc2UKLSAgYmVnaW4KLSAgICBpZHggOj0gRk1lbW8uTGluZXMuQ291bnQgLSAxOwotICAgIGlmIGlkeCA8IDAgdGhlbgotICAgIGJlZ2luCi0gICAgICBGTWVtby5MaW5lcy5BZGQoIFMgKTsKLSAgICBlbmQ7Ci0gICAgRk1lbW8uTGluZXNbaWR4XSA6PSBGTWVtby5MaW5lc1tpZHhdICsgUzsKLSAgZW5kOwotICBGTGluZUJyZWFrIDo9IGJXcml0ZUxpbmU7Ci1lbmQ7Ci0KLXByb2NlZHVyZSBUR1VJQ29uc29sZS5Xcml0ZShjb25zdCBTOiBzdHJpbmcpOwotYmVnaW4KLSAgSW50ZXJuYWxXcml0ZSggUywgRmFsc2UpOwotZW5kOwotCi1wcm9jZWR1cmUgVEdVSUNvbnNvbGUuV3JpdGVMaW5lKGNvbnN0IFM6IHN0cmluZyk7Ci1iZWdpbgotICBJbnRlcm5hbFdyaXRlKCBTLCBUcnVlKTsKLWVuZDsKLQotaW5pdGlhbGl6YXRpb24KLWJlZ2luCi0gIEZEZWZhdWx0Q29uc29sZSA6PSBUVGhyaWZ0Q29uc29sZS5DcmVhdGU7Ci0gIEZDb25zb2xlIDo9IEZEZWZhdWx0Q29uc29sZTsKLWVuZDsKLQotZmluYWxpemF0aW9uCi1iZWdpbgotICBGRGVmYXVsdENvbnNvbGUuRnJlZTsKLWVuZDsKLQotZW5kLgotCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3NyYy9UaHJpZnQuRGVmaW5lcy5pbmMgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuRGVmaW5lcy5pbmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk5Y2NhZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5EZWZpbmVzLmluYwpAQCAtMCwwICsxLDUwIEBACisoKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICopCisKKworLy8gR29vZCBsaXN0cyBvZiBEZWxwaGkgdmVyc2lvbiBudW1iZXJzCisvLyBodHRwczovL2dpdGh1Yi5jb20vcHJvamVjdC1qZWRpL2plZGkvYmxvYi9tYXN0ZXIvamVkaS5pbmMKKy8vIGh0dHA6Ly9kb2N3aWtpLmVtYmFyY2FkZXJvLmNvbS9SQURTdHVkaW8vU2VhdHRsZS9lbi9Db21waWxlcl9WZXJzaW9ucworCisKKy8vIHN0YXJ0IHdpdGggbW9zdCBiYWNrd2FyZHMgY29tcGF0aWJsZSBkZWZhdWx0cworCit7JERFRklORSBPTERfVU5JVF9OQU1FU30KK3skREVGSU5FIE9MRF9TT0NLRVRTfSAgICAgIC8vIFRPRE86IGFkZCBzb2NrZXQgc3VwcG9ydCBmb3IgQ29tcGlsZXJWZXJzaW9uID49IDI4LjAKK3skVU5ERUYgSEFWRV9DTEFTU19DVE9SfQorCisKKy8vIGVuYWJsZSBmZWF0dXJlcyBhcyB0aGV5IGFyZSBhdmFpbGFibGUKKworeyRJRiBDb21waWxlclZlcnNpb24gPj0gMjEuMH0gICAvLyBEZWxwaGkgMjAxMAorICB7JERFRklORSBIQVZFX0NMQVNTX0NUT1J9Cit7JElGRU5EfQorCit7JElGIENvbXBpbGVyVmVyc2lvbiA+PSAyMy4wfSAgIC8vIERlbHBoaSBYRTIKKyAgeyRVTkRFRiBPTERfVU5JVF9OQU1FU30KK3skSUZFTkR9CisKK3skSUYgQ29tcGlsZXJWZXJzaW9uID49IDI4LjB9ICAgLy8gRGVscGhpIFhFNworICB7JFVOREVGIE9MRF9TT0NLRVRTfQoreyRJRkVORH0KKworCisvLyBFT0YKKworCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3NyYy9UaHJpZnQuRXhjZXB0aW9uLnBhcyBiL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5FeGNlcHRpb24ucGFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkMTVjMzYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuRXhjZXB0aW9uLnBhcwpAQCAtMCwwICsxLDYyIEBACisoKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICopCisKK3skU0NPUEVERU5VTVMgT059CisKK3VuaXQgVGhyaWZ0LkV4Y2VwdGlvbjsKKworaW50ZXJmYWNlCisKK3VzZXMKKyAgQ2xhc3NlcywgU3lzVXRpbHM7CisKK3R5cGUKKyAgLy8gYmFzZSBjbGFzcyBmb3IgYWxsIFRocmlmdCBleGNlcHRpb25zCisgIFRFeGNlcHRpb24gPSBjbGFzcyggU3lzVXRpbHMuRXhjZXB0aW9uKQorICBwdWJsaWMKKyAgICBmdW5jdGlvbiBNZXNzYWdlIDogc3RyaW5nOyAgICAgICAgLy8gaGlkZSBpbmhlcml0ZWQgcHJvcGVydHk6IGFsbG93IHJlYWQsIGJ1dCBwcmV2ZW50IGFjY2lkZW50YWwgd3JpdGVzCisgICAgcHJvY2VkdXJlIFVwZGF0ZU1lc3NhZ2VQcm9wZXJ0eTsgIC8vIHVwZGF0ZSBpbmhlcml0ZWQgbWVzc2FnZSBwcm9wZXJ0eSB3aXRoIHRvU3RyaW5nKCkKKyAgZW5kOworCisKKworCitpbXBsZW1lbnRhdGlvbgorCit7IFRFeGNlcHRpb24gfQorCitmdW5jdGlvbiBURXhjZXB0aW9uLk1lc3NhZ2U7CisvLyBhbGxvdyByZWFkIChleGNlcHRpb24gc3VtbWFyeSksIGJ1dCBwcmV2ZW50IGFjY2lkZW50YWwgd3JpdGVzCisvLyByZWFkIHdpbGwgcmV0dXJuIHRoZSBleGNlcHRpb24gc3VtbWFyeQorYmVnaW4KKyAgcmVzdWx0IDo9IFNlbGYuVG9TdHJpbmc7CitlbmQ7CisKK3Byb2NlZHVyZSBURXhjZXB0aW9uLlVwZGF0ZU1lc3NhZ2VQcm9wZXJ0eTsKKy8vIFVwZGF0ZSB0aGUgaW5oZXJpdGVkIE1lc3NhZ2UgcHJvcGVydHkgdG8gYmV0dGVyIGNvbmZvcm0gdG8gc3RhbmRhcmQgYmVoYXZpb3VyLgorLy8gTmljZSBiZW5lZml0OiBUaGUgSURFIGlzIG5vdyBhYmxlIHRvIHNob3cgdGhlIGV4Y2VwdGlvbiBtZXNzYWdlIGFnYWluLgorYmVnaW4KKyAgaW5oZXJpdGVkIE1lc3NhZ2UgOj0gU2VsZi5Ub1N0cmluZzsgIC8vIHByb2R1Y2VzIGEgc3VtbWFyeSB0ZXh0CitlbmQ7CisKKworCisKK2VuZC4KKwpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlByb2Nlc3Nvci5NdWx0aXBsZXgucGFzIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlByb2Nlc3Nvci5NdWx0aXBsZXgucGFzCmluZGV4IGY2ZDk0NDYuLjhjZjIzZGIgMTAwNjQ0Ci0tLSBhL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5Qcm9jZXNzb3IuTXVsdGlwbGV4LnBhcworKysgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuUHJvY2Vzc29yLk11bHRpcGxleC5wYXMKQEAgLTUzLDExICs1MywxMSBAQAogCiB0eXBlCiAgIElNdWx0aXBsZXhlZFByb2Nlc3NvciA9IGludGVyZmFjZSggSVByb2Nlc3NvcikKLSAgICBbJ3s4MTBGRjMyRC0yMkEyLTRENTgtQjEyOS1CMDU5MDcwM0VDRUN9J10KKyAgICBbJ3s4MDdGOUQxOS02Q0Y0LTQ3ODktODQwRS05M0U4N0ExMkVCNjN9J10KICAgICAvLyBSZWdpc3RlciBhIHNlcnZpY2Ugd2l0aCB0aGlzIFRNdWx0aXBsZXhlZFByb2Nlc3Nvci4gIFRoaXMgYWxsb3dzIHVzCiAgICAgLy8gdG8gYnJva2VyIHJlcXVlc3RzIHRvIGluZGl2aWR1YWwgc2VydmljZXMgYnkgdXNpbmcgdGhlIHNlcnZpY2UgbmFtZQogICAgIC8vIHRvIHNlbGVjdCB0aGVtIGF0IHJlcXVlc3QgdGltZS4KLSAgICBwcm9jZWR1cmUgUmVnaXN0ZXJQcm9jZXNzb3IoIGNvbnN0IHNlcnZpY2VOYW1lIDogU3RyaW5nOyBjb25zdCBwcm9jZXNzb3IgOiBJUHJvY2Vzc29yKTsKKyAgICBwcm9jZWR1cmUgUmVnaXN0ZXJQcm9jZXNzb3IoIGNvbnN0IHNlcnZpY2VOYW1lIDogU3RyaW5nOyBjb25zdCBwcm9jZXNzb3IgOiBJUHJvY2Vzc29yOyBjb25zdCBhc0RlZmF1bHQgOiBCb29sZWFuID0gRkFMU0UpOwogICBlbmQ7CiAKIApAQCAtNjgsMTcgKzY4LDE4IEBACiAgICAgLy8gdGhlIHN0YW5kYXJkIGZvcm1hdCwgd2l0aG91dCB0aGUgc2VydmljZSBuYW1lIHByZXBlbmRlZCB0byBUTWVzc2FnZS5uYW1lLgogICAgIFRTdG9yZWRNZXNzYWdlUHJvdG9jb2wgPSBjbGFzcyggVFByb3RvY29sRGVjb3JhdG9yKQogICAgIHByaXZhdGUKLSAgICAgIEZNZXNzYWdlQmVnaW4gOiBJTWVzc2FnZTsKKyAgICAgIEZNZXNzYWdlQmVnaW4gOiBUVGhyaWZ0TWVzc2FnZTsKICAgICBwdWJsaWMKLSAgICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgcHJvdG9jb2wgOiBJUHJvdG9jb2w7IGNvbnN0IGFNc2dCZWdpbiA6IElNZXNzYWdlKTsKLSAgICAgIGZ1bmN0aW9uIFJlYWRNZXNzYWdlQmVnaW46IElNZXNzYWdlOyBvdmVycmlkZTsKKyAgICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgcHJvdG9jb2wgOiBJUHJvdG9jb2w7IGNvbnN0IGFNc2dCZWdpbiA6IFRUaHJpZnRNZXNzYWdlKTsKKyAgICAgIGZ1bmN0aW9uIFJlYWRNZXNzYWdlQmVnaW46IFRUaHJpZnRNZXNzYWdlOyBvdmVycmlkZTsKICAgICBlbmQ7CiAKICAgcHJpdmF0ZQogICAgIEZTZXJ2aWNlUHJvY2Vzc29yTWFwIDogVERpY3Rpb25hcnk8U3RyaW5nLCBJUHJvY2Vzc29yPjsKKyAgICBGRGVmYXVsdFByb2Nlc3NvciA6IElQcm9jZXNzb3I7CiAKLSAgICBwcm9jZWR1cmUgRXJyb3IoIGNvbnN0IG9wcm90IDogSVByb3RvY29sOyBjb25zdCBtc2cgOiBJTWVzc2FnZTsKLSAgICAgICAgICAgICAgICAgICAgIGV4dHlwZSA6IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5URXhjZXB0aW9uVHlwZTsgY29uc3QgZXR4dCA6IHN0cmluZyk7CisgICAgcHJvY2VkdXJlIEVycm9yKCBjb25zdCBvcHJvdCA6IElQcm90b2NvbDsgY29uc3QgbXNnIDogVFRocmlmdE1lc3NhZ2U7CisgICAgICAgICAgICAgICAgICAgICBleHR5cGUgOiBUQXBwbGljYXRpb25FeGNlcHRpb25TcGVjaWFsaXplZENsYXNzOyBjb25zdCBldHh0IDogc3RyaW5nKTsKIAogICBwdWJsaWMKICAgICBjb25zdHJ1Y3RvciBDcmVhdGU7CkBAIC04Nyw3ICs4OCw3IEBACiAgICAgLy8gUmVnaXN0ZXIgYSBzZXJ2aWNlIHdpdGggdGhpcyBUTXVsdGlwbGV4ZWRQcm9jZXNzb3JJbXBsLiAgVGhpcyBhbGxvd3MgdXMKICAgICAvLyB0byBicm9rZXIgcmVxdWVzdHMgdG8gaW5kaXZpZHVhbCBzZXJ2aWNlcyBieSB1c2luZyB0aGUgc2VydmljZSBuYW1lCiAgICAgLy8gdG8gc2VsZWN0IHRoZW0gYXQgcmVxdWVzdCB0aW1lLgotICAgIHByb2NlZHVyZSBSZWdpc3RlclByb2Nlc3NvciggY29uc3Qgc2VydmljZU5hbWUgOiBTdHJpbmc7IGNvbnN0IHByb2Nlc3NvciA6IElQcm9jZXNzb3IpOworICAgIHByb2NlZHVyZSBSZWdpc3RlclByb2Nlc3NvciggY29uc3Qgc2VydmljZU5hbWUgOiBTdHJpbmc7IGNvbnN0IHByb2Nlc3NvciA6IElQcm9jZXNzb3I7IGNvbnN0IGFzRGVmYXVsdCA6IEJvb2xlYW4gPSBGQUxTRSk7CiAKICAgICB7IFRoaXMgaW1wbGVtZW50YXRpb24gb2YgcHJvY2VzcyBwZXJmb3JtcyB0aGUgZm9sbG93aW5nIHN0ZXBzOgogICAgICAgLSBSZWFkIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG1lc3NhZ2UuCkBAIC0xMDUsMTQgKzEwNiwxNCBAQAogCiBpbXBsZW1lbnRhdGlvbgogCi1jb25zdHJ1Y3RvciBUTXVsdGlwbGV4ZWRQcm9jZXNzb3JJbXBsLlRTdG9yZWRNZXNzYWdlUHJvdG9jb2wuQ3JlYXRlKCBjb25zdCBwcm90b2NvbCA6IElQcm90b2NvbDsgY29uc3QgYU1zZ0JlZ2luIDogSU1lc3NhZ2UpOworY29uc3RydWN0b3IgVE11bHRpcGxleGVkUHJvY2Vzc29ySW1wbC5UU3RvcmVkTWVzc2FnZVByb3RvY29sLkNyZWF0ZSggY29uc3QgcHJvdG9jb2wgOiBJUHJvdG9jb2w7IGNvbnN0IGFNc2dCZWdpbiA6IFRUaHJpZnRNZXNzYWdlKTsKIGJlZ2luCiAgIGluaGVyaXRlZCBDcmVhdGUoIHByb3RvY29sKTsKICAgRk1lc3NhZ2VCZWdpbiA6PSBhTXNnQmVnaW47CiBlbmQ7CiAKIAotZnVuY3Rpb24gVE11bHRpcGxleGVkUHJvY2Vzc29ySW1wbC5UU3RvcmVkTWVzc2FnZVByb3RvY29sLlJlYWRNZXNzYWdlQmVnaW46IElNZXNzYWdlOworZnVuY3Rpb24gVE11bHRpcGxleGVkUHJvY2Vzc29ySW1wbC5UU3RvcmVkTWVzc2FnZVByb3RvY29sLlJlYWRNZXNzYWdlQmVnaW46IFRUaHJpZnRNZXNzYWdlOwogYmVnaW4KICAgcmVzdWx0IDo9IEZNZXNzYWdlQmVnaW47CiBlbmQ7CkBAIC0xMzUsMjEgKzEzNiwyNyBAQAogZW5kOwogCiAKLXByb2NlZHVyZSBUTXVsdGlwbGV4ZWRQcm9jZXNzb3JJbXBsLlJlZ2lzdGVyUHJvY2Vzc29yKCBjb25zdCBzZXJ2aWNlTmFtZSA6IFN0cmluZzsgY29uc3QgcHJvY2Vzc29yIDogSVByb2Nlc3Nvcik7Citwcm9jZWR1cmUgVE11bHRpcGxleGVkUHJvY2Vzc29ySW1wbC5SZWdpc3RlclByb2Nlc3NvciggY29uc3Qgc2VydmljZU5hbWUgOiBTdHJpbmc7IGNvbnN0IHByb2Nlc3NvciA6IElQcm9jZXNzb3I7IGNvbnN0IGFzRGVmYXVsdCA6IEJvb2xlYW4pOwogYmVnaW4KICAgRlNlcnZpY2VQcm9jZXNzb3JNYXAuQWRkKCBzZXJ2aWNlTmFtZSwgcHJvY2Vzc29yKTsKKworICBpZiBhc0RlZmF1bHQgdGhlbiBiZWdpbgorICAgIGlmIEZEZWZhdWx0UHJvY2Vzc29yID0gbmlsCisgICAgdGhlbiBGRGVmYXVsdFByb2Nlc3NvciA6PSBwcm9jZXNzb3IKKyAgICBlbHNlIHJhaXNlIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbkludGVybmFsRXJyb3IuQ3JlYXRlKCdPbmx5IG9uZSBkZWZhdWx0IHNlcnZpY2UgYWxsb3dlZCcpOworICBlbmQ7CiBlbmQ7CiAKIAotcHJvY2VkdXJlIFRNdWx0aXBsZXhlZFByb2Nlc3NvckltcGwuRXJyb3IoIGNvbnN0IG9wcm90IDogSVByb3RvY29sOyBjb25zdCBtc2cgOiBJTWVzc2FnZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHR5cGUgOiBUQXBwbGljYXRpb25FeGNlcHRpb24uVEV4Y2VwdGlvblR5cGU7Citwcm9jZWR1cmUgVE11bHRpcGxleGVkUHJvY2Vzc29ySW1wbC5FcnJvciggY29uc3Qgb3Byb3QgOiBJUHJvdG9jb2w7IGNvbnN0IG1zZyA6IFRUaHJpZnRNZXNzYWdlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHlwZSA6IFRBcHBsaWNhdGlvbkV4Y2VwdGlvblNwZWNpYWxpemVkQ2xhc3M7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXR4dCA6IHN0cmluZyk7CiB2YXIgYXBwZXggIDogVEFwcGxpY2F0aW9uRXhjZXB0aW9uOwotICAgIG5ld01zZyA6IElNZXNzYWdlOworICAgIG5ld01zZyA6IFRUaHJpZnRNZXNzYWdlOwogYmVnaW4KLSAgYXBwZXggOj0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkNyZWF0ZSggZXh0eXBlLCBldHh0KTsKKyAgYXBwZXggOj0gZXh0eXBlLkNyZWF0ZShldHh0KTsKICAgdHJ5Ci0gICAgbmV3TXNnIDo9IFRNZXNzYWdlSW1wbC5DcmVhdGUoIG1zZy5OYW1lLCBUTWVzc2FnZVR5cGUuRXhjZXB0aW9uLCBtc2cuU2VxSUQpOworICAgIEluaXQoIG5ld01zZywgbXNnLk5hbWUsIFRNZXNzYWdlVHlwZS5FeGNlcHRpb24sIG1zZy5TZXFJRCk7CiAKICAgICBvcHJvdC5Xcml0ZU1lc3NhZ2VCZWdpbihuZXdNc2cpOwogICAgIGFwcGV4LldyaXRlKG9wcm90KTsKQEAgLTE2Myw3ICsxNzAsNyBAQAogCiAKIGZ1bmN0aW9uIFRNdWx0aXBsZXhlZFByb2Nlc3NvckltcGwuUHJvY2Vzcyhjb25zdCBpcHJvdCwgb3Byb3QgOiBJUHJvdG9jb2w7IGNvbnN0IGV2ZW50cyA6IElQcm9jZXNzb3JFdmVudHMgPSBuaWwpOiBCb29sZWFuOwotdmFyIG1zZywgbmV3TXNnIDogSU1lc3NhZ2U7Cit2YXIgbXNnLCBuZXdNc2cgOiBUVGhyaWZ0TWVzc2FnZTsKICAgICBpZHggICAgICAgICA6IEludGVnZXI7CiAgICAgc1NlcnZpY2UgICAgOiBzdHJpbmc7CiAgICAgcHJvY2Vzc29yICAgOiBJUHJvY2Vzc29yOwpAQCAtMTc4LDM0ICsxODUsNDMgQEAKICAgbXNnIDo9IGlwcm90LnJlYWRNZXNzYWdlQmVnaW4oKTsKICAgaWYgbm90IChtc2cuVHlwZV8gaW4gW1RNZXNzYWdlVHlwZS5DYWxsLCBUTWVzc2FnZVR5cGUuT25ld2F5XSkgdGhlbiBiZWdpbgogICAgIEVycm9yKCBvcHJvdCwgbXNnLAotICAgICAgICAgICBUQXBwbGljYXRpb25FeGNlcHRpb24uVEV4Y2VwdGlvblR5cGUuSW52YWxpZE1lc3NhZ2VUeXBlLAorICAgICAgICAgICBUQXBwbGljYXRpb25FeGNlcHRpb25JbnZhbGlkTWVzc2FnZVR5cGUsCiAgICAgICAgICAgIEVSUk9SX0lOVkFMSURfTVNHVFlQRSk7CiAgICAgRXhpdCggRkFMU0UpOwogICBlbmQ7CiAKICAgLy8gRXh0cmFjdCB0aGUgc2VydmljZSBuYW1lCisgIC8vIHVzZSBGRGVmYXVsdFByb2Nlc3NvciBhcyBmYWxsYmFjayBpZiB0aGVyZSBpcyBubyBzZXBhcmF0b3IKICAgaWR4IDo9IFBvcyggVE11bHRpcGxleGVkUHJvdG9jb2wuU0VQQVJBVE9SLCBtc2cuTmFtZSk7Ci0gIGlmIGlkeCA8IDEgdGhlbiBiZWdpbgorICBpZiBpZHggPiAwIHRoZW4gYmVnaW4KKworICAgIC8vIENyZWF0ZSBhIG5ldyBUTWVzc2FnZSwgc29tZXRoaW5nIHRoYXQgY2FuIGJlIGNvbnN1bWVkIGJ5IGFueSBUUHJvdG9jb2wKKyAgICBzU2VydmljZSA6PSBDb3B5KCBtc2cuTmFtZSwgMSwgaWR4LTEpOworICAgIGlmIG5vdCBGU2VydmljZVByb2Nlc3Nvck1hcC5UcnlHZXRWYWx1ZSggc1NlcnZpY2UsIHByb2Nlc3NvcikKKyAgICB0aGVuIGJlZ2luCisgICAgICBFcnJvciggb3Byb3QsIG1zZywKKyAgICAgICAgICAgICBUQXBwbGljYXRpb25FeGNlcHRpb25JbnRlcm5hbEVycm9yLAorICAgICAgICAgICAgIEZvcm1hdChFUlJPUl9VTktOT1dOX1NFUlZJQ0UsW3NTZXJ2aWNlXSkpOworICAgICAgRXhpdCggRkFMU0UpOworICAgIGVuZDsKKworICAgIC8vIENyZWF0ZSBhIG5ldyBUTWVzc2FnZSwgcmVtb3ZpbmcgdGhlIHNlcnZpY2UgbmFtZQorICAgIEluYyggaWR4LCBMZW5ndGgoVE11bHRpcGxleGVkUHJvdG9jb2wuU0VQQVJBVE9SKSk7CisgICAgSW5pdCggbmV3TXNnLCBDb3B5KCBtc2cuTmFtZSwgaWR4LCBNQVhJTlQpLCBtc2cuVHlwZV8sIG1zZy5TZXFJRCk7CisKKyAgZW5kCisgIGVsc2UgaWYgRkRlZmF1bHRQcm9jZXNzb3IgPD4gbmlsIHRoZW4gYmVnaW4KKyAgICBwcm9jZXNzb3IgOj0gRkRlZmF1bHRQcm9jZXNzb3I7CisgICAgbmV3TXNnICAgIDo9IG1zZzsgIC8vIG5vIG5lZWQgdG8gY2hhbmdlCisKKyAgZW5kCisgIGVsc2UgYmVnaW4KICAgICBFcnJvciggb3Byb3QsIG1zZywKLSAgICAgICAgICAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uLlRFeGNlcHRpb25UeXBlLkludmFsaWRQcm90b2NvbCwKKyAgICAgICAgICAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uSW52YWxpZFByb3RvY29sLAogICAgICAgICAgICBGb3JtYXQoRVJST1JfSU5DT01QQVRJQkxFX1BST1QsW21zZy5OYW1lXSkpOwogICAgIEV4aXQoIEZBTFNFKTsKICAgZW5kOwogCi0gIC8vIENyZWF0ZSBhIG5ldyBUTWVzc2FnZSwgc29tZXRoaW5nIHRoYXQgY2FuIGJlIGNvbnN1bWVkIGJ5IGFueSBUUHJvdG9jb2wKLSAgc1NlcnZpY2UgOj0gQ29weSggbXNnLk5hbWUsIDEsIGlkeC0xKTsKLSAgaWYgbm90IEZTZXJ2aWNlUHJvY2Vzc29yTWFwLlRyeUdldFZhbHVlKCBzU2VydmljZSwgcHJvY2Vzc29yKQotICB0aGVuIGJlZ2luCi0gICAgRXJyb3IoIG9wcm90LCBtc2csCi0gICAgICAgICAgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5URXhjZXB0aW9uVHlwZS5JbnRlcm5hbEVycm9yLAotICAgICAgICAgICBGb3JtYXQoRVJST1JfVU5LTk9XTl9TRVJWSUNFLFtzU2VydmljZV0pKTsKLSAgICBFeGl0KCBGQUxTRSk7Ci0gIGVuZDsKLQotICAvLyBDcmVhdGUgYSBuZXcgVE1lc3NhZ2UsIHJlbW92aW5nIHRoZSBzZXJ2aWNlIG5hbWUKLSAgSW5jKCBpZHgsIExlbmd0aChUTXVsdGlwbGV4ZWRQcm90b2NvbC5TRVBBUkFUT1IpKTsKLSAgbmV3TXNnIDo9IFRNZXNzYWdlSW1wbC5DcmVhdGUoIENvcHkoIG1zZy5OYW1lLCBpZHgsIE1BWElOVCksIG1zZy5UeXBlXywgbXNnLlNlcUlEKTsKLQogICAvLyBEaXNwYXRjaCBwcm9jZXNzaW5nIHRvIHRoZSBzdG9yZWQgcHJvY2Vzc29yCiAgIHByb3RvY29sIDo9IFRTdG9yZWRNZXNzYWdlUHJvdG9jb2wuQ3JlYXRlKCBpcHJvdCwgbmV3TXNnKTsKICAgcmVzdWx0ICAgOj0gcHJvY2Vzc29yLnByb2Nlc3MoIHByb3RvY29sLCBvcHJvdCwgZXZlbnRzKTsKQEAgLTIxMyw0ICsyMjksMyBAQAogCiAKIGVuZC4KLQpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlByb3RvY29sLkNvbXBhY3QucGFzIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlByb3RvY29sLkNvbXBhY3QucGFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjMWIzZGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuUHJvdG9jb2wuQ29tcGFjdC5wYXMKQEAgLTAsMCArMSwxMTE3IEBACisoKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICopCisKK3skU0NPUEVERU5VTVMgT059CisKK3VuaXQgVGhyaWZ0LlByb3RvY29sLkNvbXBhY3Q7CisKK2ludGVyZmFjZQorCit1c2VzCisgIENsYXNzZXMsCisgIFN5c1V0aWxzLAorICBNYXRoLAorICBHZW5lcmljcy5Db2xsZWN0aW9ucywKKyAgVGhyaWZ0LlRyYW5zcG9ydCwKKyAgVGhyaWZ0LlByb3RvY29sLAorICBUaHJpZnQuVXRpbHM7CisKK3R5cGUKKyAgSUNvbXBhY3RQcm90b2NvbCA9IGludGVyZmFjZSggSVByb3RvY29sKQorICAgIFsne0MwMTkyN0VDLTAyMUEtNDVGNy05M0IxLTIzRDZBNTQyMEVERH0nXQorICBlbmQ7CisKKyAgLy8gQ29tcGFjdCBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhyaWZ0LgorICAvLyBBZGFwdGVkIGZyb20gdGhlIEMjIHZlcnNpb24uCisgIFRDb21wYWN0UHJvdG9jb2xJbXBsID0gY2xhc3MoIFRQcm90b2NvbEltcGwsIElDb21wYWN0UHJvdG9jb2wpCisgIHB1YmxpYworICAgIHR5cGUKKyAgICAgIFRGYWN0b3J5ID0gY2xhc3MoIFRJbnRlcmZhY2VkT2JqZWN0LCBJUHJvdG9jb2xGYWN0b3J5KQorICAgICAgcHVibGljCisgICAgICAgIGZ1bmN0aW9uIEdldFByb3RvY29sKCBjb25zdCB0cmFuczogSVRyYW5zcG9ydCk6IElQcm90b2NvbDsKKyAgICAgIGVuZDsKKworICBwcml2YXRlIGNvbnN0CisKKyAgICB7IFRPRE8KKyAgICBzdGF0aWMgVFN0cnVjdCBBTk9OWU1PVVNfU1RSVUNUID0gbmV3IFRTdHJ1Y3QoIiIpOworICAgIHN0YXRpYyBURmllbGQgVFNUT1AgPSBuZXcgVEZpZWxkKCIiLCBUVHlwZS5TdG9wLCAoc2hvcnQpMCk7CisgICAgfQorCisgICAgUFJPVE9DT0xfSUQgICAgICAgPSBCeXRlKCAkODIpOworICAgIFZFUlNJT04gICAgICAgICAgID0gQnl0ZSggMSk7CisgICAgVkVSU0lPTl9NQVNLICAgICAgPSBCeXRlKCAkMUYpOyAvLyAwMDAxIDExMTEKKyAgICBUWVBFX01BU0sgICAgICAgICA9IEJ5dGUoICRFMCk7IC8vIDExMTAgMDAwMAorICAgIFRZUEVfQklUUyAgICAgICAgID0gQnl0ZSggJDA3KTsgLy8gMDAwMCAwMTExCisgICAgVFlQRV9TSElGVF9BTU9VTlQgPSBCeXRlKCA1KTsKKworICBwcml2YXRlIHR5cGUKKyAgICAvLyBBbGwgb2YgdGhlIG9uLXdpcmUgdHlwZSBjb2Rlcy4KKyAgICBUeXBlcyA9ICgKKyAgICAgIFNUT1AgICAgICAgICAgPSAkMDAsCisgICAgICBCT09MRUFOX1RSVUUgID0gJDAxLAorICAgICAgQk9PTEVBTl9GQUxTRSA9ICQwMiwKKyAgICAgIEJZVEVfICAgICAgICAgPSAkMDMsCisgICAgICBJMTYgICAgICAgICAgID0gJDA0LAorICAgICAgSTMyICAgICAgICAgICA9ICQwNSwKKyAgICAgIEk2NCAgICAgICAgICAgPSAkMDYsCisgICAgICBET1VCTEVfICAgICAgID0gJDA3LAorICAgICAgQklOQVJZICAgICAgICA9ICQwOCwKKyAgICAgIExJU1QgICAgICAgICAgPSAkMDksCisgICAgICBTRVRfICAgICAgICAgID0gJDBBLAorICAgICAgTUFQICAgICAgICAgICA9ICQwQiwKKyAgICAgIFNUUlVDVCAgICAgICAgPSAkMEMKKyAgICApOworCisgIHByaXZhdGUgY29uc3QKKyAgICB0dHlwZVRvQ29tcGFjdFR5cGUgOiBhcnJheVtUVHlwZV0gb2YgVHlwZXMgPSAoCisgICAgICBUeXBlcy5TVE9QLCAgICAgICAgICAgLy8gU3RvcCAgICA9IDAsCisgICAgICBUeXBlcygtMSksICAgICAgICAgICAgLy8gVm9pZCAgICA9IDEsCisgICAgICBUeXBlcy5CT09MRUFOX1RSVUUsICAgLy8gQm9vbF8gICA9IDIsCisgICAgICBUeXBlcy5CWVRFXywgICAgICAgICAgLy8gQnl0ZV8gICA9IDMsCisgICAgICBUeXBlcy5ET1VCTEVfLCAgICAgICAgLy8gRG91YmxlXyA9IDQsCisgICAgICBUeXBlcygtNSksICAgICAgICAgICAgLy8gdW51c2VkCisgICAgICBUeXBlcy5JMTYsICAgICAgICAgICAgLy8gSTE2ICAgICA9IDYsCisgICAgICBUeXBlcygtNyksICAgICAgICAgICAgLy8gdW51c2VkCisgICAgICBUeXBlcy5JMzIsICAgICAgICAgICAgLy8gSTMyICAgICA9IDgsCisgICAgICBUeXBlcygtOSksICAgICAgICAgICAgLy8gdW51c2VkCisgICAgICBUeXBlcy5JNjQsICAgICAgICAgICAgLy8gSTY0ICAgICA9IDEwLAorICAgICAgVHlwZXMuQklOQVJZLCAgICAgICAgIC8vIFN0cmluZ18gPSAxMSwKKyAgICAgIFR5cGVzLlNUUlVDVCwgICAgICAgICAvLyBTdHJ1Y3QgID0gMTIsCisgICAgICBUeXBlcy5NQVAsICAgICAgICAgICAgLy8gTWFwICAgICA9IDEzLAorICAgICAgVHlwZXMuU0VUXywgICAgICAgICAgIC8vIFNldF8gICAgPSAxNCwKKyAgICAgIFR5cGVzLkxJU1QgICAgICAgICAgICAvLyBMaXN0ICAgID0gMTUsCisgICAgKTsKKworICAgIHRjb21wYWN0VHlwZVRvVHlwZSA6IGFycmF5W1R5cGVzXSBvZiBUVHlwZSA9ICgKKyAgICAgIFRUeXBlLlN0b3AsICAgICAgIC8vIFNUT1AKKyAgICAgIFRUeXBlLkJvb2xfLCAgICAgIC8vIEJPT0xFQU5fVFJVRQorICAgICAgVFR5cGUuQm9vbF8sICAgICAgLy8gQk9PTEVBTl9GQUxTRQorICAgICAgVFR5cGUuQnl0ZV8sICAgICAgLy8gQllURV8KKyAgICAgIFRUeXBlLkkxNiwgICAgICAgIC8vIEkxNgorICAgICAgVFR5cGUuSTMyLCAgICAgICAgLy8gSTMyCisgICAgICBUVHlwZS5JNjQsICAgICAgICAvLyBJNjQKKyAgICAgIFRUeXBlLkRvdWJsZV8sICAgIC8vIERPVUJMRV8KKyAgICAgIFRUeXBlLlN0cmluZ18sICAgIC8vIEJJTkFSWQorICAgICAgVFR5cGUuTGlzdCwgICAgICAgLy8gTElTVAorICAgICAgVFR5cGUuU2V0XywgICAgICAgLy8gU0VUXworICAgICAgVFR5cGUuTWFwLCAgICAgICAgLy8gTUFQCisgICAgICBUVHlwZS5TdHJ1Y3QgICAgICAvLyBTVFJVQ1QKKyAgICApOworCisgIHByaXZhdGUKKyAgICAvLyBVc2VkIHRvIGtlZXAgdHJhY2sgb2YgdGhlIGxhc3QgZmllbGQgZm9yIHRoZSBjdXJyZW50IGFuZCBwcmV2aW91cyBzdHJ1Y3RzLAorICAgIC8vIHNvIHdlIGNhbiBkbyB0aGUgZGVsdGEgc3R1ZmYuCisgICAgbGFzdEZpZWxkXyA6IFRTdGFjazxJbnRlZ2VyPjsKKyAgICBsYXN0RmllbGRJZF8gOiBJbnRlZ2VyOworCisgICAgLy8gSWYgd2UgZW5jb3VudGVyIGEgYm9vbGVhbiBmaWVsZCBiZWdpbiwgc2F2ZSB0aGUgVEZpZWxkIGhlcmUgc28gaXQgY2FuCisgICAgLy8gaGF2ZSB0aGUgdmFsdWUgaW5jb3Jwb3JhdGVkLgorICAgIHByaXZhdGUgYm9vbGVhbkZpZWxkXyA6IFRUaHJpZnRGaWVsZDsKKworICAgIC8vIElmIHdlIFJlYWQgYSBmaWVsZCBoZWFkZXIsIGFuZCBpdCdzIGEgYm9vbGVhbiBmaWVsZCwgc2F2ZSB0aGUgYm9vbGVhbgorICAgIC8vIHZhbHVlIGhlcmUgc28gdGhhdCBSZWFkQm9vbCBjYW4gdXNlIGl0LgorICAgIHByaXZhdGUgIGJvb2xWYWx1ZV8gIDogKCB1bnVzZWQsIGJvb2xfdHJ1ZSwgYm9vbF9mYWxzZSk7CisKKyAgcHVibGljCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKGNvbnN0IHRyYW5zIDogSVRyYW5zcG9ydCk7CisgICAgZGVzdHJ1Y3RvciBEZXN0cm95OyAgb3ZlcnJpZGU7CisKKyAgICBwcm9jZWR1cmUgUmVzZXQ7CisKKyAgcHJpdmF0ZQorICAgIHByb2NlZHVyZSBXcml0ZUJ5dGVEaXJlY3QoIGNvbnN0IGIgOiBCeXRlKTsgIG92ZXJsb2FkOworCisgICAgLy8gV3JpdGVzIGEgYnl0ZSB3aXRob3V0IGFueSBwb3NzaWJpbGl0eSBvZiBhbGwgdGhhdCBmaWVsZCBoZWFkZXIgbm9uc2Vuc2UuCisgICAgcHJvY2VkdXJlIFdyaXRlQnl0ZURpcmVjdCggY29uc3QgbiA6IEludGVnZXIpOyAgb3ZlcmxvYWQ7CisKKyAgICAvLyBXcml0ZSBhbiBpMzIgYXMgYSB2YXJpbnQuIFJlc3VsdHMgaW4gMS01IGJ5dGVzIG9uIHRoZSB3aXJlLgorICAgIC8vIFRPRE86IG1ha2UgYSBwZXJtYW5lbnQgYnVmZmVyIGxpa2UgV3JpdGVWYXJpbnQ2ND8KKyAgICBwcm9jZWR1cmUgV3JpdGVWYXJpbnQzMiggbiA6IENhcmRpbmFsKTsKKworICBwcml2YXRlCisgICAgLy8gVGhlIHdvcmtob3JzZSBvZiBXcml0ZUZpZWxkQmVnaW4uIEl0IGhhcyB0aGUgb3B0aW9uIG9mIGRvaW5nIGEgJ3R5cGUgb3ZlcnJpZGUnCisgICAgLy8gb2YgdGhlIHR5cGUgaGVhZGVyLiBUaGlzIGlzIHVzZWQgc3BlY2lmaWNhbGx5IGluIHRoZSBib29sZWFuIGZpZWxkIGNhc2UuCisgICAgcHJvY2VkdXJlIFdyaXRlRmllbGRCZWdpbkludGVybmFsKCBjb25zdCBmaWVsZCA6IFRUaHJpZnRGaWVsZDsgdHlwZU92ZXJyaWRlIDogQnl0ZSk7CisKKyAgcHVibGljCisgICAgcHJvY2VkdXJlIFdyaXRlTWVzc2FnZUJlZ2luKCBjb25zdCBtc2c6IFRUaHJpZnRNZXNzYWdlKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlTWVzc2FnZUVuZDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlU3RydWN0QmVnaW4oIGNvbnN0IHN0cnVjOiBUVGhyaWZ0U3RydWN0KTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlU3RydWN0RW5kOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVGaWVsZEJlZ2luKCBjb25zdCBmaWVsZDogVFRocmlmdEZpZWxkKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlRmllbGRFbmQ7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUZpZWxkU3RvcDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlTWFwQmVnaW4oIGNvbnN0IG1hcDogVFRocmlmdE1hcCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZU1hcEVuZDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlTGlzdEJlZ2luKCBjb25zdCBsaXN0OiBUVGhyaWZ0TGlzdCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUxpc3RFbmQoKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlU2V0QmVnaW4oIGNvbnN0IHNldF86IFRUaHJpZnRTZXQgKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlU2V0RW5kKCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUJvb2woIGI6IEJvb2xlYW4pOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVCeXRlKCBiOiBTaG9ydEludCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUkxNiggaTE2OiBTbWFsbEludCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUkzMiggaTMyOiBJbnRlZ2VyKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlSTY0KCBjb25zdCBpNjQ6IEludDY0KTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlRG91YmxlKCBjb25zdCBkdWI6IERvdWJsZSk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUJpbmFyeSggY29uc3QgYjogVEJ5dGVzKTsgb3ZlcmxvYWQ7IG92ZXJyaWRlOworCisgIHByaXZhdGUKKyAgICBjbGFzcyBmdW5jdGlvbiAgRG91YmxlVG9JbnQ2NEJpdHMoIGNvbnN0IGRiIDogRG91YmxlKSA6IEludDY0OworICAgIGNsYXNzIGZ1bmN0aW9uICBJbnQ2NEJpdHNUb0RvdWJsZSggY29uc3QgaTY0IDogSW50NjQpIDogRG91YmxlOworCisgICAgLy8gQWJzdHJhY3QgbWV0aG9kIGZvciB3cml0aW5nIHRoZSBzdGFydCBvZiBsaXN0cyBhbmQgc2V0cy4gTGlzdCBhbmQgc2V0cyBvbgorICAgIC8vIHRoZSB3aXJlIGRpZmZlciBvbmx5IGJ5IHRoZSB0eXBlIGluZGljYXRvci4KKyAgICBwcm9jZWR1cmUgV3JpdGVDb2xsZWN0aW9uQmVnaW4oIGNvbnN0IGVsZW1UeXBlIDogVFR5cGU7IHNpemUgOiBJbnRlZ2VyKTsKKworICAgIHByb2NlZHVyZSBXcml0ZVZhcmludDY0KCBuIDogVUludDY0KTsKKworICAgIC8vIENvbnZlcnQgbCBpbnRvIGEgemlnemFnIGxvbmcuIFRoaXMgYWxsb3dzIG5lZ2F0aXZlIG51bWJlcnMgdG8gYmUKKyAgICAvLyByZXByZXNlbnRlZCBjb21wYWN0bHkgYXMgYSB2YXJpbnQuCisgICAgY2xhc3MgZnVuY3Rpb24gIGxvbmdUb1ppZ3phZyggY29uc3QgbiA6IEludDY0KSA6IFVJbnQ2NDsKKworICAgIC8vIENvbnZlcnQgbiBpbnRvIGEgemlnemFnIGludC4gVGhpcyBhbGxvd3MgbmVnYXRpdmUgbnVtYmVycyB0byBiZQorICAgIC8vIHJlcHJlc2VudGVkIGNvbXBhY3RseSBhcyBhIHZhcmludC4KKyAgICBjbGFzcyBmdW5jdGlvbiBpbnRUb1ppZ1phZyggY29uc3QgbiA6IEludGVnZXIpIDogQ2FyZGluYWw7CisKKyAgICAvL0NvbnZlcnQgYSBJbnQ2NCBpbnRvIGxpdHRsZS1lbmRpYW4gYnl0ZXMgaW4gYnVmIHN0YXJ0aW5nIGF0IG9mZiBhbmQgZ29pbmcgdW50aWwgb2ZmKzcuCisgICAgY2xhc3MgcHJvY2VkdXJlIGZpeGVkTG9uZ1RvQnl0ZXMoIGNvbnN0IG4gOiBJbnQ2NDsgdmFyIGJ1ZiA6IFRCeXRlcyk7CisKKyAgcHVibGljCisgICAgZnVuY3Rpb24gIFJlYWRNZXNzYWdlQmVnaW46IFRUaHJpZnRNZXNzYWdlOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgUmVhZE1lc3NhZ2VFbmQoKTsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gIFJlYWRTdHJ1Y3RCZWdpbjogVFRocmlmdFN0cnVjdDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFJlYWRTdHJ1Y3RFbmQ7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uICBSZWFkRmllbGRCZWdpbjogVFRocmlmdEZpZWxkOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgUmVhZEZpZWxkRW5kKCk7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uICBSZWFkTWFwQmVnaW46IFRUaHJpZnRNYXA7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBSZWFkTWFwRW5kKCk7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uICBSZWFkTGlzdEJlZ2luOiBUVGhyaWZ0TGlzdDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFJlYWRMaXN0RW5kKCk7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uICBSZWFkU2V0QmVnaW46IFRUaHJpZnRTZXQ7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBSZWFkU2V0RW5kKCk7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uICBSZWFkQm9vbDogQm9vbGVhbjsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gIFJlYWRCeXRlOiBTaG9ydEludDsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gIFJlYWRJMTY6IFNtYWxsSW50OyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiAgUmVhZEkzMjogSW50ZWdlcjsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gIFJlYWRJNjQ6IEludDY0OyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiAgUmVhZERvdWJsZTpEb3VibGU7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uICBSZWFkQmluYXJ5OiBUQnl0ZXM7IG92ZXJsb2FkOyBvdmVycmlkZTsKKworICBwcml2YXRlCisgICAgLy8gSW50ZXJuYWwgUmVhZGluZyBtZXRob2RzCisKKyAgICAvLyBSZWFkIGFuIGkzMiBmcm9tIHRoZSB3aXJlIGFzIGEgdmFyaW50LiBUaGUgTVNCIG9mIGVhY2ggYnl0ZSBpcyBzZXQKKyAgICAvLyBpZiB0aGVyZSBpcyBhbm90aGVyIGJ5dGUgdG8gZm9sbG93LiBUaGlzIGNhbiBSZWFkIHVwIHRvIDUgYnl0ZXMuCisgICAgZnVuY3Rpb24gUmVhZFZhcmludDMyIDogQ2FyZGluYWw7CisKKyAgICAvLyBSZWFkIGFuIGk2NCBmcm9tIHRoZSB3aXJlIGFzIGEgcHJvcGVyIHZhcmludC4gVGhlIE1TQiBvZiBlYWNoIGJ5dGUgaXMgc2V0CisgICAgLy8gaWYgdGhlcmUgaXMgYW5vdGhlciBieXRlIHRvIGZvbGxvdy4gVGhpcyBjYW4gUmVhZCB1cCB0byAxMCBieXRlcy4KKyAgICBmdW5jdGlvbiBSZWFkVmFyaW50NjQgOiBVSW50NjQ7CisKKworICAgIC8vIGVuY29kaW5nIGhlbHBlcnMKKworICAgIC8vIENvbnZlcnQgZnJvbSB6aWd6YWcgSW50ZWdlciB0byBJbnRlZ2VyLgorICAgIGNsYXNzIGZ1bmN0aW9uIHppZ3phZ1RvSW50KCBjb25zdCBuIDogQ2FyZGluYWwgKSA6IEludGVnZXI7CisKKyAgICAvLyBDb252ZXJ0IGZyb20gemlnemFnIEludDY0IHRvIEludDY0LgorICAgIGNsYXNzIGZ1bmN0aW9uIHppZ3phZ1RvTG9uZyggY29uc3QgbiA6IFVJbnQ2NCkgOiBJbnQ2NDsKKworICAgIC8vIE5vdGUgdGhhdCBpdCdzIGltcG9ydGFudCB0aGF0IHRoZSBtYXNrIGJ5dGVzIGFyZSBJbnQ2NCBsaXRlcmFscywKKyAgICAvLyBvdGhlcndpc2UgdGhleSdsbCBkZWZhdWx0IHRvIGludHMsIGFuZCB3aGVuIHlvdSBzaGlmdCBhbiBJbnRlZ2VyIGxlZnQgNTYgYml0cywKKyAgICAvLyB5b3UganVzdCBnZXQgYSBtZXNzZWQgdXAgSW50ZWdlci4KKyAgICBjbGFzcyBmdW5jdGlvbiBieXRlc1RvTG9uZyggY29uc3QgYnl0ZXMgOiBUQnl0ZXMpIDogSW50NjQ7CisKKyAgICAvLyB0eXBlIHRlc3RpbmcgYW5kIGNvbnZlcnRpbmcKKyAgICBjbGFzcyBmdW5jdGlvbiBpc0Jvb2xUeXBlKCBjb25zdCBiIDogYnl0ZSkgOiBCb29sZWFuOworCisgICAgLy8gR2l2ZW4gYSBUQ29tcGFjdFByb3RvY29sLlR5cGVzIGNvbnN0YW50LCBjb252ZXJ0IGl0IHRvIGl0cyBjb3JyZXNwb25kaW5nIFRUeXBlIHZhbHVlLgorICAgIGNsYXNzIGZ1bmN0aW9uIGdldFRUeXBlKCBjb25zdCB0eXBlXyA6IGJ5dGUpIDogVFR5cGU7CisKKyAgICAvLyBHaXZlbiBhIFRUeXBlIHZhbHVlLCBmaW5kIHRoZSBhcHByb3ByaWF0ZSBUQ29tcGFjdFByb3RvY29sLlR5cGVzIGNvbnN0YW50LgorICAgIGNsYXNzIGZ1bmN0aW9uIGdldENvbXBhY3RUeXBlKCBjb25zdCB0dHlwZSA6IFRUeXBlKSA6IEJ5dGU7CisgIGVuZDsKKworCitpbXBsZW1lbnRhdGlvbgorCisKKworLy8tLS0gVENvbXBhY3RQcm90b2NvbEltcGwuVEZhY3RvcnkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2xJbXBsLlRGYWN0b3J5LkdldFByb3RvY29sKCBjb25zdCB0cmFuczogSVRyYW5zcG9ydCk6IElQcm90b2NvbDsKK2JlZ2luCisgIHJlc3VsdCA6PSBUQ29tcGFjdFByb3RvY29sSW1wbC5DcmVhdGUoIHRyYW5zKTsKK2VuZDsKKworCisvLy0tLSBUQ29tcGFjdFByb3RvY29sSW1wbCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworY29uc3RydWN0b3IgVENvbXBhY3RQcm90b2NvbEltcGwuQ3JlYXRlKGNvbnN0IHRyYW5zOiBJVHJhbnNwb3J0KTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGUoIHRyYW5zKTsKKworICBsYXN0RmllbGRJZF8gOj0gMDsKKyAgbGFzdEZpZWxkXyA6PSBUU3RhY2s8SW50ZWdlcj4uQ3JlYXRlOworCisgIEluaXQoIGJvb2xlYW5GaWVsZF8sICcnLCBUVHlwZS5TdG9wLCAwKTsKKyAgYm9vbFZhbHVlXyA6PSB1bnVzZWQ7CitlbmQ7CisKKworZGVzdHJ1Y3RvciBUQ29tcGFjdFByb3RvY29sSW1wbC5EZXN0cm95OworYmVnaW4KKyAgdHJ5CisgICAgRnJlZUFuZE5pbCggbGFzdEZpZWxkXyk7CisgIGZpbmFsbHkKKyAgICBpbmhlcml0ZWQgRGVzdHJveTsKKyAgZW5kOworZW5kOworCisKKworcHJvY2VkdXJlIFRDb21wYWN0UHJvdG9jb2xJbXBsLlJlc2V0OworYmVnaW4KKyAgbGFzdEZpZWxkXy5DbGVhcigpOworICBsYXN0RmllbGRJZF8gOj0gMDsKKyAgSW5pdCggYm9vbGVhbkZpZWxkXywgJycsIFRUeXBlLlN0b3AsIDApOworICBib29sVmFsdWVfIDo9IHVudXNlZDsKK2VuZDsKKworCisvLyBXcml0ZXMgYSBieXRlIHdpdGhvdXQgYW55IHBvc3NpYmlsaXR5IG9mIGFsbCB0aGF0IGZpZWxkIGhlYWRlciBub25zZW5zZS4KKy8vIFVzZWQgaW50ZXJuYWxseSBieSBvdGhlciB3cml0aW5nIG1ldGhvZHMgdGhhdCBrbm93IHRoZXkgbmVlZCB0byBXcml0ZSBhIGJ5dGUuCitwcm9jZWR1cmUgVENvbXBhY3RQcm90b2NvbEltcGwuV3JpdGVCeXRlRGlyZWN0KCBjb25zdCBiIDogQnl0ZSk7CitiZWdpbgorICBUcmFuc3BvcnQuV3JpdGUoIEBiLCBTaXplT2YoYikpOworZW5kOworCisKKy8vIFdyaXRlcyBhIGJ5dGUgd2l0aG91dCBhbnkgcG9zc2liaWxpdHkgb2YgYWxsIHRoYXQgZmllbGQgaGVhZGVyIG5vbnNlbnNlLgorcHJvY2VkdXJlIFRDb21wYWN0UHJvdG9jb2xJbXBsLldyaXRlQnl0ZURpcmVjdCggY29uc3QgbiA6IEludGVnZXIpOworYmVnaW4KKyAgV3JpdGVCeXRlRGlyZWN0KCBCeXRlKG4pKTsKK2VuZDsKKworCisvLyBXcml0ZSBhbiBpMzIgYXMgYSB2YXJpbnQuIFJlc3VsdHMgaW4gMS01IGJ5dGVzIG9uIHRoZSB3aXJlLgorcHJvY2VkdXJlIFRDb21wYWN0UHJvdG9jb2xJbXBsLldyaXRlVmFyaW50MzIoIG4gOiBDYXJkaW5hbCk7Cit2YXIgaTMyYnVmIDogVEJ5dGVzOworICAgIGlkeCA6IEludGVnZXI7CitiZWdpbgorICBTZXRMZW5ndGgoIGkzMmJ1ZiwgNSk7CisgIGlkeCA6PSAwOworICB3aGlsZSBUUlVFIGRvIGJlZ2luCisgICAgQVNTRVJUKCBpZHggPCBMZW5ndGgoaTMyYnVmKSk7CisKKyAgICAvLyBsYXN0IHBhcnQ/CisgICAgaWYgKChuIGFuZCBub3QgJDdGKSA9IDApIHRoZW4gYmVnaW4KKyAgICAgIGkzMmJ1ZltpZHhdIDo9IEJ5dGUobik7CisgICAgICBJbmMoaWR4KTsKKyAgICAgIEJyZWFrOworICAgIGVuZDsKKworICAgIGkzMmJ1ZltpZHhdIDo9IEJ5dGUoKG4gYW5kICQ3Rikgb3IgJDgwKTsKKyAgICBJbmMoaWR4KTsKKyAgICBuIDo9IG4gc2hyIDc7CisgIGVuZDsKKworICBUcmFuc3BvcnQuV3JpdGUoIGkzMmJ1ZiwgMCwgaWR4KTsKK2VuZDsKKworCisvLyBXcml0ZSBhIG1lc3NhZ2UgaGVhZGVyIHRvIHRoZSB3aXJlLiBDb21wYWN0IFByb3RvY29sIG1lc3NhZ2VzIGNvbnRhaW4gdGhlCisvLyBwcm90b2NvbCB2ZXJzaW9uIHNvIHdlIGNhbiBtaWdyYXRlIGZvcndhcmRzIGluIHRoZSBmdXR1cmUgaWYgbmVlZCBiZS4KK3Byb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5Xcml0ZU1lc3NhZ2VCZWdpbiggY29uc3QgbXNnOiBUVGhyaWZ0TWVzc2FnZSk7Cit2YXIgdmVyc2lvbkFuZFR5cGUgOiBCeXRlOworYmVnaW4KKyAgUmVzZXQ7CisKKyAgdmVyc2lvbkFuZFR5cGUgOj0gQnl0ZSggVkVSU0lPTiBhbmQgVkVSU0lPTl9NQVNLKQorICAgICAgICAgICAgICAgICBvciBCeXRlKCAoQ2FyZGluYWwobXNnLlR5cGVfKSBzaGwgVFlQRV9TSElGVF9BTU9VTlQpIGFuZCBUWVBFX01BU0spOworCisgIFdyaXRlQnl0ZURpcmVjdCggUFJPVE9DT0xfSUQpOworICBXcml0ZUJ5dGVEaXJlY3QoIHZlcnNpb25BbmRUeXBlKTsKKyAgV3JpdGVWYXJpbnQzMiggQ2FyZGluYWwobXNnLlNlcUlEKSk7CisgIFdyaXRlU3RyaW5nKCBtc2cuTmFtZSk7CitlbmQ7CisKKworLy8gV3JpdGUgYSBzdHJ1Y3QgYmVnaW4uIFRoaXMgZG9lc24ndCBhY3R1YWxseSBwdXQgYW55dGhpbmcgb24gdGhlIHdpcmUuIFdlIHVzZSBpdCBhcyBhbgorLy8gb3Bwb3J0dW5pdHkgdG8gcHV0IHNwZWNpYWwgcGxhY2Vob2xkZXIgbWFya2VycyBvbiB0aGUgZmllbGQgc3RhY2sgc28gd2UgY2FuIGdldCB0aGUKKy8vIGZpZWxkIGlkIGRlbHRhcyBjb3JyZWN0LgorcHJvY2VkdXJlIFRDb21wYWN0UHJvdG9jb2xJbXBsLldyaXRlU3RydWN0QmVnaW4oIGNvbnN0IHN0cnVjOiBUVGhyaWZ0U3RydWN0KTsKK2JlZ2luCisgIGxhc3RGaWVsZF8uUHVzaChsYXN0RmllbGRJZF8pOworICBsYXN0RmllbGRJZF8gOj0gMDsKK2VuZDsKKworCisvLyBXcml0ZSBhIHN0cnVjdCBlbmQuIFRoaXMgZG9lc24ndCBhY3R1YWxseSBwdXQgYW55dGhpbmcgb24gdGhlIHdpcmUuIFdlIHVzZSB0aGlzIGFzIGFuCisvLyBvcHBvcnR1bml0eSB0byBwb3AgdGhlIGxhc3QgZmllbGQgZnJvbSB0aGUgY3VycmVudCBzdHJ1Y3Qgb2ZmIG9mIHRoZSBmaWVsZCBzdGFjay4KK3Byb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5Xcml0ZVN0cnVjdEVuZDsKK2JlZ2luCisgIGxhc3RGaWVsZElkXyA6PSBsYXN0RmllbGRfLlBvcCgpOworZW5kOworCisKKy8vIFdyaXRlIGEgZmllbGQgaGVhZGVyIGNvbnRhaW5pbmcgdGhlIGZpZWxkIGlkIGFuZCBmaWVsZCB0eXBlLiBJZiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZQorLy8gY3VycmVudCBmaWVsZCBpZCBhbmQgdGhlIGxhc3Qgb25lIGlzIHNtYWxsICg8IDE1KSwgdGhlbiB0aGUgZmllbGQgaWQgd2lsbCBiZSBlbmNvZGVkIGluCisvLyB0aGUgNCBNU0IgYXMgYSBkZWx0YS4gT3RoZXJ3aXNlLCB0aGUgZmllbGQgaWQgd2lsbCBmb2xsb3cgdGhlIHR5cGUgaGVhZGVyIGFzIGEgemlnemFnIHZhcmludC4KK3Byb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5Xcml0ZUZpZWxkQmVnaW4oIGNvbnN0IGZpZWxkOiBUVGhyaWZ0RmllbGQpOworYmVnaW4KKyAgY2FzZSBmaWVsZC5UeXBlXyBvZgorICAgIFRUeXBlLkJvb2xfIDogYm9vbGVhbkZpZWxkXyA6PSBmaWVsZDsgLy8gd2Ugd2FudCB0byBwb3NzaWJseSBpbmNsdWRlIHRoZSB2YWx1ZSwgc28gd2UnbGwgd2FpdC4KKyAgZWxzZQorICAgIFdyaXRlRmllbGRCZWdpbkludGVybmFsKGZpZWxkLCAkRkYpOworICBlbmQ7CitlbmQ7CisKKworLy8gVGhlIHdvcmtob3JzZSBvZiBXcml0ZUZpZWxkQmVnaW4uIEl0IGhhcyB0aGUgb3B0aW9uIG9mIGRvaW5nIGEgJ3R5cGUgb3ZlcnJpZGUnCisvLyBvZiB0aGUgdHlwZSBoZWFkZXIuIFRoaXMgaXMgdXNlZCBzcGVjaWZpY2FsbHkgaW4gdGhlIGJvb2xlYW4gZmllbGQgY2FzZS4KK3Byb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5Xcml0ZUZpZWxkQmVnaW5JbnRlcm5hbCggY29uc3QgZmllbGQgOiBUVGhyaWZ0RmllbGQ7IHR5cGVPdmVycmlkZSA6IEJ5dGUpOwordmFyIHR5cGVUb1dyaXRlIDogQnl0ZTsKK2JlZ2luCisgIC8vIGlmIHRoZXJlJ3MgYSB0eXBlIG92ZXJyaWRlLCB1c2UgdGhhdC4KKyAgaWYgdHlwZU92ZXJyaWRlID0gJEZGCisgIHRoZW4gdHlwZVRvV3JpdGUgOj0gZ2V0Q29tcGFjdFR5cGUoIGZpZWxkLlR5cGVfKQorICBlbHNlIHR5cGVUb1dyaXRlIDo9IHR5cGVPdmVycmlkZTsKKworICAvLyBjaGVjayBpZiB3ZSBjYW4gdXNlIGRlbHRhIGVuY29kaW5nIGZvciB0aGUgZmllbGQgaWQKKyAgaWYgKGZpZWxkLklEID4gbGFzdEZpZWxkSWRfKSBhbmQgKChmaWVsZC5JRCAtIGxhc3RGaWVsZElkXykgPD0gMTUpCisgIHRoZW4gYmVnaW4KKyAgICAvLyBXcml0ZSB0aGVtIHRvZ2V0aGVyCisgICAgV3JpdGVCeXRlRGlyZWN0KCAoKGZpZWxkLklEIC0gbGFzdEZpZWxkSWRfKSBzaGwgNCkgb3IgdHlwZVRvV3JpdGUpOworICBlbmQKKyAgZWxzZSBiZWdpbgorICAgIC8vIFdyaXRlIHRoZW0gc2VwYXJhdGUKKyAgICBXcml0ZUJ5dGVEaXJlY3QoIHR5cGVUb1dyaXRlKTsKKyAgICBXcml0ZUkxNiggZmllbGQuSUQpOworICBlbmQ7CisKKyAgbGFzdEZpZWxkSWRfIDo9IGZpZWxkLklEOworZW5kOworCisKKy8vIFdyaXRlIHRoZSBTVE9QIHN5bWJvbCBzbyB3ZSBrbm93IHRoZXJlIGFyZSBubyBtb3JlIGZpZWxkcyBpbiB0aGlzIHN0cnVjdC4KK3Byb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5Xcml0ZUZpZWxkU3RvcDsKK2JlZ2luCisgIFdyaXRlQnl0ZURpcmVjdCggQnl0ZSggVHlwZXMuU1RPUCkpOworZW5kOworCisKKy8vIFdyaXRlIGEgbWFwIGhlYWRlci4gSWYgdGhlIG1hcCBpcyBlbXB0eSwgb21pdCB0aGUga2V5IGFuZCB2YWx1ZSB0eXBlCisvLyBoZWFkZXJzLCBhcyB3ZSBkb24ndCBuZWVkIGFueSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHRvIHNraXAgaXQuCitwcm9jZWR1cmUgVENvbXBhY3RQcm90b2NvbEltcGwuV3JpdGVNYXBCZWdpbiggY29uc3QgbWFwOiBUVGhyaWZ0TWFwKTsKK3ZhciBrZXksIHZhbCA6IEJ5dGU7CitiZWdpbgorICBpZiAobWFwLkNvdW50ID0gMCkKKyAgdGhlbiBXcml0ZUJ5dGVEaXJlY3QoIDApCisgIGVsc2UgYmVnaW4KKyAgICBXcml0ZVZhcmludDMyKCBDYXJkaW5hbCggbWFwLkNvdW50KSk7CisgICAga2V5IDo9IGdldENvbXBhY3RUeXBlKG1hcC5LZXlUeXBlKTsKKyAgICB2YWwgOj0gZ2V0Q29tcGFjdFR5cGUobWFwLlZhbHVlVHlwZSk7CisgICAgV3JpdGVCeXRlRGlyZWN0KCAoa2V5IHNobCA0KSBvciB2YWwpOworICBlbmQ7CitlbmQ7CisKKworLy8gV3JpdGUgYSBsaXN0IGhlYWRlci4KK3Byb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5Xcml0ZUxpc3RCZWdpbiggY29uc3QgbGlzdDogVFRocmlmdExpc3QpOworYmVnaW4KKyAgV3JpdGVDb2xsZWN0aW9uQmVnaW4oIGxpc3QuRWxlbWVudFR5cGUsIGxpc3QuQ291bnQpOworZW5kOworCisKKy8vIFdyaXRlIGEgc2V0IGhlYWRlci4KK3Byb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5Xcml0ZVNldEJlZ2luKCBjb25zdCBzZXRfOiBUVGhyaWZ0U2V0ICk7CitiZWdpbgorICBXcml0ZUNvbGxlY3Rpb25CZWdpbiggc2V0Xy5FbGVtZW50VHlwZSwgc2V0Xy5Db3VudCk7CitlbmQ7CisKKworLy8gV3JpdGUgYSBib29sZWFuIHZhbHVlLiBQb3RlbnRpYWxseSwgdGhpcyBjb3VsZCBiZSBhIGJvb2xlYW4gZmllbGQsIGluCisvLyB3aGljaCBjYXNlIHRoZSBmaWVsZCBoZWFkZXIgaW5mbyBpc24ndCB3cml0dGVuIHlldC4gSWYgc28sIGRlY2lkZSB3aGF0IHRoZQorLy8gcmlnaHQgdHlwZSBoZWFkZXIgaXMgZm9yIHRoZSB2YWx1ZSBhbmQgdGhlbiBXcml0ZSB0aGUgZmllbGQgaGVhZGVyLgorLy8gT3RoZXJ3aXNlLCBXcml0ZSBhIHNpbmdsZSBieXRlLgorcHJvY2VkdXJlIFRDb21wYWN0UHJvdG9jb2xJbXBsLldyaXRlQm9vbCggYjogQm9vbGVhbik7Cit2YXIgYnQgOiBUeXBlczsKK2JlZ2luCisgIGlmIGIKKyAgdGhlbiBidCA6PSBUeXBlcy5CT09MRUFOX1RSVUUKKyAgZWxzZSBidCA6PSBUeXBlcy5CT09MRUFOX0ZBTFNFOworCisgIGlmIGJvb2xlYW5GaWVsZF8uVHlwZV8gPSBUVHlwZS5Cb29sXyB0aGVuIGJlZ2luCisgICAgLy8gd2UgaGF2ZW4ndCB3cml0dGVuIHRoZSBmaWVsZCBoZWFkZXIgeWV0CisgICAgV3JpdGVGaWVsZEJlZ2luSW50ZXJuYWwoIGJvb2xlYW5GaWVsZF8sIEJ5dGUoYnQpKTsKKyAgICBib29sZWFuRmllbGRfLlR5cGVfIDo9IFRUeXBlLlN0b3A7CisgIGVuZAorICBlbHNlIGJlZ2luCisgICAgLy8gd2UncmUgbm90IHBhcnQgb2YgYSBmaWVsZCwgc28ganVzdCBXcml0ZSB0aGUgdmFsdWUuCisgICAgV3JpdGVCeXRlRGlyZWN0KCBCeXRlKGJ0KSk7CisgIGVuZDsKK2VuZDsKKworCisvLyBXcml0ZSBhIGJ5dGUuIE5vdGhpbmcgdG8gc2VlIGhlcmUhCitwcm9jZWR1cmUgVENvbXBhY3RQcm90b2NvbEltcGwuV3JpdGVCeXRlKCBiOiBTaG9ydEludCk7CitiZWdpbgorICBXcml0ZUJ5dGVEaXJlY3QoIEJ5dGUoYikpOworZW5kOworCisKKy8vIFdyaXRlIGFuIEkxNiBhcyBhIHppZ3phZyB2YXJpbnQuCitwcm9jZWR1cmUgVENvbXBhY3RQcm90b2NvbEltcGwuV3JpdGVJMTYoIGkxNjogU21hbGxJbnQpOworYmVnaW4KKyAgV3JpdGVWYXJpbnQzMiggaW50VG9aaWdaYWcoIGkxNikpOworZW5kOworCisKKy8vIFdyaXRlIGFuIGkzMiBhcyBhIHppZ3phZyB2YXJpbnQuCitwcm9jZWR1cmUgVENvbXBhY3RQcm90b2NvbEltcGwuV3JpdGVJMzIoIGkzMjogSW50ZWdlcik7CitiZWdpbgorICBXcml0ZVZhcmludDMyKCBpbnRUb1ppZ1phZyggaTMyKSk7CitlbmQ7CisKKworLy8gV3JpdGUgYW4gaTY0IGFzIGEgemlnemFnIHZhcmludC4KK3Byb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5Xcml0ZUk2NCggY29uc3QgaTY0OiBJbnQ2NCk7CitiZWdpbgorICBXcml0ZVZhcmludDY0KCBsb25nVG9aaWd6YWcoIGk2NCkpOworZW5kOworCisKK2NsYXNzIGZ1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2xJbXBsLkRvdWJsZVRvSW50NjRCaXRzKCBjb25zdCBkYiA6IERvdWJsZSkgOiBJbnQ2NDsKK2JlZ2luCisgIEFTU0VSVCggU2l6ZU9mKGRiKSA9IFNpemVPZihyZXN1bHQpKTsKKyAgTW92ZSggZGIsIHJlc3VsdCwgU2l6ZU9mKHJlc3VsdCkpOworZW5kOworCisKK2NsYXNzIGZ1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2xJbXBsLkludDY0Qml0c1RvRG91YmxlKCBjb25zdCBpNjQgOiBJbnQ2NCkgOiBEb3VibGU7CitiZWdpbgorICBBU1NFUlQoIFNpemVPZihpNjQpID0gU2l6ZU9mKHJlc3VsdCkpOworICBNb3ZlKCBpNjQsIHJlc3VsdCwgU2l6ZU9mKHJlc3VsdCkpOworZW5kOworCisKKy8vIFdyaXRlIGEgZG91YmxlIHRvIHRoZSB3aXJlIGFzIDggYnl0ZXMuCitwcm9jZWR1cmUgVENvbXBhY3RQcm90b2NvbEltcGwuV3JpdGVEb3VibGUoIGNvbnN0IGR1YjogRG91YmxlKTsKK3ZhciBkYXRhIDogVEJ5dGVzOworYmVnaW4KKyAgZml4ZWRMb25nVG9CeXRlcyggRG91YmxlVG9JbnQ2NEJpdHMoZHViKSwgZGF0YSk7CisgIFRyYW5zcG9ydC5Xcml0ZSggZGF0YSk7CitlbmQ7CisKKworLy8gV3JpdGUgYSBieXRlIGFycmF5LCB1c2luZyBhIHZhcmludCBmb3IgdGhlIHNpemUuCitwcm9jZWR1cmUgVENvbXBhY3RQcm90b2NvbEltcGwuV3JpdGVCaW5hcnkoIGNvbnN0IGI6IFRCeXRlcyk7CitiZWdpbgorICBXcml0ZVZhcmludDMyKCBDYXJkaW5hbChMZW5ndGgoYikpKTsKKyAgVHJhbnNwb3J0LldyaXRlKCBiKTsKK2VuZDsKKworcHJvY2VkdXJlIFRDb21wYWN0UHJvdG9jb2xJbXBsLldyaXRlTWVzc2FnZUVuZDsKK2JlZ2luCisgIC8vIG5vdGhpbmcgdG8gZG8KK2VuZDsKKworCitwcm9jZWR1cmUgVENvbXBhY3RQcm90b2NvbEltcGwuV3JpdGVNYXBFbmQ7CitiZWdpbgorICAvLyBub3RoaW5nIHRvIGRvCitlbmQ7CisKKworcHJvY2VkdXJlIFRDb21wYWN0UHJvdG9jb2xJbXBsLldyaXRlTGlzdEVuZDsKK2JlZ2luCisgIC8vIG5vdGhpbmcgdG8gZG8KK2VuZDsKKworCitwcm9jZWR1cmUgVENvbXBhY3RQcm90b2NvbEltcGwuV3JpdGVTZXRFbmQ7CitiZWdpbgorICAvLyBub3RoaW5nIHRvIGRvCitlbmQ7CisKKworcHJvY2VkdXJlIFRDb21wYWN0UHJvdG9jb2xJbXBsLldyaXRlRmllbGRFbmQ7CitiZWdpbgorICAvLyBub3RoaW5nIHRvIGRvCitlbmQ7CisKKworLy8gQWJzdHJhY3QgbWV0aG9kIGZvciB3cml0aW5nIHRoZSBzdGFydCBvZiBsaXN0cyBhbmQgc2V0cy4gTGlzdCBhbmQgc2V0cyBvbgorLy8gdGhlIHdpcmUgZGlmZmVyIG9ubHkgYnkgdGhlIHR5cGUgaW5kaWNhdG9yLgorcHJvY2VkdXJlIFRDb21wYWN0UHJvdG9jb2xJbXBsLldyaXRlQ29sbGVjdGlvbkJlZ2luKCBjb25zdCBlbGVtVHlwZSA6IFRUeXBlOyBzaXplIDogSW50ZWdlcik7CitiZWdpbgorICBpZiBzaXplIDw9IDE0CisgIHRoZW4gV3JpdGVCeXRlRGlyZWN0KCAoc2l6ZSBzaGwgNCkgb3IgZ2V0Q29tcGFjdFR5cGUoZWxlbVR5cGUpKQorICBlbHNlIGJlZ2luCisgICAgV3JpdGVCeXRlRGlyZWN0KCAkRjAgb3IgZ2V0Q29tcGFjdFR5cGUoZWxlbVR5cGUpKTsKKyAgICBXcml0ZVZhcmludDMyKCBDYXJkaW5hbChzaXplKSk7CisgIGVuZDsKK2VuZDsKKworCisvLyBXcml0ZSBhbiBpNjQgYXMgYSB2YXJpbnQuIFJlc3VsdHMgaW4gMS0xMCBieXRlcyBvbiB0aGUgd2lyZS4KK3Byb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5Xcml0ZVZhcmludDY0KCBuIDogVUludDY0KTsKK3ZhciB2YXJpbnQ2NG91dCA6IFRCeXRlczsKKyAgICBpZHggOiBJbnRlZ2VyOworYmVnaW4KKyAgU2V0TGVuZ3RoKCB2YXJpbnQ2NG91dCwgMTApOworICBpZHggOj0gMDsKKyAgd2hpbGUgVFJVRSBkbyBiZWdpbgorICAgIEFTU0VSVCggaWR4IDwgTGVuZ3RoKHZhcmludDY0b3V0KSk7CisKKyAgICAvLyBsYXN0IG9uZT8KKyAgICBpZiAobiBhbmQgbm90IFVJbnQ2NCgkN0YpKSA9IDAgdGhlbiBiZWdpbgorICAgICAgdmFyaW50NjRvdXRbaWR4XSA6PSBCeXRlKG4pOworICAgICAgSW5jKGlkeCk7CisgICAgICBCcmVhazsKKyAgICBlbmQ7CisKKyAgICB2YXJpbnQ2NG91dFtpZHhdIDo9IEJ5dGUoKG4gYW5kICQ3Rikgb3IgJDgwKTsKKyAgICBJbmMoaWR4KTsKKyAgICBuIDo9IG4gc2hyIDc7CisgIGVuZDsKKworICBUcmFuc3BvcnQuV3JpdGUoIHZhcmludDY0b3V0LCAwLCBpZHgpOworZW5kOworCisKKy8vIENvbnZlcnQgbCBpbnRvIGEgemlnemFnIEludDY0LiBUaGlzIGFsbG93cyBuZWdhdGl2ZSBudW1iZXJzIHRvIGJlCisvLyByZXByZXNlbnRlZCBjb21wYWN0bHkgYXMgYSB2YXJpbnQuCitjbGFzcyBmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sSW1wbC5sb25nVG9aaWd6YWcoIGNvbnN0IG4gOiBJbnQ2NCkgOiBVSW50NjQ7CitiZWdpbgorICAvLyB0aGVyZSBpcyBubyBhcml0aG1ldGljIHJpZ2h0IHNoaWZ0IGluIERlbHBoaQorICBpZiBuID49IDAKKyAgdGhlbiByZXN1bHQgOj0gVUludDY0KG4gc2hsIDEpCisgIGVsc2UgcmVzdWx0IDo9IFVJbnQ2NChuIHNobCAxKSB4b3IgJEZGRkZGRkZGRkZGRkZGRkY7CitlbmQ7CisKKworLy8gQ29udmVydCBuIGludG8gYSB6aWd6YWcgSW50ZWdlci4gVGhpcyBhbGxvd3MgbmVnYXRpdmUgbnVtYmVycyB0byBiZQorLy8gcmVwcmVzZW50ZWQgY29tcGFjdGx5IGFzIGEgdmFyaW50LgorY2xhc3MgZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbEltcGwuaW50VG9aaWdaYWcoIGNvbnN0IG4gOiBJbnRlZ2VyKSA6IENhcmRpbmFsOworYmVnaW4KKyAgLy8gdGhlcmUgaXMgbm8gYXJpdGhtZXRpYyByaWdodCBzaGlmdCBpbiBEZWxwaGkKKyAgaWYgbiA+PSAwCisgIHRoZW4gcmVzdWx0IDo9IENhcmRpbmFsKG4gc2hsIDEpCisgIGVsc2UgcmVzdWx0IDo9IENhcmRpbmFsKG4gc2hsIDEpIHhvciAkRkZGRkZGRkY7CitlbmQ7CisKKworLy8gQ29udmVydCBhIEludDY0IGludG8gOCBsaXR0bGUtZW5kaWFuIGJ5dGVzIGluIGJ1ZgorY2xhc3MgcHJvY2VkdXJlIFRDb21wYWN0UHJvdG9jb2xJbXBsLmZpeGVkTG9uZ1RvQnl0ZXMoIGNvbnN0IG4gOiBJbnQ2NDsgdmFyIGJ1ZiA6IFRCeXRlcyk7CitiZWdpbgorICBTZXRMZW5ndGgoIGJ1ZiwgOCk7CisgIGJ1ZlswXSA6PSBCeXRlKCBuICAgICAgICAgYW5kICRGRik7CisgIGJ1ZlsxXSA6PSBCeXRlKChuIHNociA4KSAgYW5kICRGRik7CisgIGJ1ZlsyXSA6PSBCeXRlKChuIHNociAxNikgYW5kICRGRik7CisgIGJ1ZlszXSA6PSBCeXRlKChuIHNociAyNCkgYW5kICRGRik7CisgIGJ1Zls0XSA6PSBCeXRlKChuIHNociAzMikgYW5kICRGRik7CisgIGJ1Zls1XSA6PSBCeXRlKChuIHNociA0MCkgYW5kICRGRik7CisgIGJ1Zls2XSA6PSBCeXRlKChuIHNociA0OCkgYW5kICRGRik7CisgIGJ1Zls3XSA6PSBCeXRlKChuIHNociA1NikgYW5kICRGRik7CitlbmQ7CisKKworCisvLyBSZWFkIGEgbWVzc2FnZSBoZWFkZXIuCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sSW1wbC5SZWFkTWVzc2FnZUJlZ2luIDogVFRocmlmdE1lc3NhZ2U7Cit2YXIgcHJvdG9jb2xJZCwgdmVyc2lvbkFuZFR5cGUsIHZlcnNpb24sIHR5cGVfIDogQnl0ZTsKKyAgICBzZXFpZCA6IEludGVnZXI7CisgICAgbXNnTm0gOiBTdHJpbmc7CitiZWdpbgorICBSZXNldDsKKworICBwcm90b2NvbElkIDo9IEJ5dGUoIFJlYWRCeXRlKTsKKyAgaWYgKHByb3RvY29sSWQgPD4gUFJPVE9DT0xfSUQpCisgIHRoZW4gcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uQmFkVmVyc2lvbi5DcmVhdGUoICdFeHBlY3RlZCBwcm90b2NvbCBpZCAnICsgSW50VG9IZXgoUFJPVE9DT0xfSUQsMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgJyBidXQgZ290ICcgKyBJbnRUb0hleChwcm90b2NvbElkLDIpKTsKKworICB2ZXJzaW9uQW5kVHlwZSA6PSBCeXRlKCBSZWFkQnl0ZSk7CisgIHZlcnNpb24gICAgICAgIDo9IEJ5dGUoIHZlcnNpb25BbmRUeXBlIGFuZCBWRVJTSU9OX01BU0spOworICBpZiAodmVyc2lvbiA8PiBWRVJTSU9OKQorICB0aGVuIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbkJhZFZlcnNpb24uQ3JlYXRlKCAnRXhwZWN0ZWQgdmVyc2lvbiAnICtJbnRUb1N0cihWRVJTSU9OKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAnIGJ1dCBnb3QgJyArIEludFRvU3RyKHZlcnNpb24pKTsKKworICB0eXBlXyA6PSBCeXRlKCAodmVyc2lvbkFuZFR5cGUgc2hyIFRZUEVfU0hJRlRfQU1PVU5UKSBhbmQgVFlQRV9CSVRTKTsKKyAgc2VxaWQgOj0gSW50ZWdlciggUmVhZFZhcmludDMyKTsKKyAgbXNnTm0gOj0gUmVhZFN0cmluZzsKKyAgSW5pdCggcmVzdWx0LCBtc2dObSwgVE1lc3NhZ2VUeXBlKHR5cGVfKSwgc2VxaWQpOworZW5kOworCisKKy8vIFJlYWQgYSBzdHJ1Y3QgYmVnaW4uIFRoZXJlJ3Mgbm90aGluZyBvbiB0aGUgd2lyZSBmb3IgdGhpcywgYnV0IGl0IGlzIG91cgorLy8gb3Bwb3J0dW5pdHkgdG8gcHVzaCBhIG5ldyBzdHJ1Y3QgYmVnaW4gbWFya2VyIG9udG8gdGhlIGZpZWxkIHN0YWNrLgorZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbEltcGwuUmVhZFN0cnVjdEJlZ2luOiBUVGhyaWZ0U3RydWN0OworYmVnaW4KKyAgbGFzdEZpZWxkXy5QdXNoKCBsYXN0RmllbGRJZF8pOworICBsYXN0RmllbGRJZF8gOj0gMDsKKyAgSW5pdCggcmVzdWx0KTsKK2VuZDsKKworCisvLyBEb2Vzbid0IGFjdHVhbGx5IGNvbnN1bWUgYW55IHdpcmUgZGF0YSwganVzdCByZW1vdmVzIHRoZSBsYXN0IGZpZWxkIGZvcgorLy8gdGhpcyBzdHJ1Y3QgZnJvbSB0aGUgZmllbGQgc3RhY2suCitwcm9jZWR1cmUgVENvbXBhY3RQcm90b2NvbEltcGwuUmVhZFN0cnVjdEVuZDsKK2JlZ2luCisgIC8vIGNvbnN1bWUgdGhlIGxhc3QgZmllbGQgd2UgUmVhZCBvZmYgdGhlIHdpcmUuCisgIGxhc3RGaWVsZElkXyA6PSBsYXN0RmllbGRfLlBvcCgpOworZW5kOworCisKKy8vIFJlYWQgYSBmaWVsZCBoZWFkZXIgb2ZmIHRoZSB3aXJlLgorZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbEltcGwuUmVhZEZpZWxkQmVnaW46IFRUaHJpZnRGaWVsZDsKK3ZhciB0eXBlXyA6IEJ5dGU7CisgICAgZmllbGRJZCwgbW9kaWZpZXIgOiBTaG9ydEludDsKK2JlZ2luCisgIHR5cGVfIDo9IEJ5dGUoIFJlYWRCeXRlKTsKKworICAvLyBpZiBpdCdzIGEgc3RvcCwgdGhlbiB3ZSBjYW4gcmV0dXJuIGltbWVkaWF0ZWx5LCBhcyB0aGUgc3RydWN0IGlzIG92ZXIuCisgIGlmIHR5cGVfID0gQnl0ZShUeXBlcy5TVE9QKSB0aGVuIGJlZ2luCisgICAgSW5pdCggcmVzdWx0LCAnJywgVFR5cGUuU3RvcCwgMCk7CisgICAgRXhpdDsKKyAgZW5kOworCisgIC8vIG1hc2sgb2ZmIHRoZSA0IE1TQiBvZiB0aGUgdHlwZSBoZWFkZXIuIGl0IGNvdWxkIGNvbnRhaW4gYSBmaWVsZCBpZCBkZWx0YS4KKyAgbW9kaWZpZXIgOj0gU2hvcnRJbnQoICh0eXBlXyBhbmQgJEYwKSBzaHIgNCk7CisgIGlmIChtb2RpZmllciA9IDApCisgIHRoZW4gZmllbGRJZCA6PSBSZWFkSTE2ICAgIC8vIG5vdCBhIGRlbHRhLiBsb29rIGFoZWFkIGZvciB0aGUgemlnemFnIHZhcmludCBmaWVsZCBpZC4KKyAgZWxzZSBmaWVsZElkIDo9IFNob3J0SW50KCBsYXN0RmllbGRJZF8gKyBtb2RpZmllcik7IC8vIGFkZCB0aGUgZGVsdGEgdG8gdGhlIGxhc3QgUmVhZCBmaWVsZCBpZC4KKworICBJbml0KCByZXN1bHQsICcnLCBnZXRUVHlwZShCeXRlKHR5cGVfIGFuZCAkMEYpKSwgZmllbGRJZCk7CisKKyAgLy8gaWYgdGhpcyBoYXBwZW5zIHRvIGJlIGEgYm9vbGVhbiBmaWVsZCwgdGhlIHZhbHVlIGlzIGVuY29kZWQgaW4gdGhlIHR5cGUKKyAgIC8vIHNhdmUgdGhlIGJvb2xlYW4gdmFsdWUgaW4gYSBzcGVjaWFsIGluc3RhbmNlIHZhcmlhYmxlLgorICBpZiBpc0Jvb2xUeXBlKHR5cGVfKSB0aGVuIGJlZ2luCisgICAgaWYgQnl0ZSh0eXBlXyBhbmQgJDBGKSA9IEJ5dGUoVHlwZXMuQk9PTEVBTl9UUlVFKQorICAgIHRoZW4gYm9vbFZhbHVlXyA6PSBib29sX3RydWUKKyAgICBlbHNlIGJvb2xWYWx1ZV8gOj0gYm9vbF9mYWxzZTsKKyAgZW5kOworCisgIC8vIHB1c2ggdGhlIG5ldyBmaWVsZCBvbnRvIHRoZSBmaWVsZCBzdGFjayBzbyB3ZSBjYW4ga2VlcCB0aGUgZGVsdGFzIGdvaW5nLgorICBsYXN0RmllbGRJZF8gOj0gcmVzdWx0LklEOworZW5kOworCisKKy8vIFJlYWQgYSBtYXAgaGVhZGVyIG9mZiB0aGUgd2lyZS4gSWYgdGhlIHNpemUgaXMgemVybywgc2tpcCBSZWFkaW5nIHRoZSBrZXkKKy8vIGFuZCB2YWx1ZSB0eXBlLiBUaGlzIG1lYW5zIHRoYXQgMC1sZW5ndGggbWFwcyB3aWxsIHlpZWxkIFRNYXBzIHdpdGhvdXQgdGhlCisvLyAiY29ycmVjdCIgdHlwZXMuCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sSW1wbC5SZWFkTWFwQmVnaW46IFRUaHJpZnRNYXA7Cit2YXIgc2l6ZSA6IEludGVnZXI7CisgICAga2V5QW5kVmFsdWVUeXBlIDogQnl0ZTsKKyAgICBrZXksIHZhbCA6IFRUeXBlOworYmVnaW4KKyAgc2l6ZSA6PSBJbnRlZ2VyKCBSZWFkVmFyaW50MzIpOworICBpZiBzaXplID0gMAorICB0aGVuIGtleUFuZFZhbHVlVHlwZSA6PSAwCisgIGVsc2Uga2V5QW5kVmFsdWVUeXBlIDo9IEJ5dGUoIFJlYWRCeXRlKTsKKworICBrZXkgOj0gZ2V0VFR5cGUoIEJ5dGUoIGtleUFuZFZhbHVlVHlwZSBzaHIgNCkpOworICB2YWwgOj0gZ2V0VFR5cGUoIEJ5dGUoIGtleUFuZFZhbHVlVHlwZSBhbmQgJEYpKTsKKyAgSW5pdCggcmVzdWx0LCBrZXksIHZhbCwgc2l6ZSk7CisgIEFTU0VSVCggKHJlc3VsdC5LZXlUeXBlID0ga2V5KSBhbmQgKHJlc3VsdC5WYWx1ZVR5cGUgPSB2YWwpKTsKK2VuZDsKKworCisvLyBSZWFkIGEgbGlzdCBoZWFkZXIgb2ZmIHRoZSB3aXJlLiBJZiB0aGUgbGlzdCBzaXplIGlzIDAtMTQsIHRoZSBzaXplIHdpbGwKKy8vIGJlIHBhY2tlZCBpbnRvIHRoZSBlbGVtZW50IHR5cGUgaGVhZGVyLiBJZiBpdCdzIGEgbG9uZ2VyIGxpc3QsIHRoZSA0IE1TQgorLy8gb2YgdGhlIGVsZW1lbnQgdHlwZSBoZWFkZXIgd2lsbCBiZSAkRiwgYW5kIGEgdmFyaW50IHdpbGwgZm9sbG93IHdpdGggdGhlCisvLyB0cnVlIHNpemUuCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sSW1wbC5SZWFkTGlzdEJlZ2luOiBUVGhyaWZ0TGlzdDsKK3ZhciBzaXplX2FuZF90eXBlIDogQnl0ZTsKKyAgICBzaXplIDogSW50ZWdlcjsKKyAgICB0eXBlXyA6IFRUeXBlOworYmVnaW4KKyAgc2l6ZV9hbmRfdHlwZSA6PSBCeXRlKCBSZWFkQnl0ZSk7CisKKyAgc2l6ZSA6PSAoc2l6ZV9hbmRfdHlwZSBzaHIgNCkgYW5kICQwRjsKKyAgaWYgKHNpemUgPSAxNSkKKyAgdGhlbiBzaXplIDo9IEludGVnZXIoIFJlYWRWYXJpbnQzMik7CisKKyAgdHlwZV8gOj0gZ2V0VFR5cGUoIHNpemVfYW5kX3R5cGUpOworICBJbml0KCByZXN1bHQsIHR5cGVfLCBzaXplKTsKK2VuZDsKKworCisvLyBSZWFkIGEgc2V0IGhlYWRlciBvZmYgdGhlIHdpcmUuIElmIHRoZSBzZXQgc2l6ZSBpcyAwLTE0LCB0aGUgc2l6ZSB3aWxsCisvLyBiZSBwYWNrZWQgaW50byB0aGUgZWxlbWVudCB0eXBlIGhlYWRlci4gSWYgaXQncyBhIGxvbmdlciBzZXQsIHRoZSA0IE1TQgorLy8gb2YgdGhlIGVsZW1lbnQgdHlwZSBoZWFkZXIgd2lsbCBiZSAkRiwgYW5kIGEgdmFyaW50IHdpbGwgZm9sbG93IHdpdGggdGhlCisvLyB0cnVlIHNpemUuCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sSW1wbC5SZWFkU2V0QmVnaW46IFRUaHJpZnRTZXQ7Cit2YXIgc2l6ZV9hbmRfdHlwZSA6IEJ5dGU7CisgICAgc2l6ZSA6IEludGVnZXI7CisgICAgdHlwZV8gOiBUVHlwZTsKK2JlZ2luCisgIHNpemVfYW5kX3R5cGUgOj0gQnl0ZSggUmVhZEJ5dGUpOworCisgIHNpemUgOj0gKHNpemVfYW5kX3R5cGUgc2hyIDQpIGFuZCAkMEY7CisgIGlmIChzaXplID0gMTUpCisgIHRoZW4gc2l6ZSA6PSBJbnRlZ2VyKCBSZWFkVmFyaW50MzIpOworCisgIHR5cGVfIDo9IGdldFRUeXBlKCBzaXplX2FuZF90eXBlKTsKKyAgSW5pdCggcmVzdWx0LCB0eXBlXywgc2l6ZSk7CitlbmQ7CisKKworLy8gUmVhZCBhIGJvb2xlYW4gb2ZmIHRoZSB3aXJlLiBJZiB0aGlzIGlzIGEgYm9vbGVhbiBmaWVsZCwgdGhlIHZhbHVlIHNob3VsZAorLy8gYWxyZWFkeSBoYXZlIGJlZW4gUmVhZCBkdXJpbmcgUmVhZEZpZWxkQmVnaW4sIHNvIHdlJ2xsIGp1c3QgY29uc3VtZSB0aGUKKy8vIHByZS1zdG9yZWQgdmFsdWUuIE90aGVyd2lzZSwgUmVhZCBhIGJ5dGUuCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sSW1wbC5SZWFkQm9vbDogQm9vbGVhbjsKK2JlZ2luCisgIGlmIGJvb2xWYWx1ZV8gPD4gdW51c2VkIHRoZW4gYmVnaW4KKyAgICByZXN1bHQgOj0gKGJvb2xWYWx1ZV8gPSBib29sX3RydWUpOworICAgIGJvb2xWYWx1ZV8gOj0gdW51c2VkOworICAgIEV4aXQ7CisgIGVuZDsKKworICByZXN1bHQgOj0gKEJ5dGUoUmVhZEJ5dGUpID0gQnl0ZShUeXBlcy5CT09MRUFOX1RSVUUpKTsKK2VuZDsKKworCisvLyBSZWFkIGEgc2luZ2xlIGJ5dGUgb2ZmIHRoZSB3aXJlLiBOb3RoaW5nIGludGVyZXN0aW5nIGhlcmUuCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sSW1wbC5SZWFkQnl0ZTogU2hvcnRJbnQ7CitiZWdpbgorICBUcmFuc3BvcnQuUmVhZEFsbCggQHJlc3VsdCwgU2l6ZU9mKHJlc3VsdCksIDAsIDEpOworZW5kOworCisKKy8vIFJlYWQgYW4gaTE2IGZyb20gdGhlIHdpcmUgYXMgYSB6aWd6YWcgdmFyaW50LgorZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbEltcGwuUmVhZEkxNjogU21hbGxJbnQ7CitiZWdpbgorICByZXN1bHQgOj0gU21hbGxJbnQoIHppZ3phZ1RvSW50KCBSZWFkVmFyaW50MzIpKTsKK2VuZDsKKworCisvLyBSZWFkIGFuIGkzMiBmcm9tIHRoZSB3aXJlIGFzIGEgemlnemFnIHZhcmludC4KK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2xJbXBsLlJlYWRJMzI6IEludGVnZXI7CitiZWdpbgorICByZXN1bHQgOj0gemlnemFnVG9JbnQoIFJlYWRWYXJpbnQzMik7CitlbmQ7CisKKworLy8gUmVhZCBhbiBpNjQgZnJvbSB0aGUgd2lyZSBhcyBhIHppZ3phZyB2YXJpbnQuCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sSW1wbC5SZWFkSTY0OiBJbnQ2NDsKK2JlZ2luCisgIHJlc3VsdCA6PSB6aWd6YWdUb0xvbmcoIFJlYWRWYXJpbnQ2NCk7CitlbmQ7CisKKworLy8gTm8gbWFnaWMgaGVyZSAtIGp1c3QgUmVhZCBhIGRvdWJsZSBvZmYgdGhlIHdpcmUuCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sSW1wbC5SZWFkRG91YmxlOkRvdWJsZTsKK3ZhciBsb25nQml0cyA6IFRCeXRlczsKK2JlZ2luCisgIFNldExlbmd0aCggbG9uZ0JpdHMsIDgpOworICBUcmFuc3BvcnQuUmVhZEFsbCggbG9uZ0JpdHMsIDAsIDgpOworICByZXN1bHQgOj0gSW50NjRCaXRzVG9Eb3VibGUoIGJ5dGVzVG9Mb25nKCBsb25nQml0cykpOworZW5kOworCisKKy8vIFJlYWQgYSBieXRlW10gZnJvbSB0aGUgd2lyZS4KK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2xJbXBsLlJlYWRCaW5hcnk6IFRCeXRlczsKK3ZhciBsZW5ndGggOiBJbnRlZ2VyOworYmVnaW4KKyAgbGVuZ3RoIDo9IEludGVnZXIoIFJlYWRWYXJpbnQzMik7CisgIFNldExlbmd0aCggcmVzdWx0LCBsZW5ndGgpOworICBpZiAobGVuZ3RoID4gMCkKKyAgdGhlbiBUcmFuc3BvcnQuUmVhZEFsbCggcmVzdWx0LCAwLCBsZW5ndGgpOworZW5kOworCisKK3Byb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5SZWFkTWVzc2FnZUVuZDsKK2JlZ2luCisgIC8vIG5vdGhpbmcgdG8gZG8KK2VuZDsKKworCitwcm9jZWR1cmUgVENvbXBhY3RQcm90b2NvbEltcGwuUmVhZEZpZWxkRW5kOworYmVnaW4KKyAgLy8gbm90aGluZyB0byBkbworZW5kOworCisKK3Byb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5SZWFkTWFwRW5kOworYmVnaW4KKyAgLy8gbm90aGluZyB0byBkbworZW5kOworCisKK3Byb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5SZWFkTGlzdEVuZDsKK2JlZ2luCisgIC8vIG5vdGhpbmcgdG8gZG8KK2VuZDsKKworCitwcm9jZWR1cmUgVENvbXBhY3RQcm90b2NvbEltcGwuUmVhZFNldEVuZDsKK2JlZ2luCisgIC8vIG5vdGhpbmcgdG8gZG8KK2VuZDsKKworCisKKy8vIFJlYWQgYW4gaTMyIGZyb20gdGhlIHdpcmUgYXMgYSB2YXJpbnQuIFRoZSBNU0Igb2YgZWFjaCBieXRlIGlzIHNldAorLy8gaWYgdGhlcmUgaXMgYW5vdGhlciBieXRlIHRvIGZvbGxvdy4gVGhpcyBjYW4gUmVhZCB1cCB0byA1IGJ5dGVzLgorZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbEltcGwuUmVhZFZhcmludDMyIDogQ2FyZGluYWw7Cit2YXIgc2hpZnQgOiBJbnRlZ2VyOworICAgIGIgOiBCeXRlOworYmVnaW4KKyAgcmVzdWx0IDo9IDA7CisgIHNoaWZ0ICA6PSAwOworICB3aGlsZSBUUlVFIGRvIGJlZ2luCisgICAgYiA6PSBCeXRlKCBSZWFkQnl0ZSk7CisgICAgcmVzdWx0IDo9IHJlc3VsdCBvciAoQ2FyZGluYWwoYiBhbmQgJDdGKSBzaGwgc2hpZnQpOworICAgIGlmICgoYiBhbmQgJDgwKSA8PiAkODApCisgICAgdGhlbiBCcmVhazsKKyAgICBJbmMoIHNoaWZ0LCA3KTsKKyAgZW5kOworZW5kOworCisKKy8vIFJlYWQgYW4gaTY0IGZyb20gdGhlIHdpcmUgYXMgYSBwcm9wZXIgdmFyaW50LiBUaGUgTVNCIG9mIGVhY2ggYnl0ZSBpcyBzZXQKKy8vIGlmIHRoZXJlIGlzIGFub3RoZXIgYnl0ZSB0byBmb2xsb3cuIFRoaXMgY2FuIFJlYWQgdXAgdG8gMTAgYnl0ZXMuCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sSW1wbC5SZWFkVmFyaW50NjQgOiBVSW50NjQ7Cit2YXIgc2hpZnQgOiBJbnRlZ2VyOworICAgIGIgOiBCeXRlOworYmVnaW4KKyAgcmVzdWx0IDo9IDA7CisgIHNoaWZ0ICA6PSAwOworICB3aGlsZSBUUlVFIGRvIGJlZ2luCisgICAgYiA6PSBCeXRlKCBSZWFkQnl0ZSk7CisgICAgcmVzdWx0IDo9IHJlc3VsdCBvciAoVUludDY0KGIgYW5kICQ3Rikgc2hsIHNoaWZ0KTsKKyAgICBpZiAoKGIgYW5kICQ4MCkgPD4gJDgwKQorICAgIHRoZW4gQnJlYWs7CisgICAgSW5jKCBzaGlmdCwgNyk7CisgIGVuZDsKK2VuZDsKKworCisvLyBDb252ZXJ0IGZyb20gemlnemFnIEludGVnZXIgdG8gSW50ZWdlci4KK2NsYXNzIGZ1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2xJbXBsLnppZ3phZ1RvSW50KCBjb25zdCBuIDogQ2FyZGluYWwgKSA6IEludGVnZXI7CitiZWdpbgorICByZXN1bHQgOj0gSW50ZWdlcihuIHNociAxKSB4b3IgKC1JbnRlZ2VyKG4gYW5kIDEpKTsKK2VuZDsKKworCisvLyBDb252ZXJ0IGZyb20gemlnemFnIEludDY0IHRvIEludDY0LgorY2xhc3MgZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbEltcGwuemlnemFnVG9Mb25nKCBjb25zdCBuIDogVUludDY0KSA6IEludDY0OworYmVnaW4KKyAgcmVzdWx0IDo9IEludDY0KG4gc2hyIDEpIHhvciAoLUludDY0KG4gYW5kIDEpKTsKK2VuZDsKKworCisvLyBOb3RlIHRoYXQgaXQncyBpbXBvcnRhbnQgdGhhdCB0aGUgbWFzayBieXRlcyBhcmUgSW50NjQgbGl0ZXJhbHMsCisvLyBvdGhlcndpc2UgdGhleSdsbCBkZWZhdWx0IHRvIGludHMsIGFuZCB3aGVuIHlvdSBzaGlmdCBhbiBJbnRlZ2VyIGxlZnQgNTYgYml0cywKKy8vIHlvdSBqdXN0IGdldCBhIG1lc3NlZCB1cCBJbnRlZ2VyLgorY2xhc3MgZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbEltcGwuYnl0ZXNUb0xvbmcoIGNvbnN0IGJ5dGVzIDogVEJ5dGVzKSA6IEludDY0OworYmVnaW4KKyAgQVNTRVJUKCBMZW5ndGgoYnl0ZXMpID49IDgpOworICByZXN1bHQgOj0gKEludDY0KGJ5dGVzWzddIGFuZCAkRkYpIHNobCA1Nikgb3IKKyAgICAgICAgICAgIChJbnQ2NChieXRlc1s2XSBhbmQgJEZGKSBzaGwgNDgpIG9yCisgICAgICAgICAgICAoSW50NjQoYnl0ZXNbNV0gYW5kICRGRikgc2hsIDQwKSBvcgorICAgICAgICAgICAgKEludDY0KGJ5dGVzWzRdIGFuZCAkRkYpIHNobCAzMikgb3IKKyAgICAgICAgICAgIChJbnQ2NChieXRlc1szXSBhbmQgJEZGKSBzaGwgMjQpIG9yCisgICAgICAgICAgICAoSW50NjQoYnl0ZXNbMl0gYW5kICRGRikgc2hsIDE2KSBvcgorICAgICAgICAgICAgKEludDY0KGJ5dGVzWzFdIGFuZCAkRkYpIHNobCAgOCkgb3IKKyAgICAgICAgICAgIChJbnQ2NChieXRlc1swXSBhbmQgJEZGKSk7CitlbmQ7CisKKworY2xhc3MgZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbEltcGwuaXNCb29sVHlwZSggY29uc3QgYiA6IGJ5dGUpIDogQm9vbGVhbjsKK3ZhciBsb3dlck5pYmJsZSA6IEJ5dGU7CitiZWdpbgorICBsb3dlck5pYmJsZSA6PSBiIGFuZCAkMGY7CisgIHJlc3VsdCA6PSAoVHlwZXMobG93ZXJOaWJibGUpIGluIFtUeXBlcy5CT09MRUFOX1RSVUUsIFR5cGVzLkJPT0xFQU5fRkFMU0VdKTsKK2VuZDsKKworCisvLyBHaXZlbiBhIFRDb21wYWN0UHJvdG9jb2wuVHlwZXMgY29uc3RhbnQsIGNvbnZlcnQgaXQgdG8gaXRzIGNvcnJlc3BvbmRpbmcgVFR5cGUgdmFsdWUuCitjbGFzcyBmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sSW1wbC5nZXRUVHlwZSggY29uc3QgdHlwZV8gOiBieXRlKSA6IFRUeXBlOwordmFyIHRjdCA6IFR5cGVzOworYmVnaW4KKyAgdGN0IDo9IFR5cGVzKCB0eXBlXyBhbmQgJDBGKTsKKyAgaWYgdGN0IGluIFtMb3coVHlwZXMpLi5IaWdoKFR5cGVzKV0KKyAgdGhlbiByZXN1bHQgOj0gdGNvbXBhY3RUeXBlVG9UeXBlW3RjdF0KKyAgZWxzZSByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb25JbnZhbGlkRGF0YS5DcmVhdGUoJ2RvbicndCBrbm93IHdoYXQgdHlwZTogJytJbnRUb1N0cihPcmQodGN0KSkpOworZW5kOworCisKKy8vIEdpdmVuIGEgVFR5cGUgdmFsdWUsIGZpbmQgdGhlIGFwcHJvcHJpYXRlIFRDb21wYWN0UHJvdG9jb2wuVHlwZXMgY29uc3RhbnQuCitjbGFzcyBmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sSW1wbC5nZXRDb21wYWN0VHlwZSggY29uc3QgdHR5cGUgOiBUVHlwZSkgOiBCeXRlOworYmVnaW4KKyAgaWYgdHR5cGUgaW4gVkFMSURfVFRZUEVTCisgIHRoZW4gcmVzdWx0IDo9IEJ5dGUoIHR0eXBlVG9Db21wYWN0VHlwZVt0dHlwZV0pCisgIGVsc2UgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uSW52YWxpZERhdGEuQ3JlYXRlKCdkb24nJ3Qga25vdyB3aGF0IHR5cGU6ICcrSW50VG9TdHIoT3JkKHR0eXBlKSkpOworZW5kOworCisKKy8vLS0tIHVuaXQgdGVzdHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit7JElGREVGIERlYnVnfQorcHJvY2VkdXJlIFRlc3REb3VibGVUb0ludDY0Qml0czsKKworICBwcm9jZWR1cmUgVGVzdFBhaXIoIGNvbnN0IGEgOiBEb3VibGU7IGNvbnN0IGIgOiBJbnQ2NCk7CisgIGJlZ2luCisgICAgQVNTRVJUKCBUQ29tcGFjdFByb3RvY29sSW1wbC5Eb3VibGVUb0ludDY0Qml0cyhhKSA9IGIpOworICAgIEFTU0VSVCggVENvbXBhY3RQcm90b2NvbEltcGwuSW50NjRCaXRzVG9Eb3VibGUoYikgPSBhKTsKKyAgZW5kOworCitiZWdpbgorICBUZXN0UGFpciggMS4wMDAwMDAwMDAwMDAwMDAwRSswMDAsICBJbnQ2NCgkM0ZGMDAwMDAwMDAwMDAwMCkpOworICBUZXN0UGFpciggMS41MDAwMDAwMDAwMDAwMDAwRSswMDEsICBJbnQ2NCgkNDAyRTAwMDAwMDAwMDAwMCkpOworICBUZXN0UGFpciggMi41NTAwMDAwMDAwMDAwMDAwRSswMDIsICBJbnQ2NCgkNDA2RkUwMDAwMDAwMDAwMCkpOworICBUZXN0UGFpciggNC4yOTQ5NjcyOTUwMDAwMDAwRSswMDksICBJbnQ2NCgkNDFFRkZGRkZGRkUwMDAwMCkpOworICBUZXN0UGFpciggMy45MDYyNTAwMDAwMDAwMDAwRS0wMDMsICBJbnQ2NCgkM0Y3MDAwMDAwMDAwMDAwMCkpOworICBUZXN0UGFpciggMi4zMjgzMDY0MzY1Mzg2OTYzRS0wMTAsICBJbnQ2NCgkM0RGMDAwMDAwMDAwMDAwMCkpOworICBUZXN0UGFpciggMS4yMzQ1Njc4OTAxMjMwMDAwRS0zMDAsICBJbnQ2NCgkMDFBQTc0RkUxQzFFN0U0NSkpOworICBUZXN0UGFpciggMS4yMzQ1Njc4OTAxMjM0NTAwRS0xNTAsICBJbnQ2NCgkMjBEMDJBMzY1ODZEQjRCQikpOworICBUZXN0UGFpciggMS4yMzQ1Njc4OTAxMjM0NTY1RSswMDAsICBJbnQ2NCgkM0ZGM0MwQ0E0MjhDNTlGQSkpOworICBUZXN0UGFpciggMS4yMzQ1Njc4OTAxMjM0NTY3RSswMDAsICBJbnQ2NCgkM0ZGM0MwQ0E0MjhDNTlGQikpOworICBUZXN0UGFpciggMS4yMzQ1Njc4OTAxMjM0NTY5RSswMDAsICBJbnQ2NCgkM0ZGM0MwQ0E0MjhDNTlGQykpOworICBUZXN0UGFpciggMS4yMzQ1Njc4OTAxMjM0NTY5RSsxNTAsICBJbnQ2NCgkNUYxODIzNDRDRDNDREY5RikpOworICBUZXN0UGFpciggMS4yMzQ1Njc4OTAxMjM0NTY5RSszMDAsICBJbnQ2NCgkN0UzRDdFRThCQ0JCRDM1MikpOworICBUZXN0UGFpciggLTEuNzk3NjkzMTM0ODYyMzE1N0UrMzA4LCBJbnQ2NCgkRkZFRkZGRkZGRkZGRkZGRikpOworICBUZXN0UGFpciggMS43OTc2OTMxMzQ4NjIzMTU3RSszMDgsICBJbnQ2NCgkN0ZFRkZGRkZGRkZGRkZGRikpOworICBUZXN0UGFpciggNC45NDA2NTY0NTg0MTI0NjU0RS0zMjQsICBJbnQ2NCgkMDAwMDAwMDAwMDAwMDAwMSkpOworICBUZXN0UGFpciggMC4wMDAwMDAwMDAwMDAwMDAwRSswMDAsICBJbnQ2NCgkMDAwMDAwMDAwMDAwMDAwMCkpOworICBUZXN0UGFpciggNC45NDA2NTY0NTg0MTI0N0UtMzI0LCAgICBJbnQ2NCgkMDAwMDAwMDAwMDAwMDAwMSkpOworICBUZXN0UGFpciggMy4yMzc4NTkyMTAwMjA2MDkyRS0zMTksICBJbnQ2NCgkMDAwMDAwMDAwMDAwRkZGRikpOworICBUZXN0UGFpciggMS4zOTA2NzExNjE1NjY5OTU5RS0zMDksICBJbnQ2NCgkMDAwMEZGRkZGRkZGRkZGRikpOworICBUZXN0UGFpciggTmVnSW5maW5pdHksICAgICAgICAgICAgICBJbnQ2NCgkRkZGMDAwMDAwMDAwMDAwMCkpOworICBUZXN0UGFpciggSW5maW5pdHksICAgICAgICAgICAgICAgICBJbnQ2NCgkN0ZGMDAwMDAwMDAwMDAwMCkpOworCisgIC8vIE5hTiBpcyBzcGVjaWFsCisgIEFTU0VSVCggVENvbXBhY3RQcm90b2NvbEltcGwuRG91YmxlVG9JbnQ2NEJpdHMoIE5hTikgPSBJbnQ2NCgkRkZGODAwMDAwMDAwMDAwMCkpOworICBBU1NFUlQoIElzTmFuKCBUQ29tcGFjdFByb3RvY29sSW1wbC5JbnQ2NEJpdHNUb0RvdWJsZSggSW50NjQoJEZGRjgwMDAwMDAwMDAwMDApKSkpOworZW5kOworeyRFTkRJRn0KKworCit7JElGREVGIERlYnVnfQorcHJvY2VkdXJlIFRlc3RaaWdaYWc7CisKKyAgcHJvY2VkdXJlIFRlc3QzMiggY29uc3QgdGVzdCA6IEludGVnZXIpOworICB2YXIgenogOiBDYXJkaW5hbDsKKyAgYmVnaW4KKyAgICB6eiA6PSBUQ29tcGFjdFByb3RvY29sSW1wbC5pbnRUb1ppZ1phZyh0ZXN0KTsKKyAgICBBU1NFUlQoIFRDb21wYWN0UHJvdG9jb2xJbXBsLnppZ3phZ1RvSW50KHp6KSA9IHRlc3QsIEludFRvU3RyKHRlc3QpKTsKKyAgZW5kOworCisgIHByb2NlZHVyZSBUZXN0NjQoIGNvbnN0IHRlc3QgOiBJbnQ2NCk7CisgIHZhciB6eiA6IFVJbnQ2NDsKKyAgYmVnaW4KKyAgICB6eiA6PSBUQ29tcGFjdFByb3RvY29sSW1wbC5sb25nVG9aaWd6YWcodGVzdCk7CisgICAgQVNTRVJUKCBUQ29tcGFjdFByb3RvY29sSW1wbC56aWd6YWdUb0xvbmcoenopID0gdGVzdCwgSW50VG9TdHIodGVzdCkpOworICBlbmQ7CisKK3ZhciBpIDogSW50ZWdlcjsKK2JlZ2luCisgIC8vIHByb3RvYnVmIHRlc3RjYXNlcworICBBU1NFUlQoIFRDb21wYWN0UHJvdG9jb2xJbXBsLmludFRvWmlnWmFnKDApICA9IDAsICdwYiAjMSB0byBaaWdaYWcnKTsKKyAgQVNTRVJUKCBUQ29tcGFjdFByb3RvY29sSW1wbC5pbnRUb1ppZ1phZygtMSkgPSAxLCAncGIgIzIgdG8gWmlnWmFnJyk7CisgIEFTU0VSVCggVENvbXBhY3RQcm90b2NvbEltcGwuaW50VG9aaWdaYWcoMSkgID0gMiwgJ3BiICMzIHRvIFppZ1phZycpOworICBBU1NFUlQoIFRDb21wYWN0UHJvdG9jb2xJbXBsLmludFRvWmlnWmFnKC0yKSA9IDMsICdwYiAjNCB0byBaaWdaYWcnKTsKKyAgQVNTRVJUKCBUQ29tcGFjdFByb3RvY29sSW1wbC5pbnRUb1ppZ1phZygrMjE0NzQ4MzY0NykgPSA0Mjk0OTY3Mjk0LCAncGIgIzUgdG8gWmlnWmFnJyk7CisgIEFTU0VSVCggVENvbXBhY3RQcm90b2NvbEltcGwuaW50VG9aaWdaYWcoLTIxNDc0ODM2NDgpID0gNDI5NDk2NzI5NSwgJ3BiICM2IHRvIFppZ1phZycpOworCisgIC8vIHByb3RvYnVmIHRlc3RjYXNlcworICBBU1NFUlQoIFRDb21wYWN0UHJvdG9jb2xJbXBsLnppZ3phZ1RvSW50KDApICA9IDAsICdwYiAjMSBmcm9tIFppZ1phZycpOworICBBU1NFUlQoIFRDb21wYWN0UHJvdG9jb2xJbXBsLnppZ3phZ1RvSW50KDEpID0gLTEsICdwYiAjMiBmcm9tIFppZ1phZycpOworICBBU1NFUlQoIFRDb21wYWN0UHJvdG9jb2xJbXBsLnppZ3phZ1RvSW50KDIpICA9IDEsICdwYiAjMyBmcm9tIFppZ1phZycpOworICBBU1NFUlQoIFRDb21wYWN0UHJvdG9jb2xJbXBsLnppZ3phZ1RvSW50KDMpID0gLTIsICdwYiAjNCBmcm9tIFppZ1phZycpOworICBBU1NFUlQoIFRDb21wYWN0UHJvdG9jb2xJbXBsLnppZ3phZ1RvSW50KDQyOTQ5NjcyOTQpID0gKzIxNDc0ODM2NDcsICdwYiAjNSBmcm9tIFppZ1phZycpOworICBBU1NFUlQoIFRDb21wYWN0UHJvdG9jb2xJbXBsLnppZ3phZ1RvSW50KDQyOTQ5NjcyOTUpID0gLTIxNDc0ODM2NDgsICdwYiAjNiBmcm9tIFppZ1phZycpOworCisgIC8vIGJhY2sgYW5kIGZvcnRoIDMyCisgIFRlc3QzMiggMCk7CisgIGZvciBpIDo9IDAgdG8gMzAgZG8gYmVnaW4KKyAgICBUZXN0MzIoICsoSW50ZWdlcigxKSBzaGwgaSkpOworICAgIFRlc3QzMiggLShJbnRlZ2VyKDEpIHNobCBpKSk7CisgIGVuZDsKKyAgVGVzdDMyKCBJbnRlZ2VyKCQ3RkZGRkZGRikpOworICBUZXN0MzIoIEludGVnZXIoJDgwMDAwMDAwKSk7CisKKyAgLy8gYmFjayBhbmQgZm9ydGggNjQKKyAgVGVzdDY0KCAwKTsKKyAgZm9yIGkgOj0gMCB0byA2MiBkbyBiZWdpbgorICAgIFRlc3Q2NCggKyhJbnQ2NCgxKSBzaGwgaSkpOworICAgIFRlc3Q2NCggLShJbnQ2NCgxKSBzaGwgaSkpOworICBlbmQ7CisgIFRlc3Q2NCggSW50NjQoJDdGRkZGRkZGRkZGRkZGRkYpKTsKKyAgVGVzdDY0KCBJbnQ2NCgkODAwMDAwMDAwMDAwMDAwMCkpOworZW5kOworeyRFTkRJRn0KKworCit7JElGREVGIERlYnVnfQorcHJvY2VkdXJlIFRlc3RMb25nQnl0ZXM7CisKKyAgcHJvY2VkdXJlIFRlc3QoIGNvbnN0IHRlc3QgOiBJbnQ2NCk7CisgIHZhciBidWYgOiBUQnl0ZXM7CisgIGJlZ2luCisgICAgVENvbXBhY3RQcm90b2NvbEltcGwuZml4ZWRMb25nVG9CeXRlcyggdGVzdCwgYnVmKTsKKyAgICBBU1NFUlQoIFRDb21wYWN0UHJvdG9jb2xJbXBsLmJ5dGVzVG9Mb25nKCBidWYpID0gdGVzdCwgSW50VG9TdHIodGVzdCkpOworICBlbmQ7CisKK3ZhciBpIDogSW50ZWdlcjsKK2JlZ2luCisgIFRlc3QoIDApOworICBmb3IgaSA6PSAwIHRvIDYyIGRvIGJlZ2luCisgICAgVGVzdCggKyhJbnQ2NCgxKSBzaGwgaSkpOworICAgIFRlc3QoIC0oSW50NjQoMSkgc2hsIGkpKTsKKyAgZW5kOworICBUZXN0KCBJbnQ2NCgkN0ZGRkZGRkZGRkZGRkZGRikpOworICBUZXN0KCBJbnQ2NCgkODAwMDAwMDAwMDAwMDAwMCkpOworZW5kOworeyRFTkRJRn0KKworCit7JElGREVGIERlYnVnfQorcHJvY2VkdXJlIFVuaXRUZXN0OwordmFyIHcgOiBXT1JEOworY29uc3QgRlBVX0NXX0RFTk9STUFMSVpFRCA9ICQwMDAyOworYmVnaW4KKyAgdyA6PSBHZXQ4MDg3Q1c7CisgIHRyeQorICAgIFNldDgwODdDVyggdyBvciBGUFVfQ1dfREVOT1JNQUxJWkVEKTsKKworICAgIFRlc3REb3VibGVUb0ludDY0Qml0czsKKyAgICBUZXN0WmlnWmFnOworICAgIFRlc3RMb25nQnl0ZXM7CisKKyAgZmluYWxseQorICAgIFNldDgwODdDVyggdyk7CisgIGVuZDsKK2VuZDsKK3skRU5ESUZ9CisKKworaW5pdGlhbGl6YXRpb24KKyAgeyRJRkRFRiBEZWJ1Z30KKyAgVW5pdFRlc3Q7CisgIHskRU5ESUZ9CisKK2VuZC4KKwpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlByb3RvY29sLkpTT04ucGFzIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlByb3RvY29sLkpTT04ucGFzCmluZGV4IDZkMzA1ZDguLjMwNjAwYWEgMTAwNjQ0Ci0tLSBhL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5Qcm90b2NvbC5KU09OLnBhcworKysgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuUHJvdG9jb2wuSlNPTi5wYXMKQEAgLTI0LDEzICsyNCwxNCBAQAogaW50ZXJmYWNlCiAKIHVzZXMKKyAgQ2hhcmFjdGVyLAogICBDbGFzc2VzLAogICBTeXNVdGlscywKICAgTWF0aCwKLSAgSWRDb2Rlck1JTUUsCiAgIEdlbmVyaWNzLkNvbGxlY3Rpb25zLAogICBUaHJpZnQuVHJhbnNwb3J0LAotICBUaHJpZnQuUHJvdG9jb2w7CisgIFRocmlmdC5Qcm90b2NvbCwKKyAgVGhyaWZ0LlV0aWxzOwogCiB0eXBlCiAgIElKU09OUHJvdG9jb2wgPSBpbnRlcmZhY2UoIElQcm90b2NvbCkKQEAgLTEwMiw3ICsxMDMsNyBAQAogCiAgICAgICBwcml2YXRlCiAgICAgICAgIEZIYXNEYXRhIDogQm9vbGVhbjsKLSAgICAgICAgRkRhdGEgICAgOiBUQnl0ZXM7CisgICAgICAgIEZEYXRhICAgIDogQnl0ZTsKIAogICAgICAgcHVibGljCiAgICAgICAgIC8vIFJldHVybiBhbmQgY29uc3VtZSB0aGUgbmV4dCBieXRlIHRvIGJlIFJlYWQsIGVpdGhlciB0YWtpbmcgaXQgZnJvbSB0aGUKQEAgLTE2OCwxOCArMTY5LDE4IEBACiAKICAgcHVibGljCiAgICAgLy8gSVByb3RvY29sCi0gICAgcHJvY2VkdXJlIFdyaXRlTWVzc2FnZUJlZ2luKCBjb25zdCBhTXNnIDogSU1lc3NhZ2UpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVNZXNzYWdlQmVnaW4oIGNvbnN0IGFNc2cgOiBUVGhyaWZ0TWVzc2FnZSk7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBXcml0ZU1lc3NhZ2VFbmQ7IG92ZXJyaWRlOwotICAgIHByb2NlZHVyZSBXcml0ZVN0cnVjdEJlZ2luKCBjb25zdCBzdHJ1YzogSVN0cnVjdCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZVN0cnVjdEJlZ2luKCBjb25zdCBzdHJ1YzogVFRocmlmdFN0cnVjdCk7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBXcml0ZVN0cnVjdEVuZDsgb3ZlcnJpZGU7Ci0gICAgcHJvY2VkdXJlIFdyaXRlRmllbGRCZWdpbiggY29uc3QgZmllbGQ6IElGaWVsZCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUZpZWxkQmVnaW4oIGNvbnN0IGZpZWxkOiBUVGhyaWZ0RmllbGQpOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgV3JpdGVGaWVsZEVuZDsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFdyaXRlRmllbGRTdG9wOyBvdmVycmlkZTsKLSAgICBwcm9jZWR1cmUgV3JpdGVNYXBCZWdpbiggY29uc3QgbWFwOiBJTWFwKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlTWFwQmVnaW4oIGNvbnN0IG1hcDogVFRocmlmdE1hcCk7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBXcml0ZU1hcEVuZDsgb3ZlcnJpZGU7Ci0gICAgcHJvY2VkdXJlIFdyaXRlTGlzdEJlZ2luKCBjb25zdCBsaXN0OiBJTGlzdCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUxpc3RCZWdpbiggY29uc3QgbGlzdDogVFRocmlmdExpc3QpOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgV3JpdGVMaXN0RW5kKCk7IG92ZXJyaWRlOwotICAgIHByb2NlZHVyZSBXcml0ZVNldEJlZ2luKCBjb25zdCBzZXRfOiBJU2V0ICk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZVNldEJlZ2luKCBjb25zdCBzZXRfOiBUVGhyaWZ0U2V0ICk7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBXcml0ZVNldEVuZCgpOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgV3JpdGVCb29sKCBiOiBCb29sZWFuKTsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFdyaXRlQnl0ZSggYjogU2hvcnRJbnQpOyBvdmVycmlkZTsKQEAgLTE5MCwxNyArMTkxLDE3IEBACiAgICAgcHJvY2VkdXJlIFdyaXRlU3RyaW5nKCBjb25zdCBzOiBzdHJpbmcgKTsgICBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgV3JpdGVCaW5hcnkoIGNvbnN0IGI6IFRCeXRlcyk7IG92ZXJyaWRlOwogICAgIC8vCi0gICAgZnVuY3Rpb24gUmVhZE1lc3NhZ2VCZWdpbjogSU1lc3NhZ2U7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRNZXNzYWdlQmVnaW46IFRUaHJpZnRNZXNzYWdlOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgUmVhZE1lc3NhZ2VFbmQoKTsgb3ZlcnJpZGU7Ci0gICAgZnVuY3Rpb24gUmVhZFN0cnVjdEJlZ2luOiBJU3RydWN0OyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkU3RydWN0QmVnaW46IFRUaHJpZnRTdHJ1Y3Q7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBSZWFkU3RydWN0RW5kOyBvdmVycmlkZTsKLSAgICBmdW5jdGlvbiBSZWFkRmllbGRCZWdpbjogSUZpZWxkOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkRmllbGRCZWdpbjogVFRocmlmdEZpZWxkOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgUmVhZEZpZWxkRW5kKCk7IG92ZXJyaWRlOwotICAgIGZ1bmN0aW9uIFJlYWRNYXBCZWdpbjogSU1hcDsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZE1hcEJlZ2luOiBUVGhyaWZ0TWFwOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgUmVhZE1hcEVuZCgpOyBvdmVycmlkZTsKLSAgICBmdW5jdGlvbiBSZWFkTGlzdEJlZ2luOiBJTGlzdDsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZExpc3RCZWdpbjogVFRocmlmdExpc3Q7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBSZWFkTGlzdEVuZCgpOyBvdmVycmlkZTsKLSAgICBmdW5jdGlvbiBSZWFkU2V0QmVnaW46IElTZXQ7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRTZXRCZWdpbjogVFRocmlmdFNldDsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFJlYWRTZXRFbmQoKTsgb3ZlcnJpZGU7CiAgICAgZnVuY3Rpb24gUmVhZEJvb2w6IEJvb2xlYW47IG92ZXJyaWRlOwogICAgIGZ1bmN0aW9uIFJlYWRCeXRlOiBTaG9ydEludDsgb3ZlcnJpZGU7CkBAIC0zMDksNyArMzEwLDcgQEAKICAgICBUVHlwZS5TZXRfOiAgICAgcmVzdWx0IDo9IE5BTUVfU0VUOwogICAgIFRUeXBlLkxpc3Q6ICAgICByZXN1bHQgOj0gTkFNRV9MSVNUOwogICBlbHNlCi0gICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uLkNyZWF0ZSggVFByb3RvY29sRXhjZXB0aW9uLk5PVF9JTVBMRU1FTlRFRCwgJ1VucmVjb2duaXplZCB0eXBlICgnK0ludFRvU3RyKE9yZCh0eXBlSUQpKSsnKScpOworICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbk5vdEltcGxlbWVudGVkLkNyZWF0ZSgnVW5yZWNvZ25pemVkIHR5cGUgKCcrSW50VG9TdHIoT3JkKHR5cGVJRCkpKycpJyk7CiAgIGVuZDsKIGVuZDsKIApAQCAtMzI3LDcgKzMyOCw3IEBACiAgIGVsc2UgaWYgbmFtZSA9IE5BTUVfTUFQICAgIHRoZW4gcmVzdWx0IDo9IFRUeXBlLk1hcAogICBlbHNlIGlmIG5hbWUgPSBOQU1FX0xJU1QgICB0aGVuIHJlc3VsdCA6PSBUVHlwZS5MaXN0CiAgIGVsc2UgaWYgbmFtZSA9IE5BTUVfU0VUICAgIHRoZW4gcmVzdWx0IDo9IFRUeXBlLlNldF8KLSAgZWxzZSByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24uQ3JlYXRlKCBUUHJvdG9jb2xFeGNlcHRpb24uTk9UX0lNUExFTUVOVEVELCAnVW5yZWNvZ25pemVkIHR5cGUgKCcrbmFtZSsnKScpOworICBlbHNlIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbk5vdEltcGxlbWVudGVkLkNyZWF0ZSgnVW5yZWNvZ25pemVkIHR5cGUgKCcrbmFtZSsnKScpOwogZW5kOwogCiAKQEAgLTQzNiwyMSArNDM3LDE5IEBACiAgIGlmIEZIYXNEYXRhCiAgIHRoZW4gRkhhc0RhdGEgOj0gRkFMU0UKICAgZWxzZSBiZWdpbgotICAgIFNldExlbmd0aCggRkRhdGEsIDEpOwotICAgIElKU09OUHJvdG9jb2woRlByb3RvKS5UcmFuc3BvcnQuUmVhZEFsbCggRkRhdGEsIDAsIDEpOworICAgIElKU09OUHJvdG9jb2woRlByb3RvKS5UcmFuc3BvcnQuUmVhZEFsbCggQEZEYXRhLCBTaXplT2YoRkRhdGEpLCAwLCAxKTsKICAgZW5kOwotICByZXN1bHQgOj0gRkRhdGFbMF07CisgIHJlc3VsdCA6PSBGRGF0YTsKIGVuZDsKIAogCiBmdW5jdGlvbiBUSlNPTlByb3RvY29sSW1wbC5UTG9va2FoZWFkUmVhZGVyLlBlZWsgOiBCeXRlOwogYmVnaW4KICAgaWYgbm90IEZIYXNEYXRhIHRoZW4gYmVnaW4KLSAgICBTZXRMZW5ndGgoIEZEYXRhLCAxKTsKLSAgICBJSlNPTlByb3RvY29sKEZQcm90bykuVHJhbnNwb3J0LlJlYWRBbGwoIEZEYXRhLCAwLCAxKTsKKyAgICBJSlNPTlByb3RvY29sKEZQcm90bykuVHJhbnNwb3J0LlJlYWRBbGwoIEBGRGF0YSwgU2l6ZU9mKEZEYXRhKSwgMCwgMSk7CiAgICAgRkhhc0RhdGEgOj0gVFJVRTsKICAgZW5kOwotICByZXN1bHQgOj0gRkRhdGFbMF07CisgIHJlc3VsdCA6PSBGRGF0YTsKIGVuZDsKIAogCkBAIC01MDUsNyArNTA0LDcgQEAKIGJlZ2luCiAgIGNoIDo9IEZSZWFkZXIuUmVhZDsKICAgaWYgKGNoIDw+IGIpCi0gIHRoZW4gcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uLkNyZWF0ZSggVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwgJ1VuZXhwZWN0ZWQgY2hhcmFjdGVyICgnK0NoYXIoY2gpKycpJyk7CisgIHRoZW4gcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uSW52YWxpZERhdGEuQ3JlYXRlKCdVbmV4cGVjdGVkIGNoYXJhY3RlciAoJytDaGFyKGNoKSsnKScpOwogZW5kOwogCiAKQEAgLTUxNSw3ICs1MTQsNyBAQAogICBpIDo9IFN0clRvSW50RGVmKCAnJDAnK0NoYXIoY2gpLCAtMSk7CiAgIGlmICgwIDw9IGkpIGFuZCAoaSA8ICQxMCkKICAgdGhlbiByZXN1bHQgOj0gaQotICBlbHNlIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbi5DcmVhdGUoIFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsICdFeHBlY3RlZCBoZXggY2hhcmFjdGVyICgnK0NoYXIoY2gpKycpJyk7CisgIGVsc2UgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uSW52YWxpZERhdGEuQ3JlYXRlKCdFeHBlY3RlZCBoZXggY2hhcmFjdGVyICgnK0NoYXIoY2gpKycpJyk7CiBlbmQ7CiAKIApAQCAtNjIyLDI0ICs2MjEsMjkgQEAKIAogCiBwcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuV3JpdGVKU09OQmFzZTY0KCBjb25zdCBiIDogVEJ5dGVzKTsKLXZhciBzdHIgOiBzdHJpbmc7Ci0gICAgdG1wIDogVEJ5dGVzOwotICAgIGkgICA6IEludGVnZXI7Cit2YXIgbGVuLCBvZmYsIGNudCA6IEludGVnZXI7CisgICAgdG1wQnVmIDogVEJ5dGVzOwogYmVnaW4KICAgRkNvbnRleHQuV3JpdGU7CiAgIFRyYW5zcG9ydC5Xcml0ZSggUVVPVEUpOwogCi0gIC8vIEZpcnN0IGJhc2U2NC1lbmNvZGUgYiwgdGhlbiB3cml0ZSB0aGUgcmVzdWx0aW5nIDgtYml0IGNoYXJzCi0gIC8vIFVuZm9ydHVuYXRlbHksIEVuY29kZUJ5dGVzKCkgcmV0dXJucyBhIHN0cmluZyBvZiAxNi1iaXQgKHdpZGUpIGNoYXJzCi0gIC8vIEFuZCBmb3IgdGhlIHNha2Ugb2YgZWZmaWNpZW5jeSwgd2Ugd2FudCB0byB3cml0ZSBldmVyeXRoaW5nIGF0IG9uY2UKLSAgc3RyIDo9IFRJZEVuY29kZXJNSU1FLkVuY29kZUJ5dGVzKGIpOwotICBBU1NFUlQoIFNpemVPZihzdHJbMV0pID0gU2l6ZU9mKFdvcmQpKTsKLSAgU2V0TGVuZ3RoKCB0bXAsIExlbmd0aChzdHIpKTsKLSAgZm9yIGkgOj0gMSB0byBMZW5ndGgoc3RyKSBkbyBiZWdpbgotICAgIEFTU0VSVCggSGkoV29yZChzdHJbaV0pKSA9IDApOyAgIC8vIGJhc2U2NCBjb25zaXN0cyBvZiBhIHdlbGwtZGVmaW5lZCBzZXQgb2YgOC1iaXQgY2hhcnMgb25seQotICAgIHRtcFtpLTFdIDo9IExvKFdvcmQoc3RyW2ldKSk7ICAgIC8vIGV4dHJhY3QgdGhlIGxvd2VyIGJ5dGUKKyAgbGVuIDo9IExlbmd0aChiKTsKKyAgb2ZmIDo9IDA7CisgIFNldExlbmd0aCggdG1wQnVmLCA0KTsKKworICB3aGlsZSBsZW4gPj0gMyBkbyBiZWdpbgorICAgIC8vIEVuY29kZSAzIGJ5dGVzIGF0IGEgdGltZQorICAgIEJhc2U2NFV0aWxzLkVuY29kZSggYiwgb2ZmLCAzLCB0bXBCdWYsIDApOworICAgIFRyYW5zcG9ydC5Xcml0ZSggdG1wQnVmLCAwLCA0KTsKKyAgICBJbmMoIG9mZiwgMyk7CisgICAgRGVjKCBsZW4sIDMpOwogICBlbmQ7Ci0gIFRyYW5zcG9ydC5Xcml0ZSggdG1wKTsgIC8vIG5vdyB3cml0ZSBhbGwgdGhlIGRhdGEKKworICAvLyBFbmNvZGUgcmVtYWluZGVyLCBpZiBhbnkKKyAgaWYgbGVuID4gMCB0aGVuIGJlZ2luCisgICAgY250IDo9IEJhc2U2NFV0aWxzLkVuY29kZSggYiwgb2ZmLCBsZW4sIHRtcEJ1ZiwgMCk7CisgICAgVHJhbnNwb3J0LldyaXRlKCB0bXBCdWYsIDAsIGNudCk7CisgIGVuZDsKIAogICBUcmFuc3BvcnQuV3JpdGUoIFFVT1RFKTsKIGVuZDsKQEAgLTY3NSw3ICs2NzksNyBAQAogZW5kOwogCiAKLXByb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5Xcml0ZU1lc3NhZ2VCZWdpbiggY29uc3QgYU1zZyA6IElNZXNzYWdlKTsKK3Byb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5Xcml0ZU1lc3NhZ2VCZWdpbiggY29uc3QgYU1zZyA6IFRUaHJpZnRNZXNzYWdlKTsKIGJlZ2luCiAgIFJlc2V0Q29udGV4dFN0YWNrOyAgLy8gVEhSSUZULTE0NzMKIApAQCAtNjk0LDcgKzY5OCw3IEBACiBlbmQ7CiAKIAotcHJvY2VkdXJlIFRKU09OUHJvdG9jb2xJbXBsLldyaXRlU3RydWN0QmVnaW4oIGNvbnN0IHN0cnVjOiBJU3RydWN0KTsKK3Byb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5Xcml0ZVN0cnVjdEJlZ2luKCBjb25zdCBzdHJ1YzogVFRocmlmdFN0cnVjdCk7CiBiZWdpbgogICBXcml0ZUpTT05PYmplY3RTdGFydDsKIGVuZDsKQEAgLTcwNiw3ICs3MTAsNyBAQAogZW5kOwogCiAKLXByb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5Xcml0ZUZpZWxkQmVnaW4oIGNvbnN0IGZpZWxkIDogSUZpZWxkKTsKK3Byb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5Xcml0ZUZpZWxkQmVnaW4oIGNvbnN0IGZpZWxkIDogVFRocmlmdEZpZWxkKTsKIGJlZ2luCiAgIFdyaXRlSlNPTkludGVnZXIoZmllbGQuSUQpOwogICBXcml0ZUpTT05PYmplY3RTdGFydDsKQEAgLTcyNSw3ICs3MjksNyBAQAogICAvLyBub3RoaW5nIHRvIGRvCiBlbmQ7CiAKLXByb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5Xcml0ZU1hcEJlZ2luKCBjb25zdCBtYXA6IElNYXApOworcHJvY2VkdXJlIFRKU09OUHJvdG9jb2xJbXBsLldyaXRlTWFwQmVnaW4oIGNvbnN0IG1hcDogVFRocmlmdE1hcCk7CiBiZWdpbgogICBXcml0ZUpTT05BcnJheVN0YXJ0OwogICBXcml0ZUpTT05TdHJpbmcoIEdldFR5cGVOYW1lRm9yVHlwZUlEKCBtYXAuS2V5VHlwZSkpOwpAQCAtNzQyLDcgKzc0Niw3IEBACiBlbmQ7CiAKIAotcHJvY2VkdXJlIFRKU09OUHJvdG9jb2xJbXBsLldyaXRlTGlzdEJlZ2luKCBjb25zdCBsaXN0OiBJTGlzdCk7Citwcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuV3JpdGVMaXN0QmVnaW4oIGNvbnN0IGxpc3Q6IFRUaHJpZnRMaXN0KTsKIGJlZ2luCiAgIFdyaXRlSlNPTkFycmF5U3RhcnQ7CiAgIFdyaXRlSlNPTlN0cmluZyggR2V0VHlwZU5hbWVGb3JUeXBlSUQoIGxpc3QuRWxlbWVudFR5cGUpKTsKQEAgLTc1Niw3ICs3NjAsNyBAQAogZW5kOwogCiAKLXByb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5Xcml0ZVNldEJlZ2luKCBjb25zdCBzZXRfOiBJU2V0KTsKK3Byb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5Xcml0ZVNldEJlZ2luKCBjb25zdCBzZXRfOiBUVGhyaWZ0U2V0KTsKIGJlZ2luCiAgIFdyaXRlSlNPTkFycmF5U3RhcnQ7CiAgIFdyaXRlSlNPTlN0cmluZyggR2V0VHlwZU5hbWVGb3JUeXBlSUQoIHNldF8uRWxlbWVudFR5cGUpKTsKQEAgLTgxNiw5ICs4MjAsMTIgQEAKIHZhciBidWZmZXIgOiBUTWVtb3J5U3RyZWFtOwogICAgIGNoICA6IEJ5dGU7CiAgICAgd2NoIDogV29yZDsKKyAgICBoaWdoU3Vyb2dhdGU6IENoYXI7CisgICAgc3Vycm9nYXRlUGFpcnM6IEFycmF5WzAuLjFdIG9mIENoYXI7CiAgICAgb2ZmIDogSW50ZWdlcjsKICAgICB0bXAgOiBUQnl0ZXM7CiBiZWdpbgorICBoaWdoU3Vyb2dhdGUgOj0gIzA7CiAgIGJ1ZmZlciA6PSBUTWVtb3J5U3RyZWFtLkNyZWF0ZTsKICAgdHJ5CiAgICAgaWYgbm90IHNraXBDb250ZXh0CkBAIC04NDQsNyArODUxLDcgQEAKICAgICAgIHRoZW4gYmVnaW4KICAgICAgICAgb2ZmIDo9IFBvcyggQ2hhcihjaCksIEVTQ0FQRV9DSEFSUyk7CiAgICAgICAgIGlmIG9mZiA8IDEKLSAgICAgICAgdGhlbiByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24uQ3JlYXRlKCBUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLCAnRXhwZWN0ZWQgY29udHJvbCBjaGFyJyk7CisgICAgICAgIHRoZW4gcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uSW52YWxpZERhdGEuQ3JlYXRlKCdFeHBlY3RlZCBjb250cm9sIGNoYXInKTsKICAgICAgICAgY2ggOj0gQnl0ZSggRVNDQVBFX0NIQVJfVkFMU1tvZmZdKTsKICAgICAgICAgYnVmZmVyLldyaXRlKCBjaCwgMSk7CiAgICAgICAgIENvbnRpbnVlOwpAQCAtODU3LDExICs4NjQsMzEgQEAKICAgICAgICAgICAgKyAoSGV4VmFsKHRtcFsxXSkgc2hsIDgpCiAgICAgICAgICAgICsgKEhleFZhbCh0bXBbMl0pIHNobCA0KQogICAgICAgICAgICArICBIZXhWYWwodG1wWzNdKTsKKwogICAgICAgLy8gd2UgbmVlZCB0byBtYWtlIFVURjggYnl0ZXMgZnJvbSBpdCwgdG8gYmUgZGVjb2RlZCBsYXRlcgotICAgICAgdG1wIDo9IFN5c1V0aWxzLlRFbmNvZGluZy5VVEY4LkdldEJ5dGVzKENoYXIod2NoKSk7Ci0gICAgICBidWZmZXIuV3JpdGUoIHRtcFswXSwgbGVuZ3RoKHRtcCkpOworICAgICAgaWYgQ2hhclV0aWxzLklzSGlnaFN1cnJvZ2F0ZShjaGFyKHdjaCkpIHRoZW4gYmVnaW4KKyAgICAgICAgaWYgaGlnaFN1cm9nYXRlIDw+ICMwCisgICAgICAgIHRoZW4gcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uSW52YWxpZERhdGEuQ3JlYXRlKCdFeHBlY3RlZCBsb3cgc3Vycm9nYXRlIGNoYXInKTsKKyAgICAgICAgaGlnaFN1cm9nYXRlIDo9IGNoYXIod2NoKTsKKyAgICAgIGVuZAorICAgICAgZWxzZSBpZiBDaGFyVXRpbHMuSXNMb3dTdXJyb2dhdGUoY2hhcih3Y2gpKSB0aGVuIGJlZ2luCisgICAgICAgIGlmIGhpZ2hTdXJvZ2F0ZSA9ICMwCisgICAgICAgIHRoZW4gVFByb3RvY29sRXhjZXB0aW9uSW52YWxpZERhdGEuQ3JlYXRlKCdFeHBlY3RlZCBoaWdoIHN1cnJvZ2F0ZSBjaGFyJyk7CisgICAgICAgIHN1cnJvZ2F0ZVBhaXJzWzBdIDo9IGhpZ2hTdXJvZ2F0ZTsKKyAgICAgICAgc3Vycm9nYXRlUGFpcnNbMV0gOj0gY2hhcih3Y2gpOworICAgICAgICB0bXAgOj0gVEVuY29kaW5nLlVURjguR2V0Qnl0ZXMoc3Vycm9nYXRlUGFpcnMpOworICAgICAgICBidWZmZXIuV3JpdGUoIHRtcFswXSwgTGVuZ3RoKHRtcCkpOworICAgICAgICBoaWdoU3Vyb2dhdGUgOj0gIzA7CisgICAgICBlbmQKKyAgICAgIGVsc2UgYmVnaW4KKyAgICAgICAgdG1wIDo9IFN5c1V0aWxzLlRFbmNvZGluZy5VVEY4LkdldEJ5dGVzKENoYXIod2NoKSk7CisgICAgICAgIGJ1ZmZlci5Xcml0ZSggdG1wWzBdLCBMZW5ndGgodG1wKSk7CisgICAgICBlbmQ7CiAgICAgZW5kOwogCisgICAgaWYgaGlnaFN1cm9nYXRlIDw+ICMwCisgICAgdGhlbiByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb25JbnZhbGlkRGF0YS5DcmVhdGUoJ0V4cGVjdGVkIGxvdyBzdXJyb2dhdGUgY2hhcicpOworCiAgICAgU2V0TGVuZ3RoKCByZXN1bHQsIGJ1ZmZlci5TaXplKTsKICAgICBpZiBidWZmZXIuU2l6ZSA+IDAgdGhlbiBNb3ZlKCBidWZmZXIuTWVtb3J5XiwgcmVzdWx0WzBdLCBMZW5ndGgocmVzdWx0KSk7CiAKQEAgLTkxNCw4ICs5NDEsNyBAQAogICAgIHJlc3VsdCA6PSBTdHJUb0ludDY0KHN0cik7CiAgIGV4Y2VwdAogICAgIG9uIGU6RXhjZXB0aW9uIGRvIGJlZ2luCi0gICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24uQ3JlYXRlKCBUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0JhZCBkYXRhIGVuY291bnRlZCBpbiBudW1lcmljIGRhdGEgKCcrc3RyKycpICgnK2UuTWVzc2FnZSsnKScpOworICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uSW52YWxpZERhdGEuQ3JlYXRlKCdCYWQgZGF0YSBlbmNvdW50ZWQgaW4gbnVtZXJpYyBkYXRhICgnK3N0cisnKSAoJytlLk1lc3NhZ2UrJyknKTsKICAgICBlbmQ7CiAgIGVuZDsKIGVuZDsKQEAgLTkzNyw3ICs5NjMsNyBAQAogICAgIGFuZCBub3QgTWF0aC5Jc0luZmluaXRlKGR1YikKICAgICB0aGVuIGJlZ2luCiAgICAgICAvLyBUaHJvdyBleGNlcHRpb24gLS0gd2Ugc2hvdWxkIG5vdCBiZSBpbiBhIHN0cmluZyBpbiAgU2VsZiBjYXNlCi0gICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24uQ3JlYXRlKCBUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLCAnTnVtZXJpYyBkYXRhIHVuZXhwZWN0ZWRseSBxdW90ZWQnKTsKKyAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbkludmFsaWREYXRhLkNyZWF0ZSgnTnVtZXJpYyBkYXRhIHVuZXhwZWN0ZWRseSBxdW90ZWQnKTsKICAgICBlbmQ7CiAgICAgcmVzdWx0IDo9IGR1YjsKICAgICBFeGl0OwpAQCAtOTUyLDIwICs5NzgsNDQgQEAKICAgICByZXN1bHQgOj0gU3RyVG9GbG9hdCggc3RyLCBJTlZBUklBTlRfQ1VMVFVSRSk7CiAgIGV4Y2VwdAogICAgIG9uIGU6RXhjZXB0aW9uCi0gICAgZG8gcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uLkNyZWF0ZSggVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdCYWQgZGF0YSBlbmNvdW50ZWQgaW4gbnVtZXJpYyBkYXRhICgnK3N0cisnKSAoJytlLk1lc3NhZ2UrJyknKTsKKyAgICBkbyByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb25JbnZhbGlkRGF0YS5DcmVhdGUoJ0JhZCBkYXRhIGVuY291bnRlZCBpbiBudW1lcmljIGRhdGEgKCcrc3RyKycpICgnK2UuTWVzc2FnZSsnKScpOwogICBlbmQ7CiBlbmQ7CiAKIAogZnVuY3Rpb24gVEpTT05Qcm90b2NvbEltcGwuUmVhZEpTT05CYXNlNjQgOiBUQnl0ZXM7CiB2YXIgYiA6IFRCeXRlczsKLSAgICBzdHIgOiBzdHJpbmc7CisgICAgbGVuLCBvZmYsIHNpemUgOiBJbnRlZ2VyOwogYmVnaW4KICAgYiA6PSBSZWFkSlNPTlN0cmluZyhmYWxzZSk7CiAKLSAgU2V0U3RyaW5nKCBzdHIsIFBBbnNpQ2hhcihiKSwgTGVuZ3RoKGIpKTsKLSAgcmVzdWx0IDo9IFRJZERlY29kZXJNSU1FLkRlY29kZUJ5dGVzKCBzdHIpOworICBsZW4gOj0gTGVuZ3RoKGIpOworICBvZmYgOj0gMDsKKyAgc2l6ZSA6PSAwOworCisgIC8vIHJlZHVjZSBsZW4gdG8gaWdub3JlIGZpbGwgYnl0ZXMKKyAgRGVjKGxlbik7CisgIHdoaWxlIChsZW4gPj0gMCkgYW5kIChiW2xlbl0gPSBCeXRlKCc9JykpIGRvIERlYyhsZW4pOworICBJbmMobGVuKTsKKworICAvLyByZWFkICYgZGVjb2RlIGZ1bGwgYnl0ZSB0cmlwbGV0cyA9IDQgc291cmNlIGJ5dGVzCisgIHdoaWxlIChsZW4gPj0gNCkgZG8gYmVnaW4KKyAgICAvLyBEZWNvZGUgNCBieXRlcyBhdCBhIHRpbWUKKyAgICBJbmMoIHNpemUsIEJhc2U2NFV0aWxzLkRlY29kZSggYiwgb2ZmLCA0LCBiLCBzaXplKSk7IC8vIGRlY29kZWQgaW4gcGxhY2UKKyAgICBJbmMoIG9mZiwgNCk7CisgICAgRGVjKCBsZW4sIDQpOworICBlbmQ7CisKKyAgLy8gRG9uJ3QgZGVjb2RlIGlmIHdlIGhpdCB0aGUgZW5kIG9yIGdvdCBhIHNpbmdsZSBsZWZ0b3ZlciBieXRlIChpbnZhbGlkCisgIC8vIGJhc2U2NCBidXQgbGVnYWwgZm9yIHNraXAgb2YgcmVndWxhciBzdHJpbmcgdHlwZSkKKyAgaWYgbGVuID4gMSB0aGVuIGJlZ2luCisgICAgLy8gRGVjb2RlIHJlbWFpbmRlcgorICAgIEluYyggc2l6ZSwgQmFzZTY0VXRpbHMuRGVjb2RlKCBiLCBvZmYsIGxlbiwgYiwgc2l6ZSkpOyAvLyBkZWNvZGVkIGluIHBsYWNlCisgIGVuZDsKKworICAvLyByZXNpemUgdG8gZmluYWwgc2l6ZSBhbmQgcmV0dXJuIHRoZSBkYXRhCisgIFNldExlbmd0aCggYiwgc2l6ZSk7CisgIHJlc3VsdCA6PSBiOwogZW5kOwogCiAKQEAgLTk5OSwxNSArMTA0OSwxNSBAQAogZW5kOwogCiAKLWZ1bmN0aW9uIFRKU09OUHJvdG9jb2xJbXBsLlJlYWRNZXNzYWdlQmVnaW46IElNZXNzYWdlOworZnVuY3Rpb24gVEpTT05Qcm90b2NvbEltcGwuUmVhZE1lc3NhZ2VCZWdpbjogVFRocmlmdE1lc3NhZ2U7CiBiZWdpbgogICBSZXNldENvbnRleHRTdGFjazsgIC8vIFRIUklGVC0xNDczCiAKLSAgcmVzdWx0IDo9IFRNZXNzYWdlSW1wbC5DcmVhdGU7CisgIEluaXQoIHJlc3VsdCk7CiAgIFJlYWRKU09OQXJyYXlTdGFydDsKIAogICBpZiBSZWFkSlNPTkludGVnZXIgPD4gVkVSU0lPTgotICB0aGVuIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbi5DcmVhdGUoIFRQcm90b2NvbEV4Y2VwdGlvbi5CQURfVkVSU0lPTiwgJ01lc3NhZ2UgY29udGFpbmVkIGJhZCB2ZXJzaW9uLicpOworICB0aGVuIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbkJhZFZlcnNpb24uQ3JlYXRlKCdNZXNzYWdlIGNvbnRhaW5lZCBiYWQgdmVyc2lvbi4nKTsKIAogICByZXN1bHQuTmFtZSAgOj0gU3lzVXRpbHMuVEVuY29kaW5nLlVURjguR2V0U3RyaW5nKCBSZWFkSlNPTlN0cmluZyggRkFMU0UpKTsKICAgcmVzdWx0LlR5cGVfIDo9IFRNZXNzYWdlVHlwZSggUmVhZEpTT05JbnRlZ2VyKTsKQEAgLTEwMjEsMTAgKzEwNzEsMTAgQEAKIGVuZDsKIAogCi1mdW5jdGlvbiBUSlNPTlByb3RvY29sSW1wbC5SZWFkU3RydWN0QmVnaW4gOiBJU3RydWN0IDsKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2xJbXBsLlJlYWRTdHJ1Y3RCZWdpbiA6IFRUaHJpZnRTdHJ1Y3QgOwogYmVnaW4KICAgUmVhZEpTT05PYmplY3RTdGFydDsKLSAgcmVzdWx0IDo9IFRTdHJ1Y3RJbXBsLkNyZWF0ZSgnJyk7CisgIEluaXQoIHJlc3VsdCk7CiBlbmQ7CiAKIApAQCAtMTAzNCwxMSArMTA4NCwxMSBAQAogZW5kOwogCiAKLWZ1bmN0aW9uIFRKU09OUHJvdG9jb2xJbXBsLlJlYWRGaWVsZEJlZ2luIDogSUZpZWxkOworZnVuY3Rpb24gVEpTT05Qcm90b2NvbEltcGwuUmVhZEZpZWxkQmVnaW4gOiBUVGhyaWZ0RmllbGQ7CiB2YXIgY2ggOiBCeXRlOwogICAgIHN0ciA6IHN0cmluZzsKIGJlZ2luCi0gIHJlc3VsdCA6PSBURmllbGRJbXBsLkNyZWF0ZTsKKyAgSW5pdCggcmVzdWx0KTsKICAgY2ggOj0gRlJlYWRlci5QZWVrOwogICBpZiBjaCA9IFJCUkFDRVswXQogICB0aGVuIHJlc3VsdC5UeXBlXyA6PSBUVHlwZS5TdG9wCkBAIC0xMDU4LDEwICsxMTA4LDEwIEBACiBlbmQ7CiAKIAotZnVuY3Rpb24gVEpTT05Qcm90b2NvbEltcGwuUmVhZE1hcEJlZ2luIDogSU1hcDsKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2xJbXBsLlJlYWRNYXBCZWdpbiA6IFRUaHJpZnRNYXA7CiB2YXIgc3RyIDogc3RyaW5nOwogYmVnaW4KLSAgcmVzdWx0IDo9IFRNYXBJbXBsLkNyZWF0ZTsKKyAgSW5pdCggcmVzdWx0KTsKICAgUmVhZEpTT05BcnJheVN0YXJ0OwogCiAgIHN0ciA6PSBTeXNVdGlscy5URW5jb2RpbmcuVVRGOC5HZXRTdHJpbmcoIFJlYWRKU09OU3RyaW5nKEZBTFNFKSk7CkBAIC0xMDgyLDEwICsxMTMyLDEwIEBACiBlbmQ7CiAKIAotZnVuY3Rpb24gVEpTT05Qcm90b2NvbEltcGwuUmVhZExpc3RCZWdpbiA6IElMaXN0OworZnVuY3Rpb24gVEpTT05Qcm90b2NvbEltcGwuUmVhZExpc3RCZWdpbiA6IFRUaHJpZnRMaXN0OwogdmFyIHN0ciA6IHN0cmluZzsKIGJlZ2luCi0gIHJlc3VsdCA6PSBUTGlzdEltcGwuQ3JlYXRlOworICBJbml0KCByZXN1bHQpOwogICBSZWFkSlNPTkFycmF5U3RhcnQ7CiAKICAgc3RyIDo9IFN5c1V0aWxzLlRFbmNvZGluZy5VVEY4LkdldFN0cmluZyggUmVhZEpTT05TdHJpbmcoRkFMU0UpKTsKQEAgLTExMDAsMTAgKzExNTAsMTAgQEAKIGVuZDsKIAogCi1mdW5jdGlvbiBUSlNPTlByb3RvY29sSW1wbC5SZWFkU2V0QmVnaW4gOiBJU2V0OworZnVuY3Rpb24gVEpTT05Qcm90b2NvbEltcGwuUmVhZFNldEJlZ2luIDogVFRocmlmdFNldDsKIHZhciBzdHIgOiBzdHJpbmc7CiBiZWdpbgotICByZXN1bHQgOj0gVFNldEltcGwuQ3JlYXRlOworICBJbml0KCByZXN1bHQpOwogICBSZWFkSlNPTkFycmF5U3RhcnQ7CiAKICAgc3RyIDo9IFN5c1V0aWxzLlRFbmNvZGluZy5VVEY4LkdldFN0cmluZyggUmVhZEpTT05TdHJpbmcoRkFMU0UpKTsKZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5Qcm90b2NvbC5NdWx0aXBsZXgucGFzIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlByb3RvY29sLk11bHRpcGxleC5wYXMKaW5kZXggMThiMzliNS4uOTNhMzgzOCAxMDA2NDQKLS0tIGEvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlByb3RvY29sLk11bHRpcGxleC5wYXMKKysrIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlByb3RvY29sLk11bHRpcGxleC5wYXMKQEAgLTcxLDcgKzcxLDcgQEAKICAgICB7IFByZXBlbmRzIHRoZSBzZXJ2aWNlIG5hbWUgdG8gdGhlIGZ1bmN0aW9uIG5hbWUsIHNlcGFyYXRlZCBieSBTRVBBUkFUT1IuCiAgICAgICBBcmdzOiBUaGUgb3JpZ2luYWwgbWVzc2FnZS4KICAgICB9Ci0gICAgcHJvY2VkdXJlIFdyaXRlTWVzc2FnZUJlZ2luKCBjb25zdCBtc2c6IElNZXNzYWdlKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlTWVzc2FnZUJlZ2luKCBjb25zdCBtc2c6IFRUaHJpZnRNZXNzYWdlKTsgb3ZlcnJpZGU7CiAgIGVuZDsKIAogCkBAIC04NiwxNCArODYsMTQgQEAKIGVuZDsKIAogCi1wcm9jZWR1cmUgVE11bHRpcGxleGVkUHJvdG9jb2wuV3JpdGVNZXNzYWdlQmVnaW4oIGNvbnN0IG1zZzogSU1lc3NhZ2UpOworcHJvY2VkdXJlIFRNdWx0aXBsZXhlZFByb3RvY29sLldyaXRlTWVzc2FnZUJlZ2luKCBjb25zdCBtc2c6IFRUaHJpZnRNZXNzYWdlKTsKIC8vIFByZXBlbmRzIHRoZSBzZXJ2aWNlIG5hbWUgdG8gdGhlIGZ1bmN0aW9uIG5hbWUsIHNlcGFyYXRlZCBieSBUTXVsdGlwbGV4ZWRQcm90b2NvbC5TRVBBUkFUT1IuCi12YXIgbmV3TXNnIDogSU1lc3NhZ2U7Cit2YXIgbmV3TXNnIDogVFRocmlmdE1lc3NhZ2U7CiBiZWdpbgogICBjYXNlIG1zZy5UeXBlXyBvZgogICAgIFRNZXNzYWdlVHlwZS5DYWxsLAogICAgIFRNZXNzYWdlVHlwZS5PbmV3YXkgOiBiZWdpbgotICAgICAgbmV3TXNnIDo9IFRNZXNzYWdlSW1wbC5DcmVhdGUoIEZTZXJ2aWNlTmFtZSArIFNFUEFSQVRPUiArIG1zZy5OYW1lLCBtc2cuVHlwZV8sIG1zZy5TZXFJRCk7CisgICAgICBJbml0KCBuZXdNc2csIEZTZXJ2aWNlTmFtZSArIFNFUEFSQVRPUiArIG1zZy5OYW1lLCBtc2cuVHlwZV8sIG1zZy5TZXFJRCk7CiAgICAgICBpbmhlcml0ZWQgV3JpdGVNZXNzYWdlQmVnaW4oIG5ld01zZyk7CiAgICAgZW5kOwogCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3NyYy9UaHJpZnQuUHJvdG9jb2wucGFzIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlByb3RvY29sLnBhcwppbmRleCA2Y2ZmMDljLi4zNjUwOWNhIDEwMDY0NAotLS0gYS9saWIvZGVscGhpL3NyYy9UaHJpZnQuUHJvdG9jb2wucGFzCisrKyBiL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5Qcm90b2NvbC5wYXMKQEAgLTI3LDYgKzI3LDcgQEAKICAgQ2xhc3NlcywKICAgU3lzVXRpbHMsCiAgIENvbnRucnMsCisgIFRocmlmdC5FeGNlcHRpb24sCiAgIFRocmlmdC5TdHJlYW0sCiAgIFRocmlmdC5Db2xsZWN0aW9ucywKICAgVGhyaWZ0LlRyYW5zcG9ydDsKQEAgLTU2LDggKzU3LDU0IEBACiAgICAgT25ld2F5ID0gNAogICApOwogCitjb25zdAorICBWQUxJRF9UVFlQRVMgPSBbCisgICAgVFR5cGUuU3RvcCwgVFR5cGUuVm9pZCwKKyAgICBUVHlwZS5Cb29sXywgVFR5cGUuQnl0ZV8sIFRUeXBlLkRvdWJsZV8sIFRUeXBlLkkxNiwgVFR5cGUuSTMyLCBUVHlwZS5JNjQsIFRUeXBlLlN0cmluZ18sCisgICAgVFR5cGUuU3RydWN0LCBUVHlwZS5NYXAsIFRUeXBlLlNldF8sIFRUeXBlLkxpc3QKKyAgXTsKKworICBWQUxJRF9NRVNTQUdFVFlQRVMgPSBbTG93KFRNZXNzYWdlVHlwZSkuLkhpZ2goVE1lc3NhZ2VUeXBlKV07CisKK2NvbnN0CisgIERFRkFVTFRfUkVDVVJTSU9OX0xJTUlUID0gNjQ7CisKK3R5cGUKICAgSVByb3RvY29sID0gaW50ZXJmYWNlOwotICBJU3RydWN0ID0gaW50ZXJmYWNlOworCisgIFRUaHJpZnRNZXNzYWdlID0gcmVjb3JkCisgICAgTmFtZTogc3RyaW5nOworICAgIFR5cGVfOiBUTWVzc2FnZVR5cGU7CisgICAgU2VxSUQ6IEludGVnZXI7CisgIGVuZDsKKworICBUVGhyaWZ0U3RydWN0ID0gcmVjb3JkCisgICAgTmFtZTogc3RyaW5nOworICBlbmQ7CisKKyAgVFRocmlmdEZpZWxkID0gcmVjb3JkCisgICAgTmFtZTogc3RyaW5nOworICAgIFR5cGVfOiBUVHlwZTsKKyAgICBJZDogU21hbGxJbnQ7CisgIGVuZDsKKworICBUVGhyaWZ0TGlzdCA9IHJlY29yZAorICAgIEVsZW1lbnRUeXBlOiBUVHlwZTsKKyAgICBDb3VudDogSW50ZWdlcjsKKyAgZW5kOworCisgIFRUaHJpZnRNYXAgPSByZWNvcmQKKyAgICBLZXlUeXBlOiBUVHlwZTsKKyAgICBWYWx1ZVR5cGU6IFRUeXBlOworICAgIENvdW50OiBJbnRlZ2VyOworICBlbmQ7CisKKyAgVFRocmlmdFNldCA9IHJlY29yZAorICAgIEVsZW1lbnRUeXBlOiBUVHlwZTsKKyAgICBDb3VudDogSW50ZWdlcjsKKyAgZW5kOworCisKIAogICBJUHJvdG9jb2xGYWN0b3J5ID0gaW50ZXJmYWNlCiAgICAgWyd7N0NENjRBMTAtNEU5Ri00RTk5LTkzQkYtNzA4QTMxRjRBNjdCfSddCkBAIC03MCwxODUgKzExNyw3NCBAQAogICAgIGZ1bmN0aW9uIEFwcGVuZChjb25zdCBWYWx1ZTogSVRocmlmdENvbnRhaW5lcik6IFRTdHJpbmdCdWlsZGVyOyBvdmVybG9hZDsKICAgZW5kOwogCi0gIFRQcm90b2NvbEV4Y2VwdGlvbiA9IGNsYXNzKCBFeGNlcHRpb24gKQorICBUUHJvdG9jb2xFeGNlcHRpb24gPSBjbGFzcyggVEV4Y2VwdGlvbikKICAgcHVibGljCiAgICAgY29uc3QgLy8gVE9ETyhqZW5zZyk6IGNoYW5nZSBpbnRvIGVudW0KLSAgICAgIFVOS05PV04gOiBJbnRlZ2VyID0gMDsKLSAgICAgIElOVkFMSURfREFUQSA6IEludGVnZXIgPSAxOwotICAgICAgTkVHQVRJVkVfU0laRSA6IEludGVnZXIgPSAyOwotICAgICAgU0laRV9MSU1JVCA6IEludGVnZXIgPSAzOwotICAgICAgQkFEX1ZFUlNJT04gOiBJbnRlZ2VyID0gNDsKLSAgICAgIE5PVF9JTVBMRU1FTlRFRCA6IEludGVnZXIgPSA1OwotICAgICAgREVQVEhfTElNSVQgOiBJbnRlZ2VyID0gNjsKKyAgICAgIFVOS05PV04gPSAwOworICAgICAgSU5WQUxJRF9EQVRBID0gMTsKKyAgICAgIE5FR0FUSVZFX1NJWkUgPSAyOworICAgICAgU0laRV9MSU1JVCA9IDM7CisgICAgICBCQURfVkVSU0lPTiA9IDQ7CisgICAgICBOT1RfSU1QTEVNRU5URUQgPSA1OworICAgICAgREVQVEhfTElNSVQgPSA2OwogICBwcm90ZWN0ZWQKLSAgICBGVHlwZSA6IEludGVnZXI7CisgICAgY29uc3RydWN0b3IgSGlkZGVuQ3JlYXRlKGNvbnN0IE1zZzogc3RyaW5nKTsKICAgcHVibGljCi0gICAgY29uc3RydWN0b3IgQ3JlYXRlOyBvdmVybG9hZDsKLSAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIHR5cGVfOiBJbnRlZ2VyICk7IG92ZXJsb2FkOwotICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggdHlwZV86IEludGVnZXI7IGNvbnN0IG1zZzogc3RyaW5nKTsgb3ZlcmxvYWQ7CisgICAgLy8gcHVycG9zZWZ1bGx5IGhpZGUgaW5oZXJpdGVkIGNvbnN0cnVjdG9yCisgICAgY2xhc3MgZnVuY3Rpb24gQ3JlYXRlKGNvbnN0IE1zZzogc3RyaW5nKTogVFByb3RvY29sRXhjZXB0aW9uOyBvdmVybG9hZDsgZGVwcmVjYXRlZCAnVXNlIHNwZWNpYWxpemVkIFRQcm90b2NvbEV4Y2VwdGlvbiB0eXBlcyAob3IgcmVnZW5lcmF0ZSBmcm9tIElETCknOworICAgIGNsYXNzIGZ1bmN0aW9uIENyZWF0ZTogVFByb3RvY29sRXhjZXB0aW9uOyBvdmVybG9hZDsgZGVwcmVjYXRlZCAnVXNlIHNwZWNpYWxpemVkIFRQcm90b2NvbEV4Y2VwdGlvbiB0eXBlcyAob3IgcmVnZW5lcmF0ZSBmcm9tIElETCknOworICAgIGNsYXNzIGZ1bmN0aW9uIENyZWF0ZSggdHlwZV86IEludGVnZXIpOiBUUHJvdG9jb2xFeGNlcHRpb247IG92ZXJsb2FkOyBkZXByZWNhdGVkICdVc2Ugc3BlY2lhbGl6ZWQgVFByb3RvY29sRXhjZXB0aW9uIHR5cGVzIChvciByZWdlbmVyYXRlIGZyb20gSURMKSc7CisgICAgY2xhc3MgZnVuY3Rpb24gQ3JlYXRlKCB0eXBlXzogSW50ZWdlcjsgY29uc3QgbXNnOiBzdHJpbmcpOiBUUHJvdG9jb2xFeGNlcHRpb247IG92ZXJsb2FkOyBkZXByZWNhdGVkICdVc2Ugc3BlY2lhbGl6ZWQgVFByb3RvY29sRXhjZXB0aW9uIHR5cGVzIChvciByZWdlbmVyYXRlIGZyb20gSURMKSc7CiAgIGVuZDsKIAotICBJTWFwID0gaW50ZXJmYWNlCi0gICAgWyd7MzA1MzFEOTctN0UwNi00MjMzLUI4MDAtQzNGNTNDQ0QyM0U3fSddCi0gICAgZnVuY3Rpb24gR2V0S2V5VHlwZTogVFR5cGU7Ci0gICAgcHJvY2VkdXJlIFNldEtleVR5cGUoIFZhbHVlOiBUVHlwZSk7Ci0gICAgZnVuY3Rpb24gR2V0VmFsdWVUeXBlOiBUVHlwZTsKLSAgICBwcm9jZWR1cmUgU2V0VmFsdWVUeXBlKCBWYWx1ZTogVFR5cGUpOwotICAgIGZ1bmN0aW9uIEdldENvdW50OiBJbnRlZ2VyOwotICAgIHByb2NlZHVyZSBTZXRDb3VudCggVmFsdWU6IEludGVnZXIpOwotICAgIHByb3BlcnR5IEtleVR5cGU6IFRUeXBlIHJlYWQgR2V0S2V5VHlwZSB3cml0ZSBTZXRLZXlUeXBlOwotICAgIHByb3BlcnR5IFZhbHVlVHlwZTogVFR5cGUgcmVhZCBHZXRWYWx1ZVR5cGUgd3JpdGUgU2V0VmFsdWVUeXBlOwotICAgIHByb3BlcnR5IENvdW50OiBJbnRlZ2VyIHJlYWQgR2V0Q291bnQgd3JpdGUgU2V0Q291bnQ7Ci0gIGVuZDsKLQotICBUTWFwSW1wbCA9IGNsYXNzKCBUSW50ZXJmYWNlZE9iamVjdCwgSU1hcCkKLSAgcHJpdmF0ZQotICAgIEZWYWx1ZVR5cGU6IFRUeXBlOwotICAgIEZLZXlUeXBlOiBUVHlwZTsKLSAgICBGQ291bnQ6IEludGVnZXI7Ci0gIHByb3RlY3RlZAotICAgIGZ1bmN0aW9uIEdldEtleVR5cGU6IFRUeXBlOwotICAgIHByb2NlZHVyZSBTZXRLZXlUeXBlKCBWYWx1ZTogVFR5cGUpOwotICAgIGZ1bmN0aW9uIEdldFZhbHVlVHlwZTogVFR5cGU7Ci0gICAgcHJvY2VkdXJlIFNldFZhbHVlVHlwZSggVmFsdWU6IFRUeXBlKTsKLSAgICBmdW5jdGlvbiBHZXRDb3VudDogSW50ZWdlcjsKLSAgICBwcm9jZWR1cmUgU2V0Q291bnQoIFZhbHVlOiBJbnRlZ2VyKTsKKyAgLy8gTmVlZGVkIHRvIHJlbW92ZSBkZXByZWNhdGlvbiB3YXJuaW5nCisgIFRQcm90b2NvbEV4Y2VwdGlvblNwZWNpYWxpemVkID0gY2xhc3MgYWJzdHJhY3QgKFRQcm90b2NvbEV4Y2VwdGlvbikKICAgcHVibGljCi0gICAgY29uc3RydWN0b3IgQ3JlYXRlKCBBVmFsdWVUeXBlOiBUVHlwZTsgQUtleVR5cGU6IFRUeXBlOyBBQ291bnQ6IEludGVnZXIpOyBvdmVybG9hZDsKLSAgICBjb25zdHJ1Y3RvciBDcmVhdGU7IG92ZXJsb2FkOworICAgIGNvbnN0cnVjdG9yIENyZWF0ZShjb25zdCBNc2c6IHN0cmluZyk7CiAgIGVuZDsKIAotICBJTGlzdCA9IGludGVyZmFjZQotICAgIFsnezY3NjNFMUVBLUE5MzQtNDQ3Mi05MDRGLTAwODM5ODBCOUI4N30nXQotICAgIGZ1bmN0aW9uIEdldEVsZW1lbnRUeXBlOiBUVHlwZTsKLSAgICBwcm9jZWR1cmUgU2V0RWxlbWVudFR5cGUoIFZhbHVlOiBUVHlwZSk7Ci0gICAgZnVuY3Rpb24gR2V0Q291bnQ6IEludGVnZXI7Ci0gICAgcHJvY2VkdXJlIFNldENvdW50KCBWYWx1ZTogSW50ZWdlcik7Ci0gICAgcHJvcGVydHkgRWxlbWVudFR5cGU6IFRUeXBlIHJlYWQgR2V0RWxlbWVudFR5cGUgd3JpdGUgU2V0RWxlbWVudFR5cGU7Ci0gICAgcHJvcGVydHkgQ291bnQ6IEludGVnZXIgcmVhZCBHZXRDb3VudCB3cml0ZSBTZXRDb3VudDsKLSAgZW5kOworICBUUHJvdG9jb2xFeGNlcHRpb25Vbmtub3duID0gY2xhc3MgKFRQcm90b2NvbEV4Y2VwdGlvblNwZWNpYWxpemVkKTsKKyAgVFByb3RvY29sRXhjZXB0aW9uSW52YWxpZERhdGEgPSBjbGFzcyAoVFByb3RvY29sRXhjZXB0aW9uU3BlY2lhbGl6ZWQpOworICBUUHJvdG9jb2xFeGNlcHRpb25OZWdhdGl2ZVNpemUgPSBjbGFzcyAoVFByb3RvY29sRXhjZXB0aW9uU3BlY2lhbGl6ZWQpOworICBUUHJvdG9jb2xFeGNlcHRpb25TaXplTGltaXQgPSBjbGFzcyAoVFByb3RvY29sRXhjZXB0aW9uU3BlY2lhbGl6ZWQpOworICBUUHJvdG9jb2xFeGNlcHRpb25CYWRWZXJzaW9uID0gY2xhc3MgKFRQcm90b2NvbEV4Y2VwdGlvblNwZWNpYWxpemVkKTsKKyAgVFByb3RvY29sRXhjZXB0aW9uTm90SW1wbGVtZW50ZWQgPSBjbGFzcyAoVFByb3RvY29sRXhjZXB0aW9uU3BlY2lhbGl6ZWQpOworICBUUHJvdG9jb2xFeGNlcHRpb25EZXB0aExpbWl0ID0gY2xhc3MgKFRQcm90b2NvbEV4Y2VwdGlvblNwZWNpYWxpemVkKTsKIAotICBUTGlzdEltcGwgPSBjbGFzcyggVEludGVyZmFjZWRPYmplY3QsIElMaXN0KQotICBwcml2YXRlCi0gICAgRkVsZW1lbnRUeXBlOiBUVHlwZTsKLSAgICBGQ291bnQgOiBJbnRlZ2VyOwotICBwcm90ZWN0ZWQKLSAgICBmdW5jdGlvbiBHZXRFbGVtZW50VHlwZTogVFR5cGU7Ci0gICAgcHJvY2VkdXJlIFNldEVsZW1lbnRUeXBlKCBWYWx1ZTogVFR5cGUpOwotICAgIGZ1bmN0aW9uIEdldENvdW50OiBJbnRlZ2VyOwotICAgIHByb2NlZHVyZSBTZXRDb3VudCggVmFsdWU6IEludGVnZXIpOwotICBwdWJsaWMKLSAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIEFFbGVtZW50VHlwZTogVFR5cGU7IEFDb3VudDogSW50ZWdlcik7IG92ZXJsb2FkOwotICAgIGNvbnN0cnVjdG9yIENyZWF0ZTsgb3ZlcmxvYWQ7Ci0gIGVuZDsKLQotICBJU2V0ID0gaW50ZXJmYWNlCi0gICAgWyd7QTg2NzE3MDAtNzUxNC00QzFFLThBMDUtNjI3ODY4NzIwMDVGfSddCi0gICAgZnVuY3Rpb24gR2V0RWxlbWVudFR5cGU6IFRUeXBlOwotICAgIHByb2NlZHVyZSBTZXRFbGVtZW50VHlwZSggVmFsdWU6IFRUeXBlKTsKLSAgICBmdW5jdGlvbiBHZXRDb3VudDogSW50ZWdlcjsKLSAgICBwcm9jZWR1cmUgU2V0Q291bnQoIFZhbHVlOiBJbnRlZ2VyKTsKLSAgICBwcm9wZXJ0eSBFbGVtZW50VHlwZTogVFR5cGUgcmVhZCBHZXRFbGVtZW50VHlwZSB3cml0ZSBTZXRFbGVtZW50VHlwZTsKLSAgICBwcm9wZXJ0eSBDb3VudDogSW50ZWdlciByZWFkIEdldENvdW50IHdyaXRlIFNldENvdW50OwotICBlbmQ7Ci0KLSAgVFNldEltcGwgPSBjbGFzcyggVEludGVyZmFjZWRPYmplY3QsIElTZXQpCi0gIHByaXZhdGUKLSAgICBGQ291bnQ6IEludGVnZXI7Ci0gICAgRkVsZW1lbnRUeXBlOiBUVHlwZTsKLSAgcHJvdGVjdGVkCi0gICAgZnVuY3Rpb24gR2V0RWxlbWVudFR5cGU6IFRUeXBlOwotICAgIHByb2NlZHVyZSBTZXRFbGVtZW50VHlwZSggVmFsdWU6IFRUeXBlKTsKLSAgICBmdW5jdGlvbiBHZXRDb3VudDogSW50ZWdlcjsKLSAgICBwcm9jZWR1cmUgU2V0Q291bnQoIFZhbHVlOiBJbnRlZ2VyKTsKLSAgcHVibGljCi0gICAgY29uc3RydWN0b3IgQ3JlYXRlKCBBRWxlbWVudFR5cGU6IFRUeXBlOyBBQ291bnQ6IEludGVnZXIpOyBvdmVybG9hZDsKLSAgICBjb25zdHJ1Y3RvciBDcmVhdGU7IG92ZXJsb2FkOwotICBlbmQ7Ci0KLSAgSU1lc3NhZ2UgPSBpbnRlcmZhY2UKLSAgICBbJ3s5RTM2OEI0QS1CMUZBLTQzRTctOENGNS01NkM2NkQyNTZDQTd9J10KLSAgICBmdW5jdGlvbiBHZXROYW1lOiBzdHJpbmc7Ci0gICAgcHJvY2VkdXJlIFNldE5hbWUoIGNvbnN0IFZhbHVlOiBzdHJpbmcpOwotICAgIGZ1bmN0aW9uIEdldFR5cGU6IFRNZXNzYWdlVHlwZTsKLSAgICBwcm9jZWR1cmUgU2V0VHlwZSggVmFsdWU6IFRNZXNzYWdlVHlwZSk7Ci0gICAgZnVuY3Rpb24gR2V0U2VxSUQ6IEludGVnZXI7Ci0gICAgcHJvY2VkdXJlIFNldFNlcUlEKCBWYWx1ZTogSW50ZWdlcik7Ci0gICAgcHJvcGVydHkgTmFtZTogc3RyaW5nIHJlYWQgR2V0TmFtZSB3cml0ZSBTZXROYW1lOwotICAgIHByb3BlcnR5IFR5cGVfOiBUTWVzc2FnZVR5cGUgcmVhZCBHZXRUeXBlIHdyaXRlIFNldFR5cGU7Ci0gICAgcHJvcGVydHkgU2VxSUQ6IEludGVnZXIgcmVhZCBHZXRTZXFJRCB3cml0ZSBTZXRTZXFJRDsKLSAgZW5kOwotCi0gIFRNZXNzYWdlSW1wbCA9IGNsYXNzKCBUSW50ZXJmYWNlZE9iamVjdCwgSU1lc3NhZ2UgKQotICBwcml2YXRlCi0gICAgRk5hbWU6IHN0cmluZzsKLSAgICBGTWVzc2FnZVR5cGU6IFRNZXNzYWdlVHlwZTsKLSAgICBGU2VxSUQ6IEludGVnZXI7Ci0gIHByb3RlY3RlZAotICAgIGZ1bmN0aW9uIEdldE5hbWU6IHN0cmluZzsKLSAgICBwcm9jZWR1cmUgU2V0TmFtZSggY29uc3QgVmFsdWU6IHN0cmluZyk7Ci0gICAgZnVuY3Rpb24gR2V0VHlwZTogVE1lc3NhZ2VUeXBlOwotICAgIHByb2NlZHVyZSBTZXRUeXBlKCBWYWx1ZTogVE1lc3NhZ2VUeXBlKTsKLSAgICBmdW5jdGlvbiBHZXRTZXFJRDogSW50ZWdlcjsKLSAgICBwcm9jZWR1cmUgU2V0U2VxSUQoIFZhbHVlOiBJbnRlZ2VyKTsKLSAgcHVibGljCi0gICAgcHJvcGVydHkgTmFtZTogc3RyaW5nIHJlYWQgRk5hbWUgd3JpdGUgRk5hbWU7Ci0gICAgcHJvcGVydHkgVHlwZV86IFRNZXNzYWdlVHlwZSByZWFkIEZNZXNzYWdlVHlwZSB3cml0ZSBGTWVzc2FnZVR5cGU7Ci0gICAgcHJvcGVydHkgU2VxSUQ6IEludGVnZXIgcmVhZCBGU2VxSUQgd3JpdGUgRlNlcUlEOwotICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggQU5hbWU6IHN0cmluZzsgQU1lc3NhZ2VUeXBlOiBUTWVzc2FnZVR5cGU7IEFTZXFJRDogSW50ZWdlcik7IG92ZXJsb2FkOwotICAgIGNvbnN0cnVjdG9yIENyZWF0ZTsgb3ZlcmxvYWQ7Ci0gIGVuZDsKLQotICBJRmllbGQgPSBpbnRlcmZhY2UKLSAgICBbJ3tGMEQ0M0JFNS03ODgzLTQ0MkUtODNGRi0wNTgwQ0M2MzJCNzJ9J10KLSAgICBmdW5jdGlvbiBHZXROYW1lOiBzdHJpbmc7Ci0gICAgcHJvY2VkdXJlIFNldE5hbWUoIGNvbnN0IFZhbHVlOiBzdHJpbmcpOwotICAgIGZ1bmN0aW9uIEdldFR5cGU6IFRUeXBlOwotICAgIHByb2NlZHVyZSBTZXRUeXBlKCBWYWx1ZTogVFR5cGUpOwotICAgIGZ1bmN0aW9uIEdldElkOiBTbWFsbEludDsKLSAgICBwcm9jZWR1cmUgU2V0SWQoIFZhbHVlOiBTbWFsbEludCk7Ci0gICAgcHJvcGVydHkgTmFtZTogc3RyaW5nIHJlYWQgR2V0TmFtZSB3cml0ZSBTZXROYW1lOwotICAgIHByb3BlcnR5IFR5cGVfOiBUVHlwZSByZWFkIEdldFR5cGUgd3JpdGUgU2V0VHlwZTsKLSAgICBwcm9wZXJ0eSBJZDogU21hbGxJbnQgcmVhZCBHZXRJZCB3cml0ZSBTZXRJZDsKLSAgZW5kOwotCi0gIFRGaWVsZEltcGwgPSBjbGFzcyggVEludGVyZmFjZWRPYmplY3QsIElGaWVsZCkKLSAgcHJpdmF0ZQotICAgIEZOYW1lIDogc3RyaW5nOwotICAgIEZUeXBlIDogVFR5cGU7Ci0gICAgRklkICAgOiBTbWFsbEludDsKLSAgcHJvdGVjdGVkCi0gICAgZnVuY3Rpb24gR2V0TmFtZTogc3RyaW5nOwotICAgIHByb2NlZHVyZSBTZXROYW1lKCBjb25zdCBWYWx1ZTogc3RyaW5nKTsKLSAgICBmdW5jdGlvbiBHZXRUeXBlOiBUVHlwZTsKLSAgICBwcm9jZWR1cmUgU2V0VHlwZSggVmFsdWU6IFRUeXBlKTsKLSAgICBmdW5jdGlvbiBHZXRJZDogU21hbGxJbnQ7Ci0gICAgcHJvY2VkdXJlIFNldElkKCBWYWx1ZTogU21hbGxJbnQpOwotICBwdWJsaWMKLSAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IEFOYW1lOiBzdHJpbmc7IGNvbnN0IEFUeXBlOiBUVHlwZTsgQUlkOiBTbWFsbEludCk7IG92ZXJsb2FkOwotICAgIGNvbnN0cnVjdG9yIENyZWF0ZTsgb3ZlcmxvYWQ7Ci0gIGVuZDsKIAogICBUUHJvdG9jb2xVdGlsID0gY2xhc3MKICAgcHVibGljCiAgICAgY2xhc3MgcHJvY2VkdXJlIFNraXAoIHByb3Q6IElQcm90b2NvbDsgdHlwZV86IFRUeXBlKTsKICAgZW5kOwogCisgIElQcm90b2NvbFJlY3Vyc2lvblRyYWNrZXIgPSBpbnRlcmZhY2UKKyAgICBbJ3syOUNBMDMzRi1CQjU2LTQ5QjEtOUVFMy0zMUIxRTgyRkM3QTV9J10KKyAgICAvLyBubyBtZW1iZXJzIHlldAorICBlbmQ7CisKKyAgVFByb3RvY29sUmVjdXJzaW9uVHJhY2tlckltcGwgPSBjbGFzcyBhYnN0cmFjdCggVEludGVyZmFjZWRPYmplY3QsIElQcm90b2NvbFJlY3Vyc2lvblRyYWNrZXIpCisgIHByb3RlY3RlZAorICAgIEZQcm90b2NvbCA6IElQcm90b2NvbDsKKyAgcHVibGljCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBwcm90IDogSVByb3RvY29sKTsKKyAgICBkZXN0cnVjdG9yIERlc3Ryb3k7IG92ZXJyaWRlOworICBlbmQ7CisKICAgSVByb3RvY29sID0gaW50ZXJmYWNlCi0gICAgWyd7RkQ5NUMxNTEtMTUyNy00Qzk2LTgxMzQtQjkwMkJGQzRCNEZDfSddCisgICAgWyd7NjAyQTdGRkItMEQ5RS00Q0Q4LThEN0YtRTUwNzY2NjA1ODhBfSddCiAgICAgZnVuY3Rpb24gR2V0VHJhbnNwb3J0OiBJVHJhbnNwb3J0OwotICAgIHByb2NlZHVyZSBXcml0ZU1lc3NhZ2VCZWdpbiggY29uc3QgbXNnOiBJTWVzc2FnZSk7CisgICAgcHJvY2VkdXJlIFdyaXRlTWVzc2FnZUJlZ2luKCBjb25zdCBtc2c6IFRUaHJpZnRNZXNzYWdlKTsKICAgICBwcm9jZWR1cmUgV3JpdGVNZXNzYWdlRW5kOwotICAgIHByb2NlZHVyZSBXcml0ZVN0cnVjdEJlZ2luKCBjb25zdCBzdHJ1YzogSVN0cnVjdCk7CisgICAgcHJvY2VkdXJlIFdyaXRlU3RydWN0QmVnaW4oIGNvbnN0IHN0cnVjOiBUVGhyaWZ0U3RydWN0KTsKICAgICBwcm9jZWR1cmUgV3JpdGVTdHJ1Y3RFbmQ7Ci0gICAgcHJvY2VkdXJlIFdyaXRlRmllbGRCZWdpbiggY29uc3QgZmllbGQ6IElGaWVsZCk7CisgICAgcHJvY2VkdXJlIFdyaXRlRmllbGRCZWdpbiggY29uc3QgZmllbGQ6IFRUaHJpZnRGaWVsZCk7CiAgICAgcHJvY2VkdXJlIFdyaXRlRmllbGRFbmQ7CiAgICAgcHJvY2VkdXJlIFdyaXRlRmllbGRTdG9wOwotICAgIHByb2NlZHVyZSBXcml0ZU1hcEJlZ2luKCBjb25zdCBtYXA6IElNYXApOworICAgIHByb2NlZHVyZSBXcml0ZU1hcEJlZ2luKCBjb25zdCBtYXA6IFRUaHJpZnRNYXApOwogICAgIHByb2NlZHVyZSBXcml0ZU1hcEVuZDsKLSAgICBwcm9jZWR1cmUgV3JpdGVMaXN0QmVnaW4oIGNvbnN0IGxpc3Q6IElMaXN0KTsKKyAgICBwcm9jZWR1cmUgV3JpdGVMaXN0QmVnaW4oIGNvbnN0IGxpc3Q6IFRUaHJpZnRMaXN0KTsKICAgICBwcm9jZWR1cmUgV3JpdGVMaXN0RW5kKCk7Ci0gICAgcHJvY2VkdXJlIFdyaXRlU2V0QmVnaW4oIGNvbnN0IHNldF86IElTZXQgKTsKKyAgICBwcm9jZWR1cmUgV3JpdGVTZXRCZWdpbiggY29uc3Qgc2V0XzogVFRocmlmdFNldCApOwogICAgIHByb2NlZHVyZSBXcml0ZVNldEVuZCgpOwogICAgIHByb2NlZHVyZSBXcml0ZUJvb2woIGI6IEJvb2xlYW4pOwogICAgIHByb2NlZHVyZSBXcml0ZUJ5dGUoIGI6IFNob3J0SW50KTsKQEAgLTI2MCwxNyArMTk2LDE3IEBACiAgICAgcHJvY2VkdXJlIFdyaXRlQW5zaVN0cmluZyggY29uc3QgczogQW5zaVN0cmluZyk7CiAgICAgcHJvY2VkdXJlIFdyaXRlQmluYXJ5KCBjb25zdCBiOiBUQnl0ZXMpOwogCi0gICAgZnVuY3Rpb24gUmVhZE1lc3NhZ2VCZWdpbjogSU1lc3NhZ2U7CisgICAgZnVuY3Rpb24gUmVhZE1lc3NhZ2VCZWdpbjogVFRocmlmdE1lc3NhZ2U7CiAgICAgcHJvY2VkdXJlIFJlYWRNZXNzYWdlRW5kKCk7Ci0gICAgZnVuY3Rpb24gUmVhZFN0cnVjdEJlZ2luOiBJU3RydWN0OworICAgIGZ1bmN0aW9uIFJlYWRTdHJ1Y3RCZWdpbjogVFRocmlmdFN0cnVjdDsKICAgICBwcm9jZWR1cmUgUmVhZFN0cnVjdEVuZDsKLSAgICBmdW5jdGlvbiBSZWFkRmllbGRCZWdpbjogSUZpZWxkOworICAgIGZ1bmN0aW9uIFJlYWRGaWVsZEJlZ2luOiBUVGhyaWZ0RmllbGQ7CiAgICAgcHJvY2VkdXJlIFJlYWRGaWVsZEVuZCgpOwotICAgIGZ1bmN0aW9uIFJlYWRNYXBCZWdpbjogSU1hcDsKKyAgICBmdW5jdGlvbiBSZWFkTWFwQmVnaW46IFRUaHJpZnRNYXA7CiAgICAgcHJvY2VkdXJlIFJlYWRNYXBFbmQoKTsKLSAgICBmdW5jdGlvbiBSZWFkTGlzdEJlZ2luOiBJTGlzdDsKKyAgICBmdW5jdGlvbiBSZWFkTGlzdEJlZ2luOiBUVGhyaWZ0TGlzdDsKICAgICBwcm9jZWR1cmUgUmVhZExpc3RFbmQoKTsKLSAgICBmdW5jdGlvbiBSZWFkU2V0QmVnaW46IElTZXQ7CisgICAgZnVuY3Rpb24gUmVhZFNldEJlZ2luOiBUVGhyaWZ0U2V0OwogICAgIHByb2NlZHVyZSBSZWFkU2V0RW5kKCk7CiAgICAgZnVuY3Rpb24gUmVhZEJvb2w6IEJvb2xlYW47CiAgICAgZnVuY3Rpb24gUmVhZEJ5dGU6IFNob3J0SW50OwpAQCAtMjgxLDI2ICsyMTcsNDMgQEAKICAgICBmdW5jdGlvbiBSZWFkQmluYXJ5OiBUQnl0ZXM7CiAgICAgZnVuY3Rpb24gUmVhZFN0cmluZzogc3RyaW5nOwogICAgIGZ1bmN0aW9uIFJlYWRBbnNpU3RyaW5nOiBBbnNpU3RyaW5nOworCisgICAgcHJvY2VkdXJlIFNldFJlY3Vyc2lvbkxpbWl0KCB2YWx1ZSA6IEludGVnZXIpOworICAgIGZ1bmN0aW9uICBHZXRSZWN1cnNpb25MaW1pdCA6IEludGVnZXI7CisgICAgZnVuY3Rpb24gIE5leHRSZWN1cnNpb25MZXZlbCA6IElQcm90b2NvbFJlY3Vyc2lvblRyYWNrZXI7CisgICAgcHJvY2VkdXJlIEluY3JlbWVudFJlY3Vyc2lvbkRlcHRoOworICAgIHByb2NlZHVyZSBEZWNyZW1lbnRSZWN1cnNpb25EZXB0aDsKKwogICAgIHByb3BlcnR5IFRyYW5zcG9ydDogSVRyYW5zcG9ydCByZWFkIEdldFRyYW5zcG9ydDsKKyAgICBwcm9wZXJ0eSBSZWN1cnNpb25MaW1pdCA6IEludGVnZXIgcmVhZCBHZXRSZWN1cnNpb25MaW1pdCB3cml0ZSBTZXRSZWN1cnNpb25MaW1pdDsKICAgZW5kOwogCiAgIFRQcm90b2NvbEltcGwgPSBjbGFzcyBhYnN0cmFjdCggVEludGVyZmFjZWRPYmplY3QsIElQcm90b2NvbCkKICAgcHJvdGVjdGVkCiAgICAgRlRyYW5zIDogSVRyYW5zcG9ydDsKKyAgICBGUmVjdXJzaW9uTGltaXQgOiBJbnRlZ2VyOworICAgIEZSZWN1cnNpb25EZXB0aCA6IEludGVnZXI7CisKKyAgICBwcm9jZWR1cmUgU2V0UmVjdXJzaW9uTGltaXQoIHZhbHVlIDogSW50ZWdlcik7CisgICAgZnVuY3Rpb24gIEdldFJlY3Vyc2lvbkxpbWl0IDogSW50ZWdlcjsKKyAgICBmdW5jdGlvbiAgTmV4dFJlY3Vyc2lvbkxldmVsIDogSVByb3RvY29sUmVjdXJzaW9uVHJhY2tlcjsKKyAgICBwcm9jZWR1cmUgSW5jcmVtZW50UmVjdXJzaW9uRGVwdGg7CisgICAgcHJvY2VkdXJlIERlY3JlbWVudFJlY3Vyc2lvbkRlcHRoOworCiAgICAgZnVuY3Rpb24gR2V0VHJhbnNwb3J0OiBJVHJhbnNwb3J0OwogICBwdWJsaWMKLSAgICBwcm9jZWR1cmUgV3JpdGVNZXNzYWdlQmVnaW4oIGNvbnN0IG1zZzogSU1lc3NhZ2UpOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBwcm9jZWR1cmUgV3JpdGVNZXNzYWdlQmVnaW4oIGNvbnN0IG1zZzogVFRocmlmdE1lc3NhZ2UpOyB2aXJ0dWFsOyBhYnN0cmFjdDsKICAgICBwcm9jZWR1cmUgV3JpdGVNZXNzYWdlRW5kOyB2aXJ0dWFsOyBhYnN0cmFjdDsKLSAgICBwcm9jZWR1cmUgV3JpdGVTdHJ1Y3RCZWdpbiggY29uc3Qgc3RydWM6IElTdHJ1Y3QpOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBwcm9jZWR1cmUgV3JpdGVTdHJ1Y3RCZWdpbiggY29uc3Qgc3RydWM6IFRUaHJpZnRTdHJ1Y3QpOyB2aXJ0dWFsOyBhYnN0cmFjdDsKICAgICBwcm9jZWR1cmUgV3JpdGVTdHJ1Y3RFbmQ7IHZpcnR1YWw7IGFic3RyYWN0OwotICAgIHByb2NlZHVyZSBXcml0ZUZpZWxkQmVnaW4oIGNvbnN0IGZpZWxkOiBJRmllbGQpOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBwcm9jZWR1cmUgV3JpdGVGaWVsZEJlZ2luKCBjb25zdCBmaWVsZDogVFRocmlmdEZpZWxkKTsgdmlydHVhbDsgYWJzdHJhY3Q7CiAgICAgcHJvY2VkdXJlIFdyaXRlRmllbGRFbmQ7IHZpcnR1YWw7IGFic3RyYWN0OwogICAgIHByb2NlZHVyZSBXcml0ZUZpZWxkU3RvcDsgdmlydHVhbDsgYWJzdHJhY3Q7Ci0gICAgcHJvY2VkdXJlIFdyaXRlTWFwQmVnaW4oIGNvbnN0IG1hcDogSU1hcCk7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIHByb2NlZHVyZSBXcml0ZU1hcEJlZ2luKCBjb25zdCBtYXA6IFRUaHJpZnRNYXApOyB2aXJ0dWFsOyBhYnN0cmFjdDsKICAgICBwcm9jZWR1cmUgV3JpdGVNYXBFbmQ7IHZpcnR1YWw7IGFic3RyYWN0OwotICAgIHByb2NlZHVyZSBXcml0ZUxpc3RCZWdpbiggY29uc3QgbGlzdDogSUxpc3QpOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBwcm9jZWR1cmUgV3JpdGVMaXN0QmVnaW4oIGNvbnN0IGxpc3Q6IFRUaHJpZnRMaXN0KTsgdmlydHVhbDsgYWJzdHJhY3Q7CiAgICAgcHJvY2VkdXJlIFdyaXRlTGlzdEVuZCgpOyB2aXJ0dWFsOyBhYnN0cmFjdDsKLSAgICBwcm9jZWR1cmUgV3JpdGVTZXRCZWdpbiggY29uc3Qgc2V0XzogSVNldCApOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBwcm9jZWR1cmUgV3JpdGVTZXRCZWdpbiggY29uc3Qgc2V0XzogVFRocmlmdFNldCApOyB2aXJ0dWFsOyBhYnN0cmFjdDsKICAgICBwcm9jZWR1cmUgV3JpdGVTZXRFbmQoKTsgdmlydHVhbDsgYWJzdHJhY3Q7CiAgICAgcHJvY2VkdXJlIFdyaXRlQm9vbCggYjogQm9vbGVhbik7IHZpcnR1YWw7IGFic3RyYWN0OwogICAgIHByb2NlZHVyZSBXcml0ZUJ5dGUoIGI6IFNob3J0SW50KTsgdmlydHVhbDsgYWJzdHJhY3Q7CkBAIC0zMTIsMTcgKzI2NSwxNyBAQAogICAgIHByb2NlZHVyZSBXcml0ZUFuc2lTdHJpbmcoIGNvbnN0IHM6IEFuc2lTdHJpbmcpOyB2aXJ0dWFsOwogICAgIHByb2NlZHVyZSBXcml0ZUJpbmFyeSggY29uc3QgYjogVEJ5dGVzKTsgdmlydHVhbDsgYWJzdHJhY3Q7CiAKLSAgICBmdW5jdGlvbiBSZWFkTWVzc2FnZUJlZ2luOiBJTWVzc2FnZTsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgZnVuY3Rpb24gUmVhZE1lc3NhZ2VCZWdpbjogVFRocmlmdE1lc3NhZ2U7IHZpcnR1YWw7IGFic3RyYWN0OwogICAgIHByb2NlZHVyZSBSZWFkTWVzc2FnZUVuZCgpOyB2aXJ0dWFsOyBhYnN0cmFjdDsKLSAgICBmdW5jdGlvbiBSZWFkU3RydWN0QmVnaW46IElTdHJ1Y3Q7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIGZ1bmN0aW9uIFJlYWRTdHJ1Y3RCZWdpbjogVFRocmlmdFN0cnVjdDsgdmlydHVhbDsgYWJzdHJhY3Q7CiAgICAgcHJvY2VkdXJlIFJlYWRTdHJ1Y3RFbmQ7IHZpcnR1YWw7IGFic3RyYWN0OwotICAgIGZ1bmN0aW9uIFJlYWRGaWVsZEJlZ2luOiBJRmllbGQ7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIGZ1bmN0aW9uIFJlYWRGaWVsZEJlZ2luOiBUVGhyaWZ0RmllbGQ7IHZpcnR1YWw7IGFic3RyYWN0OwogICAgIHByb2NlZHVyZSBSZWFkRmllbGRFbmQoKTsgdmlydHVhbDsgYWJzdHJhY3Q7Ci0gICAgZnVuY3Rpb24gUmVhZE1hcEJlZ2luOiBJTWFwOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBmdW5jdGlvbiBSZWFkTWFwQmVnaW46IFRUaHJpZnRNYXA7IHZpcnR1YWw7IGFic3RyYWN0OwogICAgIHByb2NlZHVyZSBSZWFkTWFwRW5kKCk7IHZpcnR1YWw7IGFic3RyYWN0OwotICAgIGZ1bmN0aW9uIFJlYWRMaXN0QmVnaW46IElMaXN0OyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBmdW5jdGlvbiBSZWFkTGlzdEJlZ2luOiBUVGhyaWZ0TGlzdDsgdmlydHVhbDsgYWJzdHJhY3Q7CiAgICAgcHJvY2VkdXJlIFJlYWRMaXN0RW5kKCk7IHZpcnR1YWw7IGFic3RyYWN0OwotICAgIGZ1bmN0aW9uIFJlYWRTZXRCZWdpbjogSVNldDsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgZnVuY3Rpb24gUmVhZFNldEJlZ2luOiBUVGhyaWZ0U2V0OyB2aXJ0dWFsOyBhYnN0cmFjdDsKICAgICBwcm9jZWR1cmUgUmVhZFNldEVuZCgpOyB2aXJ0dWFsOyBhYnN0cmFjdDsKICAgICBmdW5jdGlvbiBSZWFkQm9vbDogQm9vbGVhbjsgdmlydHVhbDsgYWJzdHJhY3Q7CiAgICAgZnVuY3Rpb24gUmVhZEJ5dGU6IFNob3J0SW50OyB2aXJ0dWFsOyBhYnN0cmFjdDsKQEAgLTM0NiwyMiArMjk5LDYgQEAKICAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IGlwcm90OiBJUHJvdG9jb2wpOwogICBlbmQ7CiAKLSAgSVN0cnVjdCA9IGludGVyZmFjZQotICAgIFsnezVEQ0UzOUFBLUM5MTYtNEJDNy1BNzlCLTk2QTBDMzZCMjIyMH0nXQotICAgIHByb2NlZHVyZSBTZXROYW1lKGNvbnN0IFZhbHVlOiBzdHJpbmcpOwotICAgIGZ1bmN0aW9uIEdldE5hbWU6IHN0cmluZzsKLSAgICBwcm9wZXJ0eSBOYW1lOiBzdHJpbmcgcmVhZCBHZXROYW1lIHdyaXRlIFNldE5hbWU7Ci0gIGVuZDsKLQotICBUU3RydWN0SW1wbCA9IGNsYXNzKCBUSW50ZXJmYWNlZE9iamVjdCwgSVN0cnVjdCApCi0gIHByaXZhdGUKLSAgICBGTmFtZTogc3RyaW5nOwotICBwcm90ZWN0ZWQKLSAgICBmdW5jdGlvbiBHZXROYW1lOiBzdHJpbmc7Ci0gICAgcHJvY2VkdXJlIFNldE5hbWUoY29uc3QgVmFsdWU6IHN0cmluZyk7Ci0gIHB1YmxpYwotICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgQU5hbWU6IHN0cmluZyk7Ci0gIGVuZDsKIAogICBUQmluYXJ5UHJvdG9jb2xJbXBsID0gY2xhc3MoIFRQcm90b2NvbEltcGwgKQogICBwcm90ZWN0ZWQKQEAgLTM3Myw3ICszMTAsNyBAQAogICAgIEZTdHJpY3RXcml0ZSA6IEJvb2xlYW47CiAKICAgcHJpdmF0ZQotICAgIGZ1bmN0aW9uIFJlYWRBbGwoIHZhciBidWY6IFRCeXRlczsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIgKTogSW50ZWdlcjsKKyAgICBmdW5jdGlvbiBSZWFkQWxsKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIgKTogSW50ZWdlcjsgIGlubGluZTsKICAgICBmdW5jdGlvbiBSZWFkU3RyaW5nQm9keSggc2l6ZTogSW50ZWdlcik6IHN0cmluZzsKIAogICBwdWJsaWMKQEAgLTM5MiwxOCArMzI5LDE4IEBACiAgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCB0cmFuczogSVRyYW5zcG9ydCk7IG92ZXJsb2FkOwogICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgdHJhbnM6IElUcmFuc3BvcnQ7IHN0cmljdFJlYWQ6IEJvb2xlYW47IHN0cmljdFdyaXRlOiBCb29sZWFuKTsgb3ZlcmxvYWQ7CiAKLSAgICBwcm9jZWR1cmUgV3JpdGVNZXNzYWdlQmVnaW4oIGNvbnN0IG1zZzogSU1lc3NhZ2UpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVNZXNzYWdlQmVnaW4oIGNvbnN0IG1zZzogVFRocmlmdE1lc3NhZ2UpOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgV3JpdGVNZXNzYWdlRW5kOyBvdmVycmlkZTsKLSAgICBwcm9jZWR1cmUgV3JpdGVTdHJ1Y3RCZWdpbiggY29uc3Qgc3RydWM6IElTdHJ1Y3QpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVTdHJ1Y3RCZWdpbiggY29uc3Qgc3RydWM6IFRUaHJpZnRTdHJ1Y3QpOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgV3JpdGVTdHJ1Y3RFbmQ7IG92ZXJyaWRlOwotICAgIHByb2NlZHVyZSBXcml0ZUZpZWxkQmVnaW4oIGNvbnN0IGZpZWxkOiBJRmllbGQpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVGaWVsZEJlZ2luKCBjb25zdCBmaWVsZDogVFRocmlmdEZpZWxkKTsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFdyaXRlRmllbGRFbmQ7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBXcml0ZUZpZWxkU3RvcDsgb3ZlcnJpZGU7Ci0gICAgcHJvY2VkdXJlIFdyaXRlTWFwQmVnaW4oIGNvbnN0IG1hcDogSU1hcCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZU1hcEJlZ2luKCBjb25zdCBtYXA6IFRUaHJpZnRNYXApOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgV3JpdGVNYXBFbmQ7IG92ZXJyaWRlOwotICAgIHByb2NlZHVyZSBXcml0ZUxpc3RCZWdpbiggY29uc3QgbGlzdDogSUxpc3QpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVMaXN0QmVnaW4oIGNvbnN0IGxpc3Q6IFRUaHJpZnRMaXN0KTsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFdyaXRlTGlzdEVuZCgpOyBvdmVycmlkZTsKLSAgICBwcm9jZWR1cmUgV3JpdGVTZXRCZWdpbiggY29uc3Qgc2V0XzogSVNldCApOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVTZXRCZWdpbiggY29uc3Qgc2V0XzogVFRocmlmdFNldCApOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgV3JpdGVTZXRFbmQoKTsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFdyaXRlQm9vbCggYjogQm9vbGVhbik7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBXcml0ZUJ5dGUoIGI6IFNob3J0SW50KTsgb3ZlcnJpZGU7CkBAIC00MTMsMTcgKzM1MCwxNyBAQAogICAgIHByb2NlZHVyZSBXcml0ZURvdWJsZSggY29uc3QgZDogRG91YmxlKTsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFdyaXRlQmluYXJ5KCBjb25zdCBiOiBUQnl0ZXMpOyBvdmVycmlkZTsKIAotICAgIGZ1bmN0aW9uIFJlYWRNZXNzYWdlQmVnaW46IElNZXNzYWdlOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkTWVzc2FnZUJlZ2luOiBUVGhyaWZ0TWVzc2FnZTsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFJlYWRNZXNzYWdlRW5kKCk7IG92ZXJyaWRlOwotICAgIGZ1bmN0aW9uIFJlYWRTdHJ1Y3RCZWdpbjogSVN0cnVjdDsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZFN0cnVjdEJlZ2luOiBUVGhyaWZ0U3RydWN0OyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgUmVhZFN0cnVjdEVuZDsgb3ZlcnJpZGU7Ci0gICAgZnVuY3Rpb24gUmVhZEZpZWxkQmVnaW46IElGaWVsZDsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZEZpZWxkQmVnaW46IFRUaHJpZnRGaWVsZDsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFJlYWRGaWVsZEVuZCgpOyBvdmVycmlkZTsKLSAgICBmdW5jdGlvbiBSZWFkTWFwQmVnaW46IElNYXA7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRNYXBCZWdpbjogVFRocmlmdE1hcDsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFJlYWRNYXBFbmQoKTsgb3ZlcnJpZGU7Ci0gICAgZnVuY3Rpb24gUmVhZExpc3RCZWdpbjogSUxpc3Q7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRMaXN0QmVnaW46IFRUaHJpZnRMaXN0OyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgUmVhZExpc3RFbmQoKTsgb3ZlcnJpZGU7Ci0gICAgZnVuY3Rpb24gUmVhZFNldEJlZ2luOiBJU2V0OyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkU2V0QmVnaW46IFRUaHJpZnRTZXQ7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBSZWFkU2V0RW5kKCk7IG92ZXJyaWRlOwogICAgIGZ1bmN0aW9uIFJlYWRCb29sOiBCb29sZWFuOyBvdmVycmlkZTsKICAgICBmdW5jdGlvbiBSZWFkQnl0ZTogU2hvcnRJbnQ7IG92ZXJyaWRlOwpAQCAtNDUxLDE4ICszODgsMTggQEAKICAgICAvLyBBbGwgb3BlcmF0aW9ucyB3aWxsIGJlIGZvcndhcmQgdG8gdGhlIGdpdmVuIHByb3RvY29sLiAgTXVzdCBiZSBub24tbnVsbC4KICAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IGFQcm90b2NvbCA6IElQcm90b2NvbCk7CiAKLSAgICBwcm9jZWR1cmUgV3JpdGVNZXNzYWdlQmVnaW4oIGNvbnN0IG1zZzogSU1lc3NhZ2UpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVNZXNzYWdlQmVnaW4oIGNvbnN0IG1zZzogVFRocmlmdE1lc3NhZ2UpOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgV3JpdGVNZXNzYWdlRW5kOyBvdmVycmlkZTsKLSAgICBwcm9jZWR1cmUgV3JpdGVTdHJ1Y3RCZWdpbiggY29uc3Qgc3RydWM6IElTdHJ1Y3QpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVTdHJ1Y3RCZWdpbiggY29uc3Qgc3RydWM6IFRUaHJpZnRTdHJ1Y3QpOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgV3JpdGVTdHJ1Y3RFbmQ7IG92ZXJyaWRlOwotICAgIHByb2NlZHVyZSBXcml0ZUZpZWxkQmVnaW4oIGNvbnN0IGZpZWxkOiBJRmllbGQpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVGaWVsZEJlZ2luKCBjb25zdCBmaWVsZDogVFRocmlmdEZpZWxkKTsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFdyaXRlRmllbGRFbmQ7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBXcml0ZUZpZWxkU3RvcDsgb3ZlcnJpZGU7Ci0gICAgcHJvY2VkdXJlIFdyaXRlTWFwQmVnaW4oIGNvbnN0IG1hcDogSU1hcCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZU1hcEJlZ2luKCBjb25zdCBtYXA6IFRUaHJpZnRNYXApOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgV3JpdGVNYXBFbmQ7IG92ZXJyaWRlOwotICAgIHByb2NlZHVyZSBXcml0ZUxpc3RCZWdpbiggY29uc3QgbGlzdDogSUxpc3QpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVMaXN0QmVnaW4oIGNvbnN0IGxpc3Q6IFRUaHJpZnRMaXN0KTsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFdyaXRlTGlzdEVuZCgpOyBvdmVycmlkZTsKLSAgICBwcm9jZWR1cmUgV3JpdGVTZXRCZWdpbiggY29uc3Qgc2V0XzogSVNldCApOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVTZXRCZWdpbiggY29uc3Qgc2V0XzogVFRocmlmdFNldCApOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgV3JpdGVTZXRFbmQoKTsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFdyaXRlQm9vbCggYjogQm9vbGVhbik7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBXcml0ZUJ5dGUoIGI6IFNob3J0SW50KTsgb3ZlcnJpZGU7CkBAIC00NzQsMTcgKzQxMSwxNyBAQAogICAgIHByb2NlZHVyZSBXcml0ZUFuc2lTdHJpbmcoIGNvbnN0IHM6IEFuc2lTdHJpbmcpOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgV3JpdGVCaW5hcnkoIGNvbnN0IGI6IFRCeXRlcyk7IG92ZXJyaWRlOwogCi0gICAgZnVuY3Rpb24gUmVhZE1lc3NhZ2VCZWdpbjogSU1lc3NhZ2U7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRNZXNzYWdlQmVnaW46IFRUaHJpZnRNZXNzYWdlOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgUmVhZE1lc3NhZ2VFbmQoKTsgb3ZlcnJpZGU7Ci0gICAgZnVuY3Rpb24gUmVhZFN0cnVjdEJlZ2luOiBJU3RydWN0OyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkU3RydWN0QmVnaW46IFRUaHJpZnRTdHJ1Y3Q7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBSZWFkU3RydWN0RW5kOyBvdmVycmlkZTsKLSAgICBmdW5jdGlvbiBSZWFkRmllbGRCZWdpbjogSUZpZWxkOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkRmllbGRCZWdpbjogVFRocmlmdEZpZWxkOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgUmVhZEZpZWxkRW5kKCk7IG92ZXJyaWRlOwotICAgIGZ1bmN0aW9uIFJlYWRNYXBCZWdpbjogSU1hcDsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZE1hcEJlZ2luOiBUVGhyaWZ0TWFwOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgUmVhZE1hcEVuZCgpOyBvdmVycmlkZTsKLSAgICBmdW5jdGlvbiBSZWFkTGlzdEJlZ2luOiBJTGlzdDsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZExpc3RCZWdpbjogVFRocmlmdExpc3Q7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBSZWFkTGlzdEVuZCgpOyBvdmVycmlkZTsKLSAgICBmdW5jdGlvbiBSZWFkU2V0QmVnaW46IElTZXQ7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRTZXRCZWdpbjogVFRocmlmdFNldDsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFJlYWRTZXRFbmQoKTsgb3ZlcnJpZGU7CiAgICAgZnVuY3Rpb24gUmVhZEJvb2w6IEJvb2xlYW47IG92ZXJyaWRlOwogICAgIGZ1bmN0aW9uIFJlYWRCeXRlOiBTaG9ydEludDsgb3ZlcnJpZGU7CkBAIC01MzUsNiArNDcyLDEzIEBACiAgIGVuZDsKIAogCitwcm9jZWR1cmUgSW5pdCggdmFyIHJlYyA6IFRUaHJpZnRNZXNzYWdlOyBjb25zdCBBTmFtZTogc3RyaW5nID0gJyc7IGNvbnN0IEFNZXNzYWdlVHlwZTogVE1lc3NhZ2VUeXBlID0gTG93KFRNZXNzYWdlVHlwZSk7IGNvbnN0IEFTZXFJRDogSW50ZWdlciA9IDApOyAgb3ZlcmxvYWQ7ICBpbmxpbmU7Citwcm9jZWR1cmUgSW5pdCggdmFyIHJlYyA6IFRUaHJpZnRTdHJ1Y3Q7ICBjb25zdCBBTmFtZTogc3RyaW5nID0gJycpOyAgb3ZlcmxvYWQ7ICBpbmxpbmU7Citwcm9jZWR1cmUgSW5pdCggdmFyIHJlYyA6IFRUaHJpZnRGaWVsZDsgICBjb25zdCBBTmFtZTogc3RyaW5nID0gJyc7IGNvbnN0IEFUeXBlOiBUVHlwZSA9IExvdyhUVHlwZSk7IGNvbnN0IEFJRDogU21hbGxJbnQgPSAwKTsgIG92ZXJsb2FkOyAgaW5saW5lOworcHJvY2VkdXJlIEluaXQoIHZhciByZWMgOiBUVGhyaWZ0TWFwOyAgICAgY29uc3QgQUtleVR5cGU6IFRUeXBlID0gTG93KFRUeXBlKTsgY29uc3QgQVZhbHVlVHlwZTogVFR5cGUgPSBMb3coVFR5cGUpOyBjb25zdCBBQ291bnQ6IEludGVnZXIgPSAwKTsgb3ZlcmxvYWQ7ICBpbmxpbmU7Citwcm9jZWR1cmUgSW5pdCggdmFyIHJlYyA6IFRUaHJpZnRTZXQ7ICAgICBjb25zdCBBRWxlbWVudFR5cGU6IFRUeXBlID0gTG93KFRUeXBlKTsgY29uc3QgQUNvdW50OiBJbnRlZ2VyID0gMCk7IG92ZXJsb2FkOyAgaW5saW5lOworcHJvY2VkdXJlIEluaXQoIHZhciByZWMgOiBUVGhyaWZ0TGlzdDsgICAgY29uc3QgQUVsZW1lbnRUeXBlOiBUVHlwZSA9IExvdyhUVHlwZSk7IGNvbnN0IEFDb3VudDogSW50ZWdlciA9IDApOyBvdmVybG9hZDsgIGlubGluZTsKKwogCiBpbXBsZW1lbnRhdGlvbgogCkBAIC01NTAsNTMgKzQ5NCwzMCBAQAogICBTeXN0ZW0uTW92ZSggZCwgUmVzdWx0LCBTaXplT2YoUmVzdWx0KSk7CiBlbmQ7CiAKLXsgVEZpZWxkSW1wbCB9CiAKLWNvbnN0cnVjdG9yIFRGaWVsZEltcGwuQ3JlYXRlKGNvbnN0IEFOYW1lOiBzdHJpbmc7IGNvbnN0IEFUeXBlOiBUVHlwZTsKLSAgQUlkOiBTbWFsbEludCk7CisKK3sgVFByb3RvY29sUmVjdXJzaW9uVHJhY2tlckltcGwgfQorCitjb25zdHJ1Y3RvciBUUHJvdG9jb2xSZWN1cnNpb25UcmFja2VySW1wbC5DcmVhdGUoIHByb3QgOiBJUHJvdG9jb2wpOwogYmVnaW4KICAgaW5oZXJpdGVkIENyZWF0ZTsKLSAgRk5hbWUgOj0gQU5hbWU7Ci0gIEZUeXBlIDo9IEFUeXBlOwotICBGSWQgOj0gQUlkOworCisgIC8vIHN0b3JpbmcgdGhlIHBvaW50ZXIgKmFmdGVyKiB0aGUgKHN1Y2Nlc3NmdWwpIGluY3JlbWVudCBpcyBpbXBvcnRhbnQgaGVyZQorICBwcm90LkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoOworICBGUHJvdG9jb2wgOj0gcHJvdDsKIGVuZDsKIAotY29uc3RydWN0b3IgVEZpZWxkSW1wbC5DcmVhdGU7CitkZXN0cnVjdG9yIFRQcm90b2NvbFJlY3Vyc2lvblRyYWNrZXJJbXBsLkRlc3Ryb3k7CiBiZWdpbgotICBpbmhlcml0ZWQgQ3JlYXRlOwotICBGTmFtZSA6PSAnJzsKLSAgRlR5cGUgOj0gTG93KFRUeXBlKTsKLSAgRklkICAgOj0gMDsKLWVuZDsKLQotZnVuY3Rpb24gVEZpZWxkSW1wbC5HZXRJZDogU21hbGxJbnQ7Ci1iZWdpbgotICBSZXN1bHQgOj0gRklkOwotZW5kOwotCi1mdW5jdGlvbiBURmllbGRJbXBsLkdldE5hbWU6IHN0cmluZzsKLWJlZ2luCi0gIFJlc3VsdCA6PSBGTmFtZTsKLWVuZDsKLQotZnVuY3Rpb24gVEZpZWxkSW1wbC5HZXRUeXBlOiBUVHlwZTsKLWJlZ2luCi0gIFJlc3VsdCA6PSBGVHlwZTsKLWVuZDsKLQotcHJvY2VkdXJlIFRGaWVsZEltcGwuU2V0SWQoVmFsdWU6IFNtYWxsSW50KTsKLWJlZ2luCi0gIEZJZCA6PSBWYWx1ZTsKLWVuZDsKLQotcHJvY2VkdXJlIFRGaWVsZEltcGwuU2V0TmFtZShjb25zdCBWYWx1ZTogc3RyaW5nKTsKLWJlZ2luCi0gIEZOYW1lIDo9IFZhbHVlOwotZW5kOwotCi1wcm9jZWR1cmUgVEZpZWxkSW1wbC5TZXRUeXBlKFZhbHVlOiBUVHlwZSk7Ci1iZWdpbgotICBGVHlwZSA6PSBWYWx1ZTsKKyAgdHJ5CisgICAgLy8gd2UgaGF2ZSB0byByZWxlYXNlIHRoZSByZWZlcmVuY2UgaWZmIHRoZSBwb2ludGVyIGhhcyBiZWVuIHN0b3JlZAorICAgIGlmIEZQcm90b2NvbCA8PiBuaWwgdGhlbiBiZWdpbgorICAgICAgRlByb3RvY29sLkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoOworICAgICAgRlByb3RvY29sIDo9IG5pbDsKKyAgICBlbmQ7CisgIGZpbmFsbHkKKyAgICBpbmhlcml0ZWQgRGVzdHJveTsKKyAgZW5kOwogZW5kOwogCiB7IFRQcm90b2NvbEltcGwgfQpAQCAtNjA1LDYgKzUyNiwzNSBAQAogYmVnaW4KICAgaW5oZXJpdGVkIENyZWF0ZTsKICAgRlRyYW5zIDo9IHRyYW5zOworICBGUmVjdXJzaW9uTGltaXQgOj0gREVGQVVMVF9SRUNVUlNJT05fTElNSVQ7CisgIEZSZWN1cnNpb25EZXB0aCA6PSAwOworZW5kOworCitwcm9jZWR1cmUgVFByb3RvY29sSW1wbC5TZXRSZWN1cnNpb25MaW1pdCggdmFsdWUgOiBJbnRlZ2VyKTsKK2JlZ2luCisgIEZSZWN1cnNpb25MaW1pdCA6PSB2YWx1ZTsKK2VuZDsKKworZnVuY3Rpb24gVFByb3RvY29sSW1wbC5HZXRSZWN1cnNpb25MaW1pdCA6IEludGVnZXI7CitiZWdpbgorICByZXN1bHQgOj0gRlJlY3Vyc2lvbkxpbWl0OworZW5kOworCitmdW5jdGlvbiBUUHJvdG9jb2xJbXBsLk5leHRSZWN1cnNpb25MZXZlbCA6IElQcm90b2NvbFJlY3Vyc2lvblRyYWNrZXI7CitiZWdpbgorICByZXN1bHQgOj0gVFByb3RvY29sUmVjdXJzaW9uVHJhY2tlckltcGwuQ3JlYXRlKFNlbGYpOworZW5kOworCitwcm9jZWR1cmUgVFByb3RvY29sSW1wbC5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aDsKK2JlZ2luCisgIGlmIEZSZWN1cnNpb25EZXB0aCA8IEZSZWN1cnNpb25MaW1pdAorICB0aGVuIEluYyhGUmVjdXJzaW9uRGVwdGgpCisgIGVsc2UgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uRGVwdGhMaW1pdC5DcmVhdGUoJ0RlcHRoIGxpbWl0IGV4Y2VlZGVkJyk7CitlbmQ7CisKK3Byb2NlZHVyZSBUUHJvdG9jb2xJbXBsLkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoOworYmVnaW4KKyAgRGVjKEZSZWN1cnNpb25EZXB0aCkKIGVuZDsKIAogZnVuY3Rpb24gVFByb3RvY29sSW1wbC5HZXRUcmFuc3BvcnQ6IElUcmFuc3BvcnQ7CkBAIC02NTcsMTIgKzYwNywxNCBAQAogeyBUUHJvdG9jb2xVdGlsIH0KIAogY2xhc3MgcHJvY2VkdXJlIFRQcm90b2NvbFV0aWwuU2tpcCggcHJvdDogSVByb3RvY29sOyB0eXBlXzogVFR5cGUpOwotdmFyIGZpZWxkIDogSUZpZWxkOwotICAgIG1hcCAgIDogSU1hcDsKLSAgICBzZXRfICA6IElTZXQ7Ci0gICAgbGlzdCAgOiBJTGlzdDsKK3ZhciBmaWVsZCA6IFRUaHJpZnRGaWVsZDsKKyAgICBtYXAgICA6IFRUaHJpZnRNYXA7CisgICAgc2V0XyAgOiBUVGhyaWZ0U2V0OworICAgIGxpc3QgIDogVFRocmlmdExpc3Q7CiAgICAgaSAgICAgOiBJbnRlZ2VyOworICAgIHRyYWNrZXIgOiBJUHJvdG9jb2xSZWN1cnNpb25UcmFja2VyOwogYmVnaW4KKyAgdHJhY2tlciA6PSBwcm90Lk5leHRSZWN1cnNpb25MZXZlbDsKICAgY2FzZSB0eXBlXyBvZgogICAgIC8vIHNpbXBsZSB0eXBlcwogICAgIFRUeXBlLkJvb2xfICAgOiAgcHJvdC5SZWFkQm9vbCgpOwpAQCAtNzA5LDE4NiArNjYxLDEwIEBACiAgICAgZW5kOwogCiAgIGVsc2UKLSAgICBBU1NFUlQoIEZBTFNFKTsgLy8gYW55IG5ldyB0eXBlcz8KKyAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb25JbnZhbGlkRGF0YS5DcmVhdGUoJ1VuZXhwZWN0ZWQgdHlwZSAnK0ludFRvU3RyKE9yZCh0eXBlXykpKTsKICAgZW5kOwogZW5kOwogCi17IFRTdHJ1Y3RJbXBsIH0KLQotY29uc3RydWN0b3IgVFN0cnVjdEltcGwuQ3JlYXRlKGNvbnN0IEFOYW1lOiBzdHJpbmcpOwotYmVnaW4KLSAgaW5oZXJpdGVkIENyZWF0ZTsKLSAgRk5hbWUgOj0gQU5hbWU7Ci1lbmQ7Ci0KLWZ1bmN0aW9uIFRTdHJ1Y3RJbXBsLkdldE5hbWU6IHN0cmluZzsKLWJlZ2luCi0gIFJlc3VsdCA6PSBGTmFtZTsKLWVuZDsKLQotcHJvY2VkdXJlIFRTdHJ1Y3RJbXBsLlNldE5hbWUoY29uc3QgVmFsdWU6IHN0cmluZyk7Ci1iZWdpbgotICBGTmFtZSA6PSBWYWx1ZTsKLWVuZDsKLQoteyBUTWFwSW1wbCB9Ci0KLWNvbnN0cnVjdG9yIFRNYXBJbXBsLkNyZWF0ZShBVmFsdWVUeXBlLCBBS2V5VHlwZTogVFR5cGU7IEFDb3VudDogSW50ZWdlcik7Ci1iZWdpbgotICBpbmhlcml0ZWQgQ3JlYXRlOwotICBGVmFsdWVUeXBlIDo9IEFWYWx1ZVR5cGU7Ci0gIEZLZXlUeXBlIDo9IEFLZXlUeXBlOwotICBGQ291bnQgOj0gQUNvdW50OwotZW5kOwotCi1jb25zdHJ1Y3RvciBUTWFwSW1wbC5DcmVhdGU7Ci1iZWdpbgotICBpbmhlcml0ZWQgQ3JlYXRlOwotZW5kOwotCi1mdW5jdGlvbiBUTWFwSW1wbC5HZXRDb3VudDogSW50ZWdlcjsKLWJlZ2luCi0gIFJlc3VsdCA6PSBGQ291bnQ7Ci1lbmQ7Ci0KLWZ1bmN0aW9uIFRNYXBJbXBsLkdldEtleVR5cGU6IFRUeXBlOwotYmVnaW4KLSAgUmVzdWx0IDo9IEZLZXlUeXBlOwotZW5kOwotCi1mdW5jdGlvbiBUTWFwSW1wbC5HZXRWYWx1ZVR5cGU6IFRUeXBlOwotYmVnaW4KLSAgUmVzdWx0IDo9IEZWYWx1ZVR5cGU7Ci1lbmQ7Ci0KLXByb2NlZHVyZSBUTWFwSW1wbC5TZXRDb3VudChWYWx1ZTogSW50ZWdlcik7Ci1iZWdpbgotICBGQ291bnQgOj0gVmFsdWU7Ci1lbmQ7Ci0KLXByb2NlZHVyZSBUTWFwSW1wbC5TZXRLZXlUeXBlKFZhbHVlOiBUVHlwZSk7Ci1iZWdpbgotICBGS2V5VHlwZSA6PSBWYWx1ZTsKLWVuZDsKLQotcHJvY2VkdXJlIFRNYXBJbXBsLlNldFZhbHVlVHlwZShWYWx1ZTogVFR5cGUpOwotYmVnaW4KLSAgRlZhbHVlVHlwZSA6PSBWYWx1ZTsKLWVuZDsKLQoteyBJTWVzc2FnZSB9Ci0KLWNvbnN0cnVjdG9yIFRNZXNzYWdlSW1wbC5DcmVhdGUoQU5hbWU6IHN0cmluZzsgQU1lc3NhZ2VUeXBlOiBUTWVzc2FnZVR5cGU7Ci0gIEFTZXFJRDogSW50ZWdlcik7Ci1iZWdpbgotICBpbmhlcml0ZWQgQ3JlYXRlOwotICBGTmFtZSA6PSBBTmFtZTsKLSAgRk1lc3NhZ2VUeXBlIDo9IEFNZXNzYWdlVHlwZTsKLSAgRlNlcUlEIDo9IEFTZXFJRDsKLWVuZDsKLQotY29uc3RydWN0b3IgVE1lc3NhZ2VJbXBsLkNyZWF0ZTsKLWJlZ2luCi0gIGluaGVyaXRlZDsKLWVuZDsKLQotZnVuY3Rpb24gVE1lc3NhZ2VJbXBsLkdldE5hbWU6IHN0cmluZzsKLWJlZ2luCi0gIFJlc3VsdCA6PSBGTmFtZTsKLWVuZDsKLQotZnVuY3Rpb24gVE1lc3NhZ2VJbXBsLkdldFNlcUlEOiBJbnRlZ2VyOwotYmVnaW4KLSAgUmVzdWx0IDo9IEZTZXFJRDsKLWVuZDsKLQotZnVuY3Rpb24gVE1lc3NhZ2VJbXBsLkdldFR5cGU6IFRNZXNzYWdlVHlwZTsKLWJlZ2luCi0gIFJlc3VsdCA6PSBGTWVzc2FnZVR5cGU7Ci1lbmQ7Ci0KLXByb2NlZHVyZSBUTWVzc2FnZUltcGwuU2V0TmFtZShjb25zdCBWYWx1ZTogc3RyaW5nKTsKLWJlZ2luCi0gIEZOYW1lIDo9IFZhbHVlOwotZW5kOwotCi1wcm9jZWR1cmUgVE1lc3NhZ2VJbXBsLlNldFNlcUlEKFZhbHVlOiBJbnRlZ2VyKTsKLWJlZ2luCi0gIEZTZXFJRCA6PSBWYWx1ZTsKLWVuZDsKLQotcHJvY2VkdXJlIFRNZXNzYWdlSW1wbC5TZXRUeXBlKFZhbHVlOiBUTWVzc2FnZVR5cGUpOwotYmVnaW4KLSAgRk1lc3NhZ2VUeXBlIDo9IFZhbHVlOwotZW5kOwotCi17IElTZXQgfQotCi1jb25zdHJ1Y3RvciBUU2V0SW1wbC5DcmVhdGUoIEFFbGVtZW50VHlwZTogVFR5cGU7IEFDb3VudDogSW50ZWdlcik7Ci1iZWdpbgotICBpbmhlcml0ZWQgQ3JlYXRlOwotICBGQ291bnQgOj0gQUNvdW50OwotICBGRWxlbWVudFR5cGUgOj0gQUVsZW1lbnRUeXBlOwotZW5kOwotCi1jb25zdHJ1Y3RvciBUU2V0SW1wbC5DcmVhdGU7Ci1iZWdpbgotICBpbmhlcml0ZWQgQ3JlYXRlOwotZW5kOwotCi1mdW5jdGlvbiBUU2V0SW1wbC5HZXRDb3VudDogSW50ZWdlcjsKLWJlZ2luCi0gIFJlc3VsdCA6PSBGQ291bnQ7Ci1lbmQ7Ci0KLWZ1bmN0aW9uIFRTZXRJbXBsLkdldEVsZW1lbnRUeXBlOiBUVHlwZTsKLWJlZ2luCi0gIFJlc3VsdCA6PSBGRWxlbWVudFR5cGU7Ci1lbmQ7Ci0KLXByb2NlZHVyZSBUU2V0SW1wbC5TZXRDb3VudChWYWx1ZTogSW50ZWdlcik7Ci1iZWdpbgotICBGQ291bnQgOj0gVmFsdWU7Ci1lbmQ7Ci0KLXByb2NlZHVyZSBUU2V0SW1wbC5TZXRFbGVtZW50VHlwZShWYWx1ZTogVFR5cGUpOwotYmVnaW4KLSAgRkVsZW1lbnRUeXBlIDo9IFZhbHVlOwotZW5kOwotCi17IElMaXN0IH0KLQotY29uc3RydWN0b3IgVExpc3RJbXBsLkNyZWF0ZSggQUVsZW1lbnRUeXBlOiBUVHlwZTsgQUNvdW50OiBJbnRlZ2VyKTsKLWJlZ2luCi0gIGluaGVyaXRlZCBDcmVhdGU7Ci0gIEZDb3VudCA6PSBBQ291bnQ7Ci0gIEZFbGVtZW50VHlwZSA6PSBBRWxlbWVudFR5cGU7Ci1lbmQ7Ci0KLWNvbnN0cnVjdG9yIFRMaXN0SW1wbC5DcmVhdGU7Ci1iZWdpbgotICBpbmhlcml0ZWQgQ3JlYXRlOwotZW5kOwotCi1mdW5jdGlvbiBUTGlzdEltcGwuR2V0Q291bnQ6IEludGVnZXI7Ci1iZWdpbgotICBSZXN1bHQgOj0gRkNvdW50OwotZW5kOwotCi1mdW5jdGlvbiBUTGlzdEltcGwuR2V0RWxlbWVudFR5cGU6IFRUeXBlOwotYmVnaW4KLSAgUmVzdWx0IDo9IEZFbGVtZW50VHlwZTsKLWVuZDsKLQotcHJvY2VkdXJlIFRMaXN0SW1wbC5TZXRDb3VudChWYWx1ZTogSW50ZWdlcik7Ci1iZWdpbgotICBGQ291bnQgOj0gVmFsdWU7Ci1lbmQ7Ci0KLXByb2NlZHVyZSBUTGlzdEltcGwuU2V0RWxlbWVudFR5cGUoVmFsdWU6IFRUeXBlKTsKLWJlZ2luCi0gIEZFbGVtZW50VHlwZSA6PSBWYWx1ZTsKLWVuZDsKIAogeyBUQmluYXJ5UHJvdG9jb2xJbXBsIH0KIApAQCAtOTA2LDEwICs2ODIsOSBAQAogICBGU3RyaWN0V3JpdGUgOj0gc3RyaWN0V3JpdGU7CiBlbmQ7CiAKLWZ1bmN0aW9uIFRCaW5hcnlQcm90b2NvbEltcGwuUmVhZEFsbCggdmFyIGJ1ZjogVEJ5dGVzOyBvZmYsCi0gIGxlbjogSW50ZWdlcik6IEludGVnZXI7CitmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRBbGwoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlciApOiBJbnRlZ2VyOwogYmVnaW4KLSAgUmVzdWx0IDo9IEZUcmFucy5SZWFkQWxsKCBidWYsIG9mZiwgbGVuICk7CisgIFJlc3VsdCA6PSBGVHJhbnMuUmVhZEFsbCggcEJ1ZiwgYnVmbGVuLCBvZmYsIGxlbiApOwogZW5kOwogCiBmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRCaW5hcnk6IFRCeXRlczsKQEAgLTkyNSwxNiArNzAwLDEyIEBACiAKIGZ1bmN0aW9uIFRCaW5hcnlQcm90b2NvbEltcGwuUmVhZEJvb2w6IEJvb2xlYW47CiBiZWdpbgotICBSZXN1bHQgOj0gUmVhZEJ5dGUgPSAxOworICBSZXN1bHQgOj0gKFJlYWRCeXRlID0gMSk7CiBlbmQ7CiAKIGZ1bmN0aW9uIFRCaW5hcnlQcm90b2NvbEltcGwuUmVhZEJ5dGU6IFNob3J0SW50OwotdmFyCi0gIGJpbiA6IFRCeXRlczsKIGJlZ2luCi0gIFNldExlbmd0aCggYmluLCAxKTsKLSAgUmVhZEFsbCggYmluLCAwLCAxICk7Ci0gIFJlc3VsdCA6PSBTaG9ydEludCggYmluWzBdKTsKKyAgUmVhZEFsbCggQHJlc3VsdCwgU2l6ZU9mKHJlc3VsdCksIDAsIDEpOwogZW5kOwogCiBmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWREb3VibGU6IERvdWJsZTsKQEAgLTk0MiwxNyArNzEzLDEyIEBACiAgIFJlc3VsdCA6PSBDb252ZXJ0SW50NjRUb0RvdWJsZSggUmVhZEk2NCApCiBlbmQ7CiAKLWZ1bmN0aW9uIFRCaW5hcnlQcm90b2NvbEltcGwuUmVhZEZpZWxkQmVnaW46IElGaWVsZDsKLXZhcgotICBmaWVsZCA6IElGaWVsZDsKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbEltcGwuUmVhZEZpZWxkQmVnaW46IFRUaHJpZnRGaWVsZDsKIGJlZ2luCi0gIGZpZWxkIDo9IFRGaWVsZEltcGwuQ3JlYXRlOwotICBmaWVsZC5UeXBlXyA6PSBUVHlwZSggUmVhZEJ5dGUpOwotICBpZiAoIGZpZWxkLlR5cGVfIDw+IFRUeXBlLlN0b3AgKSB0aGVuCi0gIGJlZ2luCi0gICAgZmllbGQuSWQgOj0gUmVhZEkxNjsKKyAgSW5pdCggcmVzdWx0LCAnJywgVFR5cGUoIFJlYWRCeXRlKSwgMCk7CisgIGlmICggcmVzdWx0LlR5cGVfIDw+IFRUeXBlLlN0b3AgKSB0aGVuIGJlZ2luCisgICAgcmVzdWx0LklkIDo9IFJlYWRJMTY7CiAgIGVuZDsKLSAgUmVzdWx0IDo9IGZpZWxkOwogZW5kOwogCiBwcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5SZWFkRmllbGRFbmQ7CkBAIC05NjEsMjAgKzcyNywxNiBAQAogZW5kOwogCiBmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRJMTY6IFNtYWxsSW50OwotdmFyCi0gIGkxNmluIDogVEJ5dGVzOwordmFyIGkxNmluIDogcGFja2VkIGFycmF5WzAuLjFdIG9mIEJ5dGU7CiBiZWdpbgotICBTZXRMZW5ndGgoIGkxNmluLCAyICk7Ci0gIFJlYWRBbGwoIGkxNmluLCAwLCAyKTsKKyAgUmVhZEFsbCggQGkxNmluLCBTaXplb2YoaTE2aW4pLCAwLCAyKTsKICAgUmVzdWx0IDo9IFNtYWxsSW50KCgoaTE2aW5bMF0gYW5kICRGRikgc2hsIDgpIG9yIChpMTZpblsxXSBhbmQgJEZGKSk7CiBlbmQ7CiAKIGZ1bmN0aW9uIFRCaW5hcnlQcm90b2NvbEltcGwuUmVhZEkzMjogSW50ZWdlcjsKLXZhcgotICBpMzJpbiA6IFRCeXRlczsKK3ZhciBpMzJpbiA6IHBhY2tlZCBhcnJheVswLi4zXSBvZiBCeXRlOwogYmVnaW4KLSAgU2V0TGVuZ3RoKCBpMzJpbiwgNCApOwotICBSZWFkQWxsKCBpMzJpbiwgMCwgNCk7CisgIFJlYWRBbGwoIEBpMzJpbiwgU2l6ZU9mKGkzMmluKSwgMCwgNCk7CiAKICAgUmVzdWx0IDo9IEludGVnZXIoCiAgICAgKChpMzJpblswXSBhbmQgJEZGKSBzaGwgMjQpIG9yCkBAIC05ODUsMTEgKzc0Nyw5IEBACiBlbmQ7CiAKIGZ1bmN0aW9uIFRCaW5hcnlQcm90b2NvbEltcGwuUmVhZEk2NDogSW50NjQ7Ci12YXIKLSAgaTY0aW4gOiBUQnl0ZXM7Cit2YXIgaTY0aW4gOiBwYWNrZWQgYXJyYXlbMC4uN10gb2YgQnl0ZTsKIGJlZ2luCi0gIFNldExlbmd0aCggaTY0aW4sIDgpOwotICBSZWFkQWxsKCBpNjRpbiwgMCwgOCk7CisgIFJlYWRBbGwoIEBpNjRpbiwgU2l6ZU9mKGk2NGluKSwgMCwgOCk7CiAgIFJlc3VsdCA6PQogICAgIChJbnQ2NCggaTY0aW5bMF0gYW5kICRGRikgc2hsIDU2KSBvcgogICAgIChJbnQ2NCggaTY0aW5bMV0gYW5kICRGRikgc2hsIDQ4KSBvcgpAQCAtMTAwMSwxNCArNzYxLDEwIEBACiAgICAgKEludDY0KCBpNjRpbls3XSBhbmQgJEZGKSk7CiBlbmQ7CiAKLWZ1bmN0aW9uIFRCaW5hcnlQcm90b2NvbEltcGwuUmVhZExpc3RCZWdpbjogSUxpc3Q7Ci12YXIKLSAgbGlzdCA6IElMaXN0OworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sSW1wbC5SZWFkTGlzdEJlZ2luOiBUVGhyaWZ0TGlzdDsKIGJlZ2luCi0gIGxpc3QgOj0gVExpc3RJbXBsLkNyZWF0ZTsKLSAgbGlzdC5FbGVtZW50VHlwZSA6PSBUVHlwZSggUmVhZEJ5dGUgKTsKLSAgbGlzdC5Db3VudCA6PSBSZWFkSTMyOwotICBSZXN1bHQgOj0gbGlzdDsKKyAgcmVzdWx0LkVsZW1lbnRUeXBlIDo9IFRUeXBlKFJlYWRCeXRlKTsKKyAgcmVzdWx0LkNvdW50ICAgICAgIDo9IFJlYWRJMzI7CiBlbmQ7CiAKIHByb2NlZHVyZSBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRMaXN0RW5kOwpAQCAtMTAxNiwxNSArNzcyLDExIEBACiAKIGVuZDsKIAotZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sSW1wbC5SZWFkTWFwQmVnaW46IElNYXA7Ci12YXIKLSAgbWFwIDogSU1hcDsKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbEltcGwuUmVhZE1hcEJlZ2luOiBUVGhyaWZ0TWFwOwogYmVnaW4KLSAgbWFwIDo9IFRNYXBJbXBsLkNyZWF0ZTsKLSAgbWFwLktleVR5cGUgOj0gVFR5cGUoIFJlYWRCeXRlICk7Ci0gIG1hcC5WYWx1ZVR5cGUgOj0gVFR5cGUoIFJlYWRCeXRlICk7Ci0gIG1hcC5Db3VudCA6PSBSZWFkSTMyOwotICBSZXN1bHQgOj0gbWFwOworICByZXN1bHQuS2V5VHlwZSAgIDo9IFRUeXBlKFJlYWRCeXRlKTsKKyAgcmVzdWx0LlZhbHVlVHlwZSA6PSBUVHlwZShSZWFkQnl0ZSk7CisgIHJlc3VsdC5Db3VudCAgICAgOj0gUmVhZEkzMjsKIGVuZDsKIAogcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuUmVhZE1hcEVuZDsKQEAgLTEwMzIsMzUgKzc4NCwzMCBAQAogCiBlbmQ7CiAKLWZ1bmN0aW9uIFRCaW5hcnlQcm90b2NvbEltcGwuUmVhZE1lc3NhZ2VCZWdpbjogSU1lc3NhZ2U7CitmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRNZXNzYWdlQmVnaW46IFRUaHJpZnRNZXNzYWdlOwogdmFyCiAgIHNpemUgOiBJbnRlZ2VyOwogICB2ZXJzaW9uIDogSW50ZWdlcjsKLSAgbWVzc2FnZSA6IElNZXNzYWdlOwogYmVnaW4KLSAgbWVzc2FnZSA6PSBUTWVzc2FnZUltcGwuQ3JlYXRlOworICBJbml0KCByZXN1bHQpOwogICBzaXplIDo9IFJlYWRJMzI7Ci0gIGlmIChzaXplIDwgMCkgdGhlbgotICBiZWdpbgorICBpZiAoc2l6ZSA8IDApIHRoZW4gYmVnaW4KICAgICB2ZXJzaW9uIDo9IHNpemUgYW5kIEludGVnZXIoIFZFUlNJT05fTUFTSyk7Ci0gICAgaWYgKCB2ZXJzaW9uIDw+IEludGVnZXIoIFZFUlNJT05fMSkpIHRoZW4KLSAgICBiZWdpbgotICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uLkNyZWF0ZShUUHJvdG9jb2xFeGNlcHRpb24uQkFEX1ZFUlNJT04sICdCYWQgdmVyc2lvbiBpbiBSZWFkTWVzc2FnZUJlZ2luOiAnICsgSW50VG9TdHIodmVyc2lvbikgKTsKKyAgICBpZiAoIHZlcnNpb24gPD4gSW50ZWdlciggVkVSU0lPTl8xKSkgdGhlbiBiZWdpbgorICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uQmFkVmVyc2lvbi5DcmVhdGUoJ0JhZCB2ZXJzaW9uIGluIFJlYWRNZXNzYWdlQmVnaW46ICcgKyBJbnRUb1N0cih2ZXJzaW9uKSApOwogICAgIGVuZDsKLSAgICBtZXNzYWdlLlR5cGVfIDo9IFRNZXNzYWdlVHlwZSggc2l6ZSBhbmQgJDAwMDAwMGZmKTsKLSAgICBtZXNzYWdlLk5hbWUgOj0gUmVhZFN0cmluZzsKLSAgICBtZXNzYWdlLlNlcUlEIDo9IFJlYWRJMzI7Ci0gIGVuZCBlbHNlCi0gIGJlZ2luCi0gICAgaWYgRlN0cmljdFJlYWQgdGhlbgotICAgIGJlZ2luCi0gICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24uQ3JlYXRlKCBUUHJvdG9jb2xFeGNlcHRpb24uQkFEX1ZFUlNJT04sICdNaXNzaW5nIHZlcnNpb24gaW4gcmVhZE1lc3NhZ2VCZWdpbiwgb2xkIGNsaWVudD8nICk7CisgICAgcmVzdWx0LlR5cGVfIDo9IFRNZXNzYWdlVHlwZSggc2l6ZSBhbmQgJDAwMDAwMGZmKTsKKyAgICByZXN1bHQuTmFtZSA6PSBSZWFkU3RyaW5nOworICAgIHJlc3VsdC5TZXFJRCA6PSBSZWFkSTMyOworICBlbmQKKyAgZWxzZSBiZWdpbgorICAgIGlmIEZTdHJpY3RSZWFkIHRoZW4gYmVnaW4KKyAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbkJhZFZlcnNpb24uQ3JlYXRlKCdNaXNzaW5nIHZlcnNpb24gaW4gcmVhZE1lc3NhZ2VCZWdpbiwgb2xkIGNsaWVudD8nICk7CiAgICAgZW5kOwotICAgIG1lc3NhZ2UuTmFtZSA6PSBSZWFkU3RyaW5nQm9keSggc2l6ZSApOwotICAgIG1lc3NhZ2UuVHlwZV8gOj0gVE1lc3NhZ2VUeXBlKCBSZWFkQnl0ZSApOwotICAgIG1lc3NhZ2UuU2VxSUQgOj0gUmVhZEkzMjsKKyAgICByZXN1bHQuTmFtZSA6PSBSZWFkU3RyaW5nQm9keSggc2l6ZSApOworICAgIHJlc3VsdC5UeXBlXyA6PSBUTWVzc2FnZVR5cGUoIFJlYWRCeXRlICk7CisgICAgcmVzdWx0LlNlcUlEIDo9IFJlYWRJMzI7CiAgIGVuZDsKLSAgUmVzdWx0IDo9IG1lc3NhZ2U7CiBlbmQ7CiAKIHByb2NlZHVyZSBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRNZXNzYWdlRW5kOwpAQCAtMTA2OSwxNCArODE2LDEwIEBACiAKIGVuZDsKIAotZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sSW1wbC5SZWFkU2V0QmVnaW46IElTZXQ7Ci12YXIKLSAgc2V0XyA6IElTZXQ7CitmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRTZXRCZWdpbjogVFRocmlmdFNldDsKIGJlZ2luCi0gIHNldF8gOj0gVFNldEltcGwuQ3JlYXRlOwotICBzZXRfLkVsZW1lbnRUeXBlIDo9IFRUeXBlKCBSZWFkQnl0ZSApOwotICBzZXRfLkNvdW50IDo9IFJlYWRJMzI7Ci0gIFJlc3VsdCA6PSBzZXRfOworICByZXN1bHQuRWxlbWVudFR5cGUgOj0gVFR5cGUoUmVhZEJ5dGUpOworICByZXN1bHQuQ291bnQgICAgICAgOj0gUmVhZEkzMjsKIGVuZDsKIAogcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuUmVhZFNldEVuZDsKQEAgLTEwOTMsOSArODM2LDkgQEAKICAgUmVzdWx0IDo9IFRFbmNvZGluZy5VVEY4LkdldFN0cmluZyggYnVmKTsKIGVuZDsKIAotZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sSW1wbC5SZWFkU3RydWN0QmVnaW46IElTdHJ1Y3Q7CitmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRTdHJ1Y3RCZWdpbjogVFRocmlmdFN0cnVjdDsKIGJlZ2luCi0gIFJlc3VsdCA6PSBUU3RydWN0SW1wbC5DcmVhdGUoJycpOworICBJbml0KCBSZXN1bHQpOwogZW5kOwogCiBwcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5SZWFkU3RydWN0RW5kOwpAQCAtMTExNCwyMiArODU3LDE2IEBACiAKIHByb2NlZHVyZSBUQmluYXJ5UHJvdG9jb2xJbXBsLldyaXRlQm9vbChiOiBCb29sZWFuKTsKIGJlZ2luCi0gIGlmIGIgdGhlbgotICBiZWdpbgorICBpZiBiIHRoZW4gYmVnaW4KICAgICBXcml0ZUJ5dGUoIDEgKTsKLSAgZW5kIGVsc2UKLSAgYmVnaW4KKyAgZW5kIGVsc2UgYmVnaW4KICAgICBXcml0ZUJ5dGUoIDAgKTsKICAgZW5kOwogZW5kOwogCiBwcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5Xcml0ZUJ5dGUoYjogU2hvcnRJbnQpOwotdmFyCi0gIGEgOiBUQnl0ZXM7CiBiZWdpbgotICBTZXRMZW5ndGgoIGEsIDEpOwotICBhWzBdIDo9IEJ5dGUoIGIgKTsKLSAgRlRyYW5zLldyaXRlKCBhLCAwLCAxICk7CisgIEZUcmFucy5Xcml0ZSggQGIsIDAsIDEpOwogZW5kOwogCiBwcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5Xcml0ZURvdWJsZSggY29uc3QgZDogRG91YmxlKTsKQEAgLTExMzcsNyArODc0LDcgQEAKICAgV3JpdGVJNjQoQ29udmVydERvdWJsZVRvSW50NjQoZCkpOwogZW5kOwogCi1wcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5Xcml0ZUZpZWxkQmVnaW4oIGNvbnN0IGZpZWxkOiBJRmllbGQpOworcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuV3JpdGVGaWVsZEJlZ2luKCBjb25zdCBmaWVsZDogVFRocmlmdEZpZWxkKTsKIGJlZ2luCiAgIFdyaXRlQnl0ZShTaG9ydEludChmaWVsZC5UeXBlXykpOwogICBXcml0ZUkxNihmaWVsZC5JRCk7CkBAIC0xMTU0LDMyICs4OTEsMjYgQEAKIGVuZDsKIAogcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuV3JpdGVJMTYoaTE2OiBTbWFsbEludCk7Ci12YXIKLSAgaTE2b3V0IDogVEJ5dGVzOwordmFyIGkxNm91dCA6IHBhY2tlZCBhcnJheVswLi4xXSBvZiBCeXRlOwogYmVnaW4KLSAgU2V0TGVuZ3RoKCBpMTZvdXQsIDIpOwogICBpMTZvdXRbMF0gOj0gQnl0ZSgkRkYgYW5kIChpMTYgc2hyIDgpKTsKICAgaTE2b3V0WzFdIDo9IEJ5dGUoJEZGIGFuZCBpMTYpOwotICBGVHJhbnMuV3JpdGUoIGkxNm91dCApOworICBGVHJhbnMuV3JpdGUoIEBpMTZvdXQsIDAsIDIpOwogZW5kOwogCiBwcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5Xcml0ZUkzMihpMzI6IEludGVnZXIpOwotdmFyCi0gIGkzMm91dCA6IFRCeXRlczsKK3ZhciBpMzJvdXQgOiBwYWNrZWQgYXJyYXlbMC4uM10gb2YgQnl0ZTsKIGJlZ2luCi0gIFNldExlbmd0aCggaTMyb3V0LCA0KTsKICAgaTMyb3V0WzBdIDo9IEJ5dGUoJEZGIGFuZCAoaTMyIHNociAyNCkpOwogICBpMzJvdXRbMV0gOj0gQnl0ZSgkRkYgYW5kIChpMzIgc2hyIDE2KSk7CiAgIGkzMm91dFsyXSA6PSBCeXRlKCRGRiBhbmQgKGkzMiBzaHIgOCkpOwogICBpMzJvdXRbM10gOj0gQnl0ZSgkRkYgYW5kIGkzMik7Ci0gIEZUcmFucy5Xcml0ZSggaTMyb3V0LCAwLCA0KTsKKyAgRlRyYW5zLldyaXRlKCBAaTMyb3V0LCAwLCA0KTsKIGVuZDsKIAogcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuV3JpdGVJNjQoIGNvbnN0IGk2NDogSW50NjQpOwotdmFyCi0gIGk2NG91dCA6IFRCeXRlczsKK3ZhciBpNjRvdXQgOiBwYWNrZWQgYXJyYXlbMC4uN10gb2YgQnl0ZTsKIGJlZ2luCi0gIFNldExlbmd0aCggaTY0b3V0LCA4KTsKICAgaTY0b3V0WzBdIDo9IEJ5dGUoJEZGIGFuZCAoaTY0IHNociA1NikpOwogICBpNjRvdXRbMV0gOj0gQnl0ZSgkRkYgYW5kIChpNjQgc2hyIDQ4KSk7CiAgIGk2NG91dFsyXSA6PSBCeXRlKCRGRiBhbmQgKGk2NCBzaHIgNDApKTsKQEAgLTExODgsMTAgKzkxOSwxMCBAQAogICBpNjRvdXRbNV0gOj0gQnl0ZSgkRkYgYW5kIChpNjQgc2hyIDE2KSk7CiAgIGk2NG91dFs2XSA6PSBCeXRlKCRGRiBhbmQgKGk2NCBzaHIgOCkpOwogICBpNjRvdXRbN10gOj0gQnl0ZSgkRkYgYW5kIGk2NCk7Ci0gIEZUcmFucy5Xcml0ZSggaTY0b3V0LCAwLCA4KTsKKyAgRlRyYW5zLldyaXRlKCBAaTY0b3V0LCAwLCA4KTsKIGVuZDsKIAotcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuV3JpdGVMaXN0QmVnaW4oIGNvbnN0IGxpc3Q6IElMaXN0KTsKK3Byb2NlZHVyZSBUQmluYXJ5UHJvdG9jb2xJbXBsLldyaXRlTGlzdEJlZ2luKCBjb25zdCBsaXN0OiBUVGhyaWZ0TGlzdCk7CiBiZWdpbgogICBXcml0ZUJ5dGUoU2hvcnRJbnQobGlzdC5FbGVtZW50VHlwZSkpOwogICBXcml0ZUkzMihsaXN0LkNvdW50KTsKQEAgLTEyMDIsNyArOTMzLDcgQEAKIAogZW5kOwogCi1wcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5Xcml0ZU1hcEJlZ2luKCBjb25zdCBtYXA6IElNYXApOworcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuV3JpdGVNYXBCZWdpbiggY29uc3QgbWFwOiBUVGhyaWZ0TWFwKTsKIGJlZ2luCiAgIFdyaXRlQnl0ZShTaG9ydEludChtYXAuS2V5VHlwZSkpOwogICBXcml0ZUJ5dGUoU2hvcnRJbnQobWFwLlZhbHVlVHlwZSkpOwpAQCAtMTIxNCw3ICs5NDUsNyBAQAogCiBlbmQ7CiAKLXByb2NlZHVyZSBUQmluYXJ5UHJvdG9jb2xJbXBsLldyaXRlTWVzc2FnZUJlZ2luKCBjb25zdCBtc2c6IElNZXNzYWdlKTsKK3Byb2NlZHVyZSBUQmluYXJ5UHJvdG9jb2xJbXBsLldyaXRlTWVzc2FnZUJlZ2luKCBjb25zdCBtc2c6IFRUaHJpZnRNZXNzYWdlKTsKIHZhcgogICB2ZXJzaW9uIDogQ2FyZGluYWw7CiBiZWdpbgpAQCAtMTIzNyw3ICs5NjgsNyBAQAogCiBlbmQ7CiAKLXByb2NlZHVyZSBUQmluYXJ5UHJvdG9jb2xJbXBsLldyaXRlU2V0QmVnaW4oIGNvbnN0IHNldF86IElTZXQpOworcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuV3JpdGVTZXRCZWdpbiggY29uc3Qgc2V0XzogVFRocmlmdFNldCk7CiBiZWdpbgogICBXcml0ZUJ5dGUoU2hvcnRJbnQoc2V0Xy5FbGVtZW50VHlwZSkpOwogICBXcml0ZUkzMihzZXRfLkNvdW50KTsKQEAgLTEyNDgsNyArOTc5LDcgQEAKIAogZW5kOwogCi1wcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5Xcml0ZVN0cnVjdEJlZ2luKCBjb25zdCBzdHJ1YzogSVN0cnVjdCk7Citwcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5Xcml0ZVN0cnVjdEJlZ2luKCBjb25zdCBzdHJ1YzogVFRocmlmdFN0cnVjdCk7CiBiZWdpbgogCiBlbmQ7CkBAIC0xMjYwLDIyICs5OTEsNDcgQEAKIAogeyBUUHJvdG9jb2xFeGNlcHRpb24gfQogCi1jb25zdHJ1Y3RvciBUUHJvdG9jb2xFeGNlcHRpb24uQ3JlYXRlOworY29uc3RydWN0b3IgVFByb3RvY29sRXhjZXB0aW9uLkhpZGRlbkNyZWF0ZShjb25zdCBNc2c6IHN0cmluZyk7CiBiZWdpbgotICBpbmhlcml0ZWQgQ3JlYXRlKCcnKTsKLSAgRlR5cGUgOj0gVU5LTk9XTjsKKyAgaW5oZXJpdGVkIENyZWF0ZShNc2cpOwogZW5kOwogCi1jb25zdHJ1Y3RvciBUUHJvdG9jb2xFeGNlcHRpb24uQ3JlYXRlKHR5cGVfOiBJbnRlZ2VyKTsKK2NsYXNzIGZ1bmN0aW9uIFRQcm90b2NvbEV4Y2VwdGlvbi5DcmVhdGUoY29uc3QgTXNnOiBzdHJpbmcpOiBUUHJvdG9jb2xFeGNlcHRpb247CiBiZWdpbgotICBpbmhlcml0ZWQgQ3JlYXRlKCcnKTsKLSAgRlR5cGUgOj0gdHlwZV87CisgIFJlc3VsdCA6PSBUUHJvdG9jb2xFeGNlcHRpb25Vbmtub3duLkNyZWF0ZShNc2cpOwogZW5kOwogCi1jb25zdHJ1Y3RvciBUUHJvdG9jb2xFeGNlcHRpb24uQ3JlYXRlKHR5cGVfOiBJbnRlZ2VyOyBjb25zdCBtc2c6IHN0cmluZyk7CitjbGFzcyBmdW5jdGlvbiBUUHJvdG9jb2xFeGNlcHRpb24uQ3JlYXRlOiBUUHJvdG9jb2xFeGNlcHRpb247CiBiZWdpbgotICBpbmhlcml0ZWQgQ3JlYXRlKCBtc2cgKTsKLSAgRlR5cGUgOj0gdHlwZV87CisgIFJlc3VsdCA6PSBUUHJvdG9jb2xFeGNlcHRpb25Vbmtub3duLkNyZWF0ZSgnJyk7CitlbmQ7CisKK2NsYXNzIGZ1bmN0aW9uIFRQcm90b2NvbEV4Y2VwdGlvbi5DcmVhdGUodHlwZV86IEludGVnZXIpOiBUUHJvdG9jb2xFeGNlcHRpb247CitiZWdpbgoreyRXQVJOIFNZTUJPTF9ERVBSRUNBVEVEIE9GRn0KKyAgUmVzdWx0IDo9IENyZWF0ZSh0eXBlXywgJycpOworeyRXQVJOIFNZTUJPTF9ERVBSRUNBVEVEIERFRkFVTFR9CitlbmQ7CisKK2NsYXNzIGZ1bmN0aW9uIFRQcm90b2NvbEV4Y2VwdGlvbi5DcmVhdGUodHlwZV86IEludGVnZXI7IGNvbnN0IG1zZzogc3RyaW5nKTogVFByb3RvY29sRXhjZXB0aW9uOworYmVnaW4KKyAgY2FzZSB0eXBlXyBvZgorICAgIElOVkFMSURfREFUQTogICAgUmVzdWx0IDo9IFRQcm90b2NvbEV4Y2VwdGlvbkludmFsaWREYXRhLkNyZWF0ZShtc2cpOworICAgIE5FR0FUSVZFX1NJWkU6ICAgUmVzdWx0IDo9IFRQcm90b2NvbEV4Y2VwdGlvbk5lZ2F0aXZlU2l6ZS5DcmVhdGUobXNnKTsKKyAgICBTSVpFX0xJTUlUOiAgICAgIFJlc3VsdCA6PSBUUHJvdG9jb2xFeGNlcHRpb25TaXplTGltaXQuQ3JlYXRlKG1zZyk7CisgICAgQkFEX1ZFUlNJT046ICAgICBSZXN1bHQgOj0gVFByb3RvY29sRXhjZXB0aW9uQmFkVmVyc2lvbi5DcmVhdGUobXNnKTsKKyAgICBOT1RfSU1QTEVNRU5URUQ6IFJlc3VsdCA6PSBUUHJvdG9jb2xFeGNlcHRpb25Ob3RJbXBsZW1lbnRlZC5DcmVhdGUobXNnKTsKKyAgICBERVBUSF9MSU1JVDogICAgIFJlc3VsdCA6PSBUUHJvdG9jb2xFeGNlcHRpb25EZXB0aExpbWl0LkNyZWF0ZShtc2cpOworICBlbHNlCisgICAgUmVzdWx0IDo9IFRQcm90b2NvbEV4Y2VwdGlvblVua25vd24uQ3JlYXRlKG1zZyk7CisgIGVuZDsKK2VuZDsKKworeyBUUHJvdG9jb2xFeGNlcHRpb25TcGVjaWFsaXplZCB9CisKK2NvbnN0cnVjdG9yIFRQcm90b2NvbEV4Y2VwdGlvblNwZWNpYWxpemVkLkNyZWF0ZShjb25zdCBNc2c6IHN0cmluZyk7CitiZWdpbgorICBpbmhlcml0ZWQgSGlkZGVuQ3JlYXRlKE1zZyk7CiBlbmQ7CiAKIHsgVFRocmlmdFN0cmluZ0J1aWxkZXIgfQpAQCAtMTMyMiw3ICsxMDc4LDcgQEAKIGVuZDsKIAogCi1wcm9jZWR1cmUgVFByb3RvY29sRGVjb3JhdG9yLldyaXRlTWVzc2FnZUJlZ2luKCBjb25zdCBtc2c6IElNZXNzYWdlKTsKK3Byb2NlZHVyZSBUUHJvdG9jb2xEZWNvcmF0b3IuV3JpdGVNZXNzYWdlQmVnaW4oIGNvbnN0IG1zZzogVFRocmlmdE1lc3NhZ2UpOwogYmVnaW4KICAgRldyYXBwZWRQcm90b2NvbC5Xcml0ZU1lc3NhZ2VCZWdpbiggbXNnKTsKIGVuZDsKQEAgLTEzMzQsNyArMTA5MCw3IEBACiBlbmQ7CiAKIAotcHJvY2VkdXJlIFRQcm90b2NvbERlY29yYXRvci5Xcml0ZVN0cnVjdEJlZ2luKCBjb25zdCBzdHJ1YzogSVN0cnVjdCk7Citwcm9jZWR1cmUgVFByb3RvY29sRGVjb3JhdG9yLldyaXRlU3RydWN0QmVnaW4oIGNvbnN0IHN0cnVjOiBUVGhyaWZ0U3RydWN0KTsKIGJlZ2luCiAgIEZXcmFwcGVkUHJvdG9jb2wuV3JpdGVTdHJ1Y3RCZWdpbiggc3RydWMpOwogZW5kOwpAQCAtMTM0Niw3ICsxMTAyLDcgQEAKIGVuZDsKIAogCi1wcm9jZWR1cmUgVFByb3RvY29sRGVjb3JhdG9yLldyaXRlRmllbGRCZWdpbiggY29uc3QgZmllbGQ6IElGaWVsZCk7Citwcm9jZWR1cmUgVFByb3RvY29sRGVjb3JhdG9yLldyaXRlRmllbGRCZWdpbiggY29uc3QgZmllbGQ6IFRUaHJpZnRGaWVsZCk7CiBiZWdpbgogICBGV3JhcHBlZFByb3RvY29sLldyaXRlRmllbGRCZWdpbiggZmllbGQpOwogZW5kOwpAQCAtMTM2NCw3ICsxMTIwLDcgQEAKIGVuZDsKIAogCi1wcm9jZWR1cmUgVFByb3RvY29sRGVjb3JhdG9yLldyaXRlTWFwQmVnaW4oIGNvbnN0IG1hcDogSU1hcCk7Citwcm9jZWR1cmUgVFByb3RvY29sRGVjb3JhdG9yLldyaXRlTWFwQmVnaW4oIGNvbnN0IG1hcDogVFRocmlmdE1hcCk7CiBiZWdpbgogICBGV3JhcHBlZFByb3RvY29sLldyaXRlTWFwQmVnaW4oIG1hcCk7CiBlbmQ7CkBAIC0xMzc2LDcgKzExMzIsNyBAQAogZW5kOwogCiAKLXByb2NlZHVyZSBUUHJvdG9jb2xEZWNvcmF0b3IuV3JpdGVMaXN0QmVnaW4oIGNvbnN0IGxpc3Q6IElMaXN0KTsKK3Byb2NlZHVyZSBUUHJvdG9jb2xEZWNvcmF0b3IuV3JpdGVMaXN0QmVnaW4oIGNvbnN0IGxpc3Q6IFRUaHJpZnRMaXN0KTsKIGJlZ2luCiAgIEZXcmFwcGVkUHJvdG9jb2wuV3JpdGVMaXN0QmVnaW4oIGxpc3QpOwogZW5kOwpAQCAtMTM4OCw3ICsxMTQ0LDcgQEAKIGVuZDsKIAogCi1wcm9jZWR1cmUgVFByb3RvY29sRGVjb3JhdG9yLldyaXRlU2V0QmVnaW4oIGNvbnN0IHNldF86IElTZXQgKTsKK3Byb2NlZHVyZSBUUHJvdG9jb2xEZWNvcmF0b3IuV3JpdGVTZXRCZWdpbiggY29uc3Qgc2V0XzogVFRocmlmdFNldCApOwogYmVnaW4KICAgRldyYXBwZWRQcm90b2NvbC5Xcml0ZVNldEJlZ2luKCBzZXRfKTsKIGVuZDsKQEAgLTE0NTQsNyArMTIxMCw3IEBACiBlbmQ7CiAKIAotZnVuY3Rpb24gVFByb3RvY29sRGVjb3JhdG9yLlJlYWRNZXNzYWdlQmVnaW46IElNZXNzYWdlOworZnVuY3Rpb24gVFByb3RvY29sRGVjb3JhdG9yLlJlYWRNZXNzYWdlQmVnaW46IFRUaHJpZnRNZXNzYWdlOwogYmVnaW4KICAgcmVzdWx0IDo9IEZXcmFwcGVkUHJvdG9jb2wuUmVhZE1lc3NhZ2VCZWdpbjsKIGVuZDsKQEAgLTE0NjYsNyArMTIyMiw3IEBACiBlbmQ7CiAKIAotZnVuY3Rpb24gVFByb3RvY29sRGVjb3JhdG9yLlJlYWRTdHJ1Y3RCZWdpbjogSVN0cnVjdDsKK2Z1bmN0aW9uIFRQcm90b2NvbERlY29yYXRvci5SZWFkU3RydWN0QmVnaW46IFRUaHJpZnRTdHJ1Y3Q7CiBiZWdpbgogICByZXN1bHQgOj0gRldyYXBwZWRQcm90b2NvbC5SZWFkU3RydWN0QmVnaW47CiBlbmQ7CkBAIC0xNDc4LDcgKzEyMzQsNyBAQAogZW5kOwogCiAKLWZ1bmN0aW9uIFRQcm90b2NvbERlY29yYXRvci5SZWFkRmllbGRCZWdpbjogSUZpZWxkOworZnVuY3Rpb24gVFByb3RvY29sRGVjb3JhdG9yLlJlYWRGaWVsZEJlZ2luOiBUVGhyaWZ0RmllbGQ7CiBiZWdpbgogICByZXN1bHQgOj0gRldyYXBwZWRQcm90b2NvbC5SZWFkRmllbGRCZWdpbjsKIGVuZDsKQEAgLTE0OTAsNyArMTI0Niw3IEBACiBlbmQ7CiAKIAotZnVuY3Rpb24gVFByb3RvY29sRGVjb3JhdG9yLlJlYWRNYXBCZWdpbjogSU1hcDsKK2Z1bmN0aW9uIFRQcm90b2NvbERlY29yYXRvci5SZWFkTWFwQmVnaW46IFRUaHJpZnRNYXA7CiBiZWdpbgogICByZXN1bHQgOj0gRldyYXBwZWRQcm90b2NvbC5SZWFkTWFwQmVnaW47CiBlbmQ7CkBAIC0xNTAyLDcgKzEyNTgsNyBAQAogZW5kOwogCiAKLWZ1bmN0aW9uIFRQcm90b2NvbERlY29yYXRvci5SZWFkTGlzdEJlZ2luOiBJTGlzdDsKK2Z1bmN0aW9uIFRQcm90b2NvbERlY29yYXRvci5SZWFkTGlzdEJlZ2luOiBUVGhyaWZ0TGlzdDsKIGJlZ2luCiAgIHJlc3VsdCA6PSBGV3JhcHBlZFByb3RvY29sLlJlYWRMaXN0QmVnaW47CiBlbmQ7CkBAIC0xNTE0LDcgKzEyNzAsNyBAQAogZW5kOwogCiAKLWZ1bmN0aW9uIFRQcm90b2NvbERlY29yYXRvci5SZWFkU2V0QmVnaW46IElTZXQ7CitmdW5jdGlvbiBUUHJvdG9jb2xEZWNvcmF0b3IuUmVhZFNldEJlZ2luOiBUVGhyaWZ0U2V0OwogYmVnaW4KICAgcmVzdWx0IDo9IEZXcmFwcGVkUHJvdG9jb2wuUmVhZFNldEJlZ2luOwogZW5kOwpAQCAtMTU4MCw2ICsxMzM2LDU0IEBACiBlbmQ7CiAKIAoreyBJbml0IGhlbHBlciBmdW5jdGlvbnMgfQorCitwcm9jZWR1cmUgSW5pdCggdmFyIHJlYyA6IFRUaHJpZnRNZXNzYWdlOyBjb25zdCBBTmFtZTogc3RyaW5nOyBjb25zdCBBTWVzc2FnZVR5cGU6IFRNZXNzYWdlVHlwZTsgY29uc3QgQVNlcUlEOiBJbnRlZ2VyKTsKK2JlZ2luCisgIHJlYy5OYW1lIDo9IEFOYW1lOworICByZWMuVHlwZV8gOj0gQU1lc3NhZ2VUeXBlOworICByZWMuU2VxSUQgOj0gQVNlcUlEOworZW5kOworCisKK3Byb2NlZHVyZSBJbml0KCB2YXIgcmVjIDogVFRocmlmdFN0cnVjdDsgY29uc3QgQU5hbWU6IHN0cmluZyA9ICcnKTsKK2JlZ2luCisgIHJlYy5OYW1lIDo9IEFOYW1lOworZW5kOworCisKK3Byb2NlZHVyZSBJbml0KCB2YXIgcmVjIDogVFRocmlmdEZpZWxkOyBjb25zdCBBTmFtZTogc3RyaW5nOyBjb25zdCBBVHlwZTogVFR5cGU7IGNvbnN0IEFJRDogU21hbGxJbnQpOworYmVnaW4KKyAgcmVjLk5hbWUgOj0gQU5hbWU7CisgIHJlYy5UeXBlXyA6PSBBVHlwZTsKKyAgcmVjLklkIDo9IEFJZDsKK2VuZDsKKworCitwcm9jZWR1cmUgSW5pdCggdmFyIHJlYyA6IFRUaHJpZnRNYXA7IGNvbnN0IEFLZXlUeXBlLCBBVmFsdWVUeXBlOiBUVHlwZTsgY29uc3QgQUNvdW50OiBJbnRlZ2VyKTsKK2JlZ2luCisgIHJlYy5WYWx1ZVR5cGUgOj0gQVZhbHVlVHlwZTsKKyAgcmVjLktleVR5cGUgOj0gQUtleVR5cGU7CisgIHJlYy5Db3VudCA6PSBBQ291bnQ7CitlbmQ7CisKKworcHJvY2VkdXJlIEluaXQoIHZhciByZWMgOiBUVGhyaWZ0U2V0OyBjb25zdCBBRWxlbWVudFR5cGU6IFRUeXBlOyBjb25zdCBBQ291bnQ6IEludGVnZXIpOworYmVnaW4KKyAgcmVjLkNvdW50IDo9IEFDb3VudDsKKyAgcmVjLkVsZW1lbnRUeXBlIDo9IEFFbGVtZW50VHlwZTsKK2VuZDsKKworCitwcm9jZWR1cmUgSW5pdCggdmFyIHJlYyA6IFRUaHJpZnRMaXN0OyBjb25zdCBBRWxlbWVudFR5cGU6IFRUeXBlOyBjb25zdCBBQ291bnQ6IEludGVnZXIpOworYmVnaW4KKyAgcmVjLkNvdW50IDo9IEFDb3VudDsKKyAgcmVjLkVsZW1lbnRUeXBlIDo9IEFFbGVtZW50VHlwZTsKK2VuZDsKKworCisKKwogCiBlbmQuCiAKZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5TZXJpYWxpemVyLnBhcyBiL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5TZXJpYWxpemVyLnBhcwppbmRleCBjZjY0NmM4Li41ZjI5MDVhIDEwMDY0NAotLS0gYS9saWIvZGVscGhpL3NyYy9UaHJpZnQuU2VyaWFsaXplci5wYXMKKysrIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlNlcmlhbGl6ZXIucGFzCkBAIC0xOCwxMCArMTgsMTYgQEAKICAqKQogdW5pdCBUaHJpZnQuU2VyaWFsaXplcjsKIAoreyRJIFRocmlmdC5EZWZpbmVzLmluY30KKwogaW50ZXJmYWNlCiAKIHVzZXMKKyAgeyRJRkRFRiBPTERfVU5JVF9OQU1FU30KICAgQ2xhc3NlcywgV2luZG93cywgU3lzVXRpbHMsCisgIHskRUxTRX0KKyAgU3lzdGVtLkNsYXNzZXMsIFdpbmFwaS5XaW5kb3dzLCBTeXN0ZW0uU3lzVXRpbHMsCisgIHskRU5ESUZ9CiAgIFRocmlmdC5Qcm90b2NvbCwKICAgVGhyaWZ0LlRyYW5zcG9ydCwKICAgVGhyaWZ0LlN0cmVhbTsKZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5TZXJ2ZXIucGFzIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlNlcnZlci5wYXMKaW5kZXggMjkzNTc0Ny4uMTNjNTc2MiAxMDA2NDQKLS0tIGEvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlNlcnZlci5wYXMKKysrIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlNlcnZlci5wYXMKQEAgLTE5LDEyICsxOSwxNyBAQAogCiAgdW5pdCBUaHJpZnQuU2VydmVyOwogCit7JEkgVGhyaWZ0LkRlZmluZXMuaW5jfQogeyRJLX0gIC8vIHByZXZlbnQgYW5ub3lpbmcgZXJyb3JzIHdpdGggZGVmYXVsdCBsb2cgZGVsZWdhdGUgYW5kIG5vIGNvbnNvbGUKIAogaW50ZXJmYWNlCiAKIHVzZXMKKyAgeyRJRkRFRiBPTERfVU5JVF9OQU1FU30KICAgV2luZG93cywgU3lzVXRpbHMsCisgIHskRUxTRX0KKyAgV2luYXBpLldpbmRvd3MsIFN5c3RlbS5TeXNVdGlscywKKyAgeyRFTkRJRn0KICAgVGhyaWZ0LAogICBUaHJpZnQuUHJvdG9jb2wsCiAgIFRocmlmdC5UcmFuc3BvcnQ7CkBAIC0zNDUsNyArMzUwLDcgQEAKICAgICAgIGlmIGNsaWVudCA9IG5pbCB0aGVuIGJlZ2luCiAgICAgICAgIGlmIEZTdG9wCiAgICAgICAgIHRoZW4gQWJvcnQgIC8vIHNpbGVudCBleGNlcHRpb24KLSAgICAgICAgZWxzZSByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uLkNyZWF0ZSggJ1NlcnZlclRyYW5zcG9ydC5BY2NlcHQoKSBtYXkgbm90IHJldHVybiBOVUxMJyApOworICAgICAgICBlbHNlIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Vbmtub3duLkNyZWF0ZSgnU2VydmVyVHJhbnNwb3J0LkFjY2VwdCgpIG1heSBub3QgcmV0dXJuIE5VTEwnKTsKICAgICAgIGVuZDsKIAogICAgICAgRkxvZ0RlbGVnYXRlKCAnQ2xpZW50IENvbm5lY3RlZCEnKTsKZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5Tb2NrZXQucGFzIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlNvY2tldC5wYXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBjYWI3OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5Tb2NrZXQucGFzCkBAIC0wLDAgKzEsMTYxNyBAQAorKCoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqKQorCit1bml0IFRocmlmdC5Tb2NrZXQ7CisKK3skSSBUaHJpZnQuRGVmaW5lcy5pbmN9Cit7JEktfSAgLy8gcHJldmVudCBhbm5veWluZyBlcnJvcnMgd2l0aCBkZWZhdWx0IGxvZyBkZWxlZ2F0ZSBhbmQgbm8gY29uc29sZQorCitpbnRlcmZhY2UKK3skSUZOREVGIE9MRF9TT0NLRVRTfSAvLyBub3QgZm9yIE9MRF9TT0NLRVRTCisKK3VzZXMKKyAgV2luYXBpLldpbmRvd3MsIFdpbmFwaS5XaW5zb2NrMjsKKworY29uc3QKKyAgQUlfUEFTU0lWRSAgICAgICAgICAgICAgICA9ICQwMDAwMDAwMTsgIC8vIFNvY2tldCBhZGRyZXNzIHdpbGwgYmUgdXNlZCBpbiBiaW5kKCkgY2FsbAorICBBSV9DQU5PTk5BTUUgICAgICAgICAgICAgID0gJDAwMDAwMDAyOyAgLy8gUmV0dXJuIGNhbm9uaWNhbCBuYW1lIGluIGZpcnN0IGFpX2Nhbm9ubmFtZQorICBBSV9OVU1FUklDSE9TVCAgICAgICAgICAgID0gJDAwMDAwMDA0OyAgLy8gTm9kZW5hbWUgbXVzdCBiZSBhIG51bWVyaWMgYWRkcmVzcyBzdHJpbmcKKyAgQUlfTlVNRVJJQ1NFUlYgICAgICAgICAgICA9ICQwMDAwMDAwODsgIC8vIFNlcnZpY2VuYW1lIG11c3QgYmUgYSBudW1lcmljIHBvcnQgbnVtYmVyCisKKyAgQUlfQUxMICAgICAgICAgICAgICAgICAgICA9ICQwMDAwMDEwMDsgIC8vIFF1ZXJ5IGJvdGggSVA2IGFuZCBJUDQgd2l0aCBBSV9WNE1BUFBFRAorICBBSV9BRERSQ09ORklHICAgICAgICAgICAgID0gJDAwMDAwNDAwOyAgLy8gUmVzb2x1dGlvbiBvbmx5IGlmIGdsb2JhbCBhZGRyZXNzIGNvbmZpZ3VyZWQKKyAgQUlfVjRNQVBQRUQgICAgICAgICAgICAgICA9ICQwMDAwMDgwMDsgIC8vIE9uIHY2IGZhaWx1cmUsIHF1ZXJ5IHY0IGFuZCBjb252ZXJ0IHRvIFY0TUFQUEVEIGZvcm1hdAorCisgIEFJX05PTl9BVVRIT1JJVEFUSVZFICAgICAgPSAkMDAwMDQwMDA7ICAvLyBMVVBfTk9OX0FVVEhPUklUQVRJVkUKKyAgQUlfU0VDVVJFICAgICAgICAgICAgICAgICA9ICQwMDAwODAwMDsgIC8vIExVUF9TRUNVUkUKKyAgQUlfUkVUVVJOX1BSRUZFUlJFRF9OQU1FUyA9ICQwMDAxMDAwMDsgIC8vIExVUF9SRVRVUk5fUFJFRkVSUkVEX05BTUVTCisKKyAgQUlfRlFETiAgICAgICAgICAgICAgICAgICA9ICQwMDAyMDAwMDsgIC8vIFJldHVybiB0aGUgRlFETiBpbiBhaV9jYW5vbm5hbWUKKyAgQUlfRklMRVNFUlZFUiAgICAgICAgICAgICA9ICQwMDA0MDAwMDsgIC8vIFJlc29sdmluZyBmaWxlc2VydmVyIG5hbWUgcmVzb2x1dGlvbgorCit0eXBlCisgIFBBZGRySW5mb0EgPSBeVEFkZHJJbmZvQTsKKyAgVEFkZHJJbmZvQSA9IHJlY29yZAorICAgIGFpX2ZsYWdzOiBJbnRlZ2VyOworICAgIGFpX2ZhbWlseTogSW50ZWdlcjsKKyAgICBhaV9zb2NrdHlwZTogSW50ZWdlcjsKKyAgICBhaV9wcm90b2NvbDogSW50ZWdlcjsKKyAgICBhaV9hZGRybGVuOiBOYXRpdmVVSW50OworICAgIGFpX2Nhbm9ubmFtZTogUEFuc2lDaGFyOworICAgIGFpX2FkZHI6IFBTb2NrQWRkcjsKKyAgICBhaV9uZXh0OiBQQWRkckluZm9BOworICBlbmQ7CisKKyAgUEFkZHJJbmZvVyA9IF5UQWRkckluZm9XOworICBUQWRkckluZm9XID0gcmVjb3JkCisgICAgYWlfZmxhZ3M6IEludGVnZXI7CisgICAgYWlfZmFtaWx5OiBJbnRlZ2VyOworICAgIGFpX3NvY2t0eXBlOiBJbnRlZ2VyOworICAgIGFpX3Byb3RvY29sOiBJbnRlZ2VyOworICAgIGFpX2FkZHJsZW46IE5hdGl2ZVVJbnQ7CisgICAgYWlfY2Fub25uYW1lOiBQQ2hhcjsKKyAgICBhaV9hZGRyOiBQU29ja0FkZHI7CisgICAgYWlfbmV4dDogUEFkZHJJbmZvVzsKKyAgZW5kOworCisgIFRBZGRyZXNzRmFtaWx5ID0gVVNIT1JUOworCisgIFRJbjZBZGRyID0gcmVjb3JkCisgIGNhc2UgSW50ZWdlciBvZgorICAgIDA6IChfQnl0ZTogYXJyYXlbMC4uMTVdIG9mIFVDSEFSKTsKKyAgICAxOiAoX1dvcmQ6IGFycmF5WzAuLjddIG9mIFVTSE9SVCk7CisgIGVuZDsKKworICBUU2NvcGVJZCA9IHJlY29yZAorICBwdWJsaWMKKyAgICBWYWx1ZTogVUxPTkc7CisgIHByaXZhdGUKKyAgICBmdW5jdGlvbiBHZXRCaXRGaWVsZChMb2M6IEludGVnZXIpOiBJbnRlZ2VyOyBpbmxpbmU7CisgICAgcHJvY2VkdXJlIFNldEJpdEZpZWxkKExvYzogSW50ZWdlcjsgY29uc3QgYVZhbHVlOiBJbnRlZ2VyKTsgaW5saW5lOworICBwdWJsaWMKKyAgICBwcm9wZXJ0eSBab25lOiBJbnRlZ2VyIGluZGV4ICQwMDI4IHJlYWQgR2V0Qml0RmllbGQgd3JpdGUgU2V0Qml0RmllbGQ7CisgICAgcHJvcGVydHkgTGV2ZWw6IEludGVnZXIgaW5kZXggJDI4MDQgcmVhZCBHZXRCaXRGaWVsZCB3cml0ZSBTZXRCaXRGaWVsZDsKKyAgZW5kOworCisgIFRTb2NrQWRkckluNiA9IHJlY29yZAorICAgIHNpbjZfZmFtaWx5OiBUQWRkcmVzc0ZhbWlseTsKKyAgICBzaW42X3BvcnQ6IFVTSE9SVDsKKyAgICBzaW42X2Zsb3dpbmZvOiBVTE9ORzsKKyAgICBzaW42X2FkZHI6IFRJbjZBZGRyOworICBjYXNlIEludGVnZXIgb2YKKyAgICAwOiAoc2luNl9zY29wZV9pZDogVUxPTkcpOworICAgIDE6IChzaW42X3Njb3BlX3N0cnVjdDogVFNjb3BlSWQpOworICBlbmQ7CisgIFBTb2NrQWRkckluNiA9IF5UU29ja0FkZHJJbjY7CisKK2NvbnN0CisgIE5JX05PRlFETiAgICAgID0gJDAxOyAgLy8gT25seSByZXR1cm4gbm9kZW5hbWUgcG9ydGlvbiBmb3IgbG9jYWwgaG9zdHMKKyAgTklfTlVNRVJJQ0hPU1QgPSAkMDI7ICAvLyBSZXR1cm4gbnVtZXJpYyBmb3JtIG9mIHRoZSBob3N0J3MgYWRkcmVzcworICBOSV9OQU1FUkVRRCAgICA9ICQwNDsgIC8vIEVycm9yIGlmIHRoZSBob3N0J3MgbmFtZSBub3QgaW4gRE5TCisgIE5JX05VTUVSSUNTRVJWID0gJDA4OyAgLy8gUmV0dXJuIG51bWVyaWMgZm9ybSBvZiB0aGUgc2VydmljZSAocG9ydCAjKQorICBOSV9ER1JBTSAgICAgICA9ICQxMDsgIC8vIFNlcnZpY2UgaXMgYSBkYXRhZ3JhbSBzZXJ2aWNlCisKKyAgTklfTUFYSE9TVCAgICAgPSAxMDI1OyAgLy8gTWF4IHNpemUgb2YgYSBmdWxseS1xdWFsaWZpZWQgZG9tYWluIG5hbWUKKyAgTklfTUFYU0VSViAgICAgPSAzMjsgICAgLy8gTWF4IHNpemUgb2YgYSBzZXJ2aWNlIG5hbWUKKworZnVuY3Rpb24gZ2V0YWRkcmluZm8ocE5vZGVOYW1lLCBwU2VydmljZU5hbWU6IFBBbnNpQ2hhcjsgY29uc3QgcEhpbnRzOiBUQWRkckluZm9BOyB2YXIgcHBSZXN1bHQ6IFBBZGRySW5mb0EpOiBJbnRlZ2VyOyBzdGRjYWxsOworZnVuY3Rpb24gR2V0QWRkckluZm9XKHBOb2RlTmFtZSwgcFNlcnZpY2VOYW1lOiBQV2lkZUNoYXI7IGNvbnN0IHBIaW50czogVEFkZHJJbmZvVzsgdmFyIHBwUmVzdWx0OiBQQWRkckluZm9XKTogSW50ZWdlcjsgc3RkY2FsbDsKK3Byb2NlZHVyZSBmcmVlYWRkcmluZm8ocEFkZHJJbmZvOiBQQWRkckluZm9BKTsgc3RkY2FsbDsKK3Byb2NlZHVyZSBGcmVlQWRkckluZm9XKHBBZGRySW5mbzogUEFkZHJJbmZvVyk7IHN0ZGNhbGw7CitmdW5jdGlvbiBnZXRuYW1laW5mbyhjb25zdCBwU29ja2FkZHI6IFRTb2NrQWRkcjsgU29ja2FkZHJMZW5ndGg6IEludGVnZXI7IHBOb2RlQnVmZmVyOiBQQW5zaUNoYXI7IE5vZGVCdWZmZXJTaXplOiBEV09SRDsgcFNlcnZpY2VCdWZmZXI6IFBBbnNpQ2hhcjsKKyAgU2VydmljZUJ1ZmZlclNpemU6IERXT1JEOyBGbGFnczogSW50ZWdlcik6IEludGVnZXI7IHN0ZGNhbGw7CitmdW5jdGlvbiBHZXROYW1lSW5mb1coY29uc3QgcFNvY2thZGRyOiBUU29ja0FkZHI7IFNvY2thZGRyTGVuZ3RoOiBJbnRlZ2VyOyBwTm9kZUJ1ZmZlcjogUFdpZGVDaGFyOyBOb2RlQnVmZmVyU2l6ZTogRFdPUkQ7IHBTZXJ2aWNlQnVmZmVyOiBQV2lkZUNoYXI7CisgIFNlcnZpY2VCdWZmZXJTaXplOiBEV09SRDsgRmxhZ3M6IEludGVnZXIpOiBJbnRlZ2VyOyBzdGRjYWxsOworCit0eXBlCisgIFRTbWFydFBvaW50ZXJEZXN0cm95ZXI8VD4gPSByZWZlcmVuY2UgdG8gcHJvY2VkdXJlKFZhbHVlOiBUKTsKKworICBJU21hcnRQb2ludGVyPFQ+ID0gcmVmZXJlbmNlIHRvIGZ1bmN0aW9uOiBUOworCisgIFRTbWFydFBvaW50ZXI8VD4gPSBjbGFzcyhUSW50ZXJmYWNlZE9iamVjdCwgSVNtYXJ0UG9pbnRlcjxUPikKKyAgcHJpdmF0ZQorICAgIEZWYWx1ZTogVDsKKyAgICBGRGVzdHJveWVyOiBUU21hcnRQb2ludGVyRGVzdHJveWVyPFQ+OworICBwdWJsaWMKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoQVZhbHVlOiBUOyBBRGVzdHJveWVyOiBUU21hcnRQb2ludGVyRGVzdHJveWVyPFQ+KTsKKyAgICBkZXN0cnVjdG9yIERlc3Ryb3k7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIEludm9rZTogVDsKKyAgZW5kOworCisgIFRCYXNlU29ja2V0ID0gY2xhc3MgYWJzdHJhY3QKKyAgcHVibGljIHR5cGUKKyAgICBUTG9nRGVsZWdhdGUgPSByZWZlcmVuY2UgdG8gcHJvY2VkdXJlKCBjb25zdCBzdHI6IHN0cmluZyk7CisgIHN0cmljdCBwcml2YXRlCisgICAgRlBvcnQ6IEludGVnZXI7CisgICAgRlNvY2tldDogV2luYXBpLldpbnNvY2syLlRTb2NrZXQ7CisgICAgRlNlbmRUaW1lb3V0LAorICAgIEZSZWN2VGltZW91dDogTG9uZ3dvcmQ7CisgICAgRktlZXBBbGl2ZTogQm9vbGVhbjsKKyAgICBGTG9nRGVsZWdhdGU6IFRMb2dEZWxlZ2F0ZTsKKyAgICBjbGFzcyBjb25zdHJ1Y3RvciBDcmVhdGU7CisgICAgY2xhc3MgZGVzdHJ1Y3RvciBEZXN0cm95OworICAgIGNsYXNzIHByb2NlZHVyZSBEZWZhdWx0TG9nRGVsZWdhdGUoY29uc3QgU3RyOiBzdHJpbmcpOworICBwcm90ZWN0ZWQgdHlwZQorICAgIElHZXRBZGRySW5mb1dyYXBwZXIgPSBpbnRlcmZhY2UKKyAgICAgIGZ1bmN0aW9uIEluaXQ6IEludGVnZXI7CisgICAgICBmdW5jdGlvbiBHZXRSZXM6IFBBZGRySW5mb1c7CisgICAgICBwcm9wZXJ0eSBSZXM6IFBBZGRySW5mb1cgcmVhZCBHZXRSZXM7CisgICAgZW5kOworICAgIFRHZXRBZGRySW5mb1dyYXBwZXIgPSBjbGFzcyhUSW50ZXJmYWNlZE9iamVjdCwgSUdldEFkZHJJbmZvV3JhcHBlcikKKyAgICBzdHJpY3QgcHJpdmF0ZQorICAgICAgRk5vZGU6IHN0cmluZzsKKyAgICAgIEZTZXJ2aWNlOiBzdHJpbmc7CisgICAgICBGSGludHMsCisgICAgICBGUmVzOiBQQWRkckluZm9XOworICAgIHB1YmxpYworICAgICAgY29uc3RydWN0b3IgQ3JlYXRlKEFOb2RlLCBBU2VydmljZTogc3RyaW5nOyBBSGludHM6IFBBZGRySW5mb1cpOworICAgICAgZGVzdHJ1Y3RvciBEZXN0cm95OyBvdmVycmlkZTsKKyAgICAgIGZ1bmN0aW9uIEluaXQ6IEludGVnZXI7CisgICAgICBmdW5jdGlvbiBHZXRSZXM6IFBBZGRySW5mb1c7CisgICAgICBwcm9wZXJ0eSBSZXM6IFBBZGRySW5mb1cgcmVhZCBHZXRSZXM7CisgICAgZW5kOworICBzdHJpY3QgcHJvdGVjdGVkCisgICAgcHJvY2VkdXJlIENvbW1vbkluaXQ7IHZpcnR1YWw7CisgICAgZnVuY3Rpb24gQ3JlYXRlU29ja2V0KEFBZGRyZXNzOiBzdHJpbmc7IEFQb3J0OiBJbnRlZ2VyKTogSUdldEFkZHJJbmZvV3JhcHBlcjsKKyAgICBwcm9jZWR1cmUgU2V0UmVjdlRpbWVvdXQoQVJlY3ZUaW1lb3V0OiBMb25nd29yZCk7IHZpcnR1YWw7CisgICAgcHJvY2VkdXJlIFNldFNlbmRUaW1lb3V0KEFTZW5kVGltZW91dDogTG9uZ3dvcmQpOyB2aXJ0dWFsOworICAgIHByb2NlZHVyZSBTZXRLZWVwQWxpdmUoQUtlZXBBbGl2ZTogQm9vbGVhbik7IHZpcnR1YWw7CisgICAgcHJvY2VkdXJlIFNldFNvY2tldChBU29ja2V0OiBXaW5hcGkuV2luc29jazIuVFNvY2tldCk7CisgICAgcHJvcGVydHkgTG9nRGVsZWdhdGU6IFRMb2dEZWxlZ2F0ZSByZWFkIEZMb2dEZWxlZ2F0ZTsKKyAgcHVibGljCisgICAgLy8KKyAgICAvLyBDb25zdHJ1Y3RzIGEgbmV3IHNvY2tldC4gTm90ZSB0aGF0IHRoaXMgZG9lcyBOT1QgYWN0dWFsbHkgY29ubmVjdCB0aGUKKyAgICAvLyBzb2NrZXQuCisgICAgLy8KKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoQUxvZ0RlbGVnYXRlOiBUTG9nRGVsZWdhdGUgPSBuaWwpOyBvdmVybG9hZDsKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoQVBvcnQ6IEludGVnZXI7IEFMb2dEZWxlZ2F0ZTogVExvZ0RlbGVnYXRlID0gbmlsKTsgb3ZlcmxvYWQ7CisKKyAgICAvLworICAgIC8vIERlc3Ryb3lzIHRoZSBzb2NrZXQgb2JqZWN0LCBjbG9zaW5nIGl0IGlmIG5lY2Vzc2FyeS4KKyAgICAvLworICAgIGRlc3RydWN0b3IgRGVzdHJveTsgb3ZlcnJpZGU7CisKKyAgICAvLworICAgIC8vIFNodXRzIGRvd24gY29tbXVuaWNhdGlvbnMgb24gdGhlIHNvY2tldAorICAgIC8vCisgICAgcHJvY2VkdXJlIENsb3NlOyB2aXJ0dWFsOworCisgICAgLy8gVGhlIHBvcnQgdGhhdCB0aGUgc29ja2V0IGlzIGNvbm5lY3RlZCB0bworICAgIHByb3BlcnR5IFBvcnQ6IEludGVnZXIgcmVhZCBGUG9ydCB3cml0ZSBGUG9ydDsKKworICAgIC8vIFRoZSByZWNlaXZlIHRpbWVvdXQKKyAgICBwcm9wZXJ0eSBSZWN2VGltZW91dDogTG9uZ3dvcmQgcmVhZCBGUmVjdlRpbWVvdXQgd3JpdGUgU2V0UmVjdlRpbWVvdXQ7CisKKyAgICAvLyBUaGUgc2VuZCB0aW1lb3V0CisgICAgcHJvcGVydHkgU2VuZFRpbWVvdXQ6IExvbmd3b3JkIHJlYWQgRlNlbmRUaW1lb3V0IHdyaXRlIFNldFNlbmRUaW1lb3V0OworCisgICAgLy8gU2V0IFNPX0tFRVBBTElWRQorICAgIHByb3BlcnR5IEtlZXBBbGl2ZTogQm9vbGVhbiByZWFkIEZLZWVwQWxpdmUgd3JpdGUgU2V0S2VlcEFsaXZlOworCisgICAgLy8gVGhlIHVuZGVybHlpbmcgc29ja2V0IGRlc2NyaXB0b3IKKyAgICBwcm9wZXJ0eSBTb2NrZXQ6IFdpbmFwaS5XaW5zb2NrMi5UU29ja2V0IHJlYWQgRlNvY2tldCB3cml0ZSBTZXRTb2NrZXQ7CisgIGVuZDsKKworICBUU29ja2V0ID0gY2xhc3MoVEJhc2VTb2NrZXQpCisgIHN0cmljdCBwcml2YXRlIHR5cGUKKyAgICBUQ2FjaGVkUGVlckFkZHIgPSByZWNvcmQKKyAgICBjYXNlIEludGVnZXIgb2YKKyAgICAgIDA6IChpcHY0OiBUU29ja0FkZHJJbik7CisgICAgICAxOiAoaXB2NjogVFNvY2tBZGRySW42KTsKKyAgICBlbmQ7CisgIHN0cmljdCBwcml2YXRlCisgICAgRkhvc3Q6IHN0cmluZzsKKyAgICBGUGVlckhvc3Q6IHN0cmluZzsKKyAgICBGUGVlckFkZHJlc3M6IHN0cmluZzsKKyAgICBGUGVlclBvcnQ6IEludGVnZXI7CisgICAgRkludGVycnVwdExpc3RlbmVyOiBJU21hcnRQb2ludGVyPFdpbmFwaS5XaW5zb2NrMi5UU29ja2V0PjsKKyAgICBGQ29ublRpbWVvdXQ6IExvbmd3b3JkOworICAgIEZMaW5nZXJPbjogQm9vbGVhbjsKKyAgICBGTGluZ2VyVmFsOiBJbnRlZ2VyOworICAgIEZOb0RlbGF5OiBCb29sZWFuOworICAgIEZNYXhSZWN2UmV0cmllczogTG9uZ3dvcmQ7CisgICAgRkNhY2hlZFBlZXJBZGRyOiBUQ2FjaGVkUGVlckFkZHI7CisgICAgcHJvY2VkdXJlIEluaXRQZWVySW5mbzsKKyAgICBwcm9jZWR1cmUgT3BlbkNvbm5lY3Rpb24oUmVzOiBUQmFzZVNvY2tldC5JR2V0QWRkckluZm9XcmFwcGVyKTsKKyAgICBwcm9jZWR1cmUgTG9jYWxPcGVuOworICAgIHByb2NlZHVyZSBTZXRHZW5lcmljVGltZW91dChTOiBXaW5hcGkuV2luc29jazIuVFNvY2tldDsgVGltZW91dDogTG9uZ3dvcmQ7IE9wdE5hbWU6IEludGVnZXIpOworICAgIGZ1bmN0aW9uIEdldElzT3BlbjogQm9vbGVhbjsKKyAgICBwcm9jZWR1cmUgU2V0Tm9EZWxheShBTm9EZWxheTogQm9vbGVhbik7CisgICAgZnVuY3Rpb24gR2V0U29ja2V0SW5mbzogc3RyaW5nOworICAgIGZ1bmN0aW9uIEdldFBlZXJIb3N0OiBzdHJpbmc7CisgICAgZnVuY3Rpb24gR2V0UGVlckFkZHJlc3M6IHN0cmluZzsKKyAgICBmdW5jdGlvbiBHZXRQZWVyUG9ydDogSW50ZWdlcjsKKyAgICBmdW5jdGlvbiBHZXRPcmlnaW46IHN0cmluZzsKKyAgc3RyaWN0IHByb3RlY3RlZAorICAgIHByb2NlZHVyZSBDb21tb25Jbml0OyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgU2V0UmVjdlRpbWVvdXQoQVJlY3ZUaW1lb3V0OiBMb25nd29yZCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBTZXRTZW5kVGltZW91dChBU2VuZFRpbWVvdXQ6IExvbmd3b3JkKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFNldEtlZXBBbGl2ZShBS2VlcEFsaXZlOiBCb29sZWFuKTsgb3ZlcnJpZGU7CisgIHB1YmxpYworICAgIC8vCisgICAgLy8gQ29uc3RydWN0cyBhIG5ldyBzb2NrZXQuIE5vdGUgdGhhdCB0aGlzIGRvZXMgTk9UIGFjdHVhbGx5IGNvbm5lY3QgdGhlCisgICAgLy8gc29ja2V0LgorICAgIC8vCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKEFMb2dEZWxlZ2F0ZTogVEJhc2VTb2NrZXQuVExvZ0RlbGVnYXRlID0gbmlsKTsgb3ZlcmxvYWQ7CisKKyAgICAvLworICAgIC8vIENvbnN0cnVjdHMgYSBuZXcgc29ja2V0LiBOb3RlIHRoYXQgdGhpcyBkb2VzIE5PVCBhY3R1YWxseSBjb25uZWN0IHRoZQorICAgIC8vIHNvY2tldC4KKyAgICAvLworICAgIC8vIEBwYXJhbSBob3N0IEFuIElQIGFkZHJlc3Mgb3IgaG9zdG5hbWUgdG8gY29ubmVjdCB0bworICAgIC8vIEBwYXJhbSBwb3J0IFRoZSBwb3J0IHRvIGNvbm5lY3Qgb24KKyAgICAvLworICAgIGNvbnN0cnVjdG9yIENyZWF0ZShBSG9zdDogc3RyaW5nOyBBUG9ydDogSW50ZWdlcjsgQUxvZ0RlbGVnYXRlOiBUQmFzZVNvY2tldC5UTG9nRGVsZWdhdGUgPSBuaWwpOyBvdmVybG9hZDsKKworICAgIC8vCisgICAgLy8gQ29uc3RydWN0b3IgdG8gY3JlYXRlIHNvY2tldCBmcm9tIHNvY2tldCBkZXNjcmlwdG9yLgorICAgIC8vCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKEFTb2NrZXQ6IFdpbmFwaS5XaW5zb2NrMi5UU29ja2V0OyBBTG9nRGVsZWdhdGU6IFRCYXNlU29ja2V0LlRMb2dEZWxlZ2F0ZSA9IG5pbCk7IG92ZXJsb2FkOworCisgICAgLy8KKyAgICAvLyBDb25zdHJ1Y3RvciB0byBjcmVhdGUgc29ja2V0IGZyb20gc29ja2V0IGRlc2NyaXB0b3IgdGhhdAorICAgIC8vIGNhbiBiZSBpbnRlcnJ1cHRlZCBzYWZlbHkuCisgICAgLy8KKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoQVNvY2tldDogV2luYXBpLldpbnNvY2syLlRTb2NrZXQ7IEFJbnRlcnJ1cHRMaXN0ZW5lcjogSVNtYXJ0UG9pbnRlcjxXaW5hcGkuV2luc29jazIuVFNvY2tldD47CisgICAgICBBTG9nRGVsZWdhdGU6IFRCYXNlU29ja2V0LlRMb2dEZWxlZ2F0ZSA9IG5pbCk7IG92ZXJsb2FkOworCisgICAgLy8KKyAgICAvLyBDcmVhdGVzIGFuZCBvcGVucyB0aGUgc29ja2V0CisgICAgLy8KKyAgICAvLyBAdGhyb3dzIEVUcmFuc3BvcnRhdGlvbkV4Y2VwdGlvbiBJZiB0aGUgc29ja2V0IGNvdWxkIG5vdCBjb25uZWN0CisgICAgLy8KKyAgICBwcm9jZWR1cmUgT3BlbjsKKworICAgIC8vCisgICAgLy8gU2h1dHMgZG93biBjb21tdW5pY2F0aW9ucyBvbiB0aGUgc29ja2V0CisgICAgLy8KKyAgICBwcm9jZWR1cmUgQ2xvc2U7IG92ZXJyaWRlOworCisgICAgLy8KKyAgICAvLyBSZWFkcyBmcm9tIHRoZSB1bmRlcmx5aW5nIHNvY2tldC4KKyAgICAvLyBccmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgb3IgMCBpbmRpY2F0ZXMgRU9GCisgICAgLy8gXHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIG9mIHR5cGVzOgorICAgIC8vICAgICAgICAgIEludGVycnVwdGVkIG1lYW5zIHRoZSBzb2NrZXQgd2FzIGludGVycnVwdGVkCisgICAgLy8gICAgICAgICAgICAgICAgICAgICAgb3V0IG9mIGEgYmxvY2tpbmcgY2FsbAorICAgIC8vICAgICAgICAgIE5vdE9wZW4gbWVhbnMgdGhlIHNvY2tldCBoYXMgYmVlbiBjbG9zZWQKKyAgICAvLyAgICAgICAgICBUaW1lZE91dCBtZWFucyB0aGUgcmVjZWl2ZSB0aW1lb3V0IGV4cGlyZWQKKyAgICAvLyAgICAgICAgICBVbmtub3duIG1lYW5zIHNvbWV0aGluZyB1bmV4cGVjdGVkIGhhcHBlbmVkCisgICAgLy8KKyAgICBmdW5jdGlvbiBSZWFkKHZhciBCdWY7IExlbjogSW50ZWdlcik6IEludGVnZXI7CisKKyAgICAvLworICAgIC8vIFdyaXRlcyB0byB0aGUgdW5kZXJseWluZyBzb2NrZXQuICBMb29wcyB1bnRpbCBkb25lIG9yIGZhaWwuCisgICAgLy8KKyAgICBwcm9jZWR1cmUgV3JpdGUoY29uc3QgQnVmOyBMZW46IEludGVnZXIpOworCisgICAgLy8KKyAgICAvLyBXcml0ZXMgdG8gdGhlIHVuZGVybHlpbmcgc29ja2V0LiAgRG9lcyBzaW5nbGUgc2VuZCgpIGFuZCByZXR1cm5zIHJlc3VsdC4KKyAgICAvLworICAgIGZ1bmN0aW9uIFdyaXRlUGFydGlhbChjb25zdCBCdWY7IExlbjogSW50ZWdlcik6IEludGVnZXI7CisKKyAgICAvLworICAgIC8vIFJldHVybnMgYSBjYWNoZWQgY29weSBvZiB0aGUgcGVlciBhZGRyZXNzLgorICAgIC8vCisgICAgZnVuY3Rpb24gR2V0Q2FjaGVkQWRkcmVzcyhvdXQgTGVuOiBJbnRlZ2VyKTogUFNvY2tBZGRyOworCisgICAgLy8KKyAgICAvLyBTZXQgYSBjYWNoZSBvZiB0aGUgcGVlciBhZGRyZXNzICh1c2VkIHdoZW4gdHJpdmlhbGx5IGF2YWlsYWJsZTogZS5nLgorICAgIC8vIGFjY2VwdCgpIG9yIGNvbm5lY3QoKSkuIE9ubHkgY2FjaGVzIElQVjQgYW5kIElQVjY7IHVuc2V0IGZvciBvdGhlcnMuCisgICAgLy8KKyAgICBwcm9jZWR1cmUgU2V0Q2FjaGVkQWRkcmVzcyhjb25zdCBBZGRyOiBUU29ja0FkZHI7IExlbjogSW50ZWdlcik7CisKKyAgICAvLworICAgIC8vIENvbnRyb2xzIHdoZXRoZXIgdGhlIGxpbmdlciBvcHRpb24gaXMgc2V0IG9uIHRoZSBzb2NrZXQuCisgICAgLy8KKyAgICAvLyBAcGFyYW0gb24gICAgICBXaGV0aGVyIFNPX0xJTkdFUiBpcyBvbgorICAgIC8vIEBwYXJhbSBsaW5nZXIgIElmIGxpbmdlciBpcyBhY3RpdmUsIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyB0byBsaW5nZXIgZm9yCisgICAgLy8KKyAgICBwcm9jZWR1cmUgU2V0TGluZ2VyKExpbmdlck9uOiBCb29sZWFuOyBMaW5nZXJWYWw6IEludGVnZXIpOworCisgICAgLy8KKyAgICAvLyBDYWxscyBzZWxlY3QoKSBvbiB0aGUgc29ja2V0IHRvIHNlZSBpZiB0aGVyZSBpcyBtb3JlIGRhdGEgYXZhaWxhYmxlLgorICAgIC8vCisgICAgZnVuY3Rpb24gUGVlazogQm9vbGVhbjsKKworICAgIC8vIFdoZXRoZXIgdGhlIHNvY2tldCBpcyBhbGl2ZQorICAgIHByb3BlcnR5IElzT3BlbjogQm9vbGVhbiByZWFkIEdldElzT3BlbjsKKworICAgIC8vIFRoZSBob3N0IHRoYXQgdGhlIHNvY2tldCBpcyBjb25uZWN0ZWQgdG8KKyAgICBwcm9wZXJ0eSBIb3N0OiBzdHJpbmcgcmVhZCBGSG9zdCB3cml0ZSBGSG9zdDsKKworICAgIC8vIFdoZXRoZXIgdG8gZW5hYmxlIG9yIGRpc2FibGUgTmFnbGUncyBhbGdvcml0aG0KKyAgICBwcm9wZXJ0eSBOb0RlbGF5OiBCb29sZWFuIHJlYWQgRk5vRGVsYXkgd3JpdGUgU2V0Tm9EZWxheTsKKworICAgIC8vIENvbm5lY3QgdGltZW91dAorICAgIHByb3BlcnR5IENvbm5UaW1lb3V0OiBMb25nd29yZCByZWFkIEZDb25uVGltZW91dCB3cml0ZSBGQ29ublRpbWVvdXQ7CisKKyAgICAvLyBUaGUgbWF4IG51bWJlciBvZiByZWN2IHJldHJpZXMgaW4gdGhlIGNhc2Ugb2YgYSBXU0FFV09VTERCTE9DSworICAgIHByb3BlcnR5IE1heFJlY3ZSZXRyaWVzOiBMb25nd29yZCByZWFkIEZNYXhSZWN2UmV0cmllcyB3cml0ZSBGTWF4UmVjdlJldHJpZXM7CisKKyAgICAvLyBTb2NrZXQgaW5mb3JtYXRpb24gZm9ybWF0dGVkIGFzIGEgc3RyaW5nIDxIb3N0OiB4IFBvcnQ6IHg+CisgICAgcHJvcGVydHkgU29ja2V0SW5mbzogc3RyaW5nIHJlYWQgR2V0U29ja2V0SW5mbzsKKworICAgIC8vIFRoZSBETlMgbmFtZSBvZiB0aGUgaG9zdCB0byB3aGljaCB0aGUgc29ja2V0IGlzIGNvbm5lY3RlZAorICAgIHByb3BlcnR5IFBlZXJIb3N0OiBzdHJpbmcgcmVhZCBHZXRQZWVySG9zdDsKKworICAgIC8vIFRoZSBhZGRyZXNzIG9mIHRoZSBob3N0IHRvIHdoaWNoIHRoZSBzb2NrZXQgaXMgY29ubmVjdGVkCisgICAgcHJvcGVydHkgUGVlckFkZHJlc3M6IHN0cmluZyByZWFkIEdldFBlZXJBZGRyZXNzOworCisgICAgLy8gVGhlIHBvcnQgb2YgdGhlIGhvc3QgdG8gd2hpY2ggdGhlIHNvY2tldCBpcyBjb25uZWN0ZWQKKyAgICBwcm9wZXJ0eSBQZWVyUG9ydDogSW50ZWdlciByZWFkIEdldFBlZXJQb3J0OworCisgICAgLy8gVGhlIG9yaWdpbiB0aGUgc29ja2V0IGlzIGNvbm5lY3RlZCB0bworICAgIHByb3BlcnR5IE9yaWdpbjogc3RyaW5nIHJlYWQgR2V0T3JpZ2luOworICBlbmQ7CisKKyAgVFNlcnZlclNvY2tldEZ1bmMgPSByZWZlcmVuY2UgdG8gcHJvY2VkdXJlKHNvY2s6IFdpbmFwaS5XaW5zb2NrMi5UU29ja2V0KTsKKworICBUU2VydmVyU29ja2V0ID0gY2xhc3MoVEJhc2VTb2NrZXQpCisgIHN0cmljdCBwcml2YXRlCisgICAgRkFkZHJlc3M6IHN0cmluZzsKKyAgICBGQWNjZXB0QmFja2xvZywKKyAgICBGUmV0cnlMaW1pdCwKKyAgICBGUmV0cnlEZWxheSwKKyAgICBGVGNwU2VuZEJ1ZmZlciwKKyAgICBGVGNwUmVjdkJ1ZmZlcjogSW50ZWdlcjsKKyAgICBGQWNjZXB0VGltZW91dDogTG9uZ3dvcmQ7CisgICAgRkxpc3RlbmluZywKKyAgICBGSW50ZXJydXB0YWJsZUNoaWxkcmVuOiBCb29sZWFuOworICAgIEZJbnRlcnJ1cHRTb2NrV3JpdGVyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgbm90aWZpZWQgb24gSW50ZXJydXB0KCkKKyAgICBGSW50ZXJydXB0U29ja1JlYWRlciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIHVzZWQgaW4gc2VsZWN0IHdpdGggRlNvY2tldCBmb3IgaW50ZXJydXB0YWJpbGl0eQorICAgIEZDaGlsZEludGVycnVwdFNvY2tXcml0ZXI6IFdpbmFwaS5XaW5zb2NrMi5UU29ja2V0OyAgICAgICAgICAgICAgICAgLy8gaXMgbm90aWZpZWQgb24gSW50ZXJydXB0Q2hpbGRyZW4oKQorICAgIEZDaGlsZEludGVycnVwdFNvY2tSZWFkZXI6IElTbWFydFBvaW50ZXI8V2luYXBpLldpbnNvY2syLlRTb2NrZXQ+OyAgLy8gaWYgRm50ZXJydXB0YWJsZUNoaWxkcmVuIHRoaXMgaXMgc2hhcmVkIHdpdGggY2hpbGQgVFNvY2tldHMKKyAgICBGTGlzdGVuQ2FsbGJhY2ssCisgICAgRkFjY2VwdENhbGxiYWNrOiBUU2VydmVyU29ja2V0RnVuYzsKKyAgICBmdW5jdGlvbiBDcmVhdGVTb2NrZXRPYmooQ2xpZW50OiBXaW5hcGkuV2luc29jazIuVFNvY2tldCk6IFRTb2NrZXQ7CisgICAgcHJvY2VkdXJlIE5vdGlmeShOb3RpZnlTb2NrZXQ6IFdpbmFwaS5XaW5zb2NrMi5UU29ja2V0KTsKKyAgICBwcm9jZWR1cmUgU2V0SW50ZXJydXB0YWJsZUNoaWxkcmVuKEFWYWx1ZTogQm9vbGVhbik7CisgIHN0cmljdCBwcm90ZWN0ZWQKKyAgICBwcm9jZWR1cmUgQ29tbW9uSW5pdDsgb3ZlcnJpZGU7CisgIHB1YmxpYyBjb25zdAorICAgIERFRkFVTFRfQkFDS0xPRyA9IDEwMjQ7CisgIHB1YmxpYworICAgIC8vCisgICAgLy8gQ29uc3RydWN0b3IuCisgICAgLy8KKyAgICAvLyBAcGFyYW0gcG9ydCAgICBQb3J0IG51bWJlciB0byBiaW5kIHRvCisgICAgLy8KKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoQVBvcnQ6IEludGVnZXI7IEFMb2dEZWxlZ2F0ZTogVEJhc2VTb2NrZXQuVExvZ0RlbGVnYXRlID0gbmlsKTsgb3ZlcmxvYWQ7CisKKyAgICAvLworICAgIC8vIENvbnN0cnVjdG9yLgorICAgIC8vCisgICAgLy8gQHBhcmFtIHBvcnQgICAgICAgIFBvcnQgbnVtYmVyIHRvIGJpbmQgdG8KKyAgICAvLyBAcGFyYW0gc2VuZFRpbWVvdXQgU29ja2V0IHNlbmQgdGltZW91dAorICAgIC8vIEBwYXJhbSByZWN2VGltZW91dCBTb2NrZXQgcmVjZWl2ZSB0aW1lb3V0CisgICAgLy8KKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoQVBvcnQ6IEludGVnZXI7IEFTZW5kVGltZW91dCwgQVJlY3ZUaW1lb3V0OiBMb25nd29yZDsgQUxvZ0RlbGVnYXRlOiBUQmFzZVNvY2tldC5UTG9nRGVsZWdhdGUgPSBuaWwpOyBvdmVybG9hZDsKKworICAgIC8vCisgICAgLy8gQ29uc3RydWN0b3IuCisgICAgLy8KKyAgICAvLyBAcGFyYW0gYWRkcmVzcyBBZGRyZXNzIHRvIGJpbmQgdG8KKyAgICAvLyBAcGFyYW0gcG9ydCAgICBQb3J0IG51bWJlciB0byBiaW5kIHRvCisgICAgLy8KKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoQUFkZHJlc3M6IHN0cmluZzsgQVBvcnQ6IEludGVnZXI7IEFMb2dEZWxlZ2F0ZTogVEJhc2VTb2NrZXQuVExvZ0RlbGVnYXRlID0gbmlsKTsgb3ZlcmxvYWQ7CisKKyAgICBwcm9jZWR1cmUgTGlzdGVuOworICAgIGZ1bmN0aW9uIEFjY2VwdDogVFNvY2tldDsKKyAgICBwcm9jZWR1cmUgSW50ZXJydXB0OworICAgIHByb2NlZHVyZSBJbnRlcnJ1cHRDaGlsZHJlbjsKKyAgICBwcm9jZWR1cmUgQ2xvc2U7IG92ZXJyaWRlOworCisgICAgcHJvcGVydHkgQWNjZXB0QmFja2xvZzogSW50ZWdlciByZWFkIEZBY2NlcHRCYWNrbG9nIHdyaXRlIEZBY2NlcHRCYWNrbG9nOworICAgIHByb3BlcnR5IEFjY2VwdFRpbWVvdXQ6IExvbmd3b3JkIHJlYWQgRkFjY2VwdFRpbWVvdXQgd3JpdGUgRkFjY2VwdFRpbWVvdXQ7CisgICAgcHJvcGVydHkgUmV0cnlMaW1pdDogSW50ZWdlciByZWFkIEZSZXRyeUxpbWl0IHdyaXRlIEZSZXRyeUxpbWl0OworICAgIHByb3BlcnR5IFJldHJ5RGVsYXk6IEludGVnZXIgcmVhZCBGUmV0cnlEZWxheSB3cml0ZSBGUmV0cnlEZWxheTsKKyAgICBwcm9wZXJ0eSBUY3BTZW5kQnVmZmVyOiBJbnRlZ2VyIHJlYWQgRlRjcFNlbmRCdWZmZXIgd3JpdGUgRlRjcFNlbmRCdWZmZXI7CisgICAgcHJvcGVydHkgVGNwUmVjdkJ1ZmZlcjogSW50ZWdlciByZWFkIEZUY3BSZWN2QnVmZmVyIHdyaXRlIEZUY3BSZWN2QnVmZmVyOworCisgICAgLy8gV2hlbiBlbmFibGVkICh0aGUgZGVmYXVsdCksIG5ldyBjaGlsZHJlbiBUU29ja2V0cyB3aWxsIGJlIGNvbnN0cnVjdGVkIHNvCisgICAgLy8gdGhleSBjYW4gYmUgaW50ZXJydXB0ZWQgYnkgVFNlcnZlclRyYW5zcG9ydC5JbnRlcnJ1cHRDaGlsZHJlbigpLgorICAgIC8vIFRoaXMgaXMgbW9yZSBleHBlbnNpdmUgaW4gdGVybXMgb2Ygc3lzdGVtIGNhbGxzIChwb2xsICsgcmVjdikgaG93ZXZlcgorICAgIC8vIGVuc3VyZXMgYSBjb25uZWN0ZWQgY2xpZW50IGNhbm5vdCBpbnRlcmZlcmUgd2l0aCBUU2VydmVyLlN0b3AoKS4KKyAgICAvLworICAgIC8vIFdoZW4gZGlzYWJsZWQsIFRTb2NrZXQgY2hpbGRyZW4gZG8gbm90IGluY3VyIGFuIGFkZGl0aW9uYWwgcG9sbCgpIGNhbGwuCisgICAgLy8gU2VydmVyLXNpZGUgcmVhZHMgYXJlIG1vcmUgZWZmaWNpZW50LCBob3dldmVyIGEgY2xpZW50IGNhbiBpbnRlcmZlcmUgd2l0aAorICAgIC8vIHRoZSBzZXJ2ZXIncyBhYmlsaXR5IHRvIHNodXRkb3duIHByb3Blcmx5IGJ5IHN0YXlpbmcgY29ubmVjdGVkLgorICAgIC8vCisgICAgLy8gTXVzdCBiZSBjYWxsZWQgYmVmb3JlIGxpc3RlbigpOyBtb2RlIGNhbm5vdCBiZSBzd2l0Y2hlZCBhZnRlciB0aGF0LgorICAgIC8vIFx0aHJvd3MgRVByb3BlcnR5RXJyb3IgaWYgbGlzdGVuKCkgaGFzIGJlZW4gY2FsbGVkCisgICAgcHJvcGVydHkgSW50ZXJydXB0YWJsZUNoaWxkcmVuOiBCb29sZWFuIHJlYWQgRkludGVycnVwdGFibGVDaGlsZHJlbiB3cml0ZSBTZXRJbnRlcnJ1cHRhYmxlQ2hpbGRyZW47CisKKyAgICAvLyBsaXN0ZW5DYWxsYmFjayBnZXRzIGNhbGxlZCBqdXN0IGJlZm9yZSBsaXN0ZW4sIGFuZCBhZnRlciBhbGwgVGhyaWZ0CisgICAgLy8gc2V0c29ja29wdCBjYWxscyBoYXZlIGJlZW4gbWFkZS4gIElmIHlvdSBoYXZlIGN1c3RvbSBzZXRzb2Nrb3B0CisgICAgLy8gdGhpbmdzIHRoYXQgbmVlZCB0byBoYXBwZW4gb24gdGhlIGxpc3RlbmluZyBzb2NrZXQsIHRoaXMgaXMgdGhlIHBsYWNlIHRvIGRvIGl0LgorICAgIHByb3BlcnR5IExpc3RlbkNhbGxiYWNrOiBUU2VydmVyU29ja2V0RnVuYyByZWFkIEZMaXN0ZW5DYWxsYmFjayB3cml0ZSBGTGlzdGVuQ2FsbGJhY2s7CisKKyAgICAvLyBhY2NlcHRDYWxsYmFjayBnZXRzIGNhbGxlZCBhZnRlciBlYWNoIGFjY2VwdCBjYWxsLCBvbiB0aGUgbmV3bHkgY3JlYXRlZCBzb2NrZXQuCisgICAgLy8gSXQgaXMgY2FsbGVkIGFmdGVyIGFsbCBUaHJpZnQgc2V0c29ja29wdCBjYWxscyBoYXZlIGJlZW4gbWFkZS4gIElmIHlvdSBoYXZlCisgICAgLy8gY3VzdG9tIHNldHNvY2tvcHQgdGhpbmdzIHRoYXQgbmVlZCB0byBoYXBwZW4gb24gdGhlIGFjY2VwdGVkCisgICAgLy8gc29ja2V0LCB0aGlzIGlzIHRoZSBwbGFjZSB0byBkbyBpdC4KKyAgICBwcm9wZXJ0eSBBY2NlcHRDYWxsYmFjazogVFNlcnZlclNvY2tldEZ1bmMgcmVhZCBGQWNjZXB0Q2FsbGJhY2sgd3JpdGUgRkFjY2VwdENhbGxiYWNrOworICBlbmQ7CisKK3skRU5ESUZ9IC8vIG5vdCBmb3IgT0xEX1NPQ0tFVFMKK2ltcGxlbWVudGF0aW9uCit7JElGTkRFRiBPTERfU09DS0VUU30gLy8gbm90IGZvciBPTERfU09DS0VUUworCit1c2VzCisgIFN5c3RlbS5TeXNVdGlscywgU3lzdGVtLk1hdGgsIFN5c3RlbS5EYXRlVXRpbHMsIFRocmlmdC5UcmFuc3BvcnQ7CisKK2NvbnN0cnVjdG9yIFRCYXNlU29ja2V0LlRHZXRBZGRySW5mb1dyYXBwZXIuQ3JlYXRlKEFOb2RlLCBBU2VydmljZTogc3RyaW5nOyBBSGludHM6IFBBZGRySW5mb1cpOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKKyAgRk5vZGUgOj0gQU5vZGU7CisgIEZTZXJ2aWNlIDo9IEFTZXJ2aWNlOworICBGSGludHMgOj0gQUhpbnRzOworICBGUmVzIDo9IG5pbDsKK2VuZDsKKworZGVzdHJ1Y3RvciBUQmFzZVNvY2tldC5UR2V0QWRkckluZm9XcmFwcGVyLkRlc3Ryb3k7CitiZWdpbgorICBpZiBBc3NpZ25lZChGUmVzKSB0aGVuCisgICAgRnJlZUFkZHJJbmZvVyhGUmVzKTsKKyAgaW5oZXJpdGVkIERlc3Ryb3k7CitlbmQ7CisKK2Z1bmN0aW9uIFRCYXNlU29ja2V0LlRHZXRBZGRySW5mb1dyYXBwZXIuSW5pdDogSW50ZWdlcjsKK2JlZ2luCisgIGlmIEZSZXMgPSBuaWwgdGhlbgorICAgIEV4aXQoR2V0QWRkckluZm9XKEBGTm9kZVsxXSwgQEZTZXJ2aWNlWzFdLCBGSGludHNeLCBGUmVzKSk7CisgIFJlc3VsdCA6PSAwOworZW5kOworCitmdW5jdGlvbiBUQmFzZVNvY2tldC5UR2V0QWRkckluZm9XcmFwcGVyLkdldFJlczogUEFkZHJJbmZvVzsKK2JlZ2luCisgIFJlc3VsdCA6PSBGUmVzOworZW5kOworCitwcm9jZWR1cmUgRGVzdHJveWVyT2ZGaW5lU29ja2V0cyhzc29jazogV2luYXBpLldpbnNvY2syLlRTb2NrZXQpOworYmVnaW4KKyAgY2xvc2Vzb2NrZXQoc3NvY2spOworZW5kOworCitmdW5jdGlvbiBUU2NvcGVJZC5HZXRCaXRGaWVsZChMb2M6IEludGVnZXIpOiBJbnRlZ2VyOworYmVnaW4KKyAgUmVzdWx0IDo9IChWYWx1ZSBzaHIgKExvYyBzaHIgOCkpIGFuZCAoKDEgc2hsIChMb2MgYW5kICRGRikpIC0gMSk7CitlbmQ7CisKK3Byb2NlZHVyZSBUU2NvcGVJZC5TZXRCaXRGaWVsZChMb2M6IEludGVnZXI7IGNvbnN0IGFWYWx1ZTogSW50ZWdlcik7CitiZWdpbgorICBWYWx1ZSA6PSAoVmFsdWUgYW5kIFVMT05HKChub3QgKCgxIHNobCAoTG9jIGFuZCAkRkYpKSAtIDEpKSkpIG9yIFVMT05HKGFWYWx1ZSBzaGwgKExvYyBzaHIgOCkpOworZW5kOworCitmdW5jdGlvbiBnZXRhZGRyaW5mbzsgZXh0ZXJuYWwgJ3dzMl8zMi5kbGwnIG5hbWUgJ2dldGFkZHJpbmZvJzsKK2Z1bmN0aW9uIEdldEFkZHJJbmZvVzsgZXh0ZXJuYWwgJ3dzMl8zMi5kbGwnIG5hbWUgJ0dldEFkZHJJbmZvVyc7Citwcm9jZWR1cmUgZnJlZWFkZHJpbmZvOyBleHRlcm5hbCAnd3MyXzMyLmRsbCcgbmFtZSAnZnJlZWFkZHJpbmZvJzsKK3Byb2NlZHVyZSBGcmVlQWRkckluZm9XOyBleHRlcm5hbCAnd3MyXzMyLmRsbCcgbmFtZSAnRnJlZUFkZHJJbmZvVyc7CitmdW5jdGlvbiBnZXRuYW1laW5mbzsgZXh0ZXJuYWwgJ3dzMl8zMi5kbGwnIG5hbWUgJ2dldG5hbWVpbmZvJzsKK2Z1bmN0aW9uIEdldE5hbWVJbmZvVzsgZXh0ZXJuYWwgJ3dzMl8zMi5kbGwnIG5hbWUgJ0dldE5hbWVJbmZvVyc7CisKK2NvbnN0cnVjdG9yIFRTbWFydFBvaW50ZXI8VD4uQ3JlYXRlKEFWYWx1ZTogVDsgQURlc3Ryb3llcjogVFNtYXJ0UG9pbnRlckRlc3Ryb3llcjxUPik7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlOworICBGVmFsdWUgOj0gQVZhbHVlOworICBGRGVzdHJveWVyIDo9IEFEZXN0cm95ZXI7CitlbmQ7CisKK2Rlc3RydWN0b3IgVFNtYXJ0UG9pbnRlcjxUPi5EZXN0cm95OworYmVnaW4KKyAgaWYgQXNzaWduZWQoRkRlc3Ryb3llcikgdGhlbiBGRGVzdHJveWVyKEZWYWx1ZSk7CisgIGluaGVyaXRlZCBEZXN0cm95OworZW5kOworCitmdW5jdGlvbiBUU21hcnRQb2ludGVyPFQ+Lkludm9rZTogVDsKK2JlZ2luCisgIFJlc3VsdCA6PSBGVmFsdWU7CitlbmQ7CisKK2NsYXNzIGNvbnN0cnVjdG9yIFRCYXNlU29ja2V0LkNyZWF0ZTsKK3ZhcgorICBWZXJzaW9uOiBXT1JEOworICBEYXRhOiBXU0FEYXRhOworICBFcnJvcjogSW50ZWdlcjsKK2JlZ2luCisgIFZlcnNpb24gOj0gJDAyMDI7CisgIEZpbGxDaGFyKERhdGEsIFNpemVPZihEYXRhKSwgMCk7CisgIEVycm9yIDo9IFdTQVN0YXJ0dXAoVmVyc2lvbiwgRGF0YSk7CisgIGlmIEVycm9yIDw+IDAgdGhlbgorICAgIHJhaXNlIEV4Y2VwdGlvbi5DcmVhdGUoJ0ZhaWxlZCB0byBpbml0aWFsaXplIFdpbnNvY2suJyk7CitlbmQ7CisKK2NsYXNzIGRlc3RydWN0b3IgVEJhc2VTb2NrZXQuRGVzdHJveTsKK2JlZ2luCisgIFdTQUNsZWFudXA7CitlbmQ7CisKK2NsYXNzIHByb2NlZHVyZSBUQmFzZVNvY2tldC5EZWZhdWx0TG9nRGVsZWdhdGUoY29uc3QgU3RyOiBzdHJpbmcpOwordmFyCisgIE91dFN0cjogc3RyaW5nOworYmVnaW4KKyAgT3V0U3RyIDo9IEZvcm1hdCgnVGhyaWZ0OiAlcyAlcycsIFtEYXRlVGltZVRvU3RyKE5vdywgVEZvcm1hdFNldHRpbmdzLkNyZWF0ZSksIFN0cl0pOworICB0cnkKKyAgICBXcml0ZWxuKE91dFN0cik7CisgICAgaWYgSW9SZXN1bHQgPD4gMCB0aGVuIE91dHB1dERlYnVnU3RyaW5nKFBDaGFyKE91dFN0cikpOworICBleGNlcHQKKyAgICBPdXRwdXREZWJ1Z1N0cmluZyhQQ2hhcihPdXRTdHIpKTsKKyAgZW5kOworZW5kOworCitwcm9jZWR1cmUgVEJhc2VTb2NrZXQuQ29tbW9uSW5pdDsKK2JlZ2luCisgIEZTb2NrZXQgOj0gSU5WQUxJRF9TT0NLRVQ7CisgIEZQb3J0IDo9IDA7CisgIEZTZW5kVGltZW91dCA6PSAwOworICBGUmVjdlRpbWVvdXQgOj0gMDsKKyAgRktlZXBBbGl2ZSA6PSBGYWxzZTsKKyAgRkxvZ0RlbGVnYXRlIDo9IERlZmF1bHRMb2dEZWxlZ2F0ZTsKK2VuZDsKKworZnVuY3Rpb24gVEJhc2VTb2NrZXQuQ3JlYXRlU29ja2V0KEFBZGRyZXNzOiBzdHJpbmc7IEFQb3J0OiBJbnRlZ2VyKTogSUdldEFkZHJJbmZvV3JhcHBlcjsKK3ZhcgorICBIaW50czogVEFkZHJJbmZvVzsKKyAgUmVzOiBQQWRkckluZm9XOworICBUaGVQb3J0OiBhcnJheVswLi41XSBvZiBDaGFyOworICBFcnJvcjogSW50ZWdlcjsKK2JlZ2luCisgIEZpbGxDaGFyKEhpbnRzLCBTaXplT2YoSGludHMpLCAwKTsKKyAgSGludHMuYWlfZmFtaWx5IDo9IFBGX1VOU1BFQzsKKyAgSGludHMuYWlfc29ja3R5cGUgOj0gU09DS19TVFJFQU07CisgIEhpbnRzLmFpX2ZsYWdzIDo9IEFJX1BBU1NJVkUgb3IgQUlfQUREUkNPTkZJRzsKKyAgU3RyRm10KFRoZVBvcnQsICclZCcsIFtGUG9ydF0pOworCisgIFJlc3VsdCA6PSBUR2V0QWRkckluZm9XcmFwcGVyLkNyZWF0ZShBQWRkcmVzcywgVGhlUG9ydCwgQEhpbnRzKTsKKyAgRXJyb3IgOj0gUmVzdWx0LkluaXQ7CisgIGlmIEVycm9yIDw+IDAgdGhlbiBiZWdpbgorICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnR2V0QWRkckluZm9XICVkOiAlcycsIFtFcnJvciwgU3lzRXJyb3JNZXNzYWdlKEVycm9yKV0pKTsKKyAgICBDbG9zZTsKKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoJ0NvdWxkIG5vdCByZXNvbHZlIGhvc3QgZm9yIHNlcnZlciBzb2NrZXQuJyk7CisgIGVuZDsKKworICAvLyBQaWNrIHRoZSBpcHY2IGFkZHJlc3MgZmlyc3Qgc2luY2UgaXB2NCBhZGRyZXNzZXMgY2FuIGJlIG1hcHBlZAorICAvLyBpbnRvIGlwdjYgc3BhY2UuCisgIFJlcyA6PSBSZXN1bHQuUmVzOworICB3aGlsZSBBc3NpZ25lZChSZXMpIGRvIGJlZ2luCisgICAgaWYgKFJlc14uYWlfZmFtaWx5ID0gQUZfSU5FVDYpIG9yIChub3QgQXNzaWduZWQoUmVzXi5haV9uZXh0KSkgdGhlbgorICAgICAgQnJlYWs7CisgICAgUmVzIDo9IFJlc14uYWlfbmV4dDsKKyAgZW5kOworCisgIEZTb2NrZXQgOj0gV2luYXBpLldpbnNvY2syLnNvY2tldChSZXNeLmFpX2ZhbWlseSwgUmVzXi5haV9zb2NrdHlwZSwgUmVzXi5haV9wcm90b2NvbCk7CisgIGlmIEZTb2NrZXQgPSBJTlZBTElEX1NPQ0tFVCB0aGVuIGJlZ2luCisgICAgRXJyb3IgOj0gV1NBR2V0TGFzdEVycm9yOworICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnVEJhc2VTb2NrZXQuQ3JlYXRlU29ja2V0KCkgc29ja2V0KCkgJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm9yKV0pKTsKKyAgICBDbG9zZTsKKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoRm9ybWF0KCdzb2NrZXQoKTogJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm9yKV0pKTsKKyAgZW5kOworZW5kOworCitwcm9jZWR1cmUgVEJhc2VTb2NrZXQuU2V0UmVjdlRpbWVvdXQoQVJlY3ZUaW1lb3V0OiBMb25nd29yZCk7CitiZWdpbgorICBGUmVjdlRpbWVvdXQgOj0gQVJlY3ZUaW1lb3V0OworZW5kOworCitwcm9jZWR1cmUgVEJhc2VTb2NrZXQuU2V0U2VuZFRpbWVvdXQoQVNlbmRUaW1lb3V0OiBMb25nd29yZCk7CitiZWdpbgorICBGU2VuZFRpbWVvdXQgOj0gQVNlbmRUaW1lb3V0OworZW5kOworCitwcm9jZWR1cmUgVEJhc2VTb2NrZXQuU2V0S2VlcEFsaXZlKEFLZWVwQWxpdmU6IEJvb2xlYW4pOworYmVnaW4KKyAgRktlZXBBbGl2ZSA6PSBBS2VlcEFsaXZlOworZW5kOworCitwcm9jZWR1cmUgVEJhc2VTb2NrZXQuU2V0U29ja2V0KEFTb2NrZXQ6IFdpbmFwaS5XaW5zb2NrMi5UU29ja2V0KTsKK2JlZ2luCisgIGlmIEZTb2NrZXQgPD4gSU5WQUxJRF9TT0NLRVQgdGhlbgorICAgIENsb3NlOworICBGU29ja2V0IDo9IEFTb2NrZXQ7CitlbmQ7CisKK2NvbnN0cnVjdG9yIFRCYXNlU29ja2V0LkNyZWF0ZShBTG9nRGVsZWdhdGU6IFRMb2dEZWxlZ2F0ZSk7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlOworICBDb21tb25Jbml0OworICBpZiBBc3NpZ25lZChBTG9nRGVsZWdhdGUpIHRoZW4gRkxvZ0RlbGVnYXRlIDo9IEFMb2dEZWxlZ2F0ZTsKK2VuZDsKKworY29uc3RydWN0b3IgVEJhc2VTb2NrZXQuQ3JlYXRlKEFQb3J0OiBJbnRlZ2VyOyBBTG9nRGVsZWdhdGU6IFRMb2dEZWxlZ2F0ZSk7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlOworICBDb21tb25Jbml0OworICBGUG9ydCA6PSBBUG9ydDsKKyAgaWYgQXNzaWduZWQoQUxvZ0RlbGVnYXRlKSB0aGVuIEZMb2dEZWxlZ2F0ZSA6PSBBTG9nRGVsZWdhdGU7CitlbmQ7CisKK2Rlc3RydWN0b3IgVEJhc2VTb2NrZXQuRGVzdHJveTsKK2JlZ2luCisgIENsb3NlOworICBpbmhlcml0ZWQgRGVzdHJveTsKK2VuZDsKKworcHJvY2VkdXJlIFRCYXNlU29ja2V0LkNsb3NlOworYmVnaW4KKyAgaWYgRlNvY2tldCA8PiBJTlZBTElEX1NPQ0tFVCB0aGVuIGJlZ2luCisgICAgc2h1dGRvd24oRlNvY2tldCwgU0RfQk9USCk7CisgICAgY2xvc2Vzb2NrZXQoRlNvY2tldCk7CisgIGVuZDsKKyAgRlNvY2tldCA6PSBJTlZBTElEX1NPQ0tFVDsKK2VuZDsKKworcHJvY2VkdXJlIFRTb2NrZXQuSW5pdFBlZXJJbmZvOworYmVnaW4KKyAgRkNhY2hlZFBlZXJBZGRyLmlwdjQuc2luX2ZhbWlseSA6PSBBRl9VTlNQRUM7CisgIEZQZWVySG9zdCA6PSAnJzsKKyAgRlBlZXJBZGRyZXNzIDo9ICcnOworICBGUGVlclBvcnQgOj0gMDsKK2VuZDsKKworcHJvY2VkdXJlIFRTb2NrZXQuQ29tbW9uSW5pdDsKK2JlZ2luCisgIGluaGVyaXRlZCBDb21tb25Jbml0OworICBGSG9zdCA6PSAnJzsKKyAgRkludGVycnVwdExpc3RlbmVyIDo9IG5pbDsKKyAgRkNvbm5UaW1lb3V0IDo9IDA7CisgIEZMaW5nZXJPbiA6PSBUcnVlOworICBGTGluZ2VyVmFsIDo9IDA7CisgIEZOb0RlbGF5IDo9IFRydWU7CisgIEZNYXhSZWN2UmV0cmllcyA6PSA1OworICBJbml0UGVlckluZm87CitlbmQ7CisKK3Byb2NlZHVyZSBUU29ja2V0Lk9wZW5Db25uZWN0aW9uKFJlczogVEJhc2VTb2NrZXQuSUdldEFkZHJJbmZvV3JhcHBlcik7CitsYWJlbAorICBEb25lOwordmFyCisgIEVycm5vQ29weTogSW50ZWdlcjsKKyAgUmV0LAorICBSZXQyOiBJbnRlZ2VyOworICBGZHM6IFRGZFNldDsKKyAgVFZhbDogVFRpbWVWYWw7CisgIFBUVmFsOiBQVGltZVZhbDsKKyAgVmFsLAorICBMb246IEludGVnZXI7CisgIE9uZSwKKyAgWmVybzogQ2FyZGluYWw7CitiZWdpbgorICBpZiBTZW5kVGltZW91dCA+IDAgdGhlbiBTZXRTZW5kVGltZW91dChTZW5kVGltZW91dCk7CisgIGlmIFJlY3ZUaW1lb3V0ID4gMCB0aGVuIFNldFJlY3ZUaW1lb3V0KFJlY3ZUaW1lb3V0KTsKKyAgaWYgS2VlcEFsaXZlIHRoZW4gU2V0S2VlcEFsaXZlKEtlZXBBbGl2ZSk7CisgIFNldExpbmdlcihGTGluZ2VyT24sIEZMaW5nZXJWYWwpOworICBTZXROb0RlbGF5KEZOb0RlbGF5KTsKKworICAvLyBTZXQgdGhlIHNvY2tldCB0byBiZSBub24gYmxvY2tpbmcgZm9yIGNvbm5lY3QgaWYgYSB0aW1lb3V0IGV4aXN0cworICBaZXJvIDo9IDA7CisgIGlmIEZDb25uVGltZW91dCA+IDAgdGhlbiBiZWdpbgorICAgIE9uZSA6PSAxOworICAgIGlmIGlvY3Rsc29ja2V0KFNvY2tldCwgSW50ZWdlcihGSU9OQklPKSwgT25lKSA9IFNPQ0tFVF9FUlJPUiB0aGVuIGJlZ2luCisgICAgICBFcnJub0NvcHkgOj0gV1NBR2V0TGFzdEVycm9yOworICAgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdUU29ja2V0Lk9wZW5Db25uZWN0aW9uKCkgaW9jdGxzb2NrZXQoKSAlcyAlcycsIFtTb2NrZXRJbmZvLCBTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZShGb3JtYXQoJ2lvY3Rsc29ja2V0KCkgZmFpbGVkOiAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgICBlbmQ7CisgIGVuZAorICBlbHNlIGJlZ2luCisgICAgaWYgaW9jdGxzb2NrZXQoU29ja2V0LCBJbnRlZ2VyKEZJT05CSU8pLCBaZXJvKSA9IFNPQ0tFVF9FUlJPUiB0aGVuIGJlZ2luCisgICAgICBFcnJub0NvcHkgOj0gV1NBR2V0TGFzdEVycm9yOworICAgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdUU29ja2V0Lk9wZW5Db25uZWN0aW9uKCkgaW9jdGxzb2NrZXQoKSAlcyAlcycsIFtTb2NrZXRJbmZvLCBTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZShGb3JtYXQoJ2lvY3Rsc29ja2V0KCkgZmFpbGVkOiAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgICBlbmQ7CisgIGVuZDsKKworICBSZXQgOj0gY29ubmVjdChTb2NrZXQsIFJlcy5SZXNeLmFpX2FkZHJeLCBSZXMuUmVzXi5haV9hZGRybGVuKTsKKyAgaWYgUmV0ID0gMCB0aGVuIGdvdG8gRG9uZTsKKworICBFcnJub0NvcHkgOj0gV1NBR2V0TGFzdEVycm9yOworICBpZiAoRXJybm9Db3B5IDw+IFdTQUVJTlBST0dSRVNTKSBhbmQgKEVycm5vQ29weSA8PiBXU0FFV09VTERCTE9DSykgdGhlbiBiZWdpbgorICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnVFNvY2tldC5PcGVuQ29ubmVjdGlvbigpIGNvbm5lY3QoKSAnLCBbU29ja2V0SW5mbywgU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKEZvcm1hdCgnY29ubmVjdCgpIGZhaWxlZDogJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgIGVuZDsKKworICBGRF9aRVJPKEZkcyk7CisgIF9GRF9TRVQoU29ja2V0LCBGZHMpOworICBpZiBGQ29ublRpbWVvdXQgPiAwIHRoZW4gYmVnaW4KKyAgICBUVmFsLnR2X3NlYyA6PSBGQ29ublRpbWVvdXQgZGl2IDEwMDA7CisgICAgVFZhbC50dl91c2VjIDo9IChGQ29ublRpbWVvdXQgbW9kIDEwMDApICogMTAwMDsKKyAgICBQVFZhbCA6PSBAVFZhbDsKKyAgZW5kCisgIGVsc2UKKyAgICBQVFZhbCA6PSBuaWw7CisgIFJldCA6PSBzZWxlY3QoMSwgbmlsLCBARmRzLCBuaWwsIFBUVmFsKTsKKworICBpZiBSZXQgPiAwIHRoZW4gYmVnaW4KKyAgICAvLyBFbnN1cmUgdGhlIHNvY2tldCBpcyBjb25uZWN0ZWQgYW5kIHRoYXQgdGhlcmUgYXJlIG5vIGVycm9ycyBzZXQKKyAgICBMb24gOj0gU2l6ZU9mKFZhbCk7CisgICAgUmV0MiA6PSBnZXRzb2Nrb3B0KFNvY2tldCwgU09MX1NPQ0tFVCwgU09fRVJST1IsIEBWYWwsIExvbik7CisgICAgaWYgUmV0MiA9IFNPQ0tFVF9FUlJPUiB0aGVuIGJlZ2luCisgICAgICBFcnJub0NvcHkgOj0gV1NBR2V0TGFzdEVycm9yOworICAgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdUU29ja2V0Lk9wZW5Db25uZWN0aW9uKCkgZ2V0c29ja29wdCgpICcsIFtTb2NrZXRJbmZvLCBTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZShGb3JtYXQoJ2dldHNvY2tvcHQoKTogJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgICAgZW5kOworICAgIC8vIG5vIGVycm9ycyBvbiBzb2NrZXQsIGdvIHRvIHRvd24KKyAgICBpZiBWYWwgPSAwIHRoZW4gZ290byBEb25lOworICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnVFNvY2tldC5PcGVuQ29ubmVjdGlvbigpIGVycm9yIG9uIHNvY2tldCAoYWZ0ZXIgc2VsZWN0KCkpICcsIFtTb2NrZXRJbmZvLCBTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoRm9ybWF0KCdzb2NrZXQgT3BlbkNvbm5lY3Rpb24oKSBlcnJvcjogJXMnLCBbU3lzRXJyb3JNZXNzYWdlKFZhbCldKSk7CisgIGVuZAorICBlbHNlIGlmIFJldCA9IDAgdGhlbiBiZWdpbgorICAgIC8vIHNvY2tldCB0aW1lZCBvdXQKKyAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1RTb2NrZXQuT3BlbkNvbm5lY3Rpb24oKSB0aW1lZCBvdXQgJywgW1NvY2tldEluZm8sIFN5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnT3BlbkNvbm5lY3Rpb24oKSB0aW1lZCBvdXQnKTsKKyAgZW5kCisgIGVsc2UgYmVnaW4KKyAgICAvLyBlcnJvciBvbiBzZWxlY3QoKQorICAgIEVycm5vQ29weSA6PSBXU0FHZXRMYXN0RXJyb3I7CisgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdUU29ja2V0Lk9wZW5Db25uZWN0aW9uKCkgc2VsZWN0KCkgJywgW1NvY2tldEluZm8sIFN5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZShGb3JtYXQoJ3NlbGVjdCgpIGZhaWxlZDogJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgIGVuZDsKKworRG9uZToKKyAgLy8gU2V0IHNvY2tldCBiYWNrIHRvIG5vcm1hbCBtb2RlIChibG9ja2luZykKKyAgaW9jdGxzb2NrZXQoU29ja2V0LCBJbnRlZ2VyKEZJT05CSU8pLCBaZXJvKTsKKyAgU2V0Q2FjaGVkQWRkcmVzcyhSZXMuUmVzXi5haV9hZGRyXiwgUmVzLlJlc14uYWlfYWRkcmxlbik7CitlbmQ7CisKK3Byb2NlZHVyZSBUU29ja2V0LkxvY2FsT3BlbjsKK3ZhcgorICBSZXM6IFRCYXNlU29ja2V0LklHZXRBZGRySW5mb1dyYXBwZXI7CitiZWdpbgorICBpZiBJc09wZW4gdGhlbiBFeGl0OworCisgIC8vIFZhbGlkYXRlIHBvcnQgbnVtYmVyCisgIGlmIChQb3J0IDwgMCkgb3IgKFBvcnQgPiAkRkZGRikgdGhlbgorICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25CYWRBcmdzLkNyZWF0ZSgnU3BlY2lmaWVkIHBvcnQgaXMgaW52YWxpZCcpOworCisgIFJlcyA6PSBDcmVhdGVTb2NrZXQoSG9zdCwgUG9ydCk7CisKKyAgT3BlbkNvbm5lY3Rpb24oUmVzKTsKK2VuZDsKKworcHJvY2VkdXJlIFRTb2NrZXQuU2V0R2VuZXJpY1RpbWVvdXQoUzogV2luYXBpLldpbnNvY2syLlRTb2NrZXQ7IFRpbWVvdXQ6IExvbmd3b3JkOyBPcHROYW1lOiBJbnRlZ2VyKTsKK3ZhcgorICBUaW1lOiBEV09SRDsKK2JlZ2luCisgIGlmIFMgPSBJTlZBTElEX1NPQ0tFVCB0aGVuCisgICAgRXhpdDsKKworICBUaW1lIDo9IFRpbWVvdXQ7CisKKyAgaWYgc2V0c29ja29wdChTLCBTT0xfU09DS0VULCBPcHROYW1lLCBAVGltZSwgU2l6ZU9mKFRpbWUpKSA9IFNPQ0tFVF9FUlJPUiB0aGVuCisgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdTZXRHZW5lcmljVGltZW91dCgpIHNldHNvY2tvcHQoKSAlcycsIFtTeXNFcnJvck1lc3NhZ2UoV1NBR2V0TGFzdEVycm9yKV0pKTsKK2VuZDsKKworZnVuY3Rpb24gVFNvY2tldC5HZXRJc09wZW46IEJvb2xlYW47CitiZWdpbgorICBSZXN1bHQgOj0gU29ja2V0IDw+IElOVkFMSURfU09DS0VUOworZW5kOworCitwcm9jZWR1cmUgVFNvY2tldC5TZXROb0RlbGF5KEFOb0RlbGF5OiBCb29sZWFuKTsKK3ZhcgorICBWOiBJbnRlZ2VyOworYmVnaW4KKyAgRk5vRGVsYXkgOj0gQU5vRGVsYXk7CisgIGlmIFNvY2tldCA9IElOVkFMSURfU09DS0VUIHRoZW4KKyAgICBFeGl0OworCisgIFYgOj0gSWZUaGVuKEZOb0RlbGF5LCAxLCAwKTsKKyAgaWYgc2V0c29ja29wdChTb2NrZXQsIElQUFJPVE9fVENQLCBUQ1BfTk9ERUxBWSwgQFYsIFNpemVPZihWKSkgPSBTT0NLRVRfRVJST1IgdGhlbgorICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnVFNvY2tldC5TZXROb0RlbGF5KCkgc2V0c29ja29wdCgpICVzICVzJywgW1NvY2tldEluZm8sIFN5c0Vycm9yTWVzc2FnZShXU0FHZXRMYXN0RXJyb3IpXSkpOworZW5kOworCitmdW5jdGlvbiBUU29ja2V0LkdldFNvY2tldEluZm86IHN0cmluZzsKK2JlZ2luCisgIGlmIChGSG9zdCA9ICcnKSBvciAoUG9ydCA9IDApIHRoZW4KKyAgICBSZXN1bHQgOj0gJzxIb3N0OiAnICsgR2V0UGVlckFkZHJlc3MgKyAnIFBvcnQ6ICcgKyBHZXRQZWVyUG9ydC5Ub1N0cmluZyArICc+JworICBlbHNlCisgICAgUmVzdWx0IDo9ICc8SG9zdDogJyArIEZIb3N0ICsgJyBQb3J0OiAnICsgUG9ydC5Ub1N0cmluZyArICc+JzsKK2VuZDsKKworZnVuY3Rpb24gVFNvY2tldC5HZXRQZWVySG9zdDogc3RyaW5nOwordmFyCisgIEFkZHI6IFRTb2NrQWRkclN0b3JhZ2U7CisgIEFkZHJQdHI6IFBTb2NrQWRkcjsKKyAgQWRkckxlbjogSW50ZWdlcjsKKyAgQ2xpZW50SG9zdDogYXJyYXlbMC4uTklfTUFYSE9TVC0xXSBvZiBDaGFyOworICBDbGllbnRTZXJ2aWNlOiBhcnJheVswLi5OSV9NQVhTRVJWLTFdIG9mIENoYXI7CitiZWdpbgorICBpZiBGUGVlckhvc3QgPSAnJyB0aGVuIGJlZ2luCisgICAgaWYgU29ja2V0ID0gSU5WQUxJRF9TT0NLRVQgdGhlbgorICAgICAgRXhpdChGUGVlckhvc3QpOworCisgICAgQWRkclB0ciA6PSBHZXRDYWNoZWRBZGRyZXNzKEFkZHJMZW4pOworICAgIGlmIEFkZHJQdHIgPSBuaWwgdGhlbiBiZWdpbgorICAgICAgQWRkckxlbiA6PSBTaXplT2YoQWRkcik7CisgICAgICBpZiBnZXRwZWVybmFtZShTb2NrZXQsIFBTb2NrQWRkcihAQWRkcileLCBBZGRyTGVuKSA8PiAwIHRoZW4KKyAgICAgICAgRXhpdChGUGVlckhvc3QpOworICAgICAgQWRkclB0ciA6PSBQU29ja0FkZHIoQEFkZHIpOworICAgICAgU2V0Q2FjaGVkQWRkcmVzcyhBZGRyUHRyXiwgQWRkckxlbik7CisgICAgZW5kOworCisgICAgR2V0TmFtZUluZm9XKEFkZHJQdHJeLCBBZGRyTGVuLCBDbGllbnRIb3N0LCBOSV9NQVhIT1NULCBDbGllbnRTZXJ2aWNlLCBOSV9NQVhTRVJWLCAwKTsKKyAgICBGUGVlckhvc3QgOj0gQ2xpZW50SG9zdDsKKyAgZW5kOworICBSZXN1bHQgOj0gRlBlZXJIb3N0OworZW5kOworCitmdW5jdGlvbiBUU29ja2V0LkdldFBlZXJBZGRyZXNzOiBzdHJpbmc7Cit2YXIKKyAgQWRkcjogVFNvY2tBZGRyU3RvcmFnZTsKKyAgQWRkclB0cjogUFNvY2tBZGRyOworICBBZGRyTGVuOiBJbnRlZ2VyOworICBDbGllbnRIb3N0OiBhcnJheVswLi5OSV9NQVhIT1NULTFdIG9mIENoYXI7CisgIENsaWVudFNlcnZpY2U6IGFycmF5WzAuLk5JX01BWFNFUlYtMV0gb2YgQ2hhcjsKK2JlZ2luCisgIGlmIEZQZWVyQWRkcmVzcyA9ICcnIHRoZW4gYmVnaW4KKyAgICBpZiBTb2NrZXQgPSBJTlZBTElEX1NPQ0tFVCB0aGVuCisgICAgICBFeGl0KEZQZWVyQWRkcmVzcyk7CisKKyAgICBBZGRyUHRyIDo9IEdldENhY2hlZEFkZHJlc3MoQWRkckxlbik7CisgICAgaWYgQWRkclB0ciA9IG5pbCB0aGVuIGJlZ2luCisgICAgICBBZGRyTGVuIDo9IFNpemVPZihBZGRyKTsKKyAgICAgIGlmIGdldHBlZXJuYW1lKFNvY2tldCwgUFNvY2tBZGRyKEBBZGRyKV4sIEFkZHJMZW4pIDw+IDAgdGhlbgorICAgICAgICBFeGl0KEZQZWVySG9zdCk7CisgICAgICBBZGRyUHRyIDo9IFBTb2NrQWRkcihAQWRkcik7CisgICAgICBTZXRDYWNoZWRBZGRyZXNzKEFkZHJQdHJeLCBBZGRyTGVuKTsKKyAgICBlbmQ7CisKKyAgICBHZXROYW1lSW5mb1coQWRkclB0cl4sIEFkZHJMZW4sIENsaWVudEhvc3QsIE5JX01BWEhPU1QsIENsaWVudFNlcnZpY2UsIE5JX01BWFNFUlYsIE5JX05VTUVSSUNIT1NUIG9yIE5JX05VTUVSSUNTRVJWKTsKKyAgICBGUGVlckFkZHJlc3MgOj0gQ2xpZW50SG9zdDsKKyAgICBUcnlTdHJUb0ludChDbGllbnRTZXJ2aWNlLCBGUGVlclBvcnQpOworICBlbmQ7CisgIFJlc3VsdCA6PSBGUGVlckFkZHJlc3MKK2VuZDsKKworZnVuY3Rpb24gVFNvY2tldC5HZXRQZWVyUG9ydDogSW50ZWdlcjsKK2JlZ2luCisgIEdldFBlZXJBZGRyZXNzOworICBSZXN1bHQgOj0gRlBlZXJQb3J0OworZW5kOworCitmdW5jdGlvbiBUU29ja2V0LkdldE9yaWdpbjogc3RyaW5nOworYmVnaW4KKyAgUmVzdWx0IDo9IEdldFBlZXJIb3N0ICsgJzonICsgR2V0UGVlclBvcnQuVG9TdHJpbmc7CitlbmQ7CisKK3Byb2NlZHVyZSBUU29ja2V0LlNldFJlY3ZUaW1lb3V0KEFSZWN2VGltZW91dDogTG9uZ3dvcmQpOworYmVnaW4KKyAgaW5oZXJpdGVkIFNldFJlY3ZUaW1lb3V0KEFSZWN2VGltZW91dCk7CisgIFNldEdlbmVyaWNUaW1lb3V0KFNvY2tldCwgQVJlY3ZUaW1lb3V0LCBTT19SQ1ZUSU1FTyk7CitlbmQ7CisKK3Byb2NlZHVyZSBUU29ja2V0LlNldFNlbmRUaW1lb3V0KEFTZW5kVGltZW91dDogTG9uZ3dvcmQpOworYmVnaW4KKyAgaW5oZXJpdGVkIFNldFNlbmRUaW1lb3V0KEFTZW5kVGltZW91dCk7CisgIFNldEdlbmVyaWNUaW1lb3V0KFNvY2tldCwgQVNlbmRUaW1lb3V0LCBTT19TTkRUSU1FTyk7CitlbmQ7CisKK3Byb2NlZHVyZSBUU29ja2V0LlNldEtlZXBBbGl2ZShBS2VlcEFsaXZlOiBCb29sZWFuKTsKK3ZhcgorICBWYWx1ZTogSW50ZWdlcjsKK2JlZ2luCisgIGluaGVyaXRlZCBTZXRLZWVwQWxpdmUoQUtlZXBBbGl2ZSk7CisKKyAgVmFsdWUgOj0gSWZUaGVuKEtlZXBBbGl2ZSwgMSwgMCk7CisgIGlmIHNldHNvY2tvcHQoU29ja2V0LCBTT0xfU09DS0VULCBTT19LRUVQQUxJVkUsIEBWYWx1ZSwgU2l6ZU9mKFZhbHVlKSkgPSBTT0NLRVRfRVJST1IgdGhlbgorICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnVFNvY2tldC5TZXRLZWVwQWxpdmUoKSBzZXRzb2Nrb3B0KCkgJXMgJXMnLCBbU29ja2V0SW5mbywgU3lzRXJyb3JNZXNzYWdlKFdTQUdldExhc3RFcnJvcildKSk7CitlbmQ7CisKK2NvbnN0cnVjdG9yIFRTb2NrZXQuQ3JlYXRlKEFMb2dEZWxlZ2F0ZTogVEJhc2VTb2NrZXQuVExvZ0RlbGVnYXRlID0gbmlsKTsKK2JlZ2luCisgIC8vIE5vdCBuZWVkZWQsIGJ1dCBqdXN0IGEgcGxhY2Vob2xkZXIKKyAgaW5oZXJpdGVkIENyZWF0ZShBTG9nRGVsZWdhdGUpOworZW5kOworCitjb25zdHJ1Y3RvciBUU29ja2V0LkNyZWF0ZShBSG9zdDogc3RyaW5nOyBBUG9ydDogSW50ZWdlcjsgQUxvZ0RlbGVnYXRlOiBUQmFzZVNvY2tldC5UTG9nRGVsZWdhdGUpOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZShBUG9ydCwgQUxvZ0RlbGVnYXRlKTsKKyAgRkhvc3QgOj0gQUhvc3Q7CitlbmQ7CisKK2NvbnN0cnVjdG9yIFRTb2NrZXQuQ3JlYXRlKEFTb2NrZXQ6IFdpbmFwaS5XaW5zb2NrMi5UU29ja2V0OyBBTG9nRGVsZWdhdGU6IFRCYXNlU29ja2V0LlRMb2dEZWxlZ2F0ZSk7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlKEFMb2dEZWxlZ2F0ZSk7CisgIFNvY2tldCA6PSBBU29ja2V0OworZW5kOworCitjb25zdHJ1Y3RvciBUU29ja2V0LkNyZWF0ZShBU29ja2V0OiBXaW5hcGkuV2luc29jazIuVFNvY2tldDsgQUludGVycnVwdExpc3RlbmVyOiBJU21hcnRQb2ludGVyPFdpbmFwaS5XaW5zb2NrMi5UU29ja2V0PjsKKyAgQUxvZ0RlbGVnYXRlOiBUQmFzZVNvY2tldC5UTG9nRGVsZWdhdGUpOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZShBTG9nRGVsZWdhdGUpOworICBTb2NrZXQgOj0gQVNvY2tldDsKKyAgRkludGVycnVwdExpc3RlbmVyIDo9IEFJbnRlcnJ1cHRMaXN0ZW5lcjsKK2VuZDsKKworcHJvY2VkdXJlIFRTb2NrZXQuT3BlbjsKK2JlZ2luCisgIGlmIElzT3BlbiB0aGVuIEV4aXQ7CisgIExvY2FsT3BlbjsKK2VuZDsKKworcHJvY2VkdXJlIFRTb2NrZXQuQ2xvc2U7CitiZWdpbgorICBpbmhlcml0ZWQgQ2xvc2U7CisgIEluaXRQZWVySW5mbzsKK2VuZDsKKworZnVuY3Rpb24gVFNvY2tldC5SZWFkKHZhciBCdWY7IExlbjogSW50ZWdlcik6IEludGVnZXI7CitsYWJlbAorICBUcnlBZ2FpbjsKK3ZhcgorICBSZXRyaWVzOiBMb25nd29yZDsKKyAgRUFnYWluVGhyZXNob2xkLAorICBSZWFkRWxhcHNlZDogVUludDY0OworICBTdGFydDogVERhdGVUaW1lOworICBHb3Q6IEludGVnZXI7CisgIEZkczogVEZkU2V0OworICBFcnJub0NvcHk6IEludGVnZXI7CisgIFRWYWw6IFRUaW1lVmFsOworICBQVFZhbDogUFRpbWVWYWw7CisgIFJldDogSW50ZWdlcjsKK2JlZ2luCisgIGlmIFNvY2tldCA9IElOVkFMSURfU09DS0VUIHRoZW4KKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoJ0NhbGxlZCByZWFkIG9uIG5vbi1vcGVuIHNvY2tldCcpOworCisgIFJldHJpZXMgOj0gMDsKKworICAvLyBUSFJJRlRfRUFHQUlOIGNhbiBiZSBzaWduYWxsZWQgYm90aCB3aGVuIGEgdGltZW91dCBoYXMgb2NjdXJyZWQgYW5kIHdoZW4KKyAgLy8gdGhlIHN5c3RlbSBpcyBvdXQgb2YgcmVzb3VyY2VzIChhbiBhd2Vzb21lIHVuZG9jdW1lbnRlZCBmZWF0dXJlKS4KKyAgLy8gVGhlIGZvbGxvd2luZyBpcyBhbiBhcHByb3hpbWF0aW9uIG9mIHRoZSB0aW1lIGludGVydmFsIHVuZGVyIHdoaWNoCisgIC8vIFRIUklGVF9FQUdBSU4gaXMgdGFrZW4gdG8gaW5kaWNhdGUgYW4gb3V0IG9mIHJlc291cmNlcyBlcnJvci4KKyAgRUFnYWluVGhyZXNob2xkIDo9IDA7CisgIGlmIFJlY3ZUaW1lb3V0IDw+IDAgdGhlbgorICAgIC8vIGlmIGEgcmVhZFRpbWVvdXQgaXMgc3BlY2lmaWVkIGFsb25nIHdpdGggYSBtYXggbnVtYmVyIG9mIHJlY3YgcmV0cmllcywgdGhlbgorICAgIC8vIHRoZSB0aHJlc2hvbGQgd2lsbCBlbnN1cmUgdGhhdCB0aGUgcmVhZCB0aW1lb3V0IGlzIG5vdCBleGNlZWRlZCBldmVuIGluIHRoZQorICAgIC8vIGNhc2Ugb2YgcmVzb3VyY2UgZXJyb3JzCisgICAgRUFnYWluVGhyZXNob2xkIDo9IFJlY3ZUaW1lb3V0IGRpdiBJZlRoZW4oRk1heFJlY3ZSZXRyaWVzID4gMCwgRk1heFJlY3ZSZXRyaWVzLCAyKTsKKworVHJ5QWdhaW46CisgIC8vIFJlYWQgZnJvbSB0aGUgc29ja2V0CisgIGlmIFJlY3ZUaW1lb3V0ID4gMCB0aGVuCisgICAgU3RhcnQgOj0gTm93CisgIGVsc2UKKyAgICAvLyBpZiB0aGVyZSBpcyBubyByZWFkIHRpbWVvdXQgd2UgZG9uJ3QgbmVlZCB0aGUgVE9EIHRvIGRldGVybWluZSB3aGV0aGVyCisgICAgLy8gYW4gVEhSSUZUX0VBR0FJTiBpcyBkdWUgdG8gYSB0aW1lb3V0IG9yIGFuIG91dC1vZi1yZXNvdXJjZSBjb25kaXRpb24uCisgICAgU3RhcnQgOj0gMDsKKworICBpZiBBc3NpZ25lZChGSW50ZXJydXB0TGlzdGVuZXIpIHRoZW4gYmVnaW4KKyAgICBGRF9aRVJPKEZkcyk7CisgICAgX0ZEX1NFVChTb2NrZXQsIEZkcyk7CisgICAgX0ZEX1NFVChGSW50ZXJydXB0TGlzdGVuZXIsIEZkcyk7CisgICAgaWYgUmVjdlRpbWVvdXQgPiAwIHRoZW4gYmVnaW4KKyAgICAgIFRWYWwudHZfc2VjIDo9IFJlY3ZUaW1lb3V0IGRpdiAxMDAwOworICAgICAgVFZhbC50dl91c2VjIDo9IChSZWN2VGltZW91dCBtb2QgMTAwMCkgKiAxMDAwOworICAgICAgUFRWYWwgOj0gQFRWYWw7CisgICAgZW5kCisgICAgZWxzZQorICAgICAgUFRWYWwgOj0gbmlsOworCisgICAgUmV0IDo9IHNlbGVjdCgyLCBARmRzLCBuaWwsIG5pbCwgUFRWYWwpOworICAgIEVycm5vQ29weSA6PSBXU0FHZXRMYXN0RXJyb3I7CisgICAgaWYgUmV0IDwgMCB0aGVuIGJlZ2luCisgICAgICAvLyBlcnJvciBjYXNlcworICAgICAgaWYgKEVycm5vQ29weSA9IFdTQUVJTlRSKSBhbmQgKFJldHJpZXMgPCBGTWF4UmVjdlJldHJpZXMpIHRoZW4gYmVnaW4KKyAgICAgICAgSW5jKFJldHJpZXMpOworICAgICAgICBnb3RvIFRyeUFnYWluOworICAgICAgZW5kOworICAgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdUU29ja2V0LlJlYWQoKSBzZWxlY3QoKSAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Vbmtub3duLkNyZWF0ZShGb3JtYXQoJ1Vua25vd246ICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICAgIGVuZAorICAgIGVsc2UgaWYgUmV0ID4gMCB0aGVuIGJlZ2luCisgICAgICAvLyBDaGVjayB0aGUgaW50ZXJydXB0TGlzdGVuZXIKKyAgICAgIGlmIEZEX0lTU0VUKEZJbnRlcnJ1cHRMaXN0ZW5lciwgRmRzKSB0aGVuCisgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25JbnRlcnJ1cHRlZC5DcmVhdGUoJ0ludGVycnVwdGVkJyk7CisgICAgZW5kCisgICAgZWxzZSAvLyBSZXQgPSAwCisgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVGltZWRPdXQuQ3JlYXRlKCdXU0FFV09VTERCTE9DSyAodGltZWQgb3V0KScpOworCisgICAgLy8gZmFsbGluZyB0aHJvdWdoIG1lYW5zIHRoZXJlIGlzIHNvbWV0aGluZyB0byByZWN2IGFuZCBpdCBjYW5ub3QgYmxvY2sKKyAgZW5kOworCisgIEdvdCA6PSByZWN2KFNvY2tldCwgQnVmLCBMZW4sIDApOworICBFcnJub0NvcHkgOj0gV1NBR2V0TGFzdEVycm9yOworICAvLyBDaGVjayBmb3IgZXJyb3Igb24gcmVhZAorICBpZiBHb3QgPCAwIHRoZW4gYmVnaW4KKyAgICBpZiBFcnJub0NvcHkgPSBXU0FFV09VTERCTE9DSyB0aGVuIGJlZ2luCisgICAgICAvLyBpZiBubyB0aW1lb3V0IHdlIGNhbiBhc3N1bWUgdGhhdCByZXNvdXJjZSBleGhhdXN0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgIGlmIFJlY3ZUaW1lb3V0ID0gMCB0aGVuCisgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25UaW1lZE91dC5DcmVhdGUoJ1dTQUVXT1VMREJMT0NLICh1bmF2YWlsYWJsZSByZXNvdXJjZXMpJyk7CisgICAgICAvLyBjaGVjayBpZiB0aGlzIGlzIHRoZSBsYWNrIG9mIHJlc291cmNlcyBvciB0aW1lb3V0IGNhc2UKKyAgICAgIFJlYWRFbGFwc2VkIDo9IE1pbGxpU2Vjb25kc0JldHdlZW4oTm93LCBTdGFydCk7CisgICAgICBpZiAoRUFnYWluVGhyZXNob2xkID0gMCkgb3IgKFJlYWRFbGFwc2VkIDwgRUFnYWluVGhyZXNob2xkKSB0aGVuIGJlZ2luCisgICAgICAgIGlmIFJldHJpZXMgPCBGTWF4UmVjdlJldHJpZXMgdGhlbiBiZWdpbgorICAgICAgICAgIEluYyhSZXRyaWVzKTsKKyAgICAgICAgICBTbGVlcCgxKTsKKyAgICAgICAgICBnb3RvIFRyeUFnYWluOworICAgICAgICBlbmQKKyAgICAgICAgZWxzZQorICAgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25UaW1lZE91dC5DcmVhdGUoJ1dTQUVXT1VMREJMT0NLICh1bmF2YWlsYWJsZSByZXNvdXJjZXMpJyk7CisgICAgICBlbmQKKyAgICAgIGVsc2UKKyAgICAgICAgLy8gaW5mZXIgdGhhdCB0aW1lb3V0IGhhcyBiZWVuIGhpdAorICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVGltZWRPdXQuQ3JlYXRlKCdXU0FFV09VTERCTE9DSyAodGltZWQgb3V0KScpOworICAgIGVuZDsKKworICAgIC8vIElmIGludGVycnVwdGVkLCB0cnkgYWdhaW4KKyAgICBpZiAoRXJybm9Db3B5ID0gV1NBRUlOVFIpIGFuZCAoUmV0cmllcyA8IEZNYXhSZWN2UmV0cmllcykgdGhlbiBiZWdpbgorICAgICAgSW5jKFJldHJpZXMpOworICAgICAgZ290byBUcnlBZ2FpbjsKKyAgICBlbmQ7CisKKyAgICBpZiBFcnJub0NvcHkgPSBXU0FFQ09OTlJFU0VUIHRoZW4KKyAgICAgIEV4aXQoMCk7CisKKyAgICAvLyBUaGlzIGlzaCBpc24ndCBvcGVuCisgICAgaWYgRXJybm9Db3B5ID0gV1NBRU5PVENPTk4gdGhlbgorICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdXU0FFTk9UQ09OTicpOworCisgICAgLy8gVGltZWQgb3V0IQorICAgIGlmIEVycm5vQ29weSA9IFdTQUVUSU1FRE9VVCB0aGVuCisgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoJ1dTQUVUSU1FRE9VVCcpOworCisgICAgLy8gTm93IGl0J3Mgbm90IGEgdHJ5IGFnYWluIGNhc2UsIGJ1dCBhIHJlYWwgcHJvYmJsZXoKKyAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1RTb2NrZXQuUmVhZCgpIHJlY3YoKSAlcyAlcycsIFtTb2NrZXRJbmZvLCBTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKworICAgIC8vIFNvbWUgb3RoZXIgZXJyb3IsIHdoYXRldnoKKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVW5rbm93bi5DcmVhdGUoRm9ybWF0KCdVbmtub3duOiAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgZW5kOworCisgIFJlc3VsdCA6PSBHb3Q7CitlbmQ7CisKK3Byb2NlZHVyZSBUU29ja2V0LldyaXRlKGNvbnN0IEJ1ZjsgTGVuOiBJbnRlZ2VyKTsKK3ZhcgorICBTZW50LCBCOiBJbnRlZ2VyOworYmVnaW4KKyAgU2VudCA6PSAwOworICB3aGlsZSBTZW50IDwgTGVuIGRvIGJlZ2luCisgICAgQiA6PSBXcml0ZVBhcnRpYWwoKFBCeXRlKEBCdWYpICsgU2VudCleLCBMZW4gLSBTZW50KTsKKyAgICBpZiBCID0gMCB0aGVuCisgICAgICAvLyBUaGlzIHNob3VsZCBvbmx5IGhhcHBlbiBpZiB0aGUgdGltZW91dCBzZXQgd2l0aCBTT19TTkRUSU1FTyBleHBpcmVkLgorICAgICAgLy8gUmFpc2UgYW4gZXhjZXB0aW9uLgorICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblRpbWVkT3V0LkNyZWF0ZSgnc2VuZCB0aW1lb3V0IGV4cGlyZWQnKTsKKyAgICBJbmMoU2VudCwgQik7CisgIGVuZDsKK2VuZDsKKworZnVuY3Rpb24gVFNvY2tldC5Xcml0ZVBhcnRpYWwoY29uc3QgQnVmOyBMZW46IEludGVnZXIpOiBJbnRlZ2VyOwordmFyCisgIEI6IEludGVnZXI7CisgIEVycm5vQ29weTogSW50ZWdlcjsKK2JlZ2luCisgIGlmIFNvY2tldCA9IElOVkFMSURfU09DS0VUIHRoZW4KKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoJ0NhbGxlZCB3cml0ZSBvbiBub24tb3BlbiBzb2NrZXQnKTsKKworICBCIDo9IHNlbmQoU29ja2V0LCBCdWYsIExlbiwgMCk7CisKKyAgaWYgQiA8IDAgdGhlbiBiZWdpbgorICAgIC8vIEZhaWwgb24gYSBzZW5kIGVycm9yCisgICAgRXJybm9Db3B5IDo9IFdTQUdldExhc3RFcnJvcjsKKyAgICBpZiBFcnJub0NvcHkgPSBXU0FFV09VTERCTE9DSyB0aGVuCisgICAgICBFeGl0KDApOworCisgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdUU29ja2V0LldyaXRlUGFydGlhbCgpIHNlbmQoKSAlcyAlcycsIFtTb2NrZXRJbmZvLCBTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKworICAgIGlmIChFcnJub0NvcHkgPSBXU0FFQ09OTlJFU0VUKSBvciAoRXJybm9Db3B5ID0gV1NBRU5PVENPTk4pIHRoZW4gYmVnaW4KKyAgICAgIENsb3NlOworICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKEZvcm1hdCgnd3JpdGUoKSBzZW5kKCk6ICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICAgIGVuZDsKKworICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Vbmtub3duLkNyZWF0ZShGb3JtYXQoJ3dyaXRlKCkgc2VuZCgpOiAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgZW5kOworCisgIC8vIEZhaWwgb24gYmxvY2tlZCBzZW5kCisgIGlmIEIgPSAwIHRoZW4KKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoJ1NvY2tldCBzZW5kIHJldHVybmVkIDAuJyk7CisKKyAgUmVzdWx0IDo9IEI7CitlbmQ7CisKK2Z1bmN0aW9uIFRTb2NrZXQuR2V0Q2FjaGVkQWRkcmVzcyhvdXQgTGVuOiBJbnRlZ2VyKTogUFNvY2tBZGRyOworYmVnaW4KKyAgY2FzZSBGQ2FjaGVkUGVlckFkZHIuaXB2NC5zaW5fZmFtaWx5IG9mCisgICAgQUZfSU5FVDogYmVnaW4KKyAgICAgIExlbiA6PSBTaXplT2YoVFNvY2tBZGRySW4pOworICAgICAgUmVzdWx0IDo9IFBTb2NrQWRkcihARkNhY2hlZFBlZXJBZGRyLmlwdjQpOworICAgIGVuZDsKKyAgICBBRl9JTkVUNjogYmVnaW4KKyAgICAgIExlbiA6PSBTaXplT2YoVFNvY2tBZGRySW42KTsKKyAgICAgIFJlc3VsdCA6PSBQU29ja0FkZHIoQEZDYWNoZWRQZWVyQWRkci5pcHY2KTsKKyAgICBlbmQ7CisgIGVsc2UKKyAgICBMZW4gOj0gMDsKKyAgICBSZXN1bHQgOj0gbmlsOworICBlbmQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUU29ja2V0LlNldENhY2hlZEFkZHJlc3MoY29uc3QgQWRkcjogVFNvY2tBZGRyOyBMZW46IEludGVnZXIpOworYmVnaW4KKyAgY2FzZSBBZGRyLnNhX2ZhbWlseSBvZgorICAgIEFGX0lORVQ6IGlmIExlbiA9IFNpemVPZihUU29ja0FkZHJJbikgdGhlbiBGQ2FjaGVkUGVlckFkZHIuaXB2NCA6PSBQU29ja0FkZHJJbihAQWRkcileOworICAgIEFGX0lORVQ2OiBpZiBMZW4gPSBTaXplT2YoVFNvY2tBZGRySW42KSB0aGVuIEZDYWNoZWRQZWVyQWRkci5pcHY2IDo9IFBTb2NrQWRkckluNihAQWRkcileOworICBlbmQ7CisgIEZQZWVyQWRkcmVzcyA6PSAnJzsKKyAgRlBlZXJIb3N0IDo9ICcnOworICBGUGVlclBvcnQgOj0gMDsKK2VuZDsKKworcHJvY2VkdXJlIFRTb2NrZXQuU2V0TGluZ2VyKExpbmdlck9uOiBCb29sZWFuOyBMaW5nZXJWYWw6IEludGVnZXIpOwordmFyCisgIEw6IFRMaW5nZXI7CitiZWdpbgorICBGTGluZ2VyT24gOj0gTGluZ2VyT247CisgIEZMaW5nZXJWYWwgOj0gTGluZ2VyVmFsOworICBpZiBTb2NrZXQgPSBJTlZBTElEX1NPQ0tFVCB0aGVuCisgICAgRXhpdDsKKworICBMLmxfb25vZmYgOj0gSWZUaGVuKEZMaW5nZXJPbiwgMSwgMCk7CisgIEwubF9saW5nZXIgOj0gTGluZ2VyVmFsOworCisgIGlmIHNldHNvY2tvcHQoU29ja2V0LCBTT0xfU09DS0VULCBTT19MSU5HRVIsIEBMLCBTaXplT2YoTCkpID0gU09DS0VUX0VSUk9SIHRoZW4KKyAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1RTb2NrZXQuU2V0TGluZ2VyKCkgc2V0c29ja29wdCgpICVzICVzJywgW1NvY2tldEluZm8sIFN5c0Vycm9yTWVzc2FnZShXU0FHZXRMYXN0RXJyb3IpXSkpOworZW5kOworCitmdW5jdGlvbiBUU29ja2V0LlBlZWs6IEJvb2xlYW47Cit2YXIKKyAgUmV0cmllczogTG9uZ3dvcmQ7CisgIEZkczogVEZkU2V0OworICBUVmFsOiBUVGltZVZhbDsKKyAgUFRWYWw6IFBUaW1lVmFsOworICBSZXQ6IEludGVnZXI7CisgIEVycm5vQ29weTogSW50ZWdlcjsKKyAgQnVmOiBCeXRlOworYmVnaW4KKyAgaWYgbm90IElzT3BlbiB0aGVuIEV4aXQoRmFsc2UpOworCisgIGlmIEFzc2lnbmVkKEZJbnRlcnJ1cHRMaXN0ZW5lcikgdGhlbiBiZWdpbgorICAgIFJldHJpZXMgOj0gMDsKKyAgICB3aGlsZSB0cnVlIGRvIGJlZ2luCisgICAgICBGRF9aRVJPKEZkcyk7CisgICAgICBfRkRfU0VUKFNvY2tldCwgRmRzKTsKKyAgICAgIF9GRF9TRVQoRkludGVycnVwdExpc3RlbmVyLCBGZHMpOworICAgICAgaWYgUmVjdlRpbWVvdXQgPiAwIHRoZW4gYmVnaW4KKyAgICAgICAgVFZhbC50dl9zZWMgOj0gUmVjdlRpbWVvdXQgZGl2IDEwMDA7CisgICAgICAgIFRWYWwudHZfdXNlYyA6PSAoUmVjdlRpbWVvdXQgbW9kIDEwMDApICogMTAwMDsKKyAgICAgICAgUFRWYWwgOj0gQFRWYWw7CisgICAgICBlbmQKKyAgICAgIGVsc2UKKyAgICAgICAgUFRWYWwgOj0gbmlsOworCisgICAgICBSZXQgOj0gc2VsZWN0KDIsIEBGZHMsIG5pbCwgbmlsLCBQVFZhbCk7CisgICAgICBFcnJub0NvcHkgOj0gV1NBR2V0TGFzdEVycm9yOworICAgICAgaWYgUmV0IDwgMCB0aGVuIGJlZ2luCisgICAgICAgIC8vIGVycm9yIGNhc2VzCisgICAgICAgIGlmIChFcnJub0NvcHkgPSBXU0FFSU5UUikgYW5kIChSZXRyaWVzIDwgRk1heFJlY3ZSZXRyaWVzKSB0aGVuIGJlZ2luCisgICAgICAgICAgSW5jKFJldHJpZXMpOworICAgICAgICAgIENvbnRpbnVlOworICAgICAgICBlbmQ7CisgICAgICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnVFNvY2tldC5QZWVrKCkgc2VsZWN0KCkgJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Vbmtub3duLkNyZWF0ZShGb3JtYXQoJ1Vua25vd246ICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICAgICAgZW5kCisgICAgICBlbHNlIGlmIFJldCA+IDAgdGhlbiBiZWdpbgorICAgICAgICAvLyBDaGVjayB0aGUgaW50ZXJydXB0TGlzdGVuZXIKKyAgICAgICAgaWYgRkRfSVNTRVQoRkludGVycnVwdExpc3RlbmVyLCBGZHMpIHRoZW4KKyAgICAgICAgICBFeGl0KEZhbHNlKTsKKyAgICAgICAgLy8gVGhlcmUgbXVzdCBiZSBkYXRhIG9yIGEgZGlzY29ubmVjdGlvbiwgZmFsbCB0aHJvdWdoIHRvIHRoZSBQRUVLCisgICAgICAgIEJyZWFrOworICAgICAgZW5kCisgICAgICBlbHNlCisgICAgICAgIC8vIHRpbWVvdXQKKyAgICAgICAgRXhpdChGYWxzZSk7CisgICAgZW5kOworICBlbmQ7CisKKyAgLy8gQ2hlY2sgdG8gc2VlIGlmIGRhdGEgaXMgYXZhaWxhYmxlIG9yIGlmIHRoZSByZW1vdGUgc2lkZSBjbG9zZWQKKyAgUmV0IDo9IHJlY3YoU29ja2V0LCBCdWYsIDEsIE1TR19QRUVLKTsKKyAgaWYgUmV0ID0gU09DS0VUX0VSUk9SIHRoZW4gYmVnaW4KKyAgICBFcnJub0NvcHkgOj0gV1NBR2V0TGFzdEVycm9yOworICAgIGlmIEVycm5vQ29weSA9IFdTQUVDT05OUkVTRVQgdGhlbiBiZWdpbgorICAgICAgQ2xvc2U7CisgICAgICBFeGl0KEZhbHNlKTsKKyAgICBlbmQ7CisgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdUU29ja2V0LlBlZWsoKSByZWN2KCkgJXMgJXMnLCBbU29ja2V0SW5mbywgU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblVua25vd24uQ3JlYXRlKEZvcm1hdCgncmVjdigpOiAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgZW5kOworICBSZXN1bHQgOj0gUmV0ID4gMDsKK2VuZDsKKworZnVuY3Rpb24gVFNlcnZlclNvY2tldC5DcmVhdGVTb2NrZXRPYmooQ2xpZW50OiBXaW5hcGkuV2luc29jazIuVFNvY2tldCk6IFRTb2NrZXQ7CitiZWdpbgorICBpZiBGSW50ZXJydXB0YWJsZUNoaWxkcmVuIHRoZW4KKyAgICBSZXN1bHQgOj0gVFNvY2tldC5DcmVhdGUoQ2xpZW50LCBGQ2hpbGRJbnRlcnJ1cHRTb2NrUmVhZGVyKQorICBlbHNlCisgICAgUmVzdWx0IDo9IFRTb2NrZXQuQ3JlYXRlKENsaWVudCk7CitlbmQ7CisKK3Byb2NlZHVyZSBUU2VydmVyU29ja2V0Lk5vdGlmeShOb3RpZnlTb2NrZXQ6IFdpbmFwaS5XaW5zb2NrMi5UU29ja2V0KTsKK3ZhcgorICBCeXQ6IEJ5dGU7CitiZWdpbgorICBpZiBOb3RpZnlTb2NrZXQgPD4gSU5WQUxJRF9TT0NLRVQgdGhlbiBiZWdpbgorICAgIEJ5dCA6PSAwOworICAgIGlmIHNlbmQoTm90aWZ5U29ja2V0LCBCeXQsIFNpemVPZihCeXQpLCAwKSA9IFNPQ0tFVF9FUlJPUiB0aGVuCisgICAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1RTZXJ2ZXJTb2NrZXQuTm90aWZ5KCkgc2VuZCgpICVzJywgW1N5c0Vycm9yTWVzc2FnZShXU0FHZXRMYXN0RXJyb3IpXSkpOworICBlbmQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUU2VydmVyU29ja2V0LlNldEludGVycnVwdGFibGVDaGlsZHJlbihBVmFsdWU6IEJvb2xlYW4pOworYmVnaW4KKyAgaWYgRkxpc3RlbmluZyB0aGVuCisgICAgcmFpc2UgRXhjZXB0aW9uLkNyZWF0ZSgnSW50ZXJydXB0YWJsZUNoaWxkcmVuIGNhbm5vdCBiZSBzZXQgYWZ0ZXIgbGlzdGVuKCknKTsKKyAgRkludGVycnVwdGFibGVDaGlsZHJlbiA6PSBBVmFsdWU7CitlbmQ7CisKK3Byb2NlZHVyZSBUU2VydmVyU29ja2V0LkNvbW1vbkluaXQ7CitiZWdpbgorICBpbmhlcml0ZWQgQ29tbW9uSW5pdDsKKyAgRkludGVycnVwdGFibGVDaGlsZHJlbiA6PSBUcnVlOworICBGQWNjZXB0QmFja2xvZyA6PSBERUZBVUxUX0JBQ0tMT0c7CisgIEZBY2NlcHRUaW1lb3V0IDo9IDA7CisgIEZSZXRyeUxpbWl0IDo9IDA7CisgIEZSZXRyeURlbGF5IDo9IDA7CisgIEZUY3BTZW5kQnVmZmVyIDo9IDA7CisgIEZUY3BSZWN2QnVmZmVyIDo9IDA7CisgIEZMaXN0ZW5pbmcgOj0gRmFsc2U7CisgIEZJbnRlcnJ1cHRTb2NrV3JpdGVyIDo9IElOVkFMSURfU09DS0VUOworICBGSW50ZXJydXB0U29ja1JlYWRlciA6PSBJTlZBTElEX1NPQ0tFVDsKKyAgRkNoaWxkSW50ZXJydXB0U29ja1dyaXRlciA6PSBJTlZBTElEX1NPQ0tFVDsKK2VuZDsKKworY29uc3RydWN0b3IgVFNlcnZlclNvY2tldC5DcmVhdGUoQVBvcnQ6IEludGVnZXI7IEFMb2dEZWxlZ2F0ZTogVEJhc2VTb2NrZXQuVExvZ0RlbGVnYXRlID0gbmlsKTsKK2JlZ2luCisgIC8vIFVubmVjZXNzYXJ5LCBidXQgaGVyZSBmb3IgZG9jdW1lbnRhdGlvbiBwdXJwb3NlcworICBpbmhlcml0ZWQgQ3JlYXRlKEFQb3J0LCBBTG9nRGVsZWdhdGUpOworZW5kOworCitjb25zdHJ1Y3RvciBUU2VydmVyU29ja2V0LkNyZWF0ZShBUG9ydDogSW50ZWdlcjsgQVNlbmRUaW1lb3V0LCBBUmVjdlRpbWVvdXQ6IExvbmd3b3JkOyBBTG9nRGVsZWdhdGU6IFRCYXNlU29ja2V0LlRMb2dEZWxlZ2F0ZSk7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlKEFQb3J0LCBBTG9nRGVsZWdhdGUpOworICBTZW5kVGltZW91dCA6PSBBU2VuZFRpbWVvdXQ7CisgIFJlY3ZUaW1lb3V0IDo9IEFSZWN2VGltZW91dDsKK2VuZDsKKworY29uc3RydWN0b3IgVFNlcnZlclNvY2tldC5DcmVhdGUoQUFkZHJlc3M6IHN0cmluZzsgQVBvcnQ6IEludGVnZXI7IEFMb2dEZWxlZ2F0ZTogVEJhc2VTb2NrZXQuVExvZ0RlbGVnYXRlKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGUoQVBvcnQsIEFMb2dEZWxlZ2F0ZSk7CisgIEZBZGRyZXNzIDo9IEFBZGRyZXNzOworZW5kOworCitwcm9jZWR1cmUgVFNlcnZlclNvY2tldC5MaXN0ZW47CisKKyAgZnVuY3Rpb24gQ3JlYXRlU29ja2V0UGFpcih2YXIgUmVhZGVyLCBXcml0ZXI6IFdpbmFwaS5XaW5zb2NrMi5UU29ja2V0KTogSW50ZWdlcjsKKyAgbGFiZWwKKyAgICBFcnJvcjsKKyAgdHlwZQorICAgIFRTQVVuaW9uID0gcmVjb3JkCisgICAgY2FzZSBJbnRlZ2VyIG9mCisgICAgICAwOiAoaW5hZGRyOiBUU29ja0FkZHJJbik7CisgICAgICAxOiAoYWRkcjogVFNvY2tBZGRyKTsKKyAgICBlbmQ7CisgIHZhcgorICAgIGE6IFRTQVVuaW9uOworICAgIGxpc3RlbmVyOiBXaW5hcGkuV2luc29jazIuVFNvY2tldDsKKyAgICBlOiBJbnRlZ2VyOworICAgIGFkZHJsZW46IEludGVnZXI7CisgICAgZmxhZ3M6IERXT1JEOworICAgIHJldXNlOiBJbnRlZ2VyOworICBiZWdpbgorICAgIGFkZHJsZW4gOj0gU2l6ZU9mKGEuaW5hZGRyKTsKKyAgICBmbGFncyA6PSAwOworICAgIHJldXNlIDo9IDE7CisKKyAgICBsaXN0ZW5lciA6PSBXaW5hcGkuV2luc29jazIuc29ja2V0KEFGX0lORVQsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX1RDUCk7CisgICAgaWYgbGlzdGVuZXIgPSBJTlZBTElEX1NPQ0tFVCB0aGVuCisgICAgICBFeGl0KFNPQ0tFVF9FUlJPUik7CisKKyAgICBGaWxsQ2hhcihhLCBTaXplT2YoYSksIDApOworICAgIGEuaW5hZGRyLnNpbl9mYW1pbHkgOj0gQUZfSU5FVDsKKyAgICBhLmluYWRkci5zaW5fYWRkci5zX2FkZHIgOj0gaHRvbmwoSU5BRERSX0xPT1BCQUNLKTsKKyAgICBhLmluYWRkci5zaW5fcG9ydCA6PSAwOworICAgIFJlYWRlciA6PSBJTlZBTElEX1NPQ0tFVDsKKyAgICBXcml0ZXIgOj0gSU5WQUxJRF9TT0NLRVQ7CisKKyAgICAvLyBpZ25vcmUgZXJyb3JzIGNvbWluZyBvdXQgb2YgdGhpcyBzZXRzb2Nrb3B0LiAgVGhpcyBpcyBiZWNhdXNlCisgICAgLy8gU09fRVhDTFVTSVZFQUREUlVTRSByZXF1aXJlcyBhZG1pbiBwcml2aWxlZ2VzIG9uIFdpblhQLCBidXQgd2UgZG9uJ3QKKyAgICAvLyB3YW50IHRvIGZvcmNlIHNvY2tldCBwYWlycyB0byBiZSBhbiBhZG1pbi4KKyAgICBzZXRzb2Nrb3B0KGxpc3RlbmVyLCBTT0xfU09DS0VULCBJbnRlZ2VyKFNPX0VYQ0xVU0lWRUFERFJVU0UpLCBAcmV1c2UsIFNpemVPZihyZXVzZSkpOworICAgIGlmIGJpbmQobGlzdGVuZXIsIGEuYWRkciwgU2l6ZU9mKGEuaW5hZGRyKSkgPSBTT0NLRVRfRVJST1IgdGhlbgorICAgICAgZ290byBFcnJvcjsKKworICAgIGlmIGdldHNvY2tuYW1lKGxpc3RlbmVyLCBhLmFkZHIsIGFkZHJsZW4pID0gU09DS0VUX0VSUk9SIHRoZW4KKyAgICAgIGdvdG8gRXJyb3I7CisKKyAgICBpZiBXaW5hcGkuV2luc29jazIubGlzdGVuKGxpc3RlbmVyLCAxKSA9IFNPQ0tFVF9FUlJPUiB0aGVuCisgICAgICBnb3RvIEVycm9yOworCisgICAgUmVhZGVyIDo9IFdTQVNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCwgbmlsLCAwLCBmbGFncyk7CisgICAgaWYgUmVhZGVyID0gSU5WQUxJRF9TT0NLRVQgdGhlbgorICAgICAgZ290byBFcnJvcjsKKworICAgIGlmIGNvbm5lY3QoUmVhZGVyLCBhLmFkZHIsIFNpemVPZihhLmluYWRkcikpID0gU09DS0VUX0VSUk9SIHRoZW4KKyAgICAgIGdvdG8gRXJyb3I7CisKKyAgICBXcml0ZXIgOj0gV2luYXBpLldpbnNvY2syLmFjY2VwdChsaXN0ZW5lciwgbmlsLCBuaWwpOworICAgIGlmIFdyaXRlciA9IElOVkFMSURfU09DS0VUIHRoZW4KKyAgICAgIGdvdG8gRXJyb3I7CisKKyAgICBjbG9zZXNvY2tldChsaXN0ZW5lcik7CisgICAgRXhpdCgwKTsKKworICBFcnJvcjoKKyAgICBlIDo9IFdTQUdldExhc3RFcnJvcjsKKyAgICBjbG9zZXNvY2tldChsaXN0ZW5lcik7CisgICAgY2xvc2Vzb2NrZXQoUmVhZGVyKTsKKyAgICBjbG9zZXNvY2tldChXcml0ZXIpOworICAgIFdTQVNldExhc3RFcnJvcihlKTsKKyAgICBSZXN1bHQgOj0gU09DS0VUX0VSUk9SOworICBlbmQ7CisKK3ZhcgorICBUZW1wSW50UmVhZGVyLAorICBUZW1wSW50V3JpdGVyOiBXaW5hcGkuV2luc29jazIuVFNvY2tldDsKKyAgT25lOiBDYXJkaW5hbDsKKyAgRXJybm9Db3B5OiBJbnRlZ2VyOworICBMaW5nOiBUTGluZ2VyOworICBSZXRyaWVzOiBJbnRlZ2VyOworICBBZGRySW5mbzogSUdldEFkZHJJbmZvV3JhcHBlcjsKKyAgU0E6IFRTb2NrQWRkclN0b3JhZ2U7CisgIExlbjogSW50ZWdlcjsKK2JlZ2luCisgIC8vIENyZWF0ZSB0aGUgc29ja2V0IHBhaXIgdXNlZCB0byBpbnRlcnJ1cHQKKyAgaWYgQ3JlYXRlU29ja2V0UGFpcihUZW1wSW50UmVhZGVyLCBUZW1wSW50V3JpdGVyKSA9IFNPQ0tFVF9FUlJPUiB0aGVuIGJlZ2luCisgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdUU2VydmVyU29ja2V0Lkxpc3RlbigpIENyZWF0ZVNvY2tldFBhaXIoKSBJbnRlcnJ1cHQgJXMnLCBbU3lzRXJyb3JNZXNzYWdlKFdTQUdldExhc3RFcnJvcildKSk7CisgICAgRkludGVycnVwdFNvY2tSZWFkZXIgOj0gSU5WQUxJRF9TT0NLRVQ7CisgICAgRkludGVycnVwdFNvY2tXcml0ZXIgOj0gSU5WQUxJRF9TT0NLRVQ7CisgIGVuZAorICBlbHNlIGJlZ2luCisgICAgRkludGVycnVwdFNvY2tSZWFkZXIgOj0gVGVtcEludFJlYWRlcjsKKyAgICBGSW50ZXJydXB0U29ja1dyaXRlciA6PSBUZW1wSW50V3JpdGVyOworICBlbmQ7CisKKyAgLy8gQ3JlYXRlIHRoZSBzb2NrZXQgcGFpciB1c2VkIHRvIGludGVycnVwdCBhbGwgY2xpZW50cworICBpZiBDcmVhdGVTb2NrZXRQYWlyKFRlbXBJbnRSZWFkZXIsIFRlbXBJbnRXcml0ZXIpID0gU09DS0VUX0VSUk9SIHRoZW4gYmVnaW4KKyAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1RTZXJ2ZXJTb2NrZXQuTGlzdGVuKCkgQ3JlYXRlU29ja2V0UGFpcigpIENoaWxkSW50ZXJydXB0ICVzJywgW1N5c0Vycm9yTWVzc2FnZShXU0FHZXRMYXN0RXJyb3IpXSkpOworICAgIEZDaGlsZEludGVycnVwdFNvY2tSZWFkZXIgOj0gVFNtYXJ0UG9pbnRlcjxXaW5hcGkuV2luc29jazIuVFNvY2tldD4uQ3JlYXRlKElOVkFMSURfU09DS0VULCBuaWwpOworICAgIEZDaGlsZEludGVycnVwdFNvY2tXcml0ZXIgOj0gSU5WQUxJRF9TT0NLRVQ7CisgIGVuZAorICBlbHNlIGJlZ2luCisgICAgRkNoaWxkSW50ZXJydXB0U29ja1JlYWRlciA6PSBUU21hcnRQb2ludGVyPFdpbmFwaS5XaW5zb2NrMi5UU29ja2V0Pi5DcmVhdGUoVGVtcEludFJlYWRlciwgRGVzdHJveWVyT2ZGaW5lU29ja2V0cyk7CisgICAgRkNoaWxkSW50ZXJydXB0U29ja1dyaXRlciA6PSBUZW1wSW50V3JpdGVyOworICBlbmQ7CisKKyAgaWYgKFBvcnQgPCAwKSBvciAoUG9ydCA+ICRGRkZGKSB0aGVuCisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbkJhZEFyZ3MuQ3JlYXRlKCdTcGVjaWZpZWQgcG9ydCBpcyBpbnZhbGlkJyk7CisKKyAgQWRkckluZm8gOj0gQ3JlYXRlU29ja2V0KEZBZGRyZXNzLCBQb3J0KTsKKworICAvLyBTZXQgU09fRVhDTFVTSVZFQUREUlVTRSB0byBwcmV2ZW50IDJNU0wgZGVsYXkgb24gYWNjZXB0CisgIE9uZSA6PSAxOworICBzZXRzb2Nrb3B0KFNvY2tldCwgU09MX1NPQ0tFVCwgSW50ZWdlcihTT19FWENMVVNJVkVBRERSVVNFKSwgQG9uZSwgU2l6ZU9mKE9uZSkpOworICAvLyBpZ25vcmUgZXJyb3JzIGNvbWluZyBvdXQgb2YgdGhpcyBzZXRzb2Nrb3B0IG9uIFdpbmRvd3MuICBUaGlzIGlzIGJlY2F1c2UKKyAgLy8gU09fRVhDTFVTSVZFQUREUlVTRSByZXF1aXJlcyBhZG1pbiBwcml2aWxlZ2VzIG9uIFdpblhQLCBidXQgd2UgZG9uJ3QKKyAgLy8gd2FudCB0byBmb3JjZSBzZXJ2ZXJzIHRvIGJlIGFuIGFkbWluLgorCisgIC8vIFNldCBUQ1AgYnVmZmVyIHNpemVzCisgIGlmIEZUY3BTZW5kQnVmZmVyID4gMCB0aGVuIGJlZ2luCisgICAgaWYgc2V0c29ja29wdChTb2NrZXQsIFNPTF9TT0NLRVQsIFNPX1NOREJVRiwgQEZUY3BTZW5kQnVmZmVyLCBTaXplT2YoRlRjcFNlbmRCdWZmZXIpKSA9IFNPQ0tFVF9FUlJPUiB0aGVuIGJlZ2luCisgICAgICBFcnJub0NvcHkgOj0gV1NBR2V0TGFzdEVycm9yOworICAgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdUU2VydmVyU29ja2V0Lkxpc3RlbigpIHNldHNvY2tvcHQoKSBTT19TTkRCVUYgJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoRm9ybWF0KCdDb3VsZCBub3Qgc2V0IFNPX1NOREJVRjogJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgICAgZW5kOworICBlbmQ7CisKKyAgaWYgRlRjcFJlY3ZCdWZmZXIgPiAwIHRoZW4gYmVnaW4KKyAgICBpZiBzZXRzb2Nrb3B0KFNvY2tldCwgU09MX1NPQ0tFVCwgU09fUkNWQlVGLCBARlRjcFJlY3ZCdWZmZXIsIFNpemVPZihGVGNwUmVjdkJ1ZmZlcikpID0gU09DS0VUX0VSUk9SIHRoZW4gYmVnaW4KKyAgICAgIEVycm5vQ29weSA6PSBXU0FHZXRMYXN0RXJyb3I7CisgICAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1RTZXJ2ZXJTb2NrZXQuTGlzdGVuKCkgc2V0c29ja29wdCgpIFNPX1JDVkJVRiAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZShGb3JtYXQoJ0NvdWxkIG5vdCBzZXQgU09fUkNWQlVGOiAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgICBlbmQ7CisgIGVuZDsKKworICAvLyBUdXJuIGxpbmdlciBvZmYsIGRvbid0IHdhbnQgdG8gYmxvY2sgb24gY2FsbHMgdG8gY2xvc2UKKyAgTGluZy5sX29ub2ZmIDo9IDA7CisgIExpbmcubF9saW5nZXIgOj0gMDsKKyAgaWYgc2V0c29ja29wdChTb2NrZXQsIFNPTF9TT0NLRVQsIFNPX0xJTkdFUiwgQExpbmcsIFNpemVPZihMaW5nKSkgPSBTT0NLRVRfRVJST1IgdGhlbiBiZWdpbgorICAgIEVycm5vQ29weSA6PSBXU0FHZXRMYXN0RXJyb3I7CisgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdUU2VydmVyU29ja2V0Lkxpc3RlbigpIHNldHNvY2tvcHQoKSBTT19MSU5HRVIgJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKEZvcm1hdCgnQ291bGQgbm90IHNldCBTT19MSU5HRVI6ICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICBlbmQ7CisKKyAgLy8gVENQIE5vZGVsYXksIHNwZWVkIG92ZXIgYmFuZHdpZHRoCisgIGlmIHNldHNvY2tvcHQoU29ja2V0LCBJUFBST1RPX1RDUCwgVENQX05PREVMQVksIEBPbmUsIFNpemVPZihPbmUpKSA9IFNPQ0tFVF9FUlJPUiB0aGVuIGJlZ2luCisgICAgRXJybm9Db3B5IDo9IFdTQUdldExhc3RFcnJvcjsKKyAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1RTZXJ2ZXJTb2NrZXQuTGlzdGVuKCkgc2V0c29ja29wdCgpIFRDUF9OT0RFTEFZICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZShGb3JtYXQoJ0NvdWxkIG5vdCBzZXQgVENQX05PREVMQVk6ICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICBlbmQ7CisKKyAgLy8gU2V0IE5PTkJMT0NLIG9uIHRoZSBhY2NlcHQgc29ja2V0CisgIGlmIGlvY3Rsc29ja2V0KFNvY2tldCwgSW50ZWdlcihGSU9OQklPKSwgT25lKSA9IFNPQ0tFVF9FUlJPUiB0aGVuIGJlZ2luCisgICAgRXJybm9Db3B5IDo9IFdTQUdldExhc3RFcnJvcjsKKyAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1RTZXJ2ZXJTb2NrZXQuTGlzdGVuKCkgaW9jdGxzb2NrZXQoKSBGSU9OQklPICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZShGb3JtYXQoJ2lvY3Rsc29ja2V0KCkgRklPTkJJTzogJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgIGVuZDsKKworICAvLyBwcmVwYXJlIHRoZSBwb3J0IGluZm9ybWF0aW9uCisgIC8vIHdlIG1heSB3YW50IHRvIHRyeSB0byBiaW5kIG1vcmUgdGhhbiBvbmNlLCBzaW5jZSBUSFJJRlRfTk9fU09DS0VUX0NBQ0hJTkcgZG9lc24ndAorICAvLyBhbHdheXMgc2VlbSB0byB3b3JrLiBUaGUgY2xpZW50IGNhbiBjb25maWd1cmUgdGhlIHJldHJ5IHZhcmlhYmxlcy4KKyAgUmV0cmllcyA6PSAwOworICB3aGlsZSBUcnVlIGRvIGJlZ2luCisgICAgaWYgYmluZChTb2NrZXQsIEFkZHJJbmZvLlJlc14uYWlfYWRkcl4sIEFkZHJJbmZvLlJlc14uYWlfYWRkcmxlbikgPSAwIHRoZW4KKyAgICAgIEJyZWFrOworICAgIEluYyhSZXRyaWVzKTsKKyAgICBpZiBSZXRyaWVzID4gRlJldHJ5TGltaXQgdGhlbgorICAgICAgQnJlYWs7CisgICAgU2xlZXAoRlJldHJ5RGVsYXkgKiAxMDAwKTsKKyAgZW5kOworCisgIC8vIHJldHJpZXZlIGJpbmQgaW5mbworICBpZiAoUG9ydCA9IDApIGFuZCAoUmV0cmllcyA8IEZSZXRyeUxpbWl0KSB0aGVuIGJlZ2luCisgICAgTGVuIDo9IFNpemVPZihTQSk7CisgICAgRmlsbENoYXIoU0EsIExlbiwgMCk7CisgICAgaWYgZ2V0c29ja25hbWUoU29ja2V0LCBQU29ja0FkZHIoQFNBKV4sIExlbikgPSBTT0NLRVRfRVJST1IgdGhlbgorICAgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdUU2VydmVyU29ja2V0Lkxpc3RlbigpIGdldHNvY2tuYW1lKCkgJXMnLCBbU3lzRXJyb3JNZXNzYWdlKFdTQUdldExhc3RFcnJvcildKSkKKyAgICBlbHNlIGJlZ2luCisgICAgICBpZiBTQS5zc19mYW1pbHkgPSBBRl9JTkVUNiB0aGVuCisgICAgICAgIFBvcnQgOj0gbnRvaHMoUFNvY2tBZGRySW42KEBTQSleLnNpbjZfcG9ydCkKKyAgICAgIGVsc2UKKyAgICAgICAgUG9ydCA6PSBudG9ocyhQU29ja0FkZHJJbihAU0EpXi5zaW5fcG9ydCk7CisgICAgZW5kOworICBlbmQ7CisKKyAgLy8gdGhyb3cgYW4gZXJyb3IgaWYgd2UgZmFpbGVkIHRvIGJpbmQgcHJvcGVybHkKKyAgaWYgKFJldHJpZXMgPiBGUmV0cnlMaW1pdCkgdGhlbiBiZWdpbgorICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnVFNlcnZlclNvY2tldC5MaXN0ZW4oKSBCSU5EICVkJywgW1BvcnRdKSk7CisgICAgQ2xvc2U7CisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKEZvcm1hdCgnQ291bGQgbm90IGJpbmQ6ICVzJywgW1N5c0Vycm9yTWVzc2FnZShXU0FHZXRMYXN0RXJyb3IpXSkpOworICBlbmQ7CisKKyAgaWYgQXNzaWduZWQoRkxpc3RlbkNhbGxiYWNrKSB0aGVuCisgICAgRkxpc3RlbkNhbGxiYWNrKFNvY2tldCk7CisKKyAgLy8gQ2FsbCBsaXN0ZW4KKyAgaWYgV2luYXBpLldpbnNvY2syLmxpc3RlbihTb2NrZXQsIEZBY2NlcHRCYWNrbG9nKSA9IFNPQ0tFVF9FUlJPUiB0aGVuIGJlZ2luCisgICAgRXJybm9Db3B5IDo9IFdTQUdldExhc3RFcnJvcjsKKyAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1RTZXJ2ZXJTb2NrZXQuTGlzdGVuKCkgbGlzdGVuKCkgJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKEZvcm1hdCgnQ291bGQgbm90IGxpc3RlbjogJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgIGVuZDsKKworICAvLyBUaGUgc29ja2V0IGlzIG5vdyBsaXN0ZW5pbmchCitlbmQ7CisKK2Z1bmN0aW9uIFRTZXJ2ZXJTb2NrZXQuQWNjZXB0OiBUU29ja2V0OwordmFyCisgIEZkczogVEZkU2V0OworICBNYXhFSW50ZXJzLAorICBOdW1FSW50ZXJzOiBJbnRlZ2VyOworICBUVmFsOiBUVGltZVZhbDsKKyAgUFRWYWw6IFBUaW1lVmFsOworICBFcnJub0NvcHk6IEludGVnZXI7CisgIEJ1ZjogQnl0ZTsKKyAgQ2xpZW50QWRkcmVzczogVFNvY2tBZGRyU3RvcmFnZTsKKyAgU2l6ZTogSW50ZWdlcjsKKyAgQ2xpZW50U29ja2V0OiBXaW5hcGkuV2luc29jazIuVFNvY2tldDsKKyAgWmVybzogQ2FyZGluYWw7CisgIENsaWVudDogVFNvY2tldDsKKyAgUmV0OiBJbnRlZ2VyOworYmVnaW4KKyAgTWF4RUludGVycyA6PSA1OworICBOdW1FSW50ZXJzIDo9IDA7CisKKyAgd2hpbGUgVHJ1ZSBkbyBiZWdpbgorICAgIEZEX1pFUk8oRmRzKTsKKyAgICBfRkRfU0VUKFNvY2tldCwgRmRzKTsKKyAgICBfRkRfU0VUKEZJbnRlcnJ1cHRTb2NrUmVhZGVyLCBGZHMpOworICAgIGlmIEZBY2NlcHRUaW1lb3V0ID4gMCB0aGVuIGJlZ2luCisgICAgICBUVmFsLnR2X3NlYyA6PSBGQWNjZXB0VGltZW91dCBkaXYgMTAwMDsKKyAgICAgIFRWYWwudHZfdXNlYyA6PSAoRkFjY2VwdFRpbWVvdXQgbW9kIDEwMDApICogMTAwMDsKKyAgICAgIFBUVmFsIDo9IEBUVmFsOworICAgIGVuZAorICAgIGVsc2UKKyAgICAgIFBUVmFsIDo9IG5pbDsKKworICAgIC8vIFRPRE86IGlmIFdTQUVJTlRSIGlzIHJlY2VpdmVkLCB3ZSdsbCByZXN0YXJ0IHRoZSB0aW1lb3V0LgorICAgIC8vIFRvIGJlIGFjY3VyYXRlLCB3ZSBuZWVkIHRvIGZpeCB0aGlzIGluIHRoZSBmdXR1cmUuCisgICAgUmV0IDo9IHNlbGVjdCgyLCBARmRzLCBuaWwsIG5pbCwgUFRWYWwpOworCisgICAgaWYgUmV0IDwgMCB0aGVuIGJlZ2luCisgICAgICAvLyBlcnJvciBjYXNlcworICAgICAgaWYgKFdTQUdldExhc3RFcnJvciA9IFdTQUVJTlRSKSBhbmQgKE51bUVJbnRlcnMgPCBNYXhFSW50ZXJzKSB0aGVuIGJlZ2luCisgICAgICAgIC8vIFRIUklGVF9FSU5UUiBuZWVkcyB0byBiZSBoYW5kbGVkIG1hbnVhbGx5IGFuZCB3ZSBjYW4gdG9sZXJhdGUKKyAgICAgICAgLy8gYSBjZXJ0YWluIG51bWJlcgorICAgICAgICBJbmMoTnVtRUludGVycyk7CisgICAgICAgIENvbnRpbnVlOworICAgICAgZW5kOworICAgICAgRXJybm9Db3B5IDo9IFdTQUdldExhc3RFcnJvcjsKKyAgICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnVFNlcnZlclNvY2tldC5BY2NlcHQoKSBzZWxlY3QoKSAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Vbmtub3duLkNyZWF0ZShGb3JtYXQoJ1Vua25vd246ICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICAgIGVuZAorICAgIGVsc2UgaWYgUmV0ID4gMCB0aGVuIGJlZ2luCisgICAgICAvLyBDaGVjayBmb3IgYW4gaW50ZXJydXB0IHNpZ25hbAorICAgICAgaWYgKEZJbnRlcnJ1cHRTb2NrUmVhZGVyIDw+IElOVkFMSURfU09DS0VUKSBhbmQgRkRfSVNTRVQoRkludGVycnVwdFNvY2tSZWFkZXIsIEZkcykgdGhlbiBiZWdpbgorICAgICAgICBpZiByZWN2KEZJbnRlcnJ1cHRTb2NrUmVhZGVyLCBCdWYsIFNpemVPZihCdWYpLCAwKSA9IFNPQ0tFVF9FUlJPUiB0aGVuCisgICAgICAgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdUU2VydmVyU29ja2V0LkFjY2VwdCgpIHJlY3YoKSBpbnRlcnJ1cHQgJXMnLCBbU3lzRXJyb3JNZXNzYWdlKFdTQUdldExhc3RFcnJvcildKSk7CisgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25JbnRlcnJ1cHRlZC5DcmVhdGUoJ2ludGVycnVwdGVkJyk7CisgICAgICBlbmQ7CisKKyAgICAgIC8vIENoZWNrIGZvciB0aGUgYWN0dWFsIHNlcnZlciBzb2NrZXQgYmVpbmcgcmVhZHkKKyAgICAgIGlmIEZEX0lTU0VUKFNvY2tldCwgRmRzKSB0aGVuCisgICAgICAgIEJyZWFrOworICAgIGVuZAorICAgIGVsc2UgYmVnaW4KKyAgICAgIExvZ0RlbGVnYXRlKCdUU2VydmVyU29ja2V0LkFjY2VwdCgpIHNlbGVjdCgpIDAnKTsKKyAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Vbmtub3duLkNyZWF0ZSgndW5rbm93biBlcnJvcicpOworICAgIGVuZDsKKyAgZW5kOworCisgIFNpemUgOj0gU2l6ZU9mKENsaWVudEFkZHJlc3MpOworICBDbGllbnRTb2NrZXQgOj0gV2luYXBpLldpbnNvY2syLmFjY2VwdChTb2NrZXQsIEBDbGllbnRBZGRyZXNzLCBAU2l6ZSk7CisgIGlmIENsaWVudFNvY2tldCA9IElOVkFMSURfU09DS0VUIHRoZW4gYmVnaW4KKyAgICBFcnJub0NvcHkgOj0gV1NBR2V0TGFzdEVycm9yOworICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnVFNlcnZlclNvY2tldC5BY2NlcHQoKSBhY2NlcHQoKSAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVW5rbm93bi5DcmVhdGUoRm9ybWF0KCdhY2NlcHQoKTogJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgIGVuZDsKKworICAvLyBNYWtlIHN1cmUgY2xpZW50IHNvY2tldCBpcyBibG9ja2luZworICBaZXJvIDo9IDA7CisgIGlmIGlvY3Rsc29ja2V0KENsaWVudFNvY2tldCwgSW50ZWdlcihGSU9OQklPKSwgWmVybykgPSBTT0NLRVRfRVJST1IgdGhlbiBiZWdpbgorICAgIEVycm5vQ29weSA6PSBXU0FHZXRMYXN0RXJyb3I7CisgICAgY2xvc2Vzb2NrZXQoQ2xpZW50U29ja2V0KTsKKyAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1RTZXJ2ZXJTb2NrZXQuQWNjZXB0KCkgaW9jdGxzb2NrZXQoKSBGSU9OQklPICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Vbmtub3duLkNyZWF0ZShGb3JtYXQoJ2lvY3Rsc29ja2V0KCk6ICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICBlbmQ7CisKKyAgQ2xpZW50IDo9IENyZWF0ZVNvY2tldE9iaihDbGllbnRTb2NrZXQpOworICBpZiBTZW5kVGltZW91dCA+IDAgdGhlbgorICAgIENsaWVudC5TZW5kVGltZW91dCA6PSBTZW5kVGltZW91dDsKKyAgaWYgUmVjdlRpbWVvdXQgPiAwIHRoZW4KKyAgICBDbGllbnQuUmVjdlRpbWVvdXQgOj0gUmVjdlRpbWVvdXQ7CisgIGlmIEtlZXBBbGl2ZSB0aGVuCisgICAgQ2xpZW50LktlZXBBbGl2ZSA6PSBLZWVwQWxpdmU7CisgIENsaWVudC5TZXRDYWNoZWRBZGRyZXNzKFBTb2NrQWRkcihAQ2xpZW50QWRkcmVzcyleLCBTaXplKTsKKworICBpZiBBc3NpZ25lZChGQWNjZXB0Q2FsbGJhY2spIHRoZW4KKyAgICBGQWNjZXB0Q2FsbGJhY2soQ2xpZW50U29ja2V0KTsKKworICBSZXN1bHQgOj0gQ2xpZW50OworZW5kOworCitwcm9jZWR1cmUgVFNlcnZlclNvY2tldC5JbnRlcnJ1cHQ7CitiZWdpbgorICBOb3RpZnkoRkludGVycnVwdFNvY2tXcml0ZXIpOworZW5kOworCitwcm9jZWR1cmUgVFNlcnZlclNvY2tldC5JbnRlcnJ1cHRDaGlsZHJlbjsKK2JlZ2luCisgIE5vdGlmeShGQ2hpbGRJbnRlcnJ1cHRTb2NrV3JpdGVyKTsKK2VuZDsKKworcHJvY2VkdXJlIFRTZXJ2ZXJTb2NrZXQuQ2xvc2U7CitiZWdpbgorICBpbmhlcml0ZWQgQ2xvc2U7CisgIGlmIEZJbnRlcnJ1cHRTb2NrV3JpdGVyIDw+IElOVkFMSURfU09DS0VUIHRoZW4KKyAgICBjbG9zZXNvY2tldChGSW50ZXJydXB0U29ja1dyaXRlcik7CisgIGlmIEZJbnRlcnJ1cHRTb2NrUmVhZGVyIDw+IElOVkFMSURfU09DS0VUIHRoZW4KKyAgICBjbG9zZXNvY2tldChGSW50ZXJydXB0U29ja1JlYWRlcik7CisgIGlmIEZDaGlsZEludGVycnVwdFNvY2tXcml0ZXIgPD4gSU5WQUxJRF9TT0NLRVQgdGhlbgorICAgIGNsb3Nlc29ja2V0KEZDaGlsZEludGVycnVwdFNvY2tXcml0ZXIpOworICBGQ2hpbGRJbnRlcnJ1cHRTb2NrUmVhZGVyIDo9IFRTbWFydFBvaW50ZXI8V2luYXBpLldpbnNvY2syLlRTb2NrZXQ+LkNyZWF0ZShJTlZBTElEX1NPQ0tFVCwgbmlsKTsKKyAgRkxpc3RlbmluZyA6PSBGYWxzZTsKK2VuZDsKKworeyRFTkRJRn0gLy8gbm90IGZvciBPTERfU09DS0VUUworZW5kLgpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlN0cmVhbS5wYXMgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuU3RyZWFtLnBhcwppbmRleCBkMWY2Mzg0Li4zMzA4YzUzIDEwMDY0NAotLS0gYS9saWIvZGVscGhpL3NyYy9UaHJpZnQuU3RyZWFtLnBhcworKysgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuU3RyZWFtLnBhcwpAQCAtMTksNiArMTksOCBAQAogCiB1bml0IFRocmlmdC5TdHJlYW07CiAKK3skSSBUaHJpZnQuRGVmaW5lcy5pbmN9CisKIGludGVyZmFjZQogCiB1c2VzCkBAIC0yNiwxNSArMjgsMjEgQEAKICAgU3lzVXRpbHMsCiAgIFN5c0NvbnN0LAogICBSVExDb25zdHMsCi0gIFRocmlmdC5VdGlscywKLSAgQWN0aXZlWDsKKyAgeyRJRkRFRiBPTERfVU5JVF9OQU1FU30KKyAgQWN0aXZlWCwKKyAgeyRFTFNFfQorICBXaW5hcGkuQWN0aXZlWCwKKyAgeyRFTkRJRn0KKyAgVGhyaWZ0LlV0aWxzOwogCiB0eXBlCiAKICAgSVRocmlmdFN0cmVhbSA9IGludGVyZmFjZQotICAgIFsnezczMjYyMUIzLUY2OTctNEQ3Ni1BMUIwLUI0REQ1QThFNDAxOH0nXQotICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgYnVmZmVyOiBUQnl0ZXM7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOwotICAgIGZ1bmN0aW9uIFJlYWQoIHZhciBidWZmZXI6IFRCeXRlczsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7CisgICAgWyd7MkE3N0Q5MTYtNzQ0Ni00NkMxLTg1NDUtMEFFQzAwMDhEQkNBfSddCisgICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBidWZmZXI6IFRCeXRlczsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik7ICBvdmVybG9hZDsKKyAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTsgIG92ZXJsb2FkOworICAgIGZ1bmN0aW9uIFJlYWQoIHZhciBidWZmZXI6IFRCeXRlczsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7ICBvdmVybG9hZDsKKyAgICBmdW5jdGlvbiBSZWFkKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7ICBvdmVybG9hZDsKICAgICBwcm9jZWR1cmUgT3BlbjsKICAgICBwcm9jZWR1cmUgQ2xvc2U7CiAgICAgcHJvY2VkdXJlIEZsdXNoOwpAQCAtNDQsMTAgKzUyLDEyIEBACiAKICAgVFRocmlmdFN0cmVhbUltcGwgPSBjbGFzcyggVEludGVyZmFjZWRPYmplY3QsIElUaHJpZnRTdHJlYW0pCiAgIHByaXZhdGUKLSAgICBwcm9jZWR1cmUgQ2hlY2tTaXplQW5kT2Zmc2V0KCBjb25zdCBidWZmZXI6IFRCeXRlczsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik7CisgICAgcHJvY2VkdXJlIENoZWNrU2l6ZUFuZE9mZnNldCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOyAgb3ZlcmxvYWQ7CiAgIHByb3RlY3RlZAotICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgYnVmZmVyOiBUQnl0ZXM7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOyB2aXJ0dWFsOwotICAgIGZ1bmN0aW9uIFJlYWQoIHZhciBidWZmZXI6IFRCeXRlczsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7IHZpcnR1YWw7CisgICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBidWZmZXI6IFRCeXRlczsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik7IG92ZXJsb2FkOyBpbmxpbmU7CisgICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik7ICBvdmVybG9hZDsgdmlydHVhbDsKKyAgICBmdW5jdGlvbiBSZWFkKCB2YXIgYnVmZmVyOiBUQnl0ZXM7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOyBvdmVybG9hZDsgaW5saW5lOworICAgIGZ1bmN0aW9uIFJlYWQoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTogSW50ZWdlcjsgb3ZlcmxvYWQ7IHZpcnR1YWw7CiAgICAgcHJvY2VkdXJlIE9wZW47IHZpcnR1YWw7IGFic3RyYWN0OwogICAgIHByb2NlZHVyZSBDbG9zZTsgdmlydHVhbDsgYWJzdHJhY3Q7CiAgICAgcHJvY2VkdXJlIEZsdXNoOyB2aXJ0dWFsOyBhYnN0cmFjdDsKQEAgLTYwLDggKzcwLDggQEAKICAgICBGU3RyZWFtIDogVFN0cmVhbTsKICAgICBGT3duc1N0cmVhbSA6IEJvb2xlYW47CiAgIHByb3RlY3RlZAotICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgYnVmZmVyOiBUQnl0ZXM7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOyBvdmVycmlkZTsKLSAgICBmdW5jdGlvbiBSZWFkKCB2YXIgYnVmZmVyOiBUQnl0ZXM7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgT3Blbjsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIENsb3NlOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgRmx1c2g7IG92ZXJyaWRlOwpAQCAtNzYsOCArODYsOCBAQAogICBwcml2YXRlCiAgICAgRlN0cmVhbSA6IElTdHJlYW07CiAgIHByb3RlY3RlZAotICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgYnVmZmVyOiBUQnl0ZXM7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOyBvdmVycmlkZTsKLSAgICBmdW5jdGlvbiBSZWFkKCB2YXIgYnVmZmVyOiBUQnl0ZXM7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgT3Blbjsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIENsb3NlOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgRmx1c2g7IG92ZXJyaWRlOwpAQCAtMTA0LDEwICsxMTQsOCBAQAogCiBwcm9jZWR1cmUgVFRocmlmdFN0cmVhbUFkYXB0ZXJDT00uRmx1c2g7CiBiZWdpbgotICBpZiBJc09wZW4gdGhlbgotICBiZWdpbgotICAgIGlmIEZTdHJlYW0gPD4gbmlsIHRoZW4KLSAgICBiZWdpbgorICBpZiBJc09wZW4gdGhlbiBiZWdpbgorICAgIGlmIEZTdHJlYW0gPD4gbmlsIHRoZW4gYmVnaW4KICAgICAgIEZTdHJlYW0uQ29tbWl0KCBTVEdDX0RFRkFVTFQgKTsKICAgICBlbmQ7CiAgIGVuZDsKQEAgLTEyMCwxOCArMTI4LDIzIEBACiAKIHByb2NlZHVyZSBUVGhyaWZ0U3RyZWFtQWRhcHRlckNPTS5PcGVuOwogYmVnaW4KLQorICAvLyBub3RoaW5nIHRvIGRvCiBlbmQ7CiAKLWZ1bmN0aW9uIFRUaHJpZnRTdHJlYW1BZGFwdGVyQ09NLlJlYWQoIHZhciBidWZmZXI6IFRCeXRlczsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7CitmdW5jdGlvbiBUVGhyaWZ0U3RyZWFtQWRhcHRlckNPTS5SZWFkKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7Cit2YXIgcFRtcCA6IFBCeXRlOwogYmVnaW4KICAgaW5oZXJpdGVkOworCisgIGlmIGNvdW50ID49IGJ1Zmxlbi1vZmZzZXQKKyAgdGhlbiBjb3VudCA6PSBidWZsZW4tb2Zmc2V0OworCiAgIFJlc3VsdCA6PSAwOwotICBpZiBGU3RyZWFtIDw+IG5pbCB0aGVuCi0gIGJlZ2luCi0gICAgaWYgY291bnQgPiAwIHRoZW4KLSAgICBiZWdpbgotICAgICAgRlN0cmVhbS5SZWFkKCBAYnVmZmVyW29mZnNldF0sIGNvdW50LCBAUmVzdWx0KTsKKyAgaWYgRlN0cmVhbSA8PiBuaWwgdGhlbiBiZWdpbgorICAgIGlmIGNvdW50ID4gMCB0aGVuIGJlZ2luCisgICAgICBwVG1wIDo9IHBCdWY7CisgICAgICBJbmMoIHBUbXAsIG9mZnNldCk7CisgICAgICBGU3RyZWFtLlJlYWQoIHBUbXAsIGNvdW50LCBAUmVzdWx0KTsKICAgICBlbmQ7CiAgIGVuZDsKIGVuZDsKQEAgLTE0MCw3NSArMTUzLDc2IEBACiB2YXIKICAgc3RhdHN0ZzogVFN0YXRTdGc7CiAgIGxlbiA6IEludGVnZXI7Ci0gIE5ld1BvcyA6IEludDY0OworICBOZXdQb3MgOiB7JElGIENvbXBpbGVyVmVyc2lvbiA+PSAyOS4wfSBVSW50NjQgeyRFTFNFfSBJbnQ2NCAgeyRJRkVORH07CiAgIGNiUmVhZCA6IEludGVnZXI7CiBiZWdpbgogICBGaWxsQ2hhciggc3RhdHN0ZywgU2l6ZU9mKCBzdGF0c3RnKSwgMCk7CiAgIGxlbiA6PSAwOwotICBpZiBJc09wZW4gdGhlbgotICBiZWdpbgotICAgIGlmIFN1Y2NlZWRlZCggRlN0cmVhbS5TdGF0KCBzdGF0c3RnLCBTVEFURkxBR19OT05BTUUgKSkgdGhlbgotICAgIGJlZ2luCisgIGlmIElzT3BlbiB0aGVuIGJlZ2luCisgICAgaWYgU3VjY2VlZGVkKCBGU3RyZWFtLlN0YXQoIHN0YXRzdGcsIFNUQVRGTEFHX05PTkFNRSApKSB0aGVuIGJlZ2luCiAgICAgICBsZW4gOj0gc3RhdHN0Zy5jYlNpemU7CiAgICAgZW5kOwogICBlbmQ7CiAKICAgU2V0TGVuZ3RoKCBSZXN1bHQsIGxlbiApOwogCi0gIGlmIGxlbiA+IDAgdGhlbgotICBiZWdpbgotICAgIGlmIFN1Y2NlZWRlZCggRlN0cmVhbS5TZWVrKCAwLCBTVFJFQU1fU0VFS19TRVQsIE5ld1BvcykgKSB0aGVuCi0gICAgYmVnaW4KKyAgaWYgbGVuID4gMCB0aGVuIGJlZ2luCisgICAgaWYgU3VjY2VlZGVkKCBGU3RyZWFtLlNlZWsoIDAsIFNUUkVBTV9TRUVLX1NFVCwgTmV3UG9zKSApIHRoZW4gYmVnaW4KICAgICAgIEZTdHJlYW0uUmVhZCggQFJlc3VsdFswXSwgbGVuLCBAY2JSZWFkKTsKICAgICBlbmQ7CiAgIGVuZDsKIGVuZDsKIAotcHJvY2VkdXJlIFRUaHJpZnRTdHJlYW1BZGFwdGVyQ09NLldyaXRlKCBjb25zdCBidWZmZXI6IFRCeXRlczsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik7Ci12YXIKLSAgbldyaXR0ZW4gOiBJbnRlZ2VyOworcHJvY2VkdXJlIFRUaHJpZnRTdHJlYW1BZGFwdGVyQ09NLldyaXRlKCBjb25zdCBwQnVmOiBQb2ludGVyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTsKK3ZhciBuV3JpdHRlbiA6IEludGVnZXI7CisgICAgcFRtcCA6IFBCeXRlOwogYmVnaW4KICAgaW5oZXJpdGVkOwotICBpZiBJc09wZW4gdGhlbgotICBiZWdpbgotICAgIGlmIGNvdW50ID4gMCB0aGVuCi0gICAgYmVnaW4KLSAgICAgIEZTdHJlYW0uV3JpdGUoIEBidWZmZXJbMF0sIGNvdW50LCBAbldyaXR0ZW4pOworICBpZiBJc09wZW4gdGhlbiBiZWdpbgorICAgIGlmIGNvdW50ID4gMCB0aGVuIGJlZ2luCisgICAgICBwVG1wIDo9IHBCdWY7CisgICAgICBJbmMoIHBUbXAsIG9mZnNldCk7CisgICAgICBGU3RyZWFtLldyaXRlKCBwVG1wLCBjb3VudCwgQG5Xcml0dGVuKTsKICAgICBlbmQ7CiAgIGVuZDsKIGVuZDsKIAogeyBUVGhyaWZ0U3RyZWFtSW1wbCB9CiAKLXByb2NlZHVyZSBUVGhyaWZ0U3RyZWFtSW1wbC5DaGVja1NpemVBbmRPZmZzZXQoY29uc3QgYnVmZmVyOiBUQnl0ZXM7IG9mZnNldCwKLSAgY291bnQ6IEludGVnZXIpOwotdmFyCi0gIGxlbiA6IEludGVnZXI7Citwcm9jZWR1cmUgVFRocmlmdFN0cmVhbUltcGwuQ2hlY2tTaXplQW5kT2Zmc2V0KCBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik7CiBiZWdpbgotICBpZiBjb3VudCA+IDAgdGhlbgotICBiZWdpbgotICAgIGxlbiA6PSBMZW5ndGgoIGJ1ZmZlciApOwotICAgIGlmIChvZmZzZXQgPCAwKSBvciAoIG9mZnNldCA+PSBsZW4pIHRoZW4KLSAgICBiZWdpbgorICBpZiBjb3VudCA+IDAgdGhlbiBiZWdpbgorICAgIGlmIChvZmZzZXQgPCAwKSBvciAoIG9mZnNldCA+PSBidWZsZW4pIHRoZW4gYmVnaW4KICAgICAgIHJhaXNlIEVSYW5nZUVycm9yLkNyZWF0ZSggU0JpdHNJbmRleEVycm9yICk7CiAgICAgZW5kOwotICAgIGlmIGNvdW50ID4gbGVuIHRoZW4KLSAgICBiZWdpbgorICAgIGlmIGNvdW50ID4gYnVmbGVuIHRoZW4gYmVnaW4KICAgICAgIHJhaXNlIEVSYW5nZUVycm9yLkNyZWF0ZSggU0JpdHNJbmRleEVycm9yICk7CiAgICAgZW5kOwogICBlbmQ7CiBlbmQ7CiAKLWZ1bmN0aW9uIFRUaHJpZnRTdHJlYW1JbXBsLlJlYWQodmFyIGJ1ZmZlcjogVEJ5dGVzOyBvZmZzZXQsCi0gIGNvdW50OiBJbnRlZ2VyKTogSW50ZWdlcjsKK2Z1bmN0aW9uIFRUaHJpZnRTdHJlYW1JbXBsLlJlYWQodmFyIGJ1ZmZlcjogVEJ5dGVzOyBvZmZzZXQsIGNvdW50OiBJbnRlZ2VyKTogSW50ZWdlcjsKK2JlZ2luCisgIGlmIExlbmd0aChidWZmZXIpID4gMAorICB0aGVuIFJlc3VsdCA6PSBSZWFkKCBAYnVmZmVyWzBdLCBMZW5ndGgoYnVmZmVyKSwgb2Zmc2V0LCBjb3VudCkKKyAgZWxzZSBSZXN1bHQgOj0gMDsKK2VuZDsKKworZnVuY3Rpb24gVFRocmlmdFN0cmVhbUltcGwuUmVhZCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOwogYmVnaW4KICAgUmVzdWx0IDo9IDA7Ci0gIENoZWNrU2l6ZUFuZE9mZnNldCggYnVmZmVyLCBvZmZzZXQsIGNvdW50ICk7CisgIENoZWNrU2l6ZUFuZE9mZnNldCggcEJ1ZiwgYnVmbGVuLCBvZmZzZXQsIGNvdW50ICk7CiBlbmQ7CiAKIHByb2NlZHVyZSBUVGhyaWZ0U3RyZWFtSW1wbC5Xcml0ZShjb25zdCBidWZmZXI6IFRCeXRlczsgb2Zmc2V0LCBjb3VudDogSW50ZWdlcik7CiBiZWdpbgotICBDaGVja1NpemVBbmRPZmZzZXQoIGJ1ZmZlciwgb2Zmc2V0LCBjb3VudCApOworICBpZiBMZW5ndGgoYnVmZmVyKSA+IDAKKyAgdGhlbiBXcml0ZSggQGJ1ZmZlclswXSwgb2Zmc2V0LCBjb3VudCk7CitlbmQ7CisKK3Byb2NlZHVyZSBUVGhyaWZ0U3RyZWFtSW1wbC5Xcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOworYmVnaW4KKyAgQ2hlY2tTaXplQW5kT2Zmc2V0KCBwQnVmLCBvZmZzZXQrY291bnQsIG9mZnNldCwgY291bnQpOwogZW5kOwogCiB7IFRUaHJpZnRTdHJlYW1BZGFwdGVyRGVscGhpIH0KQEAgLTIyOSwxNiArMjQzLDE1IEBACiAKIGRlc3RydWN0b3IgVFRocmlmdFN0cmVhbUFkYXB0ZXJEZWxwaGkuRGVzdHJveTsKIGJlZ2luCi0gIGlmIEZPd25zU3RyZWFtIHRoZW4KLSAgYmVnaW4KLSAgICBGU3RyZWFtLkZyZWU7Ci0gIGVuZDsKKyAgaWYgRk93bnNTdHJlYW0gCisgIHRoZW4gQ2xvc2U7CisgIAogICBpbmhlcml0ZWQ7CiBlbmQ7CiAKIHByb2NlZHVyZSBUVGhyaWZ0U3RyZWFtQWRhcHRlckRlbHBoaS5GbHVzaDsKIGJlZ2luCi0KKyAgLy8gbm90aGluZyB0byBkbwogZW5kOwogCiBmdW5jdGlvbiBUVGhyaWZ0U3RyZWFtQWRhcHRlckRlbHBoaS5Jc09wZW46IEJvb2xlYW47CkBAIC0yNDgsMTggKzI2MSwyMyBAQAogCiBwcm9jZWR1cmUgVFRocmlmdFN0cmVhbUFkYXB0ZXJEZWxwaGkuT3BlbjsKIGJlZ2luCi0KKyAgLy8gbm90aGluZyB0byBkbwogZW5kOwogCi1mdW5jdGlvbiBUVGhyaWZ0U3RyZWFtQWRhcHRlckRlbHBoaS5SZWFkKHZhciBidWZmZXI6IFRCeXRlczsgb2Zmc2V0LAotICBjb3VudDogSW50ZWdlcik6IEludGVnZXI7CitmdW5jdGlvbiBUVGhyaWZ0U3RyZWFtQWRhcHRlckRlbHBoaS5SZWFkKGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmZzZXQsIGNvdW50OiBJbnRlZ2VyKTogSW50ZWdlcjsKK3ZhciBwVG1wIDogUEJ5dGU7CiBiZWdpbgogICBpbmhlcml0ZWQ7Ci0gIFJlc3VsdCA6PSAwOwotICBpZiBjb3VudCA+IDAgdGhlbgotICBiZWdpbgotICAgIFJlc3VsdCA6PSBGU3RyZWFtLlJlYWQoIFBvaW50ZXIoQGJ1ZmZlcltvZmZzZXRdKV4sIGNvdW50KQotICBlbmQ7CisKKyAgaWYgY291bnQgPj0gYnVmbGVuLW9mZnNldAorICB0aGVuIGNvdW50IDo9IGJ1Zmxlbi1vZmZzZXQ7CisKKyAgaWYgY291bnQgPiAwIHRoZW4gYmVnaW4KKyAgICBwVG1wIDo9IHBCdWY7CisgICAgSW5jKCBwVG1wLCBvZmZzZXQpOworICAgIFJlc3VsdCA6PSBGU3RyZWFtLlJlYWQoIHBUbXBeLCBjb3VudCkKKyAgZW5kCisgIGVsc2UgUmVzdWx0IDo9IDA7CiBlbmQ7CiAKIGZ1bmN0aW9uIFRUaHJpZnRTdHJlYW1BZGFwdGVyRGVscGhpLlRvQXJyYXk6IFRCeXRlczsKQEAgLTI4NywxMyArMzA1LDE0IEBACiAgIGVuZAogZW5kOwogCi1wcm9jZWR1cmUgVFRocmlmdFN0cmVhbUFkYXB0ZXJEZWxwaGkuV3JpdGUoY29uc3QgYnVmZmVyOiBUQnl0ZXM7IG9mZnNldCwKLSAgY291bnQ6IEludGVnZXIpOworcHJvY2VkdXJlIFRUaHJpZnRTdHJlYW1BZGFwdGVyRGVscGhpLldyaXRlKGNvbnN0IHBCdWYgOiBQb2ludGVyOyBvZmZzZXQsIGNvdW50OiBJbnRlZ2VyKTsKK3ZhciBwVG1wIDogUEJ5dGU7CiBiZWdpbgogICBpbmhlcml0ZWQ7Ci0gIGlmIGNvdW50ID4gMCB0aGVuCi0gIGJlZ2luCi0gICAgRlN0cmVhbS5Xcml0ZSggUG9pbnRlcihAYnVmZmVyW29mZnNldF0pXiwgY291bnQpCisgIGlmIGNvdW50ID4gMCB0aGVuIGJlZ2luCisgICAgcFRtcCA6PSBwQnVmOworICAgIEluYyggcFRtcCwgb2Zmc2V0KTsKKyAgICBGU3RyZWFtLldyaXRlKCBwVG1wXiwgY291bnQpCiAgIGVuZDsKIGVuZDsKIApkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlRyYW5zcG9ydC5QaXBlcy5wYXMgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuVHJhbnNwb3J0LlBpcGVzLnBhcwppbmRleCA0OGViNWUyLi43N2EzNDNiIDEwMDY0NAotLS0gYS9saWIvZGVscGhpL3NyYy9UaHJpZnQuVHJhbnNwb3J0LlBpcGVzLnBhcworKysgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuVHJhbnNwb3J0LlBpcGVzLnBhcwpAQCAtMTksMTggKzE5LDIyIEBACiB1bml0IFRocmlmdC5UcmFuc3BvcnQuUGlwZXM7CiAKIHskV0FSTiBTWU1CT0xfUExBVEZPUk0gT0ZGfQoreyRJIFRocmlmdC5EZWZpbmVzLmluY30KIAogaW50ZXJmYWNlCiAKIHVzZXMKKyAgeyRJRkRFRiBPTERfVU5JVF9OQU1FU30KICAgV2luZG93cywgU3lzVXRpbHMsIE1hdGgsIEFjY0N0cmwsIEFjbEFQSSwgU3luY09ianMsCisgIHskRUxTRX0KKyAgV2luYXBpLldpbmRvd3MsIFN5c3RlbS5TeXNVdGlscywgU3lzdGVtLk1hdGgsIFdpbmFwaS5BY2NDdHJsLCBXaW5hcGkuQWNsQVBJLCBTeXN0ZW0uU3luY09ianMsCisgIHskRU5ESUZ9CiAgIFRocmlmdC5UcmFuc3BvcnQsCiAgIFRocmlmdC5VdGlscywKICAgVGhyaWZ0LlN0cmVhbTsKIAogY29uc3QKLSAgREVGQVVMVF9USFJJRlRfUElQRV9USU1FT1VUID0gREVGQVVMVF9USFJJRlRfVElNRU9VVCBkZXByZWNhdGVkICd1c2UgREVGQVVMVF9USFJJRlRfVElNRU9VVCc7Ci0KKyAgREVGQVVMVF9USFJJRlRfUElQRV9PUEVOX1RJTUVPVVQgPSAxMDsgIC8vIGRlZmF1bHQ6IGZhaWwgZmFzdCBvbiBvcGVuCiAKIAogdHlwZQpAQCAtNDEsMjMgKzQ1LDI2IEBACiAgIHN0cmljdCBwcm90ZWN0ZWQKICAgICBGUGlwZSAgICA6IFRIYW5kbGU7CiAgICAgRlRpbWVvdXQgOiBEV09SRDsKKyAgICBGT3BlblRpbWVPdXQgOiBEV09SRDsgIC8vIHNlcGFyYXRlIHZhbHVlIHRvIGFsbG93IGZvciBmYWlsLWZhc3Qtb24tb3BlbiBzY2VuYXJpb3MKICAgICBGT3ZlcmxhcHBlZCA6IEJvb2xlYW47CiAKLSAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IGJ1ZmZlcjogVEJ5dGVzOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTsgb3ZlcnJpZGU7Ci0gICAgZnVuY3Rpb24gIFJlYWQoIHZhciBidWZmZXI6IFRCeXRlczsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZnNldCwgY291bnQgOiBJbnRlZ2VyKTsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gIFJlYWQoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTogSW50ZWdlcjsgb3ZlcnJpZGU7CiAgICAgLy9wcm9jZWR1cmUgT3Blbjsgb3ZlcnJpZGU7IC0gc2VlIGRlcml2ZWQgY2xhc3NlcwogICAgIHByb2NlZHVyZSBDbG9zZTsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIEZsdXNoOyBvdmVycmlkZTsKIAotICAgIGZ1bmN0aW9uICBSZWFkRGlyZWN0KCAgICAgdmFyIGJ1ZmZlcjogVEJ5dGVzOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTogSW50ZWdlcjsKLSAgICBmdW5jdGlvbiAgUmVhZE92ZXJsYXBwZWQoIHZhciBidWZmZXI6IFRCeXRlczsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7Ci0gICAgcHJvY2VkdXJlIFdyaXRlRGlyZWN0KCAgICAgY29uc3QgYnVmZmVyOiBUQnl0ZXM7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOwotICAgIHByb2NlZHVyZSBXcml0ZU92ZXJsYXBwZWQoIGNvbnN0IGJ1ZmZlcjogVEJ5dGVzOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTsKKyAgICBmdW5jdGlvbiAgUmVhZERpcmVjdCggICAgIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTogSW50ZWdlcjsgIG92ZXJsb2FkOworICAgIGZ1bmN0aW9uICBSZWFkT3ZlcmxhcHBlZCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOyAgb3ZlcmxvYWQ7CisgICAgcHJvY2VkdXJlIFdyaXRlRGlyZWN0KCAgICAgY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOyAgb3ZlcmxvYWQ7CisgICAgcHJvY2VkdXJlIFdyaXRlT3ZlcmxhcHBlZCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOyAgb3ZlcmxvYWQ7CiAKICAgICBmdW5jdGlvbiBJc09wZW46IEJvb2xlYW47IG92ZXJyaWRlOwogICAgIGZ1bmN0aW9uIFRvQXJyYXk6IFRCeXRlczsgb3ZlcnJpZGU7CiAgIHB1YmxpYwotICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggYUVuYWJsZU92ZXJsYXBwZWQgOiBCb29sZWFuOyBjb25zdCBhVGltZU91dCA6IERXT1JEID0gREVGQVVMVF9USFJJRlRfVElNRU9VVCk7CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBhRW5hYmxlT3ZlcmxhcHBlZCA6IEJvb2xlYW47CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhVGltZU91dCA6IERXT1JEID0gREVGQVVMVF9USFJJRlRfVElNRU9VVDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFPcGVuVGltZU91dCA6IERXT1JEID0gREVGQVVMVF9USFJJRlRfUElQRV9PUEVOX1RJTUVPVVQpOwogICAgIGRlc3RydWN0b3IgRGVzdHJveTsgIG92ZXJyaWRlOwogICBlbmQ7CiAKQEAgLTc2LDcgKzgzLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFFbmFibGVPdmVybGFwcGVkIDogQm9vbGVhbjsKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFTaGFyZU1vZGU6IERXT1JEID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFTZWN1cml0eUF0dHJpYnV0ZXM6IFBTZWN1cml0eUF0dHJpYnV0ZXMgPSBuaWw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhVGltZU91dCA6IERXT1JEID0gREVGQVVMVF9USFJJRlRfVElNRU9VVCk7ICBvdmVybG9hZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFUaW1lT3V0IDogRFdPUkQgPSBERUZBVUxUX1RIUklGVF9USU1FT1VUOworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYU9wZW5UaW1lT3V0IDogRFdPUkQgPSBERUZBVUxUX1RIUklGVF9QSVBFX09QRU5fVElNRU9VVCk7ICBvdmVybG9hZDsKICAgZW5kOwogCiAKQEAgLTEyMCw3ICsxMjgsOCBAQAogICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgYVBpcGVOYW1lIDogc3RyaW5nOwogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYVNoYXJlTW9kZTogRFdPUkQgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYVNlY3VyaXR5QXR0cmlidXRlczogUFNlY3VyaXR5QXR0cmlidXRlcyA9IG5pbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFUaW1lT3V0IDogRFdPUkQgPSBERUZBVUxUX1RIUklGVF9USU1FT1VUKTsgIG92ZXJsb2FkOworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYVRpbWVPdXQgOiBEV09SRCA9IERFRkFVTFRfVEhSSUZUX1RJTUVPVVQ7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhT3BlblRpbWVPdXQgOiBEV09SRCA9IERFRkFVTFRfVEhSSUZUX1BJUEVfT1BFTl9USU1FT1VUKTsgIG92ZXJsb2FkOwogICBlbmQ7CiAKIApAQCAtMTM4LDcgKzE0Nyw5IEBACiAgIFRBbm9ueW1vdXNQaXBlVHJhbnNwb3J0SW1wbCA9IGNsYXNzKCBUUGlwZVRyYW5zcG9ydEJhc2UpCiAgIHB1YmxpYwogICAgIC8vIEFub255bW91cyBwaXBlIGNvbnN0cnVjdG9yCi0gICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBhUGlwZVJlYWQsIGFQaXBlV3JpdGUgOiBUSGFuZGxlOyBhT3duc0hhbmRsZXMgOiBCb29sZWFuKTsgb3ZlcmxvYWQ7CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKGNvbnN0IGFQaXBlUmVhZCwgYVBpcGVXcml0ZSA6IFRIYW5kbGU7CisgICAgICAgICAgICAgICAgICAgICAgIGFPd25zSGFuZGxlcyA6IEJvb2xlYW47CisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFUaW1lT3V0IDogRFdPUkQgPSBERUZBVUxUX1RIUklGVF9USU1FT1VUKTsgb3ZlcmxvYWQ7CiAgIGVuZDsKIAogCkBAIC0xODcsNiArMTk4LDcgQEAKICAgICBGQ2xpZW50QW5vblJlYWQsCiAgICAgRkNsaWVudEFub25Xcml0ZSAgOiBUSGFuZGxlOwogCisgICAgRlRpbWVPdXQ6IERXT1JEOwogICBwcm90ZWN0ZWQKICAgICBmdW5jdGlvbiBBY2NlcHQoY29uc3QgZm5BY2NlcHRpbmc6IFRQcm9jKTogSVRyYW5zcG9ydDsgb3ZlcnJpZGU7CiAKQEAgLTIwMSw3ICsyMTMsNyBAQAogICAgIHByb2NlZHVyZSBJbnRlcm5hbENsb3NlOyBvdmVycmlkZTsKIAogICBwdWJsaWMKLSAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGFCdWZzaXplIDogQ2FyZGluYWwgPSA0MDk2KTsKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoYUJ1ZnNpemUgOiBDYXJkaW5hbCA9IDQwOTY7IGFUaW1lT3V0IDogRFdPUkQgPSBERUZBVUxUX1RIUklGVF9USU1FT1VUKTsKICAgZW5kOwogCiAKQEAgLTIyNyw3ICsyMzksNyBAQAogICBwdWJsaWMKICAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGFQaXBlbmFtZSA6IHN0cmluZzsgYUJ1ZnNpemUgOiBDYXJkaW5hbCA9IDQwOTY7CiAgICAgICAgICAgICAgICAgICAgICAgICBhTWF4Q29ubnMgOiBDYXJkaW5hbCA9IFBJUEVfVU5MSU1JVEVEX0lOU1RBTkNFUzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFUaW1lT3V0IDogQ2FyZGluYWwgPSAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFUaW1lT3V0IDogQ2FyZGluYWwgPSBJTkZJTklURSk7CiAgIGVuZDsKIAogCkBAIC0yNTAsOCArMjYyLDcgQEAKICAgaWYgbm90IER1cGxpY2F0ZUhhbmRsZSggR2V0Q3VycmVudFByb2Nlc3MsIGhTb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldEN1cnJlbnRQcm9jZXNzLCBAcmVzdWx0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBGQUxTRSwgRFVQTElDQVRFX1NBTUVfQUNDRVNTKQotICB0aGVuIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24uQ3JlYXRlKCBUVHJhbnNwb3J0RXhjZXB0aW9uLlRFeGNlcHRpb25UeXBlLk5vdE9wZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdEdXBsaWNhdGVIYW5kbGU6ICcrU3lzRXJyb3JNZXNzYWdlKEdldExhc3RFcnJvcikpOworICB0aGVuIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnRHVwbGljYXRlSGFuZGxlOiAnK1N5c0Vycm9yTWVzc2FnZShHZXRMYXN0RXJyb3IpKTsKIGVuZDsKIAogCkBAIC0yNjAsMTMgKzI3MSwxNCBAQAogCiAKIGNvbnN0cnVjdG9yIFRQaXBlU3RyZWFtQmFzZS5DcmVhdGUoIGFFbmFibGVPdmVybGFwcGVkIDogQm9vbGVhbjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFUaW1lT3V0IDogRFdPUkQgPSBERUZBVUxUX1RIUklGVF9USU1FT1VUKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFUaW1lT3V0LCBhT3BlblRpbWVPdXQgOiBEV09SRCk7CiBiZWdpbgogICBpbmhlcml0ZWQgQ3JlYXRlOwotICBBU1NFUlQoIGFUaW1lb3V0ID4gMCk7Ci0gIEZQaXBlICAgICAgIDo9IElOVkFMSURfSEFORExFX1ZBTFVFOwotICBGVGltZW91dCAgICA6PSBhVGltZU91dDsKLSAgRk92ZXJsYXBwZWQgOj0gYUVuYWJsZU92ZXJsYXBwZWQ7CisgIEFTU0VSVCggYVRpbWVvdXQgPiAwKTsgIC8vIGFPcGVuVGltZW91dCBtYXkgYmUgMAorICBGUGlwZSAgICAgICAgOj0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CisgIEZUaW1lb3V0ICAgICA6PSBhVGltZU91dDsKKyAgRk9wZW5UaW1lT3V0IDo9IGFPcGVuVGltZU91dDsKKyAgRk92ZXJsYXBwZWQgIDo9IGFFbmFibGVPdmVybGFwcGVkOwogZW5kOwogCiAKQEAgLTI4OCw3ICszMDAsNyBAQAogCiBwcm9jZWR1cmUgVFBpcGVTdHJlYW1CYXNlLkZsdXNoOwogYmVnaW4KLSAgLy8gbm90aGluZyB0byBkbworICBGbHVzaEZpbGVCdWZmZXJzKCBGUGlwZSk7CiBlbmQ7CiAKIApAQCAtMjk4LDQ0ICszMTAsMTAyIEBACiBlbmQ7CiAKIAotcHJvY2VkdXJlIFRQaXBlU3RyZWFtQmFzZS5Xcml0ZShjb25zdCBidWZmZXI6IFRCeXRlczsgb2Zmc2V0LCBjb3VudDogSW50ZWdlcik7Citwcm9jZWR1cmUgVFBpcGVTdHJlYW1CYXNlLldyaXRlKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgb2Zmc2V0LCBjb3VudCA6IEludGVnZXIpOwogYmVnaW4KICAgaWYgRk92ZXJsYXBwZWQKLSAgdGhlbiBXcml0ZU92ZXJsYXBwZWQoIGJ1ZmZlciwgb2Zmc2V0LCBjb3VudCkKLSAgZWxzZSBXcml0ZURpcmVjdCggYnVmZmVyLCBvZmZzZXQsIGNvdW50KTsKKyAgdGhlbiBXcml0ZU92ZXJsYXBwZWQoIHBCdWYsIG9mZnNldCwgY291bnQpCisgIGVsc2UgV3JpdGVEaXJlY3QoIHBCdWYsIG9mZnNldCwgY291bnQpOwogZW5kOwogCiAKLWZ1bmN0aW9uIFRQaXBlU3RyZWFtQmFzZS5SZWFkKCB2YXIgYnVmZmVyOiBUQnl0ZXM7IG9mZnNldCwgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOworZnVuY3Rpb24gVFBpcGVTdHJlYW1CYXNlLlJlYWQoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTogSW50ZWdlcjsKIGJlZ2luCiAgIGlmIEZPdmVybGFwcGVkCi0gIHRoZW4gcmVzdWx0IDo9IFJlYWRPdmVybGFwcGVkKCBidWZmZXIsIG9mZnNldCwgY291bnQpCi0gIGVsc2UgcmVzdWx0IDo9IFJlYWREaXJlY3QoIGJ1ZmZlciwgb2Zmc2V0LCBjb3VudCk7CisgIHRoZW4gcmVzdWx0IDo9IFJlYWRPdmVybGFwcGVkKCBwQnVmLCBidWZsZW4sIG9mZnNldCwgY291bnQpCisgIGVsc2UgcmVzdWx0IDo9IFJlYWREaXJlY3QoIHBCdWYsIGJ1Zmxlbiwgb2Zmc2V0LCBjb3VudCk7CiBlbmQ7CiAKIAotcHJvY2VkdXJlIFRQaXBlU3RyZWFtQmFzZS5Xcml0ZURpcmVjdChjb25zdCBidWZmZXI6IFRCeXRlczsgb2Zmc2V0LCBjb3VudDogSW50ZWdlcik7Ci12YXIgY2JXcml0dGVuIDogRFdPUkQ7Citwcm9jZWR1cmUgVFBpcGVTdHJlYW1CYXNlLldyaXRlRGlyZWN0KCBjb25zdCBwQnVmIDogUG9pbnRlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik7Cit2YXIgY2JXcml0dGVuLCBuQnl0ZXMgOiBEV09SRDsKKyAgICBwRGF0YSA6IFBCeXRlOwogYmVnaW4KICAgaWYgbm90IElzT3BlbgotICB0aGVuIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24uQ3JlYXRlKCBUVHJhbnNwb3J0RXhjZXB0aW9uLlRFeGNlcHRpb25UeXBlLk5vdE9wZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDYWxsZWQgd3JpdGUgb24gbm9uLW9wZW4gcGlwZScpOworICB0aGVuIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnQ2FsbGVkIHdyaXRlIG9uIG5vbi1vcGVuIHBpcGUnKTsKIAotICBpZiBub3QgV3JpdGVGaWxlKCBGUGlwZSwgYnVmZmVyW29mZnNldF0sIGNvdW50LCBjYldyaXR0ZW4sIG5pbCkKLSAgdGhlbiByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uLkNyZWF0ZSggVFRyYW5zcG9ydEV4Y2VwdGlvbi5URXhjZXB0aW9uVHlwZS5Ob3RPcGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnV3JpdGUgdG8gcGlwZSBmYWlsZWQnKTsKKyAgLy8gaWYgbmVjZXNzYXJ5LCBzZW5kIHRoZSBkYXRhIGluIGNodW5rcworICAvLyB0aGVyZSdzIGEgc3lzdGVtIGxpbWl0IGFyb3VuZCAweDEwMDAwIGJ5dGVzIHRoYXQgd2UgaGl0IG90aGVyd2lzZQorICAvLyBNU0ROOiAiUGlwZSB3cml0ZSBvcGVyYXRpb25zIGFjcm9zcyBhIG5ldHdvcmsgYXJlIGxpbWl0ZWQgdG8gNjUsNTM1IGJ5dGVzIHBlciB3cml0ZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHBpcGVzLCBzZWUgdGhlIFJlbWFya3Mgc2VjdGlvbi4iCisgIG5CeXRlcyA6PSBNaW4oIDE1KjQwOTYsIGNvdW50KTsgLy8gMTYgd291bGQgZXhjZWVkIHRoZSBsaW1pdAorICBwRGF0YSAgOj0gcEJ1ZjsKKyAgSW5jKCBwRGF0YSwgb2Zmc2V0KTsKKyAgd2hpbGUgbkJ5dGVzID4gMCBkbyBiZWdpbgorICAgIGlmIG5vdCBXcml0ZUZpbGUoIEZQaXBlLCBwRGF0YV4sIG5CeXRlcywgY2JXcml0dGVuLCBuaWwpCisgICAgdGhlbiByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoJ1dyaXRlIHRvIHBpcGUgZmFpbGVkJyk7CisKKyAgICBJbmMoIHBEYXRhLCBjYldyaXR0ZW4pOworICAgIERlYyggY291bnQsIGNiV3JpdHRlbik7CisgICAgbkJ5dGVzIDo9IE1pbiggbkJ5dGVzLCBjb3VudCk7CisgIGVuZDsKIGVuZDsKIAogCi1mdW5jdGlvbiBUUGlwZVN0cmVhbUJhc2UuUmVhZERpcmVjdCggdmFyIGJ1ZmZlcjogVEJ5dGVzOyBvZmZzZXQsIGNvdW50OiBJbnRlZ2VyKTogSW50ZWdlcjsKLXZhciBjYlJlYWQsIGR3RXJyICA6IERXT1JEOworcHJvY2VkdXJlIFRQaXBlU3RyZWFtQmFzZS5Xcml0ZU92ZXJsYXBwZWQoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTsKK3ZhciBjYldyaXR0ZW4sIGR3V2FpdCwgZHdFcnJvciwgbkJ5dGVzIDogRFdPUkQ7CisgICAgb3ZlcmxhcHBlZCA6IElPdmVybGFwcGVkSGVscGVyOworICAgIHBEYXRhIDogUEJ5dGU7CitiZWdpbgorICBpZiBub3QgSXNPcGVuCisgIHRoZW4gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdDYWxsZWQgd3JpdGUgb24gbm9uLW9wZW4gcGlwZScpOworCisgIC8vIGlmIG5lY2Vzc2FyeSwgc2VuZCB0aGUgZGF0YSBpbiBjaHVua3MKKyAgLy8gdGhlcmUncyBhIHN5c3RlbSBsaW1pdCBhcm91bmQgMHgxMDAwMCBieXRlcyB0aGF0IHdlIGhpdCBvdGhlcndpc2UKKyAgLy8gTVNETjogIlBpcGUgd3JpdGUgb3BlcmF0aW9ucyBhY3Jvc3MgYSBuZXR3b3JrIGFyZSBsaW1pdGVkIHRvIDY1LDUzNSBieXRlcyBwZXIgd3JpdGUuIEZvciBtb3JlIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBwaXBlcywgc2VlIHRoZSBSZW1hcmtzIHNlY3Rpb24uIgorICBuQnl0ZXMgOj0gTWluKCAxNSo0MDk2LCBjb3VudCk7IC8vIDE2IHdvdWxkIGV4Y2VlZCB0aGUgbGltaXQKKyAgcERhdGEgIDo9IHBCdWY7CisgIEluYyggcERhdGEsIG9mZnNldCk7CisgIHdoaWxlIG5CeXRlcyA+IDAgZG8gYmVnaW4KKyAgICBvdmVybGFwcGVkIDo9IFRPdmVybGFwcGVkSGVscGVySW1wbC5DcmVhdGU7CisgICAgaWYgbm90IFdyaXRlRmlsZSggRlBpcGUsIHBEYXRhXiwgbkJ5dGVzLCBjYldyaXR0ZW4sIG92ZXJsYXBwZWQuT3ZlcmxhcHBlZFB0cikKKyAgICB0aGVuIGJlZ2luCisgICAgICBkd0Vycm9yIDo9IEdldExhc3RFcnJvcjsKKyAgICAgIGNhc2UgZHdFcnJvciBvZgorICAgICAgICBFUlJPUl9JT19QRU5ESU5HIDogYmVnaW4KKyAgICAgICAgICBkd1dhaXQgOj0gb3ZlcmxhcHBlZC5XYWl0Rm9yKEZUaW1lb3V0KTsKKworICAgICAgICAgIGlmIChkd1dhaXQgPSBXQUlUX1RJTUVPVVQpIHRoZW4gYmVnaW4KKyAgICAgICAgICAgIENhbmNlbElvKCBGUGlwZSk7ICAvLyBwcmV2ZW50cyBwb3NzaWJsZSBBViBvbiBpbnZhbGlkIG92ZXJsYXBwZWQgcHRyCisgICAgICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVGltZWRPdXQuQ3JlYXRlKCdQaXBlIHdyaXRlIHRpbWVkIG91dCcpOworICAgICAgICAgIGVuZDsKKworICAgICAgICAgIGlmIChkd1dhaXQgPD4gV0FJVF9PQkpFQ1RfMCkKKyAgICAgICAgICBvciBub3QgR2V0T3ZlcmxhcHBlZFJlc3VsdCggRlBpcGUsIG92ZXJsYXBwZWQuT3ZlcmxhcHBlZCwgY2JXcml0dGVuLCBUUlVFKQorICAgICAgICAgIHRoZW4gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblVua25vd24uQ3JlYXRlKCdQaXBlIHdyaXRlIGVycm9yJyk7CisgICAgICAgIGVuZDsKKworICAgICAgZWxzZQorICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVW5rbm93bi5DcmVhdGUoU3lzRXJyb3JNZXNzYWdlKGR3RXJyb3IpKTsKKyAgICAgIGVuZDsKKyAgICBlbmQ7CisKKyAgICBBU1NFUlQoIERXT1JEKG5CeXRlcykgPSBjYldyaXR0ZW4pOworCisgICAgSW5jKCBwRGF0YSwgY2JXcml0dGVuKTsKKyAgICBEZWMoIGNvdW50LCBjYldyaXR0ZW4pOworICAgIG5CeXRlcyA6PSBNaW4oIG5CeXRlcywgY291bnQpOworICBlbmQ7CitlbmQ7CisKKworZnVuY3Rpb24gVFBpcGVTdHJlYW1CYXNlLlJlYWREaXJlY3QoICAgICBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7Cit2YXIgY2JSZWFkLCBkd0VyciwgblJlbWFpbmluZyAgOiBEV09SRDsKICAgICBieXRlcywgcmV0cmllcyAgOiBMb25nSW50OwogICAgIGJPayAgICAgOiBCb29sZWFuOworICAgIHBEYXRhICAgOiBQQnl0ZTsKIGNvbnN0IElOVEVSVkFMID0gMTA7ICAvLyBtcwogYmVnaW4KICAgaWYgbm90IElzT3BlbgotICB0aGVuIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24uQ3JlYXRlKCBUVHJhbnNwb3J0RXhjZXB0aW9uLlRFeGNlcHRpb25UeXBlLk5vdE9wZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDYWxsZWQgcmVhZCBvbiBub24tb3BlbiBwaXBlJyk7CisgIHRoZW4gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdDYWxsZWQgcmVhZCBvbiBub24tb3BlbiBwaXBlJyk7CiAKICAgLy8gTVNETjogSGFuZGxlIGNhbiBiZSBhIGhhbmRsZSB0byBhIG5hbWVkIHBpcGUgaW5zdGFuY2UsCiAgIC8vIG9yIGl0IGNhbiBiZSBhIGhhbmRsZSB0byB0aGUgcmVhZCBlbmQgb2YgYW4gYW5vbnltb3VzIHBpcGUsCkBAIC0zNDMsMTExICs0MTMsODkgQEAKICAgaWYgRlRpbWVPdXQgPD4gSU5GSU5JVEUgdGhlbiBiZWdpbgogICAgIHJldHJpZXMgOj0gTWF4KCAxLCBSb3VuZCggMS4wICogRlRpbWVPdXQgLyBJTlRFUlZBTCkpOwogICAgIHdoaWxlIFRSVUUgZG8gYmVnaW4KLSAgICAgIGlmICBJc09wZW4KLSAgICAgIGFuZCBQZWVrTmFtZWRQaXBlKCBGUGlwZSwgbmlsLCAwLCBuaWwsIEBieXRlcywgbmlsKQotICAgICAgYW5kIChieXRlcyA+IDApCi0gICAgICB0aGVuIEJyZWFrOyAgLy8gdGhlcmUgYXJlIGRhdGEKLQotICAgICAgZHdFcnIgOj0gR2V0TGFzdEVycm9yOwotICAgICAgaWYgKGR3RXJyID0gRVJST1JfSU5WQUxJRF9IQU5ETEUpCi0gICAgICBvciAoZHdFcnIgPSBFUlJPUl9CUk9LRU5fUElQRSkKLSAgICAgIG9yIChkd0VyciA9IEVSUk9SX1BJUEVfTk9UX0NPTk5FQ1RFRCkKLSAgICAgIHRoZW4gYmVnaW4KLSAgICAgICAgcmVzdWx0IDo9IDA7ICAvLyBvdGhlciBzaWRlIGNsb3NlZCB0aGUgcGlwZQotICAgICAgICBFeGl0OworICAgICAgaWYgbm90IFBlZWtOYW1lZFBpcGUoIEZQaXBlLCBuaWwsIDAsIG5pbCwgQGJ5dGVzLCBuaWwpIHRoZW4gYmVnaW4KKyAgICAgICAgZHdFcnIgOj0gR2V0TGFzdEVycm9yOworICAgICAgICBpZiAoZHdFcnIgPSBFUlJPUl9JTlZBTElEX0hBTkRMRSkKKyAgICAgICAgb3IgKGR3RXJyID0gRVJST1JfQlJPS0VOX1BJUEUpCisgICAgICAgIG9yIChkd0VyciA9IEVSUk9SX1BJUEVfTk9UX0NPTk5FQ1RFRCkKKyAgICAgICAgdGhlbiBiZWdpbgorICAgICAgICAgIHJlc3VsdCA6PSAwOyAgLy8gb3RoZXIgc2lkZSBjbG9zZWQgdGhlIHBpcGUKKyAgICAgICAgICBFeGl0OworICAgICAgICBlbmQ7CisgICAgICBlbmQKKyAgICAgIGVsc2UgaWYgYnl0ZXMgPiAwIHRoZW4gYmVnaW4KKyAgICAgICAgQnJlYWs7ICAvLyB0aGVyZSBhcmUgZGF0YQogICAgICAgZW5kOwogCiAgICAgICBEZWMoIHJldHJpZXMpOwogICAgICAgaWYgcmV0cmllcyA+IDAKICAgICAgIHRoZW4gU2xlZXAoIElOVEVSVkFMKQotICAgICAgZWxzZSByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uLkNyZWF0ZSggVFRyYW5zcG9ydEV4Y2VwdGlvbi5URXhjZXB0aW9uVHlwZS5UaW1lZE91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdQaXBlIHJlYWQgdGltZWQgb3V0Jyk7CisgICAgICBlbHNlIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25UaW1lZE91dC5DcmVhdGUoJ1BpcGUgcmVhZCB0aW1lZCBvdXQnKTsKICAgICBlbmQ7CiAgIGVuZDsKIAotICAvLyByZWFkIHRoZSBkYXRhIChvciBibG9jayBJTkZJTklURS1seSkKLSAgYk9rIDo9IFJlYWRGaWxlKCBGUGlwZSwgYnVmZmVyW29mZnNldF0sIGNvdW50LCBjYlJlYWQsIG5pbCk7Ci0gIGlmIChub3QgYk9rKSBhbmQgKEdldExhc3RFcnJvcigpIDw+IEVSUk9SX01PUkVfREFUQSkKLSAgdGhlbiByZXN1bHQgOj0gMCAvLyBObyBtb3JlIGRhdGEsIHBvc3NpYmx5IGJlY2F1c2UgY2xpZW50IGRpc2Nvbm5lY3RlZC4KLSAgZWxzZSByZXN1bHQgOj0gY2JSZWFkOwotZW5kOworICByZXN1bHQgOj0gMDsKKyAgblJlbWFpbmluZyA6PSBjb3VudDsKKyAgcERhdGEgOj0gcEJ1ZjsKKyAgSW5jKCBwRGF0YSwgb2Zmc2V0KTsKKyAgd2hpbGUgblJlbWFpbmluZyA+IDAgZG8gYmVnaW4KKyAgICAvLyByZWFkIHRoZSBkYXRhIChvciBibG9jayBJTkZJTklURS1seSkKKyAgICBiT2sgOj0gUmVhZEZpbGUoIEZQaXBlLCBwRGF0YV4sIG5SZW1haW5pbmcsIGNiUmVhZCwgbmlsKTsKKyAgICBpZiAobm90IGJPaykgYW5kIChHZXRMYXN0RXJyb3IoKSA8PiBFUlJPUl9NT1JFX0RBVEEpCisgICAgdGhlbiBCcmVhazsgLy8gTm8gbW9yZSBkYXRhLCBwb3NzaWJseSBiZWNhdXNlIGNsaWVudCBkaXNjb25uZWN0ZWQuCiAKLQotcHJvY2VkdXJlIFRQaXBlU3RyZWFtQmFzZS5Xcml0ZU92ZXJsYXBwZWQoY29uc3QgYnVmZmVyOiBUQnl0ZXM7IG9mZnNldCwgY291bnQ6IEludGVnZXIpOwotdmFyIGNiV3JpdHRlbiwgZHdXYWl0LCBkd0Vycm9yIDogRFdPUkQ7Ci0gICAgb3ZlcmxhcHBlZCA6IElPdmVybGFwcGVkSGVscGVyOwotYmVnaW4KLSAgaWYgbm90IElzT3BlbgotICB0aGVuIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24uQ3JlYXRlKCBUVHJhbnNwb3J0RXhjZXB0aW9uLlRFeGNlcHRpb25UeXBlLk5vdE9wZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDYWxsZWQgd3JpdGUgb24gbm9uLW9wZW4gcGlwZScpOwotCi0gIG92ZXJsYXBwZWQgOj0gVE92ZXJsYXBwZWRIZWxwZXJJbXBsLkNyZWF0ZTsKLQotICBpZiBub3QgV3JpdGVGaWxlKCBGUGlwZSwgYnVmZmVyW29mZnNldF0sIGNvdW50LCBjYldyaXR0ZW4sIG92ZXJsYXBwZWQuT3ZlcmxhcHBlZFB0cikKLSAgdGhlbiBiZWdpbgotICAgIGR3RXJyb3IgOj0gR2V0TGFzdEVycm9yOwotICAgIGNhc2UgZHdFcnJvciBvZgotICAgICAgRVJST1JfSU9fUEVORElORyA6IGJlZ2luCi0gICAgICAgIGR3V2FpdCA6PSBvdmVybGFwcGVkLldhaXRGb3IoRlRpbWVvdXQpOwotCi0gICAgICAgIGlmIChkd1dhaXQgPSBXQUlUX1RJTUVPVVQpCi0gICAgICAgIHRoZW4gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbi5DcmVhdGUoIFRUcmFuc3BvcnRFeGNlcHRpb24uVEV4Y2VwdGlvblR5cGUuVGltZWRPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdQaXBlIHdyaXRlIHRpbWVkIG91dCcpOwotCi0gICAgICAgIGlmIChkd1dhaXQgPD4gV0FJVF9PQkpFQ1RfMCkKLSAgICAgICAgb3Igbm90IEdldE92ZXJsYXBwZWRSZXN1bHQoIEZQaXBlLCBvdmVybGFwcGVkLk92ZXJsYXBwZWQsIGNiV3JpdHRlbiwgVFJVRSkKLSAgICAgICAgdGhlbiByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uLkNyZWF0ZSggVFRyYW5zcG9ydEV4Y2VwdGlvbi5URXhjZXB0aW9uVHlwZS5Vbmtub3duLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUGlwZSB3cml0ZSBlcnJvcicpOwotICAgICAgZW5kOwotCi0gICAgZWxzZQotICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbi5DcmVhdGUoIFRUcmFuc3BvcnRFeGNlcHRpb24uVEV4Y2VwdGlvblR5cGUuVW5rbm93biwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXNFcnJvck1lc3NhZ2UoZHdFcnJvcikpOwotICAgIGVuZDsKKyAgICBEZWMoIG5SZW1haW5pbmcsIGNiUmVhZCk7CisgICAgSW5jKCBwRGF0YSwgY2JSZWFkKTsKKyAgICBJbmMoIHJlc3VsdCwgY2JSZWFkKTsKICAgZW5kOwotCi0gIEFTU0VSVCggRFdPUkQoY291bnQpID0gY2JXcml0dGVuKTsKIGVuZDsKIAogCi1mdW5jdGlvbiBUUGlwZVN0cmVhbUJhc2UuUmVhZE92ZXJsYXBwZWQoIHZhciBidWZmZXI6IFRCeXRlczsgb2Zmc2V0LCBjb3VudDogSW50ZWdlcik6IEludGVnZXI7Ci12YXIgY2JSZWFkLCBkd1dhaXQsIGR3RXJyb3IgIDogRFdPUkQ7CitmdW5jdGlvbiBUUGlwZVN0cmVhbUJhc2UuUmVhZE92ZXJsYXBwZWQoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTogSW50ZWdlcjsKK3ZhciBjYlJlYWQsIGR3V2FpdCwgZHdFcnJvciwgblJlbWFpbmluZyA6IERXT1JEOwogICAgIGJPayAgICAgOiBCb29sZWFuOwogICAgIG92ZXJsYXBwZWQgOiBJT3ZlcmxhcHBlZEhlbHBlcjsKKyAgICBwRGF0YSAgIDogUEJ5dGU7CiBiZWdpbgogICBpZiBub3QgSXNPcGVuCi0gIHRoZW4gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbi5DcmVhdGUoIFRUcmFuc3BvcnRFeGNlcHRpb24uVEV4Y2VwdGlvblR5cGUuTm90T3BlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NhbGxlZCByZWFkIG9uIG5vbi1vcGVuIHBpcGUnKTsKKyAgdGhlbiByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoJ0NhbGxlZCByZWFkIG9uIG5vbi1vcGVuIHBpcGUnKTsKIAotICBvdmVybGFwcGVkIDo9IFRPdmVybGFwcGVkSGVscGVySW1wbC5DcmVhdGU7CisgIHJlc3VsdCA6PSAwOworICBuUmVtYWluaW5nIDo9IGNvdW50OworICBwRGF0YSA6PSBwQnVmOworICBJbmMoIHBEYXRhLCBvZmZzZXQpOworICB3aGlsZSBuUmVtYWluaW5nID4gMCBkbyBiZWdpbgorICAgIG92ZXJsYXBwZWQgOj0gVE92ZXJsYXBwZWRIZWxwZXJJbXBsLkNyZWF0ZTsKIAotICAvLyByZWFkIHRoZSBkYXRhCi0gIGJPayA6PSBSZWFkRmlsZSggRlBpcGUsIGJ1ZmZlcltvZmZzZXRdLCBjb3VudCwgY2JSZWFkLCBvdmVybGFwcGVkLk92ZXJsYXBwZWRQdHIpOwotICBpZiBub3QgYk9rIHRoZW4gYmVnaW4KLSAgICBkd0Vycm9yIDo9IEdldExhc3RFcnJvcjsKLSAgICBjYXNlIGR3RXJyb3Igb2YKLSAgICAgIEVSUk9SX0lPX1BFTkRJTkcgOiBiZWdpbgotICAgICAgICBkd1dhaXQgOj0gb3ZlcmxhcHBlZC5XYWl0Rm9yKEZUaW1lb3V0KTsKKyAgICAgLy8gcmVhZCB0aGUgZGF0YQorICAgIGJPayA6PSBSZWFkRmlsZSggRlBpcGUsIHBEYXRhXiwgblJlbWFpbmluZywgY2JSZWFkLCBvdmVybGFwcGVkLk92ZXJsYXBwZWRQdHIpOworICAgIGlmIG5vdCBiT2sgdGhlbiBiZWdpbgorICAgICAgZHdFcnJvciA6PSBHZXRMYXN0RXJyb3I7CisgICAgICBjYXNlIGR3RXJyb3Igb2YKKyAgICAgICAgRVJST1JfSU9fUEVORElORyA6IGJlZ2luCisgICAgICAgICAgZHdXYWl0IDo9IG92ZXJsYXBwZWQuV2FpdEZvcihGVGltZW91dCk7CiAKLSAgICAgICAgaWYgKGR3V2FpdCA9IFdBSVRfVElNRU9VVCkKLSAgICAgICAgdGhlbiByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uLkNyZWF0ZSggVFRyYW5zcG9ydEV4Y2VwdGlvbi5URXhjZXB0aW9uVHlwZS5UaW1lZE91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1BpcGUgcmVhZCB0aW1lZCBvdXQnKTsKKyAgICAgICAgICBpZiAoZHdXYWl0ID0gV0FJVF9USU1FT1VUKSB0aGVuIGJlZ2luCisgICAgICAgICAgICBDYW5jZWxJbyggRlBpcGUpOyAgLy8gcHJldmVudHMgcG9zc2libGUgQVYgb24gaW52YWxpZCBvdmVybGFwcGVkIHB0cgorICAgICAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblRpbWVkT3V0LkNyZWF0ZSgnUGlwZSByZWFkIHRpbWVkIG91dCcpOworICAgICAgICAgIGVuZDsKIAotICAgICAgICBpZiAoZHdXYWl0IDw+IFdBSVRfT0JKRUNUXzApCi0gICAgICAgIG9yIG5vdCBHZXRPdmVybGFwcGVkUmVzdWx0KCBGUGlwZSwgb3ZlcmxhcHBlZC5PdmVybGFwcGVkLCBjYlJlYWQsIFRSVUUpCi0gICAgICAgIHRoZW4gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbi5DcmVhdGUoIFRUcmFuc3BvcnRFeGNlcHRpb24uVEV4Y2VwdGlvblR5cGUuVW5rbm93biwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1BpcGUgcmVhZCBlcnJvcicpOworICAgICAgICAgIGlmIChkd1dhaXQgPD4gV0FJVF9PQkpFQ1RfMCkKKyAgICAgICAgICBvciBub3QgR2V0T3ZlcmxhcHBlZFJlc3VsdCggRlBpcGUsIG92ZXJsYXBwZWQuT3ZlcmxhcHBlZCwgY2JSZWFkLCBUUlVFKQorICAgICAgICAgIHRoZW4gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblVua25vd24uQ3JlYXRlKCdQaXBlIHJlYWQgZXJyb3InKTsKKyAgICAgICAgZW5kOworCisgICAgICBlbHNlCisgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Vbmtub3duLkNyZWF0ZShTeXNFcnJvck1lc3NhZ2UoZHdFcnJvcikpOwogICAgICAgZW5kOwotCi0gICAgZWxzZQotICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbi5DcmVhdGUoIFRUcmFuc3BvcnRFeGNlcHRpb24uVEV4Y2VwdGlvblR5cGUuVW5rbm93biwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXNFcnJvck1lc3NhZ2UoZHdFcnJvcikpOwogICAgIGVuZDsKLSAgZW5kOwogCi0gIEFTU0VSVCggY2JSZWFkID4gMCk7ICAvLyBzZWUgVFRyYW5zcG9ydEltcGwuUmVhZEFsbCgpCi0gIEFTU0VSVCggY2JSZWFkID0gRFdPUkQoY291bnQpKTsKLSAgcmVzdWx0IDo9IGNiUmVhZDsKKyAgICBBU1NFUlQoIGNiUmVhZCA+IDApOyAgLy8gc2VlIFRUcmFuc3BvcnRJbXBsLlJlYWRBbGwoKQorICAgIEFTU0VSVCggY2JSZWFkIDw9IERXT1JEKG5SZW1haW5pbmcpKTsKKyAgICBEZWMoIG5SZW1haW5pbmcsIGNiUmVhZCk7CisgICAgSW5jKCBwRGF0YSwgY2JSZWFkKTsKKyAgICBJbmMoIHJlc3VsdCwgY2JSZWFkKTsKKyAgZW5kOwogZW5kOwogCiAKQEAgLTQ3NCw5ICs1MjIsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhRW5hYmxlT3ZlcmxhcHBlZCA6IEJvb2xlYW47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFTaGFyZU1vZGU6IERXT1JEOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhU2VjdXJpdHlBdHRyaWJ1dGVzOiBQU2VjdXJpdHlBdHRyaWJ1dGVzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhVGltZU91dCA6IERXT1JEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYVRpbWVPdXQsIGFPcGVuVGltZU91dCA6IERXT1JEKTsKIGJlZ2luCi0gIGluaGVyaXRlZCBDcmVhdGUoIGFFbmFibGVPdmVybGFwcGVkLCBhVGltZW91dCk7CisgIGluaGVyaXRlZCBDcmVhdGUoIGFFbmFibGVPdmVybGFwcGVkLCBhVGltZW91dCwgYU9wZW5UaW1lT3V0KTsKIAogICBGUGlwZU5hbWUgICAgICAgIDo9IGFQaXBlTmFtZTsKICAgRlNoYXJlTW9kZSAgICAgICA6PSBhU2hhcmVNb2RlOwpAQCAtNDg5LDE1ICs1MzcsMzMgQEAKIAogcHJvY2VkdXJlIFROYW1lZFBpcGVTdHJlYW1JbXBsLk9wZW47CiB2YXIgaFBpcGUgICAgOiBUSGFuZGxlOworICAgIHJldHJpZXMsIHRpbWVvdXQsIGR3RXJyIDogRFdPUkQ7Citjb25zdCBJTlRFUlZBTCA9IDEwOyAvLyBtcwogYmVnaW4KICAgaWYgSXNPcGVuIHRoZW4gRXhpdDsKIAorICByZXRyaWVzIDo9IE1heCggMSwgUm91bmQoIDEuMCAqIEZPcGVuVGltZU91dCAvIElOVEVSVkFMKSk7CisgIHRpbWVvdXQgOj0gRk9wZW5UaW1lT3V0OworCisgIC8vIGlmIHRoZSBzZXJ2ZXIgaGFzbid0IGdvdHRlbiB0byB0aGUgcG9pbnQgd2hlcmUgdGhlIHBpcGUgaGFzIGJlZW4gY3JlYXRlZCwgYXQgbGVhc3Qgd2FpdCB0aGUgdGltZW91dAorICAvLyBBY2NvcmRpbmcgdG8gTVNETiwgaWYgbm8gaW5zdGFuY2VzIG9mIHRoZSBzcGVjaWZpZWQgbmFtZWQgcGlwZSBleGlzdCwgdGhlIFdhaXROYW1lZFBpcGUgZnVuY3Rpb24KKyAgLy8gcmV0dXJucyBJTU1FRElBVEVMWSwgcmVnYXJkbGVzcyBvZiB0aGUgdGltZS1vdXQgdmFsdWUuCisgIC8vIEFsd2F5cyB1c2UgSU5URVJWQUwsIHNpbmNlIFdhaXROYW1lZFBpcGUoMCkgZGVmYXVsdHMgdG8gc29tZSBvdGhlciB2YWx1ZQorICB3aGlsZSBub3QgV2FpdE5hbWVkUGlwZSggUENoYXIoRlBpcGVOYW1lKSwgSU5URVJWQUwpIGRvIGJlZ2luCisgICAgZHdFcnIgOj0gR2V0TGFzdEVycm9yOworICAgIGlmIGR3RXJyIDw+IEVSUk9SX0ZJTEVfTk9UX0ZPVU5ECisgICAgdGhlbiByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoJ1VuYWJsZSB0byBvcGVuIHBpcGUsICcrU3lzRXJyb3JNZXNzYWdlKGR3RXJyKSk7CisKKyAgICBpZiB0aW1lb3V0IDw+IElORklOSVRFIHRoZW4gYmVnaW4KKyAgICAgIGlmIChyZXRyaWVzID4gMCkKKyAgICAgIHRoZW4gRGVjKHJldHJpZXMpCisgICAgICBlbHNlIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnVW5hYmxlIHRvIG9wZW4gcGlwZSwgdGltZWQgb3V0Jyk7CisgICAgZW5kOworCisgICAgU2xlZXAoSU5URVJWQUwpCisgIGVuZDsKKwogICAvLyBvcGVuIHRoYXQgdGhpbmd5Ci0KLSAgaWYgbm90IFdhaXROYW1lZFBpcGUoIFBDaGFyKEZQaXBlTmFtZSksIEZUaW1lb3V0KQotICB0aGVuIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24uQ3JlYXRlKCBUVHJhbnNwb3J0RXhjZXB0aW9uLlRFeGNlcHRpb25UeXBlLk5vdE9wZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdVbmFibGUgdG8gb3BlbiBwaXBlLCAnK1N5c0Vycm9yTWVzc2FnZShHZXRMYXN0RXJyb3IpKTsKLQogICBoUGlwZSA6PSBDcmVhdGVGaWxlKCBQQ2hhciggRlBpcGVOYW1lKSwKICAgICAgICAgICAgICAgICAgICAgICAgR0VORVJJQ19SRUFEIG9yIEdFTkVSSUNfV1JJVEUsCiAgICAgICAgICAgICAgICAgICAgICAgIEZTaGFyZU1vZGUsICAgICAgICAvLyBzaGFyaW5nCkBAIC01MDcsOCArNTczLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgMCk7ICAgICAgICAgICAgICAgIC8vIG5vIHRlbXBsYXRlIGZpbGUKIAogICBpZiBoUGlwZSA9IElOVkFMSURfSEFORExFX1ZBTFVFCi0gIHRoZW4gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbi5DcmVhdGUoIFRUcmFuc3BvcnRFeGNlcHRpb24uVEV4Y2VwdGlvblR5cGUuTm90T3BlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1VuYWJsZSB0byBvcGVuIHBpcGUsICcrU3lzRXJyb3JNZXNzYWdlKEdldExhc3RFcnJvcikpOworICB0aGVuIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnVW5hYmxlIHRvIG9wZW4gcGlwZSwgJytTeXNFcnJvck1lc3NhZ2UoR2V0TGFzdEVycm9yKSk7CiAKICAgLy8gZXZlcnl0aGluZyBmaW5lCiAgIEZQaXBlIDo9IGhQaXBlOwpAQCAtNTc4LDExICs2NDMsMTEgQEAKIAogY29uc3RydWN0b3IgVE5hbWVkUGlwZVRyYW5zcG9ydENsaWVudEVuZEltcGwuQ3JlYXRlKCBjb25zdCBhUGlwZU5hbWUgOiBzdHJpbmc7IGNvbnN0IGFTaGFyZU1vZGU6IERXT1JEOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhU2VjdXJpdHlBdHRyaWJ1dGVzOiBQU2VjdXJpdHlBdHRyaWJ1dGVzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhVGltZU91dCA6IERXT1JEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYVRpbWVPdXQsIGFPcGVuVGltZU91dCA6IERXT1JEKTsKIC8vIE5hbWVkIHBpcGUgY29uc3RydWN0b3IKIGJlZ2luCiAgIGluaGVyaXRlZCBDcmVhdGUoIG5pbCwgbmlsKTsKLSAgRklucHV0U3RyZWFtICA6PSBUTmFtZWRQaXBlU3RyZWFtSW1wbC5DcmVhdGUoIGFQaXBlTmFtZSwgVFJVRSwgYVNoYXJlTW9kZSwgYVNlY3VyaXR5QXR0cmlidXRlcywgYVRpbWVPdXQpOworICBGSW5wdXRTdHJlYW0gIDo9IFROYW1lZFBpcGVTdHJlYW1JbXBsLkNyZWF0ZSggYVBpcGVOYW1lLCBUUlVFLCBhU2hhcmVNb2RlLCBhU2VjdXJpdHlBdHRyaWJ1dGVzLCBhVGltZU91dCwgYU9wZW5UaW1lT3V0KTsKICAgRk91dHB1dFN0cmVhbSA6PSBGSW5wdXRTdHJlYW07ICAvLyB0cnVlIGZvciBuYW1lZCBwaXBlcwogZW5kOwogCkBAIC02MjIsMTMgKzY4NywxNSBAQAogeyBUQW5vbnltb3VzUGlwZVRyYW5zcG9ydEltcGwgfQogCiAKLWNvbnN0cnVjdG9yIFRBbm9ueW1vdXNQaXBlVHJhbnNwb3J0SW1wbC5DcmVhdGUoIGNvbnN0IGFQaXBlUmVhZCwgYVBpcGVXcml0ZSA6IFRIYW5kbGU7IGFPd25zSGFuZGxlcyA6IEJvb2xlYW4pOworY29uc3RydWN0b3IgVEFub255bW91c1BpcGVUcmFuc3BvcnRJbXBsLkNyZWF0ZSggY29uc3QgYVBpcGVSZWFkLCBhUGlwZVdyaXRlIDogVEhhbmRsZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFPd25zSGFuZGxlcyA6IEJvb2xlYW47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhVGltZU91dCA6IERXT1JEID0gREVGQVVMVF9USFJJRlRfVElNRU9VVCk7CiAvLyBBbm9ueW1vdXMgcGlwZSBjb25zdHJ1Y3RvcgogYmVnaW4KICAgaW5oZXJpdGVkIENyZWF0ZSggbmlsLCBuaWwpOwogICAvLyBvdmVybGFwcGVkIGlzIG5vdCBzdXBwb3J0ZWQgd2l0aCBBbm9uUGlwZXMsIHNlZSBNU0ROCi0gIEZJbnB1dFN0cmVhbSAgOj0gVEhhbmRsZVBpcGVTdHJlYW1JbXBsLkNyZWF0ZSggYVBpcGVSZWFkLCBhT3duc0hhbmRsZXMsIEZBTFNFKTsKLSAgRk91dHB1dFN0cmVhbSA6PSBUSGFuZGxlUGlwZVN0cmVhbUltcGwuQ3JlYXRlKCBhUGlwZVdyaXRlLCBhT3duc0hhbmRsZXMsIEZBTFNFKTsKKyAgRklucHV0U3RyZWFtICA6PSBUSGFuZGxlUGlwZVN0cmVhbUltcGwuQ3JlYXRlKCBhUGlwZVJlYWQsIGFPd25zSGFuZGxlcywgRkFMU0UsIGFUaW1lT3V0KTsKKyAgRk91dHB1dFN0cmVhbSA6PSBUSGFuZGxlUGlwZVN0cmVhbUltcGwuQ3JlYXRlKCBhUGlwZVdyaXRlLCBhT3duc0hhbmRsZXMsIEZBTFNFLCBhVGltZU91dCk7CiBlbmQ7CiAKIApAQCAtNjc1LDcgKzc0Miw3IEBACiB7IFRBbm9ueW1vdXNQaXBlU2VydmVyVHJhbnNwb3J0SW1wbCB9CiAKIAotY29uc3RydWN0b3IgVEFub255bW91c1BpcGVTZXJ2ZXJUcmFuc3BvcnRJbXBsLkNyZWF0ZSggYUJ1ZnNpemUgOiBDYXJkaW5hbCk7Citjb25zdHJ1Y3RvciBUQW5vbnltb3VzUGlwZVNlcnZlclRyYW5zcG9ydEltcGwuQ3JlYXRlKGFCdWZzaXplIDogQ2FyZGluYWw7IGFUaW1lT3V0IDogRFdPUkQpOwogLy8gQW5vbnltb3VzIHBpcGUgQ1RPUgogYmVnaW4KICAgaW5oZXJpdGVkIENyZWF0ZTsKQEAgLTY4NCwxMyArNzUxLDEzIEBACiAgIEZXcml0ZUhhbmRsZSA6PSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKICAgRkNsaWVudEFub25SZWFkIDo9IElOVkFMSURfSEFORExFX1ZBTFVFOwogICBGQ2xpZW50QW5vbldyaXRlIDo9IElOVkFMSURfSEFORExFX1ZBTFVFOworICBGVGltZU91dCA6PSBhVGltZU91dDsKIAogICAvLyBUaGUgYW5vbnltb3VzIHBpcGUgbmVlZHMgdG8gYmUgY3JlYXRlZCBmaXJzdCBzbyB0aGF0IHRoZSBzZXJ2ZXIgY2FuCiAgIC8vIHBhc3MgdGhlIGhhbmRsZXMgb24gdG8gdGhlIGNsaWVudCBiZWZvcmUgdGhlIHNlcnZlIChhY2NlcHRJbXBsKQogICAvLyBibG9ja2luZyBjYWxsLgogICBpZiBub3QgQ3JlYXRlQW5vblBpcGUKLSAgdGhlbiByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uLkNyZWF0ZSggVFRyYW5zcG9ydEV4Y2VwdGlvbi5URXhjZXB0aW9uVHlwZS5Ob3RPcGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc05hbWUrJy5DcmVhdGUoKSBmYWlsZWQnKTsKKyAgdGhlbiByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoQ2xhc3NOYW1lKycuQ3JlYXRlKCkgZmFpbGVkJyk7CiBlbmQ7CiAKIApAQCAtNzA0LDExICs3NzEsMTAgQEAKICAgLy8gVGhpcyAwLWJ5dGUgcmVhZCBzZXJ2ZXMgbWVyZWx5IGFzIGEgYmxvY2tpbmcgY2FsbC4KICAgaWYgbm90IFJlYWRGaWxlKCBGUmVhZEhhbmRsZSwgYnVmLCAwLCBiciwgbmlsKQogICBhbmQgKEdldExhc3RFcnJvcigpIDw+IEVSUk9SX01PUkVfREFUQSkKLSAgdGhlbiByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uLkNyZWF0ZSggVFRyYW5zcG9ydEV4Y2VwdGlvbi5URXhjZXB0aW9uVHlwZS5Ob3RPcGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVFNlcnZlclBpcGUgdW5hYmxlIHRvIGluaXRpYXRlIHBpcGUgY29tbXVuaWNhdGlvbicpOworICB0aGVuIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnVFNlcnZlclBpcGUgdW5hYmxlIHRvIGluaXRpYXRlIHBpcGUgY29tbXVuaWNhdGlvbicpOwogCiAgIC8vIGNyZWF0ZSB0aGUgdHJhbnNwb3J0IGltcGwKLSAgcmVzdWx0IDo9IFRBbm9ueW1vdXNQaXBlVHJhbnNwb3J0SW1wbC5DcmVhdGUoIEZSZWFkSGFuZGxlLCBGV3JpdGVIYW5kbGUsIEZBTFNFKTsKKyAgcmVzdWx0IDo9IFRBbm9ueW1vdXNQaXBlVHJhbnNwb3J0SW1wbC5DcmVhdGUoIEZSZWFkSGFuZGxlLCBGV3JpdGVIYW5kbGUsIEZBTFNFLCBGVGltZU91dCk7CiBlbmQ7CiAKIApAQCAtNzUwLDggKzgxNiw2IEBACiAgICAgc2EgICAgICAgICAgIDogU0VDVVJJVFlfQVRUUklCVVRFUzsgLy9UU2VjdXJpdHlBdHRyaWJ1dGVzOwogICAgIGhDQVIsIGhQaXBlVywgaENBVywgaFBpcGUgOiBUSGFuZGxlOwogYmVnaW4KLSAgcmVzdWx0IDo9IEZBTFNFOwotCiAgIHNkIDo9IFBTRUNVUklUWV9ERVNDUklQVE9SKCBMb2NhbEFsbG9jKCBMUFRSLFNFQ1VSSVRZX0RFU0NSSVBUT1JfTUlOX0xFTkdUSCkpOwogICB0cnkKICAgICBXaW4zMkNoZWNrKCBJbml0aWFsaXplU2VjdXJpdHlEZXNjcmlwdG9yKCBzZCwgU0VDVVJJVFlfREVTQ1JJUFRPUl9SRVZJU0lPTikpOwpAQCAtNzYxLDE3ICs4MjUsMTcgQEAKICAgICBzYS5scFNlY3VyaXR5RGVzY3JpcHRvciA6PSBzZDsKICAgICBzYS5iSW5oZXJpdEhhbmRsZSAgICAgICA6PSBUUlVFOyAvL2FsbG93IHBhc3NpbmcgaGFuZGxlIHRvIGNoaWxkCiAKLSAgICBpZiBub3QgQ3JlYXRlUGlwZSggaENBUiwgaFBpcGVXLCBAc2EsIEZCdWZTaXplKSB0aGVuIGJlZ2luICAgLy9jcmVhdGUgc3RkaW4gcGlwZQotICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbi5DcmVhdGUoIFRUcmFuc3BvcnRFeGNlcHRpb24uVEV4Y2VwdGlvblR5cGUuTm90T3BlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVFNlcnZlclBpcGUgQ3JlYXRlUGlwZSAoYW5vbikgZmFpbGVkLCAnK1N5c0Vycm9yTWVzc2FnZShHZXRMYXN0RXJyb3IpKTsKKyAgICBSZXN1bHQgOj0gQ3JlYXRlUGlwZSggaENBUiwgaFBpcGVXLCBAc2EsIEZCdWZTaXplKTsgLy9jcmVhdGUgc3RkaW4gcGlwZQorICAgIGlmIG5vdCBSZXN1bHQgdGhlbiBiZWdpbiAgIC8vY3JlYXRlIHN0ZGluIHBpcGUKKyAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnVFNlcnZlclBpcGUgQ3JlYXRlUGlwZSAoYW5vbikgZmFpbGVkLCAnK1N5c0Vycm9yTWVzc2FnZShHZXRMYXN0RXJyb3IpKTsKICAgICAgIEV4aXQ7CiAgICAgZW5kOwogCi0gICAgaWYgbm90IENyZWF0ZVBpcGUoIGhQaXBlLCBoQ0FXLCBAc2EsIEZCdWZTaXplKSB0aGVuIGJlZ2luICAvL2NyZWF0ZSBzdGRvdXQgcGlwZQorICAgIFJlc3VsdCA6PSBDcmVhdGVQaXBlKCBoUGlwZSwgaENBVywgQHNhLCBGQnVmU2l6ZSk7IC8vY3JlYXRlIHN0ZG91dCBwaXBlCisgICAgaWYgbm90IFJlc3VsdCB0aGVuIGJlZ2luICAvL2NyZWF0ZSBzdGRvdXQgcGlwZQogICAgICAgQ2xvc2VIYW5kbGUoIGhDQVIpOwogICAgICAgQ2xvc2VIYW5kbGUoIGhQaXBlVyk7Ci0gICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uLkNyZWF0ZSggVFRyYW5zcG9ydEV4Y2VwdGlvbi5URXhjZXB0aW9uVHlwZS5Ob3RPcGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUU2VydmVyUGlwZSBDcmVhdGVQaXBlIChhbm9uKSBmYWlsZWQsICcrU3lzRXJyb3JNZXNzYWdlKEdldExhc3RFcnJvcikpOworICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdUU2VydmVyUGlwZSBDcmVhdGVQaXBlIChhbm9uKSBmYWlsZWQsICcrU3lzRXJyb3JNZXNzYWdlKEdldExhc3RFcnJvcikpOwogICAgICAgRXhpdDsKICAgICBlbmQ7CiAKQEAgLTc3OSw5ICs4NDMsNiBAQAogICAgIEZDbGllbnRBbm9uV3JpdGUgOj0gaENBVzsKICAgICBGUmVhZEhhbmRsZSAgICAgIDo9IGhQaXBlOwogICAgIEZXcml0ZUhhbmRsZSAgICAgOj0gaFBpcGVXOwotCi0gICAgcmVzdWx0IDo9IFRSVUU7Ci0KICAgZmluYWxseQogICAgIGlmIHNkIDw+IG5pbCB0aGVuIExvY2FsRnJlZSggQ2FyZGluYWwoc2QpKTsKICAgZW5kOwpAQCAtODE2LDEwICs4NzcsMTMgQEAKICAgb3ZlcmxhcHBlZCA6PSBUT3ZlcmxhcHBlZEhlbHBlckltcGwuQ3JlYXRlOwogCiAgIEFTU0VSVCggbm90IEZDb25uZWN0ZWQpOworICBDcmVhdGVOYW1lZFBpcGU7CiAgIHdoaWxlIG5vdCBGQ29ubmVjdGVkIGRvIGJlZ2luCi0gICAgSW50ZXJuYWxDbG9zZTsKLSAgICBpZiBRdWVyeVN0b3BTZXJ2ZXIgdGhlbiBBYm9ydDsKLSAgICBDcmVhdGVOYW1lZFBpcGU7CisKKyAgICBpZiBRdWVyeVN0b3BTZXJ2ZXIgdGhlbiBiZWdpbgorICAgICAgSW50ZXJuYWxDbG9zZTsKKyAgICAgIEFib3J0OworICAgIGVuZDsKIAogICAgIGlmIEFzc2lnbmVkKGZuQWNjZXB0aW5nKQogICAgIHRoZW4gZm5BY2NlcHRpbmcoKTsKQEAgLTg1MSw4ICs5MTUsNyBAQAogCiAgICAgZWxzZQogICAgICAgSW50ZXJuYWxDbG9zZTsKLSAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24uQ3JlYXRlKCBUVHJhbnNwb3J0RXhjZXB0aW9uLlRFeGNlcHRpb25UeXBlLk5vdE9wZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NsaWVudCBjb25uZWN0aW9uIGZhaWxlZCcpOworICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdDbGllbnQgY29ubmVjdGlvbiBmYWlsZWQnKTsKICAgICBlbmQ7CiAgIGVuZDsKIApAQCAtODk3LDcgKzk2MCw3IEBACiBmdW5jdGlvbiBUTmFtZWRQaXBlU2VydmVyVHJhbnNwb3J0SW1wbC5IYW5kbGUgOiBUSGFuZGxlOwogYmVnaW4KICAgeyRJRkRFRiBXSU42NH0KLSAgcmVzdWx0IDo9IFRIYW5kbGUoIEludGVybG9ja2VkRXhjaGFuZ2VBZGQ2NCggSW50ZWdlcihGSGFuZGxlKSwgMCkpOworICByZXN1bHQgOj0gVEhhbmRsZSggSW50ZXJsb2NrZWRFeGNoYW5nZUFkZDY0KCBJbnQ2NChGSGFuZGxlKSwgMCkpOwogICB7JEVMU0V9CiAgIHJlc3VsdCA6PSBUSGFuZGxlKCBJbnRlcmxvY2tlZEV4Y2hhbmdlQWRkKCBJbnRlZ2VyKEZIYW5kbGUpLCAwKSk7CiAgIHskRU5ESUZ9CkBAIC05NDUsMjEgKzEwMDgsMjYgQEAKICAgICBzYS5iSW5oZXJpdEhhbmRsZSAgICAgICA6PSBGQUxTRTsKIAogICAgIC8vIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgbmFtZWQgcGlwZQotICAgIHJlc3VsdCA6PSBXaW5kb3dzLkNyZWF0ZU5hbWVkUGlwZSggUENoYXIoIEZQaXBlTmFtZSksICAgICAgICAvLyBwaXBlIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBJUEVfQUNDRVNTX0RVUExFWCBvciAgICAgLy8gcmVhZC93cml0ZSBhY2Nlc3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJTEVfRkxBR19PVkVSTEFQUEVELCAgICAgLy8gYXN5bmMgbW9kZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUElQRV9UWVBFX0JZVEUgb3IgICAgICAgICAvLyBieXRlIHR5cGUgcGlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUElQRV9SRUFETU9ERV9CWVRFLCAgICAgICAvLyBieXRlIHJlYWQgbW9kZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRk1heENvbm5zLCAgICAgICAgICAgICAgICAvLyBtYXguIGluc3RhbmNlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkJ1ZlNpemUsICAgICAgICAgICAgICAgICAvLyBvdXRwdXQgYnVmZmVyIHNpemUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZCdWZTaXplLCAgICAgICAgICAgICAgICAgLy8gaW5wdXQgYnVmZmVyIHNpemUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUaW1lb3V0LCAgICAgICAgICAgICAgICAgLy8gdGltZS1vdXQsIHNlZSBNU0ROCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAc2EpOyAgICAgICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgc2VjdXJpdHkgYXR0cmlidXRlCisgICAgeyRJRkRFRiBPTERfVU5JVF9OQU1FU30KKyAgICByZXN1bHQgOj0gV2luZG93cy5DcmVhdGVOYW1lZFBpcGUoCisgICAgeyRFTFNFfQorICAgIHJlc3VsdCA6PSBXaW5hcGkuV2luZG93cy5DcmVhdGVOYW1lZFBpcGUoCisgICAgeyRFTkRJRn0KKyAgICAgICAgUENoYXIoIEZQaXBlTmFtZSksICAgICAgICAvLyBwaXBlIG5hbWUKKyAgICAgICAgUElQRV9BQ0NFU1NfRFVQTEVYIG9yICAgICAvLyByZWFkL3dyaXRlIGFjY2VzcworICAgICAgICBGSUxFX0ZMQUdfT1ZFUkxBUFBFRCwgICAgIC8vIGFzeW5jIG1vZGUKKyAgICAgICAgUElQRV9UWVBFX0JZVEUgb3IgICAgICAgICAvLyBieXRlIHR5cGUgcGlwZQorICAgICAgICBQSVBFX1JFQURNT0RFX0JZVEUsICAgICAgIC8vIGJ5dGUgcmVhZCBtb2RlCisgICAgICAgIEZNYXhDb25ucywgICAgICAgICAgICAgICAgLy8gbWF4LiBpbnN0YW5jZXMKKyAgICAgICAgRkJ1ZlNpemUsICAgICAgICAgICAgICAgICAvLyBvdXRwdXQgYnVmZmVyIHNpemUKKyAgICAgICAgRkJ1ZlNpemUsICAgICAgICAgICAgICAgICAvLyBpbnB1dCBidWZmZXIgc2l6ZQorICAgICAgICBGVGltZW91dCwgICAgICAgICAgICAgICAgIC8vIHRpbWUtb3V0LCBzZWUgTVNETgorICAgICAgICBAc2EgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgc2VjdXJpdHkgYXR0cmlidXRlCisgICAgKTsKIAogICAgIGlmKCByZXN1bHQgPD4gSU5WQUxJRF9IQU5ETEVfVkFMVUUpCiAgICAgdGhlbiBJbnRlcmxvY2tlZEV4Y2hhbmdlUG9pbnRlciggUG9pbnRlcihGSGFuZGxlKSwgUG9pbnRlcihyZXN1bHQpKQotICAgIGVsc2UgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbi5DcmVhdGUoIFRUcmFuc3BvcnRFeGNlcHRpb24uVEV4Y2VwdGlvblR5cGUuTm90T3BlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ3JlYXRlTmFtZWRQaXBlKCkgZmFpbGVkICcgKyBJbnRUb1N0cihHZXRMYXN0RXJyb3IpKTsKKyAgICBlbHNlIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnQ3JlYXRlTmFtZWRQaXBlKCkgZmFpbGVkICcgKyBJbnRUb1N0cihHZXRMYXN0RXJyb3IpKTsKIAogICBmaW5hbGx5CiAgICAgaWYgc2QgPD4gbmlsIHRoZW4gTG9jYWxGcmVlKCBDYXJkaW5hbCggc2QpKTsKZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5UcmFuc3BvcnQucGFzIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlRyYW5zcG9ydC5wYXMKaW5kZXggOTY3MzVlYy4uZGFkOWFiNyAxMDA2NDQKLS0tIGEvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlRyYW5zcG9ydC5wYXMKKysrIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlRyYW5zcG9ydC5wYXMKQEAgLTE2LDM3ICsxNiw0OSBAQAogICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKikKLQotIHskU0NPUEVERU5VTVMgT059Ci0KIHVuaXQgVGhyaWZ0LlRyYW5zcG9ydDsKIAoreyRJIFRocmlmdC5EZWZpbmVzLmluY30KK3skU0NPUEVERU5VTVMgT059CisKIGludGVyZmFjZQogCiB1c2VzCiAgIENsYXNzZXMsCiAgIFN5c1V0aWxzLAogICBNYXRoLAotICBTb2NrZXRzLCBXaW5Tb2NrLAogICBHZW5lcmljcy5Db2xsZWN0aW9ucywKKyAgeyRJRkRFRiBPTERfVU5JVF9OQU1FU30KKyAgICBBY3RpdmVYLCBtc3htbCwgV2luU29jaywgU29ja2V0cywKKyAgeyRFTFNFfQorICAgIFdpbmFwaS5BY3RpdmVYLCBXaW5hcGkubXN4bWwsIFdpbmFwaS5XaW5Tb2NrLAorICAgIHskSUZERUYgT0xEX1NPQ0tFVFN9CisgICAgICBXZWIuV2luLlNvY2tldHMsCisgICAgeyRFTFNFfQorICAgICAgVGhyaWZ0LlNvY2tldCwKKyAgICB7JEVORElGfQorICB7JEVORElGfQogICBUaHJpZnQuQ29sbGVjdGlvbnMsCisgIFRocmlmdC5FeGNlcHRpb24sCiAgIFRocmlmdC5VdGlscywKLSAgVGhyaWZ0LlN0cmVhbSwKLSAgQWN0aXZlWCwKLSAgbXN4bWw7CisgIFRocmlmdC5TdHJlYW07CiAKIHR5cGUKICAgSVRyYW5zcG9ydCA9IGludGVyZmFjZQotICAgIFsne0E0QTlGQzM3LUQ2MjAtNDREQy1BRDIxLTY2MkQxNjM2NENFNH0nXQorICAgIFsne0RCODQ5NjFFLThCQjMtNDUzMi05OUUxLUE4QzdBQzIzMDBGN30nXQogICAgIGZ1bmN0aW9uIEdldElzT3BlbjogQm9vbGVhbjsKICAgICBwcm9wZXJ0eSBJc09wZW46IEJvb2xlYW4gcmVhZCBHZXRJc09wZW47CiAgICAgZnVuY3Rpb24gUGVlazogQm9vbGVhbjsKICAgICBwcm9jZWR1cmUgT3BlbjsKICAgICBwcm9jZWR1cmUgQ2xvc2U7Ci0gICAgZnVuY3Rpb24gUmVhZCh2YXIgYnVmOiBUQnl0ZXM7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsKLSAgICBmdW5jdGlvbiBSZWFkQWxsKHZhciBidWY6IFRCeXRlczsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOiBJbnRlZ2VyOworICAgIGZ1bmN0aW9uIFJlYWQodmFyIGJ1ZjogVEJ5dGVzOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlcik6IEludGVnZXI7IG92ZXJsb2FkOworICAgIGZ1bmN0aW9uIFJlYWQoY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsgb3ZlcmxvYWQ7CisgICAgZnVuY3Rpb24gUmVhZEFsbCh2YXIgYnVmOiBUQnl0ZXM7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsgb3ZlcmxvYWQ7CisgICAgZnVuY3Rpb24gUmVhZEFsbChjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOiBJbnRlZ2VyOyBvdmVybG9hZDsKICAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IGJ1ZjogVEJ5dGVzKTsgb3ZlcmxvYWQ7CiAgICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBidWY6IFRCeXRlczsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOyBvdmVybG9hZDsKKyAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBvZmYsIGxlbiA6IEludGVnZXIpOyBvdmVybG9hZDsKKyAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBsZW4gOiBJbnRlZ2VyKTsgb3ZlcmxvYWQ7CiAgICAgcHJvY2VkdXJlIEZsdXNoOwogICBlbmQ7CiAKQEAgLTU3LDE0ICs2OSwxOCBAQAogICAgIGZ1bmN0aW9uIFBlZWs6IEJvb2xlYW47IHZpcnR1YWw7CiAgICAgcHJvY2VkdXJlIE9wZW4oKTsgdmlydHVhbDsgYWJzdHJhY3Q7CiAgICAgcHJvY2VkdXJlIENsb3NlKCk7IHZpcnR1YWw7IGFic3RyYWN0OwotICAgIGZ1bmN0aW9uIFJlYWQodmFyIGJ1ZjogVEJ5dGVzOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlcik6IEludGVnZXI7IHZpcnR1YWw7IGFic3RyYWN0OwotICAgIGZ1bmN0aW9uIFJlYWRBbGwodmFyIGJ1ZjogVEJ5dGVzOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlcik6IEludGVnZXI7IHZpcnR1YWw7Ci0gICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBidWY6IFRCeXRlcyk7IG92ZXJsb2FkOyB2aXJ0dWFsOwotICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgYnVmOiBUQnl0ZXM7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTsgb3ZlcmxvYWQ7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIGZ1bmN0aW9uIFJlYWQodmFyIGJ1ZjogVEJ5dGVzOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlcik6IEludGVnZXI7IG92ZXJsb2FkOyBpbmxpbmU7CisgICAgZnVuY3Rpb24gUmVhZChjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOiBJbnRlZ2VyOyBvdmVybG9hZDsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgZnVuY3Rpb24gUmVhZEFsbCh2YXIgYnVmOiBUQnl0ZXM7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsgIG92ZXJsb2FkOyBpbmxpbmU7CisgICAgZnVuY3Rpb24gUmVhZEFsbChjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOiBJbnRlZ2VyOyBvdmVybG9hZDsgdmlydHVhbDsKKyAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IGJ1ZjogVEJ5dGVzKTsgb3ZlcmxvYWQ7IGlubGluZTsKKyAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IGJ1ZjogVEJ5dGVzOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlcik7IG92ZXJsb2FkOyBpbmxpbmU7CisgICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgbGVuIDogSW50ZWdlcik7IG92ZXJsb2FkOyBpbmxpbmU7CisgICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgb2ZmLCBsZW4gOiBJbnRlZ2VyKTsgb3ZlcmxvYWQ7IHZpcnR1YWw7IGFic3RyYWN0OwogICAgIHByb2NlZHVyZSBGbHVzaDsgdmlydHVhbDsKICAgZW5kOwogCi0gIFRUcmFuc3BvcnRFeGNlcHRpb24gPSBjbGFzcyggRXhjZXB0aW9uICkKKyAgVFRyYW5zcG9ydEV4Y2VwdGlvbiA9IGNsYXNzKCBURXhjZXB0aW9uKQogICBwdWJsaWMKICAgICB0eXBlCiAgICAgICBURXhjZXB0aW9uVHlwZSA9ICgKQEAgLTcyLDI2ICs4OCw1MSBAQAogICAgICAgICBOb3RPcGVuLAogICAgICAgICBBbHJlYWR5T3BlbiwKICAgICAgICAgVGltZWRPdXQsCi0gICAgICAgIEVuZE9mRmlsZQorICAgICAgICBFbmRPZkZpbGUsCisgICAgICAgIEJhZEFyZ3MsCisgICAgICAgIEludGVycnVwdGVkCiAgICAgICApOwogICBwcml2YXRlCi0gICAgRlR5cGUgOiBURXhjZXB0aW9uVHlwZTsKKyAgICBmdW5jdGlvbiBHZXRUeXBlOiBURXhjZXB0aW9uVHlwZTsKKyAgcHJvdGVjdGVkCisgICAgY29uc3RydWN0b3IgSGlkZGVuQ3JlYXRlKGNvbnN0IE1zZzogc3RyaW5nKTsKICAgcHVibGljCi0gICAgY29uc3RydWN0b3IgQ3JlYXRlKCBBVHlwZTogVEV4Y2VwdGlvblR5cGUpOyBvdmVybG9hZDsKLSAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IG1zZzogc3RyaW5nKTsgb3ZlcmxvYWQ7Ci0gICAgY29uc3RydWN0b3IgQ3JlYXRlKCBBVHlwZTogVEV4Y2VwdGlvblR5cGU7IGNvbnN0IG1zZzogc3RyaW5nKTsgb3ZlcmxvYWQ7Ci0gICAgcHJvcGVydHkgVHlwZV86IFRFeGNlcHRpb25UeXBlIHJlYWQgRlR5cGU7CisgICAgY2xhc3MgZnVuY3Rpb24gQ3JlYXRlKCBBVHlwZTogVEV4Y2VwdGlvblR5cGUpOiBUVHJhbnNwb3J0RXhjZXB0aW9uOyBvdmVybG9hZDsgZGVwcmVjYXRlZCAnVXNlIHNwZWNpYWxpemVkIFRUcmFuc3BvcnRFeGNlcHRpb24gdHlwZXMgKG9yIHJlZ2VuZXJhdGUgZnJvbSBJREwpJzsKKyAgICBjbGFzcyBmdW5jdGlvbiBDcmVhdGUoIGNvbnN0IG1zZzogc3RyaW5nKTogVFRyYW5zcG9ydEV4Y2VwdGlvbjsgcmVpbnRyb2R1Y2U7IG92ZXJsb2FkOyBkZXByZWNhdGVkICdVc2Ugc3BlY2lhbGl6ZWQgVFRyYW5zcG9ydEV4Y2VwdGlvbiB0eXBlcyAob3IgcmVnZW5lcmF0ZSBmcm9tIElETCknOworICAgIGNsYXNzIGZ1bmN0aW9uIENyZWF0ZSggQVR5cGU6IFRFeGNlcHRpb25UeXBlOyBjb25zdCBtc2c6IHN0cmluZyk6IFRUcmFuc3BvcnRFeGNlcHRpb247IG92ZXJsb2FkOyBkZXByZWNhdGVkICdVc2Ugc3BlY2lhbGl6ZWQgVFRyYW5zcG9ydEV4Y2VwdGlvbiB0eXBlcyAob3IgcmVnZW5lcmF0ZSBmcm9tIElETCknOworICAgIHByb3BlcnR5IFR5cGVfOiBURXhjZXB0aW9uVHlwZSByZWFkIEdldFR5cGU7CiAgIGVuZDsKIAorICAvLyBOZWVkZWQgdG8gcmVtb3ZlIGRlcHJlY2F0aW9uIHdhcm5pbmcKKyAgVFRyYW5zcG9ydEV4Y2VwdGlvblNwZWNpYWxpemVkID0gY2xhc3MgYWJzdHJhY3QgKFRUcmFuc3BvcnRFeGNlcHRpb24pCisgIHB1YmxpYworICAgIGNvbnN0cnVjdG9yIENyZWF0ZShjb25zdCBNc2c6IHN0cmluZyk7CisgIGVuZDsKKworICBUVHJhbnNwb3J0RXhjZXB0aW9uVW5rbm93biA9IGNsYXNzIChUVHJhbnNwb3J0RXhjZXB0aW9uU3BlY2lhbGl6ZWQpOworICBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3BlbiA9IGNsYXNzIChUVHJhbnNwb3J0RXhjZXB0aW9uU3BlY2lhbGl6ZWQpOworICBUVHJhbnNwb3J0RXhjZXB0aW9uQWxyZWFkeU9wZW4gPSBjbGFzcyAoVFRyYW5zcG9ydEV4Y2VwdGlvblNwZWNpYWxpemVkKTsKKyAgVFRyYW5zcG9ydEV4Y2VwdGlvblRpbWVkT3V0ID0gY2xhc3MgKFRUcmFuc3BvcnRFeGNlcHRpb25TcGVjaWFsaXplZCk7CisgIFRUcmFuc3BvcnRFeGNlcHRpb25FbmRPZkZpbGUgPSBjbGFzcyAoVFRyYW5zcG9ydEV4Y2VwdGlvblNwZWNpYWxpemVkKTsKKyAgVFRyYW5zcG9ydEV4Y2VwdGlvbkJhZEFyZ3MgPSBjbGFzcyAoVFRyYW5zcG9ydEV4Y2VwdGlvblNwZWNpYWxpemVkKTsKKyAgVFRyYW5zcG9ydEV4Y2VwdGlvbkludGVycnVwdGVkID0gY2xhc3MgKFRUcmFuc3BvcnRFeGNlcHRpb25TcGVjaWFsaXplZCk7CisKICAgSUhUVFBDbGllbnQgPSBpbnRlcmZhY2UoIElUcmFuc3BvcnQgKQotICAgIFsnezBGNURCOEFCLTcxMEQtNDMzOC1BQUM5LTQ2QjU3MzRDNTA1N30nXQorICAgIFsne0JBMTQyRDEyLThBRTYtNEI1MC05RTMzLTZCNzg0M0IyMUQ3M30nXQorICAgIHByb2NlZHVyZSBTZXREbnNSZXNvbHZlVGltZW91dChjb25zdCBWYWx1ZTogSW50ZWdlcik7CisgICAgZnVuY3Rpb24gR2V0RG5zUmVzb2x2ZVRpbWVvdXQ6IEludGVnZXI7CiAgICAgcHJvY2VkdXJlIFNldENvbm5lY3Rpb25UaW1lb3V0KGNvbnN0IFZhbHVlOiBJbnRlZ2VyKTsKICAgICBmdW5jdGlvbiBHZXRDb25uZWN0aW9uVGltZW91dDogSW50ZWdlcjsKKyAgICBwcm9jZWR1cmUgU2V0U2VuZFRpbWVvdXQoY29uc3QgVmFsdWU6IEludGVnZXIpOworICAgIGZ1bmN0aW9uIEdldFNlbmRUaW1lb3V0OiBJbnRlZ2VyOwogICAgIHByb2NlZHVyZSBTZXRSZWFkVGltZW91dChjb25zdCBWYWx1ZTogSW50ZWdlcik7CiAgICAgZnVuY3Rpb24gR2V0UmVhZFRpbWVvdXQ6IEludGVnZXI7CiAgICAgZnVuY3Rpb24gR2V0Q3VzdG9tSGVhZGVyczogSVRocmlmdERpY3Rpb25hcnk8c3RyaW5nLHN0cmluZz47CiAgICAgcHJvY2VkdXJlIFNlbmRSZXF1ZXN0OworCisgICAgcHJvcGVydHkgRG5zUmVzb2x2ZVRpbWVvdXQ6IEludGVnZXIgcmVhZCBHZXREbnNSZXNvbHZlVGltZW91dCB3cml0ZSBTZXREbnNSZXNvbHZlVGltZW91dDsKICAgICBwcm9wZXJ0eSBDb25uZWN0aW9uVGltZW91dDogSW50ZWdlciByZWFkIEdldENvbm5lY3Rpb25UaW1lb3V0IHdyaXRlIFNldENvbm5lY3Rpb25UaW1lb3V0OworICAgIHByb3BlcnR5IFNlbmRUaW1lb3V0OiBJbnRlZ2VyIHJlYWQgR2V0U2VuZFRpbWVvdXQgd3JpdGUgU2V0U2VuZFRpbWVvdXQ7CiAgICAgcHJvcGVydHkgUmVhZFRpbWVvdXQ6IEludGVnZXIgcmVhZCBHZXRSZWFkVGltZW91dCB3cml0ZSBTZXRSZWFkVGltZW91dDsKICAgICBwcm9wZXJ0eSBDdXN0b21IZWFkZXJzOiBJVGhyaWZ0RGljdGlvbmFyeTxzdHJpbmcsc3RyaW5nPiByZWFkIEdldEN1c3RvbUhlYWRlcnM7CiAgIGVuZDsKQEAgLTEwMSw3ICsxNDIsOSBAQAogICAgIEZVcmkgOiBzdHJpbmc7CiAgICAgRklucHV0U3RyZWFtIDogSVRocmlmdFN0cmVhbTsKICAgICBGT3V0cHV0U3RyZWFtIDogSVRocmlmdFN0cmVhbTsKKyAgICBGRG5zUmVzb2x2ZVRpbWVvdXQgOiBJbnRlZ2VyOwogICAgIEZDb25uZWN0aW9uVGltZW91dCA6IEludGVnZXI7CisgICAgRlNlbmRUaW1lb3V0IDogSW50ZWdlcjsKICAgICBGUmVhZFRpbWVvdXQgOiBJbnRlZ2VyOwogICAgIEZDdXN0b21IZWFkZXJzIDogSVRocmlmdERpY3Rpb25hcnk8c3RyaW5nLHN0cmluZz47CiAKQEAgLTExMCwxNyArMTUzLDI0IEBACiAgICAgZnVuY3Rpb24gR2V0SXNPcGVuOiBCb29sZWFuOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgT3BlbigpOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgQ2xvc2UoKTsgb3ZlcnJpZGU7Ci0gICAgZnVuY3Rpb24gUmVhZCggdmFyIGJ1ZjogVEJ5dGVzOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlcik6IEludGVnZXI7IG92ZXJyaWRlOwotICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgYnVmOiBUQnl0ZXM7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gIFJlYWQoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlcik6IEludGVnZXI7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZiwgbGVuIDogSW50ZWdlcik7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBGbHVzaDsgb3ZlcnJpZGU7CiAKKyAgICBwcm9jZWR1cmUgU2V0RG5zUmVzb2x2ZVRpbWVvdXQoY29uc3QgVmFsdWU6IEludGVnZXIpOworICAgIGZ1bmN0aW9uIEdldERuc1Jlc29sdmVUaW1lb3V0OiBJbnRlZ2VyOwogICAgIHByb2NlZHVyZSBTZXRDb25uZWN0aW9uVGltZW91dChjb25zdCBWYWx1ZTogSW50ZWdlcik7CiAgICAgZnVuY3Rpb24gR2V0Q29ubmVjdGlvblRpbWVvdXQ6IEludGVnZXI7CisgICAgcHJvY2VkdXJlIFNldFNlbmRUaW1lb3V0KGNvbnN0IFZhbHVlOiBJbnRlZ2VyKTsKKyAgICBmdW5jdGlvbiBHZXRTZW5kVGltZW91dDogSW50ZWdlcjsKICAgICBwcm9jZWR1cmUgU2V0UmVhZFRpbWVvdXQoY29uc3QgVmFsdWU6IEludGVnZXIpOwogICAgIGZ1bmN0aW9uIEdldFJlYWRUaW1lb3V0OiBJbnRlZ2VyOworCiAgICAgZnVuY3Rpb24gR2V0Q3VzdG9tSGVhZGVyczogSVRocmlmdERpY3Rpb25hcnk8c3RyaW5nLHN0cmluZz47CiAgICAgcHJvY2VkdXJlIFNlbmRSZXF1ZXN0OworICAgIHByb3BlcnR5IERuc1Jlc29sdmVUaW1lb3V0OiBJbnRlZ2VyIHJlYWQgR2V0RG5zUmVzb2x2ZVRpbWVvdXQgd3JpdGUgU2V0RG5zUmVzb2x2ZVRpbWVvdXQ7CiAgICAgcHJvcGVydHkgQ29ubmVjdGlvblRpbWVvdXQ6IEludGVnZXIgcmVhZCBHZXRDb25uZWN0aW9uVGltZW91dCB3cml0ZSBTZXRDb25uZWN0aW9uVGltZW91dDsKKyAgICBwcm9wZXJ0eSBTZW5kVGltZW91dDogSW50ZWdlciByZWFkIEdldFNlbmRUaW1lb3V0IHdyaXRlIFNldFNlbmRUaW1lb3V0OwogICAgIHByb3BlcnR5IFJlYWRUaW1lb3V0OiBJbnRlZ2VyIHJlYWQgR2V0UmVhZFRpbWVvdXQgd3JpdGUgU2V0UmVhZFRpbWVvdXQ7CiAgICAgcHJvcGVydHkgQ3VzdG9tSGVhZGVyczogSVRocmlmdERpY3Rpb25hcnk8c3RyaW5nLHN0cmluZz4gcmVhZCBHZXRDdXN0b21IZWFkZXJzOwogICBwdWJsaWMKQEAgLTE1Miw2ICsyMDIsNyBAQAogICBlbmQ7CiAKICAgVFRjcFNvY2tldFN0cmVhbUltcGwgPSBjbGFzcyggVFRocmlmdFN0cmVhbUltcGwgKQoreyRJRkRFRiBPTERfU09DS0VUU30KICAgcHJpdmF0ZSB0eXBlCiAgICAgVFdhaXRGb3JEYXRhID0gKCB3ZmRfSGF2ZURhdGEsIHdmZF9UaW1lb3V0LCB3ZmRfRXJyb3IpOwogICBwcml2YXRlCkBAIC0xNjAsMTAgKzIxMSwxNSBAQAogICAgIGZ1bmN0aW9uIFNlbGVjdCggUmVhZFJlYWR5LCBXcml0ZVJlYWR5LCBFeGNlcHRGbGFnOiBQQm9vbGVhbjsKICAgICAgICAgICAgICAgICAgICAgIFRpbWVPdXQ6IEludGVnZXI7IHZhciB3c2FFcnJvciA6IEludGVnZXIpOiBJbnRlZ2VyOwogICAgIGZ1bmN0aW9uIFdhaXRGb3JEYXRhKCBUaW1lT3V0IDogSW50ZWdlcjsgcEJ1ZiA6IFBvaW50ZXI7IERlc2lyZWRCeXRlczogSW50ZWdlcjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHdzYUVycm9yIDogSW50ZWdlcik6IFRXYWl0Rm9yRGF0YTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHdzYUVycm9yLCBieXRlc1JlYWR5IDogSW50ZWdlcik6IFRXYWl0Rm9yRGF0YTsKK3skRUxTRX0KKyAgICBGVGNwQ2xpZW50OiBUU29ja2V0OworICBwcm90ZWN0ZWQgY29uc3QKKyAgICBTTEVFUF9USU1FID0gMjAwOworeyRFTkRJRn0KICAgcHJvdGVjdGVkCi0gICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBidWZmZXI6IFRCeXRlczsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik7IG92ZXJyaWRlOwotICAgIGZ1bmN0aW9uIFJlYWQoIHZhciBidWZmZXI6IFRCeXRlczsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZnNldCwgY291bnQ6IEludGVnZXIpOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBPcGVuOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgQ2xvc2U7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBGbHVzaDsgb3ZlcnJpZGU7CkBAIC0xNzEsNyArMjI3LDExIEBACiAgICAgZnVuY3Rpb24gSXNPcGVuOiBCb29sZWFuOyBvdmVycmlkZTsKICAgICBmdW5jdGlvbiBUb0FycmF5OiBUQnl0ZXM7IG92ZXJyaWRlOwogICBwdWJsaWMKK3skSUZERUYgT0xEX1NPQ0tFVFN9CiAgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBBVGNwQ2xpZW50OiBUQ3VzdG9tSXBDbGllbnQ7IGNvbnN0IGFUaW1lb3V0IDogSW50ZWdlciA9IDApOworeyRFTFNFfQorICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgQVRjcENsaWVudDogVFNvY2tldDsgY29uc3QgYVRpbWVvdXQgOiBMb25nd29yZCA9IDApOworeyRFTkRJRn0KICAgZW5kOwogCiAgIElTdHJlYW1UcmFuc3BvcnQgPSBpbnRlcmZhY2UoIElUcmFuc3BvcnQgKQpAQCAtMTk4LDggKzI1OCw4IEBACiAgICAgcHJvY2VkdXJlIE9wZW47IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBDbG9zZTsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIEZsdXNoOyBvdmVycmlkZTsKLSAgICBmdW5jdGlvbiBSZWFkKHZhciBidWY6IFRCeXRlczsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOiBJbnRlZ2VyOyBvdmVycmlkZTsKLSAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IGJ1ZjogVEJ5dGVzOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlcik7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uICBSZWFkKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOiBJbnRlZ2VyOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBvZmYsIGxlbiA6IEludGVnZXIpOyBvdmVycmlkZTsKICAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IEFJbnB1dFN0cmVhbSA6IElUaHJpZnRTdHJlYW07IGNvbnN0IEFPdXRwdXRTdHJlYW0gOiBJVGhyaWZ0U3RyZWFtKTsKICAgICBkZXN0cnVjdG9yIERlc3Ryb3k7IG92ZXJyaWRlOwogICBlbmQ7CkBAIC0yMTEsOCArMjcxLDggQEAKICAgICBGUmVhZEJ1ZmZlciA6IFRNZW1vcnlTdHJlYW07CiAgICAgRldyaXRlQnVmZmVyIDogVE1lbW9yeVN0cmVhbTsKICAgcHJvdGVjdGVkCi0gICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBidWZmZXI6IFRCeXRlczsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik7IG92ZXJyaWRlOwotICAgIGZ1bmN0aW9uIFJlYWQoIHZhciBidWZmZXI6IFRCeXRlczsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBPcGVuOyAgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIENsb3NlOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgRmx1c2g7IG92ZXJyaWRlOwpAQCAtMjI1LDE2ICsyODUsMjUgQEAKIAogICBUU2VydmVyU29ja2V0SW1wbCA9IGNsYXNzKCBUU2VydmVyVHJhbnNwb3J0SW1wbCkKICAgcHJpdmF0ZQoreyRJRkRFRiBPTERfU09DS0VUU30KICAgICBGU2VydmVyIDogVFRjcFNlcnZlcjsKICAgICBGUG9ydCA6IEludGVnZXI7CiAgICAgRkNsaWVudFRpbWVvdXQgOiBJbnRlZ2VyOworeyRFTFNFfQorICAgIEZTZXJ2ZXI6IFRTZXJ2ZXJTb2NrZXQ7Cit7JEVORElGfQogICAgIEZVc2VCdWZmZXJlZFNvY2tldCA6IEJvb2xlYW47CiAgICAgRk93bnNTZXJ2ZXIgOiBCb29sZWFuOwogICBwcm90ZWN0ZWQKICAgICBmdW5jdGlvbiBBY2NlcHQoIGNvbnN0IGZuQWNjZXB0aW5nOiBUUHJvYykgOiBJVHJhbnNwb3J0OyBvdmVycmlkZTsKICAgcHVibGljCit7JElGREVGIE9MRF9TT0NLRVRTfQogICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgQVNlcnZlcjogVFRjcFNlcnZlcjsgQUNsaWVudFRpbWVvdXQ6IEludGVnZXIgPSAwKTsgb3ZlcmxvYWQ7CiAgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBBUG9ydDogSW50ZWdlcjsgQUNsaWVudFRpbWVvdXQ6IEludGVnZXIgPSAwOyBBVXNlQnVmZmVyZWRTb2NrZXRzOiBCb29sZWFuID0gRkFMU0UpOyBvdmVybG9hZDsKK3skRUxTRX0KKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IEFTZXJ2ZXI6IFRTZXJ2ZXJTb2NrZXQ7IEFDbGllbnRUaW1lb3V0OiBMb25nd29yZCA9IDApOyBvdmVybG9hZDsKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIEFQb3J0OiBJbnRlZ2VyOyBBQ2xpZW50VGltZW91dDogTG9uZ3dvcmQgPSAwOyBBVXNlQnVmZmVyZWRTb2NrZXRzOiBCb29sZWFuID0gRkFMU0UpOyBvdmVybG9hZDsKK3skRU5ESUZ9CiAgICAgZGVzdHJ1Y3RvciBEZXN0cm95OyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgTGlzdGVuOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgQ2xvc2U7IG92ZXJyaWRlOwpAQCAtMjU1LDggKzMyNCw4IEBACiAgIHB1YmxpYwogICAgIHByb2NlZHVyZSBPcGVuKCk7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBDbG9zZSgpOyBvdmVycmlkZTsKLSAgICBmdW5jdGlvbiBSZWFkKHZhciBidWY6IFRCeXRlczsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOiBJbnRlZ2VyOyBvdmVycmlkZTsKLSAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IGJ1ZjogVEJ5dGVzOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlcik7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uICBSZWFkKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOiBJbnRlZ2VyOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBvZmYsIGxlbiA6IEludGVnZXIpOyBvdmVycmlkZTsKICAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IEFUcmFuc3BvcnQgOiBJU3RyZWFtVHJhbnNwb3J0ICk7IG92ZXJsb2FkOwogICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgQVRyYW5zcG9ydCA6IElTdHJlYW1UcmFuc3BvcnQ7IEFCdWZTaXplOiBJbnRlZ2VyKTsgb3ZlcmxvYWQ7CiAgICAgcHJvcGVydHkgVW5kZXJseWluZ1RyYW5zcG9ydDogSVRyYW5zcG9ydCByZWFkIEdldFVuZGVybHlpbmdUcmFuc3BvcnQ7CkBAIC0yNjUsMjIgKzMzNCwzOSBAQAogCiAgIFRTb2NrZXRJbXBsID0gY2xhc3MoVFN0cmVhbVRyYW5zcG9ydEltcGwpCiAgIHByaXZhdGUKK3skSUZERUYgT0xEX1NPQ0tFVFN9CiAgICAgRkNsaWVudCA6IFRDdXN0b21JcENsaWVudDsKK3skRUxTRX0KKyAgICBGQ2xpZW50OiBUU29ja2V0OworeyRFTkRJRn0KICAgICBGT3duc0NsaWVudCA6IEJvb2xlYW47CiAgICAgRkhvc3QgOiBzdHJpbmc7CiAgICAgRlBvcnQgOiBJbnRlZ2VyOworeyRJRkRFRiBPTERfU09DS0VUU30KICAgICBGVGltZW91dCA6IEludGVnZXI7Cit7JEVMU0V9CisgICAgRlRpbWVvdXQgOiBMb25nd29yZDsKK3skRU5ESUZ9CiAKICAgICBwcm9jZWR1cmUgSW5pdFNvY2tldDsKICAgcHJvdGVjdGVkCiAgICAgZnVuY3Rpb24gR2V0SXNPcGVuOiBCb29sZWFuOyBvdmVycmlkZTsKICAgcHVibGljCiAgICAgcHJvY2VkdXJlIE9wZW47IG92ZXJyaWRlOworeyRJRkRFRiBPTERfU09DS0VUU30KICAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IEFDbGllbnQgOiBUQ3VzdG9tSXBDbGllbnQ7IGFPd25zQ2xpZW50IDogQm9vbGVhbjsgQVRpbWVvdXQ6IEludGVnZXIgPSAwKTsgb3ZlcmxvYWQ7CiAgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBBSG9zdDogc3RyaW5nOyBBUG9ydDogSW50ZWdlcjsgQVRpbWVvdXQ6IEludGVnZXIgPSAwKTsgb3ZlcmxvYWQ7Cit7JEVMU0V9CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKGNvbnN0IEFDbGllbnQ6IFRTb2NrZXQ7IGFPd25zQ2xpZW50OiBCb29sZWFuKTsgb3ZlcmxvYWQ7CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBBSG9zdDogc3RyaW5nOyBBUG9ydDogSW50ZWdlcjsgQVRpbWVvdXQ6IExvbmd3b3JkID0gMCk7IG92ZXJsb2FkOworeyRFTkRJRn0KICAgICBkZXN0cnVjdG9yIERlc3Ryb3k7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBDbG9zZTsgb3ZlcnJpZGU7Cit7JElGREVGIE9MRF9TT0NLRVRTfQogICAgIHByb3BlcnR5IFRjcENsaWVudDogVEN1c3RvbUlwQ2xpZW50IHJlYWQgRkNsaWVudDsKK3skRUxTRX0KKyAgICBwcm9wZXJ0eSBUY3BDbGllbnQ6IFRTb2NrZXQgcmVhZCBGQ2xpZW50OworeyRFTkRJRn0KICAgICBwcm9wZXJ0eSBIb3N0IDogc3RyaW5nIHJlYWQgRkhvc3Q7CiAgICAgcHJvcGVydHkgUG9ydDogSW50ZWdlciByZWFkIEZQb3J0OwogICBlbmQ7CkBAIC0zMDQsOSArMzkwLDEwIEBACiAgICAgICAgIGZ1bmN0aW9uIEdldFRyYW5zcG9ydCggY29uc3QgQVRyYW5zOiBJVHJhbnNwb3J0KTogSVRyYW5zcG9ydDsgb3ZlcnJpZGU7CiAgICAgICBlbmQ7CiAKLXskSUYgQ29tcGlsZXJWZXJzaW9uID49IDIxLjB9CisgICAgeyRJRkRFRiBIQVZFX0NMQVNTX0NUT1J9CiAgICAgY2xhc3MgY29uc3RydWN0b3IgQ3JlYXRlOwoteyRJRkVORH0KKyAgICB7JEVORElGfQorCiAgICAgY29uc3RydWN0b3IgQ3JlYXRlOyBvdmVybG9hZDsKICAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IEFUcmFuczogSVRyYW5zcG9ydCk7IG92ZXJsb2FkOwogICAgIGRlc3RydWN0b3IgRGVzdHJveTsgb3ZlcnJpZGU7CkBAIC0zMTUsMTQgKzQwMiwxNCBAQAogICAgIGZ1bmN0aW9uIEdldElzT3BlbjogQm9vbGVhbjsgb3ZlcnJpZGU7CiAKICAgICBwcm9jZWR1cmUgQ2xvc2UoKTsgb3ZlcnJpZGU7Ci0gICAgZnVuY3Rpb24gUmVhZCh2YXIgYnVmOiBUQnl0ZXM7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsgb3ZlcnJpZGU7Ci0gICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBidWY6IFRCeXRlczsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiAgUmVhZCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgb2ZmLCBsZW4gOiBJbnRlZ2VyKTsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIEZsdXNoOyBvdmVycmlkZTsKICAgZW5kOwogCi17JElGIENvbXBpbGVyVmVyc2lvbiA8IDIxLjB9Cit7JElGTkRFRiBIQVZFX0NMQVNTX0NUT1J9CiBwcm9jZWR1cmUgVEZyYW1lZFRyYW5zcG9ydEltcGxfSW5pdGlhbGl6ZTsKLXskSUZFTkR9Cit7JEVORElGfQogCiBjb25zdAogICBERUZBVUxUX1RIUklGVF9USU1FT1VUID0gNSAqIDEwMDA7IC8vIG1zCkBAIC0zMzQsNyArNDIxLDcgQEAKIAogcHJvY2VkdXJlIFRUcmFuc3BvcnRJbXBsLkZsdXNoOwogYmVnaW4KLQorICAvLyBub3RoaW5nIHRvIGRvCiBlbmQ7CiAKIGZ1bmN0aW9uIFRUcmFuc3BvcnRJbXBsLlBlZWs6IEJvb2xlYW47CkBAIC0zNDIsNDEgKzQyOSw2MiBAQAogICBSZXN1bHQgOj0gSXNPcGVuOwogZW5kOwogCi1mdW5jdGlvbiBUVHJhbnNwb3J0SW1wbC5SZWFkQWxsKCB2YXIgYnVmOiBUQnl0ZXM7IG9mZiwgbGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsKLXZhcgotICBnb3QgOiBJbnRlZ2VyOwotICByZXQgOiBJbnRlZ2VyOworZnVuY3Rpb24gVFRyYW5zcG9ydEltcGwuUmVhZCh2YXIgYnVmOiBUQnl0ZXM7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsKIGJlZ2luCi0gIGdvdCA6PSAwOwotICB3aGlsZSAoIGdvdCA8IGxlbikgZG8KLSAgYmVnaW4KLSAgICByZXQgOj0gUmVhZCggYnVmLCBvZmYgKyBnb3QsIGxlbiAtIGdvdCk7Ci0gICAgaWYgKCByZXQgPD0gMCApIHRoZW4KLSAgICBiZWdpbgotICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbi5DcmVhdGUoICdDYW5ub3QgcmVhZCwgUmVtb3RlIHNpZGUgaGFzIGNsb3NlZCcgKTsKLSAgICBlbmQ7Ci0gICAgZ290IDo9IGdvdCArIHJldDsKLSAgZW5kOwotICBSZXN1bHQgOj0gZ290OworICBpZiBMZW5ndGgoYnVmKSA+IDAKKyAgdGhlbiByZXN1bHQgOj0gUmVhZCggQGJ1ZlswXSwgTGVuZ3RoKGJ1ZiksIG9mZiwgbGVuKQorICBlbHNlIHJlc3VsdCA6PSAwOworZW5kOworCitmdW5jdGlvbiBUVHJhbnNwb3J0SW1wbC5SZWFkQWxsKHZhciBidWY6IFRCeXRlczsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOiBJbnRlZ2VyOworYmVnaW4KKyAgaWYgTGVuZ3RoKGJ1ZikgPiAwCisgIHRoZW4gcmVzdWx0IDo9IFJlYWRBbGwoIEBidWZbMF0sIExlbmd0aChidWYpLCBvZmYsIGxlbikKKyAgZWxzZSByZXN1bHQgOj0gMDsKIGVuZDsKIAogcHJvY2VkdXJlIFRUcmFuc3BvcnRJbXBsLldyaXRlKCBjb25zdCBidWY6IFRCeXRlcyk7CiBiZWdpbgotICBTZWxmLldyaXRlKCBidWYsIDAsIExlbmd0aChidWYpICk7CisgIGlmIExlbmd0aChidWYpID4gMAorICB0aGVuIFdyaXRlKCBAYnVmWzBdLCAwLCBMZW5ndGgoYnVmKSk7CitlbmQ7CisKK3Byb2NlZHVyZSBUVHJhbnNwb3J0SW1wbC5Xcml0ZSggY29uc3QgYnVmOiBUQnl0ZXM7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTsKK2JlZ2luCisgIGlmIExlbmd0aChidWYpID4gMAorICB0aGVuIFdyaXRlKCBAYnVmWzBdLCBvZmYsIGxlbik7CitlbmQ7CisKK2Z1bmN0aW9uIFRUcmFuc3BvcnRJbXBsLlJlYWRBbGwoY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsKK3ZhciByZXQgOiBJbnRlZ2VyOworYmVnaW4KKyAgcmVzdWx0IDo9IDA7CisgIHdoaWxlIHJlc3VsdCA8IGxlbiBkbyBiZWdpbgorICAgIHJldCA6PSBSZWFkKCBwQnVmLCBidWZsZW4sIG9mZiArIHJlc3VsdCwgbGVuIC0gcmVzdWx0KTsKKyAgICBpZiByZXQgPiAwCisgICAgdGhlbiBJbmMoIHJlc3VsdCwgcmV0KQorICAgIGVsc2UgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCAnQ2Fubm90IHJlYWQsIFJlbW90ZSBzaWRlIGhhcyBjbG9zZWQnICk7CisgIGVuZDsKK2VuZDsKKworcHJvY2VkdXJlIFRUcmFuc3BvcnRJbXBsLldyaXRlKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgbGVuIDogSW50ZWdlcik7CitiZWdpbgorICBTZWxmLldyaXRlKCBwQnVmLCAwLCBsZW4pOwogZW5kOwogCiB7IFRIVFRQQ2xpZW50SW1wbCB9CiAKLXByb2NlZHVyZSBUSFRUUENsaWVudEltcGwuQ2xvc2U7Ci1iZWdpbgotICBGSW5wdXRTdHJlYW0gOj0gbmlsOwotICBGT3V0cHV0U3RyZWFtIDo9IG5pbDsKLWVuZDsKLQogY29uc3RydWN0b3IgVEhUVFBDbGllbnRJbXBsLkNyZWF0ZShjb25zdCBBVXJpOiBzdHJpbmcpOwogYmVnaW4KICAgaW5oZXJpdGVkIENyZWF0ZTsKICAgRlVyaSA6PSBBVXJpOworCisgIC8vIGRlZmF1bHRzIGFjY29yZGluZyB0byBNU0ROCisgIEZEbnNSZXNvbHZlVGltZW91dCA6PSAwOyAvLyBubyB0aW1lb3V0CisgIEZDb25uZWN0aW9uVGltZW91dCA6PSA2MCAqIDEwMDA7CisgIEZTZW5kVGltZW91dCAgICAgICA6PSAzMCAqIDEwMDA7CisgIEZSZWFkVGltZW91dCAgICAgICA6PSAzMCAqIDEwMDA7CisKICAgRkN1c3RvbUhlYWRlcnMgOj0gVFRocmlmdERpY3Rpb25hcnlJbXBsPHN0cmluZyxzdHJpbmc+LkNyZWF0ZTsKICAgRk91dHB1dFN0cmVhbSA6PSBUVGhyaWZ0U3RyZWFtQWRhcHRlckRlbHBoaS5DcmVhdGUoIFRNZW1vcnlTdHJlYW0uQ3JlYXRlLCBUcnVlKTsKIGVuZDsKQEAgLTM4NCwyMCArNDkyLDI0IEBACiBmdW5jdGlvbiBUSFRUUENsaWVudEltcGwuQ3JlYXRlUmVxdWVzdDogSVhNTEhUVFBSZXF1ZXN0OwogdmFyCiAgIHBhaXIgOiBUUGFpcjxzdHJpbmcsc3RyaW5nPjsKKyAgc3J2SHR0cCA6IElTZXJ2ZXJYTUxIVFRQUmVxdWVzdDsKIGJlZ2luCi17JElGIENvbXBpbGVyVmVyc2lvbiA+PSAyMS4wfQotICBSZXN1bHQgOj0gQ29YTUxIVFRQLkNyZWF0ZTsKLXskRUxTRX0KKyAgeyRJRiBDb21waWxlclZlcnNpb24gPj0gMjEuMH0KKyAgUmVzdWx0IDo9IENvU2VydmVyWE1MSFRUUC5DcmVhdGU7CisgIHskRUxTRX0KICAgUmVzdWx0IDo9IENvWE1MSFRUUFJlcXVlc3QuQ3JlYXRlOwoteyRJRkVORH0KKyAgeyRJRkVORH0KKworICAvLyBzZXR0aW5nIGEgdGltZW91dCB2YWx1ZSB0byAwICh6ZXJvKSBtZWFucyAibm8gdGltZW91dCIgZm9yIHRoYXQgc2V0dGluZworICBpZiBTdXBwb3J0cyggcmVzdWx0LCBJU2VydmVyWE1MSFRUUFJlcXVlc3QsIHNydkh0dHApCisgIHRoZW4gc3J2SHR0cC5zZXRUaW1lb3V0cyggRG5zUmVzb2x2ZVRpbWVvdXQsIENvbm5lY3Rpb25UaW1lb3V0LCBTZW5kVGltZW91dCwgUmVhZFRpbWVvdXQpOwogCiAgIFJlc3VsdC5vcGVuKCdQT1NUJywgRlVyaSwgRmFsc2UsICcnLCAnJyk7CiAgIFJlc3VsdC5zZXRSZXF1ZXN0SGVhZGVyKCAnQ29udGVudC1UeXBlJywgJ2FwcGxpY2F0aW9uL3gtdGhyaWZ0Jyk7CiAgIFJlc3VsdC5zZXRSZXF1ZXN0SGVhZGVyKCAnQWNjZXB0JywgJ2FwcGxpY2F0aW9uL3gtdGhyaWZ0Jyk7CiAgIFJlc3VsdC5zZXRSZXF1ZXN0SGVhZGVyKCAnVXNlci1BZ2VudCcsICdEZWxwaGkvSUhUVFBDbGllbnQnKTsKIAotICBmb3IgcGFpciBpbiBGQ3VzdG9tSGVhZGVycyBkbwotICBiZWdpbgorICBmb3IgcGFpciBpbiBGQ3VzdG9tSGVhZGVycyBkbyBiZWdpbgogICAgIFJlc3VsdC5zZXRSZXF1ZXN0SGVhZGVyKCBwYWlyLktleSwgcGFpci5WYWx1ZSApOwogICBlbmQ7CiBlbmQ7CkBAIC00MDgsMTQgKzUyMCwxNCBAQAogICBpbmhlcml0ZWQ7CiBlbmQ7CiAKLXByb2NlZHVyZSBUSFRUUENsaWVudEltcGwuRmx1c2g7CitmdW5jdGlvbiBUSFRUUENsaWVudEltcGwuR2V0RG5zUmVzb2x2ZVRpbWVvdXQ6IEludGVnZXI7CiBiZWdpbgotICB0cnkKLSAgICBTZW5kUmVxdWVzdDsKLSAgZmluYWxseQotICAgIEZPdXRwdXRTdHJlYW0gOj0gbmlsOwotICAgIEZPdXRwdXRTdHJlYW0gOj0gVFRocmlmdFN0cmVhbUFkYXB0ZXJEZWxwaGkuQ3JlYXRlKCBUTWVtb3J5U3RyZWFtLkNyZWF0ZSwgVHJ1ZSk7Ci0gIGVuZDsKKyAgUmVzdWx0IDo9IEZEbnNSZXNvbHZlVGltZW91dDsKK2VuZDsKKworcHJvY2VkdXJlIFRIVFRQQ2xpZW50SW1wbC5TZXREbnNSZXNvbHZlVGltZW91dChjb25zdCBWYWx1ZTogSW50ZWdlcik7CitiZWdpbgorICBGRG5zUmVzb2x2ZVRpbWVvdXQgOj0gVmFsdWU7CiBlbmQ7CiAKIGZ1bmN0aW9uIFRIVFRQQ2xpZW50SW1wbC5HZXRDb25uZWN0aW9uVGltZW91dDogSW50ZWdlcjsKQEAgLTQyMyw2ICs1MzUsMzEgQEAKICAgUmVzdWx0IDo9IEZDb25uZWN0aW9uVGltZW91dDsKIGVuZDsKIAorcHJvY2VkdXJlIFRIVFRQQ2xpZW50SW1wbC5TZXRDb25uZWN0aW9uVGltZW91dChjb25zdCBWYWx1ZTogSW50ZWdlcik7CitiZWdpbgorICBGQ29ubmVjdGlvblRpbWVvdXQgOj0gVmFsdWU7CitlbmQ7CisKK2Z1bmN0aW9uIFRIVFRQQ2xpZW50SW1wbC5HZXRTZW5kVGltZW91dDogSW50ZWdlcjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGU2VuZFRpbWVvdXQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUSFRUUENsaWVudEltcGwuU2V0U2VuZFRpbWVvdXQoY29uc3QgVmFsdWU6IEludGVnZXIpOworYmVnaW4KKyAgRlNlbmRUaW1lb3V0IDo9IFZhbHVlOworZW5kOworCitmdW5jdGlvbiBUSFRUUENsaWVudEltcGwuR2V0UmVhZFRpbWVvdXQ6IEludGVnZXI7CitiZWdpbgorICBSZXN1bHQgOj0gRlJlYWRUaW1lb3V0OworZW5kOworCitwcm9jZWR1cmUgVEhUVFBDbGllbnRJbXBsLlNldFJlYWRUaW1lb3V0KGNvbnN0IFZhbHVlOiBJbnRlZ2VyKTsKK2JlZ2luCisgIEZSZWFkVGltZW91dCA6PSBWYWx1ZTsKK2VuZDsKKwogZnVuY3Rpb24gVEhUVFBDbGllbnRJbXBsLkdldEN1c3RvbUhlYWRlcnM6IElUaHJpZnREaWN0aW9uYXJ5PHN0cmluZyxzdHJpbmc+OwogYmVnaW4KICAgUmVzdWx0IDo9IEZDdXN0b21IZWFkZXJzOwpAQCAtNDMzLDMxICs1NzAsMzkgQEAKICAgUmVzdWx0IDo9IFRydWU7CiBlbmQ7CiAKLWZ1bmN0aW9uIFRIVFRQQ2xpZW50SW1wbC5HZXRSZWFkVGltZW91dDogSW50ZWdlcjsKLWJlZ2luCi0gIFJlc3VsdCA6PSBGUmVhZFRpbWVvdXQ7Ci1lbmQ7Ci0KIHByb2NlZHVyZSBUSFRUUENsaWVudEltcGwuT3BlbjsKIGJlZ2luCi0KKyAgRk91dHB1dFN0cmVhbSA6PSBUVGhyaWZ0U3RyZWFtQWRhcHRlckRlbHBoaS5DcmVhdGUoIFRNZW1vcnlTdHJlYW0uQ3JlYXRlLCBUcnVlKTsKIGVuZDsKIAotZnVuY3Rpb24gVEhUVFBDbGllbnRJbXBsLlJlYWQoIHZhciBidWY6IFRCeXRlczsgb2ZmLCBsZW46IEludGVnZXIpOiBJbnRlZ2VyOworcHJvY2VkdXJlIFRIVFRQQ2xpZW50SW1wbC5DbG9zZTsKIGJlZ2luCi0gIGlmIEZJbnB1dFN0cmVhbSA9IG5pbCB0aGVuCi0gIGJlZ2luCi0gICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbi5DcmVhdGUoIFRUcmFuc3BvcnRFeGNlcHRpb24uVEV4Y2VwdGlvblR5cGUuTm90T3BlbiwKLSAgICAgICdObyByZXF1ZXN0IGhhcyBiZWVuIHNlbnQnKTsKLSAgZW5kOworICBGSW5wdXRTdHJlYW0gOj0gbmlsOworICBGT3V0cHV0U3RyZWFtIDo9IG5pbDsKK2VuZDsKKworcHJvY2VkdXJlIFRIVFRQQ2xpZW50SW1wbC5GbHVzaDsKK2JlZ2luCiAgIHRyeQotICAgIFJlc3VsdCA6PSBGSW5wdXRTdHJlYW0uUmVhZCggYnVmLCBvZmYsIGxlbiApCisgICAgU2VuZFJlcXVlc3Q7CisgIGZpbmFsbHkKKyAgICBGT3V0cHV0U3RyZWFtIDo9IG5pbDsKKyAgICBGT3V0cHV0U3RyZWFtIDo9IFRUaHJpZnRTdHJlYW1BZGFwdGVyRGVscGhpLkNyZWF0ZSggVE1lbW9yeVN0cmVhbS5DcmVhdGUsIFRydWUpOworICAgIEFTU0VSVCggRk91dHB1dFN0cmVhbSA8PiBuaWwpOworICBlbmQ7CitlbmQ7CisKK2Z1bmN0aW9uIFRIVFRQQ2xpZW50SW1wbC5SZWFkKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOiBJbnRlZ2VyOworYmVnaW4KKyAgaWYgRklucHV0U3RyZWFtID0gbmlsIHRoZW4gYmVnaW4KKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoJ05vIHJlcXVlc3QgaGFzIGJlZW4gc2VudCcpOworICBlbmQ7CisKKyAgdHJ5CisgICAgUmVzdWx0IDo9IEZJbnB1dFN0cmVhbS5SZWFkKCBwQnVmLCBidWZsZW4sIG9mZiwgbGVuKQogICBleGNlcHQKLSAgICBvbiBFOiBFeGNlcHRpb24gZG8KLSAgICBiZWdpbgotICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbi5DcmVhdGUoIFRUcmFuc3BvcnRFeGNlcHRpb24uVEV4Y2VwdGlvblR5cGUuVW5rbm93biwKLSAgICAgICAgRS5NZXNzYWdlKTsKLSAgICBlbmQ7CisgICAgb24gRTogRXhjZXB0aW9uCisgICAgZG8gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblVua25vd24uQ3JlYXRlKEUuTWVzc2FnZSk7CiAgIGVuZDsKIGVuZDsKIApAQCAtNDc0LDggKzYxOSw3IEBACiAgIHRyeQogICAgIGEgOj0gRk91dHB1dFN0cmVhbS5Ub0FycmF5OwogICAgIGxlbiA6PSBMZW5ndGgoYSk7Ci0gICAgaWYgbGVuID4gMCB0aGVuCi0gICAgYmVnaW4KKyAgICBpZiBsZW4gPiAwIHRoZW4gYmVnaW4KICAgICAgIG1zLldyaXRlQnVmZmVyKCBQb2ludGVyKEBhWzBdKV4sIGxlbik7CiAgICAgZW5kOwogICAgIG1zLlBvc2l0aW9uIDo9IDA7CkBAIC00ODcsMzkgKzYzMSw2MiBAQAogICBlbmQ7CiBlbmQ7CiAKLXByb2NlZHVyZSBUSFRUUENsaWVudEltcGwuU2V0Q29ubmVjdGlvblRpbWVvdXQoY29uc3QgVmFsdWU6IEludGVnZXIpOworcHJvY2VkdXJlIFRIVFRQQ2xpZW50SW1wbC5Xcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZiwgbGVuIDogSW50ZWdlcik7CiBiZWdpbgotICBGQ29ubmVjdGlvblRpbWVvdXQgOj0gVmFsdWU7Ci1lbmQ7Ci0KLXByb2NlZHVyZSBUSFRUUENsaWVudEltcGwuU2V0UmVhZFRpbWVvdXQoY29uc3QgVmFsdWU6IEludGVnZXIpOwotYmVnaW4KLSAgRlJlYWRUaW1lb3V0IDo9IFZhbHVlCi1lbmQ7Ci0KLXByb2NlZHVyZSBUSFRUUENsaWVudEltcGwuV3JpdGUoIGNvbnN0IGJ1ZjogVEJ5dGVzOyBvZmYsIGxlbjogSW50ZWdlcik7Ci1iZWdpbgotICBGT3V0cHV0U3RyZWFtLldyaXRlKCBidWYsIG9mZiwgbGVuKTsKKyAgRk91dHB1dFN0cmVhbS5Xcml0ZSggcEJ1Ziwgb2ZmLCBsZW4pOwogZW5kOwogCiB7IFRUcmFuc3BvcnRFeGNlcHRpb24gfQogCi1jb25zdHJ1Y3RvciBUVHJhbnNwb3J0RXhjZXB0aW9uLkNyZWF0ZShBVHlwZTogVEV4Y2VwdGlvblR5cGUpOworZnVuY3Rpb24gVFRyYW5zcG9ydEV4Y2VwdGlvbi5HZXRUeXBlOiBURXhjZXB0aW9uVHlwZTsKK2JlZ2luCisgIGlmIFNlbGYgaXMgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4gdGhlbiBSZXN1bHQgOj0gVEV4Y2VwdGlvblR5cGUuTm90T3BlbgorICBlbHNlIGlmIFNlbGYgaXMgVFRyYW5zcG9ydEV4Y2VwdGlvbkFscmVhZHlPcGVuIHRoZW4gUmVzdWx0IDo9IFRFeGNlcHRpb25UeXBlLkFscmVhZHlPcGVuCisgIGVsc2UgaWYgU2VsZiBpcyBUVHJhbnNwb3J0RXhjZXB0aW9uVGltZWRPdXQgdGhlbiBSZXN1bHQgOj0gVEV4Y2VwdGlvblR5cGUuVGltZWRPdXQKKyAgZWxzZSBpZiBTZWxmIGlzIFRUcmFuc3BvcnRFeGNlcHRpb25FbmRPZkZpbGUgdGhlbiBSZXN1bHQgOj0gVEV4Y2VwdGlvblR5cGUuRW5kT2ZGaWxlCisgIGVsc2UgaWYgU2VsZiBpcyBUVHJhbnNwb3J0RXhjZXB0aW9uQmFkQXJncyB0aGVuIFJlc3VsdCA6PSBURXhjZXB0aW9uVHlwZS5CYWRBcmdzCisgIGVsc2UgaWYgU2VsZiBpcyBUVHJhbnNwb3J0RXhjZXB0aW9uSW50ZXJydXB0ZWQgdGhlbiBSZXN1bHQgOj0gVEV4Y2VwdGlvblR5cGUuSW50ZXJydXB0ZWQKKyAgZWxzZSBSZXN1bHQgOj0gVEV4Y2VwdGlvblR5cGUuVW5rbm93bjsKK2VuZDsKKworY29uc3RydWN0b3IgVFRyYW5zcG9ydEV4Y2VwdGlvbi5IaWRkZW5DcmVhdGUoY29uc3QgTXNnOiBzdHJpbmcpOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZShNc2cpOworZW5kOworCitjbGFzcyBmdW5jdGlvbiBUVHJhbnNwb3J0RXhjZXB0aW9uLkNyZWF0ZShBVHlwZTogVEV4Y2VwdGlvblR5cGUpOiBUVHJhbnNwb3J0RXhjZXB0aW9uOwogYmVnaW4KICAgLy9ubyBpbmhlcml0ZWQ7Ci0gIENyZWF0ZSggQVR5cGUsICcnICkKK3skV0FSTiBTWU1CT0xfREVQUkVDQVRFRCBPRkZ9CisgIFJlc3VsdCA6PSBDcmVhdGUoQVR5cGUsICcnKQoreyRXQVJOIFNZTUJPTF9ERVBSRUNBVEVEIERFRkFVTFR9CiBlbmQ7CiAKLWNvbnN0cnVjdG9yIFRUcmFuc3BvcnRFeGNlcHRpb24uQ3JlYXRlKEFUeXBlOiBURXhjZXB0aW9uVHlwZTsKLSAgY29uc3QgbXNnOiBzdHJpbmcpOworY2xhc3MgZnVuY3Rpb24gVFRyYW5zcG9ydEV4Y2VwdGlvbi5DcmVhdGUoQVR5cGU6IFRFeGNlcHRpb25UeXBlOworICBjb25zdCBtc2c6IHN0cmluZyk6IFRUcmFuc3BvcnRFeGNlcHRpb247CiBiZWdpbgotICBpbmhlcml0ZWQgQ3JlYXRlKG1zZyk7Ci0gIEZUeXBlIDo9IEFUeXBlOworICBjYXNlIEFUeXBlIG9mCisgICAgVEV4Y2VwdGlvblR5cGUuTm90T3BlbjogICAgIFJlc3VsdCA6PSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUobXNnKTsKKyAgICBURXhjZXB0aW9uVHlwZS5BbHJlYWR5T3BlbjogUmVzdWx0IDo9IFRUcmFuc3BvcnRFeGNlcHRpb25BbHJlYWR5T3Blbi5DcmVhdGUobXNnKTsKKyAgICBURXhjZXB0aW9uVHlwZS5UaW1lZE91dDogICAgUmVzdWx0IDo9IFRUcmFuc3BvcnRFeGNlcHRpb25UaW1lZE91dC5DcmVhdGUobXNnKTsKKyAgICBURXhjZXB0aW9uVHlwZS5FbmRPZkZpbGU6ICAgUmVzdWx0IDo9IFRUcmFuc3BvcnRFeGNlcHRpb25FbmRPZkZpbGUuQ3JlYXRlKG1zZyk7CisgICAgVEV4Y2VwdGlvblR5cGUuQmFkQXJnczogICAgIFJlc3VsdCA6PSBUVHJhbnNwb3J0RXhjZXB0aW9uQmFkQXJncy5DcmVhdGUobXNnKTsKKyAgICBURXhjZXB0aW9uVHlwZS5JbnRlcnJ1cHRlZDogUmVzdWx0IDo9IFRUcmFuc3BvcnRFeGNlcHRpb25JbnRlcnJ1cHRlZC5DcmVhdGUobXNnKTsKKyAgZWxzZQorICAgIFJlc3VsdCA6PSBUVHJhbnNwb3J0RXhjZXB0aW9uVW5rbm93bi5DcmVhdGUobXNnKTsKKyAgZW5kOwogZW5kOwogCi1jb25zdHJ1Y3RvciBUVHJhbnNwb3J0RXhjZXB0aW9uLkNyZWF0ZShjb25zdCBtc2c6IHN0cmluZyk7CitjbGFzcyBmdW5jdGlvbiBUVHJhbnNwb3J0RXhjZXB0aW9uLkNyZWF0ZShjb25zdCBtc2c6IHN0cmluZyk6IFRUcmFuc3BvcnRFeGNlcHRpb247CiBiZWdpbgotICBpbmhlcml0ZWQgQ3JlYXRlKG1zZyk7CisgIFJlc3VsdCA6PSBUVHJhbnNwb3J0RXhjZXB0aW9uVW5rbm93bi5DcmVhdGUoTXNnKTsKK2VuZDsKKworeyBUVHJhbnNwb3J0RXhjZXB0aW9uU3BlY2lhbGl6ZWQgfQorCitjb25zdHJ1Y3RvciBUVHJhbnNwb3J0RXhjZXB0aW9uU3BlY2lhbGl6ZWQuQ3JlYXRlKGNvbnN0IE1zZzogc3RyaW5nKTsKK2JlZ2luCisgIGluaGVyaXRlZCBIaWRkZW5DcmVhdGUoTXNnKTsKIGVuZDsKIAogeyBUVHJhbnNwb3J0RmFjdG9yeUltcGwgfQpAQCAtNTMxLDI3ICs2OTgsNDUgQEAKIAogeyBUU2VydmVyU29ja2V0IH0KIAoreyRJRkRFRiBPTERfU09DS0VUU30KIGNvbnN0cnVjdG9yIFRTZXJ2ZXJTb2NrZXRJbXBsLkNyZWF0ZSggY29uc3QgQVNlcnZlcjogVFRjcFNlcnZlcjsgQUNsaWVudFRpbWVvdXQ6IEludGVnZXIpOwogYmVnaW4KICAgaW5oZXJpdGVkIENyZWF0ZTsKICAgRlNlcnZlciA6PSBBU2VydmVyOwogICBGQ2xpZW50VGltZW91dCA6PSBBQ2xpZW50VGltZW91dDsKIGVuZDsKLQotY29uc3RydWN0b3IgVFNlcnZlclNvY2tldEltcGwuQ3JlYXRlKEFQb3J0LCBBQ2xpZW50VGltZW91dDogSW50ZWdlcjsgQVVzZUJ1ZmZlcmVkU29ja2V0czogQm9vbGVhbik7Cit7JEVMU0V9Citjb25zdHJ1Y3RvciBUU2VydmVyU29ja2V0SW1wbC5DcmVhdGUoIGNvbnN0IEFTZXJ2ZXI6IFRTZXJ2ZXJTb2NrZXQ7IEFDbGllbnRUaW1lb3V0OiBMb25nd29yZCk7CiBiZWdpbgogICBpbmhlcml0ZWQgQ3JlYXRlOworICBGU2VydmVyIDo9IEFTZXJ2ZXI7CisgIEZTZXJ2ZXIuUmVjdlRpbWVvdXQgOj0gQUNsaWVudFRpbWVvdXQ7CisgIEZTZXJ2ZXIuU2VuZFRpbWVvdXQgOj0gQUNsaWVudFRpbWVvdXQ7CitlbmQ7Cit7JEVORElGfQorCit7JElGREVGIE9MRF9TT0NLRVRTfQorY29uc3RydWN0b3IgVFNlcnZlclNvY2tldEltcGwuQ3JlYXRlKEFQb3J0LCBBQ2xpZW50VGltZW91dDogSW50ZWdlcjsgQVVzZUJ1ZmZlcmVkU29ja2V0czogQm9vbGVhbik7Cit7JEVMU0V9Citjb25zdHJ1Y3RvciBUU2VydmVyU29ja2V0SW1wbC5DcmVhdGUoQVBvcnQ6IEludGVnZXI7IEFDbGllbnRUaW1lb3V0OiBMb25nd29yZDsgQVVzZUJ1ZmZlcmVkU29ja2V0czogQm9vbGVhbik7Cit7JEVORElGfQorYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKK3skSUZERUYgT0xEX1NPQ0tFVFN9CiAgIEZQb3J0IDo9IEFQb3J0OwogICBGQ2xpZW50VGltZW91dCA6PSBBQ2xpZW50VGltZW91dDsKLSAgRlVzZUJ1ZmZlcmVkU29ja2V0IDo9IEFVc2VCdWZmZXJlZFNvY2tldHM7Ci0gIEZPd25zU2VydmVyIDo9IFRydWU7CiAgIEZTZXJ2ZXIgOj0gVFRjcFNlcnZlci5DcmVhdGUoIG5pbCApOwogICBGU2VydmVyLkJsb2NrTW9kZSA6PSBibUJsb2NraW5nOwoteyRJRiBDb21waWxlclZlcnNpb24gPj0gMjEuMH0KKyAgeyRJRiBDb21waWxlclZlcnNpb24gPj0gMjEuMH0KICAgRlNlcnZlci5Mb2NhbFBvcnQgOj0gQW5zaVN0cmluZyggSW50VG9TdHIoIEZQb3J0KSk7Ci17JEVMU0V9CisgIHskRUxTRX0KICAgRlNlcnZlci5Mb2NhbFBvcnQgOj0gSW50VG9TdHIoIEZQb3J0KTsKLXskSUZFTkR9CisgIHskSUZFTkR9Cit7JEVMU0V9CisgIEZTZXJ2ZXIgOj0gVFNlcnZlclNvY2tldC5DcmVhdGUoQVBvcnQsIEFDbGllbnRUaW1lb3V0LCBBQ2xpZW50VGltZW91dCk7Cit7JEVORElGfQorICBGVXNlQnVmZmVyZWRTb2NrZXQgOj0gQVVzZUJ1ZmZlcmVkU29ja2V0czsKKyAgRk93bnNTZXJ2ZXIgOj0gVHJ1ZTsKIGVuZDsKIAogZGVzdHJ1Y3RvciBUU2VydmVyU29ja2V0SW1wbC5EZXN0cm95OwpAQCAtNTY1LDE1ICs3NTAsMTggQEAKIAogZnVuY3Rpb24gVFNlcnZlclNvY2tldEltcGwuQWNjZXB0KCBjb25zdCBmbkFjY2VwdGluZzogVFByb2MpOiBJVHJhbnNwb3J0OwogdmFyCit7JElGREVGIE9MRF9TT0NLRVRTfQogICBjbGllbnQgOiBUQ3VzdG9tSXBDbGllbnQ7Cit7JEVMU0V9CisgIGNsaWVudDogVFNvY2tldDsKK3skRU5ESUZ9CiAgIHRyYW5zICA6IElTdHJlYW1UcmFuc3BvcnQ7CiBiZWdpbgotICBpZiBGU2VydmVyID0gbmlsIHRoZW4KLSAgYmVnaW4KLSAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uLkNyZWF0ZSggVFRyYW5zcG9ydEV4Y2VwdGlvbi5URXhjZXB0aW9uVHlwZS5Ob3RPcGVuLAotICAgICAgJ05vIHVuZGVybHlpbmcgc2VydmVyIHNvY2tldC4nKTsKKyAgaWYgRlNlcnZlciA9IG5pbCB0aGVuIGJlZ2luCisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdObyB1bmRlcmx5aW5nIHNlcnZlciBzb2NrZXQuJyk7CiAgIGVuZDsKIAoreyRJRkRFRiBPTERfU09DS0VUU30KICAgY2xpZW50IDo9IG5pbDsKICAgdHJ5CiAgICAgY2xpZW50IDo9IFRDdXN0b21JcENsaWVudC5DcmVhdGUobmlsKTsKQEAgLTU4MSwxNSArNzY5LDEzIEBACiAgICAgaWYgQXNzaWduZWQoZm5BY2NlcHRpbmcpCiAgICAgdGhlbiBmbkFjY2VwdGluZygpOwogCi0gICAgaWYgbm90IEZTZXJ2ZXIuQWNjZXB0KCBjbGllbnQpIHRoZW4KLSAgICBiZWdpbgorICAgIGlmIG5vdCBGU2VydmVyLkFjY2VwdCggY2xpZW50KSB0aGVuIGJlZ2luCiAgICAgICBjbGllbnQuRnJlZTsKICAgICAgIFJlc3VsdCA6PSBuaWw7CiAgICAgICBFeGl0OwogICAgIGVuZDsKIAotICAgIGlmIGNsaWVudCA9IG5pbCB0aGVuCi0gICAgYmVnaW4KKyAgICBpZiBjbGllbnQgPSBuaWwgdGhlbiBiZWdpbgogICAgICAgUmVzdWx0IDo9IG5pbDsKICAgICAgIEV4aXQ7CiAgICAgZW5kOwpAQCAtNjA0LDQzICs3OTAsNjQgQEAKICAgZXhjZXB0CiAgICAgb24gRTogRXhjZXB0aW9uIGRvIGJlZ2luCiAgICAgICBjbGllbnQuRnJlZTsKLSAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24uQ3JlYXRlKCBFLlRvU3RyaW5nICk7CisgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVW5rbm93bi5DcmVhdGUoRS5Ub1N0cmluZyk7CiAgICAgZW5kOwogICBlbmQ7Cit7JEVMU0V9CisgIGlmIEFzc2lnbmVkKGZuQWNjZXB0aW5nKSB0aGVuCisgICAgZm5BY2NlcHRpbmcoKTsKKworICBjbGllbnQgOj0gRlNlcnZlci5BY2NlcHQ7CisgIHRyeQorICAgIHRyYW5zIDo9IFRTb2NrZXRJbXBsLkNyZWF0ZShjbGllbnQsIFRydWUpOworICAgIGNsaWVudCA6PSBuaWw7CisKKyAgICBpZiBGVXNlQnVmZmVyZWRTb2NrZXQgdGhlbgorICAgICAgUmVzdWx0IDo9IFRCdWZmZXJlZFRyYW5zcG9ydEltcGwuQ3JlYXRlKHRyYW5zKQorICAgIGVsc2UKKyAgICAgIFJlc3VsdCA6PSB0cmFuczsKKyAgZXhjZXB0CisgICAgY2xpZW50LkZyZWU7CisgICAgcmFpc2U7CisgIGVuZDsKK3skRU5ESUZ9CiBlbmQ7CiAKIHByb2NlZHVyZSBUU2VydmVyU29ja2V0SW1wbC5MaXN0ZW47CiBiZWdpbgogICBpZiBGU2VydmVyIDw+IG5pbCB0aGVuCiAgIGJlZ2luCit7JElGREVGIE9MRF9TT0NLRVRTfQogICAgIHRyeQogICAgICAgRlNlcnZlci5BY3RpdmUgOj0gVHJ1ZTsKICAgICBleGNlcHQKLSAgICAgIG9uIEU6IEV4Y2VwdGlvbiBkbwotICAgICAgYmVnaW4KLSAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbi5DcmVhdGUoJ0NvdWxkIG5vdCBhY2NlcHQgb24gbGlzdGVuaW5nIHNvY2tldDogJyArIEUuTWVzc2FnZSk7Ci0gICAgICBlbmQ7CisgICAgICBvbiBFOiBFeGNlcHRpb24KKyAgICAgIGRvIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Vbmtub3duLkNyZWF0ZSgnQ291bGQgbm90IGFjY2VwdCBvbiBsaXN0ZW5pbmcgc29ja2V0OiAnICsgRS5NZXNzYWdlKTsKICAgICBlbmQ7Cit7JEVMU0V9CisgICAgRlNlcnZlci5MaXN0ZW47Cit7JEVORElGfQogICBlbmQ7CiBlbmQ7CiAKIHByb2NlZHVyZSBUU2VydmVyU29ja2V0SW1wbC5DbG9zZTsKIGJlZ2luCiAgIGlmIEZTZXJ2ZXIgPD4gbmlsIHRoZW4KLSAgYmVnaW4KK3skSUZERUYgT0xEX1NPQ0tFVFN9CiAgICAgdHJ5CiAgICAgICBGU2VydmVyLkFjdGl2ZSA6PSBGYWxzZTsKICAgICBleGNlcHQKLSAgICAgIG9uIEU6IEV4Y2VwdGlvbiBkbwotICAgICAgYmVnaW4KLSAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbi5DcmVhdGUoJ0Vycm9yIG9uIGNsb3Npbmcgc29ja2V0IDogJyArIEUuTWVzc2FnZSk7Ci0gICAgICBlbmQ7CisgICAgICBvbiBFOiBFeGNlcHRpb24KKyAgICAgIGRvIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Vbmtub3duLkNyZWF0ZSgnRXJyb3Igb24gY2xvc2luZyBzb2NrZXQgOiAnICsgRS5NZXNzYWdlKTsKICAgICBlbmQ7Ci0gIGVuZDsKK3skRUxTRX0KKyAgICBGU2VydmVyLkNsb3NlOworeyRFTkRJRn0KIGVuZDsKIAogeyBUU29ja2V0IH0KIAoreyRJRkRFRiBPTERfU09DS0VUU30KIGNvbnN0cnVjdG9yIFRTb2NrZXRJbXBsLkNyZWF0ZSggY29uc3QgQUNsaWVudCA6IFRDdXN0b21JcENsaWVudDsgYU93bnNDbGllbnQgOiBCb29sZWFuOyBBVGltZW91dDogSW50ZWdlciA9IDApOwogdmFyIHN0cmVhbSA6IElUaHJpZnRTdHJlYW07CiBiZWdpbgpAQCAtNjUwLDggKzg1NywyMyBAQAogICBzdHJlYW0gOj0gVFRjcFNvY2tldFN0cmVhbUltcGwuQ3JlYXRlKCBGQ2xpZW50LCBGVGltZW91dCk7CiAgIGluaGVyaXRlZCBDcmVhdGUoIHN0cmVhbSwgc3RyZWFtKTsKIGVuZDsKK3skRUxTRX0KK2NvbnN0cnVjdG9yIFRTb2NrZXRJbXBsLkNyZWF0ZShjb25zdCBBQ2xpZW50OiBUU29ja2V0OyBhT3duc0NsaWVudDogQm9vbGVhbik7Cit2YXIgc3RyZWFtIDogSVRocmlmdFN0cmVhbTsKK2JlZ2luCisgIEZDbGllbnQgOj0gQUNsaWVudDsKKyAgRlRpbWVvdXQgOj0gQUNsaWVudC5SZWN2VGltZW91dDsKKyAgRk93bnNDbGllbnQgOj0gYU93bnNDbGllbnQ7CisgIHN0cmVhbSA6PSBUVGNwU29ja2V0U3RyZWFtSW1wbC5DcmVhdGUoRkNsaWVudCwgRlRpbWVvdXQpOworICBpbmhlcml0ZWQgQ3JlYXRlKHN0cmVhbSwgc3RyZWFtKTsKK2VuZDsKK3skRU5ESUZ9CiAKK3skSUZERUYgT0xEX1NPQ0tFVFN9CiBjb25zdHJ1Y3RvciBUU29ja2V0SW1wbC5DcmVhdGUoY29uc3QgQUhvc3Q6IHN0cmluZzsgQVBvcnQsIEFUaW1lb3V0OiBJbnRlZ2VyKTsKK3skRUxTRX0KK2NvbnN0cnVjdG9yIFRTb2NrZXRJbXBsLkNyZWF0ZShjb25zdCBBSG9zdDogc3RyaW5nOyBBUG9ydDogSW50ZWdlcjsgQVRpbWVvdXQ6IExvbmd3b3JkKTsKK3skRU5ESUZ9CiBiZWdpbgogICBpbmhlcml0ZWQgQ3JlYXRlKG5pbCxuaWwpOwogICBGSG9zdCA6PSBBSG9zdDsKQEAgLTY3MCwxMyArODkyLDIyIEBACiBwcm9jZWR1cmUgVFNvY2tldEltcGwuQ2xvc2U7CiBiZWdpbgogICBpbmhlcml0ZWQgQ2xvc2U7CisKKyAgRklucHV0U3RyZWFtIDo9IG5pbDsKKyAgRk91dHB1dFN0cmVhbSA6PSBuaWw7CisKICAgaWYgRk93bnNDbGllbnQKLSAgdGhlbiBGcmVlQW5kTmlsKCBGQ2xpZW50KTsKKyAgdGhlbiBGcmVlQW5kTmlsKCBGQ2xpZW50KQorICBlbHNlIEZDbGllbnQgOj0gbmlsOwogZW5kOwogCiBmdW5jdGlvbiBUU29ja2V0SW1wbC5HZXRJc09wZW46IEJvb2xlYW47CiBiZWdpbgoreyRJRkRFRiBPTERfU09DS0VUU30KICAgUmVzdWx0IDo9IChGQ2xpZW50IDw+IG5pbCkgYW5kIEZDbGllbnQuQ29ubmVjdGVkOworeyRFTFNFfQorICBSZXN1bHQgOj0gKEZDbGllbnQgPD4gbmlsKSBhbmQgRkNsaWVudC5Jc09wZW4KK3skRU5ESUZ9CiBlbmQ7CiAKIHByb2NlZHVyZSBUU29ja2V0SW1wbC5Jbml0U29ja2V0OwpAQCAtNjg3LDcgKzkxOCwxMSBAQAogICB0aGVuIEZyZWVBbmROaWwoIEZDbGllbnQpCiAgIGVsc2UgRkNsaWVudCA6PSBuaWw7CiAKK3skSUZERUYgT0xEX1NPQ0tFVFN9CiAgIEZDbGllbnQgOj0gVFRjcENsaWVudC5DcmVhdGUoIG5pbCk7Cit7JEVMU0V9CisgIEZDbGllbnQgOj0gVFNvY2tldC5DcmVhdGUoRkhvc3QsIEZQb3J0KTsKK3skRU5ESUZ9CiAgIEZPd25zQ2xpZW50IDo9IFRydWU7CiAKICAgc3RyZWFtIDo9IFRUY3BTb2NrZXRTdHJlYW1JbXBsLkNyZWF0ZSggRkNsaWVudCwgRlRpbWVvdXQpOwpAQCAtNjk3LDMyICs5MzIsMjggQEAKIAogcHJvY2VkdXJlIFRTb2NrZXRJbXBsLk9wZW47CiBiZWdpbgotICBpZiBJc09wZW4gdGhlbgotICBiZWdpbgotICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24uQ3JlYXRlKCBUVHJhbnNwb3J0RXhjZXB0aW9uLlRFeGNlcHRpb25UeXBlLkFscmVhZHlPcGVuLAotICAgICAgJ1NvY2tldCBhbHJlYWR5IGNvbm5lY3RlZCcpOworICBpZiBJc09wZW4gdGhlbiBiZWdpbgorICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25BbHJlYWR5T3Blbi5DcmVhdGUoJ1NvY2tldCBhbHJlYWR5IGNvbm5lY3RlZCcpOwogICBlbmQ7CiAKLSAgaWYgRkhvc3QgPSAgJycgdGhlbgotICBiZWdpbgotICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24uQ3JlYXRlKCBUVHJhbnNwb3J0RXhjZXB0aW9uLlRFeGNlcHRpb25UeXBlLk5vdE9wZW4sCi0gICAgICAnQ2Fubm90IG9wZW4gbnVsbCBob3N0Jyk7CisgIGlmIEZIb3N0ID0gJycgdGhlbiBiZWdpbgorICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnQ2Fubm90IG9wZW4gbnVsbCBob3N0Jyk7CiAgIGVuZDsKIAotICBpZiBQb3J0IDw9IDAgdGhlbgotICBiZWdpbgotICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24uQ3JlYXRlKCBUVHJhbnNwb3J0RXhjZXB0aW9uLlRFeGNlcHRpb25UeXBlLk5vdE9wZW4sCi0gICAgICAnQ2Fubm90IG9wZW4gd2l0aG91dCBwb3J0Jyk7CisgIGlmIFBvcnQgPD0gMCB0aGVuIGJlZ2luCisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdDYW5ub3Qgb3BlbiB3aXRob3V0IHBvcnQnKTsKICAgZW5kOwogCi0gIGlmIEZDbGllbnQgPSBuaWwgdGhlbgotICBiZWdpbgotICAgIEluaXRTb2NrZXQ7Ci0gIGVuZDsKKyAgaWYgRkNsaWVudCA9IG5pbAorICB0aGVuIEluaXRTb2NrZXQ7CiAKK3skSUZERUYgT0xEX1NPQ0tFVFN9CiAgIEZDbGllbnQuUmVtb3RlSG9zdCA6PSBUU29ja2V0SG9zdCggSG9zdCk7CiAgIEZDbGllbnQuUmVtb3RlUG9ydCA6PSBUU29ja2V0UG9ydCggSW50VG9TdHIoIFBvcnQpKTsKICAgRkNsaWVudC5Db25uZWN0OworeyRFTFNFfQorICBGQ2xpZW50Lk9wZW47Cit7JEVORElGfQogCiAgIEZJbnB1dFN0cmVhbSA6PSBUVGNwU29ja2V0U3RyZWFtSW1wbC5DcmVhdGUoIEZDbGllbnQsIEZUaW1lb3V0KTsKICAgRk91dHB1dFN0cmVhbSA6PSBGSW5wdXRTdHJlYW07CkBAIC03NjIsMTEgKzk5Myw5IEBACiAgIGJ1ZiA6IFRCeXRlczsKICAgbGVuIDogSW50ZWdlcjsKIGJlZ2luCi0gIGlmIElzT3BlbiB0aGVuCi0gIGJlZ2luCisgIGlmIElzT3BlbiB0aGVuIGJlZ2luCiAgICAgbGVuIDo9IEZXcml0ZUJ1ZmZlci5TaXplOwotICAgIGlmIGxlbiA+IDAgdGhlbgotICAgIGJlZ2luCisgICAgaWYgbGVuID4gMCB0aGVuIGJlZ2luCiAgICAgICBTZXRMZW5ndGgoIGJ1ZiwgbGVuICk7CiAgICAgICBGV3JpdGVCdWZmZXIuUG9zaXRpb24gOj0gMDsKICAgICAgIEZXcml0ZUJ1ZmZlci5SZWFkKCBQb2ludGVyKEBidWZbMF0pXiwgbGVuICk7CkBAIC03ODAsMjcgKzEwMDksMjggQEAKIGJlZ2luCiAgIFJlc3VsdCA6PSAoRldyaXRlQnVmZmVyIDw+IG5pbCkKICAgICAgICAgYW5kIChGUmVhZEJ1ZmZlciA8PiBuaWwpCi0gICAgICAgIGFuZCAoRlN0cmVhbSA8PiBuaWwpOworICAgICAgICBhbmQgKEZTdHJlYW0gPD4gbmlsKQorICAgICAgICBhbmQgRlN0cmVhbS5Jc09wZW47CiBlbmQ7CiAKIHByb2NlZHVyZSBUQnVmZmVyZWRTdHJlYW1JbXBsLk9wZW47CiBiZWdpbgotCisgIEZTdHJlYW0uT3BlbjsKIGVuZDsKIAotZnVuY3Rpb24gVEJ1ZmZlcmVkU3RyZWFtSW1wbC5SZWFkKCB2YXIgYnVmZmVyOiBUQnl0ZXM7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOworZnVuY3Rpb24gVEJ1ZmZlcmVkU3RyZWFtSW1wbC5SZWFkKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7CiB2YXIKICAgblJlYWQgOiBJbnRlZ2VyOwogICB0ZW1wYnVmIDogVEJ5dGVzOworICBwVG1wIDogUEJ5dGU7CiBiZWdpbgogICBpbmhlcml0ZWQ7CiAgIFJlc3VsdCA6PSAwOwotICBpZiBJc09wZW4gdGhlbgotICBiZWdpbgorCisgIGlmIElzT3BlbiB0aGVuIGJlZ2luCiAgICAgd2hpbGUgY291bnQgPiAwIGRvIGJlZ2luCiAKLSAgICAgIGlmIEZSZWFkQnVmZmVyLlBvc2l0aW9uID49IEZSZWFkQnVmZmVyLlNpemUgdGhlbgotICAgICAgYmVnaW4KKyAgICAgIGlmIEZSZWFkQnVmZmVyLlBvc2l0aW9uID49IEZSZWFkQnVmZmVyLlNpemUgdGhlbiBiZWdpbgogICAgICAgICBGUmVhZEJ1ZmZlci5DbGVhcjsKICAgICAgICAgU2V0TGVuZ3RoKCB0ZW1wYnVmLCBGQnVmU2l6ZSk7CiAgICAgICAgIG5SZWFkIDo9IEZTdHJlYW0uUmVhZCggdGVtcGJ1ZiwgMCwgRkJ1ZlNpemUgKTsKQEAgLTgxMCwxMCArMTA0MCwxMSBAQAogICAgICAgICBGUmVhZEJ1ZmZlci5Qb3NpdGlvbiA6PSAwOwogICAgICAgZW5kOwogCi0gICAgICBpZiBGUmVhZEJ1ZmZlci5Qb3NpdGlvbiA8IEZSZWFkQnVmZmVyLlNpemUgdGhlbgotICAgICAgYmVnaW4KLSAgICAgICAgblJlYWQgIDo9IE1pbiggRlJlYWRCdWZmZXIuU2l6ZSAtIEZSZWFkQnVmZmVyLlBvc2l0aW9uLCBjb3VudCk7Ci0gICAgICAgIEluYyggUmVzdWx0LCBGUmVhZEJ1ZmZlci5SZWFkKCBQb2ludGVyKEBidWZmZXJbb2Zmc2V0XSleLCBuUmVhZCkpOworICAgICAgaWYgRlJlYWRCdWZmZXIuUG9zaXRpb24gPCBGUmVhZEJ1ZmZlci5TaXplIHRoZW4gYmVnaW4KKyAgICAgICAgblJlYWQgOj0gTWluKCBGUmVhZEJ1ZmZlci5TaXplIC0gRlJlYWRCdWZmZXIuUG9zaXRpb24sIGNvdW50KTsKKyAgICAgICAgcFRtcCAgOj0gcEJ1ZjsKKyAgICAgICAgSW5jKCBwVG1wLCBvZmZzZXQpOworICAgICAgICBJbmMoIFJlc3VsdCwgRlJlYWRCdWZmZXIuUmVhZCggcFRtcF4sIG5SZWFkKSk7CiAgICAgICAgIERlYyggY291bnQsIG5SZWFkKTsKICAgICAgICAgSW5jKCBvZmZzZXQsIG5SZWFkKTsKICAgICAgIGVuZDsKQEAgLTgyMiwzNSArMTA1MywzMiBAQAogZW5kOwogCiBmdW5jdGlvbiBUQnVmZmVyZWRTdHJlYW1JbXBsLlRvQXJyYXk6IFRCeXRlczsKLXZhcgotICBsZW4gOiBJbnRlZ2VyOwordmFyIGxlbiA6IEludGVnZXI7CiBiZWdpbgogICBsZW4gOj0gMDsKIAotICBpZiBJc09wZW4gdGhlbgotICBiZWdpbgorICBpZiBJc09wZW4gdGhlbiBiZWdpbgogICAgIGxlbiA6PSBGUmVhZEJ1ZmZlci5TaXplOwogICBlbmQ7CiAKICAgU2V0TGVuZ3RoKCBSZXN1bHQsIGxlbik7CiAKLSAgaWYgbGVuID4gMCB0aGVuCi0gIGJlZ2luCisgIGlmIGxlbiA+IDAgdGhlbiBiZWdpbgogICAgIEZSZWFkQnVmZmVyLlBvc2l0aW9uIDo9IDA7CiAgICAgRlJlYWRCdWZmZXIuUmVhZCggUG9pbnRlcihAUmVzdWx0WzBdKV4sIGxlbiApOwogICBlbmQ7CiBlbmQ7CiAKLXByb2NlZHVyZSBUQnVmZmVyZWRTdHJlYW1JbXBsLldyaXRlKCBjb25zdCBidWZmZXI6IFRCeXRlczsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik7Citwcm9jZWR1cmUgVEJ1ZmZlcmVkU3RyZWFtSW1wbC5Xcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOwordmFyIHBUbXAgOiBQQnl0ZTsKIGJlZ2luCiAgIGluaGVyaXRlZDsKLSAgaWYgY291bnQgPiAwIHRoZW4KLSAgYmVnaW4KLSAgICBpZiBJc09wZW4gdGhlbgotICAgIGJlZ2luCi0gICAgICBGV3JpdGVCdWZmZXIuV3JpdGUoIFBvaW50ZXIoQGJ1ZmZlcltvZmZzZXRdKV4sIGNvdW50ICk7Ci0gICAgICBpZiBGV3JpdGVCdWZmZXIuU2l6ZSA+IEZCdWZTaXplIHRoZW4KLSAgICAgIGJlZ2luCisgIGlmIGNvdW50ID4gMCB0aGVuIGJlZ2luCisgICAgaWYgSXNPcGVuIHRoZW4gYmVnaW4KKyAgICAgIHBUbXAgOj0gcEJ1ZjsKKyAgICAgIEluYyggcFRtcCwgb2Zmc2V0KTsKKyAgICAgIEZXcml0ZUJ1ZmZlci5Xcml0ZSggcFRtcF4sIGNvdW50ICk7CisgICAgICBpZiBGV3JpdGVCdWZmZXIuU2l6ZSA+IEZCdWZTaXplIHRoZW4gYmVnaW4KICAgICAgICAgRmx1c2g7CiAgICAgICBlbmQ7CiAgICAgZW5kOwpAQCAtODU5LDI1ICsxMDg3LDYgQEAKIAogeyBUU3RyZWFtVHJhbnNwb3J0SW1wbCB9CiAKLXByb2NlZHVyZSBUU3RyZWFtVHJhbnNwb3J0SW1wbC5DbG9zZTsKLWJlZ2luCi0gIGlmIEZJbnB1dFN0cmVhbSA8PiBGT3V0cHV0U3RyZWFtIHRoZW4KLSAgYmVnaW4KLSAgICBpZiBGSW5wdXRTdHJlYW0gPD4gbmlsIHRoZW4KLSAgICBiZWdpbgotICAgICAgRklucHV0U3RyZWFtIDo9IG5pbDsKLSAgICBlbmQ7Ci0gICAgaWYgRk91dHB1dFN0cmVhbSA8PiBuaWwgdGhlbgotICAgIGJlZ2luCi0gICAgICBGT3V0cHV0U3RyZWFtIDo9IG5pbDsKLSAgICBlbmQ7Ci0gIGVuZCBlbHNlCi0gIGJlZ2luCi0gICAgRklucHV0U3RyZWFtIDo9IG5pbDsKLSAgICBGT3V0cHV0U3RyZWFtIDo9IG5pbDsKLSAgZW5kOwotZW5kOwotCiBjb25zdHJ1Y3RvciBUU3RyZWFtVHJhbnNwb3J0SW1wbC5DcmVhdGUoIGNvbnN0IEFJbnB1dFN0cmVhbSA6IElUaHJpZnRTdHJlYW07IGNvbnN0IEFPdXRwdXRTdHJlYW0gOiBJVGhyaWZ0U3RyZWFtKTsKIGJlZ2luCiAgIGluaGVyaXRlZCBDcmVhdGU7CkBAIC04OTIsMTEgKzExMDEsMTYgQEAKICAgaW5oZXJpdGVkOwogZW5kOwogCitwcm9jZWR1cmUgVFN0cmVhbVRyYW5zcG9ydEltcGwuQ2xvc2U7CitiZWdpbgorICBGSW5wdXRTdHJlYW0gOj0gbmlsOworICBGT3V0cHV0U3RyZWFtIDo9IG5pbDsKK2VuZDsKKwogcHJvY2VkdXJlIFRTdHJlYW1UcmFuc3BvcnRJbXBsLkZsdXNoOwogYmVnaW4KLSAgaWYgRk91dHB1dFN0cmVhbSA9IG5pbCB0aGVuCi0gIGJlZ2luCi0gICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbi5DcmVhdGUoIFRUcmFuc3BvcnRFeGNlcHRpb24uVEV4Y2VwdGlvblR5cGUuTm90T3BlbiwgJ0Nhbm5vdCBmbHVzaCBudWxsIG91dHB1dHN0cmVhbScgKTsKKyAgaWYgRk91dHB1dFN0cmVhbSA9IG5pbCB0aGVuIGJlZ2luCisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdDYW5ub3QgZmx1c2ggbnVsbCBvdXRwdXRzdHJlYW0nICk7CiAgIGVuZDsKIAogICBGT3V0cHV0U3RyZWFtLkZsdXNoOwpAQCAtOTE0LDcgKzExMjgsNyBAQAogCiBmdW5jdGlvbiBUU3RyZWFtVHJhbnNwb3J0SW1wbC5HZXRPdXRwdXRTdHJlYW06IElUaHJpZnRTdHJlYW07CiBiZWdpbgotICBSZXN1bHQgOj0gRklucHV0U3RyZWFtOworICBSZXN1bHQgOj0gRk91dHB1dFN0cmVhbTsKIGVuZDsKIAogcHJvY2VkdXJlIFRTdHJlYW1UcmFuc3BvcnRJbXBsLk9wZW47CkBAIC05MjIsMjMgKzExMzYsMjIgQEAKIAogZW5kOwogCi1mdW5jdGlvbiBUU3RyZWFtVHJhbnNwb3J0SW1wbC5SZWFkKHZhciBidWY6IFRCeXRlczsgb2ZmLCBsZW46IEludGVnZXIpOiBJbnRlZ2VyOworZnVuY3Rpb24gVFN0cmVhbVRyYW5zcG9ydEltcGwuUmVhZCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsKIGJlZ2luCi0gIGlmIEZJbnB1dFN0cmVhbSA9IG5pbCB0aGVuCi0gIGJlZ2luCi0gICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbi5DcmVhdGUoIFRUcmFuc3BvcnRFeGNlcHRpb24uVEV4Y2VwdGlvblR5cGUuTm90T3BlbiwgJ0Nhbm5vdCByZWFkIGZyb20gbnVsbCBpbnB1dHN0cmVhbScgKTsKKyAgaWYgRklucHV0U3RyZWFtID0gbmlsIHRoZW4gYmVnaW4KKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoJ0Nhbm5vdCByZWFkIGZyb20gbnVsbCBpbnB1dHN0cmVhbScgKTsKICAgZW5kOwotICBSZXN1bHQgOj0gRklucHV0U3RyZWFtLlJlYWQoIGJ1Ziwgb2ZmLCBsZW4gKTsKKworICBSZXN1bHQgOj0gRklucHV0U3RyZWFtLlJlYWQoIHBCdWYsYnVmbGVuLCBvZmYsIGxlbiApOwogZW5kOwogCi1wcm9jZWR1cmUgVFN0cmVhbVRyYW5zcG9ydEltcGwuV3JpdGUoY29uc3QgYnVmOiBUQnl0ZXM7IG9mZiwgbGVuOiBJbnRlZ2VyKTsKK3Byb2NlZHVyZSBUU3RyZWFtVHJhbnNwb3J0SW1wbC5Xcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZiwgbGVuIDogSW50ZWdlcik7CiBiZWdpbgotICBpZiBGT3V0cHV0U3RyZWFtID0gbmlsIHRoZW4KLSAgYmVnaW4KLSAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uLkNyZWF0ZSggVFRyYW5zcG9ydEV4Y2VwdGlvbi5URXhjZXB0aW9uVHlwZS5Ob3RPcGVuLCAnQ2Fubm90IHdyaXRlIHRvIG51bGwgb3V0cHV0c3RyZWFtJyApOworICBpZiBGT3V0cHV0U3RyZWFtID0gbmlsIHRoZW4gYmVnaW4KKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoJ0Nhbm5vdCB3cml0ZSB0byBudWxsIG91dHB1dHN0cmVhbScgKTsKICAgZW5kOwogCi0gIEZPdXRwdXRTdHJlYW0uV3JpdGUoIGJ1Ziwgb2ZmLCBsZW4gKTsKKyAgRk91dHB1dFN0cmVhbS5Xcml0ZSggcEJ1Ziwgb2ZmLCBsZW4gKTsKIGVuZDsKIAogeyBUQnVmZmVyZWRUcmFuc3BvcnRJbXBsIH0KQEAgLTk0OSwxMyArMTE2Miw3IEBACiAgIENyZWF0ZSggQVRyYW5zcG9ydCwgMTAyNCApOwogZW5kOwogCi1wcm9jZWR1cmUgVEJ1ZmZlcmVkVHJhbnNwb3J0SW1wbC5DbG9zZTsKLWJlZ2luCi0gIEZUcmFuc3BvcnQuQ2xvc2U7Ci1lbmQ7Ci0KLWNvbnN0cnVjdG9yIFRCdWZmZXJlZFRyYW5zcG9ydEltcGwuQ3JlYXRlKCBjb25zdCBBVHJhbnNwb3J0OiBJU3RyZWFtVHJhbnNwb3J0OwotICBBQnVmU2l6ZTogSW50ZWdlcik7Citjb25zdHJ1Y3RvciBUQnVmZmVyZWRUcmFuc3BvcnRJbXBsLkNyZWF0ZSggY29uc3QgQVRyYW5zcG9ydDogSVN0cmVhbVRyYW5zcG9ydDsgIEFCdWZTaXplOiBJbnRlZ2VyKTsKIGJlZ2luCiAgIGluaGVyaXRlZCBDcmVhdGU7CiAgIEZUcmFuc3BvcnQgOj0gQVRyYW5zcG9ydDsKQEAgLTk2MywxMCArMTE3MCwxNiBAQAogICBJbml0QnVmZmVyczsKIGVuZDsKIAorcHJvY2VkdXJlIFRCdWZmZXJlZFRyYW5zcG9ydEltcGwuQ2xvc2U7CitiZWdpbgorICBGVHJhbnNwb3J0LkNsb3NlOworICBGSW5wdXRCdWZmZXIgOj0gbmlsOworICBGT3V0cHV0QnVmZmVyIDo9IG5pbDsgIAorZW5kOworCiBwcm9jZWR1cmUgVEJ1ZmZlcmVkVHJhbnNwb3J0SW1wbC5GbHVzaDsKIGJlZ2luCi0gIGlmIEZPdXRwdXRCdWZmZXIgPD4gbmlsIHRoZW4KLSAgYmVnaW4KKyAgaWYgRk91dHB1dEJ1ZmZlciA8PiBuaWwgdGhlbiBiZWdpbgogICAgIEZPdXRwdXRCdWZmZXIuRmx1c2g7CiAgIGVuZDsKIGVuZDsKQEAgLTk4Myw1NCArMTE5Niw1MSBAQAogCiBwcm9jZWR1cmUgVEJ1ZmZlcmVkVHJhbnNwb3J0SW1wbC5Jbml0QnVmZmVyczsKIGJlZ2luCi0gIGlmIEZUcmFuc3BvcnQuSW5wdXRTdHJlYW0gPD4gbmlsIHRoZW4KLSAgYmVnaW4KKyAgaWYgRlRyYW5zcG9ydC5JbnB1dFN0cmVhbSA8PiBuaWwgdGhlbiBiZWdpbgogICAgIEZJbnB1dEJ1ZmZlciA6PSBUQnVmZmVyZWRTdHJlYW1JbXBsLkNyZWF0ZSggRlRyYW5zcG9ydC5JbnB1dFN0cmVhbSwgRkJ1ZlNpemUgKTsKICAgZW5kOwotICBpZiBGVHJhbnNwb3J0Lk91dHB1dFN0cmVhbSA8PiBuaWwgdGhlbgotICBiZWdpbgorICBpZiBGVHJhbnNwb3J0Lk91dHB1dFN0cmVhbSA8PiBuaWwgdGhlbiBiZWdpbgogICAgIEZPdXRwdXRCdWZmZXIgOj0gVEJ1ZmZlcmVkU3RyZWFtSW1wbC5DcmVhdGUoIEZUcmFuc3BvcnQuT3V0cHV0U3RyZWFtLCBGQnVmU2l6ZSApOwogICBlbmQ7CiBlbmQ7CiAKIHByb2NlZHVyZSBUQnVmZmVyZWRUcmFuc3BvcnRJbXBsLk9wZW47CiBiZWdpbgotICBGVHJhbnNwb3J0Lk9wZW4KKyAgRlRyYW5zcG9ydC5PcGVuOworICBJbml0QnVmZmVyczsgIC8vIHdlIG5lZWQgdG8gZ2V0IHRoZSBidWZmZXJzIHRvIG1hdGNoIEZUcmFuc3BvcnQgc3Vic3RyZWFtcyBhZ2FpbgogZW5kOwogCi1mdW5jdGlvbiBUQnVmZmVyZWRUcmFuc3BvcnRJbXBsLlJlYWQodmFyIGJ1ZjogVEJ5dGVzOyBvZmYsIGxlbjogSW50ZWdlcik6IEludGVnZXI7CitmdW5jdGlvbiBUQnVmZmVyZWRUcmFuc3BvcnRJbXBsLlJlYWQoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlcik6IEludGVnZXI7CiBiZWdpbgogICBSZXN1bHQgOj0gMDsKLSAgaWYgRklucHV0QnVmZmVyIDw+IG5pbCB0aGVuCi0gIGJlZ2luCi0gICAgUmVzdWx0IDo9IEZJbnB1dEJ1ZmZlci5SZWFkKCBidWYsIG9mZiwgbGVuICk7CisgIGlmIEZJbnB1dEJ1ZmZlciA8PiBuaWwgdGhlbiBiZWdpbgorICAgIFJlc3VsdCA6PSBGSW5wdXRCdWZmZXIuUmVhZCggcEJ1ZixidWZsZW4sIG9mZiwgbGVuICk7CiAgIGVuZDsKIGVuZDsKIAotcHJvY2VkdXJlIFRCdWZmZXJlZFRyYW5zcG9ydEltcGwuV3JpdGUoY29uc3QgYnVmOiBUQnl0ZXM7IG9mZiwgbGVuOiBJbnRlZ2VyKTsKK3Byb2NlZHVyZSBUQnVmZmVyZWRUcmFuc3BvcnRJbXBsLldyaXRlKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgb2ZmLCBsZW4gOiBJbnRlZ2VyKTsKIGJlZ2luCi0gIGlmIEZPdXRwdXRCdWZmZXIgPD4gbmlsIHRoZW4KLSAgYmVnaW4KLSAgICBGT3V0cHV0QnVmZmVyLldyaXRlKCBidWYsIG9mZiwgbGVuICk7CisgIGlmIEZPdXRwdXRCdWZmZXIgPD4gbmlsIHRoZW4gYmVnaW4KKyAgICBGT3V0cHV0QnVmZmVyLldyaXRlKCBwQnVmLCBvZmYsIGxlbiApOwogICBlbmQ7CiBlbmQ7CiAKIHsgVEZyYW1lZFRyYW5zcG9ydEltcGwgfQogCi17JElGIENvbXBpbGVyVmVyc2lvbiA8IDIxLjB9Cit7JElGREVGIEhBVkVfQ0xBU1NfQ1RPUn0KK2NsYXNzIGNvbnN0cnVjdG9yIFRGcmFtZWRUcmFuc3BvcnRJbXBsLkNyZWF0ZTsKK2JlZ2luCisgIFNldExlbmd0aCggRkhlYWRlcl9EdW1teSwgRkhlYWRlclNpemUpOworICBGaWxsQ2hhciggRkhlYWRlcl9EdW1teVswXSwgTGVuZ3RoKCBGSGVhZGVyX0R1bW15KSAqIFNpemVPZiggQnl0ZSApLCAwKTsKK2VuZDsKK3skRUxTRX0KIHByb2NlZHVyZSBURnJhbWVkVHJhbnNwb3J0SW1wbF9Jbml0aWFsaXplOwogYmVnaW4KICAgU2V0TGVuZ3RoKCBURnJhbWVkVHJhbnNwb3J0SW1wbC5GSGVhZGVyX0R1bW15LCBURnJhbWVkVHJhbnNwb3J0SW1wbC5GSGVhZGVyU2l6ZSk7CiAgIEZpbGxDaGFyKCBURnJhbWVkVHJhbnNwb3J0SW1wbC5GSGVhZGVyX0R1bW15WzBdLAogICAgIExlbmd0aCggVEZyYW1lZFRyYW5zcG9ydEltcGwuRkhlYWRlcl9EdW1teSkgKiBTaXplT2YoIEJ5dGUgKSwgMCk7CiBlbmQ7Ci17JEVMU0V9Ci1jbGFzcyBjb25zdHJ1Y3RvciBURnJhbWVkVHJhbnNwb3J0SW1wbC5DcmVhdGU7Ci1iZWdpbgotICBTZXRMZW5ndGgoIEZIZWFkZXJfRHVtbXksIEZIZWFkZXJTaXplKTsKLSAgRmlsbENoYXIoIEZIZWFkZXJfRHVtbXlbMF0sIExlbmd0aCggRkhlYWRlcl9EdW1teSkgKiBTaXplT2YoIEJ5dGUgKSwgMCk7Ci1lbmQ7Ci17JElGRU5EfQoreyRFTkRJRn0KIAogY29uc3RydWN0b3IgVEZyYW1lZFRyYW5zcG9ydEltcGwuQ3JlYXRlOwogYmVnaW4KQEAgLTEwNjYsMTUgKzEyNzYsMTMgQEAKIGJlZ2luCiAgIGxlbiA6PSBGV3JpdGVCdWZmZXIuU2l6ZTsKICAgU2V0TGVuZ3RoKCBidWYsIGxlbik7Ci0gIGlmIGxlbiA+IDAgdGhlbgotICBiZWdpbgorICBpZiBsZW4gPiAwIHRoZW4gYmVnaW4KICAgICBTeXN0ZW0uTW92ZSggRldyaXRlQnVmZmVyLk1lbW9yeV4sIGJ1ZlswXSwgbGVuICk7CiAgIGVuZDsKIAogICBkYXRhX2xlbiA6PSBsZW4gLSBGSGVhZGVyU2l6ZTsKLSAgaWYgKGRhdGFfbGVuIDwgMCkgdGhlbgotICBiZWdpbgotICAgIHJhaXNlIEV4Y2VwdGlvbi5DcmVhdGUoICdURnJhbWVkVHJhbnNwb3J0LkZsdXNoOiBkYXRhX2xlbiA8IDAnICk7CisgIGlmIChkYXRhX2xlbiA8IDApIHRoZW4gYmVnaW4KKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVW5rbm93bi5DcmVhdGUoJ1RGcmFtZWRUcmFuc3BvcnQuRmx1c2g6IGRhdGFfbGVuIDwgMCcgKTsKICAgZW5kOwogCiAgIEluaXRXcml0ZUJ1ZmZlcjsKQEAgLTExMTAsMjUgKzEzMTgsMjUgQEAKICAgRlRyYW5zcG9ydC5PcGVuOwogZW5kOwogCi1mdW5jdGlvbiBURnJhbWVkVHJhbnNwb3J0SW1wbC5SZWFkKHZhciBidWY6IFRCeXRlczsgb2ZmLCBsZW46IEludGVnZXIpOiBJbnRlZ2VyOwotdmFyCi0gIGdvdCA6IEludGVnZXI7CitmdW5jdGlvbiBURnJhbWVkVHJhbnNwb3J0SW1wbC5SZWFkKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOiBJbnRlZ2VyOwordmFyIHBUbXAgOiBQQnl0ZTsKIGJlZ2luCi0gIGlmIEZSZWFkQnVmZmVyIDw+IG5pbCB0aGVuCi0gIGJlZ2luCi0gICAgaWYgbGVuID4gMAotICAgIHRoZW4gZ290IDo9IEZSZWFkQnVmZmVyLlJlYWQoIFBvaW50ZXIoQGJ1ZltvZmZdKV4sIGxlbiApCi0gICAgZWxzZSBnb3QgOj0gMDsKLSAgICBpZiBnb3QgPiAwIHRoZW4KLSAgICBiZWdpbgotICAgICAgUmVzdWx0IDo9IGdvdDsKKyAgaWYgbGVuID4gKGJ1Zmxlbi1vZmYpCisgIHRoZW4gbGVuIDo9IGJ1Zmxlbi1vZmY7CisKKyAgcFRtcCA6PSBwQnVmOworICBJbmMoIHBUbXAsIG9mZik7CisKKyAgaWYgKEZSZWFkQnVmZmVyIDw+IG5pbCkgYW5kIChsZW4gPiAwKSB0aGVuIGJlZ2luCisgICAgcmVzdWx0IDo9IEZSZWFkQnVmZmVyLlJlYWQoIHBUbXBeLCBsZW4pOworICAgIGlmIHJlc3VsdCA+IDAgdGhlbiBiZWdpbgogICAgICAgRXhpdDsKICAgICBlbmQ7CiAgIGVuZDsKIAogICBSZWFkRnJhbWU7CiAgIGlmIGxlbiA+IDAKLSAgdGhlbiBSZXN1bHQgOj0gRlJlYWRCdWZmZXIuUmVhZCggUG9pbnRlcihAYnVmW29mZl0pXiwgbGVuKQorICB0aGVuIFJlc3VsdCA6PSBGUmVhZEJ1ZmZlci5SZWFkKCBwVG1wXiwgbGVuKQogICBlbHNlIFJlc3VsdCA6PSAwOwogZW5kOwogCkBAIC0xMTQ5LDE0ICsxMzU3LDIwIEBACiAgIEZUcmFuc3BvcnQuUmVhZEFsbCggYnVmZiwgMCwgc2l6ZSApOwogICBGUmVhZEJ1ZmZlci5GcmVlOwogICBGUmVhZEJ1ZmZlciA6PSBUTWVtb3J5U3RyZWFtLkNyZWF0ZTsKLSAgRlJlYWRCdWZmZXIuV3JpdGUoIFBvaW50ZXIoQGJ1ZmZbMF0pXiwgc2l6ZSApOworICBpZiBMZW5ndGgoYnVmZikgPiAwCisgIHRoZW4gRlJlYWRCdWZmZXIuV3JpdGUoIFBvaW50ZXIoQGJ1ZmZbMF0pXiwgc2l6ZSApOwogICBGUmVhZEJ1ZmZlci5Qb3NpdGlvbiA6PSAwOwogZW5kOwogCi1wcm9jZWR1cmUgVEZyYW1lZFRyYW5zcG9ydEltcGwuV3JpdGUoY29uc3QgYnVmOiBUQnl0ZXM7IG9mZiwgbGVuOiBJbnRlZ2VyKTsKK3Byb2NlZHVyZSBURnJhbWVkVHJhbnNwb3J0SW1wbC5Xcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZiwgbGVuIDogSW50ZWdlcik7Cit2YXIgcFRtcCA6IFBCeXRlOwogYmVnaW4KLSAgaWYgbGVuID4gMAotICB0aGVuIEZXcml0ZUJ1ZmZlci5Xcml0ZSggUG9pbnRlcihAYnVmW29mZl0pXiwgbGVuICk7CisgIGlmIGxlbiA+IDAgdGhlbiBiZWdpbgorICAgIHBUbXAgOj0gcEJ1ZjsKKyAgICBJbmMoIHBUbXAsIG9mZik7CisKKyAgICBGV3JpdGVCdWZmZXIuV3JpdGUoIHBUbXBeLCBsZW4gKTsKKyAgZW5kOwogZW5kOwogCiB7IFRGcmFtZWRUcmFuc3BvcnQuVEZhY3RvcnkgfQpAQCAtMTE3MywxMiArMTM4NywyNSBAQAogICBGVGNwQ2xpZW50LkNsb3NlOwogZW5kOwogCit7JElGREVGIE9MRF9TT0NLRVRTfQogY29uc3RydWN0b3IgVFRjcFNvY2tldFN0cmVhbUltcGwuQ3JlYXRlKCBjb25zdCBBVGNwQ2xpZW50OiBUQ3VzdG9tSXBDbGllbnQ7IGNvbnN0IGFUaW1lb3V0IDogSW50ZWdlcik7CiBiZWdpbgogICBpbmhlcml0ZWQgQ3JlYXRlOwogICBGVGNwQ2xpZW50IDo9IEFUY3BDbGllbnQ7CiAgIEZUaW1lb3V0IDo9IGFUaW1lb3V0OwogZW5kOworeyRFTFNFfQorY29uc3RydWN0b3IgVFRjcFNvY2tldFN0cmVhbUltcGwuQ3JlYXRlKCBjb25zdCBBVGNwQ2xpZW50OiBUU29ja2V0OyBjb25zdCBhVGltZW91dCA6IExvbmd3b3JkKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7CisgIEZUY3BDbGllbnQgOj0gQVRjcENsaWVudDsKKyAgaWYgYVRpbWVvdXQgPSAwIHRoZW4KKyAgICBGVGNwQ2xpZW50LlJlY3ZUaW1lb3V0IDo9IFNMRUVQX1RJTUUKKyAgZWxzZQorICAgIEZUY3BDbGllbnQuUmVjdlRpbWVvdXQgOj0gYVRpbWVvdXQ7CisgIEZUY3BDbGllbnQuU2VuZFRpbWVvdXQgOj0gYVRpbWVvdXQ7CitlbmQ7Cit7JEVORElGfQogCiBwcm9jZWR1cmUgVFRjcFNvY2tldFN0cmVhbUltcGwuRmx1c2g7CiBiZWdpbgpAQCAtMTE4Nyw3ICsxNDE0LDExIEBACiAKIGZ1bmN0aW9uIFRUY3BTb2NrZXRTdHJlYW1JbXBsLklzT3BlbjogQm9vbGVhbjsKIGJlZ2luCit7JElGREVGIE9MRF9TT0NLRVRTfQogICBSZXN1bHQgOj0gRlRjcENsaWVudC5BY3RpdmU7Cit7JEVMU0V9CisgIFJlc3VsdCA6PSBGVGNwQ2xpZW50LklzT3BlbjsKK3skRU5ESUZ9CiBlbmQ7CiAKIHByb2NlZHVyZSBUVGNwU29ja2V0U3RyZWFtSW1wbC5PcGVuOwpAQCAtMTE5Niw2ICsxNDI3LDcgQEAKIGVuZDsKIAogCit7JElGREVGIE9MRF9TT0NLRVRTfQogZnVuY3Rpb24gVFRjcFNvY2tldFN0cmVhbUltcGwuU2VsZWN0KCBSZWFkUmVhZHksIFdyaXRlUmVhZHksIEV4Y2VwdEZsYWc6IFBCb29sZWFuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lT3V0OiBJbnRlZ2VyOyB2YXIgd3NhRXJyb3IgOiBJbnRlZ2VyKTogSW50ZWdlcjsKIHZhcgpAQCAtMTIxNiw1MCArMTQ0OCw1NSBAQAogCiAgIHNvY2tldCA6PSBGVGNwQ2xpZW50LkhhbmRsZTsKIAotICBpZiBBc3NpZ25lZChSZWFkUmVhZHkpIHRoZW4KLSAgYmVnaW4KKyAgaWYgQXNzaWduZWQoUmVhZFJlYWR5KSB0aGVuIGJlZ2luCiAgICAgUmVhZEZkc3B0ciA6PSBAUmVhZEZkczsKICAgICBGRF9aRVJPKFJlYWRGZHMpOwogICAgIEZEX1NFVChzb2NrZXQsIFJlYWRGZHMpOwogICBlbmQKLSAgZWxzZQorICBlbHNlIGJlZ2luCiAgICAgUmVhZEZkc3B0ciA6PSBuaWw7CisgIGVuZDsKIAotICBpZiBBc3NpZ25lZChXcml0ZVJlYWR5KSB0aGVuCi0gIGJlZ2luCisgIGlmIEFzc2lnbmVkKFdyaXRlUmVhZHkpIHRoZW4gYmVnaW4KICAgICBXcml0ZUZkc3B0ciA6PSBAV3JpdGVGZHM7CiAgICAgRkRfWkVSTyhXcml0ZUZkcyk7CiAgICAgRkRfU0VUKHNvY2tldCwgV3JpdGVGZHMpOwogICBlbmQKLSAgZWxzZQorICBlbHNlIGJlZ2luCiAgICAgV3JpdGVGZHNwdHIgOj0gbmlsOworICBlbmQ7CiAKLSAgaWYgQXNzaWduZWQoRXhjZXB0RmxhZykgdGhlbgotICBiZWdpbgorICBpZiBBc3NpZ25lZChFeGNlcHRGbGFnKSB0aGVuIGJlZ2luCiAgICAgRXhjZXB0RmRzcHRyIDo9IEBFeGNlcHRGZHM7CiAgICAgRkRfWkVSTyhFeGNlcHRGZHMpOwogICAgIEZEX1NFVChzb2NrZXQsIEV4Y2VwdEZkcyk7CiAgIGVuZAotICBlbHNlCisgIGVsc2UgYmVnaW4KICAgICBFeGNlcHRGZHNwdHIgOj0gbmlsOworICBlbmQ7CiAKLSAgaWYgVGltZU91dCA+PSAwIHRoZW4KLSAgYmVnaW4KKyAgaWYgVGltZU91dCA+PSAwIHRoZW4gYmVnaW4KICAgICB0di50dl9zZWMgOj0gVGltZU91dCBkaXYgMTAwMDsKICAgICB0di50dl91c2VjIDo9ICAxMDAwICogKFRpbWVPdXQgbW9kIDEwMDApOwogICAgIFRpbWVwdHIgOj0gQHR2OwogICBlbmQKLSAgZWxzZQorICBlbHNlIGJlZ2luCiAgICAgVGltZXB0ciA6PSBuaWw7ICAvLyB3YWl0IGZvcmV2ZXIKKyAgZW5kOwogCiAgIHdzYUVycm9yIDo9IDA7CiAgIHRyeQoteyRJRkRFRiBNU1dJTkRPV1N9Ci0gICAgcmVzdWx0IDo9IFdpblNvY2suc2VsZWN0KHNvY2tldCArIDEsIFJlYWRGZHNwdHIsIFdyaXRlRmRzcHRyLCBFeGNlcHRGZHNwdHIsIFRpbWVwdHIpOwoteyRFTkRJRn0KLXskSUZERUYgTElOVVh9Ci0gICAgcmVzdWx0IDo9IExpYmMuc2VsZWN0KHNvY2tldCArIDEsIFJlYWRGZHNwdHIsIFdyaXRlRmRzcHRyLCBFeGNlcHRGZHNwdHIsIFRpbWVwdHIpOwoteyRFTkRJRn0KKyAgICB7JElGREVGIE1TV0lORE9XU30KKyAgICAgIHskSUZERUYgT0xEX1VOSVRfTkFNRVN9CisgICAgICByZXN1bHQgOj0gV2luU29jay5zZWxlY3QoICAgICAgICBzb2NrZXQgKyAxLCBSZWFkRmRzcHRyLCBXcml0ZUZkc3B0ciwgRXhjZXB0RmRzcHRyLCBUaW1lcHRyKTsKKyAgICAgIHskRUxTRX0KKyAgICAgIHJlc3VsdCA6PSBXaW5hcGkuV2luU29jay5zZWxlY3QoIHNvY2tldCArIDEsIFJlYWRGZHNwdHIsIFdyaXRlRmRzcHRyLCBFeGNlcHRGZHNwdHIsIFRpbWVwdHIpOworICAgICAgeyRFTkRJRn0KKyAgICB7JEVORElGfQorICAgIHskSUZERUYgTElOVVh9CisgICAgICByZXN1bHQgOj0gTGliYy5zZWxlY3QoICAgICAgICAgICBzb2NrZXQgKyAxLCBSZWFkRmRzcHRyLCBXcml0ZUZkc3B0ciwgRXhjZXB0RmRzcHRyLCBUaW1lcHRyKTsKKyAgICB7JEVORElGfQorCQogICAgIGlmIHJlc3VsdCA9IFNPQ0tFVF9FUlJPUgogICAgIHRoZW4gd3NhRXJyb3IgOj0gV1NBR2V0TGFzdEVycm9yOwogCkBAIC0xMjY4LDE5ICsxNTA1LDI3IEBACiAgIGVuZDsKIAogICBpZiBBc3NpZ25lZChSZWFkUmVhZHkpIHRoZW4KLSAgICBSZWFkUmVhZHleIDo9IEZEX0lTU0VUKHNvY2tldCwgUmVhZEZkcyk7CisgICBSZWFkUmVhZHleIDo9IEZEX0lTU0VUKHNvY2tldCwgUmVhZEZkcyk7CisgICAKICAgaWYgQXNzaWduZWQoV3JpdGVSZWFkeSkgdGhlbgogICAgIFdyaXRlUmVhZHleIDo9IEZEX0lTU0VUKHNvY2tldCwgV3JpdGVGZHMpOworICAKICAgaWYgQXNzaWduZWQoRXhjZXB0RmxhZykgdGhlbgogICAgIEV4Y2VwdEZsYWdeIDo9IEZEX0lTU0VUKHNvY2tldCwgRXhjZXB0RmRzKTsKIGVuZDsKK3skRU5ESUZ9CiAKK3skSUZERUYgT0xEX1NPQ0tFVFN9CiBmdW5jdGlvbiBUVGNwU29ja2V0U3RyZWFtSW1wbC5XYWl0Rm9yRGF0YSggVGltZU91dCA6IEludGVnZXI7IHBCdWYgOiBQb2ludGVyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2lyZWRCeXRlcyA6IEludGVnZXI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHdzYUVycm9yIDogSW50ZWdlcik6IFRXYWl0Rm9yRGF0YTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgd3NhRXJyb3IsIGJ5dGVzUmVhZHkgOiBJbnRlZ2VyKTogVFdhaXRGb3JEYXRhOwogdmFyIGJDYW5SZWFkLCBiRXJyb3IgOiBCb29sZWFuOwogICAgIHJldHZhbCA6IEludGVnZXI7Citjb25zdCAKKyAgTVNHX1BFRUsgPSB7JElGREVGIE9MRF9VTklUX05BTUVTfSBXaW5Tb2NrLk1TR19QRUVLICB7JEVMU0V9IFdpbmFwaS5XaW5Tb2NrLk1TR19QRUVLICB7JEVORElGfTsKIGJlZ2luCisgIGJ5dGVzUmVhZHkgOj0gMDsKKwogICAvLyBUaGUgc2VsZWN0IGZ1bmN0aW9uIHJldHVybnMgdGhlIHRvdGFsIG51bWJlciBvZiBzb2NrZXQgaGFuZGxlcyB0aGF0IGFyZSByZWFkeQogICAvLyBhbmQgY29udGFpbmVkIGluIHRoZSBmZF9zZXQgc3RydWN0dXJlcywgemVybyBpZiB0aGUgdGltZSBsaW1pdCBleHBpcmVkLAogICAvLyBvciBTT0NLRVRfRVJST1IgaWYgYW4gZXJyb3Igb2NjdXJyZWQuIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgU09DS0VUX0VSUk9SLApAQCAtMTI5Myw3NCArMTUzOCw5NSBAQAogCiAgIC8vIHJlY3YoKSByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVjZWl2ZWQsIG9yIC0xIGlmIGFuIGVycm9yIG9jY3VycmVkLgogICAvLyBUaGUgcmV0dXJuIHZhbHVlIHdpbGwgYmUgMCB3aGVuIHRoZSBwZWVyIGhhcyBwZXJmb3JtZWQgYW4gb3JkZXJseSBzaHV0ZG93bi4KLSAgcmV0dmFsIDo9IHJlY3YoIEZUY3BDbGllbnQuSGFuZGxlLCBwQnVmXiwgRGVzaXJlZEJ5dGVzLCBXaW5Tb2NrLk1TR19QRUVLKTsKKyAgCisgIHJldHZhbCA6PSByZWN2KCBGVGNwQ2xpZW50LkhhbmRsZSwgcEJ1Zl4sIERlc2lyZWRCeXRlcywgTVNHX1BFRUspOwogICBpZiByZXR2YWwgPD0gMAogICB0aGVuIEV4aXQoIFRXYWl0Rm9yRGF0YS53ZmRfRXJyb3IpOwogCi0gIC8vIEVub3VnaCBkYXRhIHJlYWR5IHRvIGJlIHJlYWQ/Ci0gIGlmIHJldHZhbCA9IERlc2lyZWRCeXRlcwotICB0aGVuIHJlc3VsdCA6PSBUV2FpdEZvckRhdGEud2ZkX0hhdmVEYXRhCi0gIGVsc2UgcmVzdWx0IDo9IFRXYWl0Rm9yRGF0YS53ZmRfVGltZW91dDsKKyAgLy8gYXQgbGVhc3Qgd2UgaGF2ZSBzb21lIGRhdGEKKyAgYnl0ZXNSZWFkeSA6PSBNaW4oIHJldHZhbCwgRGVzaXJlZEJ5dGVzKTsKKyAgcmVzdWx0IDo9IFRXYWl0Rm9yRGF0YS53ZmRfSGF2ZURhdGE7CiBlbmQ7Cit7JEVORElGfQogCi1mdW5jdGlvbiBUVGNwU29ja2V0U3RyZWFtSW1wbC5SZWFkKHZhciBidWZmZXI6IFRCeXRlczsgb2Zmc2V0LCBjb3VudDogSW50ZWdlcik6IEludGVnZXI7Cit7JElGREVGIE9MRF9TT0NLRVRTfQorZnVuY3Rpb24gVFRjcFNvY2tldFN0cmVhbUltcGwuUmVhZCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOworLy8gb2xkIHNvY2tldHMgdmVyc2lvbgogdmFyIHdmZCA6IFRXYWl0Rm9yRGF0YTsKLSAgICB3c2FFcnJvciA6IEludGVnZXI7Ci0gICAgcERlc3QgOiBQb2ludGVyOwotY29uc3QKLSAgU0xFRVBfVElNRSA9IDIwMDsKKyAgICB3c2FFcnJvciwKKyAgICBtc2VjcyA6IEludGVnZXI7CisgICAgbkJ5dGVzIDogSW50ZWdlcjsKKyAgICBwVG1wIDogUEJ5dGU7CiBiZWdpbgogICBpbmhlcml0ZWQ7CiAKLSAgcERlc3QgOj0gUG9pbnRlcihAYnVmZmVyW29mZnNldF0pOworICBpZiBGVGltZW91dCA+IDAKKyAgdGhlbiBtc2VjcyA6PSBGVGltZW91dAorICBlbHNlIG1zZWNzIDo9IERFRkFVTFRfVEhSSUZUX1RJTUVPVVQ7CiAKLSAgd2hpbGUgVFJVRSBkbyBiZWdpbgotICAgIGlmIEZUaW1lb3V0ID4gMAotICAgIHRoZW4gd2ZkIDo9IFdhaXRGb3JEYXRhKCBGVGltZW91dCwgICBwRGVzdCwgY291bnQsIHdzYUVycm9yKQotICAgIGVsc2Ugd2ZkIDo9IFdhaXRGb3JEYXRhKCBTTEVFUF9USU1FLCBwRGVzdCwgY291bnQsIHdzYUVycm9yKTsKKyAgcmVzdWx0IDo9IDA7CisgIHBUbXAgICA6PSBwQnVmOworICBJbmMoIHBUbXAsIG9mZnNldCk7CisgIHdoaWxlIGNvdW50ID4gMCBkbyBiZWdpbgogCi0gICAgY2FzZSB3ZmQgb2YKLSAgICAgIFRXYWl0Rm9yRGF0YS53ZmRfRXJyb3IgICAgOiAgRXhpdCgwKTsKLSAgICAgIFRXYWl0Rm9yRGF0YS53ZmRfSGF2ZURhdGEgOiAgQnJlYWs7Ci0gICAgICBUV2FpdEZvckRhdGEud2ZkX1RpbWVvdXQgIDogIGJlZ2luCi0gICAgICAgIGlmIChGVGltZW91dCA+IDApCi0gICAgICAgIHRoZW4gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbi5DcmVhdGUoIFRUcmFuc3BvcnRFeGNlcHRpb24uVEV4Y2VwdGlvblR5cGUuVGltZWRPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c0Vycm9yTWVzc2FnZShDYXJkaW5hbCh3c2FFcnJvcikpKTsKKyAgICB3aGlsZSBUUlVFIGRvIGJlZ2luCisgICAgICB3ZmQgOj0gV2FpdEZvckRhdGEoIG1zZWNzLCBwVG1wLCBjb3VudCwgd3NhRXJyb3IsIG5CeXRlcyk7CisgICAgICBjYXNlIHdmZCBvZgorICAgICAgICBUV2FpdEZvckRhdGEud2ZkX0Vycm9yICAgIDogIEV4aXQ7CisgICAgICAgIFRXYWl0Rm9yRGF0YS53ZmRfSGF2ZURhdGEgOiAgQnJlYWs7CisgICAgICAgIFRXYWl0Rm9yRGF0YS53ZmRfVGltZW91dCAgOiAgYmVnaW4KKyAgICAgICAgICBpZiAoRlRpbWVvdXQgPSAwKQorICAgICAgICAgIHRoZW4gRXhpdAorICAgICAgICAgIGVsc2UgYmVnaW4KKyAgICAgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25UaW1lZE91dC5DcmVhdGUoU3lzRXJyb3JNZXNzYWdlKENhcmRpbmFsKHdzYUVycm9yKSkpOworCisgICAgICAgICAgZW5kOworICAgICAgICBlbmQ7CisgICAgICBlbHNlCisgICAgICAgIEFTU0VSVCggRkFMU0UpOwogICAgICAgZW5kOwotICAgIGVsc2UKLSAgICAgIEFTU0VSVCggRkFMU0UpOwogICAgIGVuZDsKLSAgZW5kOwogCi0gIFJlc3VsdCA6PSBGVGNwQ2xpZW50LlJlY2VpdmVCdWYoIHBEZXN0XiwgY291bnQpOworICAgIC8vIHJlZHVjZSB0aGUgdGltZW91dCBvbmNlIHdlIGdvdCBkYXRhCisgICAgaWYgRlRpbWVvdXQgPiAwCisgICAgdGhlbiBtc2VjcyA6PSBGVGltZW91dCBkaXYgMTAKKyAgICBlbHNlIG1zZWNzIDo9IERFRkFVTFRfVEhSSUZUX1RJTUVPVVQgZGl2IDEwOworICAgIG1zZWNzIDo9IE1heCggbXNlY3MsIDIwMCk7CisKKyAgICBBU1NFUlQoIG5CeXRlcyA8PSBjb3VudCk7CisgICAgbkJ5dGVzIDo9IEZUY3BDbGllbnQuUmVjZWl2ZUJ1ZiggcFRtcF4sIG5CeXRlcyk7CisgICAgSW5jKCBwVG1wLCBuQnl0ZXMpOworICAgIERlYyggY291bnQsIG5CeXRlcyk7CisgICAgSW5jKCByZXN1bHQsIG5CeXRlcyk7CisgIGVuZDsKIGVuZDsKIAogZnVuY3Rpb24gVFRjcFNvY2tldFN0cmVhbUltcGwuVG9BcnJheTogVEJ5dGVzOwotdmFyCi0gIGxlbiA6IEludGVnZXI7CisvLyBvbGQgc29ja2V0cyB2ZXJzaW9uCit2YXIgbGVuIDogSW50ZWdlcjsKIGJlZ2luCiAgIGxlbiA6PSAwOwotICBpZiBJc09wZW4gdGhlbgotICBiZWdpbgorICBpZiBJc09wZW4gdGhlbiBiZWdpbgogICAgIGxlbiA6PSBGVGNwQ2xpZW50LkJ5dGVzUmVjZWl2ZWQ7CiAgIGVuZDsKIAogICBTZXRMZW5ndGgoIFJlc3VsdCwgbGVuICk7CiAKLSAgaWYgbGVuID4gMCB0aGVuCi0gIGJlZ2luCisgIGlmIGxlbiA+IDAgdGhlbiBiZWdpbgogICAgIEZUY3BDbGllbnQuUmVjZWl2ZUJ1ZiggUG9pbnRlcihAUmVzdWx0WzBdKV4sIGxlbik7CiAgIGVuZDsKIGVuZDsKIAotcHJvY2VkdXJlIFRUY3BTb2NrZXRTdHJlYW1JbXBsLldyaXRlKGNvbnN0IGJ1ZmZlcjogVEJ5dGVzOyBvZmZzZXQsIGNvdW50OiBJbnRlZ2VyKTsKK3Byb2NlZHVyZSBUVGNwU29ja2V0U3RyZWFtSW1wbC5Xcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZnNldCwgY291bnQ6IEludGVnZXIpOworLy8gb2xkIHNvY2tldHMgdmVyc2lvbgogdmFyIGJDYW5Xcml0ZSwgYkVycm9yIDogQm9vbGVhbjsKICAgICByZXR2YWwsIHdzYUVycm9yIDogSW50ZWdlcjsKKyAgICBwVG1wIDogUEJ5dGU7CiBiZWdpbgogICBpbmhlcml0ZWQ7CiAKICAgaWYgbm90IEZUY3BDbGllbnQuQWN0aXZlCi0gIHRoZW4gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbi5DcmVhdGUoIFRUcmFuc3BvcnRFeGNlcHRpb24uVEV4Y2VwdGlvblR5cGUuTm90T3Blbik7CisgIHRoZW4gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdub3Qgb3BlbicpOwogCiAgIC8vIFRoZSBzZWxlY3QgZnVuY3Rpb24gcmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIHNvY2tldCBoYW5kbGVzIHRoYXQgYXJlIHJlYWR5CiAgIC8vIGFuZCBjb250YWluZWQgaW4gdGhlIGZkX3NldCBzdHJ1Y3R1cmVzLCB6ZXJvIGlmIHRoZSB0aW1lIGxpbWl0IGV4cGlyZWQsCkBAIC0xMzY4LDE2ICsxNjM0LDc2IEBACiAgIC8vIFdTQUdldExhc3RFcnJvciBjYW4gYmUgdXNlZCB0byByZXRyaWV2ZSBhIHNwZWNpZmljIGVycm9yIGNvZGUuCiAgIHJldHZhbCA6PSBTZWxmLlNlbGVjdCggbmlsLCBAYkNhbldyaXRlLCBAYkVycm9yLCBGVGltZU91dCwgd3NhRXJyb3IpOwogICBpZiByZXR2YWwgPSBTT0NLRVRfRVJST1IKLSAgdGhlbiByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uLkNyZWF0ZSggVFRyYW5zcG9ydEV4Y2VwdGlvbi5URXhjZXB0aW9uVHlwZS5Vbmtub3duLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXNFcnJvck1lc3NhZ2UoQ2FyZGluYWwod3NhRXJyb3IpKSk7Ci0gIGlmIChyZXR2YWwgPSAwKQotICB0aGVuIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24uQ3JlYXRlKCBUVHJhbnNwb3J0RXhjZXB0aW9uLlRFeGNlcHRpb25UeXBlLlRpbWVkT3V0KTsKLSAgaWYgYkVycm9yIG9yIG5vdCBiQ2FuV3JpdGUKLSAgdGhlbiByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uLkNyZWF0ZSggVFRyYW5zcG9ydEV4Y2VwdGlvbi5URXhjZXB0aW9uVHlwZS5Vbmtub3duKTsKKyAgdGhlbiByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVW5rbm93bi5DcmVhdGUoU3lzRXJyb3JNZXNzYWdlKENhcmRpbmFsKHdzYUVycm9yKSkpOwogCi0gIEZUY3BDbGllbnQuU2VuZEJ1ZiggUG9pbnRlcihAYnVmZmVyW29mZnNldF0pXiwgY291bnQpOworICBpZiAocmV0dmFsID0gMCkKKyAgdGhlbiByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVGltZWRPdXQuQ3JlYXRlKCd0aW1lZCBvdXQnKTsKKworICBpZiBiRXJyb3Igb3Igbm90IGJDYW5Xcml0ZQorICB0aGVuIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Vbmtub3duLkNyZWF0ZSgndW5rbm93biBlcnJvcicpOworCisgIHBUbXAgOj0gcEJ1ZjsKKyAgSW5jKCBwVG1wLCBvZmZzZXQpOworICBGVGNwQ2xpZW50LlNlbmRCdWYoIHBUbXBeLCBjb3VudCk7CiBlbmQ7CiAKK3skRUxTRX0KKworZnVuY3Rpb24gVFRjcFNvY2tldFN0cmVhbUltcGwuUmVhZCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOworLy8gbmV3IHNvY2tldHMgdmVyc2lvbgordmFyIG5CeXRlcyA6IEludGVnZXI7CisgICAgcFRtcCA6IFBCeXRlOworYmVnaW4KKyAgaW5oZXJpdGVkOworCisgIHJlc3VsdCA6PSAwOworICBwVG1wICAgOj0gcEJ1ZjsKKyAgSW5jKCBwVG1wLCBvZmZzZXQpOworICB3aGlsZSBjb3VudCA+IDAgZG8gYmVnaW4KKyAgICBuQnl0ZXMgOj0gRlRjcENsaWVudC5SZWFkKCBwVG1wXiwgY291bnQpOworICAgIGlmIG5CeXRlcyA9IDAgdGhlbiBFeGl0OworICAgIEluYyggcFRtcCwgbkJ5dGVzKTsKKyAgICBEZWMoIGNvdW50LCBuQnl0ZXMpOworICAgIEluYyggcmVzdWx0LCBuQnl0ZXMpOworICBlbmQ7CitlbmQ7CisKK2Z1bmN0aW9uIFRUY3BTb2NrZXRTdHJlYW1JbXBsLlRvQXJyYXk6IFRCeXRlczsKKy8vIG5ldyBzb2NrZXRzIHZlcnNpb24KK3ZhciBsZW4gOiBJbnRlZ2VyOworYmVnaW4KKyAgbGVuIDo9IDA7CisgIHRyeQorICAgIGlmIEZUY3BDbGllbnQuUGVlayB0aGVuCisgICAgICByZXBlYXQKKyAgICAgICAgU2V0TGVuZ3RoKFJlc3VsdCwgTGVuZ3RoKFJlc3VsdCkgKyAxMDI0KTsKKyAgICAgICAgbGVuIDo9IEZUY3BDbGllbnQuUmVhZChSZXN1bHRbTGVuZ3RoKFJlc3VsdCkgLSAxMDI0XSwgMTAyNCk7CisgICAgICB1bnRpbCBsZW4gPCAxMDI0OworICBleGNlcHQKKyAgICBvbiBUVHJhbnNwb3J0RXhjZXB0aW9uIGRvIGJlZ2luIHsgZG9uJ3QgYWxsb3cgZGVmYXVsdCBleGNlcHRpb25zIH0gZW5kOworICAgIGVsc2UgcmFpc2U7CisgIGVuZDsKKyAgaWYgbGVuID4gMCB0aGVuCisgICAgU2V0TGVuZ3RoKFJlc3VsdCwgTGVuZ3RoKFJlc3VsdCkgLSAxMDI0ICsgbGVuKTsKK2VuZDsKKworcHJvY2VkdXJlIFRUY3BTb2NrZXRTdHJlYW1JbXBsLldyaXRlKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgb2Zmc2V0LCBjb3VudDogSW50ZWdlcik7CisvLyBuZXcgc29ja2V0cyB2ZXJzaW9uCit2YXIgcFRtcCA6IFBCeXRlOworYmVnaW4KKyAgaW5oZXJpdGVkOworCisgIGlmIG5vdCBGVGNwQ2xpZW50LklzT3BlbgorICB0aGVuIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnbm90IG9wZW4nKTsKKworICBwVG1wIDo9IHBCdWY7CisgIEluYyggcFRtcCwgb2Zmc2V0KTsKKyAgRlRjcENsaWVudC5Xcml0ZSggcFRtcF4sIGNvdW50KTsKK2VuZDsKKworeyRFTkRJRn0KKworCiB7JElGIENvbXBpbGVyVmVyc2lvbiA8IDIxLjB9CiBpbml0aWFsaXphdGlvbgogYmVnaW4KZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5VdGlscy5wYXMgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuVXRpbHMucGFzCmluZGV4IDU4ZmZlNzkuLjdlNTc4NjMgMTAwNjQ0Ci0tLSBhL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5VdGlscy5wYXMKKysrIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlV0aWxzLnBhcwpAQCAtMjEsOCArMjEsMTQgQEAKIAogaW50ZXJmYWNlCiAKK3skSSBUaHJpZnQuRGVmaW5lcy5pbmN9CisKIHVzZXMKLSAgQ2xhc3NlcywgV2luZG93cywgU3lzVXRpbHMsIFN5bmNPYmpzOworICB7JElGREVGIE9MRF9VTklUX05BTUVTfQorICBDbGFzc2VzLCBXaW5kb3dzLCBTeXNVdGlscywgQ2hhcmFjdGVyLCBTeW5jT2JqczsKKyAgeyRFTFNFfQorICBTeXN0ZW0uQ2xhc3NlcywgV2luYXBpLldpbmRvd3MsIFN5c3RlbS5TeXNVdGlscywgU3lzdGVtLkNoYXJhY3RlciwgU3lzdGVtLlN5bmNPYmpzOworICB7JEVORElGfQogCiB0eXBlCiAgIElPdmVybGFwcGVkSGVscGVyID0gaW50ZXJmYWNlCkBAIC00OSwyMSArNTUsMjcgQEAKICAgZW5kOwogCiAKKyAgQmFzZTY0VXRpbHMgPSBjbGFzcyBzZWFsZWQKKyAgcHVibGljCisgICAgY2xhc3MgZnVuY3Rpb24gRW5jb2RlKCBjb25zdCBzcmMgOiBUQnl0ZXM7IHNyY09mZiwgbGVuIDogSW50ZWdlcjsgZHN0IDogVEJ5dGVzOyBkc3RPZmYgOiBJbnRlZ2VyKSA6IEludGVnZXI7IHN0YXRpYzsKKyAgICBjbGFzcyBmdW5jdGlvbiBEZWNvZGUoIGNvbnN0IHNyYyA6IFRCeXRlczsgc3JjT2ZmLCBsZW4gOiBJbnRlZ2VyOyBkc3QgOiBUQnl0ZXM7IGRzdE9mZiA6IEludGVnZXIpIDogSW50ZWdlcjsgc3RhdGljOworICBlbmQ7CiAKLWZ1bmN0aW9uIElmVmFsdWUoQjogQm9vbGVhbjsgY29uc3QgVHJ1ZVZhbHVlLCBGYWxzZVZhbHVlOiBXaWRlU3RyaW5nKTogc3RyaW5nOworCisgIENoYXJVdGlscyA9IGNsYXNzIHNlYWxlZAorICBwdWJsaWMKKyAgICBjbGFzcyBmdW5jdGlvbiBJc0hpZ2hTdXJyb2dhdGUoIGNvbnN0IGMgOiBDaGFyKSA6IEJvb2xlYW47IHN0YXRpYzsgaW5saW5lOworICAgIGNsYXNzIGZ1bmN0aW9uIElzTG93U3Vycm9nYXRlKCBjb25zdCBjIDogQ2hhcikgOiBCb29sZWFuOyBzdGF0aWM7IGlubGluZTsKKyAgZW5kOworCisKK3skSUZERUYgV2luNjR9CitmdW5jdGlvbiBJbnRlcmxvY2tlZEV4Y2hhbmdlQWRkNjQoIHZhciBBZGRlbmQgOiBJbnQ2NDsgVmFsdWUgOiBJbnQ2NCkgOiBJbnQ2NDsgIAoreyRFTkRJRn0KKwogCiBpbXBsZW1lbnRhdGlvbgogCi0KLWZ1bmN0aW9uIElmVmFsdWUoQjogQm9vbGVhbjsgY29uc3QgVHJ1ZVZhbHVlLCBGYWxzZVZhbHVlOiBXaWRlU3RyaW5nKTogc3RyaW5nOwotYmVnaW4KLSAgaWYgQiB0aGVuCi0gICAgUmVzdWx0IDo9IFRydWVWYWx1ZQotICBlbHNlCi0gICAgUmVzdWx0IDo9IEZhbHNlVmFsdWU7Ci1lbmQ7Ci0KLQogeyBUT3ZlcmxhcHBlZEhlbHBlckltcGwgfQogCiBjb25zdHJ1Y3RvciBUT3ZlcmxhcHBlZEhlbHBlckltcGwuQ3JlYXRlOwpAQCAtMTEzLDYgKzEyNSwxMzUgQEAKIGVuZDsKIAogCit7IEJhc2U2NFV0aWxzIH0KKworY2xhc3MgZnVuY3Rpb24gQmFzZTY0VXRpbHMuRW5jb2RlKCBjb25zdCBzcmMgOiBUQnl0ZXM7IHNyY09mZiwgbGVuIDogSW50ZWdlcjsgZHN0IDogVEJ5dGVzOyBkc3RPZmYgOiBJbnRlZ2VyKSA6IEludGVnZXI7Citjb25zdCBFTkNPREVfVEFCTEUgOiBQQW5zaUNoYXIgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyc7CitiZWdpbgorICBBU1NFUlQoIGxlbiBpbiBbMS4uM10pOworICBkc3RbZHN0T2ZmXSA6PSBCeXRlKCBFTkNPREVfVEFCTEVbIChzcmNbc3JjT2ZmXSBzaHIgMikgYW5kICQzRl0pOworICBjYXNlIGxlbiBvZgorICAgIDMgOiBiZWdpbgorICAgICAgSW5jKGRzdE9mZik7CisgICAgICBkc3RbZHN0T2ZmXSA6PSBCeXRlKCBFTkNPREVfVEFCTEVbICgoc3JjW3NyY09mZl0gc2hsIDQpIGFuZCAkMzApIG9yICgoc3JjW3NyY09mZiArIDFdIHNociA0KSBhbmQgJDBGKV0pOworICAgICAgSW5jKGRzdE9mZik7CisgICAgICBkc3RbZHN0T2ZmXSA6PSBCeXRlKCBFTkNPREVfVEFCTEVbICgoc3JjW3NyY09mZiArIDFdIHNobCAyKSBhbmQgJDNDKSBvciAoKHNyY1tzcmNPZmYgKyAyXSBzaHIgNikgYW5kICQwMyldKTsKKyAgICAgIEluYyhkc3RPZmYpOworICAgICAgZHN0W2RzdE9mZl0gOj0gQnl0ZSggRU5DT0RFX1RBQkxFWyBzcmNbc3JjT2ZmICsgMl0gYW5kICQzRl0pOworICAgICAgcmVzdWx0IDo9IDQ7CisgICAgZW5kOworCisgICAgMiA6IGJlZ2luCisgICAgICBJbmMoZHN0T2ZmKTsKKyAgICAgIGRzdFtkc3RPZmZdIDo9IEJ5dGUoIEVOQ09ERV9UQUJMRVsgKChzcmNbc3JjT2ZmXSBzaGwgNCkgYW5kICQzMCkgb3IgKChzcmNbc3JjT2ZmICsgMV0gc2hyIDQpIGFuZCAkMEYpXSk7CisgICAgICBJbmMoZHN0T2ZmKTsKKyAgICAgIGRzdFtkc3RPZmZdIDo9IEJ5dGUoIEVOQ09ERV9UQUJMRVsgKHNyY1tzcmNPZmYgKyAxXSBzaGwgMikgYW5kICQzQ10pOworICAgICAgcmVzdWx0IDo9IDM7CisgICAgZW5kOworCisgICAgMSA6IGJlZ2luCisgICAgICBJbmMoZHN0T2ZmKTsKKyAgICAgIGRzdFtkc3RPZmZdIDo9IEJ5dGUoIEVOQ09ERV9UQUJMRVsgKHNyY1tzcmNPZmZdIHNobCA0KSBhbmQgJDMwXSk7CisgICAgICByZXN1bHQgOj0gMjsKKyAgICBlbmQ7CisKKyAgZWxzZQorICAgIEFTU0VSVCggRkFMU0UpOworICAgIHJlc3VsdCA6PSAwOyAgLy8gYmVjYXVzZSBpbnZhbGlkIGNhbGwKKyAgZW5kOworZW5kOworCisKK2NsYXNzIGZ1bmN0aW9uIEJhc2U2NFV0aWxzLkRlY29kZSggY29uc3Qgc3JjIDogVEJ5dGVzOyBzcmNPZmYsIGxlbiA6IEludGVnZXI7IGRzdCA6IFRCeXRlczsgZHN0T2ZmIDogSW50ZWdlcikgOiBJbnRlZ2VyOworY29uc3QgREVDT0RFX1RBQkxFIDogYXJyYXlbMC4uJEZGXSBvZiBJbnRlZ2VyCisgICAgICAgICAgICAgICAgICAgPSAoIC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorICAgICAgICAgICAgICAgICAgICAgICAtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsNjIsLTEsLTEsLTEsNjMsCisgICAgICAgICAgICAgICAgICAgICAgIDUyLDUzLDU0LDU1LDU2LDU3LDU4LDU5LDYwLDYxLC0xLC0xLC0xLC0xLC0xLC0xLAorICAgICAgICAgICAgICAgICAgICAgICAtMSwgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwxMCwxMSwxMiwxMywxNCwKKyAgICAgICAgICAgICAgICAgICAgICAgMTUsMTYsMTcsMTgsMTksMjAsMjEsMjIsMjMsMjQsMjUsLTEsLTEsLTEsLTEsLTEsCisgICAgICAgICAgICAgICAgICAgICAgIC0xLDI2LDI3LDI4LDI5LDMwLDMxLDMyLDMzLDM0LDM1LDM2LDM3LDM4LDM5LDQwLAorICAgICAgICAgICAgICAgICAgICAgICA0MSw0Miw0Myw0NCw0NSw0Niw0Nyw0OCw0OSw1MCw1MSwtMSwtMSwtMSwtMSwtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCisgICAgICAgICAgICAgICAgICAgICAgIC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorICAgICAgICAgICAgICAgICAgICAgICAtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCisgICAgICAgICAgICAgICAgICAgICAgIC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorICAgICAgICAgICAgICAgICAgICAgICAtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCisgICAgICAgICAgICAgICAgICAgICAgIC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xICApOworYmVnaW4KKyAgQVNTRVJUKCBsZW4gaW4gWzEuLjRdKTsKKyAgcmVzdWx0IDo9IDE7CisgIGRzdFtkc3RPZmZdIDo9ICgoREVDT0RFX1RBQkxFW3NyY1tzcmNPZmZdICAgICBhbmQgJDBGRl0gc2hsIDIpCisgICAgICAgICAgICAgIG9yICAoREVDT0RFX1RBQkxFW3NyY1tzcmNPZmYgKyAxXSBhbmQgJDBGRl0gc2hyIDQpKTsKKworICBpZiAobGVuID4gMikgdGhlbiBiZWdpbgorICAgIEluYyggcmVzdWx0KTsKKyAgICBJbmMoIGRzdE9mZik7CisgICAgZHN0W2RzdE9mZl0gOj0gKCgoREVDT0RFX1RBQkxFW3NyY1tzcmNPZmYgKyAxXSBhbmQgJDBGRl0gc2hsIDQpIGFuZCAkRjApCisgICAgICAgICAgICAgICAgb3IgICAoREVDT0RFX1RBQkxFW3NyY1tzcmNPZmYgKyAyXSBhbmQgJDBGRl0gc2hyIDIpKTsKKworICAgIGlmIChsZW4gPiAzKSB0aGVuIGJlZ2luCisgICAgICBJbmMoIHJlc3VsdCk7CisgICAgICBJbmMoIGRzdE9mZik7CisgICAgICBkc3RbZHN0T2ZmXSA6PSAoKChERUNPREVfVEFCTEVbc3JjW3NyY09mZiArIDJdIGFuZCAkMEZGXSBzaGwgNikgYW5kICRDMCkKKyAgICAgICAgICAgICAgICAgIG9yICAgIERFQ09ERV9UQUJMRVtzcmNbc3JjT2ZmICsgM10gYW5kICQwRkZdKTsKKyAgICBlbmQ7CisgIGVuZDsKK2VuZDsKKworCitjbGFzcyBmdW5jdGlvbiBDaGFyVXRpbHMuSXNIaWdoU3Vycm9nYXRlKCBjb25zdCBjIDogQ2hhcikgOiBCb29sZWFuOworYmVnaW4KKyAgeyRJRiBDb21waWxlclZlcnNpb24gPCAyNS4wfQorICAgIHskSUZERUYgT0xEX1VOSVRfTkFNRVN9CisgICAgcmVzdWx0IDo9IENoYXJhY3Rlci5Jc0hpZ2hTdXJyb2dhdGUoYyk7CisgICAgeyRFTFNFfQorICAgIHJlc3VsdCA6PSBTeXN0ZW0uQ2hhcmFjdGVyLklzSGlnaFN1cnJvZ2F0ZShjKTsKKyAgICB7JEVORElGfQorICB7JEVMU0V9CisgIHJlc3VsdCA6PSBjLklzSGlnaFN1cnJvZ2F0ZSgpOworICB7JElGRU5EfQorZW5kOworCisKK2NsYXNzIGZ1bmN0aW9uIENoYXJVdGlscy5Jc0xvd1N1cnJvZ2F0ZSggY29uc3QgYyA6IENoYXIpIDogQm9vbGVhbjsKK2JlZ2luCisgIHskSUYgQ29tcGlsZXJWZXJzaW9uIDwgMjUuMH0KKyAgICB7JElGREVGIE9MRF9VTklUX05BTUVTfQorICAgIHJlc3VsdCA6PSBDaGFyYWN0ZXIuSXNMb3dTdXJyb2dhdGUoYyk7CisgICAgeyRFTFNFfQorICAgIHJlc3VsdCA6PSBTeXN0ZW0uQ2hhcmFjdGVyLklzTG93U3Vycm9nYXRlKGMpOworICAgIHskRU5ESUZ9CisgIHskRUxTRX0KKyAgcmVzdWx0IDo9IGMuSXNMb3dTdXJyb2dhdGUoKTsKKyAgeyRJRkVORH0KK2VuZDsKKworCit7JElGREVGIFdpbjY0fQorCitmdW5jdGlvbiBJbnRlcmxvY2tlZENvbXBhcmVFeGNoYW5nZTY0KCB2YXIgVGFyZ2V0IDogSW50NjQ7IEV4Y2hhbmdlLCBDb21wYXJhbmQgOiBJbnQ2NCkgOiBJbnQ2NDsgIGlubGluZTsKK2JlZ2luCisgIHskSUZERUYgT0xEX1VOSVRfTkFNRVN9CisgIHJlc3VsdCA6PSBXaW5kb3dzLkludGVybG9ja2VkQ29tcGFyZUV4Y2hhbmdlNjQoIFRhcmdldCwgRXhjaGFuZ2UsIENvbXBhcmFuZCk7CisgIHskRUxTRX0KKyAgcmVzdWx0IDo9IFdpbkFwaS5XaW5kb3dzLkludGVybG9ja2VkQ29tcGFyZUV4Y2hhbmdlNjQoIFRhcmdldCwgRXhjaGFuZ2UsIENvbXBhcmFuZCk7CisgIHskRU5ESUZ9CitlbmQ7CisKKworZnVuY3Rpb24gSW50ZXJsb2NrZWRFeGNoYW5nZUFkZDY0KCB2YXIgQWRkZW5kIDogSW50NjQ7IFZhbHVlIDogSW50NjQpIDogSW50NjQ7Cit2YXIgb2xkIDogSW50NjQ7CitiZWdpbgorICByZXBlYXQKKyAgICBPbGQgOj0gQWRkZW5kOworICB1bnRpbCAoSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2U2NCggQWRkZW5kLCBPbGQgKyBWYWx1ZSwgT2xkKSA9IE9sZCk7CisgIHJlc3VsdCA6PSBPbGQ7CitlbmQ7CisKK3skRU5ESUZ9CiAKIAogZW5kLgpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LnBhcyBiL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5wYXMKaW5kZXggODFjNDk4OC4uNjI0ODFlNyAxMDA2NDQKLS0tIGEvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LnBhcworKysgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQucGFzCkBAIC0yMiwxMyArMjIsMTkgQEAKIGludGVyZmFjZQogCiB1c2VzCi0gIFN5c1V0aWxzLCBUaHJpZnQuUHJvdG9jb2w7CisgIFN5c1V0aWxzLAorICBUaHJpZnQuRXhjZXB0aW9uLAorICBUaHJpZnQuUHJvdG9jb2w7CiAKIGNvbnN0Ci0gIFZlcnNpb24gPSAnMC45LjInOworICBWZXJzaW9uID0gJzEuMC4wJzsKIAogdHlwZQotICBUQXBwbGljYXRpb25FeGNlcHRpb24gPSBjbGFzcyggU3lzVXRpbHMuRXhjZXB0aW9uICkKKyAgVEV4Y2VwdGlvbiA9IFRocmlmdC5FeGNlcHRpb24uVEV4Y2VwdGlvbjsgLy8gY29tcGF0aWJpbGl0eSBhbGlhcworCisgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvblNwZWNpYWxpemVkQ2xhc3MgPSBjbGFzcyBvZiBUQXBwbGljYXRpb25FeGNlcHRpb25TcGVjaWFsaXplZDsKKworICBUQXBwbGljYXRpb25FeGNlcHRpb24gPSBjbGFzcyggVEV4Y2VwdGlvbikKICAgcHVibGljCiAgICAgdHlwZQogeyRTQ09QRURFTlVNUyBPTn0KQEAgLTQ3LDY3ICs1MywxMTEgQEAKICAgICAgICk7CiB7JFNDT1BFREVOVU1TIE9GRn0KICAgcHJpdmF0ZQotICAgIEZUeXBlIDogVEV4Y2VwdGlvblR5cGU7CisgICAgZnVuY3Rpb24gR2V0VHlwZTogVEV4Y2VwdGlvblR5cGU7CisgIHByb3RlY3RlZAorICAgIGNvbnN0cnVjdG9yIEhpZGRlbkNyZWF0ZShjb25zdCBNc2c6IHN0cmluZyk7CiAgIHB1YmxpYwotICAgIGNvbnN0cnVjdG9yIENyZWF0ZTsgb3ZlcmxvYWQ7Ci0gICAgY29uc3RydWN0b3IgQ3JlYXRlKCBBVHlwZTogVEV4Y2VwdGlvblR5cGUpOyBvdmVybG9hZDsKLSAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIEFUeXBlOiBURXhjZXB0aW9uVHlwZTsgY29uc3QgbXNnOiBzdHJpbmcpOyBvdmVybG9hZDsKKyAgICAvLyBwdXJwb3NlZnVsbHkgaGlkZSBpbmhlcml0ZWQgY29uc3RydWN0b3IKKyAgICBjbGFzcyBmdW5jdGlvbiBDcmVhdGUoY29uc3QgTXNnOiBzdHJpbmcpOiBUQXBwbGljYXRpb25FeGNlcHRpb247IG92ZXJsb2FkOyBkZXByZWNhdGVkICdVc2Ugc3BlY2lhbGl6ZWQgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHR5cGVzIChvciByZWdlbmVyYXRlIGZyb20gSURMKSc7CisgICAgY2xhc3MgZnVuY3Rpb24gQ3JlYXRlOiBUQXBwbGljYXRpb25FeGNlcHRpb247IG92ZXJsb2FkOyBkZXByZWNhdGVkICdVc2Ugc3BlY2lhbGl6ZWQgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHR5cGVzIChvciByZWdlbmVyYXRlIGZyb20gSURMKSc7CisgICAgY2xhc3MgZnVuY3Rpb24gQ3JlYXRlKCBBVHlwZTogVEV4Y2VwdGlvblR5cGUpOiBUQXBwbGljYXRpb25FeGNlcHRpb247IG92ZXJsb2FkOyBkZXByZWNhdGVkICdVc2Ugc3BlY2lhbGl6ZWQgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHR5cGVzIChvciByZWdlbmVyYXRlIGZyb20gSURMKSc7CisgICAgY2xhc3MgZnVuY3Rpb24gQ3JlYXRlKCBBVHlwZTogVEV4Y2VwdGlvblR5cGU7IGNvbnN0IG1zZzogc3RyaW5nKTogVEFwcGxpY2F0aW9uRXhjZXB0aW9uOyBvdmVybG9hZDsgZGVwcmVjYXRlZCAnVXNlIHNwZWNpYWxpemVkIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB0eXBlcyAob3IgcmVnZW5lcmF0ZSBmcm9tIElETCknOworCisgICAgY2xhc3MgZnVuY3Rpb24gR2V0U3BlY2lhbGl6ZWRFeGNlcHRpb25UeXBlKEFUeXBlOiBURXhjZXB0aW9uVHlwZSk6IFRBcHBsaWNhdGlvbkV4Y2VwdGlvblNwZWNpYWxpemVkQ2xhc3M7CiAKICAgICBjbGFzcyBmdW5jdGlvbiBSZWFkKCBjb25zdCBpcHJvdDogSVByb3RvY29sKTogVEFwcGxpY2F0aW9uRXhjZXB0aW9uOwogICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3Qgb3Byb3Q6IElQcm90b2NvbCApOwogICBlbmQ7CiAKLSAgLy8gYmFzZSBjbGFzcyBmb3IgSURMLWdlbmVyYXRlZCBleGNlcHRpb25zCi0gIFRFeGNlcHRpb24gPSBjbGFzcyggU3lzVXRpbHMuRXhjZXB0aW9uKQorICAvLyBOZWVkZWQgdG8gcmVtb3ZlIGRlcHJlY2F0aW9uIHdhcm5pbmcKKyAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uU3BlY2lhbGl6ZWQgPSBjbGFzcyBhYnN0cmFjdCAoVEFwcGxpY2F0aW9uRXhjZXB0aW9uKQogICBwdWJsaWMKLSAgICBmdW5jdGlvbiBNZXNzYWdlIDogc3RyaW5nOyAgICAgICAgLy8gaGlkZSBpbmhlcml0ZWQgcHJvcGVydHk6IGFsbG93IHJlYWQsIGJ1dCBwcmV2ZW50IGFjY2lkZW50YWwgd3JpdGVzCi0gICAgcHJvY2VkdXJlIFVwZGF0ZU1lc3NhZ2VQcm9wZXJ0eTsgIC8vIHVwZGF0ZSBpbmhlcml0ZWQgbWVzc2FnZSBwcm9wZXJ0eSB3aXRoIHRvU3RyaW5nKCkKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoY29uc3QgTXNnOiBzdHJpbmcpOwogICBlbmQ7CiAKKyAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uVW5rbm93biA9IGNsYXNzIChUQXBwbGljYXRpb25FeGNlcHRpb25TcGVjaWFsaXplZCk7CisgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvblVua25vd25NZXRob2QgPSBjbGFzcyAoVEFwcGxpY2F0aW9uRXhjZXB0aW9uU3BlY2lhbGl6ZWQpOworICBUQXBwbGljYXRpb25FeGNlcHRpb25JbnZhbGlkTWVzc2FnZVR5cGUgPSBjbGFzcyAoVEFwcGxpY2F0aW9uRXhjZXB0aW9uU3BlY2lhbGl6ZWQpOworICBUQXBwbGljYXRpb25FeGNlcHRpb25Xcm9uZ01ldGhvZE5hbWUgPSBjbGFzcyAoVEFwcGxpY2F0aW9uRXhjZXB0aW9uU3BlY2lhbGl6ZWQpOworICBUQXBwbGljYXRpb25FeGNlcHRpb25CYWRTZXF1ZW5jZUlEID0gY2xhc3MgKFRBcHBsaWNhdGlvbkV4Y2VwdGlvblNwZWNpYWxpemVkKTsKKyAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uTWlzc2luZ1Jlc3VsdCA9IGNsYXNzIChUQXBwbGljYXRpb25FeGNlcHRpb25TcGVjaWFsaXplZCk7CisgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbkludGVybmFsRXJyb3IgPSBjbGFzcyAoVEFwcGxpY2F0aW9uRXhjZXB0aW9uU3BlY2lhbGl6ZWQpOworICBUQXBwbGljYXRpb25FeGNlcHRpb25Qcm90b2NvbEVycm9yID0gY2xhc3MgKFRBcHBsaWNhdGlvbkV4Y2VwdGlvblNwZWNpYWxpemVkKTsKKyAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uSW52YWxpZFRyYW5zZm9ybSA9IGNsYXNzIChUQXBwbGljYXRpb25FeGNlcHRpb25TcGVjaWFsaXplZCk7CisgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbkludmFsaWRQcm90b2NvbCA9IGNsYXNzIChUQXBwbGljYXRpb25FeGNlcHRpb25TcGVjaWFsaXplZCk7CisgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvblVuc3VwcG9ydGVkQ2xpZW50VHlwZSA9IGNsYXNzIChUQXBwbGljYXRpb25FeGNlcHRpb25TcGVjaWFsaXplZCk7CisKKwogaW1wbGVtZW50YXRpb24KIAoteyBURXhjZXB0aW9uIH0KLQotZnVuY3Rpb24gVEV4Y2VwdGlvbi5NZXNzYWdlOwotLy8gYWxsb3cgcmVhZCAoZXhjZXB0aW9uIHN1bW1hcnkpLCBidXQgcHJldmVudCBhY2NpZGVudGFsIHdyaXRlcwotLy8gcmVhZCB3aWxsIHJldHVybiB0aGUgZXhjZXB0aW9uIHN1bW1hcnkKLWJlZ2luCi0gIHJlc3VsdCA6PSBTZWxmLlRvU3RyaW5nOwotZW5kOwotCi1wcm9jZWR1cmUgVEV4Y2VwdGlvbi5VcGRhdGVNZXNzYWdlUHJvcGVydHk7Ci0vLyBVcGRhdGUgdGhlIGluaGVyaXRlZCBNZXNzYWdlIHByb3BlcnR5IHRvIGJldHRlciBjb25mb3JtIHRvIHN0YW5kYXJkIGJlaGF2aW91ci4KLS8vIE5pY2UgYmVuZWZpdDogVGhlIElERSBpcyBub3cgYWJsZSB0byBzaG93IHRoZSBleGNlcHRpb24gbWVzc2FnZSBhZ2Fpbi4KLWJlZ2luCi0gIGluaGVyaXRlZCBNZXNzYWdlIDo9IFNlbGYuVG9TdHJpbmc7ICAvLyBwcm9kdWNlcyBhIHN1bW1hcnkgdGV4dAotZW5kOwotCiB7IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB9CiAKLWNvbnN0cnVjdG9yIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5DcmVhdGU7CitmdW5jdGlvbiBUQXBwbGljYXRpb25FeGNlcHRpb24uR2V0VHlwZTogVEV4Y2VwdGlvblR5cGU7CiBiZWdpbgotICBpbmhlcml0ZWQgQ3JlYXRlKCAnJyApOworICBpZiBTZWxmIGlzIFRBcHBsaWNhdGlvbkV4Y2VwdGlvblVua25vd25NZXRob2QgdGhlbiBSZXN1bHQgOj0gVEV4Y2VwdGlvblR5cGUuVW5rbm93bk1ldGhvZAorICBlbHNlIGlmIFNlbGYgaXMgVEFwcGxpY2F0aW9uRXhjZXB0aW9uSW52YWxpZE1lc3NhZ2VUeXBlIHRoZW4gUmVzdWx0IDo9IFRFeGNlcHRpb25UeXBlLkludmFsaWRNZXNzYWdlVHlwZQorICBlbHNlIGlmIFNlbGYgaXMgVEFwcGxpY2F0aW9uRXhjZXB0aW9uV3JvbmdNZXRob2ROYW1lIHRoZW4gUmVzdWx0IDo9IFRFeGNlcHRpb25UeXBlLldyb25nTWV0aG9kTmFtZQorICBlbHNlIGlmIFNlbGYgaXMgVEFwcGxpY2F0aW9uRXhjZXB0aW9uQmFkU2VxdWVuY2VJRCB0aGVuIFJlc3VsdCA6PSBURXhjZXB0aW9uVHlwZS5CYWRTZXF1ZW5jZUlECisgIGVsc2UgaWYgU2VsZiBpcyBUQXBwbGljYXRpb25FeGNlcHRpb25NaXNzaW5nUmVzdWx0IHRoZW4gUmVzdWx0IDo9IFRFeGNlcHRpb25UeXBlLk1pc3NpbmdSZXN1bHQKKyAgZWxzZSBpZiBTZWxmIGlzIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbkludGVybmFsRXJyb3IgdGhlbiBSZXN1bHQgOj0gVEV4Y2VwdGlvblR5cGUuSW50ZXJuYWxFcnJvcgorICBlbHNlIGlmIFNlbGYgaXMgVEFwcGxpY2F0aW9uRXhjZXB0aW9uUHJvdG9jb2xFcnJvciB0aGVuIFJlc3VsdCA6PSBURXhjZXB0aW9uVHlwZS5Qcm90b2NvbEVycm9yCisgIGVsc2UgaWYgU2VsZiBpcyBUQXBwbGljYXRpb25FeGNlcHRpb25JbnZhbGlkVHJhbnNmb3JtIHRoZW4gUmVzdWx0IDo9IFRFeGNlcHRpb25UeXBlLkludmFsaWRUcmFuc2Zvcm0KKyAgZWxzZSBpZiBTZWxmIGlzIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbkludmFsaWRQcm90b2NvbCB0aGVuIFJlc3VsdCA6PSBURXhjZXB0aW9uVHlwZS5JbnZhbGlkUHJvdG9jb2wKKyAgZWxzZSBpZiBTZWxmIGlzIFRBcHBsaWNhdGlvbkV4Y2VwdGlvblVuc3VwcG9ydGVkQ2xpZW50VHlwZSB0aGVuIFJlc3VsdCA6PSBURXhjZXB0aW9uVHlwZS5VbnN1cHBvcnRlZENsaWVudFR5cGUKKyAgZWxzZSBSZXN1bHQgOj0gVEV4Y2VwdGlvblR5cGUuVW5rbm93bjsKIGVuZDsKIAotY29uc3RydWN0b3IgVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkNyZWF0ZShBVHlwZTogVEV4Y2VwdGlvblR5cGU7Ci0gIGNvbnN0IG1zZzogc3RyaW5nKTsKK2NvbnN0cnVjdG9yIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5IaWRkZW5DcmVhdGUoY29uc3QgTXNnOiBzdHJpbmcpOwogYmVnaW4KLSAgaW5oZXJpdGVkIENyZWF0ZSggbXNnICk7Ci0gIEZUeXBlIDo9IEFUeXBlOworICBpbmhlcml0ZWQgQ3JlYXRlKE1zZyk7CiBlbmQ7CiAKLWNvbnN0cnVjdG9yIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5DcmVhdGUoQVR5cGU6IFRFeGNlcHRpb25UeXBlKTsKK2NsYXNzIGZ1bmN0aW9uIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5DcmVhdGUoY29uc3QgTXNnOiBzdHJpbmcpOiBUQXBwbGljYXRpb25FeGNlcHRpb247CiBiZWdpbgotICBpbmhlcml0ZWQgQ3JlYXRlKCcnKTsKLSAgRlR5cGUgOj0gQVR5cGU7CisgIFJlc3VsdCA6PSBUQXBwbGljYXRpb25FeGNlcHRpb25Vbmtub3duLkNyZWF0ZShNc2cpOworZW5kOworCitjbGFzcyBmdW5jdGlvbiBUQXBwbGljYXRpb25FeGNlcHRpb24uQ3JlYXRlOiBUQXBwbGljYXRpb25FeGNlcHRpb247CitiZWdpbgorICBSZXN1bHQgOj0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uVW5rbm93bi5DcmVhdGUoJycpOworZW5kOworCitjbGFzcyBmdW5jdGlvbiBUQXBwbGljYXRpb25FeGNlcHRpb24uQ3JlYXRlKCBBVHlwZTogVEV4Y2VwdGlvblR5cGUpOiBUQXBwbGljYXRpb25FeGNlcHRpb247CitiZWdpbgoreyRXQVJOIFNZTUJPTF9ERVBSRUNBVEVEIE9GRn0KKyAgUmVzdWx0IDo9IENyZWF0ZShBVHlwZSwgJycpOworeyRXQVJOIFNZTUJPTF9ERVBSRUNBVEVEIERFRkFVTFR9CitlbmQ7CisKK2NsYXNzIGZ1bmN0aW9uIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5DcmVhdGUoIEFUeXBlOiBURXhjZXB0aW9uVHlwZTsgY29uc3QgbXNnOiBzdHJpbmcpOiBUQXBwbGljYXRpb25FeGNlcHRpb247CitiZWdpbgorICBSZXN1bHQgOj0gR2V0U3BlY2lhbGl6ZWRFeGNlcHRpb25UeXBlKEFUeXBlKS5DcmVhdGUobXNnKTsKK2VuZDsKKworY2xhc3MgZnVuY3Rpb24gVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkdldFNwZWNpYWxpemVkRXhjZXB0aW9uVHlwZShBVHlwZTogVEV4Y2VwdGlvblR5cGUpOiBUQXBwbGljYXRpb25FeGNlcHRpb25TcGVjaWFsaXplZENsYXNzOworYmVnaW4KKyAgY2FzZSBBVHlwZSBvZgorICAgIFRFeGNlcHRpb25UeXBlLlVua25vd25NZXRob2Q6ICAgICAgICAgUmVzdWx0IDo9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvblVua25vd25NZXRob2Q7CisgICAgVEV4Y2VwdGlvblR5cGUuSW52YWxpZE1lc3NhZ2VUeXBlOiAgICBSZXN1bHQgOj0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uSW52YWxpZE1lc3NhZ2VUeXBlOworICAgIFRFeGNlcHRpb25UeXBlLldyb25nTWV0aG9kTmFtZTogICAgICAgUmVzdWx0IDo9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbldyb25nTWV0aG9kTmFtZTsKKyAgICBURXhjZXB0aW9uVHlwZS5CYWRTZXF1ZW5jZUlEOiAgICAgICAgIFJlc3VsdCA6PSBUQXBwbGljYXRpb25FeGNlcHRpb25CYWRTZXF1ZW5jZUlEOworICAgIFRFeGNlcHRpb25UeXBlLk1pc3NpbmdSZXN1bHQ6ICAgICAgICAgUmVzdWx0IDo9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbk1pc3NpbmdSZXN1bHQ7CisgICAgVEV4Y2VwdGlvblR5cGUuSW50ZXJuYWxFcnJvcjogICAgICAgICBSZXN1bHQgOj0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uSW50ZXJuYWxFcnJvcjsKKyAgICBURXhjZXB0aW9uVHlwZS5Qcm90b2NvbEVycm9yOiAgICAgICAgIFJlc3VsdCA6PSBUQXBwbGljYXRpb25FeGNlcHRpb25Qcm90b2NvbEVycm9yOworICAgIFRFeGNlcHRpb25UeXBlLkludmFsaWRUcmFuc2Zvcm06ICAgICAgUmVzdWx0IDo9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbkludmFsaWRUcmFuc2Zvcm07CisgICAgVEV4Y2VwdGlvblR5cGUuSW52YWxpZFByb3RvY29sOiAgICAgICBSZXN1bHQgOj0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uSW52YWxpZFByb3RvY29sOworICAgIFRFeGNlcHRpb25UeXBlLlVuc3VwcG9ydGVkQ2xpZW50VHlwZTogUmVzdWx0IDo9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvblVuc3VwcG9ydGVkQ2xpZW50VHlwZTsKKyAgZWxzZQorICAgIFJlc3VsdCA6PSBUQXBwbGljYXRpb25FeGNlcHRpb25Vbmtub3duOworICBlbmQ7CiBlbmQ7CiAKIGNsYXNzIGZ1bmN0aW9uIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5SZWFkKCBjb25zdCBpcHJvdDogSVByb3RvY29sKTogVEFwcGxpY2F0aW9uRXhjZXB0aW9uOwogdmFyCi0gIGZpZWxkIDogSUZpZWxkOworICBmaWVsZCA6IFRUaHJpZnRGaWVsZDsKICAgbXNnIDogc3RyaW5nOwogICB0eXAgOiBURXhjZXB0aW9uVHlwZTsKLSAgc3RydWMgOiBJU3RydWN0OworICBzdHJ1YyA6IFRUaHJpZnRTdHJ1Y3Q7CiBiZWdpbgogICBtc2cgOj0gJyc7CiAgIHR5cCA6PSBURXhjZXB0aW9uVHlwZS5Vbmtub3duOwpAQCAtMTQ3LDE3ICsxOTcsMTYgQEAKICAgICBpcHJvdC5SZWFkRmllbGRFbmQ7CiAgIGVuZDsKICAgaXByb3QuUmVhZFN0cnVjdEVuZDsKLSAgUmVzdWx0IDo9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5DcmVhdGUoIHR5cCwgbXNnICk7CisgIFJlc3VsdCA6PSBHZXRTcGVjaWFsaXplZEV4Y2VwdGlvblR5cGUodHlwKS5DcmVhdGUobXNnKTsKIGVuZDsKIAogcHJvY2VkdXJlIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5Xcml0ZSggY29uc3Qgb3Byb3Q6IElQcm90b2NvbCk7CiB2YXIKLSAgc3RydWMgOiBJU3RydWN0OwotICBmaWVsZCA6IElGaWVsZDsKLQorICBzdHJ1YyA6IFRUaHJpZnRTdHJ1Y3Q7CisgIGZpZWxkIDogVFRocmlmdEZpZWxkOwogYmVnaW4KLSAgc3RydWMgOj0gVFN0cnVjdEltcGwuQ3JlYXRlKCAnVEFwcGxpY2F0aW9uRXhjZXB0aW9uJyApOwotICBmaWVsZCA6PSBURmllbGRJbXBsLkNyZWF0ZTsKKyAgSW5pdChzdHJ1YywgJ1RBcHBsaWNhdGlvbkV4Y2VwdGlvbicpOworICBJbml0KGZpZWxkKTsKIAogICBvcHJvdC5Xcml0ZVN0cnVjdEJlZ2luKCBzdHJ1YyApOwogICBpZiBNZXNzYWdlIDw+ICcnIHRoZW4KQEAgLTE3NCwxMCArMjIzLDE3IEBACiAgIGZpZWxkLlR5cGVfIDo9IFRUeXBlLkkzMjsKICAgZmllbGQuSWQgOj0gMjsKICAgb3Byb3QuV3JpdGVGaWVsZEJlZ2luKGZpZWxkKTsKLSAgb3Byb3QuV3JpdGVJMzIoSW50ZWdlcihGVHlwZSkpOworICBvcHJvdC5Xcml0ZUkzMihJbnRlZ2VyKEdldFR5cGUpKTsKICAgb3Byb3QuV3JpdGVGaWVsZEVuZCgpOwogICBvcHJvdC5Xcml0ZUZpZWxkU3RvcCgpOwogICBvcHJvdC5Xcml0ZVN0cnVjdEVuZCgpOwogZW5kOwogCit7IFRBcHBsaWNhdGlvbkV4Y2VwdGlvblNwZWNpYWxpemVkIH0KKworY29uc3RydWN0b3IgVEFwcGxpY2F0aW9uRXhjZXB0aW9uU3BlY2lhbGl6ZWQuQ3JlYXRlKGNvbnN0IE1zZzogc3RyaW5nKTsKK2JlZ2luCisgIGluaGVyaXRlZCBIaWRkZW5DcmVhdGUoTXNnKTsKK2VuZDsKKwogZW5kLgpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS90ZXN0L0NvbnNvbGVIZWxwZXIucGFzIGIvbGliL2RlbHBoaS90ZXN0L0NvbnNvbGVIZWxwZXIucGFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhOGRkY2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGVscGhpL3Rlc3QvQ29uc29sZUhlbHBlci5wYXMKQEAgLTAsMCArMSwxMzIgQEAKKygqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKikKKwordW5pdCBDb25zb2xlSGVscGVyOworCitpbnRlcmZhY2UKKwordXNlcyBDbGFzc2VzOworCit0eXBlCisgIFRUaHJpZnRDb25zb2xlID0gY2xhc3MKKyAgcHVibGljCisgICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBTOiBzdHJpbmcpOyB2aXJ0dWFsOworICAgIHByb2NlZHVyZSBXcml0ZUxpbmUoIGNvbnN0IFM6IHN0cmluZyk7IHZpcnR1YWw7CisgIGVuZDsKKworICBUR1VJQ29uc29sZSA9IGNsYXNzKCBUVGhyaWZ0Q29uc29sZSApCisgIHByaXZhdGUKKyAgICBGTGluZUJyZWFrIDogQm9vbGVhbjsKKyAgICBGTWVtbyA6IFRTdHJpbmdzOworCisgICAgcHJvY2VkdXJlIEludGVybmFsV3JpdGUoIGNvbnN0IFM6IHN0cmluZzsgYldyaXRlTGluZTogQm9vbGVhbik7CisgIHB1YmxpYworICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgUzogc3RyaW5nKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlTGluZSggY29uc3QgUzogc3RyaW5nKTsgb3ZlcnJpZGU7CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBBTWVtbzogVFN0cmluZ3MpOworICBlbmQ7CisKK2Z1bmN0aW9uIENvbnNvbGU6IFRUaHJpZnRDb25zb2xlOworcHJvY2VkdXJlIENoYW5nZUNvbnNvbGUoIEFDb25zb2xlOiBUVGhyaWZ0Q29uc29sZSApOworcHJvY2VkdXJlIFJlc3RvcmVDb25zb2xlVG9EZWZhdWx0OworCitpbXBsZW1lbnRhdGlvbgorCit2YXIKKyAgRkRlZmF1bHRDb25zb2xlIDogVFRocmlmdENvbnNvbGU7CisgIEZDb25zb2xlIDogVFRocmlmdENvbnNvbGU7CisKK2Z1bmN0aW9uIENvbnNvbGU6IFRUaHJpZnRDb25zb2xlOworYmVnaW4KKyAgUmVzdWx0IDo9IEZDb25zb2xlOworZW5kOworCit7IFRUaHJpZnRDb25zb2xlIH0KKworcHJvY2VkdXJlIFRUaHJpZnRDb25zb2xlLldyaXRlKGNvbnN0IFM6IHN0cmluZyk7CitiZWdpbgorICBTeXN0ZW0uV3JpdGUoIFMgKTsKK2VuZDsKKworcHJvY2VkdXJlIFRUaHJpZnRDb25zb2xlLldyaXRlTGluZShjb25zdCBTOiBzdHJpbmcpOworYmVnaW4KKyAgU3lzdGVtLldyaXRlbG4oIFMgKTsKK2VuZDsKKworcHJvY2VkdXJlIENoYW5nZUNvbnNvbGUoIEFDb25zb2xlOiBUVGhyaWZ0Q29uc29sZSApOworYmVnaW4KKyAgRkNvbnNvbGUgOj0gQUNvbnNvbGU7CitlbmQ7CisKK3Byb2NlZHVyZSBSZXN0b3JlQ29uc29sZVRvRGVmYXVsdDsKK2JlZ2luCisgIEZDb25zb2xlIDo9IEZEZWZhdWx0Q29uc29sZTsKK2VuZDsKKworeyBUR1VJQ29uc29sZSB9CisKK2NvbnN0cnVjdG9yIFRHVUlDb25zb2xlLkNyZWF0ZSggQU1lbW86IFRTdHJpbmdzKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7CisgIEZNZW1vIDo9IEFNZW1vOworICBGTGluZUJyZWFrIDo9IFRydWU7CitlbmQ7CisKK3Byb2NlZHVyZSBUR1VJQ29uc29sZS5JbnRlcm5hbFdyaXRlKGNvbnN0IFM6IHN0cmluZzsgYldyaXRlTGluZTogQm9vbGVhbik7Cit2YXIKKyAgaWR4IDogSW50ZWdlcjsKK2JlZ2luCisgIGlmIEZMaW5lQnJlYWsgdGhlbgorICBiZWdpbgorICAgIEZNZW1vLkFkZCggUyApOworICBlbmQgZWxzZQorICBiZWdpbgorICAgIGlkeCA6PSBGTWVtby5Db3VudCAtIDE7CisgICAgaWYgaWR4IDwgMCB0aGVuCisgICAgICBGTWVtby5BZGQoIFMgKQorICAgIGVsc2UKKyAgICAgIEZNZW1vW2lkeF0gOj0gRk1lbW9baWR4XSArIFM7CisgIGVuZDsKKyAgRkxpbmVCcmVhayA6PSBiV3JpdGVMaW5lOworZW5kOworCitwcm9jZWR1cmUgVEdVSUNvbnNvbGUuV3JpdGUoY29uc3QgUzogc3RyaW5nKTsKK2JlZ2luCisgIEludGVybmFsV3JpdGUoIFMsIEZhbHNlKTsKK2VuZDsKKworcHJvY2VkdXJlIFRHVUlDb25zb2xlLldyaXRlTGluZShjb25zdCBTOiBzdHJpbmcpOworYmVnaW4KKyAgSW50ZXJuYWxXcml0ZSggUywgVHJ1ZSk7CitlbmQ7CisKK2luaXRpYWxpemF0aW9uCitiZWdpbgorICBGRGVmYXVsdENvbnNvbGUgOj0gVFRocmlmdENvbnNvbGUuQ3JlYXRlOworICBGQ29uc29sZSA6PSBGRGVmYXVsdENvbnNvbGU7CitlbmQ7CisKK2ZpbmFsaXphdGlvbgorYmVnaW4KKyAgRkRlZmF1bHRDb25zb2xlLkZyZWU7CitlbmQ7CisKK2VuZC4KKworCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3Rlc3QvVGVzdENsaWVudC5wYXMgYi9saWIvZGVscGhpL3Rlc3QvVGVzdENsaWVudC5wYXMKaW5kZXggZGMzOTgyOC4uMGZhNDNiMCAxMDA2NDQKLS0tIGEvbGliL2RlbHBoaS90ZXN0L1Rlc3RDbGllbnQucGFzCisrKyBiL2xpYi9kZWxwaGkvdGVzdC9UZXN0Q2xpZW50LnBhcwpAQCAtMTksMjUgKzE5LDM1IEBACiAKIHVuaXQgVGVzdENsaWVudDsKIAoreyRJIC4uL3NyYy9UaHJpZnQuRGVmaW5lcy5pbmN9CisKIHsuJERFRklORSBTdHJlc3NUZXN0fSAgIC8vIGFjdGl2YXRlIHRvIHN0cmVzcy10ZXN0IHRoZSBzZXJ2ZXIgd2l0aCBmcmVxdWVudCBjb25uZWN0cy9kaXNjb25uZWN0cwotey4kREVGSU5FIFBlcmZUZXN0fSAgICAgLy8gYWN0aXZhdGUgdG8gYWN0aXZhdGUgdGhlIHBlcmZvcm1hbmNlIHRlc3QKK3suJERFRklORSBQZXJmVGVzdH0gICAgIC8vIGFjdGl2YXRlIHRoZSBwZXJmb3JtYW5jZSB0ZXN0Cit7JERFRklORSBFeGNlcHRpb25zfSAgICAvLyBhY3RpdmF0ZSB0aGUgZXhjZXB0aW9ucyB0ZXN0IChvciBkaXNhYmxlIHdoaWxlIGRlYnVnZ2luZykKKworeyRpZiBDb21waWxlclZlcnNpb24gPj0gMjh9Cit7JERFRklORSBTdXBwb3J0c0FzeW5jfQoreyRpZmVuZH0KIAogaW50ZXJmYWNlCiAKIHVzZXMKLSAgV2luZG93cywgU3lzVXRpbHMsIENsYXNzZXMsCisgIFdpbmRvd3MsIFN5c1V0aWxzLCBDbGFzc2VzLCBNYXRoLCBDb21PYmosIEFjdGl2ZVgsCisgIHskSUZERUYgU3VwcG9ydHNBc3luY30gU3lzdGVtLlRocmVhZGluZywgeyRFTkRJRn0KICAgRGF0ZVV0aWxzLAogICBHZW5lcmljcy5Db2xsZWN0aW9ucywKICAgVGVzdENvbnN0YW50cywKKyAgQ29uc29sZUhlbHBlciwKICAgVGhyaWZ0LAorICBUaHJpZnQuUHJvdG9jb2wuQ29tcGFjdCwKICAgVGhyaWZ0LlByb3RvY29sLkpTT04sCiAgIFRocmlmdC5Qcm90b2NvbCwKICAgVGhyaWZ0LlRyYW5zcG9ydC5QaXBlcywKICAgVGhyaWZ0LlRyYW5zcG9ydCwKICAgVGhyaWZ0LlN0cmVhbSwKICAgVGhyaWZ0LlRlc3QsCi0gIFRocmlmdC5Db2xsZWN0aW9ucywKLSAgVGhyaWZ0LkNvbnNvbGU7CisgIFRocmlmdC5VdGlscywKKyAgVGhyaWZ0LkNvbGxlY3Rpb25zOwogCiB0eXBlCiAgIFRUaHJlYWRDb25zb2xlID0gY2xhc3MKQEAgLTQ5LDYgKzU5LDE3IEBACiAgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBBVGhyZWFkOiBUVGhyZWFkKTsKICAgZW5kOwogCisgIFRUZXN0U2V0dXAgPSByZWNvcmQKKyAgICBwcm90VHlwZSAgOiBUS25vd25Qcm90b2NvbDsKKyAgICBlbmRwb2ludCAgOiBURW5kcG9pbnRUcmFuc3BvcnQ7CisgICAgbGF5ZXJlZCAgIDogVExheWVyZWRUcmFuc3BvcnRzOworICAgIHVzZVNTTCAgICA6IEJvb2xlYW47IC8vIGluY2x1ZGUgd2hlcmUgYXBwcm9wcmlhdGUgKFRMYXllcmVkVHJhbnNwb3J0PykKKyAgICBob3N0ICAgICAgOiBzdHJpbmc7CisgICAgcG9ydCAgICAgIDogSW50ZWdlcjsKKyAgICBzUGlwZU5hbWUgOiBzdHJpbmc7CisgICAgaEFub25SZWFkLCBoQW5vbldyaXRlIDogVEhhbmRsZTsKKyAgZW5kOworCiAgIFRDbGllbnRUaHJlYWQgPSBjbGFzcyggVFRocmVhZCApCiAgIHByaXZhdGUgdHlwZQogICAgIFRUZXN0R3JvdXAgPSAoCkBAIC02MSw3ICs4MiwxNSBAQAogICAgICk7CiAgICAgVFRlc3RHcm91cHMgPSBzZXQgb2YgVFRlc3RHcm91cDsKIAorICAgIFRUZXN0U2l6ZSA9ICgKKyAgICAgIEVtcHR5LCAgICAgICAgICAgLy8gRWRnZSBjYXNlOiB0aGUgemVyby1sZW5ndGggZW1wdHkgYmluYXJ5CisgICAgICBOb3JtYWwsICAgICAgICAgIC8vIEZhaXJseSBzbWFsbCBhcnJheSBvZiB1c3VhbCBzaXplICgyNTYgYnl0ZXMpCisgICAgICBCeXRlQXJyYXlUZXN0LCAgIC8vIFRIUklGVC00NDU0IExhcmdlIHdyaXRlcy9yZWFkcyBtYXkgY2F1c2UgcmFuZ2UgY2hlY2sgZXJyb3JzIGluIGRlYnVnIG1vZGUKKyAgICAgIFBpcGVXcml0ZUxpbWl0ICAgLy8gVEhSSUZULTQzNzIgUGlwZSB3cml0ZSBvcGVyYXRpb25zIGFjcm9zcyBhIG5ldHdvcmsgYXJlIGxpbWl0ZWQgdG8gNjUsNTM1IGJ5dGVzIHBlciB3cml0ZS4KKyAgICApOworCiAgIHByaXZhdGUKKyAgICBGU2V0dXAgOiBUVGVzdFNldHVwOwogICAgIEZUcmFuc3BvcnQgOiBJVHJhbnNwb3J0OwogICAgIEZQcm90b2NvbCA6IElQcm90b2NvbDsKICAgICBGTnVtSXRlcmF0aW9uIDogSW50ZWdlcjsKQEAgLTc3LDE3ICsxMDYsMjggQEAKICAgICBwcm9jZWR1cmUgU3RhcnRUZXN0R3JvdXAoIGNvbnN0IGFHcm91cCA6IHN0cmluZzsgY29uc3QgYVRlc3QgOiBUVGVzdEdyb3VwKTsKICAgICBwcm9jZWR1cmUgRXhwZWN0KCBhVGVzdFJlc3VsdCA6IEJvb2xlYW47IGNvbnN0IGFUZXN0SW5mbyA6IHN0cmluZyk7CiAgICAgcHJvY2VkdXJlIFJlcG9ydFJlc3VsdHM7Ci0gICAgZnVuY3Rpb24gQ2FsY3VsYXRlRXhpdENvZGUgOiBCeXRlOworICAgIGZ1bmN0aW9uICBDYWxjdWxhdGVFeGl0Q29kZSA6IEJ5dGU7CiAKICAgICBwcm9jZWR1cmUgQ2xpZW50VGVzdDsKKyAgICB7JElGREVGIFN1cHBvcnRzQXN5bmN9CisgICAgcHJvY2VkdXJlIENsaWVudEFzeW5jVGVzdDsKKyAgICB7JEVORElGfQorCisgICAgcHJvY2VkdXJlIEluaXRpYWxpemVQcm90b2NvbFRyYW5zcG9ydFN0YWNrOworICAgIHByb2NlZHVyZSBTaHV0ZG93blByb3RvY29sVHJhbnNwb3J0U3RhY2s7CisKICAgICBwcm9jZWR1cmUgSlNPTlByb3RvY29sUmVhZFdyaXRlVGVzdDsKKyAgICBmdW5jdGlvbiAgUHJlcGFyZUJpbmFyeURhdGEoIGFSYW5kb21EaXN0IDogQm9vbGVhbjsgYVNpemUgOiBUVGVzdFNpemUpIDogVEJ5dGVzOwogICAgIHskSUZERUYgU3RyZXNzVGVzdH0KICAgICBwcm9jZWR1cmUgU3RyZXNzVGVzdChjb25zdCBjbGllbnQgOiBUVGhyaWZ0VGVzdC5JZmFjZSk7CiAgICAgeyRFTkRJRn0KKyAgICB7JElGREVGIFdpbjY0fQorICAgIHByb2NlZHVyZSBVc2VJbnRlcmxvY2tlZEV4Y2hhbmdlQWRkNjQ7CisgICAgeyRFTkRJRn0KICAgcHJvdGVjdGVkCiAgICAgcHJvY2VkdXJlIEV4ZWN1dGU7IG92ZXJyaWRlOwogICBwdWJsaWMKLSAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IEFUcmFuc3BvcnQ6IElUcmFuc3BvcnQ7IGNvbnN0IEFQcm90b2NvbCA6IElQcm90b2NvbDsgQU51bUl0ZXJhdGlvbjogSW50ZWdlcik7CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBhU2V0dXAgOiBUVGVzdFNldHVwOyBjb25zdCBhTnVtSXRlcmF0aW9uOiBJbnRlZ2VyKTsKICAgICBkZXN0cnVjdG9yIERlc3Ryb3k7IG92ZXJyaWRlOwogICBlbmQ7CiAKQEAgLTE2OCwzOCArMjA4LDI3IEBACiBjbGFzcyBmdW5jdGlvbiBUVGVzdENsaWVudC5FeGVjdXRlKGNvbnN0IGFyZ3M6IGFycmF5IG9mIHN0cmluZykgOiBCeXRlOwogdmFyCiAgIGkgOiBJbnRlZ2VyOwotICBob3N0IDogc3RyaW5nOwotICBwb3J0IDogSW50ZWdlcjsKLSAgc1BpcGVOYW1lIDogc3RyaW5nOwotICBoQW5vblJlYWQsIGhBbm9uV3JpdGUgOiBUSGFuZGxlOworICB0aHJlYWRFeGl0Q29kZSA6IEJ5dGU7CiAgIHMgOiBzdHJpbmc7CiAgIHRocmVhZHMgOiBhcnJheSBvZiBUVGhyZWFkOwogICBkdFN0YXJ0IDogVERhdGVUaW1lOwogICB0ZXN0IDogSW50ZWdlcjsKICAgdGhyZWFkIDogVFRocmVhZDsKLSAgdHJhbnMgOiBJVHJhbnNwb3J0OwotICBwcm90IDogSVByb3RvY29sOwotICBzdHJlYW10cmFucyA6IElTdHJlYW1UcmFuc3BvcnQ7Ci0gIGh0dHAgOiBJSFRUUENsaWVudDsKLSAgcHJvdFR5cGUgOiBUS25vd25Qcm90b2NvbDsKLSAgZW5kcG9pbnQgOiBURW5kcG9pbnRUcmFuc3BvcnQ7Ci0gIGxheWVyZWQgOiBUTGF5ZXJlZFRyYW5zcG9ydHM7Ci0gIFVzZVNTTCA6IEJvb2xlYW47IC8vIGluY2x1ZGUgd2hlcmUgYXBwcm9wcmlhdGUgKFRMYXllcmVkVHJhbnNwb3J0PykKLWNvbnN0Ci0gIC8vIHBpcGUgdGltZW91dHMgdG8gYmUgdXNlZAotICBERUJVR19USU1FT1VUICAgPSAzMCAqIDEwMDA7Ci0gIFJFTEVBU0VfVElNRU9VVCA9IERFRkFVTFRfVEhSSUZUX1RJTUVPVVQ7Ci0gIFRJTUVPVVQgICAgICAgICA9IFJFTEVBU0VfVElNRU9VVDsKKyAgc2V0dXAgOiBUVGVzdFNldHVwOwogYmVnaW4KLSAgcHJvdFR5cGUgOj0gcHJvdF9CaW5hcnk7Ci0gIGVuZHBvaW50IDo9IHRybnNfU29ja2V0czsKLSAgbGF5ZXJlZCA6PSBbXTsKLSAgVXNlU1NMIDo9IEZBTFNFOwotICBob3N0IDo9ICdsb2NhbGhvc3QnOwotICBwb3J0IDo9IDkwOTA7Ci0gIHNQaXBlTmFtZSA6PSAnJzsKLSAgaEFub25SZWFkIDo9IElOVkFMSURfSEFORExFX1ZBTFVFOwotICBoQW5vbldyaXRlIDo9IElOVkFMSURfSEFORExFX1ZBTFVFOworICAvLyBpbml0IHJlY29yZAorICB3aXRoIHNldHVwIGRvIGJlZ2luCisgICAgcHJvdFR5cGUgICA6PSBwcm90X0JpbmFyeTsKKyAgICBlbmRwb2ludCAgIDo9IHRybnNfU29ja2V0czsKKyAgICBsYXllcmVkICAgIDo9IFtdOworICAgIHVzZVNTTCAgICAgOj0gRkFMU0U7CisgICAgaG9zdCAgICAgICA6PSAnbG9jYWxob3N0JzsKKyAgICBwb3J0ICAgICAgIDo9IDkwOTA7CisgICAgc1BpcGVOYW1lICA6PSAnJzsKKyAgICBoQW5vblJlYWQgIDo9IElOVkFMSURfSEFORExFX1ZBTFVFOworICAgIGhBbm9uV3JpdGUgOj0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CisgIGVuZDsKKwogICB0cnkKICAgICBpIDo9IDA7CiAgICAgd2hpbGUgKCBpIDwgTGVuZ3RoKGFyZ3MpICkgZG8gYmVnaW4KQEAgLTIxNCwxNSArMjQzLDE1IEBACiAgICAgICBlbmQKICAgICAgIGVsc2UgaWYgcyA9ICctLWhvc3QnIHRoZW4gYmVnaW4KICAgICAgICAgLy8gLS1ob3N0IGFyZyAoPWxvY2FsaG9zdCkgICAgIEhvc3QgdG8gY29ubmVjdAotICAgICAgICBob3N0IDo9IGFyZ3NbaV07CisgICAgICAgIHNldHVwLmhvc3QgOj0gYXJnc1tpXTsKICAgICAgICAgSW5jKCBpKTsKICAgICAgIGVuZAogICAgICAgZWxzZSBpZiBzID0gJy0tcG9ydCcgdGhlbiBiZWdpbgogICAgICAgICAvLyAtLXBvcnQgYXJnICg9OTA5MCkgICAgICAgICAgUG9ydCBudW1iZXIgdG8gY29ubmVjdAogICAgICAgICBzIDo9IGFyZ3NbaV07CiAgICAgICAgIEluYyggaSk7Ci0gICAgICAgIHBvcnQgOj0gU3RyVG9JbnREZWYocywwKTsKLSAgICAgICAgaWYgcG9ydCA8PSAwIHRoZW4gSW52YWxpZEFyZ3M7CisgICAgICAgIHNldHVwLnBvcnQgOj0gU3RyVG9JbnREZWYocywwKTsKKyAgICAgICAgaWYgc2V0dXAucG9ydCA8PSAwIHRoZW4gSW52YWxpZEFyZ3M7CiAgICAgICBlbmQKICAgICAgIGVsc2UgaWYgcyA9ICctLWRvbWFpbi1zb2NrZXQnIHRoZW4gYmVnaW4KICAgICAgICAgLy8gLS1kb21haW4tc29ja2V0IGFyZyAgICAgICAgIERvbWFpbiBTb2NrZXQgKGUuZy4gL3RtcC9UaHJpZnRUZXN0LnRocmlmdCksIGluc3RlYWQgb2YgaG9zdCBhbmQgcG9ydApAQCAtMjMwLDI3ICsyNTksMjkgQEAKICAgICAgIGVuZAogICAgICAgZWxzZSBpZiBzID0gJy0tbmFtZWQtcGlwZScgdGhlbiBiZWdpbgogICAgICAgICAvLyAtLW5hbWVkLXBpcGUgYXJnICAgICAgICAgICAgV2luZG93cyBOYW1lZCBQaXBlIChlLmcuIE15VGhyaWZ0UGlwZSkKLSAgICAgICAgZW5kcG9pbnQgOj0gdHJuc19OYW1lZFBpcGVzOwotICAgICAgICBzUGlwZU5hbWUgOj0gYXJnc1tpXTsKKyAgICAgICAgc2V0dXAuZW5kcG9pbnQgOj0gdHJuc19OYW1lZFBpcGVzOworICAgICAgICBzZXR1cC5zUGlwZU5hbWUgOj0gYXJnc1tpXTsKICAgICAgICAgSW5jKCBpKTsKKyAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoJ1VzaW5nIG5hbWVkIHBpcGUgKCcrc2V0dXAuc1BpcGVOYW1lKycpJyk7CiAgICAgICBlbmQKICAgICAgIGVsc2UgaWYgcyA9ICctLWFub24tcGlwZXMnIHRoZW4gYmVnaW4KICAgICAgICAgLy8gLS1hbm9uLXBpcGVzIGhSZWFkIGhXcml0ZSAgIFdpbmRvd3MgQW5vbnltb3VzIFBpcGVzIHBhaXIgKGhhbmRsZXMpCi0gICAgICAgIGVuZHBvaW50IDo9IHRybnNfQW5vblBpcGVzOwotICAgICAgICBoQW5vblJlYWQgOj0gVEhhbmRsZSggU3RyVG9JbnREZWYoIGFyZ3NbaV0sIEludGVnZXIoSU5WQUxJRF9IQU5ETEVfVkFMVUUpKSk7CisgICAgICAgIHNldHVwLmVuZHBvaW50IDo9IHRybnNfQW5vblBpcGVzOworICAgICAgICBzZXR1cC5oQW5vblJlYWQgOj0gVEhhbmRsZSggU3RyVG9JbnREZWYoIGFyZ3NbaV0sIEludGVnZXIoSU5WQUxJRF9IQU5ETEVfVkFMVUUpKSk7CiAgICAgICAgIEluYyggaSk7Ci0gICAgICAgIGhBbm9uV3JpdGUgOj0gVEhhbmRsZSggU3RyVG9JbnREZWYoIGFyZ3NbaV0sIEludGVnZXIoSU5WQUxJRF9IQU5ETEVfVkFMVUUpKSk7CisgICAgICAgIHNldHVwLmhBbm9uV3JpdGUgOj0gVEhhbmRsZSggU3RyVG9JbnREZWYoIGFyZ3NbaV0sIEludGVnZXIoSU5WQUxJRF9IQU5ETEVfVkFMVUUpKSk7CiAgICAgICAgIEluYyggaSk7CisgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCdVc2luZyBhbm9ueW1vdXMgcGlwZXMgKCcrSW50VG9TdHIoSW50ZWdlcihzZXR1cC5oQW5vblJlYWQpKSsnIGFuZCAnK0ludFRvU3RyKEludGVnZXIoc2V0dXAuaEFub25Xcml0ZSkpKycpJyk7CiAgICAgICBlbmQKICAgICAgIGVsc2UgaWYgcyA9ICctLXRyYW5zcG9ydCcgdGhlbiBiZWdpbgogICAgICAgICAvLyAtLXRyYW5zcG9ydCBhcmcgKD1zb2NrZXRzKSAgVHJhbnNwb3J0OiBidWZmZXJlZCwgZnJhbWVkLCBodHRwLCBldmh0dHAKICAgICAgICAgcyA6PSBhcmdzW2ldOwogICAgICAgICBJbmMoIGkpOwogCi0gICAgICAgIGlmICAgICAgcyA9ICdidWZmZXJlZCcgdGhlbiBJbmNsdWRlKCBsYXllcmVkLCB0cm5zX0J1ZmZlcmVkKQotICAgICAgICBlbHNlIGlmIHMgPSAnZnJhbWVkJyAgIHRoZW4gSW5jbHVkZSggbGF5ZXJlZCwgdHJuc19GcmFtZWQpCi0gICAgICAgIGVsc2UgaWYgcyA9ICdodHRwJyAgICAgdGhlbiBlbmRwb2ludCA6PSB0cm5zX0h0dHAKLSAgICAgICAgZWxzZSBpZiBzID0gJ2V2aHR0cCcgICB0aGVuIGVuZHBvaW50IDo9IHRybnNfQW5vblBpcGVzCisgICAgICAgIGlmICAgICAgcyA9ICdidWZmZXJlZCcgdGhlbiBJbmNsdWRlKCBzZXR1cC5sYXllcmVkLCB0cm5zX0J1ZmZlcmVkKQorICAgICAgICBlbHNlIGlmIHMgPSAnZnJhbWVkJyAgIHRoZW4gSW5jbHVkZSggc2V0dXAubGF5ZXJlZCwgdHJuc19GcmFtZWQpCisgICAgICAgIGVsc2UgaWYgcyA9ICdodHRwJyAgICAgdGhlbiBzZXR1cC5lbmRwb2ludCA6PSB0cm5zX0h0dHAKKyAgICAgICAgZWxzZSBpZiBzID0gJ2V2aHR0cCcgICB0aGVuIHNldHVwLmVuZHBvaW50IDo9IHRybnNfRXZIdHRwCiAgICAgICAgIGVsc2UgSW52YWxpZEFyZ3M7CiAgICAgICBlbmQKICAgICAgIGVsc2UgaWYgcyA9ICctLXByb3RvY29sJyB0aGVuIGJlZ2luCkBAIC0yNTgsMTQgKzI4OSwxNCBAQAogICAgICAgICBzIDo9IGFyZ3NbaV07CiAgICAgICAgIEluYyggaSk7CiAKLSAgICAgICAgaWYgICAgICBzID0gJ2JpbmFyeScgICB0aGVuIHByb3RUeXBlIDo9IHByb3RfQmluYXJ5Ci0gICAgICAgIGVsc2UgaWYgcyA9ICdjb21wYWN0JyAgdGhlbiBwcm90VHlwZSA6PSBwcm90X0NvbXBhY3QKLSAgICAgICAgZWxzZSBpZiBzID0gJ2pzb24nICAgICB0aGVuIHByb3RUeXBlIDo9IHByb3RfSlNPTgorICAgICAgICBpZiAgICAgIHMgPSAnYmluYXJ5JyAgIHRoZW4gc2V0dXAucHJvdFR5cGUgOj0gcHJvdF9CaW5hcnkKKyAgICAgICAgZWxzZSBpZiBzID0gJ2NvbXBhY3QnICB0aGVuIHNldHVwLnByb3RUeXBlIDo9IHByb3RfQ29tcGFjdAorICAgICAgICBlbHNlIGlmIHMgPSAnanNvbicgICAgIHRoZW4gc2V0dXAucHJvdFR5cGUgOj0gcHJvdF9KU09OCiAgICAgICAgIGVsc2UgSW52YWxpZEFyZ3M7CiAgICAgICBlbmQKICAgICAgIGVsc2UgaWYgcyA9ICctLXNzbCcgdGhlbiBiZWdpbgogICAgICAgICAvLyAtLXNzbCAgICAgICAgICAgICAgICAgICAgICAgRW5jcnlwdGVkIFRyYW5zcG9ydCB1c2luZyBTU0wKLSAgICAgICAgVXNlU1NMIDo9IFRSVUU7CisgICAgICAgIHNldHVwLnVzZVNTTCA6PSBUUlVFOwogCiAgICAgICBlbmQKICAgICAgIGVsc2UgaWYgKHMgPSAnLW4nKSBvciAocyA9ICctLXRlc3Rsb29wcycpIHRoZW4gYmVnaW4KQEAgLTI5MSw3ICszMjIsNyBAQAogCiAgICAgLy8gSW4gdGhlIGFub255bW91cyBwaXBlcyBtb2RlIHRoZSBjbGllbnQgaXMgbGF1bmNoZWQgYnkgdGhlIHRlc3Qgc2VydmVyCiAgICAgLy8gLT4gYmVoYXZlIG5pY2VseSBhbmQgYWxsb3cgZm9yIGF0dGFjaGluZyBhIGRlYnVnZ2VyIHRvIHRoaXMgcHJvY2VzcwotICAgIGlmIChlbmRwb2ludCA9IHRybnNfQW5vblBpcGVzKSBhbmQgbm90IElzRGVidWdnZXJQcmVzZW50CisgICAgaWYgKHNldHVwLmVuZHBvaW50ID0gdHJuc19Bbm9uUGlwZXMpIGFuZCBub3QgSXNEZWJ1Z2dlclByZXNlbnQKICAgICB0aGVuIE1lc3NhZ2VCb3goIDAsICdBdHRhY2ggRGVidWdnZXIgYW5kL29yIGNsaWNrIE9LIHRvIGNvbnRpbnVlLicsCiAgICAgICAgICAgICAgICAgICAgICAgICAnVGhyaWZ0IFRlc3RDbGllbnQgKERlbHBoaSknLAogICAgICAgICAgICAgICAgICAgICAgICAgTUJfT0sgb3IgTUJfSUNPTkVYQ0xBTUFUSU9OKTsKQEAgLTI5OSw3OCArMzMwLDMwIEBACiAgICAgU2V0TGVuZ3RoKCB0aHJlYWRzLCBGTnVtVGhyZWFkKTsKICAgICBkdFN0YXJ0IDo9IE5vdzsKIAotICAgIGZvciB0ZXN0IDo9IDAgdG8gRk51bVRocmVhZCAtIDEgZG8KLSAgICBiZWdpbgotICAgICAgY2FzZSBlbmRwb2ludCBvZgotICAgICAgICB0cm5zX1NvY2tldHM6IGJlZ2luCi0gICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoJ1VzaW5nIHNvY2tldHMgKCcraG9zdCsnIHBvcnQgJytJbnRUb1N0cihwb3J0KSsnKScpOwotICAgICAgICAgIHN0cmVhbXRyYW5zIDo9IFRTb2NrZXRJbXBsLkNyZWF0ZSggaG9zdCwgcG9ydCApOwotICAgICAgICBlbmQ7CisgICAgLy8gbGF5ZXJlZCB0cmFuc3BvcnRzIGFyZSBub3QgcmVhbGx5IG1lYW50IHRvIGJlIHN0YWNrZWQgdXBvbiBlYWNoIG90aGVyCisgICAgaWYgKHRybnNfRnJhbWVkIGluIHNldHVwLmxheWVyZWQpIHRoZW4gYmVnaW4KKyAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCdVc2luZyBmcmFtZWQgdHJhbnNwb3J0Jyk7CisgICAgZW5kCisgICAgZWxzZSBpZiAodHJuc19CdWZmZXJlZCBpbiBzZXR1cC5sYXllcmVkKSB0aGVuIGJlZ2luCisgICAgICBDb25zb2xlLldyaXRlTGluZSgnVXNpbmcgYnVmZmVyZWQgdHJhbnNwb3J0Jyk7CisgICAgZW5kOwogCi0gICAgICAgIHRybnNfSHR0cDogYmVnaW4KLSAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgnVXNpbmcgSFRUUENsaWVudCcpOwotICAgICAgICAgIGh0dHAgOj0gVEhUVFBDbGllbnRJbXBsLkNyZWF0ZSggaG9zdCk7Ci0gICAgICAgICAgdHJhbnMgOj0gaHR0cDsKLSAgICAgICAgZW5kOworICAgIENvbnNvbGUuV3JpdGVMaW5lKFRIUklGVF9QUk9UT0NPTFNbc2V0dXAucHJvdFR5cGVdKycgcHJvdG9jb2wnKTsKIAotICAgICAgICB0cm5zX0V2SHR0cDogYmVnaW4KLSAgICAgICAgICByYWlzZSBFeGNlcHRpb24uQ3JlYXRlKEVORFBPSU5UX1RSQU5TUE9SVFNbZW5kcG9pbnRdKycgdHJhbnNwb3J0IG5vdCBpbXBsZW1lbnRlZCcpOwotICAgICAgICBlbmQ7Ci0KLSAgICAgICAgdHJuc19OYW1lZFBpcGVzOiBiZWdpbgotICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCdVc2luZyBuYW1lZCBwaXBlICgnK3NQaXBlTmFtZSsnKScpOwotICAgICAgICAgIHN0cmVhbXRyYW5zIDo9IFROYW1lZFBpcGVUcmFuc3BvcnRDbGllbnRFbmRJbXBsLkNyZWF0ZSggc1BpcGVOYW1lLCAwLCBuaWwsIFRJTUVPVVQpOwotICAgICAgICBlbmQ7Ci0KLSAgICAgICAgdHJuc19Bbm9uUGlwZXM6IGJlZ2luCi0gICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoJ1VzaW5nIGFub255bW91cyBwaXBlcyAoJytJbnRUb1N0cihJbnRlZ2VyKGhBbm9uUmVhZCkpKycgYW5kICcrSW50VG9TdHIoSW50ZWdlcihoQW5vbldyaXRlKSkrJyknKTsKLSAgICAgICAgICBzdHJlYW10cmFucyA6PSBUQW5vbnltb3VzUGlwZVRyYW5zcG9ydEltcGwuQ3JlYXRlKCBoQW5vblJlYWQsIGhBbm9uV3JpdGUsIEZBTFNFKTsKLSAgICAgICAgZW5kOwotCi0gICAgICBlbHNlCi0gICAgICAgIHJhaXNlIEV4Y2VwdGlvbi5DcmVhdGUoJ1VuaGFuZGxlZCBlbmRwb2ludCB0cmFuc3BvcnQnKTsKLSAgICAgIGVuZDsKLSAgICAgIHRyYW5zIDo9IHN0cmVhbXRyYW5zOwotICAgICAgQVNTRVJUKCB0cmFucyA8PiBuaWwpOwotCi0gICAgICBpZiAodHJuc19CdWZmZXJlZCBpbiBsYXllcmVkKSB0aGVuIGJlZ2luCi0gICAgICAgIHRyYW5zIDo9IFRCdWZmZXJlZFRyYW5zcG9ydEltcGwuQ3JlYXRlKCBzdHJlYW10cmFucywgMzIpOyAgLy8gc21hbGwgYnVmZmVyIHRvIHRlc3QgcmVhZCgpCi0gICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCdVc2luZyBidWZmZXJlZCB0cmFuc3BvcnQnKTsKLSAgICAgIGVuZDsKLQotICAgICAgaWYgKHRybnNfRnJhbWVkIGluIGxheWVyZWQpIHRoZW4gYmVnaW4KLSAgICAgICAgdHJhbnMgOj0gVEZyYW1lZFRyYW5zcG9ydEltcGwuQ3JlYXRlKCB0cmFucyApOwotICAgICAgICBDb25zb2xlLldyaXRlTGluZSgnVXNpbmcgZnJhbWVkIHRyYW5zcG9ydCcpOwotICAgICAgZW5kOwotCi0gICAgICBpZiBVc2VTU0wgdGhlbiBiZWdpbgotICAgICAgICByYWlzZSBFeGNlcHRpb24uQ3JlYXRlKCdTU0wgbm90IGltcGxlbWVudGVkJyk7Ci0gICAgICBlbmQ7Ci0KLSAgICAgIC8vIGNyZWF0ZSBwcm90b2NvbCBpbnN0YW5jZSwgZGVmYXVsdCB0byBCaW5hcnlQcm90b2NvbAotICAgICAgY2FzZSBwcm90VHlwZSBvZgotICAgICAgICBwcm90X0JpbmFyeSAgOiAgcHJvdCA6PSBUQmluYXJ5UHJvdG9jb2xJbXBsLkNyZWF0ZSggdHJhbnMsIEJJTkFSWV9TVFJJQ1RfUkVBRCwgQklOQVJZX1NUUklDVF9XUklURSk7Ci0gICAgICAgIHByb3RfSlNPTiAgICA6ICBwcm90IDo9IFRKU09OUHJvdG9jb2xJbXBsLkNyZWF0ZSggdHJhbnMpOwotICAgICAgICBwcm90X0NvbXBhY3QgOiAgcmFpc2UgRXhjZXB0aW9uLkNyZWF0ZSgnQ29tcGFjdCBwcm90b2NvbCBub3QgaW1wbGVtZW50ZWQnKTsKLSAgICAgIGVsc2UKLSAgICAgICAgcmFpc2UgRXhjZXB0aW9uLkNyZWF0ZSgnVW5oYW5kbGVkIHByb3RvY29sJyk7Ci0gICAgICBlbmQ7Ci0gICAgICBBU1NFUlQoIHRyYW5zIDw+IG5pbCk7Ci0gICAgICBDb25zb2xlLldyaXRlTGluZShUSFJJRlRfUFJPVE9DT0xTW3Byb3RUeXBlXSsnIHByb3RvY29sJyk7Ci0KLSAgICAgIHRocmVhZCA6PSBUQ2xpZW50VGhyZWFkLkNyZWF0ZSggdHJhbnMsIHByb3QsIEZOdW1JdGVyYXRpb24pOworICAgIGZvciB0ZXN0IDo9IDAgdG8gRk51bVRocmVhZCAtIDEgZG8gYmVnaW4KKyAgICAgIHRocmVhZCA6PSBUQ2xpZW50VGhyZWFkLkNyZWF0ZSggc2V0dXAsIEZOdW1JdGVyYXRpb24pOwogICAgICAgdGhyZWFkc1t0ZXN0XSA6PSB0aHJlYWQ7CiAgICAgICB0aHJlYWQuU3RhcnQ7CiAgICAgZW5kOwogCiAgICAgcmVzdWx0IDo9IDA7CiAgICAgZm9yIHRlc3QgOj0gMCB0byBGTnVtVGhyZWFkIC0gMSBkbyBiZWdpbgotICAgICAgcmVzdWx0IDo9IHJlc3VsdCBvciB0aHJlYWRzW3Rlc3RdLldhaXRGb3I7CisgICAgICB0aHJlYWRFeGl0Q29kZSA6PSB0aHJlYWRzW3Rlc3RdLldhaXRGb3I7CisgICAgICByZXN1bHQgOj0gcmVzdWx0IG9yIHRocmVhZEV4aXRDb2RlOworICAgICAgdGhyZWFkc1t0ZXN0XS5GcmVlOworICAgICAgdGhyZWFkc1t0ZXN0XSA6PSBuaWw7CiAgICAgZW5kOwogCi0gICAgZm9yIHRlc3QgOj0gMCB0byBGTnVtVGhyZWFkIC0gMQotICAgIGRvIHRocmVhZHNbdGVzdF0uRnJlZTsKLQogICAgIENvbnNvbGUuV3JpdGUoJ1RvdGFsIHRpbWU6ICcgKyBJbnRUb1N0ciggTWlsbGlTZWNvbmRzQmV0d2VlbihOb3csIGR0U3RhcnQpKSk7CiAKICAgZXhjZXB0CkBAIC0zOTQsNiArMzc3LDcgQEAKICAgaTggOiBTaG9ydEludDsKICAgaTMyIDogSW50ZWdlcjsKICAgaTY0IDogSW50NjQ7CisgIGJpbk91dCxiaW5JbiA6IFRCeXRlczsKICAgZHViIDogRG91YmxlOwogICBvIDogSVh0cnVjdDsKICAgbzIgOiBJWHRydWN0MjsKQEAgLTQzNSwxNSArNDE5LDE3IEBACiAgIGFyZzMgOiBJVGhyaWZ0RGljdGlvbmFyeTxTbWFsbEludCwgc3RyaW5nPjsKICAgYXJnNCA6IFROdW1iZXJ6OwogICBhcmc1IDogSW50NjQ7CisgIHskSUZERUYgUGVyZlRlc3R9CiAgIFN0YXJ0VGljayA6IENhcmRpbmFsOwogICBrIDogSW50ZWdlcjsKLSAgcHJvYyA6IFRUaHJlYWRQcm9jZWR1cmU7CisgIHskRU5ESUZ9CiAgIGhlbGxvLCBnb29kYnllIDogSVh0cnVjdDsKICAgY3JhenkgOiBJSW5zYW5pdHk7CiAgIGxvb25leSA6IElJbnNhbml0eTsKICAgZmlyc3RfbWFwIDogSVRocmlmdERpY3Rpb25hcnk8VE51bWJlcnosIElJbnNhbml0eT47CiAgIHNlY29uZF9tYXAgOiBJVGhyaWZ0RGljdGlvbmFyeTxUTnVtYmVyeiwgSUluc2FuaXR5PjsKLQorICBwYWlyIDogVFBhaXI8VE51bWJlcnosIFRVc2VySWQ+OworICB0ZXN0c2l6ZSA6IFRUZXN0U2l6ZTsKIGJlZ2luCiAgIGNsaWVudCA6PSBUVGhyaWZ0VGVzdC5UQ2xpZW50LkNyZWF0ZSggRlByb3RvY29sKTsKICAgRlRyYW5zcG9ydC5PcGVuOwpAQCAtNDUyLDYgKzQzOCw3IEBACiAgIFN0cmVzc1Rlc3QoIGNsaWVudCk7CiAgIHskRU5ESUYgU3RyZXNzVGVzdH0KIAorICB7JElGREVGIEV4Y2VwdGlvbnN9CiAgIC8vIGluLWRlcHRoIGV4Y2VwdGlvbiB0ZXN0CiAgIC8vICgxKSBkbyB3ZSBnZXQgYW4gZXhjZXB0aW9uIGF0IGFsbD8KICAgLy8gKDIpIGRvIHdlIGdldCB0aGUgcmlnaHQgZXhjZXB0aW9uPwpAQCAtNDY4LDcgKzQ1NSw3IEBACiAgICAgICBDb25zb2xlLldyaXRlTGluZSggJyA9ICcgKyBJbnRUb1N0cihlLkVycm9yQ29kZSkgKyAnLCAnICsgZS5NZXNzYWdlXyApOwogICAgIGVuZDsKICAgICBvbiBlOlRUcmFuc3BvcnRFeGNlcHRpb24gZG8gRXhwZWN0KCBGQUxTRSwgJ1VuZXhwZWN0ZWQgOiAiJytlLlRvU3RyaW5nKyciJyk7Ci0gICAgb24gZTpFeGNlcHRpb24gZG8gRXhwZWN0KCBGQUxTRSwgJ1VuZXhwZWN0ZWQgZXhjZXB0aW9uIHR5cGUgIicrZS5DbGFzc05hbWUrJyInKTsKKyAgICBvbiBlOkV4Y2VwdGlvbiBkbyBFeHBlY3QoIEZBTFNFLCAnVW5leHBlY3RlZCBleGNlcHRpb24gIicrZS5DbGFzc05hbWUrJyI6ICcrZS5NZXNzYWdlKTsKICAgZW5kOwogCiAgIC8vIGNhc2UgMjogZXhjZXB0aW9uIHR5cGUgTk9UIGRlY2xhcmVkIGluIElETCBhdCB0aGUgZnVuY3Rpb24gY2FsbApAQCAtNDc5LDI2ICs0NjYsMjggQEAKICAgZXhjZXB0CiAgICAgb24gZTpUVHJhbnNwb3J0RXhjZXB0aW9uIGRvIGJlZ2luCiAgICAgICBDb25zb2xlLldyaXRlTGluZSggZS5DbGFzc05hbWUrJyA9ICcrZS5NZXNzYWdlKTsgLy8gdGhpcyBpcyB3aGF0IHdlIGdldAotICAgICAgaWYgRlRyYW5zcG9ydC5Jc09wZW4gdGhlbiBGVHJhbnNwb3J0LkNsb3NlOwotICAgICAgRlRyYW5zcG9ydC5PcGVuOyAgIC8vIHJlLW9wZW4gY29ubmVjdGlvbiwgc2VydmVyIGhhcyBhbHJlYWR5IGNsb3NlZAogICAgIGVuZDsKICAgICBvbiBlOlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBkbyBiZWdpbgogICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIGUuQ2xhc3NOYW1lKycgPSAnK2UuTWVzc2FnZSk7IC8vIHRoaXMgaXMgd2hhdCB3ZSBnZXQKLSAgICAgIGlmIEZUcmFuc3BvcnQuSXNPcGVuIHRoZW4gRlRyYW5zcG9ydC5DbG9zZTsKLSAgICAgIEZUcmFuc3BvcnQuT3BlbjsgICAvLyByZS1vcGVuIGNvbm5lY3Rpb24sIHNlcnZlciBoYXMgYWxyZWFkeSBjbG9zZWQKICAgICBlbmQ7Ci0gICAgb24gZTpURXhjZXB0aW9uIGRvIEV4cGVjdCggRkFMU0UsICdVbmV4cGVjdGVkIGV4Y2VwdGlvbiB0eXBlICInK2UuQ2xhc3NOYW1lKyciJyk7Ci0gICAgb24gZTpFeGNlcHRpb24gZG8gRXhwZWN0KCBGQUxTRSwgJ1VuZXhwZWN0ZWQgZXhjZXB0aW9uIHR5cGUgIicrZS5DbGFzc05hbWUrJyInKTsKKyAgICBvbiBlOlRFeGNlcHRpb24gZG8gRXhwZWN0KCBGQUxTRSwgJ1VuZXhwZWN0ZWQgZXhjZXB0aW9uICInK2UuQ2xhc3NOYW1lKyciOiAnK2UuTWVzc2FnZSk7CisgICAgb24gZTpFeGNlcHRpb24gZG8gRXhwZWN0KCBGQUxTRSwgJ1VuZXhwZWN0ZWQgZXhjZXB0aW9uICInK2UuQ2xhc3NOYW1lKyciOiAnK2UuTWVzc2FnZSk7CiAgIGVuZDsKIAorCisgIGlmIEZUcmFuc3BvcnQuSXNPcGVuIHRoZW4gRlRyYW5zcG9ydC5DbG9zZTsKKyAgRlRyYW5zcG9ydC5PcGVuOyAgIC8vIHJlLW9wZW4gY29ubmVjdGlvbiwgc2VydmVyIGhhcyBhbHJlYWR5IGNsb3NlZAorCisKICAgLy8gY2FzZSAzOiBubyBleGNlcHRpb24KICAgdHJ5CiAgICAgY2xpZW50LnRlc3RFeGNlcHRpb24oJ3NvbWV0aGluZycpOwogICAgIEV4cGVjdCggVFJVRSwgJ3Rlc3RFeGNlcHRpb24oJydzb21ldGhpbmcnJyk6IG11c3Qgbm90IHRyb3cgYW4gZXhjZXB0aW9uJyk7CiAgIGV4Y2VwdAogICAgIG9uIGU6VFRyYW5zcG9ydEV4Y2VwdGlvbiBkbyBFeHBlY3QoIEZBTFNFLCAnVW5leHBlY3RlZCA6ICInK2UuVG9TdHJpbmcrJyInKTsKLSAgICBvbiBlOkV4Y2VwdGlvbiBkbyBFeHBlY3QoIEZBTFNFLCAnVW5leHBlY3RlZCBleGNlcHRpb24gIicrZS5DbGFzc05hbWUrJyInKTsKKyAgICBvbiBlOkV4Y2VwdGlvbiBkbyBFeHBlY3QoIEZBTFNFLCAnVW5leHBlY3RlZCBleGNlcHRpb24gIicrZS5DbGFzc05hbWUrJyI6ICcrZS5NZXNzYWdlKTsKICAgZW5kOworICB7JEVORElGIEV4Y2VwdGlvbnN9CiAKIAogICAvLyBzaW1wbGUgdGhpbmdzCkBAIC01MDYsMTIgKzQ5NSwyMCBAQAogICBjbGllbnQudGVzdFZvaWQoKTsKICAgRXhwZWN0KCBUUlVFLCAndGVzdFZvaWQoKScpOyAgLy8gc3VjY2VzcyA6PSBubyBleGNlcHRpb24KIAorICBzIDo9IEJvb2xUb1N0cmluZyggY2xpZW50LnRlc3RCb29sKFRSVUUpKTsKKyAgRXhwZWN0KCBzID0gQm9vbFRvU3RyaW5nKFRSVUUpLCAgJ3Rlc3RCb29sKFRSVUUpID0gJytzKTsKKyAgcyA6PSBCb29sVG9TdHJpbmcoIGNsaWVudC50ZXN0Qm9vbChGQUxTRSkpOworICBFeHBlY3QoIHMgPSBCb29sVG9TdHJpbmcoRkFMU0UpLCAgJ3Rlc3RCb29sKEZBTFNFKSA9ICcrcyk7CisKICAgcyA6PSBjbGllbnQudGVzdFN0cmluZygnVGVzdCcpOwogICBFeHBlY3QoIHMgPSAnVGVzdCcsICd0ZXN0U3RyaW5nKCcnVGVzdCcnKSA9ICInK3MrJyInKTsKIAorICBzIDo9IGNsaWVudC50ZXN0U3RyaW5nKCcnKTsgIC8vIGVtcHR5IHN0cmluZworICBFeHBlY3QoIHMgPSAnJywgJ3Rlc3RTdHJpbmcoJycnJykgPSAiJytzKyciJyk7CisKICAgcyA6PSBjbGllbnQudGVzdFN0cmluZyhIVUdFX1RFU1RfU1RSSU5HKTsKICAgRXhwZWN0KCBsZW5ndGgocykgPSBsZW5ndGgoSFVHRV9URVNUX1NUUklORyksCi0gICAgICAgICAgJ3Rlc3RTdHJpbmcoIGxlbmdodChIVUdFX1RFU1RfU1RSSU5HKSA9ICcrSW50VG9TdHIoTGVuZ3RoKEhVR0VfVEVTVF9TVFJJTkcpKSsnKSAnCisgICAgICAgICAgJ3Rlc3RTdHJpbmcoIGxlbmd0aChIVUdFX1RFU1RfU1RSSU5HKSA9ICcrSW50VG9TdHIoTGVuZ3RoKEhVR0VfVEVTVF9TVFJJTkcpKSsnKSAnCiAgICAgICAgICArJz0+IGxlbmd0aChyZXN1bHQpID0gJytJbnRUb1N0cihMZW5ndGgocykpKTsKIAogICBpOCA6PSBjbGllbnQudGVzdEJ5dGUoMSk7CkBAIC01MjQsNiArNTIxLDIxIEBACiAgIGk2NCA6PSBjbGllbnQudGVzdEk2NCgtMzQzNTk3MzgzNjgpOwogICBFeHBlY3QoIGk2NCA9IC0zNDM1OTczODM2OCwgJ3Rlc3RJNjQoLTM0MzU5NzM4MzY4KSA9ICcgKyBJbnRUb1N0ciggaTY0KSk7CiAKKyAgLy8gcmFuZG9tIGJpbmFyeSBzbWFsbAorICBmb3IgdGVzdHNpemUgOj0gTG93KFRUZXN0U2l6ZSkgdG8gSGlnaChUVGVzdFNpemUpIGRvIGJlZ2luCisgICAgYmluT3V0IDo9IFByZXBhcmVCaW5hcnlEYXRhKCBUUlVFLCB0ZXN0c2l6ZSk7CisgICAgQ29uc29sZS5Xcml0ZUxpbmUoJ3Rlc3RCaW5hcnkoJytCeXRlc1RvSGV4KGJpbk91dCkrJyknKTsKKyAgICB0cnkKKyAgICAgIGJpbkluIDo9IGNsaWVudC50ZXN0QmluYXJ5KGJpbk91dCk7CisgICAgICBFeHBlY3QoIExlbmd0aChiaW5PdXQpID0gTGVuZ3RoKGJpbkluKSwgJ3Rlc3RCaW5hcnkoKTogbGVuZ3RoICcrSW50VG9TdHIoTGVuZ3RoKGJpbk91dCkpKycgPSAnK0ludFRvU3RyKExlbmd0aChiaW5JbikpKTsKKyAgICAgIGkzMiA6PSBNaW4oIExlbmd0aChiaW5PdXQpLCBMZW5ndGgoYmluSW4pKTsKKyAgICAgIEV4cGVjdCggQ29tcGFyZU1lbSggYmluT3V0LCBiaW5JbiwgaTMyKSwgJ3Rlc3RCaW5hcnkoJytCeXRlc1RvSGV4KGJpbk91dCkrJykgPSAnK0J5dGVzVG9IZXgoYmluSW4pKTsKKyAgICBleGNlcHQKKyAgICAgIG9uIGU6VEFwcGxpY2F0aW9uRXhjZXB0aW9uIGRvIENvbnNvbGUuV3JpdGVMaW5lKCd0ZXN0QmluYXJ5KCk6ICcrZS5NZXNzYWdlKTsKKyAgICAgIG9uIGU6RXhjZXB0aW9uIGRvIEV4cGVjdCggRkFMU0UsICd0ZXN0QmluYXJ5KCk6IFVuZXhwZWN0ZWQgZXhjZXB0aW9uICInK2UuQ2xhc3NOYW1lKyciOiAnK2UuTWVzc2FnZSk7CisgICAgZW5kOworICBlbmQ7CisKICAgQ29uc29sZS5Xcml0ZUxpbmUoJ3Rlc3REb3VibGUoNS4zMjUwOTgyMzUpJyk7CiAgIGR1YiA6PSBjbGllbnQudGVzdERvdWJsZSg1LjMyNTA5ODIzNSk7CiAgIEV4cGVjdCggYWJzKGR1Yi01LjMyNTA5ODIzNSkgPCAxZS0xNCwgJ3Rlc3REb3VibGUoNS4zMjUwOTgyMzUpID0gJyArIEZsb2F0VG9TdHIoIGR1YikpOwpAQCAtNzQ4LDkgKzc2MCw5IEBACiAgIGluc2FuZS5Vc2VyTWFwLkFkZE9yU2V0VmFsdWUoIFROdW1iZXJ6LkZJVkUsIDUwMDApOwogICB0cnVjayA6PSBUWHRydWN0SW1wbC5DcmVhdGU7CiAgIHRydWNrLlN0cmluZ190aGluZyA6PSAnVHJ1Y2snOwotICB0cnVjay5CeXRlX3RoaW5nIDo9IDg7Ci0gIHRydWNrLkkzMl90aGluZyA6PSA4OwotICB0cnVjay5JNjRfdGhpbmcgOj0gODsKKyAgdHJ1Y2suQnl0ZV90aGluZyA6PSAtODsgIC8vIGJ5dGUgaXMgc2lnbmVkCisgIHRydWNrLkkzMl90aGluZyA6PSAzMjsKKyAgdHJ1Y2suSTY0X3RoaW5nIDo9IDY0OwogICBpbnNhbmUuWHRydWN0cyA6PSBUVGhyaWZ0TGlzdEltcGw8SVh0cnVjdD4uQ3JlYXRlOwogICBpbnNhbmUuWHRydWN0cy5BZGQoIHRydWNrICk7CiAgIHdob2EgOj0gY2xpZW50LnRlc3RJbnNhbml0eSggaW5zYW5lICk7CkBAIC03OTksNiArODExLDE4IEBACiAgIGVuZDsKICAgQ29uc29sZS5Xcml0ZUxpbmUoJ30nKTsKIAorICAoKioKKyAgICogU28geW91IHRoaW5rIHlvdSd2ZSBnb3QgdGhpcyBhbGwgd29ya2VkLCBvdXQgZWg/CisgICAqCisgICAqIENyZWF0ZXMgYSB0aGUgcmV0dXJuZWQgbWFwIHdpdGggdGhlc2UgdmFsdWVzIGFuZCBwcmludHMgaXQgb3V0OgorICAgKiAgIHsgMSA9PiB7IDIgPT4gYXJndW1lbnQsCisgICAqICAgICAgICAgICAgMyA9PiBhcmd1bWVudCwKKyAgICogICAgICAgICAgfSwKKyAgICogICAgIDIgPT4geyA2ID0+IDxlbXB0eSBJbnNhbml0eSBzdHJ1Y3Q+LCB9LAorICAgKiAgIH0KKyAgICogQHJldHVybiBtYXA8VXNlcklkLCBtYXA8TnVtYmVyeixJbnNhbml0eT4+IC0gYSBtYXAgd2l0aCB0aGUgYWJvdmUgdmFsdWVzCisgICAqKQorCiAgIC8vIHZlcmlmeSByZXN1bHQgZGF0YQogICBFeHBlY3QoIHdob2EuQ291bnQgPSAyLCAnd2hvYS5Db3VudCA9ICcrSW50VG9TdHIod2hvYS5Db3VudCkpOwogICAvLwpAQCAtODE5LDMxICs4NDMsMjAgQEAKICAgICBFeHBlY3QoIGNyYXp5Ll9faXNzZXRfVXNlck1hcCwgJ2NyYXp5Ll9faXNzZXRfVXNlck1hcCA9ICcrQm9vbFRvU3RyaW5nKGNyYXp5Ll9faXNzZXRfVXNlck1hcCkpOwogICAgIEV4cGVjdCggY3JhenkuX19pc3NldF9YdHJ1Y3RzLCAnY3JhenkuX19pc3NldF9YdHJ1Y3RzID0gJytCb29sVG9TdHJpbmcoY3JhenkuX19pc3NldF9YdHJ1Y3RzKSk7CiAKLSAgICBFeHBlY3QoIGNyYXp5LlVzZXJNYXAuQ291bnQgPSAyLCAnY3JhenkuVXNlck1hcC5Db3VudCA9ICcrSW50VG9TdHIoY3JhenkuVXNlck1hcC5Db3VudCkpOwotICAgIEV4cGVjdCggY3JhenkuVXNlck1hcFtUTnVtYmVyei5GSVZFXSA9IDUsICdjcmF6eS5Vc2VyTWFwW1ROdW1iZXJ6LkZJVkVdID0gJytJbnRUb1N0cihjcmF6eS5Vc2VyTWFwW1ROdW1iZXJ6LkZJVkVdKSk7Ci0gICAgRXhwZWN0KCBjcmF6eS5Vc2VyTWFwW1ROdW1iZXJ6LkVJR0hUXSA9IDgsICdjcmF6eS5Vc2VyTWFwW1ROdW1iZXJ6LkVJR0hUXSA9ICcrSW50VG9TdHIoY3JhenkuVXNlck1hcFtUTnVtYmVyei5FSUdIVF0pKTsKKyAgICBFeHBlY3QoIGNyYXp5LlVzZXJNYXAuQ291bnQgPSBpbnNhbmUuVXNlck1hcC5Db3VudCwgJ2NyYXp5LlVzZXJNYXAuQ291bnQgPSAnK0ludFRvU3RyKGNyYXp5LlVzZXJNYXAuQ291bnQpKTsKKyAgICBmb3IgcGFpciBpbiBpbnNhbmUuVXNlck1hcCBkbyBiZWdpbgorICAgICAgRXhwZWN0KCBjcmF6eS5Vc2VyTWFwW3BhaXIuS2V5XSA9IHBhaXIuVmFsdWUsICdjcmF6eS5Vc2VyTWFwWycrSW50VG9TdHIoT3JkKHBhaXIua2V5KSkrJ10gPSAnK0ludFRvU3RyKGNyYXp5LlVzZXJNYXBbcGFpci5LZXldKSk7CisgICAgZW5kOwogCi0gICAgRXhwZWN0KCBjcmF6eS5YdHJ1Y3RzLkNvdW50ID0gMiwgJ2NyYXp5Llh0cnVjdHMuQ291bnQgPSAnK0ludFRvU3RyKGNyYXp5Llh0cnVjdHMuQ291bnQpKTsKLSAgICBnb29kYnllIDo9IGNyYXp5Llh0cnVjdHNbMF07ICAvLyBsaXN0cyBhcmUgb3JkZXJlZCwgc28gd2UgYXJlIGFsbG93ZWQgdG8gYXNzdW1lIHRoaXMgb3JkZXIKLSAgICAgIGhlbGxvICAgOj0gY3JhenkuWHRydWN0c1sxXTsKLQotICAgIEV4cGVjdCggZ29vZGJ5ZS5TdHJpbmdfdGhpbmcgPSAnR29vZGJ5ZTQnLCAnZ29vZGJ5ZS5TdHJpbmdfdGhpbmcgPSAiJytnb29kYnllLlN0cmluZ190aGluZysnIicpOwotICAgIEV4cGVjdCggZ29vZGJ5ZS5CeXRlX3RoaW5nID0gNCwgJ2dvb2RieWUuQnl0ZV90aGluZyA9ICcrSW50VG9TdHIoZ29vZGJ5ZS5CeXRlX3RoaW5nKSk7Ci0gICAgRXhwZWN0KCBnb29kYnllLkkzMl90aGluZyA9IDQsICdnb29kYnllLkkzMl90aGluZyA9ICcrSW50VG9TdHIoZ29vZGJ5ZS5JMzJfdGhpbmcpKTsKLSAgICBFeHBlY3QoIGdvb2RieWUuSTY0X3RoaW5nID0gNCwgJ2dvb2RieWUuSTY0X3RoaW5nID0gJytJbnRUb1N0cihnb29kYnllLkk2NF90aGluZykpOwotICAgIEV4cGVjdCggZ29vZGJ5ZS5fX2lzc2V0X1N0cmluZ190aGluZywgJ2dvb2RieWUuX19pc3NldF9TdHJpbmdfdGhpbmcgPSAnK0Jvb2xUb1N0cmluZyhnb29kYnllLl9faXNzZXRfU3RyaW5nX3RoaW5nKSk7Ci0gICAgRXhwZWN0KCBnb29kYnllLl9faXNzZXRfQnl0ZV90aGluZywgJ2dvb2RieWUuX19pc3NldF9CeXRlX3RoaW5nID0gJytCb29sVG9TdHJpbmcoZ29vZGJ5ZS5fX2lzc2V0X0J5dGVfdGhpbmcpKTsKLSAgICBFeHBlY3QoIGdvb2RieWUuX19pc3NldF9JMzJfdGhpbmcsICdnb29kYnllLl9faXNzZXRfSTMyX3RoaW5nID0gJytCb29sVG9TdHJpbmcoZ29vZGJ5ZS5fX2lzc2V0X0kzMl90aGluZykpOwotICAgIEV4cGVjdCggZ29vZGJ5ZS5fX2lzc2V0X0k2NF90aGluZywgJ2dvb2RieWUuX19pc3NldF9JNjRfdGhpbmcgPSAnK0Jvb2xUb1N0cmluZyhnb29kYnllLl9faXNzZXRfSTY0X3RoaW5nKSk7Ci0KLSAgICBFeHBlY3QoIGhlbGxvLlN0cmluZ190aGluZyA9ICdIZWxsbzInLCAnaGVsbG8uU3RyaW5nX3RoaW5nID0gIicraGVsbG8uU3RyaW5nX3RoaW5nKyciJyk7Ci0gICAgRXhwZWN0KCBoZWxsby5CeXRlX3RoaW5nID0gMiwgJ2hlbGxvLkJ5dGVfdGhpbmcgPSAnK0ludFRvU3RyKGhlbGxvLkJ5dGVfdGhpbmcpKTsKLSAgICBFeHBlY3QoIGhlbGxvLkkzMl90aGluZyA9IDIsICdoZWxsby5JMzJfdGhpbmcgPSAnK0ludFRvU3RyKGhlbGxvLkkzMl90aGluZykpOwotICAgIEV4cGVjdCggaGVsbG8uSTY0X3RoaW5nID0gMiwgJ2hlbGxvLkk2NF90aGluZyA9ICcrSW50VG9TdHIoaGVsbG8uSTY0X3RoaW5nKSk7Ci0gICAgRXhwZWN0KCBoZWxsby5fX2lzc2V0X1N0cmluZ190aGluZywgJ2hlbGxvLl9faXNzZXRfU3RyaW5nX3RoaW5nID0gJytCb29sVG9TdHJpbmcoaGVsbG8uX19pc3NldF9TdHJpbmdfdGhpbmcpKTsKLSAgICBFeHBlY3QoIGhlbGxvLl9faXNzZXRfQnl0ZV90aGluZywgJ2hlbGxvLl9faXNzZXRfQnl0ZV90aGluZyA9ICcrQm9vbFRvU3RyaW5nKGhlbGxvLl9faXNzZXRfQnl0ZV90aGluZykpOwotICAgIEV4cGVjdCggaGVsbG8uX19pc3NldF9JMzJfdGhpbmcsICdoZWxsby5fX2lzc2V0X0kzMl90aGluZyA9ICcrQm9vbFRvU3RyaW5nKGhlbGxvLl9faXNzZXRfSTMyX3RoaW5nKSk7Ci0gICAgRXhwZWN0KCBoZWxsby5fX2lzc2V0X0k2NF90aGluZywgJ2hlbGxvLl9faXNzZXRfSTY0X3RoaW5nID0gJytCb29sVG9TdHJpbmcoaGVsbG8uX19pc3NldF9JNjRfdGhpbmcpKTsKKyAgICBFeHBlY3QoIGNyYXp5Llh0cnVjdHMuQ291bnQgPSBpbnNhbmUuWHRydWN0cy5Db3VudCwgJ2NyYXp5Llh0cnVjdHMuQ291bnQgPSAnK0ludFRvU3RyKGNyYXp5Llh0cnVjdHMuQ291bnQpKTsKKyAgICBmb3IgYXJnMCA6PSAwIHRvIGluc2FuZS5YdHJ1Y3RzLkNvdW50LTEgZG8gYmVnaW4KKyAgICAgIGhlbGxvICAgOj0gaW5zYW5lLlh0cnVjdHNbYXJnMF07CisgICAgICBnb29kYnllIDo9IGNyYXp5Llh0cnVjdHNbYXJnMF07CisgICAgICBFeHBlY3QoIGdvb2RieWUuU3RyaW5nX3RoaW5nID0gaGVsbG8uU3RyaW5nX3RoaW5nLCAnZ29vZGJ5ZS5TdHJpbmdfdGhpbmcgPSAnK2dvb2RieWUuU3RyaW5nX3RoaW5nKTsKKyAgICAgIEV4cGVjdCggZ29vZGJ5ZS5CeXRlX3RoaW5nID0gaGVsbG8uQnl0ZV90aGluZywgJ2dvb2RieWUuQnl0ZV90aGluZyA9ICcrSW50VG9TdHIoZ29vZGJ5ZS5CeXRlX3RoaW5nKSk7CisgICAgICBFeHBlY3QoIGdvb2RieWUuSTMyX3RoaW5nID0gaGVsbG8uSTMyX3RoaW5nLCAnZ29vZGJ5ZS5JMzJfdGhpbmcgPSAnK0ludFRvU3RyKGdvb2RieWUuSTMyX3RoaW5nKSk7CisgICAgICBFeHBlY3QoIGdvb2RieWUuSTY0X3RoaW5nID0gaGVsbG8uSTY0X3RoaW5nLCAnZ29vZGJ5ZS5JNjRfdGhpbmcgPSAnK0ludFRvU3RyKGdvb2RieWUuSTY0X3RoaW5nKSk7CisgICAgZW5kOwogICBlbmQ7CiAKIApAQCAtODgzLDcgKzg5Niw3IEBACiAgICAgRXhwZWN0KCBub3QgaS5fX2lzc2V0X0k2NF90aGluZywgJ2kuX19pc3NldF9JNjRfdGhpbmcgPSAnK0Jvb2xUb1N0cmluZyhpLl9faXNzZXRfSTY0X3RoaW5nKSk7CiAgICAgfQogICBleGNlcHQKLSAgICBvbiBlOkV4Y2VwdGlvbiBkbyBFeHBlY3QoIEZBTFNFLCAnVW5leHBlY3RlZCBleGNlcHRpb24gIicrZS5DbGFzc05hbWUrJyInKTsKKyAgICBvbiBlOkV4Y2VwdGlvbiBkbyBFeHBlY3QoIEZBTFNFLCAnVW5leHBlY3RlZCBleGNlcHRpb24gIicrZS5DbGFzc05hbWUrJyI6ICcrZS5NZXNzYWdlKTsKICAgZW5kOwogCiAgIFN0YXJ0VGVzdEdyb3VwKCAndGVzdE11bHRpRXhjZXB0aW9uKFhjZXB0aW9uKScsIHRlc3RfRXhjZXB0aW9ucyk7CkBAIC04OTcsNyArOTEwLDcgQEAKICAgICAgIEV4cGVjdCggeC5FcnJvckNvZGUgPSAxMDAxLCAneC5FcnJvckNvZGUgPSAnK0ludFRvU3RyKHguRXJyb3JDb2RlKSk7CiAgICAgICBFeHBlY3QoIHguTWVzc2FnZV8gPSAnVGhpcyBpcyBhbiBYY2VwdGlvbicsICd4Lk1lc3NhZ2UgPSAiJyt4Lk1lc3NhZ2VfKyciJyk7CiAgICAgZW5kOwotICAgIG9uIGU6RXhjZXB0aW9uIGRvIEV4cGVjdCggRkFMU0UsICdVbmV4cGVjdGVkIGV4Y2VwdGlvbiAiJytlLkNsYXNzTmFtZSsnIicpOworICAgIG9uIGU6RXhjZXB0aW9uIGRvIEV4cGVjdCggRkFMU0UsICdVbmV4cGVjdGVkIGV4Y2VwdGlvbiAiJytlLkNsYXNzTmFtZSsnIjogJytlLk1lc3NhZ2UpOwogICBlbmQ7CiAKICAgU3RhcnRUZXN0R3JvdXAoICd0ZXN0TXVsdGlFeGNlcHRpb24oWGNlcHRpb24yKScsIHRlc3RfRXhjZXB0aW9ucyk7CkBAIC05MTcsNyArOTMwLDcgQEAKICAgICAgIEV4cGVjdCggbm90IHguU3RydWN0X3RoaW5nLl9faXNzZXRfSTY0X3RoaW5nLCAneC5TdHJ1Y3RfdGhpbmcuX19pc3NldF9JNjRfdGhpbmcgPSAnK0Jvb2xUb1N0cmluZyh4LlN0cnVjdF90aGluZy5fX2lzc2V0X0k2NF90aGluZykpOwogICAgICAgfQogICAgIGVuZDsKLSAgICBvbiBlOkV4Y2VwdGlvbiBkbyBFeHBlY3QoIEZBTFNFLCAnVW5leHBlY3RlZCBleGNlcHRpb24gIicrZS5DbGFzc05hbWUrJyInKTsKKyAgICBvbiBlOkV4Y2VwdGlvbiBkbyBFeHBlY3QoIEZBTFNFLCAnVW5leHBlY3RlZCBleGNlcHRpb24gIicrZS5DbGFzc05hbWUrJyI6ICcrZS5NZXNzYWdlKTsKICAgZW5kOwogCiAKQEAgLTkyOSw3ICs5NDIsNyBAQAogICAvLyBjYWxsIHRpbWUKICAgeyRJRkRFRiBQZXJmVGVzdH0KICAgU3RhcnRUZXN0R3JvdXAoICdUZXN0IENhbGx0aW1lKCknKTsKLSAgU3RhcnRUaWNrIDo9IEdldFRJY2tDb3VudDsKKyAgU3RhcnRUaWNrIDo9IEdldFRpY2tDb3VudDsKICAgZm9yIGsgOj0gMCB0byAxMDAwIC0gMSBkbwogICBiZWdpbgogICAgIGNsaWVudC50ZXN0Vm9pZCgpOwpAQCAtOTQyLDYgKzk1NSwzMyBAQAogZW5kOwogCiAKK3skSUZERUYgU3VwcG9ydHNBc3luY30KK3Byb2NlZHVyZSBUQ2xpZW50VGhyZWFkLkNsaWVudEFzeW5jVGVzdDsKK3ZhcgorICBjbGllbnQgOiBUVGhyaWZ0VGVzdC5JQXN5bmM7CisgIHMgOiBzdHJpbmc7CisgIGk4IDogU2hvcnRJbnQ7CitiZWdpbgorICBTdGFydFRlc3RHcm91cCggJ0FzeW5jIFRlc3RzJywgdGVzdF9Vbmtub3duKTsKKyAgY2xpZW50IDo9IFRUaHJpZnRUZXN0LlRDbGllbnQuQ3JlYXRlKCBGUHJvdG9jb2wpOworICBGVHJhbnNwb3J0Lk9wZW47CisKKyAgLy8gb25ld2F5IHZvaWQgZnVuY3Rpb25zCisgIGNsaWVudC50ZXN0T25ld2F5QXN5bmMoMSkuV2FpdDsKKyAgRXhwZWN0KCBUUlVFLCAnVGVzdCBPbmV3YXkoMSknKTsgIC8vIHN1Y2Nlc3MgOj0gbm8gZXhjZXB0aW9uCisKKyAgLy8gbm9ybWFsIGZ1bmN0aW9ucworICBzIDo9IGNsaWVudC50ZXN0U3RyaW5nQXN5bmMoSFVHRV9URVNUX1NUUklORykuVmFsdWU7CisgIEV4cGVjdCggbGVuZ3RoKHMpID0gbGVuZ3RoKEhVR0VfVEVTVF9TVFJJTkcpLAorICAgICAgICAgICd0ZXN0U3RyaW5nKCBsZW5ndGgoSFVHRV9URVNUX1NUUklORykgPSAnK0ludFRvU3RyKExlbmd0aChIVUdFX1RFU1RfU1RSSU5HKSkrJykgJworICAgICAgICAgKyc9PiBsZW5ndGgocmVzdWx0KSA9ICcrSW50VG9TdHIoTGVuZ3RoKHMpKSk7CisKKyAgaTggOj0gY2xpZW50LnRlc3RCeXRlKDEpLlZhbHVlOworICBFeHBlY3QoIGk4ID0gMSwgJ3Rlc3RCeXRlKDEpID0gJyArIEludFRvU3RyKCBpOCApKTsKK2VuZDsKK3skRU5ESUZ9CisKKwogeyRJRkRFRiBTdHJlc3NUZXN0fQogcHJvY2VkdXJlIFRDbGllbnRUaHJlYWQuU3RyZXNzVGVzdChjb25zdCBjbGllbnQgOiBUVGhyaWZ0VGVzdC5JZmFjZSk7CiBiZWdpbgpAQCAtOTYxLDYgKzEwMDEsNTAgQEAKIGVuZDsKIHskRU5ESUZ9CiAKKworZnVuY3Rpb24gVENsaWVudFRocmVhZC5QcmVwYXJlQmluYXJ5RGF0YSggYVJhbmRvbURpc3QgOiBCb29sZWFuOyBhU2l6ZSA6IFRUZXN0U2l6ZSkgOiBUQnl0ZXM7Cit2YXIgaSA6IEludGVnZXI7CitiZWdpbgorICBjYXNlIGFTaXplIG9mCisgICAgRW1wdHkgICAgICAgICAgOiBTZXRMZW5ndGgoIHJlc3VsdCwgMCk7CisgICAgTm9ybWFsICAgICAgICAgOiBTZXRMZW5ndGgoIHJlc3VsdCwgJDEwMCk7CisgICAgQnl0ZUFycmF5VGVzdCAgOiBTZXRMZW5ndGgoIHJlc3VsdCwgU2l6ZU9mKFRCeXRlQXJyYXkpICsgMTI4KTsKKyAgICBQaXBlV3JpdGVMaW1pdCA6IFNldExlbmd0aCggcmVzdWx0LCA2NTUzNSArIDEyOCk7CisgIGVsc2UKKyAgICByYWlzZSBFQXJndW1lbnRFeGNlcHRpb24uQ3JlYXRlKCdhU2l6ZScpOworICBlbmQ7CisKKyAgQVNTRVJUKCBMb3cocmVzdWx0KSA9IDApOworICBpZiBMZW5ndGgocmVzdWx0KSA9IDAgdGhlbiBFeGl0OworCisgIC8vIGxpbmVhciBkaXN0cmlidXRpb24sIHVubGVzcyByYW5kb20gaXMgcmVxdWVzdGVkCisgIGlmIG5vdCBhUmFuZG9tRGlzdCB0aGVuIGJlZ2luCisgICAgZm9yIGkgOj0gTG93KHJlc3VsdCkgdG8gSGlnaChyZXN1bHQpIGRvIGJlZ2luCisgICAgICByZXN1bHRbaV0gOj0gaSBtb2QgJDEwMDsKKyAgICBlbmQ7CisgICAgRXhpdDsKKyAgZW5kOworCisgIC8vIHJhbmRvbSBkaXN0cmlidXRpb24gb2YgYWxsIDI1NiB2YWx1ZXMKKyAgRmlsbENoYXIoIHJlc3VsdFswXSwgTGVuZ3RoKHJlc3VsdCkgKiBTaXplT2YocmVzdWx0WzBdKSwgJDApOworICBmb3IgaSA6PSBMb3cocmVzdWx0KSB0byBIaWdoKHJlc3VsdCkgZG8gYmVnaW4KKyAgICByZXN1bHRbaV0gOj0gQnl0ZSggUmFuZG9tKCQxMDApKTsKKyAgZW5kOworZW5kOworCisKK3skSUZERUYgV2luNjR9Citwcm9jZWR1cmUgVENsaWVudFRocmVhZC5Vc2VJbnRlcmxvY2tlZEV4Y2hhbmdlQWRkNjQ7Cit2YXIgYSxiIDogSW50NjQ7CitiZWdpbgorICBhIDo9IDE7CisgIGIgOj0gMjsKKyAgVGhyaWZ0LlV0aWxzLkludGVybG9ja2VkRXhjaGFuZ2VBZGQ2NCggYSxiKTsKKyAgRXhwZWN0KCBhID0gMywgJ0ludGVybG9ja2VkRXhjaGFuZ2VBZGQ2NCcpOworZW5kOworeyRFTkRJRn0KKworCiBwcm9jZWR1cmUgVENsaWVudFRocmVhZC5KU09OUHJvdG9jb2xSZWFkV3JpdGVUZXN0OwogLy8gVGVzdHMgb25seSB0aGVuIHJlYWQvd3JpdGUgcHJvY2VkdXJlcyBvZiB0aGUgSlNPTiBwcm90b2NvbAogLy8gQWxsIHRlc3RzIHN1Y2NlZWQsIGlmIHdlIGNhbiByZWFkIHdoYXQgd2Ugd3JvdGUgYmVmb3JlCkBAIC05NjgsOCArMTA1Miw4IEBACiAvLyBvdGhlciBjbGllbnRzIG9yIHNlcnZlcnMgZXhwZWN0IGFzIHRoZSByZWFsIEpTT04uIFRoaXMgaXMgYmV5b25kIHRoZSBzY29wZSBvZiB0aGlzIHRlc3QuCiB2YXIgcHJvdCAgIDogSVByb3RvY29sOwogICAgIHN0bSAgICA6IFRTdHJpbmdTdHJlYW07Ci0gICAgbGlzdCAgIDogSUxpc3Q7Ci0gICAgYmluYXJ5LCBiaW5SZWFkIDogVEJ5dGVzOworICAgIGxpc3QgICA6IFRUaHJpZnRMaXN0OworICAgIGJpbmFyeSwgYmluUmVhZCwgZW1wdHlCaW5hcnkgOiBUQnl0ZXM7CiAgICAgaSxpRXJyIDogSW50ZWdlcjsKIGNvbnN0CiAgIFRFU1RfU0hPUlQgICA9IFNob3J0SW50KCAkRkUpOwpAQCAtOTc5LDkgKzEwNjMsOSBAQAogICBURVNUX0RPVUJMRSAgPSAtMS4yMzRlLTU2OwogICBERUxUQV9ET1VCTEUgPSBURVNUX0RPVUJMRSAqIDFlLTE0OwogICBURVNUX1NUUklORyAgPSAnYWJjLScjJDAwRTQjJDAwZjYjJDAwZmM7IC8vIGdlcm1hbiB1bWxhdXRzIChlbi11czogImZ1bm55IGNoYXJzIikKLSAgLy8gVGVzdCBUSFJJRlQtMjMzNiB3aXRoICfQoNGD0YHRgdC60L7QtSDQndCw0LfQstCw0L3QuNC1JzsKLSAgUlVTU0lBTl9URVhUID0gIyQwNDIwIyQwNDQzIyQwNDQxIyQwNDQxIyQwNDNhIyQwNDNlIyQwNDM1JyAnIyQwNDFkIyQwNDMwIyQwNDM3IyQwNDMyIyQwNDMwIyQwNDNkIyQwNDM4IyQwNDM1OwotICBSVVNTSUFOX0pTT04gPSAnIlx1MDQyMFx1MDQ0M1x1MDQ0MVx1MDQ0MVx1MDQzYVx1MDQzZVx1MDQzNSBcdTA0MWRcdTA0MzBcdTA0MzdcdTA0MzJcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzUiJzsKKyAgLy8gVGVzdCBUSFJJRlQtMjMzNiBhbmQgVEhSSUZULTM0MDQgd2l0aCBVKzFEMTFFIChHIENsZWYgc3ltYm9sKSBhbmQgJ9Cg0YPRgdGB0LrQvtC1INCd0LDQt9Cy0LDQvdC40LUnOworICBHX0NMRUZfQU5EX0NZUklMTElDX1RFWFQgPSAjJDFkMTFlJyAnIyQwNDIwIyQwNDQzIyQwNDQxIyQwNDQxIyQwNDNhIyQwNDNlIyQwNDM1JyAnIyQwNDFkIyQwNDMwIyQwNDM3IyQwNDMyIyQwNDMwIyQwNDNkIyQwNDM4IyQwNDM1OworICBHX0NMRUZfQU5EX0NZUklMTElDX0pTT04gPSAnIlx1ZDgzNFx1ZGQxZSBcdTA0MjBcdTA0NDNcdTA0NDFcdTA0NDFcdTA0M2FcdTA0M2VcdTA0MzUgXHUwNDFkXHUwNDMwXHUwNDM3XHUwNDMyXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM1Iic7CiAgIC8vIHRlc3QgYm90aCBwb3NzaWJsZSBzb2xpZHVzIGVuY29kaW5ncwogICBTT0xJRFVTX0pTT05fREFUQSA9ICcib25lL3R3b1wvdGhyZWUiJzsKICAgU09MSURVU19FWENQRUNURUQgPSAnb25lL3R3by90aHJlZSc7CkBAIC05OTEsOCArMTA3NSw4IEBACiAgICAgU3RhcnRUZXN0R3JvdXAoICdKc29uUHJvdG9jb2xUZXN0JywgdGVzdF9Vbmtub3duKTsKIAogICAgIC8vIHByZXBhcmUgYmluYXJ5IGRhdGEKLSAgICBTZXRMZW5ndGgoIGJpbmFyeSwgJDEwMCk7Ci0gICAgZm9yIGkgOj0gTG93KGJpbmFyeSkgdG8gSGlnaChiaW5hcnkpIGRvIGJpbmFyeVtpXSA6PSBpOworICAgIGJpbmFyeSA6PSBQcmVwYXJlQmluYXJ5RGF0YSggRkFMU0UsIE5vcm1hbCk7CisgICAgU2V0TGVuZ3RoKCBlbXB0eUJpbmFyeSwgMCk7IC8vIGVtcHR5IGJpbmFyeSBkYXRhIGJsb2NrCiAKICAgICAvLyBvdXRwdXQgc2V0dXAKICAgICBwcm90IDo9IFRKU09OUHJvdG9jb2xJbXBsLkNyZWF0ZSgKQEAgLTEwMDAsNyArMTA4NCw4IEBACiAgICAgICAgICAgICAgICAgbmlsLCBUVGhyaWZ0U3RyZWFtQWRhcHRlckRlbHBoaS5DcmVhdGUoIHN0bSwgRkFMU0UpKSk7CiAKICAgICAvLyB3cml0ZQotICAgIHByb3QuV3JpdGVMaXN0QmVnaW4oIFRMaXN0SW1wbC5DcmVhdGUoIFRUeXBlLlN0cmluZ18sIDkpKTsKKyAgICBJbml0KCBsaXN0LCBUVHlwZS5TdHJpbmdfLCA5KTsKKyAgICBwcm90LldyaXRlTGlzdEJlZ2luKCBsaXN0KTsKICAgICBwcm90LldyaXRlQm9vbCggVFJVRSk7CiAgICAgcHJvdC5Xcml0ZUJvb2woIEZBTFNFKTsKICAgICBwcm90LldyaXRlQnl0ZSggVEVTVF9TSE9SVCk7CkBAIC0xMDEwLDYgKzEwOTUsOCBAQAogICAgIHByb3QuV3JpdGVEb3VibGUoIFRFU1RfRE9VQkxFKTsKICAgICBwcm90LldyaXRlU3RyaW5nKCBURVNUX1NUUklORyk7CiAgICAgcHJvdC5Xcml0ZUJpbmFyeSggYmluYXJ5KTsKKyAgICBwcm90LldyaXRlU3RyaW5nKCAnJyk7ICAvLyBlbXB0eSBzdHJpbmcKKyAgICBwcm90LldyaXRlQmluYXJ5KCBlbXB0eUJpbmFyeSk7IC8vIGVtcHR5IGJpbmFyeSBkYXRhIGJsb2NrCiAgICAgcHJvdC5Xcml0ZUxpc3RFbmQ7CiAKICAgICAvLyBpbnB1dCBzZXR1cApAQCAtMTAzMiw2ICsxMTE5LDggQEAKICAgICBFeHBlY3QoIGFicyhwcm90LlJlYWREb3VibGUtVEVTVF9ET1VCTEUpIDwgYWJzKERFTFRBX0RPVUJMRSksICdXcml0ZURvdWJsZS9SZWFkRG91YmxlJyk7CiAgICAgRXhwZWN0KCBwcm90LlJlYWRTdHJpbmcgPSBURVNUX1NUUklORywgJ1dyaXRlU3RyaW5nL1JlYWRTdHJpbmcnKTsKICAgICBiaW5SZWFkIDo9IHByb3QuUmVhZEJpbmFyeTsKKyAgICBFeHBlY3QoIExlbmd0aChwcm90LlJlYWRTdHJpbmcpID0gMCwgJ1dyaXRlU3RyaW5nL1JlYWRTdHJpbmcgKGVtcHR5IHN0cmluZyknKTsKKyAgICBFeHBlY3QoIExlbmd0aChwcm90LlJlYWRCaW5hcnkpID0gMCwgJ2VtcHR5IFdyaXRlQmluYXJ5L1JlYWRCaW5hcnkgKGVtcHR5IGRhdGEgYmxvY2spJyk7CiAgICAgcHJvdC5SZWFkTGlzdEVuZDsKIAogICAgIC8vIHRlc3QgYmluYXJ5IGRhdGEKQEAgLTEwNjksMjIgKzExNTgsMjIgQEAKICAgICBwcm90IDo9IFRKU09OUHJvdG9jb2xJbXBsLkNyZWF0ZSgKICAgICAgICAgICAgICAgVFN0cmVhbVRyYW5zcG9ydEltcGwuQ3JlYXRlKAogICAgICAgICAgICAgICAgIG5pbCwgVFRocmlmdFN0cmVhbUFkYXB0ZXJEZWxwaGkuQ3JlYXRlKCBzdG0sIEZBTFNFKSkpOwotICAgIHByb3QuV3JpdGVTdHJpbmcoIFJVU1NJQU5fVEVYVCk7CisgICAgcHJvdC5Xcml0ZVN0cmluZyggR19DTEVGX0FORF9DWVJJTExJQ19URVhUKTsKICAgICBzdG0uUG9zaXRpb24gOj0gMDsKICAgICBwcm90IDo9IFRKU09OUHJvdG9jb2xJbXBsLkNyZWF0ZSgKICAgICAgICAgICAgICAgVFN0cmVhbVRyYW5zcG9ydEltcGwuQ3JlYXRlKAogICAgICAgICAgICAgICAgIFRUaHJpZnRTdHJlYW1BZGFwdGVyRGVscGhpLkNyZWF0ZSggc3RtLCBGQUxTRSksIG5pbCkpOwotICAgIEV4cGVjdCggcHJvdC5SZWFkU3RyaW5nID0gUlVTU0lBTl9URVhULCAnV3JpdGluZyBKU09OIHdpdGggY2hhcnMgPiA4IGJpdCcpOworICAgIEV4cGVjdCggcHJvdC5SZWFkU3RyaW5nID0gR19DTEVGX0FORF9DWVJJTExJQ19URVhULCAnV3JpdGluZyBKU09OIHdpdGggY2hhcnMgPiA4IGJpdCcpOwogCiAgICAgLy8gV2lkZWNoYXJzIHNob3VsZCB3b3JrIHdpdGggaGV4LWVuY29kaW5nIHRvby4gRG8gdGhleT8KICAgICBzdG0uUG9zaXRpb24gOj0gMDsKICAgICBzdG0uU2l6ZSAgICAgOj0gMDsKLSAgICBzdG0uV3JpdGVTdHJpbmcoIFJVU1NJQU5fSlNPTik7CisgICAgc3RtLldyaXRlU3RyaW5nKCBHX0NMRUZfQU5EX0NZUklMTElDX0pTT04pOwogICAgIHN0bS5Qb3NpdGlvbiA6PSAwOwogICAgIHByb3QgOj0gVEpTT05Qcm90b2NvbEltcGwuQ3JlYXRlKAogICAgICAgICAgICAgICBUU3RyZWFtVHJhbnNwb3J0SW1wbC5DcmVhdGUoCiAgICAgICAgICAgICAgICAgVFRocmlmdFN0cmVhbUFkYXB0ZXJEZWxwaGkuQ3JlYXRlKCBzdG0sIEZBTFNFKSwgbmlsKSk7Ci0gICAgRXhwZWN0KCBwcm90LlJlYWRTdHJpbmcgPSBSVVNTSUFOX1RFWFQsICdSZWFkaW5nIEpTT04gd2l0aCBjaGFycyA+IDggYml0Jyk7CisgICAgRXhwZWN0KCBwcm90LlJlYWRTdHJpbmcgPSBHX0NMRUZfQU5EX0NZUklMTElDX1RFWFQsICdSZWFkaW5nIEpTT04gd2l0aCBjaGFycyA+IDggYml0Jyk7CiAKIAogICBmaW5hbGx5CkBAIC0xMTI0LDcgKzEyMTMsOCBAQAogICAgIC8vIFdlIGhhdmUgYSBmYWlsZWQgdGVzdCEKICAgICAvLyAtPiBpc3N1ZSBEZWJ1Z0JyZWFrIE9OTFkgaWYgYSBkZWJ1Z2dlciBpcyBhdHRhY2hlZCwKICAgICAvLyAtPiB1bmhhbmRsZWQgRGVidWdCcmVha3Mgd291bGQgY2F1c2UgV2luZG93cyB0byB0ZXJtaW5hdGUgdGhlIGFwcCBvdGhlcndpc2UKLSAgICBpZiBJc0RlYnVnZ2VyUHJlc2VudCB0aGVuIGFzbSBpbnQgMyBlbmQ7CisgICAgaWYgSXNEZWJ1Z2dlclByZXNlbnQKKyAgICB0aGVuIHskSUZERUYgQ1BVWDY0fSBEZWJ1Z0JyZWFrIHskRUxTRX0gYXNtIGludCAzIGVuZCB7JEVORElGfTsKICAgZW5kOwogZW5kOwogCkBAIC0xMTY3LDEyICsxMjU3LDExIEBACiBlbmQ7CiAKIAotY29uc3RydWN0b3IgVENsaWVudFRocmVhZC5DcmVhdGUoIGNvbnN0IEFUcmFuc3BvcnQ6IElUcmFuc3BvcnQ7IGNvbnN0IEFQcm90b2NvbCA6IElQcm90b2NvbDsgQU51bUl0ZXJhdGlvbjogSW50ZWdlcik7Citjb25zdHJ1Y3RvciBUQ2xpZW50VGhyZWFkLkNyZWF0ZSggY29uc3QgYVNldHVwIDogVFRlc3RTZXR1cDsgY29uc3QgYU51bUl0ZXJhdGlvbjogSW50ZWdlcik7CiBiZWdpbgotICBpbmhlcml0ZWQgQ3JlYXRlKCBUcnVlICk7CisgIEZTZXR1cCA6PSBhU2V0dXA7CiAgIEZOdW1JdGVyYXRpb24gOj0gQU51bUl0ZXJhdGlvbjsKLSAgRlRyYW5zcG9ydCA6PSBBVHJhbnNwb3J0OwotICBGUHJvdG9jb2wgOj0gQVByb3RvY29sOworCiAgIEZDb25zb2xlIDo9IFRUaHJlYWRDb25zb2xlLkNyZWF0ZSggU2VsZiApOwogICBGQ3VycmVudFRlc3QgOj0gdGVzdF9Vbmtub3duOwogCkBAIC0xMTgwLDYgKzEyNjksOCBAQAogICBGRXJyb3JzIDo9IFRTdHJpbmdMaXN0LkNyZWF0ZTsKICAgRkVycm9ycy5Tb3J0ZWQgOj0gRkFMU0U7CiAgIEZFcnJvcnMuRHVwbGljYXRlcyA6PSBkdXBBY2NlcHQ7CisKKyAgaW5oZXJpdGVkIENyZWF0ZSggVFJVRSk7CiBlbmQ7CiAKIGRlc3RydWN0b3IgVENsaWVudFRocmVhZC5EZXN0cm95OwpAQCAtMTE5MiwzNCArMTI4MywxMzYgQEAKIHByb2NlZHVyZSBUQ2xpZW50VGhyZWFkLkV4ZWN1dGU7CiB2YXIKICAgaSA6IEludGVnZXI7Ci0gIHByb2MgOiBUVGhyZWFkUHJvY2VkdXJlOwogYmVnaW4KICAgLy8gcGVyZm9ybSBhbGwgdGVzdHMKICAgdHJ5CisgICAgeyRJRkRFRiBXaW42NH0KKyAgICBVc2VJbnRlcmxvY2tlZEV4Y2hhbmdlQWRkNjQ7CisgICAgeyRFTkRJRn0KICAgICBKU09OUHJvdG9jb2xSZWFkV3JpdGVUZXN0OwotICAgIGZvciBpIDo9IDAgdG8gRk51bUl0ZXJhdGlvbiAtIDEgZG8KLSAgICBiZWdpbgotICAgICAgQ2xpZW50VGVzdDsKKworICAgIC8vIG11c3QgYmUgcnVuIGluIHRoZSBjb250ZXh0IG9mIHRoZSB0aHJlYWQKKyAgICBJbml0aWFsaXplUHJvdG9jb2xUcmFuc3BvcnRTdGFjazsKKyAgICB0cnkKKyAgICAgIGZvciBpIDo9IDAgdG8gRk51bUl0ZXJhdGlvbiAtIDEgZG8gYmVnaW4KKyAgICAgICAgQ2xpZW50VGVzdDsKKyAgICAgICAgeyRJRkRFRiBTdXBwb3J0c0FzeW5jfQorICAgICAgICBDbGllbnRBc3luY1Rlc3Q7CisgICAgICAgIHskRU5ESUZ9CisgICAgICBlbmQ7CisKKyAgICAgIC8vIHJlcG9ydCB0aGUgb3V0Y29tZQorICAgICAgUmVwb3J0UmVzdWx0czsKKyAgICAgIFNldFJldHVyblZhbHVlKCBDYWxjdWxhdGVFeGl0Q29kZSk7CisKKyAgICBmaW5hbGx5CisgICAgICBTaHV0ZG93blByb3RvY29sVHJhbnNwb3J0U3RhY2s7CiAgICAgZW5kOworCiAgIGV4Y2VwdAogICAgIG9uIGU6RXhjZXB0aW9uIGRvIEV4cGVjdCggRkFMU0UsICd1bmV4cGVjdGVkIGV4Y2VwdGlvbjogIicrZS5tZXNzYWdlKyciJyk7CiAgIGVuZDsKK2VuZDsKIAotICAvLyByZXBvcnQgdGhlIG91dGNvbWUKLSAgUmVwb3J0UmVzdWx0czsKLSAgU2V0UmV0dXJuVmFsdWUoIENhbGN1bGF0ZUV4aXRDb2RlKTsKIAotICAvLyBzaHV0ZG93bgotICBwcm9jIDo9IHByb2NlZHVyZQotICBiZWdpbgotICAgIGlmIEZUcmFuc3BvcnQgPD4gbmlsIHRoZW4KLSAgICBiZWdpbgorcHJvY2VkdXJlIFRDbGllbnRUaHJlYWQuSW5pdGlhbGl6ZVByb3RvY29sVHJhbnNwb3J0U3RhY2s7Cit2YXIKKyAgc3RyZWFtdHJhbnMgOiBJU3RyZWFtVHJhbnNwb3J0OworICBodHRwIDogSUhUVFBDbGllbnQ7CisgIHNVcmwgOiBzdHJpbmc7Citjb25zdAorICBERUJVR19USU1FT1VUICAgPSAzMCAqIDEwMDA7CisgIFJFTEVBU0VfVElNRU9VVCA9IERFRkFVTFRfVEhSSUZUX1RJTUVPVVQ7CisgIFBJUEVfVElNRU9VVCAgICA9IFJFTEVBU0VfVElNRU9VVDsKKyAgSFRUUF9USU1FT1VUUyAgID0gMTAgKiAxMDAwOworYmVnaW4KKyAgLy8gbmVlZGVkIGZvciBIVFRQIGNsaWVudHMgYXMgdGhleSB1dGlsaXplIHRoZSBNU1hNTCBDT00gY29tcG9uZW50cworICBPbGVDaGVjayggQ29Jbml0aWFsaXplKCBuaWwpKTsKKworICBjYXNlIEZTZXR1cC5lbmRwb2ludCBvZgorICAgIHRybnNfU29ja2V0czogYmVnaW4KKyAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCdVc2luZyBzb2NrZXRzICgnK0ZTZXR1cC5ob3N0KycgcG9ydCAnK0ludFRvU3RyKEZTZXR1cC5wb3J0KSsnKScpOworICAgICAgc3RyZWFtdHJhbnMgOj0gVFNvY2tldEltcGwuQ3JlYXRlKCBGU2V0dXAuaG9zdCwgRlNldHVwLnBvcnQgKTsKKyAgICAgIEZUcmFuc3BvcnQgOj0gc3RyZWFtdHJhbnM7CisgICAgZW5kOworCisgICAgdHJuc19IdHRwOiBiZWdpbgorICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoJ1VzaW5nIEhUVFBDbGllbnQnKTsKKyAgICAgIGlmIEZTZXR1cC51c2VTU0wKKyAgICAgIHRoZW4gc1VybCA6PSAnaHR0cDovLycKKyAgICAgIGVsc2Ugc1VybCA6PSAnaHR0cHM6Ly8nOworICAgICAgc1VybCA6PSBzVXJsICsgRlNldHVwLmhvc3Q7CisgICAgICBjYXNlIEZTZXR1cC5wb3J0IG9mCisgICAgICAgIDgwICA6IGlmIEZTZXR1cC51c2VTU0wgdGhlbiBzVXJsIDo9IHNVcmwgKyAnOicrIEludFRvU3RyKEZTZXR1cC5wb3J0KTsKKyAgICAgICAgNDQzIDogaWYgbm90IEZTZXR1cC51c2VTU0wgdGhlbiBzVXJsIDo9IHNVcmwgKyAnOicrIEludFRvU3RyKEZTZXR1cC5wb3J0KTsKKyAgICAgIGVsc2UKKyAgICAgICAgaWYgRlNldHVwLnBvcnQgPiAwIHRoZW4gc1VybCA6PSBzVXJsICsgJzonKyBJbnRUb1N0cihGU2V0dXAucG9ydCk7CisgICAgICBlbmQ7CisgICAgICBodHRwIDo9IFRIVFRQQ2xpZW50SW1wbC5DcmVhdGUoIHNVcmwpOworICAgICAgaHR0cC5EbnNSZXNvbHZlVGltZW91dCA6PSBIVFRQX1RJTUVPVVRTOworICAgICAgaHR0cC5Db25uZWN0aW9uVGltZW91dCA6PSBIVFRQX1RJTUVPVVRTOworICAgICAgaHR0cC5TZW5kVGltZW91dCAgICAgICA6PSBIVFRQX1RJTUVPVVRTOworICAgICAgaHR0cC5SZWFkVGltZW91dCAgICAgICA6PSBIVFRQX1RJTUVPVVRTOworICAgICAgRlRyYW5zcG9ydCA6PSBodHRwOworICAgIGVuZDsKKworICAgIHRybnNfRXZIdHRwOiBiZWdpbgorICAgICAgcmFpc2UgRXhjZXB0aW9uLkNyZWF0ZShFTkRQT0lOVF9UUkFOU1BPUlRTW0ZTZXR1cC5lbmRwb2ludF0rJyB0cmFuc3BvcnQgbm90IGltcGxlbWVudGVkJyk7CisgICAgZW5kOworCisgICAgdHJuc19OYW1lZFBpcGVzOiBiZWdpbgorICAgICAgc3RyZWFtdHJhbnMgOj0gVE5hbWVkUGlwZVRyYW5zcG9ydENsaWVudEVuZEltcGwuQ3JlYXRlKCBGU2V0dXAuc1BpcGVOYW1lLCAwLCBuaWwsIFBJUEVfVElNRU9VVCwgUElQRV9USU1FT1VUKTsKKyAgICAgIEZUcmFuc3BvcnQgOj0gc3RyZWFtdHJhbnM7CisgICAgZW5kOworCisgICAgdHJuc19Bbm9uUGlwZXM6IGJlZ2luCisgICAgICBzdHJlYW10cmFucyA6PSBUQW5vbnltb3VzUGlwZVRyYW5zcG9ydEltcGwuQ3JlYXRlKCBGU2V0dXAuaEFub25SZWFkLCBGU2V0dXAuaEFub25Xcml0ZSwgRkFMU0UpOworICAgICAgRlRyYW5zcG9ydCA6PSBzdHJlYW10cmFuczsKKyAgICBlbmQ7CisKKyAgZWxzZQorICAgIHJhaXNlIEV4Y2VwdGlvbi5DcmVhdGUoJ1VuaGFuZGxlZCBlbmRwb2ludCB0cmFuc3BvcnQnKTsKKyAgZW5kOworICBBU1NFUlQoIEZUcmFuc3BvcnQgPD4gbmlsKTsKKworICAvLyBsYXllcmVkIHRyYW5zcG9ydHMgYXJlIG5vdCByZWFsbHkgbWVhbnQgdG8gYmUgc3RhY2tlZCB1cG9uIGVhY2ggb3RoZXIKKyAgaWYgKHRybnNfRnJhbWVkIGluIEZTZXR1cC5sYXllcmVkKSB0aGVuIGJlZ2luCisgICAgRlRyYW5zcG9ydCA6PSBURnJhbWVkVHJhbnNwb3J0SW1wbC5DcmVhdGUoIEZUcmFuc3BvcnQpOworICBlbmQKKyAgZWxzZSBpZiAodHJuc19CdWZmZXJlZCBpbiBGU2V0dXAubGF5ZXJlZCkgYW5kIChzdHJlYW10cmFucyA8PiBuaWwpIHRoZW4gYmVnaW4KKyAgICBGVHJhbnNwb3J0IDo9IFRCdWZmZXJlZFRyYW5zcG9ydEltcGwuQ3JlYXRlKCBzdHJlYW10cmFucywgMzIpOyAgLy8gc21hbGwgYnVmZmVyIHRvIHRlc3QgcmVhZCgpCisgIGVuZDsKKworICBpZiBGU2V0dXAudXNlU1NMIHRoZW4gYmVnaW4KKyAgICByYWlzZSBFeGNlcHRpb24uQ3JlYXRlKCdTU0wvVExTIG5vdCBpbXBsZW1lbnRlZCcpOworICBlbmQ7CisKKyAgLy8gY3JlYXRlIHByb3RvY29sIGluc3RhbmNlLCBkZWZhdWx0IHRvIEJpbmFyeVByb3RvY29sCisgIGNhc2UgRlNldHVwLnByb3RUeXBlIG9mCisgICAgcHJvdF9CaW5hcnkgIDogIEZQcm90b2NvbCA6PSBUQmluYXJ5UHJvdG9jb2xJbXBsLkNyZWF0ZSggRlRyYW5zcG9ydCwgQklOQVJZX1NUUklDVF9SRUFELCBCSU5BUllfU1RSSUNUX1dSSVRFKTsKKyAgICBwcm90X0pTT04gICAgOiAgRlByb3RvY29sIDo9IFRKU09OUHJvdG9jb2xJbXBsLkNyZWF0ZSggRlRyYW5zcG9ydCk7CisgICAgcHJvdF9Db21wYWN0IDogIEZQcm90b2NvbCA6PSBUQ29tcGFjdFByb3RvY29sSW1wbC5DcmVhdGUoIEZUcmFuc3BvcnQpOworICBlbHNlCisgICAgcmFpc2UgRXhjZXB0aW9uLkNyZWF0ZSgnVW5oYW5kbGVkIHByb3RvY29sJyk7CisgIGVuZDsKKworICBBU1NFUlQoIChGVHJhbnNwb3J0IDw+IG5pbCkgYW5kIChGUHJvdG9jb2wgPD4gbmlsKSk7CitlbmQ7CisKKworcHJvY2VkdXJlIFRDbGllbnRUaHJlYWQuU2h1dGRvd25Qcm90b2NvbFRyYW5zcG9ydFN0YWNrOworYmVnaW4KKyAgdHJ5CisgICAgRlByb3RvY29sIDo9IG5pbDsKKworICAgIGlmIEZUcmFuc3BvcnQgPD4gbmlsIHRoZW4gYmVnaW4KICAgICAgIEZUcmFuc3BvcnQuQ2xvc2U7CiAgICAgICBGVHJhbnNwb3J0IDo9IG5pbDsKICAgICBlbmQ7Ci0gIGVuZDsKIAotICBTeW5jaHJvbml6ZSggcHJvYyApOworICBmaW5hbGx5CisgICAgQ29VbmluaXRpYWxpemU7CisgIGVuZDsKIGVuZDsKIAogCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3Rlc3QvVGVzdENvbnN0YW50cy5wYXMgYi9saWIvZGVscGhpL3Rlc3QvVGVzdENvbnN0YW50cy5wYXMKaW5kZXggZTVhYTZjNS4uMzc5NjlkYyAxMDA2NDQKLS0tIGEvbGliL2RlbHBoaS90ZXN0L1Rlc3RDb25zdGFudHMucGFzCisrKyBiL2xpYi9kZWxwaGkvdGVzdC9UZXN0Q29uc3RhbnRzLnBhcwpAQCAtMjEsNiArMjEsOCBAQAogCiBpbnRlcmZhY2UKIAordXNlcyBTeXNVdGlsczsKKwogdHlwZQogICBUS25vd25Qcm90b2NvbCA9ICgKICAgICBwcm90X0JpbmFyeSwgIC8vIGRlZmF1bHQgYmluYXJ5IHByb3RvY29sCkBAIC0xNDAsOCArMTQyLDIxIEBACiAgICAgICAgICAgICAgICAgICAgKyAnZGlhbSB2b2x1cHR1YS4gQXQgdmVybyBlb3MgZXQgYWNjdXNhbSBldCBqdXN0byBkdW8gZG9sb3JlcyBldCBlYSByZWJ1bS4gU3RldCAnCiAgICAgICAgICAgICAgICAgICAgKyAnY2xpdGEga2FzZCBndWJlcmdyZW4sIG5vIHNlYSB0YWtpbWF0YSBzYW5jdHVzIGVzdCBMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC4gJzsKIAorCitmdW5jdGlvbiBCeXRlc1RvSGV4KCBjb25zdCBieXRlcyA6IFRCeXRlcykgOiBzdHJpbmc7CisKKwogaW1wbGVtZW50YXRpb24KIAotLy8gbm90aGluZworCitmdW5jdGlvbiBCeXRlc1RvSGV4KCBjb25zdCBieXRlcyA6IFRCeXRlcykgOiBzdHJpbmc7Cit2YXIgaSA6IEludGVnZXI7CitiZWdpbgorICByZXN1bHQgOj0gJyc7CisgIGZvciBpIDo9IExvdyhieXRlcykgdG8gSGlnaChieXRlcykgZG8gYmVnaW4KKyAgICByZXN1bHQgOj0gcmVzdWx0ICsgSW50VG9IZXgoYnl0ZXNbaV0sMik7CisgIGVuZDsKK2VuZDsKKwogCiBlbmQuCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3Rlc3QvVGVzdFNlcnZlci5wYXMgYi9saWIvZGVscGhpL3Rlc3QvVGVzdFNlcnZlci5wYXMKaW5kZXggMzVmMWFjOC4uNjljYjE3NSAxMDA2NDQKLS0tIGEvbGliL2RlbHBoaS90ZXN0L1Rlc3RTZXJ2ZXIucGFzCisrKyBiL2xpYi9kZWxwaGkvdGVzdC9UZXN0U2VydmVyLnBhcwpAQCAtMTksNiArMTksNyBAQAogCiB1bml0IFRlc3RTZXJ2ZXI7CiAKK3skSSAuLi9zcmMvVGhyaWZ0LkRlZmluZXMuaW5jfQogeyRXQVJOIFNZTUJPTF9QTEFURk9STSBPRkZ9CiAKIHsuJERFRklORSBSdW5FbmRsZXNzfSAgIC8vIGFjdGl2YXRlIHRvIGludGVyYWN0aXZlbHkgc3RyZXNzLXRlc3QgdGhlIHNlcnZlciBzdG9wIHJvdXRpbmVzIHZpYSBDdHJsK0MKQEAgLTI4LDE4ICsyOSwxOSBAQAogdXNlcwogICBXaW5kb3dzLCBTeXNVdGlscywKICAgR2VuZXJpY3MuQ29sbGVjdGlvbnMsCi0gIFRocmlmdC5Db25zb2xlLAogICBUaHJpZnQuU2VydmVyLAogICBUaHJpZnQuVHJhbnNwb3J0LAogICBUaHJpZnQuVHJhbnNwb3J0LlBpcGVzLAogICBUaHJpZnQuUHJvdG9jb2wsCiAgIFRocmlmdC5Qcm90b2NvbC5KU09OLAorICBUaHJpZnQuUHJvdG9jb2wuQ29tcGFjdCwKICAgVGhyaWZ0LkNvbGxlY3Rpb25zLAogICBUaHJpZnQuVXRpbHMsCiAgIFRocmlmdC5UZXN0LAogICBUaHJpZnQsCiAgIFRlc3RDb25zdGFudHMsCiAgIFRlc3RTZXJ2ZXJFdmVudHMsCisgIENvbnNvbGVIZWxwZXIsCiAgIENvbnRucnM7CiAKIHR5cGUKQEAgLTU3LDExICs1OSwxMyBAQAogICAgICAgICBGU2VydmVyIDogSVNlcnZlcjsKICAgICAgIHByb3RlY3RlZAogICAgICAgICBwcm9jZWR1cmUgdGVzdFZvaWQoKTsKKyAgICAgICAgZnVuY3Rpb24gdGVzdEJvb2wodGhpbmc6IEJvb2xlYW4pOiBCb29sZWFuOwogICAgICAgICBmdW5jdGlvbiB0ZXN0U3RyaW5nKGNvbnN0IHRoaW5nOiBzdHJpbmcpOiBzdHJpbmc7CiAgICAgICAgIGZ1bmN0aW9uIHRlc3RCeXRlKHRoaW5nOiBTaG9ydEludCk6IFNob3J0SW50OwogICAgICAgICBmdW5jdGlvbiB0ZXN0STMyKHRoaW5nOiBJbnRlZ2VyKTogSW50ZWdlcjsKICAgICAgICAgZnVuY3Rpb24gdGVzdEk2NChjb25zdCB0aGluZzogSW50NjQpOiBJbnQ2NDsKICAgICAgICAgZnVuY3Rpb24gdGVzdERvdWJsZShjb25zdCB0aGluZzogRG91YmxlKTogRG91YmxlOworICAgICAgICBmdW5jdGlvbiB0ZXN0QmluYXJ5KGNvbnN0IHRoaW5nOiBUQnl0ZXMpOiBUQnl0ZXM7CiAgICAgICAgIGZ1bmN0aW9uIHRlc3RTdHJ1Y3QoY29uc3QgdGhpbmc6IElYdHJ1Y3QpOiBJWHRydWN0OwogICAgICAgICBmdW5jdGlvbiB0ZXN0TmVzdChjb25zdCB0aGluZzogSVh0cnVjdDIpOiBJWHRydWN0MjsKICAgICAgICAgZnVuY3Rpb24gdGVzdE1hcChjb25zdCB0aGluZzogSVRocmlmdERpY3Rpb25hcnk8SW50ZWdlciwgSW50ZWdlcj4pOiBJVGhyaWZ0RGljdGlvbmFyeTxJbnRlZ2VyLCBJbnRlZ2VyPjsKQEAgLTEzOCw2ICsxNDIsMTIgQEAKICAgUmVzdWx0IDo9IHRoaW5nOwogZW5kOwogCitmdW5jdGlvbiBUVGVzdFNlcnZlci5UVGVzdEhhbmRsZXJJbXBsLnRlc3RCaW5hcnkoY29uc3QgdGhpbmc6IFRCeXRlcyk6IFRCeXRlczsKK2JlZ2luCisgIENvbnNvbGUuV3JpdGVMaW5lKCd0ZXN0QmluYXJ5KCInICsgQnl0ZXNUb0hleCggdGhpbmcgKSArICciKScpOworICBSZXN1bHQgOj0gdGhpbmc7CitlbmQ7CisKIGZ1bmN0aW9uIFRUZXN0U2VydmVyLlRUZXN0SGFuZGxlckltcGwudGVzdEVudW0odGhpbmc6IFROdW1iZXJ6KTogVE51bWJlcno7CiBiZWdpbgogICBDb25zb2xlLldyaXRlTGluZSgndGVzdEVudW0oJyArIEludFRvU3RyKCBJbnRlZ2VyKCB0aGluZykpICsgJyknKTsKQEAgLTE1NCw3ICsxNjQsNyBAQAogCiAgIGlmIChhcmcgPSAnVEV4Y2VwdGlvbicpIHRoZW4KICAgYmVnaW4KLSAgICByYWlzZSBURXhjZXB0aW9uLkNyZWF0ZSgnJyk7CisgICAgcmFpc2UgVEV4Y2VwdGlvbi5DcmVhdGUoJ1RFeGNlcHRpb24nKTsKICAgZW5kOwogCiAgIC8vIGVsc2UgZG8gbm90IHRocm93IGFueXRoaW5nCkBAIC0xNzUsNDQgKzE4NSwzMyBAQAogZnVuY3Rpb24gVFRlc3RTZXJ2ZXIuVFRlc3RIYW5kbGVySW1wbC50ZXN0SW5zYW5pdHkoCiAgIGNvbnN0IGFyZ3VtZW50OiBJSW5zYW5pdHkpOiBJVGhyaWZ0RGljdGlvbmFyeTxJbnQ2NCwgSVRocmlmdERpY3Rpb25hcnk8VE51bWJlcnosIElJbnNhbml0eT4+OwogdmFyCi0gIGhlbGxvLCBnb29kYnllIDogSVh0cnVjdDsKLSAgY3JhenkgOiBJSW5zYW5pdHk7CiAgIGxvb25leSA6IElJbnNhbml0eTsKICAgZmlyc3RfbWFwIDogSVRocmlmdERpY3Rpb25hcnk8VE51bWJlcnosIElJbnNhbml0eT47CiAgIHNlY29uZF9tYXAgOiBJVGhyaWZ0RGljdGlvbmFyeTxUTnVtYmVyeiwgSUluc2FuaXR5PjsKICAgaW5zYW5lIDogSVRocmlmdERpY3Rpb25hcnk8SW50NjQsIElUaHJpZnREaWN0aW9uYXJ5PFROdW1iZXJ6LCBJSW5zYW5pdHk+PjsKIAogYmVnaW4KLQogICBDb25zb2xlLldyaXRlTGluZSgndGVzdEluc2FuaXR5KCknKTsKLSAgaGVsbG8gOj0gVFh0cnVjdEltcGwuQ3JlYXRlOwotICBoZWxsby5TdHJpbmdfdGhpbmcgOj0gJ0hlbGxvMic7Ci0gIGhlbGxvLkJ5dGVfdGhpbmcgOj0gMjsKLSAgaGVsbG8uSTMyX3RoaW5nIDo9IDI7Ci0gIGhlbGxvLkk2NF90aGluZyA6PSAyOwogCi0gIGdvb2RieWUgOj0gVFh0cnVjdEltcGwuQ3JlYXRlOwotICBnb29kYnllLlN0cmluZ190aGluZyA6PSAnR29vZGJ5ZTQnOwotICBnb29kYnllLkJ5dGVfdGhpbmcgOj0gNDsKLSAgZ29vZGJ5ZS5JMzJfdGhpbmcgOj0gNDsKLSAgZ29vZGJ5ZS5JNjRfdGhpbmcgOj0gNDsKLQotICBjcmF6eSA6PSBUSW5zYW5pdHlJbXBsLkNyZWF0ZTsKLSAgY3JhenkuVXNlck1hcCA6PSBUVGhyaWZ0RGljdGlvbmFyeUltcGw8VE51bWJlcnosIEludDY0Pi5DcmVhdGU7Ci0gIGNyYXp5LlVzZXJNYXAuQWRkT3JTZXRWYWx1ZSggVE51bWJlcnouRUlHSFQsIDgpOwotICBjcmF6eS5YdHJ1Y3RzIDo9IFRUaHJpZnRMaXN0SW1wbDxJWHRydWN0Pi5DcmVhdGU7Ci0gIGNyYXp5Llh0cnVjdHMuQWRkKGdvb2RieWUpOwotCi0gIGxvb25leSA6PSBUSW5zYW5pdHlJbXBsLkNyZWF0ZTsKLSAgY3JhenkuVXNlck1hcC5BZGRPclNldFZhbHVlKCBUTnVtYmVyei5GSVZFLCA1KTsKLSAgY3JhenkuWHRydWN0cy5BZGQoaGVsbG8pOworICAoKioKKyAgICogU28geW91IHRoaW5rIHlvdSd2ZSBnb3QgdGhpcyBhbGwgd29ya2VkLCBvdXQgZWg/CisgICAqCisgICAqIENyZWF0ZXMgYSB0aGUgcmV0dXJuZWQgbWFwIHdpdGggdGhlc2UgdmFsdWVzIGFuZCBwcmludHMgaXQgb3V0OgorICAgKiAgIHsgMSA9PiB7IDIgPT4gYXJndW1lbnQsCisgICAqICAgICAgICAgICAgMyA9PiBhcmd1bWVudCwKKyAgICogICAgICAgICAgfSwKKyAgICogICAgIDIgPT4geyA2ID0+IDxlbXB0eSBJbnNhbml0eSBzdHJ1Y3Q+LCB9LAorICAgKiAgIH0KKyAgICogQHJldHVybiBtYXA8VXNlcklkLCBtYXA8TnVtYmVyeixJbnNhbml0eT4+IC0gYSBtYXAgd2l0aCB0aGUgYWJvdmUgdmFsdWVzCisgICAqKQogCiAgIGZpcnN0X21hcCA6PSBUVGhyaWZ0RGljdGlvbmFyeUltcGw8VE51bWJlcnosIElJbnNhbml0eT4uQ3JlYXRlOwogICBzZWNvbmRfbWFwIDo9IFRUaHJpZnREaWN0aW9uYXJ5SW1wbDxUTnVtYmVyeiwgSUluc2FuaXR5Pi5DcmVhdGU7CiAKLSAgZmlyc3RfbWFwLkFkZE9yU2V0VmFsdWUoIFROdW1iZXJ6LlRXTywgY3JhenkpOwotICBmaXJzdF9tYXAuQWRkT3JTZXRWYWx1ZSggVE51bWJlcnouVEhSRUUsIGNyYXp5KTsKKyAgZmlyc3RfbWFwLkFkZE9yU2V0VmFsdWUoIFROdW1iZXJ6LlRXTywgYXJndW1lbnQpOworICBmaXJzdF9tYXAuQWRkT3JTZXRWYWx1ZSggVE51bWJlcnouVEhSRUUsIGFyZ3VtZW50KTsKIAorICBsb29uZXkgOj0gVEluc2FuaXR5SW1wbC5DcmVhdGU7CiAgIHNlY29uZF9tYXAuQWRkT3JTZXRWYWx1ZSggVE51bWJlcnouU0lYLCBsb29uZXkpOwogCiAgIGluc2FuZSA6PSBUVGhyaWZ0RGljdGlvbmFyeUltcGw8SW50NjQsIElUaHJpZnREaWN0aW9uYXJ5PFROdW1iZXJ6LCBJSW5zYW5pdHk+Pi5DcmVhdGU7CkBAIC0zODYsNiArMzg1LDEyIEBACiAgIGVuZDsKIGVuZDsKIAorZnVuY3Rpb24gVFRlc3RTZXJ2ZXIuVFRlc3RIYW5kbGVySW1wbC50ZXN0Qm9vbCh0aGluZzogQm9vbGVhbik6IEJvb2xlYW47CitiZWdpbgorICBDb25zb2xlLldyaXRlTGluZSgndGVzdEJvb2woJyArIEJvb2xUb1N0cih0aGluZyx0cnVlKSArICcpJyk7CisgIFJlc3VsdCA6PSB0aGluZzsKK2VuZDsKKwogZnVuY3Rpb24gVFRlc3RTZXJ2ZXIuVFRlc3RIYW5kbGVySW1wbC50ZXN0U3RyaW5nKCBjb25zdCB0aGluZzogc3RyaW5nKTogc3RyaW5nOwogYmVnaW4KICAgQ29uc29sZS5Xcml0ZUxpbmUoJ3Rlc3RzdHJpbmcoIicgKyB0aGluZyArICciKScpOwpAQCAtNTI5LDExICs1MzQsNiBAQAogICBlbmRwb2ludCA6IFRFbmRwb2ludFRyYW5zcG9ydDsKICAgbGF5ZXJlZCA6IFRMYXllcmVkVHJhbnNwb3J0czsKICAgVXNlU1NMIDogQm9vbGVhbjsgLy8gaW5jbHVkZSB3aGVyZSBhcHByb3ByaWF0ZSAoVExheWVyZWRUcmFuc3BvcnQ/KQotY29uc3QKLSAgLy8gcGlwZSB0aW1lb3V0cyB0byBiZSB1c2VkCi0gIERFQlVHX1RJTUVPVVQgICA9IDMwICogMTAwMDsKLSAgUkVMRUFTRV9USU1FT1VUID0gREVGQVVMVF9USFJJRlRfVElNRU9VVDsgIC8vIHNlcnZlci1zaWRlIGRlZmF1bHQKLSAgVElNRU9VVCAgICAgICAgID0gUkVMRUFTRV9USU1FT1VUOwogYmVnaW4KICAgdHJ5CiAgICAgU2VydmVyRXZlbnRzIDo9IEZBTFNFOwpAQCAtNjM1LDcgKzYzNSw3IEBACiAgICAgY2FzZSBwcm90VHlwZSBvZgogICAgICAgcHJvdF9CaW5hcnkgIDogIFByb3RvY29sRmFjdG9yeSA6PSBUQmluYXJ5UHJvdG9jb2xJbXBsLlRGYWN0b3J5LkNyZWF0ZSggQklOQVJZX1NUUklDVF9SRUFELCBCSU5BUllfU1RSSUNUX1dSSVRFKTsKICAgICAgIHByb3RfSlNPTiAgICA6ICBQcm90b2NvbEZhY3RvcnkgOj0gVEpTT05Qcm90b2NvbEltcGwuVEZhY3RvcnkuQ3JlYXRlOwotICAgICAgcHJvdF9Db21wYWN0IDogIHJhaXNlIEV4Y2VwdGlvbi5DcmVhdGUoJ0NvbXBhY3QgcHJvdG9jb2wgbm90IGltcGxlbWVudGVkJyk7CisgICAgICBwcm90X0NvbXBhY3QgOiAgUHJvdG9jb2xGYWN0b3J5IDo9IFRDb21wYWN0UHJvdG9jb2xJbXBsLlRGYWN0b3J5LkNyZWF0ZTsKICAgICBlbHNlCiAgICAgICByYWlzZSBFeGNlcHRpb24uQ3JlYXRlKCdVbmhhbmRsZWQgcHJvdG9jb2wnKTsKICAgICBlbmQ7CkBAIC02NTEsMTIgKzY1MSwxMiBAQAogICAgICAgZW5kOwogCiAgICAgICB0cm5zX0h0dHAgOiBiZWdpbgotICAgICAgICByYWlzZSBFeGNlcHRpb24uQ3JlYXRlKCdIVFRQIHNlcnZlciB0cmFuc3BvcnQgbm90IGltcGxlbWVudGVkJyk7CisgICAgICAgIHJhaXNlIEV4Y2VwdGlvbi5DcmVhdGUoRU5EUE9JTlRfVFJBTlNQT1JUU1tlbmRwb2ludF0rJyBzZXJ2ZXIgdHJhbnNwb3J0IG5vdCBpbXBsZW1lbnRlZCcpOwogICAgICAgZW5kOwogCiAgICAgICB0cm5zX05hbWVkUGlwZXMgOiBiZWdpbgogICAgICAgICBDb25zb2xlLldyaXRlTGluZSgnLSBuYW1lZCBwaXBlICgnK3NQaXBlTmFtZSsnKScpOwotICAgICAgICBuYW1lZHBpcGUgICA6PSBUTmFtZWRQaXBlU2VydmVyVHJhbnNwb3J0SW1wbC5DcmVhdGUoIHNQaXBlTmFtZSwgNDA5NiwgUElQRV9VTkxJTUlURURfSU5TVEFOQ0VTLCBUSU1FT1VUKTsKKyAgICAgICAgbmFtZWRwaXBlICAgOj0gVE5hbWVkUGlwZVNlcnZlclRyYW5zcG9ydEltcGwuQ3JlYXRlKCBzUGlwZU5hbWUsIDQwOTYsIFBJUEVfVU5MSU1JVEVEX0lOU1RBTkNFUyk7CiAgICAgICAgIHNlcnZlcnRyYW5zIDo9IG5hbWVkcGlwZTsKICAgICAgIGVuZDsKIApkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS90ZXN0L1Rlc3RTZXJ2ZXJFdmVudHMucGFzIGIvbGliL2RlbHBoaS90ZXN0L1Rlc3RTZXJ2ZXJFdmVudHMucGFzCmluZGV4IDJlNzc2ZDIuLjIyMDhjZDQgMTAwNjQ0Ci0tLSBhL2xpYi9kZWxwaGkvdGVzdC9UZXN0U2VydmVyRXZlbnRzLnBhcworKysgYi9saWIvZGVscGhpL3Rlc3QvVGVzdFNlcnZlckV2ZW50cy5wYXMKQEAgLTI3LDcgKzI3LDcgQEAKICAgVGhyaWZ0LlByb3RvY29sLAogICBUaHJpZnQuVHJhbnNwb3J0LAogICBUaHJpZnQuU2VydmVyLAotICBUaHJpZnQuQ29uc29sZTsKKyAgQ29uc29sZUhlbHBlcjsKIAogdHlwZQogICBUUmVxdWVzdEV2ZW50c0ltcGwgPSBjbGFzcyggVEludGVyZmFjZWRPYmplY3QsIElSZXF1ZXN0RXZlbnRzKQpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS90ZXN0L2NsaWVudC5kcHIgYi9saWIvZGVscGhpL3Rlc3QvY2xpZW50LmRwcgppbmRleCBmZDQ3ZDhiLi4wNmRiZDNkIDEwMDY0NAotLS0gYS9saWIvZGVscGhpL3Rlc3QvY2xpZW50LmRwcgorKysgYi9saWIvZGVscGhpL3Rlc3QvY2xpZW50LmRwcgpAQCAtMjgsMTMgKzI4LDE2IEBACiAgIFRocmlmdC5UZXN0LCAvLyBpbiAnZ2VuLWRlbHBoaVxUaHJpZnQuVGVzdC5wYXMnLAogICBUaHJpZnQgaW4gJy4uXHNyY1xUaHJpZnQucGFzJywKICAgVGhyaWZ0LlRyYW5zcG9ydCBpbiAnLi5cc3JjXFRocmlmdC5UcmFuc3BvcnQucGFzJywKKyAgVGhyaWZ0LlNvY2tldCBpbiAnLi5cc3JjXFRocmlmdC5Tb2NrZXQucGFzJywKKyAgVGhyaWZ0LkV4Y2VwdGlvbiBpbiAnLi5cc3JjXFRocmlmdC5FeGNlcHRpb24ucGFzJywKICAgVGhyaWZ0LlRyYW5zcG9ydC5QaXBlcyBpbiAnLi5cc3JjXFRocmlmdC5UcmFuc3BvcnQuUGlwZXMucGFzJywKICAgVGhyaWZ0LlByb3RvY29sIGluICcuLlxzcmNcVGhyaWZ0LlByb3RvY29sLnBhcycsCiAgIFRocmlmdC5Qcm90b2NvbC5KU09OIGluICcuLlxzcmNcVGhyaWZ0LlByb3RvY29sLkpTT04ucGFzJywKKyAgVGhyaWZ0LlByb3RvY29sLkNvbXBhY3QgaW4gJy4uXHNyY1xUaHJpZnQuUHJvdG9jb2wuQ29tcGFjdC5wYXMnLAorICBUaHJpZnQuUHJvdG9jb2wuTXVsdGlwbGV4IGluICcuLlxzcmNcVGhyaWZ0LlByb3RvY29sLk11bHRpcGxleC5wYXMnLAogICBUaHJpZnQuQ29sbGVjdGlvbnMgaW4gJy4uXHNyY1xUaHJpZnQuQ29sbGVjdGlvbnMucGFzJywKICAgVGhyaWZ0LlNlcnZlciBpbiAnLi5cc3JjXFRocmlmdC5TZXJ2ZXIucGFzJywKICAgVGhyaWZ0LlN0cmVhbSBpbiAnLi5cc3JjXFRocmlmdC5TdHJlYW0ucGFzJywKLSAgVGhyaWZ0LkNvbnNvbGUgaW4gJy4uXHNyY1xUaHJpZnQuQ29uc29sZS5wYXMnLAogICBUaHJpZnQuVHlwZVJlZ2lzdHJ5IGluICcuLlxzcmNcVGhyaWZ0LlR5cGVSZWdpc3RyeS5wYXMnLAogICBUaHJpZnQuVXRpbHMgaW4gJy4uXHNyY1xUaHJpZnQuVXRpbHMucGFzJzsKIApAQCAtNDMsMTkgKzQ2LDE5IEBACiAgIGFyZ3MgOiBhcnJheSBvZiBzdHJpbmc7CiAgIGkgOiBJbnRlZ2VyOwogICBhcmcgOiBzdHJpbmc7Ci0gIHMgOiBzdHJpbmc7CiAKIGJlZ2luCiAgIHRyeQogICAgIFdyaXRlbG4oICdEZWxwaGkgVGVzdENsaWVudCAnK1RocmlmdC5WZXJzaW9uKTsKICAgICBuUGFyYW1Db3VudCA6PSBQYXJhbUNvdW50OwogICAgIFNldExlbmd0aCggYXJncywgblBhcmFtQ291bnQpOwotICAgIGZvciBpIDo9IDEgdG8gblBhcmFtQ291bnQgZG8KLSAgICBiZWdpbgorICAgIGZvciBpIDo9IDEgdG8gblBhcmFtQ291bnQgZG8gYmVnaW4KICAgICAgIGFyZyA6PSBQYXJhbVN0ciggaSApOwogICAgICAgYXJnc1tpLTFdIDo9IGFyZzsKICAgICBlbmQ7CisKICAgICBFeGl0Q29kZSA6PSBUVGVzdENsaWVudC5FeGVjdXRlKCBhcmdzKTsKKwogICBleGNlcHQKICAgICBvbiBFOiBFQWJvcnQgZG8gYmVnaW4KICAgICAgIEV4aXRDb2RlIDo9ICRGRjsKZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvdGVzdC9jb2RlZ2VuL1Jlc2VydmVkS2V5d29yZHMudGhyaWZ0IGIvbGliL2RlbHBoaS90ZXN0L2NvZGVnZW4vUmVzZXJ2ZWRLZXl3b3Jkcy50aHJpZnQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwMGFkZjkuLjAwMDAwMDAKLS0tIGEvbGliL2RlbHBoaS90ZXN0L2NvZGVnZW4vUmVzZXJ2ZWRLZXl3b3Jkcy50aHJpZnQKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIG1ha2Ugc3VyZSBnZW5lcmF0ZWQgY29kZSBkb2VzIG5vdCBwcm9kdWNlIG5hbWUgY29sbGlzaW9ucyB3aXRoIHByZWRlZmluZWQga2V5d29yZHMKLQotCi0KLXR5cGVkZWYgaTMyIENhcmRpbmFsCi10eXBlZGVmIHN0cmluZyBtZXNzYWdlCi10eXBlZGVmIGxpc3Q8IG1hcDwgQ2FyZGluYWwsIG1lc3NhZ2U+PiBwcm9ncmFtCi0KLXN0cnVjdCB1bml0IHsKLSAgMTogQ2FyZGluYWwgZG93bnRvOwotICAyOiBwcm9ncmFtIHByb2NlZHVyZTsKLX0KLQotdHlwZWRlZiBzZXQ8IHVuaXQ+IHVuaXRzCi0KLWV4Y2VwdGlvbiBleGNlcHRpb24xIHsKLSAgMTogcHJvZ3JhbSBtZXNzYWdlOwotICAyOiB1bml0IGFycmF5OwotfQotCi1zZXJ2aWNlIGNvbnN0cnVjdG9yIHsKLSAgdW5pdCBDcmVhdGUoMTogQ2FyZGluYWwgYXNtOyAyOiBtZXNzYWdlIGluaGVyaXRlZCkgdGhyb3dzICgxOiBleGNlcHRpb24xIGxhYmVsKTsKLSAgdW5pdHMgRGVzdHJveSgpOwotfQotCi1jb25zdCBDYXJkaW5hbCBkb3dudG8gPSArMQotY29uc3QgQ2FyZGluYWwgcHVibGlzaGVkID0gLTEKLQotZW51bSBrZXl3b3JkcyB7Ci0gIHJlY29yZCA9IDEsCi0gIHJlcGVhdCA9IDIsCi0gIGRlcHJlY2F0ZWQgPSAzCi19Ci0KLQotCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3Rlc3QvY29kZWdlbi9ydW4tUGFzY2FsLUNvZGVnZW4tVGVzdHMuYmF0LnRtcGwgYi9saWIvZGVscGhpL3Rlc3QvY29kZWdlbi9ydW4tUGFzY2FsLUNvZGVnZW4tVGVzdHMuYmF0LnRtcGwKaW5kZXggNDM5ODU0NS4uZGJhYjBhZSAxMDA2NDQKLS0tIGEvbGliL2RlbHBoaS90ZXN0L2NvZGVnZW4vcnVuLVBhc2NhbC1Db2RlZ2VuLVRlc3RzLmJhdC50bXBsCisrKyBiL2xpYi9kZWxwaGkvdGVzdC9jb2RlZ2VuL3J1bi1QYXNjYWwtQ29kZWdlbi1UZXN0cy5iYXQudG1wbApAQCAtNzYsNyArNzYsNyBAQAogZWNoby4KIGVjaG8gR2VuZXJhdGluZyBjb2RlLCBwbGVhc2Ugd2FpdCAuLi4KIGNkICIlVEFSR0VUJSIKLWZvciAlJWEgaW4gKCoudGhyaWZ0KSBkbyAiJUJJTiVcdGhyaWZ0LmV4ZSIgLXYgLS1nZW4gZGVscGhpOmFuc2lzdHJfYmluYXJ5LHJlZ2lzdGVyX3R5cGVzLGNvbnN0cHJlZml4LGV2ZW50cyx4bWxkb2MgIiUlYSIgMj4+ICIlTE9HRklMRSUiCitmb3IgJSVhIGluICgqLnRocmlmdCkgZG8gIiVCSU4lXHRocmlmdC5leGUiIC12IC0tZ2VuIGRlbHBoaTpyZWdpc3Rlcl90eXBlcyxjb25zdHByZWZpeCxldmVudHMseG1sZG9jICIlJWEiIDI+PiAiJUxPR0ZJTEUlIgogUkVNICogZm9yICUlYSBpbiAoKi50aHJpZnQpIGRvICIlQklOJVx0aHJpZnQuZXhlIiAtdiAtLWdlbiBjcHAgIiUlYSIgPj4gTlVMOgogY21kIC9jIHN0YXJ0IG5vdGVwYWQgIiVMT0dGSUxFJSIKIGNkIC4uCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3Rlc3Qva2V5d29yZHMvUmVzZXJ2ZWRJbmNsdWRlZC50aHJpZnQgYi9saWIvZGVscGhpL3Rlc3Qva2V5d29yZHMvUmVzZXJ2ZWRJbmNsdWRlZC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI0N2E1MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZWxwaGkvdGVzdC9rZXl3b3Jkcy9SZXNlcnZlZEluY2x1ZGVkLnRocmlmdApAQCAtMCwwICsxLDI1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIG1ha2Ugc3VyZSBnZW5lcmF0ZWQgY29kZSBkb2VzIG5vdCBwcm9kdWNlIG5hbWUgY29sbGlzaW9ucyB3aXRoIHByZWRlZmluZWQga2V5d29yZHMKK25hbWVzcGFjZSBkZWxwaGkgU3lzVXRpbHMKKworY29uc3QgaTMyIGludGVnZXIgPSA0MgorCisvLyBFT0YKZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvdGVzdC9rZXl3b3Jkcy9SZXNlcnZlZEtleXdvcmRzLmRwciBiL2xpYi9kZWxwaGkvdGVzdC9rZXl3b3Jkcy9SZXNlcnZlZEtleXdvcmRzLmRwcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmJjOGMxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RlbHBoaS90ZXN0L2tleXdvcmRzL1Jlc2VydmVkS2V5d29yZHMuZHByCkBAIC0wLDAgKzEsMTUgQEAKK3Byb2dyYW0gUmVzZXJ2ZWRLZXl3b3JkczsKKworeyRBUFBUWVBFIENPTlNPTEV9CisKK3VzZXMKKyAgU3lzVXRpbHMsIFN5c3RlbV87CisKK2JlZ2luCisgIHRyeQorICAgIHsgVE9ETyAtb1VzZXIgLWNDb25zb2xlIE1haW4gOiBDb2RlIGhpZXIgZWluZvxnZW4gfQorICBleGNlcHQKKyAgICBvbiBFOiBFeGNlcHRpb24gZG8KKyAgICAgIFdyaXRlbG4oRS5DbGFzc05hbWUsICc6ICcsIEUuTWVzc2FnZSk7CisgIGVuZDsKK2VuZC4KZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvdGVzdC9rZXl3b3Jkcy9SZXNlcnZlZEtleXdvcmRzLmRwcm9qIGIvbGliL2RlbHBoaS90ZXN0L2tleXdvcmRzL1Jlc2VydmVkS2V5d29yZHMuZHByb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJkOTU0NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZWxwaGkvdGVzdC9rZXl3b3Jkcy9SZXNlcnZlZEtleXdvcmRzLmRwcm9qCkBAIC0wLDAgKzEsMTEyIEBACivvu78JPFByb2plY3QgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+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+IFNlbGY7Cit9CisKK3N0cnVjdCBTdHJ1Y3Rfc3RydWN0cyB7CisgIDE6IFN0cnVjdF9zaW1wbGUgaW5pdDsKKyAgMjogU3RydWN0X3NpbXBsZSBzdHJ1YzsKKyAgMzogU3RydWN0X3NpbXBsZSBmaWVsZDsKKyAgNDogU3RydWN0X3NpbXBsZSBmaWVsZF87CisgIDU6IFN0cnVjdF9zaW1wbGUgdHJhY2tlcjsKKyAgNjogU3RydWN0X3NpbXBsZSBTZWxmOworfQorCitzdHJ1Y3QgU3RydWN0X3NpbXBsZSB7CisgIDE6IGJvb2wgaW5pdDsKKyAgMjogYm9vbCBzdHJ1YzsKKyAgMzogYm9vbCBmaWVsZDsKKyAgNDogYm9vbCBmaWVsZF87CisgIDU6IGJvb2wgdHJhY2tlcjsKKyAgNjogYm9vbCBTZWxmOworfQorCitzdHJ1Y3QgU3RydWN0X3N0cmluZ3MgeworICAxOiBzdHJpbmcgaW5pdDsKKyAgMjogc3RyaW5nIHN0cnVjOworICAzOiBzdHJpbmcgZmllbGQ7CisgIDQ6IHN0cmluZyBmaWVsZF87CisgIDU6IHN0cmluZyB0cmFja2VyOworICA2OiBzdHJpbmcgU2VsZjsKK30KKworc3RydWN0IFN0cnVjdF9iaW5hcnkgeworICAxOiBiaW5hcnkgaW5pdDsKKyAgMjogYmluYXJ5IHN0cnVjOworICAzOiBiaW5hcnkgZmllbGQ7CisgIDQ6IGJpbmFyeSBmaWVsZF87CisgIDU6IGJpbmFyeSB0cmFja2VyOworICA2OiBiaW5hcnkgU2VsZjsKK30KKworCit0eXBlZGVmIGkzMiBJUHJvdG9jb2wgCit0eXBlZGVmIGkzMiBJVHJhbnNwb3J0Cit0eXBlZGVmIGkzMiBJRmFjZQordHlwZWRlZiBpMzIgSUFzeW5jCit0eXBlZGVmIGkzMiBTeXN0ZW0KK3R5cGVkZWYgaTMyIFN5c1V0aWxzCit0eXBlZGVmIGkzMiBHZW5lcmljcwordHlwZWRlZiBpMzIgVGhyaWZ0CisKK3N0cnVjdCBTdHJ1Y3RfVGhyaWZ0X05hbWVzIHsKKyAgMTogSVByb3RvY29sICAgSVByb3RvY29sCisgIDI6IElUcmFuc3BvcnQgIElUcmFuc3BvcnQKKyAgMzogSUZhY2UgICAgICAgSUZhY2UKKyAgNDogSUFzeW5jICAgICAgSUFzeW5jCisgIDU6IFN5c3RlbSAgICAgIFN5c3RlbQorICA2OiBTeXNVdGlscyAgICBTeXNVdGlscworICA3OiBHZW5lcmljcyAgICBHZW5lcmljcworICA4OiBUaHJpZnQgICAgICBUaHJpZnQKK30KKworCitlbnVtIFRocmlmdDQ1NTRfRW51bSB7CisgIEZvbyA9IDAsCisgIEJhciA9IDEsCisgIEJheiA9IDIsCit9CisKK3N0cnVjdCBUaHJpZnQ0NTU0X1N0cnVjdCB7CisgIDEgOiBvcHRpb25hbCBkb3VibGUgTWluVmFsdWUKKyAgMiA6IG9wdGlvbmFsIGRvdWJsZSBNYXhWYWx1ZQorICAzIDogb3B0aW9uYWwgYm9vbCBJbnRlZ2VyICAvLyBjYXVzZXMgaXNzdWUKKyAgNCA6IG9wdGlvbmFsIFRocmlmdDQ1NTRfRW51bSBGb28KK30KKworCisvLyBFT0YKZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvdGVzdC9tdWx0aXBsZXhlZC9NdWx0aXBsZXguQ2xpZW50Lk1haW4ucGFzIGIvbGliL2RlbHBoaS90ZXN0L211bHRpcGxleGVkL011bHRpcGxleC5DbGllbnQuTWFpbi5wYXMKaW5kZXggMzRlZTA4MS4uMzVmZGY2ZiAxMDA2NDQKLS0tIGEvbGliL2RlbHBoaS90ZXN0L211bHRpcGxleGVkL011bHRpcGxleC5DbGllbnQuTWFpbi5wYXMKKysrIGIvbGliL2RlbHBoaS90ZXN0L211bHRpcGxleGVkL011bHRpcGxleC5DbGllbnQuTWFpbi5wYXMKQEAgLTc4LDcgKzc4LDcgQEAKIAogY29uc3RydWN0b3IgVFRlc3RDbGllbnQuQ3JlYXRlKCBjb25zdCBhcmdzOiBhcnJheSBvZiBzdHJpbmcpOwogYmVnaW4KLSAgaW5oZXJpdGVkOworICBpbmhlcml0ZWQgQ3JlYXRlOwogICBQYXJzZUFyZ3MoYXJncyk7CiAgIFNldHVwOwogZW5kOwpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS90ZXN0L211bHRpcGxleGVkL011bHRpcGxleC5TZXJ2ZXIuTWFpbi5wYXMgYi9saWIvZGVscGhpL3Rlc3QvbXVsdGlwbGV4ZWQvTXVsdGlwbGV4LlNlcnZlci5NYWluLnBhcwppbmRleCAzN2Y4NGJiLi4zODYwZjVhIDEwMDY0NAotLS0gYS9saWIvZGVscGhpL3Rlc3QvbXVsdGlwbGV4ZWQvTXVsdGlwbGV4LlNlcnZlci5NYWluLnBhcworKysgYi9saWIvZGVscGhpL3Rlc3QvbXVsdGlwbGV4ZWQvTXVsdGlwbGV4LlNlcnZlci5NYWluLnBhcwpAQCAtMjgsNyArMjgsNiBAQAogdXNlcwogICBXaW5kb3dzLCBTeXNVdGlscywKICAgR2VuZXJpY3MuQ29sbGVjdGlvbnMsCi0gIFRocmlmdC5Db25zb2xlLAogICBUaHJpZnQuU2VydmVyLAogICBUaHJpZnQuVHJhbnNwb3J0LAogICBUaHJpZnQuVHJhbnNwb3J0LlBpcGVzLApAQCAtNDEsNiArNDAsNyBAQAogICBCZW5jaG1hcmssICAvLyBpbiBnZW4tZGVscGhpIGZvbGRlcgogICBBZ2dyLCAgICAgICAvLyBpbiBnZW4tZGVscGhpIGZvbGRlcgogICBNdWx0aXBsZXguVGVzdC5Db21tb24sCisgIENvbnNvbGVIZWxwZXIsCiAgIENvbnRucnM7CiAKIHR5cGUKZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvdGVzdC9tdWx0aXBsZXhlZC9NdWx0aXBsZXguVGVzdC5DbGllbnQuZHByIGIvbGliL2RlbHBoaS90ZXN0L211bHRpcGxleGVkL011bHRpcGxleC5UZXN0LkNsaWVudC5kcHIKaW5kZXggZjdjY2JhMS4uNDI3OGQ4ZiAxMDA2NDQKLS0tIGEvbGliL2RlbHBoaS90ZXN0L211bHRpcGxleGVkL011bHRpcGxleC5UZXN0LkNsaWVudC5kcHIKKysrIGIvbGliL2RlbHBoaS90ZXN0L211bHRpcGxleGVkL011bHRpcGxleC5UZXN0LkNsaWVudC5kcHIKQEAgLTI2LDYgKzI2LDggQEAKICAgU3lzVXRpbHMsCiAgIE11bHRpcGxleC5DbGllbnQuTWFpbiBpbiAnTXVsdGlwbGV4LkNsaWVudC5NYWluLnBhcycsCiAgIFRocmlmdCBpbiAnLi5cLi5cc3JjXFRocmlmdC5wYXMnLAorICBUaHJpZnQuU29ja2V0IGluICcuLlwuLlxzcmNcVGhyaWZ0LlNvY2tldC5wYXMnLAorICBUaHJpZnQuRXhjZXB0aW9uIGluICcuLlwuLlxzcmNcVGhyaWZ0LkV4Y2VwdGlvbi5wYXMnLAogICBUaHJpZnQuVHJhbnNwb3J0IGluICcuLlwuLlxzcmNcVGhyaWZ0LlRyYW5zcG9ydC5wYXMnLAogICBUaHJpZnQuVHJhbnNwb3J0LlBpcGVzIGluICcuLlwuLlxzcmNcVGhyaWZ0LlRyYW5zcG9ydC5QaXBlcy5wYXMnLAogICBUaHJpZnQuUHJvdG9jb2wgaW4gJy4uXC4uXHNyY1xUaHJpZnQuUHJvdG9jb2wucGFzJywKQEAgLTMzLDcgKzM1LDcgQEAKICAgVGhyaWZ0LkNvbGxlY3Rpb25zIGluICcuLlwuLlxzcmNcVGhyaWZ0LkNvbGxlY3Rpb25zLnBhcycsCiAgIFRocmlmdC5TZXJ2ZXIgaW4gJy4uXC4uXHNyY1xUaHJpZnQuU2VydmVyLnBhcycsCiAgIFRocmlmdC5TdHJlYW0gaW4gJy4uXC4uXHNyY1xUaHJpZnQuU3RyZWFtLnBhcycsCi0gIFRocmlmdC5Db25zb2xlIGluICcuLlwuLlxzcmNcVGhyaWZ0LkNvbnNvbGUucGFzJywKKyAgVGhyaWZ0LlR5cGVSZWdpc3RyeSBpbiAnLi5cLi5cc3JjXFRocmlmdC5UeXBlUmVnaXN0cnkucGFzJywKICAgVGhyaWZ0LlV0aWxzIGluICcuLlwuLlxzcmNcVGhyaWZ0LlV0aWxzLnBhcyc7CiAKIHZhcgpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS90ZXN0L211bHRpcGxleGVkL011bHRpcGxleC5UZXN0LlNlcnZlci5kcHIgYi9saWIvZGVscGhpL3Rlc3QvbXVsdGlwbGV4ZWQvTXVsdGlwbGV4LlRlc3QuU2VydmVyLmRwcgppbmRleCBjZjAzYzQ0Li4xMjA0NjJiIDEwMDY0NAotLS0gYS9saWIvZGVscGhpL3Rlc3QvbXVsdGlwbGV4ZWQvTXVsdGlwbGV4LlRlc3QuU2VydmVyLmRwcgorKysgYi9saWIvZGVscGhpL3Rlc3QvbXVsdGlwbGV4ZWQvTXVsdGlwbGV4LlRlc3QuU2VydmVyLmRwcgpAQCAtMjQsNyArMjQsMTAgQEAKIHVzZXMKICAgU3lzVXRpbHMsCiAgIE11bHRpcGxleC5TZXJ2ZXIuTWFpbiBpbiAnTXVsdGlwbGV4LlNlcnZlci5NYWluLnBhcycsCisgIENvbnNvbGVIZWxwZXIgaW4gJy4uXENvbnNvbGVIZWxwZXIucGFzJywKICAgVGhyaWZ0IGluICcuLlwuLlxzcmNcVGhyaWZ0LnBhcycsCisgIFRocmlmdC5FeGNlcHRpb24gaW4gJy4uXC4uXHNyY1xUaHJpZnQuRXhjZXB0aW9uLnBhcycsCisgIFRocmlmdC5Tb2NrZXQgaW4gJy4uXC4uXHNyY1xUaHJpZnQuU29ja2V0LnBhcycsCiAgIFRocmlmdC5UcmFuc3BvcnQgaW4gJy4uXC4uXHNyY1xUaHJpZnQuVHJhbnNwb3J0LnBhcycsCiAgIFRocmlmdC5UcmFuc3BvcnQuUGlwZXMgaW4gJy4uXC4uXHNyY1xUaHJpZnQuVHJhbnNwb3J0LlBpcGVzLnBhcycsCiAgIFRocmlmdC5Qcm90b2NvbCBpbiAnLi5cLi5cc3JjXFRocmlmdC5Qcm90b2NvbC5wYXMnLApAQCAtMzIsOCArMzUsOCBAQAogICBUaHJpZnQuUHJvY2Vzc29yLk11bHRpcGxleCBpbiAnLi5cLi5cc3JjXFRocmlmdC5Qcm9jZXNzb3IuTXVsdGlwbGV4LnBhcycsCiAgIFRocmlmdC5Db2xsZWN0aW9ucyBpbiAnLi5cLi5cc3JjXFRocmlmdC5Db2xsZWN0aW9ucy5wYXMnLAogICBUaHJpZnQuU2VydmVyIGluICcuLlwuLlxzcmNcVGhyaWZ0LlNlcnZlci5wYXMnLAotICBUaHJpZnQuQ29uc29sZSBpbiAnLi5cLi5cc3JjXFRocmlmdC5Db25zb2xlLnBhcycsCiAgIFRocmlmdC5VdGlscyBpbiAnLi5cLi5cc3JjXFRocmlmdC5VdGlscy5wYXMnLAorICBUaHJpZnQuVHlwZVJlZ2lzdHJ5IGluICcuLlwuLlxzcmNcVGhyaWZ0LlR5cGVSZWdpc3RyeS5wYXMnLAogICBUaHJpZnQuU3RyZWFtIGluICcuLlwuLlxzcmNcVGhyaWZ0LlN0cmVhbS5wYXMnOwogCiB2YXIKZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvdGVzdC9zZXJpYWxpemVyL1Rlc3RTZXJpYWxpemVyLkRhdGEucGFzIGIvbGliL2RlbHBoaS90ZXN0L3NlcmlhbGl6ZXIvVGVzdFNlcmlhbGl6ZXIuRGF0YS5wYXMKaW5kZXggMzBkOWRkNC4uNWZjMDA3MCAxMDA2NDQKLS0tIGEvbGliL2RlbHBoaS90ZXN0L3NlcmlhbGl6ZXIvVGVzdFNlcmlhbGl6ZXIuRGF0YS5wYXMKKysrIGIvbGliL2RlbHBoaS90ZXN0L3NlcmlhbGl6ZXIvVGVzdFNlcmlhbGl6ZXIuRGF0YS5wYXMKQEAgLTIyLDYgKzIyLDcgQEAKIGludGVyZmFjZQogCiB1c2VzCisgIFN5c1V0aWxzLAogICBUaHJpZnQuQ29sbGVjdGlvbnMsCiAgIERlYnVnUHJvdG9UZXN0OwogCkBAIC0xOTQsNyArMTk1LDcgQEAKICAgeyRJRiBjRGVidWdQcm90b1Rlc3RfT3B0aW9uX0Fuc2lTdHJfQmluYXJ5fQogICByZXN1bHQuU2V0QmFzZTY0KCdiYXNlNjQnKTsKICAgeyRFTFNFfQotICBub3QgeWV0IGltcGwKKyAgcmVzdWx0LlNldEJhc2U2NCggVEVuY29kaW5nLlVURjguR2V0Qnl0ZXMoJ2Jhc2U2NCcpKTsKICAgeyRJRkVORH0KIAogICAvLyBieXRlLCBpMTYsIGFuZCBpNjQgbGlzdHMgYXJlIHBvcHVsYXRlZCBieSBkZWZhdWx0IGNvbnN0cnVjdG9yCkBAIC0zMzgsNyArMzM5LDcgQEAKICAgeyRJRiBjRGVidWdQcm90b1Rlc3RfT3B0aW9uX0Fuc2lTdHJfQmluYXJ5fQogICByZXN1bHQuQV9iaW5hcnkgOj0gQW5zaVN0cmluZyggIzAjMSMyIzMjNCM1IzYjNyM4KTsKICAgeyRFTFNFfQotICBub3QgeWV0IGltcGwKKyAgcmVzdWx0LkFfYmluYXJ5IDo9IFRFbmNvZGluZy5VVEY4LkdldEJ5dGVzKCAjMCMxIzIjMyM0IzUjNiM3IzgpOwogICB7JElGRU5EfQogZW5kOwogCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3Rlc3Qvc2VyaWFsaXplci9UZXN0U2VyaWFsaXplci5kcHIgYi9saWIvZGVscGhpL3Rlc3Qvc2VyaWFsaXplci9UZXN0U2VyaWFsaXplci5kcHIKaW5kZXggM2Q5YTQ1My4uNTFlMjJhNCAxMDA2NDQKLS0tIGEvbGliL2RlbHBoaS90ZXN0L3NlcmlhbGl6ZXIvVGVzdFNlcmlhbGl6ZXIuZHByCisrKyBiL2xpYi9kZWxwaGkvdGVzdC9zZXJpYWxpemVyL1Rlc3RTZXJpYWxpemVyLmRwcgpAQCAtMjQsMTYgKzI0LDE4IEBACiB1c2VzCiAgIENsYXNzZXMsIFdpbmRvd3MsIFN5c1V0aWxzLCBHZW5lcmljcy5Db2xsZWN0aW9ucywKICAgVGhyaWZ0IGluICcuLlwuLlxzcmNcVGhyaWZ0LnBhcycsCisgIFRocmlmdC5FeGNlcHRpb24gaW4gJy4uXC4uXHNyY1xUaHJpZnQuRXhjZXB0aW9uLnBhcycsCisgIFRocmlmdC5Tb2NrZXQgaW4gJy4uXC4uXHNyY1xUaHJpZnQuU29ja2V0LnBhcycsCiAgIFRocmlmdC5UcmFuc3BvcnQgaW4gJy4uXC4uXHNyY1xUaHJpZnQuVHJhbnNwb3J0LnBhcycsCiAgIFRocmlmdC5Qcm90b2NvbCBpbiAnLi5cLi5cc3JjXFRocmlmdC5Qcm90b2NvbC5wYXMnLAogICBUaHJpZnQuUHJvdG9jb2wuSlNPTiBpbiAnLi5cLi5cc3JjXFRocmlmdC5Qcm90b2NvbC5KU09OLnBhcycsCiAgIFRocmlmdC5Db2xsZWN0aW9ucyBpbiAnLi5cLi5cc3JjXFRocmlmdC5Db2xsZWN0aW9ucy5wYXMnLAogICBUaHJpZnQuU2VydmVyIGluICcuLlwuLlxzcmNcVGhyaWZ0LlNlcnZlci5wYXMnLAotICBUaHJpZnQuQ29uc29sZSBpbiAnLi5cLi5cc3JjXFRocmlmdC5Db25zb2xlLnBhcycsCiAgIFRocmlmdC5VdGlscyBpbiAnLi5cLi5cc3JjXFRocmlmdC5VdGlscy5wYXMnLAogICBUaHJpZnQuU2VyaWFsaXplciBpbiAnLi5cLi5cc3JjXFRocmlmdC5TZXJpYWxpemVyLnBhcycsCiAgIFRocmlmdC5TdHJlYW0gaW4gJy4uXC4uXHNyY1xUaHJpZnQuU3RyZWFtLnBhcycsCiAgIFRocmlmdC5UeXBlUmVnaXN0cnkgaW4gJy4uXC4uXHNyY1xUaHJpZnQuVHlwZVJlZ2lzdHJ5LnBhcycsCisgIFN5c3RlbV8sCiAgIERlYnVnUHJvdG9UZXN0LAogICBUZXN0U2VyaWFsaXplci5EYXRhOwogCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3Rlc3Qvc2VydmVyLmRwciBiL2xpYi9kZWxwaGkvdGVzdC9zZXJ2ZXIuZHByCmluZGV4IGQzMGQ4NGIuLmI1ZTQ4YTYgMTAwNjQ0Ci0tLSBhL2xpYi9kZWxwaGkvdGVzdC9zZXJ2ZXIuZHByCisrKyBiL2xpYi9kZWxwaGkvdGVzdC9zZXJ2ZXIuZHByCkBAIC0yNywxMyArMjcsMTcgQEAKICAgVGVzdFNlcnZlckV2ZW50cyBpbiAnVGVzdFNlcnZlckV2ZW50cy5wYXMnLAogICBUaHJpZnQuVGVzdCwgIC8vIGluIGdlbi1kZWxwaGkgZm9sZGVyCiAgIFRocmlmdCBpbiAnLi5cc3JjXFRocmlmdC5wYXMnLAorICBUaHJpZnQuRXhjZXB0aW9uIGluICcuLlxzcmNcVGhyaWZ0LkV4Y2VwdGlvbi5wYXMnLAogICBUaHJpZnQuVHJhbnNwb3J0IGluICcuLlxzcmNcVGhyaWZ0LlRyYW5zcG9ydC5wYXMnLAorICBUaHJpZnQuU29ja2V0IGluICcuLlxzcmNcVGhyaWZ0LlNvY2tldC5wYXMnLAogICBUaHJpZnQuVHJhbnNwb3J0LlBpcGVzIGluICcuLlxzcmNcVGhyaWZ0LlRyYW5zcG9ydC5QaXBlcy5wYXMnLAogICBUaHJpZnQuUHJvdG9jb2wgaW4gJy4uXHNyY1xUaHJpZnQuUHJvdG9jb2wucGFzJywKICAgVGhyaWZ0LlByb3RvY29sLkpTT04gaW4gJy4uXHNyY1xUaHJpZnQuUHJvdG9jb2wuSlNPTi5wYXMnLAorICBUaHJpZnQuUHJvdG9jb2wuQ29tcGFjdCBpbiAnLi5cc3JjXFRocmlmdC5Qcm90b2NvbC5Db21wYWN0LnBhcycsCisgIFRocmlmdC5Qcm90b2NvbC5NdWx0aXBsZXggaW4gJy4uXHNyY1xUaHJpZnQuUHJvdG9jb2wuTXVsdGlwbGV4LnBhcycsCisgIFRocmlmdC5Qcm9jZXNzb3IuTXVsdGlwbGV4IGluICcuLlxzcmNcVGhyaWZ0LlByb2Nlc3Nvci5NdWx0aXBsZXgucGFzJywKICAgVGhyaWZ0LkNvbGxlY3Rpb25zIGluICcuLlxzcmNcVGhyaWZ0LkNvbGxlY3Rpb25zLnBhcycsCiAgIFRocmlmdC5TZXJ2ZXIgaW4gJy4uXHNyY1xUaHJpZnQuU2VydmVyLnBhcycsCi0gIFRocmlmdC5Db25zb2xlIGluICcuLlxzcmNcVGhyaWZ0LkNvbnNvbGUucGFzJywKICAgVGhyaWZ0LlR5cGVSZWdpc3RyeSBpbiAnLi5cc3JjXFRocmlmdC5UeXBlUmVnaXN0cnkucGFzJywKICAgVGhyaWZ0LlV0aWxzIGluICcuLlxzcmNcVGhyaWZ0LlV0aWxzLnBhcycsCiAgIFRocmlmdC5TdHJlYW0gaW4gJy4uXHNyY1xUaHJpZnQuU3RyZWFtLnBhcyc7CkBAIC00MywxOSArNDcsMTkgQEAKICAgYXJncyA6IGFycmF5IG9mIHN0cmluZzsKICAgaSA6IEludGVnZXI7CiAgIGFyZyA6IHN0cmluZzsKLSAgcyA6IHN0cmluZzsKIAogYmVnaW4KICAgdHJ5CiAgICAgV3JpdGVsbiggJ0RlbHBoaSBUZXN0U2VydmVyICcrVGhyaWZ0LlZlcnNpb24pOwogICAgIG5QYXJhbUNvdW50IDo9IFBhcmFtQ291bnQ7CiAgICAgU2V0TGVuZ3RoKCBhcmdzLCBuUGFyYW1Db3VudCk7Ci0gICAgZm9yIGkgOj0gMSB0byBuUGFyYW1Db3VudCBkbwotICAgIGJlZ2luCisgICAgZm9yIGkgOj0gMSB0byBuUGFyYW1Db3VudCBkbyBiZWdpbgogICAgICAgYXJnIDo9IFBhcmFtU3RyKCBpICk7CiAgICAgICBhcmdzW2ktMV0gOj0gYXJnOwogICAgIGVuZDsKKwogICAgIFRUZXN0U2VydmVyLkV4ZWN1dGUoIGFyZ3MgKTsKKwogICBleGNlcHQKICAgICBvbiBFOiBFQWJvcnQgZG8gYmVnaW4KICAgICAgIEV4aXRDb2RlIDo9ICRGRjsKZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvdGVzdC9za2lwL1JFQURNRS5tZCBiL2xpYi9kZWxwaGkvdGVzdC9za2lwL1JFQURNRS5tZAppbmRleCA5OTc1YTBiLi5mMzQ5MzY4IDEwMDY0NAotLS0gYS9saWIvZGVscGhpL3Rlc3Qvc2tpcC9SRUFETUUubWQKKysrIGIvbGliL2RlbHBoaS90ZXN0L3NraXAvUkVBRE1FLm1kCkBAIC0zLDcgKzMsNyBAQAogb2YgdGhlIHNhbWUgcHJvdG9jb2wuCiAKIFRoZSBpbnRlbnRpb24gb2YgdGhpcyB0ZXN0IGlzIHRvIGVuc3VyZSBmdWxseQotd29ya2luZyBjb21wYXRpYmlsdHkgZmVhdHVyZXMgb2YgdGhlIERlbHBoaSBUaHJpZnQKK3dvcmtpbmcgY29tcGF0aWJpbGl0eSBmZWF0dXJlcyBvZiB0aGUgRGVscGhpIFRocmlmdAogaW1wbGVtZW50YXRpb24uCiAKIFRoZSBleHBlY3RlZCB0ZXN0IHJlc3VsdCBpcywgdGhhdCBubyBlcnJvcnMgb2NjdXIKZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvdGVzdC9za2lwL3NraXB0ZXN0X3ZlcnNpb24xLmRwciBiL2xpYi9kZWxwaGkvdGVzdC9za2lwL3NraXB0ZXN0X3ZlcnNpb24xLmRwcgppbmRleCBlODczZjI5Li44MDNkNmJkIDEwMDY0NAotLS0gYS9saWIvZGVscGhpL3Rlc3Qvc2tpcC9za2lwdGVzdF92ZXJzaW9uMS5kcHIKKysrIGIvbGliL2RlbHBoaS90ZXN0L3NraXAvc2tpcHRlc3RfdmVyc2lvbjEuZHByCkBAIC0yNSwxMyArMjUsMTUgQEAKICAgQ2xhc3NlcywgV2luZG93cywgU3lzVXRpbHMsCiAgIFNraXB0ZXN0Lk9uZSwKICAgVGhyaWZ0IGluICcuLlwuLlxzcmNcVGhyaWZ0LnBhcycsCisgIFRocmlmdC5FeGNlcHRpb24gaW4gJy4uXC4uXHNyY1xUaHJpZnQuRXhjZXB0aW9uLnBhcycsCisgIFRocmlmdC5Tb2NrZXQgaW4gJy4uXC4uXHNyY1xUaHJpZnQuU29ja2V0LnBhcycsCiAgIFRocmlmdC5UcmFuc3BvcnQgaW4gJy4uXC4uXHNyY1xUaHJpZnQuVHJhbnNwb3J0LnBhcycsCiAgIFRocmlmdC5Qcm90b2NvbCBpbiAnLi5cLi5cc3JjXFRocmlmdC5Qcm90b2NvbC5wYXMnLAogICBUaHJpZnQuUHJvdG9jb2wuSlNPTiBpbiAnLi5cLi5cc3JjXFRocmlmdC5Qcm90b2NvbC5KU09OLnBhcycsCiAgIFRocmlmdC5Db2xsZWN0aW9ucyBpbiAnLi5cLi5cc3JjXFRocmlmdC5Db2xsZWN0aW9ucy5wYXMnLAogICBUaHJpZnQuU2VydmVyIGluICcuLlwuLlxzcmNcVGhyaWZ0LlNlcnZlci5wYXMnLAotICBUaHJpZnQuQ29uc29sZSBpbiAnLi5cLi5cc3JjXFRocmlmdC5Db25zb2xlLnBhcycsCiAgIFRocmlmdC5VdGlscyBpbiAnLi5cLi5cc3JjXFRocmlmdC5VdGlscy5wYXMnLAorICBUaHJpZnQuVHlwZVJlZ2lzdHJ5IGluICcuLlwuLlxzcmNcVGhyaWZ0LlR5cGVSZWdpc3RyeS5wYXMnLAogICBUaHJpZnQuU3RyZWFtIGluICcuLlwuLlxzcmNcVGhyaWZ0LlN0cmVhbS5wYXMnOwogCiBjb25zdApAQCAtNDIsNyArNDQsNyBAQAogZnVuY3Rpb24gQ3JlYXRlUGluZyA6IElQaW5nOwogYmVnaW4KICAgcmVzdWx0IDo9IFRQaW5nSW1wbC5DcmVhdGU7Ci0gIHJlc3VsdC5WZXJzaW9uMSAgOj0gU2tpcHRlc3QuT25lLlRDb25zdGFudHMuU0tJUFRFU1RTRVJWSUNFX1ZFUlNJT047CisgIHJlc3VsdC5WZXJzaW9uMSAgOj0gVHNraXB0ZXN0X3ZlcnNpb25fMUNvbnN0YW50cy5TS0lQVEVTVFNFUlZJQ0VfVkVSU0lPTjsKIGVuZDsKIAogCkBAIC05NSw3ICs5Nyw3IEBACiAgICAgY2xpZW50IDo9IG5pbDsgIC8vIG5vdCBGcmVlIQogICAgIGNsaVJlZiA6PSBuaWw7CiAgICAgc3RtLkZyZWU7Ci0gICAgaWYgY2xpZW50ID0gbmlsIHRoZW4ge3dhcm5pbmcgc3VwcmVzc2VkfTsKKyAgICBpZiBjbGllbnQgPSBuaWwgdGhlbiB7d2FybmluZyBzdXBwcmVzc2VkfTsKICAgZW5kOwogCiAgIERlbGV0ZUZpbGUoIGZuYW1lK1JFUVVFU1RfRVhUKTsKQEAgLTEyMiw3ICsxMjQsNyBAQAogICAgIGNsaWVudCA6PSBuaWw7ICAvLyBub3QgRnJlZSEKICAgICBjbGlSZWYgOj0gbmlsOwogICAgIHN0bS5GcmVlOwotICAgIGlmIGNsaWVudCA9IG5pbCB0aGVuIHt3YXJuaW5nIHN1cHJlc3NlZH07CisgICAgaWYgY2xpZW50ID0gbmlsIHRoZW4ge3dhcm5pbmcgc3VwcHJlc3NlZH07CiAgIGVuZDsKIGVuZDsKIApAQCAtMTQ5LDcgKzE1MSw3IEBACiAgICAgc2VydmVyIDo9IG5pbDsgIC8vIG5vdCBGcmVlIQogICAgIHN0bUluLkZyZWU7CiAgICAgc3RtT3V0LkZyZWU7Ci0gICAgaWYgc2VydmVyID0gbmlsIHRoZW4ge3dhcm5pbmcgc3VwcmVzc2VkfTsKKyAgICBpZiBzZXJ2ZXIgPSBuaWwgdGhlbiB7d2FybmluZyBzdXBwcmVzc2VkfTsKICAgZW5kOwogCiAgIERlbGV0ZUZpbGUoIGZuYW1lK1JFU1BPTlNFX0VYVCk7CkBAIC0xNzcsNyArMTc5LDcgQEAKICAgRklMRV9KU09OICAgPSAncGluZ3BvbmcuanNvbic7CiBiZWdpbgogICB0cnkKLSAgICBXcml0ZWxuKCAnRGVscGhpIFNraXBUZXN0ICcrSW50VG9TdHIoVENvbnN0YW50cy5TS0lQVEVTVFNFUlZJQ0VfVkVSU0lPTikrJyB1c2luZyAnK1RocmlmdC5WZXJzaW9uKTsKKyAgICBXcml0ZWxuKCAnRGVscGhpIFNraXBUZXN0ICcrSW50VG9TdHIoVHNraXB0ZXN0X3ZlcnNpb25fMUNvbnN0YW50cy5TS0lQVEVTVFNFUlZJQ0VfVkVSU0lPTikrJyB1c2luZyAnK1RocmlmdC5WZXJzaW9uKTsKIAogICAgIFdyaXRlbG47CiAgICAgV3JpdGVsbignQmluYXJ5IHByb3RvY29sJyk7CmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3Rlc3Qvc2tpcC9za2lwdGVzdF92ZXJzaW9uMi5kcHIgYi9saWIvZGVscGhpL3Rlc3Qvc2tpcC9za2lwdGVzdF92ZXJzaW9uMi5kcHIKaW5kZXggNzYxNTI1MS4uNjMzYjI0NyAxMDA2NDQKLS0tIGEvbGliL2RlbHBoaS90ZXN0L3NraXAvc2tpcHRlc3RfdmVyc2lvbjIuZHByCisrKyBiL2xpYi9kZWxwaGkvdGVzdC9za2lwL3NraXB0ZXN0X3ZlcnNpb24yLmRwcgpAQCAtMjUsMTMgKzI1LDE1IEBACiAgIENsYXNzZXMsIFdpbmRvd3MsIFN5c1V0aWxzLAogICBTa2lwdGVzdC5Ud28sCiAgIFRocmlmdCBpbiAnLi5cLi5cc3JjXFRocmlmdC5wYXMnLAorICBUaHJpZnQuRXhjZXB0aW9uIGluICcuLlwuLlxzcmNcVGhyaWZ0LkV4Y2VwdGlvbi5wYXMnLAorICBUaHJpZnQuU29ja2V0IGluICcuLlwuLlxzcmNcVGhyaWZ0LlNvY2tldC5wYXMnLAogICBUaHJpZnQuVHJhbnNwb3J0IGluICcuLlwuLlxzcmNcVGhyaWZ0LlRyYW5zcG9ydC5wYXMnLAogICBUaHJpZnQuUHJvdG9jb2wgaW4gJy4uXC4uXHNyY1xUaHJpZnQuUHJvdG9jb2wucGFzJywKICAgVGhyaWZ0LlByb3RvY29sLkpTT04gaW4gJy4uXC4uXHNyY1xUaHJpZnQuUHJvdG9jb2wuSlNPTi5wYXMnLAogICBUaHJpZnQuQ29sbGVjdGlvbnMgaW4gJy4uXC4uXHNyY1xUaHJpZnQuQ29sbGVjdGlvbnMucGFzJywKICAgVGhyaWZ0LlNlcnZlciBpbiAnLi5cLi5cc3JjXFRocmlmdC5TZXJ2ZXIucGFzJywKLSAgVGhyaWZ0LkNvbnNvbGUgaW4gJy4uXC4uXHNyY1xUaHJpZnQuQ29uc29sZS5wYXMnLAogICBUaHJpZnQuVXRpbHMgaW4gJy4uXC4uXHNyY1xUaHJpZnQuVXRpbHMucGFzJywKKyAgVGhyaWZ0LlR5cGVSZWdpc3RyeSBpbiAnLi5cLi5cc3JjXFRocmlmdC5UeXBlUmVnaXN0cnkucGFzJywKICAgVGhyaWZ0LlN0cmVhbSBpbiAnLi5cLi5cc3JjXFRocmlmdC5TdHJlYW0ucGFzJzsKIAogY29uc3QKQEAgLTQzLDcgKzQ1LDcgQEAKICAgICBzZXRfIDogSUhhc2hTZXQ8c3RyaW5nPjsKIGJlZ2luCiAgIHJlc3VsdCA6PSBUUGluZ0ltcGwuQ3JlYXRlOwotICByZXN1bHQuVmVyc2lvbjEgIDo9IFNraXB0ZXN0LlR3by5UQ29uc3RhbnRzLlNLSVBURVNUU0VSVklDRV9WRVJTSU9OOworICByZXN1bHQuVmVyc2lvbjEgIDo9IFRza2lwdGVzdF92ZXJzaW9uXzJDb25zdGFudHMuU0tJUFRFU1RTRVJWSUNFX1ZFUlNJT047CiAgIHJlc3VsdC5Cb29sVmFsICAgOj0gVFJVRTsKICAgcmVzdWx0LkJ5dGVWYWwgICA6PSAyOwogICByZXN1bHQuRGJWYWwgICAgIDo9IDM7CkBAIC0xMjEsNyArMTIzLDcgQEAKICAgICBjbGllbnQgOj0gbmlsOyAgLy8gbm90IEZyZWUhCiAgICAgY2xpUmVmIDo9IG5pbDsKICAgICBzdG0uRnJlZTsKLSAgICBpZiBjbGllbnQgPSBuaWwgdGhlbiB7d2FybmluZyBzdXByZXNzZWR9OworICAgIGlmIGNsaWVudCA9IG5pbCB0aGVuIHt3YXJuaW5nIHN1cHByZXNzZWR9OwogICBlbmQ7CiAKICAgRGVsZXRlRmlsZSggZm5hbWUrUkVRVUVTVF9FWFQpOwpAQCAtMTQ5LDcgKzE1MSw3IEBACiAgICAgY2xpZW50IDo9IG5pbDsgIC8vIG5vdCBGcmVlIQogICAgIGNsaVJlZiA6PSBuaWw7CiAgICAgc3RtLkZyZWU7Ci0gICAgaWYgY2xpZW50ID0gbmlsIHRoZW4ge3dhcm5pbmcgc3VwcmVzc2VkfTsKKyAgICBpZiBjbGllbnQgPSBuaWwgdGhlbiB7d2FybmluZyBzdXBwcmVzc2VkfTsKICAgZW5kOwogZW5kOwogCkBAIC0xNzYsNyArMTc4LDcgQEAKICAgICBzZXJ2ZXIgOj0gbmlsOyAgLy8gbm90IEZyZWUhCiAgICAgc3RtSW4uRnJlZTsKICAgICBzdG1PdXQuRnJlZTsKLSAgICBpZiBzZXJ2ZXIgPSBuaWwgdGhlbiB7d2FybmluZyBzdXByZXNzZWR9OworICAgIGlmIHNlcnZlciA9IG5pbCB0aGVuIHt3YXJuaW5nIHN1cHByZXNzZWR9OwogICBlbmQ7CiAKICAgRGVsZXRlRmlsZSggZm5hbWUrUkVTUE9OU0VfRVhUKTsKQEAgLTIwNCw3ICsyMDYsNyBAQAogICBGSUxFX0pTT04gICA9ICdwaW5ncG9uZy5qc29uJzsKIGJlZ2luCiAgIHRyeQotICAgIFdyaXRlbG4oICdEZWxwaGkgU2tpcFRlc3QgJytJbnRUb1N0cihUQ29uc3RhbnRzLlNLSVBURVNUU0VSVklDRV9WRVJTSU9OKSsnIHVzaW5nICcrVGhyaWZ0LlZlcnNpb24pOworICAgIFdyaXRlbG4oICdEZWxwaGkgU2tpcFRlc3QgJytJbnRUb1N0cihUc2tpcHRlc3RfdmVyc2lvbl8yQ29uc3RhbnRzLlNLSVBURVNUU0VSVklDRV9WRVJTSU9OKSsnIHVzaW5nICcrVGhyaWZ0LlZlcnNpb24pOwogCiAgICAgV3JpdGVsbjsKICAgICBXcml0ZWxuKCdCaW5hcnkgcHJvdG9jb2wnKTsKZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvdGVzdC90eXBlcmVnaXN0cnkvVGVzdFR5cGVSZWdpc3RyeS5kcHIgYi9saWIvZGVscGhpL3Rlc3QvdHlwZXJlZ2lzdHJ5L1Rlc3RUeXBlUmVnaXN0cnkuZHByCmluZGV4IDlhNjUwM2EuLjE4YTdjN2QgMTAwNjQ0Ci0tLSBhL2xpYi9kZWxwaGkvdGVzdC90eXBlcmVnaXN0cnkvVGVzdFR5cGVSZWdpc3RyeS5kcHIKKysrIGIvbGliL2RlbHBoaS90ZXN0L3R5cGVyZWdpc3RyeS9UZXN0VHlwZVJlZ2lzdHJ5LmRwcgpAQCAtMjUsMTEgKzI1LDEyIEBACiAgIENsYXNzZXMsIFdpbmRvd3MsIFN5c1V0aWxzLCBHZW5lcmljcy5Db2xsZWN0aW9ucywgVHlwSW5mbywKICAgVGhyaWZ0IGluICcuLlwuLlxzcmNcVGhyaWZ0LnBhcycsCiAgIFRocmlmdC5UcmFuc3BvcnQgaW4gJy4uXC4uXHNyY1xUaHJpZnQuVHJhbnNwb3J0LnBhcycsCisgIFRocmlmdC5FeGNlcHRpb24gaW4gJy4uXC4uXHNyY1xUaHJpZnQuRXhjZXB0aW9uLnBhcycsCisgIFRocmlmdC5Tb2NrZXQgaW4gJy4uXC4uXHNyY1xUaHJpZnQuU29ja2V0LnBhcycsCiAgIFRocmlmdC5Qcm90b2NvbCBpbiAnLi5cLi5cc3JjXFRocmlmdC5Qcm90b2NvbC5wYXMnLAogICBUaHJpZnQuUHJvdG9jb2wuSlNPTiBpbiAnLi5cLi5cc3JjXFRocmlmdC5Qcm90b2NvbC5KU09OLnBhcycsCiAgIFRocmlmdC5Db2xsZWN0aW9ucyBpbiAnLi5cLi5cc3JjXFRocmlmdC5Db2xsZWN0aW9ucy5wYXMnLAogICBUaHJpZnQuU2VydmVyIGluICcuLlwuLlxzcmNcVGhyaWZ0LlNlcnZlci5wYXMnLAotICBUaHJpZnQuQ29uc29sZSBpbiAnLi5cLi5cc3JjXFRocmlmdC5Db25zb2xlLnBhcycsCiAgIFRocmlmdC5VdGlscyBpbiAnLi5cLi5cc3JjXFRocmlmdC5VdGlscy5wYXMnLAogICBUaHJpZnQuU2VyaWFsaXplciBpbiAnLi5cLi5cc3JjXFRocmlmdC5TZXJpYWxpemVyLnBhcycsCiAgIFRocmlmdC5TdHJlYW0gaW4gJy4uXC4uXHNyY1xUaHJpZnQuU3RyZWFtLnBhcycsCmRpZmYgLS1naXQgYS9saWIvZXJsL01ha2VmaWxlLmFtIGIvbGliL2VybC9NYWtlZmlsZS5hbQppbmRleCA2MGM3ZTVhLi4wNjMyM2I0IDEwMDY0NAotLS0gYS9saWIvZXJsL01ha2VmaWxlLmFtCisrKyBiL2xpYi9lcmwvTWFrZWZpbGUuYW0KQEAgLTE4LDIxICsxOCw0NCBAQAogIwogCiBUSFJJRlQgPSAuLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0CitUSFJJRlRfT01JVF9GSUxFID0gdGVzdC9UaHJpZnRfb21pdF93aXRob3V0LnRocmlmdAogVEhSSUZUX0ZJTEVTID0gJCh3aWxkY2FyZCB0ZXN0LyoudGhyaWZ0KSBcCisJCSAgJChUSFJJRlRfT01JVF9GSUxFKSBcCisJCSAgLi4vLi4vdGVzdC9Db25zdGFudHNEZW1vLnRocmlmdCBcCisJCSAgLi4vLi4vdGVzdC9OYW1lQ29uZmxpY3RUZXN0LnRocmlmdCBcCisJCSAgLi4vLi4vdGVzdC9Eb3VibGVDb25zdGFudHNUZXN0LnRocmlmdCBcCiAJCSAgLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdAogCi0uZ2VuZXJhdGVkOiAkKFRIUklGVF9GSUxFUykKK2lmIEVSTEFOR19PVFAxNgorRVJMX0ZMQUcgPSBlcmw6b3RwMTYKK0VSTF9GTEFHX0xFR0FDWSA9IGVybDpvdHAxNixsZWdhY3luYW1lcworIyBvdHAxNiArIG1hcHMgZG9lcyBub3QgbWFrZSBzZW5zZS4gV2UgbmVlZCB0byBnZW5lcmF0ZSBpdCBhbnl3YXkgdG8gYXZvaWQgaW5jbHVkZSBlcnJvci4KK0VSTF9GTEFHX01BUFMgPSBlcmw6b3RwMTYKK2Vsc2UKK0VSTF9GTEFHID0gZXJsCitFUkxfRkxBR19MRUdBQ1kgPSBlcmw6bGVnYWN5bmFtZXMKK0VSTF9GTEFHX01BUFMgPSBlcmw6bWFwcworZW5kaWYKKworJChUSFJJRlRfT01JVF9GSUxFKTogdGVzdC9UaHJpZnRfb21pdF93aXRoLnRocmlmdAorCWdyZXAgLXYgb21pdCAkPCA+JEAKKworLmdlbmVyYXRlZDogJChUSFJJRlQpICQoVEhSSUZUX0ZJTEVTKQogCWZvciBmIGluICQoVEhSSUZUX0ZJTEVTKSA7IGRvIFwKLQkgICQoVEhSSUZUKSAtLWdlbiBlcmwgLW8gdGVzdCAkJGYgOyBcCi0JZG9uZSA7IFwKKwkJJChUSFJJRlQpIC0tZ2VuICQoRVJMX0ZMQUcpIC1vIHRlc3QgJCRmIDsgXAorCWRvbmUKKwkkKFRIUklGVCkgLS1nZW4gJChFUkxfRkxBR19MRUdBQ1kpIC1vIHRlc3QgdGVzdC9mbGFncy9MZWdhY3lOYW1lcy50aHJpZnQKKwkkKFRIUklGVCkgLS1nZW4gJChFUkxfRkxBR19NQVBTKSAtbyB0ZXN0IHRlc3QvZmxhZ3MvVGhyaWZ0MzIxNC50aHJpZnQKIAl0b3VjaCAuZ2VuZXJhdGVkCiAKIGFsbDogLmdlbmVyYXRlZAotCS4vcmViYXIgZ2V0LWRlcHMKLQkuL3JlYmFyIGNvbXBpbGUKKwkkKFJFQkFSKSBnZXQtZGVwcworCSQoUkVCQVIpIGNvbXBpbGUKIAogY2hlY2s6IC5nZW5lcmF0ZWQKLQkuL3JlYmFyIHNraXBfZGVwcz10cnVlIGV1bml0CisJJChSRUJBUikgLUMgcmViYXIudGVzdC5jb25maWcgZ2V0LWRlcHMKKwkkKFJFQkFSKSAtQyByZWJhci50ZXN0LmNvbmZpZyBjb21waWxlCisJJChSRUJBUikgLUMgcmViYXIudGVzdC5jb25maWcgc2tpcF9kZXBzPXRydWUgZXVuaXQKIAogaW5zdGFsbDogYWxsCiAJbWtkaXIgLXAgJChERVNURElSKSQoRVJMQU5HX0lOU1RBTExfTElCX0RJUl90aHJpZnQpIDsgXApAQCAtNDksNyArNzIsOCBAQAogY2xlYW46CiAJcm0gLWYgLmdlbmVyYXRlZAogCXJtIC1yZiB0ZXN0L2dlbi1lcmwvCi0JLi9yZWJhciBjbGVhbgorCXJtIC1mICQoVEhSSUZUX09NSVRfRklMRSkKKwkkKFJFQkFSKSBjbGVhbgogCiBtYWludGFpbmVyLWNsZWFuLWxvY2FsOgogCXJtIC1yZiBlYmluCkBAIC01Nyw4ICs4MSwxMCBAQAogRVhUUkFfRElTVCA9IFwKIAlpbmNsdWRlIFwKIAlzcmMgXAotCXJlYmFyIFwKKwljb2Rpbmdfc3RhbmRhcmRzLm1kIFwKIAlyZWJhci5jb25maWcgXAorCXJlYmFyLmNvbmZpZy5zY3JpcHQgXAorCXJlYmFyLnRlc3QuY29uZmlnIFwKIAl0ZXN0IFwKIAlSRUFETUUubWQKIApkaWZmIC0tZ2l0IGEvbGliL2VybC9SRUFETUUubWQgYi9saWIvZXJsL1JFQURNRS5tZAppbmRleCA1MjhkM2NlLi40MzNkMDVjIDEwMDY0NAotLS0gYS9saWIvZXJsL1JFQURNRS5tZAorKysgYi9saWIvZXJsL1JFQURNRS5tZApAQCAtMzEsNyArMzEsOCBAQAogCiBFeGFtcGxlIHNlc3Npb24gdXNpbmcgdGhyaWZ0X2NsaWVudDoKIAotMT4ge29rLCBDMH0gPSB0aHJpZnRfY2xpZW50X3V0aWw6bmV3KCJsb2NhbGhvc3QiLCA5MDkwLCB0aHJpZnRUZXN0X3RocmlmdCwgW10pLCBvay4KK2BgYGVybAorMT4ge29rLCBDMH0gPSB0aHJpZnRfY2xpZW50X3V0aWw6bmV3KCJsb2NhbGhvc3QiLCA5MDkwLCB0aHJpZnRfdGVzdF90aHJpZnQsIFtdKSwgb2suCiBvawogMj4ge0MxLCBSMX0gPSB0aHJpZnRfY2xpZW50OmNhbGwoQzAsIHRlc3RWb2lkLCBbXSksIFIxLgoge29rLG9rfQpAQCAtNDcsMyArNDgsNCBAQAoge29rLG9rfQogOD4ge0M3LCBSN30gPSAoY2F0Y2ggdGhyaWZ0X2NsaWVudDpjYWxsKEM2LCB0ZXN0RXhjZXB0aW9uLCBbIlhjZXB0aW9uIl0pKSwgUjcuCiB7ZXhjZXB0aW9uLHt4Y2VwdGlvbiwxMDAxLDw8IlhjZXB0aW9uIj4+fX0KK2BgYApkaWZmIC0tZ2l0IGEvbGliL2VybC9jb2Rpbmdfc3RhbmRhcmRzLm1kIGIvbGliL2VybC9jb2Rpbmdfc3RhbmRhcmRzLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkMzdkYmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL2NvZGluZ19zdGFuZGFyZHMubWQKQEAgLTAsMCArMSwzIEBACitQbGVhc2UgZm9sbG93IFtHZW5lcmFsIENvZGluZyBTdGFuZGFyZHNdKC9kb2MvY29kaW5nX3N0YW5kYXJkcy5tZCkKKworUGFydGljdWxhcmx5IGZvciBFcmxhbmcgcGxlYXNlIGZvbGxvdyB0aGUgRXJsYW5nIFtQcm9ncmFtbWluZyBSdWxlcyBhbmQgQ29udmVudGlvbnNdKGh0dHA6Ly93d3cuZXJsYW5nLnNlL2RvYy9wcm9ncmFtbWluZ19ydWxlcy5zaHRtbCkuIApkaWZmIC0tZ2l0IGEvbGliL2VybC9pbmNsdWRlL3RocmlmdF9jb25zdGFudHMuaHJsIGIvbGliL2VybC9pbmNsdWRlL3RocmlmdF9jb25zdGFudHMuaHJsCmluZGV4IGRiZmFhZjYuLjdjYjI5ZWIgMTAwNjQ0Ci0tLSBhL2xpYi9lcmwvaW5jbHVkZS90aHJpZnRfY29uc3RhbnRzLmhybAorKysgYi9saWIvZXJsL2luY2x1ZGUvdGhyaWZ0X2NvbnN0YW50cy5ocmwKQEAgLTIyLDYgKzIyLDcgQEAKIC1kZWZpbmUodFR5cGVfVk9JRCwgMSkuCiAtZGVmaW5lKHRUeXBlX0JPT0wsIDIpLgogLWRlZmluZSh0VHlwZV9CWVRFLCAzKS4KKy1kZWZpbmUodFR5cGVfSTgsIDMpLgogLWRlZmluZSh0VHlwZV9ET1VCTEUsIDQpLgogLWRlZmluZSh0VHlwZV9JMTYsIDYpLgogLWRlZmluZSh0VHlwZV9JMzIsIDgpLgpAQCAtNTYsMyArNTcsNiBAQAogLWRlZmluZShUQXBwbGljYXRpb25FeGNlcHRpb25fSU5WQUxJRF9UUkFOU0ZPUk0sIDgpLgogLWRlZmluZShUQXBwbGljYXRpb25FeGNlcHRpb25fSU5WQUxJRF9QUk9UT0NPTCwgOSkuCiAtZGVmaW5lKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbl9VTlNVUFBPUlRFRF9DTElFTlRfVFlQRSwgMTApLgorCistZGVmaW5lIChNVUxUSVBMRVhFRF9TRVJWSUNFX1NFUEFSQVRPUiwgIjoiKS4KKy1kZWZpbmUgKE1VTFRJUExFWEVEX0VSUk9SX0hBTkRMRVJfS0VZLCAiZXJyb3JfaGFuZGxlciIpLgpkaWZmIC0tZ2l0IGEvbGliL2VybC9pbmNsdWRlL3RocmlmdF9wcm90b2NvbC5ocmwgYi9saWIvZXJsL2luY2x1ZGUvdGhyaWZ0X3Byb3RvY29sLmhybAppbmRleCBmODVmNDU1Li5iYzBhY2M4IDEwMDY0NAotLS0gYS9saWIvZXJsL2luY2x1ZGUvdGhyaWZ0X3Byb3RvY29sLmhybAorKysgYi9saWIvZXJsL2luY2x1ZGUvdGhyaWZ0X3Byb3RvY29sLmhybApAQCAtMjAsMTIgKzIwLDEyIEBACiAtaWZuZGVmKFRIUklGVF9QUk9UT0NPTF9JTkNMVURFRCkuCiAtZGVmaW5lKFRIUklGVF9QUk9UT0NPTF9JTkNMVURFRCwgdHJ1ZSkuCiAKLS1yZWNvcmQocHJvdG9jb2xfbWVzc2FnZV9iZWdpbiwge25hbWUsIHR5cGUsIHNlcWlkfSkuCi0tcmVjb3JkKHByb3RvY29sX3N0cnVjdF9iZWdpbiwge25hbWV9KS4KLS1yZWNvcmQocHJvdG9jb2xfZmllbGRfYmVnaW4sIHtuYW1lLCB0eXBlLCBpZH0pLgotLXJlY29yZChwcm90b2NvbF9tYXBfYmVnaW4sIHtrdHlwZSwgdnR5cGUsIHNpemV9KS4KLS1yZWNvcmQocHJvdG9jb2xfbGlzdF9iZWdpbiwge2V0eXBlLCBzaXplfSkuCi0tcmVjb3JkKHByb3RvY29sX3NldF9iZWdpbiwge2V0eXBlLCBzaXplfSkuCistcmVjb3JkKHByb3RvY29sX21lc3NhZ2VfYmVnaW4sIHtuYW1lIDo6IHN0cmluZygpLCB0eXBlIDo6IGludGVnZXIoKSwgc2VxaWQgOjogaW50ZWdlcigpfSkuCistcmVjb3JkKHByb3RvY29sX3N0cnVjdF9iZWdpbiwge25hbWUgOjogc3RyaW5nKCl9KS4KKy1yZWNvcmQocHJvdG9jb2xfZmllbGRfYmVnaW4sIHtuYW1lIDo6IHN0cmluZygpLCB0eXBlIDo6IGludGVnZXIoKSwgaWQgOjogaW50ZWdlcigpfSkuCistcmVjb3JkKHByb3RvY29sX21hcF9iZWdpbiwge2t0eXBlIDo6IGludGVnZXIoKSwgdnR5cGUgOjogaW50ZWdlcigpLCBzaXplIDo6IGludGVnZXIoKX0pLgorLXJlY29yZChwcm90b2NvbF9saXN0X2JlZ2luLCB7ZXR5cGUgOjogaW50ZWdlcigpLCBzaXplIDo6IGludGVnZXIoKX0pLgorLXJlY29yZChwcm90b2NvbF9zZXRfYmVnaW4sIHtldHlwZSA6OiBpbnRlZ2VyKCksIHNpemUgOjogaW50ZWdlcigpfSkuCiAKIC10eXBlIHRwcm90X2hlYWRlcl92YWwoKSA6OiAjcHJvdG9jb2xfbWVzc2FnZV9iZWdpbnt9CiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgI3Byb3RvY29sX3N0cnVjdF9iZWdpbnt9CmRpZmYgLS1naXQgYS9saWIvZXJsL3JlYmFyIGIvbGliL2VybC9yZWJhcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTM0MTllYS4uMDAwMDAwMAotLS0gYS9saWIvZXJsL3JlYmFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL2VybC9yZWJhci5jb25maWcgYi9saWIvZXJsL3JlYmFyLmNvbmZpZwppbmRleCAwZjVkNDBlLi4xZWExOGE0IDEwMDY0NAotLS0gYS9saWIvZXJsL3JlYmFyLmNvbmZpZworKysgYi9saWIvZXJsL3JlYmFyLmNvbmZpZwpAQCAtMSArMSBAQAote2VybF9vcHRzLCBbZGVidWdfaW5mb119Lgore2VybF9vcHRzLCBbe3BsYXRmb3JtX2RlZmluZSwgIl5SLioiLCBvdHAxNl9vcl9sZXNzfSwgZGVidWdfaW5mb119LgpkaWZmIC0tZ2l0IGEvbGliL2VybC9yZWJhci5jb25maWcuc2NyaXB0IGIvbGliL2VybC9yZWJhci5jb25maWcuc2NyaXB0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3MzM4MjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3JlYmFyLmNvbmZpZy5zY3JpcHQKQEAgLTAsMCArMSw3IEBACitEZWYwID0gY2FzZSBub3QgZXJsYW5nOmlzX2J1aWx0aW4oZXJsYW5nLCBtb25vdG9uaWNfdGltZSwgMCkgb2YKKyAgICAgICAgICAgdHJ1ZSAtPiBbXTsKKyAgICAgICAgICAgZmFsc2UgLT4gW3tkLCB0aW1lX2NvcnJlY3Rpb259XQorICAgICAgIGVuZCwKK0RlZnMgPSBEZWYwLAorbGlzdHM6a2V5c3RvcmUoZXJsX29wdHMsIDEsIENPTkZJRywKKyAgICAgICAgICAgICAgIHtlcmxfb3B0cywgcHJvcGxpc3RzOmdldF92YWx1ZShlcmxfb3B0cywgQ09ORklHLCBbXSkgKysgRGVmc30pLgpkaWZmIC0tZ2l0IGEvbGliL2VybC9yZWJhci50ZXN0LmNvbmZpZyBiL2xpYi9lcmwvcmViYXIudGVzdC5jb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZmMmFmYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9lcmwvcmViYXIudGVzdC5jb25maWcKQEAgLTAsMCArMSw1IEBACit7ZXJsX29wdHMsIFt7cGxhdGZvcm1fZGVmaW5lLCAiXlIuKiIsIG90cDE2X29yX2xlc3N9LCBkZWJ1Z19pbmZvXX0uCisKK3tkZXBzLCBbCisgIHttZWNrLCAiIiwge2dpdCwgImh0dHBzOi8vZ2l0aHViLmNvbS9lcHJveHVzL21lY2suZ2l0Iiwge3RhZywgIjAuOC45In19fQorXX0uCmRpZmYgLS1naXQgYS9saWIvZXJsL3NyYy90aHJpZnQuYXBwLnNyYyBiL2xpYi9lcmwvc3JjL3RocmlmdC5hcHAuc3JjCmluZGV4IDgxMGVhZDUuLmIzYjIyNWYgMTAwNjQ0Ci0tLSBhL2xpYi9lcmwvc3JjL3RocmlmdC5hcHAuc3JjCisrKyBiL2xpYi9lcmwvc3JjL3RocmlmdC5hcHAuc3JjCkBAIC0yMiw3ICsyMiw3IEBACiAgIHtkZXNjcmlwdGlvbiwgIlRocmlmdCBiaW5kaW5ncyJ9LAogCiAgICUgVGhlIHZlcnNpb24gb2YgdGhlIGFwcGxpY2F0b24KLSAge3ZzbiwgIjAuOS4yIn0sCisgIHt2c24sICIxLjAuMCJ9LAogCiAgICUgQWxsIG1vZHVsZXMgdXNlZCBieSB0aGUgYXBwbGljYXRpb24uCiAgIHttb2R1bGVzLCBbCkBAIC0zNyw2ICszNyw3IEBACiAgICAgdGhyaWZ0X2h0dHBfdHJhbnNwb3J0LAogICAgIHRocmlmdF9qc29uX3BhcnNlciwKICAgICB0aHJpZnRfanNvbl9wcm90b2NvbCwKKyAgICB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwKICAgICB0aHJpZnRfbWVtb3J5X2J1ZmZlciwKICAgICB0aHJpZnRfcHJvY2Vzc29yLAogICAgIHRocmlmdF9wcm90b2NvbCwKZGlmZiAtLWdpdCBhL2xpYi9lcmwvc3JjL3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnQuZXJsIGIvbGliL2VybC9zcmMvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydC5lcmwKaW5kZXggZDRkNjE0ZS4uZTlkM2ZmZiAxMDA2NDQKLS0tIGEvbGliL2VybC9zcmMvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydC5lcmwKKysrIGIvbGliL2VybC9zcmMvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydC5lcmwKQEAgLTIxLDU3ICsyMSw3OCBAQAogCiAtYmVoYXZpb3VyKHRocmlmdF90cmFuc3BvcnQpLgogCi0lJSBBUEkKLS1leHBvcnQoW25ldy8xLCBuZXdfdHJhbnNwb3J0X2ZhY3RvcnkvMV0pLgorJSUgY29uc3RydWN0b3IKKy1leHBvcnQoW25ldy8xXSkuCislJSBwcm90b2NvbCBjYWxsYmFja3MKKy1leHBvcnQoW3JlYWQvMiwgcmVhZF9leGFjdC8yLCB3cml0ZS8yLCBmbHVzaC8xLCBjbG9zZS8xXSkuCislJSBsZWdhY3kgYXBpCistZXhwb3J0KFtuZXdfdHJhbnNwb3J0X2ZhY3RvcnkvMV0pLgogCi0lJSB0aHJpZnRfdHJhbnNwb3J0IGNhbGxiYWNrcwotLWV4cG9ydChbd3JpdGUvMiwgcmVhZC8yLCBmbHVzaC8xLCBjbG9zZS8xXSkuCiAKLS1yZWNvcmQoYnVmZmVyZWRfdHJhbnNwb3J0LCB7d3JhcHBlZCwgJSBhIHRocmlmdF90cmFuc3BvcnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVfYnVmZmVyICUgaW9saXN0KCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS4KLS10eXBlIHN0YXRlKCkgOjogI2J1ZmZlcmVkX3RyYW5zcG9ydHt9LgorLXJlY29yZCh0X2J1ZmZlcmVkLCB7CisgIHdyYXBwZWQsCisgIHdyaXRlX2J1ZmZlcgorfSkuCisKKy10eXBlIHN0YXRlKCkgOjogI3RfYnVmZmVyZWR7fS4KKworCistc3BlYyBuZXcoVHJhbnNwb3J0Ojp0aHJpZnRfdHJhbnNwb3J0OnRfdHJhbnNwb3J0KCkpIC0+CisgIHRocmlmdF90cmFuc3BvcnQ6dF90cmFuc3BvcnQoKS4KKworbmV3KFdyYXBwZWQpIC0+CisgIFN0YXRlID0gI3RfYnVmZmVyZWR7CisgICAgd3JhcHBlZCA9IFdyYXBwZWQsCisgICAgd3JpdGVfYnVmZmVyID0gW10KKyAgfSwKKyAgdGhyaWZ0X3RyYW5zcG9ydDpuZXcoP01PRFVMRSwgU3RhdGUpLgorCisKIC1pbmNsdWRlKCJ0aHJpZnRfdHJhbnNwb3J0X2JlaGF2aW91ci5ocmwiKS4KIAogCi1uZXcoV3JhcHBlZFRyYW5zcG9ydCkgLT4KLSAgICBTdGF0ZSA9ICNidWZmZXJlZF90cmFuc3BvcnR7d3JhcHBlZCA9IFdyYXBwZWRUcmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlX2J1ZmZlciA9IFtdfSwKLSAgICB0aHJpZnRfdHJhbnNwb3J0Om5ldyg/TU9EVUxFLCBTdGF0ZSkuCislJSByZWFkcyBkYXRhIHRocm91Z2ggZnJvbSB0aGUgd3JhcHBlZCB0cmFuc3BvcnQKK3JlYWQoU3RhdGUgPSAjdF9idWZmZXJlZHt3cmFwcGVkID0gV3JhcHBlZH0sIExlbikKK3doZW4gaXNfaW50ZWdlcihMZW4pLCBMZW4gPj0gMCAtPgorICB7TmV3U3RhdGUsIFJlc3BvbnNlfSA9IHRocmlmdF90cmFuc3BvcnQ6cmVhZChXcmFwcGVkLCBMZW4pLAorICB7U3RhdGUjdF9idWZmZXJlZHt3cmFwcGVkID0gTmV3U3RhdGV9LCBSZXNwb25zZX0uCiAKIAotJSUgV3JpdGVzIGRhdGEgaW50byB0aGUgYnVmZmVyCi13cml0ZShTdGF0ZSA9ICNidWZmZXJlZF90cmFuc3BvcnR7d3JpdGVfYnVmZmVyID0gV0J1Zn0sIERhdGEpIC0+Ci0gICAge1N0YXRlI2J1ZmZlcmVkX3RyYW5zcG9ydHt3cml0ZV9idWZmZXIgPSBbV0J1ZiwgRGF0YV19LCBva30uCislJSByZWFkcyBkYXRhIHRocm91Z2ggZnJvbSB0aGUgd3JhcHBlZCB0cmFuc3BvcnQKK3JlYWRfZXhhY3QoU3RhdGUgPSAjdF9idWZmZXJlZHt3cmFwcGVkID0gV3JhcHBlZH0sIExlbikKK3doZW4gaXNfaW50ZWdlcihMZW4pLCBMZW4gPj0gMCAtPgorICB7TmV3U3RhdGUsIFJlc3BvbnNlfSA9IHRocmlmdF90cmFuc3BvcnQ6cmVhZF9leGFjdChXcmFwcGVkLCBMZW4pLAorICB7U3RhdGUjdF9idWZmZXJlZHt3cmFwcGVkID0gTmV3U3RhdGV9LCBSZXNwb25zZX0uCiAKLSUlIEZsdXNoZXMgdGhlIGJ1ZmZlciB0aHJvdWdoIHRvIHRoZSB3cmFwcGVkIHRyYW5zcG9ydAotZmx1c2goU3RhdGUgPSAjYnVmZmVyZWRfdHJhbnNwb3J0e3dyaXRlX2J1ZmZlciA9IFdCdWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlZCA9IFdyYXBwZWQwfSkgLT4KLSAgICB7V3JhcHBlZDEsIFJlc3BvbnNlfSA9IHRocmlmdF90cmFuc3BvcnQ6d3JpdGUoV3JhcHBlZDAsIFdCdWYpLAotICAgIHtXcmFwcGVkMiwgX30gPSB0aHJpZnRfdHJhbnNwb3J0OmZsdXNoKFdyYXBwZWQxKSwKLSAgICBOZXdTdGF0ZSA9IFN0YXRlI2J1ZmZlcmVkX3RyYW5zcG9ydHt3cml0ZV9idWZmZXIgPSBbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVkID0gV3JhcHBlZDJ9LAotICAgIHtOZXdTdGF0ZSwgUmVzcG9uc2V9LgogCi0lJSBDbG9zZXMgdGhlIHRyYW5zcG9ydCBhbmQgdGhlIHdyYXBwZWQgdHJhbnNwb3J0Ci1jbG9zZShTdGF0ZSA9ICNidWZmZXJlZF90cmFuc3BvcnR7d3JhcHBlZCA9IFdyYXBwZWQwfSkgLT4KLSAgICB7V3JhcHBlZDEsIFJlc3VsdH0gPSB0aHJpZnRfdHJhbnNwb3J0OmNsb3NlKFdyYXBwZWQwKSwKLSAgICBOZXdTdGF0ZSA9IFN0YXRlI2J1ZmZlcmVkX3RyYW5zcG9ydHt3cmFwcGVkID0gV3JhcHBlZDF9LAotICAgIHtOZXdTdGF0ZSwgUmVzdWx0fS4KK3dyaXRlKFN0YXRlID0gI3RfYnVmZmVyZWR7d3JpdGVfYnVmZmVyID0gQnVmZmVyfSwgRGF0YSkgLT4KKyAge1N0YXRlI3RfYnVmZmVyZWR7d3JpdGVfYnVmZmVyID0gW0J1ZmZlciwgRGF0YV19LCBva30uCiAKLSUlIFJlYWRzIGRhdGEgdGhyb3VnaCBmcm9tIHRoZSB3cmFwcGVkIHRyYW5zcG9ydAotcmVhZChTdGF0ZSA9ICNidWZmZXJlZF90cmFuc3BvcnR7d3JhcHBlZCA9IFdyYXBwZWQwfSwgTGVuKSB3aGVuIGlzX2ludGVnZXIoTGVuKSAtPgotICAgIHtXcmFwcGVkMSwgUmVzcG9uc2V9ID0gdGhyaWZ0X3RyYW5zcG9ydDpyZWFkKFdyYXBwZWQwLCBMZW4pLAotICAgIE5ld1N0YXRlID0gU3RhdGUjYnVmZmVyZWRfdHJhbnNwb3J0e3dyYXBwZWQgPSBXcmFwcGVkMX0sCi0gICAge05ld1N0YXRlLCBSZXNwb25zZX0uCisKK2ZsdXNoKFN0YXRlID0gI3RfYnVmZmVyZWR7d3JhcHBlZCA9IFdyYXBwZWQsIHdyaXRlX2J1ZmZlciA9IEJ1ZmZlcn0pIC0+CisgIGNhc2UgaW9saXN0X3NpemUoQnVmZmVyKSBvZgorICAgICUlIGlmIHdyaXRlIGJ1ZmZlciBpcyBlbXB0eSwgZG8gbm90aGluZworICAgIDAgLT4ge1N0YXRlLCBva307CisgICAgXyAtPgorICAgICAge1dyaXR0ZW4sIFJlc3BvbnNlfSA9IHRocmlmdF90cmFuc3BvcnQ6d3JpdGUoV3JhcHBlZCwgQnVmZmVyKSwKKyAgICAgIHtGbHVzaGVkLCBva30gPSB0aHJpZnRfdHJhbnNwb3J0OmZsdXNoKFdyaXR0ZW4pLAorICAgICAge1N0YXRlI3RfYnVmZmVyZWR7d3JhcHBlZCA9IEZsdXNoZWQsIHdyaXRlX2J1ZmZlciA9IFtdfSwgUmVzcG9uc2V9CisgIGVuZC4KKworCitjbG9zZShTdGF0ZSA9ICN0X2J1ZmZlcmVke3dyYXBwZWQgPSBXcmFwcGVkfSkgLT4KKyAge0Nsb3NlZCwgUmVzdWx0fSA9IHRocmlmdF90cmFuc3BvcnQ6Y2xvc2UoV3JhcHBlZCksCisgIHtTdGF0ZSN0X2J1ZmZlcmVke3dyYXBwZWQgPSBDbG9zZWR9LCBSZXN1bHR9LgorCiAKICUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICUlJSBJbnRlcm5hbCBmdW5jdGlvbnMKICUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICUlJSUgRkFDVE9SWSBHRU5FUkFUSU9OICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUKIG5ld190cmFuc3BvcnRfZmFjdG9yeShXcmFwRmFjdG9yeSkgLT4KLSAgICBGID0gZnVuKCkgLT4KLSAgICAgICAgICAgICAgICB7b2ssIFdyYXBwZWR9ID0gV3JhcEZhY3RvcnkoKSwKLSAgICAgICAgICAgICAgICBuZXcoV3JhcHBlZCkKLSAgICAgICAgZW5kLAotICAgIHtvaywgRn0uCisgIEYgPSBmdW4oKSAtPgorICAgIHtvaywgV3JhcHBlZH0gPSBXcmFwRmFjdG9yeSgpLAorICAgIG5ldyhXcmFwcGVkKQorICBlbmQsCisgIHtvaywgRn0uCisKZGlmZiAtLWdpdCBhL2xpYi9lcmwvc3JjL3RocmlmdF9jbGllbnQuZXJsIGIvbGliL2VybC9zcmMvdGhyaWZ0X2NsaWVudC5lcmwKaW5kZXggZmY1YzNkYy4uMWE5Y2I1MCAxMDA2NDQKLS0tIGEvbGliL2VybC9zcmMvdGhyaWZ0X2NsaWVudC5lcmwKKysrIGIvbGliL2VybC9zcmMvdGhyaWZ0X2NsaWVudC5lcmwKQEAgLTM2LDEzICszNiwxMiBAQAogCiAtc3BlYyBjYWxsKCN0Y2xpZW50e30sIGF0b20oKSwgbGlzdCgpKSAtPiB7I3RjbGllbnR7fSwge29rLCBhbnkoKX0gfCB7ZXJyb3IsIGFueSgpfX0uCiBjYWxsKENsaWVudCA9ICN0Y2xpZW50e30sIEZ1bmN0aW9uLCBBcmdzKQotICB3aGVuIGlzX2F0b20oRnVuY3Rpb24pLCBpc19saXN0KEFyZ3MpIC0+Ci0gICAgY2FzZSBzZW5kX2Z1bmN0aW9uX2NhbGwoQ2xpZW50LCBGdW5jdGlvbiwgQXJncykgb2YKLSAgICAgICAge0NsaWVudDEsIG9rfSAtPgotICAgICAgICAgICAgcmVjZWl2ZV9mdW5jdGlvbl9yZXN1bHQoQ2xpZW50MSwgRnVuY3Rpb24pOwotICAgICAgICBFbHNlIC0+Ci0gICAgICAgICAgICBFbHNlCi0gICAgZW5kLgord2hlbiBpc19hdG9tKEZ1bmN0aW9uKSwgaXNfbGlzdChBcmdzKSAtPgorICBjYXNlIHNlbmRfZnVuY3Rpb25fY2FsbChDbGllbnQsIEZ1bmN0aW9uLCBBcmdzKSBvZgorICAgIHtvaywgQ2xpZW50MX0gLT4gcmVjZWl2ZV9mdW5jdGlvbl9yZXN1bHQoQ2xpZW50MSwgRnVuY3Rpb24pOworICAgIHt7ZXJyb3IsIFh9LCBDbGllbnQxfSAtPiB7Q2xpZW50MSwge2Vycm9yLCBYfX07CisgICAgRWxzZSAtPiBFbHNlCisgIGVuZC4KIAogCiAlJSBTZW5kcyBhIGZ1bmN0aW9uIGNhbGwgYnV0IGRvZXMgbm90IHJlYWQgdGhlIHJlc3VsdC4gVGhpcyBpcyB1c2VmdWwKQEAgLTUxLDcgKzUwLDEwIEBACiAtc3BlYyBzZW5kX2NhbGwoI3RjbGllbnR7fSwgYXRvbSgpLCBsaXN0KCkpIC0+IHsjdGNsaWVudHt9LCBva30uCiBzZW5kX2NhbGwoQ2xpZW50ID0gI3RjbGllbnR7fSwgRnVuY3Rpb24sIEFyZ3MpCiAgIHdoZW4gaXNfYXRvbShGdW5jdGlvbiksIGlzX2xpc3QoQXJncykgLT4KLSAgICBzZW5kX2Z1bmN0aW9uX2NhbGwoQ2xpZW50LCBGdW5jdGlvbiwgQXJncykuCisgICAgY2FzZSBzZW5kX2Z1bmN0aW9uX2NhbGwoQ2xpZW50LCBGdW5jdGlvbiwgQXJncykgb2YKKyAgICAgIHtvaywgQ2xpZW50MX0gLT4ge0NsaWVudDEsIG9rfTsKKyAgICAgIEVsc2UgLT4gRWxzZQorICAgIGVuZC4KIAogLXNwZWMgY2xvc2UoI3RjbGllbnR7fSkgLT4gb2suCiBjbG9zZSgjdGNsaWVudHtwcm90b2NvbD1Qcm90b2NvbH0pIC0+CkBAIC02MSwzMCArNjMsNDAgQEAKICUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICUlJSBJbnRlcm5hbCBmdW5jdGlvbnMKICUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS1zcGVjIHNlbmRfZnVuY3Rpb25fY2FsbCgjdGNsaWVudHt9LCBhdG9tKCksIGxpc3QoKSkgLT4geyN0Y2xpZW50e30sIG9rIHwge2Vycm9yLCBhbnkoKX19Lgotc2VuZF9mdW5jdGlvbl9jYWxsKENsaWVudCA9ICN0Y2xpZW50e3Byb3RvY29sID0gUHJvdG8wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UgID0gU2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXFpZCAgICA9IFNlcUlkfSwKLSAgICAgICAgICAgICAgICAgICBGdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICBBcmdzKSAtPgotICAgIFBhcmFtcyA9IHRyeSBTZXJ2aWNlOmZ1bmN0aW9uX2luZm8oRnVuY3Rpb24sIHBhcmFtc190eXBlKQotICAgIGNhdGNoIGVycm9yOmZ1bmN0aW9uX2NsYXVzZSAtPiBub19mdW5jdGlvbgotICAgIGVuZCwKLSAgICBjYXNlIFBhcmFtcyBvZgotICAgICAgICBub19mdW5jdGlvbiAtPgotICAgICAgICAgICAge0NsaWVudCwge2Vycm9yLCB7bm9fZnVuY3Rpb24sIEZ1bmN0aW9ufX19OwotICAgICAgICB7c3RydWN0LCBQTGlzdH0gd2hlbiBsZW5ndGgoUExpc3QpID0vPSBsZW5ndGgoQXJncykgLT4KLSAgICAgICAgICAgIHtDbGllbnQsIHtlcnJvciwge2JhZF9hcmdzLCBGdW5jdGlvbiwgQXJnc319fTsKLSAgICAgICAge3N0cnVjdCwgX1BMaXN0fSAtPgotICAgICAgICAgICAgQmVnaW4gPSAjcHJvdG9jb2xfbWVzc2FnZV9iZWdpbntuYW1lID0gYXRvbV90b19saXN0KEZ1bmN0aW9uKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9ID90TWVzc2FnZVR5cGVfQ0FMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxaWQgPSBTZXFJZH0sCi0gICAgICAgICAgICB7UHJvdG8xLCBva30gPSB0aHJpZnRfcHJvdG9jb2w6d3JpdGUoUHJvdG8wLCBCZWdpbiksCi0gICAgICAgICAgICB7UHJvdG8yLCBva30gPSB0aHJpZnRfcHJvdG9jb2w6d3JpdGUoUHJvdG8xLCB7UGFyYW1zLCBsaXN0X3RvX3R1cGxlKFtGdW5jdGlvbiB8IEFyZ3NdKX0pLAotICAgICAgICAgICAge1Byb3RvMywgb2t9ID0gdGhyaWZ0X3Byb3RvY29sOndyaXRlKFByb3RvMiwgbWVzc2FnZV9lbmQpLAotICAgICAgICAgICAge1Byb3RvNCwgb2t9ID0gdGhyaWZ0X3Byb3RvY29sOmZsdXNoX3RyYW5zcG9ydChQcm90bzMpLAotICAgICAgICAgICAge0NsaWVudCN0Y2xpZW50e3Byb3RvY29sID0gUHJvdG80fSwgb2t9Ci0gICAgZW5kLgorLXNwZWMgc2VuZF9mdW5jdGlvbl9jYWxsKCN0Y2xpZW50e30sIGF0b20oKSwgbGlzdCgpKSAtPiB7b2sgfCB7ZXJyb3IsIGFueSgpfSwgI3RjbGllbnR7fX0uCitzZW5kX2Z1bmN0aW9uX2NhbGwoQ2xpZW50ID0gI3RjbGllbnR7c2VydmljZSA9IFNlcnZpY2V9LCBGdW5jdGlvbiwgQXJncykgLT4KKyAge1BhcmFtcywgUmVwbHl9ID0gdHJ5CisgICAge1NlcnZpY2U6ZnVuY3Rpb25faW5mbyhGdW5jdGlvbiwgcGFyYW1zX3R5cGUpLCBTZXJ2aWNlOmZ1bmN0aW9uX2luZm8oRnVuY3Rpb24sIHJlcGx5X3R5cGUpfQorICBjYXRjaCBlcnJvcjpmdW5jdGlvbl9jbGF1c2UgLT4ge25vX2Z1bmN0aW9uLCAwfQorICBlbmQsCisgIE1zZ1R5cGUgPSBjYXNlIFJlcGx5IG9mCisgICAgb25ld2F5X3ZvaWQgLT4gP3RNZXNzYWdlVHlwZV9PTkVXQVk7CisgICAgXyAtPiA/dE1lc3NhZ2VUeXBlX0NBTEwKKyAgZW5kLAorICBjYXNlIFBhcmFtcyBvZgorICAgIG5vX2Z1bmN0aW9uIC0+CisgICAgICB7e2Vycm9yLCB7bm9fZnVuY3Rpb24sIEZ1bmN0aW9ufX0sIENsaWVudH07CisgICAge3N0cnVjdCwgUExpc3R9IHdoZW4gbGVuZ3RoKFBMaXN0KSA9Lz0gbGVuZ3RoKEFyZ3MpIC0+CisgICAgICB7e2Vycm9yLCB7YmFkX2FyZ3MsIEZ1bmN0aW9uLCBBcmdzfX0sIENsaWVudH07CisgICAge3N0cnVjdCwgX1BMaXN0fSAtPiB3cml0ZV9tZXNzYWdlKENsaWVudCwgRnVuY3Rpb24sIEFyZ3MsIFBhcmFtcywgTXNnVHlwZSkKKyAgZW5kLgorCistc3BlYyB3cml0ZV9tZXNzYWdlKCN0Y2xpZW50e30sIGF0b20oKSwgbGlzdCgpLCB7c3RydWN0LCBsaXN0KCl9LCBpbnRlZ2VyKCkpIC0+CisgIHtvayB8IHtlcnJvciwgYW55KCl9LCAjdGNsaWVudHt9fS4KK3dyaXRlX21lc3NhZ2UoQ2xpZW50ID0gI3RjbGllbnR7cHJvdG9jb2wgPSBQMCwgc2VxaWQgPSBTZXF9LCBGdW5jdGlvbiwgQXJncywgUGFyYW1zLCBNc2dUeXBlKSAtPgorICB0cnkKKyAgICB7UDEsIG9rfSA9IHRocmlmdF9wcm90b2NvbDp3cml0ZShQMCwgI3Byb3RvY29sX21lc3NhZ2VfYmVnaW57CisgICAgICBuYW1lID0gYXRvbV90b19saXN0KEZ1bmN0aW9uKSwKKyAgICAgIHR5cGUgPSBNc2dUeXBlLAorICAgICAgc2VxaWQgPSBTZXEKKyAgICB9KSwKKyAgICB7UDIsIG9rfSA9IHRocmlmdF9wcm90b2NvbDp3cml0ZShQMSwge1BhcmFtcywgbGlzdF90b190dXBsZShbRnVuY3Rpb258QXJnc10pfSksCisgICAge1AzLCBva30gPSB0aHJpZnRfcHJvdG9jb2w6d3JpdGUoUDIsIG1lc3NhZ2VfZW5kKSwKKyAgICB7UDQsIG9rfSA9IHRocmlmdF9wcm90b2NvbDpmbHVzaF90cmFuc3BvcnQoUDMpLAorICAgIHtvaywgQ2xpZW50I3RjbGllbnR7cHJvdG9jb2wgPSBQNH19CisgIGNhdGNoCisgICAgZXJyb3I6e2JhZG1hdGNoLCB7Xywge2Vycm9yLCBffSA9IEVycm9yfX0gLT4ge0Vycm9yLCBDbGllbnR9CisgIGVuZC4KIAogLXNwZWMgcmVjZWl2ZV9mdW5jdGlvbl9yZXN1bHQoI3RjbGllbnR7fSwgYXRvbSgpKSAtPiB7I3RjbGllbnR7fSwge29rLCBhbnkoKX0gfCB7ZXJyb3IsIGFueSgpfX0uCiByZWNlaXZlX2Z1bmN0aW9uX3Jlc3VsdChDbGllbnQgPSAjdGNsaWVudHtzZXJ2aWNlID0gU2VydmljZX0sIEZ1bmN0aW9uKSAtPgpkaWZmIC0tZ2l0IGEvbGliL2VybC9zcmMvdGhyaWZ0X2NsaWVudF91dGlsLmVybCBiL2xpYi9lcmwvc3JjL3RocmlmdF9jbGllbnRfdXRpbC5lcmwKaW5kZXggMDIzNjhiZi4uMWRiZTUxZSAxMDA2NDQKLS0tIGEvbGliL2VybC9zcmMvdGhyaWZ0X2NsaWVudF91dGlsLmVybAorKysgYi9saWIvZXJsL3NyYy90aHJpZnRfY2xpZW50X3V0aWwuZXJsCkBAIC0yMCw2ICsyMCwxMSBAQAogLW1vZHVsZSh0aHJpZnRfY2xpZW50X3V0aWwpLgogCiAtZXhwb3J0KFtuZXcvNF0pLgorLWV4cG9ydChbbmV3X211bHRpcGxleGVkLzMsIG5ld19tdWx0aXBsZXhlZC80XSkuCisKKy10eXBlIHNlcnZpY2VfbmFtZSgpICAgICAgICAgICAgOjogbm9uZW1wdHlfc3RyaW5nKCkuCistdHlwZSBzZXJ2aWNlX21vZHVsZSgpICAgICAgICAgIDo6IGF0b20oKS4KKy10eXBlIG11bHRpcGxleGVkX3NlcnZpY2VfbWFwKCkgOjogW3tTZXJ2aWNlTmFtZTo6c2VydmljZV9uYW1lKCksIFNlcnZpY2VNb2R1bGU6OnNlcnZpY2VfbW9kdWxlKCl9XS4KIAogJSUKICUlIFNwbGl0cyBjbGllbnQgb3B0aW9ucyBpbnRvIGNsaWVudCwgcHJvdG9jb2wsIGFuZCB0cmFuc3BvcnQgb3B0aW9ucwpAQCAtMzQsMjcgKzM5LDQxIEBACiAKIHNwbGl0X29wdGlvbnMoW09wdCA9IHtPcHRLZXksIF99IHwgUmVzdF0sIFByb3RvSW4sIFRyYW5zSW4pCiAgIHdoZW4gT3B0S2V5ID06PSBzdHJpY3RfcmVhZDsKLSAgICAgICBPcHRLZXkgPTo9IHN0cmljdF93cml0ZSAtPgorICAgICAgIE9wdEtleSA9Oj0gc3RyaWN0X3dyaXRlOworICAgICAgIE9wdEtleSA9Oj0gcHJvdG9jb2wgLT4KICAgICBzcGxpdF9vcHRpb25zKFJlc3QsIFtPcHQgfCBQcm90b0luXSwgVHJhbnNJbik7CiAKIHNwbGl0X29wdGlvbnMoW09wdCA9IHtPcHRLZXksIF99IHwgUmVzdF0sIFByb3RvSW4sIFRyYW5zSW4pCiAgIHdoZW4gT3B0S2V5ID06PSBmcmFtZWQ7CiAgICAgICAgT3B0S2V5ID06PSBjb25uZWN0X3RpbWVvdXQ7Ci0gICAgICAgT3B0S2V5ID06PSBzb2Nrb3B0cyAtPgorICAgICAgIE9wdEtleSA9Oj0gcmVjdl90aW1lb3V0OworICAgICAgIE9wdEtleSA9Oj0gc29ja29wdHM7CisgICAgICAgT3B0S2V5ID06PSBzc2x0cmFuc3BvcnQ7CisgICAgICAgT3B0S2V5ID06PSBzc2xvcHRpb25zLT4KICAgICBzcGxpdF9vcHRpb25zKFJlc3QsIFByb3RvSW4sIFtPcHQgfCBUcmFuc0luXSkuCiAKIAogJSUgQ2xpZW50IGNvbnN0cnVjdG9yIGZvciB0aGUgY29tbW9uLWNhc2Ugb2Ygc29ja2V0IHRyYW5zcG9ydHMKLSUlIHdpdGggdGhlIGJpbmFyeSBwcm90b2NvbAogbmV3KEhvc3QsIFBvcnQsIFNlcnZpY2UsIE9wdGlvbnMpCiAgIHdoZW4gaXNfaW50ZWdlcihQb3J0KSwgaXNfYXRvbShTZXJ2aWNlKSwgaXNfbGlzdChPcHRpb25zKSAtPgotICAgIHtQcm90b09wdHMsIFRyYW5zT3B0c30gPSBzcGxpdF9vcHRpb25zKE9wdGlvbnMpLAorICAgIHtQcm90b09wdHMsIFRyYW5zT3B0czB9ID0gc3BsaXRfb3B0aW9ucyhPcHRpb25zKSwKIAorICAgIHtUcmFuc3BvcnRNb2R1bGUsIFRyYW5zT3B0czJ9ID0gY2FzZSBsaXN0czprZXl0YWtlKHNzbHRyYW5zcG9ydCwgMSwgVHJhbnNPcHRzMCkgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dmFsdWUsIHtfLCB0cnVlfSwgVHJhbnNPcHRzMX0gLT4ge3RocmlmdF9zc2xzb2NrZXRfdHJhbnNwb3J0LCBUcmFuc09wdHMxfTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAtPiB7dGhyaWZ0X3NvY2tldF90cmFuc3BvcnQsIFRyYW5zT3B0czB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQsCisKKyAgICB7UHJvdG9jb2xNb2R1bGUsIFByb3RvT3B0czF9ID0gY2FzZSBsaXN0czprZXl0YWtlKHByb3RvY29sLCAxLCBQcm90b09wdHMpIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3ZhbHVlLCB7XywgY29tcGFjdH0sIE9wdHN9IC0+IHt0aHJpZnRfY29tcGFjdF9wcm90b2NvbCwgT3B0c307CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3ZhbHVlLCB7XywganNvbn0sIE9wdHN9IC0+IHt0aHJpZnRfanNvbl9wcm90b2NvbCwgT3B0c307CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3ZhbHVlLCB7XywgYmluYXJ5fSwgT3B0c30gLT4ge3RocmlmdF9iaW5hcnlfcHJvdG9jb2wsIE9wdHN9OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC0+IHt0aHJpZnRfYmluYXJ5X3Byb3RvY29sLCBQcm90b09wdHN9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCwKICAgICB7b2ssIFRyYW5zcG9ydEZhY3Rvcnl9ID0KLSAgICAgICAgdGhyaWZ0X3NvY2tldF90cmFuc3BvcnQ6bmV3X3RyYW5zcG9ydF9mYWN0b3J5KEhvc3QsIFBvcnQsIFRyYW5zT3B0cyksCisgICAgICAgIFRyYW5zcG9ydE1vZHVsZTpuZXdfdHJhbnNwb3J0X2ZhY3RvcnkoSG9zdCwgUG9ydCwgVHJhbnNPcHRzMiksCiAKLSAgICB7b2ssIFByb3RvY29sRmFjdG9yeX0gPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sOm5ld19wcm90b2NvbF9mYWN0b3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNwb3J0RmFjdG9yeSwgUHJvdG9PcHRzKSwKKyAgICB7b2ssIFByb3RvY29sRmFjdG9yeX0gPSBQcm90b2NvbE1vZHVsZTpuZXdfcHJvdG9jb2xfZmFjdG9yeSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zcG9ydEZhY3RvcnksIFByb3RvT3B0czEpLAogCiAgICAgY2FzZSBQcm90b2NvbEZhY3RvcnkoKSBvZgogICAgICAgICB7b2ssIFByb3RvY29sfSAtPgpAQCAtNjIsMyArODEsMzIgQEAKICAgICAgICAge2Vycm9yLCBFcnJvcn0gLT4KICAgICAgICAgICAgIHtlcnJvciwgRXJyb3J9CiAgICAgZW5kLgorCistc3BlYyBuZXdfbXVsdGlwbGV4ZWQoSG9zdCwgUG9ydCwgU2VydmljZXMsIE9wdGlvbnMpIC0+IHtvaywgU2VydmljZVRocmlmdENsaWVudExpc3R9IHdoZW4KKyAgICBIb3N0ICAgICAgICA6OiBub25lbXB0eV9zdHJpbmcoKSwKKyAgICBQb3J0ICAgICAgICA6OiBub25fbmVnX2ludGVnZXIoKSwKKyAgICBTZXJ2aWNlcyAgICA6OiBtdWx0aXBsZXhlZF9zZXJ2aWNlX21hcCgpLAorICAgIE9wdGlvbnMgICAgIDo6IGxpc3QoKSwKKyAgICBTZXJ2aWNlVGhyaWZ0Q2xpZW50TGlzdCA6OiBbe1NlcnZpY2VOYW1lOjpsaXN0KCksIFRocmlmdENsaWVudDo6dGVybSgpfV0uCituZXdfbXVsdGlwbGV4ZWQoSG9zdCwgUG9ydCwgU2VydmljZXMsIE9wdGlvbnMpIHdoZW4gaXNfaW50ZWdlcihQb3J0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19saXN0KFNlcnZpY2VzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19saXN0KE9wdGlvbnMpIC0+CisgICAgbmV3X211bHRpcGxleGVkKHRocmlmdF9zb2NrZXRfdHJhbnNwb3J0Om5ld190cmFuc3BvcnRfZmFjdG9yeShIb3N0LCBQb3J0LCBPcHRpb25zKSwgU2VydmljZXMsIE9wdGlvbnMpLgorCistc3BlYyBuZXdfbXVsdGlwbGV4ZWQoVHJhbnNwb3J0RmFjdG9yeVR1cGxlLCBTZXJ2aWNlcywgT3B0aW9ucykgLT4ge29rLCBTZXJ2aWNlVGhyaWZ0Q2xpZW50TGlzdH0gd2hlbgorICAgIFRyYW5zcG9ydEZhY3RvcnlUdXBsZSAgIDo6IHtvaywgVHJhbnNwb3J0RmFjdG9yeTo6dGVybSgpfSwKKyAgICBTZXJ2aWNlcyAgICAgICAgICAgICAgICA6OiBtdWx0aXBsZXhlZF9zZXJ2aWNlX21hcCgpLAorICAgIE9wdGlvbnMgICAgICAgICAgICAgICAgIDo6IGxpc3QoKSwKKyAgICBTZXJ2aWNlVGhyaWZ0Q2xpZW50TGlzdCA6OiBbe1NlcnZpY2VOYW1lOjpzZXJ2aWNlX25hbWUoKSwgVGhyaWZ0Q2xpZW50Ojp0ZXJtKCl9XS4KK25ld19tdWx0aXBsZXhlZChUcmFuc3BvcnRGYWN0b3J5VHVwbGUsIFNlcnZpY2VzLCBPcHRpb25zKSB3aGVuIGlzX2xpc3QoU2VydmljZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfbGlzdChPcHRpb25zKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX3R1cGxlKFRyYW5zcG9ydEZhY3RvcnlUdXBsZSkgLT4KKyAgICB7UHJvdG9PcHRzLCBffSA9IHNwbGl0X29wdGlvbnMoT3B0aW9ucyksCisKKyAgICB7b2ssIFRyYW5zcG9ydEZhY3Rvcnl9ID0gVHJhbnNwb3J0RmFjdG9yeVR1cGxlLAorCisgICAge29rLCBQcm90b2NvbEZhY3Rvcnl9ID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbDpuZXdfcHJvdG9jb2xfZmFjdG9yeShUcmFuc3BvcnRGYWN0b3J5LCBQcm90b09wdHMpLAorCisgICAge29rLCBQcm90b2NvbH0gPSBQcm90b2NvbEZhY3RvcnkoKSwKKworICAgIHtvaywgW3tTZXJ2aWNlTmFtZSwgZWxlbWVudCgyLCB0aHJpZnRfY2xpZW50Om5ldyhlbGVtZW50KDIsIHRocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbDpuZXcoUHJvdG9jb2wsIFNlcnZpY2VOYW1lKSksIFNlcnZpY2UpKX0gfHwge1NlcnZpY2VOYW1lLCBTZXJ2aWNlfSA8LSBTZXJ2aWNlc119LgpkaWZmIC0tZ2l0IGEvbGliL2VybC9zcmMvdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2wuZXJsIGIvbGliL2VybC9zcmMvdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2wuZXJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMTQyMjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3NyYy90aHJpZnRfY29tcGFjdF9wcm90b2NvbC5lcmwKQEAgLTAsMCArMSwzOTAgQEAKKyUlCislJSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCislJSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorJSUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyUlIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorJSUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorJSUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorJSUgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CislJQorJSUgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyUlCislJSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCislJSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorJSUgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCislJSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorJSUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworJSUgdW5kZXIgdGhlIExpY2Vuc2UuCislJQorCistbW9kdWxlKHRocmlmdF9jb21wYWN0X3Byb3RvY29sKS4KKworLWJlaGF2aW91cih0aHJpZnRfcHJvdG9jb2wpLgorCistaW5jbHVkZSgidGhyaWZ0X2NvbnN0YW50cy5ocmwiKS4KKy1pbmNsdWRlKCJ0aHJpZnRfcHJvdG9jb2wuaHJsIikuCisKKy1leHBvcnQoW25ldy8xLCBuZXcvMiwKKyAgICAgICAgIHJlYWQvMiwKKyAgICAgICAgIHdyaXRlLzIsCisgICAgICAgICBmbHVzaF90cmFuc3BvcnQvMSwKKyAgICAgICAgIGNsb3NlX3RyYW5zcG9ydC8xLAorICAgICAgICAgbmV3X3Byb3RvY29sX2ZhY3RvcnkvMgorICAgICAgICBdKS4KKworLWRlZmluZShJRF9OT05FLCAxNiMxMDAwMCkuCistZGVmaW5lKENCT09MX05PTkUsIDApLgorLWRlZmluZShDQk9PTF9UUlVFLCAxKS4KKy1kZWZpbmUoQ0JPT0xfRkFMU0UsIDIpLgorCistcmVjb3JkKHRfY29tcGFjdCwge3RyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICUgc3RhdGUgZm9yIHBlbmRpbmcgYm9vbGVhbiBmaWVsZHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRfc3RhY2s9W10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkX3ZhbHVlPT9DQk9PTF9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVfc3RhY2s9W10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZV9pZD0/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+IG5ldyhJT0RldmljZSwgW3tzaG91bGRfY2xvc2UsIHRydWV9LCB7bW9kZSwgcmVhZH1dKTsKKyAgICBFcnJvciAtPiBFcnJvcgorICBlbmQuCisKZGlmZiAtLWdpdCBhL2xpYi9lcmwvc3JjL3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0LmVybCBiL2xpYi9lcmwvc3JjL3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0LmVybAppbmRleCBlY2EzY2JlLi45YTVkNmFmIDEwMDY0NAotLS0gYS9saWIvZXJsL3NyYy90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydC5lcmwKKysrIGIvbGliL2VybC9zcmMvdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQuZXJsCkBAIC0yMSw4MyArMjEsMTA2IEBACiAKIC1iZWhhdmlvdXIodGhyaWZ0X3RyYW5zcG9ydCkuCiAKLSUlIEFQSQorJSUgY29uc3RydWN0b3IKIC1leHBvcnQoW25ldy8xXSkuCislJSBwcm90b2NvbCBjYWxsYmFja3MKKy1leHBvcnQoW3JlYWQvMiwgcmVhZF9leGFjdC8yLCB3cml0ZS8yLCBmbHVzaC8xLCBjbG9zZS8xXSkuCiAKLSUlIHRocmlmdF90cmFuc3BvcnQgY2FsbGJhY2tzCi0tZXhwb3J0KFt3cml0ZS8yLCByZWFkLzIsIGZsdXNoLzEsIGNsb3NlLzFdKS4KIAotLXJlY29yZChmcmFtZWRfdHJhbnNwb3J0LCB7d3JhcHBlZCwgJSBhIHRocmlmdF90cmFuc3BvcnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRfYnVmZmVyLCAlIGlvbGlzdCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZV9idWZmZXIgJSBpb2xpc3QoKQotICAgICAgICAgICAgICAgICAgICAgICAgICB9KS4KLS10eXBlIHN0YXRlKCkgOjogI2ZyYW1lZF90cmFuc3BvcnR7fS4KKy1yZWNvcmQodF9mcmFtZWQsIHsKKyAgd3JhcHBlZCwKKyAgcmVhZF9idWZmZXIsCisgIHdyaXRlX2J1ZmZlcgorfSkuCisKKy10eXBlIHN0YXRlKCkgOjogI3RfZnJhbWVke30uCisKKworLXNwZWMgbmV3KFRyYW5zcG9ydDo6dGhyaWZ0X3RyYW5zcG9ydDp0X3RyYW5zcG9ydCgpKSAtPgorICB0aHJpZnRfdHJhbnNwb3J0OnRfdHJhbnNwb3J0KCkuCisKK25ldyhXcmFwcGVkKSAtPgorICBTdGF0ZSA9ICN0X2ZyYW1lZHsKKyAgICB3cmFwcGVkID0gV3JhcHBlZCwKKyAgICByZWFkX2J1ZmZlciA9IFtdLAorICAgIHdyaXRlX2J1ZmZlciA9IFtdCisgIH0sCisgIHRocmlmdF90cmFuc3BvcnQ6bmV3KD9NT0RVTEUsIFN0YXRlKS4KKworCiAtaW5jbHVkZSgidGhyaWZ0X3RyYW5zcG9ydF9iZWhhdmlvdXIuaHJsIikuCiAKLW5ldyhXcmFwcGVkVHJhbnNwb3J0KSAtPgotICAgIFN0YXRlID0gI2ZyYW1lZF90cmFuc3BvcnR7d3JhcHBlZCA9IFdyYXBwZWRUcmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkX2J1ZmZlciA9IFtdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVfYnVmZmVyID0gW119LAotICAgIHRocmlmdF90cmFuc3BvcnQ6bmV3KD9NT0RVTEUsIFN0YXRlKS4KIAotJSUgV3JpdGVzIGRhdGEgaW50byB0aGUgYnVmZmVyCi13cml0ZShTdGF0ZSA9ICNmcmFtZWRfdHJhbnNwb3J0e3dyaXRlX2J1ZmZlciA9IFdCdWZ9LCBEYXRhKSAtPgotICAgIHtTdGF0ZSNmcmFtZWRfdHJhbnNwb3J0e3dyaXRlX2J1ZmZlciA9IFtXQnVmLCBEYXRhXX0sIG9rfS4KK3JlYWQoU3RhdGUgPSAjdF9mcmFtZWR7d3JhcHBlZCA9IFdyYXBwZWQsIHJlYWRfYnVmZmVyID0gQnVmZmVyfSwgTGVuKQord2hlbiBpc19pbnRlZ2VyKExlbiksIExlbiA+PSAwIC0+CisgIEJpbmFyeSA9IGlvbGlzdF90b19iaW5hcnkoQnVmZmVyKSwKKyAgY2FzZSBCaW5hcnkgb2YKKyAgICA8PD4+IHdoZW4gTGVuID4gMCAtPgorICAgICAgY2FzZSBuZXh0X2ZyYW1lKFdyYXBwZWQpIG9mCisgICAgICAgIHtOZXdTdGF0ZSwge29rLCBGcmFtZX19IC0+CisgICAgICAgICAgTmV3QmluYXJ5ID0gaW9saXN0X3RvX2JpbmFyeShbQmluYXJ5LCBGcmFtZV0pLAorICAgICAgICAgIEdpdmUgPSBtaW4oaW9saXN0X3NpemUoTmV3QmluYXJ5KSwgTGVuKSwKKyAgICAgICAgICB7UmVzdWx0LCBSZW1haW5pbmd9ID0gc3BsaXRfYmluYXJ5KE5ld0JpbmFyeSwgR2l2ZSksCisgICAgICAgICAge1N0YXRlI3RfZnJhbWVke3dyYXBwZWQgPSBOZXdTdGF0ZSwgcmVhZF9idWZmZXIgPSBSZW1haW5pbmd9LCB7b2ssIFJlc3VsdH19OworICAgICAgICB7TmV3U3RhdGUsIEVycm9yfSAtPgorICAgICAgICAgIHtTdGF0ZSN0X2ZyYW1lZHt3cmFwcGVkID0gTmV3U3RhdGV9LCBFcnJvcn0KKyAgICAgIGVuZDsKKyAgICAlJSByZWFkIG9mIHplcm8gYnl0ZXMKKyAgICA8PD4+IC0+IHtTdGF0ZSwge29rLCA8PD4+fX07CisgICAgJSUgcmVhZCBidWZmZXIgaXMgbm9uZW1wdHkKKyAgICBfIC0+CisgICAgICBHaXZlID0gbWluKGlvbGlzdF9zaXplKEJpbmFyeSksIExlbiksCisgICAgICB7UmVzdWx0LCBSZW1haW5pbmd9ID0gc3BsaXRfYmluYXJ5KEJpbmFyeSwgR2l2ZSksCisgICAgICB7U3RhdGUjdF9mcmFtZWR7cmVhZF9idWZmZXIgPSBSZW1haW5pbmd9LCB7b2ssIFJlc3VsdH19CisgIGVuZC4KIAotJSUgRmx1c2hlcyB0aGUgYnVmZmVyIHRocm91Z2ggdG8gdGhlIHdyYXBwZWQgdHJhbnNwb3J0Ci1mbHVzaChTdGF0ZTAgPSAjZnJhbWVkX3RyYW5zcG9ydHt3cml0ZV9idWZmZXIgPSBCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwZWQgPSBXcmFwcGVkMH0pIC0+Ci0gICAgRnJhbWVMZW4gPSBpb2xpc3Rfc2l6ZShCdWZmZXIpLAotICAgIERhdGEgICAgID0gWzw8RnJhbWVMZW46MzIvaW50ZWdlci1zaWduZWQtYmlnPj4sIEJ1ZmZlcl0sCiAKLSAgICB7V3JhcHBlZDEsIFJlc3BvbnNlfSA9IHRocmlmdF90cmFuc3BvcnQ6d3JpdGUoV3JhcHBlZDAsIERhdGEpLAorcmVhZF9leGFjdChTdGF0ZSA9ICN0X2ZyYW1lZHt3cmFwcGVkID0gV3JhcHBlZCwgcmVhZF9idWZmZXIgPSBCdWZmZXJ9LCBMZW4pCit3aGVuIGlzX2ludGVnZXIoTGVuKSwgTGVuID49IDAgLT4KKyAgQmluYXJ5ID0gaW9saXN0X3RvX2JpbmFyeShCdWZmZXIpLAorICBjYXNlIGlvbGlzdF9zaXplKEJpbmFyeSkgb2YKKyAgICAlJSByZWFkIGJ1ZmZlciBpcyBsYXJnZXIgdGhhbiByZXF1ZXN0ZWQgcmVhZCBzaXplCisgICAgWCB3aGVuIFggPj0gTGVuIC0+CisgICAgICB7UmVzdWx0LCBSZW1haW5pbmd9ID0gc3BsaXRfYmluYXJ5KEJpbmFyeSwgTGVuKSwKKyAgICAgIHtTdGF0ZSN0X2ZyYW1lZHtyZWFkX2J1ZmZlciA9IFJlbWFpbmluZ30sIHtvaywgUmVzdWx0fX07CisgICAgJSUgcmVhZCBidWZmZXIgaXMgaW5zdWZmaWNpZW50IGZvciByZXF1ZXN0ZWQgcmVhZCBzaXplCisgICAgXyAtPgorICAgICAgY2FzZSBuZXh0X2ZyYW1lKFdyYXBwZWQpIG9mCisgICAgICAgIHtOZXdTdGF0ZSwge29rLCBGcmFtZX19IC0+CisgICAgICAgICAgcmVhZF9leGFjdCgKKyAgICAgICAgICAgIFN0YXRlI3RfZnJhbWVke3dyYXBwZWQgPSBOZXdTdGF0ZSwgcmVhZF9idWZmZXIgPSBbQnVmZmVyLCBGcmFtZV19LAorICAgICAgICAgICAgTGVuCisgICAgICAgICAgKTsKKyAgICAgICAge05ld1N0YXRlLCBFcnJvcn0gLT4KKyAgICAgICAgICB7U3RhdGUjdF9mcmFtZWR7d3JhcHBlZCA9IE5ld1N0YXRlfSwgRXJyb3J9CisgICAgICBlbmQKKyAgZW5kLgogCi0gICAge1dyYXBwZWQyLCBffSA9IHRocmlmdF90cmFuc3BvcnQ6Zmx1c2goV3JhcHBlZDEpLAorbmV4dF9mcmFtZShUcmFuc3BvcnQpIC0+CisgIGNhc2UgdGhyaWZ0X3RyYW5zcG9ydDpyZWFkX2V4YWN0KFRyYW5zcG9ydCwgNCkgb2YKKyAgICB7TmV3U3RhdGUsIHtvaywgPDxGcmFtZUxlbmd0aDozMi9pbnRlZ2VyLXNpZ25lZC1iaWc+Pn19IC0+CisgICAgICB0aHJpZnRfdHJhbnNwb3J0OnJlYWRfZXhhY3QoTmV3U3RhdGUsIEZyYW1lTGVuZ3RoKTsKKyAgICBFcnJvciAtPiBFcnJvcgorICBlbmQuCiAKLSAgICBTdGF0ZTEgPSBTdGF0ZTAjZnJhbWVkX3RyYW5zcG9ydHt3cmFwcGVkID0gV3JhcHBlZDIsIHdyaXRlX2J1ZmZlciA9IFtdfSwKLSAgICB7U3RhdGUxLCBSZXNwb25zZX0uCiAKLSUlIENsb3NlcyB0aGUgdHJhbnNwb3J0IGFuZCB0aGUgd3JhcHBlZCB0cmFuc3BvcnQKLWNsb3NlKFN0YXRlID0gI2ZyYW1lZF90cmFuc3BvcnR7d3JhcHBlZCA9IFdyYXBwZWQwfSkgLT4KLSAgICB7V3JhcHBlZDEsIFJlc3VsdH0gPSB0aHJpZnRfdHJhbnNwb3J0OmNsb3NlKFdyYXBwZWQwKSwKLSAgICBOZXdTdGF0ZSA9IFN0YXRlI2ZyYW1lZF90cmFuc3BvcnR7d3JhcHBlZCA9IFdyYXBwZWQxfSwKLSAgICB7TmV3U3RhdGUsIFJlc3VsdH0uCit3cml0ZShTdGF0ZSA9ICN0X2ZyYW1lZHt3cml0ZV9idWZmZXIgPSBCdWZmZXJ9LCBEYXRhKSAtPgorICB7U3RhdGUjdF9mcmFtZWR7d3JpdGVfYnVmZmVyID0gW0J1ZmZlciwgRGF0YV19LCBva30uCiAKLSUlIFJlYWRzIGRhdGEgdGhyb3VnaCBmcm9tIHRoZSB3cmFwcGVkIHRyYW5zcG9ydAotcmVhZChTdGF0ZTAgPSAjZnJhbWVkX3RyYW5zcG9ydHt3cmFwcGVkID0gV3JhcHBlZDAsIHJlYWRfYnVmZmVyID0gUkJ1Zn0sCi0gICAgIExlbikgd2hlbiBpc19pbnRlZ2VyKExlbikgLT4KLSAgICB7V3JhcHBlZDEsIHtSQnVmMSwgUkJ1ZjFTaXplfX0gPQotICAgICAgICAlJSBpZiB0aGUgcmVhZCBidWZmZXIgaXMgZW1wdHksIHJlYWQgYW5vdGhlciBmcmFtZQotICAgICAgICAlJSBvdGhlcndpc2UsIGp1c3QgcmVhZCBmcm9tIHdoYXQncyBsZWZ0IGluIHRoZSBidWZmZXIKLSAgICAgICAgY2FzZSBpb2xpc3Rfc2l6ZShSQnVmKSBvZgotICAgICAgICAgICAgMCAtPgotICAgICAgICAgICAgICAgICUlIHJlYWQgdGhlIGZyYW1lIGxlbmd0aAotICAgICAgICAgICAgICAgIGNhc2UgdGhyaWZ0X3RyYW5zcG9ydDpyZWFkKFdyYXBwZWQwLCA0KSBvZgotICAgICAgICAgICAgICAgICAge1dyYXBwZWRTMSwKLSAgICAgICAgICAgICAgICAgICAge29rLCA8PEZyYW1lTGVuOjMyL2ludGVnZXItc2lnbmVkLWJpZywgXy9iaW5hcnk+Pn19IC0+Ci0gICAgICAgICAgICAgICAgICAgICUlIHRoZW4gcmVhZCB0aGUgZGF0YQotICAgICAgICAgICAgICAgICAgICBjYXNlIHRocmlmdF90cmFuc3BvcnQ6cmVhZChXcmFwcGVkUzEsIEZyYW1lTGVuKSBvZgotICAgICAgICAgICAgICAgICAgICAgIHtXcmFwcGVkUzIsIHtvaywgQmlufX0gLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIHtXcmFwcGVkUzIsIHtCaW4sIGVybGFuZzpieXRlX3NpemUoQmluKX19OwotICAgICAgICAgICAgICAgICAgICAgIHtXcmFwcGVkUzIsIHtlcnJvciwgUmVhc29uMX19IC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICB7V3JhcHBlZFMyLCB7ZXJyb3IsIFJlYXNvbjF9fQotICAgICAgICAgICAgICAgICAgICBlbmQ7Ci0gICAgICAgICAgICAgICAgICB7V3JhcHBlZFMxLCB7ZXJyb3IsIFJlYXNvbjJ9fSAtPgotICAgICAgICAgICAgICAgICAgICB7V3JhcHBlZFMxLCB7ZXJyb3IsIFJlYXNvbjJ9fQotICAgICAgICAgICAgICAgIGVuZDsKLSAgICAgICAgICAgIFN6IC0+Ci0gICAgICAgICAgICAgICAge1dyYXBwZWQwLCB7UkJ1ZiwgU3p9fQotICAgICAgICBlbmQsCiAKLSAgICAlJSBwdWxsIG9mZiBHaXZlIGJ5dGVzLCByZXR1cm4gdGhlbSB0byB0aGUgdXNlciwgbGVhdmUgdGhlIHJlc3QgaW4gdGhlIGJ1ZmZlcgotICAgIGNhc2UgUkJ1ZjEgb2YKLSAgICAgIGVycm9yIC0+Ci0gICAgICAgIHsgU3RhdGUwI2ZyYW1lZF90cmFuc3BvcnQge3dyYXBwZWQgPSBXcmFwcGVkMSwgcmVhZF9idWZmZXIgPSBbXSB9LAotICAgICAgICAgIHtSQnVmMSwgUkJ1ZjFTaXplfSB9OwotICAgICAgXyAtPgotICAgICAgICBHaXZlID0gbWluKFJCdWYxU2l6ZSwgTGVuKSwKLSAgICAgICAgPDxEYXRhOkdpdmUvYmluYXJ5LCBSQnVmMi9iaW5hcnk+PiA9IGlvbGlzdF90b19iaW5hcnkoUkJ1ZjEpLAorZmx1c2goU3RhdGUgPSAjdF9mcmFtZWR7d3JpdGVfYnVmZmVyID0gQnVmZmVyLCB3cmFwcGVkID0gV3JhcHBlZH0pIC0+CisgIGNhc2UgaW9saXN0X3NpemUoQnVmZmVyKSBvZgorICAgICUlIGlmIHdyaXRlIGJ1ZmZlciBpcyBlbXB0eSwgZG8gbm90aGluZworICAgIDAgLT4ge1N0YXRlLCBva307CisgICAgRnJhbWVMZW4gLT4KKyAgICAgIERhdGEgPSBbPDxGcmFtZUxlbjozMi9pbnRlZ2VyLXNpZ25lZC1iaWc+PiwgQnVmZmVyXSwKKyAgICAgIHtXcml0dGVuLCBSZXNwb25zZX0gPSB0aHJpZnRfdHJhbnNwb3J0OndyaXRlKFdyYXBwZWQsIERhdGEpLAorICAgICAge0ZsdXNoZWQsIG9rfSA9IHRocmlmdF90cmFuc3BvcnQ6Zmx1c2goV3JpdHRlbiksCisgICAgICB7U3RhdGUjdF9mcmFtZWR7d3JhcHBlZCA9IEZsdXNoZWQsIHdyaXRlX2J1ZmZlciA9IFtdfSwgUmVzcG9uc2V9CisgIGVuZC4KIAotICAgICAgICB7IFN0YXRlMCNmcmFtZWRfdHJhbnNwb3J0e3dyYXBwZWQgPSBXcmFwcGVkMSwgcmVhZF9idWZmZXI9UkJ1ZjJ9LAotICAgICAgICAgIHtvaywgRGF0YX0gfQotICAgIGVuZC4KKworY2xvc2UoU3RhdGUgPSAjdF9mcmFtZWR7d3JhcHBlZCA9IFdyYXBwZWR9KSAtPgorICB7Q2xvc2VkLCBSZXN1bHR9ID0gdGhyaWZ0X3RyYW5zcG9ydDpjbG9zZShXcmFwcGVkKSwKKyAge1N0YXRlI3RfZnJhbWVke3dyYXBwZWQgPSBDbG9zZWR9LCBSZXN1bHR9LgorCmRpZmYgLS1naXQgYS9saWIvZXJsL3NyYy90aHJpZnRfanNvbl9wYXJzZXIuZXJsIGIvbGliL2VybC9zcmMvdGhyaWZ0X2pzb25fcGFyc2VyLmVybAppbmRleCBiN2RkNTg2Li40ZTQ3ZjEwIDEwMDY0NAotLS0gYS9saWIvZXJsL3NyYy90aHJpZnRfanNvbl9wYXJzZXIuZXJsCisrKyBiL2xpYi9lcmwvc3JjL3RocmlmdF9qc29uX3BhcnNlci5lcmwKQEAgLTIxOSw3ICsyMTksNyBAQAogc3RyaW5nKDw8Xy91dGY4LCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWc9I2NvbmZpZ3tzdHJpY3RfdXRmOD1mYWxzZX0pIC0+CiAgICAgc3RyaW5nKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCAxNiNmZmZkKSwgU3RhY2ssIENvbmZpZyk7CiAlJSB1K2ZmZmUgYW5kIHUrZmZmZiBmb3IgUjE0QlhYIChzdWJzZXF1ZW50IHJ1bnRpbWVzIHdpbGwgaGFwcGlseSBtYXRjaCB0aGUKLSUlICBwcmVjZWVkaW5nIGNsYXVzZQorJSUgIHByZWNlZGluZyBjbGF1c2UKIHN0cmluZyg8PDIzOSwgMTkxLCBYLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWc9I2NvbmZpZ3tzdHJpY3RfdXRmOD1mYWxzZX0pCiAgICAgICAgIHdoZW4gWCA9PSAxOTA7IFggPT0gMTkxIC0+CiAgICAgc3RyaW5nKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCAxNiNmZmZkKSwgU3RhY2ssIENvbmZpZyk7CmRpZmYgLS1naXQgYS9saWIvZXJsL3NyYy90aHJpZnRfanNvbl9wcm90b2NvbC5lcmwgYi9saWIvZXJsL3NyYy90aHJpZnRfanNvbl9wcm90b2NvbC5lcmwKaW5kZXggOGI5ZTYxMy4uYzVmM2RhOCAxMDA2NDQKLS0tIGEvbGliL2VybC9zcmMvdGhyaWZ0X2pzb25fcHJvdG9jb2wuZXJsCisrKyBiL2xpYi9lcmwvc3JjL3RocmlmdF9qc29uX3Byb3RvY29sLmVybApAQCAtNTYsNiArNTYsNyBAQAogdHlwZWlkX3RvX2pzb24oP3RUeXBlX0JPT0wpIC0+ICJ0ZiI7CiB0eXBlaWRfdG9fanNvbig/dFR5cGVfQllURSkgLT4gImk4IjsKIHR5cGVpZF90b19qc29uKD90VHlwZV9ET1VCTEUpIC0+ICJkYmwiOwordHlwZWlkX3RvX2pzb24oP3RUeXBlX0k4KSAtPiAiaTgiOwogdHlwZWlkX3RvX2pzb24oP3RUeXBlX0kxNikgLT4gImkxNiI7CiB0eXBlaWRfdG9fanNvbig/dFR5cGVfSTMyKSAtPiAiaTMyIjsKIHR5cGVpZF90b19qc29uKD90VHlwZV9JNjQpIC0+ICJpNjQiOwpAQCAtNjYsOCArNjcsOCBAQAogdHlwZWlkX3RvX2pzb24oP3RUeXBlX0xJU1QpIC0+ICJsc3QiLgogCiBqc29uX3RvX3R5cGVpZCgidGYiKSAtPiA/dFR5cGVfQk9PTDsKLWpzb25fdG9fdHlwZWlkKCJpOCIpIC0+ID90VHlwZV9CWVRFOwoganNvbl90b190eXBlaWQoImRibCIpIC0+ID90VHlwZV9ET1VCTEU7Citqc29uX3RvX3R5cGVpZCgiaTgiKSAtPiA/dFR5cGVfSTg7CiBqc29uX3RvX3R5cGVpZCgiaTE2IikgLT4gP3RUeXBlX0kxNjsKIGpzb25fdG9fdHlwZWlkKCJpMzIiKSAtPiA/dFR5cGVfSTMyOwoganNvbl90b190eXBlaWQoImk2NCIpIC0+ID90VHlwZV9JNjQ7CmRpZmYgLS1naXQgYS9saWIvZXJsL3NyYy90aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydC5lcmwgYi9saWIvZXJsL3NyYy90aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydC5lcmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU5YWNiMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9lcmwvc3JjL3RocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LmVybApAQCAtMCwwICsxLDgzIEBACislJQorJSUgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorJSUgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyUlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCislJSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyUlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyUlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyUlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorJSUKKyUlICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCislJQorJSUgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorJSUgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyUlICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorJSUgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyUlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyUlIHVuZGVyIHRoZSBMaWNlbnNlLgorJSUKKworLW1vZHVsZSh0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCkuCisKKy1iZWhhdmlvdXIodGhyaWZ0X3RyYW5zcG9ydCkuCisKKyUlIGNvbnN0cnVjdG9ycworLWV4cG9ydChbbmV3LzAsIG5ldy8xXSkuCislJSBwcm90b2NvbCBjYWxsYmFja3MKKy1leHBvcnQoW3JlYWQvMiwgcmVhZF9leGFjdC8yLCB3cml0ZS8yLCBmbHVzaC8xLCBjbG9zZS8xXSkuCisKKworLXJlY29yZCh0X21lbWJ1ZmZlciwgeworICBidWZmZXIgPSBbXQorfSkuCisKKy10eXBlIHN0YXRlKCkgOjogI3RfbWVtYnVmZmVye30uCisKKworLXNwZWMgbmV3KCkgLT4gdGhyaWZ0X3RyYW5zcG9ydDp0X3RyYW5zcG9ydCgpLgorCituZXcoKSAtPiBuZXcoW10pLgorCistc3BlYyBuZXcoQnVmOjppb2RhdGEoKSkgLT4gdGhyaWZ0X3RyYW5zcG9ydDp0X3RyYW5zcG9ydCgpLgorCituZXcoQnVmKSB3aGVuIGlzX2xpc3QoQnVmKSAtPgorICBTdGF0ZSA9ICN0X21lbWJ1ZmZlcntidWZmZXIgPSBCdWZ9LAorICB0aHJpZnRfdHJhbnNwb3J0Om5ldyg/TU9EVUxFLCBTdGF0ZSk7CituZXcoQnVmKSB3aGVuIGlzX2JpbmFyeShCdWYpIC0+CisgIFN0YXRlID0gI3RfbWVtYnVmZmVye2J1ZmZlciA9IFtCdWZdfSwKKyAgdGhyaWZ0X3RyYW5zcG9ydDpuZXcoP01PRFVMRSwgU3RhdGUpLgorCisKKy1pbmNsdWRlKCJ0aHJpZnRfdHJhbnNwb3J0X2JlaGF2aW91ci5ocmwiKS4KKworCityZWFkKFN0YXRlID0gI3RfbWVtYnVmZmVye2J1ZmZlciA9IEJ1Zn0sIExlbikKK3doZW4gaXNfaW50ZWdlcihMZW4pLCBMZW4gPj0gMCAtPgorICBCaW5hcnkgPSBpb2xpc3RfdG9fYmluYXJ5KEJ1ZiksCisgIEdpdmUgPSBtaW4oaW9saXN0X3NpemUoQmluYXJ5KSwgTGVuKSwKKyAge1Jlc3VsdCwgUmVtYWluaW5nfSA9IHNwbGl0X2JpbmFyeShCaW5hcnksIEdpdmUpLAorICB7U3RhdGUjdF9tZW1idWZmZXJ7YnVmZmVyID0gUmVtYWluaW5nfSwge29rLCBSZXN1bHR9fS4KKworCityZWFkX2V4YWN0KFN0YXRlID0gI3RfbWVtYnVmZmVye2J1ZmZlciA9IEJ1Zn0sIExlbikKK3doZW4gaXNfaW50ZWdlcihMZW4pLCBMZW4gPj0gMCAtPgorICBCaW5hcnkgPSBpb2xpc3RfdG9fYmluYXJ5KEJ1ZiksCisgIGNhc2UgaW9saXN0X3NpemUoQmluYXJ5KSBvZgorICAgIFggd2hlbiBYID49IExlbiAtPgorICAgICAge1Jlc3VsdCwgUmVtYWluaW5nfSA9IHNwbGl0X2JpbmFyeShCaW5hcnksIExlbiksCisgICAgICB7U3RhdGUjdF9tZW1idWZmZXJ7YnVmZmVyID0gUmVtYWluaW5nfSwge29rLCBSZXN1bHR9fTsKKyAgICBfIC0+CisgICAgICB7U3RhdGUsIHtlcnJvciwgZW9mfX0KKyAgZW5kLgorCisKK3dyaXRlKFN0YXRlID0gI3RfbWVtYnVmZmVye2J1ZmZlciA9IEJ1Zn0sIERhdGEpCit3aGVuIGlzX2xpc3QoRGF0YSk7IGlzX2JpbmFyeShEYXRhKSAtPgorICB7U3RhdGUjdF9tZW1idWZmZXJ7YnVmZmVyID0gW0J1ZiwgRGF0YV19LCBva30uCisKKworZmx1c2goU3RhdGUpIC0+IHtTdGF0ZSwgb2t9LgorCisKK2Nsb3NlKFN0YXRlKSAtPiB7U3RhdGUsIG9rfS4KKwpkaWZmIC0tZ2l0IGEvbGliL2VybC9zcmMvdGhyaWZ0X21lbW9yeV9idWZmZXIuZXJsIGIvbGliL2VybC9zcmMvdGhyaWZ0X21lbW9yeV9idWZmZXIuZXJsCmluZGV4IDUzYWJiYzQuLjZhNTllYTUgMTAwNjQ0Ci0tLSBhL2xpYi9lcmwvc3JjL3RocmlmdF9tZW1vcnlfYnVmZmVyLmVybAorKysgYi9saWIvZXJsL3NyYy90aHJpZnRfbWVtb3J5X2J1ZmZlci5lcmwKQEAgLTIxLDQyICsyMSwyNyBAQAogCiAtYmVoYXZpb3VyKHRocmlmdF90cmFuc3BvcnQpLgogCi0lJSBBUEkKLS1leHBvcnQoW25ldy8wLCBuZXcvMSwgbmV3X3RyYW5zcG9ydF9mYWN0b3J5LzBdKS4KKyUlIGNvbnN0cnVjdG9ycworLWV4cG9ydChbbmV3LzAsIG5ldy8xXSkuCislJSBwcm90b2NvbCBjYWxsYmFja3MKKy1leHBvcnQoW3JlYWQvMiwgd3JpdGUvMiwgZmx1c2gvMSwgY2xvc2UvMV0pLgorJSUgbGVnYWN5IGFwaQorLWV4cG9ydChbbmV3X3RyYW5zcG9ydF9mYWN0b3J5LzBdKS4KIAotJSUgdGhyaWZ0X3RyYW5zcG9ydCBjYWxsYmFja3MKLS1leHBvcnQoW3dyaXRlLzIsIHJlYWQvMiwgZmx1c2gvMSwgY2xvc2UvMV0pLgogCi0tcmVjb3JkKG1lbW9yeV9idWZmZXIsIHtidWZmZXJ9KS4KLS10eXBlIHN0YXRlKCkgOjogI21lbW9yeV9idWZmZXJ7fS4KLS1pbmNsdWRlKCJ0aHJpZnRfdHJhbnNwb3J0X2JlaGF2aW91ci5ocmwiKS4KKyUlIHdyYXBwZXIgYXJvdW5kIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0IGZvciBsZWdhY3kgcmVhc29ucwogCi1uZXcoKSAtPgotICAgIFN0YXRlID0gI21lbW9yeV9idWZmZXJ7YnVmZmVyID0gW119LAotICAgIHRocmlmdF90cmFuc3BvcnQ6bmV3KD9NT0RVTEUsIFN0YXRlKS4KK25ldygpIC0+IHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0Om5ldygpLgogCi1uZXcgKEJ1Zikgd2hlbiBpc19saXN0IChCdWYpIC0+Ci0gIFN0YXRlID0gI21lbW9yeV9idWZmZXJ7YnVmZmVyID0gQnVmfSwKLSAgdGhyaWZ0X3RyYW5zcG9ydDpuZXcoP01PRFVMRSwgU3RhdGUpOwotbmV3IChCdWYpIC0+Ci0gIFN0YXRlID0gI21lbW9yeV9idWZmZXJ7YnVmZmVyID0gW0J1Zl19LAotICB0aHJpZnRfdHJhbnNwb3J0Om5ldyg/TU9EVUxFLCBTdGF0ZSkuCituZXcoU3RhdGUpIC0+IHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0Om5ldyhTdGF0ZSkuCiAKLW5ld190cmFuc3BvcnRfZmFjdG9yeSgpIC0+Ci0gICAge29rLCBmdW4oKSAtPiBuZXcoKSBlbmR9LgorbmV3X3RyYW5zcG9ydF9mYWN0b3J5KCkgLT4ge29rLCBmdW4oKSAtPiBuZXcoKSBlbmR9LgogCi0lJSBXcml0ZXMgZGF0YSBpbnRvIHRoZSBidWZmZXIKLXdyaXRlKFN0YXRlID0gI21lbW9yeV9idWZmZXJ7YnVmZmVyID0gQnVmfSwgRGF0YSkgLT4KLSAgICB7U3RhdGUjbWVtb3J5X2J1ZmZlcntidWZmZXIgPSBbQnVmLCBEYXRhXX0sIG9rfS4KK3dyaXRlKFN0YXRlLCBEYXRhKSAtPiB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydDp3cml0ZShTdGF0ZSwgRGF0YSkuCiAKLWZsdXNoKFN0YXRlID0gI21lbW9yeV9idWZmZXIge2J1ZmZlciA9IEJ1Zn0pIC0+Ci0gICAge1N0YXRlI21lbW9yeV9idWZmZXJ7YnVmZmVyID0gW119LCBCdWZ9LgorcmVhZChTdGF0ZSwgRGF0YSkgLT4gdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQ6cmVhZChTdGF0ZSwgRGF0YSkuCiAKLWNsb3NlKFN0YXRlKSAtPgotICAgIHtTdGF0ZSwgb2t9LgorZmx1c2goU3RhdGUpIC0+IHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0OmZsdXNoKFN0YXRlKS4KIAotcmVhZChTdGF0ZSA9ICNtZW1vcnlfYnVmZmVye2J1ZmZlciA9IEJ1Zn0sIExlbikgd2hlbiBpc19pbnRlZ2VyKExlbikgLT4KLSAgICBCaW5hcnkgPSBpb2xpc3RfdG9fYmluYXJ5KEJ1ZiksCi0gICAgR2l2ZSA9IG1pbihpb2xpc3Rfc2l6ZShCaW5hcnkpLCBMZW4pLAotICAgIHtSZXN1bHQsIFJlbWFpbmluZ30gPSBzcGxpdF9iaW5hcnkoQmluYXJ5LCBHaXZlKSwKLSAgICB7U3RhdGUjbWVtb3J5X2J1ZmZlcntidWZmZXIgPSBSZW1haW5pbmd9LCB7b2ssIFJlc3VsdH19LgorY2xvc2UoU3RhdGUpIC0+IHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0OmNsb3NlKFN0YXRlKS4KKwpkaWZmIC0tZ2l0IGEvbGliL2VybC9zcmMvdGhyaWZ0X211bHRpcGxleGVkX21hcF93cmFwcGVyLmVybCBiL2xpYi9lcmwvc3JjL3RocmlmdF9tdWx0aXBsZXhlZF9tYXBfd3JhcHBlci5lcmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRjNWU5NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9lcmwvc3JjL3RocmlmdF9tdWx0aXBsZXhlZF9tYXBfd3JhcHBlci5lcmwKQEAgLTAsMCArMSw1NyBAQAorJSUKKyUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCislJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCislJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCislJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCislJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyUlCislJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorJSUKKyUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCislJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCislJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCislJSB1bmRlciB0aGUgTGljZW5zZS4KKyUlCisKKy1tb2R1bGUodGhyaWZ0X211bHRpcGxleGVkX21hcF93cmFwcGVyKS4KKworLWV4cG9ydChbCisgICAgICAgICAgbmV3LzAKKyAgICAgICAgICxzdG9yZS8zCisgICAgICAgICAsZmluZC8yCisgICAgICAgICAsZmV0Y2gvMgorICAgICAgICBdKS4KKworLXR5cGUgc2VydmljZV9oYW5kbGVyKCkgICAgIDo6IG5vbmVtcHR5X3N0cmluZygpLgorLXR5cGUgbW9kdWxlXygpICAgICAgICAgICAgIDo6IGF0b20oKS4KKy10eXBlIHNlcnZpY2VfaGFuZGxlcl9tYXAoKSA6OiBbe1NlcnZpY2VIYW5kbGVyOjpzZXJ2aWNlX2hhbmRsZXIoKSwgTW9kdWxlOjptb2R1bGVfKCl9XS4KKworLXNwZWMgbmV3KCkgLT4gc2VydmljZV9oYW5kbGVyX21hcCgpLgorbmV3KCkgLT4KKyAgICBvcmRkaWN0Om5ldygpLgorCistc3BlYyBzdG9yZShTZXJ2aWNlSGFuZGxlciwgTW9kdWxlLCBNYXApIC0+IE5ld01hcCB3aGVuCisgICAgU2VydmljZUhhbmRsZXIgOjogc2VydmljZV9oYW5kbGVyKCksCisgICAgTW9kdWxlICAgICAgICAgOjogbW9kdWxlXygpLAorICAgIE1hcCAgICAgICAgICAgIDo6IHNlcnZpY2VfaGFuZGxlcl9tYXAoKSwKKyAgICBOZXdNYXAgICAgICAgICA6OiBzZXJ2aWNlX2hhbmRsZXJfbWFwKCkuCitzdG9yZShTZXJ2aWNlSGFuZGxlciwgTW9kdWxlLCBNYXApIC0+CisgICAgb3JkZGljdDpzdG9yZShTZXJ2aWNlSGFuZGxlciwgTW9kdWxlLCBNYXApLgorCistc3BlYyBmaW5kKFNlcnZpY2VIYW5kbGVyLCBNYXApIC0+IHtvaywgTW9kdWxlfSB8IGVycm9yIHdoZW4KKyAgICBTZXJ2aWNlSGFuZGxlciA6OiBzZXJ2aWNlX2hhbmRsZXIoKSwKKyAgICBNb2R1bGUgICAgICAgICA6OiBtb2R1bGVfKCksCisgICAgTWFwICAgICAgICAgICAgOjogc2VydmljZV9oYW5kbGVyX21hcCgpLgorZmluZChTZXJ2aWNlSGFuZGxlciwgTWFwKSAtPgorICAgIG9yZGRpY3Q6ZmluZChTZXJ2aWNlSGFuZGxlciwgTWFwKS4KKworLXNwZWMgZmV0Y2goU2VydmljZUhhbmRsZXIsIE1hcCkgLT4gTW9kdWxlIHdoZW4KKyAgICBTZXJ2aWNlSGFuZGxlciA6OiBzZXJ2aWNlX2hhbmRsZXIoKSwKKyAgICBNb2R1bGUgICAgICAgICA6OiBtb2R1bGVfKCksCisgICAgTWFwICAgICAgICAgICAgOjogc2VydmljZV9oYW5kbGVyX21hcCgpLgorZmV0Y2goU2VydmljZUhhbmRsZXIsIE1hcCkgLT4KKyAgICBvcmRkaWN0OmZldGNoKFNlcnZpY2VIYW5kbGVyLCBNYXApLgpkaWZmIC0tZ2l0IGEvbGliL2VybC9zcmMvdGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sLmVybCBiL2xpYi9lcmwvc3JjL3RocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbC5lcmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY3YjcwYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9lcmwvc3JjL3RocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbC5lcmwKQEAgLTAsMCArMSw4MyBAQAorJSUKKyUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCislJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCislJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCislJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCislJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyUlCislJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorJSUKKyUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCislJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCislJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCislJSB1bmRlciB0aGUgTGljZW5zZS4KKyUlCisKKy1tb2R1bGUodGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sKS4KKworLWJlaGF2aW91cih0aHJpZnRfcHJvdG9jb2wpLgorCistaW5jbHVkZSgidGhyaWZ0X2NvbnN0YW50cy5ocmwiKS4KKy1pbmNsdWRlKCJ0aHJpZnRfcHJvdG9jb2wuaHJsIikuCisKKy1pbmNsdWRlKCJ0aHJpZnRfcHJvdG9jb2xfYmVoYXZpb3VyLmhybCIpLgorCistZXhwb3J0KFtuZXcvMiwKKyAgICAgICAgIHJlYWQvMiwKKyAgICAgICAgIHdyaXRlLzIsCisgICAgICAgICBmbHVzaF90cmFuc3BvcnQvMSwKKyAgICAgICAgIGNsb3NlX3RyYW5zcG9ydC8xCisgICAgICAgIF0pLgorCistcmVjb3JkKHByb3RvY29sLCB7bW9kdWxlLCBkYXRhfSkuCistdHlwZSBwcm90b2NvbCgpIDo6ICNwcm90b2NvbHt9LgorCistcmVjb3JkIChtdWx0aXBsZXhlZF9wcm90b2NvbCwge3Byb3RvY29sX21vZHVsZV90b19kZWNvcmF0ZTo6YXRvbSgpLAorCQkJCQkJCQlwcm90b2NvbF9kYXRhX3RvX2RlY29yYXRlOjp0ZXJtKCksCisJCQkJCQkJCXNlcnZpY2VfbmFtZTo6bm9uZW1wdHlfc3RyaW5nKCl9KS4KKworLXR5cGUgc3RhdGUoKSA6OiAjbXVsdGlwbGV4ZWRfcHJvdG9jb2x7fS4KKworLXNwZWMgbmV3KFByb3RvY29sVG9EZWNvcmF0ZTo6cHJvdG9jb2woKSwgU2VydmljZU5hbWU6Om5vbmVtcHR5X3N0cmluZygpKSAtPiB7b2ssIFByb3RvY29sOjpwcm90b2NvbCgpfS4KK25ldyhQcm90b2NvbFRvRGVjb3JhdGUsIFNlcnZpY2VOYW1lKSB3aGVuIGlzX3JlY29yZChQcm90b2NvbFRvRGVjb3JhdGUsIHByb3RvY29sKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2xpc3QoU2VydmljZU5hbWUpIC0+CisgICAgU3RhdGUgPSAjbXVsdGlwbGV4ZWRfcHJvdG9jb2x7cHJvdG9jb2xfbW9kdWxlX3RvX2RlY29yYXRlID0gUHJvdG9jb2xUb0RlY29yYXRlI3Byb3RvY29sLm1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sX2RhdGFfdG9fZGVjb3JhdGUgPSBQcm90b2NvbFRvRGVjb3JhdGUjcHJvdG9jb2wuZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlX25hbWUgPSBTZXJ2aWNlTmFtZX0sCisgICAgdGhyaWZ0X3Byb3RvY29sOm5ldyg/TU9EVUxFLCBTdGF0ZSkuCisKK2ZsdXNoX3RyYW5zcG9ydChTdGF0ZSA9ICNtdWx0aXBsZXhlZF9wcm90b2NvbHtwcm90b2NvbF9tb2R1bGVfdG9fZGVjb3JhdGUgPSBQcm90b2NvbE1vZHVsZVRvRGVjb3JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbF9kYXRhX3RvX2RlY29yYXRlID0gU3RhdGUwfSkgLT4KKyAgICB7U3RhdGUxLCBva30gPSBQcm90b2NvbE1vZHVsZVRvRGVjb3JhdGU6Zmx1c2hfdHJhbnNwb3J0KFN0YXRlMCksCisgICAge1N0YXRlI211bHRpcGxleGVkX3Byb3RvY29se3Byb3RvY29sX2RhdGFfdG9fZGVjb3JhdGUgPSBTdGF0ZTF9LCBva30uCisKK2Nsb3NlX3RyYW5zcG9ydChTdGF0ZSA9ICNtdWx0aXBsZXhlZF9wcm90b2NvbHtwcm90b2NvbF9tb2R1bGVfdG9fZGVjb3JhdGUgPSBQcm90b2NvbE1vZHVsZVRvRGVjb3JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbF9kYXRhX3RvX2RlY29yYXRlID0gU3RhdGUwfSkgLT4KKyAgICB7U3RhdGUxLCBva30gPSBQcm90b2NvbE1vZHVsZVRvRGVjb3JhdGU6Y2xvc2VfdHJhbnNwb3J0KFN0YXRlMCksCisgICAge1N0YXRlI211bHRpcGxleGVkX3Byb3RvY29se3Byb3RvY29sX2RhdGFfdG9fZGVjb3JhdGUgPSBTdGF0ZTF9LCBva30uCisKK3dyaXRlKFN0YXRlID0gI211bHRpcGxleGVkX3Byb3RvY29se3Byb3RvY29sX21vZHVsZV90b19kZWNvcmF0ZSA9IFByb3RvY29sTW9kdWxlVG9EZWNvcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2xfZGF0YV90b19kZWNvcmF0ZSA9IFN0YXRlMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VfbmFtZSA9IFNlcnZpY2VOYW1lfSwKKyAgICAgIE1lc3NhZ2UgPSAjcHJvdG9jb2xfbWVzc2FnZV9iZWdpbntuYW1lID0gTmFtZX0pIC0+CisgICAge1N0YXRlMSwgb2t9ID0gUHJvdG9jb2xNb2R1bGVUb0RlY29yYXRlOndyaXRlKFN0YXRlMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSNwcm90b2NvbF9tZXNzYWdlX2JlZ2lue25hbWU9U2VydmljZU5hbWUgKysKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgP01VTFRJUExFWEVEX1NFUlZJQ0VfU0VQQVJBVE9SICsrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWV9KSwKKyAgICB7U3RhdGUjbXVsdGlwbGV4ZWRfcHJvdG9jb2x7cHJvdG9jb2xfZGF0YV90b19kZWNvcmF0ZSA9IFN0YXRlMX0sIG9rfTsKKword3JpdGUoU3RhdGUgPSAjbXVsdGlwbGV4ZWRfcHJvdG9jb2x7cHJvdG9jb2xfbW9kdWxlX3RvX2RlY29yYXRlID0gUHJvdG9jb2xNb2R1bGVUb0RlY29yYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbF9kYXRhX3RvX2RlY29yYXRlID0gU3RhdGUwfSwKKyAgICAgIE1lc3NhZ2UpIC0+CisgICAge1N0YXRlMSwgb2t9ID0gUHJvdG9jb2xNb2R1bGVUb0RlY29yYXRlOndyaXRlKFN0YXRlMCwgTWVzc2FnZSksCisgICAge1N0YXRlI211bHRpcGxleGVkX3Byb3RvY29se3Byb3RvY29sX2RhdGFfdG9fZGVjb3JhdGUgPSBTdGF0ZTF9LCBva30uCisKK3JlYWQoU3RhdGUgPSAjbXVsdGlwbGV4ZWRfcHJvdG9jb2x7cHJvdG9jb2xfbW9kdWxlX3RvX2RlY29yYXRlID0gUHJvdG9jb2xNb2R1bGVUb0RlY29yYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sX2RhdGFfdG9fZGVjb3JhdGUgPSBTdGF0ZTB9LAorICAgICBNZXNzYWdlKSAtPgorICAgIHtTdGF0ZTEsIFJlc3VsdH0gPSBQcm90b2NvbE1vZHVsZVRvRGVjb3JhdGU6cmVhZChTdGF0ZTAsIE1lc3NhZ2UpLAorICAgIHtTdGF0ZSNtdWx0aXBsZXhlZF9wcm90b2NvbHtwcm90b2NvbF9kYXRhX3RvX2RlY29yYXRlID0gU3RhdGUxfSwgUmVzdWx0fS4KZGlmZiAtLWdpdCBhL2xpYi9lcmwvc3JjL3RocmlmdF9wcm9jZXNzb3IuZXJsIGIvbGliL2VybC9zcmMvdGhyaWZ0X3Byb2Nlc3Nvci5lcmwKaW5kZXggZDQ3NDI5NC4uNWM5ZjI2ZiAxMDA2NDQKLS0tIGEvbGliL2VybC9zcmMvdGhyaWZ0X3Byb2Nlc3Nvci5lcmwKKysrIGIvbGliL2VybC9zcmMvdGhyaWZ0X3Byb2Nlc3Nvci5lcmwKQEAgLTMzLDQxICszMyw1MyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlciA9IEhhbmRsZXJ9KS4KIAogbG9vcChTdGF0ZTAgPSAjdGhyaWZ0X3Byb2Nlc3Nvcntwcm90b2NvbCAgPSBQcm90bzAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIgPSBIYW5kbGVyfSkgLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlciA9IEhhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UgPSBTZXJ2aWNlfSkgLT4KKwogICAgIHtQcm90bzEsIE1lc3NhZ2VCZWdpbn0gPSB0aHJpZnRfcHJvdG9jb2w6cmVhZChQcm90bzAsIG1lc3NhZ2VfYmVnaW4pLAogICAgIFN0YXRlMSA9IFN0YXRlMCN0aHJpZnRfcHJvY2Vzc29ye3Byb3RvY29sID0gUHJvdG8xfSwKKworICAgIEVycm9ySGFuZGxlciA9IGZ1bgorICAgICAgICAoSGFuZGxlck1vZHVsZXMpIHdoZW4gaXNfbGlzdChIYW5kbGVyTW9kdWxlcykgLT4gdGhyaWZ0X211bHRpcGxleGVkX21hcF93cmFwcGVyOmZldGNoKD9NVUxUSVBMRVhFRF9FUlJPUl9IQU5ETEVSX0tFWSwgSGFuZGxlck1vZHVsZXMpOworICAgICAgICAoSGFuZGxlck1vZHVsZSkgLT4gSGFuZGxlck1vZHVsZQorICAgIGVuZCwKKwogICAgIGNhc2UgTWVzc2FnZUJlZ2luIG9mCisKICAgICAgICAgI3Byb3RvY29sX21lc3NhZ2VfYmVnaW57bmFtZSA9IEZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gP3RNZXNzYWdlVHlwZV9DQUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXFpZCA9IFNlcWlkfSAtPgotICAgICAgICAgICAgY2FzZSBoYW5kbGVfZnVuY3Rpb24oU3RhdGUxLCBsaXN0X3RvX2F0b20oRnVuY3Rpb24pLCBTZXFpZCkgb2YKLSAgICAgICAgICAgICAgICB7U3RhdGUyLCBva30gLT4gbG9vcChTdGF0ZTIpOwotICAgICAgICAgICAgICAgIHtfU3RhdGUyLCB7ZXJyb3IsIFJlYXNvbn19IC0+Ci0gICAgICAgICAgICAgICAgICAgIEhhbmRsZXI6aGFuZGxlX2Vycm9yKGxpc3RfdG9fYXRvbShGdW5jdGlvbiksIFJlYXNvbiksCi0gICAgICAgICAgICAgICAgICAgIHRocmlmdF9wcm90b2NvbDpjbG9zZV90cmFuc3BvcnQoUHJvdG8xKSwKLSAgICAgICAgICAgICAgICAgICAgb2sKLSAgICAgICAgICAgIGVuZDsKLSAgICAgICAgI3Byb3RvY29sX21lc3NhZ2VfYmVnaW57bmFtZSA9IEZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gP3RNZXNzYWdlVHlwZV9PTkVXQVksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXFpZCA9IFNlcWlkfSAtPgotICAgICAgICAgICAgY2FzZSBoYW5kbGVfZnVuY3Rpb24oU3RhdGUxLCBsaXN0X3RvX2F0b20oRnVuY3Rpb24pLCBTZXFpZCkgb2YKLSAgICAgICAgICAgICAgICB7U3RhdGUyLCBva30gLT4gbG9vcChTdGF0ZTIpOwotICAgICAgICAgICAgICAgIHtfU3RhdGUyLCB7ZXJyb3IsIFJlYXNvbn19IC0+Ci0gICAgICAgICAgICAgICAgICAgIEhhbmRsZXI6aGFuZGxlX2Vycm9yKGxpc3RfdG9fYXRvbShGdW5jdGlvbiksIFJlYXNvbiksCi0gICAgICAgICAgICAgICAgICAgIHRocmlmdF9wcm90b2NvbDpjbG9zZV90cmFuc3BvcnQoUHJvdG8xKSwKLSAgICAgICAgICAgICAgICAgICAgb2sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcWlkID0gU2VxaWR9IHdoZW4gVHlwZSA9Oj0gP3RNZXNzYWdlVHlwZV9DQUxMOyBUeXBlID06PSA/dE1lc3NhZ2VUeXBlX09ORVdBWSAtPgorICAgICAgICAgICAgY2FzZSBzdHJpbmc6dG9rZW5zKEZ1bmN0aW9uLCA/TVVMVElQTEVYRURfU0VSVklDRV9TRVBBUkFUT1IpIG9mCisgICAgICAgICAgICAgICAgW1NlcnZpY2VOYW1lLCBGdW5jdGlvbk5hbWVdIC0+CisgICAgICAgICAgICAgICAgICAgIFNlcnZpY2VNb2R1bGUgID0gdGhyaWZ0X211bHRpcGxleGVkX21hcF93cmFwcGVyOmZldGNoKFNlcnZpY2VOYW1lLCBTZXJ2aWNlKSwKKyAgICAgICAgICAgICAgICAgICAgU2VydmljZUhhbmRsZXIgPSB0aHJpZnRfbXVsdGlwbGV4ZWRfbWFwX3dyYXBwZXI6ZmV0Y2goU2VydmljZU5hbWUsIEhhbmRsZXIpLAorICAgICAgICAgICAgICAgICAgICBjYXNlIGhhbmRsZV9mdW5jdGlvbihTdGF0ZTEjdGhyaWZ0X3Byb2Nlc3NvcntzZXJ2aWNlPVNlcnZpY2VNb2R1bGUsIGhhbmRsZXI9U2VydmljZUhhbmRsZXJ9LCBsaXN0X3RvX2F0b20oRnVuY3Rpb25OYW1lKSwgU2VxaWQpIG9mCisgICAgICAgICAgICAgICAgICAgICAgICB7U3RhdGUyLCBva30gLT4gbG9vcChTdGF0ZTIjdGhyaWZ0X3Byb2Nlc3NvcntzZXJ2aWNlPVNlcnZpY2UsIGhhbmRsZXI9SGFuZGxlcn0pOworICAgICAgICAgICAgICAgICAgICAgICAge19TdGF0ZTIsIHtlcnJvciwgUmVhc29ufX0gLT4KKwkJCQkJCQlhcHBseShFcnJvckhhbmRsZXIoSGFuZGxlciksIGhhbmRsZV9lcnJvciwgW2xpc3RfdG9fYXRvbShGdW5jdGlvbiksIFJlYXNvbl0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmlmdF9wcm90b2NvbDpjbG9zZV90cmFuc3BvcnQoUHJvdG8xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvaworICAgICAgICAgICAgICAgICAgICBlbmQ7CisgICAgICAgICAgICAgICAgXyAtPgorICAgICAgICAgICAgICAgICAgICBjYXNlIGhhbmRsZV9mdW5jdGlvbihTdGF0ZTEsIGxpc3RfdG9fYXRvbShGdW5jdGlvbiksIFNlcWlkKSBvZgorICAgICAgICAgICAgICAgICAgICAgICAge1N0YXRlMiwgb2t9IC0+IGxvb3AoU3RhdGUyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHtfU3RhdGUyLCB7ZXJyb3IsIFJlYXNvbn19IC0+CisJCQkJCQkJYXBwbHkoRXJyb3JIYW5kbGVyKEhhbmRsZXIpLCBoYW5kbGVfZXJyb3IsIFtsaXN0X3RvX2F0b20oRnVuY3Rpb24pLCBSZWFzb25dKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJpZnRfcHJvdG9jb2w6Y2xvc2VfdHJhbnNwb3J0KFByb3RvMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2sKKyAgICAgICAgICAgICAgICAgICAgZW5kCiAgICAgICAgICAgICBlbmQ7CiAgICAgICAgIHtlcnJvciwgdGltZW91dCA9IFJlYXNvbn0gLT4KLSAgICAgICAgICAgIEhhbmRsZXI6aGFuZGxlX2Vycm9yKHVuZGVmaW5lZCwgUmVhc29uKSwKKwkJCWFwcGx5KEVycm9ySGFuZGxlcihIYW5kbGVyKSwgaGFuZGxlX2Vycm9yLCBbdW5kZWZpbmVkLCBSZWFzb25dKSwKICAgICAgICAgICAgIHRocmlmdF9wcm90b2NvbDpjbG9zZV90cmFuc3BvcnQoUHJvdG8xKSwKICAgICAgICAgICAgIG9rOwogICAgICAgICB7ZXJyb3IsIGNsb3NlZCA9IFJlYXNvbn0gLT4KICAgICAgICAgICAgICUlIGVycm9yX2xvZ2dlcjppbmZvX21zZygiQ2xpZW50IGRpc2Nvbm5lY3RlZH5uIiksCi0gICAgICAgICAgICBIYW5kbGVyOmhhbmRsZV9lcnJvcih1bmRlZmluZWQsIFJlYXNvbiksCisJCQlhcHBseShFcnJvckhhbmRsZXIoSGFuZGxlciksIGhhbmRsZV9lcnJvciwgW3VuZGVmaW5lZCwgUmVhc29uXSksCiAgICAgICAgICAgICB0aHJpZnRfcHJvdG9jb2w6Y2xvc2VfdHJhbnNwb3J0KFByb3RvMSksCiAgICAgICAgICAgICBleGl0KHNodXRkb3duKTsKICAgICAgICAge2Vycm9yLCBSZWFzb259IC0+Ci0gICAgICAgICAgICBIYW5kbGVyOmhhbmRsZV9lcnJvcih1bmRlZmluZWQsIFJlYXNvbiksCisJCQlhcHBseShFcnJvckhhbmRsZXIoSGFuZGxlciksIGhhbmRsZV9lcnJvciwgW3VuZGVmaW5lZCwgUmVhc29uXSksCiAgICAgICAgICAgICB0aHJpZnRfcHJvdG9jb2w6Y2xvc2VfdHJhbnNwb3J0KFByb3RvMSksCiAgICAgICAgICAgICBleGl0KHNodXRkb3duKQogICAgIGVuZC4KZGlmZiAtLWdpdCBhL2xpYi9lcmwvc3JjL3RocmlmdF9wcm90b2NvbC5lcmwgYi9saWIvZXJsL3NyYy90aHJpZnRfcHJvdG9jb2wuZXJsCmluZGV4IGM2ZGI0NmQuLjJmZTEwZDYgMTAwNjQ0Ci0tLSBhL2xpYi9lcmwvc3JjL3RocmlmdF9wcm90b2NvbC5lcmwKKysrIGIvbGliL2VybC9zcmMvdGhyaWZ0X3Byb3RvY29sLmVybApAQCAtNjMsOCArNjMsOCBAQAogdHlwZWlkX3RvX2F0b20oP3RUeXBlX1NUT1ApIC0+IGZpZWxkX3N0b3A7CiB0eXBlaWRfdG9fYXRvbSg/dFR5cGVfVk9JRCkgLT4gdm9pZDsKIHR5cGVpZF90b19hdG9tKD90VHlwZV9CT09MKSAtPiBib29sOwotdHlwZWlkX3RvX2F0b20oP3RUeXBlX0JZVEUpIC0+IGJ5dGU7CiB0eXBlaWRfdG9fYXRvbSg/dFR5cGVfRE9VQkxFKSAtPiBkb3VibGU7Cit0eXBlaWRfdG9fYXRvbSg/dFR5cGVfSTgpIC0+IGJ5dGU7CiB0eXBlaWRfdG9fYXRvbSg/dFR5cGVfSTE2KSAtPiBpMTY7CiB0eXBlaWRfdG9fYXRvbSg/dFR5cGVfSTMyKSAtPiBpMzI7CiB0eXBlaWRfdG9fYXRvbSg/dFR5cGVfSTY0KSAtPiBpNjQ7CkBAIC03Niw4ICs3Niw5IEBACiAKIHRlcm1fdG9fdHlwZWlkKHZvaWQpIC0+ID90VHlwZV9WT0lEOwogdGVybV90b190eXBlaWQoYm9vbCkgLT4gP3RUeXBlX0JPT0w7Ci10ZXJtX3RvX3R5cGVpZChieXRlKSAtPiA/dFR5cGVfQllURTsKK3Rlcm1fdG9fdHlwZWlkKGJ5dGUpIC0+ID90VHlwZV9JODsKIHRlcm1fdG9fdHlwZWlkKGRvdWJsZSkgLT4gP3RUeXBlX0RPVUJMRTsKK3Rlcm1fdG9fdHlwZWlkKGk4KSAtPiA/dFR5cGVfSTg7CiB0ZXJtX3RvX3R5cGVpZChpMTYpIC0+ID90VHlwZV9JMTY7CiB0ZXJtX3RvX3R5cGVpZChpMzIpIC0+ID90VHlwZV9JMzI7CiB0ZXJtX3RvX3R5cGVpZChpNjQpIC0+ID90VHlwZV9JNjQ7CkBAIC0xNDgsOCArMTQ5LDEyIEBACiByZWFkKElQcm90bzAsIHttYXAsIEtleVR5cGUsIFZhbFR5cGV9KSAtPgogICAgIHtJUHJvdG8xLCAjcHJvdG9jb2xfbWFwX2JlZ2lue3NpemUgPSBTaXplLCBrdHlwZSA9IEtUeXBlLCB2dHlwZSA9IFZUeXBlfX0gPQogICAgICAgICByZWFkKElQcm90bzAsIG1hcF9iZWdpbiksCi0gICAge0tUeXBlLCBLVHlwZX0gPSB7dGVybV90b190eXBlaWQoS2V5VHlwZSksIEtUeXBlfSwKLSAgICB7VlR5cGUsIFZUeXBlfSA9IHt0ZXJtX3RvX3R5cGVpZChWYWxUeXBlKSwgVlR5cGV9LAorICAgIF8gPSBjYXNlIFNpemUgb2YKKyAgICAgIDAgLT4gMDsKKyAgICAgIF8gLT4KKyAgICAgICAge0tUeXBlLCBLVHlwZX0gPSB7dGVybV90b190eXBlaWQoS2V5VHlwZSksIEtUeXBlfSwKKyAgICAgICAge1ZUeXBlLCBWVHlwZX0gPSB7dGVybV90b190eXBlaWQoVmFsVHlwZSksIFZUeXBlfQorICAgIGVuZCwKICAgICB7TGlzdCwgSVByb3RvMn0gPSBsaXN0czptYXBmb2xkbChmdW4oXywgUHJvdG9TMCkgLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtQcm90b1MxLCB7b2ssIEtleX19ID0gcmVhZChQcm90b1MwLCBLZXlUeXBlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtQcm90b1MyLCB7b2ssIFZhbH19ID0gcmVhZChQcm90b1MxLCBWYWxUeXBlKSwKQEAgLTE5MSw3ICsxOTYsOCBAQAogICAgICAgICB0aHJpZnRfcHJvdG9jb2w6cmVhZChJUHJvdG8wLCBmaWVsZF9iZWdpbiksCiAgICAgY2FzZSB7RlR5cGUsIEZpZH0gb2YKICAgICAgICAgez90VHlwZV9TVE9QLCBffSAtPgotICAgICAgICAgICAge0lQcm90bzEsIFJUdXBsZX07CisgICAgICAgICAgICB7SVByb3RvMiwgb2t9ID0gcmVhZChJUHJvdG8xLCBzdHJ1Y3RfZW5kKSwKKyAgICAgICAgICAgIHtJUHJvdG8yLCBSVHVwbGV9OwogICAgICAgICBfRWxzZSAtPgogICAgICAgICAgICAgY2FzZSBkaWN0OmZpbmQoRmlkLCBTRGljdCkgb2YKICAgICAgICAgICAgICAgICB7b2ssIHtUeXBlLCBJbmRleH19IC0+CkBAIC0yMTMsMTIgKzIxOSwxMSBAQAogICAgIGVuZC4KIAogc2tpcF9maWVsZChGVHlwZSwgSVByb3RvMCwgU0RpY3QsIFJUdXBsZSkgLT4KLSAgICBGVHlwZUF0b20gPSB0aHJpZnRfcHJvdG9jb2w6dHlwZWlkX3RvX2F0b20oRlR5cGUpLAotICAgIHtJUHJvdG8xLCBva30gPSB0aHJpZnRfcHJvdG9jb2w6c2tpcChJUHJvdG8wLCBGVHlwZUF0b20pLAorICAgIHtJUHJvdG8xLCBva30gPSBza2lwKElQcm90bzAsIHR5cGVpZF90b19hdG9tKEZUeXBlKSksCiAgICAge0lQcm90bzIsIG9rfSA9IHJlYWQoSVByb3RvMSwgZmllbGRfZW5kKSwKICAgICByZWFkX3N0cnVjdF9sb29wKElQcm90bzIsIFNEaWN0LCBSVHVwbGUpLgogCi0tc3BlYyBza2lwKCNwcm90b2NvbHt9LCBhbnkoKSkgLT4geyNwcm90b2NvbHt9LCBva30uCistc3BlYyBza2lwKCNwcm90b2NvbHt9LCBhdG9tKCkpIC0+IHsjcHJvdG9jb2x7fSwgb2t9LgogCiBza2lwKFByb3RvMCwgc3RydWN0KSAtPgogICAgIHtQcm90bzEsIG9rfSA9IHJlYWQoUHJvdG8wLCBzdHJ1Y3RfYmVnaW4pLApAQCAtMjU1LDcgKzI2MCw3IEBACiAgICAgICAgID90VHlwZV9TVE9QIC0+CiAgICAgICAgICAgICB7UHJvdG8xLCBva307CiAgICAgICAgIF9FbHNlIC0+Ci0gICAgICAgICAgICB7UHJvdG8yLCBva30gPSBza2lwKFByb3RvMSwgVHlwZSksCisgICAgICAgICAgICB7UHJvdG8yLCBva30gPSBza2lwKFByb3RvMSwgdHlwZWlkX3RvX2F0b20oVHlwZSkpLAogICAgICAgICAgICAge1Byb3RvMywgb2t9ID0gcmVhZChQcm90bzIsIGZpZWxkX2VuZCksCiAgICAgICAgICAgICBza2lwX3N0cnVjdF9sb29wKFByb3RvMykKICAgICBlbmQuCkBAIC0yNjUsOCArMjcwLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSBTaXplfSkgLT4KICAgICBjYXNlIFNpemUgb2YKICAgICAgICAgTiB3aGVuIE4gPiAwIC0+Ci0gICAgICAgICAgICB7UHJvdG8xLCBva30gPSBza2lwKFByb3RvMCwgS3R5cGUpLAotICAgICAgICAgICAge1Byb3RvMiwgb2t9ID0gc2tpcChQcm90bzEsIFZ0eXBlKSwKKyAgICAgICAgICAgIHtQcm90bzEsIG9rfSA9IHNraXAoUHJvdG8wLCB0eXBlaWRfdG9fYXRvbShLdHlwZSkpLAorICAgICAgICAgICAge1Byb3RvMiwgb2t9ID0gc2tpcChQcm90bzEsIHR5cGVpZF90b19hdG9tKFZ0eXBlKSksCiAgICAgICAgICAgICBza2lwX21hcF9sb29wKFByb3RvMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwI3Byb3RvY29sX21hcF9iZWdpbntzaXplID0gU2l6ZSAtIDF9KTsKICAgICAgICAgMCAtPiB7UHJvdG8wLCBva30KQEAgLTI3Niw3ICsyODEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IFNpemV9KSAtPgogICAgIGNhc2UgU2l6ZSBvZgogICAgICAgICBOIHdoZW4gTiA+IDAgLT4KLSAgICAgICAgICAgIHtQcm90bzEsIG9rfSA9IHNraXAoUHJvdG8wLCBFdHlwZSksCisgICAgICAgICAgICB7UHJvdG8xLCBva30gPSBza2lwKFByb3RvMCwgdHlwZWlkX3RvX2F0b20oRXR5cGUpKSwKICAgICAgICAgICAgIHNraXBfc2V0X2xvb3AoUHJvdG8xLAogICAgICAgICAgICAgICAgICAgICAgICAgICBNYXAjcHJvdG9jb2xfc2V0X2JlZ2lue3NpemUgPSBTaXplIC0gMX0pOwogICAgICAgICAwIC0+IHtQcm90bzAsIG9rfQpAQCAtMjg2LDcgKzI5MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSBTaXplfSkgLT4KICAgICBjYXNlIFNpemUgb2YKICAgICAgICAgTiB3aGVuIE4gPiAwIC0+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+CisgIHtOZXdTdGF0ZSwgUmVzdWx0fSA9IE1vZHVsZTpjbG9zZShUcmFuc3BvcnQjdF90cmFuc3BvcnQuc3RhdGUpLAorICB7VHJhbnNwb3J0I3RfdHJhbnNwb3J0e3N0YXRlID0gTmV3U3RhdGV9LCBSZXN1bHR9LgorCmRpZmYgLS1naXQgYS9saWIvZXJsL3Rlc3QvVGhyaWZ0X29taXRfd2l0aC50aHJpZnQgYi9saWIvZXJsL3Rlc3QvVGhyaWZ0X29taXRfd2l0aC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJmZmM3YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9lcmwvdGVzdC9UaHJpZnRfb21pdF93aXRoLnRocmlmdApAQCAtMCwwICsxLDIyIEBACitzdHJ1Y3QgdGVzdDEgeworICAxOiBpMzIgb25lCisgIDI6IGkzMiB0d28gICAgICAgICAgICAgICAgICAgIC8vIG9taXQKKyAgMzogaTMyIHRocmVlCit9CisKK3N0cnVjdCB0ZXN0MiB7CisgIDE6IGkzMiBvbmUKKyAgMjogdGVzdDIgdHdvICAgICAgICAgICAgICAgICAgLy8gb21pdAorICAzOiBpMzIgdGhyZWUKK30KKworc3RydWN0IHRlc3QzIHsKKyAgMTogaTMyIG9uZQorICAyOiBsaXN0PHRlc3QxPiB0d28gICAgICAgICAgICAvLyBvbWl0Cit9CisKK3N0cnVjdCB0ZXN0NCB7CisgIDE6IGkzMiBvbmUKKyAgMjogbWFwPGkzMix0ZXN0MT4gdHdvICAgICAgICAgLy8gb21pdAorfQorCmRpZmYgLS1naXQgYS90ZXN0L2VybC9MZWdhY3lOYW1lcy50aHJpZnQgYi9saWIvZXJsL3Rlc3QvZmxhZ3MvTGVnYWN5TmFtZXMudGhyaWZ0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0L2VybC9MZWdhY3lOYW1lcy50aHJpZnQKcmVuYW1lIHRvIGxpYi9lcmwvdGVzdC9mbGFncy9MZWdhY3lOYW1lcy50aHJpZnQKZGlmZiAtLWdpdCBhL2xpYi9lcmwvdGVzdC9mbGFncy9UaHJpZnQzMjE0LnRocmlmdCBiL2xpYi9lcmwvdGVzdC9mbGFncy9UaHJpZnQzMjE0LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTExMGNlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC90ZXN0L2ZsYWdzL1RocmlmdDMyMTQudGhyaWZ0CkBAIC0wLDAgKzEsMjMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworc3RydWN0IFN0cmluZ01hcAoreworICAxOiBtYXA8aTMyLCBzdHJpbmc+IGRhdGEgPSB7MTogImEiLCAyOiAiYiJ9OworfQpkaWZmIC0tZ2l0IGEvbGliL2VybC90ZXN0L2xlZ2FjeV9uYW1lc190ZXN0LmVybCBiL2xpYi9lcmwvdGVzdC9sZWdhY3lfbmFtZXNfdGVzdC5lcmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE2YWEzZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9lcmwvdGVzdC9sZWdhY3lfbmFtZXNfdGVzdC5lcmwKQEAgLTAsMCArMSw2OSBAQAorJSUKKyUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCislJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCislJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCislJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCislJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyUlCislJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorJSUKKyUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCislJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCislJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCislJSB1bmRlciB0aGUgTGljZW5zZS4KKyUlCisKKy1tb2R1bGUobGVnYWN5X25hbWVzX3Rlc3QpLgorLWNvbXBpbGUoZXhwb3J0X2FsbCkuCisKKy1pbmNsdWRlX2xpYigiZXVuaXQvaW5jbHVkZS9ldW5pdC5ocmwiKS4KKworLWluY2x1ZGUoImdlbi1lcmwvbGVnYWN5TmFtZXNfY29uc3RhbnRzLmhybCIpLgorCityZWNvcmRfZ2VuZXJhdGlvbl90ZXN0XygpIC0+CisgIFsKKyAgICB7ImNhcGl0YWxpemVkU3RydWN0IHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7Y2FwaXRhbGl6ZWRTdHJ1Y3QsIF8sIF99LAorICAgICAgI2NhcGl0YWxpemVkU3RydWN0e2lkPW51bGwsbWVzc2FnZT1udWxsfQorICAgICl9CisgIF0uCisKK3N0cnVjdF9pbmZvX3Rlc3RfKCkgLT4KKyAgWworICAgIHsiY2FwaXRhbGl6ZWRTdHJ1Y3QgZXh0ZW5kZWQgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB1bmRlZmluZWQsIGkzMiwgJ2lkJywgdW5kZWZpbmVkfSwKKyAgICAgICAgezIsIHVuZGVmaW5lZCwgc3RyaW5nLCAnbWVzc2FnZScsIHVuZGVmaW5lZH0KKyAgICAgIF19LAorICAgICAgbGVnYWN5TmFtZXNfdHlwZXM6c3RydWN0X2luZm9fZXh0KGNhcGl0YWxpemVkU3RydWN0KQorICAgICl9LAorICAgIHsibGlzdENhcGl0YWxpemVkU3RydWN0cyBleHRlbmRlZCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHVuZGVmaW5lZCwge2xpc3QsIHtzdHJ1Y3QsIHsnbGVnYWN5TmFtZXNfdHlwZXMnLCAnY2FwaXRhbGl6ZWRTdHJ1Y3QnfX19LCAnc3RydWN0cycsIFtdfQorICAgICAgXX0sCisgICAgICBsZWdhY3lOYW1lc190eXBlczpzdHJ1Y3RfaW5mb19leHQobGlzdENhcGl0YWxpemVkU3RydWN0cykKKyAgICApfQorICBdLgorCitzZXJ2aWNlX2luZm9fdGVzdF8oKSAtPgorICBbCisgICAgeyJuYW1lcyBwYXJhbXMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwge3N0cnVjdCwgeydsZWdhY3lOYW1lc190eXBlcycsICdjYXBpdGFsaXplZFN0cnVjdCd9fX0sCisgICAgICAgIHsyLCB7c3RydWN0LCB7J2xlZ2FjeU5hbWVzX3R5cGVzJywgJ2NhcGl0YWxpemVkU3RydWN0J319fQorICAgICAgXX0sCisgICAgICBsZWdhY3lOYW1lc190aHJpZnQ6ZnVuY3Rpb25faW5mbyhuYW1lcywgcGFyYW1zX3R5cGUpCisgICAgKX0sCisgICAgeyJuYW1lcyByZXBseSIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCB7J2xlZ2FjeU5hbWVzX3R5cGVzJywgJ2xpc3RDYXBpdGFsaXplZFN0cnVjdHMnfX0sCisgICAgICBsZWdhY3lOYW1lc190aHJpZnQ6ZnVuY3Rpb25faW5mbyhuYW1lcywgcmVwbHlfdHlwZSkKKyAgICApfSwKKyAgICB7Im5hbWVzIGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW3sxLCB7c3RydWN0LCB7J2xlZ2FjeU5hbWVzX3R5cGVzJywgJ3hjZXB0aW9uJ319fV19LAorICAgICAgbGVnYWN5TmFtZXNfdGhyaWZ0OmZ1bmN0aW9uX2luZm8obmFtZXMsIGV4Y2VwdGlvbnMpCisgICAgKX0KKyAgXS4KZGlmZiAtLWdpdCBhL2xpYi9lcmwvdGVzdC9tdWx0aXBsZXhpbmcudGhyaWZ0IGIvbGliL2VybC90ZXN0L211bHRpcGxleGluZy50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M3OTk0YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9lcmwvdGVzdC9tdWx0aXBsZXhpbmcudGhyaWZ0CkBAIC0wLDAgKzEsNyBAQAorc2VydmljZSBNdWx0aXBsZXhpbmdfQ2FsY3VsYXRvciB7CisgICAgaTMyIGFkZCgxOiBpMzIgeCwgMjogaTMyIHkpCit9CisKK3NlcnZpY2UgTXVsdGlwbGV4aW5nX1dlYXRoZXJSZXBvcnQgeworICAgIGRvdWJsZSBnZXRUZW1wZXJhdHVyZSgpCit9CmRpZmYgLS1naXQgYS9saWIvZXJsL3Rlc3QvbXVsdGlwbGV4aW5nX3Rlc3QuZXJsIGIvbGliL2VybC90ZXN0L211bHRpcGxleGluZ190ZXN0LmVybApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjJkNjE2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC90ZXN0L211bHRpcGxleGluZ190ZXN0LmVybApAQCAtMCwwICsxLDU3IEBACistbW9kdWxlKG11bHRpcGxleGluZ190ZXN0KS4KKworLWluY2x1ZGVfbGliKCJldW5pdC9pbmNsdWRlL2V1bml0LmhybCIpLgorCistZXhwb3J0KFsKKyAgICAgaGFuZGxlX2Z1bmN0aW9uLzIKKyAgICAsaGFuZGxlX2Vycm9yLzIKK10pLgorCitzdGFydF9tdWx0aXBsZXhlZF9zZXJ2ZXJfdGVzdCgpIC0+CisKKyAgICBQb3J0ID0gOTA5MCwKKyAgICBTZXJ2aWNlcyA9IFsKKyAgICAgICAgICAgICAgICB7Ik11bHRpcGxleGluZ19DYWxjdWxhdG9yIiwgICAgbXVsdGlwbGV4aW5nX19jYWxjdWxhdG9yX3RocmlmdH0sCisgICAgICAgICAgICAgICAgeyJNdWx0aXBsZXhpbmdfV2VhdGhlclJlcG9ydCIsIG11bHRpcGxleGluZ19fd2VhdGhlcl9yZXBvcnRfdGhyaWZ0fQorICAgICAgICAgICAgICAgXSwKKworICAgIHtvaywgUGlkfSA9IHRocmlmdF9zb2NrZXRfc2VydmVyOnN0YXJ0KFsKKyAgICAgICAge2lwLCAiMTI3LjAuMC4xIn0sCisgICAgICAgIHtwb3J0LCBQb3J0fSwKKyAgICAgICAge25hbWUsID9NT0RVTEV9LAorICAgICAgICB7c2VydmljZSwgU2VydmljZXN9LAorICAgICAgICB7aGFuZGxlciwgWworICAgICAgICAgICAgeyJlcnJvcl9oYW5kbGVyIiwgICAgICAgICAgICAgID9NT0RVTEV9LAorICAgICAgICAgICAgeyJNdWx0aXBsZXhpbmdfQ2FsY3VsYXRvciIsICAgID9NT0RVTEV9LAorICAgICAgICAgICAgeyJNdWx0aXBsZXhpbmdfV2VhdGhlclJlcG9ydCIsID9NT0RVTEV9CisgICAgICAgIF19CisgICAgIF0pLAorCisgICAge29rLCBbeyJNdWx0aXBsZXhpbmdfQ2FsY3VsYXRvciIsIENhbGN1bGF0b3JDbGllbnQwfSwKKyAgICAgICAgICB7Ik11bHRpcGxleGluZ19XZWF0aGVyUmVwb3J0IiwgV2VhdGhlclJlcG9ydENsaWVudDB9XX0gPSB0aHJpZnRfY2xpZW50X3V0aWw6bmV3X211bHRpcGxleGVkKCIxMjcuMC4wLjEiLCBQb3J0LCBTZXJ2aWNlcywgW10pLAorCisgICAgP2Fzc2VydE1hdGNoKHtfLCB7ZXJyb3IsIHtiYWRfYXJncywgXywgX319fSwgdGhyaWZ0X2NsaWVudDpjYWxsKFdlYXRoZXJSZXBvcnRDbGllbnQwLCBnZXRUZW1wZXJhdHVyZSwgWzFdKSksCisgICAgP2Fzc2VydE1hdGNoKHtfLCB7ZXJyb3IsIHtiYWRfYXJncywgXywgX319fSwgdGhyaWZ0X2NsaWVudDpjYWxsKENhbGN1bGF0b3JDbGllbnQwLCBhZGQsIFsxXSkpLAorICAgID9hc3NlcnRNYXRjaCh7Xywge2Vycm9yLCB7YmFkX2FyZ3MsIF8sIF99fX0sIHRocmlmdF9jbGllbnQ6Y2FsbChDYWxjdWxhdG9yQ2xpZW50MCwgYWRkLCBbMSwxLDFdKSksCisKKyAgICA/YXNzZXJ0TWF0Y2goe18sIHtlcnJvciwge25vX2Z1bmN0aW9uLCBffX19LCB0aHJpZnRfY2xpZW50OmNhbGwoQ2FsY3VsYXRvckNsaWVudDAsIGdldFRlbXBlcmF0dXJlLCBbXSkpLAorICAgID9hc3NlcnRNYXRjaCh7Xywge2Vycm9yLCB7bm9fZnVuY3Rpb24sIF99fX0sIHRocmlmdF9jbGllbnQ6Y2FsbChXZWF0aGVyUmVwb3J0Q2xpZW50MCwgYWRkLCBbNDEsIDFdKSksCisKKyAgICA/YXNzZXJ0TWF0Y2goe18sIHtvaywgNDJ9fSwgdGhyaWZ0X2NsaWVudDpjYWxsKENhbGN1bGF0b3JDbGllbnQwLCBhZGQsIFs0MSwgMV0pKSwKKyAgICA/YXNzZXJ0TWF0Y2goe18sIHtvaywgNDIuMH19LCB0aHJpZnRfY2xpZW50OmNhbGwoV2VhdGhlclJlcG9ydENsaWVudDAsIGdldFRlbXBlcmF0dXJlLCBbXSkpLAorCisgICAgdGhyaWZ0X3NvY2tldF9zZXJ2ZXI6c3RvcChQaWQpLgorCislJSBIQU5ETEUgRlVOQ1RJT05TCisKKyUlIENhbGN1bGF0b3IgaGFuZGxlcworaGFuZGxlX2Z1bmN0aW9uKGFkZCwge1gsIFl9KSAtPgorICAgIHtyZXBseSwgWCArIFl9OworCislJSBXZWF0aGVyUmVwb3J0IGhhbmRsZXMKK2hhbmRsZV9mdW5jdGlvbihnZXRUZW1wZXJhdHVyZSwge30pIC0+CisgICAge3JlcGx5LCA0Mi4wfS4KKworaGFuZGxlX2Vycm9yKF9GLCBfUmVhc29uKSAtPgorJSUgICAgID9kZWJ1Z0hlcmUsID9kZWJ1Z1ZhbCh7X0YsIF9SZWFzb259KSwKKyAgICBvay4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvZXJsL3Rlc3QvbmFtZV9jb25mbGljdF90ZXN0LmVybCBiL2xpYi9lcmwvdGVzdC9uYW1lX2NvbmZsaWN0X3Rlc3QuZXJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwMWRmNTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3Rlc3QvbmFtZV9jb25mbGljdF90ZXN0LmVybApAQCAtMCwwICsxLDI5OSBAQAorJSUKKyUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCislJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCislJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCislJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCislJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyUlCislJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorJSUKKyUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCislJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCislJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCislJSB1bmRlciB0aGUgTGljZW5zZS4KKyUlCisKKy1tb2R1bGUobmFtZV9jb25mbGljdF90ZXN0KS4KKy1jb21waWxlKGV4cG9ydF9hbGwpLgorCistaW5jbHVkZV9saWIoImV1bml0L2luY2x1ZGUvZXVuaXQuaHJsIikuCisKKy1pbmNsdWRlKCJnZW4tZXJsL25hbWVfY29uZmxpY3RfdGVzdF9jb25zdGFudHMuaHJsIikuCisKK3JlY29yZF9nZW5lcmF0aW9uX3Rlc3RfKCkgLT4KKyAgWworICAgIHsidXNpbmcgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHt1c2luZywgXywgX30sCisgICAgICAjdXNpbmd7c2luZ2xlPW51bGwsaW50ZWdlcj1udWxsfQorICAgICl9LAorICAgIHsiZGVsZWdhdGUgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHtkZWxlZ2F0ZSwgXywgX30sCisgICAgICAjZGVsZWdhdGV7cGFydGlhbD1udWxsLGRlbGVnYXRlPW51bGx9CisgICAgKX0sCisgICAgeyJnZXQgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHtnZXQsIF99LAorICAgICAgI2dldHtzYnl0ZT1udWxsfQorICAgICl9LAorICAgIHsicGFydGlhbCByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge3BhcnRpYWwsIF8sIF8sIF99LAorICAgICAgI3BhcnRpYWx7dXNpbmc9bnVsbH0KKyAgICApfSwKKyAgICB7IkNsYXNzQW5kUHJvcCByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeydDbGFzc0FuZFByb3AnLCBfLCBfLCBfLCBffSwKKyAgICAgICMnQ2xhc3NBbmRQcm9wJ3sKKyAgICAgICAgJ0NsYXNzQW5kUHJvcCc9bnVsbCwKKyAgICAgICAgJ0NsYXNzQW5kUHJvcF8nPW51bGwsCisgICAgICAgICdDbGFzc0FuZFByb3BfXyc9bnVsbCwKKyAgICAgICAgJ0NsYXNzQW5kUHJvcGVyJz1udWxsCisgICAgICB9CisgICAgKX0sCisgICAgeyJzZWNvbmRfY2hhbmNlIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7c2Vjb25kX2NoYW5jZSwgXywgXywgXywgX30sCisgICAgICAjc2Vjb25kX2NoYW5jZXsKKyAgICAgICAgJ1NFQ09ORF9DSEFOQ0UnPW51bGwsCisgICAgICAgICdTRUNPTkRfQ0hBTkNFXyc9bnVsbCwKKyAgICAgICAgJ1NFQ09ORF9DSEFOQ0VfXyc9bnVsbCwKKyAgICAgICAgJ1NFQ09ORF9DSEFOQ0VTJz1udWxsCisgICAgICB9CisgICAgKX0sCisgICAgeyJOT1dfRUFUX1RISVMgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsnTk9XX0VBVF9USElTJywgXywgXywgXywgX30sCisgICAgICAjJ05PV19FQVRfVEhJUyd7CisgICAgICAgIG5vd19lYXRfdGhpcz1udWxsLAorICAgICAgICBub3dfZWF0X3RoaXNfPW51bGwsCisgICAgICAgIG5vd19lYXRfdGhpc19fPW51bGwsCisgICAgICAgIG5vd19lYXRfdGhpc19hbmRfdGhpcz1udWxsCisgICAgICB9CisgICAgKX0sCisgICAgeyJUaGVFZGdlQ2FzZSByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeydUaGVFZGdlQ2FzZScsIF8sIF8sIF8sIF8sIF8sIF99LAorICAgICAgIydUaGVFZGdlQ2FzZSd7CisgICAgICAgIHRoZUVkZ2VDYXNlPW51bGwsCisgICAgICAgIHRoZUVkZ2VDYXNlXz1udWxsLAorICAgICAgICB0aGVFZGdlQ2FzZV9fPW51bGwsCisgICAgICAgICdUaGVFZGdlQ2FzZSc9bnVsbCwKKyAgICAgICAgJ1RoZUVkZ2VDYXNlXyc9bnVsbCwKKyAgICAgICAgJ1RoZUVkZ2VDYXNlX18nPW51bGwKKyAgICAgIH0KKyAgICApfSwKKyAgICB7IlRyaWNreV8gcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsnVHJpY2t5XycsIF8sIF99LAorICAgICAgIydUcmlja3lfJ3t0cmlja3k9bnVsbCwnVHJpY2t5Jz1udWxsfQorICAgICl9LAorICAgIHsiTmVzdGVkIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7J05lc3RlZCcsIF8sIF8sIF8sIF8sIF8sIF99LAorICAgICAgIydOZXN0ZWQneworICAgICAgICAnQ2xhc3NBbmRQcm9wJz1udWxsLAorICAgICAgICBzZWNvbmRfY2hhbmNlPW51bGwsCisgICAgICAgICdOT1dfRUFUX1RISVMnPW51bGwsCisgICAgICAgICdUaGVFZGdlQ2FzZSc9bnVsbCwKKyAgICAgICAgJ1RyaWNreV8nPW51bGwsCisgICAgICAgICdOZXN0ZWQnPW51bGwKKyAgICAgIH0KKyAgICApfSwKKyAgICB7IlByb2JsZW1fIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7J1Byb2JsZW1fJywgXywgX30sCisgICAgICAjJ1Byb2JsZW1fJ3twcm9ibGVtPW51bGwsJ1Byb2JsZW0nPW51bGx9CisgICAgKX0KKyAgXS4KKworc3RydWN0X2luZm9fdGVzdF8oKSAtPgorICBbCisgICAgeyJ1c2luZyBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFt7MSwgZG91YmxlfSx7MiwgZG91YmxlfV19LAorICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvKHVzaW5nKQorICAgICl9LAorICAgIHsiZGVsZWdhdGUgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCBzdHJpbmd9LAorICAgICAgICB7Miwge3N0cnVjdCwge25hbWVfY29uZmxpY3RfdGVzdF90eXBlcywgZGVsZWdhdGV9fX0KKyAgICAgIF19LAorICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvKGRlbGVnYXRlKQorICAgICl9LAorICAgIHsiZ2V0IGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW3sxLCBib29sfV19LAorICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvKGdldCkKKyAgICApfSwKKyAgICB7InBhcnRpYWwgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB7c3RydWN0LCB7bmFtZV9jb25mbGljdF90ZXN0X3R5cGVzLCB1c2luZ319fSwKKyAgICAgICAgezIsIGJvb2x9LAorICAgICAgICB7MywgYm9vbH0KKyAgICAgIF19LAorICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvKHBhcnRpYWwpCisgICAgKX0sCisgICAgeyJDbGFzc0FuZFByb3AgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbezEsIGJvb2x9LHsyLCBib29sfSx7MywgYm9vbH0sezQsIGJvb2x9XX0sCisgICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm8oJ0NsYXNzQW5kUHJvcCcpCisgICAgKX0sCisgICAgeyJzZWNvbmRfY2hhbmNlIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW3sxLCBib29sfSx7MiwgYm9vbH0sezMsIGJvb2x9LHs0LCBib29sfV19LAorICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvKHNlY29uZF9jaGFuY2UpCisgICAgKX0sCisgICAgeyJOT1dfRUFUX1RISVMgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbezEsIGJvb2x9LHsyLCBib29sfSx7MywgYm9vbH0sezQsIGJvb2x9XX0sCisgICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm8oJ05PV19FQVRfVEhJUycpCisgICAgKX0sCisgICAgeyJUaGVFZGdlQ2FzZSBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFt7MSwgYm9vbH0sezIsIGJvb2x9LHszLCBib29sfSx7NCwgYm9vbH0sezUsIGJvb2x9LHs2LCBib29sfV19LAorICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvKCdUaGVFZGdlQ2FzZScpCisgICAgKX0sCisgICAgeyJUcmlja3lfIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW3sxLCBib29sfSx7MiwgYm9vbH1dfSwKKyAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlczpzdHJ1Y3RfaW5mbygnVHJpY2t5XycpCisgICAgKX0sCisgICAgeyJOZXN0ZWQgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB7c3RydWN0LCB7bmFtZV9jb25mbGljdF90ZXN0X3R5cGVzLCAnQ2xhc3NBbmRQcm9wJ319fSwKKyAgICAgICAgezIsIHtzdHJ1Y3QsIHtuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXMsIHNlY29uZF9jaGFuY2V9fX0sCisgICAgICAgIHszLCB7c3RydWN0LCB7bmFtZV9jb25mbGljdF90ZXN0X3R5cGVzLCAnTk9XX0VBVF9USElTJ319fSwKKyAgICAgICAgezQsIHtzdHJ1Y3QsIHtuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXMsICdUaGVFZGdlQ2FzZSd9fX0sCisgICAgICAgIHs1LCB7c3RydWN0LCB7bmFtZV9jb25mbGljdF90ZXN0X3R5cGVzLCAnVHJpY2t5Xyd9fX0sCisgICAgICAgIHs2LCB7c3RydWN0LCB7bmFtZV9jb25mbGljdF90ZXN0X3R5cGVzLCAnTmVzdGVkJ319fQorICAgICAgXX0sCisgICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm8oJ05lc3RlZCcpCisgICAgKX0sCisgICAgeyJQcm9ibGVtXyBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFt7MSwgYm9vbH0sezIsIGJvb2x9XX0sCisgICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm8oJ1Byb2JsZW1fJykKKyAgICApfSwKKyAgICB7InVzaW5nIGV4dGVuZGVkIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgdW5kZWZpbmVkLCBkb3VibGUsIHNpbmdsZSwgdW5kZWZpbmVkfSwKKyAgICAgICAgezIsIHVuZGVmaW5lZCwgZG91YmxlLCBpbnRlZ2VyLCB1bmRlZmluZWR9CisgICAgICBdfSwKKyAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQodXNpbmcpCisgICAgKX0sCisgICAgeyJkZWxlZ2F0ZSBleHRlbmRlZCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHVuZGVmaW5lZCwgc3RyaW5nLCBwYXJ0aWFsLCB1bmRlZmluZWR9LAorICAgICAgICB7MiwgdW5kZWZpbmVkLCB7c3RydWN0LCB7bmFtZV9jb25mbGljdF90ZXN0X3R5cGVzLCBkZWxlZ2F0ZX19LCBkZWxlZ2F0ZSwgdW5kZWZpbmVkfQorICAgICAgXX0sCisgICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KGRlbGVnYXRlKQorICAgICl9LAorICAgIHsiZ2V0IGV4dGVuZGVkIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW3sxLCB1bmRlZmluZWQsIGJvb2wsIHNieXRlLCB1bmRlZmluZWR9XX0sCisgICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KGdldCkKKyAgICApfSwKKyAgICB7InBhcnRpYWwgZXh0ZW5kZWQgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB1bmRlZmluZWQsIHtzdHJ1Y3QsIHtuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXMsIHVzaW5nfX0sIHVzaW5nLCAjdXNpbmd7fX0sCisgICAgICAgIHsyLCB1bmRlZmluZWQsIGJvb2wsIHJlYWQsIHVuZGVmaW5lZH0sCisgICAgICAgIHszLCB1bmRlZmluZWQsIGJvb2wsIHdyaXRlLCB1bmRlZmluZWR9CisgICAgICBdfSwKKyAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQocGFydGlhbCkKKyAgICApfSwKKyAgICB7IkNsYXNzQW5kUHJvcCBleHRlbmRlZCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHVuZGVmaW5lZCwgYm9vbCwgJ0NsYXNzQW5kUHJvcCcsIHVuZGVmaW5lZH0sCisgICAgICAgIHsyLCB1bmRlZmluZWQsIGJvb2wsICdDbGFzc0FuZFByb3BfJywgdW5kZWZpbmVkfSwKKyAgICAgICAgezMsIHVuZGVmaW5lZCwgYm9vbCwgJ0NsYXNzQW5kUHJvcF9fJywgdW5kZWZpbmVkfSwKKyAgICAgICAgezQsIHVuZGVmaW5lZCwgYm9vbCwgJ0NsYXNzQW5kUHJvcGVyJywgdW5kZWZpbmVkfQorICAgICAgXX0sCisgICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCdDbGFzc0FuZFByb3AnKQorICAgICl9LAorICAgIHsic2Vjb25kX2NoYW5jZSBleHRlbmRlZCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHVuZGVmaW5lZCwgYm9vbCwgJ1NFQ09ORF9DSEFOQ0UnLCB1bmRlZmluZWR9LAorICAgICAgICB7MiwgdW5kZWZpbmVkLCBib29sLCAnU0VDT05EX0NIQU5DRV8nLCB1bmRlZmluZWR9LAorICAgICAgICB7MywgdW5kZWZpbmVkLCBib29sLCAnU0VDT05EX0NIQU5DRV9fJywgdW5kZWZpbmVkfSwKKyAgICAgICAgezQsIHVuZGVmaW5lZCwgYm9vbCwgJ1NFQ09ORF9DSEFOQ0VTJywgdW5kZWZpbmVkfQorICAgICAgXX0sCisgICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KHNlY29uZF9jaGFuY2UpCisgICAgKX0sCisgICAgeyJOT1dfRUFUX1RISVMgZXh0ZW5kZWQgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB1bmRlZmluZWQsIGJvb2wsIG5vd19lYXRfdGhpcywgdW5kZWZpbmVkfSwKKyAgICAgICAgezIsIHVuZGVmaW5lZCwgYm9vbCwgbm93X2VhdF90aGlzXywgdW5kZWZpbmVkfSwKKyAgICAgICAgezMsIHVuZGVmaW5lZCwgYm9vbCwgbm93X2VhdF90aGlzX18sIHVuZGVmaW5lZH0sCisgICAgICAgIHs0LCB1bmRlZmluZWQsIGJvb2wsIG5vd19lYXRfdGhpc19hbmRfdGhpcywgdW5kZWZpbmVkfQorICAgICAgXX0sCisgICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCdOT1dfRUFUX1RISVMnKQorICAgICl9LAorICAgIHsiVGhlRWRnZUNhc2UgZXh0ZW5kZWQgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB1bmRlZmluZWQsIGJvb2wsIHRoZUVkZ2VDYXNlLCB1bmRlZmluZWR9LAorICAgICAgICB7MiwgdW5kZWZpbmVkLCBib29sLCB0aGVFZGdlQ2FzZV8sIHVuZGVmaW5lZH0sCisgICAgICAgIHszLCB1bmRlZmluZWQsIGJvb2wsIHRoZUVkZ2VDYXNlX18sIHVuZGVmaW5lZH0sCisgICAgICAgIHs0LCB1bmRlZmluZWQsIGJvb2wsICdUaGVFZGdlQ2FzZScsIHVuZGVmaW5lZH0sCisgICAgICAgIHs1LCB1bmRlZmluZWQsIGJvb2wsICdUaGVFZGdlQ2FzZV8nLCB1bmRlZmluZWR9LAorICAgICAgICB7NiwgdW5kZWZpbmVkLCBib29sLCAnVGhlRWRnZUNhc2VfXycsIHVuZGVmaW5lZH0KKyAgICAgIF19LAorICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgnVGhlRWRnZUNhc2UnKQorICAgICl9LAorICAgIHsiVHJpY2t5XyBleHRlbmRlZCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHVuZGVmaW5lZCwgYm9vbCwgdHJpY2t5LCB1bmRlZmluZWR9LAorICAgICAgICB7MiwgdW5kZWZpbmVkLCBib29sLCAnVHJpY2t5JywgdW5kZWZpbmVkfQorICAgICAgXX0sCisgICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCdUcmlja3lfJykKKyAgICApfSwKKyAgICB7Ik5lc3RlZCBleHRlbmRlZCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHVuZGVmaW5lZCwge3N0cnVjdCwgeworICAgICAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlcywKKyAgICAgICAgICAnQ2xhc3NBbmRQcm9wJworICAgICAgICB9fSwgJ0NsYXNzQW5kUHJvcCcsICMnQ2xhc3NBbmRQcm9wJ3t9fSwKKyAgICAgICAgezIsIHVuZGVmaW5lZCwge3N0cnVjdCwgeworICAgICAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlcywKKyAgICAgICAgICBzZWNvbmRfY2hhbmNlCisgICAgICAgIH19LCBzZWNvbmRfY2hhbmNlLCAjc2Vjb25kX2NoYW5jZXt9fSwKKyAgICAgICAgezMsIHVuZGVmaW5lZCwge3N0cnVjdCwgeworICAgICAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlcywKKyAgICAgICAgICAnTk9XX0VBVF9USElTJworICAgICAgICB9fSwgJ05PV19FQVRfVEhJUycsICMnTk9XX0VBVF9USElTJ3t9fSwKKyAgICAgICAgezQsIHVuZGVmaW5lZCwge3N0cnVjdCwgeworICAgICAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlcywKKyAgICAgICAgICAnVGhlRWRnZUNhc2UnCisgICAgICAgIH19LCAnVGhlRWRnZUNhc2UnLCAjJ1RoZUVkZ2VDYXNlJ3t9fSwKKyAgICAgICAgezUsIHVuZGVmaW5lZCwge3N0cnVjdCwgeworICAgICAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlcywKKyAgICAgICAgICAnVHJpY2t5XycKKyAgICAgICAgfX0sICdUcmlja3lfJywgIydUcmlja3lfJ3t9fSwKKyAgICAgICAgezYsIHVuZGVmaW5lZCwge3N0cnVjdCwgeworICAgICAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlcywKKyAgICAgICAgICAnTmVzdGVkJworICAgICAgICB9fSwgJ05lc3RlZCcsIHVuZGVmaW5lZH0KKyAgICAgIF19LAorICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgnTmVzdGVkJykKKyAgICApfSwKKyAgICB7IlByb2JsZW1fIGV4dGVuZGVkIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgdW5kZWZpbmVkLCBib29sLCBwcm9ibGVtLCB1bmRlZmluZWR9LAorICAgICAgICB7MiwgdW5kZWZpbmVkLCBib29sLCAnUHJvYmxlbScsIHVuZGVmaW5lZH0KKyAgICAgIF19LAorICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgnUHJvYmxlbV8nKQorICAgICl9CisgIF0uCisKK3NlcnZpY2VfaW5mb190ZXN0XygpIC0+CisgIFsKKyAgICB7ImV2ZW50IHBhcmFtcyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbezEsIHtzdHJ1Y3QsIHtuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXMsIHBhcnRpYWx9fX1dfSwKKyAgICAgIGV4dGVybl90aHJpZnQ6ZnVuY3Rpb25faW5mbyhldmVudCwgcGFyYW1zX3R5cGUpCisgICAgKX0sCisgICAgeyJldmVudCByZXBseSIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCB7bmFtZV9jb25mbGljdF90ZXN0X3R5cGVzLCBkZWxlZ2F0ZX19LAorICAgICAgZXh0ZXJuX3RocmlmdDpmdW5jdGlvbl9pbmZvKGV2ZW50LCByZXBseV90eXBlKQorICAgICl9LAorICAgIHsiZXZlbnQgZXhjZXB0aW9ucyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbXX0sCisgICAgICBleHRlcm5fdGhyaWZ0OmZ1bmN0aW9uX2luZm8oZXZlbnQsIGV4Y2VwdGlvbnMpCisgICAgKX0sCisgICAgeyJGb28gcGFyYW1zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFt7MSwge3N0cnVjdCwge25hbWVfY29uZmxpY3RfdGVzdF90eXBlcywgJ05lc3RlZCd9fX1dfSwKKyAgICAgIGV4dGVybl90aHJpZnQ6ZnVuY3Rpb25faW5mbygnRm9vJywgcGFyYW1zX3R5cGUpCisgICAgKX0sCisgICAgeyJGb28gcmVwbHkiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW119LAorICAgICAgZXh0ZXJuX3RocmlmdDpmdW5jdGlvbl9pbmZvKCdGb28nLCByZXBseV90eXBlKQorICAgICl9LAorICAgIHsiRm9vIGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW3sxLCB7c3RydWN0LCB7bmFtZV9jb25mbGljdF90ZXN0X3R5cGVzLCAnUHJvYmxlbV8nfX19XX0sCisgICAgICBleHRlcm5fdGhyaWZ0OmZ1bmN0aW9uX2luZm8oJ0ZvbycsIGV4Y2VwdGlvbnMpCisgICAgKX0KKyAgXS4KZGlmZiAtLWdpdCBhL2xpYi9lcmwvdGVzdC90ZXN0X2NsaWVudC5lcmwgYi9saWIvZXJsL3Rlc3QvdGVzdF9jbGllbnQuZXJsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjRkMmQxLi4wMDAwMDAwCi0tLSBhL2xpYi9lcmwvdGVzdC90ZXN0X2NsaWVudC5lcmwKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotJSUKLSUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0lJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0lJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0lJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0lJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSUlCi0lJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotJSUKLSUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0lJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0lJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0lJSB1bmRlciB0aGUgTGljZW5zZS4KLSUlCi0KLS1tb2R1bGUodGVzdF9jbGllbnQpLgotCi0tZXhwb3J0KFtzdGFydC8wLCBzdGFydC8xXSkuCi0KLS1pbmNsdWRlKCJnZW4tZXJsL3RocmlmdF90ZXN0X3R5cGVzLmhybCIpLgotCi0tcmVjb3JkKG9wdGlvbnMsIHtwb3J0ID0gOTA5MCwKLSAgICAgICAgICAgICAgICAgIGNsaWVudF9vcHRzID0gW119KS4KLQotcGFyc2VfYXJncyhBcmdzKSAtPiBwYXJzZV9hcmdzKEFyZ3MsICNvcHRpb25ze30pLgotcGFyc2VfYXJncyhbXSwgT3B0cykgLT4gT3B0czsKLXBhcnNlX2FyZ3MoW0hlYWQgfCBSZXN0XSwgT3B0cykgLT4KLSAgICBOZXdPcHRzID0KLSAgICAgICAgY2FzZSBjYXRjaCBsaXN0X3RvX2ludGVnZXIoSGVhZCkgb2YKLSAgICAgICAgICAgIFBvcnQgd2hlbiBpc19pbnRlZ2VyKFBvcnQpIC0+Ci0gICAgICAgICAgICAgICAgT3B0cyNvcHRpb25ze3BvcnQgPSBQb3J0fTsKLSAgICAgICAgICAgIF9FbHNlIC0+Ci0gICAgICAgICAgICAgICAgY2FzZSBIZWFkIG9mCi0gICAgICAgICAgICAgICAgICAgICJmcmFtZWQiIC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBPcHRzI29wdGlvbnN7Y2xpZW50X29wdHMgPSBbe2ZyYW1lZCwgdHJ1ZX0gfCBPcHRzI29wdGlvbnMuY2xpZW50X29wdHNdfTsKLSAgICAgICAgICAgICAgICAgICAgIiIgLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIE9wdHM7Ci0gICAgICAgICAgICAgICAgICAgIF9FbHNlIC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcmxhbmc6ZXJyb3Ioe2JhZF9hcmcsIEhlYWR9KQotICAgICAgICAgICAgICAgIGVuZAotICAgICAgICBlbmQsCi0gICAgcGFyc2VfYXJncyhSZXN0LCBOZXdPcHRzKS4KLQotCi1zdGFydCgpIC0+IHN0YXJ0KFtdKS4KLXN0YXJ0KEFyZ3MpIC0+Ci0gICNvcHRpb25ze3BvcnQgPSBQb3J0LCBjbGllbnRfb3B0cyA9IENsaWVudE9wdHN9ID0gcGFyc2VfYXJncyhBcmdzKSwKLSAge29rLCBDbGllbnQwfSA9IHRocmlmdF9jbGllbnRfdXRpbDpuZXcoCi0gICAgIjEyNy4wLjAuMSIsIFBvcnQsIHRocmlmdF90ZXN0X3RocmlmdCwgQ2xpZW50T3B0cyksCi0KLSAgRGVtb1h0cnVjdCA9ICMnWHRydWN0J3sKLSAgICBzdHJpbmdfdGhpbmcgPSA8PCJaZXJvIj4+LAotICAgIGJ5dGVfdGhpbmcgPSAxLAotICAgIGkzMl90aGluZyA9IDkxMjgzNjEsCi0gICAgaTY0X3RoaW5nID0gOTIyMzM3MjAzNjg1NDc3NTgwN30sCi0KLSAgRGVtb05lc3QgPSAjJ1h0cnVjdDInewotICAgIGJ5dGVfdGhpbmcgPSA3LAotICAgIHN0cnVjdF90aGluZyA9IERlbW9YdHJ1Y3QsCi0gICAgJSBOb3RlIHRoYXQgd2UgZG9uJ3Qgc2V0IGkzMl90aGluZywgaXQgd2lsbCBjb21lIGJhY2sgYXMgdW5kZWZpbmVkCi0gICAgJSBmcm9tIHRoZSBQeXRob24gc2VydmVyLCBidXQgMCBmcm9tIHRoZSBDKysgc2VydmVyLCBzaW5jZSBpdCBpcyBub3QKLSAgICAlIG9wdGlvbmFsCi0gICAgaTMyX3RoaW5nID0gMn0sCi0KLSAgJSBJcyBpdCBzYWZlIHRvIG1hdGNoIHRoZXNlIHRoaW5ncz8KLSAgRGVtb0RpY3QgPSBkaWN0OmZyb21fbGlzdChbIHtLZXksIEtleS0xMH0gfHwgS2V5IDwtIGxpc3RzOnNlcSgwLDEwKSBdKSwKLSAgRGVtb1NldCA9IHNldHM6ZnJvbV9saXN0KFsgS2V5IHx8IEtleSA8LSBsaXN0czpzZXEoLTMsMykgXSksCi0KLSAgJURlbW9JbnNhbmUgPSAjaW5zYW5pdHl7Ci0gICUgIHVzZXJNYXAgPSBkaWN0OmZyb21fbGlzdChbez90aHJpZnRUZXN0X0ZJVkUsIDUwMDB9XSksCi0gICUgIHh0cnVjdHMgPSBbI3h0cnVjdHsgc3RyaW5nX3RoaW5nID0gPDwiVHJ1Y2siPj4sIGJ5dGVfdGhpbmcgPSA4LCBpMzJfdGhpbmcgPSA4LCBpNjRfdGhpbmcgPSA4fV19LAotCi0gIHtDbGllbnQwMSwge29rLCBva319ID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDAsIHRlc3RWb2lkLCBbXSksCi0KLSAge0NsaWVudDAyLCB7b2ssIDw8IlRlc3QiPj59fSAgICAgID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDAxLCB0ZXN0U3RyaW5nLCBbIlRlc3QiXSksCi0gIHtDbGllbnQwMywge29rLCA8PCJUZXN0Ij4+fX0gICAgICA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQwMiwgdGVzdFN0cmluZywgWzw8IlRlc3QiPj5dKSwKLSAge0NsaWVudDA0LCB7b2ssIDYzfX0gICAgICAgICAgICAgID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDAzLCB0ZXN0Qnl0ZSwgWzYzXSksCi0gIHtDbGllbnQwNSwge29rLCAtMX19ICAgICAgICAgICAgICA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQwNCwgdGVzdEkzMiwgWy0xXSksCi0gIHtDbGllbnQwNiwge29rLCAwfX0gICAgICAgICAgICAgICA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQwNSwgdGVzdEkzMiwgWzBdKSwKLSAge0NsaWVudDA3LCB7b2ssIC0zNDM1OTczODM2OH19ICAgID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDA2LCB0ZXN0STY0LCBbLTM0MzU5NzM4MzY4XSksCi0gIHtDbGllbnQwOCwge29rLCAtNS4yMDk4NTIzfX0gICAgICA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQwNywgdGVzdERvdWJsZSwgWy01LjIwOTg1MjNdKSwKLSAge0NsaWVudDA5LCB7b2ssIERlbW9YdHJ1Y3R9fSAgICAgID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDA4LCB0ZXN0U3RydWN0LCBbRGVtb1h0cnVjdF0pLAotICB7Q2xpZW50MTAsIHtvaywgRGVtb05lc3R9fSAgICAgICAgPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MDksIHRlc3ROZXN0LCBbRGVtb05lc3RdKSwKLSAge0NsaWVudDExLCB7b2ssIERlbW9EaWN0fX0gICAgICAgID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDEwLCB0ZXN0TWFwLCBbRGVtb0RpY3RdKSwKLSAge0NsaWVudDEyLCB7b2ssIERlbW9TZXR9fSAgICAgICAgID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDExLCB0ZXN0U2V0LCBbRGVtb1NldF0pLAotICB7Q2xpZW50MTMsIHtvaywgWy0xLDIsM119fSAgICAgICAgPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MTIsIHRlc3RMaXN0LCBbWy0xLDIsM11dKSwKLSAge0NsaWVudDE0LCB7b2ssIDF9fSAgICAgICAgICAgICAgID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDEzLCB0ZXN0RW51bSwgWz9USFJJRlRfVEVTVF9OVU1CRVJaX09ORV0pLAotICB7Q2xpZW50MTUsIHtvaywgMzA5ODU4MjM1MDgyNTIzfX0gPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MTQsIHRlc3RUeXBlZGVmLCBbMzA5ODU4MjM1MDgyNTIzXSksCi0KLSAgJSBObyBweXRob24gaW1wbGVtZW50YXRpb24sIGJ1dCB3b3JrcyB3aXRoIEMrKyBhbmQgRXJsYW5nLgotICAle0NsaWVudDE2LCB7b2ssIEluc2FuZVJlc3VsdH19ICAgID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDE1LCB0ZXN0SW5zYW5pdHksIFtEZW1vSW5zYW5lXSksCi0gICVpbzpmb3JtYXQoIn5wfm4iLCBbSW5zYW5lUmVzdWx0XSksCi0gIENsaWVudDE2ID0gQ2xpZW50MTUsCi0KLSAge0NsaWVudDE3LCB7b2ssICMnWHRydWN0J3tzdHJpbmdfdGhpbmcgPSA8PCJNZXNzYWdlIj4+fX19ID0KLSAgICB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MTYsIHRlc3RNdWx0aUV4Y2VwdGlvbiwgWyJTYWZlIiwgIk1lc3NhZ2UiXSksCi0KLSAgQ2xpZW50MTggPQotICAgIHRyeQotICAgICAge0NsaWVudFMxLCBSZXN1bHQxfSA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQxNywgdGVzdE11bHRpRXhjZXB0aW9uLCBbIlhjZXB0aW9uIiwgIk1lc3NhZ2UiXSksCi0gICAgICBpbzpmb3JtYXQoIlVuZXhwZWN0ZWQgcmV0dXJuISB+cH5uIiwgW1Jlc3VsdDFdKSwKLSAgICAgIENsaWVudFMxCi0gICAgY2F0Y2gKLSAgICAgIHRocm93OntDbGllbnRTMiwge2V4Y2VwdGlvbiwgRXhuUzEgPSAjJ1hjZXB0aW9uJ3t9fX0gLT4KLSAgICAgICAgIydYY2VwdGlvbid7ZXJyb3JDb2RlID0gMTAwMSwgbWVzc2FnZSA9IDw8IlRoaXMgaXMgYW4gWGNlcHRpb24iPj59ID0gRXhuUzEsCi0gICAgICAgIENsaWVudFMyOwotICAgICAgdGhyb3c6e0NsaWVudFMyLCB7ZXhjZXB0aW9uLCBfRXhuUzEgPSAjJ1hjZXB0aW9uMid7fX19IC0+Ci0gICAgICAgIGlvOmZvcm1hdCgiV3JvbmcgZXhjZXB0aW9uIHR5cGUhfm4iLCBbXSksCi0gICAgICAgIENsaWVudFMyCi0gICAgZW5kLAotCi0gIENsaWVudDE5ID0KLSAgICB0cnkKLSAgICAgIHtDbGllbnRTMywgUmVzdWx0Mn0gPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MTgsIHRlc3RNdWx0aUV4Y2VwdGlvbiwgWyJYY2VwdGlvbjIiLCAiTWVzc2FnZSJdKSwKLSAgICAgIGlvOmZvcm1hdCgiVW5leHBlY3RlZCByZXR1cm4hIH5wfm4iLCBbUmVzdWx0Ml0pLAotICAgICAgQ2xpZW50UzMKLSAgICBjYXRjaAotICAgICAgdGhyb3c6e0NsaWVudFM0LCB7ZXhjZXB0aW9uLCBfRXhuUzIgPSAjJ1hjZXB0aW9uJ3t9fX0gLT4KLSAgICAgICAgaW86Zm9ybWF0KCJXcm9uZyBleGNlcHRpb24gdHlwZSF+biIsIFtdKSwKLSAgICAgICAgQ2xpZW50UzQ7Ci0gICAgICB0aHJvdzp7Q2xpZW50UzQsIHtleGNlcHRpb24sIEV4blMyID0gIydYY2VwdGlvbjIne319fSAtPgotICAgICAgICAjJ1hjZXB0aW9uMid7ZXJyb3JDb2RlID0gMjAwMiwKLSAgICAgICAgICAgICAgICAgICBzdHJ1Y3RfdGhpbmcgPSAjJ1h0cnVjdCd7Ci0gICAgICAgICAgICAgICAgICAgICBzdHJpbmdfdGhpbmcgPSA8PCJUaGlzIGlzIGFuIFhjZXB0aW9uMiI+Pn19ID0gRXhuUzIsCi0gICAgICAgIENsaWVudFM0Ci0gICAgZW5kLAotCi0gIHRocmlmdF9jbGllbnQ6Y2xvc2UoQ2xpZW50MTkpLgpkaWZmIC0tZ2l0IGEvbGliL2VybC90ZXN0L3Rlc3RfY29uc3QuZXJsIGIvbGliL2VybC90ZXN0L3Rlc3RfY29uc3QuZXJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyNzc3N2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3Rlc3QvdGVzdF9jb25zdC5lcmwKQEAgLTAsMCArMSw1NCBAQAorJSUKKyUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCislJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCislJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCislJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCislJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyUlCislJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorJSUKKyUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCislJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCislJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCislJSB1bmRlciB0aGUgTGljZW5zZS4KKyUlCisKKy1tb2R1bGUodGVzdF9jb25zdCkuCisKKy1pZmRlZihURVNUKS4KKy1pbmNsdWRlX2xpYigiZXVuaXQvaW5jbHVkZS9ldW5pdC5ocmwiKS4KKworLWluY2x1ZGUoImdlbi1lcmwvY29uc3RhbnRzX2RlbW9fdHlwZXMuaHJsIikuCisKK25hbWVzcGFjZV90ZXN0KCkgLT4KKyAgJSUgVmVyaWZ5IHRoYXQgcmVjb3JkcyBwcm9kdWNlZCBieSBDb25zdGFudHNEZW1vLnRocmlmdCBoYXZlIHRoZSByaWdodCBuYW1lc3BhY2UuCisgIGlvOmZvcm1hdCh1c2VyLCAiaW4gbmFtZXNwYWNlX3Rlc3QoKVxuIiwgW10pLAorICB7c3RydWN0LCBffSA9IGNvbnN0YW50c19kZW1vX3R5cGVzOnN0cnVjdF9pbmZvKCdjb25zdHNfdGhpbmcnKSwKKyAge3N0cnVjdCwgX30gPSBjb25zdGFudHNfZGVtb190eXBlczpzdHJ1Y3RfaW5mbygnY29uc3RzX0JsYWgnKSwKKyAgb2suCisKK2NvbnN0X21hcF90ZXN0KCkgLT4KKyAgP2Fzc2VydEVxdWFsKDIzMywgY29uc3RhbnRzX2RlbW9fY29uc3RhbnRzOmdlbl9tYXAoMzU1MzIpKSwKKyAgP2Fzc2VydEVycm9yKGZ1bmN0aW9uX2NsYXVzZSwgY29uc3RhbnRzX2RlbW9fY29uc3RhbnRzOmdlbl9tYXAoMCkpLAorCisgID9hc3NlcnRFcXVhbCg4NTMsIGNvbnN0YW50c19kZW1vX2NvbnN0YW50czpnZW5fbWFwKDQzNTIzLCBkZWZhdWx0KSksCisgID9hc3NlcnRFcXVhbChkZWZhdWx0LCBjb25zdGFudHNfZGVtb19jb25zdGFudHM6Z2VuX21hcCgxMDExMCwgZGVmYXVsdCkpLAorCisgID9hc3NlcnRFcXVhbCg5ODMyNSwgY29uc3RhbnRzX2RlbW9fY29uc3RhbnRzOmdlbl9tYXAyKCJsa2pzZGYiKSksCisgID9hc3NlcnRFcnJvcihmdW5jdGlvbl9jbGF1c2UsIGNvbnN0YW50c19kZW1vX2NvbnN0YW50czpnZW5fbWFwMigibm9uZXhpc3QiKSksCisKKyAgP2Fzc2VydEVxdWFsKDIzMywgY29uc3RhbnRzX2RlbW9fY29uc3RhbnRzOmdlbl9tYXAyKCJoZWxsbyIsIDMyMSkpLAorICA/YXNzZXJ0RXF1YWwoMzIxLCBjb25zdGFudHNfZGVtb19jb25zdGFudHM6Z2VuX21hcDIoImdvb2RieWUiLCAzMjEpKS4KKworY29uc3RfbGlzdF90ZXN0KCkgLT4KKyAgP2Fzc2VydEVxdWFsKDIzNTk4MzUyLCBjb25zdGFudHNfZGVtb19jb25zdGFudHM6Z2VuX2xpc3QoMikpLAorICA/YXNzZXJ0RXJyb3IoZnVuY3Rpb25fY2xhdXNlLCBjb25zdGFudHNfZGVtb19jb25zdGFudHM6Z2VuX2xpc3QoMCkpLAorCisgID9hc3NlcnRFcXVhbCgzMjUzNTIzLCBjb25zdGFudHNfZGVtb19jb25zdGFudHM6Z2VuX2xpc3QoMywgZGVmYXVsdCkpLAorICA/YXNzZXJ0RXF1YWwoZGVmYXVsdCwgY29uc3RhbnRzX2RlbW9fY29uc3RhbnRzOmdlbl9saXN0KDEwLCBkZWZhdWx0KSkuCisKKy1lbmRpZi4gJSUgVEVTVApkaWZmIC0tZ2l0IGEvbGliL2VybC90ZXN0L3Rlc3RfbWVtYnVmZmVyLmVybCBiL2xpYi9lcmwvdGVzdC90ZXN0X21lbWJ1ZmZlci5lcmwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3MWFlMTEuLjAwMDAwMDAKLS0tIGEvbGliL2VybC90ZXN0L3Rlc3RfbWVtYnVmZmVyLmVybAorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0lJQotJSUgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotJSUgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSUlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0lJSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSUlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSUlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSUlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotJSUKLSUlICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0lJQotJSUgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotJSUgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSUlICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotJSUgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSUlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSUlIHVuZGVyIHRoZSBMaWNlbnNlLgotJSUKLQotLW1vZHVsZSh0ZXN0X21lbWJ1ZmZlcikuCi0KLS1pZmRlZihURVNUKS4KLS1pbmNsdWRlX2xpYigiZXVuaXQvaW5jbHVkZS9ldW5pdC5ocmwiKS4KLQotLWluY2x1ZGUoImdlbi1lcmwvdGhyaWZ0X3Rlc3RfdHlwZXMuaHJsIikuCi0KLXRlc3RfZGF0YSgpIC0+Ci0gICMnWHRydWN0J3sKLSAgICBzdHJpbmdfdGhpbmcgPSA8PCJmb29iYXIiPj4sCi0gICAgYnl0ZV90aGluZyA9IDEyMywKLSAgICBpMzJfdGhpbmcgPSAxMjM0NTY3LAotICAgIGk2NF90aGluZyA9IDEyMzQ1Njc4OTAwCi0gIH0uCi0KLWVuY29kZV9kZWNvZGVfMV90ZXN0KCkgLT4KLSAge29rLCBUcmFuc3BvcnR9ID0gdGhyaWZ0X21lbW9yeV9idWZmZXI6bmV3KCksCi0gIHtvaywgUHJvdG9jb2wwfSA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2w6bmV3KFRyYW5zcG9ydCksCi0gIFRlc3REYXRhID0gdGVzdF9kYXRhKCksCi0gIHtQcm90b2NvbDEsIG9rfSA9IHRocmlmdF9wcm90b2NvbDp3cml0ZShQcm90b2NvbDAsCi0gICAge3tzdHJ1Y3QsIGVsZW1lbnQoMiwgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm8oJ1h0cnVjdCcpKX0sCi0gICAgICBUZXN0RGF0YX0pLAotICB7X1Byb3RvY29sMiwge29rLCBSZXN1bHR9fSA9IHRocmlmdF9wcm90b2NvbDpyZWFkKFByb3RvY29sMSwKLSAgICB7c3RydWN0LCBlbGVtZW50KDIsIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvKCdYdHJ1Y3QnKSl9LAotICAgICdYdHJ1Y3QnKSwKLSAgUmVzdWx0ID0gVGVzdERhdGEuCi0KLWVuY29kZV9kZWNvZGVfMl90ZXN0KCkgLT4KLSAge29rLCBUcmFuc3BvcnR9ID0gdGhyaWZ0X21lbW9yeV9idWZmZXI6bmV3KCksCi0gIHtvaywgUHJvdG9jb2wwfSA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2w6bmV3KFRyYW5zcG9ydCksCi0gIFRlc3REYXRhID0gdGVzdF9kYXRhKCksCi0gIHtQcm90b2NvbDEsIG9rfSA9IHRocmlmdF9wcm90b2NvbDp3cml0ZShQcm90b2NvbDAsCi0gICAge3tzdHJ1Y3QsIGVsZW1lbnQoMiwgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm8oJ1h0cnVjdCcpKX0sCi0gICAgICBUZXN0RGF0YX0pLAotICB7X1Byb3RvY29sMiwge29rLCBSZXN1bHR9fSA9IHRocmlmdF9wcm90b2NvbDpyZWFkKFByb3RvY29sMSwKLSAgICB7c3RydWN0LCBlbGVtZW50KDIsIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvKCdYdHJ1Y3QzJykpfSwKLSAgICAnWHRydWN0MycpLAotCi0gIFJlc3VsdCA9ICMnWHRydWN0Myd7c3RyaW5nX3RoaW5nID0gVGVzdERhdGEjJ1h0cnVjdCcuc3RyaW5nX3RoaW5nLAotICAgIGNoYW5nZWQgPSB1bmRlZmluZWQsCi0gICAgaTMyX3RoaW5nID0gVGVzdERhdGEjJ1h0cnVjdCcuaTMyX3RoaW5nLAotICAgIGk2NF90aGluZyA9IFRlc3REYXRhIydYdHJ1Y3QnLmk2NF90aGluZ30uCi0KLQotZW5jb2RlX2RlY29kZV8zX3Rlc3QoKSAtPgotICB7b2ssIFRyYW5zcG9ydH0gPSB0aHJpZnRfbWVtb3J5X2J1ZmZlcjpuZXcoKSwKLSAge29rLCBQcm90b2NvbDB9ID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbDpuZXcoVHJhbnNwb3J0KSwKLSAgVGVzdERhdGEgPSAjJ0Jvb2xzJ3tpbV90cnVlID0gdHJ1ZSwgaW1fZmFsc2UgPSBmYWxzZX0sCi0gIHtQcm90b2NvbDEsIG9rfSA9IHRocmlmdF9wcm90b2NvbDp3cml0ZShQcm90b2NvbDAsCi0gICAge3tzdHJ1Y3QsIGVsZW1lbnQoMiwgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm8oJ0Jvb2xzJykpfSwKLSAgICAgIFRlc3REYXRhfSksCi0gIHtfUHJvdG9jb2wyLCB7b2ssIFJlc3VsdH19ID0gdGhyaWZ0X3Byb3RvY29sOnJlYWQoUHJvdG9jb2wxLAotICAgIHtzdHJ1Y3QsIGVsZW1lbnQoMiwgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm8oJ0Jvb2xzJykpfSwKLSAgICAnQm9vbHMnKSwKLQotICB0cnVlID0gVGVzdERhdGEjJ0Jvb2xzJy5pbV90cnVlICA9Oj0gUmVzdWx0IydCb29scycuaW1fdHJ1ZSwKLSAgdHJ1ZSA9IFRlc3REYXRhIydCb29scycuaW1fZmFsc2UgPTo9IFJlc3VsdCMnQm9vbHMnLmltX2ZhbHNlLgotCi0KLWVuY29kZV9kZWNvZGVfNF90ZXN0KCkgLT4KLSAge29rLCBUcmFuc3BvcnR9ID0gdGhyaWZ0X21lbW9yeV9idWZmZXI6bmV3KCksCi0gIHtvaywgUHJvdG9jb2wwfSA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2w6bmV3KFRyYW5zcG9ydCksCi0gIFRlc3REYXRhID0gIydJbnNhbml0eSd7eHRydWN0cz1bXX0sCi0gIHtQcm90b2NvbDEsIG9rfSA9IHRocmlmdF9wcm90b2NvbDp3cml0ZShQcm90b2NvbDAsCi0gICAge3tzdHJ1Y3QsIGVsZW1lbnQoMiwgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm8oJ0luc2FuaXR5JykpfSwKLSAgICAgIFRlc3REYXRhfSksCi0gIHtfUHJvdG9jb2wyLCB7b2ssIFJlc3VsdH19ID0gdGhyaWZ0X3Byb3RvY29sOnJlYWQoUHJvdG9jb2wxLAotICAgIHtzdHJ1Y3QsIGVsZW1lbnQoMiwgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm8oJ0luc2FuaXR5JykpfSwKLSAgICAnSW5zYW5pdHknKSwKLQotICBUZXN0RGF0YSA9IFJlc3VsdC4KLQotZW5jb2RlX2RlY29kZV81X3Rlc3QoKSAtPgotICAlIHRlc3Qgd3JpdGluZyB0byBhIGJ1ZmZlciwgZ2V0dGluZyB0aGUgYnl0ZXMgb3V0LCBwdXR0aW5nIHRoZW0KLSAgJSBpbiBhIG5ldyBidWZmZXIgYW5kIHJlYWRpbmcgdGhlbQotCi0gICUgaGVyZSdzIHRoZSB3cml0aW5nIHBhcnQKLSAge29rLCBUcmFuc3BvcnQwfSA9IHRocmlmdF9tZW1vcnlfYnVmZmVyOm5ldygpLAotICB7b2ssIFByb3RvY29sMH0gPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sOm5ldyhUcmFuc3BvcnQwKSwKLSAgVGVzdERhdGEgPSB0ZXN0X2RhdGEoKSwKLSAge1Byb3RvY29sMSwgb2t9ID0gdGhyaWZ0X3Byb3RvY29sOndyaXRlKFByb3RvY29sMCwKLSAgICB7e3N0cnVjdCwgZWxlbWVudCgyLCB0aHJpZnRfdGVzdF90eXBlczpzdHJ1Y3RfaW5mbygnWHRydWN0JykpfSwKLSAgICAgIFRlc3REYXRhfSksCi0gICUgZmx1c2ggbm93IHJldHVybnMgdGhlIGJ1ZmZlcgotICB7X1Byb3RvY29sMiwgQnVmfSA9IHRocmlmdF9wcm90b2NvbDpmbHVzaF90cmFuc3BvcnQoUHJvdG9jb2wxKSwKLQotICAlIG5vdyB0aGUgcmVhZGluZyBwYXJ0Ci0gIHtvaywgVDJ9ID0gdGhyaWZ0X21lbW9yeV9idWZmZXI6bmV3IChCdWYpLAotICB7b2ssIFAyfSA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2w6bmV3KFQyKSwKLSAge18sIHtvaywgUmVzdWx0fX0gPSB0aHJpZnRfcHJvdG9jb2w6cmVhZChQMiwKLSAgICB7c3RydWN0LCBlbGVtZW50KDIsIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvKCdYdHJ1Y3QnKSl9LAotICAgICdYdHJ1Y3QnKSwKLQotICBSZXN1bHQgPSBUZXN0RGF0YS4KLQotLWVuZGlmLgpkaWZmIC0tZ2l0IGEvbGliL2VybC90ZXN0L3Rlc3Rfb21pdC5lcmwgYi9saWIvZXJsL3Rlc3QvdGVzdF9vbWl0LmVybApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDg0MWUyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC90ZXN0L3Rlc3Rfb21pdC5lcmwKQEAgLTAsMCArMSw3OSBAQAorLW1vZHVsZSh0ZXN0X29taXQpLgorCistaW5jbHVkZSgiZ2VuLWVybC90aHJpZnRfb21pdF93aXRoX3R5cGVzLmhybCIpLgorCistaWZkZWYoVEVTVCkuCistaW5jbHVkZV9saWIoImV1bml0L2luY2x1ZGUvZXVuaXQuaHJsIikuCisKK29taXRfc3RydWN0MV90ZXN0KCkgLT4KKyAgJSUgSW4gdGhpcyB0ZXN0LCB0aGUgZmllbGQgdGhhdCBpcyBkZWxldGVkIGlzIGEgYmFzaWMgdHlwZSAoYW4gaTMyKS4KKyAgQSA9ICN0ZXN0MXtvbmUgPSAxLCB0aHJlZSA9IDN9LAorICBCID0gI3Rlc3Qxe29uZSA9IDEsIHR3byA9IDIsIHRocmVlID0gM30sCisgIHtvaywgVHJhbnNwb3J0fSA9IHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0Om5ldygpLAorICB7b2ssIFAwfSA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2w6bmV3KFRyYW5zcG9ydCksCisKKyAge1AxLCBva30gPSB0aHJpZnRfcHJvdG9jb2w6d3JpdGUoUDAsIHt7c3RydWN0LCB7dGhyaWZ0X29taXRfd2l0aF90eXBlcywgZWxlbWVudCgxLCBBKX19LCBBfSksCisgIHtQMiwge29rLCBPMH19ID0gdGhyaWZ0X3Byb3RvY29sOnJlYWQoUDEsIHtzdHJ1Y3QsIHt0aHJpZnRfb21pdF93aXRob3V0X3R5cGVzLCBlbGVtZW50KDEsIEEpfX0pLAorICA/YXNzZXJ0RXF1YWwoZWxlbWVudCgxLCBBKSwgZWxlbWVudCgxLCBPMCkpLAorICA/YXNzZXJ0RXF1YWwoZWxlbWVudCgyLCBBKSwgZWxlbWVudCgyLCBPMCkpLAorICA/YXNzZXJ0RXF1YWwoZWxlbWVudCg0LCBBKSwgZWxlbWVudCgzLCBPMCkpLAorCisgIHtQMywgb2t9ID0gdGhyaWZ0X3Byb3RvY29sOndyaXRlKFAyLCB7e3N0cnVjdCwge3RocmlmdF9vbWl0X3dpdGhfdHlwZXMsIGVsZW1lbnQoMSwgQil9fSwgQn0pLAorICB7X1A0LCB7b2ssIE8xfX0gPSB0aHJpZnRfcHJvdG9jb2w6cmVhZChQMywge3N0cnVjdCwge3RocmlmdF9vbWl0X3dpdGhvdXRfdHlwZXMsIGVsZW1lbnQoMSwgQSl9fSksCisgID9hc3NlcnRFcXVhbChlbGVtZW50KDEsIEEpLCBlbGVtZW50KDEsIE8xKSksCisgID9hc3NlcnRFcXVhbChlbGVtZW50KDIsIEEpLCBlbGVtZW50KDIsIE8xKSksCisgID9hc3NlcnRFcXVhbChlbGVtZW50KDQsIEEpLCBlbGVtZW50KDMsIE8xKSksCisKKyAgb2suCisKK29taXRfc3RydWN0Ml90ZXN0KCkgLT4KKyAgJSUgSW4gdGhpcyB0ZXN0LCB0aGUgZmllbGQgdGhhdCBpcyBkZWxldGVkIGlzIGEgc3RydWN0LgorICBBID0gI3Rlc3Qye29uZSA9IDEsIHR3byA9ICN0ZXN0MntvbmUgPSAxMCwgdGhyZWUgPSAzMH0sIHRocmVlID0gM30sCisgIEIgPSAjdGVzdDJ7b25lID0gMSwgdHdvID0gI3Rlc3Qye29uZSA9IDEwLCB0d28gPSAjdGVzdDJ7b25lID0gMTAwfSwgdGhyZWUgPSAzMH0sIHRocmVlID0gM30sCisKKyAge29rLCBUcmFuc3BvcnR9ID0gdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQ6bmV3KCksCisgIHtvaywgUDB9ID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbDpuZXcoVHJhbnNwb3J0KSwKKworICB7UDEsIG9rfSA9IHRocmlmdF9wcm90b2NvbDp3cml0ZShQMCwge3tzdHJ1Y3QsIHt0aHJpZnRfb21pdF93aXRoX3R5cGVzLCBlbGVtZW50KDEsIEEpfX0sIEF9KSwKKyAge1AyLCB7b2ssIE8wfX0gPSB0aHJpZnRfcHJvdG9jb2w6cmVhZChQMSwge3N0cnVjdCwge3RocmlmdF9vbWl0X3dpdGhvdXRfdHlwZXMsIGVsZW1lbnQoMSwgQSl9fSksCisgID9hc3NlcnRFcXVhbChlbGVtZW50KDEsIEEpLCBlbGVtZW50KDEsIE8wKSksCisgID9hc3NlcnRFcXVhbChlbGVtZW50KDIsIEEpLCBlbGVtZW50KDIsIE8wKSksCisgID9hc3NlcnRFcXVhbChlbGVtZW50KDQsIEEpLCBlbGVtZW50KDMsIE8wKSksCisKKyAge1AzLCBva30gPSB0aHJpZnRfcHJvdG9jb2w6d3JpdGUoUDIsIHt7c3RydWN0LCB7dGhyaWZ0X29taXRfd2l0aF90eXBlcywgZWxlbWVudCgxLCBCKX19LCBCfSksCisgIHtfUDQsIHtvaywgTzF9fSA9IHRocmlmdF9wcm90b2NvbDpyZWFkKFAzLCB7c3RydWN0LCB7dGhyaWZ0X29taXRfd2l0aG91dF90eXBlcywgZWxlbWVudCgxLCBBKX19KSwKKyAgP2Fzc2VydEVxdWFsKGVsZW1lbnQoMSwgQSksIGVsZW1lbnQoMSwgTzEpKSwKKyAgP2Fzc2VydEVxdWFsKGVsZW1lbnQoMiwgQSksIGVsZW1lbnQoMiwgTzEpKSwKKyAgP2Fzc2VydEVxdWFsKGVsZW1lbnQoNCwgQSksIGVsZW1lbnQoMywgTzEpKSwKKworICBvay4KKworb21pdF9saXN0X3Rlc3QoKSAtPgorICAlJSBJbiB0aGlzIHRlc3QsIHRoZSBmaWVsZCB0aGF0IGlzIGRlbGV0ZWQgaXMgYSBsaXN0LgorICBBID0gI3Rlc3Qxe29uZSA9IDEsIHR3byA9IDIsIHRocmVlID0gM30sCisgIEIgPSAjdGVzdDN7b25lID0gMSwgdHdvID0gWyBBIF19LAorCisgIHtvaywgVHJhbnNwb3J0fSA9IHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0Om5ldygpLAorICB7b2ssIFAwfSA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2w6bmV3KFRyYW5zcG9ydCksCisKKyAge1AxLCBva30gPSB0aHJpZnRfcHJvdG9jb2w6d3JpdGUoUDAsIHt7c3RydWN0LCB7dGhyaWZ0X29taXRfd2l0aF90eXBlcywgZWxlbWVudCgxLCBCKX19LCBCfSksCisgIHtfUDIsIHtvaywgTzB9fSA9IHRocmlmdF9wcm90b2NvbDpyZWFkKFAxLCB7c3RydWN0LCB7dGhyaWZ0X29taXRfd2l0aG91dF90eXBlcywgZWxlbWVudCgxLCBCKX19KSwKKyAgP2Fzc2VydEVxdWFsKGVsZW1lbnQoMiwgQiksIGVsZW1lbnQoMiwgTzApKSwKKworICBvay4KKworb21pdF9tYXBfdGVzdCgpIC0+CisgICUlIEluIHRoaXMgdGVzdCwgdGhlIGZpZWxkIHRoYXQgaXMgZGVsZXRlZCBpcyBhIG1hcC4KKyAgQSA9ICN0ZXN0MXtvbmUgPSAxLCB0d28gPSAyLCB0aHJlZSA9IDN9LAorICBCID0gI3Rlc3Q0e29uZSA9IDEsIHR3byA9IGRpY3Q6ZnJvbV9saXN0KFsgezIsIEF9IF0pfSwKKworICB7b2ssIFRyYW5zcG9ydH0gPSB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydDpuZXcoKSwKKyAge29rLCBQMH0gPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sOm5ldyhUcmFuc3BvcnQpLAorCisgIHtQMSwgb2t9ID0gdGhyaWZ0X3Byb3RvY29sOndyaXRlKFAwLCB7e3N0cnVjdCwge3RocmlmdF9vbWl0X3dpdGhfdHlwZXMsIGVsZW1lbnQoMSwgQil9fSwgQn0pLAorICB7X1AyLCB7b2ssIE8wfX0gPSB0aHJpZnRfcHJvdG9jb2w6cmVhZChQMSwge3N0cnVjdCwge3RocmlmdF9vbWl0X3dpdGhvdXRfdHlwZXMsIGVsZW1lbnQoMSwgQil9fSksCisgID9hc3NlcnRFcXVhbChlbGVtZW50KDIsIEIpLCBlbGVtZW50KDIsIE8wKSksCisKKyAgb2suCisKKy1lbmRpZi4gJSUgVEVTVApkaWZmIC0tZ2l0IGEvbGliL2VybC90ZXN0L3Rlc3RfcmVuZGVyZWRfZG91YmxlX2NvbnN0YW50cy5lcmwgYi9saWIvZXJsL3Rlc3QvdGVzdF9yZW5kZXJlZF9kb3VibGVfY29uc3RhbnRzLmVybApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2ZjZTgxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC90ZXN0L3Rlc3RfcmVuZGVyZWRfZG91YmxlX2NvbnN0YW50cy5lcmwKQEAgLTAsMCArMSw2OCBAQAorJSUKKyUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCislJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCislJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCislJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCislJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyUlCislJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorJSUKKyUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCislJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCislJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCislJSB1bmRlciB0aGUgTGljZW5zZS4KKyUlCisKKy1tb2R1bGUodGVzdF9yZW5kZXJlZF9kb3VibGVfY29uc3RhbnRzKS4KKworLWlmZGVmKFRFU1QpLgorLWluY2x1ZGVfbGliKCJldW5pdC9pbmNsdWRlL2V1bml0LmhybCIpLgorCistaW5jbHVkZSgiZ2VuLWVybC9kb3VibGVfY29uc3RhbnRzX3Rlc3RfY29uc3RhbnRzLmhybCIpLgorCistZGVmaW5lKEVQU0lMT04sIDAuMDAwMDAwMSkuCisKK3JlbmRlcmVkX2RvdWJsZV9jb25zdGFudHNfdGVzdCgpIC0+CisgID9hc3NlcnQoYWJzKDEuMCAtID9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0FTU0lHTkVEX1RPX0lOVF9DT05TVEFOVF9URVNUKSA9PCA/RVBTSUxPTiksCisgID9hc3NlcnQoYWJzKC0xMDAuMCAtID9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0lOVF9DT05TVEFOVF9URVNUKSA9PCA/RVBTSUxPTiksCisgID9hc3NlcnQoYWJzKDkyMjMzNzIwMzY4NTQ3NzU4MDcuMCAtID9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFU1RfSU5UX0NPTlNUQU5UX1RFU1QpID08ID9FUFNJTE9OKSwKKyAgP2Fzc2VydChhYnMoLTkyMjMzNzIwMzY4NTQ3NzU4MDcuMCAtID9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMRVNUX0lOVF9DT05TVEFOVF9URVNUKSA9PCA/RVBTSUxPTiksCisgID9hc3NlcnQoYWJzKDMuMTQxNTkyNjUzNTkgLSA/RE9VQkxFX0NPTlNUQU5UU19URVNUX0RPVUJMRV9BU1NJR05FRF9UT19ET1VCTEVfV0lUSF9NQU5ZX0RFQ0lNQUxTX1RFU1QpID08ID9FUFNJTE9OKSwKKyAgP2Fzc2VydChhYnMoMTAwMDAwMC4xIC0gP0RPVUJMRV9DT05TVEFOVFNfVEVTVF9ET1VCTEVfQVNTSUdORURfVE9fRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCkgPTwgP0VQU0lMT04pLAorICA/YXNzZXJ0KGFicygtMTAwMDAwMC4xIC0gP0RPVUJMRV9DT05TVEFOVFNfVEVTVF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCkgPTwgP0VQU0lMT04pLAorICA/YXNzZXJ0KGFicygxLjdlKzMwOCAtID9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0RPVUJMRV9URVNUKSA9PCA/RVBTSUxPTiksCisgID9hc3NlcnQoYWJzKDkyMjMzNzIwMzY4NTQ3NzU4MTYuNDMgLSA/RE9VQkxFX0NPTlNUQU5UU19URVNUX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNUKSA9PCA/RVBTSUxPTiksCisgID9hc3NlcnQoYWJzKC0xLjdlKzMwOCAtID9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMX0RPVUJMRV9URVNUKSA9PCA/RVBTSUxPTiksCisgID9hc3NlcnQoYWJzKC05MjIzMzcyMDM2ODU0Nzc1ODE2LjQzIC0gP0RPVUJMRV9DT05TVEFOVFNfVEVTVF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfQlVUX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QpID08ID9FUFNJTE9OKSwKKyAgP2Fzc2VydChpc19mbG9hdCg/RE9VQkxFX0NPTlNUQU5UU19URVNUX0RPVUJMRV9BU1NJR05FRF9UT19JTlRfQ09OU1RBTlRfVEVTVCkpLAorICA/YXNzZXJ0KGlzX2Zsb2F0KD9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0lOVF9DT05TVEFOVF9URVNUKSksCisgID9hc3NlcnQoaXNfZmxvYXQoP0RPVUJMRV9DT05TVEFOVFNfVEVTVF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VTVF9JTlRfQ09OU1RBTlRfVEVTVCkpLAorICA/YXNzZXJ0KGlzX2Zsb2F0KD9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMRVNUX0lOVF9DT05TVEFOVF9URVNUKSksCisgID9hc3NlcnQoaXNfZmxvYXQoP0RPVUJMRV9DT05TVEFOVFNfVEVTVF9ET1VCTEVfQVNTSUdORURfVE9fRE9VQkxFX1dJVEhfTUFOWV9ERUNJTUFMU19URVNUKSksCisgID9hc3NlcnQoaXNfZmxvYXQoP0RPVUJMRV9DT05TVEFOVFNfVEVTVF9ET1VCTEVfQVNTSUdORURfVE9fRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCkpLAorICA/YXNzZXJ0KGlzX2Zsb2F0KD9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QpKSwKKyAgP2Fzc2VydChpc19mbG9hdCg/RE9VQkxFX0NPTlNUQU5UU19URVNUX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9ET1VCTEVfVEVTVCkpLAorICA/YXNzZXJ0KGlzX2Zsb2F0KD9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QpKSwKKyAgP2Fzc2VydChpc19mbG9hdCg/RE9VQkxFX0NPTlNUQU5UU19URVNUX0RPVUJMRV9BU1NJR05FRF9UT19TTUFMTF9ET1VCTEVfVEVTVCkpLAorICA/YXNzZXJ0KGlzX2Zsb2F0KD9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0JVVF9MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNUKSkuCisKK3JlbmRlcmVkX2RvdWJsZV9saXN0X3Rlc3QoKSAtPgorICA/YXNzZXJ0RXF1YWwoMTIsIGxlbmd0aCg/RE9VQkxFX0NPTlNUQU5UU19URVNUX0RPVUJMRV9MSVNUX1RFU1QpKSwKKyAgP2Fzc2VydChhYnMoMS4wIC0gbGlzdHM6bnRoKDEsID9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0xJU1RfVEVTVCkpID08ID9FUFNJTE9OKSwKKyAgP2Fzc2VydChhYnMoLTEwMC4wIC0gbGlzdHM6bnRoKDIsID9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0xJU1RfVEVTVCkpID08ID9FUFNJTE9OKSwKKyAgP2Fzc2VydChhYnMoMTAwLjAgLSBsaXN0czpudGgoMywgP0RPVUJMRV9DT05TVEFOVFNfVEVTVF9ET1VCTEVfTElTVF9URVNUKSkgPTwgP0VQU0lMT04pLAorICA/YXNzZXJ0KGFicyg5MjIzMzcyMDM2ODU0Nzc1ODA3LjAgLSBsaXN0czpudGgoNCwgP0RPVUJMRV9DT05TVEFOVFNfVEVTVF9ET1VCTEVfTElTVF9URVNUKSkgPTwgP0VQU0lMT04pLAorICA/YXNzZXJ0KGFicygtOTIyMzM3MjAzNjg1NDc3NTgwNy4wIC0gbGlzdHM6bnRoKDUsID9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0xJU1RfVEVTVCkpID08ID9FUFNJTE9OKSwKKyAgP2Fzc2VydChhYnMoMy4xNDE1OTI2NTM1OSAtIGxpc3RzOm50aCg2LCA/RE9VQkxFX0NPTlNUQU5UU19URVNUX0RPVUJMRV9MSVNUX1RFU1QpKSA9PCA/RVBTSUxPTiksCisgID9hc3NlcnQoYWJzKDEwMDAwMDAuMSAtIGxpc3RzOm50aCg3LCA/RE9VQkxFX0NPTlNUQU5UU19URVNUX0RPVUJMRV9MSVNUX1RFU1QpKSA9PCA/RVBTSUxPTiksCisgID9hc3NlcnQoYWJzKC0xMDAwMDAwLjEgLSBsaXN0czpudGgoOCwgP0RPVUJMRV9DT05TVEFOVFNfVEVTVF9ET1VCTEVfTElTVF9URVNUKSkgPTwgP0VQU0lMT04pLAorICA/YXNzZXJ0KGFicygxLjdlKzMwOCAtIGxpc3RzOm50aCg5LCA/RE9VQkxFX0NPTlNUQU5UU19URVNUX0RPVUJMRV9MSVNUX1RFU1QpKSA9PCA/RVBTSUxPTiksCisgID9hc3NlcnQoYWJzKC0xLjdlKzMwOCAtIGxpc3RzOm50aCgxMCwgP0RPVUJMRV9DT05TVEFOVFNfVEVTVF9ET1VCTEVfTElTVF9URVNUKSkgPTwgP0VQU0lMT04pLAorICA/YXNzZXJ0KGFicyg5MjIzMzcyMDM2ODU0Nzc1ODE2LjQzIC0gbGlzdHM6bnRoKDExLCA/RE9VQkxFX0NPTlNUQU5UU19URVNUX0RPVUJMRV9MSVNUX1RFU1QpKSA9PCA/RVBTSUxPTiksCisgID9hc3NlcnQoYWJzKC05MjIzMzcyMDM2ODU0Nzc1ODE2LjQzIC0gbGlzdHM6bnRoKDEyLCA/RE9VQkxFX0NPTlNUQU5UU19URVNUX0RPVUJMRV9MSVNUX1RFU1QpKSA9PCA/RVBTSUxPTikuCisKKy1lbmRpZi4gJSUgVEVTVApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9lcmwvdGVzdC90ZXN0X3NlcnZlci5lcmwgYi9saWIvZXJsL3Rlc3QvdGVzdF9zZXJ2ZXIuZXJsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDE0NWQ2Li4wMDAwMDAwCi0tLSBhL2xpYi9lcmwvdGVzdC90ZXN0X3NlcnZlci5lcmwKKysrIC9kZXYvbnVsbApAQCAtMSwyMDQgKzAsMCBAQAotJSUKLSUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0lJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0lJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0lJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0lJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSUlCi0lJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotJSUKLSUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0lJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0lJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0lJSB1bmRlciB0aGUgTGljZW5zZS4KLSUlCi0KLS1tb2R1bGUodGVzdF9zZXJ2ZXIpLgotCi0tZXhwb3J0KFtnby8wLCBnby8xLCBzdGFydF9saW5rLzIsIGhhbmRsZV9mdW5jdGlvbi8yXSkuCi0KLS1pbmNsdWRlKCJnZW4tZXJsL3RocmlmdF90ZXN0X3R5cGVzLmhybCIpLgotCi0tcmVjb3JkKG9wdGlvbnMsIHtwb3J0ID0gOTA5MCwKLSAgICAgICAgICAgICAgICAgIHNlcnZlcl9vcHRzID0gW119KS4KLQotcGFyc2VfYXJncyhBcmdzKSAtPiBwYXJzZV9hcmdzKEFyZ3MsICNvcHRpb25ze30pLgotcGFyc2VfYXJncyhbXSwgT3B0cykgLT4gT3B0czsKLXBhcnNlX2FyZ3MoW0hlYWQgfCBSZXN0XSwgT3B0cykgLT4KLSAgICBOZXdPcHRzID0KLSAgICAgICAgY2FzZSBjYXRjaCBsaXN0X3RvX2ludGVnZXIoSGVhZCkgb2YKLSAgICAgICAgICAgIFBvcnQgd2hlbiBpc19pbnRlZ2VyKFBvcnQpIC0+Ci0gICAgICAgICAgICAgICAgT3B0cyNvcHRpb25ze3BvcnQgPSBQb3J0fTsKLSAgICAgICAgICAgIF9FbHNlIC0+Ci0gICAgICAgICAgICAgICAgY2FzZSBIZWFkIG9mCi0gICAgICAgICAgICAgICAgICAgICJmcmFtZWQiIC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBPcHRzI29wdGlvbnN7c2VydmVyX29wdHMgPSBbe2ZyYW1lZCwgdHJ1ZX0gfCBPcHRzI29wdGlvbnMuc2VydmVyX29wdHNdfTsKLSAgICAgICAgICAgICAgICAgICAgIiIgLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIE9wdHM7Ci0gICAgICAgICAgICAgICAgICAgIF9FbHNlIC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcmxhbmc6ZXJyb3Ioe2JhZF9hcmcsIEhlYWR9KQotICAgICAgICAgICAgICAgIGVuZAotICAgICAgICBlbmQsCi0gICAgcGFyc2VfYXJncyhSZXN0LCBOZXdPcHRzKS4KLQotZ28oKSAtPiBnbyhbXSkuCi1nbyhBcmdzKSAtPgotICAgICNvcHRpb25ze3BvcnQgPSBQb3J0LCBzZXJ2ZXJfb3B0cyA9IFNlcnZlck9wdHN9ID0gcGFyc2VfYXJncyhBcmdzKSwKLSAgICBzcGF3bihmdW4oKSAtPiBzdGFydF9saW5rKFBvcnQsIFNlcnZlck9wdHMpLCByZWNlaXZlIGFmdGVyIGluZmluaXR5IC0+IG9rIGVuZCBlbmQpLgotCi1zdGFydF9saW5rKFBvcnQsIFNlcnZlck9wdHMpIC0+Ci0gICAgdGhyaWZ0X3NvY2tldF9zZXJ2ZXI6c3RhcnQoW3toYW5kbGVyLCA/TU9EVUxFfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3NlcnZpY2UsIHRocmlmdFRlc3RfdGhyaWZ0fSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3BvcnQsIFBvcnR9XSArKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZlck9wdHMpLgotCi0KLWhhbmRsZV9mdW5jdGlvbih0ZXN0Vm9pZCwge30pIC0+Ci0gICAgaW86Zm9ybWF0KCJ0ZXN0Vm9pZH5uIiksCi0gICAgb2s7Ci0KLWhhbmRsZV9mdW5jdGlvbih0ZXN0U3RyaW5nLCB7U30pIHdoZW4gaXNfYmluYXJ5KFMpIC0+Ci0gICAgaW86Zm9ybWF0KCJ0ZXN0U3RyaW5nOiB+cH5uIiwgW1NdKSwKLSAgICB7cmVwbHksIFN9OwotCi1oYW5kbGVfZnVuY3Rpb24odGVzdEJ5dGUsIHtJOH0pIHdoZW4gaXNfaW50ZWdlcihJOCkgLT4KLSAgICBpbzpmb3JtYXQoInRlc3RCeXRlOiB+cH5uIiwgW0k4XSksCi0gICAge3JlcGx5LCBJOH07Ci0KLWhhbmRsZV9mdW5jdGlvbih0ZXN0STMyLCB7STMyfSkgd2hlbiBpc19pbnRlZ2VyKEkzMikgLT4KLSAgICBpbzpmb3JtYXQoInRlc3RJMzI6IH5wfm4iLCBbSTMyXSksCi0gICAge3JlcGx5LCBJMzJ9OwotCi1oYW5kbGVfZnVuY3Rpb24odGVzdEk2NCwge0k2NH0pIHdoZW4gaXNfaW50ZWdlcihJNjQpIC0+Ci0gICAgaW86Zm9ybWF0KCJ0ZXN0STY0OiB+cH5uIiwgW0k2NF0pLAotICAgIHtyZXBseSwgSTY0fTsKLQotaGFuZGxlX2Z1bmN0aW9uKHRlc3REb3VibGUsIHtEb3VibGV9KSB3aGVuIGlzX2Zsb2F0KERvdWJsZSkgLT4KLSAgICBpbzpmb3JtYXQoInRlc3REb3VibGU6IH5wfm4iLCBbRG91YmxlXSksCi0gICAge3JlcGx5LCBEb3VibGV9OwotCi1oYW5kbGVfZnVuY3Rpb24odGVzdFN0cnVjdCwKLSAgICAgICAgICAgICAgICB7U3RydWN0ID0gIydYdHJ1Y3Qne3N0cmluZ190aGluZyA9IFN0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVfdGhpbmcgPSBCeXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTMyX3RoaW5nID0gSTMyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTY0X3RoaW5nID0gSTY0fX0pCi13aGVuIGlzX2JpbmFyeShTdHJpbmcpLAotICAgICBpc19pbnRlZ2VyKEJ5dGUpLAotICAgICBpc19pbnRlZ2VyKEkzMiksCi0gICAgIGlzX2ludGVnZXIoSTY0KSAtPgotICAgIGlvOmZvcm1hdCgidGVzdFN0cnVjdDogfnB+biIsIFtTdHJ1Y3RdKSwKLSAgICB7cmVwbHksIFN0cnVjdH07Ci0KLWhhbmRsZV9mdW5jdGlvbih0ZXN0TmVzdCwKLSAgICAgICAgICAgICAgICB7TmVzdH0pIHdoZW4gaXNfcmVjb3JkKE5lc3QsICdYdHJ1Y3QyJyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX3JlY29yZChOZXN0IydYdHJ1Y3QyJy5zdHJ1Y3RfdGhpbmcsICdYdHJ1Y3QnKSAtPgotICAgIGlvOmZvcm1hdCgidGVzdE5lc3Q6IH5wfm4iLCBbTmVzdF0pLAotICAgIHtyZXBseSwgTmVzdH07Ci0KLWhhbmRsZV9mdW5jdGlvbih0ZXN0TWFwLCB7TWFwfSkgLT4KLSAgICBpbzpmb3JtYXQoInRlc3RNYXA6IH5wfm4iLCBbZGljdDp0b19saXN0KE1hcCldKSwKLSAgICB7cmVwbHksIE1hcH07Ci0KLWhhbmRsZV9mdW5jdGlvbih0ZXN0U2V0LCB7U2V0fSkgLT4KLSAgICB0cnVlID0gc2V0czppc19zZXQoU2V0KSwKLSAgICBpbzpmb3JtYXQoInRlc3RTZXQ6IH5wfm4iLCBbc2V0czp0b19saXN0KFNldCldKSwKLSAgICB7cmVwbHksIFNldH07Ci0KLWhhbmRsZV9mdW5jdGlvbih0ZXN0TGlzdCwge0xpc3R9KSB3aGVuIGlzX2xpc3QoTGlzdCkgLT4KLSAgICBpbzpmb3JtYXQoInRlc3RMaXN0OiB+cH5uIiwgW0xpc3RdKSwKLSAgICB7cmVwbHksIExpc3R9OwotCi1oYW5kbGVfZnVuY3Rpb24odGVzdEVudW0sIHtFbnVtfSkgd2hlbiBpc19pbnRlZ2VyKEVudW0pIC0+Ci0gICAgaW86Zm9ybWF0KCJ0ZXN0RW51bTogfnB+biIsIFtFbnVtXSksCi0gICAge3JlcGx5LCBFbnVtfTsKLQotaGFuZGxlX2Z1bmN0aW9uKHRlc3RUeXBlZGVmLCB7VXNlcklEfSkgd2hlbiBpc19pbnRlZ2VyKFVzZXJJRCkgLT4KLSAgICBpbzpmb3JtYXQoInRlc3RUeXBlZGVmOiB+cH5uIiwgW1VzZXJJRF0pLAotICAgIHtyZXBseSwgVXNlcklEfTsKLQotaGFuZGxlX2Z1bmN0aW9uKHRlc3RNYXBNYXAsIHtIZWxsb30pIC0+Ci0gICAgaW86Zm9ybWF0KCJ0ZXN0TWFwTWFwOiB+cH5uIiwgW0hlbGxvXSksCi0KLSAgICBQb3NMaXN0ID0gW3tJLCBJfSAgIHx8IEkgPC0gbGlzdHM6c2VxKDEsIDUpXSwKLSAgICBOZWdMaXN0ID0gW3stSSwgLUl9IHx8IEkgPC0gbGlzdHM6c2VxKDEsIDUpXSwKLQotICAgIE1hcE1hcCA9IGRpY3Q6ZnJvbV9saXN0KFt7NCwgIGRpY3Q6ZnJvbV9saXN0KFBvc0xpc3QpfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey00LCBkaWN0OmZyb21fbGlzdChOZWdMaXN0KX1dKSwKLSAgICB7cmVwbHksIE1hcE1hcH07Ci0KLWhhbmRsZV9mdW5jdGlvbih0ZXN0SW5zYW5pdHksIHtJbnNhbml0eX0pIHdoZW4gaXNfcmVjb3JkKEluc2FuaXR5LCAnSW5zYW5pdHknKSAtPgotICAgIEhlbGxvID0gIydYdHJ1Y3Qne3N0cmluZ190aGluZyA9IDw8IkhlbGxvMiI+PiwKLSAgICAgICAgICAgICAgICAgICAgYnl0ZV90aGluZyA9IDIsCi0gICAgICAgICAgICAgICAgICAgIGkzMl90aGluZyA9IDIsCi0gICAgICAgICAgICAgICAgICAgIGk2NF90aGluZyA9IDJ9LAotCi0gICAgR29vZGJ5ZSA9ICMnWHRydWN0J3tzdHJpbmdfdGhpbmcgPSA8PCJHb29kYnllNCI+PiwKLSAgICAgICAgICAgICAgICAgICAgICBieXRlX3RoaW5nID0gNCwKLSAgICAgICAgICAgICAgICAgICAgICBpMzJfdGhpbmcgPSA0LAotICAgICAgICAgICAgICAgICAgICAgIGk2NF90aGluZyA9IDR9LAotICAgIENyYXp5ID0gIydJbnNhbml0eSd7Ci0gICAgICB1c2VyTWFwID0gZGljdDpmcm9tX2xpc3QoW3s/VEhSSUZUX1RFU1RfTlVNQkVSWl9FSUdIVCwgOH1dKSwKLSAgICAgIHh0cnVjdHMgPSBbR29vZGJ5ZV0KLSAgICAgIH0sCi0KLSAgICBMb29uZXkgPSAjJ0luc2FuaXR5J3sKLSAgICAgIHVzZXJNYXAgPSBkaWN0OmZyb21fbGlzdChbez9USFJJRlRfVEVTVF9OVU1CRVJaX0ZJVkUsIDV9XSksCi0gICAgICB4dHJ1Y3RzID0gW0hlbGxvXQotICAgICAgfSwKLQotICAgIEZpcnN0TWFwID0gZGljdDpmcm9tX2xpc3QoW3s/VEhSSUZUX1RFU1RfTlVNQkVSWl9UV08sIENyYXp5fSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7P1RIUklGVF9URVNUX05VTUJFUlpfVEhSRUUsIENyYXp5fV0pLAotCi0gICAgU2Vjb25kTWFwID0gZGljdDpmcm9tX2xpc3QoW3s/VEhSSUZUX1RFU1RfTlVNQkVSWl9TSVgsIExvb25leX1dKSwKLQotICAgIEluc2FuZSA9IGRpY3Q6ZnJvbV9saXN0KFt7MSwgRmlyc3RNYXB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MiwgU2Vjb25kTWFwfV0pLAotCi0gICAgaW86Zm9ybWF0KCJSZXR1cm4gPSB+cH5uIiwgW0luc2FuZV0pLAotCi0gICAge3JlcGx5LCBJbnNhbmV9OwotCi1oYW5kbGVfZnVuY3Rpb24odGVzdE11bHRpLCBBcmdzID0ge0FyZzAsIEFyZzEsIEFyZzIsIF9BcmczLCBBcmc0LCBBcmc1fSkKLSAgd2hlbiBpc19pbnRlZ2VyKEFyZzApLAotICAgICAgIGlzX2ludGVnZXIoQXJnMSksCi0gICAgICAgaXNfaW50ZWdlcihBcmcyKSwKLSAgICAgICBpc19pbnRlZ2VyKEFyZzQpLAotICAgICAgIGlzX2ludGVnZXIoQXJnNSkgLT4KLQotICAgIGlvOmZvcm1hdCgidGVzdE11bHRpKH5wKX5uIiwgW0FyZ3NdKSwKLSAgICB7cmVwbHksICMnWHRydWN0J3tzdHJpbmdfdGhpbmcgPSA8PCJIZWxsbzIiPj4sCi0gICAgICAgICAgICAgICAgICAgIGJ5dGVfdGhpbmcgPSBBcmcwLAotICAgICAgICAgICAgICAgICAgICBpMzJfdGhpbmcgPSBBcmcxLAotICAgICAgICAgICAgICAgICAgICBpNjRfdGhpbmcgPSBBcmcyfX07Ci0KLWhhbmRsZV9mdW5jdGlvbih0ZXN0RXhjZXB0aW9uLCB7U3RyaW5nfSkgd2hlbiBpc19iaW5hcnkoU3RyaW5nKSAtPgotICAgIGlvOmZvcm1hdCgidGVzdEV4Y2VwdGlvbih+cCl+biIsIFtTdHJpbmddKSwKLSAgICBjYXNlIFN0cmluZyBvZgotICAgICAgICA8PCJYY2VwdGlvbiI+PiAtPgotICAgICAgICAgICAgdGhyb3coIydYY2VwdGlvbid7ZXJyb3JDb2RlID0gMTAwMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gU3RyaW5nfSk7Ci0gICAgICAgIF8gLT4KLSAgICAgICAgICAgIG9rCi0gICAgZW5kOwotCi1oYW5kbGVfZnVuY3Rpb24odGVzdE11bHRpRXhjZXB0aW9uLCB7QXJnMCwgQXJnMX0pIC0+Ci0gICAgaW86Zm9ybWF0KCJ0ZXN0TXVsdGlFeGNlcHRpb24ofnAsIH5wKX5uIiwgW0FyZzAsIEFyZzFdKSwKLSAgICBjYXNlIEFyZzAgb2YKLSAgICAgICAgPDwiWGNlcHRpb24iPj4gLT4KLSAgICAgICAgICAgIHRocm93KCMnWGNlcHRpb24ne2Vycm9yQ29kZSA9IDEwMDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSA8PCJUaGlzIGlzIGFuIFhjZXB0aW9uIj4+fSk7Ci0gICAgICAgIDw8IlhjZXB0aW9uMiI+PiAtPgotICAgICAgICAgICAgdGhyb3coIydYY2VwdGlvbjIne2Vycm9yQ29kZSA9IDIwMDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3RfdGhpbmcgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIydYdHJ1Y3Qne3N0cmluZ190aGluZyA9IDw8IlRoaXMgaXMgYW4gWGNlcHRpb24yIj4+fX0pOwotICAgICAgICBfIC0+Ci0gICAgICAgICAgICB7cmVwbHksICMnWHRydWN0J3tzdHJpbmdfdGhpbmcgPSBBcmcxfX0KLSAgICBlbmQ7Ci0KLWhhbmRsZV9mdW5jdGlvbih0ZXN0T25ld2F5LCB7U2Vjb25kc30pIC0+Ci0gICAgdGltZXI6c2xlZXAoMTAwMCAqIFNlY29uZHMpLAotICAgIG9rLgpkaWZmIC0tZ2l0IGEvbGliL2VybC90ZXN0L3Rlc3RfdGhyaWZ0XzMyMTQuZXJsIGIvbGliL2VybC90ZXN0L3Rlc3RfdGhyaWZ0XzMyMTQuZXJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmOTU0NGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3Rlc3QvdGVzdF90aHJpZnRfMzIxNC5lcmwKQEAgLTAsMCArMSw2MCBAQAorJSUKKyUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCislJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCislJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCislJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCislJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyUlCislJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorJSUKKyUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCislJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCislJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCislJSB1bmRlciB0aGUgTGljZW5zZS4KKyUlCisKKy1tb2R1bGUodGVzdF90aHJpZnRfMzIxNCkuCistY29tcGlsZShleHBvcnRfYWxsKS4KKworLWluY2x1ZGUoImdlbi1lcmwvdGhyaWZ0MzIxNF90eXBlcy5ocmwiKS4KKworLWlmZGVmKFRFU1QpLgorLWlmbmRlZihvdHAxNl9vcl9sZXNzKS4KKy1pbmNsdWRlX2xpYigiZXVuaXQvaW5jbHVkZS9ldW5pdC5ocmwiKS4KKworcmVjb3JkX2dlbmVyYXRpb25fdGVzdF8oKSAtPgorICBbCisgICAgeyJTdHJpbmdNYXAgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsnU3RyaW5nTWFwJywgX30sCisgICAgICAjJ1N0cmluZ01hcCd7ZGF0YT0jezUwID0+ICJmb28ifX0KKyAgICApfSwKKyAgICB7IlN0cmluZ01hcCByZWNvcmQgZGVmYXVsdHMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAgeydTdHJpbmdNYXAnLCAjezEgPT4gImEiLCAyID0+ICJiIn19LAorICAgICAgIydTdHJpbmdNYXAne30KKyAgICApfSwKKyAgICB7IlN0cmluZ01hcCByZWNvcmQgZGljdCBmcm9tIGxpc3QiLCA/X2Fzc2VydE5vdEVxdWFsKAorICAgICAgeydTdHJpbmdNYXAnLCBkaWN0OmZyb21fbGlzdChbezEsICJhIn0sIHsyLCAiYiJ9XSl9LAorICAgICAgIydTdHJpbmdNYXAne30KKyAgICApfSwKKyAgICB7IlN0cmluZ01hcCByZWNvcmQgbWFwIGZyb20gbGlzdCIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7J1N0cmluZ01hcCcsIG1hcHM6ZnJvbV9saXN0KFt7MSwgImEifSwgezIsICJiIn1dKX0sCisgICAgICAjJ1N0cmluZ01hcCd7fQorICAgICl9CisgIF0uCisKK3N0cnVjdF9pbmZvX3Rlc3RfKCkgLT4KKyAgWworICAgIHsiU3RyaW5nTWFwIGV4dGVuZGVkIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgdW5kZWZpbmVkLCB7bWFwLCBpMzIsIHN0cmluZ30sICdkYXRhJywgI3sxID0+ICJhIiwgMiA9PiAiYiJ9fQorICAgICAgXX0sCisgICAgICB0aHJpZnQzMjE0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgnU3RyaW5nTWFwJykKKyAgICApfQorICBdLgorCistZW5kaWYuCistZW5kaWYuCmRpZmYgLS1naXQgYS9saWIvZXJsL3Rlc3QvdGVzdF90aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0LmVybCBiL2xpYi9lcmwvdGVzdC90ZXN0X3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnQuZXJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1MTllODIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3Rlc3QvdGVzdF90aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0LmVybApAQCAtMCwwICsxLDM1OSBAQAorJSUKKyUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCislJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCislJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCislJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCislJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyUlCislJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorJSUKKyUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCislJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCislJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCislJSB1bmRlciB0aGUgTGljZW5zZS4KKyUlCisKKy1tb2R1bGUodGVzdF90aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0KS4KKy1pbmNsdWRlX2xpYigiZXVuaXQvaW5jbHVkZS9ldW5pdC5ocmwiKS4KKworCituZXcoVHJhbnNwb3J0KSAtPiB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0Om5ldyhUcmFuc3BvcnQpLgorCituZXdfdGVzdF8oKSAtPgorICBbCisgICAgeyJuZXcgYnVmZmVyZWQgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHtvaywge3RfdHJhbnNwb3J0LCB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0LCB7dF9idWZmZXJlZCwKKyAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCBbXX19LAorICAgICAgICBbXQorICAgICAgfX19LAorICAgICAgbmV3KHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgW119fSkKKyAgICApfQorICBdLgorCisKK3JlYWQoRnJhbWUsIEJ5dGVzKSAtPiB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0OnJlYWQoRnJhbWUsIEJ5dGVzKS4KKworcmVhZF90ZXN0XygpIC0+CisgIFsKKyAgICB7InJlYWQgemVybyBieXRlcyBmcm9tIGFuIGVtcHR5IGJ1ZmZlcmVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7CisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIHtvaywgPDw+Pn0KKyAgICAgIH0sCisgICAgICByZWFkKAorICAgICAgICB7dF9idWZmZXJlZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICAwCisgICAgICApCisgICAgKX0sCisgICAgeyJyZWFkIDEgYnl0ZSBmcm9tIGFuIGVtcHR5IGJ1ZmZlcmVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7Xywge29rLCA8PD4+fX0sCisgICAgICByZWFkKAorICAgICAgICB7dF9idWZmZXJlZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICAxCisgICAgICApCisgICAgKX0sCisgICAgeyJyZWFkIHplcm8gYnl0ZXMgZnJvbSBub25lbXB0eSBidWZmZXJlZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeworICAgICAgICB7dF9idWZmZXJlZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsCisgICAgICAgICAgICA8PCJoYWxsbyB3b3JsZCI+PgorICAgICAgICAgIH19LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIHtvaywgPDw+Pn0KKyAgICAgIH0sCisgICAgICByZWFkKAorICAgICAgICB7dF9idWZmZXJlZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsCisgICAgICAgICAgICA8PCJoYWxsbyB3b3JsZCI+PgorICAgICAgICAgIH19LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIDAKKyAgICAgICkKKyAgICApfSwKKyAgICB7InJlYWQgMSBieXRlIGZyb20gbm9uZW1wdHkgYnVmZmVyZWQgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsKKyAgICAgICAge3RfYnVmZmVyZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PCJhbGxvIHdvcmxkIj4+fX0sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAge29rLCA8PCJoIj4+fQorICAgICAgfSwKKyAgICAgIHJlYWQoCisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDwiaGFsbG8gd29ybGQiPj59fSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICAxCisgICAgICApCisgICAgKX0sCisgICAgeyJyZWFkIDEgYnl0ZSBmcm9tIG5vbmVtcHR5IGJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7CisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDwiYWxsbyB3b3JsZCI+Pn19LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIHtvaywgPDwiaCI+Pn0KKyAgICAgIH0sCisgICAgICByZWFkKAorICAgICAgICB7dF9idWZmZXJlZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8ImhhbGxvIHdvcmxkIj4+fX0sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAgMQorICAgICAgKQorICAgICl9LAorICAgIHsicmVhZCBhIHppbGxpb24gYnl0ZXMgZnJvbSBub25lbXB0eSBidWZmZXJlZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeworICAgICAgICB7dF9idWZmZXJlZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICB7b2ssIDw8ImhhbGxvIHdvcmxkIj4+fQorICAgICAgfSwKKyAgICAgIHJlYWQoCisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDwiaGFsbG8gd29ybGQiPj59fSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICA2NTUzNgorICAgICAgKQorICAgICl9CisgIF0uCisKKworcmVhZF9leGFjdChGcmFtZSwgQnl0ZXMpIC0+IHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnQ6cmVhZF9leGFjdChGcmFtZSwgQnl0ZXMpLgorCityZWFkX2V4YWN0X3Rlc3RfKCkgLT4KKyAgWworICAgIHsicmVhZCBleGFjdGx5IHplcm8gYnl0ZXMgZnJvbSBhbiBlbXB0eSBidWZmZXJlZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeworICAgICAgICB7dF9idWZmZXJlZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICB7b2ssIDw8Pj59CisgICAgICB9LAorICAgICAgcmVhZF9leGFjdCgKKyAgICAgICAge3RfYnVmZmVyZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAgMAorICAgICAgKQorICAgICl9LAorICAgIHsicmVhZCBleGFjdGx5IDEgYnl0ZSBmcm9tIGFuIGVtcHR5IGJ1ZmZlcmVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7Xywge2Vycm9yLCBlb2Z9fSwKKyAgICAgIHJlYWRfZXhhY3QoCisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIDEKKyAgICAgICkKKyAgICApfSwKKyAgICB7InJlYWQgZXhhY3RseSB6ZXJvIGJ5dGVzIGZyb20gbm9uZW1wdHkgYnVmZmVyZWQgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsKKyAgICAgICAge3RfYnVmZmVyZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PCJoYWxsbyB3b3JsZCI+Pn19LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIHtvaywgPDw+Pn0KKyAgICAgIH0sCisgICAgICByZWFkX2V4YWN0KAorICAgICAgICB7dF9idWZmZXJlZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8ImhhbGxvIHdvcmxkIj4+fX0sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAgMAorICAgICAgKQorICAgICl9LAorICAgIHsicmVhZCBleGFjdGx5IDEgYnl0ZSBmcm9tIG5vbmVtcHR5IGJ1ZmZlcmVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7CisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDwiYWxsbyB3b3JsZCI+Pn19LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIHtvaywgPDwiaCI+Pn0KKyAgICAgIH0sCisgICAgICByZWFkX2V4YWN0KAorICAgICAgICB7dF9idWZmZXJlZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsCisgICAgICAgICAgICA8PCJoYWxsbyB3b3JsZCI+PgorICAgICAgICAgIH19LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIDEKKyAgICAgICkKKyAgICApfSwKKyAgICB7InJlYWQgZXhhY3RseSAxIGJ5dGUgZnJvbSBub25lbXB0eSBidWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeworICAgICAgICB7dF9idWZmZXJlZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8ImFsbG8gd29ybGQiPj59fSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICB7b2ssIDw8ImgiPj59CisgICAgICB9LAorICAgICAgcmVhZF9leGFjdCgKKyAgICAgICAge3RfYnVmZmVyZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PCJoYWxsbyB3b3JsZCI+Pn19LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIDEKKyAgICAgICkKKyAgICApfSwKKyAgICB7InJlYWQgZXhhY3RseSBhIHppbGxpb24gYnl0ZXMgZnJvbSBub25lbXB0eSBidWZmZXJlZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeworICAgICAgICB7dF9idWZmZXJlZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8ImhhbGxvIHdvcmxkIj4+fX0sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAge2Vycm9yLCBlb2Z9CisgICAgICB9LAorICAgICAgcmVhZF9leGFjdCgKKyAgICAgICAge3RfYnVmZmVyZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLAorICAgICAgICAgICAgPDwiaGFsbG8gd29ybGQiPj4KKyAgICAgICAgICB9fSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICA2NTUzNgorICAgICAgKQorICAgICl9CisgIF0uCisKKword3JpdGUoRnJhbWVkLCBEYXRhKSAtPiB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0OndyaXRlKEZyYW1lZCwgRGF0YSkuCisKK3dyaXRlX3Rlc3RfKCkgLT4KKyAgWworICAgIHsid3JpdGUgZW1wdHkgbGlzdCB0byBlbXB0eSBidWZmZXJlZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeworICAgICAgICB7dF9idWZmZXJlZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICBbW10sIFtdXQorICAgICAgICB9LAorICAgICAgICBvaworICAgICAgfSwKKyAgICAgIHdyaXRlKAorICAgICAgICB7dF9idWZmZXJlZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICBbXQorICAgICAgKQorICAgICl9LAorICAgIHsid3JpdGUgZW1wdHkgbGlzdCB0byBub25lbXB0eSBidWZmZXJlZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeworICAgICAgICB7dF9idWZmZXJlZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICBbWyJoYWxsbyB3b3JsZCJdLCBbXV0KKyAgICAgICAgfSwKKyAgICAgICAgb2sKKyAgICAgIH0sCisgICAgICB3cml0ZSgKKyAgICAgICAge3RfYnVmZmVyZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgICAgWyJoYWxsbyB3b3JsZCJdCisgICAgICAgIH0sCisgICAgICAgIFtdCisgICAgICApCisgICAgKX0sCisgICAgeyJ3cml0ZSBlbXB0eSBiaW5hcnkgdG8gZW1wdHkgYnVmZmVyZWQgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsKKyAgICAgICAge3RfYnVmZmVyZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgICAgW1tdLCA8PD4+XQorICAgICAgICB9LAorICAgICAgICBvaworICAgICAgfSwKKyAgICAgIHdyaXRlKAorICAgICAgICB7dF9idWZmZXJlZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICA8PD4+CisgICAgICApCisgICAgKX0sCisgICAgeyJ3cml0ZSBlbXB0eSBiaW5hcnkgdG8gbm9uZW1wdHkgYnVmZmVyZWQgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsKKyAgICAgICAge3RfYnVmZmVyZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgICAgW1siaGFsbG8gd29ybGQiXSwgPDw+Pl0KKyAgICAgICAgfSwKKyAgICAgICAgb2sKKyAgICAgIH0sCisgICAgICB3cml0ZSgKKyAgICAgICAge3RfYnVmZmVyZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgICAgWyJoYWxsbyB3b3JsZCJdCisgICAgICAgIH0sCisgICAgICAgIDw8Pj4KKyAgICAgICkKKyAgICApfQorICBdLgorCisKK2ZsdXNoKFRyYW5zcG9ydCkgLT4gdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydDpmbHVzaChUcmFuc3BvcnQpLgorCitmbHVzaF90ZXN0XygpIC0+CisgIFsKKyAgICB7ImZsdXNoIGVtcHR5IGJ1ZmZlcmVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7e3RfYnVmZmVyZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAgb2sKKyAgICAgIH0sCisgICAgICBmbHVzaCh7dF9idWZmZXJlZCwKKyAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgIFtdCisgICAgICB9KQorICAgICl9LAorICAgIHsiZmx1c2ggbm9uZW1wdHkgYnVmZmVyZWQgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHt7dF9idWZmZXJlZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsCisgICAgICAgICAgICBbPDw+PiwgPDwiaGFsbG8gd29ybGQiPj5dCisgICAgICAgICAgfX0sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAgb2sKKyAgICAgIH0sCisgICAgICBmbHVzaCh7dF9idWZmZXJlZCwKKyAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgIDw8ImhhbGxvIHdvcmxkIj4+CisgICAgICB9KQorICAgICl9CisgIF0uCisKKworY2xvc2UoVHJhbnNwb3J0KSAtPiB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0OmNsb3NlKFRyYW5zcG9ydCkuCisKK2Nsb3NlX3Rlc3RfKCkgLT4KKyAgeyJjbG9zZSBidWZmZXJlZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgIHt7dF9idWZmZXJlZCwKKyAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgIFtdCisgICAgICB9LAorICAgICAgb2sKKyAgICB9LAorICAgIGNsb3NlKHt0X2J1ZmZlcmVkLAorICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICBbXQorICAgIH0pCisgICl9LgorCmRpZmYgLS1naXQgYS9saWIvZXJsL3Rlc3QvdGVzdF90aHJpZnRfY29tcGFjdF9wcm90b2NvbC5lcmwgYi9saWIvZXJsL3Rlc3QvdGVzdF90aHJpZnRfY29tcGFjdF9wcm90b2NvbC5lcmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRhNzhjNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9lcmwvdGVzdC90ZXN0X3RocmlmdF9jb21wYWN0X3Byb3RvY29sLmVybApAQCAtMCwwICsxLDIxOSBAQAorJSUKKyUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCislJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCislJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCislJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCislJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyUlCislJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorJSUKKyUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCislJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCislJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCislJSB1bmRlciB0aGUgTGljZW5zZS4KKyUlCisKKy1tb2R1bGUodGVzdF90aHJpZnRfY29tcGFjdF9wcm90b2NvbCkuCistaW5jbHVkZV9saWIoImV1bml0L2luY2x1ZGUvZXVuaXQuaHJsIikuCistaW5jbHVkZSgidGhyaWZ0X2NvbnN0YW50cy5ocmwiKS4KKy1pbmNsdWRlKCJ0aHJpZnRfcHJvdG9jb2wuaHJsIikuCisKKworbmV3KFRyYW5zcG9ydCkgLT4gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2w6bmV3KFRyYW5zcG9ydCkuCituZXcoKSAtPgorICB7b2ssIFRyYW5zcG9ydH0gPSB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydDpuZXcoKSwKKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2w6bmV3KFRyYW5zcG9ydCkuCisKK25ld190ZXN0KCkgLT4KKyAgbmV3KHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0Om5ldygpKS4KKword3JpdGUoVGhpcywgVmFsdWUpIC0+IHRocmlmdF9wcm90b2NvbDp3cml0ZShUaGlzLCBWYWx1ZSkuCityZWFkKFRoaXMsIFR5cGUpIC0+IHRocmlmdF9wcm90b2NvbDpyZWFkKFRoaXMsIFR5cGUpLgorCitzdHIoVGhpczAsIFZhbHVlMCkgLT4KKyAge1RoaXMxLCBva30gPSB3cml0ZShUaGlzMCwge3N0cmluZywgVmFsdWUwfSksCisgIHtUaGlzMiwge29rLCBWYWx1ZTF9fSA9IHJlYWQoVGhpczEsIHN0cmluZyksCisgID9hc3NlcnRFcXVhbChWYWx1ZTAsIGJpbmFyeV90b19saXN0KFZhbHVlMSkpLAorICB7VGhpczIsIG9rfS4KK3N0cmluZ190ZXN0KCkgLT4KKyAge29rLCBUaGlzMH0gPSBuZXcoKSwKKyAge1RoaXMxLCBva30gPSBzdHIoVGhpczAsICJhYWEiKSwKKyAge1RoaXMyLCBva30gPSBzdHIoVGhpczEsICIiKSwKKyAge1RoaXMyLCBva30uCisKK3JvdW5kX3RyaXAoVGhpczAsIFR5cGUsIFZhbHVlMCkgLT4KKyAge1RoaXMxLCBva30gPSB3cml0ZShUaGlzMCwge1R5cGUsIFZhbHVlMH0pLAorICB7VGhpczIsIHtvaywgVmFsdWUxfX0gPSByZWFkKFRoaXMxLCBUeXBlKSwKKyAgP2Fzc2VydEVxdWFsKFZhbHVlMCwgVmFsdWUxKSwKKyAge1RoaXMyLCBva30uCisKK2Jvb2xfdGVzdCgpIC0+CisgIHtvaywgVGhpczB9ID0gbmV3KCksCisgIHtUaGlzMSwgb2t9ID0gcm91bmRfdHJpcChUaGlzMCwgYm9vbCwgdHJ1ZSksCisgIHtUaGlzMiwgb2t9ID0gcm91bmRfdHJpcChUaGlzMSwgYm9vbCwgZmFsc2UpLAorICB7VGhpczIsIG9rfS4KKworYnl0ZShUaGlzMCwgVmFsdWUwKSAtPiByb3VuZF90cmlwKFRoaXMwLCBieXRlLCBWYWx1ZTApLgorYnl0ZV90ZXN0KCkgLT4KKyAge29rLCBUaGlzMH0gPSBuZXcoKSwKKyAge1RoaXMxLCBva30gPSBieXRlKFRoaXMwLCAwKSwKKyAge1RoaXMyLCBva30gPSBieXRlKFRoaXMxLCA0MiksCisgIHtUaGlzMywgb2t9ID0gYnl0ZShUaGlzMiwgLTEpLAorICB7VGhpczQsIG9rfSA9IGJ5dGUoVGhpczMsIC0xMjgpLAorICB7VGhpczQsIG9rfS4KKworaTE2KFRoaXMwLCBWYWx1ZTApIC0+IHJvdW5kX3RyaXAoVGhpczAsIGkxNiwgVmFsdWUwKS4KK2kxNl90ZXN0KCkgLT4KKyAge29rLCBUaGlzMH0gPSBuZXcoKSwKKyAge1RoaXMxLCBva30gPSBpMTYoVGhpczAsIDApLAorICB7VGhpczIsIG9rfSA9IGkxNihUaGlzMSwgNDIpLAorICB7VGhpczMsIG9rfSA9IGkxNihUaGlzMiwgMzAwMDApLAorICB7VGhpczQsIG9rfSA9IGkxNihUaGlzMywgLTEpLAorICB7VGhpczUsIG9rfSA9IGkxNihUaGlzNCwgLTEyOCksCisgIHtUaGlzNiwgb2t9ID0gaTE2KFRoaXM1LCAtMzAwMDApLAorICB7VGhpczYsIG9rfS4KKworaTMyKFRoaXMwLCBWYWx1ZTApIC0+IHJvdW5kX3RyaXAoVGhpczAsIGkzMiwgVmFsdWUwKS4KK2kzMl90ZXN0KCkgLT4KKyAge29rLCBUaGlzMH0gPSBuZXcoKSwKKyAge1RoaXMxLCBva30gPSBpMzIoVGhpczAsIDApLAorICB7VGhpczIsIG9rfSA9IGkzMihUaGlzMSwgNDIpLAorICB7VGhpczMsIG9rfSA9IGkzMihUaGlzMiwgMzAwMDApLAorICB7VGhpczQsIG9rfSA9IGkzMihUaGlzMywgMjAwMDAwMDAwMiksCisgIHtUaGlzNSwgb2t9ID0gaTMyKFRoaXM0LCAtMSksCisgIHtUaGlzNiwgb2t9ID0gaTMyKFRoaXM1LCAtMTI4KSwKKyAge1RoaXM3LCBva30gPSBpMzIoVGhpczYsIC0zMDAwMCksCisgIHtUaGlzOCwgb2t9ID0gaTMyKFRoaXM3LCAtMjAwMDAwMDAwMiksCisgIHtUaGlzOCwgb2t9LgorCitpNjQoVGhpczAsIFZhbHVlMCkgLT4gcm91bmRfdHJpcChUaGlzMCwgaTY0LCBWYWx1ZTApLgoraTY0X3Rlc3QoKSAtPgorICB7b2ssIFRoaXMwfSA9IG5ldygpLAorICB7VGhpczEsIG9rfSA9IGk2NChUaGlzMCwgMCksCisgIHtUaGlzMiwgb2t9ID0gaTY0KFRoaXMxLCA0MiksCisgIHtUaGlzMywgb2t9ID0gaTY0KFRoaXMyLCAzMDAwMCksCisgIHtUaGlzNCwgb2t9ID0gaTY0KFRoaXMzLCAyMDAwMDAwMDAyKSwKKyAge1RoaXM1LCBva30gPSBpNjQoVGhpczQsIDEwMDAwMDAwMDAwMDAwMDA2NCksCisgIHtUaGlzNiwgb2t9ID0gaTY0KFRoaXM1LCAtMSksCisgIHtUaGlzNywgb2t9ID0gaTY0KFRoaXM2LCAtMTI4KSwKKyAge1RoaXM4LCBva30gPSBpNjQoVGhpczcsIC0zMDAwMCksCisgIHtUaGlzOSwgb2t9ID0gaTY0KFRoaXM4LCAtMjAwMDAwMDAwMiksCisgIHtUaGlzMTAsIG9rfSA9IGk2NChUaGlzOSwgLTEwMDAwMDAwMDAwMDAwMDA2NCksCisgIHtUaGlzMTAsIG9rfS4KKworc3RydWN0X3Rlc3QoKSAtPgorICB7b2ssIFAwfSA9IG5ldygpLAorICB7UDEsIG9rfSA9IHdyaXRlKFAwLCAjcHJvdG9jb2xfbWVzc2FnZV9iZWdpbnsgbmFtZSA9ICJNZXNzYWdlMSIsIHR5cGUgPSA/dFR5cGVfSTgsIHNlcWlkID0gM30pLAorICB7UDIsIG9rfSA9IHdyaXRlKFAxLCAjcHJvdG9jb2xfc3RydWN0X2JlZ2lue30pLAorICB7UDMsIG9rfSA9IHdyaXRlKFAyLCAjcHJvdG9jb2xfZmllbGRfYmVnaW57IG5hbWUgPSAiZmllbGQxIiwgdHlwZSA9ID90VHlwZV9JOCwgaWQgPSAxfSksCisgIHtQNCwgb2t9ID0gd3JpdGUoUDMsIHtieXRlLCA0Mn0pLAorICB7UDUsIG9rfSA9IHdyaXRlKFA0LCBmaWVsZF9lbmQpLAorICB7UDYsIG9rfSA9IHdyaXRlKFA1LCAjcHJvdG9jb2xfZmllbGRfYmVnaW57IG5hbWUgPSAiZmllbGQyIiwgdHlwZSA9ID90VHlwZV9JOCwgaWQgPSAxNH0pLAorICB7UDcsIG9rfSA9IHdyaXRlKFA2LCB7Ynl0ZSwgM30pLAorICB7UDgsIG9rfSA9IHdyaXRlKFA3LCBmaWVsZF9lbmQpLAorICB7UDksIG9rfSA9IHdyaXRlKFA4LCAjcHJvdG9jb2xfZmllbGRfYmVnaW57IG5hbWUgPSAiZmllbGQzIiwgdHlwZSA9ID90VHlwZV9JOCwgaWQgPSA0Mn0pLAorICB7UDEwLCBva30gPSB3cml0ZShQOSwge2J5dGUsIDh9KSwKKyAge1AxMSwgb2t9ID0gd3JpdGUoUDEwLCBmaWVsZF9lbmQpLAorICB7UDEyLCBva30gPSB3cml0ZShQMTEsIGZpZWxkX3N0b3ApLAorICB7UDEzLCBva30gPSB3cml0ZShQMTIsIHN0cnVjdF9lbmQpLAorICB7UDE0LCBva30gPSB3cml0ZShQMTMsIG1lc3NhZ2VfZW5kKSwKKworICB7UDE1LCAjcHJvdG9jb2xfbWVzc2FnZV9iZWdpbnsgbmFtZSA9ICJNZXNzYWdlMSIsIHR5cGUgPSA/dFR5cGVfSTgsIHNlcWlkID0gM319ID0gcmVhZChQMTQsIG1lc3NhZ2VfYmVnaW4pLAorICB7UDE2LCBva30gPSByZWFkKFAxNSwgc3RydWN0X2JlZ2luKSwKKyAge1AxNywgI3Byb3RvY29sX2ZpZWxkX2JlZ2lueyB0eXBlID0gP3RUeXBlX0k4LCBpZCA9IDEgfX0gPSByZWFkKFAxNiwgZmllbGRfYmVnaW4pLAorICB7UDE4LCB7b2ssIDQyfX0gPSByZWFkKFAxNywgYnl0ZSksCisgIHtQMTksIG9rfSA9IHJlYWQoUDE4LCBmaWVsZF9lbmQpLAorICB7UDIwLCAjcHJvdG9jb2xfZmllbGRfYmVnaW57IHR5cGUgPSA/dFR5cGVfSTgsIGlkID0gMTQgfX0gPSByZWFkKFAxOSwgZmllbGRfYmVnaW4pLAorICB7UDIxLCB7b2ssIDN9fSA9IHJlYWQoUDIwLCBieXRlKSwKKyAge1AyMiwgb2t9ID0gcmVhZChQMjEsIGZpZWxkX2VuZCksCisgIHtQMjMsICNwcm90b2NvbF9maWVsZF9iZWdpbnsgdHlwZSA9ID90VHlwZV9JOCwgaWQgPSA0MiB9fSA9IHJlYWQoUDIyLCBmaWVsZF9iZWdpbiksCisgIHtQMjQsIHtvaywgOH19ID0gcmVhZChQMjMsIGJ5dGUpLAorICB7UDI1LCBva30gPSByZWFkKFAyNCwgZmllbGRfZW5kKSwKKyAge1AyNiwgI3Byb3RvY29sX2ZpZWxkX2JlZ2lueyB0eXBlID0gP3RUeXBlX1NUT1B9fSA9IHJlYWQoUDI1LCBmaWVsZF9iZWdpbiksCisgIHtQMjcsIG9rfSA9IHJlYWQoUDI2LCBzdHJ1Y3RfZW5kKSwKKyAge1AyOCwgb2t9ID0gcmVhZChQMjcsIG1lc3NhZ2VfZW5kKSwKKyAge1AyOCwgb2t9LgorCitib29sX2ZpZWxkX3Rlc3QoKSAtPgorICB7b2ssIFAwfSA9IG5ldygpLAorICB7UDEsIG9rfSA9IHdyaXRlKFAwLCAjcHJvdG9jb2xfbWVzc2FnZV9iZWdpbnsgbmFtZSA9ICJNZXNzYWdlMSIsIHR5cGUgPSA/dFR5cGVfSTgsIHNlcWlkID0gM30pLAorICB7UDIsIG9rfSA9IHdyaXRlKFAxLCAjcHJvdG9jb2xfc3RydWN0X2JlZ2lue30pLAorICB7UDMsIG9rfSA9IHdyaXRlKFAyLCAjcHJvdG9jb2xfZmllbGRfYmVnaW57IG5hbWUgPSAiZmllbGQxIiwgdHlwZSA9ID90VHlwZV9CT09MLCBpZCA9IDF9KSwKKyAge1A0LCBva30gPSB3cml0ZShQMywge2Jvb2wsIHRydWV9KSwKKyAge1A1LCBva30gPSB3cml0ZShQNCwgZmllbGRfZW5kKSwKKyAge1A2LCBva30gPSB3cml0ZShQNSwgI3Byb3RvY29sX2ZpZWxkX2JlZ2lueyBuYW1lID0gImZpZWxkMiIsIHR5cGUgPSA/dFR5cGVfQk9PTCwgaWQgPSAxNH0pLAorICB7UDcsIG9rfSA9IHdyaXRlKFA2LCB7Ym9vbCwgZmFsc2V9KSwKKyAge1A4LCBva30gPSB3cml0ZShQNywgZmllbGRfZW5kKSwKKyAge1A5LCBva30gPSB3cml0ZShQOCwgI3Byb3RvY29sX2ZpZWxkX2JlZ2lueyBuYW1lID0gImZpZWxkMyIsIHR5cGUgPSA/dFR5cGVfQk9PTCwgaWQgPSA0Mn0pLAorICB7UDEwLCBva30gPSB3cml0ZShQOSwge2Jvb2wsIHRydWV9KSwKKyAge1AxMSwgb2t9ID0gd3JpdGUoUDEwLCBmaWVsZF9lbmQpLAorICB7UDEyLCBva30gPSB3cml0ZShQMTEsIGZpZWxkX3N0b3ApLAorICB7UDEzLCBva30gPSB3cml0ZShQMTIsIHN0cnVjdF9lbmQpLAorICB7UDE0LCBva30gPSB3cml0ZShQMTMsIG1lc3NhZ2VfZW5kKSwKKworICB7UDE1LCAjcHJvdG9jb2xfbWVzc2FnZV9iZWdpbnsgbmFtZSA9ICJNZXNzYWdlMSIsIHR5cGUgPSA/dFR5cGVfSTgsIHNlcWlkID0gM319ID0gcmVhZChQMTQsIG1lc3NhZ2VfYmVnaW4pLAorICB7UDE2LCBva30gPSByZWFkKFAxNSwgc3RydWN0X2JlZ2luKSwKKyAge1AxNywgI3Byb3RvY29sX2ZpZWxkX2JlZ2lueyB0eXBlID0gP3RUeXBlX0JPT0wsIGlkID0gMSB9fSA9IHJlYWQoUDE2LCBmaWVsZF9iZWdpbiksCisgIHtQMTgsIHtvaywgdHJ1ZX19ID0gcmVhZChQMTcsIGJvb2wpLAorICB7UDE5LCBva30gPSByZWFkKFAxOCwgZmllbGRfZW5kKSwKKyAge1AyMCwgI3Byb3RvY29sX2ZpZWxkX2JlZ2lueyB0eXBlID0gP3RUeXBlX0JPT0wsIGlkID0gMTQgfX0gPSByZWFkKFAxOSwgZmllbGRfYmVnaW4pLAorICB7UDIxLCB7b2ssIGZhbHNlfX0gPSByZWFkKFAyMCwgYm9vbCksCisgIHtQMjIsIG9rfSA9IHJlYWQoUDIxLCBmaWVsZF9lbmQpLAorICB7UDIzLCAjcHJvdG9jb2xfZmllbGRfYmVnaW57IHR5cGUgPSA/dFR5cGVfQk9PTCwgaWQgPSA0MiB9fSA9IHJlYWQoUDIyLCBmaWVsZF9iZWdpbiksCisgIHtQMjQsIHtvaywgdHJ1ZX19ID0gcmVhZChQMjMsIGJvb2wpLAorICB7UDI1LCBva30gPSByZWFkKFAyNCwgZmllbGRfZW5kKSwKKyAge1AyNiwgI3Byb3RvY29sX2ZpZWxkX2JlZ2lueyB0eXBlID0gP3RUeXBlX1NUT1B9fSA9IHJlYWQoUDI1LCBmaWVsZF9iZWdpbiksCisgIHtQMjcsIG9rfSA9IHJlYWQoUDI2LCBzdHJ1Y3RfZW5kKSwKKyAge1AyOCwgb2t9ID0gcmVhZChQMjcsIG1lc3NhZ2VfZW5kKSwKKyAge1AyOCwgb2t9LgorCituZXN0aW5nX3Rlc3QoKSAtPgorICB7b2ssIFAwfSA9IG5ldygpLAorICB7UDEsIG9rfSA9IHdyaXRlKFAwLCAjcHJvdG9jb2xfbWVzc2FnZV9iZWdpbnsgbmFtZSA9ICJNZXNzYWdlMSIsIHR5cGUgPSA/dFR5cGVfSTgsIHNlcWlkID0gM30pLAorICB7UDIsIG9rfSA9IHdyaXRlKFAxLCAjcHJvdG9jb2xfc3RydWN0X2JlZ2lue30pLAorICB7UDMsIG9rfSA9IHdyaXRlKFAyLCAjcHJvdG9jb2xfZmllbGRfYmVnaW57IG5hbWUgPSAiZmllbGQxIiwgdHlwZSA9ID90VHlwZV9CT09MLCBpZCA9IDE0fSksCisgIHtQNCwgb2t9ID0gd3JpdGUoUDMsIHtib29sLCB0cnVlfSksCisgIHtQNSwgb2t9ID0gd3JpdGUoUDQsIGZpZWxkX2VuZCksCisKKyAge1A2LCBva30gPSB3cml0ZShQNSwgI3Byb3RvY29sX2ZpZWxkX2JlZ2lueyBuYW1lID0gImZpZWxkMiIsIHR5cGUgPSA/dFR5cGVfU1RSVUNULCBpZCA9IDI4fSksCisgIHtQNywgb2t9ID0gd3JpdGUoUDYsICNwcm90b2NvbF9zdHJ1Y3RfYmVnaW57fSksCisgIHtQOCwgb2t9ID0gd3JpdGUoUDcsICNwcm90b2NvbF9maWVsZF9iZWdpbnsgbmFtZSA9ICJmaWVsZDJfMSIsIHR5cGUgPSA/dFR5cGVfQk9PTCwgaWQgPSAzMDAwMH0pLAorICB7UDksIG9rfSA9IHdyaXRlKFA4LCB7Ym9vbCwgZmFsc2V9KSwKKyAge1AxMCwgb2t9ID0gd3JpdGUoUDksIGZpZWxkX2VuZCksCisgIHtQMTEsIG9rfSA9IHdyaXRlKFAxMCwgZmllbGRfc3RvcCksCisgIHtQMTIsIG9rfSA9IHdyaXRlKFAxMSwgc3RydWN0X2VuZCksCisgIHtQMTMsIG9rfSA9IHdyaXRlKFAxMiwgZmllbGRfZW5kKSwKKworICB7UDE0LCBva30gPSB3cml0ZShQMTMsICNwcm90b2NvbF9maWVsZF9iZWdpbnsgbmFtZSA9ICJmaWVsZDMiLCB0eXBlID0gP3RUeXBlX0JPT0wsIGlkID0gNDJ9KSwKKyAge1AxNSwgb2t9ID0gd3JpdGUoUDE0LCB7Ym9vbCwgdHJ1ZX0pLAorICB7UDE2LCBva30gPSB3cml0ZShQMTUsIGZpZWxkX2VuZCksCisgIHtQMTcsIG9rfSA9IHdyaXRlKFAxNiwgZmllbGRfc3RvcCksCisgIHtQMTgsIG9rfSA9IHdyaXRlKFAxNywgc3RydWN0X2VuZCksCisgIHtQMTksIG9rfSA9IHdyaXRlKFAxOCwgbWVzc2FnZV9lbmQpLAorCisgIHtQMjAsICNwcm90b2NvbF9tZXNzYWdlX2JlZ2lueyBuYW1lID0gIk1lc3NhZ2UxIiwgdHlwZSA9ID90VHlwZV9JOCwgc2VxaWQgPSAzfX0gPSByZWFkKFAxOSwgbWVzc2FnZV9iZWdpbiksCisgIHtQMjEsIG9rfSA9IHJlYWQoUDIwLCBzdHJ1Y3RfYmVnaW4pLAorICB7UDIyLCAjcHJvdG9jb2xfZmllbGRfYmVnaW57IHR5cGUgPSA/dFR5cGVfQk9PTCwgaWQgPSAxNCB9fSA9IHJlYWQoUDIxLCBmaWVsZF9iZWdpbiksCisgIHtQMjMsIHtvaywgdHJ1ZX19ID0gcmVhZChQMjIsIGJvb2wpLAorICB7UDI0LCBva30gPSByZWFkKFAyMywgZmllbGRfZW5kKSwKKworICB7UDI1LCAjcHJvdG9jb2xfZmllbGRfYmVnaW57IHR5cGUgPSA/dFR5cGVfU1RSVUNULCBpZCA9IDI4IH19ID0gcmVhZChQMjQsIGZpZWxkX2JlZ2luKSwKKyAge1AyNiwgb2t9ID0gcmVhZChQMjUsIHN0cnVjdF9iZWdpbiksCisgIHtQMjcsICNwcm90b2NvbF9maWVsZF9iZWdpbnsgdHlwZSA9ID90VHlwZV9CT09MLCBpZCA9IDMwMDAwIH19ID0gcmVhZChQMjYsIGZpZWxkX2JlZ2luKSwKKyAge1AyOCwge29rLCBmYWxzZX19ID0gcmVhZChQMjcsIGJvb2wpLAorICB7UDI5LCBva30gPSByZWFkKFAyOCwgZmllbGRfZW5kKSwKKyAge1AzMCwgI3Byb3RvY29sX2ZpZWxkX2JlZ2lueyB0eXBlID0gP3RUeXBlX1NUT1AgfX0gPSByZWFkKFAyOSwgZmllbGRfYmVnaW4pLAorICB7UDMxLCBva30gPSByZWFkKFAzMCwgc3RydWN0X2VuZCksCisgIHtQMzIsIG9rfSA9IHJlYWQoUDMxLCBmaWVsZF9lbmQpLAorCisgIHtQMzMsICNwcm90b2NvbF9maWVsZF9iZWdpbnsgdHlwZSA9ID90VHlwZV9CT09MLCBpZCA9IDQyIH19ID0gcmVhZChQMzIsIGZpZWxkX2JlZ2luKSwKKyAge1AzNCwge29rLCB0cnVlfX0gPSByZWFkKFAzMywgYm9vbCksCisgIHtQMzUsIG9rfSA9IHJlYWQoUDM0LCBmaWVsZF9lbmQpLAorICB7UDM2LCAjcHJvdG9jb2xfZmllbGRfYmVnaW57IHR5cGUgPSA/dFR5cGVfU1RPUCB9fSA9IHJlYWQoUDM1LCBmaWVsZF9iZWdpbiksCisgIHtQMzcsIG9rfSA9IHJlYWQoUDM2LCBzdHJ1Y3RfZW5kKSwKKyAge1AzOCwgb2t9ID0gcmVhZChQMzcsIG1lc3NhZ2VfZW5kKSwKKyAge1AzOCwgb2t9LgpkaWZmIC0tZ2l0IGEvbGliL2VybC90ZXN0L3Rlc3RfdGhyaWZ0X2ZpbGVfdHJhbnNwb3J0LmVybCBiL2xpYi9lcmwvdGVzdC90ZXN0X3RocmlmdF9maWxlX3RyYW5zcG9ydC5lcmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U1YzFkMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9lcmwvdGVzdC90ZXN0X3RocmlmdF9maWxlX3RyYW5zcG9ydC5lcmwKQEAgLTAsMCArMSwyMTMgQEAKKyUlCislJSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCislJSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorJSUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyUlIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorJSUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorJSUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorJSUgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CislJQorJSUgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyUlCislJSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCislJSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorJSUgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCislJSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorJSUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworJSUgdW5kZXIgdGhlIExpY2Vuc2UuCislJQorCistbW9kdWxlKHRlc3RfdGhyaWZ0X2ZpbGVfdHJhbnNwb3J0KS4KKy1pbmNsdWRlX2xpYigiZXVuaXQvaW5jbHVkZS9ldW5pdC5ocmwiKS4KKworCituZXcoRmlsZSkgLT4gdGhyaWZ0X2ZpbGVfdHJhbnNwb3J0Om5ldyhGaWxlKS4KK25ldyhGaWxlLCBPcHRzKSAtPiB0aHJpZnRfZmlsZV90cmFuc3BvcnQ6bmV3KEZpbGUsIE9wdHMpLgorCituZXdfdGVzdF8oKSAtPgorICBbCisgICAgeyJuZXcgZmlsZSIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7b2ssIHtfLCB0aHJpZnRfZmlsZV90cmFuc3BvcnQsIHt0X2ZpbGUsIGFfZmFrZV9maWxlLCB0cnVlLCB3cml0ZX19fSwKKyAgICAgIG5ldyhhX2Zha2VfZmlsZSkKKyAgICApfSwKKyAgICB7Im5ldyBmaWxlIGluIHJlYWQgbW9kZSIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7b2ssIHtfLCB0aHJpZnRfZmlsZV90cmFuc3BvcnQsIHt0X2ZpbGUsIGFfZmFrZV9maWxlLCB0cnVlLCByZWFkfX19LAorICAgICAgbmV3KGFfZmFrZV9maWxlLCBbe21vZGUsIHJlYWR9XSkKKyAgICApfSwKKyAgICB7Im5ldyBmaWxlIGluIHdyaXRlIG1vZGUiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge29rLCB7XywgdGhyaWZ0X2ZpbGVfdHJhbnNwb3J0LCB7dF9maWxlLCBhX2Zha2VfZmlsZSwgdHJ1ZSwgd3JpdGV9fX0sCisgICAgICBuZXcoYV9mYWtlX2ZpbGUsIFt7bW9kZSwgd3JpdGV9XSkKKyAgICApfSwKKyAgICB7Im5ldyBmaWxlIGluIHNob3VsZF9jbG9zZSB0cnVlIG1vZGUiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge29rLCB7XywgdGhyaWZ0X2ZpbGVfdHJhbnNwb3J0LCB7dF9maWxlLCBhX2Zha2VfZmlsZSwgdHJ1ZSwgd3JpdGV9fX0sCisgICAgICBuZXcoYV9mYWtlX2ZpbGUsIFt7c2hvdWxkX2Nsb3NlLCB0cnVlfV0pCisgICAgKX0sCisgICAgeyJuZXcgZmlsZSBpbiBzaG91bGRfY2xvc2UgZmFsc2UgbW9kZSIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7b2ssIHtfLCB0aHJpZnRfZmlsZV90cmFuc3BvcnQsIHt0X2ZpbGUsIGFfZmFrZV9maWxlLCBmYWxzZSwgd3JpdGV9fX0sCisgICAgICBuZXcoYV9mYWtlX2ZpbGUsIFt7c2hvdWxkX2Nsb3NlLCBmYWxzZX1dKQorICAgICl9CisgIF0uCisKKworcmVhZChGaWxlLCBCeXRlcykgLT4gdGhyaWZ0X2ZpbGVfdHJhbnNwb3J0OnJlYWQoRmlsZSwgQnl0ZXMpLgorCityZWFkX3Rlc3RfKCkgLT4KKyAge3NldHVwLAorICAgIGZ1bigpIC0+CisgICAgICBtZWNrOm5ldyhmaWxlLCBbdW5zdGljaywgcGFzc3Rocm91Z2hdKSwKKyAgICAgIG1lY2s6ZXhwZWN0KGZpbGUsIHJlYWQsIGZ1bihCaW4sIE4pIC0+CisgICAgICAgIHtSZXN1bHQsIF99ID0gc3BsaXRfYmluYXJ5KEJpbiwgbWluKGlvbGlzdF9zaXplKEJpbiksIE4pKSwKKyAgICAgICAge29rLCBSZXN1bHR9CisgICAgICBlbmQpCisgICAgZW5kLAorICAgIGZ1bihfKSAtPiBtZWNrOnVubG9hZChmaWxlKSBlbmQsCisgICAgWworICAgICAgeyJyZWFkIHplcm8gYnl0ZXMgZnJvbSBlbXB0eSBmaWxlIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge18sIHtvaywgPDw+Pn19LAorICAgICAgICByZWFkKHt0X2ZpbGUsIDw8Pj4sIHRydWUsIHJlYWR9LCAwKQorICAgICAgKX0sCisgICAgICB7InJlYWQgMSBieXRlIGZyb20gZW1wdHkgZmlsZSIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHtfLCB7b2ssIDw8Pj59fSwKKyAgICAgICAgcmVhZCh7dF9maWxlLCA8PD4+LCB0cnVlLCByZWFkfSwgMSkKKyAgICAgICl9LAorICAgICAgeyJyZWFkIHplcm8gYnl0ZXMgZnJvbSBub25lbXB0eSBmaWxlIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge18sIHtvaywgPDw+Pn19LAorICAgICAgICByZWFkKHt0X2ZpbGUsIDw8ImhhbGxvIHdvcmxkIj4+LCB0cnVlLCByZWFkfSwgMCkKKyAgICAgICl9LAorICAgICAgeyJyZWFkIDEgYnl0ZSBmcm9tIG5vbmVtcHR5IGZpbGUiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7Xywge29rLCA8PCJoIj4+fX0sCisgICAgICAgIHJlYWQoe3RfZmlsZSwgPDwiaGFsbG8gd29ybGQiPj4sIHRydWUsIHJlYWR9LCAxKQorICAgICAgKX0sCisgICAgICB7InJlYWQgYSB6aWxsaW9uIGJ5dGVzIGZyb20gbm9uZW1wdHkgZmlsZSIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHtfLCB7b2ssIDw8ImhhbGxvIHdvcmxkIj4+fX0sCisgICAgICAgIHJlYWQoe3RfZmlsZSwgPDwiaGFsbG8gd29ybGQiPj4sIHRydWUsIHJlYWR9LCA2NTUzNikKKyAgICAgICl9LAorICAgICAgeyJyZWFkIDAgYnl0ZSBmcm9tIGZpbGUgaW4gd3JpdGUgbW9kZSIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHtfLCB7ZXJyb3IsIHdyaXRlX21vZGV9fSwKKyAgICAgICAgcmVhZCh7dF9maWxlLCA8PD4+LCB0cnVlLCB3cml0ZX0sIDApCisgICAgICApfSwKKyAgICAgIHsicmVhZCAxIGJ5dGUgZnJvbSBmaWxlIGluIHdyaXRlIG1vZGUiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7Xywge2Vycm9yLCB3cml0ZV9tb2RlfX0sCisgICAgICAgIHJlYWQoe3RfZmlsZSwgPDw+PiwgdHJ1ZSwgd3JpdGV9LCAxKQorICAgICAgKX0KKyAgICBdCisgIH0uCisKKworcmVhZF9leGFjdChGaWxlLCBCeXRlcykgLT4gdGhyaWZ0X2ZpbGVfdHJhbnNwb3J0OnJlYWRfZXhhY3QoRmlsZSwgQnl0ZXMpLgorCityZWFkX2V4YWN0X3Rlc3RfKCkgLT4KKyAge3NldHVwLAorICAgIGZ1bigpIC0+CisgICAgICBtZWNrOm5ldyhmaWxlLCBbdW5zdGljaywgcGFzc3Rocm91Z2hdKSwKKyAgICAgIG1lY2s6ZXhwZWN0KGZpbGUsIHJlYWQsIGZ1bihCaW4sIE4pIC0+CisgICAgICAgIHtSZXN1bHQsIF99ID0gc3BsaXRfYmluYXJ5KEJpbiwgbWluKGlvbGlzdF9zaXplKEJpbiksIE4pKSwKKyAgICAgICAge29rLCBSZXN1bHR9CisgICAgICBlbmQpCisgICAgZW5kLAorICAgIGZ1bihfKSAtPiBtZWNrOnVubG9hZChmaWxlKSBlbmQsCisgICAgWworICAgICAgeyJyZWFkIGV4YWN0bHkgemVybyBieXRlcyBmcm9tIGVtcHR5IGZpbGUiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7Xywge29rLCA8PD4+fX0sCisgICAgICAgIHJlYWRfZXhhY3Qoe3RfZmlsZSwgPDw+PiwgdHJ1ZSwgcmVhZH0sIDApCisgICAgICApfSwKKyAgICAgIHsicmVhZCBleGFjdGx5IDEgYnl0ZSBmcm9tIGVtcHR5IGZpbGUiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7Xywge2Vycm9yLCBlb2Z9fSwKKyAgICAgICAgcmVhZF9leGFjdCh7dF9maWxlLCA8PD4+LCB0cnVlLCByZWFkfSwgMSkKKyAgICAgICl9LAorICAgICAgeyJyZWFkIGV4YWN0bHkgemVybyBieXRlcyBmcm9tIG5vbmVtcHR5IGZpbGUiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7Xywge29rLCA8PD4+fX0sCisgICAgICAgIHJlYWRfZXhhY3Qoe3RfZmlsZSwgPDwiaGFsbG8gd29ybGQiPj4sIHRydWUsIHJlYWR9LCAwKQorICAgICAgKX0sCisgICAgICB7InJlYWQgZXhhY3RseSAxIGJ5dGUgZnJvbSBub25lbXB0eSBmaWxlIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge18sIHtvaywgPDwiaCI+Pn19LAorICAgICAgICByZWFkX2V4YWN0KHt0X2ZpbGUsIDw8ImhhbGxvIHdvcmxkIj4+LCB0cnVlLCByZWFkfSwgMSkKKyAgICAgICl9LAorICAgICAgeyJyZWFkIGV4YWN0bHkgYSB6aWxsaW9uIGJ5dGVzIGZyb20gbm9uZW1wdHkgZmlsZSIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHtfLCB7ZXJyb3IsIGVvZn19LAorICAgICAgICByZWFkX2V4YWN0KHt0X2ZpbGUsIDw8ImhhbGxvIHdvcmxkIj4+LCB0cnVlLCByZWFkfSwgNjU1MzYpCisgICAgICApfSwKKyAgICAgIHsicmVhZCBleGFjdGx5IDAgYnl0ZSBmcm9tIGZpbGUgaW4gd3JpdGUgbW9kZSIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHtfLCB7ZXJyb3IsIHdyaXRlX21vZGV9fSwKKyAgICAgICAgcmVhZF9leGFjdCh7dF9maWxlLCA8PD4+LCB0cnVlLCB3cml0ZX0sIDApCisgICAgICApfSwKKyAgICAgIHsicmVhZCBleGFjdGx5IDEgYnl0ZSBmcm9tIGZpbGUgaW4gd3JpdGUgbW9kZSIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHtfLCB7ZXJyb3IsIHdyaXRlX21vZGV9fSwKKyAgICAgICAgcmVhZF9leGFjdCh7dF9maWxlLCA8PD4+LCB0cnVlLCB3cml0ZX0sIDEpCisgICAgICApfQorICAgIF0KKyAgfS4KKworCit3cml0ZShGaWxlLCBEYXRhKSAtPiB0aHJpZnRfZmlsZV90cmFuc3BvcnQ6d3JpdGUoRmlsZSwgRGF0YSkuCisKK3dyaXRlX3Rlc3RfKCkgLT4KKyAge3NldHVwLAorICAgIGZ1bigpIC0+CisgICAgICBtZWNrOm5ldyhmaWxlLCBbdW5zdGljaywgcGFzc3Rocm91Z2hdKSwKKyAgICAgIG1lY2s6ZXhwZWN0KGZpbGUsIHdyaXRlLCBmdW4oXywgXykgLT4gb2sgZW5kKQorICAgIGVuZCwKKyAgICBmdW4oXykgLT4gbWVjazp1bmxvYWQoZmlsZSkgZW5kLAorICAgIFsKKyAgICAgIHsid3JpdGUgZW1wdHkgbGlzdCB0byBmaWxlIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge3t0X2ZpbGUsIGFfZmFrZV9maWxlLCB0cnVlLCB3cml0ZX0sIG9rfSwKKyAgICAgICAgd3JpdGUoe3RfZmlsZSwgYV9mYWtlX2ZpbGUsIHRydWUsIHdyaXRlfSwgW10pCisgICAgICApfSwKKyAgICAgIHsid3JpdGUgZW1wdHkgYmluYXJ5IHRvIGZpbGUiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7e3RfZmlsZSwgYV9mYWtlX2ZpbGUsIHRydWUsIHdyaXRlfSwgb2t9LAorICAgICAgICB3cml0ZSh7dF9maWxlLCBhX2Zha2VfZmlsZSwgdHJ1ZSwgd3JpdGV9LCA8PD4+KQorICAgICAgKX0sCisgICAgICB7IndyaXRlIGEgbGlzdCB0byBmaWxlIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge3t0X2ZpbGUsIGFfZmFrZV9maWxlLCB0cnVlLCB3cml0ZX0sIG9rfSwKKyAgICAgICAgd3JpdGUoe3RfZmlsZSwgYV9mYWtlX2ZpbGUsIHRydWUsIHdyaXRlfSwgImhhbGxvIHdvcmxkIikKKyAgICAgICl9LAorICAgICAgeyJ3cml0ZSBhIGJpbmFyeSB0byBmaWxlIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge3t0X2ZpbGUsIGFfZmFrZV9maWxlLCB0cnVlLCB3cml0ZX0sIG9rfSwKKyAgICAgICAgd3JpdGUoe3RfZmlsZSwgYV9mYWtlX2ZpbGUsIHRydWUsIHdyaXRlfSwgPDwiaGFsbG8gd29ybGQiPj4pCisgICAgICApfSwKKyAgICAgIHsid3JpdGUgYSBiaW5hcnkgdG8gZmlsZSBpbiByZWFkIG1vZGUiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7Xywge2Vycm9yLCByZWFkX21vZGV9fSwKKyAgICAgICAgd3JpdGUoe3RfZmlsZSwgYV9mYWtlX2ZpbGUsIHRydWUsIHJlYWR9LCA8PCJoYWxsbyB3b3JsZCI+PikKKyAgICAgICl9LAorICAgICAgeyJ3cml0ZSBhIGxpc3QgdG8gZmlsZSBpbiByZWFkIG1vZGUiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7Xywge2Vycm9yLCByZWFkX21vZGV9fSwKKyAgICAgICAgd3JpdGUoe3RfZmlsZSwgYV9mYWtlX2ZpbGUsIHRydWUsIHJlYWR9LCAiaGFsbG8gd29ybGQiKQorICAgICAgKX0KKyAgICBdCisgIH0uCisKKworZmx1c2goVHJhbnNwb3J0KSAtPiB0aHJpZnRfZmlsZV90cmFuc3BvcnQ6Zmx1c2goVHJhbnNwb3J0KS4KKworZmx1c2hfdGVzdF8oKSAtPgorICB7c2V0dXAsCisgICAgZnVuKCkgLT4KKyAgICAgIG1lY2s6bmV3KGZpbGUsIFt1bnN0aWNrLCBwYXNzdGhyb3VnaF0pLAorICAgICAgbWVjazpleHBlY3QoZmlsZSwgc3luYywgZnVuKF9GaWxlKSAtPiBvayBlbmQpCisgICAgZW5kLAorICAgIGZ1bihfKSAtPiBtZWNrOnVubG9hZChmaWxlKSBlbmQsCisgICAgWworICAgICAgeyJmbHVzaCBmaWxlIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge3t0X2ZpbGUsIGFfZmFrZV9maWxlLCB0cnVlLCB3cml0ZX0sIG9rfSwKKyAgICAgICAgZmx1c2goe3RfZmlsZSwgYV9mYWtlX2ZpbGUsIHRydWUsIHdyaXRlfSkKKyAgICAgICl9CisgICAgXQorICB9LgorCisKK2Nsb3NlKFRyYW5zcG9ydCkgLT4gdGhyaWZ0X2ZpbGVfdHJhbnNwb3J0OmNsb3NlKFRyYW5zcG9ydCkuCisKK2Nsb3NlX3Rlc3RfKCkgLT4KKyAge3NldHVwLAorICAgIGZ1bigpIC0+CisgICAgICBtZWNrOm5ldyhmaWxlLCBbdW5zdGljaywgcGFzc3Rocm91Z2hdKSwKKyAgICAgIG1lY2s6ZXhwZWN0KGZpbGUsIGNsb3NlLCBmdW4oXykgLT4gb2sgZW5kKQorICAgIGVuZCwKKyAgICBmdW4oXykgLT4gbWVjazp1bmxvYWQoZmlsZSkgZW5kLAorICAgIFsKKyAgICAgIHsiY2xvc2UgZmlsZSIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHt7dF9maWxlLCBhX2Zha2VfZmlsZSwgdHJ1ZSwgd3JpdGV9LCBva30sCisgICAgICAgIGNsb3NlKHt0X2ZpbGUsIGFfZmFrZV9maWxlLCB0cnVlLCB3cml0ZX0pCisgICAgICApfQorICAgIF0KKyAgfS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvZXJsL3Rlc3QvdGVzdF90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydC5lcmwgYi9saWIvZXJsL3Rlc3QvdGVzdF90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydC5lcmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE1MzhhNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9lcmwvdGVzdC90ZXN0X3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0LmVybApAQCAtMCwwICsxLDQwNCBAQAorJSUKKyUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCislJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCislJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCislJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCislJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyUlCislJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorJSUKKyUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCislJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCislJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCislJSB1bmRlciB0aGUgTGljZW5zZS4KKyUlCisKKy1tb2R1bGUodGVzdF90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydCkuCistaW5jbHVkZV9saWIoImV1bml0L2luY2x1ZGUvZXVuaXQuaHJsIikuCisKKworbmV3KFRyYW5zcG9ydCkgLT4gdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQ6bmV3KFRyYW5zcG9ydCkuCisKK25ld190ZXN0XygpIC0+CisgIFsKKyAgICB7Im5ldyBmcmFtZWQgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHtvaywge3RfdHJhbnNwb3J0LCB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydCwge3RfZnJhbWVkLAorICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIFtdfX0sCisgICAgICAgIFtdLAorICAgICAgICBbXQorICAgICAgfX19LAorICAgICAgbmV3KHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgW119fSkKKyAgICApfQorICBdLgorCisKK3JlYWQoRnJhbWUsIEJ5dGVzKSAtPiB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydDpyZWFkKEZyYW1lLCBCeXRlcykuCisKK3JlYWRfdGVzdF8oKSAtPgorICBbCisgICAgeyJyZWFkIHplcm8gYnl0ZXMgZnJvbSBhbiBlbXB0eSBmcmFtZWQgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsKKyAgICAgICAge3RfZnJhbWVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIFtdLAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIHtvaywgPDw+Pn0KKyAgICAgIH0sCisgICAgICByZWFkKAorICAgICAgICB7dF9mcmFtZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgICAgW10sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAgMAorICAgICAgKQorICAgICl9LAorICAgIHsicmVhZCAxIGJ5dGUgZnJvbSBhbiBlbXB0eSBmcmFtZWQgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHtfLCB7ZXJyb3IsIGVvZn19LAorICAgICAgcmVhZCgKKyAgICAgICAge3RfZnJhbWVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIFtdLAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIDEKKyAgICAgICkKKyAgICApfSwKKyAgICB7InJlYWQgemVybyBieXRlcyBmcm9tIG5vbmVtcHR5IGZyYW1lZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeworICAgICAgICB7dF9mcmFtZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLAorICAgICAgICAgICAgPDwwLCAwLCAwLCAxMSwgImhhbGxvIHdvcmxkIj4+CisgICAgICAgICAgfX0sCisgICAgICAgICAgW10sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAge29rLCA8PD4+fQorICAgICAgfSwKKyAgICAgIHJlYWQoCisgICAgICAgIHt0X2ZyYW1lZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsCisgICAgICAgICAgICA8PDAsIDAsIDAsIDExLCAiaGFsbG8gd29ybGQiPj4KKyAgICAgICAgICB9fSwKKyAgICAgICAgICBbXSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICAwCisgICAgICApCisgICAgKX0sCisgICAgeyJyZWFkIDEgYnl0ZSBmcm9tIG5vbmVtcHR5IGZyYW1lZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeworICAgICAgICB7dF9mcmFtZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgICAgPDwiYWxsbyB3b3JsZCI+PiwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICB7b2ssIDw8ImgiPj59CisgICAgICB9LAorICAgICAgcmVhZCgKKyAgICAgICAge3RfZnJhbWVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwKKyAgICAgICAgICAgIDw8MCwgMCwgMCwgMTEsICJoYWxsbyB3b3JsZCI+PgorICAgICAgICAgIH19LAorICAgICAgICAgIFtdLAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIDEKKyAgICAgICkKKyAgICApfSwKKyAgICB7InJlYWQgMSBieXRlIGZyb20gbm9uZW1wdHkgYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsKKyAgICAgICAge3RfZnJhbWVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIDw8ImFsbG8gd29ybGQiPj4sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAge29rLCA8PCJoIj4+fQorICAgICAgfSwKKyAgICAgIHJlYWQoCisgICAgICAgIHt0X2ZyYW1lZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICA8PCJoYWxsbyB3b3JsZCI+PiwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICAxCisgICAgICApCisgICAgKX0sCisgICAgeyJyZWFkIGEgemlsbGlvbiBieXRlcyBmcm9tIG5vbmVtcHR5IGZyYW1lZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeworICAgICAgICB7dF9mcmFtZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgICAgPDw+PiwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICB7b2ssIDw8ImhhbGxvIHdvcmxkIj4+fQorICAgICAgfSwKKyAgICAgIHJlYWQoCisgICAgICAgIHt0X2ZyYW1lZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsCisgICAgICAgICAgICA8PDAsIDAsIDAsIDExLCAiaGFsbG8gd29ybGQiPj4KKyAgICAgICAgICB9fSwKKyAgICAgICAgICBbXSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICA2NTUzNgorICAgICAgKQorICAgICl9CisgIF0uCisKKworcmVhZF9leGFjdChGcmFtZSwgQnl0ZXMpIC0+IHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0OnJlYWRfZXhhY3QoRnJhbWUsIEJ5dGVzKS4KKworcmVhZF9leGFjdF90ZXN0XygpIC0+CisgIFsKKyAgICB7InJlYWQgZXhhY3RseSB6ZXJvIGJ5dGVzIGZyb20gYW4gZW1wdHkgZnJhbWVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7CisgICAgICAgIHt0X2ZyYW1lZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICA8PD4+LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIHtvaywgPDw+Pn0KKyAgICAgIH0sCisgICAgICByZWFkX2V4YWN0KAorICAgICAgICB7dF9mcmFtZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgICAgW10sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAgMAorICAgICAgKQorICAgICl9LAorICAgIHsicmVhZCBleGFjdGx5IDEgYnl0ZSBmcm9tIGFuIGVtcHR5IGZyYW1lZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge18sIHtlcnJvciwgZW9mfX0sCisgICAgICByZWFkX2V4YWN0KAorICAgICAgICB7dF9mcmFtZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgICAgW10sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAgMQorICAgICAgKQorICAgICl9LAorICAgIHsicmVhZCBleGFjdGx5IHplcm8gYnl0ZXMgZnJvbSBub25lbXB0eSBmcmFtZWQgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsKKyAgICAgICAge3RfZnJhbWVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwKKyAgICAgICAgICAgIDw8MCwgMCwgMCwgMTEsICJoYWxsbyB3b3JsZCI+PgorICAgICAgICAgIH19LAorICAgICAgICAgIDw8Pj4sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAge29rLCA8PD4+fQorICAgICAgfSwKKyAgICAgIHJlYWRfZXhhY3QoCisgICAgICAgIHt0X2ZyYW1lZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsCisgICAgICAgICAgICA8PDAsIDAsIDAsIDExLCAiaGFsbG8gd29ybGQiPj4KKyAgICAgICAgICB9fSwKKyAgICAgICAgICBbXSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICAwCisgICAgICApCisgICAgKX0sCisgICAgeyJyZWFkIGV4YWN0bHkgMSBieXRlIGZyb20gbm9uZW1wdHkgZnJhbWVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7CisgICAgICAgIHt0X2ZyYW1lZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICA8PCJhbGxvIHdvcmxkIj4+LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIHtvaywgPDwiaCI+Pn0KKyAgICAgIH0sCisgICAgICByZWFkX2V4YWN0KAorICAgICAgICB7dF9mcmFtZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLAorICAgICAgICAgICAgPDwwLCAwLCAwLCAxMSwgImhhbGxvIHdvcmxkIj4+CisgICAgICAgICAgfX0sCisgICAgICAgICAgW10sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAgMQorICAgICAgKQorICAgICl9LAorICAgIHsicmVhZCBleGFjdGx5IDEgYnl0ZSBmcm9tIG5vbmVtcHR5IGJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7CisgICAgICAgIHt0X2ZyYW1lZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICA8PCJhbGxvIHdvcmxkIj4+LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIHtvaywgPDwiaCI+Pn0KKyAgICAgIH0sCisgICAgICByZWFkX2V4YWN0KAorICAgICAgICB7dF9mcmFtZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgICAgPDwiaGFsbG8gd29ybGQiPj4sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAgMQorICAgICAgKQorICAgICl9LAorICAgIHsicmVhZCBleGFjdGx5IGEgemlsbGlvbiBieXRlcyBmcm9tIG5vbmVtcHR5IGZyYW1lZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeworICAgICAgICB7dF9mcmFtZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgICAgW1tdLDw8ImhhbGxvIHdvcmxkIj4+XSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICB7ZXJyb3IsIGVvZn0KKyAgICAgIH0sCisgICAgICByZWFkX2V4YWN0KAorICAgICAgICB7dF9mcmFtZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLAorICAgICAgICAgICAgPDwwLCAwLCAwLCAxMSwgImhhbGxvIHdvcmxkIj4+CisgICAgICAgICAgfX0sCisgICAgICAgICAgW10sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAgNjU1MzYKKyAgICAgICkKKyAgICApfQorICBdLgorCisKK3dyaXRlKEZyYW1lZCwgRGF0YSkgLT4gdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQ6d3JpdGUoRnJhbWVkLCBEYXRhKS4KKword3JpdGVfdGVzdF8oKSAtPgorICBbCisgICAgeyJ3cml0ZSBlbXB0eSBsaXN0IHRvIGVtcHR5IGZyYW1lZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeworICAgICAgICB7dF9mcmFtZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgICAgW10sCisgICAgICAgICAgW1tdLCBbXV0KKyAgICAgICAgfSwKKyAgICAgICAgb2sKKyAgICAgIH0sCisgICAgICB3cml0ZSgKKyAgICAgICAge3RfZnJhbWVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIFtdLAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIFtdCisgICAgICApCisgICAgKX0sCisgICAgeyJ3cml0ZSBlbXB0eSBsaXN0IHRvIG5vbmVtcHR5IGZyYW1lZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeworICAgICAgICB7dF9mcmFtZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgICAgW10sCisgICAgICAgICAgW1siaGFsbG8gd29ybGQiXSwgW11dCisgICAgICAgIH0sCisgICAgICAgIG9rCisgICAgICB9LAorICAgICAgd3JpdGUoCisgICAgICAgIHt0X2ZyYW1lZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICBbXSwKKyAgICAgICAgICBbImhhbGxvIHdvcmxkIl0KKyAgICAgICAgfSwKKyAgICAgICAgW10KKyAgICAgICkKKyAgICApfSwKKyAgICB7IndyaXRlIGVtcHR5IGJpbmFyeSB0byBlbXB0eSBmcmFtZWQgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsKKyAgICAgICAge3RfZnJhbWVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIFtdLAorICAgICAgICAgIFtbXSwgPDw+Pl0KKyAgICAgICAgfSwKKyAgICAgICAgb2sKKyAgICAgIH0sCisgICAgICB3cml0ZSgKKyAgICAgICAge3RfZnJhbWVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIFtdLAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIDw8Pj4KKyAgICAgICkKKyAgICApfSwKKyAgICB7IndyaXRlIGVtcHR5IGJpbmFyeSB0byBub25lbXB0eSBmcmFtZWQgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsKKyAgICAgICAge3RfZnJhbWVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIFtdLAorICAgICAgICAgIFtbImhhbGxvIHdvcmxkIl0sIDw8Pj5dCisgICAgICAgIH0sCisgICAgICAgIG9rCisgICAgICB9LAorICAgICAgd3JpdGUoCisgICAgICAgIHt0X2ZyYW1lZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICBbXSwKKyAgICAgICAgICBbImhhbGxvIHdvcmxkIl0KKyAgICAgICAgfSwKKyAgICAgICAgPDw+PgorICAgICAgKQorICAgICl9CisgIF0uCisKKworZmx1c2goVHJhbnNwb3J0KSAtPiB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydDpmbHVzaChUcmFuc3BvcnQpLgorCitmbHVzaF90ZXN0XygpIC0+CisgIFsKKyAgICB7ImZsdXNoIGVtcHR5IGZyYW1lZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge3t0X2ZyYW1lZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICBbXSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICBvaworICAgICAgfSwKKyAgICAgIGZsdXNoKHt0X2ZyYW1lZCwKKyAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgIFtdLAorICAgICAgICBbXQorICAgICAgfSkKKyAgICApfSwKKyAgICB7ImZsdXNoIG5vbmVtcHR5IGZyYW1lZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge3t0X2ZyYW1lZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsCisgICAgICAgICAgICBbPDw+PiwgWzw8MCwgMCwgMCwgMTE+PiwgPDwiaGFsbG8gd29ybGQiPj5dXQorICAgICAgICAgIH19LAorICAgICAgICAgIFtdLAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIG9rCisgICAgICB9LAorICAgICAgZmx1c2goe3RfZnJhbWVkLAorICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgW10sCisgICAgICAgIDw8ImhhbGxvIHdvcmxkIj4+CisgICAgICB9KQorICAgICl9CisgIF0uCisKKworY2xvc2UoVHJhbnNwb3J0KSAtPiB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydDpjbG9zZShUcmFuc3BvcnQpLgorCitjbG9zZV90ZXN0XygpIC0+CisgIHsiY2xvc2UgZnJhbWVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAge3t0X2ZyYW1lZCwKKyAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgIFtdLAorICAgICAgICBbXQorICAgICAgfSwKKyAgICAgIG9rCisgICAgfSwKKyAgICBjbG9zZSh7dF9mcmFtZWQsCisgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgIFtdLAorICAgICAgW10KKyAgICB9KQorICApfS4KKwpkaWZmIC0tZ2l0IGEvbGliL2VybC90ZXN0L3Rlc3RfdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQuZXJsIGIvbGliL2VybC90ZXN0L3Rlc3RfdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQuZXJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2ODljNzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3Rlc3QvdGVzdF90aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydC5lcmwKQEAgLTAsMCArMSwxNjcgQEAKKyUlCislJSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCislJSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorJSUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyUlIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorJSUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorJSUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorJSUgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CislJQorJSUgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyUlCislJSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCislJSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorJSUgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCislJSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorJSUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworJSUgdW5kZXIgdGhlIExpY2Vuc2UuCislJQorCistbW9kdWxlKHRlc3RfdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQpLgorLWluY2x1ZGVfbGliKCJldW5pdC9pbmNsdWRlL2V1bml0LmhybCIpLgorCisKK25ldygpIC0+IHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0Om5ldygpLgorbmV3KERhdGEpIC0+IHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0Om5ldyhEYXRhKS4KKworbmV3X3Rlc3RfKCkgLT4KKyAgWworICAgIHsibmV3IGVtcHR5IG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7b2ssIHtfLCBfLCB7dF9tZW1idWZmZXIsIFtdfX19LAorICAgICAgbmV3KCkKKyAgICApfSwKKyAgICB7Im5ldyBtZW1idWZmZXIgd2l0aCA8PD4+IiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHtvaywge18sIF8sIHt0X21lbWJ1ZmZlciwgWzw8Pj5dfX19LAorICAgICAgbmV3KDw8Pj4pCisgICAgKX0sCisgICAgeyJuZXcgbWVtYnVmZmVyIHdpdGggW10iLCA/X2Fzc2VydE1hdGNoKAorICAgICAge29rLCB7XywgXywge3RfbWVtYnVmZmVyLCBbXX19fSwKKyAgICAgIG5ldyhbXSkKKyAgICApfSwKKyAgICB7Im5ldyBtZW1idWZmZXIgd2l0aCA8PFwiaGFsbG8gd29ybGRcIj4+IiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHtvaywge18sIF8sIHt0X21lbWJ1ZmZlciwgWzw8ImhhbGxvIHdvcmxkIj4+XX19fSwKKyAgICAgIG5ldyg8PCJoYWxsbyB3b3JsZCI+PikKKyAgICApfSwKKyAgICB7Im5ldyBtZW1idWZmZXIgd2l0aCBcImhhbGxvIHdvcmxkXCIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge29rLCB7XywgXywge3RfbWVtYnVmZmVyLCAiaGFsbG8gd29ybGQifX19LAorICAgICAgbmV3KCJoYWxsbyB3b3JsZCIpCisgICAgKX0KKyAgXS4KKworCityZWFkKE1lbWJ1ZmZlciwgQnl0ZXMpIC0+IHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0OnJlYWQoTWVtYnVmZmVyLCBCeXRlcykuCisKK3JlYWRfdGVzdF8oKSAtPgorICBbCisgICAgeyJyZWFkIHplcm8gYnl0ZXMgZnJvbSBhbiBlbXB0eSBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge18sIHtvaywgPDw+Pn19LAorICAgICAgcmVhZCh7dF9tZW1idWZmZXIsIFtdfSwgMCkKKyAgICApfSwKKyAgICB7InJlYWQgMSBieXRlIGZyb20gYW4gZW1wdHkgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHtfLCB7b2ssIDw8Pj59fSwKKyAgICAgIHJlYWQoe3RfbWVtYnVmZmVyLCBbXX0sIDEpCisgICAgKX0sCisgICAgeyJyZWFkIHplcm8gYnl0ZXMgZnJvbSBub25lbXB0eSBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge3t0X21lbWJ1ZmZlciwgPDwiaGFsbG8gd29ybGQiPj59LCB7b2ssIDw8Pj59fSwKKyAgICAgIHJlYWQoe3RfbWVtYnVmZmVyLCBbWyJoYWxsbyIsICIgIl0sICJ3b3JsZCJdfSwgMCkKKyAgICApfSwKKyAgICB7InJlYWQgMSBieXRlIGZyb20gbm9uZW1wdHkgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHt7dF9tZW1idWZmZXIsIDw8ImFsbG8gd29ybGQiPj59LCB7b2ssIDw8ImgiPj59fSwKKyAgICAgIHJlYWQoe3RfbWVtYnVmZmVyLCBbWyJoYWxsbyIsICIgIl0sICJ3b3JsZCJdfSwgMSkKKyAgICApfSwKKyAgICB7InJlYWQgYSB6aWxsaW9uIGJ5dGVzIGZyb20gbm9uZW1wdHkgYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHt7dF9tZW1idWZmZXIsIDw8Pj59LCB7b2ssIDw8ImhhbGxvIHdvcmxkIj4+fX0sCisgICAgICByZWFkKHt0X21lbWJ1ZmZlciwgW1siaGFsbG8iLCAiICJdLCAid29ybGQiXX0sIDY1NTM2KQorICAgICl9CisgIF0uCisKKworcmVhZF9leGFjdChNZW1idWZmZXIsIEJ5dGVzKSAtPgorICB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydDpyZWFkX2V4YWN0KE1lbWJ1ZmZlciwgQnl0ZXMpLgorCityZWFkX2V4YWN0X3Rlc3RfKCkgLT4KKyAgWworICAgIHsicmVhZCBleGFjdGx5IHplcm8gYnl0ZXMgZnJvbSBhbiBlbXB0eSBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge18sIHtvaywgPDw+Pn19LAorICAgICAgcmVhZF9leGFjdCh7dF9tZW1idWZmZXIsIFtdfSwgMCkKKyAgICApfSwKKyAgICB7InJlYWQgZXhhY3RseSAxIGJ5dGUgZnJvbSBhbiBlbXB0eSBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge18sIHtlcnJvciwgZW9mfX0sCisgICAgICByZWFkX2V4YWN0KHt0X21lbWJ1ZmZlciwgW119LCAxKQorICAgICl9LAorICAgIHsicmVhZCBleGFjdGx5IHplcm8gYnl0ZXMgZnJvbSBub25lbXB0eSBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge3t0X21lbWJ1ZmZlciwgPDwiaGFsbG8gd29ybGQiPj59LCB7b2ssIDw8Pj59fSwKKyAgICAgIHJlYWRfZXhhY3Qoe3RfbWVtYnVmZmVyLCBbWyJoYWxsbyIsICIgIl0sICJ3b3JsZCJdfSwgMCkKKyAgICApfSwKKyAgICB7InJlYWQgZXhhY3RseSAxIGJ5dGUgZnJvbSBub25lbXB0eSBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge3t0X21lbWJ1ZmZlciwgPDwiYWxsbyB3b3JsZCI+Pn0sIHtvaywgPDwiaCI+Pn19LAorICAgICAgcmVhZF9leGFjdCh7dF9tZW1idWZmZXIsIFtbImhhbGxvIiwgIiAiXSwgIndvcmxkIl19LCAxKQorICAgICl9LAorICAgIHsicmVhZCBleGFjdGx5IGEgemlsbGlvbiBieXRlcyBmcm9tIG5vbmVtcHR5IGJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7e3RfbWVtYnVmZmVyLCBbWyJoYWxsbyIsICIgIl0sICJ3b3JsZCJdfSwge2Vycm9yLCBlb2Z9fSwKKyAgICAgIHJlYWRfZXhhY3Qoe3RfbWVtYnVmZmVyLCBbWyJoYWxsbyIsICIgIl0sICJ3b3JsZCJdfSwgNjU1MzYpCisgICAgKX0KKyAgXS4KKworCit3cml0ZShNZW1idWZmZXIsIERhdGEpIC0+IHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0OndyaXRlKE1lbWJ1ZmZlciwgRGF0YSkuCisKK3dyaXRlX3Rlc3RfKCkgLT4KKyAgWworICAgIHsid3JpdGUgZW1wdHkgbGlzdCB0byBlbXB0eSBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge3t0X21lbWJ1ZmZlciwgW1tdLCBbXV19LCBva30sCisgICAgICB3cml0ZSh7dF9tZW1idWZmZXIsIFtdfSwgW10pCisgICAgKX0sCisgICAgeyJ3cml0ZSBlbXB0eSBsaXN0IHRvIG5vbmVtcHR5IG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7e3RfbWVtYnVmZmVyLCBbImhhbGxvIHdvcmxkIiwgW11dfSwgb2t9LAorICAgICAgd3JpdGUoe3RfbWVtYnVmZmVyLCAiaGFsbG8gd29ybGQifSwgW10pCisgICAgKX0sCisgICAgeyJ3cml0ZSBlbXB0eSBiaW5hcnkgdG8gZW1wdHkgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHt7dF9tZW1idWZmZXIsIFtbXSwgPDw+Pl19LCBva30sCisgICAgICB3cml0ZSh7dF9tZW1idWZmZXIsIFtdfSwgPDw+PikKKyAgICApfSwKKyAgICB7IndyaXRlIGVtcHR5IGJpbmFyeSB0byBub25lbXB0eSBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge3t0X21lbWJ1ZmZlciwgWyJoYWxsbyB3b3JsZCIsIDw8Pj5dfSwgb2t9LAorICAgICAgd3JpdGUoe3RfbWVtYnVmZmVyLCAiaGFsbG8gd29ybGQifSwgPDw+PikKKyAgICApfSwKKyAgICB7IndyaXRlIGEgbGlzdCB0byBlbXB0eSBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge3t0X21lbWJ1ZmZlciwgW1tdLCAiaGFsbG8gd29ybGQiXX0sIG9rfSwKKyAgICAgIHdyaXRlKHt0X21lbWJ1ZmZlciwgW119LCAiaGFsbG8gd29ybGQiKQorICAgICl9LAorICAgIHsid3JpdGUgYSBsaXN0IHRvIG5vbmVtcHR5IG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7e3RfbWVtYnVmZmVyLCBbWyJoYWxsbyIsICIgIl0sICJ3b3JsZCJdfSwgb2t9LAorICAgICAgd3JpdGUoe3RfbWVtYnVmZmVyLCBbImhhbGxvIiwgIiAiXX0sICJ3b3JsZCIpCisgICAgKX0sCisgICAgeyJ3cml0ZSBhIGJpbmFyeSB0byBlbXB0eSBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge3t0X21lbWJ1ZmZlciwgW1tdLCA8PCJoYWxsbyB3b3JsZCI+Pl19LCBva30sCisgICAgICB3cml0ZSh7dF9tZW1idWZmZXIsIFtdfSwgPDwiaGFsbG8gd29ybGQiPj4pCisgICAgKX0sCisgICAgeyJ3cml0ZSBhIGJpbmFyeSB0byBub25lbXB0eSBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge3t0X21lbWJ1ZmZlciwgW1siaGFsbG8iLCAiICJdLCA8PCJ3b3JsZCI+Pl19LCBva30sCisgICAgICB3cml0ZSh7dF9tZW1idWZmZXIsIFsiaGFsbG8iLCAiICJdfSwgPDwid29ybGQiPj4pCisgICAgKX0KKyAgXS4KKworCitmbHVzaChUcmFuc3BvcnQpIC0+IHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0OmZsdXNoKFRyYW5zcG9ydCkuCisKK2ZsdXNoX3Rlc3RfKCkgLT4KKyAgWworICAgIHsiZmx1c2ggZW1wdHkgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHt7dF9tZW1idWZmZXIsIFtdfSwgb2t9LAorICAgICAgZmx1c2goe3RfbWVtYnVmZmVyLCBbXX0pCisgICAgKX0sCisgICAgeyJmbHVzaCBub25lbXB0eSBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge3t0X21lbWJ1ZmZlciwgWzw8ImhhbGxvIHdvcmxkIj4+XX0sIG9rfSwKKyAgICAgIGZsdXNoKHt0X21lbWJ1ZmZlciwgWzw8ImhhbGxvIHdvcmxkIj4+XX0pCisgICAgKX0KKyAgXS4KKworCitjbG9zZShUcmFuc3BvcnQpIC0+IHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0OmNsb3NlKFRyYW5zcG9ydCkuCisKK2Nsb3NlX3Rlc3RfKCkgLT4KKyAgeyJjbG9zZSBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgIHt7dF9tZW1idWZmZXIsIF99LCBva30sCisgICAgY2xvc2Uoe3RfbWVtYnVmZmVyLCBbXX0pCisgICl9LgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9lcmwvdGVzdC90ZXN0X3RocmlmdF9zb2NrZXRfdHJhbnNwb3J0LmVybCBiL2xpYi9lcmwvdGVzdC90ZXN0X3RocmlmdF9zb2NrZXRfdHJhbnNwb3J0LmVybApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmMwZjI0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC90ZXN0L3Rlc3RfdGhyaWZ0X3NvY2tldF90cmFuc3BvcnQuZXJsCkBAIC0wLDAgKzEsMTk5IEBACislJQorJSUgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorJSUgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyUlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCislJSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyUlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyUlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyUlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorJSUKKyUlICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCislJQorJSUgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorJSUgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyUlICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorJSUgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyUlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyUlIHVuZGVyIHRoZSBMaWNlbnNlLgorJSUKKworLW1vZHVsZSh0ZXN0X3RocmlmdF9zb2NrZXRfdHJhbnNwb3J0KS4KKy1pbmNsdWRlX2xpYigiZXVuaXQvaW5jbHVkZS9ldW5pdC5ocmwiKS4KKworCituZXcoU29ja2V0KSAtPiB0aHJpZnRfc29ja2V0X3RyYW5zcG9ydDpuZXcoU29ja2V0KS4KK25ldyhTb2NrZXQsIE9wdHMpIC0+IHRocmlmdF9zb2NrZXRfdHJhbnNwb3J0Om5ldyhTb2NrZXQsIE9wdHMpLgorCituZXdfdGVzdF8oKSAtPgorICBbCisgICAgeyJuZXcgc29ja2V0IiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHtvaywge18sIHRocmlmdF9zb2NrZXRfdHJhbnNwb3J0LCB7dF9zb2NrZXQsIGFfZmFrZV9zb2NrZXQsIDYwMDAwLCBbXX19fSwKKyAgICAgIG5ldyhhX2Zha2Vfc29ja2V0KQorICAgICl9LAorICAgIHsibmV3IHNvY2tldCB3aXRoIG5vIG9wdGlvbnMiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge29rLCB7XywgdGhyaWZ0X3NvY2tldF90cmFuc3BvcnQsIHt0X3NvY2tldCwgYV9mYWtlX3NvY2tldCwgNjAwMDAsIFtdfX19LAorICAgICAgbmV3KGFfZmFrZV9zb2NrZXQsIFtdKQorICAgICl9LAorICAgIHsibmV3IHNvY2tldCB3aXRoIGludGVnZXIgdGltZW91dCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7b2ssIHtfLCB0aHJpZnRfc29ja2V0X3RyYW5zcG9ydCwge3Rfc29ja2V0LCBhX2Zha2Vfc29ja2V0LCA1MDAwLCBbXX19fSwKKyAgICAgIG5ldyhhX2Zha2Vfc29ja2V0LCBbe3JlY3ZfdGltZW91dCwgNTAwMH1dKQorICAgICl9LAorICAgIHsibmV3IHNvY2tldCB3aXRoIGluZmluaXR5IHRpbWVvdXQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge29rLCB7XywgdGhyaWZ0X3NvY2tldF90cmFuc3BvcnQsIHt0X3NvY2tldCwgYV9mYWtlX3NvY2tldCwgaW5maW5pdHksIFtdfX19LAorICAgICAgbmV3KGFfZmFrZV9zb2NrZXQsIFt7cmVjdl90aW1lb3V0LCBpbmZpbml0eX1dKQorICAgICl9CisgIF0uCisKKworcmVhZChTb2NrZXQsIEJ5dGVzKSAtPiB0aHJpZnRfc29ja2V0X3RyYW5zcG9ydDpyZWFkKFNvY2tldCwgQnl0ZXMpLgorCityZWFkX3Rlc3RfKCkgLT4KKyAge3NldHVwLAorICAgIGZ1bigpIC0+CisgICAgICBtZWNrOm5ldyhnZW5fdGNwLCBbdW5zdGljaywgcGFzc3Rocm91Z2hdKSwKKyAgICAgIG1lY2s6ZXhwZWN0KGdlbl90Y3AsIHJlY3YsIGZ1bihCaW4sIDAsIF8pIC0+IHtvaywgQmlufSBlbmQpCisgICAgZW5kLAorICAgIGZ1bihfKSAtPiBtZWNrOnVubG9hZChnZW5fdGNwKSBlbmQsCisgICAgWworICAgICAgeyJyZWFkIHplcm8gYnl0ZXMgZnJvbSBlbXB0eSBzb2NrZXQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7Xywge29rLCA8PD4+fX0sCisgICAgICAgIHJlYWQoe3Rfc29ja2V0LCA8PD4+LCA2MDAwMCwgW119LCAwKQorICAgICAgKX0sCisgICAgICB7InJlYWQgMSBieXRlIGZyb20gZW1wdHkgc29ja2V0IiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge18sIHtvaywgPDw+Pn19LAorICAgICAgICByZWFkKHt0X3NvY2tldCwgPDw+PiwgNjAwMDAsIFtdfSwgMSkKKyAgICAgICl9LAorICAgICAgeyJyZWFkIHplcm8gYnl0ZXMgZnJvbSBub25lbXB0eSBzb2NrZXQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7e3Rfc29ja2V0LCBfLCBfLCBffSwge29rLCA8PD4+fX0sCisgICAgICAgIHJlYWQoe3Rfc29ja2V0LCA8PCJoYWxsbyB3b3JsZCI+PiwgNjAwMDAsIFtdfSwgMCkKKyAgICAgICl9LAorICAgICAgeyJyZWFkIDEgYnl0ZSBmcm9tIG5vbmVtcHR5IHNvY2tldCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHt7dF9zb2NrZXQsIF8sIF8sIDw8ImFsbG8gd29ybGQiPj59LCB7b2ssIDw8ImgiPj59fSwKKyAgICAgICAgcmVhZCh7dF9zb2NrZXQsIDw8ImhhbGxvIHdvcmxkIj4+LCA2MDAwMCwgW119LCAxKQorICAgICAgKX0sCisgICAgICB7InJlYWQgYSB6aWxsaW9uIGJ5dGVzIGZyb20gbm9uZW1wdHkgc29ja2V0IiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge3t0X3NvY2tldCwgXywgXywgPDw+Pn0sIHtvaywgPDwiaGFsbG8gd29ybGQiPj59fSwKKyAgICAgICAgcmVhZCh7dF9zb2NrZXQsIDw8ImhhbGxvIHdvcmxkIj4+LCA2MDAwMCwgW119LCA2NTUzNikKKyAgICAgICl9LAorICAgICAgeyJyZWFkIDEgYnl0ZSBmcm9tIHByZXZpb3VzbHkgYnVmZmVyZWQgc29ja2V0IiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge3t0X3NvY2tldCwgXywgXywgPDwiYWxsbyI+Pn0sIHtvaywgPDwiaCI+Pn19LAorICAgICAgICByZWFkKHt0X3NvY2tldCwgPDwiIHdvcmxkIj4+LCA2MDAwMCwgPDwiaGFsbG8iPj59LCAxKQorICAgICAgKX0sCisgICAgICB7InJlYWQgNiBieXRlIGZyb20gcHJldmlvdXNseSBidWZmZXJlZCBzb2NrZXQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7e3Rfc29ja2V0LCBfLCBfLCA8PCJ3b3JsZCI+Pn0sIHtvaywgPDwiaGFsbG8gIj4+fX0sCisgICAgICAgIHJlYWQoe3Rfc29ja2V0LCA8PCIgd29ybGQiPj4sIDYwMDAwLCA8PCJoYWxsbyI+Pn0sIDYpCisgICAgICApfSwKKyAgICAgIHsicmVhZCBhIHppbGxpb24gYnl0ZXMgZnJvbSBwcmV2aW91c2x5IGJ1ZmZlcmVkIHNvY2tldCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHt7dF9zb2NrZXQsIF8sIF8sIDw8Pj59LCB7b2ssIDw8ImhhbGxvIHdvcmxkIj4+fX0sCisgICAgICAgIHJlYWQoe3Rfc29ja2V0LCA8PCIgd29ybGQiPj4sIDYwMDAwLCA8PCJoYWxsbyI+Pn0sIDY1NTM2KQorICAgICAgKX0KKyAgICBdCisgIH0uCisKKworcmVhZF9leGFjdChTb2NrZXQsIEJ5dGVzKSAtPiB0aHJpZnRfc29ja2V0X3RyYW5zcG9ydDpyZWFkX2V4YWN0KFNvY2tldCwgQnl0ZXMpLgorCityZWFkX2V4YWN0X3Rlc3RfKCkgLT4KKyAge3NldHVwLAorICAgIGZ1bigpIC0+CisgICAgICBtZWNrOm5ldyhnZW5fdGNwLCBbdW5zdGljaywgcGFzc3Rocm91Z2hdKSwKKyAgICAgIG1lY2s6ZXhwZWN0KGdlbl90Y3AsIHJlY3YsIGZ1bihCaW4sIE4sIF8pIC0+CisgICAgICAgIGNhc2UgTiBvZgorICAgICAgICAgIDAgLT4ge29rLCBCaW59OworICAgICAgICAgIDEgLT4ge29rLCA8PCJoIj4+fTsKKyAgICAgICAgICBOIHdoZW4gTiA+IDIgLT4ge2Vycm9yLCB0aW1lb3V0fQorICAgICAgICBlbmQKKyAgICAgIGVuZCksCisgICAgICBtZWNrOmV4cGVjdChnZW5fdGNwLCBjbG9zZSwgZnVuKF8pIC0+IG9rIGVuZCkKKyAgICBlbmQsCisgICAgZnVuKF8pIC0+IG1lY2s6dW5sb2FkKGdlbl90Y3ApIGVuZCwKKyAgICBbCisgICAgICB7InJlYWRfZXhhY3QgemVybyBieXRlcyBmcm9tIGVtcHR5IHNvY2tldCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHtfLCB7b2ssIDw8Pj59fSwKKyAgICAgICAgcmVhZF9leGFjdCh7dF9zb2NrZXQsIDw8Pj4sIDYwMDAwLCBbXX0sIDApCisgICAgICApfSwKKyAgICAgIHsicmVhZF9leGFjdCB6ZXJvIGJ5dGVzIGZyb20gbm9uZW1wdHkgc29ja2V0IiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge3t0X3NvY2tldCwgXywgXywgX30sIHtvaywgPDw+Pn19LAorICAgICAgICByZWFkX2V4YWN0KHt0X3NvY2tldCwgPDwiaGFsbG8gd29ybGQiPj4sIDYwMDAwLCBbXX0sIDApCisgICAgICApfSwKKyAgICAgIHsicmVhZF9leGFjdCAxIGJ5dGUgZnJvbSBub25lbXB0eSBzb2NrZXQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7e3Rfc29ja2V0LCBfLCBfLCBbXX0sIHtvaywgPDwiaCI+Pn19LAorICAgICAgICByZWFkX2V4YWN0KHt0X3NvY2tldCwgPDwiaGFsbG8gd29ybGQiPj4sIDYwMDAwLCBbXX0sIDEpCisgICAgICApfSwKKyAgICAgIHsicmVhZF9leGFjdCBhIHppbGxpb24gYnl0ZXMgZnJvbSBub25lbXB0eSBzb2NrZXQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7e3Rfc29ja2V0LCBfLCBfLCBbXX0sIHtlcnJvciwgdGltZW91dH19LAorICAgICAgICByZWFkX2V4YWN0KHt0X3NvY2tldCwgPDwiaGFsbG8gd29ybGQiPj4sIDYwMDAwLCBbXX0sIDY1NTM2KQorICAgICAgKX0sCisgICAgICB7InJlYWRfZXhhY3QgMSBieXRlIGZyb20gcHJldmlvdXNseSBidWZmZXJlZCBzb2NrZXQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7e3Rfc29ja2V0LCBfLCBfLCA8PCJhbGxvIj4+fSwge29rLCA8PCJoIj4+fX0sCisgICAgICAgIHJlYWRfZXhhY3Qoe3Rfc29ja2V0LCA8PCIgd29ybGQiPj4sIDYwMDAwLCA8PCJoYWxsbyI+Pn0sIDEpCisgICAgICApfSwKKyAgICAgIHsicmVhZF9leGFjdCA2IGJ5dGUgZnJvbSBwcmV2aW91c2x5IGJ1ZmZlcmVkIHNvY2tldCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHt7dF9zb2NrZXQsIF8sIF8sIFtdfSwge29rLCA8PCJtb3JlIGgiPj59fSwKKyAgICAgICAgcmVhZF9leGFjdCh7dF9zb2NrZXQsIDw8ImhhbGxvIj4+LCA2MDAwMCwgPDwibW9yZSAiPj59LCA2KQorICAgICAgKX0sCisgICAgICB7InJlYWRfZXhhY3QgYSB6aWxsaW9uIGJ5dGVzIGZyb20gcHJldmlvdXNseSBidWZmZXJlZCBzb2NrZXQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7e3Rfc29ja2V0LCBfLCBfLCA8PCJoYWxsbyI+Pn0sIHtlcnJvciwgdGltZW91dH19LAorICAgICAgICByZWFkX2V4YWN0KHt0X3NvY2tldCwgPDwiIHdvcmxkIj4+LCA2MDAwMCwgPDwiaGFsbG8iPj59LCA2NTUzNikKKyAgICAgICl9CisgICAgXQorICB9LgorCisKK3dyaXRlKFNvY2tldCwgRGF0YSkgLT4gdGhyaWZ0X3NvY2tldF90cmFuc3BvcnQ6d3JpdGUoU29ja2V0LCBEYXRhKS4KKword3JpdGVfdGVzdF8oKSAtPgorICB7c2V0dXAsCisgICAgZnVuKCkgLT4KKyAgICAgIG1lY2s6bmV3KGdlbl90Y3AsIFt1bnN0aWNrLCBwYXNzdGhyb3VnaF0pLAorICAgICAgbWVjazpleHBlY3QoZ2VuX3RjcCwgc2VuZCwgZnVuKF8sIF8pIC0+IG9rIGVuZCkKKyAgICBlbmQsCisgICAgZnVuKF8pIC0+IG1lY2s6dW5sb2FkKGdlbl90Y3ApIGVuZCwKKyAgICBbCisgICAgICB7IndyaXRlIGVtcHR5IGxpc3QgdG8gc29ja2V0IiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge3t0X3NvY2tldCwgYV9mYWtlX3NvY2tldCwgNjAwMDAsIFtdfSwgb2t9LAorICAgICAgICB3cml0ZSh7dF9zb2NrZXQsIGFfZmFrZV9zb2NrZXQsIDYwMDAwLCBbXX0sIFtdKQorICAgICAgKX0sCisgICAgICB7IndyaXRlIGVtcHR5IGJpbmFyeSB0byBzb2NrZXQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7e3Rfc29ja2V0LCBhX2Zha2Vfc29ja2V0LCA2MDAwMCwgW119LCBva30sCisgICAgICAgIHdyaXRlKHt0X3NvY2tldCwgYV9mYWtlX3NvY2tldCwgNjAwMDAsIFtdfSwgPDw+PikKKyAgICAgICl9LAorICAgICAgeyJ3cml0ZSBhIGxpc3QgdG8gc29ja2V0IiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge3t0X3NvY2tldCwgYV9mYWtlX3NvY2tldCwgNjAwMDAsIFtdfSwgb2t9LAorICAgICAgICB3cml0ZSh7dF9zb2NrZXQsIGFfZmFrZV9zb2NrZXQsIDYwMDAwLCBbXX0sICJoYWxsbyB3b3JsZCIpCisgICAgICApfSwKKyAgICAgIHsid3JpdGUgYSBiaW5hcnkgdG8gc29ja2V0IiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge3t0X3NvY2tldCwgYV9mYWtlX3NvY2tldCwgNjAwMDAsIFtdfSwgb2t9LAorICAgICAgICB3cml0ZSh7dF9zb2NrZXQsIGFfZmFrZV9zb2NrZXQsIDYwMDAwLCBbXX0sIDw8ImhhbGxvIHdvcmxkIj4+KQorICAgICAgKX0KKyAgICBdCisgIH0uCisKKworZmx1c2goVHJhbnNwb3J0KSAtPiB0aHJpZnRfc29ja2V0X3RyYW5zcG9ydDpmbHVzaChUcmFuc3BvcnQpLgorCitmbHVzaF90ZXN0XygpIC0+CisgIFsKKyAgICB7ImZsdXNoIHNvY2tldCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7e3Rfc29ja2V0LCBhX2Zha2Vfc29ja2V0LCA2MDAwMCwgW119LCBva30sCisgICAgICBmbHVzaCh7dF9zb2NrZXQsIGFfZmFrZV9zb2NrZXQsIDYwMDAwLCBbXX0pCisgICAgKX0KKyAgXS4KKworCitjbG9zZShUcmFuc3BvcnQpIC0+IHRocmlmdF9zb2NrZXRfdHJhbnNwb3J0OmNsb3NlKFRyYW5zcG9ydCkuCisKK2Nsb3NlX3Rlc3RfKCkgLT4KKyAge3NldHVwLAorICAgIGZ1bigpIC0+CisgICAgICBtZWNrOm5ldyhnZW5fdGNwLCBbdW5zdGljaywgcGFzc3Rocm91Z2hdKSwKKyAgICAgIG1lY2s6ZXhwZWN0KGdlbl90Y3AsIGNsb3NlLCBmdW4oXykgLT4gb2sgZW5kKQorICAgIGVuZCwKKyAgICBmdW4oXykgLT4gbWVjazp1bmxvYWQoZ2VuX3RjcCkgZW5kLAorICAgIFsKKyAgICAgIHsiY2xvc2UgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge3t0X3NvY2tldCwgYV9mYWtlX3NvY2tldCwgNjAwMDAsIFtdfSwgb2t9LAorICAgICAgICBjbG9zZSh7dF9zb2NrZXQsIGFfZmFrZV9zb2NrZXQsIDYwMDAwLCBbXX0pCisgICAgICApfQorICAgIF0KKyAgfS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvZXJsL3Rlc3QvdGhyaWZ0X3NvY2tldF9zZXJ2ZXJfdGVzdC5lcmwgYi9saWIvZXJsL3Rlc3QvdGhyaWZ0X3NvY2tldF9zZXJ2ZXJfdGVzdC5lcmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDgxOGI4NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9lcmwvdGVzdC90aHJpZnRfc29ja2V0X3NlcnZlcl90ZXN0LmVybApAQCAtMCwwICsxLDQ5IEBACistbW9kdWxlICh0aHJpZnRfc29ja2V0X3NlcnZlcl90ZXN0KS4KKworLWluY2x1ZGVfbGliKCJldW5pdC9pbmNsdWRlL2V1bml0LmhybCIpLgorCistaW5jbHVkZSAoInRocmlmdF9jb25zdGFudHMuaHJsIikuCisKK3BhcnNlX2hhbmRsZXJfb3B0aW9uc190ZXN0XygpIC0+CisgICAgQ29ycmVjdFNlcnZpY2VIYW5kbGVyT3B0aW9uTGlzdCA9IFt7P01VTFRJUExFWEVEX0VSUk9SX0hBTkRMRVJfS0VZLCA/TU9EVUxFfSwgeyJTZXJ2aWNlMSIsID9NT0RVTEV9LCB7IlNlcnZpY2UyIiwgP01PRFVMRX1dLAorICAgIE1pc3NpbmdFcnJvckhhbmRsZXJPcHRpb25MaXN0ICAgPSBbeyJTZXJ2aWNlMSIsID9NT0RVTEV9LCB7IlNlcnZpY2UyIiwgP01PRFVMRX1dLAorICAgIFdyb25nU2VydmljZTJIYW5kbGVyT3B0aW9uTGlzdCAgPSBbez9NVUxUSVBMRVhFRF9FUlJPUl9IQU5ETEVSX0tFWSwgP01PRFVMRX0sIHsiU2VydmljZTEiLCA/TU9EVUxFfSwgeyJTZXJ2aWNlMiIsICJNb2R1bGUifV0sCisgICAgV3JvbmdTZXJ2aWNlS2V5T3B0aW9uTGlzdCAgICAgICA9IFt7P01VTFRJUExFWEVEX0VSUk9SX0hBTkRMRVJfS0VZLCA/TU9EVUxFfSwgeydzZXJ2aWNlMScsID9NT0RVTEV9LCB7IlNlcnZpY2UyIiwgP01PRFVMRX1dLAorICAgIENvcnJlY3RIYW5kbGVyVGVzdEZ1bmN0aW9uID0gZnVuKCkgLT4KKyAgICAgICAgP2Fzc2VydE1hdGNoKHt0aHJpZnRfc29ja2V0X3NlcnZlcixfLF8sXyxfLF8sXyxfLF8sXyxfLF8sXyxffSwgdGhyaWZ0X3NvY2tldF9zZXJ2ZXI6cGFyc2Vfb3B0aW9ucyhbe2hhbmRsZXIsIENvcnJlY3RTZXJ2aWNlSGFuZGxlck9wdGlvbkxpc3R9XSkpLAorICAgICAgICB7dGhyaWZ0X3NvY2tldF9zZXJ2ZXIsXyxfLCBIYW5kbGVyTGlzdCxfLF8sXyxfLF8sXyxfLF8sXyxffSA9IHRocmlmdF9zb2NrZXRfc2VydmVyOnBhcnNlX29wdGlvbnMoW3toYW5kbGVyLCBDb3JyZWN0U2VydmljZUhhbmRsZXJPcHRpb25MaXN0fV0pLAorICAgICAgICBsaXN0czpmb3JlYWNoKGZ1bgorICAgICAgICAgICAgKHtTZXJ2aWNlTmFtZSwgSGFuZGxlck1vZHVsZX0pIC0+CisgICAgICAgICAgICAgICAgP2Fzc2VydE1hdGNoKHtvaywgSGFuZGxlck1vZHVsZX0gd2hlbiBpc19hdG9tKEhhbmRsZXJNb2R1bGUpLCB0aHJpZnRfbXVsdGlwbGV4ZWRfbWFwX3dyYXBwZXI6ZmluZChTZXJ2aWNlTmFtZSwgSGFuZGxlckxpc3QpKQorICAgICAgICBlbmQsIENvcnJlY3RTZXJ2aWNlSGFuZGxlck9wdGlvbkxpc3QpCisgICAgZW5kLAorICAgIFsKKyAgICAgeyJCYWQgYXJndW1lbnQgZm9yIHRoZSBoYW5kbGVyIG9wdGlvbiIsID9fYXNzZXJ0VGhyb3coXywgdGhyaWZ0X3NvY2tldF9zZXJ2ZXI6cGFyc2Vfb3B0aW9ucyhbe2hhbmRsZXIsIFtdfV0pKX0sCisgICAgIHsiVHJ5IHRvIHBhcnNlIHRoZSBoYW5kbGVyIG9wdGlvbiB0d2ljZSIsID9fYXNzZXJ0VGhyb3coXywgdGhyaWZ0X3NvY2tldF9zZXJ2ZXI6cGFyc2Vfb3B0aW9ucyhbe2hhbmRsZXIsID9NT0RVTEV9LCB7aGFuZGxlciwgQ29ycmVjdFNlcnZpY2VIYW5kbGVyT3B0aW9uTGlzdH1dKSl9LAorICAgICB7IlBhcnNlIHRoZSBoYW5kbGVyIG9wdGlvbiBhcyBhIG5vbiBtdWx0aXBsZXhlZCBzZXJ2aWNlIGhhbmRsZXIiLCA/X2Fzc2VydE1hdGNoKHt0aHJpZnRfc29ja2V0X3NlcnZlcixfLF8sP01PRFVMRSxfLF8sXyxfLF8sXyxfLF8sXyxffSwgdGhyaWZ0X3NvY2tldF9zZXJ2ZXI6cGFyc2Vfb3B0aW9ucyhbe2hhbmRsZXIsID9NT0RVTEV9XSkpfSwKKyAgICAgeyJObyBlcnJvciBoYW5kbGVyIHdhcyBkZWZpbmVkIiwgP19hc3NlcnRUaHJvdyhfLCB0aHJpZnRfc29ja2V0X3NlcnZlcjpwYXJzZV9vcHRpb25zKFt7aGFuZGxlciwgTWlzc2luZ0Vycm9ySGFuZGxlck9wdGlvbkxpc3R9XSkpfSwKKyAgICAgeyJCYWQgaGFuZGxlciBtb2R1bGUgZm9yIFNlcnZpY2UyIiwgP19hc3NlcnRUaHJvdyhfLCB0aHJpZnRfc29ja2V0X3NlcnZlcjpwYXJzZV9vcHRpb25zKFt7aGFuZGxlciwgV3JvbmdTZXJ2aWNlMkhhbmRsZXJPcHRpb25MaXN0fV0pKX0sCisgICAgIHsiQmFkIHNlcnZpY2Uga2V5IGZvciBTZXJ2aWNlMSIsID9fYXNzZXJ0VGhyb3coXywgdGhyaWZ0X3NvY2tldF9zZXJ2ZXI6cGFyc2Vfb3B0aW9ucyhbe2hhbmRsZXIsIFdyb25nU2VydmljZUtleU9wdGlvbkxpc3R9XSkpfSwKKyAgICAgeyJUcnkgdG8gcGFyc2UgYSBjb3JyZWN0IGhhbmRsZXIgb3B0aW9uIGxpc3QiLCBDb3JyZWN0SGFuZGxlclRlc3RGdW5jdGlvbn0KKyAgICBdLgorCitwYXJzZV9zZXJ2aWNlX29wdGlvbnNfdGVzdF8oKSAtPgorICAgIENvcnJlY3RTZXJ2aWNlTW9kdWxlT3B0aW9uTGlzdCA9IFt7IlNlcnZpY2UxIiwgP01PRFVMRX0sIHsiU2VydmljZTIiLCA/TU9EVUxFfV0sCisgICAgV3JvbmdTZXJ2aWNlMk1vZHVsZU9wdGlvbkxpc3QgID0gW3siU2VydmljZTEiLCA/TU9EVUxFfSwgeyJTZXJ2aWNlMiIsICJ0aHJpZnRfc2VydmljZV9tb2R1bGUifV0sCisgICAgV3JvbmdTZXJ2aWNlS2V5T3B0aW9uTGlzdCAgICAgICA9IFt7J3NlcnZpY2UxJywgP01PRFVMRX0sIHsiU2VydmljZTIiLCA/TU9EVUxFfV0sCisgICAgQ29ycmVjdFNlcnZpY2VNb2R1bGVUZXN0RnVuY3Rpb24gPSBmdW4oKSAtPgorICAgICAgICA/YXNzZXJ0TWF0Y2goe3RocmlmdF9zb2NrZXRfc2VydmVyLF8sXyxfLF8sXyxfLF8sXyxfLF8sXyxfLF99LCB0aHJpZnRfc29ja2V0X3NlcnZlcjpwYXJzZV9vcHRpb25zKFt7c2VydmljZSwgQ29ycmVjdFNlcnZpY2VNb2R1bGVPcHRpb25MaXN0fV0pKSwKKyAgICAgICAge3RocmlmdF9zb2NrZXRfc2VydmVyLF8sIFNlcnZpY2VNb2R1bGVMaXN0LF8sXyxfLF8sXyxfLF8sXyxfLF8sX30gPSB0aHJpZnRfc29ja2V0X3NlcnZlcjpwYXJzZV9vcHRpb25zKFt7c2VydmljZSwgQ29ycmVjdFNlcnZpY2VNb2R1bGVPcHRpb25MaXN0fV0pLAorICAgICAgICBsaXN0czpmb3JlYWNoKGZ1bgorICAgICAgICAgICAgKHtTZXJ2aWNlTmFtZSwgU2VydmljZU1vZHVsZX0pIC0+CisgICAgICAgICAgICAgICAgP2Fzc2VydE1hdGNoKHtvaywgU2VydmljZU1vZHVsZX0gd2hlbiBpc19hdG9tKFNlcnZpY2VNb2R1bGUpLCB0aHJpZnRfbXVsdGlwbGV4ZWRfbWFwX3dyYXBwZXI6ZmluZChTZXJ2aWNlTmFtZSwgU2VydmljZU1vZHVsZUxpc3QpKQorICAgICAgICBlbmQsIENvcnJlY3RTZXJ2aWNlTW9kdWxlT3B0aW9uTGlzdCkKKyAgICBlbmQsCisgICAgWworICAgICB7IkJhZCBhcmd1bWVudCBmb3IgdGhlIHNlcnZpY2Ugb3B0aW9uIiwgP19hc3NlcnRUaHJvdyhfLCB0aHJpZnRfc29ja2V0X3NlcnZlcjpwYXJzZV9vcHRpb25zKFt7c2VydmljZSwgW119XSkpfSwKKyAgICAgeyJUcnkgdG8gcGFyc2UgdGhlIHNlcnZpY2Ugb3B0aW9uIHR3aWNlIiwgP19hc3NlcnRUaHJvdyhfLCB0aHJpZnRfc29ja2V0X3NlcnZlcjpwYXJzZV9vcHRpb25zKFt7c2VydmljZSwgP01PRFVMRX0sIHtzZXJ2aWNlLCBDb3JyZWN0U2VydmljZU1vZHVsZU9wdGlvbkxpc3R9XSkpfSwKKyAgICAgeyJQYXJzZSBhIHNlcnZpY2UgbW9kdWxlIGZvciBhIG5vbiBtdWx0aXBsZXhlZCBzZXJ2aWNlIiwgP19hc3NlcnRNYXRjaCh7dGhyaWZ0X3NvY2tldF9zZXJ2ZXIsXyw/TU9EVUxFLF8sXyxfLF8sXyxfLF8sXyxfLF8sX30sIHRocmlmdF9zb2NrZXRfc2VydmVyOnBhcnNlX29wdGlvbnMoW3tzZXJ2aWNlLCA/TU9EVUxFfV0pKX0sCisgICAgIHsiQmFkIHNlcnZpY2UgbW9kdWxlIGZvciBTZXJ2aWNlMiIsID9fYXNzZXJ0VGhyb3coXywgdGhyaWZ0X3NvY2tldF9zZXJ2ZXI6cGFyc2Vfb3B0aW9ucyhbe3NlcnZpY2UsIFdyb25nU2VydmljZTJNb2R1bGVPcHRpb25MaXN0fV0pKX0sCisgICAgIHsiQmFkIHNlcnZpY2Uga2V5IGZvciBTZXJ2aWNlMSIsID9fYXNzZXJ0VGhyb3coXywgdGhyaWZ0X3NvY2tldF9zZXJ2ZXI6cGFyc2Vfb3B0aW9ucyhbe3NlcnZpY2UsIFdyb25nU2VydmljZUtleU9wdGlvbkxpc3R9XSkpfSwKKyAgICAgeyJUcnkgdG8gcGFyc2UgYSBjb3JyZWN0IHNlcnZpY2Ugb3B0aW9uIGxpc3QiLCBDb3JyZWN0U2VydmljZU1vZHVsZVRlc3RGdW5jdGlvbn0KKyAgICBdLgpkaWZmIC0tZ2l0IGEvbGliL2VybC90ZXN0L3RocmlmdF90ZXN0X3Rlc3QuZXJsIGIvbGliL2VybC90ZXN0L3RocmlmdF90ZXN0X3Rlc3QuZXJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ZGY2MWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3Rlc3QvdGhyaWZ0X3Rlc3RfdGVzdC5lcmwKQEAgLTAsMCArMSw2NDMgQEAKKyUlCislJSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCislJSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorJSUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyUlIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorJSUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorJSUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorJSUgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CislJQorJSUgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyUlCislJSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCislJSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorJSUgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCislJSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorJSUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworJSUgdW5kZXIgdGhlIExpY2Vuc2UuCislJQorCislIGRvbid0IHJlbmFtZSB0aGlzIHRocmlmdF90ZXN0LCBpdCBjbG9iYmVycyBnZW5lcmF0ZWQgZmlsZXMKKy1tb2R1bGUodGhyaWZ0X3Rlc3RfdGVzdCkuCistY29tcGlsZShleHBvcnRfYWxsKS4KKworLWluY2x1ZGVfbGliKCJldW5pdC9pbmNsdWRlL2V1bml0LmhybCIpLgorCistaW5jbHVkZSgiZ2VuLWVybC90aHJpZnRfdGVzdF9jb25zdGFudHMuaHJsIikuCisKK2NvbnN0YW50X3Rlc3RfKCkgLT4KKyAgWworICAgIHsibXlOdW1iZXJ6IGVxdWFscyAxIiwgP19hc3NlcnRFcXVhbCgxLCA/VEhSSUZUX1RFU1RfTVlOVU1CRVJaKX0KKyAgXS4KKworcmVjb3JkX2dlbmVyYXRpb25fdGVzdF8oKSAtPgorICBbCisgICAgeyJCb25rIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7J3RocmlmdC50ZXN0LkJvbmsnLCBfLCBffSwKKyAgICAgICMndGhyaWZ0LnRlc3QuQm9uayd7bWVzc2FnZT1udWxsLHR5cGU9bnVsbH0KKyAgICApfSwKKyAgICB7IkJvb2xzIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7J3RocmlmdC50ZXN0LkJvb2xzJywgXywgX30sCisgICAgICAjJ3RocmlmdC50ZXN0LkJvb2xzJ3tpbV90cnVlPW51bGwsaW1fZmFsc2U9bnVsbH0KKyAgICApfSwKKyAgICB7Ilh0cnVjdCByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeyd0aHJpZnQudGVzdC5YdHJ1Y3QnLCBfLCBfLCBfLCBffSwKKyAgICAgICMndGhyaWZ0LnRlc3QuWHRydWN0J3tzdHJpbmdfdGhpbmc9bnVsbCxieXRlX3RoaW5nPW51bGwsaTMyX3RoaW5nPW51bGwsaTY0X3RoaW5nPW51bGx9CisgICAgKX0sCisgICAgeyJYdHJ1Y3QyIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7J3RocmlmdC50ZXN0Llh0cnVjdDInLCBfLCBfLCBffSwKKyAgICAgICMndGhyaWZ0LnRlc3QuWHRydWN0Mid7Ynl0ZV90aGluZz1udWxsLHN0cnVjdF90aGluZz1udWxsLGkzMl90aGluZz1udWxsfQorICAgICl9LAorICAgIHsiWHRydWN0MyByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeyd0aHJpZnQudGVzdC5YdHJ1Y3QzJywgXywgXywgXywgX30sCisgICAgICAjJ3RocmlmdC50ZXN0Llh0cnVjdDMne3N0cmluZ190aGluZz1udWxsLGNoYW5nZWQ9bnVsbCxpMzJfdGhpbmc9bnVsbCxpNjRfdGhpbmc9bnVsbH0KKyAgICApfSwKKyAgICB7Ikluc2FuaXR5IHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7J3RocmlmdC50ZXN0Lkluc2FuaXR5JywgXywgX30sCisgICAgICAjJ3RocmlmdC50ZXN0Lkluc2FuaXR5J3t1c2VyTWFwPW51bGwseHRydWN0cz1udWxsfQorICAgICl9LAorICAgIHsiQ3JhenlOZXN0aW5nIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7J3RocmlmdC50ZXN0LkNyYXp5TmVzdGluZycsIF8sIF8sIF8sIF99LAorICAgICAgIyd0aHJpZnQudGVzdC5DcmF6eU5lc3RpbmcneworICAgICAgICBzdHJpbmdfZmllbGQ9bnVsbCwKKyAgICAgICAgc2V0X2ZpZWxkPW51bGwsCisgICAgICAgIGxpc3RfZmllbGQ9bnVsbCwKKyAgICAgICAgYmluYXJ5X2ZpZWxkPW51bGwKKyAgICAgIH0KKyAgICApfSwKKyAgICB7IlhjZXB0aW9uIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7J3RocmlmdC50ZXN0LlhjZXB0aW9uJywgXywgX30sCisgICAgICAjJ3RocmlmdC50ZXN0LlhjZXB0aW9uJ3tlcnJvckNvZGU9bnVsbCxtZXNzYWdlPW51bGx9CisgICAgKX0sCisgICAgeyJYY2VwdGlvbjIgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsndGhyaWZ0LnRlc3QuWGNlcHRpb24yJywgXywgX30sCisgICAgICAjJ3RocmlmdC50ZXN0LlhjZXB0aW9uMid7ZXJyb3JDb2RlPW51bGwsc3RydWN0X3RoaW5nPW51bGx9CisgICAgKX0sCisgICAgeyJFbXB0eVN0cnVjdCByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKHsndGhyaWZ0LnRlc3QuRW1wdHlTdHJ1Y3QnfSwgIyd0aHJpZnQudGVzdC5FbXB0eVN0cnVjdCd7fSl9LAorICAgIHsiT25lRmllbGQgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCh7J3RocmlmdC50ZXN0Lk9uZUZpZWxkJywgX30sICMndGhyaWZ0LnRlc3QuT25lRmllbGQne2ZpZWxkPW51bGx9KX0sCisgICAgeyJWZXJzaW9uaW5nVGVzdFYxIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7J3RocmlmdC50ZXN0LlZlcnNpb25pbmdUZXN0VjEnLCBfLCBfLCBffSwKKyAgICAgICMndGhyaWZ0LnRlc3QuVmVyc2lvbmluZ1Rlc3RWMSd7YmVnaW5faW5fYm90aD1udWxsLG9sZF9zdHJpbmc9bnVsbCxlbmRfaW5fYm90aD1udWxsfQorICAgICl9LAorICAgIHsiVmVyc2lvbmluZ1Rlc3RWMiByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeyd0aHJpZnQudGVzdC5WZXJzaW9uaW5nVGVzdFYyJywgXywgXywgXywgXywgXywgXywgXywgXywgXywgXywgXywgX30sCisgICAgICAjJ3RocmlmdC50ZXN0LlZlcnNpb25pbmdUZXN0VjIneworICAgICAgICBiZWdpbl9pbl9ib3RoPW51bGwsCisgICAgICAgIG5ld2ludD1udWxsLAorICAgICAgICBuZXdieXRlPW51bGwsCisgICAgICAgIG5ld3Nob3J0PW51bGwsCisgICAgICAgIG5ld2xvbmc9bnVsbCwKKyAgICAgICAgbmV3ZG91YmxlPW51bGwsCisgICAgICAgIG5ld3N0cnVjdD1udWxsLAorICAgICAgICBuZXdsaXN0PW51bGwsCisgICAgICAgIG5ld3NldD1udWxsLAorICAgICAgICBuZXdtYXA9bnVsbCwKKyAgICAgICAgbmV3c3RyaW5nPW51bGwsCisgICAgICAgIGVuZF9pbl9ib3RoPW51bGwKKyAgICAgIH0KKyAgICApfSwKKyAgICB7Ikxpc3RUeXBlVmVyc2lvbmluZ1YxIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7J3RocmlmdC50ZXN0Lkxpc3RUeXBlVmVyc2lvbmluZ1YxJywgXywgX30sCisgICAgICAjJ3RocmlmdC50ZXN0Lkxpc3RUeXBlVmVyc2lvbmluZ1YxJ3tteWludHM9bnVsbCxoZWxsbz1udWxsfQorICAgICl9LAorICAgIHsiTGlzdFR5cGVWZXJzaW9uaW5nVjIgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsndGhyaWZ0LnRlc3QuTGlzdFR5cGVWZXJzaW9uaW5nVjInLCBfLCBffSwKKyAgICAgICMndGhyaWZ0LnRlc3QuTGlzdFR5cGVWZXJzaW9uaW5nVjIne3N0cmluZ3M9bnVsbCxoZWxsbz1udWxsfQorICAgICl9LAorICAgIHsiR3Vlc3NQcm90b2NvbFN0cnVjdCByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeyd0aHJpZnQudGVzdC5HdWVzc1Byb3RvY29sU3RydWN0JywgX30sCisgICAgICAjJ3RocmlmdC50ZXN0Lkd1ZXNzUHJvdG9jb2xTdHJ1Y3Qne21hcF9maWVsZD1udWxsfQorICAgICl9LAorICAgIHsiTGFyZ2VEZWx0YXMgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsndGhyaWZ0LnRlc3QuTGFyZ2VEZWx0YXMnLCBfLCBfLCBfLCBfLCBfLCBfLCBfLCBfLCBfLCBffSwKKyAgICAgICMndGhyaWZ0LnRlc3QuTGFyZ2VEZWx0YXMneworICAgICAgICBiMT1udWxsLAorICAgICAgICBiMTA9bnVsbCwKKyAgICAgICAgYjEwMD1udWxsLAorICAgICAgICBjaGVja190cnVlPW51bGwsCisgICAgICAgIGIxMDAwPW51bGwsCisgICAgICAgIGNoZWNrX2ZhbHNlPW51bGwsCisgICAgICAgIHZlcnR3bzIwMDA9bnVsbCwKKyAgICAgICAgYV9zZXQyNTAwPW51bGwsCisgICAgICAgIHZlcnR3bzMwMDA9bnVsbCwKKyAgICAgICAgYmlnX251bWJlcnM9bnVsbAorICAgICAgfQorICAgICl9LAorICAgIHsiTmVzdGVkTGlzdHNJMzJ4MiByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeyd0aHJpZnQudGVzdC5OZXN0ZWRMaXN0c0kzMngyJywgX30sCisgICAgICAjJ3RocmlmdC50ZXN0Lk5lc3RlZExpc3RzSTMyeDIne2ludGVnZXJsaXN0PW51bGx9CisgICAgKX0sCisgICAgeyJOZXN0ZWRMaXN0c0kzMngzIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7J3RocmlmdC50ZXN0Lk5lc3RlZExpc3RzSTMyeDMnLCBffSwKKyAgICAgICMndGhyaWZ0LnRlc3QuTmVzdGVkTGlzdHNJMzJ4Myd7aW50ZWdlcmxpc3Q9bnVsbH0KKyAgICApfSwKKyAgICB7Ik5lc3RlZE1peGVkeDIgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsndGhyaWZ0LnRlc3QuTmVzdGVkTWl4ZWR4MicsIF8sIF8sIF99LAorICAgICAgIyd0aHJpZnQudGVzdC5OZXN0ZWRNaXhlZHgyJ3sKKyAgICAgICAgaW50X3NldF9saXN0PW51bGwsCisgICAgICAgIG1hcF9pbnRfc3Ryc2V0PW51bGwsCisgICAgICAgIG1hcF9pbnRfc3Ryc2V0X2xpc3Q9bnVsbAorICAgICAgfQorICAgICl9LAorICAgIHsiTGlzdEJvbmtzIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goeyd0aHJpZnQudGVzdC5MaXN0Qm9ua3MnLCBffSwgIyd0aHJpZnQudGVzdC5MaXN0Qm9ua3Mne2Jvbms9bnVsbH0pfSwKKyAgICB7Ik5lc3RlZExpc3RzQm9uayByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeyd0aHJpZnQudGVzdC5OZXN0ZWRMaXN0c0JvbmsnLCBffSwKKyAgICAgICMndGhyaWZ0LnRlc3QuTmVzdGVkTGlzdHNCb25rJ3tib25rPW51bGx9CisgICAgKX0sCisgICAgeyJCb29sVGVzdCByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeyd0aHJpZnQudGVzdC5Cb29sVGVzdCcsIF8sIF99LAorICAgICAgIyd0aHJpZnQudGVzdC5Cb29sVGVzdCd7Yj1udWxsLHM9bnVsbH0KKyAgICApfSwKKyAgICB7IlN0cnVjdEEgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCh7J3RocmlmdC50ZXN0LlN0cnVjdEEnLCBffSwgIyd0aHJpZnQudGVzdC5TdHJ1Y3RBJ3tzPW51bGx9KX0sCisgICAgeyJTdHJ1Y3RCIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7J3RocmlmdC50ZXN0LlN0cnVjdEInLCBfLCBffSwKKyAgICAgICMndGhyaWZ0LnRlc3QuU3RydWN0Qid7YWE9bnVsbCxhYj1udWxsfQorICAgICl9CisgIF0uCisKK3N0cnVjdF9pbmZvX3Rlc3RfKCkgLT4KKyAgWworICAgIHsiQm9uayBkZWZpbml0aW9uIChzaG9ydCB2ZXJzaW9uKSIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbezEsIHN0cmluZ30sIHsyLCBpMzJ9XX0sCisgICAgICB0aHJpZnRfdGVzdF90eXBlczpzdHJ1Y3RfaW5mbygndGhyaWZ0LnRlc3QuQm9uaycpCisgICAgKX0sCisgICAgeyJCb25rIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgdW5kZWZpbmVkLCBzdHJpbmcsIG1lc3NhZ2UsIHVuZGVmaW5lZH0sCisgICAgICAgIHsyLCB1bmRlZmluZWQsIGkzMiwgdHlwZSwgdW5kZWZpbmVkfQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ3RocmlmdC50ZXN0LkJvbmsnKQorICAgICl9LAorICAgIHsiQm9vbHMgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB1bmRlZmluZWQsIGJvb2wsIGltX3RydWUsIHVuZGVmaW5lZH0sCisgICAgICAgIHsyLCB1bmRlZmluZWQsIGJvb2wsIGltX2ZhbHNlLCB1bmRlZmluZWR9CisgICAgICBdfSwKKyAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgndGhyaWZ0LnRlc3QuQm9vbHMnKQorICAgICl9LAorICAgIHsiWHRydWN0IGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgdW5kZWZpbmVkLCBzdHJpbmcsIHN0cmluZ190aGluZywgdW5kZWZpbmVkfSwKKyAgICAgICAgezQsIHVuZGVmaW5lZCwgYnl0ZSwgYnl0ZV90aGluZywgdW5kZWZpbmVkfSwKKyAgICAgICAgezksIHVuZGVmaW5lZCwgaTMyLCBpMzJfdGhpbmcsIHVuZGVmaW5lZH0sCisgICAgICAgIHsxMSwgdW5kZWZpbmVkLCBpNjQsIGk2NF90aGluZywgdW5kZWZpbmVkfQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ3RocmlmdC50ZXN0Llh0cnVjdCcpCisgICAgKX0sCisgICAgeyJYdHJ1Y3QyIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgdW5kZWZpbmVkLCBieXRlLCBieXRlX3RoaW5nLCB1bmRlZmluZWR9LAorICAgICAgICB7MiwgdW5kZWZpbmVkLCB7c3RydWN0LCB7J3RocmlmdF90ZXN0X3R5cGVzJywgJ3RocmlmdC50ZXN0Llh0cnVjdCd9fSwgc3RydWN0X3RoaW5nLCAjJ3RocmlmdC50ZXN0Llh0cnVjdCd7fX0sCisgICAgICAgIHszLCB1bmRlZmluZWQsIGkzMiwgaTMyX3RoaW5nLCB1bmRlZmluZWR9CisgICAgICBdfSwKKyAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgndGhyaWZ0LnRlc3QuWHRydWN0MicpCisgICAgKX0sCisgICAgeyJYdHJ1Y3QzIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgdW5kZWZpbmVkLCBzdHJpbmcsIHN0cmluZ190aGluZywgdW5kZWZpbmVkfSwKKyAgICAgICAgezQsIHVuZGVmaW5lZCwgaTMyLCBjaGFuZ2VkLCB1bmRlZmluZWR9LAorICAgICAgICB7OSwgdW5kZWZpbmVkLCBpMzIsIGkzMl90aGluZywgdW5kZWZpbmVkfSwKKyAgICAgICAgezExLCB1bmRlZmluZWQsIGk2NCwgaTY0X3RoaW5nLCB1bmRlZmluZWR9CisgICAgICBdfSwKKyAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgndGhyaWZ0LnRlc3QuWHRydWN0MycpCisgICAgKX0sCisgICAgeyJJbnNhbml0eSBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHVuZGVmaW5lZCwge21hcCwgaTMyLCBpNjR9LCB1c2VyTWFwLCBkaWN0Om5ldygpfSwKKyAgICAgICAgezIsIHVuZGVmaW5lZCwge2xpc3QsIHtzdHJ1Y3QsIHsndGhyaWZ0X3Rlc3RfdHlwZXMnLCAndGhyaWZ0LnRlc3QuWHRydWN0J319fSwgeHRydWN0cywgW119CisgICAgICBdfSwKKyAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgndGhyaWZ0LnRlc3QuSW5zYW5pdHknKQorICAgICl9LAorICAgIHsiQ3JhenlOZXN0aW5nIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgdW5kZWZpbmVkLCBzdHJpbmcsIHN0cmluZ19maWVsZCwgdW5kZWZpbmVkfSwKKyAgICAgICAgezIsIG9wdGlvbmFsLCB7c2V0LCB7c3RydWN0LCB7J3RocmlmdF90ZXN0X3R5cGVzJywgJ3RocmlmdC50ZXN0Lkluc2FuaXR5J319fSwgc2V0X2ZpZWxkLCBzZXRzOm5ldygpfSwKKyAgICAgICAgezMsIHJlcXVpcmVkLCB7bGlzdCwge21hcCwKKyAgICAgICAgICB7c2V0LCBpMzJ9LAorICAgICAgICAgIHttYXAsIGkzMiwge3NldCwge2xpc3QsIHttYXAsIHtzdHJ1Y3QsIHsndGhyaWZ0X3Rlc3RfdHlwZXMnLCAndGhyaWZ0LnRlc3QuSW5zYW5pdHknfX0sIHN0cmluZ319fX0KKyAgICAgICAgfX0sIGxpc3RfZmllbGQsIFtdfSwKKyAgICAgICAgezQsIHVuZGVmaW5lZCwgc3RyaW5nLCBiaW5hcnlfZmllbGQsIHVuZGVmaW5lZH0KKyAgICAgIF19LAorICAgICAgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCd0aHJpZnQudGVzdC5DcmF6eU5lc3RpbmcnKQorICAgICl9LAorICAgIHsiWGNlcHRpb24gZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB1bmRlZmluZWQsIGkzMiwgZXJyb3JDb2RlLCB1bmRlZmluZWR9LAorICAgICAgICB7MiwgdW5kZWZpbmVkLCBzdHJpbmcsIG1lc3NhZ2UsIHVuZGVmaW5lZH0KKyAgICAgIF19LAorICAgICAgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCd0aHJpZnQudGVzdC5YY2VwdGlvbicpCisgICAgKX0sCisgICAgeyJYY2VwdGlvbjIgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB1bmRlZmluZWQsIGkzMiwgZXJyb3JDb2RlLCB1bmRlZmluZWR9LAorICAgICAgICB7MiwgdW5kZWZpbmVkLCB7c3RydWN0LCB7J3RocmlmdF90ZXN0X3R5cGVzJywgJ3RocmlmdC50ZXN0Llh0cnVjdCd9fSwgc3RydWN0X3RoaW5nLCAjJ3RocmlmdC50ZXN0Llh0cnVjdCd7fX0KKyAgICAgIF19LAorICAgICAgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCd0aHJpZnQudGVzdC5YY2VwdGlvbjInKQorICAgICl9LAorICAgIHsiRW1wdHlTdHJ1Y3QgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbXX0sCisgICAgICB0aHJpZnRfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ3RocmlmdC50ZXN0LkVtcHR5U3RydWN0JykKKyAgICApfSwKKyAgICB7Ik9uZUZpZWxkIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgdW5kZWZpbmVkLCB7c3RydWN0LCB7J3RocmlmdF90ZXN0X3R5cGVzJywgJ3RocmlmdC50ZXN0LkVtcHR5U3RydWN0J319LCBmaWVsZCwgIyd0aHJpZnQudGVzdC5FbXB0eVN0cnVjdCd7fX0KKyAgICAgIF19LAorICAgICAgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCd0aHJpZnQudGVzdC5PbmVGaWVsZCcpCisgICAgKX0sCisgICAgeyJWZXJzaW9uaW5nVGVzdFYxIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgdW5kZWZpbmVkLCBpMzIsIGJlZ2luX2luX2JvdGgsIHVuZGVmaW5lZH0sCisgICAgICAgIHszLCB1bmRlZmluZWQsIHN0cmluZywgb2xkX3N0cmluZywgdW5kZWZpbmVkfSwKKyAgICAgICAgezEyLCB1bmRlZmluZWQsIGkzMiwgZW5kX2luX2JvdGgsIHVuZGVmaW5lZH0KKyAgICAgIF19LAorICAgICAgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCd0aHJpZnQudGVzdC5WZXJzaW9uaW5nVGVzdFYxJykKKyAgICApfSwKKyAgICB7IlZlcnNpb25pbmdUZXN0VjIgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB1bmRlZmluZWQsIGkzMiwgYmVnaW5faW5fYm90aCwgdW5kZWZpbmVkfSwKKyAgICAgICAgezIsIHVuZGVmaW5lZCwgaTMyLCBuZXdpbnQsIHVuZGVmaW5lZH0sCisgICAgICAgIHszLCB1bmRlZmluZWQsIGJ5dGUsIG5ld2J5dGUsIHVuZGVmaW5lZH0sCisgICAgICAgIHs0LCB1bmRlZmluZWQsIGkxNiwgbmV3c2hvcnQsIHVuZGVmaW5lZH0sCisgICAgICAgIHs1LCB1bmRlZmluZWQsIGk2NCwgbmV3bG9uZywgdW5kZWZpbmVkfSwKKyAgICAgICAgezYsIHVuZGVmaW5lZCwgZG91YmxlLCBuZXdkb3VibGUsIHVuZGVmaW5lZH0sCisgICAgICAgIHs3LCB1bmRlZmluZWQsIHtzdHJ1Y3QsIHt0aHJpZnRfdGVzdF90eXBlcywgJ3RocmlmdC50ZXN0LkJvbmsnfX0sIG5ld3N0cnVjdCwgIyd0aHJpZnQudGVzdC5Cb25rJ3t9fSwKKyAgICAgICAgezgsIHVuZGVmaW5lZCwge2xpc3QsIGkzMn0sIG5ld2xpc3QsIFtdfSwKKyAgICAgICAgezksIHVuZGVmaW5lZCwge3NldCwgaTMyfSwgbmV3c2V0LCBzZXRzOm5ldygpfSwKKyAgICAgICAgezEwLCB1bmRlZmluZWQsIHttYXAsIGkzMiwgaTMyfSwgbmV3bWFwLCBkaWN0Om5ldygpfSwKKyAgICAgICAgezExLCB1bmRlZmluZWQsIHN0cmluZywgbmV3c3RyaW5nLCB1bmRlZmluZWR9LAorICAgICAgICB7MTIsIHVuZGVmaW5lZCwgaTMyLCBlbmRfaW5fYm90aCwgdW5kZWZpbmVkfQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ3RocmlmdC50ZXN0LlZlcnNpb25pbmdUZXN0VjInKQorICAgICl9LAorICAgIHsiTGlzdFR5cGVWZXJzaW9uaW5nVjEgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB1bmRlZmluZWQsIHtsaXN0LCBpMzJ9LCBteWludHMsIFtdfSwKKyAgICAgICAgezIsIHVuZGVmaW5lZCwgc3RyaW5nLCBoZWxsbywgdW5kZWZpbmVkfQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ3RocmlmdC50ZXN0Lkxpc3RUeXBlVmVyc2lvbmluZ1YxJykKKyAgICApfSwKKyAgICB7Ikxpc3RUeXBlVmVyc2lvbmluZ1YyIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgdW5kZWZpbmVkLCB7bGlzdCwgc3RyaW5nfSwgc3RyaW5ncywgW119LAorICAgICAgICB7MiwgdW5kZWZpbmVkLCBzdHJpbmcsIGhlbGxvLCB1bmRlZmluZWR9CisgICAgICBdfSwKKyAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgndGhyaWZ0LnRlc3QuTGlzdFR5cGVWZXJzaW9uaW5nVjInKQorICAgICl9LAorICAgIHsiR3Vlc3NQcm90b2NvbFN0cnVjdCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezcsIHVuZGVmaW5lZCwge21hcCwgc3RyaW5nLCBzdHJpbmd9LCBtYXBfZmllbGQsIGRpY3Q6bmV3KCl9CisgICAgICBdfSwKKyAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgndGhyaWZ0LnRlc3QuR3Vlc3NQcm90b2NvbFN0cnVjdCcpCisgICAgKX0sCisgICAgeyJMYXJnZURlbHRhcyBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHVuZGVmaW5lZCwge3N0cnVjdCwge3RocmlmdF90ZXN0X3R5cGVzLCAndGhyaWZ0LnRlc3QuQm9vbHMnfX0sIGIxLCAjJ3RocmlmdC50ZXN0LkJvb2xzJ3t9fSwKKyAgICAgICAgezEwLCB1bmRlZmluZWQsIHtzdHJ1Y3QsIHt0aHJpZnRfdGVzdF90eXBlcywgJ3RocmlmdC50ZXN0LkJvb2xzJ319LCBiMTAsICMndGhyaWZ0LnRlc3QuQm9vbHMne319LAorICAgICAgICB7MTAwLCB1bmRlZmluZWQsIHtzdHJ1Y3QsIHt0aHJpZnRfdGVzdF90eXBlcywgJ3RocmlmdC50ZXN0LkJvb2xzJ319LCBiMTAwLCAjJ3RocmlmdC50ZXN0LkJvb2xzJ3t9fSwKKyAgICAgICAgezUwMCwgdW5kZWZpbmVkLCBib29sLCBjaGVja190cnVlLCB1bmRlZmluZWR9LAorICAgICAgICB7MTAwMCwgdW5kZWZpbmVkLCB7c3RydWN0LCB7dGhyaWZ0X3Rlc3RfdHlwZXMsICd0aHJpZnQudGVzdC5Cb29scyd9fSwgYjEwMDAsICMndGhyaWZ0LnRlc3QuQm9vbHMne319LAorICAgICAgICB7MTUwMCwgdW5kZWZpbmVkLCBib29sLCBjaGVja19mYWxzZSwgdW5kZWZpbmVkfSwKKyAgICAgICAgezIwMDAsIHVuZGVmaW5lZCwge3N0cnVjdCwge3RocmlmdF90ZXN0X3R5cGVzLCAndGhyaWZ0LnRlc3QuVmVyc2lvbmluZ1Rlc3RWMid9fSwgdmVydHdvMjAwMCwgIyd0aHJpZnQudGVzdC5WZXJzaW9uaW5nVGVzdFYyJ3t9fSwKKyAgICAgICAgezI1MDAsIHVuZGVmaW5lZCwge3NldCwgc3RyaW5nfSwgYV9zZXQyNTAwLCBzZXRzOm5ldygpfSwKKyAgICAgICAgezMwMDAsIHVuZGVmaW5lZCwge3N0cnVjdCwge3RocmlmdF90ZXN0X3R5cGVzLCAndGhyaWZ0LnRlc3QuVmVyc2lvbmluZ1Rlc3RWMid9fSwgdmVydHdvMzAwMCwgIyd0aHJpZnQudGVzdC5WZXJzaW9uaW5nVGVzdFYyJ3t9fSwKKyAgICAgICAgezQwMDAsIHVuZGVmaW5lZCwge2xpc3QsIGkzMn0sIGJpZ19udW1iZXJzLCBbXX0KKyAgICAgIF19LAorICAgICAgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCd0aHJpZnQudGVzdC5MYXJnZURlbHRhcycpCisgICAgKX0sCisgICAgeyJOZXN0ZWRMaXN0c0kzMngyIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgdW5kZWZpbmVkLCB7bGlzdCwge2xpc3QsIGkzMn19LCBpbnRlZ2VybGlzdCwgW119CisgICAgICBdfSwKKyAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgndGhyaWZ0LnRlc3QuTmVzdGVkTGlzdHNJMzJ4MicpCisgICAgKX0sCisgICAgeyJOZXN0ZWRMaXN0c0kzMngzIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgdW5kZWZpbmVkLCB7bGlzdCwge2xpc3QsIHtsaXN0LCBpMzJ9fX0sIGludGVnZXJsaXN0LCBbXX0KKyAgICAgIF19LAorICAgICAgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCd0aHJpZnQudGVzdC5OZXN0ZWRMaXN0c0kzMngzJykKKyAgICApfSwKKyAgICB7Ik5lc3RlZE1peGVkeDIgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB1bmRlZmluZWQsIHtsaXN0LCB7c2V0LCBpMzJ9fSwgaW50X3NldF9saXN0LCBbXX0sCisgICAgICAgIHsyLCB1bmRlZmluZWQsIHttYXAsIGkzMiwge3NldCwgc3RyaW5nfX0sIG1hcF9pbnRfc3Ryc2V0LCBkaWN0Om5ldygpfSwKKyAgICAgICAgezMsIHVuZGVmaW5lZCwge2xpc3QsIHttYXAsIGkzMiwge3NldCwgc3RyaW5nfX19LCBtYXBfaW50X3N0cnNldF9saXN0LCBbXX0KKyAgICAgIF19LAorICAgICAgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCd0aHJpZnQudGVzdC5OZXN0ZWRNaXhlZHgyJykKKyAgICApfSwKKyAgICB7Ikxpc3RCb25rcyBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHVuZGVmaW5lZCwge2xpc3QsIHtzdHJ1Y3QsIHt0aHJpZnRfdGVzdF90eXBlcywgJ3RocmlmdC50ZXN0LkJvbmsnfX19LCBib25rLCBbXX0KKyAgICAgIF19LAorICAgICAgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCd0aHJpZnQudGVzdC5MaXN0Qm9ua3MnKQorICAgICl9LAorICAgIHsiTmVzdGVkTGlzdHNCb25rIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgdW5kZWZpbmVkLCB7bGlzdCwge2xpc3QsIHtsaXN0LCB7c3RydWN0LCB7dGhyaWZ0X3Rlc3RfdHlwZXMsICd0aHJpZnQudGVzdC5Cb25rJ319fX19LCBib25rLCBbXX0KKyAgICAgIF19LAorICAgICAgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCd0aHJpZnQudGVzdC5OZXN0ZWRMaXN0c0JvbmsnKQorICAgICl9LAorICAgIHsiQm9vbFRlc3QgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCBvcHRpb25hbCwgYm9vbCwgYiwgdHJ1ZX0sCisgICAgICAgIHsyLCBvcHRpb25hbCwgc3RyaW5nLCBzLCAidHJ1ZSJ9CisgICAgICBdfSwKKyAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgndGhyaWZ0LnRlc3QuQm9vbFRlc3QnKQorICAgICl9LAorICAgIHsiU3RydWN0QSBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFt7MSwgcmVxdWlyZWQsIHN0cmluZywgcywgdW5kZWZpbmVkfV19LAorICAgICAgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCd0aHJpZnQudGVzdC5TdHJ1Y3RBJykKKyAgICApfSwKKyAgICB7IlN0cnVjdEIgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCBvcHRpb25hbCwge3N0cnVjdCwge3RocmlmdF90ZXN0X3R5cGVzLCAndGhyaWZ0LnRlc3QuU3RydWN0QSd9fSwgYWEsICMndGhyaWZ0LnRlc3QuU3RydWN0QSd7fX0sCisgICAgICAgIHsyLCByZXF1aXJlZCwge3N0cnVjdCwge3RocmlmdF90ZXN0X3R5cGVzLCAndGhyaWZ0LnRlc3QuU3RydWN0QSd9fSwgYWIsICMndGhyaWZ0LnRlc3QuU3RydWN0QSd7fX0KKyAgICAgIF19LAorICAgICAgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCd0aHJpZnQudGVzdC5TdHJ1Y3RCJykKKyAgICApfQorICBdLgorCitzZXJ2aWNlX2luZm9fdGVzdF8oKSAtPgorICBbCisgICAgeyJ0ZXN0Vm9pZCBwYXJhbXMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW119LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdFZvaWQsIHBhcmFtc190eXBlKQorICAgICl9LAorICAgIHsidGVzdFZvaWQgcmVwbHkiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW119LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdFZvaWQsIHJlcGx5X3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0Vm9pZCBleGNlcHRpb25zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFtdfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RWb2lkLCBleGNlcHRpb25zKQorICAgICl9LAorICAgIHsidGVzdFN0cmluZyBwYXJhbXMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW3sxLCBzdHJpbmd9XX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0U3RyaW5nLCBwYXJhbXNfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3RTdHJpbmcgcmVwbHkiLCA/X2Fzc2VydEVxdWFsKAorICAgICAgc3RyaW5nLAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdFN0cmluZywgcmVwbHlfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3RTdHJpbmcgZXhjZXB0aW9ucyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbXX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0U3RyaW5nLCBleGNlcHRpb25zKQorICAgICl9LAorICAgIHsidGVzdEJ5dGUgcGFyYW1zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFt7MSwgYnl0ZX1dfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RCeXRlLCBwYXJhbXNfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3RCeXRlIHJlcGx5IiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIGJ5dGUsCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0Qnl0ZSwgcmVwbHlfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3RCeXRlIGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW119LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdEJ5dGUsIGV4Y2VwdGlvbnMpCisgICAgKX0sCisgICAgeyJ0ZXN0STMyIHBhcmFtcyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbezEsIGkzMn1dfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RJMzIsIHBhcmFtc190eXBlKQorICAgICl9LAorICAgIHsidGVzdEkzMiByZXBseSIsID9fYXNzZXJ0RXF1YWwoCisgICAgICBpMzIsCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0STMyLCByZXBseV90eXBlKQorICAgICl9LAorICAgIHsidGVzdEkzMiBleGNlcHRpb25zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFtdfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RJMzIsIGV4Y2VwdGlvbnMpCisgICAgKX0sCisgICAgeyJ0ZXN0STY0IHBhcmFtcyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbezEsIGk2NH1dfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RJNjQsIHBhcmFtc190eXBlKQorICAgICl9LAorICAgIHsidGVzdEk2NCByZXBseSIsID9fYXNzZXJ0RXF1YWwoCisgICAgICBpNjQsCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0STY0LCByZXBseV90eXBlKQorICAgICl9LAorICAgIHsidGVzdEk2NCBleGNlcHRpb25zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFtdfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RJNjQsIGV4Y2VwdGlvbnMpCisgICAgKX0sCisgICAgeyJ0ZXN0RG91YmxlIHBhcmFtcyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbezEsIGRvdWJsZX1dfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3REb3VibGUsIHBhcmFtc190eXBlKQorICAgICl9LAorICAgIHsidGVzdERvdWJsZSByZXBseSIsID9fYXNzZXJ0RXF1YWwoCisgICAgICBkb3VibGUsCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0RG91YmxlLCByZXBseV90eXBlKQorICAgICl9LAorICAgIHsidGVzdERvdWJsZSBleGNlcHRpb25zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFtdfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3REb3VibGUsIGV4Y2VwdGlvbnMpCisgICAgKX0sCisgICAgeyJ0ZXN0U3RydWN0IHBhcmFtcyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB7c3RydWN0LCB7dGhyaWZ0X3Rlc3RfdHlwZXMsICd0aHJpZnQudGVzdC5YdHJ1Y3QnfX19CisgICAgICBdfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RTdHJ1Y3QsIHBhcmFtc190eXBlKQorICAgICl9LAorICAgIHsidGVzdFN0cnVjdCByZXBseSIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCB7dGhyaWZ0X3Rlc3RfdHlwZXMsICd0aHJpZnQudGVzdC5YdHJ1Y3QnfX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0U3RydWN0LCByZXBseV90eXBlKQorICAgICl9LAorICAgIHsidGVzdFN0cnVjdCBleGNlcHRpb25zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFtdfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RTdHJ1Y3QsIGV4Y2VwdGlvbnMpCisgICAgKX0sCisgICAgeyJ0ZXN0TmVzdCBwYXJhbXMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwge3N0cnVjdCwge3RocmlmdF90ZXN0X3R5cGVzLCAndGhyaWZ0LnRlc3QuWHRydWN0Mid9fX0KKyAgICAgIF19LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdE5lc3QsIHBhcmFtc190eXBlKQorICAgICl9LAorICAgIHsidGVzdE5lc3QgcmVwbHkiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwge3RocmlmdF90ZXN0X3R5cGVzLCAndGhyaWZ0LnRlc3QuWHRydWN0Mid9fSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3ROZXN0LCByZXBseV90eXBlKQorICAgICl9LAorICAgIHsidGVzdE5lc3QgZXhjZXB0aW9ucyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbXX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0TmVzdCwgZXhjZXB0aW9ucykKKyAgICApfSwKKyAgICB7InRlc3RNYXAgcGFyYW1zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHttYXAsIGkzMiwgaTMyfX0KKyAgICAgIF19LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdE1hcCwgcGFyYW1zX3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0TWFwIHJlcGx5IiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHttYXAsIGkzMiwgaTMyfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RNYXAsIHJlcGx5X3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0TWFwIGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW119LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdE1hcCwgZXhjZXB0aW9ucykKKyAgICApfSwKKyAgICB7InRlc3RTdHJpbmdNYXAgcGFyYW1zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHttYXAsIHN0cmluZywgc3RyaW5nfX0KKyAgICAgIF19LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdFN0cmluZ01hcCwgcGFyYW1zX3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0U3RyaW5nTWFwIHJlcGx5IiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHttYXAsIHN0cmluZywgc3RyaW5nfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RTdHJpbmdNYXAsIHJlcGx5X3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0U3RyaW5nTWFwIGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW119LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdFN0cmluZ01hcCwgZXhjZXB0aW9ucykKKyAgICApfSwKKyAgICB7InRlc3RTZXQgcGFyYW1zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHtzZXQsIGkzMn19CisgICAgICBdfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RTZXQsIHBhcmFtc190eXBlKQorICAgICl9LAorICAgIHsidGVzdFNldCByZXBseSIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c2V0LCBpMzJ9LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdFNldCwgcmVwbHlfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3RTZXQgZXhjZXB0aW9ucyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbXX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0U2V0LCBleGNlcHRpb25zKQorICAgICl9LAorICAgIHsidGVzdExpc3QgcGFyYW1zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHtsaXN0LCBpMzJ9fQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0TGlzdCwgcGFyYW1zX3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0TGlzdCByZXBseSIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7bGlzdCwgaTMyfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RMaXN0LCByZXBseV90eXBlKQorICAgICl9LAorICAgIHsidGVzdExpc3QgZXhjZXB0aW9ucyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbXX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0TGlzdCwgZXhjZXB0aW9ucykKKyAgICApfSwKKyAgICB7InRlc3RFbnVtIHBhcmFtcyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCBpMzJ9CisgICAgICBdfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RFbnVtLCBwYXJhbXNfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3RFbnVtIHJlcGx5IiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIGkzMiwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RFbnVtLCByZXBseV90eXBlKQorICAgICl9LAorICAgIHsidGVzdEVudW0gZXhjZXB0aW9ucyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbXX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0RW51bSwgZXhjZXB0aW9ucykKKyAgICApfSwKKyAgICB7InRlc3RUeXBlZGVmIHBhcmFtcyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbezEsIGk2NH1dfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RUeXBlZGVmLCBwYXJhbXNfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3RUeXBlZGVmIHJlcGx5IiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIGk2NCwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RUeXBlZGVmLCByZXBseV90eXBlKQorICAgICl9LAorICAgIHsidGVzdFR5cGVkZWYgZXhjZXB0aW9ucyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbXX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0VHlwZWRlZiwgZXhjZXB0aW9ucykKKyAgICApfSwKKyAgICB7InRlc3RNYXBNYXAgcGFyYW1zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIGkzMn0KKyAgICAgIF19LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdE1hcE1hcCwgcGFyYW1zX3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0TWFwTWFwIHJlcGx5IiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHttYXAsIGkzMiwge21hcCwgaTMyLGkzMn19LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdE1hcE1hcCwgcmVwbHlfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3RNYXBNYXAgZXhjZXB0aW9ucyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbXX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0TWFwTWFwLCBleGNlcHRpb25zKQorICAgICl9LAorICAgIHsidGVzdEluc2FuaXR5IHBhcmFtcyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB7c3RydWN0LCB7dGhyaWZ0X3Rlc3RfdHlwZXMsICd0aHJpZnQudGVzdC5JbnNhbml0eSd9fX0KKyAgICAgIF19LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdEluc2FuaXR5LCBwYXJhbXNfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3RJbnNhbml0eSByZXBseSIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7bWFwLCBpNjQsIHttYXAsIGkzMiwge3N0cnVjdCwgeyd0aHJpZnRfdGVzdF90eXBlcycsICd0aHJpZnQudGVzdC5JbnNhbml0eSd9fX19LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdEluc2FuaXR5LCByZXBseV90eXBlKQorICAgICl9LAorICAgIHsidGVzdEluc2FuaXR5IGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW119LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdEluc2FuaXR5LCBleGNlcHRpb25zKQorICAgICl9LAorICAgIHsidGVzdE11bHRpIHBhcmFtcyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCBieXRlfSwKKyAgICAgICAgezIsIGkzMn0sCisgICAgICAgIHszLCBpNjR9LAorICAgICAgICB7NCwge21hcCwgaTE2LCBzdHJpbmd9fSwKKyAgICAgICAgezUsIGkzMn0sCisgICAgICAgIHs2LCBpNjR9CisgICAgICBdfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RNdWx0aSwgcGFyYW1zX3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0TXVsdGkgcmVwbHkiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwge3RocmlmdF90ZXN0X3R5cGVzLCAndGhyaWZ0LnRlc3QuWHRydWN0J319LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdE11bHRpLCByZXBseV90eXBlKQorICAgICl9LAorICAgIHsidGVzdE11bHRpIGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW119LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdE11bHRpLCBleGNlcHRpb25zKQorICAgICl9LAorICAgIHsidGVzdEV4Y2VwdGlvbiBwYXJhbXMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW3sxLCBzdHJpbmd9XX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0RXhjZXB0aW9uLCBwYXJhbXNfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3RFeGNlcHRpb24gcmVwbHkiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW119LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdEV4Y2VwdGlvbiwgcmVwbHlfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3RFeGNlcHRpb24gZXhjZXB0aW9ucyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB7c3RydWN0LCB7dGhyaWZ0X3Rlc3RfdHlwZXMsICd0aHJpZnQudGVzdC5YY2VwdGlvbid9fX0KKyAgICAgIF19LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdEV4Y2VwdGlvbiwgZXhjZXB0aW9ucykKKyAgICApfSwKKyAgICB7InRlc3RNdWx0aUV4Y2VwdGlvbiBwYXJhbXMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW3sxLCBzdHJpbmd9LCB7Miwgc3RyaW5nfV19LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdE11bHRpRXhjZXB0aW9uLCBwYXJhbXNfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3RNdWx0aUV4Y2VwdGlvbiByZXBseSIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCB7dGhyaWZ0X3Rlc3RfdHlwZXMsICd0aHJpZnQudGVzdC5YdHJ1Y3QnfX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0TXVsdGlFeGNlcHRpb24sIHJlcGx5X3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0TXVsdGlFeGNlcHRpb24gZXhjZXB0aW9ucyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB7c3RydWN0LCB7dGhyaWZ0X3Rlc3RfdHlwZXMsICd0aHJpZnQudGVzdC5YY2VwdGlvbid9fX0sCisgICAgICAgIHsyLCB7c3RydWN0LCB7dGhyaWZ0X3Rlc3RfdHlwZXMsICd0aHJpZnQudGVzdC5YY2VwdGlvbjInfX19CisgICAgICBdfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RNdWx0aUV4Y2VwdGlvbiwgZXhjZXB0aW9ucykKKyAgICApfSwKKyAgICB7InRlc3RPbmV3YXkgcGFyYW1zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFt7MSwgaTMyfV19LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdE9uZXdheSwgcGFyYW1zX3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0T25ld2F5IHJlcGx5IiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIG9uZXdheV92b2lkLAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdE9uZXdheSwgcmVwbHlfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3RPbmV3YXkgZXhjZXB0aW9ucyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbXX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0T25ld2F5LCBleGNlcHRpb25zKQorICAgICl9LAorICAgIHsic2Vjb25kdGVzdFN0cmluZyBwYXJhbXMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW3sxLCBzdHJpbmd9XX0sCisgICAgICBzZWNvbmRfc2VydmljZV90aHJpZnQ6ZnVuY3Rpb25faW5mbyhzZWNvbmR0ZXN0U3RyaW5nLCBwYXJhbXNfdHlwZSkKKyAgICApfSwKKyAgICB7InNlY29uZHRlc3RTdHJpbmcgcmVwbHkiLCA/X2Fzc2VydEVxdWFsKAorICAgICAgc3RyaW5nLAorICAgICAgc2Vjb25kX3NlcnZpY2VfdGhyaWZ0OmZ1bmN0aW9uX2luZm8oc2Vjb25kdGVzdFN0cmluZywgcmVwbHlfdHlwZSkKKyAgICApfSwKKyAgICB7InNlY29uZHRlc3RTdHJpbmcgZXhjZXB0aW9ucyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbXX0sCisgICAgICBzZWNvbmRfc2VydmljZV90aHJpZnQ6ZnVuY3Rpb25faW5mbyhzZWNvbmR0ZXN0U3RyaW5nLCBleGNlcHRpb25zKQorICAgICl9CisgIF0uCmRpZmYgLS1naXQgYS9saWIvZ28vTWFrZWZpbGUuYW0gYi9saWIvZ28vTWFrZWZpbGUuYW0KaW5kZXggYmUyYTJlNS4uMGRmYTVmYSAxMDA2NDQKLS0tIGEvbGliL2dvL01ha2VmaWxlLmFtCisrKyBiL2xpYi9nby9NYWtlZmlsZS5hbQpAQCAtMzEsMTAgKzMxLDE1IEBACiAJQGVjaG8gJyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjJwogCiBjaGVjay1sb2NhbDoKLQkkKEdPKSB0ZXN0IC4vdGhyaWZ0CisJR09QQVRIPWBwd2RgICQoR08pIHRlc3QgLXJhY2UgLi90aHJpZnQKIAotYWxsLWxvY2FsOiBjaGVjay1sb2NhbAorY2xlYW4tbG9jYWw6CisJJChSTSkgLXJmIHBrZworCithbGwtbG9jYWw6CisJR09QQVRIPWBwd2RgICQoR08pIGJ1aWxkIC4vdGhyaWZ0CiAKIEVYVFJBX0RJU1QgPSBcCiAJdGhyaWZ0IFwKKwljb2Rpbmdfc3RhbmRhcmRzLm1kIFwKIAlSRUFETUUubWQKZGlmZiAtLWdpdCBhL2xpYi9nby9SRUFETUUubWQgYi9saWIvZ28vUkVBRE1FLm1kCmluZGV4IDgwMmI5YTQuLmNlNmQ1ZWQgMTAwNjQ0Ci0tLSBhL2xpYi9nby9SRUFETUUubWQKKysrIGIvbGliL2dvL1JFQURNRS5tZApAQCAtMjQsMTAgKzI0LDEyIEBACiBVc2luZyBUaHJpZnQgd2l0aCBHbwogPT09PT09PT09PT09PT09PT09PT0KIAorVGhyaWZ0IHN1cHBvcnRzIEdvIDEuNysKKwogSW4gZm9sbG93aW5nIEdvIGNvbnZlbnRpb25zLCB3ZSByZWNvbW1lbmQgeW91IHVzZSB0aGUgJ2dvJyB0b29sIHRvIGluc3RhbGwKIFRocmlmdCBmb3IgZ28uCiAKLSAgICAkIGdvIGdldCBnaXQtd2lwLXVzLmFwYWNoZS5vcmcvcmVwb3MvYXNmL3RocmlmdC5naXQvbGliL2dvL3RocmlmdAorICAgICQgZ28gZ2V0IGdpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC9saWIvZ28vdGhyaWZ0Ly4uLgogCiBXaWxsIHJldHJpZXZlIGFuZCBpbnN0YWxsIHRoZSBtb3N0IHJlY2VudCB2ZXJzaW9uIG9mIHRoZSBwYWNrYWdlLgogCkBAIC02NCwzICs2NiwxOCBAQAogCiBBbmQgc28gb24uIFRoZSBjb2RlIGdlbmVyYXRvciBhbHNvIGNyZWF0ZXMgYW5hbG9nb3VzIGhlbHBlcnMgZm9yIHVzZXItZGVmaW5lZAogdHlwZWRlZnMgYW5kIGVudW1zLgorCitBZGRpbmcgY3VzdG9tIHRhZ3MgdG8gZ2VuZXJhdGVkIFRocmlmdCBzdHJ1Y3RzCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1lvdSBjYW4gYWRkIHRhZ3MgdG8gdGhlIGF1dG8tZ2VuZXJhdGVkIHRocmlmdCBzdHJ1Y3RzIHVzaW5nIHRoZSBmb2xsb3dpbmcgZm9ybWF0OgorCisgICAgc3RydWN0IGZvbyB7CisgICAgICAxOiByZXF1aXJlZCBzdHJpbmcgQmFyIChnby50YWcgPSAic29tZV90YWc6XCJzb21lX3RhZ192YWx1ZVwiIikKKyAgICB9CisgICAgCit3aGljaCB3aWxsIGdlbmVyYXRlOgorCisgICAgdHlwZSBGb28gc3RydWN0IHsKKyAgICAgIEJhciBzdHJpbmcgYHRocmlmdDoiYmFyLDEscmVxdWlyZWQiIHNvbWVfdGFnOiJzb21lX3RhZ192YWx1ZSJgCisgICAgfQpkaWZmIC0tZ2l0IGEvbGliL2dvL2NvZGluZ19zdGFuZGFyZHMubWQgYi9saWIvZ28vY29kaW5nX3N0YW5kYXJkcy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTAzOTBiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL2NvZGluZ19zdGFuZGFyZHMubWQKQEAgLTAsMCArMSBAQAorUGxlYXNlIGZvbGxvdyBbR2VuZXJhbCBDb2RpbmcgU3RhbmRhcmRzXSgvZG9jL2NvZGluZ19zdGFuZGFyZHMubWQpCmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC9Eb250RXhwb3J0UldUZXN0LnRocmlmdCBiL2xpYi9nby90ZXN0L0RvbnRFeHBvcnRSV1Rlc3QudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5ZTVhNmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGVzdC9Eb250RXhwb3J0UldUZXN0LnRocmlmdApAQCAtMCwwICsxLDI3IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworc3RydWN0IElubmVyU3RydWN0IHsKKyAgMTogcmVxdWlyZWQgc3RyaW5nIGlkCit9CisKK3N0cnVjdCBUZXN0U3RydWN0IHsKKyAgMTogcmVxdWlyZWQgc3RyaW5nIGlkCisgIDI6IHJlcXVpcmVkIElubmVyU3RydWN0IGlubmVyCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC9FcnJvclRlc3QudGhyaWZ0IGIvbGliL2dvL3Rlc3QvRXJyb3JUZXN0LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2I2NjQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3Rlc3QvRXJyb3JUZXN0LnRocmlmdApAQCAtMCwwICsxLDM1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCisgKiBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgorICogZGV0YWlscy4KKyAqLworc3RydWN0IFRlc3RTdHJ1Y3QgCit7CisgIDE6IG1hcDxzdHJpbmcsIHN0cmluZz4gbSwKKyAgMjogbGlzdDxzdHJpbmc+IGwsCisgIDM6IHNldDxzdHJpbmc+IHMsCisgIDQ6IGkzMiBpCit9CisKK3NlcnZpY2UgRXJyb3JUZXN0IAoreworICBUZXN0U3RydWN0ICAgICAgICAgdGVzdFN0cnVjdCgxOiBUZXN0U3RydWN0IHRoaW5nKQorICBzdHJpbmcgICAgICAgICAgICAgdGVzdFN0cmluZygxOiBzdHJpbmcgcykKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L0dvVGFnVGVzdC50aHJpZnQgYi9saWIvZ28vdGVzdC9Hb1RhZ1Rlc3QudGhyaWZ0CmluZGV4IDUzOWYzZDIuLjUwOGIzYjYgMTAwNjQ0Ci0tLSBhL2xpYi9nby90ZXN0L0dvVGFnVGVzdC50aHJpZnQKKysrIGIvbGliL2dvL3Rlc3QvR29UYWdUZXN0LnRocmlmdApAQCAtMTksNSArMTksNiBAQAogCiBzdHJ1Y3QgdGFnZ2VkIHsKICAgICAxOiBzdHJpbmcgc3RyaW5nX3RoaW5nLAotICAgIDI6IGk2NCBpbnRfdGhpbmcgKGdvLnRhZyA9ICJqc29uOlwiaW50X3RoaW5nLHN0cmluZ1wiIikKKyAgICAyOiBpNjQgaW50X3RoaW5nIChnby50YWcgPSAianNvbjpcImludF90aGluZyxzdHJpbmdcIiIpLAorICAgIDM6IG9wdGlvbmFsIGk2NCBvcHRpb25hbF9pbnRfdGhpbmcKIH0KZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L0lnbm9yZUluaXRpYWxpc21zVGVzdC50aHJpZnQgYi9saWIvZ28vdGVzdC9JZ25vcmVJbml0aWFsaXNtc1Rlc3QudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiMzBlOWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGVzdC9JZ25vcmVJbml0aWFsaXNtc1Rlc3QudGhyaWZ0CkBAIC0wLDAgKzEsMjYgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitzdHJ1Y3QgSWdub3JlSW5pdGlhbGlzbXNUZXN0IHsKKyAgICAxOiBpNjQgaWQsCisgICAgMjogaTY0IG15X2lkLAorICAgIDM6IGk2NCBudW1fY3B1LAorICAgIDQ6IGk2NCBudW1fZ3B1LAorICAgIDU6IGk2NCBteV9JRCwKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L0luaXRpYWxpc21zVGVzdC50aHJpZnQgYi9saWIvZ28vdGVzdC9Jbml0aWFsaXNtc1Rlc3QudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkODZhYzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGVzdC9Jbml0aWFsaXNtc1Rlc3QudGhyaWZ0CkBAIC0wLDAgKzEsMjQgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitzdHJ1Y3QgSW5pdGlhbGlzbXNUZXN0IHsKKyAgICAxOiBzdHJpbmcgdXNlcl9pZCwKKyAgICAyOiBzdHJpbmcgc2VydmVyX3VybCwKKyAgICAzOiBzdHJpbmcgaWQsIAorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3Rlc3QvTWFrZWZpbGUuYW0gYi9saWIvZ28vdGVzdC9NYWtlZmlsZS5hbQppbmRleCBjMTNiYTc0Li43OGQ0NjgxIDEwMDY0NAotLS0gYS9saWIvZ28vdGVzdC9NYWtlZmlsZS5hbQorKysgYi9saWIvZ28vdGVzdC9NYWtlZmlsZS5hbQpAQCAtMTcsMzQgKzE3LDU0IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1USFJJRlQgPSAkKHRvcF9zcmNkaXIpL2NvbXBpbGVyL2NwcC90aHJpZnQgLW91dCBnb3BhdGgvc3JjLyAtLWdlbiBnbzp0aHJpZnRfaW1wb3J0PXRocmlmdAorVEhSSUZUQVJHUyA9IC1vdXQgZ29wYXRoL3NyYy8gLS1nZW4gZ286dGhyaWZ0X2ltcG9ydD10aHJpZnQkKENPTVBJTEVSX0VYVFJBRkxBRykKIFRIUklGVFRFU1QgPSAkKHRvcF9zcmNkaXIpL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKIAogIyBUaHJpZnQgZm9yIEdPIGhhcyBwcm9ibGVtcyB3aXRoIGNvbXBsZXggbWFwIGtleXM6IFRIUklGVC0yMDYzCi1nb3BhdGg6ICQodG9wX3NyY2RpcikvY29tcGlsZXIvY3BwL3RocmlmdCAkKFRIUklGVFRFU1QpIFwKK2dvcGF0aDogJChUSFJJRlQpICQoVEhSSUZUVEVTVCkgXAogCQkJCUluY2x1ZGVzVGVzdC50aHJpZnQgXAogCQkJCU5hbWVzcGFjZWRUZXN0LnRocmlmdCBcCiAJCQkJTXVsdGlwbGV4ZWRQcm90b2NvbFRlc3QudGhyaWZ0IFwKIAkJCQlPbmV3YXlUZXN0LnRocmlmdCBcCiAJCQkJT3B0aW9uYWxGaWVsZHNUZXN0LnRocmlmdCBcCisJCQkJUmVxdWlyZWRGaWVsZFRlc3QudGhyaWZ0IFwKIAkJCQlTZXJ2aWNlc1Rlc3QudGhyaWZ0IFwKIAkJCQlHb1RhZ1Rlc3QudGhyaWZ0IFwKIAkJCQlUeXBlZGVmRmllbGRUZXN0LnRocmlmdCBcCi0JCQkJUmVmQW5ub3RhdGlvbkZpZWxkc1Rlc3QudGhyaWZ0CisJCQkJUmVmQW5ub3RhdGlvbkZpZWxkc1Rlc3QudGhyaWZ0IFwKKwkJCQlVbmlvbkRlZmF1bHRWYWx1ZVRlc3QudGhyaWZ0IFwKKwkJCQlVbmlvbkJpbmFyeVRlc3QudGhyaWZ0IFwKKwkJCQlFcnJvclRlc3QudGhyaWZ0IFwKKwkJCQlOYW1lc1Rlc3QudGhyaWZ0IFwKKwkJCQlJbml0aWFsaXNtc1Rlc3QudGhyaWZ0IFwKKwkJCQlEb250RXhwb3J0UldUZXN0LnRocmlmdCBcCisJCQkJZG9udGV4cG9ydHJ3dGVzdC9jb21waWxlX3Rlc3QuZ28gXAorCQkJCUlnbm9yZUluaXRpYWxpc21zVGVzdC50aHJpZnQKIAlta2RpciAtcCBnb3BhdGgvc3JjCiAJZ3JlcCAtdiBsaXN0LiptYXAuKmxpc3QuKm1hcCAkKFRIUklGVFRFU1QpIHwgZ3JlcCAtdiAnc2V0PEluc2FuaXR5PicgPiBUaHJpZnRUZXN0LnRocmlmdAotCSQoVEhSSUZUKSAtciBJbmNsdWRlc1Rlc3QudGhyaWZ0Ci0JJChUSFJJRlQpIEJpbmFyeUtleVRlc3QudGhyaWZ0Ci0JJChUSFJJRlQpIE11bHRpcGxleGVkUHJvdG9jb2xUZXN0LnRocmlmdAotCSQoVEhSSUZUKSBPbmV3YXlUZXN0LnRocmlmdAotCSQoVEhSSUZUKSBPcHRpb25hbEZpZWxkc1Rlc3QudGhyaWZ0Ci0JJChUSFJJRlQpIFNlcnZpY2VzVGVzdC50aHJpZnQKLQkkKFRIUklGVCkgR29UYWdUZXN0LnRocmlmdAotCSQoVEhSSUZUKSBUeXBlZGVmRmllbGRUZXN0LnRocmlmdAotCSQoVEhSSUZUKSBSZWZBbm5vdGF0aW9uRmllbGRzVGVzdC50aHJpZnQKLQlHT1BBVEg9YHB3ZGAvZ29wYXRoICQoR08pIGdldCBjb2RlLmdvb2dsZS5jb20vcC9nb21vY2svZ29tb2NrCisJJChUSFJJRlQpICQoVEhSSUZUQVJHUykgLXIgSW5jbHVkZXNUZXN0LnRocmlmdAorCSQoVEhSSUZUKSAkKFRIUklGVEFSR1MpIEJpbmFyeUtleVRlc3QudGhyaWZ0CisJJChUSFJJRlQpICQoVEhSSUZUQVJHUykgTXVsdGlwbGV4ZWRQcm90b2NvbFRlc3QudGhyaWZ0CisJJChUSFJJRlQpICQoVEhSSUZUQVJHUykgT25ld2F5VGVzdC50aHJpZnQKKwkkKFRIUklGVCkgJChUSFJJRlRBUkdTKSBPcHRpb25hbEZpZWxkc1Rlc3QudGhyaWZ0CisJJChUSFJJRlQpICQoVEhSSUZUQVJHUykgUmVxdWlyZWRGaWVsZFRlc3QudGhyaWZ0CisJJChUSFJJRlQpICQoVEhSSUZUQVJHUykgU2VydmljZXNUZXN0LnRocmlmdAorCSQoVEhSSUZUKSAkKFRIUklGVEFSR1MpIEdvVGFnVGVzdC50aHJpZnQKKwkkKFRIUklGVCkgJChUSFJJRlRBUkdTKSBUeXBlZGVmRmllbGRUZXN0LnRocmlmdAorCSQoVEhSSUZUKSAkKFRIUklGVEFSR1MpIFJlZkFubm90YXRpb25GaWVsZHNUZXN0LnRocmlmdAorCSQoVEhSSUZUKSAkKFRIUklGVEFSR1MpIFVuaW9uRGVmYXVsdFZhbHVlVGVzdC50aHJpZnQKKwkkKFRIUklGVCkgJChUSFJJRlRBUkdTKSBVbmlvbkJpbmFyeVRlc3QudGhyaWZ0CisJJChUSFJJRlQpICQoVEhSSUZUQVJHUykgRXJyb3JUZXN0LnRocmlmdAorCSQoVEhSSUZUKSAkKFRIUklGVEFSR1MpIE5hbWVzVGVzdC50aHJpZnQKKwkkKFRIUklGVCkgJChUSFJJRlRBUkdTKSBJbml0aWFsaXNtc1Rlc3QudGhyaWZ0CisJJChUSFJJRlQpICQoVEhSSUZUQVJHUykscmVhZF93cml0ZV9wcml2YXRlIERvbnRFeHBvcnRSV1Rlc3QudGhyaWZ0CisJJChUSFJJRlQpICQoVEhSSUZUQVJHUyksaWdub3JlX2luaXRpYWxpc21zIElnbm9yZUluaXRpYWxpc21zVGVzdC50aHJpZnQKKwlHT1BBVEg9YHB3ZGAvZ29wYXRoICQoR08pIGdldCBnaXRodWIuY29tL2dvbGFuZy9tb2NrL2dvbW9jayB8fCB0cnVlCisJc2VkIC1pICdzL1wiY29udGV4dFwiL1wiZ29sYW5nLm9yZ1wveFwvbmV0XC9jb250ZXh0XCIvZycgZ29wYXRoL3NyYy9naXRodWIuY29tL2dvbGFuZy9tb2NrL2dvbW9jay9jb250cm9sbGVyLmdvIHx8IHRydWUKKwlHT1BBVEg9YHB3ZGAvZ29wYXRoICQoR08pIGdldCBnaXRodWIuY29tL2dvbGFuZy9tb2NrL2dvbW9jawogCWxuIC1uZnMgLi4vLi4vLi4vdGhyaWZ0IGdvcGF0aC9zcmMvdGhyaWZ0CiAJbG4gLW5mcyAuLi8uLi90ZXN0cyBnb3BhdGgvc3JjL3Rlc3RzCisJY3AgLXIgLi9kb250ZXhwb3J0cnd0ZXN0IGdvcGF0aC9zcmMKIAl0b3VjaCBnb3BhdGgKIAogY2hlY2s6IGdvcGF0aApAQCAtNTMsOCArNzMsMTQgQEAKIAkJCQliaW5hcnlrZXl0ZXN0IFwKIAkJCQlzZXJ2aWNlc3Rlc3QgXAogCQkJCXR5cGVkZWZmaWVsZHRlc3QgXAotCQkJCXJlZmFubm90YXRpb25maWVsZHN0ZXN0Ci0JR09QQVRIPWBwd2RgL2dvcGF0aCAkKEdPKSB0ZXN0IHRocmlmdCB0ZXN0cworCQkJCXJlZmFubm90YXRpb25maWVsZHN0ZXN0IFwKKwkJCQllcnJvcnRlc3QJXAorCQkJCW5hbWVzdGVzdCBcCisJCQkJaW5pdGlhbGlzbXN0ZXN0IFwKKwkJCQlkb250ZXhwb3J0cnd0ZXN0IFwKKwkJCQlpZ25vcmVpbml0aWFsaXNtc3Rlc3QgXAorCQkJCXVuaW9uYmluYXJ5dGVzdAorCUdPUEFUSD1gcHdkYC9nb3BhdGggJChHTykgdGVzdCB0aHJpZnQgdGVzdHMgZG9udGV4cG9ydHJ3dGVzdAogCiBjbGVhbi1sb2NhbDoKIAkkKFJNKSAtciBnb3BhdGggVGhyaWZ0VGVzdC50aHJpZnQgZ2VuLWdvCkBAIC02Myw2ICs4OSw3IEBACiAJJChHTykgcnVuIFRlc3RDbGllbnQuZ28KIAogRVhUUkFfRElTVCA9IFwKKwlkb250ZXhwb3J0cnd0ZXN0IFwKIAl0ZXN0cyBcCiAJQmluYXJ5S2V5VGVzdC50aHJpZnQgXAogCUdvVGFnVGVzdC50aHJpZnQgXApAQCAtNzEsNiArOTgsMTQgQEAKIAlOYW1lc3BhY2VkVGVzdC50aHJpZnQgXAogCU9uZXdheVRlc3QudGhyaWZ0IFwKIAlPcHRpb25hbEZpZWxkc1Rlc3QudGhyaWZ0IFwKKwlSZXF1aXJlZEZpZWxkVGVzdC50aHJpZnQgXAogCVJlZkFubm90YXRpb25GaWVsZHNUZXN0LnRocmlmdCBcCisJVW5pb25EZWZhdWx0VmFsdWVUZXN0LnRocmlmdCBcCisJVW5pb25CaW5hcnlUZXN0LnRocmlmdCBcCiAJU2VydmljZXNUZXN0LnRocmlmdCBcCi0JVHlwZWRlZkZpZWxkVGVzdC50aHJpZnQKKwlUeXBlZGVmRmllbGRUZXN0LnRocmlmdCBcCisJRXJyb3JUZXN0LnRocmlmdCBcCisJTmFtZXNUZXN0LnRocmlmdCBcCisJSW5pdGlhbGlzbXNUZXN0LnRocmlmdCBcCisJRG9udEV4cG9ydFJXVGVzdC50aHJpZnQgXAorCUlnbm9yZUluaXRpYWxpc21zVGVzdC50aHJpZnQKZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L05hbWVzVGVzdC50aHJpZnQgYi9saWIvZ28vdGVzdC9OYW1lc1Rlc3QudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3ZTk1NjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGVzdC9OYW1lc1Rlc3QudGhyaWZ0CkBAIC0wLDAgKzEsMzIgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitzdHJ1Y3QgTmFtZXNUZXN0IHsKKyAgICAxOiByZXF1aXJlZCBzdHJpbmcgdHlwZQorfQorCitzZXJ2aWNlIE5hbWVDb2xsaXNpb25PbmUKK3sKKyAgICB2b2lkIGJsYWhCbGFoKCkKK30KKworc2VydmljZSBOYW1lQ29sbGlzaW9uVHdvCit7CisgICAgdm9pZCBibGFoQmxhaCgpCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC9PcHRpb25hbEZpZWxkc1Rlc3QudGhyaWZ0IGIvbGliL2dvL3Rlc3QvT3B0aW9uYWxGaWVsZHNUZXN0LnRocmlmdAppbmRleCAyNWIwZWY2Li4yYWZjMTU3IDEwMDY0NAotLS0gYS9saWIvZ28vdGVzdC9PcHRpb25hbEZpZWxkc1Rlc3QudGhyaWZ0CisrKyBiL2xpYi9nby90ZXN0L09wdGlvbmFsRmllbGRzVGVzdC50aHJpZnQKQEAgLTQxLDMgKzQxLDEwIEBACiAgMTogcmVxdWlyZWQgc3RydWN0QSByZXF1aXJlZF9zdHJ1Y3RfdGhpbmcKICAyOiBvcHRpb25hbCBzdHJ1Y3RBIG9wdGlvbmFsX3N0cnVjdF90aGluZwogfQorCitzdHJ1Y3Qgc3RydWN0QyB7CisgMTogc3RyaW5nIHMsCisgMjogcmVxdWlyZWQgaTMyIGksCisgMzogb3B0aW9uYWwgYm9vbCBiLAorIDQ6IHJlcXVpcmVkIHN0cmluZyBzMiwKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L1JlcXVpcmVkRmllbGRUZXN0LnRocmlmdCBiL2xpYi9nby90ZXN0L1JlcXVpcmVkRmllbGRUZXN0LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTJkY2FlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3Rlc3QvUmVxdWlyZWRGaWVsZFRlc3QudGhyaWZ0CkBAIC0wLDAgKzEsNyBAQAorc3RydWN0IFJlcXVpcmVkRmllbGQgeworICAxOiByZXF1aXJlZCBzdHJpbmcgbmFtZQorfQorCitzdHJ1Y3QgT3RoZXJUaGluZyB7CisgIDE6IHJlcXVpcmVkIGkxNiB2YWx1ZQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3Rlc3QvVW5pb25CaW5hcnlUZXN0LnRocmlmdCBiL2xpYi9nby90ZXN0L1VuaW9uQmluYXJ5VGVzdC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc3MTEyYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90ZXN0L1VuaW9uQmluYXJ5VGVzdC50aHJpZnQKQEAgLTAsMCArMSwyNSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMgU2VlIGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQ1NzMKK3VuaW9uIFNhbXBsZSB7CisgIDE6IG1hcDxzdHJpbmcsIHN0cmluZz4gdTEsCisgIDI6IGJpbmFyeSB1MiwKKyAgMzogbGlzdDxzdHJpbmc+IHUzCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC9VbmlvbkRlZmF1bHRWYWx1ZVRlc3QudGhyaWZ0IGIvbGliL2dvL3Rlc3QvVW5pb25EZWZhdWx0VmFsdWVUZXN0LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzkzNDgwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3Rlc3QvVW5pb25EZWZhdWx0VmFsdWVUZXN0LnRocmlmdApAQCAtMCwwICsxLDM0IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworc3RydWN0IE9wdGlvbjEgeworfQorCitzdHJ1Y3QgT3B0aW9uMiB7CisgIDE6IG9wdGlvbmFsIHN0cmluZyBuYW1lCit9CisKK3VuaW9uIERlc2NlbmRhbnQgeworICAxOiBPcHRpb24xIG9wdGlvbjEKKyAgMjogT3B0aW9uMiBvcHRpb24yCit9CisKK3N0cnVjdCBUZXN0U3RydWN0IHsKKyAgMTogb3B0aW9uYWwgRGVzY2VuZGFudCBkZXNjZW5kYW50ID0geyAib3B0aW9uMSI6IHt9fQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3Rlc3QvZG9udGV4cG9ydHJ3dGVzdC9jb21waWxlX3Rlc3QuZ28gYi9saWIvZ28vdGVzdC9kb250ZXhwb3J0cnd0ZXN0L2NvbXBpbGVfdGVzdC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjY3NjNlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3Rlc3QvZG9udGV4cG9ydHJ3dGVzdC9jb21waWxlX3Rlc3QuZ28KQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGRvbnRleHBvcnRyd3Rlc3QKKworaW1wb3J0ICgKKwkidGVzdGluZyIKKykKKworLy8gTWFrZSBzdXJlIHRoYXQgdGhyaWZ0IGdlbmVyYXRlcyBub24tZXhwb3J0ZWQgcmVhZC93cml0ZSBtZXRob2RzIGlmCisvLyByZWFkX3dyaXRlX3ByaXZhdGUgb3B0aW9uIGlzIHNwZWNpZmllZAorZnVuYyBUZXN0UmVhZFdyaXRlTWV0aG9kc0FyZVByaXZhdGUodCAqdGVzdGluZy5UKSB7CisJLy8gVGhpcyB3aWxsIG9ubHkgY29tcGlsZSBpZiByZWFkL3dyaXRlIG1ldGhvZHMgZXhpc3QKKwlzIDo9IE5ld1Rlc3RTdHJ1Y3QoKQorCV8gPSBzLnJlYWQKKwlfID0gcy53cml0ZQorCisJaXMgOj0gTmV3SW5uZXJTdHJ1Y3QoKQorCV8gPSBpcy5yZWFkCisJXyA9IGlzLndyaXRlCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC90ZXN0cy9jbGllbnRfZXJyb3JfdGVzdC5nbyBiL2xpYi9nby90ZXN0L3Rlc3RzL2NsaWVudF9lcnJvcl90ZXN0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkZWM0ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGVzdC90ZXN0cy9jbGllbnRfZXJyb3JfdGVzdC5nbwpAQCAtMCwwICsxLDg3MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRlc3RzCisKK2ltcG9ydCAoCisJImNvbnRleHQiCisJImVycm9ycyIKKwkiZXJyb3J0ZXN0IgorCSJ0ZXN0aW5nIgorCSJ0aHJpZnQiCisKKwkiZ2l0aHViLmNvbS9nb2xhbmcvbW9jay9nb21vY2siCispCisKKy8vIFRlc3RDYXNlOiBDb21wcmVoZW5zaXZlIGNhbGwgYW5kIHJlcGx5IHdvcmtmbG93IGluIHRoZSBjbGllbnQuCisvLyBTZXR1cCBtb2NrIHRvIGZhaWwgYXQgYSBjZXJ0YWluIHBvc2l0aW9uLiBSZXR1cm4gdHJ1ZSBpZiBwb3NpdGlvbiBleGlzdHMgb3RoZXJ3aXNlIGZhbHNlLgorZnVuYyBwcmVwYXJlQ2xpZW50Q2FsbFJlcGx5KHByb3RvY29sICpNb2NrVFByb3RvY29sLCBmYWlsQXQgaW50LCBmYWlsV2l0aCBlcnJvcikgYm9vbCB7CisJdmFyIGVyciBlcnJvciA9IG5pbAorCisJaWYgZmFpbEF0ID09IDAgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0IDo9IHByb3RvY29sLkVYUEVDVCgpLldyaXRlTWVzc2FnZUJlZ2luKCJ0ZXN0U3RydWN0IiwgdGhyaWZ0LkNBTEwsIGludDMyKDEpKS5SZXR1cm4oZXJyKQorCWlmIGZhaWxBdCA9PSAwIHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDEgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVTdHJ1Y3RCZWdpbigidGVzdFN0cnVjdF9hcmdzIikuUmV0dXJuKGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gMSB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSAyIHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLldyaXRlRmllbGRCZWdpbigidGhpbmciLCB0aHJpZnQuVFR5cGUodGhyaWZ0LlNUUlVDVCksIGludDE2KDEpKS5SZXR1cm4oZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSAyIHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDMgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVTdHJ1Y3RCZWdpbigiVGVzdFN0cnVjdCIpLlJldHVybihlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDMgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gNCB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUZpZWxkQmVnaW4oIm0iLCB0aHJpZnQuVFR5cGUodGhyaWZ0Lk1BUCksIGludDE2KDEpKS5SZXR1cm4oZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSA0IHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDUgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVNYXBCZWdpbih0aHJpZnQuVFR5cGUodGhyaWZ0LlNUUklORyksIHRocmlmdC5UVHlwZSh0aHJpZnQuU1RSSU5HKSwgMCkuUmV0dXJuKGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gNSB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSA2IHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLldyaXRlTWFwRW5kKCkuUmV0dXJuKGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gNiB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSA3IHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLldyaXRlRmllbGRFbmQoKS5SZXR1cm4oZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSA3IHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDggeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVGaWVsZEJlZ2luKCJsIiwgdGhyaWZ0LlRUeXBlKHRocmlmdC5MSVNUKSwgaW50MTYoMikpLlJldHVybihlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDggeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gOSB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUxpc3RCZWdpbih0aHJpZnQuVFR5cGUodGhyaWZ0LlNUUklORyksIDApLlJldHVybihlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDkgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gMTAgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVMaXN0RW5kKCkuUmV0dXJuKGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gMTAgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gMTEgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVGaWVsZEVuZCgpLlJldHVybihlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDExIHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDEyIHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisKKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVGaWVsZEJlZ2luKCJzIiwgdGhyaWZ0LlRUeXBlKHRocmlmdC5TRVQpLCBpbnQxNigzKSkuUmV0dXJuKGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gMTIgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gMTMgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVTZXRCZWdpbih0aHJpZnQuVFR5cGUodGhyaWZ0LlNUUklORyksIDApLlJldHVybihlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDEzIHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDE0IHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLldyaXRlU2V0RW5kKCkuUmV0dXJuKGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gMTQgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gMTUgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVGaWVsZEVuZCgpLlJldHVybihlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDE1IHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDE2IHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLldyaXRlRmllbGRCZWdpbigiaSIsIHRocmlmdC5UVHlwZSh0aHJpZnQuSTMyKSwgaW50MTYoNCkpLlJldHVybihlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDE2IHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDE3IHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLldyaXRlSTMyKGludDMyKDMpKS5SZXR1cm4oZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSAxNyB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSAxOCB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUZpZWxkRW5kKCkuUmV0dXJuKGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gMTggeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gMTkgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVGaWVsZFN0b3AoKS5SZXR1cm4oZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSAxOSB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSAyMCB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZVN0cnVjdEVuZCgpLlJldHVybihlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDIwIHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDIxIHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLldyaXRlRmllbGRFbmQoKS5SZXR1cm4oZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSAyMSB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSAyMiB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUZpZWxkU3RvcCgpLlJldHVybihlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDIyIHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDIzIHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLldyaXRlU3RydWN0RW5kKCkuUmV0dXJuKGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gMjMgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gMjQgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVNZXNzYWdlRW5kKCkuUmV0dXJuKGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gMjQgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gMjUgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpLlJldHVybihlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDI1IHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDI2IHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLlJlYWRNZXNzYWdlQmVnaW4oKS5SZXR1cm4oInRlc3RTdHJ1Y3QiLCB0aHJpZnQuUkVQTFksIGludDMyKDEpLCBlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDI2IHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDI3IHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLlJlYWRTdHJ1Y3RCZWdpbigpLlJldHVybigidGVzdFN0cnVjdF9hcmdzIiwgZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSAyNyB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSAyOCB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5SZWFkRmllbGRCZWdpbigpLlJldHVybigiXyIsIHRocmlmdC5UVHlwZSh0aHJpZnQuU1RSVUNUKSwgaW50MTYoMCksIGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gMjggeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gMjkgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuUmVhZFN0cnVjdEJlZ2luKCkuUmV0dXJuKCJUZXN0U3RydWN0IiwgZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSAyOSB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSAzMCB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5SZWFkRmllbGRCZWdpbigpLlJldHVybigibSIsIHRocmlmdC5UVHlwZSh0aHJpZnQuTUFQKSwgaW50MTYoMSksIGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gMzAgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gMzEgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuUmVhZE1hcEJlZ2luKCkuUmV0dXJuKHRocmlmdC5UVHlwZSh0aHJpZnQuU1RSSU5HKSwgdGhyaWZ0LlRUeXBlKHRocmlmdC5TVFJJTkcpLCAwLCBlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDMxIHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDMyIHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLlJlYWRNYXBFbmQoKS5SZXR1cm4oZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSAzMiB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSAzMyB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5SZWFkRmllbGRFbmQoKS5SZXR1cm4oZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSAzMyB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSAzNCB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5SZWFkRmllbGRCZWdpbigpLlJldHVybigibCIsIHRocmlmdC5UVHlwZSh0aHJpZnQuTElTVCksIGludDE2KDIpLCBlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDM0IHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDM1IHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLlJlYWRMaXN0QmVnaW4oKS5SZXR1cm4odGhyaWZ0LlRUeXBlKHRocmlmdC5TVFJJTkcpLCAwLCBlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDM1IHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDM2IHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLlJlYWRMaXN0RW5kKCkuUmV0dXJuKGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gMzYgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gMzcgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuUmVhZEZpZWxkRW5kKCkuUmV0dXJuKGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gMzcgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gMzggeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuUmVhZEZpZWxkQmVnaW4oKS5SZXR1cm4oInMiLCB0aHJpZnQuVFR5cGUodGhyaWZ0LlNFVCksIGludDE2KDMpLCBlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDM4IHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDM5IHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLlJlYWRTZXRCZWdpbigpLlJldHVybih0aHJpZnQuVFR5cGUodGhyaWZ0LlNUUklORyksIDAsIGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gMzkgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gNDAgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuUmVhZFNldEVuZCgpLlJldHVybihlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDQwIHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDQxIHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLlJlYWRGaWVsZEVuZCgpLlJldHVybihlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDQxIHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDQyIHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLlJlYWRGaWVsZEJlZ2luKCkuUmV0dXJuKCJpIiwgdGhyaWZ0LlRUeXBlKHRocmlmdC5JMzIpLCBpbnQxNig0KSwgZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSA0MiB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSA0MyB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5SZWFkSTMyKCkuUmV0dXJuKGludDMyKDMpLCBlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDQzIHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDQ0IHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLlJlYWRGaWVsZEVuZCgpLlJldHVybihlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDQ0IHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDQ1IHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLlJlYWRGaWVsZEJlZ2luKCkuUmV0dXJuKCJfIiwgdGhyaWZ0LlRUeXBlKHRocmlmdC5TVE9QKSwgaW50MTYoNSksIGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gNDUgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gNDYgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuUmVhZFN0cnVjdEVuZCgpLlJldHVybihlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDQ2IHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDQ3IHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLlJlYWRGaWVsZEVuZCgpLlJldHVybihlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDQ3IHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDQ4IHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLlJlYWRGaWVsZEJlZ2luKCkuUmV0dXJuKCJfIiwgdGhyaWZ0LlRUeXBlKHRocmlmdC5TVE9QKSwgaW50MTYoMSksIGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gNDggeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gNDkgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuUmVhZFN0cnVjdEVuZCgpLlJldHVybihlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDQ5IHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDUwIHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLlJlYWRNZXNzYWdlRW5kKCkuUmV0dXJuKGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gNTAgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlyZXR1cm4gZmFsc2UKK30KKworLy8gVGVzdENhc2U6IENvbXByZWhlbnNpdmUgY2FsbCBhbmQgcmVwbHkgd29ya2Zsb3cgaW4gdGhlIGNsaWVudC4KKy8vIEV4cGVjdGluZyBUVHJhbnNwb3J0RXJyb3Igb24gZmFpbC4KK2Z1bmMgVGVzdENsaWVudFJlcG9ydFRUcmFuc3BvcnRFcnJvcnModCAqdGVzdGluZy5UKSB7CisJbW9ja0N0cmwgOj0gZ29tb2NrLk5ld0NvbnRyb2xsZXIodCkKKworCXRoaW5nIDo9IGVycm9ydGVzdC5OZXdUZXN0U3RydWN0KCkKKwl0aGluZy5NID0gbWFrZShtYXBbc3RyaW5nXXN0cmluZykKKwl0aGluZy5MID0gbWFrZShbXXN0cmluZywgMCkKKwl0aGluZy5TID0gbWFrZShbXXN0cmluZywgMCkKKwl0aGluZy5JID0gMworCisJZXJyIDo9IHRocmlmdC5OZXdUVHJhbnNwb3J0RXhjZXB0aW9uKHRocmlmdC5USU1FRF9PVVQsICJ0ZXN0IikKKwlmb3IgaSA6PSAwOyA7IGkrKyB7CisJCXByb3RvY29sIDo9IE5ld01vY2tUUHJvdG9jb2wobW9ja0N0cmwpCisJCWlmICFwcmVwYXJlQ2xpZW50Q2FsbFJlcGx5KHByb3RvY29sLCBpLCBlcnIpIHsKKwkJCXJldHVybgorCQl9CisJCWNsaWVudCA6PSBlcnJvcnRlc3QuTmV3RXJyb3JUZXN0Q2xpZW50KHRocmlmdC5OZXdUU3RhbmRhcmRDbGllbnQocHJvdG9jb2wsIHByb3RvY29sKSkKKwkJXywgcmV0RXJyIDo9IGNsaWVudC5UZXN0U3RydWN0KGRlZmF1bHRDdHgsIHRoaW5nKQorCQltb2NrQ3RybC5GaW5pc2goKQorCQltb2NrQ3RybCA9IGdvbW9jay5OZXdDb250cm9sbGVyKHQpCisJCWVycjIsIG9rIDo9IHJldEVyci4odGhyaWZ0LlRUcmFuc3BvcnRFeGNlcHRpb24pCisJCWlmICFvayB7CisJCQl0LkZhdGFsKCJFeHBlY3RlZCBhIFRUcmFzcG9ydEV4Y2VwdGlvbiIpCisJCX0KKworCQlpZiBlcnIyLlR5cGVJZCgpICE9IHRocmlmdC5USU1FRF9PVVQgeworCQkJdC5GYXRhbCgiRXhwZWN0ZWQgVElNRURfT1VUIGVycm9yIikKKwkJfQorCX0KK30KKworLy8gVGVzdENhc2U6IENvbXByZWhlbnNpdmUgY2FsbCBhbmQgcmVwbHkgd29ya2Zsb3cgaW4gdGhlIGNsaWVudC4KKy8vIEV4cGVjdGluZyBUVHJhbnNwb3J0RXJyb3Igb24gZmFpbC4KKy8vIFNpbWlsYXIgdG8gVGVzdENsaWVudFJlcG9ydFRUcmFuc3BvcnRFcnJvcnMsIGJ1dCB1c2luZyBsZWdhY3kgY2xpZW50IGNvbnN0cnVjdG9yLgorZnVuYyBUZXN0Q2xpZW50UmVwb3J0VFRyYW5zcG9ydEVycm9yc0xlZ2FjeSh0ICp0ZXN0aW5nLlQpIHsKKwltb2NrQ3RybCA6PSBnb21vY2suTmV3Q29udHJvbGxlcih0KQorCXRyYW5zcG9ydCA6PSB0aHJpZnQuTmV3VE1lbW9yeUJ1ZmZlcigpCisJdGhpbmcgOj0gZXJyb3J0ZXN0Lk5ld1Rlc3RTdHJ1Y3QoKQorCXRoaW5nLk0gPSBtYWtlKG1hcFtzdHJpbmddc3RyaW5nKQorCXRoaW5nLkwgPSBtYWtlKFtdc3RyaW5nLCAwKQorCXRoaW5nLlMgPSBtYWtlKFtdc3RyaW5nLCAwKQorCXRoaW5nLkkgPSAzCisKKwllcnIgOj0gdGhyaWZ0Lk5ld1RUcmFuc3BvcnRFeGNlcHRpb24odGhyaWZ0LlRJTUVEX09VVCwgInRlc3QiKQorCWZvciBpIDo9IDA7IDsgaSsrIHsKKwkJcHJvdG9jb2wgOj0gTmV3TW9ja1RQcm90b2NvbChtb2NrQ3RybCkKKwkJaWYgIXByZXBhcmVDbGllbnRDYWxsUmVwbHkocHJvdG9jb2wsIGksIGVycikgeworCQkJcmV0dXJuCisJCX0KKwkJY2xpZW50IDo9IGVycm9ydGVzdC5OZXdFcnJvclRlc3RDbGllbnRQcm90b2NvbCh0cmFuc3BvcnQsIHByb3RvY29sLCBwcm90b2NvbCkKKwkJXywgcmV0RXJyIDo9IGNsaWVudC5UZXN0U3RydWN0KGRlZmF1bHRDdHgsIHRoaW5nKQorCQltb2NrQ3RybC5GaW5pc2goKQorCQltb2NrQ3RybCA9IGdvbW9jay5OZXdDb250cm9sbGVyKHQpCisJCWVycjIsIG9rIDo9IHJldEVyci4odGhyaWZ0LlRUcmFuc3BvcnRFeGNlcHRpb24pCisJCWlmICFvayB7CisJCQl0LkZhdGFsKCJFeHBlY3RlZCBhIFRUcmFzcG9ydEV4Y2VwdGlvbiIpCisJCX0KKworCQlpZiBlcnIyLlR5cGVJZCgpICE9IHRocmlmdC5USU1FRF9PVVQgeworCQkJdC5GYXRhbCgiRXhwZWN0ZWQgVElNRURfT1VUIGVycm9yIikKKwkJfQorCX0KK30KKworLy8gVGVzdENhc2U6IENvbXByZWhlbnNpdmUgY2FsbCBhbmQgcmVwbHkgd29ya2Zsb3cgaW4gdGhlIGNsaWVudC4KKy8vIEV4cGVjdGluZyBUVFByb3RvY29sRXJyb3JzIG9uIGZhaWwuCitmdW5jIFRlc3RDbGllbnRSZXBvcnRUUHJvdG9jb2xFcnJvcnModCAqdGVzdGluZy5UKSB7CisJbW9ja0N0cmwgOj0gZ29tb2NrLk5ld0NvbnRyb2xsZXIodCkKKworCXRoaW5nIDo9IGVycm9ydGVzdC5OZXdUZXN0U3RydWN0KCkKKwl0aGluZy5NID0gbWFrZShtYXBbc3RyaW5nXXN0cmluZykKKwl0aGluZy5MID0gbWFrZShbXXN0cmluZywgMCkKKwl0aGluZy5TID0gbWFrZShbXXN0cmluZywgMCkKKwl0aGluZy5JID0gMworCisJZXJyIDo9IHRocmlmdC5OZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZSh0aHJpZnQuSU5WQUxJRF9EQVRBLCBlcnJvcnMuTmV3KCJ0ZXN0IikpCisJZm9yIGkgOj0gMDsgOyBpKysgeworCQlwcm90b2NvbCA6PSBOZXdNb2NrVFByb3RvY29sKG1vY2tDdHJsKQorCQlpZiAhcHJlcGFyZUNsaWVudENhbGxSZXBseShwcm90b2NvbCwgaSwgZXJyKSB7CisJCQlyZXR1cm4KKwkJfQorCQljbGllbnQgOj0gZXJyb3J0ZXN0Lk5ld0Vycm9yVGVzdENsaWVudCh0aHJpZnQuTmV3VFN0YW5kYXJkQ2xpZW50KHByb3RvY29sLCBwcm90b2NvbCkpCisJCV8sIHJldEVyciA6PSBjbGllbnQuVGVzdFN0cnVjdChkZWZhdWx0Q3R4LCB0aGluZykKKwkJbW9ja0N0cmwuRmluaXNoKCkKKwkJbW9ja0N0cmwgPSBnb21vY2suTmV3Q29udHJvbGxlcih0KQorCQllcnIyLCBvayA6PSByZXRFcnIuKHRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb24pCisJCWlmICFvayB7CisJCQl0LkZhdGFsKCJFeHBlY3RlZCBhIFRQcm90b2NvbEV4Y2VwdGlvbiIpCisJCX0KKwkJaWYgZXJyMi5UeXBlSWQoKSAhPSB0aHJpZnQuSU5WQUxJRF9EQVRBIHsKKwkJCXQuRmF0YWwoIkV4cGVjdGVkIElOVkFMSURfREFUQSBlcnJvciIpCisJCX0KKwl9Cit9CisKKy8vIFRlc3RDYXNlOiBDb21wcmVoZW5zaXZlIGNhbGwgYW5kIHJlcGx5IHdvcmtmbG93IGluIHRoZSBjbGllbnQuCisvLyBFeHBlY3RpbmcgVFRQcm90b2NvbEVycm9ycyBvbiBmYWlsLgorLy8gU2ltaWxhciB0byBUZXN0Q2xpZW50UmVwb3J0VFByb3RvY29sRXJyb3JzLCBidXQgdXNpbmcgbGVnYWN5IGNsaWVudCBjb25zdHJ1Y3Rvci4KK2Z1bmMgVGVzdENsaWVudFJlcG9ydFRQcm90b2NvbEVycm9yc0xlZ2FjeSh0ICp0ZXN0aW5nLlQpIHsKKwltb2NrQ3RybCA6PSBnb21vY2suTmV3Q29udHJvbGxlcih0KQorCXRyYW5zcG9ydCA6PSB0aHJpZnQuTmV3VE1lbW9yeUJ1ZmZlcigpCisJdGhpbmcgOj0gZXJyb3J0ZXN0Lk5ld1Rlc3RTdHJ1Y3QoKQorCXRoaW5nLk0gPSBtYWtlKG1hcFtzdHJpbmddc3RyaW5nKQorCXRoaW5nLkwgPSBtYWtlKFtdc3RyaW5nLCAwKQorCXRoaW5nLlMgPSBtYWtlKFtdc3RyaW5nLCAwKQorCXRoaW5nLkkgPSAzCisKKwllcnIgOj0gdGhyaWZ0Lk5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKHRocmlmdC5JTlZBTElEX0RBVEEsIGVycm9ycy5OZXcoInRlc3QiKSkKKwlmb3IgaSA6PSAwOyA7IGkrKyB7CisJCXByb3RvY29sIDo9IE5ld01vY2tUUHJvdG9jb2wobW9ja0N0cmwpCisJCWlmICFwcmVwYXJlQ2xpZW50Q2FsbFJlcGx5KHByb3RvY29sLCBpLCBlcnIpIHsKKwkJCXJldHVybgorCQl9CisJCWNsaWVudCA6PSBlcnJvcnRlc3QuTmV3RXJyb3JUZXN0Q2xpZW50UHJvdG9jb2wodHJhbnNwb3J0LCBwcm90b2NvbCwgcHJvdG9jb2wpCisJCV8sIHJldEVyciA6PSBjbGllbnQuVGVzdFN0cnVjdChkZWZhdWx0Q3R4LCB0aGluZykKKwkJbW9ja0N0cmwuRmluaXNoKCkKKwkJbW9ja0N0cmwgPSBnb21vY2suTmV3Q29udHJvbGxlcih0KQorCQllcnIyLCBvayA6PSByZXRFcnIuKHRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb24pCisJCWlmICFvayB7CisJCQl0LkZhdGFsKCJFeHBlY3RlZCBhIFRQcm90b2NvbEV4Y2VwdGlvbiIpCisJCX0KKwkJaWYgZXJyMi5UeXBlSWQoKSAhPSB0aHJpZnQuSU5WQUxJRF9EQVRBIHsKKwkJCXQuRmF0YWwoIkV4cGVjdGVkIElOVkFMSURfREFUQSBlcnJvciIpCisJCX0KKwl9Cit9CisKKy8vIFRlc3RDYXNlOiBjYWxsIGFuZCByZXBseSB3aXRoIGV4Y2VwdGlvbiB3b3JrZmxvdyBpbiB0aGUgY2xpZW50LgorLy8gU2V0dXAgbW9jayB0byBmYWlsIGF0IGEgY2VydGFpbiBwb3NpdGlvbi4gUmV0dXJuIHRydWUgaWYgcG9zaXRpb24gZXhpc3RzIG90aGVyd2lzZSBmYWxzZS4KK2Z1bmMgcHJlcGFyZUNsaWVudENhbGxFeGNlcHRpb24ocHJvdG9jb2wgKk1vY2tUUHJvdG9jb2wsIGZhaWxBdCBpbnQsIGZhaWxXaXRoIGVycm9yKSBib29sIHsKKwl2YXIgZXJyIGVycm9yID0gbmlsCisKKwkvLyBObyBuZWVkIHRvIHRlc3QgZmFpbHVyZSBpbiB0aGlzIGJsb2NrLCBiZWNhdXNlIGl0IGlzIGNvdmVyZWQgaW4gb3RoZXIgdGVzdCBjYXNlcworCWxhc3QgOj0gcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVNZXNzYWdlQmVnaW4oInRlc3RTdHJpbmciLCB0aHJpZnQuQ0FMTCwgaW50MzIoMSkpCisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLldyaXRlU3RydWN0QmVnaW4oInRlc3RTdHJpbmdfYXJncyIpLkFmdGVyKGxhc3QpCisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLldyaXRlRmllbGRCZWdpbigicyIsIHRocmlmdC5UVHlwZSh0aHJpZnQuU1RSSU5HKSwgaW50MTYoMSkpLkFmdGVyKGxhc3QpCisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLldyaXRlU3RyaW5nKCJ0ZXN0IikuQWZ0ZXIobGFzdCkKKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVGaWVsZEVuZCgpLkFmdGVyKGxhc3QpCisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLldyaXRlRmllbGRTdG9wKCkuQWZ0ZXIobGFzdCkKKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVTdHJ1Y3RFbmQoKS5BZnRlcihsYXN0KQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZU1lc3NhZ2VFbmQoKS5BZnRlcihsYXN0KQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkuQWZ0ZXIobGFzdCkKKworCS8vIFJlYWRpbmcgdGhlIGV4Y2VwdGlvbiwgbWlnaHQgZmFpbC4KKwlpZiBmYWlsQXQgPT0gMCB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5SZWFkTWVzc2FnZUJlZ2luKCkuUmV0dXJuKCJ0ZXN0U3RyaW5nIiwgdGhyaWZ0LkVYQ0VQVElPTiwgaW50MzIoMSksIGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gMCB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSAxIHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLlJlYWRTdHJ1Y3RCZWdpbigpLlJldHVybigiVEFwcGxpY2F0aW9uRXhjZXB0aW9uIiwgZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSAxIHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDIgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuUmVhZEZpZWxkQmVnaW4oKS5SZXR1cm4oIm1lc3NhZ2UiLCB0aHJpZnQuVFR5cGUodGhyaWZ0LlNUUklORyksIGludDE2KDEpLCBlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDIgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gMyB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5SZWFkU3RyaW5nKCkuUmV0dXJuKCJ0ZXN0IiwgZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSAzIHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDQgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuUmVhZEZpZWxkRW5kKCkuUmV0dXJuKGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gNCB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSA1IHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLlJlYWRGaWVsZEJlZ2luKCkuUmV0dXJuKCJ0eXBlIiwgdGhyaWZ0LlRUeXBlKHRocmlmdC5JMzIpLCBpbnQxNigyKSwgZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSA1IHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDYgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuUmVhZEkzMigpLlJldHVybihpbnQzMih0aHJpZnQuUFJPVE9DT0xfRVJST1IpLCBlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDYgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gNyB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5SZWFkRmllbGRFbmQoKS5SZXR1cm4oZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSA3IHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDggeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuUmVhZEZpZWxkQmVnaW4oKS5SZXR1cm4oIl8iLCB0aHJpZnQuVFR5cGUodGhyaWZ0LlNUT1ApLCBpbnQxNigyKSwgZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSA4IHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDkgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuUmVhZFN0cnVjdEVuZCgpLlJldHVybihlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDkgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gMTAgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuUmVhZE1lc3NhZ2VFbmQoKS5SZXR1cm4oZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSAxMCB7CisJCXJldHVybiB0cnVlCisJfQorCisJcmV0dXJuIGZhbHNlCit9CisKKy8vIFRlc3RDYXNlOiBjYWxsIGFuZCByZXBseSB3aXRoIGV4Y2VwdGlvbiB3b3JrZmxvdyBpbiB0aGUgY2xpZW50LgorZnVuYyBUZXN0Q2xpZW50Q2FsbEV4Y2VwdGlvbih0ICp0ZXN0aW5nLlQpIHsKKwltb2NrQ3RybCA6PSBnb21vY2suTmV3Q29udHJvbGxlcih0KQorCisJZXJyIDo9IHRocmlmdC5OZXdUVHJhbnNwb3J0RXhjZXB0aW9uKHRocmlmdC5USU1FRF9PVVQsICJ0ZXN0IikKKwlmb3IgaSA6PSAwOyA7IGkrKyB7CisJCXByb3RvY29sIDo9IE5ld01vY2tUUHJvdG9jb2wobW9ja0N0cmwpCisJCXdpbGxDb21wbGV0ZSA6PSAhcHJlcGFyZUNsaWVudENhbGxFeGNlcHRpb24ocHJvdG9jb2wsIGksIGVycikKKworCQljbGllbnQgOj0gZXJyb3J0ZXN0Lk5ld0Vycm9yVGVzdENsaWVudCh0aHJpZnQuTmV3VFN0YW5kYXJkQ2xpZW50KHByb3RvY29sLCBwcm90b2NvbCkpCisJCV8sIHJldEVyciA6PSBjbGllbnQuVGVzdFN0cmluZyhkZWZhdWx0Q3R4LCAidGVzdCIpCisJCW1vY2tDdHJsLkZpbmlzaCgpCisJCW1vY2tDdHJsID0gZ29tb2NrLk5ld0NvbnRyb2xsZXIodCkKKworCQlpZiAhd2lsbENvbXBsZXRlIHsKKwkJCWVycjIsIG9rIDo9IHJldEVyci4odGhyaWZ0LlRUcmFuc3BvcnRFeGNlcHRpb24pCisJCQlpZiAhb2sgeworCQkJCXQuRmF0YWwoIkV4cGVjdGVkIGEgVFRyYW5zcG9ydEV4Y2VwdGlvbiIpCisJCQl9CisJCQlpZiBlcnIyLlR5cGVJZCgpICE9IHRocmlmdC5USU1FRF9PVVQgeworCQkJCXQuRmF0YWwoIkV4cGVjdGVkIFRJTUVEX09VVCBlcnJvciIpCisJCQl9CisJCX0gZWxzZSB7CisJCQllcnIyLCBvayA6PSByZXRFcnIuKHRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24pCisJCQlpZiAhb2sgeworCQkJCXQuRmF0YWwoIkV4cGVjdGVkIGEgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIikKKwkJCX0KKwkJCWlmIGVycjIuVHlwZUlkKCkgIT0gdGhyaWZ0LlBST1RPQ09MX0VSUk9SIHsKKwkJCQl0LkZhdGFsKCJFeHBlY3RlZCBQUk9UT0NPTF9FUlJPUiBlcnJvciIpCisJCQl9CisJCQlicmVhaworCQl9CisJfQorfQorCisvLyBUZXN0Q2FzZTogY2FsbCBhbmQgcmVwbHkgd2l0aCBleGNlcHRpb24gd29ya2Zsb3cgaW4gdGhlIGNsaWVudC4KKy8vIFNpbWlsYXIgdG8gVGVzdENsaWVudENhbGxFeGNlcHRpb24sIGJ1dCB1c2luZyBsZWdhY3kgY2xpZW50IGNvbnN0cnVjdG9yLgorZnVuYyBUZXN0Q2xpZW50Q2FsbEV4Y2VwdGlvbkxlZ2FjeSh0ICp0ZXN0aW5nLlQpIHsKKwltb2NrQ3RybCA6PSBnb21vY2suTmV3Q29udHJvbGxlcih0KQorCXRyYW5zcG9ydCA6PSB0aHJpZnQuTmV3VE1lbW9yeUJ1ZmZlcigpCisJZXJyIDo9IHRocmlmdC5OZXdUVHJhbnNwb3J0RXhjZXB0aW9uKHRocmlmdC5USU1FRF9PVVQsICJ0ZXN0IikKKwlmb3IgaSA6PSAwOyA7IGkrKyB7CisJCXByb3RvY29sIDo9IE5ld01vY2tUUHJvdG9jb2wobW9ja0N0cmwpCisJCXdpbGxDb21wbGV0ZSA6PSAhcHJlcGFyZUNsaWVudENhbGxFeGNlcHRpb24ocHJvdG9jb2wsIGksIGVycikKKworCQljbGllbnQgOj0gZXJyb3J0ZXN0Lk5ld0Vycm9yVGVzdENsaWVudFByb3RvY29sKHRyYW5zcG9ydCwgcHJvdG9jb2wsIHByb3RvY29sKQorCQlfLCByZXRFcnIgOj0gY2xpZW50LlRlc3RTdHJpbmcoZGVmYXVsdEN0eCwgInRlc3QiKQorCQltb2NrQ3RybC5GaW5pc2goKQorCQltb2NrQ3RybCA9IGdvbW9jay5OZXdDb250cm9sbGVyKHQpCisKKwkJaWYgIXdpbGxDb21wbGV0ZSB7CisJCQllcnIyLCBvayA6PSByZXRFcnIuKHRocmlmdC5UVHJhbnNwb3J0RXhjZXB0aW9uKQorCQkJaWYgIW9rIHsKKwkJCQl0LkZhdGFsKCJFeHBlY3RlZCBhIFRUcmFuc3BvcnRFeGNlcHRpb24iKQorCQkJfQorCQkJaWYgZXJyMi5UeXBlSWQoKSAhPSB0aHJpZnQuVElNRURfT1VUIHsKKwkJCQl0LkZhdGFsKCJFeHBlY3RlZCBUSU1FRF9PVVQgZXJyb3IiKQorCQkJfQorCQl9IGVsc2UgeworCQkJZXJyMiwgb2sgOj0gcmV0RXJyLih0aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uKQorCQkJaWYgIW9rIHsKKwkJCQl0LkZhdGFsKCJFeHBlY3RlZCBhIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpCisJCQl9CisJCQlpZiBlcnIyLlR5cGVJZCgpICE9IHRocmlmdC5QUk9UT0NPTF9FUlJPUiB7CisJCQkJdC5GYXRhbCgiRXhwZWN0ZWQgUFJPVE9DT0xfRVJST1IgZXJyb3IiKQorCQkJfQorCQkJYnJlYWsKKwkJfQorCX0KK30KKworLy8gVGVzdENhc2U6IE1pc21hdGNoaW5nIHNlcXVlbmNlIGlkIGhhcyBiZWVuIHJlY2VpdmVkIGluIHRoZSBjbGllbnQuCitmdW5jIFRlc3RDbGllbnRTZXFJZE1pc21hdGNoKHQgKnRlc3RpbmcuVCkgeworCW1vY2tDdHJsIDo9IGdvbW9jay5OZXdDb250cm9sbGVyKHQpCisJcHJvdG9jb2wgOj0gTmV3TW9ja1RQcm90b2NvbChtb2NrQ3RybCkKKwlnb21vY2suSW5PcmRlcigKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVNZXNzYWdlQmVnaW4oInRlc3RTdHJpbmciLCB0aHJpZnQuQ0FMTCwgaW50MzIoMSkpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZVN0cnVjdEJlZ2luKCJ0ZXN0U3RyaW5nX2FyZ3MiKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVGaWVsZEJlZ2luKCJzIiwgdGhyaWZ0LlRUeXBlKHRocmlmdC5TVFJJTkcpLCBpbnQxNigxKSksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlU3RyaW5nKCJ0ZXN0IiksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlRmllbGRFbmQoKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVGaWVsZFN0b3AoKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVTdHJ1Y3RFbmQoKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVNZXNzYWdlRW5kKCksCisJCXByb3RvY29sLkVYUEVDVCgpLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuUmVhZE1lc3NhZ2VCZWdpbigpLlJldHVybigidGVzdFN0cmluZyIsIHRocmlmdC5SRVBMWSwgaW50MzIoMiksIG5pbCksCisJKQorCisJY2xpZW50IDo9IGVycm9ydGVzdC5OZXdFcnJvclRlc3RDbGllbnQodGhyaWZ0Lk5ld1RTdGFuZGFyZENsaWVudChwcm90b2NvbCwgcHJvdG9jb2wpKQorCV8sIGVyciA6PSBjbGllbnQuVGVzdFN0cmluZyhkZWZhdWx0Q3R4LCAidGVzdCIpCisJbW9ja0N0cmwuRmluaXNoKCkKKwlhcHBFcnIsIG9rIDo9IGVyci4odGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbikKKwlpZiAhb2sgeworCQl0LkZhdGFsKCJFeHBlY3RlZCBUQXBwbGljYXRpb25FeGNlcHRpb24iKQorCX0KKwlpZiBhcHBFcnIuVHlwZUlkKCkgIT0gdGhyaWZ0LkJBRF9TRVFVRU5DRV9JRCB7CisJCXQuRmF0YWwoIkV4cGVjdGVkIEJBRF9TRVFVRU5DRV9JRCBlcnJvciIpCisJfQorfQorCisvLyBUZXN0Q2FzZTogTWlzbWF0Y2hpbmcgc2VxdWVuY2UgaWQgaGFzIGJlZW4gcmVjZWl2ZWQgaW4gdGhlIGNsaWVudC4KKy8vIFNpbWlsYXIgdG8gVGVzdENsaWVudFNlcUlkTWlzbWF0Y2gsIGJ1dCB1c2luZyBsZWdhY3kgY2xpZW50IGNvbnN0cnVjdG9yLgorZnVuYyBUZXN0Q2xpZW50U2VxSWRNaXNtYXRjaExlZ2VhY3kodCAqdGVzdGluZy5UKSB7CisJbW9ja0N0cmwgOj0gZ29tb2NrLk5ld0NvbnRyb2xsZXIodCkKKwl0cmFuc3BvcnQgOj0gdGhyaWZ0Lk5ld1RNZW1vcnlCdWZmZXIoKQorCXByb3RvY29sIDo9IE5ld01vY2tUUHJvdG9jb2wobW9ja0N0cmwpCisJZ29tb2NrLkluT3JkZXIoCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlTWVzc2FnZUJlZ2luKCJ0ZXN0U3RyaW5nIiwgdGhyaWZ0LkNBTEwsIGludDMyKDEpKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVTdHJ1Y3RCZWdpbigidGVzdFN0cmluZ19hcmdzIiksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlRmllbGRCZWdpbigicyIsIHRocmlmdC5UVHlwZSh0aHJpZnQuU1RSSU5HKSwgaW50MTYoMSkpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZVN0cmluZygidGVzdCIpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUZpZWxkRW5kKCksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlRmllbGRTdG9wKCksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlU3RydWN0RW5kKCksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlTWVzc2FnZUVuZCgpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSksCisJCXByb3RvY29sLkVYUEVDVCgpLlJlYWRNZXNzYWdlQmVnaW4oKS5SZXR1cm4oInRlc3RTdHJpbmciLCB0aHJpZnQuUkVQTFksIGludDMyKDIpLCBuaWwpLAorCSkKKworCWNsaWVudCA6PSBlcnJvcnRlc3QuTmV3RXJyb3JUZXN0Q2xpZW50UHJvdG9jb2wodHJhbnNwb3J0LCBwcm90b2NvbCwgcHJvdG9jb2wpCisJXywgZXJyIDo9IGNsaWVudC5UZXN0U3RyaW5nKGRlZmF1bHRDdHgsICJ0ZXN0IikKKwltb2NrQ3RybC5GaW5pc2goKQorCWFwcEVyciwgb2sgOj0gZXJyLih0aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uKQorCWlmICFvayB7CisJCXQuRmF0YWwoIkV4cGVjdGVkIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpCisJfQorCWlmIGFwcEVyci5UeXBlSWQoKSAhPSB0aHJpZnQuQkFEX1NFUVVFTkNFX0lEIHsKKwkJdC5GYXRhbCgiRXhwZWN0ZWQgQkFEX1NFUVVFTkNFX0lEIGVycm9yIikKKwl9Cit9CisKKy8vIFRlc3RDYXNlOiBXcm9uZyBtZXRob2QgbmFtZSBoYXMgYmVlbiByZWNlaXZlZCBpbiB0aGUgY2xpZW50LgorZnVuYyBUZXN0Q2xpZW50V3JvbmdNZXRob2ROYW1lKHQgKnRlc3RpbmcuVCkgeworCW1vY2tDdHJsIDo9IGdvbW9jay5OZXdDb250cm9sbGVyKHQpCisJcHJvdG9jb2wgOj0gTmV3TW9ja1RQcm90b2NvbChtb2NrQ3RybCkKKwlnb21vY2suSW5PcmRlcigKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVNZXNzYWdlQmVnaW4oInRlc3RTdHJpbmciLCB0aHJpZnQuQ0FMTCwgaW50MzIoMSkpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZVN0cnVjdEJlZ2luKCJ0ZXN0U3RyaW5nX2FyZ3MiKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVGaWVsZEJlZ2luKCJzIiwgdGhyaWZ0LlRUeXBlKHRocmlmdC5TVFJJTkcpLCBpbnQxNigxKSksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlU3RyaW5nKCJ0ZXN0IiksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlRmllbGRFbmQoKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVGaWVsZFN0b3AoKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVTdHJ1Y3RFbmQoKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVNZXNzYWdlRW5kKCksCisJCXByb3RvY29sLkVYUEVDVCgpLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuUmVhZE1lc3NhZ2VCZWdpbigpLlJldHVybigidW5rbm93biIsIHRocmlmdC5SRVBMWSwgaW50MzIoMSksIG5pbCksCisJKQorCisJY2xpZW50IDo9IGVycm9ydGVzdC5OZXdFcnJvclRlc3RDbGllbnQodGhyaWZ0Lk5ld1RTdGFuZGFyZENsaWVudChwcm90b2NvbCwgcHJvdG9jb2wpKQorCV8sIGVyciA6PSBjbGllbnQuVGVzdFN0cmluZyhkZWZhdWx0Q3R4LCAidGVzdCIpCisJbW9ja0N0cmwuRmluaXNoKCkKKwlhcHBFcnIsIG9rIDo9IGVyci4odGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbikKKwlpZiAhb2sgeworCQl0LkZhdGFsKCJFeHBlY3RlZCBUQXBwbGljYXRpb25FeGNlcHRpb24iKQorCX0KKwlpZiBhcHBFcnIuVHlwZUlkKCkgIT0gdGhyaWZ0LldST05HX01FVEhPRF9OQU1FIHsKKwkJdC5GYXRhbCgiRXhwZWN0ZWQgV1JPTkdfTUVUSE9EX05BTUUgZXJyb3IiKQorCX0KK30KKworLy8gVGVzdENhc2U6IFdyb25nIG1ldGhvZCBuYW1lIGhhcyBiZWVuIHJlY2VpdmVkIGluIHRoZSBjbGllbnQuCisvLyBTaW1pbGFyIHRvIFRlc3RDbGllbnRXcm9uZ01ldGhvZE5hbWUsIGJ1dCB1c2luZyBsZWdhY3kgY2xpZW50IGNvbnN0cnVjdG9yLgorZnVuYyBUZXN0Q2xpZW50V3JvbmdNZXRob2ROYW1lTGVnYWN5KHQgKnRlc3RpbmcuVCkgeworCW1vY2tDdHJsIDo9IGdvbW9jay5OZXdDb250cm9sbGVyKHQpCisJdHJhbnNwb3J0IDo9IHRocmlmdC5OZXdUTWVtb3J5QnVmZmVyKCkKKwlwcm90b2NvbCA6PSBOZXdNb2NrVFByb3RvY29sKG1vY2tDdHJsKQorCWdvbW9jay5Jbk9yZGVyKAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZU1lc3NhZ2VCZWdpbigidGVzdFN0cmluZyIsIHRocmlmdC5DQUxMLCBpbnQzMigxKSksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlU3RydWN0QmVnaW4oInRlc3RTdHJpbmdfYXJncyIpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUZpZWxkQmVnaW4oInMiLCB0aHJpZnQuVFR5cGUodGhyaWZ0LlNUUklORyksIGludDE2KDEpKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVTdHJpbmcoInRlc3QiKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVGaWVsZEVuZCgpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUZpZWxkU3RvcCgpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZVN0cnVjdEVuZCgpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZU1lc3NhZ2VFbmQoKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5SZWFkTWVzc2FnZUJlZ2luKCkuUmV0dXJuKCJ1bmtub3duIiwgdGhyaWZ0LlJFUExZLCBpbnQzMigxKSwgbmlsKSwKKwkpCisKKwljbGllbnQgOj0gZXJyb3J0ZXN0Lk5ld0Vycm9yVGVzdENsaWVudFByb3RvY29sKHRyYW5zcG9ydCwgcHJvdG9jb2wsIHByb3RvY29sKQorCV8sIGVyciA6PSBjbGllbnQuVGVzdFN0cmluZyhkZWZhdWx0Q3R4LCAidGVzdCIpCisJbW9ja0N0cmwuRmluaXNoKCkKKwlhcHBFcnIsIG9rIDo9IGVyci4odGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbikKKwlpZiAhb2sgeworCQl0LkZhdGFsKCJFeHBlY3RlZCBUQXBwbGljYXRpb25FeGNlcHRpb24iKQorCX0KKwlpZiBhcHBFcnIuVHlwZUlkKCkgIT0gdGhyaWZ0LldST05HX01FVEhPRF9OQU1FIHsKKwkJdC5GYXRhbCgiRXhwZWN0ZWQgV1JPTkdfTUVUSE9EX05BTUUgZXJyb3IiKQorCX0KK30KKworLy8gVGVzdENhc2U6IFdyb25nIG1lc3NhZ2UgdHlwZSBoYXMgYmVlbiByZWNlaXZlZCBpbiB0aGUgY2xpZW50LgorZnVuYyBUZXN0Q2xpZW50V3JvbmdNZXNzYWdlVHlwZSh0ICp0ZXN0aW5nLlQpIHsKKwltb2NrQ3RybCA6PSBnb21vY2suTmV3Q29udHJvbGxlcih0KQorCXByb3RvY29sIDo9IE5ld01vY2tUUHJvdG9jb2wobW9ja0N0cmwpCisJZ29tb2NrLkluT3JkZXIoCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlTWVzc2FnZUJlZ2luKCJ0ZXN0U3RyaW5nIiwgdGhyaWZ0LkNBTEwsIGludDMyKDEpKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVTdHJ1Y3RCZWdpbigidGVzdFN0cmluZ19hcmdzIiksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlRmllbGRCZWdpbigicyIsIHRocmlmdC5UVHlwZSh0aHJpZnQuU1RSSU5HKSwgaW50MTYoMSkpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZVN0cmluZygidGVzdCIpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUZpZWxkRW5kKCksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlRmllbGRTdG9wKCksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlU3RydWN0RW5kKCksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlTWVzc2FnZUVuZCgpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSksCisJCXByb3RvY29sLkVYUEVDVCgpLlJlYWRNZXNzYWdlQmVnaW4oKS5SZXR1cm4oInRlc3RTdHJpbmciLCB0aHJpZnQuSU5WQUxJRF9UTUVTU0FHRV9UWVBFLCBpbnQzMigxKSwgbmlsKSwKKwkpCisKKwljbGllbnQgOj0gZXJyb3J0ZXN0Lk5ld0Vycm9yVGVzdENsaWVudCh0aHJpZnQuTmV3VFN0YW5kYXJkQ2xpZW50KHByb3RvY29sLCBwcm90b2NvbCkpCisJXywgZXJyIDo9IGNsaWVudC5UZXN0U3RyaW5nKGRlZmF1bHRDdHgsICJ0ZXN0IikKKwltb2NrQ3RybC5GaW5pc2goKQorCWFwcEVyciwgb2sgOj0gZXJyLih0aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uKQorCWlmICFvayB7CisJCXQuRmF0YWwoIkV4cGVjdGVkIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpCisJfQorCWlmIGFwcEVyci5UeXBlSWQoKSAhPSB0aHJpZnQuSU5WQUxJRF9NRVNTQUdFX1RZUEVfRVhDRVBUSU9OIHsKKwkJdC5GYXRhbCgiRXhwZWN0ZWQgSU5WQUxJRF9NRVNTQUdFX1RZUEVfRVhDRVBUSU9OIGVycm9yIikKKwl9Cit9CisKKy8vIFRlc3RDYXNlOiBXcm9uZyBtZXNzYWdlIHR5cGUgaGFzIGJlZW4gcmVjZWl2ZWQgaW4gdGhlIGNsaWVudC4KKy8vIFNpbWlsYXIgdG8gVGVzdENsaWVudFdyb25nTWVzc2FnZVR5cGUsIGJ1dCB1c2luZyBsZWdhY3kgY2xpZW50IGNvbnN0cnVjdG9yLgorZnVuYyBUZXN0Q2xpZW50V3JvbmdNZXNzYWdlVHlwZUxlZ2FjeSh0ICp0ZXN0aW5nLlQpIHsKKwltb2NrQ3RybCA6PSBnb21vY2suTmV3Q29udHJvbGxlcih0KQorCXRyYW5zcG9ydCA6PSB0aHJpZnQuTmV3VE1lbW9yeUJ1ZmZlcigpCisJcHJvdG9jb2wgOj0gTmV3TW9ja1RQcm90b2NvbChtb2NrQ3RybCkKKwlnb21vY2suSW5PcmRlcigKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVNZXNzYWdlQmVnaW4oInRlc3RTdHJpbmciLCB0aHJpZnQuQ0FMTCwgaW50MzIoMSkpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZVN0cnVjdEJlZ2luKCJ0ZXN0U3RyaW5nX2FyZ3MiKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVGaWVsZEJlZ2luKCJzIiwgdGhyaWZ0LlRUeXBlKHRocmlmdC5TVFJJTkcpLCBpbnQxNigxKSksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlU3RyaW5nKCJ0ZXN0IiksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlRmllbGRFbmQoKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVGaWVsZFN0b3AoKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVTdHJ1Y3RFbmQoKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVNZXNzYWdlRW5kKCksCisJCXByb3RvY29sLkVYUEVDVCgpLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuUmVhZE1lc3NhZ2VCZWdpbigpLlJldHVybigidGVzdFN0cmluZyIsIHRocmlmdC5JTlZBTElEX1RNRVNTQUdFX1RZUEUsIGludDMyKDEpLCBuaWwpLAorCSkKKworCWNsaWVudCA6PSBlcnJvcnRlc3QuTmV3RXJyb3JUZXN0Q2xpZW50UHJvdG9jb2wodHJhbnNwb3J0LCBwcm90b2NvbCwgcHJvdG9jb2wpCisJXywgZXJyIDo9IGNsaWVudC5UZXN0U3RyaW5nKGRlZmF1bHRDdHgsICJ0ZXN0IikKKwltb2NrQ3RybC5GaW5pc2goKQorCWFwcEVyciwgb2sgOj0gZXJyLih0aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uKQorCWlmICFvayB7CisJCXQuRmF0YWwoIkV4cGVjdGVkIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpCisJfQorCWlmIGFwcEVyci5UeXBlSWQoKSAhPSB0aHJpZnQuSU5WQUxJRF9NRVNTQUdFX1RZUEVfRVhDRVBUSU9OIHsKKwkJdC5GYXRhbCgiRXhwZWN0ZWQgSU5WQUxJRF9NRVNTQUdFX1RZUEVfRVhDRVBUSU9OIGVycm9yIikKKwl9Cit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC90ZXN0cy9jb250ZXh0LmdvIGIvbGliL2dvL3Rlc3QvdGVzdHMvY29udGV4dC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTNhODJiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3Rlc3QvdGVzdHMvY29udGV4dC5nbwpAQCAtMCwwICsxLDI2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGVzdHMKKworaW1wb3J0ICgKKwkiY29udGV4dCIKKykKKwordmFyIGRlZmF1bHRDdHggPSBjb250ZXh0LkJhY2tncm91bmQoKQpkaWZmIC0tZ2l0IGEvbGliL2dvL3Rlc3QvdGVzdHMvZW5jb2RpbmdfanNvbl90ZXN0LmdvIGIvbGliL2dvL3Rlc3QvdGVzdHMvZW5jb2RpbmdfanNvbl90ZXN0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyZDQ1NjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGVzdC90ZXN0cy9lbmNvZGluZ19qc29uX3Rlc3QuZ28KQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRlc3RzCisKK2ltcG9ydCAoCisJImVuY29kaW5nIgorCSJlbmNvZGluZy9qc29uIgorCSJ0ZXN0aW5nIgorCSJ0aHJpZnR0ZXN0IgorKQorCitmdW5jIFRlc3RFbnVtSXNUZXh0TWFyc2hhbGxlcih0ICp0ZXN0aW5nLlQpIHsKKwlvbmUgOj0gdGhyaWZ0dGVzdC5OdW1iZXJ6X09ORQorCXZhciB0bSBlbmNvZGluZy5UZXh0TWFyc2hhbGVyID0gb25lCisJYiwgZXJyIDo9IHRtLk1hcnNoYWxUZXh0KCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgZXJyb3IgZnJvbSBNYXJzaGFsVGV4dDogJXMiLCBlcnIpCisJfQorCWlmIHN0cmluZyhiKSAhPSBvbmUuU3RyaW5nKCkgeworCQl0LkVycm9yZigiTWFyc2hhbFRleHQoJXMpID0gJXMsIGV4cGVjdGVkID0gJXMiLCBvbmUsIGIsIG9uZSkKKwl9Cit9CisKK2Z1bmMgVGVzdEVudW1Jc1RleHRVbm1hcnNoYWxsZXIodCAqdGVzdGluZy5UKSB7CisJdmFyIHRtIGVuY29kaW5nLlRleHRVbm1hcnNoYWxlciA9IHRocmlmdHRlc3QuTnVtYmVyelB0cih0aHJpZnR0ZXN0Lk51bWJlcnpfVFdPKQorCWVyciA6PSB0bS5Vbm1hcnNoYWxUZXh0KFtdYnl0ZSgiVFdPIikpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIGVycm9yIGZyb20gVW5tYXJzaGFsVGV4dChUV08pOiAlcyIsIGVycikKKwl9CisJaWYgKih0bS4oKnRocmlmdHRlc3QuTnVtYmVyeikpICE9IHRocmlmdHRlc3QuTnVtYmVyel9UV08geworCQl0LkVycm9yZigiVW5tYXJzaGFsVGV4dChUV08pID0gJXMiLCB0bSkKKwl9CisKKwllcnIgPSB0bS5Vbm1hcnNoYWxUZXh0KFtdYnl0ZSgiTkFOIikpCisJaWYgZXJyID09IG5pbCB7CisJCXQuRXJyb3JmKCJFcnJvciBmcm9tIFVubWFyc2hhbFRleHQoTkFOKSIpCisJfQorfQorCitmdW5jIFRlc3RKU09OTWFyc2hhbFVubWFyc2hhbCh0ICp0ZXN0aW5nLlQpIHsKKwlzMSA6PSB0aHJpZnR0ZXN0LlN0cnVjdEJ7CisJCUFhOiAmdGhyaWZ0dGVzdC5TdHJ1Y3RBe1M6ICJBYSJ9LAorCQlBYjogJnRocmlmdHRlc3QuU3RydWN0QXtTOiAiQWIifSwKKwl9CisKKwliLCBlcnIgOj0ganNvbi5NYXJzaGFsKHMxKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiVW5leHBlY3RlZCBlcnJvciBmcm9tIGpzb24uTWFyc2hhbDogJXMiLCBlcnIpCisJfQorCisJczIgOj0gdGhyaWZ0dGVzdC5TdHJ1Y3RCe30KKwllcnIgPSBqc29uLlVubWFyc2hhbChiLCAmczIpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIGVycm9yIGZyb20ganNvbi5Vbm1hcnNoYWw6ICVzIiwgZXJyKQorCX0KKworCWlmICpzMS5BYSAhPSAqczIuQWEgfHwgKnMxLkFiICE9ICpzMi5BYiB7CisJCXQuTG9nZigiczEgPSAlK3YiLCBzMSkKKwkJdC5Mb2dmKCJzMiA9ICUrdiIsIHMyKQorCQl0LkVycm9yZigianNvbjogVW5tYXJzaGFsKE1hcnNoYWwocykpICE9IHMiKQorCX0KK30KZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L3Rlc3RzL2dvdGFnX3Rlc3QuZ28gYi9saWIvZ28vdGVzdC90ZXN0cy9nb3RhZ190ZXN0LmdvCmluZGV4IGZmYTZlOTYuLjMyZjA1NmYgMTAwNjQ0Ci0tLSBhL2xpYi9nby90ZXN0L3Rlc3RzL2dvdGFnX3Rlc3QuZ28KKysrIGIvbGliL2dvL3Rlc3QvdGVzdHMvZ290YWdfdGVzdC5nbwpAQCAtNDIsMyArNDIsMTIgQEAKIAkJdC5FcnJvcigiVW5leHBlY3RlZCBjdXN0b20gdGFnIHZhbHVlIikKIAl9CiB9CisKK2Z1bmMgVGVzdE9wdGlvbmFsVGFnKHQgKnRlc3RpbmcuVCkgeworCXMgOj0gZ290YWd0ZXN0LlRhZ2dlZHt9CisJc3QgOj0gcmVmbGVjdC5UeXBlT2YocykKKwlmaWVsZCwgb2sgOj0gc3QuRmllbGRCeU5hbWUoIk9wdGlvbmFsSW50VGhpbmciKQorCWlmICFvayB8fCBmaWVsZC5UYWcuR2V0KCJqc29uIikgIT0gIm9wdGlvbmFsX2ludF90aGluZyxvbWl0ZW1wdHkiIHsKKwkJdC5FcnJvcigiVW5leHBlY3RlZCBkZWZhdWx0IHRhZyB2YWx1ZSBmb3Igb3B0aW9uYWwgZmllbGQiKQorCX0KK30KZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L3Rlc3RzL2lnbm9yZWluaXRpYWxpc21zX3Rlc3QuZ28gYi9saWIvZ28vdGVzdC90ZXN0cy9pZ25vcmVpbml0aWFsaXNtc190ZXN0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjZDVmNjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGVzdC90ZXN0cy9pZ25vcmVpbml0aWFsaXNtc190ZXN0LmdvCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0ZXN0cworCitpbXBvcnQgKAorCSJpZ25vcmVpbml0aWFsaXNtc3Rlc3QiCisJInJlZmxlY3QiCisJInRlc3RpbmciCispCisKK2Z1bmMgVGVzdElnbm9yZUluaXRpYWxpc21zRmxhZ0lzSG9ub3VyZWQodCAqdGVzdGluZy5UKSB7CisJcyA6PSBpZ25vcmVpbml0aWFsaXNtc3Rlc3QuSWdub3JlSW5pdGlhbGlzbXNUZXN0e30KKwlzdCA6PSByZWZsZWN0LlR5cGVPZihzKQorCV8sIG9rIDo9IHN0LkZpZWxkQnlOYW1lKCJJZCIpCisJaWYgIW9rIHsKKwkJdC5FcnJvcigiSWQgYXR0cmlidXRlIGlzIG1pc3NpbmchIikKKwl9CisJXywgb2sgPSBzdC5GaWVsZEJ5TmFtZSgiTXlJZCIpCisJaWYgIW9rIHsKKwkJdC5FcnJvcigiTXlJZCBhdHRyaWJ1dGUgaXMgbWlzc2luZyEiKQorCX0KKwlfLCBvayA9IHN0LkZpZWxkQnlOYW1lKCJOdW1DcHUiKQorCWlmICFvayB7CisJCXQuRXJyb3IoIk51bUNwdSBhdHRyaWJ1dGUgaXMgbWlzc2luZyEiKQorCX0KKwlfLCBvayA9IHN0LkZpZWxkQnlOYW1lKCJOdW1HcHUiKQorCWlmICFvayB7CisJCXQuRXJyb3IoIk51bUdwdSBhdHRyaWJ1dGUgaXMgbWlzc2luZyEiKQorCX0KKwlfLCBvayA9IHN0LkZpZWxkQnlOYW1lKCJNeV9JRCIpCisJaWYgIW9rIHsKKwkJdC5FcnJvcigiTXlfSUQgYXR0cmlidXRlIGlzIG1pc3NpbmchIikKKwl9Cit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC90ZXN0cy9pbml0aWFsaXNtc190ZXN0LmdvIGIvbGliL2dvL3Rlc3QvdGVzdHMvaW5pdGlhbGlzbXNfdGVzdC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDkyM2QyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3Rlc3QvdGVzdHMvaW5pdGlhbGlzbXNfdGVzdC5nbwpAQCAtMCwwICsxLDQzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGVzdHMKKworaW1wb3J0ICgKKwkiaW5pdGlhbGlzbXN0ZXN0IgorCSJyZWZsZWN0IgorCSJ0ZXN0aW5nIgorKQorCitmdW5jIFRlc3RUaGF0Q29tbW9uSW5pdGlhbGlzbXNBcmVGaXhlZCh0ICp0ZXN0aW5nLlQpIHsKKwlzIDo9IGluaXRpYWxpc21zdGVzdC5Jbml0aWFsaXNtc1Rlc3R7fQorCXN0IDo9IHJlZmxlY3QuVHlwZU9mKHMpCisJXywgb2sgOj0gc3QuRmllbGRCeU5hbWUoIlVzZXJJRCIpCisJaWYgIW9rIHsKKwkJdC5FcnJvcigiVXNlcklEIGF0dHJpYnV0ZSBpcyBtaXNzaW5nISIpCisJfQorCV8sIG9rID0gc3QuRmllbGRCeU5hbWUoIlNlcnZlclVSTCIpCisJaWYgIW9rIHsKKwkJdC5FcnJvcigiU2VydmVyVVJMIGF0dHJpYnV0ZSBpcyBtaXNzaW5nISIpCisJfQorCV8sIG9rID0gc3QuRmllbGRCeU5hbWUoIklEIikKKwlpZiAhb2sgeworCQl0LkVycm9yKCJJRCBhdHRyaWJ1dGUgaXMgbWlzc2luZyEiKQorCX0KK30KZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L3Rlc3RzL211bHRpcGxleGVkX3Byb3RvY29sX3Rlc3QuZ28gYi9saWIvZ28vdGVzdC90ZXN0cy9tdWx0aXBsZXhlZF9wcm90b2NvbF90ZXN0LmdvCmluZGV4IDAwNjY5ZWYuLjYxYWM2MjggMTAwNjQ0Ci0tLSBhL2xpYi9nby90ZXN0L3Rlc3RzL211bHRpcGxleGVkX3Byb3RvY29sX3Rlc3QuZ28KKysrIGIvbGliL2dvL3Rlc3QvdGVzdHMvbXVsdGlwbGV4ZWRfcHJvdG9jb2xfdGVzdC5nbwpAQCAtMjAsMTAgKzIwLDEyIEBACiBwYWNrYWdlIHRlc3RzCiAKIGltcG9ydCAoCisJImNvbnRleHQiCiAJIm11bHRpcGxleGVkcHJvdG9jb2x0ZXN0IgogCSJuZXQiCiAJInRlc3RpbmciCiAJInRocmlmdCIKKwkidGltZSIKICkKIAogZnVuYyBGaW5kQXZhaWxhYmxlVENQU2VydmVyUG9ydCgpIG5ldC5BZGRyIHsKQEAgLTM3LDI0ICszOSwzMiBAQAogCiB0eXBlIEZpcnN0SW1wbCBzdHJ1Y3R7fQogCi1mdW5jIChmICpGaXJzdEltcGwpIFJldHVybk9uZSgpIChyIGludDY0LCBlcnIgZXJyb3IpIHsKK2Z1bmMgKGYgKkZpcnN0SW1wbCkgUmV0dXJuT25lKGN0eCBjb250ZXh0LkNvbnRleHQpIChyIGludDY0LCBlcnIgZXJyb3IpIHsKIAlyZXR1cm4gMSwgbmlsCiB9CiAKIHR5cGUgU2Vjb25kSW1wbCBzdHJ1Y3R7fQogCi1mdW5jIChzICpTZWNvbmRJbXBsKSBSZXR1cm5Ud28oKSAociBpbnQ2NCwgZXJyIGVycm9yKSB7CitmdW5jIChzICpTZWNvbmRJbXBsKSBSZXR1cm5Ud28oY3R4IGNvbnRleHQuQ29udGV4dCkgKHIgaW50NjQsIGVyciBlcnJvcikgewogCXJldHVybiAyLCBuaWwKIH0KIAotdmFyIHByb2Nlc3NvciA9IHRocmlmdC5OZXdUTXVsdGlwbGV4ZWRQcm9jZXNzb3IoKQorZnVuYyBjcmVhdGVUcmFuc3BvcnQoYWRkciBuZXQuQWRkcikgKHRocmlmdC5UVHJhbnNwb3J0LCBlcnJvcikgeworCXNvY2tldCA6PSB0aHJpZnQuTmV3VFNvY2tldEZyb21BZGRyVGltZW91dChhZGRyLCBUSU1FT1VUKQorCXRyYW5zcG9ydCA6PSB0aHJpZnQuTmV3VEZyYW1lZFRyYW5zcG9ydChzb2NrZXQpCisJZXJyIDo9IHRyYW5zcG9ydC5PcGVuKCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIG5pbCwgZXJyCisJfQorCXJldHVybiB0cmFuc3BvcnQsIG5pbAorfQogCi1mdW5jIFRlc3RJbml0VHdvU2VydmVycyh0ICp0ZXN0aW5nLlQpIHsKLQl2YXIgZXJyIGVycm9yCitmdW5jIFRlc3RNdWx0aXBsZXhlZFByb3RvY29sRmlyc3QodCAqdGVzdGluZy5UKSB7CisJcHJvY2Vzc29yIDo9IHRocmlmdC5OZXdUTXVsdGlwbGV4ZWRQcm9jZXNzb3IoKQogCXByb3RvY29sRmFjdG9yeSA6PSB0aHJpZnQuTmV3VEJpbmFyeVByb3RvY29sRmFjdG9yeURlZmF1bHQoKQogCXRyYW5zcG9ydEZhY3RvcnkgOj0gdGhyaWZ0Lk5ld1RUcmFuc3BvcnRGYWN0b3J5KCkKIAl0cmFuc3BvcnRGYWN0b3J5ID0gdGhyaWZ0Lk5ld1RGcmFtZWRUcmFuc3BvcnRGYWN0b3J5KHRyYW5zcG9ydEZhY3RvcnkpCi0JYWRkciA9IEZpbmRBdmFpbGFibGVUQ1BTZXJ2ZXJQb3J0KCkKKwlhZGRyIDo9IEZpbmRBdmFpbGFibGVUQ1BTZXJ2ZXJQb3J0KCkKIAlzZXJ2ZXJUcmFuc3BvcnQsIGVyciA6PSB0aHJpZnQuTmV3VFNlcnZlclNvY2tldFRpbWVvdXQoYWRkci5TdHJpbmcoKSwgVElNRU9VVCkKIAlpZiBlcnIgIT0gbmlsIHsKIAkJdC5GYXRhbCgiVW5hYmxlIHRvIGNyZWF0ZSBzZXJ2ZXIgc29ja2V0IiwgZXJyKQpAQCAtNjcsODEgKzc3LDExNyBAQAogCXNlY29uZFByb2Nlc3NvciA6PSBtdWx0aXBsZXhlZHByb3RvY29sdGVzdC5OZXdTZWNvbmRQcm9jZXNzb3IoJlNlY29uZEltcGx7fSkKIAlwcm9jZXNzb3IuUmVnaXN0ZXJQcm9jZXNzb3IoIlNlY29uZFNlcnZpY2UiLCBzZWNvbmRQcm9jZXNzb3IpCiAKKwlkZWZlciBzZXJ2ZXIuU3RvcCgpCiAJZ28gc2VydmVyLlNlcnZlKCkKLX0KKwl0aW1lLlNsZWVwKDEwICogdGltZS5NaWxsaXNlY29uZCkKIAotdmFyIGZpcnN0Q2xpZW50ICptdWx0aXBsZXhlZHByb3RvY29sdGVzdC5GaXJzdENsaWVudAotCi1mdW5jIFRlc3RJbml0Q2xpZW50MSh0ICp0ZXN0aW5nLlQpIHsKLQlzb2NrZXQgOj0gdGhyaWZ0Lk5ld1RTb2NrZXRGcm9tQWRkclRpbWVvdXQoYWRkciwgVElNRU9VVCkKLQl0cmFuc3BvcnQgOj0gdGhyaWZ0Lk5ld1RGcmFtZWRUcmFuc3BvcnQoc29ja2V0KQotCXZhciBwcm90b2NvbCB0aHJpZnQuVFByb3RvY29sID0gdGhyaWZ0Lk5ld1RCaW5hcnlQcm90b2NvbFRyYW5zcG9ydCh0cmFuc3BvcnQpCi0JcHJvdG9jb2wgPSB0aHJpZnQuTmV3VE11bHRpcGxleGVkUHJvdG9jb2wocHJvdG9jb2wsICJGaXJzdFNlcnZpY2UiKQotCWZpcnN0Q2xpZW50ID0gbXVsdGlwbGV4ZWRwcm90b2NvbHRlc3QuTmV3Rmlyc3RDbGllbnRQcm90b2NvbCh0cmFuc3BvcnQsIHByb3RvY29sLCBwcm90b2NvbCkKLQllcnIgOj0gdHJhbnNwb3J0Lk9wZW4oKQorCXRyYW5zcG9ydCwgZXJyIDo9IGNyZWF0ZVRyYW5zcG9ydChhZGRyKQogCWlmIGVyciAhPSBuaWwgewotCQl0LkZhdGFsKCJVbmFibGUgdG8gb3BlbiBjbGllbnQgc29ja2V0IiwgZXJyKQorCQl0LkZhdGFsKGVycikKIAl9Ci19CisJZGVmZXIgdHJhbnNwb3J0LkNsb3NlKCkKKwlwcm90b2NvbCA6PSB0aHJpZnQuTmV3VE11bHRpcGxleGVkUHJvdG9jb2wodGhyaWZ0Lk5ld1RCaW5hcnlQcm90b2NvbFRyYW5zcG9ydCh0cmFuc3BvcnQpLCAiRmlyc3RTZXJ2aWNlIikKIAotdmFyIHNlY29uZENsaWVudCAqbXVsdGlwbGV4ZWRwcm90b2NvbHRlc3QuU2Vjb25kQ2xpZW50CisJY2xpZW50IDo9IG11bHRpcGxleGVkcHJvdG9jb2x0ZXN0Lk5ld0ZpcnN0Q2xpZW50KHRocmlmdC5OZXdUU3RhbmRhcmRDbGllbnQocHJvdG9jb2wsIHByb3RvY29sKSkKIAotZnVuYyBUZXN0SW5pdENsaWVudDIodCAqdGVzdGluZy5UKSB7Ci0Jc29ja2V0IDo9IHRocmlmdC5OZXdUU29ja2V0RnJvbUFkZHJUaW1lb3V0KGFkZHIsIFRJTUVPVVQpCi0JdHJhbnNwb3J0IDo9IHRocmlmdC5OZXdURnJhbWVkVHJhbnNwb3J0KHNvY2tldCkKLQl2YXIgcHJvdG9jb2wgdGhyaWZ0LlRQcm90b2NvbCA9IHRocmlmdC5OZXdUQmluYXJ5UHJvdG9jb2xUcmFuc3BvcnQodHJhbnNwb3J0KQotCXByb3RvY29sID0gdGhyaWZ0Lk5ld1RNdWx0aXBsZXhlZFByb3RvY29sKHByb3RvY29sLCAiU2Vjb25kU2VydmljZSIpCi0Jc2Vjb25kQ2xpZW50ID0gbXVsdGlwbGV4ZWRwcm90b2NvbHRlc3QuTmV3U2Vjb25kQ2xpZW50UHJvdG9jb2wodHJhbnNwb3J0LCBwcm90b2NvbCwgcHJvdG9jb2wpCi0JZXJyIDo9IHRyYW5zcG9ydC5PcGVuKCkKLQlpZiBlcnIgIT0gbmlsIHsKLQkJdC5GYXRhbCgiVW5hYmxlIHRvIG9wZW4gY2xpZW50IHNvY2tldCIsIGVycikKLQl9Ci19Ci0KLS8vY3JlYXRlIGNsaWVudCB3aXRob3V0IHNlcnZpY2UgcHJlZml4Ci1mdW5jIGNyZWF0ZUxlZ2FjeUNsaWVudCh0ICp0ZXN0aW5nLlQpICptdWx0aXBsZXhlZHByb3RvY29sdGVzdC5TZWNvbmRDbGllbnQgewotCXNvY2tldCA6PSB0aHJpZnQuTmV3VFNvY2tldEZyb21BZGRyVGltZW91dChhZGRyLCBUSU1FT1VUKQotCXRyYW5zcG9ydCA6PSB0aHJpZnQuTmV3VEZyYW1lZFRyYW5zcG9ydChzb2NrZXQpCi0JdmFyIHByb3RvY29sIHRocmlmdC5UUHJvdG9jb2wgPSB0aHJpZnQuTmV3VEJpbmFyeVByb3RvY29sVHJhbnNwb3J0KHRyYW5zcG9ydCkKLQlsZWdhY3lDbGllbnQgOj0gbXVsdGlwbGV4ZWRwcm90b2NvbHRlc3QuTmV3U2Vjb25kQ2xpZW50UHJvdG9jb2wodHJhbnNwb3J0LCBwcm90b2NvbCwgcHJvdG9jb2wpCi0JZXJyIDo9IHRyYW5zcG9ydC5PcGVuKCkKLQlpZiBlcnIgIT0gbmlsIHsKLQkJdC5GYXRhbCgiVW5hYmxlIHRvIG9wZW4gY2xpZW50IHNvY2tldCIsIGVycikKLQl9Ci0JcmV0dXJuIGxlZ2FjeUNsaWVudAotfQotCi1mdW5jIFRlc3RDYWxsRmlyc3QodCAqdGVzdGluZy5UKSB7Ci0JcmV0LCBlcnIgOj0gZmlyc3RDbGllbnQuUmV0dXJuT25lKCkKKwlyZXQsIGVyciA6PSBjbGllbnQuUmV0dXJuT25lKGRlZmF1bHRDdHgpCiAJaWYgZXJyICE9IG5pbCB7CiAJCXQuRmF0YWwoIlVuYWJsZSB0byBjYWxsIGZpcnN0IHNlcnZlcjoiLCBlcnIpCi0JfQotCWlmIHJldCAhPSAxIHsKKwl9IGVsc2UgaWYgcmV0ICE9IDEgewogCQl0LkZhdGFsKCJVbmV4cGVjdGVkIHJlc3VsdCBmcm9tIHNlcnZlcjogIiwgcmV0KQogCX0KIH0KIAotZnVuYyBUZXN0Q2FsbFNlY29uZCh0ICp0ZXN0aW5nLlQpIHsKLQlyZXQsIGVyciA6PSBzZWNvbmRDbGllbnQuUmV0dXJuVHdvKCkKK2Z1bmMgVGVzdE11bHRpcGxleGVkUHJvdG9jb2xTZWNvbmQodCAqdGVzdGluZy5UKSB7CisJcHJvY2Vzc29yIDo9IHRocmlmdC5OZXdUTXVsdGlwbGV4ZWRQcm9jZXNzb3IoKQorCXByb3RvY29sRmFjdG9yeSA6PSB0aHJpZnQuTmV3VEJpbmFyeVByb3RvY29sRmFjdG9yeURlZmF1bHQoKQorCXRyYW5zcG9ydEZhY3RvcnkgOj0gdGhyaWZ0Lk5ld1RUcmFuc3BvcnRGYWN0b3J5KCkKKwl0cmFuc3BvcnRGYWN0b3J5ID0gdGhyaWZ0Lk5ld1RGcmFtZWRUcmFuc3BvcnRGYWN0b3J5KHRyYW5zcG9ydEZhY3RvcnkpCisJYWRkciA6PSBGaW5kQXZhaWxhYmxlVENQU2VydmVyUG9ydCgpCisJc2VydmVyVHJhbnNwb3J0LCBlcnIgOj0gdGhyaWZ0Lk5ld1RTZXJ2ZXJTb2NrZXRUaW1lb3V0KGFkZHIuU3RyaW5nKCksIFRJTUVPVVQpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoIlVuYWJsZSB0byBjcmVhdGUgc2VydmVyIHNvY2tldCIsIGVycikKKwl9CisJc2VydmVyID0gdGhyaWZ0Lk5ld1RTaW1wbGVTZXJ2ZXI0KHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpCisKKwlmaXJzdFByb2Nlc3NvciA6PSBtdWx0aXBsZXhlZHByb3RvY29sdGVzdC5OZXdGaXJzdFByb2Nlc3NvcigmRmlyc3RJbXBse30pCisJcHJvY2Vzc29yLlJlZ2lzdGVyUHJvY2Vzc29yKCJGaXJzdFNlcnZpY2UiLCBmaXJzdFByb2Nlc3NvcikKKworCXNlY29uZFByb2Nlc3NvciA6PSBtdWx0aXBsZXhlZHByb3RvY29sdGVzdC5OZXdTZWNvbmRQcm9jZXNzb3IoJlNlY29uZEltcGx7fSkKKwlwcm9jZXNzb3IuUmVnaXN0ZXJQcm9jZXNzb3IoIlNlY29uZFNlcnZpY2UiLCBzZWNvbmRQcm9jZXNzb3IpCisKKwlkZWZlciBzZXJ2ZXIuU3RvcCgpCisJZ28gc2VydmVyLlNlcnZlKCkKKwl0aW1lLlNsZWVwKDEwICogdGltZS5NaWxsaXNlY29uZCkKKworCXRyYW5zcG9ydCwgZXJyIDo9IGNyZWF0ZVRyYW5zcG9ydChhZGRyKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsKGVycikKKwl9CisJZGVmZXIgdHJhbnNwb3J0LkNsb3NlKCkKKwlwcm90b2NvbCA6PSB0aHJpZnQuTmV3VE11bHRpcGxleGVkUHJvdG9jb2wodGhyaWZ0Lk5ld1RCaW5hcnlQcm90b2NvbFRyYW5zcG9ydCh0cmFuc3BvcnQpLCAiU2Vjb25kU2VydmljZSIpCisKKwljbGllbnQgOj0gbXVsdGlwbGV4ZWRwcm90b2NvbHRlc3QuTmV3U2Vjb25kQ2xpZW50KHRocmlmdC5OZXdUU3RhbmRhcmRDbGllbnQocHJvdG9jb2wsIHByb3RvY29sKSkKKworCXJldCwgZXJyIDo9IGNsaWVudC5SZXR1cm5Ud28oZGVmYXVsdEN0eCkKIAlpZiBlcnIgIT0gbmlsIHsKIAkJdC5GYXRhbCgiVW5hYmxlIHRvIGNhbGwgc2Vjb25kIHNlcnZlcjoiLCBlcnIpCi0JfQotCWlmIHJldCAhPSAyIHsKKwl9IGVsc2UgaWYgcmV0ICE9IDIgewogCQl0LkZhdGFsKCJVbmV4cGVjdGVkIHJlc3VsdCBmcm9tIHNlcnZlcjogIiwgcmV0KQogCX0KIH0KIAotZnVuYyBUZXN0Q2FsbExlZ2FjeSh0ICp0ZXN0aW5nLlQpIHsKLQlsZWdhY3lDbGllbnQgOj0gY3JlYXRlTGVnYWN5Q2xpZW50KHQpCi0JcmV0LCBlcnIgOj0gbGVnYWN5Q2xpZW50LlJldHVyblR3bygpCitmdW5jIFRlc3RNdWx0aXBsZXhlZFByb3RvY29sTGVnYWN5KHQgKnRlc3RpbmcuVCkgeworCXByb2Nlc3NvciA6PSB0aHJpZnQuTmV3VE11bHRpcGxleGVkUHJvY2Vzc29yKCkKKwlwcm90b2NvbEZhY3RvcnkgOj0gdGhyaWZ0Lk5ld1RCaW5hcnlQcm90b2NvbEZhY3RvcnlEZWZhdWx0KCkKKwl0cmFuc3BvcnRGYWN0b3J5IDo9IHRocmlmdC5OZXdUVHJhbnNwb3J0RmFjdG9yeSgpCisJdHJhbnNwb3J0RmFjdG9yeSA9IHRocmlmdC5OZXdURnJhbWVkVHJhbnNwb3J0RmFjdG9yeSh0cmFuc3BvcnRGYWN0b3J5KQorCWFkZHIgOj0gRmluZEF2YWlsYWJsZVRDUFNlcnZlclBvcnQoKQorCXNlcnZlclRyYW5zcG9ydCwgZXJyIDo9IHRocmlmdC5OZXdUU2VydmVyU29ja2V0VGltZW91dChhZGRyLlN0cmluZygpLCBUSU1FT1VUKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsKCJVbmFibGUgdG8gY3JlYXRlIHNlcnZlciBzb2NrZXQiLCBlcnIpCisJfQorCXNlcnZlciA9IHRocmlmdC5OZXdUU2ltcGxlU2VydmVyNChwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KQorCisJZmlyc3RQcm9jZXNzb3IgOj0gbXVsdGlwbGV4ZWRwcm90b2NvbHRlc3QuTmV3Rmlyc3RQcm9jZXNzb3IoJkZpcnN0SW1wbHt9KQorCXByb2Nlc3Nvci5SZWdpc3RlclByb2Nlc3NvcigiRmlyc3RTZXJ2aWNlIiwgZmlyc3RQcm9jZXNzb3IpCisKKwlzZWNvbmRQcm9jZXNzb3IgOj0gbXVsdGlwbGV4ZWRwcm90b2NvbHRlc3QuTmV3U2Vjb25kUHJvY2Vzc29yKCZTZWNvbmRJbXBse30pCisJcHJvY2Vzc29yLlJlZ2lzdGVyUHJvY2Vzc29yKCJTZWNvbmRTZXJ2aWNlIiwgc2Vjb25kUHJvY2Vzc29yKQorCisJZGVmZXIgc2VydmVyLlN0b3AoKQorCWdvIHNlcnZlci5TZXJ2ZSgpCisJdGltZS5TbGVlcCgxMCAqIHRpbWUuTWlsbGlzZWNvbmQpCisKKwl0cmFuc3BvcnQsIGVyciA6PSBjcmVhdGVUcmFuc3BvcnQoYWRkcikKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcihlcnIpCisJCXJldHVybgorCX0KKwlkZWZlciB0cmFuc3BvcnQuQ2xvc2UoKQorCisJcHJvdG9jb2wgOj0gdGhyaWZ0Lk5ld1RCaW5hcnlQcm90b2NvbFRyYW5zcG9ydCh0cmFuc3BvcnQpCisJY2xpZW50IDo9IG11bHRpcGxleGVkcHJvdG9jb2x0ZXN0Lk5ld1NlY29uZENsaWVudCh0aHJpZnQuTmV3VFN0YW5kYXJkQ2xpZW50KHByb3RvY29sLCBwcm90b2NvbCkpCisKKwlyZXQsIGVyciA6PSBjbGllbnQuUmV0dXJuVHdvKGRlZmF1bHRDdHgpCiAJLy9leHBlY3QgZXJyb3Igc2luY2UgZGVmYXVsdCBwcm9jZXNzb3IgaXMgbm90IHJlZ2lzdGVyZWQKIAlpZiBlcnIgPT0gbmlsIHsKIAkJdC5GYXRhbCgiRXhwZWN0aW5nIGVycm9yIikKIAl9CisKIAkvL3JlZ2lzdGVyIGRlZmF1bHQgcHJvY2Vzc29yIGFuZCBjYWxsIGFnYWluCiAJcHJvY2Vzc29yLlJlZ2lzdGVyRGVmYXVsdChtdWx0aXBsZXhlZHByb3RvY29sdGVzdC5OZXdTZWNvbmRQcm9jZXNzb3IoJlNlY29uZEltcGx7fSkpCi0JbGVnYWN5Q2xpZW50ID0gY3JlYXRlTGVnYWN5Q2xpZW50KHQpCi0JcmV0LCBlcnIgPSBsZWdhY3lDbGllbnQuUmV0dXJuVHdvKCkKKwl0cmFuc3BvcnQsIGVyciA9IGNyZWF0ZVRyYW5zcG9ydChhZGRyKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkVycm9yKGVycikKKwkJcmV0dXJuCisJfQorCWRlZmVyIHRyYW5zcG9ydC5DbG9zZSgpCisKKwlwcm90b2NvbCA9IHRocmlmdC5OZXdUQmluYXJ5UHJvdG9jb2xUcmFuc3BvcnQodHJhbnNwb3J0KQorCWNsaWVudCA9IG11bHRpcGxleGVkcHJvdG9jb2x0ZXN0Lk5ld1NlY29uZENsaWVudCh0aHJpZnQuTmV3VFN0YW5kYXJkQ2xpZW50KHByb3RvY29sLCBwcm90b2NvbCkpCisKKwlyZXQsIGVyciA9IGNsaWVudC5SZXR1cm5Ud28oZGVmYXVsdEN0eCkKIAlpZiBlcnIgIT0gbmlsIHsKIAkJdC5GYXRhbCgiVW5hYmxlIHRvIGNhbGwgbGVnYWN5IHNlcnZlcjoiLCBlcnIpCiAJfQpAQCAtMTQ5LDkgKzE5NSwzIEBACiAJCXQuRmF0YWwoIlVuZXhwZWN0ZWQgcmVzdWx0IGZyb20gc2VydmVyOiAiLCByZXQpCiAJfQogfQotCi1mdW5jIFRlc3RTaHV0ZG93blNlcnZlckFuZENsaWVudHModCAqdGVzdGluZy5UKSB7Ci0JZmlyc3RDbGllbnQuVHJhbnNwb3J0LkNsb3NlKCkKLQlzZWNvbmRDbGllbnQuVHJhbnNwb3J0LkNsb3NlKCkKLQlzZXJ2ZXIuU3RvcCgpCi19CmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC90ZXN0cy9uYW1lc190ZXN0LmdvIGIvbGliL2dvL3Rlc3QvdGVzdHMvbmFtZXNfdGVzdC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGI2M2EzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3Rlc3QvdGVzdHMvbmFtZXNfdGVzdC5nbwpAQCAtMCwwICsxLDM1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGVzdHMKKworaW1wb3J0ICgKKwkibmFtZXN0ZXN0IgorCSJyZWZsZWN0IgorCSJ0ZXN0aW5nIgorKQorCitmdW5jIFRlc3RUaGF0QXR0cmlidXRlTmFtZVN1YnN0aXR1aW9uRG9lc05vdE9jY3VyKHQgKnRlc3RpbmcuVCkgeworCXMgOj0gbmFtZXN0ZXN0Lk5hbWVzVGVzdHt9CisJc3QgOj0gcmVmbGVjdC5UeXBlT2YocykKKwlfLCBvayA6PSBzdC5GaWVsZEJ5TmFtZSgiVHlwZSIpCisJaWYgIW9rIHsKKwkJdC5FcnJvcigiVHlwZSBhdHRyaWJ1dGUgaXMgbWlzc2luZyEiKQorCX0KK30KZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L3Rlc3RzL29uZV93YXlfdGVzdC5nbyBiL2xpYi9nby90ZXN0L3Rlc3RzL29uZV93YXlfdGVzdC5nbwppbmRleCAzZmYwMjVmLi40OGQwYmJlIDEwMDY0NAotLS0gYS9saWIvZ28vdGVzdC90ZXN0cy9vbmVfd2F5X3Rlc3QuZ28KKysrIGIvbGliL2dvL3Rlc3QvdGVzdHMvb25lX3dheV90ZXN0LmdvCkBAIC0yMCw2ICsyMCw3IEBACiBwYWNrYWdlIHRlc3RzCiAKIGltcG9ydCAoCisJImNvbnRleHQiCiAJImZtdCIKIAkibmV0IgogCSJvbmV3YXl0ZXN0IgpAQCAtMzksOSArNDAsOSBAQAogCiB0eXBlIGltcGwgc3RydWN0e30KIAotZnVuYyAoaSAqaW1wbCkgSGkoaW4gaW50NjQsIHMgc3RyaW5nKSAoZXJyIGVycm9yKSAgICAgICAgeyBmbXQuUHJpbnRsbigiSGkhIik7IHJldHVybiB9Ci1mdW5jIChpICppbXBsKSBFbXB0eWZ1bmMoKSAoZXJyIGVycm9yKSAgICAgICAgICAgICAgICAgICB7IHJldHVybiB9Ci1mdW5jIChpICppbXBsKSBFY2hvSW50KHBhcmFtIGludDY0KSAociBpbnQ2NCwgZXJyIGVycm9yKSB7IHJldHVybiBwYXJhbSwgbmlsIH0KK2Z1bmMgKGkgKmltcGwpIEhpKGN0eCBjb250ZXh0LkNvbnRleHQsIGluIGludDY0LCBzIHN0cmluZykgKGVyciBlcnJvcikgICAgICAgIHsgZm10LlByaW50bG4oIkhpISIpOyByZXR1cm4gfQorZnVuYyAoaSAqaW1wbCkgRW1wdHlmdW5jKGN0eCBjb250ZXh0LkNvbnRleHQpIChlcnIgZXJyb3IpICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gfQorZnVuYyAoaSAqaW1wbCkgRWNob0ludChjdHggY29udGV4dC5Db250ZXh0LCBwYXJhbSBpbnQ2NCkgKHIgaW50NjQsIGVyciBlcnJvcikgeyByZXR1cm4gcGFyYW0sIG5pbCB9CiAKIGNvbnN0IFRJTUVPVVQgPSB0aW1lLlNlY29uZAogCkBAIC02MCwxMiArNjEsMTMgQEAKIAlzZXJ2ZXIgPSB0aHJpZnQuTmV3VFNpbXBsZVNlcnZlcjIocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQpCiAKIAlnbyBzZXJ2ZXIuU2VydmUoKQorCXRpbWUuU2xlZXAoMTAgKiB0aW1lLk1pbGxpc2Vjb25kKQogfQogCiBmdW5jIFRlc3RJbml0T25ld2F5Q2xpZW50KHQgKnRlc3RpbmcuVCkgewogCXRyYW5zcG9ydCA6PSB0aHJpZnQuTmV3VFNvY2tldEZyb21BZGRyVGltZW91dChhZGRyLCBUSU1FT1VUKQogCXByb3RvY29sIDo9IHRocmlmdC5OZXdUQmluYXJ5UHJvdG9jb2xUcmFuc3BvcnQodHJhbnNwb3J0KQotCWNsaWVudCA9IG9uZXdheXRlc3QuTmV3T25lV2F5Q2xpZW50UHJvdG9jb2wodHJhbnNwb3J0LCBwcm90b2NvbCwgcHJvdG9jb2wpCisJY2xpZW50ID0gb25ld2F5dGVzdC5OZXdPbmVXYXlDbGllbnQodGhyaWZ0Lk5ld1RTdGFuZGFyZENsaWVudChwcm90b2NvbCwgcHJvdG9jb2wpKQogCWVyciA6PSB0cmFuc3BvcnQuT3BlbigpCiAJaWYgZXJyICE9IG5pbCB7CiAJCXQuRmF0YWwoIlVuYWJsZSB0byBvcGVuIGNsaWVudCBzb2NrZXQiLCBlcnIpCkBAIC03NCwxMiArNzYsMTIgQEAKIAogZnVuYyBUZXN0Q2FsbE9uZXdheVNlcnZlcih0ICp0ZXN0aW5nLlQpIHsKIAkvL2NhbGwgb25ld2F5IGZ1bmN0aW9uCi0JZXJyIDo9IGNsaWVudC5IaSgxLCAiIikKKwllcnIgOj0gY2xpZW50LkhpKGRlZmF1bHRDdHgsIDEsICIiKQogCWlmIGVyciAhPSBuaWwgewogCQl0LkZhdGFsKCJVbmV4cGVjdGVkIGVycm9yOiAiLCBlcnIpCiAJfQogCS8vVGhlcmUgaXMgbm8gd2F5IHRvIGRldGVjdCBwcm90b2NvbCBwcm9ibGVtcyB3aXRoIHNpbmdsZSBvbmV3YXkgY2FsbCBzbyB3ZSBjYWxsIGl0IHNlY29uZCB0aW1lCi0JaSwgZXJyIDo9IGNsaWVudC5FY2hvSW50KDQyKQorCWksIGVyciA6PSBjbGllbnQuRWNob0ludChkZWZhdWx0Q3R4LCA0MikKIAlpZiBlcnIgIT0gbmlsIHsKIAkJdC5GYXRhbCgiVW5leHBlY3RlZCBlcnJvcjogIiwgZXJyKQogCX0KZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L3Rlc3RzL29wdGlvbmFsX2ZpZWxkc190ZXN0LmdvIGIvbGliL2dvL3Rlc3QvdGVzdHMvb3B0aW9uYWxfZmllbGRzX3Rlc3QuZ28KaW5kZXggMzI0YmYwMC4uMzRhZDY2MCAxMDA2NDQKLS0tIGEvbGliL2dvL3Rlc3QvdGVzdHMvb3B0aW9uYWxfZmllbGRzX3Rlc3QuZ28KKysrIGIvbGliL2dvL3Rlc3QvdGVzdHMvb3B0aW9uYWxfZmllbGRzX3Rlc3QuZ28KQEAgLTIxLDcgKzIxLDcgQEAKIAogaW1wb3J0ICgKIAkiYnl0ZXMiCi0JZ29tb2NrICJjb2RlLmdvb2dsZS5jb20vcC9nb21vY2svZ29tb2NrIgorCWdvbW9jayAiZ2l0aHViLmNvbS9nb2xhbmcvbW9jay9nb21vY2siCiAJIm9wdGlvbmFsZmllbGRzdGVzdCIKIAkidGVzdGluZyIKIAkidGhyaWZ0IgpkaWZmIC0tZ2l0IGEvbGliL2dvL3Rlc3QvdGVzdHMvcHJvdG9jb2xfbW9jay5nbyBiL2xpYi9nby90ZXN0L3Rlc3RzL3Byb3RvY29sX21vY2suZ28KaW5kZXggZDNmNDA3OC4uNTFkN2EwMiAxMDA2NDQKLS0tIGEvbGliL2dvL3Rlc3QvdGVzdHMvcHJvdG9jb2xfbW9jay5nbworKysgYi9saWIvZ28vdGVzdC90ZXN0cy9wcm90b2NvbF9tb2NrLmdvCkBAIC0yMyw4ICsyMywxMCBAQAogcGFja2FnZSB0ZXN0cwogCiBpbXBvcnQgKAorCSJjb250ZXh0IgogCXRocmlmdCAidGhyaWZ0IgotCWdvbW9jayAiY29kZS5nb29nbGUuY29tL3AvZ29tb2NrL2dvbW9jayIKKworCWdvbW9jayAiZ2l0aHViLmNvbS9nb2xhbmcvbW9jay9nb21vY2siCiApCiAKIC8vIE1vY2sgb2YgVFByb3RvY29sIGludGVyZmFjZQpAQCAtNDgsMTMgKzUwLDEzIEBACiAJcmV0dXJuIF9tLnJlY29yZGVyCiB9CiAKLWZ1bmMgKF9tICpNb2NrVFByb3RvY29sKSBGbHVzaCgpIGVycm9yIHsKK2Z1bmMgKF9tICpNb2NrVFByb3RvY29sKSBGbHVzaChjdHggY29udGV4dC5Db250ZXh0KSBlcnJvciB7CiAJcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIkZsdXNoIikKIAlyZXQwLCBfIDo9IHJldFswXS4oZXJyb3IpCiAJcmV0dXJuIHJldDAKIH0KIAotZnVuYyAoX21yICpfTW9ja1RQcm90b2NvbFJlY29yZGVyKSBGbHVzaCgpICpnb21vY2suQ2FsbCB7CitmdW5jIChfbXIgKl9Nb2NrVFByb3RvY29sUmVjb3JkZXIpIEZsdXNoKGN0eCBjb250ZXh0LkNvbnRleHQpICpnb21vY2suQ2FsbCB7CiAJcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIkZsdXNoIikKIH0KIApAQCAtODAsOSArODIsOSBAQAogCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJSZWFkQm9vbCIpCiB9CiAKLWZ1bmMgKF9tICpNb2NrVFByb3RvY29sKSBSZWFkQnl0ZSgpIChieXRlLCBlcnJvcikgeworZnVuYyAoX20gKk1vY2tUUHJvdG9jb2wpIFJlYWRCeXRlKCkgKGludDgsIGVycm9yKSB7CiAJcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIlJlYWRCeXRlIikKLQlyZXQwLCBfIDo9IHJldFswXS4oYnl0ZSkKKwlyZXQwLCBfIDo9IHJldFswXS4oaW50OCkKIAlyZXQxLCBfIDo9IHJldFsxXS4oZXJyb3IpCiAJcmV0dXJuIHJldDAsIHJldDEKIH0KQEAgLTMyMCw3ICszMjIsNyBAQAogCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJXcml0ZUJvb2wiLCBhcmcwKQogfQogCi1mdW5jIChfbSAqTW9ja1RQcm90b2NvbCkgV3JpdGVCeXRlKF9wYXJhbTAgYnl0ZSkgZXJyb3IgeworZnVuYyAoX20gKk1vY2tUUHJvdG9jb2wpIFdyaXRlQnl0ZShfcGFyYW0wIGludDgpIGVycm9yIHsKIAlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiV3JpdGVCeXRlIiwgX3BhcmFtMCkKIAlyZXQwLCBfIDo9IHJldFswXS4oZXJyb3IpCiAJcmV0dXJuIHJldDAKZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L3Rlc3RzL3Byb3RvY29sc190ZXN0LmdvIGIvbGliL2dvL3Rlc3QvdGVzdHMvcHJvdG9jb2xzX3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZmZDljMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90ZXN0L3Rlc3RzL3Byb3RvY29sc190ZXN0LmdvCkBAIC0wLDAgKzEsOTcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0ZXN0cworCitpbXBvcnQgKAorCSJ0ZXN0aW5nIgorCSJ0aHJpZnQiCisJInRocmlmdHRlc3QiCispCisKK2Z1bmMgUnVuU29ja2V0VGVzdFN1aXRlKHQgKnRlc3RpbmcuVCwgcHJvdG9jb2xGYWN0b3J5IHRocmlmdC5UUHJvdG9jb2xGYWN0b3J5LAorCXRyYW5zcG9ydEZhY3RvcnkgdGhyaWZ0LlRUcmFuc3BvcnRGYWN0b3J5KSB7CisJLy8gc2VydmVyCisJdmFyIGVyciBlcnJvcgorCWFkZHIgPSBGaW5kQXZhaWxhYmxlVENQU2VydmVyUG9ydCgpCisJc2VydmVyVHJhbnNwb3J0LCBlcnIgOj0gdGhyaWZ0Lk5ld1RTZXJ2ZXJTb2NrZXRUaW1lb3V0KGFkZHIuU3RyaW5nKCksIFRJTUVPVVQpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoIlVuYWJsZSB0byBjcmVhdGUgc2VydmVyIHNvY2tldCIsIGVycikKKwl9CisJcHJvY2Vzc29yIDo9IHRocmlmdHRlc3QuTmV3VGhyaWZ0VGVzdFByb2Nlc3NvcihOZXdUaHJpZnRUZXN0SGFuZGxlcigpKQorCXNlcnZlciA9IHRocmlmdC5OZXdUU2ltcGxlU2VydmVyNChwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KQorCXNlcnZlci5MaXN0ZW4oKQorCisJZ28gc2VydmVyLlNlcnZlKCkKKworCS8vIGNsaWVudAorCXZhciB0cmFuc3BvcnQgdGhyaWZ0LlRUcmFuc3BvcnQgPSB0aHJpZnQuTmV3VFNvY2tldEZyb21BZGRyVGltZW91dChhZGRyLCBUSU1FT1VUKQorCXRyYW5zcG9ydCwgZXJyID0gdHJhbnNwb3J0RmFjdG9yeS5HZXRUcmFuc3BvcnQodHJhbnNwb3J0KQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsKGVycikKKwl9CisJdmFyIHByb3RvY29sIHRocmlmdC5UUHJvdG9jb2wgPSBwcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wodHJhbnNwb3J0KQorCXRocmlmdFRlc3RDbGllbnQgOj0gdGhyaWZ0dGVzdC5OZXdUaHJpZnRUZXN0Q2xpZW50KHRocmlmdC5OZXdUU3RhbmRhcmRDbGllbnQocHJvdG9jb2wsIHByb3RvY29sKSkKKwllcnIgPSB0cmFuc3BvcnQuT3BlbigpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoIlVuYWJsZSB0byBvcGVuIGNsaWVudCBzb2NrZXQiLCBlcnIpCisJfQorCisJZHJpdmVyIDo9IE5ld1RocmlmdFRlc3REcml2ZXIodCwgdGhyaWZ0VGVzdENsaWVudCkKKwlkcml2ZXIuU3RhcnQoKQorfQorCisvLyBSdW4gdGVzdCBzdWl0ZSB1c2luZyBUSlNPTlByb3RvY29sCitmdW5jIFRlc3RUSlNPTlByb3RvY29sKHQgKnRlc3RpbmcuVCkgeworCVJ1blNvY2tldFRlc3RTdWl0ZSh0LAorCQl0aHJpZnQuTmV3VEpTT05Qcm90b2NvbEZhY3RvcnkoKSwKKwkJdGhyaWZ0Lk5ld1RUcmFuc3BvcnRGYWN0b3J5KCkpCisJUnVuU29ja2V0VGVzdFN1aXRlKHQsCisJCXRocmlmdC5OZXdUSlNPTlByb3RvY29sRmFjdG9yeSgpLAorCQl0aHJpZnQuTmV3VEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSg4OTEyKSkKKwlSdW5Tb2NrZXRUZXN0U3VpdGUodCwKKwkJdGhyaWZ0Lk5ld1RKU09OUHJvdG9jb2xGYWN0b3J5KCksCisJCXRocmlmdC5OZXdURnJhbWVkVHJhbnNwb3J0RmFjdG9yeSh0aHJpZnQuTmV3VFRyYW5zcG9ydEZhY3RvcnkoKSkpCit9CisKKy8vIFJ1biB0ZXN0IHN1aXRlIHVzaW5nIFRCaW5hcnlQcm90b2NvbAorZnVuYyBUZXN0VEJpbmFyeVByb3RvY29sKHQgKnRlc3RpbmcuVCkgeworCVJ1blNvY2tldFRlc3RTdWl0ZSh0LAorCQl0aHJpZnQuTmV3VEJpbmFyeVByb3RvY29sRmFjdG9yeURlZmF1bHQoKSwKKwkJdGhyaWZ0Lk5ld1RUcmFuc3BvcnRGYWN0b3J5KCkpCisJUnVuU29ja2V0VGVzdFN1aXRlKHQsCisJCXRocmlmdC5OZXdUQmluYXJ5UHJvdG9jb2xGYWN0b3J5RGVmYXVsdCgpLAorCQl0aHJpZnQuTmV3VEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSg4OTEyKSkKKwlSdW5Tb2NrZXRUZXN0U3VpdGUodCwKKwkJdGhyaWZ0Lk5ld1RCaW5hcnlQcm90b2NvbEZhY3RvcnlEZWZhdWx0KCksCisJCXRocmlmdC5OZXdURnJhbWVkVHJhbnNwb3J0RmFjdG9yeSh0aHJpZnQuTmV3VFRyYW5zcG9ydEZhY3RvcnkoKSkpCit9CisKKy8vIFJ1biB0ZXN0IHN1aXRlIHVzaW5nIFRDb21wYWN0QmluYXJ5UHJvdG9jb2wKK2Z1bmMgVGVzdFRDb21wYWN0UHJvdG9jb2wodCAqdGVzdGluZy5UKSB7CisJUnVuU29ja2V0VGVzdFN1aXRlKHQsCisJCXRocmlmdC5OZXdUQ29tcGFjdFByb3RvY29sRmFjdG9yeSgpLAorCQl0aHJpZnQuTmV3VFRyYW5zcG9ydEZhY3RvcnkoKSkKKwlSdW5Tb2NrZXRUZXN0U3VpdGUodCwKKwkJdGhyaWZ0Lk5ld1RDb21wYWN0UHJvdG9jb2xGYWN0b3J5KCksCisJCXRocmlmdC5OZXdUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KDg5MTIpKQorCVJ1blNvY2tldFRlc3RTdWl0ZSh0LAorCQl0aHJpZnQuTmV3VENvbXBhY3RQcm90b2NvbEZhY3RvcnkoKSwKKwkJdGhyaWZ0Lk5ld1RGcmFtZWRUcmFuc3BvcnRGYWN0b3J5KHRocmlmdC5OZXdUVHJhbnNwb3J0RmFjdG9yeSgpKSkKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L3Rlc3RzL3JlcXVpcmVkX2ZpZWxkc190ZXN0LmdvIGIvbGliL2dvL3Rlc3QvdGVzdHMvcmVxdWlyZWRfZmllbGRzX3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZhNDE0YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90ZXN0L3Rlc3RzL3JlcXVpcmVkX2ZpZWxkc190ZXN0LmdvCkBAIC0wLDAgKzEsMTMwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGVzdHMKKworaW1wb3J0ICgKKwkiY29udGV4dCIKKwkiZ2l0aHViLmNvbS9nb2xhbmcvbW9jay9nb21vY2siCisJIm9wdGlvbmFsZmllbGRzdGVzdCIKKwkicmVxdWlyZWRmaWVsZHRlc3QiCisJInRlc3RpbmciCisJInRocmlmdCIKKykKKworZnVuYyBUZXN0UmVxdWlyZWRGaWVsZF9TdWNlY3NzV2hlblNldCh0ICp0ZXN0aW5nLlQpIHsKKwkvLyBjcmVhdGUgYSBuZXcgUmVxdWlyZWRGaWVsZCBpbnN0YW5jZSB3aXRoIHRoZSByZXF1aXJlZCBmaWVsZCBzZXQKKwlzb3VyY2UgOj0gJnJlcXVpcmVkZmllbGR0ZXN0LlJlcXVpcmVkRmllbGR7TmFtZTogInRoaXMgaXMgYSB0ZXN0In0KKwlzb3VyY2VEYXRhLCBlcnIgOj0gdGhyaWZ0Lk5ld1RTZXJpYWxpemVyKCkuV3JpdGUoY29udGV4dC5CYWNrZ3JvdW5kKCksIHNvdXJjZSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbGYoImZhaWxlZCB0byBzZXJpYWxpemUgJVQ6ICV2Iiwgc291cmNlLCBlcnIpCisJfQorCisJZCA6PSB0aHJpZnQuTmV3VERlc2VyaWFsaXplcigpCisJZXJyID0gZC5SZWFkKCZyZXF1aXJlZGZpZWxkdGVzdC5SZXF1aXJlZEZpZWxke30sIHNvdXJjZURhdGEpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWxmKCJEaWQgbm90IGV4cGVjdCBhbiBlcnJvciB3aGVuIHRyeWluZyB0byBkZXNlcmlhbGl6ZSB0aGUgcmVxdWlyZWRmaWVsZHRlc3QuUmVxdWlyZWRGaWVsZDogJXYiLCBlcnIpCisJfQorfQorCitmdW5jIFRlc3RSZXF1aXJlZEZpZWxkX0Vycm9yV2hlbk1pc3NpbmcodCAqdGVzdGluZy5UKSB7CisJLy8gY3JlYXRlIGEgbmV3IE90aGVyVGhpbmcgaW5zdGFuY2UsIHdpdGhvdXQgc2V0dGluZyB0aGUgcmVxdWlyZWQgZmllbGQKKwlzb3VyY2UgOj0gJnJlcXVpcmVkZmllbGR0ZXN0Lk90aGVyVGhpbmd7fQorCXNvdXJjZURhdGEsIGVyciA6PSB0aHJpZnQuTmV3VFNlcmlhbGl6ZXIoKS5Xcml0ZShjb250ZXh0LkJhY2tncm91bmQoKSwgc291cmNlKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiZmFpbGVkIHRvIHNlcmlhbGl6ZSAlVDogJXYiLCBzb3VyY2UsIGVycikKKwl9CisKKwkvLyBhdHRlbXB0IHRvIGRlc2VyaWFsaXplIGludG8gYSBkaWZmZXJlbnQgdHlwZSAod2hpY2ggc2hvdWxkIGZhaWwpCisJZCA6PSB0aHJpZnQuTmV3VERlc2VyaWFsaXplcigpCisJZXJyID0gZC5SZWFkKCZyZXF1aXJlZGZpZWxkdGVzdC5SZXF1aXJlZEZpZWxke30sIHNvdXJjZURhdGEpCisJaWYgZXJyID09IG5pbCB7CisJCXQuRmF0YWwoIkV4cGVjdGVkIGFuIGVycm9yIHdoZW4gdHJ5aW5nIHRvIGRlc2VyaWFsaXplIGFuIG9iamVjdCB3aGljaCBpcyBtaXNzaW5nIGEgcmVxdWlyZWQgZmllbGQiKQorCX0KK30KKworZnVuYyBUZXN0U3RydWN0UmVhZFJlcXVpcmVkRmllbGRzKHQgKnRlc3RpbmcuVCkgeworCW1vY2tDdHJsIDo9IGdvbW9jay5OZXdDb250cm9sbGVyKHQpCisJcHJvdG9jb2wgOj0gTmV3TW9ja1RQcm90b2NvbChtb2NrQ3RybCkKKwl0ZXN0U3RydWN0IDo9IG9wdGlvbmFsZmllbGRzdGVzdC5OZXdTdHJ1Y3RDKCkKKworCS8vIE5vbmUgb2YgcmVxdWlyZWQgZmllbGRzIGFyZSBzZXQKKwlnb21vY2suSW5PcmRlcigKKwkJcHJvdG9jb2wuRVhQRUNUKCkuUmVhZFN0cnVjdEJlZ2luKCkuUmV0dXJuKCJTdHJ1Y3RDIiwgbmlsKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuUmVhZEZpZWxkQmVnaW4oKS5SZXR1cm4oIl8iLCB0aHJpZnQuVFR5cGUodGhyaWZ0LlNUT1ApLCBpbnQxNigxKSwgbmlsKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuUmVhZFN0cnVjdEVuZCgpLlJldHVybihuaWwpLAorCSkKKworCWVyciA6PSB0ZXN0U3RydWN0LlJlYWQocHJvdG9jb2wpCisJbW9ja0N0cmwuRmluaXNoKCkKKwltb2NrQ3RybCA9IGdvbW9jay5OZXdDb250cm9sbGVyKHQpCisJaWYgZXJyID09IG5pbCB7CisJCXQuRmF0YWwoIkV4cGVjdGVkIHJlYWQgdG8gZmFpbCIpCisJfQorCWVycjIsIG9rIDo9IGVyci4odGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvbikKKwlpZiAhb2sgeworCQl0LkZhdGFsKCJFeHBlY3RlZCBhIFRQcm90b2NvbEV4Y2VwdGlvbiIpCisJfQorCWlmIGVycjIuVHlwZUlkKCkgIT0gdGhyaWZ0LklOVkFMSURfREFUQSB7CisJCXQuRmF0YWwoIkV4cGVjdGVkIElOVkFMSURfREFUQSBUUHJvdG9jb2xFeGNlcHRpb24iKQorCX0KKworCS8vIE9uZSBvZiB0aGUgcmVxdWlyZWQgZmllbGRzIGlzIHNldAorCWdvbW9jay5Jbk9yZGVyKAorCQlwcm90b2NvbC5FWFBFQ1QoKS5SZWFkU3RydWN0QmVnaW4oKS5SZXR1cm4oIlN0cnVjdEMiLCBuaWwpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5SZWFkRmllbGRCZWdpbigpLlJldHVybigiSSIsIHRocmlmdC5UVHlwZSh0aHJpZnQuSTMyKSwgaW50MTYoMiksIG5pbCksCisJCXByb3RvY29sLkVYUEVDVCgpLlJlYWRJMzIoKS5SZXR1cm4oaW50MzIoMSksIG5pbCksCisJCXByb3RvY29sLkVYUEVDVCgpLlJlYWRGaWVsZEVuZCgpLlJldHVybihuaWwpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5SZWFkRmllbGRCZWdpbigpLlJldHVybigiXyIsIHRocmlmdC5UVHlwZSh0aHJpZnQuU1RPUCksIGludDE2KDEpLCBuaWwpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5SZWFkU3RydWN0RW5kKCkuUmV0dXJuKG5pbCksCisJKQorCisJZXJyID0gdGVzdFN0cnVjdC5SZWFkKHByb3RvY29sKQorCW1vY2tDdHJsLkZpbmlzaCgpCisJbW9ja0N0cmwgPSBnb21vY2suTmV3Q29udHJvbGxlcih0KQorCWlmIGVyciA9PSBuaWwgeworCQl0LkZhdGFsKCJFeHBlY3RlZCByZWFkIHRvIGZhaWwiKQorCX0KKwllcnIyLCBvayA9IGVyci4odGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvbikKKwlpZiAhb2sgeworCQl0LkZhdGFsKCJFeHBlY3RlZCBhIFRQcm90b2NvbEV4Y2VwdGlvbiIpCisJfQorCWlmIGVycjIuVHlwZUlkKCkgIT0gdGhyaWZ0LklOVkFMSURfREFUQSB7CisJCXQuRmF0YWwoIkV4cGVjdGVkIElOVkFMSURfREFUQSBUUHJvdG9jb2xFeGNlcHRpb24iKQorCX0KKworCS8vIEJvdGggb2YgdGhlIHJlcXVpcmVkIGZpZWxkcyBhcmUgc2V0CisJZ29tb2NrLkluT3JkZXIoCisJCXByb3RvY29sLkVYUEVDVCgpLlJlYWRTdHJ1Y3RCZWdpbigpLlJldHVybigiU3RydWN0QyIsIG5pbCksCisJCXByb3RvY29sLkVYUEVDVCgpLlJlYWRGaWVsZEJlZ2luKCkuUmV0dXJuKCJpIiwgdGhyaWZ0LlRUeXBlKHRocmlmdC5JMzIpLCBpbnQxNigyKSwgbmlsKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuUmVhZEkzMigpLlJldHVybihpbnQzMigxKSwgbmlsKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuUmVhZEZpZWxkRW5kKCkuUmV0dXJuKG5pbCksCisJCXByb3RvY29sLkVYUEVDVCgpLlJlYWRGaWVsZEJlZ2luKCkuUmV0dXJuKCJzMiIsIHRocmlmdC5UVHlwZSh0aHJpZnQuU1RSSU5HKSwgaW50MTYoNCksIG5pbCksCisJCXByb3RvY29sLkVYUEVDVCgpLlJlYWRTdHJpbmcoKS5SZXR1cm4oInRlc3QiLCBuaWwpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5SZWFkRmllbGRFbmQoKS5SZXR1cm4obmlsKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuUmVhZEZpZWxkQmVnaW4oKS5SZXR1cm4oIl8iLCB0aHJpZnQuVFR5cGUodGhyaWZ0LlNUT1ApLCBpbnQxNigxKSwgbmlsKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuUmVhZFN0cnVjdEVuZCgpLlJldHVybihuaWwpLAorCSkKKworCWVyciA9IHRlc3RTdHJ1Y3QuUmVhZChwcm90b2NvbCkKKwltb2NrQ3RybC5GaW5pc2goKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsKCJFeHBlY3RlZCByZWFkIHRvIHN1Y2NlZWQiKQorCX0KK30KZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L3Rlc3RzL3N0cnVjdF9hcmdzX3JldHNfdGVzdC5nbyBiL2xpYi9nby90ZXN0L3Rlc3RzL3N0cnVjdF9hcmdzX3JldHNfdGVzdC5nbwppbmRleCAzNjM0MjNkLi44MWU5YjI2IDEwMDY0NAotLS0gYS9saWIvZ28vdGVzdC90ZXN0cy9zdHJ1Y3RfYXJnc19yZXRzX3Rlc3QuZ28KKysrIGIvbGliL2dvL3Rlc3QvdGVzdHMvc3RydWN0X2FyZ3NfcmV0c190ZXN0LmdvCkBAIC0zMCw3ICszMCw3IEBACiAJdmFyIGlmYWNlIHN0LkFTZXJ2CiAJdmFyIGVyciBlcnJvcgogCi0Jc2EsIGVyciA9IGlmYWNlLlN0cnVjdEFGdW5jXzFzdHJ1Y3RBKHNhKQorCXNhLCBlcnIgPSBpZmFjZS5TdHJ1Y3RBRnVuY18xc3RydWN0QShkZWZhdWx0Q3R4LCBzYSkKIAlfID0gZXJyCiAJXyA9IHNhCiB9CmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC90ZXN0cy90aHJpZnR0ZXN0X2RyaXZlci5nbyBiL2xpYi9nby90ZXN0L3Rlc3RzL3RocmlmdHRlc3RfZHJpdmVyLmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlNTRjYmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGVzdC90ZXN0cy90aHJpZnR0ZXN0X2RyaXZlci5nbwpAQCAtMCwwICsxLDIzNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAnTGljZW5zZScpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAnQVMgSVMnIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRlc3RzCisKK2ltcG9ydCAoCisJInJlZmxlY3QiCisJInRlc3RpbmciCisJInRocmlmdHRlc3QiCispCisKK3R5cGUgVGhyaWZ0VGVzdERyaXZlciBzdHJ1Y3QgeworCWNsaWVudCB0aHJpZnR0ZXN0LlRocmlmdFRlc3QKKwl0ICAgICAgKnRlc3RpbmcuVAorfQorCitmdW5jIE5ld1RocmlmdFRlc3REcml2ZXIodCAqdGVzdGluZy5ULCBjbGllbnQgdGhyaWZ0dGVzdC5UaHJpZnRUZXN0KSAqVGhyaWZ0VGVzdERyaXZlciB7CisJcmV0dXJuICZUaHJpZnRUZXN0RHJpdmVye2NsaWVudCwgdH0KK30KKworZnVuYyAocCAqVGhyaWZ0VGVzdERyaXZlcikgU3RhcnQoKSB7CisJY2xpZW50IDo9IHAuY2xpZW50CisJdCA6PSBwLnQKKworCWlmIGNsaWVudC5UZXN0Vm9pZChkZWZhdWx0Q3R4KSAhPSBuaWwgeworCQl0LkZhdGFsKCJUZXN0Vm9pZCBmYWlsZWQiKQorCX0KKworCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdFN0cmluZyhkZWZhdWx0Q3R4LCAiVGVzdCIpOyByICE9ICJUZXN0IiB8fCBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbCgiVGVzdFN0cmluZyB3aXRoIHNpbXBsZSB0ZXh0IGZhaWxlZCIpCisJfQorCisJaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0U3RyaW5nKGRlZmF1bHRDdHgsICIiKTsgciAhPSAiIiB8fCBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbCgiVGVzdFN0cmluZyB3aXRoIGVtcHR5IHRleHQgZmFpbGVkIikKKwl9CisKKwlzdHJpbmdUZXN0IDo9ICJBZnJpa2FhbnMsIEFsZW1hbm5pc2NoLCBBcmFnb27DqXMsINin2YTYudix2KjZitipLCDZhdi12LHZiSwgIiArCisJCSJBc3R1cmlhbnUsIEF5bWFyIGFydSwgQXrJmXJiYXljYW4sINCR0LDRiNKh0L7RgNGCLCBCb2FyaXNjaCwgxb1lbWFpdMSXxaFrYSwgIiArCisJCSLQkdC10LvQsNGA0YPRgdC60LDRjywg0JHQtdC70LDRgNGD0YHQutCw0Y8gKNGC0LDRgNCw0YjQutC10LLRltGG0LApLCDQkdGK0LvQs9Cw0YDRgdC60LgsIEJhbWFuYW5rYW4sICIgKworCQki4Kas4Ka+4KaC4Kay4Ka+LCBCcmV6aG9uZWcsIEJvc2Fuc2tpLCBDYXRhbMOgLCBNw6xuZy1kxJXMpG5nLW5n4bmzzIQsINCd0L7RhdGH0LjQudC9LCAiICsKKwkJIkNlYnVhbm8sIOGPo+GOs+GOqSwgxIxlc2t5LCDQodC70L7QstGjzIHQvdGM0YHQutGKIC8g4rCU4rCO4rCR4rCC4rCh4rCQ4rCg4rCU4rCN4rCfLCDQp9OR0LLQsNGI0LvQsCwgQ3ltcmFlZywgIiArCisJCSJEYW5zaywgWmF6YWtpLCDei96o3ojerN6A3qjehN6m3pDesCwgzpXOu867zrfOvc65zrrOrCwgRW1pbGnDoG4gZSBydW1hZ27DsmwsIEVuZ2xpc2gsICIgKworCQkiRXNwZXJhbnRvLCBFc3Bhw7FvbCwgRWVzdGksIEV1c2thcmEsINmB2KfYsdiz24wsIFN1b21pLCBWw7VybywgRsO4cm95c2t0LCAiICsKKwkJIkZyYW7Dp2FpcywgQXJwZXRhbiwgRnVybGFuLCBGcnlzaywgR2FlaWxnZSwg6LSb6KqeLCBHw6BpZGhsaWcsIEdhbGVnbywgIiArCisJCSJBdmHDsWUn4bq9LCDgqpfgq4HgqpzgqrDgqr7gqqTgq4AsIEdhZWxnLCDXoteR16jXmdeqLCDgpLngpL/gpKjgpY3gpKbgpYAsIEZpamkgSGluZGksIEhydmF0c2tpLCAiICsKKwkJIktyZXnDsmwgYXlpc3llbiwgTWFneWFyLCDVgNWh1bXVpdaA1aXVtiwgSW50ZXJsaW5ndWEsIEJhaGFzYSBJbmRvbmVzaWEsICIgKworCQkiSWxva2FubywgSWRvLCDDjXNsZW5za2EsIEl0YWxpYW5vLCDml6XmnKzoqp4sIExvamJhbiwgQmFzYSBKYXdhLCAiICsKKwkJIuGDpeGDkOGDoOGDl+GDo+GDmuGDmCwgS29uZ28sIEthbGFhbGxpc3V0LCDgspXgsqjgs43gsqjgsqEsIO2VnOq1reyWtCwg0JrRitCw0YDQsNGH0LDQuS3QnNCw0LvQutGK0LDRgCwgIiArCisJCSJSaXBvYXJpc2NoLCBLdXJkw64sINCa0L7QvNC4LCBLZXJuZXdlaywg0JrRi9GA0LPRi9C30YfQsCwgTGF0aW5hLCBMYWRpbm8sICIgKworCQkiTMOrdHplYnVlcmdlc2NoLCBMaW1idXJncywgTGluZ8OhbGEsIOC6peC6suC6pywgTGlldHV2acWzLCBMYXR2aWXFoXUsIEJhc2EgIiArCisJCSJCYW55dW1hc2FuLCBNYWxhZ2FzeSwg0JzQsNC60LXQtNC+0L3RgdC60LgsIOC0ruC0suC0r+C0vuC0s+C0giwg4KSu4KSw4KS+4KSg4KWALCDZhdin2LLZkNix2YjZhtuMLCBCYWhhc2EgIiArCisJCSJNZWxheXUsIE5uYXB1bGl0YW5vLCBOZWRlcnNha3Npc2NoLCDgpKjgpYfgpKrgpL7gpLIg4KSt4KS+4KS34KS+LCBOZWRlcmxhbmRzLCDigKoiICsKKwkJIk5vcnNrIChueW5vcnNrKeKArCwg4oCqTm9yc2sgKGJva23DpWwp4oCsLCBOb3Vvcm1hbmQsIERpbsOpIGJpemFhZCwgIiArCisJCSJPY2NpdGFuLCDQmNGA0L7QvdCw0YMsIFBhcGlhbWVudHUsIERlaXRzY2gsIFBvbHNraSwg2b7Zhtis2KfYqNuMLCDZvtqa2KrZiCwgIiArCisJCSJOb3JmdWsgLyBQaXRrZXJuLCBQb3J0dWd1w6pzLCBSdW5hIFNpbWksIFJ1bWFudHNjaCwgUm9tYW5pLCBSb23Dom7EgywgIiArCisJCSLQoNGD0YHRgdC60LjQuSwg0KHQsNGF0LAg0YLRi9C70LAsIFNhcmR1LCBTaWNpbGlhbnUsIFNjb3RzLCBTw6FtZWdpZWxsYSwgU2ltcGxlICIgKworCQkiRW5nbGlzaCwgU2xvdmVuxI1pbmEsIFNsb3ZlbsWhxI1pbmEsINCh0YDQv9GB0LrQuCAvIFNycHNraSwgU2VlbHRlcnNrLCAiICsKKwkJIlN2ZW5za2EsIEtpc3dhaGlsaSwg4K6k4K6u4K6/4K604K+NLCDgsKTgsYbgsLLgsYHgsJfgsYEsINCi0L7St9C40LrToywg4LmE4LiX4LiiLCBUw7xya21lbsOnZSwgVGFnYWxvZywgIiArCisJCSJUw7xya8OnZSwg0KLQsNGC0LDRgNGH0LAvVGF0YXLDp2EsINCj0LrRgNCw0ZfQvdGB0YzQutCwLCDYp9ix2K/ZiCwgVGnhur9uZyBWaeG7h3QsIFZvbGFww7xrLCAiICsKKwkJIldhbG9uLCBXaW5hcmF5LCDlkLTor60sIGlzaVhob3NhLCDXmdeZ1rTXk9eZ16ksIFlvcsO5YsOhLCBaZcOqdXdzLCDkuK3mlocsICIgKworCQkiQsOibi1sw6JtLWfDuiwg57K16KqeIgorCisJaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0U3RyaW5nKGRlZmF1bHRDdHgsIHN0cmluZ1Rlc3QpOyByICE9IHN0cmluZ1Rlc3QgfHwgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoIlRlc3RTdHJpbmcgd2l0aCBhbGwgbGFuZ3VhZ2VzIGZhaWxlZCIpCisJfQorCisJc3BlY2lhbENoYXJhY3RlcnMgOj0gInF1b3RlOiBcIiBiYWNrc2xhc2g6IiArCisJCSIgYmFja3NwYWNlOiBcYiBmb3JtZmVlZDogXGYgbmV3bGluZTogXG4gcmV0dXJuOiBcciB0YWI6ICIgKworCQkiIG5vdy1hbGwtb2YtdGhlbS10b2dldGhlcjogJ1xcXGJcblxyXHQnIiArCisJCSIgbm93LWEtYnVuY2gtb2YtanVuazogIUAjJCUmKCkoJiUkI3t9e308Pjw+PCIgKworCQkiIGNoYXItdG8tdGVzdC1qc29uLXBhcnNpbmc6IF1dIFwiXV0gXFxcIiB9fX17IFtbWyAiCisKKwlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RTdHJpbmcoZGVmYXVsdEN0eCwgc3BlY2lhbENoYXJhY3RlcnMpOyByICE9IHNwZWNpYWxDaGFyYWN0ZXJzIHx8IGVyciAhPSBuaWwgeworCQl0LkZhdGFsKCJUZXN0U3RyaW5nIHdpdGggc3BlY2lhbENoYXJhY3RlcnMgZmFpbGVkIikKKwl9CisKKwlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RCeXRlKGRlZmF1bHRDdHgsIDEpOyByICE9IDEgfHwgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoIlRlc3RCeXRlKDEpIGZhaWxlZCIpCisJfQorCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdEJ5dGUoZGVmYXVsdEN0eCwgMCk7IHIgIT0gMCB8fCBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbCgiVGVzdEJ5dGUoMCkgZmFpbGVkIikKKwl9CisJaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0Qnl0ZShkZWZhdWx0Q3R4LCAtMSk7IHIgIT0gLTEgfHwgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoIlRlc3RCeXRlKC0xKSBmYWlsZWQiKQorCX0KKwlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RCeXRlKGRlZmF1bHRDdHgsIC0xMjcpOyByICE9IC0xMjcgfHwgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoIlRlc3RCeXRlKC0xMjcpIGZhaWxlZCIpCisJfQorCisJaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0STMyKGRlZmF1bHRDdHgsIC0xKTsgciAhPSAtMSB8fCBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbCgiVGVzdEkzMigtMSkgZmFpbGVkIikKKwl9CisJaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0STMyKGRlZmF1bHRDdHgsIDEpOyByICE9IDEgfHwgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoIlRlc3RJMzIoMSkgZmFpbGVkIikKKwl9CisKKwlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RJNjQoZGVmYXVsdEN0eCwgLTUpOyByICE9IC01IHx8IGVyciAhPSBuaWwgeworCQl0LkZhdGFsKCJUZXN0STY0KC01KSBmYWlsZWQiKQorCX0KKwlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RJNjQoZGVmYXVsdEN0eCwgNSk7IHIgIT0gNSB8fCBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbCgiVGVzdEk2NCg1KSBmYWlsZWQiKQorCX0KKwlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RJNjQoZGVmYXVsdEN0eCwgLTM0MzU5NzM4MzY4KTsgciAhPSAtMzQzNTk3MzgzNjggfHwgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoIlRlc3RJNjQoLTM0MzU5NzM4MzY4KSBmYWlsZWQiKQorCX0KKworCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdERvdWJsZShkZWZhdWx0Q3R4LCAtNS4yMDk4NTIzKTsgciAhPSAtNS4yMDk4NTIzIHx8IGVyciAhPSBuaWwgeworCQl0LkZhdGFsKCJUZXN0RG91YmxlKC01LjIwOTg1MjMpIGZhaWxlZCIpCisJfQorCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdERvdWJsZShkZWZhdWx0Q3R4LCAtNy4wMTIwNTIxNzUyMTUwNDQpOyByICE9IC03LjAxMjA1MjE3NTIxNTA0NCB8fCBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbCgiVGVzdERvdWJsZSgtNy4wMTIwNTIxNzUyMTUwNDQpIGZhaWxlZCIpCisJfQorCisJLy8gVE9ETzogYWRkIHRlc3RCaW5hcnkoKSBjYWxsCisKKwlvdXQgOj0gdGhyaWZ0dGVzdC5OZXdYdHJ1Y3QoKQorCW91dC5TdHJpbmdUaGluZyA9ICJaZXJvIgorCW91dC5CeXRlVGhpbmcgPSAxCisJb3V0LkkzMlRoaW5nID0gLTMKKwlvdXQuSTY0VGhpbmcgPSAxMDAwMDAwCisJaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0U3RydWN0KGRlZmF1bHRDdHgsIG91dCk7ICFyZWZsZWN0LkRlZXBFcXVhbChyLCBvdXQpIHx8IGVyciAhPSBuaWwgeworCQl0LkZhdGFsKCJUZXN0U3RydWN0IGZhaWxlZCIpCisJfQorCisJb3V0MiA6PSB0aHJpZnR0ZXN0Lk5ld1h0cnVjdDIoKQorCW91dDIuQnl0ZVRoaW5nID0gMQorCW91dDIuU3RydWN0VGhpbmcgPSBvdXQKKwlvdXQyLkkzMlRoaW5nID0gNQorCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdE5lc3QoZGVmYXVsdEN0eCwgb3V0Mik7ICFyZWZsZWN0LkRlZXBFcXVhbChyLCBvdXQyKSB8fCBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbCgiVGVzdE5lc3QgZmFpbGVkIikKKwl9CisKKwltYXBvdXQgOj0gbWFrZShtYXBbaW50MzJdaW50MzIpCisJZm9yIGkgOj0gaW50MzIoMCk7IGkgPCA1OyBpKysgeworCQltYXBvdXRbaV0gPSBpIC0gMTAKKwl9CisJaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0TWFwKGRlZmF1bHRDdHgsIG1hcG91dCk7ICFyZWZsZWN0LkRlZXBFcXVhbChyLCBtYXBvdXQpIHx8IGVyciAhPSBuaWwgeworCQl0LkZhdGFsKCJUZXN0TWFwIGZhaWxlZCIpCisJfQorCisJbWFwVGVzdElucHV0IDo9IG1hcFtzdHJpbmddc3RyaW5neworCQkiYSI6ICIxMjMiLCAiYSBiIjogIndpdGggc3BhY2VzICIsICJzYW1lIjogInNhbWUiLCAiMCI6ICJudW1lcmljIGtleSIsCisJCSJsb25nVmFsdWUiOiBzdHJpbmdUZXN0LCBzdHJpbmdUZXN0OiAibG9uZyBrZXkiLAorCX0KKwlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RTdHJpbmdNYXAoZGVmYXVsdEN0eCwgbWFwVGVzdElucHV0KTsgIXJlZmxlY3QuRGVlcEVxdWFsKHIsIG1hcFRlc3RJbnB1dCkgfHwgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoIlRlc3RTdHJpbmdNYXAgZmFpbGVkIikKKwl9CisKKwlzZXRUZXN0SW5wdXQgOj0gW11pbnQzMnsxLCAyLCAzfQorCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdFNldChkZWZhdWx0Q3R4LCBzZXRUZXN0SW5wdXQpOyAhcmVmbGVjdC5EZWVwRXF1YWwociwgc2V0VGVzdElucHV0KSB8fCBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbCgiVGVzdFNldCBmYWlsZWQiKQorCX0KKworCWxpc3RUZXN0IDo9IFtdaW50MzJ7MSwgMiwgM30KKwlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RMaXN0KGRlZmF1bHRDdHgsIGxpc3RUZXN0KTsgIXJlZmxlY3QuRGVlcEVxdWFsKHIsIGxpc3RUZXN0KSB8fCBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbCgiVGVzdExpc3QgZmFpbGVkIikKKwl9CisKKwlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RFbnVtKGRlZmF1bHRDdHgsIHRocmlmdHRlc3QuTnVtYmVyel9PTkUpOyByICE9IHRocmlmdHRlc3QuTnVtYmVyel9PTkUgfHwgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoIlRlc3RFbnVtIGZhaWxlZCIpCisJfQorCisJaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0VHlwZWRlZihkZWZhdWx0Q3R4LCA2OSk7IHIgIT0gNjkgfHwgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoIlRlc3RUeXBlZGVmIGZhaWxlZCIpCisJfQorCisJbWFwTWFwVGVzdCA6PSBtYXBbaW50MzJdbWFwW2ludDMyXWludDMyeworCQk0OiAgezE6IDEsIDI6IDIsIDM6IDMsIDQ6IDR9LAorCQktNDogey00OiAtNCwgLTM6IC0zLCAtMjogLTIsIC0xOiAtMX0sCisJfQorCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdE1hcE1hcChkZWZhdWx0Q3R4LCAxKTsgIXJlZmxlY3QuRGVlcEVxdWFsKHIsIG1hcE1hcFRlc3QpIHx8IGVyciAhPSBuaWwgeworCQl0LkZhdGFsKCJUZXN0TWFwTWFwIGZhaWxlZCIpCisJfQorCisJY3JhenlYMSA6PSB0aHJpZnR0ZXN0Lk5ld1h0cnVjdCgpCisJY3JhenlYMS5TdHJpbmdUaGluZyA9ICJHb29kYnllNCIKKwljcmF6eVgxLkJ5dGVUaGluZyA9IDQKKwljcmF6eVgxLkkzMlRoaW5nID0gNAorCWNyYXp5WDEuSTY0VGhpbmcgPSA0CisKKwljcmF6eVgyIDo9IHRocmlmdHRlc3QuTmV3WHRydWN0KCkKKwljcmF6eVgyLlN0cmluZ1RoaW5nID0gIkhlbGxvMiIKKwljcmF6eVgyLkJ5dGVUaGluZyA9IDIKKwljcmF6eVgyLkkzMlRoaW5nID0gMgorCWNyYXp5WDIuSTY0VGhpbmcgPSAyCisKKwljcmF6eSA6PSB0aHJpZnR0ZXN0Lk5ld0luc2FuaXR5KCkKKwljcmF6eS5Vc2VyTWFwID0gbWFwW3RocmlmdHRlc3QuTnVtYmVyel10aHJpZnR0ZXN0LlVzZXJJZHs1OiA1LCA4OiA4fQorCWNyYXp5Llh0cnVjdHMgPSBbXSp0aHJpZnR0ZXN0Llh0cnVjdHtjcmF6eVgxLCBjcmF6eVgyfQorCisJY3JhenlFbXB0eSA6PSB0aHJpZnR0ZXN0Lk5ld0luc2FuaXR5KCkKKwljcmF6eUVtcHR5LlVzZXJNYXAgPSBtYXBbdGhyaWZ0dGVzdC5OdW1iZXJ6XXRocmlmdHRlc3QuVXNlcklke30KKwljcmF6eUVtcHR5Llh0cnVjdHMgPSBbXSp0aHJpZnR0ZXN0Llh0cnVjdHt9CisKKwlpbnNhbml0eSA6PSBtYXBbdGhyaWZ0dGVzdC5Vc2VySWRdbWFwW3RocmlmdHRlc3QuTnVtYmVyel0qdGhyaWZ0dGVzdC5JbnNhbml0eXsKKwkJMToge3RocmlmdHRlc3QuTnVtYmVyel9UV086IGNyYXp5LCB0aHJpZnR0ZXN0Lk51bWJlcnpfVEhSRUU6IGNyYXp5fSwKKwkJMjoge3RocmlmdHRlc3QuTnVtYmVyel9TSVg6IGNyYXp5RW1wdHl9LAorCX0KKwlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RJbnNhbml0eShkZWZhdWx0Q3R4LCBjcmF6eSk7ICFyZWZsZWN0LkRlZXBFcXVhbChyLCBpbnNhbml0eSkgfHwgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoIlRlc3RJbnNhbml0eSBmYWlsZWQiKQorCX0KKworCWlmIGVyciA6PSBjbGllbnQuVGVzdEV4Y2VwdGlvbihkZWZhdWx0Q3R4LCAiVEV4Y2VwdGlvbiIpOyBlcnIgPT0gbmlsIHsKKwkJdC5GYXRhbCgiVGVzdEV4Y2VwdGlvbiBURXhjZXB0aW9uIGZhaWxlZCIpCisJfQorCisJaWYgZXJyLCBvayA6PSBjbGllbnQuVGVzdEV4Y2VwdGlvbihkZWZhdWx0Q3R4LCAiWGNlcHRpb24iKS4oKnRocmlmdHRlc3QuWGNlcHRpb24pOyBvayA9PSBmYWxzZSB8fCBlcnIgPT0gbmlsIHsKKwkJdC5GYXRhbCgiVGVzdEV4Y2VwdGlvbiBYY2VwdGlvbiBmYWlsZWQiKQorCX0gZWxzZSBpZiBlcnIuRXJyb3JDb2RlICE9IDEwMDEgfHwgZXJyLk1lc3NhZ2UgIT0gIlhjZXB0aW9uIiB7CisJCXQuRmF0YWwoIlRlc3RFeGNlcHRpb24gWGNlcHRpb24gZmFpbGVkIikKKwl9CisKKwlpZiBlcnIgOj0gY2xpZW50LlRlc3RFeGNlcHRpb24oZGVmYXVsdEN0eCwgIm5vIEV4Y2VwdGlvbiIpOyBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbCgiVGVzdEV4Y2VwdGlvbiBubyBFeGNlcHRpb24gZmFpbGVkIikKKwl9CisKKwlpZiBlcnIgOj0gY2xpZW50LlRlc3RPbmV3YXkoZGVmYXVsdEN0eCwgMCk7IGVyciAhPSBuaWwgeworCQl0LkZhdGFsKCJUZXN0T25ld2F5IGZhaWxlZCIpCisJfQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3Rlc3QvdGVzdHMvdGhyaWZ0dGVzdF9oYW5kbGVyLmdvIGIvbGliL2dvL3Rlc3QvdGVzdHMvdGhyaWZ0dGVzdF9oYW5kbGVyLmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxYjllZTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGVzdC90ZXN0cy90aHJpZnR0ZXN0X2hhbmRsZXIuZ28KQEAgLTAsMCArMSwyMTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogJ0xpY2Vuc2UnKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogJ0FTIElTJyBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0ZXN0cworCitpbXBvcnQgKAorCSJjb250ZXh0IgorCSJlcnJvcnMiCisJInRocmlmdCIKKwkidGhyaWZ0dGVzdCIKKwkidGltZSIKKykKKwordHlwZSBTZWNvbmRTZXJ2aWNlSGFuZGxlciBzdHJ1Y3QgeworfQorCitmdW5jIE5ld1NlY29uZFNlcnZpY2VIYW5kbGVyKCkgKlNlY29uZFNlcnZpY2VIYW5kbGVyIHsKKwlyZXR1cm4gJlNlY29uZFNlcnZpY2VIYW5kbGVye30KK30KKworZnVuYyAocCAqU2Vjb25kU2VydmljZUhhbmRsZXIpIEJsYWhCbGFoKGN0eCBjb250ZXh0LkNvbnRleHQpIChlcnIgZXJyb3IpIHsKKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlNlY29uZFNlcnZpY2VIYW5kbGVyKSBTZWNvbmR0ZXN0U3RyaW5nKGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nIHN0cmluZykgKHIgc3RyaW5nLCBlcnIgZXJyb3IpIHsKKwlyZXR1cm4gdGhpbmcsIG5pbAorfQorCit0eXBlIFRocmlmdFRlc3RIYW5kbGVyIHN0cnVjdCB7Cit9CisKK2Z1bmMgTmV3VGhyaWZ0VGVzdEhhbmRsZXIoKSAqVGhyaWZ0VGVzdEhhbmRsZXIgeworCXJldHVybiAmVGhyaWZ0VGVzdEhhbmRsZXJ7fQorfQorCitmdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdFZvaWQoY3R4IGNvbnRleHQuQ29udGV4dCkgKGVyciBlcnJvcikgeworCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3RTdHJpbmcoY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgc3RyaW5nKSAociBzdHJpbmcsIGVyciBlcnJvcikgeworCXJldHVybiB0aGluZywgbmlsCit9CisKK2Z1bmMgKHAgKlRocmlmdFRlc3RIYW5kbGVyKSBUZXN0Qm9vbChjdHggY29udGV4dC5Db250ZXh0LCB0aGluZyBib29sKSAociBib29sLCBlcnIgZXJyb3IpIHsKKwlyZXR1cm4gdGhpbmcsIG5pbAorfQorCitmdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdEJ5dGUoY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgaW50OCkgKHIgaW50OCwgZXJyIGVycm9yKSB7CisJcmV0dXJuIHRoaW5nLCBuaWwKK30KKworZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3RJMzIoY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgaW50MzIpIChyIGludDMyLCBlcnIgZXJyb3IpIHsKKwlyZXR1cm4gdGhpbmcsIG5pbAorfQorCitmdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdEk2NChjdHggY29udGV4dC5Db250ZXh0LCB0aGluZyBpbnQ2NCkgKHIgaW50NjQsIGVyciBlcnJvcikgeworCXJldHVybiB0aGluZywgbmlsCit9CisKK2Z1bmMgKHAgKlRocmlmdFRlc3RIYW5kbGVyKSBUZXN0RG91YmxlKGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nIGZsb2F0NjQpIChyIGZsb2F0NjQsIGVyciBlcnJvcikgeworCXJldHVybiB0aGluZywgbmlsCit9CisKK2Z1bmMgKHAgKlRocmlmdFRlc3RIYW5kbGVyKSBUZXN0QmluYXJ5KGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nIFtdYnl0ZSkgKHIgW11ieXRlLCBlcnIgZXJyb3IpIHsKKwlyZXR1cm4gdGhpbmcsIG5pbAorfQorCitmdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdFN0cnVjdChjdHggY29udGV4dC5Db250ZXh0LCB0aGluZyAqdGhyaWZ0dGVzdC5YdHJ1Y3QpIChyICp0aHJpZnR0ZXN0Llh0cnVjdCwgZXJyIGVycm9yKSB7CisJcmV0dXJuIHRoaW5nLCBuaWwKK30KKworZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3ROZXN0KGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nICp0aHJpZnR0ZXN0Llh0cnVjdDIpIChyICp0aHJpZnR0ZXN0Llh0cnVjdDIsIGVyciBlcnJvcikgeworCXJldHVybiB0aGluZywgbmlsCit9CisKK2Z1bmMgKHAgKlRocmlmdFRlc3RIYW5kbGVyKSBUZXN0TWFwKGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nIG1hcFtpbnQzMl1pbnQzMikgKHIgbWFwW2ludDMyXWludDMyLCBlcnIgZXJyb3IpIHsKKwlyZXR1cm4gdGhpbmcsIG5pbAorfQorCitmdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdFN0cmluZ01hcChjdHggY29udGV4dC5Db250ZXh0LCB0aGluZyBtYXBbc3RyaW5nXXN0cmluZykgKHIgbWFwW3N0cmluZ11zdHJpbmcsIGVyciBlcnJvcikgeworCXJldHVybiB0aGluZywgbmlsCit9CisKK2Z1bmMgKHAgKlRocmlmdFRlc3RIYW5kbGVyKSBUZXN0U2V0KGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nIFtdaW50MzIpIChyIFtdaW50MzIsIGVyciBlcnJvcikgeworCXJldHVybiB0aGluZywgbmlsCit9CisKK2Z1bmMgKHAgKlRocmlmdFRlc3RIYW5kbGVyKSBUZXN0TGlzdChjdHggY29udGV4dC5Db250ZXh0LCB0aGluZyBbXWludDMyKSAociBbXWludDMyLCBlcnIgZXJyb3IpIHsKKwlyZXR1cm4gdGhpbmcsIG5pbAorfQorCitmdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdEVudW0oY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgdGhyaWZ0dGVzdC5OdW1iZXJ6KSAociB0aHJpZnR0ZXN0Lk51bWJlcnosIGVyciBlcnJvcikgeworCXJldHVybiB0aGluZywgbmlsCit9CisKK2Z1bmMgKHAgKlRocmlmdFRlc3RIYW5kbGVyKSBUZXN0VHlwZWRlZihjdHggY29udGV4dC5Db250ZXh0LCB0aGluZyB0aHJpZnR0ZXN0LlVzZXJJZCkgKHIgdGhyaWZ0dGVzdC5Vc2VySWQsIGVyciBlcnJvcikgeworCXJldHVybiB0aGluZywgbmlsCit9CisKK2Z1bmMgKHAgKlRocmlmdFRlc3RIYW5kbGVyKSBUZXN0TWFwTWFwKGN0eCBjb250ZXh0LkNvbnRleHQsIGhlbGxvIGludDMyKSAociBtYXBbaW50MzJdbWFwW2ludDMyXWludDMyLCBlcnIgZXJyb3IpIHsKKwlyID0gbWFrZShtYXBbaW50MzJdbWFwW2ludDMyXWludDMyKQorCXBvcyA6PSBtYWtlKG1hcFtpbnQzMl1pbnQzMikKKwluZWcgOj0gbWFrZShtYXBbaW50MzJdaW50MzIpCisKKwlmb3IgaSA6PSBpbnQzMigxKTsgaSA8IDU7IGkrKyB7CisJCXBvc1tpXSA9IGkKKwkJbmVnWy1pXSA9IC1pCisJfQorCXJbNF0gPSBwb3MKKwlyWy00XSA9IG5lZworCisJcmV0dXJuIHIsIG5pbAorfQorCitmdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdEluc2FuaXR5KGN0eCBjb250ZXh0LkNvbnRleHQsIGFyZ3VtZW50ICp0aHJpZnR0ZXN0Lkluc2FuaXR5KSAociBtYXBbdGhyaWZ0dGVzdC5Vc2VySWRdbWFwW3RocmlmdHRlc3QuTnVtYmVyel0qdGhyaWZ0dGVzdC5JbnNhbml0eSwgZXJyIGVycm9yKSB7CisJaGVsbG8gOj0gdGhyaWZ0dGVzdC5OZXdYdHJ1Y3QoKQorCWhlbGxvLlN0cmluZ1RoaW5nID0gIkhlbGxvMiIKKwloZWxsby5CeXRlVGhpbmcgPSAyCisJaGVsbG8uSTMyVGhpbmcgPSAyCisJaGVsbG8uSTY0VGhpbmcgPSAyCisKKwlnb29kYnllIDo9IHRocmlmdHRlc3QuTmV3WHRydWN0KCkKKwlnb29kYnllLlN0cmluZ1RoaW5nID0gIkdvb2RieWU0IgorCWdvb2RieWUuQnl0ZVRoaW5nID0gNAorCWdvb2RieWUuSTMyVGhpbmcgPSA0CisJZ29vZGJ5ZS5JNjRUaGluZyA9IDQKKworCWNyYXp5IDo9IHRocmlmdHRlc3QuTmV3SW5zYW5pdHkoKQorCWNyYXp5LlVzZXJNYXAgPSBtYWtlKG1hcFt0aHJpZnR0ZXN0Lk51bWJlcnpddGhyaWZ0dGVzdC5Vc2VySWQpCisJY3JhenkuVXNlck1hcFt0aHJpZnR0ZXN0Lk51bWJlcnpfRUlHSFRdID0gOAorCWNyYXp5LlVzZXJNYXBbdGhyaWZ0dGVzdC5OdW1iZXJ6X0ZJVkVdID0gNQorCWNyYXp5Llh0cnVjdHMgPSBbXSp0aHJpZnR0ZXN0Llh0cnVjdHtnb29kYnllLCBoZWxsb30KKworCWZpcnN0X21hcCA6PSBtYWtlKG1hcFt0aHJpZnR0ZXN0Lk51bWJlcnpdKnRocmlmdHRlc3QuSW5zYW5pdHkpCisJc2Vjb25kX21hcCA6PSBtYWtlKG1hcFt0aHJpZnR0ZXN0Lk51bWJlcnpdKnRocmlmdHRlc3QuSW5zYW5pdHkpCisKKwlmaXJzdF9tYXBbdGhyaWZ0dGVzdC5OdW1iZXJ6X1RXT10gPSBjcmF6eQorCWZpcnN0X21hcFt0aHJpZnR0ZXN0Lk51bWJlcnpfVEhSRUVdID0gY3JhenkKKworCWxvb25leSA6PSB0aHJpZnR0ZXN0Lk5ld0luc2FuaXR5KCkKKwlzZWNvbmRfbWFwW3RocmlmdHRlc3QuTnVtYmVyel9TSVhdID0gbG9vbmV5CisKKwl2YXIgaW5zYW5lID0gbWFrZShtYXBbdGhyaWZ0dGVzdC5Vc2VySWRdbWFwW3RocmlmdHRlc3QuTnVtYmVyel0qdGhyaWZ0dGVzdC5JbnNhbml0eSkKKwlpbnNhbmVbMV0gPSBmaXJzdF9tYXAKKwlpbnNhbmVbMl0gPSBzZWNvbmRfbWFwCisKKwlyZXR1cm4gaW5zYW5lLCBuaWwKK30KKworZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3RNdWx0aShjdHggY29udGV4dC5Db250ZXh0LCBhcmcwIGludDgsIGFyZzEgaW50MzIsIGFyZzIgaW50NjQsIGFyZzMgbWFwW2ludDE2XXN0cmluZywgYXJnNCB0aHJpZnR0ZXN0Lk51bWJlcnosIGFyZzUgdGhyaWZ0dGVzdC5Vc2VySWQpIChyICp0aHJpZnR0ZXN0Llh0cnVjdCwgZXJyIGVycm9yKSB7CisJciA9IHRocmlmdHRlc3QuTmV3WHRydWN0KCkKKwlyLlN0cmluZ1RoaW5nID0gIkhlbGxvMiIKKwlyLkJ5dGVUaGluZyA9IGFyZzAKKwlyLkkzMlRoaW5nID0gYXJnMQorCXIuSTY0VGhpbmcgPSBhcmcyCisJcmV0dXJuIHIsIG5pbAorfQorCitmdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdEV4Y2VwdGlvbihjdHggY29udGV4dC5Db250ZXh0LCBhcmcgc3RyaW5nKSAoZXJyIGVycm9yKSB7CisJaWYgYXJnID09ICJYY2VwdGlvbiIgeworCQl4IDo9IHRocmlmdHRlc3QuTmV3WGNlcHRpb24oKQorCQl4LkVycm9yQ29kZSA9IDEwMDEKKwkJeC5NZXNzYWdlID0gYXJnCisJCXJldHVybiB4CisJfSBlbHNlIGlmIGFyZyA9PSAiVEV4Y2VwdGlvbiIgeworCQlyZXR1cm4gdGhyaWZ0LlRFeGNlcHRpb24oZXJyb3JzLk5ldyhhcmcpKQorCX0gZWxzZSB7CisJCXJldHVybiBuaWwKKwl9Cit9CisKK2Z1bmMgKHAgKlRocmlmdFRlc3RIYW5kbGVyKSBUZXN0TXVsdGlFeGNlcHRpb24oY3R4IGNvbnRleHQuQ29udGV4dCwgYXJnMCBzdHJpbmcsIGFyZzEgc3RyaW5nKSAociAqdGhyaWZ0dGVzdC5YdHJ1Y3QsIGVyciBlcnJvcikgeworCWlmIGFyZzAgPT0gIlhjZXB0aW9uIiB7CisJCXggOj0gdGhyaWZ0dGVzdC5OZXdYY2VwdGlvbigpCisJCXguRXJyb3JDb2RlID0gMTAwMQorCQl4Lk1lc3NhZ2UgPSAiVGhpcyBpcyBhbiBYY2VwdGlvbiIKKwkJcmV0dXJuIG5pbCwgeAorCX0gZWxzZSBpZiBhcmcwID09ICJYY2VwdGlvbjIiIHsKKwkJeDIgOj0gdGhyaWZ0dGVzdC5OZXdYY2VwdGlvbjIoKQorCQl4Mi5FcnJvckNvZGUgPSAyMDAyCisJCXgyLlN0cnVjdFRoaW5nID0gdGhyaWZ0dGVzdC5OZXdYdHJ1Y3QoKQorCQl4Mi5TdHJ1Y3RUaGluZy5TdHJpbmdUaGluZyA9ICJUaGlzIGlzIGFuIFhjZXB0aW9uMiIKKwkJcmV0dXJuIG5pbCwgeDIKKwl9CisKKwlyZXMgOj0gdGhyaWZ0dGVzdC5OZXdYdHJ1Y3QoKQorCXJlcy5TdHJpbmdUaGluZyA9IGFyZzEKKwlyZXR1cm4gcmVzLCBuaWwKK30KKworZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3RPbmV3YXkoY3R4IGNvbnRleHQuQ29udGV4dCwgc2Vjb25kc1RvU2xlZXAgaW50MzIpIChlcnIgZXJyb3IpIHsKKwl0aW1lLlNsZWVwKHRpbWUuU2Vjb25kICogdGltZS5EdXJhdGlvbihzZWNvbmRzVG9TbGVlcCkpCisJcmV0dXJuIG5pbAorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3Rlc3QvdGVzdHMvdW5pb25fYmluYXJ5X3Rlc3QuZ28gYi9saWIvZ28vdGVzdC90ZXN0cy91bmlvbl9iaW5hcnlfdGVzdC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGFlMmNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3Rlc3QvdGVzdHMvdW5pb25fYmluYXJ5X3Rlc3QuZ28KQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRlc3RzCisKK2ltcG9ydCAoCisJInRlc3RpbmciCisJInVuaW9uYmluYXJ5dGVzdCIKKykKKworCisvLyBTZWUgaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDU3MworZnVuYyBUZXN0VW5pb25CaW5hcnkodCAqdGVzdGluZy5UKSB7CisJcyA6PSB1bmlvbmJpbmFyeXRlc3QuTmV3U2FtcGxlKCkKKwlzLlUxID0gbWFwW3N0cmluZ11zdHJpbmd7fQorCXMuVTIgPSBbXWJ5dGV7fQorCWlmIG4gOj0gcy5Db3VudFNldEZpZWxkc1NhbXBsZSgpOyBuICE9IDIgeworCQl0LkVycm9yZigiRXhwZWN0ZWQgMiBzZXQgZmllbGRzLCBnb3QgJWQhIiwgbikKKwl9Cit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC90ZXN0cy91bmlvbl9kZWZhdWx0X3ZhbHVlX3Rlc3QuZ28gYi9saWIvZ28vdGVzdC90ZXN0cy91bmlvbl9kZWZhdWx0X3ZhbHVlX3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRjYmY0ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90ZXN0L3Rlc3RzL3VuaW9uX2RlZmF1bHRfdmFsdWVfdGVzdC5nbwpAQCAtMCwwICsxLDMzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGVzdHMKKworaW1wb3J0ICgKKwkidGVzdGluZyIKKwkidW5pb25kZWZhdWx0dmFsdWV0ZXN0IgorKQorCitmdW5jIFRlc3RVbmlvbkRlZmF1bHRWYWx1ZSh0ICp0ZXN0aW5nLlQpIHsKKwlzIDo9IHVuaW9uZGVmYXVsdHZhbHVldGVzdC5OZXdUZXN0U3RydWN0KCkKKwlkIDo9IHMuR2V0RGVzY2VuZGFudCgpCisJaWYgZCA9PSBuaWwgeworCQl0LkVycm9yKCJEZWZhdWx0IFVuaW9uIHZhbHVlIG5vdCBzZXQhIikKKwl9Cit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L2FwcGxpY2F0aW9uX2V4Y2VwdGlvbi5nbyBiL2xpYi9nby90aHJpZnQvYXBwbGljYXRpb25fZXhjZXB0aW9uLmdvCmluZGV4IDY2NTVjYzUuLmI5ZDdlZWQgMTAwNjQ0Ci0tLSBhL2xpYi9nby90aHJpZnQvYXBwbGljYXRpb25fZXhjZXB0aW9uLmdvCisrKyBiL2xpYi9nby90aHJpZnQvYXBwbGljYXRpb25fZXhjZXB0aW9uLmdvCkBAIC0zMCwxMSArMzAsMjIgQEAKIAlQUk9UT0NPTF9FUlJPUiAgICAgICAgICAgICAgICAgPSA3CiApCiAKK3ZhciBkZWZhdWx0QXBwbGljYXRpb25FeGNlcHRpb25NZXNzYWdlID0gbWFwW2ludDMyXXN0cmluZ3sKKwlVTktOT1dOX0FQUExJQ0FUSU9OX0VYQ0VQVElPTjogICJ1bmtub3duIGFwcGxpY2F0aW9uIGV4Y2VwdGlvbiIsCisJVU5LTk9XTl9NRVRIT0Q6ICAgICAgICAgICAgICAgICAidW5rbm93biBtZXRob2QiLAorCUlOVkFMSURfTUVTU0FHRV9UWVBFX0VYQ0VQVElPTjogImludmFsaWQgbWVzc2FnZSB0eXBlIiwKKwlXUk9OR19NRVRIT0RfTkFNRTogICAgICAgICAgICAgICJ3cm9uZyBtZXRob2QgbmFtZSIsCisJQkFEX1NFUVVFTkNFX0lEOiAgICAgICAgICAgICAgICAiYmFkIHNlcXVlbmNlIElEIiwKKwlNSVNTSU5HX1JFU1VMVDogICAgICAgICAgICAgICAgICJtaXNzaW5nIHJlc3VsdCIsCisJSU5URVJOQUxfRVJST1I6ICAgICAgICAgICAgICAgICAidW5rbm93biBpbnRlcm5hbCBlcnJvciIsCisJUFJPVE9DT0xfRVJST1I6ICAgICAgICAgICAgICAgICAidW5rbm93biBwcm90b2NvbCBlcnJvciIsCit9CisKIC8vIEFwcGxpY2F0aW9uIGxldmVsIFRocmlmdCBleGNlcHRpb24KIHR5cGUgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGludGVyZmFjZSB7CiAJVEV4Y2VwdGlvbgogCVR5cGVJZCgpIGludDMyCi0JUmVhZChpcHJvdCBUUHJvdG9jb2wpIChUQXBwbGljYXRpb25FeGNlcHRpb24sIGVycm9yKQorCVJlYWQoaXByb3QgVFByb3RvY29sKSBlcnJvcgogCVdyaXRlKG9wcm90IFRQcm90b2NvbCkgZXJyb3IKIH0KIApAQCAtNDQsNyArNTUsMTAgQEAKIH0KIAogZnVuYyAoZSB0QXBwbGljYXRpb25FeGNlcHRpb24pIEVycm9yKCkgc3RyaW5nIHsKLQlyZXR1cm4gZS5tZXNzYWdlCisJaWYgZS5tZXNzYWdlICE9ICIiIHsKKwkJcmV0dXJuIGUubWVzc2FnZQorCX0KKwlyZXR1cm4gZGVmYXVsdEFwcGxpY2F0aW9uRXhjZXB0aW9uTWVzc2FnZVtlLnR5cGVfXQogfQogCiBmdW5jIE5ld1RBcHBsaWNhdGlvbkV4Y2VwdGlvbih0eXBlXyBpbnQzMiwgbWVzc2FnZSBzdHJpbmcpIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CkBAIC01NSwxMCArNjksMTEgQEAKIAlyZXR1cm4gcC50eXBlXwogfQogCi1mdW5jIChwICp0QXBwbGljYXRpb25FeGNlcHRpb24pIFJlYWQoaXByb3QgVFByb3RvY29sKSAoVEFwcGxpY2F0aW9uRXhjZXB0aW9uLCBlcnJvcikgeworZnVuYyAocCAqdEFwcGxpY2F0aW9uRXhjZXB0aW9uKSBSZWFkKGlwcm90IFRQcm90b2NvbCkgZXJyb3IgeworCS8vIFRPRE86IHRoaXMgc2hvdWxkIHJlYWxseSBiZSBnZW5lcmF0ZWQgYnkgdGhlIGNvbXBpbGVyCiAJXywgZXJyIDo9IGlwcm90LlJlYWRTdHJ1Y3RCZWdpbigpCiAJaWYgZXJyICE9IG5pbCB7Ci0JCXJldHVybiBuaWwsIGVycgorCQlyZXR1cm4gZXJyCiAJfQogCiAJbWVzc2FnZSA6PSAiIgpAQCAtNjcsNyArODIsNyBAQAogCWZvciB7CiAJCV8sIHR0eXBlLCBpZCwgZXJyIDo9IGlwcm90LlJlYWRGaWVsZEJlZ2luKCkKIAkJaWYgZXJyICE9IG5pbCB7Ci0JCQlyZXR1cm4gbmlsLCBlcnIKKwkJCXJldHVybiBlcnIKIAkJfQogCQlpZiB0dHlwZSA9PSBTVE9QIHsKIAkJCWJyZWFrCkBAIC03NiwzMyArOTEsNDAgQEAKIAkJY2FzZSAxOgogCQkJaWYgdHR5cGUgPT0gU1RSSU5HIHsKIAkJCQlpZiBtZXNzYWdlLCBlcnIgPSBpcHJvdC5SZWFkU3RyaW5nKCk7IGVyciAhPSBuaWwgewotCQkJCQlyZXR1cm4gbmlsLCBlcnIKKwkJCQkJcmV0dXJuIGVycgogCQkJCX0KIAkJCX0gZWxzZSB7CiAJCQkJaWYgZXJyID0gU2tpcERlZmF1bHREZXB0aChpcHJvdCwgdHR5cGUpOyBlcnIgIT0gbmlsIHsKLQkJCQkJcmV0dXJuIG5pbCwgZXJyCisJCQkJCXJldHVybiBlcnIKIAkJCQl9CiAJCQl9CiAJCWNhc2UgMjoKIAkJCWlmIHR0eXBlID09IEkzMiB7CiAJCQkJaWYgdHlwZV8sIGVyciA9IGlwcm90LlJlYWRJMzIoKTsgZXJyICE9IG5pbCB7Ci0JCQkJCXJldHVybiBuaWwsIGVycgorCQkJCQlyZXR1cm4gZXJyCiAJCQkJfQogCQkJfSBlbHNlIHsKIAkJCQlpZiBlcnIgPSBTa2lwRGVmYXVsdERlcHRoKGlwcm90LCB0dHlwZSk7IGVyciAhPSBuaWwgewotCQkJCQlyZXR1cm4gbmlsLCBlcnIKKwkJCQkJcmV0dXJuIGVycgogCQkJCX0KIAkJCX0KIAkJZGVmYXVsdDoKIAkJCWlmIGVyciA9IFNraXBEZWZhdWx0RGVwdGgoaXByb3QsIHR0eXBlKTsgZXJyICE9IG5pbCB7Ci0JCQkJcmV0dXJuIG5pbCwgZXJyCisJCQkJcmV0dXJuIGVycgogCQkJfQogCQl9CiAJCWlmIGVyciA9IGlwcm90LlJlYWRGaWVsZEVuZCgpOyBlcnIgIT0gbmlsIHsKLQkJCXJldHVybiBuaWwsIGVycgorCQkJcmV0dXJuIGVycgogCQl9CiAJfQotCXJldHVybiBOZXdUQXBwbGljYXRpb25FeGNlcHRpb24odHlwZV8sIG1lc3NhZ2UpLCBpcHJvdC5SZWFkU3RydWN0RW5kKCkKKwlpZiBlcnIgOj0gaXByb3QuUmVhZFN0cnVjdEVuZCgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKworCXAubWVzc2FnZSA9IG1lc3NhZ2UKKwlwLnR5cGVfID0gdHlwZV8KKworCXJldHVybiBuaWwKIH0KIAogZnVuYyAocCAqdEFwcGxpY2F0aW9uRXhjZXB0aW9uKSBXcml0ZShvcHJvdCBUUHJvdG9jb2wpIChlcnIgZXJyb3IpIHsKZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvYXBwbGljYXRpb25fZXhjZXB0aW9uX3Rlc3QuZ28gYi9saWIvZ28vdGhyaWZ0L2FwcGxpY2F0aW9uX2V4Y2VwdGlvbl90ZXN0LmdvCmluZGV4IDcwMTBmODYuLjc3NDMzNTcgMTAwNjQ0Ci0tLSBhL2xpYi9nby90aHJpZnQvYXBwbGljYXRpb25fZXhjZXB0aW9uX3Rlc3QuZ28KKysrIGIvbGliL2dvL3RocmlmdC9hcHBsaWNhdGlvbl9leGNlcHRpb25fdGVzdC5nbwpAQCAtMjUsMTcgKzI1LDE3IEBACiAKIGZ1bmMgVGVzdFRBcHBsaWNhdGlvbkV4Y2VwdGlvbih0ICp0ZXN0aW5nLlQpIHsKIAlleGMgOj0gTmV3VEFwcGxpY2F0aW9uRXhjZXB0aW9uKFVOS05PV05fQVBQTElDQVRJT05fRVhDRVBUSU9OLCAiIikKLQlpZiBleGMuRXJyb3IoKSAhPSAiIiB7CisJaWYgZXhjLkVycm9yKCkgIT0gZGVmYXVsdEFwcGxpY2F0aW9uRXhjZXB0aW9uTWVzc2FnZVtVTktOT1dOX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl0gewogCQl0LkZhdGFsZigiRXhwZWN0ZWQgZW1wdHkgc3RyaW5nIGZvciBleGNlcHRpb24gYnV0IGZvdW5kICclcyciLCBleGMuRXJyb3IoKSkKIAl9CiAJaWYgZXhjLlR5cGVJZCgpICE9IFVOS05PV05fQVBQTElDQVRJT05fRVhDRVBUSU9OIHsKLQkJdC5GYXRhbGYoIkV4cGVjdGVkIHR5cGUgVU5LTk9XTiBmb3IgZXhjZXB0aW9uIGJ1dCBmb3VuZCAnJXMnIiwgZXhjLlR5cGVJZCgpKQorCQl0LkZhdGFsZigiRXhwZWN0ZWQgdHlwZSBVTktOT1dOIGZvciBleGNlcHRpb24gYnV0IGZvdW5kICcldiciLCBleGMuVHlwZUlkKCkpCiAJfQogCWV4YyA9IE5ld1RBcHBsaWNhdGlvbkV4Y2VwdGlvbihXUk9OR19NRVRIT0RfTkFNRSwgImp1bmtfbWV0aG9kIikKIAlpZiBleGMuRXJyb3IoKSAhPSAianVua19tZXRob2QiIHsKIAkJdC5GYXRhbGYoIkV4cGVjdGVkICdqdW5rX21ldGhvZCcgZm9yIGV4Y2VwdGlvbiBidXQgZm91bmQgJyVzJyIsIGV4Yy5FcnJvcigpKQogCX0KIAlpZiBleGMuVHlwZUlkKCkgIT0gV1JPTkdfTUVUSE9EX05BTUUgewotCQl0LkZhdGFsZigiRXhwZWN0ZWQgdHlwZSBXUk9OR19NRVRIT0RfTkFNRSBmb3IgZXhjZXB0aW9uIGJ1dCBmb3VuZCAnJXMnIiwgZXhjLlR5cGVJZCgpKQorCQl0LkZhdGFsZigiRXhwZWN0ZWQgdHlwZSBXUk9OR19NRVRIT0RfTkFNRSBmb3IgZXhjZXB0aW9uIGJ1dCBmb3VuZCAnJXYnIiwgZXhjLlR5cGVJZCgpKQogCX0KIH0KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvYmluYXJ5X3Byb3RvY29sLmdvIGIvbGliL2dvL3RocmlmdC9iaW5hcnlfcHJvdG9jb2wuZ28KaW5kZXggMDlmOTRkNC4uMWY5MGJmNCAxMDA2NDQKLS0tIGEvbGliL2dvL3RocmlmdC9iaW5hcnlfcHJvdG9jb2wuZ28KKysrIGIvbGliL2dvL3RocmlmdC9iaW5hcnlfcHJvdG9jb2wuZ28KQEAgLTIwLDYgKzIwLDggQEAKIHBhY2thZ2UgdGhyaWZ0CiAKIGltcG9ydCAoCisJImJ5dGVzIgorCSJjb250ZXh0IgogCSJlbmNvZGluZy9iaW5hcnkiCiAJImVycm9ycyIKIAkiZm10IgpAQCAtOTIsNyArOTQsNyBAQAogCQlpZiBlICE9IG5pbCB7CiAJCQlyZXR1cm4gZQogCQl9Ci0JCWUgPSBwLldyaXRlQnl0ZShieXRlKHR5cGVJZCkpCisJCWUgPSBwLldyaXRlQnl0ZShpbnQ4KHR5cGVJZCkpCiAJCWlmIGUgIT0gbmlsIHsKIAkJCXJldHVybiBlCiAJCX0KQEAgLTExNSw3ICsxMTcsNyBAQAogfQogCiBmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFdyaXRlRmllbGRCZWdpbihuYW1lIHN0cmluZywgdHlwZUlkIFRUeXBlLCBpZCBpbnQxNikgZXJyb3IgewotCWUgOj0gcC5Xcml0ZUJ5dGUoYnl0ZSh0eXBlSWQpKQorCWUgOj0gcC5Xcml0ZUJ5dGUoaW50OCh0eXBlSWQpKQogCWlmIGUgIT0gbmlsIHsKIAkJcmV0dXJuIGUKIAl9CkBAIC0xMzMsMTEgKzEzNSwxMSBAQAogfQogCiBmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFdyaXRlTWFwQmVnaW4oa2V5VHlwZSBUVHlwZSwgdmFsdWVUeXBlIFRUeXBlLCBzaXplIGludCkgZXJyb3IgewotCWUgOj0gcC5Xcml0ZUJ5dGUoYnl0ZShrZXlUeXBlKSkKKwllIDo9IHAuV3JpdGVCeXRlKGludDgoa2V5VHlwZSkpCiAJaWYgZSAhPSBuaWwgewogCQlyZXR1cm4gZQogCX0KLQllID0gcC5Xcml0ZUJ5dGUoYnl0ZSh2YWx1ZVR5cGUpKQorCWUgPSBwLldyaXRlQnl0ZShpbnQ4KHZhbHVlVHlwZSkpCiAJaWYgZSAhPSBuaWwgewogCQlyZXR1cm4gZQogCX0KQEAgLTE1MCw3ICsxNTIsNyBAQAogfQogCiBmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFdyaXRlTGlzdEJlZ2luKGVsZW1UeXBlIFRUeXBlLCBzaXplIGludCkgZXJyb3IgewotCWUgOj0gcC5Xcml0ZUJ5dGUoYnl0ZShlbGVtVHlwZSkpCisJZSA6PSBwLldyaXRlQnl0ZShpbnQ4KGVsZW1UeXBlKSkKIAlpZiBlICE9IG5pbCB7CiAJCXJldHVybiBlCiAJfQpAQCAtMTYzLDcgKzE2NSw3IEBACiB9CiAKIGZ1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgV3JpdGVTZXRCZWdpbihlbGVtVHlwZSBUVHlwZSwgc2l6ZSBpbnQpIGVycm9yIHsKLQllIDo9IHAuV3JpdGVCeXRlKGJ5dGUoZWxlbVR5cGUpKQorCWUgOj0gcC5Xcml0ZUJ5dGUoaW50OChlbGVtVHlwZSkpCiAJaWYgZSAhPSBuaWwgewogCQlyZXR1cm4gZQogCX0KQEAgLTE4Miw4ICsxODQsOCBAQAogCXJldHVybiBwLldyaXRlQnl0ZSgwKQogfQogCi1mdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFdyaXRlQnl0ZSh2YWx1ZSBieXRlKSBlcnJvciB7Ci0JZSA6PSBwLnRyYW5zLldyaXRlQnl0ZSh2YWx1ZSkKK2Z1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgV3JpdGVCeXRlKHZhbHVlIGludDgpIGVycm9yIHsKKwllIDo9IHAudHJhbnMuV3JpdGVCeXRlKGJ5dGUodmFsdWUpKQogCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKIH0KIApAQCAtMjU4LDcgKzI2MCw3IEBACiAJaWYgcC5zdHJpY3RSZWFkIHsKIAkJcmV0dXJuIG5hbWUsIHR5cGVJZCwgc2VxSWQsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKEJBRF9WRVJTSU9OLCBmbXQuRXJyb3JmKCJNaXNzaW5nIHZlcnNpb24gaW4gUmVhZE1lc3NhZ2VCZWdpbiIpKQogCX0KLQluYW1lLCBlMiA6PSBwLnJlYWRTdHJpbmdCb2R5KGludChzaXplKSkKKwluYW1lLCBlMiA6PSBwLnJlYWRTdHJpbmdCb2R5KHNpemUpCiAJaWYgZTIgIT0gbmlsIHsKIAkJcmV0dXJuIG5hbWUsIHR5cGVJZCwgc2VxSWQsIGUyCiAJfQpAQCAtMzkyLDggKzM5NCw5IEBACiAJcmV0dXJuIHYsIGUKIH0KIAotZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBSZWFkQnl0ZSgpICh2YWx1ZSBieXRlLCBlcnIgZXJyb3IpIHsKLQlyZXR1cm4gcC50cmFucy5SZWFkQnl0ZSgpCitmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFJlYWRCeXRlKCkgKGludDgsIGVycm9yKSB7CisJdiwgZXJyIDo9IHAudHJhbnMuUmVhZEJ5dGUoKQorCXJldHVybiBpbnQ4KHYpLCBlcnIKIH0KIAogZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBSZWFkSTE2KCkgKHZhbHVlIGludDE2LCBlcnIgZXJyb3IpIHsKQEAgLTQzNCw3ICs0MzcsNyBAQAogCQlyZXR1cm4KIAl9CiAKLQlyZXR1cm4gcC5yZWFkU3RyaW5nQm9keShpbnQoc2l6ZSkpCisJcmV0dXJuIHAucmVhZFN0cmluZ0JvZHkoc2l6ZSkKIH0KIAogZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBSZWFkQmluYXJ5KCkgKFtdYnl0ZSwgZXJyb3IpIHsKQEAgLTQ1Miw4ICs0NTUsOCBAQAogCXJldHVybiBidWYsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlcnIpCiB9CiAKLWZ1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgRmx1c2goKSAoZXJyIGVycm9yKSB7Ci0JcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihwLnRyYW5zLkZsdXNoKCkpCitmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIEZsdXNoKGN0eCBjb250ZXh0LkNvbnRleHQpIChlcnIgZXJyb3IpIHsKKwlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKHAudHJhbnMuRmx1c2goY3R4KSkKIH0KIAogZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBTa2lwKGZpZWxkVHlwZSBUVHlwZSkgKGVyciBlcnJvcikgewpAQCAtNDY5LDE2ICs0NzIsMzggQEAKIAlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGVycikKIH0KIAotZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSByZWFkU3RyaW5nQm9keShzaXplIGludCkgKHZhbHVlIHN0cmluZywgZXJyIGVycm9yKSB7Citjb25zdCByZWFkTGltaXQgPSAzMjc2OAorCitmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIHJlYWRTdHJpbmdCb2R5KHNpemUgaW50MzIpICh2YWx1ZSBzdHJpbmcsIGVyciBlcnJvcikgewogCWlmIHNpemUgPCAwIHsKIAkJcmV0dXJuICIiLCBuaWwKIAl9Ci0JdmFyIGJ1ZiBbXWJ5dGUKLQlpZiBzaXplIDw9IGxlbihwLmJ1ZmZlcikgewotCQlidWYgPSBwLmJ1ZmZlclswOnNpemVdCi0JfSBlbHNlIHsKLQkJYnVmID0gbWFrZShbXWJ5dGUsIHNpemUpCisKKwl2YXIgKAorCQlidWYgYnl0ZXMuQnVmZmVyCisJCWUgICBlcnJvcgorCQliICAgW11ieXRlCisJKQorCisJc3dpdGNoIHsKKwljYXNlIGludChzaXplKSA8PSBsZW4ocC5idWZmZXIpOgorCQliID0gcC5idWZmZXJbOnNpemVdIC8vIGF2b2lkcyBhbGxvY2F0aW9uIGZvciBzbWFsbCByZWFkcworCWNhc2UgaW50KHNpemUpIDwgcmVhZExpbWl0OgorCQliID0gbWFrZShbXWJ5dGUsIHNpemUpCisJZGVmYXVsdDoKKwkJYiA9IG1ha2UoW11ieXRlLCByZWFkTGltaXQpCiAJfQotCV8sIGUgOj0gaW8uUmVhZEZ1bGwocC50cmFucywgYnVmKQotCXJldHVybiBzdHJpbmcoYnVmKSwgTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisKKwlmb3Igc2l6ZSA+IDAgeworCQlfLCBlID0gaW8uUmVhZEZ1bGwocC50cmFucywgYikKKwkJYnVmLldyaXRlKGIpCisJCWlmIGUgIT0gbmlsIHsKKwkJCWJyZWFrCisJCX0KKwkJc2l6ZSAtPSByZWFkTGltaXQKKwkJaWYgc2l6ZSA8IHJlYWRMaW1pdCAmJiBzaXplID4gMCB7CisJCQliID0gYls6c2l6ZV0KKwkJfQorCX0KKwlyZXR1cm4gYnVmLlN0cmluZygpLCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKIH0KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvYnVmZmVyZWRfdHJhbnNwb3J0LmdvIGIvbGliL2dvL3RocmlmdC9idWZmZXJlZF90cmFuc3BvcnQuZ28KaW5kZXggZDI1OGI3MC4uOTY3MDIwNiAxMDA2NDQKLS0tIGEvbGliL2dvL3RocmlmdC9idWZmZXJlZF90cmFuc3BvcnQuZ28KKysrIGIvbGliL2dvL3RocmlmdC9idWZmZXJlZF90cmFuc3BvcnQuZ28KQEAgLTIxLDYgKzIxLDcgQEAKIAogaW1wb3J0ICgKIAkiYnVmaW8iCisJImNvbnRleHQiCiApCiAKIHR5cGUgVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSBzdHJ1Y3QgewpAQCAtMzIsOCArMzMsOCBAQAogCXRwIFRUcmFuc3BvcnQKIH0KIAotZnVuYyAocCAqVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSkgR2V0VHJhbnNwb3J0KHRyYW5zIFRUcmFuc3BvcnQpIFRUcmFuc3BvcnQgewotCXJldHVybiBOZXdUQnVmZmVyZWRUcmFuc3BvcnQodHJhbnMsIHAuc2l6ZSkKK2Z1bmMgKHAgKlRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkpIEdldFRyYW5zcG9ydCh0cmFucyBUVHJhbnNwb3J0KSAoVFRyYW5zcG9ydCwgZXJyb3IpIHsKKwlyZXR1cm4gTmV3VEJ1ZmZlcmVkVHJhbnNwb3J0KHRyYW5zLCBwLnNpemUpLCBuaWwKIH0KIAogZnVuYyBOZXdUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KGJ1ZmZlclNpemUgaW50KSAqVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSB7CkBAIC02Miw5ICs2MywzMCBAQAogCXJldHVybiBwLnRwLkNsb3NlKCkKIH0KIAotZnVuYyAocCAqVEJ1ZmZlcmVkVHJhbnNwb3J0KSBGbHVzaCgpIGVycm9yIHsKK2Z1bmMgKHAgKlRCdWZmZXJlZFRyYW5zcG9ydCkgUmVhZChiIFtdYnl0ZSkgKGludCwgZXJyb3IpIHsKKwluLCBlcnIgOj0gcC5SZWFkV3JpdGVyLlJlYWQoYikKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcC5SZWFkV3JpdGVyLlJlYWRlci5SZXNldChwLnRwKQorCX0KKwlyZXR1cm4gbiwgZXJyCit9CisKK2Z1bmMgKHAgKlRCdWZmZXJlZFRyYW5zcG9ydCkgV3JpdGUoYiBbXWJ5dGUpIChpbnQsIGVycm9yKSB7CisJbiwgZXJyIDo9IHAuUmVhZFdyaXRlci5Xcml0ZShiKQorCWlmIGVyciAhPSBuaWwgeworCQlwLlJlYWRXcml0ZXIuV3JpdGVyLlJlc2V0KHAudHApCisJfQorCXJldHVybiBuLCBlcnIKK30KKworZnVuYyAocCAqVEJ1ZmZlcmVkVHJhbnNwb3J0KSBGbHVzaChjdHggY29udGV4dC5Db250ZXh0KSBlcnJvciB7CiAJaWYgZXJyIDo9IHAuUmVhZFdyaXRlci5GbHVzaCgpOyBlcnIgIT0gbmlsIHsKKwkJcC5SZWFkV3JpdGVyLldyaXRlci5SZXNldChwLnRwKQogCQlyZXR1cm4gZXJyCiAJfQotCXJldHVybiBwLnRwLkZsdXNoKCkKKwlyZXR1cm4gcC50cC5GbHVzaChjdHgpCit9CisKK2Z1bmMgKHAgKlRCdWZmZXJlZFRyYW5zcG9ydCkgUmVtYWluaW5nQnl0ZXMoKSAobnVtX2J5dGVzIHVpbnQ2NCkgeworCXJldHVybiBwLnRwLlJlbWFpbmluZ0J5dGVzKCkKIH0KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvY2xpZW50LmdvIGIvbGliL2dvL3RocmlmdC9jbGllbnQuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg3OTFjYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvY2xpZW50LmdvCkBAIC0wLDAgKzEsODUgQEAKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJImNvbnRleHQiCisJImZtdCIKKykKKwordHlwZSBUQ2xpZW50IGludGVyZmFjZSB7CisJQ2FsbChjdHggY29udGV4dC5Db250ZXh0LCBtZXRob2Qgc3RyaW5nLCBhcmdzLCByZXN1bHQgVFN0cnVjdCkgZXJyb3IKK30KKwordHlwZSBUU3RhbmRhcmRDbGllbnQgc3RydWN0IHsKKwlzZXFJZCAgICAgICAgaW50MzIKKwlpcHJvdCwgb3Byb3QgVFByb3RvY29sCit9CisKKy8vIFRTdGFuZGFyZENsaWVudCBpbXBsZW1lbnRzIFRDbGllbnQsIGFuZCB1c2VzIHRoZSBzdGFuZGFyZCBtZXNzYWdlIGZvcm1hdCBmb3IgVGhyaWZ0LgorLy8gSXQgaXMgbm90IHNhZmUgZm9yIGNvbmN1cnJlbnQgdXNlLgorZnVuYyBOZXdUU3RhbmRhcmRDbGllbnQoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wgVFByb3RvY29sKSAqVFN0YW5kYXJkQ2xpZW50IHsKKwlyZXR1cm4gJlRTdGFuZGFyZENsaWVudHsKKwkJaXByb3Q6IGlucHV0UHJvdG9jb2wsCisJCW9wcm90OiBvdXRwdXRQcm90b2NvbCwKKwl9Cit9CisKK2Z1bmMgKHAgKlRTdGFuZGFyZENsaWVudCkgU2VuZChjdHggY29udGV4dC5Db250ZXh0LCBvcHJvdCBUUHJvdG9jb2wsIHNlcUlkIGludDMyLCBtZXRob2Qgc3RyaW5nLCBhcmdzIFRTdHJ1Y3QpIGVycm9yIHsKKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVNZXNzYWdlQmVnaW4obWV0aG9kLCBDQUxMLCBzZXFJZCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQorCWlmIGVyciA6PSBhcmdzLldyaXRlKG9wcm90KTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9CisJaWYgZXJyIDo9IG9wcm90LldyaXRlTWVzc2FnZUVuZCgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKwlyZXR1cm4gb3Byb3QuRmx1c2goY3R4KQorfQorCitmdW5jIChwICpUU3RhbmRhcmRDbGllbnQpIFJlY3YoaXByb3QgVFByb3RvY29sLCBzZXFJZCBpbnQzMiwgbWV0aG9kIHN0cmluZywgcmVzdWx0IFRTdHJ1Y3QpIGVycm9yIHsKKwlyTWV0aG9kLCByVHlwZUlkLCByU2VxSWQsIGVyciA6PSBpcHJvdC5SZWFkTWVzc2FnZUJlZ2luKCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKworCWlmIG1ldGhvZCAhPSByTWV0aG9kIHsKKwkJcmV0dXJuIE5ld1RBcHBsaWNhdGlvbkV4Y2VwdGlvbihXUk9OR19NRVRIT0RfTkFNRSwgZm10LlNwcmludGYoIiVzOiB3cm9uZyBtZXRob2QgbmFtZSIsIG1ldGhvZCkpCisJfSBlbHNlIGlmIHNlcUlkICE9IHJTZXFJZCB7CisJCXJldHVybiBOZXdUQXBwbGljYXRpb25FeGNlcHRpb24oQkFEX1NFUVVFTkNFX0lELCBmbXQuU3ByaW50ZigiJXM6IG91dCBvZiBvcmRlciBzZXF1ZW5jZSByZXNwb25zZSIsIG1ldGhvZCkpCisJfSBlbHNlIGlmIHJUeXBlSWQgPT0gRVhDRVBUSU9OIHsKKwkJdmFyIGV4Y2VwdGlvbiB0QXBwbGljYXRpb25FeGNlcHRpb24KKwkJaWYgZXJyIDo9IGV4Y2VwdGlvbi5SZWFkKGlwcm90KTsgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4gZXJyCisJCX0KKworCQlpZiBlcnIgOj0gaXByb3QuUmVhZE1lc3NhZ2VFbmQoKTsgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4gZXJyCisJCX0KKworCQlyZXR1cm4gJmV4Y2VwdGlvbgorCX0gZWxzZSBpZiByVHlwZUlkICE9IFJFUExZIHsKKwkJcmV0dXJuIE5ld1RBcHBsaWNhdGlvbkV4Y2VwdGlvbihJTlZBTElEX01FU1NBR0VfVFlQRV9FWENFUFRJT04sIGZtdC5TcHJpbnRmKCIlczogaW52YWxpZCBtZXNzYWdlIHR5cGUiLCBtZXRob2QpKQorCX0KKworCWlmIGVyciA6PSByZXN1bHQuUmVhZChpcHJvdCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQorCisJcmV0dXJuIGlwcm90LlJlYWRNZXNzYWdlRW5kKCkKK30KKworZnVuYyAocCAqVFN0YW5kYXJkQ2xpZW50KSBDYWxsKGN0eCBjb250ZXh0LkNvbnRleHQsIG1ldGhvZCBzdHJpbmcsIGFyZ3MsIHJlc3VsdCBUU3RydWN0KSBlcnJvciB7CisJcC5zZXFJZCsrCisJc2VxSWQgOj0gcC5zZXFJZAorCisJaWYgZXJyIDo9IHAuU2VuZChjdHgsIHAub3Byb3QsIHNlcUlkLCBtZXRob2QsIGFyZ3MpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKworCS8vIG1ldGhvZCBpcyBvbmV3YXkKKwlpZiByZXN1bHQgPT0gbmlsIHsKKwkJcmV0dXJuIG5pbAorCX0KKworCXJldHVybiBwLlJlY3YocC5pcHJvdCwgc2VxSWQsIG1ldGhvZCwgcmVzdWx0KQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9jb21tb25fdGVzdC5nbyBiL2xpYi9nby90aHJpZnQvY29tbW9uX3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM1OTdmZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvY29tbW9uX3Rlc3QuZ28KQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgImNvbnRleHQiCisKK3R5cGUgbW9ja1Byb2Nlc3NvciBzdHJ1Y3QgeworCVByb2Nlc3NGdW5jIGZ1bmMoaW4sIG91dCBUUHJvdG9jb2wpIChib29sLCBURXhjZXB0aW9uKQorfQorCitmdW5jIChtICptb2NrUHJvY2Vzc29yKSBQcm9jZXNzKGN0eCBjb250ZXh0LkNvbnRleHQsIGluLCBvdXQgVFByb3RvY29sKSAoYm9vbCwgVEV4Y2VwdGlvbikgeworCXJldHVybiBtLlByb2Nlc3NGdW5jKGluLCBvdXQpCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L2NvbXBhY3RfcHJvdG9jb2wuZ28gYi9saWIvZ28vdGhyaWZ0L2NvbXBhY3RfcHJvdG9jb2wuZ28KaW5kZXggMDg1N2E3YS4uMTkwMGQ1MCAxMDA2NDQKLS0tIGEvbGliL2dvL3RocmlmdC9jb21wYWN0X3Byb3RvY29sLmdvCisrKyBiL2xpYi9nby90aHJpZnQvY29tcGFjdF9wcm90b2NvbC5nbwpAQCAtMjAsNiArMjAsNyBAQAogcGFja2FnZSB0aHJpZnQKIAogaW1wb3J0ICgKKwkiY29udGV4dCIKIAkiZW5jb2RpbmcvYmluYXJ5IgogCSJmbXQiCiAJImlvIgpAQCAtMjY3LDggKzI2OCw4IEBACiB9CiAKIC8vIFdyaXRlIGEgYnl0ZS4gTm90aGluZyB0byBzZWUgaGVyZSEKLWZ1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFdyaXRlQnl0ZSh2YWx1ZSBieXRlKSBlcnJvciB7Ci0JZXJyIDo9IHAud3JpdGVCeXRlRGlyZWN0KHZhbHVlKQorZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgV3JpdGVCeXRlKHZhbHVlIGludDgpIGVycm9yIHsKKwllcnIgOj0gcC53cml0ZUJ5dGVEaXJlY3QoYnl0ZSh2YWx1ZSkpCiAJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlcnIpCiB9CiAKQEAgLTI5OCw3ICsyOTksNyBAQAogCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQogfQogCi0vLyBXcml0ZSBhIHN0cmluZyB0byB0aGUgd2lyZSB3aXRoIGEgdmFyaW50IHNpemUgcHJlY2VlZGluZy4KKy8vIFdyaXRlIGEgc3RyaW5nIHRvIHRoZSB3aXJlIHdpdGggYSB2YXJpbnQgc2l6ZSBwcmVjZWRpbmcuCiBmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBXcml0ZVN0cmluZyh2YWx1ZSBzdHJpbmcpIGVycm9yIHsKIAlfLCBlIDo9IHAud3JpdGVWYXJpbnQzMihpbnQzMihsZW4odmFsdWUpKSkKIAlpZiBlICE9IG5pbCB7CkBAIC0zMjksMTcgKzMzMCwyNCBAQAogCiAvLyBSZWFkIGEgbWVzc2FnZSBoZWFkZXIuCiBmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBSZWFkTWVzc2FnZUJlZ2luKCkgKG5hbWUgc3RyaW5nLCB0eXBlSWQgVE1lc3NhZ2VUeXBlLCBzZXFJZCBpbnQzMiwgZXJyIGVycm9yKSB7Ci0JcHJvdG9jb2xJZCwgZXJyIDo9IHAuUmVhZEJ5dGUoKQorCisJcHJvdG9jb2xJZCwgZXJyIDo9IHAucmVhZEJ5dGVEaXJlY3QoKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4KKwl9CisKIAlpZiBwcm90b2NvbElkICE9IENPTVBBQ1RfUFJPVE9DT0xfSUQgewogCQllIDo9IGZtdC5FcnJvcmYoIkV4cGVjdGVkIHByb3RvY29sIGlkICUwMnggYnV0IGdvdCAlMDJ4IiwgQ09NUEFDVF9QUk9UT0NPTF9JRCwgcHJvdG9jb2xJZCkKIAkJcmV0dXJuICIiLCB0eXBlSWQsIHNlcUlkLCBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShCQURfVkVSU0lPTiwgZSkKIAl9Ci0JdmVyc2lvbkFuZFR5cGUsIGVyciA6PSBwLlJlYWRCeXRlKCkKLQl2ZXJzaW9uIDo9IHZlcnNpb25BbmRUeXBlICYgQ09NUEFDVF9WRVJTSU9OX01BU0sKLQl0eXBlSWQgPSBUTWVzc2FnZVR5cGUoKHZlcnNpb25BbmRUeXBlID4+IENPTVBBQ1RfVFlQRV9TSElGVF9BTU9VTlQpICYgQ09NUEFDVF9UWVBFX0JJVFMpCisKKwl2ZXJzaW9uQW5kVHlwZSwgZXJyIDo9IHAucmVhZEJ5dGVEaXJlY3QoKQogCWlmIGVyciAhPSBuaWwgewogCQlyZXR1cm4KIAl9CisKKwl2ZXJzaW9uIDo9IHZlcnNpb25BbmRUeXBlICYgQ09NUEFDVF9WRVJTSU9OX01BU0sKKwl0eXBlSWQgPSBUTWVzc2FnZVR5cGUoKHZlcnNpb25BbmRUeXBlID4+IENPTVBBQ1RfVFlQRV9TSElGVF9BTU9VTlQpICYgQ09NUEFDVF9UWVBFX0JJVFMpCiAJaWYgdmVyc2lvbiAhPSBDT01QQUNUX1ZFUlNJT04gewogCQllIDo9IGZtdC5FcnJvcmYoIkV4cGVjdGVkIHZlcnNpb24gJTAyeCBidXQgZ290ICUwMngiLCBDT01QQUNUX1ZFUlNJT04sIHZlcnNpb24pCiAJCWVyciA9IE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKEJBRF9WRVJTSU9OLCBlKQpAQCAtMzc1LDcgKzM4Myw3IEBACiAKIC8vIFJlYWQgYSBmaWVsZCBoZWFkZXIgb2ZmIHRoZSB3aXJlLgogZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgUmVhZEZpZWxkQmVnaW4oKSAobmFtZSBzdHJpbmcsIHR5cGVJZCBUVHlwZSwgaWQgaW50MTYsIGVyciBlcnJvcikgewotCXQsIGVyciA6PSBwLlJlYWRCeXRlKCkKKwl0LCBlcnIgOj0gcC5yZWFkQnl0ZURpcmVjdCgpCiAJaWYgZXJyICE9IG5pbCB7CiAJCXJldHVybgogCX0KQEAgLTQzNCw3ICs0NDIsNyBAQAogCiAJa2V5QW5kVmFsdWVUeXBlIDo9IGJ5dGUoU1RPUCkKIAlpZiBzaXplICE9IDAgewotCQlrZXlBbmRWYWx1ZVR5cGUsIGVyciA9IHAuUmVhZEJ5dGUoKQorCQlrZXlBbmRWYWx1ZVR5cGUsIGVyciA9IHAucmVhZEJ5dGVEaXJlY3QoKQogCQlpZiBlcnIgIT0gbmlsIHsKIAkJCXJldHVybgogCQl9CkBAIC00NTEsNyArNDU5LDcgQEAKIC8vIG9mIHRoZSBlbGVtZW50IHR5cGUgaGVhZGVyIHdpbGwgYmUgMHhGLCBhbmQgYSB2YXJpbnQgd2lsbCBmb2xsb3cgd2l0aCB0aGUKIC8vIHRydWUgc2l6ZS4KIGZ1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFJlYWRMaXN0QmVnaW4oKSAoZWxlbVR5cGUgVFR5cGUsIHNpemUgaW50LCBlcnIgZXJyb3IpIHsKLQlzaXplX2FuZF90eXBlLCBlcnIgOj0gcC5SZWFkQnl0ZSgpCisJc2l6ZV9hbmRfdHlwZSwgZXJyIDo9IHAucmVhZEJ5dGVEaXJlY3QoKQogCWlmIGVyciAhPSBuaWwgewogCQlyZXR1cm4KIAl9CkBAIC00OTYsMTcgKzUwNCwxNyBAQAogCQlwLmJvb2xWYWx1ZUlzTm90TnVsbCA9IGZhbHNlCiAJCXJldHVybiBwLmJvb2xWYWx1ZSwgbmlsCiAJfQotCXYsIGVyciA6PSBwLlJlYWRCeXRlKCkKKwl2LCBlcnIgOj0gcC5yZWFkQnl0ZURpcmVjdCgpCiAJcmV0dXJuIHYgPT0gQ09NUEFDVF9CT09MRUFOX1RSVUUsIGVycgogfQogCiAvLyBSZWFkIGEgc2luZ2xlIGJ5dGUgb2ZmIHRoZSB3aXJlLiBOb3RoaW5nIGludGVyZXN0aW5nIGhlcmUuCi1mdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBSZWFkQnl0ZSgpICh2YWx1ZSBieXRlLCBlcnIgZXJyb3IpIHsKLQl2YWx1ZSwgZXJyID0gcC50cmFucy5SZWFkQnl0ZSgpCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBSZWFkQnl0ZSgpIChpbnQ4LCBlcnJvcikgeworCXYsIGVyciA6PSBwLnJlYWRCeXRlRGlyZWN0KCkKIAlpZiBlcnIgIT0gbmlsIHsKIAkJcmV0dXJuIDAsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlcnIpCiAJfQotCXJldHVybgorCXJldHVybiBpbnQ4KHYpLCBlcnIKIH0KIAogLy8gUmVhZCBhbiBpMTYgZnJvbSB0aGUgd2lyZSBhcyBhIHppZ3phZyB2YXJpbnQuCkBAIC01ODYsOCArNTk0LDggQEAKIAlyZXR1cm4gYnVmLCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKIH0KIAotZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgRmx1c2goKSAoZXJyIGVycm9yKSB7Ci0JcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihwLnRyYW5zLkZsdXNoKCkpCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBGbHVzaChjdHggY29udGV4dC5Db250ZXh0KSAoZXJyIGVycm9yKSB7CisJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihwLnRyYW5zLkZsdXNoKGN0eCkpCiB9CiAKIGZ1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFNraXAoZmllbGRUeXBlIFRUeXBlKSAoZXJyIGVycm9yKSB7CkBAIC02NzgsMTMgKzY4NiwxMyBAQAogCWJpbmFyeS5MaXR0bGVFbmRpYW4uUHV0VWludDY0KGJ1ZiwgdWludDY0KG4pKQogfQogCi0vLyBXcml0ZXMgYSBieXRlIHdpdGhvdXQgYW55IHBvc3NpYmxpdHkgb2YgYWxsIHRoYXQgZmllbGQgaGVhZGVyIG5vbnNlbnNlLgorLy8gV3JpdGVzIGEgYnl0ZSB3aXRob3V0IGFueSBwb3NzaWJpbGl0eSBvZiBhbGwgdGhhdCBmaWVsZCBoZWFkZXIgbm9uc2Vuc2UuCiAvLyBVc2VkIGludGVybmFsbHkgYnkgb3RoZXIgd3JpdGluZyBtZXRob2RzIHRoYXQga25vdyB0aGV5IG5lZWQgdG8gd3JpdGUgYSBieXRlLgogZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgd3JpdGVCeXRlRGlyZWN0KGIgYnl0ZSkgZXJyb3IgewogCXJldHVybiBwLnRyYW5zLldyaXRlQnl0ZShiKQogfQogCi0vLyBXcml0ZXMgYSBieXRlIHdpdGhvdXQgYW55IHBvc3NpYmxpdHkgb2YgYWxsIHRoYXQgZmllbGQgaGVhZGVyIG5vbnNlbnNlLgorLy8gV3JpdGVzIGEgYnl0ZSB3aXRob3V0IGFueSBwb3NzaWJpbGl0eSBvZiBhbGwgdGhhdCBmaWVsZCBoZWFkZXIgbm9uc2Vuc2UuCiBmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSB3cml0ZUludEFzQnl0ZURpcmVjdChuIGludCkgKGludCwgZXJyb3IpIHsKIAlyZXR1cm4gMSwgcC53cml0ZUJ5dGVEaXJlY3QoYnl0ZShuKSkKIH0KQEAgLTcwOCw3ICs3MTYsNyBAQAogCXNoaWZ0IDo9IHVpbnQoMCkKIAlyZXN1bHQgOj0gaW50NjQoMCkKIAlmb3IgewotCQliLCBlcnIgOj0gcC5SZWFkQnl0ZSgpCisJCWIsIGVyciA6PSBwLnJlYWRCeXRlRGlyZWN0KCkKIAkJaWYgZXJyICE9IG5pbCB7CiAJCQlyZXR1cm4gMCwgZXJyCiAJCX0KQEAgLTcyMSw2ICs3MjksMTEgQEAKIAlyZXR1cm4gcmVzdWx0LCBuaWwKIH0KIAorLy8gUmVhZCBhIGJ5dGUsIHVubGlrZSBSZWFkQnl0ZSB0aGF0IHJlYWRzIFRocmlmdC1ieXRlIHRoYXQgaXMgaTguCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSByZWFkQnl0ZURpcmVjdCgpIChieXRlLCBlcnJvcikgeworCXJldHVybiBwLnRyYW5zLlJlYWRCeXRlKCkKK30KKwogLy8KIC8vIGVuY29kaW5nIGhlbHBlcnMKIC8vCkBAIC03ODgsNyArODAxLDcgQEAKIAljYXNlIENPTVBBQ1RfU1RSVUNUOgogCQlyZXR1cm4gU1RSVUNULCBuaWwKIAl9Ci0JcmV0dXJuIFNUT1AsIFRFeGNlcHRpb24oZm10LkVycm9yZigiZG9uJ3Qga25vdyB3aGF0IHR5cGU6ICVzIiwgdCYweDBmKSkKKwlyZXR1cm4gU1RPUCwgVEV4Y2VwdGlvbihmbXQuRXJyb3JmKCJkb24ndCBrbm93IHdoYXQgdHlwZTogJXYiLCB0JjB4MGYpKQogfQogCiAvLyBHaXZlbiBhIFRUeXBlIHZhbHVlLCBmaW5kIHRoZSBhcHByb3ByaWF0ZSBUQ29tcGFjdFByb3RvY29sLlR5cGVzIGNvbnN0YW50LgpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9jb21wYWN0X3Byb3RvY29sX3Rlc3QuZ28gYi9saWIvZ28vdGhyaWZ0L2NvbXBhY3RfcHJvdG9jb2xfdGVzdC5nbwppbmRleCA3MjgxMmY5Li42NWY3N2YyIDEwMDY0NAotLS0gYS9saWIvZ28vdGhyaWZ0L2NvbXBhY3RfcHJvdG9jb2xfdGVzdC5nbworKysgYi9saWIvZ28vdGhyaWZ0L2NvbXBhY3RfcHJvdG9jb2xfdGVzdC5nbwpAQCAtMjYsMjggKzI2LDM1IEBACiAKIGZ1bmMgVGVzdFJlYWRXcml0ZUNvbXBhY3RQcm90b2NvbCh0ICp0ZXN0aW5nLlQpIHsKIAlSZWFkV3JpdGVQcm90b2NvbFRlc3QodCwgTmV3VENvbXBhY3RQcm90b2NvbEZhY3RvcnkoKSkKLQkgICB0cmFuc3BvcnRzIDo9IFtdVFRyYW5zcG9ydHsKLQkgICAgIE5ld1RNZW1vcnlCdWZmZXIoKSwKLQkgICAgIE5ld1N0cmVhbVRyYW5zcG9ydFJXKGJ5dGVzLk5ld0J1ZmZlcihtYWtlKFtdYnl0ZSwgMCwgMTYzODQpKSksCi0JICAgICBOZXdURnJhbWVkVHJhbnNwb3J0KE5ld1RNZW1vcnlCdWZmZXIoKSksCi0JICAgfQotCSAgIGZvciBfLCB0cmFucyA6PSByYW5nZSB0cmFuc3BvcnRzIHsKLQkgICAgIHAgOj0gTmV3VENvbXBhY3RQcm90b2NvbCh0cmFucyk7Ci0JICAgICBSZWFkV3JpdGVCb29sKHQsIHAsIHRyYW5zKTsKLQkgICAgIHAgPSBOZXdUQ29tcGFjdFByb3RvY29sKHRyYW5zKTsKLQkgICAgIFJlYWRXcml0ZUJ5dGUodCwgcCwgdHJhbnMpOwotCSAgICAgcCA9IE5ld1RDb21wYWN0UHJvdG9jb2wodHJhbnMpOwotCSAgICAgUmVhZFdyaXRlSTE2KHQsIHAsIHRyYW5zKTsKLQkgICAgIHAgPSBOZXdUQ29tcGFjdFByb3RvY29sKHRyYW5zKTsKLQkgICAgIFJlYWRXcml0ZUkzMih0LCBwLCB0cmFucyk7Ci0JICAgICBwID0gTmV3VENvbXBhY3RQcm90b2NvbCh0cmFucyk7Ci0JICAgICBSZWFkV3JpdGVJNjQodCwgcCwgdHJhbnMpOwotCSAgICAgcCA9IE5ld1RDb21wYWN0UHJvdG9jb2wodHJhbnMpOwotCSAgICAgUmVhZFdyaXRlRG91YmxlKHQsIHAsIHRyYW5zKTsKLQkgICAgIHAgPSBOZXdUQ29tcGFjdFByb3RvY29sKHRyYW5zKTsKLQkgICAgIFJlYWRXcml0ZVN0cmluZyh0LCBwLCB0cmFucyk7Ci0JICAgICBwID0gTmV3VENvbXBhY3RQcm90b2NvbCh0cmFucyk7Ci0JICAgICBSZWFkV3JpdGVCaW5hcnkodCwgcCwgdHJhbnMpOwotCSAgICAgdHJhbnMuQ2xvc2UoKTsKLQkgICB9CisKKwl0cmFuc3BvcnRzIDo9IFtdVFRyYW5zcG9ydHsKKwkJTmV3VE1lbW9yeUJ1ZmZlcigpLAorCQlOZXdTdHJlYW1UcmFuc3BvcnRSVyhieXRlcy5OZXdCdWZmZXIobWFrZShbXWJ5dGUsIDAsIDE2Mzg0KSkpLAorCQlOZXdURnJhbWVkVHJhbnNwb3J0KE5ld1RNZW1vcnlCdWZmZXIoKSksCisJfQorCisJemxpYjAsIF8gOj0gTmV3VFpsaWJUcmFuc3BvcnQoTmV3VE1lbW9yeUJ1ZmZlcigpLCAwKQorCXpsaWI2LCBfIDo9IE5ld1RabGliVHJhbnNwb3J0KE5ld1RNZW1vcnlCdWZmZXIoKSwgNikKKwl6bGliOSwgXyA6PSBOZXdUWmxpYlRyYW5zcG9ydChOZXdURnJhbWVkVHJhbnNwb3J0KE5ld1RNZW1vcnlCdWZmZXIoKSksIDkpCisJdHJhbnNwb3J0cyA9IGFwcGVuZCh0cmFuc3BvcnRzLCB6bGliMCwgemxpYjYsIHpsaWI5KQorCisJZm9yIF8sIHRyYW5zIDo9IHJhbmdlIHRyYW5zcG9ydHMgeworCQlwIDo9IE5ld1RDb21wYWN0UHJvdG9jb2wodHJhbnMpCisJCVJlYWRXcml0ZUJvb2wodCwgcCwgdHJhbnMpCisJCXAgPSBOZXdUQ29tcGFjdFByb3RvY29sKHRyYW5zKQorCQlSZWFkV3JpdGVCeXRlKHQsIHAsIHRyYW5zKQorCQlwID0gTmV3VENvbXBhY3RQcm90b2NvbCh0cmFucykKKwkJUmVhZFdyaXRlSTE2KHQsIHAsIHRyYW5zKQorCQlwID0gTmV3VENvbXBhY3RQcm90b2NvbCh0cmFucykKKwkJUmVhZFdyaXRlSTMyKHQsIHAsIHRyYW5zKQorCQlwID0gTmV3VENvbXBhY3RQcm90b2NvbCh0cmFucykKKwkJUmVhZFdyaXRlSTY0KHQsIHAsIHRyYW5zKQorCQlwID0gTmV3VENvbXBhY3RQcm90b2NvbCh0cmFucykKKwkJUmVhZFdyaXRlRG91YmxlKHQsIHAsIHRyYW5zKQorCQlwID0gTmV3VENvbXBhY3RQcm90b2NvbCh0cmFucykKKwkJUmVhZFdyaXRlU3RyaW5nKHQsIHAsIHRyYW5zKQorCQlwID0gTmV3VENvbXBhY3RQcm90b2NvbCh0cmFucykKKwkJUmVhZFdyaXRlQmluYXJ5KHQsIHAsIHRyYW5zKQorCQl0cmFucy5DbG9zZSgpCisJfQogfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9jb250ZXh0LmdvIGIvbGliL2dvL3RocmlmdC9jb250ZXh0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxNWMxYmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L2NvbnRleHQuZ28KQEAgLTAsMCArMSwyNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgImNvbnRleHQiCisKK3ZhciBkZWZhdWx0Q3R4ID0gY29udGV4dC5CYWNrZ3JvdW5kKCkKZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvZGVidWdfcHJvdG9jb2wuZ28gYi9saWIvZ28vdGhyaWZ0L2RlYnVnX3Byb3RvY29sLmdvCmluZGV4IGVlMzQxYjIuLjU3OTQzZTAgMTAwNjQ0Ci0tLSBhL2xpYi9nby90aHJpZnQvZGVidWdfcHJvdG9jb2wuZ28KKysrIGIvbGliL2dvL3RocmlmdC9kZWJ1Z19wcm90b2NvbC5nbwpAQCAtMjAsNiArMjAsNyBAQAogcGFja2FnZSB0aHJpZnQKIAogaW1wb3J0ICgKKwkiY29udGV4dCIKIAkibG9nIgogKQogCkBAIC0xMTcsNyArMTE4LDcgQEAKIAlsb2cuUHJpbnRmKCIlc1dyaXRlQm9vbCh2YWx1ZT0lI3YpID0+ICUjdiIsIHRkcC5Mb2dQcmVmaXgsIHZhbHVlLCBlcnIpCiAJcmV0dXJuIGVycgogfQotZnVuYyAodGRwICpURGVidWdQcm90b2NvbCkgV3JpdGVCeXRlKHZhbHVlIGJ5dGUpIGVycm9yIHsKK2Z1bmMgKHRkcCAqVERlYnVnUHJvdG9jb2wpIFdyaXRlQnl0ZSh2YWx1ZSBpbnQ4KSBlcnJvciB7CiAJZXJyIDo9IHRkcC5EZWxlZ2F0ZS5Xcml0ZUJ5dGUodmFsdWUpCiAJbG9nLlByaW50ZigiJXNXcml0ZUJ5dGUodmFsdWU9JSN2KSA9PiAlI3YiLCB0ZHAuTG9nUHJlZml4LCB2YWx1ZSwgZXJyKQogCXJldHVybiBlcnIKQEAgLTIxOCw3ICsyMTksNyBAQAogCWxvZy5QcmludGYoIiVzUmVhZEJvb2woKSAodmFsdWU9JSN2LCBlcnI9JSN2KSIsIHRkcC5Mb2dQcmVmaXgsIHZhbHVlLCBlcnIpCiAJcmV0dXJuCiB9Ci1mdW5jICh0ZHAgKlREZWJ1Z1Byb3RvY29sKSBSZWFkQnl0ZSgpICh2YWx1ZSBieXRlLCBlcnIgZXJyb3IpIHsKK2Z1bmMgKHRkcCAqVERlYnVnUHJvdG9jb2wpIFJlYWRCeXRlKCkgKHZhbHVlIGludDgsIGVyciBlcnJvcikgewogCXZhbHVlLCBlcnIgPSB0ZHAuRGVsZWdhdGUuUmVhZEJ5dGUoKQogCWxvZy5QcmludGYoIiVzUmVhZEJ5dGUoKSAodmFsdWU9JSN2LCBlcnI9JSN2KSIsIHRkcC5Mb2dQcmVmaXgsIHZhbHVlLCBlcnIpCiAJcmV0dXJuCkBAIC0yNTgsOCArMjU5LDggQEAKIAlsb2cuUHJpbnRmKCIlc1NraXAoZmllbGRUeXBlPSUjdikgKGVycj0lI3YpIiwgdGRwLkxvZ1ByZWZpeCwgZmllbGRUeXBlLCBlcnIpCiAJcmV0dXJuCiB9Ci1mdW5jICh0ZHAgKlREZWJ1Z1Byb3RvY29sKSBGbHVzaCgpIChlcnIgZXJyb3IpIHsKLQllcnIgPSB0ZHAuRGVsZWdhdGUuRmx1c2goKQorZnVuYyAodGRwICpURGVidWdQcm90b2NvbCkgRmx1c2goY3R4IGNvbnRleHQuQ29udGV4dCkgKGVyciBlcnJvcikgeworCWVyciA9IHRkcC5EZWxlZ2F0ZS5GbHVzaChjdHgpCiAJbG9nLlByaW50ZigiJXNGbHVzaCgpIChlcnI9JSN2KSIsIHRkcC5Mb2dQcmVmaXgsIGVycikKIAlyZXR1cm4KIH0KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvZXhjZXB0aW9uLmdvIGIvbGliL2dvL3RocmlmdC9leGNlcHRpb24uZ28KaW5kZXggZTA4ZmZjMC4uZWE4ZDZmNiAxMDA2NDQKLS0tIGEvbGliL2dvL3RocmlmdC9leGNlcHRpb24uZ28KKysrIGIvbGliL2dvL3RocmlmdC9leGNlcHRpb24uZ28KQEAgLTE5LDcgKzE5LDI2IEBACiAKIHBhY2thZ2UgdGhyaWZ0CiAKK2ltcG9ydCAoCisJImVycm9ycyIKKykKKwogLy8gR2VuZXJpYyBUaHJpZnQgZXhjZXB0aW9uCiB0eXBlIFRFeGNlcHRpb24gaW50ZXJmYWNlIHsKIAllcnJvcgogfQorCisvLyBQcmVwZW5kcyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHRvIGFuIGVycm9yIHdpdGhvdXQgbG9zaW5nIHRoZSBUaHJpZnQgZXhjZXB0aW9uIGludGVyZmFjZQorZnVuYyBQcmVwZW5kRXJyb3IocHJlcGVuZCBzdHJpbmcsIGVyciBlcnJvcikgZXJyb3IgeworCWlmIHQsIG9rIDo9IGVyci4oVFRyYW5zcG9ydEV4Y2VwdGlvbik7IG9rIHsKKwkJcmV0dXJuIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24odC5UeXBlSWQoKSwgcHJlcGVuZCt0LkVycm9yKCkpCisJfQorCWlmIHQsIG9rIDo9IGVyci4oVFByb3RvY29sRXhjZXB0aW9uKTsgb2sgeworCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUodC5UeXBlSWQoKSwgZXJyb3JzLk5ldyhwcmVwZW5kK2Vyci5FcnJvcigpKSkKKwl9CisJaWYgdCwgb2sgOj0gZXJyLihUQXBwbGljYXRpb25FeGNlcHRpb24pOyBvayB7CisJCXJldHVybiBOZXdUQXBwbGljYXRpb25FeGNlcHRpb24odC5UeXBlSWQoKSwgcHJlcGVuZCt0LkVycm9yKCkpCisJfQorCisJcmV0dXJuIGVycm9ycy5OZXcocHJlcGVuZCArIGVyci5FcnJvcigpKQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9leGNlcHRpb25fdGVzdC5nbyBiL2xpYi9nby90aHJpZnQvZXhjZXB0aW9uX3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFmNWUyYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvZXhjZXB0aW9uX3Rlc3QuZ28KQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgKAorCSJlcnJvcnMiCisJInRlc3RpbmciCispCisKK2Z1bmMgVGVzdFByZXBlbmRFcnJvcih0ICp0ZXN0aW5nLlQpIHsKKwllcnIgOj0gTmV3VEFwcGxpY2F0aW9uRXhjZXB0aW9uKElOVEVSTkFMX0VSUk9SLCAib3JpZ2luYWwgZXJyb3IiKQorCWVycjIsIG9rIDo9IFByZXBlbmRFcnJvcigiUHJlcGVuZDogIiwgZXJyKS4oVEFwcGxpY2F0aW9uRXhjZXB0aW9uKQorCWlmICFvayB7CisJCXQuRmF0YWwoIkNvdWxkbid0IGNhc3QgZXJyb3IgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIikKKwl9CisJaWYgZXJyMi5FcnJvcigpICE9ICJQcmVwZW5kOiBvcmlnaW5hbCBlcnJvciIgeworCQl0LkZhdGFsKCJVbmV4cGVjdGVkIGVycm9yIHN0cmluZyIpCisJfQorCWlmIGVycjIuVHlwZUlkKCkgIT0gSU5URVJOQUxfRVJST1IgeworCQl0LkZhdGFsKCJVbmV4cGVjdGVkIHR5cGUgZXJyb3IiKQorCX0KKworCWVycjMgOj0gTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoSU5WQUxJRF9EQVRBLCBlcnJvcnMuTmV3KCJvcmlnaW5hbCBlcnJvciIpKQorCWVycjQsIG9rIDo9IFByZXBlbmRFcnJvcigiUHJlcGVuZDogIiwgZXJyMykuKFRQcm90b2NvbEV4Y2VwdGlvbikKKwlpZiAhb2sgeworCQl0LkZhdGFsKCJDb3VsZG4ndCBjYXN0IGVycm9yIFRQcm90b2NvbEV4Y2VwdGlvbiIpCisJfQorCWlmIGVycjQuRXJyb3IoKSAhPSAiUHJlcGVuZDogb3JpZ2luYWwgZXJyb3IiIHsKKwkJdC5GYXRhbCgiVW5leHBlY3RlZCBlcnJvciBzdHJpbmciKQorCX0KKwlpZiBlcnI0LlR5cGVJZCgpICE9IElOVkFMSURfREFUQSB7CisJCXQuRmF0YWwoIlVuZXhwZWN0ZWQgdHlwZSBlcnJvciIpCisJfQorCisJZXJyNSA6PSBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKFRJTUVEX09VVCwgIm9yaWdpbmFsIGVycm9yIikKKwllcnI2LCBvayA6PSBQcmVwZW5kRXJyb3IoIlByZXBlbmQ6ICIsIGVycjUpLihUVHJhbnNwb3J0RXhjZXB0aW9uKQorCWlmICFvayB7CisJCXQuRmF0YWwoIkNvdWxkbid0IGNhc3QgZXJyb3IgVFRyYW5zcG9ydEV4Y2VwdGlvbiIpCisJfQorCWlmIGVycjYuRXJyb3IoKSAhPSAiUHJlcGVuZDogb3JpZ2luYWwgZXJyb3IiIHsKKwkJdC5GYXRhbCgiVW5leHBlY3RlZCBlcnJvciBzdHJpbmciKQorCX0KKwlpZiBlcnI2LlR5cGVJZCgpICE9IFRJTUVEX09VVCB7CisJCXQuRmF0YWwoIlVuZXhwZWN0ZWQgdHlwZSBlcnJvciIpCisJfQorCisJZXJyNyA6PSBlcnJvcnMuTmV3KCJvcmlnaW5hbCBlcnJvciIpCisJZXJyOCA6PSBQcmVwZW5kRXJyb3IoIlByZXBlbmQ6ICIsIGVycjcpCisJaWYgZXJyOC5FcnJvcigpICE9ICJQcmVwZW5kOiBvcmlnaW5hbCBlcnJvciIgeworCQl0LkZhdGFsKCJVbmV4cGVjdGVkIGVycm9yIHN0cmluZyIpCisJfQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9mcmFtZWRfdHJhbnNwb3J0LmdvIGIvbGliL2dvL3RocmlmdC9mcmFtZWRfdHJhbnNwb3J0LmdvCmluZGV4IGJmZWNiZTguLjgxZmE2NWEgMTAwNjQ0Ci0tLSBhL2xpYi9nby90aHJpZnQvZnJhbWVkX3RyYW5zcG9ydC5nbworKysgYi9saWIvZ28vdGhyaWZ0L2ZyYW1lZF90cmFuc3BvcnQuZ28KQEAgLTIyLDYgKzIyLDcgQEAKIGltcG9ydCAoCiAJImJ1ZmlvIgogCSJieXRlcyIKKwkiY29udGV4dCIKIAkiZW5jb2RpbmcvYmluYXJ5IgogCSJmbXQiCiAJImlvIgpAQCAtMzMsMjkgKzM0LDM3IEBACiAJdHJhbnNwb3J0IFRUcmFuc3BvcnQKIAlidWYgICAgICAgYnl0ZXMuQnVmZmVyCiAJcmVhZGVyICAgICpidWZpby5SZWFkZXIKLQlmcmFtZVNpemUgaW50IC8vQ3VycmVudCByZW1haW5pbmcgc2l6ZSBvZiB0aGUgZnJhbWUuIGlmID09MCByZWFkIG5leHQgZnJhbWUgaGVhZGVyCisJZnJhbWVTaXplIHVpbnQzMiAvL0N1cnJlbnQgcmVtYWluaW5nIHNpemUgb2YgdGhlIGZyYW1lLiBpZiA9PTAgcmVhZCBuZXh0IGZyYW1lIGhlYWRlcgogCWJ1ZmZlciAgICBbNF1ieXRlCi0JbWF4TGVuZ3RoIGludAorCW1heExlbmd0aCB1aW50MzIKIH0KIAogdHlwZSB0RnJhbWVkVHJhbnNwb3J0RmFjdG9yeSBzdHJ1Y3QgewogCWZhY3RvcnkgICBUVHJhbnNwb3J0RmFjdG9yeQotCW1heExlbmd0aCBpbnQKKwltYXhMZW5ndGggdWludDMyCiB9CiAKIGZ1bmMgTmV3VEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkoZmFjdG9yeSBUVHJhbnNwb3J0RmFjdG9yeSkgVFRyYW5zcG9ydEZhY3RvcnkgewogCXJldHVybiAmdEZyYW1lZFRyYW5zcG9ydEZhY3Rvcnl7ZmFjdG9yeTogZmFjdG9yeSwgbWF4TGVuZ3RoOiBERUZBVUxUX01BWF9MRU5HVEh9CiB9CiAKLWZ1bmMgKHAgKnRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5KSBHZXRUcmFuc3BvcnQoYmFzZSBUVHJhbnNwb3J0KSBUVHJhbnNwb3J0IHsKLQlyZXR1cm4gTmV3VEZyYW1lZFRyYW5zcG9ydE1heExlbmd0aChwLmZhY3RvcnkuR2V0VHJhbnNwb3J0KGJhc2UpLCBwLm1heExlbmd0aCkKK2Z1bmMgTmV3VEZyYW1lZFRyYW5zcG9ydEZhY3RvcnlNYXhMZW5ndGgoZmFjdG9yeSBUVHJhbnNwb3J0RmFjdG9yeSwgbWF4TGVuZ3RoIHVpbnQzMikgVFRyYW5zcG9ydEZhY3RvcnkgeworCXJldHVybiAmdEZyYW1lZFRyYW5zcG9ydEZhY3Rvcnl7ZmFjdG9yeTogZmFjdG9yeSwgbWF4TGVuZ3RoOiBtYXhMZW5ndGh9Cit9CisKK2Z1bmMgKHAgKnRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5KSBHZXRUcmFuc3BvcnQoYmFzZSBUVHJhbnNwb3J0KSAoVFRyYW5zcG9ydCwgZXJyb3IpIHsKKwl0dCwgZXJyIDo9IHAuZmFjdG9yeS5HZXRUcmFuc3BvcnQoYmFzZSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIG5pbCwgZXJyCisJfQorCXJldHVybiBOZXdURnJhbWVkVHJhbnNwb3J0TWF4TGVuZ3RoKHR0LCBwLm1heExlbmd0aCksIG5pbAogfQogCiBmdW5jIE5ld1RGcmFtZWRUcmFuc3BvcnQodHJhbnNwb3J0IFRUcmFuc3BvcnQpICpURnJhbWVkVHJhbnNwb3J0IHsKIAlyZXR1cm4gJlRGcmFtZWRUcmFuc3BvcnR7dHJhbnNwb3J0OiB0cmFuc3BvcnQsIHJlYWRlcjogYnVmaW8uTmV3UmVhZGVyKHRyYW5zcG9ydCksIG1heExlbmd0aDogREVGQVVMVF9NQVhfTEVOR1RIfQogfQogCi1mdW5jIE5ld1RGcmFtZWRUcmFuc3BvcnRNYXhMZW5ndGgodHJhbnNwb3J0IFRUcmFuc3BvcnQsIG1heExlbmd0aCBpbnQpICpURnJhbWVkVHJhbnNwb3J0IHsKK2Z1bmMgTmV3VEZyYW1lZFRyYW5zcG9ydE1heExlbmd0aCh0cmFuc3BvcnQgVFRyYW5zcG9ydCwgbWF4TGVuZ3RoIHVpbnQzMikgKlRGcmFtZWRUcmFuc3BvcnQgewogCXJldHVybiAmVEZyYW1lZFRyYW5zcG9ydHt0cmFuc3BvcnQ6IHRyYW5zcG9ydCwgcmVhZGVyOiBidWZpby5OZXdSZWFkZXIodHJhbnNwb3J0KSwgbWF4TGVuZ3RoOiBtYXhMZW5ndGh9CiB9CiAKQEAgLTc4LDExICs4NywxOCBAQAogCQkJcmV0dXJuCiAJCX0KIAl9Ci0JaWYgcC5mcmFtZVNpemUgPCBsZW4oYnVmKSB7Ci0JCXJldHVybiAwLCBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uRnJvbUVycm9yKGZtdC5FcnJvcmYoIk5vdCBlbm91Z2h0IGZyYW1lIHNpemUgJWQgdG8gcmVhZCAlZCBieXRlcyIsIHAuZnJhbWVTaXplLCBsZW4oYnVmKSkpCisJaWYgcC5mcmFtZVNpemUgPCB1aW50MzIobGVuKGJ1ZikpIHsKKwkJZnJhbWVTaXplIDo9IHAuZnJhbWVTaXplCisJCXRtcCA6PSBtYWtlKFtdYnl0ZSwgcC5mcmFtZVNpemUpCisJCWwsIGVyciA9IHAuUmVhZCh0bXApCisJCWNvcHkoYnVmLCB0bXApCisJCWlmIGVyciA9PSBuaWwgeworCQkJZXJyID0gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbkZyb21FcnJvcihmbXQuRXJyb3JmKCJOb3QgZW5vdWdoIGZyYW1lIHNpemUgJWQgdG8gcmVhZCAlZCBieXRlcyIsIGZyYW1lU2l6ZSwgbGVuKGJ1ZikpKQorCQkJcmV0dXJuCisJCX0KIAl9CiAJZ290LCBlcnIgOj0gcC5yZWFkZXIuUmVhZChidWYpCi0JcC5mcmFtZVNpemUgPSBwLmZyYW1lU2l6ZSAtIGdvdAorCXAuZnJhbWVTaXplID0gcC5mcmFtZVNpemUgLSB1aW50MzIoZ290KQogCS8vc2FuaXR5IGNoZWNrCiAJaWYgcC5mcmFtZVNpemUgPCAwIHsKIAkJcmV0dXJuIDAsIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oVU5LTk9XTl9UUkFOU1BPUlRfRVhDRVBUSU9OLCAiTmVnYXRpdmUgZnJhbWUgc2l6ZSIpCkBAIC05OCw3ICsxMTQsNyBAQAogCQl9CiAJfQogCWlmIHAuZnJhbWVTaXplIDwgMSB7Ci0JCXJldHVybiAwLCBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uRnJvbUVycm9yKGZtdC5FcnJvcmYoIk5vdCBlbm91Z2h0IGZyYW1lIHNpemUgJWQgdG8gcmVhZCAlZCBieXRlcyIsIHAuZnJhbWVTaXplLCAxKSkKKwkJcmV0dXJuIDAsIE5ld1RUcmFuc3BvcnRFeGNlcHRpb25Gcm9tRXJyb3IoZm10LkVycm9yZigiTm90IGVub3VnaCBmcmFtZSBzaXplICVkIHRvIHJlYWQgJWQgYnl0ZXMiLCBwLmZyYW1lU2l6ZSwgMSkpCiAJfQogCWMsIGVyciA9IHAucmVhZGVyLlJlYWRCeXRlKCkKIAlpZiBlcnIgPT0gbmlsIHsKQEAgLTEyMCwzMiArMTM2LDM4IEBACiAJcmV0dXJuIHAuYnVmLldyaXRlU3RyaW5nKHMpCiB9CiAKLWZ1bmMgKHAgKlRGcmFtZWRUcmFuc3BvcnQpIEZsdXNoKCkgZXJyb3IgeworZnVuYyAocCAqVEZyYW1lZFRyYW5zcG9ydCkgRmx1c2goY3R4IGNvbnRleHQuQ29udGV4dCkgZXJyb3IgewogCXNpemUgOj0gcC5idWYuTGVuKCkKIAlidWYgOj0gcC5idWZmZXJbOjRdCiAJYmluYXJ5LkJpZ0VuZGlhbi5QdXRVaW50MzIoYnVmLCB1aW50MzIoc2l6ZSkpCiAJXywgZXJyIDo9IHAudHJhbnNwb3J0LldyaXRlKGJ1ZikKIAlpZiBlcnIgIT0gbmlsIHsKKwkJcC5idWYuVHJ1bmNhdGUoMCkKIAkJcmV0dXJuIE5ld1RUcmFuc3BvcnRFeGNlcHRpb25Gcm9tRXJyb3IoZXJyKQogCX0KIAlpZiBzaXplID4gMCB7CiAJCWlmIG4sIGVyciA6PSBwLmJ1Zi5Xcml0ZVRvKHAudHJhbnNwb3J0KTsgZXJyICE9IG5pbCB7CiAJCQlwcmludCgiRXJyb3Igd2hpbGUgZmx1c2hpbmcgd3JpdGUgYnVmZmVyIG9mIHNpemUgIiwgc2l6ZSwgIiB0byB0cmFuc3BvcnQsIG9ubHkgd3JvdGUgIiwgbiwgIiBieXRlczogIiwgZXJyLkVycm9yKCksICJcbiIpCisJCQlwLmJ1Zi5UcnVuY2F0ZSgwKQogCQkJcmV0dXJuIE5ld1RUcmFuc3BvcnRFeGNlcHRpb25Gcm9tRXJyb3IoZXJyKQogCQl9CiAJfQotCWVyciA9IHAudHJhbnNwb3J0LkZsdXNoKCkKKwllcnIgPSBwLnRyYW5zcG9ydC5GbHVzaChjdHgpCiAJcmV0dXJuIE5ld1RUcmFuc3BvcnRFeGNlcHRpb25Gcm9tRXJyb3IoZXJyKQogfQogCi1mdW5jIChwICpURnJhbWVkVHJhbnNwb3J0KSByZWFkRnJhbWVIZWFkZXIoKSAoaW50LCBlcnJvcikgeworZnVuYyAocCAqVEZyYW1lZFRyYW5zcG9ydCkgcmVhZEZyYW1lSGVhZGVyKCkgKHVpbnQzMiwgZXJyb3IpIHsKIAlidWYgOj0gcC5idWZmZXJbOjRdCiAJaWYgXywgZXJyIDo9IGlvLlJlYWRGdWxsKHAucmVhZGVyLCBidWYpOyBlcnIgIT0gbmlsIHsKIAkJcmV0dXJuIDAsIGVycgogCX0KLQlzaXplIDo9IGludChiaW5hcnkuQmlnRW5kaWFuLlVpbnQzMihidWYpKQorCXNpemUgOj0gYmluYXJ5LkJpZ0VuZGlhbi5VaW50MzIoYnVmKQogCWlmIHNpemUgPCAwIHx8IHNpemUgPiBwLm1heExlbmd0aCB7CiAJCXJldHVybiAwLCBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKFVOS05PV05fVFJBTlNQT1JUX0VYQ0VQVElPTiwgZm10LlNwcmludGYoIkluY29ycmVjdCBmcmFtZSBzaXplICglZCkiLCBzaXplKSkKIAl9CiAJcmV0dXJuIHNpemUsIG5pbAogfQorCitmdW5jIChwICpURnJhbWVkVHJhbnNwb3J0KSBSZW1haW5pbmdCeXRlcygpIChudW1fYnl0ZXMgdWludDY0KSB7CisJcmV0dXJuIHVpbnQ2NChwLmZyYW1lU2l6ZSkKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvaHR0cF9jbGllbnQuZ28gYi9saWIvZ28vdGhyaWZ0L2h0dHBfY2xpZW50LmdvCmluZGV4IGRmNjY4OTcuLjVjODJiZjUgMTAwNjQ0Ci0tLSBhL2xpYi9nby90aHJpZnQvaHR0cF9jbGllbnQuZ28KKysrIGIvbGliL2dvL3RocmlmdC9odHRwX2NsaWVudC5nbwpAQCAtMjEsMTMgKzIxLDIxIEBACiAKIGltcG9ydCAoCiAJImJ5dGVzIgorCSJjb250ZXh0IgogCSJpbyIKKwkiaW8vaW91dGlsIgogCSJuZXQvaHR0cCIKIAkibmV0L3VybCIKIAkic3RyY29udiIKICkKIAorLy8gRGVmYXVsdCB0byB1c2luZyB0aGUgc2hhcmVkIGh0dHAgY2xpZW50LiBMaWJyYXJ5IHVzZXJzIGFyZQorLy8gZnJlZSB0byBjaGFuZ2UgdGhpcyBnbG9iYWwgY2xpZW50IG9yIHNwZWNpZnkgb25lIHRocm91Z2gKKy8vIFRIdHRwQ2xpZW50T3B0aW9ucy4KK3ZhciBEZWZhdWx0SHR0cENsaWVudCAqaHR0cC5DbGllbnQgPSBodHRwLkRlZmF1bHRDbGllbnQKKwogdHlwZSBUSHR0cENsaWVudCBzdHJ1Y3QgeworCWNsaWVudCAgICAgICAgICAgICAqaHR0cC5DbGllbnQKIAlyZXNwb25zZSAgICAgICAgICAgKmh0dHAuUmVzcG9uc2UKIAl1cmwgICAgICAgICAgICAgICAgKnVybC5VUkwKIAlyZXF1ZXN0QnVmZmVyICAgICAgKmJ5dGVzLkJ1ZmZlcgpAQCAtMzcsNTcgKzQ1LDQ5IEBACiB9CiAKIHR5cGUgVEh0dHBDbGllbnRUcmFuc3BvcnRGYWN0b3J5IHN0cnVjdCB7Ci0JdXJsICAgIHN0cmluZwotCWlzUG9zdCBib29sCisJb3B0aW9ucyBUSHR0cENsaWVudE9wdGlvbnMKKwl1cmwgICAgIHN0cmluZwogfQogCi1mdW5jIChwICpUSHR0cENsaWVudFRyYW5zcG9ydEZhY3RvcnkpIEdldFRyYW5zcG9ydCh0cmFucyBUVHJhbnNwb3J0KSBUVHJhbnNwb3J0IHsKK2Z1bmMgKHAgKlRIdHRwQ2xpZW50VHJhbnNwb3J0RmFjdG9yeSkgR2V0VHJhbnNwb3J0KHRyYW5zIFRUcmFuc3BvcnQpIChUVHJhbnNwb3J0LCBlcnJvcikgewogCWlmIHRyYW5zICE9IG5pbCB7CiAJCXQsIG9rIDo9IHRyYW5zLigqVEh0dHBDbGllbnQpCiAJCWlmIG9rICYmIHQudXJsICE9IG5pbCB7Ci0JCQlpZiB0LnJlcXVlc3RCdWZmZXIgIT0gbmlsIHsKLQkJCQl0MiwgXyA6PSBOZXdUSHR0cFBvc3RDbGllbnQodC51cmwuU3RyaW5nKCkpCi0JCQkJcmV0dXJuIHQyCi0JCQl9Ci0JCQl0MiwgXyA6PSBOZXdUSHR0cENsaWVudCh0LnVybC5TdHJpbmcoKSkKLQkJCXJldHVybiB0MgorCQkJcmV0dXJuIE5ld1RIdHRwQ2xpZW50V2l0aE9wdGlvbnModC51cmwuU3RyaW5nKCksIHAub3B0aW9ucykKIAkJfQogCX0KLQlpZiBwLmlzUG9zdCB7Ci0JCXMsIF8gOj0gTmV3VEh0dHBQb3N0Q2xpZW50KHAudXJsKQotCQlyZXR1cm4gcwotCX0KLQlzLCBfIDo9IE5ld1RIdHRwQ2xpZW50KHAudXJsKQotCXJldHVybiBzCisJcmV0dXJuIE5ld1RIdHRwQ2xpZW50V2l0aE9wdGlvbnMocC51cmwsIHAub3B0aW9ucykKK30KKwordHlwZSBUSHR0cENsaWVudE9wdGlvbnMgc3RydWN0IHsKKwkvLyBJZiBuaWwsIERlZmF1bHRIdHRwQ2xpZW50IGlzIHVzZWQKKwlDbGllbnQgKmh0dHAuQ2xpZW50CiB9CiAKIGZ1bmMgTmV3VEh0dHBDbGllbnRUcmFuc3BvcnRGYWN0b3J5KHVybCBzdHJpbmcpICpUSHR0cENsaWVudFRyYW5zcG9ydEZhY3RvcnkgewotCXJldHVybiAmVEh0dHBDbGllbnRUcmFuc3BvcnRGYWN0b3J5e3VybDogdXJsLCBpc1Bvc3Q6IGZhbHNlfQorCXJldHVybiBOZXdUSHR0cENsaWVudFRyYW5zcG9ydEZhY3RvcnlXaXRoT3B0aW9ucyh1cmwsIFRIdHRwQ2xpZW50T3B0aW9uc3t9KQogfQogCi1mdW5jIE5ld1RIdHRwUG9zdENsaWVudFRyYW5zcG9ydEZhY3RvcnkodXJsIHN0cmluZykgKlRIdHRwQ2xpZW50VHJhbnNwb3J0RmFjdG9yeSB7Ci0JcmV0dXJuICZUSHR0cENsaWVudFRyYW5zcG9ydEZhY3Rvcnl7dXJsOiB1cmwsIGlzUG9zdDogdHJ1ZX0KK2Z1bmMgTmV3VEh0dHBDbGllbnRUcmFuc3BvcnRGYWN0b3J5V2l0aE9wdGlvbnModXJsIHN0cmluZywgb3B0aW9ucyBUSHR0cENsaWVudE9wdGlvbnMpICpUSHR0cENsaWVudFRyYW5zcG9ydEZhY3RvcnkgeworCXJldHVybiAmVEh0dHBDbGllbnRUcmFuc3BvcnRGYWN0b3J5e3VybDogdXJsLCBvcHRpb25zOiBvcHRpb25zfQogfQogCi1mdW5jIE5ld1RIdHRwQ2xpZW50KHVybHN0ciBzdHJpbmcpIChUVHJhbnNwb3J0LCBlcnJvcikgewotCXBhcnNlZFVSTCwgZXJyIDo9IHVybC5QYXJzZSh1cmxzdHIpCi0JaWYgZXJyICE9IG5pbCB7Ci0JCXJldHVybiBuaWwsIGVycgotCX0KLQlyZXNwb25zZSwgZXJyIDo9IGh0dHAuR2V0KHVybHN0cikKLQlpZiBlcnIgIT0gbmlsIHsKLQkJcmV0dXJuIG5pbCwgZXJyCi0JfQotCXJldHVybiAmVEh0dHBDbGllbnR7cmVzcG9uc2U6IHJlc3BvbnNlLCB1cmw6IHBhcnNlZFVSTH0sIG5pbAotfQotCi1mdW5jIE5ld1RIdHRwUG9zdENsaWVudCh1cmxzdHIgc3RyaW5nKSAoVFRyYW5zcG9ydCwgZXJyb3IpIHsKK2Z1bmMgTmV3VEh0dHBDbGllbnRXaXRoT3B0aW9ucyh1cmxzdHIgc3RyaW5nLCBvcHRpb25zIFRIdHRwQ2xpZW50T3B0aW9ucykgKFRUcmFuc3BvcnQsIGVycm9yKSB7CiAJcGFyc2VkVVJMLCBlcnIgOj0gdXJsLlBhcnNlKHVybHN0cikKIAlpZiBlcnIgIT0gbmlsIHsKIAkJcmV0dXJuIG5pbCwgZXJyCiAJfQogCWJ1ZiA6PSBtYWtlKFtdYnl0ZSwgMCwgMTAyNCkKLQlyZXR1cm4gJlRIdHRwQ2xpZW50e3VybDogcGFyc2VkVVJMLCByZXF1ZXN0QnVmZmVyOiBieXRlcy5OZXdCdWZmZXIoYnVmKSwgaGVhZGVyOiBodHRwLkhlYWRlcnt9fSwgbmlsCisJY2xpZW50IDo9IG9wdGlvbnMuQ2xpZW50CisJaWYgY2xpZW50ID09IG5pbCB7CisJCWNsaWVudCA9IERlZmF1bHRIdHRwQ2xpZW50CisJfQorCWh0dHBIZWFkZXIgOj0gbWFwW3N0cmluZ11bXXN0cmluZ3siQ29udGVudC1UeXBlIjogeyJhcHBsaWNhdGlvbi94LXRocmlmdCJ9fQorCXJldHVybiAmVEh0dHBDbGllbnR7Y2xpZW50OiBjbGllbnQsIHVybDogcGFyc2VkVVJMLCByZXF1ZXN0QnVmZmVyOiBieXRlcy5OZXdCdWZmZXIoYnVmKSwgaGVhZGVyOiBodHRwSGVhZGVyfSwgbmlsCit9CisKK2Z1bmMgTmV3VEh0dHBDbGllbnQodXJsc3RyIHN0cmluZykgKFRUcmFuc3BvcnQsIGVycm9yKSB7CisJcmV0dXJuIE5ld1RIdHRwQ2xpZW50V2l0aE9wdGlvbnModXJsc3RyLCBUSHR0cENsaWVudE9wdGlvbnN7fSkKIH0KIAogLy8gU2V0IHRoZSBIVFRQIEhlYWRlciBmb3IgdGhpcyBzcGVjaWZpYyBUaHJpZnQgVHJhbnNwb3J0CkBAIC0xMjksMjEgKzEyOSwyOSBAQAogCXJldHVybiBwLnJlc3BvbnNlICE9IG5pbCB8fCBwLnJlcXVlc3RCdWZmZXIgIT0gbmlsCiB9CiAKLWZ1bmMgKHAgKlRIdHRwQ2xpZW50KSBQZWVrKCkgYm9vbCB7Ci0JcmV0dXJuIHAuSXNPcGVuKCkKK2Z1bmMgKHAgKlRIdHRwQ2xpZW50KSBjbG9zZVJlc3BvbnNlKCkgZXJyb3IgeworCXZhciBlcnIgZXJyb3IKKwlpZiBwLnJlc3BvbnNlICE9IG5pbCAmJiBwLnJlc3BvbnNlLkJvZHkgIT0gbmlsIHsKKwkJLy8gVGhlIGRvY3Mgc3BlY2lmeSB0aGF0IGlmIGtlZXBhbGl2ZSBpcyBlbmFibGVkIGFuZCB0aGUgcmVzcG9uc2UgYm9keSBpcyBub3QKKwkJLy8gcmVhZCB0byBjb21wbGV0aW9uIHRoZSBjb25uZWN0aW9uIHdpbGwgbmV2ZXIgYmUgcmV0dXJuZWQgdG8gdGhlIHBvb2wgYW5kCisJCS8vIHJldXNlZC4gRXJyb3JzIGFyZSBiZWluZyBpZ25vcmVkIGhlcmUgYmVjYXVzZSBpZiB0aGUgY29ubmVjdGlvbiBpcyBpbnZhbGlkCisJCS8vIGFuZCB0aGlzIGZhaWxzIGZvciBzb21lIHJlYXNvbiwgdGhlIENsb3NlKCkgbWV0aG9kIHdpbGwgZG8gYW55IHJlbWFpbmluZworCQkvLyBjbGVhbnVwLgorCQlpby5Db3B5KGlvdXRpbC5EaXNjYXJkLCBwLnJlc3BvbnNlLkJvZHkpCisKKwkJZXJyID0gcC5yZXNwb25zZS5Cb2R5LkNsb3NlKCkKKwl9CisKKwlwLnJlc3BvbnNlID0gbmlsCisJcmV0dXJuIGVycgogfQogCiBmdW5jIChwICpUSHR0cENsaWVudCkgQ2xvc2UoKSBlcnJvciB7Ci0JaWYgcC5yZXNwb25zZSAhPSBuaWwgJiYgcC5yZXNwb25zZS5Cb2R5ICE9IG5pbCB7Ci0JCWVyciA6PSBwLnJlc3BvbnNlLkJvZHkuQ2xvc2UoKQotCQlwLnJlc3BvbnNlID0gbmlsCi0JCXJldHVybiBlcnIKLQl9CiAJaWYgcC5yZXF1ZXN0QnVmZmVyICE9IG5pbCB7CiAJCXAucmVxdWVzdEJ1ZmZlci5SZXNldCgpCiAJCXAucmVxdWVzdEJ1ZmZlciA9IG5pbAogCX0KLQlyZXR1cm4gbmlsCisJcmV0dXJuIHAuY2xvc2VSZXNwb25zZSgpCiB9CiAKIGZ1bmMgKHAgKlRIdHRwQ2xpZW50KSBSZWFkKGJ1ZiBbXWJ5dGUpIChpbnQsIGVycm9yKSB7CkBAIC0xNzQsMjIgKzE4Miw2MSBAQAogCXJldHVybiBwLnJlcXVlc3RCdWZmZXIuV3JpdGVTdHJpbmcocykKIH0KIAotZnVuYyAocCAqVEh0dHBDbGllbnQpIEZsdXNoKCkgZXJyb3IgewotCWNsaWVudCA6PSAmaHR0cC5DbGllbnR7fQorZnVuYyAocCAqVEh0dHBDbGllbnQpIEZsdXNoKGN0eCBjb250ZXh0LkNvbnRleHQpIGVycm9yIHsKKwkvLyBDbG9zZSBhbnkgcHJldmlvdXMgcmVzcG9uc2UgYm9keSB0byBhdm9pZCBsZWFraW5nIGNvbm5lY3Rpb25zLgorCXAuY2xvc2VSZXNwb25zZSgpCisKIAlyZXEsIGVyciA6PSBodHRwLk5ld1JlcXVlc3QoIlBPU1QiLCBwLnVybC5TdHJpbmcoKSwgcC5yZXF1ZXN0QnVmZmVyKQogCWlmIGVyciAhPSBuaWwgewogCQlyZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbkZyb21FcnJvcihlcnIpCiAJfQotCXAuaGVhZGVyLkFkZCgiQ29udGVudC1UeXBlIiwgImFwcGxpY2F0aW9uL3gtdGhyaWZ0IikKIAlyZXEuSGVhZGVyID0gcC5oZWFkZXIKLQlyZXNwb25zZSwgZXJyIDo9IGNsaWVudC5EbyhyZXEpCisJaWYgY3R4ICE9IG5pbCB7CisJCXJlcSA9IHJlcS5XaXRoQ29udGV4dChjdHgpCisJfQorCXJlc3BvbnNlLCBlcnIgOj0gcC5jbGllbnQuRG8ocmVxKQogCWlmIGVyciAhPSBuaWwgewogCQlyZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbkZyb21FcnJvcihlcnIpCiAJfQogCWlmIHJlc3BvbnNlLlN0YXR1c0NvZGUgIT0gaHR0cC5TdGF0dXNPSyB7CisJCS8vIENsb3NlIHRoZSByZXNwb25zZSB0byBhdm9pZCBsZWFraW5nIGZpbGUgZGVzY3JpcHRvcnMuIGNsb3NlUmVzcG9uc2UgZG9lcworCQkvLyBtb3JlIHRoYW4ganVzdCBjYWxsIENsb3NlKCksIHNvIHRlbXBvcmFyaWx5IGFzc2lnbiBpdCBhbmQgcmV1c2UgdGhlIGxvZ2ljLgorCQlwLnJlc3BvbnNlID0gcmVzcG9uc2UKKwkJcC5jbG9zZVJlc3BvbnNlKCkKKwogCQkvLyBUT0RPKHBvbWFjaykgbG9nIGJhZCByZXNwb25zZQogCQlyZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihVTktOT1dOX1RSQU5TUE9SVF9FWENFUFRJT04sICJIVFRQIFJlc3BvbnNlIGNvZGU6ICIrc3RyY29udi5JdG9hKHJlc3BvbnNlLlN0YXR1c0NvZGUpKQogCX0KIAlwLnJlc3BvbnNlID0gcmVzcG9uc2UKIAlyZXR1cm4gbmlsCiB9CisKK2Z1bmMgKHAgKlRIdHRwQ2xpZW50KSBSZW1haW5pbmdCeXRlcygpIChudW1fYnl0ZXMgdWludDY0KSB7CisJbGVuIDo9IHAucmVzcG9uc2UuQ29udGVudExlbmd0aAorCWlmIGxlbiA+PSAwIHsKKwkJcmV0dXJuIHVpbnQ2NChsZW4pCisJfQorCisJY29uc3QgbWF4U2l6ZSA9IF51aW50NjQoMCkKKwlyZXR1cm4gbWF4U2l6ZSAvLyB0aGUgdGhydXRoIGlzLCB3ZSBqdXN0IGRvbid0IGtub3cgdW5sZXNzIGZyYW1lZCBpcyB1c2VkCit9CisKKy8vIERlcHJlY2F0ZWQ6IFVzZSBOZXdUSHR0cENsaWVudFRyYW5zcG9ydEZhY3RvcnkgaW5zdGVhZC4KK2Z1bmMgTmV3VEh0dHBQb3N0Q2xpZW50VHJhbnNwb3J0RmFjdG9yeSh1cmwgc3RyaW5nKSAqVEh0dHBDbGllbnRUcmFuc3BvcnRGYWN0b3J5IHsKKwlyZXR1cm4gTmV3VEh0dHBDbGllbnRUcmFuc3BvcnRGYWN0b3J5V2l0aE9wdGlvbnModXJsLCBUSHR0cENsaWVudE9wdGlvbnN7fSkKK30KKworLy8gRGVwcmVjYXRlZDogVXNlIE5ld1RIdHRwQ2xpZW50VHJhbnNwb3J0RmFjdG9yeVdpdGhPcHRpb25zIGluc3RlYWQuCitmdW5jIE5ld1RIdHRwUG9zdENsaWVudFRyYW5zcG9ydEZhY3RvcnlXaXRoT3B0aW9ucyh1cmwgc3RyaW5nLCBvcHRpb25zIFRIdHRwQ2xpZW50T3B0aW9ucykgKlRIdHRwQ2xpZW50VHJhbnNwb3J0RmFjdG9yeSB7CisJcmV0dXJuIE5ld1RIdHRwQ2xpZW50VHJhbnNwb3J0RmFjdG9yeVdpdGhPcHRpb25zKHVybCwgb3B0aW9ucykKK30KKworLy8gRGVwcmVjYXRlZDogVXNlIE5ld1RIdHRwQ2xpZW50V2l0aE9wdGlvbnMgaW5zdGVhZC4KK2Z1bmMgTmV3VEh0dHBQb3N0Q2xpZW50V2l0aE9wdGlvbnModXJsc3RyIHN0cmluZywgb3B0aW9ucyBUSHR0cENsaWVudE9wdGlvbnMpIChUVHJhbnNwb3J0LCBlcnJvcikgeworCXJldHVybiBOZXdUSHR0cENsaWVudFdpdGhPcHRpb25zKHVybHN0ciwgb3B0aW9ucykKK30KKworLy8gRGVwcmVjYXRlZDogVXNlIE5ld1RIdHRwQ2xpZW50IGluc3RlYWQuCitmdW5jIE5ld1RIdHRwUG9zdENsaWVudCh1cmxzdHIgc3RyaW5nKSAoVFRyYW5zcG9ydCwgZXJyb3IpIHsKKwlyZXR1cm4gTmV3VEh0dHBDbGllbnRXaXRoT3B0aW9ucyh1cmxzdHIsIFRIdHRwQ2xpZW50T3B0aW9uc3t9KQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9odHRwX2NsaWVudF90ZXN0LmdvIGIvbGliL2dvL3RocmlmdC9odHRwX2NsaWVudF90ZXN0LmdvCmluZGV4IDBjMmNiMjguLjQ1MzY4MGEgMTAwNjQ0Ci0tLSBhL2xpYi9nby90aHJpZnQvaHR0cF9jbGllbnRfdGVzdC5nbworKysgYi9saWIvZ28vdGhyaWZ0L2h0dHBfY2xpZW50X3Rlc3QuZ28KQEAgLTIwLDYgKzIwLDcgQEAKIHBhY2thZ2UgdGhyaWZ0CiAKIGltcG9ydCAoCisJIm5ldC9odHRwIgogCSJ0ZXN0aW5nIgogKQogCkBAIC00OCwzICs0OSw1OCBAQAogCX0KIAlUcmFuc3BvcnRIZWFkZXJUZXN0KHQsIHRyYW5zLCB0cmFucykKIH0KKworZnVuYyBUZXN0SHR0cEN1c3RvbUNsaWVudCh0ICp0ZXN0aW5nLlQpIHsKKwlsLCBhZGRyIDo9IEh0dHBDbGllbnRTZXR1cEZvclRlc3QodCkKKwlpZiBsICE9IG5pbCB7CisJCWRlZmVyIGwuQ2xvc2UoKQorCX0KKworCWh0dHBUcmFuc3BvcnQgOj0gJmN1c3RvbUh0dHBUcmFuc3BvcnR7fQorCisJdHJhbnMsIGVyciA6PSBOZXdUSHR0cFBvc3RDbGllbnRXaXRoT3B0aW9ucygiaHR0cDovLyIrYWRkci5TdHJpbmcoKSwgVEh0dHBDbGllbnRPcHRpb25zeworCQlDbGllbnQ6ICZodHRwLkNsaWVudHsKKwkJCVRyYW5zcG9ydDogaHR0cFRyYW5zcG9ydCwKKwkJfSwKKwl9KQorCWlmIGVyciAhPSBuaWwgeworCQlsLkNsb3NlKCkKKwkJdC5GYXRhbGYoIlVuYWJsZSB0byBjb25uZWN0IHRvICVzOiAlcyIsIGFkZHIuU3RyaW5nKCksIGVycikKKwl9CisJVHJhbnNwb3J0SGVhZGVyVGVzdCh0LCB0cmFucywgdHJhbnMpCisKKwlpZiAhaHR0cFRyYW5zcG9ydC5oaXQgeworCQl0LkZhdGFsZigiQ3VzdG9tIGNsaWVudCB3YXMgbm90IHVzZWQiKQorCX0KK30KKworZnVuYyBUZXN0SHR0cEN1c3RvbUNsaWVudFBhY2thZ2VTY29wZSh0ICp0ZXN0aW5nLlQpIHsKKwlsLCBhZGRyIDo9IEh0dHBDbGllbnRTZXR1cEZvclRlc3QodCkKKwlpZiBsICE9IG5pbCB7CisJCWRlZmVyIGwuQ2xvc2UoKQorCX0KKwlodHRwVHJhbnNwb3J0IDo9ICZjdXN0b21IdHRwVHJhbnNwb3J0e30KKwlEZWZhdWx0SHR0cENsaWVudCA9ICZodHRwLkNsaWVudHsKKwkJVHJhbnNwb3J0OiBodHRwVHJhbnNwb3J0LAorCX0KKworCXRyYW5zLCBlcnIgOj0gTmV3VEh0dHBQb3N0Q2xpZW50KCJodHRwOi8vIiArIGFkZHIuU3RyaW5nKCkpCisJaWYgZXJyICE9IG5pbCB7CisJCWwuQ2xvc2UoKQorCQl0LkZhdGFsZigiVW5hYmxlIHRvIGNvbm5lY3QgdG8gJXM6ICVzIiwgYWRkci5TdHJpbmcoKSwgZXJyKQorCX0KKwlUcmFuc3BvcnRIZWFkZXJUZXN0KHQsIHRyYW5zLCB0cmFucykKKworCWlmICFodHRwVHJhbnNwb3J0LmhpdCB7CisJCXQuRmF0YWxmKCJDdXN0b20gY2xpZW50IHdhcyBub3QgdXNlZCIpCisJfQorfQorCit0eXBlIGN1c3RvbUh0dHBUcmFuc3BvcnQgc3RydWN0IHsKKwloaXQgYm9vbAorfQorCitmdW5jIChjICpjdXN0b21IdHRwVHJhbnNwb3J0KSBSb3VuZFRyaXAocmVxICpodHRwLlJlcXVlc3QpICgqaHR0cC5SZXNwb25zZSwgZXJyb3IpIHsKKwljLmhpdCA9IHRydWUKKwlyZXR1cm4gaHR0cC5EZWZhdWx0VHJhbnNwb3J0LlJvdW5kVHJpcChyZXEpCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L2h0dHBfdHJhbnNwb3J0LmdvIGIvbGliL2dvL3RocmlmdC9odHRwX3RyYW5zcG9ydC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmYwZjM4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9odHRwX3RyYW5zcG9ydC5nbwpAQCAtMCwwICsxLDYzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJImNvbXByZXNzL2d6aXAiCisJImlvIgorCSJuZXQvaHR0cCIKKwkic3RyaW5ncyIKKykKKworLy8gTmV3VGhyaWZ0SGFuZGxlckZ1bmMgaXMgYSBmdW5jdGlvbiB0aGF0IGNyZWF0ZSBhIHJlYWR5IHRvIHVzZSBBcGFjaGUgVGhyaWZ0IEhhbmRsZXIgZnVuY3Rpb24KK2Z1bmMgTmV3VGhyaWZ0SGFuZGxlckZ1bmMocHJvY2Vzc29yIFRQcm9jZXNzb3IsCisJaW5QZmFjdG9yeSwgb3V0UGZhY3RvcnkgVFByb3RvY29sRmFjdG9yeSkgZnVuYyh3IGh0dHAuUmVzcG9uc2VXcml0ZXIsIHIgKmh0dHAuUmVxdWVzdCkgeworCisJcmV0dXJuIGd6KGZ1bmModyBodHRwLlJlc3BvbnNlV3JpdGVyLCByICpodHRwLlJlcXVlc3QpIHsKKwkJdy5IZWFkZXIoKS5BZGQoIkNvbnRlbnQtVHlwZSIsICJhcHBsaWNhdGlvbi94LXRocmlmdCIpCisKKwkJdHJhbnNwb3J0IDo9IE5ld1N0cmVhbVRyYW5zcG9ydChyLkJvZHksIHcpCisJCXByb2Nlc3Nvci5Qcm9jZXNzKHIuQ29udGV4dCgpLCBpblBmYWN0b3J5LkdldFByb3RvY29sKHRyYW5zcG9ydCksIG91dFBmYWN0b3J5LkdldFByb3RvY29sKHRyYW5zcG9ydCkpCisJfSkKK30KKworLy8gZ3ogdHJhbnNwYXJlbnRseSBjb21wcmVzc2VzIHRoZSBIVFRQIHJlc3BvbnNlIGlmIHRoZSBjbGllbnQgc3VwcG9ydHMgaXQuCitmdW5jIGd6KGhhbmRsZXIgaHR0cC5IYW5kbGVyRnVuYykgaHR0cC5IYW5kbGVyRnVuYyB7CisJcmV0dXJuIGZ1bmModyBodHRwLlJlc3BvbnNlV3JpdGVyLCByICpodHRwLlJlcXVlc3QpIHsKKwkJaWYgIXN0cmluZ3MuQ29udGFpbnMoci5IZWFkZXIuR2V0KCJBY2NlcHQtRW5jb2RpbmciKSwgImd6aXAiKSB7CisJCQloYW5kbGVyKHcsIHIpCisJCQlyZXR1cm4KKwkJfQorCQl3LkhlYWRlcigpLlNldCgiQ29udGVudC1FbmNvZGluZyIsICJnemlwIikKKwkJZ3ogOj0gZ3ppcC5OZXdXcml0ZXIodykKKwkJZGVmZXIgZ3ouQ2xvc2UoKQorCQlnencgOj0gZ3ppcFJlc3BvbnNlV3JpdGVye1dyaXRlcjogZ3osIFJlc3BvbnNlV3JpdGVyOiB3fQorCQloYW5kbGVyKGd6dywgcikKKwl9Cit9CisKK3R5cGUgZ3ppcFJlc3BvbnNlV3JpdGVyIHN0cnVjdCB7CisJaW8uV3JpdGVyCisJaHR0cC5SZXNwb25zZVdyaXRlcgorfQorCitmdW5jICh3IGd6aXBSZXNwb25zZVdyaXRlcikgV3JpdGUoYiBbXWJ5dGUpIChpbnQsIGVycm9yKSB7CisJcmV0dXJuIHcuV3JpdGVyLldyaXRlKGIpCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L2lvc3RyZWFtX3RyYW5zcG9ydC5nbyBiL2xpYi9nby90aHJpZnQvaW9zdHJlYW1fdHJhbnNwb3J0LmdvCmluZGV4IDMxNGVhYTYuLmZlYTkzYmMgMTAwNjQ0Ci0tLSBhL2xpYi9nby90aHJpZnQvaW9zdHJlYW1fdHJhbnNwb3J0LmdvCisrKyBiL2xpYi9nby90aHJpZnQvaW9zdHJlYW1fdHJhbnNwb3J0LmdvCkBAIC0yMSw2ICsyMSw3IEBACiAKIGltcG9ydCAoCiAJImJ1ZmlvIgorCSJjb250ZXh0IgogCSJpbyIKICkKIApAQCAtMjksNiArMzAsNyBAQAogCWlvLlJlYWRlcgogCWlvLldyaXRlcgogCWlzUmVhZFdyaXRlciBib29sCisJY2xvc2VkICAgICAgIGJvb2wKIH0KIAogdHlwZSBTdHJlYW1UcmFuc3BvcnRGYWN0b3J5IHN0cnVjdCB7CkBAIC0zNywzOCArMzksMzggQEAKIAlpc1JlYWRXcml0ZXIgYm9vbAogfQogCi1mdW5jIChwICpTdHJlYW1UcmFuc3BvcnRGYWN0b3J5KSBHZXRUcmFuc3BvcnQodHJhbnMgVFRyYW5zcG9ydCkgVFRyYW5zcG9ydCB7CitmdW5jIChwICpTdHJlYW1UcmFuc3BvcnRGYWN0b3J5KSBHZXRUcmFuc3BvcnQodHJhbnMgVFRyYW5zcG9ydCkgKFRUcmFuc3BvcnQsIGVycm9yKSB7CiAJaWYgdHJhbnMgIT0gbmlsIHsKIAkJdCwgb2sgOj0gdHJhbnMuKCpTdHJlYW1UcmFuc3BvcnQpCiAJCWlmIG9rIHsKIAkJCWlmIHQuaXNSZWFkV3JpdGVyIHsKLQkJCQlyZXR1cm4gTmV3U3RyZWFtVHJhbnNwb3J0UlcodC5SZWFkZXIuKGlvLlJlYWRXcml0ZXIpKQorCQkJCXJldHVybiBOZXdTdHJlYW1UcmFuc3BvcnRSVyh0LlJlYWRlci4oaW8uUmVhZFdyaXRlcikpLCBuaWwKIAkJCX0KIAkJCWlmIHQuUmVhZGVyICE9IG5pbCAmJiB0LldyaXRlciAhPSBuaWwgewotCQkJCXJldHVybiBOZXdTdHJlYW1UcmFuc3BvcnQodC5SZWFkZXIsIHQuV3JpdGVyKQorCQkJCXJldHVybiBOZXdTdHJlYW1UcmFuc3BvcnQodC5SZWFkZXIsIHQuV3JpdGVyKSwgbmlsCiAJCQl9CiAJCQlpZiB0LlJlYWRlciAhPSBuaWwgJiYgdC5Xcml0ZXIgPT0gbmlsIHsKLQkJCQlyZXR1cm4gTmV3U3RyZWFtVHJhbnNwb3J0Uih0LlJlYWRlcikKKwkJCQlyZXR1cm4gTmV3U3RyZWFtVHJhbnNwb3J0Uih0LlJlYWRlciksIG5pbAogCQkJfQogCQkJaWYgdC5SZWFkZXIgPT0gbmlsICYmIHQuV3JpdGVyICE9IG5pbCB7Ci0JCQkJcmV0dXJuIE5ld1N0cmVhbVRyYW5zcG9ydFcodC5Xcml0ZXIpCisJCQkJcmV0dXJuIE5ld1N0cmVhbVRyYW5zcG9ydFcodC5Xcml0ZXIpLCBuaWwKIAkJCX0KLQkJCXJldHVybiAmU3RyZWFtVHJhbnNwb3J0e30KKwkJCXJldHVybiAmU3RyZWFtVHJhbnNwb3J0e30sIG5pbAogCQl9CiAJfQogCWlmIHAuaXNSZWFkV3JpdGVyIHsKLQkJcmV0dXJuIE5ld1N0cmVhbVRyYW5zcG9ydFJXKHAuUmVhZGVyLihpby5SZWFkV3JpdGVyKSkKKwkJcmV0dXJuIE5ld1N0cmVhbVRyYW5zcG9ydFJXKHAuUmVhZGVyLihpby5SZWFkV3JpdGVyKSksIG5pbAogCX0KIAlpZiBwLlJlYWRlciAhPSBuaWwgJiYgcC5Xcml0ZXIgIT0gbmlsIHsKLQkJcmV0dXJuIE5ld1N0cmVhbVRyYW5zcG9ydChwLlJlYWRlciwgcC5Xcml0ZXIpCisJCXJldHVybiBOZXdTdHJlYW1UcmFuc3BvcnQocC5SZWFkZXIsIHAuV3JpdGVyKSwgbmlsCiAJfQogCWlmIHAuUmVhZGVyICE9IG5pbCAmJiBwLldyaXRlciA9PSBuaWwgewotCQlyZXR1cm4gTmV3U3RyZWFtVHJhbnNwb3J0UihwLlJlYWRlcikKKwkJcmV0dXJuIE5ld1N0cmVhbVRyYW5zcG9ydFIocC5SZWFkZXIpLCBuaWwKIAl9CiAJaWYgcC5SZWFkZXIgPT0gbmlsICYmIHAuV3JpdGVyICE9IG5pbCB7Ci0JCXJldHVybiBOZXdTdHJlYW1UcmFuc3BvcnRXKHAuV3JpdGVyKQorCQlyZXR1cm4gTmV3U3RyZWFtVHJhbnNwb3J0VyhwLldyaXRlciksIG5pbAogCX0KLQlyZXR1cm4gJlN0cmVhbVRyYW5zcG9ydHt9CisJcmV0dXJuICZTdHJlYW1UcmFuc3BvcnR7fSwgbmlsCiB9CiAKIGZ1bmMgTmV3U3RyZWFtVHJhbnNwb3J0RmFjdG9yeShyZWFkZXIgaW8uUmVhZGVyLCB3cml0ZXIgaW8uV3JpdGVyLCBpc1JlYWRXcml0ZXIgYm9vbCkgKlN0cmVhbVRyYW5zcG9ydEZhY3RvcnkgewpAQCAtOTIsMjMgKzk0LDI1IEBACiAJcmV0dXJuICZTdHJlYW1UcmFuc3BvcnR7UmVhZGVyOiBidWZydywgV3JpdGVyOiBidWZydywgaXNSZWFkV3JpdGVyOiB0cnVlfQogfQogCi0vLyAoVGhlIHN0cmVhbXMgbXVzdCBhbHJlYWR5IGJlIG9wZW4gYXQgY29uc3RydWN0aW9uIHRpbWUsIHNvIHRoaXMgc2hvdWxkCi0vLyBhbHdheXMgcmV0dXJuIHRydWUuKQogZnVuYyAocCAqU3RyZWFtVHJhbnNwb3J0KSBJc09wZW4oKSBib29sIHsKLQlyZXR1cm4gdHJ1ZQorCXJldHVybiAhcC5jbG9zZWQKIH0KIAotLy8gKFRoZSBzdHJlYW1zIG11c3QgYWxyZWFkeSBiZSBvcGVuLiBUaGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcuKQorLy8gaW1wbGljaXRseSBvcGVuZWQgb24gY3JlYXRpb24sIGNhbid0IGJlIHJlb3BlbmVkIG9uY2UgY2xvc2VkCiBmdW5jIChwICpTdHJlYW1UcmFuc3BvcnQpIE9wZW4oKSBlcnJvciB7Ci0JcmV0dXJuIG5pbAorCWlmICFwLmNsb3NlZCB7CisJCXJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKEFMUkVBRFlfT1BFTiwgIlN0cmVhbVRyYW5zcG9ydCBhbHJlYWR5IG9wZW4uIikKKwl9IGVsc2UgeworCQlyZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihOT1RfT1BFTiwgImNhbm5vdCByZW9wZW4gU3RyZWFtVHJhbnNwb3J0LiIpCisJfQogfQogCi0vLyBmdW5jIChwICpTdHJlYW1UcmFuc3BvcnQpIFBlZWsoKSBib29sIHsKLS8vIAlyZXR1cm4gcC5Jc09wZW4oKQotLy8gfQotCiAvLyBDbG9zZXMgYm90aCB0aGUgaW5wdXQgYW5kIG91dHB1dCBzdHJlYW1zLgogZnVuYyAocCAqU3RyZWFtVHJhbnNwb3J0KSBDbG9zZSgpIGVycm9yIHsKKwlpZiBwLmNsb3NlZCB7CisJCXJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKE5PVF9PUEVOLCAiU3RyZWFtVHJhbnNwb3J0IGFscmVhZHkgY2xvc2VkLiIpCisJfQorCXAuY2xvc2VkID0gdHJ1ZQogCWNsb3NlZFJlYWRlciA6PSBmYWxzZQogCWlmIHAuUmVhZGVyICE9IG5pbCB7CiAJCWMsIG9rIDo9IHAuUmVhZGVyLihpby5DbG9zZXIpCkBAIC0xMzUsNyArMTM5LDcgQEAKIH0KIAogLy8gRmx1c2hlcyB0aGUgdW5kZXJseWluZyBvdXRwdXQgc3RyZWFtIGlmIG5vdCBudWxsLgotZnVuYyAocCAqU3RyZWFtVHJhbnNwb3J0KSBGbHVzaCgpIGVycm9yIHsKK2Z1bmMgKHAgKlN0cmVhbVRyYW5zcG9ydCkgRmx1c2goY3R4IGNvbnRleHQuQ29udGV4dCkgZXJyb3IgewogCWlmIHAuV3JpdGVyID09IG5pbCB7CiAJCXJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKE5PVF9PUEVOLCAiQ2Fubm90IGZsdXNoIG51bGwgb3V0cHV0U3RyZWFtIikKIAl9CkBAIC0yMDMsMyArMjA3LDggQEAKIAl9CiAJcmV0dXJuCiB9CisKK2Z1bmMgKHAgKlN0cmVhbVRyYW5zcG9ydCkgUmVtYWluaW5nQnl0ZXMoKSAobnVtX2J5dGVzIHVpbnQ2NCkgeworCWNvbnN0IG1heFNpemUgPSBedWludDY0KDApCisJcmV0dXJuIG1heFNpemUgLy8gdGhlIHRocnV0aCBpcywgd2UganVzdCBkb24ndCBrbm93IHVubGVzcyBmcmFtZWQgaXMgdXNlZAorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9pb3N0cmVhbV90cmFuc3BvcnRfdGVzdC5nbyBiL2xpYi9nby90aHJpZnQvaW9zdHJlYW1fdHJhbnNwb3J0X3Rlc3QuZ28KaW5kZXggMTVlYTJkNC4uMTVhNjExNiAxMDA2NDQKLS0tIGEvbGliL2dvL3RocmlmdC9pb3N0cmVhbV90cmFuc3BvcnRfdGVzdC5nbworKysgYi9saWIvZ28vdGhyaWZ0L2lvc3RyZWFtX3RyYW5zcG9ydF90ZXN0LmdvCkBAIC0yOCwzICsyOCwyNSBAQAogCXRyYW5zIDo9IE5ld1N0cmVhbVRyYW5zcG9ydFJXKGJ5dGVzLk5ld0J1ZmZlcihtYWtlKFtdYnl0ZSwgMCwgMTAyNCkpKQogCVRyYW5zcG9ydFRlc3QodCwgdHJhbnMsIHRyYW5zKQogfQorCitmdW5jIFRlc3RTdHJlYW1UcmFuc3BvcnRPcGVuQ2xvc2UodCAqdGVzdGluZy5UKSB7CisJdHJhbnMgOj0gTmV3U3RyZWFtVHJhbnNwb3J0UlcoYnl0ZXMuTmV3QnVmZmVyKG1ha2UoW11ieXRlLCAwLCAxMDI0KSkpCisJaWYgIXRyYW5zLklzT3BlbigpIHsKKwkJdC5GYXRhbCgiU3RyZWFtVHJhbnNwb3J0IHNob3VsZCBiZSBhbHJlYWR5IG9wZW4iKQorCX0KKwlpZiB0cmFucy5PcGVuKCkgPT0gbmlsIHsKKwkJdC5GYXRhbCgiU3RyZWFtVHJhbnNwb3J0IHNob3VsZCByZXR1cm4gZXJyb3Igd2hlbiBvcGVuIHR3aWNlIikKKwl9CisJaWYgdHJhbnMuQ2xvc2UoKSAhPSBuaWwgeworCQl0LkZhdGFsKCJTdHJlYW1UcmFuc3BvcnQgc2hvdWxkIG5vdCByZXR1cm4gZXJyb3Igd2hlbiBjbG9zaW5nIG9wZW4gdHJhbnNwb3J0IikKKwl9CisJaWYgdHJhbnMuSXNPcGVuKCkgeworCQl0LkZhdGFsKCJTdHJlYW1UcmFuc3BvcnQgc2hvdWxkIG5vdCBiZSBvcGVuIGFmdGVyIGNsb3NlIikKKwl9CisJaWYgdHJhbnMuQ2xvc2UoKSA9PSBuaWwgeworCQl0LkZhdGFsKCJTdHJlYW1UcmFuc3BvcnQgc2hvdWxkIHJldHVybiBlcnJvciB3aGVuIGNsb3NpbmcgYSBub24gb3BlbiB0cmFuc3BvcnQiKQorCX0KKwlpZiB0cmFucy5PcGVuKCkgPT0gbmlsIHsKKwkJdC5GYXRhbCgiU3RyZWFtVHJhbnNwb3J0IHNob3VsZCBub3QgYmUgYWJsZSB0byByZW9wZW4iKQorCX0KK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvanNvbl9wcm90b2NvbC5nbyBiL2xpYi9nby90aHJpZnQvanNvbl9wcm90b2NvbC5nbwppbmRleCAxN2ZlNTMwLi43YmU2ODVkIDEwMDY0NAotLS0gYS9saWIvZ28vdGhyaWZ0L2pzb25fcHJvdG9jb2wuZ28KKysrIGIvbGliL2dvL3RocmlmdC9qc29uX3Byb3RvY29sLmdvCkBAIC0yMCw2ICsyMCw3IEBACiBwYWNrYWdlIHRocmlmdAogCiBpbXBvcnQgKAorCSJjb250ZXh0IgogCSJlbmNvZGluZy9iYXNlNjQiCiAJImZtdCIKICkKQEAgLTYwLDYgKzYxLDcgQEAKIH0KIAogZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgV3JpdGVNZXNzYWdlQmVnaW4obmFtZSBzdHJpbmcsIHR5cGVJZCBUTWVzc2FnZVR5cGUsIHNlcUlkIGludDMyKSBlcnJvciB7CisJcC5yZXNldENvbnRleHRTdGFjaygpIC8vIFRIUklGVC0zNzM1CiAJaWYgZSA6PSBwLk91dHB1dExpc3RCZWdpbigpOyBlICE9IG5pbCB7CiAJCXJldHVybiBlCiAJfQpAQCAtNjksNyArNzEsNyBAQAogCWlmIGUgOj0gcC5Xcml0ZVN0cmluZyhuYW1lKTsgZSAhPSBuaWwgewogCQlyZXR1cm4gZQogCX0KLQlpZiBlIDo9IHAuV3JpdGVCeXRlKGJ5dGUodHlwZUlkKSk7IGUgIT0gbmlsIHsKKwlpZiBlIDo9IHAuV3JpdGVCeXRlKGludDgodHlwZUlkKSk7IGUgIT0gbmlsIHsKIAkJcmV0dXJuIGUKIAl9CiAJaWYgZSA6PSBwLldyaXRlSTMyKHNlcUlkKTsgZSAhPSBuaWwgewpAQCAtMTM0LDEwICsxMzYsMTYgQEAKIAlpZiBlIDo9IHAuV3JpdGVTdHJpbmcocyk7IGUgIT0gbmlsIHsKIAkJcmV0dXJuIGUKIAl9Ci0JcmV0dXJuIHAuV3JpdGVJNjQoaW50NjQoc2l6ZSkpCisJaWYgZSA6PSBwLldyaXRlSTY0KGludDY0KHNpemUpKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlyZXR1cm4gcC5PdXRwdXRPYmplY3RCZWdpbigpCiB9CiAKIGZ1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFdyaXRlTWFwRW5kKCkgZXJyb3IgeworCWlmIGUgOj0gcC5PdXRwdXRPYmplY3RFbmQoKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KIAlyZXR1cm4gcC5PdXRwdXRMaXN0RW5kKCkKIH0KIApAQCAtMTYwLDExICsxNjgsMTEgQEAKIGZ1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFdyaXRlQm9vbChiIGJvb2wpIGVycm9yIHsKIAlpZiBiIHsKIAkJcmV0dXJuIHAuV3JpdGVJMzIoMSkKLSAgICB9CisJfQogCXJldHVybiBwLldyaXRlSTMyKDApCiB9CiAKLWZ1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFdyaXRlQnl0ZShiIGJ5dGUpIGVycm9yIHsKK2Z1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFdyaXRlQnl0ZShiIGludDgpIGVycm9yIHsKIAlyZXR1cm4gcC5Xcml0ZUkzMihpbnQzMihiKSkKIH0KIApAQCAtMTk2LDE5ICsyMDQsMjYgQEAKIAlpZiBlIDo9IHAuT3V0cHV0UHJlVmFsdWUoKTsgZSAhPSBuaWwgewogCQlyZXR1cm4gZQogCX0KLQlwLndyaXRlci5Xcml0ZShKU09OX1FVT1RFX0JZVEVTKQotCXdyaXRlciA6PSBiYXNlNjQuTmV3RW5jb2RlcihiYXNlNjQuU3RkRW5jb2RpbmcsIHAud3JpdGVyKQotCWlmIF8sIGUgOj0gd3JpdGVyLldyaXRlKHYpOyBlICE9IG5pbCB7CisJaWYgXywgZSA6PSBwLndyaXRlKEpTT05fUVVPVEVfQllURVMpOyBlICE9IG5pbCB7CiAJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKIAl9Ci0Jd3JpdGVyLkNsb3NlKCkKLQlwLndyaXRlci5Xcml0ZShKU09OX1FVT1RFX0JZVEVTKQorCXdyaXRlciA6PSBiYXNlNjQuTmV3RW5jb2RlcihiYXNlNjQuU3RkRW5jb2RpbmcsIHAud3JpdGVyKQorCWlmIF8sIGUgOj0gd3JpdGVyLldyaXRlKHYpOyBlICE9IG5pbCB7CisJCXAud3JpdGVyLlJlc2V0KHAudHJhbnMpIC8vIFRIUklGVC0zNzM1CisJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwl9CisJaWYgZSA6PSB3cml0ZXIuQ2xvc2UoKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJfQorCWlmIF8sIGUgOj0gcC53cml0ZShKU09OX1FVT1RFX0JZVEVTKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJfQogCXJldHVybiBwLk91dHB1dFBvc3RWYWx1ZSgpCiB9CiAKIC8vIFJlYWRpbmcgbWV0aG9kcy4KLQogZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgUmVhZE1lc3NhZ2VCZWdpbigpIChuYW1lIHN0cmluZywgdHlwZUlkIFRNZXNzYWdlVHlwZSwgc2VxSWQgaW50MzIsIGVyciBlcnJvcikgeworCXAucmVzZXRDb250ZXh0U3RhY2soKSAvLyBUSFJJRlQtMzczNQogCWlmIGlzTnVsbCwgZXJyIDo9IHAuUGFyc2VMaXN0QmVnaW4oKTsgaXNOdWxsIHx8IGVyciAhPSBuaWwgewogCQlyZXR1cm4gbmFtZSwgdHlwZUlkLCBzZXFJZCwgZXJyCiAJfQpAQCAtMjUwLDkgKzI2NSw2IEBACiB9CiAKIGZ1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFJlYWRGaWVsZEJlZ2luKCkgKHN0cmluZywgVFR5cGUsIGludDE2LCBlcnJvcikgewotCWlmIHAucmVhZGVyLkJ1ZmZlcmVkKCkgPCAxIHsKLQkJcmV0dXJuICIiLCBTVE9QLCAtMSwgbmlsCi0JfQogCWIsIF8gOj0gcC5yZWFkZXIuUGVlaygxKQogCWlmIGxlbihiKSA8IDEgfHwgYlswXSA9PSBKU09OX1JCUkFDRVswXSB8fCBiWzBdID09IEpTT05fUkJSQUNLRVRbMF0gewogCQlyZXR1cm4gIiIsIFNUT1AsIC0xLCBuaWwKQEAgLTMwMiwxMiArMzE0LDIxIEBACiAJfQogCiAJLy8gcmVhZCBzaXplCi0JaVNpemUsIGVyciA6PSBwLlJlYWRJNjQoKQorCWlTaXplLCBlIDo9IHAuUmVhZEk2NCgpCisJaWYgZSAhPSBuaWwgeworCQlyZXR1cm4ga2V5VHlwZSwgdmFsdWVUeXBlLCBzaXplLCBlCisJfQogCXNpemUgPSBpbnQoaVNpemUpCi0JcmV0dXJuIGtleVR5cGUsIHZhbHVlVHlwZSwgc2l6ZSwgZXJyCisKKwlfLCBlID0gcC5QYXJzZU9iamVjdFN0YXJ0KCkKKwlyZXR1cm4ga2V5VHlwZSwgdmFsdWVUeXBlLCBzaXplLCBlCiB9CiAKIGZ1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFJlYWRNYXBFbmQoKSBlcnJvciB7CisJZSA6PSBwLlBhcnNlT2JqZWN0RW5kKCkKKwlpZiBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQogCXJldHVybiBwLlBhcnNlTGlzdEVuZCgpCiB9CiAKQEAgLTMyOCwxMyArMzQ5LDEzIEBACiB9CiAKIGZ1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFJlYWRCb29sKCkgKGJvb2wsIGVycm9yKSB7Ci0JdmFsdWUsIGVyciA6PSBwLlJlYWRJMzIoKTsgCisJdmFsdWUsIGVyciA6PSBwLlJlYWRJMzIoKQogCXJldHVybiAodmFsdWUgIT0gMCksIGVycgogfQogCi1mdW5jIChwICpUSlNPTlByb3RvY29sKSBSZWFkQnl0ZSgpIChieXRlLCBlcnJvcikgeworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgUmVhZEJ5dGUoKSAoaW50OCwgZXJyb3IpIHsKIAl2LCBlcnIgOj0gcC5SZWFkSTY0KCkKLQlyZXR1cm4gYnl0ZSh2KSwgZXJyCisJcmV0dXJuIGludDgodiksIGVycgogfQogCiBmdW5jIChwICpUSlNPTlByb3RvY29sKSBSZWFkSTE2KCkgKGludDE2LCBlcnJvcikgewpAQCAtMzYyLDIxICszODMsMjYgQEAKIAlpZiBlcnIgOj0gcC5QYXJzZVByZVZhbHVlKCk7IGVyciAhPSBuaWwgewogCQlyZXR1cm4gdiwgZXJyCiAJfQotCWIsIF8gOj0gcC5yZWFkZXIuUGVlayhsZW4oSlNPTl9OVUxMKSkKLQlpZiBsZW4oYikgPiAwICYmIGJbMF0gPT0gSlNPTl9RVU9URSB7CisJZiwgXyA6PSBwLnJlYWRlci5QZWVrKDEpCisJaWYgbGVuKGYpID4gMCAmJiBmWzBdID09IEpTT05fUVVPVEUgewogCQlwLnJlYWRlci5SZWFkQnl0ZSgpCiAJCXZhbHVlLCBlcnIgOj0gcC5QYXJzZVN0cmluZ0JvZHkoKQogCQl2ID0gdmFsdWUKIAkJaWYgZXJyICE9IG5pbCB7CiAJCQlyZXR1cm4gdiwgZXJyCiAJCX0KLQl9IGVsc2UgaWYgbGVuKGIpID49IGxlbihKU09OX05VTEwpICYmIHN0cmluZyhiWzA6bGVuKEpTT05fTlVMTCldKSA9PSBzdHJpbmcoSlNPTl9OVUxMKSB7Ci0JCV8sIGVyciA6PSBwLnJlYWRlci5SZWFkKGJbMDpsZW4oSlNPTl9OVUxMKV0pCisJfSBlbHNlIGlmIGxlbihmKSA+IDAgJiYgZlswXSA9PSBKU09OX05VTExbMF0geworCQliIDo9IG1ha2UoW11ieXRlLCBsZW4oSlNPTl9OVUxMKSkKKwkJXywgZXJyIDo9IHAucmVhZGVyLlJlYWQoYikKIAkJaWYgZXJyICE9IG5pbCB7CiAJCQlyZXR1cm4gdiwgTmV3VFByb3RvY29sRXhjZXB0aW9uKGVycikKIAkJfQorCQlpZiBzdHJpbmcoYikgIT0gc3RyaW5nKEpTT05fTlVMTCkgeworCQkJZSA6PSBmbXQuRXJyb3JmKCJFeHBlY3RlZCBhIEpTT04gc3RyaW5nLCBmb3VuZCB1bnF1b3RlZCBkYXRhIHN0YXJ0ZWQgd2l0aCAlcyIsIHN0cmluZyhiKSkKKwkJCXJldHVybiB2LCBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShJTlZBTElEX0RBVEEsIGUpCisJCX0KIAl9IGVsc2UgewotCQllIDo9IGZtdC5FcnJvcmYoIkV4cGVjdGVkIGEgSlNPTiBzdHJpbmcsIGZvdW5kICVzIiwgc3RyaW5nKGIpKQorCQllIDo9IGZtdC5FcnJvcmYoIkV4cGVjdGVkIGEgSlNPTiBzdHJpbmcsIGZvdW5kIHVucXVvdGVkIGRhdGEgc3RhcnRlZCB3aXRoICVzIiwgc3RyaW5nKGYpKQogCQlyZXR1cm4gdiwgTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoSU5WQUxJRF9EQVRBLCBlKQogCX0KIAlyZXR1cm4gdiwgcC5QYXJzZVBvc3RWYWx1ZSgpCkBAIC0zODcsMzAgKzQxMywzNiBAQAogCWlmIGVyciA6PSBwLlBhcnNlUHJlVmFsdWUoKTsgZXJyICE9IG5pbCB7CiAJCXJldHVybiBuaWwsIGVycgogCX0KLQliLCBfIDo9IHAucmVhZGVyLlBlZWsobGVuKEpTT05fTlVMTCkpCi0JaWYgbGVuKGIpID4gMCAmJiBiWzBdID09IEpTT05fUVVPVEUgeworCWYsIF8gOj0gcC5yZWFkZXIuUGVlaygxKQorCWlmIGxlbihmKSA+IDAgJiYgZlswXSA9PSBKU09OX1FVT1RFIHsKIAkJcC5yZWFkZXIuUmVhZEJ5dGUoKQogCQl2YWx1ZSwgZXJyIDo9IHAuUGFyc2VCYXNlNjRFbmNvZGVkQm9keSgpCiAJCXYgPSB2YWx1ZQogCQlpZiBlcnIgIT0gbmlsIHsKIAkJCXJldHVybiB2LCBlcnIKIAkJfQotCX0gZWxzZSBpZiBsZW4oYikgPj0gbGVuKEpTT05fTlVMTCkgJiYgc3RyaW5nKGJbMDpsZW4oSlNPTl9OVUxMKV0pID09IHN0cmluZyhKU09OX05VTEwpIHsKLQkJXywgZXJyIDo9IHAucmVhZGVyLlJlYWQoYlswOmxlbihKU09OX05VTEwpXSkKKwl9IGVsc2UgaWYgbGVuKGYpID4gMCAmJiBmWzBdID09IEpTT05fTlVMTFswXSB7CisJCWIgOj0gbWFrZShbXWJ5dGUsIGxlbihKU09OX05VTEwpKQorCQlfLCBlcnIgOj0gcC5yZWFkZXIuUmVhZChiKQogCQlpZiBlcnIgIT0gbmlsIHsKIAkJCXJldHVybiB2LCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQogCQl9CisJCWlmIHN0cmluZyhiKSAhPSBzdHJpbmcoSlNPTl9OVUxMKSB7CisJCQllIDo9IGZtdC5FcnJvcmYoIkV4cGVjdGVkIGEgSlNPTiBzdHJpbmcsIGZvdW5kIHVucXVvdGVkIGRhdGEgc3RhcnRlZCB3aXRoICVzIiwgc3RyaW5nKGIpKQorCQkJcmV0dXJuIHYsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKElOVkFMSURfREFUQSwgZSkKKwkJfQogCX0gZWxzZSB7Ci0JCWUgOj0gZm10LkVycm9yZigiRXhwZWN0ZWQgYSBKU09OIHN0cmluZywgZm91bmQgJXMiLCBzdHJpbmcoYikpCisJCWUgOj0gZm10LkVycm9yZigiRXhwZWN0ZWQgYSBKU09OIHN0cmluZywgZm91bmQgdW5xdW90ZWQgZGF0YSBzdGFydGVkIHdpdGggJXMiLCBzdHJpbmcoZikpCiAJCXJldHVybiB2LCBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShJTlZBTElEX0RBVEEsIGUpCiAJfQorCiAJcmV0dXJuIHYsIHAuUGFyc2VQb3N0VmFsdWUoKQogfQogCi1mdW5jIChwICpUSlNPTlByb3RvY29sKSBGbHVzaCgpIChlcnIgZXJyb3IpIHsKK2Z1bmMgKHAgKlRKU09OUHJvdG9jb2wpIEZsdXNoKGN0eCBjb250ZXh0LkNvbnRleHQpIChlcnIgZXJyb3IpIHsKIAllcnIgPSBwLndyaXRlci5GbHVzaCgpCiAJaWYgZXJyID09IG5pbCB7Ci0JCWVyciA9IHAudHJhbnMuRmx1c2goKQorCQllcnIgPSBwLnRyYW5zLkZsdXNoKGN0eCkKIAl9CiAJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlcnIpCiB9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L2pzb25fcHJvdG9jb2xfdGVzdC5nbyBiL2xpYi9nby90aHJpZnQvanNvbl9wcm90b2NvbF90ZXN0LmdvCmluZGV4IDg1NDJhOTYuLjU5YzRkNjQgMTAwNjQ0Ci0tLSBhL2xpYi9nby90aHJpZnQvanNvbl9wcm90b2NvbF90ZXN0LmdvCisrKyBiL2xpYi9nby90aHJpZnQvanNvbl9wcm90b2NvbF90ZXN0LmdvCkBAIC0yMCw2ICsyMCw3IEBACiBwYWNrYWdlIHRocmlmdAogCiBpbXBvcnQgKAorCSJjb250ZXh0IgogCSJlbmNvZGluZy9iYXNlNjQiCiAJImVuY29kaW5nL2pzb24iCiAJImZtdCIKQEAgLTM2LDcgKzM3LDcgQEAKIAkJaWYgZSA6PSBwLldyaXRlQm9vbCh2YWx1ZSk7IGUgIT0gbmlsIHsKIAkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCiAJCX0KLQkJaWYgZSA6PSBwLkZsdXNoKCk7IGUgIT0gbmlsIHsKKwkJaWYgZSA6PSBwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKTsgZSAhPSBuaWwgewogCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKIAkJfQogCQlzIDo9IHRyYW5zLlN0cmluZygpCkBAIC02OCw3ICs2OSw3IEBACiAJCX0gZWxzZSB7CiAJCQl0cmFucy5Xcml0ZShbXWJ5dGV7JzAnfSkgLy8gbm90IEpTT05fRkFMU0UKIAkJfQotCQl0cmFucy5GbHVzaCgpCisJCXRyYW5zLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQogCQlzIDo9IHRyYW5zLlN0cmluZygpCiAJCXYsIGUgOj0gcC5SZWFkQm9vbCgpCiAJCWlmIGUgIT0gbmlsIHsKQEAgLTk0LDE0ICs5NSwxNCBAQAogCQlpZiBlIDo9IHAuV3JpdGVCeXRlKHZhbHVlKTsgZSAhPSBuaWwgewogCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKIAkJfQotCQlpZiBlIDo9IHAuRmx1c2goKTsgZSAhPSBuaWwgeworCQlpZiBlIDo9IHAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpOyBlICE9IG5pbCB7CiAJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvciBmbHVzaGluZzogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQogCQl9CiAJCXMgOj0gdHJhbnMuU3RyaW5nKCkKIAkJaWYgcyAhPSBmbXQuU3ByaW50KHZhbHVlKSB7CiAJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyAldjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgcykKIAkJfQotCQl2IDo9IGJ5dGUoMCkKKwkJdiA6PSBpbnQ4KDApCiAJCWlmIGVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUocyksICZ2KTsgZXJyICE9IG5pbCB8fCB2ICE9IHZhbHVlIHsKIAkJCXQuRmF0YWxmKCJCYWQganNvbi1kZWNvZGVkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICclcycsIGV4cGVjdGVkOiAnJXYnIiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCiAJCX0KQEAgLTExNiw3ICsxMTcsNyBAQAogCQl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKIAkJcCA6PSBOZXdUSlNPTlByb3RvY29sKHRyYW5zKQogCQl0cmFucy5Xcml0ZVN0cmluZyhzdHJjb252Lkl0b2EoaW50KHZhbHVlKSkpCi0JCXRyYW5zLkZsdXNoKCkKKwkJdHJhbnMuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCiAJCXMgOj0gdHJhbnMuU3RyaW5nKCkKIAkJdiwgZSA6PSBwLlJlYWRCeXRlKCkKIAkJaWYgZSAhPSBuaWwgewpAQCAtMTQxLDcgKzE0Miw3IEBACiAJCWlmIGUgOj0gcC5Xcml0ZUkxNih2YWx1ZSk7IGUgIT0gbmlsIHsKIAkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCiAJCX0KLQkJaWYgZSA6PSBwLkZsdXNoKCk7IGUgIT0gbmlsIHsKKwkJaWYgZSA6PSBwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKTsgZSAhPSBuaWwgewogCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKIAkJfQogCQlzIDo9IHRyYW5zLlN0cmluZygpCkBAIC0xNjMsNyArMTY0LDcgQEAKIAkJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCiAJCXAgOj0gTmV3VEpTT05Qcm90b2NvbCh0cmFucykKIAkJdHJhbnMuV3JpdGVTdHJpbmcoc3RyY29udi5JdG9hKGludCh2YWx1ZSkpKQotCQl0cmFucy5GbHVzaCgpCisJCXRyYW5zLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQogCQlzIDo9IHRyYW5zLlN0cmluZygpCiAJCXYsIGUgOj0gcC5SZWFkSTE2KCkKIAkJaWYgZSAhPSBuaWwgewpAQCAtMTg4LDcgKzE4OSw3IEBACiAJCWlmIGUgOj0gcC5Xcml0ZUkzMih2YWx1ZSk7IGUgIT0gbmlsIHsKIAkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCiAJCX0KLQkJaWYgZSA6PSBwLkZsdXNoKCk7IGUgIT0gbmlsIHsKKwkJaWYgZSA6PSBwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKTsgZSAhPSBuaWwgewogCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKIAkJfQogCQlzIDo9IHRyYW5zLlN0cmluZygpCkBAIC0yMTAsNyArMjExLDcgQEAKIAkJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCiAJCXAgOj0gTmV3VEpTT05Qcm90b2NvbCh0cmFucykKIAkJdHJhbnMuV3JpdGVTdHJpbmcoc3RyY29udi5JdG9hKGludCh2YWx1ZSkpKQotCQl0cmFucy5GbHVzaCgpCisJCXRyYW5zLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQogCQlzIDo9IHRyYW5zLlN0cmluZygpCiAJCXYsIGUgOj0gcC5SZWFkSTMyKCkKIAkJaWYgZSAhPSBuaWwgewpAQCAtMjM1LDcgKzIzNiw3IEBACiAJCWlmIGUgOj0gcC5Xcml0ZUk2NCh2YWx1ZSk7IGUgIT0gbmlsIHsKIAkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCiAJCX0KLQkJaWYgZSA6PSBwLkZsdXNoKCk7IGUgIT0gbmlsIHsKKwkJaWYgZSA6PSBwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKTsgZSAhPSBuaWwgewogCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKIAkJfQogCQlzIDo9IHRyYW5zLlN0cmluZygpCkBAIC0yNTcsNyArMjU4LDcgQEAKIAkJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCiAJCXAgOj0gTmV3VEpTT05Qcm90b2NvbCh0cmFucykKIAkJdHJhbnMuV3JpdGVTdHJpbmcoc3RyY29udi5Gb3JtYXRJbnQodmFsdWUsIDEwKSkKLQkJdHJhbnMuRmx1c2goKQorCQl0cmFucy5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKIAkJcyA6PSB0cmFucy5TdHJpbmcoKQogCQl2LCBlIDo9IHAuUmVhZEk2NCgpCiAJCWlmIGUgIT0gbmlsIHsKQEAgLTI4Miw3ICsyODMsNyBAQAogCQlpZiBlIDo9IHAuV3JpdGVEb3VibGUodmFsdWUpOyBlICE9IG5pbCB7CiAJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQogCQl9Ci0JCWlmIGUgOj0gcC5GbHVzaCgpOyBlICE9IG5pbCB7CisJCWlmIGUgOj0gcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSk7IGUgIT0gbmlsIHsKIAkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yIGZsdXNoaW5nOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCiAJCX0KIAkJcyA6PSB0cmFucy5TdHJpbmcoKQpAQCAtMzE5LDcgKzMyMCw3IEBACiAJCXAgOj0gTmV3VEpTT05Qcm90b2NvbCh0cmFucykKIAkJbiA6PSBOZXdOdW1lcmljRnJvbURvdWJsZSh2YWx1ZSkKIAkJdHJhbnMuV3JpdGVTdHJpbmcobi5TdHJpbmcoKSkKLQkJdHJhbnMuRmx1c2goKQorCQl0cmFucy5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKIAkJcyA6PSB0cmFucy5TdHJpbmcoKQogCQl2LCBlIDo9IHAuUmVhZERvdWJsZSgpCiAJCWlmIGUgIT0gbmlsIHsKQEAgLTM1OCw3ICszNTksNyBAQAogCQlpZiBlIDo9IHAuV3JpdGVTdHJpbmcodmFsdWUpOyBlICE9IG5pbCB7CiAJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQogCQl9Ci0JCWlmIGUgOj0gcC5GbHVzaCgpOyBlICE9IG5pbCB7CisJCWlmIGUgOj0gcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSk7IGUgIT0gbmlsIHsKIAkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yIGZsdXNoaW5nOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCiAJCX0KIAkJcyA6PSB0cmFucy5TdHJpbmcoKQpAQCAtMzgwLDcgKzM4MSw3IEBACiAJCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQogCQlwIDo9IE5ld1RKU09OUHJvdG9jb2wodHJhbnMpCiAJCXRyYW5zLldyaXRlU3RyaW5nKGpzb25RdW90ZSh2YWx1ZSkpCi0JCXRyYW5zLkZsdXNoKCkKKwkJdHJhbnMuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCiAJCXMgOj0gdHJhbnMuU3RyaW5nKCkKIAkJdiwgZSA6PSBwLlJlYWRTdHJpbmcoKQogCQlpZiBlICE9IG5pbCB7CkBAIC00MDksNyArNDEwLDcgQEAKIAlpZiBlIDo9IHAuV3JpdGVCaW5hcnkodmFsdWUpOyBlICE9IG5pbCB7CiAJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCiAJfQotCWlmIGUgOj0gcC5GbHVzaCgpOyBlICE9IG5pbCB7CisJaWYgZSA6PSBwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKTsgZSAhPSBuaWwgewogCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvciBmbHVzaGluZzogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQogCX0KIAlzIDo9IHRyYW5zLlN0cmluZygpCkBAIC00NDEsNyArNDQyLDcgQEAKIAl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKIAlwIDo9IE5ld1RKU09OUHJvdG9jb2wodHJhbnMpCiAJdHJhbnMuV3JpdGVTdHJpbmcoanNvblF1b3RlKGI2NFN0cmluZykpCi0JdHJhbnMuRmx1c2goKQorCXRyYW5zLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQogCXMgOj0gdHJhbnMuU3RyaW5nKCkKIAl2LCBlIDo9IHAuUmVhZEJpbmFyeSgpCiAJaWYgZSAhPSBuaWwgewpAQCAtNDc0LDcgKzQ3NSw3IEBACiAJCX0KIAl9CiAJcC5Xcml0ZUxpc3RFbmQoKQotCWlmIGUgOj0gcC5GbHVzaCgpOyBlICE9IG5pbCB7CisJaWYgZSA6PSBwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKTsgZSAhPSBuaWwgewogCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIGR1ZSB0byBlcnJvciBmbHVzaGluZzogJXMiLCB0aGV0eXBlLCBlLkVycm9yKCkpCiAJfQogCXN0ciA6PSB0cmFucy5TdHJpbmcoKQpAQCAtNTI4LDcgKzUyOSw3IEBACiAJCX0KIAl9CiAJcC5Xcml0ZVNldEVuZCgpCi0JaWYgZSA6PSBwLkZsdXNoKCk7IGUgIT0gbmlsIHsKKwlpZiBlIDo9IHAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpOyBlICE9IG5pbCB7CiAJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgZHVlIHRvIGVycm9yIGZsdXNoaW5nOiAlcyIsIHRoZXR5cGUsIGUuRXJyb3IoKSkKIAl9CiAJc3RyIDo9IHRyYW5zLlN0cmluZygpCkBAIC01ODUsMTIgKzU4NiwxMiBAQAogCQl9CiAJfQogCXAuV3JpdGVNYXBFbmQoKQotCWlmIGUgOj0gcC5GbHVzaCgpOyBlICE9IG5pbCB7CisJaWYgZSA6PSBwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKTsgZSAhPSBuaWwgewogCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIGR1ZSB0byBlcnJvciBmbHVzaGluZzogJXMiLCB0aGV0eXBlLCBlLkVycm9yKCkpCiAJfQogCXN0ciA6PSB0cmFucy5TdHJpbmcoKQogCWlmIHN0clswXSAhPSAnWycgfHwgc3RyW2xlbihzdHIpLTFdICE9ICddJyB7Ci0JCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzLCB3cm90ZTogJXEsIGluIGdvOiAlcSIsIHRoZXR5cGUsIHN0ciwgRE9VQkxFX1ZBTFVFUykKKwkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMsIHdyb3RlOiAldiwgaW4gZ286ICV2IiwgdGhldHlwZSwgc3RyLCBET1VCTEVfVkFMVUVTKQogCX0KIAlleHBlY3RlZEtleVR5cGUsIGV4cGVjdGVkVmFsdWVUeXBlLCBleHBlY3RlZFNpemUsIGVyciA6PSBwLlJlYWRNYXBCZWdpbigpCiAJaWYgZXJyICE9IG5pbCB7CkBAIC02NDAsNyArNjQxLDEwIEBACiAJCQkJdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKIAkJCX0KIAkJfQotCQl0cmFucy5SZXNldCgpCisJfQorCWVyciA9IHAuUmVhZE1hcEVuZCgpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWxmKCJFcnJvciB3aGlsZSByZWFkaW5nIG1hcCBlbmQ6ICVzIiwgZXJyLkVycm9yKCkpCiAJfQogCXRyYW5zLkNsb3NlKCkKIH0KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvbG93bGV2ZWxfYmVuY2htYXJrc190ZXN0LmdvIGIvbGliL2dvL3RocmlmdC9sb3dsZXZlbF9iZW5jaG1hcmtzX3Rlc3QuZ28KaW5kZXggYTUwOTRhZS4uZTE3MzY1NSAxMDA2NDQKLS0tIGEvbGliL2dvL3RocmlmdC9sb3dsZXZlbF9iZW5jaG1hcmtzX3Rlc3QuZ28KKysrIGIvbGliL2dvL3RocmlmdC9sb3dsZXZlbF9iZW5jaG1hcmtzX3Rlc3QuZ28KQEAgLTM2LDcgKzM2LDEwIEBACiB9CiAKIGZ1bmMgQmVuY2htYXJrQmluYXJ5Qm9vbF8wKGIgKnRlc3RpbmcuQikgewotCXRyYW5zIDo9IHRmdlswXS5HZXRUcmFuc3BvcnQobmlsKQorCXRyYW5zLCBlcnIgOj0gdGZ2WzBdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KIAlwIDo9IGJpbmFyeVByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKIAlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgewogCQlSZWFkV3JpdGVCb29sKGIsIHAsIHRyYW5zKQpAQCAtNDQsNyArNDcsMTAgQEAKIH0KIAogZnVuYyBCZW5jaG1hcmtCaW5hcnlCeXRlXzAoYiAqdGVzdGluZy5CKSB7Ci0JdHJhbnMgOj0gdGZ2WzBdLkdldFRyYW5zcG9ydChuaWwpCisJdHJhbnMsIGVyciA6PSB0ZnZbMF0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQogCXAgOj0gYmluYXJ5UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQogCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CiAJCVJlYWRXcml0ZUJ5dGUoYiwgcCwgdHJhbnMpCkBAIC01Miw3ICs1OCwxMCBAQAogfQogCiBmdW5jIEJlbmNobWFya0JpbmFyeUkxNl8wKGIgKnRlc3RpbmcuQikgewotCXRyYW5zIDo9IHRmdlswXS5HZXRUcmFuc3BvcnQobmlsKQorCXRyYW5zLCBlcnIgOj0gdGZ2WzBdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KIAlwIDo9IGJpbmFyeVByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKIAlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgewogCQlSZWFkV3JpdGVJMTYoYiwgcCwgdHJhbnMpCkBAIC02MCwzNSArNjksNTAgQEAKIH0KIAogZnVuYyBCZW5jaG1hcmtCaW5hcnlJMzJfMChiICp0ZXN0aW5nLkIpIHsKLQl0cmFucyA6PSB0ZnZbMF0uR2V0VHJhbnNwb3J0KG5pbCkKKwl0cmFucywgZXJyIDo9IHRmdlswXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CiAJcCA6PSBiaW5hcnlQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCiAJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKIAkJUmVhZFdyaXRlSTMyKGIsIHAsIHRyYW5zKQogCX0KIH0KIGZ1bmMgQmVuY2htYXJrQmluYXJ5STY0XzAoYiAqdGVzdGluZy5CKSB7Ci0JdHJhbnMgOj0gdGZ2WzBdLkdldFRyYW5zcG9ydChuaWwpCisJdHJhbnMsIGVyciA6PSB0ZnZbMF0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQogCXAgOj0gYmluYXJ5UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQogCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CiAJCVJlYWRXcml0ZUk2NChiLCBwLCB0cmFucykKIAl9CiB9CiBmdW5jIEJlbmNobWFya0JpbmFyeURvdWJsZV8wKGIgKnRlc3RpbmcuQikgewotCXRyYW5zIDo9IHRmdlswXS5HZXRUcmFuc3BvcnQobmlsKQorCXRyYW5zLCBlcnIgOj0gdGZ2WzBdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KIAlwIDo9IGJpbmFyeVByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKIAlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgewogCQlSZWFkV3JpdGVEb3VibGUoYiwgcCwgdHJhbnMpCiAJfQogfQogZnVuYyBCZW5jaG1hcmtCaW5hcnlTdHJpbmdfMChiICp0ZXN0aW5nLkIpIHsKLQl0cmFucyA6PSB0ZnZbMF0uR2V0VHJhbnNwb3J0KG5pbCkKKwl0cmFucywgZXJyIDo9IHRmdlswXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CiAJcCA6PSBiaW5hcnlQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCiAJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKIAkJUmVhZFdyaXRlU3RyaW5nKGIsIHAsIHRyYW5zKQogCX0KIH0KIGZ1bmMgQmVuY2htYXJrQmluYXJ5QmluYXJ5XzAoYiAqdGVzdGluZy5CKSB7Ci0JdHJhbnMgOj0gdGZ2WzBdLkdldFRyYW5zcG9ydChuaWwpCisJdHJhbnMsIGVyciA6PSB0ZnZbMF0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQogCXAgOj0gYmluYXJ5UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQogCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CiAJCVJlYWRXcml0ZUJpbmFyeShiLCBwLCB0cmFucykKQEAgLTk2LDcgKzEyMCwxMCBAQAogfQogCiBmdW5jIEJlbmNobWFya0JpbmFyeUJvb2xfMShiICp0ZXN0aW5nLkIpIHsKLQl0cmFucyA6PSB0ZnZbMV0uR2V0VHJhbnNwb3J0KG5pbCkKKwl0cmFucywgZXJyIDo9IHRmdlsxXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CiAJcCA6PSBiaW5hcnlQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCiAJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKIAkJUmVhZFdyaXRlQm9vbChiLCBwLCB0cmFucykKQEAgLTEwNCw3ICsxMzEsMTAgQEAKIH0KIAogZnVuYyBCZW5jaG1hcmtCaW5hcnlCeXRlXzEoYiAqdGVzdGluZy5CKSB7Ci0JdHJhbnMgOj0gdGZ2WzFdLkdldFRyYW5zcG9ydChuaWwpCisJdHJhbnMsIGVyciA6PSB0ZnZbMV0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQogCXAgOj0gYmluYXJ5UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQogCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CiAJCVJlYWRXcml0ZUJ5dGUoYiwgcCwgdHJhbnMpCkBAIC0xMTIsNyArMTQyLDEwIEBACiB9CiAKIGZ1bmMgQmVuY2htYXJrQmluYXJ5STE2XzEoYiAqdGVzdGluZy5CKSB7Ci0JdHJhbnMgOj0gdGZ2WzFdLkdldFRyYW5zcG9ydChuaWwpCisJdHJhbnMsIGVyciA6PSB0ZnZbMV0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQogCXAgOj0gYmluYXJ5UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQogCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CiAJCVJlYWRXcml0ZUkxNihiLCBwLCB0cmFucykKQEAgLTEyMCwzNSArMTUzLDUwIEBACiB9CiAKIGZ1bmMgQmVuY2htYXJrQmluYXJ5STMyXzEoYiAqdGVzdGluZy5CKSB7Ci0JdHJhbnMgOj0gdGZ2WzFdLkdldFRyYW5zcG9ydChuaWwpCisJdHJhbnMsIGVyciA6PSB0ZnZbMV0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQogCXAgOj0gYmluYXJ5UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQogCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CiAJCVJlYWRXcml0ZUkzMihiLCBwLCB0cmFucykKIAl9CiB9CiBmdW5jIEJlbmNobWFya0JpbmFyeUk2NF8xKGIgKnRlc3RpbmcuQikgewotCXRyYW5zIDo9IHRmdlsxXS5HZXRUcmFuc3BvcnQobmlsKQorCXRyYW5zLCBlcnIgOj0gdGZ2WzFdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KIAlwIDo9IGJpbmFyeVByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKIAlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgewogCQlSZWFkV3JpdGVJNjQoYiwgcCwgdHJhbnMpCiAJfQogfQogZnVuYyBCZW5jaG1hcmtCaW5hcnlEb3VibGVfMShiICp0ZXN0aW5nLkIpIHsKLQl0cmFucyA6PSB0ZnZbMV0uR2V0VHJhbnNwb3J0KG5pbCkKKwl0cmFucywgZXJyIDo9IHRmdlsxXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CiAJcCA6PSBiaW5hcnlQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCiAJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKIAkJUmVhZFdyaXRlRG91YmxlKGIsIHAsIHRyYW5zKQogCX0KIH0KIGZ1bmMgQmVuY2htYXJrQmluYXJ5U3RyaW5nXzEoYiAqdGVzdGluZy5CKSB7Ci0JdHJhbnMgOj0gdGZ2WzFdLkdldFRyYW5zcG9ydChuaWwpCisJdHJhbnMsIGVyciA6PSB0ZnZbMV0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQogCXAgOj0gYmluYXJ5UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQogCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CiAJCVJlYWRXcml0ZVN0cmluZyhiLCBwLCB0cmFucykKIAl9CiB9CiBmdW5jIEJlbmNobWFya0JpbmFyeUJpbmFyeV8xKGIgKnRlc3RpbmcuQikgewotCXRyYW5zIDo9IHRmdlsxXS5HZXRUcmFuc3BvcnQobmlsKQorCXRyYW5zLCBlcnIgOj0gdGZ2WzFdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KIAlwIDo9IGJpbmFyeVByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKIAlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgewogCQlSZWFkV3JpdGVCaW5hcnkoYiwgcCwgdHJhbnMpCkBAIC0xNTYsNyArMjA0LDEwIEBACiB9CiAKIGZ1bmMgQmVuY2htYXJrQmluYXJ5Qm9vbF8yKGIgKnRlc3RpbmcuQikgewotCXRyYW5zIDo9IHRmdlsyXS5HZXRUcmFuc3BvcnQobmlsKQorCXRyYW5zLCBlcnIgOj0gdGZ2WzJdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KIAlwIDo9IGJpbmFyeVByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKIAlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgewogCQlSZWFkV3JpdGVCb29sKGIsIHAsIHRyYW5zKQpAQCAtMTY0LDcgKzIxNSwxMCBAQAogfQogCiBmdW5jIEJlbmNobWFya0JpbmFyeUJ5dGVfMihiICp0ZXN0aW5nLkIpIHsKLQl0cmFucyA6PSB0ZnZbMl0uR2V0VHJhbnNwb3J0KG5pbCkKKwl0cmFucywgZXJyIDo9IHRmdlsyXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CiAJcCA6PSBiaW5hcnlQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCiAJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKIAkJUmVhZFdyaXRlQnl0ZShiLCBwLCB0cmFucykKQEAgLTE3Miw3ICsyMjYsMTAgQEAKIH0KIAogZnVuYyBCZW5jaG1hcmtCaW5hcnlJMTZfMihiICp0ZXN0aW5nLkIpIHsKLQl0cmFucyA6PSB0ZnZbMl0uR2V0VHJhbnNwb3J0KG5pbCkKKwl0cmFucywgZXJyIDo9IHRmdlsyXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CiAJcCA6PSBiaW5hcnlQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCiAJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKIAkJUmVhZFdyaXRlSTE2KGIsIHAsIHRyYW5zKQpAQCAtMTgwLDM1ICsyMzcsNTAgQEAKIH0KIAogZnVuYyBCZW5jaG1hcmtCaW5hcnlJMzJfMihiICp0ZXN0aW5nLkIpIHsKLQl0cmFucyA6PSB0ZnZbMl0uR2V0VHJhbnNwb3J0KG5pbCkKKwl0cmFucywgZXJyIDo9IHRmdlsyXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CiAJcCA6PSBiaW5hcnlQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCiAJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKIAkJUmVhZFdyaXRlSTMyKGIsIHAsIHRyYW5zKQogCX0KIH0KIGZ1bmMgQmVuY2htYXJrQmluYXJ5STY0XzIoYiAqdGVzdGluZy5CKSB7Ci0JdHJhbnMgOj0gdGZ2WzJdLkdldFRyYW5zcG9ydChuaWwpCisJdHJhbnMsIGVyciA6PSB0ZnZbMl0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQogCXAgOj0gYmluYXJ5UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQogCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CiAJCVJlYWRXcml0ZUk2NChiLCBwLCB0cmFucykKIAl9CiB9CiBmdW5jIEJlbmNobWFya0JpbmFyeURvdWJsZV8yKGIgKnRlc3RpbmcuQikgewotCXRyYW5zIDo9IHRmdlsyXS5HZXRUcmFuc3BvcnQobmlsKQorCXRyYW5zLCBlcnIgOj0gdGZ2WzJdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KIAlwIDo9IGJpbmFyeVByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKIAlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgewogCQlSZWFkV3JpdGVEb3VibGUoYiwgcCwgdHJhbnMpCiAJfQogfQogZnVuYyBCZW5jaG1hcmtCaW5hcnlTdHJpbmdfMihiICp0ZXN0aW5nLkIpIHsKLQl0cmFucyA6PSB0ZnZbMl0uR2V0VHJhbnNwb3J0KG5pbCkKKwl0cmFucywgZXJyIDo9IHRmdlsyXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CiAJcCA6PSBiaW5hcnlQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCiAJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKIAkJUmVhZFdyaXRlU3RyaW5nKGIsIHAsIHRyYW5zKQogCX0KIH0KIGZ1bmMgQmVuY2htYXJrQmluYXJ5QmluYXJ5XzIoYiAqdGVzdGluZy5CKSB7Ci0JdHJhbnMgOj0gdGZ2WzJdLkdldFRyYW5zcG9ydChuaWwpCisJdHJhbnMsIGVyciA6PSB0ZnZbMl0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQogCXAgOj0gYmluYXJ5UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQogCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CiAJCVJlYWRXcml0ZUJpbmFyeShiLCBwLCB0cmFucykKQEAgLTIxNiw3ICsyODgsMTAgQEAKIH0KIAogZnVuYyBCZW5jaG1hcmtDb21wYWN0Qm9vbF8wKGIgKnRlc3RpbmcuQikgewotCXRyYW5zIDo9IHRmdlswXS5HZXRUcmFuc3BvcnQobmlsKQorCXRyYW5zLCBlcnIgOj0gdGZ2WzBdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KIAlwIDo9IGNvbXBhY3RQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCiAJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKIAkJUmVhZFdyaXRlQm9vbChiLCBwLCB0cmFucykKQEAgLTIyNCw3ICsyOTksMTAgQEAKIH0KIAogZnVuYyBCZW5jaG1hcmtDb21wYWN0Qnl0ZV8wKGIgKnRlc3RpbmcuQikgewotCXRyYW5zIDo9IHRmdlswXS5HZXRUcmFuc3BvcnQobmlsKQorCXRyYW5zLCBlcnIgOj0gdGZ2WzBdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KIAlwIDo9IGNvbXBhY3RQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCiAJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKIAkJUmVhZFdyaXRlQnl0ZShiLCBwLCB0cmFucykKQEAgLTIzMiw3ICszMTAsMTAgQEAKIH0KIAogZnVuYyBCZW5jaG1hcmtDb21wYWN0STE2XzAoYiAqdGVzdGluZy5CKSB7Ci0JdHJhbnMgOj0gdGZ2WzBdLkdldFRyYW5zcG9ydChuaWwpCisJdHJhbnMsIGVyciA6PSB0ZnZbMF0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQogCXAgOj0gY29tcGFjdFByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKIAlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgewogCQlSZWFkV3JpdGVJMTYoYiwgcCwgdHJhbnMpCkBAIC0yNDAsMzUgKzMyMSw1MCBAQAogfQogCiBmdW5jIEJlbmNobWFya0NvbXBhY3RJMzJfMChiICp0ZXN0aW5nLkIpIHsKLQl0cmFucyA6PSB0ZnZbMF0uR2V0VHJhbnNwb3J0KG5pbCkKKwl0cmFucywgZXJyIDo9IHRmdlswXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CiAJcCA6PSBjb21wYWN0UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQogCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CiAJCVJlYWRXcml0ZUkzMihiLCBwLCB0cmFucykKIAl9CiB9CiBmdW5jIEJlbmNobWFya0NvbXBhY3RJNjRfMChiICp0ZXN0aW5nLkIpIHsKLQl0cmFucyA6PSB0ZnZbMF0uR2V0VHJhbnNwb3J0KG5pbCkKKwl0cmFucywgZXJyIDo9IHRmdlswXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CiAJcCA6PSBjb21wYWN0UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQogCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CiAJCVJlYWRXcml0ZUk2NChiLCBwLCB0cmFucykKIAl9CiB9CiBmdW5jIEJlbmNobWFya0NvbXBhY3REb3VibGUwKGIgKnRlc3RpbmcuQikgewotCXRyYW5zIDo9IHRmdlswXS5HZXRUcmFuc3BvcnQobmlsKQorCXRyYW5zLCBlcnIgOj0gdGZ2WzBdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KIAlwIDo9IGNvbXBhY3RQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCiAJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKIAkJUmVhZFdyaXRlRG91YmxlKGIsIHAsIHRyYW5zKQogCX0KIH0KIGZ1bmMgQmVuY2htYXJrQ29tcGFjdFN0cmluZzAoYiAqdGVzdGluZy5CKSB7Ci0JdHJhbnMgOj0gdGZ2WzBdLkdldFRyYW5zcG9ydChuaWwpCisJdHJhbnMsIGVyciA6PSB0ZnZbMF0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQogCXAgOj0gY29tcGFjdFByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKIAlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgewogCQlSZWFkV3JpdGVTdHJpbmcoYiwgcCwgdHJhbnMpCiAJfQogfQogZnVuYyBCZW5jaG1hcmtDb21wYWN0QmluYXJ5MChiICp0ZXN0aW5nLkIpIHsKLQl0cmFucyA6PSB0ZnZbMF0uR2V0VHJhbnNwb3J0KG5pbCkKKwl0cmFucywgZXJyIDo9IHRmdlswXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CiAJcCA6PSBjb21wYWN0UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQogCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CiAJCVJlYWRXcml0ZUJpbmFyeShiLCBwLCB0cmFucykKQEAgLTI3Niw3ICszNzIsMTAgQEAKIH0KIAogZnVuYyBCZW5jaG1hcmtDb21wYWN0Qm9vbF8xKGIgKnRlc3RpbmcuQikgewotCXRyYW5zIDo9IHRmdlsxXS5HZXRUcmFuc3BvcnQobmlsKQorCXRyYW5zLCBlcnIgOj0gdGZ2WzFdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KIAlwIDo9IGNvbXBhY3RQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCiAJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKIAkJUmVhZFdyaXRlQm9vbChiLCBwLCB0cmFucykKQEAgLTI4NCw3ICszODMsMTAgQEAKIH0KIAogZnVuYyBCZW5jaG1hcmtDb21wYWN0Qnl0ZV8xKGIgKnRlc3RpbmcuQikgewotCXRyYW5zIDo9IHRmdlsxXS5HZXRUcmFuc3BvcnQobmlsKQorCXRyYW5zLCBlcnIgOj0gdGZ2WzFdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KIAlwIDo9IGNvbXBhY3RQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCiAJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKIAkJUmVhZFdyaXRlQnl0ZShiLCBwLCB0cmFucykKQEAgLTI5Miw3ICszOTQsMTAgQEAKIH0KIAogZnVuYyBCZW5jaG1hcmtDb21wYWN0STE2XzEoYiAqdGVzdGluZy5CKSB7Ci0JdHJhbnMgOj0gdGZ2WzFdLkdldFRyYW5zcG9ydChuaWwpCisJdHJhbnMsIGVyciA6PSB0ZnZbMV0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQogCXAgOj0gY29tcGFjdFByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKIAlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgewogCQlSZWFkV3JpdGVJMTYoYiwgcCwgdHJhbnMpCkBAIC0zMDAsMzUgKzQwNSw1MCBAQAogfQogCiBmdW5jIEJlbmNobWFya0NvbXBhY3RJMzJfMShiICp0ZXN0aW5nLkIpIHsKLQl0cmFucyA6PSB0ZnZbMV0uR2V0VHJhbnNwb3J0KG5pbCkKKwl0cmFucywgZXJyIDo9IHRmdlsxXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CiAJcCA6PSBjb21wYWN0UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQogCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CiAJCVJlYWRXcml0ZUkzMihiLCBwLCB0cmFucykKIAl9CiB9CiBmdW5jIEJlbmNobWFya0NvbXBhY3RJNjRfMShiICp0ZXN0aW5nLkIpIHsKLQl0cmFucyA6PSB0ZnZbMV0uR2V0VHJhbnNwb3J0KG5pbCkKKwl0cmFucywgZXJyIDo9IHRmdlsxXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CiAJcCA6PSBjb21wYWN0UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQogCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CiAJCVJlYWRXcml0ZUk2NChiLCBwLCB0cmFucykKIAl9CiB9CiBmdW5jIEJlbmNobWFya0NvbXBhY3REb3VibGUxKGIgKnRlc3RpbmcuQikgewotCXRyYW5zIDo9IHRmdlsxXS5HZXRUcmFuc3BvcnQobmlsKQorCXRyYW5zLCBlcnIgOj0gdGZ2WzFdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KIAlwIDo9IGNvbXBhY3RQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCiAJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKIAkJUmVhZFdyaXRlRG91YmxlKGIsIHAsIHRyYW5zKQogCX0KIH0KIGZ1bmMgQmVuY2htYXJrQ29tcGFjdFN0cmluZzEoYiAqdGVzdGluZy5CKSB7Ci0JdHJhbnMgOj0gdGZ2WzFdLkdldFRyYW5zcG9ydChuaWwpCisJdHJhbnMsIGVyciA6PSB0ZnZbMV0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQogCXAgOj0gY29tcGFjdFByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKIAlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgewogCQlSZWFkV3JpdGVTdHJpbmcoYiwgcCwgdHJhbnMpCiAJfQogfQogZnVuYyBCZW5jaG1hcmtDb21wYWN0QmluYXJ5MShiICp0ZXN0aW5nLkIpIHsKLQl0cmFucyA6PSB0ZnZbMV0uR2V0VHJhbnNwb3J0KG5pbCkKKwl0cmFucywgZXJyIDo9IHRmdlsxXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CiAJcCA6PSBjb21wYWN0UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQogCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CiAJCVJlYWRXcml0ZUJpbmFyeShiLCBwLCB0cmFucykKQEAgLTMzNiw3ICs0NTYsMTAgQEAKIH0KIAogZnVuYyBCZW5jaG1hcmtDb21wYWN0Qm9vbF8yKGIgKnRlc3RpbmcuQikgewotCXRyYW5zIDo9IHRmdlsyXS5HZXRUcmFuc3BvcnQobmlsKQorCXRyYW5zLCBlcnIgOj0gdGZ2WzJdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KIAlwIDo9IGNvbXBhY3RQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCiAJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKIAkJUmVhZFdyaXRlQm9vbChiLCBwLCB0cmFucykKQEAgLTM0NCw3ICs0NjcsMTAgQEAKIH0KIAogZnVuYyBCZW5jaG1hcmtDb21wYWN0Qnl0ZV8yKGIgKnRlc3RpbmcuQikgewotCXRyYW5zIDo9IHRmdlsyXS5HZXRUcmFuc3BvcnQobmlsKQorCXRyYW5zLCBlcnIgOj0gdGZ2WzJdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KIAlwIDo9IGNvbXBhY3RQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCiAJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKIAkJUmVhZFdyaXRlQnl0ZShiLCBwLCB0cmFucykKQEAgLTM1Miw3ICs0NzgsMTAgQEAKIH0KIAogZnVuYyBCZW5jaG1hcmtDb21wYWN0STE2XzIoYiAqdGVzdGluZy5CKSB7Ci0JdHJhbnMgOj0gdGZ2WzJdLkdldFRyYW5zcG9ydChuaWwpCisJdHJhbnMsIGVyciA6PSB0ZnZbMl0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQogCXAgOj0gY29tcGFjdFByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKIAlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgewogCQlSZWFkV3JpdGVJMTYoYiwgcCwgdHJhbnMpCkBAIC0zNjAsMzUgKzQ4OSw1MCBAQAogfQogCiBmdW5jIEJlbmNobWFya0NvbXBhY3RJMzJfMihiICp0ZXN0aW5nLkIpIHsKLQl0cmFucyA6PSB0ZnZbMl0uR2V0VHJhbnNwb3J0KG5pbCkKKwl0cmFucywgZXJyIDo9IHRmdlsyXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CiAJcCA6PSBjb21wYWN0UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQogCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CiAJCVJlYWRXcml0ZUkzMihiLCBwLCB0cmFucykKIAl9CiB9CiBmdW5jIEJlbmNobWFya0NvbXBhY3RJNjRfMihiICp0ZXN0aW5nLkIpIHsKLQl0cmFucyA6PSB0ZnZbMl0uR2V0VHJhbnNwb3J0KG5pbCkKKwl0cmFucywgZXJyIDo9IHRmdlsyXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CiAJcCA6PSBjb21wYWN0UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQogCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CiAJCVJlYWRXcml0ZUk2NChiLCBwLCB0cmFucykKIAl9CiB9CiBmdW5jIEJlbmNobWFya0NvbXBhY3REb3VibGUyKGIgKnRlc3RpbmcuQikgewotCXRyYW5zIDo9IHRmdlsyXS5HZXRUcmFuc3BvcnQobmlsKQorCXRyYW5zLCBlcnIgOj0gdGZ2WzJdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KIAlwIDo9IGNvbXBhY3RQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCiAJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKIAkJUmVhZFdyaXRlRG91YmxlKGIsIHAsIHRyYW5zKQogCX0KIH0KIGZ1bmMgQmVuY2htYXJrQ29tcGFjdFN0cmluZzIoYiAqdGVzdGluZy5CKSB7Ci0JdHJhbnMgOj0gdGZ2WzJdLkdldFRyYW5zcG9ydChuaWwpCisJdHJhbnMsIGVyciA6PSB0ZnZbMl0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQogCXAgOj0gY29tcGFjdFByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKIAlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgewogCQlSZWFkV3JpdGVTdHJpbmcoYiwgcCwgdHJhbnMpCiAJfQogfQogZnVuYyBCZW5jaG1hcmtDb21wYWN0QmluYXJ5MihiICp0ZXN0aW5nLkIpIHsKLQl0cmFucyA6PSB0ZnZbMl0uR2V0VHJhbnNwb3J0KG5pbCkKKwl0cmFucywgZXJyIDo9IHRmdlsyXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CiAJcCA6PSBjb21wYWN0UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQogCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CiAJCVJlYWRXcml0ZUJpbmFyeShiLCBwLCB0cmFucykKZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvbWVtb3J5X2J1ZmZlci5nbyBiL2xpYi9nby90aHJpZnQvbWVtb3J5X2J1ZmZlci5nbwppbmRleCBjNDhlMDg5Li41OTM2ZDI3IDEwMDY0NAotLS0gYS9saWIvZ28vdGhyaWZ0L21lbW9yeV9idWZmZXIuZ28KKysrIGIvbGliL2dvL3RocmlmdC9tZW1vcnlfYnVmZmVyLmdvCkBAIC0yMSw2ICsyMSw3IEBACiAKIGltcG9ydCAoCiAJImJ5dGVzIgorCSJjb250ZXh0IgogKQogCiAvLyBNZW1vcnkgYnVmZmVyLWJhc2VkIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUVHJhbnNwb3J0IGludGVyZmFjZS4KQEAgLTMzLDE0ICszNCwxNCBAQAogCXNpemUgaW50CiB9CiAKLWZ1bmMgKHAgKlRNZW1vcnlCdWZmZXJUcmFuc3BvcnRGYWN0b3J5KSBHZXRUcmFuc3BvcnQodHJhbnMgVFRyYW5zcG9ydCkgVFRyYW5zcG9ydCB7CitmdW5jIChwICpUTWVtb3J5QnVmZmVyVHJhbnNwb3J0RmFjdG9yeSkgR2V0VHJhbnNwb3J0KHRyYW5zIFRUcmFuc3BvcnQpIChUVHJhbnNwb3J0LCBlcnJvcikgewogCWlmIHRyYW5zICE9IG5pbCB7CiAJCXQsIG9rIDo9IHRyYW5zLigqVE1lbW9yeUJ1ZmZlcikKIAkJaWYgb2sgJiYgdC5zaXplID4gMCB7Ci0JCQlyZXR1cm4gTmV3VE1lbW9yeUJ1ZmZlckxlbih0LnNpemUpCisJCQlyZXR1cm4gTmV3VE1lbW9yeUJ1ZmZlckxlbih0LnNpemUpLCBuaWwKIAkJfQogCX0KLQlyZXR1cm4gTmV3VE1lbW9yeUJ1ZmZlckxlbihwLnNpemUpCisJcmV0dXJuIE5ld1RNZW1vcnlCdWZmZXJMZW4ocC5zaXplKSwgbmlsCiB9CiAKIGZ1bmMgTmV3VE1lbW9yeUJ1ZmZlclRyYW5zcG9ydEZhY3Rvcnkoc2l6ZSBpbnQpICpUTWVtb3J5QnVmZmVyVHJhbnNwb3J0RmFjdG9yeSB7CkBAIC02NCwxNiArNjUsMTYgQEAKIAlyZXR1cm4gbmlsCiB9CiAKLWZ1bmMgKHAgKlRNZW1vcnlCdWZmZXIpIFBlZWsoKSBib29sIHsKLQlyZXR1cm4gcC5Jc09wZW4oKQotfQotCiBmdW5jIChwICpUTWVtb3J5QnVmZmVyKSBDbG9zZSgpIGVycm9yIHsKIAlwLkJ1ZmZlci5SZXNldCgpCiAJcmV0dXJuIG5pbAogfQogCiAvLyBGbHVzaGluZyBhIG1lbW9yeSBidWZmZXIgaXMgYSBuby1vcAotZnVuYyAocCAqVE1lbW9yeUJ1ZmZlcikgRmx1c2goKSBlcnJvciB7CitmdW5jIChwICpUTWVtb3J5QnVmZmVyKSBGbHVzaChjdHggY29udGV4dC5Db250ZXh0KSBlcnJvciB7CiAJcmV0dXJuIG5pbAogfQorCitmdW5jIChwICpUTWVtb3J5QnVmZmVyKSBSZW1haW5pbmdCeXRlcygpIChudW1fYnl0ZXMgdWludDY0KSB7CisJcmV0dXJuIHVpbnQ2NChwLkJ1ZmZlci5MZW4oKSkKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvbXVsdGlwbGV4ZWRfcHJvdG9jb2wuZ28gYi9saWIvZ28vdGhyaWZ0L211bHRpcGxleGVkX3Byb3RvY29sLmdvCmluZGV4IDMxNTdlMGQuLmQwMjhhMzAgMTAwNjQ0Ci0tLSBhL2xpYi9nby90aHJpZnQvbXVsdGlwbGV4ZWRfcHJvdG9jb2wuZ28KKysrIGIvbGliL2dvL3RocmlmdC9tdWx0aXBsZXhlZF9wcm90b2NvbC5nbwpAQCAtMjAsNiArMjAsNyBAQAogcGFja2FnZSB0aHJpZnQKIAogaW1wb3J0ICgKKwkiY29udGV4dCIKIAkiZm10IgogCSJzdHJpbmdzIgogKQpAQCAtMTI3LDcgKzEyOCw3IEBACiAJdC5zZXJ2aWNlUHJvY2Vzc29yTWFwW25hbWVdID0gcHJvY2Vzc29yCiB9CiAKLWZ1bmMgKHQgKlRNdWx0aXBsZXhlZFByb2Nlc3NvcikgUHJvY2Vzcyhpbiwgb3V0IFRQcm90b2NvbCkgKGJvb2wsIFRFeGNlcHRpb24pIHsKK2Z1bmMgKHQgKlRNdWx0aXBsZXhlZFByb2Nlc3NvcikgUHJvY2VzcyhjdHggY29udGV4dC5Db250ZXh0LCBpbiwgb3V0IFRQcm90b2NvbCkgKGJvb2wsIFRFeGNlcHRpb24pIHsKIAluYW1lLCB0eXBlSWQsIHNlcWlkLCBlcnIgOj0gaW4uUmVhZE1lc3NhZ2VCZWdpbigpCiAJaWYgZXJyICE9IG5pbCB7CiAJCXJldHVybiBmYWxzZSwgZXJyCkBAIC0xNDAsNyArMTQxLDcgQEAKIAlpZiBsZW4odikgIT0gMiB7CiAJCWlmIHQuRGVmYXVsdFByb2Nlc3NvciAhPSBuaWwgewogCQkJc21iIDo9IE5ld1N0b3JlZE1lc3NhZ2VQcm90b2NvbChpbiwgbmFtZSwgdHlwZUlkLCBzZXFpZCkKLQkJCXJldHVybiB0LkRlZmF1bHRQcm9jZXNzb3IuUHJvY2VzcyhzbWIsIG91dCkKKwkJCXJldHVybiB0LkRlZmF1bHRQcm9jZXNzb3IuUHJvY2VzcyhjdHgsIHNtYiwgb3V0KQogCQl9CiAJCXJldHVybiBmYWxzZSwgZm10LkVycm9yZigiU2VydmljZSBuYW1lIG5vdCBmb3VuZCBpbiBtZXNzYWdlIG5hbWU6ICVzLiAgRGlkIHlvdSBmb3JnZXQgdG8gdXNlIGEgVE11bHRpcGxleFByb3RvY29sIGluIHlvdXIgY2xpZW50PyIsIG5hbWUpCiAJfQpAQCAtMTQ5LDcgKzE1MCw3IEBACiAJCXJldHVybiBmYWxzZSwgZm10LkVycm9yZigiU2VydmljZSBuYW1lIG5vdCBmb3VuZDogJXMuICBEaWQgeW91IGZvcmdldCB0byBjYWxsIHJlZ2lzdGVyUHJvY2Vzc29yKCk/IiwgdlswXSkKIAl9CiAJc21iIDo9IE5ld1N0b3JlZE1lc3NhZ2VQcm90b2NvbChpbiwgdlsxXSwgdHlwZUlkLCBzZXFpZCkKLQlyZXR1cm4gYWN0dWFsUHJvY2Vzc29yLlByb2Nlc3Moc21iLCBvdXQpCisJcmV0dXJuIGFjdHVhbFByb2Nlc3Nvci5Qcm9jZXNzKGN0eCwgc21iLCBvdXQpCiB9CiAKIC8vUHJvdG9jb2wgdGhhdCB1c2Ugc3RvcmVkIG1lc3NhZ2UgZm9yIFJlYWRNZXNzYWdlQmVnaW4KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvcHJvY2Vzc29yLmdvIGIvbGliL2dvL3RocmlmdC9wcm9jZXNzb3IuZ28KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhMGQzZmEuLjAwMDAwMDAKLS0tIGEvbGliL2dvL3RocmlmdC9wcm9jZXNzb3IuZ28KKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgdGhyaWZ0Ci0KLS8vIEEgcHJvY2Vzc29yIGlzIGEgZ2VuZXJpYyBvYmplY3Qgd2hpY2ggb3BlcmF0ZXMgdXBvbiBhbiBpbnB1dCBzdHJlYW0gYW5kCi0vLyB3cml0ZXMgdG8gc29tZSBvdXRwdXQgc3RyZWFtLgotdHlwZSBUUHJvY2Vzc29yIGludGVyZmFjZSB7Ci0JUHJvY2Vzcyhpbiwgb3V0IFRQcm90b2NvbCkgKGJvb2wsIFRFeGNlcHRpb24pCi19Ci0KLXR5cGUgVFByb2Nlc3NvckZ1bmN0aW9uIGludGVyZmFjZSB7Ci0JUHJvY2VzcyhzZXFJZCBpbnQzMiwgaW4sIG91dCBUUHJvdG9jb2wpIChib29sLCBURXhjZXB0aW9uKQotfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9wcm9jZXNzb3JfZmFjdG9yeS5nbyBiL2xpYi9nby90aHJpZnQvcHJvY2Vzc29yX2ZhY3RvcnkuZ28KaW5kZXggOWQ2NDVkZi4uZTRiMTMyYiAxMDA2NDQKLS0tIGEvbGliL2dvL3RocmlmdC9wcm9jZXNzb3JfZmFjdG9yeS5nbworKysgYi9saWIvZ28vdGhyaWZ0L3Byb2Nlc3Nvcl9mYWN0b3J5LmdvCkBAIC0xOSw2ICsxOSwxOCBAQAogCiBwYWNrYWdlIHRocmlmdAogCitpbXBvcnQgImNvbnRleHQiCisKKy8vIEEgcHJvY2Vzc29yIGlzIGEgZ2VuZXJpYyBvYmplY3Qgd2hpY2ggb3BlcmF0ZXMgdXBvbiBhbiBpbnB1dCBzdHJlYW0gYW5kCisvLyB3cml0ZXMgdG8gc29tZSBvdXRwdXQgc3RyZWFtLgordHlwZSBUUHJvY2Vzc29yIGludGVyZmFjZSB7CisJUHJvY2VzcyhjdHggY29udGV4dC5Db250ZXh0LCBpbiwgb3V0IFRQcm90b2NvbCkgKGJvb2wsIFRFeGNlcHRpb24pCit9CisKK3R5cGUgVFByb2Nlc3NvckZ1bmN0aW9uIGludGVyZmFjZSB7CisJUHJvY2VzcyhjdHggY29udGV4dC5Db250ZXh0LCBzZXFJZCBpbnQzMiwgaW4sIG91dCBUUHJvdG9jb2wpIChib29sLCBURXhjZXB0aW9uKQorfQorCiAvLyBUaGUgZGVmYXVsdCBwcm9jZXNzb3IgZmFjdG9yeSBqdXN0IHJldHVybnMgYSBzaW5nbGV0b24KIC8vIGluc3RhbmNlLgogdHlwZSBUUHJvY2Vzc29yRmFjdG9yeSBpbnRlcmZhY2UgewpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9wcm90b2NvbC5nbyBiL2xpYi9nby90aHJpZnQvcHJvdG9jb2wuZ28KaW5kZXggODdjZWFhZC4uNjE1YjdhNCAxMDA2NDQKLS0tIGEvbGliL2dvL3RocmlmdC9wcm90b2NvbC5nbworKysgYi9saWIvZ28vdGhyaWZ0L3Byb3RvY29sLmdvCkBAIC0xOSw2ICsxOSwxMiBAQAogCiBwYWNrYWdlIHRocmlmdAogCitpbXBvcnQgKAorCSJjb250ZXh0IgorCSJlcnJvcnMiCisJImZtdCIKKykKKwogY29uc3QgKAogCVZFUlNJT05fTUFTSyA9IDB4ZmZmZjAwMDAKIAlWRVJTSU9OXzEgICAgPSAweDgwMDEwMDAwCkBAIC0zOSw3ICs0NSw3IEBACiAJV3JpdGVTZXRCZWdpbihlbGVtVHlwZSBUVHlwZSwgc2l6ZSBpbnQpIGVycm9yCiAJV3JpdGVTZXRFbmQoKSBlcnJvcgogCVdyaXRlQm9vbCh2YWx1ZSBib29sKSBlcnJvcgotCVdyaXRlQnl0ZSh2YWx1ZSBieXRlKSBlcnJvcgorCVdyaXRlQnl0ZSh2YWx1ZSBpbnQ4KSBlcnJvcgogCVdyaXRlSTE2KHZhbHVlIGludDE2KSBlcnJvcgogCVdyaXRlSTMyKHZhbHVlIGludDMyKSBlcnJvcgogCVdyaXRlSTY0KHZhbHVlIGludDY0KSBlcnJvcgpAQCAtNjAsNyArNjYsNyBAQAogCVJlYWRTZXRCZWdpbigpIChlbGVtVHlwZSBUVHlwZSwgc2l6ZSBpbnQsIGVyciBlcnJvcikKIAlSZWFkU2V0RW5kKCkgZXJyb3IKIAlSZWFkQm9vbCgpICh2YWx1ZSBib29sLCBlcnIgZXJyb3IpCi0JUmVhZEJ5dGUoKSAodmFsdWUgYnl0ZSwgZXJyIGVycm9yKQorCVJlYWRCeXRlKCkgKHZhbHVlIGludDgsIGVyciBlcnJvcikKIAlSZWFkSTE2KCkgKHZhbHVlIGludDE2LCBlcnIgZXJyb3IpCiAJUmVhZEkzMigpICh2YWx1ZSBpbnQzMiwgZXJyIGVycm9yKQogCVJlYWRJNjQoKSAodmFsdWUgaW50NjQsIGVyciBlcnJvcikKQEAgLTY5LDIxICs3NSwyNiBAQAogCVJlYWRCaW5hcnkoKSAodmFsdWUgW11ieXRlLCBlcnIgZXJyb3IpCiAKIAlTa2lwKGZpZWxkVHlwZSBUVHlwZSkgKGVyciBlcnJvcikKLQlGbHVzaCgpIChlcnIgZXJyb3IpCisJRmx1c2goY3R4IGNvbnRleHQuQ29udGV4dCkgKGVyciBlcnJvcikKIAogCVRyYW5zcG9ydCgpIFRUcmFuc3BvcnQKIH0KIAogLy8gVGhlIG1heGltdW0gcmVjdXJzaXZlIGRlcHRoIHRoZSBza2lwKCkgZnVuY3Rpb24gd2lsbCB0cmF2ZXJzZQotdmFyIE1heFNraXBEZXB0aCA9IDE8PDMxIC0gMQorY29uc3QgREVGQVVMVF9SRUNVUlNJT05fREVQVEggPSA2NAogCiAvLyBTa2lwcyBvdmVyIHRoZSBuZXh0IGRhdGEgZWxlbWVudCBmcm9tIHRoZSBwcm92aWRlZCBpbnB1dCBUUHJvdG9jb2wgb2JqZWN0LgogZnVuYyBTa2lwRGVmYXVsdERlcHRoKHByb3QgVFByb3RvY29sLCB0eXBlSWQgVFR5cGUpIChlcnIgZXJyb3IpIHsKLQlyZXR1cm4gU2tpcChwcm90LCB0eXBlSWQsIE1heFNraXBEZXB0aCkKKwlyZXR1cm4gU2tpcChwcm90LCB0eXBlSWQsIERFRkFVTFRfUkVDVVJTSU9OX0RFUFRIKQogfQogCiAvLyBTa2lwcyBvdmVyIHRoZSBuZXh0IGRhdGEgZWxlbWVudCBmcm9tIHRoZSBwcm92aWRlZCBpbnB1dCBUUHJvdG9jb2wgb2JqZWN0LgogZnVuYyBTa2lwKHNlbGYgVFByb3RvY29sLCBmaWVsZFR5cGUgVFR5cGUsIG1heERlcHRoIGludCkgKGVyciBlcnJvcikgeworCisJaWYgbWF4RGVwdGggPD0gMCB7CisJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShERVBUSF9MSU1JVCwgZXJyb3JzLk5ldygiRGVwdGggbGltaXQgZXhjZWVkZWQiKSkKKwl9CisKIAlzd2l0Y2ggZmllbGRUeXBlIHsKIAljYXNlIFNUT1A6CiAJCXJldHVybgpAQCAtMTE3LDcgKzEyOCwxMCBAQAogCQkJaWYgdHlwZUlkID09IFNUT1AgewogCQkJCWJyZWFrCiAJCQl9Ci0JCQlTa2lwKHNlbGYsIHR5cGVJZCwgbWF4RGVwdGgtMSkKKwkJCWVyciA6PSBTa2lwKHNlbGYsIHR5cGVJZCwgbWF4RGVwdGgtMSkKKwkJCWlmIGVyciAhPSBuaWwgeworCQkJCXJldHVybiBlcnIKKwkJCX0KIAkJCXNlbGYuUmVhZEZpZWxkRW5kKCkKIAkJfQogCQlyZXR1cm4gc2VsZi5SZWFkU3RydWN0RW5kKCkKQEAgLTEyNyw3ICsxNDEsMTAgQEAKIAkJCXJldHVybiBlcnIKIAkJfQogCQlmb3IgaSA6PSAwOyBpIDwgc2l6ZTsgaSsrIHsKLQkJCVNraXAoc2VsZiwga2V5VHlwZSwgbWF4RGVwdGgtMSkKKwkJCWVyciA6PSBTa2lwKHNlbGYsIGtleVR5cGUsIG1heERlcHRoLTEpCisJCQlpZiBlcnIgIT0gbmlsIHsKKwkJCQlyZXR1cm4gZXJyCisJCQl9CiAJCQlzZWxmLlNraXAodmFsdWVUeXBlKQogCQl9CiAJCXJldHVybiBzZWxmLlJlYWRNYXBFbmQoKQpAQCAtMTM3LDcgKzE1NCwxMCBAQAogCQkJcmV0dXJuIGVycgogCQl9CiAJCWZvciBpIDo9IDA7IGkgPCBzaXplOyBpKysgewotCQkJU2tpcChzZWxmLCBlbGVtVHlwZSwgbWF4RGVwdGgtMSkKKwkJCWVyciA6PSBTa2lwKHNlbGYsIGVsZW1UeXBlLCBtYXhEZXB0aC0xKQorCQkJaWYgZXJyICE9IG5pbCB7CisJCQkJcmV0dXJuIGVycgorCQkJfQogCQl9CiAJCXJldHVybiBzZWxmLlJlYWRTZXRFbmQoKQogCWNhc2UgTElTVDoKQEAgLTE0Niw5ICsxNjYsMTQgQEAKIAkJCXJldHVybiBlcnIKIAkJfQogCQlmb3IgaSA6PSAwOyBpIDwgc2l6ZTsgaSsrIHsKLQkJCVNraXAoc2VsZiwgZWxlbVR5cGUsIG1heERlcHRoLTEpCisJCQllcnIgOj0gU2tpcChzZWxmLCBlbGVtVHlwZSwgbWF4RGVwdGgtMSkKKwkJCWlmIGVyciAhPSBuaWwgeworCQkJCXJldHVybiBlcnIKKwkJCX0KIAkJfQogCQlyZXR1cm4gc2VsZi5SZWFkTGlzdEVuZCgpCisJZGVmYXVsdDoKKwkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKElOVkFMSURfREFUQSwgZXJyb3JzLk5ldyhmbXQuU3ByaW50ZigiVW5rbm93biBkYXRhIHR5cGUgJWQiLCBmaWVsZFR5cGUpKSkKIAl9CiAJcmV0dXJuIG5pbAogfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9wcm90b2NvbF9leGNlcHRpb24uZ28gYi9saWIvZ28vdGhyaWZ0L3Byb3RvY29sX2V4Y2VwdGlvbi5nbwppbmRleCA2ZTM1N2VlLi4yOWFiNzVkIDEwMDY0NAotLS0gYS9saWIvZ28vdGhyaWZ0L3Byb3RvY29sX2V4Y2VwdGlvbi5nbworKysgYi9saWIvZ28vdGhyaWZ0L3Byb3RvY29sX2V4Y2VwdGlvbi5nbwpAQCAtNjAsNyArNjAsNyBAQAogCWlmIGVyciA9PSBuaWwgewogCQlyZXR1cm4gbmlsCiAJfQotCWlmIGUsb2sgOj0gZXJyLihUUHJvdG9jb2xFeGNlcHRpb24pOyBvayB7CisJaWYgZSwgb2sgOj0gZXJyLihUUHJvdG9jb2xFeGNlcHRpb24pOyBvayB7CiAJCXJldHVybiBlCiAJfQogCWlmIF8sIG9rIDo9IGVyci4oYmFzZTY0LkNvcnJ1cHRJbnB1dEVycm9yKTsgb2sgewpAQCAtNzUsNCArNzUsMyBAQAogCX0KIAlyZXR1cm4gJnRQcm90b2NvbEV4Y2VwdGlvbntlcnJUeXBlLCBlcnIuRXJyb3IoKX0KIH0KLQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9wcm90b2NvbF90ZXN0LmdvIGIvbGliL2dvL3RocmlmdC9wcm90b2NvbF90ZXN0LmdvCmluZGV4IDdlNzk1MGQuLjk0NDA1NWMgMTAwNjQ0Ci0tLSBhL2xpYi9nby90aHJpZnQvcHJvdG9jb2xfdGVzdC5nbworKysgYi9saWIvZ28vdGhyaWZ0L3Byb3RvY29sX3Rlc3QuZ28KQEAgLTIxLDYgKzIxLDcgQEAKIAogaW1wb3J0ICgKIAkiYnl0ZXMiCisJImNvbnRleHQiCiAJImlvL2lvdXRpbCIKIAkibWF0aCIKIAkibmV0IgpAQCAtMzEsMTAgKzMyLDkgQEAKIGNvbnN0IFBST1RPQ09MX0JJTkFSWV9EQVRBX1NJWkUgPSAxNTUKIAogdmFyICgKLQlkYXRhICAgICAgICAgICBzdHJpbmcgLy8gdGVzdCBkYXRhIGZvciB3cml0aW5nCiAJcHJvdG9jb2xfYmRhdGEgW11ieXRlIC8vIHRlc3QgZGF0YSBmb3Igd3JpdGluZzsgc2FtZSBhcyBkYXRhCiAJQk9PTF9WQUxVRVMgICAgW11ib29sCi0JQllURV9WQUxVRVMgICAgW11ieXRlCisJQllURV9WQUxVRVMgICAgW11pbnQ4CiAJSU5UMTZfVkFMVUVTICAgW11pbnQxNgogCUlOVDMyX1ZBTFVFUyAgIFtdaW50MzIKIAlJTlQ2NF9WQUxVRVMgICBbXWludDY0CkBAIC00Nyw5ICs0Nyw4IEBACiAJZm9yIGkgOj0gMDsgaSA8IFBST1RPQ09MX0JJTkFSWV9EQVRBX1NJWkU7IGkrKyB7CiAJCXByb3RvY29sX2JkYXRhW2ldID0gYnl0ZSgoaSArICdhJykgJSAyNTUpCiAJfQotCWRhdGEgPSBzdHJpbmcocHJvdG9jb2xfYmRhdGEpCiAJQk9PTF9WQUxVRVMgPSBbXWJvb2x7ZmFsc2UsIHRydWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZX0KLQlCWVRFX1ZBTFVFUyA9IFtdYnl0ZXsxMTcsIDAsIDEsIDMyLCAxMjcsIDEyOCwgMjU1fQorCUJZVEVfVkFMVUVTID0gW11pbnQ4ezExNywgMCwgMSwgMzIsIDEyNywgLTEyOCwgLTF9CiAJSU5UMTZfVkFMVUVTID0gW11pbnQxNns0NTksIDAsIDEsIC0xLCAtMTI4LCAxMjcsIDMyNzY3LCAtMzI3Njh9CiAJSU5UMzJfVkFMVUVTID0gW11pbnQzMns0NTksIDAsIDEsIC0xLCAtMTI4LCAxMjcsIDMyNzY3LCAyMTQ3NDgzNjQ3LCAtMjE0NzQ4MzUzNX0KIAlJTlQ2NF9WQUxVRVMgPSBbXWludDY0ezQ1OSwgMCwgMSwgLTEsIC0xMjgsIDEyNywgMzI3NjcsIDIxNDc0ODM2NDcsIC0yMTQ3NDgzNTM1LCAzNDM1OTczODQ4MSwgLTM1MTg0MzcyMDg4NzE5LCAtOTIyMzM3MjAzNjg1NDc3NTgwOCwgOTIyMzM3MjAzNjg1NDc3NTgwN30KQEAgLTEyMCw1OCArMTE5LDk3IEBACiAJCU5ld1RNZW1vcnlCdWZmZXJUcmFuc3BvcnRGYWN0b3J5KDEwMjQpLAogCQlOZXdTdHJlYW1UcmFuc3BvcnRGYWN0b3J5KGJ1ZiwgYnVmLCB0cnVlKSwKIAkJTmV3VEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkoTmV3VE1lbW9yeUJ1ZmZlclRyYW5zcG9ydEZhY3RvcnkoMTAyNCkpLAorCQlOZXdUWmxpYlRyYW5zcG9ydEZhY3RvcnlXaXRoRmFjdG9yeSgwLCBOZXdUTWVtb3J5QnVmZmVyVHJhbnNwb3J0RmFjdG9yeSgxMDI0KSksCisJCU5ld1RabGliVHJhbnNwb3J0RmFjdG9yeVdpdGhGYWN0b3J5KDYsIE5ld1RNZW1vcnlCdWZmZXJUcmFuc3BvcnRGYWN0b3J5KDEwMjQpKSwKKwkJTmV3VFpsaWJUcmFuc3BvcnRGYWN0b3J5V2l0aEZhY3RvcnkoOSwgTmV3VEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkoTmV3VE1lbW9yeUJ1ZmZlclRyYW5zcG9ydEZhY3RvcnkoMTAyNCkpKSwKIAkJTmV3VEh0dHBQb3N0Q2xpZW50VHJhbnNwb3J0RmFjdG9yeSgiaHR0cDovLyIgKyBhZGRyLlN0cmluZygpKSwKIAl9CiAJZm9yIF8sIHRmIDo9IHJhbmdlIHRyYW5zcG9ydHMgewotCQl0cmFucyA6PSB0Zi5HZXRUcmFuc3BvcnQobmlsKQorCQl0cmFucywgZXJyIDo9IHRmLkdldFRyYW5zcG9ydChuaWwpCisJCWlmIGVyciAhPSBuaWwgeworCQkJdC5FcnJvcihlcnIpCisJCQljb250aW51ZQorCQl9CiAJCXAgOj0gcHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHRyYW5zKQogCQlSZWFkV3JpdGVCb29sKHQsIHAsIHRyYW5zKQogCQl0cmFucy5DbG9zZSgpCiAJfQogCWZvciBfLCB0ZiA6PSByYW5nZSB0cmFuc3BvcnRzIHsKLQkJdHJhbnMgOj0gdGYuR2V0VHJhbnNwb3J0KG5pbCkKKwkJdHJhbnMsIGVyciA6PSB0Zi5HZXRUcmFuc3BvcnQobmlsKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXQuRXJyb3IoZXJyKQorCQkJY29udGludWUKKwkJfQogCQlwIDo9IHByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbCh0cmFucykKIAkJUmVhZFdyaXRlQnl0ZSh0LCBwLCB0cmFucykKIAkJdHJhbnMuQ2xvc2UoKQogCX0KIAlmb3IgXywgdGYgOj0gcmFuZ2UgdHJhbnNwb3J0cyB7Ci0JCXRyYW5zIDo9IHRmLkdldFRyYW5zcG9ydChuaWwpCisJCXRyYW5zLCBlcnIgOj0gdGYuR2V0VHJhbnNwb3J0KG5pbCkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQl0LkVycm9yKGVycikKKwkJCWNvbnRpbnVlCisJCX0KIAkJcCA6PSBwcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wodHJhbnMpCiAJCVJlYWRXcml0ZUkxNih0LCBwLCB0cmFucykKIAkJdHJhbnMuQ2xvc2UoKQogCX0KIAlmb3IgXywgdGYgOj0gcmFuZ2UgdHJhbnNwb3J0cyB7Ci0JCXRyYW5zIDo9IHRmLkdldFRyYW5zcG9ydChuaWwpCisJCXRyYW5zLCBlcnIgOj0gdGYuR2V0VHJhbnNwb3J0KG5pbCkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQl0LkVycm9yKGVycikKKwkJCWNvbnRpbnVlCisJCX0KIAkJcCA6PSBwcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wodHJhbnMpCiAJCVJlYWRXcml0ZUkzMih0LCBwLCB0cmFucykKIAkJdHJhbnMuQ2xvc2UoKQogCX0KIAlmb3IgXywgdGYgOj0gcmFuZ2UgdHJhbnNwb3J0cyB7Ci0JCXRyYW5zIDo9IHRmLkdldFRyYW5zcG9ydChuaWwpCisJCXRyYW5zLCBlcnIgOj0gdGYuR2V0VHJhbnNwb3J0KG5pbCkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQl0LkVycm9yKGVycikKKwkJCWNvbnRpbnVlCisJCX0KIAkJcCA6PSBwcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wodHJhbnMpCiAJCVJlYWRXcml0ZUk2NCh0LCBwLCB0cmFucykKIAkJdHJhbnMuQ2xvc2UoKQogCX0KIAlmb3IgXywgdGYgOj0gcmFuZ2UgdHJhbnNwb3J0cyB7Ci0JCXRyYW5zIDo9IHRmLkdldFRyYW5zcG9ydChuaWwpCisJCXRyYW5zLCBlcnIgOj0gdGYuR2V0VHJhbnNwb3J0KG5pbCkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQl0LkVycm9yKGVycikKKwkJCWNvbnRpbnVlCisJCX0KIAkJcCA6PSBwcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wodHJhbnMpCiAJCVJlYWRXcml0ZURvdWJsZSh0LCBwLCB0cmFucykKIAkJdHJhbnMuQ2xvc2UoKQogCX0KIAlmb3IgXywgdGYgOj0gcmFuZ2UgdHJhbnNwb3J0cyB7Ci0JCXRyYW5zIDo9IHRmLkdldFRyYW5zcG9ydChuaWwpCisJCXRyYW5zLCBlcnIgOj0gdGYuR2V0VHJhbnNwb3J0KG5pbCkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQl0LkVycm9yKGVycikKKwkJCWNvbnRpbnVlCisJCX0KIAkJcCA6PSBwcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wodHJhbnMpCiAJCVJlYWRXcml0ZVN0cmluZyh0LCBwLCB0cmFucykKIAkJdHJhbnMuQ2xvc2UoKQogCX0KIAlmb3IgXywgdGYgOj0gcmFuZ2UgdHJhbnNwb3J0cyB7Ci0JCXRyYW5zIDo9IHRmLkdldFRyYW5zcG9ydChuaWwpCisJCXRyYW5zLCBlcnIgOj0gdGYuR2V0VHJhbnNwb3J0KG5pbCkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQl0LkVycm9yKGVycikKKwkJCWNvbnRpbnVlCisJCX0KIAkJcCA6PSBwcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wodHJhbnMpCiAJCVJlYWRXcml0ZUJpbmFyeSh0LCBwLCB0cmFucykKIAkJdHJhbnMuQ2xvc2UoKQogCX0KIAlmb3IgXywgdGYgOj0gcmFuZ2UgdHJhbnNwb3J0cyB7Ci0JCXRyYW5zIDo9IHRmLkdldFRyYW5zcG9ydChuaWwpCisJCXRyYW5zLCBlcnIgOj0gdGYuR2V0VHJhbnNwb3J0KG5pbCkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQl0LkVycm9yKGVycikKKwkJCWNvbnRpbnVlCisJCX0KIAkJcCA6PSBwcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wodHJhbnMpCiAJCVJlYWRXcml0ZUk2NCh0LCBwLCB0cmFucykKIAkJUmVhZFdyaXRlRG91YmxlKHQsIHAsIHRyYW5zKQpAQCAtMTkxLDE3ICsyMjksMTcgQEAKIAlmb3IgaywgdiA6PSByYW5nZSBCT09MX1ZBTFVFUyB7CiAJCWVyciA9IHAuV3JpdGVCb29sKHYpCiAJCWlmIGVyciAhPSBuaWwgewotCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCAlcSBFcnJvciB3cml0aW5nIGJvb2wgaW4gbGlzdCBhdCBpbmRleCAlZDogJXEiLCAiUmVhZFdyaXRlQm9vbCIsIHAsIHRyYW5zLCBlcnIsIGssIHYpCisJCQl0LkVycm9yZigiJXM6ICVUICVUICV2IEVycm9yIHdyaXRpbmcgYm9vbCBpbiBsaXN0IGF0IGluZGV4ICV2OiAldiIsICJSZWFkV3JpdGVCb29sIiwgcCwgdHJhbnMsIGVyciwgaywgdikKIAkJfQogCX0KIAlwLldyaXRlTGlzdEVuZCgpCiAJaWYgZXJyICE9IG5pbCB7Ci0JCXQuRXJyb3JmKCIlczogJVQgJVQgJXEgRXJyb3Igd3JpdGluZyBsaXN0IGVuZDogJXEiLCAiUmVhZFdyaXRlQm9vbCIsIHAsIHRyYW5zLCBlcnIsIEJPT0xfVkFMVUVTKQorCQl0LkVycm9yZigiJXM6ICVUICVUICV2IEVycm9yIHdyaXRpbmcgbGlzdCBlbmQ6ICV2IiwgIlJlYWRXcml0ZUJvb2wiLCBwLCB0cmFucywgZXJyLCBCT09MX1ZBTFVFUykKIAl9Ci0JcC5GbHVzaCgpCisJcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKIAl0aGV0eXBlMiwgdGhlbGVuMiwgZXJyIDo9IHAuUmVhZExpc3RCZWdpbigpCiAJaWYgZXJyICE9IG5pbCB7Ci0JCXQuRXJyb3JmKCIlczogJVQgJVQgJXEgRXJyb3IgcmVhZGluZyBsaXN0OiAlcSIsICJSZWFkV3JpdGVCb29sIiwgcCwgdHJhbnMsIGVyciwgQk9PTF9WQUxVRVMpCisJCXQuRXJyb3JmKCIlczogJVQgJVQgJXYgRXJyb3IgcmVhZGluZyBsaXN0OiAldiIsICJSZWFkV3JpdGVCb29sIiwgcCwgdHJhbnMsIGVyciwgQk9PTF9WQUxVRVMpCiAJfQogCV8sIG9rIDo9IHAuKCpUU2ltcGxlSlNPTlByb3RvY29sKQogCWlmICFvayB7CkBAIC0yMDksMTYgKzI0NywxNiBAQAogCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCB0eXBlICVzICE9IHR5cGUgJXMiLCAiUmVhZFdyaXRlQm9vbCIsIHAsIHRyYW5zLCB0aGV0eXBlLCB0aGV0eXBlMikKIAkJfQogCQlpZiB0aGVsZW4gIT0gdGhlbGVuMiB7Ci0JCQl0LkVycm9yZigiJXM6ICVUICVUIGxlbiAlcyAhPSBsZW4gJXMiLCAiUmVhZFdyaXRlQm9vbCIsIHAsIHRyYW5zLCB0aGVsZW4sIHRoZWxlbjIpCisJCQl0LkVycm9yZigiJXM6ICVUICVUIGxlbiAldiAhPSBsZW4gJXYiLCAiUmVhZFdyaXRlQm9vbCIsIHAsIHRyYW5zLCB0aGVsZW4sIHRoZWxlbjIpCiAJCX0KIAl9CiAJZm9yIGssIHYgOj0gcmFuZ2UgQk9PTF9WQUxVRVMgewogCQl2YWx1ZSwgZXJyIDo9IHAuUmVhZEJvb2woKQogCQlpZiBlcnIgIT0gbmlsIHsKLQkJCXQuRXJyb3JmKCIlczogJVQgJVQgJXEgRXJyb3IgcmVhZGluZyBib29sIGF0IGluZGV4ICVkOiAlcSIsICJSZWFkV3JpdGVCb29sIiwgcCwgdHJhbnMsIGVyciwgaywgdikKKwkJCXQuRXJyb3JmKCIlczogJVQgJVQgJXYgRXJyb3IgcmVhZGluZyBib29sIGF0IGluZGV4ICV2OiAldiIsICJSZWFkV3JpdGVCb29sIiwgcCwgdHJhbnMsIGVyciwgaywgdikKIAkJfQogCQlpZiB2ICE9IHZhbHVlIHsKLQkJCXQuRXJyb3JmKCIlczogaW5kZXggJWQgJXEgJXEgJXEgIT0gJXEiLCAiUmVhZFdyaXRlQm9vbCIsIGssIHAsIHRyYW5zLCB2LCB2YWx1ZSkKKwkJCXQuRXJyb3JmKCIlczogaW5kZXggJXYgJXYgJXYgJXYgIT0gJXYiLCAiUmVhZFdyaXRlQm9vbCIsIGssIHAsIHRyYW5zLCB2LCB2YWx1ZSkKIAkJfQogCX0KIAllcnIgPSBwLlJlYWRMaXN0RW5kKCkKQEAgLTI0NCw3ICsyODIsNyBAQAogCWlmIGVyciAhPSBuaWwgewogCQl0LkVycm9yZigiJXM6ICVUICVUICVxIEVycm9yIHdyaXRpbmcgbGlzdCBlbmQ6ICVxIiwgIlJlYWRXcml0ZUJ5dGUiLCBwLCB0cmFucywgZXJyLCBCWVRFX1ZBTFVFUykKIAl9Ci0JZXJyID0gcC5GbHVzaCgpCisJZXJyID0gcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKIAlpZiBlcnIgIT0gbmlsIHsKIAkJdC5FcnJvcmYoIiVzOiAlVCAlVCAlcSBFcnJvciBmbHVzaGluZyBsaXN0IG9mIGJ5dGVzOiAlcSIsICJSZWFkV3JpdGVCeXRlIiwgcCwgdHJhbnMsIGVyciwgQllURV9WQUxVRVMpCiAJfQpAQCAtMjU4LDcgKzI5Niw3IEBACiAJCQl0LkVycm9yZigiJXM6ICVUICVUIHR5cGUgJXMgIT0gdHlwZSAlcyIsICJSZWFkV3JpdGVCeXRlIiwgcCwgdHJhbnMsIHRoZXR5cGUsIHRoZXR5cGUyKQogCQl9CiAJCWlmIHRoZWxlbiAhPSB0aGVsZW4yIHsKLQkJCXQuRXJyb3JmKCIlczogJVQgJVQgbGVuICVzICE9IGxlbiAlcyIsICJSZWFkV3JpdGVCeXRlIiwgcCwgdHJhbnMsIHRoZWxlbiwgdGhlbGVuMikKKwkJCXQuRXJyb3JmKCIlczogJVQgJVQgbGVuICV2ICE9IGxlbiAldiIsICJSZWFkV3JpdGVCeXRlIiwgcCwgdHJhbnMsIHRoZWxlbiwgdGhlbGVuMikKIAkJfQogCX0KIAlmb3IgaywgdiA6PSByYW5nZSBCWVRFX1ZBTFVFUyB7CkBAIC0yODQsNyArMzIyLDcgQEAKIAkJcC5Xcml0ZUkxNih2KQogCX0KIAlwLldyaXRlTGlzdEVuZCgpCi0JcC5GbHVzaCgpCisJcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKIAl0aGV0eXBlMiwgdGhlbGVuMiwgZXJyIDo9IHAuUmVhZExpc3RCZWdpbigpCiAJaWYgZXJyICE9IG5pbCB7CiAJCXQuRXJyb3JmKCIlczogJVQgJVQgJXEgRXJyb3IgcmVhZGluZyBsaXN0OiAlcSIsICJSZWFkV3JpdGVJMTYiLCBwLCB0cmFucywgZXJyLCBJTlQxNl9WQUxVRVMpCkBAIC0yOTUsNyArMzMzLDcgQEAKIAkJCXQuRXJyb3JmKCIlczogJVQgJVQgdHlwZSAlcyAhPSB0eXBlICVzIiwgIlJlYWRXcml0ZUkxNiIsIHAsIHRyYW5zLCB0aGV0eXBlLCB0aGV0eXBlMikKIAkJfQogCQlpZiB0aGVsZW4gIT0gdGhlbGVuMiB7Ci0JCQl0LkVycm9yZigiJXM6ICVUICVUIGxlbiAlcyAhPSBsZW4gJXMiLCAiUmVhZFdyaXRlSTE2IiwgcCwgdHJhbnMsIHRoZWxlbiwgdGhlbGVuMikKKwkJCXQuRXJyb3JmKCIlczogJVQgJVQgbGVuICV2ICE9IGxlbiAldiIsICJSZWFkV3JpdGVJMTYiLCBwLCB0cmFucywgdGhlbGVuLCB0aGVsZW4yKQogCQl9CiAJfQogCWZvciBrLCB2IDo9IHJhbmdlIElOVDE2X1ZBTFVFUyB7CkBAIC0zMjEsNyArMzU5LDcgQEAKIAkJcC5Xcml0ZUkzMih2KQogCX0KIAlwLldyaXRlTGlzdEVuZCgpCi0JcC5GbHVzaCgpCisJcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKIAl0aGV0eXBlMiwgdGhlbGVuMiwgZXJyIDo9IHAuUmVhZExpc3RCZWdpbigpCiAJaWYgZXJyICE9IG5pbCB7CiAJCXQuRXJyb3JmKCIlczogJVQgJVQgJXEgRXJyb3IgcmVhZGluZyBsaXN0OiAlcSIsICJSZWFkV3JpdGVJMzIiLCBwLCB0cmFucywgZXJyLCBJTlQzMl9WQUxVRVMpCkBAIC0zMzIsNyArMzcwLDcgQEAKIAkJCXQuRXJyb3JmKCIlczogJVQgJVQgdHlwZSAlcyAhPSB0eXBlICVzIiwgIlJlYWRXcml0ZUkzMiIsIHAsIHRyYW5zLCB0aGV0eXBlLCB0aGV0eXBlMikKIAkJfQogCQlpZiB0aGVsZW4gIT0gdGhlbGVuMiB7Ci0JCQl0LkVycm9yZigiJXM6ICVUICVUIGxlbiAlcyAhPSBsZW4gJXMiLCAiUmVhZFdyaXRlSTMyIiwgcCwgdHJhbnMsIHRoZWxlbiwgdGhlbGVuMikKKwkJCXQuRXJyb3JmKCIlczogJVQgJVQgbGVuICV2ICE9IGxlbiAldiIsICJSZWFkV3JpdGVJMzIiLCBwLCB0cmFucywgdGhlbGVuLCB0aGVsZW4yKQogCQl9CiAJfQogCWZvciBrLCB2IDo9IHJhbmdlIElOVDMyX1ZBTFVFUyB7CkBAIC0zNTcsNyArMzk1LDcgQEAKIAkJcC5Xcml0ZUk2NCh2KQogCX0KIAlwLldyaXRlTGlzdEVuZCgpCi0JcC5GbHVzaCgpCisJcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKIAl0aGV0eXBlMiwgdGhlbGVuMiwgZXJyIDo9IHAuUmVhZExpc3RCZWdpbigpCiAJaWYgZXJyICE9IG5pbCB7CiAJCXQuRXJyb3JmKCIlczogJVQgJVQgJXEgRXJyb3IgcmVhZGluZyBsaXN0OiAlcSIsICJSZWFkV3JpdGVJNjQiLCBwLCB0cmFucywgZXJyLCBJTlQ2NF9WQUxVRVMpCkBAIC0zNjgsNyArNDA2LDcgQEAKIAkJCXQuRXJyb3JmKCIlczogJVQgJVQgdHlwZSAlcyAhPSB0eXBlICVzIiwgIlJlYWRXcml0ZUk2NCIsIHAsIHRyYW5zLCB0aGV0eXBlLCB0aGV0eXBlMikKIAkJfQogCQlpZiB0aGVsZW4gIT0gdGhlbGVuMiB7Ci0JCQl0LkVycm9yZigiJXM6ICVUICVUIGxlbiAlcyAhPSBsZW4gJXMiLCAiUmVhZFdyaXRlSTY0IiwgcCwgdHJhbnMsIHRoZWxlbiwgdGhlbGVuMikKKwkJCXQuRXJyb3JmKCIlczogJVQgJVQgbGVuICV2ICE9IGxlbiAldiIsICJSZWFkV3JpdGVJNjQiLCBwLCB0cmFucywgdGhlbGVuLCB0aGVsZW4yKQogCQl9CiAJfQogCWZvciBrLCB2IDo9IHJhbmdlIElOVDY0X1ZBTFVFUyB7CkBAIC0zOTMsMjggKzQzMSwyOCBAQAogCQlwLldyaXRlRG91YmxlKHYpCiAJfQogCXAuV3JpdGVMaXN0RW5kKCkKLQlwLkZsdXNoKCkKKwlwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQogCXRoZXR5cGUyLCB0aGVsZW4yLCBlcnIgOj0gcC5SZWFkTGlzdEJlZ2luKCkKIAlpZiBlcnIgIT0gbmlsIHsKLQkJdC5FcnJvcmYoIiVzOiAlVCAlVCAlcSBFcnJvciByZWFkaW5nIGxpc3Q6ICVxIiwgIlJlYWRXcml0ZURvdWJsZSIsIHAsIHRyYW5zLCBlcnIsIERPVUJMRV9WQUxVRVMpCisJCXQuRXJyb3JmKCIlczogJVQgJVQgJXYgRXJyb3IgcmVhZGluZyBsaXN0OiAldiIsICJSZWFkV3JpdGVEb3VibGUiLCBwLCB0cmFucywgZXJyLCBET1VCTEVfVkFMVUVTKQogCX0KIAlpZiB0aGV0eXBlICE9IHRoZXR5cGUyIHsKIAkJdC5FcnJvcmYoIiVzOiAlVCAlVCB0eXBlICVzICE9IHR5cGUgJXMiLCAiUmVhZFdyaXRlRG91YmxlIiwgcCwgdHJhbnMsIHRoZXR5cGUsIHRoZXR5cGUyKQogCX0KIAlpZiB0aGVsZW4gIT0gdGhlbGVuMiB7Ci0JCXQuRXJyb3JmKCIlczogJVQgJVQgbGVuICVzICE9IGxlbiAlcyIsICJSZWFkV3JpdGVEb3VibGUiLCBwLCB0cmFucywgdGhlbGVuLCB0aGVsZW4yKQorCQl0LkVycm9yZigiJXM6ICVUICVUIGxlbiAldiAhPSBsZW4gJXYiLCAiUmVhZFdyaXRlRG91YmxlIiwgcCwgdHJhbnMsIHRoZWxlbiwgdGhlbGVuMikKIAl9CiAJZm9yIGssIHYgOj0gcmFuZ2UgRE9VQkxFX1ZBTFVFUyB7CiAJCXZhbHVlLCBlcnIgOj0gcC5SZWFkRG91YmxlKCkKIAkJaWYgZXJyICE9IG5pbCB7Ci0JCQl0LkVycm9yZigiJXM6ICVUICVUICVxIEVycm9yIHJlYWRpbmcgZG91YmxlIGF0IGluZGV4ICVkOiAlcSIsICJSZWFkV3JpdGVEb3VibGUiLCBwLCB0cmFucywgZXJyLCBrLCB2KQorCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCAlcSBFcnJvciByZWFkaW5nIGRvdWJsZSBhdCBpbmRleCAlZDogJXYiLCAiUmVhZFdyaXRlRG91YmxlIiwgcCwgdHJhbnMsIGVyciwgaywgdikKIAkJfQogCQlpZiBtYXRoLklzTmFOKHYpIHsKIAkJCWlmICFtYXRoLklzTmFOKHZhbHVlKSB7Ci0JCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCBtYXRoLklzTmFOKCVxKSAhPSBtYXRoLklzTmFOKCVxKSIsICJSZWFkV3JpdGVEb3VibGUiLCBwLCB0cmFucywgdiwgdmFsdWUpCisJCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCBtYXRoLklzTmFOKCV2KSAhPSBtYXRoLklzTmFOKCV2KSIsICJSZWFkV3JpdGVEb3VibGUiLCBwLCB0cmFucywgdiwgdmFsdWUpCiAJCQl9CiAJCX0gZWxzZSBpZiB2ICE9IHZhbHVlIHsKLQkJCXQuRXJyb3JmKCIlczogJVQgJVQgJXYgIT0gJXEiLCAiUmVhZFdyaXRlRG91YmxlIiwgcCwgdHJhbnMsIHYsIHZhbHVlKQorCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCAldiAhPSAldiIsICJSZWFkV3JpdGVEb3VibGUiLCBwLCB0cmFucywgdiwgdmFsdWUpCiAJCX0KIAl9CiAJZXJyID0gcC5SZWFkTGlzdEVuZCgpCkBAIC00MzEsNyArNDY5LDcgQEAKIAkJcC5Xcml0ZVN0cmluZyh2KQogCX0KIAlwLldyaXRlTGlzdEVuZCgpCi0JcC5GbHVzaCgpCisJcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKIAl0aGV0eXBlMiwgdGhlbGVuMiwgZXJyIDo9IHAuUmVhZExpc3RCZWdpbigpCiAJaWYgZXJyICE9IG5pbCB7CiAJCXQuRXJyb3JmKCIlczogJVQgJVQgJXEgRXJyb3IgcmVhZGluZyBsaXN0OiAlcSIsICJSZWFkV3JpdGVTdHJpbmciLCBwLCB0cmFucywgZXJyLCBTVFJJTkdfVkFMVUVTKQpAQCAtNDQyLDcgKzQ4MCw3IEBACiAJCQl0LkVycm9yZigiJXM6ICVUICVUIHR5cGUgJXMgIT0gdHlwZSAlcyIsICJSZWFkV3JpdGVTdHJpbmciLCBwLCB0cmFucywgdGhldHlwZSwgdGhldHlwZTIpCiAJCX0KIAkJaWYgdGhlbGVuICE9IHRoZWxlbjIgewotCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCBsZW4gJXMgIT0gbGVuICVzIiwgIlJlYWRXcml0ZVN0cmluZyIsIHAsIHRyYW5zLCB0aGVsZW4sIHRoZWxlbjIpCisJCQl0LkVycm9yZigiJXM6ICVUICVUIGxlbiAldiAhPSBsZW4gJXYiLCAiUmVhZFdyaXRlU3RyaW5nIiwgcCwgdHJhbnMsIHRoZWxlbiwgdGhlbGVuMikKIAkJfQogCX0KIAlmb3IgaywgdiA6PSByYW5nZSBTVFJJTkdfVkFMVUVTIHsKQEAgLTQ1MSw3ICs0ODksNyBAQAogCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCAlcSBFcnJvciByZWFkaW5nIHN0cmluZyBhdCBpbmRleCAlZDogJXEiLCAiUmVhZFdyaXRlU3RyaW5nIiwgcCwgdHJhbnMsIGVyciwgaywgdikKIAkJfQogCQlpZiB2ICE9IHZhbHVlIHsKLQkJCXQuRXJyb3JmKCIlczogJVQgJVQgJWQgIT0gJWQiLCAiUmVhZFdyaXRlU3RyaW5nIiwgcCwgdHJhbnMsIHYsIHZhbHVlKQorCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCAldiAhPSAldiIsICJSZWFkV3JpdGVTdHJpbmciLCBwLCB0cmFucywgdiwgdmFsdWUpCiAJCX0KIAl9CiAJaWYgZXJyICE9IG5pbCB7CkBAIC00NjIsNyArNTAwLDcgQEAKIGZ1bmMgUmVhZFdyaXRlQmluYXJ5KHQgdGVzdGluZy5UQiwgcCBUUHJvdG9jb2wsIHRyYW5zIFRUcmFuc3BvcnQpIHsKIAl2IDo9IHByb3RvY29sX2JkYXRhCiAJcC5Xcml0ZUJpbmFyeSh2KQotCXAuRmx1c2goKQorCXAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCiAJdmFsdWUsIGVyciA6PSBwLlJlYWRCaW5hcnkoKQogCWlmIGVyciAhPSBuaWwgewogCQl0LkVycm9yZigiJXM6ICVUICVUIFVuYWJsZSB0byByZWFkIGJpbmFyeTogJXMiLCAiUmVhZFdyaXRlQmluYXJ5IiwgcCwgdHJhbnMsIGVyci5FcnJvcigpKQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9yaWNoX3RyYW5zcG9ydC5nbyBiL2xpYi9nby90aHJpZnQvcmljaF90cmFuc3BvcnQuZ28KaW5kZXggZDcyNjhkOS4uNDAyNWJlYiAxMDA2NDQKLS0tIGEvbGliL2dvL3RocmlmdC9yaWNoX3RyYW5zcG9ydC5nbworKysgYi9saWIvZ28vdGhyaWZ0L3JpY2hfdHJhbnNwb3J0LmdvCkBAIC00Miw2ICs0MiwxMCBAQAogCXJldHVybiByLldyaXRlKFtdYnl0ZShzKSkKIH0KIAorZnVuYyAociAqUmljaFRyYW5zcG9ydCkgUmVtYWluaW5nQnl0ZXMoKSAobnVtX2J5dGVzIHVpbnQ2NCkgeworCXJldHVybiByLlRUcmFuc3BvcnQuUmVtYWluaW5nQnl0ZXMoKQorfQorCiBmdW5jIHJlYWRCeXRlKHIgaW8uUmVhZGVyKSAoYyBieXRlLCBlcnIgZXJyb3IpIHsKIAl2IDo9IFsxXWJ5dGV7MH0KIAluLCBlcnIgOj0gci5SZWFkKHZbMDoxXSkKZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvcmljaF90cmFuc3BvcnRfdGVzdC5nbyBiL2xpYi9nby90aHJpZnQvcmljaF90cmFuc3BvcnRfdGVzdC5nbwppbmRleCA0MTUxM2Y4Li4yNWMzZmQ1IDEwMDY0NAotLS0gYS9saWIvZ28vdGhyaWZ0L3JpY2hfdHJhbnNwb3J0X3Rlc3QuZ28KKysrIGIvbGliL2dvL3RocmlmdC9yaWNoX3RyYW5zcG9ydF90ZXN0LmdvCkBAIC0zNyw3ICszNywxMSBAQAogCQlOZXdUSHR0cFBvc3RDbGllbnRUcmFuc3BvcnRGYWN0b3J5KCJodHRwOi8vMTI3LjAuMC4xIiksCiAJfQogCWZvciBfLCB0ZiA6PSByYW5nZSB0cmFuc3BvcnRzIHsKLQkJdHJhbnMgOj0gdGYuR2V0VHJhbnNwb3J0KG5pbCkKKwkJdHJhbnMsIGVyciA6PSB0Zi5HZXRUcmFuc3BvcnQobmlsKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXQuRXJyb3IoZXJyKQorCQkJY29udGludWUKKwkJfQogCQlfLCBvayA6PSB0cmFucy4oVFJpY2hUcmFuc3BvcnQpCiAJCWlmICFvayB7CiAJCQl0LkVycm9yZigiVHJhbnNwb3J0ICVzIGRvZXMgbm90IGltcGxlbWVudCBUUmljaFRyYW5zcG9ydCBpbnRlcmZhY2UiLCByZWZsZWN0LlZhbHVlT2YodHJhbnMpKQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9zZXJpYWxpemVyLmdvIGIvbGliL2dvL3RocmlmdC9zZXJpYWxpemVyLmdvCmluZGV4IDc3MTIyMjkuLjFmZjRkMzcgMTAwNjQ0Ci0tLSBhL2xpYi9nby90aHJpZnQvc2VyaWFsaXplci5nbworKysgYi9saWIvZ28vdGhyaWZ0L3NlcmlhbGl6ZXIuZ28KQEAgLTE5LDYgKzE5LDEwIEBACiAKIHBhY2thZ2UgdGhyaWZ0CiAKK2ltcG9ydCAoCisJImNvbnRleHQiCispCisKIHR5cGUgVFNlcmlhbGl6ZXIgc3RydWN0IHsKIAlUcmFuc3BvcnQgKlRNZW1vcnlCdWZmZXIKIAlQcm90b2NvbCAgVFByb3RvY29sCkBAIC0zOCwzNSArNDIsMzUgQEAKIAkJcHJvdG9jb2x9CiB9CiAKLWZ1bmMgKHQgKlRTZXJpYWxpemVyKSBXcml0ZVN0cmluZyhtc2cgVFN0cnVjdCkgKHMgc3RyaW5nLCBlcnIgZXJyb3IpIHsKK2Z1bmMgKHQgKlRTZXJpYWxpemVyKSBXcml0ZVN0cmluZyhjdHggY29udGV4dC5Db250ZXh0LCBtc2cgVFN0cnVjdCkgKHMgc3RyaW5nLCBlcnIgZXJyb3IpIHsKIAl0LlRyYW5zcG9ydC5SZXNldCgpCiAKIAlpZiBlcnIgPSBtc2cuV3JpdGUodC5Qcm90b2NvbCk7IGVyciAhPSBuaWwgewogCQlyZXR1cm4KIAl9CiAKLQlpZiBlcnIgPSB0LlByb3RvY29sLkZsdXNoKCk7IGVyciAhPSBuaWwgeworCWlmIGVyciA9IHQuUHJvdG9jb2wuRmx1c2goY3R4KTsgZXJyICE9IG5pbCB7CiAJCXJldHVybgogCX0KLQlpZiBlcnIgPSB0LlRyYW5zcG9ydC5GbHVzaCgpOyBlcnIgIT0gbmlsIHsKKwlpZiBlcnIgPSB0LlRyYW5zcG9ydC5GbHVzaChjdHgpOyBlcnIgIT0gbmlsIHsKIAkJcmV0dXJuCiAJfQogCiAJcmV0dXJuIHQuVHJhbnNwb3J0LlN0cmluZygpLCBuaWwKIH0KIAotZnVuYyAodCAqVFNlcmlhbGl6ZXIpIFdyaXRlKG1zZyBUU3RydWN0KSAoYiBbXWJ5dGUsIGVyciBlcnJvcikgeworZnVuYyAodCAqVFNlcmlhbGl6ZXIpIFdyaXRlKGN0eCBjb250ZXh0LkNvbnRleHQsIG1zZyBUU3RydWN0KSAoYiBbXWJ5dGUsIGVyciBlcnJvcikgewogCXQuVHJhbnNwb3J0LlJlc2V0KCkKIAogCWlmIGVyciA9IG1zZy5Xcml0ZSh0LlByb3RvY29sKTsgZXJyICE9IG5pbCB7CiAJCXJldHVybgogCX0KIAotCWlmIGVyciA9IHQuUHJvdG9jb2wuRmx1c2goKTsgZXJyICE9IG5pbCB7CisJaWYgZXJyID0gdC5Qcm90b2NvbC5GbHVzaChjdHgpOyBlcnIgIT0gbmlsIHsKIAkJcmV0dXJuCiAJfQogCi0JaWYgZXJyID0gdC5UcmFuc3BvcnQuRmx1c2goKTsgZXJyICE9IG5pbCB7CisJaWYgZXJyID0gdC5UcmFuc3BvcnQuRmx1c2goY3R4KTsgZXJyICE9IG5pbCB7CiAJCXJldHVybgogCX0KIApkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9zZXJpYWxpemVyX3Rlc3QuZ28gYi9saWIvZ28vdGhyaWZ0L3NlcmlhbGl6ZXJfdGVzdC5nbwppbmRleCAwZjNmN2Q3Li4zMjIyN2VmIDEwMDY0NAotLS0gYS9saWIvZ28vdGhyaWZ0L3NlcmlhbGl6ZXJfdGVzdC5nbworKysgYi9saWIvZ28vdGhyaWZ0L3NlcmlhbGl6ZXJfdGVzdC5nbwpAQCAtMjAsNiArMjAsNyBAQAogcGFja2FnZSB0aHJpZnQKIAogaW1wb3J0ICgKKwkiY29udGV4dCIKIAkiZXJyb3JzIgogCSJmbXQiCiAJInRlc3RpbmciCkBAIC0yOSw3ICszMCw3IEBACiAJR2V0UHJvdG9jb2wodCBUVHJhbnNwb3J0KSBUUHJvdG9jb2wKIH0KIAotZnVuYyBjb21wYXJlU3RydWN0cyhtLCBtMSBUZXN0U3RydWN0KSAoYm9vbCwgZXJyb3IpIHsKK2Z1bmMgY29tcGFyZVN0cnVjdHMobSwgbTEgTXlUZXN0U3RydWN0KSAoYm9vbCwgZXJyb3IpIHsKIAlzd2l0Y2ggewogCWNhc2UgbS5PbiAhPSBtMS5PbjoKIAkJcmV0dXJuIGZhbHNlLCBlcnJvcnMuTmV3KCJCb29sZWFuIG5vdCBlcXVhbCIpCkBAIC02Miw3ICs2Myw3IEBACiAJCXJldHVybiBmYWxzZSwgZXJyb3JzLk5ldygiU3RyaW5nU2V0IHNpemUgbm90IGVxdWFsIikKIAogCWNhc2UgbS5FICE9IG0xLkU6Ci0JCXJldHVybiBmYWxzZSwgZXJyb3JzLk5ldygiVGVzdEVudW0gbm90IGVxdWFsIikKKwkJcmV0dXJuIGZhbHNlLCBlcnJvcnMuTmV3KCJNeVRlc3RFbnVtIG5vdCBlcXVhbCIpCiAKIAlkZWZhdWx0OgogCQlyZXR1cm4gdHJ1ZSwgbmlsCkBAIC03NCw3ICs3NSw3IEBACiBmdW5jIFByb3RvY29sVGVzdDEodGVzdCAqdGVzdGluZy5ULCBwZiBQcm90b2NvbEZhY3RvcnkpIChib29sLCBlcnJvcikgewogCXQgOj0gTmV3VFNlcmlhbGl6ZXIoKQogCXQuUHJvdG9jb2wgPSBwZi5HZXRQcm90b2NvbCh0LlRyYW5zcG9ydCkKLQl2YXIgbSA9IFRlc3RTdHJ1Y3R7fQorCXZhciBtID0gTXlUZXN0U3RydWN0e30KIAltLk9uID0gdHJ1ZQogCW0uQiA9IGludDgoMCkKIAltLkludDE2ID0gMQpAQCAtODUsMTcgKzg2LDE3IEBACiAJbS5CaW4gPSBtYWtlKFtdYnl0ZSwgMTApCiAJbS5TdHJpbmdNYXAgPSBtYWtlKG1hcFtzdHJpbmddc3RyaW5nLCA1KQogCW0uU3RyaW5nTGlzdCA9IG1ha2UoW11zdHJpbmcsIDUpCi0JbS5TdHJpbmdTZXQgPSBtYWtlKG1hcFtzdHJpbmddYm9vbCwgNSkKKwltLlN0cmluZ1NldCA9IG1ha2UobWFwW3N0cmluZ11zdHJ1Y3R7fSwgNSkKIAltLkUgPSAyCiAKLQlzLCBlcnIgOj0gdC5Xcml0ZVN0cmluZygmbSkKKwlzLCBlcnIgOj0gdC5Xcml0ZVN0cmluZyhjb250ZXh0LkJhY2tncm91bmQoKSwgJm0pCiAJaWYgZXJyICE9IG5pbCB7CiAJCXJldHVybiBmYWxzZSwgZXJyb3JzLk5ldyhmbXQuU3ByaW50ZigiVW5hYmxlIHRvIFNlcmlhbGl6ZSBzdHJ1Y3Rcblx0ICVzIiwgZXJyKSkKIAl9CiAKIAl0MSA6PSBOZXdURGVzZXJpYWxpemVyKCkKIAl0MS5Qcm90b2NvbCA9IHBmLkdldFByb3RvY29sKHQxLlRyYW5zcG9ydCkKLQl2YXIgbTEgPSBUZXN0U3RydWN0e30KKwl2YXIgbTEgPSBNeVRlc3RTdHJ1Y3R7fQogCWlmIGVyciA9IHQxLlJlYWRTdHJpbmcoJm0xLCBzKTsgZXJyICE9IG5pbCB7CiAJCXJldHVybiBmYWxzZSwgZXJyb3JzLk5ldyhmbXQuU3ByaW50ZigiVW5hYmxlIHRvIERlc2VyaWFsaXplIHN0cnVjdFxuXHQgJXMiLCBlcnIpKQogCkBAIC0xMDgsNyArMTA5LDcgQEAKIGZ1bmMgUHJvdG9jb2xUZXN0Mih0ZXN0ICp0ZXN0aW5nLlQsIHBmIFByb3RvY29sRmFjdG9yeSkgKGJvb2wsIGVycm9yKSB7CiAJdCA6PSBOZXdUU2VyaWFsaXplcigpCiAJdC5Qcm90b2NvbCA9IHBmLkdldFByb3RvY29sKHQuVHJhbnNwb3J0KQotCXZhciBtID0gVGVzdFN0cnVjdHt9CisJdmFyIG0gPSBNeVRlc3RTdHJ1Y3R7fQogCW0uT24gPSBmYWxzZQogCW0uQiA9IGludDgoMCkKIAltLkludDE2ID0gMQpAQCAtMTE5LDEwICsxMjAsMTAgQEAKIAltLkJpbiA9IG1ha2UoW11ieXRlLCAxMCkKIAltLlN0cmluZ01hcCA9IG1ha2UobWFwW3N0cmluZ11zdHJpbmcsIDUpCiAJbS5TdHJpbmdMaXN0ID0gbWFrZShbXXN0cmluZywgNSkKLQltLlN0cmluZ1NldCA9IG1ha2UobWFwW3N0cmluZ11ib29sLCA1KQorCW0uU3RyaW5nU2V0ID0gbWFrZShtYXBbc3RyaW5nXXN0cnVjdHt9LCA1KQogCW0uRSA9IDIKIAotCXMsIGVyciA6PSB0LldyaXRlU3RyaW5nKCZtKQorCXMsIGVyciA6PSB0LldyaXRlU3RyaW5nKGNvbnRleHQuQmFja2dyb3VuZCgpLCAmbSkKIAlpZiBlcnIgIT0gbmlsIHsKIAkJcmV0dXJuIGZhbHNlLCBlcnJvcnMuTmV3KGZtdC5TcHJpbnRmKCJVbmFibGUgdG8gU2VyaWFsaXplIHN0cnVjdFxuXHQgJXMiLCBlcnIpKQogCkBAIC0xMzAsNyArMTMxLDcgQEAKIAogCXQxIDo9IE5ld1REZXNlcmlhbGl6ZXIoKQogCXQxLlByb3RvY29sID0gcGYuR2V0UHJvdG9jb2wodDEuVHJhbnNwb3J0KQotCXZhciBtMSA9IFRlc3RTdHJ1Y3R7fQorCXZhciBtMSA9IE15VGVzdFN0cnVjdHt9CiAJaWYgZXJyID0gdDEuUmVhZFN0cmluZygmbTEsIHMpOyBlcnIgIT0gbmlsIHsKIAkJcmV0dXJuIGZhbHNlLCBlcnJvcnMuTmV3KGZtdC5TcHJpbnRmKCJVbmFibGUgdG8gRGVzZXJpYWxpemUgc3RydWN0XG5cdCAlcyIsIGVycikpCiAKZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvc2VyaWFsaXplcl90eXBlcy5nbyBiL2xpYi9nby90aHJpZnQvc2VyaWFsaXplcl90eXBlcy5nbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZiY2RlOC4uMDAwMDAwMAotLS0gYS9saWIvZ28vdGhyaWZ0L3NlcmlhbGl6ZXJfdHlwZXMuZ28KKysrIC9kZXYvbnVsbApAQCAtMSw1OTUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIHRocmlmdAotCi0vLyBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMS4wLjAtZGV2KQotLy8gRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lORwotCi0vKiBUSEUgRk9MTE9XSU5HIFRIUklGVCBGSUxFIFdBUyBVU0VEIFRPIENSRUFURSBUSElTCi0KLWVudW0gVGVzdEVudW0gewotCUZJUlNUID0gMSwKLQlTRUNPTkQgPSAyLAotCVRISVJEID0gMywKLQlGT1VSVEggPSA0LAotfQotCi1zdHJ1Y3QgVGVzdFN0cnVjdCB7Ci0JMTogYm9vbCBvbiwKLQkyOiBieXRlIGIsCi0JMzogaTE2IGludDE2LAotCTQ6IGkzMiBpbnQzMiwKLQk1OiBpNjQgaW50NjQsCi0JNjogZG91YmxlIGQsCi0JNzogc3RyaW5nIHN0LAotCTg6IGJpbmFyeSBiaW4sCi0JOTogbWFwPHN0cmluZywgc3RyaW5nPiBzdHJpbmdNYXAsCi0JMTA6IGxpc3Q8c3RyaW5nPiBzdHJpbmdMaXN0LAotCTExOiBzZXQ8c3RyaW5nPiBzdHJpbmdTZXQsCi0JMTI6IFRlc3RFbnVtIGUsCi19Ci0qLwotCi1pbXBvcnQgKAotCSJmbXQiCi0pCi0KLS8vIChuZWVkZWQgdG8gZW5zdXJlIHNhZmV0eSBiZWNhdXNlIG9mIG5haXZlIGltcG9ydCBsaXN0IGNvbnN0cnVjdGlvbi4pCi12YXIgXyA9IFpFUk8KLXZhciBfID0gZm10LlByaW50ZgotCi12YXIgR29VbnVzZWRQcm90ZWN0aW9uX18gaW50Ci0KLXR5cGUgVGVzdEVudW0gaW50NjQKLQotY29uc3QgKAotCVRlc3RFbnVtX0ZJUlNUICBUZXN0RW51bSA9IDEKLQlUZXN0RW51bV9TRUNPTkQgVGVzdEVudW0gPSAyCi0JVGVzdEVudW1fVEhJUkQgIFRlc3RFbnVtID0gMwotCVRlc3RFbnVtX0ZPVVJUSCBUZXN0RW51bSA9IDQKLSkKLQotZnVuYyAocCBUZXN0RW51bSkgU3RyaW5nKCkgc3RyaW5nIHsKLQlzd2l0Y2ggcCB7Ci0JY2FzZSBUZXN0RW51bV9GSVJTVDoKLQkJcmV0dXJuICJUZXN0RW51bV9GSVJTVCIKLQljYXNlIFRlc3RFbnVtX1NFQ09ORDoKLQkJcmV0dXJuICJUZXN0RW51bV9TRUNPTkQiCi0JY2FzZSBUZXN0RW51bV9USElSRDoKLQkJcmV0dXJuICJUZXN0RW51bV9USElSRCIKLQljYXNlIFRlc3RFbnVtX0ZPVVJUSDoKLQkJcmV0dXJuICJUZXN0RW51bV9GT1VSVEgiCi0JfQotCXJldHVybiAiPFVOU0VUPiIKLX0KLQotZnVuYyBUZXN0RW51bUZyb21TdHJpbmcocyBzdHJpbmcpIChUZXN0RW51bSwgZXJyb3IpIHsKLQlzd2l0Y2ggcyB7Ci0JY2FzZSAiVGVzdEVudW1fRklSU1QiOgotCQlyZXR1cm4gVGVzdEVudW1fRklSU1QsIG5pbAotCWNhc2UgIlRlc3RFbnVtX1NFQ09ORCI6Ci0JCXJldHVybiBUZXN0RW51bV9TRUNPTkQsIG5pbAotCWNhc2UgIlRlc3RFbnVtX1RISVJEIjoKLQkJcmV0dXJuIFRlc3RFbnVtX1RISVJELCBuaWwKLQljYXNlICJUZXN0RW51bV9GT1VSVEgiOgotCQlyZXR1cm4gVGVzdEVudW1fRk9VUlRILCBuaWwKLQl9Ci0JcmV0dXJuIFRlc3RFbnVtKDApLCBmbXQuRXJyb3JmKCJub3QgYSB2YWxpZCBUZXN0RW51bSBzdHJpbmciKQotfQotCi1mdW5jIFRlc3RFbnVtUHRyKHYgVGVzdEVudW0pICpUZXN0RW51bSB7IHJldHVybiAmdiB9Ci0KLXR5cGUgVGVzdFN0cnVjdCBzdHJ1Y3QgewotCU9uICAgICAgICAgYm9vbCAgICAgICAgICAgICAgYHRocmlmdDoib24sMSJgCi0JQiAgICAgICAgICBpbnQ4ICAgICAgICAgICAgICBgdGhyaWZ0OiJiLDIiYAotCUludDE2ICAgICAgaW50MTYgICAgICAgICAgICAgYHRocmlmdDoiaW50MTYsMyJgCi0JSW50MzIgICAgICBpbnQzMiAgICAgICAgICAgICBgdGhyaWZ0OiJpbnQzMiw0ImAKLQlJbnQ2NCAgICAgIGludDY0ICAgICAgICAgICAgIGB0aHJpZnQ6ImludDY0LDUiYAotCUQgICAgICAgICAgZmxvYXQ2NCAgICAgICAgICAgYHRocmlmdDoiZCw2ImAKLQlTdCAgICAgICAgIHN0cmluZyAgICAgICAgICAgIGB0aHJpZnQ6InN0LDciYAotCUJpbiAgICAgICAgW11ieXRlICAgICAgICAgICAgYHRocmlmdDoiYmluLDgiYAotCVN0cmluZ01hcCAgbWFwW3N0cmluZ11zdHJpbmcgYHRocmlmdDoic3RyaW5nTWFwLDkiYAotCVN0cmluZ0xpc3QgW11zdHJpbmcgICAgICAgICAgYHRocmlmdDoic3RyaW5nTGlzdCwxMCJgCi0JU3RyaW5nU2V0ICBtYXBbc3RyaW5nXWJvb2wgICBgdGhyaWZ0OiJzdHJpbmdTZXQsMTEiYAotCUUgICAgICAgICAgVGVzdEVudW0gICAgICAgICAgYHRocmlmdDoiZSwxMiJgCi19Ci0KLWZ1bmMgTmV3VGVzdFN0cnVjdCgpICpUZXN0U3RydWN0IHsKLQlydmFsIDo9ICZUZXN0U3RydWN0e30KLQlyZXR1cm4gcnZhbAotfQotCi1mdW5jIChwICpUZXN0U3RydWN0KSBSZWFkKGlwcm90IFRQcm90b2NvbCkgZXJyb3IgewotCWlmIF8sIGVyciA6PSBpcHJvdC5SZWFkU3RydWN0QmVnaW4oKTsgZXJyICE9IG5pbCB7Ci0JCXJldHVybiBmbXQuRXJyb3JmKCIlVCByZWFkIGVycm9yOiAlcyIsIHAsIGVycikKLQl9Ci0JZm9yIHsKLQkJXywgZmllbGRUeXBlSWQsIGZpZWxkSWQsIGVyciA6PSBpcHJvdC5SZWFkRmllbGRCZWdpbigpCi0JCWlmIGVyciAhPSBuaWwgewotCQkJcmV0dXJuIGZtdC5FcnJvcmYoIiVUIGZpZWxkICVkIHJlYWQgZXJyb3I6ICVzIiwgcCwgZmllbGRJZCwgZXJyKQotCQl9Ci0JCWlmIGZpZWxkVHlwZUlkID09IFNUT1AgewotCQkJYnJlYWsKLQkJfQotCQlzd2l0Y2ggZmllbGRJZCB7Ci0JCWNhc2UgMToKLQkJCWlmIGVyciA6PSBwLnJlYWRGaWVsZDEoaXByb3QpOyBlcnIgIT0gbmlsIHsKLQkJCQlyZXR1cm4gZXJyCi0JCQl9Ci0JCWNhc2UgMjoKLQkJCWlmIGVyciA6PSBwLnJlYWRGaWVsZDIoaXByb3QpOyBlcnIgIT0gbmlsIHsKLQkJCQlyZXR1cm4gZXJyCi0JCQl9Ci0JCWNhc2UgMzoKLQkJCWlmIGVyciA6PSBwLnJlYWRGaWVsZDMoaXByb3QpOyBlcnIgIT0gbmlsIHsKLQkJCQlyZXR1cm4gZXJyCi0JCQl9Ci0JCWNhc2UgNDoKLQkJCWlmIGVyciA6PSBwLnJlYWRGaWVsZDQoaXByb3QpOyBlcnIgIT0gbmlsIHsKLQkJCQlyZXR1cm4gZXJyCi0JCQl9Ci0JCWNhc2UgNToKLQkJCWlmIGVyciA6PSBwLnJlYWRGaWVsZDUoaXByb3QpOyBlcnIgIT0gbmlsIHsKLQkJCQlyZXR1cm4gZXJyCi0JCQl9Ci0JCWNhc2UgNjoKLQkJCWlmIGVyciA6PSBwLnJlYWRGaWVsZDYoaXByb3QpOyBlcnIgIT0gbmlsIHsKLQkJCQlyZXR1cm4gZXJyCi0JCQl9Ci0JCWNhc2UgNzoKLQkJCWlmIGVyciA6PSBwLnJlYWRGaWVsZDcoaXByb3QpOyBlcnIgIT0gbmlsIHsKLQkJCQlyZXR1cm4gZXJyCi0JCQl9Ci0JCWNhc2UgODoKLQkJCWlmIGVyciA6PSBwLnJlYWRGaWVsZDgoaXByb3QpOyBlcnIgIT0gbmlsIHsKLQkJCQlyZXR1cm4gZXJyCi0JCQl9Ci0JCWNhc2UgOToKLQkJCWlmIGVyciA6PSBwLnJlYWRGaWVsZDkoaXByb3QpOyBlcnIgIT0gbmlsIHsKLQkJCQlyZXR1cm4gZXJyCi0JCQl9Ci0JCWNhc2UgMTA6Ci0JCQlpZiBlcnIgOj0gcC5yZWFkRmllbGQxMChpcHJvdCk7IGVyciAhPSBuaWwgewotCQkJCXJldHVybiBlcnIKLQkJCX0KLQkJY2FzZSAxMToKLQkJCWlmIGVyciA6PSBwLnJlYWRGaWVsZDExKGlwcm90KTsgZXJyICE9IG5pbCB7Ci0JCQkJcmV0dXJuIGVycgotCQkJfQotCQljYXNlIDEyOgotCQkJaWYgZXJyIDo9IHAucmVhZEZpZWxkMTIoaXByb3QpOyBlcnIgIT0gbmlsIHsKLQkJCQlyZXR1cm4gZXJyCi0JCQl9Ci0JCWRlZmF1bHQ6Ci0JCQlpZiBlcnIgOj0gaXByb3QuU2tpcChmaWVsZFR5cGVJZCk7IGVyciAhPSBuaWwgewotCQkJCXJldHVybiBlcnIKLQkJCX0KLQkJfQotCQlpZiBlcnIgOj0gaXByb3QuUmVhZEZpZWxkRW5kKCk7IGVyciAhPSBuaWwgewotCQkJcmV0dXJuIGVycgotCQl9Ci0JfQotCWlmIGVyciA6PSBpcHJvdC5SZWFkU3RydWN0RW5kKCk7IGVyciAhPSBuaWwgewotCQlyZXR1cm4gZm10LkVycm9yZigiJVQgcmVhZCBzdHJ1Y3QgZW5kIGVycm9yOiAlcyIsIHAsIGVycikKLQl9Ci0JcmV0dXJuIG5pbAotfQotCi1mdW5jIChwICpUZXN0U3RydWN0KSByZWFkRmllbGQxKGlwcm90IFRQcm90b2NvbCkgZXJyb3IgewotCWlmIHYsIGVyciA6PSBpcHJvdC5SZWFkQm9vbCgpOyBlcnIgIT0gbmlsIHsKLQkJcmV0dXJuIGZtdC5FcnJvcmYoImVycm9yIHJlYWRpbmcgZmllbGQgMTogJXMiLCBlcnIpCi0JfSBlbHNlIHsKLQkJcC5PbiA9IHYKLQl9Ci0JcmV0dXJuIG5pbAotfQotCi1mdW5jIChwICpUZXN0U3RydWN0KSByZWFkRmllbGQyKGlwcm90IFRQcm90b2NvbCkgZXJyb3IgewotCWlmIHYsIGVyciA6PSBpcHJvdC5SZWFkQnl0ZSgpOyBlcnIgIT0gbmlsIHsKLQkJcmV0dXJuIGZtdC5FcnJvcmYoImVycm9yIHJlYWRpbmcgZmllbGQgMjogJXMiLCBlcnIpCi0JfSBlbHNlIHsKLQkJdGVtcCA6PSBpbnQ4KHYpCi0JCXAuQiA9IHRlbXAKLQl9Ci0JcmV0dXJuIG5pbAotfQotCi1mdW5jIChwICpUZXN0U3RydWN0KSByZWFkRmllbGQzKGlwcm90IFRQcm90b2NvbCkgZXJyb3IgewotCWlmIHYsIGVyciA6PSBpcHJvdC5SZWFkSTE2KCk7IGVyciAhPSBuaWwgewotCQlyZXR1cm4gZm10LkVycm9yZigiZXJyb3IgcmVhZGluZyBmaWVsZCAzOiAlcyIsIGVycikKLQl9IGVsc2UgewotCQlwLkludDE2ID0gdgotCX0KLQlyZXR1cm4gbmlsCi19Ci0KLWZ1bmMgKHAgKlRlc3RTdHJ1Y3QpIHJlYWRGaWVsZDQoaXByb3QgVFByb3RvY29sKSBlcnJvciB7Ci0JaWYgdiwgZXJyIDo9IGlwcm90LlJlYWRJMzIoKTsgZXJyICE9IG5pbCB7Ci0JCXJldHVybiBmbXQuRXJyb3JmKCJlcnJvciByZWFkaW5nIGZpZWxkIDQ6ICVzIiwgZXJyKQotCX0gZWxzZSB7Ci0JCXAuSW50MzIgPSB2Ci0JfQotCXJldHVybiBuaWwKLX0KLQotZnVuYyAocCAqVGVzdFN0cnVjdCkgcmVhZEZpZWxkNShpcHJvdCBUUHJvdG9jb2wpIGVycm9yIHsKLQlpZiB2LCBlcnIgOj0gaXByb3QuUmVhZEk2NCgpOyBlcnIgIT0gbmlsIHsKLQkJcmV0dXJuIGZtdC5FcnJvcmYoImVycm9yIHJlYWRpbmcgZmllbGQgNTogJXMiLCBlcnIpCi0JfSBlbHNlIHsKLQkJcC5JbnQ2NCA9IHYKLQl9Ci0JcmV0dXJuIG5pbAotfQotCi1mdW5jIChwICpUZXN0U3RydWN0KSByZWFkRmllbGQ2KGlwcm90IFRQcm90b2NvbCkgZXJyb3IgewotCWlmIHYsIGVyciA6PSBpcHJvdC5SZWFkRG91YmxlKCk7IGVyciAhPSBuaWwgewotCQlyZXR1cm4gZm10LkVycm9yZigiZXJyb3IgcmVhZGluZyBmaWVsZCA2OiAlcyIsIGVycikKLQl9IGVsc2UgewotCQlwLkQgPSB2Ci0JfQotCXJldHVybiBuaWwKLX0KLQotZnVuYyAocCAqVGVzdFN0cnVjdCkgcmVhZEZpZWxkNyhpcHJvdCBUUHJvdG9jb2wpIGVycm9yIHsKLQlpZiB2LCBlcnIgOj0gaXByb3QuUmVhZFN0cmluZygpOyBlcnIgIT0gbmlsIHsKLQkJcmV0dXJuIGZtdC5FcnJvcmYoImVycm9yIHJlYWRpbmcgZmllbGQgNzogJXMiLCBlcnIpCi0JfSBlbHNlIHsKLQkJcC5TdCA9IHYKLQl9Ci0JcmV0dXJuIG5pbAotfQotCi1mdW5jIChwICpUZXN0U3RydWN0KSByZWFkRmllbGQ4KGlwcm90IFRQcm90b2NvbCkgZXJyb3IgewotCWlmIHYsIGVyciA6PSBpcHJvdC5SZWFkQmluYXJ5KCk7IGVyciAhPSBuaWwgewotCQlyZXR1cm4gZm10LkVycm9yZigiZXJyb3IgcmVhZGluZyBmaWVsZCA4OiAlcyIsIGVycikKLQl9IGVsc2UgewotCQlwLkJpbiA9IHYKLQl9Ci0JcmV0dXJuIG5pbAotfQotCi1mdW5jIChwICpUZXN0U3RydWN0KSByZWFkRmllbGQ5KGlwcm90IFRQcm90b2NvbCkgZXJyb3IgewotCV8sIF8sIHNpemUsIGVyciA6PSBpcHJvdC5SZWFkTWFwQmVnaW4oKQotCWlmIGVyciAhPSBuaWwgewotCQlyZXR1cm4gZm10LkVycm9yZigiZXJyb3IgcmVhZGluZyBtYXAgYmVnaW46ICVzIikKLQl9Ci0JdE1hcCA6PSBtYWtlKG1hcFtzdHJpbmddc3RyaW5nLCBzaXplKQotCXAuU3RyaW5nTWFwID0gdE1hcAotCWZvciBpIDo9IDA7IGkgPCBzaXplOyBpKysgewotCQl2YXIgX2tleTAgc3RyaW5nCi0JCWlmIHYsIGVyciA6PSBpcHJvdC5SZWFkU3RyaW5nKCk7IGVyciAhPSBuaWwgewotCQkJcmV0dXJuIGZtdC5FcnJvcmYoImVycm9yIHJlYWRpbmcgZmllbGQgMDogJXMiLCBlcnIpCi0JCX0gZWxzZSB7Ci0JCQlfa2V5MCA9IHYKLQkJfQotCQl2YXIgX3ZhbDEgc3RyaW5nCi0JCWlmIHYsIGVyciA6PSBpcHJvdC5SZWFkU3RyaW5nKCk7IGVyciAhPSBuaWwgewotCQkJcmV0dXJuIGZtdC5FcnJvcmYoImVycm9yIHJlYWRpbmcgZmllbGQgMDogJXMiLCBlcnIpCi0JCX0gZWxzZSB7Ci0JCQlfdmFsMSA9IHYKLQkJfQotCQlwLlN0cmluZ01hcFtfa2V5MF0gPSBfdmFsMQotCX0KLQlpZiBlcnIgOj0gaXByb3QuUmVhZE1hcEVuZCgpOyBlcnIgIT0gbmlsIHsKLQkJcmV0dXJuIGZtdC5FcnJvcmYoImVycm9yIHJlYWRpbmcgbWFwIGVuZDogJXMiKQotCX0KLQlyZXR1cm4gbmlsCi19Ci0KLWZ1bmMgKHAgKlRlc3RTdHJ1Y3QpIHJlYWRGaWVsZDEwKGlwcm90IFRQcm90b2NvbCkgZXJyb3IgewotCV8sIHNpemUsIGVyciA6PSBpcHJvdC5SZWFkTGlzdEJlZ2luKCkKLQlpZiBlcnIgIT0gbmlsIHsKLQkJcmV0dXJuIGZtdC5FcnJvcmYoImVycm9yIHJlYWRpbmcgbGlzdCBiZWdpbjogJXMiKQotCX0KLQl0U2xpY2UgOj0gbWFrZShbXXN0cmluZywgMCwgc2l6ZSkKLQlwLlN0cmluZ0xpc3QgPSB0U2xpY2UKLQlmb3IgaSA6PSAwOyBpIDwgc2l6ZTsgaSsrIHsKLQkJdmFyIF9lbGVtMiBzdHJpbmcKLQkJaWYgdiwgZXJyIDo9IGlwcm90LlJlYWRTdHJpbmcoKTsgZXJyICE9IG5pbCB7Ci0JCQlyZXR1cm4gZm10LkVycm9yZigiZXJyb3IgcmVhZGluZyBmaWVsZCAwOiAlcyIsIGVycikKLQkJfSBlbHNlIHsKLQkJCV9lbGVtMiA9IHYKLQkJfQotCQlwLlN0cmluZ0xpc3QgPSBhcHBlbmQocC5TdHJpbmdMaXN0LCBfZWxlbTIpCi0JfQotCWlmIGVyciA6PSBpcHJvdC5SZWFkTGlzdEVuZCgpOyBlcnIgIT0gbmlsIHsKLQkJcmV0dXJuIGZtdC5FcnJvcmYoImVycm9yIHJlYWRpbmcgbGlzdCBlbmQ6ICVzIikKLQl9Ci0JcmV0dXJuIG5pbAotfQotCi1mdW5jIChwICpUZXN0U3RydWN0KSByZWFkRmllbGQxMShpcHJvdCBUUHJvdG9jb2wpIGVycm9yIHsKLQlfLCBzaXplLCBlcnIgOj0gaXByb3QuUmVhZFNldEJlZ2luKCkKLQlpZiBlcnIgIT0gbmlsIHsKLQkJcmV0dXJuIGZtdC5FcnJvcmYoImVycm9yIHJlYWRpbmcgc2V0IGJlZ2luOiAlcyIpCi0JfQotCXRTZXQgOj0gbWFrZShtYXBbc3RyaW5nXWJvb2wsIHNpemUpCi0JcC5TdHJpbmdTZXQgPSB0U2V0Ci0JZm9yIGkgOj0gMDsgaSA8IHNpemU7IGkrKyB7Ci0JCXZhciBfZWxlbTMgc3RyaW5nCi0JCWlmIHYsIGVyciA6PSBpcHJvdC5SZWFkU3RyaW5nKCk7IGVyciAhPSBuaWwgewotCQkJcmV0dXJuIGZtdC5FcnJvcmYoImVycm9yIHJlYWRpbmcgZmllbGQgMDogJXMiLCBlcnIpCi0JCX0gZWxzZSB7Ci0JCQlfZWxlbTMgPSB2Ci0JCX0KLQkJcC5TdHJpbmdTZXRbX2VsZW0zXSA9IHRydWUKLQl9Ci0JaWYgZXJyIDo9IGlwcm90LlJlYWRTZXRFbmQoKTsgZXJyICE9IG5pbCB7Ci0JCXJldHVybiBmbXQuRXJyb3JmKCJlcnJvciByZWFkaW5nIHNldCBlbmQ6ICVzIikKLQl9Ci0JcmV0dXJuIG5pbAotfQotCi1mdW5jIChwICpUZXN0U3RydWN0KSByZWFkRmllbGQxMihpcHJvdCBUUHJvdG9jb2wpIGVycm9yIHsKLQlpZiB2LCBlcnIgOj0gaXByb3QuUmVhZEkzMigpOyBlcnIgIT0gbmlsIHsKLQkJcmV0dXJuIGZtdC5FcnJvcmYoImVycm9yIHJlYWRpbmcgZmllbGQgMTI6ICVzIiwgZXJyKQotCX0gZWxzZSB7Ci0JCXRlbXAgOj0gVGVzdEVudW0odikKLQkJcC5FID0gdGVtcAotCX0KLQlyZXR1cm4gbmlsCi19Ci0KLWZ1bmMgKHAgKlRlc3RTdHJ1Y3QpIFdyaXRlKG9wcm90IFRQcm90b2NvbCkgZXJyb3IgewotCWlmIGVyciA6PSBvcHJvdC5Xcml0ZVN0cnVjdEJlZ2luKCJUZXN0U3RydWN0Iik7IGVyciAhPSBuaWwgewotCQlyZXR1cm4gZm10LkVycm9yZigiJVQgd3JpdGUgc3RydWN0IGJlZ2luIGVycm9yOiAlcyIsIHAsIGVycikKLQl9Ci0JaWYgZXJyIDo9IHAud3JpdGVGaWVsZDEob3Byb3QpOyBlcnIgIT0gbmlsIHsKLQkJcmV0dXJuIGVycgotCX0KLQlpZiBlcnIgOj0gcC53cml0ZUZpZWxkMihvcHJvdCk7IGVyciAhPSBuaWwgewotCQlyZXR1cm4gZXJyCi0JfQotCWlmIGVyciA6PSBwLndyaXRlRmllbGQzKG9wcm90KTsgZXJyICE9IG5pbCB7Ci0JCXJldHVybiBlcnIKLQl9Ci0JaWYgZXJyIDo9IHAud3JpdGVGaWVsZDQob3Byb3QpOyBlcnIgIT0gbmlsIHsKLQkJcmV0dXJuIGVycgotCX0KLQlpZiBlcnIgOj0gcC53cml0ZUZpZWxkNShvcHJvdCk7IGVyciAhPSBuaWwgewotCQlyZXR1cm4gZXJyCi0JfQotCWlmIGVyciA6PSBwLndyaXRlRmllbGQ2KG9wcm90KTsgZXJyICE9IG5pbCB7Ci0JCXJldHVybiBlcnIKLQl9Ci0JaWYgZXJyIDo9IHAud3JpdGVGaWVsZDcob3Byb3QpOyBlcnIgIT0gbmlsIHsKLQkJcmV0dXJuIGVycgotCX0KLQlpZiBlcnIgOj0gcC53cml0ZUZpZWxkOChvcHJvdCk7IGVyciAhPSBuaWwgewotCQlyZXR1cm4gZXJyCi0JfQotCWlmIGVyciA6PSBwLndyaXRlRmllbGQ5KG9wcm90KTsgZXJyICE9IG5pbCB7Ci0JCXJldHVybiBlcnIKLQl9Ci0JaWYgZXJyIDo9IHAud3JpdGVGaWVsZDEwKG9wcm90KTsgZXJyICE9IG5pbCB7Ci0JCXJldHVybiBlcnIKLQl9Ci0JaWYgZXJyIDo9IHAud3JpdGVGaWVsZDExKG9wcm90KTsgZXJyICE9IG5pbCB7Ci0JCXJldHVybiBlcnIKLQl9Ci0JaWYgZXJyIDo9IHAud3JpdGVGaWVsZDEyKG9wcm90KTsgZXJyICE9IG5pbCB7Ci0JCXJldHVybiBlcnIKLQl9Ci0JaWYgZXJyIDo9IG9wcm90LldyaXRlRmllbGRTdG9wKCk7IGVyciAhPSBuaWwgewotCQlyZXR1cm4gZm10LkVycm9yZigid3JpdGUgZmllbGQgc3RvcCBlcnJvcjogJXMiLCBlcnIpCi0JfQotCWlmIGVyciA6PSBvcHJvdC5Xcml0ZVN0cnVjdEVuZCgpOyBlcnIgIT0gbmlsIHsKLQkJcmV0dXJuIGZtdC5FcnJvcmYoIndyaXRlIHN0cnVjdCBzdG9wIGVycm9yOiAlcyIsIGVycikKLQl9Ci0JcmV0dXJuIG5pbAotfQotCi1mdW5jIChwICpUZXN0U3RydWN0KSB3cml0ZUZpZWxkMShvcHJvdCBUUHJvdG9jb2wpIChlcnIgZXJyb3IpIHsKLQlpZiBlcnIgOj0gb3Byb3QuV3JpdGVGaWVsZEJlZ2luKCJvbiIsIEJPT0wsIDEpOyBlcnIgIT0gbmlsIHsKLQkJcmV0dXJuIGZtdC5FcnJvcmYoIiVUIHdyaXRlIGZpZWxkIGJlZ2luIGVycm9yIDE6b246ICVzIiwgcCwgZXJyKQotCX0KLQlpZiBlcnIgOj0gb3Byb3QuV3JpdGVCb29sKGJvb2wocC5PbikpOyBlcnIgIT0gbmlsIHsKLQkJcmV0dXJuIGZtdC5FcnJvcmYoIiVULm9uICgxKSBmaWVsZCB3cml0ZSBlcnJvcjogJXMiLCBwLCBlcnIpCi0JfQotCWlmIGVyciA6PSBvcHJvdC5Xcml0ZUZpZWxkRW5kKCk7IGVyciAhPSBuaWwgewotCQlyZXR1cm4gZm10LkVycm9yZigiJVQgd3JpdGUgZmllbGQgZW5kIGVycm9yIDE6b246ICVzIiwgcCwgZXJyKQotCX0KLQlyZXR1cm4gZXJyCi19Ci0KLWZ1bmMgKHAgKlRlc3RTdHJ1Y3QpIHdyaXRlRmllbGQyKG9wcm90IFRQcm90b2NvbCkgKGVyciBlcnJvcikgewotCWlmIGVyciA6PSBvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oImIiLCBCWVRFLCAyKTsgZXJyICE9IG5pbCB7Ci0JCXJldHVybiBmbXQuRXJyb3JmKCIlVCB3cml0ZSBmaWVsZCBiZWdpbiBlcnJvciAyOmI6ICVzIiwgcCwgZXJyKQotCX0KLQlpZiBlcnIgOj0gb3Byb3QuV3JpdGVCeXRlKGJ5dGUocC5CKSk7IGVyciAhPSBuaWwgewotCQlyZXR1cm4gZm10LkVycm9yZigiJVQuYiAoMikgZmllbGQgd3JpdGUgZXJyb3I6ICVzIiwgcCwgZXJyKQotCX0KLQlpZiBlcnIgOj0gb3Byb3QuV3JpdGVGaWVsZEVuZCgpOyBlcnIgIT0gbmlsIHsKLQkJcmV0dXJuIGZtdC5FcnJvcmYoIiVUIHdyaXRlIGZpZWxkIGVuZCBlcnJvciAyOmI6ICVzIiwgcCwgZXJyKQotCX0KLQlyZXR1cm4gZXJyCi19Ci0KLWZ1bmMgKHAgKlRlc3RTdHJ1Y3QpIHdyaXRlRmllbGQzKG9wcm90IFRQcm90b2NvbCkgKGVyciBlcnJvcikgewotCWlmIGVyciA6PSBvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oImludDE2IiwgSTE2LCAzKTsgZXJyICE9IG5pbCB7Ci0JCXJldHVybiBmbXQuRXJyb3JmKCIlVCB3cml0ZSBmaWVsZCBiZWdpbiBlcnJvciAzOmludDE2OiAlcyIsIHAsIGVycikKLQl9Ci0JaWYgZXJyIDo9IG9wcm90LldyaXRlSTE2KGludDE2KHAuSW50MTYpKTsgZXJyICE9IG5pbCB7Ci0JCXJldHVybiBmbXQuRXJyb3JmKCIlVC5pbnQxNiAoMykgZmllbGQgd3JpdGUgZXJyb3I6ICVzIiwgcCwgZXJyKQotCX0KLQlpZiBlcnIgOj0gb3Byb3QuV3JpdGVGaWVsZEVuZCgpOyBlcnIgIT0gbmlsIHsKLQkJcmV0dXJuIGZtdC5FcnJvcmYoIiVUIHdyaXRlIGZpZWxkIGVuZCBlcnJvciAzOmludDE2OiAlcyIsIHAsIGVycikKLQl9Ci0JcmV0dXJuIGVycgotfQotCi1mdW5jIChwICpUZXN0U3RydWN0KSB3cml0ZUZpZWxkNChvcHJvdCBUUHJvdG9jb2wpIChlcnIgZXJyb3IpIHsKLQlpZiBlcnIgOj0gb3Byb3QuV3JpdGVGaWVsZEJlZ2luKCJpbnQzMiIsIEkzMiwgNCk7IGVyciAhPSBuaWwgewotCQlyZXR1cm4gZm10LkVycm9yZigiJVQgd3JpdGUgZmllbGQgYmVnaW4gZXJyb3IgNDppbnQzMjogJXMiLCBwLCBlcnIpCi0JfQotCWlmIGVyciA6PSBvcHJvdC5Xcml0ZUkzMihpbnQzMihwLkludDMyKSk7IGVyciAhPSBuaWwgewotCQlyZXR1cm4gZm10LkVycm9yZigiJVQuaW50MzIgKDQpIGZpZWxkIHdyaXRlIGVycm9yOiAlcyIsIHAsIGVycikKLQl9Ci0JaWYgZXJyIDo9IG9wcm90LldyaXRlRmllbGRFbmQoKTsgZXJyICE9IG5pbCB7Ci0JCXJldHVybiBmbXQuRXJyb3JmKCIlVCB3cml0ZSBmaWVsZCBlbmQgZXJyb3IgNDppbnQzMjogJXMiLCBwLCBlcnIpCi0JfQotCXJldHVybiBlcnIKLX0KLQotZnVuYyAocCAqVGVzdFN0cnVjdCkgd3JpdGVGaWVsZDUob3Byb3QgVFByb3RvY29sKSAoZXJyIGVycm9yKSB7Ci0JaWYgZXJyIDo9IG9wcm90LldyaXRlRmllbGRCZWdpbigiaW50NjQiLCBJNjQsIDUpOyBlcnIgIT0gbmlsIHsKLQkJcmV0dXJuIGZtdC5FcnJvcmYoIiVUIHdyaXRlIGZpZWxkIGJlZ2luIGVycm9yIDU6aW50NjQ6ICVzIiwgcCwgZXJyKQotCX0KLQlpZiBlcnIgOj0gb3Byb3QuV3JpdGVJNjQoaW50NjQocC5JbnQ2NCkpOyBlcnIgIT0gbmlsIHsKLQkJcmV0dXJuIGZtdC5FcnJvcmYoIiVULmludDY0ICg1KSBmaWVsZCB3cml0ZSBlcnJvcjogJXMiLCBwLCBlcnIpCi0JfQotCWlmIGVyciA6PSBvcHJvdC5Xcml0ZUZpZWxkRW5kKCk7IGVyciAhPSBuaWwgewotCQlyZXR1cm4gZm10LkVycm9yZigiJVQgd3JpdGUgZmllbGQgZW5kIGVycm9yIDU6aW50NjQ6ICVzIiwgcCwgZXJyKQotCX0KLQlyZXR1cm4gZXJyCi19Ci0KLWZ1bmMgKHAgKlRlc3RTdHJ1Y3QpIHdyaXRlRmllbGQ2KG9wcm90IFRQcm90b2NvbCkgKGVyciBlcnJvcikgewotCWlmIGVyciA6PSBvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oImQiLCBET1VCTEUsIDYpOyBlcnIgIT0gbmlsIHsKLQkJcmV0dXJuIGZtdC5FcnJvcmYoIiVUIHdyaXRlIGZpZWxkIGJlZ2luIGVycm9yIDY6ZDogJXMiLCBwLCBlcnIpCi0JfQotCWlmIGVyciA6PSBvcHJvdC5Xcml0ZURvdWJsZShmbG9hdDY0KHAuRCkpOyBlcnIgIT0gbmlsIHsKLQkJcmV0dXJuIGZtdC5FcnJvcmYoIiVULmQgKDYpIGZpZWxkIHdyaXRlIGVycm9yOiAlcyIsIHAsIGVycikKLQl9Ci0JaWYgZXJyIDo9IG9wcm90LldyaXRlRmllbGRFbmQoKTsgZXJyICE9IG5pbCB7Ci0JCXJldHVybiBmbXQuRXJyb3JmKCIlVCB3cml0ZSBmaWVsZCBlbmQgZXJyb3IgNjpkOiAlcyIsIHAsIGVycikKLQl9Ci0JcmV0dXJuIGVycgotfQotCi1mdW5jIChwICpUZXN0U3RydWN0KSB3cml0ZUZpZWxkNyhvcHJvdCBUUHJvdG9jb2wpIChlcnIgZXJyb3IpIHsKLQlpZiBlcnIgOj0gb3Byb3QuV3JpdGVGaWVsZEJlZ2luKCJzdCIsIFNUUklORywgNyk7IGVyciAhPSBuaWwgewotCQlyZXR1cm4gZm10LkVycm9yZigiJVQgd3JpdGUgZmllbGQgYmVnaW4gZXJyb3IgNzpzdDogJXMiLCBwLCBlcnIpCi0JfQotCWlmIGVyciA6PSBvcHJvdC5Xcml0ZVN0cmluZyhzdHJpbmcocC5TdCkpOyBlcnIgIT0gbmlsIHsKLQkJcmV0dXJuIGZtdC5FcnJvcmYoIiVULnN0ICg3KSBmaWVsZCB3cml0ZSBlcnJvcjogJXMiLCBwLCBlcnIpCi0JfQotCWlmIGVyciA6PSBvcHJvdC5Xcml0ZUZpZWxkRW5kKCk7IGVyciAhPSBuaWwgewotCQlyZXR1cm4gZm10LkVycm9yZigiJVQgd3JpdGUgZmllbGQgZW5kIGVycm9yIDc6c3Q6ICVzIiwgcCwgZXJyKQotCX0KLQlyZXR1cm4gZXJyCi19Ci0KLWZ1bmMgKHAgKlRlc3RTdHJ1Y3QpIHdyaXRlRmllbGQ4KG9wcm90IFRQcm90b2NvbCkgKGVyciBlcnJvcikgewotCWlmIHAuQmluICE9IG5pbCB7Ci0JCWlmIGVyciA6PSBvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oImJpbiIsIFNUUklORywgOCk7IGVyciAhPSBuaWwgewotCQkJcmV0dXJuIGZtdC5FcnJvcmYoIiVUIHdyaXRlIGZpZWxkIGJlZ2luIGVycm9yIDg6YmluOiAlcyIsIHAsIGVycikKLQkJfQotCQlpZiBlcnIgOj0gb3Byb3QuV3JpdGVCaW5hcnkocC5CaW4pOyBlcnIgIT0gbmlsIHsKLQkJCXJldHVybiBmbXQuRXJyb3JmKCIlVC5iaW4gKDgpIGZpZWxkIHdyaXRlIGVycm9yOiAlcyIsIHAsIGVycikKLQkJfQotCQlpZiBlcnIgOj0gb3Byb3QuV3JpdGVGaWVsZEVuZCgpOyBlcnIgIT0gbmlsIHsKLQkJCXJldHVybiBmbXQuRXJyb3JmKCIlVCB3cml0ZSBmaWVsZCBlbmQgZXJyb3IgODpiaW46ICVzIiwgcCwgZXJyKQotCQl9Ci0JfQotCXJldHVybiBlcnIKLX0KLQotZnVuYyAocCAqVGVzdFN0cnVjdCkgd3JpdGVGaWVsZDkob3Byb3QgVFByb3RvY29sKSAoZXJyIGVycm9yKSB7Ci0JaWYgcC5TdHJpbmdNYXAgIT0gbmlsIHsKLQkJaWYgZXJyIDo9IG9wcm90LldyaXRlRmllbGRCZWdpbigic3RyaW5nTWFwIiwgTUFQLCA5KTsgZXJyICE9IG5pbCB7Ci0JCQlyZXR1cm4gZm10LkVycm9yZigiJVQgd3JpdGUgZmllbGQgYmVnaW4gZXJyb3IgOTpzdHJpbmdNYXA6ICVzIiwgcCwgZXJyKQotCQl9Ci0JCWlmIGVyciA6PSBvcHJvdC5Xcml0ZU1hcEJlZ2luKFNUUklORywgU1RSSU5HLCBsZW4ocC5TdHJpbmdNYXApKTsgZXJyICE9IG5pbCB7Ci0JCQlyZXR1cm4gZm10LkVycm9yZigiZXJyb3Igd3JpdGluZyBtYXAgYmVnaW46ICVzIikKLQkJfQotCQlmb3IgaywgdiA6PSByYW5nZSBwLlN0cmluZ01hcCB7Ci0JCQlpZiBlcnIgOj0gb3Byb3QuV3JpdGVTdHJpbmcoc3RyaW5nKGspKTsgZXJyICE9IG5pbCB7Ci0JCQkJcmV0dXJuIGZtdC5FcnJvcmYoIiVULiAoMCkgZmllbGQgd3JpdGUgZXJyb3I6ICVzIiwgcCwgZXJyKQotCQkJfQotCQkJaWYgZXJyIDo9IG9wcm90LldyaXRlU3RyaW5nKHN0cmluZyh2KSk7IGVyciAhPSBuaWwgewotCQkJCXJldHVybiBmbXQuRXJyb3JmKCIlVC4gKDApIGZpZWxkIHdyaXRlIGVycm9yOiAlcyIsIHAsIGVycikKLQkJCX0KLQkJfQotCQlpZiBlcnIgOj0gb3Byb3QuV3JpdGVNYXBFbmQoKTsgZXJyICE9IG5pbCB7Ci0JCQlyZXR1cm4gZm10LkVycm9yZigiZXJyb3Igd3JpdGluZyBtYXAgZW5kOiAlcyIpCi0JCX0KLQkJaWYgZXJyIDo9IG9wcm90LldyaXRlRmllbGRFbmQoKTsgZXJyICE9IG5pbCB7Ci0JCQlyZXR1cm4gZm10LkVycm9yZigiJVQgd3JpdGUgZmllbGQgZW5kIGVycm9yIDk6c3RyaW5nTWFwOiAlcyIsIHAsIGVycikKLQkJfQotCX0KLQlyZXR1cm4gZXJyCi19Ci0KLWZ1bmMgKHAgKlRlc3RTdHJ1Y3QpIHdyaXRlRmllbGQxMChvcHJvdCBUUHJvdG9jb2wpIChlcnIgZXJyb3IpIHsKLQlpZiBwLlN0cmluZ0xpc3QgIT0gbmlsIHsKLQkJaWYgZXJyIDo9IG9wcm90LldyaXRlRmllbGRCZWdpbigic3RyaW5nTGlzdCIsIExJU1QsIDEwKTsgZXJyICE9IG5pbCB7Ci0JCQlyZXR1cm4gZm10LkVycm9yZigiJVQgd3JpdGUgZmllbGQgYmVnaW4gZXJyb3IgMTA6c3RyaW5nTGlzdDogJXMiLCBwLCBlcnIpCi0JCX0KLQkJaWYgZXJyIDo9IG9wcm90LldyaXRlTGlzdEJlZ2luKFNUUklORywgbGVuKHAuU3RyaW5nTGlzdCkpOyBlcnIgIT0gbmlsIHsKLQkJCXJldHVybiBmbXQuRXJyb3JmKCJlcnJvciB3cml0aW5nIGxpc3QgYmVnaW46ICVzIikKLQkJfQotCQlmb3IgXywgdiA6PSByYW5nZSBwLlN0cmluZ0xpc3QgewotCQkJaWYgZXJyIDo9IG9wcm90LldyaXRlU3RyaW5nKHN0cmluZyh2KSk7IGVyciAhPSBuaWwgewotCQkJCXJldHVybiBmbXQuRXJyb3JmKCIlVC4gKDApIGZpZWxkIHdyaXRlIGVycm9yOiAlcyIsIHAsIGVycikKLQkJCX0KLQkJfQotCQlpZiBlcnIgOj0gb3Byb3QuV3JpdGVMaXN0RW5kKCk7IGVyciAhPSBuaWwgewotCQkJcmV0dXJuIGZtdC5FcnJvcmYoImVycm9yIHdyaXRpbmcgbGlzdCBlbmQ6ICVzIikKLQkJfQotCQlpZiBlcnIgOj0gb3Byb3QuV3JpdGVGaWVsZEVuZCgpOyBlcnIgIT0gbmlsIHsKLQkJCXJldHVybiBmbXQuRXJyb3JmKCIlVCB3cml0ZSBmaWVsZCBlbmQgZXJyb3IgMTA6c3RyaW5nTGlzdDogJXMiLCBwLCBlcnIpCi0JCX0KLQl9Ci0JcmV0dXJuIGVycgotfQotCi1mdW5jIChwICpUZXN0U3RydWN0KSB3cml0ZUZpZWxkMTEob3Byb3QgVFByb3RvY29sKSAoZXJyIGVycm9yKSB7Ci0JaWYgcC5TdHJpbmdTZXQgIT0gbmlsIHsKLQkJaWYgZXJyIDo9IG9wcm90LldyaXRlRmllbGRCZWdpbigic3RyaW5nU2V0IiwgU0VULCAxMSk7IGVyciAhPSBuaWwgewotCQkJcmV0dXJuIGZtdC5FcnJvcmYoIiVUIHdyaXRlIGZpZWxkIGJlZ2luIGVycm9yIDExOnN0cmluZ1NldDogJXMiLCBwLCBlcnIpCi0JCX0KLQkJaWYgZXJyIDo9IG9wcm90LldyaXRlU2V0QmVnaW4oU1RSSU5HLCBsZW4ocC5TdHJpbmdTZXQpKTsgZXJyICE9IG5pbCB7Ci0JCQlyZXR1cm4gZm10LkVycm9yZigiZXJyb3Igd3JpdGluZyBzZXQgYmVnaW46ICVzIikKLQkJfQotCQlmb3IgdiwgXyA6PSByYW5nZSBwLlN0cmluZ1NldCB7Ci0JCQlpZiBlcnIgOj0gb3Byb3QuV3JpdGVTdHJpbmcoc3RyaW5nKHYpKTsgZXJyICE9IG5pbCB7Ci0JCQkJcmV0dXJuIGZtdC5FcnJvcmYoIiVULiAoMCkgZmllbGQgd3JpdGUgZXJyb3I6ICVzIiwgcCwgZXJyKQotCQkJfQotCQl9Ci0JCWlmIGVyciA6PSBvcHJvdC5Xcml0ZVNldEVuZCgpOyBlcnIgIT0gbmlsIHsKLQkJCXJldHVybiBmbXQuRXJyb3JmKCJlcnJvciB3cml0aW5nIHNldCBlbmQ6ICVzIikKLQkJfQotCQlpZiBlcnIgOj0gb3Byb3QuV3JpdGVGaWVsZEVuZCgpOyBlcnIgIT0gbmlsIHsKLQkJCXJldHVybiBmbXQuRXJyb3JmKCIlVCB3cml0ZSBmaWVsZCBlbmQgZXJyb3IgMTE6c3RyaW5nU2V0OiAlcyIsIHAsIGVycikKLQkJfQotCX0KLQlyZXR1cm4gZXJyCi19Ci0KLWZ1bmMgKHAgKlRlc3RTdHJ1Y3QpIHdyaXRlRmllbGQxMihvcHJvdCBUUHJvdG9jb2wpIChlcnIgZXJyb3IpIHsKLQlpZiBlcnIgOj0gb3Byb3QuV3JpdGVGaWVsZEJlZ2luKCJlIiwgSTMyLCAxMik7IGVyciAhPSBuaWwgewotCQlyZXR1cm4gZm10LkVycm9yZigiJVQgd3JpdGUgZmllbGQgYmVnaW4gZXJyb3IgMTI6ZTogJXMiLCBwLCBlcnIpCi0JfQotCWlmIGVyciA6PSBvcHJvdC5Xcml0ZUkzMihpbnQzMihwLkUpKTsgZXJyICE9IG5pbCB7Ci0JCXJldHVybiBmbXQuRXJyb3JmKCIlVC5lICgxMikgZmllbGQgd3JpdGUgZXJyb3I6ICVzIiwgcCwgZXJyKQotCX0KLQlpZiBlcnIgOj0gb3Byb3QuV3JpdGVGaWVsZEVuZCgpOyBlcnIgIT0gbmlsIHsKLQkJcmV0dXJuIGZtdC5FcnJvcmYoIiVUIHdyaXRlIGZpZWxkIGVuZCBlcnJvciAxMjplOiAlcyIsIHAsIGVycikKLQl9Ci0JcmV0dXJuIGVycgotfQotCi1mdW5jIChwICpUZXN0U3RydWN0KSBTdHJpbmcoKSBzdHJpbmcgewotCWlmIHAgPT0gbmlsIHsKLQkJcmV0dXJuICI8bmlsPiIKLQl9Ci0JcmV0dXJuIGZtdC5TcHJpbnRmKCJUZXN0U3RydWN0KCUrdikiLCAqcCkKLX0KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvc2VyaWFsaXplcl90eXBlc190ZXN0LmdvIGIvbGliL2dvL3RocmlmdC9zZXJpYWxpemVyX3R5cGVzX3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU0NzJiYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvc2VyaWFsaXplcl90eXBlc190ZXN0LmdvCkBAIC0wLDAgKzEsNjMzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKKy8vIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyIChGSVhNRSkKKy8vIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkcKKworLyogVEhFIEZPTExPV0lORyBUSFJJRlQgRklMRSBXQVMgVVNFRCBUTyBDUkVBVEUgVEhJUworCitlbnVtIE15VGVzdEVudW0geworCUZJUlNUID0gMSwKKwlTRUNPTkQgPSAyLAorCVRISVJEID0gMywKKwlGT1VSVEggPSA0LAorfQorCitzdHJ1Y3QgTXlUZXN0U3RydWN0IHsKKwkxOiBib29sIG9uLAorCTI6IGJ5dGUgYiwKKwkzOiBpMTYgaW50MTYsCisJNDogaTMyIGludDMyLAorCTU6IGk2NCBpbnQ2NCwKKwk2OiBkb3VibGUgZCwKKwk3OiBzdHJpbmcgc3QsCisJODogYmluYXJ5IGJpbiwKKwk5OiBtYXA8c3RyaW5nLCBzdHJpbmc+IHN0cmluZ01hcCwKKwkxMDogbGlzdDxzdHJpbmc+IHN0cmluZ0xpc3QsCisJMTE6IHNldDxzdHJpbmc+IHN0cmluZ1NldCwKKwkxMjogTXlUZXN0RW51bSBlLAorfQorKi8KKworaW1wb3J0ICgKKwkiZm10IgorKQorCisvLyAobmVlZGVkIHRvIGVuc3VyZSBzYWZldHkgYmVjYXVzZSBvZiBuYWl2ZSBpbXBvcnQgbGlzdCBjb25zdHJ1Y3Rpb24uKQordmFyIF8gPSBaRVJPCit2YXIgXyA9IGZtdC5QcmludGYKKwordmFyIEdvVW51c2VkUHJvdGVjdGlvbl9fIGludAorCit0eXBlIE15VGVzdEVudW0gaW50NjQKKworY29uc3QgKAorCU15VGVzdEVudW1fRklSU1QgIE15VGVzdEVudW0gPSAxCisJTXlUZXN0RW51bV9TRUNPTkQgTXlUZXN0RW51bSA9IDIKKwlNeVRlc3RFbnVtX1RISVJEICBNeVRlc3RFbnVtID0gMworCU15VGVzdEVudW1fRk9VUlRIIE15VGVzdEVudW0gPSA0CispCisKK2Z1bmMgKHAgTXlUZXN0RW51bSkgU3RyaW5nKCkgc3RyaW5nIHsKKwlzd2l0Y2ggcCB7CisJY2FzZSBNeVRlc3RFbnVtX0ZJUlNUOgorCQlyZXR1cm4gIkZJUlNUIgorCWNhc2UgTXlUZXN0RW51bV9TRUNPTkQ6CisJCXJldHVybiAiU0VDT05EIgorCWNhc2UgTXlUZXN0RW51bV9USElSRDoKKwkJcmV0dXJuICJUSElSRCIKKwljYXNlIE15VGVzdEVudW1fRk9VUlRIOgorCQlyZXR1cm4gIkZPVVJUSCIKKwl9CisJcmV0dXJuICI8VU5TRVQ+IgorfQorCitmdW5jIE15VGVzdEVudW1Gcm9tU3RyaW5nKHMgc3RyaW5nKSAoTXlUZXN0RW51bSwgZXJyb3IpIHsKKwlzd2l0Y2ggcyB7CisJY2FzZSAiRklSU1QiOgorCQlyZXR1cm4gTXlUZXN0RW51bV9GSVJTVCwgbmlsCisJY2FzZSAiU0VDT05EIjoKKwkJcmV0dXJuIE15VGVzdEVudW1fU0VDT05ELCBuaWwKKwljYXNlICJUSElSRCI6CisJCXJldHVybiBNeVRlc3RFbnVtX1RISVJELCBuaWwKKwljYXNlICJGT1VSVEgiOgorCQlyZXR1cm4gTXlUZXN0RW51bV9GT1VSVEgsIG5pbAorCX0KKwlyZXR1cm4gTXlUZXN0RW51bSgwKSwgZm10LkVycm9yZigibm90IGEgdmFsaWQgTXlUZXN0RW51bSBzdHJpbmciKQorfQorCitmdW5jIE15VGVzdEVudW1QdHIodiBNeVRlc3RFbnVtKSAqTXlUZXN0RW51bSB7IHJldHVybiAmdiB9CisKK3R5cGUgTXlUZXN0U3RydWN0IHN0cnVjdCB7CisJT24gICAgICAgICBib29sICAgICAgICAgICAgICAgIGB0aHJpZnQ6Im9uLDEiIGpzb246Im9uImAKKwlCICAgICAgICAgIGludDggICAgICAgICAgICAgICAgYHRocmlmdDoiYiwyIiBqc29uOiJiImAKKwlJbnQxNiAgICAgIGludDE2ICAgICAgICAgICAgICAgYHRocmlmdDoiaW50MTYsMyIganNvbjoiaW50MTYiYAorCUludDMyICAgICAgaW50MzIgICAgICAgICAgICAgICBgdGhyaWZ0OiJpbnQzMiw0IiBqc29uOiJpbnQzMiJgCisJSW50NjQgICAgICBpbnQ2NCAgICAgICAgICAgICAgIGB0aHJpZnQ6ImludDY0LDUiIGpzb246ImludDY0ImAKKwlEICAgICAgICAgIGZsb2F0NjQgICAgICAgICAgICAgYHRocmlmdDoiZCw2IiBqc29uOiJkImAKKwlTdCAgICAgICAgIHN0cmluZyAgICAgICAgICAgICAgYHRocmlmdDoic3QsNyIganNvbjoic3QiYAorCUJpbiAgICAgICAgW11ieXRlICAgICAgICAgICAgICBgdGhyaWZ0OiJiaW4sOCIganNvbjoiYmluImAKKwlTdHJpbmdNYXAgIG1hcFtzdHJpbmddc3RyaW5nICAgYHRocmlmdDoic3RyaW5nTWFwLDkiIGpzb246InN0cmluZ01hcCJgCisJU3RyaW5nTGlzdCBbXXN0cmluZyAgICAgICAgICAgIGB0aHJpZnQ6InN0cmluZ0xpc3QsMTAiIGpzb246InN0cmluZ0xpc3QiYAorCVN0cmluZ1NldCAgbWFwW3N0cmluZ11zdHJ1Y3R7fSBgdGhyaWZ0OiJzdHJpbmdTZXQsMTEiIGpzb246InN0cmluZ1NldCJgCisJRSAgICAgICAgICBNeVRlc3RFbnVtICAgICAgICAgIGB0aHJpZnQ6ImUsMTIiIGpzb246ImUiYAorfQorCitmdW5jIE5ld015VGVzdFN0cnVjdCgpICpNeVRlc3RTdHJ1Y3QgeworCXJldHVybiAmTXlUZXN0U3RydWN0e30KK30KKworZnVuYyAocCAqTXlUZXN0U3RydWN0KSBHZXRPbigpIGJvb2wgeworCXJldHVybiBwLk9uCit9CisKK2Z1bmMgKHAgKk15VGVzdFN0cnVjdCkgR2V0QigpIGludDggeworCXJldHVybiBwLkIKK30KKworZnVuYyAocCAqTXlUZXN0U3RydWN0KSBHZXRJbnQxNigpIGludDE2IHsKKwlyZXR1cm4gcC5JbnQxNgorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIEdldEludDMyKCkgaW50MzIgeworCXJldHVybiBwLkludDMyCit9CisKK2Z1bmMgKHAgKk15VGVzdFN0cnVjdCkgR2V0SW50NjQoKSBpbnQ2NCB7CisJcmV0dXJuIHAuSW50NjQKK30KKworZnVuYyAocCAqTXlUZXN0U3RydWN0KSBHZXREKCkgZmxvYXQ2NCB7CisJcmV0dXJuIHAuRAorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIEdldFN0KCkgc3RyaW5nIHsKKwlyZXR1cm4gcC5TdAorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIEdldEJpbigpIFtdYnl0ZSB7CisJcmV0dXJuIHAuQmluCit9CisKK2Z1bmMgKHAgKk15VGVzdFN0cnVjdCkgR2V0U3RyaW5nTWFwKCkgbWFwW3N0cmluZ11zdHJpbmcgeworCXJldHVybiBwLlN0cmluZ01hcAorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIEdldFN0cmluZ0xpc3QoKSBbXXN0cmluZyB7CisJcmV0dXJuIHAuU3RyaW5nTGlzdAorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIEdldFN0cmluZ1NldCgpIG1hcFtzdHJpbmddc3RydWN0e30geworCXJldHVybiBwLlN0cmluZ1NldAorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIEdldEUoKSBNeVRlc3RFbnVtIHsKKwlyZXR1cm4gcC5FCit9CitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIFJlYWQoaXByb3QgVFByb3RvY29sKSBlcnJvciB7CisJaWYgXywgZXJyIDo9IGlwcm90LlJlYWRTdHJ1Y3RCZWdpbigpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQgcmVhZCBlcnJvcjogIiwgcCksIGVycikKKwl9CisJZm9yIHsKKwkJXywgZmllbGRUeXBlSWQsIGZpZWxkSWQsIGVyciA6PSBpcHJvdC5SZWFkRmllbGRCZWdpbigpCisJCWlmIGVyciAhPSBuaWwgeworCQkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQgZmllbGQgJWQgcmVhZCBlcnJvcjogIiwgcCwgZmllbGRJZCksIGVycikKKwkJfQorCQlpZiBmaWVsZFR5cGVJZCA9PSBTVE9QIHsKKwkJCWJyZWFrCisJCX0KKwkJc3dpdGNoIGZpZWxkSWQgeworCQljYXNlIDE6CisJCQlpZiBlcnIgOj0gcC5yZWFkRmllbGQxKGlwcm90KTsgZXJyICE9IG5pbCB7CisJCQkJcmV0dXJuIGVycgorCQkJfQorCQljYXNlIDI6CisJCQlpZiBlcnIgOj0gcC5yZWFkRmllbGQyKGlwcm90KTsgZXJyICE9IG5pbCB7CisJCQkJcmV0dXJuIGVycgorCQkJfQorCQljYXNlIDM6CisJCQlpZiBlcnIgOj0gcC5yZWFkRmllbGQzKGlwcm90KTsgZXJyICE9IG5pbCB7CisJCQkJcmV0dXJuIGVycgorCQkJfQorCQljYXNlIDQ6CisJCQlpZiBlcnIgOj0gcC5yZWFkRmllbGQ0KGlwcm90KTsgZXJyICE9IG5pbCB7CisJCQkJcmV0dXJuIGVycgorCQkJfQorCQljYXNlIDU6CisJCQlpZiBlcnIgOj0gcC5yZWFkRmllbGQ1KGlwcm90KTsgZXJyICE9IG5pbCB7CisJCQkJcmV0dXJuIGVycgorCQkJfQorCQljYXNlIDY6CisJCQlpZiBlcnIgOj0gcC5yZWFkRmllbGQ2KGlwcm90KTsgZXJyICE9IG5pbCB7CisJCQkJcmV0dXJuIGVycgorCQkJfQorCQljYXNlIDc6CisJCQlpZiBlcnIgOj0gcC5yZWFkRmllbGQ3KGlwcm90KTsgZXJyICE9IG5pbCB7CisJCQkJcmV0dXJuIGVycgorCQkJfQorCQljYXNlIDg6CisJCQlpZiBlcnIgOj0gcC5yZWFkRmllbGQ4KGlwcm90KTsgZXJyICE9IG5pbCB7CisJCQkJcmV0dXJuIGVycgorCQkJfQorCQljYXNlIDk6CisJCQlpZiBlcnIgOj0gcC5yZWFkRmllbGQ5KGlwcm90KTsgZXJyICE9IG5pbCB7CisJCQkJcmV0dXJuIGVycgorCQkJfQorCQljYXNlIDEwOgorCQkJaWYgZXJyIDo9IHAucmVhZEZpZWxkMTAoaXByb3QpOyBlcnIgIT0gbmlsIHsKKwkJCQlyZXR1cm4gZXJyCisJCQl9CisJCWNhc2UgMTE6CisJCQlpZiBlcnIgOj0gcC5yZWFkRmllbGQxMShpcHJvdCk7IGVyciAhPSBuaWwgeworCQkJCXJldHVybiBlcnIKKwkJCX0KKwkJY2FzZSAxMjoKKwkJCWlmIGVyciA6PSBwLnJlYWRGaWVsZDEyKGlwcm90KTsgZXJyICE9IG5pbCB7CisJCQkJcmV0dXJuIGVycgorCQkJfQorCQlkZWZhdWx0OgorCQkJaWYgZXJyIDo9IGlwcm90LlNraXAoZmllbGRUeXBlSWQpOyBlcnIgIT0gbmlsIHsKKwkJCQlyZXR1cm4gZXJyCisJCQl9CisJCX0KKwkJaWYgZXJyIDo9IGlwcm90LlJlYWRGaWVsZEVuZCgpOyBlcnIgIT0gbmlsIHsKKwkJCXJldHVybiBlcnIKKwkJfQorCX0KKwlpZiBlcnIgOj0gaXByb3QuUmVhZFN0cnVjdEVuZCgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQgcmVhZCBzdHJ1Y3QgZW5kIGVycm9yOiAiLCBwKSwgZXJyKQorCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKk15VGVzdFN0cnVjdCkgcmVhZEZpZWxkMShpcHJvdCBUUHJvdG9jb2wpIGVycm9yIHsKKwlpZiB2LCBlcnIgOj0gaXByb3QuUmVhZEJvb2woKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoImVycm9yIHJlYWRpbmcgZmllbGQgMTogIiwgZXJyKQorCX0gZWxzZSB7CisJCXAuT24gPSB2CisJfQorCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqTXlUZXN0U3RydWN0KSByZWFkRmllbGQyKGlwcm90IFRQcm90b2NvbCkgZXJyb3IgeworCWlmIHYsIGVyciA6PSBpcHJvdC5SZWFkQnl0ZSgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcigiZXJyb3IgcmVhZGluZyBmaWVsZCAyOiAiLCBlcnIpCisJfSBlbHNlIHsKKwkJdGVtcCA6PSBpbnQ4KHYpCisJCXAuQiA9IHRlbXAKKwl9CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIHJlYWRGaWVsZDMoaXByb3QgVFByb3RvY29sKSBlcnJvciB7CisJaWYgdiwgZXJyIDo9IGlwcm90LlJlYWRJMTYoKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoImVycm9yIHJlYWRpbmcgZmllbGQgMzogIiwgZXJyKQorCX0gZWxzZSB7CisJCXAuSW50MTYgPSB2CisJfQorCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqTXlUZXN0U3RydWN0KSByZWFkRmllbGQ0KGlwcm90IFRQcm90b2NvbCkgZXJyb3IgeworCWlmIHYsIGVyciA6PSBpcHJvdC5SZWFkSTMyKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKCJlcnJvciByZWFkaW5nIGZpZWxkIDQ6ICIsIGVycikKKwl9IGVsc2UgeworCQlwLkludDMyID0gdgorCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKk15VGVzdFN0cnVjdCkgcmVhZEZpZWxkNShpcHJvdCBUUHJvdG9jb2wpIGVycm9yIHsKKwlpZiB2LCBlcnIgOj0gaXByb3QuUmVhZEk2NCgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcigiZXJyb3IgcmVhZGluZyBmaWVsZCA1OiAiLCBlcnIpCisJfSBlbHNlIHsKKwkJcC5JbnQ2NCA9IHYKKwl9CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIHJlYWRGaWVsZDYoaXByb3QgVFByb3RvY29sKSBlcnJvciB7CisJaWYgdiwgZXJyIDo9IGlwcm90LlJlYWREb3VibGUoKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoImVycm9yIHJlYWRpbmcgZmllbGQgNjogIiwgZXJyKQorCX0gZWxzZSB7CisJCXAuRCA9IHYKKwl9CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIHJlYWRGaWVsZDcoaXByb3QgVFByb3RvY29sKSBlcnJvciB7CisJaWYgdiwgZXJyIDo9IGlwcm90LlJlYWRTdHJpbmcoKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoImVycm9yIHJlYWRpbmcgZmllbGQgNzogIiwgZXJyKQorCX0gZWxzZSB7CisJCXAuU3QgPSB2CisJfQorCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqTXlUZXN0U3RydWN0KSByZWFkRmllbGQ4KGlwcm90IFRQcm90b2NvbCkgZXJyb3IgeworCWlmIHYsIGVyciA6PSBpcHJvdC5SZWFkQmluYXJ5KCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKCJlcnJvciByZWFkaW5nIGZpZWxkIDg6ICIsIGVycikKKwl9IGVsc2UgeworCQlwLkJpbiA9IHYKKwl9CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIHJlYWRGaWVsZDkoaXByb3QgVFByb3RvY29sKSBlcnJvciB7CisJXywgXywgc2l6ZSwgZXJyIDo9IGlwcm90LlJlYWRNYXBCZWdpbigpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoImVycm9yIHJlYWRpbmcgbWFwIGJlZ2luOiAiLCBlcnIpCisJfQorCXRNYXAgOj0gbWFrZShtYXBbc3RyaW5nXXN0cmluZywgc2l6ZSkKKwlwLlN0cmluZ01hcCA9IHRNYXAKKwlmb3IgaSA6PSAwOyBpIDwgc2l6ZTsgaSsrIHsKKwkJdmFyIF9rZXkwIHN0cmluZworCQlpZiB2LCBlcnIgOj0gaXByb3QuUmVhZFN0cmluZygpOyBlcnIgIT0gbmlsIHsKKwkJCXJldHVybiBQcmVwZW5kRXJyb3IoImVycm9yIHJlYWRpbmcgZmllbGQgMDogIiwgZXJyKQorCQl9IGVsc2UgeworCQkJX2tleTAgPSB2CisJCX0KKwkJdmFyIF92YWwxIHN0cmluZworCQlpZiB2LCBlcnIgOj0gaXByb3QuUmVhZFN0cmluZygpOyBlcnIgIT0gbmlsIHsKKwkJCXJldHVybiBQcmVwZW5kRXJyb3IoImVycm9yIHJlYWRpbmcgZmllbGQgMDogIiwgZXJyKQorCQl9IGVsc2UgeworCQkJX3ZhbDEgPSB2CisJCX0KKwkJcC5TdHJpbmdNYXBbX2tleTBdID0gX3ZhbDEKKwl9CisJaWYgZXJyIDo9IGlwcm90LlJlYWRNYXBFbmQoKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoImVycm9yIHJlYWRpbmcgbWFwIGVuZDogIiwgZXJyKQorCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKk15VGVzdFN0cnVjdCkgcmVhZEZpZWxkMTAoaXByb3QgVFByb3RvY29sKSBlcnJvciB7CisJXywgc2l6ZSwgZXJyIDo9IGlwcm90LlJlYWRMaXN0QmVnaW4oKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKCJlcnJvciByZWFkaW5nIGxpc3QgYmVnaW46ICIsIGVycikKKwl9CisJdFNsaWNlIDo9IG1ha2UoW11zdHJpbmcsIDAsIHNpemUpCisJcC5TdHJpbmdMaXN0ID0gdFNsaWNlCisJZm9yIGkgOj0gMDsgaSA8IHNpemU7IGkrKyB7CisJCXZhciBfZWxlbTIgc3RyaW5nCisJCWlmIHYsIGVyciA6PSBpcHJvdC5SZWFkU3RyaW5nKCk7IGVyciAhPSBuaWwgeworCQkJcmV0dXJuIFByZXBlbmRFcnJvcigiZXJyb3IgcmVhZGluZyBmaWVsZCAwOiAiLCBlcnIpCisJCX0gZWxzZSB7CisJCQlfZWxlbTIgPSB2CisJCX0KKwkJcC5TdHJpbmdMaXN0ID0gYXBwZW5kKHAuU3RyaW5nTGlzdCwgX2VsZW0yKQorCX0KKwlpZiBlcnIgOj0gaXByb3QuUmVhZExpc3RFbmQoKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoImVycm9yIHJlYWRpbmcgbGlzdCBlbmQ6ICIsIGVycikKKwl9CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIHJlYWRGaWVsZDExKGlwcm90IFRQcm90b2NvbCkgZXJyb3IgeworCV8sIHNpemUsIGVyciA6PSBpcHJvdC5SZWFkU2V0QmVnaW4oKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKCJlcnJvciByZWFkaW5nIHNldCBiZWdpbjogIiwgZXJyKQorCX0KKwl0U2V0IDo9IG1ha2UobWFwW3N0cmluZ11zdHJ1Y3R7fSwgc2l6ZSkKKwlwLlN0cmluZ1NldCA9IHRTZXQKKwlmb3IgaSA6PSAwOyBpIDwgc2l6ZTsgaSsrIHsKKwkJdmFyIF9lbGVtMyBzdHJpbmcKKwkJaWYgdiwgZXJyIDo9IGlwcm90LlJlYWRTdHJpbmcoKTsgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4gUHJlcGVuZEVycm9yKCJlcnJvciByZWFkaW5nIGZpZWxkIDA6ICIsIGVycikKKwkJfSBlbHNlIHsKKwkJCV9lbGVtMyA9IHYKKwkJfQorCQlwLlN0cmluZ1NldFtfZWxlbTNdID0gc3RydWN0e317fQorCX0KKwlpZiBlcnIgOj0gaXByb3QuUmVhZFNldEVuZCgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcigiZXJyb3IgcmVhZGluZyBzZXQgZW5kOiAiLCBlcnIpCisJfQorCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqTXlUZXN0U3RydWN0KSByZWFkRmllbGQxMihpcHJvdCBUUHJvdG9jb2wpIGVycm9yIHsKKwlpZiB2LCBlcnIgOj0gaXByb3QuUmVhZEkzMigpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcigiZXJyb3IgcmVhZGluZyBmaWVsZCAxMjogIiwgZXJyKQorCX0gZWxzZSB7CisJCXRlbXAgOj0gTXlUZXN0RW51bSh2KQorCQlwLkUgPSB0ZW1wCisJfQorCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqTXlUZXN0U3RydWN0KSBXcml0ZShvcHJvdCBUUHJvdG9jb2wpIGVycm9yIHsKKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVTdHJ1Y3RCZWdpbigiTXlUZXN0U3RydWN0Iik7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVCB3cml0ZSBzdHJ1Y3QgYmVnaW4gZXJyb3I6ICIsIHApLCBlcnIpCisJfQorCWlmIGVyciA6PSBwLndyaXRlRmllbGQxKG9wcm90KTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9CisJaWYgZXJyIDo9IHAud3JpdGVGaWVsZDIob3Byb3QpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKwlpZiBlcnIgOj0gcC53cml0ZUZpZWxkMyhvcHJvdCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQorCWlmIGVyciA6PSBwLndyaXRlRmllbGQ0KG9wcm90KTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9CisJaWYgZXJyIDo9IHAud3JpdGVGaWVsZDUob3Byb3QpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKwlpZiBlcnIgOj0gcC53cml0ZUZpZWxkNihvcHJvdCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQorCWlmIGVyciA6PSBwLndyaXRlRmllbGQ3KG9wcm90KTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9CisJaWYgZXJyIDo9IHAud3JpdGVGaWVsZDgob3Byb3QpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKwlpZiBlcnIgOj0gcC53cml0ZUZpZWxkOShvcHJvdCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQorCWlmIGVyciA6PSBwLndyaXRlRmllbGQxMChvcHJvdCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQorCWlmIGVyciA6PSBwLndyaXRlRmllbGQxMShvcHJvdCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQorCWlmIGVyciA6PSBwLndyaXRlRmllbGQxMihvcHJvdCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQorCWlmIGVyciA6PSBvcHJvdC5Xcml0ZUZpZWxkU3RvcCgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcigid3JpdGUgZmllbGQgc3RvcCBlcnJvcjogIiwgZXJyKQorCX0KKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVTdHJ1Y3RFbmQoKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoIndyaXRlIHN0cnVjdCBzdG9wIGVycm9yOiAiLCBlcnIpCisJfQorCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqTXlUZXN0U3RydWN0KSB3cml0ZUZpZWxkMShvcHJvdCBUUHJvdG9jb2wpIChlcnIgZXJyb3IpIHsKKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVGaWVsZEJlZ2luKCJvbiIsIEJPT0wsIDEpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQgd3JpdGUgZmllbGQgYmVnaW4gZXJyb3IgMTpvbjogIiwgcCksIGVycikKKwl9CisJaWYgZXJyIDo9IG9wcm90LldyaXRlQm9vbChib29sKHAuT24pKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIiVULm9uICgxKSBmaWVsZCB3cml0ZSBlcnJvcjogIiwgcCksIGVycikKKwl9CisJaWYgZXJyIDo9IG9wcm90LldyaXRlRmllbGRFbmQoKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIiVUIHdyaXRlIGZpZWxkIGVuZCBlcnJvciAxOm9uOiAiLCBwKSwgZXJyKQorCX0KKwlyZXR1cm4gZXJyCit9CisKK2Z1bmMgKHAgKk15VGVzdFN0cnVjdCkgd3JpdGVGaWVsZDIob3Byb3QgVFByb3RvY29sKSAoZXJyIGVycm9yKSB7CisJaWYgZXJyIDo9IG9wcm90LldyaXRlRmllbGRCZWdpbigiYiIsIEJZVEUsIDIpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQgd3JpdGUgZmllbGQgYmVnaW4gZXJyb3IgMjpiOiAiLCBwKSwgZXJyKQorCX0KKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVCeXRlKGludDgocC5CKSk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVC5iICgyKSBmaWVsZCB3cml0ZSBlcnJvcjogIiwgcCksIGVycikKKwl9CisJaWYgZXJyIDo9IG9wcm90LldyaXRlRmllbGRFbmQoKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIiVUIHdyaXRlIGZpZWxkIGVuZCBlcnJvciAyOmI6ICIsIHApLCBlcnIpCisJfQorCXJldHVybiBlcnIKK30KKworZnVuYyAocCAqTXlUZXN0U3RydWN0KSB3cml0ZUZpZWxkMyhvcHJvdCBUUHJvdG9jb2wpIChlcnIgZXJyb3IpIHsKKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVGaWVsZEJlZ2luKCJpbnQxNiIsIEkxNiwgMyk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVCB3cml0ZSBmaWVsZCBiZWdpbiBlcnJvciAzOmludDE2OiAiLCBwKSwgZXJyKQorCX0KKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVJMTYoaW50MTYocC5JbnQxNikpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQuaW50MTYgKDMpIGZpZWxkIHdyaXRlIGVycm9yOiAiLCBwKSwgZXJyKQorCX0KKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVGaWVsZEVuZCgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQgd3JpdGUgZmllbGQgZW5kIGVycm9yIDM6aW50MTY6ICIsIHApLCBlcnIpCisJfQorCXJldHVybiBlcnIKK30KKworZnVuYyAocCAqTXlUZXN0U3RydWN0KSB3cml0ZUZpZWxkNChvcHJvdCBUUHJvdG9jb2wpIChlcnIgZXJyb3IpIHsKKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVGaWVsZEJlZ2luKCJpbnQzMiIsIEkzMiwgNCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVCB3cml0ZSBmaWVsZCBiZWdpbiBlcnJvciA0OmludDMyOiAiLCBwKSwgZXJyKQorCX0KKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVJMzIoaW50MzIocC5JbnQzMikpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQuaW50MzIgKDQpIGZpZWxkIHdyaXRlIGVycm9yOiAiLCBwKSwgZXJyKQorCX0KKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVGaWVsZEVuZCgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQgd3JpdGUgZmllbGQgZW5kIGVycm9yIDQ6aW50MzI6ICIsIHApLCBlcnIpCisJfQorCXJldHVybiBlcnIKK30KKworZnVuYyAocCAqTXlUZXN0U3RydWN0KSB3cml0ZUZpZWxkNShvcHJvdCBUUHJvdG9jb2wpIChlcnIgZXJyb3IpIHsKKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVGaWVsZEJlZ2luKCJpbnQ2NCIsIEk2NCwgNSk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVCB3cml0ZSBmaWVsZCBiZWdpbiBlcnJvciA1OmludDY0OiAiLCBwKSwgZXJyKQorCX0KKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVJNjQoaW50NjQocC5JbnQ2NCkpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQuaW50NjQgKDUpIGZpZWxkIHdyaXRlIGVycm9yOiAiLCBwKSwgZXJyKQorCX0KKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVGaWVsZEVuZCgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQgd3JpdGUgZmllbGQgZW5kIGVycm9yIDU6aW50NjQ6ICIsIHApLCBlcnIpCisJfQorCXJldHVybiBlcnIKK30KKworZnVuYyAocCAqTXlUZXN0U3RydWN0KSB3cml0ZUZpZWxkNihvcHJvdCBUUHJvdG9jb2wpIChlcnIgZXJyb3IpIHsKKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVGaWVsZEJlZ2luKCJkIiwgRE9VQkxFLCA2KTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIiVUIHdyaXRlIGZpZWxkIGJlZ2luIGVycm9yIDY6ZDogIiwgcCksIGVycikKKwl9CisJaWYgZXJyIDo9IG9wcm90LldyaXRlRG91YmxlKGZsb2F0NjQocC5EKSk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVC5kICg2KSBmaWVsZCB3cml0ZSBlcnJvcjogIiwgcCksIGVycikKKwl9CisJaWYgZXJyIDo9IG9wcm90LldyaXRlRmllbGRFbmQoKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIiVUIHdyaXRlIGZpZWxkIGVuZCBlcnJvciA2OmQ6ICIsIHApLCBlcnIpCisJfQorCXJldHVybiBlcnIKK30KKworZnVuYyAocCAqTXlUZXN0U3RydWN0KSB3cml0ZUZpZWxkNyhvcHJvdCBUUHJvdG9jb2wpIChlcnIgZXJyb3IpIHsKKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVGaWVsZEJlZ2luKCJzdCIsIFNUUklORywgNyk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVCB3cml0ZSBmaWVsZCBiZWdpbiBlcnJvciA3OnN0OiAiLCBwKSwgZXJyKQorCX0KKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVTdHJpbmcoc3RyaW5nKHAuU3QpKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIiVULnN0ICg3KSBmaWVsZCB3cml0ZSBlcnJvcjogIiwgcCksIGVycikKKwl9CisJaWYgZXJyIDo9IG9wcm90LldyaXRlRmllbGRFbmQoKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIiVUIHdyaXRlIGZpZWxkIGVuZCBlcnJvciA3OnN0OiAiLCBwKSwgZXJyKQorCX0KKwlyZXR1cm4gZXJyCit9CisKK2Z1bmMgKHAgKk15VGVzdFN0cnVjdCkgd3JpdGVGaWVsZDgob3Byb3QgVFByb3RvY29sKSAoZXJyIGVycm9yKSB7CisJaWYgZXJyIDo9IG9wcm90LldyaXRlRmllbGRCZWdpbigiYmluIiwgU1RSSU5HLCA4KTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIiVUIHdyaXRlIGZpZWxkIGJlZ2luIGVycm9yIDg6YmluOiAiLCBwKSwgZXJyKQorCX0KKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVCaW5hcnkocC5CaW4pOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQuYmluICg4KSBmaWVsZCB3cml0ZSBlcnJvcjogIiwgcCksIGVycikKKwl9CisJaWYgZXJyIDo9IG9wcm90LldyaXRlRmllbGRFbmQoKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIiVUIHdyaXRlIGZpZWxkIGVuZCBlcnJvciA4OmJpbjogIiwgcCksIGVycikKKwl9CisJcmV0dXJuIGVycgorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIHdyaXRlRmllbGQ5KG9wcm90IFRQcm90b2NvbCkgKGVyciBlcnJvcikgeworCWlmIGVyciA6PSBvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oInN0cmluZ01hcCIsIE1BUCwgOSk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVCB3cml0ZSBmaWVsZCBiZWdpbiBlcnJvciA5OnN0cmluZ01hcDogIiwgcCksIGVycikKKwl9CisJaWYgZXJyIDo9IG9wcm90LldyaXRlTWFwQmVnaW4oU1RSSU5HLCBTVFJJTkcsIGxlbihwLlN0cmluZ01hcCkpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcigiZXJyb3Igd3JpdGluZyBtYXAgYmVnaW46ICIsIGVycikKKwl9CisJZm9yIGssIHYgOj0gcmFuZ2UgcC5TdHJpbmdNYXAgeworCQlpZiBlcnIgOj0gb3Byb3QuV3JpdGVTdHJpbmcoc3RyaW5nKGspKTsgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVC4gKDApIGZpZWxkIHdyaXRlIGVycm9yOiAiLCBwKSwgZXJyKQorCQl9CisJCWlmIGVyciA6PSBvcHJvdC5Xcml0ZVN0cmluZyhzdHJpbmcodikpOyBlcnIgIT0gbmlsIHsKKwkJCXJldHVybiBQcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIiVULiAoMCkgZmllbGQgd3JpdGUgZXJyb3I6ICIsIHApLCBlcnIpCisJCX0KKwl9CisJaWYgZXJyIDo9IG9wcm90LldyaXRlTWFwRW5kKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKCJlcnJvciB3cml0aW5nIG1hcCBlbmQ6ICIsIGVycikKKwl9CisJaWYgZXJyIDo9IG9wcm90LldyaXRlRmllbGRFbmQoKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIiVUIHdyaXRlIGZpZWxkIGVuZCBlcnJvciA5OnN0cmluZ01hcDogIiwgcCksIGVycikKKwl9CisJcmV0dXJuIGVycgorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIHdyaXRlRmllbGQxMChvcHJvdCBUUHJvdG9jb2wpIChlcnIgZXJyb3IpIHsKKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVGaWVsZEJlZ2luKCJzdHJpbmdMaXN0IiwgTElTVCwgMTApOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQgd3JpdGUgZmllbGQgYmVnaW4gZXJyb3IgMTA6c3RyaW5nTGlzdDogIiwgcCksIGVycikKKwl9CisJaWYgZXJyIDo9IG9wcm90LldyaXRlTGlzdEJlZ2luKFNUUklORywgbGVuKHAuU3RyaW5nTGlzdCkpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcigiZXJyb3Igd3JpdGluZyBsaXN0IGJlZ2luOiAiLCBlcnIpCisJfQorCWZvciBfLCB2IDo9IHJhbmdlIHAuU3RyaW5nTGlzdCB7CisJCWlmIGVyciA6PSBvcHJvdC5Xcml0ZVN0cmluZyhzdHJpbmcodikpOyBlcnIgIT0gbmlsIHsKKwkJCXJldHVybiBQcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIiVULiAoMCkgZmllbGQgd3JpdGUgZXJyb3I6ICIsIHApLCBlcnIpCisJCX0KKwl9CisJaWYgZXJyIDo9IG9wcm90LldyaXRlTGlzdEVuZCgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcigiZXJyb3Igd3JpdGluZyBsaXN0IGVuZDogIiwgZXJyKQorCX0KKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVGaWVsZEVuZCgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQgd3JpdGUgZmllbGQgZW5kIGVycm9yIDEwOnN0cmluZ0xpc3Q6ICIsIHApLCBlcnIpCisJfQorCXJldHVybiBlcnIKK30KKworZnVuYyAocCAqTXlUZXN0U3RydWN0KSB3cml0ZUZpZWxkMTEob3Byb3QgVFByb3RvY29sKSAoZXJyIGVycm9yKSB7CisJaWYgZXJyIDo9IG9wcm90LldyaXRlRmllbGRCZWdpbigic3RyaW5nU2V0IiwgU0VULCAxMSk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVCB3cml0ZSBmaWVsZCBiZWdpbiBlcnJvciAxMTpzdHJpbmdTZXQ6ICIsIHApLCBlcnIpCisJfQorCWlmIGVyciA6PSBvcHJvdC5Xcml0ZVNldEJlZ2luKFNUUklORywgbGVuKHAuU3RyaW5nU2V0KSk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKCJlcnJvciB3cml0aW5nIHNldCBiZWdpbjogIiwgZXJyKQorCX0KKwlmb3IgdiA6PSByYW5nZSBwLlN0cmluZ1NldCB7CisJCWlmIGVyciA6PSBvcHJvdC5Xcml0ZVN0cmluZyhzdHJpbmcodikpOyBlcnIgIT0gbmlsIHsKKwkJCXJldHVybiBQcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIiVULiAoMCkgZmllbGQgd3JpdGUgZXJyb3I6ICIsIHApLCBlcnIpCisJCX0KKwl9CisJaWYgZXJyIDo9IG9wcm90LldyaXRlU2V0RW5kKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKCJlcnJvciB3cml0aW5nIHNldCBlbmQ6ICIsIGVycikKKwl9CisJaWYgZXJyIDo9IG9wcm90LldyaXRlRmllbGRFbmQoKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIiVUIHdyaXRlIGZpZWxkIGVuZCBlcnJvciAxMTpzdHJpbmdTZXQ6ICIsIHApLCBlcnIpCisJfQorCXJldHVybiBlcnIKK30KKworZnVuYyAocCAqTXlUZXN0U3RydWN0KSB3cml0ZUZpZWxkMTIob3Byb3QgVFByb3RvY29sKSAoZXJyIGVycm9yKSB7CisJaWYgZXJyIDo9IG9wcm90LldyaXRlRmllbGRCZWdpbigiZSIsIEkzMiwgMTIpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQgd3JpdGUgZmllbGQgYmVnaW4gZXJyb3IgMTI6ZTogIiwgcCksIGVycikKKwl9CisJaWYgZXJyIDo9IG9wcm90LldyaXRlSTMyKGludDMyKHAuRSkpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQuZSAoMTIpIGZpZWxkIHdyaXRlIGVycm9yOiAiLCBwKSwgZXJyKQorCX0KKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVGaWVsZEVuZCgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQgd3JpdGUgZmllbGQgZW5kIGVycm9yIDEyOmU6ICIsIHApLCBlcnIpCisJfQorCXJldHVybiBlcnIKK30KKworZnVuYyAocCAqTXlUZXN0U3RydWN0KSBTdHJpbmcoKSBzdHJpbmcgeworCWlmIHAgPT0gbmlsIHsKKwkJcmV0dXJuICI8bmlsPiIKKwl9CisJcmV0dXJuIGZtdC5TcHJpbnRmKCJNeVRlc3RTdHJ1Y3QoJSt2KSIsICpwKQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9zZXJ2ZXJfc29ja2V0LmdvIGIvbGliL2dvL3RocmlmdC9zZXJ2ZXJfc29ja2V0LmdvCmluZGV4IDkzNmViMmUuLjdkZDI0YWUgMTAwNjQ0Ci0tLSBhL2xpYi9nby90aHJpZnQvc2VydmVyX3NvY2tldC5nbworKysgYi9saWIvZ28vdGhyaWZ0L3NlcnZlcl9zb2NrZXQuZ28KQEAgLTMzLDEwICszMyw2IEBACiAJLy8gUHJvdGVjdHMgdGhlIGludGVycnVwdGVkIHZhbHVlIHRvIG1ha2UgaXQgdGhyZWFkIHNhZmUuCiAJbXUgICAgICAgICAgc3luYy5SV011dGV4CiAJaW50ZXJydXB0ZWQgYm9vbAotCi0JLy9TaXplIG9mIGJ1ZmZlciB0byB1c2UgZm9yIHNvY2tldC4gRGVmYXVsdHMgdG8gMTAyNC4KLQkvL1NldCB0byAwIHRvIGRpc2FibGUgYnVmZmVycmluZyBzZXJ2ZXIgdHJhbnNwb3J0IGFsdG9nZXRoZXIuCi0JQnVmZmVyU2l6ZSBpbnQKIH0KIAogZnVuYyBOZXdUU2VydmVyU29ja2V0KGxpc3RlbkFkZHIgc3RyaW5nKSAoKlRTZXJ2ZXJTb2NrZXQsIGVycm9yKSB7CkBAIC00OCwxMCArNDQsMTcgQEAKIAlpZiBlcnIgIT0gbmlsIHsKIAkJcmV0dXJuIG5pbCwgZXJyCiAJfQotCXJldHVybiAmVFNlcnZlclNvY2tldHthZGRyOiBhZGRyLCBjbGllbnRUaW1lb3V0OiBjbGllbnRUaW1lb3V0LCBCdWZmZXJTaXplOiAxMDI0fSwgbmlsCisJcmV0dXJuICZUU2VydmVyU29ja2V0e2FkZHI6IGFkZHIsIGNsaWVudFRpbWVvdXQ6IGNsaWVudFRpbWVvdXR9LCBuaWwKK30KKworLy8gQ3JlYXRlcyBhIFRTZXJ2ZXJTb2NrZXQgZnJvbSBhIG5ldC5BZGRyCitmdW5jIE5ld1RTZXJ2ZXJTb2NrZXRGcm9tQWRkclRpbWVvdXQoYWRkciBuZXQuQWRkciwgY2xpZW50VGltZW91dCB0aW1lLkR1cmF0aW9uKSAqVFNlcnZlclNvY2tldCB7CisJcmV0dXJuICZUU2VydmVyU29ja2V0e2FkZHI6IGFkZHIsIGNsaWVudFRpbWVvdXQ6IGNsaWVudFRpbWVvdXR9CiB9CiAKIGZ1bmMgKHAgKlRTZXJ2ZXJTb2NrZXQpIExpc3RlbigpIGVycm9yIHsKKwlwLm11LkxvY2soKQorCWRlZmVyIHAubXUuVW5sb2NrKCkKIAlpZiBwLklzTGlzdGVuaW5nKCkgewogCQlyZXR1cm4gbmlsCiAJfQpAQCAtNzEsMTkgKzc0LDE5IEBACiAJaWYgaW50ZXJydXB0ZWQgewogCQlyZXR1cm4gbmlsLCBlcnJUcmFuc3BvcnRJbnRlcnJ1cHRlZAogCX0KLQlpZiBwLmxpc3RlbmVyID09IG5pbCB7CisKKwlwLm11LkxvY2soKQorCWxpc3RlbmVyIDo9IHAubGlzdGVuZXIKKwlwLm11LlVubG9jaygpCisJaWYgbGlzdGVuZXIgPT0gbmlsIHsKIAkJcmV0dXJuIG5pbCwgTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihOT1RfT1BFTiwgIk5vIHVuZGVybHlpbmcgc2VydmVyIHNvY2tldCIpCiAJfQotCWNvbm4sIGVyciA6PSBwLmxpc3RlbmVyLkFjY2VwdCgpCisKKwljb25uLCBlcnIgOj0gbGlzdGVuZXIuQWNjZXB0KCkKIAlpZiBlcnIgIT0gbmlsIHsKIAkJcmV0dXJuIG5pbCwgTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbkZyb21FcnJvcihlcnIpCiAJfQotCXZhciB0cmFucyBUVHJhbnNwb3J0Ci0JdHJhbnMgPSBOZXdUU29ja2V0RnJvbUNvbm5UaW1lb3V0KGNvbm4sIHAuY2xpZW50VGltZW91dCkKLQlpZiBwLkJ1ZmZlclNpemUgIT0gMCB7Ci0JCXRyYW5zID0gTmV3VEJ1ZmZlcmVkVHJhbnNwb3J0KHRyYW5zLCBwLkJ1ZmZlclNpemUpCi0JfQotCXJldHVybiB0cmFucywgbmlsCisJcmV0dXJuIE5ld1RTb2NrZXRGcm9tQ29ublRpbWVvdXQoY29ubiwgcC5jbGllbnRUaW1lb3V0KSwgbmlsCiB9CiAKIC8vIENoZWNrcyB3aGV0aGVyIHRoZSBzb2NrZXQgaXMgbGlzdGVuaW5nLgpAQCAtOTMsNiArOTYsOCBAQAogCiAvLyBDb25uZWN0cyB0aGUgc29ja2V0LCBjcmVhdGluZyBhIG5ldyBzb2NrZXQgb2JqZWN0IGlmIG5lY2Vzc2FyeS4KIGZ1bmMgKHAgKlRTZXJ2ZXJTb2NrZXQpIE9wZW4oKSBlcnJvciB7CisJcC5tdS5Mb2NrKCkKKwlkZWZlciBwLm11LlVubG9jaygpCiAJaWYgcC5Jc0xpc3RlbmluZygpIHsKIAkJcmV0dXJuIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oQUxSRUFEWV9PUEVOLCAiU2VydmVyIHNvY2tldCBhbHJlYWR5IG9wZW4iKQogCX0KQEAgLTEwNSwyMyArMTEwLDI4IEBACiB9CiAKIGZ1bmMgKHAgKlRTZXJ2ZXJTb2NrZXQpIEFkZHIoKSBuZXQuQWRkciB7CisJaWYgcC5saXN0ZW5lciAhPSBuaWwgeworCQlyZXR1cm4gcC5saXN0ZW5lci5BZGRyKCkKKwl9CiAJcmV0dXJuIHAuYWRkcgogfQogCiBmdW5jIChwICpUU2VydmVyU29ja2V0KSBDbG9zZSgpIGVycm9yIHsKLQlkZWZlciBmdW5jKCkgewotCQlwLmxpc3RlbmVyID0gbmlsCi0JfSgpCisJdmFyIGVyciBlcnJvcgorCXAubXUuTG9jaygpCiAJaWYgcC5Jc0xpc3RlbmluZygpIHsKLQkJcmV0dXJuIHAubGlzdGVuZXIuQ2xvc2UoKQorCQllcnIgPSBwLmxpc3RlbmVyLkNsb3NlKCkKKwkJcC5saXN0ZW5lciA9IG5pbAogCX0KLQlyZXR1cm4gbmlsCisJcC5tdS5VbmxvY2soKQorCXJldHVybiBlcnIKIH0KIAogZnVuYyAocCAqVFNlcnZlclNvY2tldCkgSW50ZXJydXB0KCkgZXJyb3IgewogCXAubXUuTG9jaygpCiAJcC5pbnRlcnJ1cHRlZCA9IHRydWUKIAlwLm11LlVubG9jaygpCisJcC5DbG9zZSgpCiAKIAlyZXR1cm4gbmlsCiB9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3NlcnZlcl9zb2NrZXRfdGVzdC5nbyBiL2xpYi9nby90aHJpZnQvc2VydmVyX3NvY2tldF90ZXN0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxZTE5ODMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L3NlcnZlcl9zb2NrZXRfdGVzdC5nbwpAQCAtMCwwICsxLDYwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJImZtdCIKKwkidGVzdGluZyIKKykKKworZnVuYyBUZXN0U29ja2V0SXNudExpc3RlbmluZ0FmdGVySW50ZXJydXB0KHQgKnRlc3RpbmcuVCkgeworCWhvc3QgOj0gIjEyNy4wLjAuMSIKKwlwb3J0IDo9IDkwOTAKKwlhZGRyIDo9IGZtdC5TcHJpbnRmKCIlczolZCIsIGhvc3QsIHBvcnQpCisKKwlzb2NrZXQgOj0gQ3JlYXRlU2VydmVyU29ja2V0KHQsIGFkZHIpCisJc29ja2V0Lkxpc3RlbigpCisJc29ja2V0LkludGVycnVwdCgpCisKKwluZXdTb2NrZXQgOj0gQ3JlYXRlU2VydmVyU29ja2V0KHQsIGFkZHIpCisJZXJyIDo9IG5ld1NvY2tldC5MaXN0ZW4oKQorCWRlZmVyIG5ld1NvY2tldC5JbnRlcnJ1cHQoKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiRmFpbGVkIHRvIHJlYmluZHM6ICVzIiwgZXJyKQorCX0KK30KKworZnVuYyBUZXN0U29ja2V0Q29uY3VycmVuY3kodCAqdGVzdGluZy5UKSB7CisJaG9zdCA6PSAiMTI3LjAuMC4xIgorCXBvcnQgOj0gOTA5MAorCWFkZHIgOj0gZm10LlNwcmludGYoIiVzOiVkIiwgaG9zdCwgcG9ydCkKKworCXNvY2tldCA6PSBDcmVhdGVTZXJ2ZXJTb2NrZXQodCwgYWRkcikKKwlnbyBmdW5jKCkgeyBzb2NrZXQuTGlzdGVuKCkgfSgpCisJZ28gZnVuYygpIHsgc29ja2V0LkludGVycnVwdCgpIH0oKQorfQorCitmdW5jIENyZWF0ZVNlcnZlclNvY2tldCh0ICp0ZXN0aW5nLlQsIGFkZHIgc3RyaW5nKSAqVFNlcnZlclNvY2tldCB7CisJc29ja2V0LCBlcnIgOj0gTmV3VFNlcnZlclNvY2tldChhZGRyKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiRmFpbGVkIHRvIGNyZWF0ZSBzZXJ2ZXIgc29ja2V0OiAlcyIsIGVycikKKwl9CisJcmV0dXJuIHNvY2tldAorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9zaW1wbGVfanNvbl9wcm90b2NvbC5nbyBiL2xpYi9nby90aHJpZnQvc2ltcGxlX2pzb25fcHJvdG9jb2wuZ28KaW5kZXggNzE1OThhYy4uMmU4YTcxMSAxMDA2NDQKLS0tIGEvbGliL2dvL3RocmlmdC9zaW1wbGVfanNvbl9wcm90b2NvbC5nbworKysgYi9saWIvZ28vdGhyaWZ0L3NpbXBsZV9qc29uX3Byb3RvY29sLmdvCkBAIC0yMiw2ICsyMiw3IEBACiBpbXBvcnQgKAogCSJidWZpbyIKIAkiYnl0ZXMiCisJImNvbnRleHQiCiAJImVuY29kaW5nL2Jhc2U2NCIKIAkiZW5jb2RpbmcvanNvbiIKIAkiZm10IgpAQCAtNjksNyArNzAsNyBAQAogCXRyYW5zIFRUcmFuc3BvcnQKIAogCXBhcnNlQ29udGV4dFN0YWNrIFtdaW50Ci0JZHVtcENvbnRleHQgW11pbnQKKwlkdW1wQ29udGV4dCAgICAgICBbXWludAogCiAJd3JpdGVyICpidWZpby5Xcml0ZXIKIAlyZWFkZXIgKmJ1ZmlvLlJlYWRlcgpAQCAtMTU2LDEzICsxNTcsMTQgQEAKIH0KIAogZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgV3JpdGVNZXNzYWdlQmVnaW4obmFtZSBzdHJpbmcsIHR5cGVJZCBUTWVzc2FnZVR5cGUsIHNlcUlkIGludDMyKSBlcnJvciB7CisJcC5yZXNldENvbnRleHRTdGFjaygpIC8vIFRIUklGVC0zNzM1CiAJaWYgZSA6PSBwLk91dHB1dExpc3RCZWdpbigpOyBlICE9IG5pbCB7CiAJCXJldHVybiBlCiAJfQogCWlmIGUgOj0gcC5Xcml0ZVN0cmluZyhuYW1lKTsgZSAhPSBuaWwgewogCQlyZXR1cm4gZQogCX0KLQlpZiBlIDo9IHAuV3JpdGVCeXRlKGJ5dGUodHlwZUlkKSk7IGUgIT0gbmlsIHsKKwlpZiBlIDo9IHAuV3JpdGVCeXRlKGludDgodHlwZUlkKSk7IGUgIT0gbmlsIHsKIAkJcmV0dXJuIGUKIAl9CiAJaWYgZSA6PSBwLldyaXRlSTMyKHNlcUlkKTsgZSAhPSBuaWwgewpAQCAtMjA0LDEwICsyMDYsMTAgQEAKIAlpZiBlIDo9IHAuT3V0cHV0TGlzdEJlZ2luKCk7IGUgIT0gbmlsIHsKIAkJcmV0dXJuIGUKIAl9Ci0JaWYgZSA6PSBwLldyaXRlQnl0ZShieXRlKGtleVR5cGUpKTsgZSAhPSBuaWwgeworCWlmIGUgOj0gcC5Xcml0ZUJ5dGUoaW50OChrZXlUeXBlKSk7IGUgIT0gbmlsIHsKIAkJcmV0dXJuIGUKIAl9Ci0JaWYgZSA6PSBwLldyaXRlQnl0ZShieXRlKHZhbHVlVHlwZSkpOyBlICE9IG5pbCB7CisJaWYgZSA6PSBwLldyaXRlQnl0ZShpbnQ4KHZhbHVlVHlwZSkpOyBlICE9IG5pbCB7CiAJCXJldHVybiBlCiAJfQogCXJldHVybiBwLldyaXRlSTMyKGludDMyKHNpemUpKQpAQCAtMjM3LDcgKzIzOSw3IEBACiAJcmV0dXJuIHAuT3V0cHV0Qm9vbChiKQogfQogCi1mdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBXcml0ZUJ5dGUoYiBieXRlKSBlcnJvciB7CitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBXcml0ZUJ5dGUoYiBpbnQ4KSBlcnJvciB7CiAJcmV0dXJuIHAuV3JpdGVJMzIoaW50MzIoYikpCiB9CiAKQEAgLTI2OSwyNSArMjcxLDI2IEBACiAJaWYgZSA6PSBwLk91dHB1dFByZVZhbHVlKCk7IGUgIT0gbmlsIHsKIAkJcmV0dXJuIGUKIAl9Ci0JaWYgXywgZSA6PSBwLndyaXRlci5Xcml0ZShKU09OX1FVT1RFX0JZVEVTKTsgZSAhPSBuaWwgeworCWlmIF8sIGUgOj0gcC53cml0ZShKU09OX1FVT1RFX0JZVEVTKTsgZSAhPSBuaWwgewogCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCiAJfQogCXdyaXRlciA6PSBiYXNlNjQuTmV3RW5jb2RlcihiYXNlNjQuU3RkRW5jb2RpbmcsIHAud3JpdGVyKQogCWlmIF8sIGUgOj0gd3JpdGVyLldyaXRlKHYpOyBlICE9IG5pbCB7CisJCXAud3JpdGVyLlJlc2V0KHAudHJhbnMpIC8vIFRIUklGVC0zNzM1CiAJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKIAl9CiAJaWYgZSA6PSB3cml0ZXIuQ2xvc2UoKTsgZSAhPSBuaWwgewogCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCiAJfQotCWlmIF8sIGUgOj0gcC53cml0ZXIuV3JpdGUoSlNPTl9RVU9URV9CWVRFUyk7IGUgIT0gbmlsIHsKKwlpZiBfLCBlIDo9IHAud3JpdGUoSlNPTl9RVU9URV9CWVRFUyk7IGUgIT0gbmlsIHsKIAkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQogCX0KIAlyZXR1cm4gcC5PdXRwdXRQb3N0VmFsdWUoKQogfQogCiAvLyBSZWFkaW5nIG1ldGhvZHMuCi0KIGZ1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFJlYWRNZXNzYWdlQmVnaW4oKSAobmFtZSBzdHJpbmcsIHR5cGVJZCBUTWVzc2FnZVR5cGUsIHNlcUlkIGludDMyLCBlcnIgZXJyb3IpIHsKKwlwLnJlc2V0Q29udGV4dFN0YWNrKCkgLy8gVEhSSUZULTM3MzUKIAlpZiBpc051bGwsIGVyciA6PSBwLlBhcnNlTGlzdEJlZ2luKCk7IGlzTnVsbCB8fCBlcnIgIT0gbmlsIHsKIAkJcmV0dXJuIG5hbWUsIHR5cGVJZCwgc2VxSWQsIGVycgogCX0KQEAgLTMzMCw5ICszMzMsOSBAQAogCQljYXNlIEpTT05fUVVPVEU6CiAJCQlwLnJlYWRlci5SZWFkQnl0ZSgpCiAJCQluYW1lLCBlcnIgOj0gcC5QYXJzZVN0cmluZ0JvZHkoKQotICAgICAgICAgICAgLy8gc2ltcGxlanNvbiBpcyBub3QgbWVhbnQgdG8gYmUgcmVhZCBiYWNrIGludG8gdGhyaWZ0IAotICAgICAgICAgICAgLy8gLSBzZWUgaHR0cDovL3dpa2kuYXBhY2hlLm9yZy90aHJpZnQvVGhyaWZ0VXNhZ2VKYXZhCi0gICAgICAgICAgICAvLyAtIHVzZSBKU09OIGluc3RlYWQKKwkJCS8vIHNpbXBsZWpzb24gaXMgbm90IG1lYW50IHRvIGJlIHJlYWQgYmFjayBpbnRvIHRocmlmdAorCQkJLy8gLSBzZWUgaHR0cDovL3dpa2kuYXBhY2hlLm9yZy90aHJpZnQvVGhyaWZ0VXNhZ2VKYXZhCisJCQkvLyAtIHVzZSBKU09OIGluc3RlYWQKIAkJCWlmIGVyciAhPSBuaWwgewogCQkJCXJldHVybiBuYW1lLCBTVE9QLCAwLCBlcnIKIAkJCX0KQEAgLTQxMSwxNSArNDE0LDIwIEBACiAKIGZ1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFJlYWRCb29sKCkgKGJvb2wsIGVycm9yKSB7CiAJdmFyIHZhbHVlIGJvb2wKKwogCWlmIGVyciA6PSBwLlBhcnNlUHJlVmFsdWUoKTsgZXJyICE9IG5pbCB7CiAJCXJldHVybiB2YWx1ZSwgZXJyCiAJfQotCWIsIF8gOj0gcC5yZWFkZXIuUGVlayhsZW4oSlNPTl9UUlVFKSkKLQlpZiBsZW4oYikgPiAwIHsKLQkJc3dpdGNoIGJbMF0geworCWYsIF8gOj0gcC5yZWFkZXIuUGVlaygxKQorCWlmIGxlbihmKSA+IDAgeworCQlzd2l0Y2ggZlswXSB7CiAJCWNhc2UgSlNPTl9UUlVFWzBdOgorCQkJYiA6PSBtYWtlKFtdYnl0ZSwgbGVuKEpTT05fVFJVRSkpCisJCQlfLCBlcnIgOj0gcC5yZWFkZXIuUmVhZChiKQorCQkJaWYgZXJyICE9IG5pbCB7CisJCQkJcmV0dXJuIGZhbHNlLCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQorCQkJfQogCQkJaWYgc3RyaW5nKGIpID09IHN0cmluZyhKU09OX1RSVUUpIHsKLQkJCQlwLnJlYWRlci5SZWFkKGJbMDpsZW4oSlNPTl9UUlVFKV0pCiAJCQkJdmFsdWUgPSB0cnVlCiAJCQl9IGVsc2UgewogCQkJCWUgOj0gZm10LkVycm9yZigiRXhwZWN0ZWQgXCJ0cnVlXCIgYnV0IGZvdW5kOiAlcyIsIHN0cmluZyhiKSkKQEAgLTQyNyw4ICs0MzUsMTIgQEAKIAkJCX0KIAkJCWJyZWFrCiAJCWNhc2UgSlNPTl9GQUxTRVswXToKLQkJCWlmIHN0cmluZyhiKSA9PSBzdHJpbmcoSlNPTl9GQUxTRVs6bGVuKGIpXSkgewotCQkJCXAucmVhZGVyLlJlYWQoYlswOmxlbihKU09OX0ZBTFNFKV0pCisJCQliIDo9IG1ha2UoW11ieXRlLCBsZW4oSlNPTl9GQUxTRSkpCisJCQlfLCBlcnIgOj0gcC5yZWFkZXIuUmVhZChiKQorCQkJaWYgZXJyICE9IG5pbCB7CisJCQkJcmV0dXJuIGZhbHNlLCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQorCQkJfQorCQkJaWYgc3RyaW5nKGIpID09IHN0cmluZyhKU09OX0ZBTFNFKSB7CiAJCQkJdmFsdWUgPSBmYWxzZQogCQkJfSBlbHNlIHsKIAkJCQllIDo9IGZtdC5FcnJvcmYoIkV4cGVjdGVkIFwiZmFsc2VcIiBidXQgZm91bmQ6ICVzIiwgc3RyaW5nKGIpKQpAQCAtNDM2LDI0ICs0NDgsMjggQEAKIAkJCX0KIAkJCWJyZWFrCiAJCWNhc2UgSlNPTl9OVUxMWzBdOgorCQkJYiA6PSBtYWtlKFtdYnl0ZSwgbGVuKEpTT05fTlVMTCkpCisJCQlfLCBlcnIgOj0gcC5yZWFkZXIuUmVhZChiKQorCQkJaWYgZXJyICE9IG5pbCB7CisJCQkJcmV0dXJuIGZhbHNlLCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQorCQkJfQogCQkJaWYgc3RyaW5nKGIpID09IHN0cmluZyhKU09OX05VTEwpIHsKLQkJCQlwLnJlYWRlci5SZWFkKGJbMDpsZW4oSlNPTl9OVUxMKV0pCiAJCQkJdmFsdWUgPSBmYWxzZQogCQkJfSBlbHNlIHsKIAkJCQllIDo9IGZtdC5FcnJvcmYoIkV4cGVjdGVkIFwibnVsbFwiIGJ1dCBmb3VuZDogJXMiLCBzdHJpbmcoYikpCiAJCQkJcmV0dXJuIHZhbHVlLCBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShJTlZBTElEX0RBVEEsIGUpCiAJCQl9CiAJCWRlZmF1bHQ6Ci0JCQllIDo9IGZtdC5FcnJvcmYoIkV4cGVjdGVkIFwidHJ1ZVwiLCBcImZhbHNlXCIsIG9yIFwibnVsbFwiIGJ1dCBmb3VuZDogJXMiLCBzdHJpbmcoYikpCisJCQllIDo9IGZtdC5FcnJvcmYoIkV4cGVjdGVkIFwidHJ1ZVwiLCBcImZhbHNlXCIsIG9yIFwibnVsbFwiIGJ1dCBmb3VuZDogJXMiLCBzdHJpbmcoZikpCiAJCQlyZXR1cm4gdmFsdWUsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKElOVkFMSURfREFUQSwgZSkKIAkJfQogCX0KIAlyZXR1cm4gdmFsdWUsIHAuUGFyc2VQb3N0VmFsdWUoKQogfQogCi1mdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBSZWFkQnl0ZSgpIChieXRlLCBlcnJvcikgeworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgUmVhZEJ5dGUoKSAoaW50OCwgZXJyb3IpIHsKIAl2LCBlcnIgOj0gcC5SZWFkSTY0KCkKLQlyZXR1cm4gYnl0ZSh2KSwgZXJyCisJcmV0dXJuIGludDgodiksIGVycgogfQogCiBmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBSZWFkSTE2KCkgKGludDE2LCBlcnJvcikgewpAQCAtNDgxLDIyICs0OTcsMjYgQEAKIAlpZiBlcnIgOj0gcC5QYXJzZVByZVZhbHVlKCk7IGVyciAhPSBuaWwgewogCQlyZXR1cm4gdiwgZXJyCiAJfQotCXZhciBiIFtdYnl0ZQotCWIsIF8gPSBwLnJlYWRlci5QZWVrKGxlbihKU09OX05VTEwpKQotCWlmIGxlbihiKSA+IDAgJiYgYlswXSA9PSBKU09OX1FVT1RFIHsKKwlmLCBfIDo9IHAucmVhZGVyLlBlZWsoMSkKKwlpZiBsZW4oZikgPiAwICYmIGZbMF0gPT0gSlNPTl9RVU9URSB7CiAJCXAucmVhZGVyLlJlYWRCeXRlKCkKIAkJdmFsdWUsIGVyciA6PSBwLlBhcnNlU3RyaW5nQm9keSgpCiAJCXYgPSB2YWx1ZQogCQlpZiBlcnIgIT0gbmlsIHsKIAkJCXJldHVybiB2LCBlcnIKIAkJfQotCX0gZWxzZSBpZiBsZW4oYikgPj0gbGVuKEpTT05fTlVMTCkgJiYgc3RyaW5nKGJbMDpsZW4oSlNPTl9OVUxMKV0pID09IHN0cmluZyhKU09OX05VTEwpIHsKLQkJXywgZXJyIDo9IHAucmVhZGVyLlJlYWQoYlswOmxlbihKU09OX05VTEwpXSkKKwl9IGVsc2UgaWYgbGVuKGYpID4gMCAmJiBmWzBdID09IEpTT05fTlVMTFswXSB7CisJCWIgOj0gbWFrZShbXWJ5dGUsIGxlbihKU09OX05VTEwpKQorCQlfLCBlcnIgOj0gcC5yZWFkZXIuUmVhZChiKQogCQlpZiBlcnIgIT0gbmlsIHsKIAkJCXJldHVybiB2LCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQogCQl9CisJCWlmIHN0cmluZyhiKSAhPSBzdHJpbmcoSlNPTl9OVUxMKSB7CisJCQllIDo9IGZtdC5FcnJvcmYoIkV4cGVjdGVkIGEgSlNPTiBzdHJpbmcsIGZvdW5kIHVucXVvdGVkIGRhdGEgc3RhcnRlZCB3aXRoICVzIiwgc3RyaW5nKGIpKQorCQkJcmV0dXJuIHYsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKElOVkFMSURfREFUQSwgZSkKKwkJfQogCX0gZWxzZSB7Ci0JCWUgOj0gZm10LkVycm9yZigiRXhwZWN0ZWQgYSBKU09OIHN0cmluZywgZm91bmQgJXMiLCBzdHJpbmcoYikpCisJCWUgOj0gZm10LkVycm9yZigiRXhwZWN0ZWQgYSBKU09OIHN0cmluZywgZm91bmQgdW5xdW90ZWQgZGF0YSBzdGFydGVkIHdpdGggJXMiLCBzdHJpbmcoZikpCiAJCXJldHVybiB2LCBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShJTlZBTElEX0RBVEEsIGUpCiAJfQogCXJldHVybiB2LCBwLlBhcnNlUG9zdFZhbHVlKCkKQEAgLTUwNywyNyArNTI3LDMzIEBACiAJaWYgZXJyIDo9IHAuUGFyc2VQcmVWYWx1ZSgpOyBlcnIgIT0gbmlsIHsKIAkJcmV0dXJuIG5pbCwgZXJyCiAJfQotCWIsIF8gOj0gcC5yZWFkZXIuUGVlayhsZW4oSlNPTl9OVUxMKSkKLQlpZiBsZW4oYikgPiAwICYmIGJbMF0gPT0gSlNPTl9RVU9URSB7CisJZiwgXyA6PSBwLnJlYWRlci5QZWVrKDEpCisJaWYgbGVuKGYpID4gMCAmJiBmWzBdID09IEpTT05fUVVPVEUgewogCQlwLnJlYWRlci5SZWFkQnl0ZSgpCiAJCXZhbHVlLCBlcnIgOj0gcC5QYXJzZUJhc2U2NEVuY29kZWRCb2R5KCkKIAkJdiA9IHZhbHVlCiAJCWlmIGVyciAhPSBuaWwgewogCQkJcmV0dXJuIHYsIGVycgogCQl9Ci0JfSBlbHNlIGlmIGxlbihiKSA+PSBsZW4oSlNPTl9OVUxMKSAmJiBzdHJpbmcoYlswOmxlbihKU09OX05VTEwpXSkgPT0gc3RyaW5nKEpTT05fTlVMTCkgewotCQlfLCBlcnIgOj0gcC5yZWFkZXIuUmVhZChiWzA6bGVuKEpTT05fTlVMTCldKQorCX0gZWxzZSBpZiBsZW4oZikgPiAwICYmIGZbMF0gPT0gSlNPTl9OVUxMWzBdIHsKKwkJYiA6PSBtYWtlKFtdYnl0ZSwgbGVuKEpTT05fTlVMTCkpCisJCV8sIGVyciA6PSBwLnJlYWRlci5SZWFkKGIpCiAJCWlmIGVyciAhPSBuaWwgewogCQkJcmV0dXJuIHYsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlcnIpCiAJCX0KKwkJaWYgc3RyaW5nKGIpICE9IHN0cmluZyhKU09OX05VTEwpIHsKKwkJCWUgOj0gZm10LkVycm9yZigiRXhwZWN0ZWQgYSBKU09OIHN0cmluZywgZm91bmQgdW5xdW90ZWQgZGF0YSBzdGFydGVkIHdpdGggJXMiLCBzdHJpbmcoYikpCisJCQlyZXR1cm4gdiwgTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoSU5WQUxJRF9EQVRBLCBlKQorCQl9CiAJfSBlbHNlIHsKLQkJZSA6PSBmbXQuRXJyb3JmKCJFeHBlY3RlZCBhIEpTT04gc3RyaW5nLCBmb3VuZCAlcyIsIHN0cmluZyhiKSkKKwkJZSA6PSBmbXQuRXJyb3JmKCJFeHBlY3RlZCBhIEpTT04gc3RyaW5nLCBmb3VuZCB1bnF1b3RlZCBkYXRhIHN0YXJ0ZWQgd2l0aCAlcyIsIHN0cmluZyhmKSkKIAkJcmV0dXJuIHYsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKElOVkFMSURfREFUQSwgZSkKIAl9CisKIAlyZXR1cm4gdiwgcC5QYXJzZVBvc3RWYWx1ZSgpCiB9CiAKLWZ1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIEZsdXNoKCkgKGVyciBlcnJvcikgeworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgRmx1c2goY3R4IGNvbnRleHQuQ29udGV4dCkgKGVyciBlcnJvcikgewogCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24ocC53cml0ZXIuRmx1c2goKSkKIH0KIApAQCAtNTQzLDEyICs1NjksMTIgQEAKIAljeHQgOj0gX1BhcnNlQ29udGV4dChwLmR1bXBDb250ZXh0W2xlbihwLmR1bXBDb250ZXh0KS0xXSkKIAlzd2l0Y2ggY3h0IHsKIAljYXNlIF9DT05URVhUX0lOX0xJU1QsIF9DT05URVhUX0lOX09CSkVDVF9ORVhUX0tFWToKLQkJaWYgXywgZSA6PSBwLndyaXRlci5Xcml0ZShKU09OX0NPTU1BKTsgZSAhPSBuaWwgeworCQlpZiBfLCBlIDo9IHAud3JpdGUoSlNPTl9DT01NQSk7IGUgIT0gbmlsIHsKIAkJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKIAkJfQogCQlicmVhawogCWNhc2UgX0NPTlRFWFRfSU5fT0JKRUNUX05FWFRfVkFMVUU6Ci0JCWlmIF8sIGUgOj0gcC53cml0ZXIuV3JpdGUoSlNPTl9DT0xPTik7IGUgIT0gbmlsIHsKKwkJaWYgXywgZSA6PSBwLndyaXRlKEpTT05fQ09MT04pOyBlICE9IG5pbCB7CiAJCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCiAJCX0KIAkJYnJlYWsKQEAgLTYwNCw3ICs2MzAsNyBAQAogCWlmIGUgOj0gcC5PdXRwdXRQcmVWYWx1ZSgpOyBlICE9IG5pbCB7CiAJCXJldHVybiBlCiAJfQotCWlmIF8sIGUgOj0gcC53cml0ZXIuV3JpdGUoSlNPTl9OVUxMKTsgZSAhPSBuaWwgeworCWlmIF8sIGUgOj0gcC53cml0ZShKU09OX05VTEwpOyBlICE9IG5pbCB7CiAJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKIAl9CiAJcmV0dXJuIHAuT3V0cHV0UG9zdFZhbHVlKCkKQEAgLTY2Miw3ICs2ODgsNyBAQAogfQogCiBmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBPdXRwdXRTdHJpbmdEYXRhKHMgc3RyaW5nKSBlcnJvciB7Ci0JXywgZSA6PSBwLndyaXRlci5Xcml0ZShbXWJ5dGUocykpCisJXywgZSA6PSBwLndyaXRlKFtdYnl0ZShzKSkKIAlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCiB9CiAKQEAgLTY3MCw3ICs2OTYsNyBAQAogCWlmIGUgOj0gcC5PdXRwdXRQcmVWYWx1ZSgpOyBlICE9IG5pbCB7CiAJCXJldHVybiBlCiAJfQotCWlmIF8sIGUgOj0gcC53cml0ZXIuV3JpdGUoSlNPTl9MQlJBQ0UpOyBlICE9IG5pbCB7CisJaWYgXywgZSA6PSBwLndyaXRlKEpTT05fTEJSQUNFKTsgZSAhPSBuaWwgewogCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCiAJfQogCXAuZHVtcENvbnRleHQgPSBhcHBlbmQocC5kdW1wQ29udGV4dCwgaW50KF9DT05URVhUX0lOX09CSkVDVF9GSVJTVCkpCkBAIC02NzgsNyArNzA0LDcgQEAKIH0KIAogZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgT3V0cHV0T2JqZWN0RW5kKCkgZXJyb3IgewotCWlmIF8sIGUgOj0gcC53cml0ZXIuV3JpdGUoSlNPTl9SQlJBQ0UpOyBlICE9IG5pbCB7CisJaWYgXywgZSA6PSBwLndyaXRlKEpTT05fUkJSQUNFKTsgZSAhPSBuaWwgewogCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCiAJfQogCXAuZHVtcENvbnRleHQgPSBwLmR1bXBDb250ZXh0WzpsZW4ocC5kdW1wQ29udGV4dCktMV0KQEAgLTY5Miw3ICs3MTgsNyBAQAogCWlmIGUgOj0gcC5PdXRwdXRQcmVWYWx1ZSgpOyBlICE9IG5pbCB7CiAJCXJldHVybiBlCiAJfQotCWlmIF8sIGUgOj0gcC53cml0ZXIuV3JpdGUoSlNPTl9MQlJBQ0tFVCk7IGUgIT0gbmlsIHsKKwlpZiBfLCBlIDo9IHAud3JpdGUoSlNPTl9MQlJBQ0tFVCk7IGUgIT0gbmlsIHsKIAkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQogCX0KIAlwLmR1bXBDb250ZXh0ID0gYXBwZW5kKHAuZHVtcENvbnRleHQsIGludChfQ09OVEVYVF9JTl9MSVNUX0ZJUlNUKSkKQEAgLTcwMCw3ICs3MjYsNyBAQAogfQogCiBmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBPdXRwdXRMaXN0RW5kKCkgZXJyb3IgewotCWlmIF8sIGUgOj0gcC53cml0ZXIuV3JpdGUoSlNPTl9SQlJBQ0tFVCk7IGUgIT0gbmlsIHsKKwlpZiBfLCBlIDo9IHAud3JpdGUoSlNPTl9SQlJBQ0tFVCk7IGUgIT0gbmlsIHsKIAkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQogCX0KIAlwLmR1bXBDb250ZXh0ID0gcC5kdW1wQ29udGV4dFs6bGVuKHAuZHVtcENvbnRleHQpLTFdCkBAIC03MTQsNyArNzQwLDcgQEAKIAlpZiBlIDo9IHAuT3V0cHV0TGlzdEJlZ2luKCk7IGUgIT0gbmlsIHsKIAkJcmV0dXJuIGUKIAl9Ci0JaWYgZSA6PSBwLldyaXRlQnl0ZShieXRlKGVsZW1UeXBlKSk7IGUgIT0gbmlsIHsKKwlpZiBlIDo9IHAuV3JpdGVCeXRlKGludDgoZWxlbVR5cGUpKTsgZSAhPSBuaWwgewogCQlyZXR1cm4gZQogCX0KIAlpZiBlIDo9IHAuV3JpdGVJNjQoaW50NjQoc2l6ZSkpOyBlICE9IG5pbCB7CkBAIC04ODcsNiArOTEzLDEyIEBACiAJfQogCWxpbmUyIDo9IGxpbmVbMCA6IGxlbihsaW5lKS0xXQogCWwgOj0gbGVuKGxpbmUyKQorCWlmIChsICUgNCkgIT0gMCB7CisJCXBhZCA6PSA0IC0gKGwgJSA0KQorCQlmaWxsIDo9IFsuLi5dYnl0ZXsnPScsICc9JywgJz0nfQorCQlsaW5lMiA9IGFwcGVuZChsaW5lMiwgZmlsbFs6cGFkXS4uLikKKwkJbCA9IGxlbihsaW5lMikKKwl9CiAJb3V0cHV0IDo9IG1ha2UoW11ieXRlLCBiYXNlNjQuU3RkRW5jb2RpbmcuRGVjb2RlZExlbihsKSkKIAluLCBlcnIgOj0gYmFzZTY0LlN0ZEVuY29kaW5nLkRlY29kZShvdXRwdXQsIGxpbmUyKQogCXJldHVybiBvdXRwdXRbMDpuXSwgTmV3VFByb3RvY29sRXhjZXB0aW9uKGVycikKQEAgLTg5OCw5ICs5MzAsOCBAQAogCX0KIAl2YXIgdmFsdWUgaW50NjQKIAl2YXIgaXNudWxsIGJvb2wKLQliLCBfIDo9IHAucmVhZGVyLlBlZWsobGVuKEpTT05fTlVMTCkpCi0JaWYgbGVuKGIpID49IGxlbihKU09OX05VTEwpICYmIHN0cmluZyhiKSA9PSBzdHJpbmcoSlNPTl9OVUxMKSB7Ci0JCXAucmVhZGVyLlJlYWQoYlswOmxlbihKU09OX05VTEwpXSkKKwlpZiBwLnNhZmVQZWVrQ29udGFpbnMoSlNPTl9OVUxMKSB7CisJCXAucmVhZGVyLlJlYWQobWFrZShbXWJ5dGUsIGxlbihKU09OX05VTEwpKSkKIAkJaXNudWxsID0gdHJ1ZQogCX0gZWxzZSB7CiAJCW51bSwgZXJyIDo9IHAucmVhZE51bWVyaWMoKQpAQCAtOTIxLDkgKzk1Miw4IEBACiAJfQogCXZhciB2YWx1ZSBmbG9hdDY0CiAJdmFyIGlzbnVsbCBib29sCi0JYiwgXyA6PSBwLnJlYWRlci5QZWVrKGxlbihKU09OX05VTEwpKQotCWlmIGxlbihiKSA+PSBsZW4oSlNPTl9OVUxMKSAmJiBzdHJpbmcoYikgPT0gc3RyaW5nKEpTT05fTlVMTCkgewotCQlwLnJlYWRlci5SZWFkKGJbMDpsZW4oSlNPTl9OVUxMKV0pCisJaWYgcC5zYWZlUGVla0NvbnRhaW5zKEpTT05fTlVMTCkgeworCQlwLnJlYWRlci5SZWFkKG1ha2UoW11ieXRlLCBsZW4oSlNPTl9OVUxMKSkpCiAJCWlzbnVsbCA9IHRydWUKIAl9IGVsc2UgewogCQludW0sIGVyciA6PSBwLnJlYWROdW1lcmljKCkKQEAgLTk0MywxMiArOTczLDE1IEBACiAJCXJldHVybiBmYWxzZSwgZXJyCiAJfQogCXZhciBiIFtdYnl0ZQotCWIsIF8gPSBwLnJlYWRlci5QZWVrKGxlbihKU09OX05VTEwpKQorCWIsIGVyciA6PSBwLnJlYWRlci5QZWVrKDEpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBmYWxzZSwgZXJyCisJfQogCWlmIGxlbihiKSA+IDAgJiYgYlswXSA9PSBKU09OX0xCUkFDRVswXSB7CiAJCXAucmVhZGVyLlJlYWRCeXRlKCkKIAkJcC5wYXJzZUNvbnRleHRTdGFjayA9IGFwcGVuZChwLnBhcnNlQ29udGV4dFN0YWNrLCBpbnQoX0NPTlRFWFRfSU5fT0JKRUNUX0ZJUlNUKSkKIAkJcmV0dXJuIGZhbHNlLCBuaWwKLQl9IGVsc2UgaWYgbGVuKGIpID49IGxlbihKU09OX05VTEwpICYmIHN0cmluZyhiWzA6bGVuKEpTT05fTlVMTCldKSA9PSBzdHJpbmcoSlNPTl9OVUxMKSB7CisJfSBlbHNlIGlmIHAuc2FmZVBlZWtDb250YWlucyhKU09OX05VTEwpIHsKIAkJcmV0dXJuIHRydWUsIG5pbAogCX0KIAllIDo9IGZtdC5FcnJvcmYoIkV4cGVjdGVkICd7JyBvciBudWxsLCBidXQgZm91bmQgJyVzJyIsIHN0cmluZyhiKSkKQEAgLTk2MCw4ICs5OTMsOCBAQAogCQlyZXR1cm4gZXJyCiAJfQogCWN4dCA6PSBfUGFyc2VDb250ZXh0KHAucGFyc2VDb250ZXh0U3RhY2tbbGVuKHAucGFyc2VDb250ZXh0U3RhY2spLTFdKQotCWlmIGN4dCAhPSBfQ09OVEVYVF9JTl9PQkpFQ1RfRklSU1QgJiYgY3h0ICE9IF9DT05URVhUX0lOX09CSkVDVF9ORVhUX0tFWSB7Ci0JCWUgOj0gZm10LkVycm9yZigiRXhwZWN0ZWQgdG8gYmUgaW4gdGhlIE9iamVjdCBDb250ZXh0LCBidXQgbm90IGluIE9iamVjdCBDb250ZXh0IikKKwlpZiAoY3h0ICE9IF9DT05URVhUX0lOX09CSkVDVF9GSVJTVCkgJiYgKGN4dCAhPSBfQ09OVEVYVF9JTl9PQkpFQ1RfTkVYVF9LRVkpIHsKKwkJZSA6PSBmbXQuRXJyb3JmKCJFeHBlY3RlZCB0byBiZSBpbiB0aGUgT2JqZWN0IENvbnRleHQsIGJ1dCBub3QgaW4gT2JqZWN0IENvbnRleHQgKCVkKSIsIGN4dCkKIAkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKElOVkFMSURfREFUQSwgZSkKIAl9CiAJbGluZSwgZXJyIDo9IHAucmVhZGVyLlJlYWRTdHJpbmcoSlNPTl9SQlJBQ0VbMF0pCkBAIC05ODYsNyArMTAxOSw3IEBACiAJCXJldHVybiBmYWxzZSwgZQogCX0KIAl2YXIgYiBbXWJ5dGUKLQliLCBlcnIgPSBwLnJlYWRlci5QZWVrKGxlbihKU09OX05VTEwpKQorCWIsIGVyciA9IHAucmVhZGVyLlBlZWsoMSkKIAlpZiBlcnIgIT0gbmlsIHsKIAkJcmV0dXJuIGZhbHNlLCBlcnIKIAl9CkBAIC05OTQsNyArMTAyNyw3IEBACiAJCXAucGFyc2VDb250ZXh0U3RhY2sgPSBhcHBlbmQocC5wYXJzZUNvbnRleHRTdGFjaywgaW50KF9DT05URVhUX0lOX0xJU1RfRklSU1QpKQogCQlwLnJlYWRlci5SZWFkQnl0ZSgpCiAJCWlzTnVsbCA9IGZhbHNlCi0JfSBlbHNlIGlmIGxlbihiKSA+PSBsZW4oSlNPTl9OVUxMKSAmJiBzdHJpbmcoYikgPT0gc3RyaW5nKEpTT05fTlVMTCkgeworCX0gZWxzZSBpZiBwLnNhZmVQZWVrQ29udGFpbnMoSlNPTl9OVUxMKSB7CiAJCWlzTnVsbCA9IHRydWUKIAl9IGVsc2UgewogCQllcnIgPSBmbXQuRXJyb3JmKCJFeHBlY3RlZCBcIm51bGxcIiBvciBcIltcIiwgcmVjZWl2ZWQgJXEiLCBiKQpAQCAtMTAyMCw4ICsxMDUzLDkgQEAKIAlpZiBpc051bGwsIGVyciA6PSBwLnJlYWRJZk51bGwoKTsgaXNOdWxsIHx8IGVyciAhPSBuaWwgewogCQlyZXR1cm4gZXJyCiAJfQotCWlmIF9QYXJzZUNvbnRleHQocC5wYXJzZUNvbnRleHRTdGFja1tsZW4ocC5wYXJzZUNvbnRleHRTdGFjayktMV0pICE9IF9DT05URVhUX0lOX0xJU1QgewotCQllIDo9IGZtdC5FcnJvcmYoIkV4cGVjdGVkIHRvIGJlIGluIHRoZSBMaXN0IENvbnRleHQsIGJ1dCBub3QgaW4gTGlzdCBDb250ZXh0IikKKwljeHQgOj0gX1BhcnNlQ29udGV4dChwLnBhcnNlQ29udGV4dFN0YWNrW2xlbihwLnBhcnNlQ29udGV4dFN0YWNrKS0xXSkKKwlpZiBjeHQgIT0gX0NPTlRFWFRfSU5fTElTVCB7CisJCWUgOj0gZm10LkVycm9yZigiRXhwZWN0ZWQgdG8gYmUgaW4gdGhlIExpc3QgQ29udGV4dCwgYnV0IG5vdCBpbiBMaXN0IENvbnRleHQgKCVkKSIsIGN4dCkKIAkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKElOVkFMSURfREFUQSwgZSkKIAl9CiAJbGluZSwgZXJyIDo9IHAucmVhZGVyLlJlYWRTdHJpbmcoSlNPTl9SQlJBQ0tFVFswXSkKQEAgLTEwMzEsMTMgKzEwNjUsMTYgQEAKIAlmb3IgXywgY2hhciA6PSByYW5nZSBsaW5lIHsKIAkJc3dpdGNoIGNoYXIgewogCQlkZWZhdWx0OgotCQkJZSA6PSBmbXQuRXJyb3JmKCJFeHBlY3RpbmcgZW5kIG9mIGxpc3QgXCJdXCIsIGJ1dCBmb3VuZDogXCIiLCBsaW5lLCAiXCIiKQorCQkJZSA6PSBmbXQuRXJyb3JmKCJFeHBlY3RpbmcgZW5kIG9mIGxpc3QgXCJdXCIsIGJ1dCBmb3VuZDogXCIldlwiIiwgbGluZSkKIAkJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShJTlZBTElEX0RBVEEsIGUpCiAJCWNhc2UgJyAnLCAnXG4nLCAnXHInLCAnXHQnLCBydW5lKEpTT05fUkJSQUNLRVRbMF0pOgogCQkJYnJlYWsKIAkJfQogCX0KIAlwLnBhcnNlQ29udGV4dFN0YWNrID0gcC5wYXJzZUNvbnRleHRTdGFja1s6bGVuKHAucGFyc2VDb250ZXh0U3RhY2spLTFdCisJaWYgX1BhcnNlQ29udGV4dChwLnBhcnNlQ29udGV4dFN0YWNrW2xlbihwLnBhcnNlQ29udGV4dFN0YWNrKS0xXSkgPT0gX0NPTlRFWFRfSU5fVE9QTEVWRUwgeworCQlyZXR1cm4gbmlsCisJfQogCXJldHVybiBwLlBhcnNlUG9zdFZhbHVlKCkKIH0KIApAQCAtMTA0Niw3ICsxMDgzLDcgQEAKIAlpZiBlICE9IG5pbCB7CiAJCXJldHVybiBuaWwsIFZPSUQsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQogCX0KLQliLCBlIDo9IHAucmVhZGVyLlBlZWsoMTApCisJYiwgZSA6PSBwLnJlYWRlci5QZWVrKDEpCiAJaWYgbGVuKGIpID4gMCB7CiAJCWMgOj0gYlswXQogCQlzd2l0Y2ggYyB7CkBAIC0xMTM1LDkgKzExNzIsOCBAQAogCQkJYnJlYWsKIAkJfQogCX0KLQliLCBfIDo9IHAucmVhZGVyLlBlZWsobGVuKEpTT05fTlVMTCkpCi0JaWYgc3RyaW5nKGIpID09IHN0cmluZyhKU09OX05VTEwpIHsKLQkJcC5yZWFkZXIuUmVhZChiWzA6bGVuKEpTT05fTlVMTCldKQorCWlmIHAuc2FmZVBlZWtDb250YWlucyhKU09OX05VTEwpIHsKKwkJcC5yZWFkZXIuUmVhZChtYWtlKFtdYnl0ZSwgbGVuKEpTT05fTlVMTCkpKQogCQlyZXR1cm4gdHJ1ZSwgbmlsCiAJfQogCXJldHVybiBmYWxzZSwgbmlsCkBAIC0xMjc1LDMgKzEzMTEsMjggQEAKIAl9CiAJcmV0dXJuIE5ld051bWVyaWNGcm9tSlNPTlN0cmluZyhidWYuU3RyaW5nKCksIGZhbHNlKSwgbmlsCiB9CisKKy8vIFNhZmVseSBwZWVrcyBpbnRvIHRoZSBidWZmZXIsIHJlYWRpbmcgb25seSB3aGF0IGlzIG5lY2Vzc2FyeQorZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgc2FmZVBlZWtDb250YWlucyhiIFtdYnl0ZSkgYm9vbCB7CisJZm9yIGkgOj0gMDsgaSA8IGxlbihiKTsgaSsrIHsKKwkJYSwgXyA6PSBwLnJlYWRlci5QZWVrKGkgKyAxKQorCQlpZiBsZW4oYSkgPT0gMCB8fCBhW2ldICE9IGJbaV0geworCQkJcmV0dXJuIGZhbHNlCisJCX0KKwl9CisJcmV0dXJuIHRydWUKK30KKworLy8gUmVzZXQgdGhlIGNvbnRleHQgc3RhY2sgdG8gaXRzIGluaXRpYWwgc3RhdGUuCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSByZXNldENvbnRleHRTdGFjaygpIHsKKwlwLnBhcnNlQ29udGV4dFN0YWNrID0gW11pbnR7aW50KF9DT05URVhUX0lOX1RPUExFVkVMKX0KKwlwLmR1bXBDb250ZXh0ID0gW11pbnR7aW50KF9DT05URVhUX0lOX1RPUExFVkVMKX0KK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgd3JpdGUoYiBbXWJ5dGUpIChpbnQsIGVycm9yKSB7CisJbiwgZXJyIDo9IHAud3JpdGVyLldyaXRlKGIpCisJaWYgZXJyICE9IG5pbCB7CisJCXAud3JpdGVyLlJlc2V0KHAudHJhbnMpIC8vIFRIUklGVC0zNzM1CisJfQorCXJldHVybiBuLCBlcnIKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvc2ltcGxlX2pzb25fcHJvdG9jb2xfdGVzdC5nbyBiL2xpYi9nby90aHJpZnQvc2ltcGxlX2pzb25fcHJvdG9jb2xfdGVzdC5nbwppbmRleCA4N2E1YzY0Li43Yjk4MDgyIDEwMDY0NAotLS0gYS9saWIvZ28vdGhyaWZ0L3NpbXBsZV9qc29uX3Byb3RvY29sX3Rlc3QuZ28KKysrIGIvbGliL2dvL3RocmlmdC9zaW1wbGVfanNvbl9wcm90b2NvbF90ZXN0LmdvCkBAIC0yMCw2ICsyMCw3IEBACiBwYWNrYWdlIHRocmlmdAogCiBpbXBvcnQgKAorCSJjb250ZXh0IgogCSJlbmNvZGluZy9iYXNlNjQiCiAJImVuY29kaW5nL2pzb24iCiAJImZtdCIKQEAgLTM3LDcgKzM4LDcgQEAKIAkJaWYgZSA6PSBwLldyaXRlQm9vbCh2YWx1ZSk7IGUgIT0gbmlsIHsKIAkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCiAJCX0KLQkJaWYgZSA6PSBwLkZsdXNoKCk7IGUgIT0gbmlsIHsKKwkJaWYgZSA6PSBwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKTsgZSAhPSBuaWwgewogCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKIAkJfQogCQlzIDo9IHRyYW5zLlN0cmluZygpCkBAIC02Myw3ICs2NCw3IEBACiAJCX0gZWxzZSB7CiAJCQl0cmFucy5Xcml0ZShKU09OX0ZBTFNFKQogCQl9Ci0JCXRyYW5zLkZsdXNoKCkKKwkJdHJhbnMuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCiAJCXMgOj0gdHJhbnMuU3RyaW5nKCkKIAkJdiwgZSA6PSBwLlJlYWRCb29sKCkKIAkJaWYgZSAhPSBuaWwgewpAQCAtODgsMTQgKzg5LDE0IEBACiAJCWlmIGUgOj0gcC5Xcml0ZUJ5dGUodmFsdWUpOyBlICE9IG5pbCB7CiAJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQogCQl9Ci0JCWlmIGUgOj0gcC5GbHVzaCgpOyBlICE9IG5pbCB7CisJCWlmIGUgOj0gcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSk7IGUgIT0gbmlsIHsKIAkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yIGZsdXNoaW5nOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCiAJCX0KIAkJcyA6PSB0cmFucy5TdHJpbmcoKQogCQlpZiBzICE9IGZtdC5TcHJpbnQodmFsdWUpIHsKIAkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzICV2OiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBzKQogCQl9Ci0JCXYgOj0gYnl0ZSgwKQorCQl2IDo9IGludDgoMCkKIAkJaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgJnYpOyBlcnIgIT0gbmlsIHx8IHYgIT0gdmFsdWUgewogCQkJdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKIAkJfQpAQCAtMTEwLDcgKzExMSw3IEBACiAJCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQogCQlwIDo9IE5ld1RTaW1wbGVKU09OUHJvdG9jb2wodHJhbnMpCiAJCXRyYW5zLldyaXRlU3RyaW5nKHN0cmNvbnYuSXRvYShpbnQodmFsdWUpKSkKLQkJdHJhbnMuRmx1c2goKQorCQl0cmFucy5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKIAkJcyA6PSB0cmFucy5TdHJpbmcoKQogCQl2LCBlIDo9IHAuUmVhZEJ5dGUoKQogCQlpZiBlICE9IG5pbCB7CkBAIC0xMzUsNyArMTM2LDcgQEAKIAkJaWYgZSA6PSBwLldyaXRlSTE2KHZhbHVlKTsgZSAhPSBuaWwgewogCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKIAkJfQotCQlpZiBlIDo9IHAuRmx1c2goKTsgZSAhPSBuaWwgeworCQlpZiBlIDo9IHAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpOyBlICE9IG5pbCB7CiAJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvciBmbHVzaGluZzogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQogCQl9CiAJCXMgOj0gdHJhbnMuU3RyaW5nKCkKQEAgLTE1Nyw3ICsxNTgsNyBAQAogCQl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKIAkJcCA6PSBOZXdUU2ltcGxlSlNPTlByb3RvY29sKHRyYW5zKQogCQl0cmFucy5Xcml0ZVN0cmluZyhzdHJjb252Lkl0b2EoaW50KHZhbHVlKSkpCi0JCXRyYW5zLkZsdXNoKCkKKwkJdHJhbnMuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCiAJCXMgOj0gdHJhbnMuU3RyaW5nKCkKIAkJdiwgZSA6PSBwLlJlYWRJMTYoKQogCQlpZiBlICE9IG5pbCB7CkBAIC0xODIsNyArMTgzLDcgQEAKIAkJaWYgZSA6PSBwLldyaXRlSTMyKHZhbHVlKTsgZSAhPSBuaWwgewogCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKIAkJfQotCQlpZiBlIDo9IHAuRmx1c2goKTsgZSAhPSBuaWwgeworCQlpZiBlIDo9IHAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpOyBlICE9IG5pbCB7CiAJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvciBmbHVzaGluZzogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQogCQl9CiAJCXMgOj0gdHJhbnMuU3RyaW5nKCkKQEAgLTIwNCw3ICsyMDUsNyBAQAogCQl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKIAkJcCA6PSBOZXdUU2ltcGxlSlNPTlByb3RvY29sKHRyYW5zKQogCQl0cmFucy5Xcml0ZVN0cmluZyhzdHJjb252Lkl0b2EoaW50KHZhbHVlKSkpCi0JCXRyYW5zLkZsdXNoKCkKKwkJdHJhbnMuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCiAJCXMgOj0gdHJhbnMuU3RyaW5nKCkKIAkJdiwgZSA6PSBwLlJlYWRJMzIoKQogCQlpZiBlICE9IG5pbCB7CkBAIC0yMjEsNiArMjIyLDI3IEBACiAJfQogfQogCitmdW5jIFRlc3RSZWFkU2ltcGxlSlNPTlByb3RvY29sSTMyTnVsbCh0ICp0ZXN0aW5nLlQpIHsKKwl0aGV0eXBlIDo9ICJpbnQzMiIKKwl2YWx1ZSA6PSAibnVsbCIKKworCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQorCXAgOj0gTmV3VFNpbXBsZUpTT05Qcm90b2NvbCh0cmFucykKKwl0cmFucy5Xcml0ZVN0cmluZyh2YWx1ZSkKKwl0cmFucy5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKKwlzIDo9IHRyYW5zLlN0cmluZygpCisJdiwgZSA6PSBwLlJlYWRJMzIoKQorCisJaWYgZSAhPSBuaWwgeworCQl0LkZhdGFsZigiVW5hYmxlIHRvIHJlYWQgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJfQorCWlmIHYgIT0gMCB7CisJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIHZhbHVlICV2LCB3cm90ZTogJXYsIHJlY2VpdmVkOiAldiIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQorCX0KKwl0cmFucy5SZXNldCgpCisJdHJhbnMuQ2xvc2UoKQorfQorCiBmdW5jIFRlc3RXcml0ZVNpbXBsZUpTT05Qcm90b2NvbEk2NCh0ICp0ZXN0aW5nLlQpIHsKIAl0aGV0eXBlIDo9ICJpbnQ2NCIKIAl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKQEAgLTIyOSw3ICsyNTEsNyBAQAogCQlpZiBlIDo9IHAuV3JpdGVJNjQodmFsdWUpOyBlICE9IG5pbCB7CiAJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQogCQl9Ci0JCWlmIGUgOj0gcC5GbHVzaCgpOyBlICE9IG5pbCB7CisJCWlmIGUgOj0gcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSk7IGUgIT0gbmlsIHsKIAkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yIGZsdXNoaW5nOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCiAJCX0KIAkJcyA6PSB0cmFucy5TdHJpbmcoKQpAQCAtMjUxLDcgKzI3Myw3IEBACiAJCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQogCQlwIDo9IE5ld1RTaW1wbGVKU09OUHJvdG9jb2wodHJhbnMpCiAJCXRyYW5zLldyaXRlU3RyaW5nKHN0cmNvbnYuRm9ybWF0SW50KHZhbHVlLCAxMCkpCi0JCXRyYW5zLkZsdXNoKCkKKwkJdHJhbnMuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCiAJCXMgOj0gdHJhbnMuU3RyaW5nKCkKIAkJdiwgZSA6PSBwLlJlYWRJNjQoKQogCQlpZiBlICE9IG5pbCB7CkBAIC0yNjgsNiArMjkwLDI3IEBACiAJfQogfQogCitmdW5jIFRlc3RSZWFkU2ltcGxlSlNPTlByb3RvY29sSTY0TnVsbCh0ICp0ZXN0aW5nLlQpIHsKKwl0aGV0eXBlIDo9ICJpbnQzMiIKKwl2YWx1ZSA6PSAibnVsbCIKKworCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQorCXAgOj0gTmV3VFNpbXBsZUpTT05Qcm90b2NvbCh0cmFucykKKwl0cmFucy5Xcml0ZVN0cmluZyh2YWx1ZSkKKwl0cmFucy5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKKwlzIDo9IHRyYW5zLlN0cmluZygpCisJdiwgZSA6PSBwLlJlYWRJNjQoKQorCisJaWYgZSAhPSBuaWwgeworCQl0LkZhdGFsZigiVW5hYmxlIHRvIHJlYWQgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJfQorCWlmIHYgIT0gMCB7CisJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIHZhbHVlICV2LCB3cm90ZTogJXYsIHJlY2VpdmVkOiAldiIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQorCX0KKwl0cmFucy5SZXNldCgpCisJdHJhbnMuQ2xvc2UoKQorfQorCiBmdW5jIFRlc3RXcml0ZVNpbXBsZUpTT05Qcm90b2NvbERvdWJsZSh0ICp0ZXN0aW5nLlQpIHsKIAl0aGV0eXBlIDo9ICJkb3VibGUiCiAJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCkBAIC0yNzYsNyArMzE5LDcgQEAKIAkJaWYgZSA6PSBwLldyaXRlRG91YmxlKHZhbHVlKTsgZSAhPSBuaWwgewogCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKIAkJfQotCQlpZiBlIDo9IHAuRmx1c2goKTsgZSAhPSBuaWwgeworCQlpZiBlIDo9IHAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpOyBlICE9IG5pbCB7CiAJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvciBmbHVzaGluZzogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQogCQl9CiAJCXMgOj0gdHJhbnMuU3RyaW5nKCkKQEAgLTMxMyw3ICszNTYsNyBAQAogCQlwIDo9IE5ld1RTaW1wbGVKU09OUHJvdG9jb2wodHJhbnMpCiAJCW4gOj0gTmV3TnVtZXJpY0Zyb21Eb3VibGUodmFsdWUpCiAJCXRyYW5zLldyaXRlU3RyaW5nKG4uU3RyaW5nKCkpCi0JCXRyYW5zLkZsdXNoKCkKKwkJdHJhbnMuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCiAJCXMgOj0gdHJhbnMuU3RyaW5nKCkKIAkJdiwgZSA6PSBwLlJlYWREb3VibGUoKQogCQlpZiBlICE9IG5pbCB7CkBAIC0zNTIsNyArMzk1LDcgQEAKIAkJaWYgZSA6PSBwLldyaXRlU3RyaW5nKHZhbHVlKTsgZSAhPSBuaWwgewogCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKIAkJfQotCQlpZiBlIDo9IHAuRmx1c2goKTsgZSAhPSBuaWwgeworCQlpZiBlIDo9IHAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpOyBlICE9IG5pbCB7CiAJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvciBmbHVzaGluZzogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQogCQl9CiAJCXMgOj0gdHJhbnMuU3RyaW5nKCkKQEAgLTM3NCw3ICs0MTcsNyBAQAogCQl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKIAkJcCA6PSBOZXdUU2ltcGxlSlNPTlByb3RvY29sKHRyYW5zKQogCQl0cmFucy5Xcml0ZVN0cmluZyhqc29uUXVvdGUodmFsdWUpKQotCQl0cmFucy5GbHVzaCgpCisJCXRyYW5zLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQogCQlzIDo9IHRyYW5zLlN0cmluZygpCiAJCXYsIGUgOj0gcC5SZWFkU3RyaW5nKCkKIAkJaWYgZSAhPSBuaWwgewpAQCAtMzkxLDYgKzQzNCwyNSBAQAogCQl0cmFucy5DbG9zZSgpCiAJfQogfQorZnVuYyBUZXN0UmVhZFNpbXBsZUpTT05Qcm90b2NvbFN0cmluZ051bGwodCAqdGVzdGluZy5UKSB7CisJdGhldHlwZSA6PSAic3RyaW5nIgorCXZhbHVlIDo9ICJudWxsIgorCisJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCisJcCA6PSBOZXdUU2ltcGxlSlNPTlByb3RvY29sKHRyYW5zKQorCXRyYW5zLldyaXRlU3RyaW5nKHZhbHVlKQorCXRyYW5zLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQorCXMgOj0gdHJhbnMuU3RyaW5nKCkKKwl2LCBlIDo9IHAuUmVhZFN0cmluZygpCisJaWYgZSAhPSBuaWwgeworCQl0LkZhdGFsZigiVW5hYmxlIHRvIHJlYWQgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJfQorCWlmIHYgIT0gIiIgeworCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyB2YWx1ZSAldiwgd3JvdGU6ICV2LCByZWNlaXZlZDogJXYiLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKKwl9CisJdHJhbnMuUmVzZXQoKQorCXRyYW5zLkNsb3NlKCkKK30KIAogZnVuYyBUZXN0V3JpdGVTaW1wbGVKU09OUHJvdG9jb2xCaW5hcnkodCAqdGVzdGluZy5UKSB7CiAJdGhldHlwZSA6PSAiYmluYXJ5IgpAQCAtNDAzLDcgKzQ2NSw3IEBACiAJaWYgZSA6PSBwLldyaXRlQmluYXJ5KHZhbHVlKTsgZSAhPSBuaWwgewogCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQogCX0KLQlpZiBlIDo9IHAuRmx1c2goKTsgZSAhPSBuaWwgeworCWlmIGUgOj0gcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSk7IGUgIT0gbmlsIHsKIAkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKIAl9CiAJcyA6PSB0cmFucy5TdHJpbmcoKQpAQCAtNDI2LDcgKzQ4OCw3IEBACiAJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCiAJcCA6PSBOZXdUU2ltcGxlSlNPTlByb3RvY29sKHRyYW5zKQogCXRyYW5zLldyaXRlU3RyaW5nKGpzb25RdW90ZShiNjRTdHJpbmcpKQotCXRyYW5zLkZsdXNoKCkKKwl0cmFucy5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKIAlzIDo9IHRyYW5zLlN0cmluZygpCiAJdiwgZSA6PSBwLlJlYWRCaW5hcnkoKQogCWlmIGUgIT0gbmlsIHsKQEAgLTQ0OCw2ICs1MTAsMjggQEAKIAl0cmFucy5DbG9zZSgpCiB9CiAKK2Z1bmMgVGVzdFJlYWRTaW1wbGVKU09OUHJvdG9jb2xCaW5hcnlOdWxsKHQgKnRlc3RpbmcuVCkgeworCXRoZXR5cGUgOj0gImJpbmFyeSIKKwl2YWx1ZSA6PSAibnVsbCIKKworCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQorCXAgOj0gTmV3VFNpbXBsZUpTT05Qcm90b2NvbCh0cmFucykKKwl0cmFucy5Xcml0ZVN0cmluZyh2YWx1ZSkKKwl0cmFucy5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKKwlzIDo9IHRyYW5zLlN0cmluZygpCisJYiwgZSA6PSBwLlJlYWRCaW5hcnkoKQorCXYgOj0gc3RyaW5nKGIpCisKKwlpZiBlICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmFibGUgdG8gcmVhZCAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwl9CisJaWYgdiAhPSAiIiB7CisJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIHZhbHVlICV2LCB3cm90ZTogJXYsIHJlY2VpdmVkOiAldiIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQorCX0KKwl0cmFucy5SZXNldCgpCisJdHJhbnMuQ2xvc2UoKQorfQorCiBmdW5jIFRlc3RXcml0ZVNpbXBsZUpTT05Qcm90b2NvbExpc3QodCAqdGVzdGluZy5UKSB7CiAJdGhldHlwZSA6PSAibGlzdCIKIAl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKQEAgLTQ1OSw3ICs1NDMsNyBAQAogCQl9CiAJfQogCXAuV3JpdGVMaXN0RW5kKCkKLQlpZiBlIDo9IHAuRmx1c2goKTsgZSAhPSBuaWwgeworCWlmIGUgOj0gcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSk7IGUgIT0gbmlsIHsKIAkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgZS5FcnJvcigpKQogCX0KIAlzdHIgOj0gdHJhbnMuU3RyaW5nKCkKQEAgLTUxMyw3ICs1OTcsNyBAQAogCQl9CiAJfQogCXAuV3JpdGVTZXRFbmQoKQotCWlmIGUgOj0gcC5GbHVzaCgpOyBlICE9IG5pbCB7CisJaWYgZSA6PSBwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKTsgZSAhPSBuaWwgewogCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIGR1ZSB0byBlcnJvciBmbHVzaGluZzogJXMiLCB0aGV0eXBlLCBlLkVycm9yKCkpCiAJfQogCXN0ciA6PSB0cmFucy5TdHJpbmcoKQpAQCAtNTcwLDEyICs2NTQsMTIgQEAKIAkJfQogCX0KIAlwLldyaXRlTWFwRW5kKCkKLQlpZiBlIDo9IHAuRmx1c2goKTsgZSAhPSBuaWwgeworCWlmIGUgOj0gcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSk7IGUgIT0gbmlsIHsKIAkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgZS5FcnJvcigpKQogCX0KIAlzdHIgOj0gdHJhbnMuU3RyaW5nKCkKIAlpZiBzdHJbMF0gIT0gJ1snIHx8IHN0cltsZW4oc3RyKS0xXSAhPSAnXScgewotCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcywgd3JvdGU6ICVxLCBpbiBnbzogJXEiLCB0aGV0eXBlLCBzdHIsIERPVUJMRV9WQUxVRVMpCisJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzLCB3cm90ZTogJXYsIGluIGdvOiAldiIsIHRoZXR5cGUsIHN0ciwgRE9VQkxFX1ZBTFVFUykKIAl9CiAJbCA6PSBzdHJpbmdzLlNwbGl0KHN0clsxOmxlbihzdHIpLTFdLCAiLCIpCiAJaWYgbGVuKGwpIDwgMyB7CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3NpbXBsZV9zZXJ2ZXIuZ28gYi9saWIvZ28vdGhyaWZ0L3NpbXBsZV9zZXJ2ZXIuZ28KaW5kZXggOWEyNzIxNS4uNjAzNTgwMiAxMDA2NDQKLS0tIGEvbGliL2dvL3RocmlmdC9zaW1wbGVfc2VydmVyLmdvCisrKyBiL2xpYi9nby90aHJpZnQvc2ltcGxlX3NlcnZlci5nbwpAQCAtMjIsMTEgKzIyLDE5IEBACiBpbXBvcnQgKAogCSJsb2ciCiAJInJ1bnRpbWUvZGVidWciCisJInN5bmMiCisJInN5bmMvYXRvbWljIgogKQogCi0vLyBTaW1wbGUsIG5vbi1jb25jdXJyZW50IHNlcnZlciBmb3IgdGVzdGluZy4KKy8qCisgKiBUaGlzIGlzIG5vdCBhIHR5cGljYWwgVFNpbXBsZVNlcnZlciBhcyBpdCBpcyBub3QgYmxvY2tlZCBhZnRlciBhY2NlcHQgYSBzb2NrZXQuCisgKiBJdCBpcyBtb3JlIGxpa2UgYSBUVGhyZWFkZWRTZXJ2ZXIgdGhhdCBjYW4gaGFuZGxlIGRpZmZlcmVudCBjb25uZWN0aW9ucyBpbiBkaWZmZXJlbnQgZ29yb3V0aW5lcy4KKyAqIFRoaXMgd2lsbCB3b3JrIGlmIGdvbGFuZyB1c2VyIGltcGxlbWVudHMgYSBjb25uLXBvb2wgbGlrZSB0aGluZyBpbiBjbGllbnQgc2lkZS4KKyAqLwogdHlwZSBUU2ltcGxlU2VydmVyIHN0cnVjdCB7Ci0JcXVpdCBjaGFuIHN0cnVjdHt9CisJY2xvc2VkIGludDMyCisJd2cgICAgIHN5bmMuV2FpdEdyb3VwCisJbXUgICAgIHN5bmMuTXV0ZXgKIAogCXByb2Nlc3NvckZhY3RvcnkgICAgICAgVFByb2Nlc3NvckZhY3RvcnkKIAlzZXJ2ZXJUcmFuc3BvcnQgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQKQEAgLTg2LDcgKzk0LDYgQEAKIAkJb3V0cHV0VHJhbnNwb3J0RmFjdG9yeTogb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKIAkJaW5wdXRQcm90b2NvbEZhY3Rvcnk6ICAgaW5wdXRQcm90b2NvbEZhY3RvcnksCiAJCW91dHB1dFByb3RvY29sRmFjdG9yeTogIG91dHB1dFByb3RvY29sRmFjdG9yeSwKLQkJcXVpdDogbWFrZShjaGFuIHN0cnVjdHt9LCAxKSwKIAl9CiB9CiAKQEAgLTExOCwyNCArMTI1LDM3IEBACiAJcmV0dXJuIHAuc2VydmVyVHJhbnNwb3J0Lkxpc3RlbigpCiB9CiAKK2Z1bmMgKHAgKlRTaW1wbGVTZXJ2ZXIpIGlubmVyQWNjZXB0KCkgKGludDMyLCBlcnJvcikgeworCWNsaWVudCwgZXJyIDo9IHAuc2VydmVyVHJhbnNwb3J0LkFjY2VwdCgpCisJcC5tdS5Mb2NrKCkKKwlkZWZlciBwLm11LlVubG9jaygpCisJY2xvc2VkIDo9IGF0b21pYy5Mb2FkSW50MzIoJnAuY2xvc2VkKQorCWlmIGNsb3NlZCAhPSAwIHsKKwkJcmV0dXJuIGNsb3NlZCwgbmlsCisJfQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gMCwgZXJyCisJfQorCWlmIGNsaWVudCAhPSBuaWwgeworCQlwLndnLkFkZCgxKQorCQlnbyBmdW5jKCkgeworCQkJZGVmZXIgcC53Zy5Eb25lKCkKKwkJCWlmIGVyciA6PSBwLnByb2Nlc3NSZXF1ZXN0cyhjbGllbnQpOyBlcnIgIT0gbmlsIHsKKwkJCQlsb2cuUHJpbnRsbigiZXJyb3IgcHJvY2Vzc2luZyByZXF1ZXN0OiIsIGVycikKKwkJCX0KKwkJfSgpCisJfQorCXJldHVybiAwLCBuaWwKK30KKwogZnVuYyAocCAqVFNpbXBsZVNlcnZlcikgQWNjZXB0TG9vcCgpIGVycm9yIHsKIAlmb3IgewotCQlzZWxlY3QgewotCQljYXNlIDwtcC5xdWl0OgotCQkJcmV0dXJuIG5pbAotCQlkZWZhdWx0OgotCQl9Ci0KLQkJY2xpZW50LCBlcnIgOj0gcC5zZXJ2ZXJUcmFuc3BvcnQuQWNjZXB0KCkKKwkJY2xvc2VkLCBlcnIgOj0gcC5pbm5lckFjY2VwdCgpCiAJCWlmIGVyciAhPSBuaWwgewotCQkJbG9nLlByaW50bG4oIkFjY2VwdCBlcnI6ICIsIGVycikKKwkJCXJldHVybiBlcnIKIAkJfQotCQlpZiBjbGllbnQgIT0gbmlsIHsKLQkJCWdvIGZ1bmMoKSB7Ci0JCQkJaWYgZXJyIDo9IHAucHJvY2Vzc1JlcXVlc3RzKGNsaWVudCk7IGVyciAhPSBuaWwgewotCQkJCQlsb2cuUHJpbnRsbigiZXJyb3IgcHJvY2Vzc2luZyByZXF1ZXN0OiIsIGVycikKLQkJCQl9Ci0JCQl9KCkKKwkJaWYgY2xvc2VkICE9IDAgeworCQkJcmV0dXJuIG5pbAogCQl9CiAJfQogfQpAQCAtMTUwLDE1ICsxNzAsMjcgQEAKIH0KIAogZnVuYyAocCAqVFNpbXBsZVNlcnZlcikgU3RvcCgpIGVycm9yIHsKLQlwLnF1aXQgPC0gc3RydWN0e317fQorCXAubXUuTG9jaygpCisJZGVmZXIgcC5tdS5VbmxvY2soKQorCWlmIGF0b21pYy5Mb2FkSW50MzIoJnAuY2xvc2VkKSAhPSAwIHsKKwkJcmV0dXJuIG5pbAorCX0KKwlhdG9taWMuU3RvcmVJbnQzMigmcC5jbG9zZWQsIDEpCiAJcC5zZXJ2ZXJUcmFuc3BvcnQuSW50ZXJydXB0KCkKKwlwLndnLldhaXQoKQogCXJldHVybiBuaWwKIH0KIAogZnVuYyAocCAqVFNpbXBsZVNlcnZlcikgcHJvY2Vzc1JlcXVlc3RzKGNsaWVudCBUVHJhbnNwb3J0KSBlcnJvciB7CiAJcHJvY2Vzc29yIDo9IHAucHJvY2Vzc29yRmFjdG9yeS5HZXRQcm9jZXNzb3IoY2xpZW50KQotCWlucHV0VHJhbnNwb3J0IDo9IHAuaW5wdXRUcmFuc3BvcnRGYWN0b3J5LkdldFRyYW5zcG9ydChjbGllbnQpCi0Jb3V0cHV0VHJhbnNwb3J0IDo9IHAub3V0cHV0VHJhbnNwb3J0RmFjdG9yeS5HZXRUcmFuc3BvcnQoY2xpZW50KQorCWlucHV0VHJhbnNwb3J0LCBlcnIgOj0gcC5pbnB1dFRyYW5zcG9ydEZhY3RvcnkuR2V0VHJhbnNwb3J0KGNsaWVudCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKwlvdXRwdXRUcmFuc3BvcnQsIGVyciA6PSBwLm91dHB1dFRyYW5zcG9ydEZhY3RvcnkuR2V0VHJhbnNwb3J0KGNsaWVudCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KIAlpbnB1dFByb3RvY29sIDo9IHAuaW5wdXRQcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2woaW5wdXRUcmFuc3BvcnQpCiAJb3V0cHV0UHJvdG9jb2wgOj0gcC5vdXRwdXRQcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wob3V0cHV0VHJhbnNwb3J0KQogCWRlZmVyIGZ1bmMoKSB7CkBAIC0xNjYsNiArMTk4LDcgQEAKIAkJCWxvZy5QcmludGYoInBhbmljIGluIHByb2Nlc3NvcjogJXM6ICVzIiwgZSwgZGVidWcuU3RhY2soKSkKIAkJfQogCX0oKQorCiAJaWYgaW5wdXRUcmFuc3BvcnQgIT0gbmlsIHsKIAkJZGVmZXIgaW5wdXRUcmFuc3BvcnQuQ2xvc2UoKQogCX0KQEAgLTE3MywxMyArMjA2LDE5IEBACiAJCWRlZmVyIG91dHB1dFRyYW5zcG9ydC5DbG9zZSgpCiAJfQogCWZvciB7Ci0JCW9rLCBlcnIgOj0gcHJvY2Vzc29yLlByb2Nlc3MoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpCisJCWlmIGF0b21pYy5Mb2FkSW50MzIoJnAuY2xvc2VkKSAhPSAwIHsKKwkJCXJldHVybiBuaWwKKwkJfQorCisJCW9rLCBlcnIgOj0gcHJvY2Vzc29yLlByb2Nlc3MoZGVmYXVsdEN0eCwgaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpCiAJCWlmIGVyciwgb2sgOj0gZXJyLihUVHJhbnNwb3J0RXhjZXB0aW9uKTsgb2sgJiYgZXJyLlR5cGVJZCgpID09IEVORF9PRl9GSUxFIHsKIAkJCXJldHVybiBuaWwKIAkJfSBlbHNlIGlmIGVyciAhPSBuaWwgewotCQkJbG9nLlByaW50ZigiZXJyb3IgcHJvY2Vzc2luZyByZXF1ZXN0OiAlcyIsIGVycikKIAkJCXJldHVybiBlcnIKIAkJfQorCQlpZiBlcnIsIG9rIDo9IGVyci4oVEFwcGxpY2F0aW9uRXhjZXB0aW9uKTsgb2sgJiYgZXJyLlR5cGVJZCgpID09IFVOS05PV05fTUVUSE9EIHsKKwkJCWNvbnRpbnVlCisJCX0KIAkJaWYgIW9rIHsKIAkJCWJyZWFrCiAJCX0KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvc2ltcGxlX3NlcnZlcl90ZXN0LmdvIGIvbGliL2dvL3RocmlmdC9zaW1wbGVfc2VydmVyX3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTgxNDlhOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvc2ltcGxlX3NlcnZlcl90ZXN0LmdvCkBAIC0wLDAgKzEsMTU2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJInRlc3RpbmciCisJImVycm9ycyIKKwkicnVudGltZSIKKykKKwordHlwZSBtb2NrU2VydmVyVHJhbnNwb3J0IHN0cnVjdCB7CisJTGlzdGVuRnVuYyAgICBmdW5jKCkgZXJyb3IKKwlBY2NlcHRGdW5jICAgIGZ1bmMoKSAoVFRyYW5zcG9ydCwgZXJyb3IpCisJQ2xvc2VGdW5jICAgICBmdW5jKCkgZXJyb3IKKwlJbnRlcnJ1cHRGdW5jIGZ1bmMoKSBlcnJvcgorfQorCitmdW5jIChtICptb2NrU2VydmVyVHJhbnNwb3J0KSBMaXN0ZW4oKSBlcnJvciB7CisJcmV0dXJuIG0uTGlzdGVuRnVuYygpCit9CisKK2Z1bmMgKG0gKm1vY2tTZXJ2ZXJUcmFuc3BvcnQpIEFjY2VwdCgpIChUVHJhbnNwb3J0LCBlcnJvcikgeworCXJldHVybiBtLkFjY2VwdEZ1bmMoKQorfQorCitmdW5jIChtICptb2NrU2VydmVyVHJhbnNwb3J0KSBDbG9zZSgpIGVycm9yIHsKKwlyZXR1cm4gbS5DbG9zZUZ1bmMoKQorfQorCitmdW5jIChtICptb2NrU2VydmVyVHJhbnNwb3J0KSBJbnRlcnJ1cHQoKSBlcnJvciB7CisJcmV0dXJuIG0uSW50ZXJydXB0RnVuYygpCit9CisKK3R5cGUgbW9ja1RUcmFuc3BvcnQgc3RydWN0IHsKKwlUVHJhbnNwb3J0Cit9CisKK2Z1bmMgKG0gKm1vY2tUVHJhbnNwb3J0KSBDbG9zZSgpIGVycm9yIHsKKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgVGVzdE11bHRpcGxlU3RvcCh0ICp0ZXN0aW5nLlQpIHsKKwlwcm9jIDo9ICZtb2NrUHJvY2Vzc29yeworCQlQcm9jZXNzRnVuYzogZnVuYyhpbiwgb3V0IFRQcm90b2NvbCkgKGJvb2wsIFRFeGNlcHRpb24pIHsKKwkJCXJldHVybiBmYWxzZSwgbmlsCisJCX0sCisJfQorCisJdmFyIGludGVycnVwdENhbGxlZCBib29sCisJYyA6PSBtYWtlKGNoYW4gc3RydWN0e30pCisJdHJhbnMgOj0gJm1vY2tTZXJ2ZXJUcmFuc3BvcnR7CisJCUxpc3RlbkZ1bmM6IGZ1bmMoKSBlcnJvciB7CisJCQlyZXR1cm4gbmlsCisJCX0sCisJCUFjY2VwdEZ1bmM6IGZ1bmMoKSAoVFRyYW5zcG9ydCwgZXJyb3IpIHsKKwkJCTwtYworCQkJcmV0dXJuIG5pbCwgbmlsCisJCX0sCisJCUNsb3NlRnVuYzogZnVuYygpIGVycm9yIHsKKwkJCWMgPC0gc3RydWN0e317fQorCQkJcmV0dXJuIG5pbAorCQl9LAorCQlJbnRlcnJ1cHRGdW5jOiBmdW5jKCkgZXJyb3IgeworCQkJaW50ZXJydXB0Q2FsbGVkID0gdHJ1ZQorCQkJcmV0dXJuIG5pbAorCQl9LAorCX0KKworCXNlcnYgOj0gTmV3VFNpbXBsZVNlcnZlcjIocHJvYywgdHJhbnMpCisJZ28gc2Vydi5TZXJ2ZSgpCisJc2Vydi5TdG9wKCkKKwlpZiAhaW50ZXJydXB0Q2FsbGVkIHsKKwkJdC5FcnJvcigiZmlyc3Qgc2VydmVyIHRyYW5zcG9ydCBzaG91bGQgaGF2ZSBiZWVuIGludGVycnVwdGVkIikKKwl9CisKKwlzZXJ2ID0gTmV3VFNpbXBsZVNlcnZlcjIocHJvYywgdHJhbnMpCisJaW50ZXJydXB0Q2FsbGVkID0gZmFsc2UKKwlnbyBzZXJ2LlNlcnZlKCkKKwlzZXJ2LlN0b3AoKQorCWlmICFpbnRlcnJ1cHRDYWxsZWQgeworCQl0LkVycm9yKCJzZWNvbmQgc2VydmVyIHRyYW5zcG9ydCBzaG91bGQgaGF2ZSBiZWVuIGludGVycnVwdGVkIikKKwl9Cit9CisKK2Z1bmMgVGVzdFdhaXRSYWNlKHQgKnRlc3RpbmcuVCkgeworCXByb2MgOj0gJm1vY2tQcm9jZXNzb3J7CisJCVByb2Nlc3NGdW5jOiBmdW5jKGluLCBvdXQgVFByb3RvY29sKSAoYm9vbCwgVEV4Y2VwdGlvbikgeworCQkJcmV0dXJuIGZhbHNlLCBuaWwKKwkJfSwKKwl9CisKKwl0cmFucyA6PSAmbW9ja1NlcnZlclRyYW5zcG9ydHsKKwkJTGlzdGVuRnVuYzogZnVuYygpIGVycm9yIHsKKwkJCXJldHVybiBuaWwKKwkJfSwKKwkJQWNjZXB0RnVuYzogZnVuYygpIChUVHJhbnNwb3J0LCBlcnJvcikgeworCQkJcmV0dXJuICZtb2NrVFRyYW5zcG9ydHt9LCBuaWwKKwkJfSwKKwkJQ2xvc2VGdW5jOiBmdW5jKCkgZXJyb3IgeworCQkJcmV0dXJuIG5pbAorCQl9LAorCQlJbnRlcnJ1cHRGdW5jOiBmdW5jKCkgZXJyb3IgeworCQkJcmV0dXJuIG5pbAorCQl9LAorCX0KKworCXNlcnYgOj0gTmV3VFNpbXBsZVNlcnZlcjIocHJvYywgdHJhbnMpCisJZ28gc2Vydi5TZXJ2ZSgpCisJcnVudGltZS5Hb3NjaGVkKCkKKwlzZXJ2LlN0b3AoKQorfQorCitmdW5jIFRlc3ROb0hhbmdEdXJpbmdTdG9wRnJvbURhbmdsaW5nTG9ja0FjcXVpcmVEdXJpbmdBY2NlcHRMb29wKHQgKnRlc3RpbmcuVCkgeworCXByb2MgOj0gJm1vY2tQcm9jZXNzb3J7CisJCVByb2Nlc3NGdW5jOiBmdW5jKGluLCBvdXQgVFByb3RvY29sKSAoYm9vbCwgVEV4Y2VwdGlvbikgeworCQkJcmV0dXJuIGZhbHNlLCBuaWwKKwkJfSwKKwl9CisKKwl0cmFucyA6PSAmbW9ja1NlcnZlclRyYW5zcG9ydHsKKwkJTGlzdGVuRnVuYzogZnVuYygpIGVycm9yIHsKKwkJCXJldHVybiBuaWwKKwkJfSwKKwkJQWNjZXB0RnVuYzogZnVuYygpIChUVHJhbnNwb3J0LCBlcnJvcikgeworCQkJcmV0dXJuIG5pbCwgZXJyb3JzLk5ldygibm8gc2lyIikKKwkJfSwKKwkJQ2xvc2VGdW5jOiBmdW5jKCkgZXJyb3IgeworCQkJcmV0dXJuIG5pbAorCQl9LAorCQlJbnRlcnJ1cHRGdW5jOiBmdW5jKCkgZXJyb3IgeworCQkJcmV0dXJuIG5pbAorCQl9LAorCX0KKworCXNlcnYgOj0gTmV3VFNpbXBsZVNlcnZlcjIocHJvYywgdHJhbnMpCisJZ28gc2Vydi5TZXJ2ZSgpCisJcnVudGltZS5Hb3NjaGVkKCkKKwlzZXJ2LlN0b3AoKQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9zb2NrZXQuZ28gYi9saWIvZ28vdGhyaWZ0L3NvY2tldC5nbwppbmRleCBhMzgxZWEyLi44ODU0Mjc5IDEwMDY0NAotLS0gYS9saWIvZ28vdGhyaWZ0L3NvY2tldC5nbworKysgYi9saWIvZ28vdGhyaWZ0L3NvY2tldC5nbwpAQCAtMjAsNiArMjAsNyBAQAogcGFja2FnZSB0aHJpZnQKIAogaW1wb3J0ICgKKwkiY29udGV4dCIKIAkibmV0IgogCSJ0aW1lIgogKQpAQCAtMTAwLDcgKzEwMSw3IEBACiAJcmV0dXJuIG5pbAogfQogCi0vLyBSZXRyZWl2ZSB0aGUgdW5kZXJseWluZyBuZXQuQ29ubgorLy8gUmV0cmlldmUgdGhlIHVuZGVybHlpbmcgbmV0LkNvbm4KIGZ1bmMgKHAgKlRTb2NrZXQpIENvbm4oKSBuZXQuQ29ubiB7CiAJcmV0dXJuIHAuY29ubgogfQpAQCAtMTI2LDYgKzEyNywxMSBAQAogCXJldHVybiBuaWwKIH0KIAorLy9SZXR1cm5zIHRoZSByZW1vdGUgYWRkcmVzcyBvZiB0aGUgc29ja2V0LgorZnVuYyAocCAqVFNvY2tldCkgQWRkcigpIG5ldC5BZGRyIHsKKwlyZXR1cm4gcC5hZGRyCit9CisKIGZ1bmMgKHAgKlRTb2NrZXQpIFJlYWQoYnVmIFtdYnl0ZSkgKGludCwgZXJyb3IpIHsKIAlpZiAhcC5Jc09wZW4oKSB7CiAJCXJldHVybiAwLCBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKE5PVF9PUEVOLCAiQ29ubmVjdGlvbiBub3Qgb3BlbiIpCkBAIC0xNDMsMTEgKzE0OSw3IEBACiAJcmV0dXJuIHAuY29ubi5Xcml0ZShidWYpCiB9CiAKLWZ1bmMgKHAgKlRTb2NrZXQpIFBlZWsoKSBib29sIHsKLQlyZXR1cm4gcC5Jc09wZW4oKQotfQotCi1mdW5jIChwICpUU29ja2V0KSBGbHVzaCgpIGVycm9yIHsKK2Z1bmMgKHAgKlRTb2NrZXQpIEZsdXNoKGN0eCBjb250ZXh0LkNvbnRleHQpIGVycm9yIHsKIAlyZXR1cm4gbmlsCiB9CiAKQEAgLTE1NywzICsxNTksOCBAQAogCX0KIAlyZXR1cm4gcC5jb25uLkNsb3NlKCkKIH0KKworZnVuYyAocCAqVFNvY2tldCkgUmVtYWluaW5nQnl0ZXMoKSAobnVtX2J5dGVzIHVpbnQ2NCkgeworCWNvbnN0IG1heFNpemUgPSBedWludDY0KDApCisJcmV0dXJuIG1heFNpemUgLy8gdGhlIHRocnV0aCBpcywgd2UganVzdCBkb24ndCBrbm93IHVubGVzcyBmcmFtZWQgaXMgdXNlZAorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9zc2xfc2VydmVyX3NvY2tldC5nbyBiL2xpYi9nby90aHJpZnQvc3NsX3NlcnZlcl9zb2NrZXQuZ28KaW5kZXggNThmODU5Yi4uOTA3YWZjYSAxMDA2NDQKLS0tIGEvbGliL2dvL3RocmlmdC9zc2xfc2VydmVyX3NvY2tldC5nbworKysgYi9saWIvZ28vdGhyaWZ0L3NzbF9zZXJ2ZXJfc29ja2V0LmdvCkBAIC0yMCw5ICsyMCw5IEBACiBwYWNrYWdlIHRocmlmdAogCiBpbXBvcnQgKAorCSJjcnlwdG8vdGxzIgogCSJuZXQiCiAJInRpbWUiCi0JImNyeXB0by90bHMiCiApCiAKIHR5cGUgVFNTTFNlcnZlclNvY2tldCBzdHJ1Y3QgewpAQCAtMzgsNiArMzgsOSBAQAogfQogCiBmdW5jIE5ld1RTU0xTZXJ2ZXJTb2NrZXRUaW1lb3V0KGxpc3RlbkFkZHIgc3RyaW5nLCBjZmcgKnRscy5Db25maWcsIGNsaWVudFRpbWVvdXQgdGltZS5EdXJhdGlvbikgKCpUU1NMU2VydmVyU29ja2V0LCBlcnJvcikgeworCWlmIGNmZy5NaW5WZXJzaW9uID09IDAgeworCQljZmcuTWluVmVyc2lvbiA9IHRscy5WZXJzaW9uVExTMTAKKwl9CiAJYWRkciwgZXJyIDo9IG5ldC5SZXNvbHZlVENQQWRkcigidGNwIiwgbGlzdGVuQWRkcikKIAlpZiBlcnIgIT0gbmlsIHsKIAkJcmV0dXJuIG5pbCwgZXJyCmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3NzbF9zb2NrZXQuZ28gYi9saWIvZ28vdGhyaWZ0L3NzbF9zb2NrZXQuZ28KaW5kZXggOTQzYmQ5MC4uYmE2MzM3NyAxMDA2NDQKLS0tIGEvbGliL2dvL3RocmlmdC9zc2xfc29ja2V0LmdvCisrKyBiL2xpYi9nby90aHJpZnQvc3NsX3NvY2tldC5nbwpAQCAtMjAsMTMgKzIwLDE5IEBACiBwYWNrYWdlIHRocmlmdAogCiBpbXBvcnQgKAorCSJjb250ZXh0IgorCSJjcnlwdG8vdGxzIgogCSJuZXQiCiAJInRpbWUiCi0JImNyeXB0by90bHMiCiApCiAKIHR5cGUgVFNTTFNvY2tldCBzdHJ1Y3QgewotCWNvbm4gICAgbmV0LkNvbm4KKwljb25uIG5ldC5Db25uCisJLy8gaG9zdFBvcnQgY29udGFpbnMgaG9zdDpwb3J0IChlLmcuICJhc2RmLmNvbToxMjM0NSIpLiBUaGUgZmllbGQgaXMKKwkvLyBvbmx5IHZhbGlkIGlmIGFkZHIgaXMgbmlsLgorCWhvc3RQb3J0IHN0cmluZworCS8vIGFkZHIgaXMgbmlsIHdoZW4gaG9zdFBvcnQgaXMgbm90ICIiLCBhbmQgaXMgb25seSB1c2VkIHdoZW4gdGhlCisJLy8gVFNTTFNvY2tldCBpcyBjb25zdHJ1Y3RlZCBmcm9tIGEgbmV0LkFkZHIuCiAJYWRkciAgICBuZXQuQWRkcgogCXRpbWVvdXQgdGltZS5EdXJhdGlvbgogCWNmZyAgICAgKnRscy5Db25maWcKQEAgLTM1LDcgKzQxLDcgQEAKIC8vIE5ld1RTU0xTb2NrZXQgY3JlYXRlcyBhIG5ldC5Db25uLWJhY2tlZCBUVHJhbnNwb3J0LCBnaXZlbiBhIGhvc3QgYW5kIHBvcnQgYW5kIHRscyBDb25maWd1cmF0aW9uCiAvLwogLy8gRXhhbXBsZToKLS8vIAl0cmFucywgZXJyIDo9IHRocmlmdC5OZXdUU29ja2V0KCJsb2NhbGhvc3Q6OTA5MCIpCisvLyAJdHJhbnMsIGVyciA6PSB0aHJpZnQuTmV3VFNTTFNvY2tldCgibG9jYWxob3N0OjkwOTAiLCBuaWwpCiBmdW5jIE5ld1RTU0xTb2NrZXQoaG9zdFBvcnQgc3RyaW5nLCBjZmcgKnRscy5Db25maWcpICgqVFNTTFNvY2tldCwgZXJyb3IpIHsKIAlyZXR1cm4gTmV3VFNTTFNvY2tldFRpbWVvdXQoaG9zdFBvcnQsIGNmZywgMCkKIH0KQEAgLTQzLDEyICs0OSwxMCBAQAogLy8gTmV3VFNTTFNvY2tldFRpbWVvdXQgY3JlYXRlcyBhIG5ldC5Db25uLWJhY2tlZCBUVHJhbnNwb3J0LCBnaXZlbiBhIGhvc3QgYW5kIHBvcnQKIC8vIGl0IGFsc28gYWNjZXB0cyBhIHRscyBDb25maWd1cmF0aW9uIGFuZCBhIHRpbWVvdXQgYXMgYSB0aW1lLkR1cmF0aW9uCiBmdW5jIE5ld1RTU0xTb2NrZXRUaW1lb3V0KGhvc3RQb3J0IHN0cmluZywgY2ZnICp0bHMuQ29uZmlnLCB0aW1lb3V0IHRpbWUuRHVyYXRpb24pICgqVFNTTFNvY2tldCwgZXJyb3IpIHsKLQkvL2Nvbm4sIGVyciA6PSBuZXQuRGlhbFRpbWVvdXQobmV0d29yaywgYWRkcmVzcywgdGltZW91dCkKLQlhZGRyLCBlcnIgOj0gbmV0LlJlc29sdmVUQ1BBZGRyKCJ0Y3AiLCBob3N0UG9ydCkKLQlpZiBlcnIgIT0gbmlsIHsKLQkJcmV0dXJuIG5pbCwgZXJyCisJaWYgY2ZnLk1pblZlcnNpb24gPT0gMCB7CisJCWNmZy5NaW5WZXJzaW9uID0gdGxzLlZlcnNpb25UTFMxMAogCX0KLQlyZXR1cm4gTmV3VFNTTFNvY2tldEZyb21BZGRyVGltZW91dChhZGRyLCBjZmcsIHRpbWVvdXQpLCBuaWwKKwlyZXR1cm4gJlRTU0xTb2NrZXR7aG9zdFBvcnQ6IGhvc3RQb3J0LCB0aW1lb3V0OiB0aW1lb3V0LCBjZmc6IGNmZ30sIG5pbAogfQogCiAvLyBDcmVhdGVzIGEgVFNTTFNvY2tldCBmcm9tIGEgbmV0LkFkZHIKQEAgLTgzLDI2ICs4NywzNiBAQAogCiAvLyBDb25uZWN0cyB0aGUgc29ja2V0LCBjcmVhdGluZyBhIG5ldyBzb2NrZXQgb2JqZWN0IGlmIG5lY2Vzc2FyeS4KIGZ1bmMgKHAgKlRTU0xTb2NrZXQpIE9wZW4oKSBlcnJvciB7Ci0JaWYgcC5Jc09wZW4oKSB7Ci0JCXJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKEFMUkVBRFlfT1BFTiwgIlNvY2tldCBhbHJlYWR5IGNvbm5lY3RlZC4iKQotCX0KLQlpZiBwLmFkZHIgPT0gbmlsIHsKLQkJcmV0dXJuIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oTk9UX09QRU4sICJDYW5ub3Qgb3BlbiBuaWwgYWRkcmVzcy4iKQotCX0KLQlpZiBsZW4ocC5hZGRyLk5ldHdvcmsoKSkgPT0gMCB7Ci0JCXJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKE5PVF9PUEVOLCAiQ2Fubm90IG9wZW4gYmFkIG5ldHdvcmsgbmFtZS4iKQotCX0KLQlpZiBsZW4ocC5hZGRyLlN0cmluZygpKSA9PSAwIHsKLQkJcmV0dXJuIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oTk9UX09QRU4sICJDYW5ub3Qgb3BlbiBiYWQgYWRkcmVzcy4iKQotCX0KIAl2YXIgZXJyIGVycm9yCi0JaWYgcC5jb25uLCBlcnIgPSB0bHMuRGlhbChwLmFkZHIuTmV0d29yaygpLCBwLmFkZHIuU3RyaW5nKCksIHAuY2ZnKTsgZXJyICE9IG5pbCB7Ci0JCXJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKE5PVF9PUEVOLCBlcnIuRXJyb3IoKSkKKwkvLyBJZiB3ZSBoYXZlIGEgaG9zdG5hbWUsIHdlIG5lZWQgdG8gcGFzcyB0aGUgaG9zdG5hbWUgdG8gdGxzLkRpYWwgZm9yCisJLy8gY2VydGlmaWNhdGUgaG9zdG5hbWUgY2hlY2tzLgorCWlmIHAuaG9zdFBvcnQgIT0gIiIgeworCQlpZiBwLmNvbm4sIGVyciA9IHRscy5EaWFsV2l0aERpYWxlcigmbmV0LkRpYWxlcnsKKwkJCVRpbWVvdXQ6IHAudGltZW91dH0sICJ0Y3AiLCBwLmhvc3RQb3J0LCBwLmNmZyk7IGVyciAhPSBuaWwgeworCQkJcmV0dXJuIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oTk9UX09QRU4sIGVyci5FcnJvcigpKQorCQl9CisJfSBlbHNlIHsKKwkJaWYgcC5Jc09wZW4oKSB7CisJCQlyZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihBTFJFQURZX09QRU4sICJTb2NrZXQgYWxyZWFkeSBjb25uZWN0ZWQuIikKKwkJfQorCQlpZiBwLmFkZHIgPT0gbmlsIHsKKwkJCXJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKE5PVF9PUEVOLCAiQ2Fubm90IG9wZW4gbmlsIGFkZHJlc3MuIikKKwkJfQorCQlpZiBsZW4ocC5hZGRyLk5ldHdvcmsoKSkgPT0gMCB7CisJCQlyZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihOT1RfT1BFTiwgIkNhbm5vdCBvcGVuIGJhZCBuZXR3b3JrIG5hbWUuIikKKwkJfQorCQlpZiBsZW4ocC5hZGRyLlN0cmluZygpKSA9PSAwIHsKKwkJCXJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKE5PVF9PUEVOLCAiQ2Fubm90IG9wZW4gYmFkIGFkZHJlc3MuIikKKwkJfQorCQlpZiBwLmNvbm4sIGVyciA9IHRscy5EaWFsV2l0aERpYWxlcigmbmV0LkRpYWxlcnsKKwkJCVRpbWVvdXQ6IHAudGltZW91dH0sIHAuYWRkci5OZXR3b3JrKCksIHAuYWRkci5TdHJpbmcoKSwgcC5jZmcpOyBlcnIgIT0gbmlsIHsKKwkJCXJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKE5PVF9PUEVOLCBlcnIuRXJyb3IoKSkKKwkJfQogCX0KIAlyZXR1cm4gbmlsCiB9CiAKLS8vIFJldHJlaXZlIHRoZSB1bmRlcmx5aW5nIG5ldC5Db25uCisvLyBSZXRyaWV2ZSB0aGUgdW5kZXJseWluZyBuZXQuQ29ubgogZnVuYyAocCAqVFNTTFNvY2tldCkgQ29ubigpIG5ldC5Db25uIHsKIAlyZXR1cm4gcC5jb25uCiB9CkBAIC0xNDUsMTEgKzE1OSw3IEBACiAJcmV0dXJuIHAuY29ubi5Xcml0ZShidWYpCiB9CiAKLWZ1bmMgKHAgKlRTU0xTb2NrZXQpIFBlZWsoKSBib29sIHsKLQlyZXR1cm4gcC5Jc09wZW4oKQotfQotCi1mdW5jIChwICpUU1NMU29ja2V0KSBGbHVzaCgpIGVycm9yIHsKK2Z1bmMgKHAgKlRTU0xTb2NrZXQpIEZsdXNoKGN0eCBjb250ZXh0LkNvbnRleHQpIGVycm9yIHsKIAlyZXR1cm4gbmlsCiB9CiAKQEAgLTE1OSwzICsxNjksOCBAQAogCX0KIAlyZXR1cm4gcC5jb25uLkNsb3NlKCkKIH0KKworZnVuYyAocCAqVFNTTFNvY2tldCkgUmVtYWluaW5nQnl0ZXMoKSAobnVtX2J5dGVzIHVpbnQ2NCkgeworCWNvbnN0IG1heFNpemUgPSBedWludDY0KDApCisJcmV0dXJuIG1heFNpemUgLy8gdGhlIHRocnV0aCBpcywgd2UganVzdCBkb24ndCBrbm93IHVubGVzcyBmcmFtZWQgaXMgdXNlZAorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC90cmFuc3BvcnQuZ28gYi9saWIvZ28vdGhyaWZ0L3RyYW5zcG9ydC5nbwppbmRleCA4YzA2MjJkLi5iYTI3MzhhIDEwMDY0NAotLS0gYS9saWIvZ28vdGhyaWZ0L3RyYW5zcG9ydC5nbworKysgYi9saWIvZ28vdGhyaWZ0L3RyYW5zcG9ydC5nbwpAQCAtMjAsNiArMjAsNyBAQAogcGFja2FnZSB0aHJpZnQKIAogaW1wb3J0ICgKKwkiY29udGV4dCIKIAkiZXJyb3JzIgogCSJpbyIKICkKQEAgLTMwLDEwICszMSwxOSBAQAogCUZsdXNoKCkgKGVyciBlcnJvcikKIH0KIAordHlwZSBDb250ZXh0Rmx1c2hlciBpbnRlcmZhY2UgeworCUZsdXNoKGN0eCBjb250ZXh0LkNvbnRleHQpIChlcnIgZXJyb3IpCit9CisKK3R5cGUgUmVhZFNpemVQcm92aWRlciBpbnRlcmZhY2UgeworCVJlbWFpbmluZ0J5dGVzKCkgKG51bV9ieXRlcyB1aW50NjQpCit9CisKIC8vIEVuY2Fwc3VsYXRlcyB0aGUgSS9PIGxheWVyCiB0eXBlIFRUcmFuc3BvcnQgaW50ZXJmYWNlIHsKIAlpby5SZWFkV3JpdGVDbG9zZXIKLQlGbHVzaGVyCisJQ29udGV4dEZsdXNoZXIKKwlSZWFkU2l6ZVByb3ZpZGVyCiAKIAkvLyBPcGVucyB0aGUgdHJhbnNwb3J0IGZvciBjb21tdW5pY2F0aW9uCiAJT3BlbigpIGVycm9yCkBAIC01NSw1ICs2NSw2IEBACiAJaW8uQnl0ZVJlYWRlcgogCWlvLkJ5dGVXcml0ZXIKIAlzdHJpbmdXcml0ZXIKLQlGbHVzaGVyCisJQ29udGV4dEZsdXNoZXIKKwlSZWFkU2l6ZVByb3ZpZGVyCiB9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3RyYW5zcG9ydF9mYWN0b3J5LmdvIGIvbGliL2dvL3RocmlmdC90cmFuc3BvcnRfZmFjdG9yeS5nbwppbmRleCA1MzNkMWI0Li5jODA1ODA3IDEwMDY0NAotLS0gYS9saWIvZ28vdGhyaWZ0L3RyYW5zcG9ydF9mYWN0b3J5LmdvCisrKyBiL2xpYi9nby90aHJpZnQvdHJhbnNwb3J0X2ZhY3RvcnkuZ28KQEAgLTI0LDE0ICsyNCwxNCBAQAogLy8gYSBTZXJ2ZXJUcmFuc3BvcnQgYW5kIHRoZW4gbWF5IHdhbnQgdG8gbXV0YXRlIHRoZW0gKGkuZS4gY3JlYXRlCiAvLyBhIEJ1ZmZlcmVkVHJhbnNwb3J0IGZyb20gdGhlIHVuZGVybHlpbmcgYmFzZSB0cmFuc3BvcnQpCiB0eXBlIFRUcmFuc3BvcnRGYWN0b3J5IGludGVyZmFjZSB7Ci0JR2V0VHJhbnNwb3J0KHRyYW5zIFRUcmFuc3BvcnQpIFRUcmFuc3BvcnQKKwlHZXRUcmFuc3BvcnQodHJhbnMgVFRyYW5zcG9ydCkgKFRUcmFuc3BvcnQsIGVycm9yKQogfQogCiB0eXBlIHRUcmFuc3BvcnRGYWN0b3J5IHN0cnVjdHt9CiAKIC8vIFJldHVybiBhIHdyYXBwZWQgaW5zdGFuY2Ugb2YgdGhlIGJhc2UgVHJhbnNwb3J0LgotZnVuYyAocCAqdFRyYW5zcG9ydEZhY3RvcnkpIEdldFRyYW5zcG9ydCh0cmFucyBUVHJhbnNwb3J0KSBUVHJhbnNwb3J0IHsKLQlyZXR1cm4gdHJhbnMKK2Z1bmMgKHAgKnRUcmFuc3BvcnRGYWN0b3J5KSBHZXRUcmFuc3BvcnQodHJhbnMgVFRyYW5zcG9ydCkgKFRUcmFuc3BvcnQsIGVycm9yKSB7CisJcmV0dXJuIHRyYW5zLCBuaWwKIH0KIAogZnVuYyBOZXdUVHJhbnNwb3J0RmFjdG9yeSgpIFRUcmFuc3BvcnRGYWN0b3J5IHsKZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvdHJhbnNwb3J0X3Rlc3QuZ28gYi9saWIvZ28vdGhyaWZ0L3RyYW5zcG9ydF90ZXN0LmdvCmluZGV4IDg2NDk1OGEuLjAxMjc4MDMgMTAwNjQ0Ci0tLSBhL2xpYi9nby90aHJpZnQvdHJhbnNwb3J0X3Rlc3QuZ28KKysrIGIvbGliL2dvL3RocmlmdC90cmFuc3BvcnRfdGVzdC5nbwpAQCAtMjAsNiArMjAsNyBAQAogcGFja2FnZSB0aHJpZnQKIAogaW1wb3J0ICgKKwkiY29udGV4dCIKIAkiaW8iCiAJIm5ldCIKIAkic3RyY29udiIKQEAgLTU0LDcgKzU1LDcgQEAKIAlpZiBlcnIgIT0gbmlsIHsKIAkJdC5GYXRhbGYoIlRyYW5zcG9ydCAlVCBjYW5ub3Qgd3JpdGUgYmluYXJ5IGRhdGEgb2YgbGVuZ3RoICVkOiAlcyIsIHdyaXRlVHJhbnMsIGxlbih0cmFuc3BvcnRfYmRhdGEpLCBlcnIpCiAJfQotCWVyciA9IHdyaXRlVHJhbnMuRmx1c2goKQorCWVyciA9IHdyaXRlVHJhbnMuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCiAJaWYgZXJyICE9IG5pbCB7CiAJCXQuRmF0YWxmKCJUcmFuc3BvcnQgJVQgY2Fubm90IGZsdXNoIHdyaXRlIG9mIGJpbmFyeSBkYXRhOiAlcyIsIHdyaXRlVHJhbnMsIGVycikKIAl9CkBAIC03NCw3ICs3NSw3IEBACiAJaWYgZXJyICE9IG5pbCB7CiAJCXQuRmF0YWxmKCJUcmFuc3BvcnQgJVQgY2Fubm90IHdyaXRlIGJpbmFyeSBkYXRhIDIgb2YgbGVuZ3RoICVkOiAlcyIsIHdyaXRlVHJhbnMsIGxlbih0cmFuc3BvcnRfYmRhdGEpLCBlcnIpCiAJfQotCWVyciA9IHdyaXRlVHJhbnMuRmx1c2goKQorCWVyciA9IHdyaXRlVHJhbnMuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCiAJaWYgZXJyICE9IG5pbCB7CiAJCXQuRmF0YWxmKCJUcmFuc3BvcnQgJVQgY2Fubm90IGZsdXNoIHdyaXRlIGJpbmFyeSBkYXRhIDI6ICVzIiwgd3JpdGVUcmFucywgZXJyKQogCX0KQEAgLTExMyw3ICsxMTQsNyBAQAogCWlmIGVyciAhPSBuaWwgewogCQl0LkZhdGFsZigiVHJhbnNwb3J0ICVUIGNhbm5vdCB3cml0ZSBiaW5hcnkgZGF0YSBvZiBsZW5ndGggJWQ6ICVzIiwgd3JpdGVUcmFucywgbGVuKHRyYW5zcG9ydF9iZGF0YSksIGVycikKIAl9Ci0JZXJyID0gd3JpdGVUcmFucy5GbHVzaCgpCisJZXJyID0gd3JpdGVUcmFucy5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKIAlpZiBlcnIgIT0gbmlsIHsKIAkJdC5GYXRhbGYoIlRyYW5zcG9ydCAlVCBjYW5ub3QgZmx1c2ggd3JpdGUgb2YgYmluYXJ5IGRhdGE6ICVzIiwgd3JpdGVUcmFucywgZXJyKQogCX0KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvdHlwZS5nbyBiL2xpYi9nby90aHJpZnQvdHlwZS5nbwppbmRleCA3YzY4YzJiLi40MjkyZmZjIDEwMDY0NAotLS0gYS9saWIvZ28vdGhyaWZ0L3R5cGUuZ28KKysrIGIvbGliL2dvL3RocmlmdC90eXBlLmdvCkBAIC00MCw3ICs0MCw3IEBACiAJTElTVCAgID0gMTUKIAlVVEY4ICAgPSAxNgogCVVURjE2ICA9IDE3Ci0JQklOQVJZID0gMTgKKwkvL0JJTkFSWSA9IDE4ICAgd3JvbmcgYW5kIHVudXN1ZWQKICkKIAogdmFyIHR5cGVOYW1lcyA9IG1hcFtpbnRdc3RyaW5newpAQCAtNDgsNiArNDgsNyBAQAogCVZPSUQ6ICAgIlZPSUQiLAogCUJPT0w6ICAgIkJPT0wiLAogCUJZVEU6ICAgIkJZVEUiLAorCURPVUJMRTogIkRPVUJMRSIsCiAJSTE2OiAgICAiSTE2IiwKIAlJMzI6ICAgICJJMzIiLAogCUk2NDogICAgIkk2NCIsCmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3psaWJfdHJhbnNwb3J0LmdvIGIvbGliL2dvL3RocmlmdC96bGliX3RyYW5zcG9ydC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2Q0MjY3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC96bGliX3RyYW5zcG9ydC5nbwpAQCAtMCwwICsxLDEzMiBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJImNvbXByZXNzL3psaWIiCisJImNvbnRleHQiCisJImlvIgorCSJsb2ciCispCisKKy8vIFRabGliVHJhbnNwb3J0RmFjdG9yeSBpcyBhIGZhY3RvcnkgZm9yIFRabGliVHJhbnNwb3J0IGluc3RhbmNlcwordHlwZSBUWmxpYlRyYW5zcG9ydEZhY3Rvcnkgc3RydWN0IHsKKwlsZXZlbCAgIGludAorCWZhY3RvcnkgVFRyYW5zcG9ydEZhY3RvcnkKK30KKworLy8gVFpsaWJUcmFuc3BvcnQgaXMgYSBUVHJhbnNwb3J0IGltcGxlbWVudGF0aW9uIHRoYXQgbWFrZXMgdXNlIG9mIHpsaWIgY29tcHJlc3Npb24uCit0eXBlIFRabGliVHJhbnNwb3J0IHN0cnVjdCB7CisJcmVhZGVyICAgIGlvLlJlYWRDbG9zZXIKKwl0cmFuc3BvcnQgVFRyYW5zcG9ydAorCXdyaXRlciAgICAqemxpYi5Xcml0ZXIKK30KKworLy8gR2V0VHJhbnNwb3J0IGNvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgTmV3VFpsaWJUcmFuc3BvcnQKK2Z1bmMgKHAgKlRabGliVHJhbnNwb3J0RmFjdG9yeSkgR2V0VHJhbnNwb3J0KHRyYW5zIFRUcmFuc3BvcnQpIChUVHJhbnNwb3J0LCBlcnJvcikgeworCWlmIHAuZmFjdG9yeSAhPSBuaWwgeworCQkvLyB3cmFwIG90aGVyIGZhY3RvcnkKKwkJdmFyIGVyciBlcnJvcgorCQl0cmFucywgZXJyID0gcC5mYWN0b3J5LkdldFRyYW5zcG9ydCh0cmFucykKKwkJaWYgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4gbmlsLCBlcnIKKwkJfQorCX0KKwlyZXR1cm4gTmV3VFpsaWJUcmFuc3BvcnQodHJhbnMsIHAubGV2ZWwpCit9CisKKy8vIE5ld1RabGliVHJhbnNwb3J0RmFjdG9yeSBjb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIE5ld1RabGliVHJhbnNwb3J0RmFjdG9yeQorZnVuYyBOZXdUWmxpYlRyYW5zcG9ydEZhY3RvcnkobGV2ZWwgaW50KSAqVFpsaWJUcmFuc3BvcnRGYWN0b3J5IHsKKwlyZXR1cm4gJlRabGliVHJhbnNwb3J0RmFjdG9yeXtsZXZlbDogbGV2ZWwsIGZhY3Rvcnk6IG5pbH0KK30KKworLy8gTmV3VFpsaWJUcmFuc3BvcnRGYWN0b3J5IGNvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgVFpsaWJUcmFuc3BvcnRGYWN0b3J5CisvLyBhcyBhIHdyYXBwZXIgb3ZlciBleGlzdGluZyB0cmFuc3BvcnQgZmFjdG9yeQorZnVuYyBOZXdUWmxpYlRyYW5zcG9ydEZhY3RvcnlXaXRoRmFjdG9yeShsZXZlbCBpbnQsIGZhY3RvcnkgVFRyYW5zcG9ydEZhY3RvcnkpICpUWmxpYlRyYW5zcG9ydEZhY3RvcnkgeworCXJldHVybiAmVFpsaWJUcmFuc3BvcnRGYWN0b3J5e2xldmVsOiBsZXZlbCwgZmFjdG9yeTogZmFjdG9yeX0KK30KKworLy8gTmV3VFpsaWJUcmFuc3BvcnQgY29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiBUWmxpYlRyYW5zcG9ydAorZnVuYyBOZXdUWmxpYlRyYW5zcG9ydCh0cmFucyBUVHJhbnNwb3J0LCBsZXZlbCBpbnQpICgqVFpsaWJUcmFuc3BvcnQsIGVycm9yKSB7CisJdywgZXJyIDo9IHpsaWIuTmV3V3JpdGVyTGV2ZWwodHJhbnMsIGxldmVsKQorCWlmIGVyciAhPSBuaWwgeworCQlsb2cuUHJpbnRsbihlcnIpCisJCXJldHVybiBuaWwsIGVycgorCX0KKworCXJldHVybiAmVFpsaWJUcmFuc3BvcnR7CisJCXdyaXRlcjogICAgdywKKwkJdHJhbnNwb3J0OiB0cmFucywKKwl9LCBuaWwKK30KKworLy8gQ2xvc2UgY2xvc2VzIHRoZSByZWFkZXIgYW5kIHdyaXRlciAoZmx1c2hpbmcgYW55IHVud3JpdHRlbiBkYXRhKSBhbmQgY2xvc2VzCisvLyB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQuCitmdW5jICh6ICpUWmxpYlRyYW5zcG9ydCkgQ2xvc2UoKSBlcnJvciB7CisJaWYgei5yZWFkZXIgIT0gbmlsIHsKKwkJaWYgZXJyIDo9IHoucmVhZGVyLkNsb3NlKCk7IGVyciAhPSBuaWwgeworCQkJcmV0dXJuIGVycgorCQl9CisJfQorCWlmIGVyciA6PSB6LndyaXRlci5DbG9zZSgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKwlyZXR1cm4gei50cmFuc3BvcnQuQ2xvc2UoKQorfQorCisvLyBGbHVzaCBmbHVzaGVzIHRoZSB3cml0ZXIgYW5kIGl0cyB1bmRlcmx5aW5nIHRyYW5zcG9ydC4KK2Z1bmMgKHogKlRabGliVHJhbnNwb3J0KSBGbHVzaChjdHggY29udGV4dC5Db250ZXh0KSBlcnJvciB7CisJaWYgZXJyIDo9IHoud3JpdGVyLkZsdXNoKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQorCXJldHVybiB6LnRyYW5zcG9ydC5GbHVzaChjdHgpCit9CisKKy8vIElzT3BlbiByZXR1cm5zIHRydWUgaWYgdGhlIHRyYW5zcG9ydCBpcyBvcGVuCitmdW5jICh6ICpUWmxpYlRyYW5zcG9ydCkgSXNPcGVuKCkgYm9vbCB7CisJcmV0dXJuIHoudHJhbnNwb3J0LklzT3BlbigpCit9CisKKy8vIE9wZW4gb3BlbnMgdGhlIHRyYW5zcG9ydCBmb3IgY29tbXVuaWNhdGlvbgorZnVuYyAoeiAqVFpsaWJUcmFuc3BvcnQpIE9wZW4oKSBlcnJvciB7CisJcmV0dXJuIHoudHJhbnNwb3J0Lk9wZW4oKQorfQorCitmdW5jICh6ICpUWmxpYlRyYW5zcG9ydCkgUmVhZChwIFtdYnl0ZSkgKGludCwgZXJyb3IpIHsKKwlpZiB6LnJlYWRlciA9PSBuaWwgeworCQlyLCBlcnIgOj0gemxpYi5OZXdSZWFkZXIoei50cmFuc3BvcnQpCisJCWlmIGVyciAhPSBuaWwgeworCQkJcmV0dXJuIDAsIE5ld1RUcmFuc3BvcnRFeGNlcHRpb25Gcm9tRXJyb3IoZXJyKQorCQl9CisJCXoucmVhZGVyID0gcgorCX0KKworCXJldHVybiB6LnJlYWRlci5SZWFkKHApCit9CisKKy8vIFJlbWFpbmluZ0J5dGVzIHJldHVybnMgdGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIGRhdGEgdGhhdCBpcyBzdGlsbCB0byBiZQorLy8gcmVhZC4KK2Z1bmMgKHogKlRabGliVHJhbnNwb3J0KSBSZW1haW5pbmdCeXRlcygpIHVpbnQ2NCB7CisJcmV0dXJuIHoudHJhbnNwb3J0LlJlbWFpbmluZ0J5dGVzKCkKK30KKworZnVuYyAoeiAqVFpsaWJUcmFuc3BvcnQpIFdyaXRlKHAgW11ieXRlKSAoaW50LCBlcnJvcikgeworCXJldHVybiB6LndyaXRlci5Xcml0ZShwKQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC96bGliX3RyYW5zcG9ydF90ZXN0LmdvIGIvbGliL2dvL3RocmlmdC96bGliX3RyYW5zcG9ydF90ZXN0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjNmYxMWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L3psaWJfdHJhbnNwb3J0X3Rlc3QuZ28KQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgKAorCSJjb21wcmVzcy96bGliIgorCSJ0ZXN0aW5nIgorKQorCitmdW5jIFRlc3RabGliVHJhbnNwb3J0KHQgKnRlc3RpbmcuVCkgeworCXRyYW5zLCBlcnIgOj0gTmV3VFpsaWJUcmFuc3BvcnQoTmV3VE1lbW9yeUJ1ZmZlcigpLCB6bGliLkJlc3RDb21wcmVzc2lvbikKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbChlcnIpCisJfQorCVRyYW5zcG9ydFRlc3QodCwgdHJhbnMsIHRyYW5zKQorfQorCit0eXBlIER1bW15VHJhbnNwb3J0RmFjdG9yeSBzdHJ1Y3R7fQorCitmdW5jIChwICpEdW1teVRyYW5zcG9ydEZhY3RvcnkpIEdldFRyYW5zcG9ydCh0cmFucyBUVHJhbnNwb3J0KSAoVFRyYW5zcG9ydCwgZXJyb3IpIHsKKwlyZXR1cm4gTmV3VE1lbW9yeUJ1ZmZlcigpLCBuaWwKK30KKworZnVuYyBUZXN0WmxpYkZhY3RvcnlUcmFuc3BvcnRXaXRoRmFjdG9yeSh0ICp0ZXN0aW5nLlQpIHsKKwlmYWN0b3J5IDo9IE5ld1RabGliVHJhbnNwb3J0RmFjdG9yeVdpdGhGYWN0b3J5KAorCQl6bGliLkJlc3RDb21wcmVzc2lvbiwKKwkJJkR1bW15VHJhbnNwb3J0RmFjdG9yeXt9LAorCSkKKwlidWZmZXIgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCisJdHJhbnMsIGVyciA6PSBmYWN0b3J5LkdldFRyYW5zcG9ydChidWZmZXIpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoZXJyKQorCX0KKwlUcmFuc3BvcnRUZXN0KHQsIHRyYW5zLCB0cmFucykKK30KKworZnVuYyBUZXN0WmxpYkZhY3RvcnlUcmFuc3BvcnRXaXRob3V0RmFjdG9yeSh0ICp0ZXN0aW5nLlQpIHsKKwlmYWN0b3J5IDo9IE5ld1RabGliVHJhbnNwb3J0RmFjdG9yeVdpdGhGYWN0b3J5KHpsaWIuQmVzdENvbXByZXNzaW9uLCBuaWwpCisJYnVmZmVyIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQorCXRyYW5zLCBlcnIgOj0gZmFjdG9yeS5HZXRUcmFuc3BvcnQoYnVmZmVyKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsKGVycikKKwl9CisJVHJhbnNwb3J0VGVzdCh0LCB0cmFucywgdHJhbnMpCit9CmRpZmYgLS1naXQgYS9saWIvaGF4ZS9SRUFETUUubWQgYi9saWIvaGF4ZS9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc0Yjc3MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL1JFQURNRS5tZApAQCAtMCwwICsxLDE2NCBAQAorVGhyaWZ0IEhheGUgU29mdHdhcmUgTGlicmFyeQorCitMaWNlbnNlCis9PT09PT09CisKK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK29yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCitkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCit0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCit3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKK3NwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKK3VuZGVyIHRoZSBMaWNlbnNlLgorCitVc2luZyBUaHJpZnQgd2l0aCBIYXhlCis9PT09PT09PT09PT09PT09PT09PT09PT0KKworSGF4ZSBzZXR1cAorLS0tLS0tLS0tLS0tLS0tCisKK1RocmlmdCByZXF1aXJlcyBIYXhlIDMuMS4zLiBJbnN0YWxsZXJzIGZvciBXaW5kb3dzIGFuZCBPU1gKK3BsYXRmb3JtcyBhcmUgYXZhaWxhYmxlIGF0IGBodHRwOi8vaGF4ZS5vcmcvZG93bmxvYWRgLiAKKworRGVwZW5kaW5nIG9uIHRoZSBkZXNpcmVkIHRhcmdldHMsIHlvdSBtYXkgaGF2ZSB0byBpbnN0YWxsIHRoZSBhcHByb3ByaWF0ZSBIYXhlTGlicyAKK2FmdGVyIGluc3RhbGxpbmcgSGF4ZSBpdHNlbGYuIEZvciBleGFtcGxlLCBpZiB5b3UgcGxhbiB0byB0YXJnZXQgQyMsIEphdmEgYW5kIEMrKywKK2VudGVyIHRoZSBmb2xsb3dpbmcgY29tbWFuZHMgYWZ0ZXIgaW5zdGFsbGluZyBIYXhlOgorCisgICAgaGF4ZWxpYiBpbnN0YWxsIGh4Y3BwCisgICAgaGF4ZWxpYiBpbnN0YWxsIGh4amF2YQorICAgIGhheGVsaWIgaW5zdGFsbCBoeGNzCisKK0ZvciBvdGhlciB0YXJnZXRzLCBwbGVhc2UgY29uc3VsdCB0aGUgSGF4ZSBkb2N1bWVudGF0aW9uIHdoZXRoZXIgb3Igbm90IGFueSBhZGRpdGlvbmFsCit0YXJnZXQgbGlicmFyaWVzIG5lZWQgdG8gYmUgaW5zdGFsbGVkIGFuZCBob3cgdG8gYWNoaWV2ZSB0aGlzLgorCisKK0hheGUgb24gTGludXggCistLS0tLS0tLS0tLS0tLS0KKworRm9yIExpbnV4IHBsYXRmb3JtcyBpdCBpcyByZWNvbW1lbmRlZCB0byB1c2UgdGhlIGRpc3Ryby1zcGVjaWZpYyBwYWNrYWdlCittYW5hZ2VyLCB3aGVyZSBwb3NzaWJsZS4gTW9yZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgYXQgdGhlIAorSGF4ZSBMaW51eCBkb3dubG9hZCBzZWN0aW9uOiBodHRwOi8vaGF4ZS5vcmcvZG93bmxvYWQvbGludXgKKworSWYgeW91IHJ1biBpbnRvIHRoZSBlcnJvciBtZXNzYWdlIAorCisgICAgVW5jYXVnaHQgZXhjZXB0aW9uIC0gbG9hZC5jKDIzNykgOiBGYWlsZWQgdG8gbG9hZCBsaWJyYXJ5IDogL3Vzci9saWIvbmVrby9yZWdleHAubmRsbCAgCisJKGxpYnBjcmUuc28uMzogY2Fubm90IG9wZW4gc2hhcmVkIG9iamVjdCBmaWxlOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5KQorCit0aGlzIGNhbiBiZSBzb2x2ZWQgZGVwZW5kaW5nIG9uIHlvdXIgT1NlcyBiaXRuZXNzIGJ5IGVpdGhlcgorCisgICAgc3VkbyBsbiAtc2YgL3Vzci9saWIvbGlicGNyZS5zby4xIC91c3IvbGliL2xpYnBjcmUuc28uMworICAgIHN1ZG8gbGRjb25maWcKKwkKK29yCisKKyAgICBzdWRvIGxuIC1zZiAvdXNyL2xpYjY0L2xpYnBjcmUuc28uMSAvdXNyL2xpYjY0L2xpYnBjcmUuc28uMworICAgIHN1ZG8gbGRjb25maWcKKworVGhyaWZ0IEhheGUgYmluZGluZ3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKwkKK1RocmlmdCBIYXhlIGJpbmRpbmdzIGNhbiBiZSBzZXQgdXAgdmlhIHRoZSBgaGF4ZWxpYmAgdG9vbCAgCitlaXRoZXIgZnJvbSB0aGUgb2ZmaWNpYWwgQVNGIHJlcG8sIG9yIHZpYSB0aGUgZ2l0aHViIG1pcnJvci4KKworLSBUbyBzZXQgdXAgYW55ICoqc3RhYmxlIHZlcnNpb24qKiwgY2hvb3NlIHRoZSBhcHByb3ByaWF0ZSBicmFuY2ggKGUuZy4gYDEuMC4wYCwgZXRjLik6CisKKyAgICAtIGBoYXhlbGliIGdpdCB0aHJpZnQgaHR0cHM6Ly9naXQuYXBhY2hlLm9yZy90aHJpZnQuZ2l0IDEuMC4wIGxpYi9oYXhlYAorICAgIC0gYGhheGVsaWIgZ2l0IHRocmlmdCBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC5naXQgMS4wLjAgbGliL2hheGVgCisKKy0gVG8gc2V0IHVwIHRoZSBjdXJyZW50ICoqZGV2ZWxvcG1lbnQgdmVyc2lvbioqLCB1c2UgdGhlIGBtYXN0ZXJgIGJyYW5jaDoKKyAgCisgICAgLSBgaGF4ZWxpYiBnaXQgdGhyaWZ0IGh0dHBzOi8vZ2l0LmFwYWNoZS5vcmcvdGhyaWZ0LmdpdCBtYXN0ZXIgbGliL2hheGVgCQorICAgIC0gYGhheGVsaWIgZ2l0IHRocmlmdCBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC5naXQgbWFzdGVyIGxpYi9oYXhlYAorCitBcyB1c3VhbCwgdGhlIGluc3RhbGxlZCBsaWJyYXJ5IGNhbiBiZSB1cGRhdGVkIHVzaW5nIGBoYXhlbGliIHVwZ3JhZGVgIAorb3IgYGhheGVsaWIgdXBkYXRlIHRocmlmdGAuCisKK0luIG9yZGVyIHRvIHdvcmsgd2l0aCBUaHJpZnQsIHlvdSB3aWxsIG5lZWQgdG8gaW5zdGFsbCB0aGUgVGhyaWZ0IGNvbXBpbGVyIAorb3IgYnVpbGQgZnJvbSBzb3VyY2UsIGRlcGVuZGluZyBvbiB5b3VyIG9wZXJhdGluZyBzeXN0ZW0uIEFwcHJvcHJpYXRlIAorZG93bmxvYWRzIGFuZCBtb3JlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBhdCBodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcKKwkKK1RvIGdldCBzdGFydGVkLCB2aXNpdCB0aGUgL3R1dG9yaWFsL2hheGUgYW5kIC90ZXN0L2hheGUgZGlycyBmb3IgZXhhbXBsZXMuIAorSWYgeW91IGFyZSB1c2luZyBISURFIG9yIHRoZSBGbGFzaERldmVsb3AgSURFLCB5b3UnbGwgZmluZCBhcHByb3ByaWF0ZSAKK3Byb2plY3QgZmlsZXMgaW4gdGhlc2UgZm9sZGVycy4KKworCitDdXJyZW50IHN0YXR1cworPT09PT09PT09PT09PT09PT09PT09PT09CistIHRlc3RlZCB3aXRoIEhheGUgQysrIHRhcmdldAorLSB0ZXN0ZWQgd2l0aCBIYXhlIFBIUCB0YXJnZXQgKGNvbnNvbGUvd2ViIHNlcnZlciwgYmluYXJ5IHByb3RvY29scykKKy0gdHJhbnNwb3J0czogU29ja2V0LCBIVFRQIChzZXJ2ZXJzIHJ1biBpbnNpZGUgUEhQIHNlcnZlci9QSFAgdGFyZ2V0IG9ubHkpLCBTdHJlYW0KKy0gcHJvdG9jb2xzOiBCaW5hcnksIEpTT04sIE11bHRpcGxleCwgQ29tcGFjdAorLSB0dXRvcmlhbCBjbGllbnQgYW5kIHNlcnZlciBhdmFpbGFibGUKKy0gY3Jvc3MtdGVzdCBjbGllbnQgYW5kIHNlcnZlciBhdmFpbGFibGUgCisKKworRnVydGhlciBkZXZlbG9wbWVudHMKKz09PT09PT09PT09PT09PT09PT09PT09PQorLSBpbXByb3ZlIHRvIHdvcmsgd2l0aCBDIywgSmF2YSBhbmQgSmF2YVNjcmlwdCBIYXhlL09wZW5GTCB0YXJnZXRzCistIGltcHJvdmUgdG8gd29yayB3aXRoIG1vcmUgKGlkZWFsbHkgYWxsKSBIYXhlL09wZW5GTCB0YXJnZXRzCistIGFkZCBIVFRQIHNlcnZlciwgdXBkYXRlIHR1dG9yaWFsIGFuZCB0ZXN0cyBhY2NvcmRpbmdseQorCisKK0tub3duIHJlc3RyaWN0aW9ucworPT09PT09PT09PT09PT09PT09PT09PT09CisKK0FsdGhvdWdoIGRlc2lnbmVkIHdpdGggbWF4aW11bSBwb3J0YWJpbGl0eSBpbiBtaW5kLCBmb3IgdGVjaG5pY2FsIHJlYXNvbnMgc29tZSBwbGF0Zm9ybXMKK21heSBvbmx5IHN1cHBvcnQgcGFydHMgb2YgdGhlIGxpYnJhcnksIG9yIG5vdCBiZSBjb21wYXRpYmxlIGF0IGFsbC4KKworSmF2YXNjcmlwdDoKKy0gdHV0b3JpYWwgZmFpbHMgdG8gYnVpbGQgYmVjYXVzZSBvZiB1bnN1cHBvcnRlZCBTeXMuYXJncworCitQSFAgSFRUUCBTZXJ2ZXIgbm90ZXMKKz09PT09PT09PT09PT09PT09PT09PT09PQorCistIHlvdSBoYXZlIHRvIGltcG9ydCBQSFAgZmlsZXMgZ2VuZXJhdGVkIGJ5IGhheGUgaW50byBQSFAKK2BgYHBocAorcmVxdWlyZV9vbmNlICBkaXJuYW1lKF9fRklMRV9fKSAuICcvYmluL3BocC13ZWItc2VydmVyL01haW4tZGVidWcucGhwJzsKK2BgYAorCistIHRyYWNlKCkgYnkgZGVmYXVsdCBvdXRwdXRzIGludG8gc3Rkb3V0IChodHRwIHJlc3BvbnNlKSwgc28geW91IGhhdmUgdG8gcmVkaXJlY3QgaXQgdG8gc3RkZXJyIG9yIHlvdSBvd24gbG9ncywgc29tZXRoaW5nIGxpa2UKK2BgYGhheGUKKy8vcmVtYXAgdHJhY2UgdG8gZXJyb3IgbG9nCitoYXhlLkxvZy50cmFjZSA9IGZ1bmN0aW9uKHY6RHluYW1pYywgP2luZm9zOmhheGUuUG9zSW5mb3MpIAoreyAKKwkvL3NpbXVsYXRlIG5vcm1hbCB0cmFjZSBodHRwczovL2dpdGh1Yi5jb20vSGF4ZUZvdW5kYXRpb24vaGF4ZS9ibG9iL2RldmVsb3BtZW50L3N0ZC9oYXhlL0xvZy5oeAorCXZhciBuZXdWYWx1ZSA6IER5bmFtaWM7CisJaWYgKGluZm9zICE9IG51bGwgJiYgaW5mb3MuY3VzdG9tUGFyYW1zIT1udWxsKSB7CisJCXZhciBleHRyYTpTdHJpbmcgPSAiIjsKKwkJZm9yKCB2IGluIGluZm9zLmN1c3RvbVBhcmFtcyApCisJCQlleHRyYSArPSAiLCIgKyB2OworCQluZXdWYWx1ZSA9IHYgKyBleHRyYTsKKwl9CisJZWxzZSB7CisJCW5ld1ZhbHVlID0gdjsKKwl9CisJdmFyIG1zZyA9IGluZm9zICE9IG51bGwgPyBpbmZvcy5maWxlTmFtZSArICc6JyArIGluZm9zLmxpbmVOdW1iZXIgKyAnOiAnIDogJyc7CisJU3lzLnN0ZGVycigpLndyaXRlU3RyaW5nKCcke21zZ30ke25ld1ZhbHVlfVxuJyk7Cit9CitgYGAKKworLSB0byBhbGxvdyB0aHJpZnQgc2VydmVyIHRvIHJlYWQvd3JpdGUgSFRUUCByZXF1ZXN0L3Jlc3BvbnNlLCBpdCBzaG91bGQgYmUgcG9pbnRlZCBvdXQgdG8gcGhwIHN0cmVhbXMKK2BgYGhheGUKK3RyYW5zcG9ydCA9CW5ldyBUV3JhcHBpbmdTZXJ2ZXJUcmFuc3BvcnQoCisJCQkJbmV3IFRTdHJlYW1UcmFuc3BvcnQoCisJCQkJCW5ldyBURmlsZVN0cmVhbSgicGhwOi8vaW5wdXQiLCBSZWFkKSwKKwkJCQkJbmV3IFRGaWxlU3RyZWFtKCJwaHA6Ly9vdXRwdXQiLCBBcHBlbmQpCisJCQkJCSkKKwkJCQkpOworYGBgCisKKy0gVFNpbXBsZVNlcnZlciBkb2Vzbid0IHN0b3AgYWZ0ZXIgZmlyc3QgY2FsbCwgc28gcHJvY2Vzc29yLnByb2Nlc3MoKSBzaG91bGQgYmUgY2FsbGVkIGluc3RlYWQsIG9yIHVzZSBydW5PbmNlIHByb3BlcnR5IAorYGBgaGF4ZQordmFyIHNlcnZlciA9IG5ldyBUU2ltcGxlU2VydmVyKCBwcm9jZXNzb3IsIHRyYW5zcG9ydCwgdHJhbnNmYWN0b3J5LCBwcm90ZmFjdG9yeSk7CitzZXJ2ZXIucnVuT25jZSA9IHRydWU7CitgYGAKKwpkaWZmIC0tZ2l0IGEvbGliL2hheGUvY29kaW5nX3N0YW5kYXJkcy5tZCBiL2xpYi9oYXhlL2NvZGluZ19zdGFuZGFyZHMubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEwMzkwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL2NvZGluZ19zdGFuZGFyZHMubWQKQEAgLTAsMCArMSBAQAorUGxlYXNlIGZvbGxvdyBbR2VuZXJhbCBDb2RpbmcgU3RhbmRhcmRzXSgvZG9jL2NvZGluZ19zdGFuZGFyZHMubWQpCmRpZmYgLS1naXQgYS9saWIvaGF4ZS9oYXhlbGliLmpzb24gYi9saWIvaGF4ZS9oYXhlbGliLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTkyYWQ5MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL2hheGVsaWIuanNvbgpAQCAtMCwwICsxLDEyIEBACit7CisJIm5hbWUiOiAidGhyaWZ0IiwKKwkidXJsIiA6ICJodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmciLAorCSJsaWNlbnNlIjogIkFwYWNoZSIsCisJInRhZ3MiOiBbInRocmlmdCIsICJycGMiLCAic2VyaWFsaXphdGlvbiIsICJjcm9zcyIsICJmcmFtZXdvcmsiXSwKKwkiZGVzY3JpcHRpb24iOiAiSGF4ZSBiaW5kaW5ncyBmb3IgdGhlIEFwYWNoZSBUaHJpZnQgUlBDIGFuZCBzZXJpYWxpemF0aW9uIGZyYW1ld29yayIsCisJInZlcnNpb24iOiAiMS4wLjAiLAorCSJyZWxlYXNlbm90ZSI6ICJMaWNlbnNlZCB1bmRlciBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFRoZSBBcGFjaGUgVGhyaWZ0IGNvbXBpbGVyIG5lZWRzIHRvIGJlIGluc3RhbGxlZCBzZXBhcmF0ZWx5LiIsCisJImNvbnRyaWJ1dG9ycyI6IFsiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikiXSwKKwkiZGVwZW5kZW5jaWVzIjogeyB9LAorCSJjbGFzc1BhdGgiOiAic3JjIgorfQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L0Fic3RyYWN0TWV0aG9kRXJyb3IuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvQWJzdHJhY3RNZXRob2RFcnJvci5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGI4MTUzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L0Fic3RyYWN0TWV0aG9kRXJyb3IuaHgKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OworCisjaWYgZmxhc2gKK2ltcG9ydCBmbGFzaC5lcnJvcnMuSWxsZWdhbE9wZXJhdGlvbkVycm9yOworI2Vsc2UKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOworI2VuZAorCitjbGFzcyBBYnN0cmFjdE1ldGhvZEVycm9yCisjaWYgZmxhc2gKK2V4dGVuZHMgSWxsZWdhbE9wZXJhdGlvbkVycm9yCisjZWxzZQorZXh0ZW5kcyBURXhjZXB0aW9uCisjZW5kCit7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KG1lc3NhZ2UgOiBTdHJpbmc9IiIpIHsKKyAgICAgICAgICBzdXBlcigiQXR0ZW1wdCB0byBjYWxsIGFuIGFic3RyYWN0IG1ldGhvZCIpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L0FyZ3VtZW50RXJyb3IuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvQXJndW1lbnRFcnJvci5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2EwNGZkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L0FyZ3VtZW50RXJyb3IuaHgKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OworCisjaWYgISBmbGFzaAorLy8gcHJlZGVmaW5lZCBmb3IgZmxhc2ggb25seQorY2xhc3MgQXJndW1lbnRFcnJvciBleHRlbmRzIFRFeGNlcHRpb24geworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcobXNnIDogU3RyaW5nID0gIiIpIHsKKyAgICAgICAgc3VwZXIobXNnKTsKKyAgICB9Cit9CisjZW5kCmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvTGltaXRzLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L0xpbWl0cy5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGVlYzNhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L0xpbWl0cy5oeApAQCAtMCwwICsxLDQ0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7CisKK2NsYXNzIExpbWl0cyB7CisKKyAgICAvLyBIYXhlIGxpbWl0cyBhcmUgbm90IGZpeGVkIHZhbHVlcywgdGhleSBkZXBlbmQgb24gdGhlIHRhcmdldCBwbGF0Zm9ybQorICAgIC8vIEZvciBleGFtcGxlLCBuZWtvIGxpbWl0cyBhbiBpbnQgdG8gMzEgYml0cyBpbnN0ZWFkIG9mIDMyLiBTbyB3ZSBkZXRlY3QKKyAgICAvLyB0aGUgdmFsdWVzIG9uY2UgZHVyaW5nIGludGlhbGlzYXRpb24gaW4gb3JkZXIgdG8KKyAgICAvLyAoYSkgZ2V0IHRoZSByaWdodCB2YWx1ZXMgZm9yIHRoZSBjdXJyZW50ICBwbGF0Zm9ybSwgYW5kCisgICAgLy8gKGIpIHByZXZlbnQgdXMgZnJvbSBkZXBlbmRlY2llcyB0byBhIGJ1bmNoIG9mIGRlZmluZXMKKworICAgIHB1YmxpYyBzdGF0aWMgdmFyIEkzMl9NQVggPSB7CisgICAgICAgIHZhciBsYXN0IDogSW50ID0gMDsKKyAgICAgICAgdmFyIG5leHQgOiBJbnQgPSAwOworICAgICAgICBmb3IoYml0IGluIDAgLi4uIDMyKSB7CisgICAgICAgICAgICBsYXN0ID0gbmV4dDsKKyAgICAgICAgICAgIG5leHQgPSBsYXN0IHwgKDEgPDwgYml0KTsKKyAgICAgICAgICAgIGlmKG5leHQgPCAwKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbGFzdDsgLy8gZmluYWwgdmFsdWUKKyAgICB9CisKKyAgICAvLyBhZGQgd2hhdGV2ZXIgeW91IG5lZWQKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmU4NDRmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5oeApAQCAtMCwwICsxLDEwNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTdHJ1Y3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGU7CisKKyAgLyoqCisgICAqIEFwcGxpY2F0aW9uIGxldmVsIGV4Y2VwdGlvbgorICAgKi8KK2NsYXNzIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBleHRlbmRzIFRFeGNlcHRpb24geworCisgICAgcHJpdmF0ZSBzdGF0aWMgdmFyIFRBUFBMSUNBVElPTl9FWENFUFRJT05fU1RSVUNUID0geyBuZXcgVFN0cnVjdCgiVEFwcGxpY2F0aW9uRXhjZXB0aW9uIik7IH07CisgICAgcHJpdmF0ZSBzdGF0aWMgdmFyIE1FU1NBR0VfRklFTEQgPSB7IG5ldyBURmllbGQoIm1lc3NhZ2UiLCBUVHlwZS5TVFJJTkcsIDEpOyB9OworICAgIHByaXZhdGUgc3RhdGljIHZhciBUWVBFX0ZJRUxEID0geyBuZXcgVEZpZWxkKCJ0eXBlIiwgVFR5cGUuSTMyLCAyKTsgfTsKKworICAgIC8vIFdBUk5JTkc6IFRoZXNlIGFyZSBzdWJqZWN0IHRvIGJlIGV4dGVuZGVkIGluIHRoZSBmdXR1cmUsIHNvIHdlIGNhbid0IHVzZSBlbnVtcworICAgIC8vIHdpdGggSGF4ZSAzLjEuMyBiZWNhdXNlIG9mIGh0dHBzOi8vZ2l0aHViLmNvbS9IYXhlRm91bmRhdGlvbi9oYXhlL2lzc3Vlcy8zNjQ5CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIFVOS05PV04gOiBJbnQgPSAwOworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBVTktOT1dOX01FVEhPRCA6IEludCA9IDE7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIElOVkFMSURfTUVTU0FHRV9UWVBFIDogSW50ID0gMjsKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgV1JPTkdfTUVUSE9EX05BTUUgOiBJbnQgPSAzOworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBCQURfU0VRVUVOQ0VfSUQgOiBJbnQgPSA0OworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBNSVNTSU5HX1JFU1VMVCA6IEludCA9IDU7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIElOVEVSTkFMX0VSUk9SIDogSW50ID0gNjsKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgUFJPVE9DT0xfRVJST1IgOiBJbnQgPSA3OworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBJTlZBTElEX1RSQU5TRk9STSA6IEludCA9IDg7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIElOVkFMSURfUFJPVE9DT0wgOiBJbnQgPSA5OworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBVTlNVUFBPUlRFRF9DTElFTlRfVFlQRSA6IEludCA9IDEwOworCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldyh0eXBlIDogSW50ID0gVU5LTk9XTiwgbWVzc2FnZSA6IFN0cmluZyA9ICIiKSB7CisgICAgICBzdXBlcihtZXNzYWdlLCB0eXBlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHJlYWQoaXByb3Q6VFByb3RvY29sKSA6IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICB2YXIgZmllbGQ6VEZpZWxkOworICAgICAgaXByb3QucmVhZFN0cnVjdEJlZ2luKCk7CisKKyAgICAgIHZhciBtZXNzYWdlIDogU3RyaW5nID0gbnVsbDsKKyAgICAgIHZhciB0eXBlIDogSW50ID0gVU5LTk9XTjsKKworICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgZmllbGQgPSBpcHJvdC5yZWFkRmllbGRCZWdpbigpOworICAgICAgICBpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5TVE9QKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChmaWVsZC5pZCkgeworICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIGlmIChmaWVsZC50eXBlID09IFRUeXBlLlNUUklORykgeworICAgICAgICAgICAgICBtZXNzYWdlID0gaXByb3QucmVhZFN0cmluZygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgIFRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuSTMyKSB7CisgICAgICAgICAgICAgIHR5cGUgPSBpcHJvdC5yZWFkSTMyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsKKyAgICAgICAgfQorICAgICAgICBpcHJvdC5yZWFkRmllbGRFbmQoKTsKKyAgICAgIH0KKyAgICAgIGlwcm90LnJlYWRTdHJ1Y3RFbmQoKTsKKyAgICAgIHJldHVybiBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKHR5cGUsIG1lc3NhZ2UpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZShvcHJvdDpUUHJvdG9jb2wpIDogVm9pZCB7CisgICAgICAgIG9wcm90LndyaXRlU3RydWN0QmVnaW4oVEFQUExJQ0FUSU9OX0VYQ0VQVElPTl9TVFJVQ1QpOworICAgICAgICBpZiAoZXJyb3JNc2cgIT0gbnVsbCkgeworICAgICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihNRVNTQUdFX0ZJRUxEKTsKKyAgICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhlcnJvck1zZyk7CisgICAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpOworICAgICAgICB9CisgICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihUWVBFX0ZJRUxEKTsKKyAgICAgICAgb3Byb3Qud3JpdGVJMzIoZXJyb3JJRCk7CisgICAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKTsKKyAgICAgICAgb3Byb3Qud3JpdGVGaWVsZFN0b3AoKTsKKyAgICAgICAgb3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKTsKKyAgICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQmFzZS5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQmFzZS5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGUwYmViCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RCYXNlLmh4CkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKKworLy8gTWFrZSBzdXJlIHdlIHVzZSBhdCBsZWFzdCAzLjEuMworLy8gU29tZSBMaW51eCBwbGF0Zm9ybXMgaGF2ZSB3YWFhYXkgdG9vIG9sZCBwYWNrYWdlcyBpbiB0aGVpciByZXBvcworLy8gUHJvIFRpcDogTG9vayBhdCBodHRwOi8vb3BlbmZsLmNvbSBmb3IgYSBnb29kIExpbnV4IGluc3RhbGwgc2NyaXB0CisjaWYoIGhheGVfdmVyIDwgMy4xMDMpCisjZXJyb3IgSGF4ZSAzLjEuMyBvciBuZXdlciByZXF1aXJlZCwgc29ycnkhCisjZW5kCisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2w7CisKKyAgLyoqCisgICAqIEdlbmVyaWMgYmFzZSBpbnRlcmZhY2UgZm9yIGdlbmVyYXRlZCBUaHJpZnQgb2JqZWN0cy4KKyAgICoKKyAgICovCitpbnRlcmZhY2UgVEJhc2UgeworCisgICAgLyoqCisgICAgICogUmVhZHMgdGhlIFRPYmplY3QgZnJvbSB0aGUgZ2l2ZW4gaW5wdXQgcHJvdG9jb2wuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaXByb3QgSW5wdXQgcHJvdG9jb2wKKyAgICAgKi8KKyAgICBmdW5jdGlvbiByZWFkKGlwcm90OlRQcm90b2NvbCkgOiBWb2lkOworCisgICAgLyoqCisgICAgICogV3JpdGVzIHRoZSBvYmplY3RzIG91dCB0byB0aGUgcHJvdG9jb2wKKyAgICAgKgorICAgICAqIEBwYXJhbSBvcHJvdCBPdXRwdXQgcHJvdG9jb2wKKyAgICAgKi8KKyAgICBmdW5jdGlvbiB3cml0ZShvcHJvdDpUUHJvdG9jb2wpIDogVm9pZDsKKworICAgIC8qKgorICAgICAqIENoZWNrIGlmIGEgZmllbGQgaXMgY3VycmVudGx5IHNldCBvciB1bnNldC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWVsZElkIFRoZSBmaWVsZCdzIGlkIHRhZyBhcyBmb3VuZCBpbiB0aGUgSURMLgorICAgICAqLworICAgIGZ1bmN0aW9uIGlzU2V0KGZpZWxkSWQgOiBJbnQpIDogQm9vbDsKKworICAgIC8qKgorICAgICAqIEdldCBhIGZpZWxkJ3MgdmFsdWUgYnkgaWQuIFByaW1pdGl2ZSB0eXBlcyB3aWxsIGJlIHdyYXBwZWQgaW4gdGhlCisgICAgICogYXBwcm9wcmlhdGUgImJveGVkIiB0eXBlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWVsZElkIFRoZSBmaWVsZCdzIGlkIHRhZyBhcyBmb3VuZCBpbiB0aGUgSURMLgorICAgICAqLworICAgIGZ1bmN0aW9uIGdldEZpZWxkVmFsdWUoZmllbGRJZCA6IEludCkgOiBEeW5hbWljOworCisgICAgLyoqCisgICAgICogU2V0IGEgZmllbGQncyB2YWx1ZSBieSBpZC4gUHJpbWl0aXZlIHR5cGVzIG11c3QgYmUgImJveGVkIiBpbiB0aGUKKyAgICAgKiBhcHByb3ByaWF0ZSBvYmplY3Qgd3JhcHBlciB0eXBlLgorICAgICAqCisgICAgICogQHBhcmFtIGZpZWxkSWQgVGhlIGZpZWxkJ3MgaWQgdGFnIGFzIGZvdW5kIGluIHRoZSBJREwuCisgICAgICovCisgICAgZnVuY3Rpb24gc2V0RmllbGRWYWx1ZShmaWVsZElkIDogSW50LCB2YWx1ZSA6IER5bmFtaWMpIDogVm9pZDsKK30KZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9URXhjZXB0aW9uLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RFeGNlcHRpb24uaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRmYTFmZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9URXhjZXB0aW9uLmh4CkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKKworY2xhc3MgVEV4Y2VwdGlvbiB7CisKKyAgICBAOmlzVmFyCisgICAgcHVibGljIHZhciBlcnJvcklEKGRlZmF1bHQsbnVsbCkgOiBJbnQ7CisgICAgQDppc1ZhcgorICAgIHB1YmxpYyB2YXIgZXJyb3JNc2coZGVmYXVsdCxudWxsKSA6IFN0cmluZzsKKworCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldyhtc2cgOiBTdHJpbmcgPSAiIiwgaWQgOiBJbnQgPSAwKSB7CisgICAgICAgIGVycm9ySUQgPSBpZDsKKyAgICAgICAgZXJyb3JNc2cgPSBtc2c7CisgICAgfQorCit9CisgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RGaWVsZFJlcXVpcmVtZW50VHlwZS5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9URmllbGRSZXF1aXJlbWVudFR5cGUuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM5YTJjZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9URmllbGRSZXF1aXJlbWVudFR5cGUuaHgKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OworCisgIC8qKgorICAgKiBSZXF1aXJlbWVudCB0eXBlIGNvbnN0YW50cy4KKyAgICoKKyAgICovCitAOmVudW0KK2Fic3RyYWN0IFRGaWVsZFJlcXVpcmVtZW50VHlwZShJbnQpICBmcm9tIEludCB0byBJbnQgIHsKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgUkVRVUlSRUQgOiBJbnQgPSAxOworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBPUFRJT05BTCA6IEludCA9IDI7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIERFRkFVTFQgIDogSW50ID0gMzsKK30KZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UUHJvY2Vzc29yLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RQcm9jZXNzb3IuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNiNmY3ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UUHJvY2Vzc29yLmh4CkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbDsKKworLyoqCisgKiBBIHByb2Nlc3NvciBpcyBhIGdlbmVyaWMgb2JqZWN0IHdoaWNoIG9wZXJhdGVzIHVwb24gYW4gaW5wdXQgc3RyZWFtIGFuZAorICogd3JpdGVzIHRvIHNvbWUgb3V0cHV0IHN0cmVhbS4KKyAqLworaW50ZXJmYWNlIFRQcm9jZXNzb3IgeworICAgIGZ1bmN0aW9uIHByb2Nlc3MoaW5wdXQ6VFByb3RvY29sLCBvdXRwdXQ6VFByb3RvY29sKSA6IEJvb2w7Cit9CmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvaGVscGVyL0JpdENvbnZlcnRlci5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9oZWxwZXIvQml0Q29udmVydGVyLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlMGFhYTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvaGVscGVyL0JpdENvbnZlcnRlci5oeApAQCAtMCwwICsxLDE3MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LmhlbHBlcjsKKworaW1wb3J0IGhheGUuSW50NjQ7CitpbXBvcnQgaGF4ZS5pby5CeXRlczsKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzQnVmZmVyOworCitjbGFzcyBCaXRDb252ZXJ0ZXIgeworCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBEb3VibGVUb0ludDY0Qml0cyggZGIgOiBGbG9hdCkgOiBJbnQ2NCB7CisgICAgICAgIHZhciBidWYgPSBuZXcgQnl0ZXNCdWZmZXIoKTsKKyAgICAgICAgYnVmLmFkZERvdWJsZSggZGIpOworICAgICAgICByZXR1cm4gYnl0ZXNUb0xvbmcoIGJ1Zi5nZXRCeXRlcygpKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gSW50NjRCaXRzVG9Eb3VibGUoIGk2NCA6IEludDY0KSA6IEZsb2F0IHsKKyAgICAgICAgdmFyIGJ1ZiA9IG5ldyBCeXRlc0J1ZmZlcigpOworICAgICAgICBidWYuYWRkKCBmaXhlZExvbmdUb0J5dGVzKCBpNjQpKTsKKyAgICAgICAgcmV0dXJuIGJ1Zi5nZXRCeXRlcygpLmdldERvdWJsZSgwKTsKKyAgICB9CisKKworCisgICAgLyoqCisgICAgICogQ29udmVydCBhIGxvbmcgaW50byBsaXR0bGUtZW5kaWFuIGJ5dGVzIGluIGJ1ZiBzdGFydGluZyBhdCBvZmYgYW5kIGdvaW5nCisgICAgICogdW50aWwgb2ZmKzcuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBmaXhlZExvbmdUb0J5dGVzKCBuIDogSW50NjQpICA6IEJ5dGVzIHsKKyAgICAgICAgdmFyIGJ1ZiA9IEJ5dGVzLmFsbG9jKDgpOworICAgICAgICAjaWYoIGhheGVfdmVyIDwgMy4yKQorICAgICAgICBidWYuc2V0KCAwLCBJbnQ2NC5nZXRMb3coIEludDY0LmFuZCggbiwgSW50NjQubWFrZSgwLCAweGZmKSkpKTsKKyAgICAgICAgYnVmLnNldCggMSwgSW50NjQuZ2V0TG93KCBJbnQ2NC5hbmQoIEludDY0LnNociggbiwgOCksICBJbnQ2NC5tYWtlKDAsIDB4ZmYpKSkpOworICAgICAgICBidWYuc2V0KCAyLCBJbnQ2NC5nZXRMb3coIEludDY0LmFuZCggSW50NjQuc2hyKCBuLCAxNiksIEludDY0Lm1ha2UoMCwgMHhmZikpKSk7CisgICAgICAgIGJ1Zi5zZXQoIDMsIEludDY0LmdldExvdyggSW50NjQuYW5kKCBJbnQ2NC5zaHIoIG4sIDI0KSwgSW50NjQubWFrZSgwLCAweGZmKSkpKTsKKyAgICAgICAgYnVmLnNldCggNCwgSW50NjQuZ2V0TG93KCBJbnQ2NC5hbmQoIEludDY0LnNociggbiwgMzIpLCBJbnQ2NC5tYWtlKDAsIDB4ZmYpKSkpOworICAgICAgICBidWYuc2V0KCA1LCBJbnQ2NC5nZXRMb3coIEludDY0LmFuZCggSW50NjQuc2hyKCBuLCA0MCksIEludDY0Lm1ha2UoMCwgMHhmZikpKSk7CisgICAgICAgIGJ1Zi5zZXQoIDYsIEludDY0LmdldExvdyggSW50NjQuYW5kKCBJbnQ2NC5zaHIoIG4sIDQ4KSwgSW50NjQubWFrZSgwLCAweGZmKSkpKTsKKyAgICAgICAgYnVmLnNldCggNywgSW50NjQuZ2V0TG93KCBJbnQ2NC5hbmQoIEludDY0LnNociggbiwgNTYpLCBJbnQ2NC5tYWtlKDAsIDB4ZmYpKSkpOworICAgICAgICAjZWxzZQorICAgICAgICBidWYuc2V0KCAwLCBJbnQ2NC5hbmQoIG4sIEludDY0Lm1ha2UoMCwgMHhmZikpLmxvdyk7CisgICAgICAgIGJ1Zi5zZXQoIDEsIEludDY0LmFuZCggSW50NjQuc2hyKCBuLCA4KSwgIEludDY0Lm1ha2UoMCwgMHhmZikpLmxvdyk7CisgICAgICAgIGJ1Zi5zZXQoIDIsIEludDY0LmFuZCggSW50NjQuc2hyKCBuLCAxNiksIEludDY0Lm1ha2UoMCwgMHhmZikpLmxvdyk7CisgICAgICAgIGJ1Zi5zZXQoIDMsIEludDY0LmFuZCggSW50NjQuc2hyKCBuLCAyNCksIEludDY0Lm1ha2UoMCwgMHhmZikpLmxvdyk7CisgICAgICAgIGJ1Zi5zZXQoIDQsIEludDY0LmFuZCggSW50NjQuc2hyKCBuLCAzMiksIEludDY0Lm1ha2UoMCwgMHhmZikpLmxvdyk7CisgICAgICAgIGJ1Zi5zZXQoIDUsIEludDY0LmFuZCggSW50NjQuc2hyKCBuLCA0MCksIEludDY0Lm1ha2UoMCwgMHhmZikpLmxvdyk7CisgICAgICAgIGJ1Zi5zZXQoIDYsIEludDY0LmFuZCggSW50NjQuc2hyKCBuLCA0OCksIEludDY0Lm1ha2UoMCwgMHhmZikpLmxvdyk7CisgICAgICAgIGJ1Zi5zZXQoIDcsIEludDY0LmFuZCggSW50NjQuc2hyKCBuLCA1NiksIEludDY0Lm1ha2UoMCwgMHhmZikpLmxvdyk7CisgICAgICAgICNlbmQKKyAgICAgICAgcmV0dXJuIGJ1ZjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBOb3RlIHRoYXQgaXQncyBpbXBvcnRhbnQgdGhhdCB0aGUgbWFzayBieXRlcyBhcmUgbG9uZyBsaXRlcmFscywKKyAgICAgKiBvdGhlcndpc2UgdGhleSdsbCBkZWZhdWx0IHRvIGludHMsIGFuZCB3aGVuIHlvdSBzaGlmdCBhbiBpbnQgbGVmdCA1NiBiaXRzLAorICAgICAqIHlvdSBqdXN0IGdldCBhIG1lc3NlZCB1cCBpbnQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBieXRlc1RvTG9uZyggYnl0ZXMgOiBCeXRlcykgOiBJbnQ2NCB7CisgICAgICAgIHZhciByZXN1bHQgOiBJbnQ2NCA9IEludDY0Lm1ha2UoMCwgMCk7CisgICAgICAgIHJlc3VsdCA9IEludDY0Lm9yKCBJbnQ2NC5zaGwoIHJlc3VsdCwgOCksIEludDY0Lm1ha2UoIDAsIGJ5dGVzLmdldCg3KSkpOworICAgICAgICByZXN1bHQgPSBJbnQ2NC5vciggSW50NjQuc2hsKCByZXN1bHQsIDgpLCBJbnQ2NC5tYWtlKCAwLCBieXRlcy5nZXQoNikpKTsKKyAgICAgICAgcmVzdWx0ID0gSW50NjQub3IoIEludDY0LnNobCggcmVzdWx0LCA4KSwgSW50NjQubWFrZSggMCwgYnl0ZXMuZ2V0KDUpKSk7CisgICAgICAgIHJlc3VsdCA9IEludDY0Lm9yKCBJbnQ2NC5zaGwoIHJlc3VsdCwgOCksIEludDY0Lm1ha2UoIDAsIGJ5dGVzLmdldCg0KSkpOworICAgICAgICByZXN1bHQgPSBJbnQ2NC5vciggSW50NjQuc2hsKCByZXN1bHQsIDgpLCBJbnQ2NC5tYWtlKCAwLCBieXRlcy5nZXQoMykpKTsKKyAgICAgICAgcmVzdWx0ID0gSW50NjQub3IoIEludDY0LnNobCggcmVzdWx0LCA4KSwgSW50NjQubWFrZSggMCwgYnl0ZXMuZ2V0KDIpKSk7CisgICAgICAgIHJlc3VsdCA9IEludDY0Lm9yKCBJbnQ2NC5zaGwoIHJlc3VsdCwgOCksIEludDY0Lm1ha2UoIDAsIGJ5dGVzLmdldCgxKSkpOworICAgICAgICByZXN1bHQgPSBJbnQ2NC5vciggSW50NjQuc2hsKCByZXN1bHQsIDgpLCBJbnQ2NC5tYWtlKCAwLCBieXRlcy5nZXQoMCkpKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKworICAgICNpZiBkZWJ1ZworICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIFRlc3RCVEwoIHRlc3QgOiBJbnQ2NCkgOiBWb2lkIHsKKyAgICAgICAgdmFyIGJ1ZiA6IEJ5dGVzID0gZml4ZWRMb25nVG9CeXRlcyggdGVzdCk7CisgICAgICAgIHZhciBlcmcgPSBieXRlc1RvTG9uZyhidWYpOworICAgICAgICBpZiAoIEludDY0LmNvbXBhcmUoIGVyZywgdGVzdCkgIT0gMCkKKyAgICAgICAgICAgIHRocm93ICdCaXRDb252ZXJ0ZXIuYnl0ZXNUb0xvbmdUZXN0KCR0ZXN0KSBmYWlsZWQ6ICRlcmcnOworICAgIH0KKyAgICAjZW5kCisKKworICAgICNpZiBkZWJ1ZworICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIFRlc3RQYWlyKCBhIDogRmxvYXQsIGIgOiBJbnQ2NCkgOiBWb2lkIHsKKyAgICAgICAgdmFyIGJ4ID0gRG91YmxlVG9JbnQ2NEJpdHMoYSk7CisgICAgICAgIGlmICggSW50NjQuY29tcGFyZSggYngsIGIpICE9IDApCisgICAgICAgICAgICB0aHJvdyAnQml0Q29udmVydGVyLlRlc3RQYWlyOiBEb3VibGVUb0ludDY0Qml0cygkYSk6IGV4cGVjdGVkICRiLCBnb3QgJGJ4JzsKKyAgICAgICAgdmFyIGF4ID0gSW50NjRCaXRzVG9Eb3VibGUoYik7CisgICAgICAgIGlmKCBheCAhPSBhKQorICAgICAgICAgICAgdGhyb3cgJ0JpdENvbnZlcnRlci5UZXN0UGFpcjogSW50NjRCaXRzVG9Eb3VibGUoJGI6IGV4cGVjdGVkICRhLCBnb3QgICRheCc7CisgICAgfQorICAgICNlbmQKKworCisgICAgI2lmIGRlYnVnCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBVbml0VGVzdCgpIDogVm9pZCB7CisKKyAgICAgICAgLy8gYnl0ZXNUb0xvbmcoKQorICAgICAgICB2YXIgaSA6IEludDsKKyAgICAgICAgVGVzdEJUTCggSW50NjQubWFrZSgwLDApKTsKKyAgICAgICAgZm9yICggaSBpbiAwIC4uLiA2MikgeworICAgICAgICAgICAgVGVzdEJUTCggSW50NjQuc2hsKCBJbnQ2NC5tYWtlKDAsMSksIGkpKTsKKyAgICAgICAgICAgIFRlc3RCVEwoIEludDY0LnN1YiggSW50NjQubWFrZSgwLDApLCBJbnQ2NC5zaGwoIEludDY0Lm1ha2UoMCwxKSwgaSkpKTsKKyAgICAgICAgfQorICAgICAgICBUZXN0QlRMKCBJbnQ2NC5tYWtlKDB4N0ZGRkZGRkYsMHhGRkZGRkZGRikpOworICAgICAgICBUZXN0QlRMKCBJbnQ2NC5tYWtlKGNhc3QoMHg4MDAwMDAwMCxJbnQpLDB4MDAwMDAwMDApKTsKKworICAgICAgICAvLyBEb3VibGVUb0ludDY0Qml0czsKKyAgICAgICAgVGVzdFBhaXIoIDEuMDAwMDAwMDAwMDAwMDAwMEUrMDAwLCAgSW50NjQubWFrZShjYXN0KDB4M0ZGMDAwMDAsSW50KSxjYXN0KDB4MDAwMDAwMDAsSW50KSkpOworICAgICAgICBUZXN0UGFpciggMS41MDAwMDAwMDAwMDAwMDAwRSswMDEsICBJbnQ2NC5tYWtlKGNhc3QoMHg0MDJFMDAwMCxJbnQpLGNhc3QoMHgwMDAwMDAwMCxJbnQpKSk7CisgICAgICAgIFRlc3RQYWlyKCAyLjU1MDAwMDAwMDAwMDAwMDBFKzAwMiwgIEludDY0Lm1ha2UoY2FzdCgweDQwNkZFMDAwLEludCksY2FzdCgweDAwMDAwMDAwLEludCkpKTsKKyAgICAgICAgVGVzdFBhaXIoIDQuMjk0OTY3Mjk1MDAwMDAwMEUrMDA5LCAgSW50NjQubWFrZShjYXN0KDB4NDFFRkZGRkYsSW50KSxjYXN0KDB4RkZFMDAwMDAsSW50KSkpOworICAgICAgICBUZXN0UGFpciggMy45MDYyNTAwMDAwMDAwMDAwRS0wMDMsICBJbnQ2NC5tYWtlKGNhc3QoMHgzRjcwMDAwMCxJbnQpLGNhc3QoMHgwMDAwMDAwMCxJbnQpKSk7CisgICAgICAgIFRlc3RQYWlyKCAyLjMyODMwNjQzNjUzODY5NjNFLTAxMCwgIEludDY0Lm1ha2UoY2FzdCgweDNERjAwMDAwLEludCksY2FzdCgweDAwMDAwMDAwLEludCkpKTsKKyAgICAgICAgVGVzdFBhaXIoIDEuMjM0NTY3ODkwMTIzMDAwMEUtMzAwLCAgSW50NjQubWFrZShjYXN0KDB4MDFBQTc0RkUsSW50KSxjYXN0KDB4MUMxRTdFNDUsSW50KSkpOworICAgICAgICBUZXN0UGFpciggMS4yMzQ1Njc4OTAxMjM0NTAwRS0xNTAsICBJbnQ2NC5tYWtlKGNhc3QoMHgyMEQwMkEzNixJbnQpLGNhc3QoMHg1ODZEQjRCQixJbnQpKSk7CisgICAgICAgIFRlc3RQYWlyKCAxLjIzNDU2Nzg5MDEyMzQ1NjVFKzAwMCwgIEludDY0Lm1ha2UoY2FzdCgweDNGRjNDMENBLEludCksY2FzdCgweDQyOEM1OUZBLEludCkpKTsKKyAgICAgICAgVGVzdFBhaXIoIDEuMjM0NTY3ODkwMTIzNDU2N0UrMDAwLCAgSW50NjQubWFrZShjYXN0KDB4M0ZGM0MwQ0EsSW50KSxjYXN0KDB4NDI4QzU5RkIsSW50KSkpOworICAgICAgICBUZXN0UGFpciggMS4yMzQ1Njc4OTAxMjM0NTY5RSswMDAsICBJbnQ2NC5tYWtlKGNhc3QoMHgzRkYzQzBDQSxJbnQpLGNhc3QoMHg0MjhDNTlGQyxJbnQpKSk7CisgICAgICAgIFRlc3RQYWlyKCAxLjIzNDU2Nzg5MDEyMzQ1NjlFKzE1MCwgIEludDY0Lm1ha2UoY2FzdCgweDVGMTgyMzQ0LEludCksY2FzdCgweENEM0NERjlGLEludCkpKTsKKyAgICAgICAgVGVzdFBhaXIoIDEuMjM0NTY3ODkwMTIzNDU2OUUrMzAwLCAgSW50NjQubWFrZShjYXN0KDB4N0UzRDdFRTgsSW50KSxjYXN0KDB4QkNCQkQzNTIsSW50KSkpOworICAgICAgICBUZXN0UGFpciggLTEuNzk3NjkzMTM0ODYyMzE1N0UrMzA4LCBJbnQ2NC5tYWtlKGNhc3QoMHhGRkVGRkZGRixJbnQpLGNhc3QoMHhGRkZGRkZGRixJbnQpKSk7CisgICAgICAgIFRlc3RQYWlyKCAxLjc5NzY5MzEzNDg2MjMxNTdFKzMwOCwgIEludDY0Lm1ha2UoY2FzdCgweDdGRUZGRkZGLEludCksY2FzdCgweEZGRkZGRkZGLEludCkpKTsKKyAgICAgICAgVGVzdFBhaXIoIDQuOTQwNjU2NDU4NDEyNDY1NEUtMzI0LCAgSW50NjQubWFrZShjYXN0KDB4MDAwMDAwMDAsSW50KSxjYXN0KDB4MDAwMDAwMDEsSW50KSkpOworICAgICAgICBUZXN0UGFpciggMC4wMDAwMDAwMDAwMDAwMDAwRSswMDAsICBJbnQ2NC5tYWtlKGNhc3QoMHgwMDAwMDAwMCxJbnQpLGNhc3QoMHgwMDAwMDAwMCxJbnQpKSk7CisgICAgICAgIFRlc3RQYWlyKCA0Ljk0MDY1NjQ1ODQxMjQ3RS0zMjQsICAgIEludDY0Lm1ha2UoY2FzdCgweDAwMDAwMDAwLEludCksY2FzdCgweDAwMDAwMDAxLEludCkpKTsKKyAgICAgICAgVGVzdFBhaXIoIDMuMjM3ODU5MjEwMDIwNjA5MkUtMzE5LCAgSW50NjQubWFrZShjYXN0KDB4MDAwMDAwMDAsSW50KSxjYXN0KDB4MDAwMEZGRkYsSW50KSkpOworICAgICAgICBUZXN0UGFpciggMS4zOTA2NzExNjE1NjY5OTU5RS0zMDksICBJbnQ2NC5tYWtlKGNhc3QoMHgwMDAwRkZGRixJbnQpLGNhc3QoMHhGRkZGRkZGRixJbnQpKSk7CisgICAgICAgIFRlc3RQYWlyKCBNYXRoLk5FR0FUSVZFX0lORklOSVRZLCAgIEludDY0Lm1ha2UoY2FzdCgweEZGRjAwMDAwLEludCksY2FzdCgweDAwMDAwMDAwLEludCkpKTsKKyAgICAgICAgVGVzdFBhaXIoIE1hdGguUE9TSVRJVkVfSU5GSU5JVFksICAgSW50NjQubWFrZShjYXN0KDB4N0ZGMDAwMDAsSW50KSxjYXN0KDB4MDAwMDAwMDAsSW50KSkpOworCisgICAgICAgIC8vIE5hTiBpcyBzcGVjaWFsCisgICAgICAgIHZhciBpNjRuYW4gPSBEb3VibGVUb0ludDY0Qml0cyggTWF0aC5OYU4pOworICAgICAgICB2YXIgaTY0Y21wID0gSW50NjQubWFrZShjYXN0KDB4RkZGODAwMDAsIEludCksIGNhc3QoMHgwMDAwMDAwMCwgSW50KSk7CisgICAgICAgIGlmICggISBNYXRoLmlzTmFOKCBJbnQ2NEJpdHNUb0RvdWJsZSggaTY0Y21wKSkpCisgICAgICAgICAgICB0aHJvdyAnQml0Q29udmVydGVyIE5hTi1UZXN0ICMxOiBleHBlY3RlZCBOYU4nOworCisgICAgICAgIC8vIEZvciBkb3VibGVzLCBhIHF1aWV0IE5hTiBpcyBhIGJpdCBwYXR0ZXJuCisgICAgICAgIC8vIGJldHdlZW4gN0ZGODAwMDAwMDAwMDAwMCBhbmQgN0ZGRkZGRkZGRkZGRkZGRgorICAgICAgICAvLyAgICAgIG9yIEZGRjgwMDAwMDAwMDAwMDAgYW5kIEZGRkZGRkZGRkZGRkZGRkYKKyAgICAgICAgdmFyIG1pbjEgPSBJbnQ2NC5tYWtlKCBjYXN0KDB4N0ZGODAwMDAsIEludCksIGNhc3QoMHgwMDAwMDAwMCwgSW50KSk7CisgICAgICAgIHZhciBtYXgxID0gSW50NjQubWFrZSggY2FzdCgweDdGRkZGRkZGLCBJbnQpLCBjYXN0KDB4RkZGRkZGRkYsIEludCkpOworICAgICAgICB2YXIgbWluMiA9IEludDY0Lm1ha2UoIGNhc3QoMHhGRkY4MDAwMCwgSW50KSwgY2FzdCgweDAwMDAwMDAwLCBJbnQpKTsKKyAgICAgICAgdmFyIG1heDIgPSBJbnQ2NC5tYWtlKCBjYXN0KDB4RkZGRkZGRkYsIEludCksIGNhc3QoMHhGRkZGRkZGRiwgSW50KSk7CisgICAgICAgIHZhciBvazEgPSAgKEludDY0LmNvbXBhcmUoIG1pbjEsIGk2NG5hbikgPD0gMCkgJiYgKEludDY0LmNvbXBhcmUoIGk2NG5hbiwgbWF4MSkgPD0gMCk7CisgICAgICAgIHZhciBvazIgPSAgKEludDY0LmNvbXBhcmUoIG1pbjIsIGk2NG5hbikgPD0gMCkgJiYgKEludDY0LmNvbXBhcmUoIGk2NG5hbiwgbWF4MikgPD0gMCk7CisgICAgICAgIGlmKCAhIChvazEgfHwgb2syKSkKKyAgICAgICAgICAgIHRocm93ICdCaXRDb252ZXJ0ZXIgTmFOLVRlc3QgIzI6IGZhaWxlZCc7CisgICAgfQorICAgICNlbmQKKworfQorICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9oZWxwZXIvSW50NjRNYXAuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvaGVscGVyL0ludDY0TWFwLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NDVmZDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvaGVscGVyL0ludDY0TWFwLmh4CkBAIC0wLDAgKzEsMjk1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQuaGVscGVyOworCitpbXBvcnQgTWFwOworaW1wb3J0IGhheGUuSW50NjQ7CitpbXBvcnQgaGF4ZS5kcy5JbnRNYXA7CisKKworLy8gSW50NjRNYXAgYWxsb3dzIG1hcHBpbmcgb2YgSW50NjQga2V5cyB0byBhcmJpdHJhcnkgdmFsdWVzLgorLy8gT2JqZWN0TWFwPD4gY2Fubm90IGJlIHVzZWQsIHNpbmNlIHdlIHdhbnQgdG8gY29tcGFyZSBieSB2YWx1ZSwgbm90IGFkZHJlc3MKKworY2xhc3MgSW50NjRNYXA8VD4gaW1wbGVtZW50cyBJTWFwPCBJbnQ2NCwgVD4geworCisgICAgcHJpdmF0ZSB2YXIgU3ViTWFwcyA6IEludE1hcDwgSW50TWFwPCBUPj47ICAvLyBIaSAtPiBMbyAtPiBWYWx1ZQorCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldygpIDogVm9pZCB7CisgICAgICAgIFN1Yk1hcHMgPSBuZXcgSW50TWFwPCBJbnRNYXA8IFQ+PigpOworICAgIH07CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIEdldFN1Yk1hcCggaGkgOiBoYXhlLkludDMyLCBjYW5DcmVhdGUgOiBCb29sKSA6IEludE1hcDwgVD4geworICAgICAgICBpZiggU3ViTWFwcy5leGlzdHMoaGkpKSB7CisgICAgICAgICAgICByZXR1cm4gU3ViTWFwcy5nZXQoaGkpOworICAgICAgICB9CisKKyAgICAgICAgaWYoICEgY2FuQ3JlYXRlKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBsb21hcCA9IG5ldyBJbnRNYXA8IFQ+KCk7CisgICAgICAgIFN1Yk1hcHMuc2V0KCBoaSwgbG9tYXApOworICAgICAgICByZXR1cm4gbG9tYXA7CisgICAgfQorCisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIEdldExvd01hcCgga2V5IDogaGF4ZS5JbnQ2NCwgY2FuQ3JlYXRlIDogQm9vbCkgOiBJbnRNYXA8IFQ+IHsKKyAgICAgICAgI2lmKCBoYXhlX3ZlciA8IDMuMikKKyAgICAgICAgcmV0dXJuIEdldFN1Yk1hcCggSW50NjQuZ2V0SGlnaChrZXkpLCBjYW5DcmVhdGUpOworICAgICAgICAjZWxzZQorICAgICAgICByZXR1cm4gR2V0U3ViTWFwKCBrZXkuaGlnaCwgY2FuQ3JlYXRlKTsKKyAgICAgICAgI2VuZAorICAgIH0KKworCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBHZXRMb3dJbmRleCgga2V5IDogaGF4ZS5JbnQ2NCkgOiBoYXhlLkludDMyIHsKKyAgICAgICAgI2lmKCBoYXhlX3ZlciA8IDMuMikKKyAgICAgICAgcmV0dXJuIEludDY0LmdldExvdyhrZXkpOworICAgICAgICAjZWxzZQorICAgICAgICByZXR1cm4ga2V5LmxvdzsKKyAgICAgICAgI2VuZAorICAgIH0KKworCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBOdWxsQ2hlY2soIGtleSA6IGhheGUuSW50NjQpIDogQm9vbCB7CisgICAgICAgICNpZiggaGF4ZV92ZXIgPCAzLjIpCisgICAgICAgIHJldHVybiAoa2V5ICE9IG51bGwpOworICAgICAgICAjZWxzZQorICAgICAgICByZXR1cm4gdHJ1ZTsgIC8vIEludDY0IGlzIG5vdCBudWxsYWJsZSBhbnltb3JlIChpdCBuZXZlciByZWFsbHkgd2FzKQorICAgICAgICAjZW5kCisgICAgfTsKKworCisKKyAgICAvKioKKyAgICAgICAgTWFwcyBga2V5YCB0byBgdmFsdWVgLgorICAgICAgICBJZiBga2V5YCBhbHJlYWR5IGhhcyBhIG1hcHBpbmcsIHRoZSBwcmV2aW91cyB2YWx1ZSBkaXNhcHBlYXJzLgorICAgICAgICBJZiBga2V5YCBpcyBudWxsLCB0aGUgcmVzdWx0IGlzIHVuc3BlY2lmaWVkLgorICAgICoqLworICAgIHB1YmxpYyBmdW5jdGlvbiBzZXQoIGtleSA6IEludDY0LCB2YWx1ZSA6IFQgKSA6IFZvaWQgeworICAgICAgICBpZiggISBOdWxsQ2hlY2soa2V5KSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGxvbWFwID0gR2V0TG93TWFwKCBrZXksIHRydWUpOworICAgICAgICBsb21hcC5zZXQoIEdldExvd0luZGV4KGtleSksIHZhbHVlKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAgICBSZXR1cm5zIHRoZSBjdXJyZW50IG1hcHBpbmcgb2YgYGtleWAuCisgICAgICAgIElmIG5vIHN1Y2ggbWFwcGluZyBleGlzdHMsIG51bGwgaXMgcmV0dXJuZWQuCisgICAgICAgIElmIGBrZXlgIGlzIG51bGwsIHRoZSByZXN1bHQgaXMgdW5zcGVjaWZpZWQuCisKKyAgICAgICAgTm90ZSB0aGF0IGEgY2hlY2sgbGlrZSBgbWFwLmdldChrZXkpID09IG51bGxgIGNhbiBob2xkIGZvciB0d28gcmVhc29uczoKKworICAgICAgICAgICAgMS4gdGhlIG1hcCBoYXMgbm8gbWFwcGluZyBmb3IgYGtleWAKKyAgICAgICAgICAgIDIuIHRoZSBtYXAgaGFzIGEgbWFwcGluZyB3aXRoIGEgdmFsdWUgb2YgYG51bGxgCisKKyAgICAgICAgSWYgaXQgaXMgaW1wb3J0YW50IHRvIGRpc3Rpbmd1aXNoIHRoZXNlIGNhc2VzLCBgZXhpc3RzKClgIHNob3VsZCBiZQorICAgICAgICB1c2VkLgorCisgICAgKiovCisgICAgcHVibGljIGZ1bmN0aW9uIGdldCgga2V5IDogSW50NjQpIDogTnVsbDxUPiB7CisgICAgICAgIGlmKCAhIE51bGxDaGVjayhrZXkpKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBsb21hcCA9IEdldExvd01hcCgga2V5LCB0cnVlKTsKKyAgICAgICAgaWYoIGxvbWFwID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGxvbWFwLmdldCggR2V0TG93SW5kZXgoa2V5KSk7CisgICAgfQorCisgICAgLyoqCisgICAgICAgIFJldHVybnMgdHJ1ZSBpZiBga2V5YCBoYXMgYSBtYXBwaW5nLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICAgIElmIGBrZXlgIGlzIG51bGwsIHRoZSByZXN1bHQgaXMgdW5zcGVjaWZpZWQuCisgICAgKiovCisgICAgcHVibGljIGZ1bmN0aW9uIGV4aXN0cygga2V5IDogSW50NjQpIDogQm9vbCB7CisgICAgICAgIGlmKCAhIE51bGxDaGVjayhrZXkpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICB2YXIgbG9tYXAgPSBHZXRMb3dNYXAoIGtleSwgdHJ1ZSk7CisgICAgICAgIGlmKCBsb21hcCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbG9tYXAuZXhpc3RzKCBHZXRMb3dJbmRleChrZXkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgICAgUmVtb3ZlcyB0aGUgbWFwcGluZyBvZiBga2V5YCBhbmQgcmV0dXJucyB0cnVlIGlmIHN1Y2ggYSBtYXBwaW5nIGV4aXN0ZWQsCisgICAgICAgIGZhbHNlIG90aGVyd2lzZS4gSWYgYGtleWAgaXMgbnVsbCwgdGhlIHJlc3VsdCBpcyB1bnNwZWNpZmllZC4KKyAgICAqKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlKCBrZXkgOiBJbnQ2NCkgOiBCb29sIHsKKyAgICAgICAgaWYoICEgTnVsbENoZWNrKGtleSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBsb21hcCA9IEdldExvd01hcCgga2V5LCB0cnVlKTsKKyAgICAgICAgaWYoIGxvbWFwID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBsb21hcC5yZW1vdmUoIEdldExvd0luZGV4KGtleSkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICAgIFJldHVybnMgYW4gSXRlcmF0b3Igb3ZlciB0aGUga2V5cyBvZiBgdGhpc2AgTWFwLgorICAgICAgICBUaGUgb3JkZXIgb2Yga2V5cyBpcyB1bmRlZmluZWQuCisgICAgKiovCisgICAgcHVibGljIGZ1bmN0aW9uIGtleXMoKSA6IEl0ZXJhdG9yPEludDY0PiB7CisgICAgICAgIHJldHVybiBuZXcgSW50NjRLZXlJdGVyYXRvcjxUPihTdWJNYXBzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgICAgUmV0dXJucyBhbiBJdGVyYXRvciBvdmVyIHRoZSB2YWx1ZXMgb2YgYHRoaXNgIE1hcC4KKyAgICAgICAgVGhlIG9yZGVyIG9mIHZhbHVlcyBpcyB1bmRlZmluZWQuCisgICAgKiovCisgICAgcHVibGljIGZ1bmN0aW9uIGl0ZXJhdG9yKCkgOiBJdGVyYXRvcjxUPiB7CisgICAgICAgIHJldHVybiBuZXcgSW50NjRWYWx1ZUl0ZXJhdG9yPFQ+KFN1Yk1hcHMpOworICAgIH0KKworICAgIC8qKgorICAgICAgICBSZXR1cm5zIGEgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGB0aGlzYCBNYXAuCisgICAgICAgIFRoZSBleGFjdCByZXByZXNlbnRhdGlvbiBkZXBlbmRzIG9uIHRoZSBwbGF0Zm9ybSBhbmQga2V5LXR5cGUuCisgICAgKiovCisgICAgcHVibGljIGZ1bmN0aW9uIHRvU3RyaW5nKCkgOiBTdHJpbmcgeworICAgICAgICB2YXIgcmVzdWx0IDogU3RyaW5nID0gInsiOworCisgICAgICAgIHZhciBmaXJzdCA9IHRydWU7CisgICAgICAgIGZvcigga2V5IGluIHRoaXMua2V5cygpKSB7CisgICAgICAgICAgICBpZiggZmlyc3QpIHsKKyAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgKz0gIiwiOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXN1bHQgKz0gIiAiOworICAgICAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5nZXQoa2V5KTsKKyAgICAgICAgICAgIHJlc3VsdCArPSBJbnQ2NC50b1N0cihrZXkpICsgJyA9PiAkdmFsdWUnOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlc3VsdCArICJ9IjsKKyAgICB9CisKK30KKworCisvLyBpbnRlcm5hbCBoZWxwZXIgY2xhc3MgZm9yIEludDY0TWFwPFQ+CisvLyBhbGwgY2xhc3Mgd2l0aCBtYXRjaGluZyBtZXRob2RzIGNhbiBiZSB1c2VkIGFzIGl0ZXJhdG9yIChkdWNrIHR5cGluZykKK3ByaXZhdGUgY2xhc3MgSW50NjRNYXBJdGVyYXRvckJhc2U8VD4geworCisgICAgcHJpdmF0ZSB2YXIgU3ViTWFwcyA6IEludE1hcDwgSW50TWFwPCBUPj47ICAvLyBIaSAtPiBMbyAtPiBWYWx1ZQorCisgICAgcHJpdmF0ZSB2YXIgSGlJdGVyYXRvciA6IEl0ZXJhdG9yPCBJbnQ+ID0gbnVsbDsKKyAgICBwcml2YXRlIHZhciBMb0l0ZXJhdG9yIDogSXRlcmF0b3I8IEludD4gPSBudWxsOworICAgIHByaXZhdGUgdmFyIEN1cnJlbnRIaSA6IEludCA9IDA7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KCBkYXRhIDogSW50TWFwPCBJbnRNYXA8IFQ+PikgOiBWb2lkIHsKKyAgICAgICAgU3ViTWFwcyA9IGRhdGE7CisgICAgICAgIEhpSXRlcmF0b3IgPSBTdWJNYXBzLmtleXMoKTsKKyAgICAgICAgTG9JdGVyYXRvciA9IG51bGw7CisgICAgICAgIEN1cnJlbnRIaSA9IDA7CisgICAgfTsKKworICAgIC8qKgorICAgICAgICBSZXR1cm5zIGZhbHNlIGlmIHRoZSBpdGVyYXRpb24gaXMgY29tcGxldGUsIHRydWUgb3RoZXJ3aXNlLgorCisgICAgICAgIFVzdWFsbHkgaXRlcmF0aW9uIGlzIGNvbnNpZGVyZWQgdG8gYmUgY29tcGxldGUgaWYgYWxsIGVsZW1lbnRzIG9mIHRoZQorICAgICAgICB1bmRlcmx5aW5nIGRhdGEgc3RydWN0dXJlIHdlcmUgaGFuZGxlZCB0aHJvdWdoIGNhbGxzIHRvIG5leHQoKS4gSG93ZXZlciwKKyAgICAgICAgaW4gY3VzdG9tIGl0ZXJhdG9ycyBhbnkgbG9naWMgbWF5IGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBjb21wbGV0aW9uCisgICAgICAgIHN0YXRlLgorICAgICoqLworICAgIHB1YmxpYyBmdW5jdGlvbiBoYXNOZXh0KCkgOiBCb29sIHsKKworICAgICAgICBpZiggKExvSXRlcmF0b3IgIT0gbnVsbCkgJiYgTG9JdGVyYXRvci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgd2hpbGUoIChIaUl0ZXJhdG9yICE9IG51bGwpICYmIEhpSXRlcmF0b3IuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBDdXJyZW50SGkgPSBIaUl0ZXJhdG9yLm5leHQoKTsKKyAgICAgICAgICAgIExvSXRlcmF0b3IgPSBTdWJNYXBzLmdldChDdXJyZW50SGkpLmtleXMoKTsKKyAgICAgICAgICAgIGlmKCAoTG9JdGVyYXRvciAhPSBudWxsKSAmJiBMb0l0ZXJhdG9yLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgSGlJdGVyYXRvciA9IG51bGw7CisgICAgICAgIExvSXRlcmF0b3IgPSBudWxsOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCit9CisKKworLy8gaW50ZXJuYWwgaGVscGVyIGNsYXNzIGZvciBJbnQ2NE1hcDxUPgorLy8gYWxsIGNsYXNzIHdpdGggbWF0Y2hpbmcgbWV0aG9kcyBjYW4gYmUgdXNlZCBhcyBpdGVyYXRvciAoZHVjayB0eXBpbmcpCitwcml2YXRlIGNsYXNzIEludDY0S2V5SXRlcmF0b3I8VD5leHRlbmRzIEludDY0TWFwSXRlcmF0b3JCYXNlPFQ+IHsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcoIGRhdGEgOiBJbnRNYXA8IEludE1hcDwgVD4+KSA6IFZvaWQgeworICAgICAgICBzdXBlcihkYXRhKTsKKyAgICB9OworCisgICAgLyoqCisgICAgICAgIFJldHVybnMgdGhlIGN1cnJlbnQgaXRlbSBvZiB0aGUgSXRlcmF0b3IgYW5kIGFkdmFuY2VzIHRvIHRoZSBuZXh0IG9uZS4KKworICAgICAgICBUaGlzIG1ldGhvZCBpcyBub3QgcmVxdWlyZWQgdG8gY2hlY2sgaGFzTmV4dCgpIGZpcnN0LiBBIGNhbGwgdG8gdGhpcworICAgICAgICBtZXRob2Qgd2hpbGUgaGFzTmV4dCgpIGlzIGZhbHNlIHlpZWxkcyB1bnNwZWNpZmllZCBiZWhhdmlvci4KKyAgICAqKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV4dCgpIDogSW50NjQgeworICAgICAgICBpZiggaGFzTmV4dCgpKSB7CisgICAgICAgICAgICByZXR1cm4gSW50NjQubWFrZSggQ3VycmVudEhpLCBMb0l0ZXJhdG9yLm5leHQoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyAibm8gbW9yZSBlbGVtZW50cyI7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworLy8gaW50ZXJuYWwgaGVscGVyIGNsYXNzIGZvciBJbnQ2NE1hcDxUPgorLy8gYWxsIGNsYXNzIHdpdGggbWF0Y2hpbmcgbWV0aG9kcyBjYW4gYmUgdXNlZCBhcyBpdGVyYXRvciAoZHVjayB0eXBpbmcpCitwcml2YXRlIGNsYXNzIEludDY0VmFsdWVJdGVyYXRvcjxUPiBleHRlbmRzIEludDY0TWFwSXRlcmF0b3JCYXNlPFQ+IHsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcoIGRhdGEgOiBJbnRNYXA8IEludE1hcDwgVD4+KSA6IFZvaWQgeworICAgICAgICBzdXBlcihkYXRhKTsKKyAgICB9OworCisgICAgLyoqCisgICAgICAgIFJldHVybnMgdGhlIGN1cnJlbnQgaXRlbSBvZiB0aGUgSXRlcmF0b3IgYW5kIGFkdmFuY2VzIHRvIHRoZSBuZXh0IG9uZS4KKworICAgICAgICBUaGlzIG1ldGhvZCBpcyBub3QgcmVxdWlyZWQgdG8gY2hlY2sgaGFzTmV4dCgpIGZpcnN0LiBBIGNhbGwgdG8gdGhpcworICAgICAgICBtZXRob2Qgd2hpbGUgaGFzTmV4dCgpIGlzIGZhbHNlIHlpZWxkcyB1bnNwZWNpZmllZCBiZWhhdmlvci4KKyAgICAqKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV4dCgpIDogVCB7CisgICAgICAgIGlmKCBoYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBTdWJNYXBzLmdldChDdXJyZW50SGkpLmdldChMb0l0ZXJhdG9yLm5leHQoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyAibm8gbW9yZSBlbGVtZW50cyI7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworLy8gRU9GCmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvaGVscGVyL0ludFNldC5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9oZWxwZXIvSW50U2V0Lmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxZTVkOGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvaGVscGVyL0ludFNldC5oeApAQCAtMCwwICsxLDk2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQuaGVscGVyOworCitpbXBvcnQgTWFwOworCisKK2NsYXNzIEludFNldCB7CisKKyAgICBwcml2YXRlIHZhciBfZWxlbWVudHMgPSBuZXcgaGF4ZS5kcy5JbnRNYXA8SW50PigpOworICAgIHByaXZhdGUgdmFyIF9zaXplIDogSW50ID0gMDsKKyAgICBwdWJsaWMgdmFyIHNpemUoZ2V0LG5ldmVyKSA6IEludDsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcoIHZhbHVlcyA6IEFycmF5PEludD4gPSBudWxsKSB7CisgICAgICAgIGlmICggdmFsdWVzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoIHZhbHVlIGluIHZhbHVlcykgeworICAgICAgICAgICAgICAgICBhZGQodmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGl0ZXJhdG9yKCk6SXRlcmF0b3I8SW50PiB7CisgICAgICAgIHJldHVybiBfZWxlbWVudHMua2V5cygpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0cmFjZUFsbCgpIDogVm9pZCB7CisgICAgICAgIHRyYWNlKCckX3NpemUgZW50cmllcycpOworICAgICAgICBmb3IoZW50cnkgaW4gdGhpcykgeworICAgICAgICAgICAgdmFyIHllcyA9IGNvbnRhaW5zKGVudHJ5KTsKKyAgICAgICAgICAgIHRyYWNlKCctICRlbnRyeSwgY29udGFpbnMoKSA9ICR5ZXMnKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBhZGQobyA6IEludCkgOiBCb29sIHsKKyAgICAgICAgaWYoIF9lbGVtZW50cy5leGlzdHMobykpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBfc2l6ZSsrOworICAgICAgICBfZWxlbWVudHMuc2V0KG8sX3NpemUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gY2xlYXIoKSA6IFZvaWQgeworICAgICAgICB3aGlsZSggX3NpemUgPiAwKSB7CisgICAgICAgICAgICByZW1vdmUoIF9lbGVtZW50cy5rZXlzKCkubmV4dCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBjb250YWlucyhvIDogSW50KSA6IEJvb2wgeworICAgICAgICByZXR1cm4gX2VsZW1lbnRzLmV4aXN0cyhvKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gaXNFbXB0eSgpIDogQm9vbCB7CisgICAgICAgIHJldHVybiBfc2l6ZSA9PSAwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZW1vdmUobyA6IEludCkgOiBCb29sIHsKKyAgICAgICAgaWYgKGNvbnRhaW5zKG8pKSB7CisgICAgICAgICAgICBfZWxlbWVudHMucmVtb3ZlKG8pOworICAgICAgICAgICAgX3NpemUtLTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRvQXJyYXkoKSA6IEFycmF5PEludD4geworICAgICAgICB2YXIgcmV0IDogQXJyYXk8SW50PiA9IG5ldyBBcnJheTxJbnQ+KCk7CisgICAgICAgIGZvciAoa2V5IGluIF9lbGVtZW50cy5rZXlzKCkpIHsKKyAgICAgICAgICAgIHJldC5wdXNoKGtleSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0X3NpemUoKSA6IEludCB7CisgICAgICAgIHJldHVybiBfc2l6ZTsKKyAgICB9Cit9CisgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L2hlbHBlci9PYmplY3RTZXQuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvaGVscGVyL09iamVjdFNldC5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2Y3MmZiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L2hlbHBlci9PYmplY3RTZXQuaHgKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LmhlbHBlcjsKKworaW1wb3J0IE1hcDsKKworCitjbGFzcyBPYmplY3RTZXQ8Sz4geworCisgICAgcHJpdmF0ZSB2YXIgX2VsZW1lbnRzID0gbmV3IGhheGUuZHMuT2JqZWN0TWFwPEssSW50PigpOworICAgIHByaXZhdGUgdmFyIF9zaXplIDogSW50ID0gMDsKKyAgICBwdWJsaWMgdmFyIHNpemUoZ2V0LG5ldmVyKSA6IEludDsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcoIHZhbHVlcyA6IEFycmF5PEs+ID0gbnVsbCkgeworICAgICAgICBpZiAoIHZhbHVlcyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKCB2YWx1ZSBpbiB2YWx1ZXMpIHsKKyAgICAgICAgICAgICAgICAgYWRkKHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBpdGVyYXRvcigpOkl0ZXJhdG9yPEs+IHsKKyAgICAgICAgcmV0dXJuIF9lbGVtZW50cy5rZXlzKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRyYWNlQWxsKCkgOiBWb2lkIHsKKyAgICAgICAgdHJhY2UoJyRfc2l6ZSBlbnRyaWVzJyk7CisgICAgICAgIGZvcihlbnRyeSBpbiB0aGlzKSB7CisgICAgICAgICAgICB2YXIgeWVzID0gY29udGFpbnMoZW50cnkpOworICAgICAgICAgICAgdHJhY2UoJy0gJGVudHJ5LCBjb250YWlucygpID0gJHllcycpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGFkZChvIDogSykgOiBCb29sIHsKKyAgICAgICAgaWYoIF9lbGVtZW50cy5leGlzdHMobykpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBfc2l6ZSsrOworICAgICAgICBfZWxlbWVudHMuc2V0KG8sX3NpemUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gY2xlYXIoKSA6IFZvaWQgeworICAgICAgICB3aGlsZSggX3NpemUgPiAwKSB7CisgICAgICAgICAgICByZW1vdmUoIF9lbGVtZW50cy5rZXlzKCkubmV4dCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBjb250YWlucyhvIDogSykgOiBCb29sIHsKKyAgICAgICAgcmV0dXJuIF9lbGVtZW50cy5leGlzdHMobyk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGlzRW1wdHkoKSA6IEJvb2wgeworICAgICAgICByZXR1cm4gX3NpemUgPT0gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlKG8gOiBLKSA6IEJvb2wgeworICAgICAgICBpZiAoY29udGFpbnMobykpIHsKKyAgICAgICAgICAgIF9lbGVtZW50cy5yZW1vdmUobyk7CisgICAgICAgICAgICBfc2l6ZS0tOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdG9BcnJheSgpIDogQXJyYXk8Sz4geworICAgICAgICB2YXIgcmV0IDogQXJyYXk8Sz4gPSBuZXcgQXJyYXk8Sz4oKTsKKyAgICAgICAgZm9yIChrZXkgaW4gX2VsZW1lbnRzLmtleXMoKSkgeworICAgICAgICAgICAgcmV0LnB1c2goa2V5KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRfc2l6ZSgpIDogSW50IHsKKyAgICAgICAgcmV0dXJuIF9zaXplOworICAgIH0KK30KKyAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvaGVscGVyL1N0cmluZ1NldC5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9oZWxwZXIvU3RyaW5nU2V0Lmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4YzBkOTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvaGVscGVyL1N0cmluZ1NldC5oeApAQCAtMCwwICsxLDk2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQuaGVscGVyOworCitpbXBvcnQgTWFwOworCisKK2NsYXNzIFN0cmluZ1NldCB7CisKKyAgICBwcml2YXRlIHZhciBfZWxlbWVudHMgPSBuZXcgaGF4ZS5kcy5TdHJpbmdNYXA8SW50PigpOworICAgIHByaXZhdGUgdmFyIF9zaXplIDogSW50ID0gMDsKKyAgICBwdWJsaWMgdmFyIHNpemUoZ2V0LG5ldmVyKSA6IEludDsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcoIHZhbHVlcyA6IEFycmF5PFN0cmluZz4gPSBudWxsKSB7CisgICAgICAgIGlmICggdmFsdWVzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoIHZhbHVlIGluIHZhbHVlcykgeworICAgICAgICAgICAgICAgICBhZGQodmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGl0ZXJhdG9yKCk6SXRlcmF0b3I8U3RyaW5nPiB7CisgICAgICAgIHJldHVybiBfZWxlbWVudHMua2V5cygpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0cmFjZUFsbCgpIDogVm9pZCB7CisgICAgICAgIHRyYWNlKCckX3NpemUgZW50cmllcycpOworICAgICAgICBmb3IoZW50cnkgaW4gdGhpcykgeworICAgICAgICAgICAgdmFyIHllcyA9IGNvbnRhaW5zKGVudHJ5KTsKKyAgICAgICAgICAgIHRyYWNlKCctICRlbnRyeSwgY29udGFpbnMoKSA9ICR5ZXMnKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBhZGQobyA6IFN0cmluZykgOiBCb29sIHsKKyAgICAgICAgaWYoIF9lbGVtZW50cy5leGlzdHMobykpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBfc2l6ZSsrOworICAgICAgICBfZWxlbWVudHMuc2V0KG8sX3NpemUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gY2xlYXIoKSA6IFZvaWQgeworICAgICAgICB3aGlsZSggX3NpemUgPiAwKSB7CisgICAgICAgICAgICByZW1vdmUoIF9lbGVtZW50cy5rZXlzKCkubmV4dCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBjb250YWlucyhvIDogU3RyaW5nKSA6IEJvb2wgeworICAgICAgICByZXR1cm4gX2VsZW1lbnRzLmV4aXN0cyhvKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gaXNFbXB0eSgpIDogQm9vbCB7CisgICAgICAgIHJldHVybiBfc2l6ZSA9PSAwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZW1vdmUobyA6IFN0cmluZykgOiBCb29sIHsKKyAgICAgICAgaWYgKGNvbnRhaW5zKG8pKSB7CisgICAgICAgICAgICBfZWxlbWVudHMucmVtb3ZlKG8pOworICAgICAgICAgICAgX3NpemUtLTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRvQXJyYXkoKSA6IEFycmF5PFN0cmluZz4geworICAgICAgICB2YXIgcmV0IDogQXJyYXk8U3RyaW5nPiA9IG5ldyBBcnJheTxTdHJpbmc+KCk7CisgICAgICAgIGZvciAoa2V5IGluIF9lbGVtZW50cy5rZXlzKCkpIHsKKyAgICAgICAgICAgIHJldC5wdXNoKGtleSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0X3NpemUoKSA6IFN0cmluZyB7CisgICAgICAgIHJldHVybiBfc2l6ZTsKKyAgICB9Cit9CisgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L2hlbHBlci9aaWdaYWcuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvaGVscGVyL1ppZ1phZy5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjg2MDFiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L2hlbHBlci9aaWdaYWcuaHgKQEAgLTAsMCArMSwxNTggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5oZWxwZXI7CisKK2ltcG9ydCBoYXhlLkludDY0OworaW1wb3J0IGhheGUuSW50MzI7CisKK2NsYXNzIFppZ1phZyB7CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IG4gaW50byBhIHppZ3phZyBpbnQuIFRoaXMgYWxsb3dzIG5lZ2F0aXZlIG51bWJlcnMgdG8gYmUKKyAgICAgKiByZXByZXNlbnRlZCBjb21wYWN0bHkgYXMgYSB2YXJpbnQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBGcm9tSW50KCBuIDogSW50KSA6IFVJbnQgICAgeworICAgICAgICAjaWYgcGhwCisKKyAgICAgICAgcmV0dXJuIGNhc3QoY2FzdChjYXN0KG4sSW50MzIpIDw8IDEsSW50MzIpIF4gY2FzdChjYXN0KG4sSW50MzIpID4+IDMxLEludDMyKSxVSW50KTsKKworICAgICAgICAjZWxzZQorCisgICAgICAgIHJldHVybiBjYXN0KG4gPDwgMSxVSW50KSBeIGNhc3QobiA+PiAzMSxVSW50KTsKKworICAgICAgICAjZW5kCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IGZyb20gemlnemFnIGludCB0byBpbnQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBUb0ludCggbiA6IFVJbnQpIDogSW50IHsKKyAgICAgICAgI2lmIHBocAorCisgICAgICAgIHZhciBhID0gKDB4N0ZGRkZGRkYgJiBjYXN0KG4gPj4gMSxJbnQpKTsKKyAgICAgICAgdmFyIGIgPSAoY2FzdChuICYgMSxJbnQpKTsKKyAgICAgICAgYiA9IC1iOyAgLy8gd29ya2Fyb3VuZCBmb3IgaHR0cHM6Ly9naXRodWIuY29tL0hheGVGb3VuZGF0aW9uL2hheGUvaXNzdWVzLzUyODgKKyAgICAgICAgcmV0dXJuIGEgXiBiOworCisgICAgICAgICNlbHNlCisKKyAgICAgICAgcmV0dXJuICgweDdGRkZGRkZGICYgY2FzdChuID4+IDEsSW50KSkgXiAoLWNhc3QobiAmIDEsSW50KSk7CisKKyAgICAgICAgI2VuZAorICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29udmVydCBsIGludG8gYSB6aWd6YWcgbG9uZy4gVGhpcyBhbGxvd3MgbmVnYXRpdmUgbnVtYmVycyB0byBiZQorICAgICAqIHJlcHJlc2VudGVkIGNvbXBhY3RseSBhcyBhIHZhcmludC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIEZyb21Mb25nKCBuIDogSW50NjQpIDogSW50NjQgeworICAgICAgICByZXR1cm4gSW50NjQueG9yKCBJbnQ2NC5zaGwobiwgMSksIEludDY0LnNocihuLCA2MykpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29udmVydCBmcm9tIHppZ3phZyBsb25nIHRvIGxvbmcuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBUb0xvbmcoIG4gOiBJbnQ2NCkgOiBJbnQ2NCB7CisgICAgICAgIHJldHVybiBJbnQ2NC54b3IoCisgICAgICAgICAgICBJbnQ2NC5hbmQoCisgICAgICAgICAgICAgICAgSW50NjQuc2hyKG4sIDEpLAorICAgICAgICAgICAgICAgIEludDY0Lm1ha2UoMHg3RkZGRkZGRiwgMHhGRkZGRkZGRikpLAorICAgICAgICAgICAgSW50NjQuc3ViKAorICAgICAgICAgICAgICAgIEludDY0Lm1ha2UoMCwgMCksCisgICAgICAgICAgICAgICAgSW50NjQuYW5kKG4sIEludDY0Lm1ha2UoMCwxKSkpKTsKKyAgICB9CisKKworICAgICNpZiBkZWJ1ZworICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIFRlc3QzMiggdGVzdCA6IEludCkgOiBWb2lkIHsKKyAgICAgICAgdmFyIGEgOiBVSW50ID0gWmlnWmFnLkZyb21JbnQoIHRlc3QpOworICAgICAgICB2YXIgYiA6IEludCA9IFppZ1phZy5Ub0ludChhKTsKKyAgICAgICAgI2lmIHBocAorICAgICAgICB0ZXN0ID0gdGVzdCAmIDB4RkZGRkZGRkY7ICAvLyB3b3JrYXJvdW5kIGZvciBodHRwczovL2dpdGh1Yi5jb20vSGF4ZUZvdW5kYXRpb24vaGF4ZS9pc3N1ZXMvNTI4OQorICAgICAgICAjZW5kCisgICAgICAgIGlmKCB0ZXN0ICE9IGIpCisgICAgICAgICAgICB0aHJvdyAnWmlnWmFnLlRlc3QzMigkdGVzdCkgZmFpbGVkOiBhID0gJGEsIGIgPSAkYic7CisgICAgfQorICAgICNlbmQKKworCisKKyAgICAjaWYgZGVidWcKKyAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBUZXN0NjQoIHRlc3QgOiBoYXhlLkludDY0KSA6IFZvaWQgeworICAgICAgICB2YXIgYSA6IEludDY0ID0gWmlnWmFnLkZyb21Mb25nKCB0ZXN0KTsKKyAgICAgICAgdmFyIGIgOiBJbnQ2NCA9IFppZ1phZy5Ub0xvbmcoYSk7CisgICAgICAgIGlmKCBJbnQ2NC5jb21wYXJlKCB0ZXN0LCBiKSAhPSAwKQorICAgICAgICAgICAgdGhyb3cgJ1ppZ1phZy5UZXN0NjQoJHRlc3QpIGZhaWxlZDogYSA9ICRhLCBiID0gJGInOworICAgIH0KKyAgICAjZW5kCisKKworICAgICNpZiBkZWJ1ZworICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gVW5pdFRlc3QoKSA6IFZvaWQgeworICAgICAgdmFyIHUxIDogVUludCA9IDB4RkZGRkZGRkU7CisgICAgICB2YXIgdTIgOiBVSW50ID0gMHhGRkZGRkZGRjsKKyAgICAgIHZhciBpMSA6IEludCA9IDIxNDc0ODM2NDc7CisgICAgICB2YXIgaTIgOiBJbnQgPSAtMjE0NzQ4MzY0ODsKKworICAgICAgI2lmIHBocAorICAgICAgaTIgPSBpMiAmIDB4RkZGRkZGRkY7ICAvLyB3b3JrYXJvdW5kIGZvciBodHRwczovL2dpdGh1Yi5jb20vSGF4ZUZvdW5kYXRpb24vaGF4ZS9pc3N1ZXMvNTI4OQorICAgICAgI2VuZAorCisgICAgICAvLyBwcm90b2J1ZiB0ZXN0Y2FzZXMKKyAgICAgIGlmKCBGcm9tSW50KDApICAhPSAwKSB0aHJvdyAncGIgIzEgdG8gWmlnWmFnJzsKKyAgICAgIGlmKCBGcm9tSW50KC0xKSAhPSAxKSB0aHJvdyAncGIgIzIgdG8gWmlnWmFnJzsKKyAgICAgIGlmKCBGcm9tSW50KDEpICAhPSAyKSB0aHJvdyAncGIgIzMgdG8gWmlnWmFnJzsKKyAgICAgIGlmKCBGcm9tSW50KC0yKSAhPSAzKSB0aHJvdyAncGIgIzQgdG8gWmlnWmFnJzsKKyAgICAgIGlmKCBGcm9tSW50KGkxKSAhPSB1MSkgdGhyb3cgJ3BiICM1IHRvIFppZ1phZyc7CisgICAgICBpZiggRnJvbUludChpMikgIT0gdTIpIHRocm93ICdwYiAjNiB0byBaaWdaYWcnOworCisgICAgICAvLyBwcm90b2J1ZiB0ZXN0Y2FzZXMKKyAgICAgIGlmKCBUb0ludCgwKSAhPSAwKSB0aHJvdyAncGIgIzEgZnJvbSBaaWdaYWcnOworICAgICAgaWYoIFRvSW50KDEpICE9IC0xKSB0aHJvdyAncGIgIzIgZnJvbSBaaWdaYWcnOworICAgICAgaWYoIFRvSW50KDIpICE9IDEpIHRocm93ICdwYiAjMyBmcm9tIFppZ1phZyc7CisgICAgICBpZiggVG9JbnQoMykgIT0gLTIpIHRocm93ICdwYiAjNCBmcm9tIFppZ1phZyc7CisgICAgICBpZiggVG9JbnQodTEpICE9IGkxKSB0aHJvdyAncGIgIzUgZnJvbSBaaWdaYWcsIGdvdCAke1RvSW50KHUxKX0gZXhwZWN0ZWQgJGkxJzsKKyAgICAgIGlmKCBUb0ludCh1MikgIT0gaTIpIHRocm93ICdwYiAjNiBmcm9tIFppZ1phZywgZ290ICR7VG9JbnQodTIpfSBleHBlY3RlZCAkaTInOworCisgICAgICAvLyBiYWNrIGFuZCBmb3J0aCAzMgorICAgICAgVGVzdDMyKCAwKTsKKyAgICAgIGZvciggaSBpbiAwIC4uLiAzMCkgeworICAgICAgICBUZXN0MzIoIDEgPDwgaSk7CisgICAgICAgIFRlc3QzMiggLSgxICA8PCBpKSk7CisgICAgICB9CisgICAgICBUZXN0MzIoIDB4N0ZGRkZGRkYpOworICAgICAgVGVzdDMyKCBjYXN0KDB4ODAwMDAwMDAsSW50KSk7CisKKyAgICAgIC8vIGJhY2sgYW5kIGZvcnRoIDY0CisgICAgICBUZXN0NjQoIEludDY0Lm1ha2UoMCwwKSk7CisgICAgICBmb3IoIGkgaW4gMCAuLi4gNjIpIHsKKyAgICAgICAgVGVzdDY0KCBJbnQ2NC5zaGwoIEludDY0Lm1ha2UoMCwxKSwgaSkpOworICAgICAgICBUZXN0NjQoIEludDY0LnN1YiggSW50NjQubWFrZSgwLDApLCBJbnQ2NC5zaGwoIEludDY0Lm1ha2UoMCwxKSwgaSkpKTsKKyAgICAgIH0KKyAgICAgIFRlc3Q2NCggSW50NjQubWFrZSgweDdGRkZGRkZGLDB4RkZGRkZGRkYpKTsKKyAgICAgIFRlc3Q2NCggSW50NjQubWFrZShjYXN0KDB4ODAwMDAwMDAsSW50KSwweDAwMDAwMDAwKSk7CisgICAgfQorICAgICNlbmQKK30KKworICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L21ldGFfZGF0YS9GaWVsZE1ldGFEYXRhLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L21ldGFfZGF0YS9GaWVsZE1ldGFEYXRhLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2ZGIxMTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvbWV0YV9kYXRhL0ZpZWxkTWV0YURhdGEuaHgKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YTsKKworaW1wb3J0IGZsYXNoLnV0aWxzLkRpY3Rpb25hcnk7CisKKy8qKgorKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gc3RvcmUgbWV0YSBkYXRhIGFib3V0IHRocmlmdCBmaWVsZHMuIEV2ZXJ5IGZpZWxkIGluIGEKKyogYSBzdHJ1Y3Qgc2hvdWxkIGhhdmUgYSBjb3JyZXNwb25kaW5nIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgZGVzY3JpYmluZyBpdC4KKyoKKyovCitjbGFzcyBGaWVsZE1ldGFEYXRhIHsKKworICBwdWJsaWMgdmFyIGZpZWxkTmFtZSA6IFN0cmluZzsKKyAgcHVibGljIHZhciByZXF1aXJlbWVudFR5cGUgOiBJbnQ7CisgIHB1YmxpYyB2YXIgdmFsdWVNZXRhRGF0YTpGaWVsZFZhbHVlTWV0YURhdGE7CisKKyAgcHJpdmF0ZSBzdGF0aWMgdmFyIHN0cnVjdE1hcDpEaWN0aW9uYXJ5ID0gbmV3IERpY3Rpb25hcnkoKTsKKworICBwdWJsaWMgZnVuY3Rpb24gRmllbGRNZXRhRGF0YShuYW1lIDogU3RyaW5nLCByZXEgOiBJbnQsIHZNZXRhRGF0YTpGaWVsZFZhbHVlTWV0YURhdGEpIHsKKyAgICB0aGlzLmZpZWxkTmFtZSA9IG5hbWU7CisgICAgdGhpcy5yZXF1aXJlbWVudFR5cGUgPSByZXE7CisgICAgdGhpcy52YWx1ZU1ldGFEYXRhID0gdk1ldGFEYXRhOworICB9CisKKyAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBhZGRTdHJ1Y3RNZXRhRGF0YU1hcChzQ2xhc3M6Q2xhc3MsIG1hcDpEaWN0aW9uYXJ5KSA6IFZvaWR7CisgICAgc3RydWN0TWFwW3NDbGFzc10gPSBtYXA7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyBhIG1hcCB3aXRoIG1ldGFkYXRhIChpLmUuIGluc3RhbmNlcyBvZiBGaWVsZE1ldGFEYXRhKSB0aGF0CisgICAqIGRlc2NyaWJlIHRoZSBmaWVsZHMgb2YgdGhlIGdpdmVuIGNsYXNzLgorICAgKgorICAgKiBAcGFyYW0gc0NsYXNzIFRoZSBUQmFzZSBjbGFzcyBmb3Igd2hpY2ggdGhlIG1ldGFkYXRhIG1hcCBpcyByZXF1ZXN0ZWQKKyAgICovCisgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0U3RydWN0TWV0YURhdGFNYXAoc0NsYXNzOkNsYXNzKTpEaWN0aW9uYXJ5IHsKKyAgICByZXR1cm4gc3RydWN0TWFwW3NDbGFzc107CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9tZXRhX2RhdGEvRmllbGRWYWx1ZU1ldGFEYXRhLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L21ldGFfZGF0YS9GaWVsZFZhbHVlTWV0YURhdGEuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg3OWQ5MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9tZXRhX2RhdGEvRmllbGRWYWx1ZU1ldGFEYXRhLmh4CkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGE7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZTsKKworLyoqCisgKiBGaWVsZFZhbHVlTWV0YURhdGEgYW5kIGNvbGxlY3Rpb24gb2Ygc3ViY2xhc3NlcyB0byBzdG9yZSBtZXRhZGF0YSBhYm91dAorICogdGhlIHZhbHVlKHMpIG9mIGEgZmllbGQKKyAqLworY2xhc3MgRmllbGRWYWx1ZU1ldGFEYXRhIHsKKworICBwdWJsaWMgdmFyIHR5cGUgOiBJbnQ7CisKKyAgcHVibGljIGZ1bmN0aW9uIEZpZWxkVmFsdWVNZXRhRGF0YSh0eXBlIDogSW50KSB7CisgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgfQorCisgIHB1YmxpYyBmdW5jdGlvbiBpc1N0cnVjdCgpIDogQm9vbCB7CisgICAgcmV0dXJuIHR5cGUgPT0gVFR5cGUuU1RSVUNUOworICB9CisKKyAgcHVibGljIGZ1bmN0aW9uIGlzQ29udGFpbmVyKCkgOiBCb29sIHsKKyAgICByZXR1cm4gdHlwZSA9PSBUVHlwZS5MSVNUIHx8IHR5cGUgPT0gVFR5cGUuTUFQIHx8IHR5cGUgPT0gVFR5cGUuU0VUOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvbWV0YV9kYXRhL0xpc3RNZXRhRGF0YS5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9tZXRhX2RhdGEvTGlzdE1ldGFEYXRhLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwY2EzMWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvbWV0YV9kYXRhL0xpc3RNZXRhRGF0YS5oeApAQCAtMCwwICsxLDMxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhOworCitjbGFzcyBMaXN0TWV0YURhdGEgZXh0ZW5kcyBGaWVsZFZhbHVlTWV0YURhdGEgeworCisgICAgcHVibGljIHZhciBlbGVtTWV0YURhdGE6RmllbGRWYWx1ZU1ldGFEYXRhOworCisgICAgcHVibGljIGZ1bmN0aW9uIExpc3RNZXRhRGF0YSh0eXBlIDogSW50LCBlTWV0YURhdGE6RmllbGRWYWx1ZU1ldGFEYXRhKSB7CisgICAgICBzdXBlcih0eXBlKTsKKyAgICAgIHRoaXMuZWxlbU1ldGFEYXRhID0gZU1ldGFEYXRhOworICAgIH0KK30KKyAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvbWV0YV9kYXRhL01hcE1ldGFEYXRhLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L21ldGFfZGF0YS9NYXBNZXRhRGF0YS5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDYzZTYyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L21ldGFfZGF0YS9NYXBNZXRhRGF0YS5oeApAQCAtMCwwICsxLDMzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhOworCitjbGFzcyBNYXBNZXRhRGF0YSBleHRlbmRzIEZpZWxkVmFsdWVNZXRhRGF0YSB7CisKKyAgICBwdWJsaWMgdmFyIGtleU1ldGFEYXRhOkZpZWxkVmFsdWVNZXRhRGF0YTsKKyAgICBwdWJsaWMgdmFyIHZhbHVlTWV0YURhdGE6RmllbGRWYWx1ZU1ldGFEYXRhOworCisgICAgcHVibGljIGZ1bmN0aW9uIE1hcE1ldGFEYXRhKHR5cGUgOiBJbnQsIGtNZXRhRGF0YTpGaWVsZFZhbHVlTWV0YURhdGEsIHZNZXRhRGF0YTpGaWVsZFZhbHVlTWV0YURhdGEpIHsKKyAgICAgIHN1cGVyKHR5cGUpOworICAgICAgdGhpcy5rZXlNZXRhRGF0YSA9IGtNZXRhRGF0YTsKKyAgICAgIHRoaXMudmFsdWVNZXRhRGF0YSA9IHZNZXRhRGF0YTsKKyAgICB9Cit9CisgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvbWV0YV9kYXRhL1NldE1ldGFEYXRhLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L21ldGFfZGF0YS9TZXRNZXRhRGF0YS5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzM2N2Y0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L21ldGFfZGF0YS9TZXRNZXRhRGF0YS5oeApAQCAtMCwwICsxLDMwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhOworCitjbGFzcyBTZXRNZXRhRGF0YSBleHRlbmRzIEZpZWxkVmFsdWVNZXRhRGF0YSB7CisKKyAgICBwdWJsaWMgdmFyIGVsZW1NZXRhRGF0YTpGaWVsZFZhbHVlTWV0YURhdGE7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gU2V0TWV0YURhdGEodHlwZSA6IEludCwgZU1ldGFEYXRhOkZpZWxkVmFsdWVNZXRhRGF0YSkgeworICAgICAgc3VwZXIodHlwZSk7CisgICAgICB0aGlzLmVsZW1NZXRhRGF0YSA9IGVNZXRhRGF0YTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvbWV0YV9kYXRhL1N0cnVjdE1ldGFEYXRhLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L21ldGFfZGF0YS9TdHJ1Y3RNZXRhRGF0YS5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODIyZGQzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L21ldGFfZGF0YS9TdHJ1Y3RNZXRhRGF0YS5oeApAQCAtMCwwICsxLDMwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhOworCitjbGFzcyBTdHJ1Y3RNZXRhRGF0YSBleHRlbmRzIEZpZWxkVmFsdWVNZXRhRGF0YSB7CisKKyAgICBwdWJsaWMgdmFyIHN0cnVjdENsYXNzOkNsYXNzOworCisgICAgcHVibGljIGZ1bmN0aW9uIFN0cnVjdE1ldGFEYXRhKHR5cGUgOiBJbnQsIHNDbGFzczpDbGFzcykgeworICAgICAgc3VwZXIodHlwZSk7CisgICAgICB0aGlzLnN0cnVjdENsYXNzID0gc0NsYXNzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlZjI5MWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmh4CkBAIC0wLDAgKzEsMzAxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7CisKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzOworaW1wb3J0IGhheGUuaW8uQnl0ZXNJbnB1dDsKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzT3V0cHV0OworaW1wb3J0IGhheGUuaW8uQnl0ZXNCdWZmZXI7CitpbXBvcnQgaGF4ZS5JbnQ2NDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQ7CisKKy8qKgorKiBCaW5hcnkgcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gZm9yIHRocmlmdC4KKyovCitjbGFzcyBUQmluYXJ5UHJvdG9jb2wgZXh0ZW5kcyBUUmVjdXJzaW9uVHJhY2tlciBpbXBsZW1lbnRzIFRQcm90b2NvbCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyB2YXIgQU5PTllNT1VTX1NUUlVDVDpUU3RydWN0ID0gbmV3IFRTdHJ1Y3QoKTsKKworICAgIHByaXZhdGUgc3RhdGljIGlubGluZSB2YXIgVkVSU0lPTl9NQVNLIDogaGF4ZS5JbnQzMiA9IDB4ZmZmZjAwMDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgaW5saW5lIHZhciBWRVJTSU9OXzEgOiBoYXhlLkludDMyID0gMHg4MDAxMDAwMDsKKworICAgIHByaXZhdGUgdmFyIHN0cmljdFJlYWRfIDogQm9vbCA9IGZhbHNlOworICAgIHByaXZhdGUgdmFyIHN0cmljdFdyaXRlXyA6IEJvb2wgPSB0cnVlOworICAgIHByaXZhdGUgdmFyIHRyYW5zXyA6IFRUcmFuc3BvcnQ7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvcgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcodHJhbnM6VFRyYW5zcG9ydCwgc3RyaWN0UmVhZCA6IEJvb2w9ZmFsc2UsIHN0cmljdFdyaXRlIDogQm9vbD10cnVlKSB7CisgICAgICB0cmFuc18gPSB0cmFuczsKKyAgICAgIHN0cmljdFJlYWRfID0gc3RyaWN0UmVhZDsKKyAgICAgIHN0cmljdFdyaXRlXyA9IHN0cmljdFdyaXRlOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRUcmFuc3BvcnQoKTpUVHJhbnNwb3J0IHsKKyAgICAgIHJldHVybiB0cmFuc187CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWVzc2FnZUJlZ2luKG1lc3NhZ2U6VE1lc3NhZ2UpIDogVm9pZCB7CisgICAgICAgIGlmIChzdHJpY3RXcml0ZV8pIHsKKyAgICAgICAgICB2YXIgdmVyc2lvbiA6IEludCA9IFZFUlNJT05fMSB8IG1lc3NhZ2UudHlwZTsKKyAgICAgICAgICB3cml0ZUkzMih2ZXJzaW9uKTsKKyAgICAgICAgICB3cml0ZVN0cmluZyhtZXNzYWdlLm5hbWUpOworICAgICAgICAgIHdyaXRlSTMyKG1lc3NhZ2Uuc2VxaWQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHdyaXRlU3RyaW5nKG1lc3NhZ2UubmFtZSk7CisgICAgICAgICAgd3JpdGVCeXRlKG1lc3NhZ2UudHlwZSk7CisgICAgICAgICAgd3JpdGVJMzIobWVzc2FnZS5zZXFpZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNZXNzYWdlRW5kKCkgOiBWb2lkIHt9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJ1Y3RCZWdpbihzdHJ1Y3Q6VFN0cnVjdCkgOiBWb2lkIHt9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJ1Y3RFbmQoKSA6IFZvaWQge30KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkQmVnaW4oZmllbGQ6VEZpZWxkKSA6IFZvaWQgeworICAgICAgd3JpdGVCeXRlKGZpZWxkLnR5cGUpOworICAgICAgd3JpdGVJMTYoZmllbGQuaWQpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkRW5kKCkgOiBWb2lkIHt9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZFN0b3AoKSA6IFZvaWQgeworICAgICAgd3JpdGVCeXRlKFRUeXBlLlNUT1ApOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1hcEJlZ2luKG1hcDpUTWFwKSA6IFZvaWQgeworICAgICAgd3JpdGVCeXRlKG1hcC5rZXlUeXBlKTsKKyAgICAgIHdyaXRlQnl0ZShtYXAudmFsdWVUeXBlKTsKKyAgICAgIHdyaXRlSTMyKG1hcC5zaXplKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNYXBFbmQoKSA6IFZvaWQge30KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUxpc3RCZWdpbihsaXN0OlRMaXN0KSA6IFZvaWQgeworICAgICAgICB3cml0ZUJ5dGUobGlzdC5lbGVtVHlwZSk7CisgICAgICAgIHdyaXRlSTMyKGxpc3Quc2l6ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTGlzdEVuZCgpIDogVm9pZCB7fQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU2V0QmVnaW4oc2V0OlRTZXQpIDogVm9pZCB7CisgICAgICAgIHdyaXRlQnl0ZShzZXQuZWxlbVR5cGUpOworICAgICAgICB3cml0ZUkzMihzZXQuc2l6ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU2V0RW5kKCkgOiBWb2lkIHt9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVCb29sKGIgOiBCb29sKSA6IFZvaWQgeworICAgICAgICB3cml0ZUJ5dGUoYiA/IDEgOiAwKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUJ5dGUoYiA6IEludCkgOiBWb2lkIHsKKyAgICAgICAgdmFyIG91dCA9IG5ldyBCeXRlc091dHB1dCgpOworICAgICAgICBvdXQuYmlnRW5kaWFuID0gdHJ1ZTsKKyAgICAgICAgb3V0LndyaXRlQnl0ZShiKTsKKyAgICAgICAgdHJhbnNfLndyaXRlKG91dC5nZXRCeXRlcygpLCAwLCAxKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJMTYoaTE2IDogSW50KSA6IFZvaWQgeworICAgICAgICB2YXIgb3V0ID0gbmV3IEJ5dGVzT3V0cHV0KCk7CisgICAgICAgIG91dC5iaWdFbmRpYW4gPSB0cnVlOworICAgICAgICBvdXQud3JpdGVJbnQxNihpMTYpOworICAgICAgICB0cmFuc18ud3JpdGUob3V0LmdldEJ5dGVzKCksIDAsIDIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUkzMihpMzIgOiBJbnQpIDogVm9pZCB7CisgICAgICAgIHZhciBvdXQgPSBuZXcgQnl0ZXNPdXRwdXQoKTsKKyAgICAgICAgb3V0LmJpZ0VuZGlhbiA9IHRydWU7CisgICAgICAgIG91dC53cml0ZUludDMyKGkzMik7CisgICAgICAgIHRyYW5zXy53cml0ZShvdXQuZ2V0Qnl0ZXMoKSwgMCwgNCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTY0KGk2NCA6IGhheGUuSW50NjQpIDogVm9pZCB7CisgICAgICAgIHZhciBvdXQgPSBuZXcgQnl0ZXNPdXRwdXQoKTsKKyAgICAgICAgb3V0LmJpZ0VuZGlhbiA9IHRydWU7CisgICAgICAgICNpZiggaGF4ZV92ZXIgPCAzLjIpCisgICAgICAgIHZhciBoaSA9IEludDY0LmdldEhpZ2goaTY0KTsKKyAgICAgICAgdmFyIGxvID0gSW50NjQuZ2V0TG93KGk2NCk7CisgICAgICAgIG91dC53cml0ZUludDMyKGhpKTsKKyAgICAgICAgb3V0LndyaXRlSW50MzIobG8pOworICAgICAgICAjZWxzZQorICAgICAgICBvdXQud3JpdGVJbnQzMihpNjQuaGlnaCk7CisgICAgICAgIG91dC53cml0ZUludDMyKGk2NC5sb3cpOworICAgICAgICAjZW5kCisgICAgICAgIHRyYW5zXy53cml0ZShvdXQuZ2V0Qnl0ZXMoKSwgMCwgOCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRG91YmxlKGR1YjpGbG9hdCkgOiBWb2lkIHsKKyAgICAgICAgdmFyIG91dCA9IG5ldyBCeXRlc091dHB1dCgpOworICAgICAgICBvdXQuYmlnRW5kaWFuID0gdHJ1ZTsKKyAgICAgICAgb3V0LndyaXRlRG91YmxlKGR1Yik7CisgICAgICAgIHRyYW5zXy53cml0ZShvdXQuZ2V0Qnl0ZXMoKSwgMCwgOCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU3RyaW5nKHN0ciA6IFN0cmluZykgOiBWb2lkIHsKKyAgICAgICAgdmFyIG91dCA9IG5ldyBCeXRlc091dHB1dCgpOworICAgICAgICBvdXQuYmlnRW5kaWFuID0gdHJ1ZTsKKyAgICAgICAgb3V0LndyaXRlU3RyaW5nKHN0cik7CisgICAgICAgIHZhciBieXRlcyA9IG91dC5nZXRCeXRlcygpOworICAgICAgICB3cml0ZUkzMiggYnl0ZXMubGVuZ3RoKTsKKyAgICAgICAgdHJhbnNfLndyaXRlKCBieXRlcywgMCwgYnl0ZXMubGVuZ3RoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVCaW5hcnkoYmluOkJ5dGVzKSA6IFZvaWQgeworICAgICAgICB3cml0ZUkzMihiaW4ubGVuZ3RoKTsKKyAgICAgICAgdHJhbnNfLndyaXRlKGJpbiwgMCwgYmluLmxlbmd0aCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZGluZyBtZXRob2RzLgorICAgICAqLworCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNZXNzYWdlQmVnaW4oKTpUTWVzc2FnZSB7CisgICAgICAgIHZhciBzaXplIDogSW50ID0gcmVhZEkzMigpOworICAgICAgICBpZiAoc2l6ZSA8IDApIHsKKyAgICAgICAgICAgIHZhciB2ZXJzaW9uIDogSW50ID0gc2l6ZSAmIFZFUlNJT05fTUFTSzsKKyAgICAgICAgICAgIGlmICh2ZXJzaW9uICE9IFZFUlNJT05fMSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLkJBRF9WRVJTSU9OLCAiQmFkIHZlcnNpb24gaW4gcmVhZE1lc3NhZ2VCZWdpbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5ldyBUTWVzc2FnZShyZWFkU3RyaW5nKCksIHNpemUgJiAweDAwMDAwMGZmLCByZWFkSTMyKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHN0cmljdFJlYWRfKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uQkFEX1ZFUlNJT04sICJNaXNzaW5nIHZlcnNpb24gaW4gcmVhZE1lc3NhZ2VCZWdpbiwgb2xkIGNsaWVudD8iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBuZXcgVE1lc3NhZ2UocmVhZFN0cmluZ0JvZHkoc2l6ZSksIHJlYWRCeXRlKCksIHJlYWRJMzIoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1lc3NhZ2VFbmQoKSA6IFZvaWQge30KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RydWN0QmVnaW4oKTpUU3RydWN0IHsKKyAgICAgICAgcmV0dXJuIEFOT05ZTU9VU19TVFJVQ1Q7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJ1Y3RFbmQoKSA6IFZvaWQge30KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkRmllbGRCZWdpbigpIDogVEZpZWxkIHsKKyAgICAgICAgdmFyIHR5cGUgOiBJbnQgPSByZWFkQnl0ZSgpOworICAgICAgICB2YXIgaWQgOiBJbnQgPSAwOworICAgICAgICBpZiAodHlwZSAhPSBUVHlwZS5TVE9QKQorICAgICAgICB7CisgICAgICAgICAgICBpZCA9IHJlYWRJMTYoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IFRGaWVsZCgiIiwgdHlwZSwgaWQpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkRmllbGRFbmQoKSA6IFZvaWQge30KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWFwQmVnaW4oKSA6IFRNYXAgeworICAgICAgICByZXR1cm4gbmV3IFRNYXAocmVhZEJ5dGUoKSwgcmVhZEJ5dGUoKSwgcmVhZEkzMigpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1hcEVuZCgpIDogVm9pZCB7fQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRMaXN0QmVnaW4oKTpUTGlzdCB7CisgICAgICAgIHJldHVybiBuZXcgVExpc3QocmVhZEJ5dGUoKSwgcmVhZEkzMigpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZExpc3RFbmQoKSA6IFZvaWQge30KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU2V0QmVnaW4oKSA6IFRTZXQgeworICAgICAgcmV0dXJuIG5ldyBUU2V0KHJlYWRCeXRlKCksIHJlYWRJMzIoKSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTZXRFbmQoKSA6IFZvaWQge30KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkQm9vbCgpIDogQm9vbCB7CisgICAgICAgIHJldHVybiAocmVhZEJ5dGUoKSA9PSAxKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkQnl0ZSgpIDogSW50IHsKKyAgICAgICAgdmFyIGJ1ZmZlciA9IG5ldyBCeXRlc0J1ZmZlcigpOworICAgICAgICB2YXIgbGVuID0gdHJhbnNfLnJlYWRBbGwoIGJ1ZmZlciwgMCwgMSk7CisgICAgICAgIHZhciBpbnAgPSBuZXcgQnl0ZXNJbnB1dCggYnVmZmVyLmdldEJ5dGVzKCksIDAsIDEpOworICAgICAgICBpbnAuYmlnRW5kaWFuID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIGlucC5yZWFkQnl0ZSgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkSTE2KCkgOiBJbnQgeworICAgICAgICB2YXIgYnVmZmVyID0gbmV3IEJ5dGVzQnVmZmVyKCk7CisgICAgICAgIHZhciBsZW4gPSB0cmFuc18ucmVhZEFsbCggYnVmZmVyLCAwLCAyKTsKKyAgICAgICAgdmFyIGlucCA9IG5ldyBCeXRlc0lucHV0KCBidWZmZXIuZ2V0Qnl0ZXMoKSwgMCwgMik7CisgICAgICAgIGlucC5iaWdFbmRpYW4gPSB0cnVlOworICAgICAgICByZXR1cm4gaW5wLnJlYWRJbnQxNigpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkSTMyKCkgOiBJbnQgeworICAgICAgICB2YXIgYnVmZmVyID0gbmV3IEJ5dGVzQnVmZmVyKCk7CisgICAgICAgIHZhciBsZW4gPSB0cmFuc18ucmVhZEFsbCggYnVmZmVyLCAwLCA0KTsKKyAgICAgICAgdmFyIGlucCA9IG5ldyBCeXRlc0lucHV0KCBidWZmZXIuZ2V0Qnl0ZXMoKSwgMCwgNCk7CisgICAgICAgIGlucC5iaWdFbmRpYW4gPSB0cnVlOworICAgICAgICByZXR1cm4gaW5wLnJlYWRJbnQzMigpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkSTY0KCkgOiBoYXhlLkludDY0IHsKKyAgICAgICAgdmFyIGJ1ZmZlciA9IG5ldyBCeXRlc0J1ZmZlcigpOworICAgICAgICB2YXIgbGVuID0gdHJhbnNfLnJlYWRBbGwoIGJ1ZmZlciwgMCwgOCk7CisgICAgICAgIHZhciBpbnAgPSBuZXcgQnl0ZXNJbnB1dCggYnVmZmVyLmdldEJ5dGVzKCksIDAsIDgpOworICAgICAgICBpbnAuYmlnRW5kaWFuID0gdHJ1ZTsKKyAgICAgICAgdmFyIGhpID0gaW5wLnJlYWRJbnQzMigpOworICAgICAgICB2YXIgbG8gPSBpbnAucmVhZEludDMyKCk7CisgICAgICAgIHJldHVybiBJbnQ2NC5tYWtlKGhpLGxvKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZERvdWJsZSgpOkZsb2F0IHsKKyAgICAgICAgdmFyIGJ1ZmZlciA9IG5ldyBCeXRlc0J1ZmZlcigpOworICAgICAgICB2YXIgbGVuID0gdHJhbnNfLnJlYWRBbGwoIGJ1ZmZlciwgMCwgOCk7CisgICAgICAgIHZhciBpbnAgPSBuZXcgQnl0ZXNJbnB1dCggYnVmZmVyLmdldEJ5dGVzKCksIDAsIDgpOworICAgICAgICBpbnAuYmlnRW5kaWFuID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIGlucC5yZWFkRG91YmxlKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJpbmcoKSA6IFN0cmluZyB7CisgICAgICAgIHJldHVybiByZWFkU3RyaW5nQm9keSggcmVhZEkzMigpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cmluZ0JvZHkobGVuIDogSW50KSA6IFN0cmluZyB7CisgICAgICAgIGlmKCBsZW4gPiAwKSB7CisgICAgICAgICAgICB2YXIgYnVmZmVyID0gbmV3IEJ5dGVzQnVmZmVyKCk7CisgICAgICAgICAgICB0cmFuc18ucmVhZEFsbCggYnVmZmVyLCAwLCBsZW4pOworICAgICAgICAgICAgdmFyIGlucCA9IG5ldyBCeXRlc0lucHV0KCBidWZmZXIuZ2V0Qnl0ZXMoKSwgMCwgbGVuKTsKKyAgICAgICAgICAgIGlucC5iaWdFbmRpYW4gPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuIGlucC5yZWFkU3RyaW5nKGxlbik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEJpbmFyeSgpIDogQnl0ZXMgeworICAgICAgICB2YXIgbGVuIDogSW50ID0gcmVhZEkzMigpOworICAgICAgICB2YXIgYnVmZmVyID0gbmV3IEJ5dGVzQnVmZmVyKCk7CisgICAgICAgIHRyYW5zXy5yZWFkQWxsKCBidWZmZXIsIDAsIGxlbik7CisgICAgICAgIHJldHVybiBidWZmZXIuZ2V0Qnl0ZXMoKTsKKyAgICB9CisKK30KKwpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbEZhY3RvcnkuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sRmFjdG9yeS5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGE5YmVjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbEZhY3RvcnkuaHgKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQ7CisKKworLyoqCisqIEJpbmFyeSBQcm90b2NvbCBGYWN0b3J5CisqLworY2xhc3MgVEJpbmFyeVByb3RvY29sRmFjdG9yeSBpbXBsZW1lbnRzIFRQcm90b2NvbEZhY3RvcnkgeworCisgICAgcHJpdmF0ZSB2YXIgc3RyaWN0UmVhZF8gOiBCb29sID0gZmFsc2U7CisgICAgcHJpdmF0ZSB2YXIgc3RyaWN0V3JpdGVfIDogQm9vbCA9IHRydWU7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KCBzdHJpY3RSZWFkIDogQm9vbCA9IGZhbHNlLCBzdHJpY3RXcml0ZSA6IEJvb2wgPSB0cnVlKSB7CisgICAgICAgIHN0cmljdFJlYWRfICA9IHN0cmljdFJlYWQ7CisgICAgICAgIHN0cmljdFdyaXRlXyA9IHN0cmljdFdyaXRlOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRQcm90b2NvbCggdHJhbnMgOiBUVHJhbnNwb3J0KSA6IFRQcm90b2NvbCAgeworICAgICAgICByZXR1cm4gbmV3IFRCaW5hcnlQcm90b2NvbCggdHJhbnMsIHN0cmljdFJlYWRfLCBzdHJpY3RXcml0ZV8pOworICAgIH0KK30KKworCisKKyAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzYjEzZTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5oeApAQCAtMCwwICsxLDcxOCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKKworaW1wb3J0IGhheGUuaW8uQnl0ZXM7CitpbXBvcnQgaGF4ZS5pby5CeXRlc0lucHV0OworaW1wb3J0IGhheGUuaW8uQnl0ZXNPdXRwdXQ7CitpbXBvcnQgaGF4ZS5pby5CeXRlc0J1ZmZlcjsKK2ltcG9ydCBoYXhlLmRzLkdlbmVyaWNTdGFjazsKK2ltcG9ydCBoYXhlLkludDMyOworaW1wb3J0IGhheGUuSW50NjQ7CitpbXBvcnQgaGF4ZS5VdGY4OworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5oZWxwZXIuWmlnWmFnOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LmhlbHBlci5CaXRDb252ZXJ0ZXI7CisKKworLyoqCisqIENvbXBhY3QgcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gZm9yIHRocmlmdC4KKyovCitjbGFzcyBUQ29tcGFjdFByb3RvY29sIGV4dGVuZHMgVFJlY3Vyc2lvblRyYWNrZXIgaW1wbGVtZW50cyBUUHJvdG9jb2wgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgdmFyIEFOT05ZTU9VU19TVFJVQ1QgOiBUU3RydWN0ID0gbmV3IFRTdHJ1Y3QoIiIpOworICAgIHByaXZhdGUgc3RhdGljIHZhciBUU1RPUCA6IFRGaWVsZCA9IG5ldyBURmllbGQoIiIsIFRUeXBlLlNUT1AsIDApOworCisgICAgcHJpdmF0ZSBzdGF0aWMgaW5saW5lIHZhciBQUk9UT0NPTF9JRCA6IEludCA9IDB4ODI7CisgICAgcHJpdmF0ZSBzdGF0aWMgaW5saW5lIHZhciBWRVJTSU9OIDogSW50ID0gMTsKKyAgICBwcml2YXRlIHN0YXRpYyBpbmxpbmUgdmFyIFZFUlNJT05fTUFTSyA6IEludCA9IDB4MWY7IC8vIDAwMDEgMTExMQorICAgIHByaXZhdGUgc3RhdGljIGlubGluZSB2YXIgVFlQRV9NQVNLIDogSW50ID0gMHhFMDsgLy8gMTExMCAwMDAwCisgICAgcHJpdmF0ZSBzdGF0aWMgaW5saW5lIHZhciBUWVBFX0JJVFMgOiBJbnQgPSAweDA3OyAvLyAwMDAwIDAxMTEKKyAgICBwcml2YXRlIHN0YXRpYyBpbmxpbmUgdmFyIFRZUEVfU0hJRlRfQU1PVU5UIDogSW50ID0gNTsKKworCisgICAgcHJpdmF0ZSBzdGF0aWMgdmFyIHR0eXBlVG9Db21wYWN0VHlwZSA9IFsKKyAgICAgICAgVFR5cGUuU1RPUCAgICA9PiBUQ29tcGFjdFR5cGVzLlNUT1AsCisgICAgICAgIFRUeXBlLkJPT0wgICAgPT4gVENvbXBhY3RUeXBlcy5CT09MRUFOX1RSVUUsCisgICAgICAgIFRUeXBlLkJZVEUgICAgPT4gVENvbXBhY3RUeXBlcy5CWVRFLAorICAgICAgICBUVHlwZS5ET1VCTEUgID0+IFRDb21wYWN0VHlwZXMuRE9VQkxFLAorICAgICAgICBUVHlwZS5JMTYgICAgID0+IFRDb21wYWN0VHlwZXMuSTE2LAorICAgICAgICBUVHlwZS5JMzIgICAgID0+IFRDb21wYWN0VHlwZXMuSTMyLAorICAgICAgICBUVHlwZS5JNjQgICAgID0+IFRDb21wYWN0VHlwZXMuSTY0LAorICAgICAgICBUVHlwZS5TVFJJTkcgID0+IFRDb21wYWN0VHlwZXMuQklOQVJZLAorICAgICAgICBUVHlwZS5TVFJVQ1QgID0+IFRDb21wYWN0VHlwZXMuU1RSVUNULAorICAgICAgICBUVHlwZS5NQVAgICAgID0+IFRDb21wYWN0VHlwZXMuTUFQLAorICAgICAgICBUVHlwZS5TRVQgICAgID0+IFRDb21wYWN0VHlwZXMuU0VULAorICAgICAgICBUVHlwZS5MSVNUICAgID0+IFRDb21wYWN0VHlwZXMuTElTVAorICAgIF07CisKKyAgICBwcml2YXRlIHN0YXRpYyB2YXIgdGNvbXBhY3RUeXBlVG9UeXBlID0gWworICAgICAgICBUQ29tcGFjdFR5cGVzLlNUT1AgICAgICAgICAgPT4gVFR5cGUuU1RPUCwKKyAgICAgICAgVENvbXBhY3RUeXBlcy5CT09MRUFOX1RSVUUgID0+IFRUeXBlLkJPT0wsCisgICAgICAgIFRDb21wYWN0VHlwZXMuQk9PTEVBTl9GQUxTRSA9PiBUVHlwZS5CT09MLAorICAgICAgICBUQ29tcGFjdFR5cGVzLkJZVEUgICAgICAgICAgPT4gVFR5cGUuQllURSwKKyAgICAgICAgVENvbXBhY3RUeXBlcy5JMTYgICAgICAgICAgID0+IFRUeXBlLkkxNiwKKyAgICAgICAgVENvbXBhY3RUeXBlcy5JMzIgICAgICAgICAgID0+IFRUeXBlLkkzMiwKKyAgICAgICAgVENvbXBhY3RUeXBlcy5JNjQgICAgICAgICAgID0+IFRUeXBlLkk2NCwKKyAgICAgICAgVENvbXBhY3RUeXBlcy5ET1VCTEUgICAgICAgID0+IFRUeXBlLkRPVUJMRSwKKyAgICAgICAgVENvbXBhY3RUeXBlcy5CSU5BUlkgICAgICAgID0+IFRUeXBlLlNUUklORywKKyAgICAgICAgVENvbXBhY3RUeXBlcy5MSVNUICAgICAgICAgID0+IFRUeXBlLkxJU1QsCisgICAgICAgIFRDb21wYWN0VHlwZXMuU0VUICAgICAgICAgICA9PiBUVHlwZS5TRVQsCisgICAgICAgIFRDb21wYWN0VHlwZXMuTUFQICAgICAgICAgICA9PiBUVHlwZS5NQVAsCisgICAgICAgIFRDb21wYWN0VHlwZXMuU1RSVUNUICAgICAgICA9PiBUVHlwZS5TVFJVQ1QKKyAgICBdOworCisKKyAgICAvKioKKyAgICAgKiBVc2VkIHRvIGtlZXAgdHJhY2sgb2YgdGhlIGxhc3QgZmllbGQgZm9yIHRoZSBjdXJyZW50IGFuZCBwcmV2aW91cyBzdHJ1Y3RzLAorICAgICAqIHNvIHdlIGNhbiBkbyB0aGUgZGVsdGEgc3R1ZmYuCisgICAgICovCisgICAgcHJpdmF0ZSB2YXIgbGFzdEZpZWxkXyA6IEdlbmVyaWNTdGFjazxJbnQ+ID0gbmV3IEdlbmVyaWNTdGFjazxJbnQ+KCk7CisgICAgcHJpdmF0ZSB2YXIgbGFzdEZpZWxkSWRfIDogSW50ID0gMDsKKworICAgIC8qKgorICAgICAqIElmIHdlIGVuY291bnRlciBhIGJvb2xlYW4gZmllbGQgYmVnaW4sIHNhdmUgdGhlIFRGaWVsZCBoZXJlIHNvIGl0IGNhbgorICAgICAqIGhhdmUgdGhlIHZhbHVlIGluY29ycG9yYXRlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZhciBib29sZWFuRmllbGRfIDogTnVsbDxURmllbGQ+OworCisgICAgLyoqCisgICAgICogSWYgd2UgUmVhZCBhIGZpZWxkIGhlYWRlciwgYW5kIGl0J3MgYSBib29sZWFuIGZpZWxkLCBzYXZlIHRoZSBib29sZWFuCisgICAgICogdmFsdWUgaGVyZSBzbyB0aGF0IFJlYWRCb29sIGNhbiB1c2UgaXQuCisgICAgICovCisgICAgcHJpdmF0ZSB2YXIgYm9vbFZhbHVlXyA6IE51bGw8Qm9vbD47CisKKworICAgIC8vIHdoZXRoZXIgdGhlIHVuZGVybHlpbmcgc3lzdGVtIGhvbGRzIFN0cmluZ3MgYXMgVVRGLTgKKyAgICAvLyBodHRwOi8vb2xkLmhheGUub3JnL21hbnVhbC9lbmNvZGluZworICAgIHByaXZhdGUgc3RhdGljIHZhciB1dGY4U3RyaW5ncyA9IGhheGUuVXRmOC52YWxpZGF0ZSgiw4ctw58tw4Yt0K4t0KgiKTsKKworICAgIC8vIHRoZSB0cmFuc3BvcnQgdXNlZAorICAgIHB1YmxpYyB2YXIgdHJhbnMoZGVmYXVsdCxudWxsKSA6IFRUcmFuc3BvcnQ7CisKKworICAgIC8vIFRDb21wYWN0UHJvdG9jb2wgQ29uc3RydWN0b3IKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KCB0cmFucyA6IFRUcmFuc3BvcnQpIHsKKyAgICAgICAgdGhpcy50cmFucyA9IHRyYW5zOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRUcmFuc3BvcnQoKSA6IFRUcmFuc3BvcnQgeworICAgICAgcmV0dXJuIHRyYW5zOworICAgIH0KKworCisgICAgcHVibGljIGZ1bmN0aW9uIFJlc2V0KCkgOiBWb2lkeworICAgICAgICB3aGlsZSAoICEgbGFzdEZpZWxkXy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGxhc3RGaWVsZF8ucG9wKCk7CisgICAgICAgIH0KKyAgICAgICAgbGFzdEZpZWxkSWRfID0gMDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFdyaXRlcyBhIGJ5dGUgd2l0aG91dCBhbnkgcG9zc2liaWxpdHkgb2YgYWxsIHRoYXQgZmllbGQgaGVhZGVyIG5vbnNlbnNlLgorICAgICAqIFVzZWQgaW50ZXJuYWxseSBieSBvdGhlciB3cml0aW5nIG1ldGhvZHMgdGhhdCBrbm93IHRoZXkgbmVlZCB0byBXcml0ZSBhIGJ5dGUuCisgICAgICovCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBXcml0ZUJ5dGVEaXJlY3QoIGIgOiBJbnQpIDogVm9pZCB7CisgICAgICAgIHZhciBidWYgPSBCeXRlcy5hbGxvYygxKTsKKyAgICAgICAgYnVmLnNldCggMCwgYik7CisgICAgICAgIHRyYW5zLndyaXRlKCBidWYsIDAsIDEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlIGFuIGkzMiBhcyBhIHZhcmludC4gUmVzdWx0cyBpbiAxLTUgYnl0ZXMgb24gdGhlIHdpcmUuCisgICAgICovCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBXcml0ZVZhcmludDMyKCBuIDogVUludCkgOiBWb2lkIHsKKyAgICAgICAgdmFyIGkzMmJ1ZiA9IG5ldyBCeXRlc0J1ZmZlcigpOworICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKChuICYgfjB4N0YpID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaTMyYnVmLmFkZEJ5dGUoIG4gJiAweEZGKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpMzJidWYuYWRkQnl0ZSggKG4gJiAweDdGKSB8IDB4ODApOworICAgICAgICAgICAgICAgIG4gPj49IDc7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2YXIgdG1wID0gaTMyYnVmLmdldEJ5dGVzKCk7CisgICAgICAgIHRyYW5zLndyaXRlKCB0bXAsIDAsIHRtcC5sZW5ndGgpOworICAgIH0KKworICAgIC8qKgorICAgICogV3JpdGUgYSBtZXNzYWdlIGhlYWRlciB0byB0aGUgd2lyZS4gQ29tcGFjdCBQcm90b2NvbCBtZXNzYWdlcyBjb250YWluIHRoZQorICAgICogcHJvdG9jb2wgdmVyc2lvbiBzbyB3ZSBjYW4gbWlncmF0ZSBmb3J3YXJkcyBpbiB0aGUgZnV0dXJlIGlmIG5lZWQgYmUuCisgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNZXNzYWdlQmVnaW4oIG1lc3NhZ2UgOiBUTWVzc2FnZSkgOiBWb2lkIHsKKyAgICAgICAgUmVzZXQoKTsKKworICAgICAgICB2YXIgdmVyc2lvbkFuZFR5cGUgOiBJbnQgPSAgKFZFUlNJT04gJiBWRVJTSU9OX01BU0spIHwgKChtZXNzYWdlLnR5cGUgPDwgVFlQRV9TSElGVF9BTU9VTlQpICYgVFlQRV9NQVNLKTsKKyAgICAgICAgV3JpdGVCeXRlRGlyZWN0KCBQUk9UT0NPTF9JRCk7CisgICAgICAgIFdyaXRlQnl0ZURpcmVjdCggdmVyc2lvbkFuZFR5cGUpOworICAgICAgICBXcml0ZVZhcmludDMyKCBjYXN0KCBtZXNzYWdlLnNlcWlkLCBVSW50KSk7CisgICAgICAgIHdyaXRlU3RyaW5nKCBtZXNzYWdlLm5hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlIGEgc3RydWN0IGJlZ2luLiBUaGlzIGRvZXNuJ3QgYWN0dWFsbHkgcHV0IGFueXRoaW5nIG9uIHRoZSB3aXJlLiBXZQorICAgICAqIHVzZSBpdCBhcyBhbiBvcHBvcnR1bml0eSB0byBwdXQgc3BlY2lhbCBwbGFjZWhvbGRlciBtYXJrZXJzIG9uIHRoZSBmaWVsZAorICAgICAqIHN0YWNrIHNvIHdlIGNhbiBnZXQgdGhlIGZpZWxkIGlkIGRlbHRhcyBjb3JyZWN0LgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cnVjdEJlZ2luKHN0cnVjdDpUU3RydWN0KSA6IFZvaWQgeworICAgICAgICBsYXN0RmllbGRfLmFkZCggbGFzdEZpZWxkSWRfKTsKKyAgICAgICAgbGFzdEZpZWxkSWRfID0gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZSBhIHN0cnVjdCBlbmQuIFRoaXMgZG9lc24ndCBhY3R1YWxseSBwdXQgYW55dGhpbmcgb24gdGhlIHdpcmUuIFdlIHVzZQorICAgICAqIHRoaXMgYXMgYW4gb3Bwb3J0dW5pdHkgdG8gcG9wIHRoZSBsYXN0IGZpZWxkIGZyb20gdGhlIGN1cnJlbnQgc3RydWN0IG9mZgorICAgICAqIG9mIHRoZSBmaWVsZCBzdGFjay4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJ1Y3RFbmQoKSA6IFZvaWQgeworICAgICAgICBsYXN0RmllbGRJZF8gPSBsYXN0RmllbGRfLnBvcCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlIGEgZmllbGQgaGVhZGVyIGNvbnRhaW5pbmcgdGhlIGZpZWxkIGlkIGFuZCBmaWVsZCB0eXBlLiBJZiB0aGUKKyAgICAgKiBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGN1cnJlbnQgZmllbGQgaWQgYW5kIHRoZSBsYXN0IG9uZSBpcyBzbWFsbCAoPCAxNSksCisgICAgICogdGhlbiB0aGUgZmllbGQgaWQgd2lsbCBiZSBlbmNvZGVkIGluIHRoZSA0IE1TQiBhcyBhIGRlbHRhLiBPdGhlcndpc2UsIHRoZQorICAgICAqIGZpZWxkIGlkIHdpbGwgZm9sbG93IHRoZSB0eXBlIGhlYWRlciBhcyBhIHppZ3phZyB2YXJpbnQuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRCZWdpbihmaWVsZDpURmllbGQpIDogVm9pZCB7CisgICAgICAgIGlmIChmaWVsZC50eXBlID09IFRUeXBlLkJPT0wpCisgICAgICAgICAgICBib29sZWFuRmllbGRfID0gZmllbGQ7IC8vIHdlIHdhbnQgdG8gcG9zc2libHkgaW5jbHVkZSB0aGUgdmFsdWUsIHNvIHdlJ2xsIHdhaXQuCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFdyaXRlRmllbGRCZWdpbkludGVybmFsKGZpZWxkLCAweEZGKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgd29ya2hvcnNlIG9mIFdyaXRlRmllbGRCZWdpbi4gSXQgaGFzIHRoZSBvcHRpb24gb2YgZG9pbmcgYQorICAgICAqICd0eXBlIG92ZXJyaWRlJyBvZiB0aGUgdHlwZSBoZWFkZXIuIFRoaXMgaXMgdXNlZCBzcGVjaWZpY2FsbHkgaW4gdGhlCisgICAgICogYm9vbGVhbiBmaWVsZCBjYXNlLgorICAgICAqLworICAgIHByaXZhdGUgZnVuY3Rpb24gV3JpdGVGaWVsZEJlZ2luSW50ZXJuYWwoIGZpZWxkIDogVEZpZWxkLCB0eXBlT3ZlcnJpZGUgOiBJbnQpIDogVm9pZCB7CisgICAgICAgIC8vIGlmIHRoZXJlJ3MgYSB0eXBlIG92ZXJyaWRlLCB1c2UgdGhhdC4KKyAgICAgICAgdmFyIHR5cGVUb1dyaXRlIDogSW50OworICAgICAgICBpZiAoIHR5cGVPdmVycmlkZSA9PSAweEZGKQorICAgICAgICAgICAgdHlwZVRvV3JpdGUgPSBnZXRDb21wYWN0VHlwZSggZmllbGQudHlwZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHR5cGVUb1dyaXRlID0gdHlwZU92ZXJyaWRlOworCisgICAgICAgIC8vIGNoZWNrIGlmIHdlIGNhbiB1c2UgZGVsdGEgZW5jb2RpbmcgZm9yIHRoZSBmaWVsZCBpZAorICAgICAgICBpZiAoZmllbGQuaWQgPiBsYXN0RmllbGRJZF8gJiYgZmllbGQuaWQgLSBsYXN0RmllbGRJZF8gPD0gMTUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFdyaXRlIHRoZW0gdG9nZXRoZXIKKyAgICAgICAgICAgIFdyaXRlQnl0ZURpcmVjdCgoZmllbGQuaWQgLSBsYXN0RmllbGRJZF8pIDw8IDQgfCB0eXBlVG9Xcml0ZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvLyBXcml0ZSB0aGVtIHNlcGFyYXRlCisgICAgICAgICAgICBXcml0ZUJ5dGVEaXJlY3QodHlwZVRvV3JpdGUpOworICAgICAgICAgICAgd3JpdGVJMTYoZmllbGQuaWQpOworICAgICAgICB9CisKKyAgICAgICAgbGFzdEZpZWxkSWRfID0gZmllbGQuaWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGUgdGhlIFNUT1Agc3ltYm9sIHNvIHdlIGtub3cgdGhlcmUgYXJlIG5vIG1vcmUgZmllbGRzIGluIHRoaXMgc3RydWN0LgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkU3RvcCgpIDogVm9pZCB7CisgICAgICAgIFdyaXRlQnl0ZURpcmVjdCggY2FzdChUQ29tcGFjdFR5cGVzLlNUT1AsIEludCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlIGEgbWFwIGhlYWRlci4gSWYgdGhlIG1hcCBpcyBlbXB0eSwgb21pdCB0aGUga2V5IGFuZCB2YWx1ZSB0eXBlCisgICAgICogaGVhZGVycywgYXMgd2UgZG9uJ3QgbmVlZCBhbnkgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB0byBza2lwIGl0LgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1hcEJlZ2luKG1hcDpUTWFwKSA6IFZvaWQgeworICAgICAgICBpZiAobWFwLnNpemUgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgV3JpdGVCeXRlRGlyZWN0KDApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGt2dHlwZSA9IChnZXRDb21wYWN0VHlwZShtYXAua2V5VHlwZSkgPDwgNCkgfCBnZXRDb21wYWN0VHlwZShtYXAudmFsdWVUeXBlKTsKKyAgICAgICAgICAgIFdyaXRlVmFyaW50MzIoIGNhc3QoIG1hcC5zaXplLCBVSW50KSk7CisgICAgICAgICAgICBXcml0ZUJ5dGVEaXJlY3QoIGt2dHlwZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZSBhIGxpc3QgaGVhZGVyLgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUxpc3RCZWdpbiggbGlzdCA6IFRMaXN0KSA6IFZvaWQgeworICAgICAgICBXcml0ZUNvbGxlY3Rpb25CZWdpbiggbGlzdC5lbGVtVHlwZSwgbGlzdC5zaXplKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZSBhIHNldCBoZWFkZXIuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU2V0QmVnaW4oIHNldCA6IFRTZXQpIDogVm9pZCB7CisgICAgICAgIFdyaXRlQ29sbGVjdGlvbkJlZ2luKCBzZXQuZWxlbVR5cGUsIHNldC5zaXplKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZSBhIGJvb2xlYW4gdmFsdWUuIFBvdGVudGlhbGx5LCB0aGlzIGNvdWxkIGJlIGEgYm9vbGVhbiBmaWVsZCwgaW4KKyAgICAgKiB3aGljaCBjYXNlIHRoZSBmaWVsZCBoZWFkZXIgaW5mbyBpc24ndCB3cml0dGVuIHlldC4gSWYgc28sIGRlY2lkZSB3aGF0IHRoZQorICAgICAqIHJpZ2h0IHR5cGUgaGVhZGVyIGlzIGZvciB0aGUgdmFsdWUgYW5kIHRoZW4gV3JpdGUgdGhlIGZpZWxkIGhlYWRlci4KKyAgICAgKiBPdGhlcndpc2UsIFdyaXRlIGEgc2luZ2xlIGJ5dGUuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlQm9vbChiIDogQm9vbCkgOiBWb2lkIHsKKyAgICAgICAgdmFyIGJjdCA6IEludCA9IGIgPyBUQ29tcGFjdFR5cGVzLkJPT0xFQU5fVFJVRSA6IFRDb21wYWN0VHlwZXMuQk9PTEVBTl9GQUxTRTsKKworICAgICAgICBpZiAoYm9vbGVhbkZpZWxkXyAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICAvLyB3ZSBoYXZlbid0IHdyaXR0ZW4gdGhlIGZpZWxkIGhlYWRlciB5ZXQKKyAgICAgICAgICAgIFdyaXRlRmllbGRCZWdpbkludGVybmFsKCBib29sZWFuRmllbGRfLCBiY3QpOworICAgICAgICAgICAgYm9vbGVhbkZpZWxkXyA9IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvLyB3ZSdyZSBub3QgcGFydCBvZiBhIGZpZWxkLCBzbyBqdXN0IFdyaXRlIHRoZSB2YWx1ZS4KKyAgICAgICAgICAgIFdyaXRlQnl0ZURpcmVjdCggYmN0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlIGEgYnl0ZS4gTm90aGluZyB0byBzZWUgaGVyZSEKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVCeXRlKCBiIDogSW50KSA6IFZvaWQgeworICAgICAgICBXcml0ZUJ5dGVEaXJlY3QoIGIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlIGFuIEkxNiBhcyBhIHppZ3phZyB2YXJpbnQuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTE2KCBpMTYgOiBJbnQpIDogVm9pZCB7CisgICAgICAgIFdyaXRlVmFyaW50MzIoIFppZ1phZy5Gcm9tSW50KCBpMTYpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZSBhbiBpMzIgYXMgYSB6aWd6YWcgdmFyaW50LgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUkzMiggaTMyIDogSW50KSA6IFZvaWQgeworICAgICAgICBXcml0ZVZhcmludDMyKCBaaWdaYWcuRnJvbUludCggaTMyKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGUgYW4gaTY0IGFzIGEgemlnemFnIHZhcmludC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJNjQoIGk2NCA6IGhheGUuSW50NjQpIDogVm9pZCB7CisgICAgICAgIFdyaXRlVmFyaW50NjQoICBaaWdaYWcuRnJvbUxvbmcoIGk2NCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlIGEgZG91YmxlIHRvIHRoZSB3aXJlIGFzIDggYnl0ZXMuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRG91YmxlKCBkdWIgOiBGbG9hdCkgOiBWb2lkIHsKKyAgICAgICAgdmFyIGRhdGEgPSBCaXRDb252ZXJ0ZXIuZml4ZWRMb25nVG9CeXRlcyggQml0Q29udmVydGVyLkRvdWJsZVRvSW50NjRCaXRzKGR1YikpOworICAgICAgICB0cmFucy53cml0ZSggZGF0YSwgMCwgZGF0YS5sZW5ndGgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlIGEgc3RyaW5nIHRvIHRoZSB3aXJlIHdpdGggYSB2YXJpbnQgc2l6ZSBwcmVjZWRpbmcuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU3RyaW5nKHN0ciA6IFN0cmluZykgOiBWb2lkIHsKKyAgICAgICAgdmFyIGJ1ZiA9IG5ldyBCeXRlc0J1ZmZlcigpOworICAgICAgICBpZiggdXRmOFN0cmluZ3MpCisgICAgICAgICAgICBidWYuYWRkU3RyaW5nKCBzdHIpOyAgLy8gbm8gbmVlZCB0byBlbmNvZGUgb24gVVRGOCB0YXJnZXRzLCB0aGUgc3RyaW5nIGlzIGp1c3QgZmluZQorICAgICAgICBlbHNlCisgICAgICAgICAgICBidWYuYWRkU3RyaW5nKCBVdGY4LmVuY29kZSggc3RyKSk7CisgICAgICAgIHZhciB0bXAgPSBidWYuZ2V0Qnl0ZXMoKTsKKyAgICAgICAgd3JpdGVCaW5hcnkoIHRtcCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGUgYSBieXRlIGFycmF5LCB1c2luZyBhIHZhcmludCBmb3IgdGhlIHNpemUuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlQmluYXJ5KCBiaW4gOiBCeXRlcykgOiBWb2lkIHsKKyAgICAgICAgV3JpdGVWYXJpbnQzMiggY2FzdChiaW4ubGVuZ3RoLFVJbnQpKTsKKyAgICAgICAgdHJhbnMud3JpdGUoIGJpbiwgMCwgYmluLmxlbmd0aCk7CisgICAgfQorCisKKyAgICAvLyBUaGVzZSBtZXRob2RzIGFyZSBjYWxsZWQgYnkgc3RydWN0cywgYnV0IGRvbid0IGFjdHVhbGx5IGhhdmUgYW55IHdpcmUKKyAgICAvLyBvdXRwdXQgb3IgcHVycG9zZS4KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNZXNzYWdlRW5kKCkgOiBWb2lkIHsgfQorICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1hcEVuZCgpIDogVm9pZCB7IH0KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVMaXN0RW5kKCkgOiBWb2lkIHsgfQorICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVNldEVuZCgpIDogVm9pZCB7IH0KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZEVuZCgpIDogVm9pZCB7IH0KKworICAgIC8vCisgICAgLy8gSW50ZXJuYWwgd3JpdGluZyBtZXRob2RzCisgICAgLy8KKworICAgIC8qKgorICAgICAqIEFic3RyYWN0IG1ldGhvZCBmb3Igd3JpdGluZyB0aGUgc3RhcnQgb2YgbGlzdHMgYW5kIHNldHMuIExpc3QgYW5kIHNldHMgb24KKyAgICAgKiB0aGUgd2lyZSBkaWZmZXIgb25seSBieSB0aGUgdHlwZSBpbmRpY2F0b3IuCisgICAgICovCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBXcml0ZUNvbGxlY3Rpb25CZWdpbiggZWxlbVR5cGUgOiBJbnQsIHNpemUgOiBJbnQpIDogVm9pZCB7CisgICAgICAgIGlmIChzaXplIDw9IDE0KSAgICB7CisgICAgICAgICAgICBXcml0ZUJ5dGVEaXJlY3QoIHNpemUgPDwgNCB8IGdldENvbXBhY3RUeXBlKGVsZW1UeXBlKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBXcml0ZUJ5dGVEaXJlY3QoIDB4ZjAgfCBnZXRDb21wYWN0VHlwZShlbGVtVHlwZSkpOworICAgICAgICAgICAgV3JpdGVWYXJpbnQzMiggY2FzdChzaXplLCBVSW50KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZSBhbiBpNjQgYXMgYSB2YXJpbnQuIFJlc3VsdHMgaW4gMS0xMCBieXRlcyBvbiB0aGUgd2lyZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZ1bmN0aW9uIFdyaXRlVmFyaW50NjQobiA6IGhheGUuSW50NjQpIDogVm9pZCAgICB7CisgICAgICAgIHZhciB2YXJpbnQ2NG91dCA9IG5ldyBCeXRlc0J1ZmZlcigpOworICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIEludDY0LmlzWmVybyggSW50NjQuYW5kKCBuLCBJbnQ2NC5uZWcoSW50NjQubWFrZSgwLDB4N0YpKSkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICNpZiggaGF4ZV92ZXIgPCAzLjIpCisgICAgICAgICAgICAgICAgdmFyaW50NjRvdXQuYWRkQnl0ZSggSW50NjQuZ2V0TG93KG4pKTsKKyAgICAgICAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgICAgIHZhcmludDY0b3V0LmFkZEJ5dGUoIG4ubG93KTsKKyAgICAgICAgICAgICAgICAjZW5kCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgI2lmICggaGF4ZV92ZXIgPCAzLjIpCisgICAgICAgICAgICAgICAgdmFyaW50NjRvdXQuYWRkQnl0ZSggKEludDY0LmdldExvdyhuKSAmIDB4N0YpIHwgMHg4MCk7CisgICAgICAgICAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgICAgICB2YXJpbnQ2NG91dC5hZGRCeXRlKCAobi5sb3cgJiAweDdGKSB8IDB4ODApOworICAgICAgICAgICAgICAgICNlbmQKKyAgICAgICAgICAgICAgICBuID0gSW50NjQuc2hyKCBuLCA3KTsKKyAgICAgICAgICAgICAgICBuID0gSW50NjQuYW5kKCBuLCBJbnQ2NC5tYWtlKDB4MDFGRkZGRkYsMHhGRkZGRkZGRikpOyAgLy8gY2xlYW4gb3V0IHRoZSBzaGlmdGVkIDcgYml0cworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHZhciB0bXAgPSB2YXJpbnQ2NG91dC5nZXRCeXRlcygpOworICAgICAgICB0cmFucy53cml0ZSggdG1wLCAwLCB0bXAubGVuZ3RoKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlYWQgYSBtZXNzYWdlIGhlYWRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1lc3NhZ2VCZWdpbigpOlRNZXNzYWdlIHsKKyAgICAgICAgUmVzZXQoKTsKKworICAgICAgICB2YXIgcHJvdG9jb2xJZCA6IEludCA9IHJlYWRCeXRlKCk7CisgICAgICAgIGlmIChwcm90b2NvbElkICE9IFBST1RPQ09MX0lEKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCBUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLCAiRXhwZWN0ZWQgcHJvdG9jb2wgaWQgIiArIFN0cmluZ1Rvb2xzLmhleChQUk9UT0NPTF9JRCwyKSArICIgYnV0IGdvdCAiICsgU3RyaW5nVG9vbHMuaGV4KHByb3RvY29sSWQpKTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciB2ZXJzaW9uQW5kVHlwZSA6IEludCA9IHJlYWRCeXRlKCk7CisgICAgICAgIHZhciB2ZXJzaW9uIDogSW50ID0gKHZlcnNpb25BbmRUeXBlICYgVkVSU0lPTl9NQVNLKTsKKyAgICAgICAgaWYgKHZlcnNpb24gIT0gVkVSU0lPTikgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbiggVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwgIkV4cGVjdGVkIHZlcnNpb24gIiArIFZFUlNJT04gKyAiIGJ1dCBnb3QgIiArIHZlcnNpb24pOworICAgICAgICB9CisKKyAgICAgICAgdmFyIHR5cGUgOiBJbnQgPSAoKHZlcnNpb25BbmRUeXBlID4+IFRZUEVfU0hJRlRfQU1PVU5UKSAmIFRZUEVfQklUUyk7CisgICAgICAgIHZhciBzZXFpZCA6IEludCA9IGNhc3QoIFJlYWRWYXJpbnQzMigpLCBJbnQpOworICAgICAgICB2YXIgbXNnTm0gOiBTdHJpbmcgPSByZWFkU3RyaW5nKCk7CisgICAgICAgIHJldHVybiBuZXcgVE1lc3NhZ2UoIG1zZ05tLCB0eXBlLCBzZXFpZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZCBhIHN0cnVjdCBiZWdpbi4gVGhlcmUncyBub3RoaW5nIG9uIHRoZSB3aXJlIGZvciB0aGlzLCBidXQgaXQgaXMgb3VyCisgICAgICogb3Bwb3J0dW5pdHkgdG8gcHVzaCBhIG5ldyBzdHJ1Y3QgYmVnaW4gbWFya2VyIG9udG8gdGhlIGZpZWxkIHN0YWNrLgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RydWN0QmVnaW4oKTpUU3RydWN0IHsKKyAgICAgICAgbGFzdEZpZWxkXy5hZGQobGFzdEZpZWxkSWRfKTsKKyAgICAgICAgbGFzdEZpZWxkSWRfID0gMDsKKyAgICAgICAgcmV0dXJuIEFOT05ZTU9VU19TVFJVQ1Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogRG9lc24ndCBhY3R1YWxseSBjb25zdW1lIGFueSB3aXJlIGRhdGEsIGp1c3QgcmVtb3ZlcyB0aGUgbGFzdCBmaWVsZCBmb3IKKyAgICAgKiB0aGlzIHN0cnVjdCBmcm9tIHRoZSBmaWVsZCBzdGFjay4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cnVjdEVuZCgpIDogVm9pZCB7CisgICAgICAgIC8vIGNvbnN1bWUgdGhlIGxhc3QgZmllbGQgd2UgUmVhZCBvZmYgdGhlIHdpcmUuCisgICAgICAgIGxhc3RGaWVsZElkXyA9IGxhc3RGaWVsZF8ucG9wKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZCBhIGZpZWxkIGhlYWRlciBvZmYgdGhlIHdpcmUuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRGaWVsZEJlZ2luKCkgOiBURmllbGQgeworICAgICAgICB2YXIgdHlwZSA6IEludCA9IHJlYWRCeXRlKCk7CisKKyAgICAgICAgLy8gaWYgaXQncyBhIHN0b3AsIHRoZW4gd2UgY2FuIHJldHVybiBpbW1lZGlhdGVseSwgYXMgdGhlIHN0cnVjdCBpcyBvdmVyLgorICAgICAgICBpZiAodHlwZSA9PSBjYXN0KFRDb21wYWN0VHlwZXMuU1RPUCxJbnQpKSB7CisgICAgICAgICAgICByZXR1cm4gVFNUT1A7CisgICAgICAgIH0KKworICAgICAgICB2YXIgZmllbGRJZCA6IEludDsKKworICAgICAgICAvLyBtYXNrIG9mZiB0aGUgNCBNU0Igb2YgdGhlIHR5cGUgaGVhZGVyLiBpdCBjb3VsZCBjb250YWluIGEgZmllbGQgaWQgZGVsdGEuCisgICAgICAgIHZhciBtb2RpZmllciA6IEludCA9ICgodHlwZSAmIDB4ZjApID4+IDQpOworICAgICAgICBpZiAobW9kaWZpZXIgPT0gMCkKKyAgICAgICAgICAgIGZpZWxkSWQgPSByZWFkSTE2KCk7ICAvLyBub3QgYSBkZWx0YS4gbG9vayBhaGVhZCBmb3IgdGhlIHppZ3phZyB2YXJpbnQgZmllbGQgaWQuCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGZpZWxkSWQgPSBsYXN0RmllbGRJZF8gKyBtb2RpZmllcjsgLy8gYWRkIHRoZSBkZWx0YSB0byB0aGUgbGFzdCBSZWFkIGZpZWxkIGlkLgorCisgICAgICAgIHZhciBmaWVsZCA6IFRGaWVsZCAgPSBuZXcgVEZpZWxkKCAiIiwgY2FzdChnZXRUVHlwZSh0eXBlICYgMHgwZiksSW50KSwgZmllbGRJZCk7CisKKyAgICAgICAgLy8gaWYgdGhpcyBoYXBwZW5zIHRvIGJlIGEgYm9vbGVhbiBmaWVsZCwgdGhlIHZhbHVlIGlzIGVuY29kZWQgaW4gdGhlIHR5cGUKKyAgICAgICAgaWYgKGlzQm9vbFR5cGUodHlwZSkpIHsKKyAgICAgICAgICAgIC8vIHNhdmUgdGhlIGJvb2xlYW4gdmFsdWUgaW4gYSBzcGVjaWFsIGluc3RhbmNlIHZhcmlhYmxlLgorICAgICAgICAgICAgYm9vbFZhbHVlXyA9ICgodHlwZSAmIDB4MGYpID09IGNhc3QoVENvbXBhY3RUeXBlcy5CT09MRUFOX1RSVUUsSW50KSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBwdXNoIHRoZSBuZXcgZmllbGQgb250byB0aGUgZmllbGQgc3RhY2sgc28gd2UgY2FuIGtlZXAgdGhlIGRlbHRhcyBnb2luZy4KKyAgICAgICAgbGFzdEZpZWxkSWRfID0gZmllbGQuaWQ7CisgICAgICAgIHJldHVybiBmaWVsZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkIGEgbWFwIGhlYWRlciBvZmYgdGhlIHdpcmUuIElmIHRoZSBzaXplIGlzIHplcm8sIHNraXAgUmVhZGluZyB0aGUga2V5CisgICAgICogYW5kIHZhbHVlIHR5cGUuIFRoaXMgbWVhbnMgdGhhdCAwLWxlbmd0aCBtYXBzIHdpbGwgeWllbGQgVE1hcHMgd2l0aG91dCB0aGUKKyAgICAgKiAiY29ycmVjdCIgdHlwZXMuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNYXBCZWdpbigpIDogVE1hcCB7CisgICAgICAgIHZhciBzaXplIDogSW50ID0gY2FzdCggUmVhZFZhcmludDMyKCksIEludCk7CisgICAgICAgIHZhciBrZXlBbmRWYWx1ZVR5cGUgOiBJbnQgPSAoKHNpemUgPT0gMCkgID8gIDAgIDogIHJlYWRCeXRlKCkpOworICAgICAgICB2YXIga2V5IDogSW50ID0gY2FzdCggZ2V0VFR5cGUoIChrZXlBbmRWYWx1ZVR5cGUgJiAweEYwKSA+PiA0KSwgSW50KTsKKyAgICAgICAgdmFyIHZhbCA6IEludCA9IGNhc3QoIGdldFRUeXBlKCBrZXlBbmRWYWx1ZVR5cGUgJiAweDBGKSwgSW50KTsKKyAgICAgICAgcmV0dXJuIG5ldyBUTWFwKCBrZXksIHZhbCwgc2l6ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZCBhIGxpc3QgaGVhZGVyIG9mZiB0aGUgd2lyZS4gSWYgdGhlIGxpc3Qgc2l6ZSBpcyAwLTE0LCB0aGUgc2l6ZSB3aWxsCisgICAgICogYmUgcGFja2VkIGludG8gdGhlIGVsZW1lbnQgdHlwZSBoZWFkZXIuIElmIGl0J3MgYSBsb25nZXIgbGlzdCwgdGhlIDQgTVNCCisgICAgICogb2YgdGhlIGVsZW1lbnQgdHlwZSBoZWFkZXIgd2lsbCBiZSAweEYsIGFuZCBhIHZhcmludCB3aWxsIGZvbGxvdyB3aXRoIHRoZQorICAgICAqIHRydWUgc2l6ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZExpc3RCZWdpbigpOlRMaXN0IHsKKyAgICAgICAgdmFyIHNpemVfYW5kX3R5cGUgOiBJbnQgPSByZWFkQnl0ZSgpOworCisgICAgICAgIHZhciBzaXplIDogSW50ID0gKChzaXplX2FuZF90eXBlICYgMHhGMCkgPj4gNCkgJiAweDBGOworICAgICAgICBpZiAoc2l6ZSA9PSAxNSkgeworICAgICAgICAgICAgc2l6ZSA9IGNhc3QoIFJlYWRWYXJpbnQzMigpLCBJbnQpOworICAgICAgICB9CisKKyAgICAgICAgdmFyIHR5cGUgPSBnZXRUVHlwZShzaXplX2FuZF90eXBlKTsKKyAgICAgICAgcmV0dXJuIG5ldyBUTGlzdCggdHlwZSwgc2l6ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZCBhIHNldCBoZWFkZXIgb2ZmIHRoZSB3aXJlLiBJZiB0aGUgc2V0IHNpemUgaXMgMC0xNCwgdGhlIHNpemUgd2lsbAorICAgICAqIGJlIHBhY2tlZCBpbnRvIHRoZSBlbGVtZW50IHR5cGUgaGVhZGVyLiBJZiBpdCdzIGEgbG9uZ2VyIHNldCwgdGhlIDQgTVNCCisgICAgICogb2YgdGhlIGVsZW1lbnQgdHlwZSBoZWFkZXIgd2lsbCBiZSAweEYsIGFuZCBhIHZhcmludCB3aWxsIGZvbGxvdyB3aXRoIHRoZQorICAgICAqIHRydWUgc2l6ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFNldEJlZ2luKCkgOiBUU2V0IHsKKyAgICAgICAgdmFyIHNpemVfYW5kX3R5cGUgOiBJbnQgPSByZWFkQnl0ZSgpOworCisgICAgICAgIHZhciBzaXplIDogSW50ID0gKChzaXplX2FuZF90eXBlICYgMHhGMCkgPj4gNCkgJiAweDBGOworICAgICAgICBpZiAoc2l6ZSA9PSAxNSkgeworICAgICAgICAgICAgc2l6ZSA9IGNhc3QoIFJlYWRWYXJpbnQzMigpLCBJbnQpOworICAgICAgICB9CisKKyAgICAgICAgdmFyIHR5cGUgPSBnZXRUVHlwZShzaXplX2FuZF90eXBlKTsKKyAgICAgICAgcmV0dXJuIG5ldyBUU2V0KCB0eXBlLCBzaXplKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkIGEgYm9vbGVhbiBvZmYgdGhlIHdpcmUuIElmIHRoaXMgaXMgYSBib29sZWFuIGZpZWxkLCB0aGUgdmFsdWUgc2hvdWxkCisgICAgICogYWxyZWFkeSBoYXZlIGJlZW4gUmVhZCBkdXJpbmcgUmVhZEZpZWxkQmVnaW4sIHNvIHdlJ2xsIGp1c3QgY29uc3VtZSB0aGUKKyAgICAgKiBwcmUtc3RvcmVkIHZhbHVlLiBPdGhlcndpc2UsIFJlYWQgYSBieXRlLgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkQm9vbCgpIDogQm9vbCB7CisgICAgICAgIGlmIChib29sVmFsdWVfICE9IG51bGwpIHsKKyAgICAgICAgICAgIHZhciByZXN1bHQgOiBCb29sID0gYm9vbFZhbHVlXzsKKyAgICAgICAgICAgIGJvb2xWYWx1ZV8gPSBudWxsOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAocmVhZEJ5dGUoKSA9PSBjYXN0KFRDb21wYWN0VHlwZXMuQk9PTEVBTl9UUlVFLEludCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWQgYSBzaW5nbGUgYnl0ZSBvZmYgdGhlIHdpcmUuIE5vdGhpbmcgaW50ZXJlc3RpbmcgaGVyZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEJ5dGUoKSA6IEludCB7CisgICAgICAgIHZhciBieXRlUmF3QnVmID0gbmV3IEJ5dGVzQnVmZmVyKCk7CisgICAgICAgIHRyYW5zLnJlYWRBbGwoIGJ5dGVSYXdCdWYsIDAsIDEpOworICAgICAgICByZXR1cm4gYnl0ZVJhd0J1Zi5nZXRCeXRlcygpLmdldCgwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkIGFuIGkxNiBmcm9tIHRoZSB3aXJlIGFzIGEgemlnemFnIHZhcmludC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEkxNigpIDogSW50IHsKKyAgICAgICAgcmV0dXJuIFppZ1phZy5Ub0ludCggUmVhZFZhcmludDMyKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWQgYW4gaTMyIGZyb20gdGhlIHdpcmUgYXMgYSB6aWd6YWcgdmFyaW50LgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkSTMyKCkgOiBJbnQgeworICAgICAgICByZXR1cm4gWmlnWmFnLlRvSW50KCBSZWFkVmFyaW50MzIoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZCBhbiBpNjQgZnJvbSB0aGUgd2lyZSBhcyBhIHppZ3phZyB2YXJpbnQuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRJNjQoKSA6IGhheGUuSW50NjQgeworICAgICAgICByZXR1cm4gWmlnWmFnLlRvTG9uZyggUmVhZFZhcmludDY0KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE5vIG1hZ2ljIGhlcmUgLSBqdXN0IFJlYWQgYSBkb3VibGUgb2ZmIHRoZSB3aXJlLgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkRG91YmxlKCk6RmxvYXQgeworICAgICAgICB2YXIgbG9uZ0JpdHMgPSBuZXcgQnl0ZXNCdWZmZXIoKTsKKyAgICAgICAgdHJhbnMucmVhZEFsbCggbG9uZ0JpdHMsIDAsIDgpOworICAgICAgICByZXR1cm4gQml0Q29udmVydGVyLkludDY0Qml0c1RvRG91YmxlKCBCaXRDb252ZXJ0ZXIuYnl0ZXNUb0xvbmcoIGxvbmdCaXRzLmdldEJ5dGVzKCkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkcyBhIGJ5dGVbXSAodmlhIFJlYWRCaW5hcnkpLCBhbmQgdGhlbiBVVEYtOCBkZWNvZGVzIGl0LgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RyaW5nKCkgOiBTdHJpbmcgeworICAgICAgICB2YXIgbGVuZ3RoIDogSW50ID0gY2FzdCggUmVhZFZhcmludDMyKCksIEludCk7CisKKyAgICAgICAgaWYgKGxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgIH0KKworICAgICAgICB2YXIgYnVmID0gbmV3IEJ5dGVzQnVmZmVyKCk7CisgICAgICAgIHRyYW5zLnJlYWRBbGwoIGJ1ZiwgMCwgbGVuZ3RoKTsKKworICAgICAgICBsZW5ndGggPSBidWYubGVuZ3RoOworICAgICAgICB2YXIgaW5wID0gbmV3IEJ5dGVzSW5wdXQoIGJ1Zi5nZXRCeXRlcygpKTsKKyAgICAgICAgdmFyIHN0ciA9IGlucC5yZWFkU3RyaW5nKCBsZW5ndGgpOworICAgICAgICBpZiggdXRmOFN0cmluZ3MpCisgICAgICAgICAgICByZXR1cm4gc3RyOyAgLy8gbm8gbmVlZCB0byBkZWNvZGUgb24gVVRGOCB0YXJnZXRzLCB0aGUgc3RyaW5nIGlzIGp1c3QgZmluZQorICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gVXRmOC5kZWNvZGUoIHN0cik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZCBhIGJ5dGVbXSBmcm9tIHRoZSB3aXJlLgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkQmluYXJ5KCkgOiBCeXRlcyB7CisgICAgICAgIHZhciBsZW5ndGggOiBJbnQgPSBjYXN0KCBSZWFkVmFyaW50MzIoKSwgSW50KTsKKyAgICAgICAgaWYgKGxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gQnl0ZXMuYWxsb2MoMCk7CisgICAgICAgIH0KKworICAgICAgICB2YXIgYnVmID0gbmV3IEJ5dGVzQnVmZmVyKCk7CisgICAgICAgIHRyYW5zLnJlYWRBbGwoIGJ1ZiwgMCwgbGVuZ3RoKTsKKyAgICAgICAgcmV0dXJuIGJ1Zi5nZXRCeXRlcygpOworICAgIH0KKworCisgICAgLy8gVGhlc2UgbWV0aG9kcyBhcmUgaGVyZSBmb3IgdGhlIHN0cnVjdCB0byBjYWxsLCBidXQgZG9uJ3QgaGF2ZSBhbnkgd2lyZQorICAgIC8vIGVuY29kaW5nLgorICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWVzc2FnZUVuZCgpIDogVm9pZCB7IH0KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEZpZWxkRW5kKCkgOiBWb2lkIHsgfQorICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWFwRW5kKCkgOiBWb2lkIHsgfQorICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTGlzdEVuZCgpIDogVm9pZCB7IH0KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFNldEVuZCgpIDogVm9pZCB7IH0KKworICAgIC8vCisgICAgLy8gSW50ZXJuYWwgUmVhZGluZyBtZXRob2RzCisgICAgLy8KKworICAgIC8qKgorICAgICAqIFJlYWQgYW4gaTMyIGZyb20gdGhlIHdpcmUgYXMgYSB2YXJpbnQuIFRoZSBNU0Igb2YgZWFjaCBieXRlIGlzIHNldAorICAgICAqIGlmIHRoZXJlIGlzIGFub3RoZXIgYnl0ZSB0byBmb2xsb3cuIFRoaXMgY2FuIFJlYWQgdXAgdG8gNSBieXRlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZ1bmN0aW9uIFJlYWRWYXJpbnQzMigpIDogVUludCB7CisgICAgICAgIHZhciByZXN1bHQgOiBVSW50ID0gMDsKKyAgICAgICAgdmFyIHNoaWZ0IDogSW50ID0gMDsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIHZhciBiIDogSW50ID0gcmVhZEJ5dGUoKTsKKyAgICAgICAgICAgIHJlc3VsdCB8PSBjYXN0KChiICYgMHg3ZikgPDwgc2hpZnQsIFVJbnQpOworICAgICAgICAgICAgaWYgKChiICYgMHg4MCkgIT0gMHg4MCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2hpZnQgKz0gNzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWQgYW4gaTY0IGZyb20gdGhlIHdpcmUgYXMgYSBwcm9wZXIgdmFyaW50LiBUaGUgTVNCIG9mIGVhY2ggYnl0ZSBpcyBzZXQKKyAgICAgKiBpZiB0aGVyZSBpcyBhbm90aGVyIGJ5dGUgdG8gZm9sbG93LiBUaGlzIGNhbiBSZWFkIHVwIHRvIDEwIGJ5dGVzLgorICAgICAqLworICAgIHByaXZhdGUgZnVuY3Rpb24gUmVhZFZhcmludDY0KCkgOiBJbnQ2NCB7CisgICAgICAgIHZhciBzaGlmdCA6IEludCA9IDA7CisgICAgICAgIHZhciByZXN1bHQgOiBJbnQ2NCA9IEludDY0Lm1ha2UoMCwwKTsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIHZhciBiIDogSW50ID0gcmVhZEJ5dGUoKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IEludDY0Lm9yKCByZXN1bHQsIEludDY0LnNobCggSW50NjQubWFrZSgwLGIgJiAweDdmKSwgc2hpZnQpKTsKKyAgICAgICAgICAgIGlmICgoYiAmIDB4ODApICE9IDB4ODApIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNoaWZ0ICs9IDc7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworCisgICAgLy8KKyAgICAvLyB0eXBlIHRlc3RpbmcgYW5kIGNvbnZlcnRpbmcKKyAgICAvLworCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBpc0Jvb2xUeXBlKCBiIDogSW50KSA6IEJvb2wgeworICAgICAgICB2YXIgbG93ZXJOaWJibGUgOiBJbnQgPSBiICYgMHgwZjsKKyAgICAgICAgc3dpdGNoKGxvd2VyTmliYmxlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIFRDb21wYWN0VHlwZXMuQk9PTEVBTl9UUlVFOiByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIGNhc2UgVENvbXBhY3RUeXBlcy5CT09MRUFOX0ZBTFNFOiByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogR2l2ZW4gYSBUQ29tcGFjdFByb3RvY29sLlRDb21wYWN0VHlwZXMgY29uc3RhbnQsIGNvbnZlcnQgaXQgdG8gaXRzIGNvcnJlc3BvbmRpbmcKKyAgICAgKiBUVHlwZSB2YWx1ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZ1bmN0aW9uIGdldFRUeXBlKCB0eXBlIDogSW50KSA6IEludCB7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdGNvbXBhY3RUeXBlVG9UeXBlW3R5cGVdOworICAgICAgICB9CisgICAgICAgIGNhdGNoICggZSA6IER5bmFtaWMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB0dCA6IEludCA9ICh0eXBlICYgMHgwZik7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCBUUHJvdG9jb2xFeGNlcHRpb24uVU5LTk9XTiwgJ2RvblwndCBrbm93IHdoYXQgdHlwZTogJHR0ICgkZSknKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdpdmVuIGEgVFR5cGUgdmFsdWUsIGZpbmQgdGhlIGFwcHJvcHJpYXRlIFRDb21wYWN0UHJvdG9jb2wuVENvbXBhY3RUeXBlcyBjb25zdGFudC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZ1bmN0aW9uIGdldENvbXBhY3RUeXBlKCB0dHlwZSA6IEludCkgOiBJbnQKKyAgICB7CisgICAgICAgIHJldHVybiBjYXN0KCB0dHlwZVRvQ29tcGFjdFR5cGVbdHR5cGVdLCBJbnQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sRmFjdG9yeS5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sRmFjdG9yeS5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTY3M2I0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2xGYWN0b3J5Lmh4CkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0OworCisKKy8qKgorKiBDb21wYWN0IFByb3RvY29sIEZhY3RvcnkKKyovCitjbGFzcyBUQ29tcGFjdFByb3RvY29sRmFjdG9yeSBpbXBsZW1lbnRzIFRQcm90b2NvbEZhY3RvcnkgeworCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldygpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0UHJvdG9jb2woIHRyYW5zIDogVFRyYW5zcG9ydCkgOiBUUHJvdG9jb2wgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUQ29tcGFjdFByb3RvY29sKCB0cmFucyk7CisgICAgfQorfQorCisKKworICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UQ29tcGFjdFR5cGVzLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RDb21wYWN0VHlwZXMuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RkM2Q4NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UQ29tcGFjdFR5cGVzLmh4CkBAIC0wLDAgKzEsNDEgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7CisKKy8qKgorICogQWxsIG9mIHRoZSBvbi13aXJlIHR5cGUgY29kZXMuCisgKi8KK0A6ZW51bQorYWJzdHJhY3QgVENvbXBhY3RUeXBlcyhJbnQpICBmcm9tIEludCB0byBJbnQgIHsKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgU1RPUCAgICAgICAgICA9IDB4MDA7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIEJPT0xFQU5fVFJVRSAgPSAweDAxOworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBCT09MRUFOX0ZBTFNFID0gMHgwMjsKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgQllURSAgICAgICAgICA9IDB4MDM7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIEkxNiAgICAgICAgICAgPSAweDA0OworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBJMzIgICAgICAgICAgID0gMHgwNTsKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgSTY0ICAgICAgICAgICA9IDB4MDY7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIERPVUJMRSAgICAgICAgPSAweDA3OworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBCSU5BUlkgICAgICAgID0gMHgwODsKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgTElTVCAgICAgICAgICA9IDB4MDk7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIFNFVCAgICAgICAgICAgPSAweDBBOworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBNQVAgICAgICAgICAgID0gMHgwQjsKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgU1RSVUNUICAgICAgICA9IDB4MEM7Cit9CisKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9URmllbGQuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEZpZWxkLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmNTQ5OGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEZpZWxkLmh4CkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKKworY2xhc3MgVEZpZWxkIHsKKworICAgIHB1YmxpYyB2YXIgbmFtZSA6IFN0cmluZzsKKyAgICBwdWJsaWMgdmFyIHR5cGUgOiBJbnQ7CisgICAgcHVibGljIHZhciBpZCA6IEludDsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcobiA6IFN0cmluZyA9ICIiLCB0IDogSW50ID0gMCwgaSA6IEludCA9IDApIHsKKyAgICAgIG5hbWUgPSBuOworICAgICAgdHlwZSA9IHQ7CisgICAgICBpZCA9IGk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRvU3RyaW5nKCkgOiBTdHJpbmcgeworICAgICAgcmV0dXJuICc8VEZpZWxkIG5hbWU6IiRuYW1lIiB0eXBlOiIkdHlwZSIgZmllbGQtaWQ6IiRpZCI+JzsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gZXF1YWxzKCBvdGhlckZpZWxkIDogVEZpZWxkKSA6IEJvb2wgeworICAgICAgcmV0dXJuICh0eXBlID09IG90aGVyRmllbGQudHlwZSkKKyAgICAgICAgICAmJiAoaWQgPT0gb3RoZXJGaWVsZC5pZCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9USlNPTlByb3RvY29sLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMGZmMzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5oeApAQCAtMCwwICsxLDEwNzMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKKworaW1wb3J0IGhheGUuaW8uQnl0ZXM7CitpbXBvcnQgaGF4ZS5pby5CeXRlc0lucHV0OworaW1wb3J0IGhheGUuaW8uQnl0ZXNPdXRwdXQ7CitpbXBvcnQgaGF4ZS5pby5CeXRlc0J1ZmZlcjsKK2ltcG9ydCBoYXhlLmRzLkdlbmVyaWNTdGFjazsKK2ltcG9ydCBoYXhlLlV0Zjg7CitpbXBvcnQgaGF4ZS5jcnlwdG8uQmFzZTY0OworaW1wb3J0IGhheGUuSW50NjQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNZXNzYWdlOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVExpc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQ7CisKKworCisvKiBKU09OIHByb3RvY29sIGltcGxlbWVudGF0aW9uIGZvciB0aHJpZnQuCisqICBUaGlzIGlzIGEgZnVsbC1mZWF0dXJlZCBwcm90b2NvbCBzdXBwb3J0aW5nIFdyaXRlIGFuZCBSZWFkLgorKgorKiAgUGxlYXNlIHNlZSB0aGUgQysrIGNsYXNzIGhlYWRlciBmb3IgYSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGUgd2lyZSBmb3JtYXQuCisqCisqICBBZGFwdGVkIGZyb20gdGhlIEphdmEgdmVyc2lvbi4KKyovCitjbGFzcyBUSlNPTlByb3RvY29sIGV4dGVuZHMgVFJlY3Vyc2lvblRyYWNrZXIgaW1wbGVtZW50cyBUUHJvdG9jb2wgeworCisgICAgcHVibGljIHZhciB0cmFucyhkZWZhdWx0LG51bGwpIDogVFRyYW5zcG9ydDsKKworICAgIC8vIFN0YWNrIG9mIG5lc3RlZCBjb250ZXh0cyB0aGF0IHdlIG1heSBiZSBpbgorICAgIHByaXZhdGUgdmFyIGNvbnRleHRTdGFjayA6IEdlbmVyaWNTdGFjazxKU09OQmFzZUNvbnRleHQ+ID0gbmV3IEdlbmVyaWNTdGFjazxKU09OQmFzZUNvbnRleHQ+KCk7CisKKyAgICAvLyBDdXJyZW50IGNvbnRleHQgdGhhdCB3ZSBhcmUgaW4KKyAgICBwcml2YXRlIHZhciBjb250ZXh0IDogSlNPTkJhc2VDb250ZXh0OworCisgICAgLy8gUmVhZGVyIHRoYXQgbWFuYWdlcyBhIDEtYnl0ZSBidWZmZXIKKyAgICBwcml2YXRlIHZhciByZWFkZXIgOiBMb29rYWhlYWRSZWFkZXI7CisKKyAgICAvLyB3aGV0aGVyIHRoZSB1bmRlcmx5aW5nIHN5c3RlbSBob2xkcyBTdHJpbmdzIGFzIFVURi04CisgICAgLy8gaHR0cDovL29sZC5oYXhlLm9yZy9tYW51YWwvZW5jb2RpbmcKKyAgICBwcml2YXRlIHN0YXRpYyB2YXIgdXRmOFN0cmluZ3MgPSBoYXhlLlV0ZjgudmFsaWRhdGUoIsOHLcOfLcOGLdCuLdCoIik7CisKKyAgICAvLyBUSlNPTlByb3RvY29sIENvbnN0cnVjdG9yCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldyggdHJhbnMgOiBUVHJhbnNwb3J0KQorICAgIHsKKyAgICAgICAgdGhpcy50cmFucyA9IHRyYW5zOworICAgICAgICB0aGlzLmNvbnRleHQgPSBuZXcgSlNPTkJhc2VDb250ZXh0KHRoaXMpOworICAgICAgICB0aGlzLnJlYWRlciA9IG5ldyBMb29rYWhlYWRSZWFkZXIodGhpcyk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGdldFRyYW5zcG9ydCgpIDogVFRyYW5zcG9ydCB7CisgICAgICByZXR1cm4gdHJhbnM7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWVzc2FnZUJlZ2luKG1lc3NhZ2U6VE1lc3NhZ2UpIDogVm9pZCB7CisgICAgICAgIFdyaXRlSlNPTkFycmF5U3RhcnQoKTsKKyAgICAgICAgV3JpdGVKU09OSW50ZWdlciggSlNPTkNvbnN0YW50cy5WRVJTSU9OKTsKKyAgICAgICAgV3JpdGVKU09OU3RyaW5nKCBCeXRlc0Zyb21TdHJpbmcobWVzc2FnZS5uYW1lKSk7CisgICAgICAgIFdyaXRlSlNPTkludGVnZXIoIG1lc3NhZ2UudHlwZSk7CisgICAgICAgIFdyaXRlSlNPTkludGVnZXIoIG1lc3NhZ2Uuc2VxaWQpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1lc3NhZ2VFbmQoKSA6IFZvaWQgeworICAgICAgICBXcml0ZUpTT05BcnJheUVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cnVjdEJlZ2luKHN0cnVjdDpUU3RydWN0KSA6IFZvaWQgeworICAgICAgICBXcml0ZUpTT05PYmplY3RTdGFydCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cnVjdEVuZCgpIDogVm9pZCB7CisgICAgICAgIFdyaXRlSlNPTk9iamVjdEVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkQmVnaW4oZmllbGQ6VEZpZWxkKSA6IFZvaWQgeworICAgICAgICBXcml0ZUpTT05JbnRlZ2VyKCBmaWVsZC5pZCApOworICAgICAgICBXcml0ZUpTT05PYmplY3RTdGFydCgpOworICAgICAgICBXcml0ZUpTT05TdHJpbmcoIEJ5dGVzRnJvbVN0cmluZyggSlNPTkNvbnN0YW50cy5HZXRUeXBlTmFtZUZvclR5cGVJRCggZmllbGQudHlwZSkpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZEVuZCgpIDogVm9pZCB7CisgICAgICAgIFdyaXRlSlNPTk9iamVjdEVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkU3RvcCgpIDogVm9pZCB7IH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1hcEJlZ2luKG1hcDpUTWFwKSA6IFZvaWQgeworICAgICAgICBXcml0ZUpTT05BcnJheVN0YXJ0KCk7CisgICAgICAgIFdyaXRlSlNPTlN0cmluZyggQnl0ZXNGcm9tU3RyaW5nKCBKU09OQ29uc3RhbnRzLkdldFR5cGVOYW1lRm9yVHlwZUlEKCBtYXAua2V5VHlwZSkpKTsKKyAgICAgICAgV3JpdGVKU09OU3RyaW5nKCBCeXRlc0Zyb21TdHJpbmcoIEpTT05Db25zdGFudHMuR2V0VHlwZU5hbWVGb3JUeXBlSUQoIG1hcC52YWx1ZVR5cGUpKSk7CisgICAgICAgIFdyaXRlSlNPTkludGVnZXIoIG1hcC5zaXplKTsKKyAgICAgICAgV3JpdGVKU09OT2JqZWN0U3RhcnQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNYXBFbmQoKSA6IFZvaWQgeworICAgICAgICBXcml0ZUpTT05PYmplY3RFbmQoKTsKKyAgICAgICAgV3JpdGVKU09OQXJyYXlFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVMaXN0QmVnaW4obGlzdDpUTGlzdCkgOiBWb2lkIHsKKyAgICAgICAgV3JpdGVKU09OQXJyYXlTdGFydCgpOworICAgICAgICBXcml0ZUpTT05TdHJpbmcoIEJ5dGVzRnJvbVN0cmluZyggSlNPTkNvbnN0YW50cy5HZXRUeXBlTmFtZUZvclR5cGVJRCggbGlzdC5lbGVtVHlwZSApKSk7CisgICAgICAgIFdyaXRlSlNPTkludGVnZXIoIGxpc3Quc2l6ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTGlzdEVuZCgpIDogVm9pZCB7CisgICAgICAgIFdyaXRlSlNPTkFycmF5RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU2V0QmVnaW4oc2V0OlRTZXQpIDogVm9pZCB7CisgICAgICAgIFdyaXRlSlNPTkFycmF5U3RhcnQoKTsKKyAgICAgICAgV3JpdGVKU09OU3RyaW5nKCBCeXRlc0Zyb21TdHJpbmcoIEpTT05Db25zdGFudHMuR2V0VHlwZU5hbWVGb3JUeXBlSUQoIHNldC5lbGVtVHlwZSkpKTsKKyAgICAgICAgV3JpdGVKU09OSW50ZWdlciggc2V0LnNpemUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVNldEVuZCgpIDogVm9pZCB7CisgICAgICAgIFdyaXRlSlNPTkFycmF5RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlQm9vbChiIDogQm9vbCkgOiBWb2lkIHsKKyAgICAgICAgaWYoIGIpCisgICAgICAgICAgICBXcml0ZUpTT05JbnRlZ2VyKCAxKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgV3JpdGVKU09OSW50ZWdlciggMCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlQnl0ZShiIDogSW50KSA6IFZvaWQgeworICAgICAgICBXcml0ZUpTT05JbnRlZ2VyKCBiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJMTYoaTE2IDogSW50KSA6IFZvaWQgeworICAgICAgICBXcml0ZUpTT05JbnRlZ2VyKCBpMTYpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUkzMihpMzIgOiBJbnQpIDogVm9pZCB7CisgICAgICAgIFdyaXRlSlNPTkludGVnZXIoIGkzMik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTY0KGk2NCA6IGhheGUuSW50NjQpIDogVm9pZCB7CisgICAgICAgIFdyaXRlSlNPTkludDY0KCBpNjQpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZURvdWJsZShkdWI6RmxvYXQpIDogVm9pZCB7CisgICAgICAgIFdyaXRlSlNPTkRvdWJsZShkdWIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cmluZyhzdHIgOiBTdHJpbmcpIDogVm9pZCB7CisgICAgICAgIFdyaXRlSlNPTlN0cmluZyggQnl0ZXNGcm9tU3RyaW5nKHN0cikpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUJpbmFyeShiaW46Qnl0ZXMpIDogVm9pZCB7CisgICAgICAgIFdyaXRlSlNPTkJhc2U2NChiaW4pOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWVzc2FnZUJlZ2luKCk6VE1lc3NhZ2UgeworICAgICAgICB2YXIgbWVzc2FnZSA6IFRNZXNzYWdlID0gbmV3IFRNZXNzYWdlKCk7CisgICAgICAgIFJlYWRKU09OQXJyYXlTdGFydCgpOworICAgICAgICBpZiAoUmVhZEpTT05JbnRlZ2VyKCkgIT0gSlNPTkNvbnN0YW50cy5WRVJTSU9OKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5CQURfVkVSU0lPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1lc3NhZ2UgY29udGFpbmVkIGJhZCB2ZXJzaW9uLiIpOworICAgICAgICB9CisKKyAgICAgICAgbWVzc2FnZS5uYW1lID0gUmVhZEpTT05TdHJpbmcoZmFsc2UpOworICAgICAgICBtZXNzYWdlLnR5cGUgPSBSZWFkSlNPTkludGVnZXIoKTsKKyAgICAgICAgbWVzc2FnZS5zZXFpZCA9IFJlYWRKU09OSW50ZWdlcigpOworICAgICAgICByZXR1cm4gbWVzc2FnZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1lc3NhZ2VFbmQoKSA6IFZvaWQgeworICAgICAgICBSZWFkSlNPTkFycmF5RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJ1Y3RCZWdpbigpOlRTdHJ1Y3QgeworICAgICAgICBSZWFkSlNPTk9iamVjdFN0YXJ0KCk7CisgICAgICAgIHJldHVybiBuZXcgVFN0cnVjdCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RydWN0RW5kKCkgOiBWb2lkIHsKKyAgICAgICAgUmVhZEpTT05PYmplY3RFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEZpZWxkQmVnaW4oKSA6IFRGaWVsZCB7CisgICAgICAgIHZhciBmaWVsZCA6IFRGaWVsZCA9IG5ldyBURmllbGQoKTsKKyAgICAgICAgdmFyIGNoID0gcmVhZGVyLlBlZWsoKTsKKyAgICAgICAgaWYgKFN0cmluZ0Zyb21CeXRlcyhjaCkgPT0gSlNPTkNvbnN0YW50cy5SQlJBQ0UpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZpZWxkLnR5cGUgPSBUVHlwZS5TVE9QOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZmllbGQuaWQgPSBSZWFkSlNPTkludGVnZXIoKTsKKyAgICAgICAgICAgIFJlYWRKU09OT2JqZWN0U3RhcnQoKTsKKyAgICAgICAgICAgIGZpZWxkLnR5cGUgPSBKU09OQ29uc3RhbnRzLkdldFR5cGVJREZvclR5cGVOYW1lKCBSZWFkSlNPTlN0cmluZyhmYWxzZSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmaWVsZDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEZpZWxkRW5kKCkgOiBWb2lkIHsKKyAgICAgICAgUmVhZEpTT05PYmplY3RFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1hcEJlZ2luKCkgOiBUTWFwIHsKKyAgICAgICAgUmVhZEpTT05BcnJheVN0YXJ0KCk7CisgICAgICAgIHZhciBLZXlUeXBlID0gSlNPTkNvbnN0YW50cy5HZXRUeXBlSURGb3JUeXBlTmFtZSggUmVhZEpTT05TdHJpbmcoZmFsc2UpKTsKKyAgICAgICAgdmFyIFZhbHVlVHlwZSA9IEpTT05Db25zdGFudHMuR2V0VHlwZUlERm9yVHlwZU5hbWUoIFJlYWRKU09OU3RyaW5nKGZhbHNlKSk7CisgICAgICAgIHZhciBDb3VudCA6IEludCA9IFJlYWRKU09OSW50ZWdlcigpOworICAgICAgICBSZWFkSlNPTk9iamVjdFN0YXJ0KCk7CisKKyAgICAgICAgdmFyIG1hcCA9IG5ldyBUTWFwKCBLZXlUeXBlLCBWYWx1ZVR5cGUsIENvdW50KTsKKyAgICAgICAgcmV0dXJuIG1hcDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1hcEVuZCgpIDogVm9pZCB7CisgICAgICAgIFJlYWRKU09OT2JqZWN0RW5kKCk7CisgICAgICAgIFJlYWRKU09OQXJyYXlFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZExpc3RCZWdpbigpOlRMaXN0IHsKKyAgICAgICAgUmVhZEpTT05BcnJheVN0YXJ0KCk7CisgICAgICAgIHZhciBFbGVtZW50VHlwZSA9IEpTT05Db25zdGFudHMuR2V0VHlwZUlERm9yVHlwZU5hbWUoIFJlYWRKU09OU3RyaW5nKGZhbHNlKSk7CisgICAgICAgIHZhciBDb3VudCA6IEludCA9IFJlYWRKU09OSW50ZWdlcigpOworCisgICAgICAgIHZhciBsaXN0ID0gbmV3IFRMaXN0KCBFbGVtZW50VHlwZSwgQ291bnQpOworICAgICAgICByZXR1cm4gbGlzdDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZExpc3RFbmQoKSA6IFZvaWQgeworICAgICAgICBSZWFkSlNPTkFycmF5RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTZXRCZWdpbigpIDogVFNldCB7CisgICAgICAgIFJlYWRKU09OQXJyYXlTdGFydCgpOworICAgICAgICB2YXIgRWxlbWVudFR5cGUgPSBKU09OQ29uc3RhbnRzLkdldFR5cGVJREZvclR5cGVOYW1lKCBSZWFkSlNPTlN0cmluZyhmYWxzZSkpOworICAgICAgICB2YXIgQ291bnQgOiBJbnQgPSBSZWFkSlNPTkludGVnZXIoKTsKKworICAgICAgICB2YXIgc2V0ID0gbmV3IFRTZXQoIEVsZW1lbnRUeXBlLCBDb3VudCk7CisgICAgICAgIHJldHVybiBzZXQ7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTZXRFbmQoKSA6IFZvaWQgeworICAgICAgICBSZWFkSlNPTkFycmF5RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRCb29sKCkgOiBCb29sIHsKKyAgICAgICAgcmV0dXJuIChSZWFkSlNPTkludGVnZXIoKSAhPSAwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEJ5dGUoKSA6IEludCB7CisgICAgICAgIHJldHVybiBSZWFkSlNPTkludGVnZXIoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEkxNigpIDogSW50IHsKKyAgICAgICAgcmV0dXJuIFJlYWRKU09OSW50ZWdlcigpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkSTMyKCkgOiBJbnQgeworICAgICAgICByZXR1cm4gUmVhZEpTT05JbnRlZ2VyKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRJNjQoKSA6IGhheGUuSW50NjQgeworICAgICAgICByZXR1cm4gUmVhZEpTT05JbnQ2NCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkRG91YmxlKCk6RmxvYXQgeworICAgICAgICByZXR1cm4gUmVhZEpTT05Eb3VibGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cmluZygpIDogU3RyaW5nIHsKKyAgICAgICAgcmV0dXJuIFJlYWRKU09OU3RyaW5nKGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEJpbmFyeSgpIDogQnl0ZXMgeworICAgICAgICByZXR1cm4gUmVhZEpTT05CYXNlNjQoKTsKKyAgICB9CisKKyAgICAvLyBQdXNoIGEgbmV3IEpTT04gY29udGV4dCBvbnRvIHRoZSBzdGFjay4KKyAgICBwcml2YXRlIGZ1bmN0aW9uICBQdXNoQ29udGV4dChjIDogSlNPTkJhc2VDb250ZXh0KSA6IFZvaWQgeworICAgICAgICBjb250ZXh0U3RhY2suYWRkKGNvbnRleHQpOworICAgICAgICBjb250ZXh0ID0gYzsKKyAgICB9CisKKyAgICAvLyBQb3AgdGhlIGxhc3QgSlNPTiBjb250ZXh0IG9mZiB0aGUgc3RhY2sKKyAgICBwcml2YXRlIGZ1bmN0aW9uICBQb3BDb250ZXh0KCkgOiBWb2lkIHsKKyAgICAgICAgY29udGV4dCA9IGNvbnRleHRTdGFjay5wb3AoKTsKKyAgICB9CisKKworICAgIC8vIFdyaXRlIHRoZSBieXRlcyBpbiBhcnJheSBidWYgYXMgYSBKU09OIGNoYXJhY3RlcnMsIGVzY2FwaW5nIGFzIG5lZWRlZAorICAgIHByaXZhdGUgZnVuY3Rpb24gV3JpdGVKU09OU3RyaW5nKCBiIDogQnl0ZXMpIDogVm9pZCB7CisgICAgICAgIGNvbnRleHQuV3JpdGUoKTsKKworICAgICAgICB2YXIgdG1wID0gQnl0ZXNGcm9tU3RyaW5nKCBKU09OQ29uc3RhbnRzLlFVT1RFKTsKKyAgICAgICAgdHJhbnMud3JpdGUoIHRtcCwgMCwgdG1wLmxlbmd0aCk7CisKKyAgICAgICAgZm9yIChpIGluIDAgLi4uIGIubGVuZ3RoKSB7CisgICAgICAgICAgICB2YXIgdmFsdWUgPSBiLmdldChpKTsKKworICAgICAgICAgICAgaWYgKCh2YWx1ZSAmIDB4MDBGRikgPj0gMHgzMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoU3RyaW5nLmZyb21DaGFyQ29kZSh2YWx1ZSkgPT0gSlNPTkNvbnN0YW50cy5CQUNLU0xBU0guY2hhckF0KDApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdG1wID0gQnl0ZXNGcm9tU3RyaW5nKCBKU09OQ29uc3RhbnRzLkJBQ0tTTEFTSCArIEpTT05Db25zdGFudHMuQkFDS1NMQVNIKTsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnMud3JpdGUoIHRtcCwgMCwgdG1wLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRyYW5zLndyaXRlKCBiLCBpLCAxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIG51bSA9IEpTT05Db25zdGFudHMuSlNPTl9DSEFSX1RBQkxFW3ZhbHVlXTsKKyAgICAgICAgICAgICAgICBpZiAobnVtID09IDEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0cmFucy53cml0ZSggYiwgaSwgMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKG51bSA+IDEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgYnVmID0gbmV3IEJ5dGVzQnVmZmVyKCk7CisgICAgICAgICAgICAgICAgICAgIGJ1Zi5hZGRTdHJpbmcoIEpTT05Db25zdGFudHMuQkFDS1NMQVNIKTsKKyAgICAgICAgICAgICAgICAgICAgYnVmLmFkZEJ5dGUoIG51bSk7CisgICAgICAgICAgICAgICAgICAgIHRtcCA9IGJ1Zi5nZXRCeXRlcygpOworICAgICAgICAgICAgICAgICAgICB0cmFucy53cml0ZSggdG1wLCAwLCB0bXAubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGJ1ZiA9IG5ldyBCeXRlc0J1ZmZlcigpOworICAgICAgICAgICAgICAgICAgICBidWYuYWRkU3RyaW5nKCBKU09OQ29uc3RhbnRzLkVTQ1NFUSk7CisgICAgICAgICAgICAgICAgICAgIGJ1Zi5hZGRTdHJpbmcoIEhleENoYXIoICh2YWx1ZSAmIDB4RkYwMDAwMDApID4+IDEyKSk7CisgICAgICAgICAgICAgICAgICAgIGJ1Zi5hZGRTdHJpbmcoIEhleENoYXIoICh2YWx1ZSAmIDB4MDBGRjAwMDApID4+IDgpKTsKKyAgICAgICAgICAgICAgICAgICAgYnVmLmFkZFN0cmluZyggSGV4Q2hhciggKHZhbHVlICYgMHgwMDAwRkYwMCkgPj4gNCkpOworICAgICAgICAgICAgICAgICAgICBidWYuYWRkU3RyaW5nKCBIZXhDaGFyKCB2YWx1ZSAmIDB4MDAwMDAwRkYpKTsKKyAgICAgICAgICAgICAgICAgICAgdG1wID0gYnVmLmdldEJ5dGVzKCk7CisgICAgICAgICAgICAgICAgICAgIHRyYW5zLndyaXRlKCB0bXAsIDAsIHRtcC5sZW5ndGgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHRtcCA9IEJ5dGVzRnJvbVN0cmluZyggSlNPTkNvbnN0YW50cy5RVU9URSk7CisgICAgICAgIHRyYW5zLndyaXRlKCB0bXAsIDAsIHRtcC5sZW5ndGgpOworICAgIH0KKworICAgIC8vIFdyaXRlIG91dCBudW1iZXIgYXMgYSBKU09OIHZhbHVlLiBJZiB0aGUgY29udGV4dCBkaWN0YXRlcyBzbywKKyAgICAvLyBpdCB3aWxsIGJlIHdyYXBwZWQgaW4gcXVvdGVzIHRvIG91dHB1dCBhcyBhIEpTT04gc3RyaW5nLgorICAgIHByaXZhdGUgZnVuY3Rpb24gV3JpdGVKU09OSW50ZWdlciggbnVtIDogSW50KSA6IFZvaWQgeworICAgICAgICBjb250ZXh0LldyaXRlKCk7CisKKyAgICAgICAgdmFyIHN0ciA6IFN0cmluZyA9ICIiOworICAgICAgICB2YXIgZXNjYXBlTnVtIDogQm9vbCA9IGNvbnRleHQuRXNjYXBlTnVtYmVycygpOworCisgICAgICAgIGlmIChlc2NhcGVOdW0pIHsKKyAgICAgICAgICAgIHN0ciArPSBKU09OQ29uc3RhbnRzLlFVT1RFOworICAgICAgICB9CisKKyAgICAgICAgc3RyICs9IFN0ZC5zdHJpbmcobnVtKTsKKworICAgICAgICBpZiAoZXNjYXBlTnVtKSB7CisgICAgICAgICAgICBzdHIgKz0gSlNPTkNvbnN0YW50cy5RVU9URTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciB0bXAgPSBCeXRlc0Zyb21TdHJpbmcoIHN0cik7CisgICAgICAgIHRyYW5zLndyaXRlKCB0bXAsIDAsIHRtcC5sZW5ndGgpOworICAgIH0KKworICAgIC8vIFdyaXRlIG91dCBudW1iZXIgYXMgYSBKU09OIHZhbHVlLiBJZiB0aGUgY29udGV4dCBkaWN0YXRlcyBzbywKKyAgICAvLyBpdCB3aWxsIGJlIHdyYXBwZWQgaW4gcXVvdGVzIHRvIG91dHB1dCBhcyBhIEpTT04gc3RyaW5nLgorICAgIHByaXZhdGUgZnVuY3Rpb24gV3JpdGVKU09OSW50NjQoIG51bSA6IEludDY0KSA6IFZvaWQgeworICAgICAgICBjb250ZXh0LldyaXRlKCk7CisKKyAgICAgICAgdmFyIHN0ciA6IFN0cmluZyA9ICIiOworICAgICAgICB2YXIgZXNjYXBlTnVtIDogQm9vbCA9IGNvbnRleHQuRXNjYXBlTnVtYmVycygpOworCisgICAgICAgIGlmIChlc2NhcGVOdW0pIHsKKyAgICAgICAgICAgIHN0ciArPSBKU09OQ29uc3RhbnRzLlFVT1RFOworICAgICAgICB9CisKKyAgICAgICAgc3RyICs9IFN0ZC5zdHJpbmcobnVtKTsKKworICAgICAgICBpZiAoZXNjYXBlTnVtKSB7CisgICAgICAgICAgICBzdHIgKz0gSlNPTkNvbnN0YW50cy5RVU9URTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciB0bXAgPSBCeXRlc0Zyb21TdHJpbmcoIHN0cik7CisgICAgICAgIHRyYW5zLndyaXRlKCB0bXAsIDAsIHRtcC5sZW5ndGgpOworICAgIH0KKworICAgIC8vIFdyaXRlIG91dCBhIGRvdWJsZSBhcyBhIEpTT04gdmFsdWUuIElmIGl0IGlzIE5hTiBvciBpbmZpbml0eSBvciBpZiB0aGUKKyAgICAvLyBjb250ZXh0IGRpY3RhdGVzIGVzY2FwaW5nLCBXcml0ZSBvdXQgYXMgSlNPTiBzdHJpbmcuCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBXcml0ZUpTT05Eb3VibGUobnVtIDogRmxvYXQpIDogVm9pZCB7CisgICAgICAgIGNvbnRleHQuV3JpdGUoKTsKKworCisgICAgICAgIHZhciBzcGVjaWFsIDogQm9vbCA9IGZhbHNlOworICAgICAgICB2YXIgcmVuZGVyZWQgOiBTdHJpbmcgPSAiIjsKKyAgICAgICAgaWYoIE1hdGguaXNOYU4obnVtKSkgeworICAgICAgICAgICAgc3BlY2lhbCA9IHRydWU7CisgICAgICAgICAgICByZW5kZXJlZCA9IEpTT05Db25zdGFudHMuRkxPQVRfSVNfTkFOOworICAgICAgICB9IGVsc2UgaWYgKCEgTWF0aC5pc0Zpbml0ZShudW0pKSB7CisgICAgICAgICAgICBzcGVjaWFsID0gdHJ1ZTsKKyAgICAgICAgICAgIGlmKCBudW0gPiAwKSB7CisgICAgICAgICAgICAgICAgcmVuZGVyZWQgPSBKU09OQ29uc3RhbnRzLkZMT0FUX0lTX1BPU19JTkY7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlbmRlcmVkID0gSlNPTkNvbnN0YW50cy5GTE9BVF9JU19ORUdfSU5GOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVuZGVyZWQgPSBTdGQuc3RyaW5nKG51bSk7ICAvLyBwbGFpbiBhbmQgc2ltcGxlIGZsb2F0IG51bWJlcgorICAgICAgICB9CisKKyAgICAgICAgLy8gY29tcG9zZSBvdXRwdXQKKyAgICAgICAgdmFyIGVzY2FwZU51bSA6IEJvb2wgPSBzcGVjaWFsIHx8IGNvbnRleHQuRXNjYXBlTnVtYmVycygpOworICAgICAgICB2YXIgc3RyIDogU3RyaW5nID0gIiI7CisgICAgICAgIGlmIChlc2NhcGVOdW0pIHsKKyAgICAgICAgICAgIHN0ciArPSBKU09OQ29uc3RhbnRzLlFVT1RFOworICAgICAgICB9CisgICAgICAgIHN0ciArPSByZW5kZXJlZDsKKyAgICAgICAgaWYgKGVzY2FwZU51bSkgeworICAgICAgICAgICAgc3RyICs9IEpTT05Db25zdGFudHMuUVVPVEU7CisgICAgICAgIH0KKworICAgICAgICB2YXIgdG1wID0gQnl0ZXNGcm9tU3RyaW5nKCBzdHIpOworICAgICAgICB0cmFucy53cml0ZSggdG1wLCAwLCB0bXAubGVuZ3RoKTsKKyAgICB9CisKKyAgICAvLyBXcml0ZSBvdXQgY29udGVudHMgb2YgYnl0ZSBhcnJheSBiIGFzIGEgSlNPTiBzdHJpbmcgd2l0aCBiYXNlLTY0IGVuY29kZWQgZGF0YQorICAgIHByaXZhdGUgZnVuY3Rpb24gV3JpdGVKU09OQmFzZTY0KCBiIDogQnl0ZXMpIDogVm9pZCB7CisgICAgICAgIGNvbnRleHQuV3JpdGUoKTsKKworICAgICAgICB2YXIgYnVmID0gbmV3IEJ5dGVzQnVmZmVyKCk7CisgICAgICAgIGJ1Zi5hZGRTdHJpbmcoIEpTT05Db25zdGFudHMuUVVPVEUpOworICAgICAgICBidWYuYWRkU3RyaW5nKCBCYXNlNjQuZW5jb2RlKGIpKTsKKyAgICAgICAgYnVmLmFkZFN0cmluZyggSlNPTkNvbnN0YW50cy5RVU9URSk7CisKKyAgICAgICAgdmFyIHRtcCA9IGJ1Zi5nZXRCeXRlcygpOworICAgICAgICB0cmFucy53cml0ZSggdG1wLCAwLCB0bXAubGVuZ3RoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIFdyaXRlSlNPTk9iamVjdFN0YXJ0KCkgOiBWb2lkIHsKKyAgICAgICAgY29udGV4dC5Xcml0ZSgpOworICAgICAgICB2YXIgdG1wID0gQnl0ZXNGcm9tU3RyaW5nKCBKU09OQ29uc3RhbnRzLkxCUkFDRSk7CisgICAgICAgIHRyYW5zLndyaXRlKCB0bXAsIDAsIHRtcC5sZW5ndGgpOworICAgICAgICBQdXNoQ29udGV4dCggbmV3IEpTT05QYWlyQ29udGV4dCh0aGlzKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBXcml0ZUpTT05PYmplY3RFbmQoKSA6IFZvaWQgeworICAgICAgICBQb3BDb250ZXh0KCk7CisgICAgICAgIHZhciB0bXAgPSBCeXRlc0Zyb21TdHJpbmcoIEpTT05Db25zdGFudHMuUkJSQUNFKTsKKyAgICAgICAgdHJhbnMud3JpdGUoIHRtcCwgMCwgdG1wLmxlbmd0aCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBXcml0ZUpTT05BcnJheVN0YXJ0KCkgOiBWb2lkIHsKKyAgICAgICAgY29udGV4dC5Xcml0ZSgpOworICAgICAgICB2YXIgdG1wID0gQnl0ZXNGcm9tU3RyaW5nKCBKU09OQ29uc3RhbnRzLkxCUkFDS0VUKTsKKyAgICAgICAgdHJhbnMud3JpdGUoIHRtcCwgMCwgdG1wLmxlbmd0aCk7CisgICAgICAgIFB1c2hDb250ZXh0KCBuZXcgSlNPTkxpc3RDb250ZXh0KHRoaXMpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIFdyaXRlSlNPTkFycmF5RW5kKCkgOiBWb2lkIHsKKyAgICAgICAgUG9wQ29udGV4dCgpOworICAgICAgICB2YXIgdG1wID0gQnl0ZXNGcm9tU3RyaW5nKCBKU09OQ29uc3RhbnRzLlJCUkFDS0VUKTsKKyAgICAgICAgdHJhbnMud3JpdGUoIHRtcCwgMCwgdG1wLmxlbmd0aCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZWFkaW5nIG1ldGhvZHMuCisgICAgICovCisKKyAgICAvLyBSZWFkIGEgYnl0ZSB0aGF0IG11c3QgbWF0Y2ggY2hhciwgb3RoZXJ3aXNlIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24uCisgICAgcHVibGljIGZ1bmN0aW9uIFJlYWRKU09OU3ludGF4Q2hhciggY2hhciA6IFN0cmluZykgOiBWb2lkIHsKKyAgICAgICAgdmFyIGIgPSBCeXRlc0Zyb21TdHJpbmcoIGNoYXIpOworCisgICAgICAgIHZhciBjaCA9IHJlYWRlci5SZWFkKCk7CisgICAgICAgIGlmIChjaC5nZXQoMCkgIT0gYi5nZXQoMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1VuZXhwZWN0ZWQgY2hhcmFjdGVyOiAkY2gnKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFJlYWQgaW4gYSBKU09OIHN0cmluZywgdW5lc2NhcGluZyBhcyBhcHByb3ByaWF0ZS4KKyAgICAvLyBTa2lwIFJlYWRpbmcgZnJvbSB0aGUgY29udGV4dCBpZiBza2lwQ29udGV4dCBpcyB0cnVlLgorICAgIHByaXZhdGUgZnVuY3Rpb24gUmVhZEpTT05TdHJpbmcoc2tpcENvbnRleHQgOiBCb29sKSA6IFN0cmluZworICAgIHsKKyAgICAgICAgaWYgKCFza2lwQ29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgY29udGV4dC5SZWFkKCk7CisgICAgICAgIH0KKworICAgICAgICB2YXIgYnVmZmVyIDogQnl0ZXNCdWZmZXIgPSBuZXcgQnl0ZXNCdWZmZXIoKTsKKworICAgICAgICBSZWFkSlNPTlN5bnRheENoYXIoIEpTT05Db25zdGFudHMuUVVPVEUpOworICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGNoID0gcmVhZGVyLlJlYWQoKTsKKworICAgICAgICAgICAgLy8gZW5kIG9mIHN0cmluZz8KKyAgICAgICAgICAgIGlmIChTdHJpbmdGcm9tQnl0ZXMoY2gpID09IEpTT05Db25zdGFudHMuUVVPVEUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGVzY2FwZWQ/CisgICAgICAgICAgICBpZiAoU3RyaW5nRnJvbUJ5dGVzKGNoKSAhPSBKU09OQ29uc3RhbnRzLkVTQ1NFUS5jaGFyQXQoMCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnVmZmVyLmFkZEJ5dGUoIGNoLmdldCgwKSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGRpc3Rpbmd1aXNoIGJldHdlZW4gXHVYWFhYIChoZXggdW5pY29kZSkgYW5kIFxYIChjb250cm9sIGNoYXJzKQorICAgICAgICAgICAgY2ggPSByZWFkZXIuUmVhZCgpOworICAgICAgICAgICAgaWYgKFN0cmluZ0Zyb21CeXRlcyhjaCkgIT0gSlNPTkNvbnN0YW50cy5FU0NTRVEuY2hhckF0KDEpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IEpTT05Db25zdGFudHMuRVNDQVBFX0NIQVJTX1RPX1ZBTFVFU1tjaC5nZXQoMCldOworICAgICAgICAgICAgICAgIGlmKCB2YWx1ZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbiggVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwgIkV4cGVjdGVkIGNvbnRyb2wgY2hhciIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBidWZmZXIuYWRkQnl0ZSggdmFsdWUpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIC8vIGl0J3MgXHVYWFhYCisgICAgICAgICAgICB2YXIgaGV4YnVmID0gbmV3IEJ5dGVzQnVmZmVyKCk7CisgICAgICAgICAgICB2YXIgaGV4bGVuID0gdHJhbnMucmVhZEFsbCggaGV4YnVmLCAwLCA0KTsKKyAgICAgICAgICAgIGlmKCBoZXhsZW4gIT0gNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCBUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLCAiTm90IGVub3VnaCBkYXRhIGZvciBcXHVOTk5OIHNlcXVlbmNlIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBoZXhkaWdpdHMgPSBoZXhidWYuZ2V0Qnl0ZXMoKTsKKyAgICAgICAgICAgIHZhciBjaGFyY29kZSA9IDA7CisgICAgICAgICAgICBjaGFyY29kZSA9IChjaGFyY29kZSA8PCA0KSArIEhleFZhbCggU3RyaW5nLmZyb21DaGFyQ29kZShoZXhkaWdpdHMuZ2V0KDApKSk7CisgICAgICAgICAgICBjaGFyY29kZSA9IChjaGFyY29kZSA8PCA0KSArIEhleFZhbCggU3RyaW5nLmZyb21DaGFyQ29kZShoZXhkaWdpdHMuZ2V0KDEpKSk7CisgICAgICAgICAgICBjaGFyY29kZSA9IChjaGFyY29kZSA8PCA0KSArIEhleFZhbCggU3RyaW5nLmZyb21DaGFyQ29kZShoZXhkaWdpdHMuZ2V0KDIpKSk7CisgICAgICAgICAgICBjaGFyY29kZSA9IChjaGFyY29kZSA8PCA0KSArIEhleFZhbCggU3RyaW5nLmZyb21DaGFyQ29kZShoZXhkaWdpdHMuZ2V0KDMpKSk7CisgICAgICAgICAgICBidWZmZXIuYWRkU3RyaW5nKCBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoYXJjb2RlKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gU3RyaW5nRnJvbUJ5dGVzKCBidWZmZXIuZ2V0Qnl0ZXMoKSk7CisgICAgfQorCisgICAgLy8gUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIGJ5dGUgY291bGQgYmUgYSB2YWxpZCBwYXJ0IG9mIGEgSlNPTiBudW1iZXIuCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBJc0pTT05OdW1lcmljKGIgOiBJbnQpIDogQm9vbCB7CisgICAgICAgIHN3aXRjaCAoYikKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSAiKyIuY29kZTogIHJldHVybiB0cnVlOworICAgICAgICAgICAgY2FzZSAiLSIuY29kZTogIHJldHVybiB0cnVlOworICAgICAgICAgICAgY2FzZSAiLiIuY29kZTogIHJldHVybiB0cnVlOworICAgICAgICAgICAgY2FzZSAiMCIuY29kZTogIHJldHVybiB0cnVlOworICAgICAgICAgICAgY2FzZSAiMSIuY29kZTogIHJldHVybiB0cnVlOworICAgICAgICAgICAgY2FzZSAiMiIuY29kZTogIHJldHVybiB0cnVlOworICAgICAgICAgICAgY2FzZSAiMyIuY29kZTogIHJldHVybiB0cnVlOworICAgICAgICAgICAgY2FzZSAiNCIuY29kZTogIHJldHVybiB0cnVlOworICAgICAgICAgICAgY2FzZSAiNSIuY29kZTogIHJldHVybiB0cnVlOworICAgICAgICAgICAgY2FzZSAiNiIuY29kZTogIHJldHVybiB0cnVlOworICAgICAgICAgICAgY2FzZSAiNyIuY29kZTogIHJldHVybiB0cnVlOworICAgICAgICAgICAgY2FzZSAiOCIuY29kZTogIHJldHVybiB0cnVlOworICAgICAgICAgICAgY2FzZSAiOSIuY29kZTogIHJldHVybiB0cnVlOworICAgICAgICAgICAgY2FzZSAiRSIuY29kZTogIHJldHVybiB0cnVlOworICAgICAgICAgICAgY2FzZSAiZSIuY29kZTogIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBSZWFkIGluIGEgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyB0aGF0IGFyZSBhbGwgdmFsaWQgaW4gSlNPTiBudW1iZXJzLiBEb2VzCisgICAgLy8gbm90IGRvIGEgY29tcGxldGUgcmVnZXggY2hlY2sgdG8gdmFsaWRhdGUgdGhhdCB0aGlzIGlzIGFjdHVhbGx5IGEgbnVtYmVyLgorICAgIHByaXZhdGUgZnVuY3Rpb24gUmVhZEpTT05OdW1lcmljQ2hhcnMoKSA6IFN0cmluZworICAgIHsKKyAgICAgICAgdmFyIGJ1ZmZlciA6IEJ5dGVzQnVmZmVyID0gbmV3IEJ5dGVzQnVmZmVyKCk7CisgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgY2ggPSByZWFkZXIuUGVlaygpOworICAgICAgICAgICAgaWYoICEgSXNKU09OTnVtZXJpYyggY2guZ2V0KDApKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ1ZmZlci5hZGRCeXRlKCByZWFkZXIuUmVhZCgpLmdldCgwKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFN0cmluZ0Zyb21CeXRlcyggYnVmZmVyLmdldEJ5dGVzKCkpOworICAgIH0KKworICAgIC8vIFJlYWQgaW4gYSBKU09OIG51bWJlci4gSWYgdGhlIGNvbnRleHQgZGljdGF0ZXMsIFJlYWQgaW4gZW5jbG9zaW5nIHF1b3Rlcy4KKyAgICBwcml2YXRlIGZ1bmN0aW9uIFJlYWRKU09OSW50ZWdlcigpIDogSW50IHsKKyAgICAgICAgY29udGV4dC5SZWFkKCk7CisKKyAgICAgICAgaWYgKGNvbnRleHQuRXNjYXBlTnVtYmVycygpKSB7CisgICAgICAgICAgICBSZWFkSlNPTlN5bnRheENoYXIoIEpTT05Db25zdGFudHMuUVVPVEUpOworICAgICAgICB9CisKKyAgICAgICAgdmFyIHN0ciA6IFN0cmluZyA9IFJlYWRKU09OTnVtZXJpY0NoYXJzKCk7CisKKyAgICAgICAgaWYgKGNvbnRleHQuRXNjYXBlTnVtYmVycygpKSB7CisgICAgICAgICAgICBSZWFkSlNPTlN5bnRheENoYXIoIEpTT05Db25zdGFudHMuUVVPVEUpOworICAgICAgICB9CisKKyAgICAgICAgdmFyIHZhbHVlID0gU3RkLnBhcnNlSW50KHN0cik7CisgICAgICAgIGlmKCB2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsICdCYWQgbnVtZXJpYyBkYXRhOiAkc3RyJyk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgLy8gUmVhZCBpbiBhIEpTT04gbnVtYmVyLiBJZiB0aGUgY29udGV4dCBkaWN0YXRlcywgUmVhZCBpbiBlbmNsb3NpbmcgcXVvdGVzLgorICAgIHByaXZhdGUgZnVuY3Rpb24gUmVhZEpTT05JbnQ2NCgpIDogaGF4ZS5JbnQ2NCB7CisgICAgICAgIGNvbnRleHQuUmVhZCgpOworCisgICAgICAgIGlmIChjb250ZXh0LkVzY2FwZU51bWJlcnMoKSkgeworICAgICAgICAgICAgUmVhZEpTT05TeW50YXhDaGFyKCBKU09OQ29uc3RhbnRzLlFVT1RFKTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBzdHIgOiBTdHJpbmcgPSBSZWFkSlNPTk51bWVyaWNDaGFycygpOworICAgICAgICBpZiggc3RyLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsICdCYWQgbnVtZXJpYyBkYXRhOiAkc3RyJyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY29udGV4dC5Fc2NhcGVOdW1iZXJzKCkpIHsKKyAgICAgICAgICAgIFJlYWRKU09OU3ludGF4Q2hhciggSlNPTkNvbnN0YW50cy5RVU9URSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBwcm9jZXNzIHNpZ24KKyAgICAgICAgdmFyIGJNaW51cyA9IGZhbHNlOworICAgICAgICB2YXIgc3RhcnRBdCA9IDA7CisgICAgICAgIGlmKCAoc3RyLmNoYXJBdCgwKSA9PSAiKyIpIHx8IChzdHIuY2hhckF0KDApID09ICItIikpIHsKKyAgICAgICAgICAgIGJNaW51cyA9IChzdHIuY2hhckF0KDApID09ICItIik7CisgICAgICAgICAgICBzdGFydEF0Kys7CisgICAgICAgIH0KKworICAgICAgICAvLyBwcm9jZXNzIGRpZ2l0cworICAgICAgICB2YXIgdmFsdWUgOiBJbnQ2NCA9IEludDY0Lm1ha2UoMCwwKTsKKyAgICAgICAgdmFyIGJHb3REaWdpdHMgPSBmYWxzZTsKKyAgICAgICAgZm9yKCBpIGluIHN0YXJ0QXQgLi4uIHN0ci5sZW5ndGgpIHsKKyAgICAgICAgICAgIHZhciBjaCA9IHN0ci5jaGFyQXQoaSk7CisgICAgICAgICAgICB2YXIgZGlnaXQgPSBKU09OQ29uc3RhbnRzLkRFQ0lNQUxfRElHSVRTW2NoXTsKKyAgICAgICAgICAgIGlmKCBkaWdpdCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLCAnQmFkIG51bWVyaWMgZGF0YTogJHN0cicpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYkdvdERpZ2l0cyA9IHRydWU7CisKKyAgICAgICAgICAgIC8vIHRoZXNlIGFyZSBkZWNpbWFsIGRpZ2l0cworICAgICAgICAgICAgdmFsdWUgPSBJbnQ2NC5tdWwoIHZhbHVlLCBJbnQ2NC5tYWtlKDAsMTApKTsKKyAgICAgICAgICAgIHZhbHVlID0gSW50NjQuYWRkKCB2YWx1ZSwgSW50NjQubWFrZSgwLGRpZ2l0KSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBwcm9jZXNzIHBlbmRpbmcgbWludXMgc2lnbiwgaWYgYXBwbGljYWJsZQorICAgICAgICAvLyB0aGlzIHNob3VsZCBhbHNvIGhhbmRsZSB0aGUgZWRnZSBjYXNlIE1JTl9JTlQ2NCBjb3JyZWN0bHkKKyAgICAgICAgaWYoIGJNaW51cyAmJiAoSW50NjQuY29tcGFyZSh2YWx1ZSxJbnQ2NC5tYWtlKDAsMCkpID4gMCkpIHsKKyAgICAgICAgICAgIHZhbHVlID0gSW50NjQubmVnKCB2YWx1ZSk7CisgICAgICAgICAgICBiTWludXMgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCAhIGJHb3REaWdpdHMpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwgJ0JhZCBudW1lcmljIGRhdGE6ICRzdHInKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICAvLyBSZWFkIGluIGEgSlNPTiBkb3VibGUgdmFsdWUuIFRocm93IGlmIHRoZSB2YWx1ZSBpcyBub3Qgd3JhcHBlZCBpbiBxdW90ZXMKKyAgICAvLyB3aGVuIGV4cGVjdGVkIG9yIGlmIHdyYXBwZWQgaW4gcXVvdGVzIHdoZW4gbm90IGV4cGVjdGVkLgorICAgIHByaXZhdGUgZnVuY3Rpb24gUmVhZEpTT05Eb3VibGUoKSA6IEZsb2F0IHsKKyAgICAgICAgY29udGV4dC5SZWFkKCk7CisKKyAgICAgICAgdmFyIHN0ciA6IFN0cmluZyA9ICIiOworICAgICAgICBpZiAoU3RyaW5nRnJvbUJ5dGVzKHJlYWRlci5QZWVrKCkpID09IEpTT05Db25zdGFudHMuUVVPVEUpIHsKKyAgICAgICAgICAgIHN0ciA9IFJlYWRKU09OU3RyaW5nKHRydWUpOworCisgICAgICAgICAgICAvLyBzcGVjaWFsIGNhc2VzCisgICAgICAgICAgICBpZiggc3RyID09IEpTT05Db25zdGFudHMuRkxPQVRfSVNfTkFOKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE1hdGguTmFOOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoIHN0ciA9PSBKU09OQ29uc3RhbnRzLkZMT0FUX0lTX1BPU19JTkYpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTWF0aC5QT1NJVElWRV9JTkZJTklUWTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCBzdHIgPT0gSlNPTkNvbnN0YW50cy5GTE9BVF9JU19ORUdfSU5GKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE1hdGguTkVHQVRJVkVfSU5GSU5JVFk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKCAhIGNvbnRleHQuRXNjYXBlTnVtYmVycygpKSAgICB7CisgICAgICAgICAgICAgICAgLy8gdGhyb3cgLSB3ZSBzaG91bGQgbm90IGJlIGluIGEgc3RyaW5nIGluIHRoaXMgY2FzZQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwgIk51bWVyaWMgZGF0YSB1bmV4cGVjdGVkbHkgcXVvdGVkIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiggY29udGV4dC5Fc2NhcGVOdW1iZXJzKCkpICAgIHsKKyAgICAgICAgICAgICAgICAvLyBUaGlzIHdpbGwgdGhyb3cgLSB3ZSBzaG91bGQgaGF2ZSBoYWQgYSBxdW90ZSBpZiBFc2NhcGVOdW1iZXJzKCkgPT0gdHJ1ZQorICAgICAgICAgICAgICAgIFJlYWRKU09OU3ludGF4Q2hhciggSlNPTkNvbnN0YW50cy5RVU9URSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0ciA9IFJlYWRKU09OTnVtZXJpY0NoYXJzKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBwYXJzZSBhbmQgY2hlY2sgLSB3ZSBzaG91bGQgaGF2ZSBhdCBsZWFzdCBvbmUgdmFsaWQgZGlnaXQKKyAgICAgICAgdmFyIGR1YiA9IFN0ZC5wYXJzZUZsb2F0KCBzdHIpOworICAgICAgICBpZiggKHN0ci5sZW5ndGggPT0gMCkgfHwgTWF0aC5pc05hTihkdWIpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsICdCYWQgbnVtZXJpYyBkYXRhOiAkc3RyJyk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZHViOworICAgIH0KKworICAgIC8vIFJlYWQgaW4gYSBKU09OIHN0cmluZyBjb250YWluaW5nIGJhc2UtNjQgZW5jb2RlZCBkYXRhIGFuZCBkZWNvZGUgaXQuCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBSZWFkSlNPTkJhc2U2NCgpIDogQnl0ZXMKKyAgICB7CisgICAgICAgIHZhciBzdHIgPSBSZWFkSlNPTlN0cmluZyhmYWxzZSk7CisgICAgICAgIHJldHVybiBCYXNlNjQuZGVjb2RlKCBzdHIpOworICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gUmVhZEpTT05PYmplY3RTdGFydCgpIDogVm9pZCB7CisgICAgICAgIGNvbnRleHQuUmVhZCgpOworICAgICAgICBSZWFkSlNPTlN5bnRheENoYXIoIEpTT05Db25zdGFudHMuTEJSQUNFKTsKKyAgICAgICAgUHVzaENvbnRleHQobmV3IEpTT05QYWlyQ29udGV4dCh0aGlzKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBSZWFkSlNPTk9iamVjdEVuZCgpIDogVm9pZCB7CisgICAgICAgIFJlYWRKU09OU3ludGF4Q2hhciggSlNPTkNvbnN0YW50cy5SQlJBQ0UpOworICAgICAgICBQb3BDb250ZXh0KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBSZWFkSlNPTkFycmF5U3RhcnQoKSA6IFZvaWQgeworICAgICAgICBjb250ZXh0LlJlYWQoKTsKKyAgICAgICAgUmVhZEpTT05TeW50YXhDaGFyKCBKU09OQ29uc3RhbnRzLkxCUkFDS0VUKTsKKyAgICAgICAgUHVzaENvbnRleHQobmV3IEpTT05MaXN0Q29udGV4dCh0aGlzKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBSZWFkSlNPTkFycmF5RW5kKCkgOiBWb2lkIHsKKyAgICAgICAgUmVhZEpTT05TeW50YXhDaGFyKCBKU09OQ29uc3RhbnRzLlJCUkFDS0VUKTsKKyAgICAgICAgUG9wQ29udGV4dCgpOworICAgIH0KKworCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBCeXRlc0Zyb21TdHJpbmcoIHN0ciA6IFN0cmluZykgOiBCeXRlcyB7CisgICAgICAgIHZhciBidWYgPSBuZXcgQnl0ZXNCdWZmZXIoKTsKKyAgICAgICAgaWYoIHV0ZjhTdHJpbmdzKQorICAgICAgICAgICAgYnVmLmFkZFN0cmluZyggc3RyKTsgIC8vIG5vIG5lZWQgdG8gZW5jb2RlIG9uIFVURjggdGFyZ2V0cywgdGhlIHN0cmluZyBpcyBqdXN0IGZpbmUKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYnVmLmFkZFN0cmluZyggVXRmOC5lbmNvZGUoIHN0cikpOworICAgICAgICByZXR1cm4gYnVmLmdldEJ5dGVzKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBTdHJpbmdGcm9tQnl0ZXMoIGJ1ZiA6IEJ5dGVzKSA6IFN0cmluZyB7CisgICAgICAgIHZhciBpbnAgPSBuZXcgQnl0ZXNJbnB1dCggYnVmKTsKKyAgICAgICAgaWYoIGJ1Zi5sZW5ndGggPT0gMCkKKyAgICAgICAgICAgIHJldHVybiAiIjsgIC8vIHJlYWRTdHJpbmcoKSB3b3VsZCByZXR1cm4gbnVsbCBpbiB0aGF0IGNhc2UsIHdoaWNoIGlzIHdyb25nCisgICAgICAgIHZhciBzdHIgPSBpbnAucmVhZFN0cmluZyggYnVmLmxlbmd0aCk7CisgICAgICAgIGlmKCB1dGY4U3RyaW5ncykKKyAgICAgICAgICAgIHJldHVybiBzdHI7ICAvLyBubyBuZWVkIHRvIGRlY29kZSBvbiBVVEY4IHRhcmdldHMsIHRoZSBzdHJpbmcgaXMganVzdCBmaW5lCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBVdGY4LmRlY29kZSggc3RyKTsKKyAgICB9CisKKyAgICAvLyBDb252ZXJ0IGEgYnl0ZSBjb250YWluaW5nIGEgaGV4IGNoYXIgKCcwJy0nOScgb3IgJ2EnLSdmJykgaW50byBpdHMgY29ycmVzcG9uZGluZyBoZXggdmFsdWUKKyAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBIZXhWYWwoY2hhciA6IFN0cmluZykgOiBJbnQgeworICAgICAgICB2YXIgdmFsdWUgPSBKU09OQ29uc3RhbnRzLkhFWF9ESUdJVFNbY2hhcl07CisgICAgICAgIGlmKCB2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsICdFeHBlY3RlZCBoZXggY2hhcmFjdGVyOiAkY2hhcicpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICAvLyBDb252ZXJ0IGEgYnl0ZSBjb250YWluaW5nIGEgaGV4IG5pYmJsZSB0byBpdHMgY29ycmVzcG9uZGluZyBoZXggY2hhcmFjdGVyCisgICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gSGV4Q2hhcihuaWJibGUgOiBJbnQpIDogU3RyaW5nCisgICAgeworICAgICAgICByZXR1cm4gIjAxMjM0NTY3ODlhYmNkZWYiLmNoYXJBdChuaWJibGUgJiAweDBGKTsKKyAgICB9CisKKworfQorCisKK0A6YWxsb3coVEpTT05Qcm90b2NvbCkKK2NsYXNzIEpTT05Db25zdGFudHMgeworICAgIHB1YmxpYyBzdGF0aWMgdmFyIENPTU1BID0gIiwiOworICAgIHB1YmxpYyBzdGF0aWMgdmFyIENPTE9OID0gIjoiOworICAgIHB1YmxpYyBzdGF0aWMgdmFyIExCUkFDRSA9ICJ7IjsKKyAgICBwdWJsaWMgc3RhdGljIHZhciBSQlJBQ0UgPSAifSI7CisgICAgcHVibGljIHN0YXRpYyB2YXIgTEJSQUNLRVQgPSAiWyI7CisgICAgcHVibGljIHN0YXRpYyB2YXIgUkJSQUNLRVQgPSAiXSI7CisgICAgcHVibGljIHN0YXRpYyB2YXIgUVVPVEUgPSAiXCIiOworICAgIHB1YmxpYyBzdGF0aWMgdmFyIEJBQ0tTTEFTSCA9ICJcXCI7CisKKyAgICBwdWJsaWMgc3RhdGljIHZhciBFU0NTRVEgPSAiXFx1IjsKKworICAgIHB1YmxpYyBzdGF0aWMgdmFyIEZMT0FUX0lTX05BTiA9ICJOYU4iOworICAgIHB1YmxpYyBzdGF0aWMgdmFyIEZMT0FUX0lTX1BPU19JTkYgPSAiSW5maW5pdHkiOworICAgIHB1YmxpYyBzdGF0aWMgdmFyIEZMT0FUX0lTX05FR19JTkYgPSAiLUluZmluaXR5IjsKKworICAgIHB1YmxpYyBzdGF0aWMgdmFyIFZFUlNJT04gPSAxOworICAgIHB1YmxpYyBzdGF0aWMgdmFyIEpTT05fQ0hBUl9UQUJMRSA9IFsKKyAgICAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgICAgICJiIi5jb2RlLCAidCIuY29kZSwgIm4iLmNvZGUsICAwLCAiZiIuY29kZSwgInIiLmNvZGUsICAwLCAgMCwKKyAgICAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgICAgICAxLCAgMSwgIlwiIi5jb2RlLCAgMSwgIDEsICAxLCAgMSwgIDEsCisgICAgICAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLAorICAgIF07CisKKyAgICBwdWJsaWMgc3RhdGljIHZhciBFU0NBUEVfQ0hBUlMgICAgID0gWyciJywnXFwnLCcvJywnYicsJ2YnLCduJywncicsJ3QnXTsKKyAgICBwdWJsaWMgc3RhdGljIHZhciBFU0NBUEVfQ0hBUlNfVE9fVkFMVUVTID0gWworICAgICAgICAiXCIiLmNvZGUgPT4gMHgyMiwKKyAgICAgICAgIlxcIi5jb2RlID0+IDB4NUMsCisgICAgICAgICIvIi5jb2RlICA9PiAweDJGLAorICAgICAgICAiYiIuY29kZSAgPT4gMHgwOCwKKyAgICAgICAgImYiLmNvZGUgID0+IDB4MEMsCisgICAgICAgICJuIi5jb2RlICA9PiAweDBBLAorICAgICAgICAiciIuY29kZSAgPT4gMHgwRCwKKyAgICAgICAgInQiLmNvZGUgID0+IDB4MDkKKyAgICBdOworCisgICAgcHVibGljIHN0YXRpYyB2YXIgREVDSU1BTF9ESUdJVFMgPSBbCisgICAgICAgICIwIiA9PiAwLAorICAgICAgICAiMSIgPT4gMSwKKyAgICAgICAgIjIiID0+IDIsCisgICAgICAgICIzIiA9PiAzLAorICAgICAgICAiNCIgPT4gNCwKKyAgICAgICAgIjUiID0+IDUsCisgICAgICAgICI2IiA9PiA2LAorICAgICAgICAiNyIgPT4gNywKKyAgICAgICAgIjgiID0+IDgsCisgICAgICAgICI5IiA9PiA5CisgICAgXTsKKworICAgIHB1YmxpYyBzdGF0aWMgdmFyIEhFWF9ESUdJVFMgPSBbCisgICAgICAgICIwIiA9PiAwLAorICAgICAgICAiMSIgPT4gMSwKKyAgICAgICAgIjIiID0+IDIsCisgICAgICAgICIzIiA9PiAzLAorICAgICAgICAiNCIgPT4gNCwKKyAgICAgICAgIjUiID0+IDUsCisgICAgICAgICI2IiA9PiA2LAorICAgICAgICAiNyIgPT4gNywKKyAgICAgICAgIjgiID0+IDgsCisgICAgICAgICI5IiA9PiA5LAorICAgICAgICAiQSIgPT4gMTAsCisgICAgICAgICJhIiA9PiAxMCwKKyAgICAgICAgIkIiID0+IDExLAorICAgICAgICAiYiIgPT4gMTEsCisgICAgICAgICJDIiA9PiAxMiwKKyAgICAgICAgImMiID0+IDEyLAorICAgICAgICAiRCIgPT4gMTMsCisgICAgICAgICJkIiA9PiAxMywKKyAgICAgICAgIkUiID0+IDE0LAorICAgICAgICAiZSIgPT4gMTQsCisgICAgICAgICJGIiA9PiAxNSwKKyAgICAgICAgImYiID0+IDE1CisgICAgXTsKKworCisgICAgcHVibGljIHN0YXRpYyB2YXIgREVGX1NUUklOR19TSVpFID0gMTY7CisKKyAgICBwdWJsaWMgc3RhdGljIHZhciBOQU1FX0JPT0wgICA9ICd0Zic7CisgICAgcHVibGljIHN0YXRpYyB2YXIgTkFNRV9CWVRFICAgPSAnaTgnOworICAgIHB1YmxpYyBzdGF0aWMgdmFyIE5BTUVfSTE2ICAgID0gJ2kxNic7CisgICAgcHVibGljIHN0YXRpYyB2YXIgTkFNRV9JMzIgICAgPSAnaTMyJzsKKyAgICBwdWJsaWMgc3RhdGljIHZhciBOQU1FX0k2NCAgICA9ICdpNjQnOworICAgIHB1YmxpYyBzdGF0aWMgdmFyIE5BTUVfRE9VQkxFID0gJ2RibCc7CisgICAgcHVibGljIHN0YXRpYyB2YXIgTkFNRV9TVFJVQ1QgPSAncmVjJzsKKyAgICBwdWJsaWMgc3RhdGljIHZhciBOQU1FX1NUUklORyA9ICdzdHInOworICAgIHB1YmxpYyBzdGF0aWMgdmFyIE5BTUVfTUFQICAgID0gJ21hcCc7CisgICAgcHVibGljIHN0YXRpYyB2YXIgTkFNRV9MSVNUICAgPSAnbHN0JzsKKyAgICBwdWJsaWMgc3RhdGljIHZhciBOQU1FX1NFVCAgICA9ICdzZXQnOworCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBHZXRUeXBlTmFtZUZvclR5cGVJRCh0eXBlSUQgOiBJbnQpIDogU3RyaW5nIHsKKyAgICAgICAgc3dpdGNoICh0eXBlSUQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgVFR5cGUuQk9PTDogICAgIHJldHVybiBOQU1FX0JPT0w7CisgICAgICAgICAgICBjYXNlIFRUeXBlLkJZVEU6ICAgICByZXR1cm4gTkFNRV9CWVRFOworICAgICAgICAgICAgY2FzZSBUVHlwZS5JMTY6ICAgICAgICAgcmV0dXJuIE5BTUVfSTE2OworICAgICAgICAgICAgY2FzZSBUVHlwZS5JMzI6ICAgICAgICAgcmV0dXJuIE5BTUVfSTMyOworICAgICAgICAgICAgY2FzZSBUVHlwZS5JNjQ6ICAgICAgICAgcmV0dXJuIE5BTUVfSTY0OworICAgICAgICAgICAgY2FzZSBUVHlwZS5ET1VCTEU6ICAgICByZXR1cm4gTkFNRV9ET1VCTEU7CisgICAgICAgICAgICBjYXNlIFRUeXBlLlNUUklORzogICAgIHJldHVybiBOQU1FX1NUUklORzsKKyAgICAgICAgICAgIGNhc2UgVFR5cGUuU1RSVUNUOiAgICAgcmV0dXJuIE5BTUVfU1RSVUNUOworICAgICAgICAgICAgY2FzZSBUVHlwZS5NQVA6ICAgICAgICAgcmV0dXJuIE5BTUVfTUFQOworICAgICAgICAgICAgY2FzZSBUVHlwZS5TRVQ6ICAgICAgICAgcmV0dXJuIE5BTUVfU0VUOworICAgICAgICAgICAgY2FzZSBUVHlwZS5MSVNUOiAgICAgcmV0dXJuIE5BTUVfTElTVDsKKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5OT1RfSU1QTEVNRU5URUQsICJVbnJlY29nbml6ZWQgdHlwZSIpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZhciBOQU1FU19UT19UWVBFUyA9IFsKKyAgICAgICAgTkFNRV9CT09MICAgPT4gVFR5cGUuQk9PTCwKKyAgICAgICAgTkFNRV9CWVRFICAgPT4gVFR5cGUuQllURSwKKyAgICAgICAgTkFNRV9JMTYgICAgPT4gVFR5cGUuSTE2LAorICAgICAgICBOQU1FX0kzMiAgICA9PiBUVHlwZS5JMzIsCisgICAgICAgIE5BTUVfSTY0ICAgID0+IFRUeXBlLkk2NCwKKyAgICAgICAgTkFNRV9ET1VCTEUgPT4gVFR5cGUuRE9VQkxFLAorICAgICAgICBOQU1FX1NUUklORyA9PiBUVHlwZS5TVFJJTkcsCisgICAgICAgIE5BTUVfU1RSVUNUID0+IFRUeXBlLlNUUlVDVCwKKyAgICAgICAgTkFNRV9NQVAgICAgPT4gVFR5cGUuTUFQLAorICAgICAgICBOQU1FX1NFVCAgICA9PiBUVHlwZS5TRVQsCisgICAgICAgIE5BTUVfTElTVCAgID0+IFRUeXBlLkxJU1QKKyAgICBdOworCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBHZXRUeXBlSURGb3JUeXBlTmFtZShuYW1lIDogU3RyaW5nKSA6IEludAorICAgIHsKKyAgICAgICAgdmFyIHR5cGUgPSBOQU1FU19UT19UWVBFU1tuYW1lXTsKKyAgICAgICAgaWYoIG51bGwgIT0gdHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgICAgIH0KKyAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uTk9UX0lNUExFTUVOVEVELCAiVW5yZWNvZ25pemVkIHR5cGUiKTsKKyAgICB9CisKK30KKworCisvLyBCYXNlIGNsYXNzIGZvciB0cmFja2luZyBKU09OIGNvbnRleHRzIHRoYXQgbWF5IHJlcXVpcmUgaW5zZXJ0aW5nL1JlYWRpbmcKKy8vIGFkZGl0aW9uYWwgSlNPTiBzeW50YXggY2hhcmFjdGVycy4gVGhpcyBiYXNlIGNvbnRleHQgZG9lcyBub3RoaW5nLgorQDphbGxvdyhUSlNPTlByb3RvY29sKQorY2xhc3MgSlNPTkJhc2VDb250ZXh0Cit7CisgICAgcHJpdmF0ZSB2YXIgcHJvdG8gOiBUSlNPTlByb3RvY29sOworCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldyhwcm90byA6IFRKU09OUHJvdG9jb2wgKQorICAgIHsKKyAgICAgICAgdGhpcy5wcm90byA9IHByb3RvOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBXcml0ZSgpIDogVm9pZCB7IH0KKyAgICBwdWJsaWMgZnVuY3Rpb24gUmVhZCgpIDogVm9pZCB7IH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBFc2NhcGVOdW1iZXJzKCkgOiBCb29sIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KKworCisvLyBDb250ZXh0IGZvciBKU09OIGxpc3RzLgorLy8gV2lsbCBpbnNlcnQvUmVhZCBjb21tYXMgYmVmb3JlIGVhY2ggaXRlbSBleGNlcHQgZm9yIHRoZSBmaXJzdCBvbmUKK0A6YWxsb3coVEpTT05Qcm90b2NvbCkKK2NsYXNzIEpTT05MaXN0Q29udGV4dCBleHRlbmRzIEpTT05CYXNlQ29udGV4dAoreworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcoIHByb3RvIDogVEpTT05Qcm90b2NvbCkgeworICAgICAgICBzdXBlcihwcm90byk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2YXIgZmlyc3QgOiBCb29sID0gdHJ1ZTsKKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBXcml0ZSgpIDogVm9pZCB7CisgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgeworICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBidWYgPSBuZXcgQnl0ZXNCdWZmZXIoKTsKKyAgICAgICAgICAgIGJ1Zi5hZGRTdHJpbmcoIEpTT05Db25zdGFudHMuQ09NTUEpOworICAgICAgICAgICAgdmFyIHRtcCA9IGJ1Zi5nZXRCeXRlcygpOworICAgICAgICAgICAgcHJvdG8udHJhbnMud3JpdGUoIHRtcCwgMCwgdG1wLmxlbmd0aCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gUmVhZCgpIDogVm9pZCB7CisgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgeworICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHByb3RvLlJlYWRKU09OU3ludGF4Q2hhciggSlNPTkNvbnN0YW50cy5DT01NQSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworLy8gQ29udGV4dCBmb3IgSlNPTiByZWNvcmRzLgorLy8gV2lsbCBpbnNlcnQvUmVhZCBjb2xvbnMgYmVmb3JlIHRoZSB2YWx1ZSBwb3J0aW9uIG9mIGVhY2ggcmVjb3JkCisvLyBwYWlyLCBhbmQgY29tbWFzIGJlZm9yZSBlYWNoIGtleSBleGNlcHQgdGhlIGZpcnN0LiBJbiBhZGRpdGlvbiwKKy8vIHdpbGwgaW5kaWNhdGUgdGhhdCBudW1iZXJzIGluIHRoZSBrZXkgcG9zaXRpb24gbmVlZCB0byBiZSBlc2NhcGVkCisvLyBpbiBxdW90ZXMgKHNpbmNlIEpTT04ga2V5cyBtdXN0IGJlIHN0cmluZ3MpLgorQDphbGxvdyhUSlNPTlByb3RvY29sKQorY2xhc3MgSlNPTlBhaXJDb250ZXh0IGV4dGVuZHMgSlNPTkJhc2VDb250ZXh0Cit7CisgICAgcHVibGljIGZ1bmN0aW9uIG5ldyggcHJvdG8gOiBUSlNPTlByb3RvY29sICkgeworICAgICAgICBzdXBlciggcHJvdG8pOworICAgIH0KKworICAgIHByaXZhdGUgdmFyIGZpcnN0IDogQm9vbCA9IHRydWU7CisgICAgcHJpdmF0ZSB2YXIgY29sb24gOiBCb29sICA9IHRydWU7CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gV3JpdGUoKSA6IFZvaWQgeworICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICBjb2xvbiA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgYnVmID0gbmV3IEJ5dGVzQnVmZmVyKCk7CisgICAgICAgICAgICBidWYuYWRkU3RyaW5nKCBjb2xvbiA/IEpTT05Db25zdGFudHMuQ09MT04gOiBKU09OQ29uc3RhbnRzLkNPTU1BKTsKKyAgICAgICAgICAgIHZhciB0bXAgPSBidWYuZ2V0Qnl0ZXMoKTsKKyAgICAgICAgICAgIHByb3RvLnRyYW5zLndyaXRlKCB0bXAsIDAsIHRtcC5sZW5ndGgpOworICAgICAgICAgICAgY29sb24gPSAhY29sb247CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gUmVhZCgpIDogVm9pZCB7CisgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgeworICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgIGNvbG9uID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHByb3RvLlJlYWRKU09OU3ludGF4Q2hhciggY29sb24gPyBKU09OQ29uc3RhbnRzLkNPTE9OIDogSlNPTkNvbnN0YW50cy5DT01NQSk7CisgICAgICAgICAgICBjb2xvbiA9ICFjb2xvbjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBFc2NhcGVOdW1iZXJzKCkgOiBCb29sCisgICAgeworICAgICAgICByZXR1cm4gY29sb247CisgICAgfQorfQorCisvLyBIb2xkcyB1cCB0byBvbmUgYnl0ZSBmcm9tIHRoZSB0cmFuc3BvcnQKK0A6YWxsb3coVEpTT05Qcm90b2NvbCkKK2NsYXNzIExvb2thaGVhZFJlYWRlciB7CisKKyAgICBwcml2YXRlIHZhciBwcm90byA6IFRKU09OUHJvdG9jb2w7CisgICAgcHJpdmF0ZSB2YXIgZGF0YSA6IEJ5dGVzOworCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldyggcHJvdG8gOiBUSlNPTlByb3RvY29sICkgeworICAgICAgICB0aGlzLnByb3RvID0gcHJvdG87CisgICAgICAgIGRhdGEgPSBudWxsOworICAgIH0KKworCisgICAgLy8gUmV0dXJuIGFuZCBjb25zdW1lIHRoZSBuZXh0IGJ5dGUgdG8gYmUgUmVhZCwgZWl0aGVyIHRha2luZyBpdCBmcm9tIHRoZQorICAgIC8vIGRhdGEgYnVmZmVyIGlmIHByZXNlbnQgb3IgZ2V0dGluZyBpdCBmcm9tIHRoZSB0cmFuc3BvcnQgb3RoZXJ3aXNlLgorICAgIHB1YmxpYyBmdW5jdGlvbiBSZWFkKCkgOiBCeXRlcyB7CisgICAgICAgIHZhciByZXR2YWwgPSBQZWVrKCk7CisgICAgICAgIGRhdGEgPSBudWxsOworICAgICAgICByZXR1cm4gcmV0dmFsOworICAgIH0KKworICAgIC8vIFJldHVybiB0aGUgbmV4dCBieXRlIHRvIGJlIFJlYWQgd2l0aG91dCBjb25zdW1pbmcsIGZpbGxpbmcgdGhlIGRhdGEKKyAgICAvLyBidWZmZXIgaWYgaXQgaGFzIG5vdCBiZWVuIGZpbGxlZCBhbFJlYWR5LgorICAgIHB1YmxpYyBmdW5jdGlvbiBQZWVrKCkgOiBCeXRlcyB7CisgICAgICAgIGlmIChkYXRhID09IG51bGwpIHsKKyAgICAgICAgICAgIHZhciBidWYgPSBuZXcgQnl0ZXNCdWZmZXIoKTsKKyAgICAgICAgICAgIHByb3RvLnRyYW5zLnJlYWRBbGwoYnVmLCAwLCAxKTsKKyAgICAgICAgICAgIGRhdGEgPSBidWYuZ2V0Qnl0ZXMoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZGF0YTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9USlNPTlByb3RvY29sRmFjdG9yeS5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9USlNPTlByb3RvY29sRmFjdG9yeS5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjM1NThhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2xGYWN0b3J5Lmh4CkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0OworCisKKy8qKgorKiBKU09OIFByb3RvY29sIEZhY3RvcnkKKyovCitjbGFzcyBUSlNPTlByb3RvY29sRmFjdG9yeSBpbXBsZW1lbnRzIFRQcm90b2NvbEZhY3RvcnkgeworCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldygpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0UHJvdG9jb2woIHRyYW5zIDogVFRyYW5zcG9ydCkgOiBUUHJvdG9jb2wgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUSlNPTlByb3RvY29sKCB0cmFucyk7CisgICAgfQorfQorCisKKworICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UTGlzdC5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UTGlzdC5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTFmYjU1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RMaXN0Lmh4CkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKKworY2xhc3MgVExpc3QgeworCisgICAgcHVibGljIHZhciBlbGVtVHlwZSA6IEludDsKKyAgICBwdWJsaWMgdmFyIHNpemUgOiBJbnQ7CisKKyAgICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcodCA6IEludCA9IDAsIHMgOiBJbnQgPSAwKSB7CisgICAgICAgIGVsZW1UeXBlID0gdDsKKyAgICAgICAgc2l6ZSA9IHM7CisgICAgICB9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVE1hcC5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UTWFwLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0ZTYyODgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVE1hcC5oeApAQCAtMCwwICsxLDM0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7CisKK2NsYXNzIFRNYXAgeworCisgICAgcHVibGljIHZhciBrZXlUeXBlIDogSW50OworICAgIHB1YmxpYyB2YXIgdmFsdWVUeXBlIDogSW50OworICAgIHB1YmxpYyB2YXIgc2l6ZSA6IEludDsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcoayA6IEludCA9IDAsIHYgOiBJbnQgPSAwLCBzIDogSW50ID0gMCkgeworICAgICAga2V5VHlwZSA9IGs7CisgICAgICB2YWx1ZVR5cGUgPSB2OworICAgICAgc2l6ZSA9IHM7CisgICAgfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RNZXNzYWdlLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RNZXNzYWdlLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5OTI2NGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVE1lc3NhZ2UuaHgKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOworCitjbGFzcyBUTWVzc2FnZSB7CisKKyAgICBwdWJsaWMgdmFyIG5hbWUgOiBTdHJpbmc7CisgICAgcHVibGljIHZhciB0eXBlIDogSW50OworICAgIHB1YmxpYyB2YXIgc2VxaWQgOiBJbnQ7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KG4gOiBTdHJpbmcgPSAiIiwgdCA6IEludCA9IDAsIHMgOiBJbnQgPSAwKSB7CisgICAgICBuYW1lID0gbjsKKyAgICAgIHR5cGUgPSB0OworICAgICAgc2VxaWQgPSBzOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0b1N0cmluZygpIDogU3RyaW5nIHsKKyAgICAgIHJldHVybiAiPFRNZXNzYWdlIG5hbWU6JyIgKyBuYW1lICsgIicgdHlwZTogIiArIHR5cGUgKyAiIHNlcWlkOiIgKyBzZXFpZCArICI+IjsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gZXF1YWxzKG90aGVyOlRNZXNzYWdlKSA6IEJvb2wgeworICAgICAgcmV0dXJuIG5hbWUgPT0gb3RoZXIubmFtZSAmJiB0eXBlID09IG90aGVyLnR5cGUgJiYgc2VxaWQgPT0gb3RoZXIuc2VxaWQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RNZXNzYWdlVHlwZS5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UTWVzc2FnZVR5cGUuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA2ZDMyOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UTWVzc2FnZVR5cGUuaHgKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOworCitAOmVudW0KK2Fic3RyYWN0IFRNZXNzYWdlVHlwZShJbnQpICBmcm9tIEludCB0byBJbnQgIHsKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgQ0FMTCAgICAgIDogSW50ID0gMTsKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgUkVQTFkgICAgIDogSW50ID0gMjsKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgRVhDRVBUSU9OIDogSW50ID0gMzsKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgT05FV0FZICAgIDogSW50ID0gNDsKK30KZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVE11bHRpcGxleGVkUHJvY2Vzc29yLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwYWEzY2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVE11bHRpcGxleGVkUHJvY2Vzc29yLmh4CkBAIC0wLDAgKzEsMTc3IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOworCitpbXBvcnQgaGF4ZS5kcy5TdHJpbmdNYXA7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRQcm9jZXNzb3I7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydDsKKworCisvKioKKyAqIFRNdWx0aXBsZXhlZFByb2Nlc3NvciBpcyBhIFRQcm9jZXNzb3IgYWxsb3dpbmcgYSBzaW5nbGUgVFNlcnZlciB0byBwcm92aWRlIG11bHRpcGxlIHNlcnZpY2VzLgorICogVG8gZG8gc28sIHlvdSBpbnN0YW50aWF0ZSB0aGUgcHJvY2Vzc29yIGFuZCB0aGVuIHJlZ2lzdGVyIGFkZGl0aW9uYWwgcHJvY2Vzc29ycyB3aXRoIGl0LAorICogYXMgc2hvd24gaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlOgorICoKKyAqICAgICBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IgcHJvY2Vzc29yID0gbmV3IFRNdWx0aXBsZXhlZFByb2Nlc3NvcigpOworICoKKyAqICAgICBwcm9jZXNzb3IucmVnaXN0ZXJQcm9jZXNzb3IoCisgKiAgICAgICAgICJDYWxjdWxhdG9yIiwKKyAqICAgICAgICAgbmV3IENhbGN1bGF0b3IuUHJvY2Vzc29yKG5ldyBDYWxjdWxhdG9ySGFuZGxlcigpKSk7CisgKgorICogICAgIHByb2Nlc3Nvci5yZWdpc3RlclByb2Nlc3NvcigKKyAqICAgICAgICAgIldlYXRoZXJSZXBvcnQiLAorICogICAgICAgICBuZXcgV2VhdGhlclJlcG9ydC5Qcm9jZXNzb3IobmV3IFdlYXRoZXJSZXBvcnRIYW5kbGVyKCkpKTsKKyAqCisgKiAgICAgVFNlcnZlclRyYW5zcG9ydCB0ID0gbmV3IFRTZXJ2ZXJTb2NrZXQoOTA5MCk7CisgKiAgICAgVFNpbXBsZVNlcnZlciBzZXJ2ZXIgPSBuZXcgVFNpbXBsZVNlcnZlcihwcm9jZXNzb3IsIHQpOworICoKKyAqICAgICBzZXJ2ZXIuc2VydmUoKTsKKyAqLworY2xhc3MgVE11bHRpcGxleGVkUHJvY2Vzc29yIGltcGxlbWVudHMgVFByb2Nlc3NvcgoreworICAgIHByaXZhdGUgdmFyIHNlcnZpY2VQcm9jZXNzb3JNYXAgOiBTdHJpbmdNYXA8VFByb2Nlc3Nvcj4gPSBuZXcgU3RyaW5nTWFwPFRQcm9jZXNzb3I+KCk7CisgICAgcHJpdmF0ZSB2YXIgZGVmYXVsdFByb2Nlc3NvciA6IFRQcm9jZXNzb3IgPSBudWxsOworCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldygpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAnUmVnaXN0ZXInIGEgc2VydmljZSB3aXRoIHRoaXMgVE11bHRpcGxleGVkUHJvY2Vzc29yLiBUaGlzIGFsbG93cyB1cyB0byBicm9rZXIKKyAgICAgKiByZXF1ZXN0cyB0byBpbmRpdmlkdWFsIHNlcnZpY2VzIGJ5IHVzaW5nIHRoZSBzZXJ2aWNlIG5hbWUgdG8gc2VsZWN0IHRoZW0gYXQgcmVxdWVzdCB0aW1lLgorICAgICAqCisgICAgICogQXJnczoKKyAgICAgKiAtIHNlcnZpY2VOYW1lICAgIE5hbWUgb2YgYSBzZXJ2aWNlLCBoYXMgdG8gYmUgaWRlbnRpY2FsIHRvIHRoZSBuYW1lCisgICAgICogICAgICAgICAgICAgICAgICBkZWNsYXJlZCBpbiB0aGUgVGhyaWZ0IElETCwgZS5nLiAiV2VhdGhlclJlcG9ydCIuCisgICAgICogLSBwcm9jZXNzb3IgICAgICBJbXBsZW1lbnRhdGlvbiBvZiBhIHNlcnZpY2UsIHVzdWFsbHkgcmVmZXJyZWQgdG8gYXMgImhhbmRsZXJzIiwKKyAgICAgKiAgICAgICAgICAgICAgICAgIGUuZy4gV2VhdGhlclJlcG9ydEhhbmRsZXIgaW1wbGVtZW50aW5nIFdlYXRoZXJSZXBvcnQuSWZhY2UuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIFJlZ2lzdGVyUHJvY2Vzc29yKHNlcnZpY2VOYW1lIDogU3RyaW5nLCBwcm9jZXNzb3IgOiBUUHJvY2Vzc29yLCBhc0RlZmF1bHQgOiBCb29sID0gZmFsc2UpIDogVm9pZCB7CisgICAgICAgIHNlcnZpY2VQcm9jZXNzb3JNYXAuc2V0KHNlcnZpY2VOYW1lLCBwcm9jZXNzb3IpOworICAgICAgICBpZiAoIGFzRGVmYXVsdCkgeworICAgICAgICAgICAgaWYoIGRlZmF1bHRQcm9jZXNzb3IgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5VTktOT1dOLCAiQ2FuJ3QgaGF2ZSBtdWx0aXBsZSBkZWZhdWx0IHByb2Nlc3NvcnMiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZGVmYXVsdFByb2Nlc3NvciA9IHByb2Nlc3NvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBGYWlsKCBvcHJvdCA6IFRQcm90b2NvbCwgbWVzc2FnZSA6IFRNZXNzYWdlLCBleHR5cGUgOiBJbnQsIGV0eHQgOiBTdHJpbmcpIDogVm9pZCB7CisgICAgICAgIHZhciBhcHBleCA9IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oIGV4dHlwZSwgZXR4dCk7CisKKyAgICAgICAgdmFyIG5ld01lc3NhZ2UgPSBuZXcgVE1lc3NhZ2UobWVzc2FnZS5uYW1lLCBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OLCBtZXNzYWdlLnNlcWlkKTsKKworICAgICAgICBvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbihuZXdNZXNzYWdlKTsKKyAgICAgICAgYXBwZXgud3JpdGUoIG9wcm90KTsKKyAgICAgICAgb3Byb3Qud3JpdGVNZXNzYWdlRW5kKCk7CisgICAgICAgIG9wcm90LmdldFRyYW5zcG9ydCgpLmZsdXNoKCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIHByb2Nlc3MgcGVyZm9ybXMgdGhlIGZvbGxvd2luZyBzdGVwczoKKyAgICAgKgorICAgICAqIC0gUmVhZCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBtZXNzYWdlLgorICAgICAqIC0gRXh0cmFjdCB0aGUgc2VydmljZSBuYW1lIGZyb20gdGhlIG1lc3NhZ2UuCisgICAgICogLSBVc2luZyB0aGUgc2VydmljZSBuYW1lIHRvIGxvY2F0ZSB0aGUgYXBwcm9wcmlhdGUgcHJvY2Vzc29yLgorICAgICAqIC0gRGlzcGF0Y2ggdG8gdGhlIHByb2Nlc3Nvciwgd2l0aCBhIGRlY29yYXRlZCBpbnN0YW5jZSBvZiBUUHJvdG9jb2wKKyAgICAgKiAgICB0aGF0IGFsbG93cyByZWFkTWVzc2FnZUJlZ2luKCkgdG8gcmV0dXJuIHRoZSBvcmlnaW5hbCBUTWVzc2FnZS4KKyAgICAgKgorICAgICAqIFRocm93cyBhbiBleGNlcHRpb24gaWYKKyAgICAgKiAtIHRoZSBtZXNzYWdlIHR5cGUgaXMgbm90IENBTEwgb3IgT05FV0FZLAorICAgICAqIC0gdGhlIHNlcnZpY2UgbmFtZSB3YXMgbm90IGZvdW5kIGluIHRoZSBtZXNzYWdlLCBvcgorICAgICAqIC0gdGhlIHNlcnZpY2UgbmFtZSBoYXMgbm90IGJlZW4gUmVnaXN0ZXJQcm9jZXNzb3IoKWVkLgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBwcm9jZXNzKCBpcHJvdCA6IFRQcm90b2NvbCwgb3Byb3QgOiBUUHJvdG9jb2wpIDogQm9vbCB7CisgICAgICAgIC8qICBVc2UgdGhlIGFjdHVhbCB1bmRlcmx5aW5nIHByb3RvY29sIChlLmcuIFRCaW5hcnlQcm90b2NvbCkgdG8gcmVhZCB0aGUKKyAgICAgICAgICAgIG1lc3NhZ2UgaGVhZGVyLiAgVGhpcyBwdWxscyB0aGUgbWVzc2FnZSAib2ZmIHRoZSB3aXJlIiwgd2hpY2ggd2UnbGwKKyAgICAgICAgICAgIGRlYWwgd2l0aCBhdCB0aGUgZW5kIG9mIHRoaXMgbWV0aG9kLiAqLworCisgICAgICAgIHZhciBtZXNzYWdlIDogVE1lc3NhZ2UgPSBpcHJvdC5yZWFkTWVzc2FnZUJlZ2luKCk7CisgICAgICAgIHZhciBtZXRob2ROYW1lIDogU3RyaW5nID0gIiI7CisKKyAgICAgICAgaWYgKChtZXNzYWdlLnR5cGUgIT0gVE1lc3NhZ2VUeXBlLkNBTEwpICYmIChtZXNzYWdlLnR5cGUgIT0gVE1lc3NhZ2VUeXBlLk9ORVdBWSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZhaWwob3Byb3QsIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICBUQXBwbGljYXRpb25FeGNlcHRpb24uSU5WQUxJRF9NRVNTQUdFX1RZUEUsCisgICAgICAgICAgICAgICAgICAiTWVzc2FnZSB0eXBlIENBTEwgb3IgT05FV0FZIGV4cGVjdGVkIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBFeHRyYWN0IHRoZSBzZXJ2aWNlIG5hbWUKKyAgICAgICAgdmFyIGFjdHVhbFByb2Nlc3NvciA6IFRQcm9jZXNzb3IgPSBudWxsOworICAgICAgICB2YXIgaW5kZXggPSBtZXNzYWdlLm5hbWUuaW5kZXhPZihUTXVsdGlwbGV4ZWRQcm90b2NvbC5TRVBBUkFUT1IpOworICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgICAgICAvLyBmYWxsYmFjayB0byBkZWZhdWx0IHByb2Nlc3NvcgorICAgICAgICAgICAgbWV0aG9kTmFtZSA9IG1lc3NhZ2UubmFtZTsKKyAgICAgICAgICAgIGFjdHVhbFByb2Nlc3NvciA9IGRlZmF1bHRQcm9jZXNzb3I7CisgICAgICAgICAgICBpZiggYWN0dWFsUHJvY2Vzc29yID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBGYWlsKG9wcm90LCBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5JTlZBTElEX1BST1RPQ09MLAorICAgICAgICAgICAgICAgICAgICAgICJTZXJ2aWNlIG5hbWUgbm90IGZvdW5kIGluIG1lc3NhZ2UgbmFtZTogIiArIG1lc3NhZ2UubmFtZSArICIgYW5kIG5vIGRlZmF1bHQgcHJvY2Vzc29yIGRlZmluZWQuICIgKworICAgICAgICAgICAgICAgICAgICAgICJEaWQgeW91IGZvcmdldCB0byB1c2UgYSBUTXVsdGlwbGV4UHJvdG9jb2wgaW4geW91ciBjbGllbnQ/Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBzZXJ2aWNlIG5hbWUgZ2l2ZW4KKyAgICAgICAgICAgIHZhciBzZXJ2aWNlTmFtZSA9IG1lc3NhZ2UubmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpOworICAgICAgICAgICAgbWV0aG9kTmFtZSA9IG1lc3NhZ2UubmFtZS5zdWJzdHJpbmcoIHNlcnZpY2VOYW1lLmxlbmd0aCArIFRNdWx0aXBsZXhlZFByb3RvY29sLlNFUEFSQVRPUi5sZW5ndGgpOworICAgICAgICAgICAgYWN0dWFsUHJvY2Vzc29yID0gc2VydmljZVByb2Nlc3Nvck1hcC5nZXQoIHNlcnZpY2VOYW1lKTsKKyAgICAgICAgICAgIGlmKCBhY3R1YWxQcm9jZXNzb3IgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEZhaWwob3Byb3QsIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uLklOVEVSTkFMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICJTZXJ2aWNlIG5hbWUgbm90IGZvdW5kOiAiICsgc2VydmljZU5hbWUgKyAiLiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAiRGlkIHlvdSBmb3JnZXQgdG8gY2FsbCBSZWdpc3RlclByb2Nlc3NvcigpPyIpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBUTWVzc2FnZSwgcmVtb3ZpbmcgdGhlIHNlcnZpY2UgbmFtZQorICAgICAgICAvLyBEaXNwYXRjaCBwcm9jZXNzaW5nIHRvIHRoZSBzdG9yZWQgcHJvY2Vzc29yCisgICAgICAgIHZhciBuZXdNZXNzYWdlID0gbmV3IFRNZXNzYWdlKCBtZXRob2ROYW1lLCBtZXNzYWdlLnR5cGUsIG1lc3NhZ2Uuc2VxaWQpOworICAgICAgICB2YXIgc3RvcmVkTXNnID0gbmV3IFN0b3JlZE1lc3NhZ2VQcm90b2NvbCggaXByb3QsIG5ld01lc3NhZ2UpOworICAgICAgICByZXR1cm4gYWN0dWFsUHJvY2Vzc29yLnByb2Nlc3MoIHN0b3JlZE1zZywgb3Byb3QpOworICAgIH0KK30KKworCisvKioKKyAqICBPdXIgZ29hbCB3YXMgdG8gd29yayB3aXRoIGFueSBwcm90b2NvbC4gIEluIG9yZGVyIHRvIGRvIHRoYXQsIHdlIG5lZWRlZAorICogIHRvIGFsbG93IHRoZW0gdG8gY2FsbCByZWFkTWVzc2FnZUJlZ2luKCkgYW5kIGdldCBhIFRNZXNzYWdlIGluIGV4YWN0bHkKKyAqICB0aGUgc3RhbmRhcmQgZm9ybWF0LCB3aXRob3V0IHRoZSBzZXJ2aWNlIG5hbWUgcHJlcGVuZGVkIHRvIFRNZXNzYWdlLm5hbWUuCisgKi8KK2NsYXNzIFN0b3JlZE1lc3NhZ2VQcm90b2NvbCBleHRlbmRzIFRQcm90b2NvbERlY29yYXRvcgoreworICAgIHByaXZhdGUgdmFyIG1lc3NhZ2VCZWdpbiA6IFRNZXNzYWdlOworCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldyggcHJvdG9jb2wgOiBUUHJvdG9jb2wsIG1lc3NhZ2VCZWdpbiA6IFRNZXNzYWdlKSB7CisgICAgICAgIHN1cGVyKCBwcm90b2NvbCk7CisgICAgICAgIHRoaXMubWVzc2FnZUJlZ2luID0gbWVzc2FnZUJlZ2luOworICAgIH0KKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiByZWFkTWVzc2FnZUJlZ2luKCkgOiBUTWVzc2FnZSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlQmVnaW47CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FjZDFkNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5oeApAQCAtMCwwICsxLDk3IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQ7CisKKworLyoqCisgKiBUTXVsdGlwbGV4ZWRQcm90b2NvbCBpcyBhIHByb3RvY29sLWluZGVwZW5kZW50IGNvbmNyZXRlIGRlY29yYXRvciB0aGF0IGFsbG93cyBhIFRocmlmdAorICogY2xpZW50IHRvIGNvbW11bmljYXRlIHdpdGggYSBtdWx0aXBsZXhpbmcgVGhyaWZ0IHNlcnZlciwgYnkgcHJlcGVuZGluZyB0aGUgc2VydmljZSBuYW1lCisgKiB0byB0aGUgZnVuY3Rpb24gbmFtZSBkdXJpbmcgZnVuY3Rpb24gY2FsbHMuCisgKgorICogTk9URTogVEhJUyBJUyBOT1QgVE8gQkUgVVNFRCBCWSBTRVJWRVJTLgorICogT24gdGhlIHNlcnZlciwgdXNlIFRNdWx0aXBsZXhlZFByb2Nlc3NvciB0byBoYW5kbGUgcmVxdWVzdHMgZnJvbSBhIG11bHRpcGxleGluZyBjbGllbnQuCisgKgorICogVGhpcyBleGFtcGxlIHVzZXMgYSBzaW5nbGUgc29ja2V0IHRyYW5zcG9ydCB0byBpbnZva2UgdHdvIHNlcnZpY2VzOgorICoKKyAqICAgICBUU29ja2V0IHRyYW5zcG9ydCA9IG5ldyBUU29ja2V0KCJsb2NhbGhvc3QiLCA5MDkwKTsKKyAqICAgICB0cmFuc3BvcnQub3BlbigpOworICoKKyAqICAgICBUQmluYXJ5UHJvdG9jb2wgcHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCk7CisgKgorICogICAgIFRNdWx0aXBsZXhlZFByb3RvY29sIG1wID0gbmV3IFRNdWx0aXBsZXhlZFByb3RvY29sKHByb3RvY29sLCAiQ2FsY3VsYXRvciIpOworICogICAgIENhbGN1bGF0b3IuQ2xpZW50IHNlcnZpY2UgPSBuZXcgQ2FsY3VsYXRvci5DbGllbnQobXApOworICoKKyAqICAgICBUTXVsdGlwbGV4ZWRQcm90b2NvbCBtcDIgPSBuZXcgVE11bHRpcGxleGVkUHJvdG9jb2wocHJvdG9jb2wsICJXZWF0aGVyUmVwb3J0Iik7CisgKiAgICAgV2VhdGhlclJlcG9ydC5DbGllbnQgc2VydmljZTIgPSBuZXcgV2VhdGhlclJlcG9ydC5DbGllbnQobXAyKTsKKyAqCisgKiAgICAgU3lzdGVtLm91dC5wcmludGxuKHNlcnZpY2UuYWRkKDIsMikpOworICogICAgIFN5c3RlbS5vdXQucHJpbnRsbihzZXJ2aWNlMi5nZXRUZW1wZXJhdHVyZSgpKTsKKyAqCisgKi8KK2NsYXNzIFRNdWx0aXBsZXhlZFByb3RvY29sIGV4dGVuZHMgVFByb3RvY29sRGVjb3JhdG9yIHsKKworICAgIC8qKiBVc2VkIHRvIGRlbGltaXQgdGhlIHNlcnZpY2UgbmFtZSBmcm9tIHRoZSBmdW5jdGlvbiBuYW1lICovCisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIFNFUEFSQVRPUiA6IFN0cmluZyA9ICI6IjsKKworICAgIHByaXZhdGUgdmFyIHNlcnZpY2UgOiBTdHJpbmc7CisKKyAgICAvKioKKyAgICAgKiBXcmFwIHRoZSBzcGVjaWZpZWQgcHJvdG9jb2wsIGFsbG93aW5nIGl0IHRvIGJlIHVzZWQgdG8gY29tbXVuaWNhdGUgd2l0aCBhCisgICAgICogbXVsdGlwbGV4aW5nIHNlcnZlci4gIFRoZSA8Y29kZT5zZXJ2aWNlTmFtZTwvY29kZT4gaXMgcmVxdWlyZWQgYXMgaXQgaXMKKyAgICAgKiBwcmVwZW5kZWQgdG8gdGhlIG1lc3NhZ2UgaGVhZGVyIHNvIHRoYXQgdGhlIG11bHRpcGxleGluZyBzZXJ2ZXIgY2FuIGJyb2tlcgorICAgICAqIHRoZSBmdW5jdGlvbiBjYWxsIHRvIHRoZSBwcm9wZXIgc2VydmljZS4KKyAgICAgKgorICAgICAqIEFyZ3M6CisgICAgICogIHByb3RvY29sICAgICAgICBZb3VyIGNvbW11bmljYXRpb24gcHJvdG9jb2wgb2YgY2hvaWNlLCBlLmcuIFRCaW5hcnlQcm90b2NvbAorICAgICAqICBzZXJ2aWNlTmFtZSAgICAgVGhlIHNlcnZpY2UgbmFtZSBvZiB0aGUgc2VydmljZSBjb21tdW5pY2F0aW5nIHZpYSB0aGlzIHByb3RvY29sLgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcoIHByb3RvY29sIDogVFByb3RvY29sLCBzZXJ2aWNlTmFtZSA6IFN0cmluZykgICAgeworICAgICAgICBzdXBlciggcHJvdG9jb2wpOworICAgICAgICBzZXJ2aWNlID0gc2VydmljZU5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJlcGVuZHMgdGhlIHNlcnZpY2UgbmFtZSB0byB0aGUgZnVuY3Rpb24gbmFtZSwgc2VwYXJhdGVkIGJ5IFRNdWx0aXBsZXhlZFByb3RvY29sLlNFUEFSQVRPUi4KKyAgICAgKiBBcmdzOgorICAgICAqICAgdE1lc3NhZ2UgICAgIFRoZSBvcmlnaW5hbCBtZXNzYWdlLgorICAgICAqLworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiB3cml0ZU1lc3NhZ2VCZWdpbiggbWVzc2FnZSA6IFRNZXNzYWdlKSA6IFZvaWQgeworICAgICAgICBzd2l0Y2goIG1lc3NhZ2UudHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBUTWVzc2FnZVR5cGUuQ0FMTDoKKyAgICAgICAgICAgICAgICBzdXBlci53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UgKyBTRVBBUkFUT1IgKyBtZXNzYWdlLm5hbWUsCisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudHlwZSwKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zZXFpZCkpOworCisgICAgICAgICAgICBjYXNlIFRNZXNzYWdlVHlwZS5PTkVXQVk6CisgICAgICAgICAgICAgICAgc3VwZXIud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlICsgU0VQQVJBVE9SICsgbWVzc2FnZS5uYW1lLAorICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnR5cGUsCisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2VxaWQpKTsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBzdXBlci53cml0ZU1lc3NhZ2VCZWdpbihtZXNzYWdlKTsKKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbC5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdmMzg0MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuaHgKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOworCitpbXBvcnQgaGF4ZS5pby5CeXRlczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0OworCisvKioKKyogUHJvdG9jb2wgaW50ZXJmYWNlIGRlZmluaXRpb24KKyovCitpbnRlcmZhY2UgVFByb3RvY29sIHsKKworICAgIGZ1bmN0aW9uIGdldFRyYW5zcG9ydCgpIDogVFRyYW5zcG9ydDsKKworICAgIC8qKgorICAgICAqIFdyaXRpbmcgbWV0aG9kcy4KKyAgICAgKi8KKyAgICBmdW5jdGlvbiB3cml0ZU1lc3NhZ2VCZWdpbihtZXNzYWdlOlRNZXNzYWdlKSA6IFZvaWQ7CisgICAgZnVuY3Rpb24gd3JpdGVNZXNzYWdlRW5kKCkgOiBWb2lkOworICAgIGZ1bmN0aW9uIHdyaXRlU3RydWN0QmVnaW4oc3RydWN0OlRTdHJ1Y3QpIDogVm9pZDsKKyAgICBmdW5jdGlvbiB3cml0ZVN0cnVjdEVuZCgpIDogVm9pZDsKKyAgICBmdW5jdGlvbiB3cml0ZUZpZWxkQmVnaW4oZmllbGQ6VEZpZWxkKSA6IFZvaWQ7CisgICAgZnVuY3Rpb24gd3JpdGVGaWVsZEVuZCgpIDogVm9pZDsKKyAgICBmdW5jdGlvbiB3cml0ZUZpZWxkU3RvcCgpIDogVm9pZDsKKyAgICBmdW5jdGlvbiB3cml0ZU1hcEJlZ2luKG1hcDpUTWFwKSA6IFZvaWQ7CisgICAgZnVuY3Rpb24gd3JpdGVNYXBFbmQoKSA6IFZvaWQ7CisgICAgZnVuY3Rpb24gd3JpdGVMaXN0QmVnaW4obGlzdDpUTGlzdCkgOiBWb2lkOworICAgIGZ1bmN0aW9uIHdyaXRlTGlzdEVuZCgpIDogVm9pZDsKKyAgICBmdW5jdGlvbiB3cml0ZVNldEJlZ2luKHNldDpUU2V0KSA6IFZvaWQ7CisgICAgZnVuY3Rpb24gd3JpdGVTZXRFbmQoKSA6IFZvaWQ7CisgICAgZnVuY3Rpb24gd3JpdGVCb29sKGIgOiBCb29sKSA6IFZvaWQ7CisgICAgZnVuY3Rpb24gd3JpdGVCeXRlKGIgOiBJbnQpIDogVm9pZDsKKyAgICBmdW5jdGlvbiB3cml0ZUkxNihpMTYgOiBJbnQpIDogVm9pZDsKKyAgICBmdW5jdGlvbiB3cml0ZUkzMihpMzIgOiBJbnQpIDogVm9pZDsKKyAgICBmdW5jdGlvbiB3cml0ZUk2NChpNjQgOiBoYXhlLkludDY0KSA6IFZvaWQ7CisgICAgZnVuY3Rpb24gd3JpdGVEb3VibGUoZHViIDogRmxvYXQpIDogVm9pZDsKKyAgICBmdW5jdGlvbiB3cml0ZVN0cmluZyhzdHIgOiBTdHJpbmcpIDogVm9pZDsKKyAgICBmdW5jdGlvbiB3cml0ZUJpbmFyeShiaW4gOiBCeXRlcykgOiBWb2lkOworCisgICAgLyoqCisgICAgICogUmVhZGluZyBtZXRob2RzLgorICAgICAqLworICAgIGZ1bmN0aW9uIHJlYWRNZXNzYWdlQmVnaW4oKTpUTWVzc2FnZTsKKyAgICBmdW5jdGlvbiByZWFkTWVzc2FnZUVuZCgpIDogVm9pZDsKKyAgICBmdW5jdGlvbiByZWFkU3RydWN0QmVnaW4oKTpUU3RydWN0OworICAgIGZ1bmN0aW9uIHJlYWRTdHJ1Y3RFbmQoKSA6IFZvaWQ7CisgICAgZnVuY3Rpb24gcmVhZEZpZWxkQmVnaW4oKTpURmllbGQ7CisgICAgZnVuY3Rpb24gcmVhZEZpZWxkRW5kKCkgOiBWb2lkOworICAgIGZ1bmN0aW9uIHJlYWRNYXBCZWdpbigpOlRNYXA7CisgICAgZnVuY3Rpb24gcmVhZE1hcEVuZCgpIDogVm9pZDsKKyAgICBmdW5jdGlvbiByZWFkTGlzdEJlZ2luKCk6VExpc3Q7CisgICAgZnVuY3Rpb24gcmVhZExpc3RFbmQoKSA6IFZvaWQ7CisgICAgZnVuY3Rpb24gcmVhZFNldEJlZ2luKCk6VFNldDsKKyAgICBmdW5jdGlvbiByZWFkU2V0RW5kKCkgOiBWb2lkOworICAgIGZ1bmN0aW9uIHJlYWRCb29sKCkgOiBCb29sOworICAgIGZ1bmN0aW9uIHJlYWRCeXRlKCkgOiBJbnQ7CisgICAgZnVuY3Rpb24gcmVhZEkxNigpIDogSW50OworICAgIGZ1bmN0aW9uIHJlYWRJMzIoKSA6IEludDsKKyAgICBmdW5jdGlvbiByZWFkSTY0KCkgOiBoYXhlLkludDY0OworICAgIGZ1bmN0aW9uIHJlYWREb3VibGUoKSA6IEZsb2F0OworICAgIGZ1bmN0aW9uIHJlYWRTdHJpbmcoKSA6IFN0cmluZzsKKyAgICBmdW5jdGlvbiByZWFkQmluYXJ5KCkgOiBCeXRlczsKKworICAgIC8vIHJlY3Vyc2lvbiB0cmFja2luZworICAgIGZ1bmN0aW9uIEluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkgOiBWb2lkOworICAgIGZ1bmN0aW9uIERlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkgOiBWb2lkOworfQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xEZWNvcmF0b3IuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY5ZTkzYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xEZWNvcmF0b3IuaHgKQEAgLTAsMCArMSwyMjYgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7CisKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzOworaW1wb3J0IGhheGUuSW50NjQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydDsKKworCisvKioKKyAqIFRQcm90b2NvbERlY29yYXRvciBmb3J3YXJkcyBhbGwgcmVxdWVzdHMgdG8gYW4gZW5jbG9zZWQgVFByb3RvY29sIGluc3RhbmNlLAorICogcHJvdmlkaW5nIGEgd2F5IHRvIGF1dGhvciBjb25jaXNlIGNvbmNyZXRlIGRlY29yYXRvciBzdWJjbGFzc2VzLiAgV2hpbGUgaXQgaGFzCisgKiBubyBhYnN0cmFjdCBtZXRob2RzLCBpdCBpcyBtYXJrZWQgYWJzdHJhY3QgYXMgYSByZW1pbmRlciB0aGF0IGJ5IGl0c2VsZiwKKyAqIGl0IGRvZXMgbm90IG1vZGlmeSB0aGUgYmVoYXZpb3VyIG9mIHRoZSBlbmNsb3NlZCBUUHJvdG9jb2wuCisgKgorICogU2VlIHAuMTc1IG9mIERlc2lnbiBQYXR0ZXJucyAoYnkgR2FtbWEgZXQgYWwuKQorICogU2VlIFRNdWx0aXBsZXhlZFByb3RvY29sCisgKi8KK2NsYXNzIFRQcm90b2NvbERlY29yYXRvciBpbXBsZW1lbnRzIFRQcm90b2NvbAoreworICAgIHByaXZhdGUgdmFyIHdyYXBwZWQgOiBUUHJvdG9jb2w7CisKKyAgICAvKioKKyAgICAgKiBFbmNsb3NlcyB0aGUgc3BlY2lmaWVkIHByb3RvY29sLgorICAgICAqIEBwYXJhbSBwcm90b2NvbCBBbGwgb3BlcmF0aW9ucyB3aWxsIGJlIGZvcndhcmQgdG8gdGhpcyBwcm90b2NvbC4gIE11c3QgYmUgbm9uLW51bGwuCisgICAgICovCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBuZXcoIHByb3RvY29sIDogVFByb3RvY29sKSAgLy8gbm90IHRvIGJlIGluc3RhbnRpYXRlZCwgbXVzdCBkZXJpdmUgYSBjbGFzcworICAgIHsKKyAgICAgICAgd3JhcHBlZCA9IHByb3RvY29sOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRUcmFuc3BvcnQoKSA6IFRUcmFuc3BvcnQgeworICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0VHJhbnNwb3J0KCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWVzc2FnZUJlZ2luKCB2YWx1ZSA6IFRNZXNzYWdlKSA6IFZvaWQgICAgeworICAgICAgICB3cmFwcGVkLndyaXRlTWVzc2FnZUJlZ2luKCB2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWVzc2FnZUVuZCgpIDogVm9pZCB7CisgICAgICAgIHdyYXBwZWQud3JpdGVNZXNzYWdlRW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU3RydWN0QmVnaW4odmFsdWUgOiBUU3RydWN0KSA6IFZvaWQgeworICAgICAgICB3cmFwcGVkLndyaXRlU3RydWN0QmVnaW4oIHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJ1Y3RFbmQoKSA6IFZvaWQgeworICAgICAgICB3cmFwcGVkLndyaXRlU3RydWN0RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRCZWdpbih2YWx1ZSA6IFRGaWVsZCkgOiBWb2lkIHsKKyAgICAgICAgd3JhcHBlZC53cml0ZUZpZWxkQmVnaW4oIHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZEVuZCgpIDogVm9pZCB7CisgICAgICAgIHdyYXBwZWQud3JpdGVGaWVsZEVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkU3RvcCgpIDogVm9pZCB7CisgICAgICAgIHdyYXBwZWQud3JpdGVGaWVsZFN0b3AoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNYXBCZWdpbiggdmFsdWUgOiBUTWFwKSA6IFZvaWQgeworICAgICAgICB3cmFwcGVkLndyaXRlTWFwQmVnaW4oIHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNYXBFbmQoKSA6IFZvaWQgeworICAgICAgICB3cmFwcGVkLndyaXRlTWFwRW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTGlzdEJlZ2luKCB2YWx1ZSA6IFRMaXN0KSA6IFZvaWQgeworICAgICAgICB3cmFwcGVkLndyaXRlTGlzdEJlZ2luKCB2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTGlzdEVuZCgpIDogVm9pZCB7CisgICAgICAgIHdyYXBwZWQud3JpdGVMaXN0RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU2V0QmVnaW4oIHZhbHVlIDogVFNldCkgOiBWb2lkIHsKKyAgICAgICAgd3JhcHBlZC53cml0ZVNldEJlZ2luKCB2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU2V0RW5kKCkgOiBWb2lkIHsKKyAgICAgICAgd3JhcHBlZC53cml0ZVNldEVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUJvb2wodmFsdWUgOiBCb29sKSA6IFZvaWQgeworICAgICAgICB3cmFwcGVkLndyaXRlQm9vbCggdmFsdWUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUJ5dGUodmFsdWUgOiBJbnQpIDogVm9pZCB7CisgICAgICAgIHdyYXBwZWQud3JpdGVCeXRlKCB2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTE2KHZhbHVlIDogSW50KSA6IFZvaWQgeworICAgICAgICB3cmFwcGVkLndyaXRlSTE2KCB2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTMyKHZhbHVlIDogSW50KSA6IFZvaWQgeworICAgICAgICB3cmFwcGVkLndyaXRlSTMyKCB2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTY0KHZhbHVlIDogaGF4ZS5JbnQ2NCkgOiBWb2lkIHsKKyAgICAgICAgd3JhcHBlZC53cml0ZUk2NCggdmFsdWUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZURvdWJsZSh2YWx1ZSA6IEZsb2F0KSA6IFZvaWQgeworICAgICAgICB3cmFwcGVkLndyaXRlRG91YmxlKCB2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU3RyaW5nKHZhbHVlIDogU3RyaW5nKSA6IFZvaWQgeworICAgICAgICB3cmFwcGVkLndyaXRlU3RyaW5nKCB2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlQmluYXJ5KHZhbHVlIDogQnl0ZXMgKSA6IFZvaWQgeworICAgICAgICB3cmFwcGVkLndyaXRlQmluYXJ5KCB2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNZXNzYWdlQmVnaW4oKSA6IFRNZXNzYWdlIHsKKyAgICAgICAgcmV0dXJuIHdyYXBwZWQucmVhZE1lc3NhZ2VCZWdpbigpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWVzc2FnZUVuZCgpIDogVm9pZCB7CisgICAgICAgIHdyYXBwZWQucmVhZE1lc3NhZ2VFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cnVjdEJlZ2luKCkgOiBUU3RydWN0IHsKKyAgICAgICAgcmV0dXJuIHdyYXBwZWQucmVhZFN0cnVjdEJlZ2luKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJ1Y3RFbmQoKSA6IFZvaWQgeworICAgICAgICB3cmFwcGVkLnJlYWRTdHJ1Y3RFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEZpZWxkQmVnaW4oKSA6IFRGaWVsZCB7CisgICAgICAgIHJldHVybiB3cmFwcGVkLnJlYWRGaWVsZEJlZ2luKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRGaWVsZEVuZCgpIDogVm9pZCB7CisgICAgICAgIHdyYXBwZWQucmVhZEZpZWxkRW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNYXBCZWdpbigpIDogVE1hcCB7CisgICAgICAgIHJldHVybiB3cmFwcGVkLnJlYWRNYXBCZWdpbigpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWFwRW5kKCkgOiBWb2lkIHsKKyAgICAgICAgd3JhcHBlZC5yZWFkTWFwRW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRMaXN0QmVnaW4oKSA6IFRMaXN0IHsKKyAgICAgICAgcmV0dXJuIHdyYXBwZWQucmVhZExpc3RCZWdpbigpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTGlzdEVuZCgpIDogVm9pZCB7CisgICAgICAgIHdyYXBwZWQucmVhZExpc3RFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFNldEJlZ2luKCkgOiBUU2V0IHsKKyAgICAgICAgcmV0dXJuIHdyYXBwZWQucmVhZFNldEJlZ2luKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTZXRFbmQoKSA6IFZvaWQgeworICAgICAgICB3cmFwcGVkLnJlYWRTZXRFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEJvb2woKSA6IEJvb2wKKyAgICB7CisgICAgICAgIHJldHVybiB3cmFwcGVkLnJlYWRCb29sKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRCeXRlKCkgOiBJbnQgeworICAgICAgICByZXR1cm4gd3JhcHBlZC5yZWFkQnl0ZSgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkSTE2KCkgOiBJbnQgeworICAgICAgICByZXR1cm4gd3JhcHBlZC5yZWFkSTE2KCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRJMzIoKSA6IEludCB7CisgICAgICAgIHJldHVybiB3cmFwcGVkLnJlYWRJMzIoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEk2NCgpIDogaGF4ZS5JbnQ2NCB7CisgICAgICAgIHJldHVybiB3cmFwcGVkLnJlYWRJNjQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZERvdWJsZSgpIDogRmxvYXQgeworICAgICAgICByZXR1cm4gd3JhcHBlZC5yZWFkRG91YmxlKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJpbmcoKSA6IFN0cmluZyB7CisgICAgICAgIHJldHVybiB3cmFwcGVkLnJlYWRTdHJpbmcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEJpbmFyeSgpIDogQnl0ZXMgeworICAgICAgICByZXR1cm4gd3JhcHBlZC5yZWFkQmluYXJ5KCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIEluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkgOiBWb2lkIHsKKyAgICAgICAgcmV0dXJuIHdyYXBwZWQuSW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKSA6IFZvaWQgeworICAgICAgICByZXR1cm4gd3JhcHBlZC5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xFeGNlcHRpb24uaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sRXhjZXB0aW9uLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzYjM3YTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sRXhjZXB0aW9uLmh4CkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CisKK2NsYXNzIFRQcm90b2NvbEV4Y2VwdGlvbiBleHRlbmRzIFRFeGNlcHRpb24geworCisgICAgLy8gV0FSTklORzogVGhlc2UgYXJlIHN1YmplY3QgdG8gYmUgZXh0ZW5kZWQgaW4gdGhlIGZ1dHVyZSwgc28gd2UgY2FuJ3QgdXNlIGVudW1zCisgICAgLy8gd2l0aCBIYXhlIDMuMS4zIGJlY2F1c2Ugb2YgaHR0cHM6Ly9naXRodWIuY29tL0hheGVGb3VuZGF0aW9uL2hheGUvaXNzdWVzLzM2NDkKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgVU5LTk9XTiA6IEludCA9IDA7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIElOVkFMSURfREFUQSA6IEludCA9IDE7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIE5FR0FUSVZFX1NJWkUgOiBJbnQgPSAyOworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBTSVpFX0xJTUlUIDogSW50ID0gMzsKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgQkFEX1ZFUlNJT04gOiBJbnQgPSA0OworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBOT1RfSU1QTEVNRU5URUQgOiBJbnQgPSA1OworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBERVBUSF9MSU1JVCA6IEludCA9IDY7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KGVycm9yIDogSW50ID0gVU5LTk9XTiwgbWVzc2FnZSA6IFN0cmluZyA9ICIiKSB7CisgICAgICBzdXBlcihtZXNzYWdlLCBlcnJvcik7CisgICAgfQorCisKK30gClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbEZhY3RvcnkuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sRmFjdG9yeS5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzJkNjJlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbEZhY3RvcnkuaHgKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQ7CisKK2ludGVyZmFjZSBUUHJvdG9jb2xGYWN0b3J5IHsKKyAgICAgZnVuY3Rpb24gZ2V0UHJvdG9jb2wodHJhbnM6VFRyYW5zcG9ydCk6VFByb3RvY29sOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xVdGlsLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbFV0aWwuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAxZTQwNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xVdGlsLmh4CkBAIC0wLDAgKzEsMTEwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC4qOworCisgIC8qKgorICAgKiBVdGlsaXR5IGNsYXNzIHdpdGggc3RhdGljIG1ldGhvZHMgZm9yIGludGVyYWN0aW5nIHdpdGggcHJvdG9jb2wgZGF0YQorICAgKiBzdHJlYW1zLgorICAgKgorICAgKi8KK2NsYXNzIFRQcm90b2NvbFV0aWwgeworCisgICAgLyoqCisgICAgICogU2tpcHMgb3ZlciB0aGUgbmV4dCBkYXRhIGVsZW1lbnQgZnJvbSB0aGUgcHJvdmlkZWQgaW5wdXQgVFByb3RvY29sIG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm90ICB0aGUgcHJvdG9jb2wgb2JqZWN0IHRvIHJlYWQgZnJvbQorICAgICAqIEBwYXJhbSB0eXBlICB0aGUgbmV4dCB2YWx1ZSB3aWxsIGJlIGludGVwcmV0ZWQgYXMgdGhpcyBUVHlwZSB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNraXAocHJvdDpUUHJvdG9jb2wsIHR5cGUgOiBJbnQpIDogVm9pZCB7CisgICAgICAgIHByb3QuSW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuQk9PTDoKKyAgICAgICAgICAgICAgICAgICAgcHJvdC5yZWFkQm9vbCgpOworCisgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5CWVRFOgorICAgICAgICAgICAgICAgICAgICBwcm90LnJlYWRCeXRlKCk7CisKKyAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLkkxNjoKKyAgICAgICAgICAgICAgICAgICAgcHJvdC5yZWFkSTE2KCk7CisKKyAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLkkzMjoKKyAgICAgICAgICAgICAgICAgICAgcHJvdC5yZWFkSTMyKCk7CisKKyAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLkk2NDoKKyAgICAgICAgICAgICAgICAgICAgcHJvdC5yZWFkSTY0KCk7CisKKyAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLkRPVUJMRToKKyAgICAgICAgICAgICAgICAgICAgcHJvdC5yZWFkRG91YmxlKCk7CisKKyAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLlNUUklORzoKKyAgICAgICAgICAgICAgICAgICAgcHJvdC5yZWFkQmluYXJ5KCk7CisKKyAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLlNUUlVDVDoKKyAgICAgICAgICAgICAgICAgICAgcHJvdC5yZWFkU3RydWN0QmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaWVsZDpURmllbGQgPSBwcm90LnJlYWRGaWVsZEJlZ2luKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5TVE9QKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgc2tpcChwcm90LCBmaWVsZC50eXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3QucmVhZEZpZWxkRW5kKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHJvdC5yZWFkU3RydWN0RW5kKCk7CisKKyAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLk1BUDoKKyAgICAgICAgICAgICAgICAgICAgdmFyIG1hcDpUTWFwID0gcHJvdC5yZWFkTWFwQmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpIGluIDAgLi4uIG1hcC5zaXplKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBza2lwKHByb3QsIG1hcC5rZXlUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNraXAocHJvdCwgbWFwLnZhbHVlVHlwZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHJvdC5yZWFkTWFwRW5kKCk7CisKKyAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLlNFVDoKKyAgICAgICAgICAgICAgICAgICAgdmFyIHNldDpUU2V0ID0gcHJvdC5yZWFkU2V0QmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChqIGluIDAgLi4uIHNldC5zaXplKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBza2lwKHByb3QsIHNldC5lbGVtVHlwZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHJvdC5yZWFkU2V0RW5kKCk7CisKKyAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLkxJU1Q6CisgICAgICAgICAgICAgICAgICAgIHZhciBsaXN0OlRMaXN0ID0gcHJvdC5yZWFkTGlzdEJlZ2luKCk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoayBpbiAwIC4uLiBsaXN0LnNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNraXAocHJvdCwgbGlzdC5lbGVtVHlwZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHJvdC5yZWFkTGlzdEVuZCgpOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKwkJCQkJdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uVU5LTk9XTiwgIlVua25vd24gZmllbGQgdHlwZSAke3R5cGV9Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByb3QuRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaChlOkR5bmFtaWMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHByb3QuRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsKKyAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUmVjdXJzaW9uVHJhY2tlci5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUmVjdXJzaW9uVHJhY2tlci5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjAyMTFiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RSZWN1cnNpb25UcmFja2VyLmh4CkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0Lio7CisKKworY2xhc3MgVFJlY3Vyc2lvblRyYWNrZXIgeworCisgICAgLy8gZGVmYXVsdAorICAgIHByaXZhdGUgc3RhdGljIGlubGluZSB2YXIgREVGQVVMVF9SRUNVUlNJT05fREVQVEggOiBJbnQgPSA2NDsKKworICAgIC8vIGxpbWl0IGFuZCBhY3R1YWwgdmFsdWUKKyAgICBwdWJsaWMgdmFyIHJlY3Vyc2lvbkxpbWl0IDogSW50ID0gREVGQVVMVF9SRUNVUlNJT05fREVQVEg7CisgICAgcHJpdmF0ZSB2YXIgcmVjdXJzaW9uRGVwdGggOiBJbnQgPSAwOworCisgICAgcHVibGljIGZ1bmN0aW9uIEluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkgOiBWb2lkCisgICAgeworICAgICAgICBpZiAocmVjdXJzaW9uRGVwdGggPCByZWN1cnNpb25MaW1pdCkKKyAgICAgICAgICAgICsrcmVjdXJzaW9uRGVwdGg7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLkRFUFRIX0xJTUlULCAiRGVwdGggbGltaXQgZXhjZWVkZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKSA6IFZvaWQKKyAgICB7CisgICAgICAgIC0tcmVjdXJzaW9uRGVwdGg7CisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UU2V0Lmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RTZXQuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRlYWIzNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UU2V0Lmh4CkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKKworY2xhc3MgVFNldCB7CisKKyAgICBwdWJsaWMgdmFyIGVsZW1UeXBlIDogSW50OworICAgIHB1YmxpYyB2YXIgc2l6ZSA6IEludDsKKworICAgICAgcHVibGljIGZ1bmN0aW9uIG5ldyh0IDogSW50ID0gMCwgcyA6IEludCA9IDApIHsKKyAgICAgICAgZWxlbVR5cGUgPSB0OworICAgICAgICBzaXplID0gczsKKyAgICAgIH0KKworfSAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFN0cnVjdC5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UU3RydWN0Lmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllMGI3ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFN0cnVjdC5oeApAQCAtMCwwICsxLDMwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7CisKK2NsYXNzIFRTdHJ1Y3QgeworCisgICAgcHVibGljIHZhciBuYW1lIDogU3RyaW5nOworCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldyhuIDogU3RyaW5nID0gIiIpIHsKKyAgICAgIG5hbWUgPSBuOworICAgIH0KKworfSAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RUeXBlLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RUeXBlLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhYmJjOTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFR5cGUuaHgKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOworCitAOmVudW0KK2Fic3RyYWN0IFRUeXBlKEludCkgIGZyb20gSW50IHRvIEludCAgeworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBTVE9QIDogSW50ICAgPSAwOworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBWT0lEIDogSW50ICAgPSAxOworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBCT09MIDogSW50ICAgPSAyOworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBCWVRFIDogSW50ICAgPSAzOworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBET1VCTEUgOiBJbnQgPSA0OworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBJMTYgOiBJbnQgICAgPSA2OworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBJMzIgOiBJbnQgICAgPSA4OworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBJNjQgOiBJbnQgICAgPSAxMDsKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgU1RSSU5HIDogSW50ID0gMTE7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIFNUUlVDVCA6IEludCA9IDEyOworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBNQVAgOiBJbnQgICAgPSAxMzsKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgU0VUIDogSW50ICAgID0gMTQ7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIExJU1QgOiBJbnQgICA9IDE1OworfQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UU2VydmVyLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UU2VydmVyLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2ZWVlMGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RTZXJ2ZXIuaHgKQEAgLTAsMCArMSwxMTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0Lio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLio7CisKK2NsYXNzIFRTZXJ2ZXIKK3sKKyAgICBwcml2YXRlIHZhciBwcm9jZXNzb3IgOiBUUHJvY2Vzc29yID0gbnVsbDsKKyAgICBwcml2YXRlIHZhciBzZXJ2ZXJUcmFuc3BvcnQgOiBUU2VydmVyVHJhbnNwb3J0ID0gbnVsbDsKKyAgICBwcml2YXRlIHZhciBpbnB1dFRyYW5zcG9ydEZhY3RvcnkgOiBUVHJhbnNwb3J0RmFjdG9yeSA9IG51bGw7CisgICAgcHJpdmF0ZSB2YXIgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSA6IFRUcmFuc3BvcnRGYWN0b3J5ID0gbnVsbDsKKyAgICBwcml2YXRlIHZhciBpbnB1dFByb3RvY29sRmFjdG9yeSA6IFRQcm90b2NvbEZhY3RvcnkgPSBudWxsOworICAgIHByaXZhdGUgdmFyIG91dHB1dFByb3RvY29sRmFjdG9yeSA6IFRQcm90b2NvbEZhY3RvcnkgPSBudWxsOworCisgICAgLy8gc2VydmVyIGV2ZW50cworICAgIHB1YmxpYyB2YXIgc2VydmVyRXZlbnRIYW5kbGVyIDogVFNlcnZlckV2ZW50SGFuZGxlciA9IG51bGw7CisKKyAgICAvLyBMb2cgZGVsZWdhdGlvbgorICAgIHByaXZhdGUgdmFyIF9sb2dEZWxlZ2F0ZSA6IER5bmFtaWMtPlZvaWQgID0gbnVsbDsKKyAgICBwdWJsaWMgdmFyIGxvZ0RlbGVnYXRlKGdldCxzZXQpIDogRHluYW1pYy0+Vm9pZDsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcoIHByb2Nlc3NvciA6IFRQcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0IDogVFNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFRyYW5zcG9ydEZhY3RvcnkgOiBUVHJhbnNwb3J0RmFjdG9yeSA9IG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSA6IFRUcmFuc3BvcnRGYWN0b3J5ID0gbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSA6IFRQcm90b2NvbEZhY3RvcnkgPSBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFByb3RvY29sRmFjdG9yeSA6IFRQcm90b2NvbEZhY3RvcnkgPSBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ0RlbGVnYXRlIDogRHluYW1pYy0+Vm9pZCA9IG51bGwpCisgICAgeworICAgICAgdGhpcy5wcm9jZXNzb3IgPSBwcm9jZXNzb3I7CisgICAgICB0aGlzLnNlcnZlclRyYW5zcG9ydCA9IHNlcnZlclRyYW5zcG9ydDsKKyAgICAgIHRoaXMuaW5wdXRUcmFuc3BvcnRGYWN0b3J5ID0gaW5wdXRUcmFuc3BvcnRGYWN0b3J5OworICAgICAgdGhpcy5vdXRwdXRUcmFuc3BvcnRGYWN0b3J5ID0gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeTsKKyAgICAgIHRoaXMuaW5wdXRQcm90b2NvbEZhY3RvcnkgPSBpbnB1dFByb3RvY29sRmFjdG9yeTsKKyAgICAgIHRoaXMub3V0cHV0UHJvdG9jb2xGYWN0b3J5ID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5OworICAgICAgdGhpcy5sb2dEZWxlZ2F0ZSA9IGxvZ0RlbGVnYXRlOworCisgICAgICBBcHBseU1pc3NpbmdEZWZhdWx0cygpOworICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gQXBwbHlNaXNzaW5nRGVmYXVsdHMoKSB7CisgICAgICAgIGlmKCBwcm9jZXNzb3IgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93ICJJbnZhbGlkIHNlcnZlciBjb25maWd1cmF0aW9uOiBwcm9jZXNzb3IgbWlzc2luZyI7CisgICAgICAgIGlmKCBzZXJ2ZXJUcmFuc3BvcnQgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93ICJJbnZhbGlkIHNlcnZlciBjb25maWd1cmF0aW9uOiBzZXJ2ZXJUcmFuc3BvcnQgbWlzc2luZyI7CisgICAgICAgIGlmKCBpbnB1dFRyYW5zcG9ydEZhY3RvcnkgPT0gbnVsbCkKKyAgICAgICAgICAgIGlucHV0VHJhbnNwb3J0RmFjdG9yeSA9IG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpOworICAgICAgICBpZiggb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSAgPT0gbnVsbCkKKyAgICAgICAgICAgIG91dHB1dFRyYW5zcG9ydEZhY3RvcnkgPSBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKTsKKyAgICAgICAgaWYoIGlucHV0UHJvdG9jb2xGYWN0b3J5ICA9PSBudWxsKQorICAgICAgICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnkgPSBuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpOworICAgICAgICBpZiggb3V0cHV0UHJvdG9jb2xGYWN0b3J5ID09IG51bGwpCisgICAgICAgICAgICBvdXRwdXRQcm90b2NvbEZhY3Rvcnk9IG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCk7CisgICAgICAgIGlmKCBsb2dEZWxlZ2F0ZSA9PSBudWxsKQorICAgICAgICAgICAgbG9nRGVsZWdhdGUgPSBEZWZhdWx0TG9nRGVsZWdhdGU7CisgICAgfQorCisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIHNldF9sb2dEZWxlZ2F0ZSh2YWx1ZSA6IER5bmFtaWMtPlZvaWQpIDogRHluYW1pYy0+Vm9pZCB7CisgICAgICAgIGlmKHZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgIF9sb2dEZWxlZ2F0ZSA9IHZhbHVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgX2xvZ0RlbGVnYXRlID0gRGVmYXVsdExvZ0RlbGVnYXRlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBfbG9nRGVsZWdhdGU7CisgICAgfQorCisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIGdldF9sb2dEZWxlZ2F0ZSgpIDogRHluYW1pYy0+Vm9pZCB7CisgICAgICAgIHJldHVybiBfbG9nRGVsZWdhdGU7CisgICAgfQorCisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIERlZmF1bHRMb2dEZWxlZ2F0ZSh2YWx1ZSA6IER5bmFtaWMpIDogVm9pZCAgeworICAgICAgICB0cmFjZSggdmFsdWUpOworICAgIH0KKworCisKKyAgICBwdWJsaWMgZnVuY3Rpb24gU2VydmUoKSA6IFZvaWQgeworICAgICAgICB0aHJvdyBuZXcgQWJzdHJhY3RNZXRob2RFcnJvcigpOworICAgIH0KKworCisgICAgcHVibGljIGZ1bmN0aW9uIFN0b3AoKSA6IFZvaWQgeworICAgICAgICB0aHJvdyBuZXcgQWJzdHJhY3RNZXRob2RFcnJvcigpOworICAgIH0KKworfQorIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVFNlcnZlckV2ZW50SGFuZGxlci5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVFNlcnZlckV2ZW50SGFuZGxlci5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmM5OTI3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UU2VydmVyRXZlbnRIYW5kbGVyLmh4CkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLio7CisKKworLy8gSW50ZXJmYWNlIGltcGxlbWVudGVkIGJ5IHNlcnZlciB1c2VycyB0byBoYW5kbGUgZXZlbnRzIGZyb20gdGhlIHNlcnZlcgoraW50ZXJmYWNlIFRTZXJ2ZXJFdmVudEhhbmRsZXIgeworCisgICAgLy8gQ2FsbGVkIGJlZm9yZSB0aGUgc2VydmVyIGJlZ2lucworICAgIGZ1bmN0aW9uIHByZVNlcnZlKCkgOiBWb2lkOworCisgICAgLy8gQ2FsbGVkIHdoZW4gYSBuZXcgY2xpZW50IGhhcyBjb25uZWN0ZWQgYW5kIGlzIGFib3V0IHRvIGJlaW5nIHByb2Nlc3NpbmcKKyAgICBmdW5jdGlvbiBjcmVhdGVDb250ZXh0KCBpbnB1dCA6IFRQcm90b2NvbCwgb3V0cHV0IDogVFByb3RvY29sKSA6IER5bmFtaWM7CisKKyAgICAvLyBDYWxsZWQgd2hlbiBhIGNsaWVudCBoYXMgZmluaXNoZWQgcmVxdWVzdC1oYW5kbGluZyB0byBkZWxldGUgc2VydmVyIGNvbnRleHQKKyAgICBmdW5jdGlvbiBkZWxldGVDb250ZXh0KCBzZXJ2ZXJDb250ZXh0IDogRHluYW1pYywgaW5wdXQgOiBUUHJvdG9jb2wsIG91dHB1dCA6IFRQcm90b2NvbCkgOiBWb2lkOworCisgICAgLy8gQ2FsbGVkIHdoZW4gYSBjbGllbnQgaXMgYWJvdXQgdG8gY2FsbCB0aGUgcHJvY2Vzc29yCisgICAgZnVuY3Rpb24gcHJvY2Vzc0NvbnRleHQoIHNlcnZlckNvbnRleHQgOiBEeW5hbWljLCB0cmFuc3BvcnQgOiBUVHJhbnNwb3J0KSA6IFZvaWQ7Cit9CmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDYwMDc0NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5oeApAQCAtMCwwICsxLDE0MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0Lio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuKjsKKworLy8gU2ltcGxlIHNpbmdsZS10aHJlYWRlZCBzZXJ2ZXIgZm9yIHRlc3RpbmcKK2NsYXNzIFRTaW1wbGVTZXJ2ZXIgZXh0ZW5kcyBUU2VydmVyICB7CisKKyAgICBwcml2YXRlIHZhciBzdG9wIDogQm9vbCA9IGZhbHNlOworCisgICAgLy9zdG9wcyBqdXN0IGFmdGVyIGlucHV0IHRyYW5zcG9ydCByZXR1cm5zIEVPRgorICAgIC8vdXNlZnVsIGZvciBsaW1pdGVkIHNjZW5hcmlvcywgbGlrZSBlbWJlZGluZyBpbnRvIHBocCBzZXJ2ZXIKKyAgICBwdWJsaWMgdmFyIHJ1bk9uY2UgOiBCb29sID0gZmFsc2U7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KCBwcm9jZXNzb3IgOiBUUHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlclRyYW5zcG9ydCA6IFRTZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSA6IFRUcmFuc3BvcnRGYWN0b3J5ID0gbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbEZhY3RvcnkgOiBUUHJvdG9jb2xGYWN0b3J5ID0gbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIgOiBEeW5hbWljLT5Wb2lkID0gbnVsbCkgeworICAgICAgc3VwZXIoIHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgcHJvdG9jb2xGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgbG9nZ2VyKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBTZXJ2ZSgpIDogVm9pZAorICAgIHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHNlcnZlclRyYW5zcG9ydC5MaXN0ZW4oKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAodHR4IDogVFRyYW5zcG9ydEV4Y2VwdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgbG9nRGVsZWdhdGUodHR4KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEZpcmUgdGhlIHByZVNlcnZlIHNlcnZlciBldmVudCB3aGVuIHNlcnZlciBpcyB1cCwKKyAgICAgICAgLy8gYnV0IGJlZm9yZSBhbnkgY2xpZW50IGNvbm5lY3Rpb25zCisgICAgICAgIGlmIChzZXJ2ZXJFdmVudEhhbmRsZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgc2VydmVyRXZlbnRIYW5kbGVyLnByZVNlcnZlKCk7CisgICAgICAgIH0KKworICAgICAgICB3aGlsZSggISBzdG9wKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgY2xpZW50IDogVFRyYW5zcG9ydCA9IG51bGw7CisgICAgICAgICAgICB2YXIgaW5wdXRUcmFuc3BvcnQgOiBUVHJhbnNwb3J0ID0gbnVsbDsKKyAgICAgICAgICAgIHZhciBvdXRwdXRUcmFuc3BvcnQgOiBUVHJhbnNwb3J0ID0gbnVsbDsKKyAgICAgICAgICAgIHZhciBpbnB1dFByb3RvY29sIDogVFByb3RvY29sID0gbnVsbDsKKyAgICAgICAgICAgIHZhciBvdXRwdXRQcm90b2NvbCA6IFRQcm90b2NvbCA9IG51bGw7CisgICAgICAgICAgICB2YXIgY29ubmVjdGlvbkNvbnRleHQgOiBEeW5hbWljID0gbnVsbDsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNsaWVudCA9IHNlcnZlclRyYW5zcG9ydC5BY2NlcHQoKTsKKyAgICAgICAgICAgICAgICBpZiAoY2xpZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRUcmFuc3BvcnQgPSBpbnB1dFRyYW5zcG9ydEZhY3RvcnkuZ2V0VHJhbnNwb3J0KCBjbGllbnQpOworICAgICAgICAgICAgICAgICAgICBvdXRwdXRUcmFuc3BvcnQgPSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LmdldFRyYW5zcG9ydCggY2xpZW50KTsKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRQcm90b2NvbCA9IGlucHV0UHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKCBpbnB1dFRyYW5zcG9ydCk7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dFByb3RvY29sID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKCBvdXRwdXRUcmFuc3BvcnQpOworCisgICAgICAgICAgICAgICAgICAgIC8vIFJlY292ZXIgZXZlbnQgaGFuZGxlciAoaWYgYW55KSBhbmQgZmlyZSBjcmVhdGVDb250ZXh0CisgICAgICAgICAgICAgICAgICAgIC8vIHNlcnZlciBldmVudCB3aGVuIGEgY2xpZW50IGNvbm5lY3RzCisgICAgICAgICAgICAgICAgICAgIGlmIChzZXJ2ZXJFdmVudEhhbmRsZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbkNvbnRleHQgPSBzZXJ2ZXJFdmVudEhhbmRsZXIuY3JlYXRlQ29udGV4dChpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBQcm9jZXNzIGNsaWVudCByZXF1ZXN0cyB1bnRpbCBjbGllbnQgZGlzY29ubmVjdHMKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUoIHRydWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpcmUgcHJvY2Vzc0NvbnRleHQgc2VydmVyIGV2ZW50CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBOLkIuIFRoaXMgaXMgdGhlIHBhdHRlcm4gaW1wbGVtZW50ZWQgaW4gQysrIGFuZCB0aGUgZXZlbnQgZmlyZXMgcHJvdmlzaW9uYWxseS4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoYXQgaXMgdG8gc2F5IGl0IG1heSBiZSBtYW55IG1pbnV0ZXMgYmV0d2VlbiB0aGUgZXZlbnQgZmlyaW5nIGFuZCB0aGUgY2xpZW50IHJlcXVlc3QKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFjdHVhbGx5IGFycml2aW5nIG9yIHRoZSBjbGllbnQgbWF5IGhhbmcgdXAgd2l0aG91dCBldmVyIG1ha2VpbmcgYSByZXF1ZXN0LgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZlckV2ZW50SGFuZGxlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyRXZlbnRIYW5kbGVyLnByb2Nlc3NDb250ZXh0KGNvbm5lY3Rpb25Db250ZXh0LCBpbnB1dFRyYW5zcG9ydCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vUHJvY2VzcyBjbGllbnQgcmVxdWVzdCAoYmxvY2tzIHVudGlsIHRyYW5zcG9ydCBpcyByZWFkYWJsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAhIHByb2Nlc3Nvci5wcm9jZXNzKCBpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoKCB0dHggOiBUVHJhbnNwb3J0RXhjZXB0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIFVzdWFsbHkgYSBjbGllbnQgZGlzY29ubmVjdCwgZXhwZWN0ZWQKKyAgICAgICAgICAgICAgICBpZihydW5PbmNlICYmIHR0eC5lcnJvcklEID09IFRUcmFuc3BvcnRFeGNlcHRpb24uRU5EX09GX0ZJTEUpIHsKKyAgICAgICAgICAgICAgICAgIC8vaW5wdXQgcmV0dXJucyBlb2YsIGV4aXQKKyAgICAgICAgICAgICAgICAgIC8vZm9sbG93cyBsaWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RTZXJ2ZXJGcmFtZXdvcmsuY3BwCisgICAgICAgICAgICAgICAgICBTdG9wKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2goIHBleCA6IFRQcm90b2NvbEV4Y2VwdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2dEZWxlZ2F0ZSgnJHBleCAke3BleC5lcnJvcklEfSAke3BleC5lcnJvck1zZ30nKTsgLy8gVW5leHBlY3RlZAorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2goIGUgOiBEeW5hbWljKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvZ0RlbGVnYXRlKGUpOyAvLyBVbmV4cGVjdGVkCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKGNsaWVudCAhPSBudWxsICYmICFydW5PbmNlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNsaWVudC5jbG9zZSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBGaXJlIGRlbGV0ZUNvbnRleHQgc2VydmVyIGV2ZW50IGFmdGVyIGNsaWVudCBkaXNjb25uZWN0cworICAgICAgICAgICAgaWYgKHNlcnZlckV2ZW50SGFuZGxlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc2VydmVyRXZlbnRIYW5kbGVyLmRlbGV0ZUNvbnRleHQoY29ubmVjdGlvbkNvbnRleHQsIGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBTdG9wKCkgOiBWb2lkCisgICAgeworICAgICAgc3RvcCA9IHRydWU7CisgICAgICBzZXJ2ZXJUcmFuc3BvcnQuQ2xvc2UoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJlZFRyYW5zcG9ydC5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEJ1ZmZlcmVkVHJhbnNwb3J0Lmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiMzNmY2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJlZFRyYW5zcG9ydC5oeApAQCAtMCwwICsxLDE1NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC4qOworCitpbXBvcnQgaGF4ZS5pby5Fb2Y7CitpbXBvcnQgaGF4ZS5pby5CeXRlczsKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzQnVmZmVyOworaW1wb3J0IGhheGUuaW8uQnl0ZXNPdXRwdXQ7CitpbXBvcnQgaGF4ZS5pby5CeXRlc0lucHV0OworCisKK2NsYXNzIFRCdWZmZXJlZFRyYW5zcG9ydCBleHRlbmRzIFRUcmFuc3BvcnQKK3sKKyAgICAvLyBjb25zdGFudHMKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgREVGQVVMVF9CVUZTSVpFIDogSW50ID0gMHgxMDAwOyAgICAvLyA0MDk2IEJ5dGVzCisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIE1JTl9CVUZTSVpFIDogSW50ID0gMHgxMDA7ICAgICAgICAgLy8gMjU2IEJ5dGVzCisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIE1BWF9CVUZTSVpFIDogSW50ID0gMHgxMDAwMDA7ICAgICAgLy8gMSBNQgorCisgICAgLy8gVW5kZXJseWluZyB0cmFuc3BvcnQKKyAgICBwdWJsaWMgdmFyIHRyYW5zcG9ydChkZWZhdWx0LG51bGwpIDogIFRUcmFuc3BvcnQgPSBudWxsOworCisgICAgLy8gQnVmZmVyIGZvciBpbnB1dC9vdXRwdXQKKyAgICBwcml2YXRlIHZhciByZWFkQnVmZmVyXyA6IEJ5dGVzSW5wdXQgPSBudWxsOworICAgIHByaXZhdGUgdmFyIHdyaXRlQnVmZmVyXyA6IEJ5dGVzT3V0cHV0ID0gbnVsbDsKKyAgICBwcml2YXRlIHZhciBidWZTaXplIDogSW50OworCisgICAgLy8gQ29uc3RydWN0b3Igd3JhcHMgYXJvdW5kIGFub3RoZXIgdHJhbnNwb3J0CisgICAgcHVibGljIGZ1bmN0aW9uIG5ldyggdHJhbnNwb3J0IDogVFRyYW5zcG9ydCwgYnVmU2l6ZSA6IEludCA9IERFRkFVTFRfQlVGU0laRSkgeworCisgICAgICAgIC8vIGVuc3VyZSBidWZmZXIgc2l6ZSBpcyBpbiB0aGUgcmFuZ2UKKyAgICAgICAgaWYgKCBidWZTaXplIDwgTUlOX0JVRlNJWkUpCisgICAgICAgICAgICBidWZTaXplID0gTUlOX0JVRlNJWkU7CisgICAgICAgIGVsc2UgaWYoIGJ1ZlNpemUgPiBNQVhfQlVGU0laRSkKKyAgICAgICAgICAgIGJ1ZlNpemUgPSBNQVhfQlVGU0laRTsKKworICAgICAgICB0aGlzLnRyYW5zcG9ydCA9IHRyYW5zcG9ydDsKKyAgICAgICAgdGhpcy5idWZTaXplID0gYnVmU2l6ZTsKKyAgICAgICAgdGhpcy53cml0ZUJ1ZmZlcl8gPSBuZXcgQnl0ZXNPdXRwdXQoKTsKKyAgICAgICAgdGhpcy53cml0ZUJ1ZmZlcl8uYmlnRW5kaWFuID0gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gb3BlbigpIDogVm9pZCB7CisgICAgICAgIHRyYW5zcG9ydC5vcGVuKCk7CisgICAgfQorCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIGlzT3BlbigpIDogQm9vbCB7CisgICAgICAgIHJldHVybiB0cmFuc3BvcnQuaXNPcGVuKCk7CisgICAgfQorCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIGNsb3NlKCkgOiBWb2lkIHsKKyAgICAgICAgdHJhbnNwb3J0LmNsb3NlKCk7CisgICAgfQorCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIHJlYWQoYnVmIDogQnl0ZXNCdWZmZXIsIG9mZiA6IEludCwgbGVuIDogSW50KSA6IEludCB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB2YXIgZGF0YSA9IEJ5dGVzLmFsbG9jKGxlbik7CisKKyAgICAgICAgICAgIHdoaWxlKCB0cnVlKSB7CisgICAgICAgICAgICAgICAgaWYgKChyZWFkQnVmZmVyXyAhPSBudWxsKSAmJiAocmVhZEJ1ZmZlcl8ucG9zaXRpb24gPCByZWFkQnVmZmVyXy5sZW5ndGgpKSB7CisgICAgICAgICAgICAgICAgICAgIHZhciBnb3QgPSByZWFkQnVmZmVyXy5yZWFkQnl0ZXMoZGF0YSwgMCwgbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGdvdCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zi5hZGRCeXRlcyhkYXRhLCAwLCBnb3QpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdvdDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIHRoZXJlIGlzIG5vIHBvaW50IGluIGJ1ZmZlcmluZyB3aGVuZXZlciB0aGUKKyAgICAgICAgICAgICAgICAvLyByZW1haW5pbmcgbGVuZ3RoIGV4Y2VlZHMgdGhlIGJ1ZmZlciBzaXplCisgICAgICAgICAgICAgICAgaWYgKCBsZW4gPj0gYnVmU2l6ZSkgeworICAgICAgICAgICAgICAgICAgICB2YXIgZ290ID0gdHJhbnNwb3J0LnJlYWQoIGJ1Ziwgb2ZmLCBsZW4pOworICAgICAgICAgICAgICAgICAgICBpZiAoZ290ID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnVmLmFkZEJ5dGVzKGRhdGEsIDAsIGdvdCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ290OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gZmlsbCB0aGUgYnVmZmVyCisgICAgICAgICAgICAgICAgaWYgKCByZWFkQ2h1bmsoKSA8PSAwKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FTkRfT0ZfRklMRSwgJ0NhblwndCByZWFkICRsZW4gYnl0ZXMhJyk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKGVvZiA6IEVvZikgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FTkRfT0ZfRklMRSwgJ0NhblwndCByZWFkICRsZW4gYnl0ZXMhJyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmdW5jdGlvbiByZWFkQ2h1bmsoKSA6IEludCB7CisgICAgICAgIHZhciBzaXplID0gYnVmU2l6ZTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHZhciBidWZmZXIgPSBuZXcgQnl0ZXNCdWZmZXIoKTsKKyAgICAgICAgICAgIHNpemUgPSB0cmFuc3BvcnQucmVhZCggYnVmZmVyLCAwLCBzaXplKTsKKyAgICAgICAgICAgIHJlYWRCdWZmZXJfID0gbmV3IEJ5dGVzSW5wdXQoIGJ1ZmZlci5nZXRCeXRlcygpLCAwLCBzaXplKTsKKyAgICAgICAgICAgIHJlYWRCdWZmZXJfLmJpZ0VuZGlhbiA9IHRydWU7CisgICAgICAgICAgICByZXR1cm4gc2l6ZTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaChlb2YgOiBFb2YpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRU5EX09GX0ZJTEUsICdDYW5cJ3QgcmVhZCAkc2l6ZSBieXRlcyEnKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gd3JpdGVDaHVuayhmb3JjZVdyaXRlIDogQm9vbCkgOiBWb2lkIHsKKyAgICAgICAgaWYoIHdyaXRlQnVmZmVyXy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICBpZiAoIGZvcmNlV3JpdGUgfHwgKHdyaXRlQnVmZmVyXy5sZW5ndGggPj0gYnVmU2l6ZSkpIHsKKyAgICAgICAgICAgICAgICB2YXIgYnVmID0gd3JpdGVCdWZmZXJfLmdldEJ5dGVzKCk7CisgICAgICAgICAgICAgICAgd3JpdGVCdWZmZXJfID0gbmV3IEJ5dGVzT3V0cHV0KCk7CisgICAgICAgICAgICAgICAgd3JpdGVCdWZmZXJfLmJpZ0VuZGlhbiA9IHRydWU7CisgICAgICAgICAgICAgICAgdHJhbnNwb3J0LndyaXRlKGJ1ZiwgMCwgYnVmLmxlbmd0aCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gd3JpdGUoYnVmIDogQnl0ZXMsIG9mZiA6IEludCwgbGVuIDogSW50KSA6IFZvaWQgeworICAgICAgICB2YXIgaGFsZlNpemUgOiBJbnQgPSBTdGQuaW50KGJ1ZlNpemUgLyAyKTsKKworICAgICAgICAvLyBObyBwb2ludCBpbiBidWZmZXJpbmcgaWYgbGVuIGV4Y2VlZHMgdGhlIGJ1ZmZlciBzaXplLgorICAgICAgICAvLyBIb3dldmVyLCBpZiB0aGUgYnVmZmVyIGlzIGxlc3MgdGhhbiBoYWxmIGZ1bGwgd2Ugc2hvdWxkIHN0aWxsIGNvbnNpZGVyCisgICAgICAgIC8vIHNxdWFzaGluZyBhbGwgaW50byBvbmUgd3JpdGUsIGV4Y2VwdCB3aGVuIHRoZSBhY3R1YWwgd3JpdGUgbGVuIGlzIHZlcnkgbGFyZ2UuCisgICAgICAgIHZhciBodWdlX3dyaXRlIDogQm9vbCA9IChsZW4gPj0gKDIgKiBidWZTaXplKSk7CisgICAgICAgIHZhciBleGNlZWRzX2J1ZiA6IEJvb2wgPSBodWdlX3dyaXRlIHx8IChsZW4gPj0gYnVmU2l6ZSk7CisgICAgICAgIHZhciB3cml0ZV90aHJ1IDogQm9vbCA9IGV4Y2VlZHNfYnVmICYmICh3cml0ZUJ1ZmZlcl8ubGVuZ3RoID49IGhhbGZTaXplKTsKKyAgICAgICAgaWYgKCB3cml0ZV90aHJ1KSB7CisgICAgICAgICAgICB3cml0ZUNodW5rKHRydWUpOyAvLyBmb3JjZSBzZW5kIHdoYXRldmVyIHdlIGhhdmUgaW4gdGhlcmUKKyAgICAgICAgICAgIHRyYW5zcG9ydC53cml0ZShidWYsIG9mZiwgbGVuKTsgIC8vIHdyaXRlIHRocnUKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHdyaXRlQnVmZmVyXy53cml0ZUJ5dGVzKGJ1Ziwgb2ZmLCBsZW4pOworICAgICAgICAgICAgd3JpdGVDaHVuayhmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gZmx1c2goIGNhbGxiYWNrIDogRHluYW1pYy0+Vm9pZCA9bnVsbCkgOiBWb2lkIHsKKyAgICAgICAgd3JpdGVDaHVuayh0cnVlKTsKKyAgICAgICAgdHJhbnNwb3J0LmZsdXNoKGNhbGxiYWNrKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM5ZTcyMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeS5oeApAQCAtMCwwICsxLDM3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0Lio7CisKKworY2xhc3MgVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSBleHRlbmRzIFRUcmFuc3BvcnRGYWN0b3J5IHsKKworICAgIHByaXZhdGUgdmFyIGJ1ZlNpemUgOiBJbnQ7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KGJ1ZlNpemUgOiBJbnQgPSBUQnVmZmVyZWRUcmFuc3BvcnQuREVGQVVMVF9CVUZTSVpFKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIHRoaXMuYnVmU2l6ZSA9IGJ1ZlNpemU7CisgICAgfQorCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIGdldFRyYW5zcG9ydChiYXNlIDogVFRyYW5zcG9ydCkgOiBUVHJhbnNwb3J0IHsKKyAgICAgICAgcmV0dXJuIG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQoYmFzZSwgYnVmU2l6ZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9URmlsZVN0cmVhbS5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEZpbGVTdHJlYW0uaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q4YWQxNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEZpbGVTdHJlYW0uaHgKQEAgLTAsMCArMSwxMDEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CisKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzOworaW1wb3J0IGhheGUuaW8uQnl0ZXNCdWZmZXI7CitpbXBvcnQgaGF4ZS5pby5JbnB1dDsKK2ltcG9ydCBoYXhlLmlvLk91dHB1dDsKKworCitlbnVtIFRGaWxlTW9kZSB7CisgICAgQ3JlYXRlTmV3OworICAgIEFwcGVuZDsKKyAgICBSZWFkOworfQorCisKK2NsYXNzIFRGaWxlU3RyZWFtIGltcGxlbWVudHMgVFN0cmVhbSB7CisKKyAgICBwdWJsaWMgdmFyIEZpbGVOYW1lKGRlZmF1bHQsbnVsbCkgOiBTdHJpbmc7CisKKyAgICBwcml2YXRlIHZhciBJbnB1dCAgOiBzeXMuaW8uRmlsZUlucHV0OworICAgIHByaXZhdGUgdmFyIE91dHB1dCA6IHN5cy5pby5GaWxlT3V0cHV0OworCisKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KCBmbmFtZSA6IFN0cmluZywgbW9kZSA6IFRGaWxlTW9kZSkgeworICAgICAgICBGaWxlTmFtZSA9IGZuYW1lOworICAgICAgICBzd2l0Y2ggKCBtb2RlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIFRGaWxlTW9kZS5DcmVhdGVOZXc6CisgICAgICAgICAgICAgICAgT3V0cHV0ID0gc3lzLmlvLkZpbGUud3JpdGUoIGZuYW1lLCB0cnVlKTsKKworICAgICAgICAgICAgY2FzZSBURmlsZU1vZGUuQXBwZW5kOgorICAgICAgICAgICAgICAgIE91dHB1dCA9IHN5cy5pby5GaWxlLmFwcGVuZCggZm5hbWUsIHRydWUpOworCisgICAgICAgICAgICBjYXNlIFRGaWxlTW9kZS5SZWFkOgorICAgICAgICAgICAgICAgIElucHV0ID0gc3lzLmlvLkZpbGUucmVhZCggZm5hbWUsIHRydWUpOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCBUVHJhbnNwb3J0RXhjZXB0aW9uLlVOS05PV04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbnN1cHBvcnRlZCBtb2RlIik7CisgICAgICAgIH0KKworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBDbG9zZSgpIDogVm9pZCB7CisgICAgICAgIGlmKCBJbnB1dCAhPSBudWxsKSB7CisgICAgICAgICAgICBJbnB1dC5jbG9zZSgpOworICAgICAgICAgICAgSW5wdXQgPSBudWxsOworICAgICAgICB9CisgICAgICAgIGlmKCBPdXRwdXQgIT0gbnVsbCkgeworICAgICAgICAgICAgT3V0cHV0LmNsb3NlKCk7CisgICAgICAgICAgICBPdXRwdXQgPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIFBlZWsoKSA6IEJvb2wgeworICAgICAgICBpZiggSW5wdXQgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCBUVHJhbnNwb3J0RXhjZXB0aW9uLk5PVF9PUEVOLCAiRmlsZSBub3Qgb3BlbiBmb3IgaW5wdXQiKTsKKworICAgICAgICByZXR1cm4gKCEgSW5wdXQuZW9mKCkpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBSZWFkKCBidWYgOiBCeXRlcywgb2Zmc2V0IDogSW50LCBjb3VudCA6IEludCkgOiBJbnQgeworICAgICAgICBpZiggSW5wdXQgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCBUVHJhbnNwb3J0RXhjZXB0aW9uLk5PVF9PUEVOLCAiRmlsZSBub3Qgb3BlbiBmb3IgaW5wdXQiKTsKKworICAgICAgICByZXR1cm4gSW5wdXQucmVhZEJ5dGVzKCBidWYsIG9mZnNldCwgY291bnQpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBXcml0ZSggYnVmIDogQnl0ZXMsIG9mZnNldCA6IEludCwgY291bnQgOiBJbnQpIDogVm9pZCB7CisgICAgICAgIGlmKCBPdXRwdXQgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCBUVHJhbnNwb3J0RXhjZXB0aW9uLk5PVF9PUEVOLCAiRmlsZSBub3Qgb3BlbiBmb3Igb3V0cHV0Iik7CisKKyAgICAgICAgT3V0cHV0LndyaXRlQnl0ZXMoIGJ1Ziwgb2Zmc2V0LCBjb3VudCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIEZsdXNoKCkgOiBWb2lkIHsKKyAgICAgICAgaWYoIE91dHB1dCAhPSBudWxsKQorICAgICAgICAgICAgT3V0cHV0LmZsdXNoKCk7CisgICAgfQorCit9CisgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9URnJhbWVkVHJhbnNwb3J0Lmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9URnJhbWVkVHJhbnNwb3J0Lmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlZjgyZWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnQuaHgKQEAgLTAsMCArMSwxNTggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuKjsKKworaW1wb3J0IGhheGUuaW8uRW9mOworaW1wb3J0IGhheGUuaW8uQnl0ZXM7CitpbXBvcnQgaGF4ZS5pby5CeXRlc0J1ZmZlcjsKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzT3V0cHV0OworaW1wb3J0IGhheGUuaW8uQnl0ZXNJbnB1dDsKKworCisvKioKKyAqIFRGcmFtZWRUcmFuc3BvcnQgaXMgYSBidWZmZXJlZCBUVHJhbnNwb3J0IHRoYXQgZW5zdXJlcyBhIGZ1bGx5IHJlYWQgbWVzc2FnZQorICogZXZlcnkgdGltZSBieSBwcmVjZWRpbmcgbWVzc2FnZXMgd2l0aCBhIDQtYnl0ZSBmcmFtZSBzaXplLgorICovCitjbGFzcyBURnJhbWVkVHJhbnNwb3J0IGV4dGVuZHMgVFRyYW5zcG9ydAoreworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBERUZBVUxUX01BWF9MRU5HVEggPSAxNjM4NDAwMDsKKworICAgIHZhciBtYXhMZW5ndGhfIDogIEludDsKKworICAgIC8qKgorICAgICAqIFVuZGVybHlpbmcgdHJhbnNwb3J0CisgICAgICovCisgICAgdmFyIHRyYW5zcG9ydF8gOiAgVFRyYW5zcG9ydCA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBCdWZmZXIgZm9yIG91dHB1dAorICAgICAqLworICAgIHZhciB3cml0ZUJ1ZmZlcl8gOiBCeXRlc091dHB1dCA9IG5ldyBCeXRlc091dHB1dCgpOworCisgICAgLyoqCisgICAgICogQnVmZmVyIGZvciBpbnB1dAorICAgICAqLworICAgIHZhciByZWFkQnVmZmVyXyA6IEJ5dGVzSW5wdXQgPSBudWxsOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3Igd3JhcHMgYXJvdW5kIGFub3RoZXIgdHJhbnNwb3J0CisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldyggdHJhbnNwb3J0IDogVFRyYW5zcG9ydCwgbWF4TGVuZ3RoIDogSW50ID0gREVGQVVMVF9NQVhfTEVOR1RIKSB7CisgICAgICAgIHRyYW5zcG9ydF8gPSB0cmFuc3BvcnQ7CisgICAgICAgIG1heExlbmd0aF8gPSBtYXhMZW5ndGg7CisgICAgfQorCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIG9wZW4oKSA6IFZvaWQgeworICAgICAgICB0cmFuc3BvcnRfLm9wZW4oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gaXNPcGVuKCkgOiBCb29sIHsKKyAgICAgICAgcmV0dXJuIHRyYW5zcG9ydF8uaXNPcGVuKCk7CisgICAgfQorCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIGNsb3NlKCkgOiBWb2lkIHsKKyAgICAgICAgdHJhbnNwb3J0Xy5jbG9zZSgpOworICAgIH0KKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiByZWFkKGJ1ZiA6IEJ5dGVzQnVmZmVyLCBvZmYgOiBJbnQsIGxlbiA6IEludCkgOiBJbnQgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgdmFyIGRhdGEgPSBCeXRlcy5hbGxvYyhsZW4pOworCisgICAgICAgICAgICBpZiAoKHJlYWRCdWZmZXJfICE9IG51bGwpICYmIChyZWFkQnVmZmVyXy5wb3NpdGlvbiA8IHJlYWRCdWZmZXJfLmxlbmd0aCkpIHsKKyAgICAgICAgICAgICAgICB2YXIgZ290IDogSW50ID0gcmVhZEJ1ZmZlcl8ucmVhZEJ5dGVzKGRhdGEsIG9mZiwgbGVuKTsKKyAgICAgICAgICAgICAgICBpZiAoZ290ID4gMCkgeworICAgICAgICAgICAgICAgICAgICBidWYuYWRkQnl0ZXMoZGF0YSwwLGdvdCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBnb3Q7CisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIC8vIFJlYWQgYW5vdGhlciBmcmFtZSBvZiBkYXRhCisgICAgICAgICAgICByZWFkRnJhbWUoKTsKKworICAgICAgICAgICAgdmFyIGdvdCA9IHJlYWRCdWZmZXJfLnJlYWRCeXRlcyhkYXRhLCBvZmYsIGxlbik7CisgICAgICAgICAgICBidWYuYWRkQnl0ZXMoZGF0YSwwLGdvdCk7CisgICAgICAgICAgICByZXR1cm4gZ290OworICAgICAgICB9CisgICAgICAgIGNhdGNoIChlb2YgOiBFb2YpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRU5EX09GX0ZJTEUsICdDYW5cJ3QgcmVhZCAkbGVuIGJ5dGVzIScpOworICAgICAgICB9CisgICAgfQorCisKKyAgICBmdW5jdGlvbiByZWFkRnJhbWVTaXplKCkgOiBJbnQgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgdmFyIGJ1ZmZlciA9IG5ldyBCeXRlc0J1ZmZlcigpOworICAgICAgICAgICAgdmFyIGxlbiA9IHRyYW5zcG9ydF8ucmVhZEFsbCggYnVmZmVyLCAwLCA0KTsKKyAgICAgICAgICAgIHZhciBpbnAgPSBuZXcgQnl0ZXNJbnB1dCggYnVmZmVyLmdldEJ5dGVzKCksIDAsIDQpOworICAgICAgICAgICAgaW5wLmJpZ0VuZGlhbiA9IHRydWU7CisgICAgICAgICAgICByZXR1cm4gaW5wLnJlYWRJbnQzMigpOworICAgICAgICB9CisgICAgICAgIGNhdGNoKGVvZiA6IEVvZikgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FTkRfT0ZfRklMRSwgJ0NhblwndCByZWFkIDQgYnl0ZXMhJyk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIGZ1bmN0aW9uIHJlYWRGcmFtZSgpIDogVm9pZCB7CisgICAgICAgIHZhciBzaXplIDogSW50ID0gcmVhZEZyYW1lU2l6ZSgpOworCisgICAgICAgIGlmIChzaXplIDwgMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5VTktOT1dOLCAnUmVhZCBhIG5lZ2F0aXZlIGZyYW1lIHNpemUgKCRzaXplKSEnKTsKKyAgICAgICAgfTsKKyAgICAgICAgaWYgKHNpemUgPiBtYXhMZW5ndGhfKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLlVOS05PV04sICdGcmFtZSBzaXplICgkc2l6ZSkgbGFyZ2VyIHRoYW4gbWF4IGxlbmd0aCAoJG1heExlbmd0aF8pIScpOworICAgICAgICB9OworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB2YXIgYnVmZmVyID0gbmV3IEJ5dGVzQnVmZmVyKCk7CisgICAgICAgICAgICBzaXplID0gdHJhbnNwb3J0Xy5yZWFkQWxsKCBidWZmZXIsIDAsIHNpemUpOworICAgICAgICAgICAgcmVhZEJ1ZmZlcl8gPSBuZXcgQnl0ZXNJbnB1dCggYnVmZmVyLmdldEJ5dGVzKCksIDAsIHNpemUpOworICAgICAgICAgICAgcmVhZEJ1ZmZlcl8uYmlnRW5kaWFuID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaChlb2YgOiBFb2YpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRU5EX09GX0ZJTEUsICdDYW5cJ3QgcmVhZCAkc2l6ZSBieXRlcyEnKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiB3cml0ZShidWYgOiBCeXRlcywgb2ZmIDogSW50LCBsZW4gOiBJbnQpIDogVm9pZCB7CisgICAgICAgIHdyaXRlQnVmZmVyXy53cml0ZUJ5dGVzKGJ1Ziwgb2ZmLCBsZW4pOworICAgIH0KKworICAgIGZ1bmN0aW9uIHdyaXRlRnJhbWVTaXplKGxlbiA6IEludCkgOiBWb2lkIHsKKyAgICAgICAgdmFyIG91dCA9IG5ldyBCeXRlc091dHB1dCgpOworICAgICAgICBvdXQuYmlnRW5kaWFuID0gdHJ1ZTsKKyAgICAgICAgb3V0LndyaXRlSW50MzIobGVuKTsKKyAgICAgICAgdHJhbnNwb3J0Xy53cml0ZShvdXQuZ2V0Qnl0ZXMoKSwgMCwgNCk7CisgICAgfQorCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIGZsdXNoKCBjYWxsYmFjayA6IER5bmFtaWMtPlZvaWQgPW51bGwpIDogVm9pZCB7CisgICAgICAgIHZhciBidWYgOiBCeXRlcyA9IHdyaXRlQnVmZmVyXy5nZXRCeXRlcygpOworICAgICAgICB2YXIgbGVuIDogSW50ID0gYnVmLmxlbmd0aDsKKyAgICAgICAgd3JpdGVCdWZmZXJfID0gbmV3IEJ5dGVzT3V0cHV0KCk7CisKKyAgICAgICAgd3JpdGVGcmFtZVNpemUobGVuKTsKKyAgICAgICAgdHJhbnNwb3J0Xy53cml0ZShidWYsIDAsIGxlbik7CisgICAgICAgIHRyYW5zcG9ydF8uZmx1c2goY2FsbGJhY2spOworICAgIH0KK30KKworCmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnRGYWN0b3J5Lmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9URnJhbWVkVHJhbnNwb3J0RmFjdG9yeS5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDQ1YTY0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9URnJhbWVkVHJhbnNwb3J0RmFjdG9yeS5oeApAQCAtMCwwICsxLDM3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0Lio7CisKKworY2xhc3MgVEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkgZXh0ZW5kcyBUVHJhbnNwb3J0RmFjdG9yeSB7CisKKyAgICB2YXIgbWF4TGVuZ3RoXyA6IEludDsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcobWF4TGVuZ3RoIDogSW50ID0gVEZyYW1lZFRyYW5zcG9ydC5ERUZBVUxUX01BWF9MRU5HVEgpIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgbWF4TGVuZ3RoXyA9IG1heExlbmd0aDsKKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gZ2V0VHJhbnNwb3J0KGJhc2UgOiBUVHJhbnNwb3J0KSA6IFRUcmFuc3BvcnQgeworICAgICAgICByZXR1cm4gbmV3IFRGcmFtZWRUcmFuc3BvcnQoYmFzZSwgbWF4TGVuZ3RoXyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9URnVsbER1cGxleEh0dHBDbGllbnQuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGdWxsRHVwbGV4SHR0cENsaWVudC5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTcyODUzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9URnVsbER1cGxleEh0dHBDbGllbnQuaHgKQEAgLTAsMCArMSwyNTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CisKK2ltcG9ydCBmbGFzaC5lcnJvcnMuRU9GRXJyb3I7CitpbXBvcnQgZmxhc2guZXZlbnRzLkV2ZW50OworaW1wb3J0IGZsYXNoLmV2ZW50cy5JT0Vycm9yRXZlbnQ7CitpbXBvcnQgZmxhc2guZXZlbnRzLlByb2dyZXNzRXZlbnQ7CitpbXBvcnQgZmxhc2guZXZlbnRzLlNlY3VyaXR5RXJyb3JFdmVudDsKK2ltcG9ydCBmbGFzaC5uZXQuVVJMTG9hZGVyOworaW1wb3J0IGZsYXNoLm5ldC5VUkxMb2FkZXJEYXRhRm9ybWF0OworaW1wb3J0IGZsYXNoLm5ldC5VUkxSZXF1ZXN0OworaW1wb3J0IGZsYXNoLm5ldC5VUkxSZXF1ZXN0TWV0aG9kOworaW1wb3J0IGZsYXNoLnV0aWxzLklEYXRhSW5wdXQ7CitpbXBvcnQgZmxhc2gudXRpbHMuSURhdGFPdXRwdXQ7CitpbXBvcnQgaGF4ZS5pby5CeXRlczsKK2ltcG9ydCBmbGFzaC5uZXQuU29ja2V0OworaW1wb3J0IGZsYXNoLmV2ZW50cy5FdmVudERpc3BhdGNoZXI7CisKKworICAgIC8qKgorICAgICAqIEhUVFAgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRUcmFuc3BvcnQgaW50ZXJmYWNlLiBVc2VkIGZvciB3b3JraW5nIHdpdGggYQorICAgICAqIFRocmlmdCB3ZWIgc2VydmljZXMgaW1wbGVtZW50YXRpb24uCisgICAgICogVW5saWtlIEh0dHAgQ2xpZW50LCBpdCB1c2VzIGEgc2luZ2xlIFBPU1QsIGFuZCBjaHVuay1lbmNvZGluZyB0byB0cmFuc2ZlciBhbGwgbWVzc2FnZXMuCisgICAgICovCisKKyAgICBwdWJsaWMgY2xhc3MgVEZ1bGxEdXBsZXhIdHRwQ2xpZW50IGV4dGVuZHMgVFRyYW5zcG9ydAorICAgIHsKKyAgICAgICAgcHJpdmF0ZSB2YXIgc29ja2V0IDogU29ja2V0ID0gbnVsbDsKKyAgICAgICAgcHJpdmF0ZSB2YXIgaG9zdCAgOiAgU3RyaW5nOworICAgICAgICBwcml2YXRlIHZhciBwb3J0ICA6ICBJbnQ7CisgICAgICAgIHByaXZhdGUgdmFyIHJlc291cmNlICA6ICBTdHJpbmc7CisgICAgICAgIHByaXZhdGUgdmFyIHN0cmlwcGVkICA6ICBCb29sID0gZmFsc2U7CisgICAgICAgIHByaXZhdGUgdmFyIG9idWZmZXIgOiBCeXRlcyA9IG5ldyBCeXRlcygpOworICAgICAgICBwcml2YXRlIHZhciBpbnB1dCA6IElEYXRhSW5wdXQ7CisgICAgICAgIHByaXZhdGUgdmFyIG91dHB1dCA6IElEYXRhT3V0cHV0OworICAgICAgICBwcml2YXRlIHZhciBieXRlc0luQ2h1bmsgIDogIEludCA9IDA7CisgICAgICAgIHByaXZhdGUgdmFyIENSTEYgOiBCeXRlcyA9IG5ldyBCeXRlcygpOworICAgICAgICBwcml2YXRlIHZhciBpb0NhbGxiYWNrIDogVEV4Y2VwdGlvbi0+Vm9pZCA9IG51bGw7CisgICAgICAgIHByaXZhdGUgdmFyIGV2ZW50RGlzcGF0Y2hlciA6IEV2ZW50RGlzcGF0Y2hlciA9IG5ldyBFdmVudERpc3BhdGNoZXIoKTsKKworICAgICAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KGhvc3QgIDogIFN0cmluZywgcG9ydCAgOiAgSW50LCByZXNvdXJjZSAgOiAgU3RyaW5nKSAgOiAgVm9pZAorICAgICAgICB7CisgICAgICAgICAgICBDUkxGLndyaXRlQnl0ZSgxMyk7CisgICAgICAgICAgICBDUkxGLndyaXRlQnl0ZSgxMCk7CisgICAgICAgICAgICB0aGlzLmhvc3QgPSBob3N0OworICAgICAgICAgICAgdGhpcy5wb3J0ID0gcG9ydDsKKyAgICAgICAgICAgIHRoaXMucmVzb3VyY2UgPSByZXNvdXJjZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBjbG9zZSgpICA6ICBWb2lkCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuaW5wdXQgPSBudWxsOworICAgICAgICAgICAgdGhpcy5vdXRwdXQgPSBudWxsOworICAgICAgICAgICAgdGhpcy5zdHJpcHBlZCA9IGZhbHNlOworICAgICAgICAgICAgc29ja2V0LmNsb3NlKCkKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBwZWVrKCkgIDogIEJvb2wKKyAgICAgICAgeworICAgICAgICAgICAgaWYoc29ja2V0LmNvbm5lY3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cmFjZSgiQnl0ZXMgcmVtYWluZWQ6IiArIHNvY2tldC5ieXRlc0F2YWlsYWJsZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHNvY2tldC5ieXRlc0F2YWlsYWJsZT4wOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIHJlYWQoYnVmIDogQnl0ZXMsIG9mZiAgOiAgSW50LCBsZW4gIDogIEludCkgIDogIEludAorICAgICAgICB7CisgICAgICAgICAgICB2YXIgbjEgIDogIEludCA9IDAsIG4yICA6ICBJbnQgPSAwLCBuMyAgOiAgSW50ID0gMCwgbjQgIDogIEludCA9IDAsIGNpZHggIDogIEludCA9IDI7CisgICAgICAgICAgICB2YXIgY2h1bmtTaXplIDogQnl0ZXMgPSBuZXcgQnl0ZXMoKTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2hpbGUgKCFzdHJpcHBlZCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG4xID0gbjI7CisgICAgICAgICAgICAgICAgICAgIG4yID0gbjM7CisgICAgICAgICAgICAgICAgICAgIG4zID0gbjQ7CisgICAgICAgICAgICAgICAgICAgIG40ID0gaW5wdXQucmVhZEJ5dGUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChuMSA9PSAxMykgJiYgKG4yID09IDEwKSAmJiAobjMgPT0gMTMpICYmIChuNCA9PSAxMCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlwcGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIHJlYWQgY2h1bmsgc2l6ZQorICAgICAgICAgICAgICAgIGlmIChieXRlc0luQ2h1bmsgPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG4xID0gaW5wdXQucmVhZEJ5dGUoKTsKKyAgICAgICAgICAgICAgICAgICAgbjIgPSBpbnB1dC5yZWFkQnl0ZSgpOworCisgICAgICAgICAgICAgICAgICAgIGNodW5rU2l6ZS53cml0ZUJ5dGUobjEpOworICAgICAgICAgICAgICAgICAgICBjaHVua1NpemUud3JpdGVCeXRlKG4yKTsKKworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoISgobjEgPT0gMTMpICYmIChuMiA9PSAxMCkpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBuMSA9IG4yOworICAgICAgICAgICAgICAgICAgICAgICAgbjIgPSBpbnB1dC5yZWFkQnl0ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmtTaXplLndyaXRlQnl0ZShuMik7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBieXRlc0luQ2h1bmsgPSBwYXJzZUludChjaHVua1NpemUudG9TdHJpbmcoKSwgMTYpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlucHV0LnJlYWRCeXRlcyhidWYsIG9mZiwgbGVuKTsKKyAgICAgICAgICAgICAgICBkZWJ1Z0J1ZmZlcihidWYpOworICAgICAgICAgICAgICAgIGJ5dGVzSW5DaHVuayAtPSBsZW47CisKKyAgICAgICAgICAgICAgICBpZiAoYnl0ZXNJbkNodW5rID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBhZHZhbmNlIHRoZSAgOiAgIlxyXG4iCisgICAgICAgICAgICAgICAgICAgIGlucHV0LnJlYWRVVEZCeXRlcygyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGxlbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChlIDogRU9GRXJyb3IpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJhY2UoZSk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5VTktOT1dOLCAiTm8gbW9yZSBkYXRhIGF2YWlsYWJsZS4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChlIDogVEV4Y2VwdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cmFjZSgnVEV4Y2VwdGlvbiAkZScpOworICAgICAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoZSA6IEVycm9yKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyYWNlKGUpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uVU5LTk9XTiwgJ0JhZCBJTyBlcnJvcjogJGUnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChlIDogRHluYW1pYykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cmFjZShlKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLlVOS05PV04sICdCYWQgSU8gZXJyb3I6ICRlJyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBmdW5jdGlvbiBkZWJ1Z0J1ZmZlcihidWYgOiBCeXRlcykgIDogIFZvaWQKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGRlYnVnICA6ICBTdHJpbmcgPSAiQlVGRkVSID4+IjsKKyAgICAgICAgICAgIHZhciBpICA6ICBJbnQ7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYnVmLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRlYnVnICs9IGJ1ZltpXSBhcyBpbnQ7CisgICAgICAgICAgICAgICAgZGVidWcgKz0gIiAiOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cmFjZShkZWJ1ZyArICI8PCIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIHdyaXRlKGJ1ZiA6IEJ5dGVzLCBvZmYgIDogIEludCwgbGVuICA6ICBJbnQpICA6ICBWb2lkCisgICAgICAgIHsKKyAgICAgICAgICAgIG9idWZmZXIud3JpdGVCeXRlcyhidWYsIG9mZiwgbGVuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBmdW5jdGlvbiBhZGRFdmVudExpc3RlbmVyKHR5cGUgIDogIFN0cmluZywgbGlzdGVuZXIgOiBGdW5jdGlvbiwgdXNlQ2FwdHVyZSAgOiAgQm9vbCA9IGZhbHNlLCBwcmlvcml0eSAgOiAgSW50ID0gMCwgdXNlV2Vha1JlZmVyZW5jZSAgOiAgQm9vbCA9IGZhbHNlKSAgOiAgVm9pZAorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLmV2ZW50RGlzcGF0Y2hlci5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyLCB1c2VDYXB0dXJlLCBwcmlvcml0eSwgdXNlV2Vha1JlZmVyZW5jZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gb3BlbigpICA6ICBWb2lkCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuc29ja2V0ID0gbmV3IFNvY2tldCgpOworICAgICAgICAgICAgdGhpcy5zb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcihFdmVudC5DT05ORUNULCBzb2NrZXRDb25uZWN0ZWQpOworICAgICAgICAgICAgdGhpcy5zb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcihJT0Vycm9yRXZlbnQuSU9fRVJST1IsIHNvY2tldEVycm9yKTsKKyAgICAgICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoU2VjdXJpdHlFcnJvckV2ZW50LlNFQ1VSSVRZX0VSUk9SLCBzb2NrZXRTZWN1cml0eUVycm9yKTsKKyAgICAgICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoUHJvZ3Jlc3NFdmVudC5TT0NLRVRfREFUQSwgc29ja2V0RGF0YUhhbmRsZXIpOworICAgICAgICAgICAgdGhpcy5zb2NrZXQuY29ubmVjdChob3N0LCBwb3J0KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBmdW5jdGlvbiBzb2NrZXRDb25uZWN0ZWQoZXZlbnQgOiBFdmVudCkgIDogIFZvaWQKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5vdXRwdXQgPSB0aGlzLnNvY2tldDsKKyAgICAgICAgICAgIHRoaXMuaW5wdXQgPSB0aGlzLnNvY2tldDsKKyAgICAgICAgICAgIHRoaXMub3V0cHV0LndyaXRlVVRGKCAiQ09OTkVDVCAiICsgcmVzb3VyY2UgKyAiIEhUVFAvMS4xXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIkhvc3QgOiAgIiArIGhvc3QgKyAiOiIgKyBwb3J0ICsgIlxyXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlVzZXItQWdlbnQgOiAgVGhyaWZ0L0hheGVcclxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJUcmFuc2Zlci1FbmNvZGluZyA6ICBjaHVua2VkXHJcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiY29udGVudC10eXBlIDogIGFwcGxpY2F0aW9uL3gtdGhyaWZ0XHJcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiQWNjZXB0IDogICovKlxyXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlxyXG4iKTsKKyAgICAgICAgICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyLmRpc3BhdGNoRXZlbnQoZXZlbnQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGZ1bmN0aW9uIHNvY2tldEVycm9yKGV2ZW50IDogSU9FcnJvckV2ZW50KSAgOiAgVm9pZAorICAgICAgICB7CisgICAgICAgICAgICB0cmFjZSgiRXJyb3IgQ29ubmVjdGluZzoiICsgZXZlbnQpOworICAgICAgICAgICAgdGhpcy5jbG9zZSgpOworICAgICAgICAgICAgaWYgKGlvQ2FsbGJhY2sgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpb0NhbGxiYWNrKG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uVU5LTk9XTiwgIklPRXJyb3IgOiAgIiArIGV2ZW50LnRleHQpKTsKKyAgICAgICAgICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyLmRpc3BhdGNoRXZlbnQoZXZlbnQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGZ1bmN0aW9uIHNvY2tldFNlY3VyaXR5RXJyb3IoZXZlbnQgOiBTZWN1cml0eUVycm9yRXZlbnQpICA6ICBWb2lkCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyYWNlKCJTZWN1cml0eSBFcnJvciBDb25uZWN0aW5nOiIgKyBldmVudCk7CisgICAgICAgICAgICB0aGlzLmNsb3NlKCk7CisgICAgICAgICAgICB0aGlzLmV2ZW50RGlzcGF0Y2hlci5kaXNwYXRjaEV2ZW50KGV2ZW50KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBmdW5jdGlvbiBzb2NrZXREYXRhSGFuZGxlcihldmVudCA6IFByb2dyZXNzRXZlbnQpICA6ICBWb2lkCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyYWNlKCJHb3QgRGF0YSBjYWxsOiIgK2lvQ2FsbGJhY2spOworICAgICAgICAgICAgaWYgKGlvQ2FsbGJhY2sgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpb0NhbGxiYWNrKG51bGwpOworICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyLmRpc3BhdGNoRXZlbnQoZXZlbnQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIGZsdXNoKGNhbGxiYWNrIDogRXJyb3ItPlZvaWQgPSBudWxsKSAgOiAgVm9pZAorICAgICAgICB7CisgICAgICAgICAgICB0cmFjZSgic2V0IGNhbGxiYWNrOiIgKyBjYWxsYmFjayk7CisgICAgICAgICAgICB0aGlzLmlvQ2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICAgICAgICAgIHRoaXMub3V0cHV0LndyaXRlVVRGKHRoaXMub2J1ZmZlci5sZW5ndGgudG9TdHJpbmcoMTYpKTsKKyAgICAgICAgICAgIHRoaXMub3V0cHV0LndyaXRlQnl0ZXMoQ1JMRik7CisgICAgICAgICAgICB0aGlzLm91dHB1dC53cml0ZUJ5dGVzKHRoaXMub2J1ZmZlcik7CisgICAgICAgICAgICB0aGlzLm91dHB1dC53cml0ZUJ5dGVzKENSTEYpOworICAgICAgICAgICAgdGhpcy5zb2NrZXQuZmx1c2goKTsKKyAgICAgICAgICAgIC8vIHdhaXRpbmcgZm9yICBuZXcgRmxleCBzZGsgMy41CisgICAgICAgICAgICAvL3RoaXMub2J1ZmZlci5jbGVhcigpOworICAgICAgICAgICAgdGhpcy5vYnVmZmVyID0gbmV3IEJ5dGVzKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gaXNPcGVuKCkgIDogIEJvb2wKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuICh0aGlzLnNvY2tldCA9PSBudWxsID8gZmFsc2UgIDogIHRoaXMuc29ja2V0LmNvbm5lY3RlZCk7CisgICAgICAgIH0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEh0dHBDbGllbnQuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RIdHRwQ2xpZW50Lmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5Zjg2NjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RIdHRwQ2xpZW50Lmh4CkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OworCisKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzOworaW1wb3J0IGhheGUuaW8uQnl0ZXNCdWZmZXI7CitpbXBvcnQgaGF4ZS5pby5CeXRlc091dHB1dDsKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzSW5wdXQ7CisKK2ltcG9ydCBoYXhlLkh0dHA7CisKKworCisvKioKKyogSFRUUCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVFRyYW5zcG9ydCBpbnRlcmZhY2UuIFVzZWQgZm9yIHdvcmtpbmcgd2l0aCBhCisqIFRocmlmdCB3ZWIgc2VydmljZXMgaW1wbGVtZW50YXRpb24uCisqLworCitjbGFzcyBUSHR0cENsaWVudCBleHRlbmRzIFRUcmFuc3BvcnQgeworCisgICAgcHJpdmF0ZSB2YXIgcmVxdWVzdEJ1ZmZlcl8gIDogQnl0ZXNPdXRwdXQgPSBuZXcgQnl0ZXNPdXRwdXQoKTsKKyAgICBwcml2YXRlIHZhciByZXNwb25zZUJ1ZmZlcl8gOiBCeXRlc0lucHV0ID0gbnVsbDsKKworICAgIHByaXZhdGUgdmFyIHJlcXVlc3RfICAgICAgICA6IEh0dHAgPSBudWxsOworCisKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KCByZXF1ZXN0VXJsIDogU3RyaW5nKSA6IFZvaWQgeworICAgICAgICAgIHJlcXVlc3RfID0gbmV3IEh0dHAocmVxdWVzdFVybCk7CisgICAgICAgIHJlcXVlc3RfLmFkZEhlYWRlciggImNvbnRlbnRUeXBlIiwgImFwcGxpY2F0aW9uL3gtdGhyaWZ0Iik7CisgICAgfQorCisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gb3BlbigpIDogVm9pZCB7CisgICAgfQorCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIGNsb3NlKCkgOiBWb2lkIHsKKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gaXNPcGVuKCkgOiBCb29sIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiByZWFkKGJ1ZjpCeXRlc0J1ZmZlciwgb2ZmIDogSW50LCBsZW4gOiBJbnQpIDogSW50IHsKKyAgICAgICAgaWYgKHJlc3BvbnNlQnVmZmVyXyA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLlVOS05PV04sICJSZXNwb25zZSBidWZmZXIgaXMgZW1wdHksIG5vIHJlcXVlc3QuIik7CisgICAgICAgIH0KKworICAgICAgICB2YXIgZGF0YSA9Qnl0ZXMuYWxsb2MobGVuKTsKKyAgICAgICAgbGVuID0gcmVzcG9uc2VCdWZmZXJfLnJlYWRCeXRlcyhkYXRhLCBvZmYsIGxlbik7CisgICAgICAgIGJ1Zi5hZGRCeXRlcyhkYXRhLDAsbGVuKTsKKyAgICAgICAgcmV0dXJuIGxlbjsKKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gd3JpdGUoYnVmOkJ5dGVzLCBvZmYgOiBJbnQsIGxlbiA6IEludCkgOiBWb2lkIHsKKyAgICAgIHJlcXVlc3RCdWZmZXJfLndyaXRlQnl0ZXMoYnVmLCBvZmYsIGxlbik7CisgICAgfQorCisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gZmx1c2goY2FsbGJhY2s6RHluYW1pYy0+Vm9pZCA9IG51bGwpIDogVm9pZCB7CisgICAgICAgIHZhciBidWZmZXIgPSByZXF1ZXN0QnVmZmVyXzsKKyAgICAgICAgcmVxdWVzdEJ1ZmZlcl8gPSBuZXcgQnl0ZXNPdXRwdXQoKTsKKyAgICAgICAgcmVzcG9uc2VCdWZmZXJfID0gbnVsbDsKKworICAgICAgICByZXF1ZXN0Xy5vbkRhdGEgPSBmdW5jdGlvbihkYXRhIDogU3RyaW5nKSB7CisgICAgICAgICAgICB2YXIgdG1wID0gbmV3IEJ5dGVzQnVmZmVyKCk7CisgICAgICAgICAgICB0bXAuYWRkU3RyaW5nKGRhdGEpOworICAgICAgICAgICAgcmVzcG9uc2VCdWZmZXJfID0gbmV3IEJ5dGVzSW5wdXQodG1wLmdldEJ5dGVzKCkpOworICAgICAgICAgICAgaWYoIGNhbGxiYWNrICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICByZXF1ZXN0Xy5vbkVycm9yID0gZnVuY3Rpb24obXNnIDogU3RyaW5nKSB7CisgICAgICAgICAgICBpZiggY2FsbGJhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNhbGxiYWNrKG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uVU5LTk9XTiwgIklPRXJyb3I6ICIgKyBtc2cpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICByZXF1ZXN0Xy5zZXRQb3N0RGF0YShidWZmZXIuZ2V0Qnl0ZXMoKS50b1N0cmluZygpKTsKKyAgICAgICAgcmVxdWVzdF8ucmVxdWVzdCh0cnVlLypQT1NUKi8pOworICAgIH0KKworfQorCisgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0Lmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0Lmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiYWRiMmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuaHgKQEAgLTAsMCArMSwxMzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CisKK2ltcG9ydCBoYXhlLnJlbW90aW5nLlNvY2tldFByb3RvY29sOworaW1wb3J0IGhheGUuaW8uQnl0ZXM7CitpbXBvcnQgaGF4ZS5pby5CeXRlc0J1ZmZlcjsKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzSW5wdXQ7CitpbXBvcnQgaGF4ZS5pby5CeXRlc091dHB1dDsKK2ltcG9ydCBoYXhlLmlvLklucHV0OworaW1wb3J0IGhheGUuaW8uT3V0cHV0OworaW1wb3J0IGhheGUuaW8uRW9mOworCisvL2ltcG9ydCBmbGFzaC5uZXQuU2VydmVyU29ja2V0OyAtIG5vdCB5ZXQgYXZhaWxhYmxlIG9uIEhheGUgMy4xLjMKKyNpZiAhIChmbGFzaCB8fCBodG1sNSkKKworaW1wb3J0IHN5cy5uZXQuSG9zdDsKKworCitjbGFzcyBUU2VydmVyU29ja2V0IGV4dGVuZHMgVFNlcnZlclRyYW5zcG9ydCB7CisKKyAgICAvLyBVbmRlcmx5aW5nIHNlcnZlciB3aXRoIHNvY2tldAorICAgIHByaXZhdGUgdmFyIF9zb2NrZXQgOiBTb2NrZXQ9IG51bGw7CisKKyAgICAvLyBUaW1lb3V0IGZvciBjbGllbnQgc29ja2V0cyBmcm9tIGFjY2VwdAorICAgIHByaXZhdGUgdmFyIF9jbGllbnRUaW1lb3V0IDogRmxvYXQgPSA1OworCisgICAgLy8gV2hldGhlciBvciBub3QgdG8gd3JhcCBuZXcgVFNvY2tldCBjb25uZWN0aW9ucyBpbiBidWZmZXJzCisgICAgcHJpdmF0ZSB2YXIgX3VzZUJ1ZmZlcmVkU29ja2V0cyA6IEJvb2wgPSBmYWxzZTsKKworCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldyg/YWRkcmVzcyA6IFN0cmluZyA9ICdsb2NhbGhvc3QnLCAgcG9ydCA6IEludCwgY2xpZW50VGltZW91dCA6IEZsb2F0ID0gNSwgdXNlQnVmZmVyZWRTb2NrZXRzIDogQm9vbCA9IGZhbHNlKQorICAgIHsKKyAgICAgICAgX2NsaWVudFRpbWVvdXQgPSBjbGllbnRUaW1lb3V0OworICAgICAgICBfdXNlQnVmZmVyZWRTb2NrZXRzID0gdXNlQnVmZmVyZWRTb2NrZXRzOworCisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBfc29ja2V0ID0gbmV3IFNvY2tldCgpOworICAgICAgICAgICAgX3NvY2tldC5iaW5kKCBuZXcgSG9zdChhZGRyZXNzKSwgcG9ydCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKGUgOiBEeW5hbWljKQorICAgICAgICB7CisgICAgICAgICAgICBfc29ja2V0ID0gbnVsbDsKKyAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCBUVHJhbnNwb3J0RXhjZXB0aW9uLlVOS05PV04sICdDb3VsZCBub3QgY3JlYXRlIFNlcnZlclNvY2tldCBvbiBwb3J0ICRwb3J0OiAkZScpOworICAgICAgICB9CisgICAgfQorCisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gTGlzdGVuKCkgOiBWb2lkCisgICAgeworICAgICAgICAvLyBNYWtlIHN1cmUgbm90IHRvIGJsb2NrIG9uIGFjY2VwdAorICAgICAgICBpZiAoX3NvY2tldCAhPSBudWxsKSAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAjaWYgIXBocAorICAgICAgICAgICAgICAgIF9zb2NrZXQubGlzdGVuKDEpOworICAgICAgICAgICAgICAgICNlbmQKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChlIDogRHluYW1pYykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cmFjZSgnRXJyb3IgJGUnKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbiggVFRyYW5zcG9ydEV4Y2VwdGlvbi5VTktOT1dOLCAnQ291bGQgbm90IGFjY2VwdCBvbiBsaXN0ZW5pbmcgc29ja2V0OiAkZScpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBvdmVycmlkZSBmdW5jdGlvbiBBY2NlcHRJbXBsKCkgOiBUVHJhbnNwb3J0CisgICAgeworICAgICAgICBpZiAoX3NvY2tldCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbiggVFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwgIk5vIHVuZGVybHlpbmcgc2VydmVyIHNvY2tldC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgYWNjZXB0ZWQgPSBfc29ja2V0LmFjY2VwdCgpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFRTb2NrZXQuZnJvbVNvY2tldChhY2NlcHRlZCk7CisgICAgICAgICAgICByZXN1bHQuc2V0VGltZW91dCggX2NsaWVudFRpbWVvdXQpOworCisgICAgICAgICAgICBpZiggX3VzZUJ1ZmZlcmVkU29ja2V0cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyAiYnVmZmVyZWQgdHJhbnNwb3J0IG5vdCB5ZXQgc3VwcG9ydGVkIjsgIC8vIFRPRE8KKyAgICAgICAgICAgICAgICAvL3Jlc3VsdCA9IG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQocmVzdWx0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoZSA6IER5bmFtaWMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyYWNlKCdFcnJvciAkZScpOworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIFRUcmFuc3BvcnRFeGNlcHRpb24uVU5LTk9XTiwgJyRlJyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gQ2xvc2UoKSA6IFZvaWQKKyAgICB7CisgICAgICAgIGlmIChfc29ja2V0ICE9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9zb2NrZXQuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChlIDogRHluYW1pYykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cmFjZSgnRXJyb3IgJGUnKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbiggVFRyYW5zcG9ydEV4Y2VwdGlvbi5VTktOT1dOLCAnV0FSTklORzogQ291bGQgbm90IGNsb3NlIHNlcnZlciBzb2NrZXQ6ICRlJyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfc29ja2V0ID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KK30KKworI2VuZApkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyVHJhbnNwb3J0Lmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyVHJhbnNwb3J0Lmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxODk5ODEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJUcmFuc3BvcnQuaHgKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKKworY2xhc3MgVFNlcnZlclRyYW5zcG9ydCB7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gQWNjZXB0KCkgOiBUVHJhbnNwb3J0IHsKKyAgICAgICAgdmFyIHRyYW5zcG9ydCA9IEFjY2VwdEltcGwoKTsKKyAgICAgICAgaWYgKHRyYW5zcG9ydCA9PSBudWxsKSB7CisgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIFRUcmFuc3BvcnRFeGNlcHRpb24uVU5LTk9XTiwgImFjY2VwdCgpIG1heSBub3QgcmV0dXJuIE5VTEwiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJhbnNwb3J0OworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBMaXN0ZW4oKSA6IFZvaWQgeworICAgICAgICB0aHJvdyBuZXcgQWJzdHJhY3RNZXRob2RFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBDbG9zZSgpIDogVm9pZCB7CisgICAgICAgIHRocm93IG5ldyBBYnN0cmFjdE1ldGhvZEVycm9yKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBBY2NlcHRJbXBsKCkgOiBUVHJhbnNwb3J0IHsKKyAgICAgICAgdGhyb3cgbmV3IEFic3RyYWN0TWV0aG9kRXJyb3IoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk0MWFiOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oeApAQCAtMCwwICsxLDMxOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKKworI2lmIGZsYXNoCitpbXBvcnQgZmxhc2gubmV0LlNvY2tldDsKKyNlbHNlaWYganMKK2ltcG9ydCBqcy5odG1sLldlYlNvY2tldDsKKyNlbHNlCitpbXBvcnQgaGF4ZS5yZW1vdGluZy5Tb2NrZXRQcm90b2NvbDsKKyNlbmQKKworaW1wb3J0IGhheGUuaW8uQnl0ZXM7CitpbXBvcnQgaGF4ZS5pby5CeXRlc0J1ZmZlcjsKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzSW5wdXQ7CitpbXBvcnQgaGF4ZS5pby5CeXRlc091dHB1dDsKK2ltcG9ydCBoYXhlLmlvLklucHV0OworaW1wb3J0IGhheGUuaW8uT3V0cHV0OworaW1wb3J0IGhheGUuaW8uRW9mOworCisKKyNpZiAhIChmbGFzaCB8fCBqcykKK2ltcG9ydCBzeXMubmV0Lkhvc3Q7CisjZW5kCisKKworICAvKioKKyAgICogU29ja2V0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBUVHJhbnNwb3J0IGludGVyZmFjZS4gVXNlZCBmb3Igd29ya2luZyB3aXRoIGEKKyAgICogVGhyaWZ0IFNvY2tldCBTZXJ2ZXIgYmFzZWQgaW1wbGVtZW50YXRpb25zLgorICAgKi8KKworY2xhc3MgVFNvY2tldCBleHRlbmRzIFRUcmFuc3BvcnQgIHsKKworICAgICNpZiAoZmxhc2ggfHwganMpCisgICAgcHJpdmF0ZSB2YXIgaG9zdCAgOiAgU3RyaW5nOworICAgICNlbHNlCisgICAgcHJpdmF0ZSB2YXIgaG9zdCAgOiAgSG9zdDsKKyAgICAjZW5kCisKKyAgICBwcml2YXRlIHZhciBwb3J0ICA6ICBJbnQ7CisKKyAgICAjaWYganMKKyAgICBwcml2YXRlIHZhciBzb2NrZXQgOiBXZWJTb2NrZXQgPSBudWxsOworICAgICNlbHNlCisgICAgcHJpdmF0ZSB2YXIgc29ja2V0IDogU29ja2V0ID0gbnVsbDsKKyAgICAjZW5kCisKKyAgICAjaWYganMKKyAgICBwcml2YXRlIHZhciBpbnB1dCA6IER5bmFtaWMgPSBudWxsOworICAgIHByaXZhdGUgdmFyIG91dHB1dCA6IFdlYlNvY2tldCA9IG51bGw7CisgICAgI2Vsc2VpZiBmbGFzaAorICAgIHByaXZhdGUgdmFyIGlucHV0IDogU29ja2V0ID0gbnVsbDsKKyAgICBwcml2YXRlIHZhciBvdXRwdXQgOiBTb2NrZXQgPSBudWxsOworICAgICNlbHNlCisgICAgcHJpdmF0ZSB2YXIgaW5wdXQgOiBJbnB1dCA9IG51bGw7CisgICAgcHJpdmF0ZSB2YXIgb3V0cHV0IDogT3V0cHV0ID0gbnVsbDsKKyAgICAjZW5kCisKKyAgICBwcml2YXRlIHZhciB0aW1lb3V0IDogRmxvYXQgPSAzMDsKKworICAgIHByaXZhdGUgdmFyIG9idWZmZXIgOiBCeXRlc091dHB1dCA9IG5ldyBCeXRlc091dHB1dCgpOworICAgIHByaXZhdGUgdmFyIGlvQ2FsbGJhY2sgOiBURXhjZXB0aW9uLT5Wb2lkID0gbnVsbDsKKyAgICBwcml2YXRlIHZhciByZWFkQ291bnQgOiBJbnQgPSAwOworCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldyhob3N0IDogU3RyaW5nLCBwb3J0ICA6ICBJbnQpICA6ICBWb2lkICB7CisgICAgICAgICNpZiAoZmxhc2ggfHwganMpCisgICAgICAgIHRoaXMuaG9zdCA9IGhvc3Q7CisgICAgICAgICNlbHNlCisgICAgICAgIHRoaXMuaG9zdCA9IG5ldyBIb3N0KGhvc3QpOworICAgICAgICAjZW5kCisKKyAgICAgICAgdGhpcy5wb3J0ID0gcG9ydDsKKyAgICB9CisKKyAgICAjaWYgISAoZmxhc2ggfHwganMpCisgICAgLy8gdXNlZCBieSBUU29ja2V0U2VydmVyCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBmcm9tU29ja2V0KCBzb2NrZXQgOiBTb2NrZXQpIDogVFNvY2tldCAgeworICAgICAgICB2YXIgc29ja2V0SG9zdCA9IHNvY2tldC5ob3N0KCk7CisgICAgICAgIHZhciByZXN1bHQgPSBuZXcgVFNvY2tldChzb2NrZXRIb3N0Lmhvc3QudG9TdHJpbmcoKSwgc29ja2V0SG9zdC5wb3J0KTsKKyAgICAgICAgcmVzdWx0LmFzc2lnblNvY2tldChzb2NrZXQpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICAjZW5kCisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gY2xvc2UoKSAgOiAgVm9pZCAgeworICAgICAgICBpbnB1dCA9IG51bGw7CisgICAgICAgIG91dHB1dCA9IG51bGw7CisgICAgICAgIHNvY2tldC5jbG9zZSgpOworICAgIH0KKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBwZWVrKCkgIDogIEJvb2wgIHsKKyAgICAgICAgaWYoIChpbnB1dCA9PSBudWxsKSB8fCAoc29ja2V0ID09IG51bGwpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAjaWYgZmxhc2gKKyAgICAgICAgICAgIHJldHVybiAoaW5wdXQuYnl0ZXNBdmFpbGFibGUgPiAwKTsKKyAgICAgICAgICAgICNlbHNlaWYganMKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgIHZhciByZWFkeSA9IFNvY2tldC5zZWxlY3QoIFtzb2NrZXRdLCBudWxsLCBudWxsLCAwKTsKKyAgICAgICAgICAgIHJldHVybiAocmVhZHkucmVhZC5sZW5ndGggPiAwKTsKKyAgICAgICAgICAgICNlbmQKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFJlYWRzIHVwIHRvIGxlbiBieXRlcyBpbnRvIGJ1ZmZlciBidWYsIHN0YXJ0aW5nIGF0dCBvZmZzZXQgb2ZmLgorICAgIC8vIE1heSByZXR1cm4gbGVzcyBieXRlcyB0aGFuIGxlbiByZXF1aXJlZAorICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiByZWFkKCBidWYgOiBCeXRlc0J1ZmZlciwgb2ZmIDogSW50LCBsZW4gOiBJbnQpIDogSW50ICAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgI2lmIGZsYXNoCisKKyAgICAgICAgICAgIHZhciByZW1haW5pbmcgPSBsZW47CisgICAgICAgICAgICB3aGlsZSggcmVtYWluaW5nID4gMCkgeworICAgICAgICAgICAgICAgIGJ1Zi5hZGRCeXRlKCBpbnB1dC5yZWFkQnl0ZSgpKTsKKyAgICAgICAgICAgICAgICAtLXJlbWFpbmluZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBsZW47CisKKyAgICAgICAgICAgICNlbHNlaWYganMKKworICAgICAgICAgICAgaWYoIGlucHV0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLlVOS05PV04sICJTdGlsbCBubyBkYXRhICIpOyAgLy8gZG9uJ3QgYmxvY2sKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhciBuciA9IGxlbjsKKyAgICAgICAgICAgIHdoaWxlKCBuciA8IGxlbikgeworICAgICAgICAgICAgICAgIGJ1Zi5hZGRCeXRlKCBpbnB1dC5nZXQob2ZmK25yKSk7CisgICAgICAgICAgICAgICAgKytucjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBsZW47CisKKyAgICAgICAgICAgICNlbHNlCisKKyAgICAgICAgICAgIC8vc29ja2V0LndhaXRGb3JSZWFkKCk7ICAtICBubywgdGhpcyBpZ25vcmVzIHRpbWVvdXQgYW5kIGJsb2NrcyBpbmZpbml0ZWx5CisgICAgICAgICAgICBpZihyZWFkQ291bnQgPCBvZmYpIHsKKyAgICAgICAgICAgICAgICBpbnB1dC5yZWFkKG9mZi1yZWFkQ291bnQpOworICAgICAgICAgICAgICAgIHJlYWRDb3VudCA9IG9mZjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGRhdGEgPSBCeXRlcy5hbGxvYyhsZW4pOworICAgICAgICAgICAgdmFyIGdvdCA9IGlucHV0LnJlYWRCeXRlcyhkYXRhLCAwLCBsZW4pOworICAgICAgICAgICAgYnVmLmFkZEJ5dGVzKCBkYXRhLCAwLCBnb3QpOworICAgICAgICAgICAgcmVhZENvdW50ICs9IGdvdDsKKyAgICAgICAgICAgIHJldHVybiBnb3Q7CisKKyAgICAgICAgICAgICNlbmQKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoZSA6IEVvZikKKyAgICAgICAgeworICAgICAgICAgICAgdHJhY2UoJ0VvZiAkZScpOworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FTkRfT0ZfRklMRSwgIk5vIG1vcmUgZGF0YSBhdmFpbGFibGUuIik7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKGUgOiBURXhjZXB0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICB0cmFjZSgnVEV4Y2VwdGlvbiAkZScpOworICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoZSA6IER5bmFtaWMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyYWNlKCdFcnJvciAkZScpOworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5VTktOT1dOLCAnQmFkIElPIGVycm9yIDogJGUnKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIHdyaXRlKGJ1ZiA6IEJ5dGVzLCBvZmYgIDogIEludCwgbGVuICA6ICBJbnQpICA6ICBWb2lkCisgICAgeworICAgICAgICBvYnVmZmVyLndyaXRlQnl0ZXMoYnVmLCBvZmYsIGxlbik7CisgICAgfQorCisKKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBmbHVzaChjYWxsYmFjayA6IER5bmFtaWMtPlZvaWQgPSBudWxsKSAgOiAgVm9pZAorICAgIHsKKyAgICAgICAgaWYoICEgaXNPcGVuKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uTk9UX09QRU4sICJUcmFuc3BvcnQgbm90IG9wZW4iKTsKKyAgICAgICAgfQorCisgICAgICAgICNpZiBmbGFzaAorCisgICAgICAgIHZhciBieXRlcyA9IG5ldyBmbGFzaC51dGlscy5CeXRlQXJyYXkoKTsKKyAgICAgICAgdmFyIGRhdGEgPSBvYnVmZmVyLmdldEJ5dGVzKCk7CisgICAgICAgIHZhciBsZW4gPSAwOworICAgICAgICB3aGlsZSggbGVuIDwgZGF0YS5sZW5ndGgpIHsKKyAgICAgICAgICAgIGJ5dGVzLndyaXRlQnl0ZShkYXRhLmdldChsZW4pKTsKKyAgICAgICAgICAgICsrbGVuOworICAgICAgICB9CisKKyAgICAgICAgI2Vsc2VpZiBqcworCisgICAgICAgIHZhciBkYXRhID0gb2J1ZmZlci5nZXRCeXRlcygpOworICAgICAgICB2YXIgb3V0YnVmID0gbmV3IGpzLmh0bWwuSW50OEFycmF5KGRhdGEubGVuZ3RoKTsKKyAgICAgICAgdmFyIGxlbiA9IDA7CisgICAgICAgIHdoaWxlKCBsZW4gPCBkYXRhLmxlbmd0aCkgeworICAgICAgICAgICAgb3V0YnVmLnNldCggW2RhdGEuZ2V0KGxlbildLCBsZW4pOworICAgICAgICAgICAgKytsZW47CisgICAgICAgIH0KKyAgICAgICAgdmFyIGJ5dGVzID0gb3V0YnVmLmJ1ZmZlcjsKKworICAgICAgICAjZWxzZQorCisgICAgICAgIHZhciBieXRlcyA9IG9idWZmZXIuZ2V0Qnl0ZXMoKTsKKyAgICAgICAgdmFyIGxlbiA9IGJ5dGVzLmxlbmd0aDsKKworICAgICAgICAjZW5kCisKKyAgICAgICAgb2J1ZmZlciA9IG5ldyBCeXRlc091dHB1dCgpOworCisKKyAgICAgICAgaW9DYWxsYmFjayA9IGNhbGxiYWNrOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZENvdW50ID0gMDsKKworICAgICAgICAgICAgI2lmIGpzCisgICAgICAgICAgICBvdXRwdXQuc2VuZCggYnl0ZXMpOworICAgICAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgIG91dHB1dC53cml0ZUJ5dGVzKCBieXRlcywgMCwgYnl0ZXMubGVuZ3RoKTsKKyAgICAgICAgICAgICNlbmQKKworICAgICAgICAgICAgaWYoaW9DYWxsYmFjayAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaW9DYWxsYmFjayhudWxsKTsgIC8vIHN1Y2Nlc3MgY2FsbAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNhdGNoIChlIDogVEV4Y2VwdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgdHJhY2UoJ1RFeGNlcHRpb24gJGUsIG1lc3NhZ2UgOiAke2UuZXJyb3JNc2d9Jyk7CisgICAgICAgICAgICBpZihpb0NhbGxiYWNrICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpb0NhbGxiYWNrKGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNhdGNoIChlIDogRHluYW1pYykgeworICAgICAgICAgICAgdHJhY2UoZSk7CisgICAgICAgICAgICBpZihpb0NhbGxiYWNrICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpb0NhbGxiYWNrKG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uVU5LTk9XTiwgJ0JhZCBJTyBlcnJvciA6ICRlJykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIGlzT3BlbigpICA6ICBCb29sCisgICAgeworICAgICAgICByZXR1cm4gKHNvY2tldCAhPSBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gb3BlbigpICA6ICBWb2lkCisgICAgeworICAgICAgICAjaWYganMKKyAgICAgICAgdmFyIHNvY2tldCA9IG5ldyBXZWJTb2NrZXQoKTsKKyAgICAgICAgc29ja2V0Lm9ubWVzc2FnZSA9IGZ1bmN0aW9uKCBldmVudCA6IGpzLmh0bWwuTWVzc2FnZUV2ZW50KSB7CisgICAgICAgICAgICB0aGlzLmlucHV0ID0gZXZlbnQuZGF0YTsKKyAgICAgICAgfQorCisgICAgICAgICNlbHNlaWYgZmxhc2gKKyAgICAgICAgdmFyIHNvY2tldCA9IG5ldyBTb2NrZXQoKTsKKyAgICAgICAgc29ja2V0LmNvbm5lY3QoaG9zdCwgcG9ydCk7CisKKyAgICAgICAgI2Vsc2VpZiBwaHAKKyAgICAgICAgdmFyIHNvY2tldCA9IG5ldyBTb2NrZXQoKTsKKyAgICAgICAgc29ja2V0LmNvbm5lY3QoaG9zdCwgcG9ydCk7CisgICAgICAgIHNvY2tldC5zZXRCbG9ja2luZyh0cnVlKTsKKyAgICAgICAgc29ja2V0LnNldFRpbWVvdXQodGltZW91dCk7CisKKyAgICAgICAgI2Vsc2UKKyAgICAgICAgdmFyIHNvY2tldCA9IG5ldyBTb2NrZXQoKTsKKyAgICAgICAgc29ja2V0LnNldEJsb2NraW5nKHRydWUpOworICAgICAgICBzb2NrZXQuc2V0RmFzdFNlbmQodHJ1ZSk7CisgICAgICAgIHNvY2tldC5zZXRUaW1lb3V0KHRpbWVvdXQpOworICAgICAgICBzb2NrZXQuY29ubmVjdChob3N0LCBwb3J0KTsKKworICAgICAgICAjZW5kCisKKyAgICAgICAgYXNzaWduU29ja2V0KCBzb2NrZXQpOworICAgIH0KKworICAgICNpZiBqcworICAgIHByaXZhdGUgZnVuY3Rpb24gYXNzaWduU29ja2V0KCBzb2NrZXQgOiBXZWJTb2NrZXQpICA6ICBWb2lkCisgICAgI2Vsc2UKKyAgICBwcml2YXRlIGZ1bmN0aW9uIGFzc2lnblNvY2tldCggc29ja2V0IDogU29ja2V0KSAgOiAgVm9pZAorICAgICNlbmQKKyAgICB7CisgICAgICAgIHRoaXMuc29ja2V0ID0gc29ja2V0OworCisgICAgICAgICNpZiAoZmxhc2ggfHwganMpCisgICAgICAgIG91dHB1dCA9IHNvY2tldDsKKyAgICAgICAgaW5wdXQgPSBzb2NrZXQ7CisKKyAgICAgICAgI2Vsc2UKKyAgICAgICAgb3V0cHV0ID0gc29ja2V0Lm91dHB1dDsKKyAgICAgICAgaW5wdXQgPSBzb2NrZXQuaW5wdXQ7CisKKyAgICAgICAgI2VuZAorICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRUaW1lb3V0KCB0aW1lb3V0IDogRmxvYXQgKSA6IFZvaWQgeworICAgICAgICBpZihpc09wZW4oKSkgeworICAgICAgICAgICAgc29ja2V0LnNldFRpbWVvdXQodGltZW91dCk7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy50aW1lb3V0ID0gdGltZW91dDsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFN0cmVhbS5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFN0cmVhbS5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGIzZWQzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU3RyZWFtLmh4CkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CisKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzOworaW1wb3J0IGhheGUuaW8uQnl0ZXNCdWZmZXI7CisKKworaW50ZXJmYWNlIFRTdHJlYW0geworICAgIGZ1bmN0aW9uIENsb3NlKCkgOiBWb2lkOworICAgIGZ1bmN0aW9uIFBlZWsoKSA6IEJvb2w7CisgICAgZnVuY3Rpb24gUmVhZCggYnVmIDogQnl0ZXMsIG9mZnNldCA6IEludCwgY291bnQgOiBJbnQpIDogSW50OworICAgIGZ1bmN0aW9uIFdyaXRlKCBidWYgOiBCeXRlcywgb2Zmc2V0IDogSW50LCBjb3VudCA6IEludCkgOiBWb2lkOworICAgIGZ1bmN0aW9uIEZsdXNoKCkgOiBWb2lkOworfQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU3RyZWFtVHJhbnNwb3J0Lmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU3RyZWFtVHJhbnNwb3J0Lmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxYTdjMTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTdHJlYW1UcmFuc3BvcnQuaHgKQEAgLTAsMCArMSwxMDMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5oZWxwZXIuKjsKKworaW1wb3J0IGhheGUuaW8uQnl0ZXM7CitpbXBvcnQgaGF4ZS5pby5CeXRlc0J1ZmZlcjsKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzT3V0cHV0OworaW1wb3J0IGhheGUuaW8uQnl0ZXNJbnB1dDsKKworCitjbGFzcyBUU3RyZWFtVHJhbnNwb3J0IGV4dGVuZHMgVFRyYW5zcG9ydCB7CisKKyAgICBwdWJsaWMgdmFyIElucHV0U3RyZWFtKGRlZmF1bHQsbnVsbCkgOiBUU3RyZWFtOworICAgIHB1YmxpYyB2YXIgT3V0cHV0U3RyZWFtKGRlZmF1bHQsbnVsbCkgOiBUU3RyZWFtOworCisKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KCBpbnB1dCA6IFRTdHJlYW0sIG91dHB1dCA6IFRTdHJlYW0pIHsKKyAgICAgICAgdGhpcy5JbnB1dFN0cmVhbSA9IGlucHV0OworICAgICAgICB0aGlzLk91dHB1dFN0cmVhbSA9IG91dHB1dDsKKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gaXNPcGVuKCkgOiBCb29sIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIHBlZWsoKSA6IEJvb2wgeworICAgICAgICByZXR1cm4gKElucHV0U3RyZWFtICE9IG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBvcGVuKCkgOiBWb2lkIHsKKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gY2xvc2UoKSA6IFZvaWQgeworICAgICAgICBpZiAoSW5wdXRTdHJlYW0gIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgSW5wdXRTdHJlYW0uQ2xvc2UoKTsKKyAgICAgICAgICAgIElucHV0U3RyZWFtID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoT3V0cHV0U3RyZWFtICE9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIE91dHB1dFN0cmVhbS5DbG9zZSgpOworICAgICAgICAgICAgT3V0cHV0U3RyZWFtID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiByZWFkKCBidWYgOiBCeXRlc0J1ZmZlciwgb2ZmIDogSW50LCBsZW4gOiBJbnQpIDogSW50IHsKKyAgICAgICAgaWYgKElucHV0U3RyZWFtID09IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCBUVHJhbnNwb3J0RXhjZXB0aW9uLk5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCByZWFkIGZyb20gbnVsbCBJbnB1dFN0cmVhbSIpOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGRhdGEgOiBCeXRlcyA9ICBCeXRlcy5hbGxvYyhsZW4pOworICAgICAgICB2YXIgc2l6ZSA9IElucHV0U3RyZWFtLlJlYWQoIGRhdGEsIG9mZiwgbGVuKTsKKyAgICAgICAgYnVmLmFkZEJ5dGVzKCBkYXRhLCAwLCBzaXplKTsKKyAgICAgICAgcmV0dXJuIHNpemU7CisgICAgfQorCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIHdyaXRlKGJ1ZjpCeXRlcywgb2ZmIDogSW50LCBsZW4gOiBJbnQpIDogVm9pZCB7CisgICAgICAgIGlmIChPdXRwdXRTdHJlYW0gPT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIFRUcmFuc3BvcnRFeGNlcHRpb24uTk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCB3cml0ZSB0byBudWxsIE91dHB1dFN0cmVhbSIpOworICAgICAgICB9CisKKyAgICAgICAgT3V0cHV0U3RyZWFtLldyaXRlKGJ1Ziwgb2ZmLCBsZW4pOworICAgIH0KKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBmbHVzaChjYWxsYmFjazpEeW5hbWljLT5Wb2lkID1udWxsKSA6IFZvaWQgeworICAgICAgICBpZiAoT3V0cHV0U3RyZWFtID09IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBlcnIgPSBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbiggVFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCBmbHVzaCBudWxsIE91dHB1dFN0cmVhbSIpOworICAgICAgICAgICAgaWYoY2FsbGJhY2sgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHRocm93IGVycjsKKyAgICAgICAgfQorCisgICAgICAgIE91dHB1dFN0cmVhbS5GbHVzaCgpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0Lmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0Lmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2YjMxNzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaHgKQEAgLTAsMCArMSwxMzkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CisKK2ltcG9ydCBoYXhlLmlvLkVvZjsKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzOworaW1wb3J0IGhheGUuaW8uQnl0ZXNCdWZmZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuQWJzdHJhY3RNZXRob2RFcnJvcjsKKworY2xhc3MgVFRyYW5zcG9ydCB7CisKKyAgICAvKioKKyAgICAgKiBRdWVyaWVzIHdoZXRoZXIgdGhlIHRyYW5zcG9ydCBpcyBvcGVuLgorICAgICAqCisgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSB0cmFuc3BvcnQgaXMgb3Blbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gaXNPcGVuKCkgOiBCb29sIHsKKyAgICAgICAgICB0aHJvdyBuZXcgQWJzdHJhY3RNZXRob2RFcnJvcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIElzIHRoZXJlIG1vcmUgZGF0YSB0byBiZSByZWFkPworICAgICAqCisgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSByZW1vdGUgc2lkZSBpcyBzdGlsbCBhbGl2ZSBhbmQgZmVlZGluZyB1cworICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBwZWVrKCkgOiBCb29sIHsKKyAgICAgICAgICByZXR1cm4gaXNPcGVuKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogT3BlbnMgdGhlIHRyYW5zcG9ydCBmb3IgcmVhZGluZy93cml0aW5nLgorICAgICAqCisgICAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIHRoZSB0cmFuc3BvcnQgY291bGQgbm90IGJlIG9wZW5lZAorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBvcGVuKCkgOiBWb2lkIHsKKyAgICAgICAgICB0aHJvdyBuZXcgQWJzdHJhY3RNZXRob2RFcnJvcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsb3NlcyB0aGUgdHJhbnNwb3J0LgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBjbG9zZSgpIDogVm9pZCB7CisgICAgICAgICAgdGhyb3cgbmV3IEFic3RyYWN0TWV0aG9kRXJyb3IoKTsKKyAgICB9OworCisgICAgLyoqCisgICAgICogUmVhZHMgdXAgdG8gbGVuIGJ5dGVzIGludG8gYnVmZmVyIGJ1Ziwgc3RhcnRpbmcgYXR0IG9mZnNldCBvZmYuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYnVmIEFycmF5IHRvIHJlYWQgaW50bworICAgICAqIEBwYXJhbSBvZmYgSW5kZXggdG8gc3RhcnQgcmVhZGluZyBhdAorICAgICAqIEBwYXJhbSBsZW4gTWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZAorICAgICAqIEByZXR1cm4gVGhlIGJ5dGVzIGNvdW50IGFjdHVhbGx5IHJlYWQKKyAgICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgdGhlcmUgd2FzIGFuIGVycm9yIHJlYWRpbmcgZGF0YQorICAgICAqLworICAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZCggYnVmIDogQnl0ZXNCdWZmZXIsIG9mZiA6IEludCwgbGVuIDogSW50KSA6IEludCB7CisgICAgICAgICAgdGhyb3cgbmV3IEFic3RyYWN0TWV0aG9kRXJyb3IoKTsKKyAgICAgfQorCisgICAgLyoqCisgICAgICogR3VhcmFudGVlcyB0aGF0IGFsbCBvZiBsZW4gYnl0ZXMgYXJlIGFjdHVhbGx5IHJlYWQgb2ZmIHRoZSB0cmFuc3BvcnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYnVmIEFycmF5IHRvIHJlYWQgaW50bworICAgICAqIEBwYXJhbSBvZmYgSW5kZXggdG8gc3RhcnQgcmVhZGluZyBhdAorICAgICAqIEBwYXJhbSBsZW4gTWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZAorICAgICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSByZWFkLCB3aGljaCBtdXN0IGJlIGVxdWFsIHRvIGxlbgorICAgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiB0aGVyZSB3YXMgYW4gZXJyb3IgcmVhZGluZyBkYXRhCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRBbGwoYnVmIDogQnl0ZXNCdWZmZXIsIG9mZiA6IEludCwgbGVuIDogSW50KSA6IEludCB7CisgICAgICAgIHZhciBnb3QgOiBJbnQgPSAwOworICAgICAgICB2YXIgcmV0IDogSW50ID0gMDsKKyAgICAgICAgd2hpbGUgKGdvdCA8IGxlbikgeworICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXQgPSByZWFkKGJ1Ziwgb2ZmK2dvdCwgbGVuLWdvdCk7CisgICAgICAgICAgICBpZiAocmV0IDw9IDApIHsKKyAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5VTktOT1dOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IHJlYWQuIFJlbW90ZSBzaWRlIGhhcyBjbG9zZWQuIFRyaWVkIHRvIHJlYWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICArIGxlbiArICIgYnl0ZXMsIGJ1dCBvbmx5IGdvdCAiICsgZ290ICsgIiBieXRlcy4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgY2F0Y2ggKGVvZiA6IEVvZikgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FTkRfT0ZfRklMRSwgJ0NhblwndCByZWFkICRsZW4gYnl0ZXMhJyk7CisgICAgICAgICAgfQorICAgICAgICAgIGdvdCArPSByZXQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGdvdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgdGhlIGJ1ZmZlciB0byB0aGUgb3V0cHV0CisgICAgICoKKyAgICAgKiBAcGFyYW0gYnVmIFRoZSBvdXRwdXQgZGF0YSBidWZmZXIKKyAgICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzIHdyaXRpbmcgZGF0YQorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUFsbChidWY6Qnl0ZXMpIDogVm9pZCB7CisgICAgICAgIHdyaXRlKGJ1ZiwgMCwgYnVmLmxlbmd0aCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGVzIHVwIHRvIGxlbiBieXRlcyBmcm9tIHRoZSBidWZmZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYnVmIFRoZSBvdXRwdXQgZGF0YSBidWZmZXIKKyAgICAgKiBAcGFyYW0gb2ZmIFRoZSBvZmZzZXQgdG8gc3RhcnQgd3JpdGluZyBmcm9tCisgICAgICogQHBhcmFtIGxlbiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlCisgICAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIHRoZXJlIHdhcyBhbiBlcnJvciB3cml0aW5nIGRhdGEKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoYnVmOkJ5dGVzLCBvZmYgOiBJbnQsIGxlbiA6IEludCkgOiBWb2lkIHsKKyAgICAgICAgdGhyb3cgbmV3IEFic3RyYWN0TWV0aG9kRXJyb3IoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGbHVzaCBhbnkgcGVuZGluZyBkYXRhIG91dCBvZiBhIHRyYW5zcG9ydCBidWZmZXIuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgdGhlcmUgd2FzIGFuIGVycm9yIHdyaXRpbmcgb3V0IGRhdGEuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIGZsdXNoKGNhbGxiYWNrOkR5bmFtaWMtPlZvaWQgPW51bGwpIDogVm9pZCB7CisgICAgICAgIGlmKGNhbGxiYWNrICE9IG51bGwpCisgICAgICAgICAgICBjYWxsYmFjayhuZXcgQWJzdHJhY3RNZXRob2RFcnJvcigpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdGhyb3cgbmV3IEFic3RyYWN0TWV0aG9kRXJyb3IoKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDAyOGRkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmh4CkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOworCitjbGFzcyBUVHJhbnNwb3J0RXhjZXB0aW9uIGV4dGVuZHMgVEV4Y2VwdGlvbiB7CisKKyAgICAvLyBXQVJOSU5HOiBUaGVzZSBhcmUgc3ViamVjdCB0byBiZSBleHRlbmRlZCBpbiB0aGUgZnV0dXJlLCBzbyB3ZSBjYW4ndCB1c2UgZW51bXMKKyAgICAvLyB3aXRoIEhheGUgMy4xLjMgYmVjYXVzZSBvZiBodHRwczovL2dpdGh1Yi5jb20vSGF4ZUZvdW5kYXRpb24vaGF4ZS9pc3N1ZXMvMzY0OQorICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBVTktOT1dOIDogSW50ID0gMDsKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgTk9UX09QRU4gOiBJbnQgPSAxOworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBBTFJFQURZX09QRU4gOiBJbnQgPSAyOworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBUSU1FRF9PVVQgOiBJbnQgPSAzOworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBFTkRfT0ZfRklMRSA6IEludCA9IDQ7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KGVycm9yIDogSW50ID0gVU5LTk9XTiwgbWVzc2FnZSA6IFN0cmluZyA9ICIiKSB7CisgICAgICAgIHN1cGVyKG1lc3NhZ2UsIGVycm9yKTsKKyAgICB9CisKK30KKyAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRGYWN0b3J5Lmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0RmFjdG9yeS5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjFmMzVmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0RmFjdG9yeS5oeApAQCAtMCwwICsxLDQ0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OworCisvKioKKyAqIEZhY3RvcnkgY2xhc3MgdXNlZCB0byBjcmVhdGUgd3JhcHBlZCBpbnN0YW5jZSBvZiBUcmFuc3BvcnRzLgorICogVGhpcyBpcyB1c2VkIHByaW1hcmlseSBpbiBzZXJ2ZXJzLCB3aGljaCBnZXQgVHJhbnNwb3J0cyBmcm9tCisgKiBhIFNlcnZlclRyYW5zcG9ydCBhbmQgdGhlbiBtYXkgd2FudCB0byBtdXRhdGUgdGhlbSAoaS5lLiBjcmVhdGUKKyAqIGEgQnVmZmVyZWRUcmFuc3BvcnQgZnJvbSB0aGUgdW5kZXJseWluZyBiYXNlIHRyYW5zcG9ydCkKKyAqCisgKi8KK2NsYXNzIFRUcmFuc3BvcnRGYWN0b3J5IHsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgKiBSZXR1cm4gYSB3cmFwcGVkIGluc3RhbmNlIG9mIHRoZSBiYXNlIFRyYW5zcG9ydC4KKyAgICAqCisgICAgKiBAcGFyYW0gdHJhbnMgVGhlIGJhc2UgdHJhbnNwb3J0CisgICAgKiBAcmV0dXJuIFdyYXBwZWQgVHJhbnNwb3J0CisgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0VHJhbnNwb3J0KCB0cmFucyA6IFRUcmFuc3BvcnQpIDogVFRyYW5zcG9ydCB7CisgICAgICAgIHJldHVybiB0cmFuczsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFdyYXBwaW5nU2VydmVyVHJhbnNwb3J0Lmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UV3JhcHBpbmdTZXJ2ZXJUcmFuc3BvcnQuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjIyNzJmMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFdyYXBwaW5nU2VydmVyVHJhbnNwb3J0Lmh4CkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CisKKworLyoKKyAgIHdyYXBzIHJlYWwgdHJhbnNwb3J0LCBwcm92aWRlZCBieSBjb25zdHJ1Y3RvcgorKi8KK2NsYXNzIFRXcmFwcGluZ1NlcnZlclRyYW5zcG9ydCBleHRlbmRzIFRTZXJ2ZXJUcmFuc3BvcnQgeworCisgIHByaXZhdGUgdmFyIHRyYW5zcG9ydChkZWZhdWx0LG51bGwpIDogVFRyYW5zcG9ydDsKKworICBwdWJsaWMgZnVuY3Rpb24gbmV3KHRyYW5zcG9ydCA6IFRUcmFuc3BvcnQpIHsKKyAgICB0aGlzLnRyYW5zcG9ydCA9IHRyYW5zcG9ydDsKKyAgfQorCisgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBMaXN0ZW4oKSA6IFZvaWQKKyAgeworICB9CisKKyAgcHJpdmF0ZSBvdmVycmlkZSBmdW5jdGlvbiBBY2NlcHRJbXBsKCkgOiBUVHJhbnNwb3J0CisgIHsKKyAgICByZXR1cm4gdHJhbnNwb3J0OworICB9CisKKyAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIENsb3NlKCkgOiBWb2lkCisgIHsKKworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvaGF4ZS90ZXN0L0hheGVUZXN0cy5oeHByb2ogYi9saWIvaGF4ZS90ZXN0L0hheGVUZXN0cy5oeHByb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JlZWQ4MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3Rlc3QvSGF4ZVRlc3RzLmh4cHJvagpAQCAtMCwwICsxLDY5IEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPHByb2plY3QgdmVyc2lvbj0iMiI+CisgIDwhLS0gT3V0cHV0IFNXRiBvcHRpb25zIC0tPgorICA8b3V0cHV0PgorICAgIDxtb3ZpZSBvdXRwdXRUeXBlPSJBcHBsaWNhdGlvbiIgLz4KKyAgICA8bW92aWUgaW5wdXQ9IiIgLz4KKyAgICA8bW92aWUgcGF0aD0iYmluL0hheGVUZXN0cyIgLz4KKyAgICA8bW92aWUgZnBzPSIzMCIgLz4KKyAgICA8bW92aWUgd2lkdGg9IjgwMCIgLz4KKyAgICA8bW92aWUgaGVpZ2h0PSI2MDAiIC8+CisgICAgPG1vdmllIHZlcnNpb249IjEiIC8+CisgICAgPG1vdmllIG1pbm9yVmVyc2lvbj0iMCIgLz4KKyAgICA8bW92aWUgcGxhdGZvcm09IkMrKyIgLz4KKyAgICA8bW92aWUgYmFja2dyb3VuZD0iI0ZGRkZGRiIgLz4KKyAgPC9vdXRwdXQ+CisgIDwhLS0gT3RoZXIgY2xhc3NlcyB0byBiZSBjb21waWxlZCBpbnRvIHlvdXIgU1dGIC0tPgorICA8Y2xhc3NwYXRocz4KKyAgICA8Y2xhc3MgcGF0aD0ic3JjIiAvPgorICAgIDxjbGFzcyBwYXRoPSJnZW4taGF4ZSIgLz4KKyAgICA8Y2xhc3MgcGF0aD0iLi4vc3JjIiAvPgorICA8L2NsYXNzcGF0aHM+CisgIDwhLS0gQnVpbGQgb3B0aW9ucyAtLT4KKyAgPGJ1aWxkPgorICAgIDxvcHRpb24gZGlyZWN0aXZlcz0iIiAvPgorICAgIDxvcHRpb24gZmxhc2hTdHJpY3Q9IkZhbHNlIiAvPgorICAgIDxvcHRpb24gbm9JbmxpbmVPbkRlYnVnPSJGYWxzZSIgLz4KKyAgICA8b3B0aW9uIG1haW5DbGFzcz0iTWFpbiIgLz4KKyAgICA8b3B0aW9uIGVuYWJsZWRlYnVnPSJGYWxzZSIgLz4KKyAgICA8b3B0aW9uIGFkZGl0aW9uYWw9IiIgLz4KKyAgPC9idWlsZD4KKyAgPCEtLSBoYXhlbGliIGxpYnJhcmllcyAtLT4KKyAgPGhheGVsaWI+CisgICAgPCEtLSBleGFtcGxlOiA8bGlicmFyeSBuYW1lPSIuLi4iIC8+IC0tPgorICA8L2hheGVsaWI+CisgIDwhLS0gQ2xhc3MgZmlsZXMgdG8gY29tcGlsZSAob3RoZXIgcmVmZXJlbmNlZCBjbGFzc2VzIHdpbGwgYXV0b21hdGljYWxseSBiZSBpbmNsdWRlZCkgLS0+CisgIDxjb21waWxlVGFyZ2V0cz4KKyAgICA8IS0tIGV4YW1wbGU6IDxjb21waWxlIHBhdGg9Ii4uLiIgLz4gLS0+CisgIDwvY29tcGlsZVRhcmdldHM+CisgIDwhLS0gUGF0aHMgdG8gZXhjbHVkZSBmcm9tIHRoZSBQcm9qZWN0IEV4cGxvcmVyIHRyZWUgLS0+CisgIDxoaWRkZW5QYXRocz4KKyAgICA8aGlkZGVuIHBhdGg9Im9iaiIgLz4KKyAgICA8aGlkZGVuIHBhdGg9ImNwcC5oeG1sIiAvPgorICAgIDxoaWRkZW4gcGF0aD0iY3NoYXJwLmh4bWwiIC8+CisgICAgPGhpZGRlbiBwYXRoPSJmbGFzaC5oeG1sIiAvPgorICAgIDxoaWRkZW4gcGF0aD0iamF2YS5oeG1sIiAvPgorICAgIDxoaWRkZW4gcGF0aD0iamF2YXNjcmlwdC5oeG1sIiAvPgorICAgIDxoaWRkZW4gcGF0aD0ibWFrZV9hbGwuYmF0IiAvPgorICAgIDxoaWRkZW4gcGF0aD0ibWFrZV9hbGwuc2giIC8+CisgICAgPGhpZGRlbiBwYXRoPSJNYWtlZmlsZS5hbSIgLz4KKyAgICA8aGlkZGVuIHBhdGg9Im5la28uaHhtbCIgLz4KKyAgICA8aGlkZGVuIHBhdGg9InBocC5oeG1sIiAvPgorICAgIDxoaWRkZW4gcGF0aD0icHJvamVjdC5oaWRlIiAvPgorICAgIDxoaWRkZW4gcGF0aD0icHl0aG9uLmh4bWwiIC8+CisgIDwvaGlkZGVuUGF0aHM+CisgIDwhLS0gRXhlY3V0ZWQgYmVmb3JlIGJ1aWxkIC0tPgorICA8cHJlQnVpbGRDb21tYW5kPnRocmlmdCAtciAtZ2VuIGhheGUgIC4uLy4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKK3RocmlmdCAtciAtZ2VuIGhheGUgIC4uLy4uLy4uL2NvbnRyaWIvYXN5bmMtdGVzdC9hZ2dyLnRocmlmdAordGhyaWZ0IC1yIC1nZW4gaGF4ZSAgLi4vLi4vLi4vbGliL3JiL2JlbmNobWFyay9CZW5jaG1hcmsudGhyaWZ0PC9wcmVCdWlsZENvbW1hbmQ+CisgIDwhLS0gRXhlY3V0ZWQgYWZ0ZXIgYnVpbGQgLS0+CisgIDxwb3N0QnVpbGRDb21tYW5kIGFsd2F5c1J1bj0iRmFsc2UiIC8+CisgIDwhLS0gT3RoZXIgcHJvamVjdCBvcHRpb25zIC0tPgorICA8b3B0aW9ucz4KKyAgICA8b3B0aW9uIHNob3dIaWRkZW5QYXRocz0iRmFsc2UiIC8+CisgICAgPG9wdGlvbiB0ZXN0TW92aWU9IkN1c3RvbSIgLz4KKyAgICA8b3B0aW9uIHRlc3RNb3ZpZUNvbW1hbmQ9ImJpbi9IYXhlVGVzdHMvTWFpbi5leGUgc2VydmVyIG11bHRpcGxleCIgLz4KKyAgPC9vcHRpb25zPgorICA8IS0tIFBsdWdpbiBzdG9yYWdlIC0tPgorICA8c3RvcmFnZSAvPgorPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3Rlc3QvTWFrZWZpbGUuYW0gYi9saWIvaGF4ZS90ZXN0L01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiOGIyNDUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS90ZXN0L01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsODUgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitUSFJJRlRDTUQgPSAkKFRIUklGVCkgLS1nZW4gaGF4ZSAtcgorVEhSSUZUVEVTVCA9ICQodG9wX3NyY2RpcikvdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorQUdHUiA9ICQodG9wX3NyY2RpcikvY29udHJpYi9hc3luYy10ZXN0L2FnZ3IudGhyaWZ0CitCRU5DSE1BUksgPSAkKHRvcF9zcmNkaXIpL2xpYi9yYi9iZW5jaG1hcmsvQmVuY2htYXJrLnRocmlmdAorCitCSU5fQ1BQID0gYmluL01haW4tZGVidWcKK0JJTl9QSFAgPSBiaW4vcGhwL01haW4tZGVidWcucGhwCisKK2dlbi1oYXhlL3RocmlmdC90ZXN0L1RocmlmdFRlc3QuaHg6ICQoVEhSSUZUVEVTVCkKKwkkKFRIUklGVENNRCkgJChUSFJJRlRURVNUKQorCitnZW4taGF4ZS90aHJpZnQvdGVzdC9BZ2dyLmh4OiAkKEFHR1IpCisJJChUSFJJRlRDTUQpICQoQUdHUikKKworZ2VuLWhheGUvdGhyaWZ0L3Rlc3QvQmVuY2htYXJrU2VydmljZS5oeDogJChCRU5DSE1BUkspCisJJChUSFJJRlRDTUQpICQoQkVOQ0hNQVJLKQorCithbGwtbG9jYWw6ICQoQklOX0NQUCkgJChCSU5fUEhQKQorCiskKEJJTl9DUFApOiBcCisJCXNyYy8qLmh4IFwKKwkJLi4vc3JjL29yZy9hcGFjaGUvdGhyaWZ0LyoqLyouaHggXAorCQlnZW4taGF4ZS90aHJpZnQvdGVzdC9UaHJpZnRUZXN0Lmh4IFwKKwkJZ2VuLWhheGUvdGhyaWZ0L3Rlc3QvQWdnci5oeCBcCisJCWdlbi1oYXhlL3RocmlmdC90ZXN0L0JlbmNobWFya1NlcnZpY2UuaHgKKwkkKEhBWEUpIC0tY3dkIC4gIGNwcC5oeG1sCisKKyQoQklOX1BIUCk6IFwKKwkJc3JjLyouaHggXAorCQkuLi9zcmMvb3JnL2FwYWNoZS90aHJpZnQvKiovKi5oeCBcCisJCWdlbi1oYXhlL3RocmlmdC90ZXN0L1RocmlmdFRlc3QuaHggXAorCQlnZW4taGF4ZS90aHJpZnQvdGVzdC9BZ2dyLmh4IFwKKwkJZ2VuLWhheGUvdGhyaWZ0L3Rlc3QvQmVuY2htYXJrU2VydmljZS5oeAorCSQoSEFYRSkgLS1jd2QgLiAgcGhwLmh4bWwKKworCisjVE9ETzogb3RoZXIgaGF4ZSB0YXJnZXRzCisjICAgICQoSEFYRSkgIC0tY3dkIC4gIGNzaGFycAorIyAgICAkKEhBWEUpICAtLWN3ZCAuICBmbGFzaAorIyAgICAkKEhBWEUpICAtLWN3ZCAuICBqYXZhCisjICAgICQoSEFYRSkgIC0tY3dkIC4gIGphdmFzY3JpcHQKKyMgICAgJChIQVhFKSAgLS1jd2QgLiAgbmVrbworIyAgICAkKEhBWEUpICAtLWN3ZCAuICBweXRob24gICMgbmVlZHMgSGF4ZSAzLjIuMAorCisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIC1yIGdlbi1oYXhlIGJpbgorCitjaGVjazogJChCSU5fQ1BQKSAkKEJJTl9QSFApCisJJChCSU5fQ1BQKQorCXBocCAtZiAkKEJJTl9QSFApCisKK0VYVFJBX0RJU1QgPSBcCisgICAgICAgICAgICAgc3JjIFwKKyAgICAgICAgICAgICBjcHAuaHhtbCBcCisgICAgICAgICAgICAgY3NoYXJwLmh4bWwgXAorICAgICAgICAgICAgIGZsYXNoLmh4bWwgXAorICAgICAgICAgICAgIGphdmEuaHhtbCBcCisgICAgICAgICAgICAgamF2YXNjcmlwdC5oeG1sIFwKKyAgICAgICAgICAgICBuZWtvLmh4bWwgXAorICAgICAgICAgICAgIHBocC5oeG1sIFwKKyAgICAgICAgICAgICBweXRob24uaHhtbCBcCisgICAgICAgICAgICAgcHJvamVjdC5oaWRlIFwKKyAgICAgICAgICAgICBIYXhlVGVzdHMuaHhwcm9qIFwKKyAgICAgICAgICAgICBtYWtlX2FsbC5iYXQgXAorICAgICAgICAgICAgIG1ha2VfYWxsLnNoCmRpZmYgLS1naXQgYS9saWIvaGF4ZS90ZXN0L2NwcC5oeG1sIGIvbGliL2hheGUvdGVzdC9jcHAuaHhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Mzg0OGE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvdGVzdC9jcHAuaHhtbApAQCAtMCwwICsxLDQxIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyAKKyNpbnRlZ3JhdGUgZmlsZXMgdG8gY2xhc3NwYXRoCistY3Agc3JjCistY3AgLi4vc3JjCistY3AgZ2VuLWhheGUKKworI3RoaXMgY2xhc3Mgd2lsIGJlIHVzZWQgYXMgZW50cnkgcG9pbnQgZm9yIHlvdXIgYXBwLgorLW1haW4gTWFpbgorCisjQ1BQIHRhcmdldAorLWNwcCBiaW4KKworI1RvIHByb2R1Y2UgNjQgYml0IGJpbmFyaWVzIHRoZSBmaWxlIHNob3VsZCBkZWZpbmUgdGhlIEhYQ1BQX002NCBjb21waWxlIHZhcmlhYmxlOgorIy1EIEhYQ1BQX002NAorCisjQWRkIGRlYnVnIGluZm9ybWF0aW9uCistZGVidWcKKworI2RlYWQgY29kZSBlbGltaW5hdGlvbiA6IHJlbW92ZSB1bnVzZWQgY29kZQorIyItZGNlIG5vIiA6IGRvIG5vdCByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBzdGQiIDogcmVtb3ZlIHVudXNlZCBjb2RlIGluIHRoZSBzdGQgbGliIChkZWZhdWx0KQorIyItZGNlIGZ1bGwiIDogcmVtb3ZlIGFsbCB1bnVzZWQgY29kZQorLWRjZSBmdWxsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvdGVzdC9jc2hhcnAuaHhtbCBiL2xpYi9oYXhlL3Rlc3QvY3NoYXJwLmh4bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGMzNGIwZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3Rlc3QvY3NoYXJwLmh4bWwKQEAgLTAsMCArMSwzOCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisgCisjaW50ZWdyYXRlIGZpbGVzIHRvIGNsYXNzcGF0aAorLWNwIHNyYworLWNwIC4uL3NyYworLWNwIGdlbi1oYXhlCisKKyN0aGlzIGNsYXNzIHdpbCBiZSB1c2VkIGFzIGVudHJ5IHBvaW50IGZvciB5b3VyIGFwcC4KKy1tYWluIE1haW4KKworI0NTSEFSUCB0YXJnZXQKKy1jcyBiaW4vVGVzdC5leGUKKworI0FkZCBkZWJ1ZyBpbmZvcm1hdGlvbgorLWRlYnVnCisKKyNkZWFkIGNvZGUgZWxpbWluYXRpb24gOiByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBubyIgOiBkbyBub3QgcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugc3RkIiA6IHJlbW92ZSB1bnVzZWQgY29kZSBpbiB0aGUgc3RkIGxpYiAoZGVmYXVsdCkKKyMiLWRjZSBmdWxsIiA6IHJlbW92ZSBhbGwgdW51c2VkIGNvZGUKKy1kY2UgZnVsbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3Rlc3QvZmxhc2guaHhtbCBiL2xpYi9oYXhlL3Rlc3QvZmxhc2guaHhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjE3NjMxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvdGVzdC9mbGFzaC5oeG1sCkBAIC0wLDAgKzEsMzggQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIAorI2ludGVncmF0ZSBmaWxlcyB0byBjbGFzc3BhdGgKKy1jcCBzcmMKKy1jcCAuLi9zcmMKKy1jcCBnZW4taGF4ZQorCisjdGhpcyBjbGFzcyB3aWwgYmUgdXNlZCBhcyBlbnRyeSBwb2ludCBmb3IgeW91ciBhcHAuCistbWFpbiBNYWluCisKKyNGbGFzaCB0YXJnZXQKKy1zd2YgYmluL1Rlc3Quc3dmCisKKyNBZGQgZGVidWcgaW5mb3JtYXRpb24KKy1kZWJ1ZworCisjZGVhZCBjb2RlIGVsaW1pbmF0aW9uIDogcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugbm8iIDogZG8gbm90IHJlbW92ZSB1bnVzZWQgY29kZQorIyItZGNlIHN0ZCIgOiByZW1vdmUgdW51c2VkIGNvZGUgaW4gdGhlIHN0ZCBsaWIgKGRlZmF1bHQpCisjIi1kY2UgZnVsbCIgOiByZW1vdmUgYWxsIHVudXNlZCBjb2RlCistZGNlIGZ1bGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvaGF4ZS90ZXN0L2phdmEuaHhtbCBiL2xpYi9oYXhlL3Rlc3QvamF2YS5oeG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5NDcxNTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS90ZXN0L2phdmEuaHhtbApAQCAtMCwwICsxLDM4IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyAKKyNpbnRlZ3JhdGUgZmlsZXMgdG8gY2xhc3NwYXRoCistY3Agc3JjCistY3AgLi4vc3JjCistY3AgZ2VuLWhheGUKKworI3RoaXMgY2xhc3Mgd2lsIGJlIHVzZWQgYXMgZW50cnkgcG9pbnQgZm9yIHlvdXIgYXBwLgorLW1haW4gTWFpbgorCisjSmF2YSB0YXJnZXQKKy1qYXZhIGJpbi9UZXN0LmphcgorCisjQWRkIGRlYnVnIGluZm9ybWF0aW9uCistZGVidWcKKworI2RlYWQgY29kZSBlbGltaW5hdGlvbiA6IHJlbW92ZSB1bnVzZWQgY29kZQorIyItZGNlIG5vIiA6IGRvIG5vdCByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBzdGQiIDogcmVtb3ZlIHVudXNlZCBjb2RlIGluIHRoZSBzdGQgbGliIChkZWZhdWx0KQorIyItZGNlIGZ1bGwiIDogcmVtb3ZlIGFsbCB1bnVzZWQgY29kZQorLWRjZSBmdWxsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvdGVzdC9qYXZhc2NyaXB0Lmh4bWwgYi9saWIvaGF4ZS90ZXN0L2phdmFzY3JpcHQuaHhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGQ5OTY0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvdGVzdC9qYXZhc2NyaXB0Lmh4bWwKQEAgLTAsMCArMSw0NCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisgCisjaW50ZWdyYXRlIGZpbGVzIHRvIGNsYXNzcGF0aAorLWNwIHNyYworLWNwIC4uL3NyYworLWNwIGdlbi1oYXhlCisKKyN0aGlzIGNsYXNzIHdpbCBiZSB1c2VkIGFzIGVudHJ5IHBvaW50IGZvciB5b3VyIGFwcC4KKy1tYWluIE1haW4KKworI0phdmFTY3JpcHQgdGFyZ2V0CistanMgYmluL1Rlc3QuanMKKworI1lvdSBjYW4gdXNlIC1EIHNvdXJjZS1tYXAtY29udGVudCAocmVxdWlyZXMgSGF4ZSAzLjErKSB0byBoYXZlIHRoZSAuaHggCisjZmlsZXMgZGlyZWN0bHkgZW1iZWRkZWQgaW50byB0aGUgbWFwIGZpbGUsIHRoaXMgd2F5IHlvdSBvbmx5IGhhdmUgdG8gCisjdXBsb2FkIGl0LCBhbmQgaXQgd2lsbCBiZSBhbHdheXMgaW4gc3luYyB3aXRoIHRoZSBjb21waWxlZCAuanMgZXZlbiBpZiAKKyN5b3UgbW9kaWZ5IHlvdXIgLmh4IGZpbGVzLgorLUQgc291cmNlLW1hcC1jb250ZW50CisKKyNHZW5lcmF0ZSBzb3VyY2UgbWFwIGFuZCBhZGQgZGVidWcgaW5mb3JtYXRpb24KKy1kZWJ1ZworCisjZGVhZCBjb2RlIGVsaW1pbmF0aW9uIDogcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugbm8iIDogZG8gbm90IHJlbW92ZSB1bnVzZWQgY29kZQorIyItZGNlIHN0ZCIgOiByZW1vdmUgdW51c2VkIGNvZGUgaW4gdGhlIHN0ZCBsaWIgKGRlZmF1bHQpCisjIi1kY2UgZnVsbCIgOiByZW1vdmUgYWxsIHVudXNlZCBjb2RlCistZGNlIGZ1bGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvaGF4ZS90ZXN0L21ha2VfYWxsLmJhdCBiL2xpYi9oYXhlL3Rlc3QvbWFrZV9hbGwuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzMTRlMTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS90ZXN0L21ha2VfYWxsLmJhdApAQCAtMCwwICsxLDcwIEBACitAZWNobyBvZmYKK3JlbSAvKgorcmVtICAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK3JlbSAgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorcmVtICAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCityZW0gICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCityZW0gICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorcmVtICAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKK3JlbSAgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKK3JlbSAgKgorcmVtICAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCityZW0gICoKK3JlbSAgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCityZW0gICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KK3JlbSAgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKK3JlbSAgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorcmVtICAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKK3JlbSAgKiB1bmRlciB0aGUgTGljZW5zZS4KK3JlbSAgKi8KKworc2V0bG9jYWwKK2lmICIlSE9NRURSSVZFJSI9PSIiIGdvdG8gTUlTU0lOR1ZBUlMKK2lmICIlSE9NRVBBVEglIj09IiIgZ290byBNSVNTSU5HVkFSUworaWYgIiVIQVhFUEFUSCUiPT0iIiBnb3RvIE5PVElOU1RBTExFRAorCitzZXQgcGF0aD0lSEFYRVBBVEglOyVIQVhFUEFUSCVcLi5cbmVrbzslcGF0aCUKKworcmVtICMgaW52b2tlIFRocmlmdCBjb21ucGlsZXIKK3RocmlmdCAtciAtZ2VuIGhheGUgIC4uXC4uXC4uXHRlc3RcVGhyaWZ0VGVzdC50aHJpZnQKK3RocmlmdCAtciAtZ2VuIGhheGUgIC4uXC4uXC4uXGNvbnRyaWJcYXN5bmMtdGVzdFxhZ2dyLnRocmlmdAordGhyaWZ0IC1yIC1nZW4gaGF4ZSAgLi5cLi5cLi5cbGliXHJiXGJlbmNobWFya1xCZW5jaG1hcmsudGhyaWZ0CitpZiBlcnJvcmxldmVsIDEgZ290byBTVE9QCisKK3JlbSAjIGludm9rZSBIYXhlIGNvbXBpbGVyIGZvciBhbGwgdGFyZ2V0cworZm9yICUlYSBpbiAoKi5oeG1sKSBkbyAoCisJcmVtICogZmlsdGVyIFB5dGhvbiwgYXMgaXQgaXMgbm90IHN1cHBvcnRlZCBieSBIYXhlIDMuMS4zIChidXQgd2lsbCBiZSBpbiAzLjEuNCkKKwlpZiBub3QgIiUlYSI9PSJweXRob24uaHhtbCIgKAorCQllY2hvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCWVjaG8gQnVpbGRpbmcgJSVhIC4uLgorCQllY2hvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCWhheGUgIC0tY3dkIC4gICUlYQorCSkKKykKKworCitlY2hvLgorZWNobyBkb25lLgorcGF1c2UKK2dvdG8gZW9mCisKKzpOT1RJTlNUQUxMRUQKK2VjaG8gRkFUQUw6IEVpdGhlciBIYXhlIGlzIG5vdCBpbnN0YWxsZWQsIG9yIHRoZSBIQVhFUEFUSCB2YXJpYWJsZSBpcyBub3Qgc2V0LgorcGF1c2UKK2dvdG8gZW9mCisKKzpNSVNTSU5HVkFSUworZWNobyBGQVRBTDogVW5hYmxlIHRvIGxvY2F0ZSBob21lIGZvbGRlci4KK2VjaG8uCitlY2hvIEJvdGggSE9NRURSSVZFIGFuZCBIT01FUEFUSCBuZWVkIHRvIGJlIHNldCB0byBwb2ludCB0byB5b3VyIEhvbWUgZm9sZGVyLgorZWNobyBUaGUgY3VycmVudCB2YWx1ZXMgYXJlOgorZWNobyBIT01FRFJJVkU9JUhPTUVEUklWRSUKK2VjaG8gSE9NRVBBVEg9JUhPTUVQQVRIJQorcGF1c2UKK2dvdG8gZW9mCisKKzpTVE9QCitwYXVzZQorZ290byBlb2YKKworOmVvZgpkaWZmIC0tZ2l0IGEvbGliL2hheGUvdGVzdC9tYWtlX2FsbC5zaCBiL2xpYi9oYXhlL3Rlc3QvbWFrZV9hbGwuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTEyZjVlYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3Rlc3QvbWFrZV9hbGwuc2gKQEAgLTAsMCArMSw0MyBAQAorIyEvYmluL3NoCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIyBpbnZva2UgVGhyaWZ0IGNvbW5waWxlcgordGhyaWZ0IC1yIC1nZW4gaGF4ZSAgLi4vLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdAordGhyaWZ0IC1yIC1nZW4gaGF4ZSAgLi4vLi4vLi4vY29udHJpYi9hc3luYy10ZXN0L2FnZ3IudGhyaWZ0Cit0aHJpZnQgLXIgLWdlbiBoYXhlICAuLi8uLi8uLi9saWIvcmIvYmVuY2htYXJrL0JlbmNobWFyay50aHJpZnQKKworIyBvdXRwdXQgZm9sZGVyCitpZiBbICEgLWQgYmluIF07IHRoZW4KKyAgbWtkaXIgIGJpbgorZmkKKworIyBpbnZva2UgSGF4ZSBjb21waWxlcgorZm9yIHRhcmdldCBpbiAqLmh4bWw7IGRvIAorICBlY2hvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIGVjaG8gQnVpbGRpbmcgJHt0YXJnZXR9IC4uLgorICBlY2hvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIGlmIFsgISAtZCBiaW4vJHt0YXJnZXR9IF07IHRoZW4KKyAgICBta2RpciAgYmluLyR7dGFyZ2V0fQorICBmaQorICBoYXhlICAtLWN3ZCAuICAke3RhcmdldH0gCitkb25lCisKKworI2VvZgpkaWZmIC0tZ2l0IGEvbGliL2hheGUvdGVzdC9uZWtvLmh4bWwgYi9saWIvaGF4ZS90ZXN0L25la28uaHhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGI3MGM4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvdGVzdC9uZWtvLmh4bWwKQEAgLTAsMCArMSwzOCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisgCisjaW50ZWdyYXRlIGZpbGVzIHRvIGNsYXNzcGF0aAorLWNwIHNyYworLWNwIC4uL3NyYworLWNwIGdlbi1oYXhlCisKKyN0aGlzIGNsYXNzIHdpbCBiZSB1c2VkIGFzIGVudHJ5IHBvaW50IGZvciB5b3VyIGFwcC4KKy1tYWluIE1haW4KKworI25la28gdGFyZ2V0CistbmVrbyBiaW4vVGVzdC5uCisKKyNBZGQgZGVidWcgaW5mb3JtYXRpb24KKy1kZWJ1ZworCisjZGVhZCBjb2RlIGVsaW1pbmF0aW9uIDogcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugbm8iIDogZG8gbm90IHJlbW92ZSB1bnVzZWQgY29kZQorIyItZGNlIHN0ZCIgOiByZW1vdmUgdW51c2VkIGNvZGUgaW4gdGhlIHN0ZCBsaWIgKGRlZmF1bHQpCisjIi1kY2UgZnVsbCIgOiByZW1vdmUgYWxsIHVudXNlZCBjb2RlCistZGNlIGZ1bGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvaGF4ZS90ZXN0L3BocC5oeG1sIGIvbGliL2hheGUvdGVzdC9waHAuaHhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGYyYjJkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvdGVzdC9waHAuaHhtbApAQCAtMCwwICsxLDM5IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyAKKyNpbnRlZ3JhdGUgZmlsZXMgdG8gY2xhc3NwYXRoCistY3Agc3JjCistY3AgLi4vc3JjCistY3AgZ2VuLWhheGUKKworI3RoaXMgY2xhc3Mgd2lsIGJlIHVzZWQgYXMgZW50cnkgcG9pbnQgZm9yIHlvdXIgYXBwLgorLW1haW4gTWFpbgorCisjUEhQIHRhcmdldAorLXBocCBiaW4vcGhwLworLS1waHAtZnJvbnQgTWFpbi1kZWJ1Zy5waHAKKworI0FkZCBkZWJ1ZyBpbmZvcm1hdGlvbgorLWRlYnVnCisKKyNkZWFkIGNvZGUgZWxpbWluYXRpb24gOiByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBubyIgOiBkbyBub3QgcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugc3RkIiA6IHJlbW92ZSB1bnVzZWQgY29kZSBpbiB0aGUgc3RkIGxpYiAoZGVmYXVsdCkKKyMiLWRjZSBmdWxsIiA6IHJlbW92ZSBhbGwgdW51c2VkIGNvZGUKKy1kY2UgZnVsbApkaWZmIC0tZ2l0IGEvbGliL2hheGUvdGVzdC9wcm9qZWN0LmhpZGUgYi9saWIvaGF4ZS90ZXN0L3Byb2plY3QuaGlkZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmVmOThlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvdGVzdC9wcm9qZWN0LmhpZGUKQEAgLTAsMCArMSw2NyBAQAoreworICAgICAidHlwZSIgOiAwCisgICAgLCJ0YXJnZXQiIDogNAorICAgICwibmFtZSIgOiAiVGVzdCIKKyAgICAsIm1haW4iIDogbnVsbAorICAgICwicHJvamVjdFBhY2thZ2UiIDogIiIKKyAgICAsImNvbXBhbnkiIDogIiIKKyAgICAsImxpY2Vuc2UiIDogIiIKKyAgICAsInVybCIgOiAiIgorICAgICwidGFyZ2V0RGF0YSIgOiBbCisgICAgICAgICB7CisgICAgICAgICAgICAgInBhdGhUb0h4bWwiIDogImZsYXNoLmh4bWwiCisgICAgICAgICAgICAsInJ1bkFjdGlvblR5cGUiIDogMQorICAgICAgICAgICAgLCJydW5BY3Rpb25UZXh0IiA6ICJiaW4vVGVzdC5zd2YiCisgICAgICAgIH0KKyAgICAgICAgLHsKKyAgICAgICAgICAgICAicGF0aFRvSHhtbCIgOiAiamF2YXNjcmlwdC5oeG1sIgorICAgICAgICAgICAgLCJydW5BY3Rpb25UeXBlIiA6IDEKKyAgICAgICAgICAgICwicnVuQWN0aW9uVGV4dCIgOiAiYmluXFxpbmRleC5odG1sIgorICAgICAgICB9CisgICAgICAgICx7CisgICAgICAgICAgICAgInBhdGhUb0h4bWwiIDogIm5la28uaHhtbCIKKyAgICAgICAgICAgICwicnVuQWN0aW9uVHlwZSIgOiAyCisgICAgICAgICAgICAsInJ1bkFjdGlvblRleHQiIDogIm5la28gYmluL1Rlc3QubiIKKyAgICAgICAgfQorICAgICAgICAseworICAgICAgICAgICAgICJwYXRoVG9IeG1sIiA6ICJwaHAuaHhtbCIKKyAgICAgICAgfQorICAgICAgICAseworICAgICAgICAgICAgICJwYXRoVG9IeG1sIiA6ICJjcHAuaHhtbCIKKyAgICAgICAgICAgICwicnVuQWN0aW9uVHlwZSIgOiAyCisgICAgICAgICAgICAsInJ1bkFjdGlvblRleHQiIDogImJpbi9NYWluLWRlYnVnLmV4ZSIKKyAgICAgICAgfQorICAgICAgICAseworICAgICAgICAgICAgICJwYXRoVG9IeG1sIiA6ICJqYXZhLmh4bWwiCisgICAgICAgIH0KKyAgICAgICAgLHsKKyAgICAgICAgICAgICAicGF0aFRvSHhtbCIgOiAiY3NoYXJwLmh4bWwiCisgICAgICAgIH0KKyAgICAgICAgLHsKKyAgICAgICAgICAgICAicGF0aFRvSHhtbCIgOiAicHl0aG9uLmh4bWwiCisgICAgICAgICAgICAsInJ1bkFjdGlvblR5cGUiIDogMgorICAgICAgICAgICAgLCJydW5BY3Rpb25UZXh0IiA6ICJweXRob24gYmluL1Rlc3QucHkiCisgICAgICAgIH0KKyAgICBdCisgICAgLCJmaWxlcyIgOiBbCisgICAgICAgICB7CisgICAgICAgICAgICAgInBhdGgiIDogInNyY1xcTWFpbi5oeCIKKyAgICAgICAgICAgICwidXNlVGFicyIgOiB0cnVlCisgICAgICAgICAgICAsImluZGVudFNpemUiIDogNAorICAgICAgICAgICAgLCJmb2xkZWRSZWdpb25zIiA6IFsKKworICAgICAgICAgICAgXQorICAgICAgICAgICAgLCJhY3RpdmVMaW5lIiA6IDEzCisgICAgICAgIH0KKyAgICBdCisgICAgLCJhY3RpdmVGaWxlIiA6ICJzcmNcXE1haW4uaHgiCisgICAgLCJvcGVuRkxUYXJnZXQiIDogbnVsbAorICAgICwib3BlbkZMQnVpbGRNb2RlIiA6ICJEZWJ1ZyIKKyAgICAsInJ1bkFjdGlvblR5cGUiIDogbnVsbAorICAgICwicnVuQWN0aW9uVGV4dCIgOiBudWxsCisgICAgLCJidWlsZEFjdGlvbkNvbW1hbmQiIDogbnVsbAorICAgICwiaGlkZGVuSXRlbXMiIDogWworCisgICAgXQorICAgICwic2hvd0hpZGRlbkl0ZW1zIiA6IGZhbHNlCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvdGVzdC9weXRob24uaHhtbCBiL2xpYi9oYXhlL3Rlc3QvcHl0aG9uLmh4bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ2YTEzMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3Rlc3QvcHl0aG9uLmh4bWwKQEAgLTAsMCArMSwzOCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisgCisjaW50ZWdyYXRlIGZpbGVzIHRvIGNsYXNzcGF0aAorLWNwIHNyYworLWNwIC4uL3NyYworLWNwIGdlbi1oYXhlCisKKyN0aGlzIGNsYXNzIHdpbCBiZSB1c2VkIGFzIGVudHJ5IHBvaW50IGZvciB5b3VyIGFwcC4KKy1tYWluIE1haW4KKworI1B5dGhvbiB0YXJnZXQKKy1weXRob24gYmluL1Rlc3QucHkKKworI0FkZCBkZWJ1ZyBpbmZvcm1hdGlvbgorLWRlYnVnCisKKyNkZWFkIGNvZGUgZWxpbWluYXRpb24gOiByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBubyIgOiBkbyBub3QgcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugc3RkIiA6IHJlbW92ZSB1bnVzZWQgY29kZSBpbiB0aGUgc3RkIGxpYiAoZGVmYXVsdCkKKyMiLWRjZSBmdWxsIiA6IHJlbW92ZSBhbGwgdW51c2VkIGNvZGUKKy1kY2UgZnVsbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3Rlc3Qvc3JjL01haW4uaHggYi9saWIvaGF4ZS90ZXN0L3NyYy9NYWluLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjMjYyZDcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS90ZXN0L3NyYy9NYWluLmh4CkBAIC0wLDAgKzEsOTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZTsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0Lio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXIuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuKjsKKworaW1wb3J0IHRocmlmdC50ZXN0Lio7ICAvLyBnZW5lcmF0ZWQgY29kZQorCisKK2VudW0gV2hhdFRlc3RzIHsKKyAgICBOb3JtYWw7CisgICAgTXVsdGlwbGV4OworfQorCitjbGFzcyBNYWluCit7CisgICAgc3RhdGljIHByaXZhdGUgdmFyIHRlc3RzIDogV2hhdFRlc3RzID0gTm9ybWFsOworICAgIHN0YXRpYyBwcml2YXRlIHZhciBzZXJ2ZXIgOiBCb29sID0gZmFsc2U7CisKKyAgICBzdGF0aWMgcHJpdmF0ZSBpbmxpbmUgdmFyIENNRExJTkVIRUxQIDogU3RyaW5nCisgICAgICAgID0gIlxuSGF4ZVRlc3RzICBbY2xpZW50fHNlcnZlcl0gIFttdWx0aXBsZXhdXG4iCisgICAgICAgICsgIiAgY2xpZW50fHNlcnZlciAgLi4uIGRldGVybWluZXMgcnVuIG1vZGUgZm9yIHNvbWUgdGVzdHMsIGRlZmF1bHQgaXMgY2xpZW50XG4iCisgICAgICAgICsgIiAgbXVsdGlwbGV4IC4uLi4uLi4uIHJ1biBtdWx0aXBsZXggdGVzdCBzZXJ2ZXIgb3IgY2xpZW50XG4iOworCisgICAgc3RhdGljIHByaXZhdGUgZnVuY3Rpb24gUGFyc2VBcmdzKCkgeworICAgICAgICAjaWYgc3lzCisKKyAgICAgICAgdmFyIGFyZ3MgPSBTeXMuYXJncygpOworICAgICAgICBpZiAoIGFyZ3MgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yICggYXJnIGluIGFyZ3MpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2goYXJnLnRvTG93ZXJDYXNlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAiY2xpZW50IjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlciA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBjYXNlICJzZXJ2ZXIiIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlciA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgIm11bHRpcGxleCIgOgorICAgICAgICAgICAgICAgICAgICAgICAgdGVzdHMgPSBNdWx0aXBsZXg7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgJ0ludmFsaWQgYXJndW1lbnQgIiRhcmciXG4nK0NNRExJTkVIRUxQOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgICNlbmQKKyAgICB9CisKKyAgICBzdGF0aWMgcHVibGljIGZ1bmN0aW9uIG1haW4oKQorICAgIHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIFBhcnNlQXJncygpOworCisgICAgICAgICAgICBzd2l0Y2goIHRlc3RzKSB7CisgICAgICAgICAgICAgICAgY2FzZSBOb3JtYWw6CisgICAgICAgICAgICAgICAgICAgIFN0cmVhbVRlc3QuUnVuKHNlcnZlcik7CisgICAgICAgICAgICAgICAgY2FzZSBNdWx0aXBsZXg6CisgICAgICAgICAgICAgICAgICAgIE11bHRpcGxleFRlc3QuUnVuKHNlcnZlcik7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgIlVuaGFuZGxlZCB0ZXN0IG1vZGUgJHRlc3RzIjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJhY2UoIkFsbCB0ZXN0cyBjb21wbGV0ZWQuIik7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2goIGU6IER5bmFtaWMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyYWNlKCckZScpOworICAgICAgICAgICAgI2lmIHN5cworICAgICAgICAgICAgU3lzLmV4aXQoMSk7ICAvLyBpbmRpY2F0ZSBlcnJvcgorICAgICAgICAgICAgI2VuZAorICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3Rlc3Qvc3JjL011bHRpcGxleFRlc3QuaHggYi9saWIvaGF4ZS90ZXN0L3NyYy9NdWx0aXBsZXhUZXN0Lmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4MThiNjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS90ZXN0L3NyYy9NdWx0aXBsZXhUZXN0Lmh4CkBAIC0wLDAgKzEsMjI0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2U7CisKK2ltcG9ydCBoYXhlLkludDY0OworaW1wb3J0IGhheGUuSW50MzI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0Lio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLio7CisKKy8vIGRlYnVnIG9ubHkKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xEZWNvcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE11bHRpcGxleGVkUHJvdG9jb2w7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE11bHRpcGxleGVkUHJvY2Vzc29yOworCisvLyBnZW5lcmF0ZWQgY29kZSBpbXBvcnRzCitpbXBvcnQgQWdncjsKK2ltcG9ydCBBZ2dySW1wbDsKK2ltcG9ydCBBZ2dyUHJvY2Vzc29yOworaW1wb3J0IEJlbmNobWFya1NlcnZpY2U7CitpbXBvcnQgQmVuY2htYXJrU2VydmljZUltcGw7CitpbXBvcnQgQmVuY2htYXJrU2VydmljZVByb2Nlc3NvcjsKK2ltcG9ydCBFcnJvcjsKKworCitjbGFzcyBCZW5jaG1hcmtTZXJ2aWNlSGFuZGxlciBpbXBsZW1lbnRzIEJlbmNobWFya1NlcnZpY2UKK3sKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KCkgeworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBmaWJvbmFjY2kobiA6IGhheGUuSW50MzIpIDogaGF4ZS5JbnQzMiB7CisgICAgICAgIHRyYWNlKCdCZW5jaG1hcmsuZmlib25hY2NpKCRuKScpOworICAgICAgICB2YXIgbmV4dCA6IEludDsKKyAgICAgICAgdmFyIHByZXYgICA9IDA7CisgICAgICAgIHZhciByZXN1bHQgPSAxOworICAgICAgICB3aGlsZSggbiA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIG5leHQgICA9IHJlc3VsdCArIHByZXY7CisgICAgICAgICAgICBwcmV2ICAgPSByZXN1bHQ7CisgICAgICAgICAgICByZXN1bHQgPSBuZXh0OworICAgICAgICAgICAgLS1uOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorfQorCisKK2NsYXNzIEFnZ3JTZXJ2aWNlSGFuZGxlciBpbXBsZW1lbnRzIEFnZ3IKK3sKKyAgICBwcml2YXRlIHZhciB2YWx1ZXMgOiBMaXN0PGhheGUuSW50MzI+ID0gbmV3IExpc3Q8aGF4ZS5JbnQzMj4oKTsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcoKSB7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGFkZFZhbHVlKHZhbHVlIDogaGF4ZS5JbnQzMikgOiBWb2lkICAgIHsKKyAgICAgICAgdHJhY2UoJ0FnZ3IuYWRkVmFsdWUoJHZhbHVlKScpOworICAgICAgICB2YWx1ZXMuYWRkKCB2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGdldFZhbHVlcygpIDogTGlzdDwgaGF4ZS5JbnQzMj4geworICAgICAgICB0cmFjZSgnQWdnci5nZXRWYWx1ZXMoKScpOworICAgICAgICByZXR1cm4gdmFsdWVzOworICAgIH0KK30KKworCisKK2NsYXNzIE11bHRpcGxleFRlc3QgZXh0ZW5kcyBUZXN0QmFzZSB7CisKKyAgICBwcml2YXRlIGlubGluZSBzdGF0aWMgdmFyIE5BTUVfQkVOQ0hNQVJLU0VSVklDRSA6IFN0cmluZyA9ICJCZW5jaG1hcmtTZXJ2aWNlIjsKKyAgICBwcml2YXRlIGlubGluZSBzdGF0aWMgdmFyIE5BTUVfQUdHUiAgICAgICAgICAgICA6IFN0cmluZyAgPSAiQWdnciI7CisKKworICAgIHB1YmxpYyBzdGF0aWMgb3ZlcnJpZGUgZnVuY3Rpb24gUnVuKHNlcnZlciA6IEJvb2wpIDogVm9pZCB7CisgICAgICAgIGlmICggc2VydmVyKSB7CisgICAgICAgICAgICBSdW5NdWx0aXBsZXhTZXJ2ZXIoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFJ1bk11bHRpcGxleENsaWVudCgpOworICAgICAgICAgICAgUnVuRGVmYXVsdENsaWVudCgpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvLyBydW4gdGhlIG11bHRpcGxleCBzZXJ2ZXIKKyAgICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIGZ1bmN0aW9uIFJ1bk11bHRpcGxleFNlcnZlcigpIDogVm9pZCAgeworICAgICAgIHRyeQorICAgICAgIHsKKyAgICAgICAgICAgIHZhciBiZW5jaEhhbmRsZXIgOiBCZW5jaG1hcmtTZXJ2aWNlID0gbmV3IEJlbmNobWFya1NlcnZpY2VIYW5kbGVyKCk7CisgICAgICAgICAgICB2YXIgYmVuY2hQcm9jZXNzb3IgOiBUUHJvY2Vzc29yID0gbmV3IEJlbmNobWFya1NlcnZpY2VQcm9jZXNzb3IoIGJlbmNoSGFuZGxlcik7CisKKyAgICAgICAgICAgIHZhciBhZ2dySGFuZGxlciA6IEFnZ3IgPSBuZXcgQWdnclNlcnZpY2VIYW5kbGVyKCk7CisgICAgICAgICAgICB2YXIgYWdnclByb2Nlc3NvciA6IFRQcm9jZXNzb3IgPSBuZXcgQWdnclByb2Nlc3NvciggYWdnckhhbmRsZXIpOworCisgICAgICAgICAgICB2YXIgbXVsdGlwbGV4IDogVE11bHRpcGxleGVkUHJvY2Vzc29yID0gbmV3IFRNdWx0aXBsZXhlZFByb2Nlc3NvcigpOworICAgICAgICAgICAgbXVsdGlwbGV4LlJlZ2lzdGVyUHJvY2Vzc29yKCBOQU1FX0JFTkNITUFSS1NFUlZJQ0UsIGJlbmNoUHJvY2Vzc29yLCB0cnVlKTsgIC8vIGRlZmF1bHQKKyAgICAgICAgICAgIG11bHRpcGxleC5SZWdpc3RlclByb2Nlc3NvciggTkFNRV9BR0dSLCBhZ2dyUHJvY2Vzc29yKTsKKworICAgICAgICAgICAgLy8gcHJvdG9jb2wrdHJhbnNwb3J0IHN0YWNrCisgICAgICAgICAgICB2YXIgcHJvdGZhY3QgOiBUUHJvdG9jb2xGYWN0b3J5ID0gbmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkodHJ1ZSx0cnVlKTsKKyAgICAgICAgICAgIHZhciBzZXJ2ZXJ0cmFucyA6IFRTZXJ2ZXJUcmFuc3BvcnQgPSBuZXcgVFNlcnZlclNvY2tldCggOTA5MCwgNSwgZmFsc2UpOworICAgICAgICAgICAgdmFyIHRyYW5zZmFjdCA6IFRUcmFuc3BvcnRGYWN0b3J5ID0gbmV3IFRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5KCk7CisKKyAgICAgICAgICAgIHZhciBzZXJ2ZXIgOiBUU2VydmVyID0gbmV3IFRTaW1wbGVTZXJ2ZXIoIG11bHRpcGxleCwgc2VydmVydHJhbnMsIHRyYW5zZmFjdCwgcHJvdGZhY3QpOworCisgICAgICAgICAgICB0cmFjZSgiU3RhcnRpbmcgdGhlIHNlcnZlciAuLi4iKTsKKyAgICAgICAgICAgIHNlcnZlci5TZXJ2ZSgpOworICAgICAgIH0KKyAgICAgICAgY2F0Y2goIGUgOiBUQXBwbGljYXRpb25FeGNlcHRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIFRlc3RCYXNlLkV4cGVjdChmYWxzZSwnJHtlLmVycm9ySUR9ICR7ZS5lcnJvck1zZ30nKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCggZSA6IFRFeGNlcHRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIFRlc3RCYXNlLkV4cGVjdChmYWxzZSwnJGUnKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLy8gcnVuIG11bHRpcGxleCBjbGllbnQgYWdhaW5zdCBtdWx0aXBsZXggc2VydmVyCisgICAgcHVibGljIHN0YXRpYyBvdmVycmlkZSBmdW5jdGlvbiBSdW5NdWx0aXBsZXhDbGllbnQoKSA6IFZvaWQgIHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB0cmFucyA6IFRUcmFuc3BvcnQ7CisgICAgICAgICAgICB0cmFucyA9IG5ldyBUU29ja2V0KCJsb2NhbGhvc3QiLCA5MDkwKTsKKyAgICAgICAgICAgIHRyYW5zID0gbmV3IFRGcmFtZWRUcmFuc3BvcnQodHJhbnMpOworICAgICAgICAgICAgdHJhbnMub3BlbigpOworCisgICAgICAgICAgICB2YXIgcHJvdG9jb2wgOiBUUHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zLHRydWUsdHJ1ZSk7CisgICAgICAgICAgICB2YXIgbXVsdGlwbGV4IDogVE11bHRpcGxleGVkUHJvdG9jb2w7CisKKyAgICAgICAgICAgIG11bHRpcGxleCA9IG5ldyBUTXVsdGlwbGV4ZWRQcm90b2NvbCggcHJvdG9jb2wsIE5BTUVfQkVOQ0hNQVJLU0VSVklDRSk7CisgICAgICAgICAgICB2YXIgYmVuY2ggPSBuZXcgQmVuY2htYXJrU2VydmljZUltcGwoIG11bHRpcGxleCk7CisKKyAgICAgICAgICAgIG11bHRpcGxleCA9IG5ldyBUTXVsdGlwbGV4ZWRQcm90b2NvbCggcHJvdG9jb2wsIE5BTUVfQUdHUik7CisgICAgICAgICAgICB2YXIgYWdnciA9IG5ldyBBZ2dySW1wbCggbXVsdGlwbGV4KTsKKworICAgICAgICAgICAgdHJhY2UoJ2NhbGxpbmcgYWdnci5hZGQoIGJlbmNoLmZpYm8oKSkuLi4nKTsKKyAgICAgICAgICAgIGZvciggaSBpbiAxIC4uLiAxMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cmFjZSgnJGknKTsKKyAgICAgICAgICAgICAgICBhZ2dyLmFkZFZhbHVlKCBiZW5jaC5maWJvbmFjY2koaSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cmFjZSgnY2FsbGluZyBhZ2dyIC4uLicpOworICAgICAgICAgICAgdmFyIGkgPSAxOworICAgICAgICAgICAgdmFyIHZhbHVlcyA9IGFnZ3IuZ2V0VmFsdWVzKCk7CisgICAgICAgICAgICBUZXN0QmFzZS5FeHBlY3QodmFsdWVzICE9IG51bGwsJ2FnZ3IuZ2V0VmFsdWVzKCkgPT0gbnVsbCcpOworICAgICAgICAgICAgZm9yKCBrIGluIHZhbHVlcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cmFjZSgnZmliKCRpKSA9ICRrJyk7CisgICAgICAgICAgICAgICAgKytpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cmFucy5jbG9zZSgpOworICAgICAgICAgICAgdHJhY2UoJ2RvbmUuJyk7CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCggZSA6IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgVGVzdEJhc2UuRXhwZWN0KGZhbHNlLCcke2UuZXJyb3JJRH0gJHtlLmVycm9yTXNnfScpOworICAgICAgICB9CisgICAgICAgIGNhdGNoKCBlIDogVEV4Y2VwdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgVGVzdEJhc2UuRXhwZWN0KGZhbHNlLCckZScpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvLyBydW4gbm9uLW11bHRpcGxleCBjbGllbnQgYWdhaW5zdCBtdWx0aXBsZXggc2VydmVyIHRvIHRlc3QgZGVmYXVsdCBmYWxsYmFjaworICAgIHB1YmxpYyBzdGF0aWMgb3ZlcnJpZGUgZnVuY3Rpb24gUnVuRGVmYXVsdENsaWVudCgpIDogVm9pZCAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHRyYW5zIDogVFRyYW5zcG9ydDsKKyAgICAgICAgICAgIHRyYW5zID0gbmV3IFRTb2NrZXQoImxvY2FsaG9zdCIsIDkwOTApOworICAgICAgICAgICAgdHJhbnMgPSBuZXcgVEZyYW1lZFRyYW5zcG9ydCh0cmFucyk7CisgICAgICAgICAgICB0cmFucy5vcGVuKCk7CisKKyAgICAgICAgICAgIHZhciBwcm90b2NvbCA6IFRQcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2wodHJhbnMsdHJ1ZSx0cnVlKTsKKworICAgICAgICAgICAgdmFyIGJlbmNoID0gbmV3IEJlbmNobWFya1NlcnZpY2VJbXBsKCBwcm90b2NvbCk7CisKKyAgICAgICAgICAgIHRyYWNlKCdjYWxsaW5nIGJlbmNoICh2aWEgZGVmYXVsdCkgLi4uJyk7CisgICAgICAgICAgICBmb3IoIGkgaW4gMSAuLi4gMTApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGsgPSBiZW5jaC5maWJvbmFjY2koaSk7CisgICAgICAgICAgICAgICAgdHJhY2UoJ2ZpYigkaSkgPSAkaycpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cmFucy5jbG9zZSgpOworICAgICAgICAgICAgdHJhY2UoJ2RvbmUuJyk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2goIGUgOiBUQXBwbGljYXRpb25FeGNlcHRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIFRlc3RCYXNlLkV4cGVjdChmYWxzZSwnJHtlLmVycm9ySUR9ICR7ZS5lcnJvck1zZ30nKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCggZSA6IFRFeGNlcHRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIFRlc3RCYXNlLkV4cGVjdChmYWxzZSwnJGUnKTsKKyAgICAgICAgfQorICAgIH0KKworfQorCisKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3Rlc3Qvc3JjL1N0cmVhbVRlc3QuaHggYi9saWIvaGF4ZS90ZXN0L3NyYy9TdHJlYW1UZXN0Lmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0NGYxZWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS90ZXN0L3NyYy9TdHJlYW1UZXN0Lmh4CkBAIC0wLDAgKzEsOTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZTsKKworaW1wb3J0IGhheGUuSW50NjQ7CitpbXBvcnQgc3lzLkZpbGVTeXN0ZW07CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0Lio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLio7CisKK2ltcG9ydCB0aHJpZnQudGVzdC4qOyAgLy8gZ2VuZXJhdGVkIGNvZGUKKworCitjbGFzcyBTdHJlYW1UZXN0IGV4dGVuZHMgVGVzdEJhc2UgeworCisKKyAgICBwcml2YXRlIGlubGluZSBzdGF0aWMgdmFyIHRtcGZpbGUgOiBTdHJpbmcgPSAiZGF0YS50bXAiOworCisKKyAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBNYWtlVGVzdERhdGEoKSA6IFh0cnVjdCB7CisgICAgICAgIHZhciBkYXRhIDogWHRydWN0ID0gbmV3IFh0cnVjdCgpOworICAgICAgICBkYXRhLnN0cmluZ190aGluZyA9ICJTdHJlYW10ZXN0IjsKKyAgICAgICAgZGF0YS5ieXRlX3RoaW5nID0gLTEyODsKKyAgICAgICAgZGF0YS5pMzJfdGhpbmcgPSA0NzExOworICAgICAgICBkYXRhLmk2NF90aGluZyA9IEludDY0Lm1ha2UoMHgxMjM0NTY3OCwweDlBQkNERUYwKTsKKyAgICAgICAgcmV0dXJuIGRhdGE7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBXcml0ZURhdGEoKSA6IFh0cnVjdAorICAgIHsKKyAgICAgICAgdmFyIHN0cmVhbSA6IFRTdHJlYW0gPSBuZXcgVEZpbGVTdHJlYW0oIHRtcGZpbGUsIENyZWF0ZU5ldyk7CisgICAgICAgIHZhciB0cmFucyA6IFRUcmFuc3BvcnQgPSBuZXcgVFN0cmVhbVRyYW5zcG9ydCggbnVsbCwgc3RyZWFtKTsKKyAgICAgICAgdmFyIHByb3QgPSBuZXcgVEpTT05Qcm90b2NvbCggdHJhbnMpOworCisgICAgICAgIHZhciBkYXRhID0gTWFrZVRlc3REYXRhKCk7CisgICAgICAgIGRhdGEud3JpdGUocHJvdCk7CisgICAgICAgIHRyYW5zLmNsb3NlKCk7CisKKyAgICAgICAgcmV0dXJuIGRhdGE7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBSZWFkRGF0YSgpIDogWHRydWN0CisgICAgeworICAgICAgICB2YXIgc3RyZWFtIDogVFN0cmVhbSA9IG5ldyBURmlsZVN0cmVhbSggdG1wZmlsZSwgUmVhZCk7CisgICAgICAgIHZhciB0cmFucyA6IFRUcmFuc3BvcnQgPSBuZXcgVFN0cmVhbVRyYW5zcG9ydCggc3RyZWFtLCBudWxsKTsKKyAgICAgICAgdmFyIHByb3QgPSBuZXcgVEpTT05Qcm90b2NvbCggdHJhbnMpOworCisgICAgICAgIHZhciBkYXRhIDogWHRydWN0ID0gbmV3IFh0cnVjdCgpOworICAgICAgICBkYXRhLnJlYWQocHJvdCk7CisgICAgICAgIHRyYW5zLmNsb3NlKCk7CisKKyAgICAgICAgcmV0dXJuIGRhdGE7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBvdmVycmlkZSBmdW5jdGlvbiBSdW4oc2VydmVyIDogQm9vbCkgOiBWb2lkCisgICAgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgdmFyIHdyaXR0ZW4gPSBXcml0ZURhdGEoKTsKKyAgICAgICAgICAgIHZhciByZWFkID0gUmVhZERhdGEoKTsKKyAgICAgICAgICAgIEZpbGVTeXN0ZW0uZGVsZXRlRmlsZSh0bXBmaWxlKTsKKworICAgICAgICAgICAgVGVzdEJhc2UuRXhwZWN0KCByZWFkLnN0cmluZ190aGluZyA9PSB3cml0dGVuLnN0cmluZ190aGluZywgInN0cmluZyBkYXRhIik7CisgICAgICAgICAgICBUZXN0QmFzZS5FeHBlY3QoIHJlYWQuYnl0ZV90aGluZyA9PSB3cml0dGVuLmJ5dGVfdGhpbmcsICJieXRlIGRhdGEiKTsKKyAgICAgICAgICAgIFRlc3RCYXNlLkV4cGVjdCggcmVhZC5pMzJfdGhpbmcgPT0gd3JpdHRlbi5pMzJfdGhpbmcsICJpMzIgZGF0YSIpOworICAgICAgICAgICAgVGVzdEJhc2UuRXhwZWN0KCBJbnQ2NC5jb21wYXJlKCByZWFkLmk2NF90aGluZywgd3JpdHRlbi5pNjRfdGhpbmcpID09IDAsICJpNjQgZGF0YSIpOworCisgICAgICAgIH0gY2F0Y2goZTpEeW5hbWljKSB7CisgICAgICAgICAgICBGaWxlU3lzdGVtLmRlbGV0ZUZpbGUodG1wZmlsZSk7CisgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICB9CisgICAgfQorCit9CisKKwpkaWZmIC0tZ2l0IGEvbGliL2hheGUvdGVzdC9zcmMvVGVzdEJhc2UuaHggYi9saWIvaGF4ZS90ZXN0L3NyYy9UZXN0QmFzZS5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjMyNzczCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvdGVzdC9zcmMvVGVzdEJhc2UuaHgKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlci4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS4qOworCisKK2NsYXNzIFRlc3RCYXNlIHsKKworICAgIHByaXZhdGUgZnVuY3Rpb24gbmV3KCkgeworICAgICAgICAvLyBvdmVycmlkZSwgaWYgbmVjZXNzYXJ5CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBSdW4oc2VydmVyIDogQm9vbCkgOiBWb2lkIHsKKyAgICAgICAgICB0aHJvdyBuZXcgQWJzdHJhY3RNZXRob2RFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gRXhwZWN0KCBleHByIDogQm9vbCwgaW5mbyA6IFN0cmluZywgP3BvcyA6IGhheGUuUG9zSW5mb3MpIDogVm9pZCB7CisgICAgICAgIGlmKCAhIGV4cHIpIHsKKyAgICAgICAgICAgIHRocm93ICgnVGVzdCAiJGluZm8iIGZhaWxlZCBhdCAnK3Bvcy5tZXRob2ROYW1lKycgaW4gJytwb3MuZmlsZU5hbWUrJzonK3Bvcy5saW5lTnVtYmVyKTsKKyAgICAgICAgfQorICAgIH0KKworfQorIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9ocy9DTWFrZUxpc3RzLnR4dCBiL2xpYi9ocy9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjBhMzE5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2hzL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsOTMgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjIFJlYnVpbGQgd2hlbiBhbnkgb2YgdGhlc2UgZmlsZXMgY2hhbmdlcworc2V0KGhhc2tlbGxfc291cmNlcworICAgIHNyYy9UaHJpZnQuaHMKKyAgICBzcmMvVGhyaWZ0L0FyYml0cmFyaWVzLmhzCisgICAgc3JjL1RocmlmdC9Qcm90b2NvbC5ocworICAgIHNyYy9UaHJpZnQvUHJvdG9jb2wvQmluYXJ5LmhzCisgICAgc3JjL1RocmlmdC9Qcm90b2NvbC9Db21wYWN0LmhzCisgICAgc3JjL1RocmlmdC9Qcm90b2NvbC9KU09OLmhzCisgICAgc3JjL1RocmlmdC9TZXJ2ZXIuaHMKKyAgICBzcmMvVGhyaWZ0L1RyYW5zcG9ydC5ocworICAgIHNyYy9UaHJpZnQvVHJhbnNwb3J0L0VtcHR5LmhzCisgICAgc3JjL1RocmlmdC9UcmFuc3BvcnQvRnJhbWVkLmhzCisgICAgc3JjL1RocmlmdC9UcmFuc3BvcnQvSGFuZGxlLmhzCisgICAgc3JjL1RocmlmdC9UcmFuc3BvcnQvSHR0cENsaWVudC5ocworICAgIHNyYy9UaHJpZnQvVHJhbnNwb3J0L0lPQnVmZmVyLmhzCisgICAgc3JjL1RocmlmdC9UeXBlcy5ocworICAgIHRocmlmdC5jYWJhbAorKQorCitpZihCVUlMRF9URVNUSU5HKQorICAgIGxpc3QoQVBQRU5EIGhhc2tlbGxfc29ydWNlcworICAgICAgICB0ZXN0L1NwZWMuaHMKKyAgICAgICAgdGVzdC9CaW5hcnlTcGVjLmhzCisgICAgICAgIHRlc3QvQ29tcGFjdFNwZWMuaHMKKyAgICAgICAgdGVzdC9KU09OU3BlYy5ocworICAgICkKKyAgICBzZXQoaHNfZW5hYmxlX3Rlc3QgIi0tZW5hYmxlLXRlc3RzIikKK2VuZGlmKCkKKworc2V0KGhhc2tlbGxfYXJ0aWZhY3RzIHRocmlmdF9jYWJhbC5zdGFtcCkKKyMgQWRkaW5nICouaGkgZmlsZXMgc28gdGhhdCBhbnkgbWlzc2luZyBmaWxlIHRyaWdnZXJzIHRoZSBidWlsZAorZm9yZWFjaChTUkMgJHtoYXNrZWxsX3NvdXJjZXN9KQorICAgIGdldF9maWxlbmFtZV9jb21wb25lbnQoRVggJHtTUkN9IEVYVCkKKyAgICBpZigke0VYfSBTVFJFUVVBTCAiLmhzIikKKyAgICAgICAgZmlsZShSRUxBVElWRV9QQVRIIFJFTCAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vc3JjICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS8ke1NSQ30pCisgICAgICAgIGdldF9maWxlbmFtZV9jb21wb25lbnQoRElSICR7UkVMfSBESVJFQ1RPUlkpCisgICAgICAgIGdldF9maWxlbmFtZV9jb21wb25lbnQoQkFTRSAke1JFTH0gTkFNRV9XRSkKKyAgICAgICAgbGlzdChBUFBFTkQgaGFza2VsbF9hcnRpZmFjdHMgZGlzdC9idWlsZC8ke0RJUn0vJHtCQVNFfS5oaSkKKyAgICBlbmRpZigpCitlbmRmb3JlYWNoKCkKKworaWYoQ01BS0VfQlVJTERfVFlQRSBTVFJFUVVBTCAiRGVidWciKQorICAgIHNldChoc19vcHRpbWl6ZSAtTzApCitlbHNlaWYoQ01BS0VfQlVJTERfVFlQRSBTVFJFUVVBTCAiUmVsZWFzZSIpCisgICAgc2V0KGhzX29wdGltaXplIC1PMSkKK2VuZGlmKCkKKworYWRkX2N1c3RvbV9jb21tYW5kKAorICAgIE9VVFBVVCAke2hhc2tlbGxfYXJ0aWZhY3RzfQorICAgIENPTU1BTkQgJHtDQUJBTH0gdXBkYXRlCisgICAgIyBCdWlsZCBkZXBlbmRlbmNpZXMgZmlyc3Qgd2l0aG91dCAtLWJ1aWxkZGlyLCBvdGhlcndpc2UgaXQgZmFpbHMuCisgICAgQ09NTUFORCAke0NBQkFMfSBpbnN0YWxsIC0tb25seS1kZXBlbmRlbmNpZXMgJHtoc19lbmFibGVfdGVzdH0KKyAgICBDT01NQU5EICR7Q0FCQUx9IGNvbmZpZ3VyZSAke2hzX29wdGltaXplfSAke2hzX2VuYWJsZV90ZXN0fSAtLWJ1aWxkZGlyPSR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9kaXN0CisgICAgQ09NTUFORCAke0NBQkFMfSBidWlsZCAtLWJ1aWxkZGlyPSR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9kaXN0CisgICAgQ09NTUFORCAke0NBQkFMfSBpbnN0YWxsIC0tYnVpbGRkaXI9JHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2Rpc3QKKyAgICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgdG91Y2ggJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3RocmlmdF9jYWJhbC5zdGFtcAorICAgIFdPUktJTkdfRElSRUNUT1JZICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfQorICAgIERFUEVORFMgJHtoYXNrZWxsX3NvdXJjZXN9CisgICAgQ09NTUVOVCAiQnVpbGRpbmcgSGFza2VsbCBsaWJyYXJ5IikKKworYWRkX2N1c3RvbV90YXJnZXQoaGFza2VsbF9saWJyYXJ5IEFMTAorICAgIERFUEVORFMgJHtoYXNrZWxsX2FydGlmYWN0c30pCisKK2lmKEJVSUxEX1RFU1RJTkcpCisgICAgYWRkX3Rlc3QoTkFNRSBIYXNrZWxsQ2FiYWxDaGVjaworICAgICAgICAgICAgQ09NTUFORCAke0NBQkFMfSBjaGVjaworICAgICAgICAgICAgV09SS0lOR19ESVJFQ1RPUlkgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9KQorICAgIGFkZF90ZXN0KE5BTUUgSGFza2VsbENhYmFsVGVzdAorICAgICAgICAgICAgIyBDYWJhbCBmYWlscyB0byBmaW5kIGJ1aWx0IGV4ZWN1dGFibGUgd2hlbiAtLWJ1aWxkZGlyIGlzIHNwZWNpZmllZC4KKyAgICAgICAgICAgICMgU28gd2UgaW52b2tlIHRoZSBleGVjdXRhYmxlIGRpcmVjdGx5LgorICAgICAgICAgICAgIyBDT01NQU5EICR7Q0FCQUx9IHRlc3QgLS1idWlsZGRpcj0ke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZGlzdAorICAgICAgICAgICAgIyBXT1JLSU5HX0RJUkVDVE9SWSAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0pCisgICAgICAgICAgICBDT01NQU5EIGRpc3QvYnVpbGQvc3BlYy9zcGVjKQorZW5kaWYoKQpkaWZmIC0tZ2l0IGEvbGliL2hzL0xJQ0VOU0UgYi9saWIvaHMvTElDRU5TRQpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS9saWIvaHMvTWFrZWZpbGUuYW0gYi9saWIvaHMvTWFrZWZpbGUuYW0Kb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCA1YjAwN2ZhLi4zY2Q4YjU3Ci0tLSBhL2xpYi9ocy9NYWtlZmlsZS5hbQorKysgYi9saWIvaHMvTWFrZWZpbGUuYW0KQEAgLTE4LDEyICsxOCwxNSBAQAogIwogCiBFWFRSQV9ESVNUID0gXAorCWNvZGluZ19zdGFuZGFyZHMubWQgXAorCUNNYWtlTGlzdHMudHh0IFwKIAlMSUNFTlNFIFwKIAlSRUFETUUubWQgXAogCVNldHVwLmxocyBcCiAJVE9ETyBcCi0JVGhyaWZ0LmNhYmFsIFwKLQlzcmMKKwl0aHJpZnQuY2FiYWwgXAorCXNyYyBcCisJdGVzdAogCiBhbGwtbG9jYWw6CiAJJChDQUJBTCkgdXBkYXRlCkBAIC00MSwzICs0NCw3IEBACiAKIGNoZWNrLWxvY2FsOgogCSQoQ0FCQUwpIGNoZWNrCisJJChDQUJBTCkgaW5zdGFsbCAtLW9ubHktZGVwZW5kZW5jaWVzIC0tZW5hYmxlLXRlc3RzCisJJChDQUJBTCkgY29uZmlndXJlIC0tZW5hYmxlLXRlc3RzCisJJChDQUJBTCkgYnVpbGQKKwkkKENBQkFMKSB0ZXN0CmRpZmYgLS1naXQgYS9saWIvaHMvUkVBRE1FLm1kIGIvbGliL2hzL1JFQURNRS5tZApvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IGZlNTI1YmQuLmVlYTBhNzMKLS0tIGEvbGliL2hzL1JFQURNRS5tZAorKysgYi9saWIvaHMvUkVBRE1FLm1kCkBAIC0zOSw3ICszOSw3IEBACiBUaGUgbWFwcGluZyBmcm9tIFRocmlmdCB0eXBlcyB0byBIYXNrZWxsJ3MgaXM6CiAKICAqIGRvdWJsZSAtPiBEb3VibGUKLSAqIGJ5dGUgLT4gRGF0YS5Xb3JkLldvcmQ4CisgKiBieXRlIC0+IERhdGEuSW50LkludDgKICAqIGkxNiAtPiBEYXRhLkludC5JbnQxNgogICogaTMyIC0+IERhdGEuSW50LkludDMyCiAgKiBpNjQgLT4gRGF0YS5JbnQuSW50NjQKQEAgLTg5LDcgKzg5LDcgQEAKICAgZGF0YSBNeUlmYWNlID0gTXlJZmFjZQogCiBhbmQgdGhlbiBkZWNsYXJlIGl0IGFuIGluc3RhbmNlIG9mIGVhY2ggaWZhY2UgY2xhc3MsIHN0YXJ0aW5nIHdpdGggdGhlIHN1cGVyZXN0Ci1jbGFzcyBhbmQgcHJvY2VkaW5nIGRvd24gKGFsbCB0aGUgd2hpbGUgZGVmaW5pbmcgdGhlIG1ldGhvZHMpLiAgVGhlbiBwYXNzIHlvdXIKK2NsYXNzIGFuZCBwcm9jZWVkaW5nIGRvd24gKGFsbCB0aGUgd2hpbGUgZGVmaW5pbmcgdGhlIG1ldGhvZHMpLiAgVGhlbiBwYXNzIHlvdXIKIGxhYmVsIHRvIHByb2Nlc3MgYXMgdGhlIGhhbmRsZXIuCiAKIFByb2Nlc3NvcgpkaWZmIC0tZ2l0IGEvbGliL2hzL1RPRE8gYi9saWIvaHMvVE9ETwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS9saWIvaHMvVGhyaWZ0LmNhYmFsIGIvbGliL2hzL1RocmlmdC5jYWJhbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGZkYjQ5YS4uMDAwMDAwMAotLS0gYS9saWIvaHMvVGhyaWZ0LmNhYmFsCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLS0KLS0tIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLS0tIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0tLSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotLS0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0tLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0tLSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0tLSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS0tCi0tLSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLS0KLS0tIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLS0tIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0tLSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLS0tIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0tLSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0tLSB1bmRlciB0aGUgTGljZW5zZS4KLS0tCi0KLU5hbWU6ICAgICAgICAgICB0aHJpZnQKLVZlcnNpb246ICAgICAgICAwLjkuMgotQ2FiYWwtVmVyc2lvbjogID49IDEuOAotTGljZW5zZTogICAgICAgIE90aGVyTGljZW5zZQotQ2F0ZWdvcnk6ICAgICAgIEZvcmVpZ24KLUJ1aWxkLVR5cGU6ICAgICBTaW1wbGUKLVN5bm9wc2lzOiAgICAgICBIYXNrZWxsIGJpbmRpbmdzIGZvciB0aGUgQXBhY2hlIFRocmlmdCBSUEMgc3lzdGVtCi1Ib21lcGFnZTogICAgICAgaHR0cDovL3RocmlmdC5hcGFjaGUub3JnCi1CdWctUmVwb3J0czogICAgaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQKLU1haW50YWluZXI6ICAgICBkZXZAdGhyaWZ0LmFwYWNoZS5vcmcKLUxpY2Vuc2UtRmlsZTogICAuLi8uLi9MSUNFTlNFCi0KLURlc2NyaXB0aW9uOgotICBIYXNrZWxsIGJpbmRpbmdzIGZvciB0aGUgQXBhY2hlIFRocmlmdCBSUEMgc3lzdGVtLiBSZXF1aXJlcyB0aGUgdXNlIG9mIHRoZSB0aHJpZnQgY29kZSBnZW5lcmF0b3IuCi0KLWZsYWcgbmV0d29yay11cmkKLSAgIGRlc2NyaXB0aW9uOiBHZXQgTmV0d29yay5VUkkgZnJvbSB0aGUgbmV0d29yay11cmkgcGFja2FnZQotICAgZGVmYXVsdDogVHJ1ZQotCi1MaWJyYXJ5Ci0gIEhzLVNvdXJjZS1EaXJzOgotICAgIHNyYwotICBCdWlsZC1EZXBlbmRzOgotICAgIGJhc2UgPj0gNCwgYmFzZSA8IDUsIGNvbnRhaW5lcnMsIGdoYy1wcmltLCBhdHRvcGFyc2VjLCBiaW5hcnksIGJ5dGVzdHJpbmcgPj0gMC4xMCwgaGFzaGFibGUsIEhUVFAsIHRleHQsIHVub3JkZXJlZC1jb250YWluZXJzLCB2ZWN0b3IsIFF1aWNrQ2hlY2ssIHNwbGl0Ci0gIGlmIGZsYWcobmV0d29yay11cmkpCi0gICAgIGJ1aWxkLWRlcGVuZHM6IG5ldHdvcmstdXJpID49IDIuNiwgbmV0d29yayA+PSAyLjYKLSAgZWxzZQotICAgICBidWlsZC1kZXBlbmRzOiBuZXR3b3JrIDwgMi42Ci0gIEV4cG9zZWQtTW9kdWxlczoKLSAgICBUaHJpZnQsCi0gICAgVGhyaWZ0LkFyYml0cmFyaWVzCi0gICAgVGhyaWZ0LlByb3RvY29sLAotICAgIFRocmlmdC5Qcm90b2NvbC5CaW5hcnksCi0gICAgVGhyaWZ0LlByb3RvY29sLkNvbXBhY3QsCi0gICAgVGhyaWZ0LlByb3RvY29sLkpTT04sCi0gICAgVGhyaWZ0LlNlcnZlciwKLSAgICBUaHJpZnQuVHJhbnNwb3J0LAotICAgIFRocmlmdC5UcmFuc3BvcnQuRW1wdHksCi0gICAgVGhyaWZ0LlRyYW5zcG9ydC5GcmFtZWQsCi0gICAgVGhyaWZ0LlRyYW5zcG9ydC5IYW5kbGUsCi0gICAgVGhyaWZ0LlRyYW5zcG9ydC5IdHRwQ2xpZW50LAotICAgIFRocmlmdC5UcmFuc3BvcnQuSU9CdWZmZXIsCi0gICAgVGhyaWZ0LlR5cGVzCi0gIEV4dGVuc2lvbnM6Ci0gICAgRGVyaXZlRGF0YVR5cGVhYmxlLAotICAgIEV4aXN0ZW50aWFsUXVhbnRpZmljYXRpb24sCi0gICAgRmxleGlibGVJbnN0YW5jZXMsCi0gICAgS2luZFNpZ25hdHVyZXMsCi0gICAgTWFnaWNIYXNoLAotICAgIFJhbmtOVHlwZXMsCi0gICAgUmVjb3JkV2lsZENhcmRzLAotICAgIFNjb3BlZFR5cGVWYXJpYWJsZXMsCi0gICAgVHlwZVN5bm9ueW1JbnN0YW5jZXMKZGlmZiAtLWdpdCBhL2xpYi9ocy9jb2Rpbmdfc3RhbmRhcmRzLm1kIGIvbGliL2hzL2NvZGluZ19zdGFuZGFyZHMubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEwMzkwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ocy9jb2Rpbmdfc3RhbmRhcmRzLm1kCkBAIC0wLDAgKzEgQEAKK1BsZWFzZSBmb2xsb3cgW0dlbmVyYWwgQ29kaW5nIFN0YW5kYXJkc10oL2RvYy9jb2Rpbmdfc3RhbmRhcmRzLm1kKQpkaWZmIC0tZ2l0IGEvbGliL2hzL3NyYy9UaHJpZnQuaHMgYi9saWIvaHMvc3JjL1RocmlmdC5ocwppbmRleCA1OGEzMDRiLi42NTgwMjA5IDEwMDY0NAotLS0gYS9saWIvaHMvc3JjL1RocmlmdC5ocworKysgYi9saWIvaHMvc3JjL1RocmlmdC5ocwpAQCAtOTAsMTMgKzkwLDEzIEBACiAgIGRlcml2aW5nICggU2hvdywgVHlwZWFibGUgKQogaW5zdGFuY2UgRXhjZXB0aW9uIEFwcEV4bgogCi13cml0ZUFwcEV4biA6OiAoUHJvdG9jb2wgcCwgVHJhbnNwb3J0IHQpID0+IHAgdCAtPiBBcHBFeG4gLT4gSU8gKCkKK3dyaXRlQXBwRXhuIDo6IFByb3RvY29sIHAgPT4gcCAtPiBBcHBFeG4gLT4gSU8gKCkKIHdyaXRlQXBwRXhuIHB0IGFlID0gd3JpdGVWYWwgcHQgJCBUU3RydWN0ICQgTWFwLmZyb21MaXN0CiAgICAgICAgICAgICAgICAgICAgIFsgKDEsICgibWVzc2FnZSIsIFRTdHJpbmcgJCBlbmNvZGVVdGY4ICQgcGFjayAkIGFlX21lc3NhZ2UgYWUpKQogICAgICAgICAgICAgICAgICAgICAsICgyLCAoInR5cGUiLCBUSTMyICQgZnJvbUludGVncmFsICQgZnJvbUVudW0gKGFlX3R5cGUgYWUpKSkKICAgICAgICAgICAgICAgICAgICAgXQogCi1yZWFkQXBwRXhuIDo6IChQcm90b2NvbCBwLCBUcmFuc3BvcnQgdCkgPT4gcCB0IC0+IElPIEFwcEV4bgorcmVhZEFwcEV4biA6OiBQcm90b2NvbCBwID0+IHAgLT4gSU8gQXBwRXhuCiByZWFkQXBwRXhuIHB0ID0gZG8KICAgICBsZXQgdHlwZW1hcCA9IE1hcC5mcm9tTGlzdCBbKDEsKCJtZXNzYWdlIixUX1NUUklORykpLCgyLCgidHlwZSIsVF9JMzIpKV0KICAgICBUU3RydWN0IGZpZWxkcyA8LSByZWFkVmFsIHB0ICQgVF9TVFJVQ1QgdHlwZW1hcApkaWZmIC0tZ2l0IGEvbGliL2hzL3NyYy9UaHJpZnQvQXJiaXRyYXJpZXMuaHMgYi9saWIvaHMvc3JjL1RocmlmdC9BcmJpdHJhcmllcy5ocwppbmRleCAzYTYwZWQyLi5lOWMwZmMzIDEwMDY0NAotLS0gYS9saWIvaHMvc3JjL1RocmlmdC9BcmJpdHJhcmllcy5ocworKysgYi9saWIvaHMvc3JjL1RocmlmdC9BcmJpdHJhcmllcy5ocwpAQCAtMjYsMTIgKzI2LDYgQEAKIGluc3RhbmNlIEFyYml0cmFyeSBCeXRlU3RyaW5nIHdoZXJlCiAgIGFyYml0cmFyeSA9IEJTLnBhY2sgLiBmaWx0ZXIgKC89IDApIDwkPiBhcmJpdHJhcnkKIAotaW5zdGFuY2UgKE9yZCBrLCBBcmJpdHJhcnkgaywgQXJiaXRyYXJ5IHYpID0+IEFyYml0cmFyeSAoTWFwIGsgdikgd2hlcmUKLSAgYXJiaXRyYXJ5ID0gTWFwLmZyb21MaXN0IDwkPiBhcmJpdHJhcnkKLQotaW5zdGFuY2UgKE9yZCBrLCBBcmJpdHJhcnkgaykgPT4gQXJiaXRyYXJ5IChTZXQuU2V0IGspIHdoZXJlCi0gIGFyYml0cmFyeSA9IFNldC5mcm9tTGlzdCA8JD4gYXJiaXRyYXJ5Ci0KIGluc3RhbmNlIChBcmJpdHJhcnkgaykgPT4gQXJiaXRyYXJ5IChWZWN0b3IuVmVjdG9yIGspIHdoZXJlCiAgIGFyYml0cmFyeSA9IFZlY3Rvci5mcm9tTGlzdCA8JD4gYXJiaXRyYXJ5CiAKZGlmZiAtLWdpdCBhL2xpYi9ocy9zcmMvVGhyaWZ0L1Byb3RvY29sLmhzIGIvbGliL2hzL3NyYy9UaHJpZnQvUHJvdG9jb2wuaHMKaW5kZXggZWE1ODY0Mi4uNjdhOTE3NSAxMDA2NDQKLS0tIGEvbGliL2hzL3NyYy9UaHJpZnQvUHJvdG9jb2wuaHMKKysrIGIvbGliL2hzL3NyYy9UaHJpZnQvUHJvdG9jb2wuaHMKQEAgLTIyLDE5ICsyMiwxOCBAQAogCiBtb2R1bGUgVGhyaWZ0LlByb3RvY29sCiAgICAgKCBQcm90b2NvbCguLikKKyAgICAsIFN0YXRlbGVzc1Byb3RvY29sKC4uKQogICAgICwgUHJvdG9jb2xFeG4oLi4pCiAgICAgLCBQcm90b2NvbEV4blR5cGUoLi4pCiAgICAgLCBnZXRUeXBlT2YKICAgICAsIHJ1blBhcnNlcgotICAgICwgdmVyc2lvbk1hc2sKLSAgICAsIHZlcnNpb24xCiAgICAgLCBic1RvRG91YmxlCisgICAgLCBic1RvRG91YmxlTEUKICAgICApIHdoZXJlCiAKIGltcG9ydCBDb250cm9sLkV4Y2VwdGlvbgogaW1wb3J0IERhdGEuQXR0b3BhcnNlYy5CeXRlU3RyaW5nCiBpbXBvcnQgRGF0YS5CaXRzCi1pbXBvcnQgRGF0YS5CeXRlU3RyaW5nLkxhenkgKEJ5dGVTdHJpbmcsIHRvU3RyaWN0KQogaW1wb3J0IERhdGEuQnl0ZVN0cmluZy5VbnNhZmUKIGltcG9ydCBEYXRhLkZ1bmN0b3IgKCg8JD4pKQogaW1wb3J0IERhdGEuSW50CkBAIC00MywzNyArNDIsMjYgQEAKIGltcG9ydCBEYXRhLlR5cGVhYmxlIChUeXBlYWJsZSkKIGltcG9ydCBEYXRhLldvcmQKIGltcG9ydCBGb3JlaWduLlB0ciAoY2FzdFB0cikKLWltcG9ydCBGb3JlaWduLlN0b3JhYmxlIChTdG9yYWJsZSwgcGVlaywgcG9rZSkKK2ltcG9ydCBGb3JlaWduLlN0b3JhYmxlIChwZWVrLCBwb2tlKQogaW1wb3J0IFN5c3RlbS5JTy5VbnNhZmUKIGltcG9ydCBxdWFsaWZpZWQgRGF0YS5CeXRlU3RyaW5nIGFzIEJTCiBpbXBvcnQgcXVhbGlmaWVkIERhdGEuSGFzaE1hcC5TdHJpY3QgYXMgTWFwCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuQnl0ZVN0cmluZy5MYXp5IGFzIExCUwogCi1pbXBvcnQgVGhyaWZ0LlR5cGVzCiBpbXBvcnQgVGhyaWZ0LlRyYW5zcG9ydAotCi12ZXJzaW9uTWFzayA6OiBJbnQzMgotdmVyc2lvbk1hc2sgPSBmcm9tSW50ZWdyYWwgKDB4ZmZmZjAwMDAgOjogV29yZDMyKQotCi12ZXJzaW9uMSA6OiBJbnQzMgotdmVyc2lvbjEgPSBmcm9tSW50ZWdyYWwgKDB4ODAwMTAwMDAgOjogV29yZDMyKQoraW1wb3J0IFRocmlmdC5UeXBlcwogCiBjbGFzcyBQcm90b2NvbCBhIHdoZXJlCi0gIGdldFRyYW5zcG9ydCA6OiBUcmFuc3BvcnQgdCA9PiBhIHQgLT4gdAorICByZWFkQnl0ZSA6OiBhIC0+IElPIExCUy5CeXRlU3RyaW5nCisgIHJlYWRWYWwgOjogYSAtPiBUaHJpZnRUeXBlIC0+IElPIFRocmlmdFZhbAorICByZWFkTWVzc2FnZSA6OiBhIC0+ICgoVGV4dCwgTWVzc2FnZVR5cGUsIEludDMyKSAtPiBJTyBiKSAtPiBJTyBiCiAKLSAgd3JpdGVNZXNzYWdlQmVnaW4gOjogVHJhbnNwb3J0IHQgPT4gYSB0IC0+IChUZXh0LCBNZXNzYWdlVHlwZSwgSW50MzIpIC0+IElPICgpCi0gIHdyaXRlTWVzc2FnZUVuZCA6OiBUcmFuc3BvcnQgdCA9PiBhIHQgLT4gSU8gKCkKLSAgd3JpdGVNZXNzYWdlRW5kIF8gPSByZXR1cm4gKCkKLSAgCi0gIHJlYWRNZXNzYWdlQmVnaW4gOjogVHJhbnNwb3J0IHQgPT4gYSB0IC0+IElPIChUZXh0LCBNZXNzYWdlVHlwZSwgSW50MzIpCi0gIHJlYWRNZXNzYWdlRW5kIDo6IFRyYW5zcG9ydCB0ID0+IGEgdCAtPiBJTyAoKQotICByZWFkTWVzc2FnZUVuZCBfID0gcmV0dXJuICgpCisgIHdyaXRlVmFsIDo6IGEgLT4gVGhyaWZ0VmFsIC0+IElPICgpCisgIHdyaXRlTWVzc2FnZSA6OiBhIC0+IChUZXh0LCBNZXNzYWdlVHlwZSwgSW50MzIpIC0+IElPICgpIC0+IElPICgpCiAKLSAgc2VyaWFsaXplVmFsIDo6IFRyYW5zcG9ydCB0ID0+IGEgdCAtPiBUaHJpZnRWYWwgLT4gQnl0ZVN0cmluZwotICBkZXNlcmlhbGl6ZVZhbCA6OiBUcmFuc3BvcnQgdCA9PiBhIHQgLT4gVGhyaWZ0VHlwZSAtPiBCeXRlU3RyaW5nIC0+IFRocmlmdFZhbAotCi0gIHdyaXRlVmFsIDo6IFRyYW5zcG9ydCB0ID0+IGEgdCAtPiBUaHJpZnRWYWwgLT4gSU8gKCkKLSAgd3JpdGVWYWwgcCA9IHRXcml0ZSAoZ2V0VHJhbnNwb3J0IHApIC4gc2VyaWFsaXplVmFsIHAKLSAgcmVhZFZhbCA6OiBUcmFuc3BvcnQgdCA9PiBhIHQgLT4gVGhyaWZ0VHlwZSAtPiBJTyBUaHJpZnRWYWwKK2NsYXNzIFByb3RvY29sIGEgPT4gU3RhdGVsZXNzUHJvdG9jb2wgYSB3aGVyZQorICBzZXJpYWxpemVWYWwgOjogYSAtPiBUaHJpZnRWYWwgLT4gTEJTLkJ5dGVTdHJpbmcKKyAgZGVzZXJpYWxpemVWYWwgOjogYSAtPiBUaHJpZnRUeXBlIC0+IExCUy5CeXRlU3RyaW5nIC0+IFRocmlmdFZhbAogCiBkYXRhIFByb3RvY29sRXhuVHlwZQogICAgID0gUEVfVU5LTk9XTgpAQCAtMTAxLDEyICs4OSwxMyBAQAogICBUSTMye30gLT4gVF9JMzIKICAgVEk2NHt9IC0+IFRfSTY0CiAgIFRTdHJpbmd7fSAtPiBUX1NUUklORworICBUQmluYXJ5e30gLT4gVF9CSU5BUlkKICAgVERvdWJsZXt9IC0+IFRfRE9VQkxFCiAKLXJ1blBhcnNlciA6OiAoUHJvdG9jb2wgcCwgVHJhbnNwb3J0IHQsIFNob3cgYSkgPT4gcCB0IC0+IFBhcnNlciBhIC0+IElPIGEKK3J1blBhcnNlciA6OiAoUHJvdG9jb2wgcCwgU2hvdyBhKSA9PiBwIC0+IFBhcnNlciBhIC0+IElPIGEKIHJ1blBhcnNlciBwcm90IHAgPSByZWZpbGwgPj49IGdldFJlc3VsdCAuIHBhcnNlIHAKICAgd2hlcmUKLSAgICByZWZpbGwgPSBoYW5kbGUgaGFuZGxlRU9GICQgdG9TdHJpY3QgPCQ+IHRSZWFkIChnZXRUcmFuc3BvcnQgcHJvdCkgMQorICAgIHJlZmlsbCA9IGhhbmRsZSBoYW5kbGVFT0YgJCBMQlMudG9TdHJpY3QgPCQ+IHJlYWRCeXRlIHByb3QKICAgICBnZXRSZXN1bHQgKERvbmUgXyBhKSA9IHJldHVybiBhCiAgICAgZ2V0UmVzdWx0IChQYXJ0aWFsIGspID0gcmVmaWxsID4+PSBnZXRSZXN1bHQgLiBrCiAgICAgZ2V0UmVzdWx0IGYgPSB0aHJvdyAkIFByb3RvY29sRXhuIFBFX0lOVkFMSURfREFUQSAoc2hvdyBmKQpAQCAtMTE5LDE4ICsxMDgsMjIgQEAKIC0tIHRoZXJlZm9yZSB0aGUgYmVoYXZpb3Igb2YgdGhpcyBmdW5jdGlvbiB2YXJpZXMgYmFzZWQgb24gd2hldGhlciB0aGUgbG9jYWwKIC0tIG1hY2hpbmUgaXMgYmlnIGVuZGlhbiBvciBsaXR0bGUgZW5kaWFuLgogYnNUb0RvdWJsZSA6OiBCUy5CeXRlU3RyaW5nIC0+IERvdWJsZQotYnNUb0RvdWJsZSBicyA9IHVuc2FmZUR1cGFibGVQZXJmb3JtSU8gJCB1bnNhZmVVc2VBc0NTdHJpbmcgYnMgY2FzdEJzCi0gIHdoZXJlCitic1RvRG91YmxlTEUgOjogQlMuQnl0ZVN0cmluZyAtPiBEb3VibGUKICNpZiBfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOCi0gICAgY2FzdEJzIGNoclB0ciA9IGRvCi0gICAgICB3IDwtIHBlZWsgKGNhc3RQdHIgY2hyUHRyKQotICAgICAgcG9rZSAoY2FzdFB0ciBjaHJQdHIpIChieXRlU3dhcCB3KQotICAgICAgcGVlayAoY2FzdFB0ciBjaHJQdHIpCitic1RvRG91YmxlIGJzID0gdW5zYWZlRHVwYWJsZVBlcmZvcm1JTyAkIHVuc2FmZVVzZUFzQ1N0cmluZyBicyBjYXN0QnNTd2FwcGVkCitic1RvRG91YmxlTEUgYnMgPSB1bnNhZmVEdXBhYmxlUGVyZm9ybUlPICQgdW5zYWZlVXNlQXNDU3RyaW5nIGJzIGNhc3RCcwogI2Vsc2UKLSAgICBjYXN0QnMgPSBwZWVrIC4gY2FzdFB0cgorYnNUb0RvdWJsZSBicyA9IHVuc2FmZUR1cGFibGVQZXJmb3JtSU8gJCB1bnNhZmVVc2VBc0NTdHJpbmcgYnMgY2FzdEJzCitic1RvRG91YmxlTEUgYnMgPSB1bnNhZmVEdXBhYmxlUGVyZm9ybUlPICQgdW5zYWZlVXNlQXNDU3RyaW5nIGJzIGNhc3RCc1N3YXBwZWQKICNlbmRpZgogCi0jaWYgX19CWVRFX09SREVSID09IF9fTElUVExFX0VORElBTgorCitjYXN0QnNTd2FwcGVkIGNoclB0ciA9IGRvCisgIHcgPC0gcGVlayAoY2FzdFB0ciBjaHJQdHIpCisgIHBva2UgKGNhc3RQdHIgY2hyUHRyKSAoYnl0ZVN3YXAgdykKKyAgcGVlayAoY2FzdFB0ciBjaHJQdHIpCitjYXN0QnMgPSBwZWVrIC4gY2FzdFB0cgorCiAtLSB8IFN3YXAgZW5kaWFubmVzcyBvZiBhIDY0LWJpdCB3b3JkCiBieXRlU3dhcCA6OiBXb3JkNjQgLT4gV29yZDY0CiBieXRlU3dhcCB3ID0gKHcgYHNoaWZ0TGAgNTYgLiYuIDB4RkYwMDAwMDAwMDAwMDAwMCkgLnwuCkBAIC0xNDEsNCArMTM0LDMgQEAKICAgICAgICAgICAgICAodyBgc2hpZnRSYCAyNCAuJi4gMHgwMDAwMDAwMDAwRkYwMDAwKSAufC4KICAgICAgICAgICAgICAodyBgc2hpZnRSYCA0MCAuJi4gMHgwMDAwMDAwMDAwMDBGRjAwKSAufC4KICAgICAgICAgICAgICAodyBgc2hpZnRSYCA1NiAuJi4gMHgwMDAwMDAwMDAwMDAwMEZGKQotI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvaHMvc3JjL1RocmlmdC9Qcm90b2NvbC9CaW5hcnkuaHMgYi9saWIvaHMvc3JjL1RocmlmdC9Qcm90b2NvbC9CaW5hcnkuaHMKaW5kZXggYWM3ODQ4My4uN2IwYWNkOSAxMDA2NDQKLS0tIGEvbGliL2hzL3NyYy9UaHJpZnQvUHJvdG9jb2wvQmluYXJ5LmhzCisrKyBiL2xpYi9ocy9zcmMvVGhyaWZ0L1Byb3RvY29sL0JpbmFyeS5ocwpAQCAtMjUsNiArMjUsOCBAQAogbW9kdWxlIFRocmlmdC5Qcm90b2NvbC5CaW5hcnkKICAgICAoIG1vZHVsZSBUaHJpZnQuUHJvdG9jb2wKICAgICAsIEJpbmFyeVByb3RvY29sKC4uKQorICAgICwgdmVyc2lvbk1hc2sKKyAgICAsIHZlcnNpb24xCiAgICAgKSB3aGVyZQogCiBpbXBvcnQgQ29udHJvbC5FeGNlcHRpb24gKCB0aHJvdyApCkBAIC0zNSw2ICszNyw3IEBACiBpbXBvcnQgRGF0YS5JbnQKIGltcG9ydCBEYXRhLk1vbm9pZAogaW1wb3J0IERhdGEuVGV4dC5MYXp5LkVuY29kaW5nICggZGVjb2RlVXRmOCwgZW5jb2RlVXRmOCApCitpbXBvcnQgRGF0YS5Xb3JkCiAKIGltcG9ydCBUaHJpZnQuUHJvdG9jb2wKIGltcG9ydCBUaHJpZnQuVHJhbnNwb3J0CkBAIC00NywzNyArNTAsNTUgQEAKIGltcG9ydCBxdWFsaWZpZWQgRGF0YS5IYXNoTWFwLlN0cmljdCBhcyBNYXAKIGltcG9ydCBxdWFsaWZpZWQgRGF0YS5UZXh0LkxhenkgYXMgTFQKIAotZGF0YSBCaW5hcnlQcm90b2NvbCBhID0gQmluYXJ5UHJvdG9jb2wgYQordmVyc2lvbk1hc2sgOjogSW50MzIKK3ZlcnNpb25NYXNrID0gZnJvbUludGVncmFsICgweGZmZmYwMDAwIDo6IFdvcmQzMikKKwordmVyc2lvbjEgOjogSW50MzIKK3ZlcnNpb24xID0gZnJvbUludGVncmFsICgweDgwMDEwMDAwIDo6IFdvcmQzMikKKworZGF0YSBCaW5hcnlQcm90b2NvbCBhID0gVHJhbnNwb3J0IGEgPT4gQmluYXJ5UHJvdG9jb2wgYQorCitnZXRUcmFuc3BvcnQgOjogVHJhbnNwb3J0IHQgPT4gQmluYXJ5UHJvdG9jb2wgdCAtPiB0CitnZXRUcmFuc3BvcnQgKEJpbmFyeVByb3RvY29sIHQpID0gdAogCiAtLSBOT1RFOiBSZWFkaW5nIGFuZCBXcml0aW5nIGZ1bmN0aW9ucyByZWx5IG9uIEJ1aWxkZXJzIGFuZCBEYXRhLkJpbmFyeSB0bwogLS0gZW5jb2RlIGFuZCBkZWNvZGUgZGF0YS4gIERhdGEuQmluYXJ5IGFzc3VtZXMgdGhhdCB0aGUgYmluYXJ5IHZhbHVlcyBpdCBpcwogLS0gZW5jb2RpbmcgdG8gYW5kIGRlY29kaW5nIGZyb20gYXJlIGluIEJJRyBFTkRJQU4gZm9ybWF0LCBhbmQgY29udmVydHMgdGhlCiAtLSBlbmRpYW5uZXNzIGFzIG5lY2Vzc2FyeSB0byBtYXRjaCB0aGUgbG9jYWwgbWFjaGluZS4KLWluc3RhbmNlIFByb3RvY29sIEJpbmFyeVByb3RvY29sIHdoZXJlCi0gICAgZ2V0VHJhbnNwb3J0IChCaW5hcnlQcm90b2NvbCB0KSA9IHQKK2luc3RhbmNlIFRyYW5zcG9ydCB0ID0+IFByb3RvY29sIChCaW5hcnlQcm90b2NvbCB0KSB3aGVyZQorICAgIHJlYWRCeXRlIHAgPSB0UmVhZEFsbCAoZ2V0VHJhbnNwb3J0IHApIDEKKyAgICAtLSBmbHVzaFRyYW5zcG9ydCBwID0gdEZsdXNoIChnZXRUcmFuc3BvcnQgcCkKKyAgICB3cml0ZU1lc3NhZ2UgcCAobiwgdCwgcykgZiA9IGRvCisgICAgICB0V3JpdGUgKGdldFRyYW5zcG9ydCBwKSBtZXNzYWdlQmVnaW4KKyAgICAgIGYKKyAgICAgIHRGbHVzaCAkIGdldFRyYW5zcG9ydCBwCisgICAgICB3aGVyZQorICAgICAgICBtZXNzYWdlQmVnaW4gPSB0b0xhenlCeXRlU3RyaW5nICQKKyAgICAgICAgICBidWlsZEJpbmFyeVZhbHVlIChUSTMyICh2ZXJzaW9uMSAufC4gZnJvbUludGVncmFsIChmcm9tRW51bSB0KSkpIDw+CisgICAgICAgICAgYnVpbGRCaW5hcnlWYWx1ZSAoVFN0cmluZyAkIGVuY29kZVV0ZjggbikgPD4KKyAgICAgICAgICBidWlsZEJpbmFyeVZhbHVlIChUSTMyIHMpCiAKLSAgICB3cml0ZU1lc3NhZ2VCZWdpbiBwIChuLCB0LCBzKSA9IHRXcml0ZSAoZ2V0VHJhbnNwb3J0IHApICQgdG9MYXp5Qnl0ZVN0cmluZyAkCi0gICAgICAgIGJ1aWxkQmluYXJ5VmFsdWUgKFRJMzIgKHZlcnNpb24xIC58LiBmcm9tSW50ZWdyYWwgKGZyb21FbnVtIHQpKSkgPD4KLSAgICAgICAgYnVpbGRCaW5hcnlWYWx1ZSAoVFN0cmluZyAkIGVuY29kZVV0ZjggbikgPD4KLSAgICAgICAgYnVpbGRCaW5hcnlWYWx1ZSAoVEkzMiBzKQorICAgIHJlYWRNZXNzYWdlIHAgPSAocmVhZE1lc3NhZ2VCZWdpbiBwID4+PSkKKyAgICAgIHdoZXJlCisgICAgICAgIHJlYWRNZXNzYWdlQmVnaW4gcCA9IHJ1blBhcnNlciBwICQgZG8KKyAgICAgICAgICBUSTMyIHZlciA8LSBwYXJzZUJpbmFyeVZhbHVlIFRfSTMyCisgICAgICAgICAgaWYgdmVyIC4mLiB2ZXJzaW9uTWFzayAvPSB2ZXJzaW9uMQorICAgICAgICAgICAgdGhlbiB0aHJvdyAkIFByb3RvY29sRXhuIFBFX0JBRF9WRVJTSU9OICJNaXNzaW5nIHZlcnNpb24gaWRlbnRpZmllciIKKyAgICAgICAgICAgIGVsc2UgZG8KKyAgICAgICAgICAgICAgVFN0cmluZyBzIDwtIHBhcnNlQmluYXJ5VmFsdWUgVF9TVFJJTkcKKyAgICAgICAgICAgICAgVEkzMiBzeiA8LSBwYXJzZUJpbmFyeVZhbHVlIFRfSTMyCisgICAgICAgICAgICAgIHJldHVybiAoZGVjb2RlVXRmOCBzLCB0b0VudW0gJCBmcm9tSW50ZWdyYWwgJCB2ZXIgLiYuIDB4RkYsIHN6KQogCi0gICAgcmVhZE1lc3NhZ2VCZWdpbiBwID0gcnVuUGFyc2VyIHAgJCBkbwotICAgICAgVEkzMiB2ZXIgPC0gcGFyc2VCaW5hcnlWYWx1ZSBUX0kzMgotICAgICAgaWYgdmVyIC4mLiB2ZXJzaW9uTWFzayAvPSB2ZXJzaW9uMQotICAgICAgICB0aGVuIHRocm93ICQgUHJvdG9jb2xFeG4gUEVfQkFEX1ZFUlNJT04gIk1pc3NpbmcgdmVyc2lvbiBpZGVudGlmaWVyIgotICAgICAgICBlbHNlIGRvCi0gICAgICAgICAgVFN0cmluZyBzIDwtIHBhcnNlQmluYXJ5VmFsdWUgVF9TVFJJTkcKLSAgICAgICAgICBUSTMyIHN6IDwtIHBhcnNlQmluYXJ5VmFsdWUgVF9JMzIKLSAgICAgICAgICByZXR1cm4gKGRlY29kZVV0ZjggcywgdG9FbnVtICQgZnJvbUludGVncmFsICQgdmVyIC4mLiAweEZGLCBzeikKKyAgICB3cml0ZVZhbCBwID0gdFdyaXRlIChnZXRUcmFuc3BvcnQgcCkgLiB0b0xhenlCeXRlU3RyaW5nIC4gYnVpbGRCaW5hcnlWYWx1ZQorICAgIHJlYWRWYWwgcCA9IHJ1blBhcnNlciBwIC4gcGFyc2VCaW5hcnlWYWx1ZQogCitpbnN0YW5jZSBUcmFuc3BvcnQgdCA9PiBTdGF0ZWxlc3NQcm90b2NvbCAoQmluYXJ5UHJvdG9jb2wgdCkgd2hlcmUKICAgICBzZXJpYWxpemVWYWwgXyA9IHRvTGF6eUJ5dGVTdHJpbmcgLiBidWlsZEJpbmFyeVZhbHVlCiAgICAgZGVzZXJpYWxpemVWYWwgXyB0eSBicyA9CiAgICAgICBjYXNlIExQLmVpdGhlclJlc3VsdCAkIExQLnBhcnNlIChwYXJzZUJpbmFyeVZhbHVlIHR5KSBicyBvZgogICAgICAgICBMZWZ0IHMgLT4gZXJyb3IgcwogICAgICAgICBSaWdodCB2YWwgLT4gdmFsCiAKLSAgICByZWFkVmFsIHAgPSBydW5QYXJzZXIgcCAuIHBhcnNlQmluYXJ5VmFsdWUKLQogLS0gfCBXcml0aW5nIEZ1bmN0aW9ucwogYnVpbGRCaW5hcnlWYWx1ZSA6OiBUaHJpZnRWYWwgLT4gQnVpbGRlcgogYnVpbGRCaW5hcnlWYWx1ZSAoVFN0cnVjdCBmaWVsZHMpID0gYnVpbGRCaW5hcnlTdHJ1Y3QgZmllbGRzIDw+IGJ1aWxkVHlwZSBUX1NUT1AKQEAgLTEwNCw2ICsxMjUsNyBAQAogYnVpbGRCaW5hcnlWYWx1ZSAoVFN0cmluZyBzKSA9IGludDMyQkUgbGVuIDw+IGxhenlCeXRlU3RyaW5nIHMKICAgd2hlcmUKICAgICBsZW4gOjogSW50MzIgPSBmcm9tSW50ZWdyYWwgKExCUy5sZW5ndGggcykKK2J1aWxkQmluYXJ5VmFsdWUgKFRCaW5hcnkgcykgPSBidWlsZEJpbmFyeVZhbHVlIChUU3RyaW5nIHMpCiAKIGJ1aWxkQmluYXJ5U3RydWN0IDo6IE1hcC5IYXNoTWFwIEludDE2IChMVC5UZXh0LCBUaHJpZnRWYWwpIC0+IEJ1aWxkZXIKIGJ1aWxkQmluYXJ5U3RydWN0ID0gTWFwLmZvbGRyV2l0aEtleSBjb21iaW5lIG1lbXB0eQpAQCAtMTIxLDcgKzE0Myw3IEBACiAKIC0tIHwgUmVhZGluZyBGdW5jdGlvbnMKIHBhcnNlQmluYXJ5VmFsdWUgOjogVGhyaWZ0VHlwZSAtPiBQLlBhcnNlciBUaHJpZnRWYWwKLXBhcnNlQmluYXJ5VmFsdWUgKFRfU1RSVUNUIF8pID0gVFN0cnVjdCA8JD4gcGFyc2VCaW5hcnlTdHJ1Y3QKK3BhcnNlQmluYXJ5VmFsdWUgKFRfU1RSVUNUIHRtYXApID0gVFN0cnVjdCA8JD4gcGFyc2VCaW5hcnlTdHJ1Y3QgdG1hcAogcGFyc2VCaW5hcnlWYWx1ZSAoVF9NQVAgXyBfKSA9IGRvCiAgIGt0IDwtIHBhcnNlVHlwZQogICB2dCA8LSBwYXJzZVR5cGUKQEAgLTE0MSwxOCArMTYzLDIzIEBACiBwYXJzZUJpbmFyeVZhbHVlIFRfSTMyID0gVEkzMiAuIEJpbmFyeS5kZWNvZGUgLiBMQlMuZnJvbVN0cmljdCA8JD4gUC50YWtlIDQKIHBhcnNlQmluYXJ5VmFsdWUgVF9JNjQgPSBUSTY0IC4gQmluYXJ5LmRlY29kZSAuIExCUy5mcm9tU3RyaWN0IDwkPiBQLnRha2UgOAogcGFyc2VCaW5hcnlWYWx1ZSBUX0RPVUJMRSA9IFREb3VibGUgLiBic1RvRG91YmxlIDwkPiBQLnRha2UgOAotcGFyc2VCaW5hcnlWYWx1ZSBUX1NUUklORyA9IGRvCi0gIGkgOjogSW50MzIgIDwtIEJpbmFyeS5kZWNvZGUgLiBMQlMuZnJvbVN0cmljdCA8JD4gUC50YWtlIDQKLSAgVFN0cmluZyAuIExCUy5mcm9tU3RyaWN0IDwkPiBQLnRha2UgKGZyb21JbnRlZ3JhbCBpKQorcGFyc2VCaW5hcnlWYWx1ZSBUX1NUUklORyA9IHBhcnNlQmluYXJ5U3RyaW5nIFRTdHJpbmcKK3BhcnNlQmluYXJ5VmFsdWUgVF9CSU5BUlkgPSBwYXJzZUJpbmFyeVN0cmluZyBUQmluYXJ5CiBwYXJzZUJpbmFyeVZhbHVlIHR5ID0gZXJyb3IgJCAiQ2Fubm90IHJlYWQgdmFsdWUgb2YgdHlwZSAiICsrIHNob3cgdHkKIAotcGFyc2VCaW5hcnlTdHJ1Y3QgOjogUC5QYXJzZXIgKE1hcC5IYXNoTWFwIEludDE2IChMVC5UZXh0LCBUaHJpZnRWYWwpKQotcGFyc2VCaW5hcnlTdHJ1Y3QgPSBNYXAuZnJvbUxpc3QgPCQ+IFAubWFueVRpbGwgcGFyc2VGaWVsZCAobWF0Y2hUeXBlIFRfU1RPUCkKK3BhcnNlQmluYXJ5U3RyaW5nIHR5ID0gZG8KKyAgaSA6OiBJbnQzMiAgPC0gQmluYXJ5LmRlY29kZSAuIExCUy5mcm9tU3RyaWN0IDwkPiBQLnRha2UgNAorICB0eSAuIExCUy5mcm9tU3RyaWN0IDwkPiBQLnRha2UgKGZyb21JbnRlZ3JhbCBpKQorCitwYXJzZUJpbmFyeVN0cnVjdCA6OiBUeXBlTWFwIC0+IFAuUGFyc2VyIChNYXAuSGFzaE1hcCBJbnQxNiAoTFQuVGV4dCwgVGhyaWZ0VmFsKSkKK3BhcnNlQmluYXJ5U3RydWN0IHRtYXAgPSBNYXAuZnJvbUxpc3QgPCQ+IFAubWFueVRpbGwgcGFyc2VGaWVsZCAobWF0Y2hUeXBlIFRfU1RPUCkKICAgd2hlcmUKICAgICBwYXJzZUZpZWxkID0gZG8KICAgICAgIHQgPC0gcGFyc2VUeXBlCiAgICAgICBuIDwtIEJpbmFyeS5kZWNvZGUgLiBMQlMuZnJvbVN0cmljdCA8JD4gUC50YWtlIDIKLSAgICAgIHYgPC0gcGFyc2VCaW5hcnlWYWx1ZSB0CisgICAgICB2IDwtIGNhc2UgKHQsIE1hcC5sb29rdXAgbiB0bWFwKSBvZgorICAgICAgICAgICAgIChUX1NUUklORywgSnVzdCAoXywgVF9CSU5BUlkpKSAtPiBwYXJzZUJpbmFyeVZhbHVlIFRfQklOQVJZCisgICAgICAgICAgICAgXyAtPiBwYXJzZUJpbmFyeVZhbHVlIHQKICAgICAgIHJldHVybiAobiwgKCIiLCB2KSkKIAogcGFyc2VCaW5hcnlNYXAgOjogVGhyaWZ0VHlwZSAtPiBUaHJpZnRUeXBlIC0+IEludDMyIC0+IFAuUGFyc2VyIFsoVGhyaWZ0VmFsLCBUaHJpZnRWYWwpXQpkaWZmIC0tZ2l0IGEvbGliL2hzL3NyYy9UaHJpZnQvUHJvdG9jb2wvQ29tcGFjdC5ocyBiL2xpYi9ocy9zcmMvVGhyaWZ0L1Byb3RvY29sL0NvbXBhY3QuaHMKaW5kZXggYTMyOWY0ZS4uZjIzOTcwYSAxMDA2NDQKLS0tIGEvbGliL2hzL3NyYy9UaHJpZnQvUHJvdG9jb2wvQ29tcGFjdC5ocworKysgYi9saWIvaHMvc3JjL1RocmlmdC9Qcm90b2NvbC9Db21wYWN0LmhzCkBAIC0yNSwxMCArMjUsMTEgQEAKIG1vZHVsZSBUaHJpZnQuUHJvdG9jb2wuQ29tcGFjdAogICAgICggbW9kdWxlIFRocmlmdC5Qcm90b2NvbAogICAgICwgQ29tcGFjdFByb3RvY29sKC4uKQorICAgICwgcGFyc2VWYXJpbnQKKyAgICAsIGJ1aWxkVmFyaW50CiAgICAgKSB3aGVyZQogCiBpbXBvcnQgQ29udHJvbC5BcHBsaWNhdGl2ZQotaW1wb3J0IENvbnRyb2wuRXhjZXB0aW9uICggdGhyb3cgKQogaW1wb3J0IENvbnRyb2wuTW9uYWQKIGltcG9ydCBEYXRhLkF0dG9wYXJzZWMuQnl0ZVN0cmluZyBhcyBQCiBpbXBvcnQgRGF0YS5BdHRvcGFyc2VjLkJ5dGVTdHJpbmcuTGF6eSBhcyBMUApAQCAtNDAsNyArNDEsNyBAQAogaW1wb3J0IERhdGEuV29yZAogaW1wb3J0IERhdGEuVGV4dC5MYXp5LkVuY29kaW5nICggZGVjb2RlVXRmOCwgZW5jb2RlVXRmOCApCiAKLWltcG9ydCBUaHJpZnQuUHJvdG9jb2wgaGlkaW5nICh2ZXJzaW9uTWFzaykKK2ltcG9ydCBUaHJpZnQuUHJvdG9jb2wKIGltcG9ydCBUaHJpZnQuVHJhbnNwb3J0CiBpbXBvcnQgVGhyaWZ0LlR5cGVzCiAKQEAgLTU1LDcgKzU2LDcgQEAKIGRhdGEgQ29tcGFjdFByb3RvY29sIGEgPSBDb21wYWN0UHJvdG9jb2wgYQogICAgICAgICAgICAgICAgICAgICAgICAgIC0tIF4gQ29uc3R1Y3QgYSAnQ29tcGFjdFByb3RvY29sJyB3aXRoIGEgJ1RyYW5zcG9ydCcKIAotcHJvdG9jb2xJRCwgdmVyc2lvbiwgdHlwZU1hc2sgOjogSW50OAorcHJvdG9jb2xJRCwgdmVyc2lvbiwgdmVyc2lvbk1hc2ssIHR5cGVNYXNrLCB0eXBlQml0cyA6OiBXb3JkOAogcHJvdG9jb2xJRCAgPSAweDgyIC0tIDEwMDAgMDAxMAogdmVyc2lvbiAgICAgPSAweDAxCiB2ZXJzaW9uTWFzayA9IDB4MWYgLS0gMDAwMSAxMTExCkBAIC02NCwzOCArNjUsNDcgQEAKIHR5cGVTaGlmdEFtb3VudCA6OiBJbnQKIHR5cGVTaGlmdEFtb3VudCA9IDUKIAorZ2V0VHJhbnNwb3J0IDo6IFRyYW5zcG9ydCB0ID0+IENvbXBhY3RQcm90b2NvbCB0IC0+IHQKK2dldFRyYW5zcG9ydCAoQ29tcGFjdFByb3RvY29sIHQpID0gdAogCi1pbnN0YW5jZSBQcm90b2NvbCBDb21wYWN0UHJvdG9jb2wgd2hlcmUKLSAgICBnZXRUcmFuc3BvcnQgKENvbXBhY3RQcm90b2NvbCB0KSA9IHQKK2luc3RhbmNlIFRyYW5zcG9ydCB0ID0+IFByb3RvY29sIChDb21wYWN0UHJvdG9jb2wgdCkgd2hlcmUKKyAgICByZWFkQnl0ZSBwID0gdFJlYWRBbGwgKGdldFRyYW5zcG9ydCBwKSAxCisgICAgd3JpdGVNZXNzYWdlIHAgKG4sIHQsIHMpIGYgPSBkbworICAgICAgdFdyaXRlIChnZXRUcmFuc3BvcnQgcCkgbWVzc2FnZUJlZ2luCisgICAgICBmCisgICAgICB0Rmx1c2ggJCBnZXRUcmFuc3BvcnQgcAorICAgICAgd2hlcmUKKyAgICAgICAgbWVzc2FnZUJlZ2luID0gdG9MYXp5Qnl0ZVN0cmluZyAkCisgICAgICAgICAgQi53b3JkOCBwcm90b2NvbElEIDw+CisgICAgICAgICAgQi53b3JkOCAoKHZlcnNpb24gLiYuIHZlcnNpb25NYXNrKSAufC4KKyAgICAgICAgICAgICAgICAgICgoKGZyb21JbnRlZ3JhbCAkIGZyb21FbnVtIHQpIGBzaGlmdExgCisgICAgICAgICAgICAgICAgICB0eXBlU2hpZnRBbW91bnQpIC4mLiB0eXBlTWFzaykpIDw+CisgICAgICAgICAgYnVpbGRWYXJpbnQgKGkzMlRvWmlnWmFnIHMpIDw+CisgICAgICAgICAgYnVpbGRDb21wYWN0VmFsdWUgKFRTdHJpbmcgJCBlbmNvZGVVdGY4IG4pCiAKLSAgICB3cml0ZU1lc3NhZ2VCZWdpbiBwIChuLCB0LCBzKSA9IHRXcml0ZSAoZ2V0VHJhbnNwb3J0IHApICQgdG9MYXp5Qnl0ZVN0cmluZyAkCi0gICAgICBCLmludDggcHJvdG9jb2xJRCA8PgotICAgICAgQi5pbnQ4ICgodmVyc2lvbiAuJi4gdmVyc2lvbk1hc2spIC58LgotICAgICAgICAgICAgICAoKChmcm9tSW50ZWdyYWwgJCBmcm9tRW51bSB0KSBgc2hpZnRMYAotICAgICAgICAgICAgICAgIHR5cGVTaGlmdEFtb3VudCkgLiYuIHR5cGVNYXNrKSkgPD4KLSAgICAgIGJ1aWxkVmFyaW50IChpMzJUb1ppZ1phZyBzKSA8PgotICAgICAgYnVpbGRDb21wYWN0VmFsdWUgKFRTdHJpbmcgJCBlbmNvZGVVdGY4IG4pCi0gICAgCi0gICAgcmVhZE1lc3NhZ2VCZWdpbiBwID0gcnVuUGFyc2VyIHAgJCBkbwotICAgICAgcGlkIDwtIGZyb21JbnRlZ3JhbCA8JD4gUC5hbnlXb3JkOAotICAgICAgd2hlbiAocGlkIC89IHByb3RvY29sSUQpICQgZXJyb3IgIkJhZCBQcm90b2NvbCBJRCIKLSAgICAgIHcgPC0gZnJvbUludGVncmFsIDwkPiBQLmFueVdvcmQ4Ci0gICAgICBsZXQgdmVyID0gdyAuJi4gdmVyc2lvbk1hc2sgCi0gICAgICB3aGVuICh2ZXIgLz0gdmVyc2lvbikgJCBlcnJvciAiQmFkIFByb3RvY29sIHZlcnNpb24iCi0gICAgICBsZXQgdHlwID0gKHcgYHNoaWZ0UmAgdHlwZVNoaWZ0QW1vdW50KSAuJi4gdHlwZUJpdHMKLSAgICAgIHNlcUlkIDwtIHBhcnNlVmFyaW50IHppZ1phZ1RvSTMyCi0gICAgICBUU3RyaW5nIG5hbWUgPC0gcGFyc2VDb21wYWN0VmFsdWUgVF9TVFJJTkcKLSAgICAgIHJldHVybiAoZGVjb2RlVXRmOCBuYW1lLCB0b0VudW0gJCBmcm9tSW50ZWdyYWwgJCB0eXAsIHNlcUlkKQorICAgIHJlYWRNZXNzYWdlIHAgZiA9IHJlYWRNZXNzYWdlQmVnaW4gPj49IGYKKyAgICAgIHdoZXJlCisgICAgICAgIHJlYWRNZXNzYWdlQmVnaW4gPSBydW5QYXJzZXIgcCAkIGRvCisgICAgICAgICAgcGlkIDwtIGZyb21JbnRlZ3JhbCA8JD4gUC5hbnlXb3JkOAorICAgICAgICAgIHdoZW4gKHBpZCAvPSBwcm90b2NvbElEKSAkIGVycm9yICJCYWQgUHJvdG9jb2wgSUQiCisgICAgICAgICAgdyA8LSBmcm9tSW50ZWdyYWwgPCQ+IFAuYW55V29yZDgKKyAgICAgICAgICBsZXQgdmVyID0gdyAuJi4gdmVyc2lvbk1hc2sKKyAgICAgICAgICB3aGVuICh2ZXIgLz0gdmVyc2lvbikgJCBlcnJvciAiQmFkIFByb3RvY29sIHZlcnNpb24iCisgICAgICAgICAgbGV0IHR5cCA9ICh3IGBzaGlmdFJgIHR5cGVTaGlmdEFtb3VudCkgLiYuIHR5cGVCaXRzCisgICAgICAgICAgc2VxSWQgPC0gcGFyc2VWYXJpbnQgemlnWmFnVG9JMzIKKyAgICAgICAgICBUU3RyaW5nIG5hbWUgPC0gcGFyc2VDb21wYWN0VmFsdWUgVF9TVFJJTkcKKyAgICAgICAgICByZXR1cm4gKGRlY29kZVV0ZjggbmFtZSwgdG9FbnVtICQgZnJvbUludGVncmFsICQgdHlwLCBzZXFJZCkKIAorICAgIHdyaXRlVmFsIHAgPSB0V3JpdGUgKGdldFRyYW5zcG9ydCBwKSAuIHRvTGF6eUJ5dGVTdHJpbmcgLiBidWlsZENvbXBhY3RWYWx1ZQorICAgIHJlYWRWYWwgcCB0eSA9IHJ1blBhcnNlciBwICQgcGFyc2VDb21wYWN0VmFsdWUgdHkKKworaW5zdGFuY2UgVHJhbnNwb3J0IHQgPT4gU3RhdGVsZXNzUHJvdG9jb2wgKENvbXBhY3RQcm90b2NvbCB0KSB3aGVyZQogICAgIHNlcmlhbGl6ZVZhbCBfID0gdG9MYXp5Qnl0ZVN0cmluZyAuIGJ1aWxkQ29tcGFjdFZhbHVlCiAgICAgZGVzZXJpYWxpemVWYWwgXyB0eSBicyA9CiAgICAgICBjYXNlIExQLmVpdGhlclJlc3VsdCAkIExQLnBhcnNlIChwYXJzZUNvbXBhY3RWYWx1ZSB0eSkgYnMgb2YKICAgICAgICAgTGVmdCBzIC0+IGVycm9yIHMKICAgICAgICAgUmlnaHQgdmFsIC0+IHZhbAogCi0gICAgcmVhZFZhbCBwIHR5ID0gcnVuUGFyc2VyIHAgJCBwYXJzZUNvbXBhY3RWYWx1ZSB0eQotCi0KIC0tIHwgV3JpdGluZyBGdW5jdGlvbnMKIGJ1aWxkQ29tcGFjdFZhbHVlIDo6IFRocmlmdFZhbCAtPiBCdWlsZGVyCiBidWlsZENvbXBhY3RWYWx1ZSAoVFN0cnVjdCBmaWVsZHMpID0gYnVpbGRDb21wYWN0U3RydWN0IGZpZWxkcwpAQCAtMTIwLDEwICsxMzAsMTEgQEAKIGJ1aWxkQ29tcGFjdFZhbHVlIChUSTE2IGkpID0gYnVpbGRWYXJpbnQgJCBpMTZUb1ppZ1phZyBpCiBidWlsZENvbXBhY3RWYWx1ZSAoVEkzMiBpKSA9IGJ1aWxkVmFyaW50ICQgaTMyVG9aaWdaYWcgaQogYnVpbGRDb21wYWN0VmFsdWUgKFRJNjQgaSkgPSBidWlsZFZhcmludCAkIGk2NFRvWmlnWmFnIGkKLWJ1aWxkQ29tcGFjdFZhbHVlIChURG91YmxlIGQpID0gZG91YmxlQkUgZAorYnVpbGRDb21wYWN0VmFsdWUgKFREb3VibGUgZCkgPSBkb3VibGVMRSBkCiBidWlsZENvbXBhY3RWYWx1ZSAoVFN0cmluZyBzKSA9IGJ1aWxkVmFyaW50IGxlbiA8PiBsYXp5Qnl0ZVN0cmluZyBzCiAgIHdoZXJlCiAgICAgbGVuID0gZnJvbUludGVncmFsIChMQlMubGVuZ3RoIHMpIDo6IFdvcmQzMgorYnVpbGRDb21wYWN0VmFsdWUgKFRCaW5hcnkgcykgPSBidWlsZENvbXBhY3RWYWx1ZSAoVFN0cmluZyBzKQogCiBidWlsZENvbXBhY3RTdHJ1Y3QgOjogTWFwLkhhc2hNYXAgSW50MTYgKExULlRleHQsIFRocmlmdFZhbCkgLT4gQnVpbGRlcgogYnVpbGRDb21wYWN0U3RydWN0ID0gZmxpcCAobG9vcCAwKSBtZW1wdHkgLiBNYXAudG9MaXN0CkBAIC0xNDYsNyArMTU3LDcgQEAKIAogLS0gfCBSZWFkaW5nIEZ1bmN0aW9ucwogcGFyc2VDb21wYWN0VmFsdWUgOjogVGhyaWZ0VHlwZSAtPiBQYXJzZXIgVGhyaWZ0VmFsCi1wYXJzZUNvbXBhY3RWYWx1ZSAoVF9TVFJVQ1QgXykgPSBUU3RydWN0IDwkPiBwYXJzZUNvbXBhY3RTdHJ1Y3QKK3BhcnNlQ29tcGFjdFZhbHVlIChUX1NUUlVDVCB0bWFwKSA9IFRTdHJ1Y3QgPCQ+IHBhcnNlQ29tcGFjdFN0cnVjdCB0bWFwCiBwYXJzZUNvbXBhY3RWYWx1ZSAoVF9NQVAga3QnIHZ0JykgPSBkbwogICBuIDwtIHBhcnNlVmFyaW50IGlkCiAgIGlmIG4gPT0gMApAQCAtMTYzLDE0ICsxNzQsMTcgQEAKIHBhcnNlQ29tcGFjdFZhbHVlIFRfSTE2ID0gVEkxNiA8JD4gcGFyc2VWYXJpbnQgemlnWmFnVG9JMTYKIHBhcnNlQ29tcGFjdFZhbHVlIFRfSTMyID0gVEkzMiA8JD4gcGFyc2VWYXJpbnQgemlnWmFnVG9JMzIKIHBhcnNlQ29tcGFjdFZhbHVlIFRfSTY0ID0gVEk2NCA8JD4gcGFyc2VWYXJpbnQgemlnWmFnVG9JNjQKLXBhcnNlQ29tcGFjdFZhbHVlIFRfRE9VQkxFID0gVERvdWJsZSAuIGJzVG9Eb3VibGUgPCQ+IFAudGFrZSA4Ci1wYXJzZUNvbXBhY3RWYWx1ZSBUX1NUUklORyA9IGRvCi0gIGxlbiA6OiBXb3JkMzIgPC0gcGFyc2VWYXJpbnQgaWQKLSAgVFN0cmluZyAuIExCUy5mcm9tU3RyaWN0IDwkPiBQLnRha2UgKGZyb21JbnRlZ3JhbCBsZW4pCitwYXJzZUNvbXBhY3RWYWx1ZSBUX0RPVUJMRSA9IFREb3VibGUgLiBic1RvRG91YmxlTEUgPCQ+IFAudGFrZSA4CitwYXJzZUNvbXBhY3RWYWx1ZSBUX1NUUklORyA9IHBhcnNlQ29tcGFjdFN0cmluZyBUU3RyaW5nCitwYXJzZUNvbXBhY3RWYWx1ZSBUX0JJTkFSWSA9IHBhcnNlQ29tcGFjdFN0cmluZyBUQmluYXJ5CiBwYXJzZUNvbXBhY3RWYWx1ZSB0eSA9IGVycm9yICQgIkNhbm5vdCByZWFkIHZhbHVlIG9mIHR5cGUgIiArKyBzaG93IHR5CiAKLXBhcnNlQ29tcGFjdFN0cnVjdCA6OiBQYXJzZXIgKE1hcC5IYXNoTWFwIEludDE2IChMVC5UZXh0LCBUaHJpZnRWYWwpKQotcGFyc2VDb21wYWN0U3RydWN0ID0gTWFwLmZyb21MaXN0IDwkPiBwYXJzZUZpZWxkcyAwCitwYXJzZUNvbXBhY3RTdHJpbmcgdHkgPSBkbworICBsZW4gOjogV29yZDMyIDwtIHBhcnNlVmFyaW50IGlkCisgIHR5IC4gTEJTLmZyb21TdHJpY3QgPCQ+IFAudGFrZSAoZnJvbUludGVncmFsIGxlbikKKworcGFyc2VDb21wYWN0U3RydWN0IDo6IFR5cGVNYXAgLT4gUGFyc2VyIChNYXAuSGFzaE1hcCBJbnQxNiAoTFQuVGV4dCwgVGhyaWZ0VmFsKSkKK3BhcnNlQ29tcGFjdFN0cnVjdCB0bWFwID0gTWFwLmZyb21MaXN0IDwkPiBwYXJzZUZpZWxkcyAwCiAgIHdoZXJlCiAgICAgcGFyc2VGaWVsZHMgOjogSW50MTYgLT4gUGFyc2VyIFsoSW50MTYsIChMVC5UZXh0LCBUaHJpZnRWYWwpKV0KICAgICBwYXJzZUZpZWxkcyBsYXN0SWQgPSBkbwpAQCAtMTg1LDcgKzE5OSw5IEBACiAgICAgICAgICAgICAgICAgIGVsc2UgcGFyc2VWYXJpbnQgemlnWmFnVG9JMTYKICAgICAgICAgICB2YWwgPC0gaWYgdHkgPT0gVF9CT09MCiAgICAgICAgICAgICAgICAgIHRoZW4gcmV0dXJuIChUQm9vbCAkICh3IC4mLiAweDBGKSA9PSAweDAxKQotICAgICAgICAgICAgICAgICBlbHNlIHBhcnNlQ29tcGFjdFZhbHVlIHR5CisgICAgICAgICAgICAgICAgIGVsc2UgY2FzZSAodHksIE1hcC5sb29rdXAgZmlkIHRtYXApIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAoVF9TVFJJTkcsIEp1c3QgKF8sIFRfQklOQVJZKSkgLT4gcGFyc2VDb21wYWN0VmFsdWUgVF9CSU5BUlkKKyAgICAgICAgICAgICAgICAgICAgICAgIF8gLT4gcGFyc2VDb21wYWN0VmFsdWUgdHkKICAgICAgICAgICAoKGZpZCwgKExULmVtcHR5LCB2YWwpKSA6ICkgPCQ+IHBhcnNlRmllbGRzIGZpZAogCiBwYXJzZUNvbXBhY3RNYXAgOjogVGhyaWZ0VHlwZSAtPiBUaHJpZnRUeXBlIC0+IEludDMyIC0+CkBAIC0yNTUsNiArMjcxLDcgQEAKICAgVF9JNjQgLT4gMHgwNgogICBUX0RPVUJMRSAtPiAweDA3CiAgIFRfU1RSSU5HIC0+IDB4MDgKKyAgVF9CSU5BUlkgLT4gMHgwOAogICBUX0xJU1R7fSAtPiAweDA5CiAgIFRfU0VUe30gLT4gMHgwQQogICBUX01BUHt9IC0+IDB4MEIKQEAgLTI3MSwxMSArMjg4LDEyIEBACiAgIFRJNjQgXyAtPiAweDA2CiAgIFREb3VibGUgXyAtPiAweDA3CiAgIFRTdHJpbmcgXyAtPiAweDA4CisgIFRCaW5hcnkgXyAtPiAweDA4CiAgIFRMaXN0e30gLT4gMHgwOQogICBUU2V0e30gLT4gMHgwQQogICBUTWFwe30gLT4gMHgwQgogICBUU3RydWN0e30gLT4gMHgwQwotICAKKwogdHlwZUZyb20gOjogV29yZDggLT4gVGhyaWZ0VHlwZQogdHlwZUZyb20gdyA9IGNhc2UgdyBvZgogICAweDAxIC0+IFRfQk9PTApkaWZmIC0tZ2l0IGEvbGliL2hzL3NyYy9UaHJpZnQvUHJvdG9jb2wvSGVhZGVyLmhzIGIvbGliL2hzL3NyYy9UaHJpZnQvUHJvdG9jb2wvSGVhZGVyLmhzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmNDJkYjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaHMvc3JjL1RocmlmdC9Qcm90b2NvbC9IZWFkZXIuaHMKQEAgLTAsMCArMSwxNDEgQEAKKy0tCistLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCistLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLS0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy0tIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLS0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLS0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLS0gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CistLQorLS0gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy0tCistLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCistLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLS0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCistLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLS0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLS0gdW5kZXIgdGhlIExpY2Vuc2UuCistLQorCisKK21vZHVsZSBUaHJpZnQuUHJvdG9jb2wuSGVhZGVyCisgICAgKCBtb2R1bGUgVGhyaWZ0LlByb3RvY29sCisgICAgLCBIZWFkZXJQcm90b2NvbCguLikKKyAgICAsIGdldFByb3RvY29sVHlwZQorICAgICwgc2V0UHJvdG9jb2xUeXBlCisgICAgLCBnZXRIZWFkZXJzCisgICAgLCBnZXRXcml0ZUhlYWRlcnMKKyAgICAsIHNldEhlYWRlcgorICAgICwgc2V0SGVhZGVycworICAgICwgY3JlYXRlSGVhZGVyUHJvdG9jb2wKKyAgICAsIGNyZWF0ZUhlYWRlclByb3RvY29sMQorICAgICkgd2hlcmUKKworaW1wb3J0IFRocmlmdC5Qcm90b2NvbAoraW1wb3J0IFRocmlmdC5Qcm90b2NvbC5CaW5hcnkKK2ltcG9ydCBUaHJpZnQuUHJvdG9jb2wuSlNPTgoraW1wb3J0IFRocmlmdC5Qcm90b2NvbC5Db21wYWN0CitpbXBvcnQgVGhyaWZ0LlRyYW5zcG9ydAoraW1wb3J0IFRocmlmdC5UcmFuc3BvcnQuSGVhZGVyCitpbXBvcnQgRGF0YS5JT1JlZgoraW1wb3J0IHF1YWxpZmllZCBEYXRhLk1hcCBhcyBNYXAKKworZGF0YSBQcm90b2NvbFdyYXAgPSBmb3JhbGwgYS4gKFByb3RvY29sIGEpID0+IFByb3RvY29sV3JhcChhKQorCitpbnN0YW5jZSBQcm90b2NvbCBQcm90b2NvbFdyYXAgd2hlcmUKKyAgcmVhZEJ5dGUgKFByb3RvY29sV3JhcCBwKSA9IHJlYWRCeXRlIHAKKyAgcmVhZFZhbCAoUHJvdG9jb2xXcmFwIHApID0gcmVhZFZhbCBwCisgIHJlYWRNZXNzYWdlIChQcm90b2NvbFdyYXAgcCkgPSByZWFkTWVzc2FnZSBwCisgIHdyaXRlVmFsIChQcm90b2NvbFdyYXAgcCkgPSB3cml0ZVZhbCBwCisgIHdyaXRlTWVzc2FnZSAoUHJvdG9jb2xXcmFwIHApID0gd3JpdGVNZXNzYWdlIHAKKworZGF0YSBIZWFkZXJQcm90b2NvbCBpIG8gPSAoVHJhbnNwb3J0IGksIFRyYW5zcG9ydCBvKSA9PiBIZWFkZXJQcm90b2NvbCB7CisgICAgdHJhbnMgOjogSGVhZGVyVHJhbnNwb3J0IGkgbywKKyAgICB3cmFwcGVkUHJvdG8gOjogSU9SZWYgUHJvdG9jb2xXcmFwCisgIH0KKworY3JlYXRlUHJvdG9jb2xXcmFwIDo6IFRyYW5zcG9ydCB0ID0+IFByb3RvY29sVHlwZSAtPiB0IC0+IFByb3RvY29sV3JhcAorY3JlYXRlUHJvdG9jb2xXcmFwIHR5cCB0ID0KKyAgY2FzZSB0eXAgb2YKKyAgICBUQmluYXJ5IC0+IFByb3RvY29sV3JhcCAkIEJpbmFyeVByb3RvY29sIHQKKyAgICBUQ29tcGFjdCAtPiBQcm90b2NvbFdyYXAgJCBDb21wYWN0UHJvdG9jb2wgdAorICAgIFRKU09OIC0+IFByb3RvY29sV3JhcCAkIEpTT05Qcm90b2NvbCB0CisKK2NyZWF0ZUhlYWRlclByb3RvY29sIDo6IChUcmFuc3BvcnQgaSwgVHJhbnNwb3J0IG8pID0+IGkgLT4gbyAtPiBJTyhIZWFkZXJQcm90b2NvbCBpIG8pCitjcmVhdGVIZWFkZXJQcm90b2NvbCBpIG8gPSBkbworICB0IDwtIG9wZW5IZWFkZXJUcmFuc3BvcnQgaSBvCisgIHBpZCA8LSByZWFkSU9SZWYgJCBwcm90b2NvbFR5cGUgdAorICBwcm90byA8LSBuZXdJT1JlZiAkIGNyZWF0ZVByb3RvY29sV3JhcCBwaWQgdAorICByZXR1cm4gJCBIZWFkZXJQcm90b2NvbCB7IHRyYW5zID0gdCwgd3JhcHBlZFByb3RvID0gcHJvdG8gfQorCitjcmVhdGVIZWFkZXJQcm90b2NvbDEgOjogVHJhbnNwb3J0IHQgPT4gdCAtPiBJTyhIZWFkZXJQcm90b2NvbCB0IHQpCitjcmVhdGVIZWFkZXJQcm90b2NvbDEgdCA9IGNyZWF0ZUhlYWRlclByb3RvY29sIHQgdAorCityZXNldFByb3RvY29sIDo6IChUcmFuc3BvcnQgaSwgVHJhbnNwb3J0IG8pID0+IEhlYWRlclByb3RvY29sIGkgbyAtPiBJTyAoKQorcmVzZXRQcm90b2NvbCBwID0gZG8KKyAgcGlkIDwtIHJlYWRJT1JlZiAkIHByb3RvY29sVHlwZSAkIHRyYW5zIHAKKyAgd3JpdGVJT1JlZiAod3JhcHBlZFByb3RvIHApICQgY3JlYXRlUHJvdG9jb2xXcmFwIHBpZCAkIHRyYW5zIHAKKworZ2V0V3JhcHBlZCA9IHJlYWRJT1JlZiAuIHdyYXBwZWRQcm90bworCitzZXRUcmFuc3BvcnQgOjogKFRyYW5zcG9ydCBpLCBUcmFuc3BvcnQgbykgPT4gSGVhZGVyUHJvdG9jb2wgaSBvIC0+IEhlYWRlclRyYW5zcG9ydCBpIG8gLT4gSGVhZGVyUHJvdG9jb2wgaSBvCitzZXRUcmFuc3BvcnQgcCB0ID0gcCB7IHRyYW5zID0gdCB9CisKK3VwZGF0ZVRyYW5zcG9ydCA6OiAoVHJhbnNwb3J0IGksIFRyYW5zcG9ydCBvKSA9PiBIZWFkZXJQcm90b2NvbCBpIG8gLT4gKEhlYWRlclRyYW5zcG9ydCBpIG8gLT4gSGVhZGVyVHJhbnNwb3J0IGkgbyktPiBIZWFkZXJQcm90b2NvbCBpIG8KK3VwZGF0ZVRyYW5zcG9ydCBwIGYgPSBzZXRUcmFuc3BvcnQgcCAoZiAkIHRyYW5zIHApCisKK3R5cGUgSGVhZGVycyA9IE1hcC5NYXAgU3RyaW5nIFN0cmluZworCistLSBUT0RPOiB3ZSB3YW50IHRvIHNldCBoZWFkZXJzIHdpdGhvdXQgcmVjcmVhdGluZyBjbGllbnQuLi4KK3NldEhlYWRlciA6OiAoVHJhbnNwb3J0IGksIFRyYW5zcG9ydCBvKSA9PiBIZWFkZXJQcm90b2NvbCBpIG8gLT4gU3RyaW5nIC0+IFN0cmluZyAtPiBIZWFkZXJQcm90b2NvbCBpIG8KK3NldEhlYWRlciBwIGsgdiA9IHVwZGF0ZVRyYW5zcG9ydCBwICQgXHQgLT4gdCB7IHdyaXRlSGVhZGVycyA9IE1hcC5pbnNlcnQgayB2ICQgd3JpdGVIZWFkZXJzIHQgfQorCitzZXRIZWFkZXJzIDo6IChUcmFuc3BvcnQgaSwgVHJhbnNwb3J0IG8pID0+IEhlYWRlclByb3RvY29sIGkgbyAtPiBIZWFkZXJzIC0+IEhlYWRlclByb3RvY29sIGkgbworc2V0SGVhZGVycyBwIGggPSB1cGRhdGVUcmFuc3BvcnQgcCAkIFx0IC0+IHQgeyB3cml0ZUhlYWRlcnMgPSBoIH0KKworLS0gVE9ETzogbWFrZSBpdCBwdWJsaWMgb25jZSB3ZSBoYXZlIGZpcnN0IHRyYW5zZm9ybSBpbXBsZW1lbnRhdGlvbiBmb3IgSGFza2VsbAorc2V0VHJhbnNmb3JtcyA6OiAoVHJhbnNwb3J0IGksIFRyYW5zcG9ydCBvKSA9PiBIZWFkZXJQcm90b2NvbCBpIG8gLT4gW1RyYW5zZm9ybVR5cGVdIC0+IEhlYWRlclByb3RvY29sIGkgbworc2V0VHJhbnNmb3JtcyBwIHRycyA9IHVwZGF0ZVRyYW5zcG9ydCBwICQgXHQgLT4gdCB7IHdyaXRlVHJhbnNmb3JtcyA9IHRycyB9CisKK3NldFRyYW5zZm9ybSA6OiAoVHJhbnNwb3J0IGksIFRyYW5zcG9ydCBvKSA9PiBIZWFkZXJQcm90b2NvbCBpIG8gLT4gVHJhbnNmb3JtVHlwZSAtPiBIZWFkZXJQcm90b2NvbCBpIG8KK3NldFRyYW5zZm9ybSBwIHRyID0gdXBkYXRlVHJhbnNwb3J0IHAgJCBcdCAtPiB0IHsgd3JpdGVUcmFuc2Zvcm1zID0gdHI6KHdyaXRlVHJhbnNmb3JtcyB0KSB9CisKK2dldFdyaXRlSGVhZGVycyA6OiAoVHJhbnNwb3J0IGksIFRyYW5zcG9ydCBvKSA9PiBIZWFkZXJQcm90b2NvbCBpIG8gLT4gSGVhZGVycworZ2V0V3JpdGVIZWFkZXJzID0gd3JpdGVIZWFkZXJzIC4gdHJhbnMKKworZ2V0SGVhZGVycyA6OiAoVHJhbnNwb3J0IGksIFRyYW5zcG9ydCBvKSA9PiBIZWFkZXJQcm90b2NvbCBpIG8gLT4gSU8gWyhTdHJpbmcsIFN0cmluZyldCitnZXRIZWFkZXJzID0gcmVhZElPUmVmIC4gaGVhZGVycyAuIHRyYW5zCisKK2dldFByb3RvY29sVHlwZSA6OiAoVHJhbnNwb3J0IGksIFRyYW5zcG9ydCBvKSA9PiBIZWFkZXJQcm90b2NvbCBpIG8gLT4gSU8gUHJvdG9jb2xUeXBlCitnZXRQcm90b2NvbFR5cGUgcCA9IHJlYWRJT1JlZiAkIHByb3RvY29sVHlwZSAkIHRyYW5zIHAKKworc2V0UHJvdG9jb2xUeXBlIDo6IChUcmFuc3BvcnQgaSwgVHJhbnNwb3J0IG8pID0+IEhlYWRlclByb3RvY29sIGkgbyAtPiBQcm90b2NvbFR5cGUgLT4gSU8gKCkKK3NldFByb3RvY29sVHlwZSBwIHR5cCA9IGRvCisgIHR5cDAgPC0gZ2V0UHJvdG9jb2xUeXBlIHAKKyAgaWYgdHlwID09IHR5cDAKKyAgICB0aGVuIHJldHVybiAoKQorICAgIGVsc2UgZG8KKyAgICAgIHRTZXRQcm90b2NvbCAodHJhbnMgcCkgdHlwCisgICAgICByZXNldFByb3RvY29sIHAKKworaW5zdGFuY2UgKFRyYW5zcG9ydCBpLCBUcmFuc3BvcnQgbykgPT4gUHJvdG9jb2wgKEhlYWRlclByb3RvY29sIGkgbykgd2hlcmUKKyAgcmVhZEJ5dGUgcCA9IHRSZWFkQWxsICh0cmFucyBwKSAxCisKKyAgcmVhZFZhbCBwIHRwID0gZG8KKyAgICBwcm90byA8LSBnZXRXcmFwcGVkIHAKKyAgICByZWFkVmFsIHByb3RvIHRwCisKKyAgcmVhZE1lc3NhZ2UgcCBmID0gZG8KKyAgICB0UmVzZXRQcm90b2NvbCAodHJhbnMgcCkKKyAgICByZXNldFByb3RvY29sIHAKKyAgICBwcm90byA8LSBnZXRXcmFwcGVkIHAKKyAgICByZWFkTWVzc2FnZSBwcm90byBmCisKKyAgd3JpdGVWYWwgcCB2ID0gZG8KKyAgICBwcm90byA8LSBnZXRXcmFwcGVkIHAKKyAgICB3cml0ZVZhbCBwcm90byB2CisKKyAgd3JpdGVNZXNzYWdlIHAgeCBmID0gZG8KKyAgICBwcm90byA8LSBnZXRXcmFwcGVkIHAKKyAgICB3cml0ZU1lc3NhZ2UgcHJvdG8geCBmCisKZGlmZiAtLWdpdCBhL2xpYi9ocy9zcmMvVGhyaWZ0L1Byb3RvY29sL0pTT04uaHMgYi9saWIvaHMvc3JjL1RocmlmdC9Qcm90b2NvbC9KU09OLmhzCmluZGV4IGYzNzhlYTIuLjgzOWVkZGMgMTAwNjQ0Ci0tLSBhL2xpYi9ocy9zcmMvVGhyaWZ0L1Byb3RvY29sL0pTT04uaHMKKysrIGIvbGliL2hzL3NyYy9UaHJpZnQvUHJvdG9jb2wvSlNPTi5ocwpAQCAtMjksMTAgKzI5LDEyIEBACiAgICAgKSB3aGVyZQogCiBpbXBvcnQgQ29udHJvbC5BcHBsaWNhdGl2ZQoraW1wb3J0IENvbnRyb2wuRXhjZXB0aW9uIChicmFja2V0KQogaW1wb3J0IENvbnRyb2wuTW9uYWQKIGltcG9ydCBEYXRhLkF0dG9wYXJzZWMuQnl0ZVN0cmluZyBhcyBQCiBpbXBvcnQgRGF0YS5BdHRvcGFyc2VjLkJ5dGVTdHJpbmcuQ2hhcjggYXMgUEMKIGltcG9ydCBEYXRhLkF0dG9wYXJzZWMuQnl0ZVN0cmluZy5MYXp5IGFzIExQCitpbXBvcnQgRGF0YS5CeXRlU3RyaW5nLkJhc2U2NC5MYXp5IGFzIEI2NEMKIGltcG9ydCBEYXRhLkJ5dGVTdHJpbmcuTGF6eS5CdWlsZGVyIGFzIEIKIGltcG9ydCBEYXRhLkJ5dGVTdHJpbmcuSW50ZXJuYWwgKGMydywgdzJjKQogaW1wb3J0IERhdGEuRnVuY3RvcgpAQCAtNDksNDQgKzUxLDU1IEBACiBpbXBvcnQgVGhyaWZ0LlR5cGVzCiAKIGltcG9ydCBxdWFsaWZpZWQgRGF0YS5CeXRlU3RyaW5nLkxhenkgYXMgTEJTCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuQnl0ZVN0cmluZy5MYXp5LkNoYXI4IGFzIExCU0MKIGltcG9ydCBxdWFsaWZpZWQgRGF0YS5UZXh0LkxhenkgYXMgTFQKIAotLS0gfCBUaGUgSlNPTiBQcm90b2NvbCBkYXRhIHVzZXMgdGhlIHN0YW5kYXJkICdUU2ltcGxlSlNPTlByb3RvY29sJy4gIERhdGEgaXMKKy0tIHwgVGhlIEpTT04gUHJvdG9jb2wgZGF0YSB1c2VzIHRoZSBzdGFuZGFyZCAnVEpTT05Qcm90b2NvbCcuICBEYXRhIGlzCiAtLSBlbmNvZGVkIGFzIGEgSlNPTiAnQnl0ZVN0cmluZycKIGRhdGEgSlNPTlByb3RvY29sIHQgPSBKU09OUHJvdG9jb2wgdAogICAgICAgICAgICAgICAgICAgICAgIC0tIF4gQ29uc3RydWN0IGEgJ0pTT05Qcm90b2NvbCcgd2l0aCBhICdUcmFuc3BvcnQnCitnZXRUcmFuc3BvcnQgOjogVHJhbnNwb3J0IHQgPT4gSlNPTlByb3RvY29sIHQgLT4gdAorZ2V0VHJhbnNwb3J0IChKU09OUHJvdG9jb2wgdCkgPSB0CiAKLWluc3RhbmNlIFByb3RvY29sIEpTT05Qcm90b2NvbCB3aGVyZQotICAgIGdldFRyYW5zcG9ydCAoSlNPTlByb3RvY29sIHQpID0gdAoraW5zdGFuY2UgVHJhbnNwb3J0IHQgPT4gUHJvdG9jb2wgKEpTT05Qcm90b2NvbCB0KSB3aGVyZQorICAgIHJlYWRCeXRlIHAgPSB0UmVhZEFsbCAoZ2V0VHJhbnNwb3J0IHApIDEKIAotICAgIHdyaXRlTWVzc2FnZUJlZ2luIChKU09OUHJvdG9jb2wgdCkgKHMsIHR5LCBzcSkgPSB0V3JpdGUgdCAkIHRvTGF6eUJ5dGVTdHJpbmcgJAotICAgICAgQi5jaGFyOCAnWycgPD4gYnVpbGRTaG93YWJsZSAoMSA6OiBJbnQzMikgPD4KLSAgICAgIEIuc3RyaW5nOCAiLFwiIiA8PiBlc2NhcGUgKGVuY29kZVV0ZjggcykgPD4gQi5jaGFyOCAnXCInIDw+Ci0gICAgICBCLmNoYXI4ICcsJyA8PiBidWlsZFNob3dhYmxlIChmcm9tRW51bSB0eSkgPD4KLSAgICAgIEIuY2hhcjggJywnIDw+IGJ1aWxkU2hvd2FibGUgc3EgPD4KLSAgICAgIEIuY2hhcjggJywnCi0gICAgd3JpdGVNZXNzYWdlRW5kIChKU09OUHJvdG9jb2wgdCkgPSB0V3JpdGUgdCAiXSIKLSAgICByZWFkTWVzc2FnZUJlZ2luIHAgPSBydW5QYXJzZXIgcCAkIHNraXBTcGFjZSAqPiBkbwotICAgICAgX3ZlciA6OiBJbnQzMiA8LSBsZXhlbWUgKFBDLmNoYXI4ICdbJykgKj4gbGV4ZW1lIChzaWduZWQgZGVjaW1hbCkKLSAgICAgIGJzIDwtIGxleGVtZSAoUEMuY2hhcjggJywnKSAqPiBsZXhlbWUgZXNjYXBlZFN0cmluZwotICAgICAgY2FzZSBkZWNvZGVVdGY4JyBicyBvZgotICAgICAgICBMZWZ0IF8gLT4gZmFpbCAicmVhZE1lc3NhZ2U6IGludmFsaWQgdGV4dCBlbmNvZGluZyIKLSAgICAgICAgUmlnaHQgc3RyIC0+IGRvCi0gICAgICAgICAgdHkgPC0gdG9FbnVtIDwkPiAobGV4ZW1lIChQQy5jaGFyOCAnLCcpICo+IGxleGVtZSAoc2lnbmVkIGRlY2ltYWwpKQotICAgICAgICAgIHNlcU51bSA8LSBsZXhlbWUgKFBDLmNoYXI4ICcsJykgKj4gbGV4ZW1lIChzaWduZWQgZGVjaW1hbCkKLSAgICAgICAgICBfIDwtIFBDLmNoYXI4ICcsJwotICAgICAgICAgIHJldHVybiAoc3RyLCB0eSwgc2VxTnVtKQotICAgIHJlYWRNZXNzYWdlRW5kIHAgPSB2b2lkICQgcnVuUGFyc2VyIHAgKFBDLmNoYXI4ICddJykKKyAgICB3cml0ZU1lc3NhZ2UgKEpTT05Qcm90b2NvbCB0KSAocywgdHksIHNxKSA9IGJyYWNrZXQgcmVhZE1lc3NhZ2VCZWdpbiByZWFkTWVzc2FnZUVuZCAuIGNvbnN0CisgICAgICB3aGVyZQorICAgICAgICByZWFkTWVzc2FnZUJlZ2luID0gdFdyaXRlIHQgJCB0b0xhenlCeXRlU3RyaW5nICQKKyAgICAgICAgICBCLmNoYXI4ICdbJyA8PiBidWlsZFNob3dhYmxlICgxIDo6IEludDMyKSA8PgorICAgICAgICAgIEIuc3RyaW5nOCAiLFwiIiA8PiBlc2NhcGUgKGVuY29kZVV0ZjggcykgPD4gQi5jaGFyOCAnXCInIDw+CisgICAgICAgICAgQi5jaGFyOCAnLCcgPD4gYnVpbGRTaG93YWJsZSAoZnJvbUVudW0gdHkpIDw+CisgICAgICAgICAgQi5jaGFyOCAnLCcgPD4gYnVpbGRTaG93YWJsZSBzcSA8PgorICAgICAgICAgIEIuY2hhcjggJywnCisgICAgICAgIHJlYWRNZXNzYWdlRW5kIF8gPSBkbworICAgICAgICAgIHRXcml0ZSB0ICJdIgorICAgICAgICAgIHRGbHVzaCB0CiAKKyAgICByZWFkTWVzc2FnZSBwID0gYnJhY2tldCByZWFkTWVzc2FnZUJlZ2luIHJlYWRNZXNzYWdlRW5kCisgICAgICB3aGVyZQorICAgICAgICByZWFkTWVzc2FnZUJlZ2luID0gcnVuUGFyc2VyIHAgJCBza2lwU3BhY2UgKj4gZG8KKyAgICAgICAgICBfdmVyIDo6IEludDMyIDwtIGxleGVtZSAoUEMuY2hhcjggJ1snKSAqPiBsZXhlbWUgKHNpZ25lZCBkZWNpbWFsKQorICAgICAgICAgIGJzIDwtIGxleGVtZSAoUEMuY2hhcjggJywnKSAqPiBsZXhlbWUgZXNjYXBlZFN0cmluZworICAgICAgICAgIGNhc2UgZGVjb2RlVXRmOCcgYnMgb2YKKyAgICAgICAgICAgIExlZnQgXyAtPiBmYWlsICJyZWFkTWVzc2FnZTogaW52YWxpZCB0ZXh0IGVuY29kaW5nIgorICAgICAgICAgICAgUmlnaHQgc3RyIC0+IGRvCisgICAgICAgICAgICAgIHR5IDwtIHRvRW51bSA8JD4gKGxleGVtZSAoUEMuY2hhcjggJywnKSAqPiBsZXhlbWUgKHNpZ25lZCBkZWNpbWFsKSkKKyAgICAgICAgICAgICAgc2VxTnVtIDwtIGxleGVtZSAoUEMuY2hhcjggJywnKSAqPiBsZXhlbWUgKHNpZ25lZCBkZWNpbWFsKQorICAgICAgICAgICAgICBfIDwtIFBDLmNoYXI4ICcsJworICAgICAgICAgICAgICByZXR1cm4gKHN0ciwgdHksIHNlcU51bSkKKyAgICAgICAgcmVhZE1lc3NhZ2VFbmQgXyA9IHZvaWQgJCBydW5QYXJzZXIgcCAoUEMuY2hhcjggJ10nKQorCisgICAgd3JpdGVWYWwgcCA9IHRXcml0ZSAoZ2V0VHJhbnNwb3J0IHApIC4gdG9MYXp5Qnl0ZVN0cmluZyAuIGJ1aWxkSlNPTlZhbHVlCisgICAgcmVhZFZhbCBwIHR5ID0gcnVuUGFyc2VyIHAgJCBza2lwU3BhY2UgKj4gcGFyc2VKU09OVmFsdWUgdHkKKworaW5zdGFuY2UgVHJhbnNwb3J0IHQgPT4gU3RhdGVsZXNzUHJvdG9jb2wgKEpTT05Qcm90b2NvbCB0KSB3aGVyZQogICAgIHNlcmlhbGl6ZVZhbCBfID0gdG9MYXp5Qnl0ZVN0cmluZyAuIGJ1aWxkSlNPTlZhbHVlCiAgICAgZGVzZXJpYWxpemVWYWwgXyB0eSBicyA9CiAgICAgICBjYXNlIExQLmVpdGhlclJlc3VsdCAkIExQLnBhcnNlIChwYXJzZUpTT05WYWx1ZSB0eSkgYnMgb2YKICAgICAgICAgTGVmdCBzIC0+IGVycm9yIHMKICAgICAgICAgUmlnaHQgdmFsIC0+IHZhbAogCi0gICAgcmVhZFZhbCBwIHR5ID0gcnVuUGFyc2VyIHAgJCBza2lwU3BhY2UgKj4gcGFyc2VKU09OVmFsdWUgdHkKLQotCiAtLSBXcml0aW5nIEZ1bmN0aW9ucwogCiBidWlsZEpTT05WYWx1ZSA6OiBUaHJpZnRWYWwgLT4gQnVpbGRlcgpAQCAtMTA1LDEzICsxMTgsMTQgQEAKICAgIGVsc2UgbWVtcHR5KSA8PgogICBCLmNoYXI4ICddJwogYnVpbGRKU09OVmFsdWUgKFRTZXQgdHkgZW50cmllcykgPSBidWlsZEpTT05WYWx1ZSAoVExpc3QgdHkgZW50cmllcykKLWJ1aWxkSlNPTlZhbHVlIChUQm9vbCBiKSA9IGlmIGIgdGhlbiBCLnN0cmluZzggInRydWUiIGVsc2UgQi5zdHJpbmc4ICJmYWxzZSIKK2J1aWxkSlNPTlZhbHVlIChUQm9vbCBiKSA9IGlmIGIgdGhlbiBCLmNoYXI4ICcxJyBlbHNlIEIuY2hhcjggJzAnCiBidWlsZEpTT05WYWx1ZSAoVEJ5dGUgYikgPSBidWlsZFNob3dhYmxlIGIKIGJ1aWxkSlNPTlZhbHVlIChUSTE2IGkpID0gYnVpbGRTaG93YWJsZSBpCiBidWlsZEpTT05WYWx1ZSAoVEkzMiBpKSA9IGJ1aWxkU2hvd2FibGUgaQogYnVpbGRKU09OVmFsdWUgKFRJNjQgaSkgPSBidWlsZFNob3dhYmxlIGkKIGJ1aWxkSlNPTlZhbHVlIChURG91YmxlIGQpID0gYnVpbGRTaG93YWJsZSBkCiBidWlsZEpTT05WYWx1ZSAoVFN0cmluZyBzKSA9IEIuY2hhcjggJ1wiJyA8PiBlc2NhcGUgcyA8PiBCLmNoYXI4ICdcIicKK2J1aWxkSlNPTlZhbHVlIChUQmluYXJ5IHMpID0gQi5jaGFyOCAnXCInIDw+IChCLmxhenlCeXRlU3RyaW5nIC4gQjY0Qy5lbmNvZGUgJCBzKSA8PiBCLmNoYXI4ICdcIicKIAogYnVpbGRKU09OU3RydWN0IDo6IE1hcC5IYXNoTWFwIEludDE2IChMVC5UZXh0LCBUaHJpZnRWYWwpIC0+IEJ1aWxkZXIKIGJ1aWxkSlNPTlN0cnVjdCA9IG1jb25jYXQgLiBpbnRlcnNwZXJzZSAoQi5jaGFyOCAnLCcpIC4gTWFwLmZvbGRyV2l0aEtleSBidWlsZEZpZWxkIFtdCkBAIC0xNDksMjIgKzE2MywyNSBAQAogICAgIGJldHdlZW4gJ3snICd9JyAocGFyc2VKU09OTWFwIGt0IHZ0KQogcGFyc2VKU09OVmFsdWUgKFRfTElTVCB0eSkgPSBmbWFwIChUTGlzdCB0eSkgJAogICBiZXR3ZWVuICdbJyAnXScgJCBkbwotICAgIGxlbiA8LSBsZXhlbWUgZXNjYXBlZFN0cmluZyAqPiBsZXhlbWUgKFBDLmNoYXI4ICcsJykgKj4KLSAgICAgICAgICAgbGV4ZW1lIGRlY2ltYWwgPCogbGV4ZW1lIChQQy5jaGFyOCAnLCcpCi0gICAgaWYgbGVuID4gMCB0aGVuIHBhcnNlSlNPTkxpc3QgdHkgZWxzZSByZXR1cm4gW10KKyAgICBsZW4gPC0gbGV4ZW1lIGVzY2FwZWRTdHJpbmcgKj4gbGV4ZW1lIChQQy5jaGFyOCAnLCcpICo+IGxleGVtZSBkZWNpbWFsCisgICAgaWYgbGVuID4gMAorICAgICAgdGhlbiBsZXhlbWUgKFBDLmNoYXI4ICcsJykgKj4gcGFyc2VKU09OTGlzdCB0eQorICAgICAgZWxzZSByZXR1cm4gW10KIHBhcnNlSlNPTlZhbHVlIChUX1NFVCB0eSkgPSBmbWFwIChUU2V0IHR5KSAkCiAgIGJldHdlZW4gJ1snICddJyAkIGRvCi0gICAgbGVuIDwtIGxleGVtZSBlc2NhcGVkU3RyaW5nICo+IGxleGVtZSAoUEMuY2hhcjggJywnKSAqPgotICAgICAgICAgICBsZXhlbWUgZGVjaW1hbCA8KiBsZXhlbWUgKFBDLmNoYXI4ICcsJykKLSAgICBpZiBsZW4gPiAwIHRoZW4gcGFyc2VKU09OTGlzdCB0eSBlbHNlIHJldHVybiBbXQorICAgIGxlbiA8LSBsZXhlbWUgZXNjYXBlZFN0cmluZyAqPiBsZXhlbWUgKFBDLmNoYXI4ICcsJykgKj4gbGV4ZW1lIGRlY2ltYWwKKyAgICBpZiBsZW4gPiAwCisgICAgICB0aGVuICBsZXhlbWUgKFBDLmNoYXI4ICcsJykgKj4gcGFyc2VKU09OTGlzdCB0eQorICAgICAgZWxzZSByZXR1cm4gW10KIHBhcnNlSlNPTlZhbHVlIFRfQk9PTCA9Ci0gIChUQm9vbCBUcnVlIDwkIHN0cmluZyAidHJ1ZSIpIDx8PiAoVEJvb2wgRmFsc2UgPCQgc3RyaW5nICJmYWxzZSIpCisgIChUQm9vbCBUcnVlIDwkIFBDLmNoYXI4ICcxJykgPHw+IChUQm9vbCBGYWxzZSA8JCBQQy5jaGFyOCAnMCcpCiBwYXJzZUpTT05WYWx1ZSBUX0JZVEUgPSBUQnl0ZSA8JD4gc2lnbmVkIGRlY2ltYWwKIHBhcnNlSlNPTlZhbHVlIFRfSTE2ID0gVEkxNiA8JD4gc2lnbmVkIGRlY2ltYWwKIHBhcnNlSlNPTlZhbHVlIFRfSTMyID0gVEkzMiA8JD4gc2lnbmVkIGRlY2ltYWwKIHBhcnNlSlNPTlZhbHVlIFRfSTY0ID0gVEk2NCA8JD4gc2lnbmVkIGRlY2ltYWwKIHBhcnNlSlNPTlZhbHVlIFRfRE9VQkxFID0gVERvdWJsZSA8JD4gZG91YmxlCiBwYXJzZUpTT05WYWx1ZSBUX1NUUklORyA9IFRTdHJpbmcgPCQ+IGVzY2FwZWRTdHJpbmcKK3BhcnNlSlNPTlZhbHVlIFRfQklOQVJZID0gVEJpbmFyeSA8JD4gYmFzZTY0U3RyaW5nCiBwYXJzZUpTT05WYWx1ZSBUX1NUT1AgPSBmYWlsICJwYXJzZUpTT05WYWx1ZTogY2Fubm90IHBhcnNlIHR5cGUgVF9TVE9QIgogcGFyc2VKU09OVmFsdWUgVF9WT0lEID0gZmFpbCAicGFyc2VKU09OVmFsdWU6IGNhbm5vdCBwYXJzZSB0eXBlIFRfVk9JRCIKIApAQCAtMTc5LDYgKzE5Niw3IEBACiAgICAgICAgICAgICAgICAgICAsIFRfSTY0CiAgICAgICAgICAgICAgICAgICAsIFRfRE9VQkxFCiAgICAgICAgICAgICAgICAgICAsIFRfU1RSSU5HCisgICAgICAgICAgICAgICAgICAsIFRfQklOQVJZCiAgICAgICAgICAgICAgICAgICBdCiAgIHdoZXJlCiAgICAgc2tpcEJldHdlZW4gOjogQ2hhciAtPiBDaGFyIC0+IFBhcnNlciAoKQpAQCAtMjAwLDkgKzIxOCwxMyBAQAogCiBwYXJzZUpTT05NYXAgOjogVGhyaWZ0VHlwZSAtPiBUaHJpZnRUeXBlIC0+IFBhcnNlciBbKFRocmlmdFZhbCwgVGhyaWZ0VmFsKV0KIHBhcnNlSlNPTk1hcCBrdCB2dCA9Ci0gICgoLCkgPCQ+IGxleGVtZSAoUEMuY2hhcjggJyInICo+IHBhcnNlSlNPTlZhbHVlIGt0IDwqIFBDLmNoYXI4ICciJykgPCo+CisgICgoLCkgPCQ+IGxleGVtZSAocGFyc2VKU09OS2V5IGt0KSA8Kj4KICAgIChsZXhlbWUgKFBDLmNoYXI4ICc6JykgKj4gbGV4ZW1lIChwYXJzZUpTT05WYWx1ZSB2dCkpKSBgc2VwQnlgCiAgIGxleGVtZSAoUEMuY2hhcjggJywnKQorICB3aGVyZQorICAgIHBhcnNlSlNPTktleSBUX1NUUklORyA9IHBhcnNlSlNPTlZhbHVlIFRfU1RSSU5HCisgICAgcGFyc2VKU09OS2V5IFRfQklOQVJZID0gcGFyc2VKU09OVmFsdWUgVF9CSU5BUlkKKyAgICBwYXJzZUpTT05LZXkga3QgPSBQQy5jaGFyOCAnIicgKj4gcGFyc2VKU09OVmFsdWUga3QgPCogUEMuY2hhcjggJyInCiAKIHBhcnNlSlNPTkxpc3QgOjogVGhyaWZ0VHlwZSAtPiBQYXJzZXIgW1RocmlmdFZhbF0KIHBhcnNlSlNPTkxpc3QgdHkgPSBsZXhlbWUgKHBhcnNlSlNPTlZhbHVlIHR5KSBgc2VwQnlgIGxleGVtZSAoUEMuY2hhcjggJywnKQpAQCAtMjEyLDYgKzIzNCwyMCBAQAogICAgICAgICAgICAgICAgIChMQlMucGFjayA8JD4gUC5tYW55JyAoZXNjYXBlZENoYXIgPHw+IG5vdENoYXI4ICciJykpIDwqCiAgICAgICAgICAgICAgICAgUEMuY2hhcjggJyInCiAKK2Jhc2U2NFN0cmluZyA6OiBQYXJzZXIgTEJTLkJ5dGVTdHJpbmcKK2Jhc2U2NFN0cmluZyA9IFBDLmNoYXI4ICciJyAqPgorICAgICAgICAgICAgICAgKGRlY29kZUJhc2U2NCAuIExCU0MucGFjayA8JD4gUC5tYW55JyAoUEMubm90Q2hhciAnIicpKSA8KgorICAgICAgICAgICAgICAgUEMuY2hhcjggJyInCisgICAgICAgICAgICAgICB3aGVyZQorICAgICAgICAgICAgICAgICBkZWNvZGVCYXNlNjQgYiA9CisgICAgICAgICAgICAgICAgICAgbGV0IHBhZGRlZCA9IGNhc2UgKExCUy5sZW5ndGggYikgYG1vZGAgNCBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgLT4gTEJTLmFwcGVuZCBiICI9PSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzIC0+IExCUy5hcHBlbmQgYiAiPSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfIC0+IGIgaW4KKyAgICAgICAgICAgICAgICAgICBjYXNlIEI2NEMuZGVjb2RlIHBhZGRlZCBvZgorICAgICAgICAgICAgICAgICAgICAgUmlnaHQgcyAtPiBzCisgICAgICAgICAgICAgICAgICAgICBMZWZ0IHggLT4gZXJyb3IgeAorCiBlc2NhcGVkQ2hhciA6OiBQYXJzZXIgV29yZDgKIGVzY2FwZWRDaGFyID0gUEMuY2hhcjggJ1xcJyAqPiAoYzJ3IDwkPiBjaG9pY2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyAnXFNPSCcgPCQgUC5zdHJpbmcgInUwMDAxIgpAQCAtMzIxLDUgKzM1Nyw2IEBACiAgIFRfSTY0ICAgICAgLT4gImk2NCIKICAgVF9ET1VCTEUgICAtPiAiZGJsIgogICBUX1NUUklORyAgIC0+ICJzdHIiCisgIFRfQklOQVJZICAgLT4gInN0ciIKICAgXyAtPiBlcnJvciAiVW5yZWNvZ25pemVkIFR5cGUiCiAKZGlmZiAtLWdpdCBhL2xpYi9ocy9zcmMvVGhyaWZ0L1NlcnZlci5ocyBiL2xpYi9ocy9zcmMvVGhyaWZ0L1NlcnZlci5ocwppbmRleCBlZDc0Y2ViLi41NDNmMzM4IDEwMDY0NAotLS0gYS9saWIvaHMvc3JjL1RocmlmdC9TZXJ2ZXIuaHMKKysrIGIvbGliL2hzL3NyYy9UaHJpZnQvU2VydmVyLmhzCkBAIC0zOCwxMCArMzgsMTAgQEAKIAogLS0gfCBBIHRocmVhZGVkIHNldmVyIHRoYXQgaXMgY2FwYWJsZSBvZiB1c2luZyBhbnkgVHJhbnNwb3J0IG9yIFByb3RvY29sCiAtLSBpbnN0YW5jZXMuCi1ydW5UaHJlYWRlZFNlcnZlciA6OiAoVHJhbnNwb3J0IHQsIFByb3RvY29sIGksIFByb3RvY29sIG8pCi0gICAgICAgICAgICAgICAgICA9PiAoU29ja2V0IC0+IElPIChpIHQsIG8gdCkpCitydW5UaHJlYWRlZFNlcnZlciA6OiAoUHJvdG9jb2wgaSwgUHJvdG9jb2wgbykKKyAgICAgICAgICAgICAgICAgID0+IChTb2NrZXQgLT4gSU8gKGksIG8pKQogICAgICAgICAgICAgICAgICAgLT4gaAotICAgICAgICAgICAgICAgICAgLT4gKGggLT4gKGkgdCwgbyB0KSAtPiBJTyBCb29sKQorICAgICAgICAgICAgICAgICAgLT4gKGggLT4gKGksIG8pIC0+IElPIEJvb2wpCiAgICAgICAgICAgICAgICAgICAtPiBQb3J0SUQKICAgICAgICAgICAgICAgICAgIC0+IElPIGEKIHJ1blRocmVhZGVkU2VydmVyIGFjY2VwdGVyIGhhbmQgcHJvY18gcG9ydCA9IGRvCmRpZmYgLS1naXQgYS9saWIvaHMvc3JjL1RocmlmdC9UcmFuc3BvcnQvSGFuZGxlLmhzIGIvbGliL2hzL3NyYy9UaHJpZnQvVHJhbnNwb3J0L0hhbmRsZS5ocwppbmRleCBiN2QxNmU0Li5mZjYyOTViIDEwMDY0NAotLS0gYS9saWIvaHMvc3JjL1RocmlmdC9UcmFuc3BvcnQvSGFuZGxlLmhzCisrKyBiL2xpYi9ocy9zcmMvVGhyaWZ0L1RyYW5zcG9ydC9IYW5kbGUuaHMKQEAgLTQ0LDcgKzQ0LDEzIEBACiBpbnN0YW5jZSBUcmFuc3BvcnQgSGFuZGxlIHdoZXJlCiAgICAgdElzT3BlbiA9IGhJc09wZW4KICAgICB0Q2xvc2UgPSBoQ2xvc2UKLSAgICB0UmVhZCBoIG4gPSBMQlMuaEdldCBoIG4gYENvbnRyb2wuRXhjZXB0aW9uLmNhdGNoYCBoYW5kbGVFT0YgbWVtcHR5CisgICAgdFJlYWQgaCBuID0gcmVhZCBgQ29udHJvbC5FeGNlcHRpb24uY2F0Y2hgIGhhbmRsZUVPRiBtZW1wdHkKKyAgICAgIHdoZXJlCisgICAgICAgIHJlYWQgPSBkbworICAgICAgICAgIGhMb29rQWhlYWQgaAorICAgICAgICAgIExCUy5oR2V0Tm9uQmxvY2tpbmcgaCBuCisgICAgdFJlYWRBbGwgXyAwID0gcmV0dXJuIG1lbXB0eQorICAgIHRSZWFkQWxsIGggbiA9IExCUy5oR2V0IGggbiBgQ29udHJvbC5FeGNlcHRpb24uY2F0Y2hgIHRocm93VHJhbnNwb3J0RXhuCiAgICAgdFBlZWsgaCA9IChKdXN0IC4gYzJ3IDwkPiBoTG9va0FoZWFkIGgpIGBDb250cm9sLkV4Y2VwdGlvbi5jYXRjaGAgaGFuZGxlRU9GIE5vdGhpbmcKICAgICB0V3JpdGUgPSBMQlMuaFB1dAogICAgIHRGbHVzaCA9IGhGbHVzaApAQCAtNjEsOCArNjcsMTIgQEAKIGluc3RhbmNlIEhhbmRsZVNvdXJjZSAoSG9zdE5hbWUsIFBvcnRJRCkgd2hlcmUKICAgICBoT3BlbiA9IHVuY3VycnkgY29ubmVjdFRvCiAKK3Rocm93VHJhbnNwb3J0RXhuIDo6IElPRXJyb3IgLT4gSU8gYQordGhyb3dUcmFuc3BvcnRFeG4gZSA9IGlmIGlzRU9GRXJyb3IgZQorICAgIHRoZW4gdGhyb3cgJCBUcmFuc3BvcnRFeG4gIkNhbm5vdCByZWFkLiBSZW1vdGUgc2lkZSBoYXMgY2xvc2VkLiIgVEVfVU5LTk9XTgorICAgIGVsc2UgdGhyb3cgJCBUcmFuc3BvcnRFeG4gIkhhbmRsZSB0UmVhZEFsbDogQ291bGQgbm90IHJlYWQiIFRFX1VOS05PV04KIAogaGFuZGxlRU9GIDo6IGEgLT4gSU9FcnJvciAtPiBJTyBhCiBoYW5kbGVFT0YgYSBlID0gaWYgaXNFT0ZFcnJvciBlCiAgICAgdGhlbiByZXR1cm4gYQotICAgIGVsc2UgdGhyb3cgJCBUcmFuc3BvcnRFeG4gIlRDaGFubmVsVHJhbnNwb3J0OiBDb3VsZCBub3QgcmVhZCIgVEVfVU5LTk9XTgorICAgIGVsc2UgdGhyb3cgJCBUcmFuc3BvcnRFeG4gIkhhbmRsZTogQ291bGQgbm90IHJlYWQiIFRFX1VOS05PV04KZGlmZiAtLWdpdCBhL2xpYi9ocy9zcmMvVGhyaWZ0L1RyYW5zcG9ydC9IZWFkZXIuaHMgYi9saWIvaHMvc3JjL1RocmlmdC9UcmFuc3BvcnQvSGVhZGVyLmhzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkYWNhZDIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaHMvc3JjL1RocmlmdC9UcmFuc3BvcnQvSGVhZGVyLmhzCkBAIC0wLDAgKzEsMzU0IEBACistLQorLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLS0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy0tIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCistLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy0tIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy0tICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy0tIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLS0KKy0tICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCistLQorLS0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLS0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy0tICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLS0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy0tIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy0tIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0KKworbW9kdWxlIFRocmlmdC5UcmFuc3BvcnQuSGVhZGVyCisgICggbW9kdWxlIFRocmlmdC5UcmFuc3BvcnQKKyAgLCBIZWFkZXJUcmFuc3BvcnQoLi4pCisgICwgb3BlbkhlYWRlclRyYW5zcG9ydAorICAsIFByb3RvY29sVHlwZSguLikKKyAgLCBUcmFuc2Zvcm1UeXBlKC4uKQorICAsIENsaWVudFR5cGUoLi4pCisgICwgdFJlc2V0UHJvdG9jb2wKKyAgLCB0U2V0UHJvdG9jb2wKKyAgKSB3aGVyZQorCitpbXBvcnQgVGhyaWZ0LlRyYW5zcG9ydAoraW1wb3J0IFRocmlmdC5Qcm90b2NvbC5Db21wYWN0CitpbXBvcnQgQ29udHJvbC5BcHBsaWNhdGl2ZQoraW1wb3J0IENvbnRyb2wuRXhjZXB0aW9uICggdGhyb3cgKQoraW1wb3J0IENvbnRyb2wuTW9uYWQKK2ltcG9ydCBEYXRhLkJpdHMKK2ltcG9ydCBEYXRhLklPUmVmCitpbXBvcnQgRGF0YS5JbnQKK2ltcG9ydCBEYXRhLk1vbm9pZAoraW1wb3J0IERhdGEuV29yZAorCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuQXR0b3BhcnNlYy5CeXRlU3RyaW5nIGFzIFAKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5CaW5hcnkgYXMgQmluYXJ5CitpbXBvcnQgcXVhbGlmaWVkIERhdGEuQnl0ZVN0cmluZyBhcyBCUworaW1wb3J0IHF1YWxpZmllZCBEYXRhLkJ5dGVTdHJpbmcuQ2hhcjggYXMgQworaW1wb3J0IHF1YWxpZmllZCBEYXRhLkJ5dGVTdHJpbmcuTGF6eSBhcyBMQlMKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5CeXRlU3RyaW5nLkxhenkuQnVpbGRlciBhcyBCCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuTWFwIGFzIE1hcAorCitkYXRhIFByb3RvY29sVHlwZSA9IFRCaW5hcnkgfCBUQ29tcGFjdCB8IFRKU09OIGRlcml2aW5nIChFbnVtLCBFcSkKK2RhdGEgQ2xpZW50VHlwZSA9IEhlYWRlckNsaWVudCB8IEZyYW1lZCB8IFVuZnJhbWVkIGRlcml2aW5nIChFbnVtLCBFcSkKKworaW5mb0lkS2V5VmFsdWUgPSAxCisKK3R5cGUgSGVhZGVycyA9IE1hcC5NYXAgU3RyaW5nIFN0cmluZworCitkYXRhIFRyYW5zZm9ybVR5cGUgPSBabGliVHJhbnNmb3JtIGRlcml2aW5nIChFbnVtLCBFcSkKKworZnJvbVRyYW5zcG9ydFR5cGUgOjogVHJhbnNmb3JtVHlwZSAtPiBJbnQxNgorZnJvbVRyYW5zcG9ydFR5cGUgWmxpYlRyYW5zZm9ybSA9IDEKKwordG9UcmFuc3BvcnRUeXBlIDo6IEludDE2IC0+IFRyYW5zZm9ybVR5cGUKK3RvVHJhbnNwb3J0VHlwZSAxID0gWmxpYlRyYW5zZm9ybQordG9UcmFuc3BvcnRUeXBlIF8gPSAgdGhyb3cgJCBUcmFuc3BvcnRFeG4gIkhlYWRlclRyYW5zcG9ydDogVW5rbm93biB0cmFuc2Zvcm0gSUQiIFRFX1VOS05PV04KKworZGF0YSBIZWFkZXJUcmFuc3BvcnQgaSBvID0gKFRyYW5zcG9ydCBpLCBUcmFuc3BvcnQgbykgPT4gSGVhZGVyVHJhbnNwb3J0CisgICAgeyByZWFkQnVmZmVyIDo6IElPUmVmIExCUy5CeXRlU3RyaW5nCisgICAgLCB3cml0ZUJ1ZmZlciA6OiBJT1JlZiBCLkJ1aWxkZXIKKyAgICAsIGluVHJhbnMgOjogaQorICAgICwgb3V0VHJhbnMgOjogbworICAgICwgY2xpZW50VHlwZSA6OiBJT1JlZiBDbGllbnRUeXBlCisgICAgLCBwcm90b2NvbFR5cGUgOjogSU9SZWYgUHJvdG9jb2xUeXBlCisgICAgLCBoZWFkZXJzIDo6IElPUmVmIFsoU3RyaW5nLCBTdHJpbmcpXQorICAgICwgd3JpdGVIZWFkZXJzIDo6IEhlYWRlcnMKKyAgICAsIHRyYW5zZm9ybXMgOjogSU9SZWYgW1RyYW5zZm9ybVR5cGVdCisgICAgLCB3cml0ZVRyYW5zZm9ybXMgOjogW1RyYW5zZm9ybVR5cGVdCisgICAgfQorCitvcGVuSGVhZGVyVHJhbnNwb3J0IDo6IChUcmFuc3BvcnQgaSwgVHJhbnNwb3J0IG8pID0+IGkgLT4gbyAtPiBJTyAoSGVhZGVyVHJhbnNwb3J0IGkgbykKK29wZW5IZWFkZXJUcmFuc3BvcnQgaSBvID0gZG8KKyAgcGlkIDwtIG5ld0lPUmVmIFRDb21wYWN0CisgIHJCdWYgPC0gbmV3SU9SZWYgTEJTLmVtcHR5CisgIHdCdWYgPC0gbmV3SU9SZWYgbWVtcHR5CisgIGNUeXBlIDwtIG5ld0lPUmVmIEhlYWRlckNsaWVudAorICBoIDwtIG5ld0lPUmVmIFtdCisgIHRyYW5zIDwtIG5ld0lPUmVmIFtdCisgIHJldHVybiBIZWFkZXJUcmFuc3BvcnQKKyAgICAgIHsgcmVhZEJ1ZmZlciA9IHJCdWYKKyAgICAgICwgd3JpdGVCdWZmZXIgPSB3QnVmCisgICAgICAsIGluVHJhbnMgPSBpCisgICAgICAsIG91dFRyYW5zID0gbworICAgICAgLCBjbGllbnRUeXBlID0gY1R5cGUKKyAgICAgICwgcHJvdG9jb2xUeXBlID0gcGlkCisgICAgICAsIGhlYWRlcnMgPSBoCisgICAgICAsIHdyaXRlSGVhZGVycyA9IE1hcC5lbXB0eQorICAgICAgLCB0cmFuc2Zvcm1zID0gdHJhbnMKKyAgICAgICwgd3JpdGVUcmFuc2Zvcm1zID0gW10KKyAgICAgIH0KKworaXNGcmFtZWQgdCA9ICgvPSBVbmZyYW1lZCkgPCQ+IHJlYWRJT1JlZiAoY2xpZW50VHlwZSB0KQorCityZWFkRnJhbWUgOjogKFRyYW5zcG9ydCBpLCBUcmFuc3BvcnQgbykgPT4gSGVhZGVyVHJhbnNwb3J0IGkgbyAtPiBJTyBCb29sCityZWFkRnJhbWUgdCA9IGRvCisgIGxldCBpbnB1dCA9IGluVHJhbnMgdAorICBsZXQgckJ1ZiA9IHJlYWRCdWZmZXIgdAorICBsZXQgY1R5cGUgPSBjbGllbnRUeXBlIHQKKyAgbHN6IDwtIHRSZWFkIGlucHV0IDQKKyAgbGV0IHN6ID0gTEJTLnRvU3RyaWN0IGxzegorICBjYXNlIFAucGFyc2VPbmx5IFAuZW5kT2ZJbnB1dCBzeiBvZgorICAgIFJpZ2h0IF8gLT4gZG8gcmV0dXJuIEZhbHNlCisgICAgTGVmdCBfIC0+IGRvCisgICAgICBjYXNlIHBhcnNlQmluYXJ5TWFnaWMgc3ogb2YKKyAgICAgICAgUmlnaHQgXyAtPiBkbworICAgICAgICAgIHdyaXRlSU9SZWYgckJ1ZiAkIGxzegorICAgICAgICAgIHdyaXRlSU9SZWYgY1R5cGUgVW5mcmFtZWQKKyAgICAgICAgICB3cml0ZUlPUmVmIChwcm90b2NvbFR5cGUgdCkgVEJpbmFyeQorICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIExlZnQgXyAtPiBkbworICAgICAgICAgIGNhc2UgcGFyc2VDb21wYWN0TWFnaWMgc3ogb2YKKyAgICAgICAgICAgIFJpZ2h0IF8gLT4gZG8KKyAgICAgICAgICAgICAgd3JpdGVJT1JlZiByQnVmICQgbHN6CisgICAgICAgICAgICAgIHdyaXRlSU9SZWYgY1R5cGUgVW5mcmFtZWQKKyAgICAgICAgICAgICAgd3JpdGVJT1JlZiAocHJvdG9jb2xUeXBlIHQpIFRDb21wYWN0CisgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgICAgICBMZWZ0IF8gLT4gZG8KKyAgICAgICAgICAgICAgbGV0IGxlbiA9IEJpbmFyeS5kZWNvZGUgbHN6IDo6IEludDMyCisgICAgICAgICAgICAgIGxidWYgPC0gdFJlYWRBbGwgaW5wdXQgJCBmcm9tSW50ZWdyYWwgbGVuCisgICAgICAgICAgICAgIGxldCBidWYgPSBMQlMudG9TdHJpY3QgbGJ1ZgorICAgICAgICAgICAgICBjYXNlIHBhcnNlQmluYXJ5TWFnaWMgYnVmIG9mCisgICAgICAgICAgICAgICAgUmlnaHQgXyAtPiBkbworICAgICAgICAgICAgICAgICAgd3JpdGVJT1JlZiBjVHlwZSBGcmFtZWQKKyAgICAgICAgICAgICAgICAgIHdyaXRlSU9SZWYgKHByb3RvY29sVHlwZSB0KSBUQmluYXJ5CisgICAgICAgICAgICAgICAgICB3cml0ZUlPUmVmIHJCdWYgbGJ1ZgorICAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgICAgICAgICBMZWZ0IF8gLT4gZG8KKyAgICAgICAgICAgICAgICAgIGNhc2UgcGFyc2VDb21wYWN0TWFnaWMgYnVmIG9mCisgICAgICAgICAgICAgICAgICAgIFJpZ2h0IF8gLT4gZG8KKyAgICAgICAgICAgICAgICAgICAgICB3cml0ZUlPUmVmIGNUeXBlIEZyYW1lZAorICAgICAgICAgICAgICAgICAgICAgIHdyaXRlSU9SZWYgKHByb3RvY29sVHlwZSB0KSBUQ29tcGFjdAorICAgICAgICAgICAgICAgICAgICAgIHdyaXRlSU9SZWYgckJ1ZiBsYnVmCisgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgICAgICAgICAgICAgTGVmdCBfIC0+IGRvCisgICAgICAgICAgICAgICAgICAgICAgY2FzZSBwYXJzZUhlYWRlck1hZ2ljIGJ1ZiBvZgorICAgICAgICAgICAgICAgICAgICAgICAgUmlnaHQgZmxhZ3MgLT4gZG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IChmbGFncywgc2VxTnVtLCBoZWFkZXIsIGJvZHkpID0gZXh0cmFjdEhlYWRlciBidWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVJT1JlZiBjVHlwZSBIZWFkZXJDbGllbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlSGVhZGVyIHQgaGVhZGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQgPC0gdW50cmFuc2Zvcm0gdCBib2R5CisgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlSU9SZWYgckJ1ZiAkIExCUy5mcm9tU3RyaWN0ICQgcGF5bG9hZAorICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICAgICAgICAgICAgICAgICAgTGVmdCBfIC0+CisgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93ICQgVHJhbnNwb3J0RXhuICJIZWFkZXJUcmFuc3BvcnQ6IHVua29ud24gY2xpZW50IHR5cGUiIFRFX1VOS05PV04KKworcGFyc2VCaW5hcnlNYWdpYyA9IFAucGFyc2VPbmx5ICQgUC53b3JkOCAweDgwICo+IFAud29yZDggMHgwMSAqPiBQLndvcmQ4IDB4MDAgKj4gUC5hbnlXb3JkOAorcGFyc2VDb21wYWN0TWFnaWMgPSBQLnBhcnNlT25seSAkIFAud29yZDggMHg4MiAqPiBQLnNhdGlzZnkgKFxiIC0+IGIgLiYuIDB4MWYgPT0gMHgwMSkKK3BhcnNlSGVhZGVyTWFnaWMgPSBQLnBhcnNlT25seSAkIFAud29yZDggMHgwZiAqPiBQLndvcmQ4IDB4ZmYgKj4gKFAuY291bnQgMiBQLmFueVdvcmQ4KQorCitwYXJzZUkzMiA6OiBQLlBhcnNlciBJbnQzMgorcGFyc2VJMzIgPSBCaW5hcnkuZGVjb2RlIC4gTEJTLmZyb21TdHJpY3QgPCQ+IFAudGFrZSA0CitwYXJzZUkxNiA6OiBQLlBhcnNlciBJbnQxNgorcGFyc2VJMTYgPSBCaW5hcnkuZGVjb2RlIC4gTEJTLmZyb21TdHJpY3QgPCQ+IFAudGFrZSAyCisKK2V4dHJhY3RIZWFkZXIgOjogQlMuQnl0ZVN0cmluZyAtPiAoSW50MTYsIEludDMyLCBCUy5CeXRlU3RyaW5nLCBCUy5CeXRlU3RyaW5nKQorZXh0cmFjdEhlYWRlciBicyA9CisgIGNhc2UgUC5wYXJzZSBleHRyYWN0SGVhZGVyXyBicyBvZgorICAgIFAuRG9uZSByZW1haW4gKGZsYWdzLCBzZXFOdW0sIGhlYWRlcikgLT4gKGZsYWdzLCBzZXFOdW0sIGhlYWRlciwgcmVtYWluKQorICAgIF8gLT4gdGhyb3cgJCBUcmFuc3BvcnRFeG4gIkhlYWRlclRyYW5zcG9ydDogSW52YWxpZCBoZWFkZXIiIFRFX1VOS05PV04KKyAgd2hlcmUKKyAgICBleHRyYWN0SGVhZGVyXyA9IGRvCisgICAgICBtYWdpYyA8LSBQLndvcmQ4IDB4MGYgKj4gUC53b3JkOCAweGZmCisgICAgICBmbGFncyA8LSBwYXJzZUkxNgorICAgICAgc2VxTnVtIDwtIHBhcnNlSTMyCisgICAgICAoaGVhZGVyU2l6ZSA6OiBJbnQpIDwtICgqIDQpIC4gZnJvbUludGVncmFsIDwkPiBwYXJzZUkxNgorICAgICAgaGVhZGVyIDwtIFAudGFrZSBoZWFkZXJTaXplCisgICAgICByZXR1cm4gKGZsYWdzLCBzZXFOdW0sIGhlYWRlcikKKworaGFuZGxlSGVhZGVyIHQgaGVhZGVyID0KKyAgY2FzZSBQLnBhcnNlT25seSBwYXJzZUhlYWRlciBoZWFkZXIgb2YKKyAgICBSaWdodCAocFR5cGUsIHRyYW5zLCBpbmZvKSAtPiBkbworICAgICAgd3JpdGVJT1JlZiAocHJvdG9jb2xUeXBlIHQpIHBUeXBlCisgICAgICB3cml0ZUlPUmVmICh0cmFuc2Zvcm1zIHQpIHRyYW5zCisgICAgICB3cml0ZUlPUmVmIChoZWFkZXJzIHQpIGluZm8KKyAgICBfIC0+IHRocm93ICQgVHJhbnNwb3J0RXhuICJIZWFkZXJUcmFuc3BvcnQ6IEludmFsaWQgaGVhZGVyIiBURV9VTktOT1dOCisKKworaXcxNiA6OiBJbnQxNiAtPiBXb3JkMTYKK2l3MTYgPSBmcm9tSW50ZWdyYWwKK2l3MzIgOjogSW50MzIgLT4gV29yZDMyCitpdzMyID0gZnJvbUludGVncmFsCit3aTE2IDo6IFdvcmQxNiAtPiBJbnQxNgord2kxNiA9IGZyb21JbnRlZ3JhbAord2kzMiA6OiBXb3JkMzIgLT4gSW50MzIKK3dpMzIgPSBmcm9tSW50ZWdyYWwKKworcGFyc2VIZWFkZXIgOjogUC5QYXJzZXIgKFByb3RvY29sVHlwZSwgW1RyYW5zZm9ybVR5cGVdLCBbKFN0cmluZywgU3RyaW5nKV0pCitwYXJzZUhlYWRlciA9IGRvCisgIHByb3RvY29sVHlwZSA8LSB0b1Byb3RvY29sVHlwZSA8JD4gcGFyc2VWYXJpbnQgd2kxNgorICBudW1UcmFucyA8LSBmcm9tSW50ZWdyYWwgPCQ+IHBhcnNlVmFyaW50IHdpMTYKKyAgdHJhbnMgPC0gcmVwbGljYXRlTSBudW1UcmFucyBwYXJzZVRyYW5zZm9ybQorICBpbmZvIDwtIHBhcnNlSW5mbworICByZXR1cm4gKHByb3RvY29sVHlwZSwgdHJhbnMsIGluZm8pCisKK3RvUHJvdG9jb2xUeXBlIDo6IEludDE2IC0+IFByb3RvY29sVHlwZQordG9Qcm90b2NvbFR5cGUgMCA9IFRCaW5hcnkKK3RvUHJvdG9jb2xUeXBlIDEgPSBUSlNPTgordG9Qcm90b2NvbFR5cGUgMiA9IFRDb21wYWN0CisKK2Zyb21Qcm90b2NvbFR5cGUgOjogUHJvdG9jb2xUeXBlIC0+IEludDE2Citmcm9tUHJvdG9jb2xUeXBlIFRCaW5hcnkgPSAwCitmcm9tUHJvdG9jb2xUeXBlIFRKU09OID0gMQorZnJvbVByb3RvY29sVHlwZSBUQ29tcGFjdCA9IDIKKworcGFyc2VUcmFuc2Zvcm0gOjogUC5QYXJzZXIgVHJhbnNmb3JtVHlwZQorcGFyc2VUcmFuc2Zvcm0gPSB0b1RyYW5zcG9ydFR5cGUgPCQ+IHBhcnNlVmFyaW50IHdpMTYKKworcGFyc2VJbmZvIDo6IFAuUGFyc2VyIFsoU3RyaW5nLCBTdHJpbmcpXQorcGFyc2VJbmZvID0gZG8KKyAgbiA8LSBQLmVpdGhlclAgUC5lbmRPZklucHV0IChwYXJzZVZhcmludCB3aTMyKQorICBjYXNlIG4gb2YKKyAgICBMZWZ0IF8gLT4gcmV0dXJuIFtdCisgICAgUmlnaHQgbjAgLT4KKyAgICAgIHJlcGxpY2F0ZU0gKGZyb21JbnRlZ3JhbCBuMCkgJCBkbworICAgICAgICBrbGVuIDwtIHBhcnNlVmFyaW50IHdpMTYKKyAgICAgICAgayA8LSBQLnRha2UgJCBmcm9tSW50ZWdyYWwga2xlbgorICAgICAgICB2bGVuIDwtIHBhcnNlVmFyaW50IHdpMTYKKyAgICAgICAgdiA8LSBQLnRha2UgJCBmcm9tSW50ZWdyYWwgdmxlbgorICAgICAgICByZXR1cm4gKEMudW5wYWNrIGssIEMudW5wYWNrIHYpCisKK3BhcnNlU3RyaW5nIDo6IFAuUGFyc2VyIEJTLkJ5dGVTdHJpbmcKK3BhcnNlU3RyaW5nID0gcGFyc2VWYXJpbnQgd2kzMiA+Pj0gKFAudGFrZSAuIGZyb21JbnRlZ3JhbCkKKworYnVpbGRIZWFkZXIgOjogSGVhZGVyVHJhbnNwb3J0IGkgbyAtPiBJTyBCLkJ1aWxkZXIKK2J1aWxkSGVhZGVyIHQgPSBkbworICBwVHlwZSA8LSByZWFkSU9SZWYgJCBwcm90b2NvbFR5cGUgdAorICBsZXQgcElkID0gYnVpbGRWYXJpbnQgJCBpdzE2ICQgZnJvbVByb3RvY29sVHlwZSBwVHlwZQorICBsZXQgaGVhZGVyQ29udGVudCA9IHBJZCA8PiAoYnVpbGRUcmFuc2Zvcm1zIHQpIDw+IChidWlsZEluZm8gdCkKKyAgbGV0IGxlbiA9IGZyb21JbnRlZ3JhbCAkIExCUy5sZW5ndGggJCBCLnRvTGF6eUJ5dGVTdHJpbmcgaGVhZGVyQ29udGVudAorICAtLSBUT0RPOiBsZW5ndGggbGltaXQgY2hlY2sKKyAgbGV0IHBhZGRpbmcgPSBtY29uY2F0ICQgcmVwbGljYXRlIChtb2QgbGVuIDQpICQgQi53b3JkOCAwCisgIGxldCBjb2RlZExlbiA9IEIuaW50MTZCRSAoZnJvbUludGVncmFsICQgKHF1b3QgKGxlbiAtIDEpIDQpICsgMSkKKyAgbGV0IGZsYWdzID0gMAorICBsZXQgc2VxTnVtID0gMAorICByZXR1cm4gJCBCLmludDE2QkUgMHgwZmZmIDw+IEIuaW50MTZCRSBmbGFncyA8PiBCLmludDMyQkUgc2VxTnVtIDw+IGNvZGVkTGVuIDw+IGhlYWRlckNvbnRlbnQgPD4gcGFkZGluZworCitidWlsZFRyYW5zZm9ybXMgOjogSGVhZGVyVHJhbnNwb3J0IGkgbyAtPiBCLkJ1aWxkZXIKKy0tIFRPRE86IGNoZWNrIGxlbmd0aCBsaW1pdAorYnVpbGRUcmFuc2Zvcm1zIHQgPQorICBsZXQgdHJhbnMgPSB3cml0ZVRyYW5zZm9ybXMgdCBpbgorICAoYnVpbGRWYXJpbnQgJCBpdzE2ICQgZnJvbUludGVncmFsICQgbGVuZ3RoIHRyYW5zKSA8PgorICAobWNvbmNhdCAkIG1hcCAoYnVpbGRWYXJpbnQgLiBpdzE2IC4gZnJvbVRyYW5zcG9ydFR5cGUpIHRyYW5zKQorCitidWlsZEluZm8gOjogSGVhZGVyVHJhbnNwb3J0IGkgbyAtPiBCLkJ1aWxkZXIKK2J1aWxkSW5mbyB0ID0KKyAgbGV0IGggPSBNYXAuYXNzb2NzICQgd3JpdGVIZWFkZXJzIHQgaW4KKyAgLS0gVE9ETzogY2hlY2sgbGVuZ3RoIGxpbWl0CisgIGNhc2UgbGVuZ3RoIGggb2YKKyAgICAwIC0+IG1lbXB0eQorICAgIGxlbiAtPiAoYnVpbGRWYXJpbnQgJCBpdzE2ICQgZnJvbUludGVncmFsICQgbGVuKSA8PiAobWNvbmNhdCAkIG1hcCBidWlsZEluZm9FbnRyeSBoKQorICB3aGVyZQorICAgIGJ1aWxkSW5mb0VudHJ5IChrLCB2KSA9IGJ1aWxkVmFyU3RyIGsgPD4gYnVpbGRWYXJTdHIgdgorICAgIC0tIFRPRE86IGNoZWNrIGxlbmd0aCBsaW1pdAorICAgIGJ1aWxkVmFyU3RyIHMgPSAoYnVpbGRWYXJpbnQgJCBpdzE2ICQgZnJvbUludGVncmFsICQgbGVuZ3RoIHMpIDw+IEIuc3RyaW5nOCBzCisKK3RSZXNldFByb3RvY29sIDo6IChUcmFuc3BvcnQgaSwgVHJhbnNwb3J0IG8pID0+IEhlYWRlclRyYW5zcG9ydCBpIG8gLT4gSU8gQm9vbAordFJlc2V0UHJvdG9jb2wgdCA9IGRvCisgIHJCdWYgPC0gcmVhZElPUmVmICQgcmVhZEJ1ZmZlciB0CisgIHdyaXRlSU9SZWYgKGNsaWVudFR5cGUgdCkgSGVhZGVyQ2xpZW50CisgIHJlYWRGcmFtZSB0CisKK3RTZXRQcm90b2NvbCA6OiAoVHJhbnNwb3J0IGksIFRyYW5zcG9ydCBvKSA9PiBIZWFkZXJUcmFuc3BvcnQgaSBvIC0+IFByb3RvY29sVHlwZSAtPiBJTyAoKQordFNldFByb3RvY29sIHQgPSB3cml0ZUlPUmVmIChwcm90b2NvbFR5cGUgdCkKKwordHJhbnNmb3JtIDo6IEhlYWRlclRyYW5zcG9ydCBpIG8gLT4gTEJTLkJ5dGVTdHJpbmcgLT4gTEJTLkJ5dGVTdHJpbmcKK3RyYW5zZm9ybSB0IGJzID0KKyAgZm9sZHIgYXBwbHlUcmFuc2Zvcm0gYnMgJCB3cml0ZVRyYW5zZm9ybXMgdAorICB3aGVyZQorICAgIC0tIGFwcGx5VHJhbnNmb3JtIGJzIFpsaWJUcmFuc2Zvcm0gPQorICAgIC0tICAgdGhyb3cgJCBUcmFuc3BvcnRFeG4gIkhlYWRlclRyYW5zcG9ydDogbm90IGltcGxlbWVudGVkOiBabGliVHJhbnNmb3JtICAiIFRFX1VOS05PV04KKyAgICBhcHBseVRyYW5zZm9ybSBicyBfID0KKyAgICAgIHRocm93ICQgVHJhbnNwb3J0RXhuICJIZWFkZXJUcmFuc3BvcnQ6IFVua25vd24gdHJhbnNmb3JtIiBURV9VTktOT1dOCisKK3VudHJhbnNmb3JtIDo6IEhlYWRlclRyYW5zcG9ydCBpIG8gLT4gQlMuQnl0ZVN0cmluZyAtPiBJTyBCUy5CeXRlU3RyaW5nCit1bnRyYW5zZm9ybSB0IGJzID0gZG8KKyAgdHJhbnMgPC0gcmVhZElPUmVmICQgdHJhbnNmb3JtcyB0CisgIHJldHVybiAkIGZvbGRsIHVuYXBwbHlUcmFuc2Zvcm0gYnMgdHJhbnMKKyAgd2hlcmUKKyAgICAtLSB1bmFwcGx5VHJhbnNmb3JtIGJzIFpsaWJUcmFuc2Zvcm0gPQorICAgIC0tICAgdGhyb3cgJCBUcmFuc3BvcnRFeG4gIkhlYWRlclRyYW5zcG9ydDogbm90IGltcGxlbWVudGVkOiBabGliVHJhbnNmb3JtICAiIFRFX1VOS05PV04KKyAgICB1bmFwcGx5VHJhbnNmb3JtIGJzIF8gPQorICAgICAgdGhyb3cgJCBUcmFuc3BvcnRFeG4gIkhlYWRlclRyYW5zcG9ydDogVW5rbm93biB0cmFuc2Zvcm0iIFRFX1VOS05PV04KKworaW5zdGFuY2UgKFRyYW5zcG9ydCBpLCBUcmFuc3BvcnQgbykgPT4gVHJhbnNwb3J0IChIZWFkZXJUcmFuc3BvcnQgaSBvKSB3aGVyZQorICB0SXNPcGVuIHQgPSBkbworICAgIHRJc09wZW4gKGluVHJhbnMgdCkKKyAgICB0SXNPcGVuIChvdXRUcmFucyB0KQorCisgIHRDbG9zZSB0ID0gZG8KKyAgICB0Q2xvc2Uob3V0VHJhbnMgdCkKKyAgICB0Q2xvc2UoaW5UcmFucyB0KQorCisgIHRSZWFkIHQgbGVuID0gZG8KKyAgICByQnVmIDwtIHJlYWRJT1JlZiAkIHJlYWRCdWZmZXIgdAorICAgIGlmIG5vdCAkIExCUy5udWxsIHJCdWYKKyAgICAgIHRoZW4gZG8KKyAgICAgICAgbGV0IChjb25zdW1lZCwgcmVtYWluKSA9IExCUy5zcGxpdEF0IChmcm9tSW50ZWdyYWwgbGVuKSByQnVmCisgICAgICAgIHdyaXRlSU9SZWYgKHJlYWRCdWZmZXIgdCkgcmVtYWluCisgICAgICAgIHJldHVybiBjb25zdW1lZAorICAgICAgZWxzZSBkbworICAgICAgICBmcmFtZWQgPC0gaXNGcmFtZWQgdAorICAgICAgICBpZiBub3QgZnJhbWVkCisgICAgICAgICAgdGhlbiB0UmVhZCAoaW5UcmFucyB0KSBsZW4KKyAgICAgICAgICBlbHNlIGRvCisgICAgICAgICAgICBvayA8LSByZWFkRnJhbWUgdAorICAgICAgICAgICAgaWYgb2sKKyAgICAgICAgICAgICAgdGhlbiB0UmVhZCB0IGxlbgorICAgICAgICAgICAgICBlbHNlIHJldHVybiBMQlMuZW1wdHkKKworICB0UGVlayB0ID0gZG8KKyAgICByQnVmIDwtIHJlYWRJT1JlZiAocmVhZEJ1ZmZlciB0KQorICAgIGlmIG5vdCAkIExCUy5udWxsIHJCdWYKKyAgICAgIHRoZW4gcmV0dXJuICQgSnVzdCAkIExCUy5oZWFkIHJCdWYKKyAgICAgIGVsc2UgZG8KKyAgICAgICAgZnJhbWVkIDwtIGlzRnJhbWVkIHQKKyAgICAgICAgaWYgbm90IGZyYW1lZAorICAgICAgICAgIHRoZW4gdFBlZWsgKGluVHJhbnMgdCkKKyAgICAgICAgICBlbHNlIGRvCisgICAgICAgICAgICBvayA8LSByZWFkRnJhbWUgdAorICAgICAgICAgICAgaWYgb2sKKyAgICAgICAgICAgICAgdGhlbiB0UGVlayB0CisgICAgICAgICAgICAgIGVsc2UgcmV0dXJuIE5vdGhpbmcKKworICB0V3JpdGUgdCBidWYgPSBkbworICAgIGxldCB3QnVmID0gd3JpdGVCdWZmZXIgdAorICAgIGZyYW1lZCA8LSBpc0ZyYW1lZCB0CisgICAgaWYgZnJhbWVkCisgICAgICB0aGVuIG1vZGlmeUlPUmVmIHdCdWYgKDw+IEIubGF6eUJ5dGVTdHJpbmcgYnVmKQorICAgICAgZWxzZQorICAgICAgICAtLSBUT0RPOiB3aGF0IHNob3VsZCB3ZSBkbyB3aGVuIHN3aXRjaGVkIHRvIHVuZnJhbWVkIGluIHRoZSBtaWRkbGUgPworICAgICAgICB0V3JpdGUob3V0VHJhbnMgdCkgYnVmCisKKyAgdEZsdXNoIHQgPSBkbworICAgIGNUeXBlIDwtIHJlYWRJT1JlZiAkIGNsaWVudFR5cGUgdAorICAgIGNhc2UgY1R5cGUgb2YKKyAgICAgIFVuZnJhbWVkIC0+IHRGbHVzaCAkIG91dFRyYW5zIHQKKyAgICAgIEZyYW1lZCAtPiBmbHVzaEJ1ZmZlciB0IGlkIG1lbXB0eQorICAgICAgSGVhZGVyQ2xpZW50IC0+IGJ1aWxkSGVhZGVyIHQgPj49IGZsdXNoQnVmZmVyIHQgKHRyYW5zZm9ybSB0KQorICAgIHdoZXJlCisgICAgICBmbHVzaEJ1ZmZlciB0IGYgaGVhZGVyID0gZG8KKyAgICAgICAgd0J1ZiA8LSByZWFkSU9SZWYgJCB3cml0ZUJ1ZmZlciB0CisgICAgICAgIHdyaXRlSU9SZWYgKHdyaXRlQnVmZmVyIHQpIG1lbXB0eQorICAgICAgICBsZXQgcGF5bG9hZCA9IEIudG9MYXp5Qnl0ZVN0cmluZyAoaGVhZGVyIDw+IHdCdWYpCisgICAgICAgIHRXcml0ZSAob3V0VHJhbnMgdCkgJCBCaW5hcnkuZW5jb2RlIChmcm9tSW50ZWdyYWwgJCBMQlMubGVuZ3RoIHBheWxvYWQgOjogSW50MzIpCisgICAgICAgIHRXcml0ZSAob3V0VHJhbnMgdCkgJCBmIHBheWxvYWQKKyAgICAgICAgdEZsdXNoIChvdXRUcmFucyB0KQpkaWZmIC0tZ2l0IGEvbGliL2hzL3NyYy9UaHJpZnQvVHJhbnNwb3J0L01lbW9yeS5ocyBiL2xpYi9ocy9zcmMvVGhyaWZ0L1RyYW5zcG9ydC9NZW1vcnkuaHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM5M2FmNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ocy9zcmMvVGhyaWZ0L1RyYW5zcG9ydC9NZW1vcnkuaHMKQEAgLTAsMCArMSw3NyBAQAorLS0KKy0tIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy0tIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCistLSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLS0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCistLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCistLSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCistLSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy0tCistLSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLS0KKy0tIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy0tIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCistLSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy0tIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCistLSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCistLSB1bmRlciB0aGUgTGljZW5zZS4KKy0tCisKK21vZHVsZSBUaHJpZnQuVHJhbnNwb3J0Lk1lbW9yeQorICAgICAgICggb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICwgTWVtb3J5QnVmZmVyKC4uKQorICAgICAgICkgd2hlcmUKKworaW1wb3J0IERhdGEuQnl0ZVN0cmluZy5MYXp5LkJ1aWxkZXIKK2ltcG9ydCBEYXRhLkZ1bmN0b3IKK2ltcG9ydCBEYXRhLklPUmVmCitpbXBvcnQgRGF0YS5Nb25vaWQKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5CeXRlU3RyaW5nLkxhenkgYXMgTEJTCisKK2ltcG9ydCBUaHJpZnQuVHJhbnNwb3J0CisKKworZGF0YSBNZW1vcnlCdWZmZXIgPSBNZW1vcnlCdWZmZXIgeworICB3cml0ZUJ1ZmZlciA6OiBJT1JlZiBCdWlsZGVyLAorICByZWFkQnVmZmVyIDo6IElPUmVmIExCUy5CeXRlU3RyaW5nCit9CisKK29wZW5NZW1vcnlCdWZmZXIgOjogSU8gTWVtb3J5QnVmZmVyCitvcGVuTWVtb3J5QnVmZmVyID0gZG8KKyAgd2J1ZiA8LSBuZXdJT1JlZiBtZW1wdHkKKyAgcmJ1ZiA8LSBuZXdJT1JlZiBtZW1wdHkKKyAgcmV0dXJuIE1lbW9yeUJ1ZmZlciB7CisgICAgd3JpdGVCdWZmZXIgPSB3YnVmLAorICAgIHJlYWRCdWZmZXIgPSByYnVmCisgIH0KKworaW5zdGFuY2UgVHJhbnNwb3J0IE1lbW9yeUJ1ZmZlciB3aGVyZQorICB0SXNPcGVuID0gY29uc3QgJCByZXR1cm4gRmFsc2UKKyAgdENsb3NlICA9IGNvbnN0ICQgcmV0dXJuICgpCisgIHRGbHVzaCB0cmFucyA9IGRvCisgICAgbGV0IHdCdWYgPSB3cml0ZUJ1ZmZlciB0cmFucworICAgIHdiIDwtIHJlYWRJT1JlZiB3QnVmCisgICAgbW9kaWZ5SU9SZWYgKHJlYWRCdWZmZXIgdHJhbnMpICQgXHJiIC0+IG1hcHBlbmQgcmIgJCB0b0xhenlCeXRlU3RyaW5nIHdiCisgICAgd3JpdGVJT1JlZiB3QnVmIG1lbXB0eQorCisgIHRSZWFkIF8gMCA9IHJldHVybiBtZW1wdHkKKyAgdFJlYWQgdHJhbnMgbiA9IGRvCisgICAgbGV0IHJidWYgPSByZWFkQnVmZmVyIHRyYW5zCisgICAgcmIgPC0gcmVhZElPUmVmIHJidWYKKyAgICBsZXQgbGVuID0gZnJvbUludGVncmFsICQgTEJTLmxlbmd0aCByYgorICAgIGlmIGxlbiA9PSAwCisgICAgICB0aGVuIGRvCisgICAgICAgIHRGbHVzaCB0cmFucworICAgICAgICByYjIgPC0gcmVhZElPUmVmIChyZWFkQnVmZmVyIHRyYW5zKQorICAgICAgICBpZiAoZnJvbUludGVncmFsICQgTEJTLmxlbmd0aCByYjIpID09IDAKKyAgICAgICAgICB0aGVuIHJldHVybiBtZW1wdHkKKyAgICAgICAgICBlbHNlIHRSZWFkIHRyYW5zIG4KKyAgICAgIGVsc2UgZG8KKyAgICAgICAgbGV0IChyZXQsIHJlbWFpbikgPSBMQlMuc3BsaXRBdCAoZnJvbUludGVncmFsIG4pIHJiCisgICAgICAgIHdyaXRlSU9SZWYgcmJ1ZiByZW1haW4KKyAgICAgICAgcmV0dXJuIHJldAorCisgIHRQZWVrIHRyYW5zID0gKGZtYXAgZnN0IC4gTEJTLnVuY29ucykgPCQ+IHJlYWRJT1JlZiAocmVhZEJ1ZmZlciB0cmFucykKKworICB0V3JpdGUgdHJhbnMgdiA9IGRvCisgICAgbW9kaWZ5SU9SZWYgKHdyaXRlQnVmZmVyIHRyYW5zKSAoPD4gbGF6eUJ5dGVTdHJpbmcgdikKZGlmZiAtLWdpdCBhL2xpYi9ocy9zcmMvVGhyaWZ0L1R5cGVzLmhzIGIvbGliL2hzL3NyYy9UaHJpZnQvVHlwZXMuaHMKaW5kZXggYjkwYzQyYy4uMmEyMDAyNSAxMDA2NDQKLS0tIGEvbGliL2hzL3NyYy9UaHJpZnQvVHlwZXMuaHMKKysrIGIvbGliL2hzL3NyYy9UaHJpZnQvVHlwZXMuaHMKQEAgLTMxLDEyICszMSw2IEBACiBpbXBvcnQgcXVhbGlmaWVkIERhdGEuSGFzaFNldCBhcyBTZXQKIGltcG9ydCBxdWFsaWZpZWQgRGF0YS5WZWN0b3IgYXMgVmVjdG9yCiAKLWluc3RhbmNlIChIYXNoYWJsZSBrLCBIYXNoYWJsZSB2KSA9PiBIYXNoYWJsZSAoTWFwLkhhc2hNYXAgayB2KSB3aGVyZQotICBoYXNoV2l0aFNhbHQgc2FsdCA9IGZvbGRsJyBoYXNoV2l0aFNhbHQgc2FsdCAuIE1hcC50b0xpc3QKLQotaW5zdGFuY2UgKEhhc2hhYmxlIGEpID0+IEhhc2hhYmxlIChTZXQuSGFzaFNldCBhKSB3aGVyZQotICBoYXNoV2l0aFNhbHQgPSBmb2xkbCcgaGFzaFdpdGhTYWx0Ci0KIGluc3RhbmNlIChIYXNoYWJsZSBhKSA9PiBIYXNoYWJsZSAoVmVjdG9yLlZlY3RvciBhKSB3aGVyZQogICBoYXNoV2l0aFNhbHQgPSBWZWN0b3IuZm9sZGwnIGhhc2hXaXRoU2FsdAogCkBAIC01Myw2ICs0Nyw3IEBACiAgICAgICAgICAgICAgICB8IFRJMzIgSW50MzIKICAgICAgICAgICAgICAgIHwgVEk2NCBJbnQ2NAogICAgICAgICAgICAgICAgfCBUU3RyaW5nIExCUy5CeXRlU3RyaW5nCisgICAgICAgICAgICAgICB8IFRCaW5hcnkgTEJTLkJ5dGVTdHJpbmcKICAgICAgICAgICAgICAgIHwgVERvdWJsZSBEb3VibGUKICAgICAgICAgICAgICAgICAgZGVyaXZpbmcgKEVxLCBTaG93KQogCkBAIC03MCw2ICs2NSw3IEBACiAgICAgfCBUX0kzMgogICAgIHwgVF9JNjQKICAgICB8IFRfU1RSSU5HCisgICAgfCBUX0JJTkFSWQogICAgIHwgVF9TVFJVQ1QgVHlwZU1hcAogICAgIHwgVF9NQVAgVGhyaWZ0VHlwZSBUaHJpZnRUeXBlCiAgICAgfCBUX1NFVCBUaHJpZnRUeXBlCkBAIC04OSw2ICs4NSw3IEBACiAgICAgZnJvbUVudW0gVF9JMzIgICAgICAgID0gOAogICAgIGZyb21FbnVtIFRfSTY0ICAgICAgICA9IDEwCiAgICAgZnJvbUVudW0gVF9TVFJJTkcgICAgID0gMTEKKyAgICBmcm9tRW51bSBUX0JJTkFSWSAgICAgPSAxMQogICAgIGZyb21FbnVtIChUX1NUUlVDVCBfKSA9IDEyCiAgICAgZnJvbUVudW0gKFRfTUFQIF8gXykgID0gMTMKICAgICBmcm9tRW51bSAoVF9TRVQgXykgICAgPSAxNApAQCAtMTAzLDYgKzEwMCw3IEBACiAgICAgdG9FbnVtIDggID0gVF9JMzIKICAgICB0b0VudW0gMTAgPSBUX0k2NAogICAgIHRvRW51bSAxMSA9IFRfU1RSSU5HCisgICAgLS0gdG9FbnVtIDExID0gVF9CSU5BUlkKICAgICB0b0VudW0gMTIgPSBUX1NUUlVDVCBNYXAuZW1wdHkKICAgICB0b0VudW0gMTMgPSBUX01BUCBUX1ZPSUQgVF9WT0lECiAgICAgdG9FbnVtIDE0ID0gVF9TRVQgVF9WT0lECmRpZmYgLS1naXQgYS9saWIvaHMvdGVzdC9CaW5hcnlTcGVjLmhzIGIvbGliL2hzL3Rlc3QvQmluYXJ5U3BlYy5ocwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjkyZmFiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hzL3Rlc3QvQmluYXJ5U3BlYy5ocwpAQCAtMCwwICsxLDkxIEBACistLQorLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLS0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy0tIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCistLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy0tIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy0tICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy0tIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLS0KKy0tICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCistLQorLS0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLS0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy0tICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLS0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy0tIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy0tIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0KKworbW9kdWxlIEJpbmFyeVNwZWMgd2hlcmUKKworaW1wb3J0IFRlc3QuSHNwZWMKK2ltcG9ydCBUZXN0LkhzcGVjLlF1aWNrQ2hlY2sgKHByb3ApCisKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5CeXRlU3RyaW5nLkxhenkgYXMgTEJTCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuQnl0ZVN0cmluZy5MYXp5LkNoYXI4IGFzIEMKKworaW1wb3J0IFRocmlmdC5UeXBlcworaW1wb3J0IFRocmlmdC5UcmFuc3BvcnQKK2ltcG9ydCBUaHJpZnQuVHJhbnNwb3J0Lk1lbW9yeQoraW1wb3J0IFRocmlmdC5Qcm90b2NvbAoraW1wb3J0IFRocmlmdC5Qcm90b2NvbC5CaW5hcnkKKworc3BlYyA6OiBTcGVjCitzcGVjID0gZG8KKyAgZGVzY3JpYmUgIkJpbmFyeVByb3RvY29sIiAkIGRvCisgICAgZGVzY3JpYmUgImRvdWJsZSIgJCBkbworICAgICAgaXQgIndyaXRlcyBpbiBiaWcgZW5kaWFuIG9yZGVyIiAkIGRvCisgICAgICAgIGxldCB2YWwgPSAyICoqIDUzCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gQmluYXJ5UHJvdG9jb2wgdHJhbnMKKyAgICAgICAgd3JpdGVWYWwgcHJvdG8gKFREb3VibGUgdmFsKQorICAgICAgICBiaW4gPC0gdFJlYWQgdHJhbnMgOAorICAgICAgICAoTEJTLnVucGFjayBiaW4pIGBzaG91bGRCZWBbNjcsIDY0LCAwLCAwLCAwLCAwLCAwLCAwXQorCisgICAgICBpdCAicmVhZHMgaW4gYmlnIGVuZGlhbiBvcmRlciIgJCBkbworICAgICAgICBsZXQgYmluID0gTEJTLnBhY2sgWzY3LCA2NCwgMCwgMCwgMCwgMCwgMCwgMF0KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBCaW5hcnlQcm90b2NvbCB0cmFucworICAgICAgICB0V3JpdGUgdHJhbnMgYmluCisgICAgICAgIHZhbCA8LSByZWFkVmFsIHByb3RvIFRfRE9VQkxFCisgICAgICAgIHZhbCBgc2hvdWxkQmVgIChURG91YmxlICQgMiAqKiA1MykKKworICAgICAgcHJvcCAicm91bmQgdHJpcCIgJCBcdmFsIC0+IGRvCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gQmluYXJ5UHJvdG9jb2wgdHJhbnMKKyAgICAgICAgd3JpdGVWYWwgcHJvdG8gJCBURG91YmxlIHZhbAorICAgICAgICB2YWwyIDwtIHJlYWRWYWwgcHJvdG8gVF9ET1VCTEUKKyAgICAgICAgdmFsMiBgc2hvdWxkQmVgIChURG91YmxlIHZhbCkKKworICAgIGRlc2NyaWJlICJzdHJpbmciICQgZG8KKyAgICAgIGl0ICJ3cml0ZXMiICQgZG8KKyAgICAgICAgbGV0IHZhbCA9IEMucGFjayAiYWFhIgorICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEJpbmFyeVByb3RvY29sIHRyYW5zCisgICAgICAgIHdyaXRlVmFsIHByb3RvIChUU3RyaW5nIHZhbCkKKyAgICAgICAgYmluIDwtIHRSZWFkIHRyYW5zIDcKKyAgICAgICAgKExCUy51bnBhY2sgYmluKSBgc2hvdWxkQmVgIFswLCAwLCAwLCAzLCA5NywgOTcsIDk3XQorCisgICAgZGVzY3JpYmUgImJpbmFyeSIgJCBkbworICAgICAgaXQgIndyaXRlcyIgJCBkbworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEJpbmFyeVByb3RvY29sIHRyYW5zCisgICAgICAgIHdyaXRlVmFsIHByb3RvIChUQmluYXJ5ICQgTEJTLnBhY2sgWzQyLCA0MywgNDRdKQorICAgICAgICBiaW4gPC0gdFJlYWQgdHJhbnMgMTAwCisgICAgICAgIChMQlMudW5wYWNrIGJpbikgYHNob3VsZEJlYCBbMCwgMCwgMCwgMywgNDIsIDQzLCA0NF0KKworICAgICAgaXQgInJlYWRzIiAkIGRvCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gQmluYXJ5UHJvdG9jb2wgdHJhbnMKKyAgICAgICAgdFdyaXRlIHRyYW5zICQgTEJTLnBhY2sgWzAsIDAsIDAsIDMsIDQyLCA0MywgNDRdCisgICAgICAgIHZhbCA8LSByZWFkVmFsIHByb3RvIChUX0JJTkFSWSkKKyAgICAgICAgdmFsIGBzaG91bGRCZWAgKFRCaW5hcnkgJCBMQlMucGFjayBbNDIsIDQzLCA0NF0pCisKKyAgICAgIHByb3AgInJvdW5kIHRyaXAiICQgXHZhbCAtPiBkbworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEJpbmFyeVByb3RvY29sIHRyYW5zCisgICAgICAgIHdyaXRlVmFsIHByb3RvIChUQmluYXJ5ICQgTEJTLnBhY2sgdmFsKQorICAgICAgICB2YWwyIDwtIHJlYWRWYWwgcHJvdG8gKFRfQklOQVJZKQorICAgICAgICB2YWwyIGBzaG91bGRCZWAgKFRCaW5hcnkgJCBMQlMucGFjayB2YWwpCisKZGlmZiAtLWdpdCBhL2xpYi9ocy90ZXN0L0NvbXBhY3RTcGVjLmhzIGIvbGliL2hzL3Rlc3QvQ29tcGFjdFNwZWMuaHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU0MGU3YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ocy90ZXN0L0NvbXBhY3RTcGVjLmhzCkBAIC0wLDAgKzEsODEgQEAKKy0tCistLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCistLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLS0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy0tIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLS0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLS0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLS0gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CistLQorLS0gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy0tCistLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCistLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLS0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCistLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLS0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLS0gdW5kZXIgdGhlIExpY2Vuc2UuCistLQorCittb2R1bGUgQ29tcGFjdFNwZWMgd2hlcmUKKworaW1wb3J0IFRlc3QuSHNwZWMKK2ltcG9ydCBUZXN0LkhzcGVjLlF1aWNrQ2hlY2sgKHByb3ApCisKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5CeXRlU3RyaW5nLkxhenkgYXMgTEJTCisKK2ltcG9ydCBUaHJpZnQuVHlwZXMKK2ltcG9ydCBUaHJpZnQuVHJhbnNwb3J0CitpbXBvcnQgVGhyaWZ0LlRyYW5zcG9ydC5NZW1vcnkKK2ltcG9ydCBUaHJpZnQuUHJvdG9jb2wKK2ltcG9ydCBUaHJpZnQuUHJvdG9jb2wuQ29tcGFjdAorCitzcGVjIDo6IFNwZWMKK3NwZWMgPSBkbworICBkZXNjcmliZSAiQ29tcGFjdFByb3RvY29sIiAkIGRvCisgICAgZGVzY3JpYmUgImRvdWJsZSIgJCBkbworICAgICAgaXQgIndyaXRlcyBpbiBsaXR0bGUgZW5kaWFuIG9yZGVyIiAkIGRvCisgICAgICAgIGxldCB2YWwgPSAyICoqIDUzCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gQ29tcGFjdFByb3RvY29sIHRyYW5zCisgICAgICAgIHdyaXRlVmFsIHByb3RvIChURG91YmxlIHZhbCkKKyAgICAgICAgYmluIDwtIHRSZWFkQWxsIHRyYW5zIDgKKyAgICAgICAgKExCUy51bnBhY2sgYmluKSBgc2hvdWxkQmVgWzAsIDAsIDAsIDAsIDAsIDAsIDY0LCA2N10KKworICAgICAgaXQgInJlYWRzIGluIGxpdHRsZSBlbmRpYW4gb3JkZXIiICQgZG8KKyAgICAgICAgbGV0IGJpbiA9IExCUy5wYWNrIFswLCAwLCAwLCAwLCAwLCAwLCA2NCwgNjddCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gQ29tcGFjdFByb3RvY29sIHRyYW5zCisgICAgICAgIHRXcml0ZSB0cmFucyBiaW4KKyAgICAgICAgdmFsIDwtIHJlYWRWYWwgcHJvdG8gVF9ET1VCTEUKKyAgICAgICAgdmFsIGBzaG91bGRCZWAgKFREb3VibGUgJCAyICoqIDUzKQorCisgICAgICBwcm9wICJyb3VuZCB0cmlwIiAkIFx2YWwgLT4gZG8KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBDb21wYWN0UHJvdG9jb2wgdHJhbnMKKyAgICAgICAgd3JpdGVWYWwgcHJvdG8gJCBURG91YmxlIHZhbAorICAgICAgICB2YWwyIDwtIHJlYWRWYWwgcHJvdG8gVF9ET1VCTEUKKyAgICAgICAgdmFsMiBgc2hvdWxkQmVgIChURG91YmxlIHZhbCkKKworICAgIGRlc2NyaWJlICJiaW5hcnkiICQgZG8KKyAgICAgIGl0ICJ3cml0ZXMiICQgZG8KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBDb21wYWN0UHJvdG9jb2wgdHJhbnMKKyAgICAgICAgd3JpdGVWYWwgcHJvdG8gKFRCaW5hcnkgJCBMQlMucGFjayBbNDIsIDQzLCA0NF0pCisgICAgICAgIGJpbiA8LSB0UmVhZCB0cmFucyAxMDAKKyAgICAgICAgKExCUy51bnBhY2sgYmluKSBgc2hvdWxkQmVgIFszLCA0MiwgNDMsIDQ0XQorCisgICAgICBpdCAicmVhZHMiICQgZG8KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBDb21wYWN0UHJvdG9jb2wgdHJhbnMKKyAgICAgICAgdFdyaXRlIHRyYW5zICQgTEJTLnBhY2sgWzMsIDQyLCA0MywgNDRdCisgICAgICAgIHZhbCA8LSByZWFkVmFsIHByb3RvIChUX0JJTkFSWSkKKyAgICAgICAgdmFsIGBzaG91bGRCZWAgKFRCaW5hcnkgJCBMQlMucGFjayBbNDIsIDQzLCA0NF0pCisKKyAgICAgIHByb3AgInJvdW5kIHRyaXAiICQgXHZhbCAtPiBkbworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IENvbXBhY3RQcm90b2NvbCB0cmFucworICAgICAgICB3cml0ZVZhbCBwcm90byAoVEJpbmFyeSAkIExCUy5wYWNrIHZhbCkKKyAgICAgICAgdmFsMiA8LSByZWFkVmFsIHByb3RvIChUX0JJTkFSWSkKKyAgICAgICAgdmFsMiBgc2hvdWxkQmVgIChUQmluYXJ5ICQgTEJTLnBhY2sgdmFsKQorCmRpZmYgLS1naXQgYS9saWIvaHMvdGVzdC9KU09OU3BlYy5ocyBiL2xpYi9ocy90ZXN0L0pTT05TcGVjLmhzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyMmM4MjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaHMvdGVzdC9KU09OU3BlYy5ocwpAQCAtMCwwICsxLDIyNSBAQAorLS0KKy0tIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy0tIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCistLSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLS0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCistLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCistLSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCistLSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy0tCistLSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLS0KKy0tIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy0tIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCistLSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy0tIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCistLSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCistLSB1bmRlciB0aGUgTGljZW5zZS4KKy0tCisKK21vZHVsZSBKU09OU3BlYyB3aGVyZQorCitpbXBvcnQgVGVzdC5Ic3BlYworaW1wb3J0IFRlc3QuSHNwZWMuUXVpY2tDaGVjayAocHJvcCkKKworaW1wb3J0IHF1YWxpZmllZCBEYXRhLkJ5dGVTdHJpbmcuTGF6eSBhcyBMQlMKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5CeXRlU3RyaW5nLkxhenkuQ2hhcjggYXMgQworCitpbXBvcnQgVGhyaWZ0LlR5cGVzCitpbXBvcnQgVGhyaWZ0LlRyYW5zcG9ydAoraW1wb3J0IFRocmlmdC5UcmFuc3BvcnQuTWVtb3J5CitpbXBvcnQgVGhyaWZ0LlByb3RvY29sCitpbXBvcnQgVGhyaWZ0LlByb3RvY29sLkpTT04KKwordFN0cmluZyA6OiBbQ2hhcl0gLT4gVGhyaWZ0VmFsCit0U3RyaW5nID0gVFN0cmluZyAuIEMucGFjaworCitzcGVjIDo6IFNwZWMKK3NwZWMgPSBkbworICBkZXNjcmliZSAiSlNPTlByb3RvY29sIiAkIGRvCisgICAgZGVzY3JpYmUgImJvb2wiICQgZG8KKyAgICAgIGl0ICJ3cml0ZXMgdHJ1ZSBhcyAxIiAkIGRvCisgICAgICAgIGxldCB2YWwgPSBUcnVlCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gSlNPTlByb3RvY29sIHRyYW5zCisgICAgICAgIHdyaXRlVmFsIHByb3RvIChUQm9vbCB2YWwpCisgICAgICAgIGJpbiA8LXRSZWFkIHRyYW5zIDEwMAorICAgICAgICAoQy51bnBhY2sgYmluKSBgc2hvdWxkQmVgIFsnMSddCisKKyAgICAgIGl0ICJ3cml0ZXMgZmFsc2UgYXMgMCIgJCBkbworICAgICAgICBsZXQgdmFsID0gRmFsc2UKKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBKU09OUHJvdG9jb2wgdHJhbnMKKyAgICAgICAgd3JpdGVWYWwgcHJvdG8gKFRCb29sIHZhbCkKKyAgICAgICAgYmluIDwtIHRSZWFkIHRyYW5zIDEwMAorICAgICAgICAoQy51bnBhY2sgYmluKSBgc2hvdWxkQmVgIFsnMCddCisKKyAgICAgIHByb3AgInJvdW5kIHRyaXAiICQgXHZhbCAtPiBkbworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEpTT05Qcm90b2NvbCB0cmFucworICAgICAgICB3cml0ZVZhbCBwcm90byAkIFRCb29sIHZhbAorICAgICAgICB2YWwyIDwtIHJlYWRWYWwgcHJvdG8gVF9CT09MCisgICAgICAgIHZhbDIgYHNob3VsZEJlYCAoVEJvb2wgdmFsKQorCisgICAgZGVzY3JpYmUgInN0cmluZyIgJCBkbworICAgICAgaXQgIndyaXRlcyIgJCBkbworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEpTT05Qcm90b2NvbCB0cmFucworICAgICAgICB3cml0ZVZhbCBwcm90byAoVFN0cmluZyAkIEMucGFjayAiXCJhIikKKyAgICAgICAgYmluIDwtIHRSZWFkIHRyYW5zIDEwMAorICAgICAgICAoQy51bnBhY2sgYmluKSBgc2hvdWxkQmVgICJcIlxcXCJhXCIiCisKKyAgICAgIGl0ICJyZWFkcyIgJCBkbworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEpTT05Qcm90b2NvbCB0cmFucworICAgICAgICB0V3JpdGUgdHJhbnMgJCBDLnBhY2sgIlwiXFxcImFcIiIKKyAgICAgICAgdmFsIDwtIHJlYWRWYWwgcHJvdG8gKFRfU1RSSU5HKQorICAgICAgICB2YWwgYHNob3VsZEJlYCAoVFN0cmluZyAkIEMucGFjayAiXCJhIikKKworICAgICAgcHJvcCAicm91bmQgdHJpcCIgJCBcdmFsIC0+IGRvCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gSlNPTlByb3RvY29sIHRyYW5zCisgICAgICAgIHdyaXRlVmFsIHByb3RvIChUU3RyaW5nICQgQy5wYWNrIHZhbCkKKyAgICAgICAgdmFsMiA8LSByZWFkVmFsIHByb3RvIChUX1NUUklORykKKyAgICAgICAgdmFsMiBgc2hvdWxkQmVgIChUU3RyaW5nICQgQy5wYWNrIHZhbCkKKworICAgIGRlc2NyaWJlICJiaW5hcnkiICQgZG8KKyAgICAgIGl0ICJ3cml0ZXMgd2l0aCBwYWRkaW5nIiAkIGRvCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gSlNPTlByb3RvY29sIHRyYW5zCisgICAgICAgIHdyaXRlVmFsIHByb3RvIChUQmluYXJ5ICQgTEJTLnBhY2sgWzFdKQorICAgICAgICBiaW4gPC0gdFJlYWQgdHJhbnMgMTAwCisgICAgICAgIChDLnVucGFjayBiaW4pIGBzaG91bGRCZWAgIlwiQVE9PVwiIgorCisgICAgICBpdCAicmVhZHMgd2l0aCBwYWRkaW5nIiAkIGRvCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gSlNPTlByb3RvY29sIHRyYW5zCisgICAgICAgIHRXcml0ZSB0cmFucyAkIEMucGFjayAiXCJBUT09XCIiCisgICAgICAgIHZhbCA8LSByZWFkVmFsIHByb3RvIChUX0JJTkFSWSkKKyAgICAgICAgdmFsIGBzaG91bGRCZWAgKFRCaW5hcnkgJCBMQlMucGFjayBbMV0pCisKKyAgICAgIGl0ICJyZWFkcyB3aXRob3V0IHBhZGRpbmciICQgZG8KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBKU09OUHJvdG9jb2wgdHJhbnMKKyAgICAgICAgdFdyaXRlIHRyYW5zICQgQy5wYWNrICJcIkFRXCIiCisgICAgICAgIHZhbCA8LSByZWFkVmFsIHByb3RvIChUX0JJTkFSWSkKKyAgICAgICAgdmFsIGBzaG91bGRCZWAgKFRCaW5hcnkgJCBMQlMucGFjayBbMV0pCisKKyAgICAgIHByb3AgInJvdW5kIHRyaXAiICQgXHZhbCAtPiBkbworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEpTT05Qcm90b2NvbCB0cmFucworICAgICAgICB3cml0ZVZhbCBwcm90byAoVEJpbmFyeSAkIExCUy5wYWNrIHZhbCkKKyAgICAgICAgdmFsMiA8LSByZWFkVmFsIHByb3RvIChUX0JJTkFSWSkKKyAgICAgICAgdmFsMiBgc2hvdWxkQmVgIChUQmluYXJ5ICQgTEJTLnBhY2sgdmFsKQorCisgICAgZGVzY3JpYmUgImxpc3QiICQgZG8KKyAgICAgIGl0ICJ3cml0ZXMgZW1wdHkgbGlzdCIgJCBkbworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEpTT05Qcm90b2NvbCB0cmFucworICAgICAgICB3cml0ZVZhbCBwcm90byAoVExpc3QgVF9CWVRFIFtdKQorICAgICAgICBiaW4gPC0gdFJlYWQgdHJhbnMgMTAwCisgICAgICAgIChDLnVucGFjayBiaW4pIGBzaG91bGRCZWAgIltcImk4XCIsMF0iCisKKyAgICAgIGl0ICJyZWFkcyBlbXB0eSIgJCBkbworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEpTT05Qcm90b2NvbCB0cmFucworICAgICAgICB0V3JpdGUgdHJhbnMgKEMucGFjayAiW1wiaThcIiwwXSIpCisgICAgICAgIHZhbCA8LSByZWFkVmFsIHByb3RvIChUX0xJU1QgVF9CWVRFKQorICAgICAgICB2YWwgYHNob3VsZEJlYCAoVExpc3QgVF9CWVRFIFtdKQorCisgICAgICBpdCAid3JpdGVzIHNpbmdsZSBlbGVtZW50IiAkIGRvCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gSlNPTlByb3RvY29sIHRyYW5zCisgICAgICAgIHdyaXRlVmFsIHByb3RvIChUTGlzdCBUX0JZVEUgW1RCeXRlIDBdKQorICAgICAgICBiaW4gPC0gdFJlYWQgdHJhbnMgMTAwCisgICAgICAgIChDLnVucGFjayBiaW4pIGBzaG91bGRCZWAgIltcImk4XCIsMSwwXSIKKworICAgICAgaXQgInJlYWRzIHNpbmdsZSBlbGVtZW50IiAkIGRvCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gSlNPTlByb3RvY29sIHRyYW5zCisgICAgICAgIHRXcml0ZSB0cmFucyAoQy5wYWNrICJbXCJpOFwiLDEsMF0iKQorICAgICAgICB2YWwgPC0gcmVhZFZhbCBwcm90byAoVF9MSVNUIFRfQllURSkKKyAgICAgICAgdmFsIGBzaG91bGRCZWAgKFRMaXN0IFRfQllURSBbVEJ5dGUgMF0pCisKKyAgICAgIGl0ICJyZWFkcyBlbGVtZW50cyIgJCBkbworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEpTT05Qcm90b2NvbCB0cmFucworICAgICAgICB0V3JpdGUgdHJhbnMgKEMucGFjayAiW1wiaThcIiwyLDQyLCA0M10iKQorICAgICAgICB2YWwgPC0gcmVhZFZhbCBwcm90byAoVF9MSVNUIFRfQllURSkKKyAgICAgICAgdmFsIGBzaG91bGRCZWAgKFRMaXN0IFRfQllURSBbVEJ5dGUgNDIsIFRCeXRlIDQzXSkKKworICAgICAgcHJvcCAicm91bmQgdHJpcCIgJCBcdmFsIC0+IGRvCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gSlNPTlByb3RvY29sIHRyYW5zCisgICAgICAgIHdyaXRlVmFsIHByb3RvICQgKFRMaXN0IFRfU1RSSU5HICQgbWFwIHRTdHJpbmcgdmFsKQorICAgICAgICB2YWwyIDwtIHJlYWRWYWwgcHJvdG8gJCBUX0xJU1QgVF9TVFJJTkcKKyAgICAgICAgdmFsMiBgc2hvdWxkQmVgIChUTGlzdCBUX1NUUklORyAkIG1hcCB0U3RyaW5nIHZhbCkKKworICAgIGRlc2NyaWJlICJzZXQiICQgZG8KKyAgICAgIGl0ICJ3cml0ZXMgZW1wdHkiICQgZG8KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBKU09OUHJvdG9jb2wgdHJhbnMKKyAgICAgICAgd3JpdGVWYWwgcHJvdG8gKFRTZXQgVF9CWVRFIFtdKQorICAgICAgICBiaW4gPC0gdFJlYWQgdHJhbnMgMTAwCisgICAgICAgIChDLnVucGFjayBiaW4pIGBzaG91bGRCZWAgIltcImk4XCIsMF0iCisKKyAgICAgIGl0ICJyZWFkcyBlbXB0eSIgJCBkbworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEpTT05Qcm90b2NvbCB0cmFucworICAgICAgICB0V3JpdGUgdHJhbnMgKEMucGFjayAiW1wiaThcIiwwXSIpCisgICAgICAgIHZhbCA8LSByZWFkVmFsIHByb3RvIChUX1NFVCBUX0JZVEUpCisgICAgICAgIHZhbCBgc2hvdWxkQmVgIChUU2V0IFRfQllURSBbXSkKKworICAgICAgaXQgInJlYWRzIHNpbmdsZSBlbGVtZW50IiAkIGRvCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gSlNPTlByb3RvY29sIHRyYW5zCisgICAgICAgIHRXcml0ZSB0cmFucyAoQy5wYWNrICJbXCJpOFwiLDEsMF0iKQorICAgICAgICB2YWwgPC0gcmVhZFZhbCBwcm90byAoVF9TRVQgVF9CWVRFKQorICAgICAgICB2YWwgYHNob3VsZEJlYCAoVFNldCBUX0JZVEUgW1RCeXRlIDBdKQorCisgICAgICBpdCAicmVhZHMgZWxlbWVudHMiICQgZG8KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBKU09OUHJvdG9jb2wgdHJhbnMKKyAgICAgICAgdFdyaXRlIHRyYW5zIChDLnBhY2sgIltcImk4XCIsMiw0MiwgNDNdIikKKyAgICAgICAgdmFsIDwtIHJlYWRWYWwgcHJvdG8gKFRfU0VUIFRfQllURSkKKyAgICAgICAgdmFsIGBzaG91bGRCZWAgKFRTZXQgVF9CWVRFIFtUQnl0ZSA0MiwgVEJ5dGUgNDNdKQorCisgICAgICBwcm9wICJyb3VuZCB0cmlwIiAkIFx2YWwgLT4gZG8KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBKU09OUHJvdG9jb2wgdHJhbnMKKyAgICAgICAgd3JpdGVWYWwgcHJvdG8gJCAoVFNldCBUX1NUUklORyAkIG1hcCB0U3RyaW5nIHZhbCkKKyAgICAgICAgdmFsMiA8LSByZWFkVmFsIHByb3RvICQgVF9TRVQgVF9TVFJJTkcKKyAgICAgICAgdmFsMiBgc2hvdWxkQmVgIChUU2V0IFRfU1RSSU5HICQgbWFwIHRTdHJpbmcgdmFsKQorCisgICAgZGVzY3JpYmUgIm1hcCIgJCBkbworICAgICAgaXQgIndyaXRlcyBlbXB0eSIgJCBkbworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEpTT05Qcm90b2NvbCB0cmFucworICAgICAgICB3cml0ZVZhbCBwcm90byAoVE1hcCBUX0JZVEUgVF9CWVRFIFtdKQorICAgICAgICBiaW4gPC0gdFJlYWQgdHJhbnMgMTAwCisgICAgICAgIChDLnVucGFjayBiaW4pIGBzaG91bGRCZWAiW1wiaThcIixcImk4XCIsMCx7fV0iCisKKyAgICAgIGl0ICJyZWFkcyBlbXB0eSIgJCBkbworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEpTT05Qcm90b2NvbCB0cmFucworICAgICAgICB0V3JpdGUgdHJhbnMgKEMucGFjayAiW1wiaThcIixcImk4XCIsMCx7fV0iKQorICAgICAgICB2YWwgPC0gcmVhZFZhbCBwcm90byAoVF9NQVAgVF9CWVRFIFRfQllURSkKKyAgICAgICAgdmFsIGBzaG91bGRCZWAgKFRNYXAgVF9CWVRFIFRfQllURSBbXSkKKworICAgICAgaXQgInJlYWRzIHN0cmluZy1zdHJpbmciICQgZG8KKyAgICAgICAgbGV0IGJpbiA9ICJbXCJzdHJcIixcInN0clwiLDIse1wiYVwiOlwiMlwiLFwiYlwiOlwiYmxhaFwifV0iCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gSlNPTlByb3RvY29sIHRyYW5zCisgICAgICAgIHRXcml0ZSB0cmFucyAoQy5wYWNrIGJpbikKKyAgICAgICAgdmFsIDwtIHJlYWRWYWwgcHJvdG8gKFRfTUFQIFRfU1RSSU5HIFRfU1RSSU5HKQorICAgICAgICB2YWxgc2hvdWxkQmVgIChUTWFwIFRfU1RSSU5HIFRfU1RSSU5HIFsodFN0cmluZyAiYSIsIHRTdHJpbmcgIjIiKSwgKHRTdHJpbmcgImIiLCB0U3RyaW5nICJibGFoIildKQorCisgICAgICBwcm9wICJyb3VuZCB0cmlwIiAkIFx2YWwgLT4gZG8KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBKU09OUHJvdG9jb2wgdHJhbnMKKyAgICAgICAgd3JpdGVWYWwgcHJvdG8gJCAoVE1hcCBUX1NUUklORyBUX1NUUklORyAkIG1hcCB0b0tWIHZhbCkKKyAgICAgICAgdmFsMiA8LSByZWFkVmFsIHByb3RvICQgVF9NQVAgVF9TVFJJTkcgVF9TVFJJTkcKKyAgICAgICAgdmFsMiBgc2hvdWxkQmVgIChUTWFwIFRfU1RSSU5HIFRfU1RSSU5HICQgbWFwIHRvS1YgdmFsKQorICAgICAgICB3aGVyZQorICAgICAgICAgIHRvS1YgdiA9ICh0U3RyaW5nIHYsIHRTdHJpbmcgdikKKwpkaWZmIC0tZ2l0IGEvbGliL2hzL3Rlc3QvU3BlYy5ocyBiL2xpYi9ocy90ZXN0L1NwZWMuaHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VjOWE5OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ocy90ZXN0L1NwZWMuaHMKQEAgLTAsMCArMSwzOCBAQAorLS0KKy0tIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy0tIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCistLSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLS0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCistLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCistLSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCistLSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy0tCistLSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLS0KKy0tIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy0tIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCistLSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy0tIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCistLSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCistLSB1bmRlciB0aGUgTGljZW5zZS4KKy0tCisKKy0tIE91ciBDSSBkb2VzIG5vdCB3b3JrIHdlbGwgd2l0aCBhdXRvIGRpc2NvdmVyLgorLS0gTmVlZCB0byBhZGQgYnVpbGQtdGltZSBQQVRIIHZhcmlhYmxlIHRvIGhzcGVjLWRpc2NvdmVyIGRpciBmcm9tIENNYWtlCistLSBvciBpbnN0YWxsIGhzcGVjIHN5c3RlbS13aWRlIGZvciB0aGUgZm9sbG93aW5nIHRvIHdvcmsuCistLSB7LSMgT1BUSU9OU19HSEMgLUYgLXBnbUYgaHNwZWMtZGlzY292ZXIgIy19CisKK2ltcG9ydCBUZXN0LkhzcGVjCisKK2ltcG9ydCBxdWFsaWZpZWQgQmluYXJ5U3BlYworaW1wb3J0IHF1YWxpZmllZCBDb21wYWN0U3BlYworaW1wb3J0IHF1YWxpZmllZCBKU09OU3BlYworCittYWluIDo6IElPICgpCittYWluID0gaHNwZWMgc3BlYworCitzcGVjIDo6IFNwZWMKK3NwZWMgPSBkbworICBkZXNjcmliZSAiQmluYXJ5IiBCaW5hcnlTcGVjLnNwZWMKKyAgZGVzY3JpYmUgIkNvbXBhY3QiIENvbXBhY3RTcGVjLnNwZWMKKyAgZGVzY3JpYmUgIkpTT04iIEpTT05TcGVjLnNwZWMKZGlmZiAtLWdpdCBhL2xpYi9ocy90aHJpZnQuY2FiYWwgYi9saWIvaHMvdGhyaWZ0LmNhYmFsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1MTU1NTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaHMvdGhyaWZ0LmNhYmFsCkBAIC0wLDAgKzEsODQgQEAKKy0tCistLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCistLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLS0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy0tIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLS0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLS0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLS0gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CistLQorLS0gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy0tCistLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCistLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLS0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCistLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLS0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLS0gdW5kZXIgdGhlIExpY2Vuc2UuCistLQorCitOYW1lOiAgICAgICAgICAgdGhyaWZ0CitWZXJzaW9uOiAgICAgICAgMS4wLjAKK0NhYmFsLVZlcnNpb246ICAxLjI0CitMaWNlbnNlOiAgICAgICAgT3RoZXJMaWNlbnNlCitDYXRlZ29yeTogICAgICAgRm9yZWlnbgorQnVpbGQtVHlwZTogICAgIFNpbXBsZQorU3lub3BzaXM6ICAgICAgIEhhc2tlbGwgYmluZGluZ3MgZm9yIHRoZSBBcGFjaGUgVGhyaWZ0IFJQQyBzeXN0ZW0KK0hvbWVwYWdlOiAgICAgICBodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcKK0J1Zy1SZXBvcnRzOiAgICBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVAorTWFpbnRhaW5lcjogICAgIGRldkB0aHJpZnQuYXBhY2hlLm9yZworTGljZW5zZS1GaWxlOiAgIExJQ0VOU0UKKworRGVzY3JpcHRpb246CisgIEhhc2tlbGwgYmluZGluZ3MgZm9yIHRoZSBBcGFjaGUgVGhyaWZ0IFJQQyBzeXN0ZW0uIFJlcXVpcmVzIHRoZSB1c2Ugb2YgdGhlIHRocmlmdCBjb2RlIGdlbmVyYXRvci4KKworZmxhZyBuZXR3b3JrLXVyaQorICAgZGVzY3JpcHRpb246IEdldCBOZXR3b3JrLlVSSSBmcm9tIHRoZSBuZXR3b3JrLXVyaSBwYWNrYWdlCisgICBkZWZhdWx0OiBUcnVlCisKK0xpYnJhcnkKKyAgSHMtU291cmNlLURpcnM6CisgICAgc3JjCisgIEJ1aWxkLURlcGVuZHM6CisgICAgYmFzZSA+PSA0LCBiYXNlIDwgNSwgY29udGFpbmVycywgZ2hjLXByaW0sIGF0dG9wYXJzZWMsIGJpbmFyeSwgYnl0ZXN0cmluZyA+PSAwLjEwLCBiYXNlNjQtYnl0ZXN0cmluZywgaGFzaGFibGUsIEhUVFAsIHRleHQsIGhzcGVjLWNvcmUgPiAyLjQuMCwgdW5vcmRlcmVkLWNvbnRhaW5lcnMgPj0gMC4yLjYsIHZlY3RvciA+PSAwLjEwLjEyLjIsIFF1aWNrQ2hlY2sgPj0gMi44LjIsIHNwbGl0CisgIGlmIGZsYWcobmV0d29yay11cmkpCisgICAgIGJ1aWxkLWRlcGVuZHM6IG5ldHdvcmstdXJpID49IDIuNiwgbmV0d29yayA+PSAyLjYKKyAgZWxzZQorICAgICBidWlsZC1kZXBlbmRzOiBuZXR3b3JrIDwgMi42CisgIEV4cG9zZWQtTW9kdWxlczoKKyAgICBUaHJpZnQsCisgICAgVGhyaWZ0LkFyYml0cmFyaWVzCisgICAgVGhyaWZ0LlByb3RvY29sLAorICAgIFRocmlmdC5Qcm90b2NvbC5IZWFkZXIsCisgICAgVGhyaWZ0LlByb3RvY29sLkJpbmFyeSwKKyAgICBUaHJpZnQuUHJvdG9jb2wuQ29tcGFjdCwKKyAgICBUaHJpZnQuUHJvdG9jb2wuSlNPTiwKKyAgICBUaHJpZnQuU2VydmVyLAorICAgIFRocmlmdC5UcmFuc3BvcnQsCisgICAgVGhyaWZ0LlRyYW5zcG9ydC5FbXB0eSwKKyAgICBUaHJpZnQuVHJhbnNwb3J0LkZyYW1lZCwKKyAgICBUaHJpZnQuVHJhbnNwb3J0LkhhbmRsZSwKKyAgICBUaHJpZnQuVHJhbnNwb3J0LkhlYWRlciwKKyAgICBUaHJpZnQuVHJhbnNwb3J0Lkh0dHBDbGllbnQsCisgICAgVGhyaWZ0LlRyYW5zcG9ydC5JT0J1ZmZlciwKKyAgICBUaHJpZnQuVHJhbnNwb3J0Lk1lbW9yeSwKKyAgICBUaHJpZnQuVHlwZXMKKyAgRGVmYXVsdC1MYW5ndWFnZTogSGFza2VsbDIwMTAKKyAgRGVmYXVsdC1FeHRlbnNpb25zOgorICAgIERlcml2ZURhdGFUeXBlYWJsZSwKKyAgICBFeGlzdGVudGlhbFF1YW50aWZpY2F0aW9uLAorICAgIEZsZXhpYmxlSW5zdGFuY2VzLAorICAgIEtpbmRTaWduYXR1cmVzLAorICAgIE1hZ2ljSGFzaCwKKyAgICBSYW5rTlR5cGVzLAorICAgIFJlY29yZFdpbGRDYXJkcywKKyAgICBTY29wZWRUeXBlVmFyaWFibGVzLAorICAgIFR5cGVTeW5vbnltSW5zdGFuY2VzCisKK1Rlc3QtU3VpdGUgc3BlYworICBUeXBlOiBleGl0Y29kZS1zdGRpby0xLjAKKyAgSHMtU291cmNlLURpcnM6IHRlc3QKKyAgR2hjLU9wdGlvbnM6IC1XYWxsCisgIG1haW4taXM6IFNwZWMuaHMKKyAgQnVpbGQtRGVwZW5kczogYmFzZSwgdGhyaWZ0LCBoc3BlYywgUXVpY2tDaGVjayA+PSAyLjguMiwgYnl0ZXN0cmluZyA+PSAwLjEwLCB1bm9yZGVyZWQtY29udGFpbmVycyA+PSAwLjIuNgorICBEZWZhdWx0LUxhbmd1YWdlOiBIYXNrZWxsMjAxMApkaWZmIC0tZ2l0IGEvbGliL2phdmEvQ01ha2VMaXN0cy50eHQgYi9saWIvamF2YS9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjA2NGU2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw4NyBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2lmKEFORFJPSUQpCisgICAgc2V0KFRIUklGVF9BQVIgb3V0cHV0cy9hYXIvdGhyaWZ0LWRlYnVnLmFhciBvdXRwdXRzL2Fhci90aHJpZnQtcmVsZWFzZS5hYXIpCisgICAgYWRkX2N1c3RvbV9jb21tYW5kKAorICAgICAgICBPVVRQVVQgJHtUSFJJRlRfQUFSfQorICAgICAgICBDT01NQU5EICR7R1JBRExFX0VYRUNVVEFCTEV9CisgICAgICAgICAgICAtcCAiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2FuZHJvaWQiCisgICAgICAgICAgICAiLVBidWlsZERpcj0ke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vYW5kcm9pZC9idWlsZCIgYXNzZW1ibGUKKyAgICApCisgICAgYWRkX2N1c3RvbV90YXJnZXQodGhyaWZ0X2FhciBBTEwgREVQRU5EUyAke1RIUklGVF9BQVJ9KQorCitlbHNlKEFORFJPSUQpCisKKyAgICBpZihJU19BQlNPTFVURSAiJHtMSUJfSU5TVEFMTF9ESVJ9IikKKyAgICAgICAgc2V0KEpBVkFfSU5TVEFMTF9ESVIgIiR7TElCX0lOU1RBTExfRElSfS9qYXZhIikKKyAgICBlbHNlKCkKKyAgICAgICAgc2V0KEpBVkFfSU5TVEFMTF9ESVIgIiR7Q01BS0VfSU5TVEFMTF9QUkVGSVh9LyR7TElCX0lOU1RBTExfRElSfS9qYXZhIikKKyAgICBlbmRpZigpCisKKyAgICBpZihJU19BQlNPTFVURSAiJHtET0NfSU5TVEFMTF9ESVJ9IikKKyAgICAgICAgc2V0KEpBVkFfRE9DX0lOU1RBTExfRElSICIke0RPQ19JTlNUQUxMX0RJUn0vamF2YSIpCisgICAgZWxzZSgpCisgICAgICAgIHNldChKQVZBX0RPQ19JTlNUQUxMX0RJUiAiJHtDTUFLRV9JTlNUQUxMX1BSRUZJWH0vJHtET0NfSU5TVEFMTF9ESVJ9L2phdmEiKQorICAgIGVuZGlmKCkKKworICAgIGFkZF9jdXN0b21fdGFyZ2V0KFRocmlmdEphdmEgQUxMCisgICAgICAgIENPTU1FTlQgIkJ1aWxkaW5nIEphdmEgbGlicmFyeSB1c2luZyBHcmFkbGUgV3JhcHBlciIKKyAgICAgICAgQ09NTUFORCAke0dSQURMRVdfRVhFQ1VUQUJMRX0gJHtHUkFETEVfT1BUU30gYXNzZW1ibGUKKyAgICAgICAgICAgIC0tY29uc29sZT1wbGFpbiAtLW5vLWRhZW1vbgorICAgICAgICAgICAgLVByZWxlYXNlPXRydWUKKyAgICAgICAgICAgIC1QdGhyaWZ0LnZlcnNpb249JHt0aHJpZnRfVkVSU0lPTn0KKyAgICAgICAgICAgICItUGJ1aWxkLmRpcj0ke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vYnVpbGQiCisgICAgICAgIFdPUktJTkdfRElSRUNUT1JZICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfQorICAgICkKKworICAgICMgRW5hYmxlIHB1Ymxpc2hpbmcgZnJvbSBDTWFrZSBpZiB0aGUgcHVibGlzaGluZyBpbmZvcm1hdGlvbiBpcyBwcm92aWRlZAorICAgIGFkZF9jdXN0b21fdGFyZ2V0KE1hdmVuUHVibGlzaAorICAgICAgICBDT01NRU5UICJQdWJsaXNoaW5nIEphdmEgTGlicmFyeSB0byBBcGFjaGUgTWF2ZW4gc3RhZ2luZyIKKyAgICAgICAgQ09NTUFORCAke0dSQURMRVdfRVhFQ1VUQUJMRX0gJHtHUkFETEVfT1BUU30gY2xlYW4gdXBsb2FkQXJjaGl2ZXMKKyAgICAgICAgICAgIC0tY29uc29sZT1wbGFpbiAtLW5vLWRhZW1vbgorICAgICAgICAgICAgLVByZWxlYXNlPXRydWUKKyAgICAgICAgICAgIC1QdGhyaWZ0LnZlcnNpb249JHt0aHJpZnRfVkVSU0lPTn0KKyAgICAgICAgICAgICItUGJ1aWxkLmRpcj0ke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vYnVpbGQiCisgICAgICAgIFdPUktJTkdfRElSRUNUT1JZICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfQorICAgICkKKworICAgICMgSG9vayB0aGUgQ01ha2UgaW5zdGFsbCBwcm9jZXNzIHRvIHRoZSByZXN1bHRzIGZyb20gbWFrZSBBTEwuCisgICAgIyBUaGlzIHdvcmtzIGJlc3Qgd2hlbiAnbWFrZSBhbGwgJiYgc3VkbyBtYWtlIGluc3RhbGwvZmFzdCcgaXMgdXNlZC4KKyAgICAjIFVzaW5nIHNsYXNoIHRvIGVuZCB0aGUgc291cmNlIGxvY2F0aW9uIHRvIGF2b2lkIGNvcHlpbmcgdGhlIGRpcmVjdG9yeSBwYXRoLgorICAgIGluc3RhbGwoRElSRUNUT1JZICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9idWlsZC9saWJzLworICAgICAgICAgICAgREVTVElOQVRJT04gJHtKQVZBX0lOU1RBTExfRElSfQorICAgICAgICAgICAgRklMRVNfTUFUQ0hJTkcgUEFUVEVSTiAibGlidGhyaWZ0LSR7dGhyaWZ0X1ZFUlNJT059LmphciIpCisgICAgaW5zdGFsbChESVJFQ1RPUlkgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2J1aWxkL2RlcHMvCisgICAgICAgICAgICBERVNUSU5BVElPTiAke0pBVkFfSU5TVEFMTF9ESVJ9CisgICAgICAgICAgICBGSUxFU19NQVRDSElORyBQQVRURVJOICIqLmphciIpCisgICAgaW5zdGFsbChESVJFQ1RPUlkgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2J1aWxkL2RvY3MvamF2YWRvYy8KKyAgICAgICAgICAgIERFU1RJTkFUSU9OICR7SkFWQV9ET0NfSU5TVEFMTF9ESVJ9KQorCisgICAgaWYoQlVJTERfVEVTVElORykKKyAgICAgICAgYWRkX3Rlc3QoTkFNRSBKYXZhVGVzdAorICAgICAgICAgICAgICAgIENPTU1BTkQgJHtHUkFETEVXX0VYRUNVVEFCTEV9ICR7R1JBRExFX09QVFN9IHRlc3QKKyAgICAgICAgICAgICAgICAgICAgLS1jb25zb2xlPXBsYWluIC0tbm8tZGFlbW9uCisgICAgICAgICAgICAgICAgICAgIC1QcmVsZWFzZT10cnVlCisgICAgICAgICAgICAgICAgICAgIC1QdGhyaWZ0LnZlcnNpb249JHt0aHJpZnRfVkVSU0lPTn0KKyAgICAgICAgICAgICAgICAgICAgIi1QYnVpbGQuZGlyPSR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9idWlsZCIKKyAgICAgICAgICAgICAgICAgICAgIi1QdGhyaWZ0LmNvbXBpbGVyPSR7VEhSSUZUX0NPTVBJTEVSfSIKKyAgICAgICAgICAgICAgICBXT1JLSU5HX0RJUkVDVE9SWSAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0pCisgICAgZW5kaWYoKQorZW5kaWYoQU5EUk9JRCkKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL01ha2VmaWxlLmFtIGIvbGliL2phdmEvTWFrZWZpbGUuYW0KaW5kZXggY2JlYzdhZi4uNjU5ODFjYSAxMDA2NDQKLS0tIGEvbGliL2phdmEvTWFrZWZpbGUuYW0KKysrIGIvbGliL2phdmEvTWFrZWZpbGUuYW0KQEAgLTIwLDIzICsyMCw1MyBAQAogZXhwb3J0IENMQVNTUEFUSAogCiBhbGwtbG9jYWw6Ci0JJChBTlQpICQoQU5UX0ZMQUdTKQorCS4vZ3JhZGxldyAkKEdSQURMRV9PUFRTKSBhc3NlbWJsZSBcCisJCS1QcmVsZWFzZT10cnVlIFwKKwkJLVB0aHJpZnQudmVyc2lvbj0kKFBBQ0tBR0VfVkVSU0lPTikgXAorCQktLWNvbnNvbGU9cGxhaW4KIAogaW5zdGFsbC1leGVjLWhvb2s6Ci0JJChBTlQpICQoQU5UX0ZMQUdTKSBpbnN0YWxsIC1EaW5zdGFsbC5wYXRoPSQoREVTVERJUikkKEpBVkFfUFJFRklYKSBcCi0JCS1EaW5zdGFsbC5qYXZhZG9jLnBhdGg9JChERVNURElSKSQoZG9jZGlyKS9qYXZhCisJLi9ncmFkbGV3ICQoR1JBRExFX09QVFMpIGluc3RhbGwgXAorCQktUHJlbGVhc2U9dHJ1ZSBcCisJCS1QaW5zdGFsbC5wYXRoPSQoREVTVERJUikkKEpBVkFfUFJFRklYKSBcCisJCS1QaW5zdGFsbC5qYXZhZG9jLnBhdGg9JChERVNURElSKSQoZG9jZGlyKS9qYXZhIFwKKwkJLVB0aHJpZnQudmVyc2lvbj0kKFBBQ0tBR0VfVkVSU0lPTikgXAorCQktLWNvbnNvbGU9cGxhaW4KIAotIyBNYWtlIHN1cmUgdGhpcyBkb2Vzbid0IGZhaWwgaWYgYW50IGlzIG5vdCBjb25maWd1cmVkLgogY2xlYW4tbG9jYWw6Ci0JQU5UPSQoQU5UKSA7IGlmIHRlc3QgLXogIiQkQU5UIiA7IHRoZW4gQU5UPTogOyBmaSA7IFwKLQkkJEFOVCAkKEFOVF9GTEFHUykgY2xlYW4KKwkuL2dyYWRsZXcgJChHUkFETEVfT1BUUykgY2xlYW4gLS1jb25zb2xlPXBsYWluCiAKLWNoZWNrLWxvY2FsOiBhbGwKLQkkKEFOVCkgJChBTlRfRkxBR1MpIHRlc3QKK3ByZWNyb3NzOiAkKFRIUklGVCkKKwkuL2dyYWRsZXcgJChHUkFETEVfT1BUUykgc2hhZG93SmFyIFwKKwkJLVByZWxlYXNlPXRydWUgXAorCQktUHRocmlmdC52ZXJzaW9uPSQoUEFDS0FHRV9WRVJTSU9OKSBcCisJCS1QdGhyaWZ0LmNvbXBpbGVyPSQoVEhSSUZUKSBcCisJCS0tY29uc29sZT1wbGFpbgorCitjaGVjay1sb2NhbDogJChUSFJJRlQpCisJLi9ncmFkbGV3ICQoR1JBRExFX09QVFMpIHRlc3QgXAorCQktUHJlbGVhc2U9dHJ1ZSBcCisJCS1QdGhyaWZ0LnZlcnNpb249JChQQUNLQUdFX1ZFUlNJT04pIFwKKwkJLVB0aHJpZnQuY29tcGlsZXI9JChUSFJJRlQpIFwKKwkJLS1jb25zb2xlPXBsYWluCisKK21hdmVuLXB1Ymxpc2g6CisJLi9ncmFkbGV3ICQoR1JBRExFX09QVFMpIHVwbG9hZEFyY2hpdmVzIFwKKwkJLVByZWxlYXNlPXRydWUgXAorCQktUHRocmlmdC52ZXJzaW9uPSQoUEFDS0FHRV9WRVJTSU9OKSBcCisJCS0tY29uc29sZT1wbGFpbgogCiBFWFRSQV9ESVNUID0gXAotCWJ1aWxkLnhtbCBcCi0JYnVpbGQucHJvcGVydGllcyBcCisJYnVpbGQuZ3JhZGxlIFwKKwlncmFkbGUucHJvcGVydGllcyBcCisJc2V0dGluZ3MuZ3JhZGxlIFwKKwlncmFkbGUgXAorCWdyYWRsZXcgXAorCWdyYWRsZXcuYmF0IFwKKwlDTWFrZUxpc3RzLnR4dCBcCisJY29kaW5nX3N0YW5kYXJkcy5tZCBcCisJYW5kcm9pZCBcCiAJc3JjIFwKIAl0ZXN0IFwKLQlSRUFETUUubWQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisJY29kZV9xdWFsaXR5X3Rvb2xzIFwKKwlSRUFETUUubWQKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL1JFQURNRS5tZCBiL2xpYi9qYXZhL1JFQURNRS5tZAppbmRleCA2NmJjZmE1Li4wYjVmMGQ4IDEwMDY0NAotLS0gYS9saWIvamF2YS9SRUFETUUubWQKKysrIGIvbGliL2phdmEvUkVBRE1FLm1kCkBAIC0yMCwxOCArMjAsNTkgQEAKIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKIHVuZGVyIHRoZSBMaWNlbnNlLgogCi1Vc2luZyBUaHJpZnQgd2l0aCBKYXZhCi09PT09PT09PT09PT09PT09PT09PT09CitCdWlsZGluZyBhbmQgaW5zdGFsbGluZyBmcm9tIHNvdXJjZQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworV2hlbiB1c2luZyBhIENNYWtlIGJ1aWxkIGZyb20gdGhlIHNvdXJjZSBkaXN0cmlidXRpb24gb24gTGludXggdGhlCitlYXNpZXN0IHdheSB0byBidWlsZCBhbmQgaW5zdGFsbCBpcyB0aGlzIHNpbXBsZSBjb21tYW5kIGxpbmU6CisKKyAgICBtYWtlIGFsbCAmJiBzdWRvIG1ha2UgaW5zdGFsbC9mYXN0CisKK0l0IGlzIGltcG9ydGFudCB0byB1c2UgdGhlIGluc3RhbGwvZmFzdCBvcHRpb24gdG8gZWxpbWluYXRlCit0aGUgYXV0b21hdGljIHJlYnVpbGQgYnkgZGVwZW5kZW5jeSB0aGF0IGNhdXNlcyBpc3N1ZXMgYmVjYXVzZQordGhlIGJ1aWxkIHRvb2xpbmcgaXMgZGVzaWduZWQgdG8gd29yayB3aXRoIGNhY2hlZCBmaWxlcyBpbiB0aGUKK3VzZXIgaG9tZSBkaXJlY3RvcnkgZHVyaW5nIHRoZSBidWlsZCBwcm9jZXNzLiBJbnN0ZWFkIHRoaXMgYnVpbGRzCit0aGUgY29kZSBpbiB0aGUgZXhwZWN0ZWQgbG9jYWwgYnVpbGQgdHJlZSBhbmQgdGhlbiB1c2VzIENNYWtlCitpbnN0YWxsIGNvZGUgdG8gY29weSB0byB0aGUgdGFyZ2V0IGRlc3RpbmF0aW9uLgorCitCdWlsZGluZyBUaHJpZnQgd2l0aCBHcmFkbGUgd2l0aG91dCBDTWFrZS9BdXRvY29uZgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAogVGhlIFRocmlmdCBKYXZhIHNvdXJjZSBpcyBub3QgYnVpbGQgdXNpbmcgdGhlIEdOVSB0b29scywgYnV0IHJhdGhlciB1c2VzCi10aGUgQXBhY2hlIEFudCBidWlsZCBzeXN0ZW0sIHdoaWNoIHRlbmRzIHRvIGJlIHByZWRvbWluYW50IGFtb25nc3QgSmF2YQordGhlIEdyYWRsZSBidWlsZCBzeXN0ZW0sIHdoaWNoIHRlbmRzIHRvIGJlIHByZWRvbWluYW50IGFtb25nc3QgSmF2YQogZGV2ZWxvcGVycy4KIAogVG8gY29tcGlsZSB0aGUgSmF2YSBUaHJpZnQgbGlicmFyaWVzLCBzaW1wbHkgZG8gdGhlIGZvbGxvd2luZzoKIAotICAgIGFudAorICAgIC4vZ3JhZGxldwogCi1ZZXAsIHRoYXQncyBlYXN5LiBMb29rIGZvciBsaWJ0aHJpZnQuamFyIGluIHRoZSBiYXNlIGRpcmVjdG9yeS4KK1llcCwgdGhhdCdzIGVhc3kuIExvb2sgZm9yIGxpYnRocmlmdC08dmVyc2lvbj4uamFyIGluIHRoZSBidWlsZC9saWJzIGRpcmVjdG9yeS4KKworVGhlIGRlZmF1bHQgYnVpbGQgd2lsbCBydW4gdGhlIHVuaXQgdGVzdHMgd2hpY2ggZXhwZWN0IGEgdXNhYmxlCitUaHJpZnQgY29tcGlsZXIgdG8gZXhpc3Qgb24gdGhlIHN5c3RlbS4gWW91IGhhdmUgdHdvIGNob2ljZXMgZm9yCit0aGF0LgorCisqIEJ1aWxkIHRoZSBUaHJpZnQgZXhlY3V0YWJsZSBmcm9tIHNvdXJjZSBhdCB0aGUgZGVmYXVsdAorICBsb2NhdGlvbiBpbiB0aGUgc291cmNlIHRyZWUuIFRoZSBwcm9qZWN0IGlzIGNvbmZpZ3VyZWQKKyAgdG8gbG9vayBmb3IgaXQgdGhlcmUuCisqIEluc3RhbGwgdGhlIHB1Ymxpc2hlZCBiaW5hcnkgZGlzdHJpYnV0aW9uIHRvIGhhdmUgVGhyaWZ0CisgIGV4ZWN1dGFibGUgaW4gYSBrbm93biBsb2NhdGlvbiBhbmQgYWRkIHRoZSBwYXRoIHRvIHRoZQorICB+Ly5ncmFkbGUvZ3JhZGxlLnByb3BlcnRpZXMgZmlsZSB1c2luZyB0aGUgcHJvcGVydHkgbmFtZQorICAidGhyaWZ0LmNvbXBpbGVyIi4gRm9yIGV4YW1wbGUgdGhpcyB3b3VsZCBzZXQgdGhlIHBhdGggaW4KKyAgYSBXaW5kb3dzIGJveCBpZiBUaHJpZnQgd2FzIGluc3RhbGxlZCB1bmRlciBDOlxUaHJpZnQKKworICAgIHRocmlmdC5jb21waWxlcj1DOi9UaHJpZnQvdGhyaWZ0LmV4ZQorCitUbyBqdXN0IGJ1aWxkIHRoZSBsaWJyYXJ5IHdpdGhvdXQgcnVubmluZyB1bml0IHRlc3RzIHlvdSBzaW1wbHkgZG8gdGhpcy4KKworICAgIC4vZ3JhZGxldyBhc3NlbWJsZQorCitUbyBpbnN0YWxsIHRoZSBsaWJyYXJ5IGluIHRoZSBsb2NhbCBNYXZlbiByZXBvc2l0b3J5IGxvY2F0aW9uCit3aGVyZSBvdGhlciBNYXZlbiBvciBHcmFkbGUgYnVpbGRzIGNhbiByZWZlcmVuY2UgaXQgc2ltcGx5IGRvIHRoaXMuCisKKyAgICAuL2dyYWRsZXcgaW5zdGFsbAorCitUaGUgbGlicmFyeSB3aWxsIGJlIHBsYWNlZCBpbiB5b3VyIGhvbWUgZGlyZWN0b3J5IHVuZGVyIC5tMi9yZXBvc2l0b3J5CiAKIFRvIGluY2x1ZGUgVGhyaWZ0IGluIHlvdXIgYXBwbGljYXRpb25zIHNpbXBseSBhZGQgbGlidGhyaWZ0LmphciB0byB5b3VyCiBjbGFzc3BhdGgsIG9yIGluc3RhbGwgaWYgaW4geW91ciBkZWZhdWx0IHN5c3RlbSBjbGFzc3BhdGggb2YgY2hvaWNlLgpAQCAtMzksMTUgKzgwLDk3IEBACiAKIEJ1aWxkIFRocmlmdCBiZWhpbmQgYSBwcm94eToKIAotICAgIGFudCAtRHByb3h5LmVuYWJsZWQ9MSAtRHByb3h5Lmhvc3Q9bXlwcm94eWhvc3QgLURwcm94eS51c2VyPXRocmlmdHVzZXIgLURwcm94eS5wYXNzPXRvcHNlY3JldAorICAgIC4vZ3JhZGxldyAtRGh0dHAucHJveHlIb3N0PW15cHJveHlob3N0IC1EaHR0cC5wcm94eVBvcnQ9ODA4MCAtRGh0dHAucHJveHlVc2VyPXRocmlmdHVzZXIgLURodHRwLnByb3h5UGFzc3dvcmQ9dG9wc2VjcmV0CiAKIG9yIHZpYQogCi0gICAgLi9jb25maWd1cmUgLS13aXRoLWphdmEgQU5UX0ZMQUdTPSctRHByb3h5LmVuYWJsZWQ9MSAtRHByb3h5Lmhvc3Q9bXlwcm94eWhvc3QgLURwcm94eS51c2VyPXRocmlmdHVzZXIgLURwcm94eS5wYXNzPXRvcHNlY3JldCcKKyAgICAuL2NvbmZpZ3VyZSAtLXdpdGgtamF2YSBHUkFETEVfT1BUUz0nLURodHRwLnByb3h5SG9zdD1teXByb3h5aG9zdCAtRGh0dHAucHJveHlQb3J0PTgwODAgLURodHRwLnByb3h5VXNlcj10aHJpZnR1c2VyIC1EaHR0cC5wcm94eVBhc3N3b3JkPXRvcHNlY3JldCcKKworCitVbml0IFRlc3QgSFRNTCBSZXBvcnRzCis9PT09PT09PT09PT09PT09PT09PT09CisKK1RoZSBidWlsZCB3aWxsIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUgYW4gSFRNTCBVbml0IFRlc3QgcmVwb3J0LiBUaGlzIGNhbiBiZSBmb3VuZAordW5kZXIgYnVpbGQvcmVwb3J0cy90ZXN0cy90ZXN0L2luZGV4Lmh0bWwuIEl0IGNhbiBiZSB2aWV3ZWQgd2l0aCBhIGJyb3dzZXIKK2RpcmVjdGx5IGZyb20gdGhhdCBsb2NhdGlvbi4KKworCitDbG92ZXIgQ29kZSBDb3ZlcmFnZSBmb3IgVGhyaWZ0Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoZSBidWlsZCB3aWxsIG9wdGlvbmFsbHkgZ2VuZXJhdGUgQ2xvdmVyIENvZGUgY292ZXJhZ2UgaWYgdGhlIEdyYWRsZSBwcm9wZXJ0eQorYGNsb3ZlckVuYWJsZWQ9dHJ1ZWAgaXMgc2V0IGluIH4vLmdyYWRsZS9ncmFkbGUucHJvcGVydGllcyBvciBvbiB0aGUgY29tbWFuZCBsaW5lCit2aWEgYC1QY2xvdmVyRW5hYmxlZD10cnVlYC4gVGhlIGdlbmVyYXRlZCByZXBvcnQgY2FuIGJlIGZvdW5kIHVuZGVyIHRoZSBsb2NhdGlvbgorYnVpbGQvcmVwb3J0cy9jbG92ZXIvaHRtbC9pbmRleC5odG1sLiBJdCBjYW4gYmUgdmlld2VkIHdpdGggYSBicm93c2VyCitkaXJlY3RseSBmcm9tIHRoYXQgbG9jYXRpb24uIEFkZGl0aW9uYWxseSwgYSBQREYgcmVwb3J0IGlzIGdlbmVyYXRlZCBhbmQgaXMgZm91bmQKK3VuZGVyIHRoZSBsb2NhdGlvbiBidWlsZC9yZXBvcnRzL2Nsb3Zlci9jbG92ZXIucGRmLgorCitUaGUgZm9sbG93aW5nIGNvbW1hbmQgd2lsbCBidWlsZCwgdW5pdCB0ZXN0LCBhbmQgZ2VuZXJhdGUgQ2xvdmVyIHJlcG9ydHM6CisKKyAgICAuL2dyYWRsZXcgLVBjbG92ZXJFbmFibGVkPXRydWUKKworCitQdWJsaXNoaW5nIE1hdmVuIEFydGlmYWN0cyB0byBNYXZlbiBDZW50cmFsCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoZSBBdXRvbWFrZSBidWlsZCBnZW5lcmF0ZXMgYSBNYWtlZmlsZSB0aGF0IHByb3ZpZGVzIHRoZSBjb3JyZWN0IHBhcmFtZXRlcnMKK3doZW4geW91IHJ1biB0aGUgYnVpbGQgcHJvdmlkZWQgdGhlIGNvbmZpZ3VyZS5hYyBoYXMgYmVlbiBzZXQgd2l0aCB0aGUgY29ycmVjdAordmVyc2lvbiBudW1iZXIuIFRoZSBHcmFkbGUgYnVpbGQgd2lsbCByZWNlaXZlIHRoZSBjb3JyZWN0IHZhbHVlIGZvciB0aGUgYnVpbGQuCitUaGUgc2FtZSBhcHBsaWVzIHRvIHRoZSBDTWFrZSBidWlsZCwgdGhlIHZhbHVlIGZyb20gdGhlIGNvbmZpZ3VyZS5hYyBmaWxlIHdpbGwKK2JlIHVzZWQgaWYgeW91IGV4ZWN1dGUgdGhlc2UgY29tbWFuZHM6CisKKyAgICBtYWtlIG1hdmVuLXB1Ymxpc2ggICAtLSBUaGlzIGlzIGZvciBhbiBBdXRvbWFrZSBMaW51eCBidWlsZAorICAgIG1ha2UgTWF2ZW5QdWJsaXNoICAgIC0tIFRoaXMgaXMgZm9yIGEgQ01ha2UgZ2VuZXJhdGVkIGJ1aWxkCisKK1RoZSB1cGxvYWRBcmNoaXZlcyB0YXNrIGluIEdyYWRsZSBpcyBwcmVjb25maWd1cmVkIHdpdGggYWxsIG5lY2Vzc2FyeSBkZXRhaWxzCit0byBzaWduIGFuZCBwdWJsaXNoIHRoZSBhcnRpZmFjdHMgZnJvbSB0aGUgYnVpbGQgdG8gdGhlIEFwYWNoZSBNYXZlbiBzdGFnaW5nCityZXBvc2l0b3J5LiBUaGUgdGFzayByZXF1aXJlcyB0aGUgZm9sbG93aW5nIGV4dGVybmFsbHkgcHJvdmlkZWQgcHJvcGVydGllcyB0bworYXV0aGVudGljYXRlIHRvIHRoZSByZXBvc2l0b3J5IGFuZCBzaWduIHRoZSBhcnRpZmFjdHMuIFRoZSBwcmVmZXJyZWQgYXBwcm9hY2gKK2lzIHRvIGNyZWF0ZSBvciBlZGl0IHRoZSB+Ly5ncmFkbGUvZ3JhZGxlLnByb3BlcnRpZXMgZmlsZSBhbmQgYWRkIHRoZSBmb2xsb3dpbmcKK3Byb3BlcnRpZXMgdG8gaXQuCisKKyAgICAjIFNpZ25pbmcga2V5IGluZm9ybWF0aW9uIGZvciBhcnRpZmFjdHMgUEdQIHNpZ25hdHVyZSAodmFsdWVzIGFyZSBleGFtcGxlcykKKyAgICBzaWduaW5nLmtleUlkPTI0ODc1RDczCisgICAgc2lnbmluZy5wYXNzd29yZD1zZWNyZXQKKyAgICBzaWduaW5nLnNlY3JldEtleVJpbmdGaWxlPS9Vc2Vycy9tZS8uZ251cGcvc2VjcmluZy5ncGcKKworICAgICMgQXBhY2hlIE1hdmVuIHN0YWdpbmcgcmVwb3NpdG9yeSB1c2VyIGNyZWRlbnRpYWxzCisgICAgbWF2ZW5Vc2VyPW1lTXlzZWxmQW5kSQorICAgIG1hdmVuUGFzc3dvcmQ9TXlTdXBlckF3ZXNvbWVTZWNyZXRQYXNzd29yZAorCitJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIG1hbnVhbGx5IHB1Ymxpc2ggdXNpbmcgdGhlIEdyYWRsZSBidWlsZCBkaXJlY3RseS4KK1dpdGggdGhlIGtleSBpbmZvcm1hdGlvbiBhbmQgY3JlZGVudGlhbHMgaW4gcGxhY2UgdGhlIGZvbGxvd2luZyB3aWxsIGdlbmVyYXRlCitpZiBuZWVkZWQgdGhlIGJ1aWxkIGFydGlmYWN0cyBhbmQgcHJvY2VlZCB0byBwdWJsaXNoIHRoZSByZXN1bHRzLgorCisgICAgLi9ncmFkbGV3IC1QcmVsZWFzZT10cnVlIC1QdGhyaWZ0LnZlcnNpb249MC4xMS4wIHVwbG9hZEFyY2hpdmVzCisKK0l0IGlzIGFsc28gcG9zc2libGUgdG8gb3ZlcnJpZGUgdGhlIHRhcmdldCByZXBvc2l0b3J5IGZvciB0aGUgTWF2ZW4gUHVibGljYXRpb24KK2J5IHVzaW5nIGEgR3JhZGxlIHByb3BlcnR5LCBmb3IgZXhhbXBsZSB5b3UgY2FuIHB1Ymxpc2ggc2lnbmVkIEpBUiBmaWxlcyB0byB5b3VyCitjb21wYW55IGludGVybmFsIHNlcnZlciBpZiB5b3UgYWRkIHRoaXMgdG8gdGhlIGNvbW1hbmQgbGluZSBvciBpbiB0aGUKK34vLmdyYWRsZS9ncmFkbGUucHJvcGVydGllcyBmaWxlLiBUaGUgVVJMIGJlbG93IGFzc3VtZXMgYSBOZXh1cyBSZXBvc2l0b3J5LgorCisgICAgbWF2ZW4tcmVwb3NpdG9yeS11cmw9aHR0cHM6Ly9teS5jb21wYW55LmNvbS9zZXJ2aWNlL2xvY2FsL3N0YWdpbmcvZGVwbG95L21hdmVuMgorCitPciB0aGUgc2FtZSBvbiB0aGUgY29tbWFuZCBsaW5lOgorCisgICAgLi9ncmFkbGV3IC1QbWF2ZW4tcmVwb3NpdG9yeS11cmw9aHR0cHM6Ly9teS5jb21wYW55LmNvbS9zZXJ2aWNlL2xvY2FsL3N0YWdpbmcvZGVwbG95L21hdmVuMiAtUHJlbGVhc2U9dHJ1ZSAtUHRocmlmdC52ZXJzaW9uPTAuMTEuMCB1cGxvYWRBcmNoaXZlcwogCiAKIERlcGVuZGVuY2llcwogPT09PT09PT09PT09CiAKLUFwYWNoZSBBbnQKLWh0dHA6Ly9hbnQuYXBhY2hlLm9yZy8KK0dyYWRsZQoraHR0cDovL2dyYWRsZS5vcmcvCisKKyMgQnJlYWtpbmcgQ2hhbmdlcworCisjIyAwLjEyLjAKKworVGhlIGFjY2VzcyBtb2RpZmllciBvZiB0aGUgQXV0b0V4cGFuZGluZ0J1ZmZlciBjbGFzcyBoYXMgYmVlbiBjaGFuZ2VkIGZyb20KK3B1YmxpYyB0byBkZWZhdWx0IChwYWNrYWdlKSBhbmQgd2lsbCBubyBsb25nZXIgYmUgYWNjZXNzaWJsZSBieSB0aGlyZC1wYXJ0eQorbGlicmFyaWVzLgorCitUaGUgYWNjZXNzIG1vZGlmaWVyIG9mIHRoZSBTaG9ydFN0YWNrIGNsYXNzIGhhcyBiZWVuIGNoYW5nZWQgZnJvbQorcHVibGljIHRvIGRlZmF1bHQgKHBhY2thZ2UpIGFuZCB3aWxsIG5vIGxvbmdlciBiZSBhY2Nlc3NpYmxlIGJ5IHRoaXJkLXBhcnR5CitsaWJyYXJpZXMuCisKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL2FuZHJvaWQvYnVpbGQuZ3JhZGxlIGIvbGliL2phdmEvYW5kcm9pZC9idWlsZC5ncmFkbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk5ODQyMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL2FuZHJvaWQvYnVpbGQuZ3JhZGxlCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworYXBwbHkgcGx1Z2luOiAnY29tLmFuZHJvaWQubGlicmFyeScKKworYW5kcm9pZCB7CisgICAgY29tcGlsZVNka1ZlcnNpb24gMjMKKyAgICBidWlsZFRvb2xzVmVyc2lvbiAiMjMuMC4xIgorICAgIHVzZUxpYnJhcnkgJ29yZy5hcGFjaGUuaHR0cC5sZWdhY3knCisgICAgc291cmNlU2V0cy5tYWluLmphdmEgeworICAgICAgICBzcmNEaXIgJy4uL3NyYycKKyAgICAgICAgZXhjbHVkZSAnb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTYXNsQ2xpZW50VHJhbnNwb3J0LmphdmEnCisgICAgICAgIGV4Y2x1ZGUgJ29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2FzbFNlcnZlclRyYW5zcG9ydC5qYXZhJworICAgICAgICBleGNsdWRlICdvcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNhc2xUcmFuc3BvcnQuamF2YScKKyAgICB9Cit9CisKK3JlcG9zaXRvcmllcyB7CisgICAgbWF2ZW5DZW50cmFsKCkKK30KK2RlcGVuZGVuY2llcyB7CisgICAgY29tcGlsZSAnb3JnLnNsZjRqOnNsZjRqLWFwaToxLjcuMTMnCisgICAgY29tcGlsZSAnamF2YXguc2VydmxldDpzZXJ2bGV0LWFwaToyLjUnCisgICAgY29tcGlsZSAnb3JnLmFwYWNoZS5odHRwY29tcG9uZW50czpodHRwY29yZTo0LjQuNCcKK30KKworYnVpbGRzY3JpcHQgeworICAgIHJlcG9zaXRvcmllcyB7CisgICAgICAgIG1hdmVuQ2VudHJhbCgpCisgICAgfQorICAgIGRlcGVuZGVuY2llcyB7CisgICAgICAgIGNsYXNzcGF0aCAnY29tLmFuZHJvaWQudG9vbHMuYnVpbGQ6Z3JhZGxlOjEuNS4wJworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL2FuZHJvaWQvc2V0dGluZ3MuZ3JhZGxlIGIvbGliL2phdmEvYW5kcm9pZC9zZXR0aW5ncy5ncmFkbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVlOTdiZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL2FuZHJvaWQvc2V0dGluZ3MuZ3JhZGxlCkBAIC0wLDAgKzEgQEAKK3Jvb3RQcm9qZWN0Lm5hbWU9J3RocmlmdCcKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL2FuZHJvaWQvc3JjL21haW4vQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2xpYi9qYXZhL2FuZHJvaWQvc3JjL21haW4vQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2FiZGI3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvYW5kcm9pZC9zcmMvbWFpbi9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxtYW5pZmVzdCBwYWNrYWdlPSJvcmcuYXBhY2hlLnRocmlmdCI+CisgIDxhcHBsaWNhdGlvbiAvPgorPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL2J1aWxkLmdyYWRsZSBiL2xpYi9qYXZhL2J1aWxkLmdyYWRsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzAyZjc3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvYnVpbGQuZ3JhZGxlCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gVXNpbmcgdGhlIGxlZ2FjeSBwbHVnaW4gY2xhc3NwYXRoIGZvciBDbG92ZXIgc28gaXQgY2FuIGJlIGxvYWRlZCBvcHRpb25hbGx5CitidWlsZHNjcmlwdCB7CisgICAgcmVwb3NpdG9yaWVzIHsKKyAgICAgICAgZ29vZ2xlKCkKKyAgICAgICAgamNlbnRlcigpCisgICAgICAgIGdyYWRsZVBsdWdpblBvcnRhbCgpCisgICAgfQorCisgICAgZGVwZW5kZW5jaWVzIHsKKyAgICAgICAgY2xhc3NwYXRoICdjb20uYm11c2Noa286Z3JhZGxlLWNsb3Zlci1wbHVnaW46Mi4yLjAnCisgICAgfQorfQorCitwbHVnaW5zIHsKKyAgICBpZCAnamF2YScKKyAgICBpZCAnbWF2ZW4nCisgICAgaWQgJ3NpZ25pbmcnCisgICAgaWQgJ2NvbS5naXRodWIuam9obnJlbmdlbG1hbi5zaGFkb3cnIHZlcnNpb24gJzIuMC4yJworfQorCitkZXNjcmlwdGlvbiA9ICdBcGFjaGUgVGhyaWZ0IEphdmEgTGlicmFyeScKKworZGVmYXVsdFRhc2tzICdidWlsZCcKKworLy8gVmVyc2lvbiBjb21wb25lbnRzIGZvciB0aGlzIHByb2plY3QKK2dyb3VwID0gcHJvcGVydHkoJ3RocmlmdC5ncm91cGlkJykKKworLy8gRHJvcCB0aGUgLWRldiBzdWZmaXgsIHdlIHVzZSB0aGUgU05BUFNIT1Qgc3VmZml4IGZvciBub24tcmVsZWFzZSB2ZXJzaW9ucworZGVmIHBhcnNlZFZlcnNpb24gPSBwcm9wZXJ0eSgndGhyaWZ0LnZlcnNpb24nKS50b1N0cmluZygpLnJlcGxhY2UoJy1kZXYnLCAnJykKK2lmIChCb29sZWFuLnBhcnNlQm9vbGVhbihwcm9qZWN0LnJlbGVhc2UpKSB7CisgICAgdmVyc2lvbiA9IHBhcnNlZFZlcnNpb24KK30gZWxzZSB7CisgICAgdmVyc2lvbiA9IHBhcnNlZFZlcnNpb24gKyAnLVNOQVBTSE9UJworfQorCisvLyBLZWVwaW5nIHRoZSByZXN0IG9mIHRoZSBidWlsZCBsb2dpYyBpbiBmdW5jdGlvbmFsIG5hbWVkIHNjcmlwdHMgZm9yIGNsYXJpdHkKK2FwcGx5IGZyb206ICdncmFkbGUvZW52aXJvbm1lbnQuZ3JhZGxlJworYXBwbHkgZnJvbTogJ2dyYWRsZS9zb3VyY2VDb25maWd1cmF0aW9uLmdyYWRsZScKK2FwcGx5IGZyb206ICdncmFkbGUvYWRkaXRpb25hbEFydGlmYWN0cy5ncmFkbGUnCithcHBseSBmcm9tOiAnZ3JhZGxlL2dlbmVyYXRlVGVzdFRocmlmdC5ncmFkbGUnCithcHBseSBmcm9tOiAnZ3JhZGxlL3VuaXRUZXN0cy5ncmFkbGUnCithcHBseSBmcm9tOiAnZ3JhZGxlL2Nsb3ZlckNvdmVyYWdlLmdyYWRsZScKK2FwcGx5IGZyb206ICdncmFkbGUvZnVuY3Rpb25hbFRlc3RzLmdyYWRsZScKK2FwcGx5IGZyb206ICdncmFkbGUvcHVibGlzaGluZy5ncmFkbGUnCithcHBseSBmcm9tOiAnZ3JhZGxlL2NvZGVRdWFsaXR5Q2hlY2tzLmdyYWRsZScKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL2J1aWxkLnByb3BlcnRpZXMgYi9saWIvamF2YS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWEyMTc5Li4wMDAwMDAwCi0tLSBhL2xpYi9qYXZhL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi10aHJpZnQudmVyc2lvbj0wLjkuMgotdGhyaWZ0Lmdyb3VwaWQ9b3JnLmFwYWNoZS50aHJpZnQKLXJlbGVhc2U9dHJ1ZQotCi0jIEphciBWZXJzaW9ucyAKLW12bi5hbnQudGFzay52ZXJzaW9uPTIuMS4zCi0KLSMgTG9jYWwgSW5zdGFsbCBwYXRocwotaW5zdGFsbC5wYXRoPS91c3IvbG9jYWwvbGliCi1pbnN0YWxsLmphdmFkb2MucGF0aD0ke2luc3RhbGwucGF0aH0KLQotIyBNYXZlbiBkZXBlbmRlbmN5IGRvd25sb2FkIGxvY2F0aW9ucwotbXZuLnJlcG89aHR0cDovL3JlcG8xLm1hdmVuLm9yZy9tYXZlbjIKLWFwYWNoZS5yZXBvPWh0dHBzOi8vcmVwb3NpdG9yeS5hcGFjaGUub3JnL2NvbnRlbnQvcmVwb3NpdG9yaWVzL3JlbGVhc2VzCi1tdm4uYW50LnRhc2sudXJsPSR7bXZuLnJlcG99L29yZy9hcGFjaGUvbWF2ZW4vbWF2ZW4tYW50LXRhc2tzLyR7bXZuLmFudC50YXNrLnZlcnNpb259Ci1tdm4uYW50LnRhc2suamFyPW1hdmVuLWFudC10YXNrcy0ke212bi5hbnQudGFzay52ZXJzaW9ufS5qYXIKLQotIyBBcGFjaGUgTWF2ZW4gcHVibGlzaCAKLWxpY2Vuc2U9aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLnR4dAotbWF2ZW4tcmVwb3NpdG9yeS11cmw9aHR0cHM6Ly9yZXBvc2l0b3J5LmFwYWNoZS5vcmcvc2VydmljZS9sb2NhbC9zdGFnaW5nL2RlcGxveS9tYXZlbjIKLW1hdmVuLXJlcG9zaXRvcnktaWQ9YXBhY2hlLnJlbGVhc2VzLmh0dHBzCi0KLSMgSmFyIFZlcnNpb25zIAotbXZuLmFudC50YXNrLnZlcnNpb249Mi4xLjMKLQotIyBEZXBlbmRlbmN5IHZlcnNpb25zCi1odHRwY2xpZW50LnZlcnNpb249NC4yLjUKLWh0dHBjb3JlLnZlcnNpb249NC4yLjQKLXNsZjRqLnZlcnNpb249MS41LjgKLXNlcnZsZXQudmVyc2lvbj0yLjUKLQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvYnVpbGQueG1sIGIvbGliL2phdmEvYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZGQwZWE2Li4wMDAwMDAwCi0tLSBhL2xpYi9qYXZhL2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQxNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gCi0gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gCi0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci08cHJvamVjdCBuYW1lPSJsaWJ0aHJpZnQiIGRlZmF1bHQ9ImRpc3QiIGJhc2VkaXI9Ii4iCi0gIHhtbG5zOmFydGlmYWN0PSJhbnRsaWI6b3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5hbnQiPgotICAKLSAgPGRlc2NyaXB0aW9uPlRocmlmdCBCdWlsZCBGaWxlPC9kZXNjcmlwdGlvbj4KLSAgPHByb3BlcnR5IG5hbWU9InRocmlmdC5yb290IiBsb2NhdGlvbj0iLi4vLi4vIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJ0aHJpZnQuYXJ0aWZhY3RpZCIgdmFsdWU9ImxpYnRocmlmdCIvPgotCi0gIDwhLS0gSW5jbHVkZSB0aGUgYmFzZSBwcm9wZXJ0aWVzIGZpbGUgLS0+Ci0gIDxwcm9wZXJ0eSBmaWxlPSIke2Jhc2VkaXJ9L2J1aWxkLnByb3BlcnRpZXMiIC8+Ci0KLSAgPHByb3BlcnR5IGVudmlyb25tZW50PSJlbnYiLz4KLQotICA8Y29uZGl0aW9uIHByb3BlcnR5PSJ2ZXJzaW9uIiB2YWx1ZT0iJHt0aHJpZnQudmVyc2lvbn0iPgotICAgIDxpc3NldCBwcm9wZXJ0eT0icmVsZWFzZSIvPgotICA8L2NvbmRpdGlvbj4KLSAgPHByb3BlcnR5IG5hbWU9InZlcnNpb24iIHZhbHVlPSIke3RocmlmdC52ZXJzaW9ufS1zbmFwc2hvdCIvPiAKLQotICA8cHJvcGVydHkgbmFtZT0iZmluYWwubmFtZSIgdmFsdWU9IiR7dGhyaWZ0LmFydGlmYWN0aWR9LSR7dmVyc2lvbn0iLz4KLQotICA8cHJvcGVydHkgbmFtZT0ic3JjIiBsb2NhdGlvbj0iJHtiYXNlZGlyfS9zcmMiLz4KLSAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmRpciIgbG9jYXRpb249IiR7YmFzZWRpcn0vYnVpbGQiLz4KLSAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmxpYi5kaXIiIGxvY2F0aW9uPSIke2J1aWxkLmRpcn0vbGliIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC50b29scy5kaXIiIGxvY2F0aW9uPSIke2J1aWxkLmRpcn0vdG9vbHMiLz4KLSAgPHByb3BlcnR5IG5hbWU9InNyYy50ZXN0IiBsb2NhdGlvbj0idGVzdCIvPgotICA8cHJvcGVydHkgbmFtZT0iamF2YWRvYy5kaXIiIGxvY2F0aW9uPSIke2J1aWxkLmRpcn0vamF2YWRvYyIvPgotICA8cHJvcGVydHkgbmFtZT0iYnVpbGQudGVzdC5kaXIiIGxvY2F0aW9uPSIke2J1aWxkLmRpcn0vdGVzdCIvPgotICA8cHJvcGVydHkgbmFtZT0idGVzdC50aHJpZnQuaG9tZSIgbG9jYXRpb249IiR7dGhyaWZ0LnJvb3R9L3Rlc3QiLz4KLQotICA8cHJvcGVydHkgbmFtZT0iZ2VuIiBsb2NhdGlvbj0iZ2VuLWphdmEiLz4KLSAgPHByb3BlcnR5IG5hbWU9ImdlbmJlYW4iIGxvY2F0aW9uPSJnZW4tamF2YWJlYW4iLz4KLSAgPHByb3BlcnR5IG5hbWU9ImdlbnJldXNlIiBsb2NhdGlvbj0iZ2VuLWphdmFyZXVzZSIvPgotICA8cHJvcGVydHkgbmFtZT0iZ2VuZnVsbGNhbWVsIiBsb2NhdGlvbj0iZ2VuLWZ1bGxjYW1lbCIvPgotCi0gIDxwcm9wZXJ0eSBuYW1lPSJqYXIuZmlsZSIgbG9jYXRpb249IiR7YnVpbGQuZGlyfS8ke2ZpbmFsLm5hbWV9LmphciIvPgotICA8cHJvcGVydHkgbmFtZT0idGVzdC5qYXIuZmlsZSIgbG9jYXRpb249IiR7YnVpbGQuZGlyfS8ke2ZpbmFsLm5hbWV9LXRlc3QuamFyIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJqYXZhZG9jLmphci5maWxlIiBsb2NhdGlvbj0iJHtidWlsZC5kaXJ9LyR7ZmluYWwubmFtZX0tamF2YWRvYy5qYXIiLz4KLSAgPHByb3BlcnR5IG5hbWU9InNvdXJjZS5qYXIuZmlsZSIgbG9jYXRpb249IiR7YnVpbGQuZGlyfS8ke2ZpbmFsLm5hbWV9LXNvdXJjZXMuamFyIi8+Ci0KLSAgPCEtLSBKdW5pdCBwcm9wZXJ0aWVzIC0tPgotICA8cHJvcGVydHkgbmFtZT0idGVzdC5qdW5pdC5vdXRwdXQuZm9ybWF0IiB2YWx1ZT0icGxhaW4iLz4KLSAgPHByb3BlcnR5IG5hbWU9InRlc3QudGltZW91dCIgdmFsdWU9IjIwMDAwMDAiLz4KLSAgPHByb3BlcnR5IG5hbWU9InRlc3Quc3JjLmRpciIgbG9jYXRpb249IiR7YmFzZWRpcn0vdGVzdCIvPgotICA8cHJvcGVydHkgbmFtZT0idGVzdC5sb2cuZGlyIiB2YWx1ZT0iJHtidWlsZC50ZXN0LmRpcn0vbG9nIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0LnBvcnQiIHZhbHVlPSI5MDkwIi8+IAotCi0gIDwhLS0gbWF2ZW4gcHJvcGVydGllcyAtLT4KLSAgPHByb3BlcnR5IG5hbWU9InBvbS54bWwiIGxvY2F0aW9uPSIke2J1aWxkLmRpcn0vJHtmaW5hbC5uYW1lfS5wb20iLz4KLQotICA8cGF0aCBpZD0iY29tcGlsZS5jbGFzc3BhdGgiPgotICAgIDxmaWxlc2V0IGRpcj0iJHtidWlsZC5saWIuZGlyfSI+IAotICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5qYXIiLz4KLSAgICA8L2ZpbGVzZXQ+Ci0gIDwvcGF0aD4KLQotICA8cGF0aCBpZD0idGVzdC5jbGFzc3BhdGgiPgotICAgIDxwYXRoIHJlZmlkPSJjb21waWxlLmNsYXNzcGF0aCIvPgotICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke2Vudi5DTEFTU1BBVEh9Ii8+Ci0gICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2J1aWxkLnRlc3QuZGlyfSIvPgotICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtqYXIuZmlsZX0iLz4KLSAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7dGVzdC5qYXIuZmlsZX0iLz4KLQotICA8L3BhdGg+Ci0KLSAgPCEtLSBUYXNrcyAtLT4gCi0gIDx0YXJnZXQgbmFtZT0iaW5pdCIgZGVwZW5kcz0ic2V0dXAuaW5pdCxtdm4uaW5pdCIgdW5sZXNzPSJpbml0LmZpbmlzaGVkIj4KLSAgICA8cHJvcGVydHkgbmFtZT0iaW5pdC5maW5pc2hlZCIgdmFsdWU9InRydWUiLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJzZXR1cC5pbml0Ij4KLSAgICA8dHN0YW1wLz4KLSAgICA8bWtkaXIgZGlyPSIke2J1aWxkLmRpcn0iLz4KLSAgICA8bWtkaXIgZGlyPSIke2J1aWxkLmxpYi5kaXJ9Ii8+Ci0gICAgPG1rZGlyIGRpcj0iJHtidWlsZC50b29scy5kaXJ9Ii8+Ci0gICAgPG1rZGlyIGRpcj0iJHtidWlsZC50ZXN0LmRpcn0iLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJjb21waWxlIiBkZXBlbmRzPSJpbml0Ij4KLSAgICA8amF2YWMgc3JjZGlyPSIke3NyY30iIGRlc3RkaXI9IiR7YnVpbGQuZGlyfSIgc291cmNlPSIxLjUiIHRhcmdldD0iMS41IiAKLSAgICBkZWJ1Zz0idHJ1ZSIgY2xhc3NwYXRocmVmPSJjb21waWxlLmNsYXNzcGF0aCIgaW5jbHVkZWFudHJ1bnRpbWU9ImZhbHNlIiBlbmNvZGluZz0iVVRGLTgiPgotICAgICAgPGNvbXBpbGVyYXJnIHZhbHVlPSItWGxpbnQ6dW5jaGVja2VkIi8+Ci0gICAgPC9qYXZhYz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJqYXZhZG9jIiBkZXBlbmRzPSJpbml0Ij4KLSAgICA8amF2YWRvYyBzb3VyY2VwYXRoPSIke3NyY30iIGRlc3RkaXI9IiR7amF2YWRvYy5kaXJ9IgotICAgICAgdmVyc2lvbj0idHJ1ZSIgd2luZG93dGl0bGU9IlRocmlmdCBKYXZhIEFQSSIgZG9jdGl0bGU9IlRocmlmdCBKYXZhIEFQSSIKLSAgICAgIGNsYXNzcGF0aHJlZj0idGVzdC5jbGFzc3BhdGgiPgotICAgIDwvamF2YWRvYz4KLSAgICA8amFyIGphcmZpbGU9IiR7amF2YWRvYy5qYXIuZmlsZX0iIGJhc2VkaXI9IiR7amF2YWRvYy5kaXJ9Ij4KLSAgICAgIDxtYW5pZmVzdD4KLSAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJJbXBsZW1lbnRhdGlvbi1WZXJzaW9uIiB2YWx1ZT0iJHt2ZXJzaW9ufSIvPgotICAgICAgPC9tYW5pZmVzdD4KLSAgICA8L2phcj4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJkaXN0IiBkZXBlbmRzPSJjb21waWxlIj4KLSAgICA8bWtkaXIgZGlyPSIke2J1aWxkLmRpcn0vTUVUQS1JTkYiLz4KLSAgICA8Y29weSBmaWxlPSIke3RocmlmdC5yb290fS9MSUNFTlNFIiB0b2ZpbGU9IiR7YnVpbGQuZGlyfS9NRVRBLUlORi9MSUNFTlNFLnR4dCIvPgotICAgIDxjb3B5IGZpbGU9IiR7dGhyaWZ0LnJvb3R9L05PVElDRSIgdG9maWxlPSIke2J1aWxkLmRpcn0vTUVUQS1JTkYvTk9USUNFLnR4dCIvPgotICAgIDxqYXIgamFyZmlsZT0iJHtqYXIuZmlsZX0iPgotICAgICAgPG1hbmlmZXN0PgotICAgICAgICA8YXR0cmlidXRlIG5hbWU9IkltcGxlbWVudGF0aW9uLVZlcnNpb24iIHZhbHVlPSIke3ZlcnNpb259Ii8+Ci0gICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iQnVuZGxlLU1hbmlmZXN0VmVyc2lvbiIgdmFsdWU9IjIiLz4KLSAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJCdW5kbGUtU3ltYm9saWNOYW1lIiB2YWx1ZT0iJHt0aHJpZnQuZ3JvdXBpZH0iLz4KLSAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJCdW5kbGUtTmFtZSIgdmFsdWU9IkFwYWNoZSBUaHJpZnQiLz4KLSAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJCdW5kbGUtVmVyc2lvbiIgdmFsdWU9IiR7dmVyc2lvbn0iLz4KLSAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJCdW5kbGUtRGVzY3JpcHRpb24iIHZhbHVlPSJBcGFjaGUgVGhyaWZ0IGxpYnJhcnkiLz4KLSAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJCdW5kbGUtTGljZW5zZSIgdmFsdWU9IiR7bGljZW5zZX0iLz4KLSAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJCdW5kbGUtQWN0aXZhdGlvblBvbGljeSIgdmFsdWU9ImxhenkiLz4KLSAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJFeHBvcnQtUGFja2FnZSIgdmFsdWU9IiR7dGhyaWZ0Lmdyb3VwaWR9LmFzeW5jO3VzZXM6PSZxdW90OyR7dGhyaWZ0Lmdyb3VwaWR9LnByb3RvY29sLCR7dGhyaWZ0Lmdyb3VwaWR9LnRyYW5zcG9ydCxvcmcuc2xmNGosJHt0aHJpZnQuZ3JvdXBpZH0mcXVvdDs7dmVyc2lvbj0mcXVvdDske3ZlcnNpb259JnF1b3Q7LCR7dGhyaWZ0Lmdyb3VwaWR9LnByb3RvY29sO3VzZXM6PSZxdW90OyR7dGhyaWZ0Lmdyb3VwaWR9LnRyYW5zcG9ydCwke3RocmlmdC5ncm91cGlkfSwke3RocmlmdC5ncm91cGlkfS5zY2hlbWUmcXVvdDs7dmVyc2lvbj0mcXVvdDske3ZlcnNpb259JnF1b3Q7LCR7dGhyaWZ0Lmdyb3VwaWR9LnNlcnZlcjt1c2VzOj0mcXVvdDske3RocmlmdC5ncm91cGlkfS50cmFuc3BvcnQsJHt0aHJpZnQuZ3JvdXBpZH0ucHJvdG9jb2wsJHt0aHJpZnQuZ3JvdXBpZH0sb3JnLnNsZjRqLGphdmF4LnNlcnZsZXQsamF2YXguc2VydmxldC5odHRwJnF1b3Q7O3ZlcnNpb249JnF1b3Q7JHt2ZXJzaW9ufSZxdW90Oywke3RocmlmdC5ncm91cGlkfS50cmFuc3BvcnQ7dXNlczo9JnF1b3Q7JHt0aHJpZnQuZ3JvdXBpZH0ucHJvdG9jb2wsJHt0aHJpZnQuZ3JvdXBpZH0sb3JnLmFwYWNoZS5odHRwLmNsaWVudCxvcmcuYXBhY2hlLmh0dHAucGFyYW1zLG9yZy5hcGFjaGUuaHR0cC5lbnRpdHksb3JnLmFwYWNoZS5odHRwLmNsaWVudC5tZXRob2RzLG9yZy5hcGFjaGUuaHR0cCxvcmcuc2xmNGosamF2YXgubmV0LnNzbCxqYXZheC5uZXQsamF2YXguc2VjdXJpdHkuc2FzbCxqYXZheC5zZWN1cml0eS5hdXRoLmNhbGxiYWNrJnF1b3Q7O3ZlcnNpb249JnF1b3Q7JHt2ZXJzaW9ufSZxdW90Oywke3RocmlmdC5ncm91cGlkfTt1c2VzOj0mcXVvdDske3RocmlmdC5ncm91cGlkfS5wcm90b2NvbCwke3RocmlmdC5ncm91cGlkfS5hc3luYywke3RocmlmdC5ncm91cGlkfS5zZXJ2ZXIsJHt0aHJpZnQuZ3JvdXBpZH0udHJhbnNwb3J0LG9yZy5zbGY0aixvcmcuYXBhY2hlLmxvZzRqLCR7dGhyaWZ0Lmdyb3VwaWR9LnNjaGVtZSZxdW90Ozt2ZXJzaW9uPSZxdW90OyR7dmVyc2lvbn0mcXVvdDssJHt0aHJpZnQuZ3JvdXBpZH0ubWV0YV9kYXRhO3VzZXM6PSZxdW90OyR7dGhyaWZ0Lmdyb3VwaWR9JnF1b3Q7O3ZlcnNpb249JnF1b3Q7JHt2ZXJzaW9ufSZxdW90Oywke3RocmlmdC5ncm91cGlkfS5zY2hlbWU7dXNlczo9JnF1b3Q7JHt0aHJpZnQuZ3JvdXBpZH0ucHJvdG9jb2wsJHt0aHJpZnQuZ3JvdXBpZH0mcXVvdDs7dmVyc2lvbj0mcXVvdDske3ZlcnNpb259JnF1b3Q7Ii8+Ci0gICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJJbXBvcnQtUGFja2FnZSIgdmFsdWU9ImphdmF4Lm5ldCxqYXZheC5uZXQuc3NsLGphdmF4LnNlY3VyaXR5LmF1dGguY2FsbGJhY2ssamF2YXguc2VjdXJpdHkuc2FzbCxqYXZheC5zZXJ2bGV0O3Jlc29sdXRpb246PW9wdGlvbmFsLGphdmF4LnNlcnZsZXQuaHR0cDtyZXNvbHV0aW9uOj1vcHRpb25hbCxvcmcuc2xmNGo7cmVzb2x1dGlvbjo9b3B0aW9uYWw7dmVyc2lvbj0mcXVvdDtbMS40LDIpJnF1b3Q7Ii8+Ci0gICAgICA8L21hbmlmZXN0PgotICAgICAgPGZpbGVzZXQgZGlyPSIke2J1aWxkLmRpcn0iPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL3RocmlmdC8qKi8qLmNsYXNzIi8+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9Ik1FVEEtSU5GLyoudHh0Ii8+Ci0gICAgICA8L2ZpbGVzZXQ+Ci0gICAgPC9qYXI+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0icGFjay5zcmMiPgotICAgIDxqYXIgamFyZmlsZT0iJHtzb3VyY2UuamFyLmZpbGV9Ij4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtzcmN9Ij4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5qYXZhIi8+Ci0gICAgICA8L2ZpbGVzZXQ+Ci0gICAgPC9qYXI+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0iaW5zdGFsbCIgZGVwZW5kcz0iZGlzdCxqYXZhZG9jIj4KLSAgICA8Y29weSB0b2Rpcj0iJHtpbnN0YWxsLnBhdGh9Ij4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtidWlsZC5kaXJ9IiBpbmNsdWRlcz0iKi5qYXIiLz4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtidWlsZC5saWIuZGlyfSIgaW5jbHVkZXM9IiouamFyIi8+Ci0gICAgPC9jb3B5PgotICAgIDxjb3B5IHRvZGlyPSIke2luc3RhbGwuamF2YWRvYy5wYXRofSI+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7amF2YWRvYy5kaXJ9IiBpbmNsdWRlcz0iKiovKiIvPgotICAgIDwvY29weT4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJjbGVhbiI+Ci0gICAgPGRlbGV0ZSBkaXI9IiR7YnVpbGQuZGlyfSIvPgotICAgIDxkZWxldGUgZGlyPSIke2dlbn0iLz4KLSAgICA8ZGVsZXRlIGRpcj0iJHtnZW5iZWFufSIvPgotICAgIDxkZWxldGUgZGlyPSIke2dlbnJldXNlfSIvPgotICAgIDxkZWxldGUgZGlyPSIke2dlbmZ1bGxjYW1lbH0iLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJvcHRpb25hbC1nZW5lcmF0ZSIgdW5sZXNzPSJuby1nZW4tdGhyaWZ0Ij4gCi0gICAgPGFudGNhbGwgdGFyZ2V0PSJnZW5lcmF0ZSI+Ci0gICAgPC9hbnRjYWxsPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUtdGVzdCIgZGVzY3JpcHRpb249IkJ1aWxkIHRoZSB0ZXN0IHN1aXRlIGNsYXNzZXMiIGRlcGVuZHM9Im9wdGlvbmFsLWdlbmVyYXRlLGRpc3QiPgotICAgIDxqYXZhYyBkZWJ1Zz0idHJ1ZSIgc3JjZGlyPSIke2dlbn0iIGRlc3RkaXI9IiR7YnVpbGQudGVzdC5kaXJ9IiBjbGFzc3BhdGhyZWY9InRlc3QuY2xhc3NwYXRoIiBpbmNsdWRlYW50cnVudGltZT0iZmFsc2UiIGVuY29kaW5nPSJVVEYtOCI+Ci0gICAgICA8Y29tcGlsZXJhcmcgdmFsdWU9Ii1YbGludDpkZXByZWNhdGlvbiIvPgotICAgICAgPCEtLTxjb21waWxlcmFyZyB2YWx1ZT0iLVhsaW50OnVuY2hlY2tlZCIvPi0tPgotICAgIDwvamF2YWM+Ci0gICAgPGphdmFjIGRlYnVnPSJ0cnVlIiBzcmNkaXI9IiR7Z2VuYmVhbn0iIGRlc3RkaXI9IiR7YnVpbGQudGVzdC5kaXJ9IiBjbGFzc3BhdGhyZWY9InRlc3QuY2xhc3NwYXRoIiBpbmNsdWRlYW50cnVudGltZT0iZmFsc2UiIGVuY29kaW5nPSJVVEYtOCI+Ci0gICAgICA8Y29tcGlsZXJhcmcgdmFsdWU9Ii1YbGludDpkZXByZWNhdGlvbiIvPgotICAgICAgPCEtLTxjb21waWxlcmFyZyB2YWx1ZT0iLVhsaW50OnVuY2hlY2tlZCIvPi0tPgotICAgIDwvamF2YWM+Ci0gICAgPGphdmFjIGRlYnVnPSJ0cnVlIiBzcmNkaXI9IiR7Z2VucmV1c2V9IiBkZXN0ZGlyPSIke2J1aWxkLnRlc3QuZGlyfSIgY2xhc3NwYXRocmVmPSJ0ZXN0LmNsYXNzcGF0aCIgaW5jbHVkZWFudHJ1bnRpbWU9ImZhbHNlIiBlbmNvZGluZz0iVVRGLTgiPgotICAgICAgPGNvbXBpbGVyYXJnIHZhbHVlPSItWGxpbnQ6ZGVwcmVjYXRpb24iLz4KLSAgICAgIDwhLS08Y29tcGlsZXJhcmcgdmFsdWU9Ii1YbGludDp1bmNoZWNrZWQiLz4tLT4KLSAgICA8L2phdmFjPgotICAgIDxqYXZhYyBkZWJ1Zz0idHJ1ZSIgc3JjZGlyPSIke2dlbmZ1bGxjYW1lbH0iIGRlc3RkaXI9IiR7YnVpbGQudGVzdC5kaXJ9IiBjbGFzc3BhdGhyZWY9InRlc3QuY2xhc3NwYXRoIiBpbmNsdWRlYW50cnVudGltZT0iZmFsc2UiIGVuY29kaW5nPSJVVEYtOCI+Ci0gICAgICA8Y29tcGlsZXJhcmcgdmFsdWU9Ii1YbGludDpkZXByZWNhdGlvbiIvPgotICAgICAgPCEtLTxjb21waWxlcmFyZyB2YWx1ZT0iLVhsaW50OnVuY2hlY2tlZCIvPi0tPgotICAgIDwvamF2YWM+Ci0gICAgPGphdmFjIGRlYnVnPSJ0cnVlIiBzcmNkaXI9IiR7c3JjLnRlc3R9IiBkZXN0ZGlyPSIke2J1aWxkLnRlc3QuZGlyfSIgY2xhc3NwYXRocmVmPSJ0ZXN0LmNsYXNzcGF0aCIgaW5jbHVkZWFudHJ1bnRpbWU9ImZhbHNlIiBlbmNvZGluZz0iVVRGLTgiPgotICAgICAgPGNvbXBpbGVyYXJnIHZhbHVlPSItWGxpbnQ6ZGVwcmVjYXRpb24iLz4KLSAgICAgIDwhLS08Y29tcGlsZXJhcmcgdmFsdWU9Ii1YbGludDp1bmNoZWNrZWQiLz4tLT4KLSAgICA8L2phdmFjPiAgCi0gICAgPGNvcHkgdG9kaXI9IiR7YnVpbGQudGVzdC5kaXJ9Ij4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtzcmMudGVzdH0iIGluY2x1ZGVzPSJsb2c0ai5wcm9wZXJ0aWVzIi8+Ci0gICAgPC9jb3B5PgotICAgIDxqYXIgamFyZmlsZT0iJHt0ZXN0Lmphci5maWxlfSIgYmFzZWRpcj0iJHtidWlsZC50ZXN0LmRpcn0iLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJqdW5pdC10ZXN0IiBkZXNjcmlwdGlvbj0iUnVuIHRoZSBKVW5pdCB0ZXN0IHN1aXRlIiBkZXBlbmRzPSJjb21waWxlLXRlc3QiPgotICAgIDxta2RpciBkaXI9IiR7dGVzdC5sb2cuZGlyfSIvPgotICAgIDxqdW5pdCBwcmludHN1bW1hcnk9InRydWUiIHNob3dvdXRwdXQ9IiR7dGVzdC5vdXRwdXR9IiB0aW1lb3V0PSIke3Rlc3QudGltZW91dH0iIAotICAgICAgaGFsdG9uZmFpbHVyZT0idHJ1ZSIgZXJyb3JQcm9wZXJ0eT0idGVzdHMuZmFpbGVkIiBmYWlsdXJlUHJvcGVydHk9InRlc3RzLmZhaWxlZCIKLSAgICAgIGZvcms9InRydWUiIGZvcmttb2RlPSJwZXJUZXN0IiBtYXhtZW1vcnk9IjUxMm0iCi0gICAgPgotICAgICAgPHN5c3Byb3BlcnR5IGtleT0iYnVpbGQudGVzdCIgdmFsdWU9IiR7YnVpbGQudGVzdC5kaXJ9Ii8+Ci0gICAgICA8c3lzcHJvcGVydHkga2V5PSJ0ZXN0LnBvcnQiIHZhbHVlPSIke3Rlc3QucG9ydH0iLz4KLSAgICAgIDxzeXNwcm9wZXJ0eSBrZXk9ImphdmF4Lm5ldC5zc2wudHJ1c3RTdG9yZSIgdmFsdWU9IiR7c3JjLnRlc3R9Ly50cnVzdHN0b3JlIi8+Ci0gICAgICA8c3lzcHJvcGVydHkga2V5PSJqYXZheC5uZXQuc3NsLnRydXN0U3RvcmVQYXNzd29yZCIgdmFsdWU9InRocmlmdCIvPgotICAgICAgPHN5c3Byb3BlcnR5IGtleT0iamF2YXgubmV0LnNzbC5rZXlTdG9yZSIgdmFsdWU9IiR7c3JjLnRlc3R9Ly5rZXlzdG9yZSIvPgotICAgICAgPHN5c3Byb3BlcnR5IGtleT0iamF2YXgubmV0LnNzbC5rZXlTdG9yZVBhc3N3b3JkIiB2YWx1ZT0idGhyaWZ0Ii8+Ci0gICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJ0ZXN0LmNsYXNzcGF0aCIvPgotICAgICAgPGZvcm1hdHRlciB0eXBlPSIke3Rlc3QuanVuaXQub3V0cHV0LmZvcm1hdH0iLz4KLSAgICAgIDxiYXRjaHRlc3QgdG9kaXI9IiR7dGVzdC5sb2cuZGlyfSIgdW5sZXNzPSJ0ZXN0Y2FzZSI+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0iJHt0ZXN0LnNyYy5kaXJ9Ij4KLSAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi9UZXN0Ki5qYXZhIi8+Ci0gICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iKiovVGVzdENsaWVudC5qYXZhIi8+Ci0gICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iKiovVGVzdFNlcnZlci5qYXZhIi8+Ci0gICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iKiovVGVzdE5vbmJsb2NraW5nU2VydmVyLmphdmEiLz4KLSAgICAgICAgPC9maWxlc2V0PgotICAgICAgPC9iYXRjaHRlc3Q+Ci0gICAgICA8YmF0Y2h0ZXN0IHRvZGlyPSIke3Rlc3QubG9nLmRpcn0iIGlmPSJ0ZXN0Y2FzZSI+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0iJHt0ZXN0LnNyYy5kaXJ9IiBpbmNsdWRlcz0iKiovJHt0ZXN0Y2FzZX0uamF2YSIvPgotICAgICAgPC9iYXRjaHRlc3Q+Ci0gICAgPC9qdW5pdD4KLSAgICA8ZmFpbCBpZj0idGVzdHMuZmFpbGVkIj5UZXN0cyBmYWlsZWQhPC9mYWlsPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9ImRlcHJlY2F0ZWQtdGVzdCIgZGVzY3JpcHRpb249IlJ1biB0aGUgbm9uLUpVbml0IHRlc3Qgc3VpdGUiIGRlcGVuZHM9ImNvbXBpbGUtdGVzdCI+Ci0gICAgPGphdmEgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRocmlmdC50ZXN0LkVxdWFsaXR5VGVzdCIgY2xhc3NwYXRocmVmPSJ0ZXN0LmNsYXNzcGF0aCIgZmFpbG9uZXJyb3I9InRydWUiLz4KLSAgICA8amF2YSBjbGFzc25hbWU9Im9yZy5hcGFjaGUudGhyaWZ0LnRlc3QuSmF2YUJlYW5zVGVzdCIgY2xhc3NwYXRocmVmPSJ0ZXN0LmNsYXNzcGF0aCIgZmFpbG9uZXJyb3I9InRydWUiLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0IiBkZXNjcmlwdGlvbj0iUnVuIHRoZSBmdWxsIHRlc3Qgc3VpdGUiIGRlcGVuZHM9Imp1bml0LXRlc3QsZGVwcmVjYXRlZC10ZXN0Ii8+Ci0gIAotICA8dGFyZ2V0IG5hbWU9InRlc3RjbGllbnQiIGRlc2NyaXB0aW9uPSJSdW4gYSB0ZXN0IGNsaWVudCIgZGVwZW5kcz0iY29tcGlsZS10ZXN0LCBydW4tdGVzdGNsaWVudCIvPgotICA8dGFyZ2V0IG5hbWU9InJ1bi10ZXN0Y2xpZW50IiBkZXNjcmlwdGlvbj0iUnVuIGEgdGVzdCBjbGllbnQiPgotICAgIDxqYXZhIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50aHJpZnQudGVzdC5UZXN0Q2xpZW50IgotICAgICAgY2xhc3NwYXRocmVmPSJ0ZXN0LmNsYXNzcGF0aCIgZmFpbG9uZXJyb3I9InRydWUiIGZvcms9InRydWUiPgotICAgICAgPHN5c3Byb3BlcnR5IGtleT0iamF2YXgubmV0LnNzbC50cnVzdFN0b3JlIiB2YWx1ZT0iJHtzcmMudGVzdH0vLnRydXN0c3RvcmUiLz4KLSAgICAgIDxzeXNwcm9wZXJ0eSBrZXk9ImphdmF4Lm5ldC5zc2wudHJ1c3RTdG9yZVBhc3N3b3JkIiB2YWx1ZT0idGhyaWZ0Ii8+Ci0gICAgICA8YXJnIGxpbmU9IiR7dGVzdGFyZ3N9Ii8+Ci0gICAgPC9qYXZhPgotICA8L3RhcmdldD4KLSAgCi0gIDx0YXJnZXQgbmFtZT0idGVzdHNlcnZlciIgZGVzY3JpcHRpb249IlJ1biBhIHRlc3Qgc2VydmVyIiBkZXBlbmRzPSJjb21waWxlLXRlc3QsIHJ1bi10ZXN0c2VydmVyIi8+Ci0gIDx0YXJnZXQgbmFtZT0icnVuLXRlc3RzZXJ2ZXIiIGRlc2NyaXB0aW9uPSJSdW4gYSB0ZXN0IHNlcnZlciI+Ci0gICAgPGphdmEgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRocmlmdC50ZXN0LlRlc3RTZXJ2ZXIiCi0gICAgICBjbGFzc3BhdGhyZWY9InRlc3QuY2xhc3NwYXRoIiBmYWlsb25lcnJvcj0idHJ1ZSIgZm9yaz0idHJ1ZSI+IAotICAgICAgPHN5c3Byb3BlcnR5IGtleT0iamF2YXgubmV0LnNzbC5rZXlTdG9yZSIgdmFsdWU9IiR7c3JjLnRlc3R9Ly5rZXlzdG9yZSIvPgotICAgICAgPHN5c3Byb3BlcnR5IGtleT0iamF2YXgubmV0LnNzbC5rZXlTdG9yZVBhc3N3b3JkIiB2YWx1ZT0idGhyaWZ0Ii8+Ci0gICAgICA8YXJnIGxpbmU9IiR7dGVzdGFyZ3N9Ii8+IAotICAgIDwvamF2YT4KLSAgPC90YXJnZXQ+Ci0gIAotICA8dGFyZ2V0IG5hbWU9InRlc3Rub25ibG9ja2luZ3NlcnZlciIgZGVzY3JpcHRpb249IlJ1biBhIHRlc3Qgbm9uYmxvY2tpbmcgc2VydmVyIiBkZXBlbmRzPSJjb21waWxlLXRlc3QsIHJ1bi10ZXN0bm9uYmxvY2tpbmdzZXJ2ZXIiLz4KLSAgPHRhcmdldCBuYW1lPSJydW4tdGVzdG5vbmJsb2NraW5nc2VydmVyIiBkZXNjcmlwdGlvbj0iUnVuIGEgdGVzdCBub25ibG9ja2luZyBzZXJ2ZXIiPgotICAgIDxqYXZhIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50aHJpZnQudGVzdC5UZXN0Tm9uYmxvY2tpbmdTZXJ2ZXIiCi0gICAgICBjbGFzc3BhdGhyZWY9InRlc3QuY2xhc3NwYXRoIiBmYWlsb25lcnJvcj0idHJ1ZSI+Ci0gICAgICA8YXJnIGxpbmU9IiR7dGVzdGFyZ3N9Ii8+Ci0gICAgPC9qYXZhPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9ImdlbmVyYXRlIj4KLSAgICA8IS0tIEdlbmVyYXRlIHRoZSB0aHJpZnQgZ2VuLWphdmEgc291cmNlIC0tPgotICAgIDxleGVjIGV4ZWN1dGFibGU9Ii4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQiIGZhaWxvbmVycm9yPSJ0cnVlIj4KLSAgICAgIDxhcmcgbGluZT0iLS1nZW4gamF2YTpoYXNoY29kZSAke3Rlc3QudGhyaWZ0LmhvbWV9L1RocmlmdFRlc3QudGhyaWZ0Ii8+Ci0gICAgPC9leGVjPgotICAgIDxleGVjIGV4ZWN1dGFibGU9Ii4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQiIGZhaWxvbmVycm9yPSJ0cnVlIj4KLSAgICAgIDxhcmcgbGluZT0iLS1nZW4gamF2YTpoYXNoY29kZSAke3Rlc3QudGhyaWZ0LmhvbWV9L0RlYnVnUHJvdG9UZXN0LnRocmlmdCIvPgotICAgIDwvZXhlYz4KLSAgICA8ZXhlYyBleGVjdXRhYmxlPSIuLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IiBmYWlsb25lcnJvcj0idHJ1ZSI+Ci0gICAgICA8YXJnIGxpbmU9Ii0tZ2VuIGphdmE6aGFzaGNvZGUgJHt0ZXN0LnRocmlmdC5ob21lfS9PcHRpb25hbFJlcXVpcmVkVGVzdC50aHJpZnQiLz4KLSAgICA8L2V4ZWM+Ci0gICAgPGV4ZWMgZXhlY3V0YWJsZT0iLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCIgZmFpbG9uZXJyb3I9InRydWUiPgotICAgICAgPGFyZyBsaW5lPSItLWdlbiBqYXZhOmJlYW5zLG5vY2FtZWwgJHt0ZXN0LnRocmlmdC5ob21lfS9KYXZhQmVhbnNUZXN0LnRocmlmdCIvPgotICAgIDwvZXhlYz4KLSAgICA8ZXhlYyBleGVjdXRhYmxlPSIuLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IiBmYWlsb25lcnJvcj0idHJ1ZSI+Ci0gICAgICA8YXJnIGxpbmU9Ii0tZ2VuIGphdmE6aGFzaGNvZGUgJHt0ZXN0LnRocmlmdC5ob21lfS9NYW55T3B0aW9uYWxzLnRocmlmdCIvPgotICAgIDwvZXhlYz4KLSAgICA8ZXhlYyBleGVjdXRhYmxlPSJta2RpciIgZmFpbG9uZXJyb3I9InRydWUiPgotICAgICAgPGFyZyBsaW5lPSItcCAke2dlbmZ1bGxjYW1lbH0iLz4KLSAgICA8L2V4ZWM+Ci0gICAgPGV4ZWMgZXhlY3V0YWJsZT0iLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCIgZmFpbG9uZXJyb3I9InRydWUiPgotICAgICAgPGFyZyBsaW5lPSItLWdlbiBqYXZhOmhhc2hjb2RlLGZ1bGxjYW1lbCAtb3V0ICR7Z2VuZnVsbGNhbWVsfSAke3Rlc3QudGhyaWZ0LmhvbWV9L0RlbnNlTGlua2luZ1Rlc3QudGhyaWZ0Ii8+Ci0gICAgPC9leGVjPgotICAgIDxleGVjIGV4ZWN1dGFibGU9Im1rZGlyIiBmYWlsb25lcnJvcj0idHJ1ZSI+Ci0gICAgICA8YXJnIGxpbmU9Ii1wICR7Z2VucmV1c2V9Ii8+Ci0gICAgPC9leGVjPgotICAgIDxleGVjIGV4ZWN1dGFibGU9Ii4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQiIGZhaWxvbmVycm9yPSJ0cnVlIj4KLSAgICAgIDxhcmcgbGluZT0iLS1nZW4gamF2YTpyZXVzZS1vYmplY3RzIC1vdXQgJHtnZW5yZXVzZX0gJHt0ZXN0LnRocmlmdC5ob21lfS9SZXVzZU9iamVjdHMudGhyaWZ0Ii8+Ci0gICAgPC9leGVjPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9InByb3h5IiBpZj0icHJveHkuZW5hYmxlZCI+Ci0gICAgPHNldHByb3h5IHByb3h5aG9zdD0iJHtwcm94eS5ob3N0fSIgcHJveHlwb3J0PSIke3Byb3h5LnBvcnR9IgotICAgICAgcHJveHl1c2VyPSIke3Byb3h5LnVzZXJ9IiBwcm94eXBhc3N3b3JkPSIke3Byb3h5LnBhc3N9Ii8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0ibXZuLmFudC50YXNrcy5kb3dubG9hZCIgZGVwZW5kcz0ic2V0dXAuaW5pdCxtdm4uYW50LnRhc2tzLmNoZWNrLHByb3h5IiB1bmxlc3M9Im12bi5hbnQudGFza3MuZm91bmQiPgotICAgIDxnZXQgc3JjPSIke212bi5hbnQudGFzay51cmx9LyR7bXZuLmFudC50YXNrLmphcn0iIGRlc3Q9IiR7YnVpbGQudG9vbHMuZGlyfS8ke212bi5hbnQudGFzay5qYXJ9IiB1c2V0aW1lc3RhbXA9InRydWUiLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJtdm4uYW50LnRhc2tzLmNoZWNrIj4KLSAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJtdm4uYW50LnRhc2tzLmZvdW5kIj4KLSAgICAgIDx0eXBlZm91bmQgdXJpPSJhbnRsaWI6b3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5hbnQiIG5hbWU9ImFydGlmYWN0Ii8+Ci0gICAgPC9jb25kaXRpb24+Ci0gIDwvdGFyZ2V0PiAKLQotICA8dGFyZ2V0IG5hbWU9Im12bi5pbml0IiBkZXBlbmRzPSJtdm4uYW50LnRhc2tzLmRvd25sb2FkIiB1bmxlc3M9Im12bi5maW5pc2hlZCI+Ci0gICAgPCEtLSBEb3dubG9hZCBtdm4gYW50IHRhc2tzLCBkb3dubG9hZCBkZXBlbmRlbmNpZXMsIGFuZCBzZXR1cCBwb20gZmlsZSAtLT4KLSAgICA8dHlwZWRlZiB1cmk9ImFudGxpYjpvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LmFudCIgY2xhc3NwYXRoPSIke2J1aWxkLnRvb2xzLmRpcn0vJHttdm4uYW50LnRhc2suamFyfSIvPgotCi0gICAgPCEtLSByZW1vdGUgcmVwb3NpdG9yaWVzIHVzZWQgdG8gZG93bmxvYWQgZGVwZW5kZW5jaWVzIGZyb20gLS0+Ci0gICAgPGFydGlmYWN0OnJlbW90ZVJlcG9zaXRvcnkgaWQ9ImNlbnRyYWwiIHVybD0iJHttdm4ucmVwb30iLz4KLSAgICA8YXJ0aWZhY3Q6cmVtb3RlUmVwb3NpdG9yeSBpZD0iYXBhY2hlIiB1cmw9IiR7YXBhY2hlLnJlcG99Ii8+Ci0KLSAgICA8IS0tIFBvbSBmaWxlIGluZm9ybWF0aW9uIC0tPgotICAgIDxhcnRpZmFjdDpwb20gaWQ9InBvbSIgCi0gICAgICBncm91cElkPSIke3RocmlmdC5ncm91cGlkfSIgCi0gICAgICBhcnRpZmFjdElkPSIke3RocmlmdC5hcnRpZmFjdGlkfSIKLSAgICAgIHZlcnNpb249IiR7dmVyc2lvbn0iIAotICAgICAgdXJsPSJodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmciCi0gICAgICBuYW1lPSJBcGFjaGUgVGhyaWZ0IgotICAgICAgZGVzY3JpcHRpb249IlRocmlmdCBpcyBhIHNvZnR3YXJlIGZyYW1ld29yayBmb3Igc2NhbGFibGUgY3Jvc3MtbGFuZ3VhZ2Ugc2VydmljZXMgZGV2ZWxvcG1lbnQuIgotICAgICAgcGFja2FnaW5nPSJwb20iCi0gICAgPgotICAgICAgPHJlbW90ZVJlcG9zaXRvcnkgcmVmaWQ9ImNlbnRyYWwiLz4KLSAgICAgIDxyZW1vdGVSZXBvc2l0b3J5IHJlZmlkPSJhcGFjaGUiLz4KLSAgICAgIDxsaWNlbnNlIG5hbWU9IlRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAyLjAiIHVybD0iJHtsaWNlbnNlfSIvPgotICAgICAgPHNjbSBjb25uZWN0aW9uPSJzY206Z2l0Omh0dHBzOi8vZ2l0LXdpcC11cy5hcGFjaGUub3JnL3JlcG9zL2FzZi90aHJpZnQuZ2l0IiAKLSAgICAgIGRldmVsb3BlckNvbm5lY3Rpb249InNjbTpnaXQ6aHR0cHM6Ly9naXQtd2lwLXVzLmFwYWNoZS5vcmcvcmVwb3MvYXNmL3RocmlmdC5naXQiCi0gICAgICB1cmw9Imh0dHBzOi8vZ2l0LXdpcC11cy5hcGFjaGUub3JnL3JlcG9zL2FzZj9wPXRocmlmdC5naXQiCi0gICAgICAvPgotICAgICAgPCEtLSBUaHJpZnQgRGV2ZWxvcGVycyAtLT4KLSAgICAgIDxkZXZlbG9wZXIgaWQ9Im1jc2xlZSIgbmFtZT0iTWFyayBTbGVlIi8+Ci0gICAgICA8ZGV2ZWxvcGVyIGlkPSJkcmVpc3MiIG5hbWU9IkRhdmlkIFJlaXNzIi8+Ci0gICAgICA8ZGV2ZWxvcGVyIGlkPSJhZGl0eWEiIG5hbWU9IkFkaXR5YSBBZ2Fyd2FsIi8+Ci0gICAgICA8ZGV2ZWxvcGVyIGlkPSJtYXJjayIgbmFtZT0iTWFyYyBLd2lhdGtvd3NraSIvPgotICAgICAgPGRldmVsb3BlciBpZD0iandhbmciIG5hbWU9IkphbWVzIFdhbmciLz4KLSAgICAgIDxkZXZlbG9wZXIgaWQ9ImNwaXJvIiBuYW1lPSJDaHJpcyBQaXJvIi8+Ci0gICAgICA8ZGV2ZWxvcGVyIGlkPSJibWF1cmVyIiBuYW1lPSJCZW4gTWF1cmVyIi8+Ci0gICAgICA8ZGV2ZWxvcGVyIGlkPSJrY2xhcmsiIG5hbWU9IktldmluIENsYXJrIi8+Ci0gICAgICA8ZGV2ZWxvcGVyIGlkPSJqYWtlIiBuYW1lPSJKYWtlIEx1Y2lhbmkiLz4KLSAgICAgIDxkZXZlbG9wZXIgaWQ9ImJyeWFuZHV4YnVyeSIgbmFtZT0iQnJ5YW4gRHV4YnVyeSIvPgotICAgICAgPGRldmVsb3BlciBpZD0iZXN0ZXZlIiBuYW1lPSJFc3RldmUgRmVybmFuZGV6Ii8+Ci0gICAgICA8ZGV2ZWxvcGVyIGlkPSJ0b2RkIiBuYW1lPSJUb2RkIExpcGNvbiIvPgotICAgICAgPGRldmVsb3BlciBpZD0iZ2VlY2hvcmFtYSIgbmFtZT0iQW5kcmV3IE1jR2VhY2hpZSIvPgotICAgICAgPGRldmVsb3BlciBpZD0ibW9saW5hcm8iIG5hbWU9IkFudGhvbnkgTW9saW5hcm8iLz4KLSAgICAgIDxkZXZlbG9wZXIgaWQ9InJvZ2VyIiBuYW1lPSJSb2dlciBNZWllciIvPgotICAgICAgPGRldmVsb3BlciBpZD0iamZhcnJlbGwiIG5hbWU9Ikpha2UgRmFycmVsbCIvPgotICAgICAgPGRldmVsb3BlciBpZD0iamVuc2ciIG5hbWU9IkplbnMgR2V5ZXIiLz4KLSAgICAgIDxkZXZlbG9wZXIgaWQ9ImNhcmwiIG5hbWU9IkNhcmwgWWVrc2lnaWFuIi8+Ci0KLSAgICAgIDwhLS0gVGhyaWZ0IGRlcGVuZGVuY2llcyBsaXN0IC0tPgotICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLnNsZjRqIiBhcnRpZmFjdElkPSJzbGY0ai1hcGkiIHZlcnNpb249IiR7c2xmNGoudmVyc2lvbn0iLz4KLSAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9ImphdmF4LnNlcnZsZXQiIGFydGlmYWN0SWQ9InNlcnZsZXQtYXBpIiB2ZXJzaW9uPSIke3NlcnZsZXQudmVyc2lvbn0iIHNjb3BlPSJwcm92aWRlZCIvPgotICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLmFwYWNoZS5odHRwY29tcG9uZW50cyIgYXJ0aWZhY3RJZD0iaHR0cGNsaWVudCIgdmVyc2lvbj0iJHtodHRwY2xpZW50LnZlcnNpb259Ii8+Ci0gICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJvcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzIiBhcnRpZmFjdElkPSJodHRwY29yZSIgdmVyc2lvbj0iJHtodHRwY29yZS52ZXJzaW9ufSIvPgotICAgIDwvYXJ0aWZhY3Q6cG9tPgotCi0gICAgPCEtLSBHZW5lcmF0ZSB0aGUgcG9tIGZpbGUgLS0+Ci0gICAgPGFydGlmYWN0OndyaXRlcG9tIHBvbVJlZklkPSJwb20iIGZpbGU9IiR7cG9tLnhtbH0iLz4KLQotICAgIDwhLS0gRG93bmxvYWQgdGhlIGRlcGVuZGVuY2llcyAtLT4KLSAgICA8YXJ0aWZhY3Q6ZGVwZW5kZW5jaWVzIGZpbGVzZXRJZD0iYnVpbGQtZGVwZW5kZW5jeS1qYXJzIiBwb21SZWZJZD0icG9tIi8+Ci0KLSAgICA8IS0tIENvcHkgdGhlIGRlcGVuZGVuY2llcyB0byB0aGUgYnVpbGQvbGliIGRpciAtLT4KLSAgICA8Y29weSB0b2Rpcj0iJHtidWlsZC5kaXJ9L2xpYiI+Ci0gICAgICA8ZmlsZXNldCByZWZpZD0iYnVpbGQtZGVwZW5kZW5jeS1qYXJzIi8+Ci0gICAgICA8bWFwcGVyIHR5cGU9ImZsYXR0ZW4iLz4KLSAgICA8L2NvcHk+Ci0KLSAgICA8IS0tIERlcGVuZGVuY2llcyBuZWVkZWQgZm9yIHRlc3RpbmcgLS0+Ci0gICAgPGFydGlmYWN0OmRlcGVuZGVuY2llcyBmaWxlc2V0SWQ9InRlc3QtZGVwZW5kZW5jeS1qYXJzIiB1c2VTY29wZT0icnVudGltZSI+Ci0gICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJvcmcuc2xmNGoiIGFydGlmYWN0SWQ9InNsZjRqLWxvZzRqMTIiIHZlcnNpb249IjEuNS44Ii8+Ci0gICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJqdW5pdCIgYXJ0aWZhY3RJZD0ianVuaXQiIHZlcnNpb249IjQuNCIvPgotICAgIDwvYXJ0aWZhY3Q6ZGVwZW5kZW5jaWVzPgotCi0gICAgPCEtLSBDb3B5IHRoZSB0ZXN0IGRlcGVuZGVuY2llcyB0byB0aGUgYnVpbGQvbGliIGRpciAtLT4KLSAgICA8Y29weSB0b2Rpcj0iJHtidWlsZC5kaXJ9L2xpYiI+Ci0gICAgICA8ZmlsZXNldCByZWZpZD0idGVzdC1kZXBlbmRlbmN5LWphcnMiLz4KLSAgICAgIDxtYXBwZXIgdHlwZT0iZmxhdHRlbiIvPgotICAgIDwvY29weT4KLQotICAgIDxwcm9wZXJ0eSBuYW1lPSJtdm4uZmluaXNoZWQiIHZhbHVlPSJ0cnVlIi8+Ci0gIDwvdGFyZ2V0PgotCi0gIDxtYWNyb2RlZiBuYW1lPSJzaWduQW5kRGVwbG95Ij4KLSAgICA8IS0tIFNpZ24gYW5kIGRlcGxveSBqYXJzIHRvIGFwYWNoZSByZXBvIC0tPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmlsZSIvPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3NpZmllciIgZGVmYXVsdD0iIi8+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJwYWNrYWdpbmciIGRlZmF1bHQ9ImphciIvPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9tIiBkZWZhdWx0PSIiLz4KLSAgICA8c2VxdWVudGlhbD4KLSAgICAgIDxhcnRpZmFjdDptdm4gZm9yaz0idHJ1ZSI+Ci0gICAgICAgIDxhcmcgdmFsdWU9Im9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczptYXZlbi1ncGctcGx1Z2luOjEuMTpzaWduLWFuZC1kZXBsb3ktZmlsZSIvPgotICAgICAgICA8YXJnIHZhbHVlPSItRHJlcG9zaXRvcnlJZD0ke21hdmVuLXJlcG9zaXRvcnktaWR9Ii8+Ci0gICAgICAgIDxhcmcgdmFsdWU9Ii1EdXJsPSR7bWF2ZW4tcmVwb3NpdG9yeS11cmx9Ii8+Ci0gICAgICAgIDxhcmcgdmFsdWU9Ii1EcG9tRmlsZT1Ae3BvbX0iLz4KLSAgICAgICAgPGFyZyB2YWx1ZT0iLURmaWxlPUB7ZmlsZX0iLz4KLSAgICAgICAgPGFyZyB2YWx1ZT0iLURjbGFzc2lmaWVyPUB7Y2xhc3NpZmllcn0iLz4KLSAgICAgICAgPGFyZyB2YWx1ZT0iLURwYWNrYWdpbmc9QHtwYWNrYWdpbmd9Ii8+Ci0gICAgICAgIDxhcmcgdmFsdWU9Ii1QZ3BnIi8+Ci0gICAgICA8L2FydGlmYWN0Om12bj4KLSAgICA8L3NlcXVlbnRpYWw+Ci0gIDwvbWFjcm9kZWY+Ci0KLSAgPHRhcmdldCBuYW1lPSJwdWJsaXNoIiBkZXBlbmRzPSJjbGVhbixpbml0LHRlc3QsZGlzdCxqYXZhZG9jLHBhY2suc3JjIj4KLSAgICA8IS0tIENvbXBpbGUsIHBhY2thZ2UsIHRlc3QgYW5kIHRoZW4gc2VuZCByZWxlYXNlIHRvIGFwYWNoZSBtYXZlbiByZXBvIC0tPgotICAgIDwhLS0gcnVuIHdpdGg6IGFudCAtRHJlbGVhc2U9dHJ1ZSBwdWJsaXNoLS0+Ci0gICAgPHNpZ25BbmREZXBsb3kgZmlsZT0iJHtwb20ueG1sfSIgcGFja2FnaW5nPSJwb20iIGNsYXNzaWZpZXI9IiIgcG9tPSIke3BvbS54bWx9Ii8+Ci0gICAgPHNpZ25BbmREZXBsb3kgZmlsZT0iJHtqYXIuZmlsZX0iIHBhY2thZ2luZz0iamFyIiBjbGFzc2lmaWVyPSIiIHBvbT0iJHtwb20ueG1sfSIvPgotICAgIDxzaWduQW5kRGVwbG95IGZpbGU9IiR7amF2YWRvYy5qYXIuZmlsZX0iIHBhY2thZ2luZz0iamFyIiBjbGFzc2lmaWVyPSJqYXZhZG9jIiBwb209IiR7cG9tLnhtbH0iLz4KLSAgICA8c2lnbkFuZERlcGxveSBmaWxlPSIke3NvdXJjZS5qYXIuZmlsZX0iIHBhY2thZ2luZz0ic3JjIiBjbGFzc2lmaWVyPSJzb3VyY2VzIiBwb209IiR7cG9tLnhtbH0iLz4KLSAgPC90YXJnZXQ+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+L2Rldi9udWxsYAorICAgIFNFUD0iIgorICAgIGZvciBkaXIgaW4gJFJPT1RESVJTUkFXIDsgZG8KKyAgICAgICAgUk9PVERJUlM9IiRST09URElSUyRTRVAkZGlyIgorICAgICAgICBTRVA9InwiCisgICAgZG9uZQorICAgIE9VUkNZR1BBVFRFUk49IiheKCRST09URElSUykpIgorICAgICMgQWRkIGEgdXNlci1kZWZpbmVkIHBhdHRlcm4gdG8gdGhlIGN5Z3BhdGggYXJndW1lbnRzCisgICAgaWYgWyAiJEdSQURMRV9DWUdQQVRURVJOIiAhPSAiIiBdIDsgdGhlbgorICAgICAgICBPVVJDWUdQQVRURVJOPSIkT1VSQ1lHUEFUVEVSTnwoJEdSQURMRV9DWUdQQVRURVJOKSIKKyAgICBmaQorICAgICMgTm93IGNvbnZlcnQgdGhlIGFyZ3VtZW50cyAtIGtsdWRnZSB0byBsaW1pdCBvdXJzZWx2ZXMgdG8gL2Jpbi9zaAorICAgIGk9MAorICAgIGZvciBhcmcgaW4gIiRAIiA7IGRvCisgICAgICAgIENIRUNLPWBlY2hvICIkYXJnInxlZ3JlcCAtYyAiJE9VUkNZR1BBVFRFUk4iIC1gCisgICAgICAgIENIRUNLMj1gZWNobyAiJGFyZyJ8ZWdyZXAgLWMgIl4tImAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMgRGV0ZXJtaW5lIGlmIGFuIG9wdGlvbgorCisgICAgICAgIGlmIFsgJENIRUNLIC1uZSAwIF0gJiYgWyAkQ0hFQ0syIC1lcSAwIF0gOyB0aGVuICAgICAgICAgICAgICAgICAgICAjIyMgQWRkZWQgYSBjb25kaXRpb24KKyAgICAgICAgICAgIGV2YWwgYGVjaG8gYXJncyRpYD1gY3lncGF0aCAtLXBhdGggLS1pZ25vcmUgLS1taXhlZCAiJGFyZyJgCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGV2YWwgYGVjaG8gYXJncyRpYD0iXCIkYXJnXCIiCisgICAgICAgIGZpCisgICAgICAgIGk9JCgoaSsxKSkKKyAgICBkb25lCisgICAgY2FzZSAkaSBpbgorICAgICAgICAoMCkgc2V0IC0tIDs7CisgICAgICAgICgxKSBzZXQgLS0gIiRhcmdzMCIgOzsKKyAgICAgICAgKDIpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiA7OworICAgICAgICAoMykgc2V0IC0tICIkYXJnczAiICIkYXJnczEiICIkYXJnczIiIDs7CisgICAgICAgICg0KSBzZXQgLS0gIiRhcmdzMCIgIiRhcmdzMSIgIiRhcmdzMiIgIiRhcmdzMyIgOzsKKyAgICAgICAgKDUpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiAiJGFyZ3MyIiAiJGFyZ3MzIiAiJGFyZ3M0IiA7OworICAgICAgICAoNikgc2V0IC0tICIkYXJnczAiICIkYXJnczEiICIkYXJnczIiICIkYXJnczMiICIkYXJnczQiICIkYXJnczUiIDs7CisgICAgICAgICg3KSBzZXQgLS0gIiRhcmdzMCIgIiRhcmdzMSIgIiRhcmdzMiIgIiRhcmdzMyIgIiRhcmdzNCIgIiRhcmdzNSIgIiRhcmdzNiIgOzsKKyAgICAgICAgKDgpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiAiJGFyZ3MyIiAiJGFyZ3MzIiAiJGFyZ3M0IiAiJGFyZ3M1IiAiJGFyZ3M2IiAiJGFyZ3M3IiA7OworICAgICAgICAoOSkgc2V0IC0tICIkYXJnczAiICIkYXJnczEiICIkYXJnczIiICIkYXJnczMiICIkYXJnczQiICIkYXJnczUiICIkYXJnczYiICIkYXJnczciICIkYXJnczgiIDs7CisgICAgZXNhYworZmkKKworIyBFc2NhcGUgYXBwbGljYXRpb24gYXJncworc2F2ZSAoKSB7CisgICAgZm9yIGkgZG8gcHJpbnRmICVzXFxuICIkaSIgfCBzZWQgInMvJy8nXFxcXCcnL2c7MXMvXi8nLztcJHMvXCQvJyBcXFxcLyIgOyBkb25lCisgICAgZWNobyAiICIKK30KK0FQUF9BUkdTPSQoc2F2ZSAiJEAiKQorCisjIENvbGxlY3QgYWxsIGFyZ3VtZW50cyBmb3IgdGhlIGphdmEgY29tbWFuZCwgZm9sbG93aW5nIHRoZSBzaGVsbCBxdW90aW5nIGFuZCBzdWJzdGl0dXRpb24gcnVsZXMKK2V2YWwgc2V0IC0tICRERUZBVUxUX0pWTV9PUFRTICRKQVZBX09QVFMgJEdSQURMRV9PUFRTICJcIi1Eb3JnLmdyYWRsZS5hcHBuYW1lPSRBUFBfQkFTRV9OQU1FXCIiIC1jbGFzc3BhdGggIlwiJENMQVNTUEFUSFwiIiBvcmcuZ3JhZGxlLndyYXBwZXIuR3JhZGxlV3JhcHBlck1haW4gIiRBUFBfQVJHUyIKKworIyBieSBkZWZhdWx0IHdlIHNob3VsZCBiZSBpbiB0aGUgY29ycmVjdCBwcm9qZWN0IGRpciwgYnV0IHdoZW4gcnVuIGZyb20gRmluZGVyIG9uIE1hYywgdGhlIGN3ZCBpcyB3cm9uZworaWYgWyAiJCh1bmFtZSkiID0gIkRhcndpbiIgXSAmJiBbICIkSE9NRSIgPSAiJFBXRCIgXTsgdGhlbgorICBjZCAiJChkaXJuYW1lICIkMCIpIgorZmkKKworZXhlYyAiJEpBVkFDTUQiICIkQCIKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL2dyYWRsZXcuYmF0IGIvbGliL2phdmEvZ3JhZGxldy5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk1NTMxNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL2dyYWRsZXcuYmF0CkBAIC0wLDAgKzEsODQgQEAKK0BpZiAiJURFQlVHJSIgPT0gIiIgQGVjaG8gb2ZmCitAcmVtICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitAcmVtCitAcmVtICBHcmFkbGUgc3RhcnR1cCBzY3JpcHQgZm9yIFdpbmRvd3MKK0ByZW0KK0ByZW0gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworQHJlbSBTZXQgbG9jYWwgc2NvcGUgZm9yIHRoZSB2YXJpYWJsZXMgd2l0aCB3aW5kb3dzIE5UIHNoZWxsCitpZiAiJU9TJSI9PSJXaW5kb3dzX05UIiBzZXRsb2NhbAorCitzZXQgRElSTkFNRT0lfmRwMAoraWYgIiVESVJOQU1FJSIgPT0gIiIgc2V0IERJUk5BTUU9Lgorc2V0IEFQUF9CQVNFX05BTUU9JX5uMAorc2V0IEFQUF9IT01FPSVESVJOQU1FJQorCitAcmVtIEFkZCBkZWZhdWx0IEpWTSBvcHRpb25zIGhlcmUuIFlvdSBjYW4gYWxzbyB1c2UgSkFWQV9PUFRTIGFuZCBHUkFETEVfT1BUUyB0byBwYXNzIEpWTSBvcHRpb25zIHRvIHRoaXMgc2NyaXB0Lgorc2V0IERFRkFVTFRfSlZNX09QVFM9CisKK0ByZW0gRmluZCBqYXZhLmV4ZQoraWYgZGVmaW5lZCBKQVZBX0hPTUUgZ290byBmaW5kSmF2YUZyb21KYXZhSG9tZQorCitzZXQgSkFWQV9FWEU9amF2YS5leGUKKyVKQVZBX0VYRSUgLXZlcnNpb24gPk5VTCAyPiYxCitpZiAiJUVSUk9STEVWRUwlIiA9PSAiMCIgZ290byBpbml0CisKK2VjaG8uCitlY2hvIEVSUk9SOiBKQVZBX0hPTUUgaXMgbm90IHNldCBhbmQgbm8gJ2phdmEnIGNvbW1hbmQgY291bGQgYmUgZm91bmQgaW4geW91ciBQQVRILgorZWNoby4KK2VjaG8gUGxlYXNlIHNldCB0aGUgSkFWQV9IT01FIHZhcmlhYmxlIGluIHlvdXIgZW52aXJvbm1lbnQgdG8gbWF0Y2ggdGhlCitlY2hvIGxvY2F0aW9uIG9mIHlvdXIgSmF2YSBpbnN0YWxsYXRpb24uCisKK2dvdG8gZmFpbAorCis6ZmluZEphdmFGcm9tSmF2YUhvbWUKK3NldCBKQVZBX0hPTUU9JUpBVkFfSE9NRToiPSUKK3NldCBKQVZBX0VYRT0lSkFWQV9IT01FJS9iaW4vamF2YS5leGUKKworaWYgZXhpc3QgIiVKQVZBX0VYRSUiIGdvdG8gaW5pdAorCitlY2hvLgorZWNobyBFUlJPUjogSkFWQV9IT01FIGlzIHNldCB0byBhbiBpbnZhbGlkIGRpcmVjdG9yeTogJUpBVkFfSE9NRSUKK2VjaG8uCitlY2hvIFBsZWFzZSBzZXQgdGhlIEpBVkFfSE9NRSB2YXJpYWJsZSBpbiB5b3VyIGVudmlyb25tZW50IHRvIG1hdGNoIHRoZQorZWNobyBsb2NhdGlvbiBvZiB5b3VyIEphdmEgaW5zdGFsbGF0aW9uLgorCitnb3RvIGZhaWwKKworOmluaXQKK0ByZW0gR2V0IGNvbW1hbmQtbGluZSBhcmd1bWVudHMsIGhhbmRsaW5nIFdpbmRvd3MgdmFyaWFudHMKKworaWYgbm90ICIlT1MlIiA9PSAiV2luZG93c19OVCIgZ290byB3aW45eE1FX2FyZ3MKKworOndpbjl4TUVfYXJncworQHJlbSBTbHVycCB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4KK3NldCBDTURfTElORV9BUkdTPQorc2V0IF9TS0lQPTIKKworOndpbjl4TUVfYXJnc19zbHVycAoraWYgInglfjEiID09ICJ4IiBnb3RvIGV4ZWN1dGUKKworc2V0IENNRF9MSU5FX0FSR1M9JSoKKworOmV4ZWN1dGUKK0ByZW0gU2V0dXAgdGhlIGNvbW1hbmQgbGluZQorCitzZXQgQ0xBU1NQQVRIPSVBUFBfSE9NRSVcZ3JhZGxlXHdyYXBwZXJcZ3JhZGxlLXdyYXBwZXIuamFyCisKK0ByZW0gRXhlY3V0ZSBHcmFkbGUKKyIlSkFWQV9FWEUlIiAlREVGQVVMVF9KVk1fT1BUUyUgJUpBVkFfT1BUUyUgJUdSQURMRV9PUFRTJSAiLURvcmcuZ3JhZGxlLmFwcG5hbWU9JUFQUF9CQVNFX05BTUUlIiAtY2xhc3NwYXRoICIlQ0xBU1NQQVRIJSIgb3JnLmdyYWRsZS53cmFwcGVyLkdyYWRsZVdyYXBwZXJNYWluICVDTURfTElORV9BUkdTJQorCis6ZW5kCitAcmVtIEVuZCBsb2NhbCBzY29wZSBmb3IgdGhlIHZhcmlhYmxlcyB3aXRoIHdpbmRvd3MgTlQgc2hlbGwKK2lmICIlRVJST1JMRVZFTCUiPT0iMCIgZ290byBtYWluRW5kCisKKzpmYWlsCityZW0gU2V0IHZhcmlhYmxlIEdSQURMRV9FWElUX0NPTlNPTEUgaWYgeW91IG5lZWQgdGhlIF9zY3JpcHRfIHJldHVybiBjb2RlIGluc3RlYWQgb2YKK3JlbSB0aGUgX2NtZC5leGUgL2NfIHJldHVybiBjb2RlIQoraWYgIG5vdCAiIiA9PSAiJUdSQURMRV9FWElUX0NPTlNPTEUlIiBleGl0IDEKK2V4aXQgL2IgMQorCis6bWFpbkVuZAoraWYgIiVPUyUiPT0iV2luZG93c19OVCIgZW5kbG9jYWwKKworOm9tZWdhCmRpZmYgLS1naXQgYS9saWIvamF2YS9zZXR0aW5ncy5ncmFkbGUgYi9saWIvamF2YS9zZXR0aW5ncy5ncmFkbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzliZDhiYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3NldHRpbmdzLmdyYWRsZQpAQCAtMCwwICsxLDIwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3Jvb3RQcm9qZWN0Lm5hbWUgPSAnbGlidGhyaWZ0JwpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L0FzeW5jUHJvY2Vzc0Z1bmN0aW9uLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvQXN5bmNQcm9jZXNzRnVuY3Rpb24uamF2YQppbmRleCA3OTllMDJkLi40ODNjOGQwIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvQXN5bmNQcm9jZXNzRnVuY3Rpb24uamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvQXN5bmNQcm9jZXNzRnVuY3Rpb24uamF2YQpAQCAtMjAsMTEgKzIwLDEwIEBACiAKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5hc3luYy5Bc3luY01ldGhvZENhbGxiYWNrOwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNZXNzYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNZXNzYWdlVHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2w7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLkFic3RyYWN0Tm9uYmxvY2tpbmdTZXJ2ZXI7CiAKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBc3luY1Byb2Nlc3NGdW5jdGlvbjxJLCBULCBSPiB7CitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQXN5bmNQcm9jZXNzRnVuY3Rpb248SSwgVCBleHRlbmRzIFRCYXNlLCBSPiB7CiAgICAgZmluYWwgU3RyaW5nIG1ldGhvZE5hbWU7CiAKICAgICBwdWJsaWMgQXN5bmNQcm9jZXNzRnVuY3Rpb24oU3RyaW5nIG1ldGhvZE5hbWUpIHsKQEAgLTM3LDEzICszNiwxMyBAQAogCiAgICAgcHVibGljIGFic3RyYWN0IFQgZ2V0RW1wdHlBcmdzSW5zdGFuY2UoKTsKIAotICAgIHB1YmxpYyBhYnN0cmFjdCBBc3luY01ldGhvZENhbGxiYWNrIGdldFJlc3VsdEhhbmRsZXIoZmluYWwgQWJzdHJhY3ROb25ibG9ja2luZ1NlcnZlci5Bc3luY0ZyYW1lQnVmZmVyIGZiLCBpbnQgc2VxaWQpOworICAgIHB1YmxpYyBhYnN0cmFjdCBBc3luY01ldGhvZENhbGxiYWNrPFI+IGdldFJlc3VsdEhhbmRsZXIoZmluYWwgQWJzdHJhY3ROb25ibG9ja2luZ1NlcnZlci5Bc3luY0ZyYW1lQnVmZmVyIGZiLCBpbnQgc2VxaWQpOwogCiAgICAgcHVibGljIFN0cmluZyBnZXRNZXRob2ROYW1lKCkgewogICAgICAgICByZXR1cm4gbWV0aG9kTmFtZTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBzZW5kUmVzcG9uc2UoZmluYWwgQWJzdHJhY3ROb25ibG9ja2luZ1NlcnZlci5Bc3luY0ZyYW1lQnVmZmVyIGZiLCBmaW5hbCBUQmFzZSByZXN1bHQsIGZpbmFsIGJ5dGUgdHlwZSwgZmluYWwgaW50IHNlcWlkKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgc2VuZFJlc3BvbnNlKGZpbmFsIEFic3RyYWN0Tm9uYmxvY2tpbmdTZXJ2ZXIuQXN5bmNGcmFtZUJ1ZmZlciBmYiwgZmluYWwgVFNlcmlhbGl6YWJsZSByZXN1bHQsIGZpbmFsIGJ5dGUgdHlwZSwgZmluYWwgaW50IHNlcWlkKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgICAgIFRQcm90b2NvbCBvcHJvdCA9IGZiLmdldE91dHB1dFByb3RvY29sKCk7CiAKICAgICAgICAgb3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKGdldE1ldGhvZE5hbWUoKSwgdHlwZSwgc2VxaWQpKTsKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9PcHRpb24uamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9PcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWNkMzA5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L09wdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTI1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgdGhlIE9wdGlvbiB0eXBlIHBhdHRlcm4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIE9wdGlvbjxUPiB7CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE9wdGlvbiBOT05FID0gbmV3IE5vbmUoKTsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhlIE9wdGlvbiBpcyBkZWZpbmVkIG9yIG5vdAorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgICAgIHRydWUgaWYgdGhlIE9wdGlvbiBpcyBkZWZpbmVkIChvZiB0eXBlIFNvbWUpCisgICAgICogICAgICAgICBmYWxzZSBpZiB0aGUgT3B0aW9uIGlzIG5vdCBkZWZpbmVkIChvZiB0eXBlIE5vbmUpCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNEZWZpbmVkKCk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBPcHRpb24gKGlmIGl0IGlzIGRlZmluZWQpCisgICAgICogQHJldHVybiB0aGUgdmFsdWUKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiBjYWxsZWQgb24gYSBOb25lCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFQgZ2V0KCk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGNvbnRhaW5lZCB2YWx1ZSAoaWYgZGVmaW5lZCkgb3IgZWxzZSByZXR1cm4gYSBkZWZhdWx0IHZhbHVlCisgICAgICogQHBhcmFtIG90aGVyIHdoYXQgdG8gcmV0dXJuIGlmIHRoZSB2YWx1ZSBpcyBub3QgZGVmaW5lZCAoYSBOb25lKQorICAgICAqIEByZXR1cm4gZWl0aGVyIHRoZSB2YWx1ZSwgb3Igb3RoZXIgaWYgdGhlIHZhbHVlIGlzIG5vdCBkZWZpbmVkCisgICAgICovCisgICAgcHVibGljIFQgb3IoVCBvdGhlcikgeworICAgICAgICBpZiAoaXNEZWZpbmVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBvdGhlcjsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKioKKyAgICAgKiBUaGUgTm9uZSB0eXBlLCByZXByZXNlbnRpbmcgYW4gYWJzZW50IHZhbHVlIChpbnN0ZWFkIG9mICJudWxsIikKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE5vbmU8VD4gZXh0ZW5kcyBPcHRpb248VD4geworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0RlZmluZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVCBnZXQoKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDYW5ub3QgY2FsbCBnZXQoKSBvbiBOb25lIik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuICJOb25lIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBTb21lIHR5cGUsIHJlcHJlc2VudGluZyBhbiBleGlzdGVuY2Ugb2Ygc29tZSB2YWx1ZQorICAgICAqIEBwYXJhbSA8VD4gVGhlIHR5cGUgb2YgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNvbWU8VD4gZXh0ZW5kcyBPcHRpb248VD4geworICAgICAgICBwcml2YXRlIGZpbmFsIFQgdmFsdWU7CisgICAgICAgIHB1YmxpYyBTb21lKFQgdmFsdWUpIHsKKyAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzRGVmaW5lZCgpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFQgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiAiU29tZSgiICsgdmFsdWUgKyAiKSI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcmFwcyB2YWx1ZSBpbiBhbiBPcHRpb24gdHlwZSwgZGVwZW5kaW5nIG9uIHdoZXRoZXIgb3Igbm90IHZhbHVlIGlzIG51bGwKKyAgICAgKiBAcGFyYW0gdmFsdWUKKyAgICAgKiBAcGFyYW0gPFQ+IHR5cGUgb2YgdmFsdWUKKyAgICAgKiBAcmV0dXJuIFNvbWUodmFsdWUpIGlmIHZhbHVlIGlzIG5vdCBudWxsLCBOb25lIGlmIHZhbHVlIGlzIG51bGwKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIDxUPiBPcHRpb248VD4gZnJvbU51bGxhYmxlKFQgdmFsdWUpIHsKKyAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBzb21lKHZhbHVlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBub25lKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcmFwIHZhbHVlIGluIGEgU29tZSB0eXBlIChOQiEgdmFsdWUgbXVzdCBub3QgYmUgbnVsbCEpCisgICAgICogQHBhcmFtIHZhbHVlCisgICAgICogQHBhcmFtIDxUPiB0eXBlIG9mIHZhbHVlCisgICAgICogQHJldHVybiBhIG5ldyBTb21lKHZhbHVlKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPFQ+IFNvbWU8VD4gc29tZShUIHZhbHVlKSB7CisgICAgICAgIHJldHVybiBuZXcgU29tZTxUPih2YWx1ZSk7CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIHN0YXRpYyA8VD4gTm9uZTxUPiBub25lKCkgeworICAgICAgICByZXR1cm4gKE5vbmU8VD4pIE5PTkU7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9Qcm9jZXNzRnVuY3Rpb24uamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9Qcm9jZXNzRnVuY3Rpb24uamF2YQppbmRleCAxOWM4ZjE0Li5lNjIxM2RmIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvUHJvY2Vzc0Z1bmN0aW9uLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1Byb2Nlc3NGdW5jdGlvbi5qYXZhCkBAIC0xLDEyICsxLDEwIEBACi0vKioKLSAqIAotICovCiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OwogCiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1lc3NhZ2U7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1lc3NhZ2VUeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbDsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb247CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIApAQCAtMzMsMjcgKzMxLDQ5IEBACiAgICAgICByZXR1cm47CiAgICAgfQogICAgIGlwcm90LnJlYWRNZXNzYWdlRW5kKCk7Ci0gICAgVEJhc2UgcmVzdWx0ID0gbnVsbDsKKyAgICBUU2VyaWFsaXphYmxlIHJlc3VsdCA9IG51bGw7CisgICAgYnl0ZSBtc2dUeXBlID0gVE1lc3NhZ2VUeXBlLlJFUExZOwogCiAgICAgdHJ5IHsKICAgICAgIHJlc3VsdCA9IGdldFJlc3VsdChpZmFjZSwgYXJncyk7Ci0gICAgfSBjYXRjaChURXhjZXB0aW9uIHRleCkgewotICAgICAgTE9HR0VSLmVycm9yKCJJbnRlcm5hbCBlcnJvciBwcm9jZXNzaW5nICIgKyBnZXRNZXRob2ROYW1lKCksIHRleCk7Ci0gICAgICBUQXBwbGljYXRpb25FeGNlcHRpb24geCA9IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLklOVEVSTkFMX0VSUk9SLCAKKyAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIGV4KSB7CisgICAgICBMT0dHRVIuZXJyb3IoIlRyYW5zcG9ydCBlcnJvciB3aGlsZSBwcm9jZXNzaW5nICIgKyBnZXRNZXRob2ROYW1lKCksIGV4KTsKKyAgICAgIHRocm93IGV4OworICAgIH0gY2F0Y2ggKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBleCkgeworICAgICAgTE9HR0VSLmVycm9yKCJJbnRlcm5hbCBhcHBsaWNhdGlvbiBlcnJvciBwcm9jZXNzaW5nICIgKyBnZXRNZXRob2ROYW1lKCksIGV4KTsKKyAgICAgIHJlc3VsdCA9IGV4OworICAgICAgbXNnVHlwZSA9IFRNZXNzYWdlVHlwZS5FWENFUFRJT047CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICBMT0dHRVIuZXJyb3IoIkludGVybmFsIGVycm9yIHByb2Nlc3NpbmcgIiArIGdldE1ldGhvZE5hbWUoKSwgZXgpOworICAgICAgaWYocmV0aHJvd1VuaGFuZGxlZEV4Y2VwdGlvbnMoKSkgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXguZ2V0TWVzc2FnZSgpLCBleCk7CisgICAgICBpZighaXNPbmV3YXkoKSkgeworICAgICAgICByZXN1bHQgPSBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5JTlRFUk5BTF9FUlJPUiwKKyAgICAgICAgICAgICJJbnRlcm5hbCBlcnJvciBwcm9jZXNzaW5nICIgKyBnZXRNZXRob2ROYW1lKCkpOworICAgICAgICBtc2dUeXBlID0gVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTjsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZighaXNPbmV3YXkoKSkgeworICAgICAgb3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKGdldE1ldGhvZE5hbWUoKSwgbXNnVHlwZSwgc2VxaWQpKTsKKyAgICAgIHJlc3VsdC53cml0ZShvcHJvdCk7CisgICAgICBvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKTsKKyAgICAgIG9wcm90LmdldFRyYW5zcG9ydCgpLmZsdXNoKCk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIGhhbmRsZUV4Y2VwdGlvbihpbnQgc2VxaWQsIFRQcm90b2NvbCBvcHJvdCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIGlmICghaXNPbmV3YXkoKSkgeworICAgICAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHggPSBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5JTlRFUk5BTF9FUlJPUiwKICAgICAgICAgIkludGVybmFsIGVycm9yIHByb2Nlc3NpbmcgIiArIGdldE1ldGhvZE5hbWUoKSk7CiAgICAgICBvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UoZ2V0TWV0aG9kTmFtZSgpLCBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OLCBzZXFpZCkpOwogICAgICAgeC53cml0ZShvcHJvdCk7CiAgICAgICBvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKTsKICAgICAgIG9wcm90LmdldFRyYW5zcG9ydCgpLmZsdXNoKCk7Ci0gICAgICByZXR1cm47CiAgICAgfQorICB9CiAKLSAgICBpZighaXNPbmV3YXkoKSkgewotICAgICAgb3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKGdldE1ldGhvZE5hbWUoKSwgVE1lc3NhZ2VUeXBlLlJFUExZLCBzZXFpZCkpOwotICAgICAgcmVzdWx0LndyaXRlKG9wcm90KTsKLSAgICAgIG9wcm90LndyaXRlTWVzc2FnZUVuZCgpOwotICAgICAgb3Byb3QuZ2V0VHJhbnNwb3J0KCkuZmx1c2goKTsKLSAgICB9CisgIHByb3RlY3RlZCBib29sZWFuIHJldGhyb3dVbmhhbmRsZWRFeGNlcHRpb25zKCl7CisgICAgcmV0dXJuIGZhbHNlOwogICB9CiAKICAgcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gaXNPbmV3YXkoKTsKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9TaG9ydFN0YWNrLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvU2hvcnRTdGFjay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTU3ZDFjLi4wMDAwMDAwCi0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9TaG9ydFN0YWNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OwotCi0vKioKLSAqIFNob3J0U3RhY2sgaXMgYSBzaG9ydC1zcGVjaWZpYyBTdGFjayBpbXBsZW1lbnRhdGlvbiB3cml0dGVuIGZvciB0aGUgZXhwcmVzcwotICogcHVycG9zZSBvZiB2ZXJ5IGZhc3Qgb3BlcmF0aW9ucyBvbiBUQ29tcGFjdFByb3RvY29sJ3MgZmllbGQgaWQgc3RhY2suIFRoaXMKLSAqIGltcGxlbWVudGF0aW9uIHBlcmZvcm1zIGF0IGxlYXN0IDEweCBmYXN0ZXIgdGhhbiBqYXZhLnV0aWwuU3RhY2suCi0gKi8KLXB1YmxpYyBjbGFzcyBTaG9ydFN0YWNrIHsKLQotICBwcml2YXRlIHNob3J0W10gdmVjdG9yOwotICBwcml2YXRlIGludCB0b3AgPSAtMTsKLQotICBwdWJsaWMgU2hvcnRTdGFjayhpbnQgaW5pdGlhbENhcGFjaXR5KSB7Ci0gICAgdmVjdG9yID0gbmV3IHNob3J0W2luaXRpYWxDYXBhY2l0eV07Ci0gIH0KLQotICBwdWJsaWMgc2hvcnQgcG9wKCkgewotICAgIHJldHVybiB2ZWN0b3JbdG9wLS1dOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcHVzaChzaG9ydCBwdXNoZWQpIHsKLSAgICBpZiAodmVjdG9yLmxlbmd0aCA9PSB0b3AgKyAxKSB7Ci0gICAgICBncm93KCk7Ci0gICAgfQotICAgIHZlY3RvclsrK3RvcF0gPSBwdXNoZWQ7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgZ3JvdygpIHsKLSAgICBzaG9ydFtdIG5ld1ZlY3RvciA9IG5ldyBzaG9ydFt2ZWN0b3IubGVuZ3RoICogMl07Ci0gICAgU3lzdGVtLmFycmF5Y29weSh2ZWN0b3IsIDAsIG5ld1ZlY3RvciwgMCwgdmVjdG9yLmxlbmd0aCk7Ci0gICAgdmVjdG9yID0gbmV3VmVjdG9yOwotICB9Ci0KLSAgcHVibGljIHNob3J0IHBlZWsoKSB7Ci0gICAgcmV0dXJuIHZlY3Rvclt0b3BdOwotICB9Ci0KLSAgcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0gICAgdG9wID0gLTE7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICBzYi5hcHBlbmQoIjxTaG9ydFN0YWNrIHZlY3RvcjpbIik7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2ZWN0b3IubGVuZ3RoOyBpKyspIHsKLSAgICAgIGlmIChpICE9IDApIHsKLSAgICAgICAgc2IuYXBwZW5kKCIgIik7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChpID09IHRvcCkgewotICAgICAgICBzYi5hcHBlbmQoIj4+Iik7Ci0gICAgICB9Ci0KLSAgICAgIHNiLmFwcGVuZCh2ZWN0b3JbaV0pOwotCi0gICAgICBpZiAoaSA9PSB0b3ApIHsKLSAgICAgICAgc2IuYXBwZW5kKCI8PCIpOwotICAgICAgfQotICAgIH0KLSAgICBzYi5hcHBlbmQoIl0+Iik7Ci0gICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQXBwbGljYXRpb25FeGNlcHRpb24uamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQXBwbGljYXRpb25FeGNlcHRpb24uamF2YQppbmRleCBiNTRhNWNlLi40ZDY5M2Q5IDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5qYXZhCkBAIC0yOSw3ICsyOSw3IEBACiAgKiBBcHBsaWNhdGlvbiBsZXZlbCBleGNlcHRpb24KICAqCiAgKi8KLXB1YmxpYyBjbGFzcyBUQXBwbGljYXRpb25FeGNlcHRpb24gZXh0ZW5kcyBURXhjZXB0aW9uIHsKK3B1YmxpYyBjbGFzcyBUQXBwbGljYXRpb25FeGNlcHRpb24gZXh0ZW5kcyBURXhjZXB0aW9uIGltcGxlbWVudHMgVFNlcmlhbGl6YWJsZSB7CiAKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVFN0cnVjdCBUQVBQTElDQVRJT05fRVhDRVBUSU9OX1NUUlVDVCA9IG5ldyBUU3RydWN0KCJUQXBwbGljYXRpb25FeGNlcHRpb24iKTsKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVEZpZWxkIE1FU1NBR0VfRklFTEQgPSBuZXcgVEZpZWxkKCJtZXNzYWdlIiwgVFR5cGUuU1RSSU5HLCAoc2hvcnQpMSk7CkBAIC01MCw2ICs1MCw3IEBACiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOU1VQUE9SVEVEX0NMSUVOVF9UWVBFID0gMTA7CiAKICAgcHJvdGVjdGVkIGludCB0eXBlXyA9IFVOS05PV047CisgIHByaXZhdGUgU3RyaW5nIG1lc3NhZ2VfID0gbnVsbDsKIAogICBwdWJsaWMgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKCkgewogICAgIHN1cGVyKCk7CkBAIC03Myw3ICs3NCwxOCBAQAogICAgIHJldHVybiB0eXBlXzsKICAgfQogCi0gIHB1YmxpYyBzdGF0aWMgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHJlYWQoVFByb3RvY29sIGlwcm90KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7CisgICAgaWYgKG1lc3NhZ2VfID09IG51bGwpIHsKKyAgICAgIHJldHVybiBzdXBlci5nZXRNZXNzYWdlKCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgcmV0dXJuIG1lc3NhZ2VfOworICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIHJlYWQoVFByb3RvY29sIGlwcm90KSB0aHJvd3MgVEV4Y2VwdGlvbgorICB7CiAgICAgVEZpZWxkIGZpZWxkOwogICAgIGlwcm90LnJlYWRTdHJ1Y3RCZWdpbigpOwogCkBAIC04NiwzMiArOTgsNDMgQEAKICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAgICAgICBzd2l0Y2ggKGZpZWxkLmlkKSB7Ci0gICAgICBjYXNlIDE6Ci0gICAgICAgIGlmIChmaWVsZC50eXBlID09IFRUeXBlLlNUUklORykgewotICAgICAgICAgIG1lc3NhZ2UgPSBpcHJvdC5yZWFkU3RyaW5nKCk7Ci0gICAgICAgIH0gZWxzZSB7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICBpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5TVFJJTkcpIHsKKyAgICAgICAgICAgIG1lc3NhZ2UgPSBpcHJvdC5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuSTMyKSB7CisgICAgICAgICAgICB0eXBlID0gaXByb3QucmVhZEkzMigpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAyOgotICAgICAgICBpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5JMzIpIHsKLSAgICAgICAgICB0eXBlID0gaXByb3QucmVhZEkzMigpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIFRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOwotICAgICAgICBicmVhazsKKyAgICAgICAgICBicmVhazsKICAgICAgIH0KICAgICAgIGlwcm90LnJlYWRGaWVsZEVuZCgpOwogICAgIH0KICAgICBpcHJvdC5yZWFkU3RydWN0RW5kKCk7Ci0KLSAgICByZXR1cm4gbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbih0eXBlLCBtZXNzYWdlKTsKKyAgICB0eXBlXyA9IHR5cGU7CisgICAgbWVzc2FnZV8gPSBtZXNzYWdlOwogICB9CiAKLSAgcHVibGljIHZvaWQgd3JpdGUoVFByb3RvY29sIG9wcm90KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgIC8qKgorICAgKiBDb252ZW5pZW5jZSBmYWN0b3J5IG1ldGhvZCBmb3IgY29uc3RydWN0aW5nIGEgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGdpdmVuIGEgVFByb3RvY29sIGlucHV0CisgICAqLworICBwdWJsaWMgc3RhdGljIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiByZWFkRnJvbShUUHJvdG9jb2wgaXByb3QpIHRocm93cyBURXhjZXB0aW9uCisgIHsKKyAgICBUQXBwbGljYXRpb25FeGNlcHRpb24gcmVzdWx0ID0gbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbigpOworICAgIHJlc3VsdC5yZWFkKGlwcm90KTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgcHVibGljIHZvaWQgd3JpdGUoVFByb3RvY29sIG9wcm90KSB0aHJvd3MgVEV4Y2VwdGlvbgorICB7CiAgICAgb3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbihUQVBQTElDQVRJT05fRVhDRVBUSU9OX1NUUlVDVCk7CiAgICAgaWYgKGdldE1lc3NhZ2UoKSAhPSBudWxsKSB7CiAgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oTUVTU0FHRV9GSUVMRCk7CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEFzeW5jUHJvY2Vzc29yLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEFzeW5jUHJvY2Vzc29yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTMzZTc0ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQXN5bmNQcm9jZXNzb3IuamF2YQpAQCAtMCwwICsxLDI4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLkFic3RyYWN0Tm9uYmxvY2tpbmdTZXJ2ZXIuQXN5bmNGcmFtZUJ1ZmZlcjsKKworcHVibGljIGludGVyZmFjZSBUQXN5bmNQcm9jZXNzb3IgeworICAgIC8qKgorICAgICAqIEltcGxlbWVudGF0aW9ucyBtdXN0IGNhbGwgZmIucmVzcG9uc2VSZWFkeSgpIG9uY2UgcHJvY2Vzc2luZyBpcyBjb21wbGV0ZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3MoZmluYWwgQXN5bmNGcmFtZUJ1ZmZlciBmYikgdGhyb3dzIFRFeGNlcHRpb247Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEJhc2UuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQmFzZS5qYXZhCmluZGV4IGIzZWQxYmMuLmUxNDg5ZDUgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQmFzZS5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQmFzZS5qYXZhCkBAIC0yNywyMSArMjcsNyBAQAogICogR2VuZXJpYyBiYXNlIGludGVyZmFjZSBmb3IgZ2VuZXJhdGVkIFRocmlmdCBvYmplY3RzLgogICoKICAqLwotcHVibGljIGludGVyZmFjZSBUQmFzZTxUIGV4dGVuZHMgVEJhc2U8Pyw/PiwgRiBleHRlbmRzIFRGaWVsZElkRW51bT4gZXh0ZW5kcyBDb21wYXJhYmxlPFQ+LCAgU2VyaWFsaXphYmxlIHsKLQotICAvKioKLSAgICogUmVhZHMgdGhlIFRPYmplY3QgZnJvbSB0aGUgZ2l2ZW4gaW5wdXQgcHJvdG9jb2wuCi0gICAqCi0gICAqIEBwYXJhbSBpcHJvdCBJbnB1dCBwcm90b2NvbAotICAgKi8KLSAgcHVibGljIHZvaWQgcmVhZChUUHJvdG9jb2wgaXByb3QpIHRocm93cyBURXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBXcml0ZXMgdGhlIG9iamVjdHMgb3V0IHRvIHRoZSBwcm90b2NvbAotICAgKgotICAgKiBAcGFyYW0gb3Byb3QgT3V0cHV0IHByb3RvY29sCi0gICAqLwotICBwdWJsaWMgdm9pZCB3cml0ZShUUHJvdG9jb2wgb3Byb3QpIHRocm93cyBURXhjZXB0aW9uOworcHVibGljIGludGVyZmFjZSBUQmFzZTxUIGV4dGVuZHMgVEJhc2U8VCxGPiwgRiBleHRlbmRzIFRGaWVsZElkRW51bT4gZXh0ZW5kcyBDb21wYXJhYmxlPFQ+LCAgVFNlcmlhbGl6YWJsZSwgU2VyaWFsaXphYmxlIHsKIAogICAvKioKICAgICogR2V0IHRoZSBGIGluc3RhbmNlIHRoYXQgY29ycmVzcG9uZHMgdG8gZmllbGRJZC4KQEAgLTU2LDcgKzQyLDcgQEAKICAgcHVibGljIGJvb2xlYW4gaXNTZXQoRiBmaWVsZCk7CiAKICAgLyoqCi0gICAqIEdldCBhIGZpZWxkJ3MgdmFsdWUgYnkgZmllbGQgdmFyaWFibGUuIFByaW1pdGl2ZSB0eXBlcyB3aWxsIGJlIHdyYXBwZWQgaW4gCisgICAqIEdldCBhIGZpZWxkJ3MgdmFsdWUgYnkgZmllbGQgdmFyaWFibGUuIFByaW1pdGl2ZSB0eXBlcyB3aWxsIGJlIHdyYXBwZWQgaW4KICAgICogdGhlIGFwcHJvcHJpYXRlICJib3hlZCIgdHlwZXMuCiAgICAqCiAgICAqIEBwYXJhbSBmaWVsZApAQCAtNzEsNyArNTcsNyBAQAogICAgKi8KICAgcHVibGljIHZvaWQgc2V0RmllbGRWYWx1ZShGIGZpZWxkLCBPYmplY3QgdmFsdWUpOwogCi0gIHB1YmxpYyBUQmFzZTxULCBGPiBkZWVwQ29weSgpOworICBwdWJsaWMgVCBkZWVwQ29weSgpOwogCiAgIC8qKgogICAgKiBSZXR1cm4gdG8gdGhlIHN0YXRlIG9mIGhhdmluZyBqdXN0IGJlZW4gaW5pdGlhbGl6ZWQsIGFzIHRob3VnaCB5b3UgaGFkIGp1c3QKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQmFzZUFzeW5jUHJvY2Vzc29yLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEJhc2VBc3luY1Byb2Nlc3Nvci5qYXZhCmluZGV4IGRhNDE2MjAuLjBhYjE4MjcgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQmFzZUFzeW5jUHJvY2Vzc29yLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RCYXNlQXN5bmNQcm9jZXNzb3IuamF2YQpAQCAtMTksNiArMTksNyBAQAogcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKIAogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuQXN5bmNNZXRob2RDYWxsYmFjazsKIAogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlci5BYnN0cmFjdE5vbmJsb2NraW5nU2VydmVyLio7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKQEAgLTI3LDcgKzI4LDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIAotcHVibGljIGNsYXNzIFRCYXNlQXN5bmNQcm9jZXNzb3I8ST4gaW1wbGVtZW50cyBUUHJvY2Vzc29yIHsKK3B1YmxpYyBjbGFzcyBUQmFzZUFzeW5jUHJvY2Vzc29yPEk+IGltcGxlbWVudHMgVEFzeW5jUHJvY2Vzc29yLCBUUHJvY2Vzc29yIHsKICAgICBwcm90ZWN0ZWQgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKGdldENsYXNzKCkuZ2V0TmFtZSgpKTsKIAogICAgIGZpbmFsIEkgaWZhY2U7CkBAIC01MywzNSArNTQsNTcgQEAKICAgICAgICAgaWYgKGZuID09IG51bGwpIHsKICAgICAgICAgICAgIFRQcm90b2NvbFV0aWwuc2tpcChpbiwgVFR5cGUuU1RSVUNUKTsKICAgICAgICAgICAgIGluLnJlYWRNZXNzYWdlRW5kKCk7Ci0gICAgICAgICAgICBUQXBwbGljYXRpb25FeGNlcHRpb24geCA9IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLlVOS05PV05fTUVUSE9ELCAiSW52YWxpZCBtZXRob2QgbmFtZTogJyIrbXNnLm5hbWUrIiciKTsKLSAgICAgICAgICAgIG91dC53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UobXNnLm5hbWUsIFRNZXNzYWdlVHlwZS5FWENFUFRJT04sIG1zZy5zZXFpZCkpOwotICAgICAgICAgICAgeC53cml0ZShvdXQpOwotICAgICAgICAgICAgb3V0LndyaXRlTWVzc2FnZUVuZCgpOwotICAgICAgICAgICAgb3V0LmdldFRyYW5zcG9ydCgpLmZsdXNoKCk7CisKKyAgICAgICAgICAgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB4ID0gbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uVU5LTk9XTl9NRVRIT0QsCisgICAgICAgICAgICAgICAgIkludmFsaWQgbWV0aG9kIG5hbWU6ICciICsgbXNnLm5hbWUgKyAiJyIpOworICAgICAgICAgICAgTE9HR0VSLmRlYnVnKCJJbnZhbGlkIG1ldGhvZCBuYW1lIiwgeCk7CisKKyAgICAgICAgICAgIC8vIHRoaXMgbWVhbnMgaXQgaXMgYSB0d28td2F5IHJlcXVlc3QsIHNvIHdlIGNhbiBzZW5kIGEgcmVwbHkKKyAgICAgICAgICAgIGlmIChtc2cudHlwZSA9PSBUTWVzc2FnZVR5cGUuQ0FMTCkgeworICAgICAgICAgICAgICBvdXQud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKG1zZy5uYW1lLCBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OLCBtc2cuc2VxaWQpKTsKKyAgICAgICAgICAgICAgeC53cml0ZShvdXQpOworICAgICAgICAgICAgICBvdXQud3JpdGVNZXNzYWdlRW5kKCk7CisgICAgICAgICAgICAgIG91dC5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgZmIucmVzcG9uc2VSZWFkeSgpOwogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KIAogICAgICAgICAvL0dldCBBcmdzCi0gICAgICAgIFRCYXNlIGFyZ3MgPSAoVEJhc2UpZm4uZ2V0RW1wdHlBcmdzSW5zdGFuY2UoKTsKKyAgICAgICAgVEJhc2UgYXJncyA9IGZuLmdldEVtcHR5QXJnc0luc3RhbmNlKCk7CiAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGFyZ3MucmVhZChpbik7CiAgICAgICAgIH0gY2F0Y2ggKFRQcm90b2NvbEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICBpbi5yZWFkTWVzc2FnZUVuZCgpOwotICAgICAgICAgICAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHggPSBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5QUk9UT0NPTF9FUlJPUiwgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgb3V0LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShtc2cubmFtZSwgVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiwgbXNnLnNlcWlkKSk7Ci0gICAgICAgICAgICB4LndyaXRlKG91dCk7Ci0gICAgICAgICAgICBvdXQud3JpdGVNZXNzYWdlRW5kKCk7Ci0gICAgICAgICAgICBvdXQuZ2V0VHJhbnNwb3J0KCkuZmx1c2goKTsKKworICAgICAgICAgICAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHggPSBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5QUk9UT0NPTF9FUlJPUiwKKyAgICAgICAgICAgICAgICBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICBMT0dHRVIuZGVidWcoIkNvdWxkIG5vdCByZXRyaWV2ZSBmdW5jdGlvbiBhcmd1bWVudHMiLCB4KTsKKworICAgICAgICAgICAgaWYgKCFmbi5pc09uZXdheSgpKSB7CisgICAgICAgICAgICAgIG91dC53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UobXNnLm5hbWUsIFRNZXNzYWdlVHlwZS5FWENFUFRJT04sIG1zZy5zZXFpZCkpOworICAgICAgICAgICAgICB4LndyaXRlKG91dCk7CisgICAgICAgICAgICAgIG91dC53cml0ZU1lc3NhZ2VFbmQoKTsKKyAgICAgICAgICAgICAgb3V0LmdldFRyYW5zcG9ydCgpLmZsdXNoKCk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBmYi5yZXNwb25zZVJlYWR5KCk7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICBpbi5yZWFkTWVzc2FnZUVuZCgpOwogCisgICAgICAgIGlmIChmbi5pc09uZXdheSgpKSB7CisgICAgICAgICAgZmIucmVzcG9uc2VSZWFkeSgpOworICAgICAgICB9CiAKICAgICAgICAgLy9zdGFydCBvZmYgcHJvY2Vzc2luZyBmdW5jdGlvbgotICAgICAgICBmbi5zdGFydChpZmFjZSwgYXJncyxmbi5nZXRSZXN1bHRIYW5kbGVyKGZiLG1zZy5zZXFpZCkpOworICAgICAgICBBc3luY01ldGhvZENhbGxiYWNrIHJlc3VsdEhhbmRsZXIgPSBmbi5nZXRSZXN1bHRIYW5kbGVyKGZiLCBtc2cuc2VxaWQpOworICAgICAgICB0cnkgeworICAgICAgICAgIGZuLnN0YXJ0KGlmYWNlLCBhcmdzLCByZXN1bHRIYW5kbGVyKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICBMT0dHRVIuZGVidWcoIkV4Y2VwdGlvbiBoYW5kbGluZyBmdW5jdGlvbiIsIGUpOworICAgICAgICAgIHJlc3VsdEhhbmRsZXIub25FcnJvcihlKTsKKyAgICAgICAgfQogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQmFzZUhlbHBlci5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RCYXNlSGVscGVyLmphdmEKaW5kZXggNGYwMmIwNi4uNmY2YzZlYiAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RCYXNlSGVscGVyLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RCYXNlSGVscGVyLmphdmEKQEAgLTI1LDkgKzI1LDExIEBACiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRNYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNvcnRlZFNldDsKIGltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogCiBwdWJsaWMgZmluYWwgY2xhc3MgVEJhc2VIZWxwZXIgewogCkBAIC01Miw1NyArNTQsMjcgQEAKICAgfQogCiAgIHB1YmxpYyBzdGF0aWMgaW50IGNvbXBhcmVUbyhib29sZWFuIGEsIGJvb2xlYW4gYikgewotICAgIHJldHVybiBCb29sZWFuLnZhbHVlT2YoYSkuY29tcGFyZVRvKGIpOworICAgIHJldHVybiBCb29sZWFuLmNvbXBhcmUoYSwgYik7CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGludCBjb21wYXJlVG8oYnl0ZSBhLCBieXRlIGIpIHsKLSAgICBpZiAoYSA8IGIpIHsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9IGVsc2UgaWYgKGIgPCBhKSB7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQorICAgIHJldHVybiBCeXRlLmNvbXBhcmUoYSwgYik7CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGludCBjb21wYXJlVG8oc2hvcnQgYSwgc2hvcnQgYikgewotICAgIGlmIChhIDwgYikgewotICAgICAgcmV0dXJuIC0xOwotICAgIH0gZWxzZSBpZiAoYiA8IGEpIHsKLSAgICAgIHJldHVybiAxOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9CisgICAgcmV0dXJuIFNob3J0LmNvbXBhcmUoYSxiKTsKICAgfQogCiAgIHB1YmxpYyBzdGF0aWMgaW50IGNvbXBhcmVUbyhpbnQgYSwgaW50IGIpIHsKLSAgICBpZiAoYSA8IGIpIHsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9IGVsc2UgaWYgKGIgPCBhKSB7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQorICAgIHJldHVybiBJbnRlZ2VyLmNvbXBhcmUoYSwgYik7CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGludCBjb21wYXJlVG8obG9uZyBhLCBsb25nIGIpIHsKLSAgICBpZiAoYSA8IGIpIHsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9IGVsc2UgaWYgKGIgPCBhKSB7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQorICAgIHJldHVybiBMb25nLmNvbXBhcmUoYSwgYik7CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGludCBjb21wYXJlVG8oZG91YmxlIGEsIGRvdWJsZSBiKSB7Ci0gICAgaWYgKGEgPCBiKSB7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfSBlbHNlIGlmIChiIDwgYSkgewotICAgICAgcmV0dXJuIDE7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiAwOwotICAgIH0KKyAgICByZXR1cm4gRG91YmxlLmNvbXBhcmUoYSwgYik7CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGludCBjb21wYXJlVG8oU3RyaW5nIGEsIFN0cmluZyBiKSB7CkBAIC0xMTAsMTcgKzgyLDE2IEBACiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGludCBjb21wYXJlVG8oYnl0ZVtdIGEsIGJ5dGVbXSBiKSB7Ci0gICAgaW50IHNpemVDb21wYXJlID0gY29tcGFyZVRvKGEubGVuZ3RoLCBiLmxlbmd0aCk7Ci0gICAgaWYgKHNpemVDb21wYXJlICE9IDApIHsKLSAgICAgIHJldHVybiBzaXplQ29tcGFyZTsKLSAgICB9Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7Ci0gICAgICBpbnQgYnl0ZUNvbXBhcmUgPSBjb21wYXJlVG8oYVtpXSwgYltpXSk7Ci0gICAgICBpZiAoYnl0ZUNvbXBhcmUgIT0gMCkgewotICAgICAgICByZXR1cm4gYnl0ZUNvbXBhcmU7CisgICAgaW50IGNvbXBhcmUgPSBjb21wYXJlVG8oYS5sZW5ndGgsIGIubGVuZ3RoKTsKKyAgICBpZiAoY29tcGFyZSA9PSAwKSB7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgY29tcGFyZSA9IGNvbXBhcmVUbyhhW2ldLCBiW2ldKTsKKyAgICAgICAgaWYgKGNvbXBhcmUgIT0gMCkgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAgICAgICB9CiAgICAgfQotICAgIHJldHVybiAwOworICAgIHJldHVybiBjb21wYXJlOwogICB9CiAKICAgcHVibGljIHN0YXRpYyBpbnQgY29tcGFyZVRvKENvbXBhcmFibGUgYSwgQ29tcGFyYWJsZSBiKSB7CkBAIC0xMjgsNDEgKzk5LDM5IEBACiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGludCBjb21wYXJlVG8oTGlzdCBhLCBMaXN0IGIpIHsKLSAgICBpbnQgbGFzdENvbXBhcmlzb24gPSBjb21wYXJlVG8oYS5zaXplKCksIGIuc2l6ZSgpKTsKLSAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgewotICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOwotICAgIH0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGEuc2l6ZSgpOyBpKyspIHsKLSAgICAgIGxhc3RDb21wYXJpc29uID0gY29tcGFyYXRvci5jb21wYXJlKGEuZ2V0KGkpLCBiLmdldChpKSk7Ci0gICAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgewotICAgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgaW50IGNvbXBhcmUgPSBjb21wYXJlVG8oYS5zaXplKCksIGIuc2l6ZSgpKTsKKyAgICBpZiAoY29tcGFyZSA9PSAwKSB7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGEuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY29tcGFyZSA9IGNvbXBhcmF0b3IuY29tcGFyZShhLmdldChpKSwgYi5nZXQoaSkpOworICAgICAgICBpZiAoY29tcGFyZSAhPSAwKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIGNvbXBhcmU7CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGludCBjb21wYXJlVG8oU2V0IGEsIFNldCBiKSB7Ci0gICAgaW50IGxhc3RDb21wYXJpc29uID0gY29tcGFyZVRvKGEuc2l6ZSgpLCBiLnNpemUoKSk7Ci0gICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKLSAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKLSAgICB9Ci0gICAgU29ydGVkU2V0IHNvcnRlZEEgPSBuZXcgVHJlZVNldChjb21wYXJhdG9yKTsKLSAgICBzb3J0ZWRBLmFkZEFsbChhKTsKLSAgICBTb3J0ZWRTZXQgc29ydGVkQiA9IG5ldyBUcmVlU2V0KGNvbXBhcmF0b3IpOwotICAgIHNvcnRlZEIuYWRkQWxsKGIpOworICAgIGludCBjb21wYXJlID0gY29tcGFyZVRvKGEuc2l6ZSgpLCBiLnNpemUoKSk7CisgICAgaWYgKGNvbXBhcmUgPT0gMCkgeworICAgICAgQXJyYXlMaXN0IHNvcnRlZEEgPSBuZXcgQXJyYXlMaXN0KGEpOworICAgICAgQXJyYXlMaXN0IHNvcnRlZEIgPSBuZXcgQXJyYXlMaXN0KGIpOwogCi0gICAgSXRlcmF0b3IgaXRlckEgPSBzb3J0ZWRBLml0ZXJhdG9yKCk7Ci0gICAgSXRlcmF0b3IgaXRlckIgPSBzb3J0ZWRCLml0ZXJhdG9yKCk7CisgICAgICBDb2xsZWN0aW9ucy5zb3J0KHNvcnRlZEEsIGNvbXBhcmF0b3IpOworICAgICAgQ29sbGVjdGlvbnMuc29ydChzb3J0ZWRCLCBjb21wYXJhdG9yKTsKIAotICAgIC8vIENvbXBhcmUgZWFjaCBpdGVtLgotICAgIHdoaWxlIChpdGVyQS5oYXNOZXh0KCkgJiYgaXRlckIuaGFzTmV4dCgpKSB7Ci0gICAgICBsYXN0Q29tcGFyaXNvbiA9IGNvbXBhcmF0b3IuY29tcGFyZShpdGVyQS5uZXh0KCksIGl0ZXJCLm5leHQoKSk7Ci0gICAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgewotICAgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgICBJdGVyYXRvciBpdGVyQSA9IHNvcnRlZEEuaXRlcmF0b3IoKTsKKyAgICAgIEl0ZXJhdG9yIGl0ZXJCID0gc29ydGVkQi5pdGVyYXRvcigpOworCisgICAgICAvLyBDb21wYXJlIGVhY2ggaXRlbS4KKyAgICAgIHdoaWxlIChpdGVyQS5oYXNOZXh0KCkgJiYgaXRlckIuaGFzTmV4dCgpKSB7CisgICAgICAgIGNvbXBhcmUgPSBjb21wYXJhdG9yLmNvbXBhcmUoaXRlckEubmV4dCgpLCBpdGVyQi5uZXh0KCkpOworICAgICAgICBpZiAoY29tcGFyZSAhPSAwKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KICAgICAgIH0KICAgICB9Ci0KLSAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gY29tcGFyZTsKICAgfQogCiAgIHB1YmxpYyBzdGF0aWMgaW50IGNvbXBhcmVUbyhNYXAgYSwgTWFwIGIpIHsKQEAgLTIyMSw2ICsxOTAsMjUgQEAKICAgICB9CiAgIH0KIAorICBwdWJsaWMgc3RhdGljIHZvaWQgdG9TdHJpbmcoQ29sbGVjdGlvbjxCeXRlQnVmZmVyPiBiYnMsIFN0cmluZ0J1aWxkZXIgc2IpIHsKKyAgICBJdGVyYXRvcjxCeXRlQnVmZmVyPiBpdCA9IGJicy5pdGVyYXRvcigpOworICAgIGlmICghaXQuaGFzTmV4dCgpKSB7CisgICAgICBzYi5hcHBlbmQoIltdIik7CisgICAgfSBlbHNlIHsKKyAgICAgIHNiLmFwcGVuZCgiWyIpOworICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgQnl0ZUJ1ZmZlciBiYiA9IGl0Lm5leHQoKTsKKyAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIudG9TdHJpbmcoYmIsIHNiKTsKKyAgICAgICAgaWYgKCFpdC5oYXNOZXh0KCkpIHsKKyAgICAgICAgICBzYi5hcHBlbmQoIl0iKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc2IuYXBwZW5kKCIsICIpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKICAgcHVibGljIHN0YXRpYyB2b2lkIHRvU3RyaW5nKEJ5dGVCdWZmZXIgYmIsIFN0cmluZ0J1aWxkZXIgc2IpIHsKICAgICBieXRlW10gYnVmID0gYmIuYXJyYXkoKTsKIApAQCAtMjk2LDEyICsyODQsMTQgQEAKICAgfQogCiAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIGNvcHlCaW5hcnkoZmluYWwgYnl0ZVtdIG9yaWcpIHsKLSAgICBpZiAob3JpZyA9PSBudWxsKSB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9CisgICAgcmV0dXJuIChvcmlnID09IG51bGwpID8gbnVsbCA6IEFycmF5cy5jb3B5T2Yob3JpZywgb3JpZy5sZW5ndGgpOworICB9CiAKLSAgICBieXRlW10gY29weSA9IG5ldyBieXRlW29yaWcubGVuZ3RoXTsKLSAgICBTeXN0ZW0uYXJyYXljb3B5KG9yaWcsIDAsIGNvcHksIDAsIG9yaWcubGVuZ3RoKTsKLSAgICByZXR1cm4gY29weTsKKyAgcHVibGljIHN0YXRpYyBpbnQgaGFzaENvZGUobG9uZyB2YWx1ZSkgeworICAgIHJldHVybiBMb25nLmhhc2hDb2RlKHZhbHVlKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgaW50IGhhc2hDb2RlKGRvdWJsZSB2YWx1ZSkgeworICAgIHJldHVybiBEb3VibGUuaGFzaENvZGUodmFsdWUpOwogICB9CiB9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEJ5dGVBcnJheU91dHB1dFN0cmVhbS5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RCeXRlQXJyYXlPdXRwdXRTdHJlYW0uamF2YQppbmRleCAxYzM3ZWNkLi4zYTJkNTZjIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEJ5dGVBcnJheU91dHB1dFN0cmVhbS5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQnl0ZUFycmF5T3V0cHV0U3RyZWFtLmphdmEKQEAgLTIwLDYgKzIwLDcgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7CiAKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7CiAKIC8qKgogICogQ2xhc3MgdGhhdCBhbGxvd3MgYWNjZXNzIHRvIHRoZSB1bmRlcmx5aW5nIGJ1ZiB3aXRob3V0IGRvaW5nIGRlZXAKQEAgLTUzLDQgKzU0LDggQEAKICAgcHVibGljIGludCBsZW4oKSB7CiAgICAgcmV0dXJuIGNvdW50OwogICB9CisKKyAgcHVibGljIFN0cmluZyB0b1N0cmluZyhDaGFyc2V0IGNoYXJzZXQpIHsKKyAgICByZXR1cm4gbmV3IFN0cmluZyhidWYsIDAsIGNvdW50LCBjaGFyc2V0KTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1REZXNlcmlhbGl6ZXIuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9URGVzZXJpYWxpemVyLmphdmEKaW5kZXggYmY2Yzk3Yy4uZDFkMzk2NiAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1REZXNlcmlhbGl6ZXIuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVERlc2VyaWFsaXplci5qYXZhCkBAIC0yNTEsNDggKzI1MSwzMSBAQAogICAgIHRyeSB7CiAgICAgICBURmllbGQgZmllbGQgPSBsb2NhdGVGaWVsZChieXRlcywgZmllbGRJZFBhdGhGaXJzdCwgZmllbGRJZFBhdGhSZXN0KTsKICAgICAgIGlmIChmaWVsZCAhPSBudWxsKSB7Ci0gICAgICAgIC8vIGlmIHRoaXMgcG9pbnQgaXMgcmVhY2hlZCwgaXByb3Qgd2lsbCBiZSBwb3NpdGlvbmVkIGF0IHRoZSBzdGFydCBvZiB0aGUgZmllbGQuCi0gICAgICAgIHN3aXRjaCh0dHlwZSl7CisgICAgICAgIGlmICh0dHlwZSA9PSBmaWVsZC50eXBlKSB7CisgICAgICAgICAgLy8gaWYgdGhpcyBwb2ludCBpcyByZWFjaGVkLCBpcHJvdCB3aWxsIGJlIHBvc2l0aW9uZWQgYXQgdGhlIHN0YXJ0IG9mCisgICAgICAgICAgLy8gdGhlIGZpZWxkCisgICAgICAgICAgc3dpdGNoICh0dHlwZSkgewogICAgICAgICAgIGNhc2UgVFR5cGUuQk9PTDoKLSAgICAgICAgICAgIGlmIChmaWVsZC50eXBlID09IFRUeXBlLkJPT0wpewotICAgICAgICAgICAgICByZXR1cm4gcHJvdG9jb2xfLnJlYWRCb29sKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHJldHVybiBwcm90b2NvbF8ucmVhZEJvb2woKTsKICAgICAgICAgICBjYXNlIFRUeXBlLkJZVEU6Ci0gICAgICAgICAgICBpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5CWVRFKSB7Ci0gICAgICAgICAgICAgIHJldHVybiBwcm90b2NvbF8ucmVhZEJ5dGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgcmV0dXJuIHByb3RvY29sXy5yZWFkQnl0ZSgpOwogICAgICAgICAgIGNhc2UgVFR5cGUuRE9VQkxFOgotICAgICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuRE9VQkxFKSB7Ci0gICAgICAgICAgICAgIHJldHVybiBwcm90b2NvbF8ucmVhZERvdWJsZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICByZXR1cm4gcHJvdG9jb2xfLnJlYWREb3VibGUoKTsKICAgICAgICAgICBjYXNlIFRUeXBlLkkxNjoKLSAgICAgICAgICAgIGlmIChmaWVsZC50eXBlID09IFRUeXBlLkkxNikgewotICAgICAgICAgICAgICByZXR1cm4gcHJvdG9jb2xfLnJlYWRJMTYoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgcmV0dXJuIHByb3RvY29sXy5yZWFkSTE2KCk7CiAgICAgICAgICAgY2FzZSBUVHlwZS5JMzI6Ci0gICAgICAgICAgICBpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5JMzIpIHsKLSAgICAgICAgICAgICAgcmV0dXJuIHByb3RvY29sXy5yZWFkSTMyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHJldHVybiBwcm90b2NvbF8ucmVhZEkzMigpOwogICAgICAgICAgIGNhc2UgVFR5cGUuSTY0OgotICAgICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuSTY0KSB7Ci0gICAgICAgICAgICAgIHJldHVybiBwcm90b2NvbF8ucmVhZEk2NCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICByZXR1cm4gcHJvdG9jb2xfLnJlYWRJNjQoKTsKICAgICAgICAgICBjYXNlIFRUeXBlLlNUUklORzoKLSAgICAgICAgICAgIGlmIChmaWVsZC50eXBlID09IFRUeXBlLlNUUklORykgewotICAgICAgICAgICAgICByZXR1cm4gcHJvdG9jb2xfLnJlYWRTdHJpbmcoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgMTAwOiAvLyBoYWNrIHRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbiBzdHJpbmcgYW5kIGJpbmFyeQotICAgICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuU1RSSU5HKSB7Ci0gICAgICAgICAgICAgIHJldHVybiBwcm90b2NvbF8ucmVhZEJpbmFyeSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICByZXR1cm4gcHJvdG9jb2xfLnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIGhhY2sgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIHN0cmluZyBhbmQgYmluYXJ5CisgICAgICAgIGlmICh0dHlwZSA9PSAxMDAgJiYgZmllbGQudHlwZSA9PSBUVHlwZS5TVFJJTkcpIHsKKyAgICAgICAgICByZXR1cm4gcHJvdG9jb2xfLnJlYWRCaW5hcnkoKTsKICAgICAgICAgfQogICAgICAgfQogICAgICAgcmV0dXJuIG51bGw7CkBAIC0zMDcsMTEgKzI5MCw5IEBACiAgIHByaXZhdGUgVEZpZWxkIGxvY2F0ZUZpZWxkKGJ5dGVbXSBieXRlcywgVEZpZWxkSWRFbnVtIGZpZWxkSWRQYXRoRmlyc3QsIFRGaWVsZElkRW51bSAuLi4gZmllbGRJZFBhdGhSZXN0KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgdHJhbnNfLnJlc2V0KGJ5dGVzKTsKIAotICAgIFRGaWVsZElkRW51bVtdIGZpZWxkSWRQYXRoPSBuZXcgVEZpZWxkSWRFbnVtW2ZpZWxkSWRQYXRoUmVzdC5sZW5ndGggKyAxXTsKKyAgICBURmllbGRJZEVudW1bXSBmaWVsZElkUGF0aCA9IG5ldyBURmllbGRJZEVudW1bZmllbGRJZFBhdGhSZXN0Lmxlbmd0aCArIDFdOwogICAgIGZpZWxkSWRQYXRoWzBdID0gZmllbGRJZFBhdGhGaXJzdDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkSWRQYXRoUmVzdC5sZW5ndGg7IGkrKyl7Ci0gICAgICBmaWVsZElkUGF0aFtpICsgMV0gPSBmaWVsZElkUGF0aFJlc3RbaV07Ci0gICAgfQorICAgIFN5c3RlbS5hcnJheWNvcHkoZmllbGRJZFBhdGhSZXN0LCAwLCBmaWVsZElkUGF0aCwgMSwgZmllbGRJZFBhdGhSZXN0Lmxlbmd0aCk7CiAKICAgICAvLyBpbmRleCBpbnRvIGZpZWxkIElEIHBhdGggYmVpbmcgY3VycmVudGx5IHNlYXJjaGVkIGZvcgogICAgIGludCBjdXJQYXRoSW5kZXggPSAwOwpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RFbnVtSGVscGVyLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEVudW1IZWxwZXIuamF2YQppbmRleCBjMTdkNjYxLi5mYmM3Nzg3IDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEVudW1IZWxwZXIuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEVudW1IZWxwZXIuamF2YQpAQCAtMTksNyArMTksNiBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OwogCi1pbXBvcnQgamF2YS5sYW5nLkluc3RhbnRpYXRpb25FeGNlcHRpb247CiBpbXBvcnQgamF2YS5sYW5nLk5vU3VjaE1ldGhvZEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmxhbmcuSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RNdWx0aXBsZXhlZFByb2Nlc3Nvci5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RNdWx0aXBsZXhlZFByb2Nlc3Nvci5qYXZhCmluZGV4IDBiZjQ5MTkuLmQwYzU2MDMgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVE11bHRpcGxleGVkUHJvY2Vzc29yLmphdmEKQEAgLTUyLDYgKzUyLDcgQEAKIAogICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZyxUUHJvY2Vzc29yPiBTRVJWSUNFX1BST0NFU1NPUl9NQVAKICAgICAgICAgICAgID0gbmV3IEhhc2hNYXA8U3RyaW5nLFRQcm9jZXNzb3I+KCk7CisgICAgcHJpdmF0ZSBUUHJvY2Vzc29yIGRlZmF1bHRQcm9jZXNzb3I7CiAKICAgICAvKioKICAgICAgKiAnUmVnaXN0ZXInIGEgc2VydmljZSB3aXRoIHRoaXMgPGNvZGU+VE11bHRpcGxleGVkUHJvY2Vzc29yPC9jb2RlPi4gIFRoaXMKQEAgLTYwLDcgKzYxLDcgQEAKICAgICAgKgogICAgICAqIEBwYXJhbSBzZXJ2aWNlTmFtZSBOYW1lIG9mIGEgc2VydmljZSwgaGFzIHRvIGJlIGlkZW50aWNhbCB0byB0aGUgbmFtZQogICAgICAqIGRlY2xhcmVkIGluIHRoZSBUaHJpZnQgSURMLCBlLmcuICJXZWF0aGVyUmVwb3J0Ii4KLSAgICAgKiBAcGFyYW0gcHJvY2Vzc29yIEltcGxlbWVudGF0aW9uIG9mIGEgc2VydmljZSwgdXN1c2FsbHkgcmVmZXJyZWQgdG8KKyAgICAgKiBAcGFyYW0gcHJvY2Vzc29yIEltcGxlbWVudGF0aW9uIG9mIGEgc2VydmljZSwgdXN1YWxseSByZWZlcnJlZCB0bwogICAgICAqIGFzICJoYW5kbGVycyIsIGUuZy4gV2VhdGhlclJlcG9ydEhhbmRsZXIgaW1wbGVtZW50aW5nIFdlYXRoZXJSZXBvcnQuSWZhY2UuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJQcm9jZXNzb3IoU3RyaW5nIHNlcnZpY2VOYW1lLCBUUHJvY2Vzc29yIHByb2Nlc3NvcikgewpAQCAtNjgsNiArNjksMTQgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBSZWdpc3RlciBhIHNlcnZpY2UgdG8gYmUgY2FsbGVkIHRvIHByb2Nlc3MgcXVlcmllcyB3aXRob3V0IHNlcnZpY2UgbmFtZQorICAgICAqIEBwYXJhbSBwcm9jZXNzb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWdpc3RlckRlZmF1bHQoVFByb2Nlc3NvciBwcm9jZXNzb3IpIHsKKyAgICAgICAgZGVmYXVsdFByb2Nlc3NvciA9IHByb2Nlc3NvcjsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIDxjb2RlPnByb2Nlc3M8L2NvZGU+IHBlcmZvcm1zIHRoZSBmb2xsb3dpbmcgc3RlcHM6CiAgICAgICoKICAgICAgKiA8b2w+CkBAIC03Nyw3ICs4Niw3IEBACiAgICAgICogICAgIDxsaT5EaXNwYXRjaCB0byB0aGUgcHJvY2Vzc29yLCB3aXRoIGEgZGVjb3JhdGVkIGluc3RhbmNlIG9mIFRQcm90b2NvbAogICAgICAqICAgICAgICAgdGhhdCBhbGxvd3MgcmVhZE1lc3NhZ2VCZWdpbigpIHRvIHJldHVybiB0aGUgb3JpZ2luYWwgVE1lc3NhZ2UuPC9saT4KICAgICAgKiA8L29sPgotICAgICAqICAKKyAgICAgKgogICAgICAqIEB0aHJvd3MgVEV4Y2VwdGlvbiBJZiB0aGUgbWVzc2FnZSB0eXBlIGlzIG5vdCBDQUxMIG9yIE9ORVdBWSwgaWYKICAgICAgKiB0aGUgc2VydmljZSBuYW1lIHdhcyBub3QgZm91bmQgaW4gdGhlIG1lc3NhZ2UsIG9yIGlmIHRoZSBzZXJ2aWNlCiAgICAgICogbmFtZSB3YXMgbm90IGZvdW5kIGluIHRoZSBzZXJ2aWNlIG1hcC4gIFlvdSBjYWxsZWQge0BsaW5rICNyZWdpc3RlclByb2Nlc3NvcihTdHJpbmcsIFRQcm9jZXNzb3IpIHJlZ2lzdGVyUHJvY2Vzc29yfQpAQCAtOTIsMTQgKzEwMSwxNiBAQAogICAgICAgICBUTWVzc2FnZSBtZXNzYWdlID0gaXByb3QucmVhZE1lc3NhZ2VCZWdpbigpOwogCiAgICAgICAgIGlmIChtZXNzYWdlLnR5cGUgIT0gVE1lc3NhZ2VUeXBlLkNBTEwgJiYgbWVzc2FnZS50eXBlICE9IFRNZXNzYWdlVHlwZS5PTkVXQVkpIHsKLSAgICAgICAgICAgIC8vIFRPRE8gQXBhY2hlIEd1eXMgLSBDYW4gdGhlIHNlcnZlciBldmVyIGdldCBhbiBFWENFUFRJT04gb3IgUkVQTFk/Ci0gICAgICAgICAgICAvLyBUT0RPIFNob3VsZCB3ZSBjaGVjayBmb3IgdGhpcyBoZXJlPwogICAgICAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIlRoaXMgc2hvdWxkIG5vdCBoYXZlIGhhcHBlbmVkIT8iKTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIEV4dHJhY3QgdGhlIHNlcnZpY2UgbmFtZQogICAgICAgICBpbnQgaW5kZXggPSBtZXNzYWdlLm5hbWUuaW5kZXhPZihUTXVsdGlwbGV4ZWRQcm90b2NvbC5TRVBBUkFUT1IpOwogICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgICAgaWYgKGRlZmF1bHRQcm9jZXNzb3IgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIERpc3BhdGNoIHByb2Nlc3NpbmcgdG8gdGhlIHN0b3JlZCBwcm9jZXNzb3IKKyAgICAgICAgICAgICAgICByZXR1cm4gZGVmYXVsdFByb2Nlc3Nvci5wcm9jZXNzKG5ldyBTdG9yZWRNZXNzYWdlUHJvdG9jb2woaXByb3QsIG1lc3NhZ2UpLCBvcHJvdCk7CisgICAgICAgICAgfQogICAgICAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIlNlcnZpY2UgbmFtZSBub3QgZm91bmQgaW4gbWVzc2FnZSBuYW1lOiAiICsgbWVzc2FnZS5uYW1lICsgIi4gIERpZCB5b3UgIiArCiAgICAgICAgICAgICAgICAgICAgICJmb3JnZXQgdG8gdXNlIGEgVE11bHRpcGxleFByb3RvY29sIGluIHlvdXIgY2xpZW50PyIpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVE5vbmJsb2NraW5nTXVsdGlGZXRjaENsaWVudC5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1ROb25ibG9ja2luZ011bHRpRmV0Y2hDbGllbnQuamF2YQpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVE5vbmJsb2NraW5nTXVsdGlGZXRjaFN0YXRzLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVE5vbmJsb2NraW5nTXVsdGlGZXRjaFN0YXRzLmphdmEKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RQcm9jZXNzb3JGYWN0b3J5LmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVFByb2Nlc3NvckZhY3RvcnkuamF2YQppbmRleCBmNmRmYjE0Li44MTkzM2EyIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVFByb2Nlc3NvckZhY3RvcnkuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVFByb2Nlc3NvckZhY3RvcnkuamF2YQpAQCAtMzgsNiArMzgsNiBAQAogICB9CiAKICAgcHVibGljIGJvb2xlYW4gaXNBc3luY1Byb2Nlc3NvcigpIHsKLSAgICAgIHJldHVybiBwcm9jZXNzb3JfIGluc3RhbmNlb2YgVEJhc2VBc3luY1Byb2Nlc3NvcjsKKyAgICAgIHJldHVybiBwcm9jZXNzb3JfIGluc3RhbmNlb2YgVEFzeW5jUHJvY2Vzc29yOwogICB9CiB9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVFNlcmlhbGl6YWJsZS5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RTZXJpYWxpemFibGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDAwMmM3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RTZXJpYWxpemFibGUuamF2YQpAQCAtMCwwICsxLDQ0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2w7CisKKy8qKgorICogR2VuZXJpYyBiYXNlIGludGVyZmFjZSBmb3IgZ2VuZXJhdGVkIFRocmlmdCBvYmplY3RzLgorICoKKyAqLworcHVibGljIGludGVyZmFjZSBUU2VyaWFsaXphYmxlIHsKKworICAvKioKKyAgICogUmVhZHMgdGhlIFRPYmplY3QgZnJvbSB0aGUgZ2l2ZW4gaW5wdXQgcHJvdG9jb2wuCisgICAqCisgICAqIEBwYXJhbSBpcHJvdCBJbnB1dCBwcm90b2NvbAorICAgKi8KKyAgcHVibGljIHZvaWQgcmVhZChUUHJvdG9jb2wgaXByb3QpIHRocm93cyBURXhjZXB0aW9uOworCisgIC8qKgorICAgKiBXcml0ZXMgdGhlIG9iamVjdHMgb3V0IHRvIHRoZSBwcm90b2NvbAorICAgKgorICAgKiBAcGFyYW0gb3Byb3QgT3V0cHV0IHByb3RvY29sCisgICAqLworICBwdWJsaWMgdm9pZCB3cml0ZShUUHJvdG9jb2wgb3Byb3QpIHRocm93cyBURXhjZXB0aW9uOworCit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVFNlcnZpY2VDbGllbnQuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UU2VydmljZUNsaWVudC5qYXZhCmluZGV4IDE1NzE1ZjEuLjAwYTM2ZWUgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UU2VydmljZUNsaWVudC5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UU2VydmljZUNsaWVudC5qYXZhCkBAIC01OCwyMiArNTgsMzIgQEAKICAgICByZXR1cm4gdGhpcy5vcHJvdF87CiAgIH0KIAotICBwcm90ZWN0ZWQgdm9pZCBzZW5kQmFzZShTdHJpbmcgbWV0aG9kTmFtZSwgVEJhc2UgYXJncykgdGhyb3dzIFRFeGNlcHRpb24gewotICAgIG9wcm90Xy53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UobWV0aG9kTmFtZSwgVE1lc3NhZ2VUeXBlLkNBTEwsICsrc2VxaWRfKSk7CisgIHByb3RlY3RlZCB2b2lkIHNlbmRCYXNlKFN0cmluZyBtZXRob2ROYW1lLCBUQmFzZTw/LD8+IGFyZ3MpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICBzZW5kQmFzZShtZXRob2ROYW1lLCBhcmdzLCBUTWVzc2FnZVR5cGUuQ0FMTCk7CisgIH0KKworICBwcm90ZWN0ZWQgdm9pZCBzZW5kQmFzZU9uZXdheShTdHJpbmcgbWV0aG9kTmFtZSwgVEJhc2U8Pyw/PiBhcmdzKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgc2VuZEJhc2UobWV0aG9kTmFtZSwgYXJncywgVE1lc3NhZ2VUeXBlLk9ORVdBWSk7CisgIH0KKworICBwcml2YXRlIHZvaWQgc2VuZEJhc2UoU3RyaW5nIG1ldGhvZE5hbWUsIFRCYXNlPD8sPz4gYXJncywgYnl0ZSB0eXBlKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgb3Byb3RfLndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShtZXRob2ROYW1lLCB0eXBlLCArK3NlcWlkXykpOwogICAgIGFyZ3Mud3JpdGUob3Byb3RfKTsKICAgICBvcHJvdF8ud3JpdGVNZXNzYWdlRW5kKCk7CiAgICAgb3Byb3RfLmdldFRyYW5zcG9ydCgpLmZsdXNoKCk7CiAgIH0KIAotICBwcm90ZWN0ZWQgdm9pZCByZWNlaXZlQmFzZShUQmFzZSByZXN1bHQsIFN0cmluZyBtZXRob2ROYW1lKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgIHByb3RlY3RlZCB2b2lkIHJlY2VpdmVCYXNlKFRCYXNlPD8sPz4gcmVzdWx0LCBTdHJpbmcgbWV0aG9kTmFtZSkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIFRNZXNzYWdlIG1zZyA9IGlwcm90Xy5yZWFkTWVzc2FnZUJlZ2luKCk7CiAgICAgaWYgKG1zZy50eXBlID09IFRNZXNzYWdlVHlwZS5FWENFUFRJT04pIHsKLSAgICAgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB4ID0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uLnJlYWQoaXByb3RfKTsKKyAgICAgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB4ID0gbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbigpOworICAgICAgeC5yZWFkKGlwcm90Xyk7CiAgICAgICBpcHJvdF8ucmVhZE1lc3NhZ2VFbmQoKTsKICAgICAgIHRocm93IHg7CiAgICAgfQogICAgIGlmIChtc2cuc2VxaWQgIT0gc2VxaWRfKSB7Ci0gICAgICB0aHJvdyBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5CQURfU0VRVUVOQ0VfSUQsIG1ldGhvZE5hbWUgKyAiIGZhaWxlZDogb3V0IG9mIHNlcXVlbmNlIHJlc3BvbnNlIik7CisgICAgICB0aHJvdyBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5CQURfU0VRVUVOQ0VfSUQsCisgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiJXMgZmFpbGVkOiBvdXQgb2Ygc2VxdWVuY2UgcmVzcG9uc2U6IGV4cGVjdGVkICVkIGJ1dCBnb3QgJWQiLCBtZXRob2ROYW1lLCBzZXFpZF8sIG1zZy5zZXFpZCkpOwogICAgIH0KICAgICByZXN1bHQucmVhZChpcHJvdF8pOwogICAgIGlwcm90Xy5yZWFkTWVzc2FnZUVuZCgpOwpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RVbmlvbi5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RVbmlvbi5qYXZhCmluZGV4IDMwNTJlZTEuLjFlZjExZGYgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UVW5pb24uamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVFVuaW9uLmphdmEKQEAgLTM0LDcgKzM0LDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zY2hlbWUuU3RhbmRhcmRTY2hlbWU7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2NoZW1lLlR1cGxlU2NoZW1lOwogCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVFVuaW9uPFQgZXh0ZW5kcyBUVW5pb248Pyw/PiwgRiBleHRlbmRzIFRGaWVsZElkRW51bT4gaW1wbGVtZW50cyBUQmFzZTxULCBGPiB7CitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVFVuaW9uPFQgZXh0ZW5kcyBUVW5pb248VCxGPiwgRiBleHRlbmRzIFRGaWVsZElkRW51bT4gaW1wbGVtZW50cyBUQmFzZTxULCBGPiB7CiAKICAgcHJvdGVjdGVkIE9iamVjdCB2YWx1ZV87CiAgIHByb3RlY3RlZCBGIHNldEZpZWxkXzsKQEAgLTc5LDcgKzc5LDcgQEAKICAgfQogCiAgIHByaXZhdGUgc3RhdGljIE1hcCBkZWVwQ29weU1hcChNYXA8T2JqZWN0LCBPYmplY3Q+IG1hcCkgewotICAgIE1hcCBjb3B5ID0gbmV3IEhhc2hNYXAoKTsKKyAgICBNYXAgY29weSA9IG5ldyBIYXNoTWFwKG1hcC5zaXplKCkpOwogICAgIGZvciAoTWFwLkVudHJ5PE9iamVjdCwgT2JqZWN0PiBlbnRyeSA6IG1hcC5lbnRyeVNldCgpKSB7CiAgICAgICBjb3B5LnB1dChkZWVwQ29weU9iamVjdChlbnRyeS5nZXRLZXkoKSksIGRlZXBDb3B5T2JqZWN0KGVudHJ5LmdldFZhbHVlKCkpKTsKICAgICB9CkBAIC04Nyw3ICs4Nyw3IEBACiAgIH0KIAogICBwcml2YXRlIHN0YXRpYyBTZXQgZGVlcENvcHlTZXQoU2V0IHNldCkgewotICAgIFNldCBjb3B5ID0gbmV3IEhhc2hTZXQoKTsKKyAgICBTZXQgY29weSA9IG5ldyBIYXNoU2V0KHNldC5zaXplKCkpOwogICAgIGZvciAoT2JqZWN0IG8gOiBzZXQpIHsKICAgICAgIGNvcHkuYWRkKGRlZXBDb3B5T2JqZWN0KG8pKTsKICAgICB9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvYW5ub3RhdGlvbi9OdWxsYWJsZS5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L2Fubm90YXRpb24vTnVsbGFibGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzRiMDFlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L2Fubm90YXRpb24vTnVsbGFibGUuamF2YQpAQCAtMCwwICsxLDMzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQuYW5ub3RhdGlvbjsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKKworLyoqCisgKiBBbm5vdGF0aW9uIGluZGljYXRpbmcgYSBmaWVsZCwgbWV0aG9kIHJldHVybiwgb3IgbWV0aG9kIHBhcmFtZXRlciBtYXkgYmUge0Bjb2RlIG51bGx9LgorICogV2UgcGFja2FnZSBvdXIgb3duIGFubm90YXRpb24gdG8gYXZvaWQgYSBtYW5kYXRvcnkgdGhpcmQtcGFydHkgZGVwZW5kZW5jeS4KKyAqLworQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuQ0xBU1MpCitwdWJsaWMgQGludGVyZmFjZSBOdWxsYWJsZSB7CisKK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9hc3luYy9Bc3luY01ldGhvZENhbGxiYWNrLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvYXN5bmMvQXN5bmNNZXRob2RDYWxsYmFjay5qYXZhCmluZGV4IDAwMDA0YjcuLjRlYmRlMDcgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9hc3luYy9Bc3luY01ldGhvZENhbGxiYWNrLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L2FzeW5jL0FzeW5jTWV0aG9kQ2FsbGJhY2suamF2YQpAQCAtMTgsMjIgKzE4LDM0IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQuYXN5bmM7CiAKLQorLyoqCisgKiBBIGhhbmRsZXIgaW50ZXJmYWNlIGFzeW5jaHJvbm91cyBjbGllbnRzIGNhbiBpbXBsZW1lbnQgdG8gcmVjZWl2ZSBmdXR1cmUKKyAqIG5vdGljZSBvZiB0aGUgcmVzdWx0cyBvZiBhbiBhc3luY2hyb25vdXMgbWV0aG9kIGNhbGwuCisgKgorICogQHBhcmFtIDxUPiBUaGUgcmV0dXJuIHR5cGUgb2YgdGhlIGFzeW5jaHJvbm91c2x5IGludm9rZWQgbWV0aG9kLgorICovCiBwdWJsaWMgaW50ZXJmYWNlIEFzeW5jTWV0aG9kQ2FsbGJhY2s8VD4gewogICAvKioKICAgICogVGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgcmVtb3RlIHNpZGUgaGFzIGNvbXBsZXRlZCBpbnZva2luZwotICAgKiB5b3VyIG1ldGhvZCBjYWxsIGFuZCB0aGUgcmVzdWx0IGlzIGZ1bGx5IHJlYWQuIEZvciBvbmV3YXkgbWV0aG9kIGNhbGxzLAotICAgKiB0aGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBhcyBzb29uIGFzIHdlIGhhdmUgY29tcGxldGVkIHdyaXRpbmcgb3V0IHRoZQotICAgKiByZXF1ZXN0LgotICAgKiBAcGFyYW0gcmVzcG9uc2UKKyAgICogeW91ciBtZXRob2QgY2FsbCBhbmQgdGhlIHJlc3VsdCBpcyBmdWxseSByZWFkLiBGb3Ige0Bjb2RlIG9uZXdheX0gbWV0aG9kCisgICAqIGNhbGxzLCB0aGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBhcyBzb29uIGFzIHdlIGhhdmUgY29tcGxldGVkIHdyaXRpbmcgb3V0CisgICAqIHRoZSByZXF1ZXN0LgorICAgKgorICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgYXN5bmNocm9ub3VzbHkgaW52b2tlZCBtZXRob2Q7CisgICAqICAgICAgICAgICAgICAgICB7QGNvZGUgbnVsbH0gZm9yIHZvaWQgbWV0aG9kcyB3aGljaCBpbmNsdWRlcworICAgKiAgICAgICAgICAgICAgICAge0Bjb2RlIG9uZXdheX0gbWV0aG9kcy4KICAgICovCi0gIHB1YmxpYyB2b2lkIG9uQ29tcGxldGUoVCByZXNwb25zZSk7CisgIHZvaWQgb25Db21wbGV0ZShUIHJlc3BvbnNlKTsKIAogICAvKioKLSAgICogVGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGVyZSBpcyBhbiB1bmV4cGVjdGVkIGNsaWVudHNpZGUKLSAgICogZXhjZXB0aW9uLiBUaGlzIGRvZXMgbm90IGluY2x1ZGUgYXBwbGljYXRpb24tZGVmaW5lZCBleGNlcHRpb25zIHRoYXQKLSAgICogYXBwZWFyIGluIHRoZSBJREwsIGJ1dCByYXRoZXIgdGhpbmdzIGxpa2UgSU9FeGNlcHRpb25zLgotICAgKiBAcGFyYW0gZXhjZXB0aW9uCisgICAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlcmUgaXMgZWl0aGVyIGFuIHVuZXhwZWN0ZWQgY2xpZW50LXNpZGUKKyAgICogZXhjZXB0aW9uIGxpa2UgYW4gSU9FeGNlcHRpb24gb3IgZWxzZSB3aGVuIHRoZSByZW1vdGUgbWV0aG9kIHJhaXNlcyBhbgorICAgKiBleGNlcHRpb24sIGVpdGhlciBkZWNsYXJlZCBpbiB0aGUgSURMIG9yIGR1ZSB0byBhbiB1bmV4cGVjdGVkIHNlcnZlci1zaWRlCisgICAqIGVycm9yLgorICAgKgorICAgKiBAcGFyYW0gZXhjZXB0aW9uIFRoZSBleGNlcHRpb24gZW5jb3VudGVyZWQgcHJvY2Vzc2luZyB0aGUgdGhlIGFzeW5jaHJvbm91cworICAgKiAgICAgICAgICAgICAgICAgIG1ldGhvZCBjYWxsLCBtYXkgYmUgYSBsb2NhbCBleGNlcHRpb24gb3IgYW4gdW5tYXJzaGFsbGVkCisgICAqICAgICAgICAgICAgICAgICAgcmVtb3RlIGV4Y2VwdGlvbi4KICAgICovCi0gIHB1YmxpYyB2b2lkIG9uRXJyb3IoRXhjZXB0aW9uIGV4Y2VwdGlvbik7CisgIHZvaWQgb25FcnJvcihFeGNlcHRpb24gZXhjZXB0aW9uKTsKIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9hc3luYy9UQXN5bmNDbGllbnQuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9hc3luYy9UQXN5bmNDbGllbnQuamF2YQppbmRleCA5YTIyNzE3Li4wMDUwMThhIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvYXN5bmMvVEFzeW5jQ2xpZW50LmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L2FzeW5jL1RBc3luY0NsaWVudC5qYXZhCkBAIC02Niw3ICs2Niw3IEBACiAKICAgLyoqCiAgICAqIEdldCB0aGUgY2xpZW50J3MgZXJyb3IgLSByZXR1cm5zIG51bGwgaWYgbm8gZXJyb3IKLSAgICogQHJldHVybiBHZXQgdGhlIGNsaWVudCdzIGVycm9yLiA8YnIgLz4gcmV0dXJucyBudWxsIGlmIG5vIGVycm9yCisgICAqIEByZXR1cm4gR2V0IHRoZSBjbGllbnQncyBlcnJvci4gPHA+IHJldHVybnMgbnVsbCBpZiBubyBlcnJvcgogICAgKi8KICAgcHVibGljIEV4Y2VwdGlvbiBnZXRFcnJvcigpIHsKICAgICByZXR1cm4gX19fZXJyb3I7CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvYXN5bmMvVEFzeW5jTWV0aG9kQ2FsbC5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L2FzeW5jL1RBc3luY01ldGhvZENhbGwuamF2YQppbmRleCA1YzY3OWI2Li4zYmYxNzQ3IDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvYXN5bmMvVEFzeW5jTWV0aG9kQ2FsbC5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9hc3luYy9UQXN5bmNNZXRob2RDYWxsLmphdmEKQEAgLTMzLDExICszMywxNSBAQAogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uOwogCiAvKioKLSAqIEVuY2Fwc3VsYXRlcyBhbiBhc3luYyBtZXRob2QgY2FsbAorICogRW5jYXBzdWxhdGVzIGFuIGFzeW5jIG1ldGhvZCBjYWxsLgorICogPHA+CiAgKiBOZWVkIHRvIGdlbmVyYXRlOgotICogICAtIHByaXZhdGUgdm9pZCB3cml0ZV9hcmdzKFRQcm90b2NvbCBwcm90b2NvbCkKLSAqICAgLSBwdWJsaWMgVCBnZXRSZXN1bHQoKSB0aHJvd3MgPEV4Y2VwdGlvbl8xPiwgPEV4Y2VwdGlvbl8yPiwgLi4uCi0gKiBAcGFyYW0gPFQ+CisgKiA8dWw+CisgKiAgIDxsaT5wcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCB3cml0ZV9hcmdzKFRQcm90b2NvbCBwcm90b2NvbCk8L2xpPgorICogICA8bGk+cHJvdGVjdGVkIGFic3RyYWN0IFQgZ2V0UmVzdWx0KCkgdGhyb3dzICZsdDtFeGNlcHRpb25fMSZndDssICZsdDtFeGNlcHRpb25fMiZndDssIC4uLjwvbGk+CisgKiA8L3VsPgorICoKKyAqIEBwYXJhbSA8VD4gVGhlIHJldHVybiB0eXBlIG9mIHRoZSBlbmNhcHN1bGF0ZWQgbWV0aG9kIGNhbGwuCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUQXN5bmNNZXRob2RDYWxsPFQ+IHsKIApAQCAtMTEzLDYgKzExNyw4IEBACiAKICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgd3JpdGVfYXJncyhUUHJvdG9jb2wgcHJvdG9jb2wpIHRocm93cyBURXhjZXB0aW9uOwogCisgIHByb3RlY3RlZCBhYnN0cmFjdCBUIGdldFJlc3VsdCgpIHRocm93cyBFeGNlcHRpb247CisKICAgLyoqCiAgICAqIEluaXRpYWxpemUgYnVmZmVycy4KICAgICogQHRocm93cyBURXhjZXB0aW9uIGlmIGJ1ZmZlciBpbml0aWFsaXphdGlvbiBmYWlscwpAQCAtMTY3LDcgKzE3Myw3IEBACiAgICAqIHNlbGVjdCBpbnRlcmVzdHMgd2l0aG91dCB3b3JyeWluZyBhYm91dCBjb25jdXJyZW5jeS4KICAgICogQHBhcmFtIGtleQogICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgdHJhbnNpdGlvbihTZWxlY3Rpb25LZXkga2V5KSB7CisgIHZvaWQgdHJhbnNpdGlvbihTZWxlY3Rpb25LZXkga2V5KSB7CiAgICAgLy8gRW5zdXJlIGtleSBpcyB2YWxpZAogICAgIGlmICgha2V5LmlzVmFsaWQoKSkgewogICAgICAga2V5LmNhbmNlbCgpOwpAQCAtMjI1LDggKzIzMSwxNCBAQAogICAgIGtleS5pbnRlcmVzdE9wcygwKTsKICAgICAvLyB0aGlzIGVuc3VyZXMgdGhhdCB0aGUgVEFzeW5jTWV0aG9kIGluc3RhbmNlIGRvZXNuJ3QgaGFuZyBhcm91bmQKICAgICBrZXkuYXR0YWNoKG51bGwpOwotICAgIGNsaWVudC5vbkNvbXBsZXRlKCk7Ci0gICAgY2FsbGJhY2sub25Db21wbGV0ZSgoVCl0aGlzKTsKKyAgICB0cnkgeworICAgICAgVCByZXN1bHQgPSB0aGlzLmdldFJlc3VsdCgpOworICAgICAgY2xpZW50Lm9uQ29tcGxldGUoKTsKKyAgICAgIGNhbGxiYWNrLm9uQ29tcGxldGUocmVzdWx0KTsKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAga2V5LmNhbmNlbCgpOworICAgICAgb25FcnJvcihlKTsKKyAgICB9CiAgIH0KIAogICBwcml2YXRlIHZvaWQgZG9SZWFkaW5nUmVzcG9uc2VTaXplKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9tZXRhX2RhdGEvRmllbGRNZXRhRGF0YS5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L21ldGFfZGF0YS9GaWVsZE1ldGFEYXRhLmphdmEKaW5kZXggYjYzNDI5MS4uNDQ1ZjdlNCAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L21ldGFfZGF0YS9GaWVsZE1ldGFEYXRhLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L21ldGFfZGF0YS9GaWVsZE1ldGFEYXRhLmphdmEKQEAgLTQ1LDcgKzQ1LDcgQEAKICAgICB0aGlzLnZhbHVlTWV0YURhdGEgPSB2TWV0YURhdGE7CiAgIH0KICAgCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRTdHJ1Y3RNZXRhRGF0YU1hcChDbGFzczw/IGV4dGVuZHMgVEJhc2U+IHNDbGFzcywgTWFwPD8gZXh0ZW5kcyBURmllbGRJZEVudW0sIEZpZWxkTWV0YURhdGE+IG1hcCl7CisgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgYWRkU3RydWN0TWV0YURhdGFNYXAoQ2xhc3M8PyBleHRlbmRzIFRCYXNlPiBzQ2xhc3MsIE1hcDw/IGV4dGVuZHMgVEZpZWxkSWRFbnVtLCBGaWVsZE1ldGFEYXRhPiBtYXApewogICAgIHN0cnVjdE1hcC5wdXQoc0NsYXNzLCBtYXApOwogICB9CiAKQEAgLTU1LDcgKzU1LDcgQEAKICAgICoKICAgICogQHBhcmFtIHNDbGFzcyBUaGUgVEJhc2UgY2xhc3MgZm9yIHdoaWNoIHRoZSBtZXRhZGF0YSBtYXAgaXMgcmVxdWVzdGVkCiAgICAqLwotICBwdWJsaWMgc3RhdGljIE1hcDw/IGV4dGVuZHMgVEZpZWxkSWRFbnVtLCBGaWVsZE1ldGFEYXRhPiBnZXRTdHJ1Y3RNZXRhRGF0YU1hcChDbGFzczw/IGV4dGVuZHMgVEJhc2U+IHNDbGFzcyl7CisgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIE1hcDw/IGV4dGVuZHMgVEZpZWxkSWRFbnVtLCBGaWVsZE1ldGFEYXRhPiBnZXRTdHJ1Y3RNZXRhRGF0YU1hcChDbGFzczw/IGV4dGVuZHMgVEJhc2U+IHNDbGFzcyl7CiAgICAgaWYgKCFzdHJ1Y3RNYXAuY29udGFpbnNLZXkoc0NsYXNzKSl7IC8vIExvYWQgY2xhc3MgaWYgaXQgaGFzbid0IGJlZW4gbG9hZGVkCiAgICAgICB0cnl7CiAgICAgICAgIHNDbGFzcy5uZXdJbnN0YW5jZSgpOwpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1Nob3J0U3RhY2suamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9TaG9ydFN0YWNrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU2NTkzMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9TaG9ydFN0YWNrLmphdmEKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKKy8qKgorICogU2hvcnRTdGFjayBpcyBhIHNob3J0LXNwZWNpZmljIFN0YWNrIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4gZm9yIHRoZSBleHByZXNzCisgKiBwdXJwb3NlIG9mIHZlcnkgZmFzdCBvcGVyYXRpb25zIG9uIFRDb21wYWN0UHJvdG9jb2wncyBmaWVsZCBpZCBzdGFjay4gVGhpcworICogaW1wbGVtZW50YXRpb24gcGVyZm9ybXMgYXQgbGVhc3QgMTB4IGZhc3RlciB0aGFuIGphdmEudXRpbC5TdGFjay4KKyAqLworY2xhc3MgU2hvcnRTdGFjayB7CisKKyAgcHJpdmF0ZSBzaG9ydFtdIHZlY3RvcjsKKworICAvKiogQWx3YXlzIHBvaW50cyB0byB0aGUgbmV4dCBsb2NhdGlvbiAqLworICBwcml2YXRlIGludCB0b3AgPSAwOworCisgIHB1YmxpYyBTaG9ydFN0YWNrKGludCBpbml0aWFsQ2FwYWNpdHkpIHsKKyAgICB2ZWN0b3IgPSBuZXcgc2hvcnRbaW5pdGlhbENhcGFjaXR5XTsKKyAgfQorCisgIHB1YmxpYyBzaG9ydCBwb3AoKSB7CisgICAgcmV0dXJuIHZlY3RvclstLXRvcF07CisgIH0KKworICBwdWJsaWMgdm9pZCBwdXNoKHNob3J0IHB1c2hlZCkgeworICAgIGlmICh2ZWN0b3IubGVuZ3RoID09IHRvcCkgeworICAgICAgZ3JvdygpOworICAgIH0KKyAgICB2ZWN0b3JbdG9wKytdID0gcHVzaGVkOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGdyb3coKSB7CisgICAgdmVjdG9yID0gQXJyYXlzLmNvcHlPZih2ZWN0b3IsIHZlY3Rvci5sZW5ndGggPDwgMSk7CisgIH0KKworICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKyAgICB0b3AgPSAwOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgc2IuYXBwZW5kKCI8U2hvcnRTdGFjayB2ZWN0b3I6WyIpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmVjdG9yLmxlbmd0aDsgaSsrKSB7CisgICAgICBib29sZWFuIGlzVG9wID0gKGkgPT0gKHRvcCAtIDEpKTsKKyAgICAgIHNob3J0IHZhbHVlID0gdmVjdG9yW2ldOworICAgICAgaWYgKGkgIT0gMCkgeworICAgICAgICBzYi5hcHBlbmQoJyAnKTsKKyAgICAgIH0KKyAgICAgIGlmIChpc1RvcCkgeworICAgICAgICBzYi5hcHBlbmQoIj4+IikuYXBwZW5kKHZhbHVlKS5hcHBlbmQoIjw8Iik7CisgICAgICB9IGVsc2UgeworICAgICAgICBzYi5hcHBlbmQodmFsdWUpOworICAgICAgfQorICAgIH0KKyAgICBzYi5hcHBlbmQoIl0+Iik7CisgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuamF2YQppbmRleCA2NWIzMzUzLi43OTI0ZTJmIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5qYXZhCkBAIC0xOSw4ICsxOSw4IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7CiAKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0OwpAQCAtNTIsNiArNTIsOCBAQAogICBwcm90ZWN0ZWQgYm9vbGVhbiBzdHJpY3RSZWFkXzsKICAgcHJvdGVjdGVkIGJvb2xlYW4gc3RyaWN0V3JpdGVfOwogCisgIHByaXZhdGUgZmluYWwgYnl0ZVtdIGlub3V0VGVtcCA9IG5ldyBieXRlWzhdOworCiAgIC8qKgogICAgKiBGYWN0b3J5CiAgICAqLwpAQCAtNjksNiArNzEsMTAgQEAKICAgICAgIHRoaXMoc3RyaWN0UmVhZCwgc3RyaWN0V3JpdGUsIE5PX0xFTkdUSF9MSU1JVCwgTk9fTEVOR1RIX0xJTUlUKTsKICAgICB9CiAKKyAgICBwdWJsaWMgRmFjdG9yeShsb25nIHN0cmluZ0xlbmd0aExpbWl0LCBsb25nIGNvbnRhaW5lckxlbmd0aExpbWl0KSB7CisgICAgICB0aGlzKGZhbHNlLCB0cnVlLCBzdHJpbmdMZW5ndGhMaW1pdCwgY29udGFpbmVyTGVuZ3RoTGltaXQpOworICAgIH0KKwogICAgIHB1YmxpYyBGYWN0b3J5KGJvb2xlYW4gc3RyaWN0UmVhZCwgYm9vbGVhbiBzdHJpY3RXcml0ZSwgbG9uZyBzdHJpbmdMZW5ndGhMaW1pdCwgbG9uZyBjb250YWluZXJMZW5ndGhMaW1pdCkgewogICAgICAgc3RyaW5nTGVuZ3RoTGltaXRfID0gc3RyaW5nTGVuZ3RoTGltaXQ7CiAgICAgICBjb250YWluZXJMZW5ndGhMaW1pdF8gPSBjb250YWluZXJMZW5ndGhMaW1pdDsKQEAgLTkyLDYgKzk4LDEwIEBACiAgICAgdGhpcyh0cmFucywgTk9fTEVOR1RIX0xJTUlULCBOT19MRU5HVEhfTElNSVQsIHN0cmljdFJlYWQsIHN0cmljdFdyaXRlKTsKICAgfQogCisgIHB1YmxpYyBUQmluYXJ5UHJvdG9jb2woVFRyYW5zcG9ydCB0cmFucywgbG9uZyBzdHJpbmdMZW5ndGhMaW1pdCwgbG9uZyBjb250YWluZXJMZW5ndGhMaW1pdCkgeworICAgIHRoaXModHJhbnMsIHN0cmluZ0xlbmd0aExpbWl0LCBjb250YWluZXJMZW5ndGhMaW1pdCwgZmFsc2UsIHRydWUpOworICB9CisKICAgcHVibGljIFRCaW5hcnlQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zLCBsb25nIHN0cmluZ0xlbmd0aExpbWl0LCBsb25nIGNvbnRhaW5lckxlbmd0aExpbWl0LCBib29sZWFuIHN0cmljdFJlYWQsIGJvb2xlYW4gc3RyaWN0V3JpdGUpIHsKICAgICBzdXBlcih0cmFucyk7CiAgICAgc3RyaW5nTGVuZ3RoTGltaXRfID0gc3RyaW5nTGVuZ3RoTGltaXQ7CkBAIC0xMDAsNiArMTEwLDcgQEAKICAgICBzdHJpY3RXcml0ZV8gPSBzdHJpY3RXcml0ZTsKICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZU1lc3NhZ2VCZWdpbihUTWVzc2FnZSBtZXNzYWdlKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgaWYgKHN0cmljdFdyaXRlXykgewogICAgICAgaW50IHZlcnNpb24gPSBWRVJTSU9OXzEgfCBtZXNzYWdlLnR5cGU7CkBAIC0xMTMsOTggKzEyNCwxMTAgQEAKICAgICB9CiAgIH0KIAotICBwdWJsaWMgdm9pZCB3cml0ZU1lc3NhZ2VFbmQoKSB7fQorICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgd3JpdGVNZXNzYWdlRW5kKCkgdGhyb3dzIFRFeGNlcHRpb24ge30KIAotICBwdWJsaWMgdm9pZCB3cml0ZVN0cnVjdEJlZ2luKFRTdHJ1Y3Qgc3RydWN0KSB7fQorICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgd3JpdGVTdHJ1Y3RCZWdpbihUU3RydWN0IHN0cnVjdCkgdGhyb3dzIFRFeGNlcHRpb24ge30KIAotICBwdWJsaWMgdm9pZCB3cml0ZVN0cnVjdEVuZCgpIHt9CisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCB3cml0ZVN0cnVjdEVuZCgpIHRocm93cyBURXhjZXB0aW9uIHt9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlRmllbGRCZWdpbihURmllbGQgZmllbGQpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICB3cml0ZUJ5dGUoZmllbGQudHlwZSk7CiAgICAgd3JpdGVJMTYoZmllbGQuaWQpOwogICB9CiAKLSAgcHVibGljIHZvaWQgd3JpdGVGaWVsZEVuZCgpIHt9CisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCB3cml0ZUZpZWxkRW5kKCkgdGhyb3dzIFRFeGNlcHRpb24ge30KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVGaWVsZFN0b3AoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgd3JpdGVCeXRlKFRUeXBlLlNUT1ApOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlTWFwQmVnaW4oVE1hcCBtYXApIHRocm93cyBURXhjZXB0aW9uIHsKICAgICB3cml0ZUJ5dGUobWFwLmtleVR5cGUpOwogICAgIHdyaXRlQnl0ZShtYXAudmFsdWVUeXBlKTsKICAgICB3cml0ZUkzMihtYXAuc2l6ZSk7CiAgIH0KIAotICBwdWJsaWMgdm9pZCB3cml0ZU1hcEVuZCgpIHt9CisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCB3cml0ZU1hcEVuZCgpIHRocm93cyBURXhjZXB0aW9uIHt9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlTGlzdEJlZ2luKFRMaXN0IGxpc3QpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICB3cml0ZUJ5dGUobGlzdC5lbGVtVHlwZSk7CiAgICAgd3JpdGVJMzIobGlzdC5zaXplKTsKICAgfQogCi0gIHB1YmxpYyB2b2lkIHdyaXRlTGlzdEVuZCgpIHt9CisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCB3cml0ZUxpc3RFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7fQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZVNldEJlZ2luKFRTZXQgc2V0KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgd3JpdGVCeXRlKHNldC5lbGVtVHlwZSk7CiAgICAgd3JpdGVJMzIoc2V0LnNpemUpOwogICB9CiAKLSAgcHVibGljIHZvaWQgd3JpdGVTZXRFbmQoKSB7fQorICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgd3JpdGVTZXRFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7fQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZUJvb2woYm9vbGVhbiBiKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgd3JpdGVCeXRlKGIgPyAoYnl0ZSkxIDogKGJ5dGUpMCk7CiAgIH0KIAotICBwcml2YXRlIGJ5dGUgW10gYm91dCA9IG5ldyBieXRlWzFdOworICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVCeXRlKGJ5dGUgYikgdGhyb3dzIFRFeGNlcHRpb24gewotICAgIGJvdXRbMF0gPSBiOwotICAgIHRyYW5zXy53cml0ZShib3V0LCAwLCAxKTsKKyAgICBpbm91dFRlbXBbMF0gPSBiOworICAgIHRyYW5zXy53cml0ZShpbm91dFRlbXAsIDAsIDEpOwogICB9CiAKLSAgcHJpdmF0ZSBieXRlW10gaTE2b3V0ID0gbmV3IGJ5dGVbMl07CisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZUkxNihzaG9ydCBpMTYpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICBpMTZvdXRbMF0gPSAoYnl0ZSkoMHhmZiAmIChpMTYgPj4gOCkpOwotICAgIGkxNm91dFsxXSA9IChieXRlKSgweGZmICYgKGkxNikpOwotICAgIHRyYW5zXy53cml0ZShpMTZvdXQsIDAsIDIpOworICAgIGlub3V0VGVtcFswXSA9IChieXRlKSgweGZmICYgKGkxNiA+PiA4KSk7CisgICAgaW5vdXRUZW1wWzFdID0gKGJ5dGUpKDB4ZmYgJiAoaTE2KSk7CisgICAgdHJhbnNfLndyaXRlKGlub3V0VGVtcCwgMCwgMik7CiAgIH0KIAotICBwcml2YXRlIGJ5dGVbXSBpMzJvdXQgPSBuZXcgYnl0ZVs0XTsKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlSTMyKGludCBpMzIpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICBpMzJvdXRbMF0gPSAoYnl0ZSkoMHhmZiAmIChpMzIgPj4gMjQpKTsKLSAgICBpMzJvdXRbMV0gPSAoYnl0ZSkoMHhmZiAmIChpMzIgPj4gMTYpKTsKLSAgICBpMzJvdXRbMl0gPSAoYnl0ZSkoMHhmZiAmIChpMzIgPj4gOCkpOwotICAgIGkzMm91dFszXSA9IChieXRlKSgweGZmICYgKGkzMikpOwotICAgIHRyYW5zXy53cml0ZShpMzJvdXQsIDAsIDQpOworICAgIGlub3V0VGVtcFswXSA9IChieXRlKSgweGZmICYgKGkzMiA+PiAyNCkpOworICAgIGlub3V0VGVtcFsxXSA9IChieXRlKSgweGZmICYgKGkzMiA+PiAxNikpOworICAgIGlub3V0VGVtcFsyXSA9IChieXRlKSgweGZmICYgKGkzMiA+PiA4KSk7CisgICAgaW5vdXRUZW1wWzNdID0gKGJ5dGUpKDB4ZmYgJiAoaTMyKSk7CisgICAgdHJhbnNfLndyaXRlKGlub3V0VGVtcCwgMCwgNCk7CiAgIH0KIAotICBwcml2YXRlIGJ5dGVbXSBpNjRvdXQgPSBuZXcgYnl0ZVs4XTsKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlSTY0KGxvbmcgaTY0KSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgaTY0b3V0WzBdID0gKGJ5dGUpKDB4ZmYgJiAoaTY0ID4+IDU2KSk7Ci0gICAgaTY0b3V0WzFdID0gKGJ5dGUpKDB4ZmYgJiAoaTY0ID4+IDQ4KSk7Ci0gICAgaTY0b3V0WzJdID0gKGJ5dGUpKDB4ZmYgJiAoaTY0ID4+IDQwKSk7Ci0gICAgaTY0b3V0WzNdID0gKGJ5dGUpKDB4ZmYgJiAoaTY0ID4+IDMyKSk7Ci0gICAgaTY0b3V0WzRdID0gKGJ5dGUpKDB4ZmYgJiAoaTY0ID4+IDI0KSk7Ci0gICAgaTY0b3V0WzVdID0gKGJ5dGUpKDB4ZmYgJiAoaTY0ID4+IDE2KSk7Ci0gICAgaTY0b3V0WzZdID0gKGJ5dGUpKDB4ZmYgJiAoaTY0ID4+IDgpKTsKLSAgICBpNjRvdXRbN10gPSAoYnl0ZSkoMHhmZiAmIChpNjQpKTsKLSAgICB0cmFuc18ud3JpdGUoaTY0b3V0LCAwLCA4KTsKKyAgICBpbm91dFRlbXBbMF0gPSAoYnl0ZSkoMHhmZiAmIChpNjQgPj4gNTYpKTsKKyAgICBpbm91dFRlbXBbMV0gPSAoYnl0ZSkoMHhmZiAmIChpNjQgPj4gNDgpKTsKKyAgICBpbm91dFRlbXBbMl0gPSAoYnl0ZSkoMHhmZiAmIChpNjQgPj4gNDApKTsKKyAgICBpbm91dFRlbXBbM10gPSAoYnl0ZSkoMHhmZiAmIChpNjQgPj4gMzIpKTsKKyAgICBpbm91dFRlbXBbNF0gPSAoYnl0ZSkoMHhmZiAmIChpNjQgPj4gMjQpKTsKKyAgICBpbm91dFRlbXBbNV0gPSAoYnl0ZSkoMHhmZiAmIChpNjQgPj4gMTYpKTsKKyAgICBpbm91dFRlbXBbNl0gPSAoYnl0ZSkoMHhmZiAmIChpNjQgPj4gOCkpOworICAgIGlub3V0VGVtcFs3XSA9IChieXRlKSgweGZmICYgKGk2NCkpOworICAgIHRyYW5zXy53cml0ZShpbm91dFRlbXAsIDAsIDgpOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlRG91YmxlKGRvdWJsZSBkdWIpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICB3cml0ZUk2NChEb3VibGUuZG91YmxlVG9Mb25nQml0cyhkdWIpKTsKICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZVN0cmluZyhTdHJpbmcgc3RyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgdHJ5IHsKLSAgICAgIGJ5dGVbXSBkYXQgPSBzdHIuZ2V0Qnl0ZXMoIlVURi04Iik7Ci0gICAgICB3cml0ZUkzMihkYXQubGVuZ3RoKTsKLSAgICAgIHRyYW5zXy53cml0ZShkYXQsIDAsIGRhdC5sZW5ndGgpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gdWV4KSB7Ci0gICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiSlZNIERPRVMgTk9UIFNVUFBPUlQgVVRGLTgiKTsKLSAgICB9CisgICAgYnl0ZVtdIGRhdCA9IHN0ci5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKKyAgICB3cml0ZUkzMihkYXQubGVuZ3RoKTsKKyAgICB0cmFuc18ud3JpdGUoZGF0LCAwLCBkYXQubGVuZ3RoKTsKICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZUJpbmFyeShCeXRlQnVmZmVyIGJpbikgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIGludCBsZW5ndGggPSBiaW4ubGltaXQoKSAtIGJpbi5wb3NpdGlvbigpOwogICAgIHdyaXRlSTMyKGxlbmd0aCk7CkBAIC0yMTUsNiArMjM4LDcgQEAKICAgICogUmVhZGluZyBtZXRob2RzLgogICAgKi8KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIFRNZXNzYWdlIHJlYWRNZXNzYWdlQmVnaW4oKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgaW50IHNpemUgPSByZWFkSTMyKCk7CiAgICAgaWYgKHNpemUgPCAwKSB7CkBAIC0yMzEsNjQgKzI1NSw3NiBAQAogICAgIH0KICAgfQogCi0gIHB1YmxpYyB2b2lkIHJlYWRNZXNzYWdlRW5kKCkge30KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHJlYWRNZXNzYWdlRW5kKCkgdGhyb3dzIFRFeGNlcHRpb24ge30KIAotICBwdWJsaWMgVFN0cnVjdCByZWFkU3RydWN0QmVnaW4oKSB7CisgIEBPdmVycmlkZQorICBwdWJsaWMgVFN0cnVjdCByZWFkU3RydWN0QmVnaW4oKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgcmV0dXJuIEFOT05ZTU9VU19TVFJVQ1Q7CiAgIH0KIAotICBwdWJsaWMgdm9pZCByZWFkU3RydWN0RW5kKCkge30KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHJlYWRTdHJ1Y3RFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7fQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgVEZpZWxkIHJlYWRGaWVsZEJlZ2luKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIGJ5dGUgdHlwZSA9IHJlYWRCeXRlKCk7CiAgICAgc2hvcnQgaWQgPSB0eXBlID09IFRUeXBlLlNUT1AgPyAwIDogcmVhZEkxNigpOwogICAgIHJldHVybiBuZXcgVEZpZWxkKCIiLCB0eXBlLCBpZCk7CiAgIH0KIAotICBwdWJsaWMgdm9pZCByZWFkRmllbGRFbmQoKSB7fQorICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgcmVhZEZpZWxkRW5kKCkgdGhyb3dzIFRFeGNlcHRpb24ge30KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIFRNYXAgcmVhZE1hcEJlZ2luKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIFRNYXAgbWFwID0gbmV3IFRNYXAocmVhZEJ5dGUoKSwgcmVhZEJ5dGUoKSwgcmVhZEkzMigpKTsKICAgICBjaGVja0NvbnRhaW5lclJlYWRMZW5ndGgobWFwLnNpemUpOwogICAgIHJldHVybiBtYXA7CiAgIH0KIAotICBwdWJsaWMgdm9pZCByZWFkTWFwRW5kKCkge30KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHJlYWRNYXBFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7fQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgVExpc3QgcmVhZExpc3RCZWdpbigpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICBUTGlzdCBsaXN0ID0gbmV3IFRMaXN0KHJlYWRCeXRlKCksIHJlYWRJMzIoKSk7CiAgICAgY2hlY2tDb250YWluZXJSZWFkTGVuZ3RoKGxpc3Quc2l6ZSk7CiAgICAgcmV0dXJuIGxpc3Q7CiAgIH0KIAotICBwdWJsaWMgdm9pZCByZWFkTGlzdEVuZCgpIHt9CisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCByZWFkTGlzdEVuZCgpIHRocm93cyBURXhjZXB0aW9uIHt9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyBUU2V0IHJlYWRTZXRCZWdpbigpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICBUU2V0IHNldCA9IG5ldyBUU2V0KHJlYWRCeXRlKCksIHJlYWRJMzIoKSk7CiAgICAgY2hlY2tDb250YWluZXJSZWFkTGVuZ3RoKHNldC5zaXplKTsKICAgICByZXR1cm4gc2V0OwogICB9CiAKLSAgcHVibGljIHZvaWQgcmVhZFNldEVuZCgpIHt9CisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCByZWFkU2V0RW5kKCkgdGhyb3dzIFRFeGNlcHRpb24ge30KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIGJvb2xlYW4gcmVhZEJvb2woKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgcmV0dXJuIChyZWFkQnl0ZSgpID09IDEpOwogICB9CiAKLSAgcHJpdmF0ZSBieXRlW10gYmluID0gbmV3IGJ5dGVbMV07CisgIEBPdmVycmlkZQogICBwdWJsaWMgYnl0ZSByZWFkQnl0ZSgpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICBpZiAodHJhbnNfLmdldEJ5dGVzUmVtYWluaW5nSW5CdWZmZXIoKSA+PSAxKSB7CiAgICAgICBieXRlIGIgPSB0cmFuc18uZ2V0QnVmZmVyKClbdHJhbnNfLmdldEJ1ZmZlclBvc2l0aW9uKCldOwogICAgICAgdHJhbnNfLmNvbnN1bWVCdWZmZXIoMSk7CiAgICAgICByZXR1cm4gYjsKICAgICB9Ci0gICAgcmVhZEFsbChiaW4sIDAsIDEpOwotICAgIHJldHVybiBiaW5bMF07CisgICAgcmVhZEFsbChpbm91dFRlbXAsIDAsIDEpOworICAgIHJldHVybiBpbm91dFRlbXBbMF07CiAgIH0KIAotICBwcml2YXRlIGJ5dGVbXSBpMTZyZCA9IG5ldyBieXRlWzJdOworICBAT3ZlcnJpZGUKICAgcHVibGljIHNob3J0IHJlYWRJMTYoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgYnl0ZVtdIGJ1ZiA9IGkxNnJkOworICAgIGJ5dGVbXSBidWYgPSBpbm91dFRlbXA7CiAgICAgaW50IG9mZiA9IDA7CiAKICAgICBpZiAodHJhbnNfLmdldEJ5dGVzUmVtYWluaW5nSW5CdWZmZXIoKSA+PSAyKSB7CkBAIC0yOTYsNyArMzMyLDcgQEAKICAgICAgIG9mZiA9IHRyYW5zXy5nZXRCdWZmZXJQb3NpdGlvbigpOwogICAgICAgdHJhbnNfLmNvbnN1bWVCdWZmZXIoMik7CiAgICAgfSBlbHNlIHsKLSAgICAgIHJlYWRBbGwoaTE2cmQsIDAsIDIpOworICAgICAgcmVhZEFsbChpbm91dFRlbXAsIDAsIDIpOwogICAgIH0KIAogICAgIHJldHVybgpAQCAtMzA1LDkgKzM0MSw5IEBACiAgICAgICAgKChidWZbb2ZmKzFdICYgMHhmZikpKTsKICAgfQogCi0gIHByaXZhdGUgYnl0ZVtdIGkzMnJkID0gbmV3IGJ5dGVbNF07CisgIEBPdmVycmlkZQogICBwdWJsaWMgaW50IHJlYWRJMzIoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgYnl0ZVtdIGJ1ZiA9IGkzMnJkOworICAgIGJ5dGVbXSBidWYgPSBpbm91dFRlbXA7CiAgICAgaW50IG9mZiA9IDA7CiAKICAgICBpZiAodHJhbnNfLmdldEJ5dGVzUmVtYWluaW5nSW5CdWZmZXIoKSA+PSA0KSB7CkBAIC0zMTUsNyArMzUxLDcgQEAKICAgICAgIG9mZiA9IHRyYW5zXy5nZXRCdWZmZXJQb3NpdGlvbigpOwogICAgICAgdHJhbnNfLmNvbnN1bWVCdWZmZXIoNCk7CiAgICAgfSBlbHNlIHsKLSAgICAgIHJlYWRBbGwoaTMycmQsIDAsIDQpOworICAgICAgcmVhZEFsbChpbm91dFRlbXAsIDAsIDQpOwogICAgIH0KICAgICByZXR1cm4KICAgICAgICgoYnVmW29mZl0gJiAweGZmKSA8PCAyNCkgfApAQCAtMzI0LDkgKzM2MCw5IEBACiAgICAgICAoKGJ1ZltvZmYrM10gJiAweGZmKSk7CiAgIH0KIAotICBwcml2YXRlIGJ5dGVbXSBpNjRyZCA9IG5ldyBieXRlWzhdOworICBAT3ZlcnJpZGUKICAgcHVibGljIGxvbmcgcmVhZEk2NCgpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICBieXRlW10gYnVmID0gaTY0cmQ7CisgICAgYnl0ZVtdIGJ1ZiA9IGlub3V0VGVtcDsKICAgICBpbnQgb2ZmID0gMDsKIAogICAgIGlmICh0cmFuc18uZ2V0Qnl0ZXNSZW1haW5pbmdJbkJ1ZmZlcigpID49IDgpIHsKQEAgLTMzNCw3ICszNzAsNyBAQAogICAgICAgb2ZmID0gdHJhbnNfLmdldEJ1ZmZlclBvc2l0aW9uKCk7CiAgICAgICB0cmFuc18uY29uc3VtZUJ1ZmZlcig4KTsKICAgICB9IGVsc2UgewotICAgICAgcmVhZEFsbChpNjRyZCwgMCwgOCk7CisgICAgICByZWFkQWxsKGlub3V0VGVtcCwgMCwgOCk7CiAgICAgfQogCiAgICAgcmV0dXJuCkBAIC0zNDgsNDkgKzM4NCwzOSBAQAogICAgICAgKChsb25nKShidWZbb2ZmKzddICYgMHhmZikpOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyBkb3VibGUgcmVhZERvdWJsZSgpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICByZXR1cm4gRG91YmxlLmxvbmdCaXRzVG9Eb3VibGUocmVhZEk2NCgpKTsKICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgU3RyaW5nIHJlYWRTdHJpbmcoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgaW50IHNpemUgPSByZWFkSTMyKCk7CiAKICAgICBjaGVja1N0cmluZ1JlYWRMZW5ndGgoc2l6ZSk7Ci0gICAgaWYgKHN0cmluZ0xlbmd0aExpbWl0XyA+IDAgJiYgc2l6ZSA+IHN0cmluZ0xlbmd0aExpbWl0XykgewotICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uU0laRV9MSU1JVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN0cmluZyBmaWVsZCBleGNlZWRlZCBzdHJpbmcgc2l6ZSBsaW1pdCIpOwotICAgIH0KIAogICAgIGlmICh0cmFuc18uZ2V0Qnl0ZXNSZW1haW5pbmdJbkJ1ZmZlcigpID49IHNpemUpIHsKLSAgICAgIHRyeSB7Ci0gICAgICAgIFN0cmluZyBzID0gbmV3IFN0cmluZyh0cmFuc18uZ2V0QnVmZmVyKCksIHRyYW5zXy5nZXRCdWZmZXJQb3NpdGlvbigpLCBzaXplLCAiVVRGLTgiKTsKLSAgICAgICAgdHJhbnNfLmNvbnN1bWVCdWZmZXIoc2l6ZSk7Ci0gICAgICAgIHJldHVybiBzOwotICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJKVk0gRE9FUyBOT1QgU1VQUE9SVCBVVEYtOCIpOwotICAgICAgfQorICAgICAgU3RyaW5nIHMgPSBuZXcgU3RyaW5nKHRyYW5zXy5nZXRCdWZmZXIoKSwgdHJhbnNfLmdldEJ1ZmZlclBvc2l0aW9uKCksCisgICAgICAgICAgc2l6ZSwgU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CisgICAgICB0cmFuc18uY29uc3VtZUJ1ZmZlcihzaXplKTsKKyAgICAgIHJldHVybiBzOwogICAgIH0KIAogICAgIHJldHVybiByZWFkU3RyaW5nQm9keShzaXplKTsKICAgfQogCiAgIHB1YmxpYyBTdHJpbmcgcmVhZFN0cmluZ0JvZHkoaW50IHNpemUpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICB0cnkgewotICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlW3NpemVdOwotICAgICAgdHJhbnNfLnJlYWRBbGwoYnVmLCAwLCBzaXplKTsKLSAgICAgIHJldHVybiBuZXcgU3RyaW5nKGJ1ZiwgIlVURi04Iik7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB1ZXgpIHsKLSAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJKVk0gRE9FUyBOT1QgU1VQUE9SVCBVVEYtOCIpOwotICAgIH0KKyAgICBjaGVja1N0cmluZ1JlYWRMZW5ndGgoc2l6ZSk7CisgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlW3NpemVdOworICAgIHRyYW5zXy5yZWFkQWxsKGJ1ZiwgMCwgc2l6ZSk7CisgICAgcmV0dXJuIG5ldyBTdHJpbmcoYnVmLCBTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgQnl0ZUJ1ZmZlciByZWFkQmluYXJ5KCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIGludCBzaXplID0gcmVhZEkzMigpOwogCi0gICAgaWYgKHN0cmluZ0xlbmd0aExpbWl0XyA+IDAgJiYgc2l6ZSA+IHN0cmluZ0xlbmd0aExpbWl0XykgewotICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uU0laRV9MSU1JVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJpbmFyeSBmaWVsZCBleGNlZWRlZCBzdHJpbmcgc2l6ZSBsaW1pdCIpOwotICAgIH0KKyAgICBjaGVja1N0cmluZ1JlYWRMZW5ndGgoc2l6ZSk7CiAKICAgICBpZiAodHJhbnNfLmdldEJ5dGVzUmVtYWluaW5nSW5CdWZmZXIoKSA+PSBzaXplKSB7CiAgICAgICBCeXRlQnVmZmVyIGJiID0gQnl0ZUJ1ZmZlci53cmFwKHRyYW5zXy5nZXRCdWZmZXIoKSwgdHJhbnNfLmdldEJ1ZmZlclBvc2l0aW9uKCksIHNpemUpOwpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLmphdmEKaW5kZXggNTk3M2ZjZC4uZWUwNTg2OSAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5qYXZhCkBAIC0yMiw4ICsyMiw4IEBACiAKIGltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CiAKLWltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5TaG9ydFN0YWNrOwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQ7CiAKQEAgLTM3LDYgKzM3LDggQEAKICAqIGFuZCBpNjQgZmllbGRzIHlvdSBoYXZlLCB0aGUgbW9yZSBiZW5lZml0IHlvdSdsbCBzZWUuCiAgKi8KIHB1YmxpYyBjbGFzcyBUQ29tcGFjdFByb3RvY29sIGV4dGVuZHMgVFByb3RvY29sIHsKKyAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZVtdIEVNUFRZX0JZVEVTID0gbmV3IGJ5dGVbMF07CisgIHByaXZhdGUgZmluYWwgc3RhdGljIEJ5dGVCdWZmZXIgRU1QVFlfQlVGRkVSID0gQnl0ZUJ1ZmZlci53cmFwKEVNUFRZX0JZVEVTKTsKIAogICBwcml2YXRlIGZpbmFsIHN0YXRpYyBsb25nIE5PX0xFTkdUSF9MSU1JVCA9IC0xOwogCkBAIC0xNDQsNiArMTQ2LDEyIEBACiAgIHByaXZhdGUgZmluYWwgbG9uZyBjb250YWluZXJMZW5ndGhMaW1pdF87CiAKICAgLyoqCisgICAqIFRlbXBvcmFyeSBidWZmZXIgdXNlZCBmb3IgdmFyaW91cyBvcGVyYXRpb25zIHRoYXQgd291bGQgb3RoZXJ3aXNlIHJlcXVpcmUgYQorICAgKiBzbWFsbCBhbGxvY2F0aW9uLgorICAgKi8KKyAgcHJpdmF0ZSBmaW5hbCBieXRlW10gdGVtcCA9IG5ldyBieXRlWzEwXTsKKworICAvKioKICAgICogQ3JlYXRlIGEgVENvbXBhY3RQcm90b2NvbC4KICAgICoKICAgICogQHBhcmFtIHRyYW5zcG9ydCB0aGUgVFRyYW5zcG9ydCBvYmplY3QgdG8gcmVhZCBmcm9tIG9yIHdyaXRlIHRvLgpAQCAtMTk0LDYgKzIwMiw3IEBACiAgICAqIFdyaXRlIGEgbWVzc2FnZSBoZWFkZXIgdG8gdGhlIHdpcmUuIENvbXBhY3QgUHJvdG9jb2wgbWVzc2FnZXMgY29udGFpbiB0aGUKICAgICogcHJvdG9jb2wgdmVyc2lvbiBzbyB3ZSBjYW4gbWlncmF0ZSBmb3J3YXJkcyBpbiB0aGUgZnV0dXJlIGlmIG5lZWQgYmUuCiAgICAqLworICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVNZXNzYWdlQmVnaW4oVE1lc3NhZ2UgbWVzc2FnZSkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHdyaXRlQnl0ZURpcmVjdChQUk9UT0NPTF9JRCk7CiAgICAgd3JpdGVCeXRlRGlyZWN0KChWRVJTSU9OICYgVkVSU0lPTl9NQVNLKSB8ICgobWVzc2FnZS50eXBlIDw8IFRZUEVfU0hJRlRfQU1PVU5UKSAmIFRZUEVfTUFTSykpOwpAQCAtMjA2LDYgKzIxNSw3IEBACiAgICAqIHVzZSBpdCBhcyBhbiBvcHBvcnR1bml0eSB0byBwdXQgc3BlY2lhbCBwbGFjZWhvbGRlciBtYXJrZXJzIG9uIHRoZSBmaWVsZAogICAgKiBzdGFjayBzbyB3ZSBjYW4gZ2V0IHRoZSBmaWVsZCBpZCBkZWx0YXMgY29ycmVjdC4KICAgICovCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZVN0cnVjdEJlZ2luKFRTdHJ1Y3Qgc3RydWN0KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgbGFzdEZpZWxkXy5wdXNoKGxhc3RGaWVsZElkXyk7CiAgICAgbGFzdEZpZWxkSWRfID0gMDsKQEAgLTIyMiw3ICsyMzIsNyBAQAogCiAgIC8qKgogICAgKiBXcml0ZSBhIGZpZWxkIGhlYWRlciBjb250YWluaW5nIHRoZSBmaWVsZCBpZCBhbmQgZmllbGQgdHlwZS4gSWYgdGhlCi0gICAqIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgY3VycmVudCBmaWVsZCBpZCBhbmQgdGhlIGxhc3Qgb25lIGlzIHNtYWxsICg8IDE1KSwKKyAgICogZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBjdXJyZW50IGZpZWxkIGlkIGFuZCB0aGUgbGFzdCBvbmUgaXMgc21hbGwgKCZsdDsgMTUpLAogICAgKiB0aGVuIHRoZSBmaWVsZCBpZCB3aWxsIGJlIGVuY29kZWQgaW4gdGhlIDQgTVNCIGFzIGEgZGVsdGEuIE90aGVyd2lzZSwgdGhlCiAgICAqIGZpZWxkIGlkIHdpbGwgZm9sbG93IHRoZSB0eXBlIGhlYWRlciBhcyBhIHppZ3phZyB2YXJpbnQuCiAgICAqLwpAQCAtMzQzLDIxICszNTMsMTYgQEAKICAgICogV3JpdGUgYSBkb3VibGUgdG8gdGhlIHdpcmUgYXMgOCBieXRlcy4KICAgICovCiAgIHB1YmxpYyB2b2lkIHdyaXRlRG91YmxlKGRvdWJsZSBkdWIpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICBieXRlW10gZGF0YSA9IG5ldyBieXRlW117MCwgMCwgMCwgMCwgMCwgMCwgMCwgMH07Ci0gICAgZml4ZWRMb25nVG9CeXRlcyhEb3VibGUuZG91YmxlVG9Mb25nQml0cyhkdWIpLCBkYXRhLCAwKTsKLSAgICB0cmFuc18ud3JpdGUoZGF0YSk7CisgICAgZml4ZWRMb25nVG9CeXRlcyhEb3VibGUuZG91YmxlVG9Mb25nQml0cyhkdWIpLCB0ZW1wLCAwKTsKKyAgICB0cmFuc18ud3JpdGUodGVtcCwgMCwgOCk7CiAgIH0KIAogICAvKioKICAgICogV3JpdGUgYSBzdHJpbmcgdG8gdGhlIHdpcmUgd2l0aCBhIHZhcmludCBzaXplIHByZWNlZGluZy4KICAgICovCiAgIHB1YmxpYyB2b2lkIHdyaXRlU3RyaW5nKFN0cmluZyBzdHIpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICB0cnkgewotICAgICAgYnl0ZVtdIGJ5dGVzID0gc3RyLmdldEJ5dGVzKCJVVEYtOCIpOwotICAgICAgd3JpdGVCaW5hcnkoYnl0ZXMsIDAsIGJ5dGVzLmxlbmd0aCk7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiVVRGLTggbm90IHN1cHBvcnRlZCEiKTsKLSAgICB9CisgICAgYnl0ZVtdIGJ5dGVzID0gc3RyLmdldEJ5dGVzKFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpOworICAgIHdyaXRlQmluYXJ5KGJ5dGVzLCAwLCBieXRlcy5sZW5ndGgpOwogICB9CiAKICAgLyoqCkBAIC00MDUsNDAgKzQxMCwzOCBAQAogICAgKiBXcml0ZSBhbiBpMzIgYXMgYSB2YXJpbnQuIFJlc3VsdHMgaW4gMS01IGJ5dGVzIG9uIHRoZSB3aXJlLgogICAgKiBUT0RPOiBtYWtlIGEgcGVybWFuZW50IGJ1ZmZlciBsaWtlIHdyaXRlVmFyaW50NjQ/CiAgICAqLwotICBieXRlW10gaTMyYnVmID0gbmV3IGJ5dGVbNV07CiAgIHByaXZhdGUgdm9pZCB3cml0ZVZhcmludDMyKGludCBuKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgaW50IGlkeCA9IDA7CiAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgIGlmICgobiAmIH4weDdGKSA9PSAwKSB7Ci0gICAgICAgIGkzMmJ1ZltpZHgrK10gPSAoYnl0ZSluOworICAgICAgICB0ZW1wW2lkeCsrXSA9IChieXRlKW47CiAgICAgICAgIC8vIHdyaXRlQnl0ZURpcmVjdCgoYnl0ZSluKTsKICAgICAgICAgYnJlYWs7CiAgICAgICAgIC8vIHJldHVybjsKICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGkzMmJ1ZltpZHgrK10gPSAoYnl0ZSkoKG4gJiAweDdGKSB8IDB4ODApOworICAgICAgICB0ZW1wW2lkeCsrXSA9IChieXRlKSgobiAmIDB4N0YpIHwgMHg4MCk7CiAgICAgICAgIC8vIHdyaXRlQnl0ZURpcmVjdCgoYnl0ZSkoKG4gJiAweDdGKSB8IDB4ODApKTsKICAgICAgICAgbiA+Pj49IDc7CiAgICAgICB9CiAgICAgfQotICAgIHRyYW5zXy53cml0ZShpMzJidWYsIDAsIGlkeCk7CisgICAgdHJhbnNfLndyaXRlKHRlbXAsIDAsIGlkeCk7CiAgIH0KIAogICAvKioKICAgICogV3JpdGUgYW4gaTY0IGFzIGEgdmFyaW50LiBSZXN1bHRzIGluIDEtMTAgYnl0ZXMgb24gdGhlIHdpcmUuCiAgICAqLwotICBieXRlW10gdmFyaW50NjRvdXQgPSBuZXcgYnl0ZVsxMF07CiAgIHByaXZhdGUgdm9pZCB3cml0ZVZhcmludDY0KGxvbmcgbikgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIGludCBpZHggPSAwOwogICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICBpZiAoKG4gJiB+MHg3RkwpID09IDApIHsKLSAgICAgICAgdmFyaW50NjRvdXRbaWR4KytdID0gKGJ5dGUpbjsKKyAgICAgICAgdGVtcFtpZHgrK10gPSAoYnl0ZSluOwogICAgICAgICBicmVhazsKICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHZhcmludDY0b3V0W2lkeCsrXSA9ICgoYnl0ZSkoKG4gJiAweDdGKSB8IDB4ODApKTsKKyAgICAgICAgdGVtcFtpZHgrK10gPSAoKGJ5dGUpKChuICYgMHg3RikgfCAweDgwKSk7CiAgICAgICAgIG4gPj4+PSA3OwogICAgICAgfQogICAgIH0KLSAgICB0cmFuc18ud3JpdGUodmFyaW50NjRvdXQsIDAsIGlkeCk7CisgICAgdHJhbnNfLndyaXRlKHRlbXAsIDAsIGlkeCk7CiAgIH0KIAogICAvKioKQEAgLTQ3NiwxMCArNDc5LDkgQEAKICAgICogV3JpdGVzIGEgYnl0ZSB3aXRob3V0IGFueSBwb3NzaWJpbGl0eSBvZiBhbGwgdGhhdCBmaWVsZCBoZWFkZXIgbm9uc2Vuc2UuCiAgICAqIFVzZWQgaW50ZXJuYWxseSBieSBvdGhlciB3cml0aW5nIG1ldGhvZHMgdGhhdCBrbm93IHRoZXkgbmVlZCB0byB3cml0ZSBhIGJ5dGUuCiAgICAqLwotICBwcml2YXRlIGJ5dGVbXSBieXRlRGlyZWN0QnVmZmVyID0gbmV3IGJ5dGVbMV07CiAgIHByaXZhdGUgdm9pZCB3cml0ZUJ5dGVEaXJlY3QoYnl0ZSBiKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgYnl0ZURpcmVjdEJ1ZmZlclswXSA9IGI7Ci0gICAgdHJhbnNfLndyaXRlKGJ5dGVEaXJlY3RCdWZmZXIpOworICAgIHRlbXBbMF0gPSBiOworICAgIHRyYW5zXy53cml0ZSh0ZW1wLCAwLCAxKTsKICAgfQogCiAgIC8qKgpAQCAtNjIxLDcgKzYyMyw2IEBACiAgICAgcmV0dXJuIHJlYWRCeXRlKCkgPT0gVHlwZXMuQk9PTEVBTl9UUlVFOwogICB9CiAKLSAgYnl0ZVtdIGJ5dGVSYXdCdWYgPSBuZXcgYnl0ZVsxXTsKICAgLyoqCiAgICAqIFJlYWQgYSBzaW5nbGUgYnl0ZSBvZmYgdGhlIHdpcmUuIE5vdGhpbmcgaW50ZXJlc3RpbmcgaGVyZS4KICAgICovCkBAIC02MzEsOCArNjMyLDggQEAKICAgICAgIGIgPSB0cmFuc18uZ2V0QnVmZmVyKClbdHJhbnNfLmdldEJ1ZmZlclBvc2l0aW9uKCldOwogICAgICAgdHJhbnNfLmNvbnN1bWVCdWZmZXIoMSk7CiAgICAgfSBlbHNlIHsKLSAgICAgIHRyYW5zXy5yZWFkQWxsKGJ5dGVSYXdCdWYsIDAsIDEpOwotICAgICAgYiA9IGJ5dGVSYXdCdWZbMF07CisgICAgICB0cmFuc18ucmVhZEFsbCh0ZW1wLCAwLCAxKTsKKyAgICAgIGIgPSB0ZW1wWzBdOwogICAgIH0KICAgICByZXR1cm4gYjsKICAgfQpAQCAtNjYyLDkgKzY2Myw4IEBACiAgICAqIE5vIG1hZ2ljIGhlcmUgLSBqdXN0IHJlYWQgYSBkb3VibGUgb2ZmIHRoZSB3aXJlLgogICAgKi8KICAgcHVibGljIGRvdWJsZSByZWFkRG91YmxlKCkgdGhyb3dzIFRFeGNlcHRpb24gewotICAgIGJ5dGVbXSBsb25nQml0cyA9IG5ldyBieXRlWzhdOwotICAgIHRyYW5zXy5yZWFkQWxsKGxvbmdCaXRzLCAwLCA4KTsKLSAgICByZXR1cm4gRG91YmxlLmxvbmdCaXRzVG9Eb3VibGUoYnl0ZXNUb0xvbmcobG9uZ0JpdHMpKTsKKyAgICB0cmFuc18ucmVhZEFsbCh0ZW1wLCAwLCA4KTsKKyAgICByZXR1cm4gRG91YmxlLmxvbmdCaXRzVG9Eb3VibGUoYnl0ZXNUb0xvbmcodGVtcCkpOwogICB9CiAKICAgLyoqCkBAIC02NzgsMTcgKzY3OCwxNSBAQAogICAgICAgcmV0dXJuICIiOwogICAgIH0KIAotICAgIHRyeSB7Ci0gICAgICBpZiAodHJhbnNfLmdldEJ5dGVzUmVtYWluaW5nSW5CdWZmZXIoKSA+PSBsZW5ndGgpIHsKLSAgICAgICAgU3RyaW5nIHN0ciA9IG5ldyBTdHJpbmcodHJhbnNfLmdldEJ1ZmZlcigpLCB0cmFuc18uZ2V0QnVmZmVyUG9zaXRpb24oKSwgbGVuZ3RoLCAiVVRGLTgiKTsKLSAgICAgICAgdHJhbnNfLmNvbnN1bWVCdWZmZXIobGVuZ3RoKTsKLSAgICAgICAgcmV0dXJuIHN0cjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBuZXcgU3RyaW5nKHJlYWRCaW5hcnkobGVuZ3RoKSwgIlVURi04Iik7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiVVRGLTggbm90IHN1cHBvcnRlZCEiKTsKKyAgICBmaW5hbCBTdHJpbmcgc3RyOworICAgIGlmICh0cmFuc18uZ2V0Qnl0ZXNSZW1haW5pbmdJbkJ1ZmZlcigpID49IGxlbmd0aCkgeworICAgICAgc3RyID0gbmV3IFN0cmluZyh0cmFuc18uZ2V0QnVmZmVyKCksIHRyYW5zXy5nZXRCdWZmZXJQb3NpdGlvbigpLAorICAgICAgICAgIGxlbmd0aCwgU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CisgICAgICB0cmFuc18uY29uc3VtZUJ1ZmZlcihsZW5ndGgpOworICAgIH0gZWxzZSB7CisgICAgICBzdHIgPSBuZXcgU3RyaW5nKHJlYWRCaW5hcnkobGVuZ3RoKSwgU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CiAgICAgfQorICAgIHJldHVybiBzdHI7CiAgIH0KIAogICAvKioKQEAgLTY5Nyw3ICs2OTUsNyBAQAogICBwdWJsaWMgQnl0ZUJ1ZmZlciByZWFkQmluYXJ5KCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIGludCBsZW5ndGggPSByZWFkVmFyaW50MzIoKTsKICAgICBjaGVja1N0cmluZ1JlYWRMZW5ndGgobGVuZ3RoKTsKLSAgICBpZiAobGVuZ3RoID09IDApIHJldHVybiBCeXRlQnVmZmVyLndyYXAobmV3IGJ5dGVbMF0pOworICAgIGlmIChsZW5ndGggPT0gMCkgcmV0dXJuIEVNUFRZX0JVRkZFUjsKIAogICAgIGlmICh0cmFuc18uZ2V0Qnl0ZXNSZW1haW5pbmdJbkJ1ZmZlcigpID49IGxlbmd0aCkgewogICAgICAgQnl0ZUJ1ZmZlciBiYiA9IEJ5dGVCdWZmZXIud3JhcCh0cmFuc18uZ2V0QnVmZmVyKCksIHRyYW5zXy5nZXRCdWZmZXJQb3NpdGlvbigpLCBsZW5ndGgpOwpAQCAtNzE0LDcgKzcxMiw3IEBACiAgICAqIFJlYWQgYSBieXRlW10gb2YgYSBrbm93biBsZW5ndGggZnJvbSB0aGUgd2lyZS4KICAgICovCiAgIHByaXZhdGUgYnl0ZVtdIHJlYWRCaW5hcnkoaW50IGxlbmd0aCkgdGhyb3dzIFRFeGNlcHRpb24gewotICAgIGlmIChsZW5ndGggPT0gMCkgcmV0dXJuIG5ldyBieXRlWzBdOworICAgIGlmIChsZW5ndGggPT0gMCkgcmV0dXJuIEVNUFRZX0JZVEVTOwogCiAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlW2xlbmd0aF07CiAgICAgdHJhbnNfLnJlYWRBbGwoYnVmLCAwLCBsZW5ndGgpOwpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2wuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9USlNPTlByb3RvY29sLmphdmEKaW5kZXggZjUxMzIyYy4uZDM3YzQ5MyAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2wuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5qYXZhCkBAIC0xOSw4ICsxOSwxMCBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOwogCi1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuU3RhY2s7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5UQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwpAQCAtMzA2LDYgKzMwOCwxMyBAQAogICAgIGNvbnRleHRfID0gY29udGV4dFN0YWNrXy5wb3AoKTsKICAgfQogCisgIC8vIFJlc2V0IHRoZSBjb250ZXh0IHN0YWNrIHRvIGl0cyBpbml0aWFsIHN0YXRlCisgIHByaXZhdGUgdm9pZCByZXNldENvbnRleHQoKSB7CisgICAgd2hpbGUgKCFjb250ZXh0U3RhY2tfLmlzRW1wdHkoKSkgeworICAgICAgcG9wQ29udGV4dCgpOworICAgIH0KKyAgfQorCiAgIC8qKgogICAgKiBDb25zdHJ1Y3RvcgogICAgKi8KQEAgLTQwOSwxMiArNDE4LDggQEAKICAgICBpZiAoZXNjYXBlTnVtKSB7CiAgICAgICB0cmFuc18ud3JpdGUoUVVPVEUpOwogICAgIH0KLSAgICB0cnkgewotICAgICAgYnl0ZVtdIGJ1ZiA9IHN0ci5nZXRCeXRlcygiVVRGLTgiKTsKLSAgICAgIHRyYW5zXy53cml0ZShidWYpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gdWV4KSB7Ci0gICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiSlZNIERPRVMgTk9UIFNVUFBPUlQgVVRGLTgiKTsKLSAgICB9CisgICAgYnl0ZVtdIGJ1ZiA9IHN0ci5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKKyAgICB0cmFuc18ud3JpdGUoYnVmKTsKICAgICBpZiAoZXNjYXBlTnVtKSB7CiAgICAgICB0cmFuc18ud3JpdGUoUVVPVEUpOwogICAgIH0KQEAgLTQ0NCwxMiArNDQ5LDggQEAKICAgICBpZiAoZXNjYXBlTnVtKSB7CiAgICAgICB0cmFuc18ud3JpdGUoUVVPVEUpOwogICAgIH0KLSAgICB0cnkgewotICAgICAgYnl0ZVtdIGIgPSBzdHIuZ2V0Qnl0ZXMoIlVURi04Iik7Ci0gICAgICB0cmFuc18ud3JpdGUoYiwgMCwgYi5sZW5ndGgpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gdWV4KSB7Ci0gICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiSlZNIERPRVMgTk9UIFNVUFBPUlQgVVRGLTgiKTsKLSAgICB9CisgICAgYnl0ZVtdIGIgPSBzdHIuZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CisgICAgdHJhbnNfLndyaXRlKGIsIDAsIGIubGVuZ3RoKTsKICAgICBpZiAoZXNjYXBlTnVtKSB7CiAgICAgICB0cmFuc18ud3JpdGUoUVVPVEUpOwogICAgIH0KQEAgLTUwMSwxNCArNTAyLDExIEBACiAKICAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlTWVzc2FnZUJlZ2luKFRNZXNzYWdlIG1lc3NhZ2UpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICByZXNldENvbnRleHQoKTsgLy8gVEhSSUZULTM3NDMKICAgICB3cml0ZUpTT05BcnJheVN0YXJ0KCk7CiAgICAgd3JpdGVKU09OSW50ZWdlcihWRVJTSU9OKTsKLSAgICB0cnkgewotICAgICAgYnl0ZVtdIGIgPSBtZXNzYWdlLm5hbWUuZ2V0Qnl0ZXMoIlVURi04Iik7Ci0gICAgICB3cml0ZUpTT05TdHJpbmcoYik7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB1ZXgpIHsKLSAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJKVk0gRE9FUyBOT1QgU1VQUE9SVCBVVEYtOCIpOwotICAgIH0KKyAgICBieXRlW10gYiA9IG1lc3NhZ2UubmFtZS5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKKyAgICB3cml0ZUpTT05TdHJpbmcoYik7CiAgICAgd3JpdGVKU09OSW50ZWdlcihtZXNzYWdlLnR5cGUpOwogICAgIHdyaXRlSlNPTkludGVnZXIobWVzc2FnZS5zZXFpZCk7CiAgIH0KQEAgLTYxOCwxMiArNjE2LDggQEAKIAogICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVTdHJpbmcoU3RyaW5nIHN0cikgdGhyb3dzIFRFeGNlcHRpb24gewotICAgIHRyeSB7Ci0gICAgICBieXRlW10gYiA9IHN0ci5nZXRCeXRlcygiVVRGLTgiKTsKLSAgICAgIHdyaXRlSlNPTlN0cmluZyhiKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHVleCkgewotICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIkpWTSBET0VTIE5PVCBTVVBQT1JUIFVURi04Iik7Ci0gICAgfQorICAgIGJ5dGVbXSBiID0gc3RyLmdldEJ5dGVzKFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpOworICAgIHdyaXRlSlNPTlN0cmluZyhiKTsKICAgfQogCiAgIEBPdmVycmlkZQpAQCAtNjQwLDYgKzYzNCw3IEBACiAgIHByaXZhdGUgVEJ5dGVBcnJheU91dHB1dFN0cmVhbSByZWFkSlNPTlN0cmluZyhib29sZWFuIHNraXBDb250ZXh0KQogICAgIHRocm93cyBURXhjZXB0aW9uIHsKICAgICBUQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGFyciA9IG5ldyBUQnl0ZUFycmF5T3V0cHV0U3RyZWFtKERFRl9TVFJJTkdfU0laRSk7CisgICAgQXJyYXlMaXN0PENoYXJhY3Rlcj4gY29kZXVuaXRzID0gbmV3IEFycmF5TGlzdDxDaGFyYWN0ZXI+KCk7CiAgICAgaWYgKCFza2lwQ29udGV4dCkgewogICAgICAgY29udGV4dF8ucmVhZCgpOwogICAgIH0KQEAgLTY1MiwxMCArNjQ3LDQxIEBACiAgICAgICBpZiAoY2ggPT0gRVNDU0VRWzBdKSB7CiAgICAgICAgIGNoID0gcmVhZGVyXy5yZWFkKCk7CiAgICAgICAgIGlmIChjaCA9PSBFU0NTRVFbMV0pIHsKLSAgICAgICAgICByZWFkSlNPTlN5bnRheENoYXIoWkVSTyk7Ci0gICAgICAgICAgcmVhZEpTT05TeW50YXhDaGFyKFpFUk8pOwotICAgICAgICAgIHRyYW5zXy5yZWFkQWxsKHRtcGJ1Zl8sIDAsIDIpOwotICAgICAgICAgIGNoID0gKGJ5dGUpKChoZXhWYWwoKGJ5dGUpdG1wYnVmX1swXSkgPDwgNCkgKyBoZXhWYWwodG1wYnVmX1sxXSkpOworICAgICAgICAgIHRyYW5zXy5yZWFkQWxsKHRtcGJ1Zl8sIDAsIDQpOworICAgICAgICAgIHNob3J0IGN1ID0gKHNob3J0KSgKKyAgICAgICAgICAgICAgKChzaG9ydCloZXhWYWwodG1wYnVmX1swXSkgPDwgMTIpICsKKyAgICAgICAgICAgICAgKChzaG9ydCloZXhWYWwodG1wYnVmX1sxXSkgPDwgOCkgKworICAgICAgICAgICAgICAoKHNob3J0KWhleFZhbCh0bXBidWZfWzJdKSA8PCA0KSArCisgICAgICAgICAgICAgIChzaG9ydCloZXhWYWwodG1wYnVmX1szXSkpOworICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoQ2hhcmFjdGVyLmlzSGlnaFN1cnJvZ2F0ZSgoY2hhciljdSkpIHsKKyAgICAgICAgICAgICAgaWYgKGNvZGV1bml0cy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgbG93IHN1cnJvZ2F0ZSBjaGFyIik7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgY29kZXVuaXRzLmFkZCgoY2hhciljdSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChDaGFyYWN0ZXIuaXNMb3dTdXJyb2dhdGUoKGNoYXIpY3UpKSB7CisgICAgICAgICAgICAgIGlmIChjb2RldW5pdHMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBoaWdoIHN1cnJvZ2F0ZSBjaGFyIik7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBjb2RldW5pdHMuYWRkKChjaGFyKWN1KTsKKyAgICAgICAgICAgICAgYXJyLndyaXRlKAorICAgICAgICAgICAgICAgICAgKG5ldyBTdHJpbmcobmV3IGludFtdIHsgY29kZXVuaXRzLmdldCgwKSwgY29kZXVuaXRzLmdldCgxKSB9LAorICAgICAgICAgICAgICAgICAgICAgIDAsIDIpKS5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVURl84KSk7CisgICAgICAgICAgICAgIGNvZGV1bml0cy5jbGVhcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgIGFyci53cml0ZSgobmV3IFN0cmluZyhuZXcgaW50W10geyBjdSB9LCAwLCAxKSkKKyAgICAgICAgICAgICAgICAgIC5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVURl84KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICJJbnZhbGlkIHVuaWNvZGUgc2VxdWVuY2UiKTsKKyAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgaW50IG9mZiA9IEVTQ0FQRV9DSEFSUy5pbmRleE9mKGNoKTsKQEAgLTczMywxOSArNzU5LDE0IEBACiAgICAgY29udGV4dF8ucmVhZCgpOwogICAgIGlmIChyZWFkZXJfLnBlZWsoKSA9PSBRVU9URVswXSkgewogICAgICAgVEJ5dGVBcnJheU91dHB1dFN0cmVhbSBhcnIgPSByZWFkSlNPTlN0cmluZyh0cnVlKTsKLSAgICAgIHRyeSB7Ci0gICAgICAgIGRvdWJsZSBkdWIgPSBEb3VibGUudmFsdWVPZihhcnIudG9TdHJpbmcoIlVURi04IikpOwotICAgICAgICBpZiAoIWNvbnRleHRfLmVzY2FwZU51bSgpICYmICFEb3VibGUuaXNOYU4oZHViKSAmJgotICAgICAgICAgICAgIURvdWJsZS5pc0luZmluaXRlKGR1YikpIHsKLSAgICAgICAgICAvLyBUaHJvdyBleGNlcHRpb24gLS0gd2Ugc2hvdWxkIG5vdCBiZSBpbiBhIHN0cmluZyBpbiB0aGlzIGNhc2UKLSAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTnVtZXJpYyBkYXRhIHVuZXhwZWN0ZWRseSBxdW90ZWQiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZHViOworICAgICAgZG91YmxlIGR1YiA9IERvdWJsZS52YWx1ZU9mKGFyci50b1N0cmluZyhTdGFuZGFyZENoYXJzZXRzLlVURl84KSk7CisgICAgICBpZiAoIWNvbnRleHRfLmVzY2FwZU51bSgpICYmICFEb3VibGUuaXNOYU4oZHViKQorICAgICAgICAgICYmICFEb3VibGUuaXNJbmZpbml0ZShkdWIpKSB7CisgICAgICAgIC8vIFRocm93IGV4Y2VwdGlvbiAtLSB3ZSBzaG91bGQgbm90IGJlIGluIGEgc3RyaW5nIGluIHRoaXMgY2FzZQorICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAiTnVtZXJpYyBkYXRhIHVuZXhwZWN0ZWRseSBxdW90ZWQiKTsKICAgICAgIH0KLSAgICAgIGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJKVk0gRE9FUyBOT1QgU1VQUE9SVCBVVEYtOCIpOwotICAgICAgfQorICAgICAgcmV0dXJuIGR1YjsKICAgICB9CiAgICAgZWxzZSB7CiAgICAgICBpZiAoY29udGV4dF8uZXNjYXBlTnVtKCkpIHsKQEAgLTc2OSw2ICs3OTAsMTEgQEAKICAgICBpbnQgbGVuID0gYXJyLmxlbigpOwogICAgIGludCBvZmYgPSAwOwogICAgIGludCBzaXplID0gMDsKKyAgICAvLyBJZ25vcmUgcGFkZGluZworICAgIGludCBib3VuZCA9IGxlbiA+PSAyID8gbGVuIC0gMiA6IDA7CisgICAgZm9yIChpbnQgaSA9IGxlbiAtIDE7IGkgPj0gYm91bmQgJiYgYltpXSA9PSAnPSc7IC0taSkgeworICAgICAgLS1sZW47CisgICAgfQogICAgIHdoaWxlIChsZW4gPj0gNCkgewogICAgICAgLy8gRGVjb2RlIDQgYnl0ZXMgYXQgYSB0aW1lCiAgICAgICBUQmFzZTY0VXRpbHMuZGVjb2RlKGIsIG9mZiwgNCwgYiwgc2l6ZSk7IC8vIE5COiBkZWNvZGVkIGluIHBsYWNlCkBAIC04MTMsMTggKzgzOSwxMyBAQAogCiAgIEBPdmVycmlkZQogICBwdWJsaWMgVE1lc3NhZ2UgcmVhZE1lc3NhZ2VCZWdpbigpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICByZXNldENvbnRleHQoKTsgLy8gVEhSSUZULTM3NDMKICAgICByZWFkSlNPTkFycmF5U3RhcnQoKTsKICAgICBpZiAocmVhZEpTT05JbnRlZ2VyKCkgIT0gVkVSU0lPTikgewogICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uQkFEX1ZFUlNJT04sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNZXNzYWdlIGNvbnRhaW5lZCBiYWQgdmVyc2lvbi4iKTsKICAgICB9Ci0gICAgU3RyaW5nIG5hbWU7Ci0gICAgdHJ5IHsKLSAgICAgIG5hbWUgPSByZWFkSlNPTlN0cmluZyhmYWxzZSkudG9TdHJpbmcoIlVURi04Iik7Ci0gICAgfQotICAgIGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGV4KSB7Ci0gICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiSlZNIERPRVMgTk9UIFNVUFBPUlQgVVRGLTgiKTsKLSAgICB9CisgICAgU3RyaW5nIG5hbWUgPSByZWFkSlNPTlN0cmluZyhmYWxzZSkudG9TdHJpbmcoU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CiAgICAgYnl0ZSB0eXBlID0gKGJ5dGUpIHJlYWRKU09OSW50ZWdlcigpOwogICAgIGludCBzZXFpZCA9IChpbnQpIHJlYWRKU09OSW50ZWdlcigpOwogICAgIHJldHVybiBuZXcgVE1lc3NhZ2UobmFtZSwgdHlwZSwgc2VxaWQpOwpAQCAtOTQxLDEyICs5NjIsNyBAQAogCiAgIEBPdmVycmlkZQogICBwdWJsaWMgU3RyaW5nIHJlYWRTdHJpbmcoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgdHJ5IHsKLSAgICAgIHJldHVybiByZWFkSlNPTlN0cmluZyhmYWxzZSkudG9TdHJpbmcoIlVURi04Iik7Ci0gICAgfQotICAgIGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGV4KSB7Ci0gICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiSlZNIERPRVMgTk9UIFNVUFBPUlQgVVRGLTgiKTsKLSAgICB9CisgICAgcmV0dXJuIHJlYWRKU09OU3RyaW5nKGZhbHNlKS50b1N0cmluZyhTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKICAgfQogCiAgIEBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wuamF2YQppbmRleCAzNTM1Mjc0Li4wZWE1NjZiIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wuamF2YQpAQCAtMzEsMjEgKzMxLDIzIEBACiAgKgogICogPHA+VGhpcyBleGFtcGxlIHVzZXMgYSBzaW5nbGUgc29ja2V0IHRyYW5zcG9ydCB0byBpbnZva2UgdHdvIHNlcnZpY2VzOgogICoKLSAqIDxibG9ja3F1b3RlPjxjb2RlPgotICogICAgIFRTb2NrZXQgdHJhbnNwb3J0ID0gbmV3IFRTb2NrZXQoImxvY2FsaG9zdCIsIDkwOTApOzxici8+Ci0gKiAgICAgdHJhbnNwb3J0Lm9wZW4oKTs8YnIvPgotICo8YnIvPgotICogICAgIFRCaW5hcnlQcm90b2NvbCBwcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2wodHJhbnNwb3J0KTs8YnIvPgotICo8YnIvPgotICogICAgIFRNdWx0aXBsZXhlZFByb3RvY29sIG1wID0gbmV3IFRNdWx0aXBsZXhlZFByb3RvY29sKHByb3RvY29sLCAiQ2FsY3VsYXRvciIpOzxici8+Ci0gKiAgICAgQ2FsY3VsYXRvci5DbGllbnQgc2VydmljZSA9IG5ldyBDYWxjdWxhdG9yLkNsaWVudChtcCk7PGJyLz4KLSAqPGJyLz4KLSAqICAgICBUTXVsdGlwbGV4ZWRQcm90b2NvbCBtcDIgPSBuZXcgVE11bHRpcGxleGVkUHJvdG9jb2wocHJvdG9jb2wsICJXZWF0aGVyUmVwb3J0Iik7PGJyLz4KLSAqICAgICBXZWF0aGVyUmVwb3J0LkNsaWVudCBzZXJ2aWNlMiA9IG5ldyBXZWF0aGVyUmVwb3J0LkNsaWVudChtcDIpOzxici8+Ci0gKjxici8+Ci0gKiAgICAgU3lzdGVtLm91dC5wcmludGxuKHNlcnZpY2UuYWRkKDIsMikpOzxici8+Ci0gKiAgICAgU3lzdGVtLm91dC5wcmludGxuKHNlcnZpY2UyLmdldFRlbXBlcmF0dXJlKCkpOzxici8+Ci0gKiA8L2NvZGU+PC9ibG9ja3F1b3RlPgorICogPHByZT4KKyAqIHtAY29kZQorICogICAgIFRTb2NrZXQgdHJhbnNwb3J0ID0gbmV3IFRTb2NrZXQoImxvY2FsaG9zdCIsIDkwOTApOworICogICAgIHRyYW5zcG9ydC5vcGVuKCk7CisgKgorICogICAgIFRCaW5hcnlQcm90b2NvbCBwcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2wodHJhbnNwb3J0KTsKKyAqCisgKiAgICAgVE11bHRpcGxleGVkUHJvdG9jb2wgbXAgPSBuZXcgVE11bHRpcGxleGVkUHJvdG9jb2wocHJvdG9jb2wsICJDYWxjdWxhdG9yIik7CisgKiAgICAgQ2FsY3VsYXRvci5DbGllbnQgc2VydmljZSA9IG5ldyBDYWxjdWxhdG9yLkNsaWVudChtcCk7CisgKgorICogICAgIFRNdWx0aXBsZXhlZFByb3RvY29sIG1wMiA9IG5ldyBUTXVsdGlwbGV4ZWRQcm90b2NvbChwcm90b2NvbCwgIldlYXRoZXJSZXBvcnQiKTsKKyAqICAgICBXZWF0aGVyUmVwb3J0LkNsaWVudCBzZXJ2aWNlMiA9IG5ldyBXZWF0aGVyUmVwb3J0LkNsaWVudChtcDIpOworICoKKyAqICAgICBTeXN0ZW0ub3V0LnByaW50bG4oc2VydmljZS5hZGQoMiwyKSk7CisgKiAgICAgU3lzdGVtLm91dC5wcmludGxuKHNlcnZpY2UyLmdldFRlbXBlcmF0dXJlKCkpOworICogfQorICogPC9wcmU+CiAgKgogICogQHNlZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xEZWNvcmF0b3IKICAqLwpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbFV0aWwuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xVdGlsLmphdmEKaW5kZXggNzUyNTIwYS4uY2RhYTMwYiAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbFV0aWwuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sVXRpbC5qYXZhCkBAIC0xNDEsNyArMTQxLDggQEAKICAgICAgICAgYnJlYWs7CiAKICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrOworICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbnJlY29nbml6ZWQgdHlwZSAiICsgdHlwZSk7CiAgICAgfQogICB9CiAKQEAgLTE1Miw3ICsxNTMsNyBAQAogICAgKiBJbiBzb21lIGNhc2VzLCBubyBndWVzcyBjYW4gYmUgZG9uZSwgaW4gdGhhdCBjYXNlIHdlIHJldHVybiB0aGUKICAgICogZmFsbGJhY2sgVFByb3RvY29sRmFjdG9yeS4KICAgICogVG8gYmUgY2VydGFpbiB0byBjb3JyZWN0bHkgZGV0ZWN0IHRoZSBwcm90b2NvbCwgdGhlIGZpcnN0IGVuY29kZWQKLSAgICogZmllbGQgc2hvdWxkIGhhdmUgYSBmaWVsZCBpZCA8IDI1NgorICAgKiBmaWVsZCBzaG91bGQgaGF2ZSBhIGZpZWxkIGlkICZsdDsgMjU2CiAgICAqCiAgICAqIEBwYXJhbSBkYXRhIFRoZSBzZXJpYWxpemVkIGRhdGEgdG8gZ3Vlc3MgdGhlIHByb3RvY29sIGZvci4KICAgICogQHBhcmFtIGZhbGxiYWNrIFRoZSBUUHJvdG9jb2wgdG8gcmV0dXJuIGlmIG5vIGd1ZXNzIGNhbiBiZSBtYWRlLgpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RTaW1wbGVKU09OUHJvdG9jb2wuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UU2ltcGxlSlNPTlByb3RvY29sLmphdmEKaW5kZXggZmZhMTM5YS4uZWI3ZTIzYiAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RTaW1wbGVKU09OUHJvdG9jb2wuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFNpbXBsZUpTT05Qcm90b2NvbC5qYXZhCkBAIC0xOSw4ICsxOSw4IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7CiAKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CiBpbXBvcnQgamF2YS51dGlsLlN0YWNrOwogCiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsKQEAgLTE0Myw2ICsxNDMsMTUgQEAKICAgfQogCiAgIC8qKgorICAgKiBSZXNldCB0aGUgd3JpdGUgY29udGV4dCBzdGFjayB0byBpdHMgaW5pdGlhbCBzdGF0ZS4KKyAgICovCisgIHByb3RlY3RlZCB2b2lkIHJlc2V0V3JpdGVDb250ZXh0KCkgeworICAgIHdoaWxlICghd3JpdGVDb250ZXh0U3RhY2tfLmlzRW1wdHkoKSkgeworICAgICAgcG9wV3JpdGVDb250ZXh0KCk7CisgICAgfQorICB9CisKKyAgLyoqCiAgICAqIFVzZWQgdG8gbWFrZSBzdXJlIHRoYXQgd2UgYXJlIG5vdCBlbmNvdW50ZXJpbmcgYSBtYXAgd2hvc2Uga2V5cyBhcmUgY29udGFpbmVycwogICAgKi8KICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0Q29udGV4dElzTm90TWFwS2V5KFN0cmluZyBpbnZhbGlkS2V5VHlwZSkgdGhyb3dzIENvbGxlY3Rpb25NYXBLZXlFeGNlcHRpb24gewpAQCAtMTU4LDcgKzE2Nyw5IEBACiAgICAgc3VwZXIodHJhbnMpOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlTWVzc2FnZUJlZ2luKFRNZXNzYWdlIG1lc3NhZ2UpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICByZXNldFdyaXRlQ29udGV4dCgpOyAvLyBUSFJJRlQtMzc0MwogICAgIHRyYW5zXy53cml0ZShMQlJBQ0tFVCk7CiAgICAgcHVzaFdyaXRlQ29udGV4dChuZXcgTGlzdENvbnRleHQoKSk7CiAgICAgd3JpdGVTdHJpbmcobWVzc2FnZS5uYW1lKTsKQEAgLTE2NiwzMSArMTc3LDM4IEBACiAgICAgd3JpdGVJMzIobWVzc2FnZS5zZXFpZCk7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVNZXNzYWdlRW5kKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHBvcFdyaXRlQ29udGV4dCgpOwogICAgIHRyYW5zXy53cml0ZShSQlJBQ0tFVCk7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVTdHJ1Y3RCZWdpbihUU3RydWN0IHN0cnVjdCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHdyaXRlQ29udGV4dF8ud3JpdGUoKTsKICAgICB0cmFuc18ud3JpdGUoTEJSQUNFKTsKICAgICBwdXNoV3JpdGVDb250ZXh0KG5ldyBTdHJ1Y3RDb250ZXh0KCkpOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlU3RydWN0RW5kKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHBvcFdyaXRlQ29udGV4dCgpOwogICAgIHRyYW5zXy53cml0ZShSQlJBQ0UpOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlRmllbGRCZWdpbihURmllbGQgZmllbGQpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICAvLyBOb3RlIHRoYXQgZXh0cmEgdHlwZSBpbmZvcm1hdGlvbiBpcyBvbWl0dGVkIGluIEpTT04hCiAgICAgd3JpdGVTdHJpbmcoZmllbGQubmFtZSk7CiAgIH0KIAotICBwdWJsaWMgdm9pZCB3cml0ZUZpZWxkRW5kKCkge30KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHdyaXRlRmllbGRFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7fQogCi0gIHB1YmxpYyB2b2lkIHdyaXRlRmllbGRTdG9wKCkge30KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHdyaXRlRmllbGRTdG9wKCkgdGhyb3dzIFRFeGNlcHRpb24ge30KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVNYXBCZWdpbihUTWFwIG1hcCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIGFzc2VydENvbnRleHRJc05vdE1hcEtleShNQVApOwogICAgIHdyaXRlQ29udGV4dF8ud3JpdGUoKTsKQEAgLTE5OSwxMSArMjE3LDEzIEBACiAgICAgLy8gTm8gbWV0YWRhdGEhCiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVNYXBFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgcG9wV3JpdGVDb250ZXh0KCk7CiAgICAgdHJhbnNfLndyaXRlKFJCUkFDRSk7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVMaXN0QmVnaW4oVExpc3QgbGlzdCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIGFzc2VydENvbnRleHRJc05vdE1hcEtleShMSVNUKTsKICAgICB3cml0ZUNvbnRleHRfLndyaXRlKCk7CkBAIC0yMTIsMTEgKzIzMiwxMyBAQAogICAgIC8vIE5vIG1ldGFkYXRhIQogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlTGlzdEVuZCgpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICBwb3BXcml0ZUNvbnRleHQoKTsKICAgICB0cmFuc18ud3JpdGUoUkJSQUNLRVQpOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlU2V0QmVnaW4oVFNldCBzZXQpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICBhc3NlcnRDb250ZXh0SXNOb3RNYXBLZXkoU0VUKTsKICAgICB3cml0ZUNvbnRleHRfLndyaXRlKCk7CkBAIC0yMjUsMjMgKzI0NywyOCBAQAogICAgIC8vIE5vIG1ldGFkYXRhIQogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlU2V0RW5kKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHBvcFdyaXRlQ29udGV4dCgpOwogICAgIHRyYW5zXy53cml0ZShSQlJBQ0tFVCk7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVCb29sKGJvb2xlYW4gYikgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHdyaXRlQnl0ZShiID8gKGJ5dGUpMSA6IChieXRlKTApOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlQnl0ZShieXRlIGIpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICB3cml0ZUkzMihiKTsKICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZUkxNihzaG9ydCBpMTYpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICB3cml0ZUkzMihpMTYpOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlSTMyKGludCBpMzIpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICBpZih3cml0ZUNvbnRleHRfLmlzTWFwS2V5KCkpIHsKICAgICAgIHdyaXRlU3RyaW5nKEludGVnZXIudG9TdHJpbmcoaTMyKSk7CkBAIC0yNTIsMTQgKzI3OSwxMSBAQAogICB9CiAKICAgcHVibGljIHZvaWQgX3dyaXRlU3RyaW5nRGF0YShTdHJpbmcgcykgdGhyb3dzIFRFeGNlcHRpb24gewotICAgIHRyeSB7Ci0gICAgICBieXRlW10gYiA9IHMuZ2V0Qnl0ZXMoIlVURi04Iik7Ci0gICAgICB0cmFuc18ud3JpdGUoYik7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB1ZXgpIHsKLSAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJKVk0gRE9FUyBOT1QgU1VQUE9SVCBVVEYtOCIpOwotICAgIH0KKyAgICBieXRlW10gYiA9IHMuZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CisgICAgdHJhbnNfLndyaXRlKGIpOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlSTY0KGxvbmcgaTY0KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgaWYod3JpdGVDb250ZXh0Xy5pc01hcEtleSgpKSB7CiAgICAgICB3cml0ZVN0cmluZyhMb25nLnRvU3RyaW5nKGk2NCkpOwpAQCAtMjY5LDYgKzI5Myw3IEBACiAgICAgfQogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlRG91YmxlKGRvdWJsZSBkdWIpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICBpZih3cml0ZUNvbnRleHRfLmlzTWFwS2V5KCkpIHsKICAgICAgIHdyaXRlU3RyaW5nKERvdWJsZS50b1N0cmluZyhkdWIpKTsKQEAgLTI3OCw2ICszMDMsNyBAQAogICAgIH0KICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZVN0cmluZyhTdHJpbmcgc3RyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgd3JpdGVDb250ZXh0Xy53cml0ZSgpOwogICAgIGludCBsZW5ndGggPSBzdHIubGVuZ3RoKCk7CkBAIC0zMzEsOTAgKzM1NywxMDggQEAKICAgICBfd3JpdGVTdHJpbmdEYXRhKGVzY2FwZS50b1N0cmluZygpKTsKICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZUJpbmFyeShCeXRlQnVmZmVyIGJpbikgdGhyb3dzIFRFeGNlcHRpb24gewotICAgIHRyeSB7Ci0gICAgICAvLyBUT0RPKG1jc2xlZSk6IEZpeCB0aGlzCi0gICAgICB3cml0ZVN0cmluZyhuZXcgU3RyaW5nKGJpbi5hcnJheSgpLCBiaW4ucG9zaXRpb24oKSArIGJpbi5hcnJheU9mZnNldCgpLCBiaW4ubGltaXQoKSAtIGJpbi5wb3NpdGlvbigpIC0gYmluLmFycmF5T2Zmc2V0KCksICJVVEYtOCIpKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHVleCkgewotICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIkpWTSBET0VTIE5PVCBTVVBQT1JUIFVURi04Iik7Ci0gICAgfQorICAgIC8vIFRPRE8obWNzbGVlKTogRml4IHRoaXMKKyAgICB3cml0ZVN0cmluZyhuZXcgU3RyaW5nKGJpbi5hcnJheSgpLCBiaW4ucG9zaXRpb24oKSArIGJpbi5hcnJheU9mZnNldCgpLAorICAgICAgICBiaW4ubGltaXQoKSAtIGJpbi5wb3NpdGlvbigpIC0gYmluLmFycmF5T2Zmc2V0KCksCisgICAgICAgIFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpKTsKICAgfQogCiAgIC8qKgogICAgKiBSZWFkaW5nIG1ldGhvZHMuCiAgICAqLwogCisgIEBPdmVycmlkZQogICBwdWJsaWMgVE1lc3NhZ2UgcmVhZE1lc3NhZ2VCZWdpbigpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICAvLyBUT0RPKG1jc2xlZSk6IGltcGxlbWVudAogICAgIHJldHVybiBFTVBUWV9NRVNTQUdFOwogICB9CiAKLSAgcHVibGljIHZvaWQgcmVhZE1lc3NhZ2VFbmQoKSB7fQorICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgcmVhZE1lc3NhZ2VFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7fQogCi0gIHB1YmxpYyBUU3RydWN0IHJlYWRTdHJ1Y3RCZWdpbigpIHsKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBUU3RydWN0IHJlYWRTdHJ1Y3RCZWdpbigpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICAvLyBUT0RPKG1jc2xlZSk6IGltcGxlbWVudAogICAgIHJldHVybiBBTk9OWU1PVVNfU1RSVUNUOwogICB9CiAKLSAgcHVibGljIHZvaWQgcmVhZFN0cnVjdEVuZCgpIHt9CisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCByZWFkU3RydWN0RW5kKCkgdGhyb3dzIFRFeGNlcHRpb24ge30KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIFRGaWVsZCByZWFkRmllbGRCZWdpbigpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICAvLyBUT0RPKG1jc2xlZSk6IGltcGxlbWVudAogICAgIHJldHVybiBBTk9OWU1PVVNfRklFTEQ7CiAgIH0KIAotICBwdWJsaWMgdm9pZCByZWFkRmllbGRFbmQoKSB7fQorICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgcmVhZEZpZWxkRW5kKCkgdGhyb3dzIFRFeGNlcHRpb24ge30KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIFRNYXAgcmVhZE1hcEJlZ2luKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIC8vIFRPRE8obWNzbGVlKTogaW1wbGVtZW50CiAgICAgcmV0dXJuIEVNUFRZX01BUDsKICAgfQogCi0gIHB1YmxpYyB2b2lkIHJlYWRNYXBFbmQoKSB7fQorICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgcmVhZE1hcEVuZCgpIHRocm93cyBURXhjZXB0aW9uIHt9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyBUTGlzdCByZWFkTGlzdEJlZ2luKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIC8vIFRPRE8obWNzbGVlKTogaW1wbGVtZW50CiAgICAgcmV0dXJuIEVNUFRZX0xJU1Q7CiAgIH0KIAotICBwdWJsaWMgdm9pZCByZWFkTGlzdEVuZCgpIHt9CisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCByZWFkTGlzdEVuZCgpIHRocm93cyBURXhjZXB0aW9uIHt9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyBUU2V0IHJlYWRTZXRCZWdpbigpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICAvLyBUT0RPKG1jc2xlZSk6IGltcGxlbWVudAogICAgIHJldHVybiBFTVBUWV9TRVQ7CiAgIH0KIAotICBwdWJsaWMgdm9pZCByZWFkU2V0RW5kKCkge30KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHJlYWRTZXRFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7fQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgYm9vbGVhbiByZWFkQm9vbCgpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICByZXR1cm4gKHJlYWRCeXRlKCkgPT0gMSk7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIGJ5dGUgcmVhZEJ5dGUoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgLy8gVE9ETyhtY3NsZWUpOiBpbXBsZW1lbnQKICAgICByZXR1cm4gMDsKICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgc2hvcnQgcmVhZEkxNigpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICAvLyBUT0RPKG1jc2xlZSk6IGltcGxlbWVudAogICAgIHJldHVybiAwOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyBpbnQgcmVhZEkzMigpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICAvLyBUT0RPKG1jc2xlZSk6IGltcGxlbWVudAogICAgIHJldHVybiAwOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyBsb25nIHJlYWRJNjQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgLy8gVE9ETyhtY3NsZWUpOiBpbXBsZW1lbnQKICAgICByZXR1cm4gMDsKICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgZG91YmxlIHJlYWREb3VibGUoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgLy8gVE9ETyhtY3NsZWUpOiBpbXBsZW1lbnQKICAgICByZXR1cm4gMDsKICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgU3RyaW5nIHJlYWRTdHJpbmcoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgLy8gVE9ETyhtY3NsZWUpOiBpbXBsZW1lbnQKICAgICByZXR1cm4gIiI7CkBAIC00MjUsNiArNDY5LDcgQEAKICAgICByZXR1cm4gIiI7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIEJ5dGVCdWZmZXIgcmVhZEJpbmFyeSgpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICAvLyBUT0RPKG1jc2xlZSk6IGltcGxlbWVudAogICAgIHJldHVybiBCeXRlQnVmZmVyLndyYXAobmV3IGJ5dGVbMF0pOwpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9BYnN0cmFjdE5vbmJsb2NraW5nU2VydmVyLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL0Fic3RyYWN0Tm9uYmxvY2tpbmdTZXJ2ZXIuamF2YQppbmRleCBmZDQ5ZDQ4Li44YzIwNmU0IDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL0Fic3RyYWN0Tm9uYmxvY2tpbmdTZXJ2ZXIuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL0Fic3RyYWN0Tm9uYmxvY2tpbmdTZXJ2ZXIuamF2YQpAQCAtMTksMTYgKzE5LDcgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXI7CiAKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci1pbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0aW9uS2V5OwotaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNlbGVjdG9yOwotaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLnNwaS5TZWxlY3RvclByb3ZpZGVyOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0xvbmc7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUFzeW5jUHJvY2Vzc29yOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRBc3luY1Byb2Nlc3NvcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5UQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sOwpAQCAtNDIsNiArMzMsMTUgQEAKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNlbGVjdGlvbktleTsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5TZWxlY3RvcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5zcGkuU2VsZWN0b3JQcm92aWRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNMb25nOworCiAvKioKICAqIFByb3ZpZGVzIGNvbW1vbiBtZXRob2RzIGFuZCBjbGFzc2VzIHVzZWQgYnkgbm9uYmxvY2tpbmcgVFNlcnZlcgogICogaW1wbGVtZW50YXRpb25zLgpAQCAtNTAsNyArNTAsNyBAQAogICBwcm90ZWN0ZWQgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKGdldENsYXNzKCkuZ2V0TmFtZSgpKTsKIAogICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Tm9uYmxvY2tpbmdTZXJ2ZXJBcmdzPFQgZXh0ZW5kcyBBYnN0cmFjdE5vbmJsb2NraW5nU2VydmVyQXJnczxUPj4gZXh0ZW5kcyBBYnN0cmFjdFNlcnZlckFyZ3M8VD4gewotICAgIHB1YmxpYyBsb25nIG1heFJlYWRCdWZmZXJCeXRlcyA9IExvbmcuTUFYX1ZBTFVFOworICAgIHB1YmxpYyBsb25nIG1heFJlYWRCdWZmZXJCeXRlcyA9IDI1NiAqIDEwMjQgKiAxMDI0OwogCiAgICAgcHVibGljIEFic3RyYWN0Tm9uYmxvY2tpbmdTZXJ2ZXJBcmdzKFROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydCB0cmFuc3BvcnQpIHsKICAgICAgIHN1cGVyKHRyYW5zcG9ydCk7CkBAIC0xMDIsNyArMTAyLDcgQEAKIAogICAvKioKICAgICogU3RhcnRzIGFueSB0aHJlYWRzIHJlcXVpcmVkIGZvciBzZXJ2aW5nLgotICAgKiAKKyAgICoKICAgICogQHJldHVybiB0cnVlIGlmIGV2ZXJ5dGhpbmcgd2VudCBvaywgZmFsc2UgaWYgdGhyZWFkcyBjb3VsZCBub3QgYmUgc3RhcnRlZC4KICAgICovCiAgIHByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIHN0YXJ0VGhyZWFkcygpOwpAQCAtMTE1LDcgKzExNSw3IEBACiAKICAgLyoqCiAgICAqIEhhdmUgdGhlIHNlcnZlciB0cmFuc3BvcnQgc3RhcnQgYWNjZXB0aW5nIGNvbm5lY3Rpb25zLgotICAgKiAKKyAgICoKICAgICogQHJldHVybiB0cnVlIGlmIHdlIHN0YXJ0ZWQgbGlzdGVuaW5nIHN1Y2Nlc3NmdWxseSwgZmFsc2UgaWYgc29tZXRoaW5nIHdlbnQKICAgICogICAgICAgICB3cm9uZy4KICAgICovCkBAIC0xMzksNyArMTM5LDcgQEAKICAgLyoqCiAgICAqIFBlcmZvcm0gYW4gaW52b2NhdGlvbi4gVGhpcyBtZXRob2QgY291bGQgYmVoYXZlIHNldmVyYWwgZGlmZmVyZW50IHdheXMgLQogICAgKiBpbnZva2UgaW1tZWRpYXRlbHkgaW5saW5lLCBxdWV1ZSBmb3Igc2VwYXJhdGUgZXhlY3V0aW9uLCBldGMuCi0gICAqIAorICAgKgogICAgKiBAcmV0dXJuIHRydWUgaWYgaW52b2NhdGlvbiB3YXMgc3VjY2Vzc2Z1bGx5IHJlcXVlc3RlZCwgd2hpY2ggaXMgbm90IGEKICAgICogICAgICAgICBndWFyYW50ZWUgdGhhdCBpbnZvY2F0aW9uIGhhcyBjb21wbGV0ZWQuIEZhbHNlIGlmIHRoZSByZXF1ZXN0CiAgICAqICAgICAgICAgZmFpbGVkLgpAQCAtMTUyLDcgKzE1Miw3IEBACiAgICAqIGNvcnJlc3BvbmRpbmcgdG8gcmVxdWVzdHMuCiAgICAqLwogICBwcm90ZWN0ZWQgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RTZWxlY3RUaHJlYWQgZXh0ZW5kcyBUaHJlYWQgewotICAgIHByb3RlY3RlZCBmaW5hbCBTZWxlY3RvciBzZWxlY3RvcjsKKyAgICBwcm90ZWN0ZWQgU2VsZWN0b3Igc2VsZWN0b3I7CiAKICAgICAvLyBMaXN0IG9mIEZyYW1lQnVmZmVycyB0aGF0IHdhbnQgdG8gY2hhbmdlIHRoZWlyIHNlbGVjdGlvbiBpbnRlcmVzdHMuCiAgICAgcHJvdGVjdGVkIGZpbmFsIFNldDxGcmFtZUJ1ZmZlcj4gc2VsZWN0SW50ZXJlc3RDaGFuZ2VzID0gbmV3IEhhc2hTZXQ8RnJhbWVCdWZmZXI+KCk7CkBAIC0yODUsMjEgKzI4NSwyMSBAQAogICAgIHByb3RlY3RlZCBCeXRlQnVmZmVyIGJ1ZmZlcl87CiAKICAgICBwcm90ZWN0ZWQgZmluYWwgVEJ5dGVBcnJheU91dHB1dFN0cmVhbSByZXNwb25zZV87Ci0gICAgCisKICAgICAvLyB0aGUgZnJhbWUgdGhhdCB0aGUgVFRyYW5zcG9ydCBzaG91bGQgd3JhcC4KICAgICBwcm90ZWN0ZWQgZmluYWwgVE1lbW9yeUlucHV0VHJhbnNwb3J0IGZyYW1lVHJhbnNfOwotICAgIAorCiAgICAgLy8gdGhlIHRyYW5zcG9ydCB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIGNvbm5lY3QgdG8gY2xpZW50cwogICAgIHByb3RlY3RlZCBmaW5hbCBUVHJhbnNwb3J0IGluVHJhbnNfOwotICAgIAorCiAgICAgcHJvdGVjdGVkIGZpbmFsIFRUcmFuc3BvcnQgb3V0VHJhbnNfOwotICAgIAorCiAgICAgLy8gdGhlIGlucHV0IHByb3RvY29sIHRvIHVzZSBvbiBmcmFtZXMKICAgICBwcm90ZWN0ZWQgZmluYWwgVFByb3RvY29sIGluUHJvdF87Ci0gICAgCisKICAgICAvLyB0aGUgb3V0cHV0IHByb3RvY29sIHRvIHVzZSBvbiBmcmFtZXMKICAgICBwcm90ZWN0ZWQgZmluYWwgVFByb3RvY29sIG91dFByb3RfOwotICAgIAorCiAgICAgLy8gY29udGV4dCBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb25uZWN0aW9uCiAgICAgcHJvdGVjdGVkIGZpbmFsIFNlcnZlckNvbnRleHQgY29udGV4dF87CiAKQEAgLTMyOCw3ICszMjgsNyBAQAogICAgIC8qKgogICAgICAqIEdpdmUgdGhpcyBGcmFtZUJ1ZmZlciBhIGNoYW5jZSB0byByZWFkLiBUaGUgc2VsZWN0b3IgbG9vcCBzaG91bGQgaGF2ZQogICAgICAqIHJlY2VpdmVkIGEgcmVhZCBldmVudCBmb3IgdGhpcyBGcmFtZUJ1ZmZlci4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY29ubmVjdGlvbiBzaG91bGQgbGl2ZSBvbiwgZmFsc2UgaWYgaXQgc2hvdWxkIGJlCiAgICAgICogICAgICAgICBjbG9zZWQKICAgICAgKi8KQEAgLTQzNSwxNyArNDM1LDIzIEBACiAgICAgICogaGFzIGNvbWUgaW4uCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgY2hhbmdlU2VsZWN0SW50ZXJlc3RzKCkgewotICAgICAgaWYgKHN0YXRlXyA9PSBGcmFtZUJ1ZmZlclN0YXRlLkFXQUlUSU5HX1JFR0lTVEVSX1dSSVRFKSB7CisgICAgICBzd2l0Y2ggKHN0YXRlXykgeworICAgICAgY2FzZSBBV0FJVElOR19SRUdJU1RFUl9XUklURToKICAgICAgICAgLy8gc2V0IHRoZSBPUF9XUklURSBpbnRlcmVzdAogICAgICAgICBzZWxlY3Rpb25LZXlfLmludGVyZXN0T3BzKFNlbGVjdGlvbktleS5PUF9XUklURSk7CiAgICAgICAgIHN0YXRlXyA9IEZyYW1lQnVmZmVyU3RhdGUuV1JJVElORzsKLSAgICAgIH0gZWxzZSBpZiAoc3RhdGVfID09IEZyYW1lQnVmZmVyU3RhdGUuQVdBSVRJTkdfUkVHSVNURVJfUkVBRCkgeworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQVdBSVRJTkdfUkVHSVNURVJfUkVBRDoKICAgICAgICAgcHJlcGFyZVJlYWQoKTsKLSAgICAgIH0gZWxzZSBpZiAoc3RhdGVfID09IEZyYW1lQnVmZmVyU3RhdGUuQVdBSVRJTkdfQ0xPU0UpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEFXQUlUSU5HX0NMT1NFOgogICAgICAgICBjbG9zZSgpOwogICAgICAgICBzZWxlY3Rpb25LZXlfLmNhbmNlbCgpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgTE9HR0VSLmVycm9yKCJjaGFuZ2VTZWxlY3RJbnRlcmVzdCB3YXMgY2FsbGVkLCBidXQgc3RhdGUgaXMgaW52YWxpZCAoIiArIHN0YXRlXyArICIpIik7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgTE9HR0VSLmVycm9yKAorICAgICAgICAgICAgImNoYW5nZVNlbGVjdEludGVyZXN0IHdhcyBjYWxsZWQsIGJ1dCBzdGF0ZSBpcyBpbnZhbGlkICh7fSkiLAorICAgICAgICAgICAgc3RhdGVfKTsKICAgICAgIH0KICAgICB9CiAKQEAgLTQ1NSw3ICs0NjEsNyBAQAogICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgewogICAgICAgLy8gaWYgd2UncmUgYmVpbmcgY2xvc2VkIGR1ZSB0byBhbiBlcnJvciwgd2UgbWlnaHQgaGF2ZSBhbGxvY2F0ZWQgYQogICAgICAgLy8gYnVmZmVyIHRoYXQgd2UgbmVlZCB0byBzdWJ0cmFjdCBmb3Igb3VyIG1lbW9yeSBhY2NvdW50aW5nLgotICAgICAgaWYgKHN0YXRlXyA9PSBGcmFtZUJ1ZmZlclN0YXRlLlJFQURJTkdfRlJBTUUgfHwgCisgICAgICBpZiAoc3RhdGVfID09IEZyYW1lQnVmZmVyU3RhdGUuUkVBRElOR19GUkFNRSB8fAogICAgICAgICAgIHN0YXRlXyA9PSBGcmFtZUJ1ZmZlclN0YXRlLlJFQURfRlJBTUVfQ09NUExFVEUgfHwKICAgICAgICAgICBzdGF0ZV8gPT0gRnJhbWVCdWZmZXJTdGF0ZS5BV0FJVElOR19DTE9TRSkgewogICAgICAgICByZWFkQnVmZmVyQnl0ZXNBbGxvY2F0ZWQuYWRkQW5kR2V0KC1idWZmZXJfLmFycmF5KCkubGVuZ3RoKTsKQEAgLTUxMCw3ICs1MTYsNyBAQAogICAgIHB1YmxpYyB2b2lkIGludm9rZSgpIHsKICAgICAgIGZyYW1lVHJhbnNfLnJlc2V0KGJ1ZmZlcl8uYXJyYXkoKSk7CiAgICAgICByZXNwb25zZV8ucmVzZXQoKTsKLSAgICAgIAorCiAgICAgICB0cnkgewogICAgICAgICBpZiAoZXZlbnRIYW5kbGVyXyAhPSBudWxsKSB7CiAgICAgICAgICAgZXZlbnRIYW5kbGVyXy5wcm9jZXNzQ29udGV4dChjb250ZXh0XywgaW5UcmFuc18sIG91dFRyYW5zXyk7CkBAIC01MzAsNyArNTM2LDcgQEAKIAogICAgIC8qKgogICAgICAqIFBlcmZvcm0gYSByZWFkIGludG8gYnVmZmVyLgotICAgICAqIAorICAgICAqCiAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZWFkIHN1Y2NlZWRlZCwgZmFsc2UgaWYgdGhlcmUgd2FzIGFuIGVycm9yIG9yIHRoZQogICAgICAqICAgICAgICAgY29ubmVjdGlvbiBjbG9zZWQuCiAgICAgICovCkBAIC01OTcsNyArNjAzLDcgQEAKICAgICAgICAgaWYgKGV2ZW50SGFuZGxlcl8gIT0gbnVsbCkgewogICAgICAgICAgIGV2ZW50SGFuZGxlcl8ucHJvY2Vzc0NvbnRleHQoY29udGV4dF8sIGluVHJhbnNfLCBvdXRUcmFuc18pOwogICAgICAgICB9Ci0gICAgICAgICgoVEJhc2VBc3luY1Byb2Nlc3Nvcilwcm9jZXNzb3JGYWN0b3J5Xy5nZXRQcm9jZXNzb3IoaW5UcmFuc18pKS5wcm9jZXNzKHRoaXMpOworICAgICAgICAoKFRBc3luY1Byb2Nlc3Nvcilwcm9jZXNzb3JGYWN0b3J5Xy5nZXRQcm9jZXNzb3IoaW5UcmFuc18pKS5wcm9jZXNzKHRoaXMpOwogICAgICAgICByZXR1cm47CiAgICAgICB9IGNhdGNoIChURXhjZXB0aW9uIHRlKSB7CiAgICAgICAgIExPR0dFUi53YXJuKCJFeGNlcHRpb24gd2hpbGUgaW52b2tpbmchIiwgdGUpOwpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9URXh0ZW5zaWJsZVNlcnZsZXQuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVEV4dGVuc2libGVTZXJ2bGV0LmphdmEKaW5kZXggZDMyOGRkNi4uNzUwODJjMCAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9URXh0ZW5zaWJsZVNlcnZsZXQuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RFeHRlbnNpYmxlU2VydmxldC5qYXZhCkBAIC02Myw3ICs2Myw3IEBACiAgICAqIFJldHVybnMgdGhlIGFwcHJvcHJpYXRlIHtAbGluayBUUHJvY2Vzc29yfS4gVGhpcyB3aWxsIGJlIGNhbGxlZCA8Yj5vbmNlPC9iPiBqdXN0CiAgICAqIGFmdGVyIHRoZSB7QGxpbmsgI2luaXQoKX0gbWV0aG9kCiAgICAqIAotICAgKiBAcmV0dXJuCisgICAqIEByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIHtAbGluayBUUHJvY2Vzc29yfQogICAgKi8KICAgcHJvdGVjdGVkIGFic3RyYWN0IFRQcm9jZXNzb3IgZ2V0UHJvY2Vzc29yKCk7CiAKQEAgLTcxLDcgKzcxLDcgQEAKICAgICogUmV0dXJucyB0aGUgYXBwcm9wcmlhdGUgaW4ge0BsaW5rIFRQcm90b2NvbEZhY3Rvcnl9LiBUaGlzIHdpbGwgYmUgY2FsbGVkCiAgICAqIDxiPm9uY2U8L2I+IGp1c3QgYWZ0ZXIgdGhlIHtAbGluayAjaW5pdCgpfSBtZXRob2QKICAgICogCi0gICAqIEByZXR1cm4KKyAgICogQHJldHVybiB0aGUgYXBwcm9wcmlhdGUgaW4ge0BsaW5rIFRQcm90b2NvbEZhY3Rvcnl9CiAgICAqLwogICBwcm90ZWN0ZWQgYWJzdHJhY3QgVFByb3RvY29sRmFjdG9yeSBnZXRJblByb3RvY29sRmFjdG9yeSgpOwogCkBAIC03OSw3ICs3OSw3IEBACiAgICAqIFJldHVybnMgdGhlIGFwcHJvcHJpYXRlIG91dCB7QGxpbmsgVFByb3RvY29sRmFjdG9yeX0uIFRoaXMgd2lsbCBiZSBjYWxsZWQKICAgICogPGI+b25jZTwvYj4ganVzdCBhZnRlciB0aGUge0BsaW5rICNpbml0KCl9IG1ldGhvZAogICAgKiAKLSAgICogQHJldHVybgorICAgKiBAcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSBvdXQge0BsaW5rIFRQcm90b2NvbEZhY3Rvcnl9CiAgICAqLwogICBwcm90ZWN0ZWQgYWJzdHJhY3QgVFByb3RvY29sRmFjdG9yeSBnZXRPdXRQcm90b2NvbEZhY3RvcnkoKTsKIApkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9USHNIYVNlcnZlci5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9USHNIYVNlcnZlci5qYXZhCmluZGV4IDM1NDExNTQuLjRjNWQ3YjUgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVEhzSGFTZXJ2ZXIuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RIc0hhU2VydmVyLmphdmEKQEAgLTM1LDcgKzM1LDggQEAKIHB1YmxpYyBjbGFzcyBUSHNIYVNlcnZlciBleHRlbmRzIFROb25ibG9ja2luZ1NlcnZlciB7CiAKICAgcHVibGljIHN0YXRpYyBjbGFzcyBBcmdzIGV4dGVuZHMgQWJzdHJhY3ROb25ibG9ja2luZ1NlcnZlckFyZ3M8QXJncz4gewotICAgIHByaXZhdGUgaW50IHdvcmtlclRocmVhZHMgPSA1OworICAgIHB1YmxpYyBpbnQgbWluV29ya2VyVGhyZWFkcyA9IDU7CisgICAgcHVibGljIGludCBtYXhXb3JrZXJUaHJlYWRzID0gSW50ZWdlci5NQVhfVkFMVUU7CiAgICAgcHJpdmF0ZSBpbnQgc3RvcFRpbWVvdXRWYWwgPSA2MDsKICAgICBwcml2YXRlIFRpbWVVbml0IHN0b3BUaW1lb3V0VW5pdCA9IFRpbWVVbml0LlNFQ09ORFM7CiAgICAgcHJpdmF0ZSBFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3JTZXJ2aWNlID0gbnVsbDsKQEAgLTQ0LDEzICs0NSw0NCBAQAogICAgICAgc3VwZXIodHJhbnNwb3J0KTsKICAgICB9CiAKLSAgICBwdWJsaWMgQXJncyB3b3JrZXJUaHJlYWRzKGludCBpKSB7Ci0gICAgICB3b3JrZXJUaHJlYWRzID0gaTsKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG1pbiBhbmQgbWF4IHRocmVhZHMuCisgICAgICoKKyAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rICNtaW5Xb3JrZXJUaHJlYWRzKGludCl9IGFuZCB7QGxpbmsgI21heFdvcmtlclRocmVhZHMoaW50KX0gIGluc3RlYWQuCisgICAgICovCisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgQXJncyB3b3JrZXJUaHJlYWRzKGludCBuKSB7CisgICAgICBtaW5Xb3JrZXJUaHJlYWRzID0gbjsKKyAgICAgIG1heFdvcmtlclRocmVhZHMgPSBuOwogICAgICAgcmV0dXJuIHRoaXM7CiAgICAgfQogCisgICAgLyoqCisgICAgICogQHJldHVybiB3aGF0IHRoZSBtaW4gdGhyZWFkcyB3YXMgc2V0IHRvLgorICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgI2dldE1pbldvcmtlclRocmVhZHMoKX0gYW5kIHtAbGluayAjZ2V0TWF4V29ya2VyVGhyZWFkcygpfSBpbnN0ZWFkLgorICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIGludCBnZXRXb3JrZXJUaHJlYWRzKCkgewotICAgICAgcmV0dXJuIHdvcmtlclRocmVhZHM7CisgICAgICByZXR1cm4gbWluV29ya2VyVGhyZWFkczsKKyAgICB9CisKKyAgICBwdWJsaWMgQXJncyBtaW5Xb3JrZXJUaHJlYWRzKGludCBuKSB7CisgICAgICBtaW5Xb3JrZXJUaHJlYWRzID0gbjsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBBcmdzIG1heFdvcmtlclRocmVhZHMoaW50IG4pIHsKKyAgICAgIG1heFdvcmtlclRocmVhZHMgPSBuOworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRNaW5Xb3JrZXJUaHJlYWRzKCkgeworICAgICAgcmV0dXJuIG1pbldvcmtlclRocmVhZHM7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRNYXhXb3JrZXJUaHJlYWRzKCkgeworICAgICAgcmV0dXJuIG1heFdvcmtlclRocmVhZHM7CiAgICAgfQogCiAgICAgcHVibGljIGludCBnZXRTdG9wVGltZW91dFZhbCgpIHsKQEAgLTk5LDcgKzEzMSw3IEBACiAgIH0KIAogICAvKioKLSAgICogQGluaGVyaXREb2MKKyAgICoge0Bpbmhlcml0RG9jfQogICAgKi8KICAgQE92ZXJyaWRlCiAgIHByb3RlY3RlZCB2b2lkIHdhaXRGb3JTaHV0ZG93bigpIHsKQEAgLTExMSwxNyArMTQzLDIxIEBACiAgICAqIEhlbHBlciB0byBjcmVhdGUgYW4gaW52b2tlciBwb29sCiAgICAqLwogICBwcm90ZWN0ZWQgc3RhdGljIEV4ZWN1dG9yU2VydmljZSBjcmVhdGVJbnZva2VyUG9vbChBcmdzIG9wdGlvbnMpIHsKLSAgICBpbnQgd29ya2VyVGhyZWFkcyA9IG9wdGlvbnMud29ya2VyVGhyZWFkczsKKyAgICBpbnQgbWluV29ya2VyVGhyZWFkcyA9IG9wdGlvbnMubWluV29ya2VyVGhyZWFkczsKKyAgICBpbnQgbWF4V29ya2VyVGhyZWFkcyA9IG9wdGlvbnMubWF4V29ya2VyVGhyZWFkczsKICAgICBpbnQgc3RvcFRpbWVvdXRWYWwgPSBvcHRpb25zLnN0b3BUaW1lb3V0VmFsOwogICAgIFRpbWVVbml0IHN0b3BUaW1lb3V0VW5pdCA9IG9wdGlvbnMuc3RvcFRpbWVvdXRVbml0OwogCiAgICAgTGlua2VkQmxvY2tpbmdRdWV1ZTxSdW5uYWJsZT4gcXVldWUgPSBuZXcgTGlua2VkQmxvY2tpbmdRdWV1ZTxSdW5uYWJsZT4oKTsKLSAgICBFeGVjdXRvclNlcnZpY2UgaW52b2tlciA9IG5ldyBUaHJlYWRQb29sRXhlY3V0b3Iod29ya2VyVGhyZWFkcywKLSAgICAgIHdvcmtlclRocmVhZHMsIHN0b3BUaW1lb3V0VmFsLCBzdG9wVGltZW91dFVuaXQsIHF1ZXVlKTsKKyAgICBFeGVjdXRvclNlcnZpY2UgaW52b2tlciA9IG5ldyBUaHJlYWRQb29sRXhlY3V0b3IobWluV29ya2VyVGhyZWFkcywKKyAgICAgIG1heFdvcmtlclRocmVhZHMsIHN0b3BUaW1lb3V0VmFsLCBzdG9wVGltZW91dFVuaXQsIHF1ZXVlKTsKIAogICAgIHJldHVybiBpbnZva2VyOwogICB9CiAKKyAgcHJvdGVjdGVkIEV4ZWN1dG9yU2VydmljZSBnZXRJbnZva2VyKCkgeworICAgIHJldHVybiBpbnZva2VyOworICB9CiAKICAgcHJvdGVjdGVkIHZvaWQgZ3JhY2VmdWxseVNodXRkb3duSW52b2tlclBvb2woKSB7CiAgICAgLy8gdHJ5IHRvIGdyYWNlZnVsbHkgc2h1dCBkb3duIHRoZSBleGVjdXRvciBzZXJ2aWNlCmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UTm9uYmxvY2tpbmdTZXJ2ZXIuamF2YQppbmRleCAxMGE4ZWJhLi5mZTAzNjVhIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVE5vbmJsb2NraW5nU2VydmVyLmphdmEKQEAgLTQ3LDEwICs0Nyw2IEBACiAgICAgfQogICB9CiAKLSAgLy8gRmxhZyBmb3Igc3RvcHBpbmcgdGhlIHNlcnZlcgotICAvLyBQbGVhc2Ugc2VlIFRIUklGVC0xNzk1IGZvciB0aGUgdXNhZ2Ugb2YgdGhpcyBmbGFnCi0gIHByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBzdG9wcGVkXyA9IGZhbHNlOwotCiAgIHByaXZhdGUgU2VsZWN0QWNjZXB0VGhyZWFkIHNlbGVjdEFjY2VwdFRocmVhZF87CiAKICAgcHVibGljIFROb25ibG9ja2luZ1NlcnZlcihBYnN0cmFjdE5vbmJsb2NraW5nU2VydmVyQXJncyBhcmdzKSB7CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RTZXJ2ZXIuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVFNlcnZlci5qYXZhCmluZGV4IGE4NWE0MjkuLmJhYzA2YjIgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVFNlcnZlci5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVFNlcnZlci5qYXZhCkBAIC0xMjMsMTAgKzEyMywxNCBAQAogICAgKi8KICAgcHJvdGVjdGVkIFRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5XzsKIAotICBwcml2YXRlIGJvb2xlYW4gaXNTZXJ2aW5nOworICBwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gaXNTZXJ2aW5nOwogCiAgIHByb3RlY3RlZCBUU2VydmVyRXZlbnRIYW5kbGVyIGV2ZW50SGFuZGxlcl87CiAKKyAgLy8gRmxhZyBmb3Igc3RvcHBpbmcgdGhlIHNlcnZlcgorICAvLyBQbGVhc2Ugc2VlIFRIUklGVC0xNzk1IGZvciB0aGUgdXNhZ2Ugb2YgdGhpcyBmbGFnCisgIHByb3RlY3RlZCB2b2xhdGlsZSBib29sZWFuIHN0b3BwZWRfID0gZmFsc2U7CisKICAgcHJvdGVjdGVkIFRTZXJ2ZXIoQWJzdHJhY3RTZXJ2ZXJBcmdzIGFyZ3MpIHsKICAgICBwcm9jZXNzb3JGYWN0b3J5XyA9IGFyZ3MucHJvY2Vzc29yRmFjdG9yeTsKICAgICBzZXJ2ZXJUcmFuc3BvcnRfID0gYXJncy5zZXJ2ZXJUcmFuc3BvcnQ7CkBAIC0xNjIsNCArMTY2LDEyIEBACiAgIHB1YmxpYyBUU2VydmVyRXZlbnRIYW5kbGVyIGdldEV2ZW50SGFuZGxlcigpIHsKICAgICByZXR1cm4gZXZlbnRIYW5kbGVyXzsKICAgfQorCisgIHB1YmxpYyBib29sZWFuIGdldFNob3VsZFN0b3AoKSB7CisgICAgcmV0dXJuIHRoaXMuc3RvcHBlZF87CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRTaG91bGRTdG9wKGJvb2xlYW4gc2hvdWxkU3RvcCkgeworICAgIHRoaXMuc3RvcHBlZF8gPSBzaG91bGRTdG9wOworICB9CiB9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5qYXZhCmluZGV4IDRkZmMxNzYuLmU4MTViMmMgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5qYXZhCkBAIC0zNSw5ICszNSw2IEBACiAKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFRTaW1wbGVTZXJ2ZXIuY2xhc3MuZ2V0TmFtZSgpKTsKIAotICAvLyBQbGVhc2Ugc2VlIFRIUklGVC0xNzk1IGZvciB0aGUgdXNhZ2Ugb2YgdGhpcyBmbGFnCi0gIHByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBzdG9wcGVkXyA9IGZhbHNlOwotCiAgIHB1YmxpYyBUU2ltcGxlU2VydmVyKEFic3RyYWN0U2VydmVyQXJncyBhcmdzKSB7CiAgICAgc3VwZXIoYXJncyk7CiAgIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuamF2YQpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IGFkYWMyN2UuLjE2OTdhZDYKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuamF2YQpAQCAtNzAsNiArNzAsMTYgQEAKICAgICAgIHJldHVybiB0aGlzOwogICAgIH0KIAorICAgIHB1YmxpYyBBcmdzIHN0b3BUaW1lb3V0VmFsKGludCBuKSB7CisgICAgICBzdG9wVGltZW91dFZhbCA9IG47CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgQXJncyBzdG9wVGltZW91dFVuaXQoVGltZVVuaXQgdHUpIHsKKyAgICAgIHN0b3BUaW1lb3V0VW5pdCA9IHR1OworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCiAgICAgcHVibGljIEFyZ3MgcmVxdWVzdFRpbWVvdXQoaW50IG4pIHsKICAgICAgIHJlcXVlc3RUaW1lb3V0ID0gbjsKICAgICAgIHJldHVybiB0aGlzOwpAQCAtMTAwLDEwICsxMTAsNiBAQAogICAvLyBFeGVjdXRvciBzZXJ2aWNlIGZvciBoYW5kbGluZyBjbGllbnQgY29ubmVjdGlvbnMKICAgcHJpdmF0ZSBFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3JTZXJ2aWNlXzsKIAotICAvLyBGbGFnIGZvciBzdG9wcGluZyB0aGUgc2VydmVyCi0gIC8vIFBsZWFzZSBzZWUgVEhSSUZULTE3OTUgZm9yIHRoZSB1c2FnZSBvZiB0aGlzIGZsYWcKLSAgcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIHN0b3BwZWRfID0gZmFsc2U7Ci0KICAgcHJpdmF0ZSBmaW5hbCBUaW1lVW5pdCBzdG9wVGltZW91dFVuaXQ7CiAKICAgcHJpdmF0ZSBmaW5hbCBsb25nIHN0b3BUaW1lb3V0VmFsOwpAQCAtMTM0LDI3ICsxNDAsNDUgQEAKICAgICAgIG5ldyBTeW5jaHJvbm91c1F1ZXVlPFJ1bm5hYmxlPigpOwogICAgIHJldHVybiBuZXcgVGhyZWFkUG9vbEV4ZWN1dG9yKGFyZ3MubWluV29ya2VyVGhyZWFkcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLm1heFdvcmtlclRocmVhZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZVVuaXQuU0VDT05EUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLnN0b3BUaW1lb3V0VmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3Muc3RvcFRpbWVvdXRVbml0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dG9yUXVldWUpOwogICB9CiAKLQotICBwdWJsaWMgdm9pZCBzZXJ2ZSgpIHsKLSAgICB0cnkgeworICBwcm90ZWN0ZWQgRXhlY3V0b3JTZXJ2aWNlIGdldEV4ZWN1dG9yU2VydmljZSgpIHsKKyAgICByZXR1cm4gZXhlY3V0b3JTZXJ2aWNlXzsKKyAgfQorICAKKyAgcHJvdGVjdGVkIGJvb2xlYW4gcHJlU2VydmUoKSB7CisgIAl0cnkgewogICAgICAgc2VydmVyVHJhbnNwb3J0Xy5saXN0ZW4oKTsKICAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkgewogICAgICAgTE9HR0VSLmVycm9yKCJFcnJvciBvY2N1cnJlZCBkdXJpbmcgbGlzdGVuaW5nLiIsIHR0eCk7Ci0gICAgICByZXR1cm47CisgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgLy8gUnVuIHRoZSBwcmVTZXJ2ZSBldmVudAogICAgIGlmIChldmVudEhhbmRsZXJfICE9IG51bGwpIHsKICAgICAgIGV2ZW50SGFuZGxlcl8ucHJlU2VydmUoKTsKICAgICB9Ci0KICAgICBzdG9wcGVkXyA9IGZhbHNlOwogICAgIHNldFNlcnZpbmcodHJ1ZSk7CisgICAgCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXJ2ZSgpIHsKKyAgCWlmICghcHJlU2VydmUoKSkgeworICAJCXJldHVybjsKKyAgCX0KKworICAJZXhlY3V0ZSgpOworICAJd2FpdEZvclNodXRkb3duKCk7CisgICAgCisgICAgc2V0U2VydmluZyhmYWxzZSk7CisgIH0KKyAgCisgIHByb3RlY3RlZCB2b2lkIGV4ZWN1dGUoKSB7CiAgICAgaW50IGZhaWx1cmVDb3VudCA9IDA7CiAgICAgd2hpbGUgKCFzdG9wcGVkXykgewogICAgICAgdHJ5IHsKQEAgLTIwNyw4ICsyMzEsMTAgQEAKICAgICAgICAgfQogICAgICAgfQogICAgIH0KLQotICAgIGV4ZWN1dG9yU2VydmljZV8uc2h1dGRvd24oKTsKKyAgfQorICAKKyAgcHJvdGVjdGVkIHZvaWQgd2FpdEZvclNodXRkb3duKCkgeworICAJZXhlY3V0b3JTZXJ2aWNlXy5zaHV0ZG93bigpOwogCiAgICAgLy8gTG9vcCB1bnRpbCBhd2FpdFRlcm1pbmF0aW9uIGZpbmFsbHkgZG9lcyByZXR1cm4gd2l0aG91dCBhIGludGVycnVwdGVkCiAgICAgLy8gZXhjZXB0aW9uLiBJZiB3ZSBkb24ndCBkbyB0aGlzLCB0aGVuIHdlJ2xsIHNodXQgZG93biBwcmVtYXR1cmVseS4gV2Ugd2FudApAQCAtMjI2LDcgKzI1Miw2IEBACiAgICAgICAgIG5vdyA9IG5ld25vdzsKICAgICAgIH0KICAgICB9Ci0gICAgc2V0U2VydmluZyhmYWxzZSk7CiAgIH0KIAogICBwdWJsaWMgdm9pZCBzdG9wKCkgewpAQCAtMjY4LDcgKzI5Myw3IEBACiAgICAgICAgIGlucHV0VHJhbnNwb3J0ID0gaW5wdXRUcmFuc3BvcnRGYWN0b3J5Xy5nZXRUcmFuc3BvcnQoY2xpZW50Xyk7CiAgICAgICAgIG91dHB1dFRyYW5zcG9ydCA9IG91dHB1dFRyYW5zcG9ydEZhY3RvcnlfLmdldFRyYW5zcG9ydChjbGllbnRfKTsKICAgICAgICAgaW5wdXRQcm90b2NvbCA9IGlucHV0UHJvdG9jb2xGYWN0b3J5Xy5nZXRQcm90b2NvbChpbnB1dFRyYW5zcG9ydCk7Ci0gICAgICAgIG91dHB1dFByb3RvY29sID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5Xy5nZXRQcm90b2NvbChvdXRwdXRUcmFuc3BvcnQpOwkgIAorICAgICAgICBvdXRwdXRQcm90b2NvbCA9IG91dHB1dFByb3RvY29sRmFjdG9yeV8uZ2V0UHJvdG9jb2wob3V0cHV0VHJhbnNwb3J0KTsKIAogICAgICAgICBldmVudEhhbmRsZXIgPSBnZXRFdmVudEhhbmRsZXIoKTsKICAgICAgICAgaWYgKGV2ZW50SGFuZGxlciAhPSBudWxsKSB7CkBAIC0yODYsMjYgKzMxMSwzNSBAQAogICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgfSBjYXRjaCAoVFNhc2xUcmFuc3BvcnRFeGNlcHRpb24gdHR4KSB7Ci0gICAgICAgIC8vIFNvbWV0aGluZyB0aGF0cyBub3QgU0FTTCB3YXMgaW4gdGhlIHN0cmVhbSwgY29udGludWUgc2lsZW50bHkgCi0gICAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkgewotICAgICAgICAvLyBBc3N1bWUgdGhlIGNsaWVudCBkaWVkIGFuZCBjb250aW51ZSBzaWxlbnRseQogICAgICAgfSBjYXRjaCAoVEV4Y2VwdGlvbiB0eCkgewogICAgICAgICBMT0dHRVIuZXJyb3IoIlRocmlmdCBlcnJvciBvY2N1cnJlZCBkdXJpbmcgcHJvY2Vzc2luZyBvZiBtZXNzYWdlLiIsIHR4KTsKICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiB4KSB7Ci0gICAgICAgIExPR0dFUi5lcnJvcigiRXJyb3Igb2NjdXJyZWQgZHVyaW5nIHByb2Nlc3Npbmcgb2YgbWVzc2FnZS4iLCB4KTsKLSAgICAgIH0KLQotICAgICAgaWYgKGV2ZW50SGFuZGxlciAhPSBudWxsKSB7Ci0gICAgICAgIGV2ZW50SGFuZGxlci5kZWxldGVDb250ZXh0KGNvbm5lY3Rpb25Db250ZXh0LCBpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChpbnB1dFRyYW5zcG9ydCAhPSBudWxsKSB7Ci0gICAgICAgIGlucHV0VHJhbnNwb3J0LmNsb3NlKCk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChvdXRwdXRUcmFuc3BvcnQgIT0gbnVsbCkgewotICAgICAgICBvdXRwdXRUcmFuc3BvcnQuY2xvc2UoKTsKKyAgICAgICAgLy8gV2UnbGwgdXN1YWxseSByZWNlaXZlIFJ1bnRpbWVFeGNlcHRpb24gdHlwZXMgaGVyZQorICAgICAgICAvLyBOZWVkIHRvIHVud3JhcCB0byBhc2NlcnRhaW4gcmVhbCBjYXVzaW5nIGV4Y2VwdGlvbiBiZWZvcmUgd2UgY2hvb3NlIHRvIGlnbm9yZQorICAgICAgICBUaHJvd2FibGUgcmVhbENhdXNlID0geC5nZXRDYXVzZSgpOworICAgICAgICAvLyBJZ25vcmUgZXJyLWxvZ2dpbmcgYWxsIHRyYW5zcG9ydC1sZXZlbC90eXBlIGV4Y2VwdGlvbnMKKyAgICAgICAgaWYgKChyZWFsQ2F1c2UgIT0gbnVsbCAmJiByZWFsQ2F1c2UgaW5zdGFuY2VvZiBUVHJhbnNwb3J0RXhjZXB0aW9uKQorICAgICAgICAgICAgfHwgKHggaW5zdGFuY2VvZiBUVHJhbnNwb3J0RXhjZXB0aW9uKSkgeworICAgICAgICAgIExPR0dFUi5kZWJ1ZygKKyAgICAgICAgICAgICAgIlJlY2VpdmVkIFRUcmFuc3BvcnRFeGNlcHRpb24gZHVyaW5nIHByb2Nlc3Npbmcgb2YgbWVzc2FnZS4gSWdub3JpbmcuIiwKKyAgICAgICAgICAgICAgeCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gTG9nIHRoZSBleGNlcHRpb24gYXQgZXJyb3IgbGV2ZWwgYW5kIGNvbnRpbnVlCisgICAgICAgICAgTE9HR0VSLmVycm9yKCJFcnJvciBvY2N1cnJlZCBkdXJpbmcgcHJvY2Vzc2luZyBvZiBtZXNzYWdlLiIsIHgpOworICAgICAgICB9CisgICAgICB9IGZpbmFsbHkgeworICAgICAgICBpZiAoZXZlbnRIYW5kbGVyICE9IG51bGwpIHsKKyAgICAgICAgICBldmVudEhhbmRsZXIuZGVsZXRlQ29udGV4dChjb25uZWN0aW9uQ29udGV4dCwgaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dFRyYW5zcG9ydCAhPSBudWxsKSB7CisgICAgICAgICAgaW5wdXRUcmFuc3BvcnQuY2xvc2UoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAob3V0cHV0VHJhbnNwb3J0ICE9IG51bGwpIHsKKyAgICAgICAgICBvdXRwdXRUcmFuc3BvcnQuY2xvc2UoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2xpZW50Xy5pc09wZW4oKSkgeworICAgICAgICAgIGNsaWVudF8uY2xvc2UoKTsKKyAgICAgICAgfQogICAgICAgfQogICAgIH0KICAgfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UVGhyZWFkZWRTZWxlY3RvclNlcnZlci5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UVGhyZWFkZWRTZWxlY3RvclNlcnZlci5qYXZhCmluZGV4IDllYjlmOTAuLjAzODUwN2UgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVFRocmVhZGVkU2VsZWN0b3JTZXJ2ZXIuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RUaHJlYWRlZFNlbGVjdG9yU2VydmVyLmphdmEKQEAgLTE5LDcgKzE5LDE1IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyOwogCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVE5vbmJsb2NraW5nVHJhbnNwb3J0OworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLkNsb3NlZENoYW5uZWxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0YWJsZUNoYW5uZWw7CiBpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0aW9uS2V5OwogaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNlbGVjdG9yOwogaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLnNwaS5TZWxlY3RvclByb3ZpZGVyOwpAQCAtMzcsMjQgKzQ1LDE4IEBACiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuUmVqZWN0ZWRFeGVjdXRpb25FeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CiAKLWltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UTm9uYmxvY2tpbmdUcmFuc3BvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKLQogLyoqCiAgKiBBIEhhbGYtU3luYy9IYWxmLUFzeW5jIHNlcnZlciB3aXRoIGEgc2VwYXJhdGUgcG9vbCBvZiB0aHJlYWRzIHRvIGhhbmRsZQogICogbm9uLWJsb2NraW5nIEkvTy4gQWNjZXB0cyBhcmUgaGFuZGxlZCBvbiBhIHNpbmdsZSB0aHJlYWQsIGFuZCBhIGNvbmZpZ3VyYWJsZQogICogbnVtYmVyIG9mIG5vbmJsb2NraW5nIHNlbGVjdG9yIHRocmVhZHMgbWFuYWdlIHJlYWRpbmcgYW5kIHdyaXRpbmcgb2YgY2xpZW50CiAgKiBjb25uZWN0aW9ucy4gQSBzeW5jaHJvbm91cyB3b3JrZXIgdGhyZWFkIHBvb2wgaGFuZGxlcyBwcm9jZXNzaW5nIG9mIHJlcXVlc3RzLgotICogCisgKgogICogUGVyZm9ybXMgYmV0dGVyIHRoYW4gVE5vbmJsb2NraW5nU2VydmVyL1RIc0hhU2VydmVyIGluIG11bHRpLWNvcmUKICAqIGVudmlyb25tZW50cyB3aGVuIHRoZSB0aGUgYm90dGxlbmVjayBpcyBDUFUgb24gdGhlIHNpbmdsZSBzZWxlY3RvciB0aHJlYWQKICAqIGhhbmRsaW5nIEkvTy4gSW4gYWRkaXRpb24sIGJlY2F1c2UgdGhlIGFjY2VwdCBoYW5kbGluZyBpcyBkZWNvdXBsZWQgZnJvbQogICogcmVhZHMvd3JpdGVzIGFuZCBpbnZvY2F0aW9uLCB0aGUgc2VydmVyIGhhcyBiZXR0ZXIgYWJpbGl0eSB0byBoYW5kbGUgYmFjay0KICAqIHByZXNzdXJlIGZyb20gbmV3IGNvbm5lY3Rpb25zIChlLmcuIHN0b3AgYWNjZXB0aW5nIHdoZW4gYnVzeSkuCi0gKiAKKyAqCiAgKiBMaWtlIFROb25ibG9ja2luZ1NlcnZlciwgaXQgcmVsaWVzIG9uIHRoZSB1c2Ugb2YgVEZyYW1lZFRyYW5zcG9ydC4KICAqLwogcHVibGljIGNsYXNzIFRUaHJlYWRlZFNlbGVjdG9yU2VydmVyIGV4dGVuZHMgQWJzdHJhY3ROb25ibG9ja2luZ1NlcnZlciB7CkBAIC0xODAsMTAgKzE4Miw2IEBACiAgICAgfQogICB9CiAKLSAgLy8gRmxhZyBmb3Igc3RvcHBpbmcgdGhlIHNlcnZlcgotICAvLyBQbGVhc2Ugc2VlIFRIUklGVC0xNzk1IGZvciB0aGUgdXNhZ2Ugb2YgdGhpcyBmbGFnCi0gIHByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBzdG9wcGVkXyA9IGZhbHNlOwotCiAgIC8vIFRoZSB0aHJlYWQgaGFuZGxpbmcgYWxsIGFjY2VwdHMKICAgcHJpdmF0ZSBBY2NlcHRUaHJlYWQgYWNjZXB0VGhyZWFkOwogCkBAIC0yMDksNyArMjA3LDcgQEAKIAogICAvKioKICAgICogU3RhcnQgdGhlIGFjY2VwdCBhbmQgc2VsZWN0b3IgdGhyZWFkcyBydW5uaW5nIHRvIGRlYWwgd2l0aCBjbGllbnRzLgotICAgKiAKKyAgICoKICAgICogQHJldHVybiB0cnVlIGlmIGV2ZXJ5dGhpbmcgd2VudCBvaywgZmFsc2UgaWYgd2UgY291bGRuJ3Qgc3RhcnQgZm9yIHNvbWUKICAgICogICAgICAgICByZWFzb24uCiAgICAqLwpAQCAtMzUzLDcgKzM1MSw3IEBACiAKICAgICAvKioKICAgICAgKiBTZXQgdXAgdGhlIEFjY2VwdFRoZWFkCi0gICAgICogCisgICAgICoKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICovCiAgICAgcHVibGljIEFjY2VwdFRocmVhZChUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LApAQCAtMzc5LDcgKzM3Nyw3IEBACiAgICAgICAgICAgc2VsZWN0KCk7CiAgICAgICAgIH0KICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0gICAgICAgIExPR0dFUi5lcnJvcigicnVuKCkgZXhpdGluZyBkdWUgdG8gdW5jYXVnaHQgZXJyb3IiLCB0KTsKKyAgICAgICAgTE9HR0VSLmVycm9yKCJydW4oKSBvbiBBY2NlcHRUaHJlYWQgZXhpdGluZyBkdWUgdG8gdW5jYXVnaHQgZXJyb3IiLCB0KTsKICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgYWNjZXB0U2VsZWN0b3IuY2xvc2UoKTsKQEAgLTQ4MiwxMCArNDgwLDEzIEBACiAKICAgICAvLyBBY2NlcHRlZCBjb25uZWN0aW9ucyBhZGRlZCBieSB0aGUgYWNjZXB0IHRocmVhZC4KICAgICBwcml2YXRlIGZpbmFsIEJsb2NraW5nUXVldWU8VE5vbmJsb2NraW5nVHJhbnNwb3J0PiBhY2NlcHRlZFF1ZXVlOworICAgIHByaXZhdGUgaW50IFNFTEVDVE9SX0FVVE9fUkVCVUlMRF9USFJFU0hPTEQgPSA1MTI7CisgICAgcHJpdmF0ZSBsb25nIE1PTklUT1JfUEVSSU9EID0gMTAwMEw7CisgICAgcHJpdmF0ZSBpbnQganZtQnVnID0gMDsKIAogICAgIC8qKgogICAgICAqIFNldCB1cCB0aGUgU2VsZWN0b3JUaHJlYWQgd2l0aCBhbiB1bmJvdW5kZWQgcXVldWUgZm9yIGluY29taW5nIGFjY2VwdHMuCi0gICAgICogCisgICAgICoKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICogICAgICAgICAgIGlmIGEgc2VsZWN0b3IgY2Fubm90IGJlIGNyZWF0ZWQKICAgICAgKi8KQEAgLTQ5NSw3ICs0OTYsNyBAQAogCiAgICAgLyoqCiAgICAgICogU2V0IHVwIHRoZSBTZWxlY3RvclRocmVhZCB3aXRoIGFuIGJvdW5kZWQgcXVldWUgZm9yIGluY29taW5nIGFjY2VwdHMuCi0gICAgICogCisgICAgICoKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICogICAgICAgICAgIGlmIGEgc2VsZWN0b3IgY2Fubm90IGJlIGNyZWF0ZWQKICAgICAgKi8KQEAgLTUwNSw3ICs1MDYsNyBAQAogCiAgICAgLyoqCiAgICAgICogU2V0IHVwIHRoZSBTZWxlY3RvclRocmVhZCB3aXRoIGEgc3BlY2lmaWVkIHF1ZXVlIGZvciBjb25uZWN0aW9ucy4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSBhY2NlcHRlZFF1ZXVlCiAgICAgICogICAgICAgICAgVGhlIEJsb2NraW5nUXVldWUgaW1wbGVtZW50YXRpb24gZm9yIGhvbGRpbmcgaW5jb21pbmcgYWNjZXB0ZWQKICAgICAgKiAgICAgICAgICBjb25uZWN0aW9ucy4KQEAgLTUxOSw3ICs1MjAsNyBAQAogICAgIC8qKgogICAgICAqIEhhbmRzIG9mZiBhbiBhY2NlcHRlZCBjb25uZWN0aW9uIHRvIGJlIGhhbmRsZWQgYnkgdGhpcyB0aHJlYWQuIFRoaXMKICAgICAgKiBtZXRob2Qgd2lsbCBibG9jayBpZiB0aGUgcXVldWUgZm9yIG5ldyBjb25uZWN0aW9ucyBpcyBhdCBjYXBhY2l0eS4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSBhY2NlcHRlZAogICAgICAqICAgICAgICAgIFRoZSBjb25uZWN0aW9uIHRoYXQgaGFzIGJlZW4gYWNjZXB0ZWQuCiAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjb25uZWN0aW9uIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBhZGRlZC4KQEAgLTU1MCw3ICs1NTEsNyBAQAogICAgICAgICAgIGNsZWFudXBTZWxlY3Rpb25LZXkoc2VsZWN0aW9uS2V5KTsKICAgICAgICAgfQogICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgTE9HR0VSLmVycm9yKCJydW4oKSBleGl0aW5nIGR1ZSB0byB1bmNhdWdodCBlcnJvciIsIHQpOworICAgICAgICBMT0dHRVIuZXJyb3IoInJ1bigpIG9uIFNlbGVjdG9yVGhyZWFkIGV4aXRpbmcgZHVlIHRvIHVuY2F1Z2h0IGVycm9yIiwgdCk7CiAgICAgICB9IGZpbmFsbHkgewogICAgICAgICB0cnkgewogICAgICAgICAgIHNlbGVjdG9yLmNsb3NlKCk7CkBAIC01NzAsOCArNTcxLDggQEAKICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgc2VsZWN0KCkgewogICAgICAgdHJ5IHsKLSAgICAgICAgLy8gd2FpdCBmb3IgaW8gZXZlbnRzLgotICAgICAgICBzZWxlY3Rvci5zZWxlY3QoKTsKKworICAgICAgICBkb1NlbGVjdCgpOwogCiAgICAgICAgIC8vIHByb2Nlc3MgdGhlIGlvIGV2ZW50cyB3ZSByZWNlaXZlZAogICAgICAgICBJdGVyYXRvcjxTZWxlY3Rpb25LZXk+IHNlbGVjdGVkS2V5cyA9IHNlbGVjdG9yLnNlbGVjdGVkS2V5cygpLml0ZXJhdG9yKCk7CkBAIC02MDAsNiArNjAxLDc3IEBACiAgICAgICB9CiAgICAgfQogCisgICAgLyoqCisgICAgICogRG8gc2VsZWN0IGFuZCBqdWRnZSBlcG9sbCBidWcgaGFwcGVuLgorICAgICAqIFNlZSA6IGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQyNTEKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZG9TZWxlY3QoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgbG9uZyBiZWZvcmVTZWxlY3QgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgIGludCBzZWxlY3RlZE51bXMgPSBzZWxlY3Rvci5zZWxlY3QoKTsKKyAgICAgIGxvbmcgYWZ0ZXJTZWxlY3QgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKworICAgICAgaWYgKHNlbGVjdGVkTnVtcyA9PSAwKSB7CisgICAgICAgIGp2bUJ1ZysrOworICAgICAgfSBlbHNlIHsKKyAgICAgICAganZtQnVnID0gMDsKKyAgICAgIH0KKworICAgICAgbG9uZyBzZWxlY3RlZFRpbWUgPSBhZnRlclNlbGVjdCAtIGJlZm9yZVNlbGVjdDsKKyAgICAgIGlmIChzZWxlY3RlZFRpbWUgPj0gTU9OSVRPUl9QRVJJT0QpIHsKKyAgICAgICAganZtQnVnID0gMDsKKyAgICAgIH0gZWxzZSBpZiAoanZtQnVnID4gU0VMRUNUT1JfQVVUT19SRUJVSUxEX1RIUkVTSE9MRCkgeworICAgICAgICBMT0dHRVIud2FybigiSW4ge30gbXMgaGFwcGVuIHt9IHRpbWVzIGp2bSBidWc7IHJlYnVpbGRpbmcgc2VsZWN0b3IuIiwgTU9OSVRPUl9QRVJJT0QsIGp2bUJ1Zyk7CisgICAgICAgIHJlYnVpbGRTZWxlY3RvcigpOworICAgICAgICBzZWxlY3Rvci5zZWxlY3ROb3coKTsKKyAgICAgICAganZtQnVnID0gMDsKKyAgICAgIH0KKworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlcGxhY2VzIHRoZSBjdXJyZW50IFNlbGVjdG9yIG9mIHRoaXMgU2VsZWN0b3JUaHJlYWQgd2l0aCBuZXdseSBjcmVhdGVkIFNlbGVjdG9yIHRvIHdvcmsKKyAgICAgKiBhcm91bmQgdGhlIGluZmFtb3VzIGVwb2xsIDEwMCUgQ1BVIGJ1Zy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHJlYnVpbGRTZWxlY3RvcigpIHsKKyAgICAgIGZpbmFsIFNlbGVjdG9yIG9sZFNlbGVjdG9yID0gc2VsZWN0b3I7CisgICAgICBpZiAob2xkU2VsZWN0b3IgPT0gbnVsbCkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBTZWxlY3RvciBuZXdTZWxlY3RvciA9IG51bGw7CisgICAgICB0cnkgeworICAgICAgICBuZXdTZWxlY3RvciA9IFNlbGVjdG9yLm9wZW4oKTsKKyAgICAgICAgTE9HR0VSLndhcm4oIkNyZWF0ZWQgbmV3IFNlbGVjdG9yLiIpOworICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICBMT0dHRVIuZXJyb3IoIkNyZWF0ZSBuZXcgU2VsZWN0b3IgZXJyb3IuIiwgZSk7CisgICAgICB9CisKKyAgICAgIGZvciAoU2VsZWN0aW9uS2V5IGtleSA6IG9sZFNlbGVjdG9yLnNlbGVjdGVkS2V5cygpKSB7CisgICAgICAgIGlmICgha2V5LmlzVmFsaWQoKSAmJiBrZXkucmVhZHlPcHMoKSA9PSAwKQorICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBTZWxlY3RhYmxlQ2hhbm5lbCBjaGFubmVsID0ga2V5LmNoYW5uZWwoKTsKKyAgICAgICAgT2JqZWN0IGF0dGFjaG1lbnQgPSBrZXkuYXR0YWNobWVudCgpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgaWYgKGF0dGFjaG1lbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgY2hhbm5lbC5yZWdpc3RlcihuZXdTZWxlY3Rvciwga2V5LnJlYWR5T3BzKCkpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjaGFubmVsLnJlZ2lzdGVyKG5ld1NlbGVjdG9yLCBrZXkucmVhZHlPcHMoKSwgYXR0YWNobWVudCk7CisgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChDbG9zZWRDaGFubmVsRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICBMT0dHRVIuZXJyb3IoIlJlZ2lzdGVyIG5ldyBzZWxlY3RvciBrZXkgZXJyb3IuIiwgZSk7CisgICAgICAgIH0KKworICAgICAgfQorCisgICAgICBzZWxlY3RvciA9IG5ld1NlbGVjdG9yOworICAgICAgdHJ5IHsKKyAgICAgICAgb2xkU2VsZWN0b3IuY2xvc2UoKTsKKyAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgTE9HR0VSLmVycm9yKCJDbG9zZSBvbGQgc2VsZWN0b3IgZXJyb3IuIiwgZSk7CisgICAgICB9CisgICAgICBMT0dHRVIud2FybigiUmVwbGFjZSBuZXcgc2VsZWN0b3Igc3VjY2Vzcy4iKTsKKyAgICB9CisKICAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0FjY2VwdGVkQ29ubmVjdGlvbnMoKSB7CiAgICAgICAvLyBSZWdpc3RlciBhY2NlcHRlZCBjb25uZWN0aW9ucwogICAgICAgd2hpbGUgKCFzdG9wcGVkXykgewpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9BdXRvRXhwYW5kaW5nQnVmZmVyLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L0F1dG9FeHBhbmRpbmdCdWZmZXIuamF2YQppbmRleCBiMDI5MDVmLi5mYzNhYTkyIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L0F1dG9FeHBhbmRpbmdCdWZmZXIuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L0F1dG9FeHBhbmRpbmdCdWZmZXIuamF2YQpAQCAtMTgsNiArMTgsOCBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKIAoraW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKIC8qKgogICogSGVscGVyIGNsYXNzIHRoYXQgd3JhcHMgYSBieXRlW10gc28gdGhhdCBpdCBjYW4gZXhwYW5kIGFuZCBiZSByZXVzZWQuIFVzZXJzCiAgKiBzaG91bGQgY2FsbCByZXNpemVJZk5lY2Vzc2FyeSB0byBtYWtlIHN1cmUgdGhlIGJ1ZmZlciBoYXMgc3VpdGFibGUgY2FwYWNpdHksCkBAIC0yNSwyOCArMjcsMjQgQEAKICAqIHJhdGUgc2xpZ2h0bHkgZmFzdGVyIHRoYW4gdGhlIHJlcXVlc3RlZCBjYXBhY2l0eSB3aXRoIHRoZSAodW50ZXN0ZWQpCiAgKiBvYmplY3RpdmUgb2YgYXZvaWRpbmcgZXhwZW5zaXZlIGJ1ZmZlciBhbGxvY2F0aW9ucyBhbmQgY29waWVzLgogICovCi1wdWJsaWMgY2xhc3MgQXV0b0V4cGFuZGluZ0J1ZmZlciB7CitjbGFzcyBBdXRvRXhwYW5kaW5nQnVmZmVyIHsKICAgcHJpdmF0ZSBieXRlW10gYXJyYXk7CiAKLSAgcHJpdmF0ZSBmaW5hbCBkb3VibGUgZ3Jvd3RoQ29lZmZpY2llbnQ7Ci0KLSAgcHVibGljIEF1dG9FeHBhbmRpbmdCdWZmZXIoaW50IGluaXRpYWxDYXBhY2l0eSwgZG91YmxlIGdyb3d0aENvZWZmaWNpZW50KSB7Ci0gICAgaWYgKGdyb3d0aENvZWZmaWNpZW50IDwgMS4wKSB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJHcm93dGggY29lZmZpY2llbnQgbXVzdCBiZSA+PSAxLjAiKTsKLSAgICB9Ci0gICAgYXJyYXkgPSBuZXcgYnl0ZVtpbml0aWFsQ2FwYWNpdHldOwotICAgIHRoaXMuZ3Jvd3RoQ29lZmZpY2llbnQgPSBncm93dGhDb2VmZmljaWVudDsKKyAgcHVibGljIEF1dG9FeHBhbmRpbmdCdWZmZXIoaW50IGluaXRpYWxDYXBhY2l0eSkgeworICAgIHRoaXMuYXJyYXkgPSBuZXcgYnl0ZVtpbml0aWFsQ2FwYWNpdHldOwogICB9CiAKICAgcHVibGljIHZvaWQgcmVzaXplSWZOZWNlc3NhcnkoaW50IHNpemUpIHsKLSAgICBpZiAoYXJyYXkubGVuZ3RoIDwgc2l6ZSkgewotICAgICAgYnl0ZVtdIG5ld0J1ZiA9IG5ldyBieXRlWyhpbnQpKHNpemUgKiBncm93dGhDb2VmZmljaWVudCldOwotICAgICAgU3lzdGVtLmFycmF5Y29weShhcnJheSwgMCwgbmV3QnVmLCAwLCBhcnJheS5sZW5ndGgpOwotICAgICAgYXJyYXkgPSBuZXdCdWY7CisgICAgZmluYWwgaW50IGN1cnJlbnRDYXBhY2l0eSA9IHRoaXMuYXJyYXkubGVuZ3RoOworICAgIGlmIChjdXJyZW50Q2FwYWNpdHkgPCBzaXplKSB7CisgICAgICAvLyBJbmNyZWFzZSBieSBhIGZhY3RvciBvZiAxLjV4CisgICAgICBpbnQgZ3Jvd0NhcGFjaXR5ID0gY3VycmVudENhcGFjaXR5ICsgKGN1cnJlbnRDYXBhY2l0eSA+PiAxKTsKKyAgICAgIGludCBuZXdDYXBhY2l0eSA9IE1hdGgubWF4KGdyb3dDYXBhY2l0eSwgc2l6ZSk7CisgICAgICB0aGlzLmFycmF5ID0gQXJyYXlzLmNvcHlPZihhcnJheSwgbmV3Q2FwYWNpdHkpOwogICAgIH0KICAgfQogCiAgIHB1YmxpYyBieXRlW10gYXJyYXkoKSB7Ci0gICAgcmV0dXJuIGFycmF5OworICAgIHJldHVybiB0aGlzLmFycmF5OwogICB9CiB9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L0F1dG9FeHBhbmRpbmdCdWZmZXJSZWFkVHJhbnNwb3J0LmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L0F1dG9FeHBhbmRpbmdCdWZmZXJSZWFkVHJhbnNwb3J0LmphdmEKaW5kZXggMDgxYmM0OC4uYTI4ZDI1NCAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9BdXRvRXhwYW5kaW5nQnVmZmVyUmVhZFRyYW5zcG9ydC5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvQXV0b0V4cGFuZGluZ0J1ZmZlclJlYWRUcmFuc3BvcnQuamF2YQpAQCAtMjgsOCArMjgsOCBAQAogICBwcml2YXRlIGludCBwb3MgPSAwOwogICBwcml2YXRlIGludCBsaW1pdCA9IDA7CiAKLSAgcHVibGljIEF1dG9FeHBhbmRpbmdCdWZmZXJSZWFkVHJhbnNwb3J0KGludCBpbml0aWFsQ2FwYWNpdHksIGRvdWJsZSBvdmVyZ3Jvd3RoQ29lZmZpY2llbnQpIHsKLSAgICB0aGlzLmJ1ZiA9IG5ldyBBdXRvRXhwYW5kaW5nQnVmZmVyKGluaXRpYWxDYXBhY2l0eSwgb3Zlcmdyb3d0aENvZWZmaWNpZW50KTsKKyAgcHVibGljIEF1dG9FeHBhbmRpbmdCdWZmZXJSZWFkVHJhbnNwb3J0KGludCBpbml0aWFsQ2FwYWNpdHkpIHsKKyAgICB0aGlzLmJ1ZiA9IG5ldyBBdXRvRXhwYW5kaW5nQnVmZmVyKGluaXRpYWxDYXBhY2l0eSk7CiAgIH0KIAogICBwdWJsaWMgdm9pZCBmaWxsKFRUcmFuc3BvcnQgaW5UcmFucywgaW50IGxlbmd0aCkgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gewpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9BdXRvRXhwYW5kaW5nQnVmZmVyV3JpdGVUcmFuc3BvcnQuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvQXV0b0V4cGFuZGluZ0J1ZmZlcldyaXRlVHJhbnNwb3J0LmphdmEKaW5kZXggOWIzNTY5My4uZWM3ZTdkNCAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9BdXRvRXhwYW5kaW5nQnVmZmVyV3JpdGVUcmFuc3BvcnQuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L0F1dG9FeHBhbmRpbmdCdWZmZXJXcml0ZVRyYW5zcG9ydC5qYXZhCkBAIC0yNSwxMCArMjUsMjkgQEAKIAogICBwcml2YXRlIGZpbmFsIEF1dG9FeHBhbmRpbmdCdWZmZXIgYnVmOwogICBwcml2YXRlIGludCBwb3M7CisgIHByaXZhdGUgaW50IHJlczsKIAotICBwdWJsaWMgQXV0b0V4cGFuZGluZ0J1ZmZlcldyaXRlVHJhbnNwb3J0KGludCBpbml0aWFsQ2FwYWNpdHksIGRvdWJsZSBncm93dGhDb2VmZmljaWVudCkgewotICAgIHRoaXMuYnVmID0gbmV3IEF1dG9FeHBhbmRpbmdCdWZmZXIoaW5pdGlhbENhcGFjaXR5LCBncm93dGhDb2VmZmljaWVudCk7Ci0gICAgdGhpcy5wb3MgPSAwOworICAvKioKKyAgICogQ29uc3RydWN0b3IuCisgICAqIEBwYXJhbSBpbml0aWFsQ2FwYWNpdHkgdGhlIGluaXRpYWwgY2FwYWNpdHkgb2YgdGhlIGJ1ZmZlcgorICAgKiBAcGFyYW0gZnJvbnRSZXNlcnZlIHNwYWNlLCBpZiBhbnksIHRvIHJlc2VydmUgYXQgdGhlIGJlZ2lubmluZyBzdWNoCisgICAqICAgICAgICAgICAgICAgICAgICAgdGhhdCB0aGUgZmlyc3Qgd3JpdGUgaXMgYWZ0ZXIgdGhpcyByZXNlcnZlLgorICAgKiAgICAgICAgICAgICAgICAgICAgIFRoaXMgYWxsb3dzIGZyYW1lZCB0cmFuc3BvcnQgdG8gcmVzZXJ2ZSBzcGFjZQorICAgKiAgICAgICAgICAgICAgICAgICAgIGZvciB0aGUgZnJhbWUgYnVmZmVyIGxlbmd0aC4KKyAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgaW5pdGlhbENhcGFjaXR5IGlzIGxlc3MgdGhhbiBvbmUKKyAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgZnJvbnRSZXNlcnZlIGlzIGxlc3MgdGhhbiB6ZXJvCisgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGZyb250UmVzZXJ2ZSBpcyBncmVhdGVyIHRoYW4gaW5pdGlhbENhcGFjaXR5CisgICAqLworICBwdWJsaWMgQXV0b0V4cGFuZGluZ0J1ZmZlcldyaXRlVHJhbnNwb3J0KGludCBpbml0aWFsQ2FwYWNpdHksIGludCBmcm9udFJlc2VydmUpIHsKKyAgICBpZiAoaW5pdGlhbENhcGFjaXR5IDwgMSkgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW5pdGlhbENhcGFjaXR5Iik7CisgICAgfQorICAgIGlmIChmcm9udFJlc2VydmUgPCAwIHx8IGluaXRpYWxDYXBhY2l0eSA8IGZyb250UmVzZXJ2ZSkgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZnJvbnRSZXNlcnZlIik7CisgICAgfQorICAgIHRoaXMuYnVmID0gbmV3IEF1dG9FeHBhbmRpbmdCdWZmZXIoaW5pdGlhbENhcGFjaXR5KTsKKyAgICB0aGlzLnBvcyA9IGZyb250UmVzZXJ2ZTsKKyAgICB0aGlzLnJlcyA9IGZyb250UmVzZXJ2ZTsKICAgfQogCiAgIEBPdmVycmlkZQpAQCAtNTYsMTEgKzc1LDE0IEBACiAgICAgcmV0dXJuIGJ1ZjsKICAgfQogCi0gIHB1YmxpYyBpbnQgZ2V0UG9zKCkgeworICAvKioKKyAgICogQHJldHVybiBsZW5ndGggb2YgdGhlIGJ1ZmZlciwgaW5jbHVkaW5nIGFueSBmcm9udCByZXNlcnZlCisgICAqLworICBwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKICAgICByZXR1cm4gcG9zOwogICB9CiAKICAgcHVibGljIHZvaWQgcmVzZXQoKSB7Ci0gICAgcG9zID0gMDsKKyAgICBwb3MgPSByZXM7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEJ5dGVCdWZmZXIuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEJ5dGVCdWZmZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmIwNjU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UQnl0ZUJ1ZmZlci5qYXZhCkBAIC0wLDAgKzEsODcgQEAKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OworCitpbXBvcnQgamF2YS5uaW8uQnVmZmVyT3ZlcmZsb3dFeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQnVmZmVyVW5kZXJmbG93RXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CisKKy8qKgorICogQnl0ZUJ1ZmZlci1iYWNrZWQgaW1wbGVtZW50YXRpb24gb2YgVFRyYW5zcG9ydC4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFRCeXRlQnVmZmVyIGV4dGVuZHMgVFRyYW5zcG9ydCB7CisgIHByaXZhdGUgZmluYWwgQnl0ZUJ1ZmZlciBieXRlQnVmZmVyOworCisgIC8qKgorICAgKiBDcmVhdGVzIGEgbmV3IFRCeXRlQnVmZmVyIHdyYXBwaW5nIGEgZ2l2ZW4gTklPIEJ5dGVCdWZmZXIuCisgICAqLworICBwdWJsaWMgVEJ5dGVCdWZmZXIoQnl0ZUJ1ZmZlciBieXRlQnVmZmVyKSB7CisgICAgdGhpcy5ieXRlQnVmZmVyID0gYnl0ZUJ1ZmZlcjsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBpc09wZW4oKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgb3BlbigpIHsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IHJlYWQoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24geworICAgIGZpbmFsIGludCBuID0gTWF0aC5taW4oYnl0ZUJ1ZmZlci5yZW1haW5pbmcoKSwgbGVuKTsKKyAgICBpZiAobiA+IDApIHsKKyAgICAgIHRyeSB7CisgICAgICAgIGJ5dGVCdWZmZXIuZ2V0KGJ1Ziwgb2ZmLCBuKTsKKyAgICAgIH0gY2F0Y2ggKEJ1ZmZlclVuZGVyZmxvd0V4Y2VwdGlvbiBlKSB7CisgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJVbmV4cGVjdGVkIGVuZCBvZiBpbnB1dCBidWZmZXIiLCBlKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG47CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICBieXRlQnVmZmVyLnB1dChidWYsIG9mZiwgbGVuKTsKKyAgICB9IGNhdGNoIChCdWZmZXJPdmVyZmxvd0V4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiTm90IGVub3VnaCByb29tIGluIG91dHB1dCBidWZmZXIiLCBlKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogR2V0IHRoZSB1bmRlcmx5aW5nIE5JTyBCeXRlQnVmZmVyLgorICAgKi8KKyAgcHVibGljIEJ5dGVCdWZmZXIgZ2V0Qnl0ZUJ1ZmZlcigpIHsKKyAgICByZXR1cm4gYnl0ZUJ1ZmZlcjsKKyAgfQorCisgIC8qKgorICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gY2FsbCBjbGVhcigpIG9uIHRoZSB1bmRlcmx5aW5nIE5JTyBCeXRlQnVmZmVyLgorICAgKi8KKyAgcHVibGljIFRCeXRlQnVmZmVyIGNsZWFyKCkgeworICAgIGJ5dGVCdWZmZXIuY2xlYXIoKTsKKyAgICByZXR1cm4gdGhpczsKKyAgfQorCisgIC8qKgorICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gY2FsbCBmbGlwKCkgb24gdGhlIHVuZGVybHlpbmcgTklPIEJ5dGVCdWZmZXIuCisgICAgICovCisgIHB1YmxpYyBUQnl0ZUJ1ZmZlciBmbGlwKCkgeworICAgIGJ5dGVCdWZmZXIuZmxpcCgpOworICAgIHJldHVybiB0aGlzOworICB9CisKKyAgLyoqCisgICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBjb252ZXJ0IHRoZSB1bmRlcmx5aW5nIE5JTyBCeXRlQnVmZmVyIHRvIGEKKyAgICogcGxhaW4gb2xkIGJ5dGUgYXJyYXkuCisgICAqLworICBwdWJsaWMgYnl0ZVtdIHRvQnl0ZUFycmF5KCkgeworICAgIGZpbmFsIGJ5dGVbXSBkYXRhID0gbmV3IGJ5dGVbYnl0ZUJ1ZmZlci5yZW1haW5pbmcoKV07CisgICAgYnl0ZUJ1ZmZlci5zbGljZSgpLmdldChkYXRhKTsKKyAgICByZXR1cm4gZGF0YTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9URmFzdEZyYW1lZFRyYW5zcG9ydC5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9URmFzdEZyYW1lZFRyYW5zcG9ydC5qYXZhCmluZGV4IGUzMmI3ZGIuLmExZmQyNDkgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEZhc3RGcmFtZWRUcmFuc3BvcnQuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGYXN0RnJhbWVkVHJhbnNwb3J0LmphdmEKQEAgLTE5LDEyICsxOSwxMiBAQAogcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CiAKIC8qKgotICogVGhpcyB0cmFuc3BvcnQgaXMgd2lyZSBjb21wYXRpYmxlIHdpdGgge0BsaW5rIFRGcmFtZWRUcmFuc3BvcnR9LCBidXQgbWFrZXMgCisgKiBUaGlzIHRyYW5zcG9ydCBpcyB3aXJlIGNvbXBhdGlibGUgd2l0aCB7QGxpbmsgVEZyYW1lZFRyYW5zcG9ydH0sIGJ1dCBtYWtlcwogICogdXNlIG9mIHJldXNhYmxlLCBleHBhbmRpbmcgcmVhZCBhbmQgd3JpdGUgYnVmZmVycyBpbiBvcmRlciB0byBhdm9pZAogICogYWxsb2NhdGluZyBuZXcgYnl0ZVtdcyBhbGwgdGhlIHRpbWUuIFNpbmNlIHRoZSBidWZmZXJzIG9ubHkgZXhwYW5kLCB5b3UKICAqIHNob3VsZCBwcm9iYWJseSBvbmx5IHVzZSB0aGlzIHRyYW5zcG9ydCBpZiB5b3VyIG1lc3NhZ2VzIGFyZSBub3QgdG9vIHZhcmlhYmx5CiAgKiBsYXJnZSwgdW5sZXNzIHRoZSBwZXJzaXN0ZW50IG1lbW9yeSBjb3N0IGlzIG5vdCBhbiBpc3N1ZS4KLSAqIAorICoKICAqIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgTk9UIHRocmVhZHNhZmUuCiAgKi8KIHB1YmxpYyBjbGFzcyBURmFzdEZyYW1lZFRyYW5zcG9ydCBleHRlbmRzIFRUcmFuc3BvcnQgewpAQCAtNjUsNyArNjUsOCBAQAogCiAgIHByaXZhdGUgZmluYWwgVFRyYW5zcG9ydCB1bmRlcmx5aW5nOwogICBwcml2YXRlIGZpbmFsIEF1dG9FeHBhbmRpbmdCdWZmZXJXcml0ZVRyYW5zcG9ydCB3cml0ZUJ1ZmZlcjsKLSAgcHJpdmF0ZSBmaW5hbCBBdXRvRXhwYW5kaW5nQnVmZmVyUmVhZFRyYW5zcG9ydCByZWFkQnVmZmVyOworICBwcml2YXRlIEF1dG9FeHBhbmRpbmdCdWZmZXJSZWFkVHJhbnNwb3J0IHJlYWRCdWZmZXI7CisgIHByaXZhdGUgZmluYWwgaW50IGluaXRpYWxCdWZmZXJDYXBhY2l0eTsKICAgcHJpdmF0ZSBmaW5hbCBieXRlW10gaTMyYnVmID0gbmV3IGJ5dGVbNF07CiAgIHByaXZhdGUgZmluYWwgaW50IG1heExlbmd0aDsKIApAQCAtOTEsNyArOTIsNyBAQAogICB9CiAKICAgLyoqCi0gICAqIAorICAgKgogICAgKiBAcGFyYW0gdW5kZXJseWluZyBUcmFuc3BvcnQgdGhhdCByZWFsIHJlYWRzIGFuZCB3cml0ZXMgd2lsbCBnbyB0aHJvdWdoIHRvLgogICAgKiBAcGFyYW0gaW5pdGlhbEJ1ZmZlckNhcGFjaXR5IFRoZSBpbml0aWFsIHNpemUgb2YgdGhlIHJlYWQgYW5kIHdyaXRlIGJ1ZmZlcnMuCiAgICAqIEluIHByYWN0aWNlLCBpdCdzIG5vdCBjcml0aWNhbCB0byBzZXQgdGhpcyB1bmxlc3MgeW91IGtub3cgaW4gYWR2YW5jZSB0aGF0CkBAIC0xMDQsOCArMTA1LDkgQEAKICAgcHVibGljIFRGYXN0RnJhbWVkVHJhbnNwb3J0KFRUcmFuc3BvcnQgdW5kZXJseWluZywgaW50IGluaXRpYWxCdWZmZXJDYXBhY2l0eSwgaW50IG1heExlbmd0aCkgewogICAgIHRoaXMudW5kZXJseWluZyA9IHVuZGVybHlpbmc7CiAgICAgdGhpcy5tYXhMZW5ndGggPSBtYXhMZW5ndGg7Ci0gICAgd3JpdGVCdWZmZXIgPSBuZXcgQXV0b0V4cGFuZGluZ0J1ZmZlcldyaXRlVHJhbnNwb3J0KGluaXRpYWxCdWZmZXJDYXBhY2l0eSwgMS41KTsKLSAgICByZWFkQnVmZmVyID0gbmV3IEF1dG9FeHBhbmRpbmdCdWZmZXJSZWFkVHJhbnNwb3J0KGluaXRpYWxCdWZmZXJDYXBhY2l0eSwgMS41KTsKKyAgICB0aGlzLmluaXRpYWxCdWZmZXJDYXBhY2l0eSA9IGluaXRpYWxCdWZmZXJDYXBhY2l0eTsKKyAgICByZWFkQnVmZmVyID0gbmV3IEF1dG9FeHBhbmRpbmdCdWZmZXJSZWFkVHJhbnNwb3J0KGluaXRpYWxCdWZmZXJDYXBhY2l0eSk7CisgICAgd3JpdGVCdWZmZXIgPSBuZXcgQXV0b0V4cGFuZGluZ0J1ZmZlcldyaXRlVHJhbnNwb3J0KGluaXRpYWxCdWZmZXJDYXBhY2l0eSwgNCk7CiAgIH0KIAogICBAT3ZlcnJpZGUKQEAgLTE0MSwxMSArMTQzLDE0IEBACiAgICAgaW50IHNpemUgPSBURnJhbWVkVHJhbnNwb3J0LmRlY29kZUZyYW1lU2l6ZShpMzJidWYpOwogCiAgICAgaWYgKHNpemUgPCAwKSB7Ci0gICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiUmVhZCBhIG5lZ2F0aXZlIGZyYW1lIHNpemUgKCIgKyBzaXplICsgIikhIik7CisgICAgICBjbG9zZSgpOworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5DT1JSVVBURURfREFUQSwgIlJlYWQgYSBuZWdhdGl2ZSBmcmFtZSBzaXplICgiICsgc2l6ZSArICIpISIpOwogICAgIH0KIAogICAgIGlmIChzaXplID4gbWF4TGVuZ3RoKSB7Ci0gICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiRnJhbWUgc2l6ZSAoIiArIHNpemUgKyAiKSBsYXJnZXIgdGhhbiBtYXggbGVuZ3RoICgiICsgbWF4TGVuZ3RoICsgIikhIik7CisgICAgICBjbG9zZSgpOworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5DT1JSVVBURURfREFUQSwKKyAgICAgICAgICAiRnJhbWUgc2l6ZSAoIiArIHNpemUgKyAiKSBsYXJnZXIgdGhhbiBtYXggbGVuZ3RoICgiICsgbWF4TGVuZ3RoICsgIikhIik7CiAgICAgfQogCiAgICAgcmVhZEJ1ZmZlci5maWxsKHVuZGVybHlpbmcsIHNpemUpOwpAQCAtMTYxLDEyICsxNjYsMTkgQEAKICAgICByZWFkQnVmZmVyLmNvbnN1bWVCdWZmZXIobGVuKTsKICAgfQogCisgIC8qKgorICAgKiBPbmx5IGNsZWFycyB0aGUgcmVhZCBidWZmZXIhCisgICAqLworICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKyAgICByZWFkQnVmZmVyID0gbmV3IEF1dG9FeHBhbmRpbmdCdWZmZXJSZWFkVHJhbnNwb3J0KGluaXRpYWxCdWZmZXJDYXBhY2l0eSk7CisgIH0KKwogICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgZmx1c2goKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7Ci0gICAgaW50IGxlbmd0aCA9IHdyaXRlQnVmZmVyLmdldFBvcygpOwotICAgIFRGcmFtZWRUcmFuc3BvcnQuZW5jb2RlRnJhbWVTaXplKGxlbmd0aCwgaTMyYnVmKTsKLSAgICB1bmRlcmx5aW5nLndyaXRlKGkzMmJ1ZiwgMCwgNCk7Ci0gICAgdW5kZXJseWluZy53cml0ZSh3cml0ZUJ1ZmZlci5nZXRCdWYoKS5hcnJheSgpLCAwLCBsZW5ndGgpOworICAgIGludCBwYXlsb2FkTGVuZ3RoID0gd3JpdGVCdWZmZXIuZ2V0TGVuZ3RoKCkgLSA0OyAgICAgICAgCisgICAgYnl0ZVtdIGRhdGEgPSB3cml0ZUJ1ZmZlci5nZXRCdWYoKS5hcnJheSgpOworICAgIFRGcmFtZWRUcmFuc3BvcnQuZW5jb2RlRnJhbWVTaXplKHBheWxvYWRMZW5ndGgsIGRhdGEpOworICAgIHVuZGVybHlpbmcud3JpdGUoZGF0YSwgMCwgcGF5bG9hZExlbmd0aCArIDQpOwogICAgIHdyaXRlQnVmZmVyLnJlc2V0KCk7CiAgICAgdW5kZXJseWluZy5mbHVzaCgpOwogICB9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGaWxlUHJvY2Vzc29yLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGaWxlUHJvY2Vzc29yLmphdmEKaW5kZXggNGU2YTE5OC4uOTYwODdkMSAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9URmlsZVByb2Nlc3Nvci5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEZpbGVQcm9jZXNzb3IuamF2YQpAQCAtMjcsOCArMjcsNiBAQAogLyoqCiAgKiBGaWxlUHJvY2Vzc29yOiBoZWxwcyBpbiBwcm9jZXNzaW5nIGZpbGVzIGdlbmVyYXRlZCBieSBURmlsZVRyYW5zcG9ydC4KICAqIFBvcnQgb2Ygb3JpZ2luYWwgY3BwIGltcGxlbWVudGF0aW9uCi0gKgotICogQGF1dGhvciBKb3lkZWVwIFNlbiBTYXJtYSA8anNzYXJtYUBmYWNlYm9vay5jb20+CiAgKi8KIHB1YmxpYyBjbGFzcyBURmlsZVByb2Nlc3NvciB7CiAKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEZpbGVUcmFuc3BvcnQuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEZpbGVUcmFuc3BvcnQuamF2YQppbmRleCAwMDQ0ZDJhLi5jMDExYzUyIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGaWxlVHJhbnNwb3J0LmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9URmlsZVRyYW5zcG9ydC5qYXZhCkBAIC0zMyw4ICszMyw2IEBACiAgKiBJdCBtYXkgbWFrZSBiZXR0ZXIgc2Vuc2UgdG8gcHJvdmlkZSBhIGJhc2ljIHN0cmVhbSBhY2Nlc3Mgb24gdG9wIG9mIHRoZSBmcmFtZWQgZmlsZSBmb3JtYXQKICAqIFRoZSBGaWxlVHJhbnNwb3J0IGNhbiB0aGVuIGJlIGEgdXNlciBvZiB0aGlzIGZyYW1lZCBmaWxlIGZvcm1hdCB3aXRoIHNvbWUgYWRkaXRpb25hbCBsb2dpYwogICogZm9yIGNodW5raW5nLgotICoKLSAqIEBhdXRob3IgSm95ZGVlcCBTZW4gU2FybWEgPGpzc2FybWFAZmFjZWJvb2suY29tPgogICovCiBwdWJsaWMgY2xhc3MgVEZpbGVUcmFuc3BvcnQgZXh0ZW5kcyBUVHJhbnNwb3J0IHsKIApAQCAtMzY4LDcgKzM2Niw3IEBACiAgICAgICBjdXJyZW50RXZlbnRfID0gbmV3IEV2ZW50KG5ldyBieXRlIFsyNTZdKTsKIAogICAgICAgaWYoIXJlYWRPbmx5XykKLSAgICAgICAgb3V0cHV0U3RyZWFtXyA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShpbnB1dEZpbGVfLmdldE91dHB1dFN0cmVhbSgpLCA4MTkyKTsKKyAgICAgICAgb3V0cHV0U3RyZWFtXyA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShpbnB1dEZpbGVfLmdldE91dHB1dFN0cmVhbSgpKTsKICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb3gpIHsKICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uTk9UX09QRU4sIGlveCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9URnJhbWVkVHJhbnNwb3J0LmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnQuamF2YQppbmRleCBjOTQ4YWE0Li5hMDA2YzNhIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnQuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnQuamF2YQpAQCAtNDUsNyArNDUsOCBAQAogICAvKioKICAgICogQnVmZmVyIGZvciBpbnB1dAogICAgKi8KLSAgcHJpdmF0ZSBUTWVtb3J5SW5wdXRUcmFuc3BvcnQgcmVhZEJ1ZmZlcl8gPSBuZXcgVE1lbW9yeUlucHV0VHJhbnNwb3J0KG5ldyBieXRlWzBdKTsKKyAgcHJpdmF0ZSBmaW5hbCBUTWVtb3J5SW5wdXRUcmFuc3BvcnQgcmVhZEJ1ZmZlcl8gPQorICAgIG5ldyBUTWVtb3J5SW5wdXRUcmFuc3BvcnQobmV3IGJ5dGVbMF0pOwogCiAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeSBleHRlbmRzIFRUcmFuc3BvcnRGYWN0b3J5IHsKICAgICBwcml2YXRlIGludCBtYXhMZW5ndGhfOwpAQCAtNjUsMTYgKzY2LDI1IEBACiAgIH0KIAogICAvKioKKyAgICogU29tZXRoaW5nIHRvIGZpbGwgaW4gdGhlIGZpcnN0IGZvdXIgYnl0ZXMgb2YgdGhlIGJ1ZmZlcgorICAgKiB0byBtYWtlIHJvb20gZm9yIHRoZSBmcmFtZSBzaXplLiAgVGhpcyBhbGxvd3MgdGhlCisgICAqIGltcGxlbWVudGF0aW9uIHRvIHdyaXRlIG9uY2UgaW5zdGVhZCBvZiB0d2ljZS4KKyAgICovCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBzaXplRmlsbGVyXyA9IG5ldyBieXRlW10geyAweDAwLCAweDAwLCAweDAwLCAweDAwIH07CisKKyAgLyoqCiAgICAqIENvbnN0cnVjdG9yIHdyYXBzIGFyb3VuZCBhbm90aGVyIHRyYW5zcG9ydAogICAgKi8KICAgcHVibGljIFRGcmFtZWRUcmFuc3BvcnQoVFRyYW5zcG9ydCB0cmFuc3BvcnQsIGludCBtYXhMZW5ndGgpIHsKICAgICB0cmFuc3BvcnRfID0gdHJhbnNwb3J0OwogICAgIG1heExlbmd0aF8gPSBtYXhMZW5ndGg7CisgICAgd3JpdGVCdWZmZXJfLndyaXRlKHNpemVGaWxsZXJfLCAwLCA0KTsKICAgfQogCiAgIHB1YmxpYyBURnJhbWVkVHJhbnNwb3J0KFRUcmFuc3BvcnQgdHJhbnNwb3J0KSB7CiAgICAgdHJhbnNwb3J0XyA9IHRyYW5zcG9ydDsKICAgICBtYXhMZW5ndGhfID0gVEZyYW1lZFRyYW5zcG9ydC5ERUZBVUxUX01BWF9MRU5HVEg7CisgICAgd3JpdGVCdWZmZXJfLndyaXRlKHNpemVGaWxsZXJfLCAwLCA0KTsKICAgfQogCiAgIHB1YmxpYyB2b2lkIG9wZW4oKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CkBAIC05MCwxMSArMTAwLDkgQEAKICAgfQogCiAgIHB1YmxpYyBpbnQgcmVhZChieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7Ci0gICAgaWYgKHJlYWRCdWZmZXJfICE9IG51bGwpIHsKLSAgICAgIGludCBnb3QgPSByZWFkQnVmZmVyXy5yZWFkKGJ1Ziwgb2ZmLCBsZW4pOwotICAgICAgaWYgKGdvdCA+IDApIHsKLSAgICAgICAgcmV0dXJuIGdvdDsKLSAgICAgIH0KKyAgICBpbnQgZ290ID0gcmVhZEJ1ZmZlcl8ucmVhZChidWYsIG9mZiwgbGVuKTsKKyAgICBpZiAoZ290ID4gMCkgeworICAgICAgcmV0dXJuIGdvdDsKICAgICB9CiAKICAgICAvLyBSZWFkIGFub3RoZXIgZnJhbWUgb2YgZGF0YQpAQCAtMTIzLDYgKzEzMSwxMCBAQAogICAgIHJlYWRCdWZmZXJfLmNvbnN1bWVCdWZmZXIobGVuKTsKICAgfQogCisgIHB1YmxpYyB2b2lkIGNsZWFyKCkgeworICAgIHJlYWRCdWZmZXJfLmNsZWFyKCk7CisgIH0KKwogICBwcml2YXRlIGZpbmFsIGJ5dGVbXSBpMzJidWYgPSBuZXcgYnl0ZVs0XTsKIAogICBwcml2YXRlIHZvaWQgcmVhZEZyYW1lKCkgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gewpAQCAtMTMwLDExICsxNDIsMTQgQEAKICAgICBpbnQgc2l6ZSA9IGRlY29kZUZyYW1lU2l6ZShpMzJidWYpOwogCiAgICAgaWYgKHNpemUgPCAwKSB7Ci0gICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiUmVhZCBhIG5lZ2F0aXZlIGZyYW1lIHNpemUgKCIgKyBzaXplICsgIikhIik7CisgICAgICBjbG9zZSgpOworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5DT1JSVVBURURfREFUQSwgIlJlYWQgYSBuZWdhdGl2ZSBmcmFtZSBzaXplICgiICsgc2l6ZSArICIpISIpOwogICAgIH0KIAogICAgIGlmIChzaXplID4gbWF4TGVuZ3RoXykgewotICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkZyYW1lIHNpemUgKCIgKyBzaXplICsgIikgbGFyZ2VyIHRoYW4gbWF4IGxlbmd0aCAoIiArIG1heExlbmd0aF8gKyAiKSEiKTsKKyAgICAgIGNsb3NlKCk7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkNPUlJVUFRFRF9EQVRBLAorICAgICAgICAgICJGcmFtZSBzaXplICgiICsgc2l6ZSArICIpIGxhcmdlciB0aGFuIG1heCBsZW5ndGggKCIgKyBtYXhMZW5ndGhfICsgIikhIik7CiAgICAgfQogCiAgICAgYnl0ZVtdIGJ1ZmYgPSBuZXcgYnl0ZVtzaXplXTsKQEAgLTE0OSwxMiArMTY0LDEyIEBACiAgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKICAgICBieXRlW10gYnVmID0gd3JpdGVCdWZmZXJfLmdldCgpOwotICAgIGludCBsZW4gPSB3cml0ZUJ1ZmZlcl8ubGVuKCk7CisgICAgaW50IGxlbiA9IHdyaXRlQnVmZmVyXy5sZW4oKSAtIDQ7ICAgICAgIC8vIGFjY291bnQgZm9yIHRoZSBwcmVwZW5kZWQgZnJhbWUgc2l6ZQogICAgIHdyaXRlQnVmZmVyXy5yZXNldCgpOworICAgIHdyaXRlQnVmZmVyXy53cml0ZShzaXplRmlsbGVyXywgMCwgNCk7ICAvLyBtYWtlIHJvb20gZm9yIHRoZSBuZXh0IGZyYW1lJ3Mgc2l6ZSBkYXRhCiAKLSAgICBlbmNvZGVGcmFtZVNpemUobGVuLCBpMzJidWYpOwotICAgIHRyYW5zcG9ydF8ud3JpdGUoaTMyYnVmLCAwLCA0KTsKLSAgICB0cmFuc3BvcnRfLndyaXRlKGJ1ZiwgMCwgbGVuKTsKKyAgICBlbmNvZGVGcmFtZVNpemUobGVuLCBidWYpOyAgICAgICAgICAgICAgLy8gdGhpcyBpcyB0aGUgZnJhbWUgbGVuZ3RoIHdpdGhvdXQgdGhlIGZpbGxlcgorICAgIHRyYW5zcG9ydF8ud3JpdGUoYnVmLCAwLCBsZW4gKyA0KTsgICAgICAvLyB3ZSBoYXZlIHRvIHdyaXRlIHRoZSBmcmFtZSBzaXplIGFuZCBmcmFtZSBkYXRhCiAgICAgdHJhbnNwb3J0Xy5mbHVzaCgpOwogICB9CiAKQEAgLTE2Niw3ICsxODEsNyBAQAogICB9CiAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZGVjb2RlRnJhbWVTaXplKGZpbmFsIGJ5dGVbXSBidWYpIHsKLSAgICByZXR1cm4gCisgICAgcmV0dXJuCiAgICAgICAoKGJ1ZlswXSAmIDB4ZmYpIDw8IDI0KSB8CiAgICAgICAoKGJ1ZlsxXSAmIDB4ZmYpIDw8IDE2KSB8CiAgICAgICAoKGJ1ZlsyXSAmIDB4ZmYpIDw8ICA4KSB8CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RIdHRwQ2xpZW50LmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RIdHRwQ2xpZW50LmphdmEKaW5kZXggNWE1YjM3Yy4uYzMwNjNmZSAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cENsaWVudC5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEh0dHBDbGllbnQuamF2YQpAQCAtMzA0LDYgKzMwNCw5IEBACiAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oaW9lKTsKICAgICAgICAgfQogICAgICAgfQorICAgICAgaWYgKHBvc3QgIT0gbnVsbCkgeworICAgICAgICBwb3N0LnJlbGVhc2VDb25uZWN0aW9uKCk7CisgICAgICB9CiAgICAgfQogICB9CiAKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVE1lbW9yeUJ1ZmZlci5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UTWVtb3J5QnVmZmVyLmphdmEKaW5kZXggZWY1ZjVjMi4uYjE5YWM4NiAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UTWVtb3J5QnVmZmVyLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UTWVtb3J5QnVmZmVyLmphdmEKQEAgLTIwLDcgKzIwLDcgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OwogCiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OwogCiAvKioKICAqIE1lbW9yeSBidWZmZXItYmFzZWQgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRUcmFuc3BvcnQgaW50ZXJmYWNlLgpAQCAtMzAsNiArMzAsOCBAQAogICAgKiBDcmVhdGUgYSBUTWVtb3J5QnVmZmVyIHdpdGggYW4gaW5pdGlhbCBidWZmZXIgc2l6ZSBvZiA8aT5zaXplPC9pPi4gVGhlCiAgICAqIGludGVybmFsIGJ1ZmZlciB3aWxsIGdyb3cgYXMgbmVjZXNzYXJ5IHRvIGFjY29tbW9kYXRlIHRoZSBzaXplIG9mIHRoZSBkYXRhCiAgICAqIGJlaW5nIHdyaXR0ZW4gdG8gaXQuCisgICAqCisgICAqIEBwYXJhbSBzaXplIHRoZSBpbml0aWFsIHNpemUgb2YgdGhlIGJ1ZmZlcgogICAgKi8KICAgcHVibGljIFRNZW1vcnlCdWZmZXIoaW50IHNpemUpIHsKICAgICBhcnJfID0gbmV3IFRCeXRlQXJyYXlPdXRwdXRTdHJlYW0oc2l6ZSk7CkBAIC02OSwxMSArNzEsMTEgQEAKICAgLyoqCiAgICAqIE91dHB1dCB0aGUgY29udGVudHMgb2YgdGhlIG1lbW9yeSBidWZmZXIgYXMgYSBTdHJpbmcsIHVzaW5nIHRoZSBzdXBwbGllZAogICAgKiBlbmNvZGluZwotICAgKiBAcGFyYW0gZW5jICB0aGUgZW5jb2RpbmcgdG8gdXNlCisgICAqIEBwYXJhbSBjaGFyc2V0IHRoZSBlbmNvZGluZyB0byB1c2UKICAgICogQHJldHVybiB0aGUgY29udGVudHMgb2YgdGhlIG1lbW9yeSBidWZmZXIgYXMgYSBTdHJpbmcKICAgICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoU3RyaW5nIGVuYykgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gewotICAgIHJldHVybiBhcnJfLnRvU3RyaW5nKGVuYyk7CisgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoQ2hhcnNldCBjaGFyc2V0KSB7CisgICAgcmV0dXJuIGFycl8udG9TdHJpbmcoY2hhcnNldCk7CiAgIH0KIAogICBwdWJsaWMgU3RyaW5nIGluc3BlY3QoKSB7CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NlcnZlclNvY2tldC5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQuamF2YQppbmRleCA0NjVjMjQ2Li5lZjgyYWMyIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NlcnZlclNvY2tldC5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU2VydmVyU29ja2V0LmphdmEKQEAgLTM3LDcgKzM3LDcgQEAKICAqIFdyYXBwZXIgYXJvdW5kIFNlcnZlclNvY2tldENoYW5uZWwKICAqLwogcHVibGljIGNsYXNzIFROb25ibG9ja2luZ1NlcnZlclNvY2tldCBleHRlbmRzIFROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydCB7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQuY2xhc3MuZ2V0TmFtZSgpKTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFROb25ibG9ja2luZ1NlcnZlclNvY2tldC5jbGFzcy5nZXROYW1lKCkpOwogCiAgIC8qKgogICAgKiBUaGlzIGNoYW5uZWwgaXMgd2hlcmUgYWxsIHRoZSBub25ibG9ja2luZyBtYWdpYyBoYXBwZW5zLgpAQCAtOTMsNyArOTMsNyBAQAogICAgICAgc2VydmVyU29ja2V0Xy5iaW5kKGFyZ3MuYmluZEFkZHIsIGFyZ3MuYmFja2xvZyk7CiAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CiAgICAgICBzZXJ2ZXJTb2NrZXRfID0gbnVsbDsKLSAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJDb3VsZCBub3QgY3JlYXRlIFNlcnZlclNvY2tldCBvbiBhZGRyZXNzICIgKyBhcmdzLmJpbmRBZGRyLnRvU3RyaW5nKCkgKyAiLiIpOworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkNvdWxkIG5vdCBjcmVhdGUgU2VydmVyU29ja2V0IG9uIGFkZHJlc3MgIiArIGFyZ3MuYmluZEFkZHIudG9TdHJpbmcoKSArICIuIiwgaW9lKTsKICAgICB9CiAgIH0KIApkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTb2NrZXQuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU29ja2V0LmphdmEKaW5kZXggMjNmODU3NC4uZjg2YTQ4YiAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTb2NrZXQuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NvY2tldC5qYXZhCkBAIC01NSw3ICs1NSw2IEBACiAgICAqIENyZWF0ZSBhIG5ldyBub25ibG9ja2luZyBzb2NrZXQgdHJhbnNwb3J0IHRoYXQgd2lsbCBiZSBjb25uZWN0ZWQgdG8gaG9zdDpwb3J0LgogICAgKiBAcGFyYW0gaG9zdAogICAgKiBAcGFyYW0gcG9ydAotICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24KICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgogICAgKi8KICAgcHVibGljIFROb25ibG9ja2luZ1NvY2tldChTdHJpbmcgaG9zdCwgaW50IHBvcnQsIGludCB0aW1lb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU1NMVHJhbnNwb3J0RmFjdG9yeS5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU1NMVHJhbnNwb3J0RmFjdG9yeS5qYXZhCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggZTgzMGJiOS4uMjIzMmEzMQotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTU0xUcmFuc3BvcnRGYWN0b3J5LmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU1NMVHJhbnNwb3J0RmFjdG9yeS5qYXZhCkBAIC0yMCw4ICsyMCwxMiBAQAogcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LktleVN0b3JlOwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiAKQEAgLTQ1LDkgKzQ5LDkgQEAKICAgICogZnJvbSBTeXN0ZW0gcHJvcGVydGllcyB0aGF0IGFyZSBzZXQuCiAgICAqCiAgICAqIEV4YW1wbGUgc3lzdGVtIHByb3BlcnRpZXM6Ci0gICAqIC1EamF2YXgubmV0LnNzbC50cnVzdFN0b3JlPTx0cnVzdHN0b3JlIGxvY2F0aW9uPgorICAgKiAtRGphdmF4Lm5ldC5zc2wudHJ1c3RTdG9yZT0mbHQ7dHJ1c3RzdG9yZSBsb2NhdGlvbiZndDsKICAgICogLURqYXZheC5uZXQuc3NsLnRydXN0U3RvcmVQYXNzd29yZD1wYXNzd29yZAotICAgKiAtRGphdmF4Lm5ldC5zc2wua2V5U3RvcmU9PGtleXN0b3JlIGxvY2F0aW9uPgorICAgKiAtRGphdmF4Lm5ldC5zc2wua2V5U3RvcmU9Jmx0O2tleXN0b3JlIGxvY2F0aW9uJmd0OwogICAgKiAtRGphdmF4Lm5ldC5zc2wua2V5U3RvcmVQYXNzd29yZD1wYXNzd29yZAogICAgKgogICAgKiBAcGFyYW0gcG9ydApAQCAtMTcxLDggKzE3NSw4IEBACiAKICAgcHJpdmF0ZSBzdGF0aWMgU1NMQ29udGV4dCBjcmVhdGVTU0xDb250ZXh0KFRTU0xUcmFuc3BvcnRQYXJhbWV0ZXJzIHBhcmFtcykgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gewogICAgIFNTTENvbnRleHQgY3R4OwotICAgIEZpbGVJbnB1dFN0cmVhbSBmaW4gPSBudWxsOwotICAgIEZpbGVJbnB1dFN0cmVhbSBmaXMgPSBudWxsOworICAgIElucHV0U3RyZWFtIGluID0gbnVsbDsKKyAgICBJbnB1dFN0cmVhbSBpcyA9IG51bGw7CiAKICAgICB0cnkgewogICAgICAgY3R4ID0gU1NMQ29udGV4dC5nZXRJbnN0YW5jZShwYXJhbXMucHJvdG9jb2wpOwpAQCAtMTgyLDE3ICsxODYsMjUgQEAKICAgICAgIGlmIChwYXJhbXMuaXNUcnVzdFN0b3JlU2V0KSB7CiAgICAgICAgIHRtZiA9IFRydXN0TWFuYWdlckZhY3RvcnkuZ2V0SW5zdGFuY2UocGFyYW1zLnRydXN0TWFuYWdlclR5cGUpOwogICAgICAgICBLZXlTdG9yZSB0cyA9IEtleVN0b3JlLmdldEluc3RhbmNlKHBhcmFtcy50cnVzdFN0b3JlVHlwZSk7Ci0gICAgICAgIGZpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0ocGFyYW1zLnRydXN0U3RvcmUpOwotICAgICAgICB0cy5sb2FkKGZpbiwKLSAgICAgICAgICAocGFyYW1zLnRydXN0UGFzcyAhPSBudWxsID8gcGFyYW1zLnRydXN0UGFzcy50b0NoYXJBcnJheSgpIDogbnVsbCkpOworICAgICAgICBpZiAocGFyYW1zLnRydXN0U3RvcmVTdHJlYW0gIT0gbnVsbCkgeworICAgICAgICAgIGluID0gcGFyYW1zLnRydXN0U3RvcmVTdHJlYW07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaW4gPSBnZXRTdG9yZUFzU3RyZWFtKHBhcmFtcy50cnVzdFN0b3JlKTsKKyAgICAgICAgfQorICAgICAgICB0cy5sb2FkKGluLAorICAgICAgICAgICAgICAgIChwYXJhbXMudHJ1c3RQYXNzICE9IG51bGwgPyBwYXJhbXMudHJ1c3RQYXNzLnRvQ2hhckFycmF5KCkgOiBudWxsKSk7CiAgICAgICAgIHRtZi5pbml0KHRzKTsKICAgICAgIH0KIAogICAgICAgaWYgKHBhcmFtcy5pc0tleVN0b3JlU2V0KSB7CiAgICAgICAgIGttZiA9IEtleU1hbmFnZXJGYWN0b3J5LmdldEluc3RhbmNlKHBhcmFtcy5rZXlNYW5hZ2VyVHlwZSk7CiAgICAgICAgIEtleVN0b3JlIGtzID0gS2V5U3RvcmUuZ2V0SW5zdGFuY2UocGFyYW1zLmtleVN0b3JlVHlwZSk7Ci0gICAgICAgIGZpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0ocGFyYW1zLmtleVN0b3JlKTsKLSAgICAgICAga3MubG9hZChmaXMsIHBhcmFtcy5rZXlQYXNzLnRvQ2hhckFycmF5KCkpOworICAgICAgICBpZiAocGFyYW1zLmtleVN0b3JlU3RyZWFtICE9IG51bGwpIHsKKyAgICAgICAgCWlzID0gcGFyYW1zLmtleVN0b3JlU3RyZWFtOworICAgICAgICB9IGVsc2UgeworICAgICAgICAJaXMgPSBnZXRTdG9yZUFzU3RyZWFtKHBhcmFtcy5rZXlTdG9yZSk7CisgICAgICAgIH0KKyAgICAgICAga3MubG9hZChpcywgcGFyYW1zLmtleVBhc3MudG9DaGFyQXJyYXkoKSk7CiAgICAgICAgIGttZi5pbml0KGtzLCBwYXJhbXMua2V5UGFzcy50b0NoYXJBcnJheSgpKTsKICAgICAgIH0KIApAQCAtMjA5LDE2ICsyMjEsMTYgQEAKICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkVycm9yIGNyZWF0aW5nIHRoZSB0cmFuc3BvcnQiLCBlKTsKICAgICB9IGZpbmFsbHkgewotICAgICAgaWYgKGZpbiAhPSBudWxsKSB7CisgICAgICBpZiAoaW4gIT0gbnVsbCkgewogICAgICAgICB0cnkgewotICAgICAgICAgIGZpbi5jbG9zZSgpOworICAgICAgICAgIGluLmNsb3NlKCk7CiAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwogICAgICAgICB9CiAgICAgICB9Ci0gICAgICBpZiAoZmlzICE9IG51bGwpIHsKKyAgICAgIGlmIChpcyAhPSBudWxsKSB7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgZmlzLmNsb3NlKCk7CisgICAgICAgICAgaXMuY2xvc2UoKTsKICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CiAgICAgICAgIH0KQEAgLTIyOCw2ICsyNDAsMzAgQEAKICAgICByZXR1cm4gY3R4OwogICB9CiAKKyAgcHJpdmF0ZSBzdGF0aWMgSW5wdXRTdHJlYW0gZ2V0U3RvcmVBc1N0cmVhbShTdHJpbmcgc3RvcmUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIHJldHVybiBuZXcgRmlsZUlucHV0U3RyZWFtKHN0b3JlKTsKKyAgICB9IGNhdGNoKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgfQorCisgICAgSW5wdXRTdHJlYW0gc3RvcmVTdHJlYW0gPSBudWxsOworICAgIHRyeSB7CisgICAgICBzdG9yZVN0cmVhbSA9IG5ldyBVUkwoc3RvcmUpLm9wZW5TdHJlYW0oKTsKKyAgICAgIGlmIChzdG9yZVN0cmVhbSAhPSBudWxsKSB7CisgICAgICAgIHJldHVybiBzdG9yZVN0cmVhbTsKKyAgICAgIH0KKyAgICB9IGNhdGNoKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisgICAgfQorCisgICAgc3RvcmVTdHJlYW0gPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpLmdldFJlc291cmNlQXNTdHJlYW0oc3RvcmUpOworCisgICAgaWYgKHN0b3JlU3RyZWFtICE9IG51bGwpIHsKKyAgICAgIHJldHVybiBzdG9yZVN0cmVhbTsKKyAgICB9IGVsc2UgeworICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJDb3VsZCBub3QgbG9hZCBmaWxlOiAiICsgc3RvcmUpOworICAgIH0KKyAgfQorCiAgIHByaXZhdGUgc3RhdGljIFRTb2NrZXQgY3JlYXRlQ2xpZW50KFNTTFNvY2tldEZhY3RvcnkgZmFjdG9yeSwgU3RyaW5nIGhvc3QsIGludCBwb3J0LCBpbnQgdGltZW91dCkgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gewogICAgIHRyeSB7CiAgICAgICBTU0xTb2NrZXQgc29ja2V0ID0gKFNTTFNvY2tldCkgZmFjdG9yeS5jcmVhdGVTb2NrZXQoaG9zdCwgcG9ydCk7CkBAIC0yNDUsMTAgKzI4MSwxMiBAQAogICBwdWJsaWMgc3RhdGljIGNsYXNzIFRTU0xUcmFuc3BvcnRQYXJhbWV0ZXJzIHsKICAgICBwcm90ZWN0ZWQgU3RyaW5nIHByb3RvY29sID0gIlRMUyI7CiAgICAgcHJvdGVjdGVkIFN0cmluZyBrZXlTdG9yZTsKKyAgICBwcm90ZWN0ZWQgSW5wdXRTdHJlYW0ga2V5U3RvcmVTdHJlYW07CiAgICAgcHJvdGVjdGVkIFN0cmluZyBrZXlQYXNzOwogICAgIHByb3RlY3RlZCBTdHJpbmcga2V5TWFuYWdlclR5cGUgPSBLZXlNYW5hZ2VyRmFjdG9yeS5nZXREZWZhdWx0QWxnb3JpdGhtKCk7CiAgICAgcHJvdGVjdGVkIFN0cmluZyBrZXlTdG9yZVR5cGUgPSAiSktTIjsKICAgICBwcm90ZWN0ZWQgU3RyaW5nIHRydXN0U3RvcmU7CisgICAgcHJvdGVjdGVkIElucHV0U3RyZWFtIHRydXN0U3RvcmVTdHJlYW07CiAgICAgcHJvdGVjdGVkIFN0cmluZyB0cnVzdFBhc3M7CiAgICAgcHJvdGVjdGVkIFN0cmluZyB0cnVzdE1hbmFnZXJUeXBlID0gVHJ1c3RNYW5hZ2VyRmFjdG9yeS5nZXREZWZhdWx0QWxnb3JpdGhtKCk7CiAgICAgcHJvdGVjdGVkIFN0cmluZyB0cnVzdFN0b3JlVHlwZSA9ICJKS1MiOwpAQCAtMjgxLDcgKzMxOSw3IEBACiAgICAgICBpZiAocHJvdG9jb2wgIT0gbnVsbCkgewogICAgICAgICB0aGlzLnByb3RvY29sID0gcHJvdG9jb2w7CiAgICAgICB9Ci0gICAgICB0aGlzLmNpcGhlclN1aXRlcyA9IEFycmF5cy5jb3B5T2YoY2lwaGVyU3VpdGVzLCBjaXBoZXJTdWl0ZXMubGVuZ3RoKTsKKyAgICAgIHRoaXMuY2lwaGVyU3VpdGVzID0gY2lwaGVyU3VpdGVzICE9IG51bGwgPyBBcnJheXMuY29weU9mKGNpcGhlclN1aXRlcywgY2lwaGVyU3VpdGVzLmxlbmd0aCkgOiBudWxsOwogICAgICAgdGhpcy5jbGllbnRBdXRoID0gY2xpZW50QXV0aDsKICAgICB9CiAKQEAgLTMwNCw3ICszNDIsMjAgQEAKICAgICAgIH0KICAgICAgIGlzS2V5U3RvcmVTZXQgPSB0cnVlOwogICAgIH0KLQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUga2V5c3RvcmUsIHBhc3N3b3JkLCBjZXJ0aWZpY2F0ZSB0eXBlIGFuZCB0aGUgc3RvcmUgdHlwZQorICAgICAqCisgICAgICogQHBhcmFtIGtleVN0b3JlU3RyZWFtIEtleXN0b3JlIGNvbnRlbnQgaW5wdXQgc3RyZWFtCisgICAgICogQHBhcmFtIGtleVBhc3MgS2V5c3RvcmUgcGFzc3dvcmQKKyAgICAgKiBAcGFyYW0ga2V5TWFuYWdlclR5cGUgVGhlIGRlZmF1bHQgaXMgWDUwOQorICAgICAqIEBwYXJhbSBrZXlTdG9yZVR5cGUgVGhlIGRlZmF1bHQgaXMgSktTCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0S2V5U3RvcmUoSW5wdXRTdHJlYW0ga2V5U3RvcmVTdHJlYW0sIFN0cmluZyBrZXlQYXNzLCBTdHJpbmcga2V5TWFuYWdlclR5cGUsIFN0cmluZyBrZXlTdG9yZVR5cGUpIHsKKyAgICAJdGhpcy5rZXlTdG9yZVN0cmVhbSA9IGtleVN0b3JlU3RyZWFtOworICAgIAlzZXRLZXlTdG9yZSgiIiwga2V5UGFzcywga2V5TWFuYWdlclR5cGUsIGtleVN0b3JlVHlwZSk7CisgICAgfQorICAgIAogICAgIC8qKgogICAgICAqIFNldCB0aGUga2V5c3RvcmUgYW5kIHBhc3N3b3JkCiAgICAgICoKQEAgLTMxNCw3ICszNjUsMTcgQEAKICAgICBwdWJsaWMgdm9pZCBzZXRLZXlTdG9yZShTdHJpbmcga2V5U3RvcmUsIFN0cmluZyBrZXlQYXNzKSB7CiAgICAgICBzZXRLZXlTdG9yZShrZXlTdG9yZSwga2V5UGFzcywgbnVsbCwgbnVsbCk7CiAgICAgfQotCisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBrZXlzdG9yZSBhbmQgcGFzc3dvcmQKKyAgICAgKgorICAgICAqIEBwYXJhbSBrZXlTdG9yZVN0cmVhbSBLZXlzdG9yZSBjb250ZW50IGlucHV0IHN0cmVhbQorICAgICAqIEBwYXJhbSBrZXlQYXNzIEtleXN0b3JlIHBhc3N3b3JkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0S2V5U3RvcmUoSW5wdXRTdHJlYW0ga2V5U3RvcmVTdHJlYW0sIFN0cmluZyBrZXlQYXNzKSB7CisgICAgICBzZXRLZXlTdG9yZShrZXlTdG9yZVN0cmVhbSwga2V5UGFzcywgbnVsbCwgbnVsbCk7CisgICAgfQorICAgIAogICAgIC8qKgogICAgICAqIFNldCB0aGUgdHJ1c3RzdG9yZSwgcGFzc3dvcmQsIGNlcnRpZmljYXRlIHR5cGUgYW5kIHRoZSBzdG9yZSB0eXBlCiAgICAgICoKQEAgLTMzNCw2ICszOTUsMTkgQEAKICAgICAgIH0KICAgICAgIGlzVHJ1c3RTdG9yZVNldCA9IHRydWU7CiAgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgdHJ1c3RzdG9yZSwgcGFzc3dvcmQsIGNlcnRpZmljYXRlIHR5cGUgYW5kIHRoZSBzdG9yZSB0eXBlCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHJ1c3RTdG9yZVN0cmVhbSBUcnVzdHN0b3JlIGNvbnRlbnQgaW5wdXQgc3RyZWFtCisgICAgICogQHBhcmFtIHRydXN0UGFzcyBUcnVzdHN0b3JlIHBhc3N3b3JkCisgICAgICogQHBhcmFtIHRydXN0TWFuYWdlclR5cGUgVGhlIGRlZmF1bHQgaXMgWDUwOQorICAgICAqIEBwYXJhbSB0cnVzdFN0b3JlVHlwZSBUaGUgZGVmYXVsdCBpcyBKS1MKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUcnVzdFN0b3JlKElucHV0U3RyZWFtIHRydXN0U3RvcmVTdHJlYW0sIFN0cmluZyB0cnVzdFBhc3MsIFN0cmluZyB0cnVzdE1hbmFnZXJUeXBlLCBTdHJpbmcgdHJ1c3RTdG9yZVR5cGUpIHsKKyAgICAgIHRoaXMudHJ1c3RTdG9yZVN0cmVhbSA9IHRydXN0U3RvcmVTdHJlYW07CisgICAgICBzZXRUcnVzdFN0b3JlKCIiLCB0cnVzdFBhc3MsIHRydXN0TWFuYWdlclR5cGUsIHRydXN0U3RvcmVUeXBlKTsKKyAgICB9CiAKICAgICAvKioKICAgICAgKiBTZXQgdGhlIHRydXN0c3RvcmUgYW5kIHBhc3N3b3JkCkBAIC0zNDQsNiArNDE4LDE2IEBACiAgICAgcHVibGljIHZvaWQgc2V0VHJ1c3RTdG9yZShTdHJpbmcgdHJ1c3RTdG9yZSwgU3RyaW5nIHRydXN0UGFzcykgewogICAgICAgc2V0VHJ1c3RTdG9yZSh0cnVzdFN0b3JlLCB0cnVzdFBhc3MsIG51bGwsIG51bGwpOwogICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHRydXN0c3RvcmUgYW5kIHBhc3N3b3JkCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHJ1c3RTdG9yZVN0cmVhbSBUcnVzdHN0b3JlIGNvbnRlbnQgaW5wdXQgc3RyZWFtCisgICAgICogQHBhcmFtIHRydXN0UGFzcyBUcnVzdHN0b3JlIHBhc3N3b3JkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VHJ1c3RTdG9yZShJbnB1dFN0cmVhbSB0cnVzdFN0b3JlU3RyZWFtLCBTdHJpbmcgdHJ1c3RQYXNzKSB7CisgICAgICBzZXRUcnVzdFN0b3JlKHRydXN0U3RvcmVTdHJlYW0sIHRydXN0UGFzcywgbnVsbCwgbnVsbCk7CisgICAgfQogCiAgICAgLyoqCiAgICAgICogU2V0IGlmIGNsaWVudCBhdXRoZW50aWNhdGlvbiBpcyByZXF1aXJlZApAQCAtMzUyLDYgKzQzNiw2IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcmVxdWlyZUNsaWVudEF1dGgoYm9vbGVhbiBjbGllbnRBdXRoKSB7CiAgICAgICB0aGlzLmNsaWVudEF1dGggPSBjbGllbnRBdXRoOwotICAgIH0KLSAgfQorCQl9CisJfQogfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2FzbENsaWVudFRyYW5zcG9ydC5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2FzbENsaWVudFRyYW5zcG9ydC5qYXZhCmluZGV4IDVhYTBjY2QuLjRiMWNhMGEgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNhc2xDbGllbnRUcmFuc3BvcnQuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTYXNsQ2xpZW50VHJhbnNwb3J0LmphdmEKQEAgLTE5LDYgKzE5LDcgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CiAKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIAogaW1wb3J0IGphdmF4LnNlY3VyaXR5LmF1dGguY2FsbGJhY2suQ2FsbGJhY2tIYW5kbGVyOwpAQCAtOTYsNyArOTcsNyBAQAogICAgIExPR0dFUi5kZWJ1ZygiU2VuZGluZyBtZWNoYW5pc20gbmFtZSB7fSBhbmQgaW5pdGlhbCByZXNwb25zZSBvZiBsZW5ndGgge30iLCBtZWNoYW5pc20sCiAgICAgICAgIGluaXRpYWxSZXNwb25zZS5sZW5ndGgpOwogCi0gICAgYnl0ZVtdIG1lY2hhbmlzbUJ5dGVzID0gbWVjaGFuaXNtLmdldEJ5dGVzKCk7CisgICAgYnl0ZVtdIG1lY2hhbmlzbUJ5dGVzID0gbWVjaGFuaXNtLmdldEJ5dGVzKFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpOwogICAgIHNlbmRTYXNsTWVzc2FnZShOZWdvdGlhdGlvblN0YXR1cy5TVEFSVCwKICAgICAgICAgICAgICAgICAgICAgbWVjaGFuaXNtQnl0ZXMpOwogICAgIC8vIFNlbmQgaW5pdGlhbCByZXNwb25zZQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2FzbFNlcnZlclRyYW5zcG9ydC5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2FzbFNlcnZlclRyYW5zcG9ydC5qYXZhCmluZGV4IGM4ODNjOGYuLjM5YjgxY2EgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNhc2xTZXJ2ZXJUcmFuc3BvcnQuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTYXNsU2VydmVyVHJhbnNwb3J0LmphdmEKQEAgLTIwLDYgKzIwLDcgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OwogCiBpbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKQEAgLTEzMCw3ICsxMzEsNyBAQAogICAgIH0KIAogICAgIC8vIEdldCB0aGUgbWVjaGFuaXNtIG5hbWUuCi0gICAgU3RyaW5nIG1lY2hhbmlzbU5hbWUgPSBuZXcgU3RyaW5nKG1lc3NhZ2UucGF5bG9hZCk7CisgICAgU3RyaW5nIG1lY2hhbmlzbU5hbWUgPSBuZXcgU3RyaW5nKG1lc3NhZ2UucGF5bG9hZCwgU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CiAgICAgVFNhc2xTZXJ2ZXJEZWZpbml0aW9uIHNlcnZlckRlZmluaXRpb24gPSBzZXJ2ZXJEZWZpbml0aW9uTWFwLmdldChtZWNoYW5pc21OYW1lKTsKICAgICBMT0dHRVIuZGVidWcoIlJlY2VpdmVkIG1lY2hhbmlzbSBuYW1lICd7fSciLCBtZWNoYW5pc21OYW1lKTsKIApAQCAtMTQ1LDcgKzE0Niw3IEBACiAKICAgLyoqCiAgICAqIDxjb2RlPlRUcmFuc3BvcnRGYWN0b3J5PC9jb2RlPiB0byBjcmVhdGUKLSAgICogPGNvZGU+VFNhc2xTZXJ2ZXJUcmFuc3BvcnRzPGMvb2RlPi4gRW5zdXJlcyB0aGF0IGEgZ2l2ZW4KKyAgICogPGNvZGU+VFNhc2xTZXJ2ZXJUcmFuc3BvcnRzPC9jb2RlPi4gRW5zdXJlcyB0aGF0IGEgZ2l2ZW4KICAgICogdW5kZXJseWluZyA8Y29kZT5UVHJhbnNwb3J0PC9jb2RlPiBpbnN0YW5jZSByZWNlaXZlcyB0aGUgc2FtZQogICAgKiA8Y29kZT5UU2FzbFNlcnZlclRyYW5zcG9ydDwvY29kZT4uIFRoaXMgaXMga2luZCBvZiBhbiBhd2Z1bCBoYWNrIHRvIHdvcmsKICAgICogYXJvdW5kIHRoZSBmYWN0IHRoYXQgVGhyaWZ0IGlzIGRlc2lnbmVkIGFzc3VtaW5nIHRoYXQKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNhc2xUcmFuc3BvcnQuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNhc2xUcmFuc3BvcnQuamF2YQppbmRleCA3OTM4OTE2Li5iZWQzYjM5IDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTYXNsVHJhbnNwb3J0LmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2FzbFRyYW5zcG9ydC5qYXZhCkBAIC0xOSw3ICsxOSw3IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OwogCi1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogCkBAIC0zNSw3ICszNSw3IEBACiAKIC8qKgogICogQSBzdXBlcmNsYXNzIGZvciBTQVNMIGNsaWVudC9zZXJ2ZXIgdGhyaWZ0IHRyYW5zcG9ydHMuIEEgc3ViY2xhc3MgbmVlZCBvbmx5Ci0gKiBpbXBsZW1lbnQgdGhlIDxjb2RlPm9wZW48L29wZW4+IG1ldGhvZC4KKyAqIGltcGxlbWVudCB0aGUgPGNvZGU+b3BlbjwvY29kZT4gbWV0aG9kLgogICovCiBhYnN0cmFjdCBjbGFzcyBUU2FzbFRyYW5zcG9ydCBleHRlbmRzIFRUcmFuc3BvcnQgewogCkBAIC0xNTgsOSArMTU4LDkgQEAKICAgICBtZXNzYWdlSGVhZGVyWzBdID0gc3RhdHVzLmdldFZhbHVlKCk7CiAgICAgRW5jb2RpbmdVdGlscy5lbmNvZGVCaWdFbmRpYW4ocGF5bG9hZC5sZW5ndGgsIG1lc3NhZ2VIZWFkZXIsIFNUQVRVU19CWVRFUyk7CiAKLSAgICBpZiAoTE9HR0VSLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICBMT0dHRVIuZGVidWcoZ2V0Um9sZSgpICsgIjogV3JpdGluZyBtZXNzYWdlIHdpdGggc3RhdHVzIHt9IGFuZCBwYXlsb2FkIGxlbmd0aCB7fSIsCi0gICAgICAgICAgICAgICAgICAgc3RhdHVzLCBwYXlsb2FkLmxlbmd0aCk7CisgICAgTE9HR0VSLmRlYnVnKCJ7fTogV3JpdGluZyBtZXNzYWdlIHdpdGggc3RhdHVzIHt9IGFuZCBwYXlsb2FkIGxlbmd0aCB7fSIsCisgICAgICAgIGdldFJvbGUoKSwgc3RhdHVzLCBwYXlsb2FkLmxlbmd0aCk7CisKICAgICB1bmRlcmx5aW5nVHJhbnNwb3J0LndyaXRlKG1lc3NhZ2VIZWFkZXIpOwogICAgIHVuZGVybHlpbmdUcmFuc3BvcnQud3JpdGUocGF5bG9hZCk7CiAgICAgdW5kZXJseWluZ1RyYW5zcG9ydC5mbHVzaCgpOwpAQCAtMTk0LDE3ICsxOTQsMTEgQEAKICAgICB1bmRlcmx5aW5nVHJhbnNwb3J0LnJlYWRBbGwocGF5bG9hZCwgMCwgcGF5bG9hZC5sZW5ndGgpOwogCiAgICAgaWYgKHN0YXR1cyA9PSBOZWdvdGlhdGlvblN0YXR1cy5CQUQgfHwgc3RhdHVzID09IE5lZ290aWF0aW9uU3RhdHVzLkVSUk9SKSB7Ci0gICAgICB0cnkgewotICAgICAgICBTdHJpbmcgcmVtb3RlTWVzc2FnZSA9IG5ldyBTdHJpbmcocGF5bG9hZCwgIlVURi04Iik7Ci0gICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJQZWVyIGluZGljYXRlZCBmYWlsdXJlOiAiICsgcmVtb3RlTWVzc2FnZSk7Ci0gICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oZSk7Ci0gICAgICB9CisgICAgICBTdHJpbmcgcmVtb3RlTWVzc2FnZSA9IG5ldyBTdHJpbmcocGF5bG9hZCwgU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiUGVlciBpbmRpY2F0ZWQgZmFpbHVyZTogIiArIHJlbW90ZU1lc3NhZ2UpOwogICAgIH0KLQotICAgIGlmIChMT0dHRVIuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgIExPR0dFUi5kZWJ1ZyhnZXRSb2xlKCkgKyAiOiBSZWNlaXZlZCBtZXNzYWdlIHdpdGggc3RhdHVzIHt9IGFuZCBwYXlsb2FkIGxlbmd0aCB7fSIsCi0gICAgICAgICAgICAgICAgICAgc3RhdHVzLCBwYXlsb2FkLmxlbmd0aCk7CisgICAgTE9HR0VSLmRlYnVnKCJ7fTogUmVjZWl2ZWQgbWVzc2FnZSB3aXRoIHN0YXR1cyB7fSBhbmQgcGF5bG9hZCBsZW5ndGgge30iLAorICAgICAgICBnZXRSb2xlKCksIHN0YXR1cywgcGF5bG9hZC5sZW5ndGgpOwogICAgIHJldHVybiBuZXcgU2FzbFJlc3BvbnNlKHN0YXR1cywgcGF5bG9hZCk7CiAgIH0KIApAQCAtMjI0LDcgKzIxOCw3IEBACiAgICAqLwogICBwcm90ZWN0ZWQgVFRyYW5zcG9ydEV4Y2VwdGlvbiBzZW5kQW5kVGhyb3dNZXNzYWdlKE5lZ290aWF0aW9uU3RhdHVzIHN0YXR1cywgU3RyaW5nIG1lc3NhZ2UpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKICAgICB0cnkgewotICAgICAgc2VuZFNhc2xNZXNzYWdlKHN0YXR1cywgbWVzc2FnZS5nZXRCeXRlcygpKTsKKyAgICAgIHNlbmRTYXNsTWVzc2FnZShzdGF0dXMsIG1lc3NhZ2UuZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCkpOwogICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICBMT0dHRVIud2FybigiQ291bGQgbm90IHNlbmQgZmFpbHVyZSByZXNwb25zZSIsIGUpOwogICAgICAgbWVzc2FnZSArPSAiXG5BbHNvLCBjb3VsZCBub3Qgc2VuZCByZXNwb25zZTogIiArIGUudG9TdHJpbmcoKTsKQEAgLTI4Nyw3ICsyODEsNyBAQAogICAgICAgICBpZiAobWVzc2FnZS5zdGF0dXMgPT0gTmVnb3RpYXRpb25TdGF0dXMuQ09NUExFVEUgJiYKICAgICAgICAgICAgIGdldFJvbGUoKSA9PSBTYXNsUm9sZS5DTElFTlQpIHsKICAgICAgICAgICBMT0dHRVIuZGVidWcoInt9OiBBbGwgZG9uZSEiLCBnZXRSb2xlKCkpOwotICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAKICAgICAgICAgc2VuZFNhc2xNZXNzYWdlKHNhc2wuaXNDb21wbGV0ZSgpID8gTmVnb3RpYXRpb25TdGF0dXMuQ09NUExFVEUgOiBOZWdvdGlhdGlvblN0YXR1cy5PSywKQEAgLTI5NSw4ICsyODksNiBAQAogICAgICAgfQogICAgICAgTE9HR0VSLmRlYnVnKCJ7fTogTWFpbiBuZWdvdGlhdGlvbiBsb29wIGNvbXBsZXRlIiwgZ2V0Um9sZSgpKTsKIAotICAgICAgYXNzZXJ0IHNhc2wuaXNDb21wbGV0ZSgpOwotCiAgICAgICAvLyBJZiB3ZSdyZSB0aGUgY2xpZW50LCBhbmQgd2UncmUgY29tcGxldGUsIGJ1dCB0aGUgc2VydmVyIGlzbid0CiAgICAgICAvLyBjb21wbGV0ZSB5ZXQsIHdlIG5lZWQgdG8gd2FpdCBmb3IgaXRzIHJlc3BvbnNlLiBUaGlzIHdpbGwgb2NjdXIKICAgICAgIC8vIHdpdGggQU5PTllNT1VTIGF1dGgsIGZvciBleGFtcGxlLCB3aGVyZSB3ZSBzZW5kIGFuIGluaXRpYWwgcmVzcG9uc2UKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0LmphdmEKaW5kZXggODM0NWQ0NC4uNzlmN2I3ZiAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0LmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0LmphdmEKQEAgLTEwNSwxMyArMTA1LDEzIEBACiAgICAgICAvLyBCaW5kIHRvIGxpc3RlbmluZyBwb3J0CiAgICAgICBzZXJ2ZXJTb2NrZXRfLmJpbmQoYXJncy5iaW5kQWRkciwgYXJncy5iYWNrbG9nKTsKICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLSAgICAgIHNlcnZlclNvY2tldF8gPSBudWxsOwotICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkNvdWxkIG5vdCBjcmVhdGUgU2VydmVyU29ja2V0IG9uIGFkZHJlc3MgIiArIGFyZ3MuYmluZEFkZHIudG9TdHJpbmcoKSArICIuIik7CisgICAgICBjbG9zZSgpOworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkNvdWxkIG5vdCBjcmVhdGUgU2VydmVyU29ja2V0IG9uIGFkZHJlc3MgIiArIGFyZ3MuYmluZEFkZHIudG9TdHJpbmcoKSArICIuIiwgaW9lKTsKICAgICB9CiAgIH0KIAogICBwdWJsaWMgdm9pZCBsaXN0ZW4oKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7Ci0gICAgLy8gTWFrZSBzdXJlIG5vdCB0byBibG9jayBvbiBhY2NlcHQKKyAgICAvLyBNYWtlIHN1cmUgdG8gYmxvY2sgb24gYWNjZXB0CiAgICAgaWYgKHNlcnZlclNvY2tldF8gIT0gbnVsbCkgewogICAgICAgdHJ5IHsKICAgICAgICAgc2VydmVyU29ja2V0Xy5zZXRTb1RpbWVvdXQoMCk7CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNvY2tldC5qYXZhCmluZGV4IGMzNDBkZDIuLmIyMGIzMmIgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNvY2tldC5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNvY2tldC5qYXZhCkBAIC00MCwyMiArNDAsMjcgQEAKICAgLyoqCiAgICAqIFdyYXBwZWQgU29ja2V0IG9iamVjdAogICAgKi8KLSAgcHJpdmF0ZSBTb2NrZXQgc29ja2V0XyA9IG51bGw7CisgIHByaXZhdGUgU29ja2V0IHNvY2tldF87CiAKICAgLyoqCiAgICAqIFJlbW90ZSBob3N0CiAgICAqLwotICBwcml2YXRlIFN0cmluZyBob3N0XyAgPSBudWxsOworICBwcml2YXRlIFN0cmluZyBob3N0XzsKIAogICAvKioKICAgICogUmVtb3RlIHBvcnQKICAgICovCi0gIHByaXZhdGUgaW50IHBvcnRfID0gMDsKKyAgcHJpdmF0ZSBpbnQgcG9ydF87CiAKICAgLyoqCi0gICAqIFNvY2tldCB0aW1lb3V0CisgICAqIFNvY2tldCB0aW1lb3V0IC0gcmVhZCB0aW1lb3V0IG9uIHRoZSBzb2NrZXQKICAgICovCi0gIHByaXZhdGUgaW50IHRpbWVvdXRfID0gMDsKKyAgcHJpdmF0ZSBpbnQgc29ja2V0VGltZW91dF87CisKKyAgLyoqCisgICAqIENvbm5lY3Rpb24gdGltZW91dAorICAgKi8KKyAgcHJpdmF0ZSBpbnQgY29ubmVjdFRpbWVvdXRfOwogCiAgIC8qKgogICAgKiBDb25zdHJ1Y3RvciB0aGF0IHRha2VzIGFuIGFscmVhZHkgY3JlYXRlZCBzb2NrZXQuCkBAIC03NSw4ICs4MCw4IEBACiAKICAgICBpZiAoaXNPcGVuKCkpIHsKICAgICAgIHRyeSB7Ci0gICAgICAgIGlucHV0U3RyZWFtXyA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKHNvY2tldF8uZ2V0SW5wdXRTdHJlYW0oKSwgMTAyNCk7Ci0gICAgICAgIG91dHB1dFN0cmVhbV8gPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0oc29ja2V0Xy5nZXRPdXRwdXRTdHJlYW0oKSwgMTAyNCk7CisgICAgICAgIGlucHV0U3RyZWFtXyA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKHNvY2tldF8uZ2V0SW5wdXRTdHJlYW0oKSk7CisgICAgICAgIG91dHB1dFN0cmVhbV8gPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0oc29ja2V0Xy5nZXRPdXRwdXRTdHJlYW0oKSk7CiAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb3gpIHsKICAgICAgICAgY2xvc2UoKTsKICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwgaW94KTsKQEAgLTEwMSwxMiArMTA2LDI3IEBACiAgICAqCiAgICAqIEBwYXJhbSBob3N0ICAgIFJlbW90ZSBob3N0CiAgICAqIEBwYXJhbSBwb3J0ICAgIFJlbW90ZSBwb3J0Ci0gICAqIEBwYXJhbSB0aW1lb3V0IFNvY2tldCB0aW1lb3V0CisgICAqIEBwYXJhbSB0aW1lb3V0IFNvY2tldCB0aW1lb3V0IGFuZCBjb25uZWN0aW9uIHRpbWVvdXQKICAgICovCiAgIHB1YmxpYyBUU29ja2V0KFN0cmluZyBob3N0LCBpbnQgcG9ydCwgaW50IHRpbWVvdXQpIHsKKyAgICB0aGlzKGhvc3QsIHBvcnQsIHRpbWVvdXQsIHRpbWVvdXQpOworICB9CisKKyAgLyoqCisgICAqIENyZWF0ZXMgYSBuZXcgdW5jb25uZWN0ZWQgc29ja2V0IHRoYXQgd2lsbCBjb25uZWN0IHRvIHRoZSBnaXZlbiBob3N0CisgICAqIG9uIHRoZSBnaXZlbiBwb3J0LCB3aXRoIGEgc3BlY2lmaWMgY29ubmVjdGlvbiB0aW1lb3V0IGFuZCBhCisgICAqIHNwZWNpZmljIHNvY2tldCB0aW1lb3V0LgorICAgKgorICAgKiBAcGFyYW0gaG9zdCAgICAgICAgICAgIFJlbW90ZSBob3N0CisgICAqIEBwYXJhbSBwb3J0ICAgICAgICAgICAgUmVtb3RlIHBvcnQKKyAgICogQHBhcmFtIHNvY2tldFRpbWVvdXQgICBTb2NrZXQgdGltZW91dAorICAgKiBAcGFyYW0gY29ubmVjdFRpbWVvdXQgIENvbm5lY3Rpb24gdGltZW91dAorICAgKi8KKyAgcHVibGljIFRTb2NrZXQoU3RyaW5nIGhvc3QsIGludCBwb3J0LCBpbnQgc29ja2V0VGltZW91dCwgaW50IGNvbm5lY3RUaW1lb3V0KSB7CiAgICAgaG9zdF8gPSBob3N0OwogICAgIHBvcnRfID0gcG9ydDsKLSAgICB0aW1lb3V0XyA9IHRpbWVvdXQ7CisgICAgc29ja2V0VGltZW91dF8gPSBzb2NrZXRUaW1lb3V0OworICAgIGNvbm5lY3RUaW1lb3V0XyA9IGNvbm5lY3RUaW1lb3V0OwogICAgIGluaXRTb2NrZXQoKTsKICAgfQogCkBAIC0xMTksMTkgKzEzOSwzOCBAQAogICAgICAgc29ja2V0Xy5zZXRTb0xpbmdlcihmYWxzZSwgMCk7CiAgICAgICBzb2NrZXRfLnNldFRjcE5vRGVsYXkodHJ1ZSk7CiAgICAgICBzb2NrZXRfLnNldEtlZXBBbGl2ZSh0cnVlKTsKLSAgICAgIHNvY2tldF8uc2V0U29UaW1lb3V0KHRpbWVvdXRfKTsKKyAgICAgIHNvY2tldF8uc2V0U29UaW1lb3V0KHNvY2tldFRpbWVvdXRfKTsKICAgICB9IGNhdGNoIChTb2NrZXRFeGNlcHRpb24gc3gpIHsKICAgICAgIExPR0dFUi5lcnJvcigiQ291bGQgbm90IGNvbmZpZ3VyZSBzb2NrZXQuIiwgc3gpOwogICAgIH0KICAgfQogCiAgIC8qKgorICAgKiBTZXRzIHRoZSBzb2NrZXQgdGltZW91dCBhbmQgY29ubmVjdGlvbiB0aW1lb3V0LgorICAgKgorICAgKiBAcGFyYW0gdGltZW91dCBNaWxsaXNlY29uZHMgdGltZW91dAorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0VGltZW91dChpbnQgdGltZW91dCkgeworICAgIHRoaXMuc2V0Q29ubmVjdFRpbWVvdXQodGltZW91dCk7CisgICAgdGhpcy5zZXRTb2NrZXRUaW1lb3V0KHRpbWVvdXQpOworICB9CisKKyAgLyoqCisgICAqIFNldHMgdGhlIHRpbWUgYWZ0ZXIgd2hpY2ggdGhlIGNvbm5lY3Rpb24gYXR0ZW1wdCB3aWxsIHRpbWUgb3V0CisgICAqCisgICAqIEBwYXJhbSB0aW1lb3V0IE1pbGxpc2Vjb25kcyB0aW1lb3V0CisgICAqLworICBwdWJsaWMgdm9pZCBzZXRDb25uZWN0VGltZW91dChpbnQgdGltZW91dCkgeworICAgIGNvbm5lY3RUaW1lb3V0XyA9IHRpbWVvdXQ7CisgIH0KKworICAvKioKICAgICogU2V0cyB0aGUgc29ja2V0IHRpbWVvdXQKICAgICoKICAgICogQHBhcmFtIHRpbWVvdXQgTWlsbGlzZWNvbmRzIHRpbWVvdXQKICAgICovCi0gIHB1YmxpYyB2b2lkIHNldFRpbWVvdXQoaW50IHRpbWVvdXQpIHsKLSAgICB0aW1lb3V0XyA9IHRpbWVvdXQ7CisgIHB1YmxpYyB2b2lkIHNldFNvY2tldFRpbWVvdXQoaW50IHRpbWVvdXQpIHsKKyAgICBzb2NrZXRUaW1lb3V0XyA9IHRpbWVvdXQ7CiAgICAgdHJ5IHsKICAgICAgIHNvY2tldF8uc2V0U29UaW1lb3V0KHRpbWVvdXQpOwogICAgIH0gY2F0Y2ggKFNvY2tldEV4Y2VwdGlvbiBzeCkgewpAQCAtMTY3LDExICsyMDYsMTEgQEAKICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uQUxSRUFEWV9PUEVOLCAiU29ja2V0IGFscmVhZHkgY29ubmVjdGVkLiIpOwogICAgIH0KIAotICAgIGlmIChob3N0Xy5sZW5ndGgoKSA9PSAwKSB7CisgICAgaWYgKGhvc3RfID09IG51bGwgfHwgaG9zdF8ubGVuZ3RoKCkgPT0gMCkgewogICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwgIkNhbm5vdCBvcGVuIG51bGwgaG9zdC4iKTsKICAgICB9Ci0gICAgaWYgKHBvcnRfIDw9IDApIHsKLSAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uTk9UX09QRU4sICJDYW5ub3Qgb3BlbiB3aXRob3V0IHBvcnQuIik7CisgICAgaWYgKHBvcnRfIDw9IDAgfHwgcG9ydF8gPiA2NTUzNSkgeworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwgIkludmFsaWQgcG9ydCAiICsgcG9ydF8pOwogICAgIH0KIAogICAgIGlmIChzb2NrZXRfID09IG51bGwpIHsKQEAgLTE3OSw5ICsyMTgsOSBAQAogICAgIH0KIAogICAgIHRyeSB7Ci0gICAgICBzb2NrZXRfLmNvbm5lY3QobmV3IEluZXRTb2NrZXRBZGRyZXNzKGhvc3RfLCBwb3J0XyksIHRpbWVvdXRfKTsKLSAgICAgIGlucHV0U3RyZWFtXyA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKHNvY2tldF8uZ2V0SW5wdXRTdHJlYW0oKSwgMTAyNCk7Ci0gICAgICBvdXRwdXRTdHJlYW1fID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKHNvY2tldF8uZ2V0T3V0cHV0U3RyZWFtKCksIDEwMjQpOworICAgICAgc29ja2V0Xy5jb25uZWN0KG5ldyBJbmV0U29ja2V0QWRkcmVzcyhob3N0XywgcG9ydF8pLCBjb25uZWN0VGltZW91dF8pOworICAgICAgaW5wdXRTdHJlYW1fID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oc29ja2V0Xy5nZXRJbnB1dFN0cmVhbSgpKTsKKyAgICAgIG91dHB1dFN0cmVhbV8gPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0oc29ja2V0Xy5nZXRPdXRwdXRTdHJlYW0oKSk7CiAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW94KSB7CiAgICAgICBjbG9zZSgpOwogICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwgaW94KTsKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmphdmEKaW5kZXggZDA4ZjNiMC4uYjg4NmJjMiAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmphdmEKQEAgLTM0LDYgKzM0LDcgQEAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUxSRUFEWV9PUEVOID0gMjsKICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVElNRURfT1VUID0gMzsKICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5EX09GX0ZJTEUgPSA0OworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT1JSVVBURURfREFUQSA9IDU7CiAKICAgcHJvdGVjdGVkIGludCB0eXBlXyA9IFVOS05PV047CiAKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFpsaWJUcmFuc3BvcnQuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFpsaWJUcmFuc3BvcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzU1YWE1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UWmxpYlRyYW5zcG9ydC5qYXZhCkBAIC0wLDAgKzEsMTQ4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLkRlZmxhdGVyOworaW1wb3J0IGphdmEudXRpbC56aXAuRGVmbGF0ZXJPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLnppcC5JbmZsYXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLkluZmxhdGVySW5wdXRTdHJlYW07CisKKy8qKgorICogVFpsaWJUcmFuc3BvcnQgZGVmbGF0ZXMgb24gd3JpdGUgYW5kIGluZmxhdGVzIG9uIHJlYWQuCisgKi8KK3B1YmxpYyBjbGFzcyBUWmxpYlRyYW5zcG9ydCBleHRlbmRzIFRJT1N0cmVhbVRyYW5zcG9ydCB7CisKKyAgICBwcml2YXRlIFRUcmFuc3BvcnQgdHJhbnNwb3J0XyA9IG51bGw7CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3RvcnkgZXh0ZW5kcyBUVHJhbnNwb3J0RmFjdG9yeSB7CisgICAgICAgIHB1YmxpYyBGYWN0b3J5KCkgeworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBUVHJhbnNwb3J0IGdldFRyYW5zcG9ydChUVHJhbnNwb3J0IGJhc2UpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVFpsaWJUcmFuc3BvcnQoYmFzZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IFRabGliVHJhbnNwb3J0IGluc3RhbmNlLgorICAgICAqIEBwYXJhbSAgdHJhbnNwb3J0IHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCB0byByZWFkIGZyb20gYW5kIHdyaXRlIHRvCisgICAgICovCisgICAgcHVibGljIFRabGliVHJhbnNwb3J0KFRUcmFuc3BvcnQgdHJhbnNwb3J0KSB7CisgICAgICAgIHRoaXModHJhbnNwb3J0LCBEZWZsYXRlci5CRVNUX0NPTVBSRVNTSU9OKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IFRabGliVHJhbnNwb3J0IGluc3RhbmNlLgorICAgICAqIEBwYXJhbSAgdHJhbnNwb3J0IHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCB0byByZWFkIGZyb20gYW5kIHdyaXRlIHRvCisgICAgICogQHBhcmFtICBjb21wcmVzc2lvbkxldmVsIDAgZm9yIG5vIGNvbXByZXNzaW9uLCA5IGZvciBtYXhpbXVtIGNvbXByZXNzaW9uCisgICAgICovCisgICAgcHVibGljIFRabGliVHJhbnNwb3J0KFRUcmFuc3BvcnQgdHJhbnNwb3J0LCBpbnQgY29tcHJlc3Npb25MZXZlbCkgeworICAgICAgICB0cmFuc3BvcnRfID0gdHJhbnNwb3J0OworICAgICAgICBpbnB1dFN0cmVhbV8gPSBuZXcgSW5mbGF0ZXJJbnB1dFN0cmVhbShuZXcgVFRyYW5zcG9ydElucHV0U3RyZWFtKHRyYW5zcG9ydF8pLCBuZXcgSW5mbGF0ZXIoKSk7CisgICAgICAgIG91dHB1dFN0cmVhbV8gPSBuZXcgRGVmbGF0ZXJPdXRwdXRTdHJlYW0obmV3IFRUcmFuc3BvcnRPdXRwdXRTdHJlYW0odHJhbnNwb3J0XyksIG5ldyBEZWZsYXRlcihjb21wcmVzc2lvbkxldmVsLCBmYWxzZSksIHRydWUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzT3BlbigpIHsKKyAgICAgICAgcmV0dXJuIHRyYW5zcG9ydF8uaXNPcGVuKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb3BlbigpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICAgICAgdHJhbnNwb3J0Xy5vcGVuKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7CisgICAgICAgIHN1cGVyLmNsb3NlKCk7CisgICAgICAgIGlmICh0cmFuc3BvcnRfLmlzT3BlbigpKSB7CisgICAgICAgICAgICB0cmFuc3BvcnRfLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2NsYXNzIFRUcmFuc3BvcnRJbnB1dFN0cmVhbSBleHRlbmRzIElucHV0U3RyZWFtIHsKKworICAgIHByaXZhdGUgVFRyYW5zcG9ydCB0cmFuc3BvcnQgPSBudWxsOworCisgICAgcHVibGljIFRUcmFuc3BvcnRJbnB1dFN0cmVhbShUVHJhbnNwb3J0IHRyYW5zcG9ydCkgeworICAgICAgICB0aGlzLnRyYW5zcG9ydCA9IHRyYW5zcG9ydDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzFdOworICAgICAgICAgICAgdHJhbnNwb3J0LnJlYWQoYnVmLCAwLCAxKTsKKyAgICAgICAgICAgIHJldHVybiBidWZbMF07CisgICAgICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCByZWFkKGJ5dGUgYltdLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIHRyYW5zcG9ydC5yZWFkKGIsIG9mZiwgbGVuKTsKKyAgICAgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2NsYXNzIFRUcmFuc3BvcnRPdXRwdXRTdHJlYW0gZXh0ZW5kcyBPdXRwdXRTdHJlYW0geworCisgICAgcHJpdmF0ZSBUVHJhbnNwb3J0IHRyYW5zcG9ydCA9IG51bGw7CisKKyAgICBwdWJsaWMgVFRyYW5zcG9ydE91dHB1dFN0cmVhbShUVHJhbnNwb3J0IHRyYW5zcG9ydCkgeworICAgICAgICB0aGlzLnRyYW5zcG9ydCA9IHRyYW5zcG9ydDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB3cml0ZShmaW5hbCBpbnQgYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRyYW5zcG9ydC53cml0ZShuZXcgYnl0ZVtdeyhieXRlKSBifSk7CisgICAgICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZSBiW10sIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0cmFuc3BvcnQud3JpdGUoYiwgb2ZmLCBsZW4pOworICAgICAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGZsdXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRyYW5zcG9ydC5mbHVzaCgpOworICAgICAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9sb2c0ai5wcm9wZXJ0aWVzIGIvbGliL2phdmEvdGVzdC9sb2c0ai5wcm9wZXJ0aWVzCmluZGV4IDg3OGIyZmMuLmFiOWJlYmEgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3Rlc3QvbG9nNGoucHJvcGVydGllcworKysgYi9saWIvamF2YS90ZXN0L2xvZzRqLnByb3BlcnRpZXMKQEAgLTEsNiArMSw2IEBACiAjIGxvZzRqIGNvbmZpZ3VyYXRpb24gdXNlZCBkdXJpbmcgYnVpbGQgYW5kIHVuaXQgdGVzdHMKIGxvZzRqLnJvb3RMb2dnZXI9ZGVidWcsc3Rkb3V0Ci1sb2c0ai50aHJlc2hob2xkPUFMTAorbG9nNGoudGhyZXNob2xkPUFMTAogbG9nNGouYXBwZW5kZXIuc3Rkb3V0PW9yZy5hcGFjaGUubG9nNGouQ29uc29sZUFwcGVuZGVyCiBsb2c0ai5hcHBlbmRlci5zdGRvdXQubGF5b3V0PW9yZy5hcGFjaGUubG9nNGouUGF0dGVybkxheW91dAogbG9nNGouYXBwZW5kZXIuc3Rkb3V0LmxheW91dC5Db252ZXJzaW9uUGF0dGVybj0lZHtJU084NjAxfSAlLTVwICVjezJ9ICglRjolTSglTCkpIC0gJW0lbgpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9GaXh0dXJlcy5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9GaXh0dXJlcy5qYXZhCmluZGV4IDlmMjgxMjQuLjYxZjQwYTUgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvRml4dHVyZXMuamF2YQorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L0ZpeHR1cmVzLmphdmEKQEAgLTIwLDYgKzIwLDcgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7CiAKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwpAQCAtMjY3LDcgKzI2OCw3IEBACiAgICAgICBvbmVPZkVhY2guc2V0SW50ZWdlcjY0KChsb25nKSA2MDAwICogMTAwMCAqIDEwMDApOwogICAgICAgb25lT2ZFYWNoLnNldERvdWJsZV9wcmVjaXNpb24oTWF0aC5QSSk7CiAgICAgICBvbmVPZkVhY2guc2V0U29tZV9jaGFyYWN0ZXJzKCJKU09OIFRISVMhIFwiXDEiKTsKLSAgICAgIG9uZU9mRWFjaC5zZXRab21nX3VuaWNvZGUobmV3IFN0cmluZyhrVW5pY29kZUJ5dGVzLCAiVVRGLTgiKSk7CisgICAgICBvbmVPZkVhY2guc2V0Wm9tZ191bmljb2RlKG5ldyBTdHJpbmcoa1VuaWNvZGVCeXRlcywgU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCkpOwogICAgICAgb25lT2ZFYWNoLnNldEJhc2U2NChCeXRlQnVmZmVyLndyYXAoImJhc2U2NCIuZ2V0Qnl0ZXMoKSkpOwogICAgICAgLy8gYnl0ZSwgaTE2LCBhbmQgaTY0IGxpc3RzIGFyZSBwb3B1bGF0ZWQgYnkgZGVmYXVsdCBjb25zdHJ1Y3RvcgogCkBAIC0yNzcsNyArMjc4LDcgQEAKICAgICAgIG5lc3RpbmcgPSBuZXcgTmVzdGluZyhib25rLCBvbmVPZkVhY2gpOwogCiAgICAgICBob2x5TW9sZXkgPSBuZXcgSG9seU1vbGV5KCk7Ci0gICAgICBBcnJheUxpc3QgYmlnID0gbmV3IEFycmF5TGlzdDxPbmVPZkVhY2g+KCk7CisgICAgICBMaXN0PE9uZU9mRWFjaD4gYmlnID0gbmV3IEFycmF5TGlzdDxPbmVPZkVhY2g+KCk7CiAgICAgICBiaWcuYWRkKG5ldyBPbmVPZkVhY2gob25lT2ZFYWNoKSk7CiAgICAgICBiaWcuYWRkKG5lc3RpbmcubXlfb29lKTsKICAgICAgIGhvbHlNb2xleS5zZXRCaWcoYmlnKTsKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdERlZXBDb3B5LmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3REZWVwQ29weS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjYWZhZWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3REZWVwQ29weS5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CitpbXBvcnQgdGhyaWZ0LnRlc3QuRGVlcENvcHlCYXI7CitpbXBvcnQgdGhyaWZ0LnRlc3QuRGVlcENvcHlGb287CisKK3B1YmxpYyBjbGFzcyBUZXN0RGVlcENvcHkgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgcHVibGljIHZvaWQgdGVzdERlZXBDb3B5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgZmluYWwgRGVlcENvcHlGb28gZm9vID0gbmV3IERlZXBDb3B5Rm9vKCk7CisKKyAgICBmb28uYWRkVG9MKG5ldyBEZWVwQ29weUJhcigpKTsKKyAgICBmb28uYWRkVG9TKG5ldyBEZWVwQ29weUJhcigpKTsKKyAgICBmb28ucHV0VG9NKCJ0ZXN0IDMiLCBuZXcgRGVlcENvcHlCYXIoKSk7CisKKyAgICBmb28uYWRkVG9MaShuZXcgdGhyaWZ0LnRlc3QuT2JqZWN0KCkpOworICAgIGZvby5hZGRUb1NpKG5ldyB0aHJpZnQudGVzdC5PYmplY3QoKSk7CisgICAgZm9vLnB1dFRvTWkoInRlc3QgMyIsIG5ldyB0aHJpZnQudGVzdC5PYmplY3QoKSk7CisKKyAgICBmb28uc2V0QmFyKG5ldyBEZWVwQ29weUJhcigpKTsKKworICAgIGZpbmFsIERlZXBDb3B5Rm9vIGRlZXBDb3B5Rm9vID0gZm9vLmRlZXBDb3B5KCk7CisKKyAgICBhc3NlcnROb3RTYW1lKGZvby5nZXRCYXIoKSwgZGVlcENvcHlGb28uZ2V0QmFyKCkpOworCisgICAgYXNzZXJ0Tm90U2FtZShmb28uZ2V0TCgpLmdldCgwKSwgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZXBDb3B5Rm9vLmdldEwoKS5nZXQoMCkpOworICAgIGFzc2VydE5vdFNhbWUoZm9vLmdldFMoKS50b0FycmF5KG5ldyBEZWVwQ29weUJhclswXSlbMF0sICBkZWVwQ29weUZvby5nZXRTKCkudG9BcnJheShuZXcgRGVlcENvcHlCYXJbMF0pWzBdKTsKKyAgICBhc3NlcnROb3RTYW1lKGZvby5nZXRNKCkuZ2V0KCJ0ZXN0IDMiKSwgICAgICAgICAgICAgICAgICAgZGVlcENvcHlGb28uZ2V0TSgpLmdldCgidGVzdCAzIikpOworCisgICAgYXNzZXJ0Tm90U2FtZShmb28uZ2V0TGkoKS5nZXQoMCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVlcENvcHlGb28uZ2V0TGkoKS5nZXQoMCkpOworICAgIGFzc2VydE5vdFNhbWUoZm9vLmdldFNpKCkudG9BcnJheShuZXcgdGhyaWZ0LnRlc3QuT2JqZWN0WzBdKVswXSwgIGRlZXBDb3B5Rm9vLmdldFNpKCkudG9BcnJheShuZXcgdGhyaWZ0LnRlc3QuT2JqZWN0WzBdKVswXSk7CisgICAgYXNzZXJ0Tm90U2FtZShmb28uZ2V0TWkoKS5nZXQoInRlc3QgMyIpLCAgICAgICAgICAgICAgICAgICAgICAgICAgZGVlcENvcHlGb28uZ2V0TWkoKS5nZXQoInRlc3QgMyIpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0RW51bUNvbnRhaW5lcnMuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdEVudW1Db250YWluZXJzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjgzMjQ2YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdEVudW1Db250YWluZXJzLmphdmEKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworaW1wb3J0IHRocmlmdC50ZXN0LmVudW1jb250YWluZXJzLkVudW1Db250YWluZXJzVGVzdENvbnN0YW50czsKK2ltcG9ydCB0aHJpZnQudGVzdC5lbnVtY29udGFpbmVycy5Hb2RCZWFuOworaW1wb3J0IHRocmlmdC50ZXN0LmVudW1jb250YWluZXJzLkdyZWVrR29kR29kZGVzczsKKworaW1wb3J0IGphdmEudXRpbC5FbnVtTWFwOworaW1wb3J0IGphdmEudXRpbC5FbnVtU2V0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworCitwdWJsaWMgY2xhc3MgVGVzdEVudW1Db250YWluZXJzIGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHVibGljIHZvaWQgdGVzdEVudW1Db250YWluZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEdvZEJlYW4gYjEgPSBuZXcgR29kQmVhbigpOworICAgICAgICBiMS5hZGRUb0dvZGRlc3MoR3JlZWtHb2RHb2RkZXNzLkhFUkEpOworICAgICAgICBiMS5nZXRHb2RkZXNzKCkuYWRkKEdyZWVrR29kR29kZGVzcy5BUEhST0RJVEUpOworICAgICAgICBiMS5wdXRUb1Bvd2VyKEdyZWVrR29kR29kZGVzcy5aRVVTLCAxMDAwKTsKKyAgICAgICAgYjEuZ2V0UG93ZXIoKS5wdXQoR3JlZWtHb2RHb2RkZXNzLkhFUkEsIDMzMyk7CisgICAgICAgIGIxLnB1dFRvQnlBbGlhcygiTXIuIFoiLCBHcmVla0dvZEdvZGRlc3MuWkVVUyk7CisgICAgICAgIGIxLmFkZFRvSW1hZ2VzKCJCYXRocyBvZiBBcGhyb2RpdGUgMDEuanBlZyIpOworCisgICAgICAgIGZpbmFsIEdvZEJlYW4gYjIgPSBuZXcgR29kQmVhbihiMSk7CisKKyAgICAgICAgZmluYWwgR29kQmVhbiBiMyA9IG5ldyBHb2RCZWFuKCk7CisgICAgICAgIHsKKyAgICAgICAgICAgIGZpbmFsIFRTZXJpYWxpemVyIHNlcmlhbGl6ZXIgPSBuZXcgVFNlcmlhbGl6ZXIoKTsKKyAgICAgICAgICAgIGZpbmFsIFREZXNlcmlhbGl6ZXIgZGVzZXJpYWxpemVyID0gbmV3IFREZXNlcmlhbGl6ZXIoKTsKKworICAgICAgICAgICAgZmluYWwgYnl0ZVtdIGJ5dGVzID0gc2VyaWFsaXplci5zZXJpYWxpemUoYjEpOworICAgICAgICAgICAgZGVzZXJpYWxpemVyLmRlc2VyaWFsaXplKGIzLCBieXRlcyk7CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnRUcnVlKGIxLmdldEdvZGRlc3MoKSAhPSBiMi5nZXRHb2RkZXNzKCkpOworICAgICAgICBhc3NlcnRUcnVlKGIxLmdldFBvd2VyKCkgIT0gYjIuZ2V0UG93ZXIoKSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShiMS5nZXRHb2RkZXNzKCkgIT0gYjMuZ2V0R29kZGVzcygpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShiMS5nZXRQb3dlcigpICE9IGIzLmdldFBvd2VyKCkpOworCisgICAgICAgIGZvciAoR29kQmVhbiBlYWNoIDogbmV3IEdvZEJlYW5bXXtiMSwgYjIsIGIzfSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlYWNoLmdldEdvZGRlc3MoKS5jb250YWlucyhHcmVla0dvZEdvZGRlc3MuSEVSQSkpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoZWFjaC5nZXRHb2RkZXNzKCkuY29udGFpbnMoR3JlZWtHb2RHb2RkZXNzLlBPU0VJRE9OKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGVhY2guZ2V0R29kZGVzcygpIGluc3RhbmNlb2YgRW51bVNldCk7CisKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMTAwMCksIGVhY2guZ2V0UG93ZXIoKS5nZXQoR3JlZWtHb2RHb2RkZXNzLlpFVVMpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMzMzKSwgZWFjaC5nZXRQb3dlcigpLmdldChHcmVla0dvZEdvZGRlc3MuSEVSQSkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlYWNoLmdldFBvd2VyKCkgaW5zdGFuY2VvZiBFbnVtTWFwKTsKKworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlYWNoLmdldEJ5QWxpYXMoKSBpbnN0YW5jZW9mIEhhc2hNYXApOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlYWNoLmdldEltYWdlcygpIGluc3RhbmNlb2YgSGFzaFNldCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW51bUNvbnN0YW50cygpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJsaWdodG5pbmcgYm9sdCIsIEVudW1Db250YWluZXJzVGVzdENvbnN0YW50cy5BVFRSSUJVVEVTLmdldChHcmVla0dvZEdvZGRlc3MuWkVVUykpOworICAgICAgICBhc3NlcnRUcnVlKEVudW1Db250YWluZXJzVGVzdENvbnN0YW50cy5BVFRSSUJVVEVTIGluc3RhbmNlb2YgRW51bU1hcCk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShFbnVtQ29udGFpbmVyc1Rlc3RDb25zdGFudHMuQkVBVVRZLmNvbnRhaW5zKEdyZWVrR29kR29kZGVzcy5BUEhST0RJVEUpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShFbnVtQ29udGFpbmVyc1Rlc3RDb25zdGFudHMuQkVBVVRZIGluc3RhbmNlb2YgRW51bVNldCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0RnVsbENhbWVsLmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RGdWxsQ2FtZWwuamF2YQppbmRleCAxNjgxZmI4Li5mYzk4ODk4IDEwMDY0NAotLS0gYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RGdWxsQ2FtZWwuamF2YQorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RGdWxsQ2FtZWwuamF2YQpAQCAtMjYsOCArMjYsOCBAQAogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRCaW5hcnlQcm90b2NvbDsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZTsKIAotaW1wb3J0IHRocmlmdC50ZXN0Lk9uZU9mRWFjaFpaOwotaW1wb3J0IHRocmlmdC50ZXN0LlVuZGVyc2NvcmVTcnY7CitpbXBvcnQgdGhyaWZ0LnRlc3QuZnVsbGNhbWVsLk9uZU9mRWFjaFpaOworaW1wb3J0IHRocmlmdC50ZXN0LmZ1bGxjYW1lbC5VbmRlcnNjb3JlU3J2OwogCiAvLyBTYW5pdHkgY2hlY2sgZm9yIHRoZSBjb2RlIGdlbmVyYXRlZCBieSAnZnVsbGNhbWVsJy4KIC8vCmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RNdWx0aXBsZXhlZFByb2Nlc3Nvci5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0TXVsdGlwbGV4ZWRQcm9jZXNzb3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTc3NmNhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0TXVsdGlwbGV4ZWRQcm9jZXNzb3IuamF2YQpAQCAtMCwwICsxLDg2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7CisKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTWF0Y2hlcnMuYW55OworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLm1vY2s7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8udmVyaWZ5OworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLndoZW47CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWVzc2FnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWVzc2FnZVR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBUZXN0TXVsdGlwbGV4ZWRQcm9jZXNzb3IgeworICBwcml2YXRlIFRNdWx0aXBsZXhlZFByb2Nlc3NvciBtcDsKKyAgcHJpdmF0ZSBUUHJvdG9jb2wgaXByb3Q7CisgIHByaXZhdGUgVFByb3RvY29sIG9wcm90OworCisgIEBCZWZvcmUKKyAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBtcCA9IG5ldyBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IoKTsKKyAgICBpcHJvdCA9IG1vY2soVFByb3RvY29sLmNsYXNzKTsKKyAgICBvcHJvdCA9IG1vY2soVFByb3RvY29sLmNsYXNzKTsKKyAgfQorCisgIEBUZXN0KGV4cGVjdGVkID0gVEV4Y2VwdGlvbi5jbGFzcykKKyAgcHVibGljIHZvaWQgdGVzdFdyb25nTWVzc2FnZVR5cGUoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgd2hlbiAoaXByb3QucmVhZE1lc3NhZ2VCZWdpbigpKS50aGVuUmV0dXJuKG5ldyBUTWVzc2FnZSgic2VydmljZTpmdW5jIiwgVE1lc3NhZ2VUeXBlLlJFUExZLCA0MikpOworICAgIG1wLnByb2Nlc3MoaXByb3QsIG9wcm90KTsKKyAgfQorCisgIEBUZXN0KGV4cGVjdGVkID0gVEV4Y2VwdGlvbi5jbGFzcykKKyAgcHVibGljIHZvaWQgdGVzdE5vU3VjaFNlcnZpY2UoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgd2hlbihpcHJvdC5yZWFkTWVzc2FnZUJlZ2luKCkpLnRoZW5SZXR1cm4obmV3IFRNZXNzYWdlKCJzZXJ2aWNlOmZ1bmMiLCBUTWVzc2FnZVR5cGUuQ0FMTCwgNDIpKTsKKworICAgIG1wLnByb2Nlc3MoaXByb3QsIG9wcm90KTsKKyAgfQorCisgIHN0YXRpYyBjbGFzcyBTdHViUHJvY2Vzc29yIGltcGxlbWVudHMgVFByb2Nlc3NvciB7CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gcHJvY2VzcyhUUHJvdG9jb2wgaW4sIFRQcm90b2NvbCBvdXQpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgIFRNZXNzYWdlIG1zZyA9IGluLnJlYWRNZXNzYWdlQmVnaW4oKTsKKyAgICAgIGlmICghImZ1bmMiLmVxdWFscyhtc2cubmFtZSkgfHwgbXNnLnR5cGUhPVRNZXNzYWdlVHlwZS5DQUxMIHx8IG1zZy5zZXFpZCE9NDIpIHsKKyAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oImluY29ycmVjdCBwYXJhbWV0ZXJzIik7CisgICAgICB9CisgICAgICBvdXQud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKCJmdW5jIiwgVE1lc3NhZ2VUeXBlLlJFUExZLCA0MikpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdEV4aXN0aW5nU2VydmljZSgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICB3aGVuKGlwcm90LnJlYWRNZXNzYWdlQmVnaW4oKSkudGhlblJldHVybihuZXcgVE1lc3NhZ2UoInNlcnZpY2U6ZnVuYyIsIFRNZXNzYWdlVHlwZS5DQUxMLCA0MikpOworICAgIG1wLnJlZ2lzdGVyUHJvY2Vzc29yKCJzZXJ2aWNlIiwgbmV3IFN0dWJQcm9jZXNzb3IoKSk7CisgICAgbXAucHJvY2VzcyhpcHJvdCwgb3Byb3QpOworICAgIHZlcmlmeShvcHJvdCkud3JpdGVNZXNzYWdlQmVnaW4oYW55KFRNZXNzYWdlLmNsYXNzKSk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdFNlcnZpY2UoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgd2hlbihpcHJvdC5yZWFkTWVzc2FnZUJlZ2luKCkpLnRoZW5SZXR1cm4obmV3IFRNZXNzYWdlKCJmdW5jIiwgVE1lc3NhZ2VUeXBlLkNBTEwsIDQyKSk7CisgICAgbXAucmVnaXN0ZXJEZWZhdWx0KG5ldyBTdHViUHJvY2Vzc29yKCkpOworICAgIG1wLnByb2Nlc3MoaXByb3QsIG9wcm90KTsKKyAgICB2ZXJpZnkob3Byb3QpLndyaXRlTWVzc2FnZUJlZ2luKGFueShUTWVzc2FnZS5jbGFzcykpOworICB9CisKK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdE9wdGlvblR5cGUuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdE9wdGlvblR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzAyODVmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0T3B0aW9uVHlwZS5qYXZhCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5PcHRpb247CisKKy8vIFRlc3RzIGFuZCBkb2N1bWVudHMgYmVoYXZpb3IgZm9yIHRoZSAiT3B0aW9uPFQ+IiB0eXBlCitwdWJsaWMgY2xhc3MgVGVzdE9wdGlvblR5cGUgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgICAgcHVibGljIHZvaWQgdGVzdFNvbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIG5hbWUgPSAiQ2h1Y2sgTm9ycmlzIjsKKyAgICAgICAgT3B0aW9uPFN0cmluZz4gb3B0aW9uID0gT3B0aW9uLmZyb21OdWxsYWJsZShuYW1lKTsKKworICAgICAgICBhc3NlcnRUcnVlKG9wdGlvbiBpbnN0YW5jZW9mIE9wdGlvbi5Tb21lKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShvcHRpb24uaXNEZWZpbmVkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlNvbWUoQ2h1Y2sgTm9ycmlzKSIsIG9wdGlvbi50b1N0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG9wdGlvbi5vcigiZGVmYXVsdCB2YWx1ZSIpLCAiQ2h1Y2sgTm9ycmlzIik7CisgICAgICAgIGFzc2VydEVxdWFscyhvcHRpb24uZ2V0KCksIkNodWNrIE5vcnJpcyIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROb25lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBuYW1lID0gbnVsbDsKKyAgICAgICAgT3B0aW9uPFN0cmluZz4gb3B0aW9uID0gT3B0aW9uLmZyb21OdWxsYWJsZShuYW1lKTsKKworICAgICAgICBhc3NlcnRUcnVlKG9wdGlvbiBpbnN0YW5jZW9mIE9wdGlvbi5Ob25lKTsKKyAgICAgICAgYXNzZXJ0RmFsc2Uob3B0aW9uLmlzRGVmaW5lZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJOb25lIiwgb3B0aW9uLnRvU3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMob3B0aW9uLm9yKCJkZWZhdWx0IHZhbHVlIiksICJkZWZhdWx0IHZhbHVlIik7CisgICAgICAgIC8vIEV4cGVjdCBleGNlcHRpb24KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IG9wdGlvbi5nZXQoKTsKKyAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgZ290IG5vIGV4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpIHsKKworICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBnb3Qgc29tZSBvdGhlciBleGNlcHRpb246ICIrZXgudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWFrZVNvbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgT3B0aW9uPFN0cmluZz4gc29tZSA9IE9wdGlvbi5zb21lKCJ3ZWUiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzb21lIGluc3RhbmNlb2YgT3B0aW9uLlNvbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RNYWtlTm9uZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBPcHRpb248SW50ZWdlcj4gbm9uZSA9IE9wdGlvbi5ub25lKCk7CisgICAgICAgIGFzc2VydFRydWUobm9uZSBpbnN0YW5jZW9mIE9wdGlvbi5Ob25lKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cy5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjkxZmUzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMuamF2YQpAQCAtMCwwICsxLDE3OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0Lio7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgdGhyaWZ0LnRlc3QuRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50czsKKworcHVibGljIGNsYXNzIFRlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cyBleHRlbmRzIFRlc3RDYXNlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBkb3VibGUgRVBTSUxPTiA9IDAuMDAwMDAwMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9DT05TVEFOVFNfVEVTVCA9CisgICAgICAgICJmYWlsZWQgdG8gdmVyaWZ5IGEgZG91YmxlIGNvbnN0YW50IGdlbmVyYXRlZCBieSBUaHJpZnQgKGV4cGVjdGVkID0gJWYsIGdvdCA9ICVmKSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9SRU5ERVJFRF9ET1VCTEVfTElTVF9URVNUID0KKyAgICAgICAgImZhaWxlZCB0byB2ZXJpZnkgYSBsaXN0IGl0ZW0gYnkgVGhyaWZ0IChleHBlY3RlZCA9ICVmLCBnb3QgPSAlZikiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBU1NFUlRJT05fTUVTU0FHRV9GT1JfVFlQRV9DSEVDS1MgPQorICAgICAgICAidGhlIHJlbmRlcmVkIHZhcmlhYmxlIHdpdGggbmFtZSAlcyBpcyBub3Qgb2YgZG91YmxlIHR5cGUiOworCisgICAgLy8gdG8gbWFrZSBzdXJlIGxpc3RzIGNvbnRhaW5pbmcgZG91YmxlcyBhcmUgZ2VuZXJhdGVkIGNvcnJlY3RseQorICAgIHB1YmxpYyB2b2lkIHRlc3RSZW5kZXJlZERvdWJsZUxpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgZG91YmxlW10gRVhQRUNURURfTElTVCA9CisgICAgICAgICAgICB7MWQsLTEwMGQsMTAwZCw5MjIzMzcyMDM2ODU0Nzc1ODA3ZCwtOTIyMzM3MjAzNjg1NDc3NTgwN2QsMy4xNDE1OTI2NTM1OSwxMDAwMDAwLjEsLTEwMDAwMDAuMSwxLjdlKzMwOCwKKyAgICAgICAgICAgICAtMS43ZSszMDgsOTIyMzM3MjAzNjg1NDc3NTgxNi40MywtOTIyMzM3MjAzNjg1NDc3NTgxNi40M307CisgICAgICAgIGFzc2VydEVxdWFscyhFWFBFQ1RFRF9MSVNULmxlbmd0aCwgRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfTElTVF9URVNULnNpemUoKSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgRVhQRUNURURfTElTVC5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgIEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9SRU5ERVJFRF9ET1VCTEVfTElTVF9URVNULAorICAgICAgICAgICAgICAgICAgICBFWFBFQ1RFRF9MSVNUW2ldLAorICAgICAgICAgICAgICAgICAgICBEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9MSVNUX1RFU1QuZ2V0KGkpKSwKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9MSVNUW2ldLCBEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9MSVNUX1RFU1QuZ2V0KGkpLCBFUFNJTE9OKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHRvIG1ha2Ugc3VyZSB0aGUgdmFyaWFibGVzIGluc2lkZSBUaHJpZnQgZmlsZXMgYXJlIGdlbmVyYXRlZCBjb3JyZWN0bHkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgZG91YmxlIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19JTlRfQ09OU1RBTlQgPSAxLjA7CisgICAgICAgIGZpbmFsIGRvdWJsZSBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfSU5UX0NPTlNUQU5UID0gLTEwMC4wOworICAgICAgICBmaW5hbCBkb3VibGUgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFU1RfSU5UX0NPTlNUQU5UID0gOTIyMzM3MjAzNjg1NDc3NTgwNy4wOworICAgICAgICBmaW5hbCBkb3VibGUgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMRVNUX0lOVF9DT05TVEFOVCA9IC05MjIzMzcyMDM2ODU0Nzc1ODA3LjA7CisgICAgICAgIGZpbmFsIGRvdWJsZSBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fRE9VQkxFX1dJVEhfTUFOWV9ERUNJTUFMUyA9IDMuMTQxNTkyNjUzNTk7CisgICAgICAgIGZpbmFsIGRvdWJsZSBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fRlJBQ1RJT05BTF9ET1VCTEUgPSAxMDAwMDAwLjE7CisgICAgICAgIGZpbmFsIGRvdWJsZSBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfRlJBQ1RJT05BTF9ET1VCTEUgPSAtMTAwMDAwMC4xOworICAgICAgICBmaW5hbCBkb3VibGUgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0RPVUJMRSA9IDEuN2UrMzA4OworICAgICAgICBmaW5hbCBkb3VibGUgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFID0gOTIyMzM3MjAzNjg1NDc3NTgxNi40MzsKKyAgICAgICAgZmluYWwgZG91YmxlIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19TTUFMTF9ET1VCTEUgPSAtMS43ZSszMDg7CisgICAgICAgIGZpbmFsIGRvdWJsZSBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfQlVUX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFID0gLTkyMjMzNzIwMzY4NTQ3NzU4MTYuNDM7CisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9DT05TVEFOVFNfVEVTVCwKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fSU5UX0NPTlNUQU5ULAorICAgICAgICAgICAgICAgIERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0lOVF9DT05TVEFOVF9URVNUKSwKKyAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19JTlRfQ09OU1RBTlQsCisgICAgICAgICAgICBEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19JTlRfQ09OU1RBTlRfVEVTVCwgRVBTSUxPTik7CisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9DT05TVEFOVFNfVEVTVCwKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfSU5UX0NPTlNUQU5ULAorICAgICAgICAgICAgICAgIERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0lOVF9DT05TVEFOVF9URVNUKSwKKyAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9JTlRfQ09OU1RBTlQsCisgICAgICAgICAgICBEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9JTlRfQ09OU1RBTlRfVEVTVCwgRVBTSUxPTik7CisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9DT05TVEFOVFNfVEVTVCwKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VTVF9JTlRfQ09OU1RBTlQsCisgICAgICAgICAgICAgICAgRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VTVF9JTlRfQ09OU1RBTlRfVEVTVCksCisgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VTVF9JTlRfQ09OU1RBTlQsCisgICAgICAgICAgICBEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRVNUX0lOVF9DT05TVEFOVF9URVNULCBFUFNJTE9OKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICBBU1NFUlRJT05fTUVTU0FHRV9GT1JfUkVOREVSRURfRE9VQkxFX0NPTlNUQU5UU19URVNULAorICAgICAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19TTUFMTEVTVF9JTlRfQ09OU1RBTlQsCisgICAgICAgICAgICAgICAgRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fU01BTExFU1RfSU5UX0NPTlNUQU5UX1RFU1QpLAorICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMRVNUX0lOVF9DT05TVEFOVCwKKyAgICAgICAgICAgIERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMRVNUX0lOVF9DT05TVEFOVF9URVNULCBFUFNJTE9OKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICBBU1NFUlRJT05fTUVTU0FHRV9GT1JfUkVOREVSRURfRE9VQkxFX0NPTlNUQU5UU19URVNULAorICAgICAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ET1VCTEVfV0lUSF9NQU5ZX0RFQ0lNQUxTLAorICAgICAgICAgICAgICAgIERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0RPVUJMRV9XSVRIX01BTllfREVDSU1BTFNfVEVTVCksCisgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fRE9VQkxFX1dJVEhfTUFOWV9ERUNJTUFMUywKKyAgICAgICAgICAgIERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0RPVUJMRV9XSVRIX01BTllfREVDSU1BTFNfVEVTVCwgRVBTSUxPTik7CisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9DT05TVEFOVFNfVEVTVCwKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fRlJBQ1RJT05BTF9ET1VCTEUsCisgICAgICAgICAgICAgICAgRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCksCisgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fRlJBQ1RJT05BTF9ET1VCTEUsCisgICAgICAgICAgICBEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19GUkFDVElPTkFMX0RPVUJMRV9URVNULCBFUFNJTE9OKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICBBU1NFUlRJT05fTUVTU0FHRV9GT1JfUkVOREVSRURfRE9VQkxFX0NPTlNUQU5UU19URVNULAorICAgICAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9GUkFDVElPTkFMX0RPVUJMRSwKKyAgICAgICAgICAgICAgICBEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9GUkFDVElPTkFMX0RPVUJMRV9URVNUKSwKKyAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9GUkFDVElPTkFMX0RPVUJMRSwKKyAgICAgICAgICAgIERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QsIEVQU0lMT04pOworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgIEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9SRU5ERVJFRF9ET1VCTEVfQ09OU1RBTlRTX1RFU1QsCisgICAgICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0RPVUJMRSwKKyAgICAgICAgICAgICAgICBEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9ET1VCTEVfVEVTVCksCisgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRE9VQkxFLAorICAgICAgICAgICAgRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRE9VQkxFX1RFU1QsIEVQU0lMT04pOworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgIEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9SRU5ERVJFRF9ET1VCTEVfQ09OU1RBTlRTX1RFU1QsCisgICAgICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFLAorICAgICAgICAgICAgICAgIERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QpLAorICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFLAorICAgICAgICAgICAgRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCwgRVBTSUxPTik7CisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9DT05TVEFOVFNfVEVTVCwKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fU01BTExfRE9VQkxFLAorICAgICAgICAgICAgICAgIERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMX0RPVUJMRV9URVNUKSwKKyAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19TTUFMTF9ET1VCTEUsCisgICAgICAgICAgICBEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19TTUFMTF9ET1VCTEVfVEVTVCwgRVBTSUxPTik7CisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9DT05TVEFOVFNfVEVTVCwKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfQlVUX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFLAorICAgICAgICAgICAgICAgIERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0JVVF9MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNUKSwKKyAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9CVVRfTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEUsCisgICAgICAgICAgICBEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9CVVRfTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCwgRVBTSUxPTik7CisgICAgICAgIGFzc2VydFRydWUoCisgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9UWVBFX0NIRUNLUywgIkRPVUJMRV9BU1NJR05FRF9UT19JTlRfQ09OU1RBTlRfVEVTVCIpLAorICAgICAgICAgICAgRG91YmxlLmNsYXNzLmlzSW5zdGFuY2UoRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fSU5UX0NPTlNUQU5UX1RFU1QpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoQVNTRVJUSU9OX01FU1NBR0VfRk9SX1RZUEVfQ0hFQ0tTLCAiRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0lOVF9DT05TVEFOVF9URVNUIiksCisgICAgICAgICAgICBEb3VibGUuY2xhc3MuaXNJbnN0YW5jZShEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9JTlRfQ09OU1RBTlRfVEVTVCkpOworICAgICAgICBhc3NlcnRUcnVlKAorICAgICAgICAgICAgU3RyaW5nLmZvcm1hdChBU1NFUlRJT05fTUVTU0FHRV9GT1JfVFlQRV9DSEVDS1MsICJET1VCTEVfQVNTSUdORURfVE9fTEFSR0VTVF9JTlRfQ09OU1RBTlRfVEVTVCIpLAorICAgICAgICAgICAgRG91YmxlLmNsYXNzLmlzSW5zdGFuY2UoRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VTVF9JTlRfQ09OU1RBTlRfVEVTVCkpOworICAgICAgICBhc3NlcnRUcnVlKAorICAgICAgICAgICAgU3RyaW5nLmZvcm1hdChBU1NFUlRJT05fTUVTU0FHRV9GT1JfVFlQRV9DSEVDS1MsICJET1VCTEVfQVNTSUdORURfVE9fU01BTExFU1RfSU5UX0NPTlNUQU5UX1RFU1QiKSwKKyAgICAgICAgICAgIERvdWJsZS5jbGFzcy5pc0luc3RhbmNlKERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMRVNUX0lOVF9DT05TVEFOVF9URVNUKSk7CisgICAgICAgIGFzc2VydFRydWUoCisgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9UWVBFX0NIRUNLUywgIkRPVUJMRV9BU1NJR05FRF9UT19ET1VCTEVfV0lUSF9NQU5ZX0RFQ0lNQUxTX1RFU1QiKSwKKyAgICAgICAgICAgIERvdWJsZS5jbGFzcy5pc0luc3RhbmNlKERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0RPVUJMRV9XSVRIX01BTllfREVDSU1BTFNfVEVTVCkpOworICAgICAgICBhc3NlcnRUcnVlKAorICAgICAgICAgICAgU3RyaW5nLmZvcm1hdChBU1NFUlRJT05fTUVTU0FHRV9GT1JfVFlQRV9DSEVDS1MsICJET1VCTEVfQVNTSUdORURfVE9fRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCIpLAorICAgICAgICAgICAgRG91YmxlLmNsYXNzLmlzSW5zdGFuY2UoRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCkpOworICAgICAgICBhc3NlcnRUcnVlKAorICAgICAgICAgICAgU3RyaW5nLmZvcm1hdChBU1NFUlRJT05fTUVTU0FHRV9GT1JfVFlQRV9DSEVDS1MsICJET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCIpLAorICAgICAgICAgICAgRG91YmxlLmNsYXNzLmlzSW5zdGFuY2UoRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCkpOworICAgICAgICAvL2Fzc2VydFRydWUoCisgICAgICAgIC8vICAgIFN0cmluZy5mb3JtYXQoQVNTRVJUSU9OX01FU1NBR0VfRk9SX1RZUEVfQ0hFQ0tTLCAiRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0RPVUJMRV9URVNUIiksCisgICAgICAgIC8vICAgIERvdWJsZS5jbGFzcy5pc0luc3RhbmNlKERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0RPVUJMRV9URVNUKSk7CisgICAgICAgIGFzc2VydFRydWUoCisgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9UWVBFX0NIRUNLUywgIkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNUIiksCisgICAgICAgICAgICBEb3VibGUuY2xhc3MuaXNJbnN0YW5jZShEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNUKSk7CisgICAgICAgIC8vYXNzZXJ0VHJ1ZSgKKyAgICAgICAgLy8gICAgU3RyaW5nLmZvcm1hdChBU1NFUlRJT05fTUVTU0FHRV9GT1JfVFlQRV9DSEVDS1MsICJET1VCTEVfQVNTSUdORURfVE9fU01BTExfRE9VQkxFX1RFU1QiKSwKKyAgICAgICAgLy8gICAgRG91YmxlLmNsYXNzLmlzSW5zdGFuY2UoRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fU01BTExfRE9VQkxFX1RFU1QpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgQVNTRVJUSU9OX01FU1NBR0VfRk9SX1RZUEVfQ0hFQ0tTLCAiRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0JVVF9MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNUIiksCisgICAgICAgICAgICBEb3VibGUuY2xhc3MuaXNJbnN0YW5jZSgKKyAgICAgICAgICAgICAgICBEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9CVVRfTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdFJldXNlLmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RSZXVzZS5qYXZhCmluZGV4IGRiMTZjNzQuLmI0NGFiZDAgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdFJldXNlLmphdmEKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0UmV1c2UuamF2YQpAQCAtMjEsMTAgKzIxLDcgQEAKIAogaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEJpbmFyeVByb3RvY29sOwotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlOwogCiBpbXBvcnQgdGhyaWZ0LnRlc3QuUmV1c2U7CiAKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdFNob3J0U3RhY2suamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdFNob3J0U3RhY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc4MzFlNS4uMDAwMDAwMAotLS0gYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RTaG9ydFN0YWNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKLQotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIFRlc3RTaG9ydFN0YWNrIGV4dGVuZHMgVGVzdENhc2UgewotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTlVNX1RSSUFMUyA9IDU7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOVU1fUkVQUyA9IDEwMDAwMDAwOwotCi0gIHB1YmxpYyB2b2lkIHRlc3RPcHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBTaG9ydFN0YWNrIHMgPSBuZXcgU2hvcnRTdGFjaygxMCk7Ci0gICAgcy5wdXNoKChzaG9ydCkxMCk7Ci0gICAgcy5wdXNoKChzaG9ydCkxMSk7Ci0gICAgcy5wdXNoKChzaG9ydCkxMik7Ci0gICAgYXNzZXJ0RXF1YWxzKChzaG9ydCkxMiwgcy5wZWVrKCkpOwotICAgIGFzc2VydEVxdWFscygoc2hvcnQpMTIsIHMucGVlaygpKTsKLSAgICBhc3NlcnRFcXVhbHMoKHNob3J0KTEyLCBzLnBvcCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoKHNob3J0KTExLCBzLnBvcCgpKTsKLSAgICBzLnB1c2goKHNob3J0KTQwKTsKLSAgICBhc3NlcnRFcXVhbHMoKHNob3J0KTQwLCBzLnBlZWsoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKChzaG9ydCk0MCwgcy5wb3AoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKChzaG9ydCkxMCwgcy5wZWVrKCkpOwotICAgIGFzc2VydEVxdWFscygoc2hvcnQpMTAsIHMucG9wKCkpOwotICAgIHRyeSB7Ci0gICAgICBzLnBlZWsoKTsKLSAgICAgIGZhaWwoInNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24hIik7Ci0gICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIHlheQotICAgIH0KLQotICAgIHRyeSB7Ci0gICAgICBzLnBvcCgpOwotICAgICAgZmFpbCgic2hvdWxkIGhhdmUgdGhyb3duIGFuIGV4Y2VwdGlvbiEiKTsKLSAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgLy8geWF5Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdEdyb3coKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBTaG9ydFN0YWNrIHMgPSBuZXcgU2hvcnRTdGFjaygxKTsKLSAgICBzLnB1c2goKHNob3J0KTEpOwotICAgIHMucHVzaCgoc2hvcnQpMSk7Ci0gICAgcy5wdXNoKChzaG9ydCkxKTsKLSAgICBzLnB1c2goKHNob3J0KTEpOwotICAgIHMucHVzaCgoc2hvcnQpMSk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBmb3IgKGludCB0cmlhbCA9IDA7IHRyaWFsIDwgTlVNX1RSSUFMUzsgdHJpYWwrKykgewotICAgICAgbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgU2hvcnRTdGFjayBzID0gbmV3IFNob3J0U3RhY2soMTApOwotICAgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgTlVNX1JFUFM7IHJlcCsrKSB7Ci0gICAgICAgIHMucHVzaCgoc2hvcnQpMSk7Ci0gICAgICAgIHMucHVzaCgoc2hvcnQpMTEpOwotICAgICAgICBzLnB1c2goKHNob3J0KTExMSk7Ci0gICAgICAgIHMucG9wKCk7Ci0gICAgICAgIHMucG9wKCk7Ci0gICAgICAgIHMucHVzaCgoc2hvcnQpMTIpOwotICAgICAgICBzLnB1c2goKHNob3J0KTEyMSk7Ci0gICAgICAgIHMucHVzaCgoc2hvcnQpMTIxMSk7Ci0gICAgICAgIHMucHVzaCgoc2hvcnQpMTIxMTEpOwotICAgICAgICBzLnBvcCgpOwotICAgICAgICBzLnBvcCgpOwotICAgICAgICBzLnBvcCgpOwotICAgICAgICBzLnBvcCgpOwotICAgICAgICBzLnB1c2goKHNob3J0KTUpOwotICAgICAgICBzLnBvcCgpOwotICAgICAgICBzLnBvcCgpOwotICAgICAgfQotICAgICAgbG9uZyBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU2hvcnRTdGFjazogIiArIChlbmQtc3RhcnQpKTsKLQotICAgICAgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgIFN0YWNrPFNob3J0PiBzdGRTdGFjayA9IG5ldyBTdGFjazxTaG9ydD4oKTsKLSAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IE5VTV9SRVBTOyByZXArKykgewotICAgICAgICBzdGRTdGFjay5wdXNoKChzaG9ydCkxKTsKLSAgICAgICAgc3RkU3RhY2sucHVzaCgoc2hvcnQpMTEpOwotICAgICAgICBzdGRTdGFjay5wdXNoKChzaG9ydCkxMTEpOwotICAgICAgICBzdGRTdGFjay5wb3AoKTsKLSAgICAgICAgc3RkU3RhY2sucG9wKCk7Ci0gICAgICAgIHN0ZFN0YWNrLnB1c2goKHNob3J0KTEyKTsKLSAgICAgICAgc3RkU3RhY2sucHVzaCgoc2hvcnQpMTIxKTsKLSAgICAgICAgc3RkU3RhY2sucHVzaCgoc2hvcnQpMTIxMSk7Ci0gICAgICAgIHN0ZFN0YWNrLnB1c2goKHNob3J0KTEyMTExKTsKLSAgICAgICAgc3RkU3RhY2sucG9wKCk7Ci0gICAgICAgIHN0ZFN0YWNrLnBvcCgpOwotICAgICAgICBzdGRTdGFjay5wb3AoKTsKLSAgICAgICAgc3RkU3RhY2sucG9wKCk7Ci0gICAgICAgIHN0ZFN0YWNrLnB1c2goKHNob3J0KTUpOwotICAgICAgICBzdGRTdGFjay5wb3AoKTsKLSAgICAgICAgc3RkU3RhY2sucG9wKCk7Ci0gICAgICB9Ci0gICAgICBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQnVpbHQtaW4gc3RhY2s6ICIgKyAoZW5kLXN0YXJ0KSk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RTdHJ1Y3QuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdFN0cnVjdC5qYXZhCmluZGV4IGIwZGZmYzguLjMzNzllZDEgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdFN0cnVjdC5qYXZhCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdFN0cnVjdC5qYXZhCkBAIC0zMDgsMTIgKzMwOCw0MCBAQAogICAgICAgICBvYmplY3QudG9TdHJpbmcoKSk7CiAgIH0KIAorICBwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydEFycmF5RXF1YWxzKGJ5dGVbXSBleHBlY3RlZCwgYnl0ZVtdIGFjdHVhbCkgeworICAgIGlmICghamF2YS51dGlsLkFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCkpIHsKKyAgICAgIGZhaWwoIkV4cGVjdGVkIGJ5dGUgYXJyYXkgZGlkIG5vdCBtYXRjaCBhY3R1YWwuIik7CisgICAgfQorICB9CisKICAgcHVibGljIHZvaWQgdGVzdEJ5dGVzQnVmZmVyRmVhdHVyZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBKYXZhVGVzdEhlbHBlciBvID0gbmV3IEphdmFUZXN0SGVscGVyKCk7CisgICAgCisgICAgZmluYWwgU3RyaW5nIHRlc3RTdHJpbmcgPSAidGVzdEJ5dGVzQnVmZmVyRmVhdHVyZXMiOworICAgIGZpbmFsIEphdmFUZXN0SGVscGVyIG8gPSBuZXcgSmF2YVRlc3RIZWxwZXIoKTsKKwogICAgIG8uc2V0UmVxX2JpbigoQnl0ZUJ1ZmZlciludWxsKTsKICAgICBhc3NlcnROdWxsKG8uZ2V0UmVxX2JpbigpKTsKKworICAgIG8uc2V0UmVxX2JpbihCeXRlQnVmZmVyLndyYXAodGVzdFN0cmluZy5nZXRCeXRlcygpKSk7CisgICAgYXNzZXJ0QXJyYXlFcXVhbHModGVzdFN0cmluZy5nZXRCeXRlcygpLCBvLmdldFJlcV9iaW4oKSk7CisKICAgICBvLnNldFJlcV9iaW4oKGJ5dGVbXSludWxsKTsKICAgICBhc3NlcnROdWxsKG8uZ2V0UmVxX2JpbigpKTsKKworICAgIG8uc2V0UmVxX2Jpbih0ZXN0U3RyaW5nLmdldEJ5dGVzKCkpOworICAgIGFzc2VydEFycmF5RXF1YWxzKHRlc3RTdHJpbmcuZ2V0Qnl0ZXMoKSwgby5nZXRSZXFfYmluKCkpOworCisgICAgby5zZXRGaWVsZFZhbHVlKEphdmFUZXN0SGVscGVyLl9GaWVsZHMuUkVRX0JJTiwgbnVsbCk7CisgICAgYXNzZXJ0TnVsbChvLmdldFJlcV9iaW4oKSk7CisKKyAgICBvLnNldEZpZWxkVmFsdWUoSmF2YVRlc3RIZWxwZXIuX0ZpZWxkcy5SRVFfQklOLCB0ZXN0U3RyaW5nLmdldEJ5dGVzKCkpOworICAgIGFzc2VydEFycmF5RXF1YWxzKHRlc3RTdHJpbmcuZ2V0Qnl0ZXMoKSwgby5nZXRSZXFfYmluKCkpOworCisgICAgby5zZXRGaWVsZFZhbHVlKEphdmFUZXN0SGVscGVyLl9GaWVsZHMuUkVRX0JJTiwgbnVsbCk7CisgICAgYXNzZXJ0TnVsbChvLmdldFJlcV9iaW4oKSk7CisKKyAgICBvLnNldEZpZWxkVmFsdWUoSmF2YVRlc3RIZWxwZXIuX0ZpZWxkcy5SRVFfQklOLCBCeXRlQnVmZmVyLndyYXAodGVzdFN0cmluZy5nZXRCeXRlcygpKSk7CisgICAgYXNzZXJ0QXJyYXlFcXVhbHModGVzdFN0cmluZy5nZXRCeXRlcygpLCBvLmdldFJlcV9iaW4oKSk7CiAgIH0KIAogICBwdWJsaWMgdm9pZCB0ZXN0SmF2YVNlcmlhbGl6YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0VW5zYWZlQmluYXJpZXMuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdFVuc2FmZUJpbmFyaWVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFmYzIxMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdFVuc2FmZUJpbmFyaWVzLmphdmEKQEAgLTAsMCArMSwxNDYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKKworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKworaW1wb3J0IHRocmlmdC50ZXN0LlNhZmVCeXRlczsKK2ltcG9ydCB0aHJpZnQudGVzdC5VbnNhZmVCeXRlczsKKworLy8gIHRlc3QgZ2VuZXJhdGluZyB0eXBlcyB3aXRoIHVuLWNvcGllZCBieXRlW10vQnl0ZUJ1ZmZlciBpbnB1dC9vdXRwdXQKKy8vCitwdWJsaWMgY2xhc3MgVGVzdFVuc2FmZUJpbmFyaWVzIGV4dGVuZHMgVGVzdFN0cnVjdCB7CisKKyAgcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIGlucHV0KCkgeworICAgIHJldHVybiBuZXcgYnl0ZVtdezEsIDF9OworICB9CisKKyAgLy8KKyAgLy8gIHZlcmlmeSB0aGF0IHRoZSB1bnNhZmVfYmluYXJpZXMgb3B0aW9uIG1vZGlmaWVzIGJlaGF2aW9yCisgIC8vCisKKyAgLy8gIGNvbnN0cnVjdG9yIGRvZXNuJ3QgY29weQorICBwdWJsaWMgdm9pZCB0ZXN0VW5zYWZlQ29uc3RydWN0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgIGJ5dGVbXSBpbnB1dCA9IGlucHV0KCk7CisgICAgVW5zYWZlQnl0ZXMgc3RydWN0ID0gbmV3IFVuc2FmZUJ5dGVzKEJ5dGVCdWZmZXIud3JhcChpbnB1dCkpOworCisgICAgaW5wdXRbMF0gPSAyOworCisgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKAorICAgICAgICBuZXcgYnl0ZVtdezIsIDF9LAorICAgICAgICBzdHJ1Y3QuZ2V0Qnl0ZXMoKSkKKyAgICApOworCisgIH0KKworICAvLyAgZ2V0dGVyIGRvZXNuJ3QgY29weQorICAvLyAgbm90ZTogdGhpcyBiZWhhdmlvciBpcyB0aGUgc2FtZSB3aXRoL3dpdGhvdXQgdGhlIGZsYWcsIGJ1dCBpZiB0aGlzIGRlZmF1bHQgZXZlciBjaGFuZ2VzLCB0aGUgY3VycmVudCBiZWhhdmlvcgorICAvLyAgICAgICAgc2hvdWxkIGJlIHJldGFpbmVkIHdoZW4gdXNpbmcgdGhpcyBmbGFnCisgIHB1YmxpYyB2b2lkIHRlc3RVbnNhZmVHZXR0ZXIoKXsKKyAgICBVbnNhZmVCeXRlcyBzdHJ1Y3QgPSBuZXcgVW5zYWZlQnl0ZXMoQnl0ZUJ1ZmZlci53cmFwKGlucHV0KCkpKTsKKworICAgIGJ5dGVbXSB2YWwgPSBzdHJ1Y3QuZ2V0Qnl0ZXMoKTsKKyAgICB2YWxbMF0gPSAyOworCisgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKAorICAgICAgICBuZXcgYnl0ZVtdezIsIDF9LAorICAgICAgICBzdHJ1Y3QuZ2V0Qnl0ZXMoKSkKKyAgICApOworCisgIH0KKworICAvLyAgc2V0dGVyIGRvZXNuJ3QgY29weQorICBwdWJsaWMgdm9pZCB0ZXN0VW5zYWZlU2V0dGVyKCl7CisgICAgVW5zYWZlQnl0ZXMgc3RydWN0ID0gbmV3IFVuc2FmZUJ5dGVzKCk7CisKKyAgICBieXRlW10gdmFsID0gaW5wdXQoKTsKKyAgICBzdHJ1Y3Quc2V0Qnl0ZXModmFsKTsKKworICAgIHZhbFswXSA9IDI7CisKKyAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoCisgICAgICAgIG5ldyBieXRlW117MiwgMX0sCisgICAgICAgIHN0cnVjdC5nZXRCeXRlcygpKQorICAgICk7CisKKyAgfQorCisgIC8vICBidWZmZXIgZG9lbnMndCBjb3B5CisgIHB1YmxpYyB2b2lkIHRlc3RVbnNhZmVCdWZmZXJGb3IoKXsKKyAgICBVbnNhZmVCeXRlcyBzdHJ1Y3QgPSBuZXcgVW5zYWZlQnl0ZXMoQnl0ZUJ1ZmZlci53cmFwKGlucHV0KCkpKTsKKworICAgIEJ5dGVCdWZmZXIgdmFsID0gc3RydWN0LmJ1ZmZlckZvckJ5dGVzKCk7CisgICAgdmFsLmFycmF5KClbMF0gPSAyOworCisgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKAorICAgICAgICBuZXcgYnl0ZVtdezIsIDF9LAorICAgICAgICBzdHJ1Y3QuZ2V0Qnl0ZXMoKSkKKyAgICApOworCisgIH0KKworICAvLworICAvLyAgdmVyaWZ5IHRoYXQgdGhlIGRlZmF1bHQgZ2VuZXJhdG9yIGRvZXMgbm90IGNoYW5nZSBiZWhhdmlvcgorICAvLworCisgIHB1YmxpYyB2b2lkIHRlc3RTYWZlQ29uc3RydWN0b3IoKSB7CisKKyAgICBieXRlW10gaW5wdXQgPSBpbnB1dCgpOworICAgIFNhZmVCeXRlcyBzdHJ1Y3QgPSBuZXcgU2FmZUJ5dGVzKEJ5dGVCdWZmZXIud3JhcChpbnB1dCkpOworCisgICAgaW5wdXRbMF0gPSAyOworCisgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKAorICAgICAgICBuZXcgYnl0ZVtdezEsIDF9LAorICAgICAgICBzdHJ1Y3QuZ2V0Qnl0ZXMoKSkKKyAgICApOworCisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0U2FmZVNldHRlcigpIHsKKworICAgIGJ5dGVbXSBpbnB1dCA9IGlucHV0KCk7CisgICAgU2FmZUJ5dGVzIHN0cnVjdCA9IG5ldyBTYWZlQnl0ZXMoQnl0ZUJ1ZmZlci53cmFwKGlucHV0KSk7CisKKyAgICBpbnB1dFswXSA9IDI7CisKKyAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoCisgICAgICAgIG5ldyBieXRlW117MSwgMX0sCisgICAgICAgIHN0cnVjdC5nZXRCeXRlcygpKQorICAgICk7CisKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RTYWZlQnVmZmVyRm9yKCl7CisgICAgU2FmZUJ5dGVzIHN0cnVjdCA9IG5ldyBTYWZlQnl0ZXMoQnl0ZUJ1ZmZlci53cmFwKGlucHV0KCkpKTsKKworICAgIEJ5dGVCdWZmZXIgdmFsID0gc3RydWN0LmJ1ZmZlckZvckJ5dGVzKCk7CisgICAgdmFsLmFycmF5KClbMF0gPSAyOworCisgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKAorICAgICAgICBuZXcgYnl0ZVtdezEsIDF9LAorICAgICAgICBzdHJ1Y3QuZ2V0Qnl0ZXMoKSkKKyAgICApOworCisgIH0KKworfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9hc3luYy9UZXN0VEFzeW5jQ2xpZW50TWFuYWdlci5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9hc3luYy9UZXN0VEFzeW5jQ2xpZW50TWFuYWdlci5qYXZhCmluZGV4IDEyZDBlYWYuLmM0ODNjZjIgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvYXN5bmMvVGVzdFRBc3luY0NsaWVudE1hbmFnZXIuamF2YQorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L2FzeW5jL1Rlc3RUQXN5bmNDbGllbnRNYW5hZ2VyLmphdmEKQEAgLTIyLDExICsyMiwxMyBAQAogaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CiBpbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lb3V0RXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNCb29sZWFuOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNSZWZlcmVuY2U7CiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiAKQEAgLTM5LDEyICs0MSw5IEBACiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlROb25ibG9ja2luZ1NvY2tldDsKIAogaW1wb3J0IHRocmlmdC50ZXN0LkNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3Q7CitpbXBvcnQgdGhyaWZ0LnRlc3QuRXhjZXB0aW9uV2l0aEFNYXA7CiBpbXBvcnQgdGhyaWZ0LnRlc3QuU3J2OwogaW1wb3J0IHRocmlmdC50ZXN0LlNydi5JZmFjZTsKLWltcG9ydCB0aHJpZnQudGVzdC5TcnYuQXN5bmNDbGllbnQuSmFua3lfY2FsbDsKLWltcG9ydCB0aHJpZnQudGVzdC5TcnYuQXN5bmNDbGllbnQub25ld2F5TWV0aG9kX2NhbGw7Ci1pbXBvcnQgdGhyaWZ0LnRlc3QuU3J2LkFzeW5jQ2xpZW50LnByaW1pdGl2ZU1ldGhvZF9jYWxsOwotaW1wb3J0IHRocmlmdC50ZXN0LlNydi5Bc3luY0NsaWVudC52b2lkTWV0aG9kX2NhbGw7CiAKIHB1YmxpYyBjbGFzcyBUZXN0VEFzeW5jQ2xpZW50TWFuYWdlciBleHRlbmRzIFRlc3RDYXNlIHsKIApAQCAtODMsNTMgKzgyLDExMyBAQAogICAgIGJhc2ljQ2FsbChjbGllbnQpOwogICB9CiAKLSAgcHVibGljIHZvaWQgdGVzdFRpbWVvdXRDYWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgZmluYWwgQ291bnREb3duTGF0Y2ggbGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7Ci0gICAgU3J2LkFzeW5jQ2xpZW50IGNsaWVudCA9IGdldENsaWVudCgpOwotICAgIGNsaWVudC5zZXRUaW1lb3V0KDEwMCk7Ci0gICAgY2xpZW50LnByaW1pdGl2ZU1ldGhvZChuZXcgQXN5bmNNZXRob2RDYWxsYmFjazxwcmltaXRpdmVNZXRob2RfY2FsbD4oKSB7Ci0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotICAgICAgICB0cnkgewotICAgICAgICAgIGlmICghKGV4Y2VwdGlvbiBpbnN0YW5jZW9mIFRpbWVvdXRFeGNlcHRpb24pKSB7Ci0gICAgICAgICAgICBTdHJpbmdXcml0ZXIgc2luayA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICAgICAgICAgIGV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2UobmV3IFByaW50V3JpdGVyKHNpbmssIHRydWUpKTsKLSAgICAgICAgICAgIGZhaWwoImV4cGVjdGVkIFRpbWVvdXRFeGNlcHRpb24gYnV0IGdvdCAiICsgc2luay50b1N0cmluZygpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7CisgIHByaXZhdGUgc3RhdGljIGFic3RyYWN0IGNsYXNzIEVycm9yQ2FsbFRlc3Q8QyBleHRlbmRzIFRBc3luY0NsaWVudCwgUj4geworICAgIGZpbmFsIHZvaWQgcnVuVGVzdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggbGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisgICAgICBmaW5hbCBBdG9taWNSZWZlcmVuY2U8RXhjZXB0aW9uPiBlcnJvciA9IG5ldyBBdG9taWNSZWZlcmVuY2U8RXhjZXB0aW9uPigpOworICAgICAgQyBjbGllbnQgPSBleGVjdXRlRXJyb3JpbmdDYWxsKG5ldyBBc3luY01ldGhvZENhbGxiYWNrPFI+KCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25Db21wbGV0ZShSIHJlc3BvbnNlKSB7CiAgICAgICAgICAgbGF0Y2guY291bnREb3duKCk7CiAgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25FcnJvcihFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisgICAgICAgICAgZXJyb3Iuc2V0KGV4Y2VwdGlvbik7CisgICAgICAgICAgbGF0Y2guY291bnREb3duKCk7CisgICAgICAgIH0KKyAgICAgIH0pOworICAgICAgbGF0Y2guYXdhaXQoMiwgVGltZVVuaXQuU0VDT05EUyk7CisgICAgICBhc3NlcnRUcnVlKGNsaWVudC5oYXNFcnJvcigpKTsKKyAgICAgIEV4Y2VwdGlvbiBleGNlcHRpb24gPSBlcnJvci5nZXQoKTsKKyAgICAgIGFzc2VydE5vdE51bGwoZXhjZXB0aW9uKTsKKyAgICAgIGFzc2VydFNhbWUoZXhjZXB0aW9uLCBjbGllbnQuZ2V0RXJyb3IoKSk7CisgICAgICB2YWxpZGF0ZUVycm9yKGNsaWVudCwgZXhjZXB0aW9uKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlcyBhIGNhbGwgdGhhdCBpcyBleHBlY3RlZCB0byByYWlzZSBhbiBleGNlcHRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIHRlc3RpbmcgY2FsbGJhY2sgdGhhdCBzaG91bGQgYmUgaW5zdGFsbGVkLgorICAgICAqIEByZXR1cm4gVGhlIGNsaWVudCB0aGUgY2FsbCB3YXMgbWFkZSBhZ2FpbnN0LgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIGlmIHRoZXJlIHdhcyBhIHByb2JsZW0gc2V0dGluZyB1cCB0aGUgY2xpZW50IG9yIG1ha2luZyB0aGUgY2FsbC4KKyAgICAgKi8KKyAgICBhYnN0cmFjdCBDIGV4ZWN1dGVFcnJvcmluZ0NhbGwoQXN5bmNNZXRob2RDYWxsYmFjazxSPiBjYWxsYmFjaykgdGhyb3dzIEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIEZ1cnRoZXIgdmFsaWRhdGVzIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBlcnJvciByYWlzZWQgaW4gdGhlIHJlbW90ZSBjYWxsIGFuZCB0aGUgc3RhdGUgb2YgdGhlCisgICAgICogY2xpZW50IGFmdGVyIHRoYXQgY2FsbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGllbnQgVGhlIGNsaWVudCByZXR1cm5lZCBmcm9tIHtAbGluayAjZXhlY3V0ZUVycm9yaW5nQ2FsbChBc3luY01ldGhvZENhbGxiYWNrKX0uCisgICAgICogQHBhcmFtIGVycm9yIFRoZSBleGNlcHRpb24gcmFpc2VkIGJ5IHRoZSByZW1vdGUgY2FsbC4KKyAgICAgKi8KKyAgICBhYnN0cmFjdCB2b2lkIHZhbGlkYXRlRXJyb3IoQyBjbGllbnQsIEV4Y2VwdGlvbiBlcnJvcik7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0VW5leHBlY3RlZFJlbW90ZUV4Y2VwdGlvbkNhbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBuZXcgRXJyb3JDYWxsVGVzdDxTcnYuQXN5bmNDbGllbnQsIEJvb2xlYW4+KCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBTcnYuQXN5bmNDbGllbnQgZXhlY3V0ZUVycm9yaW5nQ2FsbChBc3luY01ldGhvZENhbGxiYWNrPEJvb2xlYW4+IGNhbGxiYWNrKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3J2LkFzeW5jQ2xpZW50IGNsaWVudCA9IGdldENsaWVudCgpOworICAgICAgICBjbGllbnQuZGVjbGFyZWRFeGNlcHRpb25NZXRob2QoZmFsc2UsIGNhbGxiYWNrKTsKKyAgICAgICAgcmV0dXJuIGNsaWVudDsKICAgICAgIH0KIAogICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgdm9pZCBvbkNvbXBsZXRlKHByaW1pdGl2ZU1ldGhvZF9jYWxsIHJlc3BvbnNlKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgZmFpbCgiU2hvdWxkIG5vdCBoYXZlIGZpbmlzaGVkIHRpbWVkIG91dCBjYWxsLiIpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGxhdGNoLmNvdW50RG93bigpOwotICAgICAgICB9CisgICAgICB2b2lkIHZhbGlkYXRlRXJyb3IoU3J2LkFzeW5jQ2xpZW50IGNsaWVudCwgRXhjZXB0aW9uIGVycm9yKSB7CisgICAgICAgIGFzc2VydEZhbHNlKGNsaWVudC5oYXNUaW1lb3V0KCkpOworICAgICAgICBhc3NlcnRUcnVlKGVycm9yIGluc3RhbmNlb2YgVEV4Y2VwdGlvbik7CiAgICAgICB9Ci0gICAgfSk7Ci0gICAgbGF0Y2guYXdhaXQoMiwgVGltZVVuaXQuU0VDT05EUyk7Ci0gICAgYXNzZXJ0VHJ1ZShjbGllbnQuaGFzRXJyb3IoKSk7Ci0gICAgYXNzZXJ0VHJ1ZShjbGllbnQuZ2V0RXJyb3IoKSBpbnN0YW5jZW9mIFRpbWVvdXRFeGNlcHRpb24pOworICAgIH0ucnVuVGVzdCgpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdERlY2xhcmVkUmVtb3RlRXhjZXB0aW9uQ2FsbCgpIHRocm93cyBFeGNlcHRpb24geworICAgIG5ldyBFcnJvckNhbGxUZXN0PFNydi5Bc3luY0NsaWVudCwgQm9vbGVhbj4oKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIFNydi5Bc3luY0NsaWVudCBleGVjdXRlRXJyb3JpbmdDYWxsKEFzeW5jTWV0aG9kQ2FsbGJhY2s8Qm9vbGVhbj4gY2FsbGJhY2spIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTcnYuQXN5bmNDbGllbnQgY2xpZW50ID0gZ2V0Q2xpZW50KCk7CisgICAgICAgIGNsaWVudC5kZWNsYXJlZEV4Y2VwdGlvbk1ldGhvZCh0cnVlLCBjYWxsYmFjayk7CisgICAgICAgIHJldHVybiBjbGllbnQ7CisgICAgICB9CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgdm9pZCB2YWxpZGF0ZUVycm9yKFNydi5Bc3luY0NsaWVudCBjbGllbnQsIEV4Y2VwdGlvbiBlcnJvcikgeworICAgICAgICBhc3NlcnRGYWxzZShjbGllbnQuaGFzVGltZW91dCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEV4Y2VwdGlvbldpdGhBTWFwLmNsYXNzLCBlcnJvci5nZXRDbGFzcygpKTsKKyAgICAgICAgRXhjZXB0aW9uV2l0aEFNYXAgZXhjZXB0aW9uV2l0aEFNYXAgPSAoRXhjZXB0aW9uV2l0aEFNYXApIGVycm9yOworICAgICAgICBhc3NlcnRFcXVhbHMoImJsYWgiLCBleGNlcHRpb25XaXRoQU1hcC5nZXRCbGFoKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCksIGV4Y2VwdGlvbldpdGhBTWFwLmdldE1hcF9maWVsZCgpKTsKKyAgICAgIH0KKyAgICB9LnJ1blRlc3QoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RUaW1lb3V0Q2FsbCgpIHRocm93cyBFeGNlcHRpb24geworICAgIG5ldyBFcnJvckNhbGxUZXN0PFNydi5Bc3luY0NsaWVudCwgSW50ZWdlcj4oKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIFNydi5Bc3luY0NsaWVudCBleGVjdXRlRXJyb3JpbmdDYWxsKEFzeW5jTWV0aG9kQ2FsbGJhY2s8SW50ZWdlcj4gY2FsbGJhY2spIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTcnYuQXN5bmNDbGllbnQgY2xpZW50ID0gZ2V0Q2xpZW50KCk7CisgICAgICAgIGNsaWVudC5zZXRUaW1lb3V0KDEwMCk7CisgICAgICAgIGNsaWVudC5wcmltaXRpdmVNZXRob2QoY2FsbGJhY2spOworICAgICAgICByZXR1cm4gY2xpZW50OworICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHZvaWQgdmFsaWRhdGVFcnJvcihTcnYuQXN5bmNDbGllbnQgY2xpZW50LCBFeGNlcHRpb24gZXJyb3IpIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjbGllbnQuaGFzVGltZW91dCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShlcnJvciBpbnN0YW5jZW9mIFRpbWVvdXRFeGNlcHRpb24pOworICAgICAgfQorICAgIH0ucnVuVGVzdCgpOwogICB9CiAKICAgcHVibGljIHZvaWQgdGVzdFZvaWRDYWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggbGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CiAgICAgZmluYWwgQXRvbWljQm9vbGVhbiByZXR1cm5lZCA9IG5ldyBBdG9taWNCb29sZWFuKGZhbHNlKTsKICAgICBTcnYuQXN5bmNDbGllbnQgY2xpZW50ID0gZ2V0Q2xpZW50KCk7Ci0gICAgY2xpZW50LnZvaWRNZXRob2QobmV3IEZhaWx1cmVMZXNzQ2FsbGJhY2s8U3J2LkFzeW5jQ2xpZW50LnZvaWRNZXRob2RfY2FsbD4oKSB7CisgICAgY2xpZW50LnZvaWRNZXRob2QobmV3IEZhaWx1cmVMZXNzQ2FsbGJhY2s8Vm9pZD4oKSB7CiAgICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyB2b2lkIG9uQ29tcGxldGUodm9pZE1ldGhvZF9jYWxsIHJlc3BvbnNlKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgcmVzcG9uc2UuZ2V0UmVzdWx0KCk7Ci0gICAgICAgICAgcmV0dXJuZWQuc2V0KHRydWUpOwotICAgICAgICB9IGNhdGNoIChURXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICBmYWlsKGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGxhdGNoLmNvdW50RG93bigpOwotICAgICAgICB9CisgICAgICBwdWJsaWMgdm9pZCBvbkNvbXBsZXRlKFZvaWQgcmVzcG9uc2UpIHsKKyAgICAgICAgcmV0dXJuZWQuc2V0KHRydWUpOworICAgICAgICBsYXRjaC5jb3VudERvd24oKTsKICAgICAgIH0KICAgICB9KTsKICAgICBsYXRjaC5hd2FpdCgxLCBUaW1lVW5pdC5TRUNPTkRTKTsKQEAgLTE0MCwxNyArMTk5LDExIEBACiAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggbGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CiAgICAgZmluYWwgQXRvbWljQm9vbGVhbiByZXR1cm5lZCA9IG5ldyBBdG9taWNCb29sZWFuKGZhbHNlKTsKICAgICBTcnYuQXN5bmNDbGllbnQgY2xpZW50ID0gZ2V0Q2xpZW50KCk7Ci0gICAgY2xpZW50Lm9uZXdheU1ldGhvZChuZXcgRmFpbHVyZUxlc3NDYWxsYmFjazxvbmV3YXlNZXRob2RfY2FsbD4oKSB7CisgICAgY2xpZW50Lm9uZXdheU1ldGhvZChuZXcgRmFpbHVyZUxlc3NDYWxsYmFjazxWb2lkPigpIHsKICAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIHZvaWQgb25Db21wbGV0ZShvbmV3YXlNZXRob2RfY2FsbCByZXNwb25zZSkgewotICAgICAgICB0cnkgewotICAgICAgICAgIHJlc3BvbnNlLmdldFJlc3VsdCgpOwotICAgICAgICAgIHJldHVybmVkLnNldCh0cnVlKTsKLSAgICAgICAgfSBjYXRjaCAoVEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgZmFpbChlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBsYXRjaC5jb3VudERvd24oKTsKLSAgICAgICAgfQorICAgICAgcHVibGljIHZvaWQgb25Db21wbGV0ZShWb2lkIHJlc3BvbnNlKSB7CisgICAgICAgIHJldHVybmVkLnNldCh0cnVlKTsKKyAgICAgICAgbGF0Y2guY291bnREb3duKCk7CiAgICAgICB9CiAgICAgfSk7CiAgICAgbGF0Y2guYXdhaXQoMSwgVGltZVVuaXQuU0VDT05EUyk7CkBAIC0xODgsMTcgKzI0MSwxMiBAQAogICBwcml2YXRlIHZvaWQgYmFzaWNDYWxsKFNydi5Bc3luY0NsaWVudCBjbGllbnQpIHRocm93cyBFeGNlcHRpb24gewogICAgIGZpbmFsIENvdW50RG93bkxhdGNoIGxhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKDEpOwogICAgIGZpbmFsIEF0b21pY0Jvb2xlYW4gcmV0dXJuZWQgPSBuZXcgQXRvbWljQm9vbGVhbihmYWxzZSk7Ci0gICAgY2xpZW50Lkphbmt5KDEsIG5ldyBGYWlsdXJlTGVzc0NhbGxiYWNrPFNydi5Bc3luY0NsaWVudC5KYW5reV9jYWxsPigpIHsKKyAgICBjbGllbnQuSmFua3koMSwgbmV3IEZhaWx1cmVMZXNzQ2FsbGJhY2s8SW50ZWdlcj4oKSB7CiAgICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyB2b2lkIG9uQ29tcGxldGUoSmFua3lfY2FsbCByZXNwb25zZSkgewotICAgICAgICB0cnkgewotICAgICAgICAgIGFzc2VydEVxdWFscygzLCByZXNwb25zZS5nZXRSZXN1bHQoKSk7Ci0gICAgICAgICAgcmV0dXJuZWQuc2V0KHRydWUpOwotICAgICAgICB9IGNhdGNoIChURXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICBmYWlsKGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGxhdGNoLmNvdW50RG93bigpOwotICAgICAgICB9CisgICAgICBwdWJsaWMgdm9pZCBvbkNvbXBsZXRlKEludGVnZXIgcmVzcG9uc2UpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIHJlc3BvbnNlLmludFZhbHVlKCkpOworICAgICAgICByZXR1cm5lZC5zZXQodHJ1ZSk7CisgICAgICAgIGxhdGNoLmNvdW50RG93bigpOwogICAgICAgfQogCiAgICAgICBAT3ZlcnJpZGUKQEAgLTI1MCw5ICsyOTgsMTggQEAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBvbmV3YXlNZXRob2QoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZGVjbGFyZWRFeGNlcHRpb25NZXRob2QoYm9vbGVhbiBzaG91bGRUaHJvd0RlY2xhcmVkKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICBpZiAoc2hvdWxkVGhyb3dEZWNsYXJlZCkgeworICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uV2l0aEFNYXAoImJsYWgiLCBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiVW5leHBlY3RlZCEiKTsKKyAgICAgIH0KKyAgICB9CiAgIH0KIAotICBwcml2YXRlIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBGYWlsdXJlTGVzc0NhbGxiYWNrPFQgZXh0ZW5kcyBUQXN5bmNNZXRob2RDYWxsPiBpbXBsZW1lbnRzIEFzeW5jTWV0aG9kQ2FsbGJhY2s8VD4geworICBwcml2YXRlIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBGYWlsdXJlTGVzc0NhbGxiYWNrPFQ+IGltcGxlbWVudHMgQXN5bmNNZXRob2RDYWxsYmFjazxUPiB7CiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgb25FcnJvcihFeGNlcHRpb24gZXhjZXB0aW9uKSB7CiAgICAgICBmYWlsKGV4Y2VwdGlvbik7CkBAIC0yODcsMTggKzM0NCwxMyBAQAogICAgICAgICAgIC8vIGNvbm5lY3QgYW4gYXN5bmMgY2xpZW50CiAgICAgICAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggbGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CiAgICAgICAgICAgZmluYWwgQXRvbWljQm9vbGVhbiByZXR1cm5lZCA9IG5ldyBBdG9taWNCb29sZWFuKGZhbHNlKTsKLSAgICAgICAgICBjbGllbnRfLkphbmt5KDEsIG5ldyBBc3luY01ldGhvZENhbGxiYWNrPFNydi5Bc3luY0NsaWVudC5KYW5reV9jYWxsPigpIHsKKyAgICAgICAgICBjbGllbnRfLkphbmt5KDEsIG5ldyBBc3luY01ldGhvZENhbGxiYWNrPEludGVnZXI+KCkgewogCiAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ29tcGxldGUoSmFua3lfY2FsbCByZXNwb25zZSkgewotICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygzLCByZXNwb25zZS5nZXRSZXN1bHQoKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuZWQuc2V0KHRydWUpOwotICAgICAgICAgICAgICAgIGxhdGNoLmNvdW50RG93bigpOwotICAgICAgICAgICAgICB9IGNhdGNoIChURXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBsYXRjaC5jb3VudERvd24oKTsKLSAgICAgICAgICAgICAgICBmYWlsKGUpOwotICAgICAgICAgICAgICB9CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNvbXBsZXRlKEludGVnZXIgcmVzdWx0KSB7CisgICAgICAgICAgICAgIGFzc2VydEVxdWFscygzLCByZXN1bHQuaW50VmFsdWUoKSk7CisgICAgICAgICAgICAgIHJldHVybmVkLnNldCh0cnVlKTsKKyAgICAgICAgICAgICAgbGF0Y2guY291bnREb3duKCk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIEBPdmVycmlkZQpAQCAtMzIzLDQgKzM3NSw0IEBACiAgICAgICB9CiAgICAgfQogICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9Qcm90b2NvbFRlc3RCYXNlLmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1Byb3RvY29sVGVzdEJhc2UuamF2YQppbmRleCAyYWMwMjExLi4wMzg2ZDgzIDEwMDY0NAotLS0gYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1Byb3RvY29sVGVzdEJhc2UuamF2YQorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1Byb3RvY29sVGVzdEJhc2UuamF2YQpAQCAtMzI3LDYgKzMyNywxMSBAQAogICAgICAgQE92ZXJyaWRlCiAgICAgICBwdWJsaWMgdm9pZCBvbmV3YXlNZXRob2QoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgICB9CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIGJvb2xlYW4gZGVjbGFyZWRFeGNlcHRpb25NZXRob2QoYm9vbGVhbiBzaG91bGRUaHJvdykgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgICByZXR1cm4gc2hvdWxkVGhyb3c7CisgICAgICB9CiAgICAgfTsKIAogICAgIFNydi5Qcm9jZXNzb3IgdGVzdFByb2Nlc3NvciA9IG5ldyBTcnYuUHJvY2Vzc29yKGhhbmRsZXIpOwpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UZXN0U2hvcnRTdGFjay5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UZXN0U2hvcnRTdGFjay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4ZTc4ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1Rlc3RTaG9ydFN0YWNrLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworcHVibGljIGNsYXNzIFRlc3RTaG9ydFN0YWNrIGV4dGVuZHMgVGVzdENhc2UgeworCisgIHB1YmxpYyB2b2lkIHRlc3RPcHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBTaG9ydFN0YWNrIHMgPSBuZXcgU2hvcnRTdGFjaygxKTsKKyAgICBzLnB1c2goKHNob3J0KTEwKTsKKyAgICBzLnB1c2goKHNob3J0KTExKTsKKyAgICBzLnB1c2goKHNob3J0KTEyKTsKKyAgICBhc3NlcnRFcXVhbHMoKHNob3J0KTEyLCBzLnBvcCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoKHNob3J0KTExLCBzLnBvcCgpKTsKKyAgICBzLnB1c2goKHNob3J0KTQwKTsKKyAgICBhc3NlcnRFcXVhbHMoKHNob3J0KTQwLCBzLnBvcCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoKHNob3J0KTEwLCBzLnBvcCgpKTsKKyAgICB0cnkgeworICAgICAgcy5wb3AoKTsKKyAgICAgIGZhaWwoInNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24hIik7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIC8vIHlheQorICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UZXN0VEpTT05Qcm90b2NvbC5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UZXN0VEpTT05Qcm90b2NvbC5qYXZhCmluZGV4IGQ3Mzc2YWMuLmMyY2ExZmEgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVGVzdFRKU09OUHJvdG9jb2wuamF2YQorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1Rlc3RUSlNPTlByb3RvY29sLmphdmEKQEAgLTE4LDYgKzE4LDEyIEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7CiAKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRKU09OUHJvdG9jb2w7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRNZW1vcnlCdWZmZXI7CisKIHB1YmxpYyBjbGFzcyBUZXN0VEpTT05Qcm90b2NvbCBleHRlbmRzIFByb3RvY29sVGVzdEJhc2UgewogICBAT3ZlcnJpZGUKICAgcHJvdGVjdGVkIFRQcm90b2NvbEZhY3RvcnkgZ2V0RmFjdG9yeSgpIHsKQEAgLTI4LDQgKzM0LDE1IEBACiAgIHByb3RlY3RlZCBib29sZWFuIGNhbkJlVXNlZE5ha2VkKCkgewogICAgIHJldHVybiBmYWxzZTsKICAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RFc2NhcGVkVW5pY29kZSgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICBTdHJpbmcganNvblN0cmluZyA9ICJcImhlbGxvIHVuaWNvZGUgXFx1MGUwMVxcdWQ4MzRcXHVkZDFlIHdvcmxkXCIiOworICAgIFN0cmluZyBleHBlY3RlZFN0cmluZyA9ICJoZWxsbyB1bmljb2RlIFx1MGUwMVx1ZDgzNFx1ZGQxZSB3b3JsZCI7CisKKyAgICBUTWVtb3J5QnVmZmVyIGJ1ZmZlciA9IG5ldyBUTWVtb3J5QnVmZmVyKDEwMDApOworICAgIFRKU09OUHJvdG9jb2wgcHJvdG9jb2wgPSBuZXcgVEpTT05Qcm90b2NvbChidWZmZXIpOworICAgIGJ1ZmZlci53cml0ZShqc29uU3RyaW5nLmdldEJ5dGVzKFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpKTsKKworICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFN0cmluZywgcHJvdG9jb2wucmVhZFN0cmluZygpKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UZXN0VFByb3RvY29sVXRpbC5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UZXN0VFByb3RvY29sVXRpbC5qYXZhCmluZGV4IDE5OWM3MDcuLjg5Y2Y1MzYgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVGVzdFRQcm90b2NvbFV0aWwuamF2YQorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1Rlc3RUUHJvdG9jb2xVdGlsLmphdmEKQEAgLTE4LDI0ICsxOCwxMCBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOwogCi1pbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogCi1pbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuRml4dHVyZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEJhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVERlc2VyaWFsaXplcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRTZXJpYWxpemVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyOwogCi1pbXBvcnQgdGhyaWZ0LnRlc3QuQ29tcGFjdFByb3RvVGVzdFN0cnVjdDsKLWltcG9ydCB0aHJpZnQudGVzdC5Ib2x5TW9sZXk7Ci1pbXBvcnQgdGhyaWZ0LnRlc3QuTmVzdGluZzsKLWltcG9ydCB0aHJpZnQudGVzdC5PbmVPZkVhY2g7Ci1pbXBvcnQgdGhyaWZ0LnRlc3QuU3J2OwogaW1wb3J0IHRocmlmdC50ZXN0Lkd1ZXNzUHJvdG9jb2xTdHJ1Y3Q7CiAKIHB1YmxpYyBjbGFzcyBUZXN0VFByb3RvY29sVXRpbCBleHRlbmRzIFRlc3RDYXNlIHsKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVGVzdFRTaW1wbGVKU09OUHJvdG9jb2wuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVGVzdFRTaW1wbGVKU09OUHJvdG9jb2wuamF2YQppbmRleCAzYmI2YTllLi45ZDEyNWIxIDEwMDY0NAotLS0gYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1Rlc3RUU2ltcGxlSlNPTlByb3RvY29sLmphdmEKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UZXN0VFNpbXBsZUpTT05Qcm90b2NvbC5qYXZhCkBAIC0xOCw3ICsxOCw3IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7CiAKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOwogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogCkBAIC0yNyw2ICsyNyw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRNZW1vcnlCdWZmZXI7CiAKIGltcG9ydCB0aHJpZnQudGVzdC5Db21wYWN0UHJvdG9UZXN0U3RydWN0OworaW1wb3J0IHRocmlmdC50ZXN0LkhvbHlNb2xleTsKIAogcHVibGljIGNsYXNzIFRlc3RUU2ltcGxlSlNPTlByb3RvY29sIGV4dGVuZHMgVGVzdENhc2UgewogICBwcml2YXRlIFRNZW1vcnlCdWZmZXIgYnVmOwpAQCAtMzksMTYgKzQwLDE2IEBACiAgIH0KIAogICBwcml2YXRlIFN0cmluZyBidWZUb1N0cmluZygpIHsKLSAgICB0cnkgewotICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygiVVRGLTgiKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgIH0KKyAgICByZXR1cm4gYnVmLnRvU3RyaW5nKFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpOwogICB9CiAKICAgcHVibGljIHZvaWQgdGVzdEhvbHlNb2xleSgpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICBGaXh0dXJlcy5ob2x5TW9sZXkud3JpdGUocHJvdG8pOwotICAgIGFzc2VydEVxdWFscygie1wiYmlnXCI6W3tcImltX3RydWVcIjoxLFwiaW1fZmFsc2VcIjowLFwiYV9iaXRlXCI6MzUsXCJpbnRlZ2VyMTZcIjoyNzAwMCxcImludGVnZXIzMlwiOjE2Nzc3MjE2LFwiaW50ZWdlcjY0XCI6NjAwMDAwMDAwMCxcImRvdWJsZV9wcmVjaXNpb25cIjozLjE0MTU5MjY1MzU4OTc5MyxcInNvbWVfY2hhcmFjdGVyc1wiOlwiSlNPTiBUSElTISBcXFwiXFx1MDAwMVwiLFwiem9tZ191bmljb2RlXCI6XCLTgOKFrs6dINCdzr/ihb/Qvsmh0LPQsM+B4oSOIM6RdHTOseKFvc6677+94oC8XCIsXCJ3aGF0X3dob1wiOjAsXCJiYXNlNjRcIjpcImJhc2U2NFwiLFwiYnl0ZV9saXN0XCI6WzEsMiwzXSxcImkxNl9saXN0XCI6WzEsMiwzXSxcImk2NF9saXN0XCI6WzEsMiwzXX0se1wiaW1fdHJ1ZVwiOjEsXCJpbV9mYWxzZVwiOjAsXCJhX2JpdGVcIjotNDIsXCJpbnRlZ2VyMTZcIjoyNzAwMCxcImludGVnZXIzMlwiOjE2Nzc3MjE2LFwiaW50ZWdlcjY0XCI6NjAwMDAwMDAwMCxcImRvdWJsZV9wcmVjaXNpb25cIjozLjE0MTU5MjY1MzU4OTc5MyxcInNvbWVfY2hhcmFjdGVyc1wiOlwiSlNPTiBUSElTISBcXFwiXFx1MDAwMVwiLFwiem9tZ191bmljb2RlXCI6XCLTgOKFrs6dINCdzr/ihb/Qvsmh0LPQsM+B4oSOIM6RdHTOseKFvc6677+94oC8XCIsXCJ3aGF0X3dob1wiOjAsXCJiYXNlNjRcIjpcImJhc2U2NFwiLFwiYnl0ZV9saXN0XCI6WzEsMiwzXSxcImkxNl9saXN0XCI6WzEsMiwzXSxcImk2NF9saXN0XCI6WzEsMiwzXX1dLFwiY29udGFpblwiOltbXSxbXCJ0aGVuIGEgb25lLCB0d29cIixcInRocmVlIVwiLFwiRk9VUiEhXCJdLFtcImFuZCBhIG9uZVwiLFwiYW5kIGEgdHdvXCJdXSxcImJvbmtzXCI6e1widHdvXCI6W3tcInR5cGVcIjoxLFwibWVzc2FnZVwiOlwiV2FpdC5cIn0se1widHlwZVwiOjIsXCJtZXNzYWdlXCI6XCJXaGF0P1wifV0sXCJ0aHJlZVwiOltdLFwiemVyb1wiOltdfX0iLCBidWZUb1N0cmluZygpKTsKKyAgICBmaW5hbCBIb2x5TW9sZXkgaG9seU1vbGV5ID0gRml4dHVyZXMuaG9seU1vbGV5LmRlZXBDb3B5KCk7CisgICAgLy8gdW5zZXQgc2V0cyB0aGF0IHByb2R1Y2UgaW5jb25zaXN0ZW50IG9yZGVyaW5nIGJldHdlZW4gSkRLNy84CisgICAgaG9seU1vbGV5LnVuc2V0Qm9ua3MoKTsKKyAgICBob2x5TW9sZXkudW5zZXRDb250YWluKCk7CisgICAgaG9seU1vbGV5LndyaXRlKHByb3RvKTsKKyAgICBhc3NlcnRFcXVhbHMoIntcImJpZ1wiOlt7XCJpbV90cnVlXCI6MSxcImltX2ZhbHNlXCI6MCxcImFfYml0ZVwiOjM1LFwiaW50ZWdlcjE2XCI6MjcwMDAsXCJpbnRlZ2VyMzJcIjoxNjc3NzIxNixcImludGVnZXI2NFwiOjYwMDAwMDAwMDAsXCJkb3VibGVfcHJlY2lzaW9uXCI6My4xNDE1OTI2NTM1ODk3OTMsXCJzb21lX2NoYXJhY3RlcnNcIjpcIkpTT04gVEhJUyEgXFxcIlxcdTAwMDFcIixcInpvbWdfdW5pY29kZVwiOlwi04Diha7OnSDQnc6/4oW/0L7JodCz0LDPgeKEjiDOkXR0zrHihb3Ouu+/veKAvFwiLFwid2hhdF93aG9cIjowLFwiYmFzZTY0XCI6XCJiYXNlNjRcIixcImJ5dGVfbGlzdFwiOlsxLDIsM10sXCJpMTZfbGlzdFwiOlsxLDIsM10sXCJpNjRfbGlzdFwiOlsxLDIsM119LHtcImltX3RydWVcIjoxLFwiaW1fZmFsc2VcIjowLFwiYV9iaXRlXCI6LTQyLFwiaW50ZWdlcjE2XCI6MjcwMDAsXCJpbnRlZ2VyMzJcIjoxNjc3NzIxNixcImludGVnZXI2NFwiOjYwMDAwMDAwMDAsXCJkb3VibGVfcHJlY2lzaW9uXCI6My4xNDE1OTI2NTM1ODk3OTMsXCJzb21lX2NoYXJhY3RlcnNcIjpcIkpTT04gVEhJUyEgXFxcIlxcdTAwMDFcIixcInpvbWdfdW5pY29kZVwiOlwi04Diha7OnSDQnc6/4oW/0L7JodCz0LDPgeKEjiDOkXR0zrHihb3Ouu+/veKAvFwiLFwid2hhdF93aG9cIjowLFwiYmFzZTY0XCI6XCJiYXNlNjRcIixcImJ5dGVfbGlzdFwiOlsxLDIsM10sXCJpMTZfbGlzdFwiOlsxLDIsM10sXCJpNjRfbGlzdFwiOlsxLDIsM119XX0iLCBidWZUb1N0cmluZygpKTsKICAgfQogCiAgIHB1YmxpYyB2b2lkIHRlc3ROZXN0aW5nKCkgdGhyb3dzIFRFeGNlcHRpb24gewpAQCAtNjcsOCArNjgsMTkgQEAKICAgICBzdHJ1Y3QudW5zZXRMaXN0X2J5dGVfbWFwKCk7CiAgICAgc3RydWN0LnVuc2V0U2V0X2J5dGVfbWFwKCk7CiAgICAgc3RydWN0LnVuc2V0TWFwX2J5dGVfbWFwKCk7CisgICAgLy8gdW5zZXQgc2V0cyBhbmQgbWFwcyB0aGF0IHByb2R1Y2UgaW5jb25zaXN0ZW50IG9yZGVyaW5nIGJldHdlZW4gSkRLNy84CisgICAgc3RydWN0LnVuc2V0Qnl0ZV9zZXQoKTsKKyAgICBzdHJ1Y3QudW5zZXRJMTZfc2V0KCk7CisgICAgc3RydWN0LnVuc2V0STY0X3NldCgpOworICAgIHN0cnVjdC51bnNldERvdWJsZV9zZXQoKTsKKyAgICBzdHJ1Y3QudW5zZXRTdHJpbmdfc2V0KCk7CisgICAgc3RydWN0LnVuc2V0STE2X2J5dGVfbWFwKCk7CisgICAgc3RydWN0LnVuc2V0STMyX2J5dGVfbWFwKCk7CisgICAgc3RydWN0LnVuc2V0STY0X2J5dGVfbWFwKCk7CisgICAgc3RydWN0LnVuc2V0RG91YmxlX2J5dGVfbWFwKCk7CisgICAgc3RydWN0LnVuc2V0U3RyaW5nX2J5dGVfbWFwKCk7CiAgICAgc3RydWN0LndyaXRlKHByb3RvKTsKLSAgICBhc3NlcnRFcXVhbHMoIntcImFfYnl0ZVwiOjEyNyxcImFfaTE2XCI6MzIwMDAsXCJhX2kzMlwiOjEwMDAwMDAwMDAsXCJhX2k2NFwiOjEwOTk1MTE2Mjc3NzUsXCJhX2RvdWJsZVwiOjUuNjc4OSxcImFfc3RyaW5nXCI6XCJteSBzdHJpbmdcIixcImFfYmluYXJ5XCI6XCJcXHUwMDAwXFx1MDAwMVxcdTAwMDJcXHUwMDAzXFx1MDAwNFxcdTAwMDVcXHUwMDA2XFx1MDAwN1xcYlwiLFwidHJ1ZV9maWVsZFwiOjEsXCJmYWxzZV9maWVsZFwiOjAsXCJlbXB0eV9zdHJ1Y3RfZmllbGRcIjp7fSxcImJ5dGVfbGlzdFwiOlstMTI3LC0xLDAsMSwxMjddLFwiaTE2X2xpc3RcIjpbLTEsMCwxLDMyNzY3XSxcImkzMl9saXN0XCI6Wy0xLDAsMjU1LDY1NTM1LDE2Nzc3MjE1LDIxNDc0ODM2NDddLFwiaTY0X2xpc3RcIjpbLTEsMCwyNTUsNjU1MzUsMTY3NzcyMTUsNDI5NDk2NzI5NSwxMDk5NTExNjI3Nzc1LDI4MTQ3NDk3NjcxMDY1NSw3MjA1NzU5NDAzNzkyNzkzNSw5MjIzMzcyMDM2ODU0Nzc1ODA3XSxcImRvdWJsZV9saXN0XCI6WzAuMSwwLjIsMC4zXSxcInN0cmluZ19saXN0XCI6W1wiZmlyc3RcIixcInNlY29uZFwiLFwidGhpcmRcIl0sXCJib29sZWFuX2xpc3RcIjpbMSwxLDEsMCwwLDBdLFwic3RydWN0X2xpc3RcIjpbe30se31dLFwiYnl0ZV9zZXRcIjpbMCwxLC0xMjcsMTI3LC0xXSxcImkxNl9zZXRcIjpbMCwxLDMyNzY3LC0xXSxcImkzMl9zZXRcIjpbMSwyLDNdLFwiaTY0X3NldFwiOls5MjIzMzcyMDM2ODU0Nzc1ODA3LDcyMDU3NTk0MDM3OTI3OTM1LDY1NTM1LDAsLTEsMjU1LDEwOTk1MTE2Mjc3NzUsMjgxNDc0OTc2NzEwNjU1LDQyOTQ5NjcyOTUsMTY3NzcyMTVdLFwiZG91YmxlX3NldFwiOlswLjEsMC4yLDAuM10sXCJzdHJpbmdfc2V0XCI6W1wic2Vjb25kXCIsXCJ0aGlyZFwiLFwiZmlyc3RcIl0sXCJib29sZWFuX3NldFwiOlswLDFdLFwic3RydWN0X3NldFwiOlt7fV0sXCJieXRlX2J5dGVfbWFwXCI6e1wiMVwiOjJ9LFwiaTE2X2J5dGVfbWFwXCI6e1wiMVwiOjEsXCIzMjc2N1wiOjEsXCItMVwiOjF9LFwiaTMyX2J5dGVfbWFwXCI6e1wiMVwiOjEsXCIyMTQ3NDgzNjQ3XCI6MSxcIi0xXCI6MX0sXCJpNjRfYnl0ZV9tYXBcIjp7XCI5MjIzMzcyMDM2ODU0Nzc1ODA3XCI6MSxcIi0xXCI6MSxcIjBcIjoxLFwiMVwiOjF9LFwiZG91YmxlX2J5dGVfbWFwXCI6e1wiMS4xXCI6MSxcIi0xLjFcIjoxfSxcInN0cmluZ19ieXRlX21hcFwiOntcIlwiOjAsXCJzZWNvbmRcIjoyLFwidGhpcmRcIjozLFwiZmlyc3RcIjoxfSxcImJvb2xlYW5fYnl0ZV9tYXBcIjp7XCIwXCI6MCxcIjFcIjoxfSxcImJ5dGVfaTE2X21hcFwiOntcIjFcIjoxLFwiMlwiOi0xLFwiM1wiOjMyNzY3fSxcImJ5dGVfaTMyX21hcFwiOntcIjFcIjoxLFwiMlwiOi0xLFwiM1wiOjIxNDc0ODM2NDd9LFwiYnl0ZV9pNjRfbWFwXCI6e1wiMVwiOjEsXCIyXCI6LTEsXCIzXCI6OTIyMzM3MjAzNjg1NDc3NTgwN30sXCJieXRlX2RvdWJsZV9tYXBcIjp7XCIxXCI6MC4xLFwiMlwiOi0wLjEsXCIzXCI6MTAwMDAwMC4wfSxcImJ5dGVfc3RyaW5nX21hcFwiOntcIjFcIjpcIlwiLFwiMlwiOlwiYmxhaFwiLFwiM1wiOlwibG9vb29vb29vb29vb29vbmcgc3RyaW5nXCJ9LFwiYnl0ZV9ib29sZWFuX21hcFwiOntcIjFcIjoxLFwiMlwiOjB9LFwiYnl0ZV9tYXBfbWFwXCI6e1wiMFwiOnt9LFwiMVwiOntcIjFcIjoxfSxcIjJcIjp7XCIxXCI6MSxcIjJcIjoyfX0sXCJieXRlX3NldF9tYXBcIjp7XCIwXCI6W10sXCIxXCI6WzFdLFwiMlwiOlsxLDJdfSxcImJ5dGVfbGlzdF9tYXBcIjp7XCIwXCI6W10sXCIxXCI6WzFdLFwiMlwiOlsxLDJdfX0iLCBidWZUb1N0cmluZygpKTsKKyAgICBhc3NlcnRFcXVhbHMoIntcImFfYnl0ZVwiOjEyNyxcImFfaTE2XCI6MzIwMDAsXCJhX2kzMlwiOjEwMDAwMDAwMDAsXCJhX2k2NFwiOjEwOTk1MTE2Mjc3NzUsXCJhX2RvdWJsZVwiOjUuNjc4OSxcImFfc3RyaW5nXCI6XCJteSBzdHJpbmdcIixcImFfYmluYXJ5XCI6XCJcXHUwMDAwXFx1MDAwMVxcdTAwMDJcXHUwMDAzXFx1MDAwNFxcdTAwMDVcXHUwMDA2XFx1MDAwN1xcYlwiLFwidHJ1ZV9maWVsZFwiOjEsXCJmYWxzZV9maWVsZFwiOjAsXCJlbXB0eV9zdHJ1Y3RfZmllbGRcIjp7fSxcImJ5dGVfbGlzdFwiOlstMTI3LC0xLDAsMSwxMjddLFwiaTE2X2xpc3RcIjpbLTEsMCwxLDMyNzY3XSxcImkzMl9saXN0XCI6Wy0xLDAsMjU1LDY1NTM1LDE2Nzc3MjE1LDIxNDc0ODM2NDddLFwiaTY0X2xpc3RcIjpbLTEsMCwyNTUsNjU1MzUsMTY3NzcyMTUsNDI5NDk2NzI5NSwxMDk5NTExNjI3Nzc1LDI4MTQ3NDk3NjcxMDY1NSw3MjA1NzU5NDAzNzkyNzkzNSw5MjIzMzcyMDM2ODU0Nzc1ODA3XSxcImRvdWJsZV9saXN0XCI6WzAuMSwwLjIsMC4zXSxcInN0cmluZ19saXN0XCI6W1wiZmlyc3RcIixcInNlY29uZFwiLFwidGhpcmRcIl0sXCJib29sZWFuX2xpc3RcIjpbMSwxLDEsMCwwLDBdLFwic3RydWN0X2xpc3RcIjpbe30se31dLFwiaTMyX3NldFwiOlsxLDIsM10sXCJib29sZWFuX3NldFwiOlswLDFdLFwic3RydWN0X3NldFwiOlt7fV0sXCJieXRlX2J5dGVfbWFwXCI6e1wiMVwiOjJ9LFwiYm9vbGVhbl9ieXRlX21hcFwiOntcIjBcIjowLFwiMVwiOjF9LFwiYnl0ZV9pMTZfbWFwXCI6e1wiMVwiOjEsXCIyXCI6LTEsXCIzXCI6MzI3Njd9LFwiYnl0ZV9pMzJfbWFwXCI6e1wiMVwiOjEsXCIyXCI6LTEsXCIzXCI6MjE0NzQ4MzY0N30sXCJieXRlX2k2NF9tYXBcIjp7XCIxXCI6MSxcIjJcIjotMSxcIjNcIjo5MjIzMzcyMDM2ODU0Nzc1ODA3fSxcImJ5dGVfZG91YmxlX21hcFwiOntcIjFcIjowLjEsXCIyXCI6LTAuMSxcIjNcIjoxMDAwMDAwLjF9LFwiYnl0ZV9zdHJpbmdfbWFwXCI6e1wiMVwiOlwiXCIsXCIyXCI6XCJibGFoXCIsXCIzXCI6XCJsb29vb29vb29vb29vb29uZyBzdHJpbmdcIn0sXCJieXRlX2Jvb2xlYW5fbWFwXCI6e1wiMVwiOjEsXCIyXCI6MH0sXCJieXRlX21hcF9tYXBcIjp7XCIwXCI6e30sXCIxXCI6e1wiMVwiOjF9LFwiMlwiOntcIjFcIjoxLFwiMlwiOjJ9fSxcImJ5dGVfc2V0X21hcFwiOntcIjBcIjpbXSxcIjFcIjpbMV0sXCIyXCI6WzEsMl19LFwiYnl0ZV9saXN0X21hcFwiOntcIjBcIjpbXSxcIjFcIjpbMV0sXCIyXCI6WzEsMl19fSIsIGJ1ZlRvU3RyaW5nKCkpOwogICB9CiAKICAgcHVibGljIHZvaWQgdGVzdFRocm93c09uQ29sbGVjdGlvbktleXMoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9TZXJ2ZXJUZXN0QmFzZS5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvU2VydmVyVGVzdEJhc2UuamF2YQpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IDRjYmI1MTEuLjFkZWUyMmQKLS0tIGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvU2VydmVyVGVzdEJhc2UuamF2YQorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9TZXJ2ZXJUZXN0QmFzZS5qYXZhCkBAIC0yNiw2ICsyNiw4IEBACiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogCitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKKwogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIAogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CkBAIC01MiwzOCArNTQsNTQgQEAKIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTZXJ2ZXJUZXN0QmFzZSBleHRlbmRzIFRlc3RDYXNlIHsKIAogICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RIYW5kbGVyIGltcGxlbWVudHMgVGhyaWZ0VGVzdC5JZmFjZSB7Ci0gIAorCiAgICAgcHVibGljIFRlc3RIYW5kbGVyKCkge30KLSAgCisKICAgICBwdWJsaWMgdm9pZCB0ZXN0Vm9pZCgpIHsKICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RWb2lkKClcbiIpOwogICAgIH0KLSAgCisKICAgICBwdWJsaWMgU3RyaW5nIHRlc3RTdHJpbmcoU3RyaW5nIHRoaW5nKSB7CiAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0U3RyaW5nKFwiIiArIHRoaW5nICsgIlwiKVxuIik7CiAgICAgICByZXR1cm4gdGhpbmc7CiAgICAgfQotICAKKworICAgIHB1YmxpYyBib29sZWFuIHRlc3RCb29sKGJvb2xlYW4gdGhpbmcpIHsKKyAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RCb29sKCIgKyB0aGluZyArICIpXG4iKTsKKyAgICAgIHJldHVybiB0aGluZzsKKyAgICB9CisKICAgICBwdWJsaWMgYnl0ZSB0ZXN0Qnl0ZShieXRlIHRoaW5nKSB7CiAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0Qnl0ZSgiICsgdGhpbmcgKyAiKVxuIik7CiAgICAgICByZXR1cm4gdGhpbmc7CiAgICAgfQotICAKKwogICAgIHB1YmxpYyBpbnQgdGVzdEkzMihpbnQgdGhpbmcpIHsKICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RJMzIoIiArIHRoaW5nICsgIilcbiIpOwogICAgICAgcmV0dXJuIHRoaW5nOwogICAgIH0KLSAgCisKICAgICBwdWJsaWMgbG9uZyB0ZXN0STY0KGxvbmcgdGhpbmcpIHsKICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RJNjQoIiArIHRoaW5nICsgIilcbiIpOwogICAgICAgcmV0dXJuIHRoaW5nOwogICAgIH0KLSAgCisKICAgICBwdWJsaWMgZG91YmxlIHRlc3REb3VibGUoZG91YmxlIHRoaW5nKSB7CiAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0RG91YmxlKCIgKyB0aGluZyArICIpXG4iKTsKICAgICAgIHJldHVybiB0aGluZzsKICAgICB9Ci0gIAorCisgICAgcHVibGljIEJ5dGVCdWZmZXIgdGVzdEJpbmFyeShCeXRlQnVmZmVyIHRoaW5nKSB7CisgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIodGhpbmcucmVtYWluaW5nKCkgKiAzKTsKKyAgICAgIHRoaW5nLm1hcmsoKTsKKyAgICAgIHdoaWxlICh0aGluZy5yZW1haW5pbmcoKSA+IDApIHsKKyAgICAgICAgc2IuYXBwZW5kKFN0cmluZy5mb3JtYXQoIiUwMlggIiwgdGhpbmcuZ2V0KCkpKTsKKyAgICAgIH0KKyAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RCaW5hcnkoIiArIHNiLnRvU3RyaW5nKCkgKyAiKVxuIik7CisgICAgICB0aGluZy5yZXNldCgpOworICAgICAgcmV0dXJuIHRoaW5nOworICAgIH0KKwogICAgIHB1YmxpYyBYdHJ1Y3QgdGVzdFN0cnVjdChYdHJ1Y3QgdGhpbmcpIHsKICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RTdHJ1Y3QoeyIgKwogICAgICAgICAgICAgICAgICAgICAgICAiXCIiICsgdGhpbmcuc3RyaW5nX3RoaW5nICsgIlwiLCAiICsKQEAgLTkyLDcgKzExMCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgIHRoaW5nLmk2NF90aGluZyArICJ9KVxuIik7CiAgICAgICByZXR1cm4gdGhpbmc7CiAgICAgfQotICAKKwogICAgIHB1YmxpYyBYdHJ1Y3QyIHRlc3ROZXN0KFh0cnVjdDIgbmVzdCkgewogICAgICAgWHRydWN0IHRoaW5nID0gbmVzdC5zdHJ1Y3RfdGhpbmc7CiAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0TmVzdCh7IiArCkBAIC0xMDQsNyArMTIyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgbmVzdC5pMzJfdGhpbmcgKyAifSlcbiIpOwogICAgICAgcmV0dXJuIG5lc3Q7CiAgICAgfQotICAKKwogICAgIHB1YmxpYyBNYXA8SW50ZWdlcixJbnRlZ2VyPiB0ZXN0TWFwKE1hcDxJbnRlZ2VyLEludGVnZXI+IHRoaW5nKSB7CiAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0TWFwKHsiKTsKICAgICAgIFN5c3RlbS5vdXQucHJpbnQodGhpbmcpOwpAQCAtMTE4LDcgKzEzNiw3IEBACiAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ9KVxuIik7CiAgICAgICByZXR1cm4gdGhpbmc7CiAgICAgfQotICAKKwogICAgIHB1YmxpYyBTZXQ8SW50ZWdlcj4gdGVzdFNldChTZXQ8SW50ZWdlcj4gdGhpbmcpIHsKICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RTZXQoeyIpOwogICAgICAgYm9vbGVhbiBmaXJzdCA9IHRydWU7CkBAIC0xMzMsNyArMTUxLDcgQEAKICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIn0pXG4iKTsKICAgICAgIHJldHVybiB0aGluZzsKICAgICB9Ci0gIAorCiAgICAgcHVibGljIExpc3Q8SW50ZWdlcj4gdGVzdExpc3QoTGlzdDxJbnRlZ2VyPiB0aGluZykgewogICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdExpc3QoeyIpOwogICAgICAgYm9vbGVhbiBmaXJzdCA9IHRydWU7CkBAIC0xNDgsNzggKzE2Niw1OCBAQAogICAgICAgU3lzdGVtLm91dC5wcmludCgifSlcbiIpOwogICAgICAgcmV0dXJuIHRoaW5nOwogICAgIH0KLSAgCisKICAgICBwdWJsaWMgTnVtYmVyeiB0ZXN0RW51bShOdW1iZXJ6IHRoaW5nKSB7CiAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0RW51bSgiICsgdGhpbmcgKyAiKVxuIik7CiAgICAgICByZXR1cm4gdGhpbmc7CiAgICAgfQotICAKKwogICAgIHB1YmxpYyBsb25nIHRlc3RUeXBlZGVmKGxvbmcgdGhpbmcpIHsKICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RUeXBlZGVmKCIgKyB0aGluZyArICIpXG4iKTsKICAgICAgIHJldHVybiB0aGluZzsKICAgICB9Ci0gIAorCiAgICAgcHVibGljIE1hcDxJbnRlZ2VyLE1hcDxJbnRlZ2VyLEludGVnZXI+PiB0ZXN0TWFwTWFwKGludCBoZWxsbykgewogICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdE1hcE1hcCgiICsgaGVsbG8gKyAiKVxuIik7CiAgICAgICBNYXA8SW50ZWdlcixNYXA8SW50ZWdlcixJbnRlZ2VyPj4gbWFwbWFwID0KICAgICAgICAgbmV3IEhhc2hNYXA8SW50ZWdlcixNYXA8SW50ZWdlcixJbnRlZ2VyPj4oKTsKLSAgCisKICAgICAgIEhhc2hNYXA8SW50ZWdlcixJbnRlZ2VyPiBwb3MgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLEludGVnZXI+KCk7CiAgICAgICBIYXNoTWFwPEludGVnZXIsSW50ZWdlcj4gbmVnID0gbmV3IEhhc2hNYXA8SW50ZWdlcixJbnRlZ2VyPigpOwogICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCA1OyBpKyspIHsKICAgICAgICAgcG9zLnB1dChpLCBpKTsKICAgICAgICAgbmVnLnB1dCgtaSwgLWkpOwogICAgICAgfQotICAKKwogICAgICAgbWFwbWFwLnB1dCg0LCBwb3MpOwogICAgICAgbWFwbWFwLnB1dCgtNCwgbmVnKTsKLSAgCisKICAgICAgIHJldHVybiBtYXBtYXA7CiAgICAgfQotICAKKwogICAgIHB1YmxpYyBNYXA8TG9uZywgTWFwPE51bWJlcnosSW5zYW5pdHk+PiB0ZXN0SW5zYW5pdHkoSW5zYW5pdHkgYXJndW1lbnQpIHsKICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RJbnNhbml0eSgpXG4iKTsKLSAgCi0gICAgICBYdHJ1Y3QgaGVsbG8gPSBuZXcgWHRydWN0KCk7Ci0gICAgICBoZWxsby5zdHJpbmdfdGhpbmcgPSAiSGVsbG8yIjsKLSAgICAgIGhlbGxvLmJ5dGVfdGhpbmcgPSAyOwotICAgICAgaGVsbG8uaTMyX3RoaW5nID0gMjsKLSAgICAgIGhlbGxvLmk2NF90aGluZyA9IDI7Ci0gIAotICAgICAgWHRydWN0IGdvb2RieWUgPSBuZXcgWHRydWN0KCk7Ci0gICAgICBnb29kYnllLnN0cmluZ190aGluZyA9ICJHb29kYnllNCI7Ci0gICAgICBnb29kYnllLmJ5dGVfdGhpbmcgPSAoYnl0ZSk0OwotICAgICAgZ29vZGJ5ZS5pMzJfdGhpbmcgPSA0OwotICAgICAgZ29vZGJ5ZS5pNjRfdGhpbmcgPSAobG9uZyk0OwotICAKLSAgICAgIEluc2FuaXR5IGNyYXp5ID0gbmV3IEluc2FuaXR5KCk7Ci0gICAgICBjcmF6eS51c2VyTWFwID0gbmV3IEhhc2hNYXA8TnVtYmVyeiwgTG9uZz4oKTsKLSAgICAgIGNyYXp5LnVzZXJNYXAucHV0KE51bWJlcnouRUlHSFQsIChsb25nKTgpOwotICAgICAgY3JhenkudXNlck1hcC5wdXQoTnVtYmVyei5GSVZFLCAobG9uZyk1KTsKLSAgICAgIGNyYXp5Lnh0cnVjdHMgPSBuZXcgQXJyYXlMaXN0PFh0cnVjdD4oKTsKLSAgICAgIGNyYXp5Lnh0cnVjdHMuYWRkKGdvb2RieWUpOwotICAgICAgY3JhenkueHRydWN0cy5hZGQoaGVsbG8pOwotICAKKwogICAgICAgSGFzaE1hcDxOdW1iZXJ6LEluc2FuaXR5PiBmaXJzdF9tYXAgPSBuZXcgSGFzaE1hcDxOdW1iZXJ6LCBJbnNhbml0eT4oKTsKICAgICAgIEhhc2hNYXA8TnVtYmVyeixJbnNhbml0eT4gc2Vjb25kX21hcCA9IG5ldyBIYXNoTWFwPE51bWJlcnosIEluc2FuaXR5PigpOzsKLSAgCi0gICAgICBmaXJzdF9tYXAucHV0KE51bWJlcnouVFdPLCBjcmF6eSk7Ci0gICAgICBmaXJzdF9tYXAucHV0KE51bWJlcnouVEhSRUUsIGNyYXp5KTsKLSAgCisKKyAgICAgIGZpcnN0X21hcC5wdXQoTnVtYmVyei5UV08sIGFyZ3VtZW50KTsKKyAgICAgIGZpcnN0X21hcC5wdXQoTnVtYmVyei5USFJFRSwgYXJndW1lbnQpOworCiAgICAgICBJbnNhbml0eSBsb29uZXkgPSBuZXcgSW5zYW5pdHkoKTsKICAgICAgIHNlY29uZF9tYXAucHV0KE51bWJlcnouU0lYLCBsb29uZXkpOwotICAKKwogICAgICAgTWFwPExvbmcsTWFwPE51bWJlcnosSW5zYW5pdHk+PiBpbnNhbmUgPQogICAgICAgICBuZXcgSGFzaE1hcDxMb25nLCBNYXA8TnVtYmVyeixJbnNhbml0eT4+KCk7CiAgICAgICBpbnNhbmUucHV0KChsb25nKTEsIGZpcnN0X21hcCk7CiAgICAgICBpbnNhbmUucHV0KChsb25nKTIsIHNlY29uZF9tYXApOwotICAKKwogICAgICAgcmV0dXJuIGluc2FuZTsKICAgICB9Ci0gIAorCiAgICAgcHVibGljIFh0cnVjdCB0ZXN0TXVsdGkoYnl0ZSBhcmcwLCBpbnQgYXJnMSwgbG9uZyBhcmcyLCBNYXA8U2hvcnQsU3RyaW5nPiBhcmczLCBOdW1iZXJ6IGFyZzQsIGxvbmcgYXJnNSkgewogICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdE11bHRpKClcbiIpOwotICAKKwogICAgICAgWHRydWN0IGhlbGxvID0gbmV3IFh0cnVjdCgpOzsKICAgICAgIGhlbGxvLnN0cmluZ190aGluZyA9ICJIZWxsbzIiOwogICAgICAgaGVsbG8uYnl0ZV90aGluZyA9IGFyZzA7CkBAIC0yMjcsMjMgKzIyNSwyNCBAQAogICAgICAgaGVsbG8uaTY0X3RoaW5nID0gYXJnMjsKICAgICAgIHJldHVybiBoZWxsbzsKICAgICB9Ci0gIAorCiAgICAgcHVibGljIHZvaWQgdGVzdEV4Y2VwdGlvbihTdHJpbmcgYXJnKSB0aHJvd3MgWGNlcHRpb24sIFRFeGNlcHRpb24gewogICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdEV4Y2VwdGlvbigiK2FyZysiKVxuIik7Ci0gICAgICBpZiAoYXJnLmVxdWFscygiWGNlcHRpb24iKSkgeworICAgICAgaWYgKCJYY2VwdGlvbiIuZXF1YWxzKGFyZykpIHsKICAgICAgICAgWGNlcHRpb24geCA9IG5ldyBYY2VwdGlvbigpOwogICAgICAgICB4LmVycm9yQ29kZSA9IDEwMDE7CiAgICAgICAgIHgubWVzc2FnZSA9IGFyZzsKICAgICAgICAgdGhyb3cgeDsKLSAgICAgIH0gZWxzZSBpZiAoYXJnLmVxdWFscygiVEV4Y2VwdGlvbiIpKSB7Ci0gICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKGFyZyk7CisgICAgICB9IGVsc2UgaWYgKCJURXhjZXB0aW9uIi5lcXVhbHMoYXJnKSkgeworICAgICAgICAvLyBVbnNwZWNpZmllZCBleGNlcHRpb24gc2hvdWxkIHlpZWxkIGEgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIG9uIGNsaWVudCBzaWRlCisgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGFyZyk7CiAgICAgICB9IGVsc2UgewogICAgICAgICBYdHJ1Y3QgcmVzdWx0ID0gbmV3IFh0cnVjdCgpOwogICAgICAgICByZXN1bHQuc3RyaW5nX3RoaW5nID0gYXJnOwogICAgICAgfQogICAgICAgcmV0dXJuOwogICAgIH0KLSAgCisKICAgICBwdWJsaWMgWHRydWN0IHRlc3RNdWx0aUV4Y2VwdGlvbihTdHJpbmcgYXJnMCwgU3RyaW5nIGFyZzEpIHRocm93cyBYY2VwdGlvbiwgWGNlcHRpb24yIHsKICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RNdWx0aUV4Y2VwdGlvbigiICsgYXJnMCArICIsICIgKyBhcmcxICsgIilcbiIpOwogICAgICAgaWYgKGFyZzAuZXF1YWxzKCJYY2VwdGlvbiIpKSB7CkBAIC0yNTgsMTcgKzI1NywxNyBAQAogICAgICAgICB4LnN0cnVjdF90aGluZy5zdHJpbmdfdGhpbmcgPSAiVGhpcyBpcyBhbiBYY2VwdGlvbjIiOwogICAgICAgICB0aHJvdyB4OwogICAgICAgfQotICAKKwogICAgICAgWHRydWN0IHJlc3VsdCA9IG5ldyBYdHJ1Y3QoKTsKICAgICAgIHJlc3VsdC5zdHJpbmdfdGhpbmcgPSBhcmcxOwogICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9Ci0gIAorCiAgICAgcHVibGljIHZvaWQgdGVzdE9uZXdheShpbnQgc2xlZXBGb3IpIHsKICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigidGVzdE9uZXdheSgiICsgSW50ZWdlci50b1N0cmluZyhzbGVlcEZvcikgKwogICAgICAgICAgICAgICAgICAgICAgICAgICIpID0+IHNsZWVwaW5nLi4uIik7CiAgICAgICB0cnkgewotICAgICAgICBUaHJlYWQuc2xlZXAoc2xlZXBGb3IgKiAxMDAwKTsKKyAgICAgICAgVGhyZWFkLnNsZWVwKHNsZWVwRm9yICogU0xFRVBfREVMQVkpOwogICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRvbmUgc2xlZXBpbmchIik7CiAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewogICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihpZSk7CkBAIC0yODMsNyArMjgyLDggQEAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSE9TVCA9ICJsb2NhbGhvc3QiOwogICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQT1JUID0gSW50ZWdlci52YWx1ZU9mKAogICAgIFN5c3RlbS5nZXRQcm9wZXJ0eSgidGVzdC5wb3J0IiwgIjkwOTAiKSk7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFNPQ0tFVF9USU1FT1VUID0gMTAwMDsKKyAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgU0xFRVBfREVMQVkgPSAxMDAwOworICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBTT0NLRVRfVElNRU9VVCA9IDE1MDA7CiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFh0cnVjdCBYU1RSVUNUID0gbmV3IFh0cnVjdCgiWmVybyIsIChieXRlKSAxLCAtMywgLTUpOwogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBYdHJ1Y3QyIFhTVFJVQ1QyID0gbmV3IFh0cnVjdDIoKGJ5dGUpMSwgWFNUUlVDVCwgNSk7CiAKQEAgLTI5Nyw2ICsyOTcsMTMgQEAKIAogICBwdWJsaWMgYWJzdHJhY3QgVFRyYW5zcG9ydCBnZXRDbGllbnRUcmFuc3BvcnQoVFRyYW5zcG9ydCB1bmRlcmx5aW5nVHJhbnNwb3J0KSB0aHJvd3MgRXhjZXB0aW9uOwogCisgIHByaXZhdGUgdm9pZCB0ZXN0Qm9vbChUaHJpZnRUZXN0LkNsaWVudCB0ZXN0Q2xpZW50KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgYm9vbGVhbiB0ID0gdGVzdENsaWVudC50ZXN0Qm9vbCh0cnVlKTsKKyAgICBhc3NlcnRFcXVhbHModHJ1ZSwgdCk7CisgICAgYm9vbGVhbiBmID0gdGVzdENsaWVudC50ZXN0Qm9vbChmYWxzZSk7CisgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBmKTsKKyAgfQorCiAgIHByaXZhdGUgdm9pZCB0ZXN0Qnl0ZShUaHJpZnRUZXN0LkNsaWVudCB0ZXN0Q2xpZW50KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgYnl0ZSBpOCA9IHRlc3RDbGllbnQudGVzdEJ5dGUoKGJ5dGUpMSk7CiAgICAgYXNzZXJ0RXF1YWxzKDEsIGk4KTsKQEAgLTMyOCw3ICszMzUsNyBAQAogICAvLyB0b2RvOiBhZGQgYXNzZXJ0aW9ucwogICBwcml2YXRlIHZvaWQgdGVzdEluc2FuaXR5KFRocmlmdFRlc3QuQ2xpZW50IHRlc3RDbGllbnQpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICBJbnNhbml0eSBpbnNhbmU7Ci0gIAorCiAgICAgaW5zYW5lID0gbmV3IEluc2FuaXR5KCk7CiAgICAgaW5zYW5lLnVzZXJNYXAgPSBuZXcgSGFzaE1hcDxOdW1iZXJ6LCBMb25nPigpOwogICAgIGluc2FuZS51c2VyTWFwLnB1dChOdW1iZXJ6LkZJVkUsIChsb25nKTUwMDApOwpAQCAtMzQ2LDcgKzM1Myw3IEBACiAgICAgZm9yIChsb25nIGtleSA6IHdob2Eua2V5U2V0KCkpIHsKICAgICAgIE1hcDxOdW1iZXJ6LEluc2FuaXR5PiB2YWwgPSB3aG9hLmdldChrZXkpOwogICAgICAgU3lzdGVtLm91dC5wcmludChrZXkgKyAiID0+IHsiKTsKLSAgCisKICAgICAgIGZvciAoTnVtYmVyeiBrMiA6IHZhbC5rZXlTZXQoKSkgewogICAgICAgICBJbnNhbml0eSB2MiA9IHZhbC5nZXQoazIpOwogICAgICAgICBTeXN0ZW0ub3V0LnByaW50KGsyICsgIiA9PiB7Iik7CkBAIC0zNTgsNyArMzY1LDcgQEAKICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgU3lzdGVtLm91dC5wcmludCgifSwgIik7Ci0gIAorCiAgICAgICAgIExpc3Q8WHRydWN0PiB4dHJ1Y3RzID0gdjIueHRydWN0czsKICAgICAgICAgU3lzdGVtLm91dC5wcmludCgieyIpOwogICAgICAgICBpZiAoeHRydWN0cyAhPSBudWxsKSB7CkBAIC0zNjcsNyArMzc0LDcgQEAKICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgU3lzdGVtLm91dC5wcmludCgifSIpOwotICAKKwogICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ9LCAiKTsKICAgICAgIH0KICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIn0sICIpOwpAQCAtMzgyLDcgKzM4OSw3IEBACiAgIHB1YmxpYyB2b2lkIHRlc3RJdCgpIHRocm93cyBFeGNlcHRpb24gewogCiAgICAgZm9yIChUUHJvdG9jb2xGYWN0b3J5IHByb3RvRmFjdG9yeSA6IGdldFByb3RvY29scygpKSB7Ci0gICAgICBUUHJvY2Vzc29yIHByb2Nlc3NvciA9IHVzZUFzeW5jUHJvY2Vzc29yKCkgPyBuZXcgVGhyaWZ0VGVzdC5Bc3luY1Byb2Nlc3NvcihuZXcgQXN5bmNUZXN0SGFuZGxlcigpKSA6IG5ldyBUaHJpZnRUZXN0LlByb2Nlc3NvcihuZXcgVGVzdEhhbmRsZXIoKSk7CisgICAgICBUUHJvY2Vzc29yIHByb2Nlc3NvciA9IHVzZUFzeW5jUHJvY2Vzc29yKCkgPyBuZXcgVGhyaWZ0VGVzdC5Bc3luY1Byb2Nlc3NvcjxBc3luY1Rlc3RIYW5kbGVyPihuZXcgQXN5bmNUZXN0SGFuZGxlcigpKSA6IG5ldyBUaHJpZnRUZXN0LlByb2Nlc3NvcjxUZXN0SGFuZGxlcj4obmV3IFRlc3RIYW5kbGVyKCkpOwogCiAgICAgICBzdGFydFNlcnZlcihwcm9jZXNzb3IsIHByb3RvRmFjdG9yeSk7CiAKQEAgLTM5Niw2ICs0MDMsNyBAQAogICAgICAgb3Blbih0cmFuc3BvcnQpOwogICAgICAgdGVzdFZvaWQodGVzdENsaWVudCk7CiAgICAgICB0ZXN0U3RyaW5nKHRlc3RDbGllbnQpOworICAgICAgdGVzdEJvb2wodGVzdENsaWVudCk7CiAgICAgICB0ZXN0Qnl0ZSh0ZXN0Q2xpZW50KTsKICAgICAgIHRlc3RJMzIodGVzdENsaWVudCk7CiAgICAgICB0ZXN0STY0KHRlc3RDbGllbnQpOwpAQCAtNDEwLDkgKzQxOCwxMSBAQAogICAgICAgdGVzdFR5cGVkZWYodGVzdENsaWVudCk7CiAgICAgICB0ZXN0TmVzdGVkTWFwKHRlc3RDbGllbnQpOwogICAgICAgdGVzdEluc2FuaXR5KHRlc3RDbGllbnQpOwotICAgICAgdGVzdE9uZXdheSh0ZXN0Q2xpZW50KTsKICAgICAgIHRlc3RFeGNlcHRpb24odGVzdENsaWVudCk7CisgICAgICB0ZXN0T25ld2F5KHRlc3RDbGllbnQpOworICAgICAgdGVzdEkzMih0ZXN0Q2xpZW50KTsKICAgICAgIHRyYW5zcG9ydC5jbG9zZSgpOworICAgICAgc29ja2V0LmNsb3NlKCk7CiAKICAgICAgIHN0b3BTZXJ2ZXIoKTsKICAgICB9CkBAIC00MjMsNyArNDMzLDcgQEAKICAgfQogCiAgIHB1YmxpYyBMaXN0PFRQcm90b2NvbEZhY3Rvcnk+IGdldFByb3RvY29scygpIHsKLSAgICByZXR1cm4gUFJPVE9DT0xTOyAgCisgICAgcmV0dXJuIFBST1RPQ09MUzsKICAgfQogCiAgIHByaXZhdGUgdm9pZCB0ZXN0TGlzdChUaHJpZnRUZXN0LkNsaWVudCB0ZXN0Q2xpZW50KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CkBAIC00NTksMTQgKzQ2OSwxNCBAQAogICAgICAgdGVzdENsaWVudC50ZXN0TWFwTWFwKDEpOwogICAgIE1hcDxJbnRlZ2VyLE1hcDxJbnRlZ2VyLEludGVnZXI+PiBtYXBtYXAgPQogICAgICAgbmV3IEhhc2hNYXA8SW50ZWdlcixNYXA8SW50ZWdlcixJbnRlZ2VyPj4oKTsKLSAgCisKICAgICBIYXNoTWFwPEludGVnZXIsSW50ZWdlcj4gcG9zID0gbmV3IEhhc2hNYXA8SW50ZWdlcixJbnRlZ2VyPigpOwogICAgIEhhc2hNYXA8SW50ZWdlcixJbnRlZ2VyPiBuZWcgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLEludGVnZXI+KCk7CiAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCA1OyBpKyspIHsKICAgICAgIHBvcy5wdXQoaSwgaSk7CiAgICAgICBuZWcucHV0KC1pLCAtaSk7CiAgICAgfQotICAKKwogICAgIG1hcG1hcC5wdXQoNCwgcG9zKTsKICAgICBtYXBtYXAucHV0KC00LCBuZWcpOwogICAgIGFzc2VydEVxdWFscyhtYXBtYXAsIG1tKTsKQEAgLTQ3OCw3ICs0ODgsMTAgQEAKICAgfQogCiAgIHByaXZhdGUgdm9pZCB0ZXN0T25ld2F5KFRocmlmdFRlc3QuQ2xpZW50IHRlc3RDbGllbnQpIHRocm93cyBFeGNlcHRpb24gewotICAgIHRlc3RDbGllbnQudGVzdE9uZXdheSgzKTsKKyAgICBsb25nIGJlZ2luID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgdGVzdENsaWVudC50ZXN0T25ld2F5KDEpOworICAgIGxvbmcgZWxhcHNlZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gYmVnaW47CisgICAgYXNzZXJ0VHJ1ZShlbGFwc2VkIDwgNTAwKTsKICAgfQogCiAgIHByaXZhdGUgdm9pZCB0ZXN0U2V0KFRocmlmdFRlc3QuQ2xpZW50IHRlc3RDbGllbnQpIHRocm93cyBURXhjZXB0aW9uIHsKQEAgLTUyMywxNTMgKzUzNiwxNzYgQEAKICAgfQogCiAgIHB1YmxpYyB2b2lkIHRlc3RUcmFuc3BvcnRGYWN0b3J5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgCiAgICAgZm9yIChUUHJvdG9jb2xGYWN0b3J5IHByb3RvRmFjdG9yeSA6IGdldFByb3RvY29scygpKSB7CiAgICAgICBUZXN0SGFuZGxlciBoYW5kbGVyID0gbmV3IFRlc3RIYW5kbGVyKCk7Ci0gICAgICBUaHJpZnRUZXN0LlByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgVGhyaWZ0VGVzdC5Qcm9jZXNzb3IoaGFuZGxlcik7Ci0gIAorICAgICAgVGhyaWZ0VGVzdC5Qcm9jZXNzb3I8VGVzdEhhbmRsZXI+IHByb2Nlc3NvciA9IG5ldyBUaHJpZnRUZXN0LlByb2Nlc3NvcjxUZXN0SGFuZGxlcj4oaGFuZGxlcik7CisKICAgICAgIGZpbmFsIENhbGxDb3VudGluZ1RyYW5zcG9ydEZhY3RvcnkgZmFjdG9yeSA9IG5ldyBDYWxsQ291bnRpbmdUcmFuc3BvcnRGYWN0b3J5KG5ldyBURnJhbWVkVHJhbnNwb3J0LkZhY3RvcnkoKSk7Ci0gIAorCiAgICAgICBzdGFydFNlcnZlcihwcm9jZXNzb3IsIHByb3RvRmFjdG9yeSwgZmFjdG9yeSk7CiAgICAgICBhc3NlcnRFcXVhbHMoMCwgZmFjdG9yeS5jb3VudCk7Ci0gIAorCiAgICAgICBUU29ja2V0IHNvY2tldCA9IG5ldyBUU29ja2V0KEhPU1QsIFBPUlQpOwogICAgICAgc29ja2V0LnNldFRpbWVvdXQoU09DS0VUX1RJTUVPVVQpOwogICAgICAgVFRyYW5zcG9ydCB0cmFuc3BvcnQgPSBnZXRDbGllbnRUcmFuc3BvcnQoc29ja2V0KTsKICAgICAgIG9wZW4odHJhbnNwb3J0KTsKLSAgCisKICAgICAgIFRQcm90b2NvbCBwcm90b2NvbCA9IHByb3RvRmFjdG9yeS5nZXRQcm90b2NvbCh0cmFuc3BvcnQpOwogICAgICAgVGhyaWZ0VGVzdC5DbGllbnQgdGVzdENsaWVudCA9IG5ldyBUaHJpZnRUZXN0LkNsaWVudChwcm90b2NvbCk7CiAgICAgICBhc3NlcnRFcXVhbHMoMCwgdGVzdENsaWVudC50ZXN0Qnl0ZSgoYnl0ZSkgMCkpOwogICAgICAgYXNzZXJ0RXF1YWxzKDIsIGZhY3RvcnkuY291bnQpOworICAgICAgc29ja2V0LmNsb3NlKCk7CiAgICAgICBzdG9wU2VydmVyKCk7CiAgICAgfQogICB9CiAKICAgcHJpdmF0ZSB2b2lkIHRlc3RFeGNlcHRpb24oVGhyaWZ0VGVzdC5DbGllbnQgdGVzdENsaWVudCkgdGhyb3dzIFRFeGNlcHRpb24sIFhjZXB0aW9uIHsKLSAgICAvL0BUT0RPIHRlc3RFeGNlcHRpb24KLSAgICAvL3Rlc3RDbGllbnQudGVzdEV4Y2VwdGlvbigibm8gRXhjZXB0aW9uIik7Ci0gICAgLyp0cnkgewotICAgICAgICB0ZXN0Q2xpZW50LnRlc3RFeGNlcHRpb24oIlhjZXB0aW9uIik7CisgICAgdHJ5IHsKKyAgICAgIHRlc3RDbGllbnQudGVzdEV4Y2VwdGlvbigiWGNlcHRpb24iKTsKKyAgICAgIGFzc2VydCBmYWxzZTsKICAgICB9IGNhdGNoKFhjZXB0aW9uIGUpIHsKLSAgICAJYXNzZXJ0RXF1YWxzKGUubWVzc2FnZSwgIlhjZXB0aW9uIik7Ci0gICAgfSovCi0gICAgLyp0cnkgewotICAgICAgICB0ZXN0Q2xpZW50LnRlc3RFeGNlcHRpb24oIkFwcGxpY2F0aW9uRXhjZXB0aW9uIik7CisgICAgICBhc3NlcnRFcXVhbHMoZS5tZXNzYWdlLCAiWGNlcHRpb24iKTsKKyAgICAgIGFzc2VydEVxdWFscyhlLmVycm9yQ29kZSwgMTAwMSk7CisgICAgfQorICAgIHRyeSB7CisgICAgICB0ZXN0Q2xpZW50LnRlc3RFeGNlcHRpb24oIlRFeGNlcHRpb24iKTsKKyAgICAgIGFzc2VydCBmYWxzZTsKICAgICB9IGNhdGNoKFRFeGNlcHRpb24gZSkgewotICAgIAlhc3NlcnRFcXVhbHMoZS5tZXNzYWdlLCAiQXBwbGljYXRpb25FeGNlcHRpb24iKTsKLSAgICB9Ki8KKyAgICB9CisgICAgdGVzdENsaWVudC50ZXN0RXhjZXB0aW9uKCJubyBFeGNlcHRpb24iKTsKICAgfQogCiAKLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEFzeW5jVGVzdEhhbmRsZXIgaW1wbGVtZW50cyBUaHJpZnRUZXN0LkFzeW5jSWZhY2UgeworICBwdWJsaWMgc3RhdGljIGNsYXNzIEFzeW5jVGVzdEhhbmRsZXIgaW1wbGVtZW50cyBUaHJpZnRUZXN0LkFzeW5jSWZhY2UgewogCi0gICAgICAgIFRlc3RIYW5kbGVyIGhhbmRsZXIgPSBuZXcgVGVzdEhhbmRsZXIoKTsKKyAgICBUZXN0SGFuZGxlciBoYW5kbGVyID0gbmV3IFRlc3RIYW5kbGVyKCk7CiAKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHRlc3RWb2lkKEFzeW5jTWV0aG9kQ2FsbGJhY2sgcmVzdWx0SGFuZGxlcikgdGhyb3dzIFRFeGNlcHRpb24gewotICAgICAgICAgICAgcmVzdWx0SGFuZGxlci5vbkNvbXBsZXRlKG51bGwpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmcoU3RyaW5nIHRoaW5nLCBBc3luY01ldGhvZENhbGxiYWNrIHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHJlc3VsdEhhbmRsZXIub25Db21wbGV0ZShoYW5kbGVyLnRlc3RTdHJpbmcodGhpbmcpKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0Qnl0ZShieXRlIHRoaW5nLCBBc3luY01ldGhvZENhbGxiYWNrIHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHJlc3VsdEhhbmRsZXIub25Db21wbGV0ZShoYW5kbGVyLnRlc3RCeXRlKHRoaW5nKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgdGVzdEkzMihpbnQgdGhpbmcsIEFzeW5jTWV0aG9kQ2FsbGJhY2sgcmVzdWx0SGFuZGxlcikgdGhyb3dzIFRFeGNlcHRpb24gewotICAgICAgICAgICAgcmVzdWx0SGFuZGxlci5vbkNvbXBsZXRlKGhhbmRsZXIudGVzdEkzMih0aGluZykpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHRlc3RJNjQobG9uZyB0aGluZywgQXN5bmNNZXRob2RDYWxsYmFjayByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUoaGFuZGxlci50ZXN0STY0KHRoaW5nKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgdGVzdERvdWJsZShkb3VibGUgdGhpbmcsIEFzeW5jTWV0aG9kQ2FsbGJhY2sgcmVzdWx0SGFuZGxlcikgdGhyb3dzIFRFeGNlcHRpb24gewotICAgICAgICAgICAgcmVzdWx0SGFuZGxlci5vbkNvbXBsZXRlKGhhbmRsZXIudGVzdERvdWJsZSh0aGluZykpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJ1Y3QoWHRydWN0IHRoaW5nLCBBc3luY01ldGhvZENhbGxiYWNrIHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHJlc3VsdEhhbmRsZXIub25Db21wbGV0ZShoYW5kbGVyLnRlc3RTdHJ1Y3QodGhpbmcpKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0TmVzdChYdHJ1Y3QyIHRoaW5nLCBBc3luY01ldGhvZENhbGxiYWNrIHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHJlc3VsdEhhbmRsZXIub25Db21wbGV0ZShoYW5kbGVyLnRlc3ROZXN0KHRoaW5nKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgdGVzdE1hcChNYXA8SW50ZWdlciwgSW50ZWdlcj4gdGhpbmcsIEFzeW5jTWV0aG9kQ2FsbGJhY2sgcmVzdWx0SGFuZGxlcikgdGhyb3dzIFRFeGNlcHRpb24gewotICAgICAgICAgICAgcmVzdWx0SGFuZGxlci5vbkNvbXBsZXRlKGhhbmRsZXIudGVzdE1hcCh0aGluZykpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdNYXAoTWFwPFN0cmluZywgU3RyaW5nPiB0aGluZywgQXN5bmNNZXRob2RDYWxsYmFjayByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUoaGFuZGxlci50ZXN0U3RyaW5nTWFwKHRoaW5nKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgdGVzdFNldChTZXQ8SW50ZWdlcj4gdGhpbmcsIEFzeW5jTWV0aG9kQ2FsbGJhY2sgcmVzdWx0SGFuZGxlcikgdGhyb3dzIFRFeGNlcHRpb24gewotICAgICAgICAgICAgcmVzdWx0SGFuZGxlci5vbkNvbXBsZXRlKGhhbmRsZXIudGVzdFNldCh0aGluZykpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHRlc3RMaXN0KExpc3Q8SW50ZWdlcj4gdGhpbmcsIEFzeW5jTWV0aG9kQ2FsbGJhY2sgcmVzdWx0SGFuZGxlcikgdGhyb3dzIFRFeGNlcHRpb24gewotICAgICAgICAgICAgcmVzdWx0SGFuZGxlci5vbkNvbXBsZXRlKGhhbmRsZXIudGVzdExpc3QodGhpbmcpKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0RW51bShOdW1iZXJ6IHRoaW5nLCBBc3luY01ldGhvZENhbGxiYWNrIHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHJlc3VsdEhhbmRsZXIub25Db21wbGV0ZShoYW5kbGVyLnRlc3RFbnVtKHRoaW5nKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgdGVzdFR5cGVkZWYobG9uZyB0aGluZywgQXN5bmNNZXRob2RDYWxsYmFjayByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUoaGFuZGxlci50ZXN0VHlwZWRlZih0aGluZykpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHRlc3RNYXBNYXAoaW50IGhlbGxvLCBBc3luY01ldGhvZENhbGxiYWNrIHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHJlc3VsdEhhbmRsZXIub25Db21wbGV0ZShoYW5kbGVyLnRlc3RNYXBNYXAoaGVsbG8pKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zYW5pdHkoSW5zYW5pdHkgYXJndW1lbnQsIEFzeW5jTWV0aG9kQ2FsbGJhY2sgcmVzdWx0SGFuZGxlcikgdGhyb3dzIFRFeGNlcHRpb24gewotICAgICAgICAgICAgcmVzdWx0SGFuZGxlci5vbkNvbXBsZXRlKGhhbmRsZXIudGVzdEluc2FuaXR5KGFyZ3VtZW50KSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgdGVzdE11bHRpKGJ5dGUgYXJnMCwgaW50IGFyZzEsIGxvbmcgYXJnMiwgTWFwPFNob3J0LCBTdHJpbmc+IGFyZzMsIE51bWJlcnogYXJnNCwgbG9uZyBhcmc1LCBBc3luY01ldGhvZENhbGxiYWNrIHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHJlc3VsdEhhbmRsZXIub25Db21wbGV0ZShoYW5kbGVyLnRlc3RNdWx0aShhcmcwLGFyZzEsYXJnMixhcmczLGFyZzQsYXJnNSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHRlc3RFeGNlcHRpb24oU3RyaW5nIGFyZywgQXN5bmNNZXRob2RDYWxsYmFjayByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgLy8gaGFuZGxlci50ZXN0RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgdGVzdE11bHRpRXhjZXB0aW9uKFN0cmluZyBhcmcwLCBTdHJpbmcgYXJnMSwgQXN5bmNNZXRob2RDYWxsYmFjayByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAvL1RvIGNoYW5nZSBib2R5IG9mIGltcGxlbWVudGVkIG1ldGhvZHMgdXNlIEZpbGUgfCBTZXR0aW5ncyB8IEZpbGUgVGVtcGxhdGVzLgotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHRlc3RPbmV3YXkoaW50IHNlY29uZHNUb1NsZWVwLCBBc3luY01ldGhvZENhbGxiYWNrIHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGhhbmRsZXIudGVzdE9uZXdheShzZWNvbmRzVG9TbGVlcCk7Ci0gICAgICAgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUobnVsbCk7Ci0gICAgICAgIH0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Vm9pZChBc3luY01ldGhvZENhbGxiYWNrPFZvaWQ+IHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgIHJlc3VsdEhhbmRsZXIub25Db21wbGV0ZShudWxsKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nKFN0cmluZyB0aGluZywgQXN5bmNNZXRob2RDYWxsYmFjazxTdHJpbmc+IHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgIHJlc3VsdEhhbmRsZXIub25Db21wbGV0ZShoYW5kbGVyLnRlc3RTdHJpbmcodGhpbmcpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Qm9vbChib29sZWFuIHRoaW5nLCBBc3luY01ldGhvZENhbGxiYWNrPEJvb2xlYW4+IHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgIHJlc3VsdEhhbmRsZXIub25Db21wbGV0ZShoYW5kbGVyLnRlc3RCb29sKHRoaW5nKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVzdEJ5dGUoYnl0ZSB0aGluZywgQXN5bmNNZXRob2RDYWxsYmFjazxCeXRlPiByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUoaGFuZGxlci50ZXN0Qnl0ZSh0aGluZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlc3RJMzIoaW50IHRoaW5nLCBBc3luY01ldGhvZENhbGxiYWNrPEludGVnZXI+IHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgIHJlc3VsdEhhbmRsZXIub25Db21wbGV0ZShoYW5kbGVyLnRlc3RJMzIodGhpbmcpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB0ZXN0STY0KGxvbmcgdGhpbmcsIEFzeW5jTWV0aG9kQ2FsbGJhY2s8TG9uZz4gcmVzdWx0SGFuZGxlcikgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgcmVzdWx0SGFuZGxlci5vbkNvbXBsZXRlKGhhbmRsZXIudGVzdEk2NCh0aGluZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlc3REb3VibGUoZG91YmxlIHRoaW5nLCBBc3luY01ldGhvZENhbGxiYWNrPERvdWJsZT4gcmVzdWx0SGFuZGxlcikgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgcmVzdWx0SGFuZGxlci5vbkNvbXBsZXRlKGhhbmRsZXIudGVzdERvdWJsZSh0aGluZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlc3RCaW5hcnkoQnl0ZUJ1ZmZlciB0aGluZywgQXN5bmNNZXRob2RDYWxsYmFjazxCeXRlQnVmZmVyPiByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUoaGFuZGxlci50ZXN0QmluYXJ5KHRoaW5nKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVzdFN0cnVjdChYdHJ1Y3QgdGhpbmcsIEFzeW5jTWV0aG9kQ2FsbGJhY2s8WHRydWN0PiByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUoaGFuZGxlci50ZXN0U3RydWN0KHRoaW5nKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVzdE5lc3QoWHRydWN0MiB0aGluZywgQXN5bmNNZXRob2RDYWxsYmFjazxYdHJ1Y3QyPiByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUoaGFuZGxlci50ZXN0TmVzdCh0aGluZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlc3RNYXAoTWFwPEludGVnZXIsIEludGVnZXI+IHRoaW5nLCBBc3luY01ldGhvZENhbGxiYWNrPE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPj4gcmVzdWx0SGFuZGxlcikgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgcmVzdWx0SGFuZGxlci5vbkNvbXBsZXRlKGhhbmRsZXIudGVzdE1hcCh0aGluZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdNYXAoTWFwPFN0cmluZywgU3RyaW5nPiB0aGluZywgQXN5bmNNZXRob2RDYWxsYmFjazxNYXA8U3RyaW5nLCBTdHJpbmc+PiByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUoaGFuZGxlci50ZXN0U3RyaW5nTWFwKHRoaW5nKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVzdFNldChTZXQ8SW50ZWdlcj4gdGhpbmcsIEFzeW5jTWV0aG9kQ2FsbGJhY2s8U2V0PEludGVnZXI+PiByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUoaGFuZGxlci50ZXN0U2V0KHRoaW5nKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVzdExpc3QoTGlzdDxJbnRlZ2VyPiB0aGluZywgQXN5bmNNZXRob2RDYWxsYmFjazxMaXN0PEludGVnZXI+PiByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUoaGFuZGxlci50ZXN0TGlzdCh0aGluZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlc3RFbnVtKE51bWJlcnogdGhpbmcsIEFzeW5jTWV0aG9kQ2FsbGJhY2s8TnVtYmVyej4gcmVzdWx0SGFuZGxlcikgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgcmVzdWx0SGFuZGxlci5vbkNvbXBsZXRlKGhhbmRsZXIudGVzdEVudW0odGhpbmcpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHlwZWRlZihsb25nIHRoaW5nLCBBc3luY01ldGhvZENhbGxiYWNrPExvbmc+IHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgIHJlc3VsdEhhbmRsZXIub25Db21wbGV0ZShoYW5kbGVyLnRlc3RUeXBlZGVmKHRoaW5nKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVzdE1hcE1hcChpbnQgaGVsbG8sIEFzeW5jTWV0aG9kQ2FsbGJhY2s8TWFwPEludGVnZXIsTWFwPEludGVnZXIsSW50ZWdlcj4+PiByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUoaGFuZGxlci50ZXN0TWFwTWFwKGhlbGxvKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVzdEluc2FuaXR5KEluc2FuaXR5IGFyZ3VtZW50LCBBc3luY01ldGhvZENhbGxiYWNrPE1hcDxMb25nLCBNYXA8TnVtYmVyeixJbnNhbml0eT4+PiByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUoaGFuZGxlci50ZXN0SW5zYW5pdHkoYXJndW1lbnQpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGkoYnl0ZSBhcmcwLCBpbnQgYXJnMSwgbG9uZyBhcmcyLCBNYXA8U2hvcnQsIFN0cmluZz4gYXJnMywgTnVtYmVyeiBhcmc0LCBsb25nIGFyZzUsIEFzeW5jTWV0aG9kQ2FsbGJhY2s8WHRydWN0PiByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUoaGFuZGxlci50ZXN0TXVsdGkoYXJnMCxhcmcxLGFyZzIsYXJnMyxhcmc0LGFyZzUpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXhjZXB0aW9uKFN0cmluZyBhcmcsIEFzeW5jTWV0aG9kQ2FsbGJhY2s8Vm9pZD4gcmVzdWx0SGFuZGxlcikgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdEV4Y2VwdGlvbigiK2FyZysiKVxuIik7CisgICAgICBpZiAoIlhjZXB0aW9uIi5lcXVhbHMoYXJnKSkgeworICAgICAgICBYY2VwdGlvbiB4ID0gbmV3IFhjZXB0aW9uKCk7CisgICAgICAgIHguZXJyb3JDb2RlID0gMTAwMTsKKyAgICAgICAgeC5tZXNzYWdlID0gYXJnOworICAgICAgICAvLyB0aHJvdyBhbmQgb25FcnJvciB5aWVsZCB0aGUgc2FtZSByZXN1bHQuCisgICAgICAgIC8vIHRocm93IHg7CisgICAgICAgIHJlc3VsdEhhbmRsZXIub25FcnJvcih4KTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfSBlbHNlIGlmICgiVEV4Y2VwdGlvbiIuZXF1YWxzKGFyZykpIHsKKyAgICAgICAgLy8gdGhyb3cgYW5kIG9uRXJyb3IgeWllbGQgdGhlIHNhbWUgcmVzdWx0LgorICAgICAgICAvLyByZXN1bHRIYW5kbGVyLm9uRXJyb3IobmV3IFRFeGNlcHRpb24oYXJnKSk7CisgICAgICAgIC8vIHJldHVybjsKKyAgICAgICAgLy8gVW5zcGVjaWZpZWQgZXhjZXB0aW9uIHNob3VsZCB5aWVsZCBhIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBvbiBjbGllbnQgc2lkZQorICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihhcmcpOworICAgICAgfQorICAgICAgcmVzdWx0SGFuZGxlci5vbkNvbXBsZXRlKG51bGwpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aUV4Y2VwdGlvbihTdHJpbmcgYXJnMCwgU3RyaW5nIGFyZzEsIEFzeW5jTWV0aG9kQ2FsbGJhY2s8WHRydWN0PiByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAvL1RvIGNoYW5nZSBib2R5IG9mIGltcGxlbWVudGVkIG1ldGhvZHMgdXNlIEZpbGUgfCBTZXR0aW5ncyB8IEZpbGUgVGVtcGxhdGVzLgorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlc3RPbmV3YXkoaW50IHNlY29uZHNUb1NsZWVwLCBBc3luY01ldGhvZENhbGxiYWNrPFZvaWQ+IHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgIGhhbmRsZXIudGVzdE9uZXdheShzZWNvbmRzVG9TbGVlcCk7CisgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUobnVsbCk7CisgICAgfQorICB9CisKIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdGVzdC9UZXN0Q2xpZW50LmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Rlc3QvVGVzdENsaWVudC5qYXZhCmluZGV4IDRlN2U1MDcuLmZlYWE5NzIgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdGVzdC9UZXN0Q2xpZW50LmphdmEKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90ZXN0L1Rlc3RDbGllbnQuamF2YQpAQCAtMTksMzIgKzE5LDQwIEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudGVzdDsKIAotLy8gR2VuZXJhdGVkIGNvZGUKLWltcG9ydCB0aHJpZnQudGVzdC4qOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5UU2VyaWFsaXplcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFNvY2tldDsKLWltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVEh0dHBDbGllbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRGcmFtZWRUcmFuc3BvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRGYXN0RnJhbWVkVHJhbnNwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UU1NMVHJhbnNwb3J0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFNTTFRyYW5zcG9ydEZhY3RvcnkuVFNTTFRyYW5zcG9ydFBhcmFtZXRlcnM7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEJpbmFyeVByb3RvY29sOwotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbDsKLWltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5USlNPTlByb3RvY29sOwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRDb21wYWN0UHJvdG9jb2w7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEpTT05Qcm90b2NvbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTXVsdGlwbGV4ZWRQcm90b2NvbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2w7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFNpbXBsZUpTT05Qcm90b2NvbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVEZhc3RGcmFtZWRUcmFuc3BvcnQ7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRGcmFtZWRUcmFuc3BvcnQ7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRIdHRwQ2xpZW50OworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UU1NMVHJhbnNwb3J0RmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFNvY2tldDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbjsKIAotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworLy8gR2VuZXJhdGVkIGNvZGUKK2ltcG9ydCB0aHJpZnQudGVzdC5JbnNhbml0eTsKK2ltcG9ydCB0aHJpZnQudGVzdC5OdW1iZXJ6OworaW1wb3J0IHRocmlmdC50ZXN0LlNlY29uZFNlcnZpY2U7CitpbXBvcnQgdGhyaWZ0LnRlc3QuVGhyaWZ0VGVzdDsKK2ltcG9ydCB0aHJpZnQudGVzdC5YY2VwdGlvbjsKK2ltcG9ydCB0aHJpZnQudGVzdC5YY2VwdGlvbjI7CitpbXBvcnQgdGhyaWZ0LnRlc3QuWHRydWN0OworaW1wb3J0IHRocmlmdC50ZXN0Llh0cnVjdDI7CiAKIC8qKgogICogVGVzdCBKYXZhIGNsaWVudCBmb3IgdGhyaWZ0LiBFc3NlbnRpYWxseSBqdXN0IGEgY29weSBvZiB0aGUgQysrIHZlcnNpb24sCkBAIC01Myw2ICs2MSwxNCBAQAogICoKICAqLwogcHVibGljIGNsYXNzIFRlc3RDbGllbnQgeworCisgIHByaXZhdGUgc3RhdGljIGludCBFUlJfQkFTRVRZUEVTID0gMTsKKyAgcHJpdmF0ZSBzdGF0aWMgaW50IEVSUl9TVFJVQ1RTID0gMjsKKyAgcHJpdmF0ZSBzdGF0aWMgaW50IEVSUl9DT05UQUlORVJTID0gNDsKKyAgcHJpdmF0ZSBzdGF0aWMgaW50IEVSUl9FWENFUFRJT05TID0gODsKKyAgcHJpdmF0ZSBzdGF0aWMgaW50IEVSUl9QUk9UT0NPTFMgPSAxNjsKKyAgcHJpdmF0ZSBzdGF0aWMgaW50IEVSUl9VTktOT1dOID0gNjQ7CisKICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIFtdIGFyZ3MpIHsKICAgICBTdHJpbmcgaG9zdCA9ICJsb2NhbGhvc3QiOwogICAgIGludCBwb3J0ID0gOTA5MDsKQEAgLTY5LDggKzg1LDggQEAKICAgICAgICAgICBob3N0ID0gYXJnc1tpXS5zcGxpdCgiPSIpWzFdOwogICAgICAgICAgIGhvc3QudHJpbSgpOwogICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uc3RhcnRzV2l0aCgiLS1wb3J0IikpIHsKLSAgICAgICAgICBwb3J0ID0gSW50ZWdlci52YWx1ZU9mKGFyZ3NbaV0uc3BsaXQoIj0iKVsxXSk7IAotICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uc3RhcnRzV2l0aCgiLS1uIikgfHwgCisgICAgICAgICAgcG9ydCA9IEludGVnZXIudmFsdWVPZihhcmdzW2ldLnNwbGl0KCI9IilbMV0pOworICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uc3RhcnRzV2l0aCgiLS1uIikgfHwKICAgICAgICAgICAgIGFyZ3NbaV0uc3RhcnRzV2l0aCgiLS10ZXN0bG9vcHMiKSl7CiAgICAgICAgICAgbnVtVGVzdHMgPSBJbnRlZ2VyLnZhbHVlT2YoYXJnc1tpXS5zcGxpdCgiPSIpWzFdKTsKICAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLmVxdWFscygiLS10aW1lb3V0IikpIHsKQEAgLTg1LDExICsxMDEsMTEgQEAKICAgICAgICAgICBzc2wgPSB0cnVlOwogICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCItLWhlbHAiKSkgewogICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQWxsb3dlZCBvcHRpb25zOiIpOwotICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAtLWhlbHBcdFx0XHRQcm9kdWNlIGhlbHAgbWVzc2FnZSIpOyAKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLS1oZWxwXHRcdFx0UHJvZHVjZSBoZWxwIG1lc3NhZ2UiKTsKICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLS1ob3N0PWFyZyAoPSIgKyBob3N0ICsgIilcdEhvc3QgdG8gY29ubmVjdCIpOwogICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAtLXBvcnQ9YXJnICg9IiArIHBvcnQgKyAiKVx0UG9ydCBudW1iZXIgdG8gY29ubmVjdCIpOwogICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAtLXRyYW5zcG9ydD1hcmcgKD0iICsgdHJhbnNwb3J0X3R5cGUgKyAiKVxuXHRcdFx0XHRUcmFuc3BvcnQ6IGJ1ZmZlcmVkLCBmcmFtZWQsIGZhc3RmcmFtZWQsIGh0dHAiKTsKLSAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLS1wcm90b2NvbD1hcmcgKD0iICsgcHJvdG9jb2xfdHlwZSArICIpXHRQcm90b2NvbDogYmluYXJ5LCBqc29uLCBjb21wYWN0Iik7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIC0tcHJvdG9jb2w9YXJnICg9IiArIHByb3RvY29sX3R5cGUgKyAiKVx0UHJvdG9jb2w6IGJpbmFyeSwgY29tcGFjdCwganNvbiwgbXVsdGksIG11bHRpYywgbXVsdGlqIik7CiAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIC0tc3NsXHRcdFx0RW5jcnlwdGVkIFRyYW5zcG9ydCB1c2luZyBTU0wiKTsKICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLS10ZXN0bG9vcHNbLS1uXT1hcmcgKD0iICsgbnVtVGVzdHMgKyAiKVx0TnVtYmVyIG9mIFRlc3RzIik7CiAgICAgICAgICAgU3lzdGVtLmV4aXQoMCk7CkBAIC05NywxNSArMTEzLDE4IEBACiAgICAgICB9CiAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIHgpIHsKICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiQ2FuIG5vdCBwYXJzZSBhcmd1bWVudHMhIFNlZSAtLWhlbHAiKTsKLSAgICAgIFN5c3RlbS5leGl0KDEpOworICAgICAgU3lzdGVtLmV4aXQoRVJSX1VOS05PV04pOwogICAgIH0KIAogICAgIHRyeSB7CiAgICAgICBpZiAocHJvdG9jb2xfdHlwZS5lcXVhbHMoImJpbmFyeSIpKSB7CiAgICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUuZXF1YWxzKCJjb21wYWN0IikpIHsKICAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZS5lcXVhbHMoImpzb24iKSkgeworICAgICAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlLmVxdWFscygibXVsdGkiKSkgeworICAgICAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlLmVxdWFscygibXVsdGljIikpIHsKKyAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZS5lcXVhbHMoIm11bHRpaiIpKSB7CiAgICAgICB9IGVsc2UgewotICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJVbmtub3duIHByb3RvY29sIHR5cGUhICIgKyBwcm90b2NvbF90eXBlKTsgCisgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlVua25vd24gcHJvdG9jb2wgdHlwZSEgIiArIHByb3RvY29sX3R5cGUpOwogICAgICAgfQogICAgICAgaWYgKHRyYW5zcG9ydF90eXBlLmVxdWFscygiYnVmZmVyZWQiKSkgewogICAgICAgfSBlbHNlIGlmICh0cmFuc3BvcnRfdHlwZS5lcXVhbHMoImZyYW1lZCIpKSB7CkBAIC0xMTksNyArMTM4LDcgQEAKICAgICAgIH0KICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJFcnJvcjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgIFN5c3RlbS5leGl0KDEpOworICAgICAgU3lzdGVtLmV4aXQoRVJSX1VOS05PV04pOwogICAgIH0KIAogICAgIFRUcmFuc3BvcnQgdHJhbnNwb3J0ID0gbnVsbDsKQEAgLTE0NiwyNyArMTY1LDMyIEBACiAgICAgICB9CiAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIHgpIHsKICAgICAgIHgucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICBTeXN0ZW0uZXhpdCgxKTsKKyAgICAgIFN5c3RlbS5leGl0KEVSUl9VTktOT1dOKTsKICAgICB9CiAKICAgICBUUHJvdG9jb2wgdFByb3RvY29sID0gbnVsbDsKLSAgICBpZiAocHJvdG9jb2xfdHlwZS5lcXVhbHMoImpzb24iKSkgeworICAgIFRQcm90b2NvbCB0UHJvdG9jb2wyID0gbnVsbDsKKyAgICBpZiAocHJvdG9jb2xfdHlwZS5lcXVhbHMoImpzb24iKSB8fCBwcm90b2NvbF90eXBlLmVxdWFscygibXVsdGlqIikpIHsKICAgICAgIHRQcm90b2NvbCA9IG5ldyBUSlNPTlByb3RvY29sKHRyYW5zcG9ydCk7Ci0gICAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlLmVxdWFscygiY29tcGFjdCIpKSB7CisgICAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlLmVxdWFscygiY29tcGFjdCIpIHx8IHByb3RvY29sX3R5cGUuZXF1YWxzKCJtdWx0aWMiKSkgewogICAgICAgdFByb3RvY29sID0gbmV3IFRDb21wYWN0UHJvdG9jb2wodHJhbnNwb3J0KTsKICAgICB9IGVsc2UgewogICAgICAgdFByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpOwogICAgIH0KIAotICAgIFRocmlmdFRlc3QuQ2xpZW50IHRlc3RDbGllbnQgPQotICAgICAgbmV3IFRocmlmdFRlc3QuQ2xpZW50KHRQcm90b2NvbCk7CisgICAgaWYgKHByb3RvY29sX3R5cGUuc3RhcnRzV2l0aCgibXVsdGkiKSkgeworICAgICAgdFByb3RvY29sMiA9IG5ldyBUTXVsdGlwbGV4ZWRQcm90b2NvbCh0UHJvdG9jb2wsICJTZWNvbmRTZXJ2aWNlIik7CisgICAgICB0UHJvdG9jb2wgPSBuZXcgVE11bHRpcGxleGVkUHJvdG9jb2wodFByb3RvY29sLCAiVGhyaWZ0VGVzdCIpOworICAgIH0KKworICAgIFRocmlmdFRlc3QuQ2xpZW50IHRlc3RDbGllbnQgPSBuZXcgVGhyaWZ0VGVzdC5DbGllbnQodFByb3RvY29sKTsKICAgICBJbnNhbml0eSBpbnNhbmUgPSBuZXcgSW5zYW5pdHkoKTsKIAogICAgIGxvbmcgdGltZU1pbiA9IDA7CiAgICAgbG9uZyB0aW1lTWF4ID0gMDsKICAgICBsb25nIHRpbWVUb3QgPSAwOwogCi0gICAgaW50IGZhaWxDb3VudCA9IDA7CisgICAgaW50IHJldHVybkNvZGUgPSAwOwogICAgIGZvciAoaW50IHRlc3QgPSAwOyB0ZXN0IDwgbnVtVGVzdHM7ICsrdGVzdCkgewogICAgICAgdHJ5IHsKICAgICAgICAgLyoqCkBAIC0xODAsNyArMjA0LDcgQEAKICAgICAgICAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkgewogICAgICAgICAgICAgdHR4LnByaW50U3RhY2tUcmFjZSgpOwogICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDb25uZWN0IGZhaWxlZDogIiArIHR0eC5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7CisgICAgICAgICAgICBTeXN0ZW0uZXhpdChFUlJfVU5LTk9XTik7CiAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTE5NSw3ICsyMTksNyBAQAogICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiA9IHZvaWRcbiIpOwogICAgICAgICB9IGNhdGNoIChUQXBwbGljYXRpb25FeGNlcHRpb24gdGF4KSB7CiAgICAgICAgICAgdGF4LnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgIGZhaWxDb3VudCsrOworICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX0JBU0VUWVBFUzsKICAgICAgICAgfQogCiAgICAgICAgIC8qKgpAQCAtMjA1LDE5ICsyMjksMzIgQEAKICAgICAgICAgU3RyaW5nIHMgPSB0ZXN0Q2xpZW50LnRlc3RTdHJpbmcoIlRlc3QiKTsKICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiID0gXCIiICsgcyArICJcIlxuIik7CiAgICAgICAgIGlmICghcy5lcXVhbHMoIlRlc3QiKSkgewotICAgICAgICAgIGZhaWxDb3VudCsrOwotICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRkFJTFVSRVxuIik7CisgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfQkFTRVRZUEVTOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqIEZBSUxVUkUgKioqXG4iKTsKICAgICAgICAgfQogCiAgICAgICAgIC8qKgorICAgICAgICAgKiBNdWx0aXBsZXhlZCB0ZXN0CisgICAgICAgICAqLworICAgICAgICBpZiAocHJvdG9jb2xfdHlwZS5zdGFydHNXaXRoKCJtdWx0aSIpKSB7CisgICAgICAgICAgU2Vjb25kU2VydmljZS5DbGllbnQgc2Vjb25kQ2xpZW50ID0gbmV3IFNlY29uZFNlcnZpY2UuQ2xpZW50KHRQcm90b2NvbDIpOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInNlY29uZHRlc3RTdHJpbmcoXCJUZXN0MlwiKSIpOworICAgICAgICAgIHMgPSBzZWNvbmRDbGllbnQuc2Vjb25kdGVzdFN0cmluZygiVGVzdDIiKTsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgPSBcIiIgKyBzICsgIlwiXG4iKTsKKyAgICAgICAgICBpZiAoIXMuZXF1YWxzKCJ0ZXN0U3RyaW5nKFwiVGVzdDJcIikiKSkgeworICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfUFJPVE9DT0xTOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIqKiogRkFJTFVSRSAqKipcbiIpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKioKICAgICAgICAgICogQllURSBURVNUCiAgICAgICAgICAqLwogICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0Qnl0ZSgxKSIpOwogICAgICAgICBieXRlIGk4ID0gdGVzdENsaWVudC50ZXN0Qnl0ZSgoYnl0ZSkxKTsKICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiID0gIiArIGk4ICsgIlxuIik7CiAgICAgICAgIGlmIChpOCAhPSAxKSB7Ci0gICAgICAgICAgZmFpbENvdW50Kys7IAotICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRkFJTFVSRVxuIik7CisgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfQkFTRVRZUEVTOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqIEZBSUxVUkUgKioqXG4iKTsKICAgICAgICAgfQogCiAgICAgICAgIC8qKgpAQCAtMjI3LDggKzI2NCw4IEBACiAgICAgICAgIGludCBpMzIgPSB0ZXN0Q2xpZW50LnRlc3RJMzIoLTEpOwogICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgPSAiICsgaTMyICsgIlxuIik7CiAgICAgICAgIGlmIChpMzIgIT0gLTEpIHsKLSAgICAgICAgICBmYWlsQ291bnQrKzsgCi0gICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJGQUlMVVJFXG4iKTsKKyAgICAgICAgICByZXR1cm5Db2RlIHw9IEVSUl9CQVNFVFlQRVM7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIqKiogRkFJTFVSRSAqKipcbiIpOwogICAgICAgICB9CiAKICAgICAgICAgLyoqCkBAIC0yMzgsOCArMjc1LDggQEAKICAgICAgICAgbG9uZyBpNjQgPSB0ZXN0Q2xpZW50LnRlc3RJNjQoLTM0MzU5NzM4MzY4TCk7CiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiA9ICIgKyBpNjQgKyAiXG4iKTsKICAgICAgICAgaWYgKGk2NCAhPSAtMzQzNTk3MzgzNjhMKSB7Ci0gICAgICAgICAgZmFpbENvdW50Kys7Ci0gICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJGQUlMVVJFXG4iKTsKKyAgICAgICAgICByZXR1cm5Db2RlIHw9IEVSUl9CQVNFVFlQRVM7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIqKiogRkFJTFVSRSAqKipcbiIpOwogICAgICAgICB9CiAKICAgICAgICAgLyoqCkBAIC0yNDksOCArMjg2LDM5IEBACiAgICAgICAgIGRvdWJsZSBkdWIgPSB0ZXN0Q2xpZW50LnRlc3REb3VibGUoLTUuMzI1MDk4MjM1KTsKICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiID0gIiArIGR1YiArICJcbiIpOwogICAgICAgICBpZiAoTWF0aC5hYnMoZHViIC0gKC01LjMyNTA5ODIzNSkpID4gMC4wMDEpIHsKLSAgICAgICAgICBmYWlsQ291bnQrKzsKLSAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkZBSUxVUkVcbiIpOworICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX0JBU0VUWVBFUzsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIioqKiBGQUlMVVJFICoqKlxuIik7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQklOQVJZIFRFU1QKKyAgICAgICAgICovCisgICAgICAgIHRyeSB7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdEJpbmFyeSgtMTI4Li4uMTI3KSA9ICIpOworICAgICAgICAgIGJ5dGVbXSBkYXRhID0gbmV3IGJ5dGVbXSB7LTEyOCwgLTEyNywgLTEyNiwgLTEyNSwgLTEyNCwgLTEyMywgLTEyMiwgLTEyMSwgLTEyMCwgLTExOSwgLTExOCwgLTExNywgLTExNiwgLTExNSwgLTExNCwgLTExMywgLTExMiwgLTExMSwgLTExMCwgLTEwOSwgLTEwOCwgLTEwNywgLTEwNiwgLTEwNSwgLTEwNCwgLTEwMywgLTEwMiwgLTEwMSwgLTEwMCwgLTk5LCAtOTgsIC05NywgLTk2LCAtOTUsIC05NCwgLTkzLCAtOTIsIC05MSwgLTkwLCAtODksIC04OCwgLTg3LCAtODYsIC04NSwgLTg0LCAtODMsIC04MiwgLTgxLCAtODAsIC03OSwgLTc4LCAtNzcsIC03NiwgLTc1LCAtNzQsIC03MywgLTcyLCAtNzEsIC03MCwgLTY5LCAtNjgsIC02NywgLTY2LCAtNjUsIC02NCwgLTYzLCAtNjIsIC02MSwgLTYwLCAtNTksIC01OCwgLTU3LCAtNTYsIC01NSwgLTU0LCAtNTMsIC01MiwgLTUxLCAtNTAsIC00OSwgLTQ4LCAtNDcsIC00NiwgLTQ1LCAtNDQsIC00MywgLTQyLCAtNDEsIC00MCwgLTM5LCAtMzgsIC0zNywgLTM2LCAtMzUsIC0zNCwgLTMzLCAtMzIsIC0zMSwgLTMwLCAtMjksIC0yOCwgLTI3LCAtMjYsIC0yNSwgLTI0LCAtMjMsIC0yMiwgLTIxLCAtMjAsIC0xOSwgLTE4LCAtMTcsIC0xNiwgLTE1LCAtMTQsIC0xMywgLTEyLCAtMTEsIC0xMCwgLTksIC04LCAtNywgLTYsIC01LCAtNCwgLTMsIC0yLCAtMSwgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjUsIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsIDMyLCAzMywgMzQsIDM1LCAzNiwgMzcsIDM4LCAzOSwgNDAsIDQxLCA0MiwgNDMsIDQ0LCA0NSwgNDYsIDQ3LCA0OCwgNDksIDUwLCA1MSwgNTIsIDUzLCA1NCwgNTUsIDU2LCA1NywgNTgsIDU5LCA2MCwgNjEsIDYyLCA2MywgNjQsIDY1LCA2NiwgNjcsIDY4LCA2OSwgNzAsIDcxLCA3MiwgNzMsIDc0LCA3NSwgNzYsIDc3LCA3OCwgNzksIDgwLCA4MSwgODIsIDgzLCA4NCwgODUsIDg2LCA4NywgODgsIDg5LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCA5OSwgMTAwLCAxMDEsIDEwMiwgMTAzLCAxMDQsIDEwNSwgMTA2LCAxMDcsIDEwOCwgMTA5LCAxMTAsIDExMSwgMTEyLCAxMTMsIDExNCwgMTE1LCAxMTYsIDExNywgMTE4LCAxMTksIDEyMCwgMTIxLCAxMjIsIDEyMywgMTI0LCAxMjUsIDEyNiwgMTI3fTsKKyAgICAgICAgICBCeXRlQnVmZmVyIGJpbiA9IHRlc3RDbGllbnQudGVzdEJpbmFyeShCeXRlQnVmZmVyLndyYXAoZGF0YSkpOworICAgICAgICAgIGJpbi5tYXJrKCk7CisgICAgICAgICAgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbYmluLmxpbWl0KCkgLSBiaW4ucG9zaXRpb24oKV07CisgICAgICAgICAgYmluLmdldChieXRlcyk7CisgICAgICAgICAgYmluLnJlc2V0KCk7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgieyIpOworICAgICAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOworICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiLCAiKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoYnl0ZXNbaV0pOworICAgICAgICAgIH0KKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIn0iKTsKKyAgICAgICAgICBpZiAoIUJ5dGVCdWZmZXIud3JhcChkYXRhKS5lcXVhbHMoYmluKSkgeworICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfQkFTRVRZUEVTOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIqKiogRkFJTFVSRSAqKipcbiIpOworICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfQkFTRVRZUEVTOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG4qKiogRkFJTFVSRSAqKipcbiIpOworICAgICAgICAgIGV4LnByaW50U3RhY2tUcmFjZShTeXN0ZW0ub3V0KTsKICAgICAgICAgfQogCiAgICAgICAgIC8qKgpAQCAtMjYzLDE0ICszMzEsMTQgQEAKICAgICAgICAgb3V0LmkzMl90aGluZyA9IC0zOwogICAgICAgICBvdXQuaTY0X3RoaW5nID0gLTU7CiAgICAgICAgIFh0cnVjdCBpbiA9IHRlc3RDbGllbnQudGVzdFN0cnVjdChvdXQpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgPSB7IiArICJcIiIgKyAKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbi5zdHJpbmdfdGhpbmcgKyAiXCIsIiArIAotICAgICAgICAgICAgICAgICAgICAgICAgIGluLmJ5dGVfdGhpbmcgKyAiLCAiICsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW4uaTMyX3RoaW5nICsgIiwgIiArIAorICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgPSB7IiArICJcIiIgKworICAgICAgICAgICAgICAgICAgICAgICAgIGluLnN0cmluZ190aGluZyArICJcIiwiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbi5ieXRlX3RoaW5nICsgIiwgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgaW4uaTMyX3RoaW5nICsgIiwgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgaW4uaTY0X3RoaW5nICsgIn1cbiIpOwogICAgICAgICBpZiAoIWluLmVxdWFscyhvdXQpKSB7Ci0gICAgICAgICAgZmFpbENvdW50Kys7IAotICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRkFJTFVSRVxuIik7CisgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfU1RSVUNUUzsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIioqKiBGQUlMVVJFICoqKlxuIik7CiAgICAgICAgIH0KIAogICAgICAgICAvKioKQEAgLTI4MywxNSArMzUxLDE1IEBACiAgICAgICAgIG91dDIuaTMyX3RoaW5nID0gNTsKICAgICAgICAgWHRydWN0MiBpbjIgPSB0ZXN0Q2xpZW50LnRlc3ROZXN0KG91dDIpOwogICAgICAgICBpbiA9IGluMi5zdHJ1Y3RfdGhpbmc7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiA9IHsiICsgaW4yLmJ5dGVfdGhpbmcgKyAiLCB7IiArICJcIiIgKyAKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbi5zdHJpbmdfdGhpbmcgKyAiXCIsICIgKyAKKyAgICAgICAgU3lzdGVtLm91dC5wcmludCgiID0geyIgKyBpbjIuYnl0ZV90aGluZyArICIsIHsiICsgIlwiIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgaW4uc3RyaW5nX3RoaW5nICsgIlwiLCAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICBpbi5ieXRlX3RoaW5nICsgIiwgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgaW4uaTMyX3RoaW5nICsgIiwgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgaW4uaTY0X3RoaW5nICsgIn0sICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgIGluMi5pMzJfdGhpbmcgKyAifVxuIik7CiAgICAgICAgIGlmICghaW4yLmVxdWFscyhvdXQyKSkgewotICAgICAgICAgIGZhaWxDb3VudCsrOwotICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRkFJTFVSRVxuIik7CisgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfU1RSVUNUUzsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIioqKiBGQUlMVVJFICoqKlxuIik7CiAgICAgICAgIH0KIAogICAgICAgICAvKioKQEAgLTMyNSwxNCArMzkzLDQ4IEBACiAgICAgICAgIH0KICAgICAgICAgU3lzdGVtLm91dC5wcmludCgifVxuIik7CiAgICAgICAgIGlmICghbWFwb3V0LmVxdWFscyhtYXBpbikpIHsKLSAgICAgICAgICBmYWlsQ291bnQrKzsgCi0gICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJGQUlMVVJFXG4iKTsKKyAgICAgICAgICByZXR1cm5Db2RlIHw9IEVSUl9DT05UQUlORVJTOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqIEZBSUxVUkUgKioqXG4iKTsKICAgICAgICAgfQogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBTVFJJTkcgTUFQIFRFU1QKLSAgICAgICAgICogIG1pc3NpbmcKICAgICAgICAgICovCisgICAgICAgIHRyeSB7CisgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBzbWFwb3V0ID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisgICAgICAgICAgc21hcG91dC5wdXQoImEiLCAiMiIpOworICAgICAgICAgIHNtYXBvdXQucHV0KCJiIiwgImJsYWgiKTsKKyAgICAgICAgICBzbWFwb3V0LnB1dCgic29tZSIsICJ0aGluZyIpOworICAgICAgICAgIGZvciAoU3RyaW5nIGtleSA6IHNtYXBvdXQua2V5U2V0KCkpIHsKKyAgICAgICAgICAgIGlmIChmaXJzdCkgeworICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiLCAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoa2V5ICsgIiA9PiAiICsgc21hcG91dC5nZXQoa2V5KSk7CisgICAgICAgICAgfQorICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIn0pIik7CisgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBzbWFwaW4gPSB0ZXN0Q2xpZW50LnRlc3RTdHJpbmdNYXAoc21hcG91dCk7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiID0geyIpOworICAgICAgICAgIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgICBmb3IgKFN0cmluZyBrZXkgOiBzbWFwaW4ua2V5U2V0KCkpIHsKKyAgICAgICAgICAgIGlmIChmaXJzdCkgeworICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiLCAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoa2V5ICsgIiA9PiAiICsgc21hcG91dC5nZXQoa2V5KSk7CisgICAgICAgICAgfQorICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIn1cbiIpOworICAgICAgICAgIGlmICghc21hcG91dC5lcXVhbHMoc21hcGluKSkgeworICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfQ09OVEFJTkVSUzsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqIEZBSUxVUkUgKioqXG4iKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX0NPTlRBSU5FUlM7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIqKiogRkFJTFVSRSAqKipcbiIpOworICAgICAgICAgIGV4LnByaW50U3RhY2tUcmFjZShTeXN0ZW0ub3V0KTsKKyAgICAgICAgfQogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBTRVQgVEVTVApAQCAtMzY1LDggKzQ2Nyw4IEBACiAgICAgICAgIH0KICAgICAgICAgU3lzdGVtLm91dC5wcmludCgifVxuIik7CiAgICAgICAgIGlmICghc2V0b3V0LmVxdWFscyhzZXRpbikpIHsKLSAgICAgICAgICBmYWlsQ291bnQrKzsgCi0gICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJGQUlMVVJFXG4iKTsKKyAgICAgICAgICByZXR1cm5Db2RlIHw9IEVSUl9DT05UQUlORVJTOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqIEZBSUxVUkUgKioqXG4iKTsKICAgICAgICAgfQogCiAgICAgICAgIC8qKgpAQCAtNDAwLDggKzUwMiw4IEBACiAgICAgICAgIH0KICAgICAgICAgU3lzdGVtLm91dC5wcmludCgifVxuIik7CiAgICAgICAgIGlmICghbGlzdG91dC5lcXVhbHMobGlzdGluKSkgewotICAgICAgICAgIGZhaWxDb3VudCsrOyAKLSAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkZBSUxVUkVcbiIpOworICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX0NPTlRBSU5FUlM7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIqKiogRkFJTFVSRSAqKipcbiIpOwogICAgICAgICB9CiAKICAgICAgICAgLyoqCkBAIC00MTEsNDAgKzUxMyw0MCBAQAogICAgICAgICBOdW1iZXJ6IHJldCA9IHRlc3RDbGllbnQudGVzdEVudW0oTnVtYmVyei5PTkUpOwogICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgPSAiICsgcmV0ICsgIlxuIik7CiAgICAgICAgIGlmIChyZXQgIT0gTnVtYmVyei5PTkUpIHsKLSAgICAgICAgICBmYWlsQ291bnQrKzsKLSAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkZBSUxVUkVcbiIpOworICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX1NUUlVDVFM7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIqKiogRkFJTFVSRSAqKipcbiIpOwogICAgICAgICB9CiAKICAgICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdEVudW0oVFdPKSIpOwogICAgICAgICByZXQgPSB0ZXN0Q2xpZW50LnRlc3RFbnVtKE51bWJlcnouVFdPKTsKICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiID0gIiArIHJldCArICJcbiIpOwogICAgICAgICBpZiAocmV0ICE9IE51bWJlcnouVFdPKSB7Ci0gICAgICAgICAgZmFpbENvdW50Kys7IAotICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRkFJTFVSRVxuIik7CisgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfU1RSVUNUUzsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIioqKiBGQUlMVVJFICoqKlxuIik7CiAgICAgICAgIH0KIAogICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0RW51bShUSFJFRSkiKTsKICAgICAgICAgcmV0ID0gdGVzdENsaWVudC50ZXN0RW51bShOdW1iZXJ6LlRIUkVFKTsKICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiID0gIiArIHJldCArICJcbiIpOwogICAgICAgICBpZiAocmV0ICE9IE51bWJlcnouVEhSRUUpIHsKLSAgICAgICAgICBmYWlsQ291bnQrKzsKLSAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkZBSUxVUkVcbiIpOworICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX1NUUlVDVFM7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIqKiogRkFJTFVSRSAqKipcbiIpOwogICAgICAgICB9CiAKICAgICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdEVudW0oRklWRSkiKTsKICAgICAgICAgcmV0ID0gdGVzdENsaWVudC50ZXN0RW51bShOdW1iZXJ6LkZJVkUpOwogICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgPSAiICsgcmV0ICsgIlxuIik7CiAgICAgICAgIGlmIChyZXQgIT0gTnVtYmVyei5GSVZFKSB7Ci0gICAgICAgICAgZmFpbENvdW50Kys7Ci0gICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJGQUlMVVJFXG4iKTsKKyAgICAgICAgICByZXR1cm5Db2RlIHw9IEVSUl9TVFJVQ1RTOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqIEZBSUxVUkUgKioqXG4iKTsKICAgICAgICAgfQogCiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RFbnVtKEVJR0hUKSIpOwogICAgICAgICByZXQgPSB0ZXN0Q2xpZW50LnRlc3RFbnVtKE51bWJlcnouRUlHSFQpOwogICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgPSAiICsgcmV0ICsgIlxuIik7CiAgICAgICAgIGlmIChyZXQgIT0gTnVtYmVyei5FSUdIVCkgewotICAgICAgICAgIGZhaWxDb3VudCsrOwotICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRkFJTFVSRVxuIik7CisgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfU1RSVUNUUzsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIioqKiBGQUlMVVJFICoqKlxuIik7CiAgICAgICAgIH0KIAogICAgICAgICAvKioKQEAgLTQ1NCw4ICs1NTYsOCBAQAogICAgICAgICBsb25nIHVpZCA9IHRlc3RDbGllbnQudGVzdFR5cGVkZWYoMzA5ODU4MjM1MDgyNTIzTCk7CiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiA9ICIgKyB1aWQgKyAiXG4iKTsKICAgICAgICAgaWYgKHVpZCAhPSAzMDk4NTgyMzUwODI1MjNMKSB7Ci0gICAgICAgICAgZmFpbENvdW50Kys7Ci0gICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJGQUlMVVJFXG4iKTsKKyAgICAgICAgICByZXR1cm5Db2RlIHw9IEVSUl9CQVNFVFlQRVM7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIqKiogRkFJTFVSRSAqKipcbiIpOwogICAgICAgICB9CiAKICAgICAgICAgLyoqCkBAIC00NzQsMTIxICs1NzYsMTc0IEBACiAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgifSwgIik7CiAgICAgICAgIH0KICAgICAgICAgU3lzdGVtLm91dC5wcmludCgifVxuIik7CisgICAgICAgIGlmIChtbS5zaXplKCkgIT0gMiB8fCAhbW0uY29udGFpbnNLZXkoNCkgfHwgIW1tLmNvbnRhaW5zS2V5KC00KSkgeworICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX0NPTlRBSU5FUlM7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIqKiogRkFJTFVSRSAqKipcbiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPiBtMSA9IG1tLmdldCg0KTsKKyAgICAgICAgICBNYXA8SW50ZWdlciwgSW50ZWdlcj4gbTIgPSBtbS5nZXQoLTQpOworICAgICAgICAgIGlmIChtMS5nZXQoMSkgIT0gMSB8fCBtMS5nZXQoMikgIT0gMiB8fCBtMS5nZXQoMykgIT0gMyB8fCBtMS5nZXQoNCkgIT0gNCB8fAorICAgICAgICAgICAgICBtMi5nZXQoLTEpICE9IC0xIHx8IG0yLmdldCgtMikgIT0gLTIgfHwgbTIuZ2V0KC0zKSAhPSAtMyB8fCBtMi5nZXQoLTQpICE9IC00KSB7CisgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVSUl9DT05UQUlORVJTOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIqKiogRkFJTFVSRSAqKipcbiIpOworICAgICAgICAgIH0KKyAgICAgICAgfQogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBJTlNBTklUWSBURVNUCiAgICAgICAgICAqLwotICAgICAgICBpbnNhbmUgPSBuZXcgSW5zYW5pdHkoKTsKLSAgICAgICAgaW5zYW5lLnVzZXJNYXAgPSBuZXcgSGFzaE1hcDxOdW1iZXJ6LCBMb25nPigpOwotICAgICAgICBpbnNhbmUudXNlck1hcC5wdXQoTnVtYmVyei5GSVZFLCAobG9uZyk1MDAwKTsKLSAgICAgICAgWHRydWN0IHRydWNrID0gbmV3IFh0cnVjdCgpOwotICAgICAgICB0cnVjay5zdHJpbmdfdGhpbmcgPSAiVHJ1Y2siOwotICAgICAgICB0cnVjay5ieXRlX3RoaW5nID0gKGJ5dGUpODsKLSAgICAgICAgdHJ1Y2suaTMyX3RoaW5nID0gODsKLSAgICAgICAgdHJ1Y2suaTY0X3RoaW5nID0gODsKLSAgICAgICAgaW5zYW5lLnh0cnVjdHMgPSBuZXcgQXJyYXlMaXN0PFh0cnVjdD4oKTsKLSAgICAgICAgaW5zYW5lLnh0cnVjdHMuYWRkKHRydWNrKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdEluc2FuaXR5KCkiKTsKLSAgICAgICAgTWFwPExvbmcsTWFwPE51bWJlcnosSW5zYW5pdHk+PiB3aG9hID0KLSAgICAgICAgICB0ZXN0Q2xpZW50LnRlc3RJbnNhbml0eShpbnNhbmUpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgPSB7Iik7Ci0gICAgICAgIGZvciAobG9uZyBrZXkgOiB3aG9hLmtleVNldCgpKSB7Ci0gICAgICAgICAgTWFwPE51bWJlcnosSW5zYW5pdHk+IHZhbCA9IHdob2EuZ2V0KGtleSk7Ci0gICAgICAgICAgU3lzdGVtLm91dC5wcmludChrZXkgKyAiID0+IHsiKTsKIAotICAgICAgICAgIGZvciAoTnVtYmVyeiBrMiA6IHZhbC5rZXlTZXQoKSkgewotICAgICAgICAgICAgSW5zYW5pdHkgdjIgPSB2YWwuZ2V0KGsyKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoazIgKyAiID0+IHsiKTsKLSAgICAgICAgICAgIE1hcDxOdW1iZXJ6LCBMb25nPiB1c2VyTWFwID0gdjIudXNlck1hcDsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInsiKTsKLSAgICAgICAgICAgIGlmICh1c2VyTWFwICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgZm9yIChOdW1iZXJ6IGszIDogdXNlck1hcC5rZXlTZXQoKSkgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoazMgKyAiID0+ICIgKyB1c2VyTWFwLmdldChrMykgKyAiLCAiKTsKKyAgICAgICAgYm9vbGVhbiBpbnNhbml0eUZhaWxlZCA9IHRydWU7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgWHRydWN0IGhlbGxvID0gbmV3IFh0cnVjdCgpOworICAgICAgICAgIGhlbGxvLnN0cmluZ190aGluZyA9ICJIZWxsbzIiOworICAgICAgICAgIGhlbGxvLmJ5dGVfdGhpbmcgPSAyOworICAgICAgICAgIGhlbGxvLmkzMl90aGluZyA9IDI7CisgICAgICAgICAgaGVsbG8uaTY0X3RoaW5nID0gMjsKKworICAgICAgICAgIFh0cnVjdCBnb29kYnllID0gbmV3IFh0cnVjdCgpOworICAgICAgICAgIGdvb2RieWUuc3RyaW5nX3RoaW5nID0gIkdvb2RieWU0IjsKKyAgICAgICAgICBnb29kYnllLmJ5dGVfdGhpbmcgPSAoYnl0ZSk0OworICAgICAgICAgIGdvb2RieWUuaTMyX3RoaW5nID0gNDsKKyAgICAgICAgICBnb29kYnllLmk2NF90aGluZyA9IChsb25nKTQ7CisKKyAgICAgICAgICBpbnNhbmUudXNlck1hcCA9IG5ldyBIYXNoTWFwPE51bWJlcnosIExvbmc+KCk7CisgICAgICAgICAgaW5zYW5lLnVzZXJNYXAucHV0KE51bWJlcnouRUlHSFQsIChsb25nKTgpOworICAgICAgICAgIGluc2FuZS51c2VyTWFwLnB1dChOdW1iZXJ6LkZJVkUsIChsb25nKTUpOworICAgICAgICAgIGluc2FuZS54dHJ1Y3RzID0gbmV3IEFycmF5TGlzdDxYdHJ1Y3Q+KCk7CisgICAgICAgICAgaW5zYW5lLnh0cnVjdHMuYWRkKGdvb2RieWUpOworICAgICAgICAgIGluc2FuZS54dHJ1Y3RzLmFkZChoZWxsbyk7CisKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0SW5zYW5pdHkoKSIpOworICAgICAgICAgIE1hcDxMb25nLE1hcDxOdW1iZXJ6LEluc2FuaXR5Pj4gd2hvYSA9CisgICAgICAgICAgICB0ZXN0Q2xpZW50LnRlc3RJbnNhbml0eShpbnNhbmUpOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiA9IHsiKTsKKyAgICAgICAgICBmb3IgKGxvbmcga2V5IDogd2hvYS5rZXlTZXQoKSkgeworICAgICAgICAgICAgTWFwPE51bWJlcnosSW5zYW5pdHk+IHZhbCA9IHdob2EuZ2V0KGtleSk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KGtleSArICIgPT4geyIpOworCisgICAgICAgICAgICBmb3IgKE51bWJlcnogazIgOiB2YWwua2V5U2V0KCkpIHsKKyAgICAgICAgICAgICAgSW5zYW5pdHkgdjIgPSB2YWwuZ2V0KGsyKTsKKyAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludChrMiArICIgPT4geyIpOworICAgICAgICAgICAgICBNYXA8TnVtYmVyeiwgTG9uZz4gdXNlck1hcCA9IHYyLnVzZXJNYXA7CisgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInsiKTsKKyAgICAgICAgICAgICAgaWYgKHVzZXJNYXAgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZvciAoTnVtYmVyeiBrMyA6IHVzZXJNYXAua2V5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoazMgKyAiID0+ICIgKyB1c2VyTWFwLmdldChrMykgKyAiLCAiKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIn0sICIpOworICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ9LCAiKTsKIAotICAgICAgICAgICAgTGlzdDxYdHJ1Y3Q+IHh0cnVjdHMgPSB2Mi54dHJ1Y3RzOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgieyIpOwotICAgICAgICAgICAgaWYgKHh0cnVjdHMgIT0gbnVsbCkgewotICAgICAgICAgICAgICBmb3IgKFh0cnVjdCB4IDogeHRydWN0cykgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInsiICsgIlwiIiArIHguc3RyaW5nX3RoaW5nICsgIlwiLCAiICsgeC5ieXRlX3RoaW5nICsgIiwgIiArIHguaTMyX3RoaW5nICsgIiwgIisgeC5pNjRfdGhpbmcgKyAifSwgIik7CisgICAgICAgICAgICAgIExpc3Q8WHRydWN0PiB4dHJ1Y3RzID0gdjIueHRydWN0czsKKyAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgieyIpOworICAgICAgICAgICAgICBpZiAoeHRydWN0cyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZm9yIChYdHJ1Y3QgeCA6IHh0cnVjdHMpIHsKKyAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInsiICsgIlwiIiArIHguc3RyaW5nX3RoaW5nICsgIlwiLCAiICsgeC5ieXRlX3RoaW5nICsgIiwgIiArIHguaTMyX3RoaW5nICsgIiwgIisgeC5pNjRfdGhpbmcgKyAifSwgIik7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ9Iik7CisgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIn0iKTsKIAorICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ9LCAiKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIn0sICIpOwogICAgICAgICAgIH0KLSAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ9LCAiKTsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ9XG4iKTsKKyAgICAgICAgICBpZiAod2hvYS5zaXplKCkgPT0gMiAmJiB3aG9hLmNvbnRhaW5zS2V5KDFMKSAmJiB3aG9hLmNvbnRhaW5zS2V5KDJMKSkgeworICAgICAgICAgICAgTWFwPE51bWJlcnosIEluc2FuaXR5PiBmaXJzdF9tYXAgPSB3aG9hLmdldCgxTCk7CisgICAgICAgICAgICBNYXA8TnVtYmVyeiwgSW5zYW5pdHk+IHNlY29uZF9tYXAgPSB3aG9hLmdldCgyTCk7CisgICAgICAgICAgICBpZiAoZmlyc3RfbWFwLnNpemUoKSA9PSAyICYmCisgICAgICAgICAgICAgICAgZmlyc3RfbWFwLmNvbnRhaW5zS2V5KE51bWJlcnouVFdPKSAmJgorICAgICAgICAgICAgICAgIGZpcnN0X21hcC5jb250YWluc0tleShOdW1iZXJ6LlRIUkVFKSAmJgorICAgICAgICAgICAgICAgIHNlY29uZF9tYXAuc2l6ZSgpID09IDEgJiYKKyAgICAgICAgICAgICAgICBzZWNvbmRfbWFwLmNvbnRhaW5zS2V5KE51bWJlcnouU0lYKSAmJgorICAgICAgICAgICAgICAgIGluc2FuZS5lcXVhbHMoZmlyc3RfbWFwLmdldChOdW1iZXJ6LlRXTykpICYmCisgICAgICAgICAgICAgICAgaW5zYW5lLmVxdWFscyhmaXJzdF9tYXAuZ2V0KE51bWJlcnouVEhSRUUpKSkgeworICAgICAgICAgICAgICBJbnNhbml0eSBzaXggPXNlY29uZF9tYXAuZ2V0KE51bWJlcnouU0lYKTsKKyAgICAgICAgICAgICAgLy8gQ2Fubm90IHVzZSAibmV3IEluc2FuaXR5KCkuZXF1YWxzKHNpeCkiIGJlY2F1c2UgYXMgb2Ygbm93LCBzdHJ1Y3QvY29udGFpbmVyCisgICAgICAgICAgICAgIC8vIGZpZWxkcyB3aXRoIGRlZmF1bHQgcmVxdWlyZWRuZXNzIGhhdmUgaXNzZXQ9ZmFsc2UgZm9yIGxvY2FsIGluc3RhbmNlcyBhbmQgeWV0CisgICAgICAgICAgICAgIC8vIHJlY2VpdmVkIGVtcHR5IHZhbHVlcyBmcm9tIG90aGVyIGxhbmd1YWdlcyBsaWtlIEMrKyBoYXZlIGlzc2V0PXRydWUgLgorICAgICAgICAgICAgICBpZiAoc2l4LmdldFVzZXJNYXBTaXplKCkgPT0gMCAmJiBzaXguZ2V0WHRydWN0c1NpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gT0sKKyAgICAgICAgICAgICAgICBpbnNhbml0eUZhaWxlZCA9IGZhbHNlOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICByZXR1cm5Db2RlIHw9IEVSUl9TVFJVQ1RTOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqIEZBSUxVUkUgKioqXG4iKTsKKyAgICAgICAgICBleC5wcmludFN0YWNrVHJhY2UoU3lzdGVtLm91dCk7CisgICAgICAgICAgaW5zYW5pdHlGYWlsZWQgPSBmYWxzZTsKICAgICAgICAgfQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ9XG4iKTsKKyAgICAgICAgaWYgKGluc2FuaXR5RmFpbGVkKSB7CisgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfU1RSVUNUUzsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIioqKiBGQUlMVVJFICoqKlxuIik7CisgICAgICAgIH0KIAotICAgICAgICAKICAgICAgICAgLyoqCiAgICAgICAgICAqIEVYRUNQVElPTiBURVNUCiAgICAgICAgICAqLwogICAgICAgICB0cnkgewogICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RDbGllbnQudGVzdEV4Y2VwdGlvbihcIlhjZXB0aW9uXCIpID0+Iik7CiAgICAgICAgICAgdGVzdENsaWVudC50ZXN0RXhjZXB0aW9uKCJYY2VwdGlvbiIpOwotICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiAgdm9pZFxuRkFJTFVSRVxuIik7Ci0gICAgICAgICAgZmFpbENvdW50Kys7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiICB2b2lkXG4qKiogRkFJTFVSRSAqKipcbiIpOworICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX0VYQ0VQVElPTlM7CiAgICAgICAgIH0gY2F0Y2goWGNlcHRpb24gZSkgewogICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCIgIHslZCwgXCIlc1wifVxuIiwgZS5lcnJvckNvZGUsIGUubWVzc2FnZSk7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgdHJ5IHsKICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0Q2xpZW50LnRlc3RFeGNlcHRpb24oXCJURXhjZXB0aW9uXCIpID0+Iik7CiAgICAgICAgICAgdGVzdENsaWVudC50ZXN0RXhjZXB0aW9uKCJURXhjZXB0aW9uIik7Ci0gICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiICB2b2lkXG5GQUlMVVJFXG4iKTsKLSAgICAgICAgICBmYWlsQ291bnQrKzsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgIHZvaWRcbioqKiBGQUlMVVJFICoqKlxuIik7CisgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfRVhDRVBUSU9OUzsKICAgICAgICAgfSBjYXRjaChURXhjZXB0aW9uIGUpIHsKICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiICB7XCIlc1wifVxuIiwgZS5nZXRNZXNzYWdlKCkpOwogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdENsaWVudC50ZXN0RXhjZXB0aW9uKFwic3VjY2Vzc1wiKSA9PiIpOwogICAgICAgICAgIHRlc3RDbGllbnQudGVzdEV4Y2VwdGlvbigic3VjY2VzcyIpOwogICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiAgdm9pZFxuIik7CiAgICAgICAgIH1jYXRjaChFeGNlcHRpb24gZSkgewotICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCIgIGV4Y2VwdGlvblxuRkFJTFVSRVxuIik7Ci0gICAgICAgICAgZmFpbENvdW50Kys7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGYoIiAgZXhjZXB0aW9uXG4qKiogRkFJTFVSRSAqKipcbiIpOworICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX0VYQ0VQVElPTlM7CiAgICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIAorCisKICAgICAgICAgLyoqCiAgICAgICAgICAqIE1VTFRJIEVYQ0VQVElPTiBURVNUCiAgICAgICAgICAqLwotICAgICAgICAKKwogICAgICAgICB0cnkgewogICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCJ0ZXN0Q2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbihcIlhjZXB0aW9uXCIsIFwidGVzdCAxXCIpID0+Iik7CiAgICAgICAgICAgdGVzdENsaWVudC50ZXN0TXVsdGlFeGNlcHRpb24oIlhjZXB0aW9uIiwgInRlc3QgMSIpOwotICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiAgcmVzdWx0XG5GQUlMVVJFXG4iKTsKLSAgICAgICAgICBmYWlsQ291bnQrKzsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgIHJlc3VsdFxuKioqIEZBSUxVUkUgKioqXG4iKTsKKyAgICAgICAgICByZXR1cm5Db2RlIHw9IEVSUl9FWENFUFRJT05TOwogICAgICAgICB9IGNhdGNoKFhjZXB0aW9uIGUpIHsKICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiICB7JWQsIFwiJXNcIn1cbiIsIGUuZXJyb3JDb2RlLCBlLm1lc3NhZ2UpOwogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGYoInRlc3RDbGllbnQudGVzdE11bHRpRXhjZXB0aW9uKFwiWGNlcHRpb24yXCIsIFwidGVzdCAyXCIpID0+Iik7CiAgICAgICAgICAgdGVzdENsaWVudC50ZXN0TXVsdGlFeGNlcHRpb24oIlhjZXB0aW9uMiIsICJ0ZXN0IDIiKTsKLSAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgIHJlc3VsdFxuRkFJTFVSRVxuIik7Ci0gICAgICAgICAgZmFpbENvdW50Kys7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiICByZXN1bHRcbioqKiBGQUlMVVJFICoqKlxuIik7CisgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfRVhDRVBUSU9OUzsKICAgICAgICAgfSBjYXRjaChYY2VwdGlvbjIgZSkgewogICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCIgIHslZCwge1wiJXNcIn19XG4iLCBlLmVycm9yQ29kZSwgZS5zdHJ1Y3RfdGhpbmcuc3RyaW5nX3RoaW5nKTsKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICB0cnkgewogICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RDbGllbnQudGVzdE11bHRpRXhjZXB0aW9uKFwic3VjY2Vzc1wiLCBcInRlc3QgM1wiKSA9PiIpOwogICAgICAgICAgIFh0cnVjdCByZXN1bHQ7CiAgICAgICAgICAgcmVzdWx0ID0gdGVzdENsaWVudC50ZXN0TXVsdGlFeGNlcHRpb24oInN1Y2Nlc3MiLCAidGVzdCAzIik7CiAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGYoIiAge3tcIiVzXCJ9fVxuIiwgcmVzdWx0LnN0cmluZ190aGluZyk7CiAgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiICBleGNlcHRpb25cbkZBSUxVUkVcbiIpOwotICAgICAgICAgIGZhaWxDb3VudCsrOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCIgIGV4Y2VwdGlvblxuKioqIEZBSUxVUkUgKioqXG4iKTsKKyAgICAgICAgICByZXR1cm5Db2RlIHw9IEVSUl9FWENFUFRJT05TOwogICAgICAgICB9CiAKIAotICAgICAgICAKKwogICAgICAgICAvKioKICAgICAgICAgICogT05FV0FZIFRFU1QKICAgICAgICAgICovCkBAIC01OTgsOSArNzUzLDEwIEBACiAgICAgICAgIGxvbmcgb25ld2F5RWxhcHNlZE1pbGxpcyA9IChTeXN0ZW0ubmFub1RpbWUoKSAtIHN0YXJ0T25ld2F5KSAvIDEwMDAwMDA7CiAgICAgICAgIGlmIChvbmV3YXlFbGFwc2VkTWlsbGlzID4gMjAwKSB7CiAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPbmV3YXkgdGVzdCBmYWlsZWQ6IHRvb2sgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb25nLnRvU3RyaW5nKG9uZXdheUVsYXBzZWRNaWxsaXMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtcyIpOwotICAgICAgICAgIGZhaWxDb3VudCsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb25nLnRvU3RyaW5nKG9uZXdheUVsYXBzZWRNaWxsaXMpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1zIik7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGYoIioqKiBGQUlMVVJFICoqKlxuIik7CisgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfQkFTRVRZUEVTOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU3VjY2VzcyAtIHRvb2sgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvbmcudG9TdHJpbmcob25ld2F5RWxhcHNlZE1pbGxpcykgKwpAQCAtNjIzLDggKzc3OSw5IEBACiAKICAgICAgICAgdHJhbnNwb3J0LmNsb3NlKCk7CiAgICAgICB9IGNhdGNoIChFeGNlcHRpb24geCkgeworICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiKioqIEZBSUxVUkUgKioqXG4iKTsKICAgICAgICAgeC5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgZmFpbENvdW50Kys7CisgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX1VOS05PV047CiAgICAgICB9CiAgICAgfQogCkBAIC02MzYsMTMgKzc5MywxNCBAQAogCiAgICAgdHJ5IHsKICAgICAgIFN0cmluZyBqc29uID0gKG5ldyBUU2VyaWFsaXplcihuZXcgVFNpbXBsZUpTT05Qcm90b2NvbC5GYWN0b3J5KCkpKS50b1N0cmluZyhpbnNhbmUpOwotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcbkZvciBnb29kIG1lYXVzcmUgaGVyZSBpcyBzb21lIEpTT046XG4iICsganNvbik7CisgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuU2FtcGxlIFRTaW1wbGVKU09OUHJvdG9jb2wgb3V0cHV0OlxuIiArIGpzb24pOwogICAgIH0gY2F0Y2ggKFRFeGNlcHRpb24geCkgeworICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIqKiogRkFJTFVSRSAqKioiKTsKICAgICAgIHgucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICBTeXN0ZW0uZXhpdCgxKTsKKyAgICAgIHJldHVybkNvZGUgfD0gRVJSX0JBU0VUWVBFUzsKICAgICB9CiAKIAotICAgIFN5c3RlbS5leGl0KGZhaWxDb3VudCk7CisgICAgU3lzdGVtLmV4aXQocmV0dXJuQ29kZSk7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdGVzdC9UZXN0U2VydmVyLmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Rlc3QvVGVzdFNlcnZlci5qYXZhCmluZGV4IGVlMDg2NmUuLjFmM2U1NTUgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdGVzdC9UZXN0U2VydmVyLmphdmEKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90ZXN0L1Rlc3RTZXJ2ZXIuamF2YQpAQCAtMzAsNiArMzAsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRKU09OUHJvdG9jb2w7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sOwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbEZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE11bHRpcGxleGVkUHJvdG9jb2w7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLlNlcnZlckNvbnRleHQ7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLlRTZXJ2ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLlRTZXJ2ZXIuQXJnczsKQEAgLTQ2LDEwICs0NywxMSBAQAogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0OwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0RmFjdG9yeTsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OwotCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVE11bHRpcGxleGVkUHJvY2Vzc29yOwogCiBpbXBvcnQgdGhyaWZ0LnRlc3QuSW5zYW5pdHk7CiBpbXBvcnQgdGhyaWZ0LnRlc3QuTnVtYmVyejsKK2ltcG9ydCB0aHJpZnQudGVzdC5TZWNvbmRTZXJ2aWNlOwogaW1wb3J0IHRocmlmdC50ZXN0LlRocmlmdFRlc3Q7CiBpbXBvcnQgdGhyaWZ0LnRlc3QuWGNlcHRpb247CiBpbXBvcnQgdGhyaWZ0LnRlc3QuWGNlcHRpb24yOwpAQCAtNTgsNiArNjAsMjQgQEAKIAogcHVibGljIGNsYXNzIFRlc3RTZXJ2ZXIgewogCisgIC8vIE11bHRpcGxleGVkIFByb3RvY29sIFN1cHBvcnQgRGV0YWlsczoKKyAgLy8KKyAgLy8gRm9yIG11bHRpcGxleGVkIHRlc3Rpbmcgd2UgYWx3YXlzIHVzZSBiaW5hcnkgcHJvdG9jb2wgdW5kZXJuZWF0aC4KKyAgLy8KKyAgLy8gIlRocmlmdFRlc3QiIG5hbWVkIHNlcnZpY2UgaW1wbGVtZW50cyAiVGhyaWZ0VGVzdCIgZnJvbSBUaHJpZnRUZXN0LnRocmlmdAorICAvLyAiU2Vjb25kU2VydmljZSIgbmFtZWQgc2VydmljZSBpbXBsZW1lbnRzICJTZWNvbmRTZXJ2aWNlIiBmcm9tIFRocmlmdFRlc3QudGhyaWZ0CisgIC8vIEluIGFkZGl0aW9uLCB0byBzdXBwb3J0IG9sZGVyIG5vbi1tdWx0aXBsZXhlZCBjbGllbnRzIHVzaW5nIHRoZSBzYW1lIGNvbmNyZXRlIHByb3RvY29sCisgIC8vIHRoZSBtdWx0aXBsZXhlZCBwcm9jZXNzb3IgaXMgdGF1Z2h0IHRvIHVzZSAiVGhyaWZ0VGVzdCIgaWYgdGhlIGluY29taW5nIHJlcXVlc3QgaGFzIG5vCisgIC8vIG11bHRpcGxleGVkIGNhbGwgbmFtZSBkZWNvcmF0aW9uLgorCisgIHN0YXRpYyBjbGFzcyBTZWNvbmRIYW5kbGVyIGltcGxlbWVudHMgdGhyaWZ0LnRlc3QuU2Vjb25kU2VydmljZS5JZmFjZSB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBzZWNvbmR0ZXN0U3RyaW5nKGphdmEubGFuZy5TdHJpbmcgdGhpbmcpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uCisgICAgeyByZXR1cm4gInRlc3RTdHJpbmcoXCIiICsgdGhpbmcgKyAiXCIpIjsgfQorCisgIH0KKwogICBzdGF0aWMgY2xhc3MgVGVzdFNlcnZlckNvbnRleHQgaW1wbGVtZW50cyBTZXJ2ZXJDb250ZXh0IHsKIAogICAgICAgICBpbnQgY29ubmVjdGlvbklkOwpAQCAtMTExLDYgKzEzMSw4IEBACiAgICAgICBTdHJpbmcgcHJvdG9jb2xfdHlwZSA9ICJiaW5hcnkiOwogICAgICAgU3RyaW5nIHNlcnZlcl90eXBlID0gInRocmVhZC1wb29sIjsKICAgICAgIFN0cmluZyBkb21haW5fc29ja2V0ID0gIiI7CisgICAgICBpbnQgc3RyaW5nX2xpbWl0ID0gLTE7CisgICAgICBpbnQgY29udGFpbmVyX2xpbWl0ID0gLTE7CiAgICAgICB0cnkgewogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICBpZiAoYXJnc1tpXS5zdGFydHNXaXRoKCItLXBvcnQiKSkgewpAQCAtMTI4LDE0ICsxNTAsMjAgQEAKICAgICAgICAgICAgIHRyYW5zcG9ydF90eXBlLnRyaW0oKTsKICAgICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCItLXNzbCIpKSB7CiAgICAgICAgICAgICBzc2wgPSB0cnVlOworICAgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXS5zdGFydHNXaXRoKCItLXN0cmluZy1saW1pdCIpKSB7CisgICAgICAgICAgICBzdHJpbmdfbGltaXQgPSBJbnRlZ2VyLnZhbHVlT2YoYXJnc1tpXS5zcGxpdCgiPSIpWzFdKTsKKyAgICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uc3RhcnRzV2l0aCgiLS1jb250YWluZXItbGltaXQiKSkgeworICAgICAgICAgICAgY29udGFpbmVyX2xpbWl0ID0gSW50ZWdlci52YWx1ZU9mKGFyZ3NbaV0uc3BsaXQoIj0iKVsxXSk7CiAgICAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLmVxdWFscygiLS1oZWxwIikpIHsKICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQWxsb3dlZCBvcHRpb25zOiIpOwogICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIC0taGVscFx0XHRcdFByb2R1Y2UgaGVscCBtZXNzYWdlIik7CiAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLS1wb3J0PWFyZyAoPSIgKyBwb3J0ICsgIilcdFBvcnQgbnVtYmVyIHRvIGNvbm5lY3QiKTsKICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAtLXRyYW5zcG9ydD1hcmcgKD0iICsgdHJhbnNwb3J0X3R5cGUgKyAiKVxuXHRcdFx0XHRUcmFuc3BvcnQ6IGJ1ZmZlcmVkLCBmcmFtZWQsIGZhc3RmcmFtZWQiKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAtLXByb3RvY29sPWFyZyAoPSIgKyBwcm90b2NvbF90eXBlICsgIilcdFByb3RvY29sOiBiaW5hcnksIGpzb24sIGNvbXBhY3QiKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAtLXByb3RvY29sPWFyZyAoPSIgKyBwcm90b2NvbF90eXBlICsgIilcdFByb3RvY29sOiBiaW5hcnksIGNvbXBhY3QsIGpzb24sIG11bHRpLCBtdWx0aWMsIG11bHRpaiIpOwogICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIC0tc3NsXHRcdFx0RW5jcnlwdGVkIFRyYW5zcG9ydCB1c2luZyBTU0wiKTsKICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAtLXNlcnZlci10eXBlPWFyZyAoPSIgKyBzZXJ2ZXJfdHlwZSArIilcblx0XHRcdFx0VHlwZSBvZiBzZXJ2ZXI6IHNpbXBsZSwgdGhyZWFkLXBvb2wsIG5vbmJsb2NraW5nLCB0aHJlYWRlZC1zZWxlY3RvciIpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIC0tc3RyaW5nLWxpbWl0PWFyZyAoPSIgKyBzdHJpbmdfbGltaXQgKyAiKVx0U3RyaW5nIHJlYWQgbGVuZ3RoIGxpbWl0Iik7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLS1jb250YWluZXItbGltaXQ9YXJnICg9IiArIGNvbnRhaW5lcl9saW1pdCArICIpXHRDb250YWluZXIgcmVhZCBsZW5ndGggbGltaXQiKTsKICAgICAgICAgICAgIFN5c3RlbS5leGl0KDApOwogICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMTU5LDggKzE4NywxMSBAQAogICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlVua25vd24gc2VydmVyIHR5cGUhICIgKyBzZXJ2ZXJfdHlwZSk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHByb3RvY29sX3R5cGUuZXF1YWxzKCJiaW5hcnkiKSkgewotICAgICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUuZXF1YWxzKCJqc29uIikpIHsKICAgICAgICAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlLmVxdWFscygiY29tcGFjdCIpKSB7CisgICAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZS5lcXVhbHMoImpzb24iKSkgeworICAgICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUuZXF1YWxzKCJtdWx0aSIpKSB7CisgICAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZS5lcXVhbHMoIm11bHRpYyIpKSB7CisgICAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZS5lcXVhbHMoIm11bHRpaiIpKSB7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiVW5rbm93biBwcm90b2NvbCB0eXBlISAiICsgcHJvdG9jb2xfdHlwZSk7CiAgICAgICAgIH0KQEAgLTE3NSwyMCArMjA2LDIxIEBACiAgICAgICAgIFN5c3RlbS5leGl0KDEpOwogICAgICAgfQogCi0gICAgICAvLyBQcm9jZXNzb3IKLSAgICAgIFRlc3RIYW5kbGVyIHRlc3RIYW5kbGVyID0KLSAgICAgICAgbmV3IFRlc3RIYW5kbGVyKCk7Ci0gICAgICBUaHJpZnRUZXN0LlByb2Nlc3NvciB0ZXN0UHJvY2Vzc29yID0KLSAgICAgICAgbmV3IFRocmlmdFRlc3QuUHJvY2Vzc29yKHRlc3RIYW5kbGVyKTsKKyAgICAgIC8vIFByb2Nlc3NvcnMKKyAgICAgIFRlc3RIYW5kbGVyIHRlc3RIYW5kbGVyID0gbmV3IFRlc3RIYW5kbGVyKCk7CisgICAgICBUaHJpZnRUZXN0LlByb2Nlc3NvciB0ZXN0UHJvY2Vzc29yID0gbmV3IFRocmlmdFRlc3QuUHJvY2Vzc29yKHRlc3RIYW5kbGVyKTsKKworICAgICAgU2Vjb25kSGFuZGxlciBzZWNvbmRIYW5kbGVyID0gbmV3IFNlY29uZEhhbmRsZXIoKTsKKyAgICAgIFNlY29uZFNlcnZpY2UuUHJvY2Vzc29yIHNlY29uZFByb2Nlc3NvciA9IG5ldyBTZWNvbmRTZXJ2aWNlLlByb2Nlc3NvcihzZWNvbmRIYW5kbGVyKTsKIAogICAgICAgLy8gUHJvdG9jb2wgZmFjdG9yeQogICAgICAgVFByb3RvY29sRmFjdG9yeSB0UHJvdG9jb2xGYWN0b3J5ID0gbnVsbDsKLSAgICAgIGlmIChwcm90b2NvbF90eXBlLmVxdWFscygianNvbiIpKSB7CisgICAgICBpZiAocHJvdG9jb2xfdHlwZS5lcXVhbHMoImpzb24iKSB8fCBwcm90b2NvbF90eXBlLmVxdWFscygibXVsdGlqIikpIHsKICAgICAgICAgdFByb3RvY29sRmFjdG9yeSA9IG5ldyBUSlNPTlByb3RvY29sLkZhY3RvcnkoKTsKLSAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZS5lcXVhbHMoImNvbXBhY3QiKSkgewotICAgICAgICB0UHJvdG9jb2xGYWN0b3J5ID0gbmV3IFRDb21wYWN0UHJvdG9jb2wuRmFjdG9yeSgpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgdFByb3RvY29sRmFjdG9yeSA9IG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpOworICAgICAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlLmVxdWFscygiY29tcGFjdCIpIHx8IHByb3RvY29sX3R5cGUuZXF1YWxzKCJtdWx0aWMiKSkgeworICAgICAgICB0UHJvdG9jb2xGYWN0b3J5ID0gbmV3IFRDb21wYWN0UHJvdG9jb2wuRmFjdG9yeShzdHJpbmdfbGltaXQsIGNvbnRhaW5lcl9saW1pdCk7CisgICAgICB9IGVsc2UgeyAvLyBhbHNvIGNvdmVycyBtdWx0aQorICAgICAgICB0UHJvdG9jb2xGYWN0b3J5ID0gbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KHN0cmluZ19saW1pdCwgY29udGFpbmVyX2xpbWl0KTsKICAgICAgIH0KIAogICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgdFRyYW5zcG9ydEZhY3RvcnkgPSBudWxsOwpAQCAtMjAzLDYgKzIzNSwxMSBAQAogCiAgICAgICBUU2VydmVyIHNlcnZlckVuZ2luZSA9IG51bGw7CiAKKyAgICAgIC8vIElmIHdlIGFyZSBtdWx0aXBsZXhpbmcgc2VydmljZXMgaW4gb25lIHNlcnZlci4uLgorICAgICAgVE11bHRpcGxleGVkUHJvY2Vzc29yIG11bHRpcGxleGVkUHJvY2Vzc29yID0gbmV3IFRNdWx0aXBsZXhlZFByb2Nlc3NvcigpOworICAgICAgbXVsdGlwbGV4ZWRQcm9jZXNzb3IucmVnaXN0ZXJEZWZhdWx0ICAodGVzdFByb2Nlc3Nvcik7CisgICAgICBtdWx0aXBsZXhlZFByb2Nlc3Nvci5yZWdpc3RlclByb2Nlc3NvcigiVGhyaWZ0VGVzdCIsIHRlc3RQcm9jZXNzb3IpOworICAgICAgbXVsdGlwbGV4ZWRQcm9jZXNzb3IucmVnaXN0ZXJQcm9jZXNzb3IoIlNlY29uZFNlcnZpY2UiLCBzZWNvbmRQcm9jZXNzb3IpOwogCiAgICAgICBpZiAoc2VydmVyX3R5cGUuZXF1YWxzKCJub25ibG9ja2luZyIpIHx8CiAgICAgICAgICAgc2VydmVyX3R5cGUuZXF1YWxzKCJ0aHJlYWRlZC1zZWxlY3RvciIpKSB7CkBAIC0yMTAsMjMgKzI0NywyMSBAQAogICAgICAgICBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQgdE5vbmJsb2NraW5nU2VydmVyU29ja2V0ID0KICAgICAgICAgICBuZXcgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0KG5ldyBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQuTm9uYmxvY2tpbmdBYnN0cmFjdFNlcnZlclNvY2tldEFyZ3MoKS5wb3J0KHBvcnQpKTsKIAotICAgICAgICBpZiAoc2VydmVyX3R5cGUuZXF1YWxzKCJub25ibG9ja2luZyIpKSB7CisgICAgICAgIGlmIChzZXJ2ZXJfdHlwZS5jb250YWlucygibm9uYmxvY2tpbmciKSkgewogICAgICAgICAgIC8vIE5vbmJsb2NraW5nIFNlcnZlcgogICAgICAgICAgIFROb25ibG9ja2luZ1NlcnZlci5BcmdzIHROb25ibG9ja2luZ1NlcnZlckFyZ3MKICAgICAgICAgICAgICAgPSBuZXcgVE5vbmJsb2NraW5nU2VydmVyLkFyZ3ModE5vbmJsb2NraW5nU2VydmVyU29ja2V0KTsKLSAgICAgICAgICB0Tm9uYmxvY2tpbmdTZXJ2ZXJBcmdzLnByb2Nlc3Nvcih0ZXN0UHJvY2Vzc29yKTsKKyAgICAgICAgICB0Tm9uYmxvY2tpbmdTZXJ2ZXJBcmdzLnByb2Nlc3Nvcihwcm90b2NvbF90eXBlLnN0YXJ0c1dpdGgoIm11bHRpIikgPyBtdWx0aXBsZXhlZFByb2Nlc3NvciA6IHRlc3RQcm9jZXNzb3IpOwogICAgICAgICAgIHROb25ibG9ja2luZ1NlcnZlckFyZ3MucHJvdG9jb2xGYWN0b3J5KHRQcm90b2NvbEZhY3RvcnkpOwogICAgICAgICAgIHROb25ibG9ja2luZ1NlcnZlckFyZ3MudHJhbnNwb3J0RmFjdG9yeSh0VHJhbnNwb3J0RmFjdG9yeSk7Ci0KICAgICAgICAgICBzZXJ2ZXJFbmdpbmUgPSBuZXcgVE5vbmJsb2NraW5nU2VydmVyKHROb25ibG9ja2luZ1NlcnZlckFyZ3MpOwogICAgICAgICB9IGVsc2UgeyAvLyBzZXJ2ZXJfdHlwZS5lcXVhbHMoInRocmVhZGVkLXNlbGVjdG9yIikKICAgICAgICAgICAvLyBUaHJlYWRlZFNlbGVjdG9yIFNlcnZlcgogICAgICAgICAgIFRUaHJlYWRlZFNlbGVjdG9yU2VydmVyLkFyZ3MgdFRocmVhZGVkU2VsZWN0b3JTZXJ2ZXJBcmdzCiAgICAgICAgICAgICAgID0gbmV3IFRUaHJlYWRlZFNlbGVjdG9yU2VydmVyLkFyZ3ModE5vbmJsb2NraW5nU2VydmVyU29ja2V0KTsKLSAgICAgICAgICB0VGhyZWFkZWRTZWxlY3RvclNlcnZlckFyZ3MucHJvY2Vzc29yKHRlc3RQcm9jZXNzb3IpOworICAgICAgICAgIHRUaHJlYWRlZFNlbGVjdG9yU2VydmVyQXJncy5wcm9jZXNzb3IocHJvdG9jb2xfdHlwZS5zdGFydHNXaXRoKCJtdWx0aSIpID8gbXVsdGlwbGV4ZWRQcm9jZXNzb3IgOiB0ZXN0UHJvY2Vzc29yKTsKICAgICAgICAgICB0VGhyZWFkZWRTZWxlY3RvclNlcnZlckFyZ3MucHJvdG9jb2xGYWN0b3J5KHRQcm90b2NvbEZhY3RvcnkpOwogICAgICAgICAgIHRUaHJlYWRlZFNlbGVjdG9yU2VydmVyQXJncy50cmFuc3BvcnRGYWN0b3J5KHRUcmFuc3BvcnRGYWN0b3J5KTsKLQogICAgICAgICAgIHNlcnZlckVuZ2luZSA9IG5ldyBUVGhyZWFkZWRTZWxlY3RvclNlcnZlcih0VGhyZWFkZWRTZWxlY3RvclNlcnZlckFyZ3MpOwogICAgICAgICB9CiAgICAgICB9IGVsc2UgewpAQCAtMjQzLDI5ICsyNzgsMjggQEAKICAgICAgICAgaWYgKHNlcnZlcl90eXBlLmVxdWFscygic2ltcGxlIikpIHsKICAgICAgICAgICAvLyBTaW1wbGUgU2VydmVyCiAgICAgICAgICAgVFNlcnZlci5BcmdzIHRTZXJ2ZXJBcmdzID0gbmV3IFRTZXJ2ZXIuQXJncyh0U2VydmVyU29ja2V0KTsKLSAgICAgICAgICB0U2VydmVyQXJncy5wcm9jZXNzb3IodGVzdFByb2Nlc3Nvcik7CisgICAgICAgICAgdFNlcnZlckFyZ3MucHJvY2Vzc29yKHByb3RvY29sX3R5cGUuc3RhcnRzV2l0aCgibXVsdGkiKSA/IG11bHRpcGxleGVkUHJvY2Vzc29yIDogdGVzdFByb2Nlc3Nvcik7CiAgICAgICAgICAgdFNlcnZlckFyZ3MucHJvdG9jb2xGYWN0b3J5KHRQcm90b2NvbEZhY3RvcnkpOwogICAgICAgICAgIHRTZXJ2ZXJBcmdzLnRyYW5zcG9ydEZhY3RvcnkodFRyYW5zcG9ydEZhY3RvcnkpOwotCiAgICAgICAgICAgc2VydmVyRW5naW5lID0gbmV3IFRTaW1wbGVTZXJ2ZXIodFNlcnZlckFyZ3MpOwogICAgICAgICB9IGVsc2UgeyAvLyBzZXJ2ZXJfdHlwZS5lcXVhbHMoInRocmVhZHBvb2wiKQogICAgICAgICAgIC8vIFRocmVhZFBvb2wgU2VydmVyCiAgICAgICAgICAgVFRocmVhZFBvb2xTZXJ2ZXIuQXJncyB0VGhyZWFkUG9vbFNlcnZlckFyZ3MKICAgICAgICAgICAgICAgPSBuZXcgVFRocmVhZFBvb2xTZXJ2ZXIuQXJncyh0U2VydmVyU29ja2V0KTsKLSAgICAgICAgICB0VGhyZWFkUG9vbFNlcnZlckFyZ3MucHJvY2Vzc29yKHRlc3RQcm9jZXNzb3IpOworICAgICAgICAgIHRUaHJlYWRQb29sU2VydmVyQXJncy5wcm9jZXNzb3IocHJvdG9jb2xfdHlwZS5zdGFydHNXaXRoKCJtdWx0aSIpID8gbXVsdGlwbGV4ZWRQcm9jZXNzb3IgOiB0ZXN0UHJvY2Vzc29yKTsKICAgICAgICAgICB0VGhyZWFkUG9vbFNlcnZlckFyZ3MucHJvdG9jb2xGYWN0b3J5KHRQcm90b2NvbEZhY3RvcnkpOwogICAgICAgICAgIHRUaHJlYWRQb29sU2VydmVyQXJncy50cmFuc3BvcnRGYWN0b3J5KHRUcmFuc3BvcnRGYWN0b3J5KTsKLQogICAgICAgICAgIHNlcnZlckVuZ2luZSA9IG5ldyBUVGhyZWFkUG9vbFNlcnZlcih0VGhyZWFkUG9vbFNlcnZlckFyZ3MpOwogICAgICAgICB9CiAgICAgICB9CiAKLQotICAgICAgLy9TZXQgc2VydmVyIGV2ZW50IGhhbmRsZXIKKyAgICAgIC8vIFNldCBzZXJ2ZXIgZXZlbnQgaGFuZGxlcgogICAgICAgc2VydmVyRW5naW5lLnNldFNlcnZlckV2ZW50SGFuZGxlcihuZXcgVGVzdFNlcnZlckV2ZW50SGFuZGxlcigpKTsKIAogICAgICAgLy8gUnVuIGl0Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlN0YXJ0aW5nIHRoZSBzZXJ2ZXIgb24gcG9ydCAiICsgcG9ydCArICIuLi4iKTsKKyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU3RhcnRpbmcgdGhlICIgKyAoc3NsID8gInNzbCBzZXJ2ZXIiIDogInNlcnZlciIpICsKKyAgICAgICAgIiBbIiArIHByb3RvY29sX3R5cGUgKyAiLyIgKyB0cmFuc3BvcnRfdHlwZSArICIvIiArIHNlcnZlcl90eXBlICsgIl0gb24gIiArCisgICAgICAgICgoZG9tYWluX3NvY2tldCA9PSAiIikgPyAoInBvcnQgIiArIHBvcnQpIDogKCJ1bml4IHNvY2tldCAiICsgZG9tYWluX3NvY2tldCkpKTsKICAgICAgIHNlcnZlckVuZ2luZS5zZXJ2ZSgpOwogCiAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIHgpIHsKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1JlYWRDb3VudGluZ1RyYW5zcG9ydC5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvUmVhZENvdW50aW5nVHJhbnNwb3J0LmphdmEKaW5kZXggODQ3NDE4OC4uM2M3NDlmOSAxMDA2NDQKLS0tIGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvUmVhZENvdW50aW5nVHJhbnNwb3J0LmphdmEKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvUmVhZENvdW50aW5nVHJhbnNwb3J0LmphdmEKQEAgLTIyLDI2ICsyMiw0MCBAQAogcHVibGljIGNsYXNzIFJlYWRDb3VudGluZ1RyYW5zcG9ydCBleHRlbmRzIFRUcmFuc3BvcnQgewogICBwdWJsaWMgaW50IHJlYWRDb3VudCA9IDA7CiAgIHByaXZhdGUgVFRyYW5zcG9ydCB0cmFuczsKKyAgcHJpdmF0ZSBib29sZWFuIG9wZW4gPSB0cnVlOwogCiAgIHB1YmxpYyBSZWFkQ291bnRpbmdUcmFuc3BvcnQoVFRyYW5zcG9ydCB1bmRlcmx5aW5nKSB7CiAgICAgdHJhbnMgPSB1bmRlcmx5aW5nOwogICB9CiAKICAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIGNsb3NlKCkge30KKyAgcHVibGljIHZvaWQgY2xvc2UoKSB7CisgICAgb3BlbiA9IGZhbHNlOworICB9CiAKICAgQE92ZXJyaWRlCi0gIHB1YmxpYyBib29sZWFuIGlzT3BlbigpIHtyZXR1cm4gdHJ1ZTt9CisgIHB1YmxpYyBib29sZWFuIGlzT3BlbigpIHsKKyAgICByZXR1cm4gb3BlbjsKKyAgfQogCiAgIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCBvcGVuKCkgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24ge30KKyAgcHVibGljIHZvaWQgb3BlbigpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICBvcGVuID0gdHJ1ZTsKKyAgfQogCiAgIEBPdmVycmlkZQogICBwdWJsaWMgaW50IHJlYWQoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24geworICAgIGlmICghaXNPcGVuKCkpIHsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uTk9UX09QRU4sICJUcmFuc3BvcnQgaXMgY2xvc2VkIik7CisgICAgfQogICAgIHJlYWRDb3VudCsrOwogICAgIHJldHVybiB0cmFucy5yZWFkKGJ1Ziwgb2ZmLCBsZW4pOwogICB9CiAKICAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHt9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorICBwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgaWYgKCFpc09wZW4oKSkgeworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwgIlRyYW5zcG9ydCBpcyBjbG9zZWQiKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RBdXRvRXhwYW5kaW5nQnVmZmVyLmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0QXV0b0V4cGFuZGluZ0J1ZmZlci5qYXZhCmluZGV4IDMzN2RjZjguLmMzNTM0ODkgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RBdXRvRXhwYW5kaW5nQnVmZmVyLmphdmEKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdEF1dG9FeHBhbmRpbmdCdWZmZXIuamF2YQpAQCAtMjMsNyArMjMsNyBAQAogcHVibGljIGNsYXNzIFRlc3RBdXRvRXhwYW5kaW5nQnVmZmVyIGV4dGVuZHMgVGVzdENhc2UgewogICBwdWJsaWMgdm9pZCB0ZXN0RXhwYW5kcygpIHRocm93cyBFeGNlcHRpb24gewogICAgIC8vIGhhcyBleHBlY3RlZCBpbml0aWFsIGNhcGFjaXR5Ci0gICAgQXV0b0V4cGFuZGluZ0J1ZmZlciBiID0gbmV3IEF1dG9FeHBhbmRpbmdCdWZmZXIoMTAsIDEuNSk7CisgICAgQXV0b0V4cGFuZGluZ0J1ZmZlciBiID0gbmV3IEF1dG9FeHBhbmRpbmdCdWZmZXIoMTApOwogICAgIGFzc2VydEVxdWFscygxMCwgYi5hcnJheSgpLmxlbmd0aCk7CiAKICAgICAvLyBkb2Vzbid0IHNocmluawpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdEF1dG9FeHBhbmRpbmdCdWZmZXJSZWFkVHJhbnNwb3J0LmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0QXV0b0V4cGFuZGluZ0J1ZmZlclJlYWRUcmFuc3BvcnQuamF2YQppbmRleCAyZTFmOTQ3Li44M2ViYzJkIDEwMDY0NAotLS0gYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0QXV0b0V4cGFuZGluZ0J1ZmZlclJlYWRUcmFuc3BvcnQuamF2YQorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0QXV0b0V4cGFuZGluZ0J1ZmZlclJlYWRUcmFuc3BvcnQuamF2YQpAQCAtMzIsNyArMzIsNyBAQAogICB9CiAKICAgcHVibGljIHZvaWQgdGVzdEl0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgQXV0b0V4cGFuZGluZ0J1ZmZlclJlYWRUcmFuc3BvcnQgdCA9IG5ldyBBdXRvRXhwYW5kaW5nQnVmZmVyUmVhZFRyYW5zcG9ydCgxNTAsIDEuNSk7CisgICAgQXV0b0V4cGFuZGluZ0J1ZmZlclJlYWRUcmFuc3BvcnQgdCA9IG5ldyBBdXRvRXhwYW5kaW5nQnVmZmVyUmVhZFRyYW5zcG9ydCgxNTApOwogCiAgICAgVE1lbW9yeUlucHV0VHJhbnNwb3J0IG1lbWJ1ZiA9IG5ldyBUTWVtb3J5SW5wdXRUcmFuc3BvcnQoSFVORFJFRF9CWVRFUyk7CiAKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RBdXRvRXhwYW5kaW5nQnVmZmVyV3JpdGVUcmFuc3BvcnQuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RBdXRvRXhwYW5kaW5nQnVmZmVyV3JpdGVUcmFuc3BvcnQuamF2YQppbmRleCBkNWYyMzlkLi44NmI1YjBkIDEwMDY0NAotLS0gYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0QXV0b0V4cGFuZGluZ0J1ZmZlcldyaXRlVHJhbnNwb3J0LmphdmEKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdEF1dG9FeHBhbmRpbmdCdWZmZXJXcml0ZVRyYW5zcG9ydC5qYXZhCkBAIC0xOSwyNiArMTksNTEgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OwogCiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC4qOwogCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworcHVibGljIGNsYXNzIFRlc3RBdXRvRXhwYW5kaW5nQnVmZmVyV3JpdGVUcmFuc3BvcnQgewogCi1wdWJsaWMgY2xhc3MgVGVzdEF1dG9FeHBhbmRpbmdCdWZmZXJXcml0ZVRyYW5zcG9ydCBleHRlbmRzIFRlc3RDYXNlIHsKLQorICBAVGVzdAogICBwdWJsaWMgdm9pZCB0ZXN0SXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBBdXRvRXhwYW5kaW5nQnVmZmVyV3JpdGVUcmFuc3BvcnQgdCA9IG5ldyBBdXRvRXhwYW5kaW5nQnVmZmVyV3JpdGVUcmFuc3BvcnQoMSwgMS41KTsKKyAgICBBdXRvRXhwYW5kaW5nQnVmZmVyV3JpdGVUcmFuc3BvcnQgdCA9IG5ldyBBdXRvRXhwYW5kaW5nQnVmZmVyV3JpdGVUcmFuc3BvcnQoMSwgMCk7CisgICAgYXNzZXJ0RXF1YWxzKDAsIHQuZ2V0TGVuZ3RoKCkpOwogICAgIGFzc2VydEVxdWFscygxLCB0LmdldEJ1ZigpLmFycmF5KCkubGVuZ3RoKTsKICAgICBieXRlW10gYjEgPSBuZXcgYnl0ZVtdezEsMiwzfTsKICAgICB0LndyaXRlKGIxKTsKLSAgICBhc3NlcnRFcXVhbHMoMywgdC5nZXRQb3MoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDMsIHQuZ2V0TGVuZ3RoKCkpOwogICAgIGFzc2VydFRydWUodC5nZXRCdWYoKS5hcnJheSgpLmxlbmd0aCA+PSAzKTsKICAgICBhc3NlcnRFcXVhbHMoQnl0ZUJ1ZmZlci53cmFwKGIxKSwgQnl0ZUJ1ZmZlci53cmFwKHQuZ2V0QnVmKCkuYXJyYXkoKSwgMCwgMykpOwogCiAgICAgdC5yZXNldCgpOworICAgIGFzc2VydEVxdWFscygwLCB0LmdldExlbmd0aCgpKTsKICAgICBhc3NlcnRUcnVlKHQuZ2V0QnVmKCkuYXJyYXkoKS5sZW5ndGggPj0gMyk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIHQuZ2V0UG9zKCkpOwogICAgIGJ5dGVbXSBiMiA9IG5ldyBieXRlW117NCw1fTsKICAgICB0LndyaXRlKGIyKTsKLSAgICBhc3NlcnRFcXVhbHMoMiwgdC5nZXRQb3MoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDIsIHQuZ2V0TGVuZ3RoKCkpOwogICAgIGFzc2VydEVxdWFscyhCeXRlQnVmZmVyLndyYXAoYjIpLCBCeXRlQnVmZmVyLndyYXAodC5nZXRCdWYoKS5hcnJheSgpLCAwLCAyKSk7CisKKyAgICBBdXRvRXhwYW5kaW5nQnVmZmVyV3JpdGVUcmFuc3BvcnQgdXV0ID0gbmV3IEF1dG9FeHBhbmRpbmdCdWZmZXJXcml0ZVRyYW5zcG9ydCg4LCA0KTsKKyAgICBhc3NlcnRFcXVhbHMoNCwgdXV0LmdldExlbmd0aCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoOCwgdXV0LmdldEJ1ZigpLmFycmF5KCkubGVuZ3RoKTsKKyAgICB1dXQud3JpdGUoYjEpOworICAgIGFzc2VydEVxdWFscyg3LCB1dXQuZ2V0TGVuZ3RoKCkpOworICAgIGFzc2VydEVxdWFscyg4LCB1dXQuZ2V0QnVmKCkuYXJyYXkoKS5sZW5ndGgpOworICAgIGFzc2VydEVxdWFscyhCeXRlQnVmZmVyLndyYXAoYjEpLCBCeXRlQnVmZmVyLndyYXAodXV0LmdldEJ1ZigpLmFycmF5KCksIDQsIDMpKTsKKyAgfQorCisgIEBUZXN0KGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzKQorICBwdWJsaWMgdm9pZCB0ZXN0QmFkSW5pdGlhbFNpemUoKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKKyAgICBuZXcgQXV0b0V4cGFuZGluZ0J1ZmZlcldyaXRlVHJhbnNwb3J0KDAsIDApOworICB9CisKKyAgQFRlc3QoZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MpCisgIHB1YmxpYyB2b2lkIHRlc3RCYWRGcm9udFJlc2VydmVTaXplKCkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisgICAgbmV3IEF1dG9FeHBhbmRpbmdCdWZmZXJXcml0ZVRyYW5zcG9ydCg0LCAtMSk7CisgIH0KKworICBAVGVzdChleHBlY3RlZCA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcykKKyAgcHVibGljIHZvaWQgdGVzdFRvb1NtYWxsRnJvbnRSZXNlcnZlU2l6ZSgpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworICAgIG5ldyBBdXRvRXhwYW5kaW5nQnVmZmVyV3JpdGVUcmFuc3BvcnQoNCwgNSk7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RUQnl0ZUJ1ZmZlci5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRCeXRlQnVmZmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTczMDc1YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RUQnl0ZUJ1ZmZlci5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5DaGFyc2V0czsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOworCitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKKworcHVibGljIGNsYXNzIFRlc3RUQnl0ZUJ1ZmZlciBleHRlbmRzIFRlc3RDYXNlIHsKKyAgcHVibGljIHZvaWQgdGVzdFJlYWRXcml0ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgIGZpbmFsIFRCeXRlQnVmZmVyIGJ5dGVCdWZmZXIgPSBuZXcgVEJ5dGVCdWZmZXIoQnl0ZUJ1ZmZlci5hbGxvY2F0ZSgxNikpOworICAgIGJ5dGVCdWZmZXIud3JpdGUoIkhlbGxvIFdvcmxkIi5nZXRCeXRlcyhDaGFyc2V0cy5VVEZfOCkpOworICAgIGFzc2VydEVxdWFscygiSGVsbG8gV29ybGQiLCBuZXcgU3RyaW5nKGJ5dGVCdWZmZXIuZmxpcCgpLnRvQnl0ZUFycmF5KCksIENoYXJzZXRzLlVURl84KSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UmV1c2VSZWFkV3JpdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBUQnl0ZUJ1ZmZlciBieXRlQnVmZmVyID0gbmV3IFRCeXRlQnVmZmVyKEJ5dGVCdWZmZXIuYWxsb2NhdGUoMTYpKTsKKyAgICBieXRlQnVmZmVyLndyaXRlKCJIZWxsbyBXb3JsZCIuZ2V0Qnl0ZXMoQ2hhcnNldHMuVVRGXzgpKTsKKyAgICBhc3NlcnRFcXVhbHMoIkhlbGxvIFdvcmxkIiwgbmV3IFN0cmluZyhieXRlQnVmZmVyLmZsaXAoKS50b0J5dGVBcnJheSgpLCBDaGFyc2V0cy5VVEZfOCkpOworCisgICAgYnl0ZUJ1ZmZlci5jbGVhcigpOworCisgICAgYnl0ZUJ1ZmZlci53cml0ZSgiR29vZGJ5ZSBIb3JzZXMiLmdldEJ5dGVzKENoYXJzZXRzLlVURl84KSk7CisgICAgYXNzZXJ0RXF1YWxzKCJHb29kYnllIEhvcnNlcyIsIG5ldyBTdHJpbmcoYnl0ZUJ1ZmZlci5mbGlwKCkudG9CeXRlQXJyYXkoKSwgQ2hhcnNldHMuVVRGXzgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RPdmVyZmxvdygpIHRocm93cyBFeGNlcHRpb24geworICAgIGZpbmFsIFRCeXRlQnVmZmVyIGJ5dGVCdWZmZXIgPSBuZXcgVEJ5dGVCdWZmZXIoQnl0ZUJ1ZmZlci5hbGxvY2F0ZSg0KSk7CisgICAgdHJ5IHsKKyAgICAgIGJ5dGVCdWZmZXIud3JpdGUoIkhlbGxvIFdvcmxkIi5nZXRCeXRlcyhDaGFyc2V0cy5VVEZfOCkpOworICAgICAgZmFpbCgiRXhwZWN0ZWQgd3JpdGUgb3BlcmF0aW9uIHRvIGZhaWwgd2l0aCBUVHJhbnNwb3J0RXhjZXB0aW9uIik7CisgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiBlKSB7CisgICAgICBhc3NlcnRFcXVhbHMoIk5vdCBlbm91Z2ggcm9vbSBpbiBvdXRwdXQgYnVmZmVyIiwgZS5nZXRNZXNzYWdlKCkpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRGYXN0RnJhbWVkVHJhbnNwb3J0LmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VEZhc3RGcmFtZWRUcmFuc3BvcnQuamF2YQppbmRleCBlMDI0MDQ5Li4wNmVlMjA2IDEwMDY0NAotLS0gYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VEZhc3RGcmFtZWRUcmFuc3BvcnQuamF2YQorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VEZhc3RGcmFtZWRUcmFuc3BvcnQuamF2YQpAQCAtMTksOCArMTksMTUgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OwogCiBwdWJsaWMgY2xhc3MgVGVzdFRGYXN0RnJhbWVkVHJhbnNwb3J0IGV4dGVuZHMgVGVzdFRGcmFtZWRUcmFuc3BvcnQgeworICBwcm90ZWN0ZWQgZmluYWwgc3RhdGljIGludCBJTklUSUFMX0NBUEFDSVRZID0gNTA7CisKICAgQE92ZXJyaWRlCiAgIHByb3RlY3RlZCBUVHJhbnNwb3J0IGdldFRyYW5zcG9ydChUVHJhbnNwb3J0IHVuZGVybHlpbmcpIHsKLSAgICByZXR1cm4gbmV3IFRGYXN0RnJhbWVkVHJhbnNwb3J0KHVuZGVybHlpbmcsIDUwLCAxMCAqIDEwMjQgKiAxMDI0KTsKKyAgICByZXR1cm4gbmV3IFRGYXN0RnJhbWVkVHJhbnNwb3J0KHVuZGVybHlpbmcsIElOSVRJQUxfQ0FQQUNJVFksIDEwICogMTAyNCAqIDEwMjQpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCBUVHJhbnNwb3J0IGdldFRyYW5zcG9ydChUVHJhbnNwb3J0IHVuZGVybHlpbmcsIGludCBtYXhMZW5ndGgpIHsKKyAgICByZXR1cm4gbmV3IFRGYXN0RnJhbWVkVHJhbnNwb3J0KHVuZGVybHlpbmcsIElOSVRJQUxfQ0FQQUNJVFksIG1heExlbmd0aCk7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RURnJhbWVkVHJhbnNwb3J0LmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VEZyYW1lZFRyYW5zcG9ydC5qYXZhCmluZGV4IDc4ZjU4ZWMuLmUzMGQ3NGIgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RURnJhbWVkVHJhbnNwb3J0LmphdmEKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRGcmFtZWRUcmFuc3BvcnQuamF2YQpAQCAtMzQsNiArMzQsMTAgQEAKICAgICByZXR1cm4gbmV3IFRGcmFtZWRUcmFuc3BvcnQodW5kZXJseWluZyk7CiAgIH0KIAorICBwcm90ZWN0ZWQgVFRyYW5zcG9ydCBnZXRUcmFuc3BvcnQoVFRyYW5zcG9ydCB1bmRlcmx5aW5nLCBpbnQgbWF4TGVuZ3RoKSB7CisgICAgcmV0dXJuIG5ldyBURnJhbWVkVHJhbnNwb3J0KHVuZGVybHlpbmcsIG1heExlbmd0aCk7CisgIH0KKwogICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBieXRlU2VxdWVuY2UoaW50IHN0YXJ0LCBpbnQgZW5kKSB7CiAgICAgYnl0ZVtdIHJlc3VsdCA9IG5ldyBieXRlW2VuZC1zdGFydCsxXTsKICAgICBmb3IgKGludCBpID0gMDsgaSA8PSAoZW5kLXN0YXJ0KTsgaSsrKSB7CkBAIC03NSw2ICs3OSw0MCBAQAogICAgIGFzc2VydEVxdWFscyg0LCBjb3VudFRyYW5zLnJlYWRDb3VudCk7CiAgIH0KIAorICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZEZyYW1lU2l6ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgaW50IG1heExlbmd0aCA9IDEyODsKKworICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgIERhdGFPdXRwdXRTdHJlYW0gZG9zID0gbmV3IERhdGFPdXRwdXRTdHJlYW0oYmFvcyk7CisgICAgZG9zLndyaXRlSW50KDEzMCk7CisgICAgZG9zLndyaXRlKGJ5dGVTZXF1ZW5jZSgwLCAxMjkpKTsKKworICAgIFRNZW1vcnlCdWZmZXIgbWVtYnVmID0gbmV3IFRNZW1vcnlCdWZmZXIoMCk7CisgICAgbWVtYnVmLndyaXRlKGJhb3MudG9CeXRlQXJyYXkoKSk7CisKKyAgICBSZWFkQ291bnRpbmdUcmFuc3BvcnQgY291bnRUcmFucyA9IG5ldyBSZWFkQ291bnRpbmdUcmFuc3BvcnQobWVtYnVmKTsKKyAgICBUVHJhbnNwb3J0IHRyYW5zID0gZ2V0VHJhbnNwb3J0KGNvdW50VHJhbnMsIG1heExlbmd0aCk7CisKKyAgICBieXRlW10gcmVhZEJ1ZiA9IG5ldyBieXRlWzEwXTsKKyAgICB0cnkgeworICAgICAgdHJhbnMucmVhZChyZWFkQnVmLCAwLCA0KTsKKyAgICAgIGZhaWwoIkV4cGVjdGVkIGEgVFRyYW5zcG9ydEV4Y2VwdGlvbiIpOworICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gZSkgeworICAgICAgLy8gV2UgZXhwZWN0IHRoaXMgZXhjZXB0aW9uIGJlY2F1c2UgdGhlIGZyYW1lIHdlJ3JlIHRyeWluZyB0byByZWFkIGlzIGxhcmdlciB0aGFuIG91ciBtYXggZnJhbWUgbGVuZ3RoCisgICAgICBhc3NlcnRFcXVhbHMoVFRyYW5zcG9ydEV4Y2VwdGlvbi5DT1JSVVBURURfREFUQSwgZS5nZXRUeXBlKCkpOworICAgIH0KKworICAgIGFzc2VydEZhbHNlKHRyYW5zLmlzT3BlbigpKTsKKworICAgIHRyeSB7CisgICAgICB0cmFucy5yZWFkKHJlYWRCdWYsIDAsIDQpOworICAgICAgZmFpbCgiRXhwZWN0ZWQgYSBUVHJhbnNwb3J0RXhjZXB0aW9uIik7CisgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiBlKSB7CisgICAgICAvLyBUaGlzIHRpbWUgd2UgZ2V0IGFuIGV4Y2VwdGlvbiBpbmRpY2F0aW5nIHRoZSBjb25uZWN0aW9uIHdhcyBjbG9zZWQKKyAgICAgIGFzc2VydEVxdWFscyhUVHJhbnNwb3J0RXhjZXB0aW9uLk5PVF9PUEVOLCBlLmdldFR5cGUoKSk7CisgICAgfQorICB9CisKICAgcHVibGljIHZvaWQgdGVzdFdyaXRlKCkgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKICAgICBXcml0ZUNvdW50aW5nVHJhbnNwb3J0IGNvdW50aW5nVHJhbnMgPSBuZXcgV3JpdGVDb3VudGluZ1RyYW5zcG9ydChuZXcgVElPU3RyZWFtVHJhbnNwb3J0KG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShiYW9zKSkpOwpAQCAtODcsMTEgKzEyNSwxMSBAQAogICAgIGFzc2VydEVxdWFscygwLCBjb3VudGluZ1RyYW5zLndyaXRlQ291bnQpOwogCiAgICAgdHJhbnMuZmx1c2goKTsKLSAgICBhc3NlcnRFcXVhbHMoMiwgY291bnRpbmdUcmFucy53cml0ZUNvdW50KTsKKyAgICBhc3NlcnRFcXVhbHMoMSwgY291bnRpbmdUcmFucy53cml0ZUNvdW50KTsKIAogICAgIHRyYW5zLndyaXRlKGJ5dGVTZXF1ZW5jZSgwLCAyNDUpKTsKICAgICB0cmFucy5mbHVzaCgpOwotICAgIGFzc2VydEVxdWFscyg0LCBjb3VudGluZ1RyYW5zLndyaXRlQ291bnQpOworICAgIGFzc2VydEVxdWFscygyLCBjb3VudGluZ1RyYW5zLndyaXRlQ291bnQpOwogCiAgICAgRGF0YUlucHV0U3RyZWFtIGRpbiA9IG5ldyBEYXRhSW5wdXRTdHJlYW0obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogICAgIGFzc2VydEVxdWFscygyNTYsIGRpbi5yZWFkSW50KCkpOwpAQCAtMTQ1LDQgKzE4MywzMiBAQAogICAgIGFzc2VydEVxdWFscyg2NSwgdHJhbnMuZ2V0Qnl0ZXNSZW1haW5pbmdJbkJ1ZmZlcigpKTsKICAgICBhc3NlcnRFcXVhbHMoMTAsIHRyYW5zLmdldEJ1ZmZlclBvc2l0aW9uKCkpOwogICB9CisKKyAgcHVibGljIHZvaWQgdGVzdENsZWFyKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICBEYXRhT3V0cHV0U3RyZWFtIGRvcyA9IG5ldyBEYXRhT3V0cHV0U3RyZWFtKGJhb3MpOworICAgIGRvcy53cml0ZUludCgyMjApOworICAgIGRvcy53cml0ZShieXRlU2VxdWVuY2UoMCwgMjE5KSk7CisKKyAgICBUTWVtb3J5QnVmZmVyIG1lbWJ1ZiA9IG5ldyBUTWVtb3J5QnVmZmVyKDApOworICAgIG1lbWJ1Zi53cml0ZShiYW9zLnRvQnl0ZUFycmF5KCkpOworCisgICAgUmVhZENvdW50aW5nVHJhbnNwb3J0IGNvdW50VHJhbnMgPSBuZXcgUmVhZENvdW50aW5nVHJhbnNwb3J0KG1lbWJ1Zik7CisgICAgVFRyYW5zcG9ydCB0cmFucyA9IGdldFRyYW5zcG9ydChjb3VudFRyYW5zKTsKKworICAgIGJ5dGVbXSByZWFkQnVmID0gbmV3IGJ5dGVbMjIwXTsKKyAgICB0cmFucy5yZWFkKHJlYWRCdWYsIDAsIDIyMCk7CisgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKHJlYWRCdWYsIGJ5dGVTZXF1ZW5jZSgwLDIxOSkpKTsKKworICAgIGFzc2VydFRydWUodHJhbnMgaW5zdGFuY2VvZiBURnJhbWVkVHJhbnNwb3J0IHx8IHRyYW5zIGluc3RhbmNlb2YgVEZhc3RGcmFtZWRUcmFuc3BvcnQpOworICAgIGlmICh0cmFucyBpbnN0YW5jZW9mIFRGcmFtZWRUcmFuc3BvcnQpIHsKKyAgICAgIGFzc2VydFRydWUodHJhbnMuZ2V0QnVmZmVyKCkgIT0gbnVsbCAmJiB0cmFucy5nZXRCdWZmZXIoKS5sZW5ndGggPiAwKTsKKyAgICAgICgoVEZyYW1lZFRyYW5zcG9ydCkgdHJhbnMpLmNsZWFyKCk7CisgICAgICBhc3NlcnRUcnVlKHRyYW5zLmdldEJ1ZmZlcigpID09IG51bGwpOworICAgIH0gZWxzZSBpZiAodHJhbnMgaW5zdGFuY2VvZiBURmFzdEZyYW1lZFRyYW5zcG9ydCkgeworICAgICAgYXNzZXJ0VHJ1ZSh0cmFucy5nZXRCdWZmZXIoKS5sZW5ndGggPiBUZXN0VEZhc3RGcmFtZWRUcmFuc3BvcnQuSU5JVElBTF9DQVBBQ0lUWSk7CisgICAgICAoKFRGYXN0RnJhbWVkVHJhbnNwb3J0KSB0cmFucykuY2xlYXIoKTsKKyAgICAgIGFzc2VydFRydWUodHJhbnMuZ2V0QnVmZmVyKCkubGVuZ3RoID09IFRlc3RURmFzdEZyYW1lZFRyYW5zcG9ydC5JTklUSUFMX0NBUEFDSVRZKTsKKyAgICB9CisgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RUU1NMVHJhbnNwb3J0RmFjdG9yeS5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRTU0xUcmFuc3BvcnRGYWN0b3J5LmphdmEKaW5kZXggNDc4NDA3YS4uMDMyYzJlYiAxMDA2NDQKLS0tIGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRTU0xUcmFuc3BvcnRGYWN0b3J5LmphdmEKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRTU0xUcmFuc3BvcnRGYWN0b3J5LmphdmEKQEAgLTQ1LDYgKzQ1LDEwIEBACiAgIHRocm93cyBFeGNlcHRpb24gewogICAgIHJldHVybiBUU1NMVHJhbnNwb3J0RmFjdG9yeS5nZXRDbGllbnRTb2NrZXQoSE9TVCwgUE9SVCk7CiAgIH0KKyAgCisgIHByb3RlY3RlZCBUU2VydmVyU29ja2V0IGdldFNlcnZlclRyYW5zcG9ydCgpIHRocm93cyBFeGNlcHRpb24geworICAgIHJldHVybiBUU1NMVHJhbnNwb3J0RmFjdG9yeS5nZXRTZXJ2ZXJTb2NrZXQoUE9SVCk7CisgIH0KIAogICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgc3RhcnRTZXJ2ZXIoZmluYWwgVFByb2Nlc3NvciBwcm9jZXNzb3IsIGZpbmFsIFRQcm90b2NvbEZhY3RvcnkgcHJvdG9GYWN0b3J5LCBmaW5hbCBUVHJhbnNwb3J0RmFjdG9yeSBmYWN0b3J5KQpAQCAtNTIsMTEgKzU2LDExIEBACiAgICAgc2VydmVyVGhyZWFkID0gbmV3IFRocmVhZCgpIHsKICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCA9IFRTU0xUcmFuc3BvcnRGYWN0b3J5LmdldFNlcnZlclNvY2tldChQT1JUKTsKKyAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCA9IGdldFNlcnZlclRyYW5zcG9ydCgpOwogICAgICAgICAgIGZpbmFsIEFyZ3MgYXJncyA9IG5ldyBBcmdzKHNlcnZlclRyYW5zcG9ydCkucHJvY2Vzc29yKHByb2Nlc3Nvcik7CiAgICAgICAgICAgc2VydmVyID0gbmV3IFRTaW1wbGVTZXJ2ZXIoYXJncyk7CiAgICAgICAgICAgc2VydmVyLnNlcnZlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gZSkgeworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CiAgICAgICAgICAgYXNzZXJ0IGZhbHNlOwogICAgICAgICB9CkBAIC02NCw3ICs2OCw3IEBACiAgICAgfTsKIAogICAgIHNlcnZlclRocmVhZC5zdGFydCgpOwotICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKKyAgICBUaHJlYWQuc2xlZXAoU0xFRVBfREVMQVkpOwogICB9CiAKICAgQE92ZXJyaWRlCmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VFNTTFRyYW5zcG9ydEZhY3RvcnlTdHJlYW1lZFN0b3JlLmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VFNTTFRyYW5zcG9ydEZhY3RvcnlTdHJlYW1lZFN0b3JlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjViZjVjZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RUU1NMVHJhbnNwb3J0RmFjdG9yeVN0cmVhbWVkU3RvcmUuamF2YQpAQCAtMCwwICsxLDYyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OworCitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CisKK3B1YmxpYyBjbGFzcyBUZXN0VFNTTFRyYW5zcG9ydEZhY3RvcnlTdHJlYW1lZFN0b3JlIGV4dGVuZHMgVGVzdFRTU0xUcmFuc3BvcnRGYWN0b3J5IHsKKyAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGtleVN0b3JlTG9jYXRpb24gPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmF4Lm5ldC5zc2wua2V5U3RvcmUiKTsKKyAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHRydXN0U3RvcmVMb2NhdGlvbiA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YXgubmV0LnNzbC50cnVzdFN0b3JlIik7CisgIAorICBwdWJsaWMgVGVzdFRTU0xUcmFuc3BvcnRGYWN0b3J5U3RyZWFtZWRTdG9yZSgpIHsKKyAgICBzdXBlcigpOworICAgIAorICAgIC8qKgorICAgICAqICBPdmVycmlkZSBzeXN0ZW0gcHJvcGVydGllcyB0byBiZSBhYmxlIHRvIHRlc3QgcGFzc2luZworICAgICAqICB0aGUgdHJ1c3RTdG9yZSBhbmQga2V5U3RvcmUgYXMgaW5wdXQgc3RyZWFtCisgICAgICovCisgICAgU3lzdGVtLnNldFByb3BlcnR5KCJqYXZheC5uZXQuc3NsLnRydXN0U3RvcmUiLCAiIik7CisgICAgU3lzdGVtLnNldFByb3BlcnR5KCJqYXZheC5uZXQuc3NsLmtleVN0b3JlIiwgIiIpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBUVHJhbnNwb3J0IGdldENsaWVudFRyYW5zcG9ydChUVHJhbnNwb3J0IHVuZGVybHlpbmdUcmFuc3BvcnQpCisgIHRocm93cyBFeGNlcHRpb24geworICAgIFRTU0xUcmFuc3BvcnRGYWN0b3J5LlRTU0xUcmFuc3BvcnRQYXJhbWV0ZXJzIHBhcmFtcyA9IG5ldworICAgICAgVFNTTFRyYW5zcG9ydEZhY3RvcnkuVFNTTFRyYW5zcG9ydFBhcmFtZXRlcnMoKTsKKworICAgIHBhcmFtcy5zZXRUcnVzdFN0b3JlKG5ldyBGaWxlSW5wdXRTdHJlYW0odHJ1c3RTdG9yZUxvY2F0aW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmF4Lm5ldC5zc2wudHJ1c3RTdG9yZVBhc3N3b3JkIikpOworICAgIAorICAgIHJldHVybiBUU1NMVHJhbnNwb3J0RmFjdG9yeS5nZXRDbGllbnRTb2NrZXQoSE9TVCwgUE9SVCwgMC8qdGltZW91dCovLCBwYXJhbXMpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCBUU2VydmVyU29ja2V0IGdldFNlcnZlclRyYW5zcG9ydCgpIHRocm93cyBFeGNlcHRpb24geworICAgIFRTU0xUcmFuc3BvcnRGYWN0b3J5LlRTU0xUcmFuc3BvcnRQYXJhbWV0ZXJzIHBhcmFtcyA9IG5ldworICAgICAgICBUU1NMVHJhbnNwb3J0RmFjdG9yeS5UU1NMVHJhbnNwb3J0UGFyYW1ldGVycygpOworICAgIAorICAgIHBhcmFtcy5zZXRLZXlTdG9yZShuZXcgRmlsZUlucHV0U3RyZWFtKGtleVN0b3JlTG9jYXRpb24pLCAKKyAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnR5KCJqYXZheC5uZXQuc3NsLmtleVN0b3JlUGFzc3dvcmQiKSk7CisgICAgCisgICAgcmV0dXJuIFRTU0xUcmFuc3BvcnRGYWN0b3J5LmdldFNlcnZlclNvY2tldChQT1JULCAwLyp0aW1lb3V0Ki8sIEluZXRBZGRyZXNzLmdldEJ5TmFtZShIT1NUKSwgcGFyYW1zKTsKKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RUU2FzbFRyYW5zcG9ydHMuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RUU2FzbFRyYW5zcG9ydHMuamF2YQppbmRleCA3ODgzOTVmLi4zNmEwNmU5IDEwMDY0NAotLS0gYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VFNhc2xUcmFuc3BvcnRzLmphdmEKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRTYXNsVHJhbnNwb3J0cy5qYXZhCkBAIC0yMCw2ICsyMCw3IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKQEAgLTMzMiwxMiArMzMzLDggQEAKICAgICAgICAgdGhyb3cgbmV3IFNhc2xFeGNlcHRpb24oIkFscmVhZHkgY29tcGxldGUhIik7CiAgICAgICB9CiAKLSAgICAgIHRyeSB7Ci0gICAgICAgIGhhc1Byb3ZpZGVkSW5pdGlhbFJlc3BvbnNlID0gdHJ1ZTsKLSAgICAgICAgcmV0dXJuIHVzZXJuYW1lLmdldEJ5dGVzKCJVVEYtOCIpOwotICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICB0aHJvdyBuZXcgU2FzbEV4Y2VwdGlvbihlLnRvU3RyaW5nKCkpOwotICAgICAgfQorICAgICAgaGFzUHJvdmlkZWRJbml0aWFsUmVzcG9uc2UgPSB0cnVlOworICAgICAgcmV0dXJuIHVzZXJuYW1lLmdldEJ5dGVzKFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpOwogICAgIH0KICAgICBwdWJsaWMgYm9vbGVhbiBpc0NvbXBsZXRlKCkgeyByZXR1cm4gaGFzUHJvdmlkZWRJbml0aWFsUmVzcG9uc2U7IH0KICAgICBwdWJsaWMgYnl0ZVtdIHVud3JhcChieXRlW10gaW5jb21pbmcsIGludCBvZmZzZXQsIGludCBsZW4pIHsKQEAgLTM1NCwxMSArMzUxLDcgQEAKICAgICBwcml2YXRlIFN0cmluZyB1c2VyOwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVjaGFuaXNtTmFtZSgpIHsgcmV0dXJuICJBTk9OWU1PVVMiOyB9CiAgICAgcHVibGljIGJ5dGVbXSBldmFsdWF0ZVJlc3BvbnNlKGJ5dGVbXSByZXNwb25zZSkgdGhyb3dzIFNhc2xFeGNlcHRpb24gewotICAgICAgdHJ5IHsKLSAgICAgICAgdGhpcy51c2VyID0gbmV3IFN0cmluZyhyZXNwb25zZSwgIlVURi04Iik7Ci0gICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIHRocm93IG5ldyBTYXNsRXhjZXB0aW9uKGUudG9TdHJpbmcoKSk7Ci0gICAgICB9CisgICAgICB0aGlzLnVzZXIgPSBuZXcgU3RyaW5nKHJlc3BvbnNlLCBTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKICAgICAgIHJldHVybiBudWxsOwogICAgIH0KICAgICBwdWJsaWMgYm9vbGVhbiBpc0NvbXBsZXRlKCkgeyByZXR1cm4gdXNlciAhPSBudWxsOyB9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VFNpbXBsZUZpbGVUcmFuc3BvcnQuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RUU2ltcGxlRmlsZVRyYW5zcG9ydC5qYXZhCmluZGV4IDVkMmZiNDUuLjdiODgwZjQgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RUU2ltcGxlRmlsZVRyYW5zcG9ydC5qYXZhCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RUU2ltcGxlRmlsZVRyYW5zcG9ydC5qYXZhCkBAIC0yNywyMSArMjcsMjEgQEAKICAgcHVibGljIHZvaWQgdGVzdEZyZXNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgLy9UZXN0IHdyaXRlIHNpZGUKICAgICBQYXRoIHRlbXBGaWxlUGF0aE5hbWUgPSBGaWxlcy5jcmVhdGVUZW1wRmlsZSgiVFNpbXBsZUZpbGVUcmFuc3BvcnRUZXN0IiwgbnVsbCk7Ci0gICAgRmlsZXMuZGVsZXRlKHRlbXBGaWxlUGF0aE5hbWUpOyAgICAgICAgCisgICAgRmlsZXMuZGVsZXRlKHRlbXBGaWxlUGF0aE5hbWUpOwogICAgIGJ5dGVbXSBpbnB1dF9idWYgPSBuZXcgYnl0ZVtdezEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwfTsKICAgICBUU2ltcGxlRmlsZVRyYW5zcG9ydCB0cmFuc193cml0ZSA9IG5ldyBUU2ltcGxlRmlsZVRyYW5zcG9ydCh0ZW1wRmlsZVBhdGhOYW1lLnRvU3RyaW5nKCksZmFsc2UsIHRydWUsIGZhbHNlKTsKICAgICBhc3NlcnQgKCF0cmFuc193cml0ZS5pc09wZW4oKSk7CiAgICAgdHJhbnNfd3JpdGUub3BlbigpOwogICAgIGFzc2VydCh0cmFuc193cml0ZS5pc09wZW4oKSk7CiAgICAgdHJhbnNfd3JpdGUud3JpdGUoaW5wdXRfYnVmKTsKLSAgICB0cmFuc193cml0ZS53cml0ZShpbnB1dF9idWYsMiwyKTsgICAgCisgICAgdHJhbnNfd3JpdGUud3JpdGUoaW5wdXRfYnVmLDIsMik7CiAgICAgdHJhbnNfd3JpdGUuZmx1c2goKTsKICAgICB0cmFuc193cml0ZS5jbG9zZSgpOwotICAgIAorCiAgICAgLy9UZXN0IHJlYWQgc2lkZQogICAgIFRTaW1wbGVGaWxlVHJhbnNwb3J0IHRyYW5zID0gbmV3IFRTaW1wbGVGaWxlVHJhbnNwb3J0KHRlbXBGaWxlUGF0aE5hbWUudG9TdHJpbmcoKSx0cnVlLCBmYWxzZSk7Ci0gICAgYXNzZXJ0KHRyYW5zX3dyaXRlLmlzT3BlbigpKTsKLSAgICAKKyAgICBhc3NlcnQodHJhbnMuaXNPcGVuKCkpOworCiAgICAgLy9TaW1wbGUgZmlsZSB0cmFucyBwcm92aWRlcyBubyBidWZmZXIgYWNjZXNzCiAgICAgYXNzZXJ0KDAgPT0gdHJhbnMuZ2V0QnVmZmVyUG9zaXRpb24oKSk7CiAgICAgYXNzZXJ0KG51bGwgPT0gdHJhbnMuZ2V0QnVmZmVyKCkpOwpAQCAtNTYsMTkgKzU2LDE5IEBACiAgICAgdHJhbnMucmVhZEFsbChidWYxLCAwLCBCVUZTSVopOwogICAgIGFzc2VydChCVUZTSVogPT0gdHJhbnMuZ2V0RmlsZVBvaW50ZXIoKSk7CiAgICAgYXNzZXJ0KEFycmF5cy5lcXVhbHMobmV3IGJ5dGVbXXsxLCAyLCAzLCA0fSwgYnVmMSkpOwotICAgIAorCiAgICAgaW50IGJ5dGVzUmVhZCA9IHRyYW5zLnJlYWQoYnVmMSwgMCwgQlVGU0laKTsKICAgICBhc3NlcnQoYnl0ZXNSZWFkID4gMCk7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBieXRlc1JlYWQ7ICsraSkgewotICAgICAgYXNzZXJ0KGJ1ZjFbaV0gPT0gaSs1KTsgICAgCisgICAgICBhc3NlcnQoYnVmMVtpXSA9PSBpKzUpOwogICAgIH0KLSAgICAKKwogICAgIHRyYW5zLnNlZWsoMCk7CiAgICAgYXNzZXJ0KDAgPT0gdHJhbnMuZ2V0RmlsZVBvaW50ZXIoKSk7CiAgICAgdHJhbnMucmVhZEFsbChidWYxLCAwLCBCVUZTSVopOwogICAgIGFzc2VydChBcnJheXMuZXF1YWxzKG5ldyBieXRlW117MSwgMiwgMywgNH0sIGJ1ZjEpKTsKICAgICBhc3NlcnQoQlVGU0laID09IHRyYW5zLmdldEZpbGVQb2ludGVyKCkpOwogICAgIHRyYW5zLmNsb3NlKCk7Ci0gICAgRmlsZXMuZGVsZXRlKHRlbXBGaWxlUGF0aE5hbWUpOyAgICAgIAorICAgIEZpbGVzLmRlbGV0ZSh0ZW1wRmlsZVBhdGhOYW1lKTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRabGliVHJhbnNwb3J0LmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VFpsaWJUcmFuc3BvcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDdmOWMxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRabGliVHJhbnNwb3J0LmphdmEKQEAgLTAsMCArMSwxNDAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZE91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRGF0YUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRGF0YU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLnppcC5EYXRhRm9ybWF0RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC56aXAuRGVmbGF0ZXJPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLnppcC5JbmZsYXRlcklucHV0U3RyZWFtOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitwdWJsaWMgY2xhc3MgVGVzdFRabGliVHJhbnNwb3J0IGV4dGVuZHMgVGVzdENhc2UgeworCisgIHByb3RlY3RlZCBUVHJhbnNwb3J0IGdldFRyYW5zcG9ydChUVHJhbnNwb3J0IHVuZGVybHlpbmcpIHsKKyAgICByZXR1cm4gbmV3IFRabGliVHJhbnNwb3J0KHVuZGVybHlpbmcpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBieXRlW10gYnl0ZVNlcXVlbmNlKGludCBzdGFydCwgaW50IGVuZCkgeworICAgIGJ5dGVbXSByZXN1bHQgPSBuZXcgYnl0ZVtlbmQtc3RhcnQrMV07CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPD0gKGVuZC1zdGFydCk7IGkrKykgeworICAgICAgcmVzdWx0W2ldID0gKGJ5dGUpKHN0YXJ0K2kpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdENsb3NlKCkgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24geworICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgIFdyaXRlQ291bnRpbmdUcmFuc3BvcnQgY291bnRpbmdUcmFucyA9IG5ldyBXcml0ZUNvdW50aW5nVHJhbnNwb3J0KG5ldyBUSU9TdHJlYW1UcmFuc3BvcnQobmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtCisgICAgICAgIChiYW9zKSkpOworICAgIFRUcmFuc3BvcnQgdHJhbnMgPSBnZXRUcmFuc3BvcnQoY291bnRpbmdUcmFucyk7CisgICAgdHJhbnMud3JpdGUoYnl0ZVNlcXVlbmNlKDAsIDI0NSkpOworICAgIGNvdW50aW5nVHJhbnMuY2xvc2UoKTsKKyAgICB0cmFucy5jbG9zZSgpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdENsb3NlT3BlbigpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICBUVHJhbnNwb3J0IHRyYW5zID0gZ2V0VHJhbnNwb3J0KG5ldyBUSU9TdHJlYW1UcmFuc3BvcnQoYmFvcykpOworICAgIGJ5dGVbXSB1bmNvbXByZXNzZWQgPSBieXRlU2VxdWVuY2UoMCwgMjQ1KTsKKyAgICB0cmFucy53cml0ZSh1bmNvbXByZXNzZWQpOworICAgIHRyYW5zLmNsb3NlKCk7CisgICAgZmluYWwgYnl0ZVtdIGNvbXByZXNzZWQgPSBiYW9zLnRvQnl0ZUFycmF5KCk7CisKKyAgICBmaW5hbCBieXRlW10gYnVmID0gbmV3IGJ5dGVbMjU1XTsKKyAgICBUVHJhbnNwb3J0IHRyYW5zUmVhZCA9IGdldFRyYW5zcG9ydChuZXcgVElPU3RyZWFtVHJhbnNwb3J0KG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShjb21wcmVzc2VkKSkpOworICAgIGludCByZWFkQnl0ZXMgPSB0cmFuc1JlYWQucmVhZChidWYsIDAsIGJ1Zi5sZW5ndGgpOworICAgIGFzc2VydEVxdWFscyh1bmNvbXByZXNzZWQubGVuZ3RoLCByZWFkQnl0ZXMpOworICAgIHRyYW5zUmVhZC5jbG9zZSgpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFRUcmFuc3BvcnRFeGNlcHRpb24geworICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgIERlZmxhdGVyT3V0cHV0U3RyZWFtIGRlZmxhdGVyT3V0cHV0U3RyZWFtID0gbmV3IERlZmxhdGVyT3V0cHV0U3RyZWFtKGJhb3MpOworICAgIERhdGFPdXRwdXRTdHJlYW0gZG9zID0gbmV3IERhdGFPdXRwdXRTdHJlYW0oZGVmbGF0ZXJPdXRwdXRTdHJlYW0pOworICAgIGRvcy53cml0ZShieXRlU2VxdWVuY2UoMCwgNDkpKTsKKyAgICBkb3Mud3JpdGUoYnl0ZVNlcXVlbmNlKDAsIDIxOSkpOworCisgICAgZGVmbGF0ZXJPdXRwdXRTdHJlYW0uZmluaXNoKCk7CisKKyAgICBUTWVtb3J5QnVmZmVyIG1lbWJ1ZiA9IG5ldyBUTWVtb3J5QnVmZmVyKDApOworICAgIG1lbWJ1Zi53cml0ZShiYW9zLnRvQnl0ZUFycmF5KCkpOworCisgICAgUmVhZENvdW50aW5nVHJhbnNwb3J0IGNvdW50VHJhbnMgPSBuZXcgUmVhZENvdW50aW5nVHJhbnNwb3J0KG1lbWJ1Zik7CisgICAgVFRyYW5zcG9ydCB0cmFucyA9IGdldFRyYW5zcG9ydChjb3VudFRyYW5zKTsKKworICAgIGJ5dGVbXSByZWFkQnVmID0gbmV3IGJ5dGVbMTBdOworICAgIHRyYW5zLnJlYWQocmVhZEJ1ZiwgMCwgMTApOworICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhyZWFkQnVmLCBieXRlU2VxdWVuY2UoMCw5KSkpOworICAgIGFzc2VydEVxdWFscygxLCBjb3VudFRyYW5zLnJlYWRDb3VudCk7CisKKyAgICB0cmFucy5yZWFkKHJlYWRCdWYsIDAsIDEwKTsKKyAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMocmVhZEJ1ZiwgYnl0ZVNlcXVlbmNlKDEwLDE5KSkpOworICAgIGFzc2VydEVxdWFscygxLCBjb3VudFRyYW5zLnJlYWRDb3VudCk7CisKKyAgICBhc3NlcnRFcXVhbHMoMzAsIHRyYW5zLnJlYWQobmV3IGJ5dGVbMzBdLCAwLCAzMCkpOworICAgIGFzc2VydEVxdWFscygxLCBjb3VudFRyYW5zLnJlYWRDb3VudCk7CisKKyAgICByZWFkQnVmID0gbmV3IGJ5dGVbMjIwXTsKKyAgICBhc3NlcnRFcXVhbHMoMjIwLCB0cmFucy5yZWFkKHJlYWRCdWYsIDAsIDIyMCkpOworICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhyZWFkQnVmLCBieXRlU2VxdWVuY2UoMCwgMjE5KSkpOworICAgIGFzc2VydEVxdWFscygxLCBjb3VudFRyYW5zLnJlYWRDb3VudCk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0V3JpdGUoKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIERhdGFGb3JtYXRFeGNlcHRpb24geworICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgIFdyaXRlQ291bnRpbmdUcmFuc3BvcnQgY291bnRpbmdUcmFucyA9IG5ldyBXcml0ZUNvdW50aW5nVHJhbnNwb3J0KG5ldyBUSU9TdHJlYW1UcmFuc3BvcnQobmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKGJhb3MpKSk7CisgICAgVFRyYW5zcG9ydCB0cmFucyA9IGdldFRyYW5zcG9ydChjb3VudGluZ1RyYW5zKTsKKworICAgIHRyYW5zLndyaXRlKGJ5dGVTZXF1ZW5jZSgwLCAxMDApKTsKKyAgICBhc3NlcnRFcXVhbHMoMSwgY291bnRpbmdUcmFucy53cml0ZUNvdW50KTsKKyAgICB0cmFucy53cml0ZShieXRlU2VxdWVuY2UoMTAxLCAyMDApKTsKKyAgICB0cmFucy53cml0ZShieXRlU2VxdWVuY2UoMjAxLCAyNTUpKTsKKyAgICBhc3NlcnRFcXVhbHMoMSwgY291bnRpbmdUcmFucy53cml0ZUNvdW50KTsKKworICAgIHRyYW5zLmZsdXNoKCk7CisgICAgYXNzZXJ0RXF1YWxzKDIsIGNvdW50aW5nVHJhbnMud3JpdGVDb3VudCk7CisKKyAgICB0cmFucy53cml0ZShieXRlU2VxdWVuY2UoMCwgMjQ1KSk7CisgICAgdHJhbnMuZmx1c2goKTsKKyAgICBhc3NlcnRFcXVhbHMoMywgY291bnRpbmdUcmFucy53cml0ZUNvdW50KTsKKworICAgIERhdGFJbnB1dFN0cmVhbSBkaW4gPSBuZXcgRGF0YUlucHV0U3RyZWFtKG5ldyBJbmZsYXRlcklucHV0U3RyZWFtKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSk7CisgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzI1Nl07CisgICAgaW50IG4gPSBkaW4ucmVhZChidWYsIDAsIDI1Nik7CisgICAgYXNzZXJ0RXF1YWxzKG4sIDI1Nik7CisgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGJ5dGVTZXF1ZW5jZSgwLCAyNTUpLCBidWYpKTsKKworICAgIGJ1ZiA9IG5ldyBieXRlWzI0Nl07CisgICAgbiA9IGRpbi5yZWFkKGJ1ZiwgMCwgMjQ2KTsKKyAgICBhc3NlcnRFcXVhbHMobiwgMjQ2KTsKKyAgICBmb3IgKGludCBpID0gMDsgaTxidWYubGVuZ3RoOyBpKyspIHsKKyAgICAgIGFzc2VydEVxdWFscygiZm9yICIraSwgYnl0ZVNlcXVlbmNlKDAsMjQ1KVtpXSwgYnVmW2ldKTsKKyAgICB9CisKKyAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoYnl0ZVNlcXVlbmNlKDAsMjQ1KSwgYnVmKSk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvbGliL2phdmFtZS9jb2Rpbmdfc3RhbmRhcmRzLm1kIGIvbGliL2phdmFtZS9jb2Rpbmdfc3RhbmRhcmRzLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMDM5MGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YW1lL2NvZGluZ19zdGFuZGFyZHMubWQKQEAgLTAsMCArMSBAQAorUGxlYXNlIGZvbGxvdyBbR2VuZXJhbCBDb2RpbmcgU3RhbmRhcmRzXSgvZG9jL2NvZGluZ19zdGFuZGFyZHMubWQpCmRpZmYgLS1naXQgYS9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9tZXRhX2RhdGEvRmllbGRNZXRhRGF0YS5qYXZhIGIvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvbWV0YV9kYXRhL0ZpZWxkTWV0YURhdGEuamF2YQppbmRleCAxMWE1YTA4Li5iY2UwMmM3IDEwMDY0NAotLS0gYS9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9tZXRhX2RhdGEvRmllbGRNZXRhRGF0YS5qYXZhCisrKyBiL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L21ldGFfZGF0YS9GaWVsZE1ldGFEYXRhLmphdmEKQEAgLTYzLDcgKzYzLDcgQEAKICAgICB0aGlzLnZhbHVlTWV0YURhdGEgPSB2TWV0YURhdGE7CiAgIH0KICAgCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRTdHJ1Y3RNZXRhRGF0YU1hcChDbGFzcyBzQ2xhc3MsIEhhc2h0YWJsZSBtYXApeworICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIGFkZFN0cnVjdE1ldGFEYXRhTWFwKENsYXNzIHNDbGFzcywgSGFzaHRhYmxlIG1hcCl7CiAgICAgc3RydWN0TWFwLnB1dChzQ2xhc3MsIG1hcCk7CiAgIH0KIApAQCAtNzMsNyArNzMsNyBAQAogICAgKgogICAgKiBAcGFyYW0gc0NsYXNzIFRoZSBUQmFzZSBjbGFzcyBmb3Igd2hpY2ggdGhlIG1ldGFkYXRhIG1hcCBpcyByZXF1ZXN0ZWQKICAgICovCi0gIHB1YmxpYyBzdGF0aWMgSGFzaHRhYmxlIGdldFN0cnVjdE1ldGFEYXRhTWFwKENsYXNzIHNDbGFzcyl7CisgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIEhhc2h0YWJsZSBnZXRTdHJ1Y3RNZXRhRGF0YU1hcChDbGFzcyBzQ2xhc3MpewogICAgIGlmICghc3RydWN0TWFwLmNvbnRhaW5zS2V5KHNDbGFzcykpeyAvLyBMb2FkIGNsYXNzIGlmIGl0IGhhc24ndCBiZWVuIGxvYWRlZAogICAgICAgdHJ5ewogICAgICAgICBzQ2xhc3MubmV3SW5zdGFuY2UoKTsKZGlmZiAtLWdpdCBhL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2wuamF2YSBiL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2wuamF2YQppbmRleCBkZTcwODZmLi5kMzkxNjg2IDEwMDY0NAotLS0gYS9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9USlNPTlByb3RvY29sLmphdmEKKysrIGIvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5qYXZhCkBAIC0xOSw2ICsxOSw3IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7CiAKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuU3RhY2s7CiAKQEAgLTM0OCw2ICszNDksNDcgQEAKICAgICB9CiAgIH0KIAorICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSGlnaFN1cnJvZ2F0ZShjaGFyIGMpIHsKKyAgICByZXR1cm4gYyA+PSAnXHVEODAwJyAmJiBjIDw9ICdcdURCRkYnOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0xvd1N1cnJvZ2F0ZShjaGFyIGMpIHsKKyAgICByZXR1cm4gYyA+PSAnXHVEQzAwJyAmJiBjIDw9ICdcdURGRkYnOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIHRvVVRGOChpbnQgY29kZXBvaW50KSB7CisgICAgZmluYWwgaW50W10gRklSU1RfQllURV9NQVNLID0geyAwLCAweGMwLCAweGUwLCAweGYwIH07CisgICAgaW50IGxlbmd0aCA9IDA7CisgICAgaWYgKGNvZGVwb2ludCA8PSAweDdmKSBsZW5ndGggPSAxOworICAgIGVsc2UgaWYgKGNvZGVwb2ludCA8PSAweDdmZikgbGVuZ3RoID0gMjsKKyAgICBlbHNlIGlmIChjb2RlcG9pbnQgPD0gMHhmZmZmKSBsZW5ndGggPSAzOworICAgIGVsc2UgaWYgKGNvZGVwb2ludCA8PSAweDFmZmZmZikgbGVuZ3RoID0gNDsKKyAgICBlbHNlIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDb2RlIHBvaW50IG92ZXIgVSsxRkZGRkYgaXMgbm90IHN1cHBvcnRlZCIpOworCisgICAgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbbGVuZ3RoXTsKKyAgICBzd2l0Y2ggKGxlbmd0aCkgeworICAgIGNhc2UgNDoKKyAgICAgIGJ5dGVzWzNdID0gKGJ5dGUpKChjb2RlcG9pbnQgJiAweDNmKSB8IDB4ODApOworICAgICAgY29kZXBvaW50ID4+PSA2OworICAgIGNhc2UgMzoKKyAgICAgIGJ5dGVzWzJdID0gKGJ5dGUpKChjb2RlcG9pbnQgJiAweDNmKSB8IDB4ODApOworICAgICAgY29kZXBvaW50ID4+PSA2OworICAgIGNhc2UgMjoKKyAgICAgIGJ5dGVzWzFdID0gKGJ5dGUpKChjb2RlcG9pbnQgJiAweDNmKSB8IDB4ODApOworICAgICAgY29kZXBvaW50ID4+PSA2OworICAgIGNhc2UgMToKKyAgICAgIGJ5dGVzWzBdID0gKGJ5dGUpKGNvZGVwb2ludCB8IEZJUlNUX0JZVEVfTUFTS1tsZW5ndGggLSAxXSk7CisgICAgfQorCisgICAgcmV0dXJuIGJ5dGVzOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIHRvVVRGOChpbnQgaGlnaCwgaW50IGxvdykgeworICAgIGludCBjb2RlcG9pbnQgPSAoMSA8PCAxNikgKyAoKGhpZ2ggJiAweDNmZikgPDwgMTApOworICAgIGNvZGVwb2ludCArPSBsb3cgJiAweDNmZjsKKyAgICByZXR1cm4gdG9VVEY4KGNvZGVwb2ludCk7CisgIH0KKwogICAvLyBXcml0ZSB0aGUgYnl0ZXMgaW4gYXJyYXkgYnVmIGFzIGEgSlNPTiBjaGFyYWN0ZXJzLCBlc2NhcGluZyBhcyBuZWVkZWQKICAgcHJpdmF0ZSB2b2lkIHdyaXRlSlNPTlN0cmluZyhieXRlW10gYikgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIGNvbnRleHRfLndyaXRlKCk7CkBAIC01OTYsNiArNjM4LDcgQEAKICAgcHJpdmF0ZSBUQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHJlYWRKU09OU3RyaW5nKGJvb2xlYW4gc2tpcENvbnRleHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBURXhjZXB0aW9uIHsKICAgICBUQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGFyciA9IG5ldyBUQnl0ZUFycmF5T3V0cHV0U3RyZWFtKERFRl9TVFJJTkdfU0laRSk7CisgICAgaW50IGhpZ2hTdXJyb2dhdGUgPSAwOwogICAgIGlmICghc2tpcENvbnRleHQpIHsKICAgICAgIGNvbnRleHRfLnJlYWQoKTsKICAgICB9CkBAIC02MDgsMTAgKzY1MSw0MiBAQAogICAgICAgaWYgKGNoID09IEVTQ1NFUVswXSkgewogICAgICAgICBjaCA9IHJlYWRlcl8ucmVhZCgpOwogICAgICAgICBpZiAoY2ggPT0gRVNDU0VRWzFdKSB7Ci0gICAgICAgICAgcmVhZEpTT05TeW50YXhDaGFyKFpFUk8pOwotICAgICAgICAgIHJlYWRKU09OU3ludGF4Q2hhcihaRVJPKTsKLSAgICAgICAgICB0cmFuc18ucmVhZEFsbCh0bXBidWZfLCAwLCAyKTsKLSAgICAgICAgICBjaCA9IChieXRlKSgoaGV4VmFsKHRtcGJ1Zl9bMF0pIDw8IDQpICsgaGV4VmFsKHRtcGJ1Zl9bMV0pKTsKKyAgICAgICAgICB0cmFuc18ucmVhZEFsbCh0bXBidWZfLCAwLCA0KTsKKyAgICAgICAgICBzaG9ydCBjdSA9IChzaG9ydCkoCisgICAgICAgICAgICAgICgoc2hvcnQpaGV4VmFsKHRtcGJ1Zl9bMF0pIDw8IDEyKSArCisgICAgICAgICAgICAgICgoc2hvcnQpaGV4VmFsKHRtcGJ1Zl9bMV0pIDw8IDgpICsKKyAgICAgICAgICAgICAgKChzaG9ydCloZXhWYWwodG1wYnVmX1syXSkgPDwgNCkgKworICAgICAgICAgICAgICAoc2hvcnQpaGV4VmFsKHRtcGJ1Zl9bM10pKTsKKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKGlzSGlnaFN1cnJvZ2F0ZSgoY2hhciljdSkpIHsKKyAgICAgICAgICAgICAgaWYgKGhpZ2hTdXJyb2dhdGUgIT0gMCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGxvdyBzdXJyb2dhdGUgY2hhciIpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGhpZ2hTdXJyb2dhdGUgPSBjdTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGlzTG93U3Vycm9nYXRlKChjaGFyKWN1KSkgeworICAgICAgICAgICAgICBpZiAoaGlnaFN1cnJvZ2F0ZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgaGlnaCBzdXJyb2dhdGUgY2hhciIpOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgYXJyLndyaXRlKHRvVVRGOChoaWdoU3Vycm9nYXRlLCBjdSkpOworICAgICAgICAgICAgICBoaWdoU3Vycm9nYXRlID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICBhcnIud3JpdGUodG9VVEY4KGN1KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgICAgY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLk5PVF9JTVBMRU1FTlRFRCwKKyAgICAgICAgICAgICAgICAiSlZNIGRvZXMgbm90IHN1cHBvcnQgVVRGLTgiKTsKKyAgICAgICAgICB9CisgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgIkludmFsaWQgdW5pY29kZSBzZXF1ZW5jZSIpOworICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBlbHNlIHsKICAgICAgICAgICBpbnQgb2ZmID0gRVNDQVBFX0NIQVJTLmluZGV4T2YoY2gpOwpAQCAtNjI0LDYgKzY5OSwxMSBAQAogICAgICAgfQogICAgICAgYXJyLndyaXRlKGNoKTsKICAgICB9CisKKyAgICBpZiAoaGlnaFN1cnJvZ2F0ZSAhPSAwKSB7CisgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCisgICAgICAgICAgIkV4cGVjdGVkIGxvdyBzdXJyb2dhdGUgY2hhciIpOworICAgIH0KICAgICByZXR1cm4gYXJyOwogICB9CiAKQEAgLTcyMiw2ICs4MDIsMTEgQEAKICAgICBpbnQgbGVuID0gYXJyLmxlbigpOwogICAgIGludCBvZmYgPSAwOwogICAgIGludCBzaXplID0gMDsKKyAgICAvLyBJZ25vcmUgcGFkZGluZworICAgIGludCBib3VuZCA9IGxlbiA+PSAyID8gbGVuIC0gMiA6IDA7CisgICAgZm9yIChpbnQgaSA9IGxlbiAtIDE7IGkgPj0gYm91bmQgJiYgYltpXSA9PSAnPSc7IC0taSkgeworICAgICAgLS1sZW47CisgICAgfQogICAgIHdoaWxlIChsZW4gPj0gNCkgewogICAgICAgLy8gRGVjb2RlIDQgYnl0ZXMgYXQgYSB0aW1lCiAgICAgICBUQmFzZTY0VXRpbHMuZGVjb2RlKGIsIG9mZiwgNCwgYiwgc2l6ZSk7IC8vIE5COiBkZWNvZGVkIGluIHBsYWNlCmRpZmYgLS1naXQgYS9saWIvanMvR3J1bnRmaWxlLmpzIGIvbGliL2pzL0dydW50ZmlsZS5qcwppbmRleCAzMjk4ZDVjLi5iMzJhMDE2IDEwMDY0NAotLS0gYS9saWIvanMvR3J1bnRmaWxlLmpzCisrKyBiL2xpYi9qcy9HcnVudGZpbGUuanMKQEAgLTMsNiArMyw3IEBACiAvL1ByZXJlcXVpc2l0ZXM6CiAvLyBOb2RlIFNldHVwIC0gICBub2RlanMub3JnCiAvLyBHcnVudCBTZXR1cCAtICBucG0gaW5zdGFsbCAgLy9yZWFkcyB0aGUgLi9wYWNrYWdlLmpzb24gYW5kIGluc3RhbGxzIHByb2plY3QgZGVwZW5kZW5jaWVzCisvLyBSdW4gZ3J1bnQgLSAgICBucHggZ3J1bnQgIC8vIHVzZXMgcHJvamVjdC1sb2NhbCBpbnN0YWxsZWQgdmVyc2lvbiBvZiBncnVudCAoZnJvbSBwYWNrYWdlLmpzb24pCiAKIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oZ3J1bnQpIHsKICAgJ3VzZSBzdHJpY3QnOwpAQCAtMzUsMTA1ICszNiwyMTkgQEAKICAgICAgICAgICAnZGlzdC88JT0gcGtnLm5hbWUgJT4ubWluLmpzJzogWyc8JT0gY29uY2F0LmRpc3QuZGVzdCAlPiddCiAgICAgICAgIH0KICAgICAgIH0KLSAgICB9LCAgCisgICAgfSwKICAgICBzaGVsbDogewogICAgICAgSW5zdGFsbFRocmlmdEpTOiB7Ci0gICAgICAgIGNvbW1hbmQ6ICdta2RpciB0ZXN0L2J1aWxkOyBta2RpciB0ZXN0L2J1aWxkL2pzOyBjcCBzcmMvdGhyaWZ0LmpzIHRlc3QvYnVpbGQvanMvdGhyaWZ0LmpzJworICAgICAgICBjb21tYW5kOiAnbWtkaXIgLXAgdGVzdC9idWlsZC9qcy9saWI7IGNwIHNyYy90aHJpZnQuanMgdGVzdC9idWlsZC9qcy90aHJpZnQuanMnCiAgICAgICB9LAogICAgICAgSW5zdGFsbFRocmlmdE5vZGVKU0RlcDogewotICAgICAgICBjb21tYW5kOiAnY2QgLi4vbm9kZWpzOyBucG0gaW5zdGFsbCcKKyAgICAgICAgY29tbWFuZDogJ2NkIC4uLy4uOyBucG0gaW5zdGFsbCcKKyAgICAgIH0sCisgICAgICBJbnN0YWxsVGVzdExpYnM6IHsKKyAgICAgICAgY29tbWFuZDogJ2NkIHRlc3Q7IGFudCBkb3dubG9hZF9qc2xpYnMnCiAgICAgICB9LAogICAgICAgVGhyaWZ0R2VuOiB7Ci0gICAgICAgIGNvbW1hbmQ6ICd0aHJpZnQgLWdlbiBqcyAtZ2VuIGpzOm5vZGUgLW8gdGVzdCAuLi8uLi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0JworICAgICAgICBjb21tYW5kOiBbCisgICAgICAgICAgJ21rZGlyIC1wIHRlc3QvZ2VuLWpzJywKKyAgICAgICAgICAnLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtZ2VuIGpzIC0tb3V0IHRlc3QvZ2VuLWpzIC4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQnLAorICAgICAgICAgICcuLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1nZW4ganMgLS1vdXQgdGVzdC9nZW4tanMgLi4vLi4vdGVzdC9Kc0RlZXBDb25zdHJ1Y3RvclRlc3QudGhyaWZ0JywKKyAgICAgICAgICAnbWtkaXIgLXAgdGVzdC9nZW4tanMtanF1ZXJ5JywKKyAgICAgICAgICAnLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtZ2VuIGpzOmpxdWVyeSAtLW91dCB0ZXN0L2dlbi1qcy1qcXVlcnkgLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdCcsCisgICAgICAgICAgJ21rZGlyIC1wIHRlc3QvZ2VuLW5vZGVqcycsCisgICAgICAgICAgJy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLWdlbiBqczpub2RlIC0tb3V0IHRlc3QvZ2VuLW5vZGVqcyAuLi8uLi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0JywKKyAgICAgICAgICAnbWtkaXIgLXAgdGVzdC9nZW4tanMtZXM2JywKKyAgICAgICAgICAnLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtZ2VuIGpzOmVzNiAtLW91dCB0ZXN0L2dlbi1qcy1lczYgLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdCcsCisgICAgICAgICAgJ21rZGlyIC1wIHRlc3QvZ2VuLW5vZGVqcy1lczYnLAorICAgICAgICAgICcuLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1nZW4ganM6bm9kZSxlczYgLS1vdXQgLi90ZXN0L2dlbi1ub2RlanMtZXM2IC4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQnLAorICAgICAgICBdLmpvaW4oJyAmJiAnKQogICAgICAgfSwKICAgICAgIFRocmlmdEdlbkpROiB7Ci0gICAgICAgIGNvbW1hbmQ6ICd0aHJpZnQgLWdlbiBqczpqcXVlcnkgLWdlbiBqczpub2RlIC1vIHRlc3QgLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdCcKLSAgICAgIH0KLSAgICB9LAotICAgIGV4dGVybmFsX2RhZW1vbjogeworICAgICAgICBjb21tYW5kOiAnLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtZ2VuIGpzOmpxdWVyeSAtZ2VuIGpzOm5vZGUgLW8gdGVzdCAuLi8uLi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0JworICAgICAgfSwKKyAgICAgIFRocmlmdEdlbkRlZXBDb25zdHJ1Y3RvcjogeworICAgICAgICBjb21tYW5kOiAnLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtZ2VuIGpzIC1vIHRlc3QgLi4vLi4vdGVzdC9Kc0RlZXBDb25zdHJ1Y3RvclRlc3QudGhyaWZ0JworICAgICAgfSwKKyAgICAgIFRocmlmdEdlbkRvdWJsZUNvbnN0YW50czogeworICAgICAgICBjb21tYW5kOiAnLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtZ2VuIGpzIC1vIHRlc3QgLi4vLi4vdGVzdC9Eb3VibGVDb25zdGFudHNUZXN0LnRocmlmdCcKKyAgICAgIH0sCiAgICAgICBUaHJpZnRUZXN0U2VydmVyOiB7CiAgICAgICAgIG9wdGlvbnM6IHsKLSAgICAgICAgICBzdGFydENoZWNrOiBmdW5jdGlvbihzdGRvdXQsIHN0ZGVycikgewotICAgICAgICAgICAgcmV0dXJuICgvVGhyaWZ0IFNlcnZlciBydW5uaW5nIG9uIHBvcnQvKS50ZXN0KHN0ZG91dCk7Ci0gICAgICAgICAgfSwKLSAgICAgICAgICBub2RlU3Bhd25PcHRpb25zOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjd2Q6ICJ0ZXN0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudjoge05PREVfUEFUSDogIi4uLy4uL25vZGVqcy9saWI6Li4vLi4vbm9kZWpzL25vZGVfbW9kdWxlcyJ9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgIGFzeW5jOiB0cnVlLAorICAgICAgICAgIGV4ZWNPcHRpb25zOiB7CisgICAgICAgICAgICBjd2Q6ICIuL3Rlc3QiLAorICAgICAgICAgICAgZW52OiB7Tk9ERV9QQVRIOiAiLi4vLi4vbm9kZWpzL2xpYjouLi8uLi8uLi9ub2RlX21vZHVsZXMifQorICAgICAgICAgIH0KICAgICAgICAgfSwKLSAgICAgICAgY21kOiAibm9kZSIsCi0gICAgICAgIGFyZ3M6IFsic2VydmVyX2h0dHAuanMiXQorICAgICAgICBjb21tYW5kOiAibm9kZSBzZXJ2ZXJfaHR0cC5qcyIsCisgICAgICB9LAorICAgICAgVGhyaWZ0VGVzdFNlcnZlckVTNjogeworICAgICAgICBvcHRpb25zOiB7CisgICAgICAgICAgYXN5bmM6IHRydWUsCisgICAgICAgICAgZXhlY09wdGlvbnM6IHsKKyAgICAgICAgICAgIGN3ZDogIi4vdGVzdCIsCisgICAgICAgICAgICBlbnY6IHtOT0RFX1BBVEg6ICIuLi8uLi9ub2RlanMvbGliOi4uLy4uLy4uL25vZGVfbW9kdWxlcyJ9CisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICBjb21tYW5kOiAibm9kZSBzZXJ2ZXJfaHR0cC5qcyAtLWVzNiIsCiAgICAgICB9LAogICAgICAgVGhyaWZ0VGVzdFNlcnZlcl9UTFM6IHsKICAgICAgICAgb3B0aW9uczogewotICAgICAgICAgIHN0YXJ0Q2hlY2s6IGZ1bmN0aW9uKHN0ZG91dCwgc3RkZXJyKSB7Ci0gICAgICAgICAgICByZXR1cm4gKC9UaHJpZnQgU2VydmVyIHJ1bm5pbmcgb24gcG9ydC8pLnRlc3Qoc3Rkb3V0KTsKLSAgICAgICAgICB9LAotICAgICAgICAgIG5vZGVTcGF3bk9wdGlvbnM6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN3ZDogInRlc3QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52OiB7Tk9ERV9QQVRIOiAiLi4vLi4vbm9kZWpzL2xpYjouLi8uLi9ub2RlanMvbm9kZV9tb2R1bGVzIn0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgYXN5bmM6IHRydWUsCisgICAgICAgICAgZXhlY09wdGlvbnM6IHsKKyAgICAgICAgICAgIGN3ZDogIi4vdGVzdCIsCisgICAgICAgICAgICBlbnY6IHtOT0RFX1BBVEg6ICIuLi8uLi9ub2RlanMvbGliOi4uLy4uLy4uL25vZGVfbW9kdWxlcyJ9CisgICAgICAgICAgfQogICAgICAgICB9LAotICAgICAgICBjbWQ6ICJub2RlIiwKLSAgICAgICAgYXJnczogWyJzZXJ2ZXJfaHR0cHMuanMiXQotICAgICAgfQorICAgICAgICBjb21tYW5kOiAibm9kZSBzZXJ2ZXJfaHR0cHMuanMiLAorICAgICAgfSwKKyAgICAgIFRocmlmdFRlc3RTZXJ2ZXJFUzZfVExTOiB7CisgICAgICAgIG9wdGlvbnM6IHsKKyAgICAgICAgICBhc3luYzogdHJ1ZSwKKyAgICAgICAgICBleGVjT3B0aW9uczogeworICAgICAgICAgICAgY3dkOiAiLi90ZXN0IiwKKyAgICAgICAgICAgIGVudjoge05PREVfUEFUSDogIi4uLy4uL25vZGVqcy9saWI6Li4vLi4vLi4vbm9kZV9tb2R1bGVzIn0KKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgIGNvbW1hbmQ6ICJub2RlIHNlcnZlcl9odHRwcy5qcyAtLWVzNiIsCisgICAgICB9LAogICAgIH0sCiAgICAgcXVuaXQ6IHsKICAgICAgIFRocmlmdEpTOiB7CiAgICAgICAgIG9wdGlvbnM6IHsKICAgICAgICAgICB1cmxzOiBbCi0gICAgICAgICAgICAnaHR0cDovL2xvY2FsaG9zdDo4MDg4L3Rlc3Qtbm9qcS5odG1sJwotICAgICAgICAgIF0KKyAgICAgICAgICAgICdodHRwOi8vbG9jYWxob3N0OjgwODkvdGVzdC1ub2pxLmh0bWwnCisgICAgICAgICAgXSwKKyAgICAgICAgICBwdXBwZXRlZXI6IHsKKyAgICAgICAgICAgIGhlYWRsZXNzOiB0cnVlLAorICAgICAgICAgICAgYXJnczogWyctLW5vLXNhbmRib3gnXSwKKyAgICAgICAgICB9LAogICAgICAgICB9CiAgICAgICB9LAogICAgICAgVGhyaWZ0SlNKUTogewogICAgICAgICBvcHRpb25zOiB7CiAgICAgICAgICAgdXJsczogWwotICAgICAgICAgICAgJ2h0dHA6Ly9sb2NhbGhvc3Q6ODA4OC90ZXN0Lmh0bWwnCi0gICAgICAgICAgXQorICAgICAgICAgICAgJ2h0dHA6Ly9sb2NhbGhvc3Q6ODA4OS90ZXN0Lmh0bWwnCisgICAgICAgICAgXSwKKyAgICAgICAgICBwdXBwZXRlZXI6IHsKKyAgICAgICAgICAgIGhlYWRsZXNzOiB0cnVlLAorICAgICAgICAgICAgYXJnczogWyctLW5vLXNhbmRib3gnXSwKKyAgICAgICAgICB9LAorICAgICAgICB9CisgICAgICB9LAorICAgICAgVGhyaWZ0SlNfRG91YmxlUmVuZGVyaW5nOiB7CisgICAgICAgIG9wdGlvbnM6IHsKKyAgICAgICAgICB1cmxzOiBbCisgICAgICAgICAgICAnaHR0cDovL2xvY2FsaG9zdDo4MDg5L3Rlc3QtZG91YmxlLXJlbmRlcmluZy5odG1sJworICAgICAgICAgIF0sCisgICAgICAgICAgcHVwcGV0ZWVyOiB7CisgICAgICAgICAgICBoZWFkbGVzczogdHJ1ZSwKKyAgICAgICAgICAgIGFyZ3M6IFsnLS1uby1zYW5kYm94J10sCisgICAgICAgICAgICBpZ25vcmVIVFRQU0Vycm9yczogdHJ1ZSwKKyAgICAgICAgICB9LAogICAgICAgICB9CiAgICAgICB9LAogICAgICAgVGhyaWZ0V1M6IHsKICAgICAgICAgb3B0aW9uczogewogICAgICAgICAgIHVybHM6IFsKLSAgICAgICAgICAgICdodHRwOi8vbG9jYWxob3N0OjgwODgvdGVzdHdzLmh0bWwnCi0gICAgICAgICAgXQorICAgICAgICAgICAgJ2h0dHA6Ly9sb2NhbGhvc3Q6ODA4OS90ZXN0d3MuaHRtbCcKKyAgICAgICAgICBdLAorICAgICAgICAgIHB1cHBldGVlcjogeworICAgICAgICAgICAgaGVhZGxlc3M6IHRydWUsCisgICAgICAgICAgICBhcmdzOiBbJy0tbm8tc2FuZGJveCddLAorICAgICAgICAgIH0sCiAgICAgICAgIH0KICAgICAgIH0sCiAgICAgICBUaHJpZnRKU19UTFM6IHsKICAgICAgICAgb3B0aW9uczogewotICAgICAgICAgICctLWlnbm9yZS1zc2wtZXJyb3JzJzogdHJ1ZSwKICAgICAgICAgICB1cmxzOiBbCi0gICAgICAgICAgICAnaHR0cHM6Ly9sb2NhbGhvc3Q6ODA4OS90ZXN0LW5vanEuaHRtbCcKLSAgICAgICAgICBdCisgICAgICAgICAgICAnaHR0cHM6Ly9sb2NhbGhvc3Q6ODA5MS90ZXN0LW5vanEuaHRtbCcKKyAgICAgICAgICBdLAorICAgICAgICAgIHB1cHBldGVlcjogeworICAgICAgICAgICAgaGVhZGxlc3M6IHRydWUsCisgICAgICAgICAgICBhcmdzOiBbJy0tbm8tc2FuZGJveCddLAorICAgICAgICAgICAgaWdub3JlSFRUUFNFcnJvcnM6IHRydWUsCisgICAgICAgICAgfSwKICAgICAgICAgfQogICAgICAgfSwKICAgICAgIFRocmlmdEpTSlFfVExTOiB7CiAgICAgICAgIG9wdGlvbnM6IHsKLSAgICAgICAgICAnLS1pZ25vcmUtc3NsLWVycm9ycyc6IHRydWUsCiAgICAgICAgICAgdXJsczogWwotICAgICAgICAgICAgJ2h0dHBzOi8vbG9jYWxob3N0OjgwODkvdGVzdC5odG1sJwotICAgICAgICAgIF0KKyAgICAgICAgICAgICdodHRwczovL2xvY2FsaG9zdDo4MDkxL3Rlc3QuaHRtbCcKKyAgICAgICAgICBdLAorICAgICAgICAgIHB1cHBldGVlcjogeworICAgICAgICAgICAgaGVhZGxlc3M6IHRydWUsCisgICAgICAgICAgICBhcmdzOiBbJy0tbm8tc2FuZGJveCddLAorICAgICAgICAgICAgaWdub3JlSFRUUFNFcnJvcnM6IHRydWUsCisgICAgICAgICAgfSwKICAgICAgICAgfQogICAgICAgfSwKICAgICAgIFRocmlmdFdTX1RMUzogewogICAgICAgICBvcHRpb25zOiB7Ci0gICAgICAgICAgJy0taWdub3JlLXNzbC1lcnJvcnMnOiB0cnVlLAogICAgICAgICAgIHVybHM6IFsKLSAgICAgICAgICAgICdodHRwczovL2xvY2FsaG9zdDo4MDg5L3Rlc3R3cy5odG1sJwotICAgICAgICAgIF0KKyAgICAgICAgICAgICdodHRwczovL2xvY2FsaG9zdDo4MDkxL3Rlc3R3cy5odG1sJworICAgICAgICAgIF0sCisgICAgICAgICAgcHVwcGV0ZWVyOiB7CisgICAgICAgICAgICBoZWFkbGVzczogdHJ1ZSwKKyAgICAgICAgICAgIGFyZ3M6IFsnLS1uby1zYW5kYm94J10sCisgICAgICAgICAgICBpZ25vcmVIVFRQU0Vycm9yczogdHJ1ZSwKKyAgICAgICAgICB9LAorICAgICAgICB9CisgICAgICB9LAorICAgICAgVGhyaWZ0RGVlcENvbnN0cnVjdG9yOiB7CisgICAgICAgIG9wdGlvbnM6IHsKKyAgICAgICAgICB1cmxzOiBbCisgICAgICAgICAgICAnaHR0cDovL2xvY2FsaG9zdDo4MDg5L3Rlc3QtZGVlcC1jb25zdHJ1Y3Rvci5odG1sJworICAgICAgICAgIF0sCisgICAgICAgICAgcHVwcGV0ZWVyOiB7CisgICAgICAgICAgICBoZWFkbGVzczogdHJ1ZSwKKyAgICAgICAgICAgIGFyZ3M6IFsnLS1uby1zYW5kYm94J10sCisgICAgICAgICAgfSwKKyAgICAgICAgfQorICAgICAgfSwKKyAgICAgIFRocmlmdFdTRVM2OiB7CisgICAgICAgIG9wdGlvbnM6IHsKKyAgICAgICAgICB1cmxzOiBbCisgICAgICAgICAgICAnaHR0cDovL2xvY2FsaG9zdDo4MDg4L3Rlc3QtZXM2Lmh0bWwnCisgICAgICAgICAgXSwKKyAgICAgICAgICBwdXBwZXRlZXI6IHsKKyAgICAgICAgICAgIGhlYWRsZXNzOiB0cnVlLAorICAgICAgICAgICAgYXJnczogWyctLW5vLXNhbmRib3gnXSwKKyAgICAgICAgICB9LAogICAgICAgICB9CiAgICAgICB9CiAgICAgfSwKICAgICBqc2hpbnQ6IHsKLSAgICAgIGZpbGVzOiBbJ0dydW50ZmlsZS5qcycsICdzcmMvKiovKi5qcycsICd0ZXN0LyouanMnXSwKLSAgICAgIG9wdGlvbnM6IHsKLSAgICAgICAgLy8gb3B0aW9ucyBoZXJlIHRvIG92ZXJyaWRlIEpTSGludCBkZWZhdWx0cwotICAgICAgICBnbG9iYWxzOiB7Ci0gICAgICAgICAgalF1ZXJ5OiB0cnVlLAotICAgICAgICAgIGNvbnNvbGU6IHRydWUsCi0gICAgICAgICAgbW9kdWxlOiB0cnVlLAotICAgICAgICAgIGRvY3VtZW50OiB0cnVlCisgICAgICAvLyBUaGUgbWFpbiB0aHJpZnQgbGlicmFyeSBmaWxlLiBub3QgZXM2IHlldCA6KAorICAgICAgbGliOiB7CisgICAgICAgIHNyYzogWydzcmMvKiovKi5qcyddLAorICAgICAgfSwKKyAgICAgIC8vIFRoZSB0ZXN0IGZpbGVzIHVzZSBlczYKKyAgICAgIHRlc3Q6IHsKKyAgICAgICAgc3JjOiBbJ0dydW50ZmlsZS5qcycsICd0ZXN0LyouanMnXSwKKyAgICAgICAgb3B0aW9uczogeworICAgICAgICAgIGVzdmVyc2lvbjogNiwKKyAgICAgICAgfQorICAgICAgfSwKKyAgICAgIGdlbl9qc19jb2RlOiB7CisgICAgICAgIHNyYzogWyd0ZXN0L2dlbi1qcy8qLmpzJywgJ3Rlc3QvZ2VuLWpzLWpxdWVyeS8qLmpzJ10sCisgICAgICB9LAorICAgICAgZ2VuX2VzNl9jb2RlOiB7CisgICAgICAgIHNyYzogWyd0ZXN0L2dlbi1qcy1lczYvKi5qcyddLAorICAgICAgICBvcHRpb25zOiB7CisgICAgICAgICAgZXN2ZXJzaW9uOiA2LAorICAgICAgICB9CisgICAgICB9LAorICAgICAgZ2VuX25vZGVfY29kZTogeworICAgICAgICBzcmM6IFsndGVzdC9nZW4tbm9kZWpzLyouanMnXSwKKyAgICAgICAgb3B0aW9uczogeworICAgICAgICAgIG5vZGU6IHRydWUsCisgICAgICAgIH0KKyAgICAgIH0sCisgICAgICBnZW5fbm9kZV9lczZfY29kZTogeworICAgICAgICBzcmM6IFsndGVzdC9nZW4tbm9kZWpzLWVzNi8qLmpzJ10sCisgICAgICAgIG9wdGlvbnM6IHsKKyAgICAgICAgICBub2RlOiB0cnVlLAorICAgICAgICAgIGVzdmVyc2lvbjogNiwKICAgICAgICAgfQogICAgICAgfQogICAgIH0sCkBAIC0xNDQsMTggKzI1OSwzNSBAQAogICBncnVudC5sb2FkTnBtVGFza3MoJ2dydW50LWNvbnRyaWItcXVuaXQnKTsKICAgZ3J1bnQubG9hZE5wbVRhc2tzKCdncnVudC1jb250cmliLWNvbmNhdCcpOwogICBncnVudC5sb2FkTnBtVGFza3MoJ2dydW50LWpzZG9jJyk7Ci0gIGdydW50LmxvYWROcG1UYXNrcygnZ3J1bnQtZXh0ZXJuYWwtZGFlbW9uJyk7Ci0gIGdydW50LmxvYWROcG1UYXNrcygnZ3J1bnQtc2hlbGwnKTsKKyAgZ3J1bnQubG9hZE5wbVRhc2tzKCdncnVudC1zaGVsbC1zcGF3bicpOwogCi0gIGdydW50LnJlZ2lzdGVyVGFzaygndGVzdCcsIFsnanNoaW50JywgJ3NoZWxsOkluc3RhbGxUaHJpZnRKUycsICdzaGVsbDpJbnN0YWxsVGhyaWZ0Tm9kZUpTRGVwJywgJ3NoZWxsOlRocmlmdEdlbicsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2V4dGVybmFsX2RhZW1vbjpUaHJpZnRUZXN0U2VydmVyJywgJ2V4dGVybmFsX2RhZW1vbjpUaHJpZnRUZXN0U2VydmVyX1RMUycsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3F1bml0OlRocmlmdEpTJywgJ3F1bml0OlRocmlmdEpTX1RMUycsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2hlbGw6VGhyaWZ0R2VuSlEnLCAncXVuaXQ6VGhyaWZ0SlNKUScsICdxdW5pdDpUaHJpZnRKU0pRX1RMUycKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSk7Ci0gIGdydW50LnJlZ2lzdGVyVGFzaygnZGVmYXVsdCcsIFsnanNoaW50JywgJ3NoZWxsOkluc3RhbGxUaHJpZnRKUycsICdzaGVsbDpJbnN0YWxsVGhyaWZ0Tm9kZUpTRGVwJywgJ3NoZWxsOlRocmlmdEdlbicsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2V4dGVybmFsX2RhZW1vbjpUaHJpZnRUZXN0U2VydmVyJywgJ2V4dGVybmFsX2RhZW1vbjpUaHJpZnRUZXN0U2VydmVyX1RMUycsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3F1bml0OlRocmlmdEpTJywgJ3F1bml0OlRocmlmdEpTX1RMUycsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2hlbGw6VGhyaWZ0R2VuSlEnLCAncXVuaXQ6VGhyaWZ0SlNKUScsICdxdW5pdDpUaHJpZnRKU0pRX1RMUycsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29uY2F0JywgJ3VnbGlmeScsICdqc2RvYycKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSk7CisgIGdydW50LnJlZ2lzdGVyVGFzaygnd2FpdCcsICdXYWl0IGp1c3Qgb25lIHNlY29uZCBmb3Igc2VydmVyIHRvIHN0YXJ0JywgZnVuY3Rpb24gKCkgeworICAgIHZhciBkb25lID0gdGhpcy5hc3luYygpOworICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CisgICAgICBkb25lKHRydWUpOworICAgIH0sIDEwMDApOworICB9KTsKKworICBncnVudC5yZWdpc3RlclRhc2soJ2luc3RhbGxBbmRHZW5lcmF0ZScsIFsKKyAgICAnc2hlbGw6SW5zdGFsbFRocmlmdEpTJywgJ3NoZWxsOkluc3RhbGxUaHJpZnROb2RlSlNEZXAnLCAnc2hlbGw6VGhyaWZ0R2VuJywKKyAgICAnc2hlbGw6VGhyaWZ0R2VuRGVlcENvbnN0cnVjdG9yJywgJ3NoZWxsOlRocmlmdEdlbkRvdWJsZUNvbnN0YW50cycsCisgICAgJ3NoZWxsOkluc3RhbGxUZXN0TGlicycsCisgIF0pOworCisgIGdydW50LnJlZ2lzdGVyVGFzaygndGVzdCcsIFsKKyAgICAnaW5zdGFsbEFuZEdlbmVyYXRlJywKKyAgICAnanNoaW50JywKKyAgICAnc2hlbGw6VGhyaWZ0VGVzdFNlcnZlcicsICdzaGVsbDpUaHJpZnRUZXN0U2VydmVyX1RMUycsCisgICAgJ3NoZWxsOlRocmlmdFRlc3RTZXJ2ZXJFUzYnLCAnc2hlbGw6VGhyaWZ0VGVzdFNlcnZlckVTNl9UTFMnLAorICAgICd3YWl0JywKKyAgICAncXVuaXQ6VGhyaWZ0RGVlcENvbnN0cnVjdG9yJywKKyAgICAncXVuaXQ6VGhyaWZ0SlMnLCAncXVuaXQ6VGhyaWZ0SlNfVExTJywKKyAgICAncXVuaXQ6VGhyaWZ0SlNfRG91YmxlUmVuZGVyaW5nJywKKyAgICAncXVuaXQ6VGhyaWZ0V1MnLAorICAgICdxdW5pdDpUaHJpZnRKU0pRJywgJ3F1bml0OlRocmlmdEpTSlFfVExTJywKKyAgICAncXVuaXQ6VGhyaWZ0V1NFUzYnLAorICAgICdzaGVsbDpUaHJpZnRUZXN0U2VydmVyOmtpbGwnLCAnc2hlbGw6VGhyaWZ0VGVzdFNlcnZlcl9UTFM6a2lsbCcsCisgICAgJ3NoZWxsOlRocmlmdFRlc3RTZXJ2ZXJFUzY6a2lsbCcsICdzaGVsbDpUaHJpZnRUZXN0U2VydmVyRVM2X1RMUzpraWxsJywKKyAgXSk7CisgIGdydW50LnJlZ2lzdGVyVGFzaygnZGVmYXVsdCcsIFsndGVzdCcsICdjb25jYXQnLCAndWdsaWZ5JywgJ2pzZG9jJ10pOwogfTsKZGlmZiAtLWdpdCBhL2xpYi9qcy9NYWtlZmlsZS5hbSBiL2xpYi9qcy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWEyMGE0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2pzL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMzAgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjIE1ha2Ugc3VyZSB0aGlzIGRvZXNuJ3QgZmFpbCBpZiBhbnQgaXMgbm90IGNvbmZpZ3VyZWQuCisjIFdlIGNhbGwgaW5zdGFsbCB0d2ljZSB0byB3b3JrIGFyb3VuZCBucG0gaXNzdWVzCisjCitpZiBIQVZFX05QTQorU1VCRElSUyA9IHRlc3QKKworY2hlY2stbG9jYWw6IGFsbAorCSQoTlBNKSBpbnN0YWxsIHx8ICQoTlBNKSBpbnN0YWxsCisJJChOUE0pIGxpc3QKKwkuL25vZGVfbW9kdWxlcy8uYmluL2dydW50CitlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2pzL1JFQURNRS5tZCBiL2xpYi9qcy9SRUFETUUubWQKaW5kZXggOGM0MzQwYi4uOWQ1MWUyYSAxMDA2NDQKLS0tIGEvbGliL2pzL1JFQURNRS5tZAorKysgYi9saWIvanMvUkVBRE1FLm1kCkBAIC0zOCwxMiArMzgsMTIgQEAKIHNvdXJjZXMgZnJvbSB0aGUgaW50ZXJuZXQuIFRvIGJ1aWxkIHRoZSBKYXZhU2NyaXB0IGJyYW5jaAogb2YgQXBhY2hlIFRocmlmdCBleGVjdXRlIHRoZSBjb21tYW5kOgogCi0gICAgZ3J1bnQKKyAgICBucHggZ3J1bnQKICAgICAKLVRoaXMgcnVucyB0aGVydW50IGJ1aWxkIHRvb2wsIGxpbnRpbmcgYWxsIG9mIHRoZSBzb3VyY2UgCi1maWxlcywgc2V0dGluZyB1cCBhbmQgcnVubmluZyB0aGUgdGVzdHMsIGNvbmNhdGVuYXRpbmcgYW5kCi1taW5pZnlpbmcgdGhlIG1haW4gbGlicmFyaWVzIGFuZCBnZW5lcmF0aW5nIHRoZSBodG1sIAotZG9jdW1lbnRhdGlvbi4KK1RoaXMgcnVucyB0aGUgZ3J1bnQgYnVpbGQgdG9vbCAoZnJvbSB3aXRoaW4gYC4vbm9kZV9tb2R1bGVzLy5iaW4vYCksCitsaW50aW5nIGFsbCBvZiB0aGUgc291cmNlIGZpbGVzLCBzZXR0aW5nIHVwIGFuZCBydW5uaW5nIHRoZQordGVzdHMsIGNvbmNhdGVuYXRpbmcgYW5kIG1pbmlmeWluZyB0aGUgbWFpbiBsaWJyYXJpZXMgYW5kCitnZW5lcmF0aW5nIHRoZSBodG1sIGRvY3VtZW50YXRpb24uCiAKIFRyZWUKIC0tLS0KZGlmZiAtLWdpdCBhL2xpYi9qcy9jb2Rpbmdfc3RhbmRhcmRzLm1kIGIvbGliL2pzL2NvZGluZ19zdGFuZGFyZHMubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEwMzkwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qcy9jb2Rpbmdfc3RhbmRhcmRzLm1kCkBAIC0wLDAgKzEgQEAKK1BsZWFzZSBmb2xsb3cgW0dlbmVyYWwgQ29kaW5nIFN0YW5kYXJkc10oL2RvYy9jb2Rpbmdfc3RhbmRhcmRzLm1kKQpkaWZmIC0tZ2l0IGEvbGliL2pzL3BhY2thZ2UtbG9jay5qc29uIGIvbGliL2pzL3BhY2thZ2UtbG9jay5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzZDgxYzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvanMvcGFja2FnZS1sb2NrLmpzb24KQEAgLTAsMCArMSwzNzc3IEBACit7CisgICJuYW1lIjogInRocmlmdCIsCisgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgImxvY2tmaWxlVmVyc2lvbiI6IDEsCisgICJyZXF1aXJlcyI6IHRydWUsCisgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgImFiYnJldiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hYmJyZXYvLS9hYmJyZXYtMS4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLW5uZTkvSWlRL2h6SWhZNnBkRG5iQnR6N0RqUFRLclkwMFAvenZQU201cE9Ga2w2eHVHckduWG4vVnRUTk5mTnRBZlo5LzFSdGVoa3N6VTlxY1RpaTBRPT0iCisgICAgfSwKKyAgICAiYWdlbnQtYmFzZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjQuMi4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hZ2VudC1iYXNlLy0vYWdlbnQtYmFzZS00LjIuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItSlZ3WE1yOW5IWVRVWHNCRktVcWhKd3ZsY1lVL2JscmVPRVVraE5SMmVYWkl2d2QrYytvNVY0TWdEUEtXbk1TLzU2YXdOM1RSeklQK0tvUG4rcm9RdGc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImVzNi1wcm9taXNpZnkiOiAiXjUuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImFqdiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjUuNS4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hanYvLS9hanYtNS41LjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1jN1h1eWorclpUNDlQNVFpczBHdFFpQmR5V1U9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNvIjogIl40LjYuMCIsCisgICAgICAgICJmYXN0LWRlZXAtZXF1YWwiOiAiXjEuMC4wIiwKKyAgICAgICAgImZhc3QtanNvbi1zdGFibGUtc3RyaW5naWZ5IjogIl4yLjAuMCIsCisgICAgICAgICJqc29uLXNjaGVtYS10cmF2ZXJzZSI6ICJeMC4zLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiYWxpZ24tdGV4dCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS40IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hbGlnbi10ZXh0Ly0vYWxpZ24tdGV4dC0wLjEuNC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUROa0tWaENUODEwS21TVnNJcmNHbERQNjBSYz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJraW5kLW9mIjogIl4zLjAuMiIsCisgICAgICAgICJsb25nZXN0IjogIl4xLjAuMSIsCisgICAgICAgICJyZXBlYXQtc3RyaW5nIjogIl4xLjUuMiIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAia2luZC1vZiI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIzLjIuMiIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2tpbmQtb2YvLS9raW5kLW9mLTMuMi4yLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLU1lb2hwelM2dWJ1dzh5Um0ySk91cFI1S1BHUT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1idWZmZXIiOiAiXjEuMS41IgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImFuc2ktcmVnZXgiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYW5zaS1yZWdleC8tL2Fuc2ktcmVnZXgtMi4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS13N002dGU0MkRZYmc1aWp3Um9ybjd5ZldWTjg9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYW5zaS1zdHlsZXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjIuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYW5zaS1zdHlsZXMvLS9hbnNpLXN0eWxlcy0zLjIuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItVlQwWkk2a1pSZFRoOFl5SnczU01iWW0vdStOcWZzQXhFcFdPMFBmOXNxOC9lOTRXeHhPcFBLeDlGUjFGbHlDdE9WRE5PUSs4bnRscUZ4aVJjK3I1cUE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNvbG9yLWNvbnZlcnQiOiAiXjEuOS4wIgorICAgICAgfQorICAgIH0sCisgICAgImFyZ3BhcnNlIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEwIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hcmdwYXJzZS8tL2FyZ3BhcnNlLTEuMC4xMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItbzVSb3k2dE5HNFNML0ZPa0NBTjZSemppYWtaUzI1UkxZRnJjTXR0SnFiZGQ4QldybkErZkd6NTdpTjVQYjA2cHZCR3ZsNWdRMEI0OGRKbHNsWHZvVGc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInNwcmludGYtanMiOiAifjEuMC4yIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJzcHJpbnRmLWpzIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC4zIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3ByaW50Zi1qcy8tL3NwcmludGYtanMtMS4wLjMudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtQk9hU2IyWW9sVFZQUGRBVklEWXp1RmNwZml3PSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImFyci1kaWZmIjogeworICAgICAgInZlcnNpb24iOiAiNC4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Fyci1kaWZmLy0vYXJyLWRpZmYtNC4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0xa1lRZFA2LzdISG40VkkxZGhveW1sM0h4U0E9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYXJyLWZsYXR0ZW4iOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXJyLWZsYXR0ZW4vLS9hcnItZmxhdHRlbi0xLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItTDNoS1Y1Ui9wNW84MVI3TzAySUdud3BEbWtwNkU5ODJYaHRidXdTZTNPNHFPdE1NTXRvZGljQVNBMUNueTJVK2FDWGNOcG1sK200ZFBzdnNKM2phdGc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImFyci11bmlvbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hcnItdW5pb24vLS9hcnItdW5pb24tMy4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS00NXNKcnFuZStHYW84Z2JpaUs5amtadXVPY1E9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYXJyYXktZWFjaCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hcnJheS1lYWNoLy0vYXJyYXktZWFjaC0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXA1U3ZEQVdyRjFLRWJ1ZFRvZklSb0Z1Z3hFOD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJhcnJheS1maW5kLWluZGV4IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2FycmF5LWZpbmQtaW5kZXgvLS9hcnJheS1maW5kLWluZGV4LTEuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtM3dFS29TaCtGa3U5cHZseU93cVdvZXhCaDZFPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImFycmF5LXNsaWNlIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2FycmF5LXNsaWNlLy0vYXJyYXktc2xpY2UtMS4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUIxcU1EM1JCUDdPOG8wSDJLYnJYRHlCMEljY2VqTUYxNSs4N0x2bG9yMTJPTlBSSFA2Z1RqWE1Oa3QvZDNadU9HYkFlNjZoRm1hQ2ZFQ0kyNFVmcDZ3PT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJhcnJheS11bmlxdWUiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjMuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXJyYXktdW5pcXVlLy0vYXJyYXktdW5pcXVlLTAuMy4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtcUpTM1hVdkU5czFubnZNa1NwL1k5R3JpMUNnPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImFzbjEiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjIuNCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXNuMS8tL2FzbjEtMC4yLjQudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWp4d3pRcExRalNtV1hnd2FDWkU5TnorZ2xBRzAxeUYxUW5XZ2JoR3dISTVBNkZSSUVZNklWcXRIaEllcEhxSTcva3lFeVFFYWdCQzVtQkVGbElZdmRnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAic2FmZXItYnVmZmVyIjogIn4yLjEuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJhc3NlcnQtcGx1cyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hc3NlcnQtcGx1cy8tL2Fzc2VydC1wbHVzLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtOFM0UFBGMTNzTEhOMlJScFF1VHBiQjVOMVNVPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImFzc2lnbi1zeW1ib2xzIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Fzc2lnbi1zeW1ib2xzLy0vYXNzaWduLXN5bWJvbHMtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1XV1ovUWZyZFR5RE12Q3U1YTQxUGYzanNBMmM9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYXN5bmMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjUuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hc3luYy8tL2FzeW5jLTEuNS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtN0dwaHJsWklEQXc4c2tISlZoamlDSkw1WnlvPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImFzeW5jLWxpbWl0ZXIiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXN5bmMtbGltaXRlci8tL2FzeW5jLWxpbWl0ZXItMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWpwL3VGbm9vT2lPK0wyMTFlWk9vU3l6cE9JVE1YeDFyQklUYXVZeWtHM0JSWVB1OGgwVWN4c1BOQjA0UlI1dm80VHl6MytheTE3dFI2SlZmOXF6WVdnPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJhc3luY2tpdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuNC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hc3luY2tpdC8tL2FzeW5ja2l0LTAuNC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEteDU3WmYzODB5NDhyb2J5WGtMekRaa2RMUzNrPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJhdG9iIjogeworICAgICAgInZlcnNpb24iOiAiMi4xLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2F0b2IvLS9hdG9iLTIuMS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1XbTZ1a29hT0dKaS83M3AvY2wyR3ZMalRJNUpNMWsvTzE0aXNENzNZTUw4U3RySC83L2xSRmdtZzhuSUNaZ0QzYlpadmp3Q0d4dE1PRDN3V05BdThjZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYXdzLXNpZ24yIjogeworICAgICAgInZlcnNpb24iOiAiMC43LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2F3cy1zaWduMi8tL2F3cy1zaWduMi0wLjcuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXRHNkpDVFNwV1I4dEwyK0cxK2FwOGJQK2RxZz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlCisgICAgfSwKKyAgICAiYXdzNCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuOC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hd3M0Ly0vYXdzNC0xLjguMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItUmVaeHZOSElPdjg4RmxUN3J4Y1hJSUMwZlB0NEtacVpiT2xpdnlXdFhMdDhFU3g4NHpkM2tNQzZpSzVqVmVTMnF0K2c3ZnRTN3llNGZpMDZYNXJ0UlE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJiYWJ5bG9uIjogeworICAgICAgInZlcnNpb24iOiAiNy4wLjAtYmV0YS4xOSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYmFieWxvbi8tL2JhYnlsb24tNy4wLjAtYmV0YS4xOS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItVmcwQzlzL1JFWDYvV0lYTjM3VUtwdjVaaFJpNkE0cGpIbHBrRTM0KzgvYTZjMlcxUTY5Mm4zaG1jK1NaRzVsS1JuYUV4TFVieHRKMVNWVCtLYUNRL0E9PSIKKyAgICB9LAorICAgICJiYWxhbmNlZC1tYXRjaCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9iYWxhbmNlZC1tYXRjaC8tL2JhbGFuY2VkLW1hdGNoLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtaWJUUm1hc3I3a25lRms2Z0s0bk9SaTF4dDJjPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImJhc2UiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjExLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Jhc2UvLS9iYXNlLTAuMTEuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItNVQ2UDR4UGdwcDBZREZ2U1d3RVo0Tm9FM2FNNFFCUVhEem1WYnJhQ2tGajh6SE0rbWJhOFN5cUI1RGJaV3lSN21ZSG82WTdCZFFvM01vQTRtMFRlUWc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNhY2hlLWJhc2UiOiAiXjEuMC4xIiwKKyAgICAgICAgImNsYXNzLXV0aWxzIjogIl4wLjMuNSIsCisgICAgICAgICJjb21wb25lbnQtZW1pdHRlciI6ICJeMS4yLjEiLAorICAgICAgICAiZGVmaW5lLXByb3BlcnR5IjogIl4xLjAuMCIsCisgICAgICAgICJpc29iamVjdCI6ICJeMy4wLjEiLAorICAgICAgICAibWl4aW4tZGVlcCI6ICJeMS4yLjAiLAorICAgICAgICAicGFzY2FsY2FzZSI6ICJeMC4xLjEiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImRlZmluZS1wcm9wZXJ0eSI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RlZmluZS1wcm9wZXJ0eS8tL2RlZmluZS1wcm9wZXJ0eS0xLjAuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1kcDY2cno5S1k2clRyNTZOTUV5YnZubS9zT1k9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtZGVzY3JpcHRvciI6ICJeMS4wLjAiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAiaXMtYWNjZXNzb3ItZGVzY3JpcHRvciI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWFjY2Vzc29yLWRlc2NyaXB0b3IvLS9pcy1hY2Nlc3Nvci1kZXNjcmlwdG9yLTEuMC4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItbTVobkhUa2NWc1BmcXgzQUtseXR0SVBiN0orWHlrSHZKUDJCOWJaRGpsaExJb0VxNFhvSzY0Vmc3Ym9abFZXWUs2TFVZOTRkWVBFRTdMaDBaa1pLY1E9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImtpbmQtb2YiOiAiXjYuMC4wIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgImlzLWRhdGEtZGVzY3JpcHRvciI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWRhdGEtZGVzY3JpcHRvci8tL2lzLWRhdGEtZGVzY3JpcHRvci0xLjAuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWpiUlh5MUZtdEFvQ2pRa1ZtSVZZd3V1cURGVWJhT2VEam1lZDF0T0dQcnNNaHRKQTRyRDl0a2dBMEYxcUozZ1JGUlhjSFlWa2RlYVA1MFE1ckUvakxRPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJraW5kLW9mIjogIl42LjAuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJpcy1kZXNjcmlwdG9yIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtZGVzY3JpcHRvci8tL2lzLWRlc2NyaXB0b3ItMS4wLjIudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi0yZWlzNVdxUUdWN3Blb29EeUxtTkVQVXJwczkrU1hYNWM5cEwzeEVCKzRlOUhuR3VEYTdtQjdrSHhIdzRDYnFTOWsxVDJoT0gzbWlMOG44V3RpWVZ0Zz09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtYWNjZXNzb3ItZGVzY3JpcHRvciI6ICJeMS4wLjAiLAorICAgICAgICAgICAgImlzLWRhdGEtZGVzY3JpcHRvciI6ICJeMS4wLjAiLAorICAgICAgICAgICAgImtpbmQtb2YiOiAiXjYuMC4yIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImJjcnlwdC1wYmtkZiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9iY3J5cHQtcGJrZGYvLS9iY3J5cHQtcGJrZGYtMS4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1wREFkT0p0cVEvbTJmL1BLRWFQMlkzNDJEcDQ9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInR3ZWV0bmFjbCI6ICJeMC4xNC4zIgorICAgICAgfQorICAgIH0sCisgICAgImJsdWViaXJkIjogeworICAgICAgInZlcnNpb24iOiAiMy41LjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2JsdWViaXJkLy0vYmx1ZWJpcmQtMy41LjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWRoSFRXTUk3a014NXdoTVFudGw3VnI5QzZCdlYxMGxGWERBYXNucW5yTVloWFZDenprNklPOUZvMkw3NWpYSFQwN1dyT25nTDFXRFhPcCt5WVM5MVlnPT0iCisgICAgfSwKKyAgICAiYnJhY2UtZXhwYW5zaW9uIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjExIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9icmFjZS1leHBhbnNpb24vLS9icmFjZS1leHBhbnNpb24tMS4xLjExLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1pQ3VQSERGZ3JIWDdIMnZFSS81eHB6MDd6U0hCMDBUcHVncWhtWXRWbU1PNjUxOG1DdVJNb09ZRmxkRUJsMGcxODd1Zm96ZGFIZ1dLY1lGYjYxcUdpQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYmFsYW5jZWQtbWF0Y2giOiAiXjEuMC4wIiwKKyAgICAgICAgImNvbmNhdC1tYXAiOiAiMC4wLjEiCisgICAgICB9CisgICAgfSwKKyAgICAiYnJhY2VzIjogeworICAgICAgInZlcnNpb24iOiAiMi4zLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2JyYWNlcy8tL2JyYWNlcy0yLjMuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItYU5kYm5qOVA4UGpkWFU0eWJhV0xLMklGM2pjL0VvRFliQzdBYXpXNnRvM1RSc2ZYeHNjQzlVWE9CNWlEaUVRcmt5SWJXcDJTTFFkYTQrUUFhN25jM3c9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFyci1mbGF0dGVuIjogIl4xLjEuMCIsCisgICAgICAgICJhcnJheS11bmlxdWUiOiAiXjAuMy4yIiwKKyAgICAgICAgImV4dGVuZC1zaGFsbG93IjogIl4yLjAuMSIsCisgICAgICAgICJmaWxsLXJhbmdlIjogIl40LjAuMCIsCisgICAgICAgICJpc29iamVjdCI6ICJeMy4wLjEiLAorICAgICAgICAicmVwZWF0LWVsZW1lbnQiOiAiXjEuMS4yIiwKKyAgICAgICAgInNuYXBkcmFnb24iOiAiXjAuOC4xIiwKKyAgICAgICAgInNuYXBkcmFnb24tbm9kZSI6ICJeMi4wLjEiLAorICAgICAgICAic3BsaXQtc3RyaW5nIjogIl4zLjAuMiIsCisgICAgICAgICJ0by1yZWdleCI6ICJeMy4wLjEiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImV4dGVuZC1zaGFsbG93IjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjIuMC4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXh0ZW5kLXNoYWxsb3cvLS9leHRlbmQtc2hhbGxvdy0yLjAuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1VYTk5WVVyWnFmWVE2aHV2dTVpZGF4eFdpUTg9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtZXh0ZW5kYWJsZSI6ICJeMC4xLjAiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiYnJvd3NlcmlmeS16bGliIjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjQiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Jyb3dzZXJpZnktemxpYi8tL2Jyb3dzZXJpZnktemxpYi0wLjEuNC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXV6WDRwUm4yQU9ENmE0U0ZKQnlYblFGQit5MD0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJwYWtvIjogIn4wLjIuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJidWZmZXItZnJvbSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9idWZmZXItZnJvbS8tL2J1ZmZlci1mcm9tLTEuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1NUWNYRVViQ0t0RW83YmhxRXM2NTYwSHlkNFhhb3ZabE8vazlWM2hqVlVGL3p3VzdLQlZkU0s0Z0l0L2J6d1M5TWJSNXFvYitGNWp1c1pzYjBZUUsyQT09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYnVmZmVyLXNoaW1zIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2J1ZmZlci1zaGltcy8tL2J1ZmZlci1zaGltcy0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLW1Yak9NWE9JeGttdGg1TUNqRFIzN3dSS2kxRT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJidWlsdGluLW1vZHVsZXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYnVpbHRpbi1tb2R1bGVzLy0vYnVpbHRpbi1tb2R1bGVzLTEuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtSnc4SGJGcHl3QzliWmFSOStVeGY0Nko0aVM4PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImNhY2hlLWJhc2UiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY2FjaGUtYmFzZS8tL2NhY2hlLWJhc2UtMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUFLY2RUbkZTV0FUZDUvR0NQUnhyMkNod0lKODVDZXlyRXlqUkhsS3hRNTZkNFhKTUd5bTB1QWlLbjB4YkxPR09sMyt5UnBPVGk0ODRkVkNFYzVBVXpRPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJjb2xsZWN0aW9uLXZpc2l0IjogIl4xLjAuMCIsCisgICAgICAgICJjb21wb25lbnQtZW1pdHRlciI6ICJeMS4yLjEiLAorICAgICAgICAiZ2V0LXZhbHVlIjogIl4yLjAuNiIsCisgICAgICAgICJoYXMtdmFsdWUiOiAiXjEuMC4wIiwKKyAgICAgICAgImlzb2JqZWN0IjogIl4zLjAuMSIsCisgICAgICAgICJzZXQtdmFsdWUiOiAiXjIuMC4wIiwKKyAgICAgICAgInRvLW9iamVjdC1wYXRoIjogIl4wLjMuMCIsCisgICAgICAgICJ1bmlvbi12YWx1ZSI6ICJeMS4wLjAiLAorICAgICAgICAidW5zZXQtdmFsdWUiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImNhbWVsY2FzZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jYW1lbGNhc2UvLS9jYW1lbGNhc2UtMi4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1mQjBXMW5taHUrV2NvQ3lzN1BzQkhpQWZXaDg9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiY2FtZWxjYXNlLWtleXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jYW1lbGNhc2Uta2V5cy8tL2NhbWVsY2FzZS1rZXlzLTIuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTUl2dXIvM3lnUmtGSHZvZGt5SVR5UnVQa3VjPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNhbWVsY2FzZSI6ICJeMi4wLjAiLAorICAgICAgICAibWFwLW9iaiI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiY2FzZWxlc3MiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEyLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Nhc2VsZXNzLy0vY2FzZWxlc3MtMC4xMi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtRzJnY0lmK0VBenlDWlVNSkJvbENEUmh4VWR3PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJjYXRoYXJzaXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjguOSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY2F0aGFyc2lzLy0vY2F0aGFyc2lzLTAuOC45LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbU15SkRLWlMzUzd3NXdzM2tsTVEvNTZRL0lzPSIsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJ1bmRlcnNjb3JlLWNvbnRyaWIiOiAifjAuMy4wIgorICAgICAgfQorICAgIH0sCisgICAgImNlbnRlci1hbGlnbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jZW50ZXItYWxpZ24vLS9jZW50ZXItYWxpZ24tMC4xLjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1xZzB5WXB0dTZYSWdCQkhMMUVZY2tIdkN0NjA9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYWxpZ24tdGV4dCI6ICJeMC4xLjMiLAorICAgICAgICAibGF6eS1jYWNoZSI6ICJeMS4wLjMiCisgICAgICB9CisgICAgfSwKKyAgICAiY2hhbGsiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjQuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY2hhbGsvLS9jaGFsay0yLjQuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItT2JONmgxdjJmVEpTbVVYb1Mzbk1ROTJMYkRLOWJlNFRWKzZHK29tUWxHSkZkY1VYNWhlS2kxTFoxWW5STUlnd1RMRWozRTI0YlQ2dFluaTUwcmxDZlE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFuc2ktc3R5bGVzIjogIl4zLjIuMSIsCisgICAgICAgICJlc2NhcGUtc3RyaW5nLXJlZ2V4cCI6ICJeMS4wLjUiLAorICAgICAgICAic3VwcG9ydHMtY29sb3IiOiAiXjUuMy4wIgorICAgICAgfQorICAgIH0sCisgICAgImNsYXNzLXV0aWxzIjogeworICAgICAgInZlcnNpb24iOiAiMC4zLjYiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NsYXNzLXV0aWxzLy0vY2xhc3MtdXRpbHMtMC4zLjYudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXFPaFBhL0ZqN3M2VFk4SDhlc0d1NVFOcE1NUXh6NzloK3VyenJOWU42bW4rOUJueGxER2Y1UVorWGVDRHN4U2pQcXNTUjU2WE9aT0ptcGV1cm5MTWVnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhcnItdW5pb24iOiAiXjMuMS4wIiwKKyAgICAgICAgImRlZmluZS1wcm9wZXJ0eSI6ICJeMC4yLjUiLAorICAgICAgICAiaXNvYmplY3QiOiAiXjMuMC4wIiwKKyAgICAgICAgInN0YXRpYy1leHRlbmQiOiAiXjAuMS4xIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJkZWZpbmUtcHJvcGVydHkiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMC4yLjUiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZWZpbmUtcHJvcGVydHkvLS9kZWZpbmUtcHJvcGVydHktMC4yLjUudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdzFzZStSanNQSmtQbWx2RmUrQktyT3hjZ1JZPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImlzLWRlc2NyaXB0b3IiOiAiXjAuMS4wIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImNsaSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jbGkvLS9jbGktMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1Jb0YxTlBKTCtrbFF3MDFUTFVqc3ZHSWJqQlE9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZXhpdCI6ICIwLjEuMiIsCisgICAgICAgICJnbG9iIjogIl43LjEuMSIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiZ2xvYiI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICI3LjEuMyIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dsb2IvLS9nbG9iLTcuMS4zLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItdmNmdWlJeG9nTFY0RGxHQkhJVU93STBJYnJKOEhXUGM0TVU3SHp2aUdlTmhvL1VKRGZpNkI1cDNzSGVXSVEwS0dJVTBKcHhpNVpIeGVtUWZMa2tBd1E9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImZzLnJlYWxwYXRoIjogIl4xLjAuMCIsCisgICAgICAgICAgICAiaW5mbGlnaHQiOiAiXjEuMC40IiwKKyAgICAgICAgICAgICJpbmhlcml0cyI6ICIyIiwKKyAgICAgICAgICAgICJtaW5pbWF0Y2giOiAiXjMuMC40IiwKKyAgICAgICAgICAgICJvbmNlIjogIl4xLjMuMCIsCisgICAgICAgICAgICAicGF0aC1pcy1hYnNvbHV0ZSI6ICJeMS4wLjAiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiY2xpdWkiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY2xpdWkvLS9jbGl1aS0yLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVMwZFhZUCtBSmt4MkxEb1hHUU11a2NmK29ORT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJjZW50ZXItYWxpZ24iOiAiXjAuMS4xIiwKKyAgICAgICAgInJpZ2h0LWFsaWduIjogIl4wLjEuMSIsCisgICAgICAgICJ3b3Jkd3JhcCI6ICIwLjAuMiIKKyAgICAgIH0KKyAgICB9LAorICAgICJjbyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjQuNi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jby8tL2NvLTQuNi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtYnFhOTg5aFRybFRNdU9SNytndnorUU1mc1lRPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJjb2ZmZWVzY3JpcHQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEwLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NvZmZlZXNjcmlwdC8tL2NvZmZlZXNjcmlwdC0xLjEwLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS01NnFEQVpGKzlpR3pYWW81ODBqYzNSMjM0ejQ9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiY29sbGVjdGlvbi12aXNpdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jb2xsZWN0aW9uLXZpc2l0Ly0vY29sbGVjdGlvbi12aXNpdC0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVM4QTNQQlpMd3lrYlRUYU1ncHp4cUFwWjNLQT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJtYXAtdmlzaXQiOiAiXjEuMC4wIiwKKyAgICAgICAgIm9iamVjdC12aXNpdCI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiY29sb3ItY29udmVydCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuOS4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jb2xvci1jb252ZXJ0Ly0vY29sb3ItY29udmVydC0xLjkuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItUWZBVXRkK3ZGZEF0RlFjQzhDQ3lZdDFmWVd4U3FBaUsyY1NENnpEQjhOM2Nwc0VCQXZSeHA5ek9HZzZHL1NISEpZQVQ4OC9hei9JdURHQUxzTlZiR2c9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNvbG9yLW5hbWUiOiAiMS4xLjMiCisgICAgICB9CisgICAgfSwKKyAgICAiY29sb3ItbmFtZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jb2xvci1uYW1lLy0vY29sb3ItbmFtZS0xLjEuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXA5QlZpOWljUXZlVjNVSXlqM1FJTWNwVHZDVT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJjb2xvcnMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY29sb3JzLy0vY29sb3JzLTEuMS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtRm9wSEFYVnJhbjlSb1N6Z3lYdjZLTUNFN1dNPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImNvbWJpbmVkLXN0cmVhbSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC43IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jb21iaW5lZC1zdHJlYW0vLS9jb21iaW5lZC1zdHJlYW0tMS4wLjcudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWJyV2w5eTZ2T0IxeFlQWmNwWmRlM045ekRCeVhUb3NBZU1EbzRwMXd6bzZVTU9YNHZ1bUIrVFAxUlo3NnNmRTZNZDY4UTBOSlNyRS9nYmV6ZDRVbCt3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJkZWxheWVkLXN0cmVhbSI6ICJ+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+MS4wLjAiLAorICAgICAgICAiY29sb3JzIjogIjEuMC54IiwKKyAgICAgICAgImN5Y2xlIjogIjEuMC54IiwKKyAgICAgICAgImV5ZXMiOiAiMC4xLngiLAorICAgICAgICAiaXNzdHJlYW0iOiAiMC4xLngiLAorICAgICAgICAic3RhY2stdHJhY2UiOiAiMC4wLngiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImFzeW5jIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hc3luYy8tL2FzeW5jLTEuMC4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLStQd0V5am9UZUVyZW5oWkJyNWhYalB2V1I2az0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICAgICAgfSwKKyAgICAgICAgImNvbG9ycyI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjAuMyIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NvbG9ycy8tL2NvbG9ycy0xLjAuMy50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1CRFAwVFlDV2dQM3JZTzBtRHhzTUppNkNwQXM9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAib3B0aW9uYWwiOiB0cnVlCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJ3b3Jkd3JhcCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy93b3Jkd3JhcC8tL3dvcmR3cmFwLTAuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdDVacHUwTHN0QW40UFZnOHJWTEtGK3FoWkQ4PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIndyYXBweSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy93cmFwcHkvLS93cmFwcHktMS4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS10U1E5ano3QnFqWHhOa1lGdkEwUU51TUt0cDg9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAid3MiOiB7CisgICAgICAidmVyc2lvbiI6ICI1LjIuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvd3MvLS93cy01LjIuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItamFIRkQ2UEZ2NlVnb0lWZGE2cVpsbHB0UXNNbERFSmtUUWN5Ynp6WERZTTFYTzlZOGVtNjkxRkdNUG1NNDZXR3lMVTR6OUtNZ1FOK3FydXgvbmhsSEE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFzeW5jLWxpbWl0ZXIiOiAifjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInhtbGNyZWF0ZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy94bWxjcmVhdGUvLS94bWxjcmVhdGUtMS4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0rbXYzWXFZS1FUK3ozWTlMQThXeWFTT05NSTg9IgorICAgIH0sCisgICAgInlhcmdzIjogeworICAgICAgInZlcnNpb24iOiAiMy4xMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL3lhcmdzLy0veWFyZ3MtMy4xMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtOSs1NzJGZmRmQjB0T01EblR2dldnZEZESDlFPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNhbWVsY2FzZSI6ICJeMS4wLjIiLAorICAgICAgICAiY2xpdWkiOiAiXjIuMS4wIiwKKyAgICAgICAgImRlY2FtZWxpemUiOiAiXjEuMC4wIiwKKyAgICAgICAgIndpbmRvdy1zaXplIjogIjAuMS4wIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJjYW1lbGNhc2UiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4yLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jYW1lbGNhc2UvLS9jYW1lbGNhc2UtMS4yLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbTdVd1RTNExWbW1MTEhXTENLUHFxZHFsaWprPSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgInlhdXpsIjogeworICAgICAgInZlcnNpb24iOiAiMi40LjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3lhdXpsLy0veWF1emwtMi40LjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1sU2owUXRxeHNpaE9XTFEzbTdHVTRpNE1RQVU9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZmQtc2xpY2VyIjogIn4xLjAuMSIKKyAgICAgIH0KKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qcy9wYWNrYWdlLmpzb24gYi9saWIvanMvcGFja2FnZS5qc29uCmluZGV4IDgwOGZlOGEuLmE1OWNkYzQgMTAwNjQ0Ci0tLSBhL2xpYi9qcy9wYWNrYWdlLmpzb24KKysrIGIvbGliL2pzL3BhY2thZ2UuanNvbgpAQCAtMSwxNCArMSwxOSBAQAogewogICAibmFtZSI6ICJ0aHJpZnQiLAotICAidmVyc2lvbiI6ICIwLjkuMiIsCisgICJ2ZXJzaW9uIjogIjEuMC4wIiwKICAgImRldkRlcGVuZGVuY2llcyI6IHsKLSAgICAiZ3J1bnQiOiAifjAuNC4xIiwKLSAgICAiZ3J1bnQtY29udHJpYi11Z2xpZnkiOiAifjAuMi4yIiwKLSAgICAiZ3J1bnQtY29udHJpYi1qc2hpbnQiOiAifjAuNi4zIiwKLSAgICAiZ3J1bnQtY29udHJpYi1xdW5pdCI6ICJ+MC4yLjIiLAotICAgICJncnVudC1jb250cmliLWNvbmNhdCI6ICJ+MC4zLjAiLAotICAgICJncnVudC1qc2RvYyI6ICJ+MC40LjAiLAotICAgICJncnVudC1leHRlcm5hbC1kYWVtb24iOiAifjEuMS4wIiwKLSAgICAiZ3J1bnQtc2hlbGwiOiAifjAuNi40IgorICAgICJncnVudCI6ICJeMS4wLjIiLAorICAgICJncnVudC1jbGkiOiAiXjEuMi4wIiwKKyAgICAiZ3J1bnQtY29udHJpYi1jb25jYXQiOiAiXjEuMC4xIiwKKyAgICAiZ3J1bnQtY29udHJpYi1qc2hpbnQiOiAiXjEuMC4wIiwKKyAgICAiZ3J1bnQtY29udHJpYi1xdW5pdCI6ICJeMy4wLjEiLAorICAgICJncnVudC1jb250cmliLXVnbGlmeSI6ICJeMS4wLjEiLAorICAgICJncnVudC1qc2RvYyI6ICJeMi4yLjEiLAorICAgICJncnVudC1zaGVsbC1zcGF3biI6ICJeMC4zLjEwIiwKKyAgICAianNsaW50IjogIl4wLjEyLjAiCisgIH0sCisgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgImpzZG9jIjogIl4zLjUuNSIsCisgICAgIm5vcHQiOiAiXjQuMC4xIgogICB9CiB9CmRpZmYgLS1naXQgYS9saWIvanMvc3JjL3RocmlmdC5qcyBiL2xpYi9qcy9zcmMvdGhyaWZ0LmpzCmluZGV4IDBiNzMzMGIuLjliZjgxMjcgMTAwNjQ0Ci0tLSBhL2xpYi9qcy9zcmMvdGhyaWZ0LmpzCisrKyBiL2xpYi9qcy9zcmMvdGhyaWZ0LmpzCkBAIC0yMCwyMSArMjAsMjEgQEAKIC8qanNoaW50IGV2aWw6dHJ1ZSovCiAKIC8qKgotICogVGhlIFRocmlmdCBuYW1lc3BhY2UgaG91c2VzIHRoZSBBcGFjaGUgVGhyaWZ0IEphdmFTY3JpcHQgbGlicmFyeSAKLSAqIGVsZW1lbnRzIHByb3ZpZGluZyBKYXZhU2NyaXB0IGJpbmRpbmdzIGZvciB0aGUgQXBhY2hlIFRocmlmdCBSUEMgCi0gKiBzeXN0ZW0uIEVuZCB1c2VycyB3aWxsIHR5cGljYWxseSBvbmx5IGRpcmVjdGx5IG1ha2UgdXNlIG9mIHRoZSAKLSAqIFRyYW5zcG9ydCAoVFhIUlRyYW5zcG9ydC9UV2ViU29ja2V0VHJhbnNwb3J0KSBhbmQgUHJvdG9jb2wgCisgKiBUaGUgVGhyaWZ0IG5hbWVzcGFjZSBob3VzZXMgdGhlIEFwYWNoZSBUaHJpZnQgSmF2YVNjcmlwdCBsaWJyYXJ5CisgKiBlbGVtZW50cyBwcm92aWRpbmcgSmF2YVNjcmlwdCBiaW5kaW5ncyBmb3IgdGhlIEFwYWNoZSBUaHJpZnQgUlBDCisgKiBzeXN0ZW0uIEVuZCB1c2VycyB3aWxsIHR5cGljYWxseSBvbmx5IGRpcmVjdGx5IG1ha2UgdXNlIG9mIHRoZQorICogVHJhbnNwb3J0IChUWEhSVHJhbnNwb3J0L1RXZWJTb2NrZXRUcmFuc3BvcnQpIGFuZCBQcm90b2NvbAogICogKFRKU09OUFJvdG9jb2wvVEJpbmFyeVByb3RvY29sKSBjb25zdHJ1Y3RvcnMuCi0gKiAKLSAqIE9iamVjdCBtZXRob2RzIGJlZ2lubmluZyB3aXRoIGEgX18gKGUuZy4gX19vbk9wZW4oKSkgYXJlIGludGVybmFsIAorICoKKyAqIE9iamVjdCBtZXRob2RzIGJlZ2lubmluZyB3aXRoIGEgX18gKGUuZy4gX19vbk9wZW4oKSkgYXJlIGludGVybmFsCiAgKiBhbmQgc2hvdWxkIG5vdCBiZSBjYWxsZWQgb3V0c2lkZSBvZiB0aGUgb2JqZWN0J3Mgb3duIG1ldGhvZHMuCi0gKiAKKyAqCiAgKiBUaGlzIGxpYnJhcnkgY3JlYXRlcyBvbmUgZ2xvYmFsIG9iamVjdDogVGhyaWZ0CiAgKiBDb2RlIGluIHRoaXMgbGlicmFyeSBtdXN0IG5ldmVyIGNyZWF0ZSBhZGRpdGlvbmFsIGdsb2JhbCBpZGVudGlmaWVycywKICAqIGFsbCBmZWF0dXJlcyBtdXN0IGJlIHNjb3BlZCB3aXRoaW4gdGhlIFRocmlmdCBuYW1lc3BhY2UuCiAgKiBAbmFtZXNwYWNlCiAgKiBAZXhhbXBsZQotICogICAgIHZhciB0cmFuc3BvcnQgPSBuZXcgVGhyaWZ0LlRyYW5zcG9ydCgiaHR0cDovL2xvY2FsaG9zdDo4NTg1Iik7CisgKiAgICAgdmFyIHRyYW5zcG9ydCA9IG5ldyBUaHJpZnQuVHJhbnNwb3J0KCdodHRwOi8vbG9jYWxob3N0Ojg1ODUnKTsKICAqICAgICB2YXIgcHJvdG9jb2wgID0gbmV3IFRocmlmdC5Qcm90b2NvbCh0cmFuc3BvcnQpOwogICogICAgIHZhciBjbGllbnQgPSBuZXcgTXlUaHJpZnRTdmNDbGllbnQocHJvdG9jb2wpOwogICogICAgIHZhciByZXN1bHQgPSBjbGllbnQuTXlNZXRob2QoKTsKQEAgLTQ2LDcgKzQ2LDcgQEAKICAgICAgKiBAY29uc3Qge3N0cmluZ30gVmVyc2lvbgogICAgICAqIEBtZW1iZXJvZiBUaHJpZnQKICAgICAgKi8KLSAgICBWZXJzaW9uOiAnMC45LjInLAorICAgIFZlcnNpb246ICcxLjAuMCcsCiAKICAgICAvKioKICAgICAgKiBUaHJpZnQgSURMIHR5cGUgc3RyaW5nIHRvIElkIG1hcHBpbmcuCkBAIC01NSw3ICs1NSw3IEBACiAgICAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBWT0lEICAgLSBObyB2YWx1ZSAob25seSBsZWdhbCBmb3IgcmV0dXJuIHR5cGVzKS4KICAgICAgKiBAcHJvcGVydHkge251bWJlcn0gIEJPT0wgICAtIFRydWUvRmFsc2UgaW50ZWdlci4KICAgICAgKiBAcHJvcGVydHkge251bWJlcn0gIEJZVEUgICAtIFNpZ25lZCA4IGJpdCBpbnRlZ2VyLgotICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgSTA4ICAgIC0gU2lnbmVkIDggYml0IGludGVnZXIuICAgICAKKyAgICAgKiBAcHJvcGVydHkge251bWJlcn0gIEkwOCAgICAtIFNpZ25lZCA4IGJpdCBpbnRlZ2VyLgogICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgRE9VQkxFIC0gNjQgYml0IElFRUUgODU0IGZsb2F0aW5nIHBvaW50LgogICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgSTE2ICAgIC0gU2lnbmVkIDE2IGJpdCBpbnRlZ2VyLgogICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgSTMyICAgIC0gU2lnbmVkIDMyIGJpdCBpbnRlZ2VyLgpAQCAtNzAsMjMgKzcwLDIzIEBACiAgICAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBVVEYxNiAgLSBBcnJheSBvZiBieXRlcyByZXByZXNlbnRpbmcgYSBzdHJpbmcgb2YgVVRGMTYgZW5jb2RlZCBjaGFyYWN0ZXJzLgogICAgICAqLwogICAgIFR5cGU6IHsKLSAgICAgICAgJ1NUT1AnIDogMCwKLSAgICAgICAgJ1ZPSUQnIDogMSwKLSAgICAgICAgJ0JPT0wnIDogMiwKLSAgICAgICAgJ0JZVEUnIDogMywKLSAgICAgICAgJ0kwOCcgOiAzLAotICAgICAgICAnRE9VQkxFJyA6IDQsCi0gICAgICAgICdJMTYnIDogNiwKLSAgICAgICAgJ0kzMicgOiA4LAotICAgICAgICAnSTY0JyA6IDEwLAotICAgICAgICAnU1RSSU5HJyA6IDExLAotICAgICAgICAnVVRGNycgOiAxMSwKLSAgICAgICAgJ1NUUlVDVCcgOiAxMiwKLSAgICAgICAgJ01BUCcgOiAxMywKLSAgICAgICAgJ1NFVCcgOiAxNCwKLSAgICAgICAgJ0xJU1QnIDogMTUsCi0gICAgICAgICdVVEY4JyA6IDE2LAotICAgICAgICAnVVRGMTYnIDogMTcKKyAgICAgICAgU1RPUDogMCwKKyAgICAgICAgVk9JRDogMSwKKyAgICAgICAgQk9PTDogMiwKKyAgICAgICAgQllURTogMywKKyAgICAgICAgSTA4OiAzLAorICAgICAgICBET1VCTEU6IDQsCisgICAgICAgIEkxNjogNiwKKyAgICAgICAgSTMyOiA4LAorICAgICAgICBJNjQ6IDEwLAorICAgICAgICBTVFJJTkc6IDExLAorICAgICAgICBVVEY3OiAxMSwKKyAgICAgICAgU1RSVUNUOiAxMiwKKyAgICAgICAgTUFQOiAxMywKKyAgICAgICAgU0VUOiAxNCwKKyAgICAgICAgTElTVDogMTUsCisgICAgICAgIFVURjg6IDE2LAorICAgICAgICBVVEYxNjogMTcKICAgICB9LAogCiAgICAgLyoqCkBAIC05OCwxMCArOTgsMTAgQEAKICAgICAgKiBAcHJvcGVydHkge251bWJlcn0gIE9ORVdBWSAgICAtIE9uZXdheSBSUEMgY2FsbCBmcm9tIGNsaWVudCB0byBzZXJ2ZXIgd2l0aCBubyByZXNwb25zZS4KICAgICAgKi8KICAgICBNZXNzYWdlVHlwZTogewotICAgICAgICAnQ0FMTCcgOiAxLAotICAgICAgICAnUkVQTFknIDogMiwKLSAgICAgICAgJ0VYQ0VQVElPTicgOiAzLAotICAgICAgICAnT05FV0FZJyA6IDQKKyAgICAgICAgQ0FMTDogMSwKKyAgICAgICAgUkVQTFk6IDIsCisgICAgICAgIEVYQ0VQVElPTjogMywKKyAgICAgICAgT05FV0FZOiA0CiAgICAgfSwKIAogICAgIC8qKgpAQCAtMTMwLDcgKzEzMCw3IEBACiAgICAgICBmdW5jdGlvbiBGKCkge30KICAgICAgIEYucHJvdG90eXBlID0gc3VwZXJDb25zdHJ1Y3Rvci5wcm90b3R5cGU7CiAgICAgICBjb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBuZXcgRigpOwotICAgICAgY29uc3RydWN0b3IucHJvdG90eXBlLm5hbWUgPSBuYW1lIHx8ICIiOworICAgICAgY29uc3RydWN0b3IucHJvdG90eXBlLm5hbWUgPSBuYW1lIHx8ICcnOwogICAgIH0KIH07CiAKQEAgLTE3MSwxNyArMTcxLDE3IEBACiAgKiBAcHJvcGVydHkge251bWJlcn0gIFVOU1VQUE9SVEVEX0NMSUVOVF9UWVBFIC0gVW51c2VkLgogICovCiBUaHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uVHlwZSA9IHsKLSAgICAnVU5LTk9XTicgOiAwLAotICAgICdVTktOT1dOX01FVEhPRCcgOiAxLAotICAgICdJTlZBTElEX01FU1NBR0VfVFlQRScgOiAyLAotICAgICdXUk9OR19NRVRIT0RfTkFNRScgOiAzLAotICAgICdCQURfU0VRVUVOQ0VfSUQnIDogNCwKLSAgICAnTUlTU0lOR19SRVNVTFQnIDogNSwKLSAgICAnSU5URVJOQUxfRVJST1InIDogNiwKLSAgICAnUFJPVE9DT0xfRVJST1InIDogNywKLSAgICAnSU5WQUxJRF9UUkFOU0ZPUk0nIDogOCwKLSAgICAnSU5WQUxJRF9QUk9UT0NPTCcgOiA5LAotICAgICdVTlNVUFBPUlRFRF9DTElFTlRfVFlQRScgOiAxMAorICAgIFVOS05PV046IDAsCisgICAgVU5LTk9XTl9NRVRIT0Q6IDEsCisgICAgSU5WQUxJRF9NRVNTQUdFX1RZUEU6IDIsCisgICAgV1JPTkdfTUVUSE9EX05BTUU6IDMsCisgICAgQkFEX1NFUVVFTkNFX0lEOiA0LAorICAgIE1JU1NJTkdfUkVTVUxUOiA1LAorICAgIElOVEVSTkFMX0VSUk9SOiA2LAorICAgIFBST1RPQ09MX0VSUk9SOiA3LAorICAgIElOVkFMSURfVFJBTlNGT1JNOiA4LAorICAgIElOVkFMSURfUFJPVE9DT0w6IDksCisgICAgVU5TVVBQT1JURURfQ0xJRU5UX1RZUEU6IDEwCiB9OwogCiAvKioKQEAgLTE5NCw3ICsxOTQsNyBAQAogKi8KIFRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24gPSBmdW5jdGlvbihtZXNzYWdlLCBjb2RlKSB7CiAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKLSAgICB0aGlzLmNvZGUgPSB0eXBlb2YgY29kZSA9PT0gIm51bWJlciIgPyBjb2RlIDogMDsKKyAgICB0aGlzLmNvZGUgPSB0eXBlb2YgY29kZSA9PT0gJ251bWJlcicgPyBjb2RlIDogMDsKIH07CiBUaHJpZnQuaW5oZXJpdHMoVGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiwgVGhyaWZ0LlRFeGNlcHRpb24sICdUQXBwbGljYXRpb25FeGNlcHRpb24nKTsKIApAQCAtMjcyLDYgKzI3MiwyNSBAQAogICAgIHJldHVybiB0aGlzLmNvZGU7CiB9OwogCitUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uVHlwZSA9IHsKKyAgICBVTktOT1dOOiAwLAorICAgIElOVkFMSURfREFUQTogMSwKKyAgICBORUdBVElWRV9TSVpFOiAyLAorICAgIFNJWkVfTElNSVQ6IDMsCisgICAgQkFEX1ZFUlNJT046IDQsCisgICAgTk9UX0lNUExFTUVOVEVEOiA1LAorICAgIERFUFRIX0xJTUlUOiA2Cit9OworCitUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uID0gZnVuY3Rpb24gVFByb3RvY29sRXhjZXB0aW9uKHR5cGUsIG1lc3NhZ2UpIHsKKyAgICBFcnJvci5jYWxsKHRoaXMpOworICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIHRoaXMuY29uc3RydWN0b3IpOworICAgIHRoaXMubmFtZSA9IHRoaXMuY29uc3RydWN0b3IubmFtZTsKKyAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7Cit9OworVGhyaWZ0LmluaGVyaXRzKFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb24sIFRocmlmdC5URXhjZXB0aW9uLCAnVFByb3RvY29sRXhjZXB0aW9uJyk7CisKIC8qKgogICogQ29uc3RydWN0b3IgRnVuY3Rpb24gZm9yIHRoZSBYSFIgdHJhbnNwb3J0LgogICogSWYgeW91IGRvIG5vdCBzcGVjaWZ5IGEgdXJsIHRoZW4geW91IG11c3QgaGFuZGxlIFhIUiBvcGVyYXRpb25zIG9uCkBAIC0yNzksOCArMjk4LDggQEAKICAqIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgogICogQGNvbnN0cnVjdG9yCiAgKiBAcGFyYW0ge3N0cmluZ30gW3VybF0gLSBUaGUgVVJMIHRvIGNvbm5lY3QgdG8uCi0gKiBAY2xhc3NkZXNjIFRoZSBBcGFjaGUgVGhyaWZ0IFRyYW5zcG9ydCBsYXllciBwZXJmb3JtcyBieXRlIGxldmVsIEkvTyAKLSAqIGJldHdlZW4gUlBDIGNsaWVudHMgYW5kIHNlcnZlcnMuIFRoZSBKYXZhU2NyaXB0IFRYSFJUcmFuc3BvcnQgb2JqZWN0IAorICogQGNsYXNzZGVzYyBUaGUgQXBhY2hlIFRocmlmdCBUcmFuc3BvcnQgbGF5ZXIgcGVyZm9ybXMgYnl0ZSBsZXZlbCBJL08KKyAqIGJldHdlZW4gUlBDIGNsaWVudHMgYW5kIHNlcnZlcnMuIFRoZSBKYXZhU2NyaXB0IFRYSFJUcmFuc3BvcnQgb2JqZWN0CiAgKiB1c2VzIEh0dHBbc10vWEhSLiBUYXJnZXQgc2VydmVycyBtdXN0IGltcGxlbWVudCB0aGUgaHR0cFtzXSB0cmFuc3BvcnQKICAqIChzZWU6IG5vZGUuanMgZXhhbXBsZSBzZXJ2ZXJfaHR0cC5qcykuCiAgKiBAZXhhbXBsZQpAQCAtMjkxLDYgKzMxMCw3IEBACiAgICAgdGhpcy53cG9zID0gMDsKICAgICB0aGlzLnJwb3MgPSAwOwogICAgIHRoaXMudXNlQ09SUyA9IChvcHRpb25zICYmIG9wdGlvbnMudXNlQ09SUyk7CisgICAgdGhpcy5jdXN0b21IZWFkZXJzID0gb3B0aW9ucyA/IChvcHRpb25zLmN1c3RvbUhlYWRlcnMgPyBvcHRpb25zLmN1c3RvbUhlYWRlcnMgOiB7fSk6IHt9OwogICAgIHRoaXMuc2VuZF9idWYgPSAnJzsKICAgICB0aGlzLnJlY3ZfYnVmID0gJyc7CiB9OwpAQCAtMzA5LDEyICszMjksMTIgQEAKICAgICB9LAogCiAgICAgLyoqCi0gICAgICogU2VuZHMgdGhlIGN1cnJlbnQgWFJIIHJlcXVlc3QgaWYgdGhlIHRyYW5zcG9ydCB3YXMgY3JlYXRlZCB3aXRoIGEgVVJMIAorICAgICAqIFNlbmRzIHRoZSBjdXJyZW50IFhSSCByZXF1ZXN0IGlmIHRoZSB0cmFuc3BvcnQgd2FzIGNyZWF0ZWQgd2l0aCBhIFVSTAogICAgICAqIGFuZCB0aGUgYXN5bmMgcGFyYW1ldGVyIGlzIGZhbHNlLiBJZiB0aGUgdHJhbnNwb3J0IHdhcyBub3QgY3JlYXRlZCB3aXRoCi0gICAgICogYSBVUkwsIG9yIHRoZSBhc3luYyBwYXJhbWV0ZXIgaXMgVHJ1ZSBhbmQgbm8gY2FsbGJhY2sgaXMgcHJvdmlkZWQsIG9yIAorICAgICAqIGEgVVJMLCBvciB0aGUgYXN5bmMgcGFyYW1ldGVyIGlzIFRydWUgYW5kIG5vIGNhbGxiYWNrIGlzIHByb3ZpZGVkLCBvcgogICAgICAqIHRoZSBVUkwgaXMgYW4gZW1wdHkgc3RyaW5nLCB0aGUgY3VycmVudCBzZW5kIGJ1ZmZlciBpcyByZXR1cm5lZC4KICAgICAgKiBAcGFyYW0ge29iamVjdH0gYXN5bmMgLSBJZiB0cnVlIHRoZSBjdXJyZW50IHNlbmQgYnVmZmVyIGlzIHJldHVybmVkLgotICAgICAqIEBwYXJhbSB7b2JqZWN0fSBjYWxsYmFjayAtIE9wdGlvbmFsIGFzeW5jIGNvbXBsZXRpb24gY2FsbGJhY2sgCisgICAgICogQHBhcmFtIHtvYmplY3R9IGNhbGxiYWNrIC0gT3B0aW9uYWwgYXN5bmMgY29tcGxldGlvbiBjYWxsYmFjawogICAgICAqIEByZXR1cm5zIHt1bmRlZmluZWR8c3RyaW5nfSBOb3RoaW5nIG9yIHRoZSBjdXJyZW50IHNlbmQgYnVmZmVyLgogICAgICAqIEB0aHJvd3Mge3N0cmluZ30gSWYgWEhSIGZhaWxzLgogICAgICAqLwpAQCAtMzI3LDE1ICszNDcsMTUgQEAKICAgICAgICAgdmFyIHhyZXEgPSB0aGlzLmdldFhtbEh0dHBSZXF1ZXN0T2JqZWN0KCk7CiAKICAgICAgICAgaWYgKHhyZXEub3ZlcnJpZGVNaW1lVHlwZSkgewotICAgICAgICAgICAgeHJlcS5vdmVycmlkZU1pbWVUeXBlKCdhcHBsaWNhdGlvbi9qc29uJyk7CisgICAgICAgICAgICB4cmVxLm92ZXJyaWRlTWltZVR5cGUoJ2FwcGxpY2F0aW9uL3ZuZC5hcGFjaGUudGhyaWZ0Lmpzb247IGNoYXJzZXQ9dXRmLTgnKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChjYWxsYmFjaykgewogICAgICAgICAgICAgLy9JZ25vcmUgWEhSIGNhbGxiYWNrcyB1bnRpbCB0aGUgZGF0YSBhcnJpdmVzLCB0aGVuIGNhbGwgdGhlCiAgICAgICAgICAgICAvLyAgY2xpZW50J3MgY2FsbGJhY2sKLSAgICAgICAgICAgIHhyZXEub25yZWFkeXN0YXRlY2hhbmdlID0gCisgICAgICAgICAgICB4cmVxLm9ucmVhZHlzdGF0ZWNoYW5nZSA9CiAgICAgICAgICAgICAgIChmdW5jdGlvbigpIHsKLSAgICAgICAgICAgICAgICB2YXIgY2xpZW50Q2FsbGJhY2sgPSBjYWxsYmFjazsgICAgCisgICAgICAgICAgICAgICAgdmFyIGNsaWVudENhbGxiYWNrID0gY2FsbGJhY2s7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PSA0ICYmIHRoaXMuc3RhdHVzID09IDIwMCkgewogICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFJlY3ZCdWZmZXIodGhpcy5yZXNwb25zZVRleHQpOwpAQCAtMzQzLDkgKzM2MywzMCBAQAogICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgIH0oKSk7CisKKyAgICAgICAgICAgIC8vIGRldGVjdCBuZXQ6OkVSUl9DT05ORUNUSU9OX1JFRlVTRUQgYW5kIGNhbGwgdGhlIGNhbGxiYWNrLgorICAgICAgICAgICAgeHJlcS5vbmVycm9yID0KKyAgICAgICAgICAgICAgICAoZnVuY3Rpb24oKSB7CisgICAgICAgICAgICAgICAgICB2YXIgY2xpZW50Q2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgICAgICAgICAgICBjbGllbnRDYWxsYmFjaygpOworICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICB9KCkpOworCiAgICAgICAgIH0KIAogICAgICAgICB4cmVxLm9wZW4oJ1BPU1QnLCB0aGlzLnVybCwgISFhc3luYyk7CisKKyAgICAgICAgLy8gYWRkIGN1c3RvbSBoZWFkZXJzCisgICAgICAgIE9iamVjdC5rZXlzKHNlbGYuY3VzdG9tSGVhZGVycykuZm9yRWFjaChmdW5jdGlvbihwcm9wKSB7CisgICAgICAgICAgICB4cmVxLnNldFJlcXVlc3RIZWFkZXIocHJvcCwgc2VsZi5jdXN0b21IZWFkZXJzW3Byb3BdKTsKKyAgICAgICAgfSk7CisKKyAgICAgICAgaWYgKHhyZXEuc2V0UmVxdWVzdEhlYWRlcikgeworICAgICAgICAgICAgeHJlcS5zZXRSZXF1ZXN0SGVhZGVyKCdBY2NlcHQnLCAnYXBwbGljYXRpb24vdm5kLmFwYWNoZS50aHJpZnQuanNvbjsgY2hhcnNldD11dGYtOCcpOworICAgICAgICAgICAgeHJlcS5zZXRSZXF1ZXN0SGVhZGVyKCdDb250ZW50LVR5cGUnLCAnYXBwbGljYXRpb24vdm5kLmFwYWNoZS50aHJpZnQuanNvbjsgY2hhcnNldD11dGYtOCcpOworICAgICAgICB9CisKICAgICAgICAgeHJlcS5zZW5kKHRoaXMuc2VuZF9idWYpOwogICAgICAgICBpZiAoYXN5bmMgJiYgY2FsbGJhY2spIHsKICAgICAgICAgICAgIHJldHVybjsKQEAgLTM4Nyw3ICs0MjgsNyBAQAogICAgICAgICAgICAgZGF0YTogcG9zdERhdGEsCiAgICAgICAgICAgICB0eXBlOiAnUE9TVCcsCiAgICAgICAgICAgICBjYWNoZTogZmFsc2UsCi0gICAgICAgICAgICBjb250ZW50VHlwZTogJ2FwcGxpY2F0aW9uL2pzb24nLAorICAgICAgICAgICAgY29udGVudFR5cGU6ICdhcHBsaWNhdGlvbi92bmQuYXBhY2hlLnRocmlmdC5qc29uOyBjaGFyc2V0PXV0Zi04JywKICAgICAgICAgICAgIGRhdGFUeXBlOiAndGV4dCB0aHJpZnQnLAogICAgICAgICAgICAgY29udmVydGVyczogewogICAgICAgICAgICAgICAgICd0ZXh0IHRocmlmdCcgOiBmdW5jdGlvbihyZXNwb25zZURhdGEpIHsKQEAgLTQxOCwxOSArNDU5LDE5IEBACiAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB0cmFuc3BvcnQgaXMgb3BlbiwgWEhSIGFsd2F5cyByZXR1cm5zIHRydWUuCiAgICAgICogQHJlYWRvbmx5CiAgICAgICogQHJldHVybnMge2Jvb2xlYW59IEFsd2F5cyBUcnVlLgotICAgICAqLyAgICAKKyAgICAgKi8KICAgICBpc09wZW46IGZ1bmN0aW9uKCkgewogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9LAogCiAgICAgLyoqCiAgICAgICogT3BlbnMgdGhlIHRyYW5zcG9ydCBjb25uZWN0aW9uLCB3aXRoIFhIUiB0aGlzIGlzIGEgbm9wLgotICAgICAqLyAgICAKKyAgICAgKi8KICAgICBvcGVuOiBmdW5jdGlvbigpIHt9LAogCiAgICAgLyoqCiAgICAgICogQ2xvc2VzIHRoZSB0cmFuc3BvcnQgY29ubmVjdGlvbiwgd2l0aCBYSFIgdGhpcyBpcyBhIG5vcC4KLSAgICAgKi8gICAgCisgICAgICovCiAgICAgY2xvc2U6IGZ1bmN0aW9uKCkge30sCiAKICAgICAvKioKQEAgLTQ3MCw3ICs1MTEsNyBAQAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIHNlbmQgYnVmZmVyIHRvIGJ1Zi4KICAgICAgKiBAcGFyYW0ge3N0cmluZ30gYnVmIC0gVGhlIGJ1ZmZlciB0byBzZW5kLgotICAgICAqLyAgICAKKyAgICAgKi8KICAgICB3cml0ZTogZnVuY3Rpb24oYnVmKSB7CiAgICAgICAgIHRoaXMuc2VuZF9idWYgPSBidWY7CiAgICAgfSwKQEAgLTQ3OSw3ICs1MjAsNyBAQAogICAgICAqIFJldHVybnMgdGhlIHNlbmQgYnVmZmVyLgogICAgICAqIEByZWFkb25seQogICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBzZW5kIGJ1ZmZlci4KLSAgICAgKi8gCisgICAgICovCiAgICAgZ2V0U2VuZEJ1ZmZlcjogZnVuY3Rpb24oKSB7CiAgICAgICAgIHJldHVybiB0aGlzLnNlbmRfYnVmOwogICAgIH0KQEAgLTQ5MSw4ICs1MzIsOCBAQAogICogQ29uc3RydWN0b3IgRnVuY3Rpb24gZm9yIHRoZSBXZWJTb2NrZXQgdHJhbnNwb3J0LgogICogQGNvbnN0cnVjdG9yCiAgKiBAcGFyYW0ge3N0cmluZ30gW3VybF0gLSBUaGUgVVJMIHRvIGNvbm5lY3QgdG8uCi0gKiBAY2xhc3NkZXNjIFRoZSBBcGFjaGUgVGhyaWZ0IFRyYW5zcG9ydCBsYXllciBwZXJmb3JtcyBieXRlIGxldmVsIEkvTyAKLSAqIGJldHdlZW4gUlBDIGNsaWVudHMgYW5kIHNlcnZlcnMuIFRoZSBKYXZhU2NyaXB0IFRXZWJTb2NrZXRUcmFuc3BvcnQgb2JqZWN0IAorICogQGNsYXNzZGVzYyBUaGUgQXBhY2hlIFRocmlmdCBUcmFuc3BvcnQgbGF5ZXIgcGVyZm9ybXMgYnl0ZSBsZXZlbCBJL08KKyAqIGJldHdlZW4gUlBDIGNsaWVudHMgYW5kIHNlcnZlcnMuIFRoZSBKYXZhU2NyaXB0IFRXZWJTb2NrZXRUcmFuc3BvcnQgb2JqZWN0CiAgKiB1c2VzIHRoZSBXZWJTb2NrZXQgcHJvdG9jb2wuIFRhcmdldCBzZXJ2ZXJzIG11c3QgaW1wbGVtZW50IFdlYlNvY2tldC4KICAqIChzZWU6IG5vZGUuanMgZXhhbXBsZSBzZXJ2ZXJfaHR0cC5qcykuCiAgKiBAZXhhbXBsZQpAQCAtNTE1LDQzICs1NTYsNDUgQEAKICAgICB9LAogCiAgICAgLyoqCi0gICAgICogU2VuZHMgdGhlIGN1cnJlbnQgV1MgcmVxdWVzdCBhbmQgcmVnaXN0ZXJzIGNhbGxiYWNrLiBUaGUgYXN5bmMgCi0gICAgICogcGFyYW1ldGVyIGlzIGlnbm9yZWQgKFdTIGZsdXNoIGlzIGFsd2F5cyBhc3luYykgYW5kIHRoZSBjYWxsYmFjayAKKyAgICAgKiBTZW5kcyB0aGUgY3VycmVudCBXUyByZXF1ZXN0IGFuZCByZWdpc3RlcnMgY2FsbGJhY2suIFRoZSBhc3luYworICAgICAqIHBhcmFtZXRlciBpcyBpZ25vcmVkIChXUyBmbHVzaCBpcyBhbHdheXMgYXN5bmMpIGFuZCB0aGUgY2FsbGJhY2sKICAgICAgKiBmdW5jdGlvbiBwYXJhbWV0ZXIgaXMgcmVxdWlyZWQuCiAgICAgICogQHBhcmFtIHtvYmplY3R9IGFzeW5jIC0gSWdub3JlZC4KICAgICAgKiBAcGFyYW0ge29iamVjdH0gY2FsbGJhY2sgLSBUaGUgY2xpZW50IGNvbXBsZXRpb24gY2FsbGJhY2suCi0gICAgICogQHJldHVybnMge3VuZGVmaW5lZHxzdHJpbmd9IE5vdGhpbmcgKHVuZGVmaW5lZCkgCisgICAgICogQHJldHVybnMge3VuZGVmaW5lZHxzdHJpbmd9IE5vdGhpbmcgKHVuZGVmaW5lZCkKICAgICAgKi8KICAgICBmbHVzaDogZnVuY3Rpb24oYXN5bmMsIGNhbGxiYWNrKSB7CiAgICAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICAgICBpZiAodGhpcy5pc09wZW4oKSkgewogICAgICAgICAvL1NlbmQgZGF0YSBhbmQgcmVnaXN0ZXIgYSBjYWxsYmFjayB0byBpbnZva2UgdGhlIGNsaWVudCBjYWxsYmFjawotICAgICAgICB0aGlzLnNvY2tldC5zZW5kKHRoaXMuc2VuZF9idWYpOyAKKyAgICAgICAgdGhpcy5zb2NrZXQuc2VuZCh0aGlzLnNlbmRfYnVmKTsKICAgICAgICAgdGhpcy5jYWxsYmFja3MucHVzaCgoZnVuY3Rpb24oKSB7Ci0gICAgICAgICAgdmFyIGNsaWVudENhbGxiYWNrID0gY2FsbGJhY2s7ICAgIAorICAgICAgICAgIHZhciBjbGllbnRDYWxsYmFjayA9IGNhbGxiYWNrOwogICAgICAgICAgIHJldHVybiBmdW5jdGlvbihtc2cpIHsKICAgICAgICAgICAgIHNlbGYuc2V0UmVjdkJ1ZmZlcihtc2cpOwotICAgICAgICAgICAgY2xpZW50Q2FsbGJhY2soKTsKKyAgICAgICAgICAgIGlmIChjbGllbnRDYWxsYmFjaykgeworICAgICAgICAgICAgICAgIGNsaWVudENhbGxiYWNrKCk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgfTsKICAgICAgICAgfSgpKSk7CiAgICAgICB9IGVsc2UgewogICAgICAgICAvL1F1ZXVlIHRoZSBzZW5kIHRvIGdvIG91dCBfX29uT3BlbgogICAgICAgICB0aGlzLnNlbmRfcGVuZGluZy5wdXNoKHsKICAgICAgICAgICBidWY6IHRoaXMuc2VuZF9idWYsCi0gICAgICAgICAgY2I6ICBjYWxsYmFjaworICAgICAgICAgIGNiOiBjYWxsYmFjawogICAgICAgICB9KTsKICAgICAgIH0KICAgICB9LAogCi0gICAgX19vbk9wZW46IGZ1bmN0aW9uKCkgeyAKKyAgICBfX29uT3BlbjogZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwogICAgICAgIGlmICh0aGlzLnNlbmRfcGVuZGluZy5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgLy9JZiB0aGUgdXNlciBtYWRlIGNhbGxzIGJlZm9yZSB0aGUgY29ubmVjdGlvbiB3YXMgZnVsbHkgCisgICAgICAgICAgLy9JZiB0aGUgdXNlciBtYWRlIGNhbGxzIGJlZm9yZSB0aGUgY29ubmVjdGlvbiB3YXMgZnVsbHkKICAgICAgICAgICAvL29wZW4sIHNlbmQgdGhlbSBub3cKICAgICAgICAgICB0aGlzLnNlbmRfcGVuZGluZy5mb3JFYWNoKGZ1bmN0aW9uKGVsZW0pIHsKLSAgICAgICAgICAgICB0aGlzLnNvY2tldC5zZW5kKGVsZW0uYnVmKTsKLSAgICAgICAgICAgICB0aGlzLmNhbGxiYWNrcy5wdXNoKChmdW5jdGlvbigpIHsKLSAgICAgICAgICAgICAgIHZhciBjbGllbnRDYWxsYmFjayA9IGVsZW0uY2I7ICAgIAorICAgICAgICAgICAgIHNlbGYuc29ja2V0LnNlbmQoZWxlbS5idWYpOworICAgICAgICAgICAgIHNlbGYuY2FsbGJhY2tzLnB1c2goKGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAgdmFyIGNsaWVudENhbGxiYWNrID0gZWxlbS5jYjsKICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihtc2cpIHsKICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0UmVjdkJ1ZmZlcihtc2cpOwogICAgICAgICAgICAgICAgICAgY2xpZW50Q2FsbGJhY2soKTsKQEAgLTU2MSwxOSArNjA0LDE5IEBACiAgICAgICAgICAgdGhpcy5zZW5kX3BlbmRpbmcgPSBbXTsKICAgICAgICB9CiAgICAgfSwKLSAgICAKLSAgICBfX29uQ2xvc2U6IGZ1bmN0aW9uKGV2dCkgeyAKKworICAgIF9fb25DbG9zZTogZnVuY3Rpb24oZXZ0KSB7CiAgICAgICB0aGlzLl9fcmVzZXQodGhpcy51cmwpOwogICAgIH0sCi0gICAgIAorCiAgICAgX19vbk1lc3NhZ2U6IGZ1bmN0aW9uKGV2dCkgewogICAgICAgaWYgKHRoaXMuY2FsbGJhY2tzLmxlbmd0aCkgewogICAgICAgICB0aGlzLmNhbGxiYWNrcy5zaGlmdCgpKGV2dC5kYXRhKTsKICAgICAgIH0KICAgICB9LAotICAgICAKLSAgICBfX29uRXJyb3I6IGZ1bmN0aW9uKGV2dCkgeyAKLSAgICAgIGNvbnNvbGUubG9nKCJUaHJpZnQgV2ViU29ja2V0IEVycm9yOiAiICsgZXZ0LnRvU3RyaW5nKCkpOworCisgICAgX19vbkVycm9yOiBmdW5jdGlvbihldnQpIHsKKyAgICAgIGNvbnNvbGUubG9nKCdUaHJpZnQgV2ViU29ja2V0IEVycm9yOiAnICsgZXZ0LnRvU3RyaW5nKCkpOwogICAgICAgdGhpcy5zb2NrZXQuY2xvc2UoKTsKICAgICB9LAogCkBAIC01OTEsMTUgKzYzNCwxNSBAQAogICAgIC8qKgogICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdHJhbnNwb3J0IGlzIG9wZW4KICAgICAgKiBAcmVhZG9ubHkKLSAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gCi0gICAgICovICAgIAorICAgICAqIEByZXR1cm5zIHtib29sZWFufQorICAgICAqLwogICAgIGlzT3BlbjogZnVuY3Rpb24oKSB7CiAgICAgICAgIHJldHVybiB0aGlzLnNvY2tldCAmJiB0aGlzLnNvY2tldC5yZWFkeVN0YXRlID09IHRoaXMuc29ja2V0Lk9QRU47CiAgICAgfSwKIAogICAgIC8qKgogICAgICAqIE9wZW5zIHRoZSB0cmFuc3BvcnQgY29ubmVjdGlvbgotICAgICAqLyAgICAKKyAgICAgKi8KICAgICBvcGVuOiBmdW5jdGlvbigpIHsKICAgICAgIC8vSWYgT1BFTi9DT05ORUNUSU5HL0NMT1NJTkcgaWdub3JlIGFkZGl0aW9uYWwgb3BlbnMKICAgICAgIGlmICh0aGlzLnNvY2tldCAmJiB0aGlzLnNvY2tldC5yZWFkeVN0YXRlICE9IHRoaXMuc29ja2V0LkNMT1NFRCkgewpAQCAtNjA3LDE1ICs2NTAsMTUgQEAKICAgICAgIH0KICAgICAgIC8vSWYgdGhlcmUgaXMgbm8gc29ja2V0IG9yIHRoZSBzb2NrZXQgaXMgY2xvc2VkOgogICAgICAgdGhpcy5zb2NrZXQgPSBuZXcgV2ViU29ja2V0KHRoaXMudXJsKTsKLSAgICAgIHRoaXMuc29ja2V0Lm9ub3BlbiA9IHRoaXMuX19vbk9wZW4uYmluZCh0aGlzKTsgCi0gICAgICB0aGlzLnNvY2tldC5vbm1lc3NhZ2UgPSB0aGlzLl9fb25NZXNzYWdlLmJpbmQodGhpcyk7IAotICAgICAgdGhpcy5zb2NrZXQub25lcnJvciA9IHRoaXMuX19vbkVycm9yLmJpbmQodGhpcyk7IAotICAgICAgdGhpcy5zb2NrZXQub25jbG9zZSA9IHRoaXMuX19vbkNsb3NlLmJpbmQodGhpcyk7IAorICAgICAgdGhpcy5zb2NrZXQub25vcGVuID0gdGhpcy5fX29uT3Blbi5iaW5kKHRoaXMpOworICAgICAgdGhpcy5zb2NrZXQub25tZXNzYWdlID0gdGhpcy5fX29uTWVzc2FnZS5iaW5kKHRoaXMpOworICAgICAgdGhpcy5zb2NrZXQub25lcnJvciA9IHRoaXMuX19vbkVycm9yLmJpbmQodGhpcyk7CisgICAgICB0aGlzLnNvY2tldC5vbmNsb3NlID0gdGhpcy5fX29uQ2xvc2UuYmluZCh0aGlzKTsKICAgICB9LAogCiAgICAgLyoqCiAgICAgICogQ2xvc2VzIHRoZSB0cmFuc3BvcnQgY29ubmVjdGlvbgotICAgICAqLyAgICAKKyAgICAgKi8KICAgICBjbG9zZTogZnVuY3Rpb24oKSB7CiAgICAgICB0aGlzLnNvY2tldC5jbG9zZSgpOwogICAgIH0sCkBAIC02NTcsNyArNzAwLDcgQEAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBzZW5kIGJ1ZmZlciB0byBidWYuCiAgICAgICogQHBhcmFtIHtzdHJpbmd9IGJ1ZiAtIFRoZSBidWZmZXIgdG8gc2VuZC4KLSAgICAgKi8gICAgCisgICAgICovCiAgICAgd3JpdGU6IGZ1bmN0aW9uKGJ1ZikgewogICAgICAgICB0aGlzLnNlbmRfYnVmID0gYnVmOwogICAgIH0sCkBAIC02NjYsNyArNzA5LDcgQEAKICAgICAgKiBSZXR1cm5zIHRoZSBzZW5kIGJ1ZmZlci4KICAgICAgKiBAcmVhZG9ubHkKICAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgc2VuZCBidWZmZXIuCi0gICAgICovIAorICAgICAqLwogICAgIGdldFNlbmRCdWZmZXI6IGZ1bmN0aW9uKCkgewogICAgICAgICByZXR1cm4gdGhpcy5zZW5kX2J1ZjsKICAgICB9CkBAIC02NzcsMTMgKzcyMCwxNSBAQAogICogSW5pdGlhbGl6ZXMgYSBUaHJpZnQgSlNPTiBwcm90b2NvbCBpbnN0YW5jZS4KICAqIEBjb25zdHJ1Y3RvcgogICogQHBhcmFtIHtUaHJpZnQuVHJhbnNwb3J0fSB0cmFuc3BvcnQgLSBUaGUgdHJhbnNwb3J0IHRvIHNlcmlhbGl6ZSB0by9mcm9tLgotICogQGNsYXNzZGVzYyBBcGFjaGUgVGhyaWZ0IFByb3RvY29scyBwZXJmb3JtIHNlcmlhbGl6YXRpb24gd2hpY2ggZW5hYmxlcyBjcm9zcyAKLSAqIGxhbmd1YWdlIFJQQy4gVGhlIFByb3RvY29sIHR5cGUgaXMgdGhlIEphdmFTY3JpcHQgYnJvd3NlciBpbXBsZW1lbnRhdGlvbiAKKyAqIEBjbGFzc2Rlc2MgQXBhY2hlIFRocmlmdCBQcm90b2NvbHMgcGVyZm9ybSBzZXJpYWxpemF0aW9uIHdoaWNoIGVuYWJsZXMgY3Jvc3MKKyAqIGxhbmd1YWdlIFJQQy4gVGhlIFByb3RvY29sIHR5cGUgaXMgdGhlIEphdmFTY3JpcHQgYnJvd3NlciBpbXBsZW1lbnRhdGlvbgogICogb2YgdGhlIEFwYWNoZSBUaHJpZnQgVEpTT05Qcm90b2NvbC4KICAqIEBleGFtcGxlCiAgKiAgICAgdmFyIHByb3RvY29sICA9IG5ldyBUaHJpZnQuUHJvdG9jb2wodHJhbnNwb3J0KTsKICAqLwogVGhyaWZ0LlRKU09OUHJvdG9jb2wgPSBUaHJpZnQuUHJvdG9jb2wgPSBmdW5jdGlvbih0cmFuc3BvcnQpIHsKKyAgICB0aGlzLnRzdGFjayA9IFtdOworICAgIHRoaXMudHBvcyA9IFtdOwogICAgIHRoaXMudHJhbnNwb3J0ID0gdHJhbnNwb3J0OwogfTsKIApAQCAtNzM2LDcgKzc4MSw3IEBACiAgICAgICogUmV0dXJucyB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQuCiAgICAgICogQHJlYWRvbmx5CiAgICAgICogQHJldHVybnMge1RocmlmdC5UcmFuc3BvcnR9IFRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydC4KLSAgICAgKi8gCisgICAgICovCiAgICAgZ2V0VHJhbnNwb3J0OiBmdW5jdGlvbigpIHsKICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNwb3J0OwogICAgIH0sCkBAIC05NzgsNyArMTAyMyw3IEBACiAgICAgICAgICAgICAgICAgaWYgKGNoID09PSAnXCInKSB7CiAgICAgICAgICAgICAgICAgICAgIGVzY2FwZWRTdHJpbmcgKz0gJ1xcXCInOyAvLyB3cml0ZSBvdXQgYXM6IFwiCiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PT0gJ1xcJykgeyAgICAvLyBhIHNpbmdsZSBiYWNrc2xhc2gKLSAgICAgICAgICAgICAgICAgICAgZXNjYXBlZFN0cmluZyArPSAnXFxcXCc7IC8vIHdyaXRlIG91dCBhcyBkb3VibGUgYmFja3NsYXNoIAorICAgICAgICAgICAgICAgICAgICBlc2NhcGVkU3RyaW5nICs9ICdcXFxcJzsgLy8gd3JpdGUgb3V0IGFzIGRvdWJsZSBiYWNrc2xhc2gKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09PSAnXGInKSB7ICAgIC8vIGEgc2luZ2xlIGJhY2tzcGFjZTogaW52aXNpYmxlCiAgICAgICAgICAgICAgICAgICAgIGVzY2FwZWRTdHJpbmcgKz0gJ1xcYic7ICAvLyB3cml0ZSBvdXQgYXM6IFxiIgogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT09ICdcZicpIHsgICAgLy8gYSBzaW5nbGUgZm9ybWZlZWQ6IGludmlzaWJsZQpAQCAtOTk4LDggKzEwNDMsMTkgQEAKICAgICB9LAogCiAgICAgLyoqIFNlcmlhbGl6ZXMgYSBzdHJpbmcgKi8KLSAgICB3cml0ZUJpbmFyeTogZnVuY3Rpb24oc3RyKSB7Ci0gICAgICAgIHRoaXMud3JpdGVTdHJpbmcoc3RyKTsKKyAgICB3cml0ZUJpbmFyeTogZnVuY3Rpb24oYmluYXJ5KSB7CisgICAgICAgIHZhciBzdHIgPSAnJzsKKyAgICAgICAgaWYgKHR5cGVvZiBiaW5hcnkgPT0gJ3N0cmluZycpIHsKKyAgICAgICAgICAgIHN0ciA9IGJpbmFyeTsKKyAgICAgICAgfSBlbHNlIGlmIChiaW5hcnkgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB7CisgICAgICAgICAgICB2YXIgYXJyID0gYmluYXJ5OworICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgICAgICBzdHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShhcnJbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignd3JpdGVCaW5hcnkgb25seSBhY2NlcHRzIFN0cmluZyBvciBVaW50OEFycmF5LicpOworICAgICAgICB9CisgICAgICAgIHRoaXMudHN0YWNrLnB1c2goJyInICsgYnRvYShzdHIpICsgJyInKTsKICAgICB9LAogCiAgICAgLyoqCkBAIC0xMDA5LDggKzEwNjUsOCBAQAogICAgICAgIEBwcm9wZXJ0eSB7VGhyaWZ0Lk1lc3NhZ2VUeXBlfSBtdHlwZSAtIFRoZSB0eXBlIG9mIG1lc3NhZ2UgY2FsbC4KICAgICAgICBAcHJvcGVydHkge251bWJlcn0gcnNlcWlkIC0gVGhlIHNlcXVlbmNlIG51bWJlciBvZiB0aGUgbWVzc2FnZSAoMCBpbiBUaHJpZnQgUlBDKS4KICAgICAgKi8KLSAgICAvKiogCi0gICAgICogRGVzZXJpYWxpemVzIHRoZSBiZWdpbm5pbmcgb2YgYSBtZXNzYWdlLiAKKyAgICAvKioKKyAgICAgKiBEZXNlcmlhbGl6ZXMgdGhlIGJlZ2lubmluZyBvZiBhIG1lc3NhZ2UuCiAgICAgICogQHJldHVybnMge0Fub25SZWFkTWVzc2FnZUJlZ2luUmV0dXJufQogICAgICAqLwogICAgIHJlYWRNZXNzYWdlQmVnaW46IGZ1bmN0aW9uKCkgewpAQCAtMTA0NywxMSArMTEwMywxMSBAQAogICAgIHJlYWRNZXNzYWdlRW5kOiBmdW5jdGlvbigpIHsKICAgICB9LAogCi0gICAgLyoqIAotICAgICAqIERlc2VyaWFsaXplcyB0aGUgYmVnaW5uaW5nIG9mIGEgc3RydWN0LiAKKyAgICAvKioKKyAgICAgKiBEZXNlcmlhbGl6ZXMgdGhlIGJlZ2lubmluZyBvZiBhIHN0cnVjdC4KICAgICAgKiBAcGFyYW0ge3N0cmluZ30gW25hbWVdIC0gVGhlIG5hbWUgb2YgdGhlIHN0cnVjdCAoaWdub3JlZCkKICAgICAgKiBAcmV0dXJucyB7b2JqZWN0fSAtIEFuIG9iamVjdCB3aXRoIGFuIGVtcHR5IHN0cmluZyBmbmFtZSBwcm9wZXJ0eQotICAgICAqLyAgICAKKyAgICAgKi8KICAgICByZWFkU3RydWN0QmVnaW46IGZ1bmN0aW9uKG5hbWUpIHsKICAgICAgICAgdmFyIHIgPSB7fTsKICAgICAgICAgci5mbmFtZSA9ICcnOwpAQCAtMTA3OCw4ICsxMTM0LDggQEAKICAgICAgICBAcHJvcGVydHkge1RocmlmdC5UeXBlfSBmdHlwZSAtIFRoZSBkYXRhIHR5cGUgb2YgdGhlIGZpZWxkLgogICAgICAgIEBwcm9wZXJ0eSB7bnVtYmVyfSBmaWQgLSBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGZpZWxkLgogICAgICAqLwotICAgIC8qKiAKLSAgICAgKiBEZXNlcmlhbGl6ZXMgdGhlIGJlZ2lubmluZyBvZiBhIGZpZWxkLiAKKyAgICAvKioKKyAgICAgKiBEZXNlcmlhbGl6ZXMgdGhlIGJlZ2lubmluZyBvZiBhIGZpZWxkLgogICAgICAqIEByZXR1cm5zIHtBbm9uUmVhZEZpZWxkQmVnaW5SZXR1cm59CiAgICAgICovCiAgICAgcmVhZEZpZWxkQmVnaW46IGZ1bmN0aW9uKCkgewpAQCAtMTE0Nyw4ICsxMjAzLDggQEAKICAgICAgICBAcHJvcGVydHkge1RocmlmdC5UeXBlfSB2dHlwZSAtIFRoZSBkYXRhIHR5cGUgb2YgdGhlIHZhbHVlLgogICAgICAgIEBwcm9wZXJ0eSB7bnVtYmVyfSBzaXplIC0gVGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbWFwLgogICAgICAqLwotICAgIC8qKiAKLSAgICAgKiBEZXNlcmlhbGl6ZXMgdGhlIGJlZ2lubmluZyBvZiBhIG1hcC4gCisgICAgLyoqCisgICAgICogRGVzZXJpYWxpemVzIHRoZSBiZWdpbm5pbmcgb2YgYSBtYXAuCiAgICAgICogQHJldHVybnMge0Fub25SZWFkTWFwQmVnaW5SZXR1cm59CiAgICAgICovCiAgICAgcmVhZE1hcEJlZ2luOiBmdW5jdGlvbigpIHsKQEAgLTExODMsOCArMTIzOSw4IEBACiAgICAgICAgQHByb3BlcnR5IHtUaHJpZnQuVHlwZX0gZXR5cGUgLSBUaGUgZGF0YSB0eXBlIG9mIHRoZSBlbGVtZW50LgogICAgICAgIEBwcm9wZXJ0eSB7bnVtYmVyfSBzaXplIC0gVGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29sbGVjdGlvbi4KICAgICAgKi8KLSAgICAvKiogCi0gICAgICogRGVzZXJpYWxpemVzIHRoZSBiZWdpbm5pbmcgb2YgYSBsaXN0LiAKKyAgICAvKioKKyAgICAgKiBEZXNlcmlhbGl6ZXMgdGhlIGJlZ2lubmluZyBvZiBhIGxpc3QuCiAgICAgICogQHJldHVybnMge0Fub25SZWFkQ29sQmVnaW5SZXR1cm59CiAgICAgICovCiAgICAgcmVhZExpc3RCZWdpbjogZnVuY3Rpb24oKSB7CkBAIC0xMTk1LDE4ICsxMjUxLDIzIEBACiAgICAgICAgIHIuc2l6ZSA9IGxpc3Quc2hpZnQoKTsKIAogICAgICAgICB0aGlzLnJwb3MucHVzaCh0aGlzLnJzdGFjay5sZW5ndGgpOwotICAgICAgICB0aGlzLnJzdGFjay5wdXNoKGxpc3QpOworICAgICAgICB0aGlzLnJzdGFjay5wdXNoKGxpc3Quc2hpZnQoKSk7CiAKICAgICAgICAgcmV0dXJuIHI7CiAgICAgfSwKIAogICAgIC8qKiBEZXNlcmlhbGl6ZXMgdGhlIGVuZCBvZiBhIGxpc3QuICovCiAgICAgcmVhZExpc3RFbmQ6IGZ1bmN0aW9uKCkgewotICAgICAgICB0aGlzLnJlYWRGaWVsZEVuZCgpOworICAgICAgICB2YXIgcG9zID0gdGhpcy5ycG9zLnBvcCgpIC0gMjsKKyAgICAgICAgdmFyIHN0ID0gdGhpcy5yc3RhY2s7CisgICAgICAgIHN0LnBvcCgpOworICAgICAgICBpZiAoc3QgaW5zdGFuY2VvZiBBcnJheSAmJiBzdC5sZW5ndGggPiBwb3MgJiYgc3RbcG9zXS5sZW5ndGggPiAwKSB7CisgICAgICAgICAgc3QucHVzaChzdFtwb3NdLnNoaWZ0KCkpOworICAgICAgICB9CiAgICAgfSwKIAotICAgIC8qKiAKLSAgICAgKiBEZXNlcmlhbGl6ZXMgdGhlIGJlZ2lubmluZyBvZiBhIHNldC4gCisgICAgLyoqCisgICAgICogRGVzZXJpYWxpemVzIHRoZSBiZWdpbm5pbmcgb2YgYSBzZXQuCiAgICAgICogQHJldHVybnMge0Fub25SZWFkQ29sQmVnaW5SZXR1cm59CiAgICAgICovCiAgICAgcmVhZFNldEJlZ2luOiBmdW5jdGlvbihlbGVtVHlwZSwgc2l6ZSkgewpAQCAtMTIxOCw5ICsxMjc5LDkgQEAKICAgICAgICAgcmV0dXJuIHRoaXMucmVhZExpc3RFbmQoKTsKICAgICB9LAogCi0gICAgLyoqIFJldHVybnMgYW4gb2JqZWN0IHdpdGggYSB2YWx1ZSBwcm9wZXJ0eSBzZXQgdG8gCi0gICAgICogIEZhbHNlIHVubGVzcyB0aGUgbmV4dCBudW1iZXIgaW4gdGhlIHByb3RvY29sIGJ1ZmZlciAKLSAgICAgKiAgaXMgMSwgaW4gd2hpY2ggY2FzZSB0ZWggdmFsdWUgcHJvcGVydHkgaXMgVHJ1ZSAqLworICAgIC8qKiBSZXR1cm5zIGFuIG9iamVjdCB3aXRoIGEgdmFsdWUgcHJvcGVydHkgc2V0IHRvCisgICAgICogIEZhbHNlIHVubGVzcyB0aGUgbmV4dCBudW1iZXIgaW4gdGhlIHByb3RvY29sIGJ1ZmZlcgorICAgICAqICBpcyAxLCBpbiB3aGljaCBjYXNlIHRoZSB2YWx1ZSBwcm9wZXJ0eSBpcyBUcnVlICovCiAgICAgcmVhZEJvb2w6IGZ1bmN0aW9uKCkgewogICAgICAgICB2YXIgciA9IHRoaXMucmVhZEkzMigpOwogCkBAIC0xMjMzLDE5ICsxMjk0LDE5IEBACiAgICAgICAgIHJldHVybiByOwogICAgIH0sCiAKLSAgICAvKiogUmV0dXJucyB0aGUgYW4gb2JqZWN0IHdpdGggYSB2YWx1ZSBwcm9wZXJ0eSBzZXQgdG8gdGhlIAorICAgIC8qKiBSZXR1cm5zIHRoZSBhbiBvYmplY3Qgd2l0aCBhIHZhbHVlIHByb3BlcnR5IHNldCB0byB0aGUKICAgICAgICAgbmV4dCB2YWx1ZSBmb3VuZCBpbiB0aGUgcHJvdG9jb2wgYnVmZmVyICovCiAgICAgcmVhZEJ5dGU6IGZ1bmN0aW9uKCkgewogICAgICAgICByZXR1cm4gdGhpcy5yZWFkSTMyKCk7CiAgICAgfSwKIAotICAgIC8qKiBSZXR1cm5zIHRoZSBhbiBvYmplY3Qgd2l0aCBhIHZhbHVlIHByb3BlcnR5IHNldCB0byB0aGUgCisgICAgLyoqIFJldHVybnMgdGhlIGFuIG9iamVjdCB3aXRoIGEgdmFsdWUgcHJvcGVydHkgc2V0IHRvIHRoZQogICAgICAgICBuZXh0IHZhbHVlIGZvdW5kIGluIHRoZSBwcm90b2NvbCBidWZmZXIgKi8KICAgICByZWFkSTE2OiBmdW5jdGlvbigpIHsKICAgICAgICAgcmV0dXJuIHRoaXMucmVhZEkzMigpOwogICAgIH0sCiAKLSAgICAvKiogUmV0dXJucyB0aGUgYW4gb2JqZWN0IHdpdGggYSB2YWx1ZSBwcm9wZXJ0eSBzZXQgdG8gdGhlIAorICAgIC8qKiBSZXR1cm5zIHRoZSBhbiBvYmplY3Qgd2l0aCBhIHZhbHVlIHByb3BlcnR5IHNldCB0byB0aGUKICAgICAgICAgbmV4dCB2YWx1ZSBmb3VuZCBpbiB0aGUgcHJvdG9jb2wgYnVmZmVyICovCiAgICAgcmVhZEkzMjogZnVuY3Rpb24oZikgewogICAgICAgICBpZiAoZiA9PT0gdW5kZWZpbmVkKSB7CkBAIC0xMjU4LDcgKzEzMTksMTEgQEAKICAgICAgICAgICAgIGlmIChmLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgIHIudmFsdWUgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHIudmFsdWUgPSBmLnNoaWZ0KCk7CisgICAgICAgICAgICAgICAgaWYgKCFmLmlzUmV2ZXJzZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgZi5yZXZlcnNlKCk7CisgICAgICAgICAgICAgICAgICAgIGYuaXNSZXZlcnNlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHIudmFsdWUgPSBmLnBvcCgpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYgKGYgaW5zdGFuY2VvZiBPYmplY3QpIHsKICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBmKSB7CkBAIC0xMjc5LDMyICsxMzQ0LDM0IEBACiAgICAgICAgIHJldHVybiByOwogICAgIH0sCiAKLSAgICAvKiogUmV0dXJucyB0aGUgYW4gb2JqZWN0IHdpdGggYSB2YWx1ZSBwcm9wZXJ0eSBzZXQgdG8gdGhlIAorICAgIC8qKiBSZXR1cm5zIHRoZSBhbiBvYmplY3Qgd2l0aCBhIHZhbHVlIHByb3BlcnR5IHNldCB0byB0aGUKICAgICAgICAgbmV4dCB2YWx1ZSBmb3VuZCBpbiB0aGUgcHJvdG9jb2wgYnVmZmVyICovCiAgICAgcmVhZEk2NDogZnVuY3Rpb24oKSB7CiAgICAgICAgIHJldHVybiB0aGlzLnJlYWRJMzIoKTsKICAgICB9LAogCi0gICAgLyoqIFJldHVybnMgdGhlIGFuIG9iamVjdCB3aXRoIGEgdmFsdWUgcHJvcGVydHkgc2V0IHRvIHRoZSAKKyAgICAvKiogUmV0dXJucyB0aGUgYW4gb2JqZWN0IHdpdGggYSB2YWx1ZSBwcm9wZXJ0eSBzZXQgdG8gdGhlCiAgICAgICAgIG5leHQgdmFsdWUgZm91bmQgaW4gdGhlIHByb3RvY29sIGJ1ZmZlciAqLwogICAgIHJlYWREb3VibGU6IGZ1bmN0aW9uKCkgewogICAgICAgICByZXR1cm4gdGhpcy5yZWFkSTMyKCk7CiAgICAgfSwKIAotICAgIC8qKiBSZXR1cm5zIHRoZSBhbiBvYmplY3Qgd2l0aCBhIHZhbHVlIHByb3BlcnR5IHNldCB0byB0aGUgCisgICAgLyoqIFJldHVybnMgdGhlIGFuIG9iamVjdCB3aXRoIGEgdmFsdWUgcHJvcGVydHkgc2V0IHRvIHRoZQogICAgICAgICBuZXh0IHZhbHVlIGZvdW5kIGluIHRoZSBwcm90b2NvbCBidWZmZXIgKi8KICAgICByZWFkU3RyaW5nOiBmdW5jdGlvbigpIHsKICAgICAgICAgdmFyIHIgPSB0aGlzLnJlYWRJMzIoKTsKICAgICAgICAgcmV0dXJuIHI7CiAgICAgfSwKIAotICAgIC8qKiBSZXR1cm5zIHRoZSBhbiBvYmplY3Qgd2l0aCBhIHZhbHVlIHByb3BlcnR5IHNldCB0byB0aGUgCisgICAgLyoqIFJldHVybnMgdGhlIGFuIG9iamVjdCB3aXRoIGEgdmFsdWUgcHJvcGVydHkgc2V0IHRvIHRoZQogICAgICAgICBuZXh0IHZhbHVlIGZvdW5kIGluIHRoZSBwcm90b2NvbCBidWZmZXIgKi8KICAgICByZWFkQmluYXJ5OiBmdW5jdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucmVhZFN0cmluZygpOworICAgICAgICB2YXIgciA9IHRoaXMucmVhZEkzMigpOworICAgICAgICByLnZhbHVlID0gYXRvYihyLnZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHI7CiAgICAgfSwKIAotICAgIC8qKiAKKyAgICAvKioKICAgICAgKiBNZXRob2QgdG8gYXJiaXRyYXJpbHkgc2tpcCBvdmVyIGRhdGEgKi8KICAgICBza2lwOiBmdW5jdGlvbih0eXBlKSB7CiAgICAgICAgIHZhciByZXQsIGk7CkBAIC0xMzc1LDYgKzE0NDIsOSBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB0aGlzLnJlYWRMaXN0RW5kKCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb24oVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvblR5cGUuSU5WQUxJRF9EQVRBKTsKICAgICAgICAgfQogICAgIH0KIH07CkBAIC0xMzg0LDIzICsxNDU0LDIzIEBACiAgKiBJbml0aWFsaXplcyBhIE11dGlscGxleFByb3RvY29sIEltcGxlbWVudGF0aW9uIGFzIGEgV3JhcHBlciBmb3IgVGhyaWZ0LlByb3RvY29sCiAgKiBAY29uc3RydWN0b3IKICAqLwotVGhyaWZ0Lk11bHRpcGxleFByb3RvY29sID0gZnVuY3Rpb24gKHNydk5hbWUsIHRyYW5zLCBzdHJpY3RSZWFkLCBzdHJpY3RXcml0ZSkgeworVGhyaWZ0Lk11bHRpcGxleFByb3RvY29sID0gZnVuY3Rpb24oc3J2TmFtZSwgdHJhbnMsIHN0cmljdFJlYWQsIHN0cmljdFdyaXRlKSB7CiAgICAgVGhyaWZ0LlByb3RvY29sLmNhbGwodGhpcywgdHJhbnMsIHN0cmljdFJlYWQsIHN0cmljdFdyaXRlKTsKICAgICB0aGlzLnNlcnZpY2VOYW1lID0gc3J2TmFtZTsKIH07CiBUaHJpZnQuaW5oZXJpdHMoVGhyaWZ0Lk11bHRpcGxleFByb3RvY29sLCBUaHJpZnQuUHJvdG9jb2wsICdtdWx0aXBsZXhQcm90b2NvbCcpOwogCiAvKiogT3ZlcnJpZGUgd3JpdGVNZXNzYWdlQmVnaW4gbWV0aG9kIG9mIHByb3RvdHlwZSovCi1UaHJpZnQuTXVsdGlwbGV4UHJvdG9jb2wucHJvdG90eXBlLndyaXRlTWVzc2FnZUJlZ2luID0gZnVuY3Rpb24gKG5hbWUsIHR5cGUsIHNlcWlkKSB7CitUaHJpZnQuTXVsdGlwbGV4UHJvdG9jb2wucHJvdG90eXBlLndyaXRlTWVzc2FnZUJlZ2luID0gZnVuY3Rpb24obmFtZSwgdHlwZSwgc2VxaWQpIHsKIAogICAgIGlmICh0eXBlID09PSBUaHJpZnQuTWVzc2FnZVR5cGUuQ0FMTCB8fCB0eXBlID09PSBUaHJpZnQuTWVzc2FnZVR5cGUuT05FV0FZKSB7Ci0gICAgICAgIFRocmlmdC5Qcm90b2NvbC5wcm90b3R5cGUud3JpdGVNZXNzYWdlQmVnaW4uY2FsbCh0aGlzLCB0aGlzLnNlcnZpY2VOYW1lICsgIjoiICsgbmFtZSwgdHlwZSwgc2VxaWQpOworICAgICAgICBUaHJpZnQuUHJvdG9jb2wucHJvdG90eXBlLndyaXRlTWVzc2FnZUJlZ2luLmNhbGwodGhpcywgdGhpcy5zZXJ2aWNlTmFtZSArICc6JyArIG5hbWUsIHR5cGUsIHNlcWlkKTsKICAgICB9IGVsc2UgewogICAgICAgICBUaHJpZnQuUHJvdG9jb2wucHJvdG90eXBlLndyaXRlTWVzc2FnZUJlZ2luLmNhbGwodGhpcywgbmFtZSwgdHlwZSwgc2VxaWQpOwogICAgIH0KIH07CiAKLVRocmlmdC5NdWx0aXBsZXhlciA9IGZ1bmN0aW9uICgpIHsKK1RocmlmdC5NdWx0aXBsZXhlciA9IGZ1bmN0aW9uKCkgewogICAgIHRoaXMuc2VxaWQgPSAwOwogfTsKIApAQCAtMTQxNSwxMiArMTQ4NSwxMiBAQAogICogICAgdmFyIHByb3RvY29sID0gbmV3IFRocmlmdC5Qcm90b2NvbCh0cmFuc3BvcnQpOwogICogICAgdmFyIGNsaWVudCA9IG1wLmNyZWF0ZUNsaWVudCgnQXV0aFNlcnZpY2UnLCBBdXRoU2VydmljZUNsaWVudCwgdHJhbnNwb3J0KTsKICovCi1UaHJpZnQuTXVsdGlwbGV4ZXIucHJvdG90eXBlLmNyZWF0ZUNsaWVudCA9IGZ1bmN0aW9uIChzZXJ2aWNlTmFtZSwgU0NsLCB0cmFuc3BvcnQpIHsKK1RocmlmdC5NdWx0aXBsZXhlci5wcm90b3R5cGUuY3JlYXRlQ2xpZW50ID0gZnVuY3Rpb24oc2VydmljZU5hbWUsIFNDbCwgdHJhbnNwb3J0KSB7CiAgICAgaWYgKFNDbC5DbGllbnQpIHsKICAgICAgICAgU0NsID0gU0NsLkNsaWVudDsKICAgICB9CiAgICAgdmFyIHNlbGYgPSB0aGlzOwotICAgIFNDbC5wcm90b3R5cGUubmV3X3NlcWlkID0gZnVuY3Rpb24gKCkgeworICAgIFNDbC5wcm90b3R5cGUubmV3X3NlcWlkID0gZnVuY3Rpb24oKSB7CiAgICAgICAgIHNlbGYuc2VxaWQgKz0gMTsKICAgICAgICAgcmV0dXJuIHNlbGYuc2VxaWQ7CiAgICAgfTsKQEAgLTE0MzEsMyArMTUwMSw2OSBAQAogCiAKIAordmFyIGNvcHlMaXN0LCBjb3B5TWFwOworCitjb3B5TGlzdCA9IGZ1bmN0aW9uKGxzdCwgdHlwZXMpIHsKKworICBpZiAoIWxzdCkge3JldHVybiBsc3Q7IH0KKworICB2YXIgdHlwZTsKKworICBpZiAodHlwZXMuc2hpZnQgPT09IHVuZGVmaW5lZCkgeworICAgIHR5cGUgPSB0eXBlczsKKyAgfQorICBlbHNlIHsKKyAgICB0eXBlID0gdHlwZXNbMF07CisgIH0KKyAgdmFyIFR5cGUgPSB0eXBlOworCisgIHZhciBsZW4gPSBsc3QubGVuZ3RoLCByZXN1bHQgPSBbXSwgaSwgdmFsOworICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICB2YWwgPSBsc3RbaV07CisgICAgaWYgKHR5cGUgPT09IG51bGwpIHsKKyAgICAgIHJlc3VsdC5wdXNoKHZhbCk7CisgICAgfQorICAgIGVsc2UgaWYgKHR5cGUgPT09IGNvcHlNYXAgfHwgdHlwZSA9PT0gY29weUxpc3QpIHsKKyAgICAgIHJlc3VsdC5wdXNoKHR5cGUodmFsLCB0eXBlcy5zbGljZSgxKSkpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIHJlc3VsdC5wdXNoKG5ldyBUeXBlKHZhbCkpOworICAgIH0KKyAgfQorICByZXR1cm4gcmVzdWx0OworfTsKKworY29weU1hcCA9IGZ1bmN0aW9uKG9iaiwgdHlwZXMpIHsKKworICBpZiAoIW9iaikge3JldHVybiBvYmo7IH0KKworICB2YXIgdHlwZTsKKworICBpZiAodHlwZXMuc2hpZnQgPT09IHVuZGVmaW5lZCkgeworICAgIHR5cGUgPSB0eXBlczsKKyAgfQorICBlbHNlIHsKKyAgICB0eXBlID0gdHlwZXNbMF07CisgIH0KKyAgdmFyIFR5cGUgPSB0eXBlOworCisgIHZhciByZXN1bHQgPSB7fSwgdmFsOworICBmb3IgKHZhciBwcm9wIGluIG9iaikgeworICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkocHJvcCkpIHsKKyAgICAgIHZhbCA9IG9ialtwcm9wXTsKKyAgICAgIGlmICh0eXBlID09PSBudWxsKSB7CisgICAgICAgIHJlc3VsdFtwcm9wXSA9IHZhbDsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHR5cGUgPT09IGNvcHlNYXAgfHwgdHlwZSA9PT0gY29weUxpc3QpIHsKKyAgICAgICAgcmVzdWx0W3Byb3BdID0gdHlwZSh2YWwsIHR5cGVzLnNsaWNlKDEpKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICByZXN1bHRbcHJvcF0gPSBuZXcgVHlwZSh2YWwpOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gcmVzdWx0OworfTsKKworVGhyaWZ0LmNvcHlNYXAgPSBjb3B5TWFwOworVGhyaWZ0LmNvcHlMaXN0ID0gY29weUxpc3Q7CmRpZmYgLS1naXQgYS9saWIvanMvdGVzdC9idWlsZC5wcm9wZXJ0aWVzIGIvbGliL2pzL3Rlc3QvYnVpbGQucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDYzNjY4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2pzL3Rlc3QvYnVpbGQucHJvcGVydGllcwpAQCAtMCwwICsxLDUgQEAKKyMgTWF2ZW4gQW50IHRhc2tzIEphciBkZXRhaWxzCittdm4uYW50LnRhc2sudmVyc2lvbj0yLjEuMworbXZuLnJlcG89aHR0cDovL3JlcG8xLm1hdmVuLm9yZy9tYXZlbjIKK212bi5hbnQudGFzay51cmw9JHttdm4ucmVwb30vb3JnL2FwYWNoZS9tYXZlbi9tYXZlbi1hbnQtdGFza3MvJHttdm4uYW50LnRhc2sudmVyc2lvbn0KK212bi5hbnQudGFzay5qYXI9bWF2ZW4tYW50LXRhc2tzLSR7bXZuLmFudC50YXNrLnZlcnNpb259LmphcgpkaWZmIC0tZ2l0IGEvbGliL2pzL3Rlc3QvYnVpbGQueG1sIGIvbGliL2pzL3Rlc3QvYnVpbGQueG1sCmluZGV4IDc0YWMwYzQuLjA0YzEzNjAgMTAwNzU1Ci0tLSBhL2xpYi9qcy90ZXN0L2J1aWxkLnhtbAorKysgYi9saWIvanMvdGVzdC9idWlsZC54bWwKQEAgLTMxLDE3ICszMSwyMSBAQAogICA8IS0tIHRoZSByb290IGRpcmVjdG9yeSwgd2hlcmUgeW91IHVucGFjayB0aHJpZnQgZGlzdGlidXRpb24gKGUuZy4gdGhyaWZ0LTAueC54LnRhci5neikgLS0+CiAgIDxwcm9wZXJ0eSBuYW1lPSJ0aHJpZnQuZGlyIiBsb2NhdGlvbj0iLi4vLi4vLi4vIiAvPgogICA8cHJvcGVydHkgbmFtZT0idGhyaWZ0LmphdmEuZGlyIiBsb2NhdGlvbj0iJHt0aHJpZnQuZGlyfS9saWIvamF2YSIgLz4KKyAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLnRvb2xzLmRpciIgbG9jYXRpb249IiR7dGhyaWZ0LmphdmEuZGlyfS9idWlsZC90b29scy8iLz4KKyAgPHByb3BlcnR5IGZpbGU9IiR7YmFzZWRpcn0vYnVpbGQucHJvcGVydGllcyIvPgogCiAgIDwhLS0gSW5jbHVkZSB0aGUgYmFzZSBqYXZhIHByb3BlcnRpZXMgZmlsZSAtLT4KLSAgPHByb3BlcnR5IGZpbGU9IiR7dGhyaWZ0LmphdmEuZGlyfS9idWlsZC5wcm9wZXJ0aWVzIiAvPgorICA8cHJvcGVydHkgZmlsZT0iJHt0aHJpZnQuamF2YS5kaXJ9L2dyYWRsZS5wcm9wZXJ0aWVzIiAvPgogCiAgIDxwcm9wZXJ0eSBuYW1lPSJ0aHJpZnQuY29tcGlsZXIiIGxvY2F0aW9uPSIke3RocmlmdC5kaXJ9L2NvbXBpbGVyL2NwcC90aHJpZnQiIC8+CiAKICAgPHBhdGggaWQ9ImxpYnMuY2xhc3NwYXRoIj4KLSAgICA8ZmlsZXNldCBkaXI9IiR7dGhyaWZ0LmphdmEuZGlyfS9idWlsZC8iPgotICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiIC8+CisgICAgPGZpbGVzZXQgZGlyPSIke3RocmlmdC5qYXZhLmRpcn0vYnVpbGQvbGlicyI+CisgICAgICA8aW5jbHVkZSBuYW1lPSJsaWJ0aHJpZnQqLmphciIgLz4KKyAgICAgIDxleGNsdWRlIG5hbWU9ImxpYnRocmlmdCpqYXZhZG9jLmphciIgLz4KKyAgICAgIDxleGNsdWRlIG5hbWU9ImxpYnRocmlmdCpzb3VyY2VzLmphciIgLz4KICAgICA8L2ZpbGVzZXQ+Ci0gICAgPGZpbGVzZXQgZGlyPSIke3RocmlmdC5qYXZhLmRpcn0vYnVpbGQvbGliIj4KKyAgICA8ZmlsZXNldCBkaXI9IiR7dGhyaWZ0LmphdmEuZGlyfS9idWlsZC9kZXBzIj4KICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIiAvPgogICAgIDwvZmlsZXNldD4KICAgICA8ZmlsZXNldCBkaXI9IiR7YnVpbGR9L2xpYiI+CkBAIC01OSwxNSArNjMsMTYgQEAKICAgICAgIDxjb25kaXRpb24+CiAgICAgICAgIDxub3Q+CiAgICAgICAgICAgPHJlc291cmNlY291bnQgY291bnQ9IjIiPgotICAgICAgICAgICAgPGZpbGVzZXQgaWQ9ImZzIiBkaXI9IiR7dGhyaWZ0LmphdmEuZGlyfS9idWlsZCI+CisgICAgICAgICAgICA8ZmlsZXNldCBpZD0iZnMiIGRpcj0iJHt0aHJpZnQuamF2YS5kaXJ9L2J1aWxkL2xpYnMiPgogICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJsaWJ0aHJpZnQqLmphciIgLz4KICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ibGlidGhyaWZ0KmphdmFkb2MuamFyIiAvPgorICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJsaWJ0aHJpZnQqc291cmNlcy5qYXIiIC8+CiAgICAgICAgICAgICA8L2ZpbGVzZXQ+CiAgICAgICAgICAgPC9yZXNvdXJjZWNvdW50PgogICAgICAgICA8L25vdD4KICAgICAgIDwvY29uZGl0aW9uPgogICAgICAgWW91IG5lZWQgbGlidGhyaWZ0Ki5qYXIgYW5kIGxpYnRocmlmdCp0ZXN0LmphciBsb2NhdGVkIGF0Ci0gICAgICAke3RocmlmdC5qYXZhLmRpcn0vYnVpbGQKKyAgICAgICR7dGhyaWZ0LmphdmEuZGlyfS9idWlsZC9saWJzCiAgICAgICBEaWQgeW91IGNvbXBpbGUgVGhyaWZ0IEphdmEgbGlicmFyeSBhbmQgaXRzIHRlc3Qgc3VpdGUgYnkgImFudCBjb21waWxlLXRlc3QiPwogICAgIDwvZmFpbD4KICAgICA8ZmFpbD4KQEAgLTg0LDYgKzg5LDcgQEAKIAogICA8dGFyZ2V0IG5hbWU9ImluaXQiIGRlcGVuZHM9ImRlcGVuZGVuY2llcyI+CiAgICAgPHRzdGFtcCAvPgorICAgIDxta2RpciBkaXI9IiR7YnVpbGQudG9vbHMuZGlyfSIvPgogICAgIDxta2RpciBkaXI9IiR7YnVpbGR9Ii8+CiAgICAgPG1rZGlyIGRpcj0iJHtidWlsZH0vanMvbGliIi8+CiAgICAgPG1rZGlyIGRpcj0iJHtidWlsZH0vbGliIi8+CkBAIC05MiwyMSArOTgsMTkgQEAKICAgICA8bWtkaXIgZGlyPSIke2J1aWxkfS90ZXN0L2xvZyIvPgogICA8L3RhcmdldD4KIAotICA8dGFyZ2V0IG5hbWU9ImpzbGlicyIgZGVwZW5kcz0iaW5pdCwgcHJveHkiPgotICAgIDxnZXQgc3JjPSJodHRwOi8vY29kZS5qcXVlcnkuY29tL2pxdWVyeS0xLjcuMi5qcyIgZGVzdD0iJHtidWlsZH0vanMvbGliL2pxdWVyeS0xLjcuMi5qcyIgdXNldGltZXN0YW1wPSJ0cnVlIi8+Ci0gICAgPGdldCBzcmM9Imh0dHA6Ly9qcy10ZXN0LWRyaXZlci5nb29nbGVjb2RlLmNvbS9zdm4vdHJ1bmsvSnNUZXN0RHJpdmVyL2NvbnRyaWIvcXVuaXQvc3JjL2VxdWl2LmpzIiBkZXN0PSIke2J1aWxkfS9qcy9saWIvZXF1aXYuanMiIHVzZXRpbWVzdGFtcD0idHJ1ZSIvPgotICAgIDxnZXQgc3JjPSJodHRwOi8vanMtdGVzdC1kcml2ZXIuZ29vZ2xlY29kZS5jb20vc3ZuL3RydW5rL0pzVGVzdERyaXZlci9jb250cmliL3F1bml0L3NyYy9RVW5pdEFkYXB0ZXIuanMiIGRlc3Q9IiR7YnVpbGR9L2pzL2xpYi9RVW5pdEFkYXB0ZXIuanMiIHVzZXRpbWVzdGFtcD0idHJ1ZSIvPgorICA8dGFyZ2V0IG5hbWU9ImRvd25sb2FkX2pzbGlicyI+CisgICAgPGdldCBzcmM9Imh0dHA6Ly9jb2RlLmpxdWVyeS5jb20vanF1ZXJ5LTEuMTEuMy5taW4uanMiIGRlc3Q9IiR7YnVpbGR9L2pzL2xpYi9qcXVlcnkuanMiIHVzZXRpbWVzdGFtcD0idHJ1ZSIvPgorICAgIDxnZXQgc3JjPSJodHRwOi8vY29kZS5qcXVlcnkuY29tL3F1bml0L3F1bml0LTIuNi4yLmpzIiBkZXN0PSIke2J1aWxkfS9qcy9saWIvcXVuaXQuanMiIHVzZXRpbWVzdGFtcD0idHJ1ZSIvPgorICAgIDxnZXQgc3JjPSJodHRwOi8vY29kZS5qcXVlcnkuY29tL3F1bml0L3F1bml0LTIuNi4yLmNzcyIgZGVzdD0iJHtidWlsZH0vanMvbGliL3F1bml0LmNzcyIgdXNldGltZXN0YW1wPSJ0cnVlIi8+CisgIDwvdGFyZ2V0PgogCi0gICAgPGdldCBzcmM9Imh0dHA6Ly9jb2RlLmpxdWVyeS5jb20vcXVuaXQvcXVuaXQtMS41LjAuanMiIGRlc3Q9IiR7YnVpbGR9L2pzL2xpYi9xdW5pdC5qcyIgdXNldGltZXN0YW1wPSJ0cnVlIi8+Ci0gICAgPGdldCBzcmM9Imh0dHA6Ly9jb2RlLmpxdWVyeS5jb20vcXVuaXQvcXVuaXQtMS41LjAuY3NzIiBkZXN0PSIke2J1aWxkfS9qcy9saWIvcXVuaXQuY3NzIiB1c2V0aW1lc3RhbXA9InRydWUiLz4KLSAgICA8IS0tIGpzLXRlc3QtZHJpdmVyIGhhcyBpc3N1ZXMgd2l0aCByZWxhdGl2ZSBwYXRoLi4uc28gd2UgbmVlZCBhIGNvcHkgLS0+Ci0gICAgPGNvcHkgZmlsZT0iLi4vc3JjL3RocmlmdC5qcyIgdG9kaXI9IiR7YnVpbGR9L2pzL3RocmlmdC5qcyIvPgorICA8dGFyZ2V0IG5hbWU9ImpzbGlicyIgZGVwZW5kcz0iaW5pdCwgcHJveHksIGRvd25sb2FkX2pzbGlicyI+CiAgIDwvdGFyZ2V0PgogCiAgIDx0YXJnZXQgbmFtZT0iY29tcGlsZSIgZGVzY3JpcHRpb249ImNvbXBpbGUgdGhlIHRlc3Qgc3VpdGUiIGRlcGVuZHM9ImluaXQsIGdlbmVyYXRlLCByZXNvbHZlIj4KICAgICA8IS0tIC8vVE9ETyBlbmFibGUgPGNvbXBpbGVyYXJnIHZhbHVlPSItWGxpbnQiLz4tLT4KLSAgICA8amF2YWMgaW5jbHVkZWFudHJ1bnRpbWU9ImZhbHNlIiBzcmNkaXI9IiR7Z2VuamF2YX0iIGRlc3RkaXI9IiR7YnVpbGR9L3Rlc3QiIGNsYXNzcGF0aHJlZj0ibGlicy5jbGFzc3BhdGgiLz4KLSAgICA8amF2YWMgaW5jbHVkZWFudHJ1bnRpbWU9ImZhbHNlIiBzcmNkaXI9IiR7c3JjfSIgZGVzdGRpcj0iJHtidWlsZH0vdGVzdCIgY2xhc3NwYXRocmVmPSJsaWJzLmNsYXNzcGF0aCIvPgorICAgIDxqYXZhYyBjb21waWxlcj0ibW9kZXJuIiBpbmNsdWRlYW50cnVudGltZT0iZmFsc2UiIHNyY2Rpcj0iJHtnZW5qYXZhfSIgZGVzdGRpcj0iJHtidWlsZH0vdGVzdCIgY2xhc3NwYXRocmVmPSJsaWJzLmNsYXNzcGF0aCIvPgorICAgIDxqYXZhYyBjb21waWxlcj0ibW9kZXJuIiBpbmNsdWRlYW50cnVudGltZT0iZmFsc2UiIHNyY2Rpcj0iJHtzcmN9IiBkZXN0ZGlyPSIke2J1aWxkfS90ZXN0IiBjbGFzc3BhdGhyZWY9ImxpYnMuY2xhc3NwYXRoIi8+CiAgIDwvdGFyZ2V0PgogCiAgIDx0YXJnZXQgbmFtZT0ianN0ZXN0IiBkZXNjcmlwdGlvbj0iY3JlYXRlIHRoZSB0ZXN0IHN1aXRlIGphciBmaWxlIiBkZXBlbmRzPSJjb21waWxlIj4KQEAgLTE1OSw0MSArMTYzLDYgQEAKICAgICA8L3BhcmFsbGVsPgogICA8L3RhcmdldD4KIAotICA8dGFyZ2V0IG5hbWU9ImpzdGVzdGRyaXZlci1zZXJ2ZXIiIGRlc2NyaXB0aW9uPSJzdGFydCB0aGUganMtdGVzdC1kcml2ZXIgc2VydmVyIiBkZXBlbmRzPSJpbml0LCByZXNvbHZlIj4KLSAgICA8ZWNobz5TdGFydGluZyBqcy10ZXN0LWRyaXZlciBTZXJ2ZXIuLi48L2VjaG8+Ci0gICAgPGphdmEgamFyPSIke2J1aWxkfS9saWIvanN0ZXN0ZHJpdmVyLTEuMy4yLmphciIgZGlyPSIuIiBmb3JrPSJ0cnVlIgotICAgICAgICAgICAgZmFpbG9uZXJyb3I9InRydWUiIG91dHB1dD0iJHtidWlsZH0vbG9nL2pzdGVzdGRyaXZlci1zZXJ2ZXIubG9nIj4KLSAgICAgIDxhcmcgbGluZT0iLS1wb3J0IDk4NzYiLz4KLSAgICA8L2phdmE+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0ianN0ZXN0ZHJpdmVyIiBkZXNjcmlwdGlvbj0iZG8gdW5pdCB0ZXN0cyB3aXRoIGpzLXRlc3QtZHJpdmVyIiBkZXBlbmRzPSJpbml0LCBqc3Rlc3QsIGpzbGlicyI+Ci0gICAgPHBhcmFsbGVsPgotICAgICAgPGphdmEgY2xhc3NuYW1lPSJ0ZXN0Lkh0dHBkIiBmb3JrPSJ0cnVlIiB0aW1lb3V0PSIxMDAwMCIKLSAgICAgICAgY2xhc3NwYXRocmVmPSJ0ZXN0LmNsYXNzcGF0aCIgZmFpbG9uZXJyb3I9ImZhbHNlIiBvdXRwdXQ9IiR7YnVpbGR9L2xvZy91bml0dGVzdC5sb2ciPgotICAgICAgICA8YXJnIHZhbHVlPSIuLi8iIC8+Ci0gICAgICA8L2phdmE+Ci0gICAgICA8c2VxdWVudGlhbD4KLSAgICAgICAgPHNsZWVwIHNlY29uZHM9IjIiLz4KLSAgICAgICAgPGVjaG8+UnVubmluZyBVbml0IFRlc3RzIHdpdGgganMtdGVzdC1kcml2ZXI8L2VjaG8+Ci0gICAgICAgICAgPGphdmEgamFyPSIke2J1aWxkfS9saWIvanN0ZXN0ZHJpdmVyLTEuMy4yLmphciIgZGlyPSIuIiBmb3JrPSJ0cnVlIiAKLSAgICAgICAgICAgIGZhaWxvbmVycm9yPSJ0cnVlIiBvdXRwdXQ9IiR7YnVpbGR9L2xvZy9qc3Rlc3Rkcml2ZXIubG9nIj4KLSAgICAgICAgICAgIDxhcmcgdmFsdWU9Ii0tY29uZmlnIiAvPgotICAgICAgICAgICAgPGFyZyB2YWx1ZT0ianNUZXN0RHJpdmVyLmNvbmYiIC8+Ci0KLSAgICAgICAgICAgIDxhcmcgdmFsdWU9Ii0tcmVzZXQiIC8+Ci0gICAgICAgICAgICA8YXJnIHZhbHVlPSItLXZlcmJvc2UiIC8+Ci0KLSAgICAgICAgICAgIDxhcmcgdmFsdWU9Ii0tdGVzdHMiIC8+Ci0gICAgICAgICAgICA8YXJnIHZhbHVlPSJhbGwiIC8+Ci0KLSAgICAgICAgICAgIDxhcmcgdmFsdWU9Ii0tdGVzdE91dHB1dCIgLz4KLSAgICAgICAgICAgIDxhcmcgdmFsdWU9IiR7YnVpbGR9L3Rlc3QvbG9nLyIgLz4KLSAgICAgICAgPC9qYXZhPgotICAgICAgPC9zZXF1ZW50aWFsPgotICAgIDwvcGFyYWxsZWw+Ci0gIDwvdGFyZ2V0PgotCiAgIDx0YXJnZXQgbmFtZT0iZ2VuZXJhdGUiPgogICAgIDxleGVjIGV4ZWN1dGFibGU9IiR7dGhyaWZ0LmNvbXBpbGVyfSIgZmFpbG9uZXJyb3I9InRydWUiPgogICAgICAgPGFyZyBsaW5lPSItLWdlbiBqYXZhICR7dGhyaWZ0LmRpcn0vdGVzdC9UaHJpZnRUZXN0LnRocmlmdCIgLz4KQEAgLTIwMSw2ICsxNzAsOSBAQAogICAgIDxleGVjIGV4ZWN1dGFibGU9IiR7dGhyaWZ0LmNvbXBpbGVyfSIgZmFpbG9uZXJyb3I9InRydWUiPgogICAgICAgPGFyZyBsaW5lPSItLWdlbiBqczpqcXVlcnkgJHt0aHJpZnQuZGlyfS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0IiAvPgogICAgIDwvZXhlYz4KKyAgICA8ZXhlYyBleGVjdXRhYmxlPSIke3RocmlmdC5jb21waWxlcn0iIGZhaWxvbmVycm9yPSJ0cnVlIj4KKyAgICAgIDxhcmcgbGluZT0iLS1nZW4ganM6anF1ZXJ5ICR7dGhyaWZ0LmRpcn0vdGVzdC9Eb3VibGVDb25zdGFudHNUZXN0LnRocmlmdCIgLz4KKyAgICA8L2V4ZWM+CiAgIDwvdGFyZ2V0PgogCiAgIDx0YXJnZXQgbmFtZT0idGVzdCIgZGVzY3JpcHRpb249InJ1biB0ZXN0IHN1aXRlIChsaW50LCB1bml0dGVzdCkiIGRlcGVuZHM9ImxpbnQsIHVuaXR0ZXN0Ii8+CkBAIC0yNDcsMTYgKzIxOSwyMyBAQAogICAgIDxkZWxldGUgZGlyPSIke2dlbmpzfSIgLz4KICAgPC90YXJnZXQ+CiAKLSAgPHRhcmdldCBuYW1lPSJyZXNvbHZlIiB1bmxlc3M9Im12bi5maW5pc2hlZCI+CisgIDx0YXJnZXQgbmFtZT0ibXZuLmFudC50YXNrcy5kb3dubG9hZCIgZGVwZW5kcz0iaW5pdCxtdm4uYW50LnRhc2tzLmNoZWNrIiB1bmxlc3M9Im12bi5hbnQudGFza3MuZm91bmQiPgorICAgIDxnZXQgc3JjPSIke212bi5hbnQudGFzay51cmx9LyR7bXZuLmFudC50YXNrLmphcn0iIGRlc3Q9IiR7YnVpbGQudG9vbHMuZGlyfS8ke212bi5hbnQudGFzay5qYXJ9IiB1c2V0aW1lc3RhbXA9InRydWUiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJtdm4uYW50LnRhc2tzLmNoZWNrIj4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJtdm4uYW50LnRhc2tzLmZvdW5kIj4KKyAgICAgIDx0eXBlZm91bmQgdXJpPSJhbnRsaWI6b3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5hbnQiIG5hbWU9ImFydGlmYWN0Ii8+CisgICAgPC9jb25kaXRpb24+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0icmVzb2x2ZSIgZGVwZW5kcz0ibXZuLmFudC50YXNrcy5kb3dubG9hZCIgdW5sZXNzPSJtdm4uZmluaXNoZWQiPgogICAgIDx0eXBlZGVmIHVyaT0iYW50bGliOm9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuYW50IiBjbGFzc3BhdGg9IiR7dGhyaWZ0LmphdmEuZGlyfS9idWlsZC90b29scy8ke212bi5hbnQudGFzay5qYXJ9Ii8+CiAKICAgICA8YXJ0aWZhY3Q6ZGVwZW5kZW5jaWVzIGZpbGVzZXRJZD0ianMudGVzdC5kZXBlbmRlbmN5LmphcnMiPgogICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLmFwYWNoZS5odHRwY29tcG9uZW50cyIgYXJ0aWZhY3RJZD0iaHR0cGNsaWVudCIgdmVyc2lvbj0iNC4wLjEiLz4KICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9ImNvbS5nb29nbGVjb2RlLmpzbGludDRqYXZhIiBhcnRpZmFjdElkPSJqc2xpbnQ0amF2YS1hbnQiIHZlcnNpb249IjEuNC42Ii8+CiAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJldS5tZWRzZWEubWltZXV0aWwiIGFydGlmYWN0SWQ9Im1pbWUtdXRpbCIgdmVyc2lvbj0iMi4xLjMiLz4KLSAgICAgIDwhLS0gZ2V0IGpzdGVzdGRyaXZlci5qYXIgdmlhIG1hdmVuLS0+Ci0gICAgICA8cmVtb3RlUmVwb3NpdG9yeSBpZD0ianN0ZC1tYXZlbi1wbHVnaW4gZ29vZ2xlIGNvZGUgcmVwbyIgdXJsPSJodHRwOi8vanN0ZC1tYXZlbi1wbHVnaW4uZ29vZ2xlY29kZS5jb20vc3ZuL21hdmVuMiIvPgotICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0iY29tLmdvb2dsZS5qc3Rlc3Rkcml2ZXIiIGFydGlmYWN0SWQ9Im1hdmVuLWpzdGVzdGRyaXZlci1wbHVnaW4iIHZlcnNpb249IjEuMy4yLjMiLz4KICAgICA8L2FydGlmYWN0OmRlcGVuZGVuY2llcz4KIAogICAgIDwhLS0gQ29weSB0aGUgZGVwZW5kZW5jaWVzIHRvIHRoZSBidWlsZC9saWIgZGlyIC0tPgpAQCAtMjY0LDggKzI0Myw3IEBACiAgICAgICA8ZmlsZXNldCByZWZpZD0ianMudGVzdC5kZXBlbmRlbmN5LmphcnMiLz4KICAgICAgIDxtYXBwZXIgdHlwZT0iZmxhdHRlbiIvPgogICAgIDwvY29weT4KLSAgICAKKwogICAgIDxwcm9wZXJ0eSBuYW1lPSJtdm4uZmluaXNoZWQiIHZhbHVlPSJ0cnVlIi8+CiAgIDwvdGFyZ2V0PgogPC9wcm9qZWN0PgotCmRpZmYgLS1naXQgYS9saWIvanMvdGVzdC9kZWVwLWNvbnN0cnVjdG9yLnRlc3QuanMgYi9saWIvanMvdGVzdC9kZWVwLWNvbnN0cnVjdG9yLnRlc3QuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJkM2ExZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qcy90ZXN0L2RlZXAtY29uc3RydWN0b3IudGVzdC5qcwpAQCAtMCwwICsxLDIxMyBAQAorZnVuY3Rpb24gc2VyaWFsaXplKGRhdGEpIHsKKyAgY29uc3QgdHJhbnNwb3J0ID0gbmV3IFRocmlmdC5UcmFuc3BvcnQoJy9zZXJ2aWNlJyk7CisgIGNvbnN0IHByb3RvY29sID0gbmV3IFRocmlmdC5Qcm90b2NvbCh0cmFuc3BvcnQpOworICBwcm90b2NvbC53cml0ZU1lc3NhZ2VCZWdpbignJywgMCwgMCk7CisgIGRhdGEud3JpdGUocHJvdG9jb2wpOworICBwcm90b2NvbC53cml0ZU1lc3NhZ2VFbmQoKTsKKyAgcmV0dXJuIHRyYW5zcG9ydC5zZW5kX2J1ZjsKK30KKworZnVuY3Rpb24gZGVzZXJpYWxpemUoc2VyaWFsaXplZCwgdHlwZSkgeworICBjb25zdCB0cmFuc3BvcnQgPSBuZXcgVGhyaWZ0LlRyYW5zcG9ydCgnL3NlcnZpY2UnKTsKKyAgdHJhbnNwb3J0LnNldFJlY3ZCdWZmZXIoc2VyaWFsaXplZCk7CisgIGNvbnN0IHByb3RvY29sID0gbmV3IFRocmlmdC5Qcm90b2NvbCh0cmFuc3BvcnQpOworICBwcm90b2NvbC5yZWFkTWVzc2FnZUJlZ2luKCk7CisgIGNvbnN0IGRhdGEgPSBuZXcgdHlwZSgpOworICBkYXRhLnJlYWQocHJvdG9jb2wpOworICBwcm90b2NvbC5yZWFkTWVzc2FnZUVuZCgpOworICByZXR1cm4gZGF0YTsKK30KKworCitmdW5jdGlvbiBjcmVhdGVUaHJpZnRPYmooKSB7CisKKyAgcmV0dXJuIG5ldyBDb21wbGV4KHsKKworICAgIHN0cnVjdF9maWVsZDogbmV3IFNpbXBsZSh7dmFsdWU6ICdhJ30pLAorCisgICAgc3RydWN0X2xpc3RfZmllbGQ6IFsKKyAgICAgIG5ldyBTaW1wbGUoe3ZhbHVlOiAnYid9KSwKKyAgICAgIG5ldyBTaW1wbGUoe3ZhbHVlOiAnYyd9KQorICAgIF0sCisKKyAgICBzdHJ1Y3Rfc2V0X2ZpZWxkOiBbCisgICAgICBuZXcgU2ltcGxlKHt2YWx1ZTogJ2QnfSksCisgICAgICBuZXcgU2ltcGxlKHt2YWx1ZTogJ2UnfSkKKyAgICBdLAorCisgICAgc3RydWN0X21hcF9maWVsZDogeworICAgICAgQTogbmV3IFNpbXBsZSh7dmFsdWU6ICdmJ30pLAorICAgICAgQjogbmV3IFNpbXBsZSh7dmFsdWU6ICdnJ30pCisgICAgfSwKKworICAgIHN0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19maWVsZDogWworICAgICAgWworICAgICAgICB7CisgICAgICAgICAgQzogWworICAgICAgICAgICAgbmV3IFNpbXBsZSh7dmFsdWU6ICdoJ30pLAorICAgICAgICAgICAgbmV3IFNpbXBsZSh7dmFsdWU6ICdpJ30pCisgICAgICAgICAgXQorICAgICAgICB9CisgICAgICBdCisgICAgXSwKKworCisgICAgc3RydWN0X25lc3RlZF9jb250YWluZXJzX2ZpZWxkMjogeworICAgICAgRDogWworICAgICAgICB7CisgICAgICAgICAgREE6IG5ldyBTaW1wbGUoe3ZhbHVlOiAnaid9KQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgREI6IG5ldyBTaW1wbGUoe3ZhbHVlOiAnayd9KQorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKworICAgIGxpc3Rfb2ZfbGlzdF9maWVsZDogWworICAgICAgIFsnb25lJywgJ3R3byddLAorICAgICAgIFsndGhyZWUnLCAnZm91ciddLAorICAgICAgIFsnZml2ZScsICdzaXgnXQorICAgIF0KKyAgfQorICApOworfQorCisKK2Z1bmN0aW9uIGNyZWF0ZUpzT2JqKCkgeworCisgIHJldHVybiB7CisKKyAgICBzdHJ1Y3RfZmllbGQ6IHt2YWx1ZTogJ2EnfSwKKworICAgIHN0cnVjdF9saXN0X2ZpZWxkOiBbCisgICAgICB7dmFsdWU6ICdiJ30sCisgICAgICB7dmFsdWU6ICdjJ30KKyAgICBdLAorCisgICAgc3RydWN0X3NldF9maWVsZDogWworICAgICAge3ZhbHVlOiAnZCd9LAorICAgICAge3ZhbHVlOiAnZSd9CisgICAgXSwKKworICAgIHN0cnVjdF9tYXBfZmllbGQ6IHsKKyAgICAgIEE6IHt2YWx1ZTogJ2YnfSwKKyAgICAgIEI6IHt2YWx1ZTogJ2cnfQorICAgIH0sCisKKyAgICBzdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGQ6IFsKKyAgICAgIFsKKyAgICAgICAgeworICAgICAgICAgIEM6IFsKKyAgICAgICAgICAgIHt2YWx1ZTogJ2gnfSwKKyAgICAgICAgICAgIHt2YWx1ZTogJ2knfQorICAgICAgICAgIF0KKyAgICAgICAgfQorICAgICAgXQorICAgIF0sCisKKyAgICBzdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGQyOiB7CisgICAgICBEOiBbCisgICAgICAgIHsKKyAgICAgICAgICBEQToge3ZhbHVlOiAnaid9CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICBEQjoge3ZhbHVlOiAnayd9CisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorCisgICAgbGlzdF9vZl9saXN0X2ZpZWxkOiBbCisgICAgICBbJ29uZScsICd0d28nXSwKKyAgICAgIFsndGhyZWUnLCAnZm91ciddLAorICAgICAgWydmaXZlJywgJ3NpeCddCisgICBdCisgIH07Cit9CisKKworZnVuY3Rpb24gYXNzZXJ0VmFsdWVzKG9iaiwgYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmVxdWFsKG9iai5zdHJ1Y3RfZmllbGQudmFsdWUsICdhJyk7CisgICAgYXNzZXJ0LmVxdWFsKG9iai5zdHJ1Y3RfbGlzdF9maWVsZFswXS52YWx1ZSwgJ2InKTsKKyAgICBhc3NlcnQuZXF1YWwob2JqLnN0cnVjdF9saXN0X2ZpZWxkWzFdLnZhbHVlLCAnYycpOworICAgIGFzc2VydC5lcXVhbChvYmouc3RydWN0X3NldF9maWVsZFswXS52YWx1ZSwgJ2QnKTsKKyAgICBhc3NlcnQuZXF1YWwob2JqLnN0cnVjdF9zZXRfZmllbGRbMV0udmFsdWUsICdlJyk7CisgICAgYXNzZXJ0LmVxdWFsKG9iai5zdHJ1Y3RfbWFwX2ZpZWxkLkEudmFsdWUsICdmJyk7CisgICAgYXNzZXJ0LmVxdWFsKG9iai5zdHJ1Y3RfbWFwX2ZpZWxkLkIudmFsdWUsICdnJyk7CisgICAgYXNzZXJ0LmVxdWFsKG9iai5zdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGRbMF1bMF0uQ1swXS52YWx1ZSwgJ2gnKTsKKyAgICBhc3NlcnQuZXF1YWwob2JqLnN0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19maWVsZFswXVswXS5DWzFdLnZhbHVlLCAnaScpOworICAgIGFzc2VydC5lcXVhbChvYmouc3RydWN0X25lc3RlZF9jb250YWluZXJzX2ZpZWxkMi5EWzBdLkRBLnZhbHVlLCAnaicpOworICAgIGFzc2VydC5lcXVhbChvYmouc3RydWN0X25lc3RlZF9jb250YWluZXJzX2ZpZWxkMi5EWzFdLkRCLnZhbHVlLCAnaycpOworICAgIGFzc2VydC5lcXVhbChvYmoubGlzdF9vZl9saXN0X2ZpZWxkWzBdWzBdLCAnb25lJyk7CisgICAgYXNzZXJ0LmVxdWFsKG9iai5saXN0X29mX2xpc3RfZmllbGRbMF1bMV0sICd0d28nKTsKKyAgICBhc3NlcnQuZXF1YWwob2JqLmxpc3Rfb2ZfbGlzdF9maWVsZFsxXVswXSwgJ3RocmVlJyk7CisgICAgYXNzZXJ0LmVxdWFsKG9iai5saXN0X29mX2xpc3RfZmllbGRbMV1bMV0sICdmb3VyJyk7CisgICAgYXNzZXJ0LmVxdWFsKG9iai5saXN0X29mX2xpc3RfZmllbGRbMl1bMF0sICdmaXZlJyk7CisgICAgYXNzZXJ0LmVxdWFsKG9iai5saXN0X29mX2xpc3RfZmllbGRbMl1bMV0sICdzaXgnKTsKK30KKworY29uc3QgY2FzZXMgPSB7CisKKyAgJ1NlcmlhbGl6ZS9kZXNlcmlhbGl6ZSBzaW1wbGUgc3RydWN0IHNob3VsZCByZXR1cm4gZXF1YWwgb2JqZWN0JzogZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgY29uc3QgdE9iaiA9IG5ldyBTaW1wbGUoe3ZhbHVlOiAnYSd9KTsKKyAgICBjb25zdCByZWNlaXZlZCA9IGRlc2VyaWFsaXplKHNlcmlhbGl6ZSh0T2JqKSwgU2ltcGxlKTsKKyAgICBhc3NlcnQub2sodE9iaiAhPT0gcmVjZWl2ZWQpOworICAgIGFzc2VydC5kZWVwRXF1YWwocmVjZWl2ZWQsIHRPYmopOworICB9LAorCisKKyAgJ1NlcmlhbGl6ZS9kZXNlcmlhbGl6ZSBzaG91bGQgcmV0dXJuIGVxdWFsIG9iamVjdCc6IGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGNvbnN0IHRPYmogPSBjcmVhdGVUaHJpZnRPYmooKTsKKyAgICBjb25zdCByZWNlaXZlZCA9IGRlc2VyaWFsaXplKHNlcmlhbGl6ZSh0T2JqKSwgQ29tcGxleCk7CisgICAgYXNzZXJ0Lm9rKHRPYmogIT09IHJlY2VpdmVkKTsKKyAgICBhc3NlcnQuZGVlcEVxdWFsKHJlY2VpdmVkLCB0T2JqKTsKKyAgfSwKKworICAnTmVzdGVkIHN0cnVjdHMgYW5kIGNvbnRhaW5lcnMgaW5pdGlhbGl6ZWQgZnJvbSBwbGFpbiBqcyBvYmplY3RzIHNob3VsZCBzZXJpYWxpemUgc2FtZSBhcyBpZiBpbml0aWFsaXplZCBmcm9tIHRocmlmdCBvYmplY3RzJzogZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgY29uc3QgdE9iajEgPSBjcmVhdGVUaHJpZnRPYmooKTsKKyAgICBjb25zdCB0T2JqMiA9IG5ldyBDb21wbGV4KGNyZWF0ZUpzT2JqKCkpOworICAgIGFzc2VydFZhbHVlcyh0T2JqMiwgYXNzZXJ0KTsKKyAgICBhc3NlcnQuZXF1YWwoc2VyaWFsaXplKHRPYmoyKSwgc2VyaWFsaXplKHRPYmoxKSk7CisgIH0sCisKKyAgJ01vZGlmaWNhdGlvbnMgdG8gYXJncyBvYmplY3Qgc2hvdWxkIG5vdCBhZmZlY3QgY29uc3RydWN0ZWQgVGhyaWZ0IG9iamVjdCc6IGZ1bmN0aW9uKGFzc2VydCkgeworCisgICAgY29uc3QgYXJncyA9IGNyZWF0ZUpzT2JqKCk7CisgICAgYXNzZXJ0VmFsdWVzKGFyZ3MsIGFzc2VydCk7CisKKyAgICBjb25zdCB0T2JqID0gbmV3IENvbXBsZXgoYXJncyk7CisgICAgYXNzZXJ0VmFsdWVzKHRPYmosIGFzc2VydCk7CisKKyAgICBhcmdzLnN0cnVjdF9maWVsZC52YWx1ZSA9ICdaWlonOworICAgIGFyZ3Muc3RydWN0X2xpc3RfZmllbGRbMF0udmFsdWUgPSAnWlpaJzsKKyAgICBhcmdzLnN0cnVjdF9saXN0X2ZpZWxkWzFdLnZhbHVlID0gJ1paWic7CisgICAgYXJncy5zdHJ1Y3Rfc2V0X2ZpZWxkWzBdLnZhbHVlID0gJ1paWic7CisgICAgYXJncy5zdHJ1Y3Rfc2V0X2ZpZWxkWzFdLnZhbHVlID0gJ1paWic7CisgICAgYXJncy5zdHJ1Y3RfbWFwX2ZpZWxkLkEudmFsdWUgPSAnWlpaJzsKKyAgICBhcmdzLnN0cnVjdF9tYXBfZmllbGQuQi52YWx1ZSA9ICdaWlonOworICAgIGFyZ3Muc3RydWN0X25lc3RlZF9jb250YWluZXJzX2ZpZWxkWzBdWzBdLkNbMF0gPSAnWlpaJzsKKyAgICBhcmdzLnN0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19maWVsZFswXVswXS5DWzFdID0gJ1paWic7CisgICAgYXJncy5zdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGQyLkRbMF0uREEgPSAnWlpaJzsKKyAgICBhcmdzLnN0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19maWVsZDIuRFswXS5EQiA9ICdaWlonOworCisgICAgYXNzZXJ0VmFsdWVzKHRPYmosIGFzc2VydCk7CisgIH0sCisKKyAgJ251bGxzIGFyZSBvayc6IGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGNvbnN0IHRPYmogPSBuZXcgQ29tcGxleCh7CisgICAgICBzdHJ1Y3RfZmllbGQ6IG51bGwsCisgICAgICBzdHJ1Y3RfbGlzdF9maWVsZDogbnVsbCwKKyAgICAgIHN0cnVjdF9zZXRfZmllbGQ6IG51bGwsCisgICAgICBzdHJ1Y3RfbWFwX2ZpZWxkOiBudWxsLAorICAgICAgc3RydWN0X25lc3RlZF9jb250YWluZXJzX2ZpZWxkOiBudWxsLAorICAgICAgc3RydWN0X25lc3RlZF9jb250YWluZXJzX2ZpZWxkMjogbnVsbAorICAgIH0pOworICAgIGNvbnN0IHJlY2VpdmVkID0gZGVzZXJpYWxpemUoc2VyaWFsaXplKHRPYmopLCBDb21wbGV4KTsKKyAgICBhc3NlcnQub2sodE9iaiAhPT0gcmVjZWl2ZWQpOworICAgIGFzc2VydC5kZWVwRXF1YWwodE9iaiwgcmVjZWl2ZWQpOworICB9CisKK307CisKK09iamVjdC5rZXlzKGNhc2VzKS5mb3JFYWNoKGZ1bmN0aW9uKGNhc2VOYW1lKSB7CisgIFFVbml0LnRlc3QoY2FzZU5hbWUsIGNhc2VzW2Nhc2VOYW1lXSk7Cit9KTsKZGlmZiAtLWdpdCBhL2xpYi9qcy90ZXN0L2pzVGVzdERyaXZlci5jb25mIGIvbGliL2pzL3Rlc3QvanNUZXN0RHJpdmVyLmNvbmYKaW5kZXggMjJlNjJlYS4uZWIxNTg4YyAxMDA3NTUKLS0tIGEvbGliL2pzL3Rlc3QvanNUZXN0RHJpdmVyLmNvbmYKKysrIGIvbGliL2pzL3Rlc3QvanNUZXN0RHJpdmVyLmNvbmYKQEAgLTUsOCArNSw5IEBACiAgIC0gYnVpbGQvanMvbGliL2VxdWl2LmpzCiAgIC0gYnVpbGQvanMvbGliL1FVbml0QWRhcHRlci5qcwogIyBkZXBlbmRlbmNpZXMKLSAgLSBidWlsZC9qcy9saWIvanF1ZXJ5LTEuNS4yLmpzCisgIC0gYnVpbGQvanMvbGliL2pxdWVyeS5qcwogICAtIGJ1aWxkL2pzL3RocmlmdC5qcworICAtIGdlbi1qcy9Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5qcwogICAtIGdlbi1qcy9UaHJpZnRUZXN0X3R5cGVzLmpzCiAgIC0gZ2VuLWpzL1RocmlmdFRlc3QuanMKICMgdGhlIHRlc3Qgc3VpdGUKZGlmZiAtLWdpdCBhL2xpYi9qcy90ZXN0L3BoYW50b20tY2xpZW50LmpzIGIvbGliL2pzL3Rlc3QvcGhhbnRvbS1jbGllbnQuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUxN2U3MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qcy90ZXN0L3BoYW50b20tY2xpZW50LmpzCkBAIC0wLDAgKzEsMzgyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisgLyoganNoaW50IC1XMTAwICovCisKKyhmdW5jdGlvbigpIHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIC8vIFJ1ZGltZW50YXJ5IHRlc3QgaGVscGVyIGZ1bmN0aW9ucworICAvLyBUT0RPOiBSZXR1cm4gZXJyb3IgY29kZSBiYXNlZCBvbiBraW5kIG9mIGVycm9ycyByYXRoZXIgdGhhbiB0aHJvdworICB2YXIgb2sgPSBmdW5jdGlvbih0LCBtc2cpIHsKKyAgICBpZiAoIXQpIHsKKyAgICAgIGNvbnNvbGUubG9nKCcqKiogRkFJTEVEICoqKicpOworICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7CisgICAgfQorICB9OworICB2YXIgZXF1YWwgPSBmdW5jdGlvbihhLCBiKSB7CisgICAgaWYgKGEgIT09IGIpIHsKKyAgICAgIGNvbnNvbGUubG9nKCcqKiogRkFJTEVEICoqKicpOworICAgICAgdGhyb3cgbmV3IEVycm9yKCk7CisgICAgfQorICB9OworICB2YXIgdGVzdCA9IGZ1bmN0aW9uKG5hbWUsIGYpIHsKKyAgICBjb25zb2xlLmxvZygnVEVTVCA6ICcgKyBuYW1lKTsKKyAgICBmKCk7CisgICAgY29uc29sZS5sb2coJ09LXG4nKTsKKyAgfTsKKworICB2YXIgcGFyc2VBcmdzID0gZnVuY3Rpb24oYXJncykgeworICAgIHZhciBza2lwcyA9IFsKKyAgICAgICctLXRyYW5zcG9ydD1odHRwJywKKyAgICAgICctLXByb3RvY29sPWpzb24nCisgICAgXTsKKyAgICB2YXIgb3B0cyA9IHsKKyAgICAgIHBvcnQ6ICc5MDkwJworICAgICAgLy8gcHJvdG9jb2w6ICdqc29uJywKKyAgICB9OworICAgIHZhciBrZXlzID0ge307CisgICAgZm9yICh2YXIga2V5IGluIG9wdHMpIHsKKyAgICAgIGtleXNbJy0tJyArIGtleSArICc9J10gPSBrZXk7CisgICAgfQorICAgIGZvciAodmFyIGkgaW4gYXJncykgeworICAgICAgdmFyIGFyZyA9IGFyZ3NbaV07CisgICAgICBpZiAoc2tpcHMuaW5kZXhPZihhcmcpICE9IC0xKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgdmFyIGhpdCA9IGZhbHNlOworICAgICAgZm9yICh2YXIgayBpbiBrZXlzKSB7CisgICAgICAgIGlmIChhcmcuc2xpY2UoMCwgay5sZW5ndGgpID09PSBrKSB7CisgICAgICAgICAgb3B0c1trZXlzW2tdXSA9IGFyZy5zbGljZShrLmxlbmd0aCk7CisgICAgICAgICAgaGl0ID0gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKCFoaXQpIHsKKyAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIGFyZ3VtZW50OiAnICsgYXJnKTsKKyAgICAgIH0KKyAgICB9CisgICAgb3B0cy5wb3J0ID0gcGFyc2VJbnQob3B0cy5wb3J0LCAxMCk7CisgICAgaWYgKCFvcHRzLnBvcnQgfHwgb3B0cy5wb3J0IDwgMSB8fCBvcHRzLnBvcnQgPiA2NTUzNSkgeworICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHBvcnQgbnVtYmVyJyk7CisgICAgfQorICAgIHJldHVybiBvcHRzOworICB9OworCisgIHZhciBleGVjdXRlID0gZnVuY3Rpb24oKSB7CisgICAgY29uc29sZS5sb2coJyMjIyBBcGFjaGUgVGhyaWZ0IEphdmFzY3JpcHQgc3RhbmRhbG9uZSB0ZXN0IGNsaWVudCcpOworICAgIGNvbnNvbGUubG9nKCctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nKTsKKworICAgIHBoYW50b20ucGFnZS5pbmplY3RKcygnc3JjL3RocmlmdC5qcycpOworICAgIHBoYW50b20ucGFnZS5pbmplY3RKcygndGVzdC9nZW4tanMvVGhyaWZ0VGVzdF90eXBlcy5qcycpOworICAgIHBoYW50b20ucGFnZS5pbmplY3RKcygndGVzdC9nZW4tanMvVGhyaWZ0VGVzdC5qcycpOworCisgICAgdmFyIHN5c3RlbSA9IHJlcXVpcmUoJ3N5c3RlbScpOworICAgIHZhciBvcHRzID0gcGFyc2VBcmdzKHN5c3RlbS5hcmdzLnNsaWNlKDEpKTsKKyAgICB2YXIgcG9ydCA9IG9wdHMucG9ydDsKKyAgICB2YXIgdHJhbnNwb3J0ID0gbmV3IFRocmlmdC5UcmFuc3BvcnQoJ2h0dHA6Ly9sb2NhbGhvc3Q6JyArIHBvcnQgKyAnL3NlcnZpY2UnKTsKKyAgICB2YXIgcHJvdG9jb2wgPSBuZXcgVGhyaWZ0LlByb3RvY29sKHRyYW5zcG9ydCk7CisgICAgdmFyIGNsaWVudCA9IG5ldyBUaHJpZnRUZXN0LlRocmlmdFRlc3RDbGllbnQocHJvdG9jb2wpOworCisKKyAgICAvLyBUT0RPOiBSZW1vdmUgZHVwbGljYXRlIGNvZGUgd2l0aCB0ZXN0LmpzLgorICAgIC8vIGFsbCBMYW5ndWFnZXMgaW4gVVRGLTgKKyAgICB2YXIgc3RyaW5nVGVzdCA9ICJBZnJpa2FhbnMsIEFsZW1hbm5pc2NoLCBBcmFnb27DqXMsINin2YTYudix2KjZitipLCDZhdi12LHZiSwgQXN0dXJpYW51LCBBeW1hciBhcnUsIEF6yZlyYmF5Y2FuLCDQkdCw0YjSodC+0YDRgiwgQm9hcmlzY2gsIMW9ZW1haXTEl8Wha2EsINCR0LXQu9Cw0YDRg9GB0LrQsNGPLCDQkdC10LvQsNGA0YPRgdC60LDRjyAo0YLQsNGA0LDRiNC60LXQstGW0YbQsCksINCR0YrQu9Cz0LDRgNGB0LrQuCwgQmFtYW5hbmthbiwg4Kas4Ka+4KaC4Kay4Ka+LCBCcmV6aG9uZWcsIEJvc2Fuc2tpLCBDYXRhbMOgLCBNw6xuZy1kxJXMpG5nLW5n4bmzzIQsINCd0L7RhdGH0LjQudC9LCBDZWJ1YW5vLCDhj6PhjrPhjqksIMSMZXNreSwg0KHQu9C+0LLRo8yB0L3RjNGB0LrRiiAvIOKwlOKwjuKwkeKwguKwoeKwkOKwoOKwlOKwjeKwnywg0KfTkdCy0LDRiNC70LAsIEN5bXJhZWcsIERhbnNrLCBaYXpha2ksIN6L3qjeiN6s3oDeqN6E3qbekN6wLCDOlc67zrvOt869zrnOus6sLCBFbWlsacOgbiBlIHJ1bWFnbsOybCwgRW5nbGlzaCwgRXNwZXJhbnRvLCBFc3Bhw7FvbCwgRWVzdGksIEV1c2thcmEsINmB2KfYsdiz24wsIFN1b21pLCBWw7VybywgRsO4cm95c2t0LCBGcmFuw6dhaXMsIEFycGV0YW4sIEZ1cmxhbiwgRnJ5c2ssIEdhZWlsZ2UsIOi0m+iqniwgR8OgaWRobGlnLCBHYWxlZ28sIEF2YcOxZSfhur0sIOCql+CrgeCqnOCqsOCqvuCqpOCrgCwgR2FlbGcsINei15HXqNeZ16osIOCkueCkv+CkqOCljeCkpuClgCwgRmlqaSBIaW5kaSwgSHJ2YXRza2ksIEtyZXnDsmwgYXlpc3llbiwgTWFneWFyLCDVgNWh1bXVpdaA1aXVtiwgSW50ZXJsaW5ndWEsIEJhaGFzYSBJbmRvbmVzaWEsIElsb2thbm8sIElkbywgw41zbGVuc2thLCBJdGFsaWFubywg5pel5pys6KqeLCBMb2piYW4sIEJhc2EgSmF3YSwg4YOl4YOQ4YOg4YOX4YOj4YOa4YOYLCBLb25nbywgS2FsYWFsbGlzdXQsIOCyleCyqOCzjeCyqOCyoSwg7ZWc6rWt7Ja0LCDQmtGK0LDRgNCw0YfQsNC5LdCc0LDQu9C60YrQsNGALCBSaXBvYXJpc2NoLCBLdXJkw64sINCa0L7QvNC4LCBLZXJuZXdlaywg0JrRi9GA0LPRi9C30YfQsCwgTGF0aW5hLCBMYWRpbm8sIEzDq3R6ZWJ1ZXJnZXNjaCwgTGltYnVyZ3MsIExpbmfDoWxhLCDguqXgurLguqcsIExpZXR1dmnFsywgTGF0dmllxaF1LCBCYXNhIEJhbnl1bWFzYW4sIE1hbGFnYXN5LCDQnNCw0LrQtdC00L7QvdGB0LrQuCwg4LSu4LSy4LSv4LS+4LSz4LSCLCDgpK7gpLDgpL7gpKDgpYAsIEJhaGFzYSBNZWxheXUsINmF2KfYstmQ2LHZiNmG24wsIE5uYXB1bGl0YW5vLCBOZWRlcnNha3Npc2NoLCDgpKjgpYfgpKrgpL7gpLIg4KSt4KS+4KS34KS+LCBOZWRlcmxhbmRzLCDigKpOb3JzayAobnlub3JzaynigKwsIOKAqk5vcnNrIChib2ttw6VsKeKArCwgTm91b3JtYW5kLCBEaW7DqSBiaXphYWQsIE9jY2l0YW4sINCY0YDQvtC90LDRgywgUGFwaWFtZW50dSwgRGVpdHNjaCwgTm9yZnVrIC8gUGl0a2VybiwgUG9sc2tpLCDZvtmG2KzYp9io24wsINm+2prYqtmILCBQb3J0dWd1w6pzLCBSdW5hIFNpbWksIFJ1bWFudHNjaCwgUm9tYW5pLCBSb23Dom7Egywg0KDRg9GB0YHQutC40LksINCh0LDRhdCwINGC0YvQu9CwLCBTYXJkdSwgU2ljaWxpYW51LCBTY290cywgU8OhbWVnaWVsbGEsIFNpbXBsZSBFbmdsaXNoLCBTbG92ZW7EjWluYSwgU2xvdmVuxaHEjWluYSwg0KHRgNC/0YHQutC4IC8gU3Jwc2tpLCBTZWVsdGVyc2ssIFN2ZW5za2EsIEtpc3dhaGlsaSwg4K6k4K6u4K6/4K604K+NLCDgsKTgsYbgsLLgsYHgsJfgsYEsINCi0L7St9C40LrToywg4LmE4LiX4LiiLCBUw7xya21lbsOnZSwgVGFnYWxvZywgVMO8cmvDp2UsINCi0LDRgtCw0YDRh9CwL1RhdGFyw6dhLCDQo9C60YDQsNGX0L3RgdGM0LrQsCwg2KfYsdiv2YgsIFRp4bq/bmcgVmnhu4d0LCBWb2xhcMO8aywgV2Fsb24sIFdpbmFyYXksIOWQtOivrSwgaXNpWGhvc2EsINeZ15nWtNeT15nXqSwgWW9yw7liw6EsIFplw6p1d3MsIOS4reaWhywgQsOibi1sw6JtLWfDuiwg57K16KqeIjsKKworICAgIGZ1bmN0aW9uIGNoZWNrUmVjdXJzaXZlbHkobWFwMSwgbWFwMikgeworICAgICAgaWYgKHR5cGVvZiBtYXAxICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBtYXAyICE9PSAnZnVuY3Rpb24nKSB7CisgICAgICAgIGlmICghbWFwMSB8fCB0eXBlb2YgbWFwMSAhPT0gJ29iamVjdCcpIHsKKyAgICAgICAgICBlcXVhbChtYXAxLCBtYXAyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gbWFwMSkgeworICAgICAgICAgICAgY2hlY2tSZWN1cnNpdmVseShtYXAxW2tleV0sIG1hcDJba2V5XSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgdGVzdCgnVm9pZCcsIGZ1bmN0aW9uKCkgeworICAgICAgZXF1YWwoY2xpZW50LnRlc3RWb2lkKCksIHVuZGVmaW5lZCk7CisgICAgfSk7CisgICAgdGVzdCgnQmluYXJ5IChTdHJpbmcpJywgZnVuY3Rpb24oKSB7CisgICAgICB2YXIgYmluYXJ5ID0gJyc7CisgICAgICBmb3IgKHZhciB2ID0gMjU1OyB2ID49IDA7IC0tdikgeworICAgICAgICBiaW5hcnkgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSh2KTsKKyAgICAgIH0KKyAgICAgIGVxdWFsKGNsaWVudC50ZXN0QmluYXJ5KGJpbmFyeSksIGJpbmFyeSk7CisgICAgfSk7CisgICAgdGVzdCgnQmluYXJ5IChVaW50OEFycmF5KScsIGZ1bmN0aW9uKCkgeworICAgICAgdmFyIGJpbmFyeSA9ICcnOworICAgICAgZm9yICh2YXIgdiA9IDI1NTsgdiA+PSAwOyAtLXYpIHsKKyAgICAgICAgYmluYXJ5ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUodik7CisgICAgICB9CisgICAgICB2YXIgYXJyID0gbmV3IFVpbnQ4QXJyYXkoYmluYXJ5Lmxlbmd0aCk7CisgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJpbmFyeS5sZW5ndGg7ICsraSkgeworICAgICAgICBhcnJbaV0gPSBiaW5hcnlbaV0uY2hhckNvZGVBdCgpOworICAgICAgfQorICAgICAgZXF1YWwoY2xpZW50LnRlc3RCaW5hcnkoYXJyKSwgYmluYXJ5KTsKKyAgICB9KTsKKyAgICB0ZXN0KCdTdHJpbmcnLCBmdW5jdGlvbigpIHsKKyAgICAgIGVxdWFsKGNsaWVudC50ZXN0U3RyaW5nKCcnKSwgJycpOworICAgICAgZXF1YWwoY2xpZW50LnRlc3RTdHJpbmcoc3RyaW5nVGVzdCksIHN0cmluZ1Rlc3QpOworCisgICAgICB2YXIgc3BlY2lhbENoYXJhY3RlcnMgPSAncXVvdGU6IFwiIGJhY2tzbGFzaDonICsKKyAgICAgICAgJyBmb3J3YXJkc2xhc2gtZXNjYXBlZDogXC8gJyArCisgICAgICAgICAgJyBiYWNrc3BhY2U6IFxiIGZvcm1mZWVkOiBcZiBuZXdsaW5lOiBcbiByZXR1cm46IFxyIHRhYjogJyArCisgICAgICAgICAgICAnIG5vdy1hbGwtb2YtdGhlbS10b2dldGhlcjogIlxcXC9cYlxuXHJcdCcgKworICAgICAgICAgICAgICAnIG5vdy1hLWJ1bmNoLW9mLWp1bms6ICFAIyQlJigpKCYlJCN7fXt9PD48PjwnOworICAgICAgICAgICAgICBlcXVhbChjbGllbnQudGVzdFN0cmluZyhzcGVjaWFsQ2hhcmFjdGVycyksIHNwZWNpYWxDaGFyYWN0ZXJzKTsKKyAgICB9KTsKKyAgICB0ZXN0KCdEb3VibGUnLCBmdW5jdGlvbigpIHsKKyAgICAgIGVxdWFsKGNsaWVudC50ZXN0RG91YmxlKDApLCAwKTsKKyAgICAgIGVxdWFsKGNsaWVudC50ZXN0RG91YmxlKC0xKSwgLTEpOworICAgICAgZXF1YWwoY2xpZW50LnRlc3REb3VibGUoMy4xNCksIDMuMTQpOworICAgICAgZXF1YWwoY2xpZW50LnRlc3REb3VibGUoTWF0aC5wb3coMiwgNjApKSwgTWF0aC5wb3coMiwgNjApKTsKKyAgICB9KTsKKyAgICB0ZXN0KCdCb29sJywgZnVuY3Rpb24oKSB7CisgICAgICBlcXVhbChjbGllbnQudGVzdEJvb2wodHJ1ZSksIHRydWUpOworICAgICAgZXF1YWwoY2xpZW50LnRlc3RCb29sKGZhbHNlKSwgZmFsc2UpOworICAgIH0pOworICAgIHRlc3QoJ0k4JywgZnVuY3Rpb24oKSB7CisgICAgICBlcXVhbChjbGllbnQudGVzdEJ5dGUoMCksIDApOworICAgICAgZXF1YWwoY2xpZW50LnRlc3RCeXRlKDB4MDEpLCAweDAxKTsKKyAgICB9KTsKKyAgICB0ZXN0KCdJMzInLCBmdW5jdGlvbigpIHsKKyAgICAgIGVxdWFsKGNsaWVudC50ZXN0STMyKDApLCAwKTsKKyAgICAgIGVxdWFsKGNsaWVudC50ZXN0STMyKE1hdGgucG93KDIsIDMwKSksIE1hdGgucG93KDIsIDMwKSk7CisgICAgICBlcXVhbChjbGllbnQudGVzdEkzMigtTWF0aC5wb3coMiwgMzApKSwgLU1hdGgucG93KDIsIDMwKSk7CisgICAgfSk7CisgICAgdGVzdCgnSTY0JywgZnVuY3Rpb24oKSB7CisgICAgICBlcXVhbChjbGllbnQudGVzdEk2NCgwKSwgMCk7CisgICAgICAvL1RoaXMgaXMgdXN1YWxseSAyXjYwIGJ1dCBKUyBjYW5ub3QgcmVwcmVzZW50IGFueXRoaW5nIG92ZXIgMl41MiBhY2N1cmF0ZWx5CisgICAgICBlcXVhbChjbGllbnQudGVzdEk2NChNYXRoLnBvdygyLCA1MikpLCBNYXRoLnBvdygyLCA1MikpOworICAgICAgZXF1YWwoY2xpZW50LnRlc3RJNjQoLU1hdGgucG93KDIsIDUyKSksIC1NYXRoLnBvdygyLCA1MikpOworICAgIH0pOworCisgICAgdGVzdCgnU3RydWN0JywgZnVuY3Rpb24oKSB7CisgICAgICB2YXIgc3RydWN0VGVzdElucHV0ID0gbmV3IFRocmlmdFRlc3QuWHRydWN0KCk7CisgICAgICBzdHJ1Y3RUZXN0SW5wdXQuc3RyaW5nX3RoaW5nID0gJ3dvcmtlZCc7CisgICAgICBzdHJ1Y3RUZXN0SW5wdXQuYnl0ZV90aGluZyA9IDB4MDE7CisgICAgICBzdHJ1Y3RUZXN0SW5wdXQuaTMyX3RoaW5nID0gTWF0aC5wb3coMiwgMzApOworICAgICAgLy9UaGlzIGlzIHVzdWFsbHkgMl42MCBidXQgSlMgY2Fubm90IHJlcHJlc2VudCBhbnl0aGluZyBvdmVyIDJeNTIgYWNjdXJhdGVseQorICAgICAgc3RydWN0VGVzdElucHV0Lmk2NF90aGluZyA9IE1hdGgucG93KDIsIDUyKTsKKworICAgICAgdmFyIHN0cnVjdFRlc3RPdXRwdXQgPSBjbGllbnQudGVzdFN0cnVjdChzdHJ1Y3RUZXN0SW5wdXQpOworCisgICAgICBlcXVhbChzdHJ1Y3RUZXN0T3V0cHV0LnN0cmluZ190aGluZywgc3RydWN0VGVzdElucHV0LnN0cmluZ190aGluZyk7CisgICAgICBlcXVhbChzdHJ1Y3RUZXN0T3V0cHV0LmJ5dGVfdGhpbmcsIHN0cnVjdFRlc3RJbnB1dC5ieXRlX3RoaW5nKTsKKyAgICAgIGVxdWFsKHN0cnVjdFRlc3RPdXRwdXQuaTMyX3RoaW5nLCBzdHJ1Y3RUZXN0SW5wdXQuaTMyX3RoaW5nKTsKKyAgICAgIGVxdWFsKHN0cnVjdFRlc3RPdXRwdXQuaTY0X3RoaW5nLCBzdHJ1Y3RUZXN0SW5wdXQuaTY0X3RoaW5nKTsKKworICAgICAgZXF1YWwoSlNPTi5zdHJpbmdpZnkoc3RydWN0VGVzdE91dHB1dCksIEpTT04uc3RyaW5naWZ5KHN0cnVjdFRlc3RJbnB1dCkpOworICAgIH0pOworCisgICAgdGVzdCgnTmVzdCcsIGZ1bmN0aW9uKCkgeworICAgICAgdmFyIHh0clRlc3RJbnB1dCA9IG5ldyBUaHJpZnRUZXN0Llh0cnVjdCgpOworICAgICAgeHRyVGVzdElucHV0LnN0cmluZ190aGluZyA9ICd3b3JrZWQnOworICAgICAgeHRyVGVzdElucHV0LmJ5dGVfdGhpbmcgPSAweDAxOworICAgICAgeHRyVGVzdElucHV0LmkzMl90aGluZyA9IE1hdGgucG93KDIsIDMwKTsKKyAgICAgIC8vVGhpcyBpcyB1c3VhbGx5IDJeNjAgYnV0IEpTIGNhbm5vdCByZXByZXNlbnQgYW55dGhpbmcgb3ZlciAyXjUyIGFjY3VyYXRlbHkKKyAgICAgIHh0clRlc3RJbnB1dC5pNjRfdGhpbmcgPSBNYXRoLnBvdygyLCA1Mik7CisKKyAgICAgIHZhciBuZXN0VGVzdElucHV0ID0gbmV3IFRocmlmdFRlc3QuWHRydWN0MigpOworICAgICAgbmVzdFRlc3RJbnB1dC5ieXRlX3RoaW5nID0gMHgwMjsKKyAgICAgIG5lc3RUZXN0SW5wdXQuc3RydWN0X3RoaW5nID0geHRyVGVzdElucHV0OworICAgICAgbmVzdFRlc3RJbnB1dC5pMzJfdGhpbmcgPSBNYXRoLnBvdygyLCAxNSk7CisKKyAgICAgIHZhciBuZXN0VGVzdE91dHB1dCA9IGNsaWVudC50ZXN0TmVzdChuZXN0VGVzdElucHV0KTsKKworICAgICAgZXF1YWwobmVzdFRlc3RPdXRwdXQuYnl0ZV90aGluZywgbmVzdFRlc3RJbnB1dC5ieXRlX3RoaW5nKTsKKyAgICAgIGVxdWFsKG5lc3RUZXN0T3V0cHV0LnN0cnVjdF90aGluZy5zdHJpbmdfdGhpbmcsIG5lc3RUZXN0SW5wdXQuc3RydWN0X3RoaW5nLnN0cmluZ190aGluZyk7CisgICAgICBlcXVhbChuZXN0VGVzdE91dHB1dC5zdHJ1Y3RfdGhpbmcuYnl0ZV90aGluZywgbmVzdFRlc3RJbnB1dC5zdHJ1Y3RfdGhpbmcuYnl0ZV90aGluZyk7CisgICAgICBlcXVhbChuZXN0VGVzdE91dHB1dC5zdHJ1Y3RfdGhpbmcuaTMyX3RoaW5nLCBuZXN0VGVzdElucHV0LnN0cnVjdF90aGluZy5pMzJfdGhpbmcpOworICAgICAgZXF1YWwobmVzdFRlc3RPdXRwdXQuc3RydWN0X3RoaW5nLmk2NF90aGluZywgbmVzdFRlc3RJbnB1dC5zdHJ1Y3RfdGhpbmcuaTY0X3RoaW5nKTsKKyAgICAgIGVxdWFsKG5lc3RUZXN0T3V0cHV0LmkzMl90aGluZywgbmVzdFRlc3RJbnB1dC5pMzJfdGhpbmcpOworCisgICAgICBlcXVhbChKU09OLnN0cmluZ2lmeShuZXN0VGVzdE91dHB1dCksIEpTT04uc3RyaW5naWZ5KG5lc3RUZXN0SW5wdXQpKTsKKyAgICB9KTsKKworICAgIHRlc3QoJ01hcCcsIGZ1bmN0aW9uKCkgeworICAgICAgdmFyIG1hcFRlc3RJbnB1dCA9IHs3OiA3NywgODogODgsIDk6IDk5fTsKKworICAgICAgdmFyIG1hcFRlc3RPdXRwdXQgPSBjbGllbnQudGVzdE1hcChtYXBUZXN0SW5wdXQpOworCisgICAgICBmb3IgKHZhciBrZXkgaW4gbWFwVGVzdE91dHB1dCkgeworICAgICAgICBlcXVhbChtYXBUZXN0T3V0cHV0W2tleV0sIG1hcFRlc3RJbnB1dFtrZXldKTsKKyAgICAgIH0KKyAgICB9KTsKKworICAgIHRlc3QoJ1N0cmluZ01hcCcsIGZ1bmN0aW9uKCkgeworICAgICAgdmFyIG1hcFRlc3RJbnB1dCA9IHsKKyAgICAgICAgJ2EnOiAnMTIzJywgJ2EgYic6ICd3aXRoIHNwYWNlcyAnLCAnc2FtZSc6ICdzYW1lJywgJzAnOiAnbnVtZXJpYyBrZXknLAorICAgICAgICAnbG9uZ1ZhbHVlJzogc3RyaW5nVGVzdCwgc3RyaW5nVGVzdDogJ2xvbmcga2V5JworICAgICAgfTsKKworICAgICAgdmFyIG1hcFRlc3RPdXRwdXQgPSBjbGllbnQudGVzdFN0cmluZ01hcChtYXBUZXN0SW5wdXQpOworCisgICAgICBmb3IgKHZhciBrZXkgaW4gbWFwVGVzdE91dHB1dCkgeworICAgICAgICBlcXVhbChtYXBUZXN0T3V0cHV0W2tleV0sIG1hcFRlc3RJbnB1dFtrZXldKTsKKyAgICAgIH0KKyAgICB9KTsKKworICAgIHRlc3QoJ1NldCcsIGZ1bmN0aW9uKCkgeworICAgICAgdmFyIHNldFRlc3RJbnB1dCA9IFsxLCAyLCAzXTsKKyAgICAgIG9rKGNsaWVudC50ZXN0U2V0KHNldFRlc3RJbnB1dCksIHNldFRlc3RJbnB1dCk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdMaXN0JywgZnVuY3Rpb24oKSB7CisgICAgICB2YXIgbGlzdFRlc3RJbnB1dCA9IFsxLCAyLCAzXTsKKyAgICAgIG9rKGNsaWVudC50ZXN0TGlzdChsaXN0VGVzdElucHV0KSwgbGlzdFRlc3RJbnB1dCk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdFbnVtJywgZnVuY3Rpb24oKSB7CisgICAgICBlcXVhbChjbGllbnQudGVzdEVudW0oVGhyaWZ0VGVzdC5OdW1iZXJ6Lk9ORSksIFRocmlmdFRlc3QuTnVtYmVyei5PTkUpOworICAgIH0pOworCisgICAgdGVzdCgnVHlwZURlZicsIGZ1bmN0aW9uKCkgeworICAgICAgZXF1YWwoY2xpZW50LnRlc3RUeXBlZGVmKDY5KSwgNjkpOworICAgIH0pOworCisgICAgdGVzdCgnU2tpcCcsIGZ1bmN0aW9uKCkgeworICAgICAgdmFyIHN0cnVjdFRlc3RJbnB1dCA9IG5ldyBUaHJpZnRUZXN0Llh0cnVjdCgpOworICAgICAgdmFyIG1vZGlmaWVkQ2xpZW50ID0gbmV3IFRocmlmdFRlc3QuVGhyaWZ0VGVzdENsaWVudChwcm90b2NvbCk7CisKKyAgICAgIG1vZGlmaWVkQ2xpZW50LnJlY3ZfdGVzdFN0cnVjdCA9IGZ1bmN0aW9uKCkgeworICAgICAgICB2YXIgaW5wdXQgPSBtb2RpZmllZENsaWVudC5pbnB1dDsKKyAgICAgICAgdmFyIHh0cnVjdDMgPSBuZXcgVGhyaWZ0VGVzdC5YdHJ1Y3QzKCk7CisKKyAgICAgICAgaW5wdXQucmVhZE1lc3NhZ2VCZWdpbigpOworICAgICAgICBpbnB1dC5yZWFkU3RydWN0QmVnaW4oKTsKKworICAgICAgICAvLyByZWFkIFh0cnVjdCBkYXRhIHdpdGggWHRydWN0MworICAgICAgICBpbnB1dC5yZWFkRmllbGRCZWdpbigpOworICAgICAgICB4dHJ1Y3QzLnJlYWQoaW5wdXQpOworICAgICAgICBpbnB1dC5yZWFkRmllbGRFbmQoKTsKKyAgICAgICAgLy8gcmVhZCBUaHJpZnQuVHlwZS5TVE9QIG1lc3NhZ2UKKyAgICAgICAgaW5wdXQucmVhZEZpZWxkQmVnaW4oKTsKKyAgICAgICAgaW5wdXQucmVhZEZpZWxkRW5kKCk7CisKKyAgICAgICAgaW5wdXQucmVhZFN0cnVjdEVuZCgpOworICAgICAgICBpbnB1dC5yZWFkTWVzc2FnZUVuZCgpOworCisgICAgICAgIHJldHVybiB4dHJ1Y3QzOworICAgICAgfTsKKworICAgICAgc3RydWN0VGVzdElucHV0LnN0cmluZ190aGluZyA9ICd3b3JrZWQnOworICAgICAgc3RydWN0VGVzdElucHV0LmJ5dGVfdGhpbmcgPSAweDAxOworICAgICAgc3RydWN0VGVzdElucHV0LmkzMl90aGluZyA9IE1hdGgucG93KDIsIDMwKTsKKyAgICAgIHN0cnVjdFRlc3RJbnB1dC5pNjRfdGhpbmcgPSBNYXRoLnBvdygyLCA1Mik7CisKKyAgICAgIHZhciBzdHJ1Y3RUZXN0T3V0cHV0ID0gbW9kaWZpZWRDbGllbnQudGVzdFN0cnVjdChzdHJ1Y3RUZXN0SW5wdXQpOworCisgICAgICBlcXVhbChzdHJ1Y3RUZXN0T3V0cHV0IGluc3RhbmNlb2YgVGhyaWZ0VGVzdC5YdHJ1Y3QzLCB0cnVlKTsKKyAgICAgIGVxdWFsKHN0cnVjdFRlc3RPdXRwdXQuc3RyaW5nX3RoaW5nLCBzdHJ1Y3RUZXN0SW5wdXQuc3RyaW5nX3RoaW5nKTsKKyAgICAgIGVxdWFsKHN0cnVjdFRlc3RPdXRwdXQuY2hhbmdlZCwgbnVsbCk7CisgICAgICBlcXVhbChzdHJ1Y3RUZXN0T3V0cHV0LmkzMl90aGluZywgc3RydWN0VGVzdElucHV0LmkzMl90aGluZyk7CisgICAgICBlcXVhbChzdHJ1Y3RUZXN0T3V0cHV0Lmk2NF90aGluZywgc3RydWN0VGVzdElucHV0Lmk2NF90aGluZyk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdNYXBNYXAnLCBmdW5jdGlvbigpIHsKKyAgICAgIHZhciBtYXBNYXBUZXN0RXhwZWN0ZWRSZXN1bHQgPSB7CisgICAgICAgICc0JzogeycxJzogMSwgJzInOiAyLCAnMyc6IDMsICc0JzogNH0sCisgICAgICAgICctNCc6IHsnLTQnOiAtNCwgJy0zJzogLTMsICctMic6IC0yLCAnLTEnOiAtMX0KKyAgICAgIH07CisKKyAgICAgIHZhciBtYXBNYXBUZXN0T3V0cHV0ID0gY2xpZW50LnRlc3RNYXBNYXAoMSk7CisKKworICAgICAgZm9yICh2YXIga2V5IGluIG1hcE1hcFRlc3RPdXRwdXQpIHsKKyAgICAgICAgZm9yICh2YXIga2V5MiBpbiBtYXBNYXBUZXN0T3V0cHV0W2tleV0pIHsKKyAgICAgICAgICBlcXVhbChtYXBNYXBUZXN0T3V0cHV0W2tleV1ba2V5Ml0sIG1hcE1hcFRlc3RFeHBlY3RlZFJlc3VsdFtrZXldW2tleTJdKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBjaGVja1JlY3Vyc2l2ZWx5KG1hcE1hcFRlc3RPdXRwdXQsIG1hcE1hcFRlc3RFeHBlY3RlZFJlc3VsdCk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdYY2VwdGlvbicsIGZ1bmN0aW9uKCkgeworICAgICAgdHJ5IHsKKyAgICAgICAgY2xpZW50LnRlc3RFeGNlcHRpb24oJ1hjZXB0aW9uJyk7CisgICAgICAgIG9rKGZhbHNlKTsKKyAgICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgICAgZXF1YWwoZS5lcnJvckNvZGUsIDEwMDEpOworICAgICAgICBlcXVhbChlLm1lc3NhZ2UsICdYY2VwdGlvbicpOworICAgICAgfQorICAgIH0pOworCisgICAgdGVzdCgnbm8gRXhjZXB0aW9uJywgZnVuY3Rpb24oKSB7CisgICAgICB0cnkgeworICAgICAgICBjbGllbnQudGVzdEV4Y2VwdGlvbignbm8gRXhjZXB0aW9uJyk7CisgICAgICB9IGNhdGNoIChlKSB7CisgICAgICAgIG9rKGZhbHNlKTsKKyAgICAgIH0KKyAgICB9KTsKKworICAgIHRlc3QoJ1RFeGNlcHRpb24nLCBmdW5jdGlvbigpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCdURXhjZXB0aW9uJyk7CisgICAgICAgIG9rKGZhbHNlKTsKKyAgICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgICAgb2sob2spOworICAgICAgfQorICAgIH0pOworCisgICAgdmFyIGNyYXp5ID0geworICAgICAgJ3VzZXJNYXAnOiB7ICc1JzogNSwgJzgnOiA4IH0sCisgICAgICAneHRydWN0cyc6IFt7CisgICAgICAgICdzdHJpbmdfdGhpbmcnOiAnR29vZGJ5ZTQnLAorICAgICAgICAnYnl0ZV90aGluZyc6IDQsCisgICAgICAgICdpMzJfdGhpbmcnOiA0LAorICAgICAgICAnaTY0X3RoaW5nJzogNAorICAgICAgfSwKKyAgICAgIHsKKyAgICAgICAgJ3N0cmluZ190aGluZyc6ICdIZWxsbzInLAorICAgICAgICAnYnl0ZV90aGluZyc6IDIsCisgICAgICAgICdpMzJfdGhpbmcnOiAyLAorICAgICAgICAnaTY0X3RoaW5nJzogMgorICAgICAgfV0KKyAgICB9OworICAgIHRlc3QoJ0luc2FuaXR5JywgZnVuY3Rpb24oKSB7CisgICAgICB2YXIgaW5zYW5pdHkgPSB7CisgICAgICAgICcxJzogeworICAgICAgICAgICcyJzogY3JhenksCisgICAgICAgICAgJzMnOiBjcmF6eQorICAgICAgICB9LAorICAgICAgICAnMic6IHsgJzYnOiB7ICd1c2VyTWFwJzogbnVsbCwgJ3h0cnVjdHMnOiBudWxsIH0gfQorICAgICAgfTsKKyAgICAgIHZhciByZXMgPSBjbGllbnQudGVzdEluc2FuaXR5KG5ldyBUaHJpZnRUZXN0Lkluc2FuaXR5KGNyYXp5KSk7CisgICAgICBvayhyZXMsIEpTT04uc3RyaW5naWZ5KHJlcykpOworICAgICAgb2soaW5zYW5pdHksIEpTT04uc3RyaW5naWZ5KGluc2FuaXR5KSk7CisKKyAgICAgIGNoZWNrUmVjdXJzaXZlbHkocmVzLCBpbnNhbml0eSk7CisgICAgfSk7CisKKyAgICBjb25zb2xlLmxvZygnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJyk7CisgICAgY29uc29sZS5sb2coJyMjIyBBbGwgdGVzdHMgc3VjY2VlZGVkLicpOworICAgIHJldHVybiAwOworICB9OworCisgIHRyeSB7CisgICAgdmFyIHJldCA9IGV4ZWN1dGUoKTsKKyAgICBwaGFudG9tLmV4aXQocmV0KTsKKyAgfSBjYXRjaCAoZXJyKSB7CisgICAgLy8gQ2F0Y2ggYWxsIGFuZCBleGl0IHRvIGF2b2lkIGhhbmcuCisgICAgY29uc29sZS5lcnJvcihlcnIpOworICAgIHBoYW50b20uZXhpdCgxKTsKKyAgfQorfSkoKTsKZGlmZiAtLWdpdCBhL2xpYi9qcy90ZXN0L3BoYW50b21qcy1xdW5pdC5qcyBiL2xpYi9qcy90ZXN0L3BoYW50b21qcy1xdW5pdC5qcwppbmRleCAwMjdiZTQwLi5jMWQ3YTViIDEwMDc1NQotLS0gYS9saWIvanMvdGVzdC9waGFudG9tanMtcXVuaXQuanMKKysrIGIvbGliL2pzL3Rlc3QvcGhhbnRvbWpzLXF1bml0LmpzCkBAIC04LDYgKzgsOCBAQAogICogSW5jbHVzaW9uIGludG8gQXBhY2hlIHByb2R1Y3RzIGlzIGFsbG93ZWQgYWNjb3JkaW5nIHRvIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9sZWdhbC8zcGFydHkuaHRtbAogICovCiAKK3ZhciBzeXN0ZW0gPSByZXF1aXJlKCdzeXN0ZW0nKTsKKwogCiAvKioKICAqIFdhaXQgdW50aWwgdGhlIHRlc3QgY29uZGl0aW9uIGlzIHRydWUgb3IgYSB0aW1lb3V0IG9jY3Vycy4gVXNlZnVsIGZvciB3YWl0aW5nCkBAIC0yNiwyMiArMjgsMjIgQEAKICAgICAgICAgc3RhcnQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSwKICAgICAgICAgY29uZGl0aW9uID0gZmFsc2UsCiAgICAgICAgIGludGVydmFsID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7Ci0gICAgICAgICAgICBpZiAoIChuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIHN0YXJ0IDwgbWF4dGltZU91dE1pbGxpcykgJiYgIWNvbmRpdGlvbiApIHsKKyAgICAgICAgICAgIGlmICgobmV3IERhdGUoKS5nZXRUaW1lKCkgLSBzdGFydCA8IG1heHRpbWVPdXRNaWxsaXMpICYmICFjb25kaXRpb24pIHsKICAgICAgICAgICAgICAgICAvLyBJZiBub3QgdGltZS1vdXQgeWV0IGFuZCBjb25kaXRpb24gbm90IHlldCBmdWxmaWxsZWQKLSAgICAgICAgICAgICAgICBjb25kaXRpb24gPSAodHlwZW9mKHRlc3RGeCkgPT09ICJzdHJpbmciID8gZXZhbCh0ZXN0RngpIDogdGVzdEZ4KCkpOyAvLzwgZGVmZW5zaXZlIGNvZGUKKyAgICAgICAgICAgICAgICBjb25kaXRpb24gPSAodHlwZW9mKHRlc3RGeCkgPT09ICdzdHJpbmcnID8gZXZhbCh0ZXN0RngpIDogdGVzdEZ4KCkpOyAvLzwgZGVmZW5zaXZlIGNvZGUKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYoIWNvbmRpdGlvbikgeworICAgICAgICAgICAgICAgIGlmICghY29uZGl0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIElmIGNvbmRpdGlvbiBzdGlsbCBub3QgZnVsZmlsbGVkICh0aW1lb3V0IGJ1dCBjb25kaXRpb24gaXMgJ2ZhbHNlJykKICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coIid3YWl0Rm9yKCknIHRpbWVvdXQiKTsKICAgICAgICAgICAgICAgICAgICAgcGhhbnRvbS5leGl0KDEpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIENvbmRpdGlvbiBmdWxmaWxsZWQgKHRpbWVvdXQgYW5kL29yIGNvbmRpdGlvbiBpcyAndHJ1ZScpCi0gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCInd2FpdEZvcigpJyBmaW5pc2hlZCBpbiAiICsgKG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gc3RhcnQpICsgIm1zLiIpOwotICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKG9uUmVhZHkpID09PSAic3RyaW5nIikgeworICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygiJ3dhaXRGb3IoKScgZmluaXNoZWQgaW4gIiArIChuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIHN0YXJ0KSArICdtcy4nKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihvblJlYWR5KSA9PT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGV2YWwob25SZWFkeSk7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBvblJlYWR5KCk7IC8vPCBEbyB3aGF0IGl0J3Mgc3VwcG9zZWQgdG8gZG8gb25jZSB0aGUgY29uZGl0aW9uIGlzIGZ1bGZpbGxlZAotICAgICAgICAgICAgICAgICAgICB9ICAKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKGludGVydmFsKTsgLy88IFN0b3AgdGhpcyBpbnRlcnZhbAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTQ5LDcgKzUxLDcgQEAKIH0KIAogCi1pZiAocGhhbnRvbS5hcmdzLmxlbmd0aCA9PT0gMCB8fCBwaGFudG9tLmFyZ3MubGVuZ3RoID4gMikgeworaWYgKHN5c3RlbS5hcmdzLmxlbmd0aCA9PT0gMSB8fCBzeXN0ZW0uYXJncy5sZW5ndGggPiAzKSB7CiAgICAgY29uc29sZS5sb2coJ1VzYWdlOiBwaGFudG9tanMgcGhhbnRvbWpzLXF1bml0LmpzIFVSTCcpOwogICAgIHBoYW50b20uZXhpdCgxKTsKIH0KQEAgLTYxLDIxICs2MywyMSBAQAogICAgIGNvbnNvbGUubG9nKG1zZyk7CiB9OwogCi1wYWdlLm9wZW4ocGhhbnRvbS5hcmdzWzBdLCBmdW5jdGlvbihzdGF0dXMpewotICAgIGlmIChzdGF0dXMgIT09ICJzdWNjZXNzIikgewotICAgICAgICBjb25zb2xlLmxvZygiVW5hYmxlIHRvIGFjY2VzcyBuZXR3b3JrIik7CitwYWdlLm9wZW4oc3lzdGVtLmFyZ3NbMV0sIGZ1bmN0aW9uKHN0YXR1cykgeworICAgIGlmIChzdGF0dXMgIT09ICdzdWNjZXNzJykgeworICAgICAgICBjb25zb2xlLmxvZygnVW5hYmxlIHRvIGFjY2VzcyBuZXR3b3JrJyk7CiAgICAgICAgIHBoYW50b20uZXhpdCgxKTsKICAgICB9IGVsc2UgewotICAgICAgICB3YWl0Rm9yKGZ1bmN0aW9uKCl7Ci0gICAgICAgICAgICByZXR1cm4gcGFnZS5ldmFsdWF0ZShmdW5jdGlvbigpeworICAgICAgICB3YWl0Rm9yKGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuIHBhZ2UuZXZhbHVhdGUoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgdmFyIGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3F1bml0LXRlc3RyZXN1bHQnKTsKICAgICAgICAgICAgICAgICBpZiAoZWwgJiYgZWwuaW5uZXJUZXh0Lm1hdGNoKCdjb21wbGV0ZWQnKSkgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0sIGZ1bmN0aW9uKCl7Ci0gICAgICAgICAgICB2YXIgZmFpbGVkTnVtID0gcGFnZS5ldmFsdWF0ZShmdW5jdGlvbigpeworICAgICAgICB9LCBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgIHZhciBmYWlsZWROdW0gPSBwYWdlLmV2YWx1YXRlKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgIHZhciBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdxdW5pdC10ZXN0cmVzdWx0Jyk7CiAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZWwuaW5uZXJUZXh0KTsKICAgICAgICAgICAgICAgICB0cnkgewpkaWZmIC0tZ2l0IGEvbGliL2pzL3Rlc3Qvc2VydmVyX2h0dHAuanMgYi9saWIvanMvdGVzdC9zZXJ2ZXJfaHR0cC5qcwppbmRleCBlMTk1ZTgwLi44MzgwYzNhIDEwMDY0NAotLS0gYS9saWIvanMvdGVzdC9zZXJ2ZXJfaHR0cC5qcworKysgYi9saWIvanMvdGVzdC9zZXJ2ZXJfaHR0cC5qcwpAQCAtMTcsMzMgKzE3LDM5IEBACiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0vL1RoaXMgSFRUUCBzZXJ2ZXIgaXMgZGVzaWduZWQgdG8gc2VydmUgdGhlIHRlc3QuaHRtbCBicm93c2VyCi0vLyAgYmFzZWQgSmF2YVNjcmlwdCB0ZXN0IHBhZ2UgKHdoaWNoIG11c3QgYmUgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5KS4gCisvLyAgVGhpcyBIVFRQIHNlcnZlciBpcyBkZXNpZ25lZCB0byBzZXJ2ZSB0aGUgdGVzdC5odG1sIGJyb3dzZXIKKy8vICBiYXNlZCBKYXZhU2NyaXB0IHRlc3QgcGFnZSAod2hpY2ggbXVzdCBiZSBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkpLgogLy8gIFRoaXMgc2VydmVyIGFsc28gc3VwcGxpZXMgdGhlIFRocmlmdCBiYXNlZCB0ZXN0IHNlcnZpY2UsIHdoaWNoIGRlcGVuZHMKIC8vICBvbiB0aGUgc3RhbmRhcmQgVGhyaWZ0VGVzdC50aHJpZnQgSURMIHNlcnZpY2UgKHdoaWNoIG11c3QgYmUgY29tcGlsZWQKIC8vICBmb3IgTm9kZSBhbmQgYnJvd3NlciBiYXNlZCBKYXZhU2NyaXB0IGluIC4vZ2VuLW5vZGVqcyBhbmQgLi9nZW4tanMKLS8vICByZXNwZWN0aXZlbHkpLiAKKy8vICByZXNwZWN0aXZlbHkpLgorLy8KKy8vICBVc2luZyB0aGUgY29tbWFuZCBmbGFnIC0tZXM2LCB0aGlzIHNlcnZlciBjYW4gYmUgcnVuIHVzaW5nIG5vZGVqcyBjb2RlIGJ1aWx0CisvLyAgZm9yIHRoZSBlczYgZW52aXJvbm1lbnQgb3IgZm9yIHByZS1lczYgZW52aXJvbm1lbnQuCisvLwogCi12YXIgdGhyaWZ0ID0gcmVxdWlyZSgnLi4vLi4vbm9kZWpzL2xpYi90aHJpZnQnKTsKLXZhciBUaHJpZnRUZXN0U3ZjID0gcmVxdWlyZSgnLi9nZW4tbm9kZWpzL1RocmlmdFRlc3QuanMnKTsKLXZhciBUaHJpZnRUZXN0SGFuZGxlciA9IHJlcXVpcmUoJy4vdGVzdF9oYW5kbGVyJykuVGhyaWZ0VGVzdEhhbmRsZXI7Citjb25zdCB0aHJpZnQgPSByZXF1aXJlKCcuLi8uLi9ub2RlanMvbGliL3RocmlmdCcpOworY29uc3QgZXM2TW9kZSA9IHByb2Nlc3MuYXJndi5pbmNsdWRlcygnLS1lczYnKTsKK2NvbnN0IGdlbkZvbGRlciA9IGVzNk1vZGUgPyAnZ2VuLW5vZGVqcy1lczYnIDogJ2dlbi1ub2RlanMnOworY29uc3QgVGhyaWZ0VGVzdFN2YyA9IHJlcXVpcmUoYC4vJHtnZW5Gb2xkZXJ9L1RocmlmdFRlc3QuanNgKTsKK2NvbnN0IFRocmlmdFRlc3RIYW5kbGVyID0gcmVxdWlyZSgnLi90ZXN0X2hhbmRsZXInKS5UaHJpZnRUZXN0SGFuZGxlcjsKIAotdmFyIFRocmlmdFRlc3RTdmNPcHQgPSB7Citjb25zdCBUaHJpZnRUZXN0U3ZjT3B0ID0gewogCXRyYW5zcG9ydDogdGhyaWZ0LlRCdWZmZXJlZFRyYW5zcG9ydCwKIAlwcm90b2NvbDogdGhyaWZ0LlRKU09OUHJvdG9jb2wsCiAJcHJvY2Vzc29yOiBUaHJpZnRUZXN0U3ZjLAogCWhhbmRsZXI6IFRocmlmdFRlc3RIYW5kbGVyCiB9OwogCi12YXIgVGhyaWZ0V2ViU2VydmVyT3B0aW9ucyA9IHsKLQlmaWxlczogIi4iLAorY29uc3QgVGhyaWZ0V2ViU2VydmVyT3B0aW9ucyA9IHsKKwlmaWxlczogX19kaXJuYW1lLAogCXNlcnZpY2VzOiB7Ci0JCSIvc2VydmljZSI6IFRocmlmdFRlc3RTdmNPcHQKKwkJJy9zZXJ2aWNlJzogVGhyaWZ0VGVzdFN2Y09wdAogCX0KIH07CiAKLXZhciBzZXJ2ZXIgPSB0aHJpZnQuY3JlYXRlV2ViU2VydmVyKFRocmlmdFdlYlNlcnZlck9wdGlvbnMpOwotdmFyIHBvcnQgPSA4MDg4OworY29uc3Qgc2VydmVyID0gdGhyaWZ0LmNyZWF0ZVdlYlNlcnZlcihUaHJpZnRXZWJTZXJ2ZXJPcHRpb25zKTsKK2NvbnN0IHBvcnQgPSBlczZNb2RlID8gODA4OCA6IDgwODk7CiBzZXJ2ZXIubGlzdGVuKHBvcnQpOwotY29uc29sZS5sb2coIlNlcnZpbmcgZmlsZXMgZnJvbTogIiArIF9fZGlybmFtZSk7Ci1jb25zb2xlLmxvZygiSHR0cC9UaHJpZnQgU2VydmVyIHJ1bm5pbmcgb24gcG9ydDogIiArIHBvcnQpOworY29uc29sZS5sb2coYFNlcnZpbmcgZmlsZXMgZnJvbTogJHtfX2Rpcm5hbWV9YCk7Citjb25zb2xlLmxvZyhgSHR0cC9UaHJpZnQgU2VydmVyIChFUzYgbW9kZSAke2VzNk1vZGV9KSBydW5uaW5nIG9uIHBvcnQ6ICR7cG9ydH1gKTsKZGlmZiAtLWdpdCBhL2xpYi9qcy90ZXN0L3NlcnZlcl9odHRwcy5qcyBiL2xpYi9qcy90ZXN0L3NlcnZlcl9odHRwcy5qcwppbmRleCBhZjE3NDViLi4xYTE3MWRkIDEwMDY0NAotLS0gYS9saWIvanMvdGVzdC9zZXJ2ZXJfaHR0cHMuanMKKysrIGIvbGliL2pzL3Rlc3Qvc2VydmVyX2h0dHBzLmpzCkBAIC0xOCw3ICsxOCw3IEBACiAgKi8KIAogLy9UaGlzIEhUVFAgc2VydmVyIGlzIGRlc2lnbmVkIHRvIHNlcnZlciB0aGUgdGVzdC5odG1sIGJyb3dzZXIKLS8vICBiYXNlZCBKYXZhU2NyaXB0IHRlc3QgcGFnZSAod2hpY2ggbXVzdCBiZSBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkpLiAKKy8vICBiYXNlZCBKYXZhU2NyaXB0IHRlc3QgcGFnZSAod2hpY2ggbXVzdCBiZSBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkpLgogLy8gIFRoaXMgc2VydmVyIGFsc28gc3VwcGxpZXMgdGhlIFRocmlmdCBiYXNlZCB0ZXN0IHNlcnZpY2UsIHdoaWNoIGRlcGVuZHMKIC8vICBvbiB0aGUgc3RhbmRhcmQgVGhyaWZ0VGVzdC50aHJpZnQgSURMIHNlcnZpY2UgKHdoaWNoIG11c3QgYmUgY29tcGlsZWQKIC8vICBmb3IgTm9kZSBhbmQgYnJvd3NlciBiYXNlZCBKYXZhU2NyaXB0IGluIC4vZ2VuLW5vZGVqcyBhbmQgLi9nZW4tanMKQEAgLTI2LDMyICsyNiwzNCBAQAogLy8gIHN1cHBvcnQgbGlicmFyaWVzIGZvciB0ZXN0Lmh0bWwgKGpxdWVyeS5qcywgcXVuaXQuanMgYW5kIHF1bml0LmNzcwogLy8gIGluIC4vYnVpbGQvanMvbGliKS4KIAotdmFyIGZzID0gcmVxdWlyZSgiZnMiKTsKLXZhciB0aHJpZnQgPSByZXF1aXJlKCcuLi8uLi9ub2RlanMvbGliL3RocmlmdCcpOwotdmFyIFRocmlmdFRlc3RTdmMgPSByZXF1aXJlKCcuL2dlbi1ub2RlanMvVGhyaWZ0VGVzdC5qcycpOwotdmFyIFRocmlmdFRlc3RIYW5kbGVyID0gcmVxdWlyZSgnLi90ZXN0X2hhbmRsZXInKS5UaHJpZnRUZXN0SGFuZGxlcjsKK2NvbnN0IGZzID0gcmVxdWlyZSgnZnMnKTsKK2NvbnN0IHRocmlmdCA9IHJlcXVpcmUoJy4uLy4uL25vZGVqcy9saWIvdGhyaWZ0Jyk7Citjb25zdCBlczZNb2RlID0gcHJvY2Vzcy5hcmd2LmluY2x1ZGVzKCctLWVzNicpOworY29uc3QgZ2VuRm9sZGVyID0gZXM2TW9kZSA/ICdnZW4tbm9kZWpzLWVzNicgOiAnZ2VuLW5vZGVqcyc7Citjb25zdCBUaHJpZnRUZXN0U3ZjID0gcmVxdWlyZShgLi8ke2dlbkZvbGRlcn0vVGhyaWZ0VGVzdC5qc2ApOworY29uc3QgVGhyaWZ0VGVzdEhhbmRsZXIgPSByZXF1aXJlKCcuL3Rlc3RfaGFuZGxlcicpLlRocmlmdFRlc3RIYW5kbGVyOwogCiAvL1NldHVwIHRoZSBJL08gc3RhY2sgb3B0aW9ucyBmb3IgdGhlIFRocmlmdFRlc3Qgc2VydmljZQotdmFyIFRocmlmdFRlc3RTdmNPcHQgPSB7Citjb25zdCBUaHJpZnRUZXN0U3ZjT3B0ID0gewogICB0cmFuc3BvcnQ6IHRocmlmdC5UQnVmZmVyZWRUcmFuc3BvcnQsCiAgIHByb3RvY29sOiB0aHJpZnQuVEpTT05Qcm90b2NvbCwKICAgcHJvY2Vzc29yOiBUaHJpZnRUZXN0U3ZjLAogICBoYW5kbGVyOiBUaHJpZnRUZXN0SGFuZGxlcgogfTsKIAotdmFyIFRocmlmdFdlYlNlcnZlck9wdGlvbnMgPSB7Ci0gIGZpbGVzOiAiLiIsCitjb25zdCBUaHJpZnRXZWJTZXJ2ZXJPcHRpb25zID0geworICBmaWxlczogX19kaXJuYW1lLAogICB0bHM6IHsKLSAgICAga2V5OiBmcy5yZWFkRmlsZVN5bmMoIi4uLy4uLy4uL3Rlc3Qva2V5cy9zZXJ2ZXIua2V5IiksCi0gICAgIGNlcnQ6IGZzLnJlYWRGaWxlU3luYygiLi4vLi4vLi4vdGVzdC9rZXlzL3NlcnZlci5jcnQiKQotICB9LAkKKyAgICAga2V5OiBmcy5yZWFkRmlsZVN5bmMoJy4uLy4uLy4uL3Rlc3Qva2V5cy9zZXJ2ZXIua2V5JyksCisgICAgIGNlcnQ6IGZzLnJlYWRGaWxlU3luYygnLi4vLi4vLi4vdGVzdC9rZXlzL3NlcnZlci5jcnQnKQorICB9LAogICBzZXJ2aWNlczogewotICAgICIvc2VydmljZSI6IFRocmlmdFRlc3RTdmNPcHQKKyAgICAnL3NlcnZpY2UnOiBUaHJpZnRUZXN0U3ZjT3B0CiAgIH0KIH07CiAKLXZhciBzZXJ2ZXIgPSB0aHJpZnQuY3JlYXRlV2ViU2VydmVyKFRocmlmdFdlYlNlcnZlck9wdGlvbnMpOwotdmFyIHBvcnQgPSA4MDg5OworY29uc3Qgc2VydmVyID0gdGhyaWZ0LmNyZWF0ZVdlYlNlcnZlcihUaHJpZnRXZWJTZXJ2ZXJPcHRpb25zKTsKK2NvbnN0IHBvcnQgPSBlczZNb2RlID8gODA5MCA6IDgwOTE7CiBzZXJ2ZXIubGlzdGVuKHBvcnQpOwotY29uc29sZS5sb2coIlNlcnZpbmcgZmlsZXMgZnJvbTogIiArIF9fZGlybmFtZSk7Ci1jb25zb2xlLmxvZygiSHR0cC9UaHJpZnQgU2VydmVyIHJ1bm5pbmcgb24gcG9ydDogIiArIHBvcnQpOworY29uc29sZS5sb2coYFNlcnZpbmcgZmlsZXMgZnJvbTogJHtfX2Rpcm5hbWV9YCk7Citjb25zb2xlLmxvZyhgSHR0cC9UaHJpZnQgU2VydmVyIChFUzYgbW9kZSAke2VzNk1vZGV9KSBydW5uaW5nIG9uIHBvcnQ6ICR7cG9ydH1gKTsKZGlmZiAtLWdpdCBhL2xpYi9qcy90ZXN0L3NyYy90ZXN0L0h0dHBkLmphdmEgYi9saWIvanMvdGVzdC9zcmMvdGVzdC9IdHRwZC5qYXZhCmluZGV4IGYxMjkxZDguLmU0ZmMwY2MgMTAwNjQ0Ci0tLSBhL2xpYi9qcy90ZXN0L3NyYy90ZXN0L0h0dHBkLmphdmEKKysrIGIvbGliL2pzL3Rlc3Qvc3JjL3Rlc3QvSHR0cGQuamF2YQpAQCAtMTgzLDE2ICsxODMsMTggQEAKIAogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAKLQkJICAgIFN0cmluZyBtaW1lVHlwZSA9ICJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iOwotCQkgICAgTWltZVV0aWwyIG1pbWVVdGlsID0gbmV3IE1pbWVVdGlsMigpOwotCQkgICAgbWltZVV0aWwucmVnaXN0ZXJNaW1lRGV0ZWN0b3IoRXh0ZW5zaW9uTWltZURldGVjdG9yLmNsYXNzLmdldE5hbWUoKSk7Ci0JCSAgICBDb2xsZWN0aW9uPE1pbWVUeXBlPiBjb2xsZWN0aW9uID0gbWltZVV0aWwuZ2V0TWltZVR5cGVzKGZpbGUpOwotCQkgICAgSXRlcmF0b3I8TWltZVR5cGU+IGl0ZXJhdG9yID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOwotCQkgICAgd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlNaW1lVHlwZSBtdCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCW1pbWVUeXBlID0gIG10LmdldE1lZGlhVHlwZSgpICsgIi8iICsgbXQuZ2V0U3ViVHlwZSgpOwotCQkJYnJlYWs7Ci0JCSAgICB9CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtaW1lVHlwZSA9ICJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iOworICAgICAgICAgICAgICAgICAgICBNaW1lVXRpbDIgbWltZVV0aWwgPSBuZXcgTWltZVV0aWwyKCk7CisgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgICAgICAgICAgICAgbWltZVV0aWwucmVnaXN0ZXJNaW1lRGV0ZWN0b3IoRXh0ZW5zaW9uTWltZURldGVjdG9yLmNsYXNzLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbjxNaW1lVHlwZT4gY29sbGVjdGlvbiA9IG1pbWVVdGlsLmdldE1pbWVUeXBlcyhmaWxlKTsKKyAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3I8TWltZVR5cGU+IGl0ZXJhdG9yID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOworICAgICAgICAgICAgICAgICAgICB3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1pbWVUeXBlIG10ID0gaXRlcmF0b3IubmV4dCgpOworICAgICAgICAgICAgICAgICAgICAgICAgbWltZVR5cGUgPSAgbXQuZ2V0TWVkaWFUeXBlKCkgKyAiLyIgKyBtdC5nZXRTdWJUeXBlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldFN0YXR1c0NvZGUoSHR0cFN0YXR1cy5TQ19PSyk7CiAgICAgICAgICAgICAgICAgICAgIEZpbGVFbnRpdHkgYm9keSA9IG5ldyBGaWxlRW50aXR5KGZpbGUsIG1pbWVUeXBlKTsKZGlmZiAtLWdpdCBhL2xpYi9qcy90ZXN0L3Rlc3QtYXN5bmMuanMgYi9saWIvanMvdGVzdC90ZXN0LWFzeW5jLmpzCmluZGV4IDQ5MzVmZWEuLjhjNmIxM2UgMTAwNjQ0Ci0tLSBhL2xpYi9qcy90ZXN0L3Rlc3QtYXN5bmMuanMKKysrIGIvbGliL2pzL3Rlc3QvdGVzdC1hc3luYy5qcwpAQCAtMTcsOSArMTcsOSBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KICAvKiBqc2hpbnQgLVcxMDAgKi8KLSAKKwogLyoKLSAqIEZ1bGx5IEFzeW5jIEphdmFTY3JpcHQgdGVzdCBzdWl0ZSBmb3IgVGhyaWZ0VGVzdC50aHJpZnQuIAorICogRnVsbHkgQXN5bmMgSmF2YVNjcmlwdCB0ZXN0IHN1aXRlIGZvciBUaHJpZnRUZXN0LnRocmlmdC4KICAqIFRoZXNlIHRlc3RzIGFyZSBkZXNpZ25lZCB0byBleGVyY2lzZSB0aGUgV2ViU29ja2V0IHRyYW5zcG9ydAogICogKHdoaWNoIGlzIGV4Y2x1c2l2ZWx5IGFzeW5jKS4KICAqCkBAIC0zMCwzMTggKzMwLDM0MSBAQAogCiAKIC8vIGFsbCBMYW5ndWFnZXMgaW4gVVRGLTgKLXZhciBzdHJpbmdUZXN0ID0gIkFmcmlrYWFucywgQWxlbWFubmlzY2gsIEFyYWdvbsOpcywg2KfZhNi52LHYqNmK2KksINmF2LXYsdmJLCBBc3R1cmlhbnUsIEF5bWFyIGFydSwgQXrJmXJiYXljYW4sINCR0LDRiNKh0L7RgNGCLCBCb2FyaXNjaCwgxb1lbWFpdMSXxaFrYSwg0JHQtdC70LDRgNGD0YHQutCw0Y8sINCR0LXQu9Cw0YDRg9GB0LrQsNGPICjRgtCw0YDQsNGI0LrQtdCy0ZbRhtCwKSwg0JHRitC70LPQsNGA0YHQutC4LCBCYW1hbmFua2FuLCDgpqzgpr7gpoLgprLgpr4sIEJyZXpob25lZywgQm9zYW5za2ksIENhdGFsw6AsIE3DrG5nLWTElcykbmctbmfhubPMhCwg0J3QvtGF0YfQuNC50L0sIENlYnVhbm8sIOGPo+GOs+GOqSwgxIxlc2t5LCDQodC70L7QstGjzIHQvdGM0YHQutGKIC8g4rCU4rCO4rCR4rCC4rCh4rCQ4rCg4rCU4rCN4rCfLCDQp9OR0LLQsNGI0LvQsCwgQ3ltcmFlZywgRGFuc2ssIFphemFraSwg3oveqN6I3qzegN6o3oTept6Q3rAsIM6VzrvOu863zr3Ouc66zqwsIEVtaWxpw6BuIGUgcnVtYWduw7JsLCBFbmdsaXNoLCBFc3BlcmFudG8sIEVzcGHDsW9sLCBFZXN0aSwgRXVza2FyYSwg2YHYp9ix2LPbjCwgU3VvbWksIFbDtXJvLCBGw7hyb3lza3QsIEZyYW7Dp2FpcywgQXJwZXRhbiwgRnVybGFuLCBGcnlzaywgR2FlaWxnZSwg6LSb6KqeLCBHw6BpZGhsaWcsIEdhbGVnbywgQXZhw7FlJ+G6vSwg4KqX4KuB4Kqc4Kqw4Kq+4Kqk4KuALCBHYWVsZywg16LXkdeo15nXqiwg4KS54KS/4KSo4KWN4KSm4KWALCBGaWppIEhpbmRpLCBIcnZhdHNraSwgS3JlecOybCBheWlzeWVuLCBNYWd5YXIsINWA1aHVtdWl1oDVpdW2LCBJbnRlcmxpbmd1YSwgQmFoYXNhIEluZG9uZXNpYSwgSWxva2FubywgSWRvLCDDjXNsZW5za2EsIEl0YWxpYW5vLCDml6XmnKzoqp4sIExvamJhbiwgQmFzYSBKYXdhLCDhg6Xhg5Dhg6Dhg5fhg6Phg5rhg5gsIEtvbmdvLCBLYWxhYWxsaXN1dCwg4LKV4LKo4LON4LKo4LKhLCDtlZzqta3slrQsINCa0YrQsNGA0LDRh9Cw0Lkt0JzQsNC70LrRitCw0YAsIFJpcG9hcmlzY2gsIEt1cmTDriwg0JrQvtC80LgsIEtlcm5ld2VrLCDQmtGL0YDQs9GL0LfRh9CwLCBMYXRpbmEsIExhZGlubywgTMOrdHplYnVlcmdlc2NoLCBMaW1idXJncywgTGluZ8OhbGEsIOC6peC6suC6pywgTGlldHV2acWzLCBMYXR2aWXFoXUsIEJhc2EgQmFueXVtYXNhbiwgTWFsYWdhc3ksINCc0LDQutC10LTQvtC90YHQutC4LCDgtK7gtLLgtK/gtL7gtLPgtIIsIOCkruCksOCkvuCkoOClgCwgQmFoYXNhIE1lbGF5dSwg2YXYp9iy2ZDYsdmI2YbbjCwgTm5hcHVsaXRhbm8sIE5lZGVyc2Frc2lzY2gsIOCkqOClh+CkquCkvuCksiDgpK3gpL7gpLfgpL4sIE5lZGVybGFuZHMsIOKAqk5vcnNrIChueW5vcnNrKeKArCwg4oCqTm9yc2sgKGJva23DpWwp4oCsLCBOb3Vvcm1hbmQsIERpbsOpIGJpemFhZCwgT2NjaXRhbiwg0JjRgNC+0L3QsNGDLCBQYXBpYW1lbnR1LCBEZWl0c2NoLCBOb3JmdWsgLyBQaXRrZXJuLCBQb2xza2ksINm+2YbYrNin2KjbjCwg2b7amtiq2YgsIFBvcnR1Z3XDqnMsIFJ1bmEgU2ltaSwgUnVtYW50c2NoLCBSb21hbmksIFJvbcOibsSDLCDQoNGD0YHRgdC60LjQuSwg0KHQsNGF0LAg0YLRi9C70LAsIFNhcmR1LCBTaWNpbGlhbnUsIFNjb3RzLCBTw6FtZWdpZWxsYSwgU2ltcGxlIEVuZ2xpc2gsIFNsb3ZlbsSNaW5hLCBTbG92ZW7FocSNaW5hLCDQodGA0L/RgdC60LggLyBTcnBza2ksIFNlZWx0ZXJzaywgU3ZlbnNrYSwgS2lzd2FoaWxpLCDgrqTgrq7grr/grrTgr40sIOCwpOCxhuCwsuCxgeCwl+CxgSwg0KLQvtK30LjQutOjLCDguYTguJfguKIsIFTDvHJrbWVuw6dlLCBUYWdhbG9nLCBUw7xya8OnZSwg0KLQsNGC0LDRgNGH0LAvVGF0YXLDp2EsINCj0LrRgNCw0ZfQvdGB0YzQutCwLCDYp9ix2K/ZiCwgVGnhur9uZyBWaeG7h3QsIFZvbGFww7xrLCBXYWxvbiwgV2luYXJheSwg5ZC06K+tLCBpc2lYaG9zYSwg15nXmda015PXmdepLCBZb3LDuWLDoSwgWmXDqnV3cywg5Lit5paHLCBCw6JuLWzDom0tZ8O6LCDnsrXoqp4iOwotICAKLWZ1bmN0aW9uIGNoZWNrUmVjdXJzaXZlbHkobWFwMSwgbWFwMikgeworY29uc3Qgc3RyaW5nVGVzdCA9ICJBZnJpa2FhbnMsIEFsZW1hbm5pc2NoLCBBcmFnb27DqXMsINin2YTYudix2KjZitipLCDZhdi12LHZiSwgQXN0dXJpYW51LCBBeW1hciBhcnUsIEF6yZlyYmF5Y2FuLCDQkdCw0YjSodC+0YDRgiwgQm9hcmlzY2gsIMW9ZW1haXTEl8Wha2EsINCR0LXQu9Cw0YDRg9GB0LrQsNGPLCDQkdC10LvQsNGA0YPRgdC60LDRjyAo0YLQsNGA0LDRiNC60LXQstGW0YbQsCksINCR0YrQu9Cz0LDRgNGB0LrQuCwgQmFtYW5hbmthbiwg4Kas4Ka+4KaC4Kay4Ka+LCBCcmV6aG9uZWcsIEJvc2Fuc2tpLCBDYXRhbMOgLCBNw6xuZy1kxJXMpG5nLW5n4bmzzIQsINCd0L7RhdGH0LjQudC9LCBDZWJ1YW5vLCDhj6PhjrPhjqksIMSMZXNreSwg0KHQu9C+0LLRo8yB0L3RjNGB0LrRiiAvIOKwlOKwjuKwkeKwguKwoeKwkOKwoOKwlOKwjeKwnywg0KfTkdCy0LDRiNC70LAsIEN5bXJhZWcsIERhbnNrLCBaYXpha2ksIN6L3qjeiN6s3oDeqN6E3qbekN6wLCDOlc67zrvOt869zrnOus6sLCBFbWlsacOgbiBlIHJ1bWFnbsOybCwgRW5nbGlzaCwgRXNwZXJhbnRvLCBFc3Bhw7FvbCwgRWVzdGksIEV1c2thcmEsINmB2KfYsdiz24wsIFN1b21pLCBWw7VybywgRsO4cm95c2t0LCBGcmFuw6dhaXMsIEFycGV0YW4sIEZ1cmxhbiwgRnJ5c2ssIEdhZWlsZ2UsIOi0m+iqniwgR8OgaWRobGlnLCBHYWxlZ28sIEF2YcOxZSfhur0sIOCql+CrgeCqnOCqsOCqvuCqpOCrgCwgR2FlbGcsINei15HXqNeZ16osIOCkueCkv+CkqOCljeCkpuClgCwgRmlqaSBIaW5kaSwgSHJ2YXRza2ksIEtyZXnDsmwgYXlpc3llbiwgTWFneWFyLCDVgNWh1bXVpdaA1aXVtiwgSW50ZXJsaW5ndWEsIEJhaGFzYSBJbmRvbmVzaWEsIElsb2thbm8sIElkbywgw41zbGVuc2thLCBJdGFsaWFubywg5pel5pys6KqeLCBMb2piYW4sIEJhc2EgSmF3YSwg4YOl4YOQ4YOg4YOX4YOj4YOa4YOYLCBLb25nbywgS2FsYWFsbGlzdXQsIOCyleCyqOCzjeCyqOCyoSwg7ZWc6rWt7Ja0LCDQmtGK0LDRgNCw0YfQsNC5LdCc0LDQu9C60YrQsNGALCBSaXBvYXJpc2NoLCBLdXJkw64sINCa0L7QvNC4LCBLZXJuZXdlaywg0JrRi9GA0LPRi9C30YfQsCwgTGF0aW5hLCBMYWRpbm8sIEzDq3R6ZWJ1ZXJnZXNjaCwgTGltYnVyZ3MsIExpbmfDoWxhLCDguqXgurLguqcsIExpZXR1dmnFsywgTGF0dmllxaF1LCBCYXNhIEJhbnl1bWFzYW4sIE1hbGFnYXN5LCDQnNCw0LrQtdC00L7QvdGB0LrQuCwg4LSu4LSy4LSv4LS+4LSz4LSCLCDgpK7gpLDgpL7gpKDgpYAsIEJhaGFzYSBNZWxheXUsINmF2KfYstmQ2LHZiNmG24wsIE5uYXB1bGl0YW5vLCBOZWRlcnNha3Npc2NoLCDgpKjgpYfgpKrgpL7gpLIg4KSt4KS+4KS34KS+LCBOZWRlcmxhbmRzLCDigKpOb3JzayAobnlub3JzaynigKwsIOKAqk5vcnNrIChib2ttw6VsKeKArCwgTm91b3JtYW5kLCBEaW7DqSBiaXphYWQsIE9jY2l0YW4sINCY0YDQvtC90LDRgywgUGFwaWFtZW50dSwgRGVpdHNjaCwgTm9yZnVrIC8gUGl0a2VybiwgUG9sc2tpLCDZvtmG2KzYp9io24wsINm+2prYqtmILCBQb3J0dWd1w6pzLCBSdW5hIFNpbWksIFJ1bWFudHNjaCwgUm9tYW5pLCBSb23Dom7Egywg0KDRg9GB0YHQutC40LksINCh0LDRhdCwINGC0YvQu9CwLCBTYXJkdSwgU2ljaWxpYW51LCBTY290cywgU8OhbWVnaWVsbGEsIFNpbXBsZSBFbmdsaXNoLCBTbG92ZW7EjWluYSwgU2xvdmVuxaHEjWluYSwg0KHRgNC/0YHQutC4IC8gU3Jwc2tpLCBTZWVsdGVyc2ssIFN2ZW5za2EsIEtpc3dhaGlsaSwg4K6k4K6u4K6/4K604K+NLCDgsKTgsYbgsLLgsYHgsJfgsYEsINCi0L7St9C40LrToywg4LmE4LiX4LiiLCBUw7xya21lbsOnZSwgVGFnYWxvZywgVMO8cmvDp2UsINCi0LDRgtCw0YDRh9CwL1RhdGFyw6dhLCDQo9C60YDQsNGX0L3RgdGM0LrQsCwg2KfYsdiv2YgsIFRp4bq/bmcgVmnhu4d0LCBWb2xhcMO8aywgV2Fsb24sIFdpbmFyYXksIOWQtOivrSwgaXNpWGhvc2EsINeZ15nWtNeT15nXqSwgWW9yw7liw6EsIFplw6p1d3MsIOS4reaWhywgQsOibi1sw6JtLWfDuiwg57K16KqeIjsKKworZnVuY3Rpb24gY2hlY2tSZWN1cnNpdmVseShhc3NlcnQsIG1hcDEsIG1hcDIpIHsKICAgaWYgKHR5cGVvZiBtYXAxICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBtYXAyICE9PSAnZnVuY3Rpb24nKSB7CiAgICAgaWYgKCFtYXAxIHx8IHR5cGVvZiBtYXAxICE9PSAnb2JqZWN0JykgewotICAgICAgICBlcXVhbChtYXAxLCBtYXAyKTsKKyAgICAgICAgYXNzZXJ0LmVxdWFsKG1hcDEsIG1hcDIpOwogICAgIH0gZWxzZSB7Ci0gICAgICBmb3IgKHZhciBrZXkgaW4gbWFwMSkgewotICAgICAgICBjaGVja1JlY3Vyc2l2ZWx5KG1hcDFba2V5XSwgbWFwMltrZXldKTsKKyAgICAgIGZvciAobGV0IGtleSBpbiBtYXAxKSB7CisgICAgICAgIGNoZWNrUmVjdXJzaXZlbHkoYXNzZXJ0LCBtYXAxW2tleV0sIG1hcDJba2V5XSk7CiAgICAgICB9CiAgICAgfQogICB9CiB9CiAKLW1vZHVsZSgiQmFzZSBUeXBlcyIpOworUVVuaXQubW9kdWxlKCdCYXNlIFR5cGVzJyk7CiAKLSAgYXN5bmNUZXN0KCJWb2lkIiwgZnVuY3Rpb24oKSB7Ci0gICAgZXhwZWN0KCAxICk7CisgIFFVbml0LnRlc3QoJ1ZvaWQnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXhwZWN0KDEpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKICAgICBjbGllbnQudGVzdFZvaWQoZnVuY3Rpb24ocmVzdWx0KSB7Ci0gICAgICBlcXVhbChyZXN1bHQsIHVuZGVmaW5lZCk7Ci0gICAgICBRVW5pdC5zdGFydCgpOworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgdW5kZWZpbmVkKTsKKyAgICAgIGRvbmUoKTsKICAgICB9KTsKICAgfSk7Ci0gIAotICAKLSAgYXN5bmNUZXN0KCJTdHJpbmciLCBmdW5jdGlvbigpIHsKLSAgICBleHBlY3QoIDMgKTsKLSAgICBRVW5pdC5zdG9wKDIpOwotICAgIGNsaWVudC50ZXN0U3RyaW5nKCcnLCBmdW5jdGlvbihyZXN1bHQpewotICAgICAgIGVxdWFsKHJlc3VsdCwgJycpOwotICAgICAgIFFVbml0LnN0YXJ0KCk7CisKKworICBRVW5pdC50ZXN0KCdTdHJpbmcnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXhwZWN0KDMpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoMyk7CisgICAgY2xpZW50LnRlc3RTdHJpbmcoJycsIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsICcnKTsKKyAgICAgICBkb25lKCk7CiAgICAgfSk7Ci0gICAgY2xpZW50LnRlc3RTdHJpbmcoc3RyaW5nVGVzdCwgZnVuY3Rpb24ocmVzdWx0KXsKLSAgICAgICBlcXVhbChyZXN1bHQsIHN0cmluZ1Rlc3QpOwotICAgICAgIFFVbml0LnN0YXJ0KCk7CisgICAgY2xpZW50LnRlc3RTdHJpbmcoc3RyaW5nVGVzdCwgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgc3RyaW5nVGVzdCk7CisgICAgICAgZG9uZSgpOwogICAgIH0pOwogCi0gICAgdmFyIHNwZWNpYWxDaGFyYWN0ZXJzID0gJ3F1b3RlOiBcIiBiYWNrc2xhc2g6JyArCisgICAgY29uc3Qgc3BlY2lhbENoYXJhY3RlcnMgPSAncXVvdGU6IFwiIGJhY2tzbGFzaDonICsKICAgICAgICAgICAnIGZvcndhcmRzbGFzaC1lc2NhcGVkOiBcLyAnICsKICAgICAgICAgICAnIGJhY2tzcGFjZTogXGIgZm9ybWZlZWQ6IFxmIG5ld2xpbmU6IFxuIHJldHVybjogXHIgdGFiOiAnICsKICAgICAgICAgICAnIG5vdy1hbGwtb2YtdGhlbS10b2dldGhlcjogIlxcXC9cYlxuXHJcdCcgKwogICAgICAgICAgICcgbm93LWEtYnVuY2gtb2YtanVuazogIUAjJCUmKCkoJiUkI3t9e308Pjw+PCc7Ci0gICAgY2xpZW50LnRlc3RTdHJpbmcoc3BlY2lhbENoYXJhY3RlcnMsIGZ1bmN0aW9uKHJlc3VsdCl7Ci0gICAgICAgZXF1YWwocmVzdWx0LCBzcGVjaWFsQ2hhcmFjdGVycyk7Ci0gICAgICAgUVVuaXQuc3RhcnQoKTsKKyAgICBjbGllbnQudGVzdFN0cmluZyhzcGVjaWFsQ2hhcmFjdGVycywgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgc3BlY2lhbENoYXJhY3RlcnMpOworICAgICAgIGRvbmUoKTsKICAgICB9KTsKICAgfSk7Ci0gIGFzeW5jVGVzdCgiRG91YmxlIiwgZnVuY3Rpb24oKSB7Ci0gICAgZXhwZWN0KCA0ICk7Ci0gICAgUVVuaXQuc3RvcCgzKTsKLSAgICBjbGllbnQudGVzdERvdWJsZSgwLCBmdW5jdGlvbihyZXN1bHQpewotICAgICAgIGVxdWFsKHJlc3VsdCwgMCk7Ci0gICAgICAgUVVuaXQuc3RhcnQoKTsKKyAgUVVuaXQudGVzdCgnRG91YmxlJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmV4cGVjdCg0KTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKDQpOworICAgIGNsaWVudC50ZXN0RG91YmxlKDAsIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIDApOworICAgICAgIGRvbmUoKTsKICAgICB9KTsKLSAgICBjbGllbnQudGVzdERvdWJsZSgtMSwgZnVuY3Rpb24ocmVzdWx0KXsKLSAgICAgICBlcXVhbChyZXN1bHQsIC0xKTsKLSAgICAgICBRVW5pdC5zdGFydCgpOworICAgIGNsaWVudC50ZXN0RG91YmxlKC0xLCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCAtMSk7CisgICAgICAgZG9uZSgpOwogICAgIH0pOwotICAgIGNsaWVudC50ZXN0RG91YmxlKDMuMTQsIGZ1bmN0aW9uKHJlc3VsdCl7Ci0gICAgICAgZXF1YWwocmVzdWx0LCAzLjE0KTsKLSAgICAgICBRVW5pdC5zdGFydCgpOworICAgIGNsaWVudC50ZXN0RG91YmxlKDMuMTQsIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIDMuMTQpOworICAgICAgIGRvbmUoKTsKICAgICB9KTsKLSAgICBjbGllbnQudGVzdERvdWJsZShNYXRoLnBvdygyLDYwKSwgZnVuY3Rpb24ocmVzdWx0KXsKLSAgICAgICBlcXVhbChyZXN1bHQsIE1hdGgucG93KDIsNjApKTsKLSAgICAgICBRVW5pdC5zdGFydCgpOworICAgIGNsaWVudC50ZXN0RG91YmxlKE1hdGgucG93KDIsIDYwKSwgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgTWF0aC5wb3coMiwgNjApKTsKKyAgICAgICBkb25lKCk7CiAgICAgfSk7CiAgIH0pOwotICBhc3luY1Rlc3QoIkJ5dGUiLCBmdW5jdGlvbigpIHsKLSAgICBleHBlY3QoIDIgKTsKLSAgICBRVW5pdC5zdG9wKCk7CisgIC8vIFRPRE86IGFkZCB0ZXN0QmluYXJ5KCkKKyAgUVVuaXQudGVzdCgnQnl0ZScsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoMik7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygyKTsKICAgICBjbGllbnQudGVzdEJ5dGUoMCwgZnVuY3Rpb24ocmVzdWx0KSB7Ci0gICAgICAgZXF1YWwocmVzdWx0LCAwKTsKLSAgICAgICBRVW5pdC5zdGFydCgpOworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIDApOworICAgICAgIGRvbmUoKTsKICAgICB9KTsKICAgICBjbGllbnQudGVzdEJ5dGUoMHgwMSwgZnVuY3Rpb24ocmVzdWx0KSB7Ci0gICAgICAgZXF1YWwocmVzdWx0LCAweDAxKTsKLSAgICAgICBRVW5pdC5zdGFydCgpOworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIDB4MDEpOworICAgICAgIGRvbmUoKTsKICAgICB9KTsKICAgfSk7Ci0gIGFzeW5jVGVzdCgiSTMyIiwgZnVuY3Rpb24oKSB7Ci0gICAgZXhwZWN0KCAzICk7Ci0gICAgUVVuaXQuc3RvcCgyKTsKLSAgICBjbGllbnQudGVzdEkzMigwLCBmdW5jdGlvbihyZXN1bHQpewotICAgICAgIGVxdWFsKHJlc3VsdCwgMCk7Ci0gICAgICAgUVVuaXQuc3RhcnQoKTsKKyAgUVVuaXQudGVzdCgnSTMyJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmV4cGVjdCgzKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKDMpOworICAgIGNsaWVudC50ZXN0STMyKDAsIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIDApOworICAgICAgIGRvbmUoKTsKICAgICB9KTsKLSAgICBjbGllbnQudGVzdEkzMihNYXRoLnBvdygyLDMwKSwgZnVuY3Rpb24ocmVzdWx0KXsKLSAgICAgICBlcXVhbChyZXN1bHQsIE1hdGgucG93KDIsMzApKTsKLSAgICAgICBRVW5pdC5zdGFydCgpOworICAgIGNsaWVudC50ZXN0STMyKE1hdGgucG93KDIsIDMwKSwgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgTWF0aC5wb3coMiwgMzApKTsKKyAgICAgICBkb25lKCk7CiAgICAgfSk7Ci0gICAgY2xpZW50LnRlc3RJMzIoLU1hdGgucG93KDIsMzApLCBmdW5jdGlvbihyZXN1bHQpewotICAgICAgIGVxdWFsKHJlc3VsdCwgLU1hdGgucG93KDIsMzApKTsKLSAgICAgICBRVW5pdC5zdGFydCgpOworICAgIGNsaWVudC50ZXN0STMyKC1NYXRoLnBvdygyLCAzMCksIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIC1NYXRoLnBvdygyLCAzMCkpOworICAgICAgIGRvbmUoKTsKICAgICB9KTsKICAgfSk7Ci0gIGFzeW5jVGVzdCgiSTY0IiwgZnVuY3Rpb24oKSB7Ci0gICAgZXhwZWN0KCAzICk7Ci0gICAgUVVuaXQuc3RvcCgyKTsKLSAgICBjbGllbnQudGVzdEk2NCgwLCBmdW5jdGlvbihyZXN1bHQpewotICAgICAgIGVxdWFsKHJlc3VsdCwgMCk7Ci0gICAgICAgUVVuaXQuc3RhcnQoKTsKKyAgUVVuaXQudGVzdCgnSTY0JywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmV4cGVjdCgzKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKDMpOworICAgIGNsaWVudC50ZXN0STY0KDAsIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIDApOworICAgICAgIGRvbmUoKTsKICAgICB9KTsKICAgICAvL1RoaXMgaXMgdXN1YWxseSAyXjYwIGJ1dCBKUyBjYW5ub3QgcmVwcmVzZW50IGFueXRoaW5nIG92ZXIgMl41MiBhY2N1cmF0ZWx5Ci0gICAgY2xpZW50LnRlc3RJNjQoTWF0aC5wb3coMiw1MiksIGZ1bmN0aW9uKHJlc3VsdCl7Ci0gICAgICAgZXF1YWwocmVzdWx0LCBNYXRoLnBvdygyLDUyKSk7Ci0gICAgICAgUVVuaXQuc3RhcnQoKTsKKyAgICBjbGllbnQudGVzdEk2NChNYXRoLnBvdygyLCA1MiksIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIE1hdGgucG93KDIsIDUyKSk7CisgICAgICAgZG9uZSgpOwogICAgIH0pOwotICAgIGNsaWVudC50ZXN0STY0KC1NYXRoLnBvdygyLDUyKSwgZnVuY3Rpb24ocmVzdWx0KXsKLSAgICAgICBlcXVhbChyZXN1bHQsIC1NYXRoLnBvdygyLDUyKSk7Ci0gICAgICAgUVVuaXQuc3RhcnQoKTsKKyAgICBjbGllbnQudGVzdEk2NCgtTWF0aC5wb3coMiwgNTIpLCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCAtTWF0aC5wb3coMiwgNTIpKTsKKyAgICAgICBkb25lKCk7CiAgICAgfSk7CiAgIH0pOwotICAKIAotICAKIAotbW9kdWxlKCJTdHJ1Y3R1cmVkIFR5cGVzIik7CiAKLSAgYXN5bmNUZXN0KCJTdHJ1Y3QiLCBmdW5jdGlvbigpIHsKLSAgICBleHBlY3QoIDUgKTsKLSAgICB2YXIgc3RydWN0VGVzdElucHV0ID0gbmV3IFRocmlmdFRlc3QuWHRydWN0KCk7CisKK1FVbml0Lm1vZHVsZSgnU3RydWN0dXJlZCBUeXBlcycpOworCisgIFFVbml0LnRlc3QoJ1N0cnVjdCcsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoNSk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOworICAgIGNvbnN0IHN0cnVjdFRlc3RJbnB1dCA9IG5ldyBUaHJpZnRUZXN0Llh0cnVjdCgpOwogICAgIHN0cnVjdFRlc3RJbnB1dC5zdHJpbmdfdGhpbmcgPSAnd29ya2VkJzsKICAgICBzdHJ1Y3RUZXN0SW5wdXQuYnl0ZV90aGluZyA9IDB4MDE7Ci0gICAgc3RydWN0VGVzdElucHV0LmkzMl90aGluZyA9IE1hdGgucG93KDIsMzApOworICAgIHN0cnVjdFRlc3RJbnB1dC5pMzJfdGhpbmcgPSBNYXRoLnBvdygyLCAzMCk7CiAgICAgLy9UaGlzIGlzIHVzdWFsbHkgMl42MCBidXQgSlMgY2Fubm90IHJlcHJlc2VudCBhbnl0aGluZyBvdmVyIDJeNTIgYWNjdXJhdGVseQotICAgIHN0cnVjdFRlc3RJbnB1dC5pNjRfdGhpbmcgPSBNYXRoLnBvdygyLDUyKTsKKyAgICBzdHJ1Y3RUZXN0SW5wdXQuaTY0X3RoaW5nID0gTWF0aC5wb3coMiwgNTIpOwogCi0gICAgY2xpZW50LnRlc3RTdHJ1Y3Qoc3RydWN0VGVzdElucHV0LCBmdW5jdGlvbihyZXN1bHQpewotICAgICAgZXF1YWwocmVzdWx0LnN0cmluZ190aGluZywgc3RydWN0VGVzdElucHV0LnN0cmluZ190aGluZyk7Ci0gICAgICBlcXVhbChyZXN1bHQuYnl0ZV90aGluZywgc3RydWN0VGVzdElucHV0LmJ5dGVfdGhpbmcpOwotICAgICAgZXF1YWwocmVzdWx0LmkzMl90aGluZywgc3RydWN0VGVzdElucHV0LmkzMl90aGluZyk7Ci0gICAgICBlcXVhbChyZXN1bHQuaTY0X3RoaW5nLCBzdHJ1Y3RUZXN0SW5wdXQuaTY0X3RoaW5nKTsKLSAgICAgIGVxdWFsKEpTT04uc3RyaW5naWZ5KHJlc3VsdCksIEpTT04uc3RyaW5naWZ5KHN0cnVjdFRlc3RJbnB1dCkpOwotICAgICAgUVVuaXQuc3RhcnQoKTsgICAgICAKKyAgICBjbGllbnQudGVzdFN0cnVjdChzdHJ1Y3RUZXN0SW5wdXQsIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdC5zdHJpbmdfdGhpbmcsIHN0cnVjdFRlc3RJbnB1dC5zdHJpbmdfdGhpbmcpOworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdC5ieXRlX3RoaW5nLCBzdHJ1Y3RUZXN0SW5wdXQuYnl0ZV90aGluZyk7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LmkzMl90aGluZywgc3RydWN0VGVzdElucHV0LmkzMl90aGluZyk7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0Lmk2NF90aGluZywgc3RydWN0VGVzdElucHV0Lmk2NF90aGluZyk7CisgICAgICBhc3NlcnQuZXF1YWwoSlNPTi5zdHJpbmdpZnkocmVzdWx0KSwgSlNPTi5zdHJpbmdpZnkoc3RydWN0VGVzdElucHV0KSk7CisgICAgICBkb25lKCk7CiAgICAgfSk7CiAgIH0pOwogCi0gIGFzeW5jVGVzdCgiTmVzdCIsIGZ1bmN0aW9uKCkgewotICAgIGV4cGVjdCggNyApOwotICAgIHZhciB4dHJUZXN0SW5wdXQgPSBuZXcgVGhyaWZ0VGVzdC5YdHJ1Y3QoKTsKKyAgUVVuaXQudGVzdCgnTmVzdCcsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoNyk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOworICAgIGNvbnN0IHh0clRlc3RJbnB1dCA9IG5ldyBUaHJpZnRUZXN0Llh0cnVjdCgpOwogICAgIHh0clRlc3RJbnB1dC5zdHJpbmdfdGhpbmcgPSAnd29ya2VkJzsKICAgICB4dHJUZXN0SW5wdXQuYnl0ZV90aGluZyA9IDB4MDE7Ci0gICAgeHRyVGVzdElucHV0LmkzMl90aGluZyA9IE1hdGgucG93KDIsMzApOworICAgIHh0clRlc3RJbnB1dC5pMzJfdGhpbmcgPSBNYXRoLnBvdygyLCAzMCk7CiAgICAgLy9UaGlzIGlzIHVzdWFsbHkgMl42MCBidXQgSlMgY2Fubm90IHJlcHJlc2VudCBhbnl0aGluZyBvdmVyIDJeNTIgYWNjdXJhdGVseQotICAgIHh0clRlc3RJbnB1dC5pNjRfdGhpbmcgPSBNYXRoLnBvdygyLDUyKTsKLSAgICAKLSAgICB2YXIgbmVzdFRlc3RJbnB1dCA9IG5ldyBUaHJpZnRUZXN0Llh0cnVjdDIoKTsKKyAgICB4dHJUZXN0SW5wdXQuaTY0X3RoaW5nID0gTWF0aC5wb3coMiwgNTIpOworCisgICAgY29uc3QgbmVzdFRlc3RJbnB1dCA9IG5ldyBUaHJpZnRUZXN0Llh0cnVjdDIoKTsKICAgICBuZXN0VGVzdElucHV0LmJ5dGVfdGhpbmcgPSAweDAyOwogICAgIG5lc3RUZXN0SW5wdXQuc3RydWN0X3RoaW5nID0geHRyVGVzdElucHV0OwotICAgIG5lc3RUZXN0SW5wdXQuaTMyX3RoaW5nID0gTWF0aC5wb3coMiwxNSk7Ci0gICAgCi0gICAgY2xpZW50LnRlc3ROZXN0KG5lc3RUZXN0SW5wdXQsIGZ1bmN0aW9uKHJlc3VsdCl7Ci0gICAgICBlcXVhbChyZXN1bHQuYnl0ZV90aGluZywgbmVzdFRlc3RJbnB1dC5ieXRlX3RoaW5nKTsKLSAgICAgIGVxdWFsKHJlc3VsdC5zdHJ1Y3RfdGhpbmcuc3RyaW5nX3RoaW5nLCBuZXN0VGVzdElucHV0LnN0cnVjdF90aGluZy5zdHJpbmdfdGhpbmcpOwotICAgICAgZXF1YWwocmVzdWx0LnN0cnVjdF90aGluZy5ieXRlX3RoaW5nLCBuZXN0VGVzdElucHV0LnN0cnVjdF90aGluZy5ieXRlX3RoaW5nKTsKLSAgICAgIGVxdWFsKHJlc3VsdC5zdHJ1Y3RfdGhpbmcuaTMyX3RoaW5nLCBuZXN0VGVzdElucHV0LnN0cnVjdF90aGluZy5pMzJfdGhpbmcpOwotICAgICAgZXF1YWwocmVzdWx0LnN0cnVjdF90aGluZy5pNjRfdGhpbmcsIG5lc3RUZXN0SW5wdXQuc3RydWN0X3RoaW5nLmk2NF90aGluZyk7Ci0gICAgICBlcXVhbChyZXN1bHQuaTMyX3RoaW5nLCBuZXN0VGVzdElucHV0LmkzMl90aGluZyk7ICAKLSAgICAgIGVxdWFsKEpTT04uc3RyaW5naWZ5KHJlc3VsdCksIEpTT04uc3RyaW5naWZ5KG5lc3RUZXN0SW5wdXQpKTsKLSAgICAgIFFVbml0LnN0YXJ0KCk7ICAgICAgCisgICAgbmVzdFRlc3RJbnB1dC5pMzJfdGhpbmcgPSBNYXRoLnBvdygyLCAxNSk7CisKKyAgICBjbGllbnQudGVzdE5lc3QobmVzdFRlc3RJbnB1dCwgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LmJ5dGVfdGhpbmcsIG5lc3RUZXN0SW5wdXQuYnl0ZV90aGluZyk7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LnN0cnVjdF90aGluZy5zdHJpbmdfdGhpbmcsIG5lc3RUZXN0SW5wdXQuc3RydWN0X3RoaW5nLnN0cmluZ190aGluZyk7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LnN0cnVjdF90aGluZy5ieXRlX3RoaW5nLCBuZXN0VGVzdElucHV0LnN0cnVjdF90aGluZy5ieXRlX3RoaW5nKTsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQuc3RydWN0X3RoaW5nLmkzMl90aGluZywgbmVzdFRlc3RJbnB1dC5zdHJ1Y3RfdGhpbmcuaTMyX3RoaW5nKTsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQuc3RydWN0X3RoaW5nLmk2NF90aGluZywgbmVzdFRlc3RJbnB1dC5zdHJ1Y3RfdGhpbmcuaTY0X3RoaW5nKTsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQuaTMyX3RoaW5nLCBuZXN0VGVzdElucHV0LmkzMl90aGluZyk7CisgICAgICBhc3NlcnQuZXF1YWwoSlNPTi5zdHJpbmdpZnkocmVzdWx0KSwgSlNPTi5zdHJpbmdpZnkobmVzdFRlc3RJbnB1dCkpOworICAgICAgZG9uZSgpOwogICAgIH0pOwogICB9KTsKIAotICBhc3luY1Rlc3QoIk1hcCIsIGZ1bmN0aW9uKCkgewotICAgIGV4cGVjdCggMyApOwotICAgIHZhciBtYXBUZXN0SW5wdXQgPSB7Nzo3NywgODo4OCwgOTo5OX07CisgIFFVbml0LnRlc3QoJ01hcCcsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoMyk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOworICAgIGNvbnN0IG1hcFRlc3RJbnB1dCA9IHs3OiA3NywgODogODgsIDk6IDk5fTsKIAotICAgIGNsaWVudC50ZXN0TWFwKG1hcFRlc3RJbnB1dCwgZnVuY3Rpb24ocmVzdWx0KXsKLSAgICAgIGZvciAodmFyIGtleSBpbiByZXN1bHQpIHsKLSAgICAgICAgZXF1YWwocmVzdWx0W2tleV0sIG1hcFRlc3RJbnB1dFtrZXldKTsKKyAgICBjbGllbnQudGVzdE1hcChtYXBUZXN0SW5wdXQsIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgZm9yIChsZXQga2V5IGluIHJlc3VsdCkgeworICAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0W2tleV0sIG1hcFRlc3RJbnB1dFtrZXldKTsKICAgICAgIH0KLSAgICAgIFFVbml0LnN0YXJ0KCk7ICAKKyAgICAgIGRvbmUoKTsKICAgICB9KTsKICAgfSk7CiAKLSAgYXN5bmNUZXN0KCJTdHJpbmdNYXAiLCBmdW5jdGlvbigpIHsKLSAgICBleHBlY3QoIDYgKTsKLSAgICB2YXIgbWFwVGVzdElucHV0ID0gewotICAgICAgImEiOiIxMjMiLCAiYSBiIjoid2l0aCBzcGFjZXMgIiwgInNhbWUiOiJzYW1lIiwgIjAiOiJudW1lcmljIGtleSIsCi0gICAgICAibG9uZ1ZhbHVlIjpzdHJpbmdUZXN0LCBzdHJpbmdUZXN0OiJsb25nIGtleSIKKyAgUVVuaXQudGVzdCgnU3RyaW5nTWFwJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmV4cGVjdCg2KTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CisgICAgY29uc3QgbWFwVGVzdElucHV0ID0geworICAgICAgJ2EnOiAnMTIzJywgJ2EgYic6ICd3aXRoIHNwYWNlcyAnLCAnc2FtZSc6ICdzYW1lJywgJzAnOiAnbnVtZXJpYyBrZXknLAorICAgICAgJ2xvbmdWYWx1ZSc6IHN0cmluZ1Rlc3QsIHN0cmluZ1Rlc3Q6ICdsb25nIGtleScKICAgICB9OwogCi0gICAgY2xpZW50LnRlc3RTdHJpbmdNYXAobWFwVGVzdElucHV0LCBmdW5jdGlvbihyZXN1bHQpewotICAgICAgZm9yICh2YXIga2V5IGluIHJlc3VsdCkgewotICAgICAgICBlcXVhbChyZXN1bHRba2V5XSwgbWFwVGVzdElucHV0W2tleV0pOworICAgIGNsaWVudC50ZXN0U3RyaW5nTWFwKG1hcFRlc3RJbnB1dCwgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBmb3IgKGxldCBrZXkgaW4gcmVzdWx0KSB7CisgICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHRba2V5XSwgbWFwVGVzdElucHV0W2tleV0pOwogICAgICAgfQotICAgICAgUVVuaXQuc3RhcnQoKTsKKyAgICAgIGRvbmUoKTsKICAgICB9KTsKICAgfSk7CiAKLSAgYXN5bmNUZXN0KCJTZXQiLCBmdW5jdGlvbigpIHsKLSAgICBleHBlY3QoIDEgKTsKLSAgICB2YXIgc2V0VGVzdElucHV0ID0gWzEsMiwzXTsKLSAgICBjbGllbnQudGVzdFNldChzZXRUZXN0SW5wdXQsIGZ1bmN0aW9uKHJlc3VsdCl7Ci0gICAgICBvayhyZXN1bHQsIHNldFRlc3RJbnB1dCk7Ci0gICAgICBRVW5pdC5zdGFydCgpOworICBRVW5pdC50ZXN0KCdTZXQnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXhwZWN0KDEpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKKyAgICBjb25zdCBzZXRUZXN0SW5wdXQgPSBbMSwgMiwgM107CisgICAgY2xpZW50LnRlc3RTZXQoc2V0VGVzdElucHV0LCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGFzc2VydC5vayhyZXN1bHQsIHNldFRlc3RJbnB1dCk7CisgICAgICBkb25lKCk7CiAgICAgfSk7CiAgIH0pOwogCi0gIGFzeW5jVGVzdCgiTGlzdCIsIGZ1bmN0aW9uKCkgewotICAgIGV4cGVjdCggMSApOwotICAgIHZhciBsaXN0VGVzdElucHV0ID0gWzEsMiwzXTsKLSAgICBjbGllbnQudGVzdExpc3QobGlzdFRlc3RJbnB1dCwgZnVuY3Rpb24ocmVzdWx0KXsKLSAgICAgIG9rKHJlc3VsdCwgbGlzdFRlc3RJbnB1dCk7Ci0gICAgICBRVW5pdC5zdGFydCgpOworICBRVW5pdC50ZXN0KCdMaXN0JywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmV4cGVjdCgxKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CisgICAgY29uc3QgbGlzdFRlc3RJbnB1dCA9IFsxLCAyLCAzXTsKKyAgICBjbGllbnQudGVzdExpc3QobGlzdFRlc3RJbnB1dCwgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBhc3NlcnQub2socmVzdWx0LCBsaXN0VGVzdElucHV0KTsKKyAgICAgIGRvbmUoKTsKICAgICB9KTsKICAgfSk7CiAKLSAgYXN5bmNUZXN0KCJFbnVtIiwgZnVuY3Rpb24oKSB7Ci0gICAgZXhwZWN0KCAxICk7Ci0gICAgY2xpZW50LnRlc3RFbnVtKFRocmlmdFRlc3QuTnVtYmVyei5PTkUsIGZ1bmN0aW9uKHJlc3VsdCl7Ci0gICAgICBlcXVhbChyZXN1bHQsIFRocmlmdFRlc3QuTnVtYmVyei5PTkUpOwotICAgICAgUVVuaXQuc3RhcnQoKTsKKyAgUVVuaXQudGVzdCgnRW51bScsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoMSk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOworICAgIGNsaWVudC50ZXN0RW51bShUaHJpZnRUZXN0Lk51bWJlcnouT05FLCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIFRocmlmdFRlc3QuTnVtYmVyei5PTkUpOworICAgICAgZG9uZSgpOwogICAgIH0pOwogICB9KTsKIAotICBhc3luY1Rlc3QoIlR5cGVEZWYiLCBmdW5jdGlvbigpIHsKLSAgICBleHBlY3QoIDEgKTsKLSAgICBjbGllbnQudGVzdFR5cGVkZWYoNjksIGZ1bmN0aW9uKHJlc3VsdCl7Ci0gICAgICBlcXVhbChyZXN1bHQsIDY5KTsKLSAgICAgIFFVbml0LnN0YXJ0KCk7CisgIFFVbml0LnRlc3QoJ1R5cGVEZWYnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXhwZWN0KDEpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKKyAgICBjbGllbnQudGVzdFR5cGVkZWYoNjksIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgNjkpOworICAgICAgZG9uZSgpOwogICAgIH0pOwogICB9KTsKIAogCi1tb2R1bGUoImRlZXBlciEiKTsKK1FVbml0Lm1vZHVsZSgnZGVlcGVyIScpOwogCi0gIGFzeW5jVGVzdCgiTWFwTWFwIiwgZnVuY3Rpb24oKSB7Ci0gICAgZXhwZWN0KCAxNiApOwotICAgIHZhciBtYXBNYXBUZXN0RXhwZWN0ZWRSZXN1bHQgPSB7Ci0gICAgICAiNCI6eyIxIjoxLCIyIjoyLCIzIjozLCI0Ijo0fSwKLSAgICAgICItNCI6eyItNCI6LTQsICItMyI6LTMsICItMiI6LTIsICItMSI6LTF9CisgIFFVbml0LnRlc3QoJ01hcE1hcCcsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoMTYpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKKyAgICBjb25zdCBtYXBNYXBUZXN0RXhwZWN0ZWRSZXN1bHQgPSB7CisgICAgICAnNCc6IHsnMSc6IDEsICcyJzogMiwgJzMnOiAzLCAnNCc6IDR9LAorICAgICAgJy00JzogeyctNCc6IC00LCAnLTMnOiAtMywgJy0yJzogLTIsICctMSc6IC0xfQogICAgIH07CiAKLSAgICBjbGllbnQudGVzdE1hcE1hcCgxLCBmdW5jdGlvbihyZXN1bHQpewotICAgICAgZm9yICh2YXIga2V5IGluIHJlc3VsdCkgewotICAgICAgICBmb3IgKHZhciBrZXkyIGluIHJlc3VsdFtrZXldKSB7Ci0gICAgICAgICAgZXF1YWwocmVzdWx0W2tleV1ba2V5Ml0sIG1hcE1hcFRlc3RFeHBlY3RlZFJlc3VsdFtrZXldW2tleTJdKTsKKyAgICBjbGllbnQudGVzdE1hcE1hcCgxLCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGZvciAobGV0IGtleSBpbiByZXN1bHQpIHsKKyAgICAgICAgZm9yIChsZXQga2V5MiBpbiByZXN1bHRba2V5XSkgeworICAgICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHRba2V5XVtrZXkyXSwgbWFwTWFwVGVzdEV4cGVjdGVkUmVzdWx0W2tleV1ba2V5Ml0pOwogICAgICAgICB9CiAgICAgICB9Ci0gICAgICBjaGVja1JlY3Vyc2l2ZWx5KHJlc3VsdCwgbWFwTWFwVGVzdEV4cGVjdGVkUmVzdWx0KTsKLSAgICAgIFFVbml0LnN0YXJ0KCk7CisgICAgICBjaGVja1JlY3Vyc2l2ZWx5KGFzc2VydCwgcmVzdWx0LCBtYXBNYXBUZXN0RXhwZWN0ZWRSZXN1bHQpOworICAgICAgZG9uZSgpOwogICAgIH0pOwogICB9KTsKIAogCi1tb2R1bGUoIkV4Y2VwdGlvbiIpOworUVVuaXQubW9kdWxlKCdFeGNlcHRpb24nKTsKIAotICBhc3luY1Rlc3QoIlhjZXB0aW9uIiwgZnVuY3Rpb24oKSB7Ci0gICAgZXhwZWN0KDIpOwotICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCJYY2VwdGlvbiIsIGZ1bmN0aW9uKGUpewotICAgICAgZXF1YWwoZS5lcnJvckNvZGUsIDEwMDEpOwotICAgICAgZXF1YWwoZS5tZXNzYWdlLCAiWGNlcHRpb24iKTsKLSAgICAgIFFVbml0LnN0YXJ0KCk7CisgIFFVbml0LnRlc3QoJ1hjZXB0aW9uJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmV4cGVjdCgyKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CisgICAgY2xpZW50LnRlc3RFeGNlcHRpb24oJ1hjZXB0aW9uJywgZnVuY3Rpb24oZSkgeworICAgICAgYXNzZXJ0LmVxdWFsKGUuZXJyb3JDb2RlLCAxMDAxKTsKKyAgICAgIGFzc2VydC5lcXVhbChlLm1lc3NhZ2UsICdYY2VwdGlvbicpOworICAgICAgZG9uZSgpOwogICAgIH0pOwogICB9KTsKIAotICBhc3luY1Rlc3QoIm5vIEV4Y2VwdGlvbiIsIDAsIGZ1bmN0aW9uKCkgewotICAgIGV4cGVjdCggMSApOwotICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCJubyBFeGNlcHRpb24iLCBmdW5jdGlvbihlKXsKLSAgICAgIG9rKCFlKTsKLSAgICAgIFFVbml0LnN0YXJ0KCk7CisgIFFVbml0LnRlc3QoJ25vIEV4Y2VwdGlvbicsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoMSk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOworICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCdubyBFeGNlcHRpb24nLCBmdW5jdGlvbihlKSB7CisgICAgICBhc3NlcnQub2soIWUpOworICAgICAgZG9uZSgpOwogICAgIH0pOwogICB9KTsKIAotbW9kdWxlKCJJbnNhbml0eSIpOworUVVuaXQubW9kdWxlKCdJbnNhbml0eScpOwogCi0gIGFzeW5jVGVzdCgidGVzdEluc2FuaXR5IiwgZnVuY3Rpb24oKSB7Ci0gICAgZXhwZWN0KCAyNCApOwotICAgIHZhciBpbnNhbml0eSA9IHsKLSAgICAgICIxIjp7Ci0gICAgICAgICIyIjp7Ci0gICAgICAgICAgInVzZXJNYXAiOnsgIjUiOjUsICI4Ijo4IH0sCi0gICAgICAgICAgInh0cnVjdHMiOlt7Ci0gICAgICAgICAgICAgICJzdHJpbmdfdGhpbmciOiJHb29kYnllNCIsCi0gICAgICAgICAgICAgICJieXRlX3RoaW5nIjo0LAotICAgICAgICAgICAgICAiaTMyX3RoaW5nIjo0LAotICAgICAgICAgICAgICAiaTY0X3RoaW5nIjo0CisgIFFVbml0LnRlc3QoJ3Rlc3RJbnNhbml0eScsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoMjQpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKKyAgICBjb25zdCBpbnNhbml0eSA9IHsKKyAgICAgICcxJzogeworICAgICAgICAnMic6IHsKKyAgICAgICAgICAndXNlck1hcCc6IHsgJzUnOiA1LCAnOCc6IDggfSwKKyAgICAgICAgICAneHRydWN0cyc6IFt7CisgICAgICAgICAgICAgICdzdHJpbmdfdGhpbmcnOiAnR29vZGJ5ZTQnLAorICAgICAgICAgICAgICAnYnl0ZV90aGluZyc6IDQsCisgICAgICAgICAgICAgICdpMzJfdGhpbmcnOiA0LAorICAgICAgICAgICAgICAnaTY0X3RoaW5nJzogNAogICAgICAgICAgICAgfSwKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgInN0cmluZ190aGluZyI6IkhlbGxvMiIsCi0gICAgICAgICAgICAgICJieXRlX3RoaW5nIjoyLAotICAgICAgICAgICAgICAiaTMyX3RoaW5nIjoyLAotICAgICAgICAgICAgICAiaTY0X3RoaW5nIjoyCisgICAgICAgICAgICAgICdzdHJpbmdfdGhpbmcnOiAnSGVsbG8yJywKKyAgICAgICAgICAgICAgJ2J5dGVfdGhpbmcnOiAyLAorICAgICAgICAgICAgICAnaTMyX3RoaW5nJzogMiwKKyAgICAgICAgICAgICAgJ2k2NF90aGluZyc6IDIKICAgICAgICAgICAgIH0KICAgICAgICAgICBdCiAgICAgICAgIH0sCi0gICAgICAgICIzIjp7Ci0gICAgICAgICAgInVzZXJNYXAiOnsgIjUiOjUsICI4Ijo4IH0sCi0gICAgICAgICAgInh0cnVjdHMiOlt7Ci0gICAgICAgICAgICAgICJzdHJpbmdfdGhpbmciOiJHb29kYnllNCIsCi0gICAgICAgICAgICAgICJieXRlX3RoaW5nIjo0LAotICAgICAgICAgICAgICAiaTMyX3RoaW5nIjo0LAotICAgICAgICAgICAgICAiaTY0X3RoaW5nIjo0CisgICAgICAgICczJzogeworICAgICAgICAgICd1c2VyTWFwJzogeyAnNSc6IDUsICc4JzogOCB9LAorICAgICAgICAgICd4dHJ1Y3RzJzogW3sKKyAgICAgICAgICAgICAgJ3N0cmluZ190aGluZyc6ICdHb29kYnllNCcsCisgICAgICAgICAgICAgICdieXRlX3RoaW5nJzogNCwKKyAgICAgICAgICAgICAgJ2kzMl90aGluZyc6IDQsCisgICAgICAgICAgICAgICdpNjRfdGhpbmcnOiA0CiAgICAgICAgICAgICB9LAogICAgICAgICAgICAgewotICAgICAgICAgICAgICAic3RyaW5nX3RoaW5nIjoiSGVsbG8yIiwKLSAgICAgICAgICAgICAgImJ5dGVfdGhpbmciOjIsCi0gICAgICAgICAgICAgICJpMzJfdGhpbmciOjIsCi0gICAgICAgICAgICAgICJpNjRfdGhpbmciOjIKKyAgICAgICAgICAgICAgJ3N0cmluZ190aGluZyc6ICdIZWxsbzInLAorICAgICAgICAgICAgICAnYnl0ZV90aGluZyc6IDIsCisgICAgICAgICAgICAgICdpMzJfdGhpbmcnOiAyLAorICAgICAgICAgICAgICAnaTY0X3RoaW5nJzogMgogICAgICAgICAgICAgfQogICAgICAgICAgIF0KICAgICAgICAgfQogICAgICAgfSwKLSAgICAgICIyIjp7ICI2Ijp7ICJ1c2VyTWFwIjpudWxsLCAieHRydWN0cyI6bnVsbCB9IH0KKyAgICAgICcyJzogeyAnNic6IHsgJ3VzZXJNYXAnOiBudWxsLCAneHRydWN0cyc6IG51bGwgfSB9CiAgICAgfTsKLSAgICBjbGllbnQudGVzdEluc2FuaXR5KG5ldyBUaHJpZnRUZXN0Lkluc2FuaXR5KCksIGZ1bmN0aW9uKHJlcyl7Ci0gICAgICBvayhyZXMsIEpTT04uc3RyaW5naWZ5KHJlcykpOwotICAgICAgb2soaW5zYW5pdHksIEpTT04uc3RyaW5naWZ5KGluc2FuaXR5KSk7Ci0gICAgICBjaGVja1JlY3Vyc2l2ZWx5KHJlcywgaW5zYW5pdHkpOwotICAgICAgUVVuaXQuc3RhcnQoKTsKKyAgICBjbGllbnQudGVzdEluc2FuaXR5KG5ldyBUaHJpZnRUZXN0Lkluc2FuaXR5KCksIGZ1bmN0aW9uKHJlcykgeworICAgICAgYXNzZXJ0Lm9rKHJlcywgSlNPTi5zdHJpbmdpZnkocmVzKSk7CisgICAgICBhc3NlcnQub2soaW5zYW5pdHksIEpTT04uc3RyaW5naWZ5KGluc2FuaXR5KSk7CisgICAgICBjaGVja1JlY3Vyc2l2ZWx5KGFzc2VydCwgcmVzLCBpbnNhbml0eSk7CisgICAgICBkb25lKCk7CiAgICAgfSk7CiAgIH0pOwogCitRVW5pdC5tb2R1bGUoJ09uZXdheScpOwogCisgIFFVbml0LnRlc3QoJ3Rlc3RPbmV3YXknLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXhwZWN0KDEpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKKyAgICBjbGllbnQudGVzdE9uZXdheSgxLCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIHVuZGVmaW5lZCk7CisgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOwpkaWZmIC0tZ2l0IGEvbGliL2pzL3Rlc3QvdGVzdC1kZWVwLWNvbnN0cnVjdG9yLmh0bWwgYi9saWIvanMvdGVzdC90ZXN0LWRlZXAtY29uc3RydWN0b3IuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kZmMwZGE2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2pzL3Rlc3QvdGVzdC1kZWVwLWNvbnN0cnVjdG9yLmh0bWwKQEAgLTAsMCArMSw0OSBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+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+tLCBpc2lYaG9zYSwg15nXmda015PXmdepLCBZb3LDuWLDoSwgWmXDqnV3cywg5Lit5paHLCBCw6JuLWzDom0tZ8O6LCDnsrXoqp4iOworCitmdW5jdGlvbiBjaGVja1JlY3Vyc2l2ZWx5KGFzc2VydCwgbWFwMSwgbWFwMikgeworICBpZiAodHlwZW9mIG1hcDEgIT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIG1hcDIgIT09ICdmdW5jdGlvbicpIHsKKyAgICBpZiAoIW1hcDEgfHwgdHlwZW9mIG1hcDEgIT09ICdvYmplY3QnKSB7CisgICAgICAgIGFzc2VydC5lcXVhbChtYXAxLCBtYXAyKTsKKyAgICB9IGVsc2UgeworICAgICAgZm9yICh2YXIga2V5IGluIG1hcDEpIHsKKyAgICAgICAgY2hlY2tSZWN1cnNpdmVseShhc3NlcnQsIG1hcDFba2V5XSwgbWFwMltrZXldKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworUVVuaXQubW9kdWxlKCdCYXNlIFR5cGVzJyk7CisKKyAgUVVuaXQudGVzdCgnVm9pZCcsIGZ1bmN0aW9uKCBhc3NlcnQgKSB7CisgICAgYXNzZXJ0LmV4cGVjdCgxKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CisgICAgY2xpZW50LnRlc3RWb2lkKCkudGhlbihmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIHVuZGVmaW5lZCk7CisgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworCisgIFFVbml0LnRlc3QoJ1N0cmluZycsIGZ1bmN0aW9uKCBhc3NlcnQgKSB7CisgICAgYXNzZXJ0LmV4cGVjdCgzKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKDMpOworICAgIGNsaWVudC50ZXN0U3RyaW5nKCcnKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsICcnKTsKKyAgICAgICBkb25lKCk7CisgICAgfSk7CisgICAgY2xpZW50LnRlc3RTdHJpbmcoc3RyaW5nVGVzdCkudGhlbihmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCBzdHJpbmdUZXN0KTsKKyAgICAgICBkb25lKCk7CisgICAgfSk7CisgICAgdmFyIHNwZWNpYWxDaGFyYWN0ZXJzID0gJ3F1b3RlOiBcIiBiYWNrc2xhc2g6JyArCisgICAgICAgICAgJyBmb3J3YXJkc2xhc2gtZXNjYXBlZDogXC8gJyArCisgICAgICAgICAgJyBiYWNrc3BhY2U6IFxiIGZvcm1mZWVkOiBcZiBuZXdsaW5lOiBcbiByZXR1cm46IFxyIHRhYjogJyArCisgICAgICAgICAgJyBub3ctYWxsLW9mLXRoZW0tdG9nZXRoZXI6ICJcXFwvXGJcblxyXHQnICsKKyAgICAgICAgICAnIG5vdy1hLWJ1bmNoLW9mLWp1bms6ICFAIyQlJigpKCYlJCN7fXt9PD48PjwnOworICAgIGNsaWVudC50ZXN0U3RyaW5nKHNwZWNpYWxDaGFyYWN0ZXJzKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIHNwZWNpYWxDaGFyYWN0ZXJzKTsKKyAgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworCisgIFFVbml0LnRlc3QoJ0RvdWJsZScsIGZ1bmN0aW9uKCBhc3NlcnQgKSB7CisgICAgYXNzZXJ0LmV4cGVjdCg0KTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKDQpOworICAgIGNsaWVudC50ZXN0RG91YmxlKDApLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgMCk7CisgICAgICAgZG9uZSgpOworICAgIH0pOworICAgIGNsaWVudC50ZXN0RG91YmxlKC0xKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIC0xKTsKKyAgICAgICBkb25lKCk7CisgICAgfSk7CisgICAgY2xpZW50LnRlc3REb3VibGUoMy4xNCkudGhlbihmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCAzLjE0KTsKKyAgICAgICBkb25lKCk7CisgICAgfSk7CisgICAgY2xpZW50LnRlc3REb3VibGUoTWF0aC5wb3coMiwgNjApKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIE1hdGgucG93KDIsIDYwKSk7CisgICAgICAgZG9uZSgpOworICAgIH0pOworICB9KTsKKyAgLy8gVE9ETzogYWRkIHRlc3RCaW5hcnkoKQorICBRVW5pdC50ZXN0KCdCeXRlJywgZnVuY3Rpb24oIGFzc2VydCApIHsKKyAgICBhc3NlcnQuZXhwZWN0KDIpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoMik7CisgICAgY2xpZW50LnRlc3RCeXRlKDApLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgMCk7CisgICAgICAgZG9uZSgpOworICAgIH0pOworICAgIGNsaWVudC50ZXN0Qnl0ZSgweDAxKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIDB4MDEpOworICAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CisgIFFVbml0LnRlc3QoJ0kzMicsIGZ1bmN0aW9uKCBhc3NlcnQgKSB7CisgICAgYXNzZXJ0LmV4cGVjdCgzKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKDMpOworICAgIGNsaWVudC50ZXN0STMyKDApLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgMCk7CisgICAgICAgZG9uZSgpOworICAgIH0pOworICAgIGNsaWVudC50ZXN0STMyKE1hdGgucG93KDIsIDMwKSkudGhlbihmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCBNYXRoLnBvdygyLCAzMCkpOworICAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgICBjbGllbnQudGVzdEkzMigtTWF0aC5wb3coMiwgMzApKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIC1NYXRoLnBvdygyLCAzMCkpOworICAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CisgIFFVbml0LnRlc3QoJ0k2NCcsIGZ1bmN0aW9uKCBhc3NlcnQgKSB7CisgICAgYXNzZXJ0LmV4cGVjdCgzKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKDMpOworICAgIGNsaWVudC50ZXN0STY0KDApLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgMCk7CisgICAgICAgZG9uZSgpOworICAgIH0pOworICAgIC8vVGhpcyBpcyB1c3VhbGx5IDJeNjAgYnV0IEpTIGNhbm5vdCByZXByZXNlbnQgYW55dGhpbmcgb3ZlciAyXjUyIGFjY3VyYXRlbHkKKyAgICBjbGllbnQudGVzdEk2NChNYXRoLnBvdygyLCA1MikpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgTWF0aC5wb3coMiwgNTIpKTsKKyAgICAgICBkb25lKCk7CisgICAgfSk7CisgICAgY2xpZW50LnRlc3RJNjQoLU1hdGgucG93KDIsIDUyKSkudGhlbihmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCAtTWF0aC5wb3coMiwgNTIpKTsKKyAgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworCisKK1FVbml0Lm1vZHVsZSgnU3RydWN0dXJlZCBUeXBlcycpOworCisgIFFVbml0LnRlc3QoJ1N0cnVjdCcsIGZ1bmN0aW9uKCBhc3NlcnQgKSB7CisgICAgYXNzZXJ0LmV4cGVjdCg1KTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CisgICAgdmFyIHN0cnVjdFRlc3RJbnB1dCA9IG5ldyBUaHJpZnRUZXN0Llh0cnVjdCgpOworICAgIHN0cnVjdFRlc3RJbnB1dC5zdHJpbmdfdGhpbmcgPSAnd29ya2VkJzsKKyAgICBzdHJ1Y3RUZXN0SW5wdXQuYnl0ZV90aGluZyA9IDB4MDE7CisgICAgc3RydWN0VGVzdElucHV0LmkzMl90aGluZyA9IE1hdGgucG93KDIsIDMwKTsKKyAgICAvL1RoaXMgaXMgdXN1YWxseSAyXjYwIGJ1dCBKUyBjYW5ub3QgcmVwcmVzZW50IGFueXRoaW5nIG92ZXIgMl41MiBhY2N1cmF0ZWx5CisgICAgc3RydWN0VGVzdElucHV0Lmk2NF90aGluZyA9IE1hdGgucG93KDIsIDUyKTsKKworICAgIGNsaWVudC50ZXN0U3RydWN0KHN0cnVjdFRlc3RJbnB1dCkudGhlbihmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQuc3RyaW5nX3RoaW5nLCBzdHJ1Y3RUZXN0SW5wdXQuc3RyaW5nX3RoaW5nKTsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQuYnl0ZV90aGluZywgc3RydWN0VGVzdElucHV0LmJ5dGVfdGhpbmcpOworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdC5pMzJfdGhpbmcsIHN0cnVjdFRlc3RJbnB1dC5pMzJfdGhpbmcpOworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdC5pNjRfdGhpbmcsIHN0cnVjdFRlc3RJbnB1dC5pNjRfdGhpbmcpOworICAgICAgYXNzZXJ0LmVxdWFsKEpTT04uc3RyaW5naWZ5KHJlc3VsdCksIEpTT04uc3RyaW5naWZ5KHN0cnVjdFRlc3RJbnB1dCkpOworICAgICAgZG9uZSgpOworICAgIH0pOworICB9KTsKKworICBRVW5pdC50ZXN0KCdOZXN0JywgZnVuY3Rpb24oIGFzc2VydCApIHsKKyAgICBhc3NlcnQuZXhwZWN0KDcpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKKyAgICB2YXIgeHRyVGVzdElucHV0ID0gbmV3IFRocmlmdFRlc3QuWHRydWN0KCk7CisgICAgeHRyVGVzdElucHV0LnN0cmluZ190aGluZyA9ICd3b3JrZWQnOworICAgIHh0clRlc3RJbnB1dC5ieXRlX3RoaW5nID0gMHgwMTsKKyAgICB4dHJUZXN0SW5wdXQuaTMyX3RoaW5nID0gTWF0aC5wb3coMiwgMzApOworICAgIC8vVGhpcyBpcyB1c3VhbGx5IDJeNjAgYnV0IEpTIGNhbm5vdCByZXByZXNlbnQgYW55dGhpbmcgb3ZlciAyXjUyIGFjY3VyYXRlbHkKKyAgICB4dHJUZXN0SW5wdXQuaTY0X3RoaW5nID0gTWF0aC5wb3coMiwgNTIpOworCisgICAgdmFyIG5lc3RUZXN0SW5wdXQgPSBuZXcgVGhyaWZ0VGVzdC5YdHJ1Y3QyKCk7CisgICAgbmVzdFRlc3RJbnB1dC5ieXRlX3RoaW5nID0gMHgwMjsKKyAgICBuZXN0VGVzdElucHV0LnN0cnVjdF90aGluZyA9IHh0clRlc3RJbnB1dDsKKyAgICBuZXN0VGVzdElucHV0LmkzMl90aGluZyA9IE1hdGgucG93KDIsIDE1KTsKKworICAgIGNsaWVudC50ZXN0TmVzdChuZXN0VGVzdElucHV0KS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdC5ieXRlX3RoaW5nLCBuZXN0VGVzdElucHV0LmJ5dGVfdGhpbmcpOworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdC5zdHJ1Y3RfdGhpbmcuc3RyaW5nX3RoaW5nLCBuZXN0VGVzdElucHV0LnN0cnVjdF90aGluZy5zdHJpbmdfdGhpbmcpOworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdC5zdHJ1Y3RfdGhpbmcuYnl0ZV90aGluZywgbmVzdFRlc3RJbnB1dC5zdHJ1Y3RfdGhpbmcuYnl0ZV90aGluZyk7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LnN0cnVjdF90aGluZy5pMzJfdGhpbmcsIG5lc3RUZXN0SW5wdXQuc3RydWN0X3RoaW5nLmkzMl90aGluZyk7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LnN0cnVjdF90aGluZy5pNjRfdGhpbmcsIG5lc3RUZXN0SW5wdXQuc3RydWN0X3RoaW5nLmk2NF90aGluZyk7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LmkzMl90aGluZywgbmVzdFRlc3RJbnB1dC5pMzJfdGhpbmcpOworICAgICAgYXNzZXJ0LmVxdWFsKEpTT04uc3RyaW5naWZ5KHJlc3VsdCksIEpTT04uc3RyaW5naWZ5KG5lc3RUZXN0SW5wdXQpKTsKKyAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CisKKyAgUVVuaXQudGVzdCgnTWFwJywgZnVuY3Rpb24oIGFzc2VydCApIHsKKyAgICBhc3NlcnQuZXhwZWN0KDMpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKKyAgICB2YXIgbWFwVGVzdElucHV0ID0gezc6IDc3LCA4OiA4OCwgOTogOTl9OworCisgICAgY2xpZW50LnRlc3RNYXAobWFwVGVzdElucHV0KS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgZm9yICh2YXIga2V5IGluIHJlc3VsdCkgeworICAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0W2tleV0sIG1hcFRlc3RJbnB1dFtrZXldKTsKKyAgICAgIH0KKyAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CisKKyAgUVVuaXQudGVzdCgnU3RyaW5nTWFwJywgZnVuY3Rpb24oIGFzc2VydCApIHsKKyAgICBhc3NlcnQuZXhwZWN0KDYpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKKyAgICB2YXIgbWFwVGVzdElucHV0ID0geworICAgICAgJ2EnOiAnMTIzJywgJ2EgYic6ICd3aXRoIHNwYWNlcyAnLCAnc2FtZSc6ICdzYW1lJywgJzAnOiAnbnVtZXJpYyBrZXknLAorICAgICAgJ2xvbmdWYWx1ZSc6IHN0cmluZ1Rlc3QsIHN0cmluZ1Rlc3Q6ICdsb25nIGtleScKKyAgICB9OworCisgICAgY2xpZW50LnRlc3RTdHJpbmdNYXAobWFwVGVzdElucHV0KS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgZm9yICh2YXIga2V5IGluIHJlc3VsdCkgeworICAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0W2tleV0sIG1hcFRlc3RJbnB1dFtrZXldKTsKKyAgICAgIH0KKyAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CisKKyAgUVVuaXQudGVzdCgnU2V0JywgZnVuY3Rpb24oIGFzc2VydCApIHsKKyAgICBhc3NlcnQuZXhwZWN0KDEpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKKyAgICB2YXIgc2V0VGVzdElucHV0ID0gWzEsIDIsIDNdOworICAgIGNsaWVudC50ZXN0U2V0KHNldFRlc3RJbnB1dCkudGhlbihmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGFzc2VydC5vayhyZXN1bHQsIHNldFRlc3RJbnB1dCk7CisgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworCisgIFFVbml0LnRlc3QoJ0xpc3QnLCBmdW5jdGlvbiggYXNzZXJ0ICkgeworICAgIGFzc2VydC5leHBlY3QoMSk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOworICAgIHZhciBsaXN0VGVzdElucHV0ID0gWzEsIDIsIDNdOworICAgIGNsaWVudC50ZXN0TGlzdChsaXN0VGVzdElucHV0KS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgYXNzZXJ0Lm9rKHJlc3VsdCwgbGlzdFRlc3RJbnB1dCk7CisgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworCisgIFFVbml0LnRlc3QoJ0VudW0nLCBmdW5jdGlvbiggYXNzZXJ0ICkgeworICAgIGFzc2VydC5leHBlY3QoMSk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOworICAgIGNsaWVudC50ZXN0RW51bShUaHJpZnRUZXN0Lk51bWJlcnouT05FKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgVGhyaWZ0VGVzdC5OdW1iZXJ6Lk9ORSk7CisgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworCisgIFFVbml0LnRlc3QoJ1R5cGVEZWYnLCBmdW5jdGlvbiggYXNzZXJ0ICkgeworICAgIGFzc2VydC5leHBlY3QoMSk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOworICAgIGNsaWVudC50ZXN0VHlwZWRlZig2OSkudGhlbihmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIDY5KTsKKyAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CisKKworUVVuaXQubW9kdWxlKCdkZWVwZXIhJyk7CisKKyAgUVVuaXQudGVzdCgnTWFwTWFwJywgZnVuY3Rpb24oIGFzc2VydCApIHsKKyAgICBhc3NlcnQuZXhwZWN0KDE2KTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CisgICAgdmFyIG1hcE1hcFRlc3RFeHBlY3RlZFJlc3VsdCA9IHsKKyAgICAgICc0JzogeycxJzogMSwgJzInOiAyLCAnMyc6IDMsICc0JzogNH0sCisgICAgICAnLTQnOiB7Jy00JzogLTQsICctMyc6IC0zLCAnLTInOiAtMiwgJy0xJzogLTF9CisgICAgfTsKKworICAgIGNsaWVudC50ZXN0TWFwTWFwKDEpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBmb3IgKHZhciBrZXkgaW4gcmVzdWx0KSB7CisgICAgICAgIGZvciAodmFyIGtleTIgaW4gcmVzdWx0W2tleV0pIHsKKyAgICAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0W2tleV1ba2V5Ml0sIG1hcE1hcFRlc3RFeHBlY3RlZFJlc3VsdFtrZXldW2tleTJdKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgY2hlY2tSZWN1cnNpdmVseShhc3NlcnQsIHJlc3VsdCwgbWFwTWFwVGVzdEV4cGVjdGVkUmVzdWx0KTsKKyAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CisKKworUVVuaXQubW9kdWxlKCdFeGNlcHRpb24nKTsKKworICBRVW5pdC50ZXN0KCdYY2VwdGlvbicsIGZ1bmN0aW9uKCBhc3NlcnQgKSB7CisgICAgYXNzZXJ0LmV4cGVjdCgyKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CisgICAgY2xpZW50LnRlc3RFeGNlcHRpb24oJ1hjZXB0aW9uJykudGhlbihmdW5jdGlvbihyZXMpIHsKKyAgICAgIGFzc2VydC5vayhmYWxzZSk7CisgICAgfSkuY2F0Y2goZnVuY3Rpb24oZSkgeworCisgICAgICBjb25zb2xlLmxvZyhgRXhjZXB0aW9uIGV4Y2VwdGlvbiBlYCk7CisgICAgICBjb25zb2xlLmxvZyhlKTsKKyAgICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KGUsIG51bGwsIDIpKTsKKworICAgICAgYXNzZXJ0LmVxdWFsKGUuZXJyb3JDb2RlLCAxMDAxKTsKKyAgICAgIGFzc2VydC5lcXVhbChlLm1lc3NhZ2UsICdYY2VwdGlvbicpOworICAgICAgZG9uZSgpOworICAgIH0pOworICB9KTsKKworICBRVW5pdC50ZXN0KCdubyBFeGNlcHRpb24nLCBmdW5jdGlvbiggYXNzZXJ0ICkgeworICAgIGFzc2VydC5leHBlY3QoMSk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOworICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCdubyBFeGNlcHRpb24nKS50aGVuKGZ1bmN0aW9uKGUpIHsKKyAgICAgIGFzc2VydC5vayghZSk7CisgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworCitRVW5pdC5tb2R1bGUoJ0luc2FuaXR5Jyk7CisKKyAgUVVuaXQudGVzdCgndGVzdEluc2FuaXR5JywgZnVuY3Rpb24oIGFzc2VydCApIHsKKyAgICBhc3NlcnQuZXhwZWN0KDI0KTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CisgICAgdmFyIGluc2FuaXR5ID0geworICAgICAgJzEnOiB7CisgICAgICAgICcyJzogeworICAgICAgICAgICd1c2VyTWFwJzogeyAnNSc6IDUsICc4JzogOCB9LAorICAgICAgICAgICd4dHJ1Y3RzJzogW3sKKyAgICAgICAgICAgICAgJ3N0cmluZ190aGluZyc6ICdHb29kYnllNCcsCisgICAgICAgICAgICAgICdieXRlX3RoaW5nJzogNCwKKyAgICAgICAgICAgICAgJ2kzMl90aGluZyc6IDQsCisgICAgICAgICAgICAgICdpNjRfdGhpbmcnOiA0CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAnc3RyaW5nX3RoaW5nJzogJ0hlbGxvMicsCisgICAgICAgICAgICAgICdieXRlX3RoaW5nJzogMiwKKyAgICAgICAgICAgICAgJ2kzMl90aGluZyc6IDIsCisgICAgICAgICAgICAgICdpNjRfdGhpbmcnOiAyCisgICAgICAgICAgICB9CisgICAgICAgICAgXQorICAgICAgICB9LAorICAgICAgICAnMyc6IHsKKyAgICAgICAgICAndXNlck1hcCc6IHsgJzUnOiA1LCAnOCc6IDggfSwKKyAgICAgICAgICAneHRydWN0cyc6IFt7CisgICAgICAgICAgICAgICdzdHJpbmdfdGhpbmcnOiAnR29vZGJ5ZTQnLAorICAgICAgICAgICAgICAnYnl0ZV90aGluZyc6IDQsCisgICAgICAgICAgICAgICdpMzJfdGhpbmcnOiA0LAorICAgICAgICAgICAgICAnaTY0X3RoaW5nJzogNAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgJ3N0cmluZ190aGluZyc6ICdIZWxsbzInLAorICAgICAgICAgICAgICAnYnl0ZV90aGluZyc6IDIsCisgICAgICAgICAgICAgICdpMzJfdGhpbmcnOiAyLAorICAgICAgICAgICAgICAnaTY0X3RoaW5nJzogMgorICAgICAgICAgICAgfQorICAgICAgICAgIF0KKyAgICAgICAgfQorICAgICAgfSwKKyAgICAgICcyJzogeyAnNic6IHsgJ3VzZXJNYXAnOiBudWxsLCAneHRydWN0cyc6IG51bGwgfSB9CisgICAgfTsKKyAgICBjbGllbnQudGVzdEluc2FuaXR5KG5ldyBUaHJpZnRUZXN0Lkluc2FuaXR5KCkpLnRoZW4oZnVuY3Rpb24ocmVzKSB7CisgICAgICBhc3NlcnQub2socmVzLCBKU09OLnN0cmluZ2lmeShyZXMpKTsKKyAgICAgIGFzc2VydC5vayhpbnNhbml0eSwgSlNPTi5zdHJpbmdpZnkoaW5zYW5pdHkpKTsKKyAgICAgIGNoZWNrUmVjdXJzaXZlbHkoYXNzZXJ0LCByZXMsIGluc2FuaXR5KTsKKyAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CisKK1FVbml0Lm1vZHVsZSgnT25ld2F5Jyk7CisgIFFVbml0LnRlc3QoJ3Rlc3RPbmV3YXknLCBmdW5jdGlvbiggYXNzZXJ0ICkgeworICAgIGFzc2VydC5leHBlY3QoMSk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOworICAgIGNsaWVudC50ZXN0T25ld2F5KDEpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCB1bmRlZmluZWQpOworICAgICAgZG9uZSgpOworICAgIH0pOworICB9KTsKZGlmZiAtLWdpdCBhL2xpYi9qcy90ZXN0L3Rlc3QtanEuanMgYi9saWIvanMvdGVzdC90ZXN0LWpxLmpzCmluZGV4IDY0NjA4ZmUuLmY2MmJiOTUgMTAwNjQ0Ci0tLSBhL2xpYi9qcy90ZXN0L3Rlc3QtanEuanMKKysrIGIvbGliL2pzL3Rlc3QvdGVzdC1qcS5qcwpAQCAtMSwxNTggKzEsMTU5IEBACi3vu78vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0gLyoganNoaW50IC1XMTAwICovDQotIA0KLS8qDQotICogSmF2YVNjcmlwdCB0ZXN0IHN1aXRlIGZvciBUaHJpZnRUZXN0LnRocmlmdC4gVGhlc2UgdGVzdHMNCi0gKiB3aWxsIHJ1biBvbmx5IHdpdGggalF1ZXJ5ICgtZ2VuIGpzOmpxdWVyeSkgQXBhY2hlIFRocmlmdCANCi0gKiBpbnRlcmZhY2VzLiBUbyBjcmVhdGUgY2xpZW50IGNvZGU6DQotICogICAgICAkIHRocmlmdCAtZ2VuIGpzOmpxdWVyeSBUaHJpZnRUZXN0LnRocmlmdA0KLSAqDQotICogU2VlIGFsc286DQotICogKysgdGVzdC5qcyBmb3IgZ2VuZXJpYyB0ZXN0cyAgDQotICogKysgdGVzdC1ub2pxLmpzIGZvciAiLWdlbiBqcyIgb25seSB0ZXN0cw0KLSAqLw0KLQ0KLQ0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0vL2pRdWVyeSBhc3luY2hyb25vdXMgdGVzdHMNCi1qUXVlcnkuYWpheFNldHVwKHsgdGltZW91dDogMCB9KTsNCi0kKGRvY3VtZW50KS5hamF4RXJyb3IoIGZ1bmN0aW9uKCkgeyBRVW5pdC5zdGFydCgpOyB9ICk7DQotDQotbW9kdWxlKCJqUSBBc3luYyBNYW51YWwiKTsNCi0NCi0gIHRlc3QoInRlc3RJMzIiLCBmdW5jdGlvbigpIHsNCi0gICAgZXhwZWN0KCAyICk7DQotICAgIFFVbml0LnN0b3AoKTsNCi0NCi0gICAgdmFyIHRyYW5zcG9ydCA9IG5ldyBUaHJpZnQuVHJhbnNwb3J0KCk7DQotICAgIHZhciBwcm90b2NvbCAgPSBuZXcgVGhyaWZ0LlByb3RvY29sKHRyYW5zcG9ydCk7DQotICAgIHZhciBjbGllbnQgICAgPSBuZXcgVGhyaWZ0VGVzdC5UaHJpZnRUZXN0Q2xpZW50KHByb3RvY29sKTsNCi0NCi0gICAgdmFyIGpxeGhyID0galF1ZXJ5LmFqYXgoew0KLSAgICAgIHVybDogIi9zZXJ2aWNlIiwNCi0gICAgICBkYXRhOiBjbGllbnQuc2VuZF90ZXN0STMyKE1hdGgucG93KC0yLDMxKSksDQotICAgICAgdHlwZTogIlBPU1QiLA0KLSAgICAgIGNhY2hlOiBmYWxzZSwNCi0gICAgICBkYXRhVHlwZTogInRleHQiLA0KLSAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKHJlcyl7DQotICAgICAgICB0cmFuc3BvcnQuc2V0UmVjdkJ1ZmZlciggcmVzICk7DQotICAgICAgICBlcXVhbChjbGllbnQucmVjdl90ZXN0STMyKCksIE1hdGgucG93KC0yLDMxKSk7DQotICAgICAgfSwNCi0gICAgICBlcnJvcjogZnVuY3Rpb24oKSB7IG9rKGZhbHNlKTsgfSwNCi0gICAgICBjb21wbGV0ZTogZnVuY3Rpb24oKSB7DQotICAgICAgICBvayh0cnVlKTsNCi0gICAgICAgIFFVbml0LnN0YXJ0KCk7DQotICAgICAgfQ0KLSAgICB9KTsNCi0gIH0pOw0KLQ0KLSAgdGVzdCgidGVzdEk2NCIsIGZ1bmN0aW9uKCkgew0KLSAgICBleHBlY3QoIDIgKTsNCi0gICAgUVVuaXQuc3RvcCgpOw0KLQ0KLSAgICB2YXIgdHJhbnNwb3J0ID0gbmV3IFRocmlmdC5UcmFuc3BvcnQoKTsNCi0gICAgdmFyIHByb3RvY29sICA9IG5ldyBUaHJpZnQuUHJvdG9jb2wodHJhbnNwb3J0KTsNCi0gICAgdmFyIGNsaWVudCAgICA9IG5ldyBUaHJpZnRUZXN0LlRocmlmdFRlc3RDbGllbnQocHJvdG9jb2wpOw0KLQ0KLSAgICBqUXVlcnkuYWpheCh7DQotICAgICAgdXJsOiAiL3NlcnZpY2UiLA0KLSAgICAgIC8vVGhpcyBpcyB1c3VhbGx5IDJeNjEgYnV0IEpTIGNhbm5vdCByZXByZXNlbnQgYW55dGhpbmcgb3ZlciAyXjUyIGFjY3VyYXRlbHkNCi0gICAgICBkYXRhOiBjbGllbnQuc2VuZF90ZXN0STY0KE1hdGgucG93KC0yLDUyKSksDQotICAgICAgdHlwZTogIlBPU1QiLA0KLSAgICAgIGNhY2hlOiBmYWxzZSwNCi0gICAgICBkYXRhVHlwZTogInRleHQiLA0KLSAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKHJlcyl7DQotICAgICAgICB0cmFuc3BvcnQuc2V0UmVjdkJ1ZmZlciggcmVzICk7DQotICAgICAgICAvL1RoaXMgaXMgdXN1YWxseSAyXjYxIGJ1dCBKUyBjYW5ub3QgcmVwcmVzZW50IGFueXRoaW5nIG92ZXIgMl41MiBhY2N1cmF0ZWx5DQotICAgICAgICBlcXVhbChjbGllbnQucmVjdl90ZXN0STY0KCksIE1hdGgucG93KC0yLDUyKSk7DQotICAgICAgfSwNCi0gICAgICBlcnJvcjogZnVuY3Rpb24oKSB7IG9rKGZhbHNlKTsgfSwNCi0gICAgICBjb21wbGV0ZTogZnVuY3Rpb24oKSB7DQotICAgICAgICBvayh0cnVlKTsNCi0gICAgICAgIFFVbml0LnN0YXJ0KCk7DQotICAgICAgfQ0KLSAgICB9KTsNCi0gIH0pOw0KLQ0KLQ0KLW1vZHVsZSgialEgQXN5bmMiKTsNCi0gIHRlc3QoIkkzMiIsIGZ1bmN0aW9uKCkgew0KLSAgICBleHBlY3QoIDMgKTsNCi0NCi0gICAgUVVuaXQuc3RvcCgpOw0KLSAgICBjbGllbnQudGVzdEkzMihNYXRoLnBvdygyLDMwKSwgZnVuY3Rpb24ocmVzdWx0KSB7DQotICAgICAgZXF1YWwocmVzdWx0LCBNYXRoLnBvdygyLDMwKSk7DQotICAgICAgUVVuaXQuc3RhcnQoKTsNCi0gICAgfSk7DQotDQotICAgIFFVbml0LnN0b3AoKTsNCi0gICAgdmFyIGpxeGhyID0gY2xpZW50LnRlc3RJMzIoTWF0aC5wb3coLTIsMzEpLCBmdW5jdGlvbihyZXN1bHQpIHsNCi0gICAgICBlcXVhbChyZXN1bHQsIE1hdGgucG93KC0yLDMxKSk7DQotICAgIH0pOw0KLQ0KLSAgICBqcXhoci5zdWNjZXNzKGZ1bmN0aW9uKHJlc3VsdCkgew0KLSAgICAgIGVxdWFsKHJlc3VsdCwgTWF0aC5wb3coLTIsMzEpKTsNCi0gICAgICBRVW5pdC5zdGFydCgpOw0KLSAgICB9KTsNCi0gIH0pOw0KLQ0KLSAgdGVzdCgiSTY0IiwgZnVuY3Rpb24oKSB7DQotICAgIGV4cGVjdCggNCApOw0KLQ0KLSAgICBRVW5pdC5zdG9wKCk7DQotICAgIC8vVGhpcyBpcyB1c3VhbGx5IDJeNjAgYnV0IEpTIGNhbm5vdCByZXByZXNlbnQgYW55dGhpbmcgb3ZlciAyXjUyIGFjY3VyYXRlbHkNCi0gICAgY2xpZW50LnRlc3RJNjQoTWF0aC5wb3coMiw1MiksIGZ1bmN0aW9uKHJlc3VsdCkgew0KLSAgICAgIGVxdWFsKHJlc3VsdCwgTWF0aC5wb3coMiw1MikpOw0KLSAgICAgIFFVbml0LnN0YXJ0KCk7DQotICAgIH0pOw0KLQ0KLSAgICBRVW5pdC5zdG9wKCk7DQotICAgIC8vVGhpcyBpcyB1c3VhbGx5IDJeNjAgYnV0IEpTIGNhbm5vdCByZXByZXNlbnQgYW55dGhpbmcgb3ZlciAyXjUyIGFjY3VyYXRlbHkNCi0gICAgY2xpZW50LnRlc3RJNjQoTWF0aC5wb3coLTIsNTIpLCBmdW5jdGlvbihyZXN1bHQpIHsNCi0gICAgICBlcXVhbChyZXN1bHQsIE1hdGgucG93KC0yLDUyKSk7DQotICAgIH0pDQotICAgIC5lcnJvciggZnVuY3Rpb24oeGhyLCBzdGF0dXMsIGUpIHsgIG9rKGZhbHNlLCBlLm1lc3NhZ2UpOyB9ICkNCi0gICAgLnN1Y2Nlc3MoZnVuY3Rpb24ocmVzdWx0KSB7DQotICAgICAgLy9UaGlzIGlzIHVzdWFsbHkgMl42MCBidXQgSlMgY2Fubm90IHJlcHJlc2VudCBhbnl0aGluZyBvdmVyIDJeNTIgYWNjdXJhdGVseQ0KLSAgICAgIGVxdWFsKHJlc3VsdCwgTWF0aC5wb3coLTIsNTIpKTsNCi0gICAgfSkNCi0gICAgLmNvbXBsZXRlKGZ1bmN0aW9uKCkgew0KLSAgICAgIG9rKHRydWUpOw0KLSAgICAgIFFVbml0LnN0YXJ0KCk7DQotICAgIH0pOw0KLSAgfSk7DQotDQotICB0ZXN0KCJYY2VwdGlvbiIsIGZ1bmN0aW9uKCkgew0KLSAgICBleHBlY3QoIDIgKTsNCi0NCi0gICAgUVVuaXQuc3RvcCgpOw0KLQ0KLSAgICB2YXIgZGZkID0gY2xpZW50LnRlc3RFeGNlcHRpb24oIlhjZXB0aW9uIiwgZnVuY3Rpb24ocmVzdWx0KSB7DQotICAgICAgb2soZmFsc2UpOw0KLSAgICAgIFFVbml0LnN0YXJ0KCk7DQotICAgIH0pDQotICAgIC5lcnJvcihmdW5jdGlvbih4aHIsIHN0YXR1cywgZSl7DQotICAgICAgZXF1YWwoZS5lcnJvckNvZGUsIDEwMDEpOw0KLSAgICAgIGVxdWFsKGUubWVzc2FnZSwgIlhjZXB0aW9uIik7DQotICAgICAgLy9RVW5pdC5zdGFydCgpOw0KLSAgICAgIC8vTm90ZSBzdGFydCBpcyBub3QgcmVxdWlyZWQgaGVyZSBiZWNhdXNlOg0KLSAgICAgIC8vJChkb2N1bWVudCkuYWpheEVycm9yKCBmdW5jdGlvbigpIHsgUVVuaXQuc3RhcnQoKTsgfSApOw0KLSAgICB9KTsNCi0gIH0pOw0KK++7vy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyAvKiBqc2hpbnQgLVcxMDAgKi8KKworLyoKKyAqIEphdmFTY3JpcHQgdGVzdCBzdWl0ZSBmb3IgVGhyaWZ0VGVzdC50aHJpZnQuIFRoZXNlIHRlc3RzCisgKiB3aWxsIHJ1biBvbmx5IHdpdGggalF1ZXJ5ICgtZ2VuIGpzOmpxdWVyeSkgQXBhY2hlIFRocmlmdAorICogaW50ZXJmYWNlcy4gVG8gY3JlYXRlIGNsaWVudCBjb2RlOgorICogICAgICAkIHRocmlmdCAtZ2VuIGpzOmpxdWVyeSBUaHJpZnRUZXN0LnRocmlmdAorICoKKyAqIFNlZSBhbHNvOgorICogKysgdGVzdC5qcyBmb3IgZ2VuZXJpYyB0ZXN0cworICogKysgdGVzdC1ub2pxLmpzIGZvciAiLWdlbiBqcyIgb25seSB0ZXN0cworICovCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy9qUXVlcnkgYXN5bmNocm9ub3VzIHRlc3RzCitqUXVlcnkuYWpheFNldHVwKHsgdGltZW91dDogMCB9KTsKKworUVVuaXQubW9kdWxlKCdqUSBBc3luYyBNYW51YWwnKTsKKworICBRVW5pdC50ZXN0KCd0ZXN0STMyJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmV4cGVjdCgyKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKDIpOworCisgICAgY29uc3QgdHJhbnNwb3J0ID0gbmV3IFRocmlmdC5UcmFuc3BvcnQoKTsKKyAgICBjb25zdCBwcm90b2NvbCA9IG5ldyBUaHJpZnQuUHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgICBjb25zdCBjbGllbnQgPSBuZXcgVGhyaWZ0VGVzdC5UaHJpZnRUZXN0Q2xpZW50KHByb3RvY29sKTsKKworICAgIGNvbnN0IGpxeGhyID0galF1ZXJ5LmFqYXgoeworICAgICAgdXJsOiAnL3NlcnZpY2UnLAorICAgICAgZGF0YTogY2xpZW50LnNlbmRfdGVzdEkzMihNYXRoLnBvdygtMiwgMzEpKSwKKyAgICAgIHR5cGU6ICdQT1NUJywKKyAgICAgIGNhY2hlOiBmYWxzZSwKKyAgICAgIGRhdGFUeXBlOiAndGV4dCcsCisgICAgICBzdWNjZXNzOiBmdW5jdGlvbihyZXMpIHsKKyAgICAgICAgdHJhbnNwb3J0LnNldFJlY3ZCdWZmZXIocmVzKTsKKyAgICAgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC5yZWN2X3Rlc3RJMzIoKSwgTWF0aC5wb3coLTIsIDMxKSk7CisgICAgICAgIGRvbmUoKTsKKyAgICAgIH0sCisgICAgICBlcnJvcjogZnVuY3Rpb24oKSB7IGFzc2VydC5vayhmYWxzZSk7IH0sCisgICAgICBjb21wbGV0ZTogZnVuY3Rpb24oKSB7CisgICAgICAgIGFzc2VydC5vayh0cnVlKTsKKyAgICAgICAgZG9uZSgpOworICAgICAgfQorICAgIH0pOworICB9KTsKKworICBRVW5pdC50ZXN0KCd0ZXN0STY0JywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmV4cGVjdCgyKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKDIpOworCisgICAgY29uc3QgdHJhbnNwb3J0ID0gbmV3IFRocmlmdC5UcmFuc3BvcnQoKTsKKyAgICBjb25zdCBwcm90b2NvbCA9IG5ldyBUaHJpZnQuUHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgICBjb25zdCBjbGllbnQgPSBuZXcgVGhyaWZ0VGVzdC5UaHJpZnRUZXN0Q2xpZW50KHByb3RvY29sKTsKKworICAgIGpRdWVyeS5hamF4KHsKKyAgICAgIHVybDogJy9zZXJ2aWNlJywKKyAgICAgIC8vVGhpcyBpcyB1c3VhbGx5IDJeNjEgYnV0IEpTIGNhbm5vdCByZXByZXNlbnQgYW55dGhpbmcgb3ZlciAyXjUyIGFjY3VyYXRlbHkKKyAgICAgIGRhdGE6IGNsaWVudC5zZW5kX3Rlc3RJNjQoTWF0aC5wb3coLTIsIDUyKSksCisgICAgICB0eXBlOiAnUE9TVCcsCisgICAgICBjYWNoZTogZmFsc2UsCisgICAgICBkYXRhVHlwZTogJ3RleHQnLAorICAgICAgc3VjY2VzczogZnVuY3Rpb24ocmVzKSB7CisgICAgICAgIHRyYW5zcG9ydC5zZXRSZWN2QnVmZmVyKHJlcyk7CisgICAgICAgIC8vVGhpcyBpcyB1c3VhbGx5IDJeNjEgYnV0IEpTIGNhbm5vdCByZXByZXNlbnQgYW55dGhpbmcgb3ZlciAyXjUyIGFjY3VyYXRlbHkKKyAgICAgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC5yZWN2X3Rlc3RJNjQoKSwgTWF0aC5wb3coLTIsIDUyKSk7CisgICAgICAgIGRvbmUoKTsKKyAgICAgIH0sCisgICAgICBlcnJvcjogZnVuY3Rpb24oKSB7IGFzc2VydC5vayhmYWxzZSk7IH0sCisgICAgICBjb21wbGV0ZTogZnVuY3Rpb24oKSB7CisgICAgICAgIGFzc2VydC5vayh0cnVlKTsKKyAgICAgICAgZG9uZSgpOworICAgICAgfQorICAgIH0pOworICB9KTsKKworCitRVW5pdC5tb2R1bGUoJ2pRIEFzeW5jJyk7CisgIFFVbml0LnRlc3QoJ0kzMicsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoMyk7CisKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKDMpOworICAgIGNsaWVudC50ZXN0STMyKE1hdGgucG93KDIsIDMwKSwgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCBNYXRoLnBvdygyLCAzMCkpOworICAgICAgZG9uZSgpOworICAgIH0pOworCisgICAgY29uc3QganF4aHIgPSBjbGllbnQudGVzdEkzMihNYXRoLnBvdygtMiwgMzEpLCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIE1hdGgucG93KC0yLCAzMSkpOworICAgICAgZG9uZSgpOworICAgIH0pOworCisgICAganF4aHIuc3VjY2VzcyhmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIE1hdGgucG93KC0yLCAzMSkpOworICAgICAgZG9uZSgpOworICAgIH0pOworICB9KTsKKworICBRVW5pdC50ZXN0KCdJNjQnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXhwZWN0KDQpOworCisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYyg0KTsKKyAgICAvL1RoaXMgaXMgdXN1YWxseSAyXjYwIGJ1dCBKUyBjYW5ub3QgcmVwcmVzZW50IGFueXRoaW5nIG92ZXIgMl41MiBhY2N1cmF0ZWx5CisgICAgY2xpZW50LnRlc3RJNjQoTWF0aC5wb3coMiwgNTIpLCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIE1hdGgucG93KDIsIDUyKSk7CisgICAgICBkb25lKCk7CisgICAgfSk7CisKKyAgICAvL1RoaXMgaXMgdXN1YWxseSAyXjYwIGJ1dCBKUyBjYW5ub3QgcmVwcmVzZW50IGFueXRoaW5nIG92ZXIgMl41MiBhY2N1cmF0ZWx5CisgICAgY2xpZW50LnRlc3RJNjQoTWF0aC5wb3coLTIsIDUyKSwgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCBNYXRoLnBvdygtMiwgNTIpKTsKKyAgICAgIGRvbmUoKTsKKyAgICB9KQorICAgIC5lcnJvcihmdW5jdGlvbih4aHIsIHN0YXR1cywgZSkgeyBhc3NlcnQub2soZmFsc2UsIGUubWVzc2FnZSk7IH0pCisgICAgLnN1Y2Nlc3MoZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICAvL1RoaXMgaXMgdXN1YWxseSAyXjYwIGJ1dCBKUyBjYW5ub3QgcmVwcmVzZW50IGFueXRoaW5nIG92ZXIgMl41MiBhY2N1cmF0ZWx5CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCBNYXRoLnBvdygtMiwgNTIpKTsKKyAgICAgIGRvbmUoKTsKKyAgICB9KQorICAgIC5jb21wbGV0ZShmdW5jdGlvbigpIHsKKyAgICAgIGFzc2VydC5vayh0cnVlKTsKKyAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CisKKyAgUVVuaXQudGVzdCgnWGNlcHRpb24nLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXhwZWN0KDIpOworCisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygyKTsKKworICAgIGNvbnN0IGRmZCA9IGNsaWVudC50ZXN0RXhjZXB0aW9uKCdYY2VwdGlvbicsIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgYXNzZXJ0Lm9rKGZhbHNlKTsKKyAgICAgIGRvbmUoKTsKKyAgICB9KQorICAgIC5lcnJvcihmdW5jdGlvbih4aHIsIHN0YXR1cywgZSkgeworICAgICAgYXNzZXJ0LmVxdWFsKGUuZXJyb3JDb2RlLCAxMDAxKTsKKyAgICAgIGFzc2VydC5lcXVhbChlLm1lc3NhZ2UsICdYY2VwdGlvbicpOworICAgICAgZG9uZSgpOworICAgICAgJChkb2N1bWVudCkuYWpheEVycm9yKCBmdW5jdGlvbigpIHsgZG9uZSgpOyB9ICk7CisgICAgfSk7CisgIH0pOwpkaWZmIC0tZ2l0IGEvbGliL2pzL3Rlc3QvdGVzdC1ub2pxLmh0bWwgYi9saWIvanMvdGVzdC90ZXN0LW5vanEuaHRtbAppbmRleCAyOTA4MTZlLi40MDg0MjRlIDEwMDY0NAotLS0gYS9saWIvanMvdGVzdC90ZXN0LW5vanEuaHRtbAorKysgYi9saWIvanMvdGVzdC90ZXN0LW5vanEuaHRtbApAQCAtMjcsMjQgKzI3LDI2IEBACiAgIDxzY3JpcHQgc3JjPSJnZW4tanMvVGhyaWZ0VGVzdC5qcyIgICAgICAgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CiAKICAgPCEtLSBRVW5pdCBUZXN0IGZyYW1ld29yay0tPgotICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwOi8vY29kZS5qcXVlcnkuY29tL3F1bml0L3F1bml0LTEuMTQuMC5qcyIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgotICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHA6Ly9jb2RlLmpxdWVyeS5jb20vcXVuaXQvcXVuaXQtMS4xNC4wLmNzcyIgdHlwZT0idGV4dC9jc3MiIG1lZGlhPSJzY3JlZW4iIC8+Ci0gIAorICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJidWlsZC9qcy9saWIvcXVuaXQuanMiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KKyAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJidWlsZC9qcy9saWIvcXVuaXQuY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgbWVkaWE9InNjcmVlbiIgLz4KKwogICA8IS0tIHRoZSBUZXN0IFN1aXRlLS0+CiAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InRlc3QuanMiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idGVzdC1ub2pxLmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CiA8L2hlYWQ+CiA8Ym9keT4KLSAgPGgxIGlkPSJxdW5pdC1oZWFkZXIiPlRocmlmdCBKYXZhc2NyaXB0IEJpbmRpbmdzOiBVbml0IFRlc3QgKDxhIGhyZWY9Imh0dHBzOi8vZ2l0LXdpcC11cy5hcGFjaGUub3JnL3JlcG9zL2FzZj9wPXRocmlmdC5naXQ7YT1ibG9iO2Y9dGVzdC9UaHJpZnRUZXN0LnRocmlmdDtoYj1IRUFEIj5UaHJpZnRUZXN0LnRocmlmdDwvYT4pPC9oMT4KKyAgPGgxIGlkPSJxdW5pdC1oZWFkZXIiPlRocmlmdCBKYXZhc2NyaXB0IEJpbmRpbmdzOiBVbml0IFRlc3QgKDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0L2Jsb2IvbWFzdGVyL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQiPlRocmlmdFRlc3QudGhyaWZ0PC9hPik8L2gxPgogICA8aDIgaWQ9InF1bml0LWJhbm5lciI+PC9oMj4KLSAgPGRpdiBpZD0icXVuaXQtdGVzdHJ1bm5lci10b29sYmFyIj48L2Rpdj4gCisgIDxkaXYgaWQ9InF1bml0LXRlc3RydW5uZXItdG9vbGJhciI+PC9kaXY+CiAgIDxoMiBpZD0icXVuaXQtdXNlckFnZW50Ij48L2gyPgogICA8b2wgaWQ9InF1bml0LXRlc3RzIj48bGk+PCEtLSBnZXQgdmFsaWQgeGh0bWwgc3RyaWN0LS0+PC9saT48L29sPgorICA8IS0tIFVuY29tbWVudCB0aGlzIHRvIGNoZWNrIHRoZSB2YWxpZGl0eS4gVGhpcyBzaWduaWZpY2FudGx5IHNsb3dzIGRvd24gdGhlIHRlc3QuCiAgIDxwPgogICAgICAgPGEgaHJlZj0iaHR0cDovL3ZhbGlkYXRvci53My5vcmcvY2hlY2svcmVmZXJlciI+PGltZwogICAgICAgICAgIHNyYz0iaHR0cDovL3d3dy53My5vcmcvSWNvbnMvdmFsaWQteGh0bWwxMCIKICAgICAgICAgICBhbHQ9IlZhbGlkIFhIVE1MIDEuMCEiIGhlaWdodD0iMzEiIHdpZHRoPSI4OCIgLz48L2E+CiAgIDwvcD4KKyAgLS0+CiA8L2JvZHk+CiA8L2h0bWw+CiAKZGlmZiAtLWdpdCBhL2xpYi9qcy90ZXN0L3Rlc3Qtbm9qcS5qcyBiL2xpYi9qcy90ZXN0L3Rlc3Qtbm9qcS5qcwppbmRleCAxOWY5ZTYxLi4yYjgwMWQyIDEwMDY0NAotLS0gYS9saWIvanMvdGVzdC90ZXN0LW5vanEuanMKKysrIGIvbGliL2pzL3Rlc3QvdGVzdC1ub2pxLmpzCkBAIC0xNyw3ICsxNyw3IEBACiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogIC8qIGpzaGludCAtVzEwMCAqLwotIAorCiAvKgogICogSmF2YVNjcmlwdCB0ZXN0IHN1aXRlIGZvciBUaHJpZnRUZXN0LnRocmlmdC4gVGhlc2UgdGVzdHMKICAqIHdpbGwgcnVuIG9ubHkgd2l0aCBub3JtYWwgIi1nZW4ganMiIEFwYWNoZSBUaHJpZnQgaW50ZXJmYWNlcy4KQEAgLTI1LDcgKzI1LDcgQEAKICAqICAgICAgJCB0aHJpZnQgLWdlbiBqcyBUaHJpZnRUZXN0LnRocmlmdAogICoKICAqIFNlZSBhbHNvOgotICogKysgdGVzdC5qcyBmb3IgZ2VuZXJpYyB0ZXN0cyAgCisgKiArKyB0ZXN0LmpzIGZvciBnZW5lcmljIHRlc3RzCiAgKiArKyB0ZXN0LWpxLmpzIGZvciAiLWdlbiBqczpqcXVlcnkiIG9ubHkgdGVzdHMKICAqLwogCkBAIC0zMywxNyArMzMsMTYgQEAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIC8vQXN5bmMgZXhjZXB0aW9uIHRlc3RzCiAKLW1vZHVsZSgiTm9qUSBBc3luYyIpOworUVVuaXQubW9kdWxlKCdOb2pRIEFzeW5jJyk7CiAKLSAgdGVzdCgiWGNlcHRpb24iLCBmdW5jdGlvbigpIHsKLSAgICBleHBlY3QoIDIgKTsKK1FVbml0LnRlc3QoJ1hjZXB0aW9uJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmV4cGVjdCgyKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CiAKLSAgICBRVW5pdC5zdG9wKCk7Ci0KLSAgICBjbGllbnQudGVzdEV4Y2VwdGlvbigiWGNlcHRpb24iLCBmdW5jdGlvbihyZXN1bHQpIHsKLSAgICAgIGVxdWFsKHJlc3VsdC5lcnJvckNvZGUsIDEwMDEpOwotICAgICAgZXF1YWwocmVzdWx0Lm1lc3NhZ2UsICJYY2VwdGlvbiIpOwotICAgICAgUVVuaXQuc3RhcnQoKTsKKyAgICBjbGllbnQudGVzdEV4Y2VwdGlvbignWGNlcHRpb24nLCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQuZXJyb3JDb2RlLCAxMDAxKTsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQubWVzc2FnZSwgJ1hjZXB0aW9uJyk7CisgICAgICBkb25lKCk7CiAgICAgfSk7CiAgIH0pOwogCmRpZmYgLS1naXQgYS9saWIvanMvdGVzdC90ZXN0Lmh0bWwgYi9saWIvanMvdGVzdC90ZXN0Lmh0bWwKaW5kZXggY2Y5ODc0Zi4uOGI2NzAxNCAxMDA3NTUKLS0tIGEvbGliL2pzL3Rlc3QvdGVzdC5odG1sCisrKyBiL2xpYi9qcy90ZXN0L3Rlc3QuaHRtbApAQCAtMSw1NyArMSw1NCBAQAot77u/PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPg0KLTwhLS0NCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPg0KLTxoZWFkPg0KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+DQotICA8dGl0bGU+VGhyaWZ0IEphdmFzY3JpcHQgQmluZGluZ3M6IFVuaXQgVGVzdDwvdGl0bGU+DQotDQotICA8c2NyaXB0IHNyYz0iLi4vc3JjL3RocmlmdC5qcyIgICAgICAgICB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4NCi0gIDxzY3JpcHQgc3JjPSJnZW4tanMvVGhyaWZ0VGVzdF90eXBlcy5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+DQotICA8c2NyaXB0IHNyYz0iZ2VuLWpzL1RocmlmdFRlc3QuanMiICAgICAgIHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0Pg0KLQ0KLSAgPCEtLSBqUXVlcnkgLS0+DQotICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwOi8vY29kZS5qcXVlcnkuY29tL2pxdWVyeS0xLjcuMi5qcyIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0Pg0KLSAgDQotICA8IS0tIFFVbml0IFRlc3QgZnJhbWV3b3JrLS0+DQotICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwOi8vY29kZS5qcXVlcnkuY29tL3F1bml0L3F1bml0LTEuMTQuMC5qcyIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0Pg0KLSAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwOi8vY29kZS5qcXVlcnkuY29tL3F1bml0L3F1bml0LTEuMTQuMC5jc3MiIHR5cGU9InRleHQvY3NzIiBtZWRpYT0ic2NyZWVuIiAvPg0KLSAgDQotICA8IS0tIHRoZSBUZXN0IFN1aXRlLS0+DQotICA8c2NyaXB0Pg0KLSAgICB2YXIgdHJhbnNwb3J0ID0gbmV3IFRocmlmdC5UcmFuc3BvcnQoIi9zZXJ2aWNlIik7DQotICAgIHZhciBwcm90b2NvbCAgPSBuZXcgVGhyaWZ0LlByb3RvY29sKHRyYW5zcG9ydCk7DQotICAgIHZhciBjbGllbnQgICAgPSBuZXcgVGhyaWZ0VGVzdC5UaHJpZnRUZXN0Q2xpZW50KHByb3RvY29sKTsNCi0gIDwvc2NyaXB0Pg0KLSAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idGVzdC5qcyIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0Pg0KLSAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idGVzdC1qcS5qcyIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0Pg0KLTwvaGVhZD4NCi08Ym9keT4NCi0gIDxoMSBpZD0icXVuaXQtaGVhZGVyIj5UaHJpZnQgSmF2YXNjcmlwdCBCaW5kaW5nczogVW5pdCBUZXN0ICg8YSBocmVmPSJodHRwczovL2dpdC13aXAtdXMuYXBhY2hlLm9yZy9yZXBvcy9hc2Y/cD10aHJpZnQuZ2l0O2E9YmxvYjtmPXRlc3QvVGhyaWZ0VGVzdC50aHJpZnQ7aGI9SEVBRCI+VGhyaWZ0VGVzdC50aHJpZnQ8L2E+KTwvaDE+DQotICA8aDIgaWQ9InF1bml0LWJhbm5lciI+PC9oMj4NCi0gIDxkaXYgaWQ9InF1bml0LXRlc3RydW5uZXItdG9vbGJhciI+PC9kaXY+IA0KLSAgPGgyIGlkPSJxdW5pdC11c2VyQWdlbnQiPjwvaDI+DQotICA8b2wgaWQ9InF1bml0LXRlc3RzIj48bGk+PCEtLSBnZXQgdmFsaWQgeGh0bWwgc3RyaWN0LS0+PC9saT48L29sPg0KLSAgPHA+DQotICAgICAgPGEgaHJlZj0iaHR0cDovL3ZhbGlkYXRvci53My5vcmcvY2hlY2svcmVmZXJlciI+PGltZw0KLSAgICAgICAgICBzcmM9Imh0dHA6Ly93d3cudzMub3JnL0ljb25zL3ZhbGlkLXhodG1sMTAiDQotICAgICAgICAgIGFsdD0iVmFsaWQgWEhUTUwgMS4wISIgaGVpZ2h0PSIzMSIgd2lkdGg9Ijg4IiAvPjwvYT4NCi0gIDwvcD4NCi08L2JvZHk+DQotPC9odG1sPg0KKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgorPGhlYWQ+CisgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgorICA8dGl0bGU+VGhyaWZ0IEphdmFzY3JpcHQgQmluZGluZ3M6IFVuaXQgVGVzdDwvdGl0bGU+CisKKyAgPHNjcmlwdCBzcmM9ImJ1aWxkL2pzL3RocmlmdC5qcyIgICAgICAgICB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KKyAgPHNjcmlwdCBzcmM9Imdlbi1qcy1qcXVlcnkvVGhyaWZ0VGVzdF90eXBlcy5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CisgIDxzY3JpcHQgc3JjPSJnZW4tanMtanF1ZXJ5L1RocmlmdFRlc3QuanMiICAgICAgIHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgorCisgIDwhLS0galF1ZXJ5IC0tPgorICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJidWlsZC9qcy9saWIvanF1ZXJ5LmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CisKKyAgPCEtLSBRVW5pdCBUZXN0IGZyYW1ld29yay0tPgorICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJidWlsZC9qcy9saWIvcXVuaXQuanMiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KKyAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJidWlsZC9qcy9saWIvcXVuaXQuY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgbWVkaWE9InNjcmVlbiIgLz4KKworICA8IS0tIHRoZSBUZXN0IFN1aXRlLS0+CisgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InRlc3QuanMiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KKyAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idGVzdC1qcS5qcyIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgorPC9oZWFkPgorPGJvZHk+CisgIDxoMSBpZD0icXVuaXQtaGVhZGVyIj5UaHJpZnQgSmF2YXNjcmlwdCBCaW5kaW5nczogVW5pdCBUZXN0ICg8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC9ibG9iL21hc3Rlci90ZXN0L1RocmlmdFRlc3QudGhyaWZ0Ij5UaHJpZnRUZXN0LnRocmlmdDwvYT4pPC9oMT4KKyAgPGgyIGlkPSJxdW5pdC1iYW5uZXIiPjwvaDI+CisgIDxkaXYgaWQ9InF1bml0LXRlc3RydW5uZXItdG9vbGJhciI+PC9kaXY+CisgIDxoMiBpZD0icXVuaXQtdXNlckFnZW50Ij48L2gyPgorICA8b2wgaWQ9InF1bml0LXRlc3RzIj48bGk+PCEtLSBnZXQgdmFsaWQgeGh0bWwgc3RyaWN0LS0+PC9saT48L29sPgorICA8IS0tIFVuY29tbWVudCB0aGlzIHRvIGNoZWNrIHRoZSB2YWxpZGl0eS4gVGhpcyBzaWduaWZpY2FudGx5IHNsb3dzIGRvd24gdGhlIHRlc3QuCisgIDxwPgorICAgICAgPGEgaHJlZj0iaHR0cDovL3ZhbGlkYXRvci53My5vcmcvY2hlY2svcmVmZXJlciI+PGltZworICAgICAgICAgIHNyYz0iaHR0cDovL3d3dy53My5vcmcvSWNvbnMvdmFsaWQteGh0bWwxMCIKKyAgICAgICAgICBhbHQ9IlZhbGlkIFhIVE1MIDEuMCEiIGhlaWdodD0iMzEiIHdpZHRoPSI4OCIgLz48L2E+CisgIDwvcD4KKyAgLS0+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9saWIvanMvdGVzdC90ZXN0LmpzIGIvbGliL2pzL3Rlc3QvdGVzdC5qcwppbmRleCAxNTA0ZjYyLi5hODZhNTA5IDEwMDc1NQotLS0gYS9saWIvanMvdGVzdC90ZXN0LmpzCisrKyBiL2xpYi9qcy90ZXN0L3Rlc3QuanMKQEAgLTE3LDI0ICsxNywyNCBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KICAvKiBqc2hpbnQgLVcxMDAgKi8KLSAKKwogLyoKICAqIEphdmFTY3JpcHQgdGVzdCBzdWl0ZSBmb3IgVGhyaWZ0VGVzdC50aHJpZnQuIFRoZXNlIHRlc3RzCiAgKiB3aWxsIHJ1biBhZ2FpbnN0IE5vcm1hbCAoLWdlbiBqcykgYW5kIGpRdWVyeSAoLWdlbiBqczpqcXVlcnkpCiAgKiBBcGFjaGUgVGhyaWZ0IGludGVyZmFjZXMuCiAgKgotICogU3luY2hyb25vdXMgYmxvY2tpbmcgY2FsbHMgc2hvdWxkIGJlIGlkZW50aWNhbCBpbiBib3RoIAorICogU3luY2hyb25vdXMgYmxvY2tpbmcgY2FsbHMgc2hvdWxkIGJlIGlkZW50aWNhbCBpbiBib3RoCiAgKiBOb3JtYWwgYW5kIGpRdWVyeSBpbnRlcmZhY2VzLiBBbGwgc3luY2hyb25vdXMgdGVzdHMgYmVsb25nCiAgKiBoZXJlLgotICogCi0gKiBBc3luY2hyb25vdXMgc3VjZXNzIGNhbGxiYWNrcyBwYXNzZWQgYXMgdGhlIGxhc3QgcGFyYW1ldGVyIAorICoKKyAqIEFzeW5jaHJvbm91cyBzdWNjZXNzIGNhbGxiYWNrcyBwYXNzZWQgYXMgdGhlIGxhc3QgcGFyYW1ldGVyCiAgKiBvZiBhbiBSUEMgY2FsbCBzaG91bGQgYmUgaWRlbnRpY2FsIGluIGJvdGggTm9ybWFsIGFuZCBqUXVlcnkKICAqIGludGVyZmFjZXMuIEFzeW5jIHN1Y2Nlc3MgdGVzdHMgYmVsb25nIGhlcmUuCi0gKiAKKyAqCiAgKiBBc3luY2hyb25vdXMgZXhjZXB0aW9uIHByb2Nlc3NpbmcgaXMgZGlmZmVyZW50IGluIE5vcm1hbAogICogYW5kIGpRdWVyeSBpbnRlcmZhY2VzLiBTdWNoIHRlc3RzIGJlbG9uZyBpbiB0aGUgdGVzdC1ub2pxLmpzCiAgKiBvciB0ZXN0LWpxLmpzIGZpbGVzIHJlc3BlY3RpdmVseS4galF1ZXJ5IHNwZWNpZmljIFhIUiBvYmplY3QKLSAqIHRlc3RzIGFsc28gYmVsb25nIGluIHRlc3QtanEuanMuIERvIG5vdCBjcmVhdGUgYW55IGpRdWVyeSAKKyAqIHRlc3RzIGFsc28gYmVsb25nIGluIHRlc3QtanEuanMuIERvIG5vdCBjcmVhdGUgYW55IGpRdWVyeQogICogZGVwZW5kZW5jaWVzIGluIHRoaXMgZmlsZSBvciBpbiB0ZXN0LW5vanEuanMKICAqCiAgKiBUbyBjb21waWxlIGNsaWVudCBjb2RlIGZvciB0aGlzIHRlc3QgdXNlOgpAQCAtNDMsMTY2ICs0MywxOTkgQEAKICAqICAgICAgJCB0aHJpZnQgLWdlbiBqczpqcXVlcnkgVGhyaWZ0VGVzdC50aHJpZnQKICAqCiAgKiBTZWUgYWxzbzoKLSAqICsrIHRlc3Qtbm9qcS5qcyBmb3IgIi1nZW4ganMiIG9ubHkgdGVzdHMgIAorICogKysgdGVzdC1ub2pxLmpzIGZvciAiLWdlbiBqcyIgb25seSB0ZXN0cwogICogKysgdGVzdC1qcS5qcyBmb3IgIi1nZW4ganM6anF1ZXJ5IiBvbmx5IHRlc3RzCiAgKi8KIAotdmFyIHRyYW5zcG9ydCA9IG5ldyBUaHJpZnQuVHJhbnNwb3J0KCIvc2VydmljZSIpOwotdmFyIHByb3RvY29sICA9IG5ldyBUaHJpZnQuUHJvdG9jb2wodHJhbnNwb3J0KTsKLXZhciBjbGllbnQgICAgPSBuZXcgVGhyaWZ0VGVzdC5UaHJpZnRUZXN0Q2xpZW50KHByb3RvY29sKTsKK2NvbnN0IHRyYW5zcG9ydCA9IG5ldyBUaHJpZnQuVHJhbnNwb3J0KCcvc2VydmljZScpOworY29uc3QgcHJvdG9jb2wgPSBuZXcgVGhyaWZ0LlByb3RvY29sKHRyYW5zcG9ydCk7Citjb25zdCBjbGllbnQgPSBuZXcgVGhyaWZ0VGVzdC5UaHJpZnRUZXN0Q2xpZW50KHByb3RvY29sKTsKKworLy8gV29yayBhcm91bmQgZm9yIG9sZCBBUEkgdXNlZCBieSBRVW5pdEFkYXB0ZXIgb2YganNUZXN0RHJpdmVyCitpZiAodHlwZW9mIFFVbml0LmxvZyA9PSAnZnVuY3Rpb24nKSB7CisgIC8vIFdoZW4gdXNpbmcgcmVhbCBRVW5pdCAoZnJvbiBQaGFudG9tSlMpIGxvZyBmYWlsdXJlcyB0byBjb25zb2xlCisgIFFVbml0LmxvZyhmdW5jdGlvbihkZXRhaWxzKSB7CisgICAgaWYgKCFkZXRhaWxzLnJlc3VsdCkgeworICAgICAgY29uc29sZS5sb2coJz09PT09PT09IEZBSUwgPT09PT09PT0nKTsKKyAgICAgIGNvbnNvbGUubG9nKCdUZXN0TmFtZTogJyArIGRldGFpbHMubmFtZSk7CisgICAgICBpZiAoZGV0YWlscy5tZXNzYWdlKSBjb25zb2xlLmxvZyhkZXRhaWxzLm1lc3NhZ2UpOworICAgICAgY29uc29sZS5sb2coJ0V4cGVjdGVkOiAnICsgZGV0YWlscy5leHBlY3RlZCk7CisgICAgICBjb25zb2xlLmxvZygnQWN0dWFsICA6ICcgKyBkZXRhaWxzLmFjdHVhbCk7CisgICAgICBjb25zb2xlLmxvZygnPT09PT09PT09PT09PT09PT09PT09PScpOworICAgIH0KKyAgfSk7Cit9CiAKIC8vIGFsbCBMYW5ndWFnZXMgaW4gVVRGLTgKLXZhciBzdHJpbmdUZXN0ID0gIkFmcmlrYWFucywgQWxlbWFubmlzY2gsIEFyYWdvbsOpcywg2KfZhNi52LHYqNmK2KksINmF2LXYsdmJLCBBc3R1cmlhbnUsIEF5bWFyIGFydSwgQXrJmXJiYXljYW4sINCR0LDRiNKh0L7RgNGCLCBCb2FyaXNjaCwgxb1lbWFpdMSXxaFrYSwg0JHQtdC70LDRgNGD0YHQutCw0Y8sINCR0LXQu9Cw0YDRg9GB0LrQsNGPICjRgtCw0YDQsNGI0LrQtdCy0ZbRhtCwKSwg0JHRitC70LPQsNGA0YHQutC4LCBCYW1hbmFua2FuLCDgpqzgpr7gpoLgprLgpr4sIEJyZXpob25lZywgQm9zYW5za2ksIENhdGFsw6AsIE3DrG5nLWTElcykbmctbmfhubPMhCwg0J3QvtGF0YfQuNC50L0sIENlYnVhbm8sIOGPo+GOs+GOqSwgxIxlc2t5LCDQodC70L7QstGjzIHQvdGM0YHQutGKIC8g4rCU4rCO4rCR4rCC4rCh4rCQ4rCg4rCU4rCN4rCfLCDQp9OR0LLQsNGI0LvQsCwgQ3ltcmFlZywgRGFuc2ssIFphemFraSwg3oveqN6I3qzegN6o3oTept6Q3rAsIM6VzrvOu863zr3Ouc66zqwsIEVtaWxpw6BuIGUgcnVtYWduw7JsLCBFbmdsaXNoLCBFc3BlcmFudG8sIEVzcGHDsW9sLCBFZXN0aSwgRXVza2FyYSwg2YHYp9ix2LPbjCwgU3VvbWksIFbDtXJvLCBGw7hyb3lza3QsIEZyYW7Dp2FpcywgQXJwZXRhbiwgRnVybGFuLCBGcnlzaywgR2FlaWxnZSwg6LSb6KqeLCBHw6BpZGhsaWcsIEdhbGVnbywgQXZhw7FlJ+G6vSwg4KqX4KuB4Kqc4Kqw4Kq+4Kqk4KuALCBHYWVsZywg16LXkdeo15nXqiwg4KS54KS/4KSo4KWN4KSm4KWALCBGaWppIEhpbmRpLCBIcnZhdHNraSwgS3JlecOybCBheWlzeWVuLCBNYWd5YXIsINWA1aHVtdWl1oDVpdW2LCBJbnRlcmxpbmd1YSwgQmFoYXNhIEluZG9uZXNpYSwgSWxva2FubywgSWRvLCDDjXNsZW5za2EsIEl0YWxpYW5vLCDml6XmnKzoqp4sIExvamJhbiwgQmFzYSBKYXdhLCDhg6Xhg5Dhg6Dhg5fhg6Phg5rhg5gsIEtvbmdvLCBLYWxhYWxsaXN1dCwg4LKV4LKo4LON4LKo4LKhLCDtlZzqta3slrQsINCa0YrQsNGA0LDRh9Cw0Lkt0JzQsNC70LrRitCw0YAsIFJpcG9hcmlzY2gsIEt1cmTDriwg0JrQvtC80LgsIEtlcm5ld2VrLCDQmtGL0YDQs9GL0LfRh9CwLCBMYXRpbmEsIExhZGlubywgTMOrdHplYnVlcmdlc2NoLCBMaW1idXJncywgTGluZ8OhbGEsIOC6peC6suC6pywgTGlldHV2acWzLCBMYXR2aWXFoXUsIEJhc2EgQmFueXVtYXNhbiwgTWFsYWdhc3ksINCc0LDQutC10LTQvtC90YHQutC4LCDgtK7gtLLgtK/gtL7gtLPgtIIsIOCkruCksOCkvuCkoOClgCwgQmFoYXNhIE1lbGF5dSwg2YXYp9iy2ZDYsdmI2YbbjCwgTm5hcHVsaXRhbm8sIE5lZGVyc2Frc2lzY2gsIOCkqOClh+CkquCkvuCksiDgpK3gpL7gpLfgpL4sIE5lZGVybGFuZHMsIOKAqk5vcnNrIChueW5vcnNrKeKArCwg4oCqTm9yc2sgKGJva23DpWwp4oCsLCBOb3Vvcm1hbmQsIERpbsOpIGJpemFhZCwgT2NjaXRhbiwg0JjRgNC+0L3QsNGDLCBQYXBpYW1lbnR1LCBEZWl0c2NoLCBOb3JmdWsgLyBQaXRrZXJuLCBQb2xza2ksINm+2YbYrNin2KjbjCwg2b7amtiq2YgsIFBvcnR1Z3XDqnMsIFJ1bmEgU2ltaSwgUnVtYW50c2NoLCBSb21hbmksIFJvbcOibsSDLCDQoNGD0YHRgdC60LjQuSwg0KHQsNGF0LAg0YLRi9C70LAsIFNhcmR1LCBTaWNpbGlhbnUsIFNjb3RzLCBTw6FtZWdpZWxsYSwgU2ltcGxlIEVuZ2xpc2gsIFNsb3ZlbsSNaW5hLCBTbG92ZW7FocSNaW5hLCDQodGA0L/RgdC60LggLyBTcnBza2ksIFNlZWx0ZXJzaywgU3ZlbnNrYSwgS2lzd2FoaWxpLCDgrqTgrq7grr/grrTgr40sIOCwpOCxhuCwsuCxgeCwl+CxgSwg0KLQvtK30LjQutOjLCDguYTguJfguKIsIFTDvHJrbWVuw6dlLCBUYWdhbG9nLCBUw7xya8OnZSwg0KLQsNGC0LDRgNGH0LAvVGF0YXLDp2EsINCj0LrRgNCw0ZfQvdGB0YzQutCwLCDYp9ix2K/ZiCwgVGnhur9uZyBWaeG7h3QsIFZvbGFww7xrLCBXYWxvbiwgV2luYXJheSwg5ZC06K+tLCBpc2lYaG9zYSwg15nXmda015PXmdepLCBZb3LDuWLDoSwgWmXDqnV3cywg5Lit5paHLCBCw6JuLWzDom0tZ8O6LCDnsrXoqp4iOwotICAKLWZ1bmN0aW9uIGNoZWNrUmVjdXJzaXZlbHkobWFwMSwgbWFwMikgeworY29uc3Qgc3RyaW5nVGVzdCA9ICJBZnJpa2FhbnMsIEFsZW1hbm5pc2NoLCBBcmFnb27DqXMsINin2YTYudix2KjZitipLCDZhdi12LHZiSwgQXN0dXJpYW51LCBBeW1hciBhcnUsIEF6yZlyYmF5Y2FuLCDQkdCw0YjSodC+0YDRgiwgQm9hcmlzY2gsIMW9ZW1haXTEl8Wha2EsINCR0LXQu9Cw0YDRg9GB0LrQsNGPLCDQkdC10LvQsNGA0YPRgdC60LDRjyAo0YLQsNGA0LDRiNC60LXQstGW0YbQsCksINCR0YrQu9Cz0LDRgNGB0LrQuCwgQmFtYW5hbmthbiwg4Kas4Ka+4KaC4Kay4Ka+LCBCcmV6aG9uZWcsIEJvc2Fuc2tpLCBDYXRhbMOgLCBNw6xuZy1kxJXMpG5nLW5n4bmzzIQsINCd0L7RhdGH0LjQudC9LCBDZWJ1YW5vLCDhj6PhjrPhjqksIMSMZXNreSwg0KHQu9C+0LLRo8yB0L3RjNGB0LrRiiAvIOKwlOKwjuKwkeKwguKwoeKwkOKwoOKwlOKwjeKwnywg0KfTkdCy0LDRiNC70LAsIEN5bXJhZWcsIERhbnNrLCBaYXpha2ksIN6L3qjeiN6s3oDeqN6E3qbekN6wLCDOlc67zrvOt869zrnOus6sLCBFbWlsacOgbiBlIHJ1bWFnbsOybCwgRW5nbGlzaCwgRXNwZXJhbnRvLCBFc3Bhw7FvbCwgRWVzdGksIEV1c2thcmEsINmB2KfYsdiz24wsIFN1b21pLCBWw7VybywgRsO4cm95c2t0LCBGcmFuw6dhaXMsIEFycGV0YW4sIEZ1cmxhbiwgRnJ5c2ssIEdhZWlsZ2UsIOi0m+iqniwgR8OgaWRobGlnLCBHYWxlZ28sIEF2YcOxZSfhur0sIOCql+CrgeCqnOCqsOCqvuCqpOCrgCwgR2FlbGcsINei15HXqNeZ16osIOCkueCkv+CkqOCljeCkpuClgCwgRmlqaSBIaW5kaSwgSHJ2YXRza2ksIEtyZXnDsmwgYXlpc3llbiwgTWFneWFyLCDVgNWh1bXVpdaA1aXVtiwgSW50ZXJsaW5ndWEsIEJhaGFzYSBJbmRvbmVzaWEsIElsb2thbm8sIElkbywgw41zbGVuc2thLCBJdGFsaWFubywg5pel5pys6KqeLCBMb2piYW4sIEJhc2EgSmF3YSwg4YOl4YOQ4YOg4YOX4YOj4YOa4YOYLCBLb25nbywgS2FsYWFsbGlzdXQsIOCyleCyqOCzjeCyqOCyoSwg7ZWc6rWt7Ja0LCDQmtGK0LDRgNCw0YfQsNC5LdCc0LDQu9C60YrQsNGALCBSaXBvYXJpc2NoLCBLdXJkw64sINCa0L7QvNC4LCBLZXJuZXdlaywg0JrRi9GA0LPRi9C30YfQsCwgTGF0aW5hLCBMYWRpbm8sIEzDq3R6ZWJ1ZXJnZXNjaCwgTGltYnVyZ3MsIExpbmfDoWxhLCDguqXgurLguqcsIExpZXR1dmnFsywgTGF0dmllxaF1LCBCYXNhIEJhbnl1bWFzYW4sIE1hbGFnYXN5LCDQnNCw0LrQtdC00L7QvdGB0LrQuCwg4LSu4LSy4LSv4LS+4LSz4LSCLCDgpK7gpLDgpL7gpKDgpYAsIEJhaGFzYSBNZWxheXUsINmF2KfYstmQ2LHZiNmG24wsIE5uYXB1bGl0YW5vLCBOZWRlcnNha3Npc2NoLCDgpKjgpYfgpKrgpL7gpLIg4KSt4KS+4KS34KS+LCBOZWRlcmxhbmRzLCDigKpOb3JzayAobnlub3JzaynigKwsIOKAqk5vcnNrIChib2ttw6VsKeKArCwgTm91b3JtYW5kLCBEaW7DqSBiaXphYWQsIE9jY2l0YW4sINCY0YDQvtC90LDRgywgUGFwaWFtZW50dSwgRGVpdHNjaCwgTm9yZnVrIC8gUGl0a2VybiwgUG9sc2tpLCDZvtmG2KzYp9io24wsINm+2prYqtmILCBQb3J0dWd1w6pzLCBSdW5hIFNpbWksIFJ1bWFudHNjaCwgUm9tYW5pLCBSb23Dom7Egywg0KDRg9GB0YHQutC40LksINCh0LDRhdCwINGC0YvQu9CwLCBTYXJkdSwgU2ljaWxpYW51LCBTY290cywgU8OhbWVnaWVsbGEsIFNpbXBsZSBFbmdsaXNoLCBTbG92ZW7EjWluYSwgU2xvdmVuxaHEjWluYSwg0KHRgNC/0YHQutC4IC8gU3Jwc2tpLCBTZWVsdGVyc2ssIFN2ZW5za2EsIEtpc3dhaGlsaSwg4K6k4K6u4K6/4K604K+NLCDgsKTgsYbgsLLgsYHgsJfgsYEsINCi0L7St9C40LrToywg4LmE4LiX4LiiLCBUw7xya21lbsOnZSwgVGFnYWxvZywgVMO8cmvDp2UsINCi0LDRgtCw0YDRh9CwL1RhdGFyw6dhLCDQo9C60YDQsNGX0L3RgdGM0LrQsCwg2KfYsdiv2YgsIFRp4bq/bmcgVmnhu4d0LCBWb2xhcMO8aywgV2Fsb24sIFdpbmFyYXksIOWQtOivrSwgaXNpWGhvc2EsINeZ15nWtNeT15nXqSwgWW9yw7liw6EsIFplw6p1d3MsIOS4reaWhywgQsOibi1sw6JtLWfDuiwg57K16KqeIjsKKworZnVuY3Rpb24gY2hlY2tSZWN1cnNpdmVseShhc3NlcnQsIG1hcDEsIG1hcDIpIHsKICAgaWYgKHR5cGVvZiBtYXAxICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBtYXAyICE9PSAnZnVuY3Rpb24nKSB7CiAgICAgaWYgKCFtYXAxIHx8IHR5cGVvZiBtYXAxICE9PSAnb2JqZWN0JykgewotICAgICAgICBlcXVhbChtYXAxLCBtYXAyKTsKKyAgICAgICAgYXNzZXJ0LmVxdWFsKG1hcDEsIG1hcDIpOwogICAgIH0gZWxzZSB7Ci0gICAgICBmb3IgKHZhciBrZXkgaW4gbWFwMSkgewotICAgICAgICBjaGVja1JlY3Vyc2l2ZWx5KG1hcDFba2V5XSwgbWFwMltrZXldKTsKKyAgICAgIGZvciAobGV0IGtleSBpbiBtYXAxKSB7CisgICAgICAgIGNoZWNrUmVjdXJzaXZlbHkoYXNzZXJ0LCBtYXAxW2tleV0sIG1hcDJba2V5XSk7CiAgICAgICB9CiAgICAgfQogICB9CiB9CiAKLW1vZHVsZSgiQmFzZSBUeXBlcyIpOworUVVuaXQubW9kdWxlKCdCYXNlIFR5cGVzJyk7CiAKLSAgdGVzdCgiVm9pZCIsIGZ1bmN0aW9uKCkgewotICAgIGVxdWFsKGNsaWVudC50ZXN0Vm9pZCgpLCB1bmRlZmluZWQpOworICBRVW5pdC50ZXN0KCdWb2lkJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC50ZXN0Vm9pZCgpLCB1bmRlZmluZWQpOwogICB9KTsKLSAgdGVzdCgiU3RyaW5nIiwgZnVuY3Rpb24oKSB7Ci0gICAgZXF1YWwoY2xpZW50LnRlc3RTdHJpbmcoJycpLCAnJyk7Ci0gICAgZXF1YWwoY2xpZW50LnRlc3RTdHJpbmcoc3RyaW5nVGVzdCksIHN0cmluZ1Rlc3QpOworICBRVW5pdC50ZXN0KCdCaW5hcnkgKFN0cmluZyknLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBsZXQgYmluYXJ5ID0gJyc7CisgICAgZm9yIChsZXQgdiA9IDI1NTsgdiA+PSAwOyAtLXYpIHsKKyAgICAgIGJpbmFyeSArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHYpOworICAgIH0KKyAgICBhc3NlcnQuZXF1YWwoY2xpZW50LnRlc3RCaW5hcnkoYmluYXJ5KSwgYmluYXJ5KTsKKyAgfSk7CisgIFFVbml0LnRlc3QoJ0JpbmFyeSAoVWludDhBcnJheSknLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBsZXQgYmluYXJ5ID0gJyc7CisgICAgZm9yIChsZXQgdiA9IDI1NTsgdiA+PSAwOyAtLXYpIHsKKyAgICAgIGJpbmFyeSArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHYpOworICAgIH0KKyAgICBjb25zdCBhcnIgPSBuZXcgVWludDhBcnJheShiaW5hcnkubGVuZ3RoKTsKKyAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJpbmFyeS5sZW5ndGg7ICsraSkgeworICAgICAgYXJyW2ldID0gYmluYXJ5W2ldLmNoYXJDb2RlQXQoKTsKKyAgICB9CisgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC50ZXN0QmluYXJ5KGFyciksIGJpbmFyeSk7CisgIH0pOworICBRVW5pdC50ZXN0KCdTdHJpbmcnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXF1YWwoY2xpZW50LnRlc3RTdHJpbmcoJycpLCAnJyk7CisgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC50ZXN0U3RyaW5nKHN0cmluZ1Rlc3QpLCBzdHJpbmdUZXN0KTsKIAotICAgIHZhciBzcGVjaWFsQ2hhcmFjdGVycyA9ICdxdW90ZTogXCIgYmFja3NsYXNoOicgKworICAgIGNvbnN0IHNwZWNpYWxDaGFyYWN0ZXJzID0gJ3F1b3RlOiBcIiBiYWNrc2xhc2g6JyArCiAgICAgICAgICAgJyBmb3J3YXJkc2xhc2gtZXNjYXBlZDogXC8gJyArCiAgICAgICAgICAgJyBiYWNrc3BhY2U6IFxiIGZvcm1mZWVkOiBcZiBuZXdsaW5lOiBcbiByZXR1cm46IFxyIHRhYjogJyArCiAgICAgICAgICAgJyBub3ctYWxsLW9mLXRoZW0tdG9nZXRoZXI6ICJcXFwvXGJcblxyXHQnICsKICAgICAgICAgICAnIG5vdy1hLWJ1bmNoLW9mLWp1bms6ICFAIyQlJigpKCYlJCN7fXt9PD48PjwnOwotICAgIGVxdWFsKGNsaWVudC50ZXN0U3RyaW5nKHNwZWNpYWxDaGFyYWN0ZXJzKSxzcGVjaWFsQ2hhcmFjdGVycyk7CisgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC50ZXN0U3RyaW5nKHNwZWNpYWxDaGFyYWN0ZXJzKSwgc3BlY2lhbENoYXJhY3RlcnMpOwogICB9KTsKLSAgdGVzdCgiRG91YmxlIiwgZnVuY3Rpb24oKSB7Ci0gICAgZXF1YWwoY2xpZW50LnRlc3REb3VibGUoMCksIDApOwotICAgIGVxdWFsKGNsaWVudC50ZXN0RG91YmxlKC0xKSwgLTEpOwotICAgIGVxdWFsKGNsaWVudC50ZXN0RG91YmxlKDMuMTQpLCAzLjE0KTsKLSAgICBlcXVhbChjbGllbnQudGVzdERvdWJsZShNYXRoLnBvdygyLDYwKSksIE1hdGgucG93KDIsNjApKTsKKyAgUVVuaXQudGVzdCgnRG91YmxlJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC50ZXN0RG91YmxlKDApLCAwKTsKKyAgICBhc3NlcnQuZXF1YWwoY2xpZW50LnRlc3REb3VibGUoLTEpLCAtMSk7CisgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC50ZXN0RG91YmxlKDMuMTQpLCAzLjE0KTsKKyAgICBhc3NlcnQuZXF1YWwoY2xpZW50LnRlc3REb3VibGUoTWF0aC5wb3coMiwgNjApKSwgTWF0aC5wb3coMiwgNjApKTsKICAgfSk7Ci0gIHRlc3QoIkJ5dGUiLCBmdW5jdGlvbigpIHsKLSAgICBlcXVhbChjbGllbnQudGVzdEJ5dGUoMCksIDApOwotICAgIGVxdWFsKGNsaWVudC50ZXN0Qnl0ZSgweDAxKSwgMHgwMSk7CisgIFFVbml0LnRlc3QoJ0J5dGUnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXF1YWwoY2xpZW50LnRlc3RCeXRlKDApLCAwKTsKKyAgICBhc3NlcnQuZXF1YWwoY2xpZW50LnRlc3RCeXRlKDB4MDEpLCAweDAxKTsKICAgfSk7Ci0gIHRlc3QoIkkzMiIsIGZ1bmN0aW9uKCkgewotICAgIGVxdWFsKGNsaWVudC50ZXN0STMyKDApLCAwKTsKLSAgICBlcXVhbChjbGllbnQudGVzdEkzMihNYXRoLnBvdygyLDMwKSksIE1hdGgucG93KDIsMzApKTsKLSAgICBlcXVhbChjbGllbnQudGVzdEkzMigtTWF0aC5wb3coMiwzMCkpLCAtTWF0aC5wb3coMiwzMCkpOworICBRVW5pdC50ZXN0KCdJMzInLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXF1YWwoY2xpZW50LnRlc3RJMzIoMCksIDApOworICAgIGFzc2VydC5lcXVhbChjbGllbnQudGVzdEkzMihNYXRoLnBvdygyLCAzMCkpLCBNYXRoLnBvdygyLCAzMCkpOworICAgIGFzc2VydC5lcXVhbChjbGllbnQudGVzdEkzMigtTWF0aC5wb3coMiwgMzApKSwgLU1hdGgucG93KDIsIDMwKSk7CiAgIH0pOwotICB0ZXN0KCJJNjQiLCBmdW5jdGlvbigpIHsKLSAgICBlcXVhbChjbGllbnQudGVzdEk2NCgwKSwgMCk7CisgIFFVbml0LnRlc3QoJ0k2NCcsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5lcXVhbChjbGllbnQudGVzdEk2NCgwKSwgMCk7CiAgICAgLy9UaGlzIGlzIHVzdWFsbHkgMl42MCBidXQgSlMgY2Fubm90IHJlcHJlc2VudCBhbnl0aGluZyBvdmVyIDJeNTIgYWNjdXJhdGVseQotICAgIGVxdWFsKGNsaWVudC50ZXN0STY0KE1hdGgucG93KDIsNTIpKSwgTWF0aC5wb3coMiw1MikpOwotICAgIGVxdWFsKGNsaWVudC50ZXN0STY0KC1NYXRoLnBvdygyLDUyKSksIC1NYXRoLnBvdygyLDUyKSk7CisgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC50ZXN0STY0KE1hdGgucG93KDIsIDUyKSksIE1hdGgucG93KDIsIDUyKSk7CisgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC50ZXN0STY0KC1NYXRoLnBvdygyLCA1MikpLCAtTWF0aC5wb3coMiwgNTIpKTsKICAgfSk7CiAKIAotbW9kdWxlKCJTdHJ1Y3R1cmVkIFR5cGVzIik7CitRVW5pdC5tb2R1bGUoJ1N0cnVjdHVyZWQgVHlwZXMnKTsKIAotICB0ZXN0KCJTdHJ1Y3QiLCBmdW5jdGlvbigpIHsKLSAgICB2YXIgc3RydWN0VGVzdElucHV0ID0gbmV3IFRocmlmdFRlc3QuWHRydWN0KCk7CisgIFFVbml0LnRlc3QoJ1N0cnVjdCcsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGNvbnN0IHN0cnVjdFRlc3RJbnB1dCA9IG5ldyBUaHJpZnRUZXN0Llh0cnVjdCgpOwogICAgIHN0cnVjdFRlc3RJbnB1dC5zdHJpbmdfdGhpbmcgPSAnd29ya2VkJzsKICAgICBzdHJ1Y3RUZXN0SW5wdXQuYnl0ZV90aGluZyA9IDB4MDE7Ci0gICAgc3RydWN0VGVzdElucHV0LmkzMl90aGluZyA9IE1hdGgucG93KDIsMzApOworICAgIHN0cnVjdFRlc3RJbnB1dC5pMzJfdGhpbmcgPSBNYXRoLnBvdygyLCAzMCk7CiAgICAgLy9UaGlzIGlzIHVzdWFsbHkgMl42MCBidXQgSlMgY2Fubm90IHJlcHJlc2VudCBhbnl0aGluZyBvdmVyIDJeNTIgYWNjdXJhdGVseQotICAgIHN0cnVjdFRlc3RJbnB1dC5pNjRfdGhpbmcgPSBNYXRoLnBvdygyLDUyKTsKKyAgICBzdHJ1Y3RUZXN0SW5wdXQuaTY0X3RoaW5nID0gTWF0aC5wb3coMiwgNTIpOwogCi0gICAgdmFyIHN0cnVjdFRlc3RPdXRwdXQgPSBjbGllbnQudGVzdFN0cnVjdChzdHJ1Y3RUZXN0SW5wdXQpOworICAgIGNvbnN0IHN0cnVjdFRlc3RPdXRwdXQgPSBjbGllbnQudGVzdFN0cnVjdChzdHJ1Y3RUZXN0SW5wdXQpOwogCi0gICAgZXF1YWwoc3RydWN0VGVzdE91dHB1dC5zdHJpbmdfdGhpbmcsIHN0cnVjdFRlc3RJbnB1dC5zdHJpbmdfdGhpbmcpOwotICAgIGVxdWFsKHN0cnVjdFRlc3RPdXRwdXQuYnl0ZV90aGluZywgc3RydWN0VGVzdElucHV0LmJ5dGVfdGhpbmcpOwotICAgIGVxdWFsKHN0cnVjdFRlc3RPdXRwdXQuaTMyX3RoaW5nLCBzdHJ1Y3RUZXN0SW5wdXQuaTMyX3RoaW5nKTsKLSAgICBlcXVhbChzdHJ1Y3RUZXN0T3V0cHV0Lmk2NF90aGluZywgc3RydWN0VGVzdElucHV0Lmk2NF90aGluZyk7Ci0gICAgCi0gICAgZXF1YWwoSlNPTi5zdHJpbmdpZnkoc3RydWN0VGVzdE91dHB1dCksIEpTT04uc3RyaW5naWZ5KHN0cnVjdFRlc3RJbnB1dCkpOworICAgIGFzc2VydC5lcXVhbChzdHJ1Y3RUZXN0T3V0cHV0LnN0cmluZ190aGluZywgc3RydWN0VGVzdElucHV0LnN0cmluZ190aGluZyk7CisgICAgYXNzZXJ0LmVxdWFsKHN0cnVjdFRlc3RPdXRwdXQuYnl0ZV90aGluZywgc3RydWN0VGVzdElucHV0LmJ5dGVfdGhpbmcpOworICAgIGFzc2VydC5lcXVhbChzdHJ1Y3RUZXN0T3V0cHV0LmkzMl90aGluZywgc3RydWN0VGVzdElucHV0LmkzMl90aGluZyk7CisgICAgYXNzZXJ0LmVxdWFsKHN0cnVjdFRlc3RPdXRwdXQuaTY0X3RoaW5nLCBzdHJ1Y3RUZXN0SW5wdXQuaTY0X3RoaW5nKTsKKworICAgIGFzc2VydC5lcXVhbChKU09OLnN0cmluZ2lmeShzdHJ1Y3RUZXN0T3V0cHV0KSwgSlNPTi5zdHJpbmdpZnkoc3RydWN0VGVzdElucHV0KSk7CiAgIH0pOwogCi0gIHRlc3QoIk5lc3QiLCBmdW5jdGlvbigpIHsKLSAgICB2YXIgeHRyVGVzdElucHV0ID0gbmV3IFRocmlmdFRlc3QuWHRydWN0KCk7CisgIFFVbml0LnRlc3QoJ05lc3QnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBjb25zdCB4dHJUZXN0SW5wdXQgPSBuZXcgVGhyaWZ0VGVzdC5YdHJ1Y3QoKTsKICAgICB4dHJUZXN0SW5wdXQuc3RyaW5nX3RoaW5nID0gJ3dvcmtlZCc7CiAgICAgeHRyVGVzdElucHV0LmJ5dGVfdGhpbmcgPSAweDAxOwotICAgIHh0clRlc3RJbnB1dC5pMzJfdGhpbmcgPSBNYXRoLnBvdygyLDMwKTsKKyAgICB4dHJUZXN0SW5wdXQuaTMyX3RoaW5nID0gTWF0aC5wb3coMiwgMzApOwogICAgIC8vVGhpcyBpcyB1c3VhbGx5IDJeNjAgYnV0IEpTIGNhbm5vdCByZXByZXNlbnQgYW55dGhpbmcgb3ZlciAyXjUyIGFjY3VyYXRlbHkKLSAgICB4dHJUZXN0SW5wdXQuaTY0X3RoaW5nID0gTWF0aC5wb3coMiw1Mik7Ci0gICAgCi0gICAgdmFyIG5lc3RUZXN0SW5wdXQgPSBuZXcgVGhyaWZ0VGVzdC5YdHJ1Y3QyKCk7CisgICAgeHRyVGVzdElucHV0Lmk2NF90aGluZyA9IE1hdGgucG93KDIsIDUyKTsKKworICAgIGNvbnN0IG5lc3RUZXN0SW5wdXQgPSBuZXcgVGhyaWZ0VGVzdC5YdHJ1Y3QyKCk7CiAgICAgbmVzdFRlc3RJbnB1dC5ieXRlX3RoaW5nID0gMHgwMjsKICAgICBuZXN0VGVzdElucHV0LnN0cnVjdF90aGluZyA9IHh0clRlc3RJbnB1dDsKLSAgICBuZXN0VGVzdElucHV0LmkzMl90aGluZyA9IE1hdGgucG93KDIsMTUpOwotICAgIAotICAgIHZhciBuZXN0VGVzdE91dHB1dCA9IGNsaWVudC50ZXN0TmVzdChuZXN0VGVzdElucHV0KTsKLSAgICAKLSAgICBlcXVhbChuZXN0VGVzdE91dHB1dC5ieXRlX3RoaW5nLCBuZXN0VGVzdElucHV0LmJ5dGVfdGhpbmcpOwotICAgIGVxdWFsKG5lc3RUZXN0T3V0cHV0LnN0cnVjdF90aGluZy5zdHJpbmdfdGhpbmcsIG5lc3RUZXN0SW5wdXQuc3RydWN0X3RoaW5nLnN0cmluZ190aGluZyk7Ci0gICAgZXF1YWwobmVzdFRlc3RPdXRwdXQuc3RydWN0X3RoaW5nLmJ5dGVfdGhpbmcsIG5lc3RUZXN0SW5wdXQuc3RydWN0X3RoaW5nLmJ5dGVfdGhpbmcpOwotICAgIGVxdWFsKG5lc3RUZXN0T3V0cHV0LnN0cnVjdF90aGluZy5pMzJfdGhpbmcsIG5lc3RUZXN0SW5wdXQuc3RydWN0X3RoaW5nLmkzMl90aGluZyk7Ci0gICAgZXF1YWwobmVzdFRlc3RPdXRwdXQuc3RydWN0X3RoaW5nLmk2NF90aGluZywgbmVzdFRlc3RJbnB1dC5zdHJ1Y3RfdGhpbmcuaTY0X3RoaW5nKTsKLSAgICBlcXVhbChuZXN0VGVzdE91dHB1dC5pMzJfdGhpbmcsIG5lc3RUZXN0SW5wdXQuaTMyX3RoaW5nKTsKLSAgICAKLSAgICBlcXVhbChKU09OLnN0cmluZ2lmeShuZXN0VGVzdE91dHB1dCksIEpTT04uc3RyaW5naWZ5KG5lc3RUZXN0SW5wdXQpKTsKKyAgICBuZXN0VGVzdElucHV0LmkzMl90aGluZyA9IE1hdGgucG93KDIsIDE1KTsKKworICAgIGNvbnN0IG5lc3RUZXN0T3V0cHV0ID0gY2xpZW50LnRlc3ROZXN0KG5lc3RUZXN0SW5wdXQpOworCisgICAgYXNzZXJ0LmVxdWFsKG5lc3RUZXN0T3V0cHV0LmJ5dGVfdGhpbmcsIG5lc3RUZXN0SW5wdXQuYnl0ZV90aGluZyk7CisgICAgYXNzZXJ0LmVxdWFsKG5lc3RUZXN0T3V0cHV0LnN0cnVjdF90aGluZy5zdHJpbmdfdGhpbmcsIG5lc3RUZXN0SW5wdXQuc3RydWN0X3RoaW5nLnN0cmluZ190aGluZyk7CisgICAgYXNzZXJ0LmVxdWFsKG5lc3RUZXN0T3V0cHV0LnN0cnVjdF90aGluZy5ieXRlX3RoaW5nLCBuZXN0VGVzdElucHV0LnN0cnVjdF90aGluZy5ieXRlX3RoaW5nKTsKKyAgICBhc3NlcnQuZXF1YWwobmVzdFRlc3RPdXRwdXQuc3RydWN0X3RoaW5nLmkzMl90aGluZywgbmVzdFRlc3RJbnB1dC5zdHJ1Y3RfdGhpbmcuaTMyX3RoaW5nKTsKKyAgICBhc3NlcnQuZXF1YWwobmVzdFRlc3RPdXRwdXQuc3RydWN0X3RoaW5nLmk2NF90aGluZywgbmVzdFRlc3RJbnB1dC5zdHJ1Y3RfdGhpbmcuaTY0X3RoaW5nKTsKKyAgICBhc3NlcnQuZXF1YWwobmVzdFRlc3RPdXRwdXQuaTMyX3RoaW5nLCBuZXN0VGVzdElucHV0LmkzMl90aGluZyk7CisKKyAgICBhc3NlcnQuZXF1YWwoSlNPTi5zdHJpbmdpZnkobmVzdFRlc3RPdXRwdXQpLCBKU09OLnN0cmluZ2lmeShuZXN0VGVzdElucHV0KSk7CiAgIH0pOwogCi0gIHRlc3QoIk1hcCIsIGZ1bmN0aW9uKCkgewotICAgIHZhciBtYXBUZXN0SW5wdXQgPSB7Nzo3NywgODo4OCwgOTo5OX07CisgIFFVbml0LnRlc3QoJ01hcCcsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGNvbnN0IG1hcFRlc3RJbnB1dCA9IHs3OiA3NywgODogODgsIDk6IDk5fTsKIAotICAgIHZhciBtYXBUZXN0T3V0cHV0ID0gY2xpZW50LnRlc3RNYXAobWFwVGVzdElucHV0KTsKKyAgICBjb25zdCBtYXBUZXN0T3V0cHV0ID0gY2xpZW50LnRlc3RNYXAobWFwVGVzdElucHV0KTsKIAotICAgIGZvciAodmFyIGtleSBpbiBtYXBUZXN0T3V0cHV0KSB7Ci0gICAgICBlcXVhbChtYXBUZXN0T3V0cHV0W2tleV0sIG1hcFRlc3RJbnB1dFtrZXldKTsKKyAgICBmb3IgKGxldCBrZXkgaW4gbWFwVGVzdE91dHB1dCkgeworICAgICAgYXNzZXJ0LmVxdWFsKG1hcFRlc3RPdXRwdXRba2V5XSwgbWFwVGVzdElucHV0W2tleV0pOwogICAgIH0KICAgfSk7CiAKLSAgdGVzdCgiU3RyaW5nTWFwIiwgZnVuY3Rpb24oKSB7Ci0gICAgdmFyIG1hcFRlc3RJbnB1dCA9IHsKLSAgICAgICJhIjoiMTIzIiwgImEgYiI6IndpdGggc3BhY2VzICIsICJzYW1lIjoic2FtZSIsICIwIjoibnVtZXJpYyBrZXkiLAotICAgICAgImxvbmdWYWx1ZSI6c3RyaW5nVGVzdCwgc3RyaW5nVGVzdDoibG9uZyBrZXkiCisgIFFVbml0LnRlc3QoJ1N0cmluZ01hcCcsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGNvbnN0IG1hcFRlc3RJbnB1dCA9IHsKKyAgICAgICdhJzogJzEyMycsICdhIGInOiAnd2l0aCBzcGFjZXMgJywgJ3NhbWUnOiAnc2FtZScsICcwJzogJ251bWVyaWMga2V5JywKKyAgICAgICdsb25nVmFsdWUnOiBzdHJpbmdUZXN0LCBzdHJpbmdUZXN0OiAnbG9uZyBrZXknCiAgICAgfTsKIAotICAgIHZhciBtYXBUZXN0T3V0cHV0ID0gY2xpZW50LnRlc3RTdHJpbmdNYXAobWFwVGVzdElucHV0KTsKKyAgICBjb25zdCBtYXBUZXN0T3V0cHV0ID0gY2xpZW50LnRlc3RTdHJpbmdNYXAobWFwVGVzdElucHV0KTsKIAotICAgIGZvciAodmFyIGtleSBpbiBtYXBUZXN0T3V0cHV0KSB7Ci0gICAgICBlcXVhbChtYXBUZXN0T3V0cHV0W2tleV0sIG1hcFRlc3RJbnB1dFtrZXldKTsKKyAgICBmb3IgKGxldCBrZXkgaW4gbWFwVGVzdE91dHB1dCkgeworICAgICAgYXNzZXJ0LmVxdWFsKG1hcFRlc3RPdXRwdXRba2V5XSwgbWFwVGVzdElucHV0W2tleV0pOwogICAgIH0KICAgfSk7CiAKLSAgdGVzdCgiU2V0IiwgZnVuY3Rpb24oKSB7Ci0gICAgdmFyIHNldFRlc3RJbnB1dCA9IFsxLDIsM107Ci0gICAgb2soY2xpZW50LnRlc3RTZXQoc2V0VGVzdElucHV0KSwgc2V0VGVzdElucHV0KTsKKyAgUVVuaXQudGVzdCgnU2V0JywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgY29uc3Qgc2V0VGVzdElucHV0ID0gWzEsIDIsIDNdOworICAgIGFzc2VydC5vayhjbGllbnQudGVzdFNldChzZXRUZXN0SW5wdXQpLCBzZXRUZXN0SW5wdXQpOwogICB9KTsKIAotICB0ZXN0KCJMaXN0IiwgZnVuY3Rpb24oKSB7Ci0gICAgdmFyIGxpc3RUZXN0SW5wdXQgPSBbMSwyLDNdOwotICAgIG9rKGNsaWVudC50ZXN0TGlzdChsaXN0VGVzdElucHV0KSwgbGlzdFRlc3RJbnB1dCk7CisgIFFVbml0LnRlc3QoJ0xpc3QnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBjb25zdCBsaXN0VGVzdElucHV0ID0gWzEsIDIsIDNdOworICAgIGFzc2VydC5vayhjbGllbnQudGVzdExpc3QobGlzdFRlc3RJbnB1dCksIGxpc3RUZXN0SW5wdXQpOwogICB9KTsKIAotICB0ZXN0KCJFbnVtIiwgZnVuY3Rpb24oKSB7Ci0gICAgZXF1YWwoY2xpZW50LnRlc3RFbnVtKFRocmlmdFRlc3QuTnVtYmVyei5PTkUpLCBUaHJpZnRUZXN0Lk51bWJlcnouT05FKTsKKyAgUVVuaXQudGVzdCgnRW51bScsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5lcXVhbChjbGllbnQudGVzdEVudW0oVGhyaWZ0VGVzdC5OdW1iZXJ6Lk9ORSksIFRocmlmdFRlc3QuTnVtYmVyei5PTkUpOwogICB9KTsKIAotICB0ZXN0KCJUeXBlRGVmIiwgZnVuY3Rpb24oKSB7Ci0gICAgZXF1YWwoY2xpZW50LnRlc3RUeXBlZGVmKDY5KSwgNjkpOworICBRVW5pdC50ZXN0KCdUeXBlRGVmJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC50ZXN0VHlwZWRlZig2OSksIDY5KTsKICAgfSk7CiAKLSAgdGVzdCgiU2tpcCIsIGZ1bmN0aW9uKCkgewotICAgIHZhciBzdHJ1Y3RUZXN0SW5wdXQgPSBuZXcgVGhyaWZ0VGVzdC5YdHJ1Y3QoKTsKLSAgICB2YXIgbW9kaWZpZWRDbGllbnQgPSBuZXcgVGhyaWZ0VGVzdC5UaHJpZnRUZXN0Q2xpZW50KHByb3RvY29sKTsKKyAgUVVuaXQudGVzdCgnU2tpcCcsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGNvbnN0IHN0cnVjdFRlc3RJbnB1dCA9IG5ldyBUaHJpZnRUZXN0Llh0cnVjdCgpOworICAgIGNvbnN0IG1vZGlmaWVkQ2xpZW50ID0gbmV3IFRocmlmdFRlc3QuVGhyaWZ0VGVzdENsaWVudChwcm90b2NvbCk7CiAKICAgICBtb2RpZmllZENsaWVudC5yZWN2X3Rlc3RTdHJ1Y3QgPSBmdW5jdGlvbigpIHsKLSAgICAgIHZhciBpbnB1dCAgPSBtb2RpZmllZENsaWVudC5pbnB1dDsKLSAgICAgIHZhciB4dHJ1Y3QzID0gbmV3IFRocmlmdFRlc3QuWHRydWN0MygpOworICAgICAgY29uc3QgaW5wdXQgPSBtb2RpZmllZENsaWVudC5pbnB1dDsKKyAgICAgIGNvbnN0IHh0cnVjdDMgPSBuZXcgVGhyaWZ0VGVzdC5YdHJ1Y3QzKCk7CiAKICAgICAgIGlucHV0LnJlYWRNZXNzYWdlQmVnaW4oKTsKICAgICAgIGlucHV0LnJlYWRTdHJ1Y3RCZWdpbigpOwogCi0gICAgICAvLyByZWFkIFh0cnVjdCBkYXRhIHdpdGggWHRydWN0MyAKKyAgICAgIC8vIHJlYWQgWHRydWN0IGRhdGEgd2l0aCBYdHJ1Y3QzCiAgICAgICBpbnB1dC5yZWFkRmllbGRCZWdpbigpOwogICAgICAgeHRydWN0My5yZWFkKGlucHV0KTsKICAgICAgIGlucHV0LnJlYWRGaWVsZEVuZCgpOwpAQCAtMjE3LDE3OCArMjUwLDE2NiBAQAogICAgIH07CiAKICAgICBzdHJ1Y3RUZXN0SW5wdXQuc3RyaW5nX3RoaW5nID0gJ3dvcmtlZCc7Ci0gICAgc3RydWN0VGVzdElucHV0LmJ5dGVfdGhpbmcgICA9IDB4MDE7Ci0gICAgc3RydWN0VGVzdElucHV0LmkzMl90aGluZyAgICA9IE1hdGgucG93KDIsMzApOwotICAgIHN0cnVjdFRlc3RJbnB1dC5pNjRfdGhpbmcgICAgPSBNYXRoLnBvdygyLDUyKTsKKyAgICBzdHJ1Y3RUZXN0SW5wdXQuYnl0ZV90aGluZyA9IDB4MDE7CisgICAgc3RydWN0VGVzdElucHV0LmkzMl90aGluZyA9IE1hdGgucG93KDIsIDMwKTsKKyAgICBzdHJ1Y3RUZXN0SW5wdXQuaTY0X3RoaW5nID0gTWF0aC5wb3coMiwgNTIpOwogCi0gICAgdmFyIHN0cnVjdFRlc3RPdXRwdXQgPSBtb2RpZmllZENsaWVudC50ZXN0U3RydWN0KHN0cnVjdFRlc3RJbnB1dCk7CisgICAgY29uc3Qgc3RydWN0VGVzdE91dHB1dCA9IG1vZGlmaWVkQ2xpZW50LnRlc3RTdHJ1Y3Qoc3RydWN0VGVzdElucHV0KTsKIAotICAgIGVxdWFsKHN0cnVjdFRlc3RPdXRwdXQgaW5zdGFuY2VvZiBUaHJpZnRUZXN0Llh0cnVjdDMsIHRydWUpOwotICAgIGVxdWFsKHN0cnVjdFRlc3RPdXRwdXQuc3RyaW5nX3RoaW5nLCBzdHJ1Y3RUZXN0SW5wdXQuc3RyaW5nX3RoaW5nKTsKLSAgICBlcXVhbChzdHJ1Y3RUZXN0T3V0cHV0LmNoYW5nZWQsIG51bGwpOwotICAgIGVxdWFsKHN0cnVjdFRlc3RPdXRwdXQuaTMyX3RoaW5nLCBzdHJ1Y3RUZXN0SW5wdXQuaTMyX3RoaW5nKTsKLSAgICBlcXVhbChzdHJ1Y3RUZXN0T3V0cHV0Lmk2NF90aGluZywgc3RydWN0VGVzdElucHV0Lmk2NF90aGluZyk7CisgICAgYXNzZXJ0LmVxdWFsKHN0cnVjdFRlc3RPdXRwdXQgaW5zdGFuY2VvZiBUaHJpZnRUZXN0Llh0cnVjdDMsIHRydWUpOworICAgIGFzc2VydC5lcXVhbChzdHJ1Y3RUZXN0T3V0cHV0LnN0cmluZ190aGluZywgc3RydWN0VGVzdElucHV0LnN0cmluZ190aGluZyk7CisgICAgYXNzZXJ0LmVxdWFsKHN0cnVjdFRlc3RPdXRwdXQuY2hhbmdlZCwgbnVsbCk7CisgICAgYXNzZXJ0LmVxdWFsKHN0cnVjdFRlc3RPdXRwdXQuaTMyX3RoaW5nLCBzdHJ1Y3RUZXN0SW5wdXQuaTMyX3RoaW5nKTsKKyAgICBhc3NlcnQuZXF1YWwoc3RydWN0VGVzdE91dHB1dC5pNjRfdGhpbmcsIHN0cnVjdFRlc3RJbnB1dC5pNjRfdGhpbmcpOwogICB9KTsKIAogCi1tb2R1bGUoImRlZXBlciEiKTsKK1FVbml0Lm1vZHVsZSgnZGVlcGVyIScpOwogCi0gIHRlc3QoIk1hcE1hcCIsIGZ1bmN0aW9uKCkgewotICAgIHZhciBtYXBNYXBUZXN0RXhwZWN0ZWRSZXN1bHQgPSB7Ci0gICAgICAiNCI6eyIxIjoxLCIyIjoyLCIzIjozLCI0Ijo0fSwKLSAgICAgICItNCI6eyItNCI6LTQsICItMyI6LTMsICItMiI6LTIsICItMSI6LTF9CisgIFFVbml0LnRlc3QoJ01hcE1hcCcsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGNvbnN0IG1hcE1hcFRlc3RFeHBlY3RlZFJlc3VsdCA9IHsKKyAgICAgICc0JzogeycxJzogMSwgJzInOiAyLCAnMyc6IDMsICc0JzogNH0sCisgICAgICAnLTQnOiB7Jy00JzogLTQsICctMyc6IC0zLCAnLTInOiAtMiwgJy0xJzogLTF9CiAgICAgfTsKIAotICAgIHZhciBtYXBNYXBUZXN0T3V0cHV0ID0gY2xpZW50LnRlc3RNYXBNYXAoMSk7CisgICAgY29uc3QgbWFwTWFwVGVzdE91dHB1dCA9IGNsaWVudC50ZXN0TWFwTWFwKDEpOwogCiAKLSAgICBmb3IgKHZhciBrZXkgaW4gbWFwTWFwVGVzdE91dHB1dCkgewotICAgICAgZm9yICh2YXIga2V5MiBpbiBtYXBNYXBUZXN0T3V0cHV0W2tleV0pIHsKLSAgICAgICAgZXF1YWwobWFwTWFwVGVzdE91dHB1dFtrZXldW2tleTJdLCBtYXBNYXBUZXN0RXhwZWN0ZWRSZXN1bHRba2V5XVtrZXkyXSk7CisgICAgZm9yIChsZXQga2V5IGluIG1hcE1hcFRlc3RPdXRwdXQpIHsKKyAgICAgIGZvciAobGV0IGtleTIgaW4gbWFwTWFwVGVzdE91dHB1dFtrZXldKSB7CisgICAgICAgIGFzc2VydC5lcXVhbChtYXBNYXBUZXN0T3V0cHV0W2tleV1ba2V5Ml0sIG1hcE1hcFRlc3RFeHBlY3RlZFJlc3VsdFtrZXldW2tleTJdKTsKICAgICAgIH0KICAgICB9Ci0gICAgCi0gICAgY2hlY2tSZWN1cnNpdmVseShtYXBNYXBUZXN0T3V0cHV0LCBtYXBNYXBUZXN0RXhwZWN0ZWRSZXN1bHQpOworCisgICAgY2hlY2tSZWN1cnNpdmVseShhc3NlcnQsIG1hcE1hcFRlc3RPdXRwdXQsIG1hcE1hcFRlc3RFeHBlY3RlZFJlc3VsdCk7CiAgIH0pOwogCiAKLW1vZHVsZSgiRXhjZXB0aW9uIik7CitRVW5pdC5tb2R1bGUoJ0V4Y2VwdGlvbicpOwogCi0gIHRlc3QoIlhjZXB0aW9uIiwgZnVuY3Rpb24oKSB7Ci0gICAgZXhwZWN0KDIpOwotICAgIHRyeXsKLSAgICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCJYY2VwdGlvbiIpOwotICAgIH1jYXRjaChlKXsKLSAgICAgIGVxdWFsKGUuZXJyb3JDb2RlLCAxMDAxKTsKLSAgICAgIGVxdWFsKGUubWVzc2FnZSwgIlhjZXB0aW9uIik7CisgIFFVbml0LnRlc3QoJ1hjZXB0aW9uJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmV4cGVjdCgyKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CisgICAgdHJ5IHsKKyAgICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCdYY2VwdGlvbicpOworICAgICAgYXNzZXJ0Lm9rKGZhbHNlKTsKKyAgICB9Y2F0Y2ggKGUpIHsKKyAgICAgIGFzc2VydC5lcXVhbChlLmVycm9yQ29kZSwgMTAwMSk7CisgICAgICBhc3NlcnQuZXF1YWwoZS5tZXNzYWdlLCAnWGNlcHRpb24nKTsKKyAgICAgIGRvbmUoKTsKICAgICB9CiAgIH0pOwogCi0gIHRlc3QoIm5vIEV4Y2VwdGlvbiIsIDAsIGZ1bmN0aW9uKCkgewotICAgIHRyeXsKLSAgICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCJubyBFeGNlcHRpb24iKTsKLSAgICB9Y2F0Y2goZSl7Ci0gICAgICBvayhmYWxzZSk7CisgIFFVbml0LnRlc3QoJ25vIEV4Y2VwdGlvbicsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoMSk7CisgICAgdHJ5IHsKKyAgICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCdubyBFeGNlcHRpb24nKTsKKyAgICAgIGFzc2VydC5vayh0cnVlKTsKKyAgICB9Y2F0Y2ggKGUpIHsKKyAgICAgIGFzc2VydC5vayhmYWxzZSk7CiAgICAgfQogICB9KTsKIAotICB0ZXN0KCJURXhjZXB0aW9uIiwgZnVuY3Rpb24oKSB7CisgIFFVbml0LnRlc3QoJ1RFeGNlcHRpb24nLCBmdW5jdGlvbihhc3NlcnQpIHsKICAgICAvL1RocmlmdFRlc3QgZG9lcyBub3QgbGlzdCBURXhjZXB0aW9uIGFzIGEgbGVnYWwgZXhjZXB0aW9uIHNvIGl0IHdpbGwKLSAgICAvLyBnZW5lcmF0ZSBhbiBleGNlcHRpb24gb24gdGhlIHNlcnZlciB0aGF0IGRvZXMgbm90IHByb3BhZ2F0ZSBiYWNrIHRvIAorICAgIC8vIGdlbmVyYXRlIGFuIGV4Y2VwdGlvbiBvbiB0aGUgc2VydmVyIHRoYXQgZG9lcyBub3QgcHJvcGFnYXRlIGJhY2sgdG8KICAgICAvLyB0aGUgY2xpZW50LiBUaGlzIHRlc3QgaGFzIGJlZW4gbW9kaWZpZWQgdG8gZXF1YXRlIHRvICJubyBleGNlcHRpb24iCi0gICAgZXhwZWN0KDEpOwotICAgIHRyeXsKLSAgICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCJURXhjZXB0aW9uIik7Ci0gICAgfSBjYXRjaChlKSB7Ci0gICAgICAvL29rKGZhbHNlKTsKKyAgICBhc3NlcnQuZXhwZWN0KDEpOworICAgIHRyeSB7CisgICAgICBjbGllbnQudGVzdEV4Y2VwdGlvbignVEV4Y2VwdGlvbicpOworICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgIC8vYXNzZXJ0Lm9rKGZhbHNlKTsKICAgICB9Ci0gICAgb2sodHJ1ZSk7CisgICAgYXNzZXJ0Lm9rKHRydWUpOwogICB9KTsKIAogCi1tb2R1bGUoIkluc2FuaXR5Iik7CitRVW5pdC5tb2R1bGUoJ0luc2FuaXR5Jyk7CiAKLSAgdGVzdCgidGVzdEluc2FuaXR5IiwgZnVuY3Rpb24oKSB7Ci0gICAgdmFyIGluc2FuaXR5ID0gewotICAgICAgIjEiOnsKLSAgICAgICAgIjIiOnsKLSAgICAgICAgICAidXNlck1hcCI6eyAiNSI6NSwgIjgiOjggfSwKLSAgICAgICAgICAieHRydWN0cyI6W3sKLSAgICAgICAgICAgICAgInN0cmluZ190aGluZyI6Ikdvb2RieWU0IiwKLSAgICAgICAgICAgICAgImJ5dGVfdGhpbmciOjQsCi0gICAgICAgICAgICAgICJpMzJfdGhpbmciOjQsCi0gICAgICAgICAgICAgICJpNjRfdGhpbmciOjQKLSAgICAgICAgICAgIH0sCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICJzdHJpbmdfdGhpbmciOiJIZWxsbzIiLAotICAgICAgICAgICAgICAiYnl0ZV90aGluZyI6MiwKLSAgICAgICAgICAgICAgImkzMl90aGluZyI6MiwKLSAgICAgICAgICAgICAgImk2NF90aGluZyI6MgotICAgICAgICAgICAgfQotICAgICAgICAgIF0KLSAgICAgICAgfSwKLSAgICAgICAgIjMiOnsKLSAgICAgICAgICAidXNlck1hcCI6eyAiNSI6NSwgIjgiOjggfSwKLSAgICAgICAgICAieHRydWN0cyI6W3sKLSAgICAgICAgICAgICAgInN0cmluZ190aGluZyI6Ikdvb2RieWU0IiwKLSAgICAgICAgICAgICAgImJ5dGVfdGhpbmciOjQsCi0gICAgICAgICAgICAgICJpMzJfdGhpbmciOjQsCi0gICAgICAgICAgICAgICJpNjRfdGhpbmciOjQKLSAgICAgICAgICAgIH0sCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICJzdHJpbmdfdGhpbmciOiJIZWxsbzIiLAotICAgICAgICAgICAgICAiYnl0ZV90aGluZyI6MiwKLSAgICAgICAgICAgICAgImkzMl90aGluZyI6MiwKLSAgICAgICAgICAgICAgImk2NF90aGluZyI6MgotICAgICAgICAgICAgfQotICAgICAgICAgIF0KLSAgICAgICAgfQorICBjb25zdCBjcmF6eSA9IHsKKyAgICAndXNlck1hcCc6IHsgJzUnOiA1LCAnOCc6IDggfSwKKyAgICAneHRydWN0cyc6IFt7CisgICAgICAnc3RyaW5nX3RoaW5nJzogJ0dvb2RieWU0JywKKyAgICAgICdieXRlX3RoaW5nJzogNCwKKyAgICAgICdpMzJfdGhpbmcnOiA0LAorICAgICAgJ2k2NF90aGluZyc6IDQKKyAgICB9LAorICAgIHsKKyAgICAgICdzdHJpbmdfdGhpbmcnOiAnSGVsbG8yJywKKyAgICAgICdieXRlX3RoaW5nJzogMiwKKyAgICAgICdpMzJfdGhpbmcnOiAyLAorICAgICAgJ2k2NF90aGluZyc6IDIKKyAgICB9XQorICB9OworICBRVW5pdC50ZXN0KCd0ZXN0SW5zYW5pdHknLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBjb25zdCBpbnNhbml0eSA9IHsKKyAgICAgICcxJzogeworICAgICAgICAnMic6IGNyYXp5LAorICAgICAgICAnMyc6IGNyYXp5CiAgICAgICB9LAotICAgICAgIjIiOnsgIjYiOnsgInVzZXJNYXAiOm51bGwsICJ4dHJ1Y3RzIjpudWxsIH0gfQorICAgICAgJzInOiB7ICc2JzogeyAndXNlck1hcCc6IG51bGwsICd4dHJ1Y3RzJzogbnVsbCB9IH0KICAgICB9OwotICAgIHZhciByZXMgPSBjbGllbnQudGVzdEluc2FuaXR5KG5ldyBUaHJpZnRUZXN0Lkluc2FuaXR5KCkpOwotICAgIG9rKHJlcywgSlNPTi5zdHJpbmdpZnkocmVzKSk7Ci0gICAgb2soaW5zYW5pdHksIEpTT04uc3RyaW5naWZ5KGluc2FuaXR5KSk7CisgICAgY29uc3QgcmVzID0gY2xpZW50LnRlc3RJbnNhbml0eShuZXcgVGhyaWZ0VGVzdC5JbnNhbml0eShjcmF6eSkpOworICAgIGFzc2VydC5vayhyZXMsIEpTT04uc3RyaW5naWZ5KHJlcykpOworICAgIGFzc2VydC5vayhpbnNhbml0eSwgSlNPTi5zdHJpbmdpZnkoaW5zYW5pdHkpKTsKIAotICAgIGNoZWNrUmVjdXJzaXZlbHkocmVzLCBpbnNhbml0eSk7CisgICAgY2hlY2tSZWN1cnNpdmVseShhc3NlcnQsIHJlcywgaW5zYW5pdHkpOwogICB9KTsKIAogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAvL1J1biBzYW1lIHRlc3RzIGFzeW5jaHJvbm91c2x5CiAKLW1vZHVsZSgiQXN5bmMiKTsKK1FVbml0Lm1vZHVsZSgnQXN5bmMnKTsKIAotICB0ZXN0KCJEb3VibGUiLCBmdW5jdGlvbigpIHsKLSAgICBleHBlY3QoIDEgKTsKKyAgUVVuaXQudGVzdCgnRG91YmxlJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmV4cGVjdCgxKTsKIAotICAgIFFVbml0LnN0b3AoKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CiAgICAgY2xpZW50LnRlc3REb3VibGUoMy4xNDE1OTI2NSwgZnVuY3Rpb24ocmVzdWx0KSB7Ci0gICAgICBlcXVhbChyZXN1bHQsIDMuMTQxNTkyNjUpOwotICAgICAgUVVuaXQuc3RhcnQoKTsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIDMuMTQxNTkyNjUpOworICAgICAgZG9uZSgpOwogICAgIH0pOwogICB9KTsKIAotICB0ZXN0KCJCeXRlIiwgZnVuY3Rpb24oKSB7Ci0gICAgZXhwZWN0KCAxICk7CisgIFFVbml0LnRlc3QoJ0J5dGUnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXhwZWN0KDEpOwogCi0gICAgUVVuaXQuc3RvcCgpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKICAgICBjbGllbnQudGVzdEJ5dGUoMHgwMSwgZnVuY3Rpb24ocmVzdWx0KSB7Ci0gICAgICBlcXVhbChyZXN1bHQsIDB4MDEpOwotICAgICAgUVVuaXQuc3RhcnQoKTsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIDB4MDEpOworICAgICAgZG9uZSgpOwogICAgIH0pOwogICB9KTsKIAotICB0ZXN0KCJJMzIiLCBmdW5jdGlvbigpIHsKLSAgICBleHBlY3QoIDIgKTsKKyAgUVVuaXQudGVzdCgnSTMyJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmV4cGVjdCgyKTsKIAotICAgIFFVbml0LnN0b3AoKTsKLSAgICBjbGllbnQudGVzdEkzMihNYXRoLnBvdygyLDMwKSwgZnVuY3Rpb24ocmVzdWx0KSB7Ci0gICAgICBlcXVhbChyZXN1bHQsIE1hdGgucG93KDIsMzApKTsKLSAgICAgIFFVbml0LnN0YXJ0KCk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygyKTsKKyAgICBjbGllbnQudGVzdEkzMihNYXRoLnBvdygyLCAzMCksIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgTWF0aC5wb3coMiwgMzApKTsKKyAgICAgIGRvbmUoKTsKICAgICB9KTsKIAotICAgIFFVbml0LnN0b3AoKTsKLSAgICBjbGllbnQudGVzdEkzMihNYXRoLnBvdygtMiwzMSksIGZ1bmN0aW9uKHJlc3VsdCkgewotICAgICAgZXF1YWwocmVzdWx0LCBNYXRoLnBvdygtMiwzMSkpOwotICAgICAgUVVuaXQuc3RhcnQoKTsKKyAgICBjbGllbnQudGVzdEkzMihNYXRoLnBvdygtMiwgMzEpLCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIE1hdGgucG93KC0yLCAzMSkpOworICAgICAgZG9uZSgpOwogICAgIH0pOwogICB9KTsKIAotICB0ZXN0KCJJNjQiLCBmdW5jdGlvbigpIHsKLSAgICBleHBlY3QoIDIgKTsKKyAgUVVuaXQudGVzdCgnSTY0JywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmV4cGVjdCgyKTsKIAotICAgIFFVbml0LnN0b3AoKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKDIpOwogICAgIC8vVGhpcyBpcyB1c3VhbGx5IDJeNjAgYnV0IEpTIGNhbm5vdCByZXByZXNlbnQgYW55dGhpbmcgb3ZlciAyXjUyIGFjY3VyYXRlbHkKLSAgICBjbGllbnQudGVzdEk2NChNYXRoLnBvdygyLDUyKSwgZnVuY3Rpb24ocmVzdWx0KSB7Ci0gICAgICBlcXVhbChyZXN1bHQsIE1hdGgucG93KDIsNTIpKTsKLSAgICAgIFFVbml0LnN0YXJ0KCk7CisgICAgY2xpZW50LnRlc3RJNjQoTWF0aC5wb3coMiwgNTIpLCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIE1hdGgucG93KDIsIDUyKSk7CisgICAgICBkb25lKCk7CiAgICAgfSk7CiAKLSAgICBRVW5pdC5zdG9wKCk7CiAgICAgLy9UaGlzIGlzIHVzdWFsbHkgMl42MCBidXQgSlMgY2Fubm90IHJlcHJlc2VudCBhbnl0aGluZyBvdmVyIDJeNTIgYWNjdXJhdGVseQotICAgIGNsaWVudC50ZXN0STY0KE1hdGgucG93KC0yLDUyKSwgZnVuY3Rpb24ocmVzdWx0KSB7Ci0gICAgICBlcXVhbChyZXN1bHQsIE1hdGgucG93KC0yLDUyKSk7Ci0gICAgICBRVW5pdC5zdGFydCgpOworICAgIGNsaWVudC50ZXN0STY0KE1hdGgucG93KC0yLCA1MiksIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgTWF0aC5wb3coLTIsIDUyKSk7CisgICAgICBkb25lKCk7CiAgICAgfSk7CiAgIH0pOwpkaWZmIC0tZ2l0IGEvbGliL2pzL3Rlc3QvdGVzdF9oYW5kbGVyLmpzIGIvbGliL2pzL3Rlc3QvdGVzdF9oYW5kbGVyLmpzCmluZGV4IDE3ZDIyY2YuLmFmNWY3YmQgMTAwNjQ0Ci0tLSBhL2xpYi9qcy90ZXN0L3Rlc3RfaGFuZGxlci5qcworKysgYi9saWIvanMvdGVzdC90ZXN0X2hhbmRsZXIuanMKQEAgLTEsMTk1ICsxLDIwMSBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAnTGljZW5zZScpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogJ0FTIElTJyBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotLy9UaGlzIGlzIHRoZSBzZXJ2ZXIgc2lkZSBOb2RlIHRlc3QgaGFuZGxlciBmb3IgdGhlIHN0YW5kYXJkIA0KLS8vICBBcGFjaGUgVGhyaWZ0IHRlc3Qgc2VydmljZS4NCi0NCi12YXIgdHR5cGVzID0gcmVxdWlyZSgnLi9nZW4tbm9kZWpzL1RocmlmdFRlc3RfdHlwZXMnKTsNCi12YXIgVEV4Y2VwdGlvbiA9IHJlcXVpcmUoJy4uLy4uL25vZGVqcy9saWIvdGhyaWZ0JykuVEV4Y2VwdGlvbjsNCi0NCi12YXIgVGhyaWZ0VGVzdEhhbmRsZXIgPSBleHBvcnRzLlRocmlmdFRlc3RIYW5kbGVyID0gew0KLSAgdGVzdFZvaWQ6IGZ1bmN0aW9uKHJlc3VsdCkgew0KLSAgICBjb25zb2xlLmxvZygndGVzdFZvaWQoKScpOw0KLSAgICByZXN1bHQobnVsbCk7DQotICB9LA0KLSAgdGVzdFN0cmluZzogZnVuY3Rpb24odGhpbmcsIHJlc3VsdCkgew0KLSAgICBjb25zb2xlLmxvZygndGVzdFN0cmluZyhcJycgKyB0aGluZyArICdcJyknKTsNCi0gICAgcmVzdWx0KG51bGwsIHRoaW5nKTsNCi0gIH0sDQotICB0ZXN0Qnl0ZTogZnVuY3Rpb24odGhpbmcsIHJlc3VsdCkgew0KLSAgICBjb25zb2xlLmxvZygndGVzdEJ5dGUoJyArIHRoaW5nICsgJyknKTsNCi0gICAgcmVzdWx0KG51bGwsIHRoaW5nKTsNCi0gIH0sDQotICB0ZXN0STMyOiBmdW5jdGlvbih0aGluZywgcmVzdWx0KSB7DQotICAgIGNvbnNvbGUubG9nKCd0ZXN0STMyKCcgKyB0aGluZyArICcpJyk7DQotICAgIHJlc3VsdChudWxsLCB0aGluZyk7DQotICB9LA0KLSAgdGVzdEk2NDogZnVuY3Rpb24odGhpbmcsIHJlc3VsdCkgew0KLSAgICBjb25zb2xlLmxvZygndGVzdEk2NCgnICsgdGhpbmcgKyAnKScpOw0KLSAgICByZXN1bHQobnVsbCwgdGhpbmcpOw0KLSAgfSwNCi0gIHRlc3REb3VibGU6IGZ1bmN0aW9uKHRoaW5nLCByZXN1bHQpIHsNCi0gICAgY29uc29sZS5sb2coJ3Rlc3REb3VibGUoJyArIHRoaW5nICsgJyknKTsNCi0gICAgcmVzdWx0KG51bGwsIHRoaW5nKTsNCi0gIH0sDQotICB0ZXN0U3RydWN0OiBmdW5jdGlvbih0aGluZywgcmVzdWx0KSB7DQotICAgIGNvbnNvbGUubG9nKCd0ZXN0U3RydWN0KCcpOw0KLSAgICBjb25zb2xlLmxvZyh0aGluZyk7DQotICAgIGNvbnNvbGUubG9nKCcpJyk7DQotICAgIHJlc3VsdChudWxsLCB0aGluZyk7DQotICB9LA0KLSAgdGVzdE5lc3Q6IGZ1bmN0aW9uKG5lc3QsIHJlc3VsdCkgew0KLSAgICBjb25zb2xlLmxvZygndGVzdE5lc3QoJyk7DQotICAgIGNvbnNvbGUubG9nKG5lc3QpOw0KLSAgICBjb25zb2xlLmxvZygnKScpOw0KLSAgICByZXN1bHQobnVsbCwgbmVzdCk7DQotICB9LA0KLSAgdGVzdE1hcDogZnVuY3Rpb24odGhpbmcsIHJlc3VsdCkgew0KLSAgICBjb25zb2xlLmxvZygndGVzdE1hcCgnKTsNCi0gICAgY29uc29sZS5sb2codGhpbmcpOw0KLSAgICBjb25zb2xlLmxvZygnKScpOw0KLSAgICByZXN1bHQobnVsbCwgdGhpbmcpOw0KLSAgfSwNCi0gIHRlc3RTdHJpbmdNYXA6IGZ1bmN0aW9uKHRoaW5nLCByZXN1bHQpIHsNCi0gICAgY29uc29sZS5sb2coJ3Rlc3RTdHJpbmdNYXAoJyk7DQotICAgIGNvbnNvbGUubG9nKHRoaW5nKTsNCi0gICAgY29uc29sZS5sb2coJyknKTsNCi0gICAgcmVzdWx0KG51bGwsIHRoaW5nKTsNCi0gIH0sDQotICB0ZXN0U2V0OiBmdW5jdGlvbih0aGluZywgcmVzdWx0KSB7DQotICAgIGNvbnNvbGUubG9nKCd0ZXN0U2V0KCcpOw0KLSAgICBjb25zb2xlLmxvZyh0aGluZyk7DQotICAgIGNvbnNvbGUubG9nKCcpJyk7DQotICAgIHJlc3VsdChudWxsLCB0aGluZyk7DQotICB9LA0KLSAgdGVzdExpc3Q6IGZ1bmN0aW9uKHRoaW5nLCByZXN1bHQpIHsNCi0gICAgY29uc29sZS5sb2coJ3Rlc3RMaXN0KCcpOw0KLSAgICBjb25zb2xlLmxvZyh0aGluZyk7DQotICAgIGNvbnNvbGUubG9nKCcpJyk7DQotICAgIHJlc3VsdChudWxsLCB0aGluZyk7DQotICB9LA0KLSAgdGVzdEVudW06IGZ1bmN0aW9uKHRoaW5nLCByZXN1bHQpIHsNCi0gICAgY29uc29sZS5sb2coJ3Rlc3RFbnVtKCcgKyB0aGluZyArICcpJyk7DQotICAgIHJlc3VsdChudWxsLCB0aGluZyk7DQotICB9LA0KLSAgdGVzdFR5cGVkZWY6IGZ1bmN0aW9uKHRoaW5nLCByZXN1bHQpIHsNCi0gICAgY29uc29sZS5sb2coJ3Rlc3RUeXBlZGVmKCcgKyB0aGluZyArICcpJyk7DQotICAgIHJlc3VsdChudWxsLCB0aGluZyk7DQotICB9LA0KLSAgdGVzdE1hcE1hcDogZnVuY3Rpb24oaGVsbG8sIHJlc3VsdCkgew0KLSAgICBjb25zb2xlLmxvZygndGVzdE1hcE1hcCgnICsgaGVsbG8gKyAnKScpOw0KLQ0KLSAgICB2YXIgbWFwbWFwID0gW107DQotICAgIHZhciBwb3MgPSBbXTsNCi0gICAgdmFyIG5lZyA9IFtdOw0KLSAgICBmb3IgKHZhciBpID0gMTsgaSA8IDU7IGkrKykgew0KLSAgICAgIHBvc1tpXSA9IGk7DQotICAgICAgbmVnWy1pXSA9IC1pOw0KLSAgICB9DQotICAgIG1hcG1hcFs0XSA9IHBvczsNCi0gICAgbWFwbWFwWy00XSA9IG5lZzsNCi0NCi0gICAgcmVzdWx0KG51bGwsIG1hcG1hcCk7DQotICB9LA0KLSAgdGVzdEluc2FuaXR5OiBmdW5jdGlvbihhcmd1bWVudCwgcmVzdWx0KSB7DQotICAgIGNvbnNvbGUubG9nKCd0ZXN0SW5zYW5pdHkoJyk7DQotICAgIGNvbnNvbGUubG9nKGFyZ3VtZW50KTsNCi0gICAgY29uc29sZS5sb2coJyknKTsNCi0NCi0gICAgdmFyIGhlbGxvID0gbmV3IHR0eXBlcy5YdHJ1Y3QoKTsNCi0gICAgaGVsbG8uc3RyaW5nX3RoaW5nID0gJ0hlbGxvMic7DQotICAgIGhlbGxvLmJ5dGVfdGhpbmcgPSAyOw0KLSAgICBoZWxsby5pMzJfdGhpbmcgPSAyOw0KLSAgICBoZWxsby5pNjRfdGhpbmcgPSAyOw0KLQ0KLSAgICB2YXIgZ29vZGJ5ZSA9IG5ldyB0dHlwZXMuWHRydWN0KCk7DQotICAgIGdvb2RieWUuc3RyaW5nX3RoaW5nID0gJ0dvb2RieWU0JzsNCi0gICAgZ29vZGJ5ZS5ieXRlX3RoaW5nID0gNDsNCi0gICAgZ29vZGJ5ZS5pMzJfdGhpbmcgPSA0Ow0KLSAgICBnb29kYnllLmk2NF90aGluZyA9IDQ7DQotDQotICAgIHZhciBjcmF6eSA9IG5ldyB0dHlwZXMuSW5zYW5pdHkoKTsNCi0gICAgY3JhenkudXNlck1hcCA9IFtdOw0KLSAgICBjcmF6eS51c2VyTWFwW3R0eXBlcy5OdW1iZXJ6LkVJR0hUXSA9IDg7DQotICAgIGNyYXp5LnVzZXJNYXBbdHR5cGVzLk51bWJlcnouRklWRV0gPSA1Ow0KLSAgICBjcmF6eS54dHJ1Y3RzID0gW2dvb2RieWUsIGhlbGxvXTsNCi0NCi0gICAgdmFyIGZpcnN0X21hcCA9IFtdOw0KLSAgICB2YXIgc2Vjb25kX21hcCA9IFtdOw0KLQ0KLSAgICBmaXJzdF9tYXBbdHR5cGVzLk51bWJlcnouVFdPXSA9IGNyYXp5Ow0KLSAgICBmaXJzdF9tYXBbdHR5cGVzLk51bWJlcnouVEhSRUVdID0gY3Jhenk7DQotDQotICAgIHZhciBsb29uZXkgPSBuZXcgdHR5cGVzLkluc2FuaXR5KCk7DQotICAgIHNlY29uZF9tYXBbdHR5cGVzLk51bWJlcnouU0lYXSA9IGxvb25leTsNCi0NCi0gICAgdmFyIGluc2FuZSA9IFtdOw0KLSAgICBpbnNhbmVbMV0gPSBmaXJzdF9tYXA7DQotICAgIGluc2FuZVsyXSA9IHNlY29uZF9tYXA7DQotDQotICAgIGNvbnNvbGUubG9nKCdpbnNhbmUgcmVzdWx0OicpOw0KLSAgICBjb25zb2xlLmxvZyhpbnNhbmUpOw0KLSAgICByZXN1bHQobnVsbCwgaW5zYW5lKTsNCi0gIH0sDQotICB0ZXN0TXVsdGk6IGZ1bmN0aW9uKGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUsIHJlc3VsdCkgew0KLSAgICBjb25zb2xlLmxvZygndGVzdE11bHRpKCknKTsNCi0NCi0gICAgdmFyIGhlbGxvID0gbmV3IHR0eXBlcy5YdHJ1Y3QoKTsNCi0gICAgaGVsbG8uc3RyaW5nX3RoaW5nID0gJ0hlbGxvMic7DQotICAgIGhlbGxvLmJ5dGVfdGhpbmcgPSBhcmcwOw0KLSAgICBoZWxsby5pMzJfdGhpbmcgPSBhcmcxOw0KLSAgICBoZWxsby5pNjRfdGhpbmcgPSBhcmcyOw0KLSAgICByZXN1bHQobnVsbCwgaGVsbG8pOw0KLSAgfSwNCi0gIHRlc3RFeGNlcHRpb246IGZ1bmN0aW9uKGFyZywgcmVzdWx0KSB7DQotICAgIGNvbnNvbGUubG9nKCd0ZXN0RXhjZXB0aW9uKCcrYXJnKycpJyk7DQotICAgIGlmIChhcmcgPT09ICdYY2VwdGlvbicpIHsNCi0gICAgICB2YXIgeCA9IG5ldyB0dHlwZXMuWGNlcHRpb24oKTsNCi0gICAgICB4LmVycm9yQ29kZSA9IDEwMDE7DQotICAgICAgeC5tZXNzYWdlID0gYXJnOw0KLSAgICAgIHJlc3VsdCh4KTsNCi0gICAgfSBlbHNlIGlmIChhcmcgPT09ICdURXhjZXB0aW9uJykgew0KLSAgICAgIHJlc3VsdChuZXcgVEV4Y2VwdGlvbihhcmcpKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICByZXN1bHQobnVsbCk7DQotICAgIH0NCi0gIH0sDQotICB0ZXN0TXVsdGlFeGNlcHRpb246IGZ1bmN0aW9uKGFyZzAsIGFyZzEsIHJlc3VsdCkgew0KLSAgICBjb25zb2xlLmxvZygndGVzdE11bHRpRXhjZXB0aW9uKCcgKyBhcmcwICsgJywgJyArIGFyZzEgKyAnKScpOw0KLSAgICBpZiAoYXJnMCA9PT0gKCdYY2VwdGlvbicpKSB7DQotICAgICAgdmFyIHggPSBuZXcgdHR5cGVzLlhjZXB0aW9uKCk7DQotICAgICAgeC5lcnJvckNvZGUgPSAxMDAxOw0KLSAgICAgIHgubWVzc2FnZSA9ICdUaGlzIGlzIGFuIFhjZXB0aW9uJzsNCi0gICAgICByZXN1bHQoeCk7DQotICAgIH0gZWxzZSBpZiAoYXJnMCA9PT0gKCdYY2VwdGlvbjInKSkgew0KLSAgICAgIHZhciB4MiA9IG5ldyB0dHlwZXMuWGNlcHRpb24yKCk7DQotICAgICAgeDIuZXJyb3JDb2RlID0gMjAwMjsNCi0gICAgICB4Mi5zdHJ1Y3RfdGhpbmcgPSBuZXcgdHR5cGVzLlh0cnVjdCgpOw0KLSAgICAgIHgyLnN0cnVjdF90aGluZy5zdHJpbmdfdGhpbmcgPSAnVGhpcyBpcyBhbiBYY2VwdGlvbjInOw0KLSAgICAgIHJlc3VsdCh4Mik7DQotICAgIH0NCi0NCi0gICAgdmFyIHJlcyA9IG5ldyB0dHlwZXMuWHRydWN0KCk7DQotICAgIHJlcy5zdHJpbmdfdGhpbmcgPSBhcmcxOw0KLSAgICByZXN1bHQobnVsbCwgcmVzKTsNCi0gIH0sDQotICB0ZXN0T25ld2F5OiBmdW5jdGlvbihzbGVlcEZvciwgcmVzdWx0KSB7DQotICAgIGNvbnNvbGUubG9nKCd0ZXN0T25ld2F5KCcgKyBzbGVlcEZvciArICcpID0+IEphdmFTY3JpcHQgKGxpa2UgUnVzdCkgbmV2ZXIgc2xlZXBzIScpOw0KLSAgfQ0KLX07ICAgLy9UaHJpZnRUZXN0U3ZjSGFuZGxlcg0KKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogJ0xpY2Vuc2UnKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogJ0FTIElTJyBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy9UaGlzIGlzIHRoZSBzZXJ2ZXIgc2lkZSBOb2RlIHRlc3QgaGFuZGxlciBmb3IgdGhlIHN0YW5kYXJkCisvLyAgQXBhY2hlIFRocmlmdCB0ZXN0IHNlcnZpY2UuCisKK2NvbnN0IGVzNk1vZGUgPSBwcm9jZXNzLmFyZ3YuaW5jbHVkZXMoJy0tZXM2Jyk7Citjb25zdCBnZW5Gb2xkZXIgPSBlczZNb2RlID8gJ2dlbi1ub2RlanMtZXM2JyA6ICdnZW4tbm9kZWpzJzsKK2NvbnN0IHR0eXBlcyA9IHJlcXVpcmUoYC4vJHtnZW5Gb2xkZXJ9L1RocmlmdFRlc3RfdHlwZXNgKTsKK2NvbnN0IFRFeGNlcHRpb24gPSByZXF1aXJlKCcuLi8uLi9ub2RlanMvbGliL3RocmlmdCcpLlRFeGNlcHRpb247CisKK2V4cG9ydHMuVGhyaWZ0VGVzdEhhbmRsZXIgPSB7CisgIHRlc3RWb2lkOiBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICBjb25zb2xlLmxvZygndGVzdFZvaWQoKScpOworICAgIHJlc3VsdChudWxsKTsKKyAgfSwKKyAgdGVzdFN0cmluZzogZnVuY3Rpb24odGhpbmcsIHJlc3VsdCkgeworICAgIGNvbnNvbGUubG9nKCd0ZXN0U3RyaW5nKFwnJyArIHRoaW5nICsgJ1wnKScpOworICAgIHJlc3VsdChudWxsLCB0aGluZyk7CisgIH0sCisgIHRlc3RCeXRlOiBmdW5jdGlvbih0aGluZywgcmVzdWx0KSB7CisgICAgY29uc29sZS5sb2coJ3Rlc3RCeXRlKCcgKyB0aGluZyArICcpJyk7CisgICAgcmVzdWx0KG51bGwsIHRoaW5nKTsKKyAgfSwKKyAgdGVzdEkzMjogZnVuY3Rpb24odGhpbmcsIHJlc3VsdCkgeworICAgIGNvbnNvbGUubG9nKCd0ZXN0STMyKCcgKyB0aGluZyArICcpJyk7CisgICAgcmVzdWx0KG51bGwsIHRoaW5nKTsKKyAgfSwKKyAgdGVzdEk2NDogZnVuY3Rpb24odGhpbmcsIHJlc3VsdCkgeworICAgIGNvbnNvbGUubG9nKCd0ZXN0STY0KCcgKyB0aGluZyArICcpJyk7CisgICAgcmVzdWx0KG51bGwsIHRoaW5nKTsKKyAgfSwKKyAgdGVzdERvdWJsZTogZnVuY3Rpb24odGhpbmcsIHJlc3VsdCkgeworICAgIGNvbnNvbGUubG9nKCd0ZXN0RG91YmxlKCcgKyB0aGluZyArICcpJyk7CisgICAgcmVzdWx0KG51bGwsIHRoaW5nKTsKKyAgfSwKKyAgdGVzdEJpbmFyeTogZnVuY3Rpb24odGhpbmcsIHJlc3VsdCkgeworICAgIGNvbnNvbGUubG9nKCd0ZXN0QmluYXJ5KFwnJyArIHRoaW5nICsgJ1wnKScpOworICAgIHJlc3VsdChudWxsLCB0aGluZyk7CisgIH0sCisgIHRlc3RTdHJ1Y3Q6IGZ1bmN0aW9uKHRoaW5nLCByZXN1bHQpIHsKKyAgICBjb25zb2xlLmxvZygndGVzdFN0cnVjdCgnKTsKKyAgICBjb25zb2xlLmxvZyh0aGluZyk7CisgICAgY29uc29sZS5sb2coJyknKTsKKyAgICByZXN1bHQobnVsbCwgdGhpbmcpOworICB9LAorICB0ZXN0TmVzdDogZnVuY3Rpb24obmVzdCwgcmVzdWx0KSB7CisgICAgY29uc29sZS5sb2coJ3Rlc3ROZXN0KCcpOworICAgIGNvbnNvbGUubG9nKG5lc3QpOworICAgIGNvbnNvbGUubG9nKCcpJyk7CisgICAgcmVzdWx0KG51bGwsIG5lc3QpOworICB9LAorICB0ZXN0TWFwOiBmdW5jdGlvbih0aGluZywgcmVzdWx0KSB7CisgICAgY29uc29sZS5sb2coJ3Rlc3RNYXAoJyk7CisgICAgY29uc29sZS5sb2codGhpbmcpOworICAgIGNvbnNvbGUubG9nKCcpJyk7CisgICAgcmVzdWx0KG51bGwsIHRoaW5nKTsKKyAgfSwKKyAgdGVzdFN0cmluZ01hcDogZnVuY3Rpb24odGhpbmcsIHJlc3VsdCkgeworICAgIGNvbnNvbGUubG9nKCd0ZXN0U3RyaW5nTWFwKCcpOworICAgIGNvbnNvbGUubG9nKHRoaW5nKTsKKyAgICBjb25zb2xlLmxvZygnKScpOworICAgIHJlc3VsdChudWxsLCB0aGluZyk7CisgIH0sCisgIHRlc3RTZXQ6IGZ1bmN0aW9uKHRoaW5nLCByZXN1bHQpIHsKKyAgICBjb25zb2xlLmxvZygndGVzdFNldCgnKTsKKyAgICBjb25zb2xlLmxvZyh0aGluZyk7CisgICAgY29uc29sZS5sb2coJyknKTsKKyAgICByZXN1bHQobnVsbCwgdGhpbmcpOworICB9LAorICB0ZXN0TGlzdDogZnVuY3Rpb24odGhpbmcsIHJlc3VsdCkgeworICAgIGNvbnNvbGUubG9nKCd0ZXN0TGlzdCgnKTsKKyAgICBjb25zb2xlLmxvZyh0aGluZyk7CisgICAgY29uc29sZS5sb2coJyknKTsKKyAgICByZXN1bHQobnVsbCwgdGhpbmcpOworICB9LAorICB0ZXN0RW51bTogZnVuY3Rpb24odGhpbmcsIHJlc3VsdCkgeworICAgIGNvbnNvbGUubG9nKCd0ZXN0RW51bSgnICsgdGhpbmcgKyAnKScpOworICAgIHJlc3VsdChudWxsLCB0aGluZyk7CisgIH0sCisgIHRlc3RUeXBlZGVmOiBmdW5jdGlvbih0aGluZywgcmVzdWx0KSB7CisgICAgY29uc29sZS5sb2coJ3Rlc3RUeXBlZGVmKCcgKyB0aGluZyArICcpJyk7CisgICAgcmVzdWx0KG51bGwsIHRoaW5nKTsKKyAgfSwKKyAgdGVzdE1hcE1hcDogZnVuY3Rpb24oaGVsbG8sIHJlc3VsdCkgeworICAgIGNvbnNvbGUubG9nKCd0ZXN0TWFwTWFwKCcgKyBoZWxsbyArICcpJyk7CisKKyAgICBjb25zdCBtYXBtYXAgPSBbXTsKKyAgICBjb25zdCBwb3MgPSBbXTsKKyAgICBjb25zdCBuZWcgPSBbXTsKKyAgICBmb3IgKGxldCBpID0gMTsgaSA8IDU7IGkrKykgeworICAgICAgcG9zW2ldID0gaTsKKyAgICAgIG5lZ1staV0gPSAtaTsKKyAgICB9CisgICAgbWFwbWFwWzRdID0gcG9zOworICAgIG1hcG1hcFstNF0gPSBuZWc7CisKKyAgICByZXN1bHQobnVsbCwgbWFwbWFwKTsKKyAgfSwKKyAgdGVzdEluc2FuaXR5OiBmdW5jdGlvbihhcmd1bWVudCwgcmVzdWx0KSB7CisgICAgY29uc29sZS5sb2coJ3Rlc3RJbnNhbml0eSgnKTsKKyAgICBjb25zb2xlLmxvZyhhcmd1bWVudCk7CisgICAgY29uc29sZS5sb2coJyknKTsKKworICAgIGNvbnN0IGhlbGxvID0gbmV3IHR0eXBlcy5YdHJ1Y3QoKTsKKyAgICBoZWxsby5zdHJpbmdfdGhpbmcgPSAnSGVsbG8yJzsKKyAgICBoZWxsby5ieXRlX3RoaW5nID0gMjsKKyAgICBoZWxsby5pMzJfdGhpbmcgPSAyOworICAgIGhlbGxvLmk2NF90aGluZyA9IDI7CisKKyAgICBjb25zdCBnb29kYnllID0gbmV3IHR0eXBlcy5YdHJ1Y3QoKTsKKyAgICBnb29kYnllLnN0cmluZ190aGluZyA9ICdHb29kYnllNCc7CisgICAgZ29vZGJ5ZS5ieXRlX3RoaW5nID0gNDsKKyAgICBnb29kYnllLmkzMl90aGluZyA9IDQ7CisgICAgZ29vZGJ5ZS5pNjRfdGhpbmcgPSA0OworCisgICAgY29uc3QgY3JhenkgPSBuZXcgdHR5cGVzLkluc2FuaXR5KCk7CisgICAgY3JhenkudXNlck1hcCA9IFtdOworICAgIGNyYXp5LnVzZXJNYXBbdHR5cGVzLk51bWJlcnouRUlHSFRdID0gODsKKyAgICBjcmF6eS51c2VyTWFwW3R0eXBlcy5OdW1iZXJ6LkZJVkVdID0gNTsKKyAgICBjcmF6eS54dHJ1Y3RzID0gW2dvb2RieWUsIGhlbGxvXTsKKworICAgIGNvbnN0IGZpcnN0X21hcCA9IFtdOworICAgIGNvbnN0IHNlY29uZF9tYXAgPSBbXTsKKworICAgIGZpcnN0X21hcFt0dHlwZXMuTnVtYmVyei5UV09dID0gY3Jhenk7CisgICAgZmlyc3RfbWFwW3R0eXBlcy5OdW1iZXJ6LlRIUkVFXSA9IGNyYXp5OworCisgICAgY29uc3QgbG9vbmV5ID0gbmV3IHR0eXBlcy5JbnNhbml0eSgpOworICAgIHNlY29uZF9tYXBbdHR5cGVzLk51bWJlcnouU0lYXSA9IGxvb25leTsKKworICAgIGNvbnN0IGluc2FuZSA9IFtdOworICAgIGluc2FuZVsxXSA9IGZpcnN0X21hcDsKKyAgICBpbnNhbmVbMl0gPSBzZWNvbmRfbWFwOworCisgICAgY29uc29sZS5sb2coJ2luc2FuZSByZXN1bHQ6Jyk7CisgICAgY29uc29sZS5sb2coaW5zYW5lKTsKKyAgICByZXN1bHQobnVsbCwgaW5zYW5lKTsKKyAgfSwKKyAgdGVzdE11bHRpOiBmdW5jdGlvbihhcmcwLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1LCByZXN1bHQpIHsKKyAgICBjb25zb2xlLmxvZygndGVzdE11bHRpKCknKTsKKworICAgIGNvbnN0IGhlbGxvID0gbmV3IHR0eXBlcy5YdHJ1Y3QoKTsKKyAgICBoZWxsby5zdHJpbmdfdGhpbmcgPSAnSGVsbG8yJzsKKyAgICBoZWxsby5ieXRlX3RoaW5nID0gYXJnMDsKKyAgICBoZWxsby5pMzJfdGhpbmcgPSBhcmcxOworICAgIGhlbGxvLmk2NF90aGluZyA9IGFyZzI7CisgICAgcmVzdWx0KG51bGwsIGhlbGxvKTsKKyAgfSwKKyAgdGVzdEV4Y2VwdGlvbjogZnVuY3Rpb24oYXJnLCByZXN1bHQpIHsKKyAgICBjb25zb2xlLmxvZygndGVzdEV4Y2VwdGlvbignICsgYXJnICsgJyknKTsKKyAgICBpZiAoYXJnID09PSAnWGNlcHRpb24nKSB7CisgICAgICBjb25zdCB4ID0gbmV3IHR0eXBlcy5YY2VwdGlvbigpOworICAgICAgeC5lcnJvckNvZGUgPSAxMDAxOworICAgICAgeC5tZXNzYWdlID0gYXJnOworICAgICAgcmVzdWx0KHgpOworICAgIH0gZWxzZSBpZiAoYXJnID09PSAnVEV4Y2VwdGlvbicpIHsKKyAgICAgIHJlc3VsdChuZXcgVEV4Y2VwdGlvbihhcmcpKTsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0KG51bGwpOworICAgIH0KKyAgfSwKKyAgdGVzdE11bHRpRXhjZXB0aW9uOiBmdW5jdGlvbihhcmcwLCBhcmcxLCByZXN1bHQpIHsKKyAgICBjb25zb2xlLmxvZygndGVzdE11bHRpRXhjZXB0aW9uKCcgKyBhcmcwICsgJywgJyArIGFyZzEgKyAnKScpOworICAgIGlmIChhcmcwID09PSAoJ1hjZXB0aW9uJykpIHsKKyAgICAgIGNvbnN0IHggPSBuZXcgdHR5cGVzLlhjZXB0aW9uKCk7CisgICAgICB4LmVycm9yQ29kZSA9IDEwMDE7CisgICAgICB4Lm1lc3NhZ2UgPSAnVGhpcyBpcyBhbiBYY2VwdGlvbic7CisgICAgICByZXN1bHQoeCk7CisgICAgfSBlbHNlIGlmIChhcmcwID09PSAoJ1hjZXB0aW9uMicpKSB7CisgICAgICBjb25zdCB4MiA9IG5ldyB0dHlwZXMuWGNlcHRpb24yKCk7CisgICAgICB4Mi5lcnJvckNvZGUgPSAyMDAyOworICAgICAgeDIuc3RydWN0X3RoaW5nID0gbmV3IHR0eXBlcy5YdHJ1Y3QoKTsKKyAgICAgIHgyLnN0cnVjdF90aGluZy5zdHJpbmdfdGhpbmcgPSAnVGhpcyBpcyBhbiBYY2VwdGlvbjInOworICAgICAgcmVzdWx0KHgyKTsKKyAgICB9CisKKyAgICBjb25zdCByZXMgPSBuZXcgdHR5cGVzLlh0cnVjdCgpOworICAgIHJlcy5zdHJpbmdfdGhpbmcgPSBhcmcxOworICAgIHJlc3VsdChudWxsLCByZXMpOworICB9LAorICB0ZXN0T25ld2F5OiBmdW5jdGlvbihzbGVlcEZvciwgcmVzdWx0KSB7CisgICAgY29uc29sZS5sb2coJ3Rlc3RPbmV3YXkoJyArIHNsZWVwRm9yICsgJykgPT4gSmF2YVNjcmlwdCAobGlrZSBSdXN0KSBuZXZlciBzbGVlcHMhJyk7CisgIH0KK307ICAgLy9UaHJpZnRUZXN0U3ZjSGFuZGxlcgpkaWZmIC0tZ2l0IGEvbGliL2pzL3Rlc3QvdGVzdHdzLmh0bWwgYi9saWIvanMvdGVzdC90ZXN0d3MuaHRtbAppbmRleCAxNWVlMTk1Li4xODQ1MDBmIDEwMDY0NAotLS0gYS9saWIvanMvdGVzdC90ZXN0d3MuaHRtbAorKysgYi9saWIvanMvdGVzdC90ZXN0d3MuaHRtbApAQCAtMSw2MCArMSw2MiBAQAot77u/PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPg0KLTwhLS0NCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPg0KLTxoZWFkPg0KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+DQotICA8dGl0bGU+VGhyaWZ0IEphdmFzY3JpcHQgQmluZGluZ3M6IFVuaXQgVGVzdDwvdGl0bGU+DQotDQotICA8c2NyaXB0IHNyYz0iYnVpbGQvanMvdGhyaWZ0LmpzIiAgICAgICAgIHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0Pg0KLSAgPHNjcmlwdCBzcmM9Imdlbi1qcy9UaHJpZnRUZXN0X3R5cGVzLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4NCi0gIDxzY3JpcHQgc3JjPSJnZW4tanMvVGhyaWZ0VGVzdC5qcyIgICAgICAgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+DQotDQotICA8IS0tIGpRdWVyeSAtLT4NCi0gIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vY29kZS5qcXVlcnkuY29tL2pxdWVyeS0xLjcuMi5qcyIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0Pg0KLSAgDQotICA8IS0tIFFVbml0IFRlc3QgZnJhbWV3b3JrLS0+DQotICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwczovL2NvZGUuanF1ZXJ5LmNvbS9xdW5pdC9xdW5pdC0xLjE0LjAuanMiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4NCi0gIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9jb2RlLmpxdWVyeS5jb20vcXVuaXQvcXVuaXQtMS4xNC4wLmNzcyIgdHlwZT0idGV4dC9jc3MiIG1lZGlhPSJzY3JlZW4iIC8+DQotICANCi0gIDwhLS0gdGhlIFRlc3QgU3VpdGUtLT4NCi0gIDxzY3JpcHQ+DQotICAgIHZhciBsb2MgPSB3aW5kb3cubG9jYXRpb247DQotICAgIHZhciB3c191cmkgPSAoKGxvYy5wcm90b2NvbCA9PT0gImh0dHBzOiIpID8gIndzczovLyIgOiAid3M6Ly8iKSArIA0KLSAgICAgICAgICAgICAgICAgICBsb2MuaG9zdG5hbWUgKyAiOiIgKyBsb2MucG9ydCArIGxvYy5wYXRobmFtZTsNCi0gICAgdmFyIHRyYW5zcG9ydCA9IG5ldyBUaHJpZnQuVFdlYlNvY2tldFRyYW5zcG9ydCh3c191cmkpOw0KLSAgICB2YXIgcHJvdG9jb2wgID0gbmV3IFRocmlmdC5Qcm90b2NvbCh0cmFuc3BvcnQpOw0KLSAgICB2YXIgY2xpZW50ICAgID0gbmV3IFRocmlmdFRlc3QuVGhyaWZ0VGVzdENsaWVudChwcm90b2NvbCk7DQotICAgIHRyYW5zcG9ydC5vcGVuKCk7DQotICA8L3NjcmlwdD4NCi0gIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InRlc3QtYXN5bmMuanMiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4NCi08L2hlYWQ+DQotPGJvZHk+DQotICA8aDEgaWQ9InF1bml0LWhlYWRlciI+VGhyaWZ0IEphdmFzY3JpcHQgQmluZGluZ3M6IFVuaXQgVGVzdCAoPGEgaHJlZj0iaHR0cHM6Ly9naXQtd2lwLXVzLmFwYWNoZS5vcmcvcmVwb3MvYXNmP3A9dGhyaWZ0LmdpdDthPWJsb2I7Zj10ZXN0L1RocmlmdFRlc3QudGhyaWZ0O2hiPUhFQUQiPlRocmlmdFRlc3QudGhyaWZ0PC9hPik8L2gxPg0KLSAgPGgyIGlkPSJxdW5pdC1iYW5uZXIiPjwvaDI+DQotICA8ZGl2IGlkPSJxdW5pdC10ZXN0cnVubmVyLXRvb2xiYXIiPjwvZGl2PiANCi0gIDxoMiBpZD0icXVuaXQtdXNlckFnZW50Ij48L2gyPg0KLSAgPG9sIGlkPSJxdW5pdC10ZXN0cyI+PGxpPjwhLS0gZ2V0IHZhbGlkIHhodG1sIHN0cmljdC0tPjwvbGk+PC9vbD4NCi0gIDxwPg0KLSAgICAgIDxhIGhyZWY9Imh0dHA6Ly92YWxpZGF0b3IudzMub3JnL2NoZWNrL3JlZmVyZXIiPjxpbWcNCi0gICAgICAgICAgc3JjPSJodHRwOi8vd3d3LnczLm9yZy9JY29ucy92YWxpZC14aHRtbDEwIg0KLSAgICAgICAgICBhbHQ9IlZhbGlkIFhIVE1MIDEuMCEiIGhlaWdodD0iMzEiIHdpZHRoPSI4OCIgLz48L2E+DQotICA8L3A+DQotPC9ib2R5Pg0KLTwvaHRtbD4NCivvu788IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KKzxoZWFkPgorICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KKyAgPHRpdGxlPlRocmlmdCBKYXZhc2NyaXB0IEJpbmRpbmdzOiBVbml0IFRlc3Q8L3RpdGxlPgorCisgIDxzY3JpcHQgc3JjPSJidWlsZC9qcy90aHJpZnQuanMiICAgICAgICAgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CisgIDxzY3JpcHQgc3JjPSJnZW4tanMvVGhyaWZ0VGVzdF90eXBlcy5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CisgIDxzY3JpcHQgc3JjPSJnZW4tanMvVGhyaWZ0VGVzdC5qcyIgICAgICAgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CisKKyAgPCEtLSBqUXVlcnkgLS0+CisgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9ImJ1aWxkL2pzL2xpYi9qcXVlcnkuanMiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KKworICA8IS0tIFFVbml0IFRlc3QgZnJhbWV3b3JrLS0+CisgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9ImJ1aWxkL2pzL2xpYi9xdW5pdC5qcyIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgorICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImJ1aWxkL2pzL2xpYi9xdW5pdC5jc3MiIHR5cGU9InRleHQvY3NzIiBtZWRpYT0ic2NyZWVuIiAvPgorCisgIDwhLS0gdGhlIFRlc3QgU3VpdGUtLT4KKyAgPHNjcmlwdD4KKyAgICBjb25zdCBsb2MgPSB3aW5kb3cubG9jYXRpb247CisgICAgY29uc3Qgd3NfdXJpID0gKChsb2MucHJvdG9jb2wgPT09ICJodHRwczoiKSA/ICJ3c3M6Ly8iIDogIndzOi8vIikgKworICAgICAgICAgICAgICAgICAgIGxvYy5ob3N0bmFtZSArICI6IiArIGxvYy5wb3J0ICsgbG9jLnBhdGhuYW1lOworICAgIGNvbnN0IHRyYW5zcG9ydCA9IG5ldyBUaHJpZnQuVFdlYlNvY2tldFRyYW5zcG9ydCh3c191cmkpOworICAgIGNvbnN0IHByb3RvY29sICA9IG5ldyBUaHJpZnQuUHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgICBjb25zdCBjbGllbnQgICAgPSBuZXcgVGhyaWZ0VGVzdC5UaHJpZnRUZXN0Q2xpZW50KHByb3RvY29sKTsKKyAgICB0cmFuc3BvcnQub3BlbigpOworICA8L3NjcmlwdD4KKyAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idGVzdC1hc3luYy5qcyIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgorPC9oZWFkPgorPGJvZHk+CisgIDxoMSBpZD0icXVuaXQtaGVhZGVyIj5UaHJpZnQgSmF2YXNjcmlwdCBCaW5kaW5nczogVW5pdCBUZXN0ICg8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC9ibG9iL21hc3Rlci90ZXN0L1RocmlmdFRlc3QudGhyaWZ0Ij5UaHJpZnRUZXN0LnRocmlmdDwvYT4pPC9oMT4KKyAgPGgyIGlkPSJxdW5pdC1iYW5uZXIiPjwvaDI+CisgIDxkaXYgaWQ9InF1bml0LXRlc3RydW5uZXItdG9vbGJhciI+PC9kaXY+CisgIDxoMiBpZD0icXVuaXQtdXNlckFnZW50Ij48L2gyPgorICA8b2wgaWQ9InF1bml0LXRlc3RzIj48bGk+PCEtLSBnZXQgdmFsaWQgeGh0bWwgc3RyaWN0LS0+PC9saT48L29sPgorICA8IS0tIFVuY29tbWVudCB0aGlzIHRvIGNoZWNrIHRoZSB2YWxpZGl0eS4gVGhpcyBzaWduaWZpY2FudGx5IHNsb3dzIGRvd24gdGhlIHRlc3QuCisgIDxwPgorICAgICAgPGEgaHJlZj0iaHR0cDovL3ZhbGlkYXRvci53My5vcmcvY2hlY2svcmVmZXJlciI+PGltZworICAgICAgICAgIHNyYz0iaHR0cDovL3d3dy53My5vcmcvSWNvbnMvdmFsaWQteGh0bWwxMCIKKyAgICAgICAgICBhbHQ9IlZhbGlkIFhIVE1MIDEuMCEiIGhlaWdodD0iMzEiIHdpZHRoPSI4OCIgLz48L2E+CisgIDwvcD4KKyAgLS0+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9saWIvanNvbi9NYWtlZmlsZS5hbSBiL2xpYi9qc29uL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwNTFiOWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvanNvbi9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDI5IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworU1VCRElSUyA9CisKK2lmIFdJVEhfSkFWQQorIyBTY2hlbWEgdmFsaWRhdGlvbiB0ZXN0IGRlcGVuZHMgb24gamF2YQorU1VCRElSUyArPSB0ZXN0CitlbmRpZgorCitFWFRSQV9ESVNUID0gXAorICAgIHNjaGVtYS5qc29uIFwKKyAgICB0ZXN0CmRpZmYgLS1naXQgYS9saWIvanNvbi9zY2hlbWEuanNvbiBiL2xpYi9qc29uL3NjaGVtYS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNThhN2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvanNvbi9zY2hlbWEuanNvbgpAQCAtMCwwICsxLDM0NCBAQAoreworICAiJHNjaGVtYSI6ICJodHRwOi8vanNvbi1zY2hlbWEub3JnL2RyYWZ0LTA0L3NjaGVtYSMiLAorCisgICJpZCI6ICJodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcvc2NoZW1hLmpzb24jIiwKKyAgImRlc2NyaXB0aW9uIjogIlNjaGVtYSBmb3IgQXBhY2hlIFRocmlmdCBwcm90b2NvbCBkZXNjcmlwdG9ycyIsCisKKyAgImRlZmluaXRpb25zIjogeworICAgICJ0eXBlLWlkIjogeworICAgICAgInRpdGxlIjogIkFueSB0eXBlIGlkIChuYW1lKSIsCisgICAgICAiZW51bSI6IFsKKyAgICAgICAgInZvaWQiLAorICAgICAgICAic3RyaW5nIiwKKyAgICAgICAgImJvb2wiLAorICAgICAgICAiYnl0ZSIsCisgICAgICAgICJpOCIsCisgICAgICAgICJpMTYiLAorICAgICAgICAiaTMyIiwKKyAgICAgICAgImk2NCIsCisgICAgICAgICJkb3VibGUiLAorICAgICAgICAibGlzdCIsCisgICAgICAgICJzZXQiLAorICAgICAgICAibWFwIiwKKyAgICAgICAgInVuaW9uIiwKKyAgICAgICAgInN0cnVjdCIsCisgICAgICAgICJiaW5hcnkiCisgICAgICBdCisgICAgfSwKKyAgICAiYmFzZS10eXBlIjogeworICAgICAgInRpdGxlIjogIkJhc2UgdHlwZSBzY2hlbWEiLAorICAgICAgInR5cGUiOiAib2JqZWN0IiwKKyAgICAgICJwcm9wZXJ0aWVzIjogeworICAgICAgICAidHlwZUlkIjogeworICAgICAgICAgICJlbnVtIjogWyJ2b2lkIiwgInN0cmluZyIsICJib29sIiwgImJ5dGUiLCAiaTgiLCAiaTE2IiwgImkzMiIsICJpNjQiLCAiZG91YmxlIiwgImJpbmFyeSIgXQorICAgICAgICB9CisgICAgICB9LAorICAgICAgInJlcXVpcmVkIjogWyAidHlwZUlkIiBdCisgICAgfSwKKyAgICAibGlzdC10eXBlIjogeworICAgICAgInRpdGxlIjogIkxpc3QgYW5kIHNldCBzY2hlbWEiLAorICAgICAgInR5cGUiOiAib2JqZWN0IiwKKyAgICAgICJwcm9wZXJ0aWVzIjogeworICAgICAgICAidHlwZUlkIjogeworICAgICAgICAgICJlbnVtIjogWyAibGlzdCIsICJzZXQiIF0KKyAgICAgICAgfSwKKyAgICAgICAgImVsZW1UeXBlSWQiOiAgeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3R5cGUtaWQiIH0sCisgICAgICAgICJlbGVtVHlwZSI6ICAgIHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy90eXBlLWRlc2MiIH0KKyAgICAgIH0sCisgICAgICAicmVxdWlyZWQiOiBbICJ0eXBlSWQiLCAiZWxlbVR5cGVJZCIgXQorICAgIH0sCisgICAgIm1hcC10eXBlIjogeworICAgICAgInRpdGxlIjogIk1hcCBzY2hlbWEiLAorICAgICAgInR5cGUiOiAib2JqZWN0IiwKKyAgICAgICJwcm9wZXJ0aWVzIjogeworICAgICAgICAidHlwZUlkIjogeworICAgICAgICAgICJlbnVtIjogWyAibWFwIiBdCisgICAgICAgIH0sCisgICAgICAgICJrZXlUeXBlSWQiOiAgIHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy90eXBlLWlkIiB9LAorICAgICAgICAia2V5VHlwZSI6ICAgICB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvdHlwZS1kZXNjIiB9LAorICAgICAgICAidmFsdWVUeXBlSWQiOiB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvdHlwZS1pZCIgfSwKKyAgICAgICAgInZhbHVlVHlwZSI6ICAgeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3R5cGUtZGVzYyIgfQorICAgICAgfSwKKyAgICAgICJyZXF1aXJlZCI6IFsgInR5cGVJZCIsICJrZXlUeXBlSWQiLCAidmFsdWVUeXBlSWQiIF0KKyAgICB9LAorICAgICJzdHJ1Y3QtdHlwZSI6IHsKKyAgICAgICJ0aXRsZSI6ICJTdHJ1Y3QsIHVuaW9uIGFuZCBleGNlcHRpb24gc2NoZW1hIiwKKyAgICAgICJ0eXBlIjogIm9iamVjdCIsCisgICAgICAicHJvcGVydGllcyI6IHsKKyAgICAgICAgInR5cGVJZCI6IHsKKyAgICAgICAgICAiZW51bSI6IFsgInVuaW9uIiwgInN0cnVjdCIsICJleGNlcHRpb24iIF0KKyAgICAgICAgfQorICAgICAgfSwKKyAgICAgICJyZXF1aXJlZCI6IFsgInR5cGVJZCIsICJjbGFzcyIgXQorICAgIH0sCisgICAgInR5cGUtZGVzYyI6IHsKKyAgICAgICJ0aXRsZSI6ICJUeXBlIGRlc2NyaXB0b3Igc2NoZW1hIiwKKyAgICAgICJhbGxPZiI6IFsKKyAgICAgICAgeworICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKKyAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogeworICAgICAgICAgICAgICAgICJ0eXBlSWQiOiAgICAgIHsgInR5cGUiOiAic3RyaW5nIiB9LAorICAgICAgICAgICAgICAgICJjbGFzcyI6ICAgICAgIHsgInR5cGUiOiAic3RyaW5nIiB9CisgICAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAib25lT2YiOgorICAgICAgICAgIFsKKyAgICAgICAgICAgIHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9iYXNlLXR5cGUiIH0sCisgICAgICAgICAgICB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvbGlzdC10eXBlIiB9LAorICAgICAgICAgICAgeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL21hcC10eXBlIiB9LAorICAgICAgICAgICAgeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3N0cnVjdC10eXBlIiB9CisgICAgICAgICAgXQorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAibmFtZS1hbmQtZG9jIjogeworICAgICAgInRpdGxlIjogIk5hbWUgYW5kIGRvY3VtZW50YXRpb24gc3ViLXNjaGVtYSIsCisgICAgICAidHlwZSI6ICJvYmplY3QiLAorICAgICAgInByb3BlcnRpZXMiOiB7CisgICAgICAgICJuYW1lIjogeyAidHlwZSI6ICJzdHJpbmciIH0sCisgICAgICAgICJkb2MiOiB7ICJ0eXBlIjogInN0cmluZyIgfQorICAgICAgfSwKKyAgICAgICJyZXF1aXJlZCI6IFsgIm5hbWUiIF0KKyAgICB9LAorICAgICJlbnVtIjogeworICAgICAgInRpdGxlIjogIlRocmlmdCAnZW51bScgZGVmaW5pdGlvbiBzY2hlbWEiLAorICAgICAgInR5cGUiOiAib2JqZWN0IiwKKyAgICAgICJhbGxPZiI6IFsKKyAgICAgICAgeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL25hbWUtYW5kLWRvYyIgfSwKKyAgICAgICAgeworICAgICAgICAgICJyZXF1aXJlZCI6IFsgIm1lbWJlcnMiIF0sCisgICAgICAgICAgInByb3BlcnRpZXMiOiB7CisgICAgICAgICAgICAibWVtYmVycyI6IHsKKyAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAorICAgICAgICAgICAgICAiaXRlbXMiOiB7CisgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKKyAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKKyAgICAgICAgICAgICAgICAgICJuYW1lIjogeyAidHlwZSI6ICJzdHJpbmciIH0sCisgICAgICAgICAgICAgICAgICAidmFsdWUiOiB7ICJ0eXBlIjogImludGVnZXIiIH0KKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICJyZXF1aXJlZCI6IFsgIm5hbWUiLCAidmFsdWUiIF0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInR5cGVkZWYiOiB7CisgICAgICAidGl0bGUiOiAiVGhyaWZ0IHR5cGVkZWYgZGVmaW5pdGlvbiBzY2hlbWEiLAorICAgICAgInR5cGUiOiAib2JqZWN0IiwKKyAgICAgICJhbGxPZiI6IFsKKyAgICAgICAgeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL25hbWUtYW5kLWRvYyIgfSwKKyAgICAgICAgeworICAgICAgICAgICJwcm9wZXJ0aWVzIjogeworICAgICAgICAgICAgInR5cGVJZCI6IHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy90eXBlLWlkIiB9LAorICAgICAgICAgICAgInR5cGUiOiB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvdHlwZS1kZXNjIiB9CisgICAgICAgICAgfSwKKyAgICAgICAgICAicmVxdWlyZWQiOiBbICJ0eXBlSWQiIF0KKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgImNvbnN0YW50IjogeworICAgICAgInRpdGxlIjogIlRocmlmdCBjb25zdGFudCBkZWZpbml0aW9uIHNjaGVtYSIsCisgICAgICAidHlwZSI6ICJvYmplY3QiLAorICAgICAgImFsbE9mIjogWworICAgICAgICB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvbmFtZS1hbmQtZG9jIiB9LAorICAgICAgICB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvdHlwZS1kZXNjIiB9LAorICAgICAgICB7CisgICAgICAgICAgInByb3BlcnRpZXMiOiB7CisgICAgICAgICAgICAidmFsdWUiOiB7CisgICAgICAgICAgICAgICJvbmVPZiI6IFsKKyAgICAgICAgICAgICAgICB7ICJ0eXBlIjogInN0cmluZyIgfSwKKyAgICAgICAgICAgICAgICB7ICJ0eXBlIjogIm51bWJlciIgfSwKKyAgICAgICAgICAgICAgICB7ICJ0eXBlIjogImFycmF5IiB9LAorICAgICAgICAgICAgICAgIHsgInR5cGUiOiAib2JqZWN0IiB9CisgICAgICAgICAgICAgIF0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9LAorICAgICAgICAgICJyZXF1aXJlZCI6IFsgInZhbHVlIiBdCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJmaWVsZCI6IHsKKyAgICAgICJ0aXRsZSI6ICJUaHJpZnQgc3RydWN0IGZpZWxkIGRlZmluaXRpb24gc2NoZW1hIiwKKyAgICAgICJ0eXBlIjogIm9iamVjdCIsCisgICAgICAiYWxsT2YiOiBbCisgICAgICAgIHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9uYW1lLWFuZC1kb2MiIH0sCisgICAgICAgIHsKKyAgICAgICAgICAicHJvcGVydGllcyI6IHsKKyAgICAgICAgICAgICJrZXkiOiB7CisgICAgICAgICAgICAgICJ0eXBlIjogImludGVnZXIiLAorICAgICAgICAgICAgICAibWluaW11bSI6IDEsCisgICAgICAgICAgICAgICJtYXhpbXVtIjogNjU1MzUKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAicmVxdWlyZWQiOiB7CisgICAgICAgICAgICAgICJlbnVtIjogWyAicmVxdWlyZWQiLCAib3B0aW9uYWwiLCAicmVxX291dCIgXQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJ0eXBlSWQiOiB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvdHlwZS1pZCIgfSwKKyAgICAgICAgICAgICJ0eXBlIjogeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3R5cGUtZGVzYyIgfSwKKyAgICAgICAgICAgICJkZWZhdWx0IjogeworICAgICAgICAgICAgICAib25lT2YiOiBbCisgICAgICAgICAgICAgICAgeyAidHlwZSI6ICJzdHJpbmciIH0sCisgICAgICAgICAgICAgICAgeyAidHlwZSI6ICJudW1iZXIiIH0sCisgICAgICAgICAgICAgICAgeyAidHlwZSI6ICJhcnJheSIgfSwKKyAgICAgICAgICAgICAgICB7ICJ0eXBlIjogIm9iamVjdCIgfQorICAgICAgICAgICAgICBdCisgICAgICAgICAgICB9CisgICAgICAgICAgfSwKKyAgICAgICAgICAicmVxdWlyZWQiOiBbICJrZXkiLCAicmVxdWlyZWQiIF0KKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInN0cnVjdCI6IHsKKyAgICAgICJ0aXRsZSI6ICJUaHJpZnQgc3RydWN0IGRlZmluaXRpb24gc2NoZW1hIiwKKyAgICAgICJ0eXBlIjogIm9iamVjdCIsCisgICAgICAiYWxsT2YiOiBbCisgICAgICAgIHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9uYW1lLWFuZC1kb2MiIH0sCisgICAgICAgIHsKKyAgICAgICAgICAicHJvcGVydGllcyI6IHsKKyAgICAgICAgICAgICJpc0V4Y2VwdGlvbiI6IHsgInR5cGUiOiAiYm9vbGVhbiIgfSwKKyAgICAgICAgICAgICJpc1VuaW9uIjogeyAidHlwZSI6ICJib29sZWFuIiB9LAorICAgICAgICAgICAgImZpZWxkcyI6IHsKKyAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAorICAgICAgICAgICAgICAiaXRlbXMiOiB7CisgICAgICAgICAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9maWVsZCIKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0sCisgICAgICAgICAgInJlcXVpcmVkIjogWyAiaXNFeGNlcHRpb24iLCAiaXNVbmlvbiIsICJmaWVsZHMiIF0KKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInVuaW9uIjogeworICAgICAgInRpdGxlIjogIlRocmlmdCB1bmlvbiBkZWZpbml0aW9uIHNjaGVtYSIsCisgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3N0cnVjdCIKKyAgICB9LAorICAgICJleGNlcHRpb24iOiB7CisgICAgICAidGl0bGUiOiAiVGhyaWZ0IGV4Y2VwdGlvbiBkZWZpbml0aW9uIHNjaGVtYSIsCisgICAgICAidHlwZSI6ICJvYmplY3QiLAorICAgICAgInByb3BlcnRpZXMiOiB7CisgICAgICAgICJrZXkiOiB7CisgICAgICAgICAgInR5cGUiOiAiaW50ZWdlciIsCisgICAgICAgICAgIm1pbmltdW0iOiAxLAorICAgICAgICAgICJtYXhpbXVtIjogNjU1MzUKKyAgICAgICAgfSwKKyAgICAgICAgIm5hbWUiOiB7ICJ0eXBlIjogInN0cmluZyIgfSwKKyAgICAgICAgInR5cGVJZCI6IHsgImVudW0iOiBbICJleGNlcHRpb24iIF0gfSwKKyAgICAgICAgInR5cGUiOiB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvc3RydWN0LXR5cGUiIH0KKyAgICAgIH0sCisgICAgICAicmVxdWlyZWQiOiBbICJrZXkiLCAibmFtZSIsICJ0eXBlSWQiIF0KKyAgICB9LAorICAgICJmdW5jdGlvbiI6IHsKKyAgICAgICJ0aXRsZSI6ICJUaHJpZnQgc2VydmljZSBmdW5jdGlvbiBkZWZpbml0aW9uIHNjaGVtYSIsCisgICAgICAidHlwZSI6ICJvYmplY3QiLAorICAgICAgImFsbE9mIjogWworICAgICAgICB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvbmFtZS1hbmQtZG9jIiB9LAorICAgICAgICB7CisgICAgICAgICAgInByb3BlcnRpZXMiOiB7CisgICAgICAgICAgICAib25ld2F5IjogeworICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIgorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJyZXR1cm5UeXBlIjogeworICAgICAgICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3R5cGUtZGVzYyIKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAiYXJndW1lbnRzIjogeworICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCisgICAgICAgICAgICAgICJpdGVtcyI6IHsKKyAgICAgICAgICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2ZpZWxkIgorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgImV4Y2VwdGlvbnMiOiB7CisgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKKyAgICAgICAgICAgICAgIml0ZW1zIjogeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2V4Y2VwdGlvbiIgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0sCisgICAgICAgICAgInJlcXVpcmVkIjogWyAib25ld2F5IiwgImFyZ3VtZW50cyIsICJleGNlcHRpb25zIiBdCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJzZXJ2aWNlIjogeworICAgICAgInRpdGxlIjogIlRocmlmdCBzZXJ2aWNlIGRlZmluaXRpb24gc2NoZW1hIiwKKyAgICAgICJ0eXBlIjogIm9iamVjdCIsCisgICAgICAiYWxsT2YiOiBbCisgICAgICAgIHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9uYW1lLWFuZC1kb2MiIH0sCisgICAgICAgIHsKKyAgICAgICAgICAicHJvcGVydGllcyI6IHsKKyAgICAgICAgICAgICJmdW5jdGlvbnMiOiB7CisgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKKyAgICAgICAgICAgICAgIml0ZW1zIjogeworICAgICAgICAgICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvZnVuY3Rpb24iCisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9LAorICAgICAgICAgICJyZXF1aXJlZCI6IFsgImZ1bmN0aW9ucyIgXQorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiYW5ub3RhdGlvbnMiOiB7CisgICAgICAidGl0bGUiOiAiTWFwIG9mIGFubm90YXRpb24gbmFtZXMgdG8gdmFsdWVzIiwKKyAgICAgICJ0eXBlIjogIm9iamVjdCIsCisgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiB7CisgICAgICAgICJ0eXBlIjogInN0cmluZyIKKyAgICAgIH0KKyAgICB9CisgIH0sCisKKyAgInR5cGUiOiAib2JqZWN0IiwKKyAgInJlcXVpcmVkIjogWworICAgICJuYW1lIiwKKyAgICAiZW51bXMiLAorICAgICJ0eXBlZGVmcyIsCisgICAgInN0cnVjdHMiLAorICAgICJjb25zdGFudHMiLAorICAgICJzZXJ2aWNlcyIKKyAgXSwKKyAgInByb3BlcnRpZXMiOiB7CisgICAgIm5hbWUiOiB7CisgICAgICAidHlwZSI6ICJzdHJpbmciCisgICAgfSwKKyAgICAiaW5jbHVkZXMiOiB7CisgICAgICAidHlwZSI6ICJhcnJheSIsCisgICAgICAiaXRlbXMiOiB7CisgICAgICAgICJ0eXBlIjogInN0cmluZyIKKyAgICAgIH0sCisgICAgICAidW5pcXVlSXRlbXMiOiB0cnVlCisgICAgfSwKKyAgICAibmFtZXNwYWNlcyI6IHsKKyAgICAgICJ0eXBlIjogIm9iamVjdCIsCisgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiB7CisgICAgICAgICJ0eXBlIjogInN0cmluZyIKKyAgICAgIH0KKyAgICB9LAorICAgICJlbnVtcyI6IHsKKyAgICAgICJ0eXBlIjogImFycmF5IiwKKyAgICAgICJpdGVtcyI6IHsKKyAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9lbnVtIgorICAgICAgfQorICAgIH0sCisgICAgInR5cGVkZWZzIjogeworICAgICAgInR5cGUiOiAiYXJyYXkiLAorICAgICAgIml0ZW1zIjogeworICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3R5cGVkZWYiCisgICAgICB9CisgICAgfSwKKyAgICAic3RydWN0cyI6IHsKKyAgICAgICJ0eXBlIjogImFycmF5IiwKKyAgICAgICJpdGVtcyI6IHsKKyAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9zdHJ1Y3QiCisgICAgICB9CisgICAgfSwKKyAgICAiY29uc3RhbnRzIjogeworICAgICAgInR5cGUiOiAiYXJyYXkiLAorICAgICAgIml0ZW1zIjogeworICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2NvbnN0YW50IgorICAgICAgfQorICAgIH0sCisgICAgInNlcnZpY2VzIjogeworICAgICAgInR5cGUiOiAiYXJyYXkiLAorICAgICAgIml0ZW1zIjogeworICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3NlcnZpY2UiCisgICAgICB9CisgICAgfQorICB9LAorICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiBmYWxzZQorfQpkaWZmIC0tZ2l0IGEvbGliL2pzb24vdGVzdC9NYWtlZmlsZS5hbSBiL2xpYi9qc29uL3Rlc3QvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI4N2E1MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qc29uL3Rlc3QvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwyNiBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2NoZWNrOgorCSQoQU5UKSAkKEFOVF9GTEFHUykgdGVzdAorCisjIE1ha2Ugc3VyZSB0aGlzIGRvZXNuJ3QgZmFpbCBpZiBhbnQgaXMgbm90IGNvbmZpZ3VyZWQuCitjbGVhbi1sb2NhbDoKKwlBTlQ9JChBTlQpIDsgaWYgdGVzdCAteiAiJCRBTlQiIDsgdGhlbiBBTlQ9OiA7IGZpIDsgXAorCSQkQU5UICQoQU5UX0ZMQUdTKSBjbGVhbgpkaWZmIC0tZ2l0IGEvbGliL2pzb24vdGVzdC9idWlsZC5wcm9wZXJ0aWVzIGIvbGliL2pzb24vdGVzdC9idWlsZC5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3NWY2NDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvanNvbi90ZXN0L2J1aWxkLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxMCBAQAorIyBKYXIgdmVyc2lvbnMKK212bi5hbnQudGFzay52ZXJzaW9uPTIuMS4zCisKKyMgRGVwZW5kZW5jeSB2ZXJzaW9ucworanNvbi1zY2hlbWEtdmFsaWRhdG9yLnZlcnNpb249Mi4yLjYKKworIyBNYXZlbiBkZXBlbmRlbmN5IGRvd25sb2FkIGxvY2F0aW9ucworbXZuLnJlcG89aHR0cDovL3JlcG8xLm1hdmVuLm9yZy9tYXZlbjIKK212bi5hbnQudGFzay51cmw9JHttdm4ucmVwb30vb3JnL2FwYWNoZS9tYXZlbi9tYXZlbi1hbnQtdGFza3MvJHttdm4uYW50LnRhc2sudmVyc2lvbn0KK212bi5hbnQudGFzay5qYXI9bWF2ZW4tYW50LXRhc2tzLSR7bXZuLmFudC50YXNrLnZlcnNpb259LmphcgpkaWZmIC0tZ2l0IGEvbGliL2pzb24vdGVzdC9idWlsZC54bWwgYi9saWIvanNvbi90ZXN0L2J1aWxkLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTZhMjM4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2pzb24vdGVzdC9idWlsZC54bWwKQEAgLTAsMCArMSwxNDQgQEAKKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCBuYW1lPSJKU09OIFNjaGVtYSBUZXN0IiBkZWZhdWx0PSJ0ZXN0IiBiYXNlZGlyPSIuIgorICB4bWxuczphcnRpZmFjdD0iYW50bGliOm9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuYW50Ij4KKworICA8ZGVzY3JpcHRpb24+SlNPTiBTY2hlbWEgVmFsaWRhdGlvbiBUZXN0PC9kZXNjcmlwdGlvbj4KKworICA8cHJvcGVydHkgbmFtZT0iYnVpbGQuZGlyIiBsb2NhdGlvbj0iJHtiYXNlZGlyfS9idWlsZCIgLz4KKyAgPHByb3BlcnR5IG5hbWU9Impzb24uZGlyIiBsb2NhdGlvbj0iJHtiYXNlZGlyfS8uLiIgLz4KKyAgPHByb3BlcnR5IG5hbWU9Imdlbi5qc29uLmRpciIgbG9jYXRpb249IiR7YnVpbGQuZGlyfS9nZW4tanNvbiIgLz4KKyAgPHByb3BlcnR5IG5hbWU9Impzb24uc2NoZW1hIiBsb2NhdGlvbj0iJHtqc29uLmRpcn0vc2NoZW1hLmpzb24iIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC50b29scy5kaXIiIGxvY2F0aW9uPSIke2J1aWxkLmRpcn0vdG9vbHMiLz4KKyAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmxpYi5kaXIiIGxvY2F0aW9uPSIke2J1aWxkLmRpcn0vbGliIi8+CisKKyAgPCEtLSB0aGUgcm9vdCBkaXJlY3RvcnksIHdoZXJlIHlvdSB1bnBhY2sgdGhyaWZ0IGRpc3RpYnV0aW9uIChlLmcuIHRocmlmdC0wLngueC50YXIuZ3opIC0tPgorICA8cHJvcGVydHkgbmFtZT0idGhyaWZ0LmRpciIgbG9jYXRpb249Ii4uLy4uLy4uLyIgLz4KKyAgPHByb3BlcnR5IG5hbWU9InRocmlmdC50ZXN0LmRpciIgbG9jYXRpb249IiR7dGhyaWZ0LmRpcn0vdGVzdCIgLz4KKyAgPHByb3BlcnR5IG5hbWU9InRocmlmdC5jb21waWxlciIgbG9jYXRpb249IiR7dGhyaWZ0LmRpcn0vY29tcGlsZXIvY3BwL3RocmlmdCIgLz4KKworICA8IS0tIEdldCBtYXZlbiBkZXBlbmRlbmN5IHZlcnNpb25zIGZyb20gaGVyZSAtLT4KKyAgPHByb3BlcnR5IGZpbGU9IiR7YmFzZWRpcn0vYnVpbGQucHJvcGVydGllcyIgLz4KKworICA8cGF0aCBpZD0idGVzdC5jbGFzc3BhdGgiPgorICAgIDxmaWxlc2V0IGRpcj0iJHtidWlsZC5saWIuZGlyfSI+CisgICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciIgLz4KKyAgICA8L2ZpbGVzZXQ+CisgIDwvcGF0aD4KKworICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGVyLmNoZWNrIj4KKyAgICA8ZmFpbD4KKyAgICAgIDxjb25kaXRpb24+CisgICAgICAgIDxub3Q+CisgICAgICAgICAgPHJlc291cmNlY291bnQgY291bnQ9IjEiPgorICAgICAgICAgICAgPGZpbGVzZXQgaWQ9ImZzIiBmaWxlPSIke3RocmlmdC5jb21waWxlcn0iLz4KKyAgICAgICAgICA8L3Jlc291cmNlY291bnQ+CisgICAgICAgIDwvbm90PgorICAgICAgPC9jb25kaXRpb24+CisgICAgICBUaHJpZnQgY29tcGlsZXIgaXMgbWlzc2luZyAhCisgICAgPC9mYWlsPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImluaXQiIGRlcGVuZHM9ImNvbXBpbGVyLmNoZWNrLCBta2RpcnMsIG12bi5pbml0Ij4KKyAgICA8dHN0YW1wIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ibWtkaXJzIj4KKyAgICA8bWtkaXIgZGlyPSIke2J1aWxkLmRpcn0iLz4KKyAgICA8bWtkaXIgZGlyPSIke2J1aWxkLmxpYi5kaXJ9Ii8+CisgICAgPG1rZGlyIGRpcj0iJHtidWlsZC50b29scy5kaXJ9Ii8+CisgICAgPG1rZGlyIGRpcj0iJHtnZW4uanNvbi5kaXJ9Ii8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iZ2VuZXJhdGUiIGRlcGVuZHM9ImluaXQiPgorICAgIDxleGVjIGV4ZWN1dGFibGU9IiR7dGhyaWZ0LmNvbXBpbGVyfSIgZmFpbG9uZXJyb3I9InRydWUiPgorICAgICAgPGFyZyBsaW5lPSItLWdlbiBqc29uIi8+CisgICAgICA8YXJnIGxpbmU9Ii1vdXQgJHtnZW4uanNvbi5kaXJ9Ii8+CisgICAgICA8YXJnIGxpbmU9IiR7dGhyaWZ0LnRlc3QuZGlyfS9UaHJpZnRUZXN0LnRocmlmdCIvPgorICAgIDwvZXhlYz4KKyAgICA8ZXhlYyBleGVjdXRhYmxlPSIke3RocmlmdC5jb21waWxlcn0iIGZhaWxvbmVycm9yPSJ0cnVlIj4KKyAgICAgIDxhcmcgbGluZT0iLS1nZW4ganNvbjptZXJnZSIvPgorICAgICAgPGFyZyBsaW5lPSItb3V0ICR7Z2VuLmpzb24uZGlyfSIvPgorICAgICAgPGFyZyBsaW5lPSIke3RocmlmdC50ZXN0LmRpcn0vSW5jbHVkZS50aHJpZnQiLz4KKyAgICA8L2V4ZWM+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdCIgZGVzY3JpcHRpb249InJ1biBzY2hlbWEgdmFsaWRhdGlvbiIKKyAgICAgICAgICBkZXBlbmRzPSJ2YWxpZGF0ZS1zY2hlbWEsIHZhbGlkYXRlLWdlbmVyYXRlZC1qc29uIi8+CisKKyAgPHRhcmdldCBuYW1lPSJ2YWxpZGF0ZS1zY2hlbWEiIGRlcGVuZHM9ImluaXQiPgorICAgIDxqYXZhIGNsYXNzbmFtZT0iY29tLmdpdGh1Yi5mZ2UuanNvbnNjaGVtYS5tYWluLmNsaS5NYWluIgorICAgICAgICAgIGNsYXNzcGF0aHJlZj0idGVzdC5jbGFzc3BhdGgiIGZhaWxvbmVycm9yPSJ0cnVlIj4KKyAgICAgIDxhcmcgdmFsdWU9Ii0tc3ludGF4Ii8+CisgICAgICA8YXJnIHZhbHVlPSIke2pzb24uc2NoZW1hfSIvPgorICAgIDwvamF2YT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ2YWxpZGF0ZS1nZW5lcmF0ZWQtanNvbiIgZGVwZW5kcz0iaW5pdCwgZ2VuZXJhdGUiPgorICAgIDx2YWxpZGF0ZS1qc29uIGZpbGU9IiR7Z2VuLmpzb24uZGlyfS9UaHJpZnRUZXN0Lmpzb24iLz4KKyAgICA8dmFsaWRhdGUtanNvbiBmaWxlPSIke2dlbi5qc29uLmRpcn0vSW5jbHVkZS5qc29uIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iY2xlYW4iPgorICAgIDxkZWxldGUgZGlyPSIke2J1aWxkLmRpcn0iIC8+CisgICAgPGRlbGV0ZSBkaXI9IiR7Z2VuLmpzb24uZGlyfSIgLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJtdm4uYW50LnRhc2tzLmRvd25sb2FkIiBkZXBlbmRzPSJta2RpcnMsbXZuLmFudC50YXNrcy5jaGVjayIgdW5sZXNzPSJtdm4uYW50LnRhc2tzLmZvdW5kIj4KKyAgICA8Z2V0IHNyYz0iJHttdm4uYW50LnRhc2sudXJsfS8ke212bi5hbnQudGFzay5qYXJ9IiBkZXN0PSIke2J1aWxkLnRvb2xzLmRpcn0vJHttdm4uYW50LnRhc2suamFyfSIgdXNldGltZXN0YW1wPSJ0cnVlIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ibXZuLmFudC50YXNrcy5jaGVjayI+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0ibXZuLmFudC50YXNrcy5mb3VuZCI+CisgICAgICA8dHlwZWZvdW5kIHVyaT0iYW50bGliOm9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuYW50IiBuYW1lPSJhcnRpZmFjdCIvPgorICAgIDwvY29uZGl0aW9uPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9Im12bi5pbml0IiBkZXBlbmRzPSJtdm4uYW50LnRhc2tzLmRvd25sb2FkIiB1bmxlc3M9Im12bi5maW5pc2hlZCI+CisgICAgPHR5cGVkZWYgdXJpPSJhbnRsaWI6b3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5hbnQiIGNsYXNzcGF0aD0iJHtidWlsZC50b29scy5kaXJ9LyR7bXZuLmFudC50YXNrLmphcn0iLz4KKworICAgIDxhcnRpZmFjdDpkZXBlbmRlbmNpZXMgZmlsZXNldElkPSJ0ZXN0LmRlcGVuZGVuY3kuamFycyI+CisgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJjb20uZ2l0aHViLmZnZSIgYXJ0aWZhY3RJZD0ianNvbi1zY2hlbWEtdmFsaWRhdG9yIiB2ZXJzaW9uPSIke2pzb24tc2NoZW1hLXZhbGlkYXRvci52ZXJzaW9ufSIvPgorICAgIDwvYXJ0aWZhY3Q6ZGVwZW5kZW5jaWVzPgorCisgICAgPCEtLSBDb3B5IHRoZSBkZXBlbmRlbmNpZXMgdG8gdGhlIGJ1aWxkL2xpYiBkaXIgLS0+CisgICAgPGNvcHkgdG9kaXI9IiR7YnVpbGQubGliLmRpcn0iPgorICAgICAgPGZpbGVzZXQgcmVmaWQ9InRlc3QuZGVwZW5kZW5jeS5qYXJzIi8+CisgICAgICA8bWFwcGVyIHR5cGU9ImZsYXR0ZW4iLz4KKyAgICA8L2NvcHk+CisKKyAgICA8cHJvcGVydHkgbmFtZT0ibXZuLmZpbmlzaGVkIiB2YWx1ZT0idHJ1ZSIvPgorICA8L3RhcmdldD4KKworICA8bWFjcm9kZWYgbmFtZT0idmFsaWRhdGUtanNvbiI+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJmaWxlIiBkZWZhdWx0PSIiLz4KKyAgICA8c2VxdWVudGlhbD4KKyAgICAgIDxqYXZhIGZhaWxvbmVycm9yPSJ0cnVlIgorICAgICAgICAgICAgZm9yaz0idHJ1ZSIKKyAgICAgICAgICAgIGRpcj0iJHtqc29uLmRpcn0iCisgICAgICAgICAgICBjbGFzc25hbWU9ImNvbS5naXRodWIuZmdlLmpzb25zY2hlbWEubWFpbi5jbGkuTWFpbiIKKyAgICAgICAgICAgIGNsYXNzcGF0aHJlZj0idGVzdC5jbGFzc3BhdGgiPgorICAgICAgICA8YXJnIGxpbmU9Ii0tZmFrZXJvb3QgaHR0cDovL3RocmlmdC5hcGFjaGUub3JnLyIvPgorICAgICAgICA8YXJnIHZhbHVlPSIke2pzb24uc2NoZW1hfSIvPgorICAgICAgICA8YXJnIHZhbHVlPSJAe2ZpbGV9Ii8+CisgICAgICA8L2phdmE+CisgICAgPC9zZXF1ZW50aWFsPgorICA8L21hY3JvZGVmPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9saWIvbHVhL01ha2VmaWxlLmFtIGIvbGliL2x1YS9NYWtlZmlsZS5hbQppbmRleCAxNjE3MGQ0Li41YjBmMTdhIDEwMDY0NAotLS0gYS9saWIvbHVhL01ha2VmaWxlLmFtCisrKyBiL2xpYi9sdWEvTWFrZWZpbGUuYW0KQEAgLTIzLDkgKzIzLDkgQEAKIAogbGliX0xUTElCUkFSSUVTID0gXAogCQkJbGlibHVhc29ja2V0LmxhIFwKKwkJCWxpYmx1YWxvbmdudW1iZXIubGEgXAogCQkJbGlibHVhYnBhY2subGEgXAotCQkJbGlibHVhYml0d2lzZS5sYSBcCi0JCQlsaWJsdWFsb25nbnVtYmVyLmxhCisJCQlsaWJsdWFiaXR3aXNlLmxhCiAKIGxpYmx1YXNvY2tldF9sYV9TT1VSQ0VTID0gXAogCQkJc3JjL2x1YXNvY2tldC5jIFwKQEAgLTMzLDMxICszMywzOSBAQAogCiBub2Jhc2VfaW5jbHVkZV9IRUFERVJTID0gc3JjL3NvY2tldC5oCiAKLWxpYmx1YXNvY2tldF9sYV9DUFBGTEFHUyA9ICQoQU1fQ1BQRkxBR1MpIC1JL3Vzci9pbmNsdWRlL2x1YTUuMiAtRExVQV9DT01QQVRfTU9EVUxFCi1saWJsdWFzb2NrZXRfbGFfTERGTEFHUyA9ICQoQU1fTERGTEFHUykgLWxsdWE1LjIgLWxtCitsaWJsdWFzb2NrZXRfbGFfQ1BQRkxBR1MgPSAkKEFNX0NQUEZMQUdTKSAkKExVQV9JTkNMVURFKSAtRExVQV9DT01QQVRfTU9EVUxFCitsaWJsdWFzb2NrZXRfbGFfTERGTEFHUyA9ICQoQU1fTERGTEFHUykKK2xpYmx1YXNvY2tldF9sYV9MSUJBREQgPSAkKExVQV9MSUIpIC1sbQogCiBsaWJsdWFicGFja19sYV9TT1VSQ0VTID0gc3JjL2x1YWJwYWNrLmMKIAotbGlibHVhYnBhY2tfbGFfQ1BQRkxBR1MgPSAkKEFNX0NQUEZMQUdTKSAtSS91c3IvaW5jbHVkZS9sdWE1LjIgLURMVUFfQ09NUEFUX01PRFVMRQotbGlibHVhYnBhY2tfbGFfTERGTEFHUyA9ICQoQU1fTERGTEFHUykgLWxsdWE1LjIgLWxtCi1saWJsdWFicGFja19sYV9MSUJBREQgPSBsaWJsdWFsb25nbnVtYmVyLmxhCitsaWJsdWFicGFja19sYV9DUFBGTEFHUyA9ICQoQU1fQ1BQRkxBR1MpICQoTFVBX0lOQ0xVREUpIC1ETFVBX0NPTVBBVF9NT0RVTEUKK2xpYmx1YWJwYWNrX2xhX0xERkxBR1MgPSAkKEFNX0xERkxBR1MpCitsaWJsdWFicGFja19sYV9MSUJBREQgPSBsaWJsdWFsb25nbnVtYmVyLmxhICQoTFVBX0xJQikgLWxtCiAKIGxpYmx1YWJpdHdpc2VfbGFfU09VUkNFUyA9IHNyYy9sdWFiaXR3aXNlLmMKIAotbGlibHVhYml0d2lzZV9sYV9DUFBGTEFHUyA9ICQoQU1fQ1BQRkxBR1MpIC1JL3Vzci9pbmNsdWRlL2x1YTUuMiAtRExVQV9DT01QQVRfTU9EVUxFCi1saWJsdWFiaXR3aXNlX2xhX0xERkxBR1MgPSAkKEFNX0xERkxBR1MpIC1sbHVhNS4yIC1sbQorbGlibHVhYml0d2lzZV9sYV9DUFBGTEFHUyA9ICQoQU1fQ1BQRkxBR1MpICQoTFVBX0lOQ0xVREUpIC1ETFVBX0NPTVBBVF9NT0RVTEUKK2xpYmx1YWJpdHdpc2VfbGFfTERGTEFHUyA9ICQoQU1fTERGTEFHUykKK2xpYmx1YWJpdHdpc2VfbGFfTElCQUREID0gJChMVUFfTElCKSAtbG0KIAogbGlibHVhbG9uZ251bWJlcl9sYV9TT1VSQ0VTID0gXAogCQlzcmMvbHVhbG9uZ251bWJlci5jIFwKIAkJc3JjL2xvbmdudW1iZXJ1dGlscy5jCiAKLWxpYmx1YWxvbmdudW1iZXJfbGFfQ1BQRkxBR1MgPSAkKEFNX0NQUEZMQUdTKSAtSS91c3IvaW5jbHVkZS9sdWE1LjIgLURMVUFfQ09NUEFUX01PRFVMRQotbGlibHVhbG9uZ251bWJlcl9sYV9MREZMQUdTID0gJChBTV9MREZMQUdTKSAtbGx1YTUuMiAtbG0KK2xpYmx1YWxvbmdudW1iZXJfbGFfQ1BQRkxBR1MgPSAkKEFNX0NQUEZMQUdTKSAkKExVQV9JTkNMVURFKSAtRExVQV9DT01QQVRfTU9EVUxFCitsaWJsdWFsb25nbnVtYmVyX2xhX0xERkxBR1MgPSAkKEFNX0xERkxBR1MpCitsaWJsdWFsb25nbnVtYmVyX2xhX0xJQkFERCA9ICQoTFVBX0xJQikgLWxtCiAKLUVYVFJBX0RJU1QgPSBUQmluYXJ5UHJvdG9jb2wubHVhIFwKK0VYVFJBX0RJU1QgPSBcCisJCWNvZGluZ19zdGFuZGFyZHMubWQgXAorCQlUQmluYXJ5UHJvdG9jb2wubHVhIFwKIAkJVEJ1ZmZlcmVkVHJhbnNwb3J0Lmx1YSBcCisJCVRDb21wYWN0UHJvdG9jb2wubHVhIFwKIAkJVEZyYW1lZFRyYW5zcG9ydC5sdWEgXAogCQlUaHJpZnQubHVhIFwKKwkJVEh0dHBUcmFuc3BvcnQubHVhIFwKKwkJVEpzb25Qcm90b2NvbC5sdWEgXAogCQlUTWVtb3J5QnVmZmVyLmx1YSBcCiAJCVRQcm90b2NvbC5sdWEgXAogCQlUU2VydmVyLmx1YSBcCmRpZmYgLS1naXQgYS9saWIvbHVhL1RCaW5hcnlQcm90b2NvbC5sdWEgYi9saWIvbHVhL1RCaW5hcnlQcm90b2NvbC5sdWEKaW5kZXggZGYxM2Q2MS4uNGI4ZTk4YSAxMDA2NDQKLS0tIGEvbGliL2x1YS9UQmluYXJ5UHJvdG9jb2wubHVhCisrKyBiL2xpYi9sdWEvVEJpbmFyeVByb3RvY29sLmx1YQpAQCAtMzEsNyArMzEsNyBAQAogfSkKIAogZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sOndyaXRlTWVzc2FnZUJlZ2luKG5hbWUsIHR0eXBlLCBzZXFpZCkKLSAgaWYgc2VsZi5zdGlyY3RXcml0ZSB0aGVuCisgIGlmIHNlbGYuc3RyaWN0V3JpdGUgdGhlbgogICAgIHNlbGY6d3JpdGVJMzIobGlibHVhYml0d2lzZS5ib3IoVEJpbmFyeVByb3RvY29sLlZFUlNJT05fMSwgdHR5cGUpKQogICAgIHNlbGY6d3JpdGVTdHJpbmcobmFtZSkKICAgICBzZWxmOndyaXRlSTMyKHNlcWlkKQpkaWZmIC0tZ2l0IGEvbGliL2x1YS9UQnVmZmVyZWRUcmFuc3BvcnQubHVhIGIvbGliL2x1YS9UQnVmZmVyZWRUcmFuc3BvcnQubHVhCmluZGV4IDJiMGI5NDYuLjQ1ZWY0YjEgMTAwNjQ0Ci0tLSBhL2xpYi9sdWEvVEJ1ZmZlcmVkVHJhbnNwb3J0Lmx1YQorKysgYi9saWIvbHVhL1RCdWZmZXJlZFRyYW5zcG9ydC5sdWEKQEAgLTM3LDcgKzM3LDcgQEAKICAgICBlcnJvcignWW91IG11c3QgcHJvdmlkZSAnIC4uIHR0eXBlKHNlbGYpIC4uICcgd2l0aCBhIHRyYW5zJykKICAgZW5kCiAKLSAgcmV0dXJuIFRUcmFuc3BvcnRCYXNlOm5ldyhvYmopCisgIHJldHVybiBUVHJhbnNwb3J0QmFzZS5uZXcoc2VsZiwgb2JqKQogZW5kCiAKIGZ1bmN0aW9uIFRCdWZmZXJlZFRyYW5zcG9ydDppc09wZW4oKQpkaWZmIC0tZ2l0IGEvbGliL2x1YS9UQ29tcGFjdFByb3RvY29sLmx1YSBiL2xpYi9sdWEvVENvbXBhY3RQcm90b2NvbC5sdWEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc3NTk1YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9sdWEvVENvbXBhY3RQcm90b2NvbC5sdWEKQEAgLTAsMCArMSw0NTcgQEAKKy0tCistLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCistLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLS0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy0tIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLS0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLS0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLS0gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CistLQorLS0gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy0tCistLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCistLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLS0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCistLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLS0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLS0gdW5kZXIgdGhlIExpY2Vuc2UuCistLQorCityZXF1aXJlICdUUHJvdG9jb2wnCityZXF1aXJlICdsaWJsdWFicGFjaycKK3JlcXVpcmUgJ2xpYmx1YWJpdHdpc2UnCityZXF1aXJlICdsaWJsdWFsb25nbnVtYmVyJworCitUQ29tcGFjdFByb3RvY29sID0gX19UT2JqZWN0Lm5ldyhUUHJvdG9jb2xCYXNlLCB7CisgIF9fdHlwZSA9ICdUQ29tcGFjdFByb3RvY29sJywKKyAgQ09NUEFDVF9QUk9UT0NPTF9JRCAgICAgICA9IDB4ODIsCisgIENPTVBBQ1RfVkVSU0lPTiAgICAgICAgICAgPSAxLAorICBDT01QQUNUX1ZFUlNJT05fTUFTSyAgICAgID0gMHgxZiwKKyAgQ09NUEFDVF9UWVBFX01BU0sgICAgICAgICA9IDB4RTAsCisgIENPTVBBQ1RfVFlQRV9CSVRTICAgICAgICAgPSAweDA3LAorICBDT01QQUNUX1RZUEVfU0hJRlRfQU1PVU5UID0gNSwKKworICAtLSBVc2VkIHRvIGtlZXAgdHJhY2sgb2YgdGhlIGxhc3QgZmllbGQgZm9yIHRoZSBjdXJyZW50IGFuZCBwcmV2aW91cyBzdHJ1Y3RzLAorICAtLSBzbyB3ZSBjYW4gZG8gdGhlIGRlbHRhIHN0dWZmLgorICBsYXN0RmllbGQgPSB7fSwKKyAgbGFzdEZpZWxkSWQgPSAwLAorICBsYXN0RmllbGRJbmRleCA9IDEsCisKKyAgLS0gSWYgd2UgZW5jb3VudGVyIGEgYm9vbGVhbiBmaWVsZCBiZWdpbiwgc2F2ZSB0aGUgVEZpZWxkIGhlcmUgc28gaXQgY2FuCisgIC0tIGhhdmUgdGhlIHZhbHVlIGluY29ycG9yYXRlZC4KKyAgYm9vbGVhbkZpZWxkTmFtZSAgICA9ICIiLAorICBib29sZWFuRmllbGRJZCAgICAgID0gMCwKKyAgYm9vbGVhbkZpZWxkUGVuZGluZyA9IGZhbHNlLAorCisgIC0tIElmIHdlIHJlYWQgYSBmaWVsZCBoZWFkZXIsIGFuZCBpdCdzIGEgYm9vbGVhbiBmaWVsZCwgc2F2ZSB0aGUgYm9vbGVhbgorICAtLSB2YWx1ZSBoZXJlIHNvIHRoYXQgcmVhZEJvb2wgY2FuIHVzZSBpdC4KKyAgYm9vbFZhbHVlICAgICAgICAgID0gZmFsc2UsCisgIGJvb2xWYWx1ZUlzTm90TnVsbCA9IGZhbHNlLAorfSkKKworVENvbXBhY3RUeXBlID0geworICBDT01QQUNUX0JPT0xFQU5fVFJVRSAgPSAweDAxLAorICBDT01QQUNUX0JPT0xFQU5fRkFMU0UgPSAweDAyLAorICBDT01QQUNUX0JZVEUgICAgICAgICAgPSAweDAzLAorICBDT01QQUNUX0kxNiAgICAgICAgICAgPSAweDA0LAorICBDT01QQUNUX0kzMiAgICAgICAgICAgPSAweDA1LAorICBDT01QQUNUX0k2NCAgICAgICAgICAgPSAweDA2LAorICBDT01QQUNUX0RPVUJMRSAgICAgICAgPSAweDA3LAorICBDT01QQUNUX0JJTkFSWSAgICAgICAgPSAweDA4LAorICBDT01QQUNUX0xJU1QgICAgICAgICAgPSAweDA5LAorICBDT01QQUNUX1NFVCAgICAgICAgICAgPSAweDBBLAorICBDT01QQUNUX01BUCAgICAgICAgICAgPSAweDBCLAorICBDT01QQUNUX1NUUlVDVCAgICAgICAgPSAweDBDCit9CisKK1RUeXBlVG9Db21wYWN0VHlwZSA9IHt9CitUVHlwZVRvQ29tcGFjdFR5cGVbVFR5cGUuU1RPUF0gICA9IFRUeXBlLlNUT1AKK1RUeXBlVG9Db21wYWN0VHlwZVtUVHlwZS5CT09MXSAgID0gVENvbXBhY3RUeXBlLkNPTVBBQ1RfQk9PTEVBTl9UUlVFCitUVHlwZVRvQ29tcGFjdFR5cGVbVFR5cGUuQllURV0gICA9IFRDb21wYWN0VHlwZS5DT01QQUNUX0JZVEUKK1RUeXBlVG9Db21wYWN0VHlwZVtUVHlwZS5JMTZdICAgID0gVENvbXBhY3RUeXBlLkNPTVBBQ1RfSTE2CitUVHlwZVRvQ29tcGFjdFR5cGVbVFR5cGUuSTMyXSAgICA9IFRDb21wYWN0VHlwZS5DT01QQUNUX0kzMgorVFR5cGVUb0NvbXBhY3RUeXBlW1RUeXBlLkk2NF0gICAgPSBUQ29tcGFjdFR5cGUuQ09NUEFDVF9JNjQKK1RUeXBlVG9Db21wYWN0VHlwZVtUVHlwZS5ET1VCTEVdID0gVENvbXBhY3RUeXBlLkNPTVBBQ1RfRE9VQkxFCitUVHlwZVRvQ29tcGFjdFR5cGVbVFR5cGUuU1RSSU5HXSA9IFRDb21wYWN0VHlwZS5DT01QQUNUX0JJTkFSWQorVFR5cGVUb0NvbXBhY3RUeXBlW1RUeXBlLkxJU1RdICAgPSBUQ29tcGFjdFR5cGUuQ09NUEFDVF9MSVNUCitUVHlwZVRvQ29tcGFjdFR5cGVbVFR5cGUuU0VUXSAgICA9IFRDb21wYWN0VHlwZS5DT01QQUNUX1NFVAorVFR5cGVUb0NvbXBhY3RUeXBlW1RUeXBlLk1BUF0gICAgPSBUQ29tcGFjdFR5cGUuQ09NUEFDVF9NQVAKK1RUeXBlVG9Db21wYWN0VHlwZVtUVHlwZS5TVFJVQ1RdID0gVENvbXBhY3RUeXBlLkNPTVBBQ1RfU1RSVUNUCisKK0NvbXBhY3RUeXBlVG9UVHlwZSA9IHt9CitDb21wYWN0VHlwZVRvVFR5cGVbVFR5cGUuU1RPUF0gICAgICAgICAgICAgICAgICAgICAgICA9IFRUeXBlLlNUT1AKK0NvbXBhY3RUeXBlVG9UVHlwZVtUQ29tcGFjdFR5cGUuQ09NUEFDVF9CT09MRUFOX1RSVUVdID0gVFR5cGUuQk9PTAorQ29tcGFjdFR5cGVUb1RUeXBlW1RDb21wYWN0VHlwZS5DT01QQUNUX0JPT0xFQU5fRkFMU0VdID0gVFR5cGUuQk9PTAorQ29tcGFjdFR5cGVUb1RUeXBlW1RDb21wYWN0VHlwZS5DT01QQUNUX0JZVEVdICAgICAgICAgPSBUVHlwZS5CWVRFCitDb21wYWN0VHlwZVRvVFR5cGVbVENvbXBhY3RUeXBlLkNPTVBBQ1RfSTE2XSAgICAgICAgICA9IFRUeXBlLkkxNgorQ29tcGFjdFR5cGVUb1RUeXBlW1RDb21wYWN0VHlwZS5DT01QQUNUX0kzMl0gICAgICAgICAgPSBUVHlwZS5JMzIKK0NvbXBhY3RUeXBlVG9UVHlwZVtUQ29tcGFjdFR5cGUuQ09NUEFDVF9JNjRdICAgICAgICAgID0gVFR5cGUuSTY0CitDb21wYWN0VHlwZVRvVFR5cGVbVENvbXBhY3RUeXBlLkNPTVBBQ1RfRE9VQkxFXSAgICAgICA9IFRUeXBlLkRPVUJMRQorQ29tcGFjdFR5cGVUb1RUeXBlW1RDb21wYWN0VHlwZS5DT01QQUNUX0JJTkFSWV0gICAgICAgPSBUVHlwZS5TVFJJTkcKK0NvbXBhY3RUeXBlVG9UVHlwZVtUQ29tcGFjdFR5cGUuQ09NUEFDVF9MSVNUXSAgICAgICAgID0gVFR5cGUuTElTVAorQ29tcGFjdFR5cGVUb1RUeXBlW1RDb21wYWN0VHlwZS5DT01QQUNUX1NFVF0gICAgICAgICAgPSBUVHlwZS5TRVQKK0NvbXBhY3RUeXBlVG9UVHlwZVtUQ29tcGFjdFR5cGUuQ09NUEFDVF9NQVBdICAgICAgICAgID0gVFR5cGUuTUFQCitDb21wYWN0VHlwZVRvVFR5cGVbVENvbXBhY3RUeXBlLkNPTVBBQ1RfU1RSVUNUXSAgICAgICA9IFRUeXBlLlNUUlVDVAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOnJlc2V0TGFzdEZpZWxkKCkKKyAgc2VsZi5sYXN0RmllbGQgPSB7fQorICBzZWxmLmxhc3RGaWVsZElkID0gMAorICBzZWxmLmxhc3RGaWVsZEluZGV4ID0gMQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6cGFja0NvbXBhY3RUeXBlKGt0eXBlLCB2dHlwZSkKKyAgcmV0dXJuIGxpYmx1YWJpdHdpc2UuYm9yKGxpYmx1YWJpdHdpc2Uuc2hpZnRsKGt0eXBlLCA0KSwgdnR5cGUpCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDp3cml0ZU1lc3NhZ2VCZWdpbihuYW1lLCB0dHlwZSwgc2VxaWQpCisgIHNlbGY6d3JpdGVCeXRlKFRDb21wYWN0UHJvdG9jb2wuQ09NUEFDVF9QUk9UT0NPTF9JRCkKKyAgc2VsZjp3cml0ZUJ5dGUobGlibHVhYnBhY2sucGFja01lc2dUeXBlKFRDb21wYWN0UHJvdG9jb2wuQ09NUEFDVF9WRVJTSU9OLAorICAgIFRDb21wYWN0UHJvdG9jb2wuQ09NUEFDVF9WRVJTSU9OX01BU0ssdHR5cGUsCisgICAgVENvbXBhY3RQcm90b2NvbC5DT01QQUNUX1RZUEVfU0hJRlRfQU1PVU5ULAorICAgIFRDb21wYWN0UHJvdG9jb2wuQ09NUEFDVF9UWVBFX01BU0spKQorICBzZWxmOndyaXRlVmFyaW50MzIoc2VxaWQpCisgIHNlbGY6d3JpdGVTdHJpbmcobmFtZSkKKyAgc2VsZjpyZXNldExhc3RGaWVsZCgpCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDp3cml0ZU1lc3NhZ2VFbmQoKQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6d3JpdGVTdHJ1Y3RCZWdpbihuYW1lKQorICBzZWxmLmxhc3RGaWVsZEluZGV4ID0gc2VsZi5sYXN0RmllbGRJbmRleCArIDEKKyAgc2VsZi5sYXN0RmllbGRbc2VsZi5sYXN0RmllbGRJbmRleF0gPSBzZWxmLmxhc3RGaWVsZElkCisgIHNlbGYubGFzdEZpZWxkSWQgPSAwCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDp3cml0ZVN0cnVjdEVuZCgpCisgIHNlbGYubGFzdEZpZWxkSW5kZXggPSBzZWxmLmxhc3RGaWVsZEluZGV4IC0gMQorICBzZWxmLmxhc3RGaWVsZElkID0gc2VsZi5sYXN0RmllbGRbc2VsZi5sYXN0RmllbGRJbmRleF0KK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOndyaXRlRmllbGRCZWdpbihuYW1lLCB0dHlwZSwgaWQpCisgIGlmIHR0eXBlID09IFRUeXBlLkJPT0wgdGhlbgorICAgIHNlbGYuYm9vbGVhbkZpZWxkTmFtZSA9IG5hbWUKKyAgICBzZWxmLmJvb2xlYW5GaWVsZElkICAgPSBpZAorICAgIHNlbGYuYm9vbGVhbkZpZWxkUGVuZGluZyA9IHRydWUKKyAgZWxzZQorICAgIHNlbGY6d3JpdGVGaWVsZEJlZ2luSW50ZXJuYWwobmFtZSwgdHR5cGUsIGlkLCAtMSkKKyAgZW5kCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDp3cml0ZUZpZWxkRW5kKCkKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOndyaXRlRmllbGRTdG9wKCkKKyAgc2VsZjp3cml0ZUJ5dGUoVFR5cGUuU1RPUCk7CitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDp3cml0ZU1hcEJlZ2luKGt0eXBlLCB2dHlwZSwgc2l6ZSkKKyAgaWYgc2l6ZSA9PSAwIHRoZW4KKyAgICBzZWxmOndyaXRlQnl0ZSgwKQorICBlbHNlCisgICAgc2VsZjp3cml0ZVZhcmludDMyKHNpemUpCisgICAgc2VsZjp3cml0ZUJ5dGUoc2VsZjpwYWNrQ29tcGFjdFR5cGUoVFR5cGVUb0NvbXBhY3RUeXBlW2t0eXBlXSwgVFR5cGVUb0NvbXBhY3RUeXBlW3Z0eXBlXSkpCisgIGVuZAorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6d3JpdGVNYXBFbmQoKQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6d3JpdGVMaXN0QmVnaW4oZXR5cGUsIHNpemUpCisgIHNlbGY6d3JpdGVDb2xsZWN0aW9uQmVnaW4oZXR5cGUsIHNpemUpCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDp3cml0ZUxpc3RFbmQoKQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6d3JpdGVTZXRCZWdpbihldHlwZSwgc2l6ZSkKKyAgc2VsZjp3cml0ZUNvbGxlY3Rpb25CZWdpbihldHlwZSwgc2l6ZSkKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOndyaXRlU2V0RW5kKCkKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOndyaXRlQm9vbChib29sKQorICBsb2NhbCB2YWx1ZSA9IFRDb21wYWN0VHlwZS5DT01QQUNUX0JPT0xFQU5fRkFMU0UKKyAgaWYgYm9vbCB0aGVuCisgICAgdmFsdWUgPSBUQ29tcGFjdFR5cGUuQ09NUEFDVF9CT09MRUFOX1RSVUUKKyAgZW5kCisgIHByaW50KHZhbHVlLHNlbGYuYm9vbGVhbkZpZWxkUGVuZGluZyxzZWxmLmJvb2xlYW5GaWVsZElkKQorICBpZiBzZWxmLmJvb2xlYW5GaWVsZFBlbmRpbmcgdGhlbgorICAgIHNlbGY6d3JpdGVGaWVsZEJlZ2luSW50ZXJuYWwoc2VsZi5ib29sZWFuRmllbGROYW1lLCBUVHlwZS5CT09MLCBzZWxmLmJvb2xlYW5GaWVsZElkLCB2YWx1ZSkKKyAgICBzZWxmLmJvb2xlYW5GaWVsZFBlbmRpbmcgPSBmYWxzZQorICBlbHNlCisgICAgc2VsZjp3cml0ZUJ5dGUodmFsdWUpCisgIGVuZAorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6d3JpdGVCeXRlKGJ5dGUpCisgIGxvY2FsIGJ1ZmYgPSBsaWJsdWFicGFjay5icGFjaygnYycsIGJ5dGUpCisgIHNlbGYudHJhbnM6d3JpdGUoYnVmZikKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOndyaXRlSTE2KGkxNikKKyAgc2VsZjp3cml0ZVZhcmludDMyKGxpYmx1YWJwYWNrLmkzMlRvWmlnemFnKGkxNikpCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDp3cml0ZUkzMihpMzIpCisgIHNlbGY6d3JpdGVWYXJpbnQzMihsaWJsdWFicGFjay5pMzJUb1ppZ3phZyhpMzIpKQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6d3JpdGVJNjQoaTY0KQorICBzZWxmOndyaXRlVmFyaW50NjQobGlibHVhYnBhY2suaTY0VG9aaWd6YWcoaTY0KSkKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOndyaXRlRG91YmxlKGR1YikKKyAgbG9jYWwgYnVmZiA9IGxpYmx1YWJwYWNrLmJwYWNrKCdkJywgZHViKQorICBzZWxmLnRyYW5zOndyaXRlKGJ1ZmYpCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDp3cml0ZVN0cmluZyhzdHIpCisgIC0tIFNob3VsZCBiZSB1dGYtOAorICBzZWxmOndyaXRlQmluYXJ5KHN0cikKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOndyaXRlQmluYXJ5KHN0cikKKyAgLS0gU2hvdWxkIGJlIHV0Zi04CisgIHNlbGY6d3JpdGVWYXJpbnQzMihzdHJpbmcubGVuKHN0cikpCisgIHNlbGYudHJhbnM6d3JpdGUoc3RyKQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6d3JpdGVGaWVsZEJlZ2luSW50ZXJuYWwobmFtZSwgdHR5cGUsIGlkLCB0eXBlT3ZlcnJpZGUpCisgIGlmIHR5cGVPdmVycmlkZSA9PSAtMSB0aGVuCisgICAgdHlwZU92ZXJyaWRlID0gVFR5cGVUb0NvbXBhY3RUeXBlW3R0eXBlXQorICBlbmQKKyAgbG9jYWwgb2Zmc2V0ID0gaWQgLSBzZWxmLmxhc3RGaWVsZElkCisgIGlmIGlkID4gc2VsZi5sYXN0RmllbGRJZCBhbmQgb2Zmc2V0IDw9IDE1IHRoZW4KKyAgICBzZWxmOndyaXRlQnl0ZShsaWJsdWFiaXR3aXNlLmJvcihsaWJsdWFiaXR3aXNlLnNoaWZ0bChvZmZzZXQsIDQpLCB0eXBlT3ZlcnJpZGUpKQorICBlbHNlCisgICAgc2VsZjp3cml0ZUJ5dGUodHlwZU92ZXJyaWRlKQorICAgIHNlbGY6d3JpdGVJMTYoaWQpCisgIGVuZAorICBzZWxmLmxhc3RGaWVsZElkID0gaWQKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOndyaXRlQ29sbGVjdGlvbkJlZ2luKGV0eXBlLCBzaXplKQorICBpZiBzaXplIDw9IDE0IHRoZW4KKyAgICBzZWxmOndyaXRlQnl0ZShsaWJsdWFiaXR3aXNlLmJvcihsaWJsdWFiaXR3aXNlLnNoaWZ0bChzaXplLCA0KSwgVFR5cGVUb0NvbXBhY3RUeXBlW2V0eXBlXSkpCisgIGVsc2UKKyAgICBzZWxmOndyaXRlQnl0ZShsaWJsdWFiaXR3aXNlLmJvcigweGYwLCBUVHlwZVRvQ29tcGFjdFR5cGVbZXR5cGVdKSkKKyAgICBzZWxmOndyaXRlVmFyaW50MzIoc2l6ZSkKKyAgZW5kCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDp3cml0ZVZhcmludDMyKGkzMikKKyAgLS0gU2hvdWxkIGJlIHV0Zi04CisgIGxvY2FsIHN0ciA9IGxpYmx1YWJwYWNrLnRvVmFyaW50MzIoaTMyKQorICBzZWxmLnRyYW5zOndyaXRlKHN0cikKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOndyaXRlVmFyaW50NjQoaTY0KQorICAtLSBTaG91bGQgYmUgdXRmLTgKKyAgbG9jYWwgc3RyID0gbGlibHVhYnBhY2sudG9WYXJpbnQ2NChpNjQpCisgIHNlbGYudHJhbnM6d3JpdGUoc3RyKQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6cmVhZE1lc3NhZ2VCZWdpbigpCisgIGxvY2FsIHByb3RvY29sSWQgPSBzZWxmOnJlYWRTaWduQnl0ZSgpCisgIGlmIHByb3RvY29sSWQgfj0gc2VsZi5DT01QQUNUX1BST1RPQ09MX0lEIHRoZW4KKyAgICB0ZXJyb3IoVFByb3RvY29sRXhjZXB0aW9uOm5ld3sKKyAgICAgIG1lc3NhZ2UgPSAiRXhwZWN0ZWQgcHJvdG9jb2wgaWQgIiAuLiBzZWxmLkNPTVBBQ1RfUFJPVE9DT0xfSUQgLi4gIiBidXQgZ290ICIgLi4gcHJvdG9jb2xJZH0pCisgIGVuZAorICBsb2NhbCB2ZXJzaW9uQW5kVHlwZSA9IHNlbGY6cmVhZFNpZ25CeXRlKCkKKyAgbG9jYWwgdmVyc2lvbiA9IGxpYmx1YWJpdHdpc2UuYmFuZCh2ZXJzaW9uQW5kVHlwZSwgc2VsZi5DT01QQUNUX1ZFUlNJT05fTUFTSykKKyAgbG9jYWwgdHR5cGUgPSBsaWJsdWFiaXR3aXNlLmJhbmQobGlibHVhYml0d2lzZS5zaGlmdHIodmVyc2lvbkFuZFR5cGUsCisgICAgc2VsZi5DT01QQUNUX1RZUEVfU0hJRlRfQU1PVU5UKSwgc2VsZi5DT01QQUNUX1RZUEVfQklUUykKKyAgaWYgdmVyc2lvbiB+PSBzZWxmLkNPTVBBQ1RfVkVSU0lPTiB0aGVuCisgICAgdGVycm9yKFRQcm90b2NvbEV4Y2VwdGlvbjpuZXd7CisgICAgICBtZXNzYWdlID0gIkV4cGVjdGVkIHZlcnNpb24gIiAuLiBzZWxmLkNPTVBBQ1RfVkVSU0lPTiAuLiAiIGJ1dCBnb3QgIiAuLiB2ZXJzaW9ufSkKKyAgZW5kCisgIGxvY2FsIHNlcWlkID0gc2VsZjpyZWFkVmFyaW50MzIoKQorICBsb2NhbCBuYW1lID0gc2VsZjpyZWFkU3RyaW5nKCkKKyAgcmV0dXJuIG5hbWUsIHR0eXBlLCBzZXFpZAorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6cmVhZE1lc3NhZ2VFbmQoKQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6cmVhZFN0cnVjdEJlZ2luKCkKKyAgc2VsZi5sYXN0RmllbGRbc2VsZi5sYXN0RmllbGRJbmRleF0gPSBzZWxmLmxhc3RGaWVsZElkCisgIHNlbGYubGFzdEZpZWxkSW5kZXggPSBzZWxmLmxhc3RGaWVsZEluZGV4ICsgMQorICBzZWxmLmxhc3RGaWVsZElkID0gMAorICByZXR1cm4gbmlsCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDpyZWFkU3RydWN0RW5kKCkKKyAgc2VsZi5sYXN0RmllbGRJbmRleCA9IHNlbGYubGFzdEZpZWxkSW5kZXggLSAxCisgIHNlbGYubGFzdEZpZWxkSWQgPSBzZWxmLmxhc3RGaWVsZFtzZWxmLmxhc3RGaWVsZEluZGV4XQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6cmVhZEZpZWxkQmVnaW4oKQorICBsb2NhbCBmaWVsZF9hbmRfdHR5cGUgPSBzZWxmOnJlYWRTaWduQnl0ZSgpCisgIGxvY2FsIHR0eXBlID0gc2VsZjpnZXRUVHlwZShmaWVsZF9hbmRfdHR5cGUpCisgIGlmIHR0eXBlID09IFRUeXBlLlNUT1AgdGhlbgorICAgIHJldHVybiBuaWwsIHR0eXBlLCAwCisgIGVuZAorICAtLSBtYXNrIG9mZiB0aGUgNCBNU0Igb2YgdGhlIHR5cGUgaGVhZGVyLiBpdCBjb3VsZCBjb250YWluIGEgZmllbGQgaWQgZGVsdGEuCisgIGxvY2FsIG1vZGlmaWVyID0gbGlibHVhYml0d2lzZS5zaGlmdHIobGlibHVhYml0d2lzZS5iYW5kKGZpZWxkX2FuZF90dHlwZSwgMHhmMCksIDQpCisgIGxvY2FsIGlkID0gMAorICBpZiBtb2RpZmllciA9PSAwIHRoZW4KKyAgICBpZCA9IHNlbGY6cmVhZEkxNigpCisgIGVsc2UKKyAgICBpZCA9IHNlbGYubGFzdEZpZWxkSWQgKyBtb2RpZmllcgorICBlbmQKKyAgaWYgdHR5cGUgPT0gVFR5cGUuQk9PTCB0aGVuCisgICAgYm9vbFZhbHVlID0gbGlibHVhYml0d2lzZS5iYW5kKGZpZWxkX2FuZF90dHlwZSwgMHgwZikgPT0gVENvbXBhY3RUeXBlLkNPTVBBQ1RfQk9PTEVBTl9UUlVFCisgICAgYm9vbFZhbHVlSXNOb3ROdWxsID0gdHJ1ZQorICBlbmQKKyAgc2VsZi5sYXN0RmllbGRJZCA9IGlkCisgIHJldHVybiBuaWwsIHR0eXBlLCBpZAorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6cmVhZEZpZWxkRW5kKCkKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOnJlYWRNYXBCZWdpbigpCisgIGxvY2FsIHNpemUgPSBzZWxmOnJlYWRWYXJpbnQzMigpCisgIGlmIHNpemUgPCAwIHRoZW4KKyAgICByZXR1cm4gbmlsLG5pbCxuaWwKKyAgZW5kCisgIGxvY2FsIGt2dHlwZSA9IHNlbGY6cmVhZFNpZ25CeXRlKCkKKyAgbG9jYWwga3R5cGUgPSBzZWxmOmdldFRUeXBlKGxpYmx1YWJpdHdpc2Uuc2hpZnRyKGt2dHlwZSwgNCkpCisgIGxvY2FsIHZ0eXBlID0gc2VsZjpnZXRUVHlwZShrdnR5cGUpCisgIHJldHVybiBrdHlwZSwgdnR5cGUsIHNpemUKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOnJlYWRNYXBFbmQoKQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6cmVhZExpc3RCZWdpbigpCisgIGxvY2FsIHNpemVfYW5kX3R5cGUgPSBzZWxmOnJlYWRTaWduQnl0ZSgpCisgIGxvY2FsIHNpemUgPSBsaWJsdWFiaXR3aXNlLmJhbmQobGlibHVhYml0d2lzZS5zaGlmdHIoc2l6ZV9hbmRfdHlwZSwgNCksIDB4MGYpCisgIGlmIHNpemUgPT0gMTUgdGhlbgorICAgIHNpemUgPSBzZWxmOnJlYWRWYXJpbnQzMigpCisgIGVuZAorICBpZiBzaXplIDwgMCB0aGVuCisgICAgcmV0dXJuIG5pbCxuaWwKKyAgZW5kCisgIGxvY2FsIGV0eXBlID0gc2VsZjpnZXRUVHlwZShsaWJsdWFiaXR3aXNlLmJhbmQoc2l6ZV9hbmRfdHlwZSwgMHgwZikpCisgIHJldHVybiBldHlwZSwgc2l6ZQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6cmVhZExpc3RFbmQoKQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6cmVhZFNldEJlZ2luKCkKKyAgcmV0dXJuIHNlbGY6cmVhZExpc3RCZWdpbigpCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDpyZWFkU2V0RW5kKCkKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOnJlYWRCb29sKCkKKyAgaWYgYm9vbFZhbHVlSXNOb3ROdWxsIHRoZW4KKyAgICBib29sVmFsdWVJc05vdE51bGwgPSB0cnVlCisgICAgcmV0dXJuIGJvb2xWYWx1ZQorICBlbmQKKyAgbG9jYWwgdmFsID0gc2VsZjpyZWFkU2lnbkJ5dGUoKQorICBpZiB2YWwgPT0gVENvbXBhY3RUeXBlLkNPTVBBQ1RfQk9PTEVBTl9UUlVFIHRoZW4KKyAgICByZXR1cm4gdHJ1ZQorICBlbmQKKyAgcmV0dXJuIGZhbHNlCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDpyZWFkQnl0ZSgpCisgIGxvY2FsIGJ1ZmYgPSBzZWxmLnRyYW5zOnJlYWRBbGwoMSkKKyAgbG9jYWwgdmFsID0gbGlibHVhYnBhY2suYnVucGFjaygnYycsIGJ1ZmYpCisgIHJldHVybiB2YWwKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOnJlYWRTaWduQnl0ZSgpCisgIGxvY2FsIGJ1ZmYgPSBzZWxmLnRyYW5zOnJlYWRBbGwoMSkKKyAgbG9jYWwgdmFsID0gbGlibHVhYnBhY2suYnVucGFjaygnQycsIGJ1ZmYpCisgIHJldHVybiB2YWwKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOnJlYWRJMTYoKQorICByZXR1cm4gc2VsZjpyZWFkSTMyKCkKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOnJlYWRJMzIoKQorICBsb2NhbCB2ID0gc2VsZjpyZWFkVmFyaW50MzIoKQorICBsb2NhbCB2YWx1ZSA9IGxpYmx1YWJwYWNrLnppZ3phZ1RvSTMyKHYpCisgIHJldHVybiB2YWx1ZQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6cmVhZEk2NCgpCisgIGxvY2FsIHZhbHVlID0gc2VsZjpyZWFkVmFyaW50NjQoKQorICByZXR1cm4gdmFsdWUKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOnJlYWREb3VibGUoKQorICBsb2NhbCBidWZmID0gc2VsZi50cmFuczpyZWFkQWxsKDgpCisgIGxvY2FsIHZhbCA9IGxpYmx1YWJwYWNrLmJ1bnBhY2soJ2QnLCBidWZmKQorICByZXR1cm4gdmFsCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDpyZWFkU3RyaW5nKCkKKyAgcmV0dXJuIHNlbGY6cmVhZEJpbmFyeSgpCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDpyZWFkQmluYXJ5KCkKKyAgbG9jYWwgc2l6ZSA9IHNlbGY6cmVhZFZhcmludDMyKCkKKyAgaWYgc2l6ZSA8PSAwIHRoZW4KKyAgICByZXR1cm4gIiIKKyAgZW5kCisgIHJldHVybiBzZWxmLnRyYW5zOnJlYWRBbGwoc2l6ZSkKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOnJlYWRWYXJpbnQzMigpCisgIGxvY2FsIHNoaWZ0bCA9IDAKKyAgbG9jYWwgcmVzdWx0ID0gMAorICB3aGlsZSB0cnVlIGRvCisgICAgYiA9IHNlbGY6cmVhZEJ5dGUoKQorICAgIHJlc3VsdCA9IGxpYmx1YWJpdHdpc2UuYm9yKHJlc3VsdCwKKyAgICAgICAgICAgICBsaWJsdWFiaXR3aXNlLnNoaWZ0bChsaWJsdWFiaXR3aXNlLmJhbmQoYiwgMHg3ZiksIHNoaWZ0bCkpCisgICAgaWYgbGlibHVhYml0d2lzZS5iYW5kKGIsIDB4ODApIH49IDB4ODAgdGhlbgorICAgICAgYnJlYWsKKyAgICBlbmQKKyAgICBzaGlmdGwgPSBzaGlmdGwgKyA3CisgIGVuZAorICByZXR1cm4gcmVzdWx0CitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDpyZWFkVmFyaW50NjQoKQorICBsb2NhbCByZXN1bHQgPSBsaWJsdWFsb25nbnVtYmVyLm5ldworICBsb2NhbCBkYXRhID0gcmVzdWx0KDApCisgIGxvY2FsIHNoaWZ0bCA9IDAKKyAgd2hpbGUgdHJ1ZSBkbworICAgIGIgPSBzZWxmOnJlYWRCeXRlKCkKKyAgICBlbmRGbGFnLCBkYXRhID0gbGlibHVhYnBhY2suZnJvbVZhcmludDY0KGIsIHNoaWZ0bCwgZGF0YSkKKyAgICBzaGlmdGwgPSBzaGlmdGwgKyA3CisgICAgaWYgZW5kRmxhZyA9PSAwIHRoZW4KKyAgICAgIGJyZWFrCisgICAgZW5kCisgIGVuZAorICByZXR1cm4gZGF0YQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6Z2V0VFR5cGUoY3R5cGUpCisgIHJldHVybiBDb21wYWN0VHlwZVRvVFR5cGVbbGlibHVhYml0d2lzZS5iYW5kKGN0eXBlLCAweDBmKV0KK2VuZAorCitUQ29tcGFjdFByb3RvY29sRmFjdG9yeSA9IFRQcm90b2NvbEZhY3Rvcnk6bmV3eworICBfX3R5cGUgPSAnVENvbXBhY3RQcm90b2NvbEZhY3RvcnknLAorfQorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sRmFjdG9yeTpnZXRQcm90b2NvbCh0cmFucykKKyAgLS0gVE9ETyBFbmZvcmNlIHRoYXQgdGhpcyBtdXN0IGJlIGEgdHJhbnNwb3J0IGNsYXNzIChpZSBub3QgYSBib29sKQorICBpZiBub3QgdHJhbnMgdGhlbgorICAgIHRlcnJvcihUUHJvdG9jb2xFeGNlcHRpb246bmV3eworICAgICAgbWVzc2FnZSA9ICdNdXN0IHN1cHBseSBhIHRyYW5zcG9ydCB0byAnIC4uIHR0eXBlKHNlbGYpCisgICAgfSkKKyAgZW5kCisgIHJldHVybiBUQ29tcGFjdFByb3RvY29sOm5ld3sKKyAgICB0cmFucyA9IHRyYW5zCisgIH0KK2VuZApkaWZmIC0tZ2l0IGEvbGliL2x1YS9URnJhbWVkVHJhbnNwb3J0Lmx1YSBiL2xpYi9sdWEvVEZyYW1lZFRyYW5zcG9ydC5sdWEKaW5kZXggODRhZTNlYy4uNzY4ZTJkOSAxMDA2NDQKLS0tIGEvbGliL2x1YS9URnJhbWVkVHJhbnNwb3J0Lmx1YQorKysgYi9saWIvbHVhL1RGcmFtZWRUcmFuc3BvcnQubHVhCkBAIC0zOCw3ICszOCw3IEBACiAgICAgZXJyb3IoJ1lvdSBtdXN0IHByb3ZpZGUgJyAuLiB0dHlwZShzZWxmKSAuLiAnIHdpdGggYSB0cmFucycpCiAgIGVuZAogCi0gIHJldHVybiBUVHJhbnNwb3J0QmFzZTpuZXcob2JqKQorICByZXR1cm4gVFRyYW5zcG9ydEJhc2UubmV3KHNlbGYsIG9iaikKIGVuZAogCiBmdW5jdGlvbiBURnJhbWVkVHJhbnNwb3J0OmlzT3BlbigpCkBAIC02OSw3ICs2OSw3IEBACiAgIGVuZAogCiAgIGxvY2FsIHZhbCA9IHN0cmluZy5zdWIoc2VsZi5yQnVmLCAwLCBsZW4pCi0gIHNlbGYuckJ1ZiA9IHN0cmluZy5zdWIoc2VsZi5yQnVmLCBsZW4pCisgIHNlbGYuckJ1ZiA9IHN0cmluZy5zdWIoc2VsZi5yQnVmLCBsZW4rMSkKICAgcmV0dXJuIHZhbAogZW5kCiAKQEAgLTc5LDkgKzc5LDYgQEAKICAgc2VsZi5yQnVmID0gc2VsZi50cmFuczpyZWFkQWxsKGZyYW1lX2xlbikKIGVuZAogCi1mdW5jdGlvbiBURnJhbWVkVHJhbnNwb3J0OnJlYWRBbGwobGVuKQotICByZXR1cm4gc2VsZi50cmFuczpyZWFkQWxsKGxlbikKLWVuZAogCiBmdW5jdGlvbiBURnJhbWVkVHJhbnNwb3J0OndyaXRlKGJ1ZiwgbGVuKQogICBpZiBzZWxmLmRvV3JpdGUgPT0gZmFsc2UgdGhlbgpAQCAtOTEsNyArODgsNyBAQAogICBpZiBsZW4gYW5kIGxlbiA8IHN0cmluZy5sZW4oYnVmKSB0aGVuCiAgICAgYnVmID0gc3RyaW5nLnN1YihidWYsIDAsIGxlbikKICAgZW5kCi0gIHNlbGYud0J1ZiA9IHNlbGYud0J1ZiArIGJ1ZgorICBzZWxmLndCdWYgPSBzZWxmLndCdWYgLi4gYnVmCiBlbmQKIAogZnVuY3Rpb24gVEZyYW1lZFRyYW5zcG9ydDpmbHVzaCgpCkBAIC0xMDIsNiArOTksOCBAQAogICAtLSBJZiB0aGUgd3JpdGUgZmFpbHMgd2Ugc3RpbGwgd2FudCB3QnVmIHRvIGJlIGNsZWFyCiAgIGxvY2FsIHRtcCA9IHNlbGYud0J1ZgogICBzZWxmLndCdWYgPSAnJworICBsb2NhbCBmcmFtZV9sZW5fYnVmID0gbGlibHVhYnBhY2suYnBhY2soImkiLCBzdHJpbmcubGVuKHRtcCkpCisgIHRtcCA9IGZyYW1lX2xlbl9idWYgLi4gdG1wCiAgIHNlbGYudHJhbnM6d3JpdGUodG1wKQogICBzZWxmLnRyYW5zOmZsdXNoKCkKIGVuZApkaWZmIC0tZ2l0IGEvbGliL2x1YS9USHR0cFRyYW5zcG9ydC5sdWEgYi9saWIvbHVhL1RIdHRwVHJhbnNwb3J0Lmx1YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTUxZGI3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2x1YS9USHR0cFRyYW5zcG9ydC5sdWEKQEAgLTAsMCArMSwxODIgQEAKKy0tCistLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCistLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLS0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy0tIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLS0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLS0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLS0gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CistLQorLS0gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy0tCistLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCistLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLS0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCistLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLS0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLS0gdW5kZXIgdGhlIExpY2Vuc2UuCistLQorCityZXF1aXJlICdUVHJhbnNwb3J0JworCitUSHR0cFRyYW5zcG9ydCA9IFRUcmFuc3BvcnRCYXNlOm5ld3sKKyAgX190eXBlID0gJ1RIdHRwVHJhbnNwb3J0JywKKyAgcGF0aCA9ICcvJywKKyAgd0J1ZiA9ICcnLAorICByQnVmID0gJycsCisgIENSTEYgPSAnXHJcbicsCisgIFZFUlNJT04gPSB2ZXJzaW9uLAorICBpc1NlcnZlciA9IHRydWUKK30KKworZnVuY3Rpb24gVEh0dHBUcmFuc3BvcnQ6bmV3KG9iaikKKyAgaWYgdHR5cGUob2JqKSB+PSAndGFibGUnIHRoZW4KKyAgICBlcnJvcih0dHlwZShzZWxmKSAuLiAnbXVzdCBiZSBpbml0aWFsaXplZCB3aXRoIGEgdGFibGUnKQorICBlbmQKKworICAtLSBFbnN1cmUgYSB0cmFuc3BvcnQgaXMgcHJvdmlkZWQKKyAgaWYgbm90IG9iai50cmFucyB0aGVuCisgICAgZXJyb3IoJ1lvdSBtdXN0IHByb3ZpZGUgJyAuLiB0dHlwZShzZWxmKSAuLiAnIHdpdGggYSB0cmFucycpCisgIGVuZAorCisgIHJldHVybiBUVHJhbnNwb3J0QmFzZS5uZXcoc2VsZiwgb2JqKQorZW5kCisKK2Z1bmN0aW9uIFRIdHRwVHJhbnNwb3J0OmlzT3BlbigpCisgIHJldHVybiBzZWxmLnRyYW5zOmlzT3BlbigpCitlbmQKKworZnVuY3Rpb24gVEh0dHBUcmFuc3BvcnQ6b3BlbigpCisgIHJldHVybiBzZWxmLnRyYW5zOm9wZW4oKQorZW5kCisKK2Z1bmN0aW9uIFRIdHRwVHJhbnNwb3J0OmNsb3NlKCkKKyAgcmV0dXJuIHNlbGYudHJhbnM6Y2xvc2UoKQorZW5kCisKK2Z1bmN0aW9uIFRIdHRwVHJhbnNwb3J0OnJlYWRBbGwobGVuKQorICByZXR1cm4gc2VsZjpyZWFkKGxlbikKK2VuZAorCitmdW5jdGlvbiBUSHR0cFRyYW5zcG9ydDpyZWFkKGxlbikKKyAgaWYgc3RyaW5nLmxlbihzZWxmLnJCdWYpID09IDAgdGhlbgorICAgIHNlbGY6X3JlYWRNc2coKQorICBlbmQKKyAgaWYgbGVuID4gc3RyaW5nLmxlbihzZWxmLnJCdWYpIHRoZW4KKyAgICBsb2NhbCB2YWwgPSBzZWxmLnJCdWYKKyAgICBzZWxmLnJCdWYgPSAnJworICAgIHJldHVybiB2YWwKKyAgZW5kCisKKyAgbG9jYWwgdmFsID0gc3RyaW5nLnN1YihzZWxmLnJCdWYsIDAsIGxlbikKKyAgc2VsZi5yQnVmID0gc3RyaW5nLnN1YihzZWxmLnJCdWYsIGxlbisxKQorICByZXR1cm4gdmFsCitlbmQKKworZnVuY3Rpb24gVEh0dHBUcmFuc3BvcnQ6X3JlYWRNc2coKQorICB3aGlsZSB0cnVlIGRvCisgICAgc2VsZi5yQnVmID0gc2VsZi5yQnVmIC4uIHNlbGYudHJhbnM6cmVhZCg0KQorICAgIGlmIHN0cmluZy5maW5kKHNlbGYuckJ1Ziwgc2VsZi5DUkxGIC4uIHNlbGYuQ1JMRikgdGhlbgorICAgICAgYnJlYWsKKyAgICBlbmQKKyAgZW5kCisgIGlmIG5vdCBzZWxmLnJCdWYgdGhlbgorICAgIHNlbGYuckJ1ZiA9ICIiCisgICAgcmV0dXJuCisgIGVuZAorICBzZWxmOmdldExpbmUoKQorICBsb2NhbCBoZWFkZXJzID0gc2VsZjpfcGFyc2VIZWFkZXJzKCkKKyAgaWYgbm90IGhlYWRlcnMgdGhlbgorICAgIHNlbGYuckJ1ZiA9ICIiCisgICAgcmV0dXJuCisgIGVuZAorCisgIGxvY2FsIGxlbmd0aCA9IHRvbnVtYmVyKGhlYWRlcnNbIkNvbnRlbnQtTGVuZ3RoIl0pCisgIGlmIGxlbmd0aCB0aGVuCisgICAgbGVuZ3RoID0gbGVuZ3RoIC0gc3RyaW5nLmxlbihzZWxmLnJCdWYpCisgICAgc2VsZi5yQnVmID0gc2VsZi5yQnVmIC4uIHNlbGYudHJhbnM6cmVhZEFsbChsZW5ndGgpCisgIGVuZAorICBpZiBzZWxmLnJCdWYgPT0gbmlsIHRoZW4KKyAgICBzZWxmLnJCdWYgPSAiIgorICBlbmQKK2VuZAorCitmdW5jdGlvbiBUSHR0cFRyYW5zcG9ydDpnZXRMaW5lKCkKKyAgbG9jYWwgYSxiID0gc3RyaW5nLmZpbmQoc2VsZi5yQnVmLCBzZWxmLkNSTEYpCisgIGxvY2FsIGxpbmUgPSAiIgorICBpZiBhIGFuZCBiIHRoZW4KKyAgICBsaW5lID0gc3RyaW5nLnN1YihzZWxmLnJCdWYsIDAsIGEtMSkKKyAgICBzZWxmLnJCdWYgPSBzdHJpbmcuc3ViKHNlbGYuckJ1ZiwgYisxKQorICBlbmQKKyAgcmV0dXJuIGxpbmUKK2VuZAorCitmdW5jdGlvbiBUSHR0cFRyYW5zcG9ydDpfcGFyc2VIZWFkZXJzKCkKKyAgbG9jYWwgaGVhZGVycyA9IHt9CisKKyAgcmVwZWF0CisgICAgbG9jYWwgbGluZSA9IHNlbGY6Z2V0TGluZSgpCisgICAgZm9yIGtleSwgdmFsIGluIHN0cmluZy5nbWF0Y2gobGluZSwgIihbJXclLV0rKSVzKjolcyooLispIikgZG8KKyAgICAgIGlmIGhlYWRlcnNba2V5XSB0aGVuCisgICAgICAgIGxvY2FsIGRlbGltaXRlciA9ICIsICIKKyAgICAgICAgaWYga2V5ID09ICJTZXQtQ29va2llIiB0aGVuCisgICAgICAgICAgZGVsaW1pdGVyID0gIjsgIgorICAgICAgICBlbmQKKyAgICAgICAgaGVhZGVyc1trZXldID0gaGVhZGVyc1trZXldIC4uIGRlbGltaXRlciAuLiB0b3N0cmluZyh2YWwpCisgICAgICBlbHNlCisgICAgICAgIGhlYWRlcnNba2V5XSA9IHRvc3RyaW5nKHZhbCkKKyAgICAgIGVuZAorICAgIGVuZAorICB1bnRpbCBzdHJpbmcuZmluZChsaW5lLCAiXiVzKiQiKQorCisgIHJldHVybiBoZWFkZXJzCitlbmQKKworZnVuY3Rpb24gVEh0dHBUcmFuc3BvcnQ6d3JpdGUoYnVmLCBsZW4pCisgIGlmIGxlbiBhbmQgbGVuIDwgc3RyaW5nLmxlbihidWYpIHRoZW4KKyAgICBidWYgPSBzdHJpbmcuc3ViKGJ1ZiwgMCwgbGVuKQorICBlbmQKKyAgc2VsZi53QnVmID0gc2VsZi53QnVmIC4uIGJ1ZgorZW5kCisKK2Z1bmN0aW9uIFRIdHRwVHJhbnNwb3J0OndyaXRlSHR0cEhlYWRlcihjb250ZW50X2xlbikKKyAgaWYgc2VsZi5pc1NlcnZlciB0aGVuCisgICAgbG9jYWwgaGVhZGVyID0gICJIVFRQLzEuMSAyMDAgT0siIC4uIHNlbGYuQ1JMRgorICAgICAgLi4gIlNlcnZlcjogVGhyaWZ0LyIgLi4gc2VsZi5WRVJTSU9OIC4uIHNlbGYuQ1JMRgorICAgICAgLi4gIkFjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpbjogKiIgLi4gc2VsZi5DUkxGCisgICAgICAuLiAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LXRocmlmdCIgLi4gc2VsZi5DUkxGCisgICAgICAuLiAiQ29udGVudC1MZW5ndGg6ICIgLi4gY29udGVudF9sZW4gLi4gc2VsZi5DUkxGCisgICAgICAuLiAiQ29ubmVjdGlvbjogS2VlcC1BbGl2ZSIgLi4gc2VsZi5DUkxGIC4uIHNlbGYuQ1JMRgorICAgIHNlbGYudHJhbnM6d3JpdGUoaGVhZGVyKQorICBlbHNlCisgICAgbG9jYWwgaGVhZGVyID0gIlBPU1QgIiAuLiBzZWxmLnBhdGggLi4gIiBIVFRQLzEuMSIgLi4gc2VsZi5DUkxGCisgICAgICAuLiAiSG9zdDogIiAuLiBzZWxmLnRyYW5zLmhvc3QgLi4gc2VsZi5DUkxGCisgICAgICAuLiAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LXRocmlmdCIgLi4gc2VsZi5DUkxGCisgICAgICAuLiAiQ29udGVudC1MZW5ndGg6ICIgLi4gY29udGVudF9sZW4gLi4gc2VsZi5DUkxGCisgICAgICAuLiAiQWNjZXB0OiBhcHBsaWNhdGlvbi94LXRocmlmdCAiIC4uIHNlbGYuQ1JMRgorICAgICAgLi4gIlVzZXItQWdlbnQ6IFRocmlmdC8iIC4uIHNlbGYuVkVSU0lPTiAuLiAiIChMdWEvVEh0dHBDbGllbnQpIgorICAgICAgLi4gc2VsZi5DUkxGIC4uIHNlbGYuQ1JMRgorICAgIHNlbGYudHJhbnM6d3JpdGUoaGVhZGVyKQorICBlbmQKK2VuZAorCitmdW5jdGlvbiBUSHR0cFRyYW5zcG9ydDpmbHVzaCgpCisgIC0tIElmIHRoZSB3cml0ZSBmYWlscyB3ZSBzdGlsbCB3YW50IHdCdWYgdG8gYmUgY2xlYXIKKyAgbG9jYWwgdG1wID0gc2VsZi53QnVmCisgIHNlbGYud0J1ZiA9ICcnCisgIHNlbGY6d3JpdGVIdHRwSGVhZGVyKHN0cmluZy5sZW4odG1wKSkKKyAgc2VsZi50cmFuczp3cml0ZSh0bXApCisgIHNlbGYudHJhbnM6Zmx1c2goKQorZW5kCisKK1RIdHRwVHJhbnNwb3J0RmFjdG9yeSA9IFRUcmFuc3BvcnRGYWN0b3J5QmFzZTpuZXd7CisgIF9fdHlwZSA9ICdUSHR0cFRyYW5zcG9ydEZhY3RvcnknCit9CitmdW5jdGlvbiBUSHR0cFRyYW5zcG9ydEZhY3Rvcnk6Z2V0VHJhbnNwb3J0KHRyYW5zKQorICBpZiBub3QgdHJhbnMgdGhlbgorICAgIHRlcnJvcihUUHJvdG9jb2xFeGNlcHRpb246bmV3eworICAgICAgbWVzc2FnZSA9ICdNdXN0IHN1cHBseSBhIHRyYW5zcG9ydCB0byAnIC4uIHR0eXBlKHNlbGYpCisgICAgfSkKKyAgZW5kCisgIHJldHVybiBUSHR0cFRyYW5zcG9ydDpuZXd7dHJhbnMgPSB0cmFuc30KK2VuZApkaWZmIC0tZ2l0IGEvbGliL2x1YS9USnNvblByb3RvY29sLmx1YSBiL2xpYi9sdWEvVEpzb25Qcm90b2NvbC5sdWEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGIwOGVlYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9sdWEvVEpzb25Qcm90b2NvbC5sdWEKQEAgLTAsMCArMSw3MjcgQEAKKy0tCistLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCistLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLS0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy0tIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLS0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLS0gIkxpY2Vuc2UiKSwgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLS0gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CistLQorLS0gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy0tCistLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCistLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLS0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCistLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLS0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLS0gdW5kZXIgdGhlIExpY2Vuc2UuCistLQorCityZXF1aXJlICdUUHJvdG9jb2wnCityZXF1aXJlICdsaWJsdWFicGFjaycKK3JlcXVpcmUgJ2xpYmx1YWJpdHdpc2UnCisKK1RKU09OUHJvdG9jb2wgPSBfX1RPYmplY3QubmV3KFRQcm90b2NvbEJhc2UsIHsKKyAgX190eXBlID0gJ1RKU09OUHJvdG9jb2wnLAorICBUSFJJRlRfSlNPTl9QUk9UT0NPTF9WRVJTSU9OID0gMSwKKyAganNvbkNvbnRleHQgPSB7fSwKKyAganNvbkNvbnRleHRWYWwgPSB7Zmlyc3QgPSB0cnVlLCBjb2xvbiA9IHRydWUsIHR0eXBlID0gMiwgbnVsbCA9IHRydWV9LAorICBqc29uQ29udGV4dEluZGV4ID0gMSwKKyAgaGFzUmVhZEJ5dGUgPSAiIgorfSkKKworVFR5cGVUb1N0cmluZyA9IHt9CitUVHlwZVRvU3RyaW5nW1RUeXBlLkJPT0xdICAgPSAidGYiCitUVHlwZVRvU3RyaW5nW1RUeXBlLkJZVEVdICAgPSAiaTgiCitUVHlwZVRvU3RyaW5nW1RUeXBlLkkxNl0gICAgPSAiaTE2IgorVFR5cGVUb1N0cmluZ1tUVHlwZS5JMzJdICAgID0gImkzMiIKK1RUeXBlVG9TdHJpbmdbVFR5cGUuSTY0XSAgICA9ICJpNjQiCitUVHlwZVRvU3RyaW5nW1RUeXBlLkRPVUJMRV0gPSAiZGJsIgorVFR5cGVUb1N0cmluZ1tUVHlwZS5TVFJJTkddID0gInN0ciIKK1RUeXBlVG9TdHJpbmdbVFR5cGUuU1RSVUNUXSA9ICJyZWMiCitUVHlwZVRvU3RyaW5nW1RUeXBlLkxJU1RdICAgPSAibHN0IgorVFR5cGVUb1N0cmluZ1tUVHlwZS5TRVRdICAgID0gInNldCIKK1RUeXBlVG9TdHJpbmdbVFR5cGUuTUFQXSAgICA9ICJtYXAiCisKK1N0cmluZ1RvVFR5cGUgPSB7CisgIHRmICA9IFRUeXBlLkJPT0wsCisgIGk4ICA9IFRUeXBlLkJZVEUsCisgIGkxNiA9IFRUeXBlLkkxNiwKKyAgaTMyID0gVFR5cGUuSTMyLAorICBpNjQgPSBUVHlwZS5JNjQsCisgIGRibCA9IFRUeXBlLkRPVUJMRSwKKyAgc3RyID0gVFR5cGUuU1RSSU5HLAorICByZWMgPSBUVHlwZS5TVFJVQ1QsCisgIG1hcCA9IFRUeXBlLk1BUCwKKyAgc2V0ID0gVFR5cGUuU0VULAorICBsc3QgPSBUVHlwZS5MSVNUCit9CisKK0pTT05Ob2RlID0geworICBPYmplY3RCZWdpbiA9ICd7JywKKyAgT2JqZWN0RW5kID0gJ30nLAorICBBcnJheUJlZ2luID0gJ1snLAorICBBcnJheUVuZCA9ICddJywKKyAgUGFpclNlcGFyYXRvciA9ICc6JywKKyAgRWxlbVNlcGFyYXRvciA9ICcsJywKKyAgQmFja3NsYXNoID0gJ1xcJywKKyAgU3RyaW5nRGVsaW1pdGVyID0gJyInLAorICBaZXJvQ2hhciA9ICcwJywKKyAgRXNjYXBlQ2hhciA9ICd1JywKKyAgTmFuID0gJ05hTicsCisgIEluZmluaXR5ID0gJ0luZmluaXR5JywKKyAgTmVnYXRpdmVJbmZpbml0eSA9ICctSW5maW5pdHknLAorICBFc2NhcGVDaGFycyA9ICJcIlxcYmZucnQiLAorICBFc2NhcGVQcmVmaXggPSAiXFx1MDAiCit9CisKK0VzY2FwZUNoYXJWYWxzID0geworICAnIicsICdcXCcsICdcYicsICdcZicsICdcbicsICdccicsICdcdCcKK30KKworSlNPTkNoYXJUYWJsZSA9IHsKKyAgLS0wICAgMSAgIDIgICAzICAgNCAgIDUgICA2ICAgNyAgIDggICA5ICAgQSAgIEIgICBDICAgRCAgIEUgICBGCisgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIDk4LDExNiwxMTAsICAwLDEwMiwxMTQsICAwLCAgMCwKKyAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgIDEsICAxLDM0LCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKK30KKworLS0gY2hhcmFjdGVyIHRhYmxlIHN0cmluZworbG9jYWwgYj0nQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLycKKworLS0gZW5jb2RpbmcKK2Z1bmN0aW9uIGJhc2U2NF9lbmNvZGUoZGF0YSkKKyAgICByZXR1cm4gKChkYXRhOmdzdWIoJy4nLCBmdW5jdGlvbih4KSAKKyAgICAgICAgbG9jYWwgcixiPScnLHg6Ynl0ZSgpCisgICAgICAgIGZvciBpPTgsMSwtMSBkbyByPXIuLihiJTJeaS1iJTJeKGktMSk+MCBhbmQgJzEnIG9yICcwJykgZW5kCisgICAgICAgIHJldHVybiByOworICAgIGVuZCkuLicwMDAwJyk6Z3N1YignJWQlZCVkPyVkPyVkPyVkPycsIGZ1bmN0aW9uKHgpCisgICAgICAgIGlmICgjeCA8IDYpIHRoZW4gcmV0dXJuICcnIGVuZAorICAgICAgICBsb2NhbCBjPTAKKyAgICAgICAgZm9yIGk9MSw2IGRvIGM9YysoeDpzdWIoaSxpKT09JzEnIGFuZCAyXig2LWkpIG9yIDApIGVuZAorICAgICAgICByZXR1cm4gYjpzdWIoYysxLGMrMSkKKyAgICBlbmQpLi4oeyAnJywgJz09JywgJz0nIH0pWyNkYXRhJTMrMV0pCitlbmQKKworLS0gZGVjb2RpbmcKK2Z1bmN0aW9uIGJhc2U2NF9kZWNvZGUoZGF0YSkKKyAgICBkYXRhID0gc3RyaW5nLmdzdWIoZGF0YSwgJ1teJy4uYi4uJz1dJywgJycpCisgICAgcmV0dXJuIChkYXRhOmdzdWIoJy4nLCBmdW5jdGlvbih4KQorICAgICAgICBpZiAoeCA9PSAnPScpIHRoZW4gcmV0dXJuICcnIGVuZAorICAgICAgICBsb2NhbCByLGY9JycsKGI6ZmluZCh4KS0xKQorICAgICAgICBmb3IgaT02LDEsLTEgZG8gcj1yLi4oZiUyXmktZiUyXihpLTEpPjAgYW5kICcxJyBvciAnMCcpIGVuZAorICAgICAgICByZXR1cm4gcjsKKyAgICBlbmQpOmdzdWIoJyVkJWQlZD8lZD8lZD8lZD8lZD8lZD8nLCBmdW5jdGlvbih4KQorICAgICAgICBpZiAoI3ggfj0gOCkgdGhlbiByZXR1cm4gJycgZW5kCisgICAgICAgIGxvY2FsIGM9MAorICAgICAgICBmb3IgaT0xLDggZG8gYz1jKyh4OnN1YihpLGkpPT0nMScgYW5kIDJeKDgtaSkgb3IgMCkgZW5kCisgICAgICAgIHJldHVybiBzdHJpbmcuY2hhcihjKQorICAgIGVuZCkpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZXNldENvbnRleHQoKQorICBzZWxmLmpzb25Db250ZXh0ID0ge30KKyAgc2VsZi5qc29uQ29udGV4dFZhbCA9IHtmaXJzdCA9IHRydWUsIGNvbG9uID0gdHJ1ZSwgdHR5cGUgPSAyLCBudWxsID0gdHJ1ZX0KKyAgc2VsZi5qc29uQ29udGV4dEluZGV4ID0gMQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6Y29udGV4dFB1c2goY29udGV4dCkKKyAgc2VsZi5qc29uQ29udGV4dEluZGV4ID0gc2VsZi5qc29uQ29udGV4dEluZGV4ICsgMQorICBzZWxmLmpzb25Db250ZXh0W3NlbGYuanNvbkNvbnRleHRJbmRleF0gPSBzZWxmLmpzb25Db250ZXh0VmFsCisgIHNlbGYuanNvbkNvbnRleHRWYWwgPSBjb250ZXh0CitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpjb250ZXh0UG9wKCkKKyAgc2VsZi5qc29uQ29udGV4dFZhbCA9IHNlbGYuanNvbkNvbnRleHRbc2VsZi5qc29uQ29udGV4dEluZGV4XQorICBzZWxmLmpzb25Db250ZXh0SW5kZXggPSBzZWxmLmpzb25Db250ZXh0SW5kZXggLSAxCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDplc2NhcGVOdW0oKQorICBpZiBzZWxmLmpzb25Db250ZXh0VmFsLnR0eXBlID09IDEgdGhlbgorICAgIHJldHVybiBzZWxmLmpzb25Db250ZXh0VmFsLmNvbG9uCisgIGVsc2UKKyAgICByZXR1cm4gZmFsc2UKKyAgZW5kCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDp3cml0ZUVsZW1TZXBhcmF0b3IoKQorICBpZiBzZWxmLmpzb25Db250ZXh0VmFsLm51bGwgdGhlbgorICAgIHJldHVybgorICBlbmQKKyAgaWYgc2VsZi5qc29uQ29udGV4dFZhbC5maXJzdCB0aGVuCisgICAgc2VsZi5qc29uQ29udGV4dFZhbC5maXJzdCA9IGZhbHNlCisgIGVsc2UKKyAgICBpZiBzZWxmLmpzb25Db250ZXh0VmFsLnR0eXBlID09IDEgdGhlbgorICAgICAgaWYgc2VsZi5qc29uQ29udGV4dFZhbC5jb2xvbiB0aGVuCisgICAgICAgIHNlbGYudHJhbnM6d3JpdGUoSlNPTk5vZGUuUGFpclNlcGFyYXRvcikKKyAgICAgICAgc2VsZi5qc29uQ29udGV4dFZhbC5jb2xvbiA9IGZhbHNlCisgICAgICBlbHNlCisgICAgICAgIHNlbGYudHJhbnM6d3JpdGUoSlNPTk5vZGUuRWxlbVNlcGFyYXRvcikKKyAgICAgICAgc2VsZi5qc29uQ29udGV4dFZhbC5jb2xvbiA9IHRydWUKKyAgICAgIGVuZAorICAgIGVsc2UKKyAgICAgIHNlbGYudHJhbnM6d3JpdGUoSlNPTk5vZGUuRWxlbVNlcGFyYXRvcikKKyAgICBlbmQKKyAgZW5kCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpoZXhDaGFyKHZhbCkKKyAgdmFsID0gbGlibHVhYml0d2lzZS5iYW5kKHZhbCwgMHgwZikKKyAgaWYgdmFsIDwgMTAgdGhlbgorICAgIHJldHVybiB2YWwgKyA0OAorICBlbHNlCisgICAgcmV0dXJuIHZhbCArIDg3CisgIGVuZAorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6d3JpdGVKU09ORXNjYXBlQ2hhcihjaCkKKyAgc2VsZi50cmFuczp3cml0ZShKU09OTm9kZS5Fc2NhcGVQcmVmaXgpCisgIGxvY2FsIG91dENoID0gaGV4Q2hhcihsaWJsdWFiaXR3aXNlLnNoaWZ0cihjaCwgNCkpCisgIGxvY2FsIGJ1ZmYgPSBsaWJsdWFicGFjay5icGFjaygnYycsIG91dENoKQorICBzZWxmLnRyYW5zOndyaXRlKGJ1ZmYpCisgIG91dENoID0gaGV4Q2hhcihjaCkKKyAgYnVmZiA9IGxpYmx1YWJwYWNrLmJwYWNrKCdjJywgb3V0Q2gpCisgIHNlbGYudHJhbnM6d3JpdGUoYnVmZikKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOndyaXRlSlNPTkNoYXIoYnl0ZSkKKyAgY2ggPSBzdHJpbmcuYnl0ZShieXRlKQorICBpZiBjaCA+PSAweDMwIHRoZW4KKyAgICBpZiBjaCA9PSBKU09OTm9kZS5CYWNrc2xhc2ggdGhlbgorICAgICAgc2VsZi50cmFuczp3cml0ZShKU09OTm9kZS5CYWNrc2xhc2gpCisgICAgICBzZWxmLnRyYW5zOndyaXRlKEpTT05Ob2RlLkJhY2tzbGFzaCkKKyAgICBlbHNlCisgICAgICBzZWxmLnRyYW5zOndyaXRlKGJ5dGUpCisgICAgZW5kCisgIGVsc2UKKyAgICBsb2NhbCBvdXRDaCA9IEpTT05DaGFyVGFibGVbY2grMV0KKyAgICBpZiBvdXRDaCA9PSAxIHRoZW4KKyAgICAgIHNlbGYudHJhbnM6d3JpdGUoYnl0ZSkKKyAgICBlbHNlaWYgb3V0Q2ggPiAxIHRoZW4KKyAgICAgIHNlbGYudHJhbnM6d3JpdGUoSlNPTk5vZGUuQmFja3NsYXNoKQorICAgICAgbG9jYWwgYnVmZiA9IGxpYmx1YWJwYWNrLmJwYWNrKCdjJywgb3V0Q2gpCisgICAgICBzZWxmLnRyYW5zOndyaXRlKGJ1ZmYpCisgICAgZWxzZQorICAgICAgc2VsZjp3cml0ZUpTT05Fc2NhcGVDaGFyKGNoKQorICAgIGVuZAorICBlbmQKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOndyaXRlSlNPTlN0cmluZyhzdHIpCisgIHNlbGY6d3JpdGVFbGVtU2VwYXJhdG9yKCkKKyAgc2VsZi50cmFuczp3cml0ZShKU09OTm9kZS5TdHJpbmdEZWxpbWl0ZXIpCisgIC0tIFRPRE8gZXNjYXBlIHNwZWNpYWwgY2hhcmFjdGVycworICBsb2NhbCBsZW5ndGggPSBzdHJpbmcubGVuKHN0cikKKyAgbG9jYWwgaWkgPSAxCisgIHdoaWxlIGlpIDw9IGxlbmd0aCBkbworICAgIHNlbGY6d3JpdGVKU09OQ2hhcihzdHJpbmcuc3ViKHN0ciwgaWksIGlpKSkKKyAgICBpaSA9IGlpICsgMQorICBlbmQKKyAgc2VsZi50cmFuczp3cml0ZShKU09OTm9kZS5TdHJpbmdEZWxpbWl0ZXIpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDp3cml0ZUpTT05CYXNlNjQoc3RyKQorICBzZWxmOndyaXRlRWxlbVNlcGFyYXRvcigpCisgIHNlbGYudHJhbnM6d3JpdGUoSlNPTk5vZGUuU3RyaW5nRGVsaW1pdGVyKQorICBsb2NhbCBsZW5ndGggPSBzdHJpbmcubGVuKHN0cikKKyAgbG9jYWwgb2Zmc2V0ID0gMQorICB3aGlsZSBsZW5ndGggPj0gMyBkbworICAgIC0tIEVuY29kZSAzIGJ5dGVzIGF0IGEgdGltZQorICAgIGxvY2FsIGJ5dGVzID0gYmFzZTY0X2VuY29kZShzdHJpbmcuc3ViKHN0ciwgb2Zmc2V0LCBvZmZzZXQrMykpCisgICAgc2VsZi50cmFuczp3cml0ZShieXRlcykKKyAgICBsZW5ndGggPSBsZW5ndGggLSAzCisgICAgb2Zmc2V0ID0gb2Zmc2V0ICsgMworICBlbmQKKyAgaWYgbGVuZ3RoID4gMCB0aGVuCisgICAgbG9jYWwgYnl0ZXMgPSBiYXNlNjRfZW5jb2RlKHN0cmluZy5zdWIoc3RyLCBvZmZzZXQsIG9mZnNldCtsZW5ndGgpKQorICAgIHNlbGYudHJhbnM6d3JpdGUoYnl0ZXMpCisgIGVuZAorICBzZWxmLnRyYW5zOndyaXRlKEpTT05Ob2RlLlN0cmluZ0RlbGltaXRlcikKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOndyaXRlSlNPTkludGVnZXIobnVtKQorICBzZWxmOndyaXRlRWxlbVNlcGFyYXRvcigpCisgIGlmIHNlbGY6ZXNjYXBlTnVtKCkgdGhlbgorICAgIHNlbGYudHJhbnM6d3JpdGUoSlNPTk5vZGUuU3RyaW5nRGVsaW1pdGVyKQorICBlbmQKKyAgbG9jYWwgbnVtc3RyID0gIiIgLi4gbnVtCisgIG51bXN0ciA9IHN0cmluZy5zdWIobnVtc3RyLCBzdHJpbmcuZmluZChudW1zdHIsICJeWystXT8lZCsiKSkKKyAgc2VsZi50cmFuczp3cml0ZShudW1zdHIpCisgIGlmIHNlbGY6ZXNjYXBlTnVtKCkgdGhlbgorICAgIHNlbGYudHJhbnM6d3JpdGUoSlNPTk5vZGUuU3RyaW5nRGVsaW1pdGVyKQorICBlbmQKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOndyaXRlSlNPTkRvdWJsZShkdWIpCisgIHNlbGY6d3JpdGVFbGVtU2VwYXJhdG9yKCkKKyAgbG9jYWwgdmFsID0gIiIgLi4gZHViCisgIGxvY2FsIHByZWZpeCA9IHN0cmluZy5zdWIodmFsLCAxLCAxKQorICBsb2NhbCBzcGVjaWFsID0gZmFsc2UKKyAgaWYgcHJlZml4ID09ICdOJyBvciBwcmVmaXggPT0gJ24nIHRoZW4KKyAgICB2YWwgPSBKU09OTm9kZS5OYW4KKyAgICBzcGVjaWFsID0gdHJ1ZQorICBlbHNlaWYgcHJlZml4ID09ICdJJyBvciBwcmVmaXggPT0gJ2knIHRoZW4KKyAgICB2YWwgPSBKU09OTm9kZS5JbmZpbml0eQorICAgIHNwZWNpYWwgPSB0cnVlCisgIGVsc2VpZiBwcmVmaXggPT0gJy0nIHRoZW4KKyAgICBsb2NhbCBzZWNvbmRCeXRlID0gc3RyaW5nLnN1Yih2YWwsIDIsIDIpCisgICAgaWYgc2Vjb25kQnl0ZSA9PSAnSScgb3Igc2Vjb25kQnl0ZSA9PSAnaScgdGhlbgorICAgICAgdmFsID0gSlNPTk5vZGUuTmVnYXRpdmVJbmZpbml0eQorICAgICAgc3BlY2lhbCA9IHRydWUKKyAgICBlbmQKKyAgZW5kCisKKyAgaWYgc3BlY2lhbCBvciBzZWxmOmVzY2FwZU51bSgpIHRoZW4KKyAgICBzZWxmLnRyYW5zOndyaXRlKEpTT05Ob2RlLlN0cmluZ0RlbGltaXRlcikKKyAgZW5kCisgIHNlbGYudHJhbnM6d3JpdGUodmFsKQorICBpZiBzcGVjaWFsIG9yIHNlbGY6ZXNjYXBlTnVtKCkgdGhlbgorICAgIHNlbGYudHJhbnM6d3JpdGUoSlNPTk5vZGUuU3RyaW5nRGVsaW1pdGVyKQorICBlbmQKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOndyaXRlSlNPTk9iamVjdEJlZ2luKCkKKyAgc2VsZjp3cml0ZUVsZW1TZXBhcmF0b3IoKQorICBzZWxmLnRyYW5zOndyaXRlKEpTT05Ob2RlLk9iamVjdEJlZ2luKQorICBzZWxmOmNvbnRleHRQdXNoKHtmaXJzdCA9IHRydWUsIGNvbG9uID0gdHJ1ZSwgdHR5cGUgPSAxLCBudWxsID0gZmFsc2V9KQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6d3JpdGVKU09OT2JqZWN0RW5kKCkKKyAgc2VsZjpjb250ZXh0UG9wKCkKKyAgc2VsZi50cmFuczp3cml0ZShKU09OTm9kZS5PYmplY3RFbmQpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDp3cml0ZUpTT05BcnJheUJlZ2luKCkKKyAgc2VsZjp3cml0ZUVsZW1TZXBhcmF0b3IoKQorICBzZWxmLnRyYW5zOndyaXRlKEpTT05Ob2RlLkFycmF5QmVnaW4pCisgIHNlbGY6Y29udGV4dFB1c2goe2ZpcnN0ID0gdHJ1ZSwgY29sb24gPSB0cnVlLCB0dHlwZSA9IDIsIG51bGwgPSBmYWxzZX0pCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDp3cml0ZUpTT05BcnJheUVuZCgpCisgIHNlbGY6Y29udGV4dFBvcCgpCisgIHNlbGYudHJhbnM6d3JpdGUoSlNPTk5vZGUuQXJyYXlFbmQpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDp3cml0ZU1lc3NhZ2VCZWdpbihuYW1lLCB0dHlwZSwgc2VxaWQpCisgIHNlbGY6cmVzZXRDb250ZXh0KCkKKyAgc2VsZjp3cml0ZUpTT05BcnJheUJlZ2luKCkKKyAgc2VsZjp3cml0ZUpTT05JbnRlZ2VyKFRKU09OUHJvdG9jb2wuVEhSSUZUX0pTT05fUFJPVE9DT0xfVkVSU0lPTikKKyAgc2VsZjp3cml0ZUpTT05TdHJpbmcobmFtZSkKKyAgc2VsZjp3cml0ZUpTT05JbnRlZ2VyKHR0eXBlKQorICBzZWxmOndyaXRlSlNPTkludGVnZXIoc2VxaWQpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDp3cml0ZU1lc3NhZ2VFbmQoKQorICBzZWxmOndyaXRlSlNPTkFycmF5RW5kKCkKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOndyaXRlU3RydWN0QmVnaW4obmFtZSkKKyAgc2VsZjp3cml0ZUpTT05PYmplY3RCZWdpbigpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDp3cml0ZVN0cnVjdEVuZCgpCisgIHNlbGY6d3JpdGVKU09OT2JqZWN0RW5kKCkKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOndyaXRlRmllbGRCZWdpbihuYW1lLCB0dHlwZSwgaWQpCisgIHNlbGY6d3JpdGVKU09OSW50ZWdlcihpZCkKKyAgc2VsZjp3cml0ZUpTT05PYmplY3RCZWdpbigpCisgIHNlbGY6d3JpdGVKU09OU3RyaW5nKFRUeXBlVG9TdHJpbmdbdHR5cGVdKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6d3JpdGVGaWVsZEVuZCgpCisgIHNlbGY6d3JpdGVKU09OT2JqZWN0RW5kKCkKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOndyaXRlRmllbGRTdG9wKCkKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOndyaXRlTWFwQmVnaW4oa3R5cGUsIHZ0eXBlLCBzaXplKQorICBzZWxmOndyaXRlSlNPTkFycmF5QmVnaW4oKQorICBzZWxmOndyaXRlSlNPTlN0cmluZyhUVHlwZVRvU3RyaW5nW2t0eXBlXSkKKyAgc2VsZjp3cml0ZUpTT05TdHJpbmcoVFR5cGVUb1N0cmluZ1t2dHlwZV0pCisgIHNlbGY6d3JpdGVKU09OSW50ZWdlcihzaXplKQorICByZXR1cm4gc2VsZjp3cml0ZUpTT05PYmplY3RCZWdpbigpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDp3cml0ZU1hcEVuZCgpCisgIHNlbGY6d3JpdGVKU09OT2JqZWN0RW5kKCkKKyAgc2VsZjp3cml0ZUpTT05BcnJheUVuZCgpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDp3cml0ZUxpc3RCZWdpbihldHlwZSwgc2l6ZSkKKyAgc2VsZjp3cml0ZUpTT05BcnJheUJlZ2luKCkKKyAgc2VsZjp3cml0ZUpTT05TdHJpbmcoVFR5cGVUb1N0cmluZ1tldHlwZV0pCisgIHNlbGY6d3JpdGVKU09OSW50ZWdlcihzaXplKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6d3JpdGVMaXN0RW5kKCkKKyAgc2VsZjp3cml0ZUpTT05BcnJheUVuZCgpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDp3cml0ZVNldEJlZ2luKGV0eXBlLCBzaXplKQorICBzZWxmOndyaXRlSlNPTkFycmF5QmVnaW4oKQorICBzZWxmOndyaXRlSlNPTlN0cmluZyhUVHlwZVRvU3RyaW5nW2V0eXBlXSkKKyAgc2VsZjp3cml0ZUpTT05JbnRlZ2VyKHNpemUpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDp3cml0ZVNldEVuZCgpCisgIHNlbGY6d3JpdGVKU09OQXJyYXlFbmQoKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6d3JpdGVCb29sKGJvb2wpCisgIGlmIGJvb2wgdGhlbgorICAgIHNlbGY6d3JpdGVKU09OSW50ZWdlcigxKQorICBlbHNlCisgICAgc2VsZjp3cml0ZUpTT05JbnRlZ2VyKDApCisgIGVuZAorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6d3JpdGVCeXRlKGJ5dGUpCisgIGxvY2FsIGJ1ZmYgPSBsaWJsdWFicGFjay5icGFjaygnYycsIGJ5dGUpCisgIGxvY2FsIHZhbCA9IGxpYmx1YWJwYWNrLmJ1bnBhY2soJ2MnLCBidWZmKQorICBzZWxmOndyaXRlSlNPTkludGVnZXIodmFsKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6d3JpdGVJMTYoaTE2KQorICBsb2NhbCBidWZmID0gbGlibHVhYnBhY2suYnBhY2soJ3MnLCBpMTYpCisgIGxvY2FsIHZhbCA9IGxpYmx1YWJwYWNrLmJ1bnBhY2soJ3MnLCBidWZmKQorICBzZWxmOndyaXRlSlNPTkludGVnZXIodmFsKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6d3JpdGVJMzIoaTMyKQorICBsb2NhbCBidWZmID0gbGlibHVhYnBhY2suYnBhY2soJ2knLCBpMzIpCisgIGxvY2FsIHZhbCA9IGxpYmx1YWJwYWNrLmJ1bnBhY2soJ2knLCBidWZmKQorICBzZWxmOndyaXRlSlNPTkludGVnZXIodmFsKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6d3JpdGVJNjQoaTY0KQorICBsb2NhbCBidWZmID0gbGlibHVhYnBhY2suYnBhY2soJ2wnLCBpNjQpCisgIGxvY2FsIHZhbCA9IGxpYmx1YWJwYWNrLmJ1bnBhY2soJ2wnLCBidWZmKQorICBzZWxmOndyaXRlSlNPTkludGVnZXIodG9zdHJpbmcodmFsKSkKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOndyaXRlRG91YmxlKGR1YikKKyAgc2VsZjp3cml0ZUpTT05Eb3VibGUoc3RyaW5nLmZvcm1hdCgiJS4xNmYiLCBkdWIpKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6d3JpdGVTdHJpbmcoc3RyKQorICBzZWxmOndyaXRlSlNPTlN0cmluZyhzdHIpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDp3cml0ZUJpbmFyeShzdHIpCisgIC0tIFNob3VsZCBiZSB1dGYtOAorICBzZWxmOndyaXRlSlNPTkJhc2U2NChzdHIpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkSlNPTlN5bnRheENoYXIoY2gpCisgIGxvY2FsIGNoMiA9ICIiCisgIGlmIHNlbGYuaGFzUmVhZEJ5dGUgfj0gIiIgdGhlbgorICAgIGNoMiA9IHNlbGYuaGFzUmVhZEJ5dGUKKyAgICBzZWxmLmhhc1JlYWRCeXRlID0gIiIKKyAgZWxzZQorICAgIGNoMiA9IHNlbGYudHJhbnM6cmVhZEFsbCgxKQorICBlbmQKKyAgaWYgY2gyIH49IGNoIHRoZW4KKyAgICB0ZXJyb3IoVFByb3RvY29sRXhjZXB0aW9uOm5ld3ttZXNzYWdlID0gIkV4cGVjdGVkICIuLiBjaCAuLiAiLCBnb3QgIiAuLiBjaDJ9KQorICBlbmQKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOnJlYWRFbGVtU2VwYXJhdG9yKCkKKyAgaWYgc2VsZi5qc29uQ29udGV4dFZhbC5udWxsIHRoZW4KKyAgICByZXR1cm4KKyAgZW5kCisgIGlmIHNlbGYuanNvbkNvbnRleHRWYWwuZmlyc3QgdGhlbgorICAgIHNlbGYuanNvbkNvbnRleHRWYWwuZmlyc3QgPSBmYWxzZQorICBlbHNlCisgICAgaWYgc2VsZi5qc29uQ29udGV4dFZhbC50dHlwZSA9PSAxIHRoZW4KKyAgICAgIGlmIHNlbGYuanNvbkNvbnRleHRWYWwuY29sb24gdGhlbgorICAgICAgICBzZWxmOnJlYWRKU09OU3ludGF4Q2hhcihKU09OTm9kZS5QYWlyU2VwYXJhdG9yKQorICAgICAgICBzZWxmLmpzb25Db250ZXh0VmFsLmNvbG9uID0gZmFsc2UKKyAgICAgIGVsc2UKKyAgICAgICAgc2VsZjpyZWFkSlNPTlN5bnRheENoYXIoSlNPTk5vZGUuRWxlbVNlcGFyYXRvcikKKyAgICAgICAgc2VsZi5qc29uQ29udGV4dFZhbC5jb2xvbiA9IHRydWUKKyAgICAgIGVuZAorICAgIGVsc2UKKyAgICAgIHNlbGY6cmVhZEpTT05TeW50YXhDaGFyKEpTT05Ob2RlLkVsZW1TZXBhcmF0b3IpCisgICAgZW5kCisgIGVuZAorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6aGV4VmFsKGNoKQorICBsb2NhbCB2YWwgPSBzdHJpbmcuYnl0ZShjaCkKKyAgaWYgdmFsID49IDQ4IGFuZCB2YWwgPD0gNTcgdGhlbgorICAgIHJldHVybiB2YWwgLSA0OAorICBlbHNlaWYgdmFsID49IDk3IGFuZCB2YWwgPD0gMTAyIHRoZW4KKyAgICByZXR1cm4gdmFsIC0gODcKKyAgZWxzZQorICAgIHRlcnJvcihUUHJvdG9jb2xFeGNlcHRpb246bmV3e21lc3NhZ2UgPSAiRXhwZWN0ZWQgaGV4IHZhbCAoWzAtOWEtZl0pOyBnb3QgIiAuLiBjaH0pCisgIGVuZAorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6cmVhZEpTT05Fc2NhcGVDaGFyKGNoKQorICBzZWxmOnJlYWRKU09OU3ludGF4Q2hhcihKU09OTm9kZS5aZXJvQ2hhcikKKyAgc2VsZjpyZWFkSlNPTlN5bnRheENoYXIoSlNPTk5vZGUuWmVyb0NoYXIpCisgIGxvY2FsIGIxID0gc2VsZi50cmFuczpyZWFkQWxsKDEpCisgIGxvY2FsIGIyID0gc2VsZi50cmFuczpyZWFkQWxsKDEpCisgIHJldHVybiBsaWJsdWFiaXR3aXNlLnNoaWZ0bChzZWxmOmhleFZhbChiMSksIDQpICsgc2VsZjpoZXhWYWwoYjIpCitlbmQKKworCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOnJlYWRKU09OU3RyaW5nKCkKKyAgc2VsZjpyZWFkRWxlbVNlcGFyYXRvcigpCisgIHNlbGY6cmVhZEpTT05TeW50YXhDaGFyKEpTT05Ob2RlLlN0cmluZ0RlbGltaXRlcikKKyAgbG9jYWwgcmVzdWx0ID0gIiIKKyAgd2hpbGUgdHJ1ZSBkbworICAgIGxvY2FsIGNoID0gc2VsZi50cmFuczpyZWFkQWxsKDEpCisgICAgaWYgY2ggPT0gSlNPTk5vZGUuU3RyaW5nRGVsaW1pdGVyIHRoZW4KKyAgICAgIGJyZWFrCisgICAgZW5kCisgICAgaWYgY2ggPT0gSlNPTk5vZGUuQmFja3NsYXNoIHRoZW4KKyAgICAgIGNoID0gc2VsZi50cmFuczpyZWFkQWxsKDEpCisgICAgICBpZiBjaCA9PSBKU09OTm9kZS5Fc2NhcGVDaGFyIHRoZW4KKyAgICAgICAgc2VsZjpyZWFkSlNPTkVzY2FwZUNoYXIoY2gpCisgICAgICBlbHNlCisgICAgICAgIGxvY2FsIHBvcywgXyA9IHN0cmluZy5maW5kKEpTT05Ob2RlLkVzY2FwZUNoYXJzLCBjaCkKKyAgICAgICAgaWYgcG9zID09IG5pbCB0aGVuCisgICAgICAgICAgdGVycm9yKFRQcm90b2NvbEV4Y2VwdGlvbjpuZXd7bWVzc2FnZSA9ICJFeHBlY3RlZCBjb250cm9sIGNoYXIsIGdvdCAiIC4uIGNofSkKKyAgICAgICAgZW5kCisgICAgICAgIGNoID0gRXNjYXBlQ2hhclZhbHNbcG9zXQorICAgICAgZW5kCisgICAgZW5kCisgICAgcmVzdWx0ID0gcmVzdWx0IC4uIGNoCisgIGVuZAorICByZXR1cm4gcmVzdWx0CitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkSlNPTkJhc2U2NCgpCisgIGxvY2FsIHJlc3VsdCA9IHNlbGY6cmVhZEpTT05TdHJpbmcoKQorICBsb2NhbCBsZW5ndGggPSBzdHJpbmcubGVuKHJlc3VsdCkKKyAgbG9jYWwgc3RyID0gIiIKKyAgbG9jYWwgb2Zmc2V0ID0gMQorICB3aGlsZSBsZW5ndGggPj0gNCBkbworICAgIGxvY2FsIGJ5dGVzID0gc3RyaW5nLnN1YihyZXN1bHQsIG9mZnNldCwgb2Zmc2V0KzQpCisgICAgc3RyID0gc3RyIC4uIGJhc2U2NF9kZWNvZGUoYnl0ZXMpCisgICAgb2Zmc2V0ID0gb2Zmc2V0ICsgNAorICAgIGxlbmd0aCA9IGxlbmd0aCAtIDQKKyAgZW5kCisgIGlmIGxlbmd0aCA+PSAwIHRoZW4KKyAgICBzdHIgPSBzdHIgLi4gYmFzZTY0X2RlY29kZShzdHJpbmcuc3ViKHJlc3VsdCwgb2Zmc2V0LCBvZmZzZXQgKyBsZW5ndGgpKQorICBlbmQKKyAgcmV0dXJuIHN0cgorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6cmVhZEpTT05OdW1lcmljQ2hhcnMoKQorICBsb2NhbCByZXN1bHQgPSAiIgorICB3aGlsZSB0cnVlIGRvCisgICAgbG9jYWwgY2ggPSBzZWxmLnRyYW5zOnJlYWRBbGwoMSkKKyAgICBpZiBzdHJpbmcuZmluZChjaCwgJ1stKzAtOS5FZV0nKSB0aGVuCisgICAgICByZXN1bHQgPSByZXN1bHQgLi4gY2gKKyAgICBlbHNlCisgICAgICBzZWxmLmhhc1JlYWRCeXRlID0gY2gKKyAgICAgIGJyZWFrCisgICAgZW5kCisgIGVuZAorICByZXR1cm4gcmVzdWx0CitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkSlNPTkxvbmdJbnRlZ2VyKCkKKyAgc2VsZjpyZWFkRWxlbVNlcGFyYXRvcigpCisgIGlmIHNlbGY6ZXNjYXBlTnVtKCkgdGhlbgorICAgIHNlbGY6cmVhZEpTT05TeW50YXhDaGFyKEpTT05Ob2RlLlN0cmluZ0RlbGltaXRlcikKKyAgZW5kCisgIGxvY2FsIHJlc3VsdCA9IHNlbGY6cmVhZEpTT05OdW1lcmljQ2hhcnMoKQorICBpZiBzZWxmOmVzY2FwZU51bSgpIHRoZW4KKyAgICBzZWxmOnJlYWRKU09OU3ludGF4Q2hhcihKU09OTm9kZS5TdHJpbmdEZWxpbWl0ZXIpCisgIGVuZAorICByZXR1cm4gcmVzdWx0CitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkSlNPTkludGVnZXIoKQorICByZXR1cm4gdG9udW1iZXIoc2VsZjpyZWFkSlNPTkxvbmdJbnRlZ2VyKCkpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkSlNPTkRvdWJsZSgpCisgIHNlbGY6cmVhZEVsZW1TZXBhcmF0b3IoKQorICBsb2NhbCBkZWxpbWl0ZXIgPSBzZWxmLnRyYW5zOnJlYWRBbGwoMSkKKyAgbG9jYWwgbnVtID0gMC4wCisgIGlmIGRlbGltaXRlciA9PSBKU09OTm9kZS5TdHJpbmdEZWxpbWl0ZXIgdGhlbgorICAgIGxvY2FsIHN0ciA9IHNlbGY6cmVhZEpTT05TdHJpbmcoKQorICAgIGlmIHN0ciA9PSBKU09OTm9kZS5OYW4gdGhlbgorICAgICAgbnVtID0gMS4wCisgICAgZWxzZWlmIHN0ciA9PSBKU09OTm9kZS5JbmZpbml0eSB0aGVuCisgICAgICBudW0gPSBtYXRoLm1heGludGVnZXIKKyAgICBlbHNlaWYgc3RyID09IEpTT05Ob2RlLk5lZ2F0aXZlSW5maW5pdHkgdGhlbgorICAgICAgbnVtID0gbWF0aC5taW5pbnRlZ2VyCisgICAgZWxzZQorICAgICAgbnVtID0gdG9udW1iZXIoc3RyKQorICAgIGVuZAorICBlbHNlCisgICAgaWYgc2VsZjplc2NhcGVOdW0oKSB0aGVuCisgICAgICBzZWxmOnJlYWRKU09OU3ludGF4Q2hhcihKU09OTm9kZS5TdHJpbmdEZWxpbWl0ZXIpCisgICAgZW5kCisgICAgbG9jYWwgcmVzdWx0ID0gc2VsZjpyZWFkSlNPTk51bWVyaWNDaGFycygpCisgICAgbnVtID0gdG9udW1iZXIoZGVsaW1pdGVyLi4gcmVzdWx0KQorICBlbmQKKyAgcmV0dXJuIG51bQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6cmVhZEpTT05PYmplY3RCZWdpbigpCisgIHNlbGY6cmVhZEVsZW1TZXBhcmF0b3IoKQorICBzZWxmOnJlYWRKU09OU3ludGF4Q2hhcihKU09OTm9kZS5PYmplY3RCZWdpbikKKyAgc2VsZjpjb250ZXh0UHVzaCh7Zmlyc3QgPSB0cnVlLCBjb2xvbiA9IHRydWUsIHR0eXBlID0gMSwgbnVsbCA9IGZhbHNlfSkKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOnJlYWRKU09OT2JqZWN0RW5kKCkKKyAgc2VsZjpyZWFkSlNPTlN5bnRheENoYXIoSlNPTk5vZGUuT2JqZWN0RW5kKQorICBzZWxmOmNvbnRleHRQb3AoKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6cmVhZEpTT05BcnJheUJlZ2luKCkKKyAgc2VsZjpyZWFkRWxlbVNlcGFyYXRvcigpCisgIHNlbGY6cmVhZEpTT05TeW50YXhDaGFyKEpTT05Ob2RlLkFycmF5QmVnaW4pCisgIHNlbGY6Y29udGV4dFB1c2goe2ZpcnN0ID0gdHJ1ZSwgY29sb24gPSB0cnVlLCB0dHlwZSA9IDIsIG51bGwgPSBmYWxzZX0pCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkSlNPTkFycmF5RW5kKCkKKyAgc2VsZjpyZWFkSlNPTlN5bnRheENoYXIoSlNPTk5vZGUuQXJyYXlFbmQpCisgIHNlbGY6Y29udGV4dFBvcCgpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkTWVzc2FnZUJlZ2luKCkKKyAgc2VsZjpyZXNldENvbnRleHQoKQorICBzZWxmOnJlYWRKU09OQXJyYXlCZWdpbigpCisgIGxvY2FsIHZlcnNpb24gPSBzZWxmOnJlYWRKU09OSW50ZWdlcigpCisgIGlmIHZlcnNpb24gfj0gc2VsZi5USFJJRlRfSlNPTl9QUk9UT0NPTF9WRVJTSU9OIHRoZW4KKyAgICB0ZXJyb3IoVFByb3RvY29sRXhjZXB0aW9uOm5ld3ttZXNzYWdlID0gIk1lc3NhZ2UgY29udGFpbmVkIGJhZCB2ZXJzaW9uLiJ9KQorICBlbmQKKyAgbG9jYWwgbmFtZSA9IHNlbGY6cmVhZEpTT05TdHJpbmcoKQorICBsb2NhbCB0dHlwZSA9IHNlbGY6cmVhZEpTT05JbnRlZ2VyKCkKKyAgbG9jYWwgc2VxaWQgPSBzZWxmOnJlYWRKU09OSW50ZWdlcigpCisgIHJldHVybiBuYW1lLCB0dHlwZSwgc2VxaWQKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOnJlYWRNZXNzYWdlRW5kKCkKKyAgc2VsZjpyZWFkSlNPTkFycmF5RW5kKCkKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOnJlYWRTdHJ1Y3RCZWdpbigpCisgIHNlbGY6cmVhZEpTT05PYmplY3RCZWdpbigpCisgIHJldHVybiBuaWwKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOnJlYWRTdHJ1Y3RFbmQoKQorICBzZWxmOnJlYWRKU09OT2JqZWN0RW5kKCkKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOnJlYWRGaWVsZEJlZ2luKCkKKyAgbG9jYWwgdHR5cGUgPSBUVHlwZS5TVE9QCisgIGxvY2FsIGlkID0gMAorICBsb2NhbCBjaCA9IHNlbGYudHJhbnM6cmVhZEFsbCgxKQorICBzZWxmLmhhc1JlYWRCeXRlID0gY2gKKyAgaWYgY2ggfj0gSlNPTk5vZGUuT2JqZWN0RW5kIHRoZW4KKyAgICBpZCA9IHNlbGY6cmVhZEpTT05JbnRlZ2VyKCkKKyAgICBzZWxmOnJlYWRKU09OT2JqZWN0QmVnaW4oKQorICAgIGxvY2FsIHR5cGVOYW1lID0gc2VsZjpyZWFkSlNPTlN0cmluZygpCisgICAgdHR5cGUgPSBTdHJpbmdUb1RUeXBlW3R5cGVOYW1lXQorICBlbmQKKyAgcmV0dXJuIG5pbCwgdHR5cGUsIGlkCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkRmllbGRFbmQoKQorICBzZWxmOnJlYWRKU09OT2JqZWN0RW5kKCkKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOnJlYWRNYXBCZWdpbigpCisgIHNlbGY6cmVhZEpTT05BcnJheUJlZ2luKCkKKyAgbG9jYWwgdHlwZU5hbWUgPSBzZWxmOnJlYWRKU09OU3RyaW5nKCkKKyAgbG9jYWwga3R5cGUgPSBTdHJpbmdUb1RUeXBlW3R5cGVOYW1lXQorICB0eXBlTmFtZSA9IHNlbGY6cmVhZEpTT05TdHJpbmcoKQorICBsb2NhbCB2dHlwZSA9IFN0cmluZ1RvVFR5cGVbdHlwZU5hbWVdCisgIGxvY2FsIHNpemUgPSBzZWxmOnJlYWRKU09OSW50ZWdlcigpCisgIHNlbGY6cmVhZEpTT05PYmplY3RCZWdpbigpCisgIHJldHVybiBrdHlwZSwgdnR5cGUsIHNpemUKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOnJlYWRNYXBFbmQoKQorICBzZWxmOnJlYWRKU09OT2JqZWN0RW5kKCkKKyAgc2VsZjpyZWFkSlNPTkFycmF5RW5kKCkKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOnJlYWRMaXN0QmVnaW4oKQorICBzZWxmOnJlYWRKU09OQXJyYXlCZWdpbigpCisgIGxvY2FsIHR5cGVOYW1lID0gc2VsZjpyZWFkSlNPTlN0cmluZygpCisgIGxvY2FsIGV0eXBlID0gU3RyaW5nVG9UVHlwZVt0eXBlTmFtZV0KKyAgbG9jYWwgc2l6ZSA9IHNlbGY6cmVhZEpTT05JbnRlZ2VyKCkKKyAgcmV0dXJuIGV0eXBlLCBzaXplCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkTGlzdEVuZCgpCisgIHJldHVybiBzZWxmOnJlYWRKU09OQXJyYXlFbmQoKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6cmVhZFNldEJlZ2luKCkKKyAgcmV0dXJuIHNlbGY6cmVhZExpc3RCZWdpbigpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkU2V0RW5kKCkKKyAgcmV0dXJuIHNlbGY6cmVhZEpTT05BcnJheUVuZCgpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkQm9vbCgpCisgIGxvY2FsIHJlc3VsdCA9IHNlbGY6cmVhZEpTT05JbnRlZ2VyKCkKKyAgaWYgcmVzdWx0ID09IDEgdGhlbgorICAgIHJldHVybiB0cnVlCisgIGVsc2UKKyAgICByZXR1cm4gZmFsc2UKKyAgZW5kCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkQnl0ZSgpCisgIGxvY2FsIHJlc3VsdCA9IHNlbGY6cmVhZEpTT05JbnRlZ2VyKCkKKyAgaWYgcmVzdWx0ID49IDI1NiB0aGVuCisgICAgdGVycm9yKFRQcm90b2NvbEV4Y2VwdGlvbjpuZXd7bWVzc2FnZSA9ICJVbkV4cGVjdGVkIEJ5dGUgIiAuLiByZXN1bHR9KQorICBlbmQKKyAgcmV0dXJuIHJlc3VsdAorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6cmVhZEkxNigpCisgIHJldHVybiBzZWxmOnJlYWRKU09OSW50ZWdlcigpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkSTMyKCkKKyAgcmV0dXJuIHNlbGY6cmVhZEpTT05JbnRlZ2VyKCkKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOnJlYWRJNjQoKQorICBsb2NhbCBsb25nID0gbGlibHVhbG9uZ251bWJlci5uZXcKKyAgcmV0dXJuIGxvbmcoc2VsZjpyZWFkSlNPTkxvbmdJbnRlZ2VyKCkpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkRG91YmxlKCkKKyAgcmV0dXJuIHNlbGY6cmVhZEpTT05Eb3VibGUoKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6cmVhZFN0cmluZygpCisgIHJldHVybiBzZWxmOnJlYWRKU09OU3RyaW5nKCkKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOnJlYWRCaW5hcnkoKQorICByZXR1cm4gc2VsZjpyZWFkSlNPTkJhc2U2NCgpCitlbmQKKworVEpTT05Qcm90b2NvbEZhY3RvcnkgPSBUUHJvdG9jb2xGYWN0b3J5Om5ld3sKKyAgX190eXBlID0gJ1RKU09OUHJvdG9jb2xGYWN0b3J5JywKK30KKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbEZhY3Rvcnk6Z2V0UHJvdG9jb2wodHJhbnMpCisgIC0tIFRPRE8gRW5mb3JjZSB0aGF0IHRoaXMgbXVzdCBiZSBhIHRyYW5zcG9ydCBjbGFzcyAoaWUgbm90IGEgYm9vbCkKKyAgaWYgbm90IHRyYW5zIHRoZW4KKyAgICB0ZXJyb3IoVFByb3RvY29sRXhjZXB0aW9uOm5ld3sKKyAgICAgIG1lc3NhZ2UgPSAnTXVzdCBzdXBwbHkgYSB0cmFuc3BvcnQgdG8gJyAuLiB0dHlwZShzZWxmKQorICAgIH0pCisgIGVuZAorICByZXR1cm4gVEpTT05Qcm90b2NvbDpuZXd7CisgICAgdHJhbnMgPSB0cmFucworICB9CitlbmQKZGlmZiAtLWdpdCBhL2xpYi9sdWEvVE1lbW9yeUJ1ZmZlci5sdWEgYi9saWIvbHVhL1RNZW1vcnlCdWZmZXIubHVhCmluZGV4IDNkNDM2ODYuLjc4YjJmNWMgMTAwNjQ0Ci0tLSBhL2xpYi9sdWEvVE1lbW9yeUJ1ZmZlci5sdWEKKysrIGIvbGliL2x1YS9UTWVtb3J5QnVmZmVyLmx1YQpAQCAtNjYsNyArNjYsNyBAQAogICAgIGxlbiA9IGF2YWlsCiAgIGVuZAogCi0gIGxvY2FsIHZhbCA9IHN0cmluZy5zdWIoc2VsZi5idWZmZXIsIHNlbGYuclBvcywgbGVuKQorICBsb2NhbCB2YWwgPSBzdHJpbmcuc3ViKHNlbGYuYnVmZmVyLCBzZWxmLnJQb3MgKyAxLCBzZWxmLnJQb3MgKyBsZW4pCiAgIHNlbGYuclBvcyA9IHNlbGYuclBvcyArIGxlbgogICByZXR1cm4gdmFsCiBlbmQKQEAgLTg0LDggKzg0LDggQEAKIGVuZAogCiBmdW5jdGlvbiBUTWVtb3J5QnVmZmVyOndyaXRlKGJ1ZikKLSAgc2VsZi5idWZmZXIgPSBzZWxmLmJ1ZmZlciArIGJ1ZgotICBzZWxmLndQb3MgPSBzZWxmLndQb3MgKyBidWYKKyAgc2VsZi5idWZmZXIgPSBzZWxmLmJ1ZmZlciAuLiBidWYKKyAgc2VsZi53UG9zID0gc2VsZi53UG9zICsgc3RyaW5nLmxlbihidWYpCiBlbmQKIAogZnVuY3Rpb24gVE1lbW9yeUJ1ZmZlcjpmbHVzaCgpIGVuZApkaWZmIC0tZ2l0IGEvbGliL2x1YS9UU2VydmVyLmx1YSBiL2xpYi9sdWEvVFNlcnZlci5sdWEKaW5kZXggZDZiOWNkMC4uNGUzN2Q1OCAxMDA2NDQKLS0tIGEvbGliL2x1YS9UU2VydmVyLmx1YQorKysgYi9saWIvbHVhL1RTZXJ2ZXIubHVhCkBAIC05MywxNSArOTMsMTYgQEAKIAogZnVuY3Rpb24gVFNlcnZlcjpzZXJ2ZSgpIGVuZAogZnVuY3Rpb24gVFNlcnZlcjpoYW5kbGUoY2xpZW50KQotICBsb2NhbCBpdHJhbnMsIG90cmFucywgaXByb3QsIG9wcm90LCByZXQsIGVyciA9CisgIGxvY2FsIGl0cmFucywgb3RyYW5zID0KICAgICBzZWxmLmlucHV0VHJhbnNwb3J0RmFjdG9yeTpnZXRUcmFuc3BvcnQoY2xpZW50KSwKLSAgICBzZWxmLm91dHB1dFRyYW5zcG9ydEZhY3Rvcnk6Z2V0VHJhbnNwb3J0KGNsaWVudCksCi0gICAgc2VsZi5pbnB1dFByb3RvY29sRmFjdG9yeTpnZXRQcm90b2NvbChjbGllbnQpLAotICAgIHNlbGYub3V0cHV0UHJvdG9jb2xGYWN0b3J5OmdldFByb3RvY29sKGNsaWVudCkKKyAgICBzZWxmLm91dHB1dFRyYW5zcG9ydEZhY3Rvcnk6Z2V0VHJhbnNwb3J0KGNsaWVudCkKKyAgbG9jYWwgaXByb3QsIG9wcm90ID0KKyAgICBzZWxmLmlucHV0UHJvdG9jb2xGYWN0b3J5OmdldFByb3RvY29sKGl0cmFucyksCisgICAgc2VsZi5vdXRwdXRQcm90b2NvbEZhY3Rvcnk6Z2V0UHJvdG9jb2wob3RyYW5zKQogCiAgIHNlbGY6X2NsaWVudEJlZ2luKGlwcm90LCBvcHJvdCkKICAgd2hpbGUgdHJ1ZSBkbwotICAgIHJldCwgZXJyID0gcGNhbGwoc2VsZi5wcm9jZXNzb3IucHJvY2Vzcywgc2VsZi5wcm9jZXNzb3IsIGlwcm90LCBvcHJvdCkKKyAgICBsb2NhbCByZXQsIGVyciA9IHBjYWxsKHNlbGYucHJvY2Vzc29yLnByb2Nlc3MsIHNlbGYucHJvY2Vzc29yLCBpcHJvdCwgb3Byb3QpCiAgICAgaWYgcmV0ID09IGZhbHNlIGFuZCBlcnIgdGhlbgogICAgICAgaWYgbm90IHN0cmluZy5maW5kKGVyciwgIlRUcmFuc3BvcnRFeGNlcHRpb24iKSB0aGVuCiAgICAgICAgIHNlbGY6X2hhbmRsZUV4Y2VwdGlvbihlcnIpCmRpZmYgLS1naXQgYS9saWIvbHVhL1RocmlmdC5sdWEgYi9saWIvbHVhL1RocmlmdC5sdWEKaW5kZXggNzZhZTUxMi4uNjhkNGJhOCAxMDA2NDQKLS0tIGEvbGliL2x1YS9UaHJpZnQubHVhCisrKyBiL2xpYi9sdWEvVGhyaWZ0Lmx1YQpAQCAtNDAsNyArNDAsMTUgQEAKICAgZXJyb3IoZSkKIGVuZAogCi12ZXJzaW9uID0gMC45LjIKK2Z1bmN0aW9uIHR0YWJsZV9zaXplKHQpCisgIGxvY2FsIGNvdW50ID0gMAorICBmb3IgaywgdiBpbiBwYWlycyh0KSBkbworICAgIGNvdW50ID0gY291bnQgKyAxCisgIGVuZAorICByZXR1cm4gY291bnQKK2VuZAorCit2ZXJzaW9uID0gJzEuMC4wJwogCiBUVHlwZSA9IHsKICAgU1RPUCAgID0gMCwKQEAgLTY5LDcgKzc3LDcgQEAKICAgT05FV0FZID0gNAogfQogCi0tLSBSZWN1cnNpdmUgX19pbmRleCBmdW5jdGlvbiB0byBhY2hpdmUgaW5oZXJpdGFuY2UKKy0tIFJlY3Vyc2l2ZSBfX2luZGV4IGZ1bmN0aW9uIHRvIGFjaGlldmUgaW5oZXJpdGFuY2UKIGZ1bmN0aW9uIF9fdG9ial9pbmRleChzZWxmLCBrZXkpCiAgIGxvY2FsIHYgPSByYXdnZXQoc2VsZiwga2V5KQogICBpZiB2IH49IG5pbCB0aGVuCmRpZmYgLS1naXQgYS9saWIvbHVhL2NvZGluZ19zdGFuZGFyZHMubWQgYi9saWIvbHVhL2NvZGluZ19zdGFuZGFyZHMubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEwMzkwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9sdWEvY29kaW5nX3N0YW5kYXJkcy5tZApAQCAtMCwwICsxIEBACitQbGVhc2UgZm9sbG93IFtHZW5lcmFsIENvZGluZyBTdGFuZGFyZHNdKC9kb2MvY29kaW5nX3N0YW5kYXJkcy5tZCkKZGlmZiAtLWdpdCBhL2xpYi9sdWEvc3JjL2x1YWJwYWNrLmMgYi9saWIvbHVhL3NyYy9sdWFicGFjay5jCmluZGV4IGM5MzY0MjguLjA3N2I2YWEgMTAwNjQ0Ci0tLSBhL2xpYi9sdWEvc3JjL2x1YWJwYWNrLmMKKysrIGIvbGliL2x1YS9zcmMvbHVhYnBhY2suYwpAQCAtOTQsNiArOTQsNyBAQAogLyoqCiAgKiBidW5wYWNrKHR5cGUsIGRhdGEpCiAgKiAgYyAtIFNpZ25lZCBCeXRlCisgKiAgQyAtIFVuc2lnbmVkIEJ5dGUKICAqICBzIC0gU2lnbmVkIFNob3J0CiAgKiAgaSAtIFNpZ25lZCBJbnQKICAqICBsIC0gU2lnbmVkIExvbmcKQEAgLTEwMyw3ICsxMDQsMTEgQEAKICAgY29uc3QgY2hhciAqY29kZSA9IGx1YUxfY2hlY2tzdHJpbmcoTCwgMSk7CiAgIGx1YUxfYXJnY2hlY2soTCwgY29kZVsxXSA9PSAnXDAnLCAwLCAiRm9ybWF0IGNvZGUgbXVzdCBiZSBvbmUgY2hhcmFjdGVyLiIpOwogICBjb25zdCBjaGFyICpkYXRhID0gbHVhTF9jaGVja3N0cmluZyhMLCAyKTsKKyNpZiBMVUFfVkVSU0lPTl9OVU0gPj0gNTAyCiAgIHNpemVfdCBsZW4gPSBsdWFfcmF3bGVuKEwsIDIpOworI2Vsc2UKKyAgc2l6ZV90IGxlbiA9IGx1YV9vYmpsZW4oTCwgMik7CisjZW5kaWYKIAogICBzd2l0Y2ggKGNvZGVbMF0pIHsKICAgICBjYXNlICdjJzogewpAQCAtMTEzLDYgKzExOCwxNiBAQAogICAgICAgbHVhX3B1c2hudW1iZXIoTCwgdmFsKTsKICAgICAgIGJyZWFrOwogICAgIH0KKyAgICAvKioKKyAgICAgKiB1bnBhY2sgdW5zaWduZWQgQnl0ZS4KKyAgICAgKi8KKyAgICBjYXNlICdDJzogeworICAgICAgdWludDhfdCB2YWw7CisgICAgICBsdWFMX2FyZ2NoZWNrKEwsIGxlbiA9PSBzaXplb2YodmFsKSwgMSwgIkludmFsaWQgaW5wdXQgc3RyaW5nIHNpemUuIik7CisgICAgICBtZW1jcHkoJnZhbCwgZGF0YSwgc2l6ZW9mKHZhbCkpOworICAgICAgbHVhX3B1c2hudW1iZXIoTCwgdmFsKTsKKyAgICAgIGJyZWFrOworICAgIH0KICAgICBjYXNlICdzJzogewogICAgICAgaW50MTZfdCB2YWw7CiAgICAgICBsdWFMX2FyZ2NoZWNrKEwsIGxlbiA9PSBzaXplb2YodmFsKSwgMSwgIkludmFsaWQgaW5wdXQgc3RyaW5nIHNpemUuIik7CkBAIC0xNTAsOSArMTY1LDE0MCBAQAogICByZXR1cm4gMTsKIH0KIAorLyoqCisgKiBDb252ZXJ0IGwgaW50byBhIHppZ3phZyBsb25nLiBUaGlzIGFsbG93cyBuZWdhdGl2ZSBudW1iZXJzIHRvIGJlCisgKiByZXByZXNlbnRlZCBjb21wYWN0bHkgYXMgYSB2YXJpbnQuCisgKi8KK3N0YXRpYyBpbnQgbF9pNjRUb1ppZ3phZyhsdWFfU3RhdGUgKkwpIHsKKyAgaW50NjRfdCBuID0gbHVhbG9uZ251bWJlcl9jaGVja2xvbmcoTCwgMSk7CisgIGludDY0X3QgcmVzdWx0ID0gKG4gPDwgMSkgXiAobiA+PiA2Myk7CisgIGx1YWxvbmdudW1iZXJfcHVzaGxvbmcoTCwgJnJlc3VsdCk7CisgIHJldHVybiAxOworfQorLyoqCisgKiBDb252ZXJ0IG4gaW50byBhIHppZ3phZyBpbnQuIFRoaXMgYWxsb3dzIG5lZ2F0aXZlIG51bWJlcnMgdG8gYmUKKyAqIHJlcHJlc2VudGVkIGNvbXBhY3RseSBhcyBhIHZhcmludC4KKyAqLworc3RhdGljIGludCBsX2kzMlRvWmlnemFnKGx1YV9TdGF0ZSAqTCkgeworICBpbnQzMl90IG4gPSBsdWFMX2NoZWNraW50ZWdlcihMLCAxKTsKKyAgdWludDMyX3QgcmVzdWx0ID0gKHVpbnQzMl90KShuIDw8IDEpIF4gKG4gPj4gMzEpOworICBsdWFfcHVzaG51bWJlcihMLCByZXN1bHQpOworICByZXR1cm4gMTsKK30KKworLyoqCisgKiBDb252ZXJ0IGZyb20gemlnemFnIGludCB0byBpbnQuCisgKi8KK3N0YXRpYyBpbnQgbF96aWd6YWdUb0kzMihsdWFfU3RhdGUgKkwpIHsKKyAgdWludDMyX3QgbiA9IGx1YUxfY2hlY2tpbnRlZ2VyKEwsIDEpOworICBpbnQzMl90IHJlc3VsdCA9IChpbnQzMl90KShuID4+IDEpIF4gKHVpbnQzMl90KSgtKGludDMyX3QpKG4gJiAxKSk7CisgIGx1YV9wdXNobnVtYmVyKEwsIHJlc3VsdCk7CisgIHJldHVybiAxOworfQorCisvKioKKyAqIENvbnZlcnQgZnJvbSB6aWd6YWcgbG9uZyB0byBsb25nLgorICovCitzdGF0aWMgaW50IGxfemlnemFnVG9JNjQobHVhX1N0YXRlICpMKSB7CisgIGludDY0X3QgbiA9IGx1YWxvbmdudW1iZXJfY2hlY2tsb25nKEwsIDEpOworICBpbnQ2NF90IHJlc3VsdCA9IChpbnQ2NF90KShuID4+IDEpIF4gKHVpbnQ2NF90KSgtKGludDY0X3QpKG4gJiAxKSk7CisgIGx1YWxvbmdudW1iZXJfcHVzaGxvbmcoTCwgJnJlc3VsdCk7CisgIHJldHVybiAxOworfQorCisvKioKKyAqIENvbnZlcnQgYW4gaTMyIHRvIGEgdmFyaW50LiBSZXN1bHRzIGluIDEtNSBieXRlcyBvbiB0aGUgYnVmZmVyLgorICovCitzdGF0aWMgaW50IGxfdG9WYXJpbnQzMihsdWFfU3RhdGUgKkwpIHsKKyAgdWludDhfdCBidWZbNV07CisgIHVpbnQzMl90IG4gPSBsdWFMX2NoZWNraW50ZWdlcihMLCAxKTsKKyAgdWludDMyX3Qgd3NpemUgPSAwOworCisgIHdoaWxlICgxKSB7CisgICAgaWYgKChuICYgfjB4N0YpID09IDApIHsKKyAgICAgIGJ1Zlt3c2l6ZSsrXSA9IChpbnQ4X3QpbjsKKyAgICAgIGJyZWFrOworICAgIH0gZWxzZSB7CisgICAgICBidWZbd3NpemUrK10gPSAoaW50OF90KSgobiAmIDB4N0YpIHwgMHg4MCk7CisgICAgICBuID4+PSA3OworICAgIH0KKyAgfQorICBsdWFfcHVzaGxzdHJpbmcoTCwgYnVmLCB3c2l6ZSk7CisgIHJldHVybiAxOworfQorCisvKioKKyAqIENvbnZlcnQgYW4gaTY0IHRvIGEgdmFyaW50LiBSZXN1bHRzIGluIDEtMTAgYnl0ZXMgb24gdGhlIGJ1ZmZlci4KKyAqLworc3RhdGljIGludCBsX3RvVmFyaW50NjQobHVhX1N0YXRlICpMKSB7CisgIHVpbnQ4X3QgZGF0YVsxMF07CisgIHVpbnQ2NF90IG4gPSBsdWFsb25nbnVtYmVyX2NoZWNrbG9uZyhMLCAxKTsKKyAgdWludDMyX3Qgd3NpemUgPSAwOworICBsdWFMX0J1ZmZlciBidWY7CisgIGx1YUxfYnVmZmluaXQoTCwgJmJ1Zik7CisKKyAgd2hpbGUgKDEpIHsKKyAgICBpZiAoKG4gJiB+MHg3RkwpID09IDApIHsKKyAgICAgIGRhdGFbd3NpemUrK10gPSAoaW50OF90KW47CisgICAgICBicmVhazsKKyAgICB9IGVsc2UgeworICAgICAgZGF0YVt3c2l6ZSsrXSA9IChpbnQ4X3QpKChuICYgMHg3RikgfCAweDgwKTsKKyAgICAgIG4gPj49IDc7CisgICAgfQorICB9CisKKyAgbHVhTF9hZGRsc3RyaW5nKCZidWYsICh2b2lkKikmZGF0YSwgd3NpemUpOworICBsdWFMX3B1c2hyZXN1bHQoJmJ1Zik7CisgIHJldHVybiAxOworfQorCisvKioKKyAqIENvbnZlcnQgYSB2YXJpbnQgdG8gaTY0LgorICovCitzdGF0aWMgaW50IGxfZnJvbVZhcmludDY0KGx1YV9TdGF0ZSAqTCkgeworICBpbnQ2NF90IHJlc3VsdDsKKyAgdWludDhfdCBieXRlID0gbHVhTF9jaGVja251bWJlcihMLCAxKTsKKyAgaW50MzJfdCBzaGlmdCA9IGx1YUxfY2hlY2tudW1iZXIoTCwgMik7CisgIHVpbnQ2NF90IG4gPSAodWludDY0X3QpbHVhbG9uZ251bWJlcl9jaGVja2xvbmcoTCwgMyk7CisgIG4gfD0gKHVpbnQ2NF90KShieXRlICYgMHg3ZikgPDwgc2hpZnQ7CisKKyAgaWYgKCEoYnl0ZSAmIDB4ODApKSB7CisgICAgcmVzdWx0ID0gKGludDY0X3QpKG4gPj4gMSkgXiAodWludDY0X3QpKC0oaW50NjRfdCkobiAmIDEpKTsKKyAgICBsdWFfcHVzaG51bWJlcihMLCAwKTsKKyAgfSBlbHNlIHsKKyAgICByZXN1bHQgPSBuOworICAgIGx1YV9wdXNobnVtYmVyKEwsIDEpOworICB9CisgIGx1YWxvbmdudW1iZXJfcHVzaGxvbmcoTCwgJnJlc3VsdCk7CisgIHJldHVybiAyOworfQorCisvKioKKyAqIFRvIHBhY2sgbWVzc2FnZSB0eXBlIG9mIGNvbXBhY3QgcHJvdG9jb2wuCisgKi8KK3N0YXRpYyBpbnQgbF9wYWNrTWVzZ1R5cGUobHVhX1N0YXRlICpMKSB7CisgIGludDMyX3QgdmVyc2lvbl9uID0gbHVhTF9jaGVja2ludGVnZXIoTCwgMSk7CisgIGludDMyX3QgdmVyc2lvbl9tYXNrID0gbHVhTF9jaGVja2ludGVnZXIoTCwgMik7CisgIGludDMyX3QgbWVzc2FnZXR5cGUgPSBsdWFMX2NoZWNraW50ZWdlcihMLCAzKTsKKyAgaW50MzJfdCB0eXBlX3NoaWZ0X2Ftb3VudCA9IGx1YUxfY2hlY2tpbnRlZ2VyKEwsIDQpOworICBpbnQzMl90IHR5cGVfbWFzayA9IGx1YUxfY2hlY2tpbnRlZ2VyKEwsIDUpOworICBpbnQzMl90IHRvX21lc2dfdHlwZSA9ICh2ZXJzaW9uX24gJiB2ZXJzaW9uX21hc2spIHwKKyAgICAoKChpbnQzMl90KW1lc3NhZ2V0eXBlIDw8IHR5cGVfc2hpZnRfYW1vdW50KSAmIHR5cGVfbWFzayk7CisgIGx1YV9wdXNobnVtYmVyKEwsIHRvX21lc2dfdHlwZSk7CisgIHJldHVybiAxOworfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IGx1YUxfUmVnIGx1YV9icGFja1tdID0gewogICB7ImJwYWNrIiwgbF9icGFja30sCiAgIHsiYnVucGFjayIsIGxfYnVucGFja30sCisgIHsiaTMyVG9aaWd6YWciLCBsX2kzMlRvWmlnemFnfSwKKyAgeyJpNjRUb1ppZ3phZyIsIGxfaTY0VG9aaWd6YWd9LAorICB7InppZ3phZ1RvSTMyIiwgbF96aWd6YWdUb0kzMn0sCisgIHsiemlnemFnVG9JNjQiLCBsX3ppZ3phZ1RvSTY0fSwKKyAgeyJ0b1ZhcmludDMyIiwgbF90b1ZhcmludDMyfSwKKyAgeyJ0b1ZhcmludDY0IiwgbF90b1ZhcmludDY0fSwKKyAgeyJmcm9tVmFyaW50NjQiLCBsX2Zyb21WYXJpbnQ2NH0sCisgIHsicGFja01lc2dUeXBlIiwgbF9wYWNrTWVzZ1R5cGV9LAogICB7TlVMTCwgTlVMTH0KIH07CiAKZGlmZiAtLWdpdCBhL2xpYi9sdWEvc3JjL2x1YXNvY2tldC5jIGIvbGliL2x1YS9zcmMvbHVhc29ja2V0LmMKaW5kZXggYzhhNjc4Zi4uZDQ4MzUxMCAxMDA2NDQKLS0tIGEvbGliL2x1YS9zcmMvbHVhc29ja2V0LmMKKysrIGIvbGliL2x1YS9zcmMvbHVhc29ja2V0LmMKQEAgLTM0NywxMSArMzQ3LDYgQEAKICAgICAvLyBDcmVhdGUgdGhlIHNvY2tldAogICAgIGVyciA9IHRjcF9jcmVhdGUoJnNvY2spOwogICAgIGlmICghZXJyKSB7Ci0gICAgICAvLyBCaW5kIHRvIGFueSBwb3J0IG9uIGxvY2FsaG9zdAotICAgICAgZXJyID0gdGNwX2JpbmQoJnNvY2ssIERFRkFVTFRfSE9TVCwgMCk7Ci0gICAgICBpZiAoZXJyKSB7Ci0gICAgICAgIHRjcF9kZXN0cm95KCZzb2NrKTsKLSAgICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIENvbm5lY3QKICAgICAgICAgZXJyID0gdGNwX2Nvbm5lY3QoJnNvY2ssIGhvc3QsIHBvcnQsIHRpbWVvdXQpOwogICAgICAgICBpZiAoZXJyKSB7CkBAIC0zNjUsNyArMzYwLDYgQEAKICAgICAgICAgICB0Y3AtPnRpbWVvdXQgPSB0aW1lb3V0OwogICAgICAgICAgIHJldHVybiAxOyAvLyBSZXR1cm4gdXNlcmRhdGEKICAgICAgICAgfQotICAgICAgfQogICAgIH0KICAgfSB3aGlsZSAoZXJyICYmIF9fZ2V0dGltZSgpIDwgZW5kKTsKIApkaWZmIC0tZ2l0IGEvbGliL2x1YS9zcmMvc29ja2V0LmggYi9saWIvbHVhL3NyYy9zb2NrZXQuaAppbmRleCA4MDE5ZmZlLi5hZmI4MjdlIDEwMDY0NAotLS0gYS9saWIvbHVhL3NyYy9zb2NrZXQuaAorKysgYi9saWIvbHVhL3NyYy9zb2NrZXQuaApAQCAtNTEsOCArNTEsOCBAQAogVF9FUlJDT0RFIHNvY2tldF9yZWN2KHBfc29ja2V0IHNvY2ssIGNoYXIgKmRhdGEsIHNpemVfdCBsZW4sIGludCB0aW1lb3V0LAogICAgICAgICAgICAgICAgICAgICAgIGludCAqcmVjZWl2ZWQpOwogCi12b2lkIHNvY2tldF9zZXRibG9ja2luZyhwX3NvY2tldCBzb2NrKTsKLXZvaWQgc29ja2V0X3NldG5vbmJsb2NraW5nKHBfc29ja2V0IHNvY2spOworVF9FUlJDT0RFIHNvY2tldF9zZXRibG9ja2luZyhwX3NvY2tldCBzb2NrKTsKK1RfRVJSQ09ERSBzb2NrZXRfc2V0bm9uYmxvY2tpbmcocF9zb2NrZXQgc29jayk7CiAKIFRfRVJSQ09ERSBzb2NrZXRfYWNjZXB0KHBfc29ja2V0IHNvY2ssIHBfc29ja2V0IHNpYmxpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICBwX3NhIGFkZHIsIHNvY2tsZW5fdCAqYWRkcl9sZW4sIGludCB0aW1lb3V0KTsKZGlmZiAtLWdpdCBhL2xpYi9sdWEvc3JjL3Vzb2NrZXQuYyBiL2xpYi9sdWEvc3JjL3Vzb2NrZXQuYwppbmRleCBiZTY5NmUwLi4xYTFiNTQ5IDEwMDY0NAotLS0gYS9saWIvbHVhL3NyYy91c29ja2V0LmMKKysrIGIvbGliL2x1YS9zcmMvdXNvY2tldC5jCkBAIC01OCwxMyArNTgsMTQgQEAKIAogICBlbmQgPSBfX2dldHRpbWUoKSArIHRpbWVvdXQvMTAwMDsKICAgZG8geworICAgIEZEX1pFUk8oJnJmZHMpOworICAgIEZEX1pFUk8oJndmZHMpOworCiAgICAgLy8gU3BlY2lmeSB3aGF0IEkvTyBvcGVyYXRpb25zIHdlIGNhcmUgYWJvdXQKICAgICBpZiAobW9kZSAmIFdBSVRfTU9ERV9SKSB7Ci0gICAgICBGRF9aRVJPKCZyZmRzKTsKICAgICAgIEZEX1NFVCgqc29jaywgJnJmZHMpOwogICAgIH0KICAgICBpZiAobW9kZSAmIFdBSVRfTU9ERV9XKSB7Ci0gICAgICBGRF9aRVJPKCZ3ZmRzKTsKICAgICAgIEZEX1NFVCgqc29jaywgJndmZHMpOwogICAgIH0KIApAQCAtMTEyLDcgKzExMyw3IEBACiBUX0VSUkNPREUgc29ja2V0X2Rlc3Ryb3kocF9zb2NrZXQgc29jaykgewogICAvLyBUT0RPIEZpZ3VyZSBvdXQgaWYgSSBzaG91bGQgYmUgZnJlZS1pbmcgdGhpcwogICBpZiAoKnNvY2sgPiAwKSB7Ci0gICAgc29ja2V0X3NldGJsb2NraW5nKHNvY2spOworICAgICh2b2lkKXNvY2tldF9zZXRibG9ja2luZyhzb2NrKTsKICAgICBjbG9zZSgqc29jayk7CiAgICAgKnNvY2sgPSAtMTsKICAgfQpAQCAtMTIwLDMwICsxMjEsMzkgQEAKIH0KIAogVF9FUlJDT0RFIHNvY2tldF9iaW5kKHBfc29ja2V0IHNvY2ssIHBfc2EgYWRkciwgaW50IGFkZHJfbGVuKSB7Ci0gIGludCByZXQgPSBTVUNDRVNTOwotICBzb2NrZXRfc2V0YmxvY2tpbmcoc29jayk7CisgIGludCByZXQgPSBzb2NrZXRfc2V0YmxvY2tpbmcoc29jayk7CisgIGlmIChyZXQgIT0gU1VDQ0VTUykgeworICAgIHJldHVybiByZXQ7CisgIH0KICAgaWYgKGJpbmQoKnNvY2ssIGFkZHIsIGFkZHJfbGVuKSkgewogICAgIHJldCA9IGVycm5vOwogICB9Ci0gIHNvY2tldF9zZXRub25ibG9ja2luZyhzb2NrKTsKLSAgcmV0dXJuIHJldDsKKyAgaW50IHJldDIgPSBzb2NrZXRfc2V0bm9uYmxvY2tpbmcoc29jayk7CisgIHJldHVybiByZXQgPT0gU1VDQ0VTUyA/IHJldDIgOiByZXQ7CiB9CiAKIFRfRVJSQ09ERSBzb2NrZXRfZ2V0X2luZm8ocF9zb2NrZXQgc29jaywgc2hvcnQgKnBvcnQsIGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikgewotICBzdHJ1Y3Qgc29ja2FkZHJfaW4gc2E7Ci0gIHNvY2tsZW5fdCBhZGRybGVuOworICBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBzYTsKICAgbWVtc2V0KCZzYSwgMCwgc2l6ZW9mKHNhKSk7CisgIHNvY2tsZW5fdCBhZGRybGVuID0gc2l6ZW9mKHNhKTsKICAgaW50IHJjID0gZ2V0c29ja25hbWUoKnNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIqKSZzYSwgJmFkZHJsZW4pOwogICBpZiAoIXJjKSB7Ci0gICAgY2hhciAqYWRkciA9IGluZXRfbnRvYShzYS5zaW5fYWRkcik7Ci0gICAgKnBvcnQgPSBudG9ocyhzYS5zaW5fcG9ydCk7Ci0gICAgaWYgKHN0cmxlbihhZGRyKSA8IGxlbikgewotICAgICAgbGVuID0gc3RybGVuKGFkZHIpOworICAgIGlmIChzYS5zc19mYW1pbHkgPT0gQUZfSU5FVDYpIHsKKyAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbjYqIHNpbiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42KikoJnNhKTsKKyAgICAgIGlmICghaW5ldF9udG9wKEFGX0lORVQ2LCAmc2luLT5zaW42X2FkZHIsIGJ1ZiwgbGVuKSkgeworICAgICAgICByZXR1cm4gZXJybm87CisgICAgICB9CisgICAgICAqcG9ydCA9IG50b2hzKHNpbi0+c2luNl9wb3J0KTsKKyAgICB9IGVsc2UgeworICAgICAgc3RydWN0IHNvY2thZGRyX2luKiBzaW4gPSAoc3RydWN0IHNvY2thZGRyX2luKikoJnNhKTsKKyAgICAgIGlmICghaW5ldF9udG9wKEFGX0lORVQsICZzaW4tPnNpbl9hZGRyLCBidWYsIGxlbikpIHsKKyAgICAgICAgcmV0dXJuIGVycm5vOworICAgICAgfQorICAgICAgKnBvcnQgPSBudG9ocyhzaW4tPnNpbl9wb3J0KTsKICAgICB9Ci0gICAgbWVtY3B5KGJ1ZiwgYWRkciwgbGVuKTsKICAgICByZXR1cm4gU1VDQ0VTUzsKICAgfQotICByZXR1cm4gcmM7CisgIHJldHVybiBlcnJubzsKIH0KIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KQEAgLTE2MCwyMiArMTcwLDI1IEBACiAgICAgaWYgKCpjbGllbnQgPiAwKSB7CiAgICAgICByZXR1cm4gU1VDQ0VTUzsKICAgICB9Ci0gICAgZXJyID0gZXJybm87Ci0gIH0gd2hpbGUgKGVyciAhPSBFSU5UUik7CisgIH0gd2hpbGUgKChlcnIgPSBlcnJubykgPT0gRUlOVFIpOworCiAgIGlmIChlcnIgPT0gRUFHQUlOIHx8IGVyciA9PSBFQ09OTkFCT1JURUQpIHsKICAgICByZXR1cm4gc29ja2V0X3dhaXQoc29jaywgV0FJVF9NT0RFX1IsIHRpbWVvdXQpOwogICB9CisKICAgcmV0dXJuIGVycjsKIH0KIAogVF9FUlJDT0RFIHNvY2tldF9saXN0ZW4ocF9zb2NrZXQgc29jaywgaW50IGJhY2tsb2cpIHsKLSAgaW50IHJldCA9IFNVQ0NFU1M7Ci0gIHNvY2tldF9zZXRibG9ja2luZyhzb2NrKTsKKyAgaW50IHJldCA9IHNvY2tldF9zZXRibG9ja2luZyhzb2NrKTsKKyAgaWYgKHJldCAhPSBTVUNDRVNTKSB7CisgICAgcmV0dXJuIHJldDsKKyAgfQogICBpZiAobGlzdGVuKCpzb2NrLCBiYWNrbG9nKSkgewogICAgIHJldCA9IGVycm5vOwogICB9Ci0gIHNvY2tldF9zZXRub25ibG9ja2luZyhzb2NrKTsKLSAgcmV0dXJuIHJldDsKKyAgaW50IHJldDIgPSBzb2NrZXRfc2V0bm9uYmxvY2tpbmcoc29jayk7CisgIHJldHVybiByZXQgPT0gU1VDQ0VTUyA/IHJldDIgOiByZXQ7CiB9CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCkBAIC0yMDksMTIgKzIyMiwxMiBAQAogICAgIGlmIChwdXQgPiAwKSB7CiAgICAgICByZXR1cm4gU1VDQ0VTUzsKICAgICB9Ci0gICAgZXJyID0gZXJybm87Ci0gIH0gd2hpbGUgKGVyciAhPSBFSU5UUik7CisgIH0gd2hpbGUgKChlcnIgPSBlcnJubykgPT0gRUlOVFIpOwogCiAgIGlmIChlcnIgPT0gRUFHQUlOKSB7CiAgICAgcmV0dXJuIHNvY2tldF93YWl0KHNvY2ssIFdBSVRfTU9ERV9XLCB0aW1lb3V0KTsKICAgfQorCiAgIHJldHVybiBlcnI7CiB9CiAKQEAgLTIyNCw4ICsyMzcsOCBAQAogICBpZiAoKnNvY2sgPCAwKSB7CiAgICAgcmV0dXJuIENMT1NFRDsKICAgfQorICAqcmVjZWl2ZWQgPSAwOwogCi0gIGludCBmbGFncyA9IGZjbnRsKCpzb2NrLCBGX0dFVEZMLCAwKTsKICAgZG8gewogICAgIGdvdCA9IHJlY3YoKnNvY2ssIGRhdGEsIGxlbiwgMCk7CiAgICAgaWYgKGdvdCA+IDApIHsKQEAgLTIzOCwyNyArMjUxLDI4IEBACiAgICAgaWYgKGdvdCA9PSAwKSB7CiAgICAgICByZXR1cm4gQ0xPU0VEOwogICAgIH0KLSAgfSB3aGlsZSAoZXJyICE9IEVJTlRSKTsKKyAgfSB3aGlsZSAoZXJyID09IEVJTlRSKTsKIAogICBpZiAoZXJyID09IEVBR0FJTikgewogICAgIHJldHVybiBzb2NrZXRfd2FpdChzb2NrLCBXQUlUX01PREVfUiwgdGltZW91dCk7CiAgIH0KKwogICByZXR1cm4gZXJyOwogfQogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogLy8gVXRpbAogCi12b2lkIHNvY2tldF9zZXRub25ibG9ja2luZyhwX3NvY2tldCBzb2NrKSB7CitUX0VSUkNPREUgc29ja2V0X3NldG5vbmJsb2NraW5nKHBfc29ja2V0IHNvY2spIHsKICAgaW50IGZsYWdzID0gZmNudGwoKnNvY2ssIEZfR0VURkwsIDApOwogICBmbGFncyB8PSBPX05PTkJMT0NLOwotICBmY250bCgqc29jaywgRl9TRVRGTCwgZmxhZ3MpOworICByZXR1cm4gZmNudGwoKnNvY2ssIEZfU0VURkwsIGZsYWdzKSAhPSAtMSA/IFNVQ0NFU1MgOiBlcnJubzsKIH0KIAotdm9pZCBzb2NrZXRfc2V0YmxvY2tpbmcocF9zb2NrZXQgc29jaykgeworVF9FUlJDT0RFIHNvY2tldF9zZXRibG9ja2luZyhwX3NvY2tldCBzb2NrKSB7CiAgIGludCBmbGFncyA9IGZjbnRsKCpzb2NrLCBGX0dFVEZMLCAwKTsKICAgZmxhZ3MgJj0gKH4oT19OT05CTE9DSykpOwotICBmY250bCgqc29jaywgRl9TRVRGTCwgZmxhZ3MpOworICByZXR1cm4gZmNudGwoKnNvY2ssIEZfU0VURkwsIGZsYWdzKSAhPSAtMSA/IFNVQ0NFU1MgOiBlcnJubzsKIH0KIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL01ha2VmaWxlLmFtIGIvbGliL25ldGNvcmUvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FmM2YzNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNDEgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitTVUJESVJTID0gLiAKKworYWxsLWxvY2FsOgorCSQoRE9UTkVUQ09SRSkgYnVpbGQKKworY2hlY2stbG9jYWw6CisJJChET1RORVRDT1JFKSB0ZXN0IFRlc3RzL1RocmlmdC5UZXN0cy9UaHJpZnQuVGVzdHMuY3Nwcm9qCisJJHtET1RORVRDT1JFfSB0ZXN0IFRlc3RzL1RocmlmdC5JbnRlZ3JhdGlvblRlc3RzL1RocmlmdC5JbnRlZ3JhdGlvblRlc3RzLmNzcHJvagorCitjbGVhbi1sb2NhbDoKKwkkKFJNKSAtciBUaHJpZnQvYmluCisJJChSTSkgLXIgVGhyaWZ0L29iagorCitFWFRSQV9ESVNUID0gXAorCVJFQURNRS5tZCBcCisJVGVzdHMgXAorCVRocmlmdCBcCisJVGhyaWZ0LnNsbiBcCisJYnVpbGQuY21kIFwKKwlidWlsZC5zaCBcCisJcnVudGVzdHMuY21kIFwKKwlydW50ZXN0cy5zaApkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvUkVBRE1FLm1kIGIvbGliL25ldGNvcmUvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0YjA0N2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9SRUFETUUubWQKQEAgLTAsMCArMSwyNCBAQAorIyBBcGFjaGUgVGhyaWZ0IG5ldGNvcmUKKworVGhyaWZ0IGNsaWVudCBsaWJyYXJ5IHBvcnRlZCB0byBNaWNyb3NvZnQgLk5ldCBDb3JlIAorCisjIENvbnRlbnQKKy0gVGVzdHMvVGhyaWZ0LlB1YmxpY0ludGVyZmFjZXMuQ29tcGlsZS5UZXN0cyAtIHByb2plY3QgZm9yIGNoZWNraW5nIHB1YmxpYyBpbnRlcmZhY2VzIGR1cmluZyBhZGRpbmcgY2hhbmdlcyB0byBUaHJpZnQgbGlicmFyeQorLSBUaHJpZnQgLSBUaHJpZnQgbGlicmFyeSAKKworIyBSZXVzZWQgY29tcG9uZW50cyAKKy0gLk5FVCBTdGFuZGFyZCAxLjYgKFNESyAyLjAuMCkKKworIyBIb3cgdG8gYnVpbGQgb24gV2luZG93cworLSBHZXQgVGhyaWZ0IElETCBjb21waWxlciBleGVjdXRhYmxlLCBhZGQgdG8gc29tZSBmb2xkZXIgYW5kIGFkZCBwYXRoIHRvIHRoaXMgZm9sZGVyIGludG8gUEFUSCB2YXJpYWJsZQorLSBPcGVuIHRoZSBUaHJpZnQuc2xuIHByb2plY3Qgd2l0aCBWaXN1YWwgU3R1ZGlvIGFuZCBidWlsZC4KK29yIAorLSBCdWlsZCB3aXRoIHNjcmlwdHMKKworIyBIb3cgdG8gYnVpbGQgb24gVW5peAorLSBFbnN1cmUgeW91IGhhdmUgLk5FVCBDb3JlIDIuMC4wIFNESyBpbnN0YWxsZWQgb3IgdXNlIHRoZSBVYnVudHUgWGVuaWFsIGRvY2tlciBpbWFnZQorLSBGb2xsb3cgY29tbW9uIGJ1aWxkIHByYWN0aWNlIGZvciBUaHJpZnQ6IGJvb3RzdHJhcCwgY29uZmlndXJlLCBhbmQgbWFrZQorCisjIEtub3duIGlzc3VlcworLSBJbiB0cmFjZSBsb2dnaW5nIG1vZGUgeW91IGNhbiBzZWUgc29tZSBub3QgaW1wb3J0YW50IGludGVybmFsIGV4Y2VwdGlvbnMKKwpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGVzdHMvVGhyaWZ0LkludGVncmF0aW9uVGVzdHMvLmdpdGlnbm9yZSBiL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5JbnRlZ3JhdGlvblRlc3RzLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI1NGMzMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5JbnRlZ3JhdGlvblRlc3RzLy5naXRpZ25vcmUKQEAgLTAsMCArMSwyIEBACisjIGlnbm9yZSBmb3IgYXV0b2dlbmVyYXRlZCBmaWxlcworL0FwYWNoZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGVzdHMvVGhyaWZ0LkludGVncmF0aW9uVGVzdHMvUHJvdG9jb2xzL1Byb3RvY29sc09wZXJhdGlvbnNUZXN0cy5jcyBiL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5JbnRlZ3JhdGlvblRlc3RzL1Byb3RvY29scy9Qcm90b2NvbHNPcGVyYXRpb25zVGVzdHMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM0YWZhMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5JbnRlZ3JhdGlvblRlc3RzL1Byb3RvY29scy9Qcm90b2NvbHNPcGVyYXRpb25zVGVzdHMuY3MKQEAgLTAsMCArMSw1MDIgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKK3VzaW5nIEtlbGxlcm1hblNvZnR3YXJlLkNvbXBhcmVOZXRPYmplY3RzOwordXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2xzOwordXNpbmcgVGhyaWZ0LlByb3RvY29scy5FbnRpdGllczsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnRzLkNsaWVudDsKKworbmFtZXNwYWNlIFRocmlmdC5JbnRlZ3JhdGlvblRlc3RzLlByb3RvY29scworeworICAgIFtUZXN0Q2xhc3NdCisgICAgcHVibGljIGNsYXNzIFByb3RvY29sc09wZXJhdGlvbnNUZXN0cworICAgIHsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBDb21wYXJlTG9naWMgX2NvbXBhcmVMb2dpYyA9IG5ldyBDb21wYXJlTG9naWMoKTsKKworICAgICAgICBbRGF0YVRlc3RNZXRob2RdCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQmluYXJ5UHJvdG9jb2wpLCBUTWVzc2FnZVR5cGUuQ2FsbCldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQmluYXJ5UHJvdG9jb2wpLCBUTWVzc2FnZVR5cGUuRXhjZXB0aW9uKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRCaW5hcnlQcm90b2NvbCksIFRNZXNzYWdlVHlwZS5PbmV3YXkpXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEJpbmFyeVByb3RvY29sKSwgVE1lc3NhZ2VUeXBlLlJlcGx5KV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRDb21wYWN0UHJvdG9jb2wpLCBUTWVzc2FnZVR5cGUuQ2FsbCldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQ29tcGFjdFByb3RvY29sKSwgVE1lc3NhZ2VUeXBlLkV4Y2VwdGlvbildCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQ29tcGFjdFByb3RvY29sKSwgVE1lc3NhZ2VUeXBlLk9uZXdheSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQ29tcGFjdFByb3RvY29sKSwgVE1lc3NhZ2VUeXBlLlJlcGx5KV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRKc29uUHJvdG9jb2wpLCBUTWVzc2FnZVR5cGUuQ2FsbCldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUSnNvblByb3RvY29sKSwgVE1lc3NhZ2VUeXBlLkV4Y2VwdGlvbildCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUSnNvblByb3RvY29sKSwgVE1lc3NhZ2VUeXBlLk9uZXdheSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUSnNvblByb3RvY29sKSwgVE1lc3NhZ2VUeXBlLlJlcGx5KV0KKyAgICAgICAgcHVibGljIGFzeW5jIFRhc2sgV3JpdGVSZWFkTWVzc2FnZV9UZXN0KFR5cGUgcHJvdG9jb2xUeXBlLCBUTWVzc2FnZVR5cGUgbWVzc2FnZVR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBleHBlY3RlZCA9IG5ldyBUTWVzc2FnZShuYW1lb2YoVE1lc3NhZ2UpLCBtZXNzYWdlVHlwZSwgMSk7CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB0dXBsZSA9IEdldFByb3RvY29sSW5zdGFuY2UocHJvdG9jb2xUeXBlKTsKKyAgICAgICAgICAgICAgICB1c2luZyAodmFyIHN0cmVhbSA9IHR1cGxlLkl0ZW0xKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHByb3RvY29sID0gdHVwbGUuSXRlbTI7CisKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuV3JpdGVNZXNzYWdlQmVnaW5Bc3luYyhleHBlY3RlZCk7CisgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLldyaXRlTWVzc2FnZUVuZEFzeW5jKCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtLlNlZWsoMCwgU2Vla09yaWdpbi5CZWdpbik7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGFjdHVhbE1lc3NhZ2UgPSBhd2FpdCBwcm90b2NvbC5SZWFkTWVzc2FnZUJlZ2luQXN5bmMoKTsKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuUmVhZE1lc3NhZ2VFbmRBc3luYygpOworCisgICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBfY29tcGFyZUxvZ2ljLkNvbXBhcmUoZXhwZWN0ZWQsIGFjdHVhbE1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHJlc3VsdC5BcmVFcXVhbCwgcmVzdWx0LkRpZmZlcmVuY2VzU3RyaW5nKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigkIkV4Y2VwdGlvbiBkdXJpbmcgdGVzdGluZyBvZiBwcm90b2NvbDoge3Byb3RvY29sVHlwZS5GdWxsTmFtZX0iLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFtEYXRhVGVzdE1ldGhvZF0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRCaW5hcnlQcm90b2NvbCkpXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVENvbXBhY3RQcm90b2NvbCkpXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEpzb25Qcm90b2NvbCkpXQorICAgICAgICBbRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKEV4Y2VwdGlvbikpXQorICAgICAgICBwdWJsaWMgYXN5bmMgVGFzayBXcml0ZVJlYWRTdHJ1Y3RfVGVzdChUeXBlIHByb3RvY29sVHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGV4cGVjdGVkID0gbmV3IFRTdHJ1Y3QobmFtZW9mKFRTdHJ1Y3QpKTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHR1cGxlID0gR2V0UHJvdG9jb2xJbnN0YW5jZShwcm90b2NvbFR5cGUpOworICAgICAgICAgICAgICAgIHVzaW5nICh2YXIgc3RyZWFtID0gdHVwbGUuSXRlbTEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgcHJvdG9jb2wgPSB0dXBsZS5JdGVtMjsKKworICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5Xcml0ZVN0cnVjdEJlZ2luQXN5bmMoZXhwZWN0ZWQpOworICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5Xcml0ZVN0cnVjdEVuZEFzeW5jKCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtPy5TZWVrKDAsIFNlZWtPcmlnaW4uQmVnaW4pOworCisgICAgICAgICAgICAgICAgICAgIHZhciBhY3R1YWwgPSBhd2FpdCBwcm90b2NvbC5SZWFkU3RydWN0QmVnaW5Bc3luYygpOworICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5SZWFkU3RydWN0RW5kQXN5bmMoKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2NvbXBhcmVMb2dpYy5Db21wYXJlKGV4cGVjdGVkLCBhY3R1YWwpOworICAgICAgICAgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHJlc3VsdC5BcmVFcXVhbCwgcmVzdWx0LkRpZmZlcmVuY2VzU3RyaW5nKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCQiRXhjZXB0aW9uIGR1cmluZyB0ZXN0aW5nIG9mIHByb3RvY29sOiB7cHJvdG9jb2xUeXBlLkZ1bGxOYW1lfSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgW0RhdGFUZXN0TWV0aG9kXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEJpbmFyeVByb3RvY29sKSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQ29tcGFjdFByb3RvY29sKSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUSnNvblByb3RvY29sKSldCisgICAgICAgIFtFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoRXhjZXB0aW9uKSldCisgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrIFdyaXRlUmVhZEZpZWxkX1Rlc3QoVHlwZSBwcm90b2NvbFR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBleHBlY3RlZCA9IG5ldyBURmllbGQobmFtZW9mKFRGaWVsZCksIFRUeXBlLlN0cmluZywgMSk7CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB0dXBsZSA9IEdldFByb3RvY29sSW5zdGFuY2UocHJvdG9jb2xUeXBlKTsKKyAgICAgICAgICAgICAgICB1c2luZyAodmFyIHN0cmVhbSA9IHR1cGxlLkl0ZW0xKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHByb3RvY29sID0gdHVwbGUuSXRlbTI7CisKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuV3JpdGVGaWVsZEJlZ2luQXN5bmMoZXhwZWN0ZWQpOworICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5Xcml0ZUZpZWxkRW5kQXN5bmMoKTsKKworICAgICAgICAgICAgICAgICAgICBzdHJlYW0/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+CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgY2xhc3MgVFRyYW5zcG9ydEZhY3RvcnkKKyAgICB7CisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIFRDbGllbnRUcmFuc3BvcnQgR2V0VHJhbnNwb3J0KFRDbGllbnRUcmFuc3BvcnQgdHJhbnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0cmFuczsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9idWlsZC5jbWQgYi9saWIvbmV0Y29yZS9idWlsZC5jbWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODYzYzRiNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL2J1aWxkLmNtZApAQCAtMCwwICsxLDI3IEBACitAZWNobyBvZmYKK3JlbSAvKgorcmVtICAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK3JlbSAgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorcmVtICAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCityZW0gICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCityZW0gICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorcmVtICAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKK3JlbSAgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKK3JlbSAgKgorcmVtICAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCityZW0gICoKK3JlbSAgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCityZW0gICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KK3JlbSAgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKK3JlbSAgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorcmVtICAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKK3JlbSAgKiB1bmRlciB0aGUgTGljZW5zZS4KK3JlbSAgKi8KKworc2V0bG9jYWwKKwordGhyaWZ0IC12ZXJzaW9uCitkb3RuZXQgLS1pbmZvCitkb3RuZXQgYnVpbGQgCisKKzplb2YKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL2J1aWxkLnNoIGIvbGliL25ldGNvcmUvYnVpbGQuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWUxOGJjZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL2J1aWxkLnNoCkBAIC0wLDAgKzEsMzIgQEAKKyMhL3Vzci9iaW4vZW52IGJhc2gKKworIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyNleGl0IGlmIGFueSBjb21tYW5kIGZhaWxzCisjc2V0IC1lCisKK3RocmlmdCAtLXZlcnNpb24KK2RvdG5ldCAtLWluZm8KK2RvdG5ldCBidWlsZCAKKworI3JldmlzaW9uPSR7VFJBVklTX0pPQl9JRDo9MX0gIAorI3JldmlzaW9uPSQocHJpbnRmICIlMDRkIiAkcmV2aXNpb24pIAorCisjZG90bmV0IHBhY2sgLi9zcmMvUFJPSkVDVF9OQU1FIC1jIFJlbGVhc2UgLW8gLi9hcnRpZmFjdHMgLS12ZXJzaW9uLXN1ZmZpeD0kcmV2aXNpb24gIApkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvcnVudGVzdHMuY21kIGIvbGliL25ldGNvcmUvcnVudGVzdHMuY21kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxMTRiYzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9ydW50ZXN0cy5jbWQKQEAgLTAsMCArMSwyOCBAQAorQGVjaG8gb2ZmCityZW0gLyoKK3JlbSAgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCityZW0gICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKK3JlbSAgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorcmVtICAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorcmVtICAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKK3JlbSAgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCityZW0gICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CityZW0gICoKK3JlbSAgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorcmVtICAqCityZW0gICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorcmVtICAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCityZW0gICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCityZW0gICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKK3JlbSAgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCityZW0gICogdW5kZXIgdGhlIExpY2Vuc2UuCityZW0gICovCitzZXRsb2NhbAorCit0aHJpZnQgLXZlcnNpb24KK2RvdG5ldCAtLWluZm8KKworZG90bmV0IHRlc3QgVGVzdHNcVGhyaWZ0LkludGVncmF0aW9uVGVzdHNcVGhyaWZ0LkludGVncmF0aW9uVGVzdHMuY3Nwcm9qCitkb3RuZXQgdGVzdCBUZXN0c1xUaHJpZnQuVGVzdHNcVGhyaWZ0LlRlc3RzLmNzcHJvagorCis6ZW9mCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9ydW50ZXN0cy5zaCBiL2xpYi9uZXRjb3JlL3J1bnRlc3RzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyNmNjMzYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9ydW50ZXN0cy5zaApAQCAtMCwwICsxLDI2IEBACisjIS91c3IvYmluL2VudiBiYXNoCisKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCit0aHJpZnQgLXZlcnNpb24KK2RvdG5ldCAtLWluZm8KKworZG90bmV0IHRlc3QgVGVzdHNcVGhyaWZ0LkludGVncmF0aW9uVGVzdHNcVGhyaWZ0LkludGVncmF0aW9uVGVzdHMuY3Nwcm9qCitkb3RuZXQgdGVzdCBUZXN0c1xUaHJpZnQuVGVzdHNcVGhyaWZ0LlRlc3RzLmNzcHJvagpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvTWFrZWZpbGUuYW0gYi9saWIvbm9kZWpzL01ha2VmaWxlLmFtCmluZGV4IDM4Njg5MDUuLjY4ZWEzZWEgMTAwNzU1Ci0tLSBhL2xpYi9ub2RlanMvTWFrZWZpbGUuYW0KKysrIGIvbGliL25vZGVqcy9NYWtlZmlsZS5hbQpAQCAtMTUsMjQgKzE1LDI5IEBACiAjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKKyMgV2UgY2FsbCBucG0gdHdpY2UgdG8gd29yayBhcm91bmQgbnBtIGlzc3VlcwogCi1USFJJRlQgPSAkKHRvcF9zcmNkaXIpL2NvbXBpbGVyL2NwcC90aHJpZnQKK3N0dWJzOiAkKHRvcF9zcmNkaXIpL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKKwkkKFRIUklGVCkgLS1nZW4ganM6bm9kZSAtbyB0ZXN0LyAkKHRvcF9zcmNkaXIpL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKIAotI3N0dWJzOiAkKHRvcF9zcmNkaXIpL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKLSMJJChUSFJJRlQpIC0tZ2VuIGpzOm5vZGUgLW8gdGVzdC8gJCh0b3Bfc3JjZGlyKS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CitkZXBzOiAkKHRvcF9zcmNkaXIpL3BhY2thZ2UuanNvbgorCSQoTlBNKSBpbnN0YWxsICQodG9wX3NyY2RpcikvIHx8ICQoTlBNKSBpbnN0YWxsICQodG9wX3NyY2RpcikvCiAKLWRlcHM6IHBhY2thZ2UuanNvbgotCSQoTlBNKSBpbnN0YWxsIC0tbm8tYmluLWxpbmtzCithbGwtbG9jYWw6IGRlcHMKIAorcHJlY3Jvc3M6IGRlcHMgc3R1YnMKKworIyBUT0RPOiBMaW50IG5vZGVqcyBsaWIgYW5kIGdlbi1jb2RlIGFzIHBhcnQgb2YgYnVpbGQKIGNoZWNrOiBkZXBzCi0JJChOUE0pIHRlc3QKKwljZCAkKHRvcF9zcmNkaXIpICYmICQoTlBNKSB0ZXN0ICYmICQoTlBNKSBydW4gbGludC10ZXN0cyAmJiBjZCBsaWIvbm9kZWpzCiAKIGNsZWFuLWxvY2FsOgogCSQoUk0pIC1yIHRlc3QvZ2VuLW5vZGVqcworCSQoUk0pIC1yICQodG9wX3NyY2Rpcikvbm9kZV9tb2R1bGVzCiAKIEVYVFJBX0RJU1QgPSBcCiAJZXhhbXBsZXMgXAogCWxpYiBcCi0JcGFja2FnZS5qc29uIFwKIAl0ZXN0IFwKKwljb2Rpbmdfc3RhbmRhcmRzLm1kIFwKIAlSRUFETUUubWQKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvUkVBRE1FLm1kIGIvbGliL25vZGVqcy9SRUFETUUubWQKaW5kZXggMjJjN2NhYS4uNTBhY2ZiZCAxMDA2NDQKLS0tIGEvbGliL25vZGVqcy9SRUFETUUubWQKKysrIGIvbGliL25vZGVqcy9SRUFETUUubWQKQEAgLTIwLDYgKzIwLDkgQEAKIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKIHVuZGVyIHRoZSBMaWNlbnNlLgogCisjIyBDb21wYXRpYmlsaXR5CisKK25vZGUgdmVyc2lvbiA2IG9yIGxhdGVyIGlzIHJlcXVpcmVkCiAKICMjIEluc3RhbGwKIApAQCAtMzUsMzUgKzM4LDMzIEBACiAKIEhlcmUgaXMgYSBDYXNzYW5kcmEgZXhhbXBsZToKIAotICAgIHZhciB0aHJpZnQgPSByZXF1aXJlKCd0aHJpZnQnKSwKLSAgICAgICAgQ2Fzc2FuZHJhID0gcmVxdWlyZSgnLi9nZW4tbm9kZWpzL0Nhc3NhbmRyYScpCi0gICAgICAgIHR0eXBlcyA9IHJlcXVpcmUoJy4vZ2VuLW5vZGVqcy9jYXNzYW5kcmFfdHlwZXMnKTsKK2BgYGpzCit2YXIgdGhyaWZ0ID0gcmVxdWlyZSgndGhyaWZ0JyksCisgICAgQ2Fzc2FuZHJhID0gcmVxdWlyZSgnLi9nZW4tbm9kZWpzL0Nhc3NhbmRyYScpCisgICAgdHR5cGVzID0gcmVxdWlyZSgnLi9nZW4tbm9kZWpzL2Nhc3NhbmRyYV90eXBlcycpOwogCi0gICAgdmFyIGNvbm5lY3Rpb24gPSB0aHJpZnQuY3JlYXRlQ29ubmVjdGlvbigibG9jYWxob3N0IiwgOTE2MCksCi0gICAgICAgIGNsaWVudCA9IHRocmlmdC5jcmVhdGVDbGllbnQoQ2Fzc2FuZHJhLCBjb25uZWN0aW9uKTsKK3ZhciBjb25uZWN0aW9uID0gdGhyaWZ0LmNyZWF0ZUNvbm5lY3Rpb24oImxvY2FsaG9zdCIsIDkxNjApLAorICAgIGNsaWVudCA9IHRocmlmdC5jcmVhdGVDbGllbnQoQ2Fzc2FuZHJhLCBjb25uZWN0aW9uKTsKIAotICAgIGNvbm5lY3Rpb24ub24oJ2Vycm9yJywgZnVuY3Rpb24oZXJyKSB7Ci0gICAgICBjb25zb2xlLmVycm9yKGVycik7Ci0gICAgfSk7Citjb25uZWN0aW9uLm9uKCdlcnJvcicsIGZ1bmN0aW9uKGVycikgeworICBjb25zb2xlLmVycm9yKGVycik7Cit9KTsKIAotICAgIGNsaWVudC5nZXRfc2xpY2UoIktleXNwYWNlIiwgImtleSIsIG5ldyB0dHlwZXMuQ29sdW1uUGFyZW50KHtjb2x1bW5fZmFtaWx5OiAiRXhhbXBsZUNGIn0pLCBuZXcgdHR5cGVzLlNsaWNlUHJlZGljYXRlKHtzbGljZV9yYW5nZTogbmV3IHR0eXBlcy5TbGljZVJhbmdlKHtzdGFydDogJycsIGZpbmlzaDogJyd9KX0pLCB0dHlwZXMuQ29uc2lzdGVuY3lMZXZlbC5PTkUsIGZ1bmN0aW9uKGVyciwgZGF0YSkgewotICAgICAgaWYgKGVycikgewotICAgICAgICAvLyBoYW5kbGUgZXJyCi0gICAgICB9IGVsc2UgewotICAgICAgICAvLyBkYXRhID09IFt0dHlwZXMuQ29sdW1uT3JTdXBlckNvbHVtbiwgLi4uXQotICAgICAgfQotICAgICAgY29ubmVjdGlvbi5lbmQoKTsKLSAgICB9KTsKK2NsaWVudC5nZXRfc2xpY2UoIktleXNwYWNlIiwgImtleSIsIG5ldyB0dHlwZXMuQ29sdW1uUGFyZW50KHtjb2x1bW5fZmFtaWx5OiAiRXhhbXBsZUNGIn0pLCBuZXcgdHR5cGVzLlNsaWNlUHJlZGljYXRlKHtzbGljZV9yYW5nZTogbmV3IHR0eXBlcy5TbGljZVJhbmdlKHtzdGFydDogJycsIGZpbmlzaDogJyd9KX0pLCB0dHlwZXMuQ29uc2lzdGVuY3lMZXZlbC5PTkUsIGZ1bmN0aW9uKGVyciwgZGF0YSkgeworICBpZiAoZXJyKSB7CisgICAgLy8gaGFuZGxlIGVycgorICB9IGVsc2UgeworICAgIC8vIGRhdGEgPT0gW3R0eXBlcy5Db2x1bW5PclN1cGVyQ29sdW1uLCAuLi5dCisgIH0KKyAgY29ubmVjdGlvbi5lbmQoKTsKK30pOworYGBgCiAKIDxhIG5hbWU9ImludDY0Ij48L2E+CiAjIyBJbnQ2NAogCi1TaW5jZSBKYXZhU2NyaXB0IHJlcHJlc2VudHMgYWxsIG51bWJlcnMgYXMgZG91YmxlcywgaW50NjQgdmFsdWVzIGNhbm5vdCBiZSBhY2N1cmF0ZWx5IHJlcHJlc2VudGVkIG5hdHVyYWxseS4gVG8gc29sdmUgdGhpcywgaW50NjQgdmFsdWVzIGluIHJlc3BvbnNlcyB3aWxsIGJlIHdyYXBwZWQgd2l0aCBUaGlyZnQuSW50NjQgb2JqZWN0cy4gVGhlIEludDY0IGltcGxlbWVudGF0aW9uIHVzZWQgaXMgW2Jyb29mYS9ub2RlLWludDY0XShodHRwczovL2dpdGh1Yi5jb20vYnJvb2ZhL25vZGUtaW50NjQpLgorU2luY2UgSmF2YVNjcmlwdCByZXByZXNlbnRzIGFsbCBudW1iZXJzIGFzIGRvdWJsZXMsIGludDY0IHZhbHVlcyBjYW5ub3QgYmUgYWNjdXJhdGVseSByZXByZXNlbnRlZCBuYXR1cmFsbHkuIFRvIHNvbHZlIHRoaXMsIGludDY0IHZhbHVlcyBpbiByZXNwb25zZXMgd2lsbCBiZSB3cmFwcGVkIHdpdGggVGhyaWZ0LkludDY0IG9iamVjdHMuIFRoZSBJbnQ2NCBpbXBsZW1lbnRhdGlvbiB1c2VkIGlzIFticm9vZmEvbm9kZS1pbnQ2NF0oaHR0cHM6Ly9naXRodWIuY29tL2Jyb29mYS9ub2RlLWludDY0KS4KIAotIyMgTGlicmFyaWVzIHVzaW5nIG5vZGUtdGhyaWZ0CisjIyBDbGllbnQgYW5kIHNlcnZlciBleGFtcGxlcwogCi0qIFt5dWtpbS9ub2RlX2Nhc3NhbmRyYV0oaHR0cHM6Ly9naXRodWIuY29tL3l1a2ltL25vZGVfY2Fzc2FuZHJhKQotCi0jIyBDdXN0b20gY2xpZW50IGFuZCBzZXJ2ZXIgZXhhbXBsZQotCi1BbiBleGFtcGxlIGJhc2VkIG9uIHRoZSBvbmUgc2hvd24gb24gdGhlIFRocmlmdCBmcm9udCBwYWdlIGlzIGluY2x1ZGVkIGluIHRoZSBleGFtcGxlcy8gZm9sZGVyLgorU2V2ZXJhbCBleGFtcGxlIGNsaWVudHMgYW5kIHNlcnZlcnMgYXJlIGluY2x1ZGVkIGluIHRoZSB0aHJpZnQvbGliL25vZGVqcy9leGFtcGxlcyBmb2xkZXIgYW5kIHRoZSBjcm9zcyBsYW5ndWFnZSB0dXRvcmlhbCB0aHJpZnQvdHV0b3JpYWwvbm9kZWpzIGZvbGRlci4KZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvY29kaW5nX3N0YW5kYXJkcy5tZCBiL2xpYi9ub2RlanMvY29kaW5nX3N0YW5kYXJkcy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTAzOTBiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy9jb2Rpbmdfc3RhbmRhcmRzLm1kCkBAIC0wLDAgKzEgQEAKK1BsZWFzZSBmb2xsb3cgW0dlbmVyYWwgQ29kaW5nIFN0YW5kYXJkc10oL2RvYy9jb2Rpbmdfc3RhbmRhcmRzLm1kKQpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9leGFtcGxlcy9SRUFETUUubWQgYi9saWIvbm9kZWpzL2V4YW1wbGVzL1JFQURNRS5tZAppbmRleCBkYjAxMmRmLi43MzUwYzEwIDEwMDY0NAotLS0gYS9saWIvbm9kZWpzL2V4YW1wbGVzL1JFQURNRS5tZAorKysgYi9saWIvbm9kZWpzL2V4YW1wbGVzL1JFQURNRS5tZApAQCAtMSwzNCArMSw0MCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jIFJ1bm5pbmcgdGhlIHVzZXIgZXhhbXBsZQorIyBUaHJpZnQgTm9kZS5qcyBFeGFtcGxlcwogCi0jR2VuZXJhdGUgdGhlIGJpbmRpbmdzOgotLi4vLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtLWdlbiBqczpub2RlIHVzZXIudGhyaWZ0Ci0uLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC0tZ2VuIGpzOm5vZGUgLS1nZW4gcHkgaGVsbG8udGhyaWZ0CisjIyBMaWNlbnNlCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCitvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQordG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQord2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSNUbyBydW4gdGhlIHVzZXIgZXhhbXBsZSwgZmlyc3Qgc3RhcnQgdXAgdGhlIHNlcnZlciBpbiBvbmUgdGVybWluYWw6Ci1OT0RFX1BBVEg9Li4vbGliOi4uL2xpYi90aHJpZnQgbm9kZSBzZXJ2ZXIuanMKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKLSNOb3cgcnVuIHRoZSBjbGllbnQ6Ci1OT0RFX1BBVEg9Li4vbGliOi4uL2xpYi90aHJpZnQgbm9kZSBjbGllbnQuanMKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKK0tJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCitzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCit1bmRlciB0aGUgTGljZW5zZS4KIAotI0ZvciBhbiBleGFtcGxlIHVzaW5nIEphdmFTY3JpcHQgaW4gdGhlIGJyb3dzZXIgdG8gY29ubmVjdCB0byAKLSNhIG5vZGUuanMgc2VydmVyIGxvb2sgYXQgaGVsbG8uaHRtbCwgaGVsbG8uanMgYW5kIGhlbGxvLnRocmlmdAorIyMgUnVubmluZyB0aGUgdXNlciBleGFtcGxlCiAKLSNIVFRQIGV4YW1wbGVzIGFyZSBwcm92aWRlZCBhbHNvOiBodHRwQ2xpZW50LmpzIGFuZCBodHRwU2VydmVyLmpzCi0jWW91IGNhbiB0ZXN0IEhUVFAgY3Jvc3MgcGxhdGZvcm0gd2l0aCB0aGUgaHR0cFNlcnZlci5weSBQeXRob24gc2VydmVyCi0gICAgCitHZW5lcmF0ZSB0aGUgYmluZGluZ3M6CisKKyAgICAuLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC0tZ2VuIGpzOm5vZGUgdXNlci50aHJpZnQKKyAgICAuLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC0tZ2VuIGpzOm5vZGUgLS1nZW4gcHkgaGVsbG8udGhyaWZ0CisKK1RvIHJ1biB0aGUgdXNlciBleGFtcGxlLCBmaXJzdCBzdGFydCB1cCB0aGUgc2VydmVyIGluIG9uZSB0ZXJtaW5hbDoKKworICAgIE5PREVfUEFUSD0uLi9saWI6Li4vbGliL3RocmlmdCBub2RlIHNlcnZlci5qcworCitOb3cgcnVuIHRoZSBjbGllbnQ6CisKKyAgICBOT0RFX1BBVEg9Li4vbGliOi4uL2xpYi90aHJpZnQgbm9kZSBjbGllbnQuanMKKworRm9yIGFuIGV4YW1wbGUgdXNpbmcgSmF2YVNjcmlwdCBpbiB0aGUgYnJvd3NlciB0byBjb25uZWN0IHRvCithIG5vZGUuanMgc2VydmVyIGxvb2sgYXQgaGVsbG8uaHRtbCwgaGVsbG8uanMgYW5kIGhlbGxvLnRocmlmdAorCitIVFRQIGV4YW1wbGVzIGFyZSBwcm92aWRlZCBhbHNvOiBodHRwQ2xpZW50LmpzIGFuZCBodHRwU2VydmVyLmpzCitZb3UgY2FuIHRlc3QgSFRUUCBjcm9zcyBwbGF0Zm9ybSB3aXRoIHRoZSBodHRwU2VydmVyLnB5IFB5dGhvbiBzZXJ2ZXIKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvZXhhbXBsZXMvaHR0cFNlcnZlci5weSBiL2xpYi9ub2RlanMvZXhhbXBsZXMvaHR0cFNlcnZlci5weQppbmRleCBiOGJhNTg2Li5iNzEyZmNkIDEwMDY0NAotLS0gYS9saWIvbm9kZWpzL2V4YW1wbGVzL2h0dHBTZXJ2ZXIucHkKKysrIGIvbGliL25vZGVqcy9leGFtcGxlcy9odHRwU2VydmVyLnB5CkBAIC03LDcgKzcsNyBAQAogCiBjbGFzcyBIZWxsb1N2Y0hhbmRsZXI6CiAgIGRlZiBoZWxsb19mdW5jKHNlbGYpOgotICAgIHByaW50ICJIZWxsbyBDYWxsZWQiCisgICAgcHJpbnQoIkhlbGxvIENhbGxlZCIpCiAgICAgcmV0dXJuICJoZWxsbyBmcm9tIFB5dGhvbiIKIAogcHJvY2Vzc29yID0gSGVsbG9TdmMuUHJvY2Vzc29yKEhlbGxvU3ZjSGFuZGxlcigpKQpAQCAtMTYsNCArMTYsMyBAQAogc2VydmVyID0gVEh0dHBTZXJ2ZXIuVEh0dHBTZXJ2ZXIocHJvY2Vzc29yLCAoImxvY2FsaG9zdCIsIHBvcnQpLCBwcm90b0ZhY3RvcnkpCiBwcmludCAiUHl0aG9uIHNlcnZlciBydW5uaW5nIG9uIHBvcnQgIiArIHN0cihwb3J0KQogc2VydmVyLnNlcnZlKCkKLQpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9saWIvdGhyaWZ0L2JpbmFyeV9wcm90b2NvbC5qcyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9iaW5hcnlfcHJvdG9jb2wuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU3YzhjNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9iaW5hcnlfcHJvdG9jb2wuanMKQEAgLTAsMCArMSwzNjUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordmFyIGxvZyA9IHJlcXVpcmUoJy4vbG9nJyk7Cit2YXIgYmluYXJ5ID0gcmVxdWlyZSgnLi9iaW5hcnknKTsKK3ZhciBJbnQ2NCA9IHJlcXVpcmUoJ25vZGUtaW50NjQnKTsKK3ZhciBUaHJpZnQgPSByZXF1aXJlKCcuL3RocmlmdCcpOwordmFyIFR5cGUgPSBUaHJpZnQuVHlwZTsKKworbW9kdWxlLmV4cG9ydHMgPSBUQmluYXJ5UHJvdG9jb2w7CisKKy8vIEphdmFTY3JpcHQgc3VwcG9ydHMgb25seSBudW1lcmljIGRvdWJsZXMsIHRoZXJlZm9yZSBldmVuIGhleCB2YWx1ZXMgYXJlIGFsd2F5cyBzaWduZWQuCisvLyBUaGUgbGFyZ2VzdCBpbnRlZ2VyIHZhbHVlIHdoaWNoIGNhbiBiZSByZXByZXNlbnRlZCBpbiBKYXZhU2NyaXB0IGlzICsvLTJeNTMuCisvLyBCaXR3aXNlIG9wZXJhdGlvbnMgY29udmVydCBudW1iZXJzIHRvIDMyIGJpdCBpbnRlZ2VycyBidXQgcGVyZm9ybSBzaWduIGV4dGVuc2lvbgorLy8gdXBvbiBhc3NpZ25pbmcgdmFsdWVzIGJhY2sgdG8gdmFyaWFibGVzLgordmFyIFZFUlNJT05fTUFTSyA9IC02NTUzNiwgICAvLyAweGZmZmYwMDAwCisgICAgVkVSU0lPTl8xID0gLTIxNDc0MTgxMTIsIC8vIDB4ODAwMTAwMDAKKyAgICBUWVBFX01BU0sgPSAweDAwMDAwMGZmOworCitmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2wodHJhbnMsIHN0cmljdFJlYWQsIHN0cmljdFdyaXRlKSB7CisgIHRoaXMudHJhbnMgPSB0cmFuczsKKyAgdGhpcy5zdHJpY3RSZWFkID0gKHN0cmljdFJlYWQgIT09IHVuZGVmaW5lZCA/IHN0cmljdFJlYWQgOiBmYWxzZSk7CisgIHRoaXMuc3RyaWN0V3JpdGUgPSAoc3RyaWN0V3JpdGUgIT09IHVuZGVmaW5lZCA/IHN0cmljdFdyaXRlIDogdHJ1ZSk7CisgIHRoaXMuX3NlcWlkID0gbnVsbDsKK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUuZmx1c2ggPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIHRoaXMudHJhbnMuZmx1c2goKTsKK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUud3JpdGVNZXNzYWdlQmVnaW4gPSBmdW5jdGlvbihuYW1lLCB0eXBlLCBzZXFpZCkgeworICAgIGlmICh0aGlzLnN0cmljdFdyaXRlKSB7CisgICAgICB0aGlzLndyaXRlSTMyKFZFUlNJT05fMSB8IHR5cGUpOworICAgICAgdGhpcy53cml0ZVN0cmluZyhuYW1lKTsKKyAgICAgIHRoaXMud3JpdGVJMzIoc2VxaWQpOworICAgIH0gZWxzZSB7CisgICAgICB0aGlzLndyaXRlU3RyaW5nKG5hbWUpOworICAgICAgdGhpcy53cml0ZUJ5dGUodHlwZSk7CisgICAgICB0aGlzLndyaXRlSTMyKHNlcWlkKTsKKyAgICB9CisgICAgLy8gUmVjb3JkIGNsaWVudCBzZXFpZCB0byBmaW5kIGNhbGxiYWNrIGFnYWluCisgICAgaWYgKHRoaXMuX3NlcWlkICE9PSBudWxsKSB7CisgICAgICBsb2cud2FybmluZygnU2VxSWQgYWxyZWFkeSBzZXQnLCB7ICduYW1lJzogbmFtZSB9KTsKKyAgICB9IGVsc2UgeworICAgICAgdGhpcy5fc2VxaWQgPSBzZXFpZDsKKyAgICAgIHRoaXMudHJhbnMuc2V0Q3VyclNlcUlkKHNlcWlkKTsKKyAgICB9Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLndyaXRlTWVzc2FnZUVuZCA9IGZ1bmN0aW9uKCkgeworICAgIGlmICh0aGlzLl9zZXFpZCAhPT0gbnVsbCkgeworICAgICAgICB0aGlzLl9zZXFpZCA9IG51bGw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbG9nLndhcm5pbmcoJ05vIHNlcWlkIHRvIHVuc2V0Jyk7CisgICAgfQorfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZVN0cnVjdEJlZ2luID0gZnVuY3Rpb24obmFtZSkgeworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZVN0cnVjdEVuZCA9IGZ1bmN0aW9uKCkgeworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZUZpZWxkQmVnaW4gPSBmdW5jdGlvbihuYW1lLCB0eXBlLCBpZCkgeworICB0aGlzLndyaXRlQnl0ZSh0eXBlKTsKKyAgdGhpcy53cml0ZUkxNihpZCk7Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLndyaXRlRmllbGRFbmQgPSBmdW5jdGlvbigpIHsKK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUud3JpdGVGaWVsZFN0b3AgPSBmdW5jdGlvbigpIHsKKyAgdGhpcy53cml0ZUJ5dGUoVHlwZS5TVE9QKTsKK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUud3JpdGVNYXBCZWdpbiA9IGZ1bmN0aW9uKGt0eXBlLCB2dHlwZSwgc2l6ZSkgeworICB0aGlzLndyaXRlQnl0ZShrdHlwZSk7CisgIHRoaXMud3JpdGVCeXRlKHZ0eXBlKTsKKyAgdGhpcy53cml0ZUkzMihzaXplKTsKK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUud3JpdGVNYXBFbmQgPSBmdW5jdGlvbigpIHsKK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUud3JpdGVMaXN0QmVnaW4gPSBmdW5jdGlvbihldHlwZSwgc2l6ZSkgeworICB0aGlzLndyaXRlQnl0ZShldHlwZSk7CisgIHRoaXMud3JpdGVJMzIoc2l6ZSk7Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLndyaXRlTGlzdEVuZCA9IGZ1bmN0aW9uKCkgeworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZVNldEJlZ2luID0gZnVuY3Rpb24oZXR5cGUsIHNpemUpIHsKKyAgdGhpcy53cml0ZUJ5dGUoZXR5cGUpOworICB0aGlzLndyaXRlSTMyKHNpemUpOworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZVNldEVuZCA9IGZ1bmN0aW9uKCkgeworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZUJvb2wgPSBmdW5jdGlvbihib29sKSB7CisgIGlmIChib29sKSB7CisgICAgdGhpcy53cml0ZUJ5dGUoMSk7CisgIH0gZWxzZSB7CisgICAgdGhpcy53cml0ZUJ5dGUoMCk7CisgIH0KK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUud3JpdGVCeXRlID0gZnVuY3Rpb24oYikgeworICB0aGlzLnRyYW5zLndyaXRlKG5ldyBCdWZmZXIoW2JdKSk7Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLndyaXRlSTE2ID0gZnVuY3Rpb24oaTE2KSB7CisgIHRoaXMudHJhbnMud3JpdGUoYmluYXJ5LndyaXRlSTE2KG5ldyBCdWZmZXIoMiksIGkxNikpOworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZUkzMiA9IGZ1bmN0aW9uKGkzMikgeworICB0aGlzLnRyYW5zLndyaXRlKGJpbmFyeS53cml0ZUkzMihuZXcgQnVmZmVyKDQpLCBpMzIpKTsKK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUud3JpdGVJNjQgPSBmdW5jdGlvbihpNjQpIHsKKyAgaWYgKGk2NC5idWZmZXIpIHsKKyAgICB0aGlzLnRyYW5zLndyaXRlKGk2NC5idWZmZXIpOworICB9IGVsc2UgeworICAgIHRoaXMudHJhbnMud3JpdGUobmV3IEludDY0KGk2NCkuYnVmZmVyKTsKKyAgfQorfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZURvdWJsZSA9IGZ1bmN0aW9uKGR1YikgeworICB0aGlzLnRyYW5zLndyaXRlKGJpbmFyeS53cml0ZURvdWJsZShuZXcgQnVmZmVyKDgpLCBkdWIpKTsKK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUud3JpdGVTdHJpbmdPckJpbmFyeSA9IGZ1bmN0aW9uKG5hbWUsIGVuY29kaW5nLCBhcmcpIHsKKyAgaWYgKHR5cGVvZihhcmcpID09PSAnc3RyaW5nJykgeworICAgIHRoaXMud3JpdGVJMzIoQnVmZmVyLmJ5dGVMZW5ndGgoYXJnLCBlbmNvZGluZykpOworICAgIHRoaXMudHJhbnMud3JpdGUobmV3IEJ1ZmZlcihhcmcsIGVuY29kaW5nKSk7CisgIH0gZWxzZSBpZiAoKGFyZyBpbnN0YW5jZW9mIEJ1ZmZlcikgfHwKKyAgICAgICAgICAgICAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGFyZykgPT0gJ1tvYmplY3QgVWludDhBcnJheV0nKSkgeworICAgIC8vIEJ1ZmZlcnMgaW4gTm9kZS5qcyB1bmRlciBCcm93c2VyaWZ5IG1heSBleHRlbmQgVUludDhBcnJheSBpbnN0ZWFkIG9mCisgICAgLy8gZGVmaW5pbmcgYSBuZXcgb2JqZWN0LiBXZSBkZXRlY3QgdGhlbSBoZXJlIHNvIHdlIGNhbiB3cml0ZSB0aGVtCisgICAgLy8gY29ycmVjdGx5CisgICAgdGhpcy53cml0ZUkzMihhcmcubGVuZ3RoKTsKKyAgICB0aGlzLnRyYW5zLndyaXRlKGFyZyk7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgbmV3IEVycm9yKG5hbWUgKyAnIGNhbGxlZCB3aXRob3V0IGEgc3RyaW5nL0J1ZmZlciBhcmd1bWVudDogJyArIGFyZyk7CisgIH0KK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUud3JpdGVTdHJpbmcgPSBmdW5jdGlvbihhcmcpIHsKKyAgdGhpcy53cml0ZVN0cmluZ09yQmluYXJ5KCd3cml0ZVN0cmluZycsICd1dGY4JywgYXJnKTsKK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUud3JpdGVCaW5hcnkgPSBmdW5jdGlvbihhcmcpIHsKKyAgdGhpcy53cml0ZVN0cmluZ09yQmluYXJ5KCd3cml0ZUJpbmFyeScsICdiaW5hcnknLCBhcmcpOworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS5yZWFkTWVzc2FnZUJlZ2luID0gZnVuY3Rpb24oKSB7CisgIHZhciBzeiA9IHRoaXMucmVhZEkzMigpOworICB2YXIgdHlwZSwgbmFtZSwgc2VxaWQ7CisKKyAgaWYgKHN6IDwgMCkgeworICAgIHZhciB2ZXJzaW9uID0gc3ogJiBWRVJTSU9OX01BU0s7CisgICAgaWYgKHZlcnNpb24gIT0gVkVSU0lPTl8xKSB7CisgICAgICB0aHJvdyBuZXcgVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvbihUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uVHlwZS5CQURfVkVSU0lPTiwgIkJhZCB2ZXJzaW9uIGluIHJlYWRNZXNzYWdlQmVnaW46ICIgKyBzeik7CisgICAgfQorICAgIHR5cGUgPSBzeiAmIFRZUEVfTUFTSzsKKyAgICBuYW1lID0gdGhpcy5yZWFkU3RyaW5nKCk7CisgICAgc2VxaWQgPSB0aGlzLnJlYWRJMzIoKTsKKyAgfSBlbHNlIHsKKyAgICBpZiAodGhpcy5zdHJpY3RSZWFkKSB7CisgICAgICB0aHJvdyBuZXcgVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvbihUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uVHlwZS5CQURfVkVSU0lPTiwgIk5vIHByb3RvY29sIHZlcnNpb24gaGVhZGVyIik7CisgICAgfQorICAgIG5hbWUgPSB0aGlzLnRyYW5zLnJlYWQoc3opOworICAgIHR5cGUgPSB0aGlzLnJlYWRCeXRlKCk7CisgICAgc2VxaWQgPSB0aGlzLnJlYWRJMzIoKTsKKyAgfQorICByZXR1cm4ge2ZuYW1lOiBuYW1lLCBtdHlwZTogdHlwZSwgcnNlcWlkOiBzZXFpZH07Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLnJlYWRNZXNzYWdlRW5kID0gZnVuY3Rpb24oKSB7Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLnJlYWRTdHJ1Y3RCZWdpbiA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4ge2ZuYW1lOiAnJ307Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLnJlYWRTdHJ1Y3RFbmQgPSBmdW5jdGlvbigpIHsKK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUucmVhZEZpZWxkQmVnaW4gPSBmdW5jdGlvbigpIHsKKyAgdmFyIHR5cGUgPSB0aGlzLnJlYWRCeXRlKCk7CisgIGlmICh0eXBlID09IFR5cGUuU1RPUCkgeworICAgIHJldHVybiB7Zm5hbWU6IG51bGwsIGZ0eXBlOiB0eXBlLCBmaWQ6IDB9OworICB9CisgIHZhciBpZCA9IHRoaXMucmVhZEkxNigpOworICByZXR1cm4ge2ZuYW1lOiBudWxsLCBmdHlwZTogdHlwZSwgZmlkOiBpZH07Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLnJlYWRGaWVsZEVuZCA9IGZ1bmN0aW9uKCkgeworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS5yZWFkTWFwQmVnaW4gPSBmdW5jdGlvbigpIHsKKyAgdmFyIGt0eXBlID0gdGhpcy5yZWFkQnl0ZSgpOworICB2YXIgdnR5cGUgPSB0aGlzLnJlYWRCeXRlKCk7CisgIHZhciBzaXplID0gdGhpcy5yZWFkSTMyKCk7CisgIHJldHVybiB7a3R5cGU6IGt0eXBlLCB2dHlwZTogdnR5cGUsIHNpemU6IHNpemV9OworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS5yZWFkTWFwRW5kID0gZnVuY3Rpb24oKSB7Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLnJlYWRMaXN0QmVnaW4gPSBmdW5jdGlvbigpIHsKKyAgdmFyIGV0eXBlID0gdGhpcy5yZWFkQnl0ZSgpOworICB2YXIgc2l6ZSA9IHRoaXMucmVhZEkzMigpOworICByZXR1cm4ge2V0eXBlOiBldHlwZSwgc2l6ZTogc2l6ZX07Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLnJlYWRMaXN0RW5kID0gZnVuY3Rpb24oKSB7Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLnJlYWRTZXRCZWdpbiA9IGZ1bmN0aW9uKCkgeworICB2YXIgZXR5cGUgPSB0aGlzLnJlYWRCeXRlKCk7CisgIHZhciBzaXplID0gdGhpcy5yZWFkSTMyKCk7CisgIHJldHVybiB7ZXR5cGU6IGV0eXBlLCBzaXplOiBzaXplfTsKK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUucmVhZFNldEVuZCA9IGZ1bmN0aW9uKCkgeworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS5yZWFkQm9vbCA9IGZ1bmN0aW9uKCkgeworICB2YXIgYiA9IHRoaXMucmVhZEJ5dGUoKTsKKyAgaWYgKGIgPT09IDApIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLnJlYWRCeXRlID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB0aGlzLnRyYW5zLnJlYWRCeXRlKCk7Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLnJlYWRJMTYgPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIHRoaXMudHJhbnMucmVhZEkxNigpOworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS5yZWFkSTMyID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB0aGlzLnRyYW5zLnJlYWRJMzIoKTsKK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUucmVhZEk2NCA9IGZ1bmN0aW9uKCkgeworICB2YXIgYnVmZiA9IHRoaXMudHJhbnMucmVhZCg4KTsKKyAgcmV0dXJuIG5ldyBJbnQ2NChidWZmKTsKK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUucmVhZERvdWJsZSA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4gdGhpcy50cmFucy5yZWFkRG91YmxlKCk7Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLnJlYWRCaW5hcnkgPSBmdW5jdGlvbigpIHsKKyAgdmFyIGxlbiA9IHRoaXMucmVhZEkzMigpOworICBpZiAobGVuID09PSAwKSB7CisgICAgcmV0dXJuIG5ldyBCdWZmZXIoMCk7CisgIH0KKworICBpZiAobGVuIDwgMCkgeworICAgIHRocm93IG5ldyBUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uKFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb25UeXBlLk5FR0FUSVZFX1NJWkUsICJOZWdhdGl2ZSBiaW5hcnkgc2l6ZSIpOworICB9CisgIHJldHVybiB0aGlzLnRyYW5zLnJlYWQobGVuKTsKK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUucmVhZFN0cmluZyA9IGZ1bmN0aW9uKCkgeworICB2YXIgbGVuID0gdGhpcy5yZWFkSTMyKCk7CisgIGlmIChsZW4gPT09IDApIHsKKyAgICByZXR1cm4gIiI7CisgIH0KKworICBpZiAobGVuIDwgMCkgeworICAgIHRocm93IG5ldyBUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uKFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb25UeXBlLk5FR0FUSVZFX1NJWkUsICJOZWdhdGl2ZSBzdHJpbmcgc2l6ZSIpOworICB9CisgIHJldHVybiB0aGlzLnRyYW5zLnJlYWRTdHJpbmcobGVuKTsKK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUuZ2V0VHJhbnNwb3J0ID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB0aGlzLnRyYW5zOworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS5za2lwID0gZnVuY3Rpb24odHlwZSkgeworICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIFR5cGUuU1RPUDoKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIFR5cGUuQk9PTDoKKyAgICAgIHRoaXMucmVhZEJvb2woKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHlwZS5CWVRFOgorICAgICAgdGhpcy5yZWFkQnl0ZSgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUeXBlLkkxNjoKKyAgICAgIHRoaXMucmVhZEkxNigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUeXBlLkkzMjoKKyAgICAgIHRoaXMucmVhZEkzMigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUeXBlLkk2NDoKKyAgICAgIHRoaXMucmVhZEk2NCgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUeXBlLkRPVUJMRToKKyAgICAgIHRoaXMucmVhZERvdWJsZSgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUeXBlLlNUUklORzoKKyAgICAgIHRoaXMucmVhZFN0cmluZygpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUeXBlLlNUUlVDVDoKKyAgICAgIHRoaXMucmVhZFN0cnVjdEJlZ2luKCk7CisgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICB2YXIgciA9IHRoaXMucmVhZEZpZWxkQmVnaW4oKTsKKyAgICAgICAgaWYgKHIuZnR5cGUgPT09IFR5cGUuU1RPUCkgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHRoaXMuc2tpcChyLmZ0eXBlKTsKKyAgICAgICAgdGhpcy5yZWFkRmllbGRFbmQoKTsKKyAgICAgIH0KKyAgICAgIHRoaXMucmVhZFN0cnVjdEVuZCgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUeXBlLk1BUDoKKyAgICAgIHZhciBtYXBCZWdpbiA9IHRoaXMucmVhZE1hcEJlZ2luKCk7CisgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1hcEJlZ2luLnNpemU7ICsraSkgeworICAgICAgICB0aGlzLnNraXAobWFwQmVnaW4ua3R5cGUpOworICAgICAgICB0aGlzLnNraXAobWFwQmVnaW4udnR5cGUpOworICAgICAgfQorICAgICAgdGhpcy5yZWFkTWFwRW5kKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFR5cGUuU0VUOgorICAgICAgdmFyIHNldEJlZ2luID0gdGhpcy5yZWFkU2V0QmVnaW4oKTsKKyAgICAgIGZvciAodmFyIGkyID0gMDsgaTIgPCBzZXRCZWdpbi5zaXplOyArK2kyKSB7CisgICAgICAgIHRoaXMuc2tpcChzZXRCZWdpbi5ldHlwZSk7CisgICAgICB9CisgICAgICB0aGlzLnJlYWRTZXRFbmQoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHlwZS5MSVNUOgorICAgICAgdmFyIGxpc3RCZWdpbiA9IHRoaXMucmVhZExpc3RCZWdpbigpOworICAgICAgZm9yICh2YXIgaTMgPSAwOyBpMyA8IGxpc3RCZWdpbi5zaXplOyArK2kzKSB7CisgICAgICAgIHRoaXMuc2tpcChsaXN0QmVnaW4uZXR5cGUpOworICAgICAgfQorICAgICAgdGhpcy5yZWFkTGlzdEVuZCgpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93IG5ldyAgRXJyb3IoIkludmFsaWQgdHlwZTogIiArIHR5cGUpOworICB9Cit9OwpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9saWIvdGhyaWZ0L2Jyb3dzZXIuanMgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvYnJvd3Nlci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2NlODUzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L2Jyb3dzZXIuanMKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworZXhwb3J0cy5UaHJpZnQgPSByZXF1aXJlKCcuL3RocmlmdCcpOworCit2YXIgeGhyQ29ubmVjdGlvbiA9IHJlcXVpcmUoJy4veGhyX2Nvbm5lY3Rpb24nKTsKK2V4cG9ydHMuWEhSQ29ubmVjdGlvbiA9IHhockNvbm5lY3Rpb24uWEhSQ29ubmVjdGlvbjsKK2V4cG9ydHMuY3JlYXRlWEhSQ29ubmVjdGlvbiA9IHhockNvbm5lY3Rpb24uY3JlYXRlWEhSQ29ubmVjdGlvbjsKK2V4cG9ydHMuY3JlYXRlWEhSQ2xpZW50ID0geGhyQ29ubmVjdGlvbi5jcmVhdGVYSFJDbGllbnQ7CisKK2V4cG9ydHMuTXVsdGlwbGV4ZXIgPSByZXF1aXJlKCcuL211bHRpcGxleGVkX3Byb3RvY29sJykuTXVsdGlwbGV4ZXI7CisKK2V4cG9ydHMuVFdlYlNvY2tldFRyYW5zcG9ydCA9IHJlcXVpcmUoJy4vd3NfdHJhbnNwb3J0Jyk7CitleHBvcnRzLlRCdWZmZXJlZFRyYW5zcG9ydCA9IHJlcXVpcmUoJy4vYnVmZmVyZWRfdHJhbnNwb3J0Jyk7CitleHBvcnRzLlRGcmFtZWRUcmFuc3BvcnQgPSByZXF1aXJlKCcuL2ZyYW1lZF90cmFuc3BvcnQnKTsKKworZXhwb3J0cy5Qcm90b2NvbCA9IGV4cG9ydHMuVEpTT05Qcm90b2NvbCA9IHJlcXVpcmUoJy4vanNvbl9wcm90b2NvbCcpOworZXhwb3J0cy5UQmluYXJ5UHJvdG9jb2wgPSByZXF1aXJlKCcuL2JpbmFyeV9wcm90b2NvbCcpOworZXhwb3J0cy5UQ29tcGFjdFByb3RvY29sID0gcmVxdWlyZSgnLi9jb21wYWN0X3Byb3RvY29sJyk7CisKK2V4cG9ydHMuSW50NjQgPSByZXF1aXJlKCdub2RlLWludDY0Jyk7CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2xpYi90aHJpZnQvYnVmZmVyZWRfdHJhbnNwb3J0LmpzIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L2J1ZmZlcmVkX3RyYW5zcG9ydC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWUwMDZlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L2J1ZmZlcmVkX3RyYW5zcG9ydC5qcwpAQCAtMCwwICsxLDE4MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit2YXIgYmluYXJ5ID0gcmVxdWlyZSgnLi9iaW5hcnknKTsKK3ZhciBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IgPSByZXF1aXJlKCcuL2lucHV0X2J1ZmZlcl91bmRlcnJ1bl9lcnJvcicpOworCittb2R1bGUuZXhwb3J0cyA9IFRCdWZmZXJlZFRyYW5zcG9ydDsKKworZnVuY3Rpb24gVEJ1ZmZlcmVkVHJhbnNwb3J0KGJ1ZmZlciwgY2FsbGJhY2spIHsKKyAgdGhpcy5kZWZhdWx0UmVhZEJ1ZmZlclNpemUgPSAxMDI0OworICB0aGlzLndyaXRlQnVmZmVyU2l6ZSA9IDUxMjsgLy8gU29mdCBMaW1pdAorICB0aGlzLmluQnVmID0gbmV3IEJ1ZmZlcih0aGlzLmRlZmF1bHRSZWFkQnVmZmVyU2l6ZSk7CisgIHRoaXMucmVhZEN1cnNvciA9IDA7CisgIHRoaXMud3JpdGVDdXJzb3IgPSAwOyAvLyBmb3IgaW5wdXQgYnVmZmVyCisgIHRoaXMub3V0QnVmZmVycyA9IFtdOworICB0aGlzLm91dENvdW50ID0gMDsKKyAgdGhpcy5vbkZsdXNoID0gY2FsbGJhY2s7Cit9OworCitUQnVmZmVyZWRUcmFuc3BvcnQucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24oKSB7CisgIHRoaXMuaW5CdWYgPSBuZXcgQnVmZmVyKHRoaXMuZGVmYXVsdFJlYWRCdWZmZXJTaXplKTsKKyAgdGhpcy5yZWFkQ3Vyc29yID0gMDsKKyAgdGhpcy53cml0ZUN1cnNvciA9IDA7CisgIHRoaXMub3V0QnVmZmVycyA9IFtdOworICB0aGlzLm91dENvdW50ID0gMDsKK30KKworVEJ1ZmZlcmVkVHJhbnNwb3J0LnJlY2VpdmVyID0gZnVuY3Rpb24oY2FsbGJhY2ssIHNlcWlkKSB7CisgIHZhciByZWFkZXIgPSBuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KCk7CisKKyAgcmV0dXJuIGZ1bmN0aW9uKGRhdGEpIHsKKyAgICBpZiAocmVhZGVyLndyaXRlQ3Vyc29yICsgZGF0YS5sZW5ndGggPiByZWFkZXIuaW5CdWYubGVuZ3RoKSB7CisgICAgICB2YXIgYnVmID0gbmV3IEJ1ZmZlcihyZWFkZXIud3JpdGVDdXJzb3IgKyBkYXRhLmxlbmd0aCk7CisgICAgICByZWFkZXIuaW5CdWYuY29weShidWYsIDAsIDAsIHJlYWRlci53cml0ZUN1cnNvcik7CisgICAgICByZWFkZXIuaW5CdWYgPSBidWY7CisgICAgfQorICAgIGRhdGEuY29weShyZWFkZXIuaW5CdWYsIHJlYWRlci53cml0ZUN1cnNvciwgMCk7CisgICAgcmVhZGVyLndyaXRlQ3Vyc29yICs9IGRhdGEubGVuZ3RoOworCisgICAgY2FsbGJhY2socmVhZGVyLCBzZXFpZCk7CisgIH07Cit9OworCisKK1RCdWZmZXJlZFRyYW5zcG9ydC5wcm90b3R5cGUuY29tbWl0UG9zaXRpb24gPSBmdW5jdGlvbigpeworICB2YXIgdW5yZWFkU2l6ZSA9IHRoaXMud3JpdGVDdXJzb3IgLSB0aGlzLnJlYWRDdXJzb3I7CisgIHZhciBidWZTaXplID0gKHVucmVhZFNpemUgKiAyID4gdGhpcy5kZWZhdWx0UmVhZEJ1ZmZlclNpemUpID8KKyAgICB1bnJlYWRTaXplICogMiA6IHRoaXMuZGVmYXVsdFJlYWRCdWZmZXJTaXplOworICB2YXIgYnVmID0gbmV3IEJ1ZmZlcihidWZTaXplKTsKKyAgaWYgKHVucmVhZFNpemUgPiAwKSB7CisgICAgdGhpcy5pbkJ1Zi5jb3B5KGJ1ZiwgMCwgdGhpcy5yZWFkQ3Vyc29yLCB0aGlzLndyaXRlQ3Vyc29yKTsKKyAgfQorICB0aGlzLnJlYWRDdXJzb3IgPSAwOworICB0aGlzLndyaXRlQ3Vyc29yID0gdW5yZWFkU2l6ZTsKKyAgdGhpcy5pbkJ1ZiA9IGJ1ZjsKK307CisKK1RCdWZmZXJlZFRyYW5zcG9ydC5wcm90b3R5cGUucm9sbGJhY2tQb3NpdGlvbiA9IGZ1bmN0aW9uKCl7CisgIHRoaXMucmVhZEN1cnNvciA9IDA7Cit9CisKKyAgLy8gVE9ETzogSW1wbGVtZW50IG9wZW4vY2xvc2Ugc3VwcG9ydAorVEJ1ZmZlcmVkVHJhbnNwb3J0LnByb3RvdHlwZS5pc09wZW4gPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIHRydWU7Cit9OworCitUQnVmZmVyZWRUcmFuc3BvcnQucHJvdG90eXBlLm9wZW4gPSBmdW5jdGlvbigpIHsKK307CisKK1RCdWZmZXJlZFRyYW5zcG9ydC5wcm90b3R5cGUuY2xvc2UgPSBmdW5jdGlvbigpIHsKK307CisKKyAgLy8gU2V0IHRoZSBzZXFpZCBvZiB0aGUgbWVzc2FnZSBpbiB0aGUgY2xpZW50CisgIC8vIFNvIHRoYXQgY2FsbGJhY2tzIGNhbiBiZSBmb3VuZAorVEJ1ZmZlcmVkVHJhbnNwb3J0LnByb3RvdHlwZS5zZXRDdXJyU2VxSWQgPSBmdW5jdGlvbihzZXFpZCkgeworICB0aGlzLl9zZXFpZCA9IHNlcWlkOworfTsKKworVEJ1ZmZlcmVkVHJhbnNwb3J0LnByb3RvdHlwZS5lbnN1cmVBdmFpbGFibGUgPSBmdW5jdGlvbihsZW4pIHsKKyAgaWYgKHRoaXMucmVhZEN1cnNvciArIGxlbiA+IHRoaXMud3JpdGVDdXJzb3IpIHsKKyAgICB0aHJvdyBuZXcgSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yKCk7CisgIH0KK307CisKK1RCdWZmZXJlZFRyYW5zcG9ydC5wcm90b3R5cGUucmVhZCA9IGZ1bmN0aW9uKGxlbikgeworICB0aGlzLmVuc3VyZUF2YWlsYWJsZShsZW4pOworICB2YXIgYnVmID0gbmV3IEJ1ZmZlcihsZW4pOworICB0aGlzLmluQnVmLmNvcHkoYnVmLCAwLCB0aGlzLnJlYWRDdXJzb3IsIHRoaXMucmVhZEN1cnNvciArIGxlbik7CisgIHRoaXMucmVhZEN1cnNvciArPSBsZW47CisgIHJldHVybiBidWY7Cit9OworCitUQnVmZmVyZWRUcmFuc3BvcnQucHJvdG90eXBlLnJlYWRCeXRlID0gZnVuY3Rpb24oKSB7CisgIHRoaXMuZW5zdXJlQXZhaWxhYmxlKDEpOworICByZXR1cm4gYmluYXJ5LnJlYWRCeXRlKHRoaXMuaW5CdWZbdGhpcy5yZWFkQ3Vyc29yKytdKTsKK307CisKK1RCdWZmZXJlZFRyYW5zcG9ydC5wcm90b3R5cGUucmVhZEkxNiA9IGZ1bmN0aW9uKCkgeworICB0aGlzLmVuc3VyZUF2YWlsYWJsZSgyKTsKKyAgdmFyIGkxNiA9IGJpbmFyeS5yZWFkSTE2KHRoaXMuaW5CdWYsIHRoaXMucmVhZEN1cnNvcik7CisgIHRoaXMucmVhZEN1cnNvciArPSAyOworICByZXR1cm4gaTE2OworfTsKKworVEJ1ZmZlcmVkVHJhbnNwb3J0LnByb3RvdHlwZS5yZWFkSTMyID0gZnVuY3Rpb24oKSB7CisgIHRoaXMuZW5zdXJlQXZhaWxhYmxlKDQpOworICB2YXIgaTMyID0gYmluYXJ5LnJlYWRJMzIodGhpcy5pbkJ1ZiwgdGhpcy5yZWFkQ3Vyc29yKTsKKyAgdGhpcy5yZWFkQ3Vyc29yICs9IDQ7CisgIHJldHVybiBpMzI7Cit9OworCitUQnVmZmVyZWRUcmFuc3BvcnQucHJvdG90eXBlLnJlYWREb3VibGUgPSBmdW5jdGlvbigpIHsKKyAgdGhpcy5lbnN1cmVBdmFpbGFibGUoOCk7CisgIHZhciBkID0gYmluYXJ5LnJlYWREb3VibGUodGhpcy5pbkJ1ZiwgdGhpcy5yZWFkQ3Vyc29yKTsKKyAgdGhpcy5yZWFkQ3Vyc29yICs9IDg7CisgIHJldHVybiBkOworfTsKKworVEJ1ZmZlcmVkVHJhbnNwb3J0LnByb3RvdHlwZS5yZWFkU3RyaW5nID0gZnVuY3Rpb24obGVuKSB7CisgIHRoaXMuZW5zdXJlQXZhaWxhYmxlKGxlbik7CisgIHZhciBzdHIgPSB0aGlzLmluQnVmLnRvU3RyaW5nKCd1dGY4JywgdGhpcy5yZWFkQ3Vyc29yLCB0aGlzLnJlYWRDdXJzb3IgKyBsZW4pOworICB0aGlzLnJlYWRDdXJzb3IgKz0gbGVuOworICByZXR1cm4gc3RyOworfTsKKworVEJ1ZmZlcmVkVHJhbnNwb3J0LnByb3RvdHlwZS5ib3Jyb3cgPSBmdW5jdGlvbigpIHsKKyAgdmFyIG9iaiA9IHtidWY6IHRoaXMuaW5CdWYsIHJlYWRJbmRleDogdGhpcy5yZWFkQ3Vyc29yLCB3cml0ZUluZGV4OiB0aGlzLndyaXRlQ3Vyc29yfTsKKyAgcmV0dXJuIG9iajsKK307CisKK1RCdWZmZXJlZFRyYW5zcG9ydC5wcm90b3R5cGUuY29uc3VtZSA9IGZ1bmN0aW9uKGJ5dGVzQ29uc3VtZWQpIHsKKyAgdGhpcy5yZWFkQ3Vyc29yICs9IGJ5dGVzQ29uc3VtZWQ7Cit9OworCitUQnVmZmVyZWRUcmFuc3BvcnQucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24oYnVmKSB7CisgIGlmICh0eXBlb2YoYnVmKSA9PT0gInN0cmluZyIpIHsKKyAgICBidWYgPSBuZXcgQnVmZmVyKGJ1ZiwgJ3V0ZjgnKTsKKyAgfQorICB0aGlzLm91dEJ1ZmZlcnMucHVzaChidWYpOworICB0aGlzLm91dENvdW50ICs9IGJ1Zi5sZW5ndGg7Cit9OworCitUQnVmZmVyZWRUcmFuc3BvcnQucHJvdG90eXBlLmZsdXNoID0gZnVuY3Rpb24oKSB7CisgIC8vIElmIHRoZSBzZXFpZCBvZiB0aGUgY2FsbGJhY2sgaXMgYXZhaWxhYmxlIHBhc3MgaXQgdG8gdGhlIG9uRmx1c2gKKyAgLy8gVGhlbiByZW1vdmUgdGhlIGN1cnJlbnQgc2VxaWQKKyAgdmFyIHNlcWlkID0gdGhpcy5fc2VxaWQ7CisgIHRoaXMuX3NlcWlkID0gbnVsbDsKKworICBpZiAodGhpcy5vdXRDb3VudCA8IDEpIHsKKyAgICByZXR1cm47CisgIH0KKworICB2YXIgbXNnID0gbmV3IEJ1ZmZlcih0aGlzLm91dENvdW50KSwKKyAgICAgIHBvcyA9IDA7CisgIHRoaXMub3V0QnVmZmVycy5mb3JFYWNoKGZ1bmN0aW9uKGJ1ZikgeworICAgIGJ1Zi5jb3B5KG1zZywgcG9zLCAwKTsKKyAgICBwb3MgKz0gYnVmLmxlbmd0aDsKKyAgfSk7CisKKyAgaWYgKHRoaXMub25GbHVzaCkgeworICAgIC8vIFBhc3Npbmcgc2VxaWQgdGhyb3VnaCB0aGlzIGNhbGwgdG8gZ2V0IGl0IHRvIHRoZSBjb25uZWN0aW9uCisgICAgdGhpcy5vbkZsdXNoKG1zZywgc2VxaWQpOworICB9CisKKyAgdGhpcy5vdXRCdWZmZXJzID0gW107CisgIHRoaXMub3V0Q291bnQgPSAwOworfQpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9saWIvdGhyaWZ0L2NvbXBhY3RfcHJvdG9jb2wuanMgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvY29tcGFjdF9wcm90b2NvbC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzUzMWU1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L2NvbXBhY3RfcHJvdG9jb2wuanMKQEAgLTAsMCArMSw5MTcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordmFyIGxvZyA9IHJlcXVpcmUoJy4vbG9nJyk7Cit2YXIgSW50NjQgPSByZXF1aXJlKCdub2RlLWludDY0Jyk7Cit2YXIgVGhyaWZ0ID0gcmVxdWlyZSgnLi90aHJpZnQnKTsKK3ZhciBUeXBlID0gVGhyaWZ0LlR5cGU7CisKK21vZHVsZS5leHBvcnRzID0gVENvbXBhY3RQcm90b2NvbDsKKwordmFyIFBPV184ID0gTWF0aC5wb3coMiwgOCk7Cit2YXIgUE9XXzI0ID0gTWF0aC5wb3coMiwgMjQpOwordmFyIFBPV18zMiA9IE1hdGgucG93KDIsIDMyKTsKK3ZhciBQT1dfNDAgPSBNYXRoLnBvdygyLCA0MCk7Cit2YXIgUE9XXzQ4ID0gTWF0aC5wb3coMiwgNDgpOwordmFyIFBPV181MiA9IE1hdGgucG93KDIsIDUyKTsKK3ZhciBQT1dfMTAyMiA9IE1hdGgucG93KDIsIDEwMjIpOworCisvKioKKyAqIENvbnN0cnVjdG9yIEZ1bmN0aW9uIGZvciB0aGUgQ29tcGFjdCBQcm90b2NvbC4KKyAqIEBjb25zdHJ1Y3RvcgorICogQHBhcmFtIHtvYmplY3R9IFt0cmFuc10gLSBUaGUgdW5kZXJseWluZyB0cmFuc3BvcnQgdG8gcmVhZC93cml0ZS4KKyAqIEBjbGFzc2Rlc2MgVGhlIEFwYWNoZSBUaHJpZnQgUHJvdG9jb2wgbGF5ZXIgcGVyZm9ybXMgc2VyaWFsaXphdGlvbgorICogICAgIG9mIGJhc2UgdHlwZXMsIHRoZSBjb21wYWN0IHByb3RvY29sIHNlcmlhbGl6ZXMgZGF0YSBpbiBiaW5hcnkKKyAqICAgICBmb3JtIHdpdGggbWluaW1hbCBzcGFjZSB1c2VkIGZvciBzY2FsYXIgdmFsdWVzLgorICovCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sKHRyYW5zKSB7CisgIHRoaXMudHJhbnMgPSB0cmFuczsKKyAgdGhpcy5sYXN0RmllbGRfID0gW107CisgIHRoaXMubGFzdEZpZWxkSWRfID0gMDsKKyAgdGhpcy5zdHJpbmdfbGltaXRfID0gMDsKKyAgdGhpcy5zdHJpbmdfYnVmXyA9IG51bGw7CisgIHRoaXMuc3RyaW5nX2J1Zl9zaXplXyA9IDA7CisgIHRoaXMuY29udGFpbmVyX2xpbWl0XyA9IDA7CisgIHRoaXMuYm9vbGVhbkZpZWxkXyA9IHsKKyAgICBuYW1lOiBudWxsLAorICAgIGhhc0Jvb2xWYWx1ZTogZmFsc2UKKyAgfTsKKyAgdGhpcy5ib29sVmFsdWVfID0geworICAgIGhhc0Jvb2xWYWx1ZTogZmFsc2UsCisgICAgYm9vbFZhbHVlOiBmYWxzZQorICB9OworfTsKKworCisvLworLy8gQ29tcGFjdCBQcm90b2NvbCBDb25zdGFudHMKKy8vCisKKy8qKgorICAqIENvbXBhY3QgUHJvdG9jb2wgSUQgbnVtYmVyLgorICAqIEByZWFkb25seQorICAqIEBjb25zdCB7bnVtYmVyfSBQUk9UT0NPTF9JRAorICAqLworVENvbXBhY3RQcm90b2NvbC5QUk9UT0NPTF9JRCA9IC0xMjY7ICAvLzEwMDAgMDAxMAorCisvKioKKyAgKiBDb21wYWN0IFByb3RvY29sIHZlcnNpb24gbnVtYmVyLgorICAqIEByZWFkb25seQorICAqIEBjb25zdCB7bnVtYmVyfSBWRVJTSU9OX04KKyAgKi8KK1RDb21wYWN0UHJvdG9jb2wuVkVSU0lPTl9OID0gMTsKKworLyoqCisgICogQ29tcGFjdCBQcm90b2NvbCB2ZXJzaW9uIG1hc2sgZm9yIGNvbWJpbmluZyBwcm90b2NvbCB2ZXJzaW9uIGFuZCBtZXNzYWdlIHR5cGUgaW4gb25lIGJ5dGUuCisgICogQHJlYWRvbmx5CisgICogQGNvbnN0IHtudW1iZXJ9IFZFUlNJT05fTUFTSworICAqLworVENvbXBhY3RQcm90b2NvbC5WRVJTSU9OX01BU0sgPSAweDFmOyAvLzAwMDEgMTExMQorCisvKioKKyAgKiBDb21wYWN0IFByb3RvY29sIG1lc3NhZ2UgdHlwZSBtYXNrIGZvciBjb21iaW5pbmcgcHJvdG9jb2wgdmVyc2lvbiBhbmQgbWVzc2FnZSB0eXBlIGluIG9uZSBieXRlLgorICAqIEByZWFkb25seQorICAqIEBjb25zdCB7bnVtYmVyfSBUWVBFX01BU0sKKyAgKi8KK1RDb21wYWN0UHJvdG9jb2wuVFlQRV9NQVNLID0gLTMyOyAgICAgLy8xMTEwIDAwMDAKKworLyoqCisgICogQ29tcGFjdCBQcm90b2NvbCBtZXNzYWdlIHR5cGUgYml0cyBmb3IgZW5zdXJpbmcgbWVzc2FnZSB0eXBlIGJpdCBzaXplLgorICAqIEByZWFkb25seQorICAqIEBjb25zdCB7bnVtYmVyfSBUWVBFX0JJVFMKKyAgKi8KK1RDb21wYWN0UHJvdG9jb2wuVFlQRV9CSVRTID0gNzsgLy8wMDAwIDAxMTEKKworLyoqCisgICogQ29tcGFjdCBQcm90b2NvbCBtZXNzYWdlIHR5cGUgc2hpZnQgYW1vdW50IGZvciBjb21iaW5pbmcgcHJvdG9jb2wgdmVyc2lvbiBhbmQgbWVzc2FnZSB0eXBlIGluIG9uZSBieXRlLgorICAqIEByZWFkb25seQorICAqIEBjb25zdCB7bnVtYmVyfSBUWVBFX1NISUZUX0FNT1VOVAorICAqLworVENvbXBhY3RQcm90b2NvbC5UWVBFX1NISUZUX0FNT1VOVCA9IDU7CisKKy8qKgorICogQ29tcGFjdCBQcm90b2NvbCB0eXBlIElEcyB1c2VkIHRvIGtlZXAgdHlwZSBkYXRhIHdpdGhpbiBvbmUgbmliYmxlLgorICogQHJlYWRvbmx5CisgKiBAcHJvcGVydHkge251bWJlcn0gIENUX1NUT1AgICAgICAgICAgLSBFbmQgb2YgYSBzZXQgb2YgZmllbGRzLgorICogQHByb3BlcnR5IHtudW1iZXJ9ICBDVF9CT09MRUFOX1RSVUUgIC0gRmxhZyBmb3IgQm9vbGVhbiBmaWVsZCB3aXRoIHRydWUgdmFsdWUgKHBhY2tlZCBmaWVsZCBhbmQgdmFsdWUpLgorICogQHByb3BlcnR5IHtudW1iZXJ9ICBDVF9CT09MRUFOX0ZBTFNFIC0gRmxhZyBmb3IgQm9vbGVhbiBmaWVsZCB3aXRoIGZhbHNlIHZhbHVlIChwYWNrZWQgZmllbGQgYW5kIHZhbHVlKS4KKyAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgQ1RfQllURSAgICAgICAgICAtIFNpZ25lZCA4IGJpdCBpbnRlZ2VyLgorICogQHByb3BlcnR5IHtudW1iZXJ9ICBDVF9JMTYgICAgICAgICAgIC0gU2lnbmVkIDE2IGJpdCBpbnRlZ2VyLgorICogQHByb3BlcnR5IHtudW1iZXJ9ICBDVF9JMzIgICAgICAgICAgIC0gU2lnbmVkIDMyIGJpdCBpbnRlZ2VyLgorICogQHByb3BlcnR5IHtudW1iZXJ9ICBDVF9JNjQgICAgICAgICAgIC0gU2lnbmVkIDY0IGJpdCBpbnRlZ2VyICgyXjUzIG1heCBpbiBKYXZhU2NyaXB0KS4KKyAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgQ1RfRE9VQkxFICAgICAgICAtIDY0IGJpdCBJRUVFIDg1NCBmbG9hdGluZyBwb2ludC4KKyAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgQ1RfQklOQVJZICAgICAgICAtIEFycmF5IG9mIGJ5dGVzICh1c2VkIGZvciBzdHJpbmdzIGFsc28pLgorICogQHByb3BlcnR5IHtudW1iZXJ9ICBDVF9MSVNUICAgICAgICAgIC0gQSBjb2xsZWN0aW9uIHR5cGUgKHVub3JkZXJlZCkuCisgKiBAcHJvcGVydHkge251bWJlcn0gIENUX1NFVCAgICAgICAgICAgLSBBIGNvbGxlY3Rpb24gdHlwZSAodW5vcmRlcmVkIGFuZCB3aXRob3V0IHJlcGVhdGVkIHZhbHVlcykuCisgKiBAcHJvcGVydHkge251bWJlcn0gIENUX01BUCAgICAgICAgICAgLSBBIGNvbGxlY3Rpb24gdHlwZSAobWFwL2Fzc29jaWF0aXZlLWFycmF5L2RpY3Rpb25hcnkpLgorICogQHByb3BlcnR5IHtudW1iZXJ9ICBDVF9TVFJVQ1QgICAgICAgIC0gQSBtdWx0aWZpZWxkIHR5cGUuCisgKi8KK1RDb21wYWN0UHJvdG9jb2wuVHlwZXMgPSB7CisgIENUX1NUT1A6ICAgICAgICAgICAweDAwLAorICBDVF9CT09MRUFOX1RSVUU6ICAgMHgwMSwKKyAgQ1RfQk9PTEVBTl9GQUxTRTogIDB4MDIsCisgIENUX0JZVEU6ICAgICAgICAgICAweDAzLAorICBDVF9JMTY6ICAgICAgICAgICAgMHgwNCwKKyAgQ1RfSTMyOiAgICAgICAgICAgIDB4MDUsCisgIENUX0k2NDogICAgICAgICAgICAweDA2LAorICBDVF9ET1VCTEU6ICAgICAgICAgMHgwNywKKyAgQ1RfQklOQVJZOiAgICAgICAgIDB4MDgsCisgIENUX0xJU1Q6ICAgICAgICAgICAweDA5LAorICBDVF9TRVQ6ICAgICAgICAgICAgMHgwQSwKKyAgQ1RfTUFQOiAgICAgICAgICAgIDB4MEIsCisgIENUX1NUUlVDVDogICAgICAgICAweDBDCit9OworCisvKioKKyAqIEFycmF5IG1hcHBpbmcgQ29tcGFjdCB0eXBlIElEcyB0byBzdGFuZGFyZCBUaHJpZnQgdHlwZSBJRHMuCisgKiBAcmVhZG9ubHkKKyAqLworVENvbXBhY3RQcm90b2NvbC5UVHlwZVRvQ1R5cGUgPSBbCisgIFRDb21wYWN0UHJvdG9jb2wuVHlwZXMuQ1RfU1RPUCwgICAgICAgICAvLyBUX1NUT1AKKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVudXNlZAorICBUQ29tcGFjdFByb3RvY29sLlR5cGVzLkNUX0JPT0xFQU5fVFJVRSwgLy8gVF9CT09MCisgIFRDb21wYWN0UHJvdG9jb2wuVHlwZXMuQ1RfQllURSwgICAgICAgICAvLyBUX0JZVEUKKyAgVENvbXBhY3RQcm90b2NvbC5UeXBlcy5DVF9ET1VCTEUsICAgICAgIC8vIFRfRE9VQkxFCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1bnVzZWQKKyAgVENvbXBhY3RQcm90b2NvbC5UeXBlcy5DVF9JMTYsICAgICAgICAgIC8vIFRfSTE2CisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1bnVzZWQKKyAgVENvbXBhY3RQcm90b2NvbC5UeXBlcy5DVF9JMzIsICAgICAgICAgIC8vIFRfSTMyCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1bnVzZWQKKyAgVENvbXBhY3RQcm90b2NvbC5UeXBlcy5DVF9JNjQsICAgICAgICAgIC8vIFRfSTY0CisgIFRDb21wYWN0UHJvdG9jb2wuVHlwZXMuQ1RfQklOQVJZLCAgICAgICAvLyBUX1NUUklORworICBUQ29tcGFjdFByb3RvY29sLlR5cGVzLkNUX1NUUlVDVCwgICAgICAgLy8gVF9TVFJVQ1QKKyAgVENvbXBhY3RQcm90b2NvbC5UeXBlcy5DVF9NQVAsICAgICAgICAgIC8vIFRfTUFQCisgIFRDb21wYWN0UHJvdG9jb2wuVHlwZXMuQ1RfU0VULCAgICAgICAgICAvLyBUX1NFVAorICBUQ29tcGFjdFByb3RvY29sLlR5cGVzLkNUX0xJU1QsICAgICAgICAgLy8gVF9MSVNUCitdOworCisKKy8vCisvLyBDb21wYWN0IFByb3RvY29sIFV0aWxpdGllcworLy8KKworLyoqCisgKiBSZXR1cm5zIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCBsYXllci4KKyAqIEByZXR1cm4ge29iamVjdH0gVGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IGxheWVyLgorICovVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUuZ2V0VHJhbnNwb3J0ID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB0aGlzLnRyYW5zOworfTsKKworLyoqCisgKiBMb29rdXAgYSBDb21wYWN0IFByb3RvY29sIFR5cGUgdmFsdWUgZm9yIGEgZ2l2ZW4gVGhyaWZ0IFR5cGUgdmFsdWUuCisgKiBOLkIuIFVzZWQgb25seSBpbnRlcm5hbGx5LgorICogQHBhcmFtIHtudW1iZXJ9IHR0eXBlIC0gVGhyaWZ0IHR5cGUgdmFsdWUKKyAqIEByZXR1cm5zIHtudW1iZXJ9IENvbXBhY3QgcHJvdG9jb2wgdHlwZSB2YWx1ZQorICovCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS5nZXRDb21wYWN0VHlwZSA9IGZ1bmN0aW9uKHR0eXBlKSB7CisgIHJldHVybiBUQ29tcGFjdFByb3RvY29sLlRUeXBlVG9DVHlwZVt0dHlwZV07Cit9OworCisvKioKKyAqIExvb2t1cCBhIFRocmlmdCBUeXBlIHZhbHVlIGZvciBhIGdpdmVuIENvbXBhY3QgUHJvdG9jb2wgVHlwZSB2YWx1ZS4KKyAqIE4uQi4gVXNlZCBvbmx5IGludGVybmFsbHkuCisgKiBAcGFyYW0ge251bWJlcn0gdHlwZSAtIENvbXBhY3QgUHJvdG9jb2wgdHlwZSB2YWx1ZQorICogQHJldHVybnMge251bWJlcn0gVGhyaWZ0IFR5cGUgdmFsdWUKKyAqLworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUuZ2V0VFR5cGUgPSBmdW5jdGlvbih0eXBlKSB7CisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgVHlwZS5TVE9QOgorICAgICAgcmV0dXJuIFR5cGUuU1RPUDsKKyAgICBjYXNlIFRDb21wYWN0UHJvdG9jb2wuVHlwZXMuQ1RfQk9PTEVBTl9GQUxTRToKKyAgICBjYXNlIFRDb21wYWN0UHJvdG9jb2wuVHlwZXMuQ1RfQk9PTEVBTl9UUlVFOgorICAgICAgcmV0dXJuIFR5cGUuQk9PTDsKKyAgICBjYXNlIFRDb21wYWN0UHJvdG9jb2wuVHlwZXMuQ1RfQllURToKKyAgICAgIHJldHVybiBUeXBlLkJZVEU7CisgICAgY2FzZSBUQ29tcGFjdFByb3RvY29sLlR5cGVzLkNUX0kxNjoKKyAgICAgIHJldHVybiBUeXBlLkkxNjsKKyAgICBjYXNlIFRDb21wYWN0UHJvdG9jb2wuVHlwZXMuQ1RfSTMyOgorICAgICAgcmV0dXJuIFR5cGUuSTMyOworICAgIGNhc2UgVENvbXBhY3RQcm90b2NvbC5UeXBlcy5DVF9JNjQ6CisgICAgICByZXR1cm4gVHlwZS5JNjQ7CisgICAgY2FzZSBUQ29tcGFjdFByb3RvY29sLlR5cGVzLkNUX0RPVUJMRToKKyAgICAgIHJldHVybiBUeXBlLkRPVUJMRTsKKyAgICBjYXNlIFRDb21wYWN0UHJvdG9jb2wuVHlwZXMuQ1RfQklOQVJZOgorICAgICAgcmV0dXJuIFR5cGUuU1RSSU5HOworICAgIGNhc2UgVENvbXBhY3RQcm90b2NvbC5UeXBlcy5DVF9MSVNUOgorICAgICAgcmV0dXJuIFR5cGUuTElTVDsKKyAgICBjYXNlIFRDb21wYWN0UHJvdG9jb2wuVHlwZXMuQ1RfU0VUOgorICAgICAgcmV0dXJuIFR5cGUuU0VUOworICAgIGNhc2UgVENvbXBhY3RQcm90b2NvbC5UeXBlcy5DVF9NQVA6CisgICAgICByZXR1cm4gVHlwZS5NQVA7CisgICAgY2FzZSBUQ29tcGFjdFByb3RvY29sLlR5cGVzLkNUX1NUUlVDVDoKKyAgICAgIHJldHVybiBUeXBlLlNUUlVDVDsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgbmV3IFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb24oVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvblR5cGUuSU5WQUxJRF9EQVRBLCAiVW5rbm93biB0eXBlOiAiICsgdHlwZSk7CisgIH0KKyAgcmV0dXJuIFR5cGUuU1RPUDsKK307CisKKworLy8KKy8vIENvbXBhY3QgUHJvdG9jb2wgd3JpdGUgb3BlcmF0aW9ucworLy8KKworLyoqCisgKiBTZW5kIGFueSBidWZmZXJlZCBieXRlcyB0byB0aGUgZW5kIHBvaW50LgorICovCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS5mbHVzaCA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4gdGhpcy50cmFucy5mbHVzaCgpOworfTsKKworLyoqCisgKiBXcml0ZXMgYW4gUlBDIG1lc3NhZ2UgaGVhZGVyCisgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBtZXRob2QgbmFtZSBmb3IgdGhlIG1lc3NhZ2UuCisgKiBAcGFyYW0ge251bWJlcn0gdHlwZSAtIFRoZSB0eXBlIG9mIG1lc3NhZ2UgKENBTEwsIFJFUExZLCBFWENFUFRJT04sIE9ORVdBWSkuCisgKiBAcGFyYW0ge251bWJlcn0gc2VxaWQgLSBUaGUgY2FsbCBzZXF1ZW5jZSBudW1iZXIgKGlmIGFueSkuCisgKi8KK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLndyaXRlTWVzc2FnZUJlZ2luID0gZnVuY3Rpb24obmFtZSwgdHlwZSwgc2VxaWQpIHsKKyAgdGhpcy53cml0ZUJ5dGUoVENvbXBhY3RQcm90b2NvbC5QUk9UT0NPTF9JRCk7CisgIHRoaXMud3JpdGVCeXRlKChUQ29tcGFjdFByb3RvY29sLlZFUlNJT05fTiAmIFRDb21wYWN0UHJvdG9jb2wuVkVSU0lPTl9NQVNLKSB8CisgICAgICAgICAgICAgICAgICAgICAoKHR5cGUgPDwgVENvbXBhY3RQcm90b2NvbC5UWVBFX1NISUZUX0FNT1VOVCkgJiBUQ29tcGFjdFByb3RvY29sLlRZUEVfTUFTSykpOworICB0aGlzLndyaXRlVmFyaW50MzIoc2VxaWQpOworICB0aGlzLndyaXRlU3RyaW5nKG5hbWUpOworCisgIC8vIFJlY29yZCBjbGllbnQgc2VxaWQgdG8gZmluZCBjYWxsYmFjayBhZ2FpbgorICBpZiAodGhpcy5fc2VxaWQpIHsKKyAgICBsb2cud2FybmluZygnU2VxSWQgYWxyZWFkeSBzZXQnLCB7ICduYW1lJzogbmFtZSB9KTsKKyAgfSBlbHNlIHsKKyAgICB0aGlzLl9zZXFpZCA9IHNlcWlkOworICAgIHRoaXMudHJhbnMuc2V0Q3VyclNlcUlkKHNlcWlkKTsKKyAgfQorfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUud3JpdGVNZXNzYWdlRW5kID0gZnVuY3Rpb24oKSB7Cit9OworCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS53cml0ZVN0cnVjdEJlZ2luID0gZnVuY3Rpb24obmFtZSkgeworICB0aGlzLmxhc3RGaWVsZF8ucHVzaCh0aGlzLmxhc3RGaWVsZElkXyk7CisgIHRoaXMubGFzdEZpZWxkSWRfID0gMDsKK307CisKK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLndyaXRlU3RydWN0RW5kID0gZnVuY3Rpb24oKSB7CisgIHRoaXMubGFzdEZpZWxkSWRfID0gdGhpcy5sYXN0RmllbGRfLnBvcCgpOworfTsKKworLyoqCisgKiBXcml0ZXMgYSBzdHJ1Y3QgZmllbGQgaGVhZGVyCisgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBmaWVsZCBuYW1lIChub3Qgd3JpdHRlbiB3aXRoIHRoZSBjb21wYWN0IHByb3RvY29sKS4KKyAqIEBwYXJhbSB7bnVtYmVyfSB0eXBlIC0gVGhlIGZpZWxkIGRhdGEgdHlwZSAoYSBub3JtYWwgVGhyaWZ0IGZpZWxkIFR5cGUpLgorICogQHBhcmFtIHtudW1iZXJ9IGlkIC0gVGhlIElETCBmaWVsZCBJZC4KKyAqLworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUud3JpdGVGaWVsZEJlZ2luID0gZnVuY3Rpb24obmFtZSwgdHlwZSwgaWQpIHsKKyAgaWYgKHR5cGUgIT0gVHlwZS5CT09MKSB7CisgICAgcmV0dXJuIHRoaXMud3JpdGVGaWVsZEJlZ2luSW50ZXJuYWwobmFtZSwgdHlwZSwgaWQsIC0xKTsKKyAgfQorCisgIHRoaXMuYm9vbGVhbkZpZWxkXy5uYW1lID0gbmFtZTsKKyAgdGhpcy5ib29sZWFuRmllbGRfLmZpZWxkVHlwZSA9IHR5cGU7CisgIHRoaXMuYm9vbGVhbkZpZWxkXy5maWVsZElkID0gaWQ7Cit9OworCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS53cml0ZUZpZWxkRW5kID0gZnVuY3Rpb24oKSB7Cit9OworCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS53cml0ZUZpZWxkU3RvcCA9IGZ1bmN0aW9uKCkgeworICB0aGlzLndyaXRlQnl0ZShUQ29tcGFjdFByb3RvY29sLlR5cGVzLkNUX1NUT1ApOworfTsKKworLyoqCisgKiBXcml0ZXMgYSBtYXAgY29sbGVjdGlvbiBoZWFkZXIKKyAqIEBwYXJhbSB7bnVtYmVyfSBrZXlUeXBlIC0gVGhlIFRocmlmdCB0eXBlIG9mIHRoZSBtYXAga2V5cy4KKyAqIEBwYXJhbSB7bnVtYmVyfSB2YWxUeXBlIC0gVGhlIFRocmlmdCB0eXBlIG9mIHRoZSBtYXAgdmFsdWVzLgorICogQHBhcmFtIHtudW1iZXJ9IHNpemUgLSBUaGUgbnVtYmVyIG9mIGsvdiBwYWlycyBpbiB0aGUgbWFwLgorICovCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS53cml0ZU1hcEJlZ2luID0gZnVuY3Rpb24oa2V5VHlwZSwgdmFsVHlwZSwgc2l6ZSkgeworICBpZiAoc2l6ZSA9PT0gMCkgeworICAgIHRoaXMud3JpdGVCeXRlKDApOworICB9IGVsc2UgeworICAgIHRoaXMud3JpdGVWYXJpbnQzMihzaXplKTsKKyAgICB0aGlzLndyaXRlQnl0ZSh0aGlzLmdldENvbXBhY3RUeXBlKGtleVR5cGUpIDw8IDQgfCB0aGlzLmdldENvbXBhY3RUeXBlKHZhbFR5cGUpKTsKKyAgfQorfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUud3JpdGVNYXBFbmQgPSBmdW5jdGlvbigpIHsKK307CisKKy8qKgorICogV3JpdGVzIGEgbGlzdCBjb2xsZWN0aW9uIGhlYWRlcgorICogQHBhcmFtIHtudW1iZXJ9IGVsZW1UeXBlIC0gVGhlIFRocmlmdCB0eXBlIG9mIHRoZSBsaXN0IGVsZW1lbnRzLgorICogQHBhcmFtIHtudW1iZXJ9IHNpemUgLSBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0LgorICovCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS53cml0ZUxpc3RCZWdpbiA9IGZ1bmN0aW9uKGVsZW1UeXBlLCBzaXplKSB7CisgIHRoaXMud3JpdGVDb2xsZWN0aW9uQmVnaW4oZWxlbVR5cGUsIHNpemUpOworfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUud3JpdGVMaXN0RW5kID0gZnVuY3Rpb24oKSB7Cit9OworCisvKioKKyAqIFdyaXRlcyBhIHNldCBjb2xsZWN0aW9uIGhlYWRlcgorICogQHBhcmFtIHtudW1iZXJ9IGVsZW1UeXBlIC0gVGhlIFRocmlmdCB0eXBlIG9mIHRoZSBzZXQgZWxlbWVudHMuCisgKiBAcGFyYW0ge251bWJlcn0gc2l6ZSAtIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHNldC4KKyAqLworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUud3JpdGVTZXRCZWdpbiA9IGZ1bmN0aW9uKGVsZW1UeXBlLCBzaXplKSB7CisgIHRoaXMud3JpdGVDb2xsZWN0aW9uQmVnaW4oZWxlbVR5cGUsIHNpemUpOworfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUud3JpdGVTZXRFbmQgPSBmdW5jdGlvbigpIHsKK307CisKK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLndyaXRlQm9vbCA9IGZ1bmN0aW9uKHZhbHVlKSB7CisgIGlmICh0aGlzLmJvb2xlYW5GaWVsZF8ubmFtZSAhPT0gbnVsbCkgeworICAgIC8vIHdlIGhhdmVuJ3Qgd3JpdHRlbiB0aGUgZmllbGQgaGVhZGVyIHlldAorICAgIHRoaXMud3JpdGVGaWVsZEJlZ2luSW50ZXJuYWwodGhpcy5ib29sZWFuRmllbGRfLm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJvb2xlYW5GaWVsZF8uZmllbGRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ib29sZWFuRmllbGRfLmZpZWxkSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmFsdWUgPyBUQ29tcGFjdFByb3RvY29sLlR5cGVzLkNUX0JPT0xFQU5fVFJVRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBUQ29tcGFjdFByb3RvY29sLlR5cGVzLkNUX0JPT0xFQU5fRkFMU0UpKTsKKyAgICB0aGlzLmJvb2xlYW5GaWVsZF8ubmFtZSA9IG51bGw7CisgIH0gZWxzZSB7CisgICAgLy8gd2UncmUgbm90IHBhcnQgb2YgYSBmaWVsZCwgc28ganVzdCB3cml0ZSB0aGUgdmFsdWUKKyAgICB0aGlzLndyaXRlQnl0ZSgodmFsdWUgPyBUQ29tcGFjdFByb3RvY29sLlR5cGVzLkNUX0JPT0xFQU5fVFJVRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogVENvbXBhY3RQcm90b2NvbC5UeXBlcy5DVF9CT09MRUFOX0ZBTFNFKSk7CisgIH0KK307CisKK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLndyaXRlQnl0ZSA9IGZ1bmN0aW9uKGIpIHsKKyAgdGhpcy50cmFucy53cml0ZShuZXcgQnVmZmVyKFtiXSkpOworfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUud3JpdGVJMTYgPSBmdW5jdGlvbihpMTYpIHsKKyAgdGhpcy53cml0ZVZhcmludDMyKHRoaXMuaTMyVG9aaWd6YWcoaTE2KSk7Cit9OworCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS53cml0ZUkzMiA9IGZ1bmN0aW9uKGkzMikgeworICB0aGlzLndyaXRlVmFyaW50MzIodGhpcy5pMzJUb1ppZ3phZyhpMzIpKTsKK307CisKK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLndyaXRlSTY0ID0gZnVuY3Rpb24oaTY0KSB7CisgIHRoaXMud3JpdGVWYXJpbnQ2NCh0aGlzLmk2NFRvWmlnemFnKGk2NCkpOworfTsKKworLy8gTGl0dGxlLWVuZGlhbiwgdW5saWtlIFRCaW5hcnlQcm90b2NvbAorVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUud3JpdGVEb3VibGUgPSBmdW5jdGlvbih2KSB7CisgIHZhciBidWZmID0gbmV3IEJ1ZmZlcig4KTsKKyAgdmFyIG0sIGUsIGM7CisKKyAgYnVmZls3XSA9ICh2IDwgMCA/IDB4ODAgOiAweDAwKTsKKworICB2ID0gTWF0aC5hYnModik7CisgIGlmICh2ICE9PSB2KSB7CisgICAgLy8gTmFOLCB1c2UgUU5hTiBJRUVFIGZvcm1hdAorICAgIG0gPSAyMjUxNzk5ODEzNjg1MjQ4OworICAgIGUgPSAyMDQ3OworICB9IGVsc2UgaWYgKHYgPT09IEluZmluaXR5KSB7CisgICAgbSA9IDA7CisgICAgZSA9IDIwNDc7CisgIH0gZWxzZSB7CisgICAgZSA9IE1hdGguZmxvb3IoTWF0aC5sb2codikgLyBNYXRoLkxOMik7CisgICAgYyA9IE1hdGgucG93KDIsIC1lKTsKKyAgICBpZiAodiAqIGMgPCAxKSB7CisgICAgICBlLS07CisgICAgICBjICo9IDI7CisgICAgfQorCisgICAgaWYgKGUgKyAxMDIzID49IDIwNDcpCisgICAgeworICAgICAgLy8gT3ZlcmZsb3cKKyAgICAgIG0gPSAwOworICAgICAgZSA9IDIwNDc7CisgICAgfQorICAgIGVsc2UgaWYgKGUgKyAxMDIzID49IDEpCisgICAgeworICAgICAgLy8gTm9ybWFsaXplZCAtIHRlcm0gb3JkZXIgbWF0dGVycywgYXMgTWF0aC5wb3coMiwgNTItZSkgYW5kIHYqTWF0aC5wb3coMiwgNTIpIGNhbiBvdmVyZmxvdworICAgICAgbSA9ICh2KmMtMSkgKiBQT1dfNTI7CisgICAgICBlICs9IDEwMjM7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvLyBEZW5vcm1hbGl6ZWQgLSBhbHNvIGNhdGNoZXMgdGhlICcwJyBjYXNlLCBzb21ld2hhdCBieSBjaGFuY2UKKyAgICAgIG0gPSAodiAqIFBPV18xMDIyKSAqIFBPV181MjsKKyAgICAgIGUgPSAwOworICAgIH0KKyAgfQorCisgIGJ1ZmZbNl0gPSAoZSA8PCA0KSAmIDB4ZjA7CisgIGJ1ZmZbN10gfD0gKGUgPj4gNCkgJiAweDdmOworCisgIGJ1ZmZbMF0gPSBtICYgMHhmZjsKKyAgbSA9IE1hdGguZmxvb3IobSAvIFBPV184KTsKKyAgYnVmZlsxXSA9IG0gJiAweGZmOworICBtID0gTWF0aC5mbG9vcihtIC8gUE9XXzgpOworICBidWZmWzJdID0gbSAmIDB4ZmY7CisgIG0gPSBNYXRoLmZsb29yKG0gLyBQT1dfOCk7CisgIGJ1ZmZbM10gPSBtICYgMHhmZjsKKyAgbSA+Pj0gODsKKyAgYnVmZls0XSA9IG0gJiAweGZmOworICBtID4+PSA4OworICBidWZmWzVdID0gbSAmIDB4ZmY7CisgIG0gPj49IDg7CisgIGJ1ZmZbNl0gfD0gbSAmIDB4MGY7CisKKyAgdGhpcy50cmFucy53cml0ZShidWZmKTsKK307CisKK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLndyaXRlU3RyaW5nT3JCaW5hcnkgPSBmdW5jdGlvbihuYW1lLCBlbmNvZGluZywgYXJnKSB7CisgIGlmICh0eXBlb2YgYXJnID09PSAnc3RyaW5nJykgeworICAgIHRoaXMud3JpdGVWYXJpbnQzMihCdWZmZXIuYnl0ZUxlbmd0aChhcmcsIGVuY29kaW5nKSkgOworICAgIHRoaXMudHJhbnMud3JpdGUobmV3IEJ1ZmZlcihhcmcsIGVuY29kaW5nKSk7CisgIH0gZWxzZSBpZiAoYXJnIGluc3RhbmNlb2YgQnVmZmVyIHx8CisgICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGFyZykgPT0gJ1tvYmplY3QgVWludDhBcnJheV0nKSB7CisgICAgLy8gQnVmZmVycyBpbiBOb2RlLmpzIHVuZGVyIEJyb3dzZXJpZnkgbWF5IGV4dGVuZCBVSW50OEFycmF5IGluc3RlYWQgb2YKKyAgICAvLyBkZWZpbmluZyBhIG5ldyBvYmplY3QuIFdlIGRldGVjdCB0aGVtIGhlcmUgc28gd2UgY2FuIHdyaXRlIHRoZW0KKyAgICAvLyBjb3JyZWN0bHkKKyAgICB0aGlzLndyaXRlVmFyaW50MzIoYXJnLmxlbmd0aCk7CisgICAgdGhpcy50cmFucy53cml0ZShhcmcpOworICB9IGVsc2UgeworICAgIHRocm93IG5ldyBFcnJvcihuYW1lICsgJyBjYWxsZWQgd2l0aG91dCBhIHN0cmluZy9CdWZmZXIgYXJndW1lbnQ6ICcgKyBhcmcpOworICB9Cit9OworCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS53cml0ZVN0cmluZyA9IGZ1bmN0aW9uKGFyZykgeworICB0aGlzLndyaXRlU3RyaW5nT3JCaW5hcnkoJ3dyaXRlU3RyaW5nJywgJ3V0ZjgnLCBhcmcpOworfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUud3JpdGVCaW5hcnkgPSBmdW5jdGlvbihhcmcpIHsKKyAgdGhpcy53cml0ZVN0cmluZ09yQmluYXJ5KCd3cml0ZUJpbmFyeScsICdiaW5hcnknLCBhcmcpOworfTsKKworCisvLworLy8gQ29tcGFjdCBQcm90b2NvbCBpbnRlcm5hbCB3cml0ZSBtZXRob2RzCisvLworCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS53cml0ZUZpZWxkQmVnaW5JbnRlcm5hbCA9IGZ1bmN0aW9uKG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZU92ZXJyaWRlKSB7CisgIC8vSWYgdGhlcmUncyBhIHR5cGUgb3ZlcnJpZGUsIHVzZSB0aGF0LgorICB2YXIgdHlwZVRvV3JpdGUgPSAodHlwZU92ZXJyaWRlID09IC0xID8gdGhpcy5nZXRDb21wYWN0VHlwZShmaWVsZFR5cGUpIDogdHlwZU92ZXJyaWRlKTsKKyAgLy9DaGVjayBpZiB3ZSBjYW4gZGVsdGEgZW5jb2RlIHRoZSBmaWVsZCBpZAorICBpZiAoZmllbGRJZCA+IHRoaXMubGFzdEZpZWxkSWRfICYmIGZpZWxkSWQgLSB0aGlzLmxhc3RGaWVsZElkXyA8PSAxNSkgeworICAgIC8vSW5jbHVkZSB0aGUgdHlwZSBkZWx0YSB3aXRoIHRoZSBmaWVsZCBJRAorICAgIHRoaXMud3JpdGVCeXRlKChmaWVsZElkIC0gdGhpcy5sYXN0RmllbGRJZF8pIDw8IDQgfCB0eXBlVG9Xcml0ZSk7CisgIH0gZWxzZSB7CisgICAgLy9Xcml0ZSBzZXBhcmF0ZSB0eXBlIGFuZCBJRCB2YWx1ZXMKKyAgICB0aGlzLndyaXRlQnl0ZSh0eXBlVG9Xcml0ZSk7CisgICAgdGhpcy53cml0ZUkxNihmaWVsZElkKTsKKyAgfQorICB0aGlzLmxhc3RGaWVsZElkXyA9IGZpZWxkSWQ7Cit9OworCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS53cml0ZUNvbGxlY3Rpb25CZWdpbiA9IGZ1bmN0aW9uKGVsZW1UeXBlLCBzaXplKSB7CisgIGlmIChzaXplIDw9IDE0KSB7CisgICAgLy9Db21iaW5lIHNpemUgYW5kIHR5cGUgaW4gb25lIGJ5dGUgaWYgcG9zc2libGUKKyAgICB0aGlzLndyaXRlQnl0ZShzaXplIDw8IDQgfCB0aGlzLmdldENvbXBhY3RUeXBlKGVsZW1UeXBlKSk7CisgIH0gZWxzZSB7CisgICAgdGhpcy53cml0ZUJ5dGUoMHhmMCB8IHRoaXMuZ2V0Q29tcGFjdFR5cGUoZWxlbVR5cGUpKTsKKyAgICB0aGlzLndyaXRlVmFyaW50MzIoc2l6ZSk7CisgIH0KK307CisKKy8qKgorICogV3JpdGUgYW4gaTMyIGFzIGEgdmFyaW50LiBSZXN1bHRzIGluIDEtNSBieXRlcyBvbiB0aGUgd2lyZS4KKyAqLworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUud3JpdGVWYXJpbnQzMiA9IGZ1bmN0aW9uKG4pIHsKKyAgdmFyIGJ1ZiA9IG5ldyBCdWZmZXIoNSk7CisgIHZhciB3c2l6ZSA9IDA7CisgIHdoaWxlICh0cnVlKSB7CisgICAgaWYgKChuICYgfjB4N0YpID09PSAwKSB7CisgICAgICBidWZbd3NpemUrK10gPSBuOworICAgICAgYnJlYWs7CisgICAgfSBlbHNlIHsKKyAgICAgIGJ1Zlt3c2l6ZSsrXSA9ICgobiAmIDB4N0YpIHwgMHg4MCk7CisgICAgICBuID0gbiA+Pj4gNzsKKyAgICB9CisgIH0KKyAgdmFyIHdidWYgPSBuZXcgQnVmZmVyKHdzaXplKTsKKyAgYnVmLmNvcHkod2J1ZiwwLDAsd3NpemUpOworICB0aGlzLnRyYW5zLndyaXRlKHdidWYpOworfTsKKworLyoqCisgKiBXcml0ZSBhbiBpNjQgYXMgYSB2YXJpbnQuIFJlc3VsdHMgaW4gMS0xMCBieXRlcyBvbiB0aGUgd2lyZS4KKyAqIE4uQi4gbm9kZS1pbnQ2NCBpcyBhbHdheXMgYmlnIGVuZGlhbgorICovCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS53cml0ZVZhcmludDY0ID0gZnVuY3Rpb24obikgeworICBpZiAodHlwZW9mIG4gPT09ICJudW1iZXIiKXsKKyAgICBuID0gbmV3IEludDY0KG4pOworICB9CisgIGlmICghIChuIGluc3RhbmNlb2YgSW50NjQpKSB7CisgICAgdGhyb3cgbmV3IFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb24oVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvblR5cGUuSU5WQUxJRF9EQVRBLCAiRXhwZWN0ZWQgSW50NjQgb3IgTnVtYmVyLCBmb3VuZDogIiArIG4pOworICB9CisKKyAgdmFyIGJ1ZiA9IG5ldyBCdWZmZXIoMTApOworICB2YXIgd3NpemUgPSAwOworICB2YXIgaGkgPSBuLmJ1ZmZlci5yZWFkVUludDMyQkUoMCwgdHJ1ZSk7CisgIHZhciBsbyA9IG4uYnVmZmVyLnJlYWRVSW50MzJCRSg0LCB0cnVlKTsKKyAgdmFyIG1hc2sgPSAwOworICB3aGlsZSAodHJ1ZSkgeworICAgIGlmICgoKGxvICYgfjB4N0YpID09PSAwKSAmJiAoaGkgPT09IDApKSB7CisgICAgICBidWZbd3NpemUrK10gPSBsbzsKKyAgICAgIGJyZWFrOworICAgIH0gZWxzZSB7CisgICAgICBidWZbd3NpemUrK10gPSAoKGxvICYgMHg3RikgfCAweDgwKTsKKyAgICAgIG1hc2sgPSBoaSA8PCAyNTsKKyAgICAgIGxvID0gbG8gPj4+IDc7CisgICAgICBoaSA9IGhpID4+PiA3OworICAgICAgbG8gPSBsbyB8IG1hc2s7CisgICAgfQorICB9CisgIHZhciB3YnVmID0gbmV3IEJ1ZmZlcih3c2l6ZSk7CisgIGJ1Zi5jb3B5KHdidWYsMCwwLHdzaXplKTsKKyAgdGhpcy50cmFucy53cml0ZSh3YnVmKTsKK307CisKKy8qKgorICogQ29udmVydCBsIGludG8gYSB6aWd6YWcgbG9uZy4gVGhpcyBhbGxvd3MgbmVnYXRpdmUgbnVtYmVycyB0byBiZQorICogcmVwcmVzZW50ZWQgY29tcGFjdGx5IGFzIGEgdmFyaW50LgorICovCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS5pNjRUb1ppZ3phZyA9IGZ1bmN0aW9uKGwpIHsKKyAgaWYgKHR5cGVvZiBsID09PSAnc3RyaW5nJykgeworICAgIGwgPSBuZXcgSW50NjQocGFyc2VJbnQobCwgMTApKTsKKyAgfSBlbHNlIGlmICh0eXBlb2YgbCA9PT0gJ251bWJlcicpIHsKKyAgICBsID0gbmV3IEludDY0KGwpOworICB9CisgIGlmICghIChsIGluc3RhbmNlb2YgSW50NjQpKSB7CisgICAgdGhyb3cgbmV3IFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb24oVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvblR5cGUuSU5WQUxJRF9EQVRBLCAiRXhwZWN0ZWQgSW50NjQgb3IgTnVtYmVyLCBmb3VuZDogIiArIGwpOworICB9CisgIHZhciBoaSA9IGwuYnVmZmVyLnJlYWRVSW50MzJCRSgwLCB0cnVlKTsKKyAgdmFyIGxvID0gbC5idWZmZXIucmVhZFVJbnQzMkJFKDQsIHRydWUpOworICB2YXIgc2lnbiA9IGhpID4+PiAzMTsKKyAgaGkgPSAoKGhpIDw8IDEpIHwgKGxvID4+PiAzMSkpIF4gKCghIXNpZ24pID8gMHhGRkZGRkZGRiA6IDApOworICBsbyA9IChsbyA8PCAxKSBeICgoISFzaWduKSA/IDB4RkZGRkZGRkYgOiAwKTsKKyAgcmV0dXJuIG5ldyBJbnQ2NChoaSwgbG8pOworfTsKKworLyoqCisgKiBDb252ZXJ0IG4gaW50byBhIHppZ3phZyBpbnQuIFRoaXMgYWxsb3dzIG5lZ2F0aXZlIG51bWJlcnMgdG8gYmUKKyAqIHJlcHJlc2VudGVkIGNvbXBhY3RseSBhcyBhIHZhcmludC4KKyAqLworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUuaTMyVG9aaWd6YWcgPSBmdW5jdGlvbihuKSB7CisgIHJldHVybiAobiA8PCAxKSBeICgobiAmIDB4ODAwMDAwMDApID8gMHhGRkZGRkZGRiA6IDApOworfTsKKworCisvLworLy8gQ29tcGFjdCBQcm90b2NvbCByZWFkIG9wZXJhdGlvbnMKKy8vCisKK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLnJlYWRNZXNzYWdlQmVnaW4gPSBmdW5jdGlvbigpIHsKKyAgLy9SZWFkIHByb3RvY29sIElECisgIHZhciBwcm90b2NvbElkID0gdGhpcy50cmFucy5yZWFkQnl0ZSgpOworICBpZiAocHJvdG9jb2xJZCAhPSBUQ29tcGFjdFByb3RvY29sLlBST1RPQ09MX0lEKSB7CisgICAgdGhyb3cgbmV3IFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb24oVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvblR5cGUuQkFEX1ZFUlNJT04sICJCYWQgcHJvdG9jb2wgaWRlbnRpZmllciAiICsgcHJvdG9jb2xJZCk7CisgIH0KKworICAvL1JlYWQgVmVyc2lvbiBhbmQgVHlwZQorICB2YXIgdmVyc2lvbkFuZFR5cGUgPSB0aGlzLnRyYW5zLnJlYWRCeXRlKCk7CisgIHZhciB2ZXJzaW9uID0gKHZlcnNpb25BbmRUeXBlICYgVENvbXBhY3RQcm90b2NvbC5WRVJTSU9OX01BU0spOworICBpZiAodmVyc2lvbiAhPSBUQ29tcGFjdFByb3RvY29sLlZFUlNJT05fTikgeworICAgIHRocm93IG5ldyBUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uKFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb25UeXBlLkJBRF9WRVJTSU9OLCAiQmFkIHByb3RvY29sIHZlcnNpb24gIiArIHZlcnNpb24pOworICB9CisgIHZhciB0eXBlID0gKCh2ZXJzaW9uQW5kVHlwZSA+PiBUQ29tcGFjdFByb3RvY29sLlRZUEVfU0hJRlRfQU1PVU5UKSAmIFRDb21wYWN0UHJvdG9jb2wuVFlQRV9CSVRTKTsKKworICAvL1JlYWQgU2VxSWQKKyAgdmFyIHNlcWlkID0gdGhpcy5yZWFkVmFyaW50MzIoKTsKKworICAvL1JlYWQgbmFtZQorICB2YXIgbmFtZSA9IHRoaXMucmVhZFN0cmluZygpOworCisgIHJldHVybiB7Zm5hbWU6IG5hbWUsIG10eXBlOiB0eXBlLCByc2VxaWQ6IHNlcWlkfTsKK307CisKK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLnJlYWRNZXNzYWdlRW5kID0gZnVuY3Rpb24oKSB7Cit9OworCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS5yZWFkU3RydWN0QmVnaW4gPSBmdW5jdGlvbigpIHsKKyAgdGhpcy5sYXN0RmllbGRfLnB1c2godGhpcy5sYXN0RmllbGRJZF8pOworICB0aGlzLmxhc3RGaWVsZElkXyA9IDA7CisgIHJldHVybiB7Zm5hbWU6ICcnfTsKK307CisKK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLnJlYWRTdHJ1Y3RFbmQgPSBmdW5jdGlvbigpIHsKKyAgdGhpcy5sYXN0RmllbGRJZF8gPSB0aGlzLmxhc3RGaWVsZF8ucG9wKCk7Cit9OworCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS5yZWFkRmllbGRCZWdpbiA9IGZ1bmN0aW9uKCkgeworICB2YXIgZmllbGRJZCA9IDA7CisgIHZhciBiID0gdGhpcy50cmFucy5yZWFkQnl0ZShiKTsKKyAgdmFyIHR5cGUgPSAoYiAmIDB4MGYpOworCisgIGlmICh0eXBlID09IFRDb21wYWN0UHJvdG9jb2wuVHlwZXMuQ1RfU1RPUCkgeworICAgIHJldHVybiB7Zm5hbWU6IG51bGwsIGZ0eXBlOiBUaHJpZnQuVHlwZS5TVE9QLCBmaWQ6IDB9OworICB9CisKKyAgLy9NYXNrIG9mZiB0aGUgNCBNU0Igb2YgdGhlIHR5cGUgaGVhZGVyIHRvIGNoZWNrIGZvciBmaWVsZCBpZCBkZWx0YS4KKyAgdmFyIG1vZGlmaWVyID0gKChiICYgMHgwMDAwMDBmMCkgPj4+IDQpOworICBpZiAobW9kaWZpZXIgPT09IDApIHsKKyAgICAvL0lmIG5vdCBhIGRlbHRhIHJlYWQgdGhlIGZpZWxkIGlkLgorICAgIGZpZWxkSWQgPSB0aGlzLnJlYWRJMTYoKTsKKyAgfSBlbHNlIHsKKyAgICAvL1JlY292ZXIgdGhlIGZpZWxkIGlkIGZyb20gdGhlIGRlbHRhCisgICAgZmllbGRJZCA9ICh0aGlzLmxhc3RGaWVsZElkXyArIG1vZGlmaWVyKTsKKyAgfQorICB2YXIgZmllbGRUeXBlID0gdGhpcy5nZXRUVHlwZSh0eXBlKTsKKworICAvL0Jvb2xlYW4gYXJlIGVuY29kZWQgd2l0aCB0aGUgdHlwZQorICBpZiAodHlwZSA9PSBUQ29tcGFjdFByb3RvY29sLlR5cGVzLkNUX0JPT0xFQU5fVFJVRSB8fAorICAgICAgdHlwZSA9PSBUQ29tcGFjdFByb3RvY29sLlR5cGVzLkNUX0JPT0xFQU5fRkFMU0UpIHsKKyAgICB0aGlzLmJvb2xWYWx1ZV8uaGFzQm9vbFZhbHVlID0gdHJ1ZTsKKyAgICB0aGlzLmJvb2xWYWx1ZV8uYm9vbFZhbHVlID0KKyAgICAgICh0eXBlID09IFRDb21wYWN0UHJvdG9jb2wuVHlwZXMuQ1RfQk9PTEVBTl9UUlVFID8gdHJ1ZSA6IGZhbHNlKTsKKyAgfQorCisgIC8vU2F2ZSB0aGUgbmV3IGZpZWxkIGZvciB0aGUgbmV4dCBkZWx0YSBjb21wdXRhdGlvbi4KKyAgdGhpcy5sYXN0RmllbGRJZF8gPSBmaWVsZElkOworICByZXR1cm4ge2ZuYW1lOiBudWxsLCBmdHlwZTogZmllbGRUeXBlLCBmaWQ6IGZpZWxkSWR9OworfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUucmVhZEZpZWxkRW5kID0gZnVuY3Rpb24oKSB7Cit9OworCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS5yZWFkTWFwQmVnaW4gPSBmdW5jdGlvbigpIHsKKyAgdmFyIG1zaXplID0gdGhpcy5yZWFkVmFyaW50MzIoKTsKKyAgaWYgKG1zaXplIDwgMCkgeworICAgIHRocm93IG5ldyBUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uKFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb25UeXBlLk5FR0FUSVZFX1NJWkUsICJOZWdhdGl2ZSBtYXAgc2l6ZSIpOworICB9CisKKyAgdmFyIGt2VHlwZSA9IDA7CisgIGlmIChtc2l6ZSAhPT0gMCkgeworICAgIGt2VHlwZSA9IHRoaXMudHJhbnMucmVhZEJ5dGUoKTsKKyAgfQorCisgIHZhciBrZXlUeXBlID0gdGhpcy5nZXRUVHlwZSgoa3ZUeXBlICYgMHhmMCkgPj4+IDQpOworICB2YXIgdmFsVHlwZSA9IHRoaXMuZ2V0VFR5cGUoa3ZUeXBlICYgMHhmKTsKKyAgcmV0dXJuIHtrdHlwZToga2V5VHlwZSwgdnR5cGU6IHZhbFR5cGUsIHNpemU6IG1zaXplfTsKK307CisKK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLnJlYWRNYXBFbmQgPSBmdW5jdGlvbigpIHsKK307CisKK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLnJlYWRMaXN0QmVnaW4gPSBmdW5jdGlvbigpIHsKKyAgdmFyIHNpemVfYW5kX3R5cGUgPSB0aGlzLnRyYW5zLnJlYWRCeXRlKCk7CisKKyAgdmFyIGxzaXplID0gKHNpemVfYW5kX3R5cGUgPj4+IDQpICYgMHgwMDAwMDAwZjsKKyAgaWYgKGxzaXplID09IDE1KSB7CisgICAgbHNpemUgPSB0aGlzLnJlYWRWYXJpbnQzMigpOworICB9CisKKyAgaWYgKGxzaXplIDwgMCkgeworICAgIHRocm93IG5ldyBUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uKFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb25UeXBlLk5FR0FUSVZFX1NJWkUsICJOZWdhdGl2ZSBsaXN0IHNpemUiKTsKKyAgfQorCisgIHZhciBlbGVtVHlwZSA9IHRoaXMuZ2V0VFR5cGUoc2l6ZV9hbmRfdHlwZSAmIDB4MDAwMDAwMGYpOworCisgIHJldHVybiB7ZXR5cGU6IGVsZW1UeXBlLCBzaXplOiBsc2l6ZX07Cit9OworCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS5yZWFkTGlzdEVuZCA9IGZ1bmN0aW9uKCkgeworfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUucmVhZFNldEJlZ2luID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB0aGlzLnJlYWRMaXN0QmVnaW4oKTsKK307CisKK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLnJlYWRTZXRFbmQgPSBmdW5jdGlvbigpIHsKK307CisKK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLnJlYWRCb29sID0gZnVuY3Rpb24oKSB7CisgIHZhciB2YWx1ZSA9IGZhbHNlOworICB2YXIgcnNpemUgPSAwOworICBpZiAodGhpcy5ib29sVmFsdWVfLmhhc0Jvb2xWYWx1ZSA9PT0gdHJ1ZSkgeworICAgIHZhbHVlID0gdGhpcy5ib29sVmFsdWVfLmJvb2xWYWx1ZTsKKyAgICB0aGlzLmJvb2xWYWx1ZV8uaGFzQm9vbFZhbHVlID0gZmFsc2U7CisgIH0gZWxzZSB7CisgICAgdmFyIHJlcyA9IHRoaXMudHJhbnMucmVhZEJ5dGUoKTsKKyAgICByc2l6ZSA9IHJlcy5yc2l6ZTsKKyAgICB2YWx1ZSA9IChyZXMudmFsdWUgPT0gVENvbXBhY3RQcm90b2NvbC5UeXBlcy5DVF9CT09MRUFOX1RSVUUpOworICB9CisgIHJldHVybiB2YWx1ZTsKK307CisKK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLnJlYWRCeXRlID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB0aGlzLnRyYW5zLnJlYWRCeXRlKCk7Cit9OworCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS5yZWFkSTE2ID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB0aGlzLnJlYWRJMzIoKTsKK307CisKK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLnJlYWRJMzIgPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIHRoaXMuemlnemFnVG9JMzIodGhpcy5yZWFkVmFyaW50MzIoKSk7Cit9OworCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS5yZWFkSTY0ID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB0aGlzLnppZ3phZ1RvSTY0KHRoaXMucmVhZFZhcmludDY0KCkpOworfTsKKworLy8gTGl0dGxlLWVuZGlhbiwgdW5saWtlIFRCaW5hcnlQcm90b2NvbAorVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUucmVhZERvdWJsZSA9IGZ1bmN0aW9uKCkgeworICB2YXIgYnVmZiA9IHRoaXMudHJhbnMucmVhZCg4KTsKKyAgdmFyIG9mZiA9IDA7CisKKyAgdmFyIHNpZ25lZCA9IGJ1ZmZbb2ZmICsgN10gJiAweDgwOworICB2YXIgZSA9IChidWZmW29mZis2XSAmIDB4RjApID4+IDQ7CisgIGUgKz0gKGJ1ZmZbb2ZmKzddICYgMHg3RikgPDwgNDsKKworICB2YXIgbSA9IGJ1ZmZbb2ZmXTsKKyAgbSArPSBidWZmW29mZisxXSA8PCA4OworICBtICs9IGJ1ZmZbb2ZmKzJdIDw8IDE2OworICBtICs9IGJ1ZmZbb2ZmKzNdICogUE9XXzI0OworICBtICs9IGJ1ZmZbb2ZmKzRdICogUE9XXzMyOworICBtICs9IGJ1ZmZbb2ZmKzVdICogUE9XXzQwOworICBtICs9IChidWZmW29mZis2XSAmIDB4MEYpICogUE9XXzQ4OworCisgIHN3aXRjaCAoZSkgeworICAgIGNhc2UgMDoKKyAgICAgIGUgPSAtMTAyMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjA0NzoKKyAgICAgIHJldHVybiBtID8gTmFOIDogKHNpZ25lZCA/IC1JbmZpbml0eSA6IEluZmluaXR5KTsKKyAgICBkZWZhdWx0OgorICAgICAgbSArPSBQT1dfNTI7CisgICAgICBlIC09IDEwMjM7CisgIH0KKworICBpZiAoc2lnbmVkKSB7CisgICAgbSAqPSAtMTsKKyAgfQorCisgIHJldHVybiBtICogTWF0aC5wb3coMiwgZSAtIDUyKTsKK307CisKK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLnJlYWRCaW5hcnkgPSBmdW5jdGlvbigpIHsKKyAgdmFyIHNpemUgPSB0aGlzLnJlYWRWYXJpbnQzMigpOworICBpZiAoc2l6ZSA9PT0gMCkgeworICAgIHJldHVybiBuZXcgQnVmZmVyKDApOworICB9CisKKyAgaWYgKHNpemUgPCAwKSB7CisgICAgdGhyb3cgbmV3IFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb24oVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvblR5cGUuTkVHQVRJVkVfU0laRSwgIk5lZ2F0aXZlIGJpbmFyeSBzaXplIik7CisgIH0KKyAgcmV0dXJuIHRoaXMudHJhbnMucmVhZChzaXplKTsKK307CisKK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLnJlYWRTdHJpbmcgPSBmdW5jdGlvbigpIHsKKyAgdmFyIHNpemUgPSB0aGlzLnJlYWRWYXJpbnQzMigpOworICAvLyBDYXRjaCBlbXB0eSBzdHJpbmcgY2FzZQorICBpZiAoc2l6ZSA9PT0gMCkgeworICAgIHJldHVybiAiIjsKKyAgfQorCisgIC8vIENhdGNoIGVycm9yIGNhc2VzCisgIGlmIChzaXplIDwgMCkgeworICAgIHRocm93IG5ldyBUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uKFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb25UeXBlLk5FR0FUSVZFX1NJWkUsICJOZWdhdGl2ZSBzdHJpbmcgc2l6ZSIpOworICB9CisgIHJldHVybiB0aGlzLnRyYW5zLnJlYWRTdHJpbmcoc2l6ZSk7Cit9OworCisKKy8vCisvLyBDb21wYWN0IFByb3RvY29sIGludGVybmFsIHJlYWQgb3BlcmF0aW9ucworLy8KKworLyoqCisgKiBSZWFkIGFuIGkzMiBmcm9tIHRoZSB3aXJlIGFzIGEgdmFyaW50LiBUaGUgTVNCIG9mIGVhY2ggYnl0ZSBpcyBzZXQKKyAqIGlmIHRoZXJlIGlzIGFub3RoZXIgYnl0ZSB0byBmb2xsb3cuIFRoaXMgY2FuIHJlYWQgdXAgdG8gNSBieXRlcy4KKyAqLworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUucmVhZFZhcmludDMyID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB0aGlzLnJlYWRWYXJpbnQ2NCgpLnRvTnVtYmVyKCk7Cit9OworCisvKioKKyAqIFJlYWQgYW4gaTY0IGZyb20gdGhlIHdpcmUgYXMgYSBwcm9wZXIgdmFyaW50LiBUaGUgTVNCIG9mIGVhY2ggYnl0ZSBpcyBzZXQKKyAqIGlmIHRoZXJlIGlzIGFub3RoZXIgYnl0ZSB0byBmb2xsb3cuIFRoaXMgY2FuIHJlYWQgdXAgdG8gMTAgYnl0ZXMuCisgKi8KK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLnJlYWRWYXJpbnQ2NCA9IGZ1bmN0aW9uKCkgeworICB2YXIgcnNpemUgPSAwOworICB2YXIgbG8gPSAwOworICB2YXIgaGkgPSAwOworICB2YXIgc2hpZnQgPSAwOworICB3aGlsZSAodHJ1ZSkgeworICAgIHZhciBiID0gdGhpcy50cmFucy5yZWFkQnl0ZSgpOworICAgIHJzaXplICsrOworICAgIGlmIChzaGlmdCA8PSAyNSkgeworICAgICAgbG8gPSBsbyB8ICgoYiAmIDB4N2YpIDw8IHNoaWZ0KTsKKyAgICB9IGVsc2UgaWYgKDI1IDwgc2hpZnQgJiYgc2hpZnQgPCAzMikgeworICAgICAgbG8gPSBsbyB8ICgoYiAmIDB4N2YpIDw8IHNoaWZ0KTsKKyAgICAgIGhpID0gaGkgfCAoKGIgJiAweDdmKSA+Pj4gKDMyLXNoaWZ0KSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGhpID0gaGkgfCAoKGIgJiAweDdmKSA8PCAoc2hpZnQtMzIpKTsKKyAgICB9CisgICAgc2hpZnQgKz0gNzsKKyAgICBpZiAoIShiICYgMHg4MCkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAocnNpemUgPj0gMTApIHsKKyAgICAgIHRocm93IG5ldyBUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uKFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb25UeXBlLklOVkFMSURfREFUQSwgIlZhcmlhYmxlLWxlbmd0aCBpbnQgb3ZlciAxMCBieXRlcy4iKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG5ldyBJbnQ2NChoaSwgbG8pOworfTsKKworLyoqCisgKiBDb252ZXJ0IGZyb20gemlnemFnIGludCB0byBpbnQuCisgKi8KK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLnppZ3phZ1RvSTMyID0gZnVuY3Rpb24obikgeworICByZXR1cm4gKG4gPj4+IDEpIF4gKC0xICogKG4gJiAxKSk7Cit9OworCisvKioKKyAqIENvbnZlcnQgZnJvbSB6aWd6YWcgbG9uZyB0byBsb25nLgorICovCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS56aWd6YWdUb0k2NCA9IGZ1bmN0aW9uKG4pIHsKKyAgdmFyIGhpID0gbi5idWZmZXIucmVhZFVJbnQzMkJFKDAsIHRydWUpOworICB2YXIgbG8gPSBuLmJ1ZmZlci5yZWFkVUludDMyQkUoNCwgdHJ1ZSk7CisKKyAgdmFyIG5lZyA9IG5ldyBJbnQ2NChoaSAmIDAsIGxvICYgMSk7CisgIG5lZy5fMnNjb21wKCk7CisgIHZhciBoaV9uZWcgPSBuZWcuYnVmZmVyLnJlYWRVSW50MzJCRSgwLCB0cnVlKTsKKyAgdmFyIGxvX25lZyA9IG5lZy5idWZmZXIucmVhZFVJbnQzMkJFKDQsIHRydWUpOworCisgIHZhciBoaV9sbyA9IChoaSA8PCAzMSk7CisgIGhpID0gKGhpID4+PiAxKSBeIChoaV9uZWcpOworICBsbyA9ICgobG8gPj4+IDEpIHwgaGlfbG8pIF4gKGxvX25lZyk7CisgIHJldHVybiBuZXcgSW50NjQoaGksIGxvKTsKK307CisKK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLnNraXAgPSBmdW5jdGlvbih0eXBlKSB7CisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgVHlwZS5TVE9QOgorICAgICAgcmV0dXJuOworICAgIGNhc2UgVHlwZS5CT09MOgorICAgICAgdGhpcy5yZWFkQm9vbCgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUeXBlLkJZVEU6CisgICAgICB0aGlzLnJlYWRCeXRlKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFR5cGUuSTE2OgorICAgICAgdGhpcy5yZWFkSTE2KCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFR5cGUuSTMyOgorICAgICAgdGhpcy5yZWFkSTMyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFR5cGUuSTY0OgorICAgICAgdGhpcy5yZWFkSTY0KCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFR5cGUuRE9VQkxFOgorICAgICAgdGhpcy5yZWFkRG91YmxlKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFR5cGUuU1RSSU5HOgorICAgICAgdGhpcy5yZWFkU3RyaW5nKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFR5cGUuU1RSVUNUOgorICAgICAgdGhpcy5yZWFkU3RydWN0QmVnaW4oKTsKKyAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIHZhciByID0gdGhpcy5yZWFkRmllbGRCZWdpbigpOworICAgICAgICBpZiAoci5mdHlwZSA9PT0gVHlwZS5TVE9QKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5za2lwKHIuZnR5cGUpOworICAgICAgICB0aGlzLnJlYWRGaWVsZEVuZCgpOworICAgICAgfQorICAgICAgdGhpcy5yZWFkU3RydWN0RW5kKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFR5cGUuTUFQOgorICAgICAgdmFyIG1hcEJlZ2luID0gdGhpcy5yZWFkTWFwQmVnaW4oKTsKKyAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWFwQmVnaW4uc2l6ZTsgKytpKSB7CisgICAgICAgIHRoaXMuc2tpcChtYXBCZWdpbi5rdHlwZSk7CisgICAgICAgIHRoaXMuc2tpcChtYXBCZWdpbi52dHlwZSk7CisgICAgICB9CisgICAgICB0aGlzLnJlYWRNYXBFbmQoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHlwZS5TRVQ6CisgICAgICB2YXIgc2V0QmVnaW4gPSB0aGlzLnJlYWRTZXRCZWdpbigpOworICAgICAgZm9yICh2YXIgaTIgPSAwOyBpMiA8IHNldEJlZ2luLnNpemU7ICsraTIpIHsKKyAgICAgICAgdGhpcy5za2lwKHNldEJlZ2luLmV0eXBlKTsKKyAgICAgIH0KKyAgICAgIHRoaXMucmVhZFNldEVuZCgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUeXBlLkxJU1Q6CisgICAgICB2YXIgbGlzdEJlZ2luID0gdGhpcy5yZWFkTGlzdEJlZ2luKCk7CisgICAgICBmb3IgKHZhciBpMyA9IDA7IGkzIDwgbGlzdEJlZ2luLnNpemU7ICsraTMpIHsKKyAgICAgICAgdGhpcy5za2lwKGxpc3RCZWdpbi5ldHlwZSk7CisgICAgICB9CisgICAgICB0aGlzLnJlYWRMaXN0RW5kKCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgbmV3ICBFcnJvcigiSW52YWxpZCB0eXBlOiAiICsgdHlwZSk7CisgIH0KK307CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2xpYi90aHJpZnQvY29ubmVjdGlvbi5qcyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9jb25uZWN0aW9uLmpzCmluZGV4IGFhOTg1ZGYuLjllNWMwNjMgMTAwNjQ0Ci0tLSBhL2xpYi9ub2RlanMvbGliL3RocmlmdC9jb25uZWN0aW9uLmpzCisrKyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9jb25uZWN0aW9uLmpzCkBAIC0xNiw0NyArMTYsNTYgQEAKICAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCi12YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKSwKLSAgICBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCJldmVudHMiKS5FdmVudEVtaXR0ZXIsCi0gICAgbmV0ID0gcmVxdWlyZSgnbmV0JyksCi0gICAgdGxzID0gcmVxdWlyZSgndGxzJyksCi0gICAgdHRyYW5zcG9ydCA9IHJlcXVpcmUoJy4vdHJhbnNwb3J0JyksCi0gICAgdHByb3RvY29sID0gcmVxdWlyZSgnLi9wcm90b2NvbCcpLAotICAgIHRocmlmdCA9IHJlcXVpcmUoJy4vdGhyaWZ0Jyk7Cit2YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTsKK3ZhciBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXI7Cit2YXIgY29uc3RhbnRzID0gcmVxdWlyZSgnY29uc3RhbnRzJyk7Cit2YXIgbmV0ID0gcmVxdWlyZSgnbmV0Jyk7Cit2YXIgdGxzID0gcmVxdWlyZSgndGxzJyk7Cit2YXIgdGhyaWZ0ID0gcmVxdWlyZSgnLi90aHJpZnQnKTsKK3ZhciBsb2cgPSByZXF1aXJlKCcuL2xvZycpOworCit2YXIgVEJ1ZmZlcmVkVHJhbnNwb3J0ID0gcmVxdWlyZSgnLi9idWZmZXJlZF90cmFuc3BvcnQnKTsKK3ZhciBUQmluYXJ5UHJvdG9jb2wgPSByZXF1aXJlKCcuL2JpbmFyeV9wcm90b2NvbCcpOwordmFyIElucHV0QnVmZmVyVW5kZXJydW5FcnJvciA9IHJlcXVpcmUoJy4vaW5wdXRfYnVmZmVyX3VuZGVycnVuX2Vycm9yJyk7CisKK3ZhciBjcmVhdGVDbGllbnQgPSByZXF1aXJlKCcuL2NyZWF0ZV9jbGllbnQnKTsKIAogdmFyIGJpbmFyeSA9IHJlcXVpcmUoJy4vYmluYXJ5Jyk7CiAKIHZhciBDb25uZWN0aW9uID0gZXhwb3J0cy5Db25uZWN0aW9uID0gZnVuY3Rpb24oc3RyZWFtLCBvcHRpb25zKSB7CiAgIHZhciBzZWxmID0gdGhpczsKICAgRXZlbnRFbWl0dGVyLmNhbGwodGhpcyk7Ci0gIAorCiAgIHRoaXMuc2VxSWQyU2VydmljZSA9IHt9OwogICB0aGlzLmNvbm5lY3Rpb24gPSBzdHJlYW07CisgIHRoaXMuc3NsID0gKHN0cmVhbS5lbmNyeXB0ZWQpOwogICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwotICB0aGlzLnRyYW5zcG9ydCA9IHRoaXMub3B0aW9ucy50cmFuc3BvcnQgfHwgdHRyYW5zcG9ydC5UQnVmZmVyZWRUcmFuc3BvcnQ7Ci0gIHRoaXMucHJvdG9jb2wgPSB0aGlzLm9wdGlvbnMucHJvdG9jb2wgfHwgdHByb3RvY29sLlRCaW5hcnlQcm90b2NvbDsKKyAgdGhpcy50cmFuc3BvcnQgPSB0aGlzLm9wdGlvbnMudHJhbnNwb3J0IHx8IFRCdWZmZXJlZFRyYW5zcG9ydDsKKyAgdGhpcy5wcm90b2NvbCA9IHRoaXMub3B0aW9ucy5wcm90b2NvbCB8fCBUQmluYXJ5UHJvdG9jb2w7CiAgIHRoaXMub2ZmbGluZV9xdWV1ZSA9IFtdOwogICB0aGlzLmNvbm5lY3RlZCA9IGZhbHNlOworICB0aGlzLmluaXRpYWxpemVfcmV0cnlfdmFycygpOwogCiAgIHRoaXMuX2RlYnVnID0gdGhpcy5vcHRpb25zLmRlYnVnIHx8IGZhbHNlOwotICBpZiAodGhpcy5vcHRpb25zLm1heF9hdHRlbXB0cyAmJiAKLSAgICAgICFpc05hTih0aGlzLm9wdGlvbnMubWF4X2F0dGVtcHRzKSAmJiAKKyAgaWYgKHRoaXMub3B0aW9ucy5tYXhfYXR0ZW1wdHMgJiYKKyAgICAgICFpc05hTih0aGlzLm9wdGlvbnMubWF4X2F0dGVtcHRzKSAmJgogICAgICAgdGhpcy5vcHRpb25zLm1heF9hdHRlbXB0cyA+IDApIHsKICAgICAgdGhpcy5tYXhfYXR0ZW1wdHMgPSArdGhpcy5vcHRpb25zLm1heF9hdHRlbXB0czsKICAgfQogICB0aGlzLnJldHJ5X21heF9kZWxheSA9IG51bGw7Ci0gIGlmICh0aGlzLm9wdGlvbnMucmV0cnlfbWF4X2RlbGF5ICE9PSB1bmRlZmluZWQgJiYgCi0gICAgICAhaXNOYU4odGhpcy5vcHRpb25zLnJldHJ5X21heF9kZWxheSkgJiYgCisgIGlmICh0aGlzLm9wdGlvbnMucmV0cnlfbWF4X2RlbGF5ICE9PSB1bmRlZmluZWQgJiYKKyAgICAgICFpc05hTih0aGlzLm9wdGlvbnMucmV0cnlfbWF4X2RlbGF5KSAmJgogICAgICAgdGhpcy5vcHRpb25zLnJldHJ5X21heF9kZWxheSA+IDApIHsKICAgICAgdGhpcy5yZXRyeV9tYXhfZGVsYXkgPSB0aGlzLm9wdGlvbnMucmV0cnlfbWF4X2RlbGF5OwogICB9CiAgIHRoaXMuY29ubmVjdF90aW1lb3V0ID0gZmFsc2U7Ci0gIGlmICh0aGlzLm9wdGlvbnMuY29ubmVjdF90aW1lb3V0ICYmIAotICAgICAgIWlzTmFOKHRoaXMub3B0aW9ucy5jb25uZWN0X3RpbWVvdXQpICYmIAorICBpZiAodGhpcy5vcHRpb25zLmNvbm5lY3RfdGltZW91dCAmJgorICAgICAgIWlzTmFOKHRoaXMub3B0aW9ucy5jb25uZWN0X3RpbWVvdXQpICYmCiAgICAgICB0aGlzLm9wdGlvbnMuY29ubmVjdF90aW1lb3V0ID4gMCkgewogICAgICB0aGlzLmNvbm5lY3RfdGltZW91dCA9ICt0aGlzLm9wdGlvbnMuY29ubmVjdF90aW1lb3V0OwogICB9Ci0gIHRoaXMuY29ubmVjdGlvbi5hZGRMaXN0ZW5lcigiY29ubmVjdCIsIGZ1bmN0aW9uKCkgeworCisgIHRoaXMuY29ubmVjdGlvbi5hZGRMaXN0ZW5lcih0aGlzLnNzbCA/ICJzZWN1cmVDb25uZWN0IiA6ICJjb25uZWN0IiwgZnVuY3Rpb24oKSB7CiAgICAgc2VsZi5jb25uZWN0ZWQgPSB0cnVlOwogCiAgICAgdGhpcy5zZXRUaW1lb3V0KHNlbGYub3B0aW9ucy50aW1lb3V0IHx8IDApOwpAQCAtNzMsMzQgKzgyLDE0IEBACiAgICAgc2VsZi5lbWl0KCJjb25uZWN0Iik7CiAgIH0pOwogCi0gIHRoaXMuY29ubmVjdGlvbi5hZGRMaXN0ZW5lcigic2VjdXJlQ29ubmVjdCIsIGZ1bmN0aW9uKCkgewotICAgIHNlbGYuY29ubmVjdGVkID0gdHJ1ZTsKLQotICAgIHRoaXMuc2V0VGltZW91dChzZWxmLm9wdGlvbnMudGltZW91dCB8fCAwKTsKLSAgICB0aGlzLnNldE5vRGVsYXkoKTsKLSAgICB0aGlzLmZyYW1lTGVmdCA9IDA7Ci0gICAgdGhpcy5mcmFtZVBvcyA9IDA7Ci0gICAgdGhpcy5mcmFtZSA9IG51bGw7Ci0gICAgc2VsZi5pbml0aWFsaXplX3JldHJ5X3ZhcnMoKTsKLQotICAgIHNlbGYub2ZmbGluZV9xdWV1ZS5mb3JFYWNoKGZ1bmN0aW9uKGRhdGEpIHsKLSAgICAgIHNlbGYuY29ubmVjdGlvbi53cml0ZShkYXRhKTsKLSAgICB9KTsKLQotICAgIHNlbGYuZW1pdCgiY29ubmVjdCIpOwotICB9KTsKLQotCiAgIHRoaXMuY29ubmVjdGlvbi5hZGRMaXN0ZW5lcigiZXJyb3IiLCBmdW5jdGlvbihlcnIpIHsKICAgICAvLyBPbmx5IGVtaXQgdGhlIGVycm9yIGlmIG5vLW9uZSBlbHNlIGlzIGxpc3RlbmluZyBvbiB0aGUgY29ubmVjdGlvbgotICAgIC8vIG9yIGlmIHNvbWVvbmUgaXMgbGlzdGVuaW5nIG9uIHVzCi0gICAgaWYgKHNlbGYuY29ubmVjdGlvbi5saXN0ZW5lcnMoJ2Vycm9yJykubGVuZ3RoID09PSAxIHx8IAorICAgIC8vIG9yIGlmIHNvbWVvbmUgaXMgbGlzdGVuaW5nIG9uIHVzLCBiZWNhdXNlIE5vZGUgdHVybnMgdW5oYW5kbGVkCisgICAgLy8gJ2Vycm9yJyBldmVudHMgaW50byBleGNlcHRpb25zLgorICAgIGlmIChzZWxmLmNvbm5lY3Rpb24ubGlzdGVuZXJzKCdlcnJvcicpLmxlbmd0aCA9PT0gMSB8fAogICAgICAgICBzZWxmLmxpc3RlbmVycygnZXJyb3InKS5sZW5ndGggPiAwKSB7CiAgICAgICBzZWxmLmVtaXQoImVycm9yIiwgZXJyKTsKICAgICB9Ci0gICAgLy8gImVycm9yIiBldmVudHMgZ2V0IHR1cm5lZCBpbnRvIGV4Y2VwdGlvbnMgaWYgdGhleSBhcmVuJ3QgbGlzdGVuZWQgZm9yLiAgSWYgdGhlIHVzZXIgaGFuZGxlZCB0aGlzIGVycm9yCi0gICAgLy8gdGhlbiB3ZSBzaG91bGQgdHJ5IHRvIHJlY29ubmVjdC4KLSAgICBzZWxmLmNvbm5lY3Rpb25fZ29uZSgpOwogICB9KTsKIAogICAvLyBBZGQgYSBjbG9zZSBsaXN0ZW5lcgpAQCAtMTIzLDI1ICsxMTIsMjcgQEAKICAgICAgICAgLy8gIGluIHNlcUlkMlNlcnZpY2UuIElmIHRoZSBTZXFJZCBpcyBmb3VuZCBpbiB0aGUgaGFzaCB3ZSBuZWVkIHRvCiAgICAgICAgIC8vICBsb29rdXAgdGhlIGFwcHJvcHJpYXRlIGNsaWVudCBmb3IgdGhpcyBjYWxsLgogICAgICAgICAvLyAgVGhlIGNvbm5lY3Rpb24uY2xpZW50IG9iamVjdCBpcyBhIHNpbmdsZSBjbGllbnQgb2JqZWN0IHdoZW4gbm90Ci0gICAgICAgIC8vICBtdWx0aXBsZXhpbmcsIHdoZW4gdXNpbmcgbXVsdGlwbGV4aW5nIGl0IGlzIGEgc2VydmljZSBuYW1lIGtleWVkIAorICAgICAgICAvLyAgbXVsdGlwbGV4aW5nLCB3aGVuIHVzaW5nIG11bHRpcGxleGluZyBpdCBpcyBhIHNlcnZpY2UgbmFtZSBrZXllZAogICAgICAgICAvLyAgaGFzaCBvZiBjbGllbnQgb2JqZWN0cy4KICAgICAgICAgLy9OT1RFOiBUaGUgMiB3YXkgaW50ZXJkZXBlbmRlbmNpZXMgYmV0d2VlbiBwcm90b2NvbHMsIHRyYW5zcG9ydHMsCiAgICAgICAgIC8vICBjb25uZWN0aW9ucyBhbmQgY2xpZW50cyBpbiB0aGUgTm9kZS5qcyBpbXBsZW1lbnRhdGlvbiBhcmUgaXJyZWd1bGFyCi0gICAgICAgIC8vICBhbmQgbWFrZSB0aGUgaW1wbGVtZW50YXRpb24gZGlmZmljdWx0IHRvIGV4dGVuZCBhbmQgbWFpbnRhaW4uIFdlIAotICAgICAgICAvLyAgc2hvdWxkIGJyaW5nIHRoaXMgc3R1ZmYgaW5saW5lIHdpdGggdHlwaWNhbCB0aHJpZnQgSS9PIHN0YWNrIAorICAgICAgICAvLyAgYW5kIG1ha2UgdGhlIGltcGxlbWVudGF0aW9uIGRpZmZpY3VsdCB0byBleHRlbmQgYW5kIG1haW50YWluLiBXZQorICAgICAgICAvLyAgc2hvdWxkIGJyaW5nIHRoaXMgc3R1ZmYgaW5saW5lIHdpdGggdHlwaWNhbCB0aHJpZnQgSS9PIHN0YWNrCiAgICAgICAgIC8vICBvcGVyYXRpb24gc29vbi4KICAgICAgICAgLy8gIC0tcmEKICAgICAgICAgdmFyIHNlcnZpY2VfbmFtZSA9IHNlbGYuc2VxSWQyU2VydmljZVtoZWFkZXIucnNlcWlkXTsKICAgICAgICAgaWYgKHNlcnZpY2VfbmFtZSkgewogICAgICAgICAgIGNsaWVudCA9IHNlbGYuY2xpZW50W3NlcnZpY2VfbmFtZV07Ci0gICAgICAgICAgZGVsZXRlIHNlbGYuc2VxSWQyU2VydmljZVtoZWFkZXIucnNlcWlkXTsKICAgICAgICAgfQogICAgICAgICAvKmpzaGludCAtVzA4MyAqLwotICAgICAgICBjbGllbnQuX3JlcXNbZHVtbXlfc2VxaWRdID0gZnVuY3Rpb24oZXJyLCBzdWNjZXNzKXsgCisgICAgICAgIGNsaWVudC5fcmVxc1tkdW1teV9zZXFpZF0gPSBmdW5jdGlvbihlcnIsIHN1Y2Nlc3MpewogICAgICAgICAgIHRyYW5zcG9ydF93aXRoX2RhdGEuY29tbWl0UG9zaXRpb24oKTsKIAogICAgICAgICAgIHZhciBjYWxsYmFjayA9IGNsaWVudC5fcmVxc1toZWFkZXIucnNlcWlkXTsKICAgICAgICAgICBkZWxldGUgY2xpZW50Ll9yZXFzW2hlYWRlci5yc2VxaWRdOworICAgICAgICAgIGlmIChzZXJ2aWNlX25hbWUpIHsKKyAgICAgICAgICAgIGRlbGV0ZSBzZWxmLnNlcUlkMlNlcnZpY2VbaGVhZGVyLnJzZXFpZF07CisgICAgICAgICAgfQogICAgICAgICAgIGlmIChjYWxsYmFjaykgewogICAgICAgICAgICAgY2FsbGJhY2soZXJyLCBzdWNjZXNzKTsKICAgICAgICAgICB9CkBAIC0xNTIsMTggKzE0MywxOCBAQAogICAgICAgICAgIGNsaWVudFsncmVjdl8nICsgaGVhZGVyLmZuYW1lXShtZXNzYWdlLCBoZWFkZXIubXR5cGUsIGR1bW15X3NlcWlkKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICBkZWxldGUgY2xpZW50Ll9yZXFzW2R1bW15X3NlcWlkXTsKLSAgICAgICAgICBzZWxmLmVtaXQoImVycm9yIiwgCisgICAgICAgICAgc2VsZi5lbWl0KCJlcnJvciIsCiAgICAgICAgICAgICAgICAgICAgIG5ldyB0aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uKHRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb25UeXBlLldST05HX01FVEhPRF9OQU1FLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVjZWl2ZWQgYSByZXNwb25zZSB0byBhbiB1bmtub3duIFJQQyBmdW5jdGlvbiIpKTsKICAgICAgICAgfQogICAgICAgfQogICAgIH0KICAgICBjYXRjaCAoZSkgewotICAgICAgaWYgKGUgaW5zdGFuY2VvZiB0dHJhbnNwb3J0LklucHV0QnVmZmVyVW5kZXJydW5FcnJvcikgeworICAgICAgaWYgKGUgaW5zdGFuY2VvZiBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IpIHsKICAgICAgICAgdHJhbnNwb3J0X3dpdGhfZGF0YS5yb2xsYmFja1Bvc2l0aW9uKCk7CiAgICAgICB9CiAgICAgICBlbHNlIHsKLSAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgc2VsZi5lbWl0KCdlcnJvcicsIGUpOwogICAgICAgfQogICAgIH0KICAgfSkpOwpAQCAtMTc0LDYgKzE2NSwxMCBAQAogICB0aGlzLmNvbm5lY3Rpb24uZW5kKCk7CiB9OwogCitDb25uZWN0aW9uLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24oKSB7CisgIHRoaXMuY29ubmVjdGlvbi5kZXN0cm95KCk7Cit9OworCiBDb25uZWN0aW9uLnByb3RvdHlwZS5pbml0aWFsaXplX3JldHJ5X3ZhcnMgPSBmdW5jdGlvbiAoKSB7CiAgIHRoaXMucmV0cnlfdGltZXIgPSBudWxsOwogICB0aGlzLnJldHJ5X3RvdGFsdGltZSA9IDA7CkBAIC0xOTIsMjggKzE4NywyNSBAQAogCiBDb25uZWN0aW9uLnByb3RvdHlwZS5jb25uZWN0aW9uX2dvbmUgPSBmdW5jdGlvbiAoKSB7CiAgIHZhciBzZWxmID0gdGhpczsKKyAgdGhpcy5jb25uZWN0ZWQgPSBmYWxzZTsKIAogICAvLyBJZiBhIHJldHJ5IGlzIGFscmVhZHkgaW4gcHJvZ3Jlc3MsIGp1c3QgbGV0IHRoYXQgaGFwcGVuCiAgIGlmICh0aGlzLnJldHJ5X3RpbWVyKSB7CiAgICAgcmV0dXJuOwogICB9Ci0gIGlmICghdGhpcy5tYXhfYXR0ZW1wdHMpIHsKKyAgLy8gV2UgY2Fubm90IHJlY29ubmVjdCBhIHNlY3VyZSBzb2NrZXQuCisgIGlmICghdGhpcy5tYXhfYXR0ZW1wdHMgfHwgdGhpcy5zc2wpIHsKICAgICBzZWxmLmVtaXQoImNsb3NlIik7CiAgICAgcmV0dXJuOwogICB9CiAKLSAgdGhpcy5jb25uZWN0ZWQgPSBmYWxzZTsKLSAgdGhpcy5yZWFkeSA9IGZhbHNlOwotCi0gIGlmICh0aGlzLnJldHJ5X21heF9kZWxheSAhPT0gbnVsbCAmJiB0aGlzLnJldHJ5X2RlbGF5ID4gdGhpcy5yZXRyeV9tYXhfZGVsYXkpIHsKKyAgaWYgKHRoaXMucmV0cnlfbWF4X2RlbGF5ICE9PSBudWxsICYmIHRoaXMucmV0cnlfZGVsYXkgPj0gdGhpcy5yZXRyeV9tYXhfZGVsYXkpIHsKICAgICB0aGlzLnJldHJ5X2RlbGF5ID0gdGhpcy5yZXRyeV9tYXhfZGVsYXk7CiAgIH0gZWxzZSB7CiAgICAgdGhpcy5yZXRyeV9kZWxheSA9IE1hdGguZmxvb3IodGhpcy5yZXRyeV9kZWxheSAqIHRoaXMucmV0cnlfYmFja29mZik7CiAgIH0KIAotICBpZiAoc2VsZi5fZGVidWcpIHsKLSAgICBjb25zb2xlLmxvZygiUmV0cnkgY29ubmVjdGlvbiBpbiAiICsgdGhpcy5yZXRyeV9kZWxheSArICIgbXMiKTsKLSAgfQorICBsb2cuZGVidWcoIlJldHJ5IGNvbm5lY3Rpb24gaW4gIiArIHRoaXMucmV0cnlfZGVsYXkgKyAiIG1zIik7CiAKICAgaWYgKHRoaXMubWF4X2F0dGVtcHRzICYmIHRoaXMuYXR0ZW1wdHMgPj0gdGhpcy5tYXhfYXR0ZW1wdHMpIHsKICAgICB0aGlzLnJldHJ5X3RpbWVyID0gbnVsbDsKQEAgLTIyOSw5ICsyMjEsMTIgQEAKICAgfSk7CiAKICAgdGhpcy5yZXRyeV90aW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewotICAgIGlmIChzZWxmLl9kZWJ1ZykgewotICAgICAgIGNvbnNvbGUubG9nKCJSZXRyeWluZyBjb25uZWN0aW9uLi4uIik7Ci0JfQorICAgIGlmIChzZWxmLmNvbm5lY3Rpb24uZGVzdHJveWVkKSB7CisgICAgICBzZWxmLnJldHJ5X3RpbWVyID0gbnVsbDsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBsb2cuZGVidWcoIlJldHJ5aW5nIGNvbm5lY3Rpb24uLi4iKTsKIAogICAgIHNlbGYucmV0cnlfdG90YWx0aW1lICs9IHNlbGYucmV0cnlfZGVsYXk7CiAKQEAgLTI0Miw3ICsyMzcsMTEgQEAKICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgc2VsZi5jb25uZWN0aW9uLmNvbm5lY3Qoc2VsZi5wb3J0LCBzZWxmLmhvc3QpOworICAgIGlmIChzZWxmLnBhdGggIT09IHVuZGVmaW5lZCkgeworICAgICAgc2VsZi5jb25uZWN0aW9uLmNvbm5lY3Qoc2VsZi5wYXRoKTsKKyAgICB9IGVsc2UgeworICAgICAgc2VsZi5jb25uZWN0aW9uLmNvbm5lY3Qoc2VsZi5wb3J0LCBzZWxmLmhvc3QpOworICAgIH0KICAgICBzZWxmLnJldHJ5X3RpbWVyID0gbnVsbDsKICAgfSwgdGhpcy5yZXRyeV9kZWxheSk7CiB9OwpAQCAtMjU2LDcgKzI1NSwyMCBAQAogICByZXR1cm4gY29ubmVjdGlvbjsKIH07CiAKK2V4cG9ydHMuY3JlYXRlVURTQ29ubmVjdGlvbiA9IGZ1bmN0aW9uKHBhdGgsIG9wdGlvbnMpIHsKKyAgdmFyIHN0cmVhbSA9IG5ldC5jcmVhdGVDb25uZWN0aW9uKHBhdGgpOworICB2YXIgY29ubmVjdGlvbiA9IG5ldyBDb25uZWN0aW9uKHN0cmVhbSwgb3B0aW9ucyk7CisgIGNvbm5lY3Rpb24ucGF0aCA9IHBhdGg7CisKKyAgcmV0dXJuIGNvbm5lY3Rpb247Cit9OworCiBleHBvcnRzLmNyZWF0ZVNTTENvbm5lY3Rpb24gPSBmdW5jdGlvbihob3N0LCBwb3J0LCBvcHRpb25zKSB7CisgIGlmICghKCdzZWN1cmVQcm90b2NvbCcgaW4gb3B0aW9ucykgJiYgISgnc2VjdXJlT3B0aW9ucycgaW4gb3B0aW9ucykpIHsKKyAgICBvcHRpb25zLnNlY3VyZVByb3RvY29sID0gIlNTTHYyM19tZXRob2QiOworICAgIG9wdGlvbnMuc2VjdXJlT3B0aW9ucyA9IGNvbnN0YW50cy5TU0xfT1BfTk9fU1NMdjIgfCBjb25zdGFudHMuU1NMX09QX05PX1NTTHYzOworICB9CisKICAgdmFyIHN0cmVhbSA9IHRscy5jb25uZWN0KHBvcnQsIGhvc3QsIG9wdGlvbnMpOwogICB2YXIgY29ubmVjdGlvbiA9IG5ldyBDb25uZWN0aW9uKHN0cmVhbSwgb3B0aW9ucyk7CiAgIGNvbm5lY3Rpb24uaG9zdCA9IGhvc3Q7CkBAIC0yNjYsMTkgKzI3OCw3IEBACiB9OwogCiAKLWV4cG9ydHMuY3JlYXRlQ2xpZW50ID0gZnVuY3Rpb24oY2xzLCBjb25uZWN0aW9uKSB7Ci0gIGlmIChjbHMuQ2xpZW50KSB7Ci0gICAgY2xzID0gY2xzLkNsaWVudDsKLSAgfQotICB2YXIgY2xpZW50ID0gbmV3IGNscyhuZXcgY29ubmVjdGlvbi50cmFuc3BvcnQodW5kZWZpbmVkLCBmdW5jdGlvbihidWYpIHsKLSAgICBjb25uZWN0aW9uLndyaXRlKGJ1Zik7Ci0gIH0pLCBjb25uZWN0aW9uLnByb3RvY29sKTsKLQotICAvLyBUT0RPIGNsZWFuIHRoaXMgdXAKLSAgY29ubmVjdGlvbi5jbGllbnQgPSBjbGllbnQ7Ci0KLSAgcmV0dXJuIGNsaWVudDsKLX07CitleHBvcnRzLmNyZWF0ZUNsaWVudCA9IGNyZWF0ZUNsaWVudDsKIAogdmFyIGNoaWxkX3Byb2Nlc3MgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJyk7CiB2YXIgU3RkSU9Db25uZWN0aW9uID0gZXhwb3J0cy5TdGRJT0Nvbm5lY3Rpb24gPSBmdW5jdGlvbihjb21tYW5kLCBvcHRpb25zKSB7CkBAIC0yOTAsMjAgKzI5MCwxOSBAQAogICB2YXIgc2VsZiA9IHRoaXM7CiAgIEV2ZW50RW1pdHRlci5jYWxsKHRoaXMpOwogCi0gIHRoaXMuX2RlYnVnID0gb3B0aW9ucy5kZWJ1ZyB8fCBmYWxzZTsKICAgdGhpcy5jb25uZWN0aW9uID0gY2hpbGQuc3RkaW47CiAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwge307Ci0gIHRoaXMudHJhbnNwb3J0ID0gdGhpcy5vcHRpb25zLnRyYW5zcG9ydCB8fCB0dHJhbnNwb3J0LlRCdWZmZXJlZFRyYW5zcG9ydDsKLSAgdGhpcy5wcm90b2NvbCA9IHRoaXMub3B0aW9ucy5wcm90b2NvbCB8fCB0cHJvdG9jb2wuVEJpbmFyeVByb3RvY29sOworICB0aGlzLnRyYW5zcG9ydCA9IHRoaXMub3B0aW9ucy50cmFuc3BvcnQgfHwgVEJ1ZmZlcmVkVHJhbnNwb3J0OworICB0aGlzLnByb3RvY29sID0gdGhpcy5vcHRpb25zLnByb3RvY29sIHx8IFRCaW5hcnlQcm90b2NvbDsKICAgdGhpcy5vZmZsaW5lX3F1ZXVlID0gW107CiAKLSAgaWYodGhpcy5fZGVidWcgPT09IHRydWUpewotICAgIHRoaXMuY2hpbGQuc3RkZXJyLm9uKCdkYXRhJyxmdW5jdGlvbihlcnIpewotICAgICAgY29uc29sZS5sb2coZXJyLnRvU3RyaW5nKCksJ0NISUxEIEVSUk9SJyk7CisgIGlmIChsb2cuZ2V0TG9nTGV2ZWwoKSA9PT0gJ2RlYnVnJykgeworICAgIHRoaXMuY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGVycikgeworICAgICAgbG9nLmRlYnVnKGVyci50b1N0cmluZygpLCAnQ0hJTEQgRVJST1InKTsKICAgICB9KTsKIAotICAgIHRoaXMuY2hpbGQub24oJ2V4aXQnLGZ1bmN0aW9uKGNvZGUsc2lnbmFsKXsKLSAgICAgIGNvbnNvbGUubG9nKGNvZGUrJzonK3NpZ25hbCwnQ0hJTEQgRVhJVEVEJyk7CisgICAgdGhpcy5jaGlsZC5vbignZXhpdCcsIGZ1bmN0aW9uIChjb2RlLHNpZ25hbCkgeworICAgICAgbG9nLmRlYnVnKGNvZGUgKyAnOicgKyBzaWduYWwsICdDSElMRCBFWElURUQnKTsKICAgICB9KTsKICAgfQogCkBAIC0zNDQsNyArMzQzLDcgQEAKICAgICAgIGNsaWVudFsncmVjdl8nICsgaGVhZGVyLmZuYW1lXShtZXNzYWdlLCBoZWFkZXIubXR5cGUsIGR1bW15X3NlcWlkKTsKICAgICB9CiAgICAgY2F0Y2ggKGUpIHsKLSAgICAgIGlmIChlIGluc3RhbmNlb2YgdHRyYW5zcG9ydC5JbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IpIHsKKyAgICAgIGlmIChlIGluc3RhbmNlb2YgSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yKSB7CiAgICAgICAgIHRyYW5zcG9ydF93aXRoX2RhdGEucm9sbGJhY2tQb3NpdGlvbigpOwogICAgICAgfQogICAgICAgZWxzZSB7CkBAIC0zNzIsMTcgKzM3MSw0IEBACiAgIHJldHVybiBuZXcgU3RkSU9Db25uZWN0aW9uKGNvbW1hbmQsb3B0aW9ucyk7CiB9OwogCi1leHBvcnRzLmNyZWF0ZVN0ZElPQ2xpZW50ID0gZnVuY3Rpb24oY2xzLGNvbm5lY3Rpb24pIHsKLSAgaWYgKGNscy5DbGllbnQpIHsKLSAgICBjbHMgPSBjbHMuQ2xpZW50OwotICB9Ci0KLSAgdmFyIGNsaWVudCA9IG5ldyBjbHMobmV3IGNvbm5lY3Rpb24udHJhbnNwb3J0KHVuZGVmaW5lZCwgZnVuY3Rpb24oYnVmKSB7Ci0gICAgY29ubmVjdGlvbi53cml0ZShidWYpOwotICB9KSwgY29ubmVjdGlvbi5wcm90b2NvbCk7Ci0KLSAgLy8gVE9ETyBjbGVhbiB0aGlzIHVwCi0gIGNvbm5lY3Rpb24uY2xpZW50ID0gY2xpZW50OwotCi0gIHJldHVybiBjbGllbnQ7Ci19OworZXhwb3J0cy5jcmVhdGVTdGRJT0NsaWVudCA9IGNyZWF0ZUNsaWVudDsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvbGliL3RocmlmdC9jcmVhdGVfY2xpZW50LmpzIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L2NyZWF0ZV9jbGllbnQuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZiNzdhOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9jcmVhdGVfY2xpZW50LmpzCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworbW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVDbGllbnQ7CisKKy8qKgorICogQ3JlYXRlcyBhIG5ldyBjbGllbnQgb2JqZWN0IGZvciB0aGUgc3BlY2lmaWVkIFRocmlmdCBzZXJ2aWNlLgorICogQHBhcmFtIHtvYmplY3R9IFNlcnZpY2VDbGllbnQgLSBUaGUgbW9kdWxlIGNvbnRhaW5pbmcgdGhlIGdlbmVyYXRlZCBzZXJ2aWNlIGNsaWVudAorICogQHBhcmFtIHtDb25uZWN0aW9ufSBDb25uZWN0aW9uIC0gVGhlIGNvbm5lY3Rpb24gdG8gdXNlLgorICogQHJldHVybnMge29iamVjdH0gVGhlIGNsaWVudCBvYmplY3QuCisgKi8KK2Z1bmN0aW9uIGNyZWF0ZUNsaWVudChTZXJ2aWNlQ2xpZW50LCBjb25uZWN0aW9uKSB7CisgIC8vIFRPRE8gdmFsaWRhdGUgcmVxdWlyZWQgb3B0aW9ucyBhbmQgdGhyb3cgb3RoZXJ3aXNlCisgIGlmIChTZXJ2aWNlQ2xpZW50LkNsaWVudCkgeworICAgIFNlcnZpY2VDbGllbnQgPSBTZXJ2aWNlQ2xpZW50LkNsaWVudDsKKyAgfQorICAvLyBUT0RPIGRldGFuZ2xlIHRoZXNlIGluaXRpYWxpemF0aW9uIGNhbGxzCisgIC8vIGNyZWF0aW5nICJjbGllbnQiIHJlcXVpcmVzCisgIC8vICAgLSBuZXcgc2VydmljZSBjbGllbnQgaW5zdGFuY2UKKyAgLy8KKyAgLy8gTmV3IHNlcnZpY2UgY2xpZW50IGluc3RhbmNlIHJlcXVpcmVzCisgIC8vICAgLSBuZXcgdHJhbnNwb3J0IGluc3RhbmNlCisgIC8vICAgLSBwcm90b2NvbCBjbGFzcyByZWZlcmVuY2UKKyAgLy8KKyAgLy8gTmV3IHRyYW5zcG9ydCBpbnN0YW5jZSByZXF1aXJlcworICAvLyAgIC0gQnVmZmVyIHRvIHVzZSAob3Igbm9uZSkKKyAgLy8gICAtIENhbGxiYWNrIHRvIGNhbGwgb24gZmx1c2gKKworICAvLyBXcmFwIHRoZSB3cml0ZSBtZXRob2QKKyAgdmFyIHdyaXRlQ2IgPSBmdW5jdGlvbihidWYsIHNlcWlkKSB7CisgICAgY29ubmVjdGlvbi53cml0ZShidWYsIHNlcWlkKTsKKyAgfTsKKyAgdmFyIHRyYW5zcG9ydCA9IG5ldyBjb25uZWN0aW9uLnRyYW5zcG9ydCh1bmRlZmluZWQsIHdyaXRlQ2IpOworICB2YXIgY2xpZW50ID0gbmV3IFNlcnZpY2VDbGllbnQodHJhbnNwb3J0LCBjb25uZWN0aW9uLnByb3RvY29sKTsKKyAgdHJhbnNwb3J0LmNsaWVudCA9IGNsaWVudDsKKyAgY29ubmVjdGlvbi5jbGllbnQgPSBjbGllbnQ7CisgIHJldHVybiBjbGllbnQ7Cit9OwpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9saWIvdGhyaWZ0L2ZyYW1lZF90cmFuc3BvcnQuanMgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvZnJhbWVkX3RyYW5zcG9ydC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTQ3OTI1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L2ZyYW1lZF90cmFuc3BvcnQuanMKQEAgLTAsMCArMSwxODIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordmFyIGJpbmFyeSA9IHJlcXVpcmUoJy4vYmluYXJ5Jyk7Cit2YXIgSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yID0gcmVxdWlyZSgnLi9pbnB1dF9idWZmZXJfdW5kZXJydW5fZXJyb3InKTsKKworbW9kdWxlLmV4cG9ydHMgPSBURnJhbWVkVHJhbnNwb3J0OworCitmdW5jdGlvbiBURnJhbWVkVHJhbnNwb3J0KGJ1ZmZlciwgY2FsbGJhY2spIHsKKyAgdGhpcy5pbkJ1ZiA9IGJ1ZmZlciB8fCBuZXcgQnVmZmVyKDApOworICB0aGlzLm91dEJ1ZmZlcnMgPSBbXTsKKyAgdGhpcy5vdXRDb3VudCA9IDA7CisgIHRoaXMucmVhZFBvcyA9IDA7CisgIHRoaXMub25GbHVzaCA9IGNhbGxiYWNrOworfTsKKworVEZyYW1lZFRyYW5zcG9ydC5yZWNlaXZlciA9IGZ1bmN0aW9uKGNhbGxiYWNrLCBzZXFpZCkgeworICB2YXIgcmVzaWR1YWwgPSBudWxsOworCisgIHJldHVybiBmdW5jdGlvbihkYXRhKSB7CisgICAgLy8gUHJlcGVuZCBhbnkgcmVzaWR1YWwgZGF0YSBmcm9tIG91ciBwcmV2aW91cyByZWFkCisgICAgaWYgKHJlc2lkdWFsKSB7CisgICAgICBkYXRhID0gQnVmZmVyLmNvbmNhdChbcmVzaWR1YWwsIGRhdGFdKTsKKyAgICAgIHJlc2lkdWFsID0gbnVsbDsKKyAgICB9CisKKyAgICAvLyBmcmFtZWQgdHJhbnNwb3J0CisgICAgd2hpbGUgKGRhdGEubGVuZ3RoKSB7CisgICAgICBpZiAoZGF0YS5sZW5ndGggPCA0KSB7CisgICAgICAgIC8vIE5vdCBlbm91Z2ggYnl0ZXMgdG8gY29udGludWUsIHNhdmUgYW5kIHJlc3VtZSBvbiBuZXh0IHBhY2tldAorICAgICAgICByZXNpZHVhbCA9IGRhdGE7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIHZhciBmcmFtZVNpemUgPSBiaW5hcnkucmVhZEkzMihkYXRhLCAwKTsKKyAgICAgIGlmIChkYXRhLmxlbmd0aCA8IDQgKyBmcmFtZVNpemUpIHsKKyAgICAgICAgLy8gTm90IGVub3VnaCBieXRlcyB0byBjb250aW51ZSwgc2F2ZSBhbmQgcmVzdW1lIG9uIG5leHQgcGFja2V0CisgICAgICAgIHJlc2lkdWFsID0gZGF0YTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB2YXIgZnJhbWUgPSBkYXRhLnNsaWNlKDQsIDQgKyBmcmFtZVNpemUpOworICAgICAgcmVzaWR1YWwgPSBkYXRhLnNsaWNlKDQgKyBmcmFtZVNpemUpOworCisgICAgICBjYWxsYmFjayhuZXcgVEZyYW1lZFRyYW5zcG9ydChmcmFtZSksIHNlcWlkKTsKKworICAgICAgZGF0YSA9IHJlc2lkdWFsOworICAgICAgcmVzaWR1YWwgPSBudWxsOworICAgIH0KKyAgfTsKK307CisKK1RGcmFtZWRUcmFuc3BvcnQucHJvdG90eXBlLmNvbW1pdFBvc2l0aW9uID0gZnVuY3Rpb24oKXt9LAorVEZyYW1lZFRyYW5zcG9ydC5wcm90b3R5cGUucm9sbGJhY2tQb3NpdGlvbiA9IGZ1bmN0aW9uKCl7fSwKKworICAvLyBUT0RPOiBJbXBsZW1lbnQgb3Blbi9jbG9zZSBzdXBwb3J0CitURnJhbWVkVHJhbnNwb3J0LnByb3RvdHlwZS5pc09wZW4gPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIHRydWU7Cit9OworVEZyYW1lZFRyYW5zcG9ydC5wcm90b3R5cGUub3BlbiA9IGZ1bmN0aW9uKCkge307CitURnJhbWVkVHJhbnNwb3J0LnByb3RvdHlwZS5jbG9zZSA9ICBmdW5jdGlvbigpIHt9OworCisgIC8vIFNldCB0aGUgc2VxaWQgb2YgdGhlIG1lc3NhZ2UgaW4gdGhlIGNsaWVudAorICAvLyBTbyB0aGF0IGNhbGxiYWNrcyBjYW4gYmUgZm91bmQKK1RGcmFtZWRUcmFuc3BvcnQucHJvdG90eXBlLnNldEN1cnJTZXFJZCA9IGZ1bmN0aW9uKHNlcWlkKSB7CisgIHRoaXMuX3NlcWlkID0gc2VxaWQ7Cit9OworCitURnJhbWVkVHJhbnNwb3J0LnByb3RvdHlwZS5lbnN1cmVBdmFpbGFibGUgPSBmdW5jdGlvbihsZW4pIHsKKyAgaWYgKHRoaXMucmVhZFBvcyArIGxlbiA+IHRoaXMuaW5CdWYubGVuZ3RoKSB7CisgICAgdGhyb3cgbmV3IElucHV0QnVmZmVyVW5kZXJydW5FcnJvcigpOworICB9Cit9OworCitURnJhbWVkVHJhbnNwb3J0LnByb3RvdHlwZS5yZWFkID0gZnVuY3Rpb24obGVuKSB7IC8vIHRoaXMgZnVuY3Rpb24gd2lsbCBiZSB1c2VkIGZvciBlYWNoIGZyYW1lcy4KKyAgdGhpcy5lbnN1cmVBdmFpbGFibGUobGVuKTsKKyAgdmFyIGVuZCA9IHRoaXMucmVhZFBvcyArIGxlbjsKKworICBpZiAodGhpcy5pbkJ1Zi5sZW5ndGggPCBlbmQpIHsKKyAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlYWQoJyArIGxlbiArICcpIGZhaWxlZCAtIG5vdCBlbm91Z2ggZGF0YScpOworICB9CisKKyAgdmFyIGJ1ZiA9IHRoaXMuaW5CdWYuc2xpY2UodGhpcy5yZWFkUG9zLCBlbmQpOworICB0aGlzLnJlYWRQb3MgPSBlbmQ7CisgIHJldHVybiBidWY7Cit9OworCitURnJhbWVkVHJhbnNwb3J0LnByb3RvdHlwZS5yZWFkQnl0ZSA9IGZ1bmN0aW9uKCkgeworICB0aGlzLmVuc3VyZUF2YWlsYWJsZSgxKTsKKyAgcmV0dXJuIGJpbmFyeS5yZWFkQnl0ZSh0aGlzLmluQnVmW3RoaXMucmVhZFBvcysrXSk7Cit9OworCitURnJhbWVkVHJhbnNwb3J0LnByb3RvdHlwZS5yZWFkSTE2ID0gZnVuY3Rpb24oKSB7CisgIHRoaXMuZW5zdXJlQXZhaWxhYmxlKDIpOworICB2YXIgaTE2ID0gYmluYXJ5LnJlYWRJMTYodGhpcy5pbkJ1ZiwgdGhpcy5yZWFkUG9zKTsKKyAgdGhpcy5yZWFkUG9zICs9IDI7CisgIHJldHVybiBpMTY7Cit9OworCitURnJhbWVkVHJhbnNwb3J0LnByb3RvdHlwZS5yZWFkSTMyID0gZnVuY3Rpb24oKSB7CisgIHRoaXMuZW5zdXJlQXZhaWxhYmxlKDQpOworICB2YXIgaTMyID0gYmluYXJ5LnJlYWRJMzIodGhpcy5pbkJ1ZiwgdGhpcy5yZWFkUG9zKTsKKyAgdGhpcy5yZWFkUG9zICs9IDQ7CisgIHJldHVybiBpMzI7Cit9OworCitURnJhbWVkVHJhbnNwb3J0LnByb3RvdHlwZS5yZWFkRG91YmxlID0gZnVuY3Rpb24oKSB7CisgIHRoaXMuZW5zdXJlQXZhaWxhYmxlKDgpOworICB2YXIgZCA9IGJpbmFyeS5yZWFkRG91YmxlKHRoaXMuaW5CdWYsIHRoaXMucmVhZFBvcyk7CisgIHRoaXMucmVhZFBvcyArPSA4OworICByZXR1cm4gZDsKK307CisKK1RGcmFtZWRUcmFuc3BvcnQucHJvdG90eXBlLnJlYWRTdHJpbmcgPSBmdW5jdGlvbihsZW4pIHsKKyAgdGhpcy5lbnN1cmVBdmFpbGFibGUobGVuKTsKKyAgdmFyIHN0ciA9IHRoaXMuaW5CdWYudG9TdHJpbmcoJ3V0ZjgnLCB0aGlzLnJlYWRQb3MsIHRoaXMucmVhZFBvcyArIGxlbik7CisgIHRoaXMucmVhZFBvcyArPSBsZW47CisgIHJldHVybiBzdHI7Cit9OworCitURnJhbWVkVHJhbnNwb3J0LnByb3RvdHlwZS5ib3Jyb3cgPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIHsKKyAgICBidWY6IHRoaXMuaW5CdWYsCisgICAgcmVhZEluZGV4OiB0aGlzLnJlYWRQb3MsCisgICAgd3JpdGVJbmRleDogdGhpcy5pbkJ1Zi5sZW5ndGgKKyAgfTsKK307CisKK1RGcmFtZWRUcmFuc3BvcnQucHJvdG90eXBlLmNvbnN1bWUgPSBmdW5jdGlvbihieXRlc0NvbnN1bWVkKSB7CisgIHRoaXMucmVhZFBvcyArPSBieXRlc0NvbnN1bWVkOworfTsKKworVEZyYW1lZFRyYW5zcG9ydC5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihidWYsIGVuY29kaW5nKSB7CisgIGlmICh0eXBlb2YoYnVmKSA9PT0gInN0cmluZyIpIHsKKyAgICBidWYgPSBuZXcgQnVmZmVyKGJ1ZiwgZW5jb2RpbmcgfHwgJ3V0ZjgnKTsKKyAgfQorICB0aGlzLm91dEJ1ZmZlcnMucHVzaChidWYpOworICB0aGlzLm91dENvdW50ICs9IGJ1Zi5sZW5ndGg7Cit9OworCitURnJhbWVkVHJhbnNwb3J0LnByb3RvdHlwZS5mbHVzaCA9IGZ1bmN0aW9uKCkgeworICAvLyBJZiB0aGUgc2VxaWQgb2YgdGhlIGNhbGxiYWNrIGlzIGF2YWlsYWJsZSBwYXNzIGl0IHRvIHRoZSBvbkZsdXNoCisgIC8vIFRoZW4gcmVtb3ZlIHRoZSBjdXJyZW50IHNlcWlkCisgIHZhciBzZXFpZCA9IHRoaXMuX3NlcWlkOworICB0aGlzLl9zZXFpZCA9IG51bGw7CisKKyAgdmFyIG91dCA9IG5ldyBCdWZmZXIodGhpcy5vdXRDb3VudCksCisgICAgICBwb3MgPSAwOworICB0aGlzLm91dEJ1ZmZlcnMuZm9yRWFjaChmdW5jdGlvbihidWYpIHsKKyAgICBidWYuY29weShvdXQsIHBvcywgMCk7CisgICAgcG9zICs9IGJ1Zi5sZW5ndGg7CisgIH0pOworCisgIGlmICh0aGlzLm9uRmx1c2gpIHsKKyAgICAvLyBUT0RPOiBvcHRpbWl6ZSB0aGlzIGJldHRlciwgYWxsb2NhdGUgb25lIGJ1ZmZlciBpbnN0ZWFkIG9mIGJvdGg6CisgICAgdmFyIG1zZyA9IG5ldyBCdWZmZXIob3V0Lmxlbmd0aCArIDQpOworICAgIGJpbmFyeS53cml0ZUkzMihtc2csIG91dC5sZW5ndGgpOworICAgIG91dC5jb3B5KG1zZywgNCwgMCwgb3V0Lmxlbmd0aCk7CisgICAgaWYgKHRoaXMub25GbHVzaCkgeworICAgICAgLy8gUGFzc2luZyBzZXFpZCB0aHJvdWdoIHRoaXMgY2FsbCB0byBnZXQgaXQgdG8gdGhlIGNvbm5lY3Rpb24KKyAgICAgIHRoaXMub25GbHVzaChtc2csIHNlcWlkKTsKKyAgICB9CisgIH0KKworICB0aGlzLm91dEJ1ZmZlcnMgPSBbXTsKKyAgdGhpcy5vdXRDb3VudCA9IDA7Cit9OwpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9saWIvdGhyaWZ0L2h0dHBfY29ubmVjdGlvbi5qcyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9odHRwX2Nvbm5lY3Rpb24uanMKaW5kZXggY2NmODgyZi4uM2MyYWIwZiAxMDA2NDQKLS0tIGEvbGliL25vZGVqcy9saWIvdGhyaWZ0L2h0dHBfY29ubmVjdGlvbi5qcworKysgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvaHR0cF9jb25uZWN0aW9uLmpzCkBAIC0xOSwxMCArMTksMTQgQEAKIHZhciB1dGlsID0gcmVxdWlyZSgndXRpbCcpOwogdmFyIGh0dHAgPSByZXF1aXJlKCdodHRwJyk7CiB2YXIgaHR0cHMgPSByZXF1aXJlKCdodHRwcycpOwotdmFyIEV2ZW50RW1pdHRlciA9IHJlcXVpcmUoImV2ZW50cyIpLkV2ZW50RW1pdHRlcjsKK3ZhciBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXI7CiB2YXIgdGhyaWZ0ID0gcmVxdWlyZSgnLi90aHJpZnQnKTsKLXZhciB0dHJhbnNwb3J0ID0gcmVxdWlyZSgnLi90cmFuc3BvcnQnKTsKLXZhciB0cHJvdG9jb2wgPSByZXF1aXJlKCcuL3Byb3RvY29sJyk7CisKK3ZhciBUQnVmZmVyZWRUcmFuc3BvcnQgPSByZXF1aXJlKCcuL2J1ZmZlcmVkX3RyYW5zcG9ydCcpOwordmFyIFRCaW5hcnlQcm90b2NvbCA9IHJlcXVpcmUoJy4vYmluYXJ5X3Byb3RvY29sJyk7Cit2YXIgSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yID0gcmVxdWlyZSgnLi9pbnB1dF9idWZmZXJfdW5kZXJydW5fZXJyb3InKTsKKwordmFyIGNyZWF0ZUNsaWVudCA9IHJlcXVpcmUoJy4vY3JlYXRlX2NsaWVudCcpOwogCiAvKioKICAqIEBjbGFzcwpAQCAtMzAsMTQgKzM0LDE0IEBACiAgKiBAcHJvcGVydHkge3N0cmluZ30gdHJhbnNwb3J0IC0gVGhlIFRocmlmdCBsYXllcmVkIHRyYW5zcG9ydCB0byB1c2UgKFRCdWZmZXJlZFRyYW5zcG9ydCwgZXRjKS4KICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwcm90b2NvbCAtIFRoZSBUaHJpZnQgc2VyaWFsaXphdGlvbiBwcm90b2NvbCB0byB1c2UgKFRCaW5hcnlQcm90b2NvbCwgZXRjLikuCiAgKiBAcHJvcGVydHkge3N0cmluZ30gcGF0aCAtIFRoZSBVUkwgcGF0aCB0byBQT1NUIHRvIChlLmcuICIvIiwgIi9teVN2YyIsICIvdGhyaWZ0L3F1b3RlU3ZjIiwgZXRjLikuCi0gKiBAcHJvcGVydHkge29iamVjdH0gaGVhZGVycyAtIEEgc3RhbmRhcmQgTm9kZS5qcyBoZWFkZXIgaGFzaCwgYW4gb2JqZWN0IGhhc2ggY29udGFpbmluZyBrZXkvdmFsdWUgCisgKiBAcHJvcGVydHkge29iamVjdH0gaGVhZGVycyAtIEEgc3RhbmRhcmQgTm9kZS5qcyBoZWFkZXIgaGFzaCwgYW4gb2JqZWN0IGhhc2ggY29udGFpbmluZyBrZXkvdmFsdWUKICAqICAgICAgICBwYWlycyB3aGVyZSB0aGUga2V5IGlzIHRoZSBoZWFkZXIgbmFtZSBzdHJpbmcgYW5kIHRoZSB2YWx1ZSBpcyB0aGUgaGVhZGVyIHZhbHVlIHN0cmluZy4KICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gaHR0cHMgLSBUcnVlIGNhdXNlcyB0aGUgY29ubmVjdGlvbiB0byB1c2UgaHR0cHMsIG90aGVyd2lzZSBodHRwIGlzIHVzZWQuCiAgKiBAcHJvcGVydHkge29iamVjdH0gbm9kZU9wdGlvbnMgLSBPcHRpb25zIHBhc3NlZCBvbiB0byBub2RlLgogICogQGV4YW1wbGUKICAqICAgICAvL1VzZSBhIGNvbm5lY3Rpb24gdGhhdCByZXF1aXJlcyBzc2wvdGxzLCBjbG9zZXMgdGhlIGNvbm5lY3Rpb24gYWZ0ZXIgZWFjaCByZXF1ZXN0LAogICogICAgIC8vICB1c2VzIHRoZSBidWZmZXJlZCB0cmFuc3BvcnQgbGF5ZXIsIHVzZXMgdGhlIEpTT04gcHJvdG9jb2wgYW5kIGRpcmVjdHMgUlBDIHRyYWZmaWMKLSAqICAgICAvLyAgdG8gaHR0cHM6Ly90aHJpZnQuZXhhbXBsZS5jb206OTA5MC9oZWxsbyAKKyAqICAgICAvLyAgdG8gaHR0cHM6Ly90aHJpZnQuZXhhbXBsZS5jb206OTA5MC9oZWxsbwogICogICAgIHZhciB0aHJpZnQgPSByZXF1aXJlKCd0aHJpZnQnKTsKICAqICAgICB2YXIgb3B0aW9ucyA9IHsKICAqICAgICAgICB0cmFuc3BvcnQ6IHRocmlmdC5UQnVmZmVyZWRUcmFuc3BvcnQsCkBAIC01Miw1MiArNTYsNTMgQEAKICAqLwogCiAvKioKLSAqIEluaXRpYWxpemVzIGEgVGhyaWZ0IEh0dHBDb25uZWN0aW9uIGluc3RhbmNlICh1c2UgY3JlYXRlSHR0cENvbm5lY3Rpb24oKSByYXRoZXIgdGhhbiAKKyAqIEluaXRpYWxpemVzIGEgVGhyaWZ0IEh0dHBDb25uZWN0aW9uIGluc3RhbmNlICh1c2UgY3JlYXRlSHR0cENvbm5lY3Rpb24oKSByYXRoZXIgdGhhbgogICogICAgaW5zdGFudGlhdGluZyBkaXJlY3RseSkuCiAgKiBAY29uc3RydWN0b3IKLSAqIEBwYXJhbSB7c3RyaW5nfSBob3N0IC0gVGhlIGhvc3QgbmFtZSBvciBJUCB0byBjb25uZWN0IHRvLgotICogQHBhcmFtIHtudW1iZXJ9IHBvcnQgLSBUaGUgVENQIHBvcnQgdG8gY29ubmVjdCB0by4KICAqIEBwYXJhbSB7Q29ubmVjdE9wdGlvbnN9IG9wdGlvbnMgLSBUaGUgY29uZmlndXJhdGlvbiBvcHRpb25zIHRvIHVzZS4KLSAqIEB0aHJvd3Mge2Vycm9yfSBFeGNlcHRpb25zIG90aGVyIHRoYW4gdHRyYW5zcG9ydC5JbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IgYXJlIHJldGhyb3duCisgKiBAdGhyb3dzIHtlcnJvcn0gRXhjZXB0aW9ucyBvdGhlciB0aGFuIElucHV0QnVmZmVyVW5kZXJydW5FcnJvciBhcmUgcmV0aHJvd24KICAqIEBldmVudCB7ZXJyb3J9IFRoZSAiZXJyb3IiIGV2ZW50IGlzIGZpcmVkIHdoZW4gYSBOb2RlLmpzIGVycm9yIGV2ZW50IG9jY3VycyBkdXJpbmcKICAqICAgICByZXF1ZXN0IG9yIHJlc3BvbnNlIHByb2Nlc3NpbmcsIGluIHdoaWNoIGNhc2UgdGhlIG5vZGUgZXJyb3IgaXMgcGFzc2VkIG9uLiBBbiAiZXJyb3IiCi0gKiAgICAgZXZlbnQgbWF5IGFsc28gYmUgZmlyZWQgd2hlbiB0aGUgY29ubmVjdGlzb24gY2FuIG5vdCBtYXAgYSByZXNwb25zZSBiYWNrIHRvIHRoZQorICogICAgIGV2ZW50IG1heSBhbHNvIGJlIGZpcmVkIHdoZW4gdGhlIGNvbm5lY3Rpb24gY2FuIG5vdCBtYXAgYSByZXNwb25zZSBiYWNrIHRvIHRoZQogICogICAgIGFwcHJvcHJpYXRlIGNsaWVudCAoYW4gaW50ZXJuYWwgZXJyb3IpLCBnZW5lcmF0aW5nIGEgVEFwcGxpY2F0aW9uRXhjZXB0aW9uLgotICogQGNsYXNzZGVzYyBIdHRwQ29ubmVjdGlvbiBvYmplY3RzIHByb3ZpZGUgVGhyaWZ0IGVuZCBwb2ludCB0cmFuc3BvcnQgCisgKiBAY2xhc3NkZXNjIEh0dHBDb25uZWN0aW9uIG9iamVjdHMgcHJvdmlkZSBUaHJpZnQgZW5kIHBvaW50IHRyYW5zcG9ydAogICogICAgIHNlbWFudGljcyBpbXBsZW1lbnRlZCBvdmVyIHRoZSBOb2RlLmpzIGh0dHAucmVxdWVzdCgpIG1ldGhvZC4KICAqIEBzZWUge0BsaW5rIGNyZWF0ZUh0dHBDb25uZWN0aW9ufQogICovCi12YXIgSHR0cENvbm5lY3Rpb24gPSBleHBvcnRzLkh0dHBDb25uZWN0aW9uID0gZnVuY3Rpb24oaG9zdCwgcG9ydCwgb3B0aW9ucykgewordmFyIEh0dHBDb25uZWN0aW9uID0gZXhwb3J0cy5IdHRwQ29ubmVjdGlvbiA9IGZ1bmN0aW9uKG9wdGlvbnMpIHsKICAgLy9Jbml0aWFsaXplIHRoZSBlbWl0dGVyIGJhc2Ugb2JqZWN0CiAgIEV2ZW50RW1pdHRlci5jYWxsKHRoaXMpOwogCiAgIC8vU2V0IGNvbmZpZ3VyYXRpb24KICAgdmFyIHNlbGYgPSB0aGlzOwogICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwotICB0aGlzLmhvc3QgPSBob3N0OwotICB0aGlzLnBvcnQgPSBwb3J0OworICB0aGlzLmhvc3QgPSB0aGlzLm9wdGlvbnMuaG9zdDsKKyAgdGhpcy5wb3J0ID0gdGhpcy5vcHRpb25zLnBvcnQ7CisgIHRoaXMuc29ja2V0UGF0aCA9IHRoaXMub3B0aW9ucy5zb2NrZXRQYXRoOwogICB0aGlzLmh0dHBzID0gdGhpcy5vcHRpb25zLmh0dHBzIHx8IGZhbHNlOwotICB0aGlzLnRyYW5zcG9ydCA9IHRoaXMub3B0aW9ucy50cmFuc3BvcnQgfHwgdHRyYW5zcG9ydC5UQnVmZmVyZWRUcmFuc3BvcnQ7Ci0gIHRoaXMucHJvdG9jb2wgPSB0aGlzLm9wdGlvbnMucHJvdG9jb2wgfHwgdHByb3RvY29sLlRCaW5hcnlQcm90b2NvbDsKKyAgdGhpcy50cmFuc3BvcnQgPSB0aGlzLm9wdGlvbnMudHJhbnNwb3J0IHx8IFRCdWZmZXJlZFRyYW5zcG9ydDsKKyAgdGhpcy5wcm90b2NvbCA9IHRoaXMub3B0aW9ucy5wcm90b2NvbCB8fCBUQmluYXJ5UHJvdG9jb2w7CiAKICAgLy9QcmVwYXJlIE5vZGUuanMgb3B0aW9ucwogICB0aGlzLm5vZGVPcHRpb25zID0gewogICAgIGhvc3Q6IHRoaXMuaG9zdCwKLSAgICBwb3J0OiB0aGlzLnBvcnQgfHwgODAsCisgICAgcG9ydDogdGhpcy5wb3J0LAorICAgIHNvY2tldFBhdGg6IHRoaXMuc29ja2V0UGF0aCwKICAgICBwYXRoOiB0aGlzLm9wdGlvbnMucGF0aCB8fCAnLycsCiAgICAgbWV0aG9kOiAnUE9TVCcsCi0gICAgaGVhZGVyczogdGhpcy5vcHRpb25zLmhlYWRlcnMgfHwge30KKyAgICBoZWFkZXJzOiB0aGlzLm9wdGlvbnMuaGVhZGVycyB8fCB7fSwKKyAgICByZXNwb25zZVR5cGU6IHRoaXMub3B0aW9ucy5yZXNwb25zZVR5cGUgfHwgbnVsbAogICB9OwotICBmb3IgKHZhciBhdHRybmFtZSBpbiB0aGlzLm9wdGlvbnMubm9kZU9wdGlvbnMpIHsgCi0gICAgdGhpcy5ub2RlT3B0aW9uc1thdHRybmFtZV0gPSB0aGlzLm9wdGlvbnMubm9kZU9wdGlvbnNbYXR0cm5hbWVdOyAKKyAgZm9yICh2YXIgYXR0cm5hbWUgaW4gdGhpcy5vcHRpb25zLm5vZGVPcHRpb25zKSB7CisgICAgdGhpcy5ub2RlT3B0aW9uc1thdHRybmFtZV0gPSB0aGlzLm9wdGlvbnMubm9kZU9wdGlvbnNbYXR0cm5hbWVdOwogICB9CiAgIC8qanNoaW50IC1XMDY5ICovCi0gIGlmICghIHRoaXMubm9kZU9wdGlvbnMuaGVhZGVyc1siQ29ubmVjdGlvbiJdKSB7Ci0gICAgdGhpcy5ub2RlT3B0aW9ucy5oZWFkZXJzWyJDb25uZWN0aW9uIl0gPSAia2VlcC1hbGl2ZSI7CisgIGlmICghIHRoaXMubm9kZU9wdGlvbnMuaGVhZGVyc1snQ29ubmVjdGlvbiddKSB7CisgICAgdGhpcy5ub2RlT3B0aW9ucy5oZWFkZXJzWydDb25uZWN0aW9uJ10gPSAna2VlcC1hbGl2ZSc7CiAgIH0KICAgLypqc2hpbnQgK1cwNjkgKi8KIAotICAvL1RoZSBzZXF1ZW5jZSBtYXAgaXMgdXNlZCB0byBtYXAgc2VxSURzIGJhY2sgdG8gdGhlIAorICAvL1RoZSBzZXF1ZW5jZSBtYXAgaXMgdXNlZCB0byBtYXAgc2VxSURzIGJhY2sgdG8gdGhlCiAgIC8vICBjYWxsaW5nIGNsaWVudCBpbiBtdWx0aXBsZXhlZCBzY2VuYXJpb3MKICAgdGhpcy5zZXFJZDJTZXJ2aWNlID0ge307CiAKQEAgLTExMSwxMyArMTE2LDEzIEBACiAgICAgICAgIC8vVGhlIE11bHRpcGxleGVkIFByb3RvY29sIHN0b3JlcyBhIGhhc2ggb2Ygc2VxaWQgdG8gc2VydmljZSBuYW1lcwogICAgICAgICAvLyAgaW4gc2VxSWQyU2VydmljZS4gSWYgdGhlIFNlcUlkIGlzIGZvdW5kIGluIHRoZSBoYXNoIHdlIG5lZWQgdG8KICAgICAgICAgLy8gIGxvb2t1cCB0aGUgYXBwcm9wcmlhdGUgY2xpZW50IGZvciB0aGlzIGNhbGwuCi0gICAgICAgIC8vICBUaGUgY2xpZW50IHZhciBpcyBhIHNpbmdsZSBjbGllbnQgb2JqZWN0IHdoZW4gbm90IG11bHRpcGxleGluZywgCisgICAgICAgIC8vICBUaGUgY2xpZW50IHZhciBpcyBhIHNpbmdsZSBjbGllbnQgb2JqZWN0IHdoZW4gbm90IG11bHRpcGxleGluZywKICAgICAgICAgLy8gIHdoZW4gdXNpbmcgbXVsdGlwbGV4aW5nIGl0IGlzIGEgc2VydmljZSBuYW1lIGtleWVkIGhhc2ggb2YgY2xpZW50CiAgICAgICAgIC8vICBvYmplY3RzLgogICAgICAgICAvL05PVEU6IFRoZSAyIHdheSBpbnRlcmRlcGVuZGVuY2llcyBiZXR3ZWVuIHByb3RvY29scywgdHJhbnNwb3J0cywKICAgICAgICAgLy8gIGNvbm5lY3Rpb25zIGFuZCBjbGllbnRzIGluIHRoZSBOb2RlLmpzIGltcGxlbWVudGF0aW9uIGFyZSBpcnJlZ3VsYXIKLSAgICAgICAgLy8gIGFuZCBtYWtlIHRoZSBpbXBsZW1lbnRhdGlvbiBkaWZmaWN1bHQgdG8gZXh0ZW5kIGFuZCBtYWludGFpbi4gV2UgCi0gICAgICAgIC8vICBzaG91bGQgYnJpbmcgdGhpcyBzdHVmZiBpbmxpbmUgd2l0aCB0eXBpY2FsIHRocmlmdCBJL08gc3RhY2sgCisgICAgICAgIC8vICBhbmQgbWFrZSB0aGUgaW1wbGVtZW50YXRpb24gZGlmZmljdWx0IHRvIGV4dGVuZCBhbmQgbWFpbnRhaW4uIFdlCisgICAgICAgIC8vICBzaG91bGQgYnJpbmcgdGhpcyBzdHVmZiBpbmxpbmUgd2l0aCB0eXBpY2FsIHRocmlmdCBJL08gc3RhY2sKICAgICAgICAgLy8gIG9wZXJhdGlvbiBzb29uLgogICAgICAgICAvLyAgLS1yYQogICAgICAgICB2YXIgc2VydmljZV9uYW1lID0gc2VsZi5zZXFJZDJTZXJ2aWNlW2hlYWRlci5yc2VxaWRdOwpAQCAtMTI2LDEyICsxMzEsMTQgQEAKICAgICAgICAgICBkZWxldGUgc2VsZi5zZXFJZDJTZXJ2aWNlW2hlYWRlci5yc2VxaWRdOwogICAgICAgICB9CiAgICAgICAgIC8qanNoaW50IC1XMDgzICovCi0gICAgICAgIGNsaWVudC5fcmVxc1tkdW1teV9zZXFpZF0gPSBmdW5jdGlvbihlcnIsIHN1Y2Nlc3MpeyAKKyAgICAgICAgY2xpZW50Ll9yZXFzW2R1bW15X3NlcWlkXSA9IGZ1bmN0aW9uKGVyciwgc3VjY2Vzcyl7CiAgICAgICAgICAgdHJhbnNwb3J0X3dpdGhfZGF0YS5jb21taXRQb3NpdGlvbigpOwogICAgICAgICAgIHZhciBjbGllbnRDYWxsYmFjayA9IGNsaWVudC5fcmVxc1toZWFkZXIucnNlcWlkXTsKICAgICAgICAgICBkZWxldGUgY2xpZW50Ll9yZXFzW2hlYWRlci5yc2VxaWRdOwogICAgICAgICAgIGlmIChjbGllbnRDYWxsYmFjaykgewotICAgICAgICAgICAgY2xpZW50Q2FsbGJhY2soZXJyLCBzdWNjZXNzKTsKKyAgICAgICAgICAgIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24oKSB7CisgICAgICAgICAgICAgIGNsaWVudENhbGxiYWNrKGVyciwgc3VjY2Vzcyk7CisgICAgICAgICAgICB9KTsKICAgICAgICAgICB9CiAgICAgICAgIH07CiAgICAgICAgIC8qanNoaW50ICtXMDgzICovCkBAIC0xNDcsMzcgKzE1NCw1MCBAQAogICAgICAgfQogICAgIH0KICAgICBjYXRjaCAoZSkgewotICAgICAgaWYgKGUgaW5zdGFuY2VvZiB0dHJhbnNwb3J0LklucHV0QnVmZmVyVW5kZXJydW5FcnJvcikgeworICAgICAgaWYgKGUgaW5zdGFuY2VvZiBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IpIHsKICAgICAgICAgdHJhbnNwb3J0X3dpdGhfZGF0YS5yb2xsYmFja1Bvc2l0aW9uKCk7CiAgICAgICB9IGVsc2UgewotICAgICAgICB0aHJvdyBlOworICAgICAgICBzZWxmLmVtaXQoJ2Vycm9yJywgZSk7CiAgICAgICB9CiAgICAgfQogICB9Ci0gICAgICAgICAgCi0gICAgICAKKworCiAgIC8vUmVzcG9uc2UgaGFuZGxlcgogICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICB0aGlzLnJlc3BvbnNlQ2FsbGJhY2sgPSBmdW5jdGlvbihyZXNwb25zZSkgewogICAgIHZhciBkYXRhID0gW107CiAgICAgdmFyIGRhdGFMZW4gPSAwOwogCisgICAgaWYgKHJlc3BvbnNlLnN0YXR1c0NvZGUgIT09IDIwMCkgeworICAgICAgdGhpcy5lbWl0KCJlcnJvciIsIG5ldyBUSFRUUEV4Y2VwdGlvbihyZXNwb25zZSkpOworICAgIH0KKwogICAgIHJlc3BvbnNlLm9uKCdlcnJvcicsIGZ1bmN0aW9uIChlKSB7CiAgICAgICBzZWxmLmVtaXQoImVycm9yIiwgZSk7CiAgICAgfSk7CiAKKyAgICAvLyBXaGVuIHJ1bm5pbmcgZGlyZWN0bHkgdW5kZXIgbm9kZSwgY2h1bmsgd2lsbCBiZSBhIGJ1ZmZlciwKKyAgICAvLyBob3dldmVyLCB3aGVuIHJ1bm5pbmcgaW4gYSBCcm93c2VyIChlLmcuIEJyb3dzZXJpZnkpLCBjaHVuaworICAgIC8vIHdpbGwgYmUgYSBzdHJpbmcgb3IgYW4gQXJyYXlCdWZmZXIuCiAgICAgcmVzcG9uc2Uub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsKLSAgICAgIGRhdGEucHVzaChjaHVuayk7IAotICAgICAgZGF0YUxlbiArPSBjaHVuay5sZW5ndGg7IAorICAgICAgaWYgKCh0eXBlb2YgY2h1bmsgPT0gJ3N0cmluZycpIHx8CisgICAgICAgICAgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChjaHVuaykgPT0gJ1tvYmplY3QgVWludDhBcnJheV0nKSkgeworICAgICAgICAvLyBXcmFwIEFycmF5QnVmZmVyL3N0cmluZyBpbiBhIEJ1ZmZlciBzbyBkYXRhW2ldLmNvcHkgd2lsbCB3b3JrCisgICAgICAgIGRhdGEucHVzaChuZXcgQnVmZmVyKGNodW5rKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBkYXRhLnB1c2goY2h1bmspOworICAgICAgfQorICAgICAgZGF0YUxlbiArPSBjaHVuay5sZW5ndGg7CiAgICAgfSk7CiAKICAgICByZXNwb25zZS5vbignZW5kJywgZnVuY3Rpb24oKXsKLSAgICAgIHZhciBidWYgPSBuZXcgQnVmZmVyKGRhdGFMZW4pOyAKLSAgICAgIGZvciAodmFyIGk9MCwgbGVuPWRhdGEubGVuZ3RoLCBwb3M9MDsgaTxsZW47IGkrKykgeyAKLSAgICAgICAgZGF0YVtpXS5jb3B5KGJ1ZiwgcG9zKTsgCi0gICAgICAgIHBvcyArPSBkYXRhW2ldLmxlbmd0aDsgCisgICAgICB2YXIgYnVmID0gbmV3IEJ1ZmZlcihkYXRhTGVuKTsKKyAgICAgIGZvciAodmFyIGk9MCwgbGVuPWRhdGEubGVuZ3RoLCBwb3M9MDsgaTxsZW47IGkrKykgeworICAgICAgICBkYXRhW2ldLmNvcHkoYnVmLCBwb3MpOworICAgICAgICBwb3MgKz0gZGF0YVtpXS5sZW5ndGg7CiAgICAgICB9Ci0gICAgICAvL0dldCB0aHJlIHJlY2VpdmVyIGZ1bmN0aW9uIGZvciB0aGUgdHJhbnNwb3J0IGFuZCAKKyAgICAgIC8vR2V0IHRoZSByZWNlaXZlciBmdW5jdGlvbiBmb3IgdGhlIHRyYW5zcG9ydCBhbmQKICAgICAgIC8vICBjYWxsIGl0IHdpdGggdGhlIGJ1ZmZlcgogICAgICAgc2VsZi50cmFuc3BvcnQucmVjZWl2ZXIoZGVjb2RlQ2FsbGJhY2spKGJ1Zik7CiAgICAgfSk7CkBAIC0xODksMTggKzIwOSwyMSBAQAogICogV3JpdGVzIFRocmlmdCBtZXNzYWdlIGRhdGEgdG8gdGhlIGNvbm5lY3Rpb24KICAqIEBwYXJhbSB7QnVmZmVyfSBkYXRhIC0gQSBOb2RlLmpzIEJ1ZmZlciBjb250YWluaW5nIHRoZSBkYXRhIHRvIHdyaXRlCiAgKiBAcmV0dXJucyB7dm9pZH0gTm8gcmV0dXJuIHZhbHVlLgotICogQGV2ZW50IHtlcnJvcn0gdGhlICJlcnJvciIgZXZlbnQgaXMgcmFpc2VkIHVwb24gcmVxdWVzdCBmYWlsdXJlIHBhc3NpbmcgdGhlIAotICogICAgIE5vZGUuanMgZXJyb3Igb2JqZWN0IHRvIHRoZSBsaXN0ZW5lci4gIAorICogQGV2ZW50IHtlcnJvcn0gdGhlICJlcnJvciIgZXZlbnQgaXMgcmFpc2VkIHVwb24gcmVxdWVzdCBmYWlsdXJlIHBhc3NpbmcgdGhlCisgKiAgICAgTm9kZS5qcyBlcnJvciBvYmplY3QgdG8gdGhlIGxpc3RlbmVyLgogICovCiBIdHRwQ29ubmVjdGlvbi5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihkYXRhKSB7CiAgIHZhciBzZWxmID0gdGhpczsKLSAgc2VsZi5ub2RlT3B0aW9ucy5oZWFkZXJzWyJDb250ZW50LWxlbmd0aCJdID0gZGF0YS5sZW5ndGg7CisgIHZhciBvcHRzID0gc2VsZi5ub2RlT3B0aW9uczsKKyAgb3B0cy5oZWFkZXJzWyJDb250ZW50LWxlbmd0aCJdID0gZGF0YS5sZW5ndGg7CisgIGlmICghb3B0cy5oZWFkZXJzWyJDb250ZW50LVR5cGUiXSkKKyAgICBvcHRzLmhlYWRlcnNbIkNvbnRlbnQtVHlwZSJdID0gImFwcGxpY2F0aW9uL3gtdGhyaWZ0IjsgIAogICB2YXIgcmVxID0gKHNlbGYuaHR0cHMpID8KLSAgICAgIGh0dHBzLnJlcXVlc3Qoc2VsZi5ub2RlT3B0aW9ucywgc2VsZi5yZXNwb25zZUNhbGxiYWNrKSA6Ci0gICAgICBodHRwLnJlcXVlc3Qoc2VsZi5ub2RlT3B0aW9ucywgc2VsZi5yZXNwb25zZUNhbGxiYWNrKTsKKyAgICAgIGh0dHBzLnJlcXVlc3Qob3B0cywgc2VsZi5yZXNwb25zZUNhbGxiYWNrKSA6CisgICAgICBodHRwLnJlcXVlc3Qob3B0cywgc2VsZi5yZXNwb25zZUNhbGxiYWNrKTsKICAgcmVxLm9uKCdlcnJvcicsIGZ1bmN0aW9uKGVycikgewogICAgIHNlbGYuZW1pdCgiZXJyb3IiLCBlcnIpOwotICB9KTsgIAorICB9KTsKICAgcmVxLndyaXRlKGRhdGEpOwogICByZXEuZW5kKCk7CiB9OwpAQCAtMjE1LDIzICsyMzgsMjYgQEAKICAqIEBzZWUge0BsaW5rIENvbm5lY3RPcHRpb25zfQogICovCiBleHBvcnRzLmNyZWF0ZUh0dHBDb25uZWN0aW9uID0gZnVuY3Rpb24oaG9zdCwgcG9ydCwgb3B0aW9ucykgewotICByZXR1cm4gbmV3IEh0dHBDb25uZWN0aW9uKGhvc3QsIHBvcnQsIG9wdGlvbnMpOworICBvcHRpb25zLmhvc3QgPSBob3N0OworICBvcHRpb25zLnBvcnQgPSBwb3J0IHx8IDgwOworICByZXR1cm4gbmV3IEh0dHBDb25uZWN0aW9uKG9wdGlvbnMpOwogfTsKIAotLyoqCi0gKiBDcmVhdGVzIGEgbmV3IGNsaWVudCBvYmplY3QgZm9yIHRoZSBzcGVjaWZpZWQgVGhyaWZ0IHNlcnZpY2UuCi0gKiBAcGFyYW0ge29iamVjdH0gY2xzIC0gVGhlIG1vZHVsZSBjb250YWluaW5nIHRoZSBzZXJ2aWNlIGNsaWVudAotICogQHBhcmFtIHtIdHRwQ29ubmVjdGlvbn0gaHR0cENvbm5lY3Rpb24gLSBUaGUgY29ubmVjdGlvbiB0byB1c2UuCi0gKiBAcmV0dXJucyB7b2JqZWN0fSBUaGUgY2xpZW50IG9iamVjdC4KLSAqIEBzZWUge0BsaW5rIGNyZWF0ZUh0dHBDb25uZWN0aW9ufQotICovCi1leHBvcnRzLmNyZWF0ZUh0dHBDbGllbnQgPSBmdW5jdGlvbihjbHMsIGh0dHBDb25uZWN0aW9uKSB7Ci0gIGlmIChjbHMuQ2xpZW50KSB7Ci0gICAgY2xzID0gY2xzLkNsaWVudDsKLSAgfQotICBodHRwQ29ubmVjdGlvbi5jbGllbnQgPSAKLSAgICBuZXcgY2xzKG5ldyBodHRwQ29ubmVjdGlvbi50cmFuc3BvcnQodW5kZWZpbmVkLCBmdW5jdGlvbihidWYpIHtodHRwQ29ubmVjdGlvbi53cml0ZShidWYpO30pLCAKLSAgICAgICAgICAgIGh0dHBDb25uZWN0aW9uLnByb3RvY29sKTsKLSAgcmV0dXJuIGh0dHBDb25uZWN0aW9uLmNsaWVudDsKK2V4cG9ydHMuY3JlYXRlSHR0cFVEU0Nvbm5lY3Rpb24gPSBmdW5jdGlvbihwYXRoLCBvcHRpb25zKSB7CisgIG9wdGlvbnMuc29ja2V0UGF0aCA9IHBhdGg7CisgIHJldHVybiBuZXcgSHR0cENvbm5lY3Rpb24ob3B0aW9ucyk7CiB9OwogCitleHBvcnRzLmNyZWF0ZUh0dHBDbGllbnQgPSBjcmVhdGVDbGllbnQKKworCitmdW5jdGlvbiBUSFRUUEV4Y2VwdGlvbihyZXNwb25zZSkgeworICB0aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmNhbGwodGhpcyk7CisgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIHRoaXMuY29uc3RydWN0b3IpOworICB0aGlzLm5hbWUgPSB0aGlzLmNvbnN0cnVjdG9yLm5hbWU7CisgIHRoaXMuc3RhdHVzQ29kZSA9IHJlc3BvbnNlLnN0YXR1c0NvZGU7CisgIHRoaXMucmVzcG9uc2UgPSByZXNwb25zZTsKKyAgdGhpcy50eXBlID0gdGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvblR5cGUuUFJPVE9DT0xfRVJST1I7CisgIHRoaXMubWVzc2FnZSA9ICJSZWNlaXZlZCBhIHJlc3BvbnNlIHdpdGggYSBiYWQgSFRUUCBzdGF0dXMgY29kZTogIiArIHJlc3BvbnNlLnN0YXR1c0NvZGU7Cit9Cit1dGlsLmluaGVyaXRzKFRIVFRQRXhjZXB0aW9uLCB0aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uKTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvbGliL3RocmlmdC9pbmRleC5qcyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9pbmRleC5qcwppbmRleCBlYTdmZGUwLi5iMDk5NTNkIDEwMDY0NAotLS0gYS9saWIvbm9kZWpzL2xpYi90aHJpZnQvaW5kZXguanMKKysrIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L2luZGV4LmpzCkBAIC0xOCwxMCArMTgsMTYgQEAKICAqLwogZXhwb3J0cy5UaHJpZnQgPSByZXF1aXJlKCcuL3RocmlmdCcpOwogCit2YXIgbG9nID0gcmVxdWlyZSgnLi9sb2cnKTsKK2V4cG9ydHMuc2V0TG9nRnVuYyA9IGxvZy5zZXRMb2dGdW5jOworZXhwb3J0cy5zZXRMb2dMZXZlbCA9IGxvZy5zZXRMb2dMZXZlbDsKK2V4cG9ydHMuZ2V0TG9nTGV2ZWwgPSBsb2cuZ2V0TG9nTGV2ZWw7CisKIHZhciBjb25uZWN0aW9uID0gcmVxdWlyZSgnLi9jb25uZWN0aW9uJyk7CiBleHBvcnRzLkNvbm5lY3Rpb24gPSBjb25uZWN0aW9uLkNvbm5lY3Rpb247CiBleHBvcnRzLmNyZWF0ZUNsaWVudCA9IGNvbm5lY3Rpb24uY3JlYXRlQ2xpZW50OwogZXhwb3J0cy5jcmVhdGVDb25uZWN0aW9uID0gY29ubmVjdGlvbi5jcmVhdGVDb25uZWN0aW9uOworZXhwb3J0cy5jcmVhdGVVRFNDb25uZWN0aW9uID0gY29ubmVjdGlvbi5jcmVhdGVVRFNDb25uZWN0aW9uOwogZXhwb3J0cy5jcmVhdGVTU0xDb25uZWN0aW9uID0gY29ubmVjdGlvbi5jcmVhdGVTU0xDb25uZWN0aW9uOwogZXhwb3J0cy5jcmVhdGVTdGRJT0NsaWVudCA9IGNvbm5lY3Rpb24uY3JlYXRlU3RkSU9DbGllbnQ7CiBleHBvcnRzLmNyZWF0ZVN0ZElPQ29ubmVjdGlvbiA9IGNvbm5lY3Rpb24uY3JlYXRlU3RkSU9Db25uZWN0aW9uOwpAQCAtMjksOCArMzUsMTkgQEAKIHZhciBodHRwQ29ubmVjdGlvbiA9IHJlcXVpcmUoJy4vaHR0cF9jb25uZWN0aW9uJyk7CiBleHBvcnRzLkh0dHBDb25uZWN0aW9uID0gaHR0cENvbm5lY3Rpb24uSHR0cENvbm5lY3Rpb247CiBleHBvcnRzLmNyZWF0ZUh0dHBDb25uZWN0aW9uID0gaHR0cENvbm5lY3Rpb24uY3JlYXRlSHR0cENvbm5lY3Rpb247CitleHBvcnRzLmNyZWF0ZUh0dHBVRFNDb25uZWN0aW9uID0gaHR0cENvbm5lY3Rpb24uY3JlYXRlSHR0cFVEU0Nvbm5lY3Rpb247CiBleHBvcnRzLmNyZWF0ZUh0dHBDbGllbnQgPSBodHRwQ29ubmVjdGlvbi5jcmVhdGVIdHRwQ2xpZW50OwogCit2YXIgd3NDb25uZWN0aW9uID0gcmVxdWlyZSgnLi93c19jb25uZWN0aW9uJyk7CitleHBvcnRzLldTQ29ubmVjdGlvbiA9IHdzQ29ubmVjdGlvbi5XU0Nvbm5lY3Rpb247CitleHBvcnRzLmNyZWF0ZVdTQ29ubmVjdGlvbiA9IHdzQ29ubmVjdGlvbi5jcmVhdGVXU0Nvbm5lY3Rpb247CitleHBvcnRzLmNyZWF0ZVdTQ2xpZW50ID0gd3NDb25uZWN0aW9uLmNyZWF0ZVdTQ2xpZW50OworCit2YXIgeGhyQ29ubmVjdGlvbiA9IHJlcXVpcmUoJy4veGhyX2Nvbm5lY3Rpb24nKTsKK2V4cG9ydHMuWEhSQ29ubmVjdGlvbiA9IHhockNvbm5lY3Rpb24uWEhSQ29ubmVjdGlvbjsKK2V4cG9ydHMuY3JlYXRlWEhSQ29ubmVjdGlvbiA9IHhockNvbm5lY3Rpb24uY3JlYXRlWEhSQ29ubmVjdGlvbjsKK2V4cG9ydHMuY3JlYXRlWEhSQ2xpZW50ID0geGhyQ29ubmVjdGlvbi5jcmVhdGVYSFJDbGllbnQ7CisKIHZhciBzZXJ2ZXIgPSByZXF1aXJlKCcuL3NlcnZlcicpOwogZXhwb3J0cy5jcmVhdGVTZXJ2ZXIgPSBzZXJ2ZXIuY3JlYXRlU2VydmVyOwogZXhwb3J0cy5jcmVhdGVNdWx0aXBsZXhTZXJ2ZXIgPSBzZXJ2ZXIuY3JlYXRlTXVsdGlwbGV4U2VydmVyOwpAQCAtNTAsOCArNjcsOCBAQAogICogRXhwb3J0IHRyYW5zcG9ydCBhbmQgcHJvdG9jb2wgc28gdGhleSBjYW4gYmUgdXNlZCBvdXRzaWRlIG9mIGEKICAqIGNhc3NhbmRyYS9zZXJ2ZXIgY29udGV4dAogICovCi1leHBvcnRzLlRGcmFtZWRUcmFuc3BvcnQgPSByZXF1aXJlKCcuL3RyYW5zcG9ydCcpLlRGcmFtZWRUcmFuc3BvcnQ7Ci1leHBvcnRzLlRCdWZmZXJlZFRyYW5zcG9ydCA9IHJlcXVpcmUoJy4vdHJhbnNwb3J0JykuVEJ1ZmZlcmVkVHJhbnNwb3J0OwotZXhwb3J0cy5UQmluYXJ5UHJvdG9jb2wgPSByZXF1aXJlKCcuL3Byb3RvY29sJykuVEJpbmFyeVByb3RvY29sOwotZXhwb3J0cy5USlNPTlByb3RvY29sID0gcmVxdWlyZSgnLi9wcm90b2NvbCcpLlRKU09OUHJvdG9jb2w7Ci1leHBvcnRzLlRDb21wYWN0UHJvdG9jb2wgPSByZXF1aXJlKCcuL3Byb3RvY29sJykuVENvbXBhY3RQcm90b2NvbDsKK2V4cG9ydHMuVEZyYW1lZFRyYW5zcG9ydCA9IHJlcXVpcmUoJy4vZnJhbWVkX3RyYW5zcG9ydCcpOworZXhwb3J0cy5UQnVmZmVyZWRUcmFuc3BvcnQgPSByZXF1aXJlKCcuL2J1ZmZlcmVkX3RyYW5zcG9ydCcpOworZXhwb3J0cy5UQmluYXJ5UHJvdG9jb2wgPSByZXF1aXJlKCcuL2JpbmFyeV9wcm90b2NvbCcpOworZXhwb3J0cy5USlNPTlByb3RvY29sID0gcmVxdWlyZSgnLi9qc29uX3Byb3RvY29sJyk7CitleHBvcnRzLlRDb21wYWN0UHJvdG9jb2wgPSByZXF1aXJlKCcuL2NvbXBhY3RfcHJvdG9jb2wnKTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvbGliL3RocmlmdC9pbnB1dF9idWZmZXJfdW5kZXJydW5fZXJyb3IuanMgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvaW5wdXRfYnVmZmVyX3VuZGVycnVuX2Vycm9yLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyNTU1ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvaW5wdXRfYnVmZmVyX3VuZGVycnVuX2Vycm9yLmpzCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3ZhciB1dGlsID0gcmVxdWlyZSgidXRpbCIpOworCittb2R1bGUuZXhwb3J0cyA9IElucHV0QnVmZmVyVW5kZXJydW5FcnJvcjsKKworZnVuY3Rpb24gSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yKG1lc3NhZ2UpIHsKKyAgRXJyb3IuY2FsbCh0aGlzKTsKKyAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7CisgIHRoaXMubmFtZSA9IHRoaXMuY29uc3RydWN0b3IubmFtZTsKKyAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKK307CisKK3V0aWwuaW5oZXJpdHMoSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yLCBFcnJvcik7CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2xpYi90aHJpZnQvaW50NjRfdXRpbC5qcyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9pbnQ2NF91dGlsLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ZDcwN2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvaW50NjRfdXRpbC5qcwpAQCAtMCwwICsxLDkxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3ZhciBJbnQ2NCA9IHJlcXVpcmUoJ25vZGUtaW50NjQnKTsKKwordmFyIEludDY0VXRpbCA9IG1vZHVsZS5leHBvcnRzID0ge307CisKK3ZhciBQT1cyXzI0ID0gTWF0aC5wb3coMiwgMjQpOwordmFyIFBPVzJfMzEgPSBNYXRoLnBvdygyLCAzMSk7Cit2YXIgUE9XMl8zMiA9IE1hdGgucG93KDIsIDMyKTsKK3ZhciBQT1cxMF8xMSA9IE1hdGgucG93KDEwLCAxMSk7CisKK0ludDY0VXRpbC50b0RlY2ltYWxTdHJpbmcgPSBmdW5jdGlvbihpNjQpIHsKKyAgdmFyIGIgPSBpNjQuYnVmZmVyOworICB2YXIgbyA9IGk2NC5vZmZzZXQ7CisgIGlmICgoIWJbb10gJiYgIShiW28gKyAxXSAmIDB4ZTApKSB8fAorICAgICAgKCF+YltvXSAmJiAhfihiW28gKyAxXSAmIDB4ZTApKSkgeworICAgIC8vIFRoZSBtYWduaXR1ZGUgaXMgc21hbGwgZW5vdWdoLgorICAgIHJldHVybiBpNjQudG9TdHJpbmcoKTsKKyAgfSBlbHNlIHsKKyAgICB2YXIgbmVnYXRpdmUgPSBiW29dICYgMHg4MDsKKyAgICBpZiAobmVnYXRpdmUpIHsKKyAgICAgIC8vIDIncyBjb21wbGVtZW50CisgICAgICB2YXIgaW5jcmVtZW50ZWQgPSBmYWxzZTsKKyAgICAgIHZhciBidWZmZXIgPSBuZXcgQnVmZmVyKDgpOworICAgICAgZm9yICh2YXIgaSA9IDc7IGkgPj0gMDsgLS1pKSB7CisgICAgICAgIGJ1ZmZlcltpXSA9ICh+YltvICsgaV0gKyAoaW5jcmVtZW50ZWQgPyAwIDogMSkpICYgMHhmZjsKKyAgICAgICAgaW5jcmVtZW50ZWQgfD0gYltvICsgaV07CisgICAgICB9CisgICAgICBiID0gYnVmZmVyOworICAgIH0KKyAgICB2YXIgaGlnaDIgPSBiW28gKyAxXSArIChiW29dIDw8IDgpOworICAgIC8vIExlc3NlciAxMSBkaWdpdHMgd2l0aCBleGNlZWRpbmcgdmFsdWVzIGJ1dCBpcyB1bmRlciA1MyBiaXRzIGNhcGFjaXR5LgorICAgIHZhciBsb3cgPSBiW28gKyA3XSArIChiW28gKyA2XSA8PCA4KSArIChiW28gKyA1XSA8PCAxNikKKyAgICAgICAgKyBiW28gKyA0XSAqIFBPVzJfMjQgIC8vIEJpdCBzaGlmdCByZW5kZXJzIDMydGggYml0IGFzIHNpZ24sIHNvIHVzZSBtdWx0aXBsaWNhdGlvbgorICAgICAgICArIChiW28gKyAzXSArIChiW28gKyAyXSA8PCA4KSkgKiBQT1cyXzMyICsgaGlnaDIgKiA3NDk3NjcxMDY1NjsgIC8vIFRoZSBsaXRlcmFsIGlzIDJeNDggJSAxMF4xMQorICAgIC8vIDEydGggZGlnaXQgYW5kIGdyZWF0ZXIuCisgICAgdmFyIGhpZ2ggPSBNYXRoLmZsb29yKGxvdyAvIFBPVzEwXzExKSArIGhpZ2gyICogMjgxNDsgIC8vIFRoZSBsaXRlcmFsIGlzIDJeNDggLyAxMF4xMQorICAgIC8vIE1ha2UgaXQgZXhhY3RseSAxMSB3aXRoIGxlYWRpbmcgemVyb3MuCisgICAgbG93ID0gKCcwMDAwMDAwMDAwMCcgKyBTdHJpbmcobG93ICUgUE9XMTBfMTEpKS5zbGljZSgtMTEpOworICAgIHJldHVybiAobmVnYXRpdmUgPyAnLScgOiAnJykgKyBTdHJpbmcoaGlnaCkgKyBsb3c7CisgIH0KK307CisKK0ludDY0VXRpbC5mcm9tRGVjaW1hbFN0cmluZyA9IGZ1bmN0aW9uKHRleHQpIHsKKyAgdmFyIG5lZ2F0aXZlID0gdGV4dC5jaGFyQXQoMCkgPT09ICctJzsKKyAgaWYgKHRleHQubGVuZ3RoIDwgKG5lZ2F0aXZlID8gMTcgOiAxNikpIHsKKyAgICAvLyBUaGUgbWFnbml0dWRlIGlzIHNtYWxsZXIgdGhhbiAyXjUzLgorICAgIHJldHVybiBuZXcgSW50NjQoK3RleHQpOworICB9IGVsc2UgaWYgKHRleHQubGVuZ3RoID4gKG5lZ2F0aXZlID8gMjAgOiAxOSkpIHsKKyAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVG9vIG1hbnkgZGlnaXRzIGZvciBJbnQ2NDogJyArIHRleHQpOworICB9IGVsc2UgeworICAgIC8vIE1vc3Qgc2lnbmlmaWNhbnQgKHVwIHRvIDUpIGRpZ2l0cworICAgIHZhciBoaWdoNSA9ICt0ZXh0LnNsaWNlKG5lZ2F0aXZlID8gMSA6IDAsIC0xNSk7CisgICAgdmFyIGxvdyA9ICt0ZXh0LnNsaWNlKC0xNSkgKyBoaWdoNSAqIDI3NjQ0NzIzMjA7ICAvLyBUaGUgbGl0ZXJhbCBpcyAxMF4xNSAlIDJeMzIKKyAgICB2YXIgaGlnaCA9IE1hdGguZmxvb3IobG93IC8gUE9XMl8zMikgKyBoaWdoNSAqIDIzMjgzMDsgIC8vIFRoZSBsaXRlcmFsIGlzIDEwXjE1IC8gMl4mMzIKKyAgICBsb3cgPSBsb3cgJSBQT1cyXzMyOworICAgIGlmIChoaWdoID49IFBPVzJfMzEgJiYKKyAgICAgICAgIShuZWdhdGl2ZSAmJiBoaWdoID09IFBPVzJfMzEgJiYgbG93ID09IDApICAvLyBBbGxvdyBtaW5pbXVtIEludDY0CisgICAgICAgKSB7CisgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIG1hZ25pdHVkZSBpcyB0b28gbGFyZ2UgZm9yIEludDY0LicpOworICAgIH0KKyAgICBpZiAobmVnYXRpdmUpIHsKKyAgICAgIC8vIDIncyBjb21wbGVtZW50CisgICAgICBoaWdoID0gfmhpZ2g7CisgICAgICBpZiAobG93ID09PSAwKSB7CisgICAgICAgIGhpZ2ggPSAoaGlnaCArIDEpICYgMHhmZmZmZmZmZjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGxvdyA9IH5sb3cgKyAxOworICAgICAgfQorICAgICAgaGlnaCA9IDB4ODAwMDAwMDAgfCBoaWdoOworICAgIH0KKyAgICByZXR1cm4gbmV3IEludDY0KGhpZ2gsIGxvdyk7CisgIH0KK307CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2xpYi90aHJpZnQvanNvbl9wYXJzZS5qcyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9qc29uX3BhcnNlLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzYjBiZjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvanNvbl9wYXJzZS5qcwpAQCAtMCwwICsxLDI5OSBAQAorLyoKKyAqIEltcG9ydGVkIGZyb20gRG91Z2xhcyBDcm9ja2ZvcmQncyByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gd2l0aCBtaW5pbXVtIG1vZGlmaWNhdGlvbgorICogdG8gaGFuZGxlIEludDY0LgorICoKKyAqIGh0dHBzOi8vZ2l0aHViLmNvbS9kb3VnbGFzY3JvY2tmb3JkL0pTT04tanMvYmxvYi9jOTg5NDhhZTE5NDRhMjhlMmU4ZWJjMzcxNzg5NGU1ODBhZWFhYTA1L2pzb25fcGFyc2UuanMKKyAqCisgKiBPcmlnaW5hbCBsaWNlbnNlIGhlYWRlcjoKKyAqCisgKiBqc29uX3BhcnNlLmpzCisgKiAyMDE1LTA1LTAyCisgKiBQdWJsaWMgRG9tYWluLgorICogTk8gV0FSUkFOVFkgRVhQUkVTU0VEIE9SIElNUExJRUQuIFVTRSBBVCBZT1VSIE9XTiBSSVNLLgorICovCisKKworLypqc2xpbnQgZm9yICovCisKKy8qcHJvcGVydHkKKyAgICBhdCwgYiwgY2FsbCwgY2hhckF0LCBmLCBmcm9tQ2hhckNvZGUsIGhhc093blByb3BlcnR5LCBtZXNzYWdlLCBuLCBuYW1lLAorICAgIHByb3RvdHlwZSwgcHVzaCwgciwgdCwgdGV4dAorKi8KKwordmFyIEludDY0ID0gcmVxdWlyZSgnbm9kZS1pbnQ2NCcpOwordmFyIEludDY0VXRpbCA9IHJlcXVpcmUoJy4vaW50NjRfdXRpbCcpOworCit2YXIganNvbl9wYXJzZSA9IG1vZHVsZS5leHBvcnRzID0gKGZ1bmN0aW9uICgpIHsKKyAgICAidXNlIHN0cmljdCI7CisKKy8vIFRoaXMgaXMgYSBmdW5jdGlvbiB0aGF0IGNhbiBwYXJzZSBhIEpTT04gdGV4dCwgcHJvZHVjaW5nIGEgSmF2YVNjcmlwdAorLy8gZGF0YSBzdHJ1Y3R1cmUuIEl0IGlzIGEgc2ltcGxlLCByZWN1cnNpdmUgZGVzY2VudCBwYXJzZXIuIEl0IGRvZXMgbm90IHVzZQorLy8gZXZhbCBvciByZWd1bGFyIGV4cHJlc3Npb25zLCBzbyBpdCBjYW4gYmUgdXNlZCBhcyBhIG1vZGVsIGZvciBpbXBsZW1lbnRpbmcKKy8vIGEgSlNPTiBwYXJzZXIgaW4gb3RoZXIgbGFuZ3VhZ2VzLgorCisvLyBXZSBhcmUgZGVmaW5pbmcgdGhlIGZ1bmN0aW9uIGluc2lkZSBvZiBhbm90aGVyIGZ1bmN0aW9uIHRvIGF2b2lkIGNyZWF0aW5nCisvLyBnbG9iYWwgdmFyaWFibGVzLgorCisgICAgdmFyIGF0LCAgICAgLy8gVGhlIGluZGV4IG9mIHRoZSBjdXJyZW50IGNoYXJhY3RlcgorICAgICAgICBjaCwgICAgIC8vIFRoZSBjdXJyZW50IGNoYXJhY3RlcgorICAgICAgICBlc2NhcGVlID0geworICAgICAgICAgICAgJyInOiAnIicsCisgICAgICAgICAgICAnXFwnOiAnXFwnLAorICAgICAgICAgICAgJy8nOiAnLycsCisgICAgICAgICAgICBiOiAnXGInLAorICAgICAgICAgICAgZjogJ1xmJywKKyAgICAgICAgICAgIG46ICdcbicsCisgICAgICAgICAgICByOiAnXHInLAorICAgICAgICAgICAgdDogJ1x0JworICAgICAgICB9LAorICAgICAgICB0ZXh0LAorCisgICAgICAgIGVycm9yID0gZnVuY3Rpb24gKG0pIHsKKworLy8gQ2FsbCBlcnJvciB3aGVuIHNvbWV0aGluZyBpcyB3cm9uZy4KKworICAgICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKG0pOworICAgICAgICB9LAorCisgICAgICAgIG5leHQgPSBmdW5jdGlvbiAoYykgeworCisvLyBJZiBhIGMgcGFyYW1ldGVyIGlzIHByb3ZpZGVkLCB2ZXJpZnkgdGhhdCBpdCBtYXRjaGVzIHRoZSBjdXJyZW50IGNoYXJhY3Rlci4KKworICAgICAgICAgICAgaWYgKGMgJiYgYyAhPT0gY2gpIHsKKyAgICAgICAgICAgICAgICBlcnJvcigiRXhwZWN0ZWQgJyIgKyBjICsgIicgaW5zdGVhZCBvZiAnIiArIGNoICsgIiciKTsKKyAgICAgICAgICAgIH0KKworLy8gR2V0IHRoZSBuZXh0IGNoYXJhY3Rlci4gV2hlbiB0aGVyZSBhcmUgbm8gbW9yZSBjaGFyYWN0ZXJzLAorLy8gcmV0dXJuIHRoZSBlbXB0eSBzdHJpbmcuCisKKyAgICAgICAgICAgIGNoID0gdGV4dC5jaGFyQXQoYXQpOworICAgICAgICAgICAgYXQgKz0gMTsKKyAgICAgICAgICAgIHJldHVybiBjaDsKKyAgICAgICAgfSwKKworICAgICAgICBudW1iZXIgPSBmdW5jdGlvbiAoKSB7CisKKy8vIFBhcnNlIGEgbnVtYmVyIHZhbHVlLgorCisgICAgICAgICAgICB2YXIgbnVtYmVyLAorICAgICAgICAgICAgICAgIHN0cmluZyA9ICcnOworCisgICAgICAgICAgICBpZiAoY2ggPT09ICctJykgeworICAgICAgICAgICAgICAgIHN0cmluZyA9ICctJzsKKyAgICAgICAgICAgICAgICBuZXh0KCctJyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykgeworICAgICAgICAgICAgICAgIHN0cmluZyArPSBjaDsKKyAgICAgICAgICAgICAgICBuZXh0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY2ggPT09ICcuJykgeworICAgICAgICAgICAgICAgIHN0cmluZyArPSAnLic7CisgICAgICAgICAgICAgICAgd2hpbGUgKG5leHQoKSAmJiBjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSB7CisgICAgICAgICAgICAgICAgICAgIHN0cmluZyArPSBjaDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY2ggPT09ICdlJyB8fCBjaCA9PT0gJ0UnKSB7CisgICAgICAgICAgICAgICAgc3RyaW5nICs9IGNoOworICAgICAgICAgICAgICAgIG5leHQoKTsKKyAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICctJyB8fCBjaCA9PT0gJysnKSB7CisgICAgICAgICAgICAgICAgICAgIHN0cmluZyArPSBjaDsKKyAgICAgICAgICAgICAgICAgICAgbmV4dCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3aGlsZSAoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykgeworICAgICAgICAgICAgICAgICAgICBzdHJpbmcgKz0gY2g7CisgICAgICAgICAgICAgICAgICAgIG5leHQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBudW1iZXIgPSArc3RyaW5nOworICAgICAgICAgICAgaWYgKCFpc0Zpbml0ZShudW1iZXIpKSB7CisgICAgICAgICAgICAgICAgZXJyb3IoIkJhZCBudW1iZXIiKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobnVtYmVyID49IEludDY0Lk1BWF9JTlQgfHwgbnVtYmVyIDw9IEludDY0Lk1JTl9JTlQpIHsKKyAgICAgICAgICAgICAgICAvLyBSZXR1cm4gcmF3IHN0cmluZyBmb3IgZnVydGhlciBwcm9jZXNzIGluIFRKU09OUHJvdG9jb2wKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RyaW5nOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICB9LAorCisgICAgICAgIHN0cmluZyA9IGZ1bmN0aW9uICgpIHsKKworLy8gUGFyc2UgYSBzdHJpbmcgdmFsdWUuCisKKyAgICAgICAgICAgIHZhciBoZXgsCisgICAgICAgICAgICAgICAgaSwKKyAgICAgICAgICAgICAgICBzdHJpbmcgPSAnJywKKyAgICAgICAgICAgICAgICB1ZmZmZjsKKworLy8gV2hlbiBwYXJzaW5nIGZvciBzdHJpbmcgdmFsdWVzLCB3ZSBtdXN0IGxvb2sgZm9yICIgYW5kIFwgY2hhcmFjdGVycy4KKworICAgICAgICAgICAgaWYgKGNoID09PSAnIicpIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAobmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJyInKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXh0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RyaW5nOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJ1xcJykgeworICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09PSAndScpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ZmZmZiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkgKz0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZXggPSBwYXJzZUludChuZXh0KCksIDE2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0Zpbml0ZShoZXgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ZmZmZiA9IHVmZmZmICogMTYgKyBoZXg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHVmZmZmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGVzY2FwZWVbY2hdID09PSAnc3RyaW5nJykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyArPSBlc2NhcGVlW2NoXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgKz0gY2g7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlcnJvcigiQmFkIHN0cmluZyIpOworICAgICAgICB9LAorCisgICAgICAgIHdoaXRlID0gZnVuY3Rpb24gKCkgeworCisvLyBTa2lwIHdoaXRlc3BhY2UuCisKKyAgICAgICAgICAgIHdoaWxlIChjaCAmJiBjaCA8PSAnICcpIHsKKyAgICAgICAgICAgICAgICBuZXh0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0sCisKKyAgICAgICAgd29yZCA9IGZ1bmN0aW9uICgpIHsKKworLy8gdHJ1ZSwgZmFsc2UsIG9yIG51bGwuCisKKyAgICAgICAgICAgIHN3aXRjaCAoY2gpIHsKKyAgICAgICAgICAgIGNhc2UgJ3QnOgorICAgICAgICAgICAgICAgIG5leHQoJ3QnKTsKKyAgICAgICAgICAgICAgICBuZXh0KCdyJyk7CisgICAgICAgICAgICAgICAgbmV4dCgndScpOworICAgICAgICAgICAgICAgIG5leHQoJ2UnKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIGNhc2UgJ2YnOgorICAgICAgICAgICAgICAgIG5leHQoJ2YnKTsKKyAgICAgICAgICAgICAgICBuZXh0KCdhJyk7CisgICAgICAgICAgICAgICAgbmV4dCgnbCcpOworICAgICAgICAgICAgICAgIG5leHQoJ3MnKTsKKyAgICAgICAgICAgICAgICBuZXh0KCdlJyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgY2FzZSAnbic6CisgICAgICAgICAgICAgICAgbmV4dCgnbicpOworICAgICAgICAgICAgICAgIG5leHQoJ3UnKTsKKyAgICAgICAgICAgICAgICBuZXh0KCdsJyk7CisgICAgICAgICAgICAgICAgbmV4dCgnbCcpOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZXJyb3IoIlVuZXhwZWN0ZWQgJyIgKyBjaCArICInIik7CisgICAgICAgIH0sCisKKyAgICAgICAgdmFsdWUsICAvLyBQbGFjZSBob2xkZXIgZm9yIHRoZSB2YWx1ZSBmdW5jdGlvbi4KKworICAgICAgICBhcnJheSA9IGZ1bmN0aW9uICgpIHsKKworLy8gUGFyc2UgYW4gYXJyYXkgdmFsdWUuCisKKyAgICAgICAgICAgIHZhciBhcnJheSA9IFtdOworCisgICAgICAgICAgICBpZiAoY2ggPT09ICdbJykgeworICAgICAgICAgICAgICAgIG5leHQoJ1snKTsKKyAgICAgICAgICAgICAgICB3aGl0ZSgpOworICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJ10nKSB7CisgICAgICAgICAgICAgICAgICAgIG5leHQoJ10nKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFycmF5OyAgIC8vIGVtcHR5IGFycmF5CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdoaWxlIChjaCkgeworICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKHZhbHVlKCkpOworICAgICAgICAgICAgICAgICAgICB3aGl0ZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICddJykgeworICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCgnXScpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFycmF5OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG5leHQoJywnKTsKKyAgICAgICAgICAgICAgICAgICAgd2hpdGUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlcnJvcigiQmFkIGFycmF5Iik7CisgICAgICAgIH0sCisKKyAgICAgICAgb2JqZWN0ID0gZnVuY3Rpb24gKCkgeworCisvLyBQYXJzZSBhbiBvYmplY3QgdmFsdWUuCisKKyAgICAgICAgICAgIHZhciBrZXksCisgICAgICAgICAgICAgICAgb2JqZWN0ID0ge307CisKKyAgICAgICAgICAgIGlmIChjaCA9PT0gJ3snKSB7CisgICAgICAgICAgICAgICAgbmV4dCgneycpOworICAgICAgICAgICAgICAgIHdoaXRlKCk7CisgICAgICAgICAgICAgICAgaWYgKGNoID09PSAnfScpIHsKKyAgICAgICAgICAgICAgICAgICAgbmV4dCgnfScpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0OyAgIC8vIGVtcHR5IG9iamVjdAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3aGlsZSAoY2gpIHsKKyAgICAgICAgICAgICAgICAgICAga2V5ID0gc3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIHdoaXRlKCk7CisgICAgICAgICAgICAgICAgICAgIG5leHQoJzonKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IoJ0R1cGxpY2F0ZSBrZXkgIicgKyBrZXkgKyAnIicpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG9iamVjdFtrZXldID0gdmFsdWUoKTsKKyAgICAgICAgICAgICAgICAgICAgd2hpdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09PSAnfScpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5leHQoJ30nKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvYmplY3Q7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbmV4dCgnLCcpOworICAgICAgICAgICAgICAgICAgICB3aGl0ZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVycm9yKCJCYWQgb2JqZWN0Iik7CisgICAgICAgIH07CisKKyAgICB2YWx1ZSA9IGZ1bmN0aW9uICgpIHsKKworLy8gUGFyc2UgYSBKU09OIHZhbHVlLiBJdCBjb3VsZCBiZSBhbiBvYmplY3QsIGFuIGFycmF5LCBhIHN0cmluZywgYSBudW1iZXIsCisvLyBvciBhIHdvcmQuCisKKyAgICAgICAgd2hpdGUoKTsKKyAgICAgICAgc3dpdGNoIChjaCkgeworICAgICAgICBjYXNlICd7JzoKKyAgICAgICAgICAgIHJldHVybiBvYmplY3QoKTsKKyAgICAgICAgY2FzZSAnWyc6CisgICAgICAgICAgICByZXR1cm4gYXJyYXkoKTsKKyAgICAgICAgY2FzZSAnIic6CisgICAgICAgICAgICByZXR1cm4gc3RyaW5nKCk7CisgICAgICAgIGNhc2UgJy0nOgorICAgICAgICAgICAgcmV0dXJuIG51bWJlcigpOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGNoID49ICcwJyAmJiBjaCA8PSAnOScKKyAgICAgICAgICAgICAgICA/IG51bWJlcigpCisgICAgICAgICAgICAgICAgOiB3b3JkKCk7CisgICAgICAgIH0KKyAgICB9OworCisvLyBSZXR1cm4gdGhlIGpzb25fcGFyc2UgZnVuY3Rpb24uIEl0IHdpbGwgaGF2ZSBhY2Nlc3MgdG8gYWxsIG9mIHRoZSBhYm92ZQorLy8gZnVuY3Rpb25zIGFuZCB2YXJpYWJsZXMuCisKKyAgICByZXR1cm4gZnVuY3Rpb24gKHNvdXJjZSkgeworICAgICAgICB2YXIgcmVzdWx0OworCisgICAgICAgIHRleHQgPSBzb3VyY2U7CisgICAgICAgIGF0ID0gMDsKKyAgICAgICAgY2ggPSAnICc7CisgICAgICAgIHJlc3VsdCA9IHZhbHVlKCk7CisgICAgICAgIHdoaXRlKCk7CisgICAgICAgIGlmIChjaCkgeworICAgICAgICAgICAgZXJyb3IoIlN5bnRheCBlcnJvciIpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9OworfSgpKTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvbGliL3RocmlmdC9qc29uX3Byb3RvY29sLmpzIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L2pzb25fcHJvdG9jb2wuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI3YTNiMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9qc29uX3Byb3RvY29sLmpzCkBAIC0wLDAgKzEsODAxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3ZhciBJbnQ2NCA9IHJlcXVpcmUoJ25vZGUtaW50NjQnKTsKK3ZhciBUaHJpZnQgPSByZXF1aXJlKCcuL3RocmlmdCcpOwordmFyIFR5cGUgPSBUaHJpZnQuVHlwZTsKK3ZhciB1dGlsID0gcmVxdWlyZSgidXRpbCIpOworCit2YXIgSW50NjRVdGlsID0gcmVxdWlyZSgnLi9pbnQ2NF91dGlsJyk7Cit2YXIganNvbl9wYXJzZSA9IHJlcXVpcmUoJy4vanNvbl9wYXJzZScpOworCit2YXIgSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yID0gcmVxdWlyZSgnLi9pbnB1dF9idWZmZXJfdW5kZXJydW5fZXJyb3InKTsKKworbW9kdWxlLmV4cG9ydHMgPSBUSlNPTlByb3RvY29sOworCisvKioKKyAqIEluaXRpYWxpemVzIGEgVGhyaWZ0IEpTT04gcHJvdG9jb2wgaW5zdGFuY2UuCisgKiBAY29uc3RydWN0b3IKKyAqIEBwYXJhbSB7VGhyaWZ0LlRyYW5zcG9ydH0gdHJhbnMgLSBUaGUgdHJhbnNwb3J0IHRvIHNlcmlhbGl6ZSB0by9mcm9tLgorICogQGNsYXNzZGVzYyBBcGFjaGUgVGhyaWZ0IFByb3RvY29scyBwZXJmb3JtIHNlcmlhbGl6YXRpb24gd2hpY2ggZW5hYmxlcyBjcm9zcworICogbGFuZ3VhZ2UgUlBDLiBUaGUgUHJvdG9jb2wgdHlwZSBpcyB0aGUgSmF2YVNjcmlwdCBicm93c2VyIGltcGxlbWVudGF0aW9uCisgKiBvZiB0aGUgQXBhY2hlIFRocmlmdCBUSlNPTlByb3RvY29sLgorICogQGV4YW1wbGUKKyAqICAgICB2YXIgcHJvdG9jb2wgID0gbmV3IFRocmlmdC5Qcm90b2NvbCh0cmFuc3BvcnQpOworICovCitmdW5jdGlvbiBUSlNPTlByb3RvY29sKHRyYW5zKSB7CisgIHRoaXMudHN0YWNrID0gW107CisgIHRoaXMudHBvcyA9IFtdOworICB0aGlzLnRyYW5zID0gdHJhbnM7Cit9OworCisvKioKKyAqIFRocmlmdCBJREwgdHlwZSBJZCB0byBzdHJpbmcgbWFwcGluZy4KKyAqIEByZWFkb25seQorICogQHNlZSB7QGxpbmsgVGhyaWZ0LlR5cGV9CisgKi8KK1RKU09OUHJvdG9jb2wuVHlwZSA9IHt9OworVEpTT05Qcm90b2NvbC5UeXBlW1R5cGUuQk9PTF0gPSAnInRmIic7CitUSlNPTlByb3RvY29sLlR5cGVbVHlwZS5CWVRFXSA9ICciaTgiJzsKK1RKU09OUHJvdG9jb2wuVHlwZVtUeXBlLkkxNl0gPSAnImkxNiInOworVEpTT05Qcm90b2NvbC5UeXBlW1R5cGUuSTMyXSA9ICciaTMyIic7CitUSlNPTlByb3RvY29sLlR5cGVbVHlwZS5JNjRdID0gJyJpNjQiJzsKK1RKU09OUHJvdG9jb2wuVHlwZVtUeXBlLkRPVUJMRV0gPSAnImRibCInOworVEpTT05Qcm90b2NvbC5UeXBlW1R5cGUuU1RSVUNUXSA9ICcicmVjIic7CitUSlNPTlByb3RvY29sLlR5cGVbVHlwZS5TVFJJTkddID0gJyJzdHIiJzsKK1RKU09OUHJvdG9jb2wuVHlwZVtUeXBlLk1BUF0gPSAnIm1hcCInOworVEpTT05Qcm90b2NvbC5UeXBlW1R5cGUuTElTVF0gPSAnImxzdCInOworVEpTT05Qcm90b2NvbC5UeXBlW1R5cGUuU0VUXSA9ICcic2V0Iic7CisKKy8qKgorICogVGhyaWZ0IElETCB0eXBlIHN0cmluZyB0byBJZCBtYXBwaW5nLgorICogQHJlYWRvbmx5CisgKiBAc2VlIHtAbGluayBUaHJpZnQuVHlwZX0KKyAqLworVEpTT05Qcm90b2NvbC5SVHlwZSA9IHt9OworVEpTT05Qcm90b2NvbC5SVHlwZS50ZiA9IFR5cGUuQk9PTDsKK1RKU09OUHJvdG9jb2wuUlR5cGUuaTggPSBUeXBlLkJZVEU7CitUSlNPTlByb3RvY29sLlJUeXBlLmkxNiA9IFR5cGUuSTE2OworVEpTT05Qcm90b2NvbC5SVHlwZS5pMzIgPSBUeXBlLkkzMjsKK1RKU09OUHJvdG9jb2wuUlR5cGUuaTY0ID0gVHlwZS5JNjQ7CitUSlNPTlByb3RvY29sLlJUeXBlLmRibCA9IFR5cGUuRE9VQkxFOworVEpTT05Qcm90b2NvbC5SVHlwZS5yZWMgPSBUeXBlLlNUUlVDVDsKK1RKU09OUHJvdG9jb2wuUlR5cGUuc3RyID0gVHlwZS5TVFJJTkc7CitUSlNPTlByb3RvY29sLlJUeXBlLm1hcCA9IFR5cGUuTUFQOworVEpTT05Qcm90b2NvbC5SVHlwZS5sc3QgPSBUeXBlLkxJU1Q7CitUSlNPTlByb3RvY29sLlJUeXBlLnNldCA9IFR5cGUuU0VUOworCisvKioKKyAqIFRoZSBUSlNPTlByb3RvY29sIHZlcnNpb24gbnVtYmVyLgorICogQHJlYWRvbmx5CisgKiBAY29uc3Qge251bWJlcn0gVmVyc2lvbgorICogQG1lbWJlcm9mIFRocmlmdC5Qcm90b2NvbAorICovCitUSlNPTlByb3RvY29sLlZlcnNpb24gPSAxOworCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS5mbHVzaCA9IGZ1bmN0aW9uKCkgeworICB0aGlzLndyaXRlVG9UcmFuc3BvcnRJZlN0YWNrSXNGbHVzaGFibGUoKTsKKyAgcmV0dXJuIHRoaXMudHJhbnMuZmx1c2goKTsKK307CisKK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLndyaXRlVG9UcmFuc3BvcnRJZlN0YWNrSXNGbHVzaGFibGUgPSBmdW5jdGlvbigpIHsKKyAgaWYgKHRoaXMudHN0YWNrLmxlbmd0aCA9PT0gMSkgeworICAgIHRoaXMudHJhbnMud3JpdGUodGhpcy50c3RhY2sucG9wKCkpOworICB9Cit9OworCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIGJlZ2lubmluZyBvZiBhIFRocmlmdCBSUEMgbWVzc2FnZS4KKyAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIHNlcnZpY2UgbWV0aG9kIHRvIGNhbGwuCisgKiBAcGFyYW0ge1RocmlmdC5NZXNzYWdlVHlwZX0gbWVzc2FnZVR5cGUgLSBUaGUgdHlwZSBvZiBtZXRob2QgY2FsbC4KKyAqIEBwYXJhbSB7bnVtYmVyfSBzZXFpZCAtIFRoZSBzZXF1ZW5jZSBudW1iZXIgb2YgdGhpcyBjYWxsIChhbHdheXMgMCBpbiBBcGFjaGUgVGhyaWZ0KS4KKyAqLworVEpTT05Qcm90b2NvbC5wcm90b3R5cGUud3JpdGVNZXNzYWdlQmVnaW4gPSBmdW5jdGlvbihuYW1lLCBtZXNzYWdlVHlwZSwgc2VxaWQpIHsKKyAgdGhpcy50c3RhY2sucHVzaChbVEpTT05Qcm90b2NvbC5WZXJzaW9uLCAnIicgKyBuYW1lICsgJyInLCBtZXNzYWdlVHlwZSwgc2VxaWRdKTsKK307CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgZW5kIG9mIGEgVGhyaWZ0IFJQQyBtZXNzYWdlLgorICovCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS53cml0ZU1lc3NhZ2VFbmQgPSBmdW5jdGlvbigpIHsKKyAgdmFyIG9iaiA9IHRoaXMudHN0YWNrLnBvcCgpOworCisgIHRoaXMud29iaiA9IHRoaXMudHN0YWNrLnBvcCgpOworICB0aGlzLndvYmoucHVzaChvYmopOworCisgIHRoaXMud2J1ZiA9ICdbJyArIHRoaXMud29iai5qb2luKCcsJykgKyAnXSc7CisKKyAgLy8gd2UgYXNzdW1lIHRoZXJlIGlzIG5vdGhpbmcgbW9yZSB0byBjb21lIHNvIHdlIHdyaXRlCisgIHRoaXMudHJhbnMud3JpdGUodGhpcy53YnVmKTsKK307CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgYmVnaW5uaW5nIG9mIGEgc3RydWN0LgorICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgc3RydWN0LgorICovCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS53cml0ZVN0cnVjdEJlZ2luID0gZnVuY3Rpb24obmFtZSkgeworICB0aGlzLnRwb3MucHVzaCh0aGlzLnRzdGFjay5sZW5ndGgpOworICB0aGlzLnRzdGFjay5wdXNoKHt9KTsKK307CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgZW5kIG9mIGEgc3RydWN0LgorICovCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS53cml0ZVN0cnVjdEVuZCA9IGZ1bmN0aW9uKCkgeworICB2YXIgcCA9IHRoaXMudHBvcy5wb3AoKTsKKyAgdmFyIHN0cnVjdCA9IHRoaXMudHN0YWNrW3BdOworICB2YXIgc3RyID0gJ3snOworICB2YXIgZmlyc3QgPSB0cnVlOworICBmb3IgKHZhciBrZXkgaW4gc3RydWN0KSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBzdHIgKz0gJywnOworICAgIH0KKworICAgIHN0ciArPSBrZXkgKyAnOicgKyBzdHJ1Y3Rba2V5XTsKKyAgfQorCisgIHN0ciArPSAnfSc7CisgIHRoaXMudHN0YWNrW3BdID0gc3RyOworCisgIHRoaXMud3JpdGVUb1RyYW5zcG9ydElmU3RhY2tJc0ZsdXNoYWJsZSgpOworfTsKKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBiZWdpbm5pbmcgb2YgYSBzdHJ1Y3QgZmllbGQuCisgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBmaWVsZC4KKyAqIEBwYXJhbSB7VGhyaWZ0LlByb3RvY29sLlR5cGV9IGZpZWxkVHlwZSAtIFRoZSBkYXRhIHR5cGUgb2YgdGhlIGZpZWxkLgorICogQHBhcmFtIHtudW1iZXJ9IGZpZWxkSWQgLSBUaGUgZmllbGQncyB1bmlxdWUgaWRlbnRpZmllci4KKyAqLworVEpTT05Qcm90b2NvbC5wcm90b3R5cGUud3JpdGVGaWVsZEJlZ2luID0gZnVuY3Rpb24obmFtZSwgZmllbGRUeXBlLCBmaWVsZElkKSB7CisgIHRoaXMudHBvcy5wdXNoKHRoaXMudHN0YWNrLmxlbmd0aCk7CisgIHRoaXMudHN0YWNrLnB1c2goeyAnZmllbGRJZCc6ICciJyArCisgICAgZmllbGRJZCArICciJywgJ2ZpZWxkVHlwZSc6IFRKU09OUHJvdG9jb2wuVHlwZVtmaWVsZFR5cGVdCisgIH0pOworfTsKKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBlbmQgb2YgYSBmaWVsZC4KKyAqLworVEpTT05Qcm90b2NvbC5wcm90b3R5cGUud3JpdGVGaWVsZEVuZCA9IGZ1bmN0aW9uKCkgeworICB2YXIgdmFsdWUgPSB0aGlzLnRzdGFjay5wb3AoKTsKKyAgdmFyIGZpZWxkSW5mbyA9IHRoaXMudHN0YWNrLnBvcCgpOworCisgIGlmICgnOicgKyB2YWx1ZSA9PT0gIjpbb2JqZWN0IE9iamVjdF0iKSB7CisgICAgdGhpcy50c3RhY2tbdGhpcy50c3RhY2subGVuZ3RoIC0gMV1bZmllbGRJbmZvLmZpZWxkSWRdID0gJ3snICsKKyAgICAgIGZpZWxkSW5mby5maWVsZFR5cGUgKyAnOicgKyBKU09OLnN0cmluZ2lmeSh2YWx1ZSkgKyAnfSc7CisgIH0gZWxzZSB7CisgICAgdGhpcy50c3RhY2tbdGhpcy50c3RhY2subGVuZ3RoIC0gMV1bZmllbGRJbmZvLmZpZWxkSWRdID0gJ3snICsKKyAgICAgIGZpZWxkSW5mby5maWVsZFR5cGUgKyAnOicgKyB2YWx1ZSArICd9JzsKKyAgfQorICB0aGlzLnRwb3MucG9wKCk7CisKKyAgdGhpcy53cml0ZVRvVHJhbnNwb3J0SWZTdGFja0lzRmx1c2hhYmxlKCk7Cit9OworCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIGVuZCBvZiB0aGUgc2V0IG9mIGZpZWxkcyBmb3IgYSBzdHJ1Y3QuCisgKi8KK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLndyaXRlRmllbGRTdG9wID0gZnVuY3Rpb24oKSB7Cit9OworCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIGJlZ2lubmluZyBvZiBhIG1hcCBjb2xsZWN0aW9uLgorICogQHBhcmFtIHtUaHJpZnQuVHlwZX0ga2V5VHlwZSAtIFRoZSBkYXRhIHR5cGUgb2YgdGhlIGtleS4KKyAqIEBwYXJhbSB7VGhyaWZ0LlR5cGV9IHZhbFR5cGUgLSBUaGUgZGF0YSB0eXBlIG9mIHRoZSB2YWx1ZS4KKyAqIEBwYXJhbSB7bnVtYmVyfSBbc2l6ZV0gLSBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBtYXAgKGlnbm9yZWQpLgorICovCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS53cml0ZU1hcEJlZ2luID0gZnVuY3Rpb24oa2V5VHlwZSwgdmFsVHlwZSwgc2l6ZSkgeworICAvL3NpemUgaXMgaW52YWxpZCwgd2UnbGwgc2V0IGl0IG9uIGVuZC4KKyAgdGhpcy50cG9zLnB1c2godGhpcy50c3RhY2subGVuZ3RoKTsKKyAgdGhpcy50c3RhY2sucHVzaChbVEpTT05Qcm90b2NvbC5UeXBlW2tleVR5cGVdLCBUSlNPTlByb3RvY29sLlR5cGVbdmFsVHlwZV0sIDBdKTsKK307CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgZW5kIG9mIGEgbWFwLgorICovCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS53cml0ZU1hcEVuZCA9IGZ1bmN0aW9uKCkgeworICB2YXIgcCA9IHRoaXMudHBvcy5wb3AoKTsKKworICBpZiAocCA9PSB0aGlzLnRzdGFjay5sZW5ndGgpIHsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoKHRoaXMudHN0YWNrLmxlbmd0aCAtIHAgLSAxKSAlIDIgIT09IDApIHsKKyAgICB0aGlzLnRzdGFjay5wdXNoKCcnKTsKKyAgfQorCisgIHZhciBzaXplID0gKHRoaXMudHN0YWNrLmxlbmd0aCAtIHAgLSAxKSAvIDI7CisKKyAgdGhpcy50c3RhY2tbcF1bdGhpcy50c3RhY2tbcF0ubGVuZ3RoIC0gMV0gPSBzaXplOworCisgIHZhciBtYXAgPSAnfSc7CisgIHZhciBmaXJzdCA9IHRydWU7CisgIHdoaWxlICh0aGlzLnRzdGFjay5sZW5ndGggPiBwICsgMSkgeworICAgIHZhciB2ID0gdGhpcy50c3RhY2sucG9wKCk7CisgICAgdmFyIGsgPSB0aGlzLnRzdGFjay5wb3AoKTsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIG1hcCA9ICcsJyArIG1hcDsKKyAgICB9CisKKyAgICBpZiAoISBpc05hTihrKSkgeyBrID0gJyInICsgayArICciJzsgfSAvL2pzb24gImtleXMiIG5lZWQgdG8gYmUgc3RyaW5ncworICAgIG1hcCA9IGsgKyAnOicgKyB2ICsgbWFwOworICB9CisgIG1hcCA9ICd7JyArIG1hcDsKKworICB0aGlzLnRzdGFja1twXS5wdXNoKG1hcCk7CisgIHRoaXMudHN0YWNrW3BdID0gJ1snICsgdGhpcy50c3RhY2tbcF0uam9pbignLCcpICsgJ10nOworCisgIHRoaXMud3JpdGVUb1RyYW5zcG9ydElmU3RhY2tJc0ZsdXNoYWJsZSgpOworfTsKKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBiZWdpbm5pbmcgb2YgYSBsaXN0IGNvbGxlY3Rpb24uCisgKiBAcGFyYW0ge1RocmlmdC5UeXBlfSBlbGVtVHlwZSAtIFRoZSBkYXRhIHR5cGUgb2YgdGhlIGVsZW1lbnRzLgorICogQHBhcmFtIHtudW1iZXJ9IHNpemUgLSBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0LgorICovCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS53cml0ZUxpc3RCZWdpbiA9IGZ1bmN0aW9uKGVsZW1UeXBlLCBzaXplKSB7CisgIHRoaXMudHBvcy5wdXNoKHRoaXMudHN0YWNrLmxlbmd0aCk7CisgIHRoaXMudHN0YWNrLnB1c2goW1RKU09OUHJvdG9jb2wuVHlwZVtlbGVtVHlwZV0sIHNpemVdKTsKK307CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgZW5kIG9mIGEgbGlzdC4KKyAqLworVEpTT05Qcm90b2NvbC5wcm90b3R5cGUud3JpdGVMaXN0RW5kID0gZnVuY3Rpb24oKSB7CisgIHZhciBwID0gdGhpcy50cG9zLnBvcCgpOworCisgIHdoaWxlICh0aGlzLnRzdGFjay5sZW5ndGggPiBwICsgMSkgeworICAgIHZhciB0bXBWYWwgPSB0aGlzLnRzdGFja1twICsgMV07CisgICAgdGhpcy50c3RhY2suc3BsaWNlKHAgKyAxLCAxKTsKKyAgICB0aGlzLnRzdGFja1twXS5wdXNoKHRtcFZhbCk7CisgIH0KKworICB0aGlzLnRzdGFja1twXSA9ICdbJyArIHRoaXMudHN0YWNrW3BdLmpvaW4oJywnKSArICddJzsKKworICB0aGlzLndyaXRlVG9UcmFuc3BvcnRJZlN0YWNrSXNGbHVzaGFibGUoKTsKK307CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgYmVnaW5uaW5nIG9mIGEgc2V0IGNvbGxlY3Rpb24uCisgKiBAcGFyYW0ge1RocmlmdC5UeXBlfSBlbGVtVHlwZSAtIFRoZSBkYXRhIHR5cGUgb2YgdGhlIGVsZW1lbnRzLgorICogQHBhcmFtIHtudW1iZXJ9IHNpemUgLSBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0LgorICovCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS53cml0ZVNldEJlZ2luID0gZnVuY3Rpb24oZWxlbVR5cGUsIHNpemUpIHsKKyAgICB0aGlzLnRwb3MucHVzaCh0aGlzLnRzdGFjay5sZW5ndGgpOworICAgIHRoaXMudHN0YWNrLnB1c2goW1RKU09OUHJvdG9jb2wuVHlwZVtlbGVtVHlwZV0sIHNpemVdKTsKK307CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgZW5kIG9mIGEgc2V0LgorICovCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS53cml0ZVNldEVuZCA9IGZ1bmN0aW9uKCkgeworICB2YXIgcCA9IHRoaXMudHBvcy5wb3AoKTsKKworICB3aGlsZSAodGhpcy50c3RhY2subGVuZ3RoID4gcCArIDEpIHsKKyAgICB2YXIgdG1wVmFsID0gdGhpcy50c3RhY2tbcCArIDFdOworICAgIHRoaXMudHN0YWNrLnNwbGljZShwICsgMSwgMSk7CisgICAgdGhpcy50c3RhY2tbcF0ucHVzaCh0bXBWYWwpOworICB9CisKKyAgdGhpcy50c3RhY2tbcF0gPSAnWycgKyB0aGlzLnRzdGFja1twXS5qb2luKCcsJykgKyAnXSc7CisKKyAgdGhpcy53cml0ZVRvVHJhbnNwb3J0SWZTdGFja0lzRmx1c2hhYmxlKCk7Cit9OworCisvKiogU2VyaWFsaXplcyBhIGJvb2xlYW4gKi8KK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLndyaXRlQm9vbCA9IGZ1bmN0aW9uKGJvb2wpIHsKKyAgdGhpcy50c3RhY2sucHVzaChib29sID8gMSA6IDApOworfTsKKworLyoqIFNlcmlhbGl6ZXMgYSBudW1iZXIgKi8KK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLndyaXRlQnl0ZSA9IGZ1bmN0aW9uKGJ5dGUpIHsKKyAgdGhpcy50c3RhY2sucHVzaChieXRlKTsKK307CisKKy8qKiBTZXJpYWxpemVzIGEgbnVtYmVyICovCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS53cml0ZUkxNiA9IGZ1bmN0aW9uKGkxNikgeworICB0aGlzLnRzdGFjay5wdXNoKGkxNik7Cit9OworCisvKiogU2VyaWFsaXplcyBhIG51bWJlciAqLworVEpTT05Qcm90b2NvbC5wcm90b3R5cGUud3JpdGVJMzIgPSBmdW5jdGlvbihpMzIpIHsKKyAgdGhpcy50c3RhY2sucHVzaChpMzIpOworfTsKKworLyoqIFNlcmlhbGl6ZXMgYSBudW1iZXIgKi8KK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLndyaXRlSTY0ID0gZnVuY3Rpb24oaTY0KSB7CisgIGlmIChpNjQgaW5zdGFuY2VvZiBJbnQ2NCkgeworICAgIHRoaXMudHN0YWNrLnB1c2goSW50NjRVdGlsLnRvRGVjaW1hbFN0cmluZyhpNjQpKTsKKyAgfSBlbHNlIHsKKyAgICB0aGlzLnRzdGFjay5wdXNoKGk2NCk7CisgIH0KK307CisKKy8qKiBTZXJpYWxpemVzIGEgbnVtYmVyICovCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS53cml0ZURvdWJsZSA9IGZ1bmN0aW9uKGR1YikgeworICB0aGlzLnRzdGFjay5wdXNoKGR1Yik7Cit9OworCisvKiogU2VyaWFsaXplcyBhIHN0cmluZyAqLworVEpTT05Qcm90b2NvbC5wcm90b3R5cGUud3JpdGVTdHJpbmcgPSBmdW5jdGlvbihhcmcpIHsKKyAgLy8gV2UgZG8gbm90IGVuY29kZSB1cmkgY29tcG9uZW50cyBmb3Igd2lyZSB0cmFuc2ZlcjoKKyAgaWYgKGFyZyA9PT0gbnVsbCkgeworICAgICAgdGhpcy50c3RhY2sucHVzaChudWxsKTsKKyAgfSBlbHNlIHsKKyAgICAgIGlmICh0eXBlb2YgYXJnID09PSAnc3RyaW5nJykgeworICAgICAgICB2YXIgc3RyID0gYXJnOworICAgICAgfSBlbHNlIGlmIChhcmcgaW5zdGFuY2VvZiBCdWZmZXIpIHsKKyAgICAgICAgdmFyIHN0ciA9IGFyZy50b1N0cmluZygndXRmOCcpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd3cml0ZVN0cmluZyBjYWxsZWQgd2l0aG91dCBhIHN0cmluZy9CdWZmZXIgYXJndW1lbnQ6ICcgKyBhcmcpOworICAgICAgfQorCisgICAgICAvLyBjb25jYXQgbWF5IGJlIHNsb3dlciB0aGFuIGJ1aWxkaW5nIGEgYnl0ZSBidWZmZXIKKyAgICAgIHZhciBlc2NhcGVkU3RyaW5nID0gJyc7CisgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykgeworICAgICAgICAgIHZhciBjaCA9IHN0ci5jaGFyQXQoaSk7ICAgICAgLy8gYSBzaW5nbGUgZG91YmxlIHF1b3RlOiAiCisgICAgICAgICAgaWYgKGNoID09PSAnXCInKSB7CisgICAgICAgICAgICAgIGVzY2FwZWRTdHJpbmcgKz0gJ1xcXCInOyAvLyB3cml0ZSBvdXQgYXM6IFwiCisgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PT0gJ1xcJykgeyAgICAvLyBhIHNpbmdsZSBiYWNrc2xhc2g6IFwKKyAgICAgICAgICAgICAgZXNjYXBlZFN0cmluZyArPSAnXFxcXCc7IC8vIHdyaXRlIG91dCBhczogXFwKKyAgICAgICAgICAvKiBDdXJyZW50bHkgZXNjYXBlZCBmb3J3YXJkIHNsYXNoZXMgYnJlYWsgVEpTT05Qcm90b2NvbC4KKyAgICAgICAgICAgKiBBcyBpdCBzdGFuZHMsIHdlIGNhbiBzaW1wbHkgcGFzcyBmb3J3YXJkIHNsYXNoZXMgaW50bworICAgICAgICAgICAqIG91ciBzdHJpbmdzIGFjcm9zcyB0aGUgd2lyZSB3aXRob3V0IGJlaW5nIGVzY2FwZWQuCisgICAgICAgICAgICogSSB0aGluayB0aGlzIGlzIHRoZSBwcm90b2NvbCdzIGJ1Zywgbm90IHRocmlmdC5qcworICAgICAgICAgICAqIH0gZWxzZSBpZihjaCA9PT0gJy8nKSB7ICAgLy8gYSBzaW5nbGUgZm9yd2FyZCBzbGFzaDogLworICAgICAgICAgICAqICBlc2NhcGVkU3RyaW5nICs9ICdcXC8nOyAgLy8gd3JpdGUgb3V0IGFzIFwvCisgICAgICAgICAgICogfQorICAgICAgICAgICAqLworICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT09ICdcYicpIHsgICAgLy8gYSBzaW5nbGUgYmFja3NwYWNlOiBpbnZpc2libGUKKyAgICAgICAgICAgICAgZXNjYXBlZFN0cmluZyArPSAnXFxiJzsgIC8vIHdyaXRlIG91dCBhczogXGIiCisgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PT0gJ1xmJykgeyAgICAvLyBhIHNpbmdsZSBmb3JtZmVlZDogaW52aXNpYmxlCisgICAgICAgICAgICAgIGVzY2FwZWRTdHJpbmcgKz0gJ1xcZic7ICAvLyB3cml0ZSBvdXQgYXM6IFxmIgorICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT09ICdcbicpIHsgICAgLy8gYSBzaW5nbGUgbmV3bGluZTogaW52aXNpYmxlCisgICAgICAgICAgICAgIGVzY2FwZWRTdHJpbmcgKz0gJ1xcbic7ICAvLyB3cml0ZSBvdXQgYXM6IFxuIgorICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT09ICdccicpIHsgICAgLy8gYSBzaW5nbGUgcmV0dXJuOiBpbnZpc2libGUKKyAgICAgICAgICAgICAgZXNjYXBlZFN0cmluZyArPSAnXFxyJzsgIC8vIHdyaXRlIG91dCBhczogXHIiCisgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PT0gJ1x0JykgeyAgICAvLyBhIHNpbmdsZSB0YWI6IGludmlzaWJsZQorICAgICAgICAgICAgICBlc2NhcGVkU3RyaW5nICs9ICdcXHQnOyAgLy8gd3JpdGUgb3V0IGFzOiBcdCIKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBlc2NhcGVkU3RyaW5nICs9IGNoOyAgICAgLy8gRWxzZSBpdCBuZWVkIG5vdCBiZSBlc2NhcGVkCisgICAgICAgICAgfQorICAgICAgfQorICAgICAgdGhpcy50c3RhY2sucHVzaCgnIicgKyBlc2NhcGVkU3RyaW5nICsgJyInKTsKKyAgfQorfTsKKworLyoqIFNlcmlhbGl6ZXMgYSBzdHJpbmcgKi8KK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLndyaXRlQmluYXJ5ID0gZnVuY3Rpb24oYXJnKSB7CisgIGlmICh0eXBlb2YgYXJnID09PSAnc3RyaW5nJykgeworICAgIHZhciBidWYgPSBuZXcgQnVmZmVyKGFyZywgJ2JpbmFyeScpOworICB9IGVsc2UgaWYgKGFyZyBpbnN0YW5jZW9mIEJ1ZmZlciB8fAorICAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhcmcpID09ICdbb2JqZWN0IFVpbnQ4QXJyYXldJykgIHsKKyAgICB2YXIgYnVmID0gYXJnOworICB9IGVsc2UgeworICAgIHRocm93IG5ldyBFcnJvcignd3JpdGVCaW5hcnkgY2FsbGVkIHdpdGhvdXQgYSBzdHJpbmcvQnVmZmVyIGFyZ3VtZW50OiAnICsgYXJnKTsKKyAgfQorICB0aGlzLnRzdGFjay5wdXNoKCciJyArIGJ1Zi50b1N0cmluZygnYmFzZTY0JykgKyAnIicpOworfTsKKworLyoqCisgKiBAY2xhc3MKKyAqIEBuYW1lIEFub25SZWFkTWVzc2FnZUJlZ2luUmV0dXJuCisgKiBAcHJvcGVydHkge3N0cmluZ30gZm5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgc2VydmljZSBtZXRob2QuCisgKiBAcHJvcGVydHkge1RocmlmdC5NZXNzYWdlVHlwZX0gbXR5cGUgLSBUaGUgdHlwZSBvZiBtZXNzYWdlIGNhbGwuCisgKiBAcHJvcGVydHkge251bWJlcn0gcnNlcWlkIC0gVGhlIHNlcXVlbmNlIG51bWJlciBvZiB0aGUgbWVzc2FnZSAoMCBpbiBUaHJpZnQgUlBDKS4KKyAqLworLyoqCisgKiBEZXNlcmlhbGl6ZXMgdGhlIGJlZ2lubmluZyBvZiBhIG1lc3NhZ2UuCisgKiBAcmV0dXJucyB7QW5vblJlYWRNZXNzYWdlQmVnaW5SZXR1cm59CisgKi8KK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLnJlYWRNZXNzYWdlQmVnaW4gPSBmdW5jdGlvbigpIHsKKyAgdGhpcy5yc3RhY2sgPSBbXTsKKyAgdGhpcy5ycG9zID0gW107CisKKyAgLy9Cb3Jyb3cgdGhlIGluYm91bmQgdHJhbnNwb3J0IGJ1ZmZlciBhbmQgZW5zdXJlIGRhdGEgaXMgcHJlc2VudC9jb25zaXN0ZW50CisgIHZhciB0cmFuc0J1ZiA9IHRoaXMudHJhbnMuYm9ycm93KCk7CisgIGlmICh0cmFuc0J1Zi5yZWFkSW5kZXggPj0gdHJhbnNCdWYud3JpdGVJbmRleCkgeworICAgIHRocm93IG5ldyBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IoKTsKKyAgfQorICB2YXIgY3Vyc29yID0gdHJhbnNCdWYucmVhZEluZGV4OworCisgIGlmICh0cmFuc0J1Zi5idWZbY3Vyc29yXSAhPT0gMHg1QikgeyAvL1sKKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1hbGZvcm1lZCBKU09OIGlucHV0LCBubyBvcGVuaW5nIGJyYWNrZXQiKTsKKyAgfQorCisgIC8vUGFyc2UgYSBzaW5nbGUgbWVzc2FnZSAodGhlcmUgbWF5IGJlIHNldmVyYWwgaW4gdGhlIGJ1ZmZlcikKKyAgLy8gIFRPRE86IEhhbmRsZSBjaGFyYWN0ZXJzIHVzaW5nIG11bHRpcGxlIGNvZGUgdW5pdHMKKyAgY3Vyc29yKys7CisgIHZhciBvcGVuQnJhY2tldENvdW50ID0gMTsKKyAgdmFyIGluU3RyaW5nID0gZmFsc2U7CisgIGZvciAoOyBjdXJzb3IgPCB0cmFuc0J1Zi53cml0ZUluZGV4OyBjdXJzb3IrKykgeworICAgIHZhciBjaHIgPSB0cmFuc0J1Zi5idWZbY3Vyc29yXTsKKyAgICAvL3dlIHVzZSBoZXhhIGNoYXJjb2RlIGhlcmUgYmVjYXVzZSBkYXRhW2ldIHJldHVybnMgYW4gaW50IGFuZCBub3QgYSBjaGFyCisgICAgaWYgKGluU3RyaW5nKSB7CisgICAgICBpZiAoY2hyID09PSAweDIyKSB7IC8vIgorICAgICAgICBpblN0cmluZyA9IGZhbHNlOworICAgICAgfSBlbHNlIGlmIChjaHIgPT09IDB4NUMpIHsgLy9cCisgICAgICAgIC8vZXNjYXBlZCBjaGFyYWN0ZXIsIHNraXAKKyAgICAgICAgY3Vyc29yICs9IDE7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChjaHIgPT09IDB4NUIpIHsgLy9bCisgICAgICAgIG9wZW5CcmFja2V0Q291bnQgKz0gMTsKKyAgICAgIH0gZWxzZSBpZiAoY2hyID09PSAweDVEKSB7IC8vXQorICAgICAgICBvcGVuQnJhY2tldENvdW50IC09IDE7CisgICAgICAgIGlmIChvcGVuQnJhY2tldENvdW50ID09PSAwKSB7CisgICAgICAgICAgLy9lbmQgb2YganNvbiBtZXNzYWdlIGRldGVjdGVkCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoY2hyID09PSAweDIyKSB7IC8vIgorICAgICAgICBpblN0cmluZyA9IHRydWU7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKG9wZW5CcmFja2V0Q291bnQgIT09IDApIHsKKyAgICAvLyBNaXNzaW5nIGNsb3NpbmcgYnJhY2tldC4gQ2FuIGJlIGJ1ZmZlciB1bmRlcnJ1bi4KKyAgICB0aHJvdyBuZXcgSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yKCk7CisgIH0KKworICAvL1JlY29uc3RpdHV0ZSB0aGUgSlNPTiBvYmplY3QgYW5kIGNvbnVtZSB0aGUgbmVjZXNzYXJ5IGJ5dGVzCisgIHRoaXMucm9iaiA9IGpzb25fcGFyc2UodHJhbnNCdWYuYnVmLnNsaWNlKHRyYW5zQnVmLnJlYWRJbmRleCwgY3Vyc29yKzEpLnRvU3RyaW5nKCkpOworICB0aGlzLnRyYW5zLmNvbnN1bWUoY3Vyc29yICsgMSAtIHRyYW5zQnVmLnJlYWRJbmRleCk7CisKKyAgLy9WZXJpZnkgdGhlIHByb3RvY29sIHZlcnNpb24KKyAgdmFyIHZlcnNpb24gPSB0aGlzLnJvYmouc2hpZnQoKTsKKyAgaWYgKHZlcnNpb24gIT0gVEpTT05Qcm90b2NvbC5WZXJzaW9uKSB7CisgICAgdGhyb3cgbmV3IEVycm9yKCdXcm9uZyB0aHJpZnQgcHJvdG9jb2wgdmVyc2lvbjogJyArIHZlcnNpb24pOworICB9CisKKyAgLy9PYmplY3RpZnkgdGhlIHRocmlmdCBtZXNzYWdlIHtuYW1lL3R5cGUvc2VxdWVuY2UtbnVtYmVyfSBmb3IgcmV0dXJuCisgIC8vIGFuZCB0aGVuIHNhdmUgdGhlIEpTT04gb2JqZWN0IGluIHJzdGFjaworICB2YXIgciA9IHt9OworICByLmZuYW1lID0gdGhpcy5yb2JqLnNoaWZ0KCk7CisgIHIubXR5cGUgPSB0aGlzLnJvYmouc2hpZnQoKTsKKyAgci5yc2VxaWQgPSB0aGlzLnJvYmouc2hpZnQoKTsKKyAgdGhpcy5yc3RhY2sucHVzaCh0aGlzLnJvYmouc2hpZnQoKSk7CisgIHJldHVybiByOworfTsKKworLyoqIERlc2VyaWFsaXplcyB0aGUgZW5kIG9mIGEgbWVzc2FnZS4gKi8KK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLnJlYWRNZXNzYWdlRW5kID0gZnVuY3Rpb24oKSB7Cit9OworCisvKioKKyAqIERlc2VyaWFsaXplcyB0aGUgYmVnaW5uaW5nIG9mIGEgc3RydWN0LgorICogQHBhcmFtIHtzdHJpbmd9IFtuYW1lXSAtIFRoZSBuYW1lIG9mIHRoZSBzdHJ1Y3QgKGlnbm9yZWQpCisgKiBAcmV0dXJucyB7b2JqZWN0fSAtIEFuIG9iamVjdCB3aXRoIGFuIGVtcHR5IHN0cmluZyBmbmFtZSBwcm9wZXJ0eQorICovCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS5yZWFkU3RydWN0QmVnaW4gPSBmdW5jdGlvbigpIHsKKyAgdmFyIHIgPSB7fTsKKyAgci5mbmFtZSA9ICcnOworCisgIC8vaW5jYXNlIHRoaXMgaXMgYW4gYXJyYXkgb2Ygc3RydWN0cworICBpZiAodGhpcy5yc3RhY2tbdGhpcy5yc3RhY2subGVuZ3RoIC0gMV0gaW5zdGFuY2VvZiBBcnJheSkgeworICAgIHRoaXMucnN0YWNrLnB1c2godGhpcy5yc3RhY2tbdGhpcy5yc3RhY2subGVuZ3RoIC0gMV0uc2hpZnQoKSk7CisgIH0KKworICByZXR1cm4gcjsKK307CisKKy8qKiBEZXNlcmlhbGl6ZXMgdGhlIGVuZCBvZiBhIHN0cnVjdC4gKi8KK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLnJlYWRTdHJ1Y3RFbmQgPSBmdW5jdGlvbigpIHsKKyAgdGhpcy5yc3RhY2sucG9wKCk7Cit9OworCisvKioKKyAqIEBjbGFzcworICogQG5hbWUgQW5vblJlYWRGaWVsZEJlZ2luUmV0dXJuCisgKiBAcHJvcGVydHkge3N0cmluZ30gZm5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZmllbGQgKGFsd2F5cyAnJykuCisgKiBAcHJvcGVydHkge1RocmlmdC5UeXBlfSBmdHlwZSAtIFRoZSBkYXRhIHR5cGUgb2YgdGhlIGZpZWxkLgorICogQHByb3BlcnR5IHtudW1iZXJ9IGZpZCAtIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgZmllbGQuCisgKi8KKy8qKgorICogRGVzZXJpYWxpemVzIHRoZSBiZWdpbm5pbmcgb2YgYSBmaWVsZC4KKyAqIEByZXR1cm5zIHtBbm9uUmVhZEZpZWxkQmVnaW5SZXR1cm59CisgKi8KK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLnJlYWRGaWVsZEJlZ2luID0gZnVuY3Rpb24oKSB7CisgIHZhciByID0ge307CisKKyAgdmFyIGZpZCA9IC0xOworICB2YXIgZnR5cGUgPSBUeXBlLlNUT1A7CisKKyAgLy9nZXQgYSBmaWVsZElkCisgIGZvciAodmFyIGYgaW4gKHRoaXMucnN0YWNrW3RoaXMucnN0YWNrLmxlbmd0aCAtIDFdKSkgeworICAgIGlmIChmID09PSBudWxsKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBmaWQgPSBwYXJzZUludChmLCAxMCk7CisgICAgdGhpcy5ycG9zLnB1c2godGhpcy5yc3RhY2subGVuZ3RoKTsKKworICAgIHZhciBmaWVsZCA9IHRoaXMucnN0YWNrW3RoaXMucnN0YWNrLmxlbmd0aCAtIDFdW2ZpZF07CisKKyAgICAvL3JlbW92ZSBzbyB3ZSBkb24ndCBzZWUgaXQgYWdhaW4KKyAgICBkZWxldGUgdGhpcy5yc3RhY2tbdGhpcy5yc3RhY2subGVuZ3RoIC0gMV1bZmlkXTsKKworICAgIHRoaXMucnN0YWNrLnB1c2goZmllbGQpOworCisgICAgYnJlYWs7CisgIH0KKworICBpZiAoZmlkICE9IC0xKSB7CisgICAgLy9zaG91bGQgb25seSBiZSAxIG9mIHRoZXNlIGJ1dCB0aGlzIGlzIHRoZSBvbmx5CisgICAgLy93YXkgdG8gbWF0Y2ggYSBrZXkKKyAgICBmb3IgKHZhciBpIGluICh0aGlzLnJzdGFja1t0aGlzLnJzdGFjay5sZW5ndGggLSAxXSkpIHsKKyAgICAgIGlmIChUSlNPTlByb3RvY29sLlJUeXBlW2ldID09PSBudWxsKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBmdHlwZSA9IFRKU09OUHJvdG9jb2wuUlR5cGVbaV07CisgICAgICB0aGlzLnJzdGFja1t0aGlzLnJzdGFjay5sZW5ndGggLSAxXSA9IHRoaXMucnN0YWNrW3RoaXMucnN0YWNrLmxlbmd0aCAtIDFdW2ldOworICAgIH0KKyAgfQorCisgIHIuZm5hbWUgPSAnJzsKKyAgci5mdHlwZSA9IGZ0eXBlOworICByLmZpZCA9IGZpZDsKKworICByZXR1cm4gcjsKK307CisKKy8qKiBEZXNlcmlhbGl6ZXMgdGhlIGVuZCBvZiBhIGZpZWxkLiAqLworVEpTT05Qcm90b2NvbC5wcm90b3R5cGUucmVhZEZpZWxkRW5kID0gZnVuY3Rpb24oKSB7CisgIHZhciBwb3MgPSB0aGlzLnJwb3MucG9wKCk7CisKKyAgLy9nZXQgYmFjayB0byB0aGUgcmlnaHQgcGxhY2UgaW4gdGhlIHN0YWNrCisgIHdoaWxlICh0aGlzLnJzdGFjay5sZW5ndGggPiBwb3MpIHsKKyAgICB0aGlzLnJzdGFjay5wb3AoKTsKKyAgfQorfTsKKworLyoqCisgKiBAY2xhc3MKKyAqIEBuYW1lIEFub25SZWFkTWFwQmVnaW5SZXR1cm4KKyAqIEBwcm9wZXJ0eSB7VGhyaWZ0LlR5cGV9IGt0eXBlIC0gVGhlIGRhdGEgdHlwZSBvZiB0aGUga2V5LgorICogQHByb3BlcnR5IHtUaHJpZnQuVHlwZX0gdnR5cGUgLSBUaGUgZGF0YSB0eXBlIG9mIHRoZSB2YWx1ZS4KKyAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBzaXplIC0gVGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbWFwLgorICovCisvKioKKyAqIERlc2VyaWFsaXplcyB0aGUgYmVnaW5uaW5nIG9mIGEgbWFwLgorICogQHJldHVybnMge0Fub25SZWFkTWFwQmVnaW5SZXR1cm59CisgKi8KK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLnJlYWRNYXBCZWdpbiA9IGZ1bmN0aW9uKCkgeworICB2YXIgbWFwID0gdGhpcy5yc3RhY2sucG9wKCk7CisgIHZhciBmaXJzdCA9IG1hcC5zaGlmdCgpOworICBpZiAoZmlyc3QgaW5zdGFuY2VvZiBBcnJheSkgeworICAgIHRoaXMucnN0YWNrLnB1c2gobWFwKTsKKyAgICBtYXAgPSBmaXJzdDsKKyAgICBmaXJzdCA9IG1hcC5zaGlmdCgpOworICB9CisKKyAgdmFyIHIgPSB7fTsKKyAgci5rdHlwZSA9IFRKU09OUHJvdG9jb2wuUlR5cGVbZmlyc3RdOworICByLnZ0eXBlID0gVEpTT05Qcm90b2NvbC5SVHlwZVttYXAuc2hpZnQoKV07CisgIHIuc2l6ZSA9IG1hcC5zaGlmdCgpOworCisKKyAgdGhpcy5ycG9zLnB1c2godGhpcy5yc3RhY2subGVuZ3RoKTsKKyAgdGhpcy5yc3RhY2sucHVzaChtYXAuc2hpZnQoKSk7CisKKyAgcmV0dXJuIHI7Cit9OworCisvKiogRGVzZXJpYWxpemVzIHRoZSBlbmQgb2YgYSBtYXAuICovCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS5yZWFkTWFwRW5kID0gZnVuY3Rpb24oKSB7CisgIHRoaXMucmVhZEZpZWxkRW5kKCk7Cit9OworCisvKioKKyAqIEBjbGFzcworICogQG5hbWUgQW5vblJlYWRDb2xCZWdpblJldHVybgorICogQHByb3BlcnR5IHtUaHJpZnQuVHlwZX0gZXR5cGUgLSBUaGUgZGF0YSB0eXBlIG9mIHRoZSBlbGVtZW50LgorICogQHByb3BlcnR5IHtudW1iZXJ9IHNpemUgLSBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb2xsZWN0aW9uLgorICovCisvKioKKyAqIERlc2VyaWFsaXplcyB0aGUgYmVnaW5uaW5nIG9mIGEgbGlzdC4KKyAqIEByZXR1cm5zIHtBbm9uUmVhZENvbEJlZ2luUmV0dXJufQorICovCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS5yZWFkTGlzdEJlZ2luID0gZnVuY3Rpb24oKSB7CisgIHZhciBsaXN0ID0gdGhpcy5yc3RhY2tbdGhpcy5yc3RhY2subGVuZ3RoIC0gMV07CisKKyAgdmFyIHIgPSB7fTsKKyAgci5ldHlwZSA9IFRKU09OUHJvdG9jb2wuUlR5cGVbbGlzdC5zaGlmdCgpXTsKKyAgci5zaXplID0gbGlzdC5zaGlmdCgpOworCisgIHRoaXMucnBvcy5wdXNoKHRoaXMucnN0YWNrLmxlbmd0aCk7CisgIHRoaXMucnN0YWNrLnB1c2gobGlzdC5zaGlmdCgpKTsKKworICByZXR1cm4gcjsKK307CisKKy8qKiBEZXNlcmlhbGl6ZXMgdGhlIGVuZCBvZiBhIGxpc3QuICovCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS5yZWFkTGlzdEVuZCA9IGZ1bmN0aW9uKCkgeworICB2YXIgcG9zID0gdGhpcy5ycG9zLnBvcCgpIC0gMjsKKyAgdmFyIHN0ID0gdGhpcy5yc3RhY2s7CisgIHN0LnBvcCgpOworICBpZiAoc3QgaW5zdGFuY2VvZiBBcnJheSAmJiBzdC5sZW5ndGggPiBwb3MgJiYgc3RbcG9zXS5sZW5ndGggPiAwKSB7CisgICAgc3QucHVzaChzdFtwb3NdLnNoaWZ0KCkpOworICB9Cit9OworCisvKioKKyAqIERlc2VyaWFsaXplcyB0aGUgYmVnaW5uaW5nIG9mIGEgc2V0LgorICogQHJldHVybnMge0Fub25SZWFkQ29sQmVnaW5SZXR1cm59CisgKi8KK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLnJlYWRTZXRCZWdpbiA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4gdGhpcy5yZWFkTGlzdEJlZ2luKCk7Cit9OworCisvKiogRGVzZXJpYWxpemVzIHRoZSBlbmQgb2YgYSBzZXQuICovCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS5yZWFkU2V0RW5kID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB0aGlzLnJlYWRMaXN0RW5kKCk7Cit9OworCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS5yZWFkQm9vbCA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4gdGhpcy5yZWFkVmFsdWUoKSA9PSAnMSc7Cit9OworCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS5yZWFkQnl0ZSA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4gdGhpcy5yZWFkSTMyKCk7Cit9OworCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS5yZWFkSTE2ID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB0aGlzLnJlYWRJMzIoKTsKK307CisKK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLnJlYWRJMzIgPSBmdW5jdGlvbihmKSB7CisgIHJldHVybiArdGhpcy5yZWFkVmFsdWUoKTsKK30KKworLyoqIFJldHVybnMgdGhlIG5leHQgdmFsdWUgZm91bmQgaW4gdGhlIHByb3RvY29sIGJ1ZmZlciAqLworVEpTT05Qcm90b2NvbC5wcm90b3R5cGUucmVhZFZhbHVlID0gZnVuY3Rpb24oZikgeworICBpZiAoZiA9PT0gdW5kZWZpbmVkKSB7CisgICAgZiA9IHRoaXMucnN0YWNrW3RoaXMucnN0YWNrLmxlbmd0aCAtIDFdOworICB9CisKKyAgdmFyIHIgPSB7fTsKKworICBpZiAoZiBpbnN0YW5jZW9mIEFycmF5KSB7CisgICAgaWYgKGYubGVuZ3RoID09PSAwKSB7CisgICAgICByLnZhbHVlID0gdW5kZWZpbmVkOworICAgIH0gZWxzZSB7CisgICAgICByLnZhbHVlID0gZi5zaGlmdCgpOworICAgIH0KKyAgfSBlbHNlIGlmICghKGYgaW5zdGFuY2VvZiBJbnQ2NCkgJiYgZiBpbnN0YW5jZW9mIE9iamVjdCkgeworICAgIGZvciAodmFyIGkgaW4gZikgeworICAgICAgaWYgKGkgPT09IG51bGwpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICB0aGlzLnJzdGFjay5wdXNoKGZbaV0pOworICAgICAgZGVsZXRlIGZbaV07CisKKyAgICAgIHIudmFsdWUgPSBpOworICAgICAgYnJlYWs7CisgICAgfQorICB9IGVsc2UgeworICAgIHIudmFsdWUgPSBmOworICAgIHRoaXMucnN0YWNrLnBvcCgpOworICB9CisKKyAgcmV0dXJuIHIudmFsdWU7Cit9OworCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS5yZWFkSTY0ID0gZnVuY3Rpb24oKSB7CisgIHZhciBuID0gdGhpcy5yZWFkVmFsdWUoKQorICBpZiAodHlwZW9mIG4gPT09ICdzdHJpbmcnKSB7CisgICAgLy8gQXNzdW1pbmcgbm8gb25lIGlzIHNlbmRpbmcgaW4gMS4xMTExMWUrMzMgZm9ybWF0CisgICAgcmV0dXJuIEludDY0VXRpbC5mcm9tRGVjaW1hbFN0cmluZyhuKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gbmV3IEludDY0KG4pOworICB9Cit9OworCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS5yZWFkRG91YmxlID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB0aGlzLnJlYWRJMzIoKTsKK307CisKK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLnJlYWRCaW5hcnkgPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIG5ldyBCdWZmZXIodGhpcy5yZWFkVmFsdWUoKSwgJ2Jhc2U2NCcpOworfTsKKworVEpTT05Qcm90b2NvbC5wcm90b3R5cGUucmVhZFN0cmluZyA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4gdGhpcy5yZWFkVmFsdWUoKTsKK307CisKKy8qKgorICogUmV0dXJucyB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQuCisgKiBAcmVhZG9ubHkKKyAqIEByZXR1cm5zIHtUaHJpZnQuVHJhbnNwb3J0fSBUaGUgdW5kZXJseWluZyB0cmFuc3BvcnQuCisgKi8KK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLmdldFRyYW5zcG9ydCA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4gdGhpcy50cmFuczsKK307CisKKy8qKgorICogTWV0aG9kIHRvIGFyYml0cmFyaWx5IHNraXAgb3ZlciBkYXRhCisgKi8KK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLnNraXAgPSBmdW5jdGlvbih0eXBlKSB7CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBUeXBlLlNUT1A6CisgICAgICByZXR1cm47CisgICAgY2FzZSBUeXBlLkJPT0w6CisgICAgICB0aGlzLnJlYWRCb29sKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFR5cGUuQllURToKKyAgICAgIHRoaXMucmVhZEJ5dGUoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHlwZS5JMTY6CisgICAgICB0aGlzLnJlYWRJMTYoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHlwZS5JMzI6CisgICAgICB0aGlzLnJlYWRJMzIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHlwZS5JNjQ6CisgICAgICB0aGlzLnJlYWRJNjQoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHlwZS5ET1VCTEU6CisgICAgICB0aGlzLnJlYWREb3VibGUoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHlwZS5TVFJJTkc6CisgICAgICB0aGlzLnJlYWRTdHJpbmcoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHlwZS5TVFJVQ1Q6CisgICAgICB0aGlzLnJlYWRTdHJ1Y3RCZWdpbigpOworICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgdmFyIHIgPSB0aGlzLnJlYWRGaWVsZEJlZ2luKCk7CisgICAgICAgIGlmIChyLmZ0eXBlID09PSBUeXBlLlNUT1ApIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB0aGlzLnNraXAoci5mdHlwZSk7CisgICAgICAgIHRoaXMucmVhZEZpZWxkRW5kKCk7CisgICAgICB9CisgICAgICB0aGlzLnJlYWRTdHJ1Y3RFbmQoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHlwZS5NQVA6CisgICAgICB2YXIgbWFwQmVnaW4gPSB0aGlzLnJlYWRNYXBCZWdpbigpOworICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtYXBCZWdpbi5zaXplOyArK2kpIHsKKyAgICAgICAgdGhpcy5za2lwKG1hcEJlZ2luLmt0eXBlKTsKKyAgICAgICAgdGhpcy5za2lwKG1hcEJlZ2luLnZ0eXBlKTsKKyAgICAgIH0KKyAgICAgIHRoaXMucmVhZE1hcEVuZCgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUeXBlLlNFVDoKKyAgICAgIHZhciBzZXRCZWdpbiA9IHRoaXMucmVhZFNldEJlZ2luKCk7CisgICAgICBmb3IgKHZhciBpMiA9IDA7IGkyIDwgc2V0QmVnaW4uc2l6ZTsgKytpMikgeworICAgICAgICB0aGlzLnNraXAoc2V0QmVnaW4uZXR5cGUpOworICAgICAgfQorICAgICAgdGhpcy5yZWFkU2V0RW5kKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFR5cGUuTElTVDoKKyAgICAgIHZhciBsaXN0QmVnaW4gPSB0aGlzLnJlYWRMaXN0QmVnaW4oKTsKKyAgICAgIGZvciAodmFyIGkzID0gMDsgaTMgPCBsaXN0QmVnaW4uc2l6ZTsgKytpMykgeworICAgICAgICB0aGlzLnNraXAobGlzdEJlZ2luLmV0eXBlKTsKKyAgICAgIH0KKyAgICAgIHRoaXMucmVhZExpc3RFbmQoKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyBuZXcgIEVycm9yKCJJbnZhbGlkIHR5cGU6ICIgKyB0eXBlKTsKKyAgfQorfTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvbGliL3RocmlmdC9sb2cuanMgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvbG9nLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1M2U4MTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvbG9nLmpzCkBAIC0wLDAgKzEsODcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordmFyIHV0aWwgPSByZXF1aXJlKCd1dGlsJyk7CisKK3ZhciBkaXNhYmxlZCA9IGZ1bmN0aW9uICgpIHt9OwordmFyIGxvZ0Z1bmMgPSBjb25zb2xlLmxvZzsKK3ZhciBsb2dMZXZlbCA9ICdlcnJvcic7IC8vIGRlZmF1bHQgbGV2ZWwKKworZnVuY3Rpb24gZmFjdG9yeShsZXZlbCkgeworICByZXR1cm4gZnVuY3Rpb24gKCkgeworICAgIC8vIGJldHRlciB1c2Ugc3ByZWFkIHN5bnRheCwgYnV0IGR1ZSB0byBjb21wYXRpYmlsaXR5LAorICAgIC8vIHVzZSBsZWdhY3kgbWV0aG9kIGhlcmUuCisgICAgdmFyIGFyZ3MgPSBbJ3RocmlmdDogWycgKyBsZXZlbCArICddICddLmNvbmNhdChBcnJheS5mcm9tKGFyZ3VtZW50cykpOworICAgIHJldHVybiBsb2dGdW5jKHV0aWwuZm9ybWF0LmFwcGx5KG51bGwsIGFyZ3MpKTsKKyAgfTsKK30KKwordmFyIHRyYWNlID0gZGlzYWJsZWQ7Cit2YXIgZGVidWcgPSBkaXNhYmxlZDsKK3ZhciBlcnJvciA9IGRpc2FibGVkOwordmFyIHdhcm5pbmcgPSBkaXNhYmxlZDsKK3ZhciBpbmZvID0gZGlzYWJsZWQ7CisKK2V4cG9ydHMuc2V0TG9nRnVuYyA9IGZ1bmN0aW9uIChmdW5jKSB7CisgIGxvZ0Z1bmMgPSBmdW5jOworfTsKKwordmFyIHNldExvZ0xldmVsID0gZXhwb3J0cy5zZXRMb2dMZXZlbCA9IGZ1bmN0aW9uIChsZXZlbCkgeworICB0cmFjZSA9IGRlYnVnID0gZXJyb3IgPSB3YXJuaW5nID0gaW5mbyA9IGRpc2FibGVkOworICBsb2dMZXZlbCA9IGxldmVsOworICBzd2l0Y2ggKGxvZ0xldmVsKSB7CisgIGNhc2UgJ3RyYWNlJzoKKyAgICB0cmFjZSA9IGZhY3RvcnkoJ1RSQUNFJyk7CisgIGNhc2UgJ2RlYnVnJzoKKyAgICBkZWJ1ZyA9IGZhY3RvcnkoJ0RFQlVHJyk7CisgIGNhc2UgJ2Vycm9yJzoKKyAgICBlcnJvciA9IGZhY3RvcnkoJ0VSUk9SJyk7CisgIGNhc2UgJ3dhcm5pbmcnOgorICAgIHdhcm5pbmcgPSBmYWN0b3J5KCdXQVJOJyk7CisgIGNhc2UgJ2luZm8nOgorICAgIGluZm8gPSBmYWN0b3J5KCdJTkZPJyk7CisgIH0KK307CisKKy8vIHNldCBkZWZhdWx0CitzZXRMb2dMZXZlbChsb2dMZXZlbCk7CisKK2V4cG9ydHMuZ2V0TG9nTGV2ZWwgPSBmdW5jdGlvbiAoKSB7CisgIHJldHVybiBsb2dMZXZlbDsKK307CisKK2V4cG9ydHMudHJhY2UgPSBmdW5jdGlvbiAoKSB7CisgIHJldHVybiB0cmFjZS5hcHBseShudWxsLCBhcmd1bWVudHMpOworfTsKKworZXhwb3J0cy5kZWJ1ZyA9IGZ1bmN0aW9uICgpIHsKKyAgcmV0dXJuIGRlYnVnLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7Cit9OworCitleHBvcnRzLmVycm9yID0gZnVuY3Rpb24gKCkgeworICByZXR1cm4gZXJyb3IuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKK307CisKK2V4cG9ydHMud2FybmluZyA9IGZ1bmN0aW9uICgpIHsKKyAgcmV0dXJuIHdhcm5pbmcuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKK307CisKK2V4cG9ydHMuaW5mbyA9IGZ1bmN0aW9uICgpIHsKKyAgcmV0dXJuIGluZm8uYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKK307CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2xpYi90aHJpZnQvbXVsdGlwbGV4ZWRfcHJvY2Vzc29yLmpzIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L211bHRpcGxleGVkX3Byb2Nlc3Nvci5qcwppbmRleCBmYmNlYjc5Li42N2I2MmY3IDEwMDY0NAotLS0gYS9saWIvbm9kZWpzL2xpYi90aHJpZnQvbXVsdGlwbGV4ZWRfcHJvY2Vzc29yLmpzCisrKyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9tdWx0aXBsZXhlZF9wcm9jZXNzb3IuanMKQEAgLTE4LDQxICsxOCw0NiBAQAogICovCiB2YXIgVGhyaWZ0ID0gcmVxdWlyZSgnLi90aHJpZnQnKTsKIAotdmFyIE11bHRpcGxleGVkUHJvY2Vzc29yID0gZXhwb3J0cy5NdWx0aXBsZXhlZFByb2Nlc3NvciA9IGZ1bmN0aW9uKHN0cmVhbSwgb3B0aW9ucykgewotICAgIHRoaXMuc2VydmljZXMgPSB7fTsKK2V4cG9ydHMuTXVsdGlwbGV4ZWRQcm9jZXNzb3IgPSBNdWx0aXBsZXhlZFByb2Nlc3NvcjsKKworZnVuY3Rpb24gTXVsdGlwbGV4ZWRQcm9jZXNzb3Ioc3RyZWFtLCBvcHRpb25zKSB7CisgIHRoaXMuc2VydmljZXMgPSB7fTsKIH07CiAKIE11bHRpcGxleGVkUHJvY2Vzc29yLnByb3RvdHlwZS5yZWdpc3RlclByb2Nlc3NvciA9IGZ1bmN0aW9uKG5hbWUsIGhhbmRsZXIpIHsKLSAgICB0aGlzLnNlcnZpY2VzW25hbWVdID0gaGFuZGxlcjsKKyAgdGhpcy5zZXJ2aWNlc1tuYW1lXSA9IGhhbmRsZXI7CiB9OwogCiBNdWx0aXBsZXhlZFByb2Nlc3Nvci5wcm90b3R5cGUucHJvY2VzcyA9IGZ1bmN0aW9uKGlucCwgb3V0KSB7Ci0gICAgdmFyIGJlZ2luID0gaW5wLnJlYWRNZXNzYWdlQmVnaW4oKTsKLSAgICBpZiAoYmVnaW4ubXR5cGUgIT0gVGhyaWZ0Lk1lc3NhZ2VUeXBlLkNBTEwgJiYgYmVnaW4ubXR5cGUgIT0gVGhyaWZ0Lk1lc3NhZ2VUeXBlLk9ORVdBWSkgewotICAgICAgICB0aHJvdyBuZXcgVGhyaWZ0LlRFeGNlcHRpb24oIlRNdWx0aXBsZXhlZFByb2Nlc3NvcjogVW5leHBlY3RlZCBtZXNzYWdlIHR5cGUiKTsKLSAgICB9CisgIHZhciBiZWdpbiA9IGlucC5yZWFkTWVzc2FnZUJlZ2luKCk7CiAKLSAgICB2YXIgcCA9IGJlZ2luLmZuYW1lLnNwbGl0KCI6Iik7Ci0gICAgdmFyIHNuYW1lID0gcFswXTsKLSAgICB2YXIgZm5hbWUgPSBwWzFdOworICBpZiAoYmVnaW4ubXR5cGUgIT0gVGhyaWZ0Lk1lc3NhZ2VUeXBlLkNBTEwgJiYgYmVnaW4ubXR5cGUgIT0gVGhyaWZ0Lk1lc3NhZ2VUeXBlLk9ORVdBWSkgeworICAgIHRocm93IG5ldyBUaHJpZnQuVEV4Y2VwdGlvbignVE11bHRpcGxleGVkUHJvY2Vzc29yOiBVbmV4cGVjdGVkIG1lc3NhZ2UgdHlwZScpOworICB9CiAKLSAgICBpZiAoISAoc25hbWUgaW4gdGhpcy5zZXJ2aWNlcykpIHsKLSAgICAgICAgdGhyb3cgbmV3IFRocmlmdC5URXhjZXB0aW9uKCJUTXVsdGlwbGV4ZWRQcm9jZXNzb3I6IFVua25vd24gc2VydmljZTogIiArIHNuYW1lKTsKLSAgICB9CisgIHZhciBwID0gYmVnaW4uZm5hbWUuc3BsaXQoJzonKTsKKyAgdmFyIHNuYW1lID0gcFswXTsKKyAgdmFyIGZuYW1lID0gcFsxXTsKIAotICAgIC8vY29uc3RydWN0IGEgcHJveHkgb2JqZWN0IHdoaWNoIHN0dWJzIHRoZSByZWFkTWVzc2FnZUJlZ2luCi0gICAgLy9mb3IgdGhlIHNlcnZpY2UKLSAgICB2YXIgaW5wUHJveHkgPSB7fTsKLSAgICBmb3IgKHZhciBhdHRyIGluIGlucCkgewotICAgICAgICBpbnBQcm94eVthdHRyXSA9IGlucFthdHRyXTsKLSAgICB9Ci0gICAgaW5wUHJveHkucmVhZE1lc3NhZ2VCZWdpbiA9IGZ1bmN0aW9uKCkgewotICAgICAgICByZXR1cm4gewotICAgICAgICAgICAgZm5hbWU6IGZuYW1lLAotICAgICAgICAgICAgbXR5cGU6IGJlZ2luLm10eXBlLAotICAgICAgICAgICAgcnNlcWlkOiBiZWdpbi5yc2VxaWQKLSAgICAgICAgfTsKKyAgaWYgKCEgKHNuYW1lIGluIHRoaXMuc2VydmljZXMpKSB7CisgICAgdGhyb3cgbmV3IFRocmlmdC5URXhjZXB0aW9uKCdUTXVsdGlwbGV4ZWRQcm9jZXNzb3I6IFVua25vd24gc2VydmljZTogJyArIHNuYW1lKTsKKyAgfQorCisgIC8vY29uc3RydWN0IGEgcHJveHkgb2JqZWN0IHdoaWNoIHN0dWJzIHRoZSByZWFkTWVzc2FnZUJlZ2luCisgIC8vZm9yIHRoZSBzZXJ2aWNlCisgIHZhciBpbnBQcm94eSA9IHt9OworCisgIGZvciAodmFyIGF0dHIgaW4gaW5wKSB7CisgICAgaW5wUHJveHlbYXR0cl0gPSBpbnBbYXR0cl07CisgIH0KKworICBpbnBQcm94eS5yZWFkTWVzc2FnZUJlZ2luID0gZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIHsKKyAgICAgIGZuYW1lOiBmbmFtZSwKKyAgICAgIG10eXBlOiBiZWdpbi5tdHlwZSwKKyAgICAgIHJzZXFpZDogYmVnaW4ucnNlcWlkCiAgICAgfTsKKyAgfTsKIAotICAgIHRoaXMuc2VydmljZXNbc25hbWVdLnByb2Nlc3MoaW5wUHJveHksIG91dCk7CisgIHRoaXMuc2VydmljZXNbc25hbWVdLnByb2Nlc3MoaW5wUHJveHksIG91dCk7CiB9OwpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9saWIvdGhyaWZ0L211bHRpcGxleGVkX3Byb3RvY29sLmpzIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L211bHRpcGxleGVkX3Byb3RvY29sLmpzCmluZGV4IDY4NDQwYWYuLmQwNzhhYTIgMTAwNjQ0Ci0tLSBhL2xpYi9ub2RlanMvbGliL3RocmlmdC9tdWx0aXBsZXhlZF9wcm90b2NvbC5qcworKysgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvbXVsdGlwbGV4ZWRfcHJvdG9jb2wuanMKQEAgLTE5LDQ5ICsxOSw1NSBAQAogdmFyIHV0aWwgPSByZXF1aXJlKCd1dGlsJyk7CiB2YXIgVGhyaWZ0ID0gcmVxdWlyZSgnLi90aHJpZnQnKTsKIAotdmFyIFdyYXBwZXIgPSBleHBvcnRzLldyYXBwZXIgPSBmdW5jdGlvbihzZXJ2aWNlX25hbWUsIHByb3RvY29sLCBjb25uZWN0aW9uKSB7CitleHBvcnRzLk11bHRpcGxleGVyID0gTXVsdGlwbGV4ZXI7CiAKLSAgICB2YXIgTXVsdGlwbGV4UHJvdG9jb2wgPSBmdW5jdGlvbih0cmFucywgc3RyaWN0UmVhZCwgc3RyaWN0V3JpdGUpIHsKLSAgICAgICAgcHJvdG9jb2wuY2FsbCh0aGlzLCB0cmFucywgc3RyaWN0UmVhZCwgc3RyaWN0V3JpdGUpOwotICAgIH07Ci0gICAgdXRpbC5pbmhlcml0cyhNdWx0aXBsZXhQcm90b2NvbCwgcHJvdG9jb2wpOworZnVuY3Rpb24gV3JhcHBlcihzZXJ2aWNlTmFtZSwgcHJvdG9jb2wsIGNvbm5lY3Rpb24pIHsKIAotICAgIE11bHRpcGxleFByb3RvY29sLnByb3RvdHlwZS53cml0ZU1lc3NhZ2VCZWdpbiA9IGZ1bmN0aW9uKG5hbWUsIHR5cGUsIHNlcWlkKSB7Ci0gICAgICAgIGlmICh0eXBlID09IFRocmlmdC5NZXNzYWdlVHlwZS5DQUxMIHx8IHR5cGUgPT0gVGhyaWZ0Lk1lc3NhZ2VUeXBlLk9ORVdBWSkgewotICAgICAgICAgICAgY29ubmVjdGlvbi5zZXFJZDJTZXJ2aWNlW3NlcWlkXSA9IHNlcnZpY2VfbmFtZTsKLSAgICAgICAgICAgIE11bHRpcGxleFByb3RvY29sLnN1cGVyXy5wcm90b3R5cGUud3JpdGVNZXNzYWdlQmVnaW4uY2FsbCh0aGlzLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlX25hbWUgKyAiOiIgKyBuYW1lLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXFpZCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBNdWx0aXBsZXhQcm90b2NvbC5zdXBlcl8ucHJvdG90eXBlLndyaXRlTWVzc2FnZUJlZ2luLmNhbGwodGhpcywgbmFtZSwgdHlwZSwgc2VxaWQpOwotICAgICAgICB9Ci0gICAgfTsKKyAgZnVuY3Rpb24gTXVsdGlwbGV4UHJvdG9jb2wodHJhbnMsIHN0cmljdFJlYWQsIHN0cmljdFdyaXRlKSB7CisgICAgcHJvdG9jb2wuY2FsbCh0aGlzLCB0cmFucywgc3RyaWN0UmVhZCwgc3RyaWN0V3JpdGUpOworICB9OwogCi0gICAgcmV0dXJuIE11bHRpcGxleFByb3RvY29sOworICB1dGlsLmluaGVyaXRzKE11bHRpcGxleFByb3RvY29sLCBwcm90b2NvbCk7CisKKyAgTXVsdGlwbGV4UHJvdG9jb2wucHJvdG90eXBlLndyaXRlTWVzc2FnZUJlZ2luID0gZnVuY3Rpb24obmFtZSwgdHlwZSwgc2VxaWQpIHsKKyAgICBpZiAodHlwZSA9PSBUaHJpZnQuTWVzc2FnZVR5cGUuQ0FMTCB8fCB0eXBlID09IFRocmlmdC5NZXNzYWdlVHlwZS5PTkVXQVkpIHsKKyAgICAgIGNvbm5lY3Rpb24uc2VxSWQyU2VydmljZVtzZXFpZF0gPSBzZXJ2aWNlTmFtZTsKKyAgICAgIE11bHRpcGxleFByb3RvY29sLnN1cGVyXy5wcm90b3R5cGUud3JpdGVNZXNzYWdlQmVnaW4uY2FsbCh0aGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VOYW1lICsgIjoiICsgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcWlkKTsKKyAgICB9IGVsc2UgeworICAgICAgTXVsdGlwbGV4UHJvdG9jb2wuc3VwZXJfLnByb3RvdHlwZS53cml0ZU1lc3NhZ2VCZWdpbi5jYWxsKHRoaXMsIG5hbWUsIHR5cGUsIHNlcWlkKTsKKyAgICB9CisgIH07CisKKyAgcmV0dXJuIE11bHRpcGxleFByb3RvY29sOwogfTsKIAotdmFyIE11bHRpcGxleGVyID0gZXhwb3J0cy5NdWx0aXBsZXhlciA9IGZ1bmN0aW9uKCkgewotICAgIHRoaXMuc2VxaWQgPSAwOworZnVuY3Rpb24gTXVsdGlwbGV4ZXIoKSB7CisgIHRoaXMuc2VxaWQgPSAwOwogfTsKIAotTXVsdGlwbGV4ZXIucHJvdG90eXBlLmNyZWF0ZUNsaWVudCA9IGZ1bmN0aW9uKHNlcnZpY2VfbmFtZSwgY2xzLCBjb25uZWN0aW9uKSB7Ci0gICAgaWYgKGNscy5DbGllbnQpIHsKLSAgICAgICAgY2xzID0gY2xzLkNsaWVudDsKLSAgICB9Ci0gICAgdmFyIHNlbGYgPSB0aGlzOwotICAgIGNscy5wcm90b3R5cGUubmV3X3NlcWlkID0gZnVuY3Rpb24oKSB7Ci0gICAgICAgIHNlbGYuc2VxaWQgKz0gMTsKLSAgICAgICAgcmV0dXJuIHNlbGYuc2VxaWQ7Ci0gICAgfTsKLSAgICB2YXIgY2xpZW50ID0gbmV3IGNscyhuZXcgY29ubmVjdGlvbi50cmFuc3BvcnQodW5kZWZpbmVkLCBmdW5jdGlvbihidWYpIHsKLSAgICAgICAgY29ubmVjdGlvbi53cml0ZShidWYpOwotICAgIH0pLCBuZXcgV3JhcHBlcihzZXJ2aWNlX25hbWUsIGNvbm5lY3Rpb24ucHJvdG9jb2wsIGNvbm5lY3Rpb24pKTsKLSAgICAKLSAgICBpZiAodHlwZW9mIGNvbm5lY3Rpb24uY2xpZW50ICE9PSAnb2JqZWN0JykgewotICAgICAgIGNvbm5lY3Rpb24uY2xpZW50ID0ge307Ci0gICAgfQotICAgIGNvbm5lY3Rpb24uY2xpZW50W3NlcnZpY2VfbmFtZV0gPSBjbGllbnQ7CitNdWx0aXBsZXhlci5wcm90b3R5cGUuY3JlYXRlQ2xpZW50ID0gZnVuY3Rpb24oc2VydmljZU5hbWUsIFNlcnZpY2VDbGllbnQsIGNvbm5lY3Rpb24pIHsKKyAgaWYgKFNlcnZpY2VDbGllbnQuQ2xpZW50KSB7CisgICAgU2VydmljZUNsaWVudCA9IFNlcnZpY2VDbGllbnQuQ2xpZW50OworICB9CisgIHZhciB3cml0ZUNiID0gZnVuY3Rpb24oYnVmLCBzZXFpZCkgeworICAgIGNvbm5lY3Rpb24ud3JpdGUoYnVmLHNlcWlkKTsKKyAgfTsKKyAgdmFyIHRyYW5zcG9ydCA9IG5ldyBjb25uZWN0aW9uLnRyYW5zcG9ydCh1bmRlZmluZWQsIHdyaXRlQ2IpOworICB2YXIgcHJvdG9jb2xXcmFwcGVyID0gbmV3IFdyYXBwZXIoc2VydmljZU5hbWUsIGNvbm5lY3Rpb24ucHJvdG9jb2wsIGNvbm5lY3Rpb24pOworICB2YXIgY2xpZW50ID0gbmV3IFNlcnZpY2VDbGllbnQodHJhbnNwb3J0LCBwcm90b2NvbFdyYXBwZXIpOworICB2YXIgc2VsZiA9IHRoaXM7CisgIGNsaWVudC5uZXdfc2VxaWQgPSBmdW5jdGlvbigpIHsKKyAgICBzZWxmLnNlcWlkICs9IDE7CisgICAgcmV0dXJuIHNlbGYuc2VxaWQ7CisgIH07CiAKLSAgICByZXR1cm4gY2xpZW50OworICBpZiAodHlwZW9mIGNvbm5lY3Rpb24uY2xpZW50ICE9PSAnb2JqZWN0JykgeworICAgIGNvbm5lY3Rpb24uY2xpZW50ID0ge307CisgIH0KKyAgY29ubmVjdGlvbi5jbGllbnRbc2VydmljZU5hbWVdID0gY2xpZW50OworCisgIHJldHVybiBjbGllbnQ7CiB9OwpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9saWIvdGhyaWZ0L3Byb3RvY29sLmpzIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L3Byb3RvY29sLmpzCmluZGV4IGM4ZThhNGUuLmE3MGViZTIgMTAwNjQ0Ci0tLSBhL2xpYi9ub2RlanMvbGliL3RocmlmdC9wcm90b2NvbC5qcworKysgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvcHJvdG9jb2wuanMKQEAgLTE2LDE2MjYgKzE2LDcgQEAKICAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCi12YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKSwKLSAgICBUaHJpZnQgPSByZXF1aXJlKCcuL3RocmlmdCcpLAotICAgIFR5cGUgPSBUaHJpZnQuVHlwZTsKIAotdmFyIGJpbmFyeSA9IHJlcXVpcmUoJy4vYmluYXJ5JyksCi0gICAgSW50NjQgPSByZXF1aXJlKCdub2RlLWludDY0Jyk7Ci0KLXZhciBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IgPSByZXF1aXJlKCcuL3RyYW5zcG9ydCcpLklucHV0QnVmZmVyVW5kZXJydW5FcnJvcjsKLQotLy8KLS8vIEJJTkFSWSBQUk9UT0NPTAotLy8KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLS8vIEphdmFTY3JpcHQgc3VwcG9ydHMgb25seSBudW1lcmljIGRvdWJsZXMsIHRoZXJlZm9yZSBldmVuIGhleCB2YWx1ZXMgYXJlIGFsd2F5cyBzaWduZWQuCi0vLyBUaGUgbGFyZ2VzdCBpbnRlZ2VyIHZhbHVlIHdoaWNoIGNhbiBiZSByZXByZXNlbnRlZCBpbiBKYXZhU2NyaXB0IGlzICsvLTJeNTMuCi0vLyBCaXR3aXNlIG9wZXJhdGlvbnMgY29udmVydCBudW1iZXJzIHRvIDMyIGJpdCBpbnRlZ2VycyBidXQgcGVyZm9ybSBzaWduIGV4dGVuc2lvbgotLy8gdXBvbiBhc3NpZ25pbmcgdmFsdWVzIGJhY2sgdG8gdmFyaWFibGVzLgotdmFyIFZFUlNJT05fTUFTSyA9IC02NTUzNiwgICAvLyAweGZmZmYwMDAwCi0gICAgVkVSU0lPTl8xID0gLTIxNDc0MTgxMTIsIC8vIDB4ODAwMTAwMDAKLSAgICBUWVBFX01BU0sgPSAweDAwMDAwMGZmOwotCi12YXIgVEJpbmFyeVByb3RvY29sID0gZXhwb3J0cy5UQmluYXJ5UHJvdG9jb2wgPSBmdW5jdGlvbih0cmFucywgc3RyaWN0UmVhZCwgc3RyaWN0V3JpdGUpIHsKLSAgdGhpcy50cmFucyA9IHRyYW5zOwotICB0aGlzLnN0cmljdFJlYWQgPSAoc3RyaWN0UmVhZCAhPT0gdW5kZWZpbmVkID8gc3RyaWN0UmVhZCA6IGZhbHNlKTsKLSAgdGhpcy5zdHJpY3RXcml0ZSA9IChzdHJpY3RXcml0ZSAhPT0gdW5kZWZpbmVkID8gc3RyaWN0V3JpdGUgOiB0cnVlKTsKLX07Ci0KLVRCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUuZmx1c2ggPSBmdW5jdGlvbigpIHsKLSAgcmV0dXJuIHRoaXMudHJhbnMuZmx1c2goKTsKLX07Ci0KLVRCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUud3JpdGVNZXNzYWdlQmVnaW4gPSBmdW5jdGlvbihuYW1lLCB0eXBlLCBzZXFpZCkgewotICAgIGlmICh0aGlzLnN0cmljdFdyaXRlKSB7Ci0gICAgICB0aGlzLndyaXRlSTMyKFZFUlNJT05fMSB8IHR5cGUpOwotICAgICAgdGhpcy53cml0ZVN0cmluZyhuYW1lKTsKLSAgICAgIHRoaXMud3JpdGVJMzIoc2VxaWQpOwotICAgIH0gZWxzZSB7Ci0gICAgICB0aGlzLndyaXRlU3RyaW5nKG5hbWUpOwotICAgICAgdGhpcy53cml0ZUJ5dGUodHlwZSk7Ci0gICAgICB0aGlzLndyaXRlSTMyKHNlcWlkKTsKLSAgICB9Ci19OwotCi1UQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLndyaXRlTWVzc2FnZUVuZCA9IGZ1bmN0aW9uKCkgewotfTsKLQotVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZVN0cnVjdEJlZ2luID0gZnVuY3Rpb24obmFtZSkgewotfTsKLQotVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZVN0cnVjdEVuZCA9IGZ1bmN0aW9uKCkgewotfTsKLQotVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZUZpZWxkQmVnaW4gPSBmdW5jdGlvbihuYW1lLCB0eXBlLCBpZCkgewotICB0aGlzLndyaXRlQnl0ZSh0eXBlKTsKLSAgdGhpcy53cml0ZUkxNihpZCk7Ci19OwotCi1UQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLndyaXRlRmllbGRFbmQgPSBmdW5jdGlvbigpIHsKLX07Ci0KLVRCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUud3JpdGVGaWVsZFN0b3AgPSBmdW5jdGlvbigpIHsKLSAgdGhpcy53cml0ZUJ5dGUoVHlwZS5TVE9QKTsKLX07Ci0KLVRCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUud3JpdGVNYXBCZWdpbiA9IGZ1bmN0aW9uKGt0eXBlLCB2dHlwZSwgc2l6ZSkgewotICB0aGlzLndyaXRlQnl0ZShrdHlwZSk7Ci0gIHRoaXMud3JpdGVCeXRlKHZ0eXBlKTsKLSAgdGhpcy53cml0ZUkzMihzaXplKTsKLX07Ci0KLVRCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUud3JpdGVNYXBFbmQgPSBmdW5jdGlvbigpIHsKLX07Ci0KLVRCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUud3JpdGVMaXN0QmVnaW4gPSBmdW5jdGlvbihldHlwZSwgc2l6ZSkgewotICB0aGlzLndyaXRlQnl0ZShldHlwZSk7Ci0gIHRoaXMud3JpdGVJMzIoc2l6ZSk7Ci19OwotCi1UQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLndyaXRlTGlzdEVuZCA9IGZ1bmN0aW9uKCkgewotfTsKLQotVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZVNldEJlZ2luID0gZnVuY3Rpb24oZXR5cGUsIHNpemUpIHsKLSAgdGhpcy53cml0ZUJ5dGUoZXR5cGUpOwotICB0aGlzLndyaXRlSTMyKHNpemUpOwotfTsKLQotVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZVNldEVuZCA9IGZ1bmN0aW9uKCkgewotfTsKLQotVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZUJvb2wgPSBmdW5jdGlvbihib29sKSB7Ci0gIGlmIChib29sKSB7Ci0gICAgdGhpcy53cml0ZUJ5dGUoMSk7Ci0gIH0gZWxzZSB7Ci0gICAgdGhpcy53cml0ZUJ5dGUoMCk7Ci0gIH0KLX07Ci0KLVRCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUud3JpdGVCeXRlID0gZnVuY3Rpb24oYikgewotICB0aGlzLnRyYW5zLndyaXRlKG5ldyBCdWZmZXIoW2JdKSk7Ci19OwotCi1UQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLndyaXRlSTE2ID0gZnVuY3Rpb24oaTE2KSB7Ci0gIHRoaXMudHJhbnMud3JpdGUoYmluYXJ5LndyaXRlSTE2KG5ldyBCdWZmZXIoMiksIGkxNikpOwotfTsKLQotVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZUkzMiA9IGZ1bmN0aW9uKGkzMikgewotICB0aGlzLnRyYW5zLndyaXRlKGJpbmFyeS53cml0ZUkzMihuZXcgQnVmZmVyKDQpLCBpMzIpKTsKLX07Ci0KLVRCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUud3JpdGVJNjQgPSBmdW5jdGlvbihpNjQpIHsKLSAgaWYgKGk2NC5idWZmZXIpIHsKLSAgICB0aGlzLnRyYW5zLndyaXRlKGk2NC5idWZmZXIpOwotICB9IGVsc2UgewotICAgIHRoaXMudHJhbnMud3JpdGUobmV3IEludDY0KGk2NCkuYnVmZmVyKTsKLSAgfQotfTsKLQotVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZURvdWJsZSA9IGZ1bmN0aW9uKGR1YikgewotICB0aGlzLnRyYW5zLndyaXRlKGJpbmFyeS53cml0ZURvdWJsZShuZXcgQnVmZmVyKDgpLCBkdWIpKTsKLX07Ci0KLVRCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUud3JpdGVTdHJpbmcgPSBmdW5jdGlvbihhcmcpIHsKLSAgaWYgKHR5cGVvZihhcmcpID09PSAnc3RyaW5nJykgewotICAgIHRoaXMud3JpdGVJMzIoQnVmZmVyLmJ5dGVMZW5ndGgoYXJnLCAndXRmOCcpKTsKLSAgICB0aGlzLnRyYW5zLndyaXRlKGFyZywgJ3V0ZjgnKTsKLSAgfSBlbHNlIGlmIChhcmcgaW5zdGFuY2VvZiBCdWZmZXIpIHsKLSAgICB0aGlzLndyaXRlSTMyKGFyZy5sZW5ndGgpOwotICAgIHRoaXMudHJhbnMud3JpdGUoYXJnKTsKLSAgfSBlbHNlIHsKLSAgICB0aHJvdyBuZXcgRXJyb3IoJ3dyaXRlU3RyaW5nIGNhbGxlZCB3aXRob3V0IGEgc3RyaW5nL0J1ZmZlciBhcmd1bWVudDogJyArIGFyZyk7Ci0gIH0KLX07Ci0KLVRCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUud3JpdGVCaW5hcnkgPSBmdW5jdGlvbihhcmcpIHsKLSAgaWYgKHR5cGVvZihhcmcpID09PSAnc3RyaW5nJykgewotICAgIHRoaXMud3JpdGVJMzIoQnVmZmVyLmJ5dGVMZW5ndGgoYXJnLCAndXRmOCcpKTsKLSAgICB0aGlzLnRyYW5zLndyaXRlKGFyZywgJ3V0ZjgnKTsKLSAgfSBlbHNlIGlmIChhcmcgaW5zdGFuY2VvZiBCdWZmZXIpIHsKLSAgICB0aGlzLndyaXRlSTMyKGFyZy5sZW5ndGgpOwotICAgIHRoaXMudHJhbnMud3JpdGUoYXJnKTsKLSAgfSBlbHNlIHsKLSAgICB0aHJvdyBuZXcgRXJyb3IoJ3dyaXRlQmluYXJ5IGNhbGxlZCB3aXRob3V0IGEgc3RyaW5nL0J1ZmZlciBhcmd1bWVudDogJyArIGFyZyk7Ci0gIH0KLX07Ci0KLVRCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUucmVhZE1lc3NhZ2VCZWdpbiA9IGZ1bmN0aW9uKCkgewotICB2YXIgc3ogPSB0aGlzLnJlYWRJMzIoKTsKLSAgdmFyIHR5cGUsIG5hbWUsIHNlcWlkOwotCi0gIGlmIChzeiA8IDApIHsKLSAgICB2YXIgdmVyc2lvbiA9IHN6ICYgVkVSU0lPTl9NQVNLOwotICAgIGlmICh2ZXJzaW9uICE9IFZFUlNJT05fMSkgewotICAgICAgY29uc29sZS5sb2coIkJBRDogIiArIHZlcnNpb24pOwotICAgICAgdGhyb3cgbmV3IFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb24oVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvblR5cGUuQkFEX1ZFUlNJT04sICJCYWQgdmVyc2lvbiBpbiByZWFkTWVzc2FnZUJlZ2luOiAiICsgc3opOwotICAgIH0KLSAgICB0eXBlID0gc3ogJiBUWVBFX01BU0s7Ci0gICAgbmFtZSA9IHRoaXMucmVhZFN0cmluZygpOwotICAgIHNlcWlkID0gdGhpcy5yZWFkSTMyKCk7Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKHRoaXMuc3RyaWN0UmVhZCkgewotICAgICAgdGhyb3cgbmV3IFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb24oVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvblR5cGUuQkFEX1ZFUlNJT04sICJObyBwcm90b2NvbCB2ZXJzaW9uIGhlYWRlciIpOwotICAgIH0KLSAgICBuYW1lID0gdGhpcy50cmFucy5yZWFkKHN6KTsKLSAgICB0eXBlID0gdGhpcy5yZWFkQnl0ZSgpOwotICAgIHNlcWlkID0gdGhpcy5yZWFkSTMyKCk7Ci0gIH0KLSAgcmV0dXJuIHtmbmFtZTogbmFtZSwgbXR5cGU6IHR5cGUsIHJzZXFpZDogc2VxaWR9OwotfTsKLQotVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS5yZWFkTWVzc2FnZUVuZCA9IGZ1bmN0aW9uKCkgewotfTsKLQotVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS5yZWFkU3RydWN0QmVnaW4gPSBmdW5jdGlvbigpIHsKLSAgcmV0dXJuIHtmbmFtZTogJyd9OwotfTsKLQotVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS5yZWFkU3RydWN0RW5kID0gZnVuY3Rpb24oKSB7Ci19OwotCi1UQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLnJlYWRGaWVsZEJlZ2luID0gZnVuY3Rpb24oKSB7Ci0gIHZhciB0eXBlID0gdGhpcy5yZWFkQnl0ZSgpOwotICBpZiAodHlwZSA9PSBUeXBlLlNUT1ApIHsKLSAgICByZXR1cm4ge2ZuYW1lOiBudWxsLCBmdHlwZTogdHlwZSwgZmlkOiAwfTsKLSAgfQotICB2YXIgaWQgPSB0aGlzLnJlYWRJMTYoKTsKLSAgcmV0dXJuIHtmbmFtZTogbnVsbCwgZnR5cGU6IHR5cGUsIGZpZDogaWR9OwotfTsKLQotVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS5yZWFkRmllbGRFbmQgPSBmdW5jdGlvbigpIHsKLX07Ci0KLVRCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUucmVhZE1hcEJlZ2luID0gZnVuY3Rpb24oKSB7Ci0gIHZhciBrdHlwZSA9IHRoaXMucmVhZEJ5dGUoKTsKLSAgdmFyIHZ0eXBlID0gdGhpcy5yZWFkQnl0ZSgpOwotICB2YXIgc2l6ZSA9IHRoaXMucmVhZEkzMigpOwotICByZXR1cm4ge2t0eXBlOiBrdHlwZSwgdnR5cGU6IHZ0eXBlLCBzaXplOiBzaXplfTsKLX07Ci0KLVRCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUucmVhZE1hcEVuZCA9IGZ1bmN0aW9uKCkgewotfTsKLQotVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS5yZWFkTGlzdEJlZ2luID0gZnVuY3Rpb24oKSB7Ci0gIHZhciBldHlwZSA9IHRoaXMucmVhZEJ5dGUoKTsKLSAgdmFyIHNpemUgPSB0aGlzLnJlYWRJMzIoKTsKLSAgcmV0dXJuIHtldHlwZTogZXR5cGUsIHNpemU6IHNpemV9OwotfTsKLQotVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS5yZWFkTGlzdEVuZCA9IGZ1bmN0aW9uKCkgewotfTsKLQotVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS5yZWFkU2V0QmVnaW4gPSBmdW5jdGlvbigpIHsKLSAgdmFyIGV0eXBlID0gdGhpcy5yZWFkQnl0ZSgpOwotICB2YXIgc2l6ZSA9IHRoaXMucmVhZEkzMigpOwotICByZXR1cm4ge2V0eXBlOiBldHlwZSwgc2l6ZTogc2l6ZX07Ci19OwotCi1UQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLnJlYWRTZXRFbmQgPSBmdW5jdGlvbigpIHsKLX07Ci0KLVRCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUucmVhZEJvb2wgPSBmdW5jdGlvbigpIHsKLSAgdmFyIGIgPSB0aGlzLnJlYWRCeXRlKCk7Ci0gIGlmIChiID09PSAwKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiB0cnVlOwotfTsKLQotVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS5yZWFkQnl0ZSA9IGZ1bmN0aW9uKCkgewotICByZXR1cm4gdGhpcy50cmFucy5yZWFkQnl0ZSgpOwotfTsKLQotVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS5yZWFkSTE2ID0gZnVuY3Rpb24oKSB7Ci0gIHJldHVybiB0aGlzLnRyYW5zLnJlYWRJMTYoKTsKLX07Ci0KLVRCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUucmVhZEkzMiA9IGZ1bmN0aW9uKCkgewotICByZXR1cm4gdGhpcy50cmFucy5yZWFkSTMyKCk7Ci19OwotCi1UQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLnJlYWRJNjQgPSBmdW5jdGlvbigpIHsKLSAgdmFyIGJ1ZmYgPSB0aGlzLnRyYW5zLnJlYWQoOCk7Ci0gIHJldHVybiBuZXcgSW50NjQoYnVmZik7Ci19OwotCi1UQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLnJlYWREb3VibGUgPSBmdW5jdGlvbigpIHsKLSAgcmV0dXJuIHRoaXMudHJhbnMucmVhZERvdWJsZSgpOwotfTsKLQotVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS5yZWFkQmluYXJ5ID0gZnVuY3Rpb24oKSB7Ci0gIHZhciBsZW4gPSB0aGlzLnJlYWRJMzIoKTsKLSAgcmV0dXJuIHRoaXMudHJhbnMucmVhZChsZW4pOwotfTsKLQotVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS5yZWFkU3RyaW5nID0gZnVuY3Rpb24oKSB7Ci0gIHZhciBsZW4gPSB0aGlzLnJlYWRJMzIoKTsKLSAgcmV0dXJuIHRoaXMudHJhbnMucmVhZFN0cmluZyhsZW4pOwotfTsKLQotVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS5nZXRUcmFuc3BvcnQgPSBmdW5jdGlvbigpIHsKLSAgcmV0dXJuIHRoaXMudHJhbnM7Ci19OwotCi1UQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLnNraXAgPSBmdW5jdGlvbih0eXBlKSB7Ci0gIHN3aXRjaCAodHlwZSkgewotICAgIGNhc2UgVHlwZS5TVE9QOgotICAgICAgcmV0dXJuOwotICAgIGNhc2UgVHlwZS5CT09MOgotICAgICAgdGhpcy5yZWFkQm9vbCgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUeXBlLkJZVEU6Ci0gICAgICB0aGlzLnJlYWRCeXRlKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFR5cGUuSTE2OgotICAgICAgdGhpcy5yZWFkSTE2KCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFR5cGUuSTMyOgotICAgICAgdGhpcy5yZWFkSTMyKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFR5cGUuSTY0OgotICAgICAgdGhpcy5yZWFkSTY0KCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFR5cGUuRE9VQkxFOgotICAgICAgdGhpcy5yZWFkRG91YmxlKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFR5cGUuU1RSSU5HOgotICAgICAgdGhpcy5yZWFkU3RyaW5nKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFR5cGUuU1RSVUNUOgotICAgICAgdGhpcy5yZWFkU3RydWN0QmVnaW4oKTsKLSAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIHZhciByID0gdGhpcy5yZWFkRmllbGRCZWdpbigpOwotICAgICAgICBpZiAoci5mdHlwZSA9PT0gVHlwZS5TVE9QKSB7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5za2lwKHIuZnR5cGUpOwotICAgICAgICB0aGlzLnJlYWRGaWVsZEVuZCgpOwotICAgICAgfQotICAgICAgdGhpcy5yZWFkU3RydWN0RW5kKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFR5cGUuTUFQOgotICAgICAgdmFyIG1hcEJlZ2luID0gdGhpcy5yZWFkTWFwQmVnaW4oKTsKLSAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWFwQmVnaW4uc2l6ZTsgKytpKSB7Ci0gICAgICAgIHRoaXMuc2tpcChtYXBCZWdpbi5rdHlwZSk7Ci0gICAgICAgIHRoaXMuc2tpcChtYXBCZWdpbi52dHlwZSk7Ci0gICAgICB9Ci0gICAgICB0aGlzLnJlYWRNYXBFbmQoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVHlwZS5TRVQ6Ci0gICAgICB2YXIgc2V0QmVnaW4gPSB0aGlzLnJlYWRTZXRCZWdpbigpOwotICAgICAgZm9yICh2YXIgaTIgPSAwOyBpMiA8IHNldEJlZ2luLnNpemU7ICsraTIpIHsKLSAgICAgICAgdGhpcy5za2lwKHNldEJlZ2luLmV0eXBlKTsKLSAgICAgIH0KLSAgICAgIHRoaXMucmVhZFNldEVuZCgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUeXBlLkxJU1Q6Ci0gICAgICB2YXIgbGlzdEJlZ2luID0gdGhpcy5yZWFkTGlzdEJlZ2luKCk7Ci0gICAgICBmb3IgKHZhciBpMyA9IDA7IGkzIDwgbGlzdEJlZ2luLnNpemU7ICsraTMpIHsKLSAgICAgICAgdGhpcy5za2lwKGxpc3RCZWdpbi5ldHlwZSk7Ci0gICAgICB9Ci0gICAgICB0aGlzLnJlYWRMaXN0RW5kKCk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgdGhyb3cgbmV3ICBFcnJvcigiSW52YWxpZCB0eXBlOiAiICsgdHlwZSk7Ci0gIH0KLX07Ci0KLQotLy8KLS8vIENPTVBBQ1QgUFJPVE9DT0wKLS8vCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0vKioKLSAqIENvbnN0cnVjdG9yIEZ1bmN0aW9uIGZvciB0aGUgQ29tcGFjdCBQcm90b2NvbC4KLSAqIEBjb25zdHJ1Y3RvcgotICogQHBhcmFtIHtvYmplY3R9IFt0cmFuc10gLSBUaGUgdW5kZXJseWluZyB0cmFuc3BvcnQgdG8gcmVhZC93cml0ZS4KLSAqIEBjbGFzc2Rlc2MgVGhlIEFwYWNoZSBUaHJpZnQgUHJvdG9jb2wgbGF5ZXIgcGVyZm9ybXMgc2VyaWFsaXphdGlvbgotICogICAgIG9mIGJhc2UgdHlwZXMsIHRoZSBjb21wYWN0IHByb3RvY29sIHNlcmlhbGl6ZXMgZGF0YSBpbiBiaW5hcnkgCi0gKiAgICAgZm9ybSB3aXRoIG1pbmltYWwgc3BhY2UgdXNlZCBmb3Igc2NhbGFyIHZhbHVlcy4KLSAqLwotdmFyIFRDb21wYWN0UHJvdG9jb2wgPSBleHBvcnRzLlRDb21wYWN0UHJvdG9jb2wgPSBmdW5jdGlvbih0cmFucykgewotICB0aGlzLnRyYW5zID0gdHJhbnM7Ci0gIHRoaXMubGFzdEZpZWxkXyA9IFtdOwotICB0aGlzLmxhc3RGaWVsZElkXyA9IDA7Ci0gIHRoaXMuc3RyaW5nX2xpbWl0XyA9IDA7Ci0gIHRoaXMuc3RyaW5nX2J1Zl8gPSBudWxsOwotICB0aGlzLnN0cmluZ19idWZfc2l6ZV8gPSAwOwotICB0aGlzLmNvbnRhaW5lcl9saW1pdF8gPSAwOwotICB0aGlzLmJvb2xlYW5GaWVsZF8gPSB7Ci0gICAgbmFtZTogbnVsbCwKLSAgICBoYXNCb29sVmFsdWU6IGZhbHNlCi0gIH07Ci0gIHRoaXMuYm9vbFZhbHVlXyA9IHsKLSAgICBoYXNCb29sVmFsdWU6IGZhbHNlLAotICAgIGJvb2xWYWx1ZTogZmFsc2UKLSAgfTsKLX07Ci0KLQotLy8KLS8vIENvbXBhY3QgUHJvdG9jb2wgQ29uc3RhbnRzCi0vLwotCi0vKioKLSAgKiBDb21wYWN0IFByb3RvY29sIElEIG51bWJlci4KLSAgKiBAcmVhZG9ubHkKLSAgKiBAY29uc3Qge251bWJlcn0gUFJPVE9DT0xfSUQKLSAgKi8KLVRDb21wYWN0UHJvdG9jb2wuUFJPVE9DT0xfSUQgPSAtMTI2OyAgLy8xMDAwIDAwMTAKLQotLyoqCi0gICogQ29tcGFjdCBQcm90b2NvbCB2ZXJzaW9uIG51bWJlci4KLSAgKiBAcmVhZG9ubHkKLSAgKiBAY29uc3Qge251bWJlcn0gVkVSU0lPTl9OCi0gICovCi1UQ29tcGFjdFByb3RvY29sLlZFUlNJT05fTiA9IDE7Ci0KLS8qKgotICAqIENvbXBhY3QgUHJvdG9jb2wgdmVyc2lvbiBtYXNrIGZvciBjb21iaW5pbmcgcHJvdG9jb2wgdmVyc2lvbiBhbmQgbWVzc2FnZSB0eXBlIGluIG9uZSBieXRlLgotICAqIEByZWFkb25seQotICAqIEBjb25zdCB7bnVtYmVyfSBWRVJTSU9OX01BU0sKLSAgKi8KLVRDb21wYWN0UHJvdG9jb2wuVkVSU0lPTl9NQVNLID0gMHgxZjsgLy8wMDAxIDExMTEKLQotLyoqCi0gICogQ29tcGFjdCBQcm90b2NvbCBtZXNzYWdlIHR5cGUgbWFzayBmb3IgY29tYmluaW5nIHByb3RvY29sIHZlcnNpb24gYW5kIG1lc3NhZ2UgdHlwZSBpbiBvbmUgYnl0ZS4KLSAgKiBAcmVhZG9ubHkKLSAgKiBAY29uc3Qge251bWJlcn0gVFlQRV9NQVNLCi0gICovCi1UQ29tcGFjdFByb3RvY29sLlRZUEVfTUFTSyA9IC0zMjsgICAgIC8vMTExMCAwMDAwCi0KLS8qKgotICAqIENvbXBhY3QgUHJvdG9jb2wgbWVzc2FnZSB0eXBlIGJpdHMgZm9yIGVuc3VyaW5nIG1lc3NhZ2UgdHlwZSBiaXQgc2l6ZS4KLSAgKiBAcmVhZG9ubHkKLSAgKiBAY29uc3Qge251bWJlcn0gVFlQRV9CSVRTCi0gICovCi1UQ29tcGFjdFByb3RvY29sLlRZUEVfQklUUyA9IDc7IC8vMDAwMCAwMTExCi0KLS8qKgotICAqIENvbXBhY3QgUHJvdG9jb2wgbWVzc2FnZSB0eXBlIHNoaWZ0IGFtb3VudCBmb3IgY29tYmluaW5nIHByb3RvY29sIHZlcnNpb24gYW5kIG1lc3NhZ2UgdHlwZSBpbiBvbmUgYnl0ZS4KLSAgKiBAcmVhZG9ubHkKLSAgKiBAY29uc3Qge251bWJlcn0gVFlQRV9TSElGVF9BTU9VTlQKLSAgKi8KLVRDb21wYWN0UHJvdG9jb2wuVFlQRV9TSElGVF9BTU9VTlQgPSA1OwotCi0vKioKLSAqIENvbXBhY3QgUHJvdG9jb2wgdHlwZSBJRHMgdXNlZCB0byBrZWVwIHR5cGUgZGF0YSB3aXRoaW4gb25lIG5pYmJsZS4KLSAqIEByZWFkb25seQotICogQHByb3BlcnR5IHtudW1iZXJ9ICBDVF9TVE9QICAgICAgICAgIC0gRW5kIG9mIGEgc2V0IG9mIGZpZWxkcy4KLSAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgQ1RfQk9PTEVBTl9UUlVFICAtIEZsYWcgZm9yIEJvb2xlYW4gZmllbGQgd2l0aCB0cnVlIHZhbHVlIChwYWNrZWQgZmllbGQgYW5kIHZhbHVlKS4KLSAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgQ1RfQk9PTEVBTl9GQUxTRSAtIEZsYWcgZm9yIEJvb2xlYW4gZmllbGQgd2l0aCBmYWxzZSB2YWx1ZSAocGFja2VkIGZpZWxkIGFuZCB2YWx1ZSkuCi0gKiBAcHJvcGVydHkge251bWJlcn0gIENUX0JZVEUgICAgICAgICAgLSBTaWduZWQgOCBiaXQgaW50ZWdlci4KLSAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgQ1RfSTE2ICAgICAgICAgICAtIFNpZ25lZCAxNiBiaXQgaW50ZWdlci4KLSAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgQ1RfSTMyICAgICAgICAgICAtIFNpZ25lZCAzMiBiaXQgaW50ZWdlci4KLSAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgQ1RfSTY0ICAgICAgICAgICAtIFNpZ25lZCA2NCBiaXQgaW50ZWdlciAoMl41MyBtYXggaW4gSmF2YVNjcmlwdCkuCi0gKiBAcHJvcGVydHkge251bWJlcn0gIENUX0RPVUJMRSAgICAgICAgLSA2NCBiaXQgSUVFRSA4NTQgZmxvYXRpbmcgcG9pbnQuCi0gKiBAcHJvcGVydHkge251bWJlcn0gIENUX0JJTkFSWSAgICAgICAgLSBBcnJheSBvZiBieXRlcyAodXNlZCBmb3Igc3RyaW5ncyBhbHNvKS4KLSAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgQ1RfTElTVCAgICAgICAgICAtIEEgY29sbGVjdGlvbiB0eXBlICh1bm9yZGVyZWQpLgotICogQHByb3BlcnR5IHtudW1iZXJ9ICBDVF9TRVQgICAgICAgICAgIC0gQSBjb2xsZWN0aW9uIHR5cGUgKHVub3JkZXJlZCBhbmQgd2l0aG91dCByZXBlYXRlZCB2YWx1ZXMpLgotICogQHByb3BlcnR5IHtudW1iZXJ9ICBDVF9NQVAgICAgICAgICAgIC0gQSBjb2xsZWN0aW9uIHR5cGUgKG1hcC9hc3NvY2lhdGl2ZS1hcnJheS9kaWN0aW9uYXJ5KS4KLSAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgQ1RfU1RSVUNUICAgICAgICAtIEEgbXVsdGlmaWVsZCB0eXBlLgotICovCi1UQ29tcGFjdFByb3RvY29sLlR5cGVzID0gewotICBDVF9TVE9QOiAgICAgICAgICAgMHgwMCwKLSAgQ1RfQk9PTEVBTl9UUlVFOiAgIDB4MDEsCi0gIENUX0JPT0xFQU5fRkFMU0U6ICAweDAyLAotICBDVF9CWVRFOiAgICAgICAgICAgMHgwMywKLSAgQ1RfSTE2OiAgICAgICAgICAgIDB4MDQsCi0gIENUX0kzMjogICAgICAgICAgICAweDA1LAotICBDVF9JNjQ6ICAgICAgICAgICAgMHgwNiwKLSAgQ1RfRE9VQkxFOiAgICAgICAgIDB4MDcsCi0gIENUX0JJTkFSWTogICAgICAgICAweDA4LAotICBDVF9MSVNUOiAgICAgICAgICAgMHgwOSwKLSAgQ1RfU0VUOiAgICAgICAgICAgIDB4MEEsCi0gIENUX01BUDogICAgICAgICAgICAweDBCLAotICBDVF9TVFJVQ1Q6ICAgICAgICAgMHgwQwotfTsKLQotLyoqCi0gKiBBcnJheSBtYXBwaW5nIENvbXBhY3QgdHlwZSBJRHMgdG8gc3RhbmRhcmQgVGhyaWZ0IHR5cGUgSURzLgotICogQHJlYWRvbmx5Ci0gKi8KLVRDb21wYWN0UHJvdG9jb2wuVFR5cGVUb0NUeXBlID0gWwotICBUQ29tcGFjdFByb3RvY29sLlR5cGVzLkNUX1NUT1AsICAgICAgICAgLy8gVF9TVE9QCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1bnVzZWQKLSAgVENvbXBhY3RQcm90b2NvbC5UeXBlcy5DVF9CT09MRUFOX1RSVUUsIC8vIFRfQk9PTAotICBUQ29tcGFjdFByb3RvY29sLlR5cGVzLkNUX0JZVEUsICAgICAgICAgLy8gVF9CWVRFCi0gIFRDb21wYWN0UHJvdG9jb2wuVHlwZXMuQ1RfRE9VQkxFLCAgICAgICAvLyBUX0RPVUJMRQotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdW51c2VkCi0gIFRDb21wYWN0UHJvdG9jb2wuVHlwZXMuQ1RfSTE2LCAgICAgICAgICAvLyBUX0kxNgotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdW51c2VkCi0gIFRDb21wYWN0UHJvdG9jb2wuVHlwZXMuQ1RfSTMyLCAgICAgICAgICAvLyBUX0kzMgotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdW51c2VkCi0gIFRDb21wYWN0UHJvdG9jb2wuVHlwZXMuQ1RfSTY0LCAgICAgICAgICAvLyBUX0k2NAotICBUQ29tcGFjdFByb3RvY29sLlR5cGVzLkNUX0JJTkFSWSwgICAgICAgLy8gVF9TVFJJTkcKLSAgVENvbXBhY3RQcm90b2NvbC5UeXBlcy5DVF9TVFJVQ1QsICAgICAgIC8vIFRfU1RSVUNUCi0gIFRDb21wYWN0UHJvdG9jb2wuVHlwZXMuQ1RfTUFQLCAgICAgICAgICAvLyBUX01BUAotICBUQ29tcGFjdFByb3RvY29sLlR5cGVzLkNUX1NFVCwgICAgICAgICAgLy8gVF9TRVQKLSAgVENvbXBhY3RQcm90b2NvbC5UeXBlcy5DVF9MSVNULCAgICAgICAgIC8vIFRfTElTVAotXTsKLQotCi0vLwotLy8gQ29tcGFjdCBQcm90b2NvbCBVdGlsaXRpZXMKLS8vCi0KLS8qKgotICogUmV0dXJucyB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQgbGF5ZXIuCi0gKiBAcmV0dXJuIHtvYmplY3R9IFRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCBsYXllci4KLSAqL1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLmdldFRyYW5zcG9ydCA9IGZ1bmN0aW9uKCkgewotICByZXR1cm4gdGhpcy50cmFuczsKLX07Ci0KLS8qKgotICogTG9va3VwIGEgQ29tcGFjdCBQcm90b2NvbCBUeXBlIHZhbHVlIGZvciBhIGdpdmVuIFRocmlmdCBUeXBlIHZhbHVlLgotICogTi5CLiBVc2VkIG9ubHkgaW50ZXJuYWxseS4KLSAqIEBwYXJhbSB7bnVtYmVyfSB0dHlwZSAtIFRocmlmdCB0eXBlIHZhbHVlCi0gKiBAcmV0dXJucyB7bnVtYmVyfSBDb21wYWN0IHByb3RvY29sIHR5cGUgdmFsdWUKLSAqLwotVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUuZ2V0Q29tcGFjdFR5cGUgPSBmdW5jdGlvbih0dHlwZSkgewotICByZXR1cm4gVENvbXBhY3RQcm90b2NvbC5UVHlwZVRvQ1R5cGVbdHR5cGVdOwotfTsKLQotLyoqCi0gKiBMb29rdXAgYSBUaHJpZnQgVHlwZSB2YWx1ZSBmb3IgYSBnaXZlbiBDb21wYWN0IFByb3RvY29sIFR5cGUgdmFsdWUuCi0gKiBOLkIuIFVzZWQgb25seSBpbnRlcm5hbGx5LgotICogQHBhcmFtIHtudW1iZXJ9IHR5cGUgLSBDb21wYWN0IFByb3RvY29sIHR5cGUgdmFsdWUKLSAqIEByZXR1cm5zIHtudW1iZXJ9IFRocmlmdCBUeXBlIHZhbHVlCi0gKi8KLVRDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLmdldFRUeXBlID0gZnVuY3Rpb24odHlwZSkgewotICBzd2l0Y2ggKHR5cGUpIHsKLSAgICBjYXNlIFR5cGUuU1RPUDoKLSAgICAgIHJldHVybiBUeXBlLlNUT1A7Ci0gICAgY2FzZSBUQ29tcGFjdFByb3RvY29sLlR5cGVzLkNUX0JPT0xFQU5fRkFMU0U6Ci0gICAgY2FzZSBUQ29tcGFjdFByb3RvY29sLlR5cGVzLkNUX0JPT0xFQU5fVFJVRToKLSAgICAgIHJldHVybiBUeXBlLkJPT0w7Ci0gICAgY2FzZSBUQ29tcGFjdFByb3RvY29sLlR5cGVzLkNUX0JZVEU6Ci0gICAgICByZXR1cm4gVHlwZS5CWVRFOwotICAgIGNhc2UgVENvbXBhY3RQcm90b2NvbC5UeXBlcy5DVF9JMTY6Ci0gICAgICByZXR1cm4gVHlwZS5JMTY7Ci0gICAgY2FzZSBUQ29tcGFjdFByb3RvY29sLlR5cGVzLkNUX0kzMjoKLSAgICAgIHJldHVybiBUeXBlLkkzMjsKLSAgICBjYXNlIFRDb21wYWN0UHJvdG9jb2wuVHlwZXMuQ1RfSTY0OgotICAgICAgcmV0dXJuIFR5cGUuSTY0OwotICAgIGNhc2UgVENvbXBhY3RQcm90b2NvbC5UeXBlcy5DVF9ET1VCTEU6Ci0gICAgICByZXR1cm4gVHlwZS5ET1VCTEU7Ci0gICAgY2FzZSBUQ29tcGFjdFByb3RvY29sLlR5cGVzLkNUX0JJTkFSWToKLSAgICAgIHJldHVybiBUeXBlLlNUUklORzsKLSAgICBjYXNlIFRDb21wYWN0UHJvdG9jb2wuVHlwZXMuQ1RfTElTVDoKLSAgICAgIHJldHVybiBUeXBlLkxJU1Q7Ci0gICAgY2FzZSBUQ29tcGFjdFByb3RvY29sLlR5cGVzLkNUX1NFVDoKLSAgICAgIHJldHVybiBUeXBlLlNFVDsKLSAgICBjYXNlIFRDb21wYWN0UHJvdG9jb2wuVHlwZXMuQ1RfTUFQOgotICAgICAgcmV0dXJuIFR5cGUuTUFQOwotICAgIGNhc2UgVENvbXBhY3RQcm90b2NvbC5UeXBlcy5DVF9TVFJVQ1Q6Ci0gICAgICByZXR1cm4gVHlwZS5TVFJVQ1Q7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHRocm93IG5ldyBUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uKFRoaWZ0LlRQcm90b2NvbEV4Y2VwdGlvblR5cGUuSU5WQUxJRF9EQVRBLCAiVW5rbm93biB0eXBlOiAiICsgdHlwZSk7Ci0gIH0KLSAgcmV0dXJuIFR5cGUuU1RPUDsKLX07Ci0KLQotLy8KLS8vIENvbXBhY3QgUHJvdG9jb2wgd3JpdGUgb3BlcmF0aW9ucwotLy8KLQotLyoqCi0gKiBTZW5kIGFueSBidWZmZXJlZCBieXRlcyB0byB0aGUgZW5kIHBvaW50LgotICovCi1UQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS5mbHVzaCA9IGZ1bmN0aW9uKCkgewotICByZXR1cm4gdGhpcy50cmFucy5mbHVzaCgpOwotfTsKLQotLyoqCi0gKiBXcml0ZXMgYW4gUlBDIG1lc3NhZ2UgaGVhZGVyCi0gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBtZXRob2QgbmFtZSBmb3IgdGhlIG1lc3NhZ2UuCi0gKiBAcGFyYW0ge251bWJlcn0gdHlwZSAtIFRoZSB0eXBlIG9mIG1lc3NhZ2UgKENBTEwsIFJFUExZLCBFWENFUFRJT04sIE9ORVdBWSkuCi0gKiBAcGFyYW0ge251bWJlcn0gc2VxaWQgLSBUaGUgY2FsbCBzZXF1ZW5jZSBudW1iZXIgKGlmIGFueSkuCi0gKi8KLVRDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLndyaXRlTWVzc2FnZUJlZ2luID0gZnVuY3Rpb24obmFtZSwgdHlwZSwgc2VxaWQpIHsKLSAgdGhpcy53cml0ZUJ5dGUoVENvbXBhY3RQcm90b2NvbC5QUk9UT0NPTF9JRCk7Ci0gIHRoaXMud3JpdGVCeXRlKChUQ29tcGFjdFByb3RvY29sLlZFUlNJT05fTiAmIFRDb21wYWN0UHJvdG9jb2wuVkVSU0lPTl9NQVNLKSB8IAotICAgICAgICAgICAgICAgICAgICAgKCh0eXBlIDw8IFRDb21wYWN0UHJvdG9jb2wuVFlQRV9TSElGVF9BTU9VTlQpICYgVENvbXBhY3RQcm90b2NvbC5UWVBFX01BU0spKTsKLSAgdGhpcy53cml0ZVZhcmludDMyKHNlcWlkKTsKLSAgdGhpcy53cml0ZVN0cmluZyhuYW1lKTsKLX07Ci0KLVRDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLndyaXRlTWVzc2FnZUVuZCA9IGZ1bmN0aW9uKCkgewotfTsKLQotVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUud3JpdGVTdHJ1Y3RCZWdpbiA9IGZ1bmN0aW9uKG5hbWUpIHsKLSAgdGhpcy5sYXN0RmllbGRfLnB1c2godGhpcy5sYXN0RmllbGRJZF8pOwotICB0aGlzLmxhc3RGaWVsZElkXyA9IDA7Ci19OwotCi1UQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS53cml0ZVN0cnVjdEVuZCA9IGZ1bmN0aW9uKCkgewotICB0aGlzLmxhc3RGaWVsZElkXyA9IHRoaXMubGFzdEZpZWxkXy5wb3AoKTsKLX07Ci0KLS8qKgotICogV3JpdGVzIGEgc3RydWN0IGZpZWxkIGhlYWRlcgotICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgZmllbGQgbmFtZSAobm90IHdyaXR0ZW4gd2l0aCB0aGUgY29tcGFjdCBwcm90b2NvbCkuCi0gKiBAcGFyYW0ge251bWJlcn0gdHlwZSAtIFRoZSBmaWVsZCBkYXRhIHR5cGUgKGEgbm9ybWFsIFRocmlmdCBmaWVsZCBUeXBlKS4KLSAqIEBwYXJhbSB7bnVtYmVyfSBpZCAtIFRoZSBJREwgZmllbGQgSWQuCi0gKi8KLVRDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLndyaXRlRmllbGRCZWdpbiA9IGZ1bmN0aW9uKG5hbWUsIHR5cGUsIGlkKSB7Ci0gIGlmICh0eXBlICE9IFR5cGUuQk9PTCkgewotICAgIHJldHVybiB0aGlzLndyaXRlRmllbGRCZWdpbkludGVybmFsKG5hbWUsIHR5cGUsIGlkLCAtMSk7Ci0gIH0KLQotICB0aGlzLmJvb2xlYW5GaWVsZF8ubmFtZSA9IG5hbWU7Ci0gIHRoaXMuYm9vbGVhbkZpZWxkXy5maWVsZFR5cGUgPSB0eXBlOwotICB0aGlzLmJvb2xlYW5GaWVsZF8uZmllbGRJZCA9IGlkOwotfTsKLQotVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUud3JpdGVGaWVsZEVuZCA9IGZ1bmN0aW9uKCkgewotfTsKLQotVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUud3JpdGVGaWVsZFN0b3AgPSBmdW5jdGlvbigpIHsKLSAgdGhpcy53cml0ZUJ5dGUoVENvbXBhY3RQcm90b2NvbC5UeXBlcy5DVF9TVE9QKTsKLX07Ci0KLS8qKgotICogV3JpdGVzIGEgbWFwIGNvbGxlY3Rpb24gaGVhZGVyCi0gKiBAcGFyYW0ge251bWJlcn0ga2V5VHlwZSAtIFRoZSBUaHJpZnQgdHlwZSBvZiB0aGUgbWFwIGtleXMuCi0gKiBAcGFyYW0ge251bWJlcn0gdmFsVHlwZSAtIFRoZSBUaHJpZnQgdHlwZSBvZiB0aGUgbWFwIHZhbHVlcy4KLSAqIEBwYXJhbSB7bnVtYmVyfSBzaXplIC0gVGhlIG51bWJlciBvZiBrL3YgcGFpcnMgaW4gdGhlIG1hcC4KLSAqLwotVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUud3JpdGVNYXBCZWdpbiA9IGZ1bmN0aW9uKGtleVR5cGUsIHZhbFR5cGUsIHNpemUpIHsKLSAgaWYgKHNpemUgPT09IDApIHsKLSAgICB0aGlzLndyaXRlQnl0ZSgwKTsKLSAgfSBlbHNlIHsKLSAgICB0aGlzLndyaXRlVmFyaW50MzIoc2l6ZSk7Ci0gICAgdGhpcy53cml0ZUJ5dGUodGhpcy5nZXRDb21wYWN0VHlwZShrZXlUeXBlKSA8PCA0IHwgdGhpcy5nZXRDb21wYWN0VHlwZSh2YWxUeXBlKSk7Ci0gIH0KLX07Ci0KLVRDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLndyaXRlTWFwRW5kID0gZnVuY3Rpb24oKSB7Ci19OwotCi0vKioKLSAqIFdyaXRlcyBhIGxpc3QgY29sbGVjdGlvbiBoZWFkZXIKLSAqIEBwYXJhbSB7bnVtYmVyfSBlbGVtVHlwZSAtIFRoZSBUaHJpZnQgdHlwZSBvZiB0aGUgbGlzdCBlbGVtZW50cy4KLSAqIEBwYXJhbSB7bnVtYmVyfSBzaXplIC0gVGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdC4KLSAqLwotVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUud3JpdGVMaXN0QmVnaW4gPSBmdW5jdGlvbihlbGVtVHlwZSwgc2l6ZSkgewotICB0aGlzLndyaXRlQ29sbGVjdGlvbkJlZ2luKGVsZW1UeXBlLCBzaXplKTsKLX07Ci0KLVRDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLndyaXRlTGlzdEVuZCA9IGZ1bmN0aW9uKCkgewotfTsKLQotLyoqCi0gKiBXcml0ZXMgYSBzZXQgY29sbGVjdGlvbiBoZWFkZXIKLSAqIEBwYXJhbSB7bnVtYmVyfSBlbGVtVHlwZSAtIFRoZSBUaHJpZnQgdHlwZSBvZiB0aGUgc2V0IGVsZW1lbnRzLgotICogQHBhcmFtIHtudW1iZXJ9IHNpemUgLSBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBzZXQuCi0gKi8KLVRDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLndyaXRlU2V0QmVnaW4gPSBmdW5jdGlvbihlbGVtVHlwZSwgc2l6ZSkgewotICB0aGlzLndyaXRlQ29sbGVjdGlvbkJlZ2luKGVsZW1UeXBlLCBzaXplKTsKLX07Ci0KLVRDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLndyaXRlU2V0RW5kID0gZnVuY3Rpb24oKSB7Ci19OwotCi1UQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS53cml0ZUJvb2wgPSBmdW5jdGlvbih2YWx1ZSkgewotICBpZiAodGhpcy5ib29sZWFuRmllbGRfLm5hbWUgIT09IG51bGwpIHsKLSAgICAvLyB3ZSBoYXZlbid0IHdyaXR0ZW4gdGhlIGZpZWxkIGhlYWRlciB5ZXQKLSAgICB0aGlzLndyaXRlRmllbGRCZWdpbkludGVybmFsKHRoaXMuYm9vbGVhbkZpZWxkXy5uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ib29sZWFuRmllbGRfLmZpZWxkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYm9vbGVhbkZpZWxkXy5maWVsZElkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZhbHVlID8gVENvbXBhY3RQcm90b2NvbC5UeXBlcy5DVF9CT09MRUFOX1RSVUUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogVENvbXBhY3RQcm90b2NvbC5UeXBlcy5DVF9CT09MRUFOX0ZBTFNFKSk7Ci0gICAgdGhpcy5ib29sZWFuRmllbGRfLm5hbWUgPSBudWxsOwotICB9IGVsc2UgewotICAgIC8vIHdlJ3JlIG5vdCBwYXJ0IG9mIGEgZmllbGQsIHNvIGp1c3Qgd3JpdGUgdGhlIHZhbHVlCi0gICAgdGhpcy53cml0ZUJ5dGUoKHZhbHVlID8gVENvbXBhY3RQcm90b2NvbC5UeXBlcy5DVF9CT09MRUFOX1RSVUUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFRDb21wYWN0UHJvdG9jb2wuVHlwZXMuQ1RfQk9PTEVBTl9GQUxTRSkpOwotICB9Ci19OwotCi1UQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS53cml0ZUJ5dGUgPSBmdW5jdGlvbihiKSB7Ci0gIHRoaXMudHJhbnMud3JpdGUobmV3IEJ1ZmZlcihbYl0pKTsKLX07Ci0KLVRDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLndyaXRlSTE2ID0gZnVuY3Rpb24oaTE2KSB7Ci0gIHRoaXMud3JpdGVWYXJpbnQzMih0aGlzLmkzMlRvWmlnemFnKGkxNikpOyAgCi19OwotCi1UQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS53cml0ZUkzMiA9IGZ1bmN0aW9uKGkzMikgewotICB0aGlzLndyaXRlVmFyaW50MzIodGhpcy5pMzJUb1ppZ3phZyhpMzIpKTsgIAotfTsKLQotVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUud3JpdGVJNjQgPSBmdW5jdGlvbihpNjQpIHsKLSAgdGhpcy53cml0ZVZhcmludDY0KHRoaXMuaTY0VG9aaWd6YWcoaTY0KSk7Ci19OwotCi1UQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS53cml0ZURvdWJsZSA9IGZ1bmN0aW9uKGR1YikgewotICB0aGlzLnRyYW5zLndyaXRlKGJpbmFyeS53cml0ZURvdWJsZShuZXcgQnVmZmVyKDgpLCBkdWIpKTsKLX07Ci0KLVRDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLndyaXRlU3RyaW5nID0gZnVuY3Rpb24oYXJnKSB7Ci0gIHRoaXMud3JpdGVCaW5hcnkoYXJnKTsKLX07Ci0KLVRDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLndyaXRlQmluYXJ5ID0gZnVuY3Rpb24oYXJnKSB7Ci0gIGlmICh0eXBlb2YgYXJnID09PSAnc3RyaW5nJykgewotICAgIHRoaXMud3JpdGVWYXJpbnQzMihCdWZmZXIuYnl0ZUxlbmd0aChhcmcsICd1dGY4JykpIDsKLSAgICB0aGlzLnRyYW5zLndyaXRlKGFyZywgJ3V0ZjgnKTsKLSAgfSBlbHNlIGlmIChhcmcgaW5zdGFuY2VvZiBCdWZmZXIpIHsKLSAgICB0aGlzLndyaXRlVmFyaW50MzIoYXJnLmxlbmd0aCk7Ci0gICAgdGhpcy50cmFucy53cml0ZShhcmcpOwotICB9IGVsc2UgewotICAgIHRocm93IG5ldyBFcnJvcignd3JpdGVTdHJpbmcvd3JpdGVCaW5hcnkgY2FsbGVkIHdpdGhvdXQgYSBzdHJpbmcvQnVmZmVyIGFyZ3VtZW50OiAnICsgYXJnKTsKLSAgfQotfTsKLQotCi0vLwotLy8gQ29tcGFjdCBQcm90b2NvbCBpbnRlcm5hbCB3cml0ZSBtZXRob2RzCi0vLwotCi1UQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS53cml0ZUZpZWxkQmVnaW5JbnRlcm5hbCA9IGZ1bmN0aW9uKG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZU92ZXJyaWRlKSB7Ci0gIC8vSWYgdGhlcmUncyBhIHR5cGUgb3ZlcnJpZGUsIHVzZSB0aGF0LgotICB2YXIgdHlwZVRvV3JpdGUgPSAodHlwZU92ZXJyaWRlID09IC0xID8gdGhpcy5nZXRDb21wYWN0VHlwZShmaWVsZFR5cGUpIDogdHlwZU92ZXJyaWRlKTsKLSAgLy9DaGVjayBpZiB3ZSBjYW4gZGVsdGEgZW5jb2RlIHRoZSBmaWVsZCBpZAotICBpZiAoZmllbGRJZCA+IHRoaXMubGFzdEZpZWxkSWRfICYmIGZpZWxkSWQgLSB0aGlzLmxhc3RGaWVsZElkXyA8PSAxNSkgewotICAgIC8vSW5jbHVkZSB0aGUgdHlwZSBkZWx0YSB3aXRoIHRoZSBmaWVsZCBJRAotICAgIHRoaXMud3JpdGVCeXRlKChmaWVsZElkIC0gdGhpcy5sYXN0RmllbGRJZF8pIDw8IDQgfCB0eXBlVG9Xcml0ZSk7Ci0gIH0gZWxzZSB7Ci0gICAgLy9Xcml0ZSBzZXBhcmF0ZSB0eXBlIGFuZCBJRCB2YWx1ZXMKLSAgICB0aGlzLndyaXRlQnl0ZSh0eXBlVG9Xcml0ZSk7Ci0gICAgdGhpcy53cml0ZUkxNihmaWVsZElkKTsKLSAgfQotICB0aGlzLmxhc3RGaWVsZElkXyA9IGZpZWxkSWQ7Ci19OwotCi1UQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS53cml0ZUNvbGxlY3Rpb25CZWdpbiA9IGZ1bmN0aW9uKGVsZW1UeXBlLCBzaXplKSB7Ci0gIGlmIChzaXplIDw9IDE0KSB7Ci0gICAgLy9Db21iaW5lIHNpemUgYW5kIHR5cGUgaW4gb25lIGJ5dGUgaWYgcG9zc2libGUKLSAgICB0aGlzLndyaXRlQnl0ZShzaXplIDw8IDQgfCB0aGlzLmdldENvbXBhY3RUeXBlKGVsZW1UeXBlKSk7Ci0gIH0gZWxzZSB7Ci0gICAgdGhpcy53cml0ZUJ5dGUoMHhmMCB8IHRoaXMuZ2V0Q29tcGFjdFR5cGUoZWxlbVR5cGUpKTsKLSAgICB0aGlzLndyaXRlVmFyaW50MzIoc2l6ZSk7Ci0gIH0KLX07Ci0KLS8qKgotICogV3JpdGUgYW4gaTMyIGFzIGEgdmFyaW50LiBSZXN1bHRzIGluIDEtNSBieXRlcyBvbiB0aGUgd2lyZS4KLSAqLwotVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUud3JpdGVWYXJpbnQzMiA9IGZ1bmN0aW9uKG4pIHsKLSAgdmFyIGJ1ZiA9IG5ldyBCdWZmZXIoNSk7Ci0gIHZhciB3c2l6ZSA9IDA7Ci0gIHdoaWxlICh0cnVlKSB7Ci0gICAgaWYgKChuICYgfjB4N0YpID09PSAwKSB7Ci0gICAgICBidWZbd3NpemUrK10gPSBuOwotICAgICAgYnJlYWs7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGJ1Zlt3c2l6ZSsrXSA9ICgobiAmIDB4N0YpIHwgMHg4MCk7Ci0gICAgICBuID0gbiA+Pj4gNzsKLSAgICB9Ci0gIH0KLSAgdmFyIHdidWYgPSBuZXcgQnVmZmVyKHdzaXplKTsKLSAgYnVmLmNvcHkod2J1ZiwwLDAsd3NpemUpOwotICB0aGlzLnRyYW5zLndyaXRlKHdidWYpOwotfTsKLQotLyoqCi0gKiBXcml0ZSBhbiBpNjQgYXMgYSB2YXJpbnQuIFJlc3VsdHMgaW4gMS0xMCBieXRlcyBvbiB0aGUgd2lyZS4KLSAqIE4uQi4gbm9kZS1pbnQ2NCBpcyBhbHdheXMgYmlnIGVuZGlhbgotICovCi1UQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS53cml0ZVZhcmludDY0ID0gZnVuY3Rpb24obikgewotICBpZiAodHlwZW9mIG4gPT09ICJudW1iZXIiKXsKLSAgICBuID0gbmV3IEludDY0KG4pOwotICB9Ci0gIGlmICghIChuIGluc3RhbmNlb2YgSW50NjQpKSB7Ci0gICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihJTlZBTElEX0RBVEEsICJFeHBlY3RlZCBJbnQ2NCBvciBOdW1iZXIsIGZvdW5kOiAiICsgbik7Ci0gIH0KLSAgCi0gIHZhciBidWYgPSBuZXcgQnVmZmVyKDEwKTsKLSAgdmFyIHdzaXplID0gMDsKLSAgdmFyIGhpID0gbi5idWZmZXIucmVhZFVJbnQzMkJFKDAsIHRydWUpOwotICB2YXIgbG8gPSBuLmJ1ZmZlci5yZWFkVUludDMyQkUoNCwgdHJ1ZSk7Ci0gIHZhciBtYXNrID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgd2hpbGUgKHRydWUpIHsKLSAgICBpZiAoKChsbyAmIH4weDdGKSA9PT0gMCkgJiYgKGhpID09PSAwKSkgewotICAgICAgYnVmW3dzaXplKytdID0gbG87Ci0gICAgICBicmVhazsKLSAgICB9IGVsc2UgewotICAgICAgYnVmW3dzaXplKytdID0gKChsbyAmIDB4N0YpIHwgMHg4MCk7Ci0gICAgICBtYXNrID0gaGkgPDwgMjU7Ci0gICAgICBsbyA9IGxvID4+PiA3OwotICAgICAgaGkgPSBoaSA+Pj4gNzsKLSAgICAgIGxvID0gbG8gfCBtYXNrOwotICAgIH0KLSAgfQotICB2YXIgd2J1ZiA9IG5ldyBCdWZmZXIod3NpemUpOwotICBidWYuY29weSh3YnVmLDAsMCx3c2l6ZSk7Ci0gIHRoaXMudHJhbnMud3JpdGUod2J1Zik7Ci19OwotCi0vKioKLSAqIENvbnZlcnQgbCBpbnRvIGEgemlnemFnIGxvbmcuIFRoaXMgYWxsb3dzIG5lZ2F0aXZlIG51bWJlcnMgdG8gYmUKLSAqIHJlcHJlc2VudGVkIGNvbXBhY3RseSBhcyBhIHZhcmludC4KLSAqLwotVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUuaTY0VG9aaWd6YWcgPSBmdW5jdGlvbihsKSB7Ci0gIGlmICh0eXBlb2YgbCA9PT0gJ3N0cmluZycpIHsKLSAgICBsID0gbmV3IEludDY0KHBhcnNlSW50KGwsIDEwKSk7Ci0gIH0gZWxzZSBpZiAodHlwZW9mIGwgPT09ICdudW1iZXInKSB7Ci0gICAgbCA9IG5ldyBJbnQ2NChsKTsKLSAgfQotICBpZiAoISAobCBpbnN0YW5jZW9mIEludDY0KSkgewotICAgIHRocm93IG5ldyBUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uKFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb25UeXBlLklOVkFMSURfREFUQSwgIkV4cGVjdGVkIEludDY0IG9yIE51bWJlciwgZm91bmQ6ICIgKyBsKTsKLSAgfQotICB2YXIgaGkgPSBsLmJ1ZmZlci5yZWFkVUludDMyQkUoMCwgdHJ1ZSk7Ci0gIHZhciBsbyA9IGwuYnVmZmVyLnJlYWRVSW50MzJCRSg0LCB0cnVlKTsKLSAgdmFyIHNpZ24gPSBoaSA+Pj4gMzE7Ci0gIGhpID0gKChoaSA8PCAxKSB8IChsbyA+Pj4gMzEpKSBeICgoISFzaWduKSA/IDB4RkZGRkZGRkYgOiAwKTsKLSAgbG8gPSAobG8gPDwgMSkgXiAoKCEhc2lnbikgPyAweEZGRkZGRkZGIDogMCk7Ci0gIHJldHVybiBuZXcgSW50NjQoaGksIGxvKTsKLX07Ci0KLS8qKgotICogQ29udmVydCBuIGludG8gYSB6aWd6YWcgaW50LiBUaGlzIGFsbG93cyBuZWdhdGl2ZSBudW1iZXJzIHRvIGJlCi0gKiByZXByZXNlbnRlZCBjb21wYWN0bHkgYXMgYSB2YXJpbnQuCi0gKi8KLVRDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLmkzMlRvWmlnemFnID0gZnVuY3Rpb24obikgewotICByZXR1cm4gKG4gPDwgMSkgXiAoKG4gJiAweDgwMDAwMDAwKSA/IDB4RkZGRkZGRkYgOiAwKTsKLX07Ci0KLQotLy8KLS8vIENvbXBhY3QgUHJvdG9jb2wgcmVhZCBvcGVyYXRpb25zCi0vLwotCi1UQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS5yZWFkTWVzc2FnZUJlZ2luID0gZnVuY3Rpb24oKSB7Ci0gIC8vUmVhZCBwcm90b2NvbCBJRAotICB2YXIgcHJvdG9jb2xJZCA9IHRoaXMudHJhbnMucmVhZEJ5dGUoKTsKLSAgaWYgKHByb3RvY29sSWQgIT0gVENvbXBhY3RQcm90b2NvbC5QUk9UT0NPTF9JRCkgewotICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oQkFEX1ZFUlNJT04sICJCYWQgcHJvdG9jb2wgaWRlbnRpZmllciAiICsgcHJvdG9jb2xJZCk7Ci0gIH0KLQotICAvL1JlYWQgVmVyc2lvbiBhbmQgVHlwZQotICB2YXIgdmVyc2lvbkFuZFR5cGUgPSB0aGlzLnRyYW5zLnJlYWRCeXRlKCk7Ci0gIHZhciB2ZXJzaW9uID0gKHZlcnNpb25BbmRUeXBlICYgVENvbXBhY3RQcm90b2NvbC5WRVJTSU9OX01BU0spOwotICBpZiAodmVyc2lvbiAhPSBUQ29tcGFjdFByb3RvY29sLlZFUlNJT05fTikgewotICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oQkFEX1ZFUlNJT04sICJCYWQgcHJvdG9jb2wgdmVyc2lvbiAiICsgdmVyc2lvbik7Ci0gIH0KLSAgdmFyIHR5cGUgPSAoKHZlcnNpb25BbmRUeXBlID4+IFRDb21wYWN0UHJvdG9jb2wuVFlQRV9TSElGVF9BTU9VTlQpICYgVENvbXBhY3RQcm90b2NvbC5UWVBFX0JJVFMpOwotCi0gIC8vUmVhZCBTZXFJZAotICB2YXIgc2VxaWQgPSB0aGlzLnJlYWRWYXJpbnQzMigpOwotICAKLSAgLy9SZWFkIG5hbWUKLSAgdmFyIG5hbWUgPSB0aGlzLnJlYWRTdHJpbmcoKTsKLQotICByZXR1cm4ge2ZuYW1lOiBuYW1lLCBtdHlwZTogdHlwZSwgcnNlcWlkOiBzZXFpZH07Ci19OwotCi1UQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS5yZWFkTWVzc2FnZUVuZCA9IGZ1bmN0aW9uKCkgewotfTsKLQotVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUucmVhZFN0cnVjdEJlZ2luID0gZnVuY3Rpb24oKSB7Ci0gIHRoaXMubGFzdEZpZWxkXy5wdXNoKHRoaXMubGFzdEZpZWxkSWRfKTsKLSAgdGhpcy5sYXN0RmllbGRJZF8gPSAwOwotICByZXR1cm4ge2ZuYW1lOiAnJ307Ci19OwotCi1UQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS5yZWFkU3RydWN0RW5kID0gZnVuY3Rpb24oKSB7Ci0gIHRoaXMubGFzdEZpZWxkSWRfID0gdGhpcy5sYXN0RmllbGRfLnBvcCgpOwotfTsKLQotVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUucmVhZEZpZWxkQmVnaW4gPSBmdW5jdGlvbigpIHsKLSAgdmFyIGZpZWxkSWQgPSAwOwotICB2YXIgYiA9IHRoaXMudHJhbnMucmVhZEJ5dGUoYik7Ci0gIHZhciB0eXBlID0gKGIgJiAweDBmKTsKLQotICBpZiAodHlwZSA9PSBUQ29tcGFjdFByb3RvY29sLlR5cGVzLkNUX1NUT1ApIHsKLSAgICByZXR1cm4ge2ZuYW1lOiBudWxsLCBmdHlwZTogVGhyaWZ0LlR5cGUuU1RPUCwgZmlkOiAwfTsKLSAgfQotCi0gIC8vTWFzayBvZmYgdGhlIDQgTVNCIG9mIHRoZSB0eXBlIGhlYWRlciB0byBjaGVjayBmb3IgZmllbGQgaWQgZGVsdGEuCi0gIHZhciBtb2RpZmllciA9ICgoYiAmIDB4MDAwMDAwZjApID4+PiA0KTsKLSAgaWYgKG1vZGlmaWVyID09PSAwKSB7Ci0gICAgLy9JZiBub3QgYSBkZWx0YSByZWFkIHRoZSBmaWVsZCBpZC4KLSAgICBmaWVsZElkID0gdGhpcy5yZWFkSTE2KCk7Ci0gIH0gZWxzZSB7Ci0gICAgLy9SZWNvdmVyIHRoZSBmaWVsZCBpZCBmcm9tIHRoZSBkZWx0YQotICAgIGZpZWxkSWQgPSAodGhpcy5sYXN0RmllbGRJZF8gKyBtb2RpZmllcik7Ci0gIH0KLSAgdmFyIGZpZWxkVHlwZSA9IHRoaXMuZ2V0VFR5cGUodHlwZSk7Ci0KLSAgLy9Cb29sZWFuIGFyZSBlbmNvZGVkIHdpdGggdGhlIHR5cGUKLSAgaWYgKHR5cGUgPT0gVENvbXBhY3RQcm90b2NvbC5UeXBlcy5DVF9CT09MRUFOX1RSVUUgfHwKLSAgICAgIHR5cGUgPT0gVENvbXBhY3RQcm90b2NvbC5UeXBlcy5DVF9CT09MRUFOX0ZBTFNFKSB7Ci0gICAgdGhpcy5ib29sVmFsdWVfLmhhc0Jvb2xWYWx1ZSA9IHRydWU7Ci0gICAgdGhpcy5ib29sVmFsdWVfLmJvb2xWYWx1ZSA9Ci0gICAgICAodHlwZSA9PSBUQ29tcGFjdFByb3RvY29sLlR5cGVzLkNUX0JPT0xFQU5fVFJVRSA/IHRydWUgOiBmYWxzZSk7Ci0gIH0KLQotICAvL1NhdmUgdGhlIG5ldyBmaWVsZCBmb3IgdGhlIG5leHQgZGVsdGEgY29tcHV0YXRpb24uCi0gIHRoaXMubGFzdEZpZWxkSWRfID0gZmllbGRJZDsKLSAgcmV0dXJuIHtmbmFtZTogbnVsbCwgZnR5cGU6IGZpZWxkVHlwZSwgZmlkOiBmaWVsZElkfTsKLX07Ci0KLVRDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLnJlYWRGaWVsZEVuZCA9IGZ1bmN0aW9uKCkgewotfTsKLQotVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUucmVhZE1hcEJlZ2luID0gZnVuY3Rpb24oKSB7Ci0gIHZhciBtc2l6ZSA9IHRoaXMucmVhZFZhcmludDMyKCk7Ci0gIGlmIChtc2l6ZSA8IDApIHsKLSAgICB0aHJvdyBuZXcgVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvbihUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uVHlwZS5ORUdBVElWRV9TSVpFLCAiTmVnYXRpdmUgbWFwIHNpemUiKTsKLSAgfQotCi0gIHZhciBrdlR5cGUgPSAwOwotICBpZiAobXNpemUgIT09IDApIHsKLSAgICBrdlR5cGUgPSB0aGlzLnRyYW5zLnJlYWRCeXRlKCk7Ci0gIH0KLQotICB2YXIga2V5VHlwZSA9IHRoaXMuZ2V0VFR5cGUoKGt2VHlwZSAmIDB4ZjApID4+PiA0KTsKLSAgdmFyIHZhbFR5cGUgPSB0aGlzLmdldFRUeXBlKGt2VHlwZSAmIDB4Zik7Ci0gIHJldHVybiB7a3R5cGU6IGtleVR5cGUsIHZ0eXBlOiB2YWxUeXBlLCBzaXplOiBtc2l6ZX07Ci19OwotCi1UQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS5yZWFkTWFwRW5kID0gZnVuY3Rpb24oKSB7Ci19OwotCi1UQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS5yZWFkTGlzdEJlZ2luID0gZnVuY3Rpb24oKSB7Ci0gIHZhciBzaXplX2FuZF90eXBlID0gdGhpcy50cmFucy5yZWFkQnl0ZSgpOwotCi0gIHZhciBsc2l6ZSA9IChzaXplX2FuZF90eXBlID4+PiA0KSAmIDB4MDAwMDAwMGY7Ci0gIGlmIChsc2l6ZSA9PSAxNSkgewotICAgIGxzaXplID0gdGhpcy5yZWFkVmFyaW50MzIoKTsKLSAgfQotCi0gIGlmIChsc2l6ZSA8IDApIHsKLSAgICB0aHJvdyBuZXcgVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvbihUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uVHlwZS5ORUdBVElWRV9TSVpFLCAiTmVnYXRpdmUgbGlzdCBzaXplIik7Ci0gIH0KLQotICB2YXIgZWxlbVR5cGUgPSB0aGlzLmdldFRUeXBlKHNpemVfYW5kX3R5cGUgJiAweDAwMDAwMDBmKTsKLQotICByZXR1cm4ge2V0eXBlOiBlbGVtVHlwZSwgc2l6ZTogbHNpemV9OwotfTsKLQotVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUucmVhZExpc3RFbmQgPSBmdW5jdGlvbigpIHsKLX07Ci0KLVRDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLnJlYWRTZXRCZWdpbiA9IGZ1bmN0aW9uKCkgewotICByZXR1cm4gdGhpcy5yZWFkTGlzdEJlZ2luKCk7Ci19OwotCi1UQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS5yZWFkU2V0RW5kID0gZnVuY3Rpb24oKSB7Ci19OwotCi1UQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS5yZWFkQm9vbCA9IGZ1bmN0aW9uKCkgewotICB2YXIgdmFsdWUgPSBmYWxzZTsKLSAgdmFyIHJzaXplID0gMDsKLSAgaWYgKHRoaXMuYm9vbFZhbHVlXy5oYXNCb29sVmFsdWUgPT09IHRydWUpIHsKLSAgICB2YWx1ZSA9IHRoaXMuYm9vbFZhbHVlXy5ib29sVmFsdWU7Ci0gICAgdGhpcy5ib29sVmFsdWVfLmhhc0Jvb2xWYWx1ZSA9IGZhbHNlOwotICB9IGVsc2UgewotICAgIHZhciByZXMgPSB0aGlzLnRyYW5zLnJlYWRCeXRlKCk7Ci0gICAgcnNpemUgPSByZXMucnNpemU7Ci0gICAgdmFsdWUgPSAocmVzLnZhbHVlID09IFRDb21wYWN0UHJvdG9jb2wuVHlwZXMuQ1RfQk9PTEVBTl9UUlVFKTsKLSAgfQotICByZXR1cm4gdmFsdWU7Ci19OwotCi1UQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS5yZWFkQnl0ZSA9IGZ1bmN0aW9uKCkgewotICByZXR1cm4gdGhpcy50cmFucy5yZWFkQnl0ZSgpOwotfTsKLQotVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUucmVhZEkxNiA9IGZ1bmN0aW9uKCkgewotICByZXR1cm4gdGhpcy5yZWFkSTMyKCk7Ci19OwotCi1UQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS5yZWFkSTMyID0gZnVuY3Rpb24oKSB7Ci0gIHJldHVybiB0aGlzLnppZ3phZ1RvSTMyKHRoaXMucmVhZFZhcmludDMyKCkpOwotfTsKLQotVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUucmVhZEk2NCA9IGZ1bmN0aW9uKCkgewotICByZXR1cm4gdGhpcy56aWd6YWdUb0k2NCh0aGlzLnJlYWRWYXJpbnQ2NCgpKTsKLX07Ci0KLVRDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLnJlYWREb3VibGUgPSBmdW5jdGlvbigpIHsKLSAgcmV0dXJuIHRoaXMudHJhbnMucmVhZERvdWJsZSgpOwotfTsKLQotVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUucmVhZEJpbmFyeSA9IGZ1bmN0aW9uKCkgewotICB2YXIgc2l6ZSA9IHRoaXMucmVhZFZhcmludDMyKCk7Ci0gIC8vIENhdGNoIGVtcHR5IHN0cmluZyBjYXNlCi0gIGlmIChzaXplID09PSAwKSB7Ci0gICAgcmV0dXJuICIiOwotICB9Ci0KLSAgLy8gQ2F0Y2ggZXJyb3IgY2FzZXMKLSAgaWYgKHNpemUgPCAwKSB7Ci0gICAgdGhyb3cgbmV3IFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb24oVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvblR5cGUuTkVHQVRJVkVfU0laRSwgIk5lZ2F0aXZlIGJpbmFyeS9zdHJpbmcgc2l6ZSIpOwotICB9Ci0gIHZhciB2YWx1ZSA9IHRoaXMudHJhbnMucmVhZFN0cmluZyhzaXplKTsKLQotICByZXR1cm4gdmFsdWU7ICAKLX07Ci0KLVRDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLnJlYWRTdHJpbmcgPSBmdW5jdGlvbigpIHsKLSAgcmV0dXJuIHRoaXMucmVhZEJpbmFyeSgpOwotfTsKLQotCi0vLwotLy8gQ29tcGFjdCBQcm90b2NvbCBpbnRlcm5hbCByZWFkIG9wZXJhdGlvbnMKLS8vCi0KLS8qKgotICogUmVhZCBhbiBpMzIgZnJvbSB0aGUgd2lyZSBhcyBhIHZhcmludC4gVGhlIE1TQiBvZiBlYWNoIGJ5dGUgaXMgc2V0Ci0gKiBpZiB0aGVyZSBpcyBhbm90aGVyIGJ5dGUgdG8gZm9sbG93LiBUaGlzIGNhbiByZWFkIHVwIHRvIDUgYnl0ZXMuCi0gKi8KLVRDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLnJlYWRWYXJpbnQzMiA9IGZ1bmN0aW9uKCkgewotICByZXR1cm4gdGhpcy5yZWFkVmFyaW50NjQoKTsKLX07Ci0KLS8qKgotICogUmVhZCBhbiBpNjQgZnJvbSB0aGUgd2lyZSBhcyBhIHByb3BlciB2YXJpbnQuIFRoZSBNU0Igb2YgZWFjaCBieXRlIGlzIHNldAotICogaWYgdGhlcmUgaXMgYW5vdGhlciBieXRlIHRvIGZvbGxvdy4gVGhpcyBjYW4gcmVhZCB1cCB0byAxMCBieXRlcy4KLSAqLwotVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUucmVhZFZhcmludDY0ID0gZnVuY3Rpb24oKSB7Ci0gIHZhciByc2l6ZSA9IDA7Ci0gIHZhciBsbyA9IDA7Ci0gIHZhciBoaSA9IDA7Ci0gIHZhciBzaGlmdCA9IDA7Ci0gIHdoaWxlICh0cnVlKSB7Ci0gICAgdmFyIGIgPSB0aGlzLnRyYW5zLnJlYWRCeXRlKCk7Ci0gICAgcnNpemUgKys7Ci0gICAgaWYgKHNoaWZ0IDw9IDI1KSB7Ci0gICAgICBsbyA9IGxvIHwgKChiICYgMHg3ZikgPDwgc2hpZnQpOwotICAgIH0gZWxzZSBpZiAoMjUgPCBzaGlmdCAmJiBzaGlmdCA8IDMyKSB7Ci0gICAgICBsbyA9IGxvIHwgKChiICYgMHg3ZikgPDwgc2hpZnQpOyAgICAgIAotICAgICAgaGkgPSBoaSB8ICgoYiAmIDB4N2YpID4+PiAoMzItc2hpZnQpKTsgICAgICAKLSAgICB9IGVsc2UgewotICAgICAgaGkgPSBoaSB8ICgoYiAmIDB4N2YpIDw8IChzaGlmdC0zMikpOwotICAgIH0KLSAgICBzaGlmdCArPSA3OwotICAgIGlmICghKGIgJiAweDgwKSkgewotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGlmIChyc2l6ZSA+PSAxMCkgewotICAgICAgdGhyb3cgbmV3IFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb24oVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvblR5cGUuSU5WQUxJRF9EQVRBLCAiVmFyaWFibGUtbGVuZ3RoIGludCBvdmVyIDEwIGJ5dGVzLiIpOwotICAgIH0KLSAgfQotICB2YXIgaTY0ID0gbmV3IEludDY0KGhpLCBsbyk7Ci0gIHJldHVybiBpNjQudG9OdW1iZXIoKTsKLX07Ci0KLS8qKgotICogQ29udmVydCBmcm9tIHppZ3phZyBpbnQgdG8gaW50LgotICovCi1UQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS56aWd6YWdUb0kzMiA9IGZ1bmN0aW9uKG4pIHsKLSAgcmV0dXJuIChuID4+PiAxKSBeICgtMSAqIChuICYgMSkpOwotfTsKLQotLyoqCi0gKiBDb252ZXJ0IGZyb20gemlnemFnIGxvbmcgdG8gbG9uZy4KLSAqLwotVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUuemlnemFnVG9JNjQgPSBmdW5jdGlvbihuKSB7Ci0gIHZhciB6eiA9IG5ldyBJbnQ2NChuKTsKLSAgdmFyIGhpID0genouYnVmZmVyLnJlYWRVSW50MzJCRSgwLCB0cnVlKTsKLSAgdmFyIGxvID0genouYnVmZmVyLnJlYWRVSW50MzJCRSg0LCB0cnVlKTsKLSAgCi0gIHZhciBuZWcgPSBuZXcgSW50NjQoaGkgJiAwLCBsbyAmIDEpOwotICBuZWcuXzJzY29tcCgpOwotICB2YXIgaGlfbmVnID0gbmVnLmJ1ZmZlci5yZWFkVUludDMyQkUoMCwgdHJ1ZSk7Ci0gIHZhciBsb19uZWcgPSBuZWcuYnVmZmVyLnJlYWRVSW50MzJCRSg0LCB0cnVlKTsKLSAgCi0gIHZhciBoaV9sbyA9IChoaSA8PCAzMSk7Ci0gIGhpID0gKGhpID4+PiAxKSBeIChoaV9uZWcpOwotICBsbyA9ICgobG8gPj4+IDEpIHwgaGlfbG8pIF4gKGxvX25lZyk7IAotICB2YXIgaTY0ID0gbmV3IEludDY0KGhpLCBsbyk7Ci0gIHJldHVybiBpNjQudG9OdW1iZXIoKTsKLX07Ci0KLVRDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLnNraXAgPSBmdW5jdGlvbih0eXBlKSB7Ci0gIHN3aXRjaCAodHlwZSkgewotICAgIGNhc2UgVHlwZS5TVE9QOgotICAgICAgcmV0dXJuOwotICAgIGNhc2UgVHlwZS5CT09MOgotICAgICAgdGhpcy5yZWFkQm9vbCgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUeXBlLkJZVEU6Ci0gICAgICB0aGlzLnJlYWRCeXRlKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFR5cGUuSTE2OgotICAgICAgdGhpcy5yZWFkSTE2KCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFR5cGUuSTMyOgotICAgICAgdGhpcy5yZWFkSTMyKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFR5cGUuSTY0OgotICAgICAgdGhpcy5yZWFkSTY0KCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFR5cGUuRE9VQkxFOgotICAgICAgdGhpcy5yZWFkRG91YmxlKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFR5cGUuU1RSSU5HOgotICAgICAgdGhpcy5yZWFkU3RyaW5nKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFR5cGUuU1RSVUNUOgotICAgICAgdGhpcy5yZWFkU3RydWN0QmVnaW4oKTsKLSAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIHZhciByID0gdGhpcy5yZWFkRmllbGRCZWdpbigpOwotICAgICAgICBpZiAoci5mdHlwZSA9PT0gVHlwZS5TVE9QKSB7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5za2lwKHIuZnR5cGUpOwotICAgICAgICB0aGlzLnJlYWRGaWVsZEVuZCgpOwotICAgICAgfQotICAgICAgdGhpcy5yZWFkU3RydWN0RW5kKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFR5cGUuTUFQOgotICAgICAgdmFyIG1hcEJlZ2luID0gdGhpcy5yZWFkTWFwQmVnaW4oKTsKLSAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWFwQmVnaW4uc2l6ZTsgKytpKSB7Ci0gICAgICAgIHRoaXMuc2tpcChtYXBCZWdpbi5rdHlwZSk7Ci0gICAgICAgIHRoaXMuc2tpcChtYXBCZWdpbi52dHlwZSk7Ci0gICAgICB9Ci0gICAgICB0aGlzLnJlYWRNYXBFbmQoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVHlwZS5TRVQ6Ci0gICAgICB2YXIgc2V0QmVnaW4gPSB0aGlzLnJlYWRTZXRCZWdpbigpOwotICAgICAgZm9yICh2YXIgaTIgPSAwOyBpMiA8IHNldEJlZ2luLnNpemU7ICsraTIpIHsKLSAgICAgICAgdGhpcy5za2lwKHNldEJlZ2luLmV0eXBlKTsKLSAgICAgIH0KLSAgICAgIHRoaXMucmVhZFNldEVuZCgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUeXBlLkxJU1Q6Ci0gICAgICB2YXIgbGlzdEJlZ2luID0gdGhpcy5yZWFkTGlzdEJlZ2luKCk7Ci0gICAgICBmb3IgKHZhciBpMyA9IDA7IGkzIDwgbGlzdEJlZ2luLnNpemU7ICsraTMpIHsKLSAgICAgICAgdGhpcy5za2lwKGxpc3RCZWdpbi5ldHlwZSk7Ci0gICAgICB9Ci0gICAgICB0aGlzLnJlYWRMaXN0RW5kKCk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgdGhyb3cgbmV3ICBFcnJvcigiSW52YWxpZCB0eXBlOiAiICsgdHlwZSk7Ci0gIH0KLX07Ci0KLQotLy8KLS8vIEpTT04gUFJPVE9DT0wKLS8vCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi12YXIgVEpTT05Qcm90b2NvbCA9IGV4cG9ydHMuVEpTT05Qcm90b2NvbCA9IGZ1bmN0aW9uKHRyYW5zKSB7Ci0gIHRoaXMudHJhbnMgPSB0cmFuczsKLX07Ci0KLVRKU09OUHJvdG9jb2wuVHlwZSA9IHt9OwotVEpTT05Qcm90b2NvbC5UeXBlW1RocmlmdC5UeXBlLkJPT0xdID0gJyJ0ZiInOwotVEpTT05Qcm90b2NvbC5UeXBlW1RocmlmdC5UeXBlLkJZVEVdID0gJyJpOCInOwotVEpTT05Qcm90b2NvbC5UeXBlW1RocmlmdC5UeXBlLkkxNl0gPSAnImkxNiInOwotVEpTT05Qcm90b2NvbC5UeXBlW1RocmlmdC5UeXBlLkkzMl0gPSAnImkzMiInOwotVEpTT05Qcm90b2NvbC5UeXBlW1RocmlmdC5UeXBlLkk2NF0gPSAnImk2NCInOwotVEpTT05Qcm90b2NvbC5UeXBlW1RocmlmdC5UeXBlLkRPVUJMRV0gPSAnImRibCInOwotVEpTT05Qcm90b2NvbC5UeXBlW1RocmlmdC5UeXBlLlNUUlVDVF0gPSAnInJlYyInOwotVEpTT05Qcm90b2NvbC5UeXBlW1RocmlmdC5UeXBlLlNUUklOR10gPSAnInN0ciInOwotVEpTT05Qcm90b2NvbC5UeXBlW1RocmlmdC5UeXBlLk1BUF0gPSAnIm1hcCInOwotVEpTT05Qcm90b2NvbC5UeXBlW1RocmlmdC5UeXBlLkxJU1RdID0gJyJsc3QiJzsKLVRKU09OUHJvdG9jb2wuVHlwZVtUaHJpZnQuVHlwZS5TRVRdID0gJyJzZXQiJzsKLQotCi1USlNPTlByb3RvY29sLlJUeXBlID0ge307Ci1USlNPTlByb3RvY29sLlJUeXBlLnRmID0gVGhyaWZ0LlR5cGUuQk9PTDsKLVRKU09OUHJvdG9jb2wuUlR5cGUuaTggPSBUaHJpZnQuVHlwZS5CWVRFOwotVEpTT05Qcm90b2NvbC5SVHlwZS5pMTYgPSBUaHJpZnQuVHlwZS5JMTY7Ci1USlNPTlByb3RvY29sLlJUeXBlLmkzMiA9IFRocmlmdC5UeXBlLkkzMjsKLVRKU09OUHJvdG9jb2wuUlR5cGUuaTY0ID0gVGhyaWZ0LlR5cGUuSTY0OwotVEpTT05Qcm90b2NvbC5SVHlwZS5kYmwgPSBUaHJpZnQuVHlwZS5ET1VCTEU7Ci1USlNPTlByb3RvY29sLlJUeXBlLnJlYyA9IFRocmlmdC5UeXBlLlNUUlVDVDsKLVRKU09OUHJvdG9jb2wuUlR5cGUuc3RyID0gVGhyaWZ0LlR5cGUuU1RSSU5HOwotVEpTT05Qcm90b2NvbC5SVHlwZS5tYXAgPSBUaHJpZnQuVHlwZS5NQVA7Ci1USlNPTlByb3RvY29sLlJUeXBlLmxzdCA9IFRocmlmdC5UeXBlLkxJU1Q7Ci1USlNPTlByb3RvY29sLlJUeXBlLnNldCA9IFRocmlmdC5UeXBlLlNFVDsKLQotVEpTT05Qcm90b2NvbC5WZXJzaW9uID0gMTsKLQotVEpTT05Qcm90b2NvbC5wcm90b3R5cGUuZmx1c2ggPSBmdW5jdGlvbigpIHsKLSAgcmV0dXJuIHRoaXMudHJhbnMuZmx1c2goKTsKLX07Ci0KLVRKU09OUHJvdG9jb2wucHJvdG90eXBlLndyaXRlTWVzc2FnZUJlZ2luID0gZnVuY3Rpb24obmFtZSwgbWVzc2FnZVR5cGUsIHNlcWlkKSB7Ci0gIHRoaXMudHN0YWNrID0gW107Ci0gIHRoaXMudHBvcyA9IFtdOwotCi0gIHRoaXMudHN0YWNrLnB1c2goW1RKU09OUHJvdG9jb2wuVmVyc2lvbiwgJyInICsgbmFtZSArICciJywgbWVzc2FnZVR5cGUsIHNlcWlkXSk7Ci19OwotCi1USlNPTlByb3RvY29sLnByb3RvdHlwZS53cml0ZU1lc3NhZ2VFbmQgPSBmdW5jdGlvbigpIHsKLSAgdmFyIG9iaiA9IHRoaXMudHN0YWNrLnBvcCgpOwotCi0gIHRoaXMud29iaiA9IHRoaXMudHN0YWNrLnBvcCgpOwotICB0aGlzLndvYmoucHVzaChvYmopOwotCi0gIHRoaXMud2J1ZiA9ICdbJyArIHRoaXMud29iai5qb2luKCcsJykgKyAnXSc7Ci0KLSAgdGhpcy50cmFucy53cml0ZSh0aGlzLndidWYpOwotfTsKLQotVEpTT05Qcm90b2NvbC5wcm90b3R5cGUud3JpdGVTdHJ1Y3RCZWdpbiA9IGZ1bmN0aW9uKG5hbWUpIHsKLSAgdGhpcy50cG9zLnB1c2godGhpcy50c3RhY2subGVuZ3RoKTsKLSAgdGhpcy50c3RhY2sucHVzaCh7fSk7Ci19OwotCi1USlNPTlByb3RvY29sLnByb3RvdHlwZS53cml0ZVN0cnVjdEVuZCA9IGZ1bmN0aW9uKCkgewotICB2YXIgcCA9IHRoaXMudHBvcy5wb3AoKTsKLSAgdmFyIHN0cnVjdCA9IHRoaXMudHN0YWNrW3BdOwotICB2YXIgc3RyID0gJ3snOwotICB2YXIgZmlyc3QgPSB0cnVlOwotICBmb3IgKHZhciBrZXkgaW4gc3RydWN0KSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICBzdHIgKz0gJywnOwotICAgIH0KLQotICAgIHN0ciArPSBrZXkgKyAnOicgKyBzdHJ1Y3Rba2V5XTsKLSAgfQotCi0gIHN0ciArPSAnfSc7Ci0gIHRoaXMudHN0YWNrW3BdID0gc3RyOwotfTsKLQotVEpTT05Qcm90b2NvbC5wcm90b3R5cGUud3JpdGVGaWVsZEJlZ2luID0gZnVuY3Rpb24obmFtZSwgZmllbGRUeXBlLCBmaWVsZElkKSB7Ci0gIHRoaXMudHBvcy5wdXNoKHRoaXMudHN0YWNrLmxlbmd0aCk7Ci0gIHRoaXMudHN0YWNrLnB1c2goeyAnZmllbGRJZCc6ICciJyArCi0gICAgZmllbGRJZCArICciJywgJ2ZpZWxkVHlwZSc6IFRKU09OUHJvdG9jb2wuVHlwZVtmaWVsZFR5cGVdCi0gIH0pOwotfTsKLQotVEpTT05Qcm90b2NvbC5wcm90b3R5cGUud3JpdGVGaWVsZEVuZCA9IGZ1bmN0aW9uKCkgewotICB2YXIgdmFsdWUgPSB0aGlzLnRzdGFjay5wb3AoKTsKLSAgdmFyIGZpZWxkSW5mbyA9IHRoaXMudHN0YWNrLnBvcCgpOwotCi0gIGlmICgnOicgKyB2YWx1ZSA9PT0gIjpbb2JqZWN0IE9iamVjdF0iKSB7Ci0gICAgdGhpcy50c3RhY2tbdGhpcy50c3RhY2subGVuZ3RoIC0gMV1bZmllbGRJbmZvLmZpZWxkSWRdID0gJ3snICsKLSAgICAgIGZpZWxkSW5mby5maWVsZFR5cGUgKyAnOicgKyBKU09OLnN0cmluZ2lmeSh2YWx1ZSkgKyAnfSc7Ci0gIH0gZWxzZSB7Ci0gICAgdGhpcy50c3RhY2tbdGhpcy50c3RhY2subGVuZ3RoIC0gMV1bZmllbGRJbmZvLmZpZWxkSWRdID0gJ3snICsKLSAgICAgIGZpZWxkSW5mby5maWVsZFR5cGUgKyAnOicgKyB2YWx1ZSArICd9JzsgICAgCi0gIH0KLSAgdGhpcy50cG9zLnBvcCgpOwotfTsKLQotVEpTT05Qcm90b2NvbC5wcm90b3R5cGUud3JpdGVGaWVsZFN0b3AgPSBmdW5jdGlvbigpIHsKLX07Ci0KLVRKU09OUHJvdG9jb2wucHJvdG90eXBlLndyaXRlTWFwQmVnaW4gPSBmdW5jdGlvbihrdHlwZSwgdnR5cGUsIHNpemUpIHsKLSAgLy9zaXplIGlzIGludmFsaWQsIHdlJ2xsIHNldCBpdCBvbiBlbmQuCi0gIHRoaXMudHBvcy5wdXNoKHRoaXMudHN0YWNrLmxlbmd0aCk7Ci0gIHRoaXMudHN0YWNrLnB1c2goW1RKU09OUHJvdG9jb2wuVHlwZVtrdHlwZV0sIFRKU09OUHJvdG9jb2wuVHlwZVt2dHlwZV0sIDBdKTsKLX07Ci0KLVRKU09OUHJvdG9jb2wucHJvdG90eXBlLndyaXRlTWFwRW5kID0gZnVuY3Rpb24oKSB7Ci0gIHZhciBwID0gdGhpcy50cG9zLnBvcCgpOwotCi0gIGlmIChwID09IHRoaXMudHN0YWNrLmxlbmd0aCkgewotICAgIHJldHVybjsKLSAgfQotCi0gIGlmICgodGhpcy50c3RhY2subGVuZ3RoIC0gcCAtIDEpICUgMiAhPT0gMCkgewotICAgIHRoaXMudHN0YWNrLnB1c2goJycpOwotICB9Ci0KLSAgdmFyIHNpemUgPSAodGhpcy50c3RhY2subGVuZ3RoIC0gcCAtIDEpIC8gMjsKLQotICB0aGlzLnRzdGFja1twXVt0aGlzLnRzdGFja1twXS5sZW5ndGggLSAxXSA9IHNpemU7Ci0KLSAgdmFyIG1hcCA9ICd9JzsKLSAgdmFyIGZpcnN0ID0gdHJ1ZTsKLSAgd2hpbGUgKHRoaXMudHN0YWNrLmxlbmd0aCA+IHAgKyAxKSB7Ci0gICAgdmFyIHYgPSB0aGlzLnRzdGFjay5wb3AoKTsKLSAgICB2YXIgayA9IHRoaXMudHN0YWNrLnBvcCgpOwotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgbWFwID0gJywnICsgbWFwOwotICAgIH0KLQotICAgIGlmICghIGlzTmFOKGspKSB7IGsgPSAnIicgKyBrICsgJyInOyB9IC8vanNvbiAia2V5cyIgbmVlZCB0byBiZSBzdHJpbmdzCi0gICAgbWFwID0gayArICc6JyArIHYgKyBtYXA7Ci0gIH0KLSAgbWFwID0gJ3snICsgbWFwOwotCi0gIHRoaXMudHN0YWNrW3BdLnB1c2gobWFwKTsKLSAgdGhpcy50c3RhY2tbcF0gPSAnWycgKyB0aGlzLnRzdGFja1twXS5qb2luKCcsJykgKyAnXSc7Ci19OwotCi1USlNPTlByb3RvY29sLnByb3RvdHlwZS53cml0ZUxpc3RCZWdpbiA9IGZ1bmN0aW9uKGV0eXBlLCBzaXplKSB7Ci0gIHRoaXMudHBvcy5wdXNoKHRoaXMudHN0YWNrLmxlbmd0aCk7Ci0gIHRoaXMudHN0YWNrLnB1c2goW1RKU09OUHJvdG9jb2wuVHlwZVtldHlwZV0sIHNpemVdKTsKLX07Ci0KLVRKU09OUHJvdG9jb2wucHJvdG90eXBlLndyaXRlTGlzdEVuZCA9IGZ1bmN0aW9uKCkgewotICB2YXIgcCA9IHRoaXMudHBvcy5wb3AoKTsKLQotICB3aGlsZSAodGhpcy50c3RhY2subGVuZ3RoID4gcCArIDEpIHsKLSAgICB2YXIgdG1wVmFsID0gdGhpcy50c3RhY2tbcCArIDFdOwotICAgIHRoaXMudHN0YWNrLnNwbGljZShwICsgMSwgMSk7Ci0gICAgdGhpcy50c3RhY2tbcF0ucHVzaCh0bXBWYWwpOwotICB9Ci0KLSAgdGhpcy50c3RhY2tbcF0gPSAnWycgKyB0aGlzLnRzdGFja1twXS5qb2luKCcsJykgKyAnXSc7Ci19OwotCi1USlNPTlByb3RvY29sLnByb3RvdHlwZS53cml0ZVNldEJlZ2luID0gZnVuY3Rpb24oZXR5cGUsIHNpemUpIHsKLSAgICB0aGlzLnRwb3MucHVzaCh0aGlzLnRzdGFjay5sZW5ndGgpOwotICAgIHRoaXMudHN0YWNrLnB1c2goW1RKU09OUHJvdG9jb2wuVHlwZVtldHlwZV0sIHNpemVdKTsKLX07Ci0KLVRKU09OUHJvdG9jb2wucHJvdG90eXBlLndyaXRlU2V0RW5kID0gZnVuY3Rpb24oKSB7Ci0gIHZhciBwID0gdGhpcy50cG9zLnBvcCgpOwotCi0gIHdoaWxlICh0aGlzLnRzdGFjay5sZW5ndGggPiBwICsgMSkgewotICAgIHZhciB0bXBWYWwgPSB0aGlzLnRzdGFja1twICsgMV07Ci0gICAgdGhpcy50c3RhY2suc3BsaWNlKHAgKyAxLCAxKTsKLSAgICB0aGlzLnRzdGFja1twXS5wdXNoKHRtcFZhbCk7Ci0gIH0KLQotICB0aGlzLnRzdGFja1twXSA9ICdbJyArIHRoaXMudHN0YWNrW3BdLmpvaW4oJywnKSArICddJzsKLX07Ci0KLVRKU09OUHJvdG9jb2wucHJvdG90eXBlLndyaXRlQm9vbCA9IGZ1bmN0aW9uKGJvb2wpIHsKLSAgdGhpcy50c3RhY2sucHVzaChib29sID8gMSA6IDApOwotfTsKLQotVEpTT05Qcm90b2NvbC5wcm90b3R5cGUud3JpdGVCeXRlID0gZnVuY3Rpb24oYnl0ZSkgewotICB0aGlzLnRzdGFjay5wdXNoKGJ5dGUpOwotfTsKLQotVEpTT05Qcm90b2NvbC5wcm90b3R5cGUud3JpdGVJMTYgPSBmdW5jdGlvbihpMTYpIHsKLSAgdGhpcy50c3RhY2sucHVzaChpMTYpOwotfTsKLQotVEpTT05Qcm90b2NvbC5wcm90b3R5cGUud3JpdGVJMzIgPSBmdW5jdGlvbihpMzIpIHsKLSAgdGhpcy50c3RhY2sucHVzaChpMzIpOwotfTsKLQotVEpTT05Qcm90b2NvbC5wcm90b3R5cGUud3JpdGVJNjQgPSBmdW5jdGlvbihpNjQpIHsKLSAgdGhpcy50c3RhY2sucHVzaChpNjQpOwotfTsKLQotVEpTT05Qcm90b2NvbC5wcm90b3R5cGUud3JpdGVEb3VibGUgPSBmdW5jdGlvbihkdWIpIHsKLSAgdGhpcy50c3RhY2sucHVzaChkdWIpOwotfTsKLQotVEpTT05Qcm90b2NvbC5wcm90b3R5cGUud3JpdGVTdHJpbmcgPSBmdW5jdGlvbihzdHIpIHsKLSAgLy8gV2UgZG8gbm90IGVuY29kZSB1cmkgY29tcG9uZW50cyBmb3Igd2lyZSB0cmFuc2ZlcjoKLSAgaWYgKHN0ciA9PT0gbnVsbCkgewotICAgICAgdGhpcy50c3RhY2sucHVzaChudWxsKTsKLSAgfSBlbHNlIHsKLSAgICAgIC8vIGNvbmNhdCBtYXkgYmUgc2xvd2VyIHRoYW4gYnVpbGRpbmcgYSBieXRlIGJ1ZmZlcgotICAgICAgdmFyIGVzY2FwZWRTdHJpbmcgPSAnJzsKLSAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgdmFyIGNoID0gc3RyLmNoYXJBdChpKTsgICAgICAvLyBhIHNpbmdsZSBkb3VibGUgcXVvdGU6ICIKLSAgICAgICAgICBpZiAoY2ggPT09ICdcIicpIHsKLSAgICAgICAgICAgICAgZXNjYXBlZFN0cmluZyArPSAnXFxcIic7IC8vIHdyaXRlIG91dCBhczogXCIKLSAgICAgICAgICB9IGVsc2UgaWYgKGNoID09PSAnXFwnKSB7ICAgIC8vIGEgc2luZ2xlIGJhY2tzbGFzaDogXAotICAgICAgICAgICAgICBlc2NhcGVkU3RyaW5nICs9ICdcXFxcJzsgLy8gd3JpdGUgb3V0IGFzOiBcXAotICAgICAgICAgIC8qIEN1cnJlbnRseSBlc2NhcGVkIGZvcndhcmQgc2xhc2hlcyBicmVhayBUSlNPTlByb3RvY29sLgotICAgICAgICAgICAqIEFzIGl0IHN0YW5kcywgd2UgY2FuIHNpbXBseSBwYXNzIGZvcndhcmQgc2xhc2hlcyBpbnRvCi0gICAgICAgICAgICogb3VyIHN0cmluZ3MgYWNyb3NzIHRoZSB3aXJlIHdpdGhvdXQgYmVpbmcgZXNjYXBlZC4KLSAgICAgICAgICAgKiBJIHRoaW5rIHRoaXMgaXMgdGhlIHByb3RvY29sJ3MgYnVnLCBub3QgdGhyaWZ0LmpzCi0gICAgICAgICAgICogfSBlbHNlIGlmKGNoID09PSAnLycpIHsgICAvLyBhIHNpbmdsZSBmb3J3YXJkIHNsYXNoOiAvCi0gICAgICAgICAgICogIGVzY2FwZWRTdHJpbmcgKz0gJ1xcLyc7ICAvLyB3cml0ZSBvdXQgYXMgXC8KLSAgICAgICAgICAgKiB9Ci0gICAgICAgICAgICovCi0gICAgICAgICAgfSBlbHNlIGlmIChjaCA9PT0gJ1xiJykgeyAgICAvLyBhIHNpbmdsZSBiYWNrc3BhY2U6IGludmlzaWJsZQotICAgICAgICAgICAgICBlc2NhcGVkU3RyaW5nICs9ICdcXGInOyAgLy8gd3JpdGUgb3V0IGFzOiBcYiIKLSAgICAgICAgICB9IGVsc2UgaWYgKGNoID09PSAnXGYnKSB7ICAgIC8vIGEgc2luZ2xlIGZvcm1mZWVkOiBpbnZpc2libGUKLSAgICAgICAgICAgICAgZXNjYXBlZFN0cmluZyArPSAnXFxmJzsgIC8vIHdyaXRlIG91dCBhczogXGYiCi0gICAgICAgICAgfSBlbHNlIGlmIChjaCA9PT0gJ1xuJykgeyAgICAvLyBhIHNpbmdsZSBuZXdsaW5lOiBpbnZpc2libGUKLSAgICAgICAgICAgICAgZXNjYXBlZFN0cmluZyArPSAnXFxuJzsgIC8vIHdyaXRlIG91dCBhczogXG4iCi0gICAgICAgICAgfSBlbHNlIGlmIChjaCA9PT0gJ1xyJykgeyAgICAvLyBhIHNpbmdsZSByZXR1cm46IGludmlzaWJsZQotICAgICAgICAgICAgICBlc2NhcGVkU3RyaW5nICs9ICdcXHInOyAgLy8gd3JpdGUgb3V0IGFzOiBcciIKLSAgICAgICAgICB9IGVsc2UgaWYgKGNoID09PSAnXHQnKSB7ICAgIC8vIGEgc2luZ2xlIHRhYjogaW52aXNpYmxlCi0gICAgICAgICAgICAgIGVzY2FwZWRTdHJpbmcgKz0gJ1xcdCc7ICAvLyB3cml0ZSBvdXQgYXM6IFx0IgotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIGVzY2FwZWRTdHJpbmcgKz0gY2g7ICAgICAvLyBFbHNlIGl0IG5lZWQgbm90IGJlIGVzY2FwZWQKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gICAgICB0aGlzLnRzdGFjay5wdXNoKCciJyArIGVzY2FwZWRTdHJpbmcgKyAnIicpOwotICB9Ci19OwotCi1USlNPTlByb3RvY29sLnByb3RvdHlwZS53cml0ZUJpbmFyeSA9IGZ1bmN0aW9uKGFyZykgewotICB0aGlzLndyaXRlU3RyaW5nKGFyZyk7Ci19OwotCi1USlNPTlByb3RvY29sLnByb3RvdHlwZS5yZWFkTWVzc2FnZUJlZ2luID0gZnVuY3Rpb24oKSB7Ci0gIHRoaXMucnN0YWNrID0gW107Ci0gIHRoaXMucnBvcyA9IFtdOwotCi0gIC8vQm9ycm93IHRoZSBpbmJvdW5kIHRyYW5zcG9ydCBidWZmZXIgYW5kIGVuc3VyZSBkYXRhIGlzIHByZXNlbnQvY29uc2lzdGVudAotICB2YXIgdHJhbnNCdWYgPSB0aGlzLnRyYW5zLmJvcnJvdygpOwotICBpZiAodHJhbnNCdWYucmVhZEluZGV4ID49IHRyYW5zQnVmLndyaXRlSW5kZXgpIHsKLSAgICB0aHJvdyBuZXcgSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yKCk7Ci0gIH0KLSAgdmFyIGN1cnNvciA9IHRyYW5zQnVmLnJlYWRJbmRleDsKLQotICBpZiAodHJhbnNCdWYuYnVmW2N1cnNvcl0gIT09IDB4NUIpIHsgLy9bCi0gICAgdGhyb3cgbmV3IEVycm9yKCJNYWxmb3JtZWQgSlNPTiBpbnB1dCwgbm8gb3BlbmluZyBicmFja2V0Iik7Ci0gIH0KLQotICAvL1BhcnNlIGEgc2luZ2xlIG1lc3NhZ2UgKHRoZXJlIG1heSBiZSBzZXZlcmFsIGluIHRoZSBidWZmZXIpCi0gIC8vICBUT0RPOiBIYW5kbGUgY2hhcmFjdGVycyB1c2luZyBtdWx0aXBsZSBjb2RlIHVuaXRzCi0gIGN1cnNvcisrOwotICB2YXIgb3BlbkJyYWNrZXRDb3VudCA9IDE7Ci0gIHZhciBpblN0cmluZyA9IGZhbHNlOwotICBmb3IgKDsgY3Vyc29yIDwgdHJhbnNCdWYud3JpdGVJbmRleDsgY3Vyc29yKyspIHsKLSAgICB2YXIgY2hyID0gdHJhbnNCdWYuYnVmW2N1cnNvcl07Ci0gICAgLy93ZSB1c2UgaGV4YSBjaGFyY29kZSBoZXJlIGJlY2F1c2UgZGF0YVtpXSByZXR1cm5zIGFuIGludCBhbmQgbm90IGEgY2hhcgotICAgIGlmIChpblN0cmluZykgewotICAgICAgaWYgKGNociA9PT0gMHgyMikgeyAvLyIKLSAgICAgICAgaW5TdHJpbmcgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSBpZiAoY2hyID09PSAweDVDKSB7IC8vXAotICAgICAgICAvL2VzY2FwZWQgY2hhcmFjdGVyLCBza2lwCi0gICAgICAgIGN1cnNvciArPSAxOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAoY2hyID09PSAweDVCKSB7IC8vWwotICAgICAgICBvcGVuQnJhY2tldENvdW50ICs9IDE7Ci0gICAgICB9IGVsc2UgaWYgKGNociA9PT0gMHg1RCkgeyAvL10KLSAgICAgICAgb3BlbkJyYWNrZXRDb3VudCAtPSAxOwotICAgICAgICBpZiAob3BlbkJyYWNrZXRDb3VudCA9PT0gMCkgewotICAgICAgICAgIC8vZW5kIG9mIGpzb24gbWVzc2FnZSBkZXRlY3RlZAotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYgKGNociA9PT0gMHgyMikgeyAvLyIKLSAgICAgICAgaW5TdHJpbmcgPSB0cnVlOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGlmIChvcGVuQnJhY2tldENvdW50ICE9PSAwKSB7Ci0gICAgdGhyb3cgbmV3IEVycm9yKCJNYWxmb3JtZWQgSlNPTiBpbnB1dCwgbWlzbWF0Y2hlZCBiYWNrZXRzIik7Ci0gIH0KLQotICAvL1JlY29uc3RpdHV0ZSB0aGUgSlNPTiBvYmplY3QgYW5kIGNvbnVtZSB0aGUgbmVjZXNzYXJ5IGJ5dGVzCi0gIHRoaXMucm9iaiA9IEpTT04ucGFyc2UodHJhbnNCdWYuYnVmLnNsaWNlKHRyYW5zQnVmLnJlYWRJbmRleCwgY3Vyc29yKzEpKTsKLSAgdGhpcy50cmFucy5jb25zdW1lKGN1cnNvciArIDEgLSB0cmFuc0J1Zi5yZWFkSW5kZXgpOwotCi0gIC8vVmVyaWZ5IHRoZSBwcm90b2NvbCB2ZXJzaW9uCi0gIHZhciB2ZXJzaW9uID0gdGhpcy5yb2JqLnNoaWZ0KCk7Ci0gIGlmICh2ZXJzaW9uICE9IFRKU09OUHJvdG9jb2wuVmVyc2lvbikgewotICAgIHRocm93ICdXcm9uZyB0aHJpZnQgcHJvdG9jb2wgdmVyc2lvbjogJyArIHZlcnNpb247Ci0gIH0KLQotICAvL09iamVjdGlmeSB0aGUgdGhyaWZ0IG1lc3NhZ2Uge25hbWUvdHlwZS9zZXF1ZW5jZS1udW1iZXJ9IGZvciByZXR1cm4gCi0gIC8vIGFuZCB0aGVuIHNhdmUgdGhlIEpTT04gb2JqZWN0IGluIHJzdGFjawotICB2YXIgciA9IHt9OwotICByLmZuYW1lID0gdGhpcy5yb2JqLnNoaWZ0KCk7Ci0gIHIubXR5cGUgPSB0aGlzLnJvYmouc2hpZnQoKTsKLSAgci5yc2VxaWQgPSB0aGlzLnJvYmouc2hpZnQoKTsKLSAgdGhpcy5yc3RhY2sucHVzaCh0aGlzLnJvYmouc2hpZnQoKSk7Ci0gIHJldHVybiByOwotfTsKLQotVEpTT05Qcm90b2NvbC5wcm90b3R5cGUucmVhZE1lc3NhZ2VFbmQgPSBmdW5jdGlvbigpIHsKLX07Ci0KLVRKU09OUHJvdG9jb2wucHJvdG90eXBlLnJlYWRTdHJ1Y3RCZWdpbiA9IGZ1bmN0aW9uKCkgewotICB2YXIgciA9IHt9OwotICByLmZuYW1lID0gJyc7Ci0KLSAgLy9pbmNhc2UgdGhpcyBpcyBhbiBhcnJheSBvZiBzdHJ1Y3RzCi0gIGlmICh0aGlzLnJzdGFja1t0aGlzLnJzdGFjay5sZW5ndGggLSAxXSBpbnN0YW5jZW9mIEFycmF5KSB7Ci0gICAgdGhpcy5yc3RhY2sucHVzaCh0aGlzLnJzdGFja1t0aGlzLnJzdGFjay5sZW5ndGggLSAxXS5zaGlmdCgpKTsKLSAgfQotCi0gIHJldHVybiByOwotfTsKLQotVEpTT05Qcm90b2NvbC5wcm90b3R5cGUucmVhZFN0cnVjdEVuZCA9IGZ1bmN0aW9uKCkgewotICB0aGlzLnJzdGFjay5wb3AoKTsKLX07Ci0KLVRKU09OUHJvdG9jb2wucHJvdG90eXBlLnJlYWRGaWVsZEJlZ2luID0gZnVuY3Rpb24oKSB7Ci0gIHZhciByID0ge307Ci0KLSAgdmFyIGZpZCA9IC0xOwotICB2YXIgZnR5cGUgPSBUaHJpZnQuVHlwZS5TVE9QOwotCi0gIC8vZ2V0IGEgZmllbGRJZAotICBmb3IgKHZhciBmIGluICh0aGlzLnJzdGFja1t0aGlzLnJzdGFjay5sZW5ndGggLSAxXSkpIHsKLSAgICBpZiAoZiA9PT0gbnVsbCkgewotICAgICAgY29udGludWU7Ci0gICAgfQotCi0gICAgZmlkID0gcGFyc2VJbnQoZiwgMTApOwotICAgIHRoaXMucnBvcy5wdXNoKHRoaXMucnN0YWNrLmxlbmd0aCk7Ci0KLSAgICB2YXIgZmllbGQgPSB0aGlzLnJzdGFja1t0aGlzLnJzdGFjay5sZW5ndGggLSAxXVtmaWRdOwotCi0gICAgLy9yZW1vdmUgc28gd2UgZG9uJ3Qgc2VlIGl0IGFnYWluCi0gICAgZGVsZXRlIHRoaXMucnN0YWNrW3RoaXMucnN0YWNrLmxlbmd0aCAtIDFdW2ZpZF07Ci0KLSAgICB0aGlzLnJzdGFjay5wdXNoKGZpZWxkKTsKLQotICAgIGJyZWFrOwotICB9Ci0KLSAgaWYgKGZpZCAhPSAtMSkgewotICAgIC8vc2hvdWxkIG9ubHkgYmUgMSBvZiB0aGVzZSBidXQgdGhpcyBpcyB0aGUgb25seQotICAgIC8vd2F5IHRvIG1hdGNoIGEga2V5Ci0gICAgZm9yICh2YXIgaSBpbiAodGhpcy5yc3RhY2tbdGhpcy5yc3RhY2subGVuZ3RoIC0gMV0pKSB7Ci0gICAgICBpZiAoVEpTT05Qcm90b2NvbC5SVHlwZVtpXSA9PT0gbnVsbCkgewotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgZnR5cGUgPSBUSlNPTlByb3RvY29sLlJUeXBlW2ldOwotICAgICAgdGhpcy5yc3RhY2tbdGhpcy5yc3RhY2subGVuZ3RoIC0gMV0gPSB0aGlzLnJzdGFja1t0aGlzLnJzdGFjay5sZW5ndGggLSAxXVtpXTsKLSAgICB9Ci0gIH0KLQotICByLmZuYW1lID0gJyc7Ci0gIHIuZnR5cGUgPSBmdHlwZTsKLSAgci5maWQgPSBmaWQ7Ci0KLSAgcmV0dXJuIHI7Ci19OwotCi1USlNPTlByb3RvY29sLnByb3RvdHlwZS5yZWFkRmllbGRFbmQgPSBmdW5jdGlvbigpIHsKLSAgdmFyIHBvcyA9IHRoaXMucnBvcy5wb3AoKTsKLQotICAvL2dldCBiYWNrIHRvIHRoZSByaWdodCBwbGFjZSBpbiB0aGUgc3RhY2sKLSAgd2hpbGUgKHRoaXMucnN0YWNrLmxlbmd0aCA+IHBvcykgewotICAgIHRoaXMucnN0YWNrLnBvcCgpOwotICB9Ci19OwotCi1USlNPTlByb3RvY29sLnByb3RvdHlwZS5yZWFkTWFwQmVnaW4gPSBmdW5jdGlvbigpIHsKLSAgdmFyIG1hcCA9IHRoaXMucnN0YWNrLnBvcCgpOwotCi0gIHZhciByID0ge307Ci0gIHIua3R5cGUgPSBUSlNPTlByb3RvY29sLlJUeXBlW21hcC5zaGlmdCgpXTsKLSAgci52dHlwZSA9IFRKU09OUHJvdG9jb2wuUlR5cGVbbWFwLnNoaWZ0KCldOwotICByLnNpemUgPSBtYXAuc2hpZnQoKTsKLQotCi0gIHRoaXMucnBvcy5wdXNoKHRoaXMucnN0YWNrLmxlbmd0aCk7Ci0gIHRoaXMucnN0YWNrLnB1c2gobWFwLnNoaWZ0KCkpOwotCi0gIHJldHVybiByOwotfTsKLQotVEpTT05Qcm90b2NvbC5wcm90b3R5cGUucmVhZE1hcEVuZCA9IGZ1bmN0aW9uKCkgewotICB0aGlzLnJlYWRGaWVsZEVuZCgpOwotfTsKLQotVEpTT05Qcm90b2NvbC5wcm90b3R5cGUucmVhZExpc3RCZWdpbiA9IGZ1bmN0aW9uKCkgewotICB2YXIgbGlzdCA9IHRoaXMucnN0YWNrW3RoaXMucnN0YWNrLmxlbmd0aCAtIDFdOwotCi0gIHZhciByID0ge307Ci0gIHIuZXR5cGUgPSBUSlNPTlByb3RvY29sLlJUeXBlW2xpc3Quc2hpZnQoKV07Ci0gIHIuc2l6ZSA9IGxpc3Quc2hpZnQoKTsKLQotICB0aGlzLnJwb3MucHVzaCh0aGlzLnJzdGFjay5sZW5ndGgpOwotICB0aGlzLnJzdGFjay5wdXNoKGxpc3QpOwotCi0gIHJldHVybiByOwotfTsKLQotVEpTT05Qcm90b2NvbC5wcm90b3R5cGUucmVhZExpc3RFbmQgPSBmdW5jdGlvbigpIHsKLSAgdGhpcy5yZWFkRmllbGRFbmQoKTsKLX07Ci0KLVRKU09OUHJvdG9jb2wucHJvdG90eXBlLnJlYWRTZXRCZWdpbiA9IGZ1bmN0aW9uKCkgewotICByZXR1cm4gdGhpcy5yZWFkTGlzdEJlZ2luKCk7Ci19OwotCi1USlNPTlByb3RvY29sLnByb3RvdHlwZS5yZWFkU2V0RW5kID0gZnVuY3Rpb24oKSB7Ci0gIHJldHVybiB0aGlzLnJlYWRMaXN0RW5kKCk7Ci19OwotCi1USlNPTlByb3RvY29sLnByb3RvdHlwZS5yZWFkQm9vbCA9IGZ1bmN0aW9uKCkgewotICB2YXIgciA9IHRoaXMucmVhZEkzMigpOwotCi0gIGlmIChyICE9PSBudWxsICYmIHIudmFsdWUgPT0gJzEnKSB7Ci0gICAgci52YWx1ZSA9IHRydWU7Ci0gIH0gZWxzZSB7Ci0gICAgci52YWx1ZSA9IGZhbHNlOwotICB9Ci0KLSAgcmV0dXJuIHI7Ci19OwotCi1USlNPTlByb3RvY29sLnByb3RvdHlwZS5yZWFkQnl0ZSA9IGZ1bmN0aW9uKCkgewotICByZXR1cm4gdGhpcy5yZWFkSTMyKCk7Ci19OwotCi1USlNPTlByb3RvY29sLnByb3RvdHlwZS5yZWFkSTE2ID0gZnVuY3Rpb24oKSB7Ci0gIHJldHVybiB0aGlzLnJlYWRJMzIoKTsKLX07Ci0KLVRKU09OUHJvdG9jb2wucHJvdG90eXBlLnJlYWRJMzIgPSBmdW5jdGlvbihmKSB7Ci0gIGlmIChmID09PSB1bmRlZmluZWQpIHsKLSAgICBmID0gdGhpcy5yc3RhY2tbdGhpcy5yc3RhY2subGVuZ3RoIC0gMV07Ci0gIH0KLQotICB2YXIgciA9IHt9OwotCi0gIGlmIChmIGluc3RhbmNlb2YgQXJyYXkpIHsKLSAgICBpZiAoZi5sZW5ndGggPT09IDApIHsKLSAgICAgIHIudmFsdWUgPSB1bmRlZmluZWQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHIudmFsdWUgPSBmLnNoaWZ0KCk7Ci0gICAgfQotICB9IGVsc2UgaWYgKGYgaW5zdGFuY2VvZiBPYmplY3QpIHsKLSAgICBmb3IgKHZhciBpIGluIGYpIHsKLSAgICAgIGlmIChpID09PSBudWxsKSB7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgdGhpcy5yc3RhY2sucHVzaChmW2ldKTsKLSAgICAgIGRlbGV0ZSBmW2ldOwotCi0gICAgICByLnZhbHVlID0gaTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICByLnZhbHVlID0gZjsKLSAgICB0aGlzLnJzdGFjay5wb3AoKTsKLSAgfQotCi0gIHJldHVybiByLnZhbHVlOwotfTsKLQotVEpTT05Qcm90b2NvbC5wcm90b3R5cGUucmVhZEk2NCA9IGZ1bmN0aW9uKCkgewotICByZXR1cm4gbmV3IEludDY0KHRoaXMucmVhZEkzMigpKTsKLX07Ci0KLVRKU09OUHJvdG9jb2wucHJvdG90eXBlLnJlYWREb3VibGUgPSBmdW5jdGlvbigpIHsKLSAgcmV0dXJuIHRoaXMucmVhZEkzMigpOwotfTsKLQotVEpTT05Qcm90b2NvbC5wcm90b3R5cGUucmVhZEJpbmFyeSA9IGZ1bmN0aW9uKCkgewotICByZXR1cm4gdGhpcy5yZWFkU3RyaW5nKCk7Ci19OwotCi1USlNPTlByb3RvY29sLnByb3RvdHlwZS5yZWFkU3RyaW5nID0gZnVuY3Rpb24oKSB7Ci0gIHZhciByID0gdGhpcy5yZWFkSTMyKCk7Ci0gIHJldHVybiByOwotfTsKLQotVEpTT05Qcm90b2NvbC5wcm90b3R5cGUuZ2V0VHJhbnNwb3J0ID0gZnVuY3Rpb24oKSB7Ci0gIHJldHVybiB0aGlzLnRyYW5zOwotfTsKLQotLy9NZXRob2QgdG8gYXJiaXRyYXJpbHkgc2tpcCBvdmVyIGRhdGEuCi1USlNPTlByb3RvY29sLnByb3RvdHlwZS5za2lwID0gZnVuY3Rpb24odHlwZSkgewotICB0aHJvdyAnc2tpcCBub3Qgc3VwcG9ydGVkIHlldCc7Ci19OwotCittb2R1bGUuZXhwb3J0cy5UQmluYXJ5UHJvdG9jb2wgPSByZXF1aXJlKCcuL2JpbmFyeV9wcm90b2NvbCcpOworbW9kdWxlLmV4cG9ydHMuVENvbXBhY3RQcm90b2NvbCA9IHJlcXVpcmUoJy4vY29tcGFjdF9wcm90b2NvbCcpOworbW9kdWxlLmV4cG9ydHMuVEpTT05Qcm90b2NvbCA9IHJlcXVpcmUoJy4vanNvbl9wcm90b2NvbCcpOwpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9saWIvdGhyaWZ0L3NlcnZlci5qcyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9zZXJ2ZXIuanMKaW5kZXggMzEzYTgwMC4uZTEyNGFjYyAxMDA2NDQKLS0tIGEvbGliL25vZGVqcy9saWIvdGhyaWZ0L3NlcnZlci5qcworKysgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvc2VydmVyLmpzCkBAIC0xNiwyOCArMTYsMzAgQEAKICAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCisKK3ZhciBjb25zdGFudHMgPSByZXF1aXJlKCdjb25zdGFudHMnKTsKIHZhciBuZXQgPSByZXF1aXJlKCduZXQnKTsKIHZhciB0bHMgPSByZXF1aXJlKCd0bHMnKTsKIAotdmFyIHR0cmFuc3BvcnQgPSByZXF1aXJlKCcuL3RyYW5zcG9ydCcpLAotICAgIFRCaW5hcnlQcm90b2NvbCA9IHJlcXVpcmUoJy4vcHJvdG9jb2wnKS5UQmluYXJ5UHJvdG9jb2w7Cit2YXIgVEJ1ZmZlcmVkVHJhbnNwb3J0ID0gcmVxdWlyZSgnLi9idWZmZXJlZF90cmFuc3BvcnQnKTsKK3ZhciBUQmluYXJ5UHJvdG9jb2wgPSByZXF1aXJlKCcuL2JpbmFyeV9wcm90b2NvbCcpOwordmFyIElucHV0QnVmZmVyVW5kZXJydW5FcnJvciA9IHJlcXVpcmUoJy4vaW5wdXRfYnVmZmVyX3VuZGVycnVuX2Vycm9yJyk7CiAKLQotLyoqIAotICogQ3JlYXRlIGEgVGhyaWZ0IHNlcnZlciB3aGljaCBjYW4gc2VydmUgb25lIG9yIG11bHRpcGxlIHNlcnZpY2VzLiAKKy8qKgorICogQ3JlYXRlIGEgVGhyaWZ0IHNlcnZlciB3aGljaCBjYW4gc2VydmUgb25lIG9yIG11bHRpcGxlIHNlcnZpY2VzLgogICogQHBhcmFtIHtvYmplY3R9IHByb2Nlc3NvciAtIEEgbm9ybWFsIG9yIG11bHRpcGxleGVkUHJvY2Vzc29yIChtdXN0CiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgcHJlY29uc3RydWN0ZWQgd2l0aCB0aGUgZGVzaXJlZCBoYW5kbGVyKS4KICAqIEBwYXJhbSB7U2VydmVyT3B0aW9uc30gb3B0aW9ucyAtIE9wdGlvbmFsIGFkZGl0aW9uYWwgc2VydmVyIGNvbmZpZ3VyYXRpb24uCi0gKiBAcmV0dXJucyB7b2JqZWN0fSAtIFRoZSBBcGFjaGUgVGhyaWZ0IE11bHRpcGxlZCBTZXJ2ZXIuCisgKiBAcmV0dXJucyB7b2JqZWN0fSAtIFRoZSBBcGFjaGUgVGhyaWZ0IE11bHRpcGxleCBTZXJ2ZXIuCiAgKi8KIGV4cG9ydHMuY3JlYXRlTXVsdGlwbGV4U2VydmVyID0gZnVuY3Rpb24ocHJvY2Vzc29yLCBvcHRpb25zKSB7Ci0gIHZhciB0cmFuc3BvcnQgPSAob3B0aW9ucyAmJiBvcHRpb25zLnRyYW5zcG9ydCkgPyBvcHRpb25zLnRyYW5zcG9ydCA6IHR0cmFuc3BvcnQuVEJ1ZmZlcmVkVHJhbnNwb3J0OworICB2YXIgdHJhbnNwb3J0ID0gKG9wdGlvbnMgJiYgb3B0aW9ucy50cmFuc3BvcnQpID8gb3B0aW9ucy50cmFuc3BvcnQgOiBUQnVmZmVyZWRUcmFuc3BvcnQ7CiAgIHZhciBwcm90b2NvbCA9IChvcHRpb25zICYmIG9wdGlvbnMucHJvdG9jb2wpID8gb3B0aW9ucy5wcm90b2NvbCA6IFRCaW5hcnlQcm90b2NvbDsKIAogICBmdW5jdGlvbiBzZXJ2ZXJJbXBsKHN0cmVhbSkgewogICAgIHZhciBzZWxmID0gdGhpczsKLSAgICBzdHJlYW0ub24oJ2Vycm9yJywgZnVuY3Rpb24oZXJyKSB7IAotICAgICAgICBzZWxmLmVtaXQoJ2Vycm9yJywgZXJyKTsgCisgICAgc3RyZWFtLm9uKCdlcnJvcicsIGZ1bmN0aW9uKGVycikgeworICAgICAgICBzZWxmLmVtaXQoJ2Vycm9yJywgZXJyKTsKICAgICB9KTsKICAgICBzdHJlYW0ub24oJ2RhdGEnLCB0cmFuc3BvcnQucmVjZWl2ZXIoZnVuY3Rpb24odHJhbnNwb3J0V2l0aERhdGEpIHsKICAgICAgIHZhciBpbnB1dCA9IG5ldyBwcm90b2NvbCh0cmFuc3BvcnRXaXRoRGF0YSk7CkBAIC01Niw3ICs1OCw3IEBACiAgICAgICAgICAgdHJhbnNwb3J0V2l0aERhdGEuY29tbWl0UG9zaXRpb24oKTsKICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CiAgICAgICB9IGNhdGNoIChlcnIpIHsKLSAgICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIHR0cmFuc3BvcnQuSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yKSB7CisgICAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IpIHsKICAgICAgICAgICAvL1RoZSBsYXN0IGRhdGEgaW4gdGhlIGJ1ZmZlciB3YXMgbm90IGEgY29tcGxldGUgbWVzc2FnZSwgd2FpdCBmb3IgdGhlIHJlc3QKICAgICAgICAgICB0cmFuc3BvcnRXaXRoRGF0YS5yb2xsYmFja1Bvc2l0aW9uKCk7CiAgICAgICAgIH0KQEAgLTg1LDE5ICs4NywyMyBAQAogICAgICAgc3RyZWFtLmVuZCgpOwogICAgIH0pOwogICB9Ci0gIAotICBpZiAob3B0aW9ucy50bHMpIHsKKworICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnRscykgeworICAgIGlmICghKCdzZWN1cmVQcm90b2NvbCcgaW4gb3B0aW9ucy50bHMpICYmICEoJ3NlY3VyZU9wdGlvbnMnIGluIG9wdGlvbnMudGxzKSkgeworICAgICAgb3B0aW9ucy50bHMuc2VjdXJlUHJvdG9jb2wgPSAiU1NMdjIzX21ldGhvZCI7CisgICAgICBvcHRpb25zLnRscy5zZWN1cmVPcHRpb25zID0gY29uc3RhbnRzLlNTTF9PUF9OT19TU0x2MiB8IGNvbnN0YW50cy5TU0xfT1BfTk9fU1NMdjM7CisgICAgfQogICAgIHJldHVybiB0bHMuY3JlYXRlU2VydmVyKG9wdGlvbnMudGxzLCBzZXJ2ZXJJbXBsKTsKICAgfSBlbHNlIHsKICAgICByZXR1cm4gbmV0LmNyZWF0ZVNlcnZlcihzZXJ2ZXJJbXBsKTsKICAgfQogfTsKIAotLyoqIAotICogQ3JlYXRlIGEgc2luZ2xlIHNlcnZpY2UgQXBhY2hlIFRocmlmdCBzZXJ2ZXIuIAorLyoqCisgKiBDcmVhdGUgYSBzaW5nbGUgc2VydmljZSBBcGFjaGUgVGhyaWZ0IHNlcnZlci4KICAqIEBwYXJhbSB7b2JqZWN0fSBwcm9jZXNzb3IgLSBBIHNlcnZpY2UgY2xhc3Mgb3IgcHJvY2Vzc29yIGZ1bmN0aW9uLgogICogQHBhcmFtIHtTZXJ2ZXJPcHRpb25zfSBvcHRpb25zIC0gT3B0aW9uYWwgYWRkaXRpb25hbCBzZXJ2ZXIgY29uZmlndXJhdGlvbi4KLSAqIEByZXR1cm5zIHtvYmplY3R9IC0gVGhlIEFwYWNoZSBUaHJpZnQgTXVsdGlwbGVkIFNlcnZlci4KKyAqIEByZXR1cm5zIHtvYmplY3R9IC0gVGhlIEFwYWNoZSBUaHJpZnQgTXVsdGlwbGV4IFNlcnZlci4KICAqLwogZXhwb3J0cy5jcmVhdGVTZXJ2ZXIgPSBmdW5jdGlvbihwcm9jZXNzb3IsIGhhbmRsZXIsIG9wdGlvbnMpIHsKICAgaWYgKHByb2Nlc3Nvci5Qcm9jZXNzb3IpIHsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvbGliL3RocmlmdC90aHJpZnQuanMgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvdGhyaWZ0LmpzCmluZGV4IGUwMmJiN2QuLmYyYjI4OTYgMTAwNjQ0Ci0tLSBhL2xpYi9ub2RlanMvbGliL3RocmlmdC90aHJpZnQuanMKKysrIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L3RocmlmdC5qcwpAQCAtMzUsMTkgKzM1LDIzIEBACiAgIFNFVDogMTQsCiAgIExJU1Q6IDE1LAogICBVVEY4OiAxNiwKLSAgVVRGMTY6IDE3LAorICBVVEYxNjogMTcKIH07CiAKIGV4cG9ydHMuTWVzc2FnZVR5cGUgPSB7CiAgIENBTEw6IDEsCiAgIFJFUExZOiAyLAogICBFWENFUFRJT046IDMsCi0gIE9ORVdBWTogNCwKKyAgT05FV0FZOiA0CiB9OwogCi12YXIgVEV4Y2VwdGlvbiA9IGV4cG9ydHMuVEV4Y2VwdGlvbiA9IGZ1bmN0aW9uKG1lc3NhZ2UpIHsKLSAgRXJyb3IuY2FsbCh0aGlzLCBtZXNzYWdlKTsKLSAgdGhpcy5uYW1lID0gJ1RFeGNlcHRpb24nOworZXhwb3J0cy5URXhjZXB0aW9uID0gVEV4Y2VwdGlvbjsKKworZnVuY3Rpb24gVEV4Y2VwdGlvbihtZXNzYWdlKSB7CisgIEVycm9yLmNhbGwodGhpcyk7CisgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIHRoaXMuY29uc3RydWN0b3IpOworICB0aGlzLm5hbWUgPSB0aGlzLmNvbnN0cnVjdG9yLm5hbWU7CisgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7CiB9OwogdXRpbC5pbmhlcml0cyhURXhjZXB0aW9uLCBFcnJvcik7CiAKQEAgLTY1LDEwICs2OSwxNCBAQAogICBVTlNVUFBPUlRFRF9DTElFTlRfVFlQRTogMTAKIH07CiAKLXZhciBUQXBwbGljYXRpb25FeGNlcHRpb24gPSBleHBvcnRzLlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiA9IGZ1bmN0aW9uKHR5cGUsIG1lc3NhZ2UpIHsKLSAgVEV4Y2VwdGlvbi5jYWxsKHRoaXMsIG1lc3NhZ2UpOworZXhwb3J0cy5UQXBwbGljYXRpb25FeGNlcHRpb24gPSBUQXBwbGljYXRpb25FeGNlcHRpb247CisKK2Z1bmN0aW9uIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbih0eXBlLCBtZXNzYWdlKSB7CisgIFRFeGNlcHRpb24uY2FsbCh0aGlzKTsKKyAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7CiAgIHRoaXMudHlwZSA9IHR5cGUgfHwgVEFwcGxpY2F0aW9uRXhjZXB0aW9uVHlwZS5VTktOT1dOOwotICB0aGlzLm5hbWUgPSAnVEFwcGxpY2F0aW9uRXhjZXB0aW9uJzsKKyAgdGhpcy5uYW1lID0gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lOworICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOwogfTsKIHV0aWwuaW5oZXJpdHMoVEFwcGxpY2F0aW9uRXhjZXB0aW9uLCBURXhjZXB0aW9uKTsKIApAQCAtMTM0LDEzICsxNDIsMTcgQEAKICAgQkFEX1ZFUlNJT046IDQsCiAgIE5PVF9JTVBMRU1FTlRFRDogNSwKICAgREVQVEhfTElNSVQ6IDYKLX0KK307CiAKIAotdmFyIFRQcm90b2NvbEV4Y2VwdGlvbiA9IGV4cG9ydHMuVFByb3RvY29sRXhjZXB0aW9uID0gZnVuY3Rpb24odHlwZSwgbWVzc2FnZSkgewotICBFcnJvci5jYWxsKHRoaXMsIG1lc3NhZ2UpOwotICB0aGlzLm5hbWUgPSAnVFByb3RvY29sRXhjZXB0aW9uJzsKK2V4cG9ydHMuVFByb3RvY29sRXhjZXB0aW9uID0gVFByb3RvY29sRXhjZXB0aW9uOworCitmdW5jdGlvbiBUUHJvdG9jb2xFeGNlcHRpb24odHlwZSwgbWVzc2FnZSkgeworICBFcnJvci5jYWxsKHRoaXMpOworICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCB0aGlzLmNvbnN0cnVjdG9yKTsKKyAgdGhpcy5uYW1lID0gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lOwogICB0aGlzLnR5cGUgPSB0eXBlOworICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOwogfTsKIHV0aWwuaW5oZXJpdHMoVFByb3RvY29sRXhjZXB0aW9uLCBFcnJvcik7CiAKQEAgLTE1MSwzICsxNjMsNzAgQEAKIGV4cG9ydHMuaW5oZXJpdHMgPSBmdW5jdGlvbihjb25zdHJ1Y3Rvciwgc3VwZXJDb25zdHJ1Y3RvcikgewogICB1dGlsLmluaGVyaXRzKGNvbnN0cnVjdG9yLCBzdXBlckNvbnN0cnVjdG9yKTsKIH07CisKK3ZhciBjb3B5TGlzdCwgY29weU1hcDsKKworY29weUxpc3QgPSBmdW5jdGlvbihsc3QsIHR5cGVzKSB7CisKKyAgaWYgKCFsc3QpIHtyZXR1cm4gbHN0OyB9CisKKyAgdmFyIHR5cGU7CisKKyAgaWYgKHR5cGVzLnNoaWZ0ID09PSB1bmRlZmluZWQpIHsKKyAgICB0eXBlID0gdHlwZXM7CisgIH0KKyAgZWxzZSB7CisgICAgdHlwZSA9IHR5cGVzWzBdOworICB9CisgIHZhciBUeXBlID0gdHlwZTsKKworICB2YXIgbGVuID0gbHN0Lmxlbmd0aCwgcmVzdWx0ID0gW10sIGksIHZhbDsKKyAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgdmFsID0gbHN0W2ldOworICAgIGlmICh0eXBlID09PSBudWxsKSB7CisgICAgICByZXN1bHQucHVzaCh2YWwpOworICAgIH0KKyAgICBlbHNlIGlmICh0eXBlID09PSBjb3B5TWFwIHx8IHR5cGUgPT09IGNvcHlMaXN0KSB7CisgICAgICByZXN1bHQucHVzaCh0eXBlKHZhbCwgdHlwZXMuc2xpY2UoMSkpKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICByZXN1bHQucHVzaChuZXcgVHlwZSh2YWwpKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK307CisKK2NvcHlNYXAgPSBmdW5jdGlvbihvYmosIHR5cGVzKXsKKworICBpZiAoIW9iaikge3JldHVybiBvYmo7IH0KKworICB2YXIgdHlwZTsKKworICBpZiAodHlwZXMuc2hpZnQgPT09IHVuZGVmaW5lZCkgeworICAgIHR5cGUgPSB0eXBlczsKKyAgfQorICBlbHNlIHsKKyAgICB0eXBlID0gdHlwZXNbMF07CisgIH0KKyAgdmFyIFR5cGUgPSB0eXBlOworCisgIHZhciByZXN1bHQgPSB7fSwgdmFsOworICBmb3IodmFyIHByb3AgaW4gb2JqKSB7CisgICAgaWYob2JqLmhhc093blByb3BlcnR5KHByb3ApKSB7CisgICAgICB2YWwgPSBvYmpbcHJvcF07CisgICAgICBpZiAodHlwZSA9PT0gbnVsbCkgeworICAgICAgICByZXN1bHRbcHJvcF0gPSB2YWw7CisgICAgICB9CisgICAgICBlbHNlIGlmICh0eXBlID09PSBjb3B5TWFwIHx8IHR5cGUgPT09IGNvcHlMaXN0KSB7CisgICAgICAgIHJlc3VsdFtwcm9wXSA9IHR5cGUodmFsLCB0eXBlcy5zbGljZSgxKSk7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgcmVzdWx0W3Byb3BdID0gbmV3IFR5cGUodmFsKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK307CisKK21vZHVsZS5leHBvcnRzLmNvcHlNYXAgPSBjb3B5TWFwOworbW9kdWxlLmV4cG9ydHMuY29weUxpc3QgPSBjb3B5TGlzdDsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvbGliL3RocmlmdC90cmFuc3BvcnQuanMgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvdHJhbnNwb3J0LmpzCmluZGV4IDZkNDIyNGEuLjU5ZGFhOTggMTAwNjQ0Ci0tLSBhL2xpYi9ub2RlanMvbGliL3RocmlmdC90cmFuc3BvcnQuanMKKysrIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L3RyYW5zcG9ydC5qcwpAQCAtMTYsMjg1ICsxNiw3IEBACiAgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwotdmFyIGVtcHR5QnVmID0gbmV3IEJ1ZmZlcigwKTsKIAotdmFyIGJpbmFyeSA9IHJlcXVpcmUoJy4vYmluYXJ5Jyk7Ci12YXIgdXRpbCA9IHJlcXVpcmUoInV0aWwiKTsKLQotdmFyIElucHV0QnVmZmVyVW5kZXJydW5FcnJvciA9IGV4cG9ydHMuSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yID0gZnVuY3Rpb24obWVzc2FnZSkgewotICBFcnJvci5jYWxsKHRoaXMsIG1lc3NhZ2UpOwotfTsKLXV0aWwuaW5oZXJpdHMoSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yLCBFcnJvcik7Ci0KLXZhciBURnJhbWVkVHJhbnNwb3J0ID0gZXhwb3J0cy5URnJhbWVkVHJhbnNwb3J0ID0gZnVuY3Rpb24oYnVmZmVyLCBjYWxsYmFjaykgewotICB0aGlzLmluQnVmID0gYnVmZmVyIHx8IGVtcHR5QnVmOwotICB0aGlzLm91dEJ1ZmZlcnMgPSBbXTsKLSAgdGhpcy5vdXRDb3VudCA9IDA7Ci0gIHRoaXMucmVhZFBvcyA9IDA7Ci0gIHRoaXMub25GbHVzaCA9IGNhbGxiYWNrOwotfTsKLVRGcmFtZWRUcmFuc3BvcnQucmVjZWl2ZXIgPSBmdW5jdGlvbihjYWxsYmFjaykgewotICB2YXIgcmVzaWR1YWwgPSBudWxsOwotCi0gIHJldHVybiBmdW5jdGlvbihkYXRhKSB7Ci0gICAgLy8gUHJlcGVuZCBhbnkgcmVzaWR1YWwgZGF0YSBmcm9tIG91ciBwcmV2aW91cyByZWFkCi0gICAgaWYgKHJlc2lkdWFsKSB7Ci0gICAgICBkYXRhID0gQnVmZmVyLmNvbmNhdChbcmVzaWR1YWwsIGRhdGFdKTsKLSAgICAgIHJlc2lkdWFsID0gbnVsbDsKLSAgICB9Ci0KLSAgICAvLyBmcmFtZWQgdHJhbnNwb3J0Ci0gICAgd2hpbGUgKGRhdGEubGVuZ3RoKSB7Ci0gICAgICBpZiAoZGF0YS5sZW5ndGggPCA0KSB7Ci0gICAgICAgIC8vIE5vdCBlbm91Z2ggYnl0ZXMgdG8gY29udGludWUsIHNhdmUgYW5kIHJlc3VtZSBvbiBuZXh0IHBhY2tldAotICAgICAgICByZXNpZHVhbCA9IGRhdGE7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIHZhciBmcmFtZVNpemUgPSBiaW5hcnkucmVhZEkzMihkYXRhLCAwKTsKLSAgICAgIGlmIChkYXRhLmxlbmd0aCA8IDQgKyBmcmFtZVNpemUpIHsKLSAgICAgICAgLy8gTm90IGVub3VnaCBieXRlcyB0byBjb250aW51ZSwgc2F2ZSBhbmQgcmVzdW1lIG9uIG5leHQgcGFja2V0Ci0gICAgICAgIHJlc2lkdWFsID0gZGF0YTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICB2YXIgZnJhbWUgPSBkYXRhLnNsaWNlKDQsIDQgKyBmcmFtZVNpemUpOwotICAgICAgcmVzaWR1YWwgPSBkYXRhLnNsaWNlKDQgKyBmcmFtZVNpemUpOwotCi0gICAgICBjYWxsYmFjayhuZXcgVEZyYW1lZFRyYW5zcG9ydChmcmFtZSkpOwotCi0gICAgICBkYXRhID0gcmVzaWR1YWw7Ci0gICAgICByZXNpZHVhbCA9IG51bGw7Ci0gICAgfQotICB9OwotfTsKLQotVEZyYW1lZFRyYW5zcG9ydC5wcm90b3R5cGUgPSB7Ci0gIGNvbW1pdFBvc2l0aW9uOiBmdW5jdGlvbigpe30sCi0gIHJvbGxiYWNrUG9zaXRpb246IGZ1bmN0aW9uKCl7fSwKLQotICAvLyBUT0RPOiBJbXBsZW1lbnQgb3Blbi9jbG9zZSBzdXBwb3J0Ci0gIGlzT3BlbjogZnVuY3Rpb24oKSB7cmV0dXJuIHRydWU7fSwKLSAgb3BlbjogZnVuY3Rpb24oKSB7fSwKLSAgY2xvc2U6IGZ1bmN0aW9uKCkge30sCi0KLSAgZW5zdXJlQXZhaWxhYmxlOiBmdW5jdGlvbihsZW4pIHsKLSAgICBpZiAodGhpcy5yZWFkUG9zICsgbGVuID4gdGhpcy5pbkJ1Zi5sZW5ndGgpIHsKLSAgICAgIHRocm93IG5ldyBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IoKTsKLSAgICB9Ci0gIH0sCi0KLSAgcmVhZDogZnVuY3Rpb24obGVuKSB7IC8vIHRoaXMgZnVuY3Rpb24gd2lsbCBiZSB1c2VkIGZvciBlYWNoIGZyYW1lcy4KLSAgICB0aGlzLmVuc3VyZUF2YWlsYWJsZShsZW4pOwotICAgIHZhciBlbmQgPSB0aGlzLnJlYWRQb3MgKyBsZW47Ci0KLSAgICBpZiAodGhpcy5pbkJ1Zi5sZW5ndGggPCBlbmQpIHsKLSAgICAgIHRocm93IG5ldyBFcnJvcigncmVhZCgnICsgbGVuICsgJykgZmFpbGVkIC0gbm90IGVub3VnaCBkYXRhJyk7Ci0gICAgfQotCi0gICAgdmFyIGJ1ZiA9IHRoaXMuaW5CdWYuc2xpY2UodGhpcy5yZWFkUG9zLCBlbmQpOwotICAgIHRoaXMucmVhZFBvcyA9IGVuZDsKLSAgICByZXR1cm4gYnVmOwotICB9LAotCi0gIHJlYWRCeXRlOiBmdW5jdGlvbigpIHsKLSAgICB0aGlzLmVuc3VyZUF2YWlsYWJsZSgxKTsKLSAgICByZXR1cm4gYmluYXJ5LnJlYWRCeXRlKHRoaXMuaW5CdWZbdGhpcy5yZWFkUG9zKytdKTsKLSAgfSwKLQotICByZWFkSTE2OiBmdW5jdGlvbigpIHsKLSAgICB0aGlzLmVuc3VyZUF2YWlsYWJsZSgyKTsKLSAgICB2YXIgaTE2ID0gYmluYXJ5LnJlYWRJMTYodGhpcy5pbkJ1ZiwgdGhpcy5yZWFkUG9zKTsKLSAgICB0aGlzLnJlYWRQb3MgKz0gMjsKLSAgICByZXR1cm4gaTE2OwotICB9LAotCi0gIHJlYWRJMzI6IGZ1bmN0aW9uKCkgewotICAgIHRoaXMuZW5zdXJlQXZhaWxhYmxlKDQpOwotICAgIHZhciBpMzIgPSBiaW5hcnkucmVhZEkzMih0aGlzLmluQnVmLCB0aGlzLnJlYWRQb3MpOwotICAgIHRoaXMucmVhZFBvcyArPSA0OwotICAgIHJldHVybiBpMzI7Ci0gIH0sCi0KLSAgcmVhZERvdWJsZTogZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy5lbnN1cmVBdmFpbGFibGUoOCk7Ci0gICAgdmFyIGQgPSBiaW5hcnkucmVhZERvdWJsZSh0aGlzLmluQnVmLCB0aGlzLnJlYWRQb3MpOwotICAgIHRoaXMucmVhZFBvcyArPSA4OwotICAgIHJldHVybiBkOwotICB9LAotCi0gIHJlYWRTdHJpbmc6IGZ1bmN0aW9uKGxlbikgewotICAgIHRoaXMuZW5zdXJlQXZhaWxhYmxlKGxlbik7Ci0gICAgdmFyIHN0ciA9IHRoaXMuaW5CdWYudG9TdHJpbmcoJ3V0ZjgnLCB0aGlzLnJlYWRQb3MsIHRoaXMucmVhZFBvcyArIGxlbik7Ci0gICAgdGhpcy5yZWFkUG9zICs9IGxlbjsKLSAgICByZXR1cm4gc3RyOwotICB9LAotCi0gIGJvcnJvdzogZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuIHsgYnVmOiB0aGlzLmluQnVmLCByZWFkSW5kZXg6IHRoaXMucmVhZFBvcywgd3JpdGVJbmRleDogdGhpcy5pbkJ1Zi5sZW5ndGggfTsKLSAgfSwKLQotICBjb25zdW1lOiBmdW5jdGlvbihieXRlc0NvbnN1bWVkKSB7Ci0gICAgdGhpcy5yZWFkUG9zICs9IGJ5dGVzQ29uc3VtZWQ7Ci0gIH0sCi0KLSAgd3JpdGU6IGZ1bmN0aW9uKGJ1ZiwgZW5jb2RpbmcpIHsKLSAgICBpZiAodHlwZW9mKGJ1ZikgPT09ICJzdHJpbmciKSB7Ci0gICAgICBidWYgPSBuZXcgQnVmZmVyKGJ1ZiwgZW5jb2RpbmcgfHwgJ3V0ZjgnKTsKLSAgICB9Ci0gICAgdGhpcy5vdXRCdWZmZXJzLnB1c2goYnVmKTsKLSAgICB0aGlzLm91dENvdW50ICs9IGJ1Zi5sZW5ndGg7Ci0gIH0sCi0KLSAgZmx1c2g6IGZ1bmN0aW9uKCkgewotICAgIHZhciBvdXQgPSBuZXcgQnVmZmVyKHRoaXMub3V0Q291bnQpLAotICAgICAgICBwb3MgPSAwOwotICAgIHRoaXMub3V0QnVmZmVycy5mb3JFYWNoKGZ1bmN0aW9uKGJ1ZikgewotICAgICAgYnVmLmNvcHkob3V0LCBwb3MsIDApOwotICAgICAgcG9zICs9IGJ1Zi5sZW5ndGg7Ci0gICAgfSk7Ci0gICAgCi0gICAgaWYgKHRoaXMub25GbHVzaCkgewotICAgICAgLy8gVE9ETzogb3B0aW1pemUgdGhpcyBiZXR0ZXIsIGFsbG9jYXRlIG9uZSBidWZmZXIgaW5zdGVhZCBvZiBib3RoOgotICAgICAgdmFyIG1zZyA9IG5ldyBCdWZmZXIob3V0Lmxlbmd0aCArIDQpOwotICAgICAgYmluYXJ5LndyaXRlSTMyKG1zZywgb3V0Lmxlbmd0aCk7Ci0gICAgICBvdXQuY29weShtc2csIDQsIDAsIG91dC5sZW5ndGgpOwotICAgICAgdGhpcy5vbkZsdXNoKG1zZyk7Ci0gICAgfQotCi0gICAgdGhpcy5vdXRCdWZmZXJzID0gW107Ci0gICAgdGhpcy5vdXRDb3VudCA9IDA7Ci0gIH0KLX07Ci0KLXZhciBUQnVmZmVyZWRUcmFuc3BvcnQgPSBleHBvcnRzLlRCdWZmZXJlZFRyYW5zcG9ydCA9IGZ1bmN0aW9uKGJ1ZmZlciwgY2FsbGJhY2spIHsKLSAgdGhpcy5kZWZhdWx0UmVhZEJ1ZmZlclNpemUgPSAxMDI0OwotICB0aGlzLndyaXRlQnVmZmVyU2l6ZSA9IDUxMjsgLy8gU29mdCBMaW1pdAotICB0aGlzLmluQnVmID0gbmV3IEJ1ZmZlcih0aGlzLmRlZmF1bHRSZWFkQnVmZmVyU2l6ZSk7Ci0gIHRoaXMucmVhZEN1cnNvciA9IDA7Ci0gIHRoaXMud3JpdGVDdXJzb3IgPSAwOyAvLyBmb3IgaW5wdXQgYnVmZmVyCi0gIHRoaXMub3V0QnVmZmVycyA9IFtdOwotICB0aGlzLm91dENvdW50ID0gMDsKLSAgdGhpcy5vbkZsdXNoID0gY2FsbGJhY2s7Ci19OwotVEJ1ZmZlcmVkVHJhbnNwb3J0LnJlY2VpdmVyID0gZnVuY3Rpb24oY2FsbGJhY2spIHsKLSAgdmFyIHJlYWRlciA9IG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQoKTsKLQotICByZXR1cm4gZnVuY3Rpb24oZGF0YSkgewotICAgIGlmIChyZWFkZXIud3JpdGVDdXJzb3IgKyBkYXRhLmxlbmd0aCA+IHJlYWRlci5pbkJ1Zi5sZW5ndGgpIHsKLSAgICAgIHZhciBidWYgPSBuZXcgQnVmZmVyKHJlYWRlci53cml0ZUN1cnNvciArIGRhdGEubGVuZ3RoKTsKLSAgICAgIHJlYWRlci5pbkJ1Zi5jb3B5KGJ1ZiwgMCwgMCwgcmVhZGVyLndyaXRlQ3Vyc29yKTsKLSAgICAgIHJlYWRlci5pbkJ1ZiA9IGJ1ZjsKLSAgICB9Ci0gICAgZGF0YS5jb3B5KHJlYWRlci5pbkJ1ZiwgcmVhZGVyLndyaXRlQ3Vyc29yLCAwKTsKLSAgICByZWFkZXIud3JpdGVDdXJzb3IgKz0gZGF0YS5sZW5ndGg7Ci0KLSAgICBjYWxsYmFjayhyZWFkZXIpOwotICB9OwotfTsKLQotVEJ1ZmZlcmVkVHJhbnNwb3J0LnByb3RvdHlwZSA9IHsKLSAgY29tbWl0UG9zaXRpb246IGZ1bmN0aW9uKCl7Ci0gICAgdmFyIHVucmVhZFNpemUgPSB0aGlzLndyaXRlQ3Vyc29yIC0gdGhpcy5yZWFkQ3Vyc29yOwotICAgIHZhciBidWZTaXplID0gKHVucmVhZFNpemUgKiAyID4gdGhpcy5kZWZhdWx0UmVhZEJ1ZmZlclNpemUpID8gCi0gICAgICB1bnJlYWRTaXplICogMiA6IHRoaXMuZGVmYXVsdFJlYWRCdWZmZXJTaXplOwotICAgIHZhciBidWYgPSBuZXcgQnVmZmVyKGJ1ZlNpemUpOwotICAgIGlmICh1bnJlYWRTaXplID4gMCkgewotICAgICAgdGhpcy5pbkJ1Zi5jb3B5KGJ1ZiwgMCwgdGhpcy5yZWFkQ3Vyc29yLCB0aGlzLndyaXRlQ3Vyc29yKTsKLSAgICB9Ci0gICAgdGhpcy5yZWFkQ3Vyc29yID0gMDsKLSAgICB0aGlzLndyaXRlQ3Vyc29yID0gdW5yZWFkU2l6ZTsKLSAgICB0aGlzLmluQnVmID0gYnVmOwotICB9LAotICByb2xsYmFja1Bvc2l0aW9uOiBmdW5jdGlvbigpewotICAgIHRoaXMucmVhZEN1cnNvciA9IDA7Ci0gIH0sCi0KLSAgLy8gVE9ETzogSW1wbGVtZW50IG9wZW4vY2xvc2Ugc3VwcG9ydAotICBpc09wZW46IGZ1bmN0aW9uKCkge3JldHVybiB0cnVlO30sCi0gIG9wZW46IGZ1bmN0aW9uKCkge30sCi0gIGNsb3NlOiBmdW5jdGlvbigpIHt9LAotCi0gIGVuc3VyZUF2YWlsYWJsZTogZnVuY3Rpb24obGVuKSB7Ci0gICAgaWYgKHRoaXMucmVhZEN1cnNvciArIGxlbiA+IHRoaXMud3JpdGVDdXJzb3IpIHsKLSAgICAgIHRocm93IG5ldyBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IoKTsKLSAgICB9Ci0gIH0sCi0KLSAgcmVhZDogZnVuY3Rpb24obGVuKSB7Ci0gICAgdGhpcy5lbnN1cmVBdmFpbGFibGUobGVuKTsKLSAgICB2YXIgYnVmID0gbmV3IEJ1ZmZlcihsZW4pOwotICAgIHRoaXMuaW5CdWYuY29weShidWYsIDAsIHRoaXMucmVhZEN1cnNvciwgdGhpcy5yZWFkQ3Vyc29yICsgbGVuKTsKLSAgICB0aGlzLnJlYWRDdXJzb3IgKz0gbGVuOwotICAgIHJldHVybiBidWY7Ci0gIH0sCi0KLSAgcmVhZEJ5dGU6IGZ1bmN0aW9uKCkgewotICAgIHRoaXMuZW5zdXJlQXZhaWxhYmxlKDEpOwotICAgIHJldHVybiBiaW5hcnkucmVhZEJ5dGUodGhpcy5pbkJ1Zlt0aGlzLnJlYWRDdXJzb3IrK10pOwotICB9LAotCi0gIHJlYWRJMTY6IGZ1bmN0aW9uKCkgewotICAgIHRoaXMuZW5zdXJlQXZhaWxhYmxlKDIpOwotICAgIHZhciBpMTYgPSBiaW5hcnkucmVhZEkxNih0aGlzLmluQnVmLCB0aGlzLnJlYWRDdXJzb3IpOwotICAgIHRoaXMucmVhZEN1cnNvciArPSAyOwotICAgIHJldHVybiBpMTY7Ci0gIH0sCi0KLSAgcmVhZEkzMjogZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy5lbnN1cmVBdmFpbGFibGUoNCk7Ci0gICAgdmFyIGkzMiA9IGJpbmFyeS5yZWFkSTMyKHRoaXMuaW5CdWYsIHRoaXMucmVhZEN1cnNvcik7Ci0gICAgdGhpcy5yZWFkQ3Vyc29yICs9IDQ7Ci0gICAgcmV0dXJuIGkzMjsKLSAgfSwKLQotICByZWFkRG91YmxlOiBmdW5jdGlvbigpIHsKLSAgICB0aGlzLmVuc3VyZUF2YWlsYWJsZSg4KTsKLSAgICB2YXIgZCA9IGJpbmFyeS5yZWFkRG91YmxlKHRoaXMuaW5CdWYsIHRoaXMucmVhZEN1cnNvcik7Ci0gICAgdGhpcy5yZWFkQ3Vyc29yICs9IDg7Ci0gICAgcmV0dXJuIGQ7Ci0gIH0sCi0KLSAgcmVhZFN0cmluZzogZnVuY3Rpb24obGVuKSB7Ci0gICAgdGhpcy5lbnN1cmVBdmFpbGFibGUobGVuKTsKLSAgICB2YXIgc3RyID0gdGhpcy5pbkJ1Zi50b1N0cmluZygndXRmOCcsIHRoaXMucmVhZEN1cnNvciwgdGhpcy5yZWFkQ3Vyc29yICsgbGVuKTsKLSAgICB0aGlzLnJlYWRDdXJzb3IgKz0gbGVuOwotICAgIHJldHVybiBzdHI7Ci0gIH0sCi0KLSAgYm9ycm93OiBmdW5jdGlvbigpIHsKLSAgICB2YXIgb2JqID0ge2J1ZjogdGhpcy5pbkJ1ZiwgcmVhZEluZGV4OiB0aGlzLnJlYWRDdXJzb3IsIHdyaXRlSW5kZXg6IHRoaXMud3JpdGVDdXJzb3J9OwotICAgIHJldHVybiBvYmo7Ci0gIH0sCi0KLSAgY29uc3VtZTogZnVuY3Rpb24oYnl0ZXNDb25zdW1lZCkgewotICAgIHRoaXMucmVhZEN1cnNvciArPSBieXRlc0NvbnN1bWVkOwotICB9LAotCi0gIHdyaXRlOiBmdW5jdGlvbihidWYpIHsKLSAgICBpZiAodHlwZW9mKGJ1ZikgPT09ICJzdHJpbmciKSB7Ci0gICAgICBidWYgPSBuZXcgQnVmZmVyKGJ1ZiwgJ3V0ZjgnKTsKLSAgICB9Ci0gICAgdGhpcy5vdXRCdWZmZXJzLnB1c2goYnVmKTsKLSAgICB0aGlzLm91dENvdW50ICs9IGJ1Zi5sZW5ndGg7Ci0gIH0sCi0KLSAgZmx1c2g6IGZ1bmN0aW9uKCkgewotICAgIGlmICh0aGlzLm91dENvdW50IDwgMSkgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAKLSAgICB2YXIgbXNnID0gbmV3IEJ1ZmZlcih0aGlzLm91dENvdW50KSwKLSAgICAgICAgcG9zID0gMDsKLSAgICB0aGlzLm91dEJ1ZmZlcnMuZm9yRWFjaChmdW5jdGlvbihidWYpIHsKLSAgICAgIGJ1Zi5jb3B5KG1zZywgcG9zLCAwKTsKLSAgICAgIHBvcyArPSBidWYubGVuZ3RoOwotICAgIH0pOwotICAgIAotICAgIGlmICh0aGlzLm9uRmx1c2gpIHsKLSAgICAgIHRoaXMub25GbHVzaChtc2cpOwotICAgIH0KLQotICAgIHRoaXMub3V0QnVmZmVycyA9IFtdOwotICAgIHRoaXMub3V0Q291bnQgPSAwOwotICB9Ci19OworbW9kdWxlLmV4cG9ydHMuVEJ1ZmZlcmVkVHJhbnNwb3J0ID0gcmVxdWlyZSgnLi9idWZmZXJlZF90cmFuc3BvcnQnKTsKK21vZHVsZS5leHBvcnRzLlRGcmFtZWRUcmFuc3BvcnQgPSByZXF1aXJlKCcuL2ZyYW1lZF90cmFuc3BvcnQnKTsKK21vZHVsZS5leHBvcnRzLklucHV0QnVmZmVyVW5kZXJydW5FcnJvciA9IHJlcXVpcmUoJy4vaW5wdXRfYnVmZmVyX3VuZGVycnVuX2Vycm9yJyk7CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2xpYi90aHJpZnQvd2ViX3NlcnZlci5qcyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC93ZWJfc2VydmVyLmpzCmluZGV4IDQwZmMxYWUuLmEzM2Y0N2EgMTAwNjQ0Ci0tLSBhL2xpYi9ub2RlanMvbGliL3RocmlmdC93ZWJfc2VydmVyLmpzCisrKyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC93ZWJfc2VydmVyLmpzCkBAIC0yMiwxNCArMjIsMTUgQEAKIHZhciBwYXRoID0gcmVxdWlyZSgicGF0aCIpOwogdmFyIGZzID0gcmVxdWlyZSgiZnMiKTsKIHZhciBjcnlwdG8gPSByZXF1aXJlKCJjcnlwdG8iKTsKK3ZhciBsb2cgPSByZXF1aXJlKCcuL2xvZycpOwogCiB2YXIgTXVsdGlwbGV4ZWRQcm9jZXNzb3IgPSByZXF1aXJlKCcuL211bHRpcGxleGVkX3Byb2Nlc3NvcicpLk11bHRpcGxleGVkUHJvY2Vzc29yOwotdmFyIFRUcmFuc3BvcnQgPSByZXF1aXJlKCcuL3RyYW5zcG9ydCcpOwotdmFyIFRCdWZmZXJlZFRyYW5zcG9ydCA9IHJlcXVpcmUoJy4vdHJhbnNwb3J0JykuVEJ1ZmZlcmVkVHJhbnNwb3J0OwotdmFyIFRCaW5hcnlQcm90b2NvbCA9IHJlcXVpcmUoJy4vcHJvdG9jb2wnKS5UQmluYXJ5UHJvdG9jb2w7CiAKK3ZhciBUQnVmZmVyZWRUcmFuc3BvcnQgPSByZXF1aXJlKCcuL2J1ZmZlcmVkX3RyYW5zcG9ydCcpOwordmFyIFRCaW5hcnlQcm90b2NvbCA9IHJlcXVpcmUoJy4vYmluYXJ5X3Byb3RvY29sJyk7Cit2YXIgSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yID0gcmVxdWlyZSgnLi9pbnB1dF9idWZmZXJfdW5kZXJydW5fZXJyb3InKTsKIAotLy8gV1NGcmFtZSBjb25zdHJ1Y3RvciBhbmQgcHJvdG90eXBlIAorLy8gV1NGcmFtZSBjb25zdHJ1Y3RvciBhbmQgcHJvdG90eXBlCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAogLyoqIEFwYWNoZSBUaHJpZnQgUlBDIFdlYiBTb2NrZXQgVHJhbnNwb3J0CkBAIC00NSwxMSArNDYsMTEgQEAKICAqICAtIE9wY29kZSBpcyAxKFRFWFQpIGZvciBUSlNPTlByb3RvY29sIGFuZCAyKEJJTikgZm9yIFRCaW5hcnlQcm90b2NvbAogICogIC0gTWFzayBQcmVzZW50IGJpdCBpcyAxIHNlbmRpbmcgdG8tc2VydmVyIGFuZCAwIHNlbmRpbmcgdG8tY2xpZW50CiAgKiAgLSBQYXlsb2FkIExlbjoKLSAqICAgICAgICArIElmIDwgMTI2OiB0aGVuIHJlcHJlc2VudGVkIGRpcmVjdGx5IAorICogICAgICAgICsgSWYgPCAxMjY6IHRoZW4gcmVwcmVzZW50ZWQgZGlyZWN0bHkKICAqICAgICAgICArIElmID49MTI2OiBidXQgd2l0aGluIHJhbmdlIG9mIGFuIHVuc2lnbmVkIDE2IGJpdCBpbnRlZ2VyCi0gKiAgICAgICAgICAgICB0aGVuIFBheWxvYWQgTGVuIGlzIDEyNiBhbmQgdGhlIHR3byBmb2xsb3dpbmcgYnl0ZXMgc3RvcmUgCisgKiAgICAgICAgICAgICB0aGVuIFBheWxvYWQgTGVuIGlzIDEyNiBhbmQgdGhlIHR3byBmb2xsb3dpbmcgYnl0ZXMgc3RvcmUKICAqICAgICAgICAgICAgIHRoZSBsZW5ndGgKLSAqICAgICAgICArIEVsc2U6IFBheWxvYWQgTGVuIGlzIDEyNyBhbmQgdGhlIGZvbGxvd2luZyA4IGJ5dGVzIHN0b3JlIHRoZSAKKyAqICAgICAgICArIEVsc2U6IFBheWxvYWQgTGVuIGlzIDEyNyBhbmQgdGhlIGZvbGxvd2luZyA4IGJ5dGVzIHN0b3JlIHRoZQogICogICAgICAgICAgICAgbGVuZ3RoIGFzIGFuIHVuc2lnbmVkIDY0IGJpdCBpbnRlZ2VyCiAgKiAgLSBNYXNraW5nIGtleSBpcyBhIDMyIGJpdCBrZXkgb25seSBwcmVzZW50IHdoZW4gc2VuZGluZyB0byB0aGUgc2VydmVyCiAgKiAgLSBQYXlsb2FkIGZvbGxvd3MgdGhlIG1hc2tpbmcga2V5IG9yIGxlbmd0aApAQCAtNzQsOSArNzUsOSBAQAogICogICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKICAqLwogdmFyIHdzRnJhbWUgPSB7Ci0gIC8qKiBFbmNvZGVzIGEgV2ViU29ja2V0IGZyYW1lIAorICAvKiogRW5jb2RlcyBhIFdlYlNvY2tldCBmcmFtZQogICAgKgotICAgKiBAcGFyYW0ge0J1ZmZlcn0gZGF0YSAtIFRoZSByYXcgZGF0YSB0byBlbmNvZGUgCisgICAqIEBwYXJhbSB7QnVmZmVyfSBkYXRhIC0gVGhlIHJhdyBkYXRhIHRvIGVuY29kZQogICAgKiBAcGFyYW0ge0J1ZmZlcn0gbWFzayAtIFRoZSBtYXNrIHRvIGFwcGx5IHdoZW4gc2VuZGluZyB0byBzZXJ2ZXIsIG51bGwgZm9yIG5vIG1hc2sKICAgICogQHBhcmFtIHtCb29sZWFufSBiaW5FbmNvZGluZyAtIFRydWUgZm9yIGJpbmFyeSBlbmNvZGluZywgZmFsc2UgZm9yIHRleHQgZW5jb2RpbmcKICAgICogQHJldHVybnMge0J1ZmZlcn0gLSBUaGUgV2ViU29ja2V0IGZyYW1lLCByZWFkeSB0byBzZW5kCkBAIC04NCwxOCArODUsMTggQEAKICAgZW5jb2RlOiBmdW5jdGlvbihkYXRhLCBtYXNrLCBiaW5FbmNvZGluZykgewogICAgICAgdmFyIGZyYW1lID0gbmV3IEJ1ZmZlcih3c0ZyYW1lLmZyYW1lU2l6ZUZyb21EYXRhKGRhdGEsIG1hc2spKTsKICAgICAgIC8vQnl0ZSAwIC0gRklOICYgT1BDT0RFCi0gICAgICBmcmFtZVswXSA9IHdzRnJhbWUuZmluLkZJTiArIAorICAgICAgZnJhbWVbMF0gPSB3c0ZyYW1lLmZpbi5GSU4gKwogICAgICAgICAgIChiaW5FbmNvZGluZyA/IHdzRnJhbWUuZnJhbWVPcENvZGVzLkJJTiA6IHdzRnJhbWUuZnJhbWVPcENvZGVzLlRFWFQpOwogICAgICAgLy9CeXRlIDEgb3IgMS0zIG9yIDEtOSAtIE1BU0sgRkxBRyAmIFNJWkUKICAgICAgIHZhciBwYXlsb2FkT2Zmc2V0ID0gMjsKICAgICAgIGlmIChkYXRhLmxlbmd0aCA8IDB4N0UpIHsKICAgICAgICAgZnJhbWVbMV0gPSBkYXRhLmxlbmd0aCArIChtYXNrID8gd3NGcmFtZS5tYXNrLlRPX1NFUlZFUiA6IHdzRnJhbWUubWFzay5UT19DTElFTlQpOwogICAgICAgfSBlbHNlIGlmIChkYXRhLmxlbmd0aCA8IDB4RkZGRikgewotICAgICAgICBmcmFtZVsxXSA9IDB4N0UgKyAobWFzayA/IHdzRnJhbWUubWFzay5UT19TRVJWRVIgOiB3c0ZyYW1lLm1hc2suVE9fQ0xJRU5UKTsgIAorICAgICAgICBmcmFtZVsxXSA9IDB4N0UgKyAobWFzayA/IHdzRnJhbWUubWFzay5UT19TRVJWRVIgOiB3c0ZyYW1lLm1hc2suVE9fQ0xJRU5UKTsKICAgICAgICAgZnJhbWUud3JpdGVVSW50MTZCRShkYXRhLmxlbmd0aCwgMiwgdHJ1ZSk7CiAgICAgICAgIHBheWxvYWRPZmZzZXQgPSA0OwogICAgICAgfSBlbHNlIHsKLSAgICAgICAgZnJhbWVbMV0gPSAweDdGICsgKG1hc2sgPyB3c0ZyYW1lLm1hc2suVE9fU0VSVkVSIDogd3NGcmFtZS5tYXNrLlRPX0NMSUVOVCk7ICAKKyAgICAgICAgZnJhbWVbMV0gPSAweDdGICsgKG1hc2sgPyB3c0ZyYW1lLm1hc2suVE9fU0VSVkVSIDogd3NGcmFtZS5tYXNrLlRPX0NMSUVOVCk7CiAgICAgICAgIGZyYW1lLndyaXRlVUludDMyQkUoMCwgMiwgdHJ1ZSk7CiAgICAgICAgIGZyYW1lLndyaXRlVUludDMyQkUoZGF0YS5sZW5ndGgsIDYsIHRydWUpOwogICAgICAgICBwYXlsb2FkT2Zmc2V0ID0gMTA7CkBAIC0xMTcsMTggKzExOCwxOCBAQAogICAgKiBAY2xhc3MKICAgICogQG5hbWUgV1NEZWNvZGVSZXN1bHQKICAgICogQHByb3BlcnR5IHtCdWZmZXJ9IGRhdGEgLSBUaGUgZGVjb2RlZCBkYXRhIGZvciB0aGUgZmlyc3QgQVRSUEMgbWVzc2FnZQotICAgKiBAcHJvcGVydHkge0J1ZmZlcn0gbWFzayAtIFRoZSBmcmFtZSBtYXNrIAotICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IGJpbkVuY29kaW5nIC0gVHJ1ZSBpZiBiaW5hcnkgKFRCaW5hcnlQcm90b2NvbCksIAorICAgKiBAcHJvcGVydHkge0J1ZmZlcn0gbWFzayAtIFRoZSBmcmFtZSBtYXNrCisgICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gYmluRW5jb2RpbmcgLSBUcnVlIGlmIGJpbmFyeSAoVEJpbmFyeVByb3RvY29sKSwKICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhbHNlIGlmIHRleHQgKFRKU09OUHJvdG9jb2wpCi0gICAqIEBwcm9wZXJ0eSB7QnVmZmVyfSBuZXh0RnJhbWUgLSBNdWx0aXBsZSBBVFJQQyBtZXNzYWdlcyBtYXkgYmUgc2VudCBpbiBhIAorICAgKiBAcHJvcGVydHkge0J1ZmZlcn0gbmV4dEZyYW1lIC0gTXVsdGlwbGUgQVRSUEMgbWVzc2FnZXMgbWF5IGJlIHNlbnQgaW4gYQogICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luZ2xlIFdlYlNvY2tldCBmcmFtZSwgdGhpcyBCdWZmZXIgY29udGFpbnMKICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFueSBieXRlcyByZW1haW5pbmcgdG8gYmUgZGVjb2RlZAogICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IEZJTiAtIFRydWUgaXMgdGhlIG1lc3NhZ2UgaXMgY29tcGxldGUKICAgICovCi0gICAKLSAgIC8qKiBEZWNvZGVzIGEgV2ViU29ja2V0IGZyYW1lIAorCisgICAvKiogRGVjb2RlcyBhIFdlYlNvY2tldCBmcmFtZQogICAgKgotICAgKiBAcGFyYW0ge0J1ZmZlcn0gZnJhbWUgLSBUaGUgcmF3IGluYm91bmQgZnJhbWUsIGlmIHRoaXMgaXMgYSBjb250aW51YXRpb24gCisgICAqIEBwYXJhbSB7QnVmZmVyfSBmcmFtZSAtIFRoZSByYXcgaW5ib3VuZCBmcmFtZSwgaWYgdGhpcyBpcyBhIGNvbnRpbnVhdGlvbgogICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZSBpdCBtdXN0IGhhdmUgYSBtYXNrIHByb3BlcnR5IHdpdGggdGhlIG1hc2suCiAgICAqIEByZXR1cm5zIHtXU0RlY29kZVJlc3VsdH0gLSBUaGUgZGVjb2RlZCBwYXlsb2FkCiAgICAqCkBAIC0xNjQsNyArMTY1LDcgQEAKICAgICAgICAgcmVzdWx0Lm1hc2sgPSBuZXcgQnVmZmVyKDQpOwogICAgICAgICBmcmFtZS5jb3B5KHJlc3VsdC5tYXNrLCAwLCBkYXRhT2Zmc2V0LCBkYXRhT2Zmc2V0ICsgNCk7CiAgICAgICAgIGRhdGFPZmZzZXQgKz0gNDsKLSAgICAgIH0gCisgICAgICB9CiAgICAgICAvL1BheWxvYWQKICAgICAgIHJlc3VsdC5kYXRhID0gbmV3IEJ1ZmZlcihsZW4pOwogICAgICAgZnJhbWUuY29weShyZXN1bHQuZGF0YSwgMCwgZGF0YU9mZnNldCwgZGF0YU9mZnNldCtsZW4pOwpAQCAtMTg0LDcgKzE4NSw3IEBACiAgICAgICByZXR1cm4gcmVzdWx0OwogICB9LAogCi0gIC8qKiBNYXNrcy9Vbm1hc2tzIGRhdGEgCisgIC8qKiBNYXNrcy9Vbm1hc2tzIGRhdGEKICAgICoKICAgICogQHBhcmFtIHtCdWZmZXJ9IGRhdGEgLSBkYXRhIHRvIG1hc2svdW5tYXNrIGluIHBsYWNlCiAgICAqIEBwYXJhbSB7QnVmZmVyfSBtYXNrIC0gdGhlIG1hc2sKQEAgLTIwNCw3ICsyMDUsNyBAQAogICAgKiBAcGFyYW0ge0Jvb2xlYW59IG1hc2sgLSB0cnVlIGlmIGEgbWFzayB3aWxsIGJlIHNlbnQgKFRPX1NFUlZFUikKICAgICovCiAgIGZyYW1lU2l6ZUZyb21EYXRhOiBmdW5jdGlvbihkYXRhLCBtYXNrKSB7Ci0gICAgdmFyIGhlYWRlclNpemUgPSAxMDsgCisgICAgdmFyIGhlYWRlclNpemUgPSAxMDsKICAgICBpZiAoZGF0YS5sZW5ndGggPCAweDdFKSB7CiAgICAgICBoZWFkZXJTaXplID0gMjsKICAgICB9IGVsc2UgaWYgKGRhdGEubGVuZ3RoIDwgMHhGRkZGKSB7CkBAIC0yMzgsMTUgKzIzOSwxNSBAQAogLyoqCiAgKiBAY2xhc3MKICAqIEBuYW1lIFNlcnZlck9wdGlvbnMKLSAqIEBwcm9wZXJ0eSB7YXJyYXl9IGNvcnMgLSBBcnJheSBvZiBDT1JTIG9yaWdpbiBzdHJpbmdzIHRvIHBlcm1pdCByZXF1ZXN0cyBmcm9tLiAKLSAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBmaWxlcyAtIFBhdGggdG8gc2VydmUgc3RhdGljIGZpbGVzIGZyb20sIGlmIGFic2VudCBvciAiIiAKKyAqIEBwcm9wZXJ0eSB7YXJyYXl9IGNvcnMgLSBBcnJheSBvZiBDT1JTIG9yaWdpbiBzdHJpbmdzIHRvIHBlcm1pdCByZXF1ZXN0cyBmcm9tLgorICogQHByb3BlcnR5IHtzdHJpbmd9IGZpbGVzIC0gUGF0aCB0byBzZXJ2ZSBzdGF0aWMgZmlsZXMgZnJvbSwgaWYgYWJzZW50IG9yICIiCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWMgZmlsZSBzZXJ2aWNlIGlzIGRpc2FibGVkLgogICogQHByb3BlcnR5IHtvYmplY3R9IGhlYWRlcnMgLSBBbiBvYmplY3QgaGFzaCBtYXBwaW5nIGhlYWRlciBzdHJpbmdzIHRvIGhlYWRlciB2YWx1ZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdzLCB0aGVzZSBoZWFkZXJzIGFyZSB0cmFuc21pdHRlZCBpbiByZXNwb25zZSB0byAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5ncywgdGhlc2UgaGVhZGVycyBhcmUgdHJhbnNtaXR0ZWQgaW4gcmVzcG9uc2UgdG8KICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljIGZpbGUgR0VUIG9wZXJhdGlvbnMuCi0gKiBAcHJvcGVydHkge29iamVjdH0gc2VydmljZXMgLSBBbiBvYmplY3QgaGFzaCBtYXBwaW5nIHNlcnZpY2UgVVJJIHN0cmluZ3MgCisgKiBAcHJvcGVydHkge29iamVjdH0gc2VydmljZXMgLSBBbiBvYmplY3QgaGFzaCBtYXBwaW5nIHNlcnZpY2UgVVJJIHN0cmluZ3MKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIFNlcnZpY2VPcHRpb25zIG9iamVjdHMKLSAqIEBwcm9wZXJ0eSB7b2JqZWN0fSB0bHMgLSBOb2RlLmpzIFRMUyBvcHRpb25zIChzZWU6IG5vZGVqcy5vcmcvYXBpL3Rscy5odG1sKSwgCisgKiBAcHJvcGVydHkge29iamVjdH0gdGxzIC0gTm9kZS5qcyBUTFMgb3B0aW9ucyAoc2VlOiBub2RlanMub3JnL2FwaS90bHMuaHRtbCksCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IHByZXNlbnQgb3IgbnVsbCByZWd1bGFyIGh0dHAgaXMgdXNlZCwKICAqICAgICAgICAgICAgICAgICAgICAgICAgICBhdCBsZWFzdCBhIGtleSBhbmQgYSBjZXJ0IG11c3QgYmUgZGVmaW5lZCB0byB1c2UgU1NML1RMUwogICogQHNlZSB7QGxpbmsgU2VydmljZU9wdGlvbnN9CkBAIC0yNTUsMTkgKzI1NiwxOSBAQAogLyoqCiAgKiBAY2xhc3MKICAqIEBuYW1lIFNlcnZpY2VPcHRpb25zCi0gKiBAcHJvcGVydHkge29iamVjdH0gdHJhbnNwb3J0IC0gVGhlIGxheWVyZWQgdHJhbnNwb3J0IHRvIHVzZSAoZGVmYXVsdHMgCisgKiBAcHJvcGVydHkge29iamVjdH0gdHJhbnNwb3J0IC0gVGhlIGxheWVyZWQgdHJhbnNwb3J0IHRvIHVzZSAoZGVmYXVsdHMKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBUQnVmZmVyZWRUcmFuc3BvcnQpLgotICogQHByb3BlcnR5IHtvYmplY3R9IHByb3RvY29sIC0gVGhlIHNlcmlhbGl6YXRpb24gUHJvdG9jb2wgdG8gdXNlIChkZWZhdWx0cyB0byAKKyAqIEBwcm9wZXJ0eSB7b2JqZWN0fSBwcm90b2NvbCAtIFRoZSBzZXJpYWxpemF0aW9uIFByb3RvY29sIHRvIHVzZSAoZGVmYXVsdHMgdG8KICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRCaW5hcnlQcm90b2NvbCkuCi0gKiBAcHJvcGVydHkge29iamVjdH0gcHJvY2Vzc29yIC0gVGhlIFRocmlmdCBTZXJ2aWNlIGNsYXNzL3Byb2Nlc3NvciBnZW5lcmF0ZWQgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgdGhlIElETCBDb21waWxlciBmb3IgdGhlIHNlcnZpY2UgKHRoZSAiY2xzIiAKKyAqIEBwcm9wZXJ0eSB7b2JqZWN0fSBwcm9jZXNzb3IgLSBUaGUgVGhyaWZ0IFNlcnZpY2UgY2xhc3MvcHJvY2Vzc29yIGdlbmVyYXRlZAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IHRoZSBJREwgQ29tcGlsZXIgZm9yIHRoZSBzZXJ2aWNlICh0aGUgImNscyIKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkgY2FuIGFsc28gYmUgdXNlZCBmb3IgdGhpcyBhdHRyaWJ1dGUpLgogICogQHByb3BlcnR5IHtvYmplY3R9IGhhbmRsZXIgLSBUaGUgaGFuZGxlciBtZXRob2RzIGZvciB0aGUgVGhyaWZ0IFNlcnZpY2UuCiAgKi8KIAotLyoqIAorLyoqCiAgKiBDcmVhdGUgYSBUaHJpZnQgc2VydmVyIHdoaWNoIGNhbiBzZXJ2ZSBzdGF0aWMgZmlsZXMgYW5kL29yIG9uZSBvcgotICogbW9yZSBUaHJpZnQgU2VydmljZXMuIAorICogbW9yZSBUaHJpZnQgU2VydmljZXMuCiAgKiBAcGFyYW0ge1NlcnZlck9wdGlvbnN9IG9wdGlvbnMgLSBUaGUgc2VydmVyIGNvbmZpZ3VyYXRpb24uCiAgKiBAcmV0dXJucyB7b2JqZWN0fSAtIFRoZSBBcGFjaGUgVGhyaWZ0IFdlYiBTZXJ2ZXIuCiAgKi8KQEAgLTI4NCwyNiArMjg1LDI2IEBACiAgICAgJy5qcGVnJzogJ2ltYWdlL2pwZWcnLAogICAgICcuZ2lmJzogJ2ltYWdlL2dpZicsCiAgICAgJy5wbmcnOiAnaW1hZ2UvcG5nJywKLSAgwqAgJy5zdmcnOiAnaW1hZ2Uvc3ZnK3htbCcKKyAgICAnLnN2Zyc6ICdpbWFnZS9zdmcreG1sJwogICB9OwogCiAgIC8vU2V0dXAgYWxsIG9mIHRoZSBzZXJ2aWNlcwogICB2YXIgc2VydmljZXMgPSBvcHRpb25zLnNlcnZpY2VzOwogICBmb3IgKHZhciB1cmkgaW4gc2VydmljZXMpIHsKICAgICB2YXIgc3ZjT2JqID0gc2VydmljZXNbdXJpXTsKLSAgICAKKwogICAgIC8vU2V0dXAgdGhlIHByb2Nlc3NvcgogICAgIGlmIChzdmNPYmoucHJvY2Vzc29yIGluc3RhbmNlb2YgTXVsdGlwbGV4ZWRQcm9jZXNzb3IpIHsKLSAgICAgIC8vTXVsdGlwbGV4IHByb2Nlc3NvcnMgaGF2ZSBwcmUgZW1iZWRlZCBwcm9jZXNzb3IvaGFuZGxlciBwYWlycywgc2F2ZSBhcyBpcworICAgICAgLy9NdWx0aXBsZXggcHJvY2Vzc29ycyBoYXZlIHByZSBlbWJlZGRlZCBwcm9jZXNzb3IvaGFuZGxlciBwYWlycywgc2F2ZSBhcyBpcwogICAgICAgc3ZjT2JqLnByb2Nlc3NvciA9IHN2Y09iai5wcm9jZXNzb3I7CiAgICAgfSBlbHNlIHsKICAgICAgIC8vRm9yIGhpc3RvcmljYWwgcmVhc29ucyBOb2RlLmpzIHN1cHBvcnRzIHByb2Nlc3NvcnMgcGFzc2VkIGluIGRpcmVjdGx5IG9yIHZpYSB0aGUKICAgICAgIC8vICBJREwgQ29tcGlsZXIgZ2VuZXJhdGVkIGNsYXNzIGhvdXNpbmcgdGhlIHByb2Nlc3Nvci4gQWxzbywgdGhlIG9wdGlvbnMgcHJvcGVydHkKLSAgICAgIC8vICBmb3IgYSBQcm9jZXNzb3IgaGFzIGJlZW4gY2FsbGVkIGJvdGggY2xzIGFuZCBwcm9jZXNzb3IgYXQgZGlmZmVyZW50IHRpbWVzLiBXZSAKKyAgICAgIC8vICBmb3IgYSBQcm9jZXNzb3IgaGFzIGJlZW4gY2FsbGVkIGJvdGggY2xzIGFuZCBwcm9jZXNzb3IgYXQgZGlmZmVyZW50IHRpbWVzLiBXZQogICAgICAgLy8gIHN1cHBvcnQgYW55IG9mIHRoZSBmb3VyIHBvc3NpYmlsaXRpZXMgaGVyZS4KLSAgICAgIHZhciBwcm9jZXNzb3IgPSAoc3ZjT2JqLnByb2Nlc3NvcikgPyAoc3ZjT2JqLnByb2Nlc3Nvci5Qcm9jZXNzb3IgfHwgc3ZjT2JqLnByb2Nlc3NvcikgOiAKKyAgICAgIHZhciBwcm9jZXNzb3IgPSAoc3ZjT2JqLnByb2Nlc3NvcikgPyAoc3ZjT2JqLnByb2Nlc3Nvci5Qcm9jZXNzb3IgfHwgc3ZjT2JqLnByb2Nlc3NvcikgOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdmNPYmouY2xzLlByb2Nlc3NvciB8fCBzdmNPYmouY2xzKTsKLSAgICAgIC8vUHJvY2Vzc29ycyBjYW4gYmUgc3VwcGxpZWQgYXMgY29uc3RydWN0ZWQgb2JqZWN0cyB3aXRoIGhhbmRsZXJzIGFscmVhZHkgZW1iZWRlZCwKKyAgICAgIC8vUHJvY2Vzc29ycyBjYW4gYmUgc3VwcGxpZWQgYXMgY29uc3RydWN0ZWQgb2JqZWN0cyB3aXRoIGhhbmRsZXJzIGFscmVhZHkgZW1iZWRkZWQsCiAgICAgICAvLyAgaWYgYSBoYW5kbGVyIGlzIHByb3ZpZGVkIHdlIGNvbnN0cnVjdCBhIG5ldyBwcm9jZXNzb3IsIGlmIG5vdCB3ZSB1c2UgdGhlIHByb2Nlc3NvcgogICAgICAgLy8gIG9iamVjdCBkaXJlY3RseQogICAgICAgaWYgKHN2Y09iai5oYW5kbGVyKSB7CkBAIC0zMTUsNyArMzE2LDcgQEAKICAgICBzdmNPYmoudHJhbnNwb3J0ID0gc3ZjT2JqLnRyYW5zcG9ydCA/IHN2Y09iai50cmFuc3BvcnQgOiBUQnVmZmVyZWRUcmFuc3BvcnQ7CiAgICAgc3ZjT2JqLnByb3RvY29sID0gc3ZjT2JqLnByb3RvY29sID8gc3ZjT2JqLnByb3RvY29sIDogVEJpbmFyeVByb3RvY29sOwogICB9Ci0gIAorCiAgIC8vVmVyaWZ5IENPUlMgcmVxdWlyZW1lbnRzCiAgIGZ1bmN0aW9uIFZlcmlmeUNPUlNBbmRTZXRIZWFkZXJzKHJlcXVlc3QsIHJlc3BvbnNlKSB7CiAgICAgaWYgKHJlcXVlc3QuaGVhZGVycy5vcmlnaW4gJiYgb3B0aW9ucy5jb3JzKSB7CkBAIC0zMzQsNyArMzM1LDcgQEAKICAgICAvL0FsbG93LCBDT1JTIGlzIG5vdCBpbiB1c2UKICAgICByZXR1cm4gdHJ1ZTsKICAgfQotICAKKwogCiAgIC8vSGFuZGxlIE9QVElPTlMgbWV0aG9kIChDT1JTKQogICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KQEAgLTM0Niw4ICszNDcsOCBAQAogICAgIH0KICAgICByZXNwb25zZS5lbmQoKTsKICAgfQotICAKLSAgICAKKworCiAgIC8vSGFuZGxlIFBPU1QgbWV0aG9kcyAoVFhIUlRyYW5zcG9ydCkKICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgIGZ1bmN0aW9uIHByb2Nlc3NQb3N0KHJlcXVlc3QsIHJlc3BvbnNlKSB7CkBAIC0zNjYsNyArMzY3LDcgQEAKICAgICAgIHJlc3BvbnNlLmVuZCgpOwogICAgICAgcmV0dXJuOwogICAgIH0KLSAgICAKKwogICAgIC8vUHJvY2VzcyBYSFIgcGF5bG9hZAogICAgIHJlcXVlc3Qub24oJ2RhdGEnLCBzdmMudHJhbnNwb3J0LnJlY2VpdmVyKGZ1bmN0aW9uKHRyYW5zcG9ydFdpdGhEYXRhKSB7CiAgICAgICB2YXIgaW5wdXQgPSBuZXcgc3ZjLnByb3RvY29sKHRyYW5zcG9ydFdpdGhEYXRhKTsKQEAgLTM4NCw3ICszODUsNyBAQAogICAgICAgICBzdmMucHJvY2Vzc29yLnByb2Nlc3MoaW5wdXQsIG91dHB1dCk7CiAgICAgICAgIHRyYW5zcG9ydFdpdGhEYXRhLmNvbW1pdFBvc2l0aW9uKCk7CiAgICAgICB9IGNhdGNoIChlcnIpIHsKLSAgICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIFRUcmFuc3BvcnQuSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yKSB7CisgICAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IpIHsKICAgICAgICAgICB0cmFuc3BvcnRXaXRoRGF0YS5yb2xsYmFja1Bvc2l0aW9uKCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgcmVzcG9uc2Uud3JpdGVIZWFkKDUwMCk7CkBAIC00MDIsNyArNDAzLDcgQEAKICAgICBpZiAoIWJhc2VEaXIgfHwgIiIgPT09IGJhc2VEaXIpIHsKICAgICAgIHJlc3BvbnNlLndyaXRlSGVhZCg0MDQpOwogICAgICAgcmVzcG9uc2UuZW5kKCk7Ci0gICAgICByZXR1cm47ICAgICAgCisgICAgICByZXR1cm47CiAgICAgfQogCiAgICAgLy9WZXJpZnkgQ09SUyByZXF1aXJlbWVudHMKQEAgLTQxNCwxOCArNDE1LDI2IEBACiAKICAgICAvL0xvY2F0ZSB0aGUgZmlsZSByZXF1ZXN0ZWQgYW5kIHNlbmQgaXQKICAgICB2YXIgdXJpID0gdXJsLnBhcnNlKHJlcXVlc3QudXJsKS5wYXRobmFtZTsKLSAgICB2YXIgZmlsZW5hbWUgPSBwYXRoLmpvaW4oYmFzZURpciwgdXJpKTsKKyAgICB2YXIgZmlsZW5hbWUgPSBwYXRoLnJlc29sdmUocGF0aC5qb2luKGJhc2VEaXIsIHVyaSkpOworCisgICAgLy9FbnN1cmUgdGhlIGJhc2VkaXIgcGF0aCBpcyBub3QgYWJsZSB0byBiZSBlc2NhcGVkCisgICAgaWYgKGZpbGVuYW1lLmluZGV4T2YoYmFzZURpcikgIT0gMCkgeworICAgICAgcmVzcG9uc2Uud3JpdGVIZWFkKDQwMCwgIkludmFsaWQgcmVxdWVzdCBwYXRoIiwge30pOworICAgICAgcmVzcG9uc2UuZW5kKCk7CisgICAgICByZXR1cm47CisgICAgfQorCiAgICAgZnMuZXhpc3RzKGZpbGVuYW1lLCBmdW5jdGlvbihleGlzdHMpIHsKICAgICAgIGlmKCFleGlzdHMpIHsKICAgICAgICAgcmVzcG9uc2Uud3JpdGVIZWFkKDQwNCk7CiAgICAgICAgIHJlc3BvbnNlLmVuZCgpOwogICAgICAgICByZXR1cm47CiAgICAgICB9Ci0gICAgIAorCiAgICAgICBpZiAoZnMuc3RhdFN5bmMoZmlsZW5hbWUpLmlzRGlyZWN0b3J5KCkpIHsKICAgICAgICAgZmlsZW5hbWUgKz0gJy9pbmRleC5odG1sJzsKICAgICAgIH0KLSAgICAgCisKICAgICAgIGZzLnJlYWRGaWxlKGZpbGVuYW1lLCAiYmluYXJ5IiwgZnVuY3Rpb24oZXJyLCBmaWxlKSB7CiAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICByZXNwb25zZS53cml0ZUhlYWQoNTAwKTsKQEAgLTQ2Nyw3ICs0NzYsNyBAQAogICAgICAgICB0cmFuc3BvcnRXaXRoRGF0YS5jb21taXRQb3NpdGlvbigpOwogICAgICAgfQogICAgICAgY2F0Y2ggKGVycikgewotICAgICAgICBpZiAoZXJyIGluc3RhbmNlb2YgVFRyYW5zcG9ydC5JbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IpIHsKKyAgICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIElucHV0QnVmZmVyVW5kZXJydW5FcnJvcikgewogICAgICAgICAgIHRyYW5zcG9ydFdpdGhEYXRhLnJvbGxiYWNrUG9zaXRpb24oKTsKICAgICAgICAgfQogICAgICAgICBlbHNlIHsKQEAgLTQ4Niw3ICs0OTUsNyBAQAogICB9CiAKICAgLy9XaXJlIHVwIGxpc3RlbmVycyBmb3IgdXBncmFkZSh0byBXZWJTb2NrZXQpICYgcmVxdWVzdCBtZXRob2RzIGZvcjoKLSAgLy8gICAtIEdFVCBzdGF0aWMgZmlsZXMsIAorICAvLyAgIC0gR0VUIHN0YXRpYyBmaWxlcywKICAgLy8gICAtIFBPU1QgWEhSIFRocmlmdCBzZXJ2aWNlcwogICAvLyAgIC0gT1BUSU9OUyBDT1JTIHJlcXVlc3RzCiAgIHNlcnZlci5vbigncmVxdWVzdCcsIGZ1bmN0aW9uKHJlcXVlc3QsIHJlc3BvbnNlKSB7CkBAIC01MDYsNyArNTE1LDcgQEAKICAgICB0cnkgewogICAgICAgc3ZjID0gc2VydmljZXNbT2JqZWN0LmtleXMoc2VydmljZXMpWzBdXTsKICAgICB9IGNhdGNoKGUpIHsKLSAgICAgIHNvY2tldC53cml0ZSgiSFRUUC8xLjEgNDAzIE5vIEFwYWNoZSBUaHJpZnQgU2VydmljZSBhdmFpbGlibGVcclxuXHJcbiIpOworICAgICAgc29ja2V0LndyaXRlKCJIVFRQLzEuMSA0MDMgTm8gQXBhY2hlIFRocmlmdCBTZXJ2aWNlIGF2YWlsYWJsZVxyXG5cclxuIik7CiAgICAgICByZXR1cm47CiAgICAgfQogICAgIC8vUGVyZm9ybSB1cGdyYWRlCkBAIC01MTYsNiArNTI1LDggQEAKICAgICAgICAgICAgICAgICAgICAiVXBncmFkZTogd2Vic29ja2V0XHJcbiIgKwogICAgICAgICAgICAgICAgICAgICJDb25uZWN0aW9uOiBVcGdyYWRlXHJcbiIgKwogICAgICAgICAgICAgICAgICAgICJTZWMtV2ViU29ja2V0LUFjY2VwdDogIiArIGhhc2guZGlnZXN0KCJiYXNlNjQiKSArICJcclxuIiArCisgICAgICAgICAgICAgICAgICAgIlNlYy1XZWJTb2NrZXQtT3JpZ2luOiAiICsgcmVxdWVzdC5oZWFkZXJzLm9yaWdpbiArICJcclxuIiArCisgICAgICAgICAgICAgICAgICAgIlNlYy1XZWJTb2NrZXQtTG9jYXRpb246IHdzOi8vIiArIHJlcXVlc3QuaGVhZGVycy5ob3N0ICsgcmVxdWVzdC51cmwgKyAiXHJcbiIgKwogICAgICAgICAgICAgICAgICAgICJcclxuIik7CiAgICAgLy9IYW5kbGUgV2ViU29ja2V0IHRyYWZmaWMKICAgICB2YXIgZGF0YSA9IG51bGw7CkBAIC01NDUsNyArNTU2LDcgQEAKICAgICAgICAgICBmcmFtZSA9IHJlc3VsdC5uZXh0RnJhbWU7CiAgICAgICAgIH0KICAgICAgIH0gY2F0Y2goZSkgewotICAgICAgICBjb25zb2xlLmxvZygiVFdlYlNvY2tldFRyYW5zcG9ydCBFeGNlcHRpb246ICIgKyBlKTsKKyAgICAgICAgbG9nLmVycm9yKCdUV2ViU29ja2V0VHJhbnNwb3J0IEV4Y2VwdGlvbjogJyArIGUpOwogICAgICAgICBzb2NrZXQuZGVzdHJveSgpOwogICAgICAgfQogICAgIH0pOwpAQCAtNTU0LDkgKzU2NSwzIEBACiAgIC8vUmV0dXJuIHRoZSBzZXJ2ZXIKICAgcmV0dXJuIHNlcnZlcjsKIH07Ci0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2xpYi90aHJpZnQvd3NfY29ubmVjdGlvbi5qcyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC93c19jb25uZWN0aW9uLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1MmNiZDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvd3NfY29ubmVjdGlvbi5qcwpAQCAtMCwwICsxLDI4NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLwordmFyIHV0aWwgPSByZXF1aXJlKCd1dGlsJyk7Cit2YXIgV2ViU29ja2V0ID0gcmVxdWlyZSgnd3MnKTsKK3ZhciBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCJldmVudHMiKS5FdmVudEVtaXR0ZXI7Cit2YXIgdGhyaWZ0ID0gcmVxdWlyZSgnLi90aHJpZnQnKTsKK3ZhciB0dHJhbnNwb3J0ID0gcmVxdWlyZSgnLi90cmFuc3BvcnQnKTsKK3ZhciB0cHJvdG9jb2wgPSByZXF1aXJlKCcuL3Byb3RvY29sJyk7CisKK3ZhciBUQnVmZmVyZWRUcmFuc3BvcnQgPSByZXF1aXJlKCcuL2J1ZmZlcmVkX3RyYW5zcG9ydCcpOwordmFyIFRKU09OUHJvdG9jb2wgPSByZXF1aXJlKCcuL2pzb25fcHJvdG9jb2wnKTsKK3ZhciBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IgPSByZXF1aXJlKCcuL2lucHV0X2J1ZmZlcl91bmRlcnJ1bl9lcnJvcicpOworCit2YXIgY3JlYXRlQ2xpZW50ID0gcmVxdWlyZSgnLi9jcmVhdGVfY2xpZW50Jyk7CisKK2V4cG9ydHMuV1NDb25uZWN0aW9uID0gV1NDb25uZWN0aW9uOworCisvKioKKyAqIEBjbGFzcworICogQG5hbWUgV1NDb25uZWN0T3B0aW9ucworICogQHByb3BlcnR5IHtzdHJpbmd9IHRyYW5zcG9ydCAtIFRoZSBUaHJpZnQgbGF5ZXJlZCB0cmFuc3BvcnQgdG8gdXNlIChUQnVmZmVyZWRUcmFuc3BvcnQsIGV0YykuCisgKiBAcHJvcGVydHkge3N0cmluZ30gcHJvdG9jb2wgLSBUaGUgVGhyaWZ0IHNlcmlhbGl6YXRpb24gcHJvdG9jb2wgdG8gdXNlIChUSlNPTlByb3RvY29sLCBldGMuKS4KKyAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwYXRoIC0gVGhlIFVSTCBwYXRoIHRvIGNvbm5lY3QgdG8gKGUuZy4gIi8iLCAiL215U3ZjIiwgIi90aHJpZnQvcXVvdGVTdmMiLCBldGMuKS4KKyAqIEBwcm9wZXJ0eSB7b2JqZWN0fSBoZWFkZXJzIC0gQSBzdGFuZGFyZCBOb2RlLmpzIGhlYWRlciBoYXNoLCBhbiBvYmplY3QgaGFzaCBjb250YWluaW5nIGtleS92YWx1ZQorICogICAgICAgIHBhaXJzIHdoZXJlIHRoZSBrZXkgaXMgdGhlIGhlYWRlciBuYW1lIHN0cmluZyBhbmQgdGhlIHZhbHVlIGlzIHRoZSBoZWFkZXIgdmFsdWUgc3RyaW5nLgorICogQHByb3BlcnR5IHtib29sZWFufSBzZWN1cmUgLSBUcnVlIGNhdXNlcyB0aGUgY29ubmVjdGlvbiB0byB1c2Ugd3NzLCBvdGhlcndpc2Ugd3MgaXMgdXNlZC4KKyAqIEBwcm9wZXJ0eSB7b2JqZWN0fSB3c09wdGlvbnMgLSBPcHRpb25zIHBhc3NlZCBvbiB0byBXZWJTb2NrZXQuCisgKiBAZXhhbXBsZQorICogICAgIC8vVXNlIGEgc2VjdXJlZCB3ZWJzb2NrZXQgY29ubmVjdGlvbgorICogICAgIC8vICB1c2VzIHRoZSBidWZmZXJlZCB0cmFuc3BvcnQgbGF5ZXIsIHVzZXMgdGhlIEpTT04gcHJvdG9jb2wgYW5kIGRpcmVjdHMgUlBDIHRyYWZmaWMKKyAqICAgICAvLyAgdG8gd3NzOi8vdGhyaWZ0LmV4YW1wbGUuY29tOjkwOTAvaGVsbG8KKyAqICAgICB2YXIgdGhyaWZ0ID0gcmVxdWlyZSgndGhyaWZ0Jyk7CisgKiAgICAgdmFyIG9wdGlvbnMgPSB7CisgKiAgICAgICAgdHJhbnNwb3J0OiB0aHJpZnQuVEJ1ZmZlcmVkVHJhbnNwb3J0LAorICogICAgICAgIHByb3RvY29sOiB0aHJpZnQuVEpTT05Qcm90b2NvbCwKKyAqICAgICAgICBwYXRoOiAiL2hlbGxvIiwKKyAqICAgICAgICBzZWN1cmU6IHRydWUKKyAqICAgICB9OworICogICAgIHZhciBjb24gPSB0aHJpZnQuY3JlYXRlV1NDb25uZWN0aW9uKCJ0aHJpZnQuZXhhbXBsZS5jb20iLCA5MDkwLCBvcHRpb25zKTsKKyAqICAgICBjb24ub3BlbigpCisgKiAgICAgdmFyIGNsaWVudCA9IHRocmlmdC5jcmVhdGVXU0NsaWVudChteVNlcnZpY2UsIGNvbm5lY3Rpb24pOworICogICAgIGNsaWVudC5teVNlcnZpY2VGdW5jdGlvbigpOworICogICAgIGNvbi5jbG9zZSgpCisgKi8KKworLyoqCisgKiBJbml0aWFsaXplcyBhIFRocmlmdCBXU0Nvbm5lY3Rpb24gaW5zdGFuY2UgKHVzZSBjcmVhdGVXU0Nvbm5lY3Rpb24oKSByYXRoZXIgdGhhbgorICogICAgaW5zdGFudGlhdGluZyBkaXJlY3RseSkuCisgKiBAY29uc3RydWN0b3IKKyAqIEBwYXJhbSB7c3RyaW5nfSBob3N0IC0gVGhlIGhvc3QgbmFtZSBvciBJUCB0byBjb25uZWN0IHRvLgorICogQHBhcmFtIHtudW1iZXJ9IHBvcnQgLSBUaGUgVENQIHBvcnQgdG8gY29ubmVjdCB0by4KKyAqIEBwYXJhbSB7V1NDb25uZWN0T3B0aW9uc30gb3B0aW9ucyAtIFRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gdXNlLgorICogQHRocm93cyB7ZXJyb3J9IEV4Y2VwdGlvbnMgb3RoZXIgdGhhbiB0dHJhbnNwb3J0LklucHV0QnVmZmVyVW5kZXJydW5FcnJvciBhcmUgcmV0aHJvd24KKyAqIEBldmVudCB7ZXJyb3J9IFRoZSAiZXJyb3IiIGV2ZW50IGlzIGZpcmVkIHdoZW4gYSBOb2RlLmpzIGVycm9yIGV2ZW50IG9jY3VycyBkdXJpbmcKKyAqICAgICByZXF1ZXN0IG9yIHJlc3BvbnNlIHByb2Nlc3NpbmcsIGluIHdoaWNoIGNhc2UgdGhlIG5vZGUgZXJyb3IgaXMgcGFzc2VkIG9uLiBBbiAiZXJyb3IiCisgKiAgICAgZXZlbnQgbWF5IGFsc28gYmUgZmlyZWQgd2hlbiB0aGUgY29ubmVjdGlzb24gY2FuIG5vdCBtYXAgYSByZXNwb25zZSBiYWNrIHRvIHRoZQorICogICAgIGFwcHJvcHJpYXRlIGNsaWVudCAoYW4gaW50ZXJuYWwgZXJyb3IpLCBnZW5lcmF0aW5nIGEgVEFwcGxpY2F0aW9uRXhjZXB0aW9uLgorICogQGNsYXNzZGVzYyBXU0Nvbm5lY3Rpb24gb2JqZWN0cyBwcm92aWRlIFRocmlmdCBlbmQgcG9pbnQgdHJhbnNwb3J0CisgKiAgICAgc2VtYW50aWNzIGltcGxlbWVudGVkIHVzaW5nIFdlYnNvY2tldHMuCisgKiBAc2VlIHtAbGluayBjcmVhdGVXU0Nvbm5lY3Rpb259CisgKi8KK2Z1bmN0aW9uIFdTQ29ubmVjdGlvbihob3N0LCBwb3J0LCBvcHRpb25zKSB7CisgIC8vSW5pdGlhbGl6ZSB0aGUgZW1pdHRlciBiYXNlIG9iamVjdAorICBFdmVudEVtaXR0ZXIuY2FsbCh0aGlzKTsKKworICAvL1NldCBjb25maWd1cmF0aW9uCisgIHZhciBzZWxmID0gdGhpczsKKyAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKKyAgdGhpcy5ob3N0ID0gaG9zdDsKKyAgdGhpcy5wb3J0ID0gcG9ydDsKKyAgdGhpcy5zZWN1cmUgPSB0aGlzLm9wdGlvbnMuc2VjdXJlIHx8IGZhbHNlOworICB0aGlzLnRyYW5zcG9ydCA9IHRoaXMub3B0aW9ucy50cmFuc3BvcnQgfHwgVEJ1ZmZlcmVkVHJhbnNwb3J0OworICB0aGlzLnByb3RvY29sID0gdGhpcy5vcHRpb25zLnByb3RvY29sIHx8IFRKU09OUHJvdG9jb2w7CisgIHRoaXMucGF0aCA9IHRoaXMub3B0aW9ucy5wYXRoOworICB0aGlzLnNlbmRfcGVuZGluZyA9IFtdOworCisgIC8vVGhlIHNlcXVlbmNlIG1hcCBpcyB1c2VkIHRvIG1hcCBzZXFJRHMgYmFjayB0byB0aGUKKyAgLy8gIGNhbGxpbmcgY2xpZW50IGluIG11bHRpcGxleGVkIHNjZW5hcmlvcworICB0aGlzLnNlcUlkMlNlcnZpY2UgPSB7fTsKKworICAvL1ByZXBhcmUgV2ViU29ja2V0IG9wdGlvbnMKKyAgdGhpcy53c09wdGlvbnMgPSB7CisgICAgaG9zdDogdGhpcy5ob3N0LAorICAgIHBvcnQ6IHRoaXMucG9ydCB8fCA4MCwKKyAgICBwYXRoOiB0aGlzLm9wdGlvbnMucGF0aCB8fCAnLycsCisgICAgaGVhZGVyczogdGhpcy5vcHRpb25zLmhlYWRlcnMgfHwge30KKyAgfTsKKyAgZm9yICh2YXIgYXR0cm5hbWUgaW4gdGhpcy5vcHRpb25zLndzT3B0aW9ucykgeworICAgIHRoaXMud3NPcHRpb25zW2F0dHJuYW1lXSA9IHRoaXMub3B0aW9ucy53c09wdGlvbnNbYXR0cm5hbWVdOworICB9Cit9OwordXRpbC5pbmhlcml0cyhXU0Nvbm5lY3Rpb24sIEV2ZW50RW1pdHRlcik7CisKK1dTQ29ubmVjdGlvbi5wcm90b3R5cGUuX19yZXNldCA9IGZ1bmN0aW9uKCkgeworICB0aGlzLnNvY2tldCA9IG51bGw7IC8vVGhlIHdlYiBzb2NrZXQKKyAgdGhpcy5zZW5kX3BlbmRpbmcgPSBbXTsgLy9CdWZmZXJzL0NhbGxiYWNrIHBhaXJzIHdhaXRpbmcgdG8gYmUgc2VudAorfTsKKworV1NDb25uZWN0aW9uLnByb3RvdHlwZS5fX29uT3BlbiA9IGZ1bmN0aW9uKCkgeworICB2YXIgc2VsZiA9IHRoaXM7CisgIHRoaXMuZW1pdCgib3BlbiIpOworICBpZiAodGhpcy5zZW5kX3BlbmRpbmcubGVuZ3RoID4gMCkgeworICAgIC8vSWYgdGhlIHVzZXIgbWFkZSBjYWxscyBiZWZvcmUgdGhlIGNvbm5lY3Rpb24gd2FzIGZ1bGx5CisgICAgLy9vcGVuLCBzZW5kIHRoZW0gbm93CisgICAgdGhpcy5zZW5kX3BlbmRpbmcuZm9yRWFjaChmdW5jdGlvbihkYXRhKSB7CisgICAgICBzZWxmLnNvY2tldC5zZW5kKGRhdGEpOworICAgIH0pOworICAgIHRoaXMuc2VuZF9wZW5kaW5nID0gW107CisgIH0KK307CisKK1dTQ29ubmVjdGlvbi5wcm90b3R5cGUuX19vbkNsb3NlID0gZnVuY3Rpb24oZXZ0KSB7CisgIHRoaXMuZW1pdCgiY2xvc2UiKTsKKyAgdGhpcy5fX3Jlc2V0KCk7Cit9OworCitXU0Nvbm5lY3Rpb24ucHJvdG90eXBlLl9fZGVjb2RlQ2FsbGJhY2sgPSBmdW5jdGlvbih0cmFuc3BvcnRfd2l0aF9kYXRhKSB7CisgIHZhciBwcm90byA9IG5ldyB0aGlzLnByb3RvY29sKHRyYW5zcG9ydF93aXRoX2RhdGEpOworICB0cnkgeworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICB2YXIgaGVhZGVyID0gcHJvdG8ucmVhZE1lc3NhZ2VCZWdpbigpOworICAgICAgdmFyIGR1bW15X3NlcWlkID0gaGVhZGVyLnJzZXFpZCAqIC0xOworICAgICAgdmFyIGNsaWVudCA9IHRoaXMuY2xpZW50OworICAgICAgLy9UaGUgTXVsdGlwbGV4ZWQgUHJvdG9jb2wgc3RvcmVzIGEgaGFzaCBvZiBzZXFpZCB0byBzZXJ2aWNlIG5hbWVzCisgICAgICAvLyAgaW4gc2VxSWQyU2VydmljZS4gSWYgdGhlIFNlcUlkIGlzIGZvdW5kIGluIHRoZSBoYXNoIHdlIG5lZWQgdG8KKyAgICAgIC8vICBsb29rdXAgdGhlIGFwcHJvcHJpYXRlIGNsaWVudCBmb3IgdGhpcyBjYWxsLgorICAgICAgLy8gIFRoZSBjbGllbnQgdmFyIGlzIGEgc2luZ2xlIGNsaWVudCBvYmplY3Qgd2hlbiBub3QgbXVsdGlwbGV4aW5nLAorICAgICAgLy8gIHdoZW4gdXNpbmcgbXVsdGlwbGV4aW5nIGl0IGlzIGEgc2VydmljZSBuYW1lIGtleWVkIGhhc2ggb2YgY2xpZW50CisgICAgICAvLyAgb2JqZWN0cy4KKyAgICAgIC8vTk9URTogVGhlIDIgd2F5IGludGVyZGVwZW5kZW5jaWVzIGJldHdlZW4gcHJvdG9jb2xzLCB0cmFuc3BvcnRzLAorICAgICAgLy8gIGNvbm5lY3Rpb25zIGFuZCBjbGllbnRzIGluIHRoZSBOb2RlLmpzIGltcGxlbWVudGF0aW9uIGFyZSBpcnJlZ3VsYXIKKyAgICAgIC8vICBhbmQgbWFrZSB0aGUgaW1wbGVtZW50YXRpb24gZGlmZmljdWx0IHRvIGV4dGVuZCBhbmQgbWFpbnRhaW4uIFdlCisgICAgICAvLyAgc2hvdWxkIGJyaW5nIHRoaXMgc3R1ZmYgaW5saW5lIHdpdGggdHlwaWNhbCB0aHJpZnQgSS9PIHN0YWNrCisgICAgICAvLyAgb3BlcmF0aW9uIHNvb24uCisgICAgICAvLyAgLS1yYQorICAgICAgdmFyIHNlcnZpY2VfbmFtZSA9IHRoaXMuc2VxSWQyU2VydmljZVtoZWFkZXIucnNlcWlkXTsKKyAgICAgIGlmIChzZXJ2aWNlX25hbWUpIHsKKyAgICAgICAgY2xpZW50ID0gdGhpcy5jbGllbnRbc2VydmljZV9uYW1lXTsKKyAgICAgICAgZGVsZXRlIHRoaXMuc2VxSWQyU2VydmljZVtoZWFkZXIucnNlcWlkXTsKKyAgICAgIH0KKyAgICAgIC8qanNoaW50IC1XMDgzICovCisgICAgICBjbGllbnQuX3JlcXNbZHVtbXlfc2VxaWRdID0gZnVuY3Rpb24oZXJyLCBzdWNjZXNzKSB7CisgICAgICAgIHRyYW5zcG9ydF93aXRoX2RhdGEuY29tbWl0UG9zaXRpb24oKTsKKyAgICAgICAgdmFyIGNsaWVudENhbGxiYWNrID0gY2xpZW50Ll9yZXFzW2hlYWRlci5yc2VxaWRdOworICAgICAgICBkZWxldGUgY2xpZW50Ll9yZXFzW2hlYWRlci5yc2VxaWRdOworICAgICAgICBpZiAoY2xpZW50Q2FsbGJhY2spIHsKKyAgICAgICAgICBjbGllbnRDYWxsYmFjayhlcnIsIHN1Y2Nlc3MpOworICAgICAgICB9CisgICAgICB9OworICAgICAgLypqc2hpbnQgK1cwODMgKi8KKyAgICAgIGlmIChjbGllbnRbJ3JlY3ZfJyArIGhlYWRlci5mbmFtZV0pIHsKKyAgICAgICAgY2xpZW50WydyZWN2XycgKyBoZWFkZXIuZm5hbWVdKHByb3RvLCBoZWFkZXIubXR5cGUsIGR1bW15X3NlcWlkKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGRlbGV0ZSBjbGllbnQuX3JlcXNbZHVtbXlfc2VxaWRdOworICAgICAgICB0aGlzLmVtaXQoImVycm9yIiwKKyAgICAgICAgICBuZXcgdGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgIHRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb25UeXBlLldST05HX01FVEhPRF9OQU1FLAorICAgICAgICAgICAgIlJlY2VpdmVkIGEgcmVzcG9uc2UgdG8gYW4gdW5rbm93biBSUEMgZnVuY3Rpb24iKSk7CisgICAgICB9CisgICAgfQorICB9IGNhdGNoIChlKSB7CisgICAgaWYgKGUgaW5zdGFuY2VvZiBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IpIHsKKyAgICAgIHRyYW5zcG9ydF93aXRoX2RhdGEucm9sbGJhY2tQb3NpdGlvbigpOworICAgIH0gZWxzZSB7CisgICAgICB0aHJvdyBlOworICAgIH0KKyAgfQorfTsKKworV1NDb25uZWN0aW9uLnByb3RvdHlwZS5fX29uRGF0YSA9IGZ1bmN0aW9uKGRhdGEpIHsKKyAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChkYXRhKSA9PSAiW29iamVjdCBBcnJheUJ1ZmZlcl0iKSB7CisgICAgZGF0YSA9IG5ldyBVaW50OEFycmF5KGRhdGEpOworICB9CisgIHZhciBidWYgPSBuZXcgQnVmZmVyKGRhdGEpOworICB0aGlzLnRyYW5zcG9ydC5yZWNlaXZlcih0aGlzLl9fZGVjb2RlQ2FsbGJhY2suYmluZCh0aGlzKSkoYnVmKTsKKworfTsKKworV1NDb25uZWN0aW9uLnByb3RvdHlwZS5fX29uTWVzc2FnZSA9IGZ1bmN0aW9uKGV2dCkgeworICB0aGlzLl9fb25EYXRhKGV2dC5kYXRhKTsKK307CisKK1dTQ29ubmVjdGlvbi5wcm90b3R5cGUuX19vbkVycm9yID0gZnVuY3Rpb24oZXZ0KSB7CisgIHRoaXMuZW1pdCgiZXJyb3IiLCBldnQpOworICB0aGlzLnNvY2tldC5jbG9zZSgpOworfTsKKworLyoqCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHRyYW5zcG9ydCBpcyBvcGVuCisgKiBAcmVhZG9ubHkKKyAqIEByZXR1cm5zIHtib29sZWFufQorICovCitXU0Nvbm5lY3Rpb24ucHJvdG90eXBlLmlzT3BlbiA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4gdGhpcy5zb2NrZXQgJiYgdGhpcy5zb2NrZXQucmVhZHlTdGF0ZSA9PSB0aGlzLnNvY2tldC5PUEVOOworfTsKKworLyoqCisgKiBPcGVucyB0aGUgdHJhbnNwb3J0IGNvbm5lY3Rpb24KKyAqLworV1NDb25uZWN0aW9uLnByb3RvdHlwZS5vcGVuID0gZnVuY3Rpb24oKSB7CisgIC8vSWYgT1BFTi9DT05ORUNUSU5HL0NMT1NJTkcgaWdub3JlIGFkZGl0aW9uYWwgb3BlbnMKKyAgaWYgKHRoaXMuc29ja2V0ICYmIHRoaXMuc29ja2V0LnJlYWR5U3RhdGUgIT0gdGhpcy5zb2NrZXQuQ0xPU0VEKSB7CisgICAgcmV0dXJuOworICB9CisgIC8vSWYgdGhlcmUgaXMgbm8gc29ja2V0IG9yIHRoZSBzb2NrZXQgaXMgY2xvc2VkOgorICB0aGlzLnNvY2tldCA9IG5ldyBXZWJTb2NrZXQodGhpcy51cmkoKSwgIiIsIHRoaXMud3NPcHRpb25zKTsKKyAgdGhpcy5zb2NrZXQuYmluYXJ5VHlwZSA9ICdhcnJheWJ1ZmZlcic7CisgIHRoaXMuc29ja2V0Lm9ub3BlbiA9IHRoaXMuX19vbk9wZW4uYmluZCh0aGlzKTsKKyAgdGhpcy5zb2NrZXQub25tZXNzYWdlID0gdGhpcy5fX29uTWVzc2FnZS5iaW5kKHRoaXMpOworICB0aGlzLnNvY2tldC5vbmVycm9yID0gdGhpcy5fX29uRXJyb3IuYmluZCh0aGlzKTsKKyAgdGhpcy5zb2NrZXQub25jbG9zZSA9IHRoaXMuX19vbkNsb3NlLmJpbmQodGhpcyk7Cit9OworCisvKioKKyAqIENsb3NlcyB0aGUgdHJhbnNwb3J0IGNvbm5lY3Rpb24KKyAqLworV1NDb25uZWN0aW9uLnByb3RvdHlwZS5jbG9zZSA9IGZ1bmN0aW9uKCkgeworICB0aGlzLnNvY2tldC5jbG9zZSgpOworfTsKKworLyoqCisgKiBSZXR1cm4gVVJJIGZvciB0aGUgY29ubmVjdGlvbgorICogQHJldHVybnMge3N0cmluZ30gVVJJCisgKi8KK1dTQ29ubmVjdGlvbi5wcm90b3R5cGUudXJpID0gZnVuY3Rpb24oKSB7CisgIHZhciBzY2hlbWEgPSB0aGlzLnNlY3VyZSA/ICd3c3MnIDogJ3dzJzsKKyAgdmFyIHBvcnQgPSAnJzsKKyAgdmFyIHBhdGggPSB0aGlzLnBhdGggfHwgJy8nOworICB2YXIgaG9zdCA9IHRoaXMuaG9zdDsKKworICAvLyBhdm9pZCBwb3J0IGlmIGRlZmF1bHQgZm9yIHNjaGVtYQorICBpZiAodGhpcy5wb3J0ICYmICgoJ3dzcycgPT0gc2NoZW1hICYmIHRoaXMucG9ydCAhPSA0NDMpIHx8CisgICAgKCd3cycgPT0gc2NoZW1hICYmIHRoaXMucG9ydCAhPSA4MCkpKSB7CisgICAgcG9ydCA9ICc6JyArIHRoaXMucG9ydDsKKyAgfQorCisgIHJldHVybiBzY2hlbWEgKyAnOi8vJyArIGhvc3QgKyBwb3J0ICsgcGF0aDsKK307CisKKy8qKgorICogV3JpdGVzIFRocmlmdCBtZXNzYWdlIGRhdGEgdG8gdGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSB7QnVmZmVyfSBkYXRhIC0gQSBOb2RlLmpzIEJ1ZmZlciBjb250YWluaW5nIHRoZSBkYXRhIHRvIHdyaXRlCisgKiBAcmV0dXJucyB7dm9pZH0gTm8gcmV0dXJuIHZhbHVlLgorICogQGV2ZW50IHtlcnJvcn0gdGhlICJlcnJvciIgZXZlbnQgaXMgcmFpc2VkIHVwb24gcmVxdWVzdCBmYWlsdXJlIHBhc3NpbmcgdGhlCisgKiAgICAgTm9kZS5qcyBlcnJvciBvYmplY3QgdG8gdGhlIGxpc3RlbmVyLgorICovCitXU0Nvbm5lY3Rpb24ucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24oZGF0YSkgeworICBpZiAodGhpcy5pc09wZW4oKSkgeworICAgIC8vU2VuZCBkYXRhIGFuZCByZWdpc3RlciBhIGNhbGxiYWNrIHRvIGludm9rZSB0aGUgY2xpZW50IGNhbGxiYWNrCisgICAgdGhpcy5zb2NrZXQuc2VuZChkYXRhKTsKKyAgfSBlbHNlIHsKKyAgICAvL1F1ZXVlIHRoZSBzZW5kIHRvIGdvIG91dCBfX29uT3BlbgorICAgIHRoaXMuc2VuZF9wZW5kaW5nLnB1c2goZGF0YSk7CisgIH0KK307CisKKy8qKgorICogQ3JlYXRlcyBhIG5ldyBXU0Nvbm5lY3Rpb24gb2JqZWN0LCB1c2VkIGJ5IFRocmlmdCBjbGllbnRzIHRvIGNvbm5lY3QKKyAqICAgIHRvIFRocmlmdCBIVFRQIGJhc2VkIHNlcnZlcnMuCisgKiBAcGFyYW0ge3N0cmluZ30gaG9zdCAtIFRoZSBob3N0IG5hbWUgb3IgSVAgdG8gY29ubmVjdCB0by4KKyAqIEBwYXJhbSB7bnVtYmVyfSBwb3J0IC0gVGhlIFRDUCBwb3J0IHRvIGNvbm5lY3QgdG8uCisgKiBAcGFyYW0ge1dTQ29ubmVjdE9wdGlvbnN9IG9wdGlvbnMgLSBUaGUgY29uZmlndXJhdGlvbiBvcHRpb25zIHRvIHVzZS4KKyAqIEByZXR1cm5zIHtXU0Nvbm5lY3Rpb259IFRoZSBjb25uZWN0aW9uIG9iamVjdC4KKyAqIEBzZWUge0BsaW5rIFdTQ29ubmVjdE9wdGlvbnN9CisgKi8KK2V4cG9ydHMuY3JlYXRlV1NDb25uZWN0aW9uID0gZnVuY3Rpb24oaG9zdCwgcG9ydCwgb3B0aW9ucykgeworICByZXR1cm4gbmV3IFdTQ29ubmVjdGlvbihob3N0LCBwb3J0LCBvcHRpb25zKTsKK307CisKK2V4cG9ydHMuY3JlYXRlV1NDbGllbnQgPSBjcmVhdGVDbGllbnQ7CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2xpYi90aHJpZnQvd3NfdHJhbnNwb3J0LmpzIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L3dzX3RyYW5zcG9ydC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTEzYjg0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L3dzX3RyYW5zcG9ydC5qcwpAQCAtMCwwICsxLDIwNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit2YXIgbG9nID0gcmVxdWlyZSgnLi9sb2cnKTsKKworbW9kdWxlLmV4cG9ydHMgPSBUV2ViU29ja2V0VHJhbnNwb3J0OworCisvKioKKyAqIENvbnN0cnVjdG9yIEZ1bmN0aW9uIGZvciB0aGUgV2ViU29ja2V0IHRyYW5zcG9ydC4KKyAqIEBjb25zdHJ1Y3RvcgorICogQHBhcmFtIHtzdHJpbmd9IFt1cmxdIC0gVGhlIFVSTCB0byBjb25uZWN0IHRvLgorICogQGNsYXNzZGVzYyBUaGUgQXBhY2hlIFRocmlmdCBUcmFuc3BvcnQgbGF5ZXIgcGVyZm9ybXMgYnl0ZSBsZXZlbCBJL08KKyAqIGJldHdlZW4gUlBDIGNsaWVudHMgYW5kIHNlcnZlcnMuIFRoZSBKYXZhU2NyaXB0IFRXZWJTb2NrZXRUcmFuc3BvcnQgb2JqZWN0CisgKiB1c2VzIHRoZSBXZWJTb2NrZXQgcHJvdG9jb2wuIFRhcmdldCBzZXJ2ZXJzIG11c3QgaW1wbGVtZW50IFdlYlNvY2tldC4KKyAqIChzZWU6IG5vZGUuanMgZXhhbXBsZSBzZXJ2ZXJfaHR0cC5qcykuCisgKiBAZXhhbXBsZQorICogICB2YXIgdHJhbnNwb3J0ID0gbmV3IFRocmlmdC5UV2ViU29ja2V0VHJhbnNwb3J0KCJodHRwOi8vbG9jYWxob3N0Ojg1ODUiKTsKKyAqLworZnVuY3Rpb24gVFdlYlNvY2tldFRyYW5zcG9ydCh1cmwpIHsKKyAgICB0aGlzLl9fcmVzZXQodXJsKTsKK307CisKKworVFdlYlNvY2tldFRyYW5zcG9ydC5wcm90b3R5cGUuX19yZXNldCA9IGZ1bmN0aW9uKHVybCkgeworICB0aGlzLnVybCA9IHVybDsgICAgICAgICAgICAgLy9XaGVyZSB0byBjb25uZWN0CisgIHRoaXMuc29ja2V0ID0gbnVsbDsgICAgICAgICAvL1RoZSB3ZWIgc29ja2V0CisgIHRoaXMuY2FsbGJhY2tzID0gW107ICAgICAgICAvL1BlbmRpbmcgY2FsbGJhY2tzCisgIHRoaXMuc2VuZF9wZW5kaW5nID0gW107ICAgICAvL0J1ZmZlcnMvQ2FsbGJhY2sgcGFpcnMgd2FpdGluZyB0byBiZSBzZW50CisgIHRoaXMuc2VuZF9idWYgPSAnJzsgICAgICAgICAvL091dGJvdW5kIGRhdGEsIGltbXV0YWJsZSB1bnRpbCBzZW50CisgIHRoaXMucmVjdl9idWYgPSAnJzsgICAgICAgICAvL0luYm91bmQgZGF0YQorICB0aGlzLnJiX3dwb3MgPSAwOyAgICAgICAgICAgLy9OZXR3b3JrIHdyaXRlIHBvc2l0aW9uIGluIHJlY2VpdmUgYnVmZmVyCisgIHRoaXMucmJfcnBvcyA9IDA7ICAgICAgICAgICAvL0NsaWVudCByZWFkIHBvc2l0aW9uIGluIHJlY2VpdmUgYnVmZmVyCit9OworCisvKioKKyAqIFNlbmRzIHRoZSBjdXJyZW50IFdTIHJlcXVlc3QgYW5kIHJlZ2lzdGVycyBjYWxsYmFjay4gVGhlIGFzeW5jCisgKiBwYXJhbWV0ZXIgaXMgaWdub3JlZCAoV1MgZmx1c2ggaXMgYWx3YXlzIGFzeW5jKSBhbmQgdGhlIGNhbGxiYWNrCisgKiBmdW5jdGlvbiBwYXJhbWV0ZXIgaXMgcmVxdWlyZWQuCisgKiBAcGFyYW0ge29iamVjdH0gYXN5bmMgLSBJZ25vcmVkLgorICogQHBhcmFtIHtvYmplY3R9IGNhbGxiYWNrIC0gVGhlIGNsaWVudCBjb21wbGV0aW9uIGNhbGxiYWNrLgorICogQHJldHVybnMge3VuZGVmaW5lZHxzdHJpbmd9IE5vdGhpbmcgKHVuZGVmaW5lZCkKKyAqLworVFdlYlNvY2tldFRyYW5zcG9ydC5wcm90b3R5cGUuZmx1c2ggPSBmdW5jdGlvbihhc3luYywgY2FsbGJhY2spIHsKKyAgdmFyIHNlbGYgPSB0aGlzOworICBpZiAodGhpcy5pc09wZW4oKSkgeworICAgIC8vU2VuZCBkYXRhIGFuZCByZWdpc3RlciBhIGNhbGxiYWNrIHRvIGludm9rZSB0aGUgY2xpZW50IGNhbGxiYWNrCisgICAgdGhpcy5zb2NrZXQuc2VuZCh0aGlzLnNlbmRfYnVmKTsKKyAgICB0aGlzLmNhbGxiYWNrcy5wdXNoKChmdW5jdGlvbigpIHsKKyAgICAgIHZhciBjbGllbnRDYWxsYmFjayA9IGNhbGxiYWNrOworICAgICAgcmV0dXJuIGZ1bmN0aW9uKG1zZykgeworICAgICAgICBzZWxmLnNldFJlY3ZCdWZmZXIobXNnKTsKKyAgICAgICAgY2xpZW50Q2FsbGJhY2soKTsKKyAgICAgIH07CisgICAgfSgpKSk7CisgIH0gZWxzZSB7CisgICAgLy9RdWV1ZSB0aGUgc2VuZCB0byBnbyBvdXQgX19vbk9wZW4KKyAgICB0aGlzLnNlbmRfcGVuZGluZy5wdXNoKHsKKyAgICAgIGJ1ZjogdGhpcy5zZW5kX2J1ZiwKKyAgICAgIGNiOiAgY2FsbGJhY2sKKyAgICB9KTsKKyAgfQorfTsKKworVFdlYlNvY2tldFRyYW5zcG9ydC5wcm90b3R5cGUuX19vbk9wZW4gPSBmdW5jdGlvbigpIHsKKyAgIHZhciBzZWxmID0gdGhpczsKKyAgIGlmICh0aGlzLnNlbmRfcGVuZGluZy5sZW5ndGggPiAwKSB7CisgICAgICAvL0lmIHRoZSB1c2VyIG1hZGUgY2FsbHMgYmVmb3JlIHRoZSBjb25uZWN0aW9uIHdhcyBmdWxseQorICAgICAgLy9vcGVuLCBzZW5kIHRoZW0gbm93CisgICAgICB0aGlzLnNlbmRfcGVuZGluZy5mb3JFYWNoKGZ1bmN0aW9uKGVsZW0pIHsKKyAgICAgICAgIHRoaXMuc29ja2V0LnNlbmQoZWxlbS5idWYpOworICAgICAgICAgdGhpcy5jYWxsYmFja3MucHVzaCgoZnVuY3Rpb24oKSB7CisgICAgICAgICAgIHZhciBjbGllbnRDYWxsYmFjayA9IGVsZW0uY2I7CisgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihtc2cpIHsKKyAgICAgICAgICAgICAgc2VsZi5zZXRSZWN2QnVmZmVyKG1zZyk7CisgICAgICAgICAgICAgIGNsaWVudENhbGxiYWNrKCk7CisgICAgICAgICAgIH07CisgICAgICAgICB9KCkpKTsKKyAgICAgIH0pOworICAgICAgdGhpcy5zZW5kX3BlbmRpbmcgPSBbXTsKKyAgIH0KK307CisKK1RXZWJTb2NrZXRUcmFuc3BvcnQucHJvdG90eXBlLl9fb25DbG9zZSA9IGZ1bmN0aW9uKGV2dCkgeworICB0aGlzLl9fcmVzZXQodGhpcy51cmwpOworfTsKKworVFdlYlNvY2tldFRyYW5zcG9ydC5wcm90b3R5cGUuX19vbk1lc3NhZ2UgPSBmdW5jdGlvbihldnQpIHsKKyAgaWYgKHRoaXMuY2FsbGJhY2tzLmxlbmd0aCkgeworICAgIHRoaXMuY2FsbGJhY2tzLnNoaWZ0KCkoZXZ0LmRhdGEpOworICB9Cit9OworCitUV2ViU29ja2V0VHJhbnNwb3J0LnByb3RvdHlwZS5fX29uRXJyb3IgPSBmdW5jdGlvbihldnQpIHsKKyAgbG9nLmVycm9yKCd3ZWJzb2NrZXQ6ICcgKyBldnQudG9TdHJpbmcoKSk7CisgIHRoaXMuc29ja2V0LmNsb3NlKCk7Cit9OworCisvKioKKyAqIFNldHMgdGhlIGJ1ZmZlciB0byB1c2Ugd2hlbiByZWNlaXZpbmcgc2VydmVyIHJlc3BvbnNlcy4KKyAqIEBwYXJhbSB7c3RyaW5nfSBidWYgLSBUaGUgYnVmZmVyIHRvIHJlY2VpdmUgc2VydmVyIHJlc3BvbnNlcy4KKyAqLworVFdlYlNvY2tldFRyYW5zcG9ydC5wcm90b3R5cGUuc2V0UmVjdkJ1ZmZlciA9IGZ1bmN0aW9uKGJ1ZikgeworICB0aGlzLnJlY3ZfYnVmID0gYnVmOworICB0aGlzLnJlY3ZfYnVmX3N6ID0gdGhpcy5yZWN2X2J1Zi5sZW5ndGg7CisgIHRoaXMud3BvcyA9IHRoaXMucmVjdl9idWYubGVuZ3RoOworICB0aGlzLnJwb3MgPSAwOworfTsKKworLyoqCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHRyYW5zcG9ydCBpcyBvcGVuCisgKiBAcmVhZG9ubHkKKyAqIEByZXR1cm5zIHtib29sZWFufQorICovCitUV2ViU29ja2V0VHJhbnNwb3J0LnByb3RvdHlwZS5pc09wZW4gPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIHRoaXMuc29ja2V0ICYmIHRoaXMuc29ja2V0LnJlYWR5U3RhdGUgPT0gdGhpcy5zb2NrZXQuT1BFTjsKK307CisKKy8qKgorICogT3BlbnMgdGhlIHRyYW5zcG9ydCBjb25uZWN0aW9uCisgKi8KK1RXZWJTb2NrZXRUcmFuc3BvcnQucHJvdG90eXBlLm9wZW4gPSBmdW5jdGlvbigpIHsKKyAgLy9JZiBPUEVOL0NPTk5FQ1RJTkcvQ0xPU0lORyBpZ25vcmUgYWRkaXRpb25hbCBvcGVucworICBpZiAodGhpcy5zb2NrZXQgJiYgdGhpcy5zb2NrZXQucmVhZHlTdGF0ZSAhPSB0aGlzLnNvY2tldC5DTE9TRUQpIHsKKyAgICByZXR1cm47CisgIH0KKyAgLy9JZiB0aGVyZSBpcyBubyBzb2NrZXQgb3IgdGhlIHNvY2tldCBpcyBjbG9zZWQ6CisgIHRoaXMuc29ja2V0ID0gbmV3IFdlYlNvY2tldCh0aGlzLnVybCk7CisgIHRoaXMuc29ja2V0Lm9ub3BlbiA9IHRoaXMuX19vbk9wZW4uYmluZCh0aGlzKTsKKyAgdGhpcy5zb2NrZXQub25tZXNzYWdlID0gdGhpcy5fX29uTWVzc2FnZS5iaW5kKHRoaXMpOworICB0aGlzLnNvY2tldC5vbmVycm9yID0gdGhpcy5fX29uRXJyb3IuYmluZCh0aGlzKTsKKyAgdGhpcy5zb2NrZXQub25jbG9zZSA9IHRoaXMuX19vbkNsb3NlLmJpbmQodGhpcyk7Cit9OworCisvKioKKyAqIENsb3NlcyB0aGUgdHJhbnNwb3J0IGNvbm5lY3Rpb24KKyAqLworVFdlYlNvY2tldFRyYW5zcG9ydC5wcm90b3R5cGUuY2xvc2UgPSBmdW5jdGlvbigpIHsKKyAgdGhpcy5zb2NrZXQuY2xvc2UoKTsKK307CisKKy8qKgorICogUmV0dXJucyB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIHJlc3BvbnNlCisgKiBidWZmZXIuCisgKiBAcGFyYW0ge251bWJlcn0gbGVuIC0gVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHJldHVybi4KKyAqIEByZXR1cm5zIHtzdHJpbmd9IENoYXJhY3RlcnMgc2VudCBieSB0aGUgc2VydmVyLgorICovCitUV2ViU29ja2V0VHJhbnNwb3J0LnByb3RvdHlwZS5yZWFkID0gZnVuY3Rpb24obGVuKSB7CisgIHZhciBhdmFpbCA9IHRoaXMud3BvcyAtIHRoaXMucnBvczsKKworICBpZiAoYXZhaWwgPT09IDApIHsKKyAgICByZXR1cm4gJyc7CisgIH0KKworICB2YXIgZ2l2ZSA9IGxlbjsKKworICBpZiAoYXZhaWwgPCBsZW4pIHsKKyAgICBnaXZlID0gYXZhaWw7CisgIH0KKworICB2YXIgcmV0ID0gdGhpcy5yZWFkX2J1Zi5zdWJzdHIodGhpcy5ycG9zLCBnaXZlKTsKKyAgdGhpcy5ycG9zICs9IGdpdmU7CisKKyAgLy9jbGVhciBidWYgd2hlbiBjb21wbGV0ZT8KKyAgcmV0dXJuIHJldDsKK307CisKKy8qKgorICogUmV0dXJucyB0aGUgZW50aXJlIHJlc3BvbnNlIGJ1ZmZlci4KKyAqIEByZXR1cm5zIHtzdHJpbmd9IENoYXJhY3RlcnMgc2VudCBieSB0aGUgc2VydmVyLgorICovCitUV2ViU29ja2V0VHJhbnNwb3J0LnByb3RvdHlwZS5yZWFkQWxsID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB0aGlzLnJlY3ZfYnVmOworfTsKKworLyoqCisgKiBTZXRzIHRoZSBzZW5kIGJ1ZmZlciB0byBidWYuCisgKiBAcGFyYW0ge3N0cmluZ30gYnVmIC0gVGhlIGJ1ZmZlciB0byBzZW5kLgorICovCitUV2ViU29ja2V0VHJhbnNwb3J0LnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKGJ1ZikgeworICB0aGlzLnNlbmRfYnVmID0gYnVmOworfTsKKworLyoqCisgKiBSZXR1cm5zIHRoZSBzZW5kIGJ1ZmZlci4KKyAqIEByZWFkb25seQorICogQHJldHVybnMge3N0cmluZ30gVGhlIHNlbmQgYnVmZmVyLgorICovCitUV2ViU29ja2V0VHJhbnNwb3J0LnByb3RvdHlwZS5nZXRTZW5kQnVmZmVyID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB0aGlzLnNlbmRfYnVmOworfTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvbGliL3RocmlmdC94aHJfY29ubmVjdGlvbi5qcyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC94aHJfY29ubmVjdGlvbi5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDU5YzkwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L3hocl9jb25uZWN0aW9uLmpzCkBAIC0wLDAgKzEsMjgwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCit2YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTsKK3ZhciBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCJldmVudHMiKS5FdmVudEVtaXR0ZXI7Cit2YXIgdGhyaWZ0ID0gcmVxdWlyZSgnLi90aHJpZnQnKTsKKwordmFyIFRCdWZmZXJlZFRyYW5zcG9ydCA9IHJlcXVpcmUoJy4vYnVmZmVyZWRfdHJhbnNwb3J0Jyk7Cit2YXIgVEpTT05Qcm90b2NvbCA9IHJlcXVpcmUoJy4vanNvbl9wcm90b2NvbCcpOwordmFyIElucHV0QnVmZmVyVW5kZXJydW5FcnJvciA9IHJlcXVpcmUoJy4vaW5wdXRfYnVmZmVyX3VuZGVycnVuX2Vycm9yJyk7CisKK3ZhciBjcmVhdGVDbGllbnQgPSByZXF1aXJlKCcuL2NyZWF0ZV9jbGllbnQnKTsKKworZXhwb3J0cy5YSFJDb25uZWN0aW9uID0gWEhSQ29ubmVjdGlvbjsKKworLyoqCisgKiBDb25zdHJ1Y3RvciBGdW5jdGlvbiBmb3IgdGhlIFhIUiBDb25uZWN0aW9uLgorICogSWYgeW91IGRvIG5vdCBzcGVjaWZ5IGEgaG9zdCBhbmQgcG9ydCB0aGVuIFhIUkNvbm5lY3Rpb24gd2lsbCBkZWZhdWx0IHRvIHRoZQorICogaG9zdCBhbmQgcG9ydCBvZiB0aGUgcGFnZSBmcm9tIHdoaWNoIHRoaXMgamF2YXNjcmlwdCBpcyBzZXJ2ZWQuCisgKiBAY29uc3RydWN0b3IKKyAqIEBwYXJhbSB7c3RyaW5nfSBbdXJsXSAtIFRoZSBVUkwgdG8gY29ubmVjdCB0by4KKyAqIEBjbGFzc2Rlc2MgVFhIUkNvbm5lY3Rpb24gb2JqZWN0cyBwcm92aWRlIFRocmlmdCBlbmQgcG9pbnQgdHJhbnNwb3J0CisgKiAgICAgc2VtYW50aWNzIGltcGxlbWVudGVkIHVzaW5nIFhIUi4KKyAqIEBleGFtcGxlCisgKiAgICAgdmFyIHRyYW5zcG9ydCA9IG5ldyBUaHJpZnQuVFhIUkNvbm5lY3Rpb24oJ2xvY2FsaG9zdCcsIDkwOTksIHt9KTsKKyAqLworZnVuY3Rpb24gWEhSQ29ubmVjdGlvbihob3N0LCBwb3J0LCBvcHRpb25zKSB7CisgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwge307CisgIHRoaXMud3BvcyA9IDA7CisgIHRoaXMucnBvcyA9IDA7CisgIHRoaXMudXNlQ09SUyA9IChvcHRpb25zICYmIG9wdGlvbnMudXNlQ09SUyk7CisgIHRoaXMuc2VuZF9idWYgPSAnJzsKKyAgdGhpcy5yZWN2X2J1ZiA9ICcnOworICB0aGlzLnRyYW5zcG9ydCA9IG9wdGlvbnMudHJhbnNwb3J0IHx8IFRCdWZmZXJlZFRyYW5zcG9ydDsKKyAgdGhpcy5wcm90b2NvbCA9IG9wdGlvbnMucHJvdG9jb2wgfHwgVEpTT05Qcm90b2NvbDsKKyAgdGhpcy5oZWFkZXJzID0gb3B0aW9ucy5oZWFkZXJzIHx8IHt9OworCisgIGhvc3QgPSBob3N0IHx8IHdpbmRvdy5sb2NhdGlvbi5ob3N0OworICBwb3J0ID0gcG9ydCB8fCB3aW5kb3cubG9jYXRpb24ucG9ydDsKKyAgdmFyIHByZWZpeCA9IG9wdGlvbnMuaHR0cHMgPyAnaHR0cHM6Ly8nIDogJ2h0dHA6Ly8nOworICB2YXIgcGF0aCA9IG9wdGlvbnMucGF0aCB8fCAnLyc7CisKKyAgaWYgKHBvcnQgPT09ICcnKSB7CisgICAgcG9ydCA9IHVuZGVmaW5lZDsKKyAgfQorCisgIGlmICghcG9ydCB8fCBwb3J0ID09PSA4MCB8fCBwb3J0ID09PSAnODAnKSB7CisgICAgdGhpcy51cmwgPSBwcmVmaXggKyBob3N0ICsgcGF0aDsKKyAgfSBlbHNlIHsKKyAgICB0aGlzLnVybCA9IHByZWZpeCArIGhvc3QgKyAnOicgKyBwb3J0ICsgcGF0aDsKKyAgfQorCisgIC8vVGhlIHNlcXVlbmNlIG1hcCBpcyB1c2VkIHRvIG1hcCBzZXFJRHMgYmFjayB0byB0aGUKKyAgLy8gIGNhbGxpbmcgY2xpZW50IGluIG11bHRpcGxleGVkIHNjZW5hcmlvcworICB0aGlzLnNlcUlkMlNlcnZpY2UgPSB7fTsKK307CisKK3V0aWwuaW5oZXJpdHMoWEhSQ29ubmVjdGlvbiwgRXZlbnRFbWl0dGVyKTsKKworLyoqCisqIEdldHMgdGhlIGJyb3dzZXIgc3BlY2lmaWMgWG1sSHR0cFJlcXVlc3QgT2JqZWN0LgorKiBAcmV0dXJucyB7b2JqZWN0fSB0aGUgYnJvd3NlciBYSFIgaW50ZXJmYWNlIG9iamVjdAorKi8KK1hIUkNvbm5lY3Rpb24ucHJvdG90eXBlLmdldFhtbEh0dHBSZXF1ZXN0T2JqZWN0ID0gZnVuY3Rpb24oKSB7CisgIHRyeSB7IHJldHVybiBuZXcgWE1MSHR0cFJlcXVlc3QoKTsgfSBjYXRjaCAoZTEpIHsgfQorICB0cnkgeyByZXR1cm4gbmV3IEFjdGl2ZVhPYmplY3QoJ01zeG1sMi5YTUxIVFRQJyk7IH0gY2F0Y2ggKGUyKSB7IH0KKyAgdHJ5IHsgcmV0dXJuIG5ldyBBY3RpdmVYT2JqZWN0KCdNaWNyb3NvZnQuWE1MSFRUUCcpOyB9IGNhdGNoIChlMykgeyB9CisKKyAgdGhyb3cgIllvdXIgYnJvd3NlciBkb2Vzbid0IHN1cHBvcnQgWEhSLiI7Cit9OworCisvKioKKyAqIFNlbmRzIHRoZSBjdXJyZW50IFhSSCByZXF1ZXN0IGlmIHRoZSB0cmFuc3BvcnQgd2FzIGNyZWF0ZWQgd2l0aCBhIFVSTAorICogYW5kIHRoZSBhc3luYyBwYXJhbWV0ZXIgaXMgZmFsc2UuIElmIHRoZSB0cmFuc3BvcnQgd2FzIG5vdCBjcmVhdGVkIHdpdGgKKyAqIGEgVVJMLCBvciB0aGUgYXN5bmMgcGFyYW1ldGVyIGlzIFRydWUgYW5kIG5vIGNhbGxiYWNrIGlzIHByb3ZpZGVkLCBvcgorICogdGhlIFVSTCBpcyBhbiBlbXB0eSBzdHJpbmcsIHRoZSBjdXJyZW50IHNlbmQgYnVmZmVyIGlzIHJldHVybmVkLgorICogQHBhcmFtIHtvYmplY3R9IGFzeW5jIC0gSWYgdHJ1ZSB0aGUgY3VycmVudCBzZW5kIGJ1ZmZlciBpcyByZXR1cm5lZC4KKyAqIEBwYXJhbSB7b2JqZWN0fSBjYWxsYmFjayAtIE9wdGlvbmFsIGFzeW5jIGNvbXBsZXRpb24gY2FsbGJhY2sKKyAqIEByZXR1cm5zIHt1bmRlZmluZWR8c3RyaW5nfSBOb3RoaW5nIG9yIHRoZSBjdXJyZW50IHNlbmQgYnVmZmVyLgorICogQHRocm93cyB7c3RyaW5nfSBJZiBYSFIgZmFpbHMuCisgKi8KK1hIUkNvbm5lY3Rpb24ucHJvdG90eXBlLmZsdXNoID0gZnVuY3Rpb24oKSB7CisgIHZhciBzZWxmID0gdGhpczsKKyAgaWYgKHRoaXMudXJsID09PSB1bmRlZmluZWQgfHwgdGhpcy51cmwgPT09ICcnKSB7CisgICAgcmV0dXJuIHRoaXMuc2VuZF9idWY7CisgIH0KKworICB2YXIgeHJlcSA9IHRoaXMuZ2V0WG1sSHR0cFJlcXVlc3RPYmplY3QoKTsKKworICBpZiAoeHJlcS5vdmVycmlkZU1pbWVUeXBlKSB7CisgICAgeHJlcS5vdmVycmlkZU1pbWVUeXBlKCdhcHBsaWNhdGlvbi9qc29uJyk7CisgIH0KKworICB4cmVxLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKCkgeworICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT0gNCAmJiB0aGlzLnN0YXR1cyA9PSAyMDApIHsKKyAgICAgIHNlbGYuc2V0UmVjdkJ1ZmZlcih0aGlzLnJlc3BvbnNlVGV4dCk7CisgICAgfQorICB9OworCisgIHhyZXEub3BlbignUE9TVCcsIHRoaXMudXJsLCB0cnVlKTsKKworICBPYmplY3Qua2V5cyh0aGlzLmhlYWRlcnMpLmZvckVhY2goZnVuY3Rpb24oaGVhZGVyS2V5KSB7CisgICAgeHJlcS5zZXRSZXF1ZXN0SGVhZGVyKGhlYWRlcktleSwgc2VsZi5oZWFkZXJzW2hlYWRlcktleV0pOworICB9KTsKKworICB4cmVxLnNlbmQodGhpcy5zZW5kX2J1Zik7Cit9OworCisvKioKKyAqIFNldHMgdGhlIGJ1ZmZlciB0byBwcm92aWRlIHRoZSBwcm90b2NvbCB3aGVuIGRlc2VyaWFsaXppbmcuCisgKiBAcGFyYW0ge3N0cmluZ30gYnVmIC0gVGhlIGJ1ZmZlciB0byBzdXBwbHkgdGhlIHByb3RvY29sLgorICovCitYSFJDb25uZWN0aW9uLnByb3RvdHlwZS5zZXRSZWN2QnVmZmVyID0gZnVuY3Rpb24oYnVmKSB7CisgIHRoaXMucmVjdl9idWYgPSBidWY7CisgIHRoaXMucmVjdl9idWZfc3ogPSB0aGlzLnJlY3ZfYnVmLmxlbmd0aDsKKyAgdGhpcy53cG9zID0gdGhpcy5yZWN2X2J1Zi5sZW5ndGg7CisgIHRoaXMucnBvcyA9IDA7CisKKyAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChidWYpID09ICJbb2JqZWN0IEFycmF5QnVmZmVyXSIpIHsKKyAgICB2YXIgZGF0YSA9IG5ldyBVaW50OEFycmF5KGJ1Zik7CisgIH0KKyAgdmFyIHRoaW5nID0gbmV3IEJ1ZmZlcihkYXRhIHx8IGJ1Zik7CisKKyAgdGhpcy50cmFuc3BvcnQucmVjZWl2ZXIodGhpcy5fX2RlY29kZUNhbGxiYWNrLmJpbmQodGhpcykpKHRoaW5nKTsKKworfTsKKworWEhSQ29ubmVjdGlvbi5wcm90b3R5cGUuX19kZWNvZGVDYWxsYmFjayA9IGZ1bmN0aW9uKHRyYW5zcG9ydF93aXRoX2RhdGEpIHsKKyAgdmFyIHByb3RvID0gbmV3IHRoaXMucHJvdG9jb2wodHJhbnNwb3J0X3dpdGhfZGF0YSk7CisgIHRyeSB7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHZhciBoZWFkZXIgPSBwcm90by5yZWFkTWVzc2FnZUJlZ2luKCk7CisgICAgICB2YXIgZHVtbXlfc2VxaWQgPSBoZWFkZXIucnNlcWlkICogLTE7CisgICAgICB2YXIgY2xpZW50ID0gdGhpcy5jbGllbnQ7CisgICAgICAvL1RoZSBNdWx0aXBsZXhlZCBQcm90b2NvbCBzdG9yZXMgYSBoYXNoIG9mIHNlcWlkIHRvIHNlcnZpY2UgbmFtZXMKKyAgICAgIC8vICBpbiBzZXFJZDJTZXJ2aWNlLiBJZiB0aGUgU2VxSWQgaXMgZm91bmQgaW4gdGhlIGhhc2ggd2UgbmVlZCB0bworICAgICAgLy8gIGxvb2t1cCB0aGUgYXBwcm9wcmlhdGUgY2xpZW50IGZvciB0aGlzIGNhbGwuCisgICAgICAvLyAgVGhlIGNsaWVudCB2YXIgaXMgYSBzaW5nbGUgY2xpZW50IG9iamVjdCB3aGVuIG5vdCBtdWx0aXBsZXhpbmcsCisgICAgICAvLyAgd2hlbiB1c2luZyBtdWx0aXBsZXhpbmcgaXQgaXMgYSBzZXJ2aWNlIG5hbWUga2V5ZWQgaGFzaCBvZiBjbGllbnQKKyAgICAgIC8vICBvYmplY3RzLgorICAgICAgLy9OT1RFOiBUaGUgMiB3YXkgaW50ZXJkZXBlbmRlbmNpZXMgYmV0d2VlbiBwcm90b2NvbHMsIHRyYW5zcG9ydHMsCisgICAgICAvLyAgY29ubmVjdGlvbnMgYW5kIGNsaWVudHMgaW4gdGhlIE5vZGUuanMgaW1wbGVtZW50YXRpb24gYXJlIGlycmVndWxhcgorICAgICAgLy8gIGFuZCBtYWtlIHRoZSBpbXBsZW1lbnRhdGlvbiBkaWZmaWN1bHQgdG8gZXh0ZW5kIGFuZCBtYWludGFpbi4gV2UKKyAgICAgIC8vICBzaG91bGQgYnJpbmcgdGhpcyBzdHVmZiBpbmxpbmUgd2l0aCB0eXBpY2FsIHRocmlmdCBJL08gc3RhY2sKKyAgICAgIC8vICBvcGVyYXRpb24gc29vbi4KKyAgICAgIC8vICAtLXJhCisgICAgICB2YXIgc2VydmljZV9uYW1lID0gdGhpcy5zZXFJZDJTZXJ2aWNlW2hlYWRlci5yc2VxaWRdOworICAgICAgaWYgKHNlcnZpY2VfbmFtZSkgeworICAgICAgICBjbGllbnQgPSB0aGlzLmNsaWVudFtzZXJ2aWNlX25hbWVdOworICAgICAgICBkZWxldGUgdGhpcy5zZXFJZDJTZXJ2aWNlW2hlYWRlci5yc2VxaWRdOworICAgICAgfQorICAgICAgLypqc2hpbnQgLVcwODMgKi8KKyAgICAgIGNsaWVudC5fcmVxc1tkdW1teV9zZXFpZF0gPSBmdW5jdGlvbihlcnIsIHN1Y2Nlc3MpIHsKKyAgICAgICAgdHJhbnNwb3J0X3dpdGhfZGF0YS5jb21taXRQb3NpdGlvbigpOworICAgICAgICB2YXIgY2xpZW50Q2FsbGJhY2sgPSBjbGllbnQuX3JlcXNbaGVhZGVyLnJzZXFpZF07CisgICAgICAgIGRlbGV0ZSBjbGllbnQuX3JlcXNbaGVhZGVyLnJzZXFpZF07CisgICAgICAgIGlmIChjbGllbnRDYWxsYmFjaykgeworICAgICAgICAgIGNsaWVudENhbGxiYWNrKGVyciwgc3VjY2Vzcyk7CisgICAgICAgIH0KKyAgICAgIH07CisgICAgICAvKmpzaGludCArVzA4MyAqLworICAgICAgaWYgKGNsaWVudFsncmVjdl8nICsgaGVhZGVyLmZuYW1lXSkgeworICAgICAgICBjbGllbnRbJ3JlY3ZfJyArIGhlYWRlci5mbmFtZV0ocHJvdG8sIGhlYWRlci5tdHlwZSwgZHVtbXlfc2VxaWQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZGVsZXRlIGNsaWVudC5fcmVxc1tkdW1teV9zZXFpZF07CisgICAgICAgIHRoaXMuZW1pdCgiZXJyb3IiLAorICAgICAgICAgIG5ldyB0aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgdGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvblR5cGUuV1JPTkdfTUVUSE9EX05BTUUsCisgICAgICAgICAgICAiUmVjZWl2ZWQgYSByZXNwb25zZSB0byBhbiB1bmtub3duIFJQQyBmdW5jdGlvbiIpKTsKKyAgICAgIH0KKyAgICB9CisgIH0gY2F0Y2ggKGUpIHsKKyAgICBpZiAoZSBpbnN0YW5jZW9mIElucHV0QnVmZmVyVW5kZXJydW5FcnJvcikgeworICAgICAgdHJhbnNwb3J0X3dpdGhfZGF0YS5yb2xsYmFja1Bvc2l0aW9uKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHRocm93IGU7CisgICAgfQorICB9Cit9OworCisvKioKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdHJhbnNwb3J0IGlzIG9wZW4sIFhIUiBhbHdheXMgcmV0dXJucyB0cnVlLgorICogQHJlYWRvbmx5CisgKiBAcmV0dXJucyB7Ym9vbGVhbn0gQWx3YXlzIFRydWUuCisgKi8KK1hIUkNvbm5lY3Rpb24ucHJvdG90eXBlLmlzT3BlbiA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4gdHJ1ZTsKK307CisKKy8qKgorICogT3BlbnMgdGhlIHRyYW5zcG9ydCBjb25uZWN0aW9uLCB3aXRoIFhIUiB0aGlzIGlzIGEgbm9wLgorICovCitYSFJDb25uZWN0aW9uLnByb3RvdHlwZS5vcGVuID0gZnVuY3Rpb24oKSB7fTsKKworLyoqCisgKiBDbG9zZXMgdGhlIHRyYW5zcG9ydCBjb25uZWN0aW9uLCB3aXRoIFhIUiB0aGlzIGlzIGEgbm9wLgorICovCitYSFJDb25uZWN0aW9uLnByb3RvdHlwZS5jbG9zZSA9IGZ1bmN0aW9uKCkge307CisKKy8qKgorICogUmV0dXJucyB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIHJlc3BvbnNlCisgKiBidWZmZXIuCisgKiBAcGFyYW0ge251bWJlcn0gbGVuIC0gVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHJldHVybi4KKyAqIEByZXR1cm5zIHtzdHJpbmd9IENoYXJhY3RlcnMgc2VudCBieSB0aGUgc2VydmVyLgorICovCitYSFJDb25uZWN0aW9uLnByb3RvdHlwZS5yZWFkID0gZnVuY3Rpb24obGVuKSB7CisgIHZhciBhdmFpbCA9IHRoaXMud3BvcyAtIHRoaXMucnBvczsKKworICBpZiAoYXZhaWwgPT09IDApIHsKKyAgICByZXR1cm4gJyc7CisgIH0KKworICB2YXIgZ2l2ZSA9IGxlbjsKKworICBpZiAoYXZhaWwgPCBsZW4pIHsKKyAgICBnaXZlID0gYXZhaWw7CisgIH0KKworICB2YXIgcmV0ID0gdGhpcy5yZWFkX2J1Zi5zdWJzdHIodGhpcy5ycG9zLCBnaXZlKTsKKyAgdGhpcy5ycG9zICs9IGdpdmU7CisKKyAgLy9jbGVhciBidWYgd2hlbiBjb21wbGV0ZT8KKyAgcmV0dXJuIHJldDsKK307CisKKy8qKgorICogUmV0dXJucyB0aGUgZW50aXJlIHJlc3BvbnNlIGJ1ZmZlci4KKyAqIEByZXR1cm5zIHtzdHJpbmd9IENoYXJhY3RlcnMgc2VudCBieSB0aGUgc2VydmVyLgorICovCitYSFJDb25uZWN0aW9uLnByb3RvdHlwZS5yZWFkQWxsID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB0aGlzLnJlY3ZfYnVmOworfTsKKworLyoqCisgKiBTZXRzIHRoZSBzZW5kIGJ1ZmZlciB0byBidWYuCisgKiBAcGFyYW0ge3N0cmluZ30gYnVmIC0gVGhlIGJ1ZmZlciB0byBzZW5kLgorICovCitYSFJDb25uZWN0aW9uLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKGJ1ZikgeworICB0aGlzLnNlbmRfYnVmID0gYnVmOworICB0aGlzLmZsdXNoKCk7Cit9OworCisvKioKKyAqIFJldHVybnMgdGhlIHNlbmQgYnVmZmVyLgorICogQHJlYWRvbmx5CisgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgc2VuZCBidWZmZXIuCisgKi8KK1hIUkNvbm5lY3Rpb24ucHJvdG90eXBlLmdldFNlbmRCdWZmZXIgPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIHRoaXMuc2VuZF9idWY7Cit9OworCisvKioKKyAqIENyZWF0ZXMgYSBuZXcgVFhIUlRyYW5zcG9ydCBvYmplY3QsIHVzZWQgYnkgVGhyaWZ0IGNsaWVudHMgdG8gY29ubmVjdAorICogICAgdG8gVGhyaWZ0IEhUVFAgYmFzZWQgc2VydmVycy4KKyAqIEBwYXJhbSB7c3RyaW5nfSBob3N0IC0gVGhlIGhvc3QgbmFtZSBvciBJUCB0byBjb25uZWN0IHRvLgorICogQHBhcmFtIHtudW1iZXJ9IHBvcnQgLSBUaGUgVENQIHBvcnQgdG8gY29ubmVjdCB0by4KKyAqIEBwYXJhbSB7WEhSQ29ubmVjdE9wdGlvbnN9IG9wdGlvbnMgLSBUaGUgY29uZmlndXJhdGlvbiBvcHRpb25zIHRvIHVzZS4KKyAqIEByZXR1cm5zIHtYSFJDb25uZWN0aW9ufSBUaGUgY29ubmVjdGlvbiBvYmplY3QuCisgKiBAc2VlIHtAbGluayBYSFJDb25uZWN0T3B0aW9uc30KKyAqLworZXhwb3J0cy5jcmVhdGVYSFJDb25uZWN0aW9uID0gZnVuY3Rpb24oaG9zdCwgcG9ydCwgb3B0aW9ucykgeworICByZXR1cm4gbmV3IFhIUkNvbm5lY3Rpb24oaG9zdCwgcG9ydCwgb3B0aW9ucyk7Cit9OworCitleHBvcnRzLmNyZWF0ZVhIUkNsaWVudCA9IGNyZWF0ZUNsaWVudDsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvcGFja2FnZS5qc29uIGIvbGliL25vZGVqcy9wYWNrYWdlLmpzb24KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE2MTY2NWQuLjAwMDAwMDAKLS0tIGEvbGliL25vZGVqcy9wYWNrYWdlLmpzb24KKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi17Ci0gICJuYW1lIjogInRocmlmdCIsCi0gICJkZXNjcmlwdGlvbiI6ICJub2RlLmpzIGJpbmRpbmdzIGZvciB0aGUgQXBhY2hlIFRocmlmdCBSUEMgc3lzdGVtIiwKLSAgImhvbWVwYWdlIjogImh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZy8iLAotICAicmVwb3NpdG9yeSI6Ci0gICAgeyAidHlwZSIgOiAiZ2l0IiwKLSAgICAgICJ1cmwiIDogImh0dHBzOi8vZ2l0LXdpcC11cy5hcGFjaGUub3JnL3JlcG9zL2FzZi90aHJpZnQuZ2l0IgotICAgIH0sCi0gICJ2ZXJzaW9uIjogIjAuOS4yIiwKLSAgImF1dGhvciI6Ci0gICAgeyAibmFtZSI6ICJBcGFjaGUgVGhyaWZ0IERldmVsb3BlcnMiLAotICAgICAgImVtYWlsIjogImRldkB0aHJpZnQuYXBhY2hlLm9yZyIsCi0gICAgICAidXJsIjogImh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZyIKLSAgICB9LAotICAibGljZW5zZXMiOgotICAgIFsgeyAidHlwZSI6ICJBcGFjaGUtMi4wIiwKLSAgICAgICAgInVybCI6ICJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiCi0gICAgICB9Ci0gICAgXSwKLSAgImJ1Z3MiOgotICAgIHsgIm1haWwiOiAiZGV2QHRocmlmdC5hcGFjaGUub3JnIiwKLSAgICAgICJ1cmwiOiAiaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQiCi0gICAgfSwKLSAgImRpcmVjdG9yaWVzIiA6IHsgImxpYiIgOiAiLi9saWIvdGhyaWZ0IiB9LAotICAibWFpbiI6ICIuL2xpYi90aHJpZnQiLAotICAiZW5naW5lcyI6IHsgIm5vZGUiOiAiPj0gMC4yLjQiIH0sCi0gICJkZXBlbmRlbmNpZXMiOiB7Ci0gICAgIm5vZGUtaW50NjQiOiAifjAuMy4wIiwKLQkicSI6ICIxLjAueCIsCi0gICAgIm5vZGV1bml0IjogIn4wLjguMCIKLSAgfSwKLSAgImRldkRlcGVuZGVuY2llcyI6IHsKLSAgICAiY29ubmVjdCI6ICIyLjcueCIsCi0gICAgImNvbW1hbmRlciI6ICIyLjEueCIKLSAgfSwKLSAgInNjcmlwdHMiOiB7Ci0gICAgInRlc3QiIDogInRlc3QvdGVzdEFsbC5zaCIKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy90ZXN0L2JpbmFyeS50ZXN0LmpzIGIvbGliL25vZGVqcy90ZXN0L2JpbmFyeS50ZXN0LmpzCmluZGV4IGM3ZjZmNzIuLjE4N2NkMTggMTAwNjQ0Ci0tLSBhL2xpYi9ub2RlanMvdGVzdC9iaW5hcnkudGVzdC5qcworKysgYi9saWIvbm9kZWpzL3Rlc3QvYmluYXJ5LnRlc3QuanMKQEAgLTE3LDExNyArMTcsMTk4IEBACiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi12YXIgdGVzdENhc2UgPSByZXF1aXJlKCdub2RldW5pdCcpLnRlc3RDYXNlOwotdmFyIGJpbmFyeSA9IHJlcXVpcmUoJ3RocmlmdC9iaW5hcnknKTsKK2NvbnN0IHRlc3QgPSByZXF1aXJlKCJ0YXBlIik7Citjb25zdCBiaW5hcnkgPSByZXF1aXJlKCJ0aHJpZnQvYmluYXJ5Iik7CiAKLW1vZHVsZS5leHBvcnRzID0gdGVzdENhc2UoewotICAiU2hvdWxkIHJlYWQgc2lnbmVkIGJ5dGUiOiBmdW5jdGlvbih0ZXN0KXsKLSAgICB0ZXN0LmVxdWFsKDEsIGJpbmFyeS5yZWFkQnl0ZShbMHgwMV0pKTsKLSAgICB0ZXN0LmVxdWFsKC0xLCBiaW5hcnkucmVhZEJ5dGUoWzB4RkZdKSk7Ci0gICAgCi0gICAgdGVzdC5lcXVhbCgxMjcsIGJpbmFyeS5yZWFkQnl0ZShbMHg3Rl0pKTsKLSAgICB0ZXN0LmVxdWFsKC0xMjgsIGJpbmFyeS5yZWFkQnl0ZShbMHg4MF0pKTsKLSAgICB0ZXN0LmRvbmUoKTsKK2NvbnN0IGNhc2VzID0geworICAiU2hvdWxkIHJlYWQgc2lnbmVkIGJ5dGUiOiBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXF1YWwoMSwgYmluYXJ5LnJlYWRCeXRlKDB4MDEpKTsKKyAgICBhc3NlcnQuZXF1YWwoLTEsIGJpbmFyeS5yZWFkQnl0ZSgweGZmKSk7CisKKyAgICBhc3NlcnQuZXF1YWwoMTI3LCBiaW5hcnkucmVhZEJ5dGUoMHg3ZikpOworICAgIGFzc2VydC5lcXVhbCgtMTI4LCBiaW5hcnkucmVhZEJ5dGUoMHg4MCkpOworICAgIGFzc2VydC5lbmQoKTsKICAgfSwKLSAgIlNob3VsZCB3cml0ZSBieXRlIjogZnVuY3Rpb24odGVzdCl7Ci0gIAkvL1Byb3RvY29sIHNpbXBseSB3cml0ZXMgdG8gdGhlIGJ1ZmZlci4gTm90aGluZyB0byB0ZXN0Li4geWV0LgotICAJdGVzdC5vayh0cnVlKTsKLSAgCXRlc3QuZG9uZSgpOworICAiU2hvdWxkIHdyaXRlIGJ5dGUiOiBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICAvL1Byb3RvY29sIHNpbXBseSB3cml0ZXMgdG8gdGhlIGJ1ZmZlci4gTm90aGluZyB0byB0ZXN0Li4geWV0LgorICAgIGFzc2VydC5vayh0cnVlKTsKKyAgICBhc3NlcnQuZW5kKCk7CiAgIH0sCi0gICJTaG91bGQgcmVhZCBJMTYiOiBmdW5jdGlvbih0ZXN0KSB7Ci0gICAgdGVzdC5lcXVhbCgwLCBiaW5hcnkucmVhZEkxNihbMHgwMCwgMHgwMF0pKTsKLSAgICB0ZXN0LmVxdWFsKDEsIGJpbmFyeS5yZWFkSTE2KFsweDAwLCAweDAxXSkpOwotICAgIHRlc3QuZXF1YWwoLTEsIGJpbmFyeS5yZWFkSTE2KFsweGZmLCAweGZmXSkpOworICAiU2hvdWxkIHJlYWQgSTE2IjogZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmVxdWFsKDAsIGJpbmFyeS5yZWFkSTE2KFsweDAwLCAweDAwXSkpOworICAgIGFzc2VydC5lcXVhbCgxLCBiaW5hcnkucmVhZEkxNihbMHgwMCwgMHgwMV0pKTsKKyAgICBhc3NlcnQuZXF1YWwoLTEsIGJpbmFyeS5yZWFkSTE2KFsweGZmLCAweGZmXSkpOwogCiAgICAgLy8gTWluIEkxNgotICAgIHRlc3QuZXF1YWwoLTMyNzY4LCBiaW5hcnkucmVhZEkxNihbMHg4MCwgMHgwMF0pKTsKKyAgICBhc3NlcnQuZXF1YWwoLTMyNzY4LCBiaW5hcnkucmVhZEkxNihbMHg4MCwgMHgwMF0pKTsKICAgICAvLyBNYXggSTE2Ci0gICAgdGVzdC5lcXVhbCgzMjc2NywgYmluYXJ5LnJlYWRJMTYoWzB4N2YsIDB4ZmZdKSk7Ci0gICAgdGVzdC5kb25lKCk7CisgICAgYXNzZXJ0LmVxdWFsKDMyNzY3LCBiaW5hcnkucmVhZEkxNihbMHg3ZiwgMHhmZl0pKTsKKyAgICBhc3NlcnQuZW5kKCk7CiAgIH0sCiAKLSAgIlNob3VsZCB3cml0ZSBJMTYiOiBmdW5jdGlvbih0ZXN0KSB7Ci0gICAgdGVzdC5kZWVwRXF1YWwoWzB4MDAsIDB4MDBdLCBiaW5hcnkud3JpdGVJMTYoW10sIDApKTsKLSAgICB0ZXN0LmRlZXBFcXVhbChbMHgwMCwgMHgwMV0sIGJpbmFyeS53cml0ZUkxNihbXSwgMSkpOwotICAgIHRlc3QuZGVlcEVxdWFsKFsweGZmLCAweGZmXSwgYmluYXJ5LndyaXRlSTE2KFtdLCAtMSkpOworICAiU2hvdWxkIHdyaXRlIEkxNiI6IGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5kZWVwRXF1YWwoWzB4MDAsIDB4MDBdLCBiaW5hcnkud3JpdGVJMTYoW10sIDApKTsKKyAgICBhc3NlcnQuZGVlcEVxdWFsKFsweDAwLCAweDAxXSwgYmluYXJ5LndyaXRlSTE2KFtdLCAxKSk7CisgICAgYXNzZXJ0LmRlZXBFcXVhbChbMHhmZiwgMHhmZl0sIGJpbmFyeS53cml0ZUkxNihbXSwgLTEpKTsKIAogICAgIC8vIE1pbiBJMTYKLSAgICB0ZXN0LmRlZXBFcXVhbChbMHg4MCwgMHgwMF0sIGJpbmFyeS53cml0ZUkxNihbXSwgLTMyNzY4KSk7CisgICAgYXNzZXJ0LmRlZXBFcXVhbChbMHg4MCwgMHgwMF0sIGJpbmFyeS53cml0ZUkxNihbXSwgLTMyNzY4KSk7CiAgICAgLy8gTWF4IEkxNgotICAgIHRlc3QuZGVlcEVxdWFsKFsweDdmLCAweGZmXSwgYmluYXJ5LndyaXRlSTE2KFtdLCAzMjc2NykpOwotICAgIHRlc3QuZG9uZSgpOworICAgIGFzc2VydC5kZWVwRXF1YWwoWzB4N2YsIDB4ZmZdLCBiaW5hcnkud3JpdGVJMTYoW10sIDMyNzY3KSk7CisgICAgYXNzZXJ0LmVuZCgpOwogICB9LAogCi0gICJTaG91bGQgcmVhZCBJMzIiOiBmdW5jdGlvbih0ZXN0KSB7Ci0gICAgdGVzdC5lcXVhbCgwLCBiaW5hcnkucmVhZEkzMihbMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0pKTsKLSAgICB0ZXN0LmVxdWFsKDEsIGJpbmFyeS5yZWFkSTMyKFsweDAwLCAweDAwLCAweDAwLCAweDAxXSkpOwotICAgIHRlc3QuZXF1YWwoLTEsIGJpbmFyeS5yZWFkSTMyKFsweGZmLCAweGZmLCAweGZmLCAweGZmXSkpOworICAiU2hvdWxkIHJlYWQgSTMyIjogZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmVxdWFsKDAsIGJpbmFyeS5yZWFkSTMyKFsweDAwLCAweDAwLCAweDAwLCAweDAwXSkpOworICAgIGFzc2VydC5lcXVhbCgxLCBiaW5hcnkucmVhZEkzMihbMHgwMCwgMHgwMCwgMHgwMCwgMHgwMV0pKTsKKyAgICBhc3NlcnQuZXF1YWwoLTEsIGJpbmFyeS5yZWFkSTMyKFsweGZmLCAweGZmLCAweGZmLCAweGZmXSkpOwogCiAgICAgLy8gTWluIEkzMgotICAgIHRlc3QuZXF1YWwoLTIxNDc0ODM2NDgsIGJpbmFyeS5yZWFkSTMyKFsweDgwLCAweDAwLCAweDAwLCAweDAwXSkpOworICAgIGFzc2VydC5lcXVhbCgtMjE0NzQ4MzY0OCwgYmluYXJ5LnJlYWRJMzIoWzB4ODAsIDB4MDAsIDB4MDAsIDB4MDBdKSk7CiAgICAgLy8gTWF4IEkzMgotICAgIHRlc3QuZXF1YWwoMjE0NzQ4MzY0NywgYmluYXJ5LnJlYWRJMzIoWzB4N2YsIDB4ZmYsIDB4ZmYsIDB4ZmZdKSk7Ci0gICAgdGVzdC5kb25lKCk7CisgICAgYXNzZXJ0LmVxdWFsKDIxNDc0ODM2NDcsIGJpbmFyeS5yZWFkSTMyKFsweDdmLCAweGZmLCAweGZmLCAweGZmXSkpOworICAgIGFzc2VydC5lbmQoKTsKICAgfSwKIAotICAiU2hvdWxkIHdyaXRlIEkzMiI6IGZ1bmN0aW9uKHRlc3QpIHsKLSAgICB0ZXN0LmRlZXBFcXVhbChbMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0sIGJpbmFyeS53cml0ZUkzMihbXSwgMCkpOwotICAgIHRlc3QuZGVlcEVxdWFsKFsweDAwLCAweDAwLCAweDAwLCAweDAxXSwgYmluYXJ5LndyaXRlSTMyKFtdLCAxKSk7Ci0gICAgdGVzdC5kZWVwRXF1YWwoWzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZdLCBiaW5hcnkud3JpdGVJMzIoW10sIC0xKSk7CisgICJTaG91bGQgd3JpdGUgSTMyIjogZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmRlZXBFcXVhbChbMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0sIGJpbmFyeS53cml0ZUkzMihbXSwgMCkpOworICAgIGFzc2VydC5kZWVwRXF1YWwoWzB4MDAsIDB4MDAsIDB4MDAsIDB4MDFdLCBiaW5hcnkud3JpdGVJMzIoW10sIDEpKTsKKyAgICBhc3NlcnQuZGVlcEVxdWFsKFsweGZmLCAweGZmLCAweGZmLCAweGZmXSwgYmluYXJ5LndyaXRlSTMyKFtdLCAtMSkpOwogCiAgICAgLy8gTWluIEkzMgotICAgIHRlc3QuZGVlcEVxdWFsKFsweDgwLCAweDAwLCAweDAwLCAweDAwXSwgYmluYXJ5LndyaXRlSTMyKFtdLCAtMjE0NzQ4MzY0OCkpOworICAgIGFzc2VydC5kZWVwRXF1YWwoCisgICAgICBbMHg4MCwgMHgwMCwgMHgwMCwgMHgwMF0sCisgICAgICBiaW5hcnkud3JpdGVJMzIoW10sIC0yMTQ3NDgzNjQ4KQorICAgICk7CiAgICAgLy8gTWF4IEkzMgotICAgIHRlc3QuZGVlcEVxdWFsKFsweDdmLCAweGZmLCAweGZmLCAweGZmXSwgYmluYXJ5LndyaXRlSTMyKFtdLCAyMTQ3NDgzNjQ3KSk7Ci0gCXRlc3QuZG9uZSgpOworICAgIGFzc2VydC5kZWVwRXF1YWwoWzB4N2YsIDB4ZmYsIDB4ZmYsIDB4ZmZdLCBiaW5hcnkud3JpdGVJMzIoW10sIDIxNDc0ODM2NDcpKTsKKyAgICBhc3NlcnQuZW5kKCk7CiAgIH0sCiAKLSAgIlNob3VsZCByZWFkIGRvdWJsZXMiOiBmdW5jdGlvbih0ZXN0KSB7Ci0gICAgdGVzdC5lcXVhbCgwLCBiaW5hcnkucmVhZERvdWJsZShbMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0pKQotICAgIHRlc3QuZXF1YWwoMCwgYmluYXJ5LnJlYWREb3VibGUoWzB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdKSkKLSAgICB0ZXN0LmVxdWFsKDEsIGJpbmFyeS5yZWFkRG91YmxlKFsweDNmLCAweGYwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwXSkpCi0gICAgdGVzdC5lcXVhbCgyLCBiaW5hcnkucmVhZERvdWJsZShbMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0pKQotICAgIHRlc3QuZXF1YWwoLTIsIGJpbmFyeS5yZWFkRG91YmxlKFsweGMwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwXSkpCisgICJTaG91bGQgcmVhZCBkb3VibGVzIjogZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmVxdWFsKAorICAgICAgMCwKKyAgICAgIGJpbmFyeS5yZWFkRG91YmxlKFsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwXSkKKyAgICApOworICAgIGFzc2VydC5lcXVhbCgKKyAgICAgIDAsCisgICAgICBiaW5hcnkucmVhZERvdWJsZShbMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0pCisgICAgKTsKKyAgICBhc3NlcnQuZXF1YWwoCisgICAgICAxLAorICAgICAgYmluYXJ5LnJlYWREb3VibGUoWzB4M2YsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdKQorICAgICk7CisgICAgYXNzZXJ0LmVxdWFsKAorICAgICAgMiwKKyAgICAgIGJpbmFyeS5yZWFkRG91YmxlKFsweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwXSkKKyAgICApOworICAgIGFzc2VydC5lcXVhbCgKKyAgICAgIC0yLAorICAgICAgYmluYXJ5LnJlYWREb3VibGUoWzB4YzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdKQorICAgICk7CiAKLSAgICB0ZXN0LmVxdWFsKE1hdGguUEksIGJpbmFyeS5yZWFkRG91YmxlKFsweDQwLCAweDksIDB4MjEsIDB4ZmIsIDB4NTQsIDB4NDQsIDB4MmQsIDB4MThdKSkKKyAgICBhc3NlcnQuZXF1YWwoCisgICAgICBNYXRoLlBJLAorICAgICAgYmluYXJ5LnJlYWREb3VibGUoWzB4NDAsIDB4OSwgMHgyMSwgMHhmYiwgMHg1NCwgMHg0NCwgMHgyZCwgMHgxOF0pCisgICAgKTsKIAotICAgIHRlc3QuZXF1YWwoSW5maW5pdHksIGJpbmFyeS5yZWFkRG91YmxlKFsweDdmLCAweGYwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwXSkpCi0gICAgdGVzdC5lcXVhbCgtSW5maW5pdHksIGJpbmFyeS5yZWFkRG91YmxlKFsweGZmLCAweGYwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwXSkpCisgICAgYXNzZXJ0LmVxdWFsKAorICAgICAgSW5maW5pdHksCisgICAgICBiaW5hcnkucmVhZERvdWJsZShbMHg3ZiwgMHhmMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0pCisgICAgKTsKKyAgICBhc3NlcnQuZXF1YWwoCisgICAgICAtSW5maW5pdHksCisgICAgICBiaW5hcnkucmVhZERvdWJsZShbMHhmZiwgMHhmMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0pCisgICAgKTsKIAotICAgIHRlc3Qub2soaXNOYU4oYmluYXJ5LnJlYWREb3VibGUoWzB4N2YsIDB4ZjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdKSkpCisgICAgYXNzZXJ0Lm9rKAorICAgICAgaXNOYU4oYmluYXJ5LnJlYWREb3VibGUoWzB4N2YsIDB4ZjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdKSkKKyAgICApOwogCi0gICAgdGVzdC5lcXVhbCgxLzMsIGJpbmFyeS5yZWFkRG91YmxlKFsweDNmLCAweGQ1LCAweDU1LCAweDU1LCAweDU1LCAweDU1LCAweDU1LCAweDU1XSkpCisgICAgYXNzZXJ0LmVxdWFsKAorICAgICAgMSAvIDMsCisgICAgICBiaW5hcnkucmVhZERvdWJsZShbMHgzZiwgMHhkNSwgMHg1NSwgMHg1NSwgMHg1NSwgMHg1NSwgMHg1NSwgMHg1NV0pCisgICAgKTsKIAogICAgIC8vIE1pbiBzdWJub3JtYWwgcG9zaXRpdmUgZG91YmxlCi0gICAgdGVzdC5lcXVhbCg0Ljk0MDY1NjQ1ODQxMjQ2NTRlLTMyNCwgYmluYXJ5LnJlYWREb3VibGUoWzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDFdKSkKKyAgICBhc3NlcnQuZXF1YWwoCisgICAgICA0Ljk0MDY1NjQ1ODQxMjQ2NTRlLTMyNCwKKyAgICAgIGJpbmFyeS5yZWFkRG91YmxlKFsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxXSkKKyAgICApOwogICAgIC8vIE1pbiBub3JtYWwgcG9zaXRpdmUgZG91YmxlCi0gICAgdGVzdC5lcXVhbCgyLjIyNTA3Mzg1ODUwNzIwMTRlLTMwOCwgYmluYXJ5LnJlYWREb3VibGUoWzB4MDAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdKSkKKyAgICBhc3NlcnQuZXF1YWwoCisgICAgICAyLjIyNTA3Mzg1ODUwNzIwMTRlLTMwOCwKKyAgICAgIGJpbmFyeS5yZWFkRG91YmxlKFsweDAwLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwXSkKKyAgICApOwogICAgIC8vIE1heCBwb3NpdGl2ZSBkb3VibGUKLSAgICB0ZXN0LmVxdWFsKDEuNzk3NjkzMTM0ODYyMzE1N2UzMDgsIGJpbmFyeS5yZWFkRG91YmxlKFsweDdmLCAweGVmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmXSkpCi0gIAl0ZXN0LmRvbmUoKTsKKyAgICBhc3NlcnQuZXF1YWwoCisgICAgICAxLjc5NzY5MzEzNDg2MjMxNTdlMzA4LAorICAgICAgYmluYXJ5LnJlYWREb3VibGUoWzB4N2YsIDB4ZWYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZdKQorICAgICk7CisgICAgYXNzZXJ0LmVuZCgpOwogICB9LAogCi0gICJTaG91bGQgd3JpdGUgZG91YmxlcyI6IGZ1bmN0aW9uKHRlc3QpIHsKLSAgICB0ZXN0LmRlZXBFcXVhbChbMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0sIGJpbmFyeS53cml0ZURvdWJsZShbXSwgMCkpOwotICAgIHRlc3QuZGVlcEVxdWFsKFsweDNmLCAweGYwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwXSwgYmluYXJ5LndyaXRlRG91YmxlKFtdLCAxKSk7Ci0gICAgdGVzdC5kZWVwRXF1YWwoWzB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdLCBiaW5hcnkud3JpdGVEb3VibGUoW10sIDIpKTsKLSAgICB0ZXN0LmRlZXBFcXVhbChbMHhjMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0sIGJpbmFyeS53cml0ZURvdWJsZShbXSwgLTIpKTsKKyAgIlNob3VsZCB3cml0ZSBkb3VibGVzIjogZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmRlZXBFcXVhbCgKKyAgICAgIFsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwXSwKKyAgICAgIGJpbmFyeS53cml0ZURvdWJsZShbXSwgMCkKKyAgICApOworICAgIGFzc2VydC5kZWVwRXF1YWwoCisgICAgICBbMHgzZiwgMHhmMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0sCisgICAgICBiaW5hcnkud3JpdGVEb3VibGUoW10sIDEpCisgICAgKTsKKyAgICBhc3NlcnQuZGVlcEVxdWFsKAorICAgICAgWzB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdLAorICAgICAgYmluYXJ5LndyaXRlRG91YmxlKFtdLCAyKQorICAgICk7CisgICAgYXNzZXJ0LmRlZXBFcXVhbCgKKyAgICAgIFsweGMwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwXSwKKyAgICAgIGJpbmFyeS53cml0ZURvdWJsZShbXSwgLTIpCisgICAgKTsKIAotICAgIHRlc3QuZGVlcEVxdWFsKFsweDQwLCAweDksIDB4MjEsIDB4ZmIsIDB4NTQsIDB4NDQsIDB4MmQsIDB4MThdLCBiaW5hcnkud3JpdGVEb3VibGUoW10sIE1hdGguUEkpKTsKKyAgICBhc3NlcnQuZGVlcEVxdWFsKAorICAgICAgWzB4NDAsIDB4OSwgMHgyMSwgMHhmYiwgMHg1NCwgMHg0NCwgMHgyZCwgMHgxOF0sCisgICAgICBiaW5hcnkud3JpdGVEb3VibGUoW10sIE1hdGguUEkpCisgICAgKTsKIAotICAgIHRlc3QuZGVlcEVxdWFsKFsweDdmLCAweGYwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwXSwgYmluYXJ5LndyaXRlRG91YmxlKFtdLCBJbmZpbml0eSkpOwotICAgIHRlc3QuZGVlcEVxdWFsKFsweGZmLCAweGYwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwXSwgYmluYXJ5LndyaXRlRG91YmxlKFtdLCAtSW5maW5pdHkpKTsKKyAgICBhc3NlcnQuZGVlcEVxdWFsKAorICAgICAgWzB4N2YsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdLAorICAgICAgYmluYXJ5LndyaXRlRG91YmxlKFtdLCBJbmZpbml0eSkKKyAgICApOworICAgIGFzc2VydC5kZWVwRXF1YWwoCisgICAgICBbMHhmZiwgMHhmMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0sCisgICAgICBiaW5hcnkud3JpdGVEb3VibGUoW10sIC1JbmZpbml0eSkKKyAgICApOwogCi0gICAgdGVzdC5kZWVwRXF1YWwoWzB4N2YsIDB4ZjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdLCBiaW5hcnkud3JpdGVEb3VibGUoW10sIE5hTikpOworICAgIGFzc2VydC5kZWVwRXF1YWwoCisgICAgICBbMHg3ZiwgMHhmOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0sCisgICAgICBiaW5hcnkud3JpdGVEb3VibGUoW10sIE5hTikKKyAgICApOwogCi0gICAgdGVzdC5kZWVwRXF1YWwoWzB4M2YsIDB4ZDUsIDB4NTUsIDB4NTUsIDB4NTUsIDB4NTUsIDB4NTUsIDB4NTVdLCBiaW5hcnkud3JpdGVEb3VibGUoW10sIDEvMykpOworICAgIGFzc2VydC5kZWVwRXF1YWwoCisgICAgICBbMHgzZiwgMHhkNSwgMHg1NSwgMHg1NSwgMHg1NSwgMHg1NSwgMHg1NSwgMHg1NV0sCisgICAgICBiaW5hcnkud3JpdGVEb3VibGUoW10sIDEgLyAzKQorICAgICk7CiAKICAgICAvLyBNaW4gc3Vibm9ybWFsIHBvc2l0aXZlIGRvdWJsZQotICAgIHRlc3QuZGVlcEVxdWFsKFsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxXSwgYmluYXJ5LndyaXRlRG91YmxlKFtdLCA0Ljk0MDY1NjQ1ODQxMjQ2NTRlLTMyNCkpOyAKKyAgICBhc3NlcnQuZGVlcEVxdWFsKAorICAgICAgWzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDFdLAorICAgICAgYmluYXJ5LndyaXRlRG91YmxlKFtdLCA0Ljk0MDY1NjQ1ODQxMjQ2NTRlLTMyNCkKKyAgICApOwogICAgIC8vIE1pbiBub3JtYWwgcG9zaXRpdmUgZG91YmxlCi0gICAgdGVzdC5kZWVwRXF1YWwoWzB4MDAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdLCBiaW5hcnkud3JpdGVEb3VibGUoW10sIDIuMjI1MDczODU4NTA3MjAxNGUtMzA4KSk7IAorICAgIGFzc2VydC5kZWVwRXF1YWwoCisgICAgICBbMHgwMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0sCisgICAgICBiaW5hcnkud3JpdGVEb3VibGUoW10sIDIuMjI1MDczODU4NTA3MjAxNGUtMzA4KQorICAgICk7CiAgICAgLy8gTWF4IHBvc2l0aXZlIGRvdWJsZQotICAgIHRlc3QuZGVlcEVxdWFsKFsweDdmLCAweGVmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmXSwgYmluYXJ5LndyaXRlRG91YmxlKFtdLCAxLjc5NzY5MzEzNDg2MjMxNTdlMzA4KSk7IAotICAJdGVzdC5kb25lKCk7CisgICAgYXNzZXJ0LmRlZXBFcXVhbCgKKyAgICAgIFsweDdmLCAweGVmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmXSwKKyAgICAgIGJpbmFyeS53cml0ZURvdWJsZShbXSwgMS43OTc2OTMxMzQ4NjIzMTU3ZTMwOCkKKyAgICApOworICAgIGFzc2VydC5lbmQoKTsKICAgfQotfSk7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfTsKKworT2JqZWN0LmtleXMoY2FzZXMpLmZvckVhY2goZnVuY3Rpb24oY2FzZU5hbWUpIHsKKyAgdGVzdChjYXNlTmFtZSwgY2FzZXNbY2FzZU5hbWVdKTsKK30pOwpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy90ZXN0L2NsaWVudC5qcyBiL2xpYi9ub2RlanMvdGVzdC9jbGllbnQuanMKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCAzYjVmMWNiLi40OWUzYTVlCi0tLSBhL2xpYi9ub2RlanMvdGVzdC9jbGllbnQuanMKKysrIGIvbGliL25vZGVqcy90ZXN0L2NsaWVudC5qcwpAQCAtMSw0ICsxLDQgQEAKLSMhL3Vzci9iaW4vZW52IG5vZGVqcworIyEvdXNyL2Jpbi9lbnYgbm9kZQogCiAvKgogICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQpAQCAtMTksODAgKzE5LDE1MiBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotLy9UaGlzIGlzIHRoZSBjbGllbnQgc2lkZSB0ZXN0IGZvciB0aGUgc3RhbmRhcmQgQXBhY2hlIFRocmlmdAotLy8iVGhyaWZ0VGVzdCIgc3VpdGUuIFRoaXMgY2xpZW50IHdpbGwgdGVzdCBhbnkgcHJvdG9jb2wvdHJhbnNwb3J0Ci0vL2NvbWJpbmF0aW9uIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLgorY29uc3QgYXNzZXJ0ID0gcmVxdWlyZSgiYXNzZXJ0Iik7Citjb25zdCB0aHJpZnQgPSByZXF1aXJlKCJ0aHJpZnQiKTsKK2NvbnN0IGhlbHBlcnMgPSByZXF1aXJlKCIuL2hlbHBlcnMiKTsKIAotdmFyIGZzID0gcmVxdWlyZSgnZnMnKTsKLXZhciBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQnKTsKLXZhciB0aHJpZnQgPSByZXF1aXJlKCd0aHJpZnQnKTsKLXZhciBUaHJpZnRUZXN0ID0gcmVxdWlyZSgnLi9nZW4tbm9kZWpzL1RocmlmdFRlc3QnKTsKLXZhciBUaHJpZnRUZXN0RHJpdmVyID0gcmVxdWlyZSgnLi90aHJpZnRfdGVzdF9kcml2ZXInKS5UaHJpZnRUZXN0RHJpdmVyOwotdmFyIFRocmlmdFRlc3REcml2ZXJQcm9taXNlID0gcmVxdWlyZSgnLi90aHJpZnRfdGVzdF9kcml2ZXJfcHJvbWlzZScpLlRocmlmdFRlc3REcml2ZXI7Citjb25zdCBUaHJpZnRUZXN0ID0gcmVxdWlyZShgLi8ke2hlbHBlcnMuZ2VuUGF0aH0vVGhyaWZ0VGVzdGApOworY29uc3QgVGhyaWZ0VGVzdERyaXZlciA9IHJlcXVpcmUoIi4vdGVzdF9kcml2ZXIiKS5UaHJpZnRUZXN0RHJpdmVyOworY29uc3QgVGhyaWZ0VGVzdERyaXZlclByb21pc2UgPSByZXF1aXJlKCIuL3Rlc3RfZHJpdmVyIikKKyAgLlRocmlmdFRlc3REcml2ZXJQcm9taXNlOworY29uc3QgU2Vjb25kU2VydmljZSA9IHJlcXVpcmUoYC4vJHtoZWxwZXJzLmdlblBhdGh9L1NlY29uZFNlcnZpY2VgKTsKIAotdmFyIHByb2dyYW0gPSByZXF1aXJlKCdjb21tYW5kZXInKTsKK2NvbnN0IHByb2dyYW0gPSByZXF1aXJlKCJjb21tYW5kZXIiKTsKIAogcHJvZ3JhbQotICAub3B0aW9uKCctcCwgLS1wcm90b2NvbCA8cHJvdG9jb2w+JywgJ1NldCB0aHJpZnQgcHJvdG9jb2wgKGJpbmFyeXxqc29uKSBbcHJvdG9jb2xdJykKLSAgLm9wdGlvbignLXQsIC0tdHJhbnNwb3J0IDx0cmFuc3BvcnQ+JywgJ1NldCB0aHJpZnQgdHJhbnNwb3J0IChidWZmZXJlZHxmcmFtZWQpIFt0cmFuc3BvcnRdJykKLSAgLm9wdGlvbignLS1wb3J0IDxwb3J0PicsICdTZXQgdGhpZnQgc2VydmVyIHBvcnQgbnVtYmVyIHRvIGNvbm5lY3QnKQotICAub3B0aW9uKCctLWhvc3QgPGhvc3Q+JywgJ1NldCB0aGlmdCBzZXJ2ZXIgaG9zdCB0byBjb25uZWN0JykKLSAgLm9wdGlvbignLS1zc2wnLCAndXNlIFNTTCB0cmFuc3BvcnQnKQotICAub3B0aW9uKCctLXByb21pc2UnLCAndGVzdCB3aXRoIHByb21pc2Ugc3R5bGUgZnVuY3Rpb25zJykKKyAgLm9wdGlvbigKKyAgICAiLXAsIC0tcHJvdG9jb2wgPHByb3RvY29sPiIsCisgICAgIlNldCB0aHJpZnQgcHJvdG9jb2wgKGJpbmFyeXxjb21wYWN0fGpzb24pIFtwcm90b2NvbF0iCisgICkKKyAgLm9wdGlvbigKKyAgICAiLXQsIC0tdHJhbnNwb3J0IDx0cmFuc3BvcnQ+IiwKKyAgICAiU2V0IHRocmlmdCB0cmFuc3BvcnQgKGJ1ZmZlcmVkfGZyYW1lZHxodHRwKSBbdHJhbnNwb3J0XSIKKyAgKQorICAub3B0aW9uKCItLXBvcnQgPHBvcnQ+IiwgIlNldCB0aHJpZnQgc2VydmVyIHBvcnQgbnVtYmVyIHRvIGNvbm5lY3QiLCA5MDkwKQorICAub3B0aW9uKCItLWhvc3QgPGhvc3Q+IiwgIlNldCB0aHJpZnQgc2VydmVyIGhvc3QgdG8gY29ubmVjdCIsICJsb2NhbGhvc3QiKQorICAub3B0aW9uKAorICAgICItLWRvbWFpbi1zb2NrZXQgPHBhdGg+IiwKKyAgICAiU2V0IHRocmlmdCBzZXJ2ZXIgdW5peCBkb21haW4gc29ja2V0IHRvIGNvbm5lY3QiCisgICkKKyAgLm9wdGlvbigiLS1zc2wiLCAidXNlIFNTTCB0cmFuc3BvcnQiKQorICAub3B0aW9uKCItLWNhbGxiYWNrIiwgInRlc3Qgd2l0aCBjYWxsYmFjayBzdHlsZSBmdW5jdGlvbnMiKQorICAub3B0aW9uKAorICAgICItdCwgLS10eXBlIDx0eXBlPiIsCisgICAgIlNlbGVjdCBzZXJ2ZXIgdHlwZSAoaHR0cHxtdWx0aXBsZXh8dGNwfHdlYnNvY2tldCkiLAorICAgICJ0Y3AiCisgICkKKyAgLm9wdGlvbigiLS1lczYiLCAiVXNlIGVzNiBjb2RlIikKKyAgLm9wdGlvbigiLS1lczUiLCAiVXNlIGVzNSBjb2RlIikKICAgLnBhcnNlKHByb2Nlc3MuYXJndik7CiAKLXZhciBob3N0ID0gImxvY2FsaG9zdCI7Ci1pZihTdHJpbmcocHJvZ3JhbS5ob3N0KSA9PT0gInVuZGVmaW5lZCIpIHsKLX1lbHNlewotICAgaG9zdCA9IHByb2dyYW0uaG9zdDsKK2NvbnN0IGhvc3QgPSBwcm9ncmFtLmhvc3Q7Citjb25zdCBwb3J0ID0gcHJvZ3JhbS5wb3J0OworY29uc3QgZG9tYWluU29ja2V0ID0gcHJvZ3JhbS5kb21haW5Tb2NrZXQ7Citjb25zdCBzc2wgPSBwcm9ncmFtLnNzbDsKK2xldCB0eXBlID0gcHJvZ3JhbS50eXBlOworCisvKiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIGNyb3NzIHRlc3QgaW52b2NhdGlvbiBmb3IgaHR0cCB0cmFuc3BvcnQgdGVzdGluZyAqLworaWYgKHByb2dyYW0udHJhbnNwb3J0ID09PSAiaHR0cCIpIHsKKyAgcHJvZ3JhbS50cmFuc3BvcnQgPSAiYnVmZmVyZWQiOworICB0eXBlID0gImh0dHAiOwogfQogCi12YXIgcG9ydCA9IDkwOTA7Ci1pZihTdHJpbmcocHJvZ3JhbS5wb3J0KSA9PT0gInVuZGVmaW5lZCIpIHsKLX1lbHNlewotICBwb3J0ID0gcHJvZ3JhbS5wb3J0OwotfQotCi12YXIgcHJvdG9jb2wgPSB0aHJpZnQuVEJpbmFyeVByb3RvY29sOwotaWYgKHByb2dyYW0ucHJvdG9jb2wgPT09ICJqc29uIikgewotICBwcm90b2NvbCA9IHRocmlmdC5USlNPTlByb3RvY29sOwotfSBlbHNlIGlmIChwcm9ncmFtLnByb3RvY29sID09PSAiY29tcGFjdCIpIHsKLSAgcHJvdG9jb2wgPSB0aHJpZnQuVENvbXBhY3RQcm90b2NvbDsKLX0gCi0KLXZhciB0cmFuc3BvcnQgPSAgdGhyaWZ0LlRCdWZmZXJlZFRyYW5zcG9ydDsKLWlmIChwcm9ncmFtLnRyYW5zcG9ydCA9PT0gImZyYW1lZCIpIHsKLSAgdHJhbnNwb3J0ID0gdGhyaWZ0LlRGcmFtZWRUcmFuc3BvcnQ7Ci19Ci0KLXZhciBvcHRpb25zID0gewotICB0cmFuc3BvcnQ6IHRyYW5zcG9ydCwKLSAgcHJvdG9jb2w6IHByb3RvY29sCitjb25zdCBvcHRpb25zID0geworICB0cmFuc3BvcnQ6IGhlbHBlcnMudHJhbnNwb3J0c1twcm9ncmFtLnRyYW5zcG9ydF0sCisgIHByb3RvY29sOiBoZWxwZXJzLnByb3RvY29sc1twcm9ncmFtLnByb3RvY29sXQogfTsKIAotdmFyIGNvbm5lY3Rpb247Ci0KLWlmIChwcm9ncmFtLnNzbCkgewotICBvcHRpb25zLnJlamVjdFVuYXV0aG9yaXplZCA9IGZhbHNlOwotICBjb25uZWN0aW9uID0gdGhyaWZ0LmNyZWF0ZVNTTENvbm5lY3Rpb24oaG9zdCwgcG9ydCwgb3B0aW9ucyk7Ci19IGVsc2UgewotICBjb25uZWN0aW9uID0gdGhyaWZ0LmNyZWF0ZUNvbm5lY3Rpb24oaG9zdCxwb3J0LCBvcHRpb25zKTsKK2lmICh0eXBlID09PSAiaHR0cCIgfHwgdHlwZSA9PT0gIndlYnNvY2tldCIpIHsKKyAgb3B0aW9ucy5wYXRoID0gIi90ZXN0IjsKIH0KIAotdmFyIGNsaWVudCA9IHRocmlmdC5jcmVhdGVDbGllbnQoVGhyaWZ0VGVzdCwgY29ubmVjdGlvbik7CitpZiAodHlwZSA9PT0gImh0dHAiKSB7CisgIG9wdGlvbnMuaGVhZGVycyA9IHsgQ29ubmVjdGlvbjogImNsb3NlIiB9OworfQogCi1jb25uZWN0aW9uLm9uKCdlcnJvcicsIGZ1bmN0aW9uKGVycikgeworaWYgKHNzbCkgeworICBpZiAodHlwZSA9PT0gInRjcCIgfHwgdHlwZSA9PT0gIm11bHRpcGxleCIpIHsKKyAgICBvcHRpb25zLnJlamVjdFVuYXV0aG9yaXplZCA9IGZhbHNlOworICB9IGVsc2UgaWYgKHR5cGUgPT09ICJodHRwIikgeworICAgIG9wdGlvbnMubm9kZU9wdGlvbnMgPSB7IHJlamVjdFVuYXV0aG9yaXplZDogZmFsc2UgfTsKKyAgICBvcHRpb25zLmh0dHBzID0gdHJ1ZTsKKyAgfSBlbHNlIGlmICh0eXBlID09PSAid2Vic29ja2V0IikgeworICAgIG9wdGlvbnMud3NPcHRpb25zID0geyByZWplY3RVbmF1dGhvcml6ZWQ6IGZhbHNlIH07CisgICAgb3B0aW9ucy5zZWN1cmUgPSB0cnVlOworICB9Cit9CisKK2xldCBjb25uZWN0aW9uOworbGV0IGNsaWVudDsKK2NvbnN0IHRlc3REcml2ZXIgPSBwcm9ncmFtLmNhbGxiYWNrCisgID8gVGhyaWZ0VGVzdERyaXZlcgorICA6IFRocmlmdFRlc3REcml2ZXJQcm9taXNlOworaWYgKGhlbHBlcnMuZWNtYU1vZGUgPT09ICJlczYiICYmIHByb2dyYW0uY2FsbGJhY2spIHsKKyAgY29uc29sZS5sb2coIkVTNiBkb2VzIG5vdCBzdXBwb3J0IGNhbGxiYWNrIHN0eWxlIik7CisgIHByb2Nlc3MuZXhpdCgwKTsKK30KKworaWYgKHR5cGUgPT09ICJ0Y3AiIHx8IHR5cGUgPT09ICJtdWx0aXBsZXgiKSB7CisgIGlmIChkb21haW5Tb2NrZXQpIHsKKyAgICBjb25uZWN0aW9uID0gdGhyaWZ0LmNyZWF0ZVVEU0Nvbm5lY3Rpb24oZG9tYWluU29ja2V0LCBvcHRpb25zKTsKKyAgfSBlbHNlIHsKKyAgICBjb25uZWN0aW9uID0gc3NsCisgICAgICA/IHRocmlmdC5jcmVhdGVTU0xDb25uZWN0aW9uKGhvc3QsIHBvcnQsIG9wdGlvbnMpCisgICAgICA6IHRocmlmdC5jcmVhdGVDb25uZWN0aW9uKGhvc3QsIHBvcnQsIG9wdGlvbnMpOworICB9Cit9IGVsc2UgaWYgKHR5cGUgPT09ICJodHRwIikgeworICBpZiAoZG9tYWluU29ja2V0KSB7CisgICAgY29ubmVjdGlvbiA9IHRocmlmdC5jcmVhdGVIdHRwVURTQ29ubmVjdGlvbihkb21haW5Tb2NrZXQsIG9wdGlvbnMpOworICB9IGVsc2UgeworICAgIGNvbm5lY3Rpb24gPSB0aHJpZnQuY3JlYXRlSHR0cENvbm5lY3Rpb24oaG9zdCwgcG9ydCwgb3B0aW9ucyk7CisgIH0KK30gZWxzZSBpZiAodHlwZSA9PT0gIndlYnNvY2tldCIpIHsKKyAgY29ubmVjdGlvbiA9IHRocmlmdC5jcmVhdGVXU0Nvbm5lY3Rpb24oaG9zdCwgcG9ydCwgb3B0aW9ucyk7CisgIGNvbm5lY3Rpb24ub3BlbigpOworfQorCitjb25uZWN0aW9uLm9uKCJlcnJvciIsIGZ1bmN0aW9uKGVycikgewogICBhc3NlcnQoZmFsc2UsIGVycik7CiB9KTsKIAotdmFyIHRlc3REcml2ZXIgPSBUaHJpZnRUZXN0RHJpdmVyOwotaWYgKHByb2dyYW0ucHJvbWlzZSkgewotICB0ZXN0RHJpdmVyID0gVGhyaWZ0VGVzdERyaXZlclByb21pc2U7Ci19IAotdGVzdERyaXZlcihjbGllbnQsIGZ1bmN0aW9uIChzdGF0dXMpIHsKLSAgY29uc29sZS5sb2coc3RhdHVzKTsKLSAgY29ubmVjdGlvbi5lbmQoKTsKLX0pOworaWYgKHR5cGUgPT09ICJ0Y3AiKSB7CisgIGNsaWVudCA9IHRocmlmdC5jcmVhdGVDbGllbnQoVGhyaWZ0VGVzdCwgY29ubmVjdGlvbik7CisgIHJ1blRlc3RzKCk7Cit9IGVsc2UgaWYgKHR5cGUgPT09ICJtdWx0aXBsZXgiKSB7CisgIGNvbnN0IG1wID0gbmV3IHRocmlmdC5NdWx0aXBsZXhlcigpOworICBjbGllbnQgPSBtcC5jcmVhdGVDbGllbnQoIlRocmlmdFRlc3QiLCBUaHJpZnRUZXN0LCBjb25uZWN0aW9uKTsKKyAgY29uc3Qgc2Vjb25kY2xpZW50ID0gbXAuY3JlYXRlQ2xpZW50KAorICAgICJTZWNvbmRTZXJ2aWNlIiwKKyAgICBTZWNvbmRTZXJ2aWNlLAorICAgIGNvbm5lY3Rpb24KKyAgKTsKIAotLy8gdG8gbWFrZSBpdCBhbHNvIHJ1biBvbiBleHByZXNzbworICBjb25uZWN0aW9uLm9uKCJjb25uZWN0IiwgZnVuY3Rpb24oKSB7CisgICAgc2Vjb25kY2xpZW50LnNlY29uZHRlc3RTdHJpbmcoIlRlc3QiLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7CisgICAgICBhc3NlcnQoIWVycik7CisgICAgICBhc3NlcnQuZXF1YWwoJ3Rlc3RTdHJpbmcoIlRlc3QiKScsIHJlc3BvbnNlKTsKKyAgICB9KTsKKworICAgIHJ1blRlc3RzKCk7CisgIH0pOworfSBlbHNlIGlmICh0eXBlID09PSAiaHR0cCIpIHsKKyAgY2xpZW50ID0gdGhyaWZ0LmNyZWF0ZUh0dHBDbGllbnQoVGhyaWZ0VGVzdCwgY29ubmVjdGlvbik7CisgIHJ1blRlc3RzKCk7Cit9IGVsc2UgaWYgKHR5cGUgPT09ICJ3ZWJzb2NrZXQiKSB7CisgIGNsaWVudCA9IHRocmlmdC5jcmVhdGVXU0NsaWVudChUaHJpZnRUZXN0LCBjb25uZWN0aW9uKTsKKyAgcnVuVGVzdHMoKTsKK30KKworZnVuY3Rpb24gcnVuVGVzdHMoKSB7CisgIHRlc3REcml2ZXIoY2xpZW50LCBmdW5jdGlvbihzdGF0dXMpIHsKKyAgICBjb25zb2xlLmxvZyhzdGF0dXMpOworICAgIGlmICh0eXBlICE9PSAiaHR0cCIgJiYgdHlwZSAhPT0gIndlYnNvY2tldCIpIHsKKyAgICAgIGNvbm5lY3Rpb24uZW5kKCk7CisgICAgfQorICAgIGlmICh0eXBlICE9PSAibXVsdGlwbGV4IikgeworICAgICAgcHJvY2Vzcy5leGl0KDApOworICAgIH0KKyAgfSk7Cit9CisKIGV4cG9ydHMuZXhwcmVzc29UZXN0ID0gZnVuY3Rpb24oKSB7fTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvdGVzdC9kZWVwLWNvbnN0cnVjdG9yLnRlc3QuanMgYi9saWIvbm9kZWpzL3Rlc3QvZGVlcC1jb25zdHJ1Y3Rvci50ZXN0LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwNGRhY2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL3Rlc3QvZGVlcC1jb25zdHJ1Y3Rvci50ZXN0LmpzCkBAIC0wLDAgKzEsMzMzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2NvbnN0IHR0eXBlcyA9IHJlcXVpcmUoIi4vZ2VuLW5vZGVqcy9Kc0RlZXBDb25zdHJ1Y3RvclRlc3RfdHlwZXMiKTsKK2NvbnN0IHRocmlmdCA9IHJlcXVpcmUoInRocmlmdCIpOworY29uc3QgdGVzdCA9IHJlcXVpcmUoInRhcGUiKTsKK2NvbnN0IGJ1ZmZlckVxdWFscyA9IHJlcXVpcmUoImJ1ZmZlci1lcXVhbHMiKTsKKworZnVuY3Rpb24gc2VyaWFsaXplQmluYXJ5KGRhdGEpIHsKKyAgbGV0IGJ1ZmY7CisgIGNvbnN0IHRyYW5zcG9ydCA9IG5ldyB0aHJpZnQuVEJ1ZmZlcmVkVHJhbnNwb3J0KG51bGwsIGZ1bmN0aW9uKG1zZykgeworICAgIGJ1ZmYgPSBtc2c7CisgIH0pOworICBjb25zdCBwcm90ID0gbmV3IHRocmlmdC5UQmluYXJ5UHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgZGF0YS53cml0ZShwcm90KTsKKyAgcHJvdC5mbHVzaCgpOworICByZXR1cm4gYnVmZjsKK30KKworZnVuY3Rpb24gZGVzZXJpYWxpemVCaW5hcnkoc2VyaWFsaXplZCwgdHlwZSkgeworICBjb25zdCB0ID0gbmV3IHRocmlmdC5URnJhbWVkVHJhbnNwb3J0KHNlcmlhbGl6ZWQpOworICBjb25zdCBwID0gbmV3IHRocmlmdC5UQmluYXJ5UHJvdG9jb2wodCk7CisgIGNvbnN0IGRhdGEgPSBuZXcgdHlwZSgpOworICBkYXRhLnJlYWQocCk7CisgIHJldHVybiBkYXRhOworfQorCitmdW5jdGlvbiBzZXJpYWxpemVKU09OKGRhdGEpIHsKKyAgbGV0IGJ1ZmY7CisgIGNvbnN0IHRyYW5zcG9ydCA9IG5ldyB0aHJpZnQuVEJ1ZmZlcmVkVHJhbnNwb3J0KG51bGwsIGZ1bmN0aW9uKG1zZykgeworICAgIGJ1ZmYgPSBtc2c7CisgIH0pOworICBjb25zdCBwcm90b2NvbCA9IG5ldyB0aHJpZnQuVEpTT05Qcm90b2NvbCh0cmFuc3BvcnQpOworICBwcm90b2NvbC53cml0ZU1lc3NhZ2VCZWdpbigiIiwgMCwgMCk7CisgIGRhdGEud3JpdGUocHJvdG9jb2wpOworICBwcm90b2NvbC53cml0ZU1lc3NhZ2VFbmQoKTsKKyAgcHJvdG9jb2wuZmx1c2goKTsKKyAgcmV0dXJuIGJ1ZmY7Cit9CisKK2Z1bmN0aW9uIGRlc2VyaWFsaXplSlNPTihzZXJpYWxpemVkLCB0eXBlKSB7CisgIGNvbnN0IHRyYW5zcG9ydCA9IG5ldyB0aHJpZnQuVEZyYW1lZFRyYW5zcG9ydChzZXJpYWxpemVkKTsKKyAgY29uc3QgcHJvdG9jb2wgPSBuZXcgdGhyaWZ0LlRKU09OUHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgcHJvdG9jb2wucmVhZE1lc3NhZ2VCZWdpbigpOworICBjb25zdCBkYXRhID0gbmV3IHR5cGUoKTsKKyAgZGF0YS5yZWFkKHByb3RvY29sKTsKKyAgcHJvdG9jb2wucmVhZE1lc3NhZ2VFbmQoKTsKKyAgcmV0dXJuIGRhdGE7Cit9CisKK2Z1bmN0aW9uIGNyZWF0ZVRocmlmdE9iaigpIHsKKyAgcmV0dXJuIG5ldyB0dHlwZXMuQ29tcGxleCh7CisgICAgc3RydWN0X2ZpZWxkOiBuZXcgdHR5cGVzLlNpbXBsZSh7IHZhbHVlOiAiYSIgfSksCisKKyAgICBzdHJ1Y3RfbGlzdF9maWVsZDogWworICAgICAgbmV3IHR0eXBlcy5TaW1wbGUoeyB2YWx1ZTogImIiIH0pLAorICAgICAgbmV3IHR0eXBlcy5TaW1wbGUoeyB2YWx1ZTogImMiIH0pCisgICAgXSwKKworICAgIHN0cnVjdF9zZXRfZmllbGQ6IFsKKyAgICAgIG5ldyB0dHlwZXMuU2ltcGxlKHsgdmFsdWU6ICJkIiB9KSwKKyAgICAgIG5ldyB0dHlwZXMuU2ltcGxlKHsgdmFsdWU6ICJlIiB9KQorICAgIF0sCisKKyAgICBzdHJ1Y3RfbWFwX2ZpZWxkOiB7CisgICAgICBBOiBuZXcgdHR5cGVzLlNpbXBsZSh7IHZhbHVlOiAiZiIgfSksCisgICAgICBCOiBuZXcgdHR5cGVzLlNpbXBsZSh7IHZhbHVlOiAiZyIgfSkKKyAgICB9LAorCisgICAgc3RydWN0X25lc3RlZF9jb250YWluZXJzX2ZpZWxkOiBbCisgICAgICBbCisgICAgICAgIHsKKyAgICAgICAgICBDOiBbCisgICAgICAgICAgICBuZXcgdHR5cGVzLlNpbXBsZSh7IHZhbHVlOiAiaCIgfSksCisgICAgICAgICAgICBuZXcgdHR5cGVzLlNpbXBsZSh7IHZhbHVlOiAiaSIgfSkKKyAgICAgICAgICBdCisgICAgICAgIH0KKyAgICAgIF0KKyAgICBdLAorCisgICAgc3RydWN0X25lc3RlZF9jb250YWluZXJzX2ZpZWxkMjogeworICAgICAgRDogWworICAgICAgICB7CisgICAgICAgICAgREE6IG5ldyB0dHlwZXMuU2ltcGxlKHsgdmFsdWU6ICJqIiB9KQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgREI6IG5ldyB0dHlwZXMuU2ltcGxlKHsgdmFsdWU6ICJrIiB9KQorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKworICAgIGxpc3Rfb2ZfbGlzdF9maWVsZDogWworICAgICAgWyJsMDAiLCAibDAxIiwgImwwMiJdLAorICAgICAgWyJsMTAiLCAibDExIiwgImwxMiJdLAorICAgICAgWyJsMjAiLCAibDIxIiwgImwyMiJdCisgICAgXSwKKworICAgIGxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkOiBbCisgICAgICBbCisgICAgICAgIFsibTAwMCIsICJtMDAxIiwgIm0wMDIiXSwKKyAgICAgICAgWyJtMDEwIiwgIm0wMTEiLCAibTAxMiJdLAorICAgICAgICBbIm0wMjAiLCAibTAyMSIsICJtMDIyIl0KKyAgICAgIF0sCisgICAgICBbCisgICAgICAgIFsibTEwMCIsICJtMTAxIiwgIm0xMDIiXSwKKyAgICAgICAgWyJtMTEwIiwgIm0xMTEiLCAibTExMiJdLAorICAgICAgICBbIm0xMjAiLCAibTEyMSIsICJtMTIyIl0KKyAgICAgIF0sCisgICAgICBbCisgICAgICAgIFsibTIwMCIsICJtMjAxIiwgIm0yMDIiXSwKKyAgICAgICAgWyJtMjEwIiwgIm0yMTEiLCAibTIxMiJdLAorICAgICAgICBbIm0yMjAiLCAibTIyMSIsICJtMjIyIl0KKyAgICAgIF0KKyAgICBdCisgIH0pOworfQorCitmdW5jdGlvbiBjcmVhdGVKc09iaigpIHsKKyAgcmV0dXJuIHsKKyAgICBzdHJ1Y3RfZmllbGQ6IHsgdmFsdWU6ICJhIiB9LAorCisgICAgc3RydWN0X2xpc3RfZmllbGQ6IFt7IHZhbHVlOiAiYiIgfSwgeyB2YWx1ZTogImMiIH1dLAorCisgICAgc3RydWN0X3NldF9maWVsZDogW3sgdmFsdWU6ICJkIiB9LCB7IHZhbHVlOiAiZSIgfV0sCisKKyAgICBzdHJ1Y3RfbWFwX2ZpZWxkOiB7CisgICAgICBBOiB7IHZhbHVlOiAiZiIgfSwKKyAgICAgIEI6IHsgdmFsdWU6ICJnIiB9CisgICAgfSwKKworICAgIHN0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19maWVsZDogWworICAgICAgWworICAgICAgICB7CisgICAgICAgICAgQzogW3sgdmFsdWU6ICJoIiB9LCB7IHZhbHVlOiAiaSIgfV0KKyAgICAgICAgfQorICAgICAgXQorICAgIF0sCisKKyAgICBzdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGQyOiB7CisgICAgICBEOiBbCisgICAgICAgIHsKKyAgICAgICAgICBEQTogeyB2YWx1ZTogImoiIH0KKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgIERCOiB7IHZhbHVlOiAiayIgfQorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKworICAgIGxpc3Rfb2ZfbGlzdF9maWVsZDogWworICAgICAgWyJsMDAiLCAibDAxIiwgImwwMiJdLAorICAgICAgWyJsMTAiLCAibDExIiwgImwxMiJdLAorICAgICAgWyJsMjAiLCAibDIxIiwgImwyMiJdCisgICAgXSwKKworICAgIGxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkOiBbCisgICAgICBbCisgICAgICAgIFsibTAwMCIsICJtMDAxIiwgIm0wMDIiXSwKKyAgICAgICAgWyJtMDEwIiwgIm0wMTEiLCAibTAxMiJdLAorICAgICAgICBbIm0wMjAiLCAibTAyMSIsICJtMDIyIl0KKyAgICAgIF0sCisgICAgICBbCisgICAgICAgIFsibTEwMCIsICJtMTAxIiwgIm0xMDIiXSwKKyAgICAgICAgWyJtMTEwIiwgIm0xMTEiLCAibTExMiJdLAorICAgICAgICBbIm0xMjAiLCAibTEyMSIsICJtMTIyIl0KKyAgICAgIF0sCisgICAgICBbCisgICAgICAgIFsibTIwMCIsICJtMjAxIiwgIm0yMDIiXSwKKyAgICAgICAgWyJtMjEwIiwgIm0yMTEiLCAibTIxMiJdLAorICAgICAgICBbIm0yMjAiLCAibTIyMSIsICJtMjIyIl0KKyAgICAgIF0KKyAgICBdCisgIH07Cit9CisKK2Z1bmN0aW9uIGFzc2VydFZhbHVlcyhvYmosIGFzc2VydCkgeworICBhc3NlcnQuZXF1YWxzKG9iai5zdHJ1Y3RfZmllbGQudmFsdWUsICJhIik7CisgIGFzc2VydC5lcXVhbHMob2JqLnN0cnVjdF9saXN0X2ZpZWxkWzBdLnZhbHVlLCAiYiIpOworICBhc3NlcnQuZXF1YWxzKG9iai5zdHJ1Y3RfbGlzdF9maWVsZFsxXS52YWx1ZSwgImMiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmouc3RydWN0X3NldF9maWVsZFswXS52YWx1ZSwgImQiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmouc3RydWN0X3NldF9maWVsZFsxXS52YWx1ZSwgImUiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmouc3RydWN0X21hcF9maWVsZC5BLnZhbHVlLCAiZiIpOworICBhc3NlcnQuZXF1YWxzKG9iai5zdHJ1Y3RfbWFwX2ZpZWxkLkIudmFsdWUsICJnIik7CisgIGFzc2VydC5lcXVhbHMob2JqLnN0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19maWVsZFswXVswXS5DWzBdLnZhbHVlLCAiaCIpOworICBhc3NlcnQuZXF1YWxzKG9iai5zdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGRbMF1bMF0uQ1sxXS52YWx1ZSwgImkiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmouc3RydWN0X25lc3RlZF9jb250YWluZXJzX2ZpZWxkMi5EWzBdLkRBLnZhbHVlLCAiaiIpOworICBhc3NlcnQuZXF1YWxzKG9iai5zdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGQyLkRbMV0uREIudmFsdWUsICJrIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9maWVsZFswXVswXSwgImwwMCIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3RfZmllbGRbMF1bMV0sICJsMDEiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X2ZpZWxkWzBdWzJdLCAibDAyIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9maWVsZFsxXVswXSwgImwxMCIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3RfZmllbGRbMV1bMV0sICJsMTEiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X2ZpZWxkWzFdWzJdLCAibDEyIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9maWVsZFsyXVswXSwgImwyMCIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3RfZmllbGRbMl1bMV0sICJsMjEiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X2ZpZWxkWzJdWzJdLCAibDIyIik7CisKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGRbMF1bMF1bMF0sICJtMDAwIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkWzBdWzBdWzFdLCAibTAwMSIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZFswXVswXVsyXSwgIm0wMDIiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGRbMF1bMV1bMF0sICJtMDEwIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkWzBdWzFdWzFdLCAibTAxMSIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZFswXVsxXVsyXSwgIm0wMTIiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGRbMF1bMl1bMF0sICJtMDIwIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkWzBdWzJdWzFdLCAibTAyMSIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZFswXVsyXVsyXSwgIm0wMjIiKTsKKworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZFsxXVswXVswXSwgIm0xMDAiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGRbMV1bMF1bMV0sICJtMTAxIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkWzFdWzBdWzJdLCAibTEwMiIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZFsxXVsxXVswXSwgIm0xMTAiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGRbMV1bMV1bMV0sICJtMTExIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkWzFdWzFdWzJdLCAibTExMiIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZFsxXVsyXVswXSwgIm0xMjAiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGRbMV1bMl1bMV0sICJtMTIxIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkWzFdWzJdWzJdLCAibTEyMiIpOworCisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkWzJdWzBdWzBdLCAibTIwMCIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZFsyXVswXVsxXSwgIm0yMDEiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGRbMl1bMF1bMl0sICJtMjAyIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkWzJdWzFdWzBdLCAibTIxMCIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZFsyXVsxXVsxXSwgIm0yMTEiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGRbMl1bMV1bMl0sICJtMjEyIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkWzJdWzJdWzBdLCAibTIyMCIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZFsyXVsyXVsxXSwgIm0yMjEiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGRbMl1bMl1bMl0sICJtMjIyIik7Cit9CisKK2Z1bmN0aW9uIGNyZWF0ZVRlc3RDYXNlcyhzZXJpYWxpemUsIGRlc2VyaWFsaXplKSB7CisgIGNvbnN0IGNhc2VzID0geworICAgICJTZXJpYWxpemUvZGVzZXJpYWxpemUgc2hvdWxkIHJldHVybiBlcXVhbCBvYmplY3QiOiBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICAgIGNvbnN0IHRPYmogPSBjcmVhdGVUaHJpZnRPYmooKTsKKyAgICAgIGNvbnN0IHJlY2VpdmVkID0gZGVzZXJpYWxpemUoc2VyaWFsaXplKHRPYmopLCB0dHlwZXMuQ29tcGxleCk7CisgICAgICBhc3NlcnQub2sodE9iaiAhPT0gcmVjZWl2ZWQsICJub3QgdGhlIHNhbWUgb2JqZWN0Iik7CisgICAgICBhc3NlcnQuZGVlcEVxdWFsKHRPYmosIHJlY2VpdmVkKTsKKyAgICAgIGFzc2VydC5lbmQoKTsKKyAgICB9LAorCisgICAgIk5lc3RlZCBzdHJ1Y3RzIGFuZCBjb250YWluZXJzIGluaXRpYWxpemVkIGZyb20gcGxhaW4ganMgb2JqZWN0cyBzaG91bGQgc2VyaWFsaXplIHNhbWUgYXMgaWYgaW5pdGlhbGl6ZWQgZnJvbSB0aHJpZnQgb2JqZWN0cyI6IGZ1bmN0aW9uKAorICAgICAgYXNzZXJ0CisgICAgKSB7CisgICAgICBjb25zdCB0T2JqMSA9IGNyZWF0ZVRocmlmdE9iaigpOworICAgICAgY29uc3QgdE9iajIgPSBuZXcgdHR5cGVzLkNvbXBsZXgoY3JlYXRlSnNPYmooKSk7CisgICAgICBhc3NlcnRWYWx1ZXModE9iajIsIGFzc2VydCk7CisgICAgICBjb25zdCBzMSA9IHNlcmlhbGl6ZSh0T2JqMSk7CisgICAgICBjb25zdCBzMiA9IHNlcmlhbGl6ZSh0T2JqMik7CisgICAgICBhc3NlcnQub2soYnVmZmVyRXF1YWxzKHMxLCBzMikpOworICAgICAgYXNzZXJ0LmVuZCgpOworICAgIH0sCisKKyAgICAiTW9kaWZpY2F0aW9ucyB0byBhcmdzIG9iamVjdCBzaG91bGQgbm90IGFmZmVjdCBjb25zdHJ1Y3RlZCBUaHJpZnQgb2JqZWN0IjogZnVuY3Rpb24oCisgICAgICBhc3NlcnQKKyAgICApIHsKKyAgICAgIGNvbnN0IGFyZ3MgPSBjcmVhdGVKc09iaigpOworICAgICAgYXNzZXJ0VmFsdWVzKGFyZ3MsIGFzc2VydCk7CisKKyAgICAgIGNvbnN0IHRPYmogPSBuZXcgdHR5cGVzLkNvbXBsZXgoYXJncyk7CisgICAgICBhc3NlcnRWYWx1ZXModE9iaiwgYXNzZXJ0KTsKKworICAgICAgYXJncy5zdHJ1Y3RfZmllbGQudmFsdWUgPSAiWlpaIjsKKyAgICAgIGFyZ3Muc3RydWN0X2xpc3RfZmllbGRbMF0udmFsdWUgPSAiWlpaIjsKKyAgICAgIGFyZ3Muc3RydWN0X2xpc3RfZmllbGRbMV0udmFsdWUgPSAiWlpaIjsKKyAgICAgIGFyZ3Muc3RydWN0X3NldF9maWVsZFswXS52YWx1ZSA9ICJaWloiOworICAgICAgYXJncy5zdHJ1Y3Rfc2V0X2ZpZWxkWzFdLnZhbHVlID0gIlpaWiI7CisgICAgICBhcmdzLnN0cnVjdF9tYXBfZmllbGQuQS52YWx1ZSA9ICJaWloiOworICAgICAgYXJncy5zdHJ1Y3RfbWFwX2ZpZWxkLkIudmFsdWUgPSAiWlpaIjsKKyAgICAgIGFyZ3Muc3RydWN0X25lc3RlZF9jb250YWluZXJzX2ZpZWxkWzBdWzBdLkNbMF0gPSAiWlpaIjsKKyAgICAgIGFyZ3Muc3RydWN0X25lc3RlZF9jb250YWluZXJzX2ZpZWxkWzBdWzBdLkNbMV0gPSAiWlpaIjsKKyAgICAgIGFyZ3Muc3RydWN0X25lc3RlZF9jb250YWluZXJzX2ZpZWxkMi5EWzBdLkRBID0gIlpaWiI7CisgICAgICBhcmdzLnN0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19maWVsZDIuRFswXS5EQiA9ICJaWloiOworCisgICAgICBhc3NlcnRWYWx1ZXModE9iaiwgYXNzZXJ0KTsKKyAgICAgIGFzc2VydC5lbmQoKTsKKyAgICB9LAorCisgICAgIm51bGxzIGFyZSBvayI6IGZ1bmN0aW9uKGFzc2VydCkgeworICAgICAgY29uc3QgdE9iaiA9IG5ldyB0dHlwZXMuQ29tcGxleCh7CisgICAgICAgIHN0cnVjdF9maWVsZDogbnVsbCwKKyAgICAgICAgc3RydWN0X2xpc3RfZmllbGQ6IG51bGwsCisgICAgICAgIHN0cnVjdF9zZXRfZmllbGQ6IG51bGwsCisgICAgICAgIHN0cnVjdF9tYXBfZmllbGQ6IG51bGwsCisgICAgICAgIHN0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19maWVsZDogbnVsbCwKKyAgICAgICAgc3RydWN0X25lc3RlZF9jb250YWluZXJzX2ZpZWxkMjogbnVsbAorICAgICAgfSk7CisgICAgICBjb25zdCByZWNlaXZlZCA9IGRlc2VyaWFsaXplKHNlcmlhbGl6ZSh0T2JqKSwgdHR5cGVzLkNvbXBsZXgpOworICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHRPYmouc3RydWN0X2ZpZWxkLCBudWxsKTsKKyAgICAgIGFzc2VydC5vayh0T2JqICE9PSByZWNlaXZlZCk7CisgICAgICBhc3NlcnQuZGVlcEVxdWFsKHRPYmosIHJlY2VpdmVkKTsKKyAgICAgIGFzc2VydC5lbmQoKTsKKyAgICB9LAorCisgICAgIkNhbiBtYWtlIGxpc3Qgd2l0aCBvYmplY3RzIjogZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgICBjb25zdCB0T2JqID0gbmV3IHR0eXBlcy5Db21wbGV4TGlzdCh7CisgICAgICAgIHN0cnVjdF9saXN0X2ZpZWxkOiBbbmV3IHR0eXBlcy5Db21wbGV4KHt9KV0KKyAgICAgIH0pOworICAgICAgY29uc3QgaW5uZXJPYmogPSB0T2JqLnN0cnVjdF9saXN0X2ZpZWxkWzBdOworICAgICAgYXNzZXJ0Lm9rKGlubmVyT2JqIGluc3RhbmNlb2YgdHR5cGVzLkNvbXBsZXgpOworICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGlubmVyT2JqLnN0cnVjdF9maWVsZCwgbnVsbCk7CisgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoaW5uZXJPYmouc3RydWN0X2xpc3RfZmllbGQsIG51bGwpOworICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGlubmVyT2JqLnN0cnVjdF9zZXRfZmllbGQsIG51bGwpOworICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGlubmVyT2JqLnN0cnVjdF9tYXBfZmllbGQsIG51bGwpOworICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGlubmVyT2JqLnN0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19maWVsZCwgbnVsbCk7CisgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoaW5uZXJPYmouc3RydWN0X25lc3RlZF9jb250YWluZXJzX2ZpZWxkMiwgbnVsbCk7CisgICAgICBhc3NlcnQuZW5kKCk7CisgICAgfQorICB9OworICByZXR1cm4gY2FzZXM7Cit9CisKK2Z1bmN0aW9uIHJ1bihuYW1lLCBjYXNlcykgeworICBPYmplY3Qua2V5cyhjYXNlcykuZm9yRWFjaChmdW5jdGlvbihjYXNlTmFtZSkgeworICAgIHRlc3QobmFtZSArICI6ICIgKyBjYXNlTmFtZSwgY2FzZXNbY2FzZU5hbWVdKTsKKyAgfSk7Cit9CisKK3J1bigiYmluYXJ5IiwgY3JlYXRlVGVzdENhc2VzKHNlcmlhbGl6ZUJpbmFyeSwgZGVzZXJpYWxpemVCaW5hcnkpKTsKK3J1bigianNvbiIsIGNyZWF0ZVRlc3RDYXNlcyhzZXJpYWxpemVKU09OLCBkZXNlcmlhbGl6ZUpTT04pKTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvdGVzdC9leGNlcHRpb25zLmpzIGIvbGliL25vZGVqcy90ZXN0L2V4Y2VwdGlvbnMuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWIyNzk4YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RlanMvdGVzdC9leGNlcHRpb25zLmpzCkBAIC0wLDAgKzEsMTQ2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyJ1c2Ugc3RyaWN0IjsKK2NvbnN0IHRlc3QgPSByZXF1aXJlKCJ0YXBlIik7Citjb25zdCB0aHJpZnQgPSByZXF1aXJlKCIuLi9saWIvdGhyaWZ0L3RocmlmdC5qcyIpOworY29uc3QgSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yID0gcmVxdWlyZSgiLi4vbGliL3RocmlmdC9pbnB1dF9idWZmZXJfdW5kZXJydW5fZXJyb3IiKTsKKwordGVzdCgiVEFwcGxpY2F0aW9uRXhjZXB0aW9uIiwgZnVuY3Rpb24gdChhc3NlcnQpIHsKKyAgY29uc3QgZSA9IG5ldyB0aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uKDEsICJmb28iKTsKKyAgYXNzZXJ0Lm9rKAorICAgIGUgaW5zdGFuY2VvZiB0aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uLAorICAgICJpcyBpbnN0YW5jZW9mIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiIKKyAgKTsKKyAgYXNzZXJ0Lm9rKGUgaW5zdGFuY2VvZiB0aHJpZnQuVEV4Y2VwdGlvbiwgImlzIGluc3RhbmNlb2YgVEV4Y2VwdGlvbiIpOworICBhc3NlcnQub2soZSBpbnN0YW5jZW9mIEVycm9yLCAiaXMgaW5zdGFuY2VvZiBFcnJvciIpOworICBhc3NlcnQuZXF1YWwodHlwZW9mIGUuc3RhY2ssICJzdHJpbmciLCAiaGFzIHN0YWNrIHRyYWNlIik7CisgIGFzc2VydC5vaygKKyAgICAvXlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjogZm9vLy50ZXN0KGUuc3RhY2spLAorICAgICJTdGFjayB0cmFjZSBoYXMgY29ycmVjdCBlcnJvciBuYW1lIGFuZCBtZXNzYWdlIgorICApOworICBhc3NlcnQub2soCisgICAgZS5zdGFjay5pbmRleE9mKCJ0ZXN0L2V4Y2VwdGlvbnMuanM6NzoxMSIpICE9PSAtMSwKKyAgICAic3RhY2sgdHJhY2Ugc3RhcnRzIG9uIGNvcnJlY3QgbGluZSBhbmQgY29sdW1uIgorICApOworICBhc3NlcnQuZXF1YWwoCisgICAgZS5uYW1lLAorICAgICJUQXBwbGljYXRpb25FeGNlcHRpb24iLAorICAgICJoYXMgZnVuY3Rpb24gbmFtZSBUQXBwbGljYXRpb25FeGNlcHRpb24iCisgICk7CisgIGFzc2VydC5lcXVhbChlLm1lc3NhZ2UsICJmb28iLCAnaGFzIGVycm9yIG1lc3NhZ2UgImZvbyInKTsKKyAgYXNzZXJ0LmVxdWFsKGUudHlwZSwgMSwgImhhcyB0eXBlIDEiKTsKKyAgYXNzZXJ0LmVuZCgpOworfSk7CisKK3Rlc3QoInVuZXhwZWN0ZWQgVEFwcGxpY2F0aW9uRXhjZXB0aW9uICIsIGZ1bmN0aW9uIHQoYXNzZXJ0KSB7CisgIGNvbnN0IGUgPSBuZXcgdGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbigxLCAxMDApOworICBhc3NlcnQub2soCisgICAgZSBpbnN0YW5jZW9mIHRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24sCisgICAgImlzIGluc3RhbmNlb2YgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIgorICApOworICBhc3NlcnQub2soZSBpbnN0YW5jZW9mIHRocmlmdC5URXhjZXB0aW9uLCAiaXMgaW5zdGFuY2VvZiBURXhjZXB0aW9uIik7CisgIGFzc2VydC5vayhlIGluc3RhbmNlb2YgRXJyb3IsICJpcyBpbnN0YW5jZW9mIEVycm9yIik7CisgIGFzc2VydC5lcXVhbCh0eXBlb2YgZS5zdGFjaywgInN0cmluZyIsICJoYXMgc3RhY2sgdHJhY2UiKTsKKyAgYXNzZXJ0Lm9rKAorICAgIC9eVEFwcGxpY2F0aW9uRXhjZXB0aW9uOiAxMDAvLnRlc3QoZS5zdGFjayksCisgICAgIlN0YWNrIHRyYWNlIGhhcyBjb3JyZWN0IGVycm9yIG5hbWUgYW5kIG1lc3NhZ2UiCisgICk7CisgIGFzc2VydC5vaygKKyAgICBlLnN0YWNrLmluZGV4T2YoInRlc3QvZXhjZXB0aW9ucy5qczo3OjExIikgIT09IC0xLAorICAgICJzdGFjayB0cmFjZSBzdGFydHMgb24gY29ycmVjdCBsaW5lIGFuZCBjb2x1bW4iCisgICk7CisgIGFzc2VydC5lcXVhbCgKKyAgICBlLm5hbWUsCisgICAgIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiIsCisgICAgImhhcyBmdW5jdGlvbiBuYW1lIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiIKKyAgKTsKKyAgYXNzZXJ0LmVxdWFsKGUubWVzc2FnZSwgMTAwLCAiaGFzIGVycm9yIG1lc3NhZ2UgMTAwIik7CisgIGFzc2VydC5lcXVhbChlLnR5cGUsIDEsICJoYXMgdHlwZSAxIik7CisgIGFzc2VydC5lbmQoKTsKK30pOworCit0ZXN0KCJURXhjZXB0aW9uIiwgZnVuY3Rpb24gdChhc3NlcnQpIHsKKyAgY29uc3QgZSA9IG5ldyB0aHJpZnQuVEV4Y2VwdGlvbigiZm9vIik7CisgIGFzc2VydC5vayhlIGluc3RhbmNlb2YgdGhyaWZ0LlRFeGNlcHRpb24sICJpcyBpbnN0YW5jZW9mIFRFeGNlcHRpb24iKTsKKyAgYXNzZXJ0Lm9rKGUgaW5zdGFuY2VvZiBFcnJvciwgImlzIGluc3RhbmNlb2YgRXJyb3IiKTsKKyAgYXNzZXJ0LmVxdWFsKHR5cGVvZiBlLnN0YWNrLCAic3RyaW5nIiwgImhhcyBzdGFjayB0cmFjZSIpOworICBhc3NlcnQub2soCisgICAgL15URXhjZXB0aW9uOiBmb28vLnRlc3QoZS5zdGFjayksCisgICAgIlN0YWNrIHRyYWNlIGhhcyBjb3JyZWN0IGVycm9yIG5hbWUgYW5kIG1lc3NhZ2UiCisgICk7CisgIGFzc2VydC5vaygKKyAgICBlLnN0YWNrLmluZGV4T2YoInRlc3QvZXhjZXB0aW9ucy5qczoyMToxMSIpICE9PSAtMSwKKyAgICAic3RhY2sgdHJhY2Ugc3RhcnRzIG9uIGNvcnJlY3QgbGluZSBhbmQgY29sdW1uIgorICApOworICBhc3NlcnQuZXF1YWwoZS5uYW1lLCAiVEV4Y2VwdGlvbiIsICJoYXMgZnVuY3Rpb24gbmFtZSBURXhjZXB0aW9uIik7CisgIGFzc2VydC5lcXVhbChlLm1lc3NhZ2UsICJmb28iLCAnaGFzIGVycm9yIG1lc3NhZ2UgImZvbyInKTsKKyAgYXNzZXJ0LmVuZCgpOworfSk7CisKK3Rlc3QoIlRQcm90b2NvbEV4Y2VwdGlvbiIsIGZ1bmN0aW9uIHQoYXNzZXJ0KSB7CisgIGNvbnN0IGUgPSBuZXcgdGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvbigxLCAiZm9vIik7CisgIGFzc2VydC5vaygKKyAgICBlIGluc3RhbmNlb2YgdGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvbiwKKyAgICAiaXMgaW5zdGFuY2VvZiBUUHJvdG9jb2xFeGNlcHRpb24iCisgICk7CisgIGFzc2VydC5vayhlIGluc3RhbmNlb2YgRXJyb3IsICJpcyBpbnN0YW5jZW9mIEVycm9yIik7CisgIGFzc2VydC5lcXVhbCh0eXBlb2YgZS5zdGFjaywgInN0cmluZyIsICJoYXMgc3RhY2sgdHJhY2UiKTsKKyAgYXNzZXJ0Lm9rKAorICAgIC9eVFByb3RvY29sRXhjZXB0aW9uOiBmb28vLnRlc3QoZS5zdGFjayksCisgICAgIlN0YWNrIHRyYWNlIGhhcyBjb3JyZWN0IGVycm9yIG5hbWUgYW5kIG1lc3NhZ2UiCisgICk7CisgIGFzc2VydC5vaygKKyAgICBlLnN0YWNrLmluZGV4T2YoInRlc3QvZXhjZXB0aW9ucy5qczozMzoxMSIpICE9PSAtMSwKKyAgICAic3RhY2sgdHJhY2Ugc3RhcnRzIG9uIGNvcnJlY3QgbGluZSBhbmQgY29sdW1uIgorICApOworICBhc3NlcnQuZXF1YWwoCisgICAgZS5uYW1lLAorICAgICJUUHJvdG9jb2xFeGNlcHRpb24iLAorICAgICJoYXMgZnVuY3Rpb24gbmFtZSBUUHJvdG9jb2xFeGNlcHRpb24iCisgICk7CisgIGFzc2VydC5lcXVhbChlLm1lc3NhZ2UsICJmb28iLCAnaGFzIGVycm9yIG1lc3NhZ2UgImZvbyInKTsKKyAgYXNzZXJ0LmVxdWFsKGUudHlwZSwgMSwgImhhcyB0eXBlIDEiKTsKKyAgYXNzZXJ0LmVuZCgpOworfSk7CisKK3Rlc3QoIklucHV0QnVmZmVyVW5kZXJydW5FcnJvciIsIGZ1bmN0aW9uIHQoYXNzZXJ0KSB7CisgIGNvbnN0IGUgPSBuZXcgSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yKCJmb28iKTsKKyAgYXNzZXJ0Lm9rKAorICAgIGUgaW5zdGFuY2VvZiBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IsCisgICAgImlzIGluc3RhbmNlb2YgSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yIgorICApOworICBhc3NlcnQub2soZSBpbnN0YW5jZW9mIEVycm9yLCAiaXMgaW5zdGFuY2VvZiBFcnJvciIpOworICBhc3NlcnQuZXF1YWwodHlwZW9mIGUuc3RhY2ssICJzdHJpbmciLCAiaGFzIHN0YWNrIHRyYWNlIik7CisgIGFzc2VydC5vaygKKyAgICAvXklucHV0QnVmZmVyVW5kZXJydW5FcnJvcjogZm9vLy50ZXN0KGUuc3RhY2spLAorICAgICJTdGFjayB0cmFjZSBoYXMgY29ycmVjdCBlcnJvciBuYW1lIGFuZCBtZXNzYWdlIgorICApOworICBhc3NlcnQub2soCisgICAgZS5zdGFjay5pbmRleE9mKCJ0ZXN0L2V4Y2VwdGlvbnMuanM6NDY6MTEiKSAhPT0gLTEsCisgICAgInN0YWNrIHRyYWNlIHN0YXJ0cyBvbiBjb3JyZWN0IGxpbmUgYW5kIGNvbHVtbiIKKyAgKTsKKyAgYXNzZXJ0LmVxdWFsKAorICAgIGUubmFtZSwKKyAgICAiSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yIiwKKyAgICAiaGFzIGZ1bmN0aW9uIG5hbWUgSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yIgorICApOworICBhc3NlcnQuZXF1YWwoZS5tZXNzYWdlLCAiZm9vIiwgJ2hhcyBlcnJvciBtZXNzYWdlICJmb28iJyk7CisgIGFzc2VydC5lbmQoKTsKK30pOwpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy90ZXN0L2hlbHBlcnMuanMgYi9saWIvbm9kZWpzL3Rlc3QvaGVscGVycy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmQxMjhkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy90ZXN0L2hlbHBlcnMuanMKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisidXNlIHN0cmljdCI7Citjb25zdCB0aHJpZnQgPSByZXF1aXJlKCIuLi9saWIvdGhyaWZ0Iik7CisKK21vZHVsZS5leHBvcnRzLnRyYW5zcG9ydHMgPSB7CisgIGJ1ZmZlcmVkOiB0aHJpZnQuVEJ1ZmZlcmVkVHJhbnNwb3J0LAorICBmcmFtZWQ6IHRocmlmdC5URnJhbWVkVHJhbnNwb3J0Cit9OworCittb2R1bGUuZXhwb3J0cy5wcm90b2NvbHMgPSB7CisgIGpzb246IHRocmlmdC5USlNPTlByb3RvY29sLAorICBiaW5hcnk6IHRocmlmdC5UQmluYXJ5UHJvdG9jb2wsCisgIGNvbXBhY3Q6IHRocmlmdC5UQ29tcGFjdFByb3RvY29sCit9OworCittb2R1bGUuZXhwb3J0cy5lY21hTW9kZSA9IHByb2Nlc3MuYXJndi5pbmNsdWRlcygiLS1lczYiKSA/ICJlczYiIDogImVzNSI7Cittb2R1bGUuZXhwb3J0cy5nZW5QYXRoID0gcHJvY2Vzcy5hcmd2LmluY2x1ZGVzKCItLWVzNiIpCisgID8gImdlbi1ub2RlanMtZXM2IgorICA6ICJnZW4tbm9kZWpzIjsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvdGVzdC9odHRwX2NsaWVudC5qcyBiL2xpYi9ub2RlanMvdGVzdC9odHRwX2NsaWVudC5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRjMWEyOS4uMDAwMDAwMAotLS0gYS9saWIvbm9kZWpzL3Rlc3QvaHR0cF9jbGllbnQuanMKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vVGhpcyBpcyB0aGUgY2xpZW50IHNpZGUgdGVzdCBmb3IgdGhlIHN0YW5kYXJkIEFwYWNoZSBUaHJpZnQKLS8vIlRocmlmdFRlc3QiIHN1aXRlLiBUaGlzIGNsaWVudCB3aWxsIHRlc3QgYW55IHByb3RvY29sL3RyYW5zcG9ydAotLy9jb21iaW5hdGlvbiBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZS4KLQotdmFyIGZzID0gcmVxdWlyZSgnZnMnKTsKLXZhciBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQnKTsKLXZhciB0aHJpZnQgPSByZXF1aXJlKCd0aHJpZnQnKTsKLXZhciBUaHJpZnRUZXN0ID0gcmVxdWlyZSgnLi9nZW4tbm9kZWpzL1RocmlmdFRlc3QnKTsKLXZhciBUaHJpZnRUZXN0RHJpdmVyID0gcmVxdWlyZSgnLi90aHJpZnRfdGVzdF9kcml2ZXInKS5UaHJpZnRUZXN0RHJpdmVyOwotdmFyIFRocmlmdFRlc3REcml2ZXJQcm9taXNlID0gcmVxdWlyZSgnLi90aHJpZnRfdGVzdF9kcml2ZXJfcHJvbWlzZScpLlRocmlmdFRlc3REcml2ZXI7Ci0KLXZhciBwcm9ncmFtID0gcmVxdWlyZSgnY29tbWFuZGVyJyk7Ci0KLXByb2dyYW0KLSAgLm9wdGlvbignLXAsIC0tcHJvdG9jb2wgPHByb3RvY29sPicsICdTZXQgdGhyaWZ0IHByb3RvY29sIChiaW5hcnl8anNvbikgW3Byb3RvY29sXScpCi0gIC5vcHRpb24oJy10LCAtLXRyYW5zcG9ydCA8dHJhbnNwb3J0PicsICdTZXQgdGhyaWZ0IHRyYW5zcG9ydCAoYnVmZmVyZWR8ZnJhbWVkKSBbdHJhbnNwb3J0XScpCi0gIC5vcHRpb24oJy0tc3NsJywgJ3VzZSBTU0wgdHJhbnNwb3J0JykKLSAgLm9wdGlvbignLS1wcm9taXNlJywgJ3Rlc3Qgd2l0aCBwcm9taXNlIHN0eWxlIGZ1bmN0aW9ucycpCi0gIC5wYXJzZShwcm9jZXNzLmFyZ3YpOwotCi0KLXZhciBwcm90b2NvbCA9IHRocmlmdC5UQmluYXJ5UHJvdG9jb2w7Ci1pZiAocHJvZ3JhbS5wcm90b2NvbCA9PT0gImpzb24iKSB7Ci0gIHByb3RvY29sID0gdGhyaWZ0LlRKU09OUHJvdG9jb2w7Ci19IAotCi12YXIgdHJhbnNwb3J0ID0gIHRocmlmdC5UQnVmZmVyZWRUcmFuc3BvcnQ7Ci1pZiAocHJvZ3JhbS50cmFuc3BvcnQgPT09ICJmcmFtZWQiKSB7Ci0gIHRyYW5zcG9ydCA9IHRocmlmdC5URnJhbWVkVHJhbnNwb3J0OwotfQotCi12YXIgb3B0aW9ucyA9IHsKLSAgIHRyYW5zcG9ydDogdHJhbnNwb3J0LAotICAgcHJvdG9jb2w6IHByb3RvY29sLAotICAgaGVhZGVyczogeyJDb25uZWN0aW9uIjogImNsb3NlIn0sCi0gICBwYXRoOiAiL3Rlc3QiCi19OwotCi1pZiAocHJvZ3JhbS5zc2wpIHsKLSAgb3B0aW9ucy5ub2RlT3B0aW9ucyA9IHsgcmVqZWN0VW5hdXRob3JpemVkOiBmYWxzZSB9OwotICBvcHRpb25zLmh0dHBzID0gdHJ1ZTsKLX0gCi0KLXZhciBjb25uZWN0aW9uID0gdGhyaWZ0LmNyZWF0ZUh0dHBDb25uZWN0aW9uKCJsb2NhbGhvc3QiLCA5MDkwLCBvcHRpb25zKTsKLQotdmFyIGNsaWVudCA9IHRocmlmdC5jcmVhdGVIdHRwQ2xpZW50KFRocmlmdFRlc3QsIGNvbm5lY3Rpb24pOwotCi1jb25uZWN0aW9uLm9uKCdlcnJvcicsIGZ1bmN0aW9uKGVycikgewotICBhc3NlcnQoZmFsc2UsIGVycik7Ci19KTsKLQotdmFyIHRlc3REcml2ZXIgPSBUaHJpZnRUZXN0RHJpdmVyOwotaWYgKHByb2dyYW0ucHJvbWlzZSkgewotICBjb25zb2xlLmxvZygiICAgIC0tVGVzdGluZyBwcm9taXNlIHN0eWxlIGNsaWVudCIpOwotICB0ZXN0RHJpdmVyID0gVGhyaWZ0VGVzdERyaXZlclByb21pc2U7Ci19IAotdGVzdERyaXZlcihjbGllbnQsIGZ1bmN0aW9uIChzdGF0dXMpIHsKLSAgY29uc29sZS5sb2coc3RhdHVzKTsKLSAgcHJvY2Vzcy5leGl0KDApOwotfSk7Ci0KLS8vIHRvIG1ha2UgaXQgYWxzbyBydW4gb24gZXhwcmVzc28KLWV4cG9ydHMuZXhwcmVzc29UZXN0ID0gZnVuY3Rpb24oKSB7fTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvdGVzdC9odHRwX3NlcnZlci5qcyBiL2xpYi9ub2RlanMvdGVzdC9odHRwX3NlcnZlci5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjEyZTY5NS4uMDAwMDAwMAotLS0gYS9saWIvbm9kZWpzL3Rlc3QvaHR0cF9zZXJ2ZXIuanMKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICdMaWNlbnNlJyk7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICdBUyBJUycgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXZhciBmcyA9IHJlcXVpcmUoJ2ZzJyk7Ci12YXIgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKTsKLXZhciB0aHJpZnQgPSByZXF1aXJlKCd0aHJpZnQnKTsKLXZhciBUaHJpZnRUZXN0ID0gcmVxdWlyZSgnLi9nZW4tbm9kZWpzL1RocmlmdFRlc3QnKTsKLXZhciBUaHJpZnRUZXN0SGFuZGxlciA9IHJlcXVpcmUoJy4vdGVzdF9oYW5kbGVyJykuVGhyaWZ0VGVzdEhhbmRsZXI7Ci12YXIgVGhyaWZ0VGVzdEhhbmRsZXJQcm9taXNlID0gcmVxdWlyZSgnLi90ZXN0X2hhbmRsZXJfcHJvbWlzZScpLlRocmlmdFRlc3RIYW5kbGVyOwotCi12YXIgcHJvZ3JhbSA9IHJlcXVpcmUoJ2NvbW1hbmRlcicpOwotCi1wcm9ncmFtCi0gIC5vcHRpb24oJy1wLCAtLXByb3RvY29sIDxwcm90b2NvbD4nLCAnU2V0IHRoaWZ0IHByb3RvY29sIChiaW5hcnl8anNvbikgW3Byb3RvY29sXScpCi0gIC5vcHRpb24oJy10LCAtLXRyYW5zcG9ydCA8dHJhbnNwb3J0PicsICdTZXQgdGhpZnQgdHJhbnNwb3J0IChidWZmZXJlZHxmcmFtZWQpIFt0cmFuc3BvcnRdJykKLSAgLm9wdGlvbignLS1zc2wnLCAndXNlIHNzbCB0cmFuc3BvcnQnKQotICAub3B0aW9uKCctLXByb21pc2UnLCAndGVzdCB3aXRoIHByb21pc2Ugc3R5bGUgZnVuY3Rpb25zJykKLSAgLnBhcnNlKHByb2Nlc3MuYXJndik7Ci0KLXZhciB0cmFuc3BvcnQgPSAgdGhyaWZ0LlRCdWZmZXJlZFRyYW5zcG9ydDsKLWlmIChwcm9ncmFtLnRyYW5zcG9ydCA9PT0gImZyYW1lZCIpIHsKLSAgdHJhbnNwb3J0ID0gdGhyaWZ0LlRGcmFtZWRUcmFuc3BvcnQ7Ci19IAotCi12YXIgcHJvdG9jb2wgPSB0aHJpZnQuVEJpbmFyeVByb3RvY29sOwotaWYgKHByb2dyYW0ucHJvdG9jb2wgPT09ICJqc29uIikgewotICBwcm90b2NvbCA9IHRocmlmdC5USlNPTlByb3RvY29sOwotfSAKLQotdmFyIGhhbmRsZXIgPSBUaHJpZnRUZXN0SGFuZGxlcjsKLWlmIChwcm9ncmFtLnByb21pc2UpIHsKLSAgaGFuZGxlciA9IFRocmlmdFRlc3RIYW5kbGVyUHJvbWlzZTsKLX0gCi0KLXZhciBTdmNPcHQgPSB7ICAgICAgICAgICAgICAgICAgICAgICAJCQotICAgIGhhbmRsZXI6IGhhbmRsZXIsICAgICAgICAgICAgICAgICAgICAgIAkKLSAgICBwcm9jZXNzb3I6IFRocmlmdFRlc3QsICAgICAgICAgICAgICAgICAgICAgICAgIAkKLSAgICBwcm90b2NvbDogcHJvdG9jb2wsICAgICAgICAgICAgICAgICAKLSAgICB0cmFuc3BvcnQ6IHRyYW5zcG9ydCAJCQotfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi12YXIgc2VydmVyT3B0ID0geyBzZXJ2aWNlczogeyAiL3Rlc3QiOiBTdmNPcHQgfSB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLWlmIChwcm9ncmFtLnNzbCkgewotICBzZXJ2ZXJPcHQudGxzID0gewotICAgIGtleTogZnMucmVhZEZpbGVTeW5jKHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICdzZXJ2ZXIua2V5JykpLAotICAgIGNlcnQ6IGZzLnJlYWRGaWxlU3luYyhwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnc2VydmVyLmNydCcpKQotICB9OwotfQotdGhyaWZ0LmNyZWF0ZVdlYlNlcnZlcihzZXJ2ZXJPcHQpLmxpc3Rlbig5MDkwKTsgICAgICAgICAgICAgICAgICAgICAgICAJCQotCi0KZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvdGVzdC9tdWx0aXBsZXhfY2xpZW50LmpzIGIvbGliL25vZGVqcy90ZXN0L211bHRpcGxleF9jbGllbnQuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiNTgyMDUuLjAwMDAwMDAKLS0tIGEvbGliL25vZGVqcy90ZXN0L211bHRpcGxleF9jbGllbnQuanMKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi12YXIgdGhyaWZ0ID0gcmVxdWlyZSgndGhyaWZ0Jyk7Ci12YXIgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0Jyk7Ci0KLXZhciBUaHJpZnRUZXN0ID0gcmVxdWlyZSgnLi9nZW4tbm9kZWpzL1RocmlmdFRlc3QnKSwKLSAgICBTZWNvbmRTZXJ2aWNlID0gcmVxdWlyZSgnLi9nZW4tbm9kZWpzL1NlY29uZFNlcnZpY2UnKSwKLSAgICB0dHlwZXMgPSByZXF1aXJlKCcuL2dlbi1ub2RlanMvVGhyaWZ0VGVzdF90eXBlcycpOwotdmFyIFRocmlmdFRlc3REcml2ZXIgPSByZXF1aXJlKCcuL3RocmlmdF90ZXN0X2RyaXZlcicpLlRocmlmdFRlc3REcml2ZXI7Ci0KLXZhciBwcm9ncmFtID0gcmVxdWlyZSgnY29tbWFuZGVyJyk7Ci0KLXByb2dyYW0KLSAgLm9wdGlvbignLXAsIC0tcHJvdG9jb2wgPHByb3RvY29sPicsICdTZXQgdGhpZnQgcHJvdG9jb2wgKGJpbmFyeXxqc29uKSBbcHJvdG9jb2xdJykKLSAgLm9wdGlvbignLXQsIC0tdHJhbnNwb3J0IDx0cmFuc3BvcnQ+JywgJ1NldCB0aGlmdCB0cmFuc3BvcnQgKGJ1ZmZlcmVkfGZyYW1lZCkgW3RyYW5zcG9ydF0nKQotICAub3B0aW9uKCctLXNzbCcsICd1c2Ugc3NsIHRyYW5zcG9ydCcpCi0gIC5wYXJzZShwcm9jZXNzLmFyZ3YpOwotCi12YXIgdHJhbnNwb3J0ID0gIHRocmlmdC5UQnVmZmVyZWRUcmFuc3BvcnQ7Ci1pZiAocHJvZ3JhbS50cmFuc3BvcnQgPT09ICJmcmFtZWQiKSB7Ci0gIHRyYW5zcG9ydCA9IHRocmlmdC5URnJhbWVkVHJhbnNwb3J0OwotfQotCi12YXIgcHJvdG9jb2wgPSB0aHJpZnQuVEJpbmFyeVByb3RvY29sOwotaWYgKHByb2dyYW0ucHJvdG9jb2wgPT09ICJqc29uIikgewotICBwcm90b2NvbCA9IHRocmlmdC5USlNPTlByb3RvY29sOwotfSAKLQotdmFyIG9wdGlvbnMgPSB7Ci0gIHRyYW5zcG9ydDogdHJhbnNwb3J0LAotICBwcm90b2NvbDogcHJvdG9jb2wKLX07Ci0KLXZhciBjb25uZWN0aW9uOwotaWYgKHByb2dyYW0uc3NsKSB7Ci0gIG9wdGlvbnMucmVqZWN0VW5hdXRob3JpemVkID0gZmFsc2U7Ci0gIGNvbm5lY3Rpb24gPSB0aHJpZnQuY3JlYXRlU1NMQ29ubmVjdGlvbignbG9jYWxob3N0JywgOTA5MCwgb3B0aW9ucyk7Ci19IGVsc2UgewotICBjb25uZWN0aW9uID0gdGhyaWZ0LmNyZWF0ZUNvbm5lY3Rpb24oJ2xvY2FsaG9zdCcsIDkwOTAsIG9wdGlvbnMpOwotfQotCi12YXIgbXAgPSBuZXcgdGhyaWZ0Lk11bHRpcGxleGVyKCk7Ci0KLWNsaWVudCA9IG1wLmNyZWF0ZUNsaWVudCgiVGhyaWZ0VGVzdCIsIFRocmlmdFRlc3QsIGNvbm5lY3Rpb24pOwotc2Vjb25kY2xpZW50ID0gbXAuY3JlYXRlQ2xpZW50KCJTZWNvbmRTZXJ2aWNlIiwgU2Vjb25kU2VydmljZSwgY29ubmVjdGlvbik7Ci0KLWNvbm5lY3Rpb24ub24oJ2Vycm9yJywgZnVuY3Rpb24oZXJyKSB7Ci0gICAgYXNzZXJ0KGZhbHNlLCBlcnIpOwotfSk7Ci0KLWNvbm5lY3Rpb24ub24oJ2Nvbm5lY3QnLCBmdW5jdGlvbigpIHsKLSAgc2Vjb25kY2xpZW50LnNlY29uZHRlc3RTdHJpbmcoIlRlc3QiLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7Ci0gICAgYXNzZXJ0KCFlcnIpOwotICAgIGFzc2VydC5lcXVhbCgiVGVzdCIsIHJlc3BvbnNlKTsKLSAgfSk7Ci0KLSAgVGhyaWZ0VGVzdERyaXZlcihjbGllbnQsIGZ1bmN0aW9uIChzdGF0dXMpIHsKLSAgICBjb25zb2xlLmxvZyhzdGF0dXMpOwotICAgIGNvbm5lY3Rpb24uZW5kKCk7Ci0gIH0pOwotfSk7Ci0KLS8vIHRvIG1ha2UgaXQgYWxzbyBydW4gb24gZXhwcmVzc28KLWV4cG9ydHMuZXhwcmVzc29UZXN0ID0gZnVuY3Rpb24oKSB7fTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvdGVzdC9tdWx0aXBsZXhfc2VydmVyLmpzIGIvbGliL25vZGVqcy90ZXN0L211bHRpcGxleF9zZXJ2ZXIuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4ZjliMGQuLjAwMDAwMDAKLS0tIGEvbGliL25vZGVqcy90ZXN0L211bHRpcGxleF9zZXJ2ZXIuanMKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICdMaWNlbnNlJyk7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICdBUyBJUycgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi12YXIgdGhyaWZ0ID0gcmVxdWlyZSgndGhyaWZ0Jyk7Ci0KLXZhciBUaHJpZnRUZXN0ID0gcmVxdWlyZSgnLi9nZW4tbm9kZWpzL1RocmlmdFRlc3QnKSwKLSAgU2Vjb25kU2VydmljZSA9IHJlcXVpcmUoJy4vZ2VuLW5vZGVqcy9TZWNvbmRTZXJ2aWNlJyksCi0gIHR0eXBlcyA9IHJlcXVpcmUoJy4vZ2VuLW5vZGVqcy9UaHJpZnRUZXN0X3R5cGVzJyk7Ci0KLXZhciBmcyA9IHJlcXVpcmUoImZzIik7Ci12YXIgcGF0aCA9IHJlcXVpcmUoInBhdGgiKTsKLQotdmFyIHByb2dyYW0gPSByZXF1aXJlKCdjb21tYW5kZXInKTsKLQotcHJvZ3JhbQotICAub3B0aW9uKCctcCwgLS1wcm90b2NvbCA8cHJvdG9jb2w+JywgJ1NldCB0aGlmdCBwcm90b2NvbCAoYmluYXJ5fGpzb24pIFtwcm90b2NvbF0nKQotICAub3B0aW9uKCctdCwgLS10cmFuc3BvcnQgPHRyYW5zcG9ydD4nLCAnU2V0IHRoaWZ0IHRyYW5zcG9ydCAoYnVmZmVyZWR8ZnJhbWVkKSBbdHJhbnNwb3J0XScpCi0gIC5vcHRpb24oJy0tc3NsJywgJ3VzZSBzc2wgdHJhbnNwb3J0JykKLSAgLnBhcnNlKHByb2Nlc3MuYXJndik7Ci0KLXZhciBwcm90b2NvbCA9IHRocmlmdC5UQmluYXJ5UHJvdG9jb2w7Ci1pZiAocHJvZ3JhbS5wcm90b2NvbCA9PT0gImpzb24iKSB7Ci0gIHByb3RvY29sID0gdGhyaWZ0LlRKU09OUHJvdG9jb2w7Ci19Ci0KLXZhciB0cmFuc3BvcnQgPSAgdGhyaWZ0LlRCdWZmZXJlZFRyYW5zcG9ydDsKLWlmIChwcm9ncmFtLnRyYW5zcG9ydCA9PT0gImZyYW1lZCIpIHsKLSAgdHJhbnNwb3J0ID0gdGhyaWZ0LlRGcmFtZWRUcmFuc3BvcnQ7Ci19Ci0KLXZhciBUaHJpZnRUZXN0SGFuZGxlciA9IHJlcXVpcmUoIi4vdGVzdF9oYW5kbGVyIikuVGhyaWZ0VGVzdEhhbmRsZXI7Ci0KLXZhciBTZWNvbmRTZXJ2aWNlSGFuZGxlciA9IHsKLSAgc2Vjb25kdGVzdFN0cmluZzogZnVuY3Rpb24odGhpbmcsIHJlc3VsdCkgewotICAgIGNvbnNvbGUubG9nKCd0ZXN0U3RyaW5nKFwnJyArIHRoaW5nICsgJ1wnKScpOwotICAgIHJlc3VsdChudWxsLCB0aGluZyk7Ci0gIH0KLX07Ci0KLXZhciBwcm9jZXNzb3IgPSBuZXcgdGhyaWZ0Lk11bHRpcGxleGVkUHJvY2Vzc29yKCk7Ci0KLXByb2Nlc3Nvci5yZWdpc3RlclByb2Nlc3NvcigKLSAgIlRocmlmdFRlc3QiLAotICBuZXcgVGhyaWZ0VGVzdC5Qcm9jZXNzb3IoVGhyaWZ0VGVzdEhhbmRsZXIpKTsKLQotcHJvY2Vzc29yLnJlZ2lzdGVyUHJvY2Vzc29yKAotICAiU2Vjb25kU2VydmljZSIsCi0gIG5ldyBTZWNvbmRTZXJ2aWNlLlByb2Nlc3NvcihTZWNvbmRTZXJ2aWNlSGFuZGxlcikpOwotCi12YXIgb3B0aW9ucyA9IHsKLSAgdHJhbnNwb3J0OiB0cmFuc3BvcnQsCi0gIHByb3RvY29sOiBwcm90b2NvbAotfTsKLQotaWYgKHByb2dyYW0uc3NsKSB7Ci0gIC8vc3NsIG9wdGlvbnMKLSAgb3B0aW9ucy50bHMgPSB7Ci0gICAga2V5OiBmcy5yZWFkRmlsZVN5bmMocGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJ3NlcnZlci5rZXknKSksCi0gICAgY2VydDogZnMucmVhZEZpbGVTeW5jKHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICdzZXJ2ZXIuY3J0JykpCi0gIH07Ci19Ci0KLXRocmlmdC5jcmVhdGVNdWx0aXBsZXhTZXJ2ZXIocHJvY2Vzc29yLCBvcHRpb25zKS5saXN0ZW4oOTA5MCk7CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL3Rlc3Qvc2VydmVyLmpzIGIvbGliL25vZGVqcy90ZXN0L3NlcnZlci5qcwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IDM3OGE2ZTIuLjc0MDIwOTQKLS0tIGEvbGliL25vZGVqcy90ZXN0L3NlcnZlci5qcworKysgYi9saWIvbm9kZWpzL3Rlc3Qvc2VydmVyLmpzCkBAIC0xLDQgKzEsNCBAQAotIyEvdXNyL2Jpbi9lbnYgbm9kZWpzCisjIS91c3IvYmluL2VudiBub2RlCiAKIC8qCiAgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCkBAIC0xOSw1NSArMTksMTE5IEBACiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi12YXIgZnMgPSByZXF1aXJlKCdmcycpOwotdmFyIHBhdGggPSByZXF1aXJlKCdwYXRoJyk7Ci12YXIgdGhyaWZ0ID0gcmVxdWlyZSgndGhyaWZ0Jyk7Ci12YXIgVGhyaWZ0VGVzdCA9IHJlcXVpcmUoJy4vZ2VuLW5vZGVqcy9UaHJpZnRUZXN0Jyk7Ci12YXIgVGhyaWZ0VGVzdEhhbmRsZXIgPSByZXF1aXJlKCcuL3Rlc3RfaGFuZGxlcicpLlRocmlmdFRlc3RIYW5kbGVyOwotdmFyIFRocmlmdFRlc3RIYW5kbGVyUHJvbWlzZSA9IHJlcXVpcmUoJy4vdGVzdF9oYW5kbGVyX3Byb21pc2UnKS5UaHJpZnRUZXN0SGFuZGxlcjsKLQotdmFyIHByb2dyYW0gPSByZXF1aXJlKCdjb21tYW5kZXInKTsKK2NvbnN0IGZzID0gcmVxdWlyZSgiZnMiKTsKK2NvbnN0IHBhdGggPSByZXF1aXJlKCJwYXRoIik7Citjb25zdCB0aHJpZnQgPSByZXF1aXJlKCIuLi9saWIvdGhyaWZ0Iik7Citjb25zdCBwcm9ncmFtID0gcmVxdWlyZSgiY29tbWFuZGVyIik7Citjb25zdCBoZWxwZXJzID0gcmVxdWlyZSgiLi9oZWxwZXJzIik7CiAKIHByb2dyYW0KLSAgLm9wdGlvbignLXAsIC0tcHJvdG9jb2wgPHByb3RvY29sPicsICdTZXQgdGhpZnQgcHJvdG9jb2wgKGJpbmFyeXxqc29uKSBbcHJvdG9jb2xdJykKLSAgLm9wdGlvbignLXQsIC0tdHJhbnNwb3J0IDx0cmFuc3BvcnQ+JywgJ1NldCB0aGlmdCB0cmFuc3BvcnQgKGJ1ZmZlcmVkfGZyYW1lZCkgW3RyYW5zcG9ydF0nKQotICAub3B0aW9uKCctLXBvcnQgPHBvcnQ+JywgJ1NldCB0aGlmdCBzZXJ2ZXIgcG9ydCcpCi0gIC5vcHRpb24oJy0tc3NsJywgJ3VzZSBzc2wgdHJhbnNwb3J0JykKLSAgLm9wdGlvbignLS1wcm9taXNlJywgJ3Rlc3Qgd2l0aCBwcm9taXNlIHN0eWxlIGZ1bmN0aW9ucycpCisgIC5vcHRpb24oCisgICAgIi1wLCAtLXByb3RvY29sIDxwcm90b2NvbD4iLAorICAgICJTZXQgdGhyaWZ0IHByb3RvY29sIChiaW5hcnl8Y29tcGFjdHxqc29uKSIsCisgICAgImJpbmFyeSIKKyAgKQorICAub3B0aW9uKAorICAgICItdCwgLS10cmFuc3BvcnQgPHRyYW5zcG9ydD4iLAorICAgICJTZXQgdGhyaWZ0IHRyYW5zcG9ydCAoYnVmZmVyZWR8ZnJhbWVkfGh0dHApIiwKKyAgICAiYnVmZmVyZWQiCisgICkKKyAgLm9wdGlvbigiLS1zc2wiLCAidXNlIHNzbCB0cmFuc3BvcnQiKQorICAub3B0aW9uKCItLXBvcnQgPHBvcnQ+IiwgIlNldCB0aHJpZnQgc2VydmVyIHBvcnQiLCA5MDkwKQorICAub3B0aW9uKCItLWRvbWFpbi1zb2NrZXQgPHBhdGg+IiwgIlNldCB0aGlmdCBzZXJ2ZXIgdW5peCBkb21haW4gc29ja2V0IikKKyAgLm9wdGlvbigKKyAgICAiLXQsIC0tdHlwZSA8dHlwZT4iLAorICAgICJTZWxlY3Qgc2VydmVyIHR5cGUgKGh0dHB8bXVsdGlwbGV4fHRjcHx3ZWJzb2NrZXQpIiwKKyAgICAidGNwIgorICApCisgIC5vcHRpb24oIi0tY2FsbGJhY2siLCAidGVzdCB3aXRoIGNhbGxiYWNrIHN0eWxlIGZ1bmN0aW9ucyIpCisgIC5vcHRpb24oIi0tZXM2IiwgIlVzZSBlczYgY29kZSIpCisgIC5vcHRpb24oIi0tZXM1IiwgIlVzZSBlczUgY29kZSIpCiAgIC5wYXJzZShwcm9jZXNzLmFyZ3YpOwogCi12YXIgdHJhbnNwb3J0ID0gIHRocmlmdC5UQnVmZmVyZWRUcmFuc3BvcnQ7Ci1pZiAocHJvZ3JhbS50cmFuc3BvcnQgPT09ICJmcmFtZWQiKSB7Ci0gIHRyYW5zcG9ydCA9IHRocmlmdC5URnJhbWVkVHJhbnNwb3J0OwotfSAKK2NvbnN0IFRocmlmdFRlc3QgPSByZXF1aXJlKGAuLyR7aGVscGVycy5nZW5QYXRofS9UaHJpZnRUZXN0YCk7Citjb25zdCBTZWNvbmRTZXJ2aWNlID0gcmVxdWlyZShgLi8ke2hlbHBlcnMuZ2VuUGF0aH0vU2Vjb25kU2VydmljZWApOworY29uc3QgeyBUaHJpZnRUZXN0SGFuZGxlciB9ID0gcmVxdWlyZSgiLi90ZXN0X2hhbmRsZXIiKTsKIAotdmFyIHByb3RvY29sID0gdGhyaWZ0LlRCaW5hcnlQcm90b2NvbDsKLWlmIChwcm9ncmFtLnByb3RvY29sID09PSAianNvbiIpIHsKLSAgcHJvdG9jb2wgPSB0aHJpZnQuVEpTT05Qcm90b2NvbDsKLX0gZWxzZSBpZiAocHJvZ3JhbS5wcm90b2NvbCA9PT0gImNvbXBhY3QiKSB7Ci0gIHByb3RvY29sID0gdGhyaWZ0LlRDb21wYWN0UHJvdG9jb2w7Ci19IAorY29uc3QgcG9ydCA9IHByb2dyYW0ucG9ydDsKK2NvbnN0IGRvbWFpblNvY2tldCA9IHByb2dyYW0uZG9tYWluU29ja2V0OworY29uc3Qgc3NsID0gcHJvZ3JhbS5zc2w7CiAKLXZhciBwb3J0ID0gOTA5MDsKLWlmIChTdHJpbmcocHJvZ3JhbS5wb3J0KSA9PT0gInVuZGVmaW5lZCIpewotfSBlbHNlIHsKLSAgcG9ydCA9IHByb2dyYW0ucG9ydDsKK2xldCB0eXBlID0gcHJvZ3JhbS50eXBlOworaWYgKHByb2dyYW0udHJhbnNwb3J0ID09PSAiaHR0cCIpIHsKKyAgcHJvZ3JhbS50cmFuc3BvcnQgPSAiYnVmZmVyZWQiOworICB0eXBlID0gImh0dHAiOwogfQogCi12YXIgaGFuZGxlciA9IFRocmlmdFRlc3RIYW5kbGVyOwotaWYgKHByb2dyYW0ucHJvbWlzZSkgewotICBoYW5kbGVyID0gVGhyaWZ0VGVzdEhhbmRsZXJQcm9taXNlOwotfSAKLQotdmFyIG9wdGlvbnMgPSB7Ci0gIHByb3RvY29sOiBwcm90b2NvbCwKLSAgdHJhbnNwb3J0OiB0cmFuc3BvcnQKK2xldCBvcHRpb25zID0geworICB0cmFuc3BvcnQ6IGhlbHBlcnMudHJhbnNwb3J0c1twcm9ncmFtLnRyYW5zcG9ydF0sCisgIHByb3RvY29sOiBoZWxwZXJzLnByb3RvY29sc1twcm9ncmFtLnByb3RvY29sXQogfTsKLWlmIChwcm9ncmFtLnNzbCkgewotICBvcHRpb25zLnRscyA9IHsKLSAgICBrZXk6IGZzLnJlYWRGaWxlU3luYyhwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnc2VydmVyLmtleScpKSwKLSAgICBjZXJ0OiBmcy5yZWFkRmlsZVN5bmMocGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJ3NlcnZlci5jcnQnKSkKKworaWYgKHR5cGUgPT09ICJodHRwIiB8fCB0eXBlID09PSAid2Vic29ja2V0IikgeworICBvcHRpb25zLmhhbmRsZXIgPSBUaHJpZnRUZXN0SGFuZGxlcjsKKyAgb3B0aW9ucy5wcm9jZXNzb3IgPSBUaHJpZnRUZXN0OworCisgIG9wdGlvbnMgPSB7CisgICAgc2VydmljZXM6IHsgIi90ZXN0Ijogb3B0aW9ucyB9LAorICAgIGNvcnM6IHsKKyAgICAgICIqIjogdHJ1ZQorICAgIH0KICAgfTsKIH0KLXRocmlmdC5jcmVhdGVTZXJ2ZXIoVGhyaWZ0VGVzdCwgaGFuZGxlciwgb3B0aW9ucykubGlzdGVuKHBvcnQpOwogCitsZXQgcHJvY2Vzc29yOworaWYgKHR5cGUgPT09ICJtdWx0aXBsZXgiKSB7CisgIGNvbnN0IFNlY29uZFNlcnZpY2VIYW5kbGVyID0geworICAgIHNlY29uZHRlc3RTdHJpbmc6IGZ1bmN0aW9uKHRoaW5nLCByZXN1bHQpIHsKKyAgICAgIGNvbnNvbGUubG9nKCd0ZXN0U3RyaW5nKCInICsgdGhpbmcgKyAnIiknKTsKKyAgICAgIHJlc3VsdChudWxsLCAndGVzdFN0cmluZygiJyArIHRoaW5nICsgJyIpJyk7CisgICAgfQorICB9OworCisgIHByb2Nlc3NvciA9IG5ldyB0aHJpZnQuTXVsdGlwbGV4ZWRQcm9jZXNzb3IoKTsKKworICBwcm9jZXNzb3IucmVnaXN0ZXJQcm9jZXNzb3IoCisgICAgIlRocmlmdFRlc3QiLAorICAgIG5ldyBUaHJpZnRUZXN0LlByb2Nlc3NvcihUaHJpZnRUZXN0SGFuZGxlcikKKyAgKTsKKworICBwcm9jZXNzb3IucmVnaXN0ZXJQcm9jZXNzb3IoCisgICAgIlNlY29uZFNlcnZpY2UiLAorICAgIG5ldyBTZWNvbmRTZXJ2aWNlLlByb2Nlc3NvcihTZWNvbmRTZXJ2aWNlSGFuZGxlcikKKyAgKTsKK30KKworaWYgKHNzbCkgeworICBpZiAoCisgICAgdHlwZSA9PT0gInRjcCIgfHwKKyAgICB0eXBlID09PSAibXVsdGlwbGV4IiB8fAorICAgIHR5cGUgPT09ICJodHRwIiB8fAorICAgIHR5cGUgPT09ICJ3ZWJzb2NrZXQiCisgICkgeworICAgIG9wdGlvbnMudGxzID0geworICAgICAga2V5OiBmcy5yZWFkRmlsZVN5bmMocGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgInNlcnZlci5rZXkiKSksCisgICAgICBjZXJ0OiBmcy5yZWFkRmlsZVN5bmMocGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgInNlcnZlci5jcnQiKSkKKyAgICB9OworICB9Cit9CisKK2xldCBzZXJ2ZXI7CitpZiAodHlwZSA9PT0gInRjcCIpIHsKKyAgc2VydmVyID0gdGhyaWZ0LmNyZWF0ZVNlcnZlcihUaHJpZnRUZXN0LCBUaHJpZnRUZXN0SGFuZGxlciwgb3B0aW9ucyk7Cit9IGVsc2UgaWYgKHR5cGUgPT09ICJtdWx0aXBsZXgiKSB7CisgIHNlcnZlciA9IHRocmlmdC5jcmVhdGVNdWx0aXBsZXhTZXJ2ZXIocHJvY2Vzc29yLCBvcHRpb25zKTsKK30gZWxzZSBpZiAodHlwZSA9PT0gImh0dHAiIHx8IHR5cGUgPT09ICJ3ZWJzb2NrZXQiKSB7CisgIHNlcnZlciA9IHRocmlmdC5jcmVhdGVXZWJTZXJ2ZXIob3B0aW9ucyk7Cit9CisKK2lmIChkb21haW5Tb2NrZXQpIHsKKyAgc2VydmVyLmxpc3Rlbihkb21haW5Tb2NrZXQpOworfSBlbHNlIGlmICgKKyAgdHlwZSA9PT0gInRjcCIgfHwKKyAgdHlwZSA9PT0gIm11bHRpcGxleCIgfHwKKyAgdHlwZSA9PT0gImh0dHAiIHx8CisgIHR5cGUgPT09ICJ3ZWJzb2NrZXQiCispIHsKKyAgc2VydmVyLmxpc3Rlbihwb3J0KTsKK30KZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvdGVzdC90ZXN0LWNhc2VzLmpzIGIvbGliL25vZGVqcy90ZXN0L3Rlc3QtY2FzZXMuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJjNTY2ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RlanMvdGVzdC90ZXN0LWNhc2VzLmpzCkBAIC0wLDAgKzEsMTgwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyJ1c2Ugc3RyaWN0IjsKKworY29uc3QgaGVscGVycyA9IHJlcXVpcmUoIi4vaGVscGVycyIpOworY29uc3QgdHR5cGVzID0gcmVxdWlyZShgLi8ke2hlbHBlcnMuZ2VuUGF0aH0vVGhyaWZ0VGVzdF90eXBlc2ApOworY29uc3QgSW50NjQgPSByZXF1aXJlKCJub2RlLWludDY0Iik7CisKKy8vYWxsIExhbmd1YWdlcyBpbiBVVEYtOAorLypqc2hpbnQgLVcxMDAgKi8KK2NvbnN0IHN0cmluZ1Rlc3QgPSAobW9kdWxlLmV4cG9ydHMuc3RyaW5nVGVzdCA9CisgICJBZnJpa2FhbnMsIEFsZW1hbm5pc2NoLCBBcmFnb27DqXMsINin2YTYudix2KjZitipLCDZhdi12LHZiSwgIiArCisgICJBc3R1cmlhbnUsIEF5bWFyIGFydSwgQXrJmXJiYXljYW4sINCR0LDRiNKh0L7RgNGCLCBCb2FyaXNjaCwgxb1lbWFpdMSXxaFrYSwgIiArCisgICLQkdC10LvQsNGA0YPRgdC60LDRjywg0JHQtdC70LDRgNGD0YHQutCw0Y8gKNGC0LDRgNCw0YjQutC10LLRltGG0LApLCDQkdGK0LvQs9Cw0YDRgdC60LgsIEJhbWFuYW5rYW4sICIgKworICAi4Kas4Ka+4KaC4Kay4Ka+LCBCcmV6aG9uZWcsIEJvc2Fuc2tpLCBDYXRhbMOgLCBNw6xuZy1kxJXMpG5nLW5n4bmzzIQsINCd0L7RhdGH0LjQudC9LCAiICsKKyAgIkNlYnVhbm8sIOGPo+GOs+GOqSwgxIxlc2t5LCDQodC70L7QstGjzIHQvdGM0YHQutGKIC8g4rCU4rCO4rCR4rCC4rCh4rCQ4rCg4rCU4rCN4rCfLCDQp9OR0LLQsNGI0LvQsCwgQ3ltcmFlZywgIiArCisgICJEYW5zaywgWmF6YWtpLCDei96o3ojerN6A3qjehN6m3pDesCwgzpXOu867zrfOvc65zrrOrCwgRW1pbGnDoG4gZSBydW1hZ27DsmwsIEVuZ2xpc2gsICIgKworICAiRXNwZXJhbnRvLCBFc3Bhw7FvbCwgRWVzdGksIEV1c2thcmEsINmB2KfYsdiz24wsIFN1b21pLCBWw7VybywgRsO4cm95c2t0LCAiICsKKyAgIkZyYW7Dp2FpcywgQXJwZXRhbiwgRnVybGFuLCBGcnlzaywgR2FlaWxnZSwg6LSb6KqeLCBHw6BpZGhsaWcsIEdhbGVnbywgIiArCisgICJBdmHDsWUn4bq9LCDgqpfgq4HgqpzgqrDgqr7gqqTgq4AsIEdhZWxnLCDXoteR16jXmdeqLCDgpLngpL/gpKjgpY3gpKbgpYAsIEZpamkgSGluZGksIEhydmF0c2tpLCAiICsKKyAgIktyZXnDsmwgYXlpc3llbiwgTWFneWFyLCDVgNWh1bXVpdaA1aXVtiwgSW50ZXJsaW5ndWEsIEJhaGFzYSBJbmRvbmVzaWEsICIgKworICAiSWxva2FubywgSWRvLCDDjXNsZW5za2EsIEl0YWxpYW5vLCDml6XmnKzoqp4sIExvamJhbiwgQmFzYSBKYXdhLCAiICsKKyAgIuGDpeGDkOGDoOGDl+GDo+GDmuGDmCwgS29uZ28sIEthbGFhbGxpc3V0LCDgspXgsqjgs43gsqjgsqEsIO2VnOq1reyWtCwg0JrRitCw0YDQsNGH0LDQuS3QnNCw0LvQutGK0LDRgCwgIiArCisgICJSaXBvYXJpc2NoLCBLdXJkw64sINCa0L7QvNC4LCBLZXJuZXdlaywg0JrRi9GA0LPRi9C30YfQsCwgTGF0aW5hLCBMYWRpbm8sICIgKworICAiTMOrdHplYnVlcmdlc2NoLCBMaW1idXJncywgTGluZ8OhbGEsIOC6peC6suC6pywgTGlldHV2acWzLCBMYXR2aWXFoXUsIEJhc2EgIiArCisgICJCYW55dW1hc2FuLCBNYWxhZ2FzeSwg0JzQsNC60LXQtNC+0L3RgdC60LgsIOC0ruC0suC0r+C0vuC0s+C0giwg4KSu4KSw4KS+4KSg4KWALCDZhdin2LLZkNix2YjZhtuMLCBCYWhhc2EgIiArCisgICJNZWxheXUsIE5uYXB1bGl0YW5vLCBOZWRlcnNha3Npc2NoLCDgpKjgpYfgpKrgpL7gpLIg4KSt4KS+4KS34KS+LCBOZWRlcmxhbmRzLCDigKoiICsKKyAgIk5vcnNrIChueW5vcnNrKeKArCwg4oCqTm9yc2sgKGJva23DpWwp4oCsLCBOb3Vvcm1hbmQsIERpbsOpIGJpemFhZCwgIiArCisgICJPY2NpdGFuLCDQmNGA0L7QvdCw0YMsIFBhcGlhbWVudHUsIERlaXRzY2gsIFBvbHNraSwg2b7Zhtis2KfYqNuMLCDZvtqa2KrZiCwgIiArCisgICJOb3JmdWsgLyBQaXRrZXJuLCBQb3J0dWd1w6pzLCBSdW5hIFNpbWksIFJ1bWFudHNjaCwgUm9tYW5pLCBSb23Dom7EgywgIiArCisgICLQoNGD0YHRgdC60LjQuSwg0KHQsNGF0LAg0YLRi9C70LAsIFNhcmR1LCBTaWNpbGlhbnUsIFNjb3RzLCBTw6FtZWdpZWxsYSwgU2ltcGxlICIgKworICAiRW5nbGlzaCwgU2xvdmVuxI1pbmEsIFNsb3ZlbsWhxI1pbmEsINCh0YDQv9GB0LrQuCAvIFNycHNraSwgU2VlbHRlcnNrLCAiICsKKyAgIlN2ZW5za2EsIEtpc3dhaGlsaSwg4K6k4K6u4K6/4K604K+NLCDgsKTgsYbgsLLgsYHgsJfgsYEsINCi0L7St9C40LrToywg4LmE4LiX4LiiLCBUw7xya21lbsOnZSwgVGFnYWxvZywgIiArCisgICJUw7xya8OnZSwg0KLQsNGC0LDRgNGH0LAvVGF0YXLDp2EsINCj0LrRgNCw0ZfQvdGB0YzQutCwLCDYp9ix2K/ZiCwgVGnhur9uZyBWaeG7h3QsIFZvbGFww7xrLCAiICsKKyAgIldhbG9uLCBXaW5hcmF5LCDlkLTor60sIGlzaVhob3NhLCDXmdeZ1rTXk9eZ16ksIFlvcsO5YsOhLCBaZcOqdXdzLCDkuK3mlocsICIgKworICAiQsOibi1sw6JtLWfDuiwg57K16KqeIik7CisvKmpzaGludCArVzEwMCAqLworCitjb25zdCBzcGVjaWFsQ2hhcmFjdGVycyA9IChtb2R1bGUuZXhwb3J0cy5zcGVjaWFsQ2hhcmFjdGVycyA9CisgICdxdW90ZTogIiBiYWNrc2xhc2g6JyArCisgICIgZm9yd2FyZHNsYXNoLWVzY2FwZWQ6IC8gIiArCisgICIgYmFja3NwYWNlOiBcYiBmb3JtZmVlZDogXGYgbmV3bGluZTogXG4gcmV0dXJuOiBcciB0YWI6ICIgKworICAnIG5vdy1hbGwtb2YtdGhlbS10b2dldGhlcjogIlxcL1xiXG5cclx0JyArCisgICIgbm93LWEtYnVuY2gtb2YtanVuazogIUAjJCUmKCkoJiUkI3t9e308Pjw+PCIgKworICAnIGNoYXItdG8tdGVzdC1qc29uLXBhcnNpbmc6IF1dICJdXSBcXCIgfX19eyBbW1sgJyk7CisKK2NvbnN0IG1hcFRlc3RJbnB1dCA9IChtb2R1bGUuZXhwb3J0cy5tYXBUZXN0SW5wdXQgPSB7CisgIGE6ICIxMjMiLAorICAiYSBiIjogIndpdGggc3BhY2VzICIsCisgIHNhbWU6ICJzYW1lIiwKKyAgIjAiOiAibnVtZXJpYyBrZXkiLAorICBsb25nVmFsdWU6IHN0cmluZ1Rlc3QsCisgIHN0cmluZ1Rlc3Q6ICJsb25nIGtleSIKK30pOworCitjb25zdCBzaW1wbGUgPSBbCisgIFsidGVzdFZvaWQiLCB1bmRlZmluZWRdLAorICBbInRlc3RTdHJpbmciLCAiVGVzdCJdLAorICBbInRlc3RTdHJpbmciLCAiIl0sCisgIFsidGVzdFN0cmluZyIsIHN0cmluZ1Rlc3RdLAorICBbInRlc3RTdHJpbmciLCBzcGVjaWFsQ2hhcmFjdGVyc10sCisgIFsidGVzdEJvb2wiLCB0cnVlXSwKKyAgWyJ0ZXN0Qm9vbCIsIGZhbHNlXSwKKyAgWyJ0ZXN0Qnl0ZSIsIDFdLAorICBbInRlc3RCeXRlIiwgMF0sCisgIFsidGVzdEJ5dGUiLCAtMV0sCisgIFsidGVzdEJ5dGUiLCAtMTI3XSwKKyAgWyJ0ZXN0STMyIiwgLTFdLAorICBbInRlc3REb3VibGUiLCAtNS4yMDk4NTIzXSwKKyAgWyJ0ZXN0RG91YmxlIiwgNy4wMTIwNTIxNzUyMTUwNDRdLAorICBbInRlc3RFbnVtIiwgdHR5cGVzLk51bWJlcnouT05FXSwKKyAgWyJ0ZXN0STY0IiwgNV0sCisgIFsidGVzdEk2NCIsIC01XSwKKyAgWyJ0ZXN0STY0IiwgNzM0MzU5NzM4MzY4XSwKKyAgWyJ0ZXN0STY0IiwgLTczNDM1OTczODM2OF0sCisgIFsidGVzdEk2NCIsIG5ldyBJbnQ2NChuZXcgQnVmZmVyKFswLCAweDIwLCAwLCAwLCAwLCAwLCAwLCAxXSkpXSwgLy8gMl41MysxCisgIFsKKyAgICAidGVzdEk2NCIsCisgICAgbmV3IEludDY0KG5ldyBCdWZmZXIoWzB4ZmYsIDB4ZGYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZdKSkKKyAgXSwgLy8gLTJeNTMtMQorICBbInRlc3RUeXBlZGVmIiwgNjldCitdOworCitjb25zdCBtYXBvdXQgPSB7fTsKK2ZvciAobGV0IGkgPSAwOyBpIDwgNTsgKytpKSB7CisgIG1hcG91dFtpXSA9IGkgLSAxMDsKK30KKworY29uc3QgZGVlcCA9IFsKKyAgWworICAgICJ0ZXN0TGlzdCIsCisgICAgWzEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LCAxNywgMTgsIDE5LCAyMF0KKyAgXQorXTsKKworY29uc3QgZGVlcFVub3JkZXJlZCA9IFsKKyAgWyJ0ZXN0TWFwIiwgbWFwb3V0XSwKKyAgWyJ0ZXN0U2V0IiwgWzEsIDIsIDNdXSwKKyAgWyJ0ZXN0U3RyaW5nTWFwIiwgbWFwVGVzdElucHV0XQorXTsKKworY29uc3Qgb3V0ID0gbmV3IHR0eXBlcy5YdHJ1Y3QoeworICBzdHJpbmdfdGhpbmc6ICJaZXJvIiwKKyAgYnl0ZV90aGluZzogMSwKKyAgaTMyX3RoaW5nOiAtMywKKyAgaTY0X3RoaW5nOiAxMDAwMDAwCit9KTsKKworY29uc3Qgb3V0MiA9IG5ldyB0dHlwZXMuWHRydWN0MigpOworb3V0Mi5ieXRlX3RoaW5nID0gMTsKK291dDIuc3RydWN0X3RoaW5nID0gb3V0Oworb3V0Mi5pMzJfdGhpbmcgPSA1OworCitjb25zdCBjcmF6eSA9IG5ldyB0dHlwZXMuSW5zYW5pdHkoeworICB1c2VyTWFwOiB7ICI1IjogNSwgIjgiOiA4IH0sCisgIHh0cnVjdHM6IFsKKyAgICBuZXcgdHR5cGVzLlh0cnVjdCh7CisgICAgICBzdHJpbmdfdGhpbmc6ICJHb29kYnllNCIsCisgICAgICBieXRlX3RoaW5nOiA0LAorICAgICAgaTMyX3RoaW5nOiA0LAorICAgICAgaTY0X3RoaW5nOiA0CisgICAgfSksCisgICAgbmV3IHR0eXBlcy5YdHJ1Y3QoeworICAgICAgc3RyaW5nX3RoaW5nOiAiSGVsbG8yIiwKKyAgICAgIGJ5dGVfdGhpbmc6IDIsCisgICAgICBpMzJfdGhpbmc6IDIsCisgICAgICBpNjRfdGhpbmc6IDIKKyAgICB9KQorICBdCit9KTsKKworY29uc3QgY3JhenkyID0gbmV3IHR0eXBlcy5JbnNhbml0eSh7CisgIHVzZXJNYXA6IHsgIjUiOiA1LCAiOCI6IDggfSwKKyAgeHRydWN0czogWworICAgIHsKKyAgICAgIHN0cmluZ190aGluZzogIkdvb2RieWU0IiwKKyAgICAgIGJ5dGVfdGhpbmc6IDQsCisgICAgICBpMzJfdGhpbmc6IDQsCisgICAgICBpNjRfdGhpbmc6IDQKKyAgICB9LAorICAgIHsKKyAgICAgIHN0cmluZ190aGluZzogIkhlbGxvMiIsCisgICAgICBieXRlX3RoaW5nOiAyLAorICAgICAgaTMyX3RoaW5nOiAyLAorICAgICAgaTY0X3RoaW5nOiAyCisgICAgfQorICBdCit9KTsKKworY29uc3QgaW5zYW5pdHkgPSB7CisgICIxIjogeyAiMiI6IGNyYXp5LCAiMyI6IGNyYXp5IH0sCisgICIyIjogeyAiNiI6IHsgdXNlck1hcDoge30sIHh0cnVjdHM6IFtdIH0gfQorfTsKKworbW9kdWxlLmV4cG9ydHMuc2ltcGxlID0gc2ltcGxlOworbW9kdWxlLmV4cG9ydHMuZGVlcCA9IGRlZXA7Cittb2R1bGUuZXhwb3J0cy5kZWVwVW5vcmRlcmVkID0gZGVlcFVub3JkZXJlZDsKKworbW9kdWxlLmV4cG9ydHMub3V0ID0gb3V0OworbW9kdWxlLmV4cG9ydHMub3V0MiA9IG91dDI7Cittb2R1bGUuZXhwb3J0cy5jcmF6eSA9IGNyYXp5OworbW9kdWxlLmV4cG9ydHMuY3JhenkyID0gY3JhenkyOworbW9kdWxlLmV4cG9ydHMuaW5zYW5pdHkgPSBpbnNhbml0eTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvdGVzdC90ZXN0QWxsLnNoIGIvbGliL25vZGVqcy90ZXN0L3Rlc3RBbGwuc2gKaW5kZXggZTA5Yzc4My4uMjRmMWYyZSAxMDA3NTUKLS0tIGEvbGliL25vZGVqcy90ZXN0L3Rlc3RBbGwuc2gKKysrIGIvbGliL25vZGVqcy90ZXN0L3Rlc3RBbGwuc2gKQEAgLTEsNiArMSw1IEBACiAjISAvYmluL3NoCiAKLQogIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCiAjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCiAjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCkBAIC0xNyw0NSArMTYsNDEgQEAKICMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKICMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwogIyB1bmRlciB0aGUgTGljZW5zZS4KLSMKKworaWYgWyAtbiAiJHsxfSIgXTsgdGhlbgorICBDT1ZFUj0kezF9OworZmkKIAogRElSPSIkKCBjZCAiJCggZGlybmFtZSAiJDAiICkiICYmIHB3ZCApIgogCitJU1RBTkJVTD0iJERJUi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvaXN0YW5idWwvbGliL2NsaS5qcyIKKworUkVQT1JUX1BSRUZJWD0iJHtESVJ9Ly4uL2NvdmVyYWdlL3JlcG9ydCIKKworQ09VTlQ9MAorCiBleHBvcnQgTk9ERV9QQVRIPSIke0RJUn06JHtESVJ9Ly4uL2xpYjoke05PREVfUEFUSH0iCiAKLXRlc3RDbGllbnRTZXJ2ZXIoKQordGVzdFNlcnZlcigpCiB7Ci0gIGVjaG8gIiAgIFRlc3RpbmcgQ2xpZW50L1NlcnZlciB3aXRoIHByb3RvY29sICQxIGFuZCB0cmFuc3BvcnQgJDIgJDMiOworICBlY2hvICIgIFtFQ01BICQxXSBUZXN0aW5nICQyIENsaWVudC9TZXJ2ZXIgd2l0aCBwcm90b2NvbCAkMyBhbmQgdHJhbnNwb3J0ICQ0ICQ1IjsKICAgUkVUPTAKLSAgbm9kZSAke0RJUn0vc2VydmVyLmpzIC1wICQxIC10ICQyICQzICYKKyAgaWYgWyAtbiAiJHtDT1ZFUn0iIF07IHRoZW4KKyAgICAke0lTVEFOQlVMfSBjb3ZlciAke0RJUn0vc2VydmVyLmpzIC0tZGlyICR7UkVQT1JUX1BSRUZJWH0ke0NPVU5UfSAtLWhhbmRsZS1zaWdpbnQgLS0gLS10eXBlICQyIC1wICQzIC10ICQ0ICQ1ICYKKyAgICBDT1VOVD0kKChDT1VOVCsxKSkKKyAgZWxzZQorICAgIG5vZGUgJHtESVJ9L3NlcnZlci5qcyAtLSR7MX0gLS10eXBlICQyIC1wICQzIC10ICQ0ICQ1ICYKKyAgZmkKICAgU0VSVkVSUElEPSQhCi0gIHNsZWVwIDEKLSAgbm9kZSAke0RJUn0vY2xpZW50LmpzIC1wICQxIC10ICQyICQzIHx8IFJFVD0xCi0gIGtpbGwgLTkgJFNFUlZFUlBJRCB8fCBSRVQ9MQotICByZXR1cm4gJFJFVAotfQotCi10ZXN0TXVsdGlwbGV4ZWRDbGllbnRTZXJ2ZXIoKQotewotICBlY2hvICIgICBUZXN0aW5nIE11bHRpcGxleGVkIENsaWVudC9TZXJ2ZXIgd2l0aCBwcm90b2NvbCAkMSBhbmQgdHJhbnNwb3J0ICQyICQzIjsKLSAgUkVUPTAKLSAgbm9kZSAke0RJUn0vbXVsdGlwbGV4X3NlcnZlci5qcyAtcCAkMSAtdCAkMiAkMyAmCi0gIFNFUlZFUlBJRD0kIQotICBzbGVlcCAxCi0gIG5vZGUgJHtESVJ9L211bHRpcGxleF9jbGllbnQuanMgLXAgJDEgLXQgJDIgJDMgfHwgUkVUPTEKLSAga2lsbCAtOSAkU0VSVkVSUElEIHx8IFJFVD0xCi0gIHJldHVybiAkUkVUCi19Ci0KLXRlc3RIdHRwQ2xpZW50U2VydmVyKCkKLXsKLSAgZWNobyAiICAgVGVzdGluZyBIVFRQIENsaWVudC9TZXJ2ZXIgd2l0aCBwcm90b2NvbCAkMSBhbmQgdHJhbnNwb3J0ICQyICQzIjsKLSAgUkVUPTAKLSAgbm9kZSAke0RJUn0vaHR0cF9zZXJ2ZXIuanMgLXAgJDEgLXQgJDIgJDMgJgotICBTRVJWRVJQSUQ9JCEKLSAgc2xlZXAgMQotICBub2RlICR7RElSfS9odHRwX2NsaWVudC5qcyAtcCAkMSAtdCAkMiAkMyB8fCBSRVQ9MQotICBraWxsIC05ICRTRVJWRVJQSUQgfHwgUkVUPTEKKyAgc2xlZXAgMC4xCisgIGlmIFsgLW4gIiR7Q09WRVJ9IiBdOyB0aGVuCisgICAgJHtJU1RBTkJVTH0gY292ZXIgJHtESVJ9L2NsaWVudC5qcyAtLWRpciAke1JFUE9SVF9QUkVGSVh9JHtDT1VOVH0gLS0gLS0kezF9IC0tdHlwZSAkMiAtcCAkMyAtdCAkNCAkNSB8fCBSRVQ9MQorICAgIENPVU5UPSQoKENPVU5UKzEpKQorICBlbHNlCisgICAgbm9kZSAke0RJUn0vY2xpZW50LmpzIC0tJHsxfSAtLXR5cGUgJDIgLXAgJDMgLXQgJDQgJDUgfHwgUkVUPTEKKyAgZmkKKyAga2lsbCAtMiAkU0VSVkVSUElEIHx8IFJFVD0xCisgIHdhaXQgJFNFUlZFUlBJRAogICByZXR1cm4gJFJFVAogfQogCkBAIC02NSw0MyArNjAsMzkgQEAKICNnZW5lcmF0aW5nIHRocmlmdCBjb2RlCiAKICR7RElSfS8uLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1vICR7RElSfSAtLWdlbiBqczpub2RlICR7RElSfS8uLi8uLi8uLi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0Ciske0RJUn0vLi4vLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtbyAke0RJUn0gLS1nZW4ganM6bm9kZSAke0RJUn0vLi4vLi4vLi4vdGVzdC9Kc0RlZXBDb25zdHJ1Y3RvclRlc3QudGhyaWZ0Citta2RpciAke0RJUn0vZ2VuLW5vZGVqcy1lczYKKyR7RElSfS8uLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1vdXQgJHtESVJ9L2dlbi1ub2RlanMtZXM2IC0tZ2VuIGpzOm5vZGUsZXM2ICR7RElSfS8uLi8uLi8uLi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0Ciske0RJUn0vLi4vLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtb3V0ICR7RElSfS9nZW4tbm9kZWpzLWVzNiAtLWdlbiBqczpub2RlLGVzNiAke0RJUn0vLi4vLi4vLi4vdGVzdC9Kc0RlZXBDb25zdHJ1Y3RvclRlc3QudGhyaWZ0CiAKICN1bml0IHRlc3RzCiAKIG5vZGUgJHtESVJ9L2JpbmFyeS50ZXN0LmpzIHx8IFRFU1RPSz0xCitub2RlICR7RElSfS9kZWVwLWNvbnN0cnVjdG9yLnRlc3QuanMgfHwgVEVTVE9LPTEKIAogI2ludGVncmF0aW9uIHRlc3RzCiAKLSNUQ1AgY29ubmVjdGlvbiB0ZXN0cwotdGVzdENsaWVudFNlcnZlciBjb21wYWN0IGJ1ZmZlcmVkIHx8IFRFU1RPSz0xCi10ZXN0Q2xpZW50U2VydmVyIGNvbXBhY3QgZnJhbWVkIHx8IFRFU1RPSz0xCi10ZXN0Q2xpZW50U2VydmVyIGJpbmFyeSBidWZmZXJlZCB8fCBURVNUT0s9MQotdGVzdENsaWVudFNlcnZlciBqc29uIGJ1ZmZlcmVkIHx8IFRFU1RPSz0xCi10ZXN0Q2xpZW50U2VydmVyIGJpbmFyeSBmcmFtZWQgfHwgVEVTVE9LPTEKLXRlc3RDbGllbnRTZXJ2ZXIganNvbiBmcmFtZWQgfHwgVEVTVE9LPTEKK2ZvciB0eXBlIGluIHRjcCBtdWx0aXBsZXggd2Vic29ja2V0IGh0dHAKK2RvCisgIGZvciBwcm90b2NvbCBpbiBjb21wYWN0IGJpbmFyeSBqc29uCisgIGRvCisgICAgZm9yIHRyYW5zcG9ydCBpbiBidWZmZXJlZCBmcmFtZWQKKyAgICBkbworICAgICAgZm9yIGVjbWFfdmVyc2lvbiBpbiBlczUgZXM2CisgICAgICBkbworICAgICAgICB0ZXN0U2VydmVyICRlY21hX3ZlcnNpb24gJHR5cGUgJHByb3RvY29sICR0cmFuc3BvcnQgfHwgVEVTVE9LPTEKKyAgICAgICAgdGVzdFNlcnZlciAkZWNtYV92ZXJzaW9uICR0eXBlICRwcm90b2NvbCAkdHJhbnNwb3J0IC0tc3NsIHx8IFRFU1RPSz0xCisgICAgICAgIHRlc3RTZXJ2ZXIgJGVjbWFfdmVyc2lvbiAkdHlwZSAkcHJvdG9jb2wgJHRyYW5zcG9ydCAtLWNhbGxiYWNrIHx8IFRFU1RPSz0xCisgICAgICBkb25lCisgICAgZG9uZQorICBkb25lCitkb25lCiAKLSN0ZXN0cyBmb3IgbXVsdGlwbGV4ZWQgc2VydmljZXMKLXRlc3RNdWx0aXBsZXhlZENsaWVudFNlcnZlciBiaW5hcnkgYnVmZmVyZWQgfHwgVEVTVE9LPTEKLXRlc3RNdWx0aXBsZXhlZENsaWVudFNlcnZlciBqc29uIGJ1ZmZlcmVkIHx8IFRFU1RPSz0xCi10ZXN0TXVsdGlwbGV4ZWRDbGllbnRTZXJ2ZXIgYmluYXJ5IGZyYW1lZCB8fCBURVNUT0s9MQotdGVzdE11bHRpcGxleGVkQ2xpZW50U2VydmVyIGNvbXBhY3QgZnJhbWVkIHx8IFRFU1RPSz0xCiAKLSN0ZXN0IHNzbCBjb25uZWN0aW9uCi10ZXN0Q2xpZW50U2VydmVyIGJpbmFyeSBmcmFtZWQgLS1zc2wgfHwgVEVTVE9LPTEKLXRlc3RNdWx0aXBsZXhlZENsaWVudFNlcnZlciBiaW5hcnkgZnJhbWVkIC0tc3NsIHx8IFRFU1RPSz0xCi0KLSN0ZXN0IHByb21pc2Ugc3R5bGUKLXRlc3RDbGllbnRTZXJ2ZXIgYmluYXJ5IGZyYW1lZCAtLXByb21pc2UgfHwgVEVTVE9LPTEKLXRlc3RDbGllbnRTZXJ2ZXIgY29tcGFjdCBidWZmZXJlZCAtLXByb21pc2UgfHwgVEVTVE9LPTEKLQotI0hUVFAgdGVzdHMKLXRlc3RIdHRwQ2xpZW50U2VydmVyIGNvbXBhY3QgYnVmZmVyZWQgfHwgVEVTVE9LPTEKLXRlc3RIdHRwQ2xpZW50U2VydmVyIGNvbXBhY3QgZnJhbWVkIHx8IFRFU1RPSz0xCi10ZXN0SHR0cENsaWVudFNlcnZlciBqc29uIGJ1ZmZlcmVkIHx8IFRFU1RPSz0xCi10ZXN0SHR0cENsaWVudFNlcnZlciBqc29uIGZyYW1lZCB8fCBURVNUT0s9MQotdGVzdEh0dHBDbGllbnRTZXJ2ZXIgYmluYXJ5IGJ1ZmZlcmVkIHx8IFRFU1RPSz0xCi10ZXN0SHR0cENsaWVudFNlcnZlciBiaW5hcnkgZnJhbWVkIHx8IFRFU1RPSz0xCi10ZXN0SHR0cENsaWVudFNlcnZlciBqc29uIGJ1ZmZlcmVkIC0tcHJvbWlzZSB8fCBURVNUT0s9MQotdGVzdEh0dHBDbGllbnRTZXJ2ZXIgYmluYXJ5IGZyYW1lZCAtLXNzbCB8fCBURVNUT0s9MQoraWYgWyAtbiAiJHtDT1ZFUn0iIF07IHRoZW4KKyAgJHtJU1RBTkJVTH0gcmVwb3J0IC0tZGlyICIke0RJUn0vLi4vY292ZXJhZ2UiIC0taW5jbHVkZSAiJHtESVJ9Ly4uL2NvdmVyYWdlL3JlcG9ydCovY292ZXJhZ2UuanNvbiIgbGNvdiBjb2JlcnR1cmEgaHRtbAorICBybSAtciAke0RJUn0vLi4vY292ZXJhZ2UvcmVwb3J0Ki8qCisgIHJtZGlyICR7RElSfS8uLi9jb3ZlcmFnZS9yZXBvcnQqCitmaQogCiBleGl0ICRURVNUT0sKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvdGVzdC90ZXN0X2RyaXZlci5qcyBiL2xpYi9ub2RlanMvdGVzdC90ZXN0X2RyaXZlci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzlhOTE5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy90ZXN0L3Rlc3RfZHJpdmVyLmpzCkBAIC0wLDAgKzEsMzYxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICdMaWNlbnNlJyk7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICdBUyBJUycgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIFRoaXMgaXMgdGhlIE5vZGUuanMgdGVzdCBkcml2ZXIgZm9yIHRoZSBzdGFuZGFyZCBBcGFjaGUgVGhyaWZ0CisvLyB0ZXN0IHNlcnZpY2UuIFRoZSBkcml2ZXIgaW52b2tlcyBldmVyeSBmdW5jdGlvbiBkZWZpbmVkIGluIHRoZQorLy8gVGhyaWZ0IFRlc3Qgc2VydmljZSB3aXRoIGEgcmVwcmVzZW50YXRpdmUgcmFuZ2Ugb2YgcGFyYW1ldGVycy4KKy8vCisvLyBUaGUgVGhyaWZ0VGVzdERyaXZlciBmdW5jdGlvbiByZXF1aXJlcyBhIGNsaWVudCBvYmplY3QKKy8vIGNvbm5lY3RlZCB0byBhIHNlcnZlciBob3N0aW5nIHRoZSBUaHJpZnQgVGVzdCBzZXJ2aWNlIGFuZAorLy8gc3VwcG9ydHMgYW4gb3B0aW9uYWwgY2FsbGJhY2sgZnVuY3Rpb24gd2hpY2ggaXMgY2FsbGVkIHdpdGgKKy8vIGEgc3RhdHVzIG1lc3NhZ2Ugd2hlbiB0aGUgdGVzdCBpcyBjb21wbGV0ZS4KKworY29uc3QgdGVzdCA9IHJlcXVpcmUoInRhcGUiKTsKKworY29uc3QgaGVscGVycyA9IHJlcXVpcmUoIi4vaGVscGVycyIpOworY29uc3QgdHR5cGVzID0gcmVxdWlyZShgLi8ke2hlbHBlcnMuZ2VuUGF0aH0vVGhyaWZ0VGVzdF90eXBlc2ApOworY29uc3QgVEV4Y2VwdGlvbiA9IHJlcXVpcmUoInRocmlmdCIpLlRocmlmdC5URXhjZXB0aW9uOworY29uc3QgSW50NjQgPSByZXF1aXJlKCJub2RlLWludDY0Iik7Citjb25zdCB0ZXN0Q2FzZXMgPSByZXF1aXJlKCIuL3Rlc3QtY2FzZXMiKTsKKworZXhwb3J0cy5UaHJpZnRUZXN0RHJpdmVyID0gZnVuY3Rpb24oY2xpZW50LCBjYWxsYmFjaykgeworICB0ZXN0KAorICAgICJOb2RlSlMgU3R5bGUgQ2FsbGJhY2sgQ2xpZW50IFRlc3RzIiwKKyAgICB7IHNraXA6IGhlbHBlcnMuZWNtYU1vZGUgPT09ICJlczYiIH0sCisgICAgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgICBjb25zdCBjaGVja1JlY3Vyc2l2ZWx5ID0gbWFrZVJlY3Vyc2l2ZUNoZWNrKGFzc2VydCk7CisKKyAgICAgIGZ1bmN0aW9uIG1ha2VBc3NlcnRlcihhc3NlcnRpb25GbikgeworICAgICAgICByZXR1cm4gZnVuY3Rpb24oYykgeworICAgICAgICAgIGNvbnN0IGZuTmFtZSA9IGNbMF07CisgICAgICAgICAgY29uc3QgZXhwZWN0ZWQgPSBjWzFdOworICAgICAgICAgIGNsaWVudFtmbk5hbWVdKGV4cGVjdGVkLCBmdW5jdGlvbihlcnIsIGFjdHVhbCkgeworICAgICAgICAgICAgYXNzZXJ0LmVycm9yKGVyciwgZm5OYW1lICsgIjogbm8gY2FsbGJhY2sgZXJyb3IiKTsKKyAgICAgICAgICAgIGFzc2VydGlvbkZuKGFjdHVhbCwgZXhwZWN0ZWQsIGZuTmFtZSk7CisgICAgICAgICAgfSk7CisgICAgICAgIH07CisgICAgICB9CisKKyAgICAgIHRlc3RDYXNlcy5zaW1wbGUuZm9yRWFjaCgKKyAgICAgICAgbWFrZUFzc2VydGVyKGZ1bmN0aW9uKGEsIGUsIG0pIHsKKyAgICAgICAgICBpZiAoYSBpbnN0YW5jZW9mIEludDY0KSB7CisgICAgICAgICAgICBjb25zdCBlNjQgPSBlIGluc3RhbmNlb2YgSW50NjQgPyBlIDogbmV3IEludDY0KGUpOworICAgICAgICAgICAgYXNzZXJ0LmRlZXBFcXVhbChhLmJ1ZmZlciwgZTY0LmJ1ZmZlciwgbSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFzc2VydC5lcXVhbChhLCBlLCBtKTsKKyAgICAgICAgICB9CisgICAgICAgIH0pCisgICAgICApOworICAgICAgdGVzdENhc2VzLmRlZXAuZm9yRWFjaChtYWtlQXNzZXJ0ZXIoYXNzZXJ0LmRlZXBFcXVhbCkpOworICAgICAgdGVzdENhc2VzLmRlZXBVbm9yZGVyZWQuZm9yRWFjaCgKKyAgICAgICAgbWFrZUFzc2VydGVyKG1ha2VVbm9yZGVyZWREZWVwRXF1YWwoYXNzZXJ0KSkKKyAgICAgICk7CisKKyAgICAgIGNvbnN0IGFyciA9IFtdOworICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAyNTY7ICsraSkgeworICAgICAgICBhcnJbaV0gPSAyNTUgLSBpOworICAgICAgfQorICAgICAgbGV0IGJ1ZiA9IG5ldyBCdWZmZXIoYXJyKTsKKyAgICAgIGNsaWVudC50ZXN0QmluYXJ5KGJ1ZiwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgeworICAgICAgICBhc3NlcnQuZXJyb3IoZXJyLCAidGVzdEJpbmFyeTogbm8gY2FsbGJhY2sgZXJyb3IiKTsKKyAgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3BvbnNlLmxlbmd0aCwgMjU2LCAidGVzdEJpbmFyeSIpOworICAgICAgICBhc3NlcnQuZGVlcEVxdWFsKHJlc3BvbnNlLCBidWYsICJ0ZXN0QmluYXJ5KEJ1ZmZlcikiKTsKKyAgICAgIH0pOworICAgICAgYnVmID0gbmV3IEJ1ZmZlcihhcnIpOworICAgICAgY2xpZW50LnRlc3RCaW5hcnkoYnVmLnRvU3RyaW5nKCJiaW5hcnkiKSwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgeworICAgICAgICBhc3NlcnQuZXJyb3IoZXJyLCAidGVzdEJpbmFyeTogbm8gY2FsbGJhY2sgZXJyb3IiKTsKKyAgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3BvbnNlLmxlbmd0aCwgMjU2LCAidGVzdEJpbmFyeSIpOworICAgICAgICBhc3NlcnQuZGVlcEVxdWFsKHJlc3BvbnNlLCBidWYsICJ0ZXN0QmluYXJ5KHN0cmluZykiKTsKKyAgICAgIH0pOworCisgICAgICBjbGllbnQudGVzdE1hcE1hcCg0MiwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgeworICAgICAgICBjb25zdCBleHBlY3RlZCA9IHsKKyAgICAgICAgICAiNCI6IHsgIjEiOiAxLCAiMiI6IDIsICIzIjogMywgIjQiOiA0IH0sCisgICAgICAgICAgIi00IjogeyAiLTQiOiAtNCwgIi0zIjogLTMsICItMiI6IC0yLCAiLTEiOiAtMSB9CisgICAgICAgIH07CisgICAgICAgIGFzc2VydC5lcnJvcihlcnIsICJ0ZXN0TWFwTWFwOiBubyBjYWxsYmFjayBlcnJvciIpOworICAgICAgICBhc3NlcnQuZGVlcEVxdWFsKGV4cGVjdGVkLCByZXNwb25zZSwgInRlc3RNYXBNYXAiKTsKKyAgICAgIH0pOworCisgICAgICBjbGllbnQudGVzdFN0cnVjdCh0ZXN0Q2FzZXMub3V0LCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7CisgICAgICAgIGFzc2VydC5lcnJvcihlcnIsICJ0ZXN0U3RydWN0OiBubyBjYWxsYmFjayBlcnJvciIpOworICAgICAgICBjaGVja1JlY3Vyc2l2ZWx5KHRlc3RDYXNlcy5vdXQsIHJlc3BvbnNlLCAidGVzdFN0cnVjdCIpOworICAgICAgfSk7CisKKyAgICAgIGNsaWVudC50ZXN0TmVzdCh0ZXN0Q2FzZXMub3V0MiwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgeworICAgICAgICBhc3NlcnQuZXJyb3IoZXJyLCAidGVzdE5lc3Q6IG5vIGNhbGxiYWNrIGVycm9yIik7CisgICAgICAgIGNoZWNrUmVjdXJzaXZlbHkodGVzdENhc2VzLm91dDIsIHJlc3BvbnNlLCAidGVzdE5lc3QiKTsKKyAgICAgIH0pOworCisgICAgICBjbGllbnQudGVzdEluc2FuaXR5KHRlc3RDYXNlcy5jcmF6eSwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgeworICAgICAgICBhc3NlcnQuZXJyb3IoZXJyLCAidGVzdEluc2FuaXR5OiBubyBjYWxsYmFjayBlcnJvciIpOworICAgICAgICBjaGVja1JlY3Vyc2l2ZWx5KHRlc3RDYXNlcy5pbnNhbml0eSwgcmVzcG9uc2UsICJ0ZXN0SW5zYW5pdHkiKTsKKyAgICAgIH0pOworCisgICAgICBjbGllbnQudGVzdEluc2FuaXR5KHRlc3RDYXNlcy5jcmF6eTIsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsKKyAgICAgICAgYXNzZXJ0LmVycm9yKGVyciwgInRlc3RJbnNhbml0eTI6IG5vIGNhbGxiYWNrIGVycm9yIik7CisgICAgICAgIGNoZWNrUmVjdXJzaXZlbHkodGVzdENhc2VzLmluc2FuaXR5LCByZXNwb25zZSwgInRlc3RJbnNhbml0eTIiKTsKKyAgICAgIH0pOworCisgICAgICBjbGllbnQudGVzdEV4Y2VwdGlvbigiVEV4Y2VwdGlvbiIsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsKKyAgICAgICAgYXNzZXJ0Lm9rKAorICAgICAgICAgIGVyciBpbnN0YW5jZW9mIFRFeGNlcHRpb24sCisgICAgICAgICAgInRlc3RFeGNlcHRpb246IGNvcnJlY3QgZXJyb3IgdHlwZSIKKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0Lm9rKCFyZXNwb25zZSwgInRlc3RFeGNlcHRpb246IG5vIHJlc3BvbnNlIik7CisgICAgICB9KTsKKworICAgICAgY2xpZW50LnRlc3RFeGNlcHRpb24oIlhjZXB0aW9uIiwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgeworICAgICAgICBhc3NlcnQub2soCisgICAgICAgICAgZXJyIGluc3RhbmNlb2YgdHR5cGVzLlhjZXB0aW9uLAorICAgICAgICAgICJ0ZXN0RXhjZXB0aW9uOiBjb3JyZWN0IGVycm9yIHR5cGUiCisgICAgICAgICk7CisgICAgICAgIGFzc2VydC5vayghcmVzcG9uc2UsICJ0ZXN0RXhjZXB0aW9uOiBubyByZXNwb25zZSIpOworICAgICAgICBhc3NlcnQuZXF1YWwoZXJyLmVycm9yQ29kZSwgMTAwMSwgInRlc3RFeGNlcHRpb246IGNvcnJlY3QgZXJyb3IgY29kZSIpOworICAgICAgICBhc3NlcnQuZXF1YWwoCisgICAgICAgICAgIlhjZXB0aW9uIiwKKyAgICAgICAgICBlcnIubWVzc2FnZSwKKyAgICAgICAgICAidGVzdEV4Y2VwdGlvbjogY29ycmVjdCBlcnJvciBtZXNzYWdlIgorICAgICAgICApOworICAgICAgfSk7CisKKyAgICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCJubyBFeGNlcHRpb24iLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7CisgICAgICAgIGFzc2VydC5lcnJvcihlcnIsICJ0ZXN0RXhjZXB0aW9uOiBubyBjYWxsYmFjayBlcnJvciIpOworICAgICAgICBhc3NlcnQub2soIXJlc3BvbnNlLCAidGVzdEV4Y2VwdGlvbjogbm8gcmVzcG9uc2UiKTsKKyAgICAgIH0pOworCisgICAgICBjbGllbnQudGVzdE9uZXdheSgwLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7CisgICAgICAgIGFzc2VydC5lcnJvcihlcnIsICJ0ZXN0T25ld2F5OiBubyBjYWxsYmFjayBlcnJvciIpOworICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzcG9uc2UsIHVuZGVmaW5lZCwgInRlc3RPbmV3YXk6IHZvaWQgcmVzcG9uc2UiKTsKKyAgICAgIH0pOworCisgICAgICBjaGVja09mZkJ5T25lKGZ1bmN0aW9uKGRvbmUpIHsKKyAgICAgICAgY2xpZW50LnRlc3RJMzIoLTEsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsKKyAgICAgICAgICBhc3NlcnQuZXJyb3IoZXJyLCAiY2hlY2tPZmZCeU9uZTogbm8gY2FsbGJhY2sgZXJyb3IiKTsKKyAgICAgICAgICBhc3NlcnQuZXF1YWwoLTEsIHJlc3BvbnNlKTsKKyAgICAgICAgICBhc3NlcnQuZW5kKCk7CisgICAgICAgICAgZG9uZSgpOworICAgICAgICB9KTsKKyAgICAgIH0sIGNhbGxiYWNrKTsKKyAgICB9CisgICk7CisKKyAgLy8gRVM2IGRvZXMgbm90IHN1cHBvcnQgY2FsbGJhY2sgc3R5bGUKKyAgaWYgKGhlbHBlcnMuZWNtYU1vZGUgPT09ICJlczYiKSB7CisgICAgY2hlY2tPZmZCeU9uZShkb25lID0+IGRvbmUoKSwgY2FsbGJhY2spOworICB9Cit9OworCitleHBvcnRzLlRocmlmdFRlc3REcml2ZXJQcm9taXNlID0gZnVuY3Rpb24oY2xpZW50LCBjYWxsYmFjaykgeworICB0ZXN0KCJQcm9taXNlIENsaWVudCBUZXN0cyIsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGNvbnN0IGNoZWNrUmVjdXJzaXZlbHkgPSBtYWtlUmVjdXJzaXZlQ2hlY2soYXNzZXJ0KTsKKworICAgIGZ1bmN0aW9uIG1ha2VBc3NlcnRlcihhc3NlcnRpb25GbikgeworICAgICAgcmV0dXJuIGZ1bmN0aW9uKGMpIHsKKyAgICAgICAgY29uc3QgZm5OYW1lID0gY1swXTsKKyAgICAgICAgY29uc3QgZXhwZWN0ZWQgPSBjWzFdOworICAgICAgICBjbGllbnRbZm5OYW1lXShleHBlY3RlZCkKKyAgICAgICAgICAudGhlbihmdW5jdGlvbihhY3R1YWwpIHsKKyAgICAgICAgICAgIGFzc2VydGlvbkZuKGFjdHVhbCwgZXhwZWN0ZWQsIGZuTmFtZSk7CisgICAgICAgICAgfSkKKyAgICAgICAgICAuY2F0Y2goKCkgPT4gYXNzZXJ0LmZhaWwoImZuTmFtZSIpKTsKKyAgICAgIH07CisgICAgfQorCisgICAgdGVzdENhc2VzLnNpbXBsZS5mb3JFYWNoKAorICAgICAgbWFrZUFzc2VydGVyKGZ1bmN0aW9uKGEsIGUsIG0pIHsKKyAgICAgICAgaWYgKGEgaW5zdGFuY2VvZiBJbnQ2NCkgeworICAgICAgICAgIGNvbnN0IGU2NCA9IGUgaW5zdGFuY2VvZiBJbnQ2NCA/IGUgOiBuZXcgSW50NjQoZSk7CisgICAgICAgICAgYXNzZXJ0LmRlZXBFcXVhbChhLmJ1ZmZlciwgZTY0LmJ1ZmZlciwgbSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgYXNzZXJ0LmVxdWFsKGEsIGUsIG0pOworICAgICAgICB9CisgICAgICB9KQorICAgICk7CisgICAgdGVzdENhc2VzLmRlZXAuZm9yRWFjaChtYWtlQXNzZXJ0ZXIoYXNzZXJ0LmRlZXBFcXVhbCkpOworICAgIHRlc3RDYXNlcy5kZWVwVW5vcmRlcmVkLmZvckVhY2goCisgICAgICBtYWtlQXNzZXJ0ZXIobWFrZVVub3JkZXJlZERlZXBFcXVhbChhc3NlcnQpKQorICAgICk7CisKKyAgICBjbGllbnQKKyAgICAgIC50ZXN0U3RydWN0KHRlc3RDYXNlcy5vdXQpCisgICAgICAudGhlbihmdW5jdGlvbihyZXNwb25zZSkgeworICAgICAgICBjaGVja1JlY3Vyc2l2ZWx5KHRlc3RDYXNlcy5vdXQsIHJlc3BvbnNlLCAidGVzdFN0cnVjdCIpOworICAgICAgfSkKKyAgICAgIC5jYXRjaCgoKSA9PiBhc3NlcnQuZmFpbCgidGVzdFN0cnVjdCIpKTsKKworICAgIGNsaWVudAorICAgICAgLnRlc3ROZXN0KHRlc3RDYXNlcy5vdXQyKQorICAgICAgLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsKKyAgICAgICAgY2hlY2tSZWN1cnNpdmVseSh0ZXN0Q2FzZXMub3V0MiwgcmVzcG9uc2UsICJ0ZXN0TmVzdCIpOworICAgICAgfSkKKyAgICAgIC5jYXRjaCgoKSA9PiBhc3NlcnQuZmFpbCgidGVzdE5lc3QiKSk7CisKKyAgICBjbGllbnQKKyAgICAgIC50ZXN0SW5zYW5pdHkodGVzdENhc2VzLmNyYXp5KQorICAgICAgLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsKKyAgICAgICAgY2hlY2tSZWN1cnNpdmVseSh0ZXN0Q2FzZXMuaW5zYW5pdHksIHJlc3BvbnNlLCAidGVzdEluc2FuaXR5Iik7CisgICAgICB9KQorICAgICAgLmNhdGNoKCgpID0+IGFzc2VydC5mYWlsKCJ0ZXN0SW5zYW5pdHkiKSk7CisKKyAgICBjbGllbnQKKyAgICAgIC50ZXN0SW5zYW5pdHkodGVzdENhc2VzLmNyYXp5MikKKyAgICAgIC50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CisgICAgICAgIGNoZWNrUmVjdXJzaXZlbHkodGVzdENhc2VzLmluc2FuaXR5LCByZXNwb25zZSwgInRlc3RJbnNhbml0eTIiKTsKKyAgICAgIH0pCisgICAgICAuY2F0Y2goKCkgPT4gYXNzZXJ0LmZhaWwoInRlc3RJbnNhbml0eTIiKSk7CisKKyAgICBjbGllbnQKKyAgICAgIC50ZXN0RXhjZXB0aW9uKCJURXhjZXB0aW9uIikKKyAgICAgIC50aGVuKGZ1bmN0aW9uKCkgeworICAgICAgICBhc3NlcnQuZmFpbCgidGVzdEV4Y2VwdGlvbjogVEV4Y2VwdGlvbiIpOworICAgICAgfSkKKyAgICAgIC5jYXRjaChmdW5jdGlvbihlcnIpIHsKKyAgICAgICAgYXNzZXJ0Lm9rKGVyciBpbnN0YW5jZW9mIFRFeGNlcHRpb24pOworICAgICAgfSk7CisKKyAgICBjbGllbnQKKyAgICAgIC50ZXN0RXhjZXB0aW9uKCJYY2VwdGlvbiIpCisgICAgICAudGhlbihmdW5jdGlvbigpIHsKKyAgICAgICAgYXNzZXJ0LmZhaWwoInRlc3RFeGNlcHRpb246IFhjZXB0aW9uIik7CisgICAgICB9KQorICAgICAgLmNhdGNoKGZ1bmN0aW9uKGVycikgeworICAgICAgICBhc3NlcnQub2soZXJyIGluc3RhbmNlb2YgdHR5cGVzLlhjZXB0aW9uKTsKKyAgICAgICAgYXNzZXJ0LmVxdWFsKGVyci5lcnJvckNvZGUsIDEwMDEpOworICAgICAgICBhc3NlcnQuZXF1YWwoIlhjZXB0aW9uIiwgZXJyLm1lc3NhZ2UpOworICAgICAgfSk7CisKKyAgICBjbGllbnQKKyAgICAgIC50ZXN0RXhjZXB0aW9uKCJubyBFeGNlcHRpb24iKQorICAgICAgLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsKKyAgICAgICAgYXNzZXJ0LmVxdWFsKHVuZGVmaW5lZCwgcmVzcG9uc2UpOyAvL3ZvaWQKKyAgICAgIH0pCisgICAgICAuY2F0Y2goKCkgPT4gYXNzZXJ0LmZhaWwoInRlc3RFeGNlcHRpb24iKSk7CisKKyAgICBjbGllbnQKKyAgICAgIC50ZXN0T25ld2F5KDApCisgICAgICAudGhlbihmdW5jdGlvbihyZXNwb25zZSkgeworICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzcG9uc2UsIHVuZGVmaW5lZCwgInRlc3RPbmV3YXk6IHZvaWQgcmVzcG9uc2UiKTsKKyAgICAgIH0pCisgICAgICAuY2F0Y2goKCkgPT4gYXNzZXJ0LmZhaWwoInRlc3RPbmV3YXk6IHNob3VsZCBub3QgcmVqZWN0IikpOworCisgICAgY2hlY2tPZmZCeU9uZShmdW5jdGlvbihkb25lKSB7CisgICAgICBjbGllbnQKKyAgICAgICAgLnRlc3RJMzIoLTEpCisgICAgICAgIC50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CisgICAgICAgICAgYXNzZXJ0LmVxdWFsKC0xLCByZXNwb25zZSk7CisgICAgICAgICAgYXNzZXJ0LmVuZCgpOworICAgICAgICAgIGRvbmUoKTsKKyAgICAgICAgfSkKKyAgICAgICAgLmNhdGNoKCgpID0+IGFzc2VydC5mYWlsKCJjaGVja09mZkJ5T25lIikpOworICAgIH0sIGNhbGxiYWNrKTsKKyAgfSk7Cit9OworCisvLyBIZWxwZXIgRnVuY3Rpb25zCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworZnVuY3Rpb24gbWFrZVJlY3Vyc2l2ZUNoZWNrKGFzc2VydCkgeworICByZXR1cm4gZnVuY3Rpb24obWFwMSwgbWFwMiwgbXNnKSB7CisgICAgY29uc3QgZXF1YWwgPSBjaGVja1JlY3Vyc2l2ZWx5KG1hcDEsIG1hcDIpOworCisgICAgYXNzZXJ0Lm9rKGVxdWFsLCBtc2cpOworCisgICAgLy8gZGVlcEVxdWFsIGRvZXNuJ3Qgd29yayB3aXRoIGZpZWxkcyB1c2luZyBub2RlLWludDY0CisgICAgZnVuY3Rpb24gY2hlY2tSZWN1cnNpdmVseShtYXAxLCBtYXAyKSB7CisgICAgICBpZiAodHlwZW9mIG1hcDEgIT09ICJmdW5jdGlvbiIgJiYgdHlwZW9mIG1hcDIgIT09ICJmdW5jdGlvbiIpIHsKKyAgICAgICAgaWYgKCFtYXAxIHx8IHR5cGVvZiBtYXAxICE9PSAib2JqZWN0IikgeworICAgICAgICAgIC8vSGFuZGxlIGludDY0IHR5cGVzICh3aGljaCB1c2Ugbm9kZS1pbnQ2NCBpbiBOb2RlLmpzIEphdmFTY3JpcHQpCisgICAgICAgICAgaWYgKAorICAgICAgICAgICAgdHlwZW9mIG1hcDEgPT09ICJudW1iZXIiICYmCisgICAgICAgICAgICB0eXBlb2YgbWFwMiA9PT0gIm9iamVjdCIgJiYKKyAgICAgICAgICAgIG1hcDIuYnVmZmVyICYmCisgICAgICAgICAgICBtYXAyLmJ1ZmZlciBpbnN0YW5jZW9mIEJ1ZmZlciAmJgorICAgICAgICAgICAgbWFwMi5idWZmZXIubGVuZ3RoID09PSA4CisgICAgICAgICAgKSB7CisgICAgICAgICAgICBjb25zdCBuID0gbmV3IEludDY0KG1hcDIuYnVmZmVyKTsKKyAgICAgICAgICAgIHJldHVybiBtYXAxID09PSBuLnRvTnVtYmVyKCk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBtYXAxID09IG1hcDI7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhtYXAxKS5ldmVyeShmdW5jdGlvbihrZXkpIHsKKyAgICAgICAgICAgIHJldHVybiBjaGVja1JlY3Vyc2l2ZWx5KG1hcDFba2V5XSwgbWFwMltrZXldKTsKKyAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfTsKK30KKworZnVuY3Rpb24gY2hlY2tPZmZCeU9uZShkb25lLCBjYWxsYmFjaykgeworICBjb25zdCByZXRyeV9saW1pdCA9IDMwOworICBjb25zdCByZXRyeV9pbnRlcnZhbCA9IDEwMDsKKyAgbGV0IHRlc3RfY29tcGxldGUgPSBmYWxzZTsKKyAgbGV0IHJldHJ5cyA9IDA7CisKKyAgLyoqCisgICAqIHJlZG8gYSBzaW1wbGUgdGVzdCBhZnRlciB0aGUgb25ld2F5IHRvIG1ha2Ugc3VyZSB3ZSBhcmVuJ3QgIm9mZiBieSBvbmUiIC0tCisgICAqIGlmIHRoZSBzZXJ2ZXIgdHJlYXRlZCBvbmV3YXkgdm9pZCBsaWtlIG5vcm1hbCB2b2lkLCB0aGlzIG5leHQgdGVzdCB3aWxsCisgICAqIGZhaWwgc2luY2UgaXQgd2lsbCBnZXQgdGhlIHZvaWQgY29uZmlybWF0aW9uIHJhdGhlciB0aGFuIHRoZSBjb3JyZWN0CisgICAqIHJlc3VsdC4gSW4gdGhpcyBjaXJjdW1zdGFuY2UsIHRoZSBjbGllbnQgd2lsbCB0aHJvdyB0aGUgZXhjZXB0aW9uOgorICAgKgorICAgKiBCZWNhdXNlIHRoaXMgaXMgdGhlIGxhc3QgdGVzdCBhZ2FpbnN0IHRoZSBzZXJ2ZXIsIHdoZW4gaXQgY29tcGxldGVzCisgICAqIHRoZSBlbnRpcmUgc3VpdGUgaXMgY29tcGxldGUgYnkgZGVmaW5pdGlvbiAodGhlIHRlc3RzIHJ1biBzZXJpYWxseSkuCisgICAqLworICBkb25lKGZ1bmN0aW9uKCkgeworICAgIHRlc3RfY29tcGxldGUgPSB0cnVlOworICB9KTsKKworICAvL1dlIHdhaXQgdXAgdG8gcmV0cnlfbGltaXQgKiByZXRyeV9pbnRlcnZhbCBmb3IgdGhlIHRlc3Qgc3VpdGUgdG8gY29tcGxldGUKKyAgZnVuY3Rpb24gVGVzdEZvckNvbXBsZXRpb24oKSB7CisgICAgaWYgKHRlc3RfY29tcGxldGUgJiYgY2FsbGJhY2spIHsKKyAgICAgIGNhbGxiYWNrKCJTZXJ2ZXIgc3VjY2Vzc2Z1bGx5IHRlc3RlZCEiKTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKCsrcmV0cnlzIDwgcmV0cnlfbGltaXQpIHsKKyAgICAgICAgc2V0VGltZW91dChUZXN0Rm9yQ29tcGxldGlvbiwgcmV0cnlfaW50ZXJ2YWwpOworICAgICAgfSBlbHNlIGlmIChjYWxsYmFjaykgeworICAgICAgICBjYWxsYmFjaygKKyAgICAgICAgICAiU2VydmVyIHRlc3QgZmFpbGVkIHRvIGNvbXBsZXRlIGFmdGVyICIgKworICAgICAgICAgICAgKHJldHJ5X2xpbWl0ICogcmV0cnlfaW50ZXJ2YWwpIC8gMTAwMCArCisgICAgICAgICAgICAiIHNlY29uZHMiCisgICAgICAgICk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgc2V0VGltZW91dChUZXN0Rm9yQ29tcGxldGlvbiwgcmV0cnlfaW50ZXJ2YWwpOworfQorCitmdW5jdGlvbiBtYWtlVW5vcmRlcmVkRGVlcEVxdWFsKGFzc2VydCkgeworICByZXR1cm4gZnVuY3Rpb24oYWN0dWFsLCBleHBlY3RlZCwgbmFtZSkgeworICAgIGFzc2VydC5lcXVhbChhY3R1YWwubGVuZ3RoLCBleHBlY3RlZC5sZW5ndGgsIG5hbWUpOworICAgIGZvciAoY29uc3QgayBpbiBhY3R1YWwpIHsKKyAgICAgIGxldCBmb3VuZCA9IGZhbHNlOworICAgICAgZm9yIChjb25zdCBrMiBpbiBleHBlY3RlZCkgeworICAgICAgICBpZiAoYWN0dWFsW2tdID09PSBleHBlY3RlZFtrMl0pIHsKKyAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgYXNzZXJ0LmZhaWwoIlVuZXhwZWN0ZWQgdmFsdWUgIiArIGFjdHVhbFtrXSArICIgd2l0aCBrZXkgIiArIGspOworICAgICAgfQorICAgIH0KKyAgfTsKK30KZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvdGVzdC90ZXN0X2hhbmRsZXIuanMgYi9saWIvbm9kZWpzL3Rlc3QvdGVzdF9oYW5kbGVyLmpzCmluZGV4IDNkZTg5NjUuLjMxN2E3YzggMTAwNjQ0Ci0tLSBhL2xpYi9ub2RlanMvdGVzdC90ZXN0X2hhbmRsZXIuanMKKysrIGIvbGliL25vZGVqcy90ZXN0L3Rlc3RfaGFuZGxlci5qcwpAQCAtMTcsMTc5ICsxNywyMDQgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLS8vVGhpcyBpcyB0aGUgc2VydmVyIHNpZGUgTm9kZSB0ZXN0IGhhbmRsZXIgZm9yIHRoZSBzdGFuZGFyZCAKKy8vVGhpcyBpcyB0aGUgc2VydmVyIHNpZGUgTm9kZSB0ZXN0IGhhbmRsZXIgZm9yIHRoZSBzdGFuZGFyZAogLy8gIEFwYWNoZSBUaHJpZnQgdGVzdCBzZXJ2aWNlLgorY29uc3QgaGVscGVycyA9IHJlcXVpcmUoIi4vaGVscGVycyIpOworY29uc3QgdHR5cGVzID0gcmVxdWlyZShgLi8ke2hlbHBlcnMuZ2VuUGF0aH0vVGhyaWZ0VGVzdF90eXBlc2ApOworY29uc3QgVEV4Y2VwdGlvbiA9IHJlcXVpcmUoInRocmlmdCIpLlRocmlmdC5URXhjZXB0aW9uOwogCi12YXIgdHR5cGVzID0gcmVxdWlyZSgnLi9nZW4tbm9kZWpzL1RocmlmdFRlc3RfdHlwZXMnKTsKLXZhciBURXhjZXB0aW9uID0gcmVxdWlyZSgndGhyaWZ0JykuVGhyaWZ0LlRFeGNlcHRpb247CitmdW5jdGlvbiBtYWtlU3luY0hhbmRsZXIoKSB7CisgIHJldHVybiBmdW5jdGlvbih0aGluZykgeworICAgIHJldHVybiB0aGluZzsKKyAgfTsKK30KIAotdmFyIFRocmlmdFRlc3RIYW5kbGVyID0gZXhwb3J0cy5UaHJpZnRUZXN0SGFuZGxlciA9IHsKLSAgdGVzdFZvaWQ6IGZ1bmN0aW9uKHJlc3VsdCkgewotICAgIGNvbnNvbGUubG9nKCd0ZXN0Vm9pZCgpJyk7Citjb25zdCBzeW5jSGFuZGxlcnMgPSB7CisgIHRlc3RWb2lkOiB0ZXN0Vm9pZCwKKyAgdGVzdE1hcE1hcDogdGVzdE1hcE1hcCwKKyAgdGVzdEluc2FuaXR5OiB0ZXN0SW5zYW5pdHksCisgIHRlc3RNdWx0aTogdGVzdE11bHRpLAorICB0ZXN0RXhjZXB0aW9uOiB0ZXN0RXhjZXB0aW9uLAorICB0ZXN0TXVsdGlFeGNlcHRpb246IHRlc3RNdWx0aUV4Y2VwdGlvbiwKKyAgdGVzdE9uZXdheTogdGVzdE9uZXdheQorfTsKKworZnVuY3Rpb24gbWFrZUFzeW5jSGFuZGxlcihsYWJlbCkgeworICByZXR1cm4gZnVuY3Rpb24odGhpbmcsIHJlc3VsdCkgeworICAgIHRoaW5nID0gc3luY0hhbmRsZXJzW2xhYmVsXSh0aGluZyk7CisgICAgcmVzdWx0KG51bGwsIHRoaW5nKTsKKyAgfTsKK30KKworY29uc3QgYXN5bmNIYW5kbGVycyA9IHsKKyAgdGVzdFZvaWQ6IHRlc3RWb2lkQXN5bmMsCisgIHRlc3RNdWx0aTogdGVzdE11bHRpQXN5bmMsCisgIHRlc3RFeGNlcHRpb246IHRlc3RFeGNlcHRpb25Bc3luYywKKyAgdGVzdE11bHRpRXhjZXB0aW9uOiB0ZXN0TXVsdGlFeGNlcHRpb25Bc3luYywKKyAgdGVzdE9uZXdheTogdGVzdE9uZXdheUFzeW5jCit9OworCitjb25zdCBpZGVudGl0eUhhbmRsZXJzID0gWworICAidGVzdFN0cmluZyIsCisgICJ0ZXN0Qm9vbCIsCisgICJ0ZXN0Qnl0ZSIsCisgICJ0ZXN0STMyIiwKKyAgInRlc3RJNjQiLAorICAidGVzdERvdWJsZSIsCisgICJ0ZXN0QmluYXJ5IiwKKyAgInRlc3RTdHJ1Y3QiLAorICAidGVzdE5lc3QiLAorICAidGVzdE1hcCIsCisgICJ0ZXN0U3RyaW5nTWFwIiwKKyAgInRlc3RTZXQiLAorICAidGVzdExpc3QiLAorICAidGVzdEVudW0iLAorICAidGVzdFR5cGVkZWYiCitdOworCitmdW5jdGlvbiB0ZXN0Vm9pZCgpIHsKKyAgLy9jb25zb2xlLmxvZygndGVzdFZvaWQoKScpOworfQorCitmdW5jdGlvbiB0ZXN0Vm9pZEFzeW5jKHJlc3VsdCkgeworICByZXN1bHQodGVzdFZvaWQoKSk7Cit9CisKK2Z1bmN0aW9uIHRlc3RNYXBNYXAoKSB7CisgIGNvbnN0IG1hcG1hcCA9IFtdOworICBjb25zdCBwb3MgPSBbXTsKKyAgY29uc3QgbmVnID0gW107CisgIGZvciAobGV0IGkgPSAxOyBpIDwgNTsgaSsrKSB7CisgICAgcG9zW2ldID0gaTsKKyAgICBuZWdbLWldID0gLWk7CisgIH0KKyAgbWFwbWFwWzRdID0gcG9zOworICBtYXBtYXBbLTRdID0gbmVnOworCisgIHJldHVybiBtYXBtYXA7Cit9CisKK2Z1bmN0aW9uIHRlc3RJbnNhbml0eShhcmd1bWVudCkgeworICAvL2NvbnNvbGUubG9nKCd0ZXN0SW5zYW5pdHkoJyk7CisgIC8vY29uc29sZS5sb2coYXJndW1lbnQpOworICAvL2NvbnNvbGUubG9nKCcpJyk7CisKKyAgY29uc3QgZmlyc3RfbWFwID0gW107CisgIGNvbnN0IHNlY29uZF9tYXAgPSBbXTsKKworICBmaXJzdF9tYXBbdHR5cGVzLk51bWJlcnouVFdPXSA9IGFyZ3VtZW50OworICBmaXJzdF9tYXBbdHR5cGVzLk51bWJlcnouVEhSRUVdID0gYXJndW1lbnQ7CisKKyAgY29uc3QgbG9vbmV5ID0gbmV3IHR0eXBlcy5JbnNhbml0eSgpOworICBzZWNvbmRfbWFwW3R0eXBlcy5OdW1iZXJ6LlNJWF0gPSBsb29uZXk7CisKKyAgY29uc3QgaW5zYW5lID0gW107CisgIGluc2FuZVsxXSA9IGZpcnN0X21hcDsKKyAgaW5zYW5lWzJdID0gc2Vjb25kX21hcDsKKworICAvL2NvbnNvbGUubG9nKCdpbnNhbmUgcmVzdWx0OicpOworICAvL2NvbnNvbGUubG9nKGluc2FuZSk7CisgIHJldHVybiBpbnNhbmU7Cit9CisKK2Z1bmN0aW9uIHRlc3RNdWx0aShhcmcwLCBhcmcxLCBhcmcyKSB7CisgIC8vY29uc29sZS5sb2coJ3Rlc3RNdWx0aSgpJyk7CisKKyAgY29uc3QgaGVsbG8gPSBuZXcgdHR5cGVzLlh0cnVjdCgpOworICBoZWxsby5zdHJpbmdfdGhpbmcgPSAiSGVsbG8yIjsKKyAgaGVsbG8uYnl0ZV90aGluZyA9IGFyZzA7CisgIGhlbGxvLmkzMl90aGluZyA9IGFyZzE7CisgIGhlbGxvLmk2NF90aGluZyA9IGFyZzI7CisgIHJldHVybiBoZWxsbzsKK30KKworZnVuY3Rpb24gdGVzdE11bHRpQXN5bmMoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSwgcmVzdWx0KSB7CisgIGNvbnN0IGhlbGxvID0gdGVzdE11bHRpKGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUpOworICByZXN1bHQobnVsbCwgaGVsbG8pOworfQorCitmdW5jdGlvbiB0ZXN0RXhjZXB0aW9uKGFyZykgeworICAvL2NvbnNvbGUubG9nKCd0ZXN0RXhjZXB0aW9uKCcrYXJnKycpJyk7CisgIGlmIChhcmcgPT09ICJYY2VwdGlvbiIpIHsKKyAgICBjb25zdCB4ID0gbmV3IHR0eXBlcy5YY2VwdGlvbigpOworICAgIHguZXJyb3JDb2RlID0gMTAwMTsKKyAgICB4Lm1lc3NhZ2UgPSBhcmc7CisgICAgdGhyb3cgeDsKKyAgfSBlbHNlIGlmIChhcmcgPT09ICJURXhjZXB0aW9uIikgeworICAgIHRocm93IG5ldyBURXhjZXB0aW9uKGFyZyk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuOworICB9Cit9CisKK2Z1bmN0aW9uIHRlc3RFeGNlcHRpb25Bc3luYyhhcmcsIHJlc3VsdCkgeworICAvL2NvbnNvbGUubG9nKCd0ZXN0RXhjZXB0aW9uKCcrYXJnKycpJyk7CisgIGlmIChhcmcgPT09ICJYY2VwdGlvbiIpIHsKKyAgICBjb25zdCB4ID0gbmV3IHR0eXBlcy5YY2VwdGlvbigpOworICAgIHguZXJyb3JDb2RlID0gMTAwMTsKKyAgICB4Lm1lc3NhZ2UgPSBhcmc7CisgICAgcmVzdWx0KHgpOworICB9IGVsc2UgaWYgKGFyZyA9PT0gIlRFeGNlcHRpb24iKSB7CisgICAgcmVzdWx0KG5ldyBURXhjZXB0aW9uKGFyZykpOworICB9IGVsc2UgewogICAgIHJlc3VsdChudWxsKTsKLSAgfSwKLSAgdGVzdFN0cmluZzogZnVuY3Rpb24odGhpbmcsIHJlc3VsdCkgewotICAgIGNvbnNvbGUubG9nKCd0ZXN0U3RyaW5nKFwnJyArIHRoaW5nICsgJ1wnKScpOwotICAgIHJlc3VsdChudWxsLCB0aGluZyk7Ci0gIH0sCi0gIHRlc3RCeXRlOiBmdW5jdGlvbih0aGluZywgcmVzdWx0KSB7Ci0gICAgY29uc29sZS5sb2coJ3Rlc3RCeXRlKCcgKyB0aGluZyArICcpJyk7Ci0gICAgcmVzdWx0KG51bGwsIHRoaW5nKTsKLSAgfSwKLSAgdGVzdEkzMjogZnVuY3Rpb24odGhpbmcsIHJlc3VsdCkgewotICAgIGNvbnNvbGUubG9nKCd0ZXN0STMyKCcgKyB0aGluZyArICcpJyk7Ci0gICAgcmVzdWx0KG51bGwsIHRoaW5nKTsKLSAgfSwKLSAgdGVzdEk2NDogZnVuY3Rpb24odGhpbmcsIHJlc3VsdCkgewotICAgIGNvbnNvbGUubG9nKCd0ZXN0STY0KCcgKyB0aGluZyArICcpJyk7Ci0gICAgcmVzdWx0KG51bGwsIHRoaW5nKTsKLSAgfSwKLSAgdGVzdERvdWJsZTogZnVuY3Rpb24odGhpbmcsIHJlc3VsdCkgewotICAgIGNvbnNvbGUubG9nKCd0ZXN0RG91YmxlKCcgKyB0aGluZyArICcpJyk7Ci0gICAgcmVzdWx0KG51bGwsIHRoaW5nKTsKLSAgfSwKLSAgdGVzdFN0cnVjdDogZnVuY3Rpb24odGhpbmcsIHJlc3VsdCkgewotICAgIGNvbnNvbGUubG9nKCd0ZXN0U3RydWN0KCcpOwotICAgIGNvbnNvbGUubG9nKHRoaW5nKTsKLSAgICBjb25zb2xlLmxvZygnKScpOwotICAgIHJlc3VsdChudWxsLCB0aGluZyk7Ci0gIH0sCi0gIHRlc3ROZXN0OiBmdW5jdGlvbihuZXN0LCByZXN1bHQpIHsKLSAgICBjb25zb2xlLmxvZygndGVzdE5lc3QoJyk7Ci0gICAgY29uc29sZS5sb2cobmVzdCk7Ci0gICAgY29uc29sZS5sb2coJyknKTsKLSAgICByZXN1bHQobnVsbCwgbmVzdCk7Ci0gIH0sCi0gIHRlc3RNYXA6IGZ1bmN0aW9uKHRoaW5nLCByZXN1bHQpIHsKLSAgICBjb25zb2xlLmxvZygndGVzdE1hcCgnKTsKLSAgICBjb25zb2xlLmxvZyh0aGluZyk7Ci0gICAgY29uc29sZS5sb2coJyknKTsKLSAgICByZXN1bHQobnVsbCwgdGhpbmcpOwotICB9LAotICB0ZXN0U3RyaW5nTWFwOiBmdW5jdGlvbih0aGluZywgcmVzdWx0KSB7Ci0gICAgY29uc29sZS5sb2coJ3Rlc3RTdHJpbmdNYXAoJyk7Ci0gICAgY29uc29sZS5sb2codGhpbmcpOwotICAgIGNvbnNvbGUubG9nKCcpJyk7Ci0gICAgcmVzdWx0KG51bGwsIHRoaW5nKTsKLSAgfSwKLSAgdGVzdFNldDogZnVuY3Rpb24odGhpbmcsIHJlc3VsdCkgewotICAgIGNvbnNvbGUubG9nKCd0ZXN0U2V0KCcpOwotICAgIGNvbnNvbGUubG9nKHRoaW5nKTsKLSAgICBjb25zb2xlLmxvZygnKScpOwotICAgIHJlc3VsdChudWxsLCB0aGluZyk7Ci0gIH0sCi0gIHRlc3RMaXN0OiBmdW5jdGlvbih0aGluZywgcmVzdWx0KSB7Ci0gICAgY29uc29sZS5sb2coJ3Rlc3RMaXN0KCcpOwotICAgIGNvbnNvbGUubG9nKHRoaW5nKTsKLSAgICBjb25zb2xlLmxvZygnKScpOwotICAgIHJlc3VsdChudWxsLCB0aGluZyk7Ci0gIH0sCi0gIHRlc3RFbnVtOiBmdW5jdGlvbih0aGluZywgcmVzdWx0KSB7Ci0gICAgY29uc29sZS5sb2coJ3Rlc3RFbnVtKCcgKyB0aGluZyArICcpJyk7Ci0gICAgcmVzdWx0KG51bGwsIHRoaW5nKTsKLSAgfSwKLSAgdGVzdFR5cGVkZWY6IGZ1bmN0aW9uKHRoaW5nLCByZXN1bHQpIHsKLSAgICBjb25zb2xlLmxvZygndGVzdFR5cGVkZWYoJyArIHRoaW5nICsgJyknKTsKLSAgICByZXN1bHQobnVsbCwgdGhpbmcpOwotICB9LAotICB0ZXN0TWFwTWFwOiBmdW5jdGlvbihoZWxsbywgcmVzdWx0KSB7Ci0gICAgY29uc29sZS5sb2coJ3Rlc3RNYXBNYXAoJyArIGhlbGxvICsgJyknKTsKKyAgfQorfQogCi0gICAgdmFyIG1hcG1hcCA9IFtdOwotICAgIHZhciBwb3MgPSBbXTsKLSAgICB2YXIgbmVnID0gW107Ci0gICAgZm9yICh2YXIgaSA9IDE7IGkgPCA1OyBpKyspIHsKLSAgICAgIHBvc1tpXSA9IGk7Ci0gICAgICBuZWdbLWldID0gLWk7Ci0gICAgfQotICAgIG1hcG1hcFs0XSA9IHBvczsKLSAgICBtYXBtYXBbLTRdID0gbmVnOworZnVuY3Rpb24gdGVzdE11bHRpRXhjZXB0aW9uKGFyZzAsIGFyZzEpIHsKKyAgLy9jb25zb2xlLmxvZygndGVzdE11bHRpRXhjZXB0aW9uKCcgKyBhcmcwICsgJywgJyArIGFyZzEgKyAnKScpOworICBpZiAoYXJnMCA9PT0gIlhjZXB0aW9uIikgeworICAgIGNvbnN0IHggPSBuZXcgdHR5cGVzLlhjZXB0aW9uKCk7CisgICAgeC5lcnJvckNvZGUgPSAxMDAxOworICAgIHgubWVzc2FnZSA9ICJUaGlzIGlzIGFuIFhjZXB0aW9uIjsKKyAgICB0aHJvdyB4OworICB9IGVsc2UgaWYgKGFyZzAgPT09ICJYY2VwdGlvbjIiKSB7CisgICAgY29uc3QgeDIgPSBuZXcgdHR5cGVzLlhjZXB0aW9uMigpOworICAgIHgyLmVycm9yQ29kZSA9IDIwMDI7CisgICAgeDIuc3RydWN0X3RoaW5nID0gbmV3IHR0eXBlcy5YdHJ1Y3QoKTsKKyAgICB4Mi5zdHJ1Y3RfdGhpbmcuc3RyaW5nX3RoaW5nID0gIlRoaXMgaXMgYW4gWGNlcHRpb24yIjsKKyAgICB0aHJvdyB4MjsKKyAgfQogCi0gICAgcmVzdWx0KG51bGwsIG1hcG1hcCk7Ci0gIH0sCi0gIHRlc3RJbnNhbml0eTogZnVuY3Rpb24oYXJndW1lbnQsIHJlc3VsdCkgewotICAgIGNvbnNvbGUubG9nKCd0ZXN0SW5zYW5pdHkoJyk7Ci0gICAgY29uc29sZS5sb2coYXJndW1lbnQpOwotICAgIGNvbnNvbGUubG9nKCcpJyk7CisgIGNvbnN0IHJlcyA9IG5ldyB0dHlwZXMuWHRydWN0KCk7CisgIHJlcy5zdHJpbmdfdGhpbmcgPSBhcmcxOworICByZXR1cm4gcmVzOworfQogCi0gICAgdmFyIGhlbGxvID0gbmV3IHR0eXBlcy5YdHJ1Y3QoKTsKLSAgICBoZWxsby5zdHJpbmdfdGhpbmcgPSAnSGVsbG8yJzsKLSAgICBoZWxsby5ieXRlX3RoaW5nID0gMjsKLSAgICBoZWxsby5pMzJfdGhpbmcgPSAyOwotICAgIGhlbGxvLmk2NF90aGluZyA9IDI7Ci0KLSAgICB2YXIgZ29vZGJ5ZSA9IG5ldyB0dHlwZXMuWHRydWN0KCk7Ci0gICAgZ29vZGJ5ZS5zdHJpbmdfdGhpbmcgPSAnR29vZGJ5ZTQnOwotICAgIGdvb2RieWUuYnl0ZV90aGluZyA9IDQ7Ci0gICAgZ29vZGJ5ZS5pMzJfdGhpbmcgPSA0OwotICAgIGdvb2RieWUuaTY0X3RoaW5nID0gNDsKLQotICAgIHZhciBjcmF6eSA9IG5ldyB0dHlwZXMuSW5zYW5pdHkoKTsKLSAgICBjcmF6eS51c2VyTWFwID0gW107Ci0gICAgY3JhenkudXNlck1hcFt0dHlwZXMuTnVtYmVyei5FSUdIVF0gPSA4OwotICAgIGNyYXp5LnVzZXJNYXBbdHR5cGVzLk51bWJlcnouRklWRV0gPSA1OwotICAgIGNyYXp5Lnh0cnVjdHMgPSBbZ29vZGJ5ZSwgaGVsbG9dOwotCi0gICAgdmFyIGZpcnN0X21hcCA9IFtdOwotICAgIHZhciBzZWNvbmRfbWFwID0gW107Ci0KLSAgICBmaXJzdF9tYXBbdHR5cGVzLk51bWJlcnouVFdPXSA9IGNyYXp5OwotICAgIGZpcnN0X21hcFt0dHlwZXMuTnVtYmVyei5USFJFRV0gPSBjcmF6eTsKLQotICAgIHZhciBsb29uZXkgPSBuZXcgdHR5cGVzLkluc2FuaXR5KCk7Ci0gICAgc2Vjb25kX21hcFt0dHlwZXMuTnVtYmVyei5TSVhdID0gbG9vbmV5OwotCi0gICAgdmFyIGluc2FuZSA9IFtdOwotICAgIGluc2FuZVsxXSA9IGZpcnN0X21hcDsKLSAgICBpbnNhbmVbMl0gPSBzZWNvbmRfbWFwOwotCi0gICAgY29uc29sZS5sb2coJ2luc2FuZSByZXN1bHQ6Jyk7Ci0gICAgY29uc29sZS5sb2coaW5zYW5lKTsKLSAgICByZXN1bHQobnVsbCwgaW5zYW5lKTsKLSAgfSwKLSAgdGVzdE11bHRpOiBmdW5jdGlvbihhcmcwLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1LCByZXN1bHQpIHsKLSAgICBjb25zb2xlLmxvZygndGVzdE11bHRpKCknKTsKLQotICAgIHZhciBoZWxsbyA9IG5ldyB0dHlwZXMuWHRydWN0KCk7Ci0gICAgaGVsbG8uc3RyaW5nX3RoaW5nID0gJ0hlbGxvMic7Ci0gICAgaGVsbG8uYnl0ZV90aGluZyA9IGFyZzA7Ci0gICAgaGVsbG8uaTMyX3RoaW5nID0gYXJnMTsKLSAgICBoZWxsby5pNjRfdGhpbmcgPSBhcmcyOwotICAgIHJlc3VsdChudWxsLCBoZWxsbyk7Ci0gIH0sCi0gIHRlc3RFeGNlcHRpb246IGZ1bmN0aW9uKGFyZywgcmVzdWx0KSB7Ci0gICAgY29uc29sZS5sb2coJ3Rlc3RFeGNlcHRpb24oJythcmcrJyknKTsKLSAgICBpZiAoYXJnID09PSAnWGNlcHRpb24nKSB7Ci0gICAgICB2YXIgeCA9IG5ldyB0dHlwZXMuWGNlcHRpb24oKTsKLSAgICAgIHguZXJyb3JDb2RlID0gMTAwMTsKLSAgICAgIHgubWVzc2FnZSA9IGFyZzsKLSAgICAgIHJlc3VsdCh4KTsKLSAgICB9IGVsc2UgaWYgKGFyZyA9PT0gJ1RFeGNlcHRpb24nKSB7Ci0gICAgICByZXN1bHQobmV3IFRFeGNlcHRpb24oYXJnKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlc3VsdChudWxsKTsKLSAgICB9Ci0gIH0sCi0gIHRlc3RNdWx0aUV4Y2VwdGlvbjogZnVuY3Rpb24oYXJnMCwgYXJnMSwgcmVzdWx0KSB7Ci0gICAgY29uc29sZS5sb2coJ3Rlc3RNdWx0aUV4Y2VwdGlvbignICsgYXJnMCArICcsICcgKyBhcmcxICsgJyknKTsKLSAgICBpZiAoYXJnMCA9PT0gKCdYY2VwdGlvbicpKSB7Ci0gICAgICB2YXIgeCA9IG5ldyB0dHlwZXMuWGNlcHRpb24oKTsKLSAgICAgIHguZXJyb3JDb2RlID0gMTAwMTsKLSAgICAgIHgubWVzc2FnZSA9ICdUaGlzIGlzIGFuIFhjZXB0aW9uJzsKLSAgICAgIHJlc3VsdCh4KTsKLSAgICB9IGVsc2UgaWYgKGFyZzAgPT09ICgnWGNlcHRpb24yJykpIHsKLSAgICAgIHZhciB4MiA9IG5ldyB0dHlwZXMuWGNlcHRpb24yKCk7Ci0gICAgICB4Mi5lcnJvckNvZGUgPSAyMDAyOwotICAgICAgeDIuc3RydWN0X3RoaW5nID0gbmV3IHR0eXBlcy5YdHJ1Y3QoKTsKLSAgICAgIHgyLnN0cnVjdF90aGluZy5zdHJpbmdfdGhpbmcgPSAnVGhpcyBpcyBhbiBYY2VwdGlvbjInOwotICAgICAgcmVzdWx0KHgyKTsKLSAgICB9Ci0KLSAgICB2YXIgcmVzID0gbmV3IHR0eXBlcy5YdHJ1Y3QoKTsKK2Z1bmN0aW9uIHRlc3RNdWx0aUV4Y2VwdGlvbkFzeW5jKGFyZzAsIGFyZzEsIHJlc3VsdCkgeworICAvL2NvbnNvbGUubG9nKCd0ZXN0TXVsdGlFeGNlcHRpb24oJyArIGFyZzAgKyAnLCAnICsgYXJnMSArICcpJyk7CisgIGlmIChhcmcwID09PSAiWGNlcHRpb24iKSB7CisgICAgY29uc3QgeCA9IG5ldyB0dHlwZXMuWGNlcHRpb24oKTsKKyAgICB4LmVycm9yQ29kZSA9IDEwMDE7CisgICAgeC5tZXNzYWdlID0gIlRoaXMgaXMgYW4gWGNlcHRpb24iOworICAgIHJlc3VsdCh4KTsKKyAgfSBlbHNlIGlmIChhcmcwID09PSAiWGNlcHRpb24yIikgeworICAgIGNvbnN0IHgyID0gbmV3IHR0eXBlcy5YY2VwdGlvbjIoKTsKKyAgICB4Mi5lcnJvckNvZGUgPSAyMDAyOworICAgIHgyLnN0cnVjdF90aGluZyA9IG5ldyB0dHlwZXMuWHRydWN0KCk7CisgICAgeDIuc3RydWN0X3RoaW5nLnN0cmluZ190aGluZyA9ICJUaGlzIGlzIGFuIFhjZXB0aW9uMiI7CisgICAgcmVzdWx0KHgyKTsKKyAgfSBlbHNlIHsKKyAgICBjb25zdCByZXMgPSBuZXcgdHR5cGVzLlh0cnVjdCgpOwogICAgIHJlcy5zdHJpbmdfdGhpbmcgPSBhcmcxOwogICAgIHJlc3VsdChudWxsLCByZXMpOwotICB9LAotICB0ZXN0T25ld2F5OiBmdW5jdGlvbihzbGVlcEZvciwgcmVzdWx0KSB7Ci0gICAgY29uc29sZS5sb2coJ3Rlc3RPbmV3YXkoJyArIHNsZWVwRm9yICsgJykgPT4gSmF2YVNjcmlwdCAobGlrZSBSdXN0KSBuZXZlciBzbGVlcHMhJyk7CiAgIH0KLX07ICAgLy9UaHJpZnRUZXN0U3ZjSGFuZGxlcgorfQorCisvL2NvbnNvbGUubG9nKCd0ZXN0T25ld2F5KCcgKyBzbGVlcEZvciArICcpID0+IEphdmFTY3JpcHQgKGxpa2UgUnVzdCkgbmV2ZXIgc2xlZXBzIScpOworZnVuY3Rpb24gdGVzdE9uZXdheSgpIHt9CisKK2Z1bmN0aW9uIHRlc3RPbmV3YXlBc3luYyhzbGVlcEZvcikgeworICB0ZXN0T25ld2F5KHNsZWVwRm9yKTsKK30KKworaWRlbnRpdHlIYW5kbGVycy5mb3JFYWNoKGZ1bmN0aW9uKGxhYmVsKSB7CisgIHN5bmNIYW5kbGVyc1tsYWJlbF0gPSBtYWtlU3luY0hhbmRsZXIobGFiZWwpOworICBhc3luY0hhbmRsZXJzW2xhYmVsXSA9IG1ha2VBc3luY0hhbmRsZXIobGFiZWwpOworfSk7CisKK1sidGVzdE1hcE1hcCIsICJ0ZXN0SW5zYW5pdHkiXS5mb3JFYWNoKGZ1bmN0aW9uKGxhYmVsKSB7CisgIGFzeW5jSGFuZGxlcnNbbGFiZWxdID0gbWFrZUFzeW5jSGFuZGxlcihsYWJlbCk7Cit9KTsKKworZXhwb3J0cy5UaHJpZnRUZXN0SGFuZGxlciA9IGFzeW5jSGFuZGxlcnM7CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL3Rlc3QvdGVzdF9oYW5kbGVyX3Byb21pc2UuanMgYi9saWIvbm9kZWpzL3Rlc3QvdGVzdF9oYW5kbGVyX3Byb21pc2UuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4NWIwNGMuLjAwMDAwMDAKLS0tIGEvbGliL25vZGVqcy90ZXN0L3Rlc3RfaGFuZGxlcl9wcm9taXNlLmpzCisrKyAvZGV2L251bGwKQEAgLTEsMTk0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogJ0xpY2Vuc2UnKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogJ0FTIElTJyBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy9UaGlzIGlzIHRoZSBzZXJ2ZXIgc2lkZSBOb2RlIHRlc3QgaGFuZGxlciBmb3IgdGhlIHN0YW5kYXJkCi0vLyAgQXBhY2hlIFRocmlmdCB0ZXN0IHNlcnZpY2UuCi0KLXZhciB0dHlwZXMgPSByZXF1aXJlKCcuL2dlbi1ub2RlanMvVGhyaWZ0VGVzdF90eXBlcycpOwotdmFyIFRFeGNlcHRpb24gPSByZXF1aXJlKCd0aHJpZnQnKS5UaHJpZnQuVEV4Y2VwdGlvbjsKLQotdmFyIFRocmlmdFRlc3RIYW5kbGVyID0gZXhwb3J0cy5UaHJpZnRUZXN0SGFuZGxlciA9IHsKLSAgdGVzdFZvaWQ6IGZ1bmN0aW9uKCkgewotICAgIGNvbnNvbGUubG9nKCd0ZXN0Vm9pZCgpJyk7Ci0gIH0sCi0gIHRlc3RTdHJpbmc6IGZ1bmN0aW9uKHRoaW5nKSB7Ci0gICAgY29uc29sZS5sb2coJ3Rlc3RTdHJpbmcoXCcnICsgdGhpbmcgKyAnXCcpJyk7Ci0gICAgcmV0dXJuIHRoaW5nOwotICB9LAotICB0ZXN0Qnl0ZTogZnVuY3Rpb24odGhpbmcpIHsKLSAgICBjb25zb2xlLmxvZygndGVzdEJ5dGUoJyArIHRoaW5nICsgJyknKTsKLSAgICByZXR1cm4gdGhpbmc7Ci0gIH0sCi0gIHRlc3RJMzI6IGZ1bmN0aW9uKHRoaW5nKSB7Ci0gICAgY29uc29sZS5sb2coJ3Rlc3RJMzIoJyArIHRoaW5nICsgJyknKTsKLSAgICByZXR1cm4gdGhpbmc7Ci0gIH0sCi0gIHRlc3RJNjQ6IGZ1bmN0aW9uKHRoaW5nKSB7Ci0gICAgY29uc29sZS5sb2coJ3Rlc3RJNjQoJyArIHRoaW5nICsgJyknKTsKLSAgICByZXR1cm4gdGhpbmc7Ci0gIH0sCi0gIHRlc3REb3VibGU6IGZ1bmN0aW9uKHRoaW5nKSB7Ci0gICAgY29uc29sZS5sb2coJ3Rlc3REb3VibGUoJyArIHRoaW5nICsgJyknKTsKLSAgICByZXR1cm4gdGhpbmc7Ci0gIH0sCi0gIHRlc3RTdHJ1Y3Q6IGZ1bmN0aW9uKHRoaW5nKSB7Ci0gICAgY29uc29sZS5sb2coJ3Rlc3RTdHJ1Y3QoJyk7Ci0gICAgY29uc29sZS5sb2codGhpbmcpOwotICAgIGNvbnNvbGUubG9nKCcpJyk7Ci0gICAgcmV0dXJuIHRoaW5nOwotICB9LAotICB0ZXN0TmVzdDogZnVuY3Rpb24obmVzdCkgewotICAgIGNvbnNvbGUubG9nKCd0ZXN0TmVzdCgnKTsKLSAgICBjb25zb2xlLmxvZyhuZXN0KTsKLSAgICBjb25zb2xlLmxvZygnKScpOwotICAgIHJldHVybiBuZXN0OwotICB9LAotICB0ZXN0TWFwOiBmdW5jdGlvbih0aGluZykgewotICAgIGNvbnNvbGUubG9nKCd0ZXN0TWFwKCcpOwotICAgIGNvbnNvbGUubG9nKHRoaW5nKTsKLSAgICBjb25zb2xlLmxvZygnKScpOwotICAgIHJldHVybiB0aGluZzsKLSAgfSwKLSAgdGVzdFN0cmluZ01hcDogZnVuY3Rpb24odGhpbmcpIHsKLSAgICBjb25zb2xlLmxvZygndGVzdFN0cmluZ01hcCgnKTsKLSAgICBjb25zb2xlLmxvZyh0aGluZyk7Ci0gICAgY29uc29sZS5sb2coJyknKTsKLSAgICByZXR1cm4gdGhpbmc7Ci0gIH0sCi0gIHRlc3RTZXQ6IGZ1bmN0aW9uKHRoaW5nLCByZXN1bHQpIHsKLSAgICBjb25zb2xlLmxvZygndGVzdFNldCgnKTsKLSAgICBjb25zb2xlLmxvZyh0aGluZyk7Ci0gICAgY29uc29sZS5sb2coJyknKTsKLSAgICByZXR1cm4gdGhpbmc7Ci0gIH0sCi0gIHRlc3RMaXN0OiBmdW5jdGlvbih0aGluZykgewotICAgIGNvbnNvbGUubG9nKCd0ZXN0TGlzdCgnKTsKLSAgICBjb25zb2xlLmxvZyh0aGluZyk7Ci0gICAgY29uc29sZS5sb2coJyknKTsKLSAgICByZXR1cm4gdGhpbmc7Ci0gIH0sCi0gIHRlc3RFbnVtOiBmdW5jdGlvbih0aGluZykgewotICAgIGNvbnNvbGUubG9nKCd0ZXN0RW51bSgnICsgdGhpbmcgKyAnKScpOwotICAgIHJldHVybiB0aGluZzsKLSAgfSwKLSAgdGVzdFR5cGVkZWY6IGZ1bmN0aW9uKHRoaW5nKSB7Ci0gICAgY29uc29sZS5sb2coJ3Rlc3RUeXBlZGVmKCcgKyB0aGluZyArICcpJyk7Ci0gICAgcmV0dXJuIHRoaW5nOwotICB9LAotICB0ZXN0TWFwTWFwOiBmdW5jdGlvbihoZWxsbykgewotICAgIGNvbnNvbGUubG9nKCd0ZXN0TWFwTWFwKCcgKyBoZWxsbyArICcpJyk7Ci0KLSAgICB2YXIgbWFwbWFwID0gW107Ci0gICAgdmFyIHBvcyA9IFtdOwotICAgIHZhciBuZWcgPSBbXTsKLSAgICBmb3IgKHZhciBpID0gMTsgaSA8IDU7IGkrKykgewotICAgICAgcG9zW2ldID0gaTsKLSAgICAgIG5lZ1staV0gPSAtaTsKLSAgICB9Ci0gICAgbWFwbWFwWzRdID0gcG9zOwotICAgIG1hcG1hcFstNF0gPSBuZWc7Ci0KLSAgICByZXR1cm4gbWFwbWFwOwotICB9LAotICB0ZXN0SW5zYW5pdHk6IGZ1bmN0aW9uKGFyZ3VtZW50KSB7Ci0gICAgY29uc29sZS5sb2coJ3Rlc3RJbnNhbml0eSgnKTsKLSAgICBjb25zb2xlLmxvZyhhcmd1bWVudCk7Ci0gICAgY29uc29sZS5sb2coJyknKTsKLQotICAgIHZhciBoZWxsbyA9IG5ldyB0dHlwZXMuWHRydWN0KCk7Ci0gICAgaGVsbG8uc3RyaW5nX3RoaW5nID0gJ0hlbGxvMic7Ci0gICAgaGVsbG8uYnl0ZV90aGluZyA9IDI7Ci0gICAgaGVsbG8uaTMyX3RoaW5nID0gMjsKLSAgICBoZWxsby5pNjRfdGhpbmcgPSAyOwotCi0gICAgdmFyIGdvb2RieWUgPSBuZXcgdHR5cGVzLlh0cnVjdCgpOwotICAgIGdvb2RieWUuc3RyaW5nX3RoaW5nID0gJ0dvb2RieWU0JzsKLSAgICBnb29kYnllLmJ5dGVfdGhpbmcgPSA0OwotICAgIGdvb2RieWUuaTMyX3RoaW5nID0gNDsKLSAgICBnb29kYnllLmk2NF90aGluZyA9IDQ7Ci0KLSAgICB2YXIgY3JhenkgPSBuZXcgdHR5cGVzLkluc2FuaXR5KCk7Ci0gICAgY3JhenkudXNlck1hcCA9IFtdOwotICAgIGNyYXp5LnVzZXJNYXBbdHR5cGVzLk51bWJlcnouRUlHSFRdID0gODsKLSAgICBjcmF6eS51c2VyTWFwW3R0eXBlcy5OdW1iZXJ6LkZJVkVdID0gNTsKLSAgICBjcmF6eS54dHJ1Y3RzID0gW2dvb2RieWUsIGhlbGxvXTsKLQotICAgIHZhciBmaXJzdF9tYXAgPSBbXTsKLSAgICB2YXIgc2Vjb25kX21hcCA9IFtdOwotCi0gICAgZmlyc3RfbWFwW3R0eXBlcy5OdW1iZXJ6LlRXT10gPSBjcmF6eTsKLSAgICBmaXJzdF9tYXBbdHR5cGVzLk51bWJlcnouVEhSRUVdID0gY3Jhenk7Ci0KLSAgICB2YXIgbG9vbmV5ID0gbmV3IHR0eXBlcy5JbnNhbml0eSgpOwotICAgIHNlY29uZF9tYXBbdHR5cGVzLk51bWJlcnouU0lYXSA9IGxvb25leTsKLQotICAgIHZhciBpbnNhbmUgPSBbXTsKLSAgICBpbnNhbmVbMV0gPSBmaXJzdF9tYXA7Ci0gICAgaW5zYW5lWzJdID0gc2Vjb25kX21hcDsKLQotICAgIGNvbnNvbGUubG9nKCdpbnNhbmUgcmVzdWx0OicpOwotICAgIGNvbnNvbGUubG9nKGluc2FuZSk7Ci0gICAgcmV0dXJuIGluc2FuZTsKLSAgfSwKLSAgdGVzdE11bHRpOiBmdW5jdGlvbihhcmcwLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1KSB7Ci0gICAgY29uc29sZS5sb2coJ3Rlc3RNdWx0aSgpJyk7Ci0KLSAgICB2YXIgaGVsbG8gPSBuZXcgdHR5cGVzLlh0cnVjdCgpOwotICAgIGhlbGxvLnN0cmluZ190aGluZyA9ICdIZWxsbzInOwotICAgIGhlbGxvLmJ5dGVfdGhpbmcgPSBhcmcwOwotICAgIGhlbGxvLmkzMl90aGluZyA9IGFyZzE7Ci0gICAgaGVsbG8uaTY0X3RoaW5nID0gYXJnMjsKLSAgICByZXR1cm4gaGVsbG87Ci0gIH0sCi0gIHRlc3RFeGNlcHRpb246IGZ1bmN0aW9uKGFyZykgewotICAgIGNvbnNvbGUubG9nKCd0ZXN0RXhjZXB0aW9uKCcrYXJnKycpJyk7Ci0gICAgaWYgKGFyZyA9PT0gJ1hjZXB0aW9uJykgewotICAgICAgdmFyIHggPSBuZXcgdHR5cGVzLlhjZXB0aW9uKCk7Ci0gICAgICB4LmVycm9yQ29kZSA9IDEwMDE7Ci0gICAgICB4Lm1lc3NhZ2UgPSBhcmc7Ci0gICAgICB0aHJvdyB4OwotICAgIH0gZWxzZSBpZiAoYXJnID09PSAnVEV4Y2VwdGlvbicpIHsKLSAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKGFyZyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIH0sCi0gIHRlc3RNdWx0aUV4Y2VwdGlvbjogZnVuY3Rpb24oYXJnMCwgYXJnMSkgewotICAgIGNvbnNvbGUubG9nKCd0ZXN0TXVsdGlFeGNlcHRpb24oJyArIGFyZzAgKyAnLCAnICsgYXJnMSArICcpJyk7Ci0gICAgaWYgKGFyZzAgPT09ICgnWGNlcHRpb24nKSkgewotICAgICAgdmFyIHggPSBuZXcgdHR5cGVzLlhjZXB0aW9uKCk7Ci0gICAgICB4LmVycm9yQ29kZSA9IDEwMDE7Ci0gICAgICB4Lm1lc3NhZ2UgPSAnVGhpcyBpcyBhbiBYY2VwdGlvbic7Ci0gICAgICB0aHJvdyB4OwotICAgIH0gZWxzZSBpZiAoYXJnMCA9PT0gKCdYY2VwdGlvbjInKSkgewotICAgICAgdmFyIHgyID0gbmV3IHR0eXBlcy5YY2VwdGlvbjIoKTsKLSAgICAgIHgyLmVycm9yQ29kZSA9IDIwMDI7Ci0gICAgICB4Mi5zdHJ1Y3RfdGhpbmcgPSBuZXcgdHR5cGVzLlh0cnVjdCgpOwotICAgICAgeDIuc3RydWN0X3RoaW5nLnN0cmluZ190aGluZyA9ICdUaGlzIGlzIGFuIFhjZXB0aW9uMic7Ci0gICAgICB0aHJvdyB4MjsKLSAgICB9Ci0KLSAgICB2YXIgcmVzID0gbmV3IHR0eXBlcy5YdHJ1Y3QoKTsKLSAgICByZXMuc3RyaW5nX3RoaW5nID0gYXJnMTsKLSAgICByZXR1cm4gcmVzOwotICB9LAotICB0ZXN0T25ld2F5OiBmdW5jdGlvbihzbGVlcEZvcikgewotICAgIGNvbnNvbGUubG9nKCd0ZXN0T25ld2F5KCcgKyBzbGVlcEZvciArICcpID0+IEphdmFTY3JpcHQgKGxpa2UgUnVzdCkgbmV2ZXIgc2xlZXBzIScpOwotICB9Ci19OyAgIC8vVGhyaWZ0VGVzdFN2Y0hhbmRsZXIKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvdGVzdC90aHJpZnRfdGVzdF9kcml2ZXIuanMgYi9saWIvbm9kZWpzL3Rlc3QvdGhyaWZ0X3Rlc3RfZHJpdmVyLmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWQ3NDRiLi4wMDAwMDAwCi0tLSBhL2xpYi9ub2RlanMvdGVzdC90aHJpZnRfdGVzdF9kcml2ZXIuanMKKysrIC9kZXYvbnVsbApAQCAtMSwzMjQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAnTGljZW5zZScpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogJ0FTIElTJyBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotIC8vIFRoaXMgaXMgdGhlIE5vZGUuanMgdGVzdCBkcml2ZXIgZm9yIHRoZSBzdGFuZGFyZCBBcGFjaGUgVGhyaWZ0IA0KLSAvLyB0ZXN0IHNlcnZpY2UuIFRoZSBkcml2ZXIgaW52b2tlcyBldmVyeSBmdW5jdGlvbiBkZWZpbmVkIGluIHRoZSANCi0gLy8gVGhyaWZ0IFRlc3Qgc2VydmljZSB3aXRoIGEgcmVwcmVzZW50YXRpdmUgcmFuZ2Ugb2YgcGFyYW1ldGVycy4NCi0gLy8NCi0gLy8gVGhlIFRocmlmdFRlc3REcml2ZXIgZnVuY3Rpb24gcmVxdWlyZXMgYSBjbGllbnQgb2JqZWN0DQotIC8vIGNvbm5lY3RlZCB0byBhIHNlcnZlciBob3N0aW5nIHRoZSBUaHJpZnQgVGVzdCBzZXJ2aWNlIGFuZA0KLSAvLyBzdXBwb3J0cyBhbiBvcHRpb25hbCBjYWxsYmFjayBmdW5jdGlvbiB3aGljaCBpcyBjYWxsZWQgd2l0aCANCi0gLy8gYSBzdGF0dXMgbWVzc2FnZSB3aGVuIHRoZSB0ZXN0IGlzIGNvbXBsZXRlLg0KLQ0KLXZhciBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQnKTsNCi12YXIgdHR5cGVzID0gcmVxdWlyZSgnLi9nZW4tbm9kZWpzL1RocmlmdFRlc3RfdHlwZXMnKTsNCi12YXIgSW50NjQgPSByZXF1aXJlKCdub2RlLWludDY0Jyk7DQotDQotdmFyIFRocmlmdFRlc3REcml2ZXIgPSBleHBvcnRzLlRocmlmdFRlc3REcml2ZXIgPSBmdW5jdGlvbihjbGllbnQsIGNhbGxiYWNrKSB7DQotCQ0KLWZ1bmN0aW9uIGNoZWNrUmVjdXJzaXZlbHkobWFwMSwgbWFwMikgew0KLSAgaWYgKHR5cGVvZiBtYXAxICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBtYXAyICE9PSAnZnVuY3Rpb24nKSB7DQotICAgIGlmICghbWFwMSB8fCB0eXBlb2YgbWFwMSAhPT0gJ29iamVjdCcpIHsNCi0gICAgICAvL0hhbmRsZSBpbnQ2NCB0eXBlcyAod2hpY2ggdXNlIG5vZGUtaW50NjQgaW4gTm9kZS5qcyBKYXZhU2NyaXB0KQ0KLSAgICAgIGlmICgodHlwZW9mIG1hcDEgPT09ICJudW1iZXIiKSAmJiAodHlwZW9mIG1hcDIgPT09ICJvYmplY3QiKSAmJiANCi0gICAgICAgICAgKG1hcDIuYnVmZmVyKSAmJiAobWFwMi5idWZmZXIgaW5zdGFuY2VvZiBCdWZmZXIpICYmIChtYXAyLmJ1ZmZlci5sZW5ndGggPT09IDgpKSB7DQotICAgICAgICB2YXIgbiA9IG5ldyBJbnQ2NChtYXAyLmJ1ZmZlcik7DQotICAgICAgICBhc3NlcnQuZXF1YWwobWFwMSwgbi50b051bWJlcigpKTsgICAgICAgICAgDQotICAgICAgfSBlbHNlIHsNCi0gICAgICAgIGFzc2VydC5lcXVhbChtYXAxLCBtYXAyKTsNCi0gICAgICB9DQotICAgIH0gZWxzZSB7DQotICAgICAgZm9yICh2YXIga2V5IGluIG1hcDEpIHsNCi0gICAgICAgIGNoZWNrUmVjdXJzaXZlbHkobWFwMVtrZXldLCBtYXAyW2tleV0pOw0KLSAgICAgIH0NCi0gICAgfQ0KLSAgfQ0KLX0NCi0NCi1jbGllbnQudGVzdFZvaWQoZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgew0KLSAgYXNzZXJ0KCAhIGVycik7DQotICBhc3NlcnQuZXF1YWwodW5kZWZpbmVkLCByZXNwb25zZSk7IC8vdm9pZA0KLX0pOw0KLQ0KLWNsaWVudC50ZXN0U3RyaW5nKCJUZXN0IiwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgew0KLSAgYXNzZXJ0KCAhIGVycik7DQotICBhc3NlcnQuZXF1YWwoIlRlc3QiLCByZXNwb25zZSk7DQotfSk7DQotDQotY2xpZW50LnRlc3RTdHJpbmcoIiIsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsNCi0gIGFzc2VydCggISBlcnIpOw0KLSAgYXNzZXJ0LmVxdWFsKCIiLCByZXNwb25zZSk7DQotfSk7DQotDQotLy9hbGwgTGFuZ3VhZ2VzIGluIFVURi04DQotLypqc2hpbnQgLVcxMDAgKi8NCi12YXIgc3RyaW5nVGVzdCA9ICJBZnJpa2FhbnMsIEFsZW1hbm5pc2NoLCBBcmFnb27DqXMsINin2YTYudix2KjZitipLCDZhdi12LHZiSwgIiArDQotICAgICJBc3R1cmlhbnUsIEF5bWFyIGFydSwgQXrJmXJiYXljYW4sINCR0LDRiNKh0L7RgNGCLCBCb2FyaXNjaCwgxb1lbWFpdMSXxaFrYSwgIiArDQotICAgICLQkdC10LvQsNGA0YPRgdC60LDRjywg0JHQtdC70LDRgNGD0YHQutCw0Y8gKNGC0LDRgNCw0YjQutC10LLRltGG0LApLCDQkdGK0LvQs9Cw0YDRgdC60LgsIEJhbWFuYW5rYW4sICIgKw0KLSAgICAi4Kas4Ka+4KaC4Kay4Ka+LCBCcmV6aG9uZWcsIEJvc2Fuc2tpLCBDYXRhbMOgLCBNw6xuZy1kxJXMpG5nLW5n4bmzzIQsINCd0L7RhdGH0LjQudC9LCAiICsNCi0gICAgIkNlYnVhbm8sIOGPo+GOs+GOqSwgxIxlc2t5LCDQodC70L7QstGjzIHQvdGM0YHQutGKIC8g4rCU4rCO4rCR4rCC4rCh4rCQ4rCg4rCU4rCN4rCfLCDQp9OR0LLQsNGI0LvQsCwgQ3ltcmFlZywgIiArDQotICAgICJEYW5zaywgWmF6YWtpLCDei96o3ojerN6A3qjehN6m3pDesCwgzpXOu867zrfOvc65zrrOrCwgRW1pbGnDoG4gZSBydW1hZ27DsmwsIEVuZ2xpc2gsICIgKw0KLSAgICAiRXNwZXJhbnRvLCBFc3Bhw7FvbCwgRWVzdGksIEV1c2thcmEsINmB2KfYsdiz24wsIFN1b21pLCBWw7VybywgRsO4cm95c2t0LCAiICsNCi0gICAgIkZyYW7Dp2FpcywgQXJwZXRhbiwgRnVybGFuLCBGcnlzaywgR2FlaWxnZSwg6LSb6KqeLCBHw6BpZGhsaWcsIEdhbGVnbywgIiArDQotICAgICJBdmHDsWUn4bq9LCDgqpfgq4HgqpzgqrDgqr7gqqTgq4AsIEdhZWxnLCDXoteR16jXmdeqLCDgpLngpL/gpKjgpY3gpKbgpYAsIEZpamkgSGluZGksIEhydmF0c2tpLCAiICsNCi0gICAgIktyZXnDsmwgYXlpc3llbiwgTWFneWFyLCDVgNWh1bXVpdaA1aXVtiwgSW50ZXJsaW5ndWEsIEJhaGFzYSBJbmRvbmVzaWEsICIgKw0KLSAgICAiSWxva2FubywgSWRvLCDDjXNsZW5za2EsIEl0YWxpYW5vLCDml6XmnKzoqp4sIExvamJhbiwgQmFzYSBKYXdhLCAiICsNCi0gICAgIuGDpeGDkOGDoOGDl+GDo+GDmuGDmCwgS29uZ28sIEthbGFhbGxpc3V0LCDgspXgsqjgs43gsqjgsqEsIO2VnOq1reyWtCwg0JrRitCw0YDQsNGH0LDQuS3QnNCw0LvQutGK0LDRgCwgIiArDQotICAgICJSaXBvYXJpc2NoLCBLdXJkw64sINCa0L7QvNC4LCBLZXJuZXdlaywg0JrRi9GA0LPRi9C30YfQsCwgTGF0aW5hLCBMYWRpbm8sICIgKw0KLSAgICAiTMOrdHplYnVlcmdlc2NoLCBMaW1idXJncywgTGluZ8OhbGEsIOC6peC6suC6pywgTGlldHV2acWzLCBMYXR2aWXFoXUsIEJhc2EgIiArDQotICAgICJCYW55dW1hc2FuLCBNYWxhZ2FzeSwg0JzQsNC60LXQtNC+0L3RgdC60LgsIOC0ruC0suC0r+C0vuC0s+C0giwg4KSu4KSw4KS+4KSg4KWALCDZhdin2LLZkNix2YjZhtuMLCBCYWhhc2EgIiArDQotICAgICJNZWxheXUsIE5uYXB1bGl0YW5vLCBOZWRlcnNha3Npc2NoLCDgpKjgpYfgpKrgpL7gpLIg4KSt4KS+4KS34KS+LCBOZWRlcmxhbmRzLCDigKoiICsNCi0gICAgIk5vcnNrIChueW5vcnNrKeKArCwg4oCqTm9yc2sgKGJva23DpWwp4oCsLCBOb3Vvcm1hbmQsIERpbsOpIGJpemFhZCwgIiArDQotICAgICJPY2NpdGFuLCDQmNGA0L7QvdCw0YMsIFBhcGlhbWVudHUsIERlaXRzY2gsIFBvbHNraSwg2b7Zhtis2KfYqNuMLCDZvtqa2KrZiCwgIiArDQotICAgICJOb3JmdWsgLyBQaXRrZXJuLCBQb3J0dWd1w6pzLCBSdW5hIFNpbWksIFJ1bWFudHNjaCwgUm9tYW5pLCBSb23Dom7EgywgIiArDQotICAgICLQoNGD0YHRgdC60LjQuSwg0KHQsNGF0LAg0YLRi9C70LAsIFNhcmR1LCBTaWNpbGlhbnUsIFNjb3RzLCBTw6FtZWdpZWxsYSwgU2ltcGxlICIgKw0KLSAgICAiRW5nbGlzaCwgU2xvdmVuxI1pbmEsIFNsb3ZlbsWhxI1pbmEsINCh0YDQv9GB0LrQuCAvIFNycHNraSwgU2VlbHRlcnNrLCAiICsNCi0gICAgIlN2ZW5za2EsIEtpc3dhaGlsaSwg4K6k4K6u4K6/4K604K+NLCDgsKTgsYbgsLLgsYHgsJfgsYEsINCi0L7St9C40LrToywg4LmE4LiX4LiiLCBUw7xya21lbsOnZSwgVGFnYWxvZywgIiArDQotICAgICJUw7xya8OnZSwg0KLQsNGC0LDRgNGH0LAvVGF0YXLDp2EsINCj0LrRgNCw0ZfQvdGB0YzQutCwLCDYp9ix2K/ZiCwgVGnhur9uZyBWaeG7h3QsIFZvbGFww7xrLCAiICsNCi0gICAgIldhbG9uLCBXaW5hcmF5LCDlkLTor60sIGlzaVhob3NhLCDXmdeZ1rTXk9eZ16ksIFlvcsO5YsOhLCBaZcOqdXdzLCDkuK3mlocsICIgKw0KLSAgICAiQsOibi1sw6JtLWfDuiwg57K16KqeIjsNCi0vKmpzaGludCArVzEwMCAqLw0KLQ0KLWNsaWVudC50ZXN0U3RyaW5nKHN0cmluZ1Rlc3QsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsNCi0gIGFzc2VydCggISBlcnIpOw0KLSAgYXNzZXJ0LmVxdWFsKHN0cmluZ1Rlc3QsIHJlc3BvbnNlKTsNCi19KTsNCi0NCi12YXIgc3BlY2lhbENoYXJhY3RlcnMgPSAncXVvdGU6IFwiIGJhY2tzbGFzaDonICsNCi0gICAgJyBmb3J3YXJkc2xhc2gtZXNjYXBlZDogXC8gJyArDQotICAgICcgYmFja3NwYWNlOiBcYiBmb3JtZmVlZDogXGYgbmV3bGluZTogXG4gcmV0dXJuOiBcciB0YWI6ICcgKw0KLSAgICAnIG5vdy1hbGwtb2YtdGhlbS10b2dldGhlcjogIlxcXC9cYlxuXHJcdCcgKw0KLSAgICAnIG5vdy1hLWJ1bmNoLW9mLWp1bms6ICFAIyQlJigpKCYlJCN7fXt9PD48PjwnICsNCi0gICAgJyBjaGFyLXRvLXRlc3QtanNvbi1wYXJzaW5nOiBdXSBcIl1dIFxcIiB9fX17IFtbWyAnOw0KLWNsaWVudC50ZXN0U3RyaW5nKHNwZWNpYWxDaGFyYWN0ZXJzLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7DQotICBhc3NlcnQoICEgZXJyKTsNCi0gIGFzc2VydC5lcXVhbChzcGVjaWFsQ2hhcmFjdGVycywgcmVzcG9uc2UpOw0KLX0pOw0KLQ0KLWNsaWVudC50ZXN0Qnl0ZSgxLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7DQotICBhc3NlcnQoICEgZXJyKTsNCi0gIGFzc2VydC5lcXVhbCgxLCByZXNwb25zZSk7DQotfSk7DQotDQotY2xpZW50LnRlc3RCeXRlKDAsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsNCi0gIGFzc2VydCggISBlcnIpOw0KLSAgYXNzZXJ0LmVxdWFsKDAsIHJlc3BvbnNlKTsNCi19KTsNCi0NCi1jbGllbnQudGVzdEJ5dGUoLTEsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsNCi0gIGFzc2VydCggISBlcnIpOw0KLSAgYXNzZXJ0LmVxdWFsKC0xLCByZXNwb25zZSk7DQotfSk7DQotDQotY2xpZW50LnRlc3RCeXRlKC0xMjcsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsNCi0gIGFzc2VydCggISBlcnIpOw0KLSAgYXNzZXJ0LmVxdWFsKC0xMjcsIHJlc3BvbnNlKTsNCi19KTsNCi0NCi1jbGllbnQudGVzdEkzMigtMSwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgew0KLSAgYXNzZXJ0KCAhIGVycik7DQotICBhc3NlcnQuZXF1YWwoLTEsIHJlc3BvbnNlKTsNCi19KTsNCi0NCi1jbGllbnQudGVzdEk2NCg1LCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7DQotICBhc3NlcnQoICEgZXJyKTsNCi0gIGFzc2VydC5lcXVhbCg1LCByZXNwb25zZSk7DQotfSk7DQotDQotY2xpZW50LnRlc3RJNjQoLTUsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsNCi0gIGFzc2VydCggISBlcnIpOw0KLSAgYXNzZXJ0LmVxdWFsKC01LCByZXNwb25zZSk7DQotfSk7DQotDQotY2xpZW50LnRlc3RJNjQoNzM0MzU5NzM4MzY4LCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7DQotICBhc3NlcnQoICEgZXJyKTsNCi0gIGFzc2VydC5lcXVhbCg3MzQzNTk3MzgzNjgsIHJlc3BvbnNlKTsNCi19KTsNCi0NCi1jbGllbnQudGVzdEk2NCgtMzQzNTk3MzgzNjgsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsNCi0gIGFzc2VydCggISBlcnIpOw0KLSAgYXNzZXJ0LmVxdWFsKC0zNDM1OTczODM2OCwgcmVzcG9uc2UpOw0KLX0pOw0KLQ0KLWNsaWVudC50ZXN0STY0KC03MzQzNTk3MzgzNjgsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsNCi0gIGFzc2VydCggISBlcnIpOw0KLSAgYXNzZXJ0LmVxdWFsKC03MzQzNTk3MzgzNjgsIHJlc3BvbnNlKTsNCi19KTsNCi0NCi1jbGllbnQudGVzdERvdWJsZSgtNS4yMDk4NTIzLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7DQotICBhc3NlcnQoICEgZXJyKTsNCi0gIGFzc2VydC5lcXVhbCgtNS4yMDk4NTIzLCByZXNwb25zZSk7DQotfSk7DQotDQotY2xpZW50LnRlc3REb3VibGUoNy4wMTIwNTIxNzUyMTUwNDQsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsNCi0gIGFzc2VydCggISBlcnIpOw0KLSAgYXNzZXJ0LmVxdWFsKDcuMDEyMDUyMTc1MjE1MDQ0LCByZXNwb25zZSk7DQotfSk7DQotDQotdmFyIG91dCA9IG5ldyB0dHlwZXMuWHRydWN0KHsNCi0gIHN0cmluZ190aGluZzogJ1plcm8nLA0KLSAgYnl0ZV90aGluZzogMSwNCi0gIGkzMl90aGluZzogLTMsDQotICBpNjRfdGhpbmc6IDEwMDAwMDANCi19KTsNCi1jbGllbnQudGVzdFN0cnVjdChvdXQsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsNCi0gIGFzc2VydCggISBlcnIpOw0KLSAgY2hlY2tSZWN1cnNpdmVseShvdXQsIHJlc3BvbnNlKTsNCi19KTsNCi0NCi12YXIgb3V0MiA9IG5ldyB0dHlwZXMuWHRydWN0MigpOw0KLW91dDIuYnl0ZV90aGluZyA9IDE7DQotb3V0Mi5zdHJ1Y3RfdGhpbmcgPSBvdXQ7DQotb3V0Mi5pMzJfdGhpbmcgPSA1Ow0KLWNsaWVudC50ZXN0TmVzdChvdXQyLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7DQotICBhc3NlcnQoICEgZXJyKTsNCi0gIGNoZWNrUmVjdXJzaXZlbHkob3V0MiwgcmVzcG9uc2UpOw0KLX0pOw0KLQ0KLXZhciBtYXBvdXQgPSB7fTsNCi1mb3IgKHZhciBpID0gMDsgaSA8IDU7ICsraSkgew0KLSAgbWFwb3V0W2ldID0gaS0xMDsNCi19DQotY2xpZW50LnRlc3RNYXAobWFwb3V0LCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7DQotICBhc3NlcnQoICEgZXJyKTsNCi0gIGFzc2VydC5kZWVwRXF1YWwobWFwb3V0LCByZXNwb25zZSk7DQotfSk7DQotDQotdmFyIG1hcFRlc3RJbnB1dCA9IHsNCi0gICJhIjoiMTIzIiwgImEgYiI6IndpdGggc3BhY2VzICIsICJzYW1lIjoic2FtZSIsICIwIjoibnVtZXJpYyBrZXkiLA0KLSAgImxvbmdWYWx1ZSI6c3RyaW5nVGVzdCwgIkFmcmlrYWFucywgQWxlbWFubmlzY2gsIEFyYWdvbsOpcywg2KfZhNi52LHYqNmK2KksINmF2LXYsdmJLCAiOiJsb25nIGtleSINCi19Ow0KLWNsaWVudC50ZXN0U3RyaW5nTWFwKG1hcFRlc3RJbnB1dCwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgew0KLSAgYXNzZXJ0KCAhIGVycik7DQotICBhc3NlcnQuZGVlcEVxdWFsKG1hcFRlc3RJbnB1dCwgcmVzcG9uc2UpOw0KLX0pOw0KLQ0KLXZhciBzZXRUZXN0U2V0SW5wdXQgPSBbMSwyLDNdOw0KLWNsaWVudC50ZXN0U2V0KHNldFRlc3RTZXRJbnB1dCwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgew0KLSAgYXNzZXJ0KCAhIGVycik7DQotICBhc3NlcnQuZGVlcEVxdWFsKHNldFRlc3RTZXRJbnB1dCwgcmVzcG9uc2UpOw0KLX0pOw0KLXZhciBzZXRUZXN0TGlzdElucHV0ID0gWzEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0LDE1LDE2LDE3LDE4LDE5LDIwXTsNCi1jbGllbnQudGVzdExpc3Qoc2V0VGVzdExpc3RJbnB1dCwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgew0KLSAgYXNzZXJ0KCAhIGVycik7DQotICBhc3NlcnQuZGVlcEVxdWFsKHNldFRlc3RMaXN0SW5wdXQsIHJlc3BvbnNlKTsNCi19KTsNCi0NCi1jbGllbnQudGVzdEVudW0odHR5cGVzLk51bWJlcnouT05FLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7DQotICBhc3NlcnQoICEgZXJyKTsNCi0gIGFzc2VydC5lcXVhbCh0dHlwZXMuTnVtYmVyei5PTkUsIHJlc3BvbnNlKTsNCi19KTsNCi0NCi1jbGllbnQudGVzdFR5cGVkZWYoNjksIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsNCi0gIGFzc2VydCggISBlcnIpOw0KLSAgYXNzZXJ0LmVxdWFsKDY5LCByZXNwb25zZSk7DQotfSk7DQotDQotdmFyIG1hcE1hcFRlc3QgPSB7DQotICAiNCI6IHsiMSI6MSwgIjIiOjIsICIzIjozLCAiNCI6NH0sDQotICAiLTQiOiB7Ii00IjotNCwgIi0zIjotMywgIi0yIjotMiwgIi0xIjotMX0NCi19Ow0KLWNsaWVudC50ZXN0TWFwTWFwKDEsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsNCi0gIGFzc2VydCggISBlcnIpOw0KLSAgYXNzZXJ0LmRlZXBFcXVhbChtYXBNYXBUZXN0LCByZXNwb25zZSk7DQotfSk7DQotDQotdmFyIGNyYXp5ID0gbmV3IHR0eXBlcy5JbnNhbml0eSh7DQotICAidXNlck1hcCI6eyAiNSI6NSwgIjgiOjggfSwNCi0gICJ4dHJ1Y3RzIjpbbmV3IHR0eXBlcy5YdHJ1Y3Qoew0KLSAgICAgICJzdHJpbmdfdGhpbmciOiJHb29kYnllNCIsDQotICAgICAgImJ5dGVfdGhpbmciOjQsDQotICAgICAgImkzMl90aGluZyI6NCwNCi0gICAgICAiaTY0X3RoaW5nIjo0DQotICAgIH0pLCBuZXcgdHR5cGVzLlh0cnVjdCh7DQotICAgICAgInN0cmluZ190aGluZyI6IkhlbGxvMiIsDQotICAgICAgImJ5dGVfdGhpbmciOjIsDQotICAgICAgImkzMl90aGluZyI6MiwNCi0gICAgICAiaTY0X3RoaW5nIjoyDQotICAgIH0pXQ0KLX0pOw0KLXZhciBpbnNhbml0eSA9IHsNCi0gICIxIjp7ICIyIjogY3JhenksICIzIjogY3JhenkgfSwNCi0gICIyIjp7ICI2Ijp7ICJ1c2VyTWFwIjp7fSwgInh0cnVjdHMiOltdIH0gfQ0KLX07DQotY2xpZW50LnRlc3RJbnNhbml0eShjcmF6eSwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgew0KLSAgYXNzZXJ0KCAhIGVycik7DQotICBjaGVja1JlY3Vyc2l2ZWx5KGluc2FuaXR5LCByZXNwb25zZSk7DQotfSk7DQotDQotY2xpZW50LnRlc3RFeGNlcHRpb24oJ1RFeGNlcHRpb24nLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7DQotICBhc3NlcnQoICEgcmVzcG9uc2UpOw0KLX0pOw0KLQ0KLWNsaWVudC50ZXN0RXhjZXB0aW9uKCdYY2VwdGlvbicsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsNCi0gIGFzc2VydCggISByZXNwb25zZSk7DQotICBhc3NlcnQuZXF1YWwoZXJyLmVycm9yQ29kZSwgMTAwMSk7DQotICBhc3NlcnQuZXF1YWwoJ1hjZXB0aW9uJywgZXJyLm1lc3NhZ2UpOw0KLX0pOw0KLQ0KLWNsaWVudC50ZXN0RXhjZXB0aW9uKCdubyBFeGNlcHRpb24nLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7DQotICBhc3NlcnQoICEgZXJyKTsNCi0gIGFzc2VydC5lcXVhbCh1bmRlZmluZWQsIHJlc3BvbnNlKTsgLy92b2lkDQotfSk7DQotDQotY2xpZW50LnRlc3RPbmV3YXkoMCwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgew0KLSAgYXNzZXJ0KGZhbHNlKTsgLy9zaG91bGQgbm90IGFuc3dlcg0KLX0pOw0KLQ0KLShmdW5jdGlvbigpIHsNCi0gIHZhciB0ZXN0X2NvbXBsZXRlID0gZmFsc2U7DQotICB2YXIgcmV0cnlzID0gMDsNCi0gIHZhciByZXRyeV9saW1pdCA9IDMwOw0KLSAgdmFyIHJldHJ5X2ludGVydmFsID0gMTAwOw0KLSAgLyoqDQotICAgKiByZWRvIGEgc2ltcGxlIHRlc3QgYWZ0ZXIgdGhlIG9uZXdheSB0byBtYWtlIHN1cmUgd2UgYXJlbid0ICJvZmYgYnkgb25lIiAtLQ0KLSAgICogaWYgdGhlIHNlcnZlciB0cmVhdGVkIG9uZXdheSB2b2lkIGxpa2Ugbm9ybWFsIHZvaWQsIHRoaXMgbmV4dCB0ZXN0IHdpbGwNCi0gICAqIGZhaWwgc2luY2UgaXQgd2lsbCBnZXQgdGhlIHZvaWQgY29uZmlybWF0aW9uIHJhdGhlciB0aGFuIHRoZSBjb3JyZWN0DQotICAgKiByZXN1bHQuIEluIHRoaXMgY2lyY3Vtc3RhbmNlLCB0aGUgY2xpZW50IHdpbGwgdGhyb3cgdGhlIGV4Y2VwdGlvbjoNCi0gICAqDQotICAgKiBCZWNhdXNlIHRoaXMgaXMgdGhlIGxhc3QgdGVzdCBhZ2FpbnN0IHRoZSBzZXJ2ZXIsIHdoZW4gaXQgY29tcGxldGVzDQotICAgKiB0aGUgZW50aXJlIHN1aXRlIGlzIGNvbXBsZXRlIGJ5IGRlZmluaXRpb24gKHRoZSB0ZXN0cyBydW4gc2VyaWFsbHkpLg0KLSAgICovDQotICBjbGllbnQudGVzdEkzMigtMSwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgew0KLSAgICBhc3NlcnQoICEgZXJyKTsNCi0gICAgYXNzZXJ0LmVxdWFsKC0xLCByZXNwb25zZSk7DQotICAgIHRlc3RfY29tcGxldGUgPSB0cnVlOw0KLSAgfSk7DQotDQotICAvL1dlIHdhaXQgdXAgdG8gcmV0cnlfbGltaXQgKiByZXRyeV9pbnRlcnZhbCBmb3IgdGhlIHRlc3Qgc3VpdGUgdG8gY29tcGxldGUNCi0gIGZ1bmN0aW9uIFRlc3RGb3JDb21wbGV0aW9uKCkgew0KLSAgICBpZih0ZXN0X2NvbXBsZXRlKSB7DQotICAgICAgaWYgKGNhbGxiYWNrKSB7DQotICAgICAgICBjYWxsYmFjaygiU2VydmVyIHN1Y2Nlc3NmdWxseSB0ZXN0ZWQhIik7DQotICAgICAgfQ0KLSAgICB9IGVsc2Ugew0KLSAgICAgIGlmICgrK3JldHJ5cyA8IHJldHJ5X2xpbWl0KSB7DQotICAgICAgICBzZXRUaW1lb3V0KFRlc3RGb3JDb21wbGV0aW9uLCByZXRyeV9pbnRlcnZhbCk7DQotICAgICAgfSBlbHNlIHsNCi0gICAgICAgIGlmIChjYWxsYmFjaykgew0KLSAgICAgICAgICBjYWxsYmFjaygiU2VydmVyIHRlc3QgZmFpbGVkIHRvIGNvbXBsZXRlIGFmdGVyICIgKw0KLSAgICAgICAgICAgICAgICAgICAocmV0cnlfbGltaXQqcmV0cnlfaW50ZXJ2YWwvMTAwMCkgKyAiIHNlY29uZHMiKTsNCi0gICAgICAgIH0NCi0gICAgICB9DQotICAgIH0NCi0gIH0NCi0NCi0gIHNldFRpbWVvdXQoVGVzdEZvckNvbXBsZXRpb24sIHJldHJ5X2ludGVydmFsKTsNCi19KSgpOw0KLX07DQpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy90ZXN0L3RocmlmdF90ZXN0X2RyaXZlcl9wcm9taXNlLmpzIGIvbGliL25vZGVqcy90ZXN0L3RocmlmdF90ZXN0X2RyaXZlcl9wcm9taXNlLmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjE3NWNiLi4wMDAwMDAwCi0tLSBhL2xpYi9ub2RlanMvdGVzdC90aHJpZnRfdGVzdF9kcml2ZXJfcHJvbWlzZS5qcworKysgL2Rldi9udWxsCkBAIC0xLDM5NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICdMaWNlbnNlJyk7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAnQVMgSVMnIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi0gLy8gVGhpcyBpcyB0aGUgTm9kZSB0ZXN0IGRyaXZlciBmb3IgdGhlIHN0YW5kYXJkIEFwYWNoZSBUaHJpZnQNCi0gLy8gdGVzdCBzZXJ2aWNlLiBUaGUgZHJpdmVyIGludm9rZXMgZXZlcnkgZnVuY3Rpb24gZGVmaW5lZCBpbiB0aGUNCi0gLy8gVGhyaWZ0IFRlc3Qgc2VydmljZSB3aXRoIGEgcmVwcmVzZW50YXRpdmUgcmFuZ2Ugb2YgcGFyYW1ldGVycy4NCi0gLy8NCi0gLy8gVGhlIFRocmlmdFRlc3REcml2ZXIgZnVuY3Rpb24gcmVxdWlyZXMgYSBjbGllbnQgb2JqZWN0DQotIC8vIGNvbm5lY3RlZCB0byBhIHNlcnZlciBob3N0aW5nIHRoZSBUaHJpZnQgVGVzdCBzZXJ2aWNlIGFuZA0KLSAvLyBzdXBwb3J0cyBhbiBvcHRpb25hbCBjYWxsYmFjayBmdW5jdGlvbiB3aGljaCBpcyBjYWxsZWQgd2l0aA0KLSAvLyBhIHN0YXR1cyBtZXNzYWdlIHdoZW4gdGhlIHRlc3QgaXMgY29tcGxldGUuDQotDQotdmFyIGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydCcpOw0KLXZhciB0dHlwZXMgPSByZXF1aXJlKCcuL2dlbi1ub2RlanMvVGhyaWZ0VGVzdF90eXBlcycpOw0KLQ0KLXZhciBUaHJpZnRUZXN0RHJpdmVyID0gZXhwb3J0cy5UaHJpZnRUZXN0RHJpdmVyID0gZnVuY3Rpb24oY2xpZW50LCBjYWxsYmFjaykgew0KLQ0KLS8vIGRlZXBFcXVhbCBkb2Vzbid0IHdvcmsgd2l0aCBmaWVsZHMgdXNpbmcgbm9kZS1pbnQ2NA0KLWZ1bmN0aW9uIGNoZWNrUmVjdXJzaXZlbHkobWFwMSwgbWFwMikgew0KLSAgaWYgKHR5cGVvZiBtYXAxICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBtYXAyICE9PSAnZnVuY3Rpb24nKSB7DQotICAgIGlmICghbWFwMSB8fCB0eXBlb2YgbWFwMSAhPT0gJ29iamVjdCcpIHsNCi0gICAgICAgIGFzc2VydC5lcXVhbChtYXAxLCBtYXAyKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICBmb3IgKHZhciBrZXkgaW4gbWFwMSkgew0KLSAgICAgICAgY2hlY2tSZWN1cnNpdmVseShtYXAxW2tleV0sIG1hcDJba2V5XSk7DQotICAgICAgfQ0KLSAgICB9DQotICB9DQotfQ0KLQ0KLWNsaWVudC50ZXN0Vm9pZCgpDQotICAudGhlbihmdW5jdGlvbihyZXNwb25zZSkgew0KLSAgICBhc3NlcnQuZXF1YWwodW5kZWZpbmVkLCByZXNwb25zZSk7IC8vdm9pZA0KLSAgfSkNCi0gIC5mYWlsKGZ1bmN0aW9uKCkgew0KLSAgICBhc3NlcnQoZmFsc2UpOw0KLSAgfSk7DQotDQotDQotY2xpZW50LnRlc3RTdHJpbmcoIlRlc3QiKQ0KLSAgLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsNCi0gICAgYXNzZXJ0LmVxdWFsKCJUZXN0IiwgcmVzcG9uc2UpOw0KLSAgfSkNCi0gIC5mYWlsKGZ1bmN0aW9uKCkgew0KLSAgICBhc3NlcnQoZmFsc2UpOw0KLSAgfSk7DQotDQotY2xpZW50LnRlc3RTdHJpbmcoIiIpDQotICAudGhlbihmdW5jdGlvbihyZXNwb25zZSkgew0KLSAgICBhc3NlcnQuZXF1YWwoIiIsIHJlc3BvbnNlKTsNCi0gIH0pDQotICAuZmFpbChmdW5jdGlvbigpIHsNCi0gICAgYXNzZXJ0KGZhbHNlKTsNCi0gIH0pOw0KLQ0KLS8vYWxsIExhbmd1YWdlcyBpbiBVVEYtOA0KLS8qanNoaW50IC1XMTAwICovDQotdmFyIHN0cmluZ1Rlc3QgPSAiQWZyaWthYW5zLCBBbGVtYW5uaXNjaCwgQXJhZ29uw6lzLCDYp9mE2LnYsdio2YrYqSwg2YXYtdix2YksICIgKw0KLSAgICAiQXN0dXJpYW51LCBBeW1hciBhcnUsIEF6yZlyYmF5Y2FuLCDQkdCw0YjSodC+0YDRgiwgQm9hcmlzY2gsIMW9ZW1haXTEl8Wha2EsICIgKw0KLSAgICAi0JHQtdC70LDRgNGD0YHQutCw0Y8sINCR0LXQu9Cw0YDRg9GB0LrQsNGPICjRgtCw0YDQsNGI0LrQtdCy0ZbRhtCwKSwg0JHRitC70LPQsNGA0YHQutC4LCBCYW1hbmFua2FuLCAiICsNCi0gICAgIuCmrOCmvuCmguCmsuCmviwgQnJlemhvbmVnLCBCb3NhbnNraSwgQ2F0YWzDoCwgTcOsbmctZMSVzKRuZy1uZ+G5s8yELCDQndC+0YXRh9C40LnQvSwgIiArDQotICAgICJDZWJ1YW5vLCDhj6PhjrPhjqksIMSMZXNreSwg0KHQu9C+0LLRo8yB0L3RjNGB0LrRiiAvIOKwlOKwjuKwkeKwguKwoeKwkOKwoOKwlOKwjeKwnywg0KfTkdCy0LDRiNC70LAsIEN5bXJhZWcsICIgKw0KLSAgICAiRGFuc2ssIFphemFraSwg3oveqN6I3qzegN6o3oTept6Q3rAsIM6VzrvOu863zr3Ouc66zqwsIEVtaWxpw6BuIGUgcnVtYWduw7JsLCBFbmdsaXNoLCAiICsNCi0gICAgIkVzcGVyYW50bywgRXNwYcOxb2wsIEVlc3RpLCBFdXNrYXJhLCDZgdin2LHYs9uMLCBTdW9taSwgVsO1cm8sIEbDuHJveXNrdCwgIiArDQotICAgICJGcmFuw6dhaXMsIEFycGV0YW4sIEZ1cmxhbiwgRnJ5c2ssIEdhZWlsZ2UsIOi0m+iqniwgR8OgaWRobGlnLCBHYWxlZ28sICIgKw0KLSAgICAiQXZhw7FlJ+G6vSwg4KqX4KuB4Kqc4Kqw4Kq+4Kqk4KuALCBHYWVsZywg16LXkdeo15nXqiwg4KS54KS/4KSo4KWN4KSm4KWALCBGaWppIEhpbmRpLCBIcnZhdHNraSwgIiArDQotICAgICJLcmV5w7JsIGF5aXN5ZW4sIE1hZ3lhciwg1YDVodW11aXWgNWl1bYsIEludGVybGluZ3VhLCBCYWhhc2EgSW5kb25lc2lhLCAiICsNCi0gICAgIklsb2thbm8sIElkbywgw41zbGVuc2thLCBJdGFsaWFubywg5pel5pys6KqeLCBMb2piYW4sIEJhc2EgSmF3YSwgIiArDQotICAgICLhg6Xhg5Dhg6Dhg5fhg6Phg5rhg5gsIEtvbmdvLCBLYWxhYWxsaXN1dCwg4LKV4LKo4LON4LKo4LKhLCDtlZzqta3slrQsINCa0YrQsNGA0LDRh9Cw0Lkt0JzQsNC70LrRitCw0YAsICIgKw0KLSAgICAiUmlwb2FyaXNjaCwgS3VyZMOuLCDQmtC+0LzQuCwgS2VybmV3ZWssINCa0YvRgNCz0YvQt9GH0LAsIExhdGluYSwgTGFkaW5vLCAiICsNCi0gICAgIkzDq3R6ZWJ1ZXJnZXNjaCwgTGltYnVyZ3MsIExpbmfDoWxhLCDguqXgurLguqcsIExpZXR1dmnFsywgTGF0dmllxaF1LCBCYXNhICIgKw0KLSAgICAiQmFueXVtYXNhbiwgTWFsYWdhc3ksINCc0LDQutC10LTQvtC90YHQutC4LCDgtK7gtLLgtK/gtL7gtLPgtIIsIOCkruCksOCkvuCkoOClgCwg2YXYp9iy2ZDYsdmI2YbbjCwgQmFoYXNhICIgKw0KLSAgICAiTWVsYXl1LCBObmFwdWxpdGFubywgTmVkZXJzYWtzaXNjaCwg4KSo4KWH4KSq4KS+4KSyIOCkreCkvuCkt+CkviwgTmVkZXJsYW5kcywg4oCqIiArDQotICAgICJOb3JzayAobnlub3JzaynigKwsIOKAqk5vcnNrIChib2ttw6VsKeKArCwgTm91b3JtYW5kLCBEaW7DqSBiaXphYWQsICIgKw0KLSAgICAiT2NjaXRhbiwg0JjRgNC+0L3QsNGDLCBQYXBpYW1lbnR1LCBEZWl0c2NoLCBQb2xza2ksINm+2YbYrNin2KjbjCwg2b7amtiq2YgsICIgKw0KLSAgICAiTm9yZnVrIC8gUGl0a2VybiwgUG9ydHVndcOqcywgUnVuYSBTaW1pLCBSdW1hbnRzY2gsIFJvbWFuaSwgUm9tw6JuxIMsICIgKw0KLSAgICAi0KDRg9GB0YHQutC40LksINCh0LDRhdCwINGC0YvQu9CwLCBTYXJkdSwgU2ljaWxpYW51LCBTY290cywgU8OhbWVnaWVsbGEsIFNpbXBsZSAiICsNCi0gICAgIkVuZ2xpc2gsIFNsb3ZlbsSNaW5hLCBTbG92ZW7FocSNaW5hLCDQodGA0L/RgdC60LggLyBTcnBza2ksIFNlZWx0ZXJzaywgIiArDQotICAgICJTdmVuc2thLCBLaXN3YWhpbGksIOCupOCuruCuv+CutOCvjSwg4LCk4LGG4LCy4LGB4LCX4LGBLCDQotC+0rfQuNC606MsIOC5hOC4l+C4oiwgVMO8cmttZW7Dp2UsIFRhZ2Fsb2csICIgKw0KLSAgICAiVMO8cmvDp2UsINCi0LDRgtCw0YDRh9CwL1RhdGFyw6dhLCDQo9C60YDQsNGX0L3RgdGM0LrQsCwg2KfYsdiv2YgsIFRp4bq/bmcgVmnhu4d0LCBWb2xhcMO8aywgIiArDQotICAgICJXYWxvbiwgV2luYXJheSwg5ZC06K+tLCBpc2lYaG9zYSwg15nXmda015PXmdepLCBZb3LDuWLDoSwgWmXDqnV3cywg5Lit5paHLCAiICsNCi0gICAgIkLDom4tbMOibS1nw7osIOeyteiqniI7DQotLypqc2hpbnQgK1cxMDAgKi8NCi0NCi1jbGllbnQudGVzdFN0cmluZyhzdHJpbmdUZXN0KQ0KLSAgLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsNCi0gICAgYXNzZXJ0LmVxdWFsKHN0cmluZ1Rlc3QsIHJlc3BvbnNlKTsNCi0gIH0pDQotICAuZmFpbChmdW5jdGlvbigpIHsNCi0gICAgYXNzZXJ0KGZhbHNlKTsNCi0gIH0pOw0KLQ0KLQ0KLXZhciBzcGVjaWFsQ2hhcmFjdGVycyA9ICdxdW90ZTogXCIgYmFja3NsYXNoOicgKw0KLSAgICAnIGZvcndhcmRzbGFzaC1lc2NhcGVkOiBcLyAnICsNCi0gICAgJyBiYWNrc3BhY2U6IFxiIGZvcm1mZWVkOiBcZiBuZXdsaW5lOiBcbiByZXR1cm46IFxyIHRhYjogJyArDQotICAgICcgbm93LWFsbC1vZi10aGVtLXRvZ2V0aGVyOiAiXFxcL1xiXG5cclx0JyArDQotICAgICcgbm93LWEtYnVuY2gtb2YtanVuazogIUAjJCUmKCkoJiUkI3t9e308Pjw+PCcgKw0KLSAgICAnIGNoYXItdG8tdGVzdC1qc29uLXBhcnNpbmc6IF1dIFwiXV0gXFwiIH19fXsgW1tbICc7DQotY2xpZW50LnRlc3RTdHJpbmcoc3BlY2lhbENoYXJhY3RlcnMpDQotICAudGhlbihmdW5jdGlvbihyZXNwb25zZSkgew0KLSAgICBhc3NlcnQuZXF1YWwoc3BlY2lhbENoYXJhY3RlcnMsIHJlc3BvbnNlKTsNCi0gIH0pDQotICAuZmFpbChmdW5jdGlvbigpIHsNCi0gICAgYXNzZXJ0KGZhbHNlKTsNCi0gIH0pOw0KLQ0KLQ0KLWNsaWVudC50ZXN0Qnl0ZSgxKQ0KLSAgLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsNCi0gICAgYXNzZXJ0LmVxdWFsKDEsIHJlc3BvbnNlKTsNCi0gIH0pDQotICAuZmFpbChmdW5jdGlvbigpIHsNCi0gICAgYXNzZXJ0KGZhbHNlKTsNCi0gIH0pOw0KLQ0KLQ0KLWNsaWVudC50ZXN0Qnl0ZSgwKQ0KLSAgLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsNCi0gICAgYXNzZXJ0LmVxdWFsKDAsIHJlc3BvbnNlKTsNCi0gIH0pDQotICAuZmFpbChmdW5jdGlvbigpIHsNCi0gICAgYXNzZXJ0KGZhbHNlKTsNCi0gIH0pOw0KLQ0KLWNsaWVudC50ZXN0Qnl0ZSgtMSkNCi0gIC50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7DQotICAgIGFzc2VydC5lcXVhbCgtMSwgcmVzcG9uc2UpOw0KLSAgfSkNCi0gIC5mYWlsKGZ1bmN0aW9uKCkgew0KLSAgICBhc3NlcnQoZmFsc2UpOw0KLSAgfSk7DQotDQotY2xpZW50LnRlc3RCeXRlKC0xMjcpDQotICAudGhlbihmdW5jdGlvbihyZXNwb25zZSkgew0KLSAgICBhc3NlcnQuZXF1YWwoLTEyNywgcmVzcG9uc2UpOw0KLSAgfSkNCi0gIC5mYWlsKGZ1bmN0aW9uKCkgew0KLSAgICBhc3NlcnQoZmFsc2UpOw0KLSAgfSk7DQotDQotY2xpZW50LnRlc3RJMzIoLTEpDQotICAudGhlbihmdW5jdGlvbihyZXNwb25zZSkgew0KLSAgICBhc3NlcnQuZXF1YWwoLTEsIHJlc3BvbnNlKTsNCi0gIH0pDQotICAuZmFpbChmdW5jdGlvbigpIHsNCi0gICAgYXNzZXJ0KGZhbHNlKTsNCi0gIH0pOw0KLQ0KLWNsaWVudC50ZXN0STY0KDUpDQotICAudGhlbihmdW5jdGlvbihyZXNwb25zZSkgew0KLSAgICBhc3NlcnQuZXF1YWwoNSwgcmVzcG9uc2UpOw0KLSAgfSkNCi0gIC5mYWlsKGZ1bmN0aW9uKCkgew0KLSAgICBhc3NlcnQoZmFsc2UpOw0KLSAgfSk7DQotDQotY2xpZW50LnRlc3RJNjQoLTUpDQotICAudGhlbihmdW5jdGlvbihyZXNwb25zZSkgew0KLSAgICBhc3NlcnQuZXF1YWwoLTUsIHJlc3BvbnNlKTsNCi0gIH0pDQotICAuZmFpbChmdW5jdGlvbigpIHsNCi0gICAgYXNzZXJ0KGZhbHNlKTsNCi0gIH0pOw0KLQ0KLWNsaWVudC50ZXN0STY0KC0zNDM1OTczODM2OCkNCi0gIC50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7DQotICAgIGFzc2VydC5lcXVhbCgtMzQzNTk3MzgzNjgsIHJlc3BvbnNlKTsNCi0gIH0pDQotICAuZmFpbChmdW5jdGlvbigpIHsNCi0gICAgYXNzZXJ0KGZhbHNlKTsNCi0gIH0pOw0KLQ0KLWNsaWVudC50ZXN0RG91YmxlKC01LjIwOTg1MjMpDQotICAudGhlbihmdW5jdGlvbihyZXNwb25zZSkgew0KLSAgICBhc3NlcnQuZXF1YWwoLTUuMjA5ODUyMywgcmVzcG9uc2UpOw0KLSAgfSkNCi0gIC5mYWlsKGZ1bmN0aW9uKCkgew0KLSAgICBhc3NlcnQoZmFsc2UpOw0KLSAgfSk7DQotDQotY2xpZW50LnRlc3REb3VibGUoNy4wMTIwNTIxNzUyMTUwNDQpDQotICAudGhlbihmdW5jdGlvbihyZXNwb25zZSkgew0KLSAgICBhc3NlcnQuZXF1YWwoNy4wMTIwNTIxNzUyMTUwNDQsIHJlc3BvbnNlKTsNCi0gIH0pDQotICAuZmFpbChmdW5jdGlvbigpIHsNCi0gICAgYXNzZXJ0KGZhbHNlKTsNCi0gIH0pOw0KLQ0KLXZhciBvdXQgPSBuZXcgdHR5cGVzLlh0cnVjdCh7DQotICBzdHJpbmdfdGhpbmc6ICdaZXJvJywNCi0gIGJ5dGVfdGhpbmc6IDEsDQotICBpMzJfdGhpbmc6IC0zLA0KLSAgaTY0X3RoaW5nOiAxMDAwMDAwDQotfSk7DQotY2xpZW50LnRlc3RTdHJ1Y3Qob3V0KQ0KLSAgLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsNCi0gICAgY2hlY2tSZWN1cnNpdmVseShvdXQsIHJlc3BvbnNlKTsNCi0gIH0pDQotICAuZmFpbChmdW5jdGlvbigpIHsNCi0gICAgYXNzZXJ0KGZhbHNlKTsNCi0gIH0pOw0KLQ0KLXZhciBvdXQyID0gbmV3IHR0eXBlcy5YdHJ1Y3QyKCk7DQotb3V0Mi5ieXRlX3RoaW5nID0gMTsNCi1vdXQyLnN0cnVjdF90aGluZyA9IG91dDsNCi1vdXQyLmkzMl90aGluZyA9IDU7DQotY2xpZW50LnRlc3ROZXN0KG91dDIpDQotICAudGhlbihmdW5jdGlvbihyZXNwb25zZSkgew0KLSAgICBjaGVja1JlY3Vyc2l2ZWx5KG91dDIsIHJlc3BvbnNlKTsNCi0gIH0pDQotICAuZmFpbChmdW5jdGlvbigpIHsNCi0gICAgYXNzZXJ0KGZhbHNlKTsNCi0gIH0pOw0KLQ0KLXZhciBtYXBvdXQgPSB7fTsNCi1mb3IgKHZhciBpID0gMDsgaSA8IDU7ICsraSkgew0KLSAgbWFwb3V0W2ldID0gaS0xMDsNCi19DQotY2xpZW50LnRlc3RNYXAobWFwb3V0KQ0KLSAgLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsNCi0gICAgYXNzZXJ0LmRlZXBFcXVhbChtYXBvdXQsIHJlc3BvbnNlKTsNCi0gIH0pDQotICAuZmFpbChmdW5jdGlvbigpIHsNCi0gICAgYXNzZXJ0KGZhbHNlKTsNCi0gIH0pOw0KLQ0KLXZhciBtYXBUZXN0SW5wdXQgPSB7DQotICAiYSI6IjEyMyIsICJhIGIiOiJ3aXRoIHNwYWNlcyAiLCAic2FtZSI6InNhbWUiLCAiMCI6Im51bWVyaWMga2V5IiwNCi0gICJsb25nVmFsdWUiOnN0cmluZ1Rlc3QsIHN0cmluZ1Rlc3Q6Imxvbmcga2V5Ig0KLX07DQotY2xpZW50LnRlc3RTdHJpbmdNYXAobWFwVGVzdElucHV0KQ0KLSAgLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsNCi0gICAgYXNzZXJ0LmRlZXBFcXVhbChtYXBUZXN0SW5wdXQsIHJlc3BvbnNlKTsNCi0gIH0pDQotICAuZmFpbChmdW5jdGlvbigpIHsNCi0gICAgYXNzZXJ0KGZhbHNlKTsNCi0gIH0pOw0KLQ0KLXZhciBzZXRUZXN0SW5wdXQgPSBbMSwyLDNdOw0KLWNsaWVudC50ZXN0U2V0KHNldFRlc3RJbnB1dCkNCi0gIC50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7DQotICAgIGFzc2VydC5kZWVwRXF1YWwoc2V0VGVzdElucHV0LCByZXNwb25zZSk7DQotICB9KQ0KLSAgLmZhaWwoZnVuY3Rpb24oKSB7DQotICAgIGFzc2VydChmYWxzZSk7DQotICB9KTsNCi1jbGllbnQudGVzdExpc3Qoc2V0VGVzdElucHV0KQ0KLSAgLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsNCi0gICAgYXNzZXJ0LmRlZXBFcXVhbChzZXRUZXN0SW5wdXQsIHJlc3BvbnNlKTsNCi0gIH0pDQotICAuZmFpbChmdW5jdGlvbigpIHsNCi0gICAgYXNzZXJ0KGZhbHNlKTsNCi0gIH0pOw0KLQ0KLWNsaWVudC50ZXN0RW51bSh0dHlwZXMuTnVtYmVyei5PTkUpDQotICAudGhlbihmdW5jdGlvbihyZXNwb25zZSkgew0KLSAgICBhc3NlcnQuZXF1YWwodHR5cGVzLk51bWJlcnouT05FLCByZXNwb25zZSk7DQotICB9KQ0KLSAgLmZhaWwoZnVuY3Rpb24oKSB7DQotICAgIGFzc2VydChmYWxzZSk7DQotICB9KTsNCi0NCi1jbGllbnQudGVzdFR5cGVkZWYoNjkpDQotICAudGhlbihmdW5jdGlvbihyZXNwb25zZSkgew0KLSAgICBhc3NlcnQuZXF1YWwoNjksIHJlc3BvbnNlKTsNCi0gIH0pDQotICAuZmFpbChmdW5jdGlvbigpIHsNCi0gICAgYXNzZXJ0KGZhbHNlKTsNCi0gIH0pOw0KLQ0KLXZhciBtYXBNYXBUZXN0ID0gew0KLSAgIjQiOiB7IjEiOjEsICIyIjoyLCAiMyI6MywgIjQiOjR9LA0KLSAgIi00IjogeyItNCI6LTQsICItMyI6LTMsICItMiI6LTIsICItMSI6LTF9DQotfTsNCi1jbGllbnQudGVzdE1hcE1hcCgxKQ0KLSAgLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsNCi0gICAgYXNzZXJ0LmRlZXBFcXVhbChtYXBNYXBUZXN0LCByZXNwb25zZSk7DQotICB9KQ0KLSAgLmZhaWwoZnVuY3Rpb24oKSB7DQotICAgIGFzc2VydChmYWxzZSk7DQotICB9KTsNCi0NCi12YXIgY3JhenkgPSBuZXcgdHR5cGVzLkluc2FuaXR5KHsNCi0gICJ1c2VyTWFwIjp7ICI1Ijo1LCAiOCI6OCB9LA0KLSAgInh0cnVjdHMiOltuZXcgdHR5cGVzLlh0cnVjdCh7DQotICAgICAgInN0cmluZ190aGluZyI6Ikdvb2RieWU0IiwNCi0gICAgICAiYnl0ZV90aGluZyI6NCwNCi0gICAgICAiaTMyX3RoaW5nIjo0LA0KLSAgICAgICJpNjRfdGhpbmciOjQNCi0gICAgfSksIG5ldyB0dHlwZXMuWHRydWN0KHsNCi0gICAgICAic3RyaW5nX3RoaW5nIjoiSGVsbG8yIiwNCi0gICAgICAiYnl0ZV90aGluZyI6MiwNCi0gICAgICAiaTMyX3RoaW5nIjoyLA0KLSAgICAgICJpNjRfdGhpbmciOjINCi0gICAgfSldDQotfSk7DQotDQotdmFyIGluc2FuaXR5ID0gew0KLSAgIjEiOnsgIjIiOiBjcmF6eSwgIjMiOiBjcmF6eSB9LA0KLSAgIjIiOnsgIjYiOnsgInVzZXJNYXAiOm51bGwsICJ4dHJ1Y3RzIjpudWxsIH0gfQ0KLX07DQotY2xpZW50LnRlc3RJbnNhbml0eShjcmF6eSkNCi0gIC50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7DQotICAgIGNoZWNrUmVjdXJzaXZlbHkoaW5zYW5pdHksIHJlc3BvbnNlKTsNCi0gIH0pDQotICAuZmFpbChmdW5jdGlvbigpIHsNCi0gICAgYXNzZXJ0KGZhbHNlKTsNCi0gIH0pOw0KLQ0KLWNsaWVudC50ZXN0RXhjZXB0aW9uKCdURXhjZXB0aW9uJykNCi0gIC50aGVuKGZ1bmN0aW9uKCkgew0KLSAgICBhc3NlcnQoZmFsc2UpOw0KLSAgfSk7DQotDQotY2xpZW50LnRlc3RFeGNlcHRpb24oJ1hjZXB0aW9uJykNCi0gIC50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7DQotICAgIGFzc2VydC5lcXVhbChlcnIuZXJyb3JDb2RlLCAxMDAxKTsNCi0gICAgYXNzZXJ0LmVxdWFsKCdYY2VwdGlvbicsIGVyci5tZXNzYWdlKTsNCi0gIH0pDQotICAuZmFpbChmdW5jdGlvbigpIHsNCi0gICAgYXNzZXJ0KGZhbHNlKTsNCi0gIH0pOw0KLQ0KLWNsaWVudC50ZXN0RXhjZXB0aW9uKCdubyBFeGNlcHRpb24nKQ0KLSAgLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsNCi0gICAgYXNzZXJ0LmVxdWFsKHVuZGVmaW5lZCwgcmVzcG9uc2UpOyAvL3ZvaWQNCi0gIH0pDQotICAuZmFpbChmdW5jdGlvbigpIHsNCi0gICAgYXNzZXJ0KGZhbHNlKTsNCi0gIH0pOw0KLQ0KLWNsaWVudC50ZXN0T25ld2F5KDAsIGZ1bmN0aW9uKGVycm9yLCByZXNwb25zZSkgew0KLSAgYXNzZXJ0KGZhbHNlKTsgLy9zaG91bGQgbm90IGFuc3dlcg0KLX0pOw0KLQ0KLShmdW5jdGlvbigpIHsNCi0gIHZhciB0ZXN0X2NvbXBsZXRlID0gZmFsc2U7DQotICB2YXIgcmV0cnlzID0gMDsNCi0gIHZhciByZXRyeV9saW1pdCA9IDMwOw0KLSAgdmFyIHJldHJ5X2ludGVydmFsID0gMTAwOw0KLSAgLyoqDQotICAgKiByZWRvIGEgc2ltcGxlIHRlc3QgYWZ0ZXIgdGhlIG9uZXdheSB0byBtYWtlIHN1cmUgd2UgYXJlbid0ICJvZmYgYnkgb25lIiAtLQ0KLSAgICogaWYgdGhlIHNlcnZlciB0cmVhdGVkIG9uZXdheSB2b2lkIGxpa2Ugbm9ybWFsIHZvaWQsIHRoaXMgbmV4dCB0ZXN0IHdpbGwNCi0gICAqIGZhaWwgc2luY2UgaXQgd2lsbCBnZXQgdGhlIHZvaWQgY29uZmlybWF0aW9uIHJhdGhlciB0aGFuIHRoZSBjb3JyZWN0DQotICAgKiByZXN1bHQuIEluIHRoaXMgY2lyY3Vtc3RhbmNlLCB0aGUgY2xpZW50IHdpbGwgdGhyb3cgdGhlIGV4Y2VwdGlvbjoNCi0gICAqDQotICAgKiBCZWNhdXNlIHRoaXMgaXMgdGhlIGxhc3QgdGVzdCBhZ2FpbnN0IHRoZSBzZXJ2ZXIsIHdoZW4gaXQgY29tcGxldGVzDQotICAgKiB0aGUgZW50aXJlIHN1aXRlIGlzIGNvbXBsZXRlIGJ5IGRlZmluaXRpb24gKHRoZSB0ZXN0cyBydW4gc2VyaWFsbHkpLg0KLSAgICovDQotICBjbGllbnQudGVzdEkzMigtMSkNCi0gICAgLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsNCi0gICAgICAgIGFzc2VydC5lcXVhbCgtMSwgcmVzcG9uc2UpOw0KLSAgICAgICAgdGVzdF9jb21wbGV0ZSA9IHRydWU7DQotICAgIH0pDQotICAgIC5mYWlsKGZ1bmN0aW9uKCkgew0KLSAgICAgIGFzc2VydChmYWxzZSk7DQotICAgIH0pOw0KLQ0KLS8vV2Ugd2FpdCB1cCB0byByZXRyeV9saW1pdCAqIHJldHJ5X2ludGVydmFsIGZvciB0aGUgdGVzdCBzdWl0ZSB0byBjb21wbGV0ZQ0KLSAgZnVuY3Rpb24gVGVzdEZvckNvbXBsZXRpb24oKSB7DQotICAgIGlmKHRlc3RfY29tcGxldGUpIHsNCi0gICAgICBpZiAoY2FsbGJhY2spIHsNCi0gICAgICAgIGNhbGxiYWNrKCJTZXJ2ZXIgc3VjY2Vzc2Z1bGx5IHRlc3RlZCEiKTsNCi0gICAgICB9DQotICAgIH0gZWxzZSB7DQotICAgICAgaWYgKCsrcmV0cnlzIDwgcmV0cnlfbGltaXQpIHsNCi0gICAgICAgIHNldFRpbWVvdXQoVGVzdEZvckNvbXBsZXRpb24sIHJldHJ5X2ludGVydmFsKTsNCi0gICAgICB9IGVsc2Ugew0KLSAgICBpZiAoY2FsbGJhY2spIHsNCi0gICAgICBjYWxsYmFjaygiU2VydmVyIHRlc3QgZmFpbGVkIHRvIGNvbXBsZXRlIGFmdGVyICIgKw0KLSAgICAgICAgKHJldHJ5X2xpbWl0KnJldHJ5X2ludGVydmFsLzEwMDApICsgIiBzZWNvbmRzIik7DQotICAgIH0NCi0gICAgICB9DQotICAgIH0NCi0gIH0NCi0NCi0gIHNldFRpbWVvdXQoVGVzdEZvckNvbXBsZXRpb24sIHJldHJ5X2ludGVydmFsKTsNCi19KSgpOw0KLX07DQpkaWZmIC0tZ2l0IGEvbGliL25vZGV0cy8uZ2l0aWdub3JlIGIvbGliL25vZGV0cy8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3YWJhODkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZXRzLy5naXRpZ25vcmUKQEAgLTAsMCArMSBAQAordGVzdC1jb21waWxlZC8KZGlmZiAtLWdpdCBhL2xpYi9ub2RldHMvTWFrZWZpbGUuYW0gYi9saWIvbm9kZXRzL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmVhNjQwY2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZXRzL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNDUgQEAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIFdlIGNhbGwgbnBtIHR3aWNlIHRvIHdvcmsgYXJvdW5kIG5wbSBpc3N1ZXMKKworc3R1YnM6ICQodG9wX3NyY2RpcikvdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorCW1rZGlyIC1wIHRlc3QtY29tcGlsZWQKKwkkKFRIUklGVCkgLS1nZW4ganM6bm9kZSx0cyAtbyB0ZXN0LyAkKHRvcF9zcmNkaXIpL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQgJiYgJChUSFJJRlQpIC0tZ2VuIGpzOm5vZGUsdHMgLW8gdGVzdC1jb21waWxlZCAkKHRvcF9zcmNkaXIpL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKKwordHMtY29tcGlsZTogc3R1YnMKKwlta2RpciAtcCB0ZXN0LWNvbXBpbGVkCisJLi4vLi4vbm9kZV9tb2R1bGVzL3R5cGVzY3JpcHQvYmluL3RzYyAtLW91dERpciB0ZXN0LWNvbXBpbGVkLyAtLXByb2plY3QgdGVzdC90c2NvbmZpZy5qc29uCisKK2RlcHM6ICQodG9wX3NyY2RpcikvcGFja2FnZS5qc29uCisJJChOUE0pIGluc3RhbGwgJCh0b3Bfc3JjZGlyKS8gfHwgJChOUE0pIGluc3RhbGwgJCh0b3Bfc3JjZGlyKS8KKworYWxsLWxvY2FsOiBkZXBzIHRzLWNvbXBpbGUKKworcHJlY3Jvc3M6IGRlcHMgc3R1YnMgdHMtY29tcGlsZQorCitjaGVjazogZGVwcyB0cy1jb21waWxlCisJY2QgJCh0b3Bfc3JjZGlyKSAmJiAkKE5QTSkgcnVuIHRlc3QtdHMgJiYgY2QgbGliL25vZGV0cworCitjbGVhbi1sb2NhbDoKKwkkKFJNKSAtciB0ZXN0L2dlbi1ub2RlanMKKwkkKFJNKSAtciAkKHRvcF9zcmNkaXIpL25vZGVfbW9kdWxlcworCSQoUk0pIC1yIHRlc3QtY29tcGlsZWQKKworRVhUUkFfRElTVCA9IFwKKwl0ZXN0IFwKKwljb2Rpbmdfc3RhbmRhcmRzLm1kCmRpZmYgLS1naXQgYS9saWIvbm9kZXRzL2NvZGluZ19zdGFuZGFyZHMubWQgYi9saWIvbm9kZXRzL2NvZGluZ19zdGFuZGFyZHMubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEwMzkwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RldHMvY29kaW5nX3N0YW5kYXJkcy5tZApAQCAtMCwwICsxIEBACitQbGVhc2UgZm9sbG93IFtHZW5lcmFsIENvZGluZyBTdGFuZGFyZHNdKC9kb2MvY29kaW5nX3N0YW5kYXJkcy5tZCkKZGlmZiAtLWdpdCBhL2xpYi9ub2RldHMvdGVzdC9jbGllbnQudHMgYi9saWIvbm9kZXRzL3Rlc3QvY2xpZW50LnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmYTNjMjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZXRzL3Rlc3QvY2xpZW50LnRzCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworaW1wb3J0IGFzc2VydCA9IHJlcXVpcmUoImFzc2VydCIpOworaW1wb3J0IHRocmlmdCA9IHJlcXVpcmUoInRocmlmdCIpOworaW1wb3J0IFRocmlmdCA9IHRocmlmdC5UaHJpZnQ7CitpbXBvcnQgVGhyaWZ0VGVzdCA9IHJlcXVpcmUoIi4vZ2VuLW5vZGVqcy9UaHJpZnRUZXN0Iik7CitpbXBvcnQgdGVzdF9kcml2ZXIgPSByZXF1aXJlKCIuL3Rlc3RfZHJpdmVyIik7CitpbXBvcnQgVGhyaWZ0VGVzdERyaXZlciA9IHRlc3RfZHJpdmVyLlRocmlmdFRlc3REcml2ZXI7CitpbXBvcnQgVGhyaWZ0VGVzdERyaXZlclByb21pc2UgPSB0ZXN0X2RyaXZlci5UaHJpZnRUZXN0RHJpdmVyUHJvbWlzZTsKKworLy8gdmFyIHByb2dyYW0gPSByZXF1aXJlKCJjb21tYW5kZXIiKTsKK2ltcG9ydCAqIGFzIHByb2dyYW0gZnJvbSAiY29tbWFuZGVyIjsKKworcHJvZ3JhbQorICAub3B0aW9uKCItLXBvcnQgPHBvcnQ+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/Ci0KLSAgSWYgeW91IHdhbnQgdG8gd3JpdGUgeW91ciBvd24gc3ludGF4IGV4dGVuc2lvbnMsIGp1c3QgdGFrZSBhIGxvb2sgYXQgdGhlCi0gIGV4YW1wbGUgaW4gdGhlIGRpcmVjdG9yeSAiY2FtbHA0IjogaXQgaW1wbGVtZW50cyB0aGUgInJlcGVhdCAuLi4gdW50aWwiCi0gIGV4dGVuc2lvbiBhcyBkZXNjcmliZWQgaW4gdGhlIGNhbWxwNC10dXRvcmlhbC4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgICAgICAgICAgICAgIExpYnJhcnkgKFVuLSlJbnN0YWxsYXRpb24gU3VwcG9ydAotCi0gIE9DYW1sTWFrZWZpbGUgY29udGFpbnMgdHdvIHRhcmdldHMgdXNpbmcgIm9jYW1sZmluZCIgZm9yIHRoaXMgcHVycG9zZToKLQotICAgICogbGliaW5zdGFsbAotICAgICogbGlidW5pbnN0YWxsCi0KLSAgVGhlc2UgdHdvIHRhcmdldHMgcmVxdWlyZSB0aGUgZXhpc3RlbmNlIG9mIHRoZSB2YXJpYWJsZQotICAiTElCSU5TVEFMTF9GSUxFUyIsIHdoaWNoIHNob3VsZCBiZSBzZXQgdG8gYWxsIHRoZSBmaWxlcyB0aGF0IHlvdQotICB3YW50IHRvIGluc3RhbGwgaW4gdGhlIGxpYnJhcnkgZGlyZWN0b3J5ICh1c3VhbGx5ICUubWxpLCAlLmNtaSwgJS5jbWEsCi0gICUuY214YSwgJS5hIGFuZCBwb3NzaWJseSBmdXJ0aGVyIEMtbGlicmFyaWVzKS4gVGhlIHRhcmdldCAibGliaW5zdGFsbCIKLSAgaGFzIHRoZSBkZXBlbmRlbmN5ICJhbGwiIHRvIGZvcmNlIGNvbXBpbGF0aW9uIG9mIHRoZSBsaWJyYXJ5IHNvIG1ha2UKLSAgc3VyZSB5b3UgZGVmaW5lIHRhcmdldCAiYWxsIiBpbiB5b3VyIE1ha2VmaWxlIGFwcHJvcHJpYXRlbHkuCi0KLSAgVGhlIHRhcmdldHMgaW5mb3JtIHRoZSB1c2VyIGFib3V0IHRoZSBjb25maWd1cmVkIGluc3RhbGwgcGF0aCBhbmQgYXNrCi0gIGZvciBjb25maXJtYXRpb24gdG8gKHVuKWluc3RhbGwgdGhlcmUuIElmIHlvdSB3YW50IHRvIHVzZSB0aGVtLCBpdAotICBpcyBvZnRlbiBhIGdvb2QgaWRlYSB0byBqdXN0IGFsaWFzIHRoZW0gaW4geW91ciBNYWtlZmlsZSB0byAiaW5zdGFsbCIKLSAgYW5kICJ1bmluc3RhbGwiIHJlc3BlY3RpdmVseS4KLQotICBUd28gb3RoZXIgdGFyZ2V0cyBhbGxvdyBpbnN0YWxsYXRpb24gb2YgZmlsZXMgaW50byBhIHBhcnRpY3VsYXIKLSAgZGlyZWN0b3J5ICh3aXRob3V0IHVzaW5nIG9jYW1sZmluZCk6Ci0KLSAgICAqIHJhd2luc3RhbGwKLSAgICAqIHJhd3VuaW5zdGFsbAotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1aWxkaW5nIHRvcGxldmVscwotCi0gIFRoZXJlIGlzIGp1c3Qgb25lIHRhcmdldCBmb3IgdGhpczoKLQotICAgICogdG9wCi0KLSAgVGhlIGdlbmVyYXRlZCBmaWxlIGNhbiBiZSB1c2VkIGltbWVkaWF0ZWx5IGZvciBpbnRlcmFjdGl2ZSBzZXNzaW9ucyAtCi0gIGV2ZW4gd2l0aCBzY2FubmVycywgcGFyc2VycywgQy1maWxlcywgZXRjLiEKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0aW5nIGRvY3VtZW50YXRpb24KLQotICBUaGUgZm9sbG93aW5nIHRhcmdldHMgYXJlIHN1cHBvcnRlZDoKLQotICAgKiBodGRvYyAgICAgIC0gZ2VuZXJhdGVzIEhUTUwtZG9jdW1lbnRhdGlvbgotICAgKiBsYWRvYyAgICAgIC0gZ2VuZXJhdGVzIExhdGV4LWRvY3VtZW50YXRpb24KLSAgICogcHNkb2MgICAgICAtIGdlbmVyYXRlcyBQb3N0U2NyaXB0LWRvY3VtZW50YXRpb24KLSAgICogcGRmZG9jICAgICAtIGdlbmVyYXRlcyBQREYtZG9jdW1lbnRhdGlvbgotICAgKiBkb2MgICAgICAgIC0gZ2VuZXJhdGVzIGFsbCBzdXBwb3J0ZWQgZm9ybXMgb2YgZG9jdW1lbnRhdGlvbgotICAgKiBjbGVhbi1kb2MgIC0gZ2VuZXJhdGVzIGFsbCBzdXBwb3J0ZWQgZm9ybXMgb2YgZG9jdW1lbnRhdGlvbgotCi0gIEFsbCBvZiB0aGVtIGdlbmVyYXRlIGEgc3ViLWRpcmVjdG9yeSAiZG9jIi4gTW9yZSBwcmVjaXNlbHksIGZvciBIVE1MIGl0Ci0gIGlzICJkb2MvJChSRVNVTFQpL2h0bWwiIGFuZCBmb3IgTGF0ZXgsIFBvc3RTY3JpcHQgYW5kIFBERiB0aGUgZGlyZWN0b3J5Ci0gICJkb2MvJChSRVNVTFQpL2xhdGV4Ii4gU2VlIHRoZSBPQ2FtbGRvYy1tYW51YWwgZm9yIGRldGFpbHMgYW5kIHRoZQotICBvcHRpb25hbCB2YXJpYWJsZXMgYmVsb3cgZm9yIHNldHRpbmdzIHlvdSBjYW4gY29udHJvbC4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsaW5nIHN1YnByb2plY3RzCi0KLSAgWW91IGNhbiBoYXZlIHNldmVyYWwgdGFyZ2V0cyBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYW5kIG1hbmFnZSB0aGVtCi0gIGZyb20gd2l0aGluIGFuIHNpbmdsZSBNYWtlZmlsZS4KLQotICBHaXZlIGVhY2ggc3VicHJvamVjdCBhIG5hbWUsIGUuZy4gInAxIiwgInAyIiwgZXRjLiBUaGVuIHlvdSBleHBvcnQKLSAgc2V0dGluZ3Mgc3BlY2lmaWMgdG8gZWFjaCBwcm9qZWN0IGJ5IHVzaW5nIHZhcmlhYmxlcyBvZiB0aGUgZm9ybQotICAiUFJPSl9wMSIsICJQUk9KX3AyIiwgZXRjLiAgRS5nLjoKLQotICAgIGRlZmluZSBQUk9KX3AxCi0gICAgICBTT1VSQ0VTPSJmb28ubWwgbWFpbi5tbCIKLSAgICAgIFJFU1VMVD0icDEiCi0gICAgICBPQ0FNTEZMQUdTPSItdW5zYWZlIgotICAgIGVuZGVmCi0gICAgZXhwb3J0IFBST0pfcDEKLQotICAgIGRlZmluZSBQUk9KX3AyCi0gICAgICAuLi4KLSAgICBlbmRlZgotICAgIGV4cG9ydCBQUk9KX3AyCi0KLSAgWW91IG1heSBhbHNvIGV4cG9ydCBjb21tb24gc2V0dGluZ3MgdXNlZCBieSBhbGwgcHJvamVjdHMgZGlyZWN0bHksIGUuZy4KLSAgImV4cG9ydCBUSFJFQURTID0geSIuCi0KLSAgTm93IGl0IGlzIGEgZ29vZCBpZGVhIHRvIGRlZmluZSwgd2hpY2ggcHJvamVjdHMgc2hvdWxkIGJlIGFmZmVjdGVkIGJ5Ci0gIGNvbW1hbmRzIGJ5IGRlZmF1bHQuICBFLmcuOgotCi0gICAgaWZuZGVmIFNVQlBST0pTCi0gICAgICBleHBvcnQgU1VCUFJPSlMgPSBwMSBwMgotICAgIGVuZGlmCi0KLSAgVGhpcyB3aWxsIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUgYSBnaXZlbiB0YXJnZXQgZm9yIGFsbCB0aG9zZQotICBzdWJwcm9qZWN0cyBpZiB0aGlzIHZhcmlhYmxlIGhhcyBub3QgYmVlbiBkZWZpbmVkIGluIHRoZSBzaGVsbAotICBlbnZpcm9ubWVudCBvciBpbiB0aGUgY29tbWFuZCBsaW5lIG9mIHRoZSBtYWtlLWludm9jYXRpb24gYnkgdGhlIHVzZXIuCi0gIEUuZy4sICJtYWtlIGRjIiB3aWxsIGdlbmVyYXRlIGRlYnVnIGNvZGUgZm9yIGFsbCBzdWJwcm9qZWN0cy4KLQotICBUaGVuIHlvdSBuZWVkIHRvIGRlZmluZSBhIGRlZmF1bHQgYWN0aW9uIGZvciB5b3VyIHN1YnByb2plY3RzIGlmICJtYWtlIgotICBoYXMgYmVlbiBjYWxsZWQgd2l0aG91dCBhcmd1bWVudHM6Ci0KLSAgICBhbGw6IGJjCi0KLSAgVGhpcyB3aWxsIGJ1aWxkIGJ5dGUgY29kZSBieSBkZWZhdWx0IGZvciBhbGwgc3VicHJvamVjdHMuCi0KLSAgRmluYWxseSwgeW91J2xsIGhhdmUgdG8gZGVmaW5lIGEgY2F0Y2gtYWxsIHRhcmdldCB0aGF0IHVzZXMgdGhlIHRhcmdldAotICBwcm92aWRlZCBieSB0aGUgdXNlciBmb3IgYWxsIHN1YnByb2plY3RzLiBKdXN0IGFkZCAoYXNzdW1pbmcgdGhhdAotICBPQ0FNTE1BS0VGSUxFIGhhcyBiZWVuIGRlZmluZWQgYXBwcm9wcmlhdGVseSk6Ci0KLSAgICAlOgotICAgICAgICAgICAgQG1ha2UgLWYgJChPQ0FNTE1BS0VGSUxFKSBzdWJwcm9qcyBTVUJUQVJHRVQ9JEAKLQotICBTZWUgdGhlICJ0aHJlYWRzIi1kaXJlY3RvcnkgaW4gdGhlIGRpc3RyaWJ1dGlvbiBmb3IgYSBzaG9ydCBleGFtcGxlIQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICAgT3B0aW9uYWwgdmFyaWFibGVzIHRoYXQgbWF5IGJlIHBhc3NlZCB0byAiT0NhbWxNYWtlZmlsZSIKLQotICAqIExJQl9QQUNLX05BTUUgLSBwYWNrcyBhbGwgbW9kdWxlcyBvZiBhIGxpYnJhcnkgaW50byBhIG1vZHVsZSB3aG9zZQotICAgICAgICAgICAgICAgICAgICBuYW1lIGlzIGdpdmVuIGluIHZhcmlhYmxlICJMSUJfUEFDS19OQU1FIi4KLQotICAqIFJFU19DTElCX1NVRiAgLSB3aGVuIGJ1aWxkaW5nIGEgbGlicmFyeSB0aGF0IGNvbnRhaW5zIEMtc3R1YnMsIHRoaXMKLSAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUgY29udHJvbHMgdGhlIHN1ZmZpeCBhcHBlbmRlZCB0byB0aGUgbmFtZQotICAgICAgICAgICAgICAgICAgICBvZiB0aGUgQy1saWJyYXJ5IChkZWZhdWx0OiAiX3N0dWJzIikuCi0KLSAgKiBUSFJFQURTICAgICAgIC0gc2F5ICJUSFJFQURTID0geWVzIiBpZiB5b3UgbmVlZCB0aHJlYWQgc3VwcG9ydCBjb21waWxlZCBpbiwKLSAgICAgICAgICAgICAgICAgICAgb3RoZXJ3aXNlIGxlYXZlIGl0IGF3YXkuCi0KLSAgKiBWTVRIUkVBRFMgICAgIC0gc2F5ICJWTVRIUkVBRFMgPSB5ZXMiIGlmIHlvdSB3YW50IHRvIGZvcmNlIFZNLWxldmVsCi0gICAgICAgICAgICAgICAgICAgIHNjaGVkdWxpbmcgb2YgdGhyZWFkcyAoYnl0ZS1jb2RlIG9ubHkpLgotCi0gICogQU5OT1RBVEUgICAgICAtIHNheSAiQU5OT1RBVEUgPSB5ZXMiIHRvIGdlbmVyYXRlIHR5cGUgYW5ub3RhdGlvbiBmaWxlcwotICAgICAgICAgICAgICAgICAgICAoLmFubm90KSB0byBzdXBwb3J0IGRpc3BsYXlpbmcgb2YgdHlwZSBpbmZvcm1hdGlvbgotICAgICAgICAgICAgICAgICAgICBpbiBlZGl0b3JzLgotCi0gICogVVNFX0NBTUxQNCAgICAtIHNheSAiVVNFX0NBTUxQNCA9IHllcyIgaW4geW91ciAiTWFrZWZpbGUiIGlmIHlvdQotICAgICAgICAgICAgICAgICAgICB3YW50IHRvIGluY2x1ZGUgdGhlIGNhbWxwNCBkaXJlY3RvcnkgZHVyaW5nIHRoZQotICAgICAgICAgICAgICAgICAgICBidWlsZCBwcm9jZXNzLCBvdGhlcndpc2UgbGVhdmUgaXQgYXdheS4KLQotICAqIElOQ0RJUlMgICAgICAgLSBkaXJlY3RvcmllcyB0aGF0IHNob3VsZCBiZSBzZWFyY2hlZCBmb3IgIi5jbWkiLSBhbmQKLSAgICAgICAgICAgICAgICAgICAgIi5jbW8iLWZpbGVzLiAgWW91IG5lZWQgbm90IHdyaXRlICItSSAuLi4iIC0ganVzdCB0aGUKLSAgICAgICAgICAgICAgICAgICAgcGxhaW4gbmFtZXMuCi0gICogTElCRElSUyAgICAgICAtIGRpcmVjdG9yaWVzIHRoYXQgc2hvdWxkIGJlIHNlYXJjaGVkIGZvciBsaWJyYXJpZXMKLSAgICAgICAgICAgICAgICAgICAgQWxzbyBqdXN0IHB1dCB0aGUgcGxhaW4gcGF0aHMgaW50byB0aGlzIHZhcmlhYmxlCi0gICogRVhUTElCRElSUyAgICAtIFNhbWUgYXMgIkxJQkRJUlMiLCBidXQgcGF0aHMgaW4gdGhpcyB2YXJpYWJsZSBhcmUKLSAgICAgICAgICAgICAgICAgICAgYWxzbyBhZGRlZCB0byB0aGUgYmluYXJ5IHZpYSB0aGUgIi1SIi1mbGFnIHNvIHRoYXQKLSAgICAgICAgICAgICAgICAgICAgZHluYW1pYyBsaWJyYXJpZXMgaW4gbm9uLXN0YW5kYXJkIHBsYWNlcyBjYW4gYmUgZm91bmQuCi0gICogUkVTVUxUREVQUyAgICAtIFRhcmdldHMgb24gd2hpY2ggcmVzdWx0cyAoZXhlY3V0YWJsZXMgb3IgbGlicmFyaWVzKQotICAgICAgICAgICAgICAgICAgICBzaG91bGQgYWRkaXRpb25hbGx5IGRlcGVuZC4KLQotICAqIFBBQ0tTICAgICAgICAgLSBhZGRzIHBhY2thZ2VzIHVuZGVyIGNvbnRyb2wgb2YgImZpbmRsaWIiLgotCi0gICogUFJFRFMgICAgICAgICAtIHNwZWNpZmllcyAiZmluZGxpYiItcHJlZGljYXRlcy4KLQotICAqIExJQlMgICAgICAgICAgLSBPQ2FtbC1saWJyYXJpZXMgdGhhdCBzaG91bGQgYmUgbGlua2VkIChqdXN0IHBsYWluIG5hbWVzKS4KLSAgICAgICAgICAgICAgICAgICAgRS5nLiBpZiB5b3Ugd2FudCB0byBsaW5rIHRoZSBTdHItbGlicmFyeSwganVzdCB3cml0ZQotICAgICAgICAgICAgICAgICAgICAic3RyIiAod2l0aG91dCBxdW90ZXMpLgotICAgICAgICAgICAgICAgICAgICBUaGUgbmV3IE9DYW1sLWNvbXBpbGVyIGhhbmRsZXMgbGlicmFyaWVzIGluIHN1Y2gKLSAgICAgICAgICAgICAgICAgICAgYSB3YXkgdGhhdCB0aGV5ICJyZW1lbWJlciIgd2hldGhlciB0aGV5IGhhdmUgdG8KLSAgICAgICAgICAgICAgICAgICAgYmUgbGlua2VkIGFnYWluc3QgYSBDLWxpYnJhcnkgYW5kIGl0IGdldHMgbGlua2VkCi0gICAgICAgICAgICAgICAgICAgIGluIGF1dG9tYXRpY2FsbHkuCi0gICAgICAgICAgICAgICAgICAgIElmIHRoZXJlIGlzIGEgc2xhc2ggaW4gdGhlIGxpYnJhcnkgbmFtZSAoc3VjaCBhcwotICAgICAgICAgICAgICAgICAgICAiLi9zdHIiIG9yICJsaWIvZm9vIikgdGhlbiBtYWtlIGlzIHRvbGQgdGhhdCB0aGUKLSAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkIGZpbGVzIGRlcGVuZCBvbiB0aGUgbGlicmFyeS4gIFRoaXMKLSAgICAgICAgICAgICAgICAgICAgaGVscHMgdG8gZW5zdXJlIHRoYXQgY2hhbmdlcyB0byB5b3VyIGxpYnJhcmllcyBhcmUKLSAgICAgICAgICAgICAgICAgICAgdGFrZW4gaW50byBhY2NvdW50LCB3aGljaCBpcyBpbXBvcnRhbnQgaWYgeW91IGFyZQotICAgICAgICAgICAgICAgICAgICByZWdlbmVyYXRpbmcgeW91ciBsaWJyYXJpZXMgZnJlcXVlbnRseS4KLSAgKiBDTElCUyAgICAgICAgIC0gQy1saWJyYXJpZXMgdGhhdCBzaG91bGQgYmUgbGlua2VkIChqdXN0IHBsYWluIG5hbWVzKS4KLQotICAqIFBSRV9UQVJHRVRTICAgLSBzZXQgdGhpcyB0byBhIGxpc3Qgb2YgdGFyZ2V0IGZpbGVzIHRoYXQgeW91IHdhbnQKLSAgICAgICAgICAgICAgICAgICAgdG8gaGF2ZSBidWlsZHQgYmVmb3JlIGRlcGVuZGVuY3kgY2FsY3VsYXRpb24gYWN0dWFsbHkKLSAgICAgICAgICAgICAgICAgICAgdGFrZXMgcGxhY2UuIEUuZy4gdXNlIHRoaXMgdG8gYXV0b21hdGljYWxseSBjb21waWxlCi0gICAgICAgICAgICAgICAgICAgIG1vZHVsZXMgbmVlZGVkIGJ5IGNhbWxwNCwgd2hpY2ggaGF2ZSB0byBiZSBhdmFpbGFibGUKLSAgICAgICAgICAgICAgICAgICAgYmVmb3JlIG90aGVyIG1vZHVsZXMgY2FuIGJlIHBhcnNlZCBhdCBhbGwuCi0KLSAgICAgICAgICAgICAgICAgICAgKiogV0FSTklORyAqKjogdGhlIGZpbGVzIG1lbnRpb25lZCBpbiB0aGlzIHZhcmlhYmxlCi0gICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgcmVtb3ZlZCB3aGVuICJtYWtlIGNsZWFuIiBpcyBleGVjdXRlZCEKLQotICAqIExJQklOU1RBTExfRklMRVMgLSB0aGUgZmlsZXMgb2YgYSBsaWJyYXJ5IHRoYXQgc2hvdWxkIGJlIGluc3RhbGxlZAotICAgICAgICAgICAgICAgICAgICAgICB1c2luZyAiZmluZGxpYiIuIERlZmF1bHQ6Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAkKFJFU1VMVCkubWxpICQoUkVTVUxUKS5jbWkgJChSRVNVTFQpLmNtYQotICAgICAgICAgICAgICAgICAgICAgICAgICQoUkVTVUxUKS5jbXhhICQoUkVTVUxUKS5hIGxpYiQoUkVTVUxUKS5hCi0KLSAgKiBPQ0FNTF9MSUJfSU5TVEFMTCAtIHRhcmdldCBkaXJlY3RvcnkgZm9yICJyYXdpbnN0YWxsL3Jhd3VuaW5zdGFsbCIuCi0gICAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdDogJChPQ0FNTExJQlBBVEgpL2NvbnRyaWIpCi0KLSAgKiBET0NfRklMRVMgICAgIC0gbmFtZXMgb2YgZmlsZXMgZnJvbSB3aGljaCBkb2N1bWVudGF0aW9uIGlzIGdlbmVyYXRlZC4KLSAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQ6IGFsbCAubWxpLWZpbGVzIGluIHlvdXIgJChTT1VSQ0VTKSkuCi0KLSAgKiBET0NfRElSICAgICAgIC0gbmFtZSBvZiBkaXJlY3Rvcnkgd2hlcmUgZG9jdW1lbnRhdGlvbiBzaG91bGQgYmUgc3RvcmVkLgotCi0gICogT0NBTUxGTEFHUyAgICAtIGZsYWdzIHBhc3NlZCB0byB0aGUgY29tcGlsZXJzCi0gICogT0NBTUxCQ0ZMQUdTICAtIGZsYWdzIHBhc3NlZCB0byB0aGUgYnl0ZSBjb2RlIGNvbXBpbGVyIG9ubHkKLSAgKiBPQ0FNTE5DRkxBR1MgIC0gZmxhZ3MgcGFzc2VkIHRvIHRoZSBuYXRpdmUgY29kZSBjb21waWxlciBvbmx5Ci0KLSAgKiBPQ0FNTExERkxBR1MgIC0gZmxhZ3MgcGFzc2VkIHRvIHRoZSBPQ2FtbC1saW5rZXIKLSAgKiBPQ0FNTEJMREZMQUdTIC0gZmxhZ3MgcGFzc2VkIHRvIHRoZSBPQ2FtbC1saW5rZXIgd2hlbiBsaW5raW5nIGJ5dGUgY29kZQotICAqIE9DQU1MTkxERkxBR1MgLSBmbGFncyBwYXNzZWQgdG8gdGhlIE9DYW1sLWxpbmtlciB3aGVuIGxpbmtpbmcKLSAgICAgICAgICAgICAgICAgICAgbmF0aXZlIGNvZGUKLQotICAqIE9DQU1MTUtMSUJfRkxBR1MgLSBmbGFncyBwYXNzZWQgdG8gdGhlIE9DYW1sIGxpYnJhcnkgdG9vbAotCi0gICogT0NBTUxDUEZMQUdTICAtIHByb2ZpbGluZyBmbGFncyBwYXNzZWQgdG8gIm9jYW1sY3AiIChkZWZhdWx0OiAiYSIpCi0KLSAgKiBQUEZMQUdTICAgICAgIC0gYWRkaXRpb25hbCBmbGFncyBwYXNzZWQgdG8gdGhlIHByZXByb2Nlc3NvciAoZGVmYXVsdDogbm9uZSkKLQotICAqIExGTEFHUyAgICAgICAgLSBmbGFncyBwYXNzZWQgdG8gIm9jYW1sbGV4IgotICAqIFlGTEFHUyAgICAgICAgLSBmbGFncyBwYXNzZWQgdG8gIm9jYW1seWFjYyIKLSAgKiBJRExGTEFHUyAgICAgIC0gZmxhZ3MgcGFzc2VkIHRvICJjYW1saWRsIgotCi0gICogT0NBTUxET0NGTEFHUyAtIGZsYWdzIHBhc3NlZCB0byAib2NhbWxkb2MiCi0KLSAgKiBPQ0FNTEZJTkRfSU5TVEZMQUdTIC0gZmxhZ3MgcGFzc2VkIHRvICJvY2FtbGZpbmQiIGR1cmluZyBpbnN0YWxsYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQ6IG5vbmUpCi0KLSAgKiBEVklQU0ZMQUdTICAgIC0gZmxhZ3MgcGFzc2VkIHRvIGR2aXBzCi0gICAgICAgICAgICAgICAgICAgICh3aGVuIGdlbmVyYXRpbmcgZG9jdW1lbnRhdGlvbiBpbiBQb3N0U2NyaXB0KS4KLQotICAqIFNUQVRJQyAgICAgICAgLSBzZXQgdGhpcyB2YXJpYWJsZSBpZiB5b3Ugd2FudCB0byBmb3JjZSBjcmVhdGlvbgotICAgICAgICAgICAgICAgICAgICBvZiBzdGF0aWMgbGlicmFyaWVzCi0KLSAgKiBDQyAgICAgICAgICAgIC0gdGhlIEMtY29tcGlsZXIgdG8gYmUgdXNlZAotICAqIENYWCAgICAgICAgICAgLSB0aGUgQysrLWNvbXBpbGVyIHRvIGJlIHVzZWQKLQotICAqIENGTEFHUyAgICAgICAgLSBhZGRpdGlvbmFsIGZsYWdzIHBhc3NlZCB0byB0aGUgQy1jb21waWxlci4KLSAgICAgICAgICAgICAgICAgICAgVGhlIGZsYWcgIi1ETkFUSVZFX0NPREUiIHdpbGwgYmUgcGFzc2VkIGF1dG9tYXRpY2FsbHkKLSAgICAgICAgICAgICAgICAgICAgaWYgeW91IGNob29zZSB0byBidWlsZCBuYXRpdmUgY29kZS4gVGhpcyBhbGxvd3MgeW91Ci0gICAgICAgICAgICAgICAgICAgIHRvIGNvbXBpbGUgeW91ciBDLWZpbGVzIGNvbmRpdGlvbmFsbHkuIEJ1dCBwbGVhc2UKLSAgICAgICAgICAgICAgICAgICAgbm90ZTogWW91IHNob3VsZCBkbyBhICJtYWtlIGNsZWFuIiBvciByZW1vdmUgdGhlCi0gICAgICAgICAgICAgICAgICAgIG9iamVjdCBmaWxlcyBtYW51YWxseSBvciB0b3VjaCB0aGUgJS5jLWZpbGVzOgotICAgICAgICAgICAgICAgICAgICBvdGhlcndpc2UsIHRoZXkgbWF5IG5vdCBiZSBjb3JyZWN0bHkgcmVjb21waWxlZAotICAgICAgICAgICAgICAgICAgICBiZXR3ZWVuIGRpZmZlcmVudCBidWlsZHMuCi0KLSAgKiBDWFhGTEFHUyAgICAgIC0gYWRkaXRpb25hbCBmbGFncyBwYXNzZWQgdG8gdGhlIEMrKy1jb21waWxlci4KLQotICAqIENQUEZMQUdTICAgICAgLSBhZGRpdGlvbmFsIGZsYWdzIHBhc3NlZCB0byB0aGUgQy1wcmVwcm9jZXNzb3IuCi0KLSAgKiBDRlJBTUVXT1JLUyAgIC0gT2JqZWN0aXZlLUMgZnJhbWV3b3JrIHRvIHBhc3MgdG8gbGlua2VyIG9uIE1hY09TIFguCi0KLSAgKiBMREZMQUdTICAgICAgIC0gYWRkaXRpb25hbCBmbGFncyBwYXNzZWQgdG8gdGhlIEMtbGlua2VyCi0KLSAgKiBSUEFUSF9GTEFHICAgIC0gZmxhZyBwYXNzZWQgdGhyb3VnaCB0byB0aGUgQy1saW5rZXIgdG8gc2V0IGEgcGF0aCBmb3IKLSAgICAgICAgICAgICAgICAgICAgZHluYW1pYyBsaWJyYXJpZXMuICBNYXkgbmVlZCB0byBiZSBzZXQgYnkgdXNlciBvbgotICAgICAgICAgICAgICAgICAgICBleG90aWMgcGxhdGZvcm1zLiAgKGRlZmF1bHQ6ICItUiIpLgotCi0gICogRUxGX1JQQVRIX0ZMQUcgLSB0aGlzIGZsYWcgaXMgdXNlZCB0byBzZXQgdGhlIHJwYXRoIG9uIEVMRi1wbGF0Zm9ybXMuCi0gICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdDogIi1SIikKLQotICAqIEVMRl9SUEFUSCAgICAgLSBpZiB0aGlzIGZsYWcgaXMgInllcyIsIHRoZW4gdGhlIFJQQVRIX0ZMQUcgd2lsbCBiZQotICAgICAgICAgICAgICAgICAgICBwYXNzZWQgYnkgIi1XbCIgdG8gdGhlIGxpbmtlciBhcyBub3JtYWwgb24KLSAgICAgICAgICAgICAgICAgICAgRUxGLXBsYXRmb3Jtcy4KLQotICAqIE9DQU1MTElCUEFUSCAgLSBwYXRoIHRvIHRoZSBPQ2FtbC1zdGFuZGFyZC1saWJyYXJpZXMKLSAgICAgICAgICAgICAgICAgICAgKGZpcnN0IGRlZmF1bHQ6IGAkKE9DQU1MQykgLXdoZXJlYCkKLSAgICAgICAgICAgICAgICAgICAgKHNlY29uZCBkZWZhdWx0OiAiL3Vzci9sb2NhbC9saWIvb2NhbWwiKQotCi0gICogT0NBTUxfREVGQVVMVF9ESVJTIC0gYWRkaXRpb25hbCBwYXRoIGluIHdoaWNoIHRoZSB1c2VyIGNhbiBzdXBwbHkKLSAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0IGRpcmVjdG9yaWVzIHRvIGhpcyBvd24gY29sbGVjdGlvbiBvZgotICAgICAgICAgICAgICAgICAgICAgICAgIGxpYnJhcmllcy4gIFRoZSBpZGVhIGlzIHRvIHBhc3MgdGhpcyBhcyBhbiBlbnZpcm9ubWVudAotICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlIHNvIHRoYXQgdGhlIE1ha2VmaWxlcyBkbyBub3QgaGF2ZSB0byBjb250YWluCi0gICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBwYXRoIGFsbCB0aGUgdGltZS4KLQotICAqIE9DQU1MRklORCAgICAgLSBvY2FtbGZpbmQgZnJvbSBmaW5kbGliICAgICAgIChkZWZhdWx0OiAib2NhbWxmaW5kIikKLSAgKiBPQ0FNTEMgICAgICAgIC0gYnl0ZS1jb2RlIGNvbXBpbGVyICAgICAgICAgICAoZGVmYXVsdDogIm9jYW1sYyIpCi0gICogT0NBTUxPUFQgICAgICAtIG5hdGl2ZS1jb2RlIGNvbXBpbGVyICAgICAgICAgKGRlZmF1bHQ6ICJvY2FtbG9wdCIpCi0gICogT0NBTUxNS1RPUCAgICAtIHRvcC1sZXZlbCBjb21waWxlciAgICAgICAgICAgKGRlZmF1bHQ6ICJvY2FtbG1rdG9wIikKLSAgKiBPQ0FNTENQICAgICAgIC0gcHJvZmlsaW5nIGJ5dGUtY29kZSBjb21waWxlciAoZGVmYXVsdDogIm9jYW1sY3AiKQotICAqIE9DQU1MREVQICAgICAgLSBkZXBlbmRlbmN5IGdlbmVyYXRvciAgICAgICAgIChkZWZhdWx0OiAib2NhbWxkZXAiKQotICAqIE9DQU1MTEVYICAgICAgLSBzY2FubmVyIGdlbmVyYXRvciAgICAgICAgICAgIChkZWZhdWx0OiAib2NhbWxsZXgiKQotICAqIE9DQU1MWUFDQyAgICAgLSBwYXJzZXIgZ2VuZXJhdG9yICAgICAgICAgICAgIChkZWZhdWx0OiAib2NhbWx5YWNjIikKLSAgKiBPQ0FNTE1LTElCICAgIC0gdG9vbCB0byBjcmVhdGUgbGlicmFyaWVzICAgICAoZGVmYXVsdDogIm9jYW1sbWtsaWIiKQotICAqIENBTUxJREwgICAgICAgLSBJREwtY29kZSBnZW5lcmF0b3IgICAgICAgICAgIChkZWZhdWx0OiAiY2FtbGlkbCIpCi0gICogQ0FNTElETERMTCAgICAtIElETC11dGlsaXR5ICAgICAgICAgICAgICAgICAgKGRlZmF1bHQ6ICJjYW1saWRsZGxsIikKLSAgKiBDQU1MUDQgICAgICAgIC0gY2FtbHA0IHByZXByb2Nlc3NvciAgICAgICAgICAoZGVmYXVsdDogImNhbWxwNCIpCi0gICogT0NBTUxET0MgICAgICAtIE9DYW1sZG9jLWNvbW1hbmQgICAgICAgICAgICAgKGRlZmF1bHQ6ICJvY2FtbGRvYyIpCi0KLSAgKiBMQVRFWCAgICAgICAgIC0gTGF0ZXgtcHJvY2Vzc29yICAgICAgICAgICAgICAoZGVmYXVsdDogImxhdGV4IikKLSAgKiBEVklQUyAgICAgICAgIC0gZHZpcHMtY29tbWFuZCAgICAgICAgICAgICAgICAoZGVmYXVsdDogImR2aXBzIikKLSAgKiBQUzJQREYgICAgICAgIC0gUG9zdFNjcmlwdC10by1QREYgY29udmVydGVyICAoZGVmYXVsdDogInBzMnBkZiIpCi0KLSAgKiBDQU1FTEVPTl9SRVBPUlQgLSByZXBvcnQgdG9vbCBvZiBDYW1lbGVvbiAgKGRlZmF1bHQ6ICJyZXBvcnQiKQotICAqIENBTUVMRU9OX1JFUE9SVF9GTEFHUyAtIGZsYWdzIGZvciB0aGUgcmVwb3J0IHRvb2wgb2YgQ2FtZWxlb24KLQotICAqIENBTUVMRU9OX1pPR0dZIC0gem9nZ3kgdG9vbCBvZiBDYW1lbGVvbgotICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQ6ICJjYW1scDRvIHBhX3pvZy5jbWEgcHJfby5jbW8iKQotICAqIENBTUVMRU9OX1pPR0dZX0ZMQUdTIC0gZmxhZ3MgZm9yIHRoZSB6b2dneSB0b29sIG9mIENhbWVsZW9uCi0KLSAgKiBPQ0FNTF9HTEFERUNDIC0gR2xhZGUgY29tcGlsZXIgZm9yIE9DYW1sICAgICAoZGVmYXVsdDogImxhYmxnbGFkZWNjMiIpCi0gICogT0NBTUxfR0xBREVDQ19GTEFHUyAtIGZsYWdzIGZvciB0aGUgR2xhZGUgY29tcGlsZXIKLQotICAqIE9YUklETCAgICAgICAgLSBPWFJJREwtZ2VuZXJhdG9yICAoZGVmYXVsdDogIm94cmlkbCIpCi0KLSAgKiBOT0lETEhFQURFUiAgIC0gc2V0IHRvICJ5ZXMiIHRvIHByb2hpYml0ICJPQ2FtbE1ha2VmaWxlIiBmcm9tIHVzaW5nCi0gICAgICAgICAgICAgICAgICAgIHRoZSBkZWZhdWx0IGNhbWxpZGwtZmxhZyAiLWhlYWRlciIuCi0KLSAgKiBOT19DVVNUT00gICAgIC0gUHJldmVudCBsaW5raW5nIGluIGN1c3RvbSBtb2RlLgotCi0gICogUVVJRVQgICAgICAgICAtIHVuc2V0dGluZyB0aGlzIHZhcmlhYmxlIChlLmcuICJtYWtlIFFVSUVUPSIpCi0gICAgICAgICAgICAgICAgICAgIHdpbGwgcHJpbnQgYWxsIGV4ZWN1dGVkIGNvbW1hbmRzLCBpbmNsdWRpbmcKLSAgICAgICAgICAgICAgICAgICAgaW50ZXJtZWRpYXRlIG9uZXMuIFRoaXMgYWxsb3dzIG1vcmUgY29tZm9ydGFibGUKLSAgICAgICAgICAgICAgICAgICAgZGVidWdnaW5nIHdoZW4gdGhpbmdzIGdvIHdyb25nIGR1cmluZyBhIGJ1aWxkLgotCi0gICogUkVBTExZX1FVSUVUICAtIHdoZW4gc2V0IHRoaXMgZmxhZyB0dXJucyBvZmYgb3V0cHV0IGZyb20gc29tZSBjb21tYW5kcy4KLQotICAqIE9DQU1MTUFLRUZJTEUgLSBsb2NhdGlvbiBvZiAoPXBhdGggdG8pIHRoaXMgIk9DYW1sTWFrZWZpbGUiLgotICAgICAgICAgICAgICAgICAgICBCZWNhdXNlIGl0IGNhbGxlcyBpdHNlbGYgcmVjdXJzaXZlbHksIGl0IGhhcyB0bwotICAgICAgICAgICAgICAgICAgICBrbm93IHdoZXJlIGl0IGlzLiAoZGVmYXVsdDogIk9DYW1sTWFrZWZpbGUiID0KLSAgICAgICAgICAgICAgICAgICAgbG9jYWwgZGlyZWN0b3J5KQotCi0gICogQkNTVUZGSVggICAgICAtIFN1ZmZpeCBmb3IgYWxsIGJ5dGUtY29kZSBmaWxlcy4gRS5nLjoKLQotICAgICAgICAgICAgICAgICAgICAgIFJFU1VMVCAgID0gZm9vCi0gICAgICAgICAgICAgICAgICAgICAgQkNTVUZGSVggPSBfYmMKLQotICAgICAgICAgICAgICAgICAgICBUaGlzIHdpbGwgcHJvZHVjZSBieXRlLWNvZGUgZXhlY3V0YWJsZXMvbGlicmFyaWVzCi0gICAgICAgICAgICAgICAgICAgIHdpdGggYmFzZW5hbWUgImZvb19iYyIuCi0KLSAgKiBOQ1NVRkZJWCAgICAgIC0gU2ltaWxhciB0byAiQkNTVUZGSVgiLCBidXQgZm9yIG5hdGl2ZS1jb2RlIGZpbGVzLgotICAqIFRPUFNVRkZJWCAgICAgLSBTdWZmaXggYWRkZWQgdG8gdG9wbGV2ZWwgaW50ZXJwcmV0ZXJzIChkZWZhdWx0OiAiLnRvcCIpCi0KLSAgKiBTVUJQUk9KUyAgICAgIC0gdmFyaWFibGUgY29udGFpbmluZyB0aGUgbmFtZXMgb2Ygc3VicHJvamVjdHMgdG8gYmUKLSAgICAgICAgICAgICAgICAgICAgY29tcGlsZWQuCi0KLSAgKiBTVUJUQVJHRVQgICAgIC0gdGFyZ2V0IHRvIGJlIGJ1aWx0IGZvciBhbGwgcHJvamVjdHMgaW4gdmFyaWFibGUKLSAgICAgICAgICAgICAgICAgICAgU1VCUFJPSlMuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsIHZhcmlhYmxlcyBmb3IgV2luZG93cyB1c2VycwotCi0gICogTUlOR1cgICAgICAgICAtIHZhcmlhYmxlIHRvIGRldGVjdCB0aGUgTUlOR1ctZW52aXJvbm1lbnQKLSAgKiBNU1ZDICAgICAgICAgIC0gdmFyaWFibGUgdG8gZGV0ZWN0IHRoZSBNU1ZDLWNvbXBpbGVyCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1VcC10by1kYXRlIGluZm9ybWF0aW9uIChuZXdlc3QgcmVsZWFzZSBvZiBkaXN0cmlidXRpb24pIGNhbiBhbHdheXMgYmUKLWZvdW5kIGF0OgotCi0gIGh0dHA6Ly93d3cub2NhbWwuaW5mby9ob21lL29jYW1sX3NvdXJjZXMuaHRtbAotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotRW5qb3khCi0KLU5ldyBZb3JrLCAyMDA3LTA0LTIyCi1NYXJrdXMgTW90dGwKLQotZS1tYWlsOiBtYXJrdXMubW90dGxAZ21haWwuY29tCi1XV1c6ICAgIGh0dHA6Ly93d3cub2NhbWwuaW5mbwpkaWZmIC0tZ2l0IGEvbGliL29jYW1sL19vYXNpcyBiL2xpYi9vY2FtbC9fb2FzaXMKaW5kZXggYTliYTJjYy4uNWFkOTBkZiAxMDA2NDQKLS0tIGEvbGliL29jYW1sL19vYXNpcworKysgYi9saWIvb2NhbWwvX29hc2lzCkBAIC0xLDUgKzEsNSBAQAogTmFtZTogbGlidGhyaWZ0LW9jYW1sCi1WZXJzaW9uOiAwLjkuMgorVmVyc2lvbjogMS4wLjAKIE9BU0lTRm9ybWF0OiAwLjMKIFN5bm9wc2lzOiBPQ2FtbCBiaW5kaW5ncyBmb3IgdGhlIEFwYWNoZSBUaHJpZnQgUlBDIHN5c3RlbQogQXV0aG9yczogQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzIDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+CmRpZmYgLS1naXQgYS9saWIvb2NhbWwvY29kaW5nX3N0YW5kYXJkcy5tZCBiL2xpYi9vY2FtbC9jb2Rpbmdfc3RhbmRhcmRzLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMDM5MGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb2NhbWwvY29kaW5nX3N0YW5kYXJkcy5tZApAQCAtMCwwICsxIEBACitQbGVhc2UgZm9sbG93IFtHZW5lcmFsIENvZGluZyBTdGFuZGFyZHNdKC9kb2MvY29kaW5nX3N0YW5kYXJkcy5tZCkKZGlmZiAtLWdpdCBhL2xpYi9vY2FtbC9kZXNjciBiL2xpYi9vY2FtbC9kZXNjcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDE3NDlkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29jYW1sL2Rlc2NyCkBAIC0wLDAgKzEgQEAKK09DYW1sIGJpbmRpbmdzIGZvciB0aGUgQXBhY2hlIFRocmlmdCBSUEMgc3lzdGVtCmRpZmYgLS1naXQgYS9saWIvb2NhbWwvb3BhbSBiL2xpYi9vY2FtbC9vcGFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkYmMzZDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb2NhbWwvb3BhbQpAQCAtMCwwICsxLDggQEAKK29wYW0tdmVyc2lvbjogIjEiCittYWludGFpbmVyOiAiWFhYKEZJTEwgTUUgSU4gV0lUSCBFTUFJTCkiCitidWlsZDogWworICBbbWFrZV0KKyAgW21ha2UgImluc3RhbGwiXQorXQorcmVtb3ZlOiBbWyJvY2FtbGZpbmQiICJyZW1vdmUiICJ0aHJpZnQiXV0KK2RlcGVuZHM6IFsib2NhbWxmaW5kIl0KZGlmZiAtLWdpdCBhL2xpYi9vY2FtbC91cmwgYi9saWIvb2NhbWwvdXJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlNGQ2MDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb2NhbWwvdXJsCkBAIC0wLDAgKzEsMiBAQAorYXJjaGl2ZTogIlhYWChGSUxMIE1FIElOIFdJVEggVVJMKSIKK2NoZWNrc3VtOiAiWFhYKEZJTEwgTUUgSU4gV0lUSCBNRDUpIgpkaWZmIC0tZ2l0IGEvbGliL3BlcmwvTUFOSUZFU1QuU0tJUCBiL2xpYi9wZXJsL01BTklGRVNULlNLSVAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk2M2I0MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9wZXJsL01BTklGRVNULlNLSVAKQEAgLTAsMCArMSwxMyBAQAorYmxpYi8uKiQKK2J1aWxkLWNwYW4tZGlzdC5zaAorRml4dXBEaXN0LnBsCitNQU5JRkVTVC5iYWsKK01BTklGRVNULlNLSVAKK01ZTUVUQS5qc29uCitNYWtlZmlsZQorTWFrZWZpbGUuYW0KK01ha2VmaWxlLmluCitwbV90b19ibGliCit0ZXN0L01ha2VmaWxlLmFtCit0ZXN0L01ha2VmaWxlLmluCit0b29scy9GaXh1cERpc3QucGwKZGlmZiAtLWdpdCBhL2xpYi9wZXJsL01ha2VmaWxlLlBMIGIvbGliL3BlcmwvTWFrZWZpbGUuUEwKaW5kZXggY2VjYTg2Zi4uYmRlYWFkMiAxMDA2NDQKLS0tIGEvbGliL3BlcmwvTWFrZWZpbGUuUEwKKysrIGIvbGliL3BlcmwvTWFrZWZpbGUuUEwKQEAgLTE3LDEzICsxNywyMCBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAordXNlIDUuMTAuMDsKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7CisKIHVzZSBFeHRVdGlsczo6TWFrZU1ha2VyOwotV3JpdGVNYWtlZmlsZSggJ05BTUUnID0+ICdUaHJpZnQnLAotICAgICAgICAgICAgICAgJ1ZFUlNJT05fRlJPTScgPT4gJ2xpYi9UaHJpZnQucG0nLAotICAgICAgICAgICAgICAgJ1BSRVJFUV9QTScgICAgICAgICAgICAgID0+IHsKLSAgICAgICAgICAgICAgICAgICAnQml0OjpWZWN0b3InID0+IDAsCisKK1dyaXRlTWFrZWZpbGUoIEFCU1RSQUNUID0+ICdBcGFjaGUgVGhyaWZ0IGlzIGEgc29mdHdhcmUgZnJhbWV3b3JrIGZvciBzY2FsYWJsZSBjcm9zcy1sYW5ndWFnZSBzZXJ2aWNlcyBkZXZlbG9wbWVudC4nLAorICAgICAgICAgICAgICAgQVVUSE9SID0+ICdBcGFjaGUgVGhyaWZ0IDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+JywKKyAgICAgICAgICAgICAgIExJQ0VOU0UgPT4gJ2FwYWNoZV8yXzAnLAorICAgICAgICAgICAgICAgTUlOX1BFUkxfVkVSU0lPTiA9PiAnNS4wMTAwMDAnLAorICAgICAgICAgICAgICAgTkFNRSA9PiAnVGhyaWZ0JywKKyAgICAgICAgICAgICAgIE5FRURTX0xJTktJTkcgPT4gMCwKKyAgICAgICAgICAgICAgIFBSRVJFUV9QTSA9PiB7CisgICAgICAgICAgICAgICAgICAgJ0JpdDo6VmVjdG9yJyAgICAgPT4gMCwKICAgICAgICAgICAgICAgICAgICAnQ2xhc3M6OkFjY2Vzc29yJyA9PiAwCiAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgKCRdID49IDUuMDA1ID8KLSAoICAgICAgICAgICAgICAgIEFVVEhPUiAgICAgPT4gJ0FwYWNoZSBUaHJpZnQgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4nKSA6ICgpKSwKLSAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICBWRVJTSU9OX0ZST00gPT4gJ2xpYi9UaHJpZnQucG0nICk7CmRpZmYgLS1naXQgYS9saWIvcGVybC9NYWtlZmlsZS5hbSBiL2xpYi9wZXJsL01ha2VmaWxlLmFtCmluZGV4IDA2N2VkNjkuLmZhMGYxNmIgMTAwNjQ0Ci0tLSBhL2xpYi9wZXJsL01ha2VmaWxlLmFtCisrKyBiL2xpYi9wZXJsL01ha2VmaWxlLmFtCkBAIC0yMywzNCArMjMsODYgQEAKIAkkKFBFUkwpIE1ha2VmaWxlLlBMIE1BS0VGSUxFPU1ha2VmaWxlLXBlcmwubWsgSU5TVEFMTERJUlM9JChJTlNUQUxMRElSUykgSU5TVEFMTF9CQVNFPSQoUEVSTF9QUkVGSVgpCiAKIGFsbC1sb2NhbDogTWFrZWZpbGUtcGVybC5tawotCSQoTUFLRSkgLWYgTWFrZWZpbGUtcGVybC5taworCSQoTUFLRSkgLWYgJDwKIAlmaW5kIGJsaWIgLW5hbWUgJ01ha2VmaWxlKicgLWV4ZWMgcm0gLWYge30gXDsKIAotY2hlY2stbG9jYWw6Ci0JJChQRVJMKSAtSWJsaWIvbGliIC1JQGFic19zcmNkaXJAIC1JQGJ1aWxkZGlyQC90ZXN0L2dlbi1wZXJsIFwKLQkJQGFic19zcmNkaXJAL3Rlc3QucGwgQGFic19zcmNkaXJAL3Rlc3QvKi50Ci0KIGluc3RhbGwtZXhlYy1sb2NhbDogTWFrZWZpbGUtcGVybC5tawotCSQoTUFLRSkgLWYgTWFrZWZpbGUtcGVybC5tayBpbnN0YWxsIERFU1RESVI9JChERVNURElSKS8KKwkkKE1BS0UpIC1mICQ8IGluc3RhbGwgREVTVERJUj0kKERFU1RESVIpLwogCiBjbGVhbi1sb2NhbDoKIAlpZiB0ZXN0IC1mIE1ha2VmaWxlLXBlcmwubWsgOyB0aGVuIFwKIAkJJChNQUtFKSAtZiBNYWtlZmlsZS1wZXJsLm1rIGNsZWFuIDsgXAogCWZpCi0Jcm0gLWYgTWFrZWZpbGUtcGVybC5tay5vbGQKKwkkKFJNKSBNYWtlZmlsZS1wZXJsLm1rLm9sZAorCSQoUk0pIC1yIGdlbi1wZXJsIGdlbi1wZXJsMgogCiBFWFRSQV9ESVNUID0gXAorCWNvZGluZ19zdGFuZGFyZHMubWQgXAorCWJ1aWxkLWNwYW4tZGlzdC5zaCBcCiAJTWFrZWZpbGUuUEwgXAogCXRlc3QucGwgXAogCWxpYi9UaHJpZnQucG0gXAogCWxpYi9UaHJpZnQucG0gXAogCWxpYi9UaHJpZnQvQmluYXJ5UHJvdG9jb2wucG0gXAogCWxpYi9UaHJpZnQvQnVmZmVyZWRUcmFuc3BvcnQucG0gXAorCWxpYi9UaHJpZnQvRXhjZXB0aW9uLnBtIFwKIAlsaWIvVGhyaWZ0L0ZyYW1lZFRyYW5zcG9ydC5wbSBcCiAJbGliL1RocmlmdC9IdHRwQ2xpZW50LnBtIFwKIAlsaWIvVGhyaWZ0L01lbW9yeUJ1ZmZlci5wbSBcCisJbGliL1RocmlmdC9NZXNzYWdlVHlwZS5wbSBcCisJbGliL1RocmlmdC9NdWx0aXBsZXhlZFByb2Nlc3Nvci5wbSBcCisJbGliL1RocmlmdC9NdWx0aXBsZXhlZFByb3RvY29sLnBtIFwKIAlsaWIvVGhyaWZ0L1Byb3RvY29sLnBtIFwKKwlsaWIvVGhyaWZ0L1Byb3RvY29sRGVjb3JhdG9yLnBtIFwKIAlsaWIvVGhyaWZ0L1NlcnZlci5wbSBcCisJbGliL1RocmlmdC9TZXJ2ZXJTb2NrZXQucG0gXAogCWxpYi9UaHJpZnQvU29ja2V0LnBtIFwKKwlsaWIvVGhyaWZ0L1NTTFNvY2tldC5wbSBcCisJbGliL1RocmlmdC9TU0xTZXJ2ZXJTb2NrZXQucG0gXAorCWxpYi9UaHJpZnQvVW5peFNlcnZlclNvY2tldC5wbSBcCisJbGliL1RocmlmdC9Vbml4U29ja2V0LnBtIFwKKwlsaWIvVGhyaWZ0L1R5cGUucG0gXAogCWxpYi9UaHJpZnQvVHJhbnNwb3J0LnBtIFwKIAlSRUFETUUubWQKKworVEhSSUZUID0gQHRvcF9idWlsZGRpckAvY29tcGlsZXIvY3BwL3RocmlmdAorVEhSSUZUX0lGID0gQHRvcF9zcmNkaXJAL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKK05BTUVfQkVOQ0hNQVJLU0VSVklDRSA9ICBAdG9wX3NyY2RpckAvbGliL3JiL2JlbmNobWFyay9CZW5jaG1hcmsudGhyaWZ0CitOQU1FX0FHR1IgPSBAdG9wX3NyY2RpckAvY29udHJpYi9hc3luYy10ZXN0L2FnZ3IudGhyaWZ0CisKK1RIUklGVFRFU1RfR0VOID0gXAorCWdlbi1wZXJsL1RocmlmdFRlc3QvQ29uc3RhbnRzLnBtIFwKKwlnZW4tcGVybC9UaHJpZnRUZXN0L1NlY29uZFNlcnZpY2UucG0gXAorCWdlbi1wZXJsL1RocmlmdFRlc3QvVGhyaWZ0VGVzdC5wbSBcCisJZ2VuLXBlcmwvVGhyaWZ0VGVzdC9UeXBlcy5wbQorCitCRU5DSE1BUktfR0VOID0gXAorCWdlbi1wZXJsL0JlbmNobWFya1NlcnZpY2UucG0gXAorCWdlbi1wZXJsL0NvbnN0YW50cy5wbSBcCisJZ2VuLXBlcmwvVHlwZXMucG0KKworQUdHUl9HRU4gPSBcCisJZ2VuLXBlcmwyL0FnZ3IucG0gXAorCWdlbi1wZXJsMi9Db25zdGFudHMucG0gXAorCWdlbi1wZXJsMi9UeXBlcy5wbQorCitQRVJMX0dFTiA9IFwKKwkkKFRIUklGVFRFU1RfR0VOKSBcCisJJChCRU5DSE1BUktfR0VOKSBcCisJJChBR0dSX0dFTikKKworQlVJTFRfU09VUkNFUyA9ICQoUEVSTF9HRU4pCisKK2NoZWNrLWxvY2FsOiAkKFBFUkxfR0VOKQorCSQoUEVSTCkgLUlibGliL2xpYiAtSUBhYnNfc3JjZGlyQCAtSUBidWlsZGRpckAvZ2VuLXBlcmwyIC1JQGJ1aWxkZGlyQC9nZW4tcGVybCBcCisJCUBhYnNfc3JjZGlyQC90ZXN0LnBsIEBhYnNfc3JjZGlyQC90ZXN0LyoudAorCiskKFRIUklGVFRFU1RfR0VOKTogJChUSFJJRlRfSUYpICQoVEhSSUZUKQorCSQoVEhSSUZUKSAtLWdlbiBwZXJsICQ8CisKKyQoQkVOQ0hNQVJLX0dFTik6ICQoTkFNRV9CRU5DSE1BUktTRVJWSUNFKSAkKFRIUklGVCkKKwkkKFRIUklGVCkgLS1nZW4gcGVybCAkPAorCiskKEFHR1JfR0VOKTogJChOQU1FX0FHR1IpICQoVEhSSUZUKQorCSQoTUtESVJfUCkgZ2VuLXBlcmwyCisJJChUSFJJRlQpIC1vdXQgZ2VuLXBlcmwyIC0tZ2VuIHBlcmwgJDwKZGlmZiAtLWdpdCBhL2xpYi9wZXJsL1JFQURNRS5tZCBiL2xpYi9wZXJsL1JFQURNRS5tZAppbmRleCA2OTE0ODhiLi5iZDFlNWIyIDEwMDY0NAotLS0gYS9saWIvcGVybC9SRUFETUUubWQKKysrIGIvbGliL3BlcmwvUkVBRE1FLm1kCkBAIC0xLDcgKzEsMTMgQEAKIFRocmlmdCBQZXJsIFNvZnR3YXJlIExpYnJhcnkKIAotTGljZW5zZQotPT09PT09PQorIyBTdW1tYXJ5CisKK0FwYWNoZSBUaHJpZnQgaXMgYSBzb2Z0d2FyZSBmcmFtZXdvcmsgZm9yIHNjYWxhYmxlIGNyb3NzLWxhbmd1YWdlIHNlcnZpY2VzIGRldmVsb3BtZW50LgorSXQgY29tYmluZXMgYSBzb2Z0d2FyZSBzdGFjayB3aXRoIGEgY29kZSBnZW5lcmF0aW9uIGVuZ2luZSB0byBidWlsZCBzZXJ2aWNlcyB0aGF0IHdvcmsKK2VmZmljaWVudGx5IGFuZCBzZWFtbGVzc2x5IGJldHdlZW4gbWFueSBwcm9ncmFtbWluZyBsYW5ndWFnZXMuICBBIGxhbmd1YWdlLW5ldXRyYWwgSURMCitpcyB1c2VkIHRvIGdlbmVyYXRlIGZ1bmN0aW9uaW5nIGNsaWVudCBsaWJyYXJpZXMgYW5kIHNlcnZlci1zaWRlIGhhbmRsaW5nIGZyYW1ld29ya3MuCisKKyMgTGljZW5zZQogCiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQpAQCAtMjAsMjIgKzI2LDk5IEBACiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCiB1bmRlciB0aGUgTGljZW5zZS4KIAotVXNpbmcgVGhyaWZ0IHdpdGggUGVybAotPT09PT09PT09PT09PT09PT09PT09CisjIEZvciBNb3JlIEluZm9ybWF0aW9uCiAKLVRocmlmdCByZXF1aXJlcyBQZXJsID49IDUuNi4wCitTZWUgdGhlIFtBcGFjaGUgVGhyaWZ0IFdlYiBTaXRlXShodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcvKSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KIAotRXhjZXB0aW9ucyBhcmUgdGhyb3duIHdpdGggZGllIHNvIGJlIHN1cmUgdG8gd3JhcCBldmFse30gc3RhdG1lbnRzCi1hcm91bmQgYW55IGNvZGUgdGhhdCBjb250YWlucyBleGNlcHRpb25zLgorIyBVc2luZyBUaHJpZnQgd2l0aCBQZXJsCiAKLVRoZSA2NGJpdCBJbnRlZ2VycyB3b3JrIG9ubHkgdXB0byAyXjQyIG9uIG15IG1hY2hpbmUgOi0/Ci1NYXRoOjpCaWdJbnQgaXMgcHJvYmFibHkgbmVlZGVkLgorVGhyaWZ0IHJlcXVpcmVzIFBlcmwgPj0gNS4xMC4wCiAKLVBsZWFzZSBzZWUgdHV0b3JhbCBhbmQgdGVzdCBkaXJzIGZvciBleGFtcGxlcy4uLgorVW5leHBlY3RlZCBleGNlcHRpb25zIGluIGEgc2VydmljZSBoYW5kbGVyIGFyZSBjb252ZXJ0ZWQgdG8KK1RBcHBsaWNhdGlvbkV4Y2VwdGlvbiB3aXRoIHR5cGUgSU5URVJOQUwgRVJST1IgYW5kIHRoZSBzdHJpbmcKK29mIHRoZSBleGNlcHRpb24gaXMgZGVsaXZlcmVkIGFzIHRoZSBtZXNzYWdlLgogCi1EZXBlbmRlbmNpZXMKLT09PT09PT09PT09PQorT24gdGhlIGNsaWVudCBzaWRlLCBleGNlcHRpb25zIGFyZSB0aHJvd24gd2l0aCBkaWUsIHNvIGJlIHN1cmUKK3RvIHdyYXAgZXZhbHt9IHN0YXRtZW50cyBhcm91bmQgYW55IGNvZGUgdGhhdCBjb250YWlucyBleGNlcHRpb25zLgogCi1CaXQ6OlZlY3RvciAgICAgLSBjb21lcyB3aXRoIG1vZGVybiBwZXJsIGluc3RhbGxhdGlvbnMuCi1DbGFzczo6QWNjZXNzb3IKK1BsZWFzZSBzZWUgdHV0b3JhbCBhbmQgdGVzdCBkaXJzIGZvciBleGFtcGxlcy4KKworVGhlIFBlcmwgRm9ya2luZ1NlcnZlciBpZ25vcmVzIFNJR0NITEQgYWxsb3dpbmcgdGhlIGZvcmtzIHRvIGJlCityZWFwZWQgYnkgdGhlIG9wZXJhdGluZyBzeXN0ZW0gbmF0dXJhbGx5IHdoZW4gdGhleSBleGl0LiAgVGhpcyBtZWFucworb25lIGNhbm5vdCB1c2UgYSBjdXN0b20gU0lHQ0hMRCBoYW5kbGVyIGluIHRoZSBjb25zdW1pbmcgcGVybAoraW1wbGVtZW50YXRpb24gdGhhdCBjYWxscyBzZXJ2ZSgpLiAgSXQgaXMgYWNjZXB0YWJsZSB0byB1c2UKK2EgY3VzdG9tIFNJR0NITEQgaGFuZGxlciB3aXRoaW4gYSB0aHJpZnQgaGFuZGxlciBpbXBsZW1lbnRhdGlvbgorYXMgdGhlIEZvcmtpbmdTZXJ2ZXIgcmVzZXRzIHRoZSBmb3JrZWQgY2hpbGQgcHJvY2VzcyB0byB1c2UKK2RlZmF1bHQgc2lnbmFsIGhhbmRsaW5nLgorCisjIERlcGVuZGVuY2llcworCitUaGUgZm9sbG93aW5nIG1vZHVsZXMgYXJlIG5vdCBwcm92aWRlZCBieSBQZXJsIDUuMTAuMCBidXQgYXJlIHJlcXVpcmVkCit0byB1c2UgVGhyaWZ0LgorCisjIyBSdW50aW1lCisKKyAgKiBCaXQ6OlZlY3RvcgorICAqIENsYXNzOjpBY2Nlc3NvcgorCisjIyMgSHR0cENsaWVudCBUcmFuc3BvcnQKKworVGhlc2UgYXJlIG9ubHkgcmVxdWlyZWQgaWYgdXNpbmcgVGhyaWZ0OjpIdHRwQ2xpZW50OgorCisgICogSFRUUDo6UmVxdWVzdAorICAqIElPOjpTdHJpbmcKKyAgKiBMV1A6OlVzZXJBZ2VudAorCisjIyMgU1NML1RMUworCitUaGVzZSBhcmUgb25seSByZXF1aXJlZCBpZiB1c2luZyBUaHJpZnQ6OlNTTFNvY2tldCBvciBUaHJpZnQ6OlNTTFNlcnZlclNvY2tldDoKKworICAqIElPOjpTb2NrZXQ6OlNTTAorCisjIEJyZWFraW5nIENoYW5nZXMKKworIyMgMC4xMC4wCisKK1RoZSBzb2NrZXQgY2xhc3NlcyB3ZXJlIHJlZmFjdG9yZWQgaW4gMC4xMC4wIHNvIHRoYXQgdGhlcmUgaXMgb25lIHBhY2thZ2UgcGVyCitmaWxlLiAgVGhpcyBtZWFucyBgdXNlIFNvY2tldDtgIG5vIGxvbmdlciBkZWZpbmVzIFNTTFNvY2tldC4gIFlvdSBjYW4gdXNlIHRoaXMKK3RlY2huaXF1ZSB0byBtYWtlIHlvdXIgYXBwbGljYXRpb24gcnVuIGFnYWluc3QgMC4xMC4wIGFzIHdlbGwgYXMgZWFybGllciB2ZXJzaW9uczoKKworYGV2YWwgeyByZXF1aXJlIFRocmlmdDo6U1NMU29ja2V0OyB9IG9yIGRvIHsgcmVxdWlyZSBUaHJpZnQ6OlNvY2tldDsgfWAKKworIyMgMC4xMS4wCisKKyAgKiBOYW1lc3BhY2VzIG9mIHBhY2thZ2VzIHRoYXQgd2VyZSBub3Qgc2NvcGVkIHdpdGhpbiBUaHJpZnQgaGF2ZSBiZWVuIGZpeGVkLgorICAqKiBUQXBwbGljYXRpb25FeGNlcHRpb24gaXMgbm93IFRocmlmdDo6VEFwcGxpY2F0aW9uRXhjZXB0aW9uCisgICoqIFRFeGNlcHRpb24gaXMgbm93IFRocmlmdDo6VEV4Y2VwdGlvbgorICAqKiBUTWVzc2FnZVR5cGUgaXMgbm93IFRocmlmdDo6VE1lc3NhZ2VUeXBlCisgICoqIFRQcm90b2NvbEV4Y2VwdGlvbiBpcyBub3cgVGhyaWZ0OjpUUHJvdG9jb2xFeGNlcHRpb24KKyAgKiogVFByb3RvY29sRmFjdG9yeSBpcyBub3cgVGhyaWZ0OjpUUHJvdG9jb2xGYWN0b3J5CisgICoqIFRUcmFuc3BvcnRFeGNlcHRpb24gaXMgbm93IFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbgorICAqKiBUVHlwZSBpcyBub3cgVGhyaWZ0OjpUVHlwZQorCitJZiB5b3UgbmVlZCBhIHNpbmdsZSB2ZXJzaW9uIG9mIHlvdXIgY29kZSB0byB3b3JrIHdpdGggYm90aCBvbGRlciBhbmQgbmV3ZXIgdGhyaWZ0CituYW1lc3BhY2UgY2hhbmdlcywgeW91IGNhbiBtYWtlIHRoZSBuZXcsIGNvcnJlY3QgbmFtZXNwYWNlcyBiZWhhdmUgbGlrZSB0aGUgb2xkIG9uZXMKK2luIHlvdXIgZmlsZXMgd2l0aCB0aGlzIHRlY2huaXF1ZSB0byBjcmVhdGUgYW4gYWxpYXMsIHdoaWNoIHdpbGwgYWxsb3cgeW91IGNvZGUgdG8KK3J1biBhZ2FpbnN0IGVpdGhlciB2ZXJzaW9uIG9mIHRoZSBwZXJsIHJ1bnRpbWUgZm9yIHRocmlmdDoKKworYEJFR0lOIHsqVFR5cGU6OiA9ICpUaHJpZnQ6OlRUeXBlOjp9YAorCisgICogUGFja2FnZXMgZm91bmQgaW4gVGhyaWZ0LnBtIHdlcmUgbW92ZWQgaW50byB0aGUgVGhyaWZ0LyBkaXJlY3RvcnkgaW4gc2VwYXJhdGUgZmlsZXM6CisgICoqIFRocmlmdDo6VEFwcGxpY2F0aW9uRXhjZXB0aW9uIGlzIG5vdyBpbiBUaHJpZnQvRXhjZXB0aW9uLnBtCisgICoqIFRocmlmdDo6VEV4Y2VwdGlvbiBpcyBub3cgaW4gVGhyaWZ0L0V4Y2VwdGlvbi5wbQorICAqKiBUaHJpZnQ6OlRNZXNzYWdlVHlwZSBpcyBub3cgaW4gVGhyaWZ0L01lc3NhZ2VUeXBlLnBtCisgICoqIFRocmlmdDo6VFR5cGUgaXMgbm93IGluIFRocmlmdC9UeXBlLnBtCisKK0lmIHlvdSBuZWVkIHRvIG1vZGlmeSB5b3VyIGNvZGUgdG8gd29yayBhZ2FpbnN0IGJvdGggb2xkZXIgb3IgbmV3ZXIgdGhyaWZ0IHZlcnNpb25zLAoreW91IGNhbiBkZWFsIHdpdGggdGhlc2UgY2hhbmdlcyBpbiBhIGJhY2t3YXJkcyBjb21wYXRpYmxlIHdheSBpbiB5b3VyIHByb2plY3RzIHVzaW5nIGV2YWw6CisKK2BldmFsICB7IHJlcXVpcmUgVGhyaWZ0OjpFeGNlcHRpb247IHJlcXVpcmUgVGhyaWZ0OjpNZXNzYWdlVHlwZTsgcmVxdWlyZSBUaHJpZnQ6OlR5cGU7IH0KKyBvciBkbyB7IHJlcXVpcmUgVGhyaWZ0OyB9YAorCisjIERlcHJlY2F0aW9ucworCisjIyAwLjExLjAKKworVGhyaWZ0OjpIdHRwQ2xpZW50IHNldFJlY3ZUaW1lb3V0KCkgYW5kIHNldFNlbmRUaW1lb3V0KCkgYXJlIGRlcHJlY2F0ZWQuIAorVXNlIHNldFRpbWVvdXQgaW5zdGVhZC4KIApkaWZmIC0tZ2l0IGEvbGliL3BlcmwvYnVpbGQtY3Bhbi1kaXN0LnNoIGIvbGliL3BlcmwvYnVpbGQtY3Bhbi1kaXN0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmFlMjJlN2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGVybC9idWlsZC1jcGFuLWRpc3Quc2gKQEAgLTAsMCArMSw1MyBAQAorIyEvYmluL2Jhc2gKKyMKKyMgVGhpcyBzY3JpcHQgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBhZnRlciB0YWdnaW5nIHRoZSByZXBvc2l0b3J5IGFuZCB1cGRhdGluZworIyB0aGUgdmVyc2lvbiBmaWxlcyBmb3IgYSByZWxlYXNlLiAgSXQgd2lsbCBjcmVhdGUgYSBDUEFOIGFyY2hpdmUuICBSdW4gdGhpcworIyBmcm9tIGluc2lkZSBhIGRvY2tlciBpbWFnZSBsaWtlIHVidW50dS14ZW5pYWwuCisjCisKK3NldCAtZQorCitybSAtZiBNQU5JRkVTVAorcm0gLXJmIFRocmlmdC0qCisKKyMgc2V0dXAgY3BhbiB3aXRob3V0IGEgcHJvbXB0CitlY2hvIHwgY3BhbgorY3BhbiBpbnN0YWxsIEhUVFA6OkRhdGUKK2NwYW4gaW5zdGFsbCBDUEFOCitjcGFuIGluc3RhbGwgQ1BBTjo6TWV0YSBFeHRVdGlsczo6TWFrZU1ha2VyIEpTT046OlBQCisKK3BlcmwgTWFrZWZpbGUuUEwKK3JtIE1ZTUVUQS55bWwKK21ha2UgbWFuaWZlc3QKK21ha2UgZGlzdAorCisjCisjIFdlIHVucGFjayB0aGUgYXJjaGl2ZSBzbyB3ZSBjYW4gYWRkIHZlcnNpb24gbWV0YWRhdGEgZm9yIENQQU4KKyMgc28gdGhhdCBpdCBwcm9wZXJseSBpbmRleGVzIFRocmlmdCBhbmQgcmVtb3ZlIHVubmVjZXNzYXJ5IGZpbGVzLgorIworCitlY2hvICctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScKK3NldCAteAorCitESVNURklMRT0kKGxzIFRocmlmdCouZ3opCitORVdGSUxFPSR7RElTVEZJTEUvdC12L3QtfQoraWYgW1sgIiRESVNURklMRSIgIT0gIiRORVdGSUxFIiBdXTsgdGhlbgorICAgIG12ICRESVNURklMRSAkTkVXRklMRQorICAgIERJU1RGSUxFPSIkTkVXRklMRSIKK2ZpCit0YXIgeHpmICRESVNURklMRQorcm0gJERJU1RGSUxFCitESVNURElSPSQobHMgLWQgVGhyaWZ0KikKKyMgY3BhbiBkb2Vzbid0IGxpa2UgIlRocmlmdC12MC5ubi4wIGFzIGEgZGlyZWN0b3J5IG5hbWUKKyMgbmVlZHMgdG8gYmUgVGhyaWZ0LTAubm4uMAorTkVXRElSPSR7RElTVERJUi90LXYvdC19CitpZiBbWyAiJERJU1RESVIiICE9ICIkTkVXRElSIiBdXTsgdGhlbgorICAgIG12ICRESVNURElSICRORVdESVIKKyAgICBESVNURElSPSIkTkVXRElSIgorZmkKK2NkICRESVNURElSCitjcCAtcCAuLi9NYWtlZmlsZS5QTCAuCitwZXJsIC4uL3Rvb2xzL0ZpeHVwRGlzdC5wbAorY2QgLi4KK3RhciBjdnpmICRESVNURklMRSAkRElTVERJUgorcm0gLXIgJERJU1RESVIKZGlmZiAtLWdpdCBhL2xpYi9wZXJsL2NvZGluZ19zdGFuZGFyZHMubWQgYi9saWIvcGVybC9jb2Rpbmdfc3RhbmRhcmRzLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0ZTgyNTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGVybC9jb2Rpbmdfc3RhbmRhcmRzLm1kCkBAIC0wLDAgKzEsMiBAQAorUGxlYXNlIGZvbGxvdyBbR2VuZXJhbCBDb2RpbmcgU3RhbmRhcmRzXSgvZG9jL2NvZGluZ19zdGFuZGFyZHMubWQpLgorQWRkaXRpb25hbCBwZXJsIGNvZGluZyBzdGFuZGFyZHMgY2FuIGJlIGZvdW5kIGluIFtwZXJsc3R5bGVdKGh0dHA6Ly9wZXJsZG9jLnBlcmwub3JnL3BlcmxzdHlsZS5odG1sKS4KZGlmZiAtLWdpdCBhL2xpYi9wZXJsL2xpYi9UaHJpZnQucG0gYi9saWIvcGVybC9saWIvVGhyaWZ0LnBtCmluZGV4IGY0ZjY1MTIuLmFiNDA5MzAgMTAwNjQ0Ci0tLSBhL2xpYi9wZXJsL2xpYi9UaHJpZnQucG0KKysrIGIvbGliL3BlcmwvbGliL1RocmlmdC5wbQpAQCAtMTcsMTY2ICsxNywyMCBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotb3VyICRWRVJTSU9OID0gJzAuOS4yJzsKLQotcmVxdWlyZSA1LjYuMDsKK3VzZSA1LjEwLjA7CiB1c2Ugc3RyaWN0OwogdXNlIHdhcm5pbmdzOwogCiAjCi0jIERhdGEgdHlwZXMgdGhhdCBjYW4gYmUgc2VudCB2aWEgVGhyaWZ0CisjIFZlcnNpb25pbmcKICMKLXBhY2thZ2UgVFR5cGU7Ci11c2UgY29uc3RhbnQgU1RPUCAgID0+IDA7Ci11c2UgY29uc3RhbnQgVk9JRCAgID0+IDE7Ci11c2UgY29uc3RhbnQgQk9PTCAgID0+IDI7Ci11c2UgY29uc3RhbnQgQllURSAgID0+IDM7Ci11c2UgY29uc3RhbnQgSTA4ICAgID0+IDM7Ci11c2UgY29uc3RhbnQgRE9VQkxFID0+IDQ7Ci11c2UgY29uc3RhbnQgSTE2ICAgID0+IDY7Ci11c2UgY29uc3RhbnQgSTMyICAgID0+IDg7Ci11c2UgY29uc3RhbnQgSTY0ICAgID0+IDEwOwotdXNlIGNvbnN0YW50IFNUUklORyA9PiAxMTsKLXVzZSBjb25zdGFudCBVVEY3ICAgPT4gMTE7Ci11c2UgY29uc3RhbnQgU1RSVUNUID0+IDEyOwotdXNlIGNvbnN0YW50IE1BUCAgICA9PiAxMzsKLXVzZSBjb25zdGFudCBTRVQgICAgPT4gMTQ7Ci11c2UgY29uc3RhbnQgTElTVCAgID0+IDE1OwotdXNlIGNvbnN0YW50IFVURjggICA9PiAxNjsKLXVzZSBjb25zdGFudCBVVEYxNiAgPT4gMTc7Ci0xOwotCisjIEV2ZXJ5IHBlcmwgbW9kdWxlIGZvciBUaHJpZnQgd2lsbCBoYXZlIHRoZSBzYW1lIHZlcnNpb24KKyMgZGVjbGFyYXRpb24uICBGb3IgYSBwcm9kdWN0aW9uIGJ1aWxkLCBjaGFuZ2UgaXQgYmVsb3cgdG8KKyMgc29tZXRoaW5nIGxpa2UgInYwLjExLjAiIGFuZCBhbGwgb2YgdGhlIHBhY2thZ2VzIGluIGFsbAorIyBvZiB0aGUgZmlsZXMgd2lsbCBwaWNrIGl0IHVwIGZyb20gaGVyZS4KICMKLSMgTWVzc2FnZSB0eXBlcyBmb3IgUlBDCi0jCi1wYWNrYWdlIFRNZXNzYWdlVHlwZTsKLXVzZSBjb25zdGFudCBDQUxMICAgICAgPT4gMTsKLXVzZSBjb25zdGFudCBSRVBMWSAgICAgPT4gMjsKLXVzZSBjb25zdGFudCBFWENFUFRJT04gPT4gMzsKLXVzZSBjb25zdGFudCBPTkVXQVkgICAgPT4gNDsKLTE7CiAKLXBhY2thZ2UgVGhyaWZ0OjpURXhjZXB0aW9uOwotCi1zdWIgbmV3IHsKLSAgICBteSAkY2xhc3NuYW1lID0gc2hpZnQ7Ci0gICAgbXkgJHNlbGYgPSB7bWVzc2FnZSA9PiBzaGlmdCwgY29kZSA9PiBzaGlmdCB8fCAwfTsKLQotICAgIHJldHVybiBibGVzcygkc2VsZiwkY2xhc3NuYW1lKTsKLX0KLTE7Ci0KLXBhY2thZ2UgVEFwcGxpY2F0aW9uRXhjZXB0aW9uOwotdXNlIGJhc2UoJ1RocmlmdDo6VEV4Y2VwdGlvbicpOwotCi11c2UgY29uc3RhbnQgVU5LTk9XTiAgICAgICAgICAgICAgICAgPT4gMDsKLXVzZSBjb25zdGFudCBVTktOT1dOX01FVEhPRCAgICAgICAgICA9PiAxOwotdXNlIGNvbnN0YW50IElOVkFMSURfTUVTU0FHRV9UWVBFICAgID0+IDI7Ci11c2UgY29uc3RhbnQgV1JPTkdfTUVUSE9EX05BTUUgICAgICAgPT4gMzsKLXVzZSBjb25zdGFudCBCQURfU0VRVUVOQ0VfSUQgICAgICAgICA9PiA0OwotdXNlIGNvbnN0YW50IE1JU1NJTkdfUkVTVUxUICAgICAgICAgID0+IDU7Ci11c2UgY29uc3RhbnQgSU5URVJOQUxfRVJST1IgICAgICAgICAgPT4gNjsKLXVzZSBjb25zdGFudCBQUk9UT0NPTF9FUlJPUiAgICAgICAgICA9PiA3OwotdXNlIGNvbnN0YW50IElOVkFMSURfVFJBTlNGT1JNICAgICAgID0+IDg7Ci11c2UgY29uc3RhbnQgSU5WQUxJRF9QUk9UT0NPTCAgICAgICAgPT4gOTsKLXVzZSBjb25zdGFudCBVTlNVUFBPUlRFRF9DTElFTlRfVFlQRSA9PiAxMDsKLQotc3ViIG5ldyB7Ci0gICAgbXkgJGNsYXNzbmFtZSA9IHNoaWZ0OwotCi0gICAgbXkgJHNlbGYgPSAkY2xhc3NuYW1lLT5TVVBFUjo6bmV3KCk7Ci0KLSAgICByZXR1cm4gYmxlc3MoJHNlbGYsJGNsYXNzbmFtZSk7Ci19Ci0KLXN1YiByZWFkIHsKLSAgICBteSAkc2VsZiAgPSBzaGlmdDsKLSAgICBteSAkaW5wdXQgPSBzaGlmdDsKLQotICAgIG15ICR4ZmVyICA9IDA7Ci0gICAgbXkgJGZuYW1lID0gdW5kZWY7Ci0gICAgbXkgJGZ0eXBlID0gMDsKLSAgICBteSAkZmlkICAgPSAwOwotCi0gICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkU3RydWN0QmVnaW4oXCRmbmFtZSk7Ci0KLSAgICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZEZpZWxkQmVnaW4oXCRmbmFtZSwgXCRmdHlwZSwgXCRmaWQpOwotICAgICAgICBpZiAoJGZ0eXBlID09IFRUeXBlOjpTVE9QKSB7Ci0gICAgICAgICAgICBsYXN0OyBuZXh0OwotICAgICAgICB9Ci0KLSAgICAgIFNXSVRDSDogZm9yKCRmaWQpCi0gICAgICB7Ci0gICAgICAgICAgLzEvICYmIGRvewotCi0gICAgICAgICAgICAgIGlmICgkZnR5cGUgPT0gVFR5cGU6OlNUUklORykgewotICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkU3RyaW5nKFwkc2VsZi0+e21lc3NhZ2V9KTsKLSAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+c2tpcCgkZnR5cGUpOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgbGFzdDsKLSAgICAgICAgICB9OwotCi0gICAgICAgICAgLzIvICYmIGRvewotICAgICAgICAgICAgICBpZiAoJGZ0eXBlID09IFRUeXBlOjpJMzIpIHsKLSAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZEkzMihcJHNlbGYtPntjb2RlfSk7Ci0gICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPnNraXAoJGZ0eXBlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBsYXN0OwotICAgICAgICAgIH07Ci0KLSAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPnNraXAoJGZ0eXBlKTsKLSAgICAgIH0KLQotICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkRmllbGRFbmQoKTsKLSAgICB9Ci0gICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkU3RydWN0RW5kKCk7Ci0KLSAgICByZXR1cm4gJHhmZXI7Ci19Ci0KLXN1YiB3cml0ZSB7Ci0gICAgbXkgJHNlbGYgICA9IHNoaWZ0OwotICAgIG15ICRvdXRwdXQgPSBzaGlmdDsKLQotICAgIG15ICR4ZmVyICAgPSAwOwotCi0gICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTdHJ1Y3RCZWdpbignVEFwcGxpY2F0aW9uRXhjZXB0aW9uJyk7Ci0KLSAgICBpZiAoJHNlbGYtPmdldE1lc3NhZ2UoKSkgewotICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkQmVnaW4oJ21lc3NhZ2UnLCBUVHlwZTo6U1RSSU5HLCAxKTsKLSAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTdHJpbmcoJHNlbGYtPmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRFbmQoKTsKLSAgICB9Ci0KLSAgICBpZiAoJHNlbGYtPmdldENvZGUoKSkgewotICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkQmVnaW4oJ3R5cGUnLCBUVHlwZTo6STMyLCAyKTsKLSAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVJMzIoJHNlbGYtPmdldENvZGUoKSk7Ci0gICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRFbmQoKTsKLSAgICB9Ci0KLSAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkU3RvcCgpOwotICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU3RydWN0RW5kKCk7Ci0KLSAgICByZXR1cm4gJHhmZXI7Ci19Ci0KLXN1YiBnZXRNZXNzYWdlCi17Ci0gICAgbXkgJHNlbGYgPSBzaGlmdDsKLQotICAgIHJldHVybiAkc2VsZi0+e21lc3NhZ2V9OwotfQotCi1zdWIgZ2V0Q29kZQotewotICAgIG15ICRzZWxmID0gc2hpZnQ7Ci0KLSAgICByZXR1cm4gJHNlbGYtPntjb2RlfTsKLX0KK3BhY2thZ2UgVGhyaWZ0OwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgidjEuMC4wIik7CiAKIDE7CmRpZmYgLS1naXQgYS9saWIvcGVybC9saWIvVGhyaWZ0L0JpbmFyeVByb3RvY29sLnBtIGIvbGliL3BlcmwvbGliL1RocmlmdC9CaW5hcnlQcm90b2NvbC5wbQppbmRleCBjNjM4ZWFkLi5kNjI1MDlhIDEwMDY0NAotLS0gYS9saWIvcGVybC9saWIvVGhyaWZ0L0JpbmFyeVByb3RvY29sLnBtCisrKyBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvQmluYXJ5UHJvdG9jb2wucG0KQEAgLTE3LDI4ICsxNywyOSBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotcmVxdWlyZSA1LjYuMDsKLQordXNlIDUuMTAuMDsKIHVzZSBzdHJpY3Q7CiB1c2Ugd2FybmluZ3M7CiAKLXVzZSB1dGY4OwotdXNlIEVuY29kZTsKLQotdXNlIFRocmlmdDsKLXVzZSBUaHJpZnQ6OlByb3RvY29sOwotCiB1c2UgQml0OjpWZWN0b3I7Cit1c2UgRW5jb2RlOwordXNlIFRocmlmdDsKK3VzZSBUaHJpZnQ6OkV4Y2VwdGlvbjsKK3VzZSBUaHJpZnQ6Ok1lc3NhZ2VUeXBlOwordXNlIFRocmlmdDo6UHJvdG9jb2w7Cit1c2UgVGhyaWZ0OjpUeXBlOwordXNlIHV0Zjg7CiAKICMKICMgQmluYXJ5IGltcGxlbWVudGF0aW9uIG9mIHRoZSBUaHJpZnQgcHJvdG9jb2wuCiAjCiBwYWNrYWdlIFRocmlmdDo6QmluYXJ5UHJvdG9jb2w7CiB1c2UgYmFzZSgnVGhyaWZ0OjpQcm90b2NvbCcpOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOwogCiB1c2UgY29uc3RhbnQgVkVSU0lPTl9NQVNLICAgPT4gMHhmZmZmMDAwMDsKIHVzZSBjb25zdGFudCBWRVJTSU9OXzEgICAgICA9PiAweDgwMDEwMDAwOwotdXNlIGNvbnN0YW50IElTX0JJR19FTkRJQU4gID0+IHVucGFjaygiaCoiLCBwYWNrKCJzIiwgMSkpID1+IC8wMS87Cit1c2UgY29uc3RhbnQgSVNfQklHX0VORElBTiAgPT4gdW5wYWNrKCdoKicsIHBhY2soJ3MnLCAxKSkgPX4gbS8wMS87CiAKIHN1YiBuZXcKIHsKQEAgLTY2LDcgKzY3LDggQEAKICAgICByZXR1cm4gMDsKIH0KIAotc3ViIHdyaXRlU3RydWN0QmVnaW57CitzdWIgd3JpdGVTdHJ1Y3RCZWdpbgorewogICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICAgbXkgJG5hbWUgPSBzaGlmdDsKICAgICByZXR1cm4gMDsKQEAgLTk3LDcgKzk5LDcgQEAKIHN1YiB3cml0ZUZpZWxkU3RvcAogewogICAgIG15ICRzZWxmID0gc2hpZnQ7Ci0gICAgcmV0dXJuICRzZWxmLT53cml0ZUJ5dGUoVFR5cGU6OlNUT1ApOworICAgIHJldHVybiAkc2VsZi0+d3JpdGVCeXRlKFRocmlmdDo6VFR5cGU6OlNUT1ApOwogfQogCiBzdWIgd3JpdGVNYXBCZWdpbgpAQCAtMjUyLDE0ICsyNTQsMTYgQEAKICAgICBteSAkcmVzdWx0ID0gJHNlbGYtPnJlYWRJMzIoXCR2ZXJzaW9uKTsKICAgICBpZiAoKCR2ZXJzaW9uICYgVkVSU0lPTl9NQVNLKSA+IDApIHsKICAgICAgIGlmICgoJHZlcnNpb24gJiBWRVJTSU9OX01BU0spICE9IFZFUlNJT05fMSkgewotICAgICAgICBkaWUgbmV3IFRocmlmdDo6VEV4Y2VwdGlvbignTWlzc2luZyB2ZXJzaW9uIGlkZW50aWZpZXInKQorICAgICAgICBkaWUgVGhyaWZ0OjpUUHJvdG9jb2xFeGNlcHRpb24tPm5ldygnTWlzc2luZyB2ZXJzaW9uIGlkZW50aWZpZXInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdDo6VFByb3RvY29sRXhjZXB0aW9uOjpCQURfVkVSU0lPTik7CiAgICAgICB9CiAgICAgICAkJHR5cGUgPSAkdmVyc2lvbiAmIDB4MDAwMDAwZmY7CiAgICAgICByZXR1cm4KICAgICAgICAgICAkcmVzdWx0ICsKICAgICAgICAgICAkc2VsZi0+cmVhZFN0cmluZygkbmFtZSkgKwogICAgICAgICAgICRzZWxmLT5yZWFkSTMyKCRzZXFpZCk7Ci0gICAgfSBlbHNlIHsgIyBvbGQgY2xpZW50IHN1cHBvcnQgY29kZQorICAgIH0KKyAgICBlbHNlIHsgIyBvbGQgY2xpZW50IHN1cHBvcnQgY29kZQogICAgICAgcmV0dXJuCiAgICAgICAgICRyZXN1bHQgKwogICAgICAgICAkc2VsZi0+cmVhZFN0cmluZ0JvZHkoJG5hbWUsICR2ZXJzaW9uKSArICMgdmVyc2lvbiBoZXJlIGhvbGRzIHRoZSBzaXplIG9mIHRoZSBzdHJpbmcKQEAgLTI5Nyw3ICszMDEsNyBAQAogCiAgICAgbXkgJHJlc3VsdCA9ICRzZWxmLT5yZWFkQnl0ZSgkZmllbGRUeXBlKTsKIAotICAgIGlmICgkJGZpZWxkVHlwZSA9PSBUVHlwZTo6U1RPUCkgeworICAgIGlmICgkJGZpZWxkVHlwZSA9PSBUaHJpZnQ6OlRUeXBlOjpTVE9QKSB7CiAgICAgICAkJGZpZWxkSWQgPSAwOwogICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICAgfQpAQCAtNDI1LDcgKzQyOSw3IEBACiAKICAgICBteSAoJGhpLCRsbyk9dW5wYWNrKCdOTicsJGRhdGEpOwogCi0gICAgbXkgJHZlYyA9IG5ldyBCaXQ6OlZlY3Rvcig2NCk7CisgICAgbXkgJHZlYyA9IEJpdDo6VmVjdG9yLT5uZXcoNjQpOwogCiAgICAgJHZlYy0+Q2h1bmtfU3RvcmUoMzIsMzIsJGhpKTsKICAgICAkdmVjLT5DaHVua19TdG9yZSgzMiwwLCRsbyk7CkBAIC00NDcsNyArNDUxLDcgQEAKICAgICBlbHNlIHsKICAgICAgICRkYXRhID0gc2NhbGFyIHJldmVyc2UoJHNlbGYtPnt0cmFuc30tPnJlYWRBbGwoOCkpOwogICAgIH0KLSAgICAKKwogICAgIG15IEBhcnIgPSB1bnBhY2soJ2QnLCAkZGF0YSk7CiAKICAgICAkJHZhbHVlID0gJGFyclswXTsKQEAgLTQ2NSw3ICs0NjksOCBAQAogCiAgICAgaWYgKCRsZW4pIHsKICAgICAgICQkdmFsdWUgPSAkc2VsZi0+e3RyYW5zfS0+cmVhZEFsbCgkbGVuKTsKLSAgICB9IGVsc2UgeworICAgIH0KKyAgICBlbHNlIHsKICAgICAgICQkdmFsdWUgPSAnJzsKICAgICB9CiAKQEAgLTQ4MCw3ICs0ODUsOCBAQAogCiAgICAgaWYgKCRsZW4pIHsKICAgICAgICQkdmFsdWUgPSAkc2VsZi0+e3RyYW5zfS0+cmVhZEFsbCgkbGVuKTsKLSAgICB9IGVsc2UgeworICAgIH0KKyAgICBlbHNlIHsKICAgICAgICQkdmFsdWUgPSAnJzsKICAgICB9CiAKQEAgLTQ5MSw3ICs0OTcsOCBAQAogIyBCaW5hcnkgUHJvdG9jb2wgRmFjdG9yeQogIwogcGFja2FnZSBUaHJpZnQ6OkJpbmFyeVByb3RvY29sRmFjdG9yeTsKLXVzZSBiYXNlKCdUUHJvdG9jb2xGYWN0b3J5Jyk7Cit1c2UgYmFzZSgnVGhyaWZ0OjpUUHJvdG9jb2xGYWN0b3J5Jyk7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CiAKIHN1YiBuZXcKIHsKQEAgLTUwNSw3ICs1MTIsNyBAQAogICAgIG15ICRzZWxmICA9IHNoaWZ0OwogICAgIG15ICR0cmFucyA9IHNoaWZ0OwogCi0gICAgcmV0dXJuIG5ldyBUaHJpZnQ6OkJpbmFyeVByb3RvY29sKCR0cmFucyk7CisgICAgcmV0dXJuIFRocmlmdDo6QmluYXJ5UHJvdG9jb2wtPm5ldygkdHJhbnMpOwogfQogCiAxOwpkaWZmIC0tZ2l0IGEvbGliL3BlcmwvbGliL1RocmlmdC9CdWZmZXJlZFRyYW5zcG9ydC5wbSBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvQnVmZmVyZWRUcmFuc3BvcnQucG0KaW5kZXggMzg2OGNhMi4uNmI1YmY3YSAxMDA2NDQKLS0tIGEvbGliL3BlcmwvbGliL1RocmlmdC9CdWZmZXJlZFRyYW5zcG9ydC5wbQorKysgYi9saWIvcGVybC9saWIvVGhyaWZ0L0J1ZmZlcmVkVHJhbnNwb3J0LnBtCkBAIC0xNywxNSArMTcsMTcgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLXJlcXVpcmUgNS42LjA7Cit1c2UgNS4xMC4wOwogdXNlIHN0cmljdDsKIHVzZSB3YXJuaW5nczsKIAogdXNlIFRocmlmdDsKK3VzZSBUaHJpZnQ6OkV4Y2VwdGlvbjsKIHVzZSBUaHJpZnQ6OlRyYW5zcG9ydDsKIAogcGFja2FnZSBUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0OwogdXNlIGJhc2UoJ1RocmlmdDo6VHJhbnNwb3J0Jyk7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CiAKIHN1YiBuZXcKIHsKQEAgLTExMCw2ICsxMTIsNyBAQAogIyBCdWZmZXJlZFRyYW5zcG9ydCBmYWN0b3J5IGNyZWF0ZXMgYnVmZmVyZWQgdHJhbnNwb3J0IG9iamVjdHMgZnJvbSB0cmFuc3BvcnRzCiAjCiBwYWNrYWdlIFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5OwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOwogCiBzdWIgbmV3IHsKICAgICBteSAkY2xhc3NuYW1lID0gc2hpZnQ7CmRpZmYgLS1naXQgYS9saWIvcGVybC9saWIvVGhyaWZ0L0V4Y2VwdGlvbi5wbSBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvRXhjZXB0aW9uLnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0MDQwNjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGVybC9saWIvVGhyaWZ0L0V4Y2VwdGlvbi5wbQpAQCAtMCwwICsxLDE2MSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3VzZSA1LjEwLjA7Cit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCit1c2UgVGhyaWZ0OwordXNlIFRocmlmdDo6VHlwZTsKKworcGFja2FnZSBUaHJpZnQ6OlRFeGNlcHRpb247Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CisKK3VzZSBvdmVybG9hZCAnIiInID0+IHN1YiB7CisgICAgcmV0dXJuCisgICAgICAgIHNwcmludGYgJyVzIGVycm9yOiAlcyAoY29kZSAlcyknLAorICAgICAgICAgIHJlZiggJF9bMF0gKSwKKyAgICAgICAgICAoICRfWzBdLT57bWVzc2FnZX0gfHwgJ2VtcHR5IG1lc3NhZ2UnICksCisgICAgICAgICAgKCBkZWZpbmVkICRfWzBdLT57Y29kZX0gPyAkX1swXS0+e2NvZGV9IDogJ3VuZGVmaW5lZCcgKTsKKyAgICB9OworCitzdWIgbmV3IHsKKyAgICBteSAkY2xhc3NuYW1lID0gc2hpZnQ7CisgICAgbXkgJHNlbGYgPSB7bWVzc2FnZSA9PiBzaGlmdCwgY29kZSA9PiBzaGlmdCB8fCAwfTsKKworICAgIHJldHVybiBibGVzcygkc2VsZiwkY2xhc3NuYW1lKTsKK30KKworcGFja2FnZSBUaHJpZnQ6OlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK3VzZSBwYXJlbnQgLW5vcmVxdWlyZSwgJ1RocmlmdDo6VEV4Y2VwdGlvbic7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CisKK3VzZSBjb25zdGFudCBVTktOT1dOICAgICAgICAgICAgICAgICA9PiAwOwordXNlIGNvbnN0YW50IFVOS05PV05fTUVUSE9EICAgICAgICAgID0+IDE7Cit1c2UgY29uc3RhbnQgSU5WQUxJRF9NRVNTQUdFX1RZUEUgICAgPT4gMjsKK3VzZSBjb25zdGFudCBXUk9OR19NRVRIT0RfTkFNRSAgICAgICA9PiAzOwordXNlIGNvbnN0YW50IEJBRF9TRVFVRU5DRV9JRCAgICAgICAgID0+IDQ7Cit1c2UgY29uc3RhbnQgTUlTU0lOR19SRVNVTFQgICAgICAgICAgPT4gNTsKK3VzZSBjb25zdGFudCBJTlRFUk5BTF9FUlJPUiAgICAgICAgICA9PiA2OwordXNlIGNvbnN0YW50IFBST1RPQ09MX0VSUk9SICAgICAgICAgID0+IDc7Cit1c2UgY29uc3RhbnQgSU5WQUxJRF9UUkFOU0ZPUk0gICAgICAgPT4gODsKK3VzZSBjb25zdGFudCBJTlZBTElEX1BST1RPQ09MICAgICAgICA9PiA5OwordXNlIGNvbnN0YW50IFVOU1VQUE9SVEVEX0NMSUVOVF9UWVBFID0+IDEwOworCitzdWIgbmV3IHsKKyAgICBteSAkY2xhc3NuYW1lID0gc2hpZnQ7CisKKyAgICBteSAkc2VsZiA9ICRjbGFzc25hbWUtPlNVUEVSOjpuZXcoQF8pOworCisgICAgcmV0dXJuIGJsZXNzKCRzZWxmLCRjbGFzc25hbWUpOworfQorCitzdWIgcmVhZCB7CisgICAgbXkgJHNlbGYgID0gc2hpZnQ7CisgICAgbXkgJGlucHV0ID0gc2hpZnQ7CisKKyAgICBteSAkeGZlciAgPSAwOworICAgIG15ICRmbmFtZSA9IHVuZGVmOworICAgIG15ICRmdHlwZSA9IDA7CisgICAgbXkgJGZpZCAgID0gMDsKKworICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZFN0cnVjdEJlZ2luKFwkZm5hbWUpOworCisgICAgd2hpbGUgKDEpCisgICAgeworICAgICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRGaWVsZEJlZ2luKFwkZm5hbWUsIFwkZnR5cGUsIFwkZmlkKTsKKyAgICAgICAgaWYgKCRmdHlwZSA9PSBUaHJpZnQ6OlRUeXBlOjpTVE9QKSB7CisgICAgICAgICAgICBsYXN0OyBuZXh0OworICAgICAgICB9CisKKyAgICAgIFNXSVRDSDogZm9yKCRmaWQpCisgICAgICB7CisgICAgICAgICAgLzEvICYmIGRveworCisgICAgICAgICAgICAgIGlmICgkZnR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6U1RSSU5HKSB7CisgICAgICAgICAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRTdHJpbmcoXCRzZWxmLT57bWVzc2FnZX0pOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5za2lwKCRmdHlwZSk7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBsYXN0OworICAgICAgICAgIH07CisKKyAgICAgICAgICAvMi8gJiYgZG97CisgICAgICAgICAgICAgIGlmICgkZnR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6STMyKSB7CisgICAgICAgICAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRJMzIoXCRzZWxmLT57Y29kZX0pOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5za2lwKCRmdHlwZSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgbGFzdDsKKyAgICAgICAgICB9OworCisgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5za2lwKCRmdHlwZSk7CisgICAgICB9CisKKyAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZEZpZWxkRW5kKCk7CisgICAgfQorICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZFN0cnVjdEVuZCgpOworCisgICAgcmV0dXJuICR4ZmVyOworfQorCitzdWIgd3JpdGUgeworICAgIG15ICRzZWxmICAgPSBzaGlmdDsKKyAgICBteSAkb3V0cHV0ID0gc2hpZnQ7CisKKyAgICBteSAkeGZlciAgID0gMDsKKworICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU3RydWN0QmVnaW4oJ1RBcHBsaWNhdGlvbkV4Y2VwdGlvbicpOworCisgICAgaWYgKCRzZWxmLT5nZXRNZXNzYWdlKCkpIHsKKyAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZEJlZ2luKCdtZXNzYWdlJywgVGhyaWZ0OjpUVHlwZTo6U1RSSU5HLCAxKTsKKyAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTdHJpbmcoJHNlbGYtPmdldE1lc3NhZ2UoKSk7CisgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRFbmQoKTsKKyAgICB9CisKKyAgICBpZiAoJHNlbGYtPmdldENvZGUoKSkgeworICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkQmVnaW4oJ3R5cGUnLCBUaHJpZnQ6OlRUeXBlOjpJMzIsIDIpOworICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUkzMigkc2VsZi0+Z2V0Q29kZSgpKTsKKyAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZEVuZCgpOworICAgIH0KKworICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRTdG9wKCk7CisgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTdHJ1Y3RFbmQoKTsKKworICAgIHJldHVybiAkeGZlcjsKK30KKworc3ViIGdldE1lc3NhZ2UKK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57bWVzc2FnZX07Cit9CisKK3N1YiBnZXRDb2RlCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIHJldHVybiAkc2VsZi0+e2NvZGV9OworfQorCisxOwpkaWZmIC0tZ2l0IGEvbGliL3BlcmwvbGliL1RocmlmdC9GcmFtZWRUcmFuc3BvcnQucG0gYi9saWIvcGVybC9saWIvVGhyaWZ0L0ZyYW1lZFRyYW5zcG9ydC5wbQppbmRleCBlOGU4NWRjLi5iYTg5YmEzIDEwMDY0NAotLS0gYS9saWIvcGVybC9saWIvVGhyaWZ0L0ZyYW1lZFRyYW5zcG9ydC5wbQorKysgYi9saWIvcGVybC9saWIvVGhyaWZ0L0ZyYW1lZFRyYW5zcG9ydC5wbQpAQCAtMTcsNiArMTcsNyBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAordXNlIDUuMTAuMDsKIHVzZSBzdHJpY3Q7CiB1c2Ugd2FybmluZ3M7CiAKQEAgLTMwLDggKzMxLDggQEAKICMgQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAogIwogcGFja2FnZSBUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydDsKLQogdXNlIGJhc2UoJ1RocmlmdDo6VHJhbnNwb3J0Jyk7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CiAKIHN1YiBuZXcKIHsKQEAgLTY5LDcgKzcwLDcgQEAKICAgICBteSAkc2VsZiA9IHNoaWZ0OwogCiAgICAgaWYgKGRlZmluZWQgJHNlbGYtPnt0cmFuc3BvcnR9KSB7Ci0gICAgICAkc2VsZi0+e3RyYW5zcG9ydH0tPmNsb3NlKCk7CisgICAgICAgICRzZWxmLT57dHJhbnNwb3J0fS0+Y2xvc2UoKTsKICAgICB9CiB9CiAKQEAgLTE2Myw0ICsxNjQsMzEgQEAKIAogfQogCisjCisjIEZyYW1lZFRyYW5zcG9ydCBmYWN0b3J5IGNyZWF0ZXMgZnJhbWVkIHRyYW5zcG9ydCBvYmplY3RzIGZyb20gdHJhbnNwb3J0cworIworcGFja2FnZSBUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydEZhY3Rvcnk7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CisKK3N1YiBuZXcgeworICAgIG15ICRjbGFzc25hbWUgPSBzaGlmdDsKKyAgICBteSAkc2VsZiAgICAgID0ge307CisKKyAgICByZXR1cm4gYmxlc3MoJHNlbGYsICRjbGFzc25hbWUpOworfQorCisjCisjIEJ1aWxkIGEgZnJhbWVkIHRyYW5zcG9ydCBmcm9tIHRoZSBiYXNlIHRyYW5zcG9ydAorIworIyBAcmV0dXJuIFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0IHRyYW5zcG9ydAorIworc3ViIGdldFRyYW5zcG9ydAoreworICAgIG15ICRzZWxmICA9IHNoaWZ0OworICAgIG15ICR0cmFucyA9IHNoaWZ0OworCisgICAgbXkgJGJ1ZmZlcmVkID0gVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnQtPm5ldygkdHJhbnMpOworICAgIHJldHVybiAkYnVmZmVyZWQ7Cit9CisKIDE7CmRpZmYgLS1naXQgYS9saWIvcGVybC9saWIvVGhyaWZ0L0h0dHBDbGllbnQucG0gYi9saWIvcGVybC9saWIvVGhyaWZ0L0h0dHBDbGllbnQucG0KaW5kZXggZDZmYzhiZS4uNDBlYzljZSAxMDA2NDQKLS0tIGEvbGliL3BlcmwvbGliL1RocmlmdC9IdHRwQ2xpZW50LnBtCisrKyBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvSHR0cENsaWVudC5wbQpAQCAtMTcsMjYgKzE3LDI1IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1yZXF1aXJlIDUuNi4wOwordXNlIDUuMTAuMDsKIHVzZSBzdHJpY3Q7CiB1c2Ugd2FybmluZ3M7CiAKK3VzZSBIVFRQOjpSZXF1ZXN0OwordXNlIElPOjpTdHJpbmc7Cit1c2UgTFdQOjpVc2VyQWdlbnQ7CiB1c2UgVGhyaWZ0OwordXNlIFRocmlmdDo6RXhjZXB0aW9uOwogdXNlIFRocmlmdDo6VHJhbnNwb3J0OwogCi11c2UgSFRUUDo6UmVxdWVzdDsKLXVzZSBMV1A6OlVzZXJBZ2VudDsKLXVzZSBJTzo6U3RyaW5nOwotCiBwYWNrYWdlIFRocmlmdDo6SHR0cENsaWVudDsKLQogdXNlIGJhc2UoJ1RocmlmdDo6VHJhbnNwb3J0Jyk7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CiAKIHN1YiBuZXcKIHsKICAgICBteSAkY2xhc3NuYW1lID0gc2hpZnQ7CiAgICAgbXkgJHVybCAgICAgICA9IHNoaWZ0IHx8ICdodHRwOi8vbG9jYWxob3N0OjkwOTAnOwotICAgIG15ICRkZWJ1Z0hhbmRsZXIgPSBzaGlmdDsKIAogICAgIG15ICRvdXQgPSBJTzo6U3RyaW5nLT5uZXc7CiAgICAgYmlubW9kZSgkb3V0KTsKQEAgLTQ0LDQ0ICs0Myw0NCBAQAogICAgIG15ICRzZWxmID0gewogICAgICAgICB1cmwgICAgICAgICAgPT4gJHVybCwKICAgICAgICAgb3V0ICAgICAgICAgID0+ICRvdXQsCi0gICAgICAgIGRlYnVnSGFuZGxlciA9PiAkZGVidWdIYW5kbGVyLAotICAgICAgICBkZWJ1ZyAgICAgICAgPT4gMCwKLSAgICAgICAgc2VuZFRpbWVvdXQgID0+IDEwMCwKLSAgICAgICAgcmVjdlRpbWVvdXQgID0+IDc1MCwKKyAgICAgICAgdGltZW91dCAgICAgID0+IDEwMCwKICAgICAgICAgaGFuZGxlICAgICAgID0+IHVuZGVmLAorICAgICAgICBoZWFkZXJzICAgICAgPT4ge30sCiAgICAgfTsKIAogICAgIHJldHVybiBibGVzcygkc2VsZiwkY2xhc3NuYW1lKTsKIH0KIAorc3ViIHNldFRpbWVvdXQKK3sKKyAgICBteSAkc2VsZiAgICA9IHNoaWZ0OworICAgIG15ICR0aW1lb3V0ID0gc2hpZnQ7CisKKyAgICAkc2VsZi0+e3RpbWVvdXR9ID0gJHRpbWVvdXQ7Cit9CisKK3N1YiBzZXRSZWN2VGltZW91dAoreworICAgIHdhcm4gJ3NldFJlY3ZUaW1lb3V0IGlzIGRlcHJlY2F0ZWQgLSB1c2Ugc2V0VGltZW91dCBpbnN0ZWFkJzsKKyAgICAjIG5vdGU6IHJlY3ZUaW1lb3V0IHdhcyBuZXZlciB1c2VkIHNvIHdlIGRvIG5vdCBuZWVkIHRvIGRvIGFueXRoaW5nIGhlcmUKK30KKwogc3ViIHNldFNlbmRUaW1lb3V0CiB7CiAgICAgbXkgJHNlbGYgICAgPSBzaGlmdDsKICAgICBteSAkdGltZW91dCA9IHNoaWZ0OwogCi0gICAgJHNlbGYtPntzZW5kVGltZW91dH0gPSAkdGltZW91dDsKKyAgICB3YXJuICdzZXRTZW5kVGltZW91dCBpcyBkZXByZWNhdGVkIC0gdXNlIHNldFRpbWVvdXQgaW5zdGVhZCc7CisKKyAgICAkc2VsZi0+c2V0VGltZW91dCgkdGltZW91dCk7CiB9CiAKLXN1YiBzZXRSZWN2VGltZW91dAorc3ViIHNldEhlYWRlcgogewotICAgIG15ICRzZWxmICAgID0gc2hpZnQ7Ci0gICAgbXkgJHRpbWVvdXQgPSBzaGlmdDsKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICgkbmFtZSwgJHZhbHVlKSA9IEBfOwogCi0gICAgJHNlbGYtPntyZWN2VGltZW91dH0gPSAkdGltZW91dDsKLX0KLQotCi0jCi0jU2V0cyBkZWJ1Z2dpbmcgb3V0cHV0IG9uIG9yIG9mZgotIwotIyBAcGFyYW0gYm9vbCAkZGVidWcKLSMKLXN1YiBzZXREZWJ1ZwotewotICAgIG15ICRzZWxmICA9IHNoaWZ0OwotICAgIG15ICRkZWJ1ZyA9IHNoaWZ0OwotCi0gICAgJHNlbGYtPntkZWJ1Z30gPSAkZGVidWc7CisgICAgJHNlbGYtPntoZWFkZXJzfS0+eyRuYW1lfSA9ICR2YWx1ZTsKIH0KIAogIwpAQCAtMTAzLDggKzEwMiw4IEBACiB7CiAgICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgICBpZiAoZGVmaW5lZCgkc2VsZi0+e2lvfSkpIHsKLSAgICAgIGNsb3NlKCRzZWxmLT57aW99KTsKLSAgICAgICRzZWxmLT57aW99ID0gdW5kZWY7CisgICAgICAgIGNsb3NlKCRzZWxmLT57aW99KTsKKyAgICAgICAgJHNlbGYtPntpb30gPSB1bmRlZjsKICAgICB9CiB9CiAKQEAgLTEyMiw3ICsxMjEsOCBAQAogICAgIG15ICRidWYgPSAkc2VsZi0+cmVhZCgkbGVuKTsKIAogICAgIGlmICghZGVmaW5lZCgkYnVmKSkgewotICAgICAgZGllIG5ldyBUaHJpZnQ6OlRFeGNlcHRpb24oJ1RTb2NrZXQ6IENvdWxkIG5vdCByZWFkICcuJGxlbi4nIGJ5dGVzIGZyb20gaW5wdXQgYnVmZmVyJyk7CisgICAgICAgIGRpZSBUaHJpZnQ6OlRUcmFuc3BvcnRFeGNlcHRpb24tPm5ldygiVFNvY2tldDogQ291bGQgbm90IHJlYWQgJGxlbiBieXRlcyBmcm9tIGlucHV0IGJ1ZmZlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnQ6OlRUcmFuc3BvcnRFeGNlcHRpb246OkVORF9PRl9GSUxFKTsKICAgICB9CiAgICAgcmV0dXJuICRidWY7CiB9CkBAIC0xNDAsMTUgKzE0MCwxOCBAQAogICAgIG15ICRpbiA9ICRzZWxmLT57aW59OwogCiAgICAgaWYgKCFkZWZpbmVkKCRpbikpIHsKLSAgICAgIGRpZSBuZXcgVGhyaWZ0OjpURXhjZXB0aW9uKCJSZXNwb25zZSBidWZmZXIgaXMgZW1wdHksIG5vIHJlcXVlc3QuIik7CisgICAgICAgIGRpZSBUaHJpZnQ6OlRUcmFuc3BvcnRFeGNlcHRpb24tPm5ldygnUmVzcG9uc2UgYnVmZmVyIGlzIGVtcHR5LCBubyByZXF1ZXN0LicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnQ6OlRUcmFuc3BvcnRFeGNlcHRpb246OkVORF9PRl9GSUxFKTsKICAgICB9CiAgICAgZXZhbCB7Ci0gICAgICBteSAkcmV0ID0gc3lzcmVhZCgkaW4sICRidWYsICRsZW4pOwotICAgICAgaWYgKCEgZGVmaW5lZCgkcmV0KSkgewotICAgICAgICBkaWUgbmV3IFRocmlmdDo6VEV4Y2VwdGlvbigiTm8gbW9yZSBkYXRhIGF2YWlsYWJsZS4iKTsKLSAgICAgIH0KLSAgICB9OyBpZigkQCl7Ci0gICAgICBkaWUgbmV3IFRocmlmdDo6VEV4Y2VwdGlvbigkQCk7CisgICAgICAgIG15ICRyZXQgPSBzeXNyZWFkKCRpbiwgJGJ1ZiwgJGxlbik7CisgICAgICAgIGlmICghIGRlZmluZWQoJHJldCkpIHsKKyAgICAgICAgICAgIGRpZSBUaHJpZnQ6OlRUcmFuc3BvcnRFeGNlcHRpb24tPm5ldygnTm8gbW9yZSBkYXRhIGF2YWlsYWJsZS4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnQ6OlRUcmFuc3BvcnRFeGNlcHRpb246OlRJTUVEX09VVCk7CisgICAgICAgIH0KKyAgICB9OworICAgIGlmKCRAKXsKKyAgICAgICAgZGllIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbi0+bmV3KCIkQCIsIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTik7CiAgICAgfQogCiAgICAgcmV0dXJuICRidWY7CkBAIC0xNzEsOCArMTc0LDkgQEAKIHsKICAgICBteSAkc2VsZiA9IHNoaWZ0OwogCi0gICAgbXkgJHVhID0gTFdQOjpVc2VyQWdlbnQtPm5ldygndGltZW91dCcgPT4gKCRzZWxmLT57c2VuZFRpbWVvdXR9IC8gMTAwMCksCi0gICAgICAnYWdlbnQnID0+ICdQZXJsL1RIdHRwQ2xpZW50JworICAgIG15ICR1YSA9IExXUDo6VXNlckFnZW50LT5uZXcoCisgICAgICAgICd0aW1lb3V0JyA9PiAoJHNlbGYtPnt0aW1lb3V0fSAvIDEwMDApLAorICAgICAgICAnYWdlbnQnICAgPT4gJ1BlcmwvVEh0dHBDbGllbnQnCiAgICAgICk7CiAgICAgJHVhLT5kZWZhdWx0X2hlYWRlcignQWNjZXB0JyA9PiAnYXBwbGljYXRpb24veC10aHJpZnQnKTsKICAgICAkdWEtPmRlZmF1bHRfaGVhZGVyKCdDb250ZW50LVR5cGUnID0+ICdhcHBsaWNhdGlvbi94LXRocmlmdCcpOwpAQCAtMTgyLDcgKzE4Niw3IEBACiAgICAgJG91dC0+c2V0cG9zKDApOyAjIHJld2luZAogICAgIG15ICRidWYgPSBqb2luKCcnLCA8JG91dD4pOwogCi0gICAgbXkgJHJlcXVlc3QgPSBuZXcgSFRUUDo6UmVxdWVzdChQT1NUID0+ICRzZWxmLT57dXJsfSwgdW5kZWYsICRidWYpOworICAgIG15ICRyZXF1ZXN0ID0gSFRUUDo6UmVxdWVzdC0+bmV3KFBPU1QgPT4gJHNlbGYtPnt1cmx9LCAoJHNlbGYtPntoZWFkZXJzfSB8fCB1bmRlZiksICRidWYpOwogICAgIG15ICRyZXNwb25zZSA9ICR1YS0+cmVxdWVzdCgkcmVxdWVzdCk7CiAgICAgbXkgJGNvbnRlbnRfcmVmID0gJHJlc3BvbnNlLT5jb250ZW50X3JlZjsKIApkaWZmIC0tZ2l0IGEvbGliL3BlcmwvbGliL1RocmlmdC9NZW1vcnlCdWZmZXIucG0gYi9saWIvcGVybC9saWIvVGhyaWZ0L01lbW9yeUJ1ZmZlci5wbQppbmRleCAwYjI4Njg3Li5iZTk3Y2U0IDEwMDY0NAotLS0gYS9saWIvcGVybC9saWIvVGhyaWZ0L01lbW9yeUJ1ZmZlci5wbQorKysgYi9saWIvcGVybC9saWIvVGhyaWZ0L01lbW9yeUJ1ZmZlci5wbQpAQCAtMTcsNyArMTcsNyBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotcmVxdWlyZSA1LjYuMDsKK3VzZSA1LjEwLjA7CiB1c2Ugc3RyaWN0OwogdXNlIHdhcm5pbmdzOwogCkBAIC0yNiw2ICsyNiw3IEBACiAKIHBhY2thZ2UgVGhyaWZ0OjpNZW1vcnlCdWZmZXI7CiB1c2UgYmFzZSgnVGhyaWZ0OjpUcmFuc3BvcnQnKTsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKIAogc3ViIG5ldwogewpAQCAtMzQsMTAgKzM1LDEwIEBACiAgICAgbXkgJGJ1ZmZlclNpemU9IHNoaWZ0IHx8IDEwMjQ7CiAKICAgICBteSAkc2VsZiA9IHsKLSAgICAgICAgYnVmZmVyICAgID0+ICcnLAotICAgICAgICBidWZmZXJTaXplPT4gJGJ1ZmZlclNpemUsCi0gICAgICAgIHdQb3MgICAgICA9PiAwLAotICAgICAgICByUG9zICAgICAgPT4gMCwKKyAgICAgICAgYnVmZmVyICAgICA9PiAnJywKKyAgICAgICAgYnVmZmVyU2l6ZSA9PiAkYnVmZmVyU2l6ZSwKKyAgICAgICAgd1BvcyAgICAgICA9PiAwLAorICAgICAgICByUG9zICAgICAgID0+IDAsCiAgICAgfTsKIAogICAgIHJldHVybiBibGVzcygkc2VsZiwkY2xhc3NuYW1lKTsKQEAgLTExNiw3ICsxMTcsOCBAQAogCiAgICAgbXkgJGF2YWlsID0gKCRzZWxmLT57d1Bvc30gLSAkc2VsZi0+e3JQb3N9KTsKICAgICBpZiAoJGF2YWlsIDwgJGxlbikgewotICAgICAgICBkaWUgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkF0dGVtcHQgdG8gcmVhZEFsbCgkbGVuKSBmb3VuZCBvbmx5ICRhdmFpbCBhdmFpbGFibGUiKTsKKyAgICAgICAgZGllIFRUcmFuc3BvcnRFeGNlcHRpb24tPm5ldygiQXR0ZW1wdCB0byByZWFkQWxsKCRsZW4pIGZvdW5kIG9ubHkgJGF2YWlsIGF2YWlsYWJsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnQ6OlRUcmFuc3BvcnRFeGNlcHRpb246OkVORF9PRl9GSUxFKTsKICAgICB9CiAKICAgICBteSAkZGF0YSA9ICcnOwpkaWZmIC0tZ2l0IGEvbGliL3BlcmwvbGliL1RocmlmdC9NZXNzYWdlVHlwZS5wbSBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvTWVzc2FnZVR5cGUucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI1YzJmNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvTWVzc2FnZVR5cGUucG0KQEAgLTAsMCArMSwzNyBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3VzZSA1LjEwLjA7Cit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCit1c2UgVGhyaWZ0OworCisjCisjIE1lc3NhZ2UgdHlwZXMgZm9yIFJQQworIworcGFja2FnZSBUaHJpZnQ6OlRNZXNzYWdlVHlwZTsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKKwordXNlIGNvbnN0YW50IENBTEwgICAgICA9PiAxOwordXNlIGNvbnN0YW50IFJFUExZICAgICA9PiAyOwordXNlIGNvbnN0YW50IEVYQ0VQVElPTiA9PiAzOwordXNlIGNvbnN0YW50IE9ORVdBWSAgICA9PiA0OworCisxOwpkaWZmIC0tZ2l0IGEvbGliL3BlcmwvbGliL1RocmlmdC9NdWx0aXBsZXhlZFByb2Nlc3Nvci5wbSBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvTXVsdGlwbGV4ZWRQcm9jZXNzb3IucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU5MjVkNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvTXVsdGlwbGV4ZWRQcm9jZXNzb3IucG0KQEAgLTAsMCArMSwxMzMgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCit1c2UgNS4xMC4wOwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKwordXNlIFRocmlmdDsKK3VzZSBUaHJpZnQ6Ok1lc3NhZ2VUeXBlOwordXNlIFRocmlmdDo6TXVsdGlwbGV4ZWRQcm90b2NvbDsKK3VzZSBUaHJpZnQ6OlByb3RvY29sOwordXNlIFRocmlmdDo6UHJvdG9jb2xEZWNvcmF0b3I7CisKK3BhY2thZ2UgVGhyaWZ0OjpTdG9yZWRNZXNzYWdlUHJvdG9jb2w7Cit1c2UgYmFzZSBxdyhUaHJpZnQ6OlByb3RvY29sRGVjb3JhdG9yKTsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKKworc3ViIG5ldyB7CisgICAgbXkgJGNsYXNzbmFtZSA9IHNoaWZ0OworICAgIG15ICRwcm90b2NvbCAgPSBzaGlmdDsKKyAgICBteSAkZm5hbWUgID0gc2hpZnQ7CisgICAgbXkgJG10eXBlICA9IHNoaWZ0OworICAgIG15ICRyc2VxaWQgID0gc2hpZnQ7CisgICAgbXkgJHNlbGYgID0gJGNsYXNzbmFtZS0+U1VQRVI6Om5ldygkcHJvdG9jb2wpOworCisgICAgJHNlbGYtPntmbmFtZX0gPSAkZm5hbWU7CisgICAgJHNlbGYtPnttdHlwZX0gPSAkbXR5cGU7CisgICAgJHNlbGYtPntyc2VxaWR9ID0gJHJzZXFpZDsKKworICAgIHJldHVybiBibGVzcygkc2VsZiwkY2xhc3NuYW1lKTsKK30KKworc3ViIHJlYWRNZXNzYWdlQmVnaW4KK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICRuYW1lID0gc2hpZnQ7CisgICAgbXkgJHR5cGUgPSBzaGlmdDsKKyAgICBteSAkc2VxaWQgPSBzaGlmdDsKKworICAgICQkbmFtZSA9ICRzZWxmLT57Zm5hbWV9OworICAgICQkdHlwZSA9ICRzZWxmLT57bXR5cGV9OworICAgICQkc2VxaWQgPSAkc2VsZi0+e3JzZXFpZH07Cit9CisKK3BhY2thZ2UgVGhyaWZ0OjpNdWx0aXBsZXhlZFByb2Nlc3NvcjsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKKworc3ViIG5ldyB7CisgICAgbXkgJGNsYXNzbmFtZSA9IHNoaWZ0OworICAgIG15ICRzZWxmICAgICAgPSB7fTsKKworICAgICRzZWxmLT57c2VydmljZVByb2Nlc3Nvck1hcH0gPSB7fTsKKyAgICAkc2VsZi0+e2RlZmF1bHRQcm9jZXNzb3J9ID0gdW5kZWY7CisKKyAgICByZXR1cm4gYmxlc3MoJHNlbGYsJGNsYXNzbmFtZSk7Cit9CisKK3N1YiBkZWZhdWx0UHJvY2Vzc29yIHsKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICRwcm9jZXNzb3IgPSBzaGlmdDsKKworICAgICRzZWxmLT57ZGVmYXVsdFByb2Nlc3Nvcn0gPSAkcHJvY2Vzc29yOworfQorCitzdWIgcmVnaXN0ZXJQcm9jZXNzb3IgeworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJHNlcnZpY2VOYW1lID0gc2hpZnQ7CisgICAgbXkgJHByb2Nlc3NvciA9IHNoaWZ0OworCisgICAgICRzZWxmLT57c2VydmljZVByb2Nlc3Nvck1hcH0tPnskc2VydmljZU5hbWV9ID0gJHByb2Nlc3NvcjsKK30KKworc3ViIHByb2Nlc3MgeworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJGlucHV0ID0gc2hpZnQ7CisgICAgbXkgJG91dHB1dCA9IHNoaWZ0OworCisgICAgIworICAgICMgIFVzZSB0aGUgYWN0dWFsIHVuZGVybHlpbmcgcHJvdG9jb2wgKGUuZy4gQmluYXJ5UHJvdG9jb2wpIHRvIHJlYWQgdGhlCisgICAgIyAgbWVzc2FnZSBoZWFkZXIuIFRoaXMgcHVsbHMgdGhlIG1lc3NhZ2UgIm9mZiB0aGUgd2lyZSIsIHdoaWNoIHdlJ2xsCisgICAgIyAgZGVhbCB3aXRoIGF0IHRoZSBlbmQgb2YgdGhpcyBtZXRob2QuCisgICAgIworCisgICAgbXkgKCRmbmFtZSwgJG10eXBlLCAkcnNlcWlkKTsKKyAgICAkaW5wdXQtPnJlYWRNZXNzYWdlQmVnaW4oXCRmbmFtZSwgXCRtdHlwZSwgXCRyc2VxaWQpOworCisgICAgaWYgKCRtdHlwZSBuZSBUaHJpZnQ6OlRNZXNzYWdlVHlwZTo6Q0FMTCAmJiAkbXR5cGUgbmUgVGhyaWZ0OjpUTWVzc2FnZVR5cGU6Ok9ORVdBWSkgeworICAgICAgICBkaWUgVGhyaWZ0OjpURXhjZXB0aW9uLT5uZXcoJ1RoaXMgc2hvdWxkIG5vdCBoYXZlIGhhcHBlbmVkIT8nKTsKKyAgICB9CisKKyAgICAjIEV4dHJhY3QgdGhlIHNlcnZpY2UgbmFtZSBhbmQgdGhlIG5ldyBNZXNzYWdlIG5hbWUuCisgICAgaWYgKGluZGV4KCRmbmFtZSwgVGhyaWZ0OjpNdWx0aXBsZXhlZFByb3RvY29sOjpTRVBBUkFUT1IpID09IC0xKSB7CisgICAgICAgIGlmIChkZWZpbmVkICRzZWxmLT57ZGVmYXVsdFByb2Nlc3Nvcn0pIHsKKyAgICAgICAgICAgIHJldHVybiAkc2VsZi0+e2RlZmF1bHRQcm9jZXNzb3J9LT5wcm9jZXNzKAorICAgICAgICAgICAgICAgIFRocmlmdDo6U3RvcmVkTWVzc2FnZVByb3RvY29sLT5uZXcoJGlucHV0LCAkZm5hbWUsICRtdHlwZSwgJHJzZXFpZCksICRvdXRwdXQKKyAgICAgICAgICAgICk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkaWUgVGhyaWZ0OjpURXhjZXB0aW9uLT5uZXcoIlNlcnZpY2UgbmFtZSBub3QgZm91bmQgaW4gbWVzc2FnZSBuYW1lOiB7JGZuYW1lfSBhbmQgbm8gZGVmYXVsdCBwcm9jZXNzb3IgZGVmaW5lZC4gRGlkIHlvdSAiIC4KKyAgICAgICAgICAgICAgICAnZm9yZ2V0IHRvIHVzZSBhIE11bHRpcGxleFByb3RvY29sIGluIHlvdXIgY2xpZW50PycpOworICAgICAgICB9CisgICAgfQorCisgICAgKG15ICRzZXJ2aWNlTmFtZSwgbXkgJG1lc3NhZ2VOYW1lKSA9IHNwbGl0KCc6JywgJGZuYW1lLCAyKTsKKworICAgIGlmICghZXhpc3RzKCRzZWxmLT57c2VydmljZVByb2Nlc3Nvck1hcH0tPnskc2VydmljZU5hbWV9KSkgeworICAgICAgICBkaWUgVGhyaWZ0OjpURXhjZXB0aW9uLT5uZXcoIlNlcnZpY2UgbmFtZSBub3QgZm91bmQ6IHskc2VydmljZU5hbWV9LiAgRGlkIHlvdSBmb3JnZXQgIiAuCisgICAgICAgICAgICAndG8gY2FsbCByZWdpc3RlclByb2Nlc3NvcigpPycpOworICAgIH0KKworICAgICMgRGlzcGF0Y2ggcHJvY2Vzc2luZyB0byB0aGUgc3RvcmVkIHByb2Nlc3NvcgorICAgIG15ICRwcm9jZXNzb3IgPSAkc2VsZi0+e3NlcnZpY2VQcm9jZXNzb3JNYXB9LT57JHNlcnZpY2VOYW1lfTsKKyAgICByZXR1cm4gJHByb2Nlc3Nvci0+cHJvY2VzcygKKyAgICAgICAgVGhyaWZ0OjpTdG9yZWRNZXNzYWdlUHJvdG9jb2wtPm5ldygkaW5wdXQsICRtZXNzYWdlTmFtZSwgJG10eXBlLCAkcnNlcWlkKSwgJG91dHB1dAorICAgICk7Cit9CisKKzE7CmRpZmYgLS1naXQgYS9saWIvcGVybC9saWIvVGhyaWZ0L011bHRpcGxleGVkUHJvdG9jb2wucG0gYi9saWIvcGVybC9saWIvVGhyaWZ0L011bHRpcGxleGVkUHJvdG9jb2wucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI1YjYwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvTXVsdGlwbGV4ZWRQcm90b2NvbC5wbQpAQCAtMCwwICsxLDY4IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKwordXNlIDUuMTAuMDsKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7CisKK3VzZSBUaHJpZnQ7Cit1c2UgVGhyaWZ0OjpNZXNzYWdlVHlwZTsKK3VzZSBUaHJpZnQ6OlByb3RvY29sOwordXNlIFRocmlmdDo6UHJvdG9jb2xEZWNvcmF0b3I7CisKK3BhY2thZ2UgVGhyaWZ0OjpNdWx0aXBsZXhlZFByb3RvY29sOwordXNlIGJhc2UgcXcoVGhyaWZ0OjpQcm90b2NvbERlY29yYXRvcik7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CisKK3VzZSBjb25zdGFudCBTRVBBUkFUT1IgID0+ICc6JzsKKworc3ViIG5ldyB7CisgICAgbXkgJGNsYXNzbmFtZSA9IHNoaWZ0OworICAgIG15ICRwcm90b2NvbCAgPSBzaGlmdDsKKyAgICBteSAkc2VydmljZU5hbWUgID0gc2hpZnQ7CisgICAgbXkgJHNlbGYgICAgICA9ICRjbGFzc25hbWUtPlNVUEVSOjpuZXcoJHByb3RvY29sKTsKKworICAgICRzZWxmLT57c2VydmljZU5hbWV9ID0gJHNlcnZpY2VOYW1lOworCisgICAgcmV0dXJuIGJsZXNzKCRzZWxmLCRjbGFzc25hbWUpOworfQorCisjCisjIFdyaXRlcyB0aGUgbWVzc2FnZSBoZWFkZXIuCisjIFByZXBlbmRzIHRoZSBzZXJ2aWNlIG5hbWUgdG8gdGhlIGZ1bmN0aW9uIG5hbWUsIHNlcGFyYXRlZCBieSBNdWx0aXBsZXhlZFByb3RvY29sOjpTRVBBUkFUT1IuCisjCisjIEBwYXJhbSBzdHJpbmcgJG5hbWUgIEZ1bmN0aW9uIG5hbWUuCisjIEBwYXJhbSBpbnQgICAgJHR5cGUgIE1lc3NhZ2UgdHlwZS4KKyMgQHBhcmFtIGludCAgICAkc2VxaWQgVGhlIHNlcXVlbmNlIGlkIG9mIHRoaXMgbWVzc2FnZS4KKyMKK3N1YiB3cml0ZU1lc3NhZ2VCZWdpbgoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgKCRuYW1lLCAkdHlwZSwgJHNlcWlkKSA9IEBfOworCisgICAgaWYgKCR0eXBlID09IFRocmlmdDo6VE1lc3NhZ2VUeXBlOjpDQUxMIHx8ICR0eXBlID09IFRocmlmdDo6VE1lc3NhZ2VUeXBlOjpPTkVXQVkpIHsKKyAgICAgICAgbXkgJG5hbWVXaXRoU2VydmljZSA9ICRzZWxmLT57c2VydmljZU5hbWV9LlNFUEFSQVRPUi4kbmFtZTsKKyAgICAgICAgJHNlbGYtPlNVUEVSOjp3cml0ZU1lc3NhZ2VCZWdpbigkbmFtZVdpdGhTZXJ2aWNlLCAkdHlwZSwgJHNlcWlkKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICRzZWxmLT5TVVBFUjo6d3JpdGVNZXNzYWdlQmVnaW4oJG5hbWUsICR0eXBlLCAkc2VxaWQpOworICAgIH0KK30KKworMTsKZGlmZiAtLWdpdCBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvUHJvdG9jb2wucG0gYi9saWIvcGVybC9saWIvVGhyaWZ0L1Byb3RvY29sLnBtCmluZGV4IDNlOWYwZGQuLjI2ZWY0NmEgMTAwNjQ0Ci0tLSBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvUHJvdG9jb2wucG0KKysrIGIvbGliL3BlcmwvbGliL1RocmlmdC9Qcm90b2NvbC5wbQpAQCAtMTcsMjYgKzE3LDI4IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1yZXF1aXJlIDUuNi4wOwordXNlIDUuMTAuMDsKIHVzZSBzdHJpY3Q7CiB1c2Ugd2FybmluZ3M7CiAKIHVzZSBUaHJpZnQ7Cit1c2UgVGhyaWZ0OjpFeGNlcHRpb247Cit1c2UgVGhyaWZ0OjpUeXBlOwogCiAjCiAjIFByb3RvY29sIGV4Y2VwdGlvbnMKICMKLXBhY2thZ2UgVFByb3RvY29sRXhjZXB0aW9uOworcGFja2FnZSBUaHJpZnQ6OlRQcm90b2NvbEV4Y2VwdGlvbjsKIHVzZSBiYXNlKCdUaHJpZnQ6OlRFeGNlcHRpb24nKTsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKIAotdXNlIGNvbnN0YW50IFVOS05PV04gICAgICAgPT4gMDsKLXVzZSBjb25zdGFudCBJTlZBTElEX0RBVEEgID0+IDE7Ci11c2UgY29uc3RhbnQgTkVHQVRJVkVfU0laRSA9PiAyOwotdXNlIGNvbnN0YW50IFNJWkVfTElNSVQgICAgPT4gMzsKLXVzZSBjb25zdGFudCBCQURfVkVSU0lPTiAgID0+IDQ7Cit1c2UgY29uc3RhbnQgVU5LTk9XTiAgICAgICAgID0+IDA7Cit1c2UgY29uc3RhbnQgSU5WQUxJRF9EQVRBICAgID0+IDE7Cit1c2UgY29uc3RhbnQgTkVHQVRJVkVfU0laRSAgID0+IDI7Cit1c2UgY29uc3RhbnQgU0laRV9MSU1JVCAgICAgID0+IDM7Cit1c2UgY29uc3RhbnQgQkFEX1ZFUlNJT04gICAgID0+IDQ7CiB1c2UgY29uc3RhbnQgTk9UX0lNUExFTUVOVEVEID0+IDU7Ci11c2UgY29uc3RhbnQgREVQVEhfTElNSVQgICA9PiA2OwotCit1c2UgY29uc3RhbnQgREVQVEhfTElNSVQgICAgID0+IDY7CiAKIHN1YiBuZXcgewogICAgIG15ICRjbGFzc25hbWUgPSBzaGlmdDsKQEAgLTUwLDYgKzUyLDcgQEAKICMgUHJvdG9jb2wgYmFzZSBjbGFzcyBtb2R1bGUuCiAjCiBwYWNrYWdlIFRocmlmdDo6UHJvdG9jb2w7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CiAKIHN1YiBuZXcgewogICAgIG15ICRjbGFzc25hbWUgPSBzaGlmdDsKQEAgLTc4LDM3ICs4MSwzNyBAQAogc3ViIHdyaXRlTWVzc2FnZUJlZ2luCiB7CiAgICAgbXkgKCRuYW1lLCAkdHlwZSwgJHNlcWlkKTsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogIwogIyBDbG9zZSB0aGUgbWVzc2FnZQogIwogc3ViIHdyaXRlTWVzc2FnZUVuZCB7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKICMKICMgV3JpdGVzIGEgc3RydWN0IGhlYWRlci4KICMKICMgQHBhcmFtIHN0cmluZyAgICAgJG5hbWUgU3RydWN0IG5hbWUKLSMgQHRocm93cyBURXhjZXB0aW9uIG9uIHdyaXRlIGVycm9yCisjIEB0aHJvd3MgVFByb3RvY29sRXhjZXB0aW9uIG9uIHdyaXRlIGVycm9yCiAjIEByZXR1cm4gaW50IEhvdyBtYW55IGJ5dGVzIHdyaXR0ZW4KICMKIHN1YiB3cml0ZVN0cnVjdEJlZ2luIHsKICAgICBteSAoJG5hbWUpOwogCi0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKICMKICMgQ2xvc2UgYSBzdHJ1Y3QuCiAjCi0jIEB0aHJvd3MgVEV4Y2VwdGlvbiBvbiB3cml0ZSBlcnJvcgorIyBAdGhyb3dzIFRQcm90b2NvbEV4Y2VwdGlvbiBvbiB3cml0ZSBlcnJvcgogIyBAcmV0dXJuIGludCBIb3cgbWFueSBieXRlcyB3cml0dGVuCiAjCiBzdWIgd3JpdGVTdHJ1Y3RFbmQgewotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiAjCkBAIC0xMTcsODUgKzEyMCw4NSBAQAogIyBAcGFyYW0gc3RyaW5nICAgICAkbmFtZSBGaWVsZCBuYW1lCiAjIEBwYXJhbSBpbnQgICAgICAgICR0eXBlIEZpZWxkIHR5cGUKICMgQHBhcmFtIGludCAgICAgICAgJGZpZCAgRmllbGQgaWQKLSMgQHRocm93cyBURXhjZXB0aW9uIG9uIHdyaXRlIGVycm9yCisjIEB0aHJvd3MgVFByb3RvY29sRXhjZXB0aW9uIG9uIHdyaXRlIGVycm9yCiAjIEByZXR1cm4gaW50IEhvdyBtYW55IGJ5dGVzIHdyaXR0ZW4KICMKIHN1YiB3cml0ZUZpZWxkQmVnaW4gewogICAgIG15ICgkZmllbGROYW1lLCAkZmllbGRUeXBlLCAkZmllbGRJZCk7CiAKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHdyaXRlRmllbGRFbmQgewotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgd3JpdGVGaWVsZFN0b3AgewotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgd3JpdGVNYXBCZWdpbiB7CiAgICAgbXkgKCRrZXlUeXBlLCAkdmFsVHlwZSwgJHNpemUpOwogCi0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiB3cml0ZU1hcEVuZCB7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiB3cml0ZUxpc3RCZWdpbiB7CiAgICAgbXkgKCRlbGVtVHlwZSwgJHNpemUpOwotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgd3JpdGVMaXN0RW5kIHsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHdyaXRlU2V0QmVnaW4gewogICAgIG15ICgkZWxlbVR5cGUsICRzaXplKTsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHdyaXRlU2V0RW5kIHsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHdyaXRlQm9vbCB7CiAgICAgbXkgKCRib29sKTsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHdyaXRlQnl0ZSB7CiAgICAgbXkgKCRieXRlKTsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHdyaXRlSTE2IHsKICAgICBteSAoJGkxNik7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiB3cml0ZUkzMiB7CiAgICAgbXkgKCRpMzIpOwotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgd3JpdGVJNjQgewogICAgIG15ICgkaTY0KTsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHdyaXRlRG91YmxlIHsKICAgICBteSAoJGR1Yik7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiB3cml0ZVN0cmluZwogewogICAgIG15ICgkc3RyKTsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogIwpAQCAtMjA4LDcgKzIxMSw3IEBACiBzdWIgcmVhZE1lc3NhZ2VCZWdpbgogewogICAgIG15ICgkbmFtZSwgJHR5cGUsICRzZXFpZCk7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKICMKQEAgLTIxNiwxMDUgKzIxOSwxMDUgQEAKICMKIHN1YiByZWFkTWVzc2FnZUVuZAogewotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgcmVhZFN0cnVjdEJlZ2luCiB7CiAgICAgbXkoJG5hbWUpOwogCi0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiByZWFkU3RydWN0RW5kCiB7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiByZWFkRmllbGRCZWdpbgogewogICAgIG15ICgkbmFtZSwgJGZpZWxkVHlwZSwgJGZpZWxkSWQpOwotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgcmVhZEZpZWxkRW5kCiB7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiByZWFkTWFwQmVnaW4KIHsKICAgICBteSAoJGtleVR5cGUsICR2YWxUeXBlLCAkc2l6ZSk7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiByZWFkTWFwRW5kCiB7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiByZWFkTGlzdEJlZ2luCiB7CiAgICAgbXkgKCRlbGVtVHlwZSwgJHNpemUpOwotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgcmVhZExpc3RFbmQKIHsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHJlYWRTZXRCZWdpbgogewogICAgIG15ICgkZWxlbVR5cGUsICRzaXplKTsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHJlYWRTZXRFbmQKIHsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHJlYWRCb29sCiB7CiAgICAgbXkgKCRib29sKTsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHJlYWRCeXRlCiB7CiAgICAgbXkgKCRieXRlKTsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHJlYWRJMTYKIHsKICAgICBteSAoJGkxNik7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiByZWFkSTMyCiB7CiAgICAgbXkgKCRpMzIpOwotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgcmVhZEk2NAogewogICAgIG15ICgkaTY0KTsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHJlYWREb3VibGUKIHsKICAgICBteSAoJGR1Yik7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiByZWFkU3RyaW5nCiB7CiAgICAgbXkgKCRzdHIpOwotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiAjCkBAIC0zMzIsMzYgKzMzNSwzNiBAQAogICAgIG15ICRyZXN1bHQ7CiAgICAgbXkgJGk7CiAKLSAgICBpZigkdHlwZSA9PSBUVHlwZTo6Qk9PTCkKKyAgICBpZigkdHlwZSA9PSBUaHJpZnQ6OlRUeXBlOjpCT09MKQogICAgIHsKICAgICAgICAgcmV0dXJuICRzZWxmLT5yZWFkQm9vbChcJHJlZik7CiAgICAgfQotICAgIGVsc2lmKCR0eXBlID09IFRUeXBlOjpCWVRFKXsKKyAgICBlbHNpZigkdHlwZSA9PSBUaHJpZnQ6OlRUeXBlOjpCWVRFKXsKICAgICAgICAgcmV0dXJuICRzZWxmLT5yZWFkQnl0ZShcJHJlZik7CiAgICAgfQotICAgIGVsc2lmKCR0eXBlID09IFRUeXBlOjpJMTYpeworICAgIGVsc2lmKCR0eXBlID09IFRocmlmdDo6VFR5cGU6OkkxNil7CiAgICAgICAgIHJldHVybiAkc2VsZi0+cmVhZEkxNihcJHJlZik7CiAgICAgfQotICAgIGVsc2lmKCR0eXBlID09IFRUeXBlOjpJMzIpeworICAgIGVsc2lmKCR0eXBlID09IFRocmlmdDo6VFR5cGU6OkkzMil7CiAgICAgICAgIHJldHVybiAkc2VsZi0+cmVhZEkzMihcJHJlZik7CiAgICAgfQotICAgIGVsc2lmKCR0eXBlID09IFRUeXBlOjpJNjQpeworICAgIGVsc2lmKCR0eXBlID09IFRocmlmdDo6VFR5cGU6Okk2NCl7CiAgICAgICAgIHJldHVybiAkc2VsZi0+cmVhZEk2NChcJHJlZik7CiAgICAgfQotICAgIGVsc2lmKCR0eXBlID09IFRUeXBlOjpET1VCTEUpeworICAgIGVsc2lmKCR0eXBlID09IFRocmlmdDo6VFR5cGU6OkRPVUJMRSl7CiAgICAgICAgIHJldHVybiAkc2VsZi0+cmVhZERvdWJsZShcJHJlZik7CiAgICAgfQotICAgIGVsc2lmKCR0eXBlID09IFRUeXBlOjpTVFJJTkcpCisgICAgZWxzaWYoJHR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6U1RSSU5HKQogICAgIHsKICAgICAgICAgcmV0dXJuICRzZWxmLT5yZWFkU3RyaW5nKFwkcmVmKTsKICAgICB9Ci0gICAgZWxzaWYoJHR5cGUgPT0gVFR5cGU6OlNUUlVDVCkKKyAgICBlbHNpZigkdHlwZSA9PSBUaHJpZnQ6OlRUeXBlOjpTVFJVQ1QpCiAgICAgewogICAgICAgICAkcmVzdWx0ID0gJHNlbGYtPnJlYWRTdHJ1Y3RCZWdpbihcJHJlZik7CiAgICAgICAgIHdoaWxlICgxKSB7CiAgICAgICAgICAgICBteSAoJGZ0eXBlLCRmaWQpOwogICAgICAgICAgICAgJHJlc3VsdCArPSAkc2VsZi0+cmVhZEZpZWxkQmVnaW4oXCRyZWYsIFwkZnR5cGUsIFwkZmlkKTsKLSAgICAgICAgICAgIGlmICgkZnR5cGUgPT0gVFR5cGU6OlNUT1ApIHsKKyAgICAgICAgICAgIGlmICgkZnR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6U1RPUCkgewogICAgICAgICAgICAgICAgIGxhc3Q7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAkcmVzdWx0ICs9ICRzZWxmLT5za2lwKCRmdHlwZSk7CkBAIC0zNzAsNyArMzczLDcgQEAKICAgICAgICAgJHJlc3VsdCArPSAkc2VsZi0+cmVhZFN0cnVjdEVuZCgpOwogICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgICB9Ci0gICAgZWxzaWYoJHR5cGUgPT0gVFR5cGU6Ok1BUCkKKyAgICBlbHNpZigkdHlwZSA9PSBUaHJpZnQ6OlRUeXBlOjpNQVApCiAgICAgewogICAgICAgICBteSgka2V5VHlwZSwkdmFsVHlwZSwkc2l6ZSk7CiAgICAgICAgICRyZXN1bHQgPSAkc2VsZi0+cmVhZE1hcEJlZ2luKFwka2V5VHlwZSwgXCR2YWxUeXBlLCBcJHNpemUpOwpAQCAtMzgxLDcgKzM4NCw3IEBACiAgICAgICAgICRyZXN1bHQgKz0gJHNlbGYtPnJlYWRNYXBFbmQoKTsKICAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICAgfQotICAgIGVsc2lmKCR0eXBlID09IFRUeXBlOjpTRVQpCisgICAgZWxzaWYoJHR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6U0VUKQogICAgIHsKICAgICAgICAgbXkgKCRlbGVtVHlwZSwkc2l6ZSk7CiAgICAgICAgICRyZXN1bHQgPSAkc2VsZi0+cmVhZFNldEJlZ2luKFwkZWxlbVR5cGUsIFwkc2l6ZSk7CkBAIC0zOTEsNyArMzk0LDcgQEAKICAgICAgICAgJHJlc3VsdCArPSAkc2VsZi0+cmVhZFNldEVuZCgpOwogICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgICB9Ci0gICAgZWxzaWYoJHR5cGUgPT0gVFR5cGU6OkxJU1QpCisgICAgZWxzaWYoJHR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6TElTVCkKICAgICB7CiAgICAgICAgIG15ICgkZWxlbVR5cGUsJHNpemUpOwogICAgICAgICAkcmVzdWx0ID0gJHNlbGYtPnJlYWRMaXN0QmVnaW4oXCRlbGVtVHlwZSwgXCRzaXplKTsKQEAgLTQwMiw3ICs0MDUsOCBAQAogICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgICB9CiAKLSAgICBkaWUgbmV3IFRocmlmdDo6VEV4Y2VwdGlvbigiVHlwZSAkdHlwZSBub3QgcmVjb2duaXNlZCAtLS0gY29ycnVwdCBkYXRhPyIpOworICAgIGRpZSBUaHJpZnQ6OlRQcm90b2NvbEV4Y2VwdGlvbi0+bmV3KCJUeXBlICR0eXBlIG5vdCByZWNvZ25pemVkIC0tLSBjb3JydXB0IGRhdGE/IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdDo6VFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEpOwogCiAgIH0KIApAQCAtNDE4LDMxICs0MjIsMzEgQEAKICAgICBteSAkaXRyYW5zID0gc2hpZnQ7CiAgICAgbXkgJHR5cGUgICA9IHNoaWZ0OwogCi0gICAgaWYoJHR5cGUgPT0gVFR5cGU6OkJPT0wpCi0gICAgewotICAgICAgcmV0dXJuICRpdHJhbnMtPnJlYWRBbGwoMSk7Ci0gICAgfQotICAgIGVsc2lmKCR0eXBlID09IFRUeXBlOjpCWVRFKQorICAgIGlmKCR0eXBlID09IFRocmlmdDo6VFR5cGU6OkJPT0wpCiAgICAgewogICAgICAgICByZXR1cm4gJGl0cmFucy0+cmVhZEFsbCgxKTsKICAgICB9Ci0gICAgZWxzaWYoJHR5cGUgPT0gVFR5cGU6OkkxNikKKyAgICBlbHNpZigkdHlwZSA9PSBUaHJpZnQ6OlRUeXBlOjpCWVRFKQorICAgIHsKKyAgICAgICAgcmV0dXJuICRpdHJhbnMtPnJlYWRBbGwoMSk7CisgICAgfQorICAgIGVsc2lmKCR0eXBlID09IFRocmlmdDo6VFR5cGU6OkkxNikKICAgICB7CiAgICAgICAgIHJldHVybiAkaXRyYW5zLT5yZWFkQWxsKDIpOwogICAgIH0KLSAgICBlbHNpZigkdHlwZSA9PSBUVHlwZTo6STMyKQorICAgIGVsc2lmKCR0eXBlID09IFRocmlmdDo6VFR5cGU6OkkzMikKICAgICB7CiAgICAgICAgIHJldHVybiAkaXRyYW5zLT5yZWFkQWxsKDQpOwogICAgIH0KLSAgICBlbHNpZigkdHlwZSA9PSBUVHlwZTo6STY0KQorICAgIGVsc2lmKCR0eXBlID09IFRocmlmdDo6VFR5cGU6Okk2NCkKICAgICB7CiAgICAgICAgIHJldHVybiAkaXRyYW5zLT5yZWFkQWxsKDgpOwogICAgIH0KLSAgICBlbHNpZigkdHlwZSA9PSBUVHlwZTo6RE9VQkxFKQorICAgIGVsc2lmKCR0eXBlID09IFRocmlmdDo6VFR5cGU6OkRPVUJMRSkKICAgICB7CiAgICAgICAgIHJldHVybiAkaXRyYW5zLT5yZWFkQWxsKDgpOwogICAgIH0KLSAgICBlbHNpZiggJHR5cGUgPT0gVFR5cGU6OlNUUklORyApCisgICAgZWxzaWYoICR0eXBlID09IFRocmlmdDo6VFR5cGU6OlNUUklORyApCiAgICAgewogICAgICAgICBteSBAbGVuID0gdW5wYWNrKCdOJywgJGl0cmFucy0+cmVhZEFsbCg0KSk7CiAgICAgICAgIG15ICRsZW4gPSAkbGVuWzBdOwpAQCAtNDUxLDI1ICs0NTUsMjUgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gNCArICRpdHJhbnMtPnJlYWRBbGwoJGxlbik7CiAgICAgfQotICAgIGVsc2lmKCAkdHlwZSA9PSBUVHlwZTo6U1RSVUNUICkKKyAgICBlbHNpZiggJHR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6U1RSVUNUICkKICAgICB7CiAgICAgICAgIG15ICRyZXN1bHQgPSAwOwogICAgICAgICB3aGlsZSAoMSkgewotICAgICAgICAgIG15ICRmdHlwZSA9IDA7Ci0gICAgICAgICAgbXkgJGZpZCA9IDA7Ci0gICAgICAgICAgbXkgJGRhdGEgPSAkaXRyYW5zLT5yZWFkQWxsKDEpOwotICAgICAgICAgIG15IEBhcnIgPSB1bnBhY2soJ2MnLCAkZGF0YSk7Ci0gICAgICAgICAgJGZ0eXBlID0gJGFyclswXTsKLSAgICAgICAgICBpZiAoJGZ0eXBlID09IFRUeXBlOjpTVE9QKSB7Ci0gICAgICAgICAgICBsYXN0OwotICAgICAgICAgIH0KLSAgICAgICAgICAjIEkxNiBmaWVsZCBpZAotICAgICAgICAgICRyZXN1bHQgKz0gJGl0cmFucy0+cmVhZEFsbCgyKTsKLSAgICAgICAgICAkcmVzdWx0ICs9ICRzZWxmLT5za2lwQmluYXJ5KCRpdHJhbnMsICRmdHlwZSk7CisgICAgICAgICAgICBteSAkZnR5cGUgPSAwOworICAgICAgICAgICAgbXkgJGZpZCA9IDA7CisgICAgICAgICAgICBteSAkZGF0YSA9ICRpdHJhbnMtPnJlYWRBbGwoMSk7CisgICAgICAgICAgICBteSBAYXJyID0gdW5wYWNrKCdjJywgJGRhdGEpOworICAgICAgICAgICAgJGZ0eXBlID0gJGFyclswXTsKKyAgICAgICAgICAgIGlmICgkZnR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6U1RPUCkgeworICAgICAgICAgICAgICAgIGxhc3Q7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAjIEkxNiBmaWVsZCBpZAorICAgICAgICAgICAgJHJlc3VsdCArPSAkaXRyYW5zLT5yZWFkQWxsKDIpOworICAgICAgICAgICAgJHJlc3VsdCArPSAkc2VsZi0+c2tpcEJpbmFyeSgkaXRyYW5zLCAkZnR5cGUpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiAkcmVzdWx0OwogICAgIH0KLSAgICBlbHNpZigkdHlwZSA9PSBUVHlwZTo6TUFQKQorICAgIGVsc2lmKCR0eXBlID09IFRocmlmdDo6VFR5cGU6Ok1BUCkKICAgICB7CiAgICAgICAgICMgS3R5cGUKICAgICAgICAgbXkgJGRhdGEgPSAkaXRyYW5zLT5yZWFkQWxsKDEpOwpAQCAtNDkzLDcgKzQ5Nyw3IEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICAgfQotICAgIGVsc2lmKCR0eXBlID09IFRUeXBlOjpTRVQgfHwgJHR5cGUgPT0gVFR5cGU6OkxJU1QpCisgICAgZWxzaWYoJHR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6U0VUIHx8ICR0eXBlID09IFRocmlmdDo6VFR5cGU6OkxJU1QpCiAgICAgewogICAgICAgICAjIFZ0eXBlCiAgICAgICAgIG15ICRkYXRhID0gJGl0cmFucy0+cmVhZEFsbCgxKTsKQEAgLTUxMywxNCArNTE3LDE1IEBACiAgICAgICAgIHJldHVybiAkcmVzdWx0OwogICAgIH0KIAotICAgIGRpZSBuZXcgVGhyaWZ0OjpURXhjZXB0aW9uKCJUeXBlICR0eXBlIG5vdCByZWNvZ25pc2VkIC0tLSBjb3JydXB0IGRhdGE/Iik7CisgICAgZGllIFRocmlmdDo6VFByb3RvY29sRXhjZXB0aW9uLT5uZXcoIlR5cGUgJHR5cGUgbm90IHJlY29nbml6ZWQgLS0tIGNvcnJ1cHQgZGF0YT8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0OjpUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSk7CiB9CiAKICMKICMgUHJvdG9jb2wgZmFjdG9yeSBjcmVhdGVzIHByb3RvY29sIG9iamVjdHMgZnJvbSB0cmFuc3BvcnRzCiAjCi1wYWNrYWdlIFRQcm90b2NvbEZhY3Rvcnk7Ci0KK3BhY2thZ2UgVGhyaWZ0OjpUUHJvdG9jb2xGYWN0b3J5OwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOwogCiBzdWIgbmV3IHsKICAgICBteSAkY2xhc3NuYW1lID0gc2hpZnQ7CkBAIC01MzcsNyArNTQyLDcgQEAKIHN1YiBnZXRQcm90b2NvbAogewogICAgIG15ICgkdHJhbnMpOwotICAgIGRpZSAiaW50ZXJmYWNlIjsKKyAgICBkaWUgJ2ludGVyZmFjZSc7CiB9CiAKIApkaWZmIC0tZ2l0IGEvbGliL3BlcmwvbGliL1RocmlmdC9Qcm90b2NvbERlY29yYXRvci5wbSBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvUHJvdG9jb2xEZWNvcmF0b3IucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M1YzlkYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvUHJvdG9jb2xEZWNvcmF0b3IucG0KQEAgLTAsMCArMSwzNjMgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCit1c2UgNS4xMC4wOwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKwordXNlIFRocmlmdDsKK3VzZSBUaHJpZnQ6OlByb3RvY29sOworCitwYWNrYWdlIFRocmlmdDo6UHJvdG9jb2xEZWNvcmF0b3I7Cit1c2UgYmFzZSBxdyhUaHJpZnQ6OlByb3RvY29sKTsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKKworc3ViIG5ldyB7CisgICAgbXkgJGNsYXNzbmFtZSA9IHNoaWZ0OworICAgIG15ICRwcm90b2NvbCAgPSBzaGlmdDsKKyAgICBteSAkc2VsZiAgICAgID0gJGNsYXNzbmFtZS0+U1VQRVI6Om5ldygkcHJvdG9jb2wtPmdldFRyYW5zcG9ydCgpKTsKKworICAgICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0gPSAkcHJvdG9jb2w7CisKKyAgICByZXR1cm4gYmxlc3MoJHNlbGYsJGNsYXNzbmFtZSk7Cit9CisKKyMKKyMgV3JpdGVzIHRoZSBtZXNzYWdlIGhlYWRlcgorIworIyBAcGFyYW0gc3RyaW5nICRuYW1lIEZ1bmN0aW9uIG5hbWUKKyMgQHBhcmFtIGludCAkdHlwZSBtZXNzYWdlIHR5cGUgVE1lc3NhZ2VUeXBlOjpDQUxMIG9yIFRNZXNzYWdlVHlwZTo6UkVQTFkKKyMgQHBhcmFtIGludCAkc2VxaWQgVGhlIHNlcXVlbmNlIGlkIG9mIHRoaXMgbWVzc2FnZQorIworc3ViIHdyaXRlTWVzc2FnZUJlZ2luIHsKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICgkbmFtZSwgJHR5cGUsICRzZXFpZCkgPSBAXzsKKworICAgICAgcmV0dXJuICAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9LT53cml0ZU1lc3NhZ2VCZWdpbigkbmFtZSwgJHR5cGUsICRzZXFpZCk7Cit9CisKKyMKKyMgQ2xvc2UgdGhlIG1lc3NhZ2UKKyMKK3N1YiB3cml0ZU1lc3NhZ2VFbmQgeworICAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgIHJldHVybiAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9LT53cml0ZU1lc3NhZ2VFbmQoKTsKK30KKworIworIyBXcml0ZXMgYSBzdHJ1Y3QgaGVhZGVyLgorIworIyBAcGFyYW0gc3RyaW5nICAgICAkbmFtZSBTdHJ1Y3QgbmFtZQorIyBAdGhyb3dzIFRFeGNlcHRpb24gb24gd3JpdGUgZXJyb3IKKyMgQHJldHVybiBpbnQgSG93IG1hbnkgYnl0ZXMgd3JpdHRlbgorIworc3ViIHdyaXRlU3RydWN0QmVnaW4geworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgKCRuYW1lKSA9IEBfOworCisgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPndyaXRlU3RydWN0QmVnaW4oJG5hbWUpOworfQorCisjCisjIENsb3NlIGEgc3RydWN0LgorIworIyBAdGhyb3dzIFRFeGNlcHRpb24gb24gd3JpdGUgZXJyb3IKKyMgQHJldHVybiBpbnQgSG93IG1hbnkgYnl0ZXMgd3JpdHRlbgorIworc3ViIHdyaXRlU3RydWN0RW5kIHsKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPndyaXRlU3RydWN0RW5kKCk7Cit9CisKKyMKKyMgU3RhcnRzIGEgZmllbGQuCisjCisjIEBwYXJhbSBzdHJpbmcgICAgICRuYW1lIEZpZWxkIG5hbWUKKyMgQHBhcmFtIGludCAgICAgICAgJHR5cGUgRmllbGQgdHlwZQorIyBAcGFyYW0gaW50ICAgICAgICAkZmlkICBGaWVsZCBpZAorIyBAdGhyb3dzIFRFeGNlcHRpb24gb24gd3JpdGUgZXJyb3IKKyMgQHJldHVybiBpbnQgSG93IG1hbnkgYnl0ZXMgd3JpdHRlbgorIworc3ViIHdyaXRlRmllbGRCZWdpbiB7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAoJGZpZWxkTmFtZSwgJGZpZWxkVHlwZSwgJGZpZWxkSWQpID0gQF87CisKKyAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+d3JpdGVGaWVsZEJlZ2luKCRmaWVsZE5hbWUsICRmaWVsZFR5cGUsICRmaWVsZElkKTsKK30KKworc3ViIHdyaXRlRmllbGRFbmQgeworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+d3JpdGVGaWVsZEVuZCgpOworfQorCitzdWIgd3JpdGVGaWVsZFN0b3AgeworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+d3JpdGVGaWVsZFN0b3AoKTsKK30KKworc3ViIHdyaXRlTWFwQmVnaW4geworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgKCRrZXlUeXBlLCAkdmFsVHlwZSwgJHNpemUpID0gQF87CisKKyAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+d3JpdGVNYXBCZWdpbigka2V5VHlwZSwgJHZhbFR5cGUsICRzaXplKTsKK30KKworc3ViIHdyaXRlTWFwRW5kIHsKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPndyaXRlTWFwRW5kKCk7Cit9CisKK3N1YiB3cml0ZUxpc3RCZWdpbiB7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAoJGVsZW1UeXBlLCAkc2l6ZSkgPSBAXzsKKworICAgIHJldHVybiAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9LT53cml0ZUxpc3RCZWdpbigkZWxlbVR5cGUsICRzaXplKTsKK30KKworc3ViIHdyaXRlTGlzdEVuZCB7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIHJldHVybiAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9LT53cml0ZUxpc3RFbmQoKTsKK30KKworc3ViIHdyaXRlU2V0QmVnaW4geworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgKCRlbGVtVHlwZSwgJHNpemUpID0gQF87CisKKyAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+d3JpdGVTZXRCZWdpbigkZWxlbVR5cGUsICRzaXplKTsKK30KKworc3ViIHdyaXRlU2V0RW5kIHsKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPndyaXRlTGlzdEVuZCgpOworfQorCitzdWIgd3JpdGVCb29sIHsKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICRib29sID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+d3JpdGVCb29sKCRib29sKTsKK30KKworc3ViIHdyaXRlQnl0ZSB7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkYnl0ZSA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPndyaXRlQnl0ZSgkYnl0ZSk7Cit9CisKK3N1YiB3cml0ZUkxNiB7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkaTE2ID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+d3JpdGVJMTYoJGkxNik7Cit9CisKK3N1YiB3cml0ZUkzMiB7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAoJGkzMikgPSBAXzsKKworICAgIHJldHVybiAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9LT53cml0ZUkzMigkaTMyKTsKKworfQorCitzdWIgd3JpdGVJNjQgeworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJGk2NCA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPndyaXRlSTY0KCRpNjQpOworfQorCitzdWIgd3JpdGVEb3VibGUgeworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJGR1YiA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPndyaXRlRG91YmxlKCRkdWIpOworfQorCitzdWIgd3JpdGVTdHJpbmcgeworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJHN0ciA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPndyaXRlU3RyaW5nKCRzdHIpOworfQorCisjCisjIFJlYWRzIHRoZSBtZXNzYWdlIGhlYWRlcgorIworIyBAcGFyYW0gc3RyaW5nICRuYW1lIEZ1bmN0aW9uIG5hbWUKKyMgQHBhcmFtIGludCAkdHlwZSBtZXNzYWdlIHR5cGUgVE1lc3NhZ2VUeXBlOjpDQUxMIG9yIFRNZXNzYWdlVHlwZTo6UkVQTFkKKyMgQHBhcmVtIGludCAkc2VxaWQgVGhlIHNlcXVlbmNlIGlkIG9mIHRoaXMgbWVzc2FnZQorIworc3ViIHJlYWRNZXNzYWdlQmVnaW4KK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICgkbmFtZSwgJHR5cGUsICRzZXFpZCkgPSBAXzsKKworICAgIHJldHVybiAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9LT5yZWFkTWVzc2FnZUJlZ2luKCRuYW1lLCAkdHlwZSwgJHNlcWlkKTsKK30KKworIworIyBSZWFkIHRoZSBjbG9zZSBvZiBtZXNzYWdlCisjCitzdWIgcmVhZE1lc3NhZ2VFbmQKK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPnJlYWRNZXNzYWdlRW5kKCk7Cit9CisKK3N1YiByZWFkU3RydWN0QmVnaW4KK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICRuYW1lID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+cmVhZFN0cnVjdEJlZ2luKCRuYW1lKTsKK30KKworc3ViIHJlYWRTdHJ1Y3RFbmQKK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPnJlYWRTdHJ1Y3RFbmQoKTsKK30KKworc3ViIHJlYWRGaWVsZEJlZ2luCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAoJG5hbWUsICRmaWVsZFR5cGUsICRmaWVsZElkKSA9IEBfOworCisgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPnJlYWRGaWVsZEJlZ2luKCRuYW1lLCAkZmllbGRUeXBlLCAkZmllbGRJZCk7Cit9CisKK3N1YiByZWFkRmllbGRFbmQKK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPnJlYWRGaWVsZEVuZCgpOworfQorCitzdWIgcmVhZE1hcEJlZ2luCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAoJGtleVR5cGUsICR2YWxUeXBlLCAkc2l6ZSkgPSBAXzsKKworICAgIHJldHVybiAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9LT5yZWFkTWFwQmVnaW4oJGtleVR5cGUsICR2YWxUeXBlLCAkc2l6ZSk7Cit9CisKK3N1YiByZWFkTWFwRW5kCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIHJldHVybiAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9LT5yZWFkTWFwRW5kKCk7Cit9CisKK3N1YiByZWFkTGlzdEJlZ2luCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAoJGVsZW1UeXBlLCAkc2l6ZSkgPSBAXzsKKworICAgIHJldHVybiAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9LT5yZWFkTGlzdEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpOworfQorCitzdWIgcmVhZExpc3RFbmQKK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPnJlYWRMaXN0RW5kKCk7Cit9CisKK3N1YiByZWFkU2V0QmVnaW4KK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICgkZWxlbVR5cGUsICRzaXplKSA9IEBfOworCisgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPnJlYWRTZXRCZWdpbigkZWxlbVR5cGUsICRzaXplKTsKK30KKworc3ViIHJlYWRTZXRFbmQKK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPnJlYWRTZXRFbmQoKTsKK30KKworc3ViIHJlYWRCb29sCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkYm9vbCA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPnJlYWRCb29sKCRib29sKTsKK30KKworc3ViIHJlYWRCeXRlCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkYnl0ZSA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPnJlYWRCeXRlKCRieXRlKTsKK30KKworc3ViIHJlYWRJMTYKK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICRpMTYgPSBzaGlmdDsKKworICAgIHJldHVybiAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9LT5yZWFkSTE2KCRpMTYpOworfQorCitzdWIgcmVhZEkzMgoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJGkzMiAgPSBzaGlmdDsKKworICAgIHJldHVybiAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9LT5yZWFkSTMyKCRpMzIpOworfQorCitzdWIgcmVhZEk2NAoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJGk2NCAgPSBzaGlmdDsKKworICAgIHJldHVybiAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9LT5yZWFkSTY0KCRpNjQpOworfQorCitzdWIgcmVhZERvdWJsZQoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJGR1YiAgPSBzaGlmdDsKKworICAgIHJldHVybiAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9LT5yZWFkRG91YmxlKCRkdWIpOworfQorCitzdWIgcmVhZFN0cmluZworeworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJHN0ciA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPnJlYWRTdHJpbmcoJHN0cik7Cit9CisKKzE7CmRpZmYgLS1naXQgYS9saWIvcGVybC9saWIvVGhyaWZ0L1NTTFNlcnZlclNvY2tldC5wbSBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvU1NMU2VydmVyU29ja2V0LnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiMDY0MzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGVybC9saWIvVGhyaWZ0L1NTTFNlcnZlclNvY2tldC5wbQpAQCAtMCwwICsxLDc2IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKwordXNlIDUuMTAuMDsKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7CisKK3VzZSBUaHJpZnQ7Cit1c2UgVGhyaWZ0OjpTU0xTb2NrZXQ7Cit1c2UgVGhyaWZ0OjpTZXJ2ZXJTb2NrZXQ7CisKK3VzZSBJTzo6U29ja2V0OjpTU0w7CisKK3BhY2thZ2UgVGhyaWZ0OjpTU0xTZXJ2ZXJTb2NrZXQ7Cit1c2UgYmFzZSBxdyggVGhyaWZ0OjpTZXJ2ZXJTb2NrZXQgKTsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKKworIworIyBDb25zdHJ1Y3Rvci4KKyMgVGFrZXMgYSBoYXNoOgorIyBTZWUgVGhyaWZ0OjpTb2NrZXQgZm9yIGJhc2UgY2xhc3MgcGFyYW1ldGVycy4KKyMgQHBhcmFtW2luXSAgY2EgICAgIGNlcnRpZmljYXRlIGF1dGhvcml0eSBmaWxlbmFtZSAtIG5vdCByZXF1aXJlZAorIyBAcGFyYW1baW5dICBjZXJ0ICAgY2VydGlmaWNhdGUgZmlsZW5hbWU7IG1heSBjb250YWluIGtleSBpbiB3aGljaCBjYXNlIGtleSBpcyBub3QgcmVxdWlyZWQKKyMgQHBhcmFtW2luXSAga2V5ICAgIHByaXZhdGUga2V5IGZpbGVuYW1lIGZvciB0aGUgY2VydGlmaWNhdGUgaWYgaXQgaXMgbm90IGluc2lkZSB0aGUgY2VydCBmaWxlCisjCitzdWIgbmV3Cit7CisgICAgbXkgJGNsYXNzbmFtZSA9IHNoaWZ0OworICAgIG15ICRzZWxmICAgICAgPSAkY2xhc3NuYW1lLT5TVVBFUjo6bmV3KEBfKTsKKyAgICByZXR1cm4gYmxlc3MoJHNlbGYsICRjbGFzc25hbWUpOworfQorCitzdWIgX19jbGllbnQKK3sKKyAgcmV0dXJuIFRocmlmdDo6U1NMU29ja2V0LT5uZXcoKTsKK30KKworc3ViIF9fbGlzdGVuCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkb3B0cyA9IHtMaXN0ZW4gICAgICAgID0+ICRzZWxmLT57cXVldWV9LAorICAgICAgICAgICAgICAgIExvY2FsQWRkciAgICAgPT4gJHNlbGYtPntob3N0fSwKKyAgICAgICAgICAgICAgICBMb2NhbFBvcnQgICAgID0+ICRzZWxmLT57cG9ydH0sCisgICAgICAgICAgICAgICAgUHJvdG8gICAgICAgICA9PiAndGNwJywKKyAgICAgICAgICAgICAgICBSZXVzZUFkZHIgICAgID0+IDF9OworCisgICAgbXkgJHZlcmlmeSA9IElPOjpTb2NrZXQ6OlNTTDo6U1NMX1ZFUklGWV9QRUVSIHwgSU86OlNvY2tldDo6U1NMOjpTU0xfVkVSSUZZX0ZBSUxfSUZfTk9fUEVFUl9DRVJUIHwgSU86OlNvY2tldDo6U1NMOjpTU0xfVkVSSUZZX0NMSUVOVF9PTkNFOworCisgICAgJG9wdHMtPntTU0xfY2FfZmlsZX0gICAgICA9ICRzZWxmLT57Y2F9ICAgICAgaWYgZGVmaW5lZCAkc2VsZi0+e2NhfTsKKyAgICAkb3B0cy0+e1NTTF9jZXJ0X2ZpbGV9ICAgID0gJHNlbGYtPntjZXJ0fSAgICBpZiBkZWZpbmVkICRzZWxmLT57Y2VydH07CisgICAgJG9wdHMtPntTU0xfY2lwaGVyX2xpc3R9ICA9ICRzZWxmLT57Y2lwaGVyc30gaWYgZGVmaW5lZCAkc2VsZi0+e2NpcGhlcnN9OworICAgICRvcHRzLT57U1NMX2tleV9maWxlfSAgICAgPSAkc2VsZi0+e2tleX0gICAgIGlmIGRlZmluZWQgJHNlbGYtPntrZXl9OworICAgICRvcHRzLT57U1NMX3VzZV9jZXJ0fSAgICAgPSAoZGVmaW5lZCAkc2VsZi0+e2NlcnR9KSA/IDEgOiAwOworICAgICRvcHRzLT57U1NMX3ZlcmlmeV9tb2RlfSAgPSAoZGVmaW5lZCAkc2VsZi0+e2NhfSkgPyAkdmVyaWZ5IDogSU86OlNvY2tldDo6U1NMOjpTU0xfVkVSSUZZX05PTkU7CisgICAgJG9wdHMtPntTU0xfdmVyc2lvbn0gICAgICA9IChkZWZpbmVkICRzZWxmLT57dmVyc2lvbn0pID8gJHNlbGYtPnt2ZXJzaW9ufSA6ICdTU0x2MjM6IVNTTHYzOiFTU0x2Mic7CisKKyAgICByZXR1cm4gSU86OlNvY2tldDo6U1NMLT5uZXcoJSRvcHRzKTsKK30KKworMTsKZGlmZiAtLWdpdCBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvU1NMU29ja2V0LnBtIGIvbGliL3BlcmwvbGliL1RocmlmdC9TU0xTb2NrZXQucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM0OTI0ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvU1NMU29ja2V0LnBtCkBAIC0wLDAgKzEsMTI2IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKwordXNlIDUuMTAuMDsKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7CisKK3VzZSBUaHJpZnQ7Cit1c2UgVGhyaWZ0OjpTb2NrZXQ7CisKK3VzZSBJTzo6U29ja2V0OjpTU0w7CisKK3BhY2thZ2UgVGhyaWZ0OjpTU0xTb2NrZXQ7Cit1c2UgYmFzZSBxdyggVGhyaWZ0OjpTb2NrZXQgKTsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKKworIworIyBDb25zdHJ1Y3Rpb24gYW5kIHVzYWdlCisjCisjIG15ICRvcHRzID0ge30KKyMgbXkgJHNvY2tldCA9IFRocmlmdDo6U1NMU29ja2V0LT5uZXcoXCVvcHRzKTsKKyMKKyMgb3B0aW9uczoKKyMKKyMgQW55IG9wdGlvbiBmcm9tIFNvY2tldC5wbSBpcyB2YWxpZCwgYW5kIHRoZW46CisjCisjIGNhICAgICAgICAgID0+IGNlcnRpZmljYXRlIGF1dGhvcml0eSBmaWxlIChQRU0gZmlsZSkgdG8gYXV0aGVudGljYXRlIHRoZQorIyAgICAgICAgICAgICAgICBzZXJ2ZXIgYWdhaW5zdDsgaWYgbm90IHNwZWNpZmllZCB0aGVuIHRoZSBzZXJ2ZXIgaXMgbm90CisjICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0ZWQKKyMgY2VydCAgICAgICAgPT4gY2VydGlmaWNhdGUgdG8gdXNlIGFzIHRoZSBjbGllbnQ7IGlmIG5vdCBzcGVjaWZpZWQgdGhlbgorIyAgICAgICAgICAgICAgICB0aGUgY2xpZW50IGRvZXMgbm90IHByZXNlbnQgb25lIGJ1dCBzdGlsbCBjb25uZWN0cyB1c2luZworIyAgICAgICAgICAgICAgICBzZWN1cmUgcHJvdG9jb2wKKyMgY2lwaGVycyAgICAgPT4gYWxsb3dlZCBjaXBoZXIgbGlzdAorIyAgICAgICAgICAgICAgICAoc2VlIGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvZG9jcy9hcHBzL2NpcGhlcnMuaHRtbCNDSVBIRVJfU1RSSU5HUykKKyMga2V5ICAgICAgICAgPT4gY2VydGlmaWNhdGUga2V5IGZvciAiY2VydCIgb3B0aW9uCisjIHZlcnNpb24gICAgID0+IGFjY2VwdGFibGUgU1NML1RMUyB2ZXJzaW9ucyAtIGlmIG5vdCBzcGVjaWZpZWQgdGhlbiB0aGUKKyMgICAgICAgICAgICAgICAgZGVmYXVsdCBpcyB0byB1c2UgU1NMdjIzIGhhbmRzaGFrZSBidXQgb25seSBuZWdvdGlhdGUKKyMgICAgICAgICAgICAgICAgYXQgVExTdjEuMCBvciBsYXRlcgorIworCitzdWIgbmV3Cit7CisgICAgbXkgJGNsYXNzbmFtZSA9IHNoaWZ0OworICAgIG15ICRzZWxmICAgICAgPSAkY2xhc3NuYW1lLT5TVVBFUjo6bmV3KEBfKTsKKworICAgIHJldHVybiBibGVzcygkc2VsZiwgJGNsYXNzbmFtZSk7Cit9CisKK3N1YiBfX29wZW4KK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICRvcHRzID0ge1BlZXJBZGRyICAgICAgPT4gJHNlbGYtPntob3N0fSwKKyAgICAgICAgICAgICAgICBQZWVyUG9ydCAgICAgID0+ICRzZWxmLT57cG9ydH0sCisgICAgICAgICAgICAgICAgUHJvdG8gICAgICAgICA9PiAndGNwJywKKyAgICAgICAgICAgICAgICBUaW1lb3V0ICAgICAgID0+ICRzZWxmLT57c2VuZFRpbWVvdXR9IC8gMTAwMH07CisKKyAgICBteSAkdmVyaWZ5ID0gSU86OlNvY2tldDo6U1NMOjpTU0xfVkVSSUZZX1BFRVIgfCBJTzo6U29ja2V0OjpTU0w6OlNTTF9WRVJJRllfRkFJTF9JRl9OT19QRUVSX0NFUlQgfCBJTzo6U29ja2V0OjpTU0w6OlNTTF9WRVJJRllfQ0xJRU5UX09OQ0U7CisKKyAgICAkb3B0cy0+e1NTTF9jYV9maWxlfSAgICAgID0gJHNlbGYtPntjYX0gICAgICBpZiBkZWZpbmVkICRzZWxmLT57Y2F9OworICAgICRvcHRzLT57U1NMX2NlcnRfZmlsZX0gICAgPSAkc2VsZi0+e2NlcnR9ICAgIGlmIGRlZmluZWQgJHNlbGYtPntjZXJ0fTsKKyAgICAkb3B0cy0+e1NTTF9jaXBoZXJfbGlzdH0gID0gJHNlbGYtPntjaXBoZXJzfSBpZiBkZWZpbmVkICRzZWxmLT57Y2lwaGVyc307CisgICAgJG9wdHMtPntTU0xfa2V5X2ZpbGV9ICAgICA9ICRzZWxmLT57a2V5fSAgICAgaWYgZGVmaW5lZCAkc2VsZi0+e2tleX07CisgICAgJG9wdHMtPntTU0xfdXNlX2NlcnR9ICAgICA9IChkZWZpbmVkICRzZWxmLT57Y2VydH0pID8gMSA6IDA7CisgICAgJG9wdHMtPntTU0xfdmVyaWZ5X21vZGV9ICA9IChkZWZpbmVkICRzZWxmLT57Y2F9KSA/ICR2ZXJpZnkgOiBJTzo6U29ja2V0OjpTU0w6OlNTTF9WRVJJRllfTk9ORTsKKyAgICAkb3B0cy0+e1NTTF92ZXJzaW9ufSAgICAgID0gKGRlZmluZWQgJHNlbGYtPnt2ZXJzaW9ufSkgPyAkc2VsZi0+e3ZlcnNpb259IDogJ1NTTHYyMzohU1NMdjM6IVNTTHYyJzsKKworICAgIHJldHVybiBJTzo6U29ja2V0OjpTU0wtPm5ldyglJG9wdHMpOworfQorCitzdWIgX19jbG9zZQoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJHNvY2sgPSAoJHNlbGYtPntoYW5kbGV9LT5oYW5kbGVzKCkpWzBdOworICAgIGlmICgkc29jaykgeworICAgICAgJHNvY2stPmNsb3NlKFNTTF9ub19zaHV0ZG93biA9PiAxKTsKKyAgICB9Cit9CisKK3N1YiBfX3JlY3YKK3sKKyAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgbXkgJHNvY2sgPSBzaGlmdDsKKyAgbXkgJGxlbiA9IHNoaWZ0OworICBteSAkYnVmID0gdW5kZWY7CisgIGlmICgkc29jaykgeworICAgIHN5c3JlYWQoJHNvY2ssICRidWYsICRsZW4pOworICB9CisgIHJldHVybiAkYnVmOworfQorCitzdWIgX19zZW5kCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkc29jayA9IHNoaWZ0OworICAgIG15ICRidWYgPSBzaGlmdDsKKyAgICByZXR1cm4gc3lzd3JpdGUoJHNvY2ssICRidWYpOworfQorCitzdWIgX193YWl0Cit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkc29jayA9ICgkc2VsZi0+e2hhbmRsZX0tPmhhbmRsZXMoKSlbMF07CisgICAgaWYgKCRzb2NrIGFuZCAkc29jay0+cGVuZGluZygpIGVxIDApIHsKKyAgICAgICAgcmV0dXJuICRzZWxmLT5TVVBFUjo6X193YWl0KCk7CisgICAgfQorICAgIHJldHVybiAkc29jazsKK30KKworCisxOwpkaWZmIC0tZ2l0IGEvbGliL3BlcmwvbGliL1RocmlmdC9TZXJ2ZXIucG0gYi9saWIvcGVybC9saWIvVGhyaWZ0L1NlcnZlci5wbQppbmRleCA5NjBmYmQxLi4yODgyMmU4IDEwMDY0NAotLS0gYS9saWIvcGVybC9saWIvVGhyaWZ0L1NlcnZlci5wbQorKysgYi9saWIvcGVybC9saWIvVGhyaWZ0L1NlcnZlci5wbQpAQCAtMTcsMjUgKzE3LDMxIEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1yZXF1aXJlIDUuNi4wOwordXNlIDUuMTAuMDsKIHVzZSBzdHJpY3Q7CiB1c2Ugd2FybmluZ3M7CiAKIHVzZSBUaHJpZnQ7Ci11c2UgVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydDsKIHVzZSBUaHJpZnQ6OkJpbmFyeVByb3RvY29sOwordXNlIFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnQ7Cit1c2UgVGhyaWZ0OjpFeGNlcHRpb247CiAKICMKICMgU2VydmVyIGJhc2UgY2xhc3MgbW9kdWxlCiAjCiBwYWNrYWdlIFRocmlmdDo6U2VydmVyOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOwogCisjCiAjIDMgcG9zc2libGUgY29uc3RydWN0b3JzOgogIyAgIDEuICAocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQpCisjICAgICAgIFVzZXMgYSBCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkgYW5kIGEgQmluYXJ5UHJvdG9jb2xGYWN0b3J5LgogIyAgIDIuICAocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSkKKyMgICAgICAgVXNlcyB0aGUgc2FtZSBmYWN0b3J5IGZvciBpbnB1dCBhbmQgb3V0cHV0IG9mIGVhY2ggdHlwZS4KICMgICAzLiAgKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LAogIyAgICAgICAgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LCBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAogIyAgICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnksIG91dHB1dFByb3RvY29sRmFjdG9yeSkKKyMKIHN1YiBuZXcKIHsKICAgICBteSAkY2xhc3NuYW1lICAgID0gc2hpZnQ7CkBAIC00NSw3ICs1MSw3IEBACiAKICAgICBpZiAoc2NhbGFyIEBhcmdzID09IDIpCiAgICAgewotICAgICAgJHNlbGYgPSBfaW5pdCgkYXJnc1swXSwgJGFyZ3NbMV0sCisgICAgICAgICRzZWxmID0gX2luaXQoJGFyZ3NbMF0sICRhcmdzWzFdLAogICAgICAgICAgICAgICAgICAgICBUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeS0+bmV3KCksCiAgICAgICAgICAgICAgICAgICAgIFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5LT5uZXcoKSwKICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0OjpCaW5hcnlQcm90b2NvbEZhY3RvcnktPm5ldygpLApAQCAtNjEsNyArNjcsNyBAQAogICAgIH0KICAgICBlbHNlCiAgICAgewotICAgICAgZGllICJUaHJpZnQ6OlNlcnZlciBleHBlY3RzIGV4YWN0bHkgMiwgNCwgb3IgNiBhcmdzIjsKKyAgICAgIGRpZSBUaHJpZnQ6OlRFeGNlcHRpb24tPm5ldygnVGhyaWZ0OjpTZXJ2ZXIgZXhwZWN0cyBleGFjdGx5IDIsIDQsIG9yIDYgYXJncycpOwogICAgIH0KIAogICAgIHJldHVybiBibGVzcygkc2VsZiwkY2xhc3NuYW1lKTsKQEAgLTg4LDcgKzk0LDcgQEAKIAogc3ViIHNlcnZlCiB7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiBfY2xpZW50QmVnaW4KQEAgLTEwOSw2MiArMTE1LDY4IEBACiAgICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgICBteSAkZSAgICA9IHNoaWZ0OwogCi0gICAgaWYgKCRlID1+IG0vVEV4Y2VwdGlvbi8gYW5kIGV4aXN0cyAkZS0+e21lc3NhZ2V9KSB7CisgICAgaWYgKCRlLT5pc2EoJ1RocmlmdDo6VEV4Y2VwdGlvbicpIGFuZCBleGlzdHMgJGUtPnttZXNzYWdlfSkgewogICAgICAgICBteSAkbWVzc2FnZSA9ICRlLT57bWVzc2FnZX07CiAgICAgICAgIG15ICRjb2RlICAgID0gJGUtPntjb2RlfTsKICAgICAgICAgbXkgJG91dCAgICAgPSAkY29kZSAuICc6JyAuICRtZXNzYWdlOwogCiAgICAgICAgICRtZXNzYWdlID1+IG0vVFRyYW5zcG9ydEV4Y2VwdGlvbi8gYW5kIGRpZSAkb3V0OwotICAgICAgICBpZiAoJG1lc3NhZ2UgPX4gbS9UU29ja2V0LykgewotICAgICAgICAgICAgIyBzdXBwcmVzcyBUU29ja2V0IG1lc3NhZ2VzCi0gICAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmICgkbWVzc2FnZSA9fiBtL1NvY2tldC8pIHsKKyAgICAgICAgICAgICMgc3VwcHJlc3MgU29ja2V0IG1lc3NhZ2VzCisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICB3YXJuICRvdXQ7CiAgICAgICAgIH0KLSAgICB9IGVsc2UgeworICAgIH0KKyAgICBlbHNlIHsKICAgICAgICAgd2FybiAkZTsKICAgICB9CiB9CiAKLQogIwogIyBTaW1wbGVTZXJ2ZXIgZnJvbSB0aGUgU2VydmVyIGJhc2UgY2xhc3MgdGhhdCBoYW5kbGVzIG9uZSBjb25uZWN0aW9uIGF0IGEgdGltZQogIwogcGFja2FnZSBUaHJpZnQ6OlNpbXBsZVNlcnZlcjsKLXVzZSBiYXNlIHF3KCBUaHJpZnQ6OlNlcnZlciApOwordXNlIHBhcmVudCAtbm9yZXF1aXJlLCAnVGhyaWZ0OjpTZXJ2ZXInOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOwogCiBzdWIgbmV3CiB7CiAgICAgbXkgJGNsYXNzbmFtZSA9IHNoaWZ0OwotICAgIG15IEBhcmdzICAgICAgPSBAXzsKIAotICAgIG15ICRzZWxmICAgICAgPSAkY2xhc3NuYW1lLT5TVVBFUjo6bmV3KEBhcmdzKTsKKyAgICBteSAkc2VsZiAgICAgID0gJGNsYXNzbmFtZS0+U1VQRVI6Om5ldyhAXyk7CisKICAgICByZXR1cm4gYmxlc3MoJHNlbGYsJGNsYXNzbmFtZSk7CiB9CiAKIHN1YiBzZXJ2ZQogewogICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJHN0b3AgPSAwOwogCiAgICAgJHNlbGYtPntzZXJ2ZXJUcmFuc3BvcnR9LT5saXN0ZW4oKTsKLSAgICB3aGlsZSAoMSkKLSAgICB7CisgICAgd2hpbGUgKCEkc3RvcCkgewogICAgICAgICBteSAkY2xpZW50ID0gJHNlbGYtPntzZXJ2ZXJUcmFuc3BvcnR9LT5hY2NlcHQoKTsKLSAgICAgICAgbXkgJGl0cmFucyA9ICRzZWxmLT57aW5wdXRUcmFuc3BvcnRGYWN0b3J5fS0+Z2V0VHJhbnNwb3J0KCRjbGllbnQpOwotICAgICAgICBteSAkb3RyYW5zID0gJHNlbGYtPntvdXRwdXRUcmFuc3BvcnRGYWN0b3J5fS0+Z2V0VHJhbnNwb3J0KCRjbGllbnQpOwotICAgICAgICBteSAkaXByb3QgID0gJHNlbGYtPntpbnB1dFByb3RvY29sRmFjdG9yeX0tPmdldFByb3RvY29sKCRpdHJhbnMpOwotICAgICAgICBteSAkb3Byb3QgID0gJHNlbGYtPntvdXRwdXRQcm90b2NvbEZhY3Rvcnl9LT5nZXRQcm90b2NvbCgkb3RyYW5zKTsKLSAgICAgICAgZXZhbCB7Ci0gICAgICAgICAgICAkc2VsZi0+X2NsaWVudEJlZ2luKCRpcHJvdCwgJG9wcm90KTsKLSAgICAgICAgICAgIHdoaWxlICgxKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICRzZWxmLT57cHJvY2Vzc29yfS0+cHJvY2VzcygkaXByb3QsICRvcHJvdCk7CisgICAgICAgIGlmIChkZWZpbmVkICRjbGllbnQpIHsKKyAgICAgICAgICAgIG15ICRpdHJhbnMgPSAkc2VsZi0+e2lucHV0VHJhbnNwb3J0RmFjdG9yeX0tPmdldFRyYW5zcG9ydCgkY2xpZW50KTsKKyAgICAgICAgICAgIG15ICRvdHJhbnMgPSAkc2VsZi0+e291dHB1dFRyYW5zcG9ydEZhY3Rvcnl9LT5nZXRUcmFuc3BvcnQoJGNsaWVudCk7CisgICAgICAgICAgICBteSAkaXByb3QgID0gJHNlbGYtPntpbnB1dFByb3RvY29sRmFjdG9yeX0tPmdldFByb3RvY29sKCRpdHJhbnMpOworICAgICAgICAgICAgbXkgJG9wcm90ICA9ICRzZWxmLT57b3V0cHV0UHJvdG9jb2xGYWN0b3J5fS0+Z2V0UHJvdG9jb2woJG90cmFucyk7CisgICAgICAgICAgICBldmFsIHsKKyAgICAgICAgICAgICAgICAkc2VsZi0+X2NsaWVudEJlZ2luKCRpcHJvdCwgJG9wcm90KTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICRzZWxmLT57cHJvY2Vzc29yfS0+cHJvY2VzcygkaXByb3QsICRvcHJvdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGlmKCRAKSB7CisgICAgICAgICAgICAgICAgJHNlbGYtPl9oYW5kbGVFeGNlcHRpb24oJEApOwogICAgICAgICAgICAgfQotICAgICAgICB9OyBpZigkQCkgewotICAgICAgICAgICAgJHNlbGYtPl9oYW5kbGVFeGNlcHRpb24oJEApOworICAgICAgICAgICAgJGl0cmFucy0+Y2xvc2UoKTsKKyAgICAgICAgICAgICRvdHJhbnMtPmNsb3NlKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkc3RvcCA9IDE7CiAgICAgICAgIH0KLQotICAgICAgICAkaXRyYW5zLT5jbG9zZSgpOwotICAgICAgICAkb3RyYW5zLT5jbG9zZSgpOwogICAgIH0KIH0KIApAQCAtMTczLDkgKzE4NSw5IEBACiAjIEZvcmtpbmdTZXJ2ZXIgdGhhdCBmb3JrcyBhIG5ldyBwcm9jZXNzIGZvciBlYWNoIHJlcXVlc3QKICMKIHBhY2thZ2UgVGhyaWZ0OjpGb3JraW5nU2VydmVyOwotdXNlIGJhc2UgcXcoIFRocmlmdDo6U2VydmVyICk7Ci0KLXVzZSBQT1NJWCAiOnN5c193YWl0X2giOwordXNlIHBhcmVudCAtbm9yZXF1aXJlLCAnVGhyaWZ0OjpTZXJ2ZXInOwordXNlIFBPU0lYICc6c3lzX3dhaXRfaCc7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CiAKIHN1YiBuZXcKIHsKQEAgLTE5MSw2ICsyMDMsOSBAQAogewogICAgIG15ICRzZWxmID0gc2hpZnQ7CiAKKyAgICAjIFRIUklGVC0zODQ4OiB3aXRob3V0IGlnbm9yaW5nIFNJR0NITEQsIHBlcmwgRm9ya2luZ1NlcnZlciBnb2VzIGludG8gYSB0aWdodCBsb29wCisgICAgJFNJR3tDSExEfSA9ICdJR05PUkUnOworCiAgICAgJHNlbGYtPntzZXJ2ZXJUcmFuc3BvcnR9LT5saXN0ZW4oKTsKICAgICB3aGlsZSAoMSkKICAgICB7CkBAIC0yMTUsMTMgKzIzMCwxNSBAQAogCiAgICAgICAgIG15ICRwaWQgPSBmb3JrKCk7CiAKLSAgICAgICAgaWYgKCRwaWQpICNwYXJlbnQKKyAgICAgICAgaWYgKCRwaWQpCiAgICAgICAgIHsKICAgICAgICAgICAgICRzZWxmLT5fcGFyZW50KCRwaWQsICRpdHJhbnMsICRvdHJhbnMpOwotICAgICAgICB9IGVsc2UgeworICAgICAgICB9CisgICAgICAgIGVsc2UgewogICAgICAgICAgICAgJHNlbGYtPl9jaGlsZCgkaXRyYW5zLCAkb3RyYW5zLCAkaXByb3QsICRvcHJvdCk7CiAgICAgICAgIH0KLSAgICB9OyBpZigkQCkgeworICAgIH07CisgICAgaWYoJEApIHsKICAgICAgICAgJHNlbGYtPl9oYW5kbGVFeGNlcHRpb24oJEApOwogICAgIH0KIH0KQEAgLTIzMywxMCArMjUwLDYgQEAKICAgICBteSAkaXRyYW5zID0gc2hpZnQ7CiAgICAgbXkgJG90cmFucyA9IHNoaWZ0OwogCi0gICAgIyBhZGQgYmVmb3JlIGNvbGxlY3QsIG90aGVyd2lzZSB5b3UgcmFjZSB3LyB3YWl0cGlkCi0gICAgJHNlbGYtPntjaGlsZHJlbn0tPnskcGlkfSA9IDE7Ci0gICAgJHNlbGYtPl9jb2xsZWN0Q2hpbGRyZW4oKTsKLQogICAgICMgUGFyZW50IG11c3QgY2xvc2Ugc29ja2V0IG9yIHRoZSBjb25uZWN0aW9uIG1heSBub3QgZ2V0IGNsb3NlZCBwcm9tcHRseQogICAgICRzZWxmLT50cnlDbG9zZSgkaXRyYW5zKTsKICAgICAkc2VsZi0+dHJ5Q2xvc2UoJG90cmFucyk7CkBAIC0yNTIsMTEgKzI2NSwxNCBAQAogCiAgICAgbXkgJGVjb2RlID0gMDsKICAgICBldmFsIHsKKyAgICAgICAgIyBUSFJJRlQtNDA2NSBlbnN1cmUgY2hpbGQgcHJvY2VzcyBoYXMgbm9ybWFsIHNpZ25hbCBoYW5kbGluZyBpbiBjYXNlIHRocmlmdCBoYW5kbGVyIHVzZXMgaXQKKyAgICAgICAgJFNJR3tDSExEfSA9ICdERUZBVUxUJzsKICAgICAgICAgd2hpbGUgKDEpCiAgICAgICAgIHsKICAgICAgICAgICAgICRzZWxmLT57cHJvY2Vzc29yfS0+cHJvY2VzcygkaXByb3QsICRvcHJvdCk7CiAgICAgICAgIH0KLSAgICB9OyBpZigkQCkgeworICAgIH07CisgICAgaWYoJEApIHsKICAgICAgICAgJGVjb2RlID0gMTsKICAgICAgICAgJHNlbGYtPl9oYW5kbGVFeGNlcHRpb24oJEApOwogICAgIH0KQEAgLTI3NywzNyArMjkzLDE5IEBACiAgICAgICAgIHsKICAgICAgICAgICAkZmlsZS0+Y2xvc2UoKTsKICAgICAgICAgfQotICAgIH07IGlmKCRAKSB7Ci0gICAgICAgIGlmICgkQCA9fiBtL1RFeGNlcHRpb24vIGFuZCBleGlzdHMgJEAtPnttZXNzYWdlfSkgeworICAgIH07CisgICAgaWYoJEApIHsKKyAgICAgICAgaWYgKCRALT5pc2EoJ1RocmlmdDo6VEV4Y2VwdGlvbicpIGFuZCBleGlzdHMgJEAtPnttZXNzYWdlfSkgewogICAgICAgICAgICAgbXkgJG1lc3NhZ2UgPSAkQC0+e21lc3NhZ2V9OwogICAgICAgICAgICAgbXkgJGNvZGUgICAgPSAkQC0+e2NvZGV9OwogICAgICAgICAgICAgbXkgJG91dCAgICAgPSAkY29kZSAuICc6JyAuICRtZXNzYWdlOwogCiAgICAgICAgICAgICB3YXJuICRvdXQ7Ci0gICAgICAgIH0gZWxzZSB7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICB3YXJuICRAOwogICAgICAgICB9CiAgICAgfQogfQogCi1zdWIgX2NvbGxlY3RDaGlsZHJlbgotewotICAgIG15ICRzZWxmID0gc2hpZnQ7Ci0KLSAgICB3aGlsZSAoc2NhbGFyIGtleXMgJXskc2VsZi0+e2NoaWxkcmVufX0pCi0gICAgewotICAgICAgICBteSAkcGlkICAgID0gd2FpdHBpZCgtMSwgV05PSEFORyk7Ci0KLSAgICAgICAgaWYgKCRwaWQ+MCkKLSAgICAgICAgewotICAgICAgICAgICAgZGVsZXRlICRzZWxmLT57Y2hpbGRyZW59LT57JHBpZH07Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBsYXN0OwotICAgICAgICB9Ci0gICAgfQotfQotCi0KIDE7CmRpZmYgLS1naXQgYS9saWIvcGVybC9saWIvVGhyaWZ0L1NlcnZlclNvY2tldC5wbSBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvU2VydmVyU29ja2V0LnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5NzI2NDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGVybC9saWIvVGhyaWZ0L1NlcnZlclNvY2tldC5wbQpAQCAtMCwwICsxLDEyNSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3VzZSA1LjEwLjA7Cit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCit1c2UgSU86OlNvY2tldDo6SU5FVDsKK3VzZSBJTzo6U2VsZWN0OwordXNlIFRocmlmdDsKK3VzZSBUaHJpZnQ6OlRyYW5zcG9ydDsKK3VzZSBUaHJpZnQ6OlNvY2tldDsKKworcGFja2FnZSBUaHJpZnQ6OlNlcnZlclNvY2tldDsKK3VzZSBiYXNlIHF3KCBUaHJpZnQ6OlNlcnZlclRyYW5zcG9ydCApOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOworCisjCisjIENvbnN0cnVjdG9yLgorIyBMZWdhY3kgY29uc3RydWN0aW9uIHRha2VzIG9uZSBhcmd1bWVudCwgcG9ydCBudW1iZXIuCisjIE5ldyBjb25zdHJ1Y3Rpb24gdGFrZXMgYSBoYXNoOgorIyBAcGFyYW1baW5dICBob3N0ICAgaG9zdCBpbnRlcmZhY2UgdG8gbGlzdGVuIG9uICh1bmRlZiA9IGFsbCBpbnRlcmZhY2VzKQorIyBAcGFyYW1baW5dICBwb3J0ICAgcG9ydCBudW1iZXIgdG8gbGlzdGVuIG9uIChyZXF1aXJlZCkKKyMgQHBhcmFtW2luXSAgcXVldWUgIHRoZSBsaXN0ZW4gcXVldWUgc2l6ZSAoZGVmYXVsdCBpZiBub3Qgc3BlY2lmaWVkIGlzIDEyOCkKKyMgQGV4YW1wbGUgICAgbXkgJHNlcnZlcnNvY2sgPSBUaHJpZnQ6OlNlcnZlclNvY2tldC0+bmV3KGhvc3QgPT4gdW5kZWYsIHBvcnQgPT4gcG9ydCkKKyMKK3N1YiBuZXcKK3sKKyAgICBteSAkY2xhc3NuYW1lID0gc2hpZnQ7CisgICAgbXkgJGFyZ3MgICAgICA9IHNoaWZ0OworICAgIG15ICRzZWxmOworCisgICAgIyBTdXBwb3J0IGJvdGggb2xkLXN0eWxlICJwb3J0IG51bWJlciIgY29uc3RydWN0aW9uIGFuZCBuZXdlci4uLgorICAgIGlmIChyZWYoJGFyZ3MpIGVxICdIQVNIJykgeworICAgICAgICAkc2VsZiA9ICRhcmdzOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgJHNlbGYgPSB7IHBvcnQgPT4gJGFyZ3MgfTsKKyAgICB9CisKKyAgICBpZiAobm90IGRlZmluZWQgJHNlbGYtPntxdWV1ZX0pIHsKKyAgICAgICAgJHNlbGYtPntxdWV1ZX0gPSAxMjg7CisgICAgfQorCisgICAgcmV0dXJuIGJsZXNzKCRzZWxmLCAkY2xhc3NuYW1lKTsKK30KKworc3ViIGxpc3RlbgoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBteSAkc29jayA9ICRzZWxmLT5fX2xpc3RlbigpIHx8IGRvIHsKKyAgICAgICAgbXkgJGVycm9yID0gcmVmKCRzZWxmKSAuICc6IENvdWxkIG5vdCBiaW5kIHRvICcgLiAnKjonIC4gJHNlbGYtPntwb3J0fSAuICcgKCcgLiAkISAuICcpJzsKKworICAgICAgICBpZiAoJHNlbGYtPntkZWJ1Z30pIHsKKyAgICAgICAgICAgICRzZWxmLT57ZGVidWdIYW5kbGVyfS0+KCRlcnJvcik7CisgICAgICAgIH0KKworICAgICAgICBkaWUgVGhyaWZ0OjpUVHJhbnNwb3J0RXhjZXB0aW9uLT5uZXcoJGVycm9yLCBUaHJpZnQ6OlRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOKTsKKyAgICB9OworCisgICAgJHNlbGYtPntoYW5kbGV9ID0gJHNvY2s7Cit9CisKK3N1YiBhY2NlcHQKK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgaWYgKCBleGlzdHMgJHNlbGYtPntoYW5kbGV9IGFuZCBkZWZpbmVkICRzZWxmLT57aGFuZGxlfSApIHsKKyAgICAgICAgbXkgJGNsaWVudCAgICAgICAgPSAkc2VsZi0+e2hhbmRsZX0tPmFjY2VwdCgpOworICAgICAgICBteSAkcmVzdWx0ICAgICAgICA9ICRzZWxmLT5fX2NsaWVudCgpOworICAgICAgICAkcmVzdWx0LT57aGFuZGxlfSA9IElPOjpTZWxlY3QtPm5ldygkY2xpZW50KTsKKyAgICAgICAgcmV0dXJuICRyZXN1bHQ7CisgICAgfQorCisgICAgcmV0dXJuIHVuZGVmOworfQorCitzdWIgY2xvc2UKK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgaWYgKCBleGlzdHMgJHNlbGYtPntoYW5kbGV9IGFuZCBkZWZpbmVkICRzZWxmLT57aGFuZGxlfSApCisgICAgeworICAgICAgICAkc2VsZi0+e2hhbmRsZX0tPmNsb3NlKCk7CisgICAgfQorfQorCisjIyMKKyMjIyBPdmVycmlkYWJsZSBtZXRob2RzCisjIyMKKworc3ViIF9fY2xpZW50Cit7CisgIHJldHVybiBUaHJpZnQ6OlNvY2tldC0+bmV3KCk7Cit9CisKK3N1YiBfX2xpc3RlbgoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgcmV0dXJuIElPOjpTb2NrZXQ6OklORVQtPm5ldyhMb2NhbEFkZHIgPT4gJHNlbGYtPntob3N0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsUG9ydCA9PiAkc2VsZi0+e3BvcnR9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvdG8gICAgID0+ICd0Y3AnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdGVuICAgID0+ICRzZWxmLT57cXVldWV9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmV1c2VBZGRyID0+IDEpOworfQorCisKKzE7CmRpZmYgLS1naXQgYS9saWIvcGVybC9saWIvVGhyaWZ0L1NvY2tldC5wbSBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvU29ja2V0LnBtCmluZGV4IDdlYmVhMzUuLmJhMGRiNWUgMTAwNjQ0Ci0tLSBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvU29ja2V0LnBtCisrKyBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvU29ja2V0LnBtCkBAIC0xNywzNyArMTcsNjMgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLXJlcXVpcmUgNS42LjA7Cit1c2UgNS4xMC4wOwogdXNlIHN0cmljdDsKIHVzZSB3YXJuaW5nczsKIAogdXNlIFRocmlmdDsKK3VzZSBUaHJpZnQ6OkV4Y2VwdGlvbjsKIHVzZSBUaHJpZnQ6OlRyYW5zcG9ydDsKIAogdXNlIElPOjpTb2NrZXQ6OklORVQ7CiB1c2UgSU86OlNlbGVjdDsKIAogcGFja2FnZSBUaHJpZnQ6OlNvY2tldDsKK3VzZSBiYXNlIHF3KCBUaHJpZnQ6OlRyYW5zcG9ydCApOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOwogCi11c2UgYmFzZSgnVGhyaWZ0OjpUcmFuc3BvcnQnKTsKKyMKKyMgQ29uc3RydWN0aW9uIGFuZCB1c2FnZQorIworIyBteSAkb3B0cyA9IHt9CisjIG15ICRzb2NrZXQgPSBUaHJpZnQ6OlNvY2tldC0+bmV3KFwlb3B0cyk7CisjCisjIG9wdGlvbnM6CisjCisjIGhvc3QgICAgICAgID0+IGhvc3QgdG8gY29ubmVjdCB0bworIyBwb3J0ICAgICAgICA9PiBwb3J0IHRvIGNvbm5lY3QgdG8KKyMgc2VuZFRpbWVvdXQgPT4gdGltZW91dCB1c2VkIGZvciBzZW5kIGFuZCBmb3IgY29ubmVjdAorIyByZWN2VGltZW91dCA9PiB0aW1lb3V0IHVzZWQgZm9yIHJlY3YKKyMKIAogc3ViIG5ldwogewotICAgIG15ICRjbGFzc25hbWUgICAgPSBzaGlmdDsKLSAgICBteSAkaG9zdCAgICAgICAgID0gc2hpZnQgfHwgImxvY2FsaG9zdCI7Ci0gICAgbXkgJHBvcnQgICAgICAgICA9IHNoaWZ0IHx8IDkwOTA7Ci0gICAgbXkgJGRlYnVnSGFuZGxlciA9IHNoaWZ0OworICAgIG15ICRjbGFzc25hbWUgPSBzaGlmdDsKKyAgICBteSAkb3B0cyAgICAgID0gc2hpZnQ7CiAKKyAgICAjIGRlZmF1bHQgc2V0dGluZ3M6CiAgICAgbXkgJHNlbGYgPSB7Ci0gICAgICAgIGhvc3QgICAgICAgICA9PiAkaG9zdCwKLSAgICAgICAgcG9ydCAgICAgICAgID0+ICRwb3J0LAotICAgICAgICBkZWJ1Z0hhbmRsZXIgPT4gJGRlYnVnSGFuZGxlciwKLSAgICAgICAgZGVidWcgICAgICAgID0+IDAsCi0gICAgICAgIHNlbmRUaW1lb3V0ICA9PiAxMDAwMCwKKyAgICAgICAgaG9zdCAgICAgICAgID0+ICdsb2NhbGhvc3QnLAorICAgICAgICBwb3J0ICAgICAgICAgPT4gOTA5MCwKICAgICAgICAgcmVjdlRpbWVvdXQgID0+IDEwMDAwLAotICAgICAgICBoYW5kbGUgICAgICAgPT4gdW5kZWYsCisgICAgICAgIHNlbmRUaW1lb3V0ICA9PiAxMDAwMCwKKworICAgICAgICBoYW5kbGUgICAgICAgPT4gdW5kZWYKICAgICB9OwogCisgICAgaWYgKGRlZmluZWQgJG9wdHMgYW5kIHJlZiAkb3B0cyBlcSByZWYge30pIHsKKworICAgICAgIyBhcmd1bWVudCBpcyBhIGhhc2ggb2Ygb3B0aW9ucyBzbyBvdmVycmlkZSB0aGUgZGVmYXVsdHMKKyAgICAgICRzZWxmLT57JF99ID0gJG9wdHMtPnskX30gZm9yIGtleXMgJSRvcHRzOworCisgICAgfSBlbHNlIHsKKworICAgICAgIyBvbGRlciBzdHlsZSBjb25zdHJ1Y3RvciB0YWtlcyAzIGFyZ3VtZW50cywgbm9uZSBvZiB3aGljaCBhcmUgcmVxdWlyZWQKKyAgICAgICRzZWxmLT57aG9zdH0gPSAkb3B0cyB8fCAnbG9jYWxob3N0JzsKKyAgICAgICRzZWxmLT57cG9ydH0gPSBzaGlmdCB8fCA5MDkwOworCisgICAgfQorCiAgICAgcmV0dXJuIGJsZXNzKCRzZWxmLCRjbGFzc25hbWUpOwogfQogCkBAIC03MCwxOSArOTYsNiBAQAogCiAKICMKLSNTZXRzIGRlYnVnZ2luZyBvdXRwdXQgb24gb3Igb2ZmCi0jCi0jIEBwYXJhbSBib29sICRkZWJ1ZwotIwotc3ViIHNldERlYnVnCi17Ci0gICAgbXkgJHNlbGYgID0gc2hpZnQ7Ci0gICAgbXkgJGRlYnVnID0gc2hpZnQ7Ci0KLSAgICAkc2VsZi0+e2RlYnVnfSA9ICRkZWJ1ZzsKLX0KLQotIwogIyBUZXN0cyB3aGV0aGVyIHRoaXMgaXMgb3BlbgogIwogIyBAcmV0dXJuIGJvb2wgdHJ1ZSBpZiB0aGUgc29ja2V0IGlzIG9wZW4KQEAgLTEwNSwyMyArMTE4LDEyIEBACiB7CiAgICAgbXkgJHNlbGYgPSBzaGlmdDsKIAotICAgIG15ICRzb2NrID0gSU86OlNvY2tldDo6SU5FVC0+bmV3KFBlZXJBZGRyID0+ICRzZWxmLT57aG9zdH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlZXJQb3J0ID0+ICRzZWxmLT57cG9ydH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3RvICAgID0+ICd0Y3AnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lb3V0ICA9PiAkc2VsZi0+e3NlbmRUaW1lb3V0fS8xMDAwKQotICAgICAgICB8fCBkbyB7Ci0gICAgICAgICAgICBteSAkZXJyb3IgPSAnVFNvY2tldDogQ291bGQgbm90IGNvbm5lY3QgdG8gJy4kc2VsZi0+e2hvc3R9Lic6Jy4kc2VsZi0+e3BvcnR9LicgKCcuJCEuJyknOworICAgIG15ICRzb2NrID0gJHNlbGYtPl9fb3BlbigpIHx8IGRvIHsKKyAgICAgICAgbXkgJGVycm9yID0gcmVmKCRzZWxmKS4nOiBDb3VsZCBub3QgY29ubmVjdCB0byAnLiRzZWxmLT57aG9zdH0uJzonLiRzZWxmLT57cG9ydH0uJyAoJy4kIS4nKSc7CisgICAgICAgIGRpZSBUaHJpZnQ6OlRUcmFuc3BvcnRFeGNlcHRpb24tPm5ldygkZXJyb3IsIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4pOworICAgIH07CiAKLSAgICAgICAgICAgIGlmICgkc2VsZi0+e2RlYnVnfSkgewotICAgICAgICAgICAgICAgICRzZWxmLT57ZGVidWdIYW5kbGVyfS0+KCRlcnJvcik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGRpZSBuZXcgVGhyaWZ0OjpURXhjZXB0aW9uKCRlcnJvcik7Ci0KLSAgICAgICAgfTsKLQotCi0gICAgJHNlbGYtPntoYW5kbGV9ID0gbmV3IElPOjpTZWxlY3QoICRzb2NrICk7CisgICAgJHNlbGYtPntoYW5kbGV9ID0gSU86OlNlbGVjdC0+bmV3KCAkc29jayApOwogfQogCiAjCkBAIC0xMzAsOSArMTMyLDggQEAKIHN1YiBjbG9zZQogewogICAgIG15ICRzZWxmID0gc2hpZnQ7Ci0KLSAgICBpZiggZGVmaW5lZCAkc2VsZi0+e2hhbmRsZX0gKXsKLSAgICAgICAgQ09SRTo6Y2xvc2UoICgkc2VsZi0+e2hhbmRsZX0tPmhhbmRsZXMoKSlbMF0gKTsKKyAgICBpZiggZGVmaW5lZCAkc2VsZi0+e2hhbmRsZX0gKSB7CisgICAgICAkc2VsZi0+X19jbG9zZSgpOwogICAgIH0KIH0KIApAQCAtMTUzLDMwICsxNTQsMjIgQEAKICAgICBteSAkcHJlID0gIiI7CiAgICAgd2hpbGUgKDEpIHsKIAotICAgICAgICAjY2hlY2sgZm9yIHRpbWVvdXQKLSAgICAgICAgbXkgQHNvY2tldHMgPSAkc2VsZi0+e2hhbmRsZX0tPmNhbl9yZWFkKCAkc2VsZi0+e3JlY3ZUaW1lb3V0fSAvIDEwMDAgKTsKLQotICAgICAgICBpZihAc29ja2V0cyA9PSAwKXsKLSAgICAgICAgICAgIGRpZSBuZXcgVGhyaWZ0OjpURXhjZXB0aW9uKCdUU29ja2V0OiB0aW1lZCBvdXQgcmVhZGluZyAnLiRsZW4uJyBieXRlcyBmcm9tICcuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2VsZi0+e2hvc3R9Lic6Jy4kc2VsZi0+e3BvcnR9KTsKLSAgICAgICAgfQotCi0gICAgICAgIG15ICRzb2NrID0gJHNvY2tldHNbMF07Ci0KLSAgICAgICAgbXkgKCRidWYsJHN6KTsKLSAgICAgICAgJHNvY2stPnJlY3YoJGJ1ZiwgJGxlbik7CisgICAgICAgIG15ICRzb2NrID0gJHNlbGYtPl9fd2FpdCgpOworICAgICAgICBteSAkYnVmID0gJHNlbGYtPl9fcmVjdigkc29jaywgJGxlbik7CiAKICAgICAgICAgaWYgKCFkZWZpbmVkICRidWYgfHwgJGJ1ZiBlcSAnJykgewogCi0gICAgICAgICAgICBkaWUgbmV3IFRocmlmdDo6VEV4Y2VwdGlvbignVFNvY2tldDogQ291bGQgbm90IHJlYWQgJy4kbGVuLicgYnl0ZXMgZnJvbSAnLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzZWxmLT57aG9zdH0uJzonLiRzZWxmLT57cG9ydH0pOworICAgICAgICAgICAgZGllIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbi0+bmV3KHJlZigkc2VsZikuJzogQ291bGQgbm90IHJlYWQgJy4kbGVuLicgYnl0ZXMgZnJvbSAnLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzZWxmLT57aG9zdH0uJzonLiRzZWxmLT57cG9ydH0sIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjo6RU5EX09GX0ZJTEUpOwogCi0gICAgICAgIH0gZWxzaWYgKCgkc3ogPSBsZW5ndGgoJGJ1ZikpIDwgJGxlbikgeworICAgICAgICB9CisgICAgICAgIGVsc2lmICgobXkgJHN6ID0gbGVuZ3RoKCRidWYpKSA8ICRsZW4pIHsKIAogICAgICAgICAgICAgJHByZSAuPSAkYnVmOwogICAgICAgICAgICAgJGxlbiAtPSAkc3o7CiAKLSAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKICAgICAgICAgICAgIHJldHVybiAkcHJlLiRidWY7CiAgICAgICAgIH0KICAgICB9CkBAIC0xOTUsMjMgKzE4OCwxMyBAQAogCiAgICAgcmV0dXJuIHVubGVzcyBkZWZpbmVkICRzZWxmLT57aGFuZGxlfTsKIAotICAgICNjaGVjayBmb3IgdGltZW91dAotICAgIG15IEBzb2NrZXRzID0gJHNlbGYtPntoYW5kbGV9LT5jYW5fcmVhZCggJHNlbGYtPntyZWN2VGltZW91dH0gLyAxMDAwICk7Ci0KLSAgICBpZihAc29ja2V0cyA9PSAwKXsKLSAgICAgICAgZGllIG5ldyBUaHJpZnQ6OlRFeGNlcHRpb24oJ1RTb2NrZXQ6IHRpbWVkIG91dCByZWFkaW5nICcuJGxlbi4nIGJ5dGVzIGZyb20gJy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYtPntob3N0fS4nOicuJHNlbGYtPntwb3J0fSk7Ci0gICAgfQotCi0gICAgbXkgJHNvY2sgPSAkc29ja2V0c1swXTsKLQotICAgIG15ICgkYnVmLCRzeik7Ci0gICAgJHNvY2stPnJlY3YoJGJ1ZiwgJGxlbik7CisgICAgbXkgJHNvY2sgPSAkc2VsZi0+X193YWl0KCk7CisgICAgbXkgJGJ1ZiA9ICRzZWxmLT5fX3JlY3YoJHNvY2ssICRsZW4pOwogCiAgICAgaWYgKCFkZWZpbmVkICRidWYgfHwgJGJ1ZiBlcSAnJykgewogCi0gICAgICAgIGRpZSBuZXcgVEV4Y2VwdGlvbignVFNvY2tldDogQ291bGQgbm90IHJlYWQgJy4kbGVuLicgYnl0ZXMgZnJvbSAnLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYtPntob3N0fS4nOicuJHNlbGYtPntwb3J0fSk7CisgICAgICAgIGRpZSBUaHJpZnQ6OlRUcmFuc3BvcnRFeGNlcHRpb24tPm5ldyhyZWYoJHNlbGYpLic6IENvdWxkIG5vdCByZWFkICcuJGxlbi4nIGJ5dGVzIGZyb20gJy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICRzZWxmLT57aG9zdH0uJzonLiRzZWxmLT57cG9ydH0sIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjo6RU5EX09GX0ZJTEUpOwogCiAgICAgfQogCkBAIC0yMjksMzAgKzIxMiwyNyBAQAogICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICAgbXkgJGJ1ZiAgPSBzaGlmdDsKIAotCiAgICAgcmV0dXJuIHVubGVzcyBkZWZpbmVkICRzZWxmLT57aGFuZGxlfTsKIAogICAgIHdoaWxlIChsZW5ndGgoJGJ1ZikgPiAwKSB7Ci0KLQogICAgICAgICAjY2hlY2sgZm9yIHRpbWVvdXQKICAgICAgICAgbXkgQHNvY2tldHMgPSAkc2VsZi0+e2hhbmRsZX0tPmNhbl93cml0ZSggJHNlbGYtPntzZW5kVGltZW91dH0gLyAxMDAwICk7CiAKICAgICAgICAgaWYoQHNvY2tldHMgPT0gMCl7Ci0gICAgICAgICAgICBkaWUgbmV3IFRocmlmdDo6VEV4Y2VwdGlvbignVFNvY2tldDogdGltZWQgb3V0IHdyaXRpbmcgdG8gYnl0ZXMgZnJvbSAnLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYtPntob3N0fS4nOicuJHNlbGYtPntwb3J0fSk7CisgICAgICAgICAgICBkaWUgVGhyaWZ0OjpUVHJhbnNwb3J0RXhjZXB0aW9uLT5uZXcocmVmKCRzZWxmKS4nOiB0aW1lZCBvdXQgd3JpdGluZyB0byBieXRlcyBmcm9tICcuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2VsZi0+e2hvc3R9Lic6Jy4kc2VsZi0+e3BvcnR9LCBUaHJpZnQ6OlRUcmFuc3BvcnRFeGNlcHRpb246OlRJTUVEX09VVCk7CiAgICAgICAgIH0KIAotICAgICAgICBteSAkc29jayA9ICRzb2NrZXRzWzBdOworICAgICAgICBteSAkc2VudCA9ICRzZWxmLT5fX3NlbmQoJHNvY2tldHNbMF0sICRidWYpOwogCi0gICAgICAgIG15ICRnb3QgPSAkc29jay0+c2VuZCgkYnVmKTsKKyAgICAgICAgaWYgKCFkZWZpbmVkICRzZW50IHx8ICRzZW50ID09IDAgKSB7CiAKLSAgICAgICAgaWYgKCFkZWZpbmVkICRnb3QgfHwgJGdvdCA9PSAwICkgewotICAgICAgICAgICAgZGllIG5ldyBUaHJpZnQ6OlRFeGNlcHRpb24oJ1RTb2NrZXQ6IENvdWxkIG5vdCB3cml0ZSAnLmxlbmd0aCgkYnVmKS4nIGJ5dGVzICcuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2VsZi0+e2hvc3R9Lic6Jy4kc2VsZi0+e2hvc3R9KTsKKyAgICAgICAgICAgIGRpZSBUaHJpZnQ6OlRUcmFuc3BvcnRFeGNlcHRpb24tPm5ldyhyZWYoJHNlbGYpLic6IENvdWxkIG5vdCB3cml0ZSAnLmxlbmd0aCgkYnVmKS4nIGJ5dGVzICcuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2VsZi0+e2hvc3R9Lic6Jy4kc2VsZi0+e2hvc3R9LCBUaHJpZnQ6OlRUcmFuc3BvcnRFeGNlcHRpb246OkVORF9PRl9GSUxFKTsKKwogICAgICAgICB9CiAKLSAgICAgICAgJGJ1ZiA9IHN1YnN0cigkYnVmLCAkZ290KTsKKyAgICAgICAgJGJ1ZiA9IHN1YnN0cigkYnVmLCAkc2VudCk7CiAgICAgfQogfQogCkBAIC0yNjUsNjUgKzI0NSw4MiBAQAogCiAgICAgcmV0dXJuIHVubGVzcyBkZWZpbmVkICRzZWxmLT57aGFuZGxlfTsKIAotICAgIG15ICRyZXQgID0gKCRzZWxmLT57aGFuZGxlfS0+aGFuZGxlcygpKVswXS0+Zmx1c2g7CisgICAgbXkgJHJldCA9ICgkc2VsZi0+e2hhbmRsZX0tPmhhbmRsZXMoKSlbMF0tPmZsdXNoOwogfQogCisjIyMKKyMjIyBPdmVycmlkYWJsZSBtZXRob2RzCisjIyMKIAogIwotIyBCdWlsZCBhIFNlcnZlclNvY2tldCBmcm9tIHRoZSBTZXJ2ZXJUcmFuc3BvcnQgYmFzZSBjbGFzcworIyBPcGVuIGEgY29ubmVjdGlvbiB0byBhIHNlcnZlci4KICMKLXBhY2thZ2UgIFRocmlmdDo6U2VydmVyU29ja2V0OwotCi11c2UgYmFzZSBxdyggVGhyaWZ0OjpTb2NrZXQgVGhyaWZ0OjpTZXJ2ZXJUcmFuc3BvcnQgKTsKLQotdXNlIGNvbnN0YW50IExJU1RFTl9RVUVVRV9TSVpFID0+IDEyODsKLQotc3ViIG5ldwotewotICAgIG15ICRjbGFzc25hbWUgICA9IHNoaWZ0OwotICAgIG15ICRwb3J0ICAgICAgICA9IHNoaWZ0OwotCi0gICAgbXkgJHNlbGYgICAgICAgID0gJGNsYXNzbmFtZS0+U1VQRVI6Om5ldyh1bmRlZiwgJHBvcnQsIHVuZGVmKTsKLSAgICByZXR1cm4gYmxlc3MoJHNlbGYsJGNsYXNzbmFtZSk7Ci19Ci0KLXN1YiBsaXN0ZW4KK3N1YiBfX29wZW4KIHsKICAgICBteSAkc2VsZiA9IHNoaWZ0OwotCi0gICAgIyBMaXN0ZW4gdG8gYSBuZXcgc29ja2V0Ci0gICAgbXkgJHNvY2sgPSBJTzo6U29ja2V0OjpJTkVULT5uZXcoTG9jYWxBZGRyID0+IHVuZGVmLCAjIGFueSBhZGRyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxQb3J0ID0+ICRzZWxmLT57cG9ydH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvdG8gICAgID0+ICd0Y3AnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RlbiAgICA9PiBMSVNURU5fUVVFVUVfU0laRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXVzZUFkZHIgPT4gMSkKLSAgICAgICAgfHwgZG8gewotICAgICAgICAgICAgbXkgJGVycm9yID0gJ1RTZXJ2ZXJTb2NrZXQ6IENvdWxkIG5vdCBiaW5kIHRvICcgLgotICAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYtPntob3N0fSAuICc6JyAuICRzZWxmLT57cG9ydH0gLiAnICgnIC4gJCEgLiAnKSc7Ci0KLSAgICAgICAgICAgIGlmICgkc2VsZi0+e2RlYnVnfSkgewotICAgICAgICAgICAgICAgICRzZWxmLT57ZGVidWdIYW5kbGVyfS0+KCRlcnJvcik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGRpZSBuZXcgVGhyaWZ0OjpURXhjZXB0aW9uKCRlcnJvcik7Ci0gICAgICAgIH07Ci0KLSAgICAkc2VsZi0+e2hhbmRsZX0gPSAkc29jazsKKyAgICByZXR1cm4gSU86OlNvY2tldDo6SU5FVC0+bmV3KFBlZXJBZGRyID0+ICRzZWxmLT57aG9zdH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZWVyUG9ydCA9PiAkc2VsZi0+e3BvcnR9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvdG8gICAgPT4gJ3RjcCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lb3V0ICA9PiAkc2VsZi0+e3NlbmRUaW1lb3V0fSAvIDEwMDApOwogfQogCi1zdWIgYWNjZXB0CisjCisjIENsb3NlIHRoZSBjb25uZWN0aW9uCisjCitzdWIgX19jbG9zZQoreworICBteSAkc2VsZiA9IHNoaWZ0OworICAgIENPUkU6OmNsb3NlKCgkc2VsZi0+e2hhbmRsZX0tPmhhbmRsZXMoKSlbMF0pOworfQorCisjCisjIFJlYWQgZGF0YQorIworIyBAcGFyYW1baW5dICRzb2NrIHRoZSBzb2NrZXQKKyMgQHBhcmFtW2luXSAkbGVuIHRoZSBsZW5ndGggdG8gcmVhZAorIyBAcmV0dXJucyB0aGUgZGF0YSBidWZmZXIgdGhhdCB3YXMgcmVhZAorIworc3ViIF9fcmVjdgoreworICBteSAkc2VsZiA9IHNoaWZ0OworICBteSAkc29jayA9IHNoaWZ0OworICBteSAkbGVuID0gc2hpZnQ7CisgIG15ICRidWYgPSB1bmRlZjsKKyAgJHNvY2stPnJlY3YoJGJ1ZiwgJGxlbik7CisgIHJldHVybiAkYnVmOworfQorCisjCisjIFNlbmQgZGF0YQorIworIyBAcGFyYW1baW5dICRzb2NrIHRoZSBzb2NrZXQKKyMgQHBhcmFtW2luXSAkYnVmIHRoZSBkYXRhIGJ1ZmZlcgorIyBAcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4KKyMKK3N1YiBfX3NlbmQKIHsKICAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICRzb2NrID0gc2hpZnQ7CisgICAgbXkgJGJ1ZiA9IHNoaWZ0OworICAgIHJldHVybiAkc29jay0+c2VuZCgkYnVmKTsKK30KIAotICAgIGlmICggZXhpc3RzICRzZWxmLT57aGFuZGxlfSBhbmQgZGVmaW5lZCAkc2VsZi0+e2hhbmRsZX0gKQotICAgIHsKLSAgICAgICAgbXkgJGNsaWVudCAgICAgICAgPSAkc2VsZi0+e2hhbmRsZX0tPmFjY2VwdCgpOwotICAgICAgICBteSAkcmVzdWx0ICAgICAgICA9IG5ldyBUaHJpZnQ6OlNvY2tldDsKLSAgICAgICAgJHJlc3VsdC0+e2hhbmRsZX0gPSBuZXcgSU86OlNlbGVjdCgkY2xpZW50KTsKLSAgICAgICAgcmV0dXJuICRyZXN1bHQ7CisjCisjIFdhaXQgZm9yIGRhdGEgdG8gYmUgcmVhZGFibGUKKyMKKyMgQHJldHVybnMgYSBzb2NrZXQgdGhhdCBjYW4gYmUgcmVhZAorIworc3ViIF9fd2FpdAoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgQHNvY2tldHMgPSAkc2VsZi0+e2hhbmRsZX0tPmNhbl9yZWFkKCAkc2VsZi0+e3JlY3ZUaW1lb3V0fSAvIDEwMDAgKTsKKworICAgIGlmIChAc29ja2V0cyA9PSAwKSB7CisgICAgICAgIGRpZSBUaHJpZnQ6OlRUcmFuc3BvcnRFeGNlcHRpb24tPm5ldyhyZWYoJHNlbGYpLic6IHRpbWVkIG91dCByZWFkaW5nIGZyb20gJy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYtPntob3N0fS4nOicuJHNlbGYtPntwb3J0fSwgVGhyaWZ0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOjpUSU1FRF9PVVQpOwogICAgIH0KIAotICAgIHJldHVybiAwOworICAgIHJldHVybiAkc29ja2V0c1swXTsKIH0KIAogCmRpZmYgLS1naXQgYS9saWIvcGVybC9saWIvVGhyaWZ0L1RyYW5zcG9ydC5wbSBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvVHJhbnNwb3J0LnBtCmluZGV4IDVlYzZmZWUuLjQxYjdlMTUgMTAwNjQ0Ci0tLSBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvVHJhbnNwb3J0LnBtCisrKyBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvVHJhbnNwb3J0LnBtCkBAIC0xNywxNyArMTcsMTkgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLXJlcXVpcmUgNS42LjA7Cit1c2UgNS4xMC4wOwogdXNlIHN0cmljdDsKIHVzZSB3YXJuaW5nczsKIAogdXNlIFRocmlmdDsKK3VzZSBUaHJpZnQ6OkV4Y2VwdGlvbjsKIAogIwogIyBUcmFuc3BvcnQgZXhjZXB0aW9ucwogIwotcGFja2FnZSBUVHJhbnNwb3J0RXhjZXB0aW9uOworcGFja2FnZSBUaHJpZnQ6OlRUcmFuc3BvcnRFeGNlcHRpb247CiB1c2UgYmFzZSgnVGhyaWZ0OjpURXhjZXB0aW9uJyk7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CiAKIHVzZSBjb25zdGFudCBVTktOT1dOICAgICAgPT4gMDsKIHVzZSBjb25zdGFudCBOT1RfT1BFTiAgICAgPT4gMTsKQEAgLTM1LDcgKzM3LDcgQEAKIHVzZSBjb25zdGFudCBUSU1FRF9PVVQgICAgPT4gMzsKIHVzZSBjb25zdGFudCBFTkRfT0ZfRklMRSAgPT4gNDsKIAotc3ViIG5ld3sKK3N1YiBuZXcgewogICAgIG15ICRjbGFzc25hbWUgPSBzaGlmdDsKICAgICBteSAkc2VsZiAgICAgID0gJGNsYXNzbmFtZS0+U1VQRVI6Om5ldyhAXyk7CiAKQEAgLTQzLDYgKzQ1LDcgQEAKIH0KIAogcGFja2FnZSBUaHJpZnQ6OlRyYW5zcG9ydDsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKIAogIwogIyBXaGV0aGVyIHRoaXMgdHJhbnNwb3J0IGlzIG9wZW4uCkBAIC01MSw3ICs1NCw3IEBACiAjCiBzdWIgaXNPcGVuCiB7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKICMKQEAgLTYxLDcgKzY0LDcgQEAKICMKIHN1YiBvcGVuCiB7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKICMKQEAgLTY5LDcgKzcyLDcgQEAKICMKIHN1YiBjbG9zZQogewotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiAjCkBAIC04MSw4ICs4NCw3IEBACiAjCiBzdWIgcmVhZAogewotICAgIG15ICgkbGVuKTsKLSAgICBkaWUoImFic3RyYWN0Iik7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKICMKQEAgLTExNCw4ICsxMTYsNyBAQAogIwogc3ViIHdyaXRlCiB7Ci0gICAgbXkgKCRidWYpOwotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiAjCkBAIC0xMzAsNiArMTMxLDcgQEAKICMgVHJhbnNwb3J0RmFjdG9yeSBjcmVhdGVzIHRyYW5zcG9ydCBvYmplY3RzIGZyb20gdHJhbnNwb3J0cwogIwogcGFja2FnZSBUaHJpZnQ6OlRyYW5zcG9ydEZhY3Rvcnk7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CiAKIHN1YiBuZXcgewogICAgIG15ICRjbGFzc25hbWUgPSBzaGlmdDsKQEAgLTE1NiwyMCArMTU4LDIxIEBACiAjICBTZXJ2ZXJUcmFuc3BvcnQgYmFzZSBjbGFzcyBtb2R1bGUKICMKIHBhY2thZ2UgVGhyaWZ0OjpTZXJ2ZXJUcmFuc3BvcnQ7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CiAKIHN1YiBsaXN0ZW4KIHsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIGFjY2VwdAogewotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgY2xvc2UKIHsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogCmRpZmYgLS1naXQgYS9saWIvcGVybC9saWIvVGhyaWZ0L1R5cGUucG0gYi9saWIvcGVybC9saWIvVGhyaWZ0L1R5cGUucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ4ZGEzYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvVHlwZS5wbQpAQCAtMCwwICsxLDUwIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKwordXNlIDUuMTAuMDsKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7CisKK3VzZSBUaHJpZnQ7CisKKyMKKyMgRGF0YSB0eXBlcyB0aGF0IGNhbiBiZSBzZW50IHZpYSBUaHJpZnQKKyMKK3BhY2thZ2UgVGhyaWZ0OjpUVHlwZTsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKKwordXNlIGNvbnN0YW50IFNUT1AgICA9PiAwOwordXNlIGNvbnN0YW50IFZPSUQgICA9PiAxOwordXNlIGNvbnN0YW50IEJPT0wgICA9PiAyOwordXNlIGNvbnN0YW50IEJZVEUgICA9PiAzOwordXNlIGNvbnN0YW50IEkwOCAgICA9PiAzOwordXNlIGNvbnN0YW50IERPVUJMRSA9PiA0OwordXNlIGNvbnN0YW50IEkxNiAgICA9PiA2OwordXNlIGNvbnN0YW50IEkzMiAgICA9PiA4OwordXNlIGNvbnN0YW50IEk2NCAgICA9PiAxMDsKK3VzZSBjb25zdGFudCBTVFJJTkcgPT4gMTE7Cit1c2UgY29uc3RhbnQgVVRGNyAgID0+IDExOwordXNlIGNvbnN0YW50IFNUUlVDVCA9PiAxMjsKK3VzZSBjb25zdGFudCBNQVAgICAgPT4gMTM7Cit1c2UgY29uc3RhbnQgU0VUICAgID0+IDE0OwordXNlIGNvbnN0YW50IExJU1QgICA9PiAxNTsKK3VzZSBjb25zdGFudCBVVEY4ICAgPT4gMTY7Cit1c2UgY29uc3RhbnQgVVRGMTYgID0+IDE3OworCisxOwpkaWZmIC0tZ2l0IGEvbGliL3BlcmwvbGliL1RocmlmdC9Vbml4U2VydmVyU29ja2V0LnBtIGIvbGliL3BlcmwvbGliL1RocmlmdC9Vbml4U2VydmVyU29ja2V0LnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3NWU4MDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGVybC9saWIvVGhyaWZ0L1VuaXhTZXJ2ZXJTb2NrZXQucG0KQEAgLTAsMCArMSw4NCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3VzZSA1LjEwLjA7Cit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCit1c2UgVGhyaWZ0OwordXNlIFRocmlmdDo6U2VydmVyU29ja2V0OwordXNlIFRocmlmdDo6VW5peFNvY2tldDsKKwordXNlIElPOjpTb2NrZXQ6OlVOSVg7CisKK3BhY2thZ2UgVGhyaWZ0OjpVbml4U2VydmVyU29ja2V0OwordXNlIGJhc2UgcXcoIFRocmlmdDo6U2VydmVyU29ja2V0ICk7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CisKKyMKKyMgQ29uc3RydWN0b3IuCisjIElmIGEgc2luZ2xlIGFyZ3VtZW50IGlzIGdpdmVuIHRoYXQgaXMgbm90IGEgaGFzaCwgdGhhdCBpcyB0aGUgdW5peCBkb21haW4gc29ja2V0IHBhdGguCisjIElmIGEgc2luZ2xlIGFyZ3VtZW50IGlzIGdpdmVuIHRoYXQgaXMgYSBoYXNoOgorIyBAcGFyYW1baW5dICBwYXRoICAgdW5peCBkb21haW4gc29ja2V0IGZpbGUgbmFtZQorIyBAcGFyYW1baW5dICBxdWV1ZSAgdGhlIGxpc3RlbiBxdWV1ZSBzaXplIChkZWZhdWx0IGlzIG5vdCBzcGVjaWZpZWQgaXMgc3VwcGxpZWQgYnkgU2VydmVyU29ja2V0KQorIyBAZXhhbXBsZSAgICBteSAkc2VydmVyc29jayA9IFRocmlmdDo6VW5peFNlcnZlclNvY2tldC0+bmV3KCRwYXRoKTsKKyMgQGV4YW1wbGUgICAgbXkgJHNlcnZlcnNvY2sgPSBUaHJpZnQ6OlVuaXhTZXJ2ZXJTb2NrZXQtPm5ldyhwYXRoID0+ICJzb21lcGF0aCIsIHF1ZXVlID0+IDY0KTsKKyMKK3N1YiBuZXcKK3sKKyAgICBteSAkY2xhc3NuYW1lID0gc2hpZnQ7CisgICAgbXkgJGFyZ3MgICAgICA9IHNoaWZ0OworICAgIG15ICRzZWxmOworCisgICAgaWYgKHJlZigkYXJncykgZXEgJ0hBU0gnKSB7CisgICAgICAgICRzZWxmID0gJGNsYXNzbmFtZS0+U1VQRVI6Om5ldygkYXJncyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgJHNlbGYgPSAkY2xhc3NuYW1lLT5TVVBFUjo6bmV3KCk7CisgICAgICAgICRzZWxmLT57cGF0aH0gPSAkYXJnczsKKyAgICB9CisKKyAgICByZXR1cm4gYmxlc3MoJHNlbGYsICRjbGFzc25hbWUpOworfQorCitzdWIgX19jbGllbnQKK3sKKyAgcmV0dXJuIFRocmlmdDo6VW5peFNvY2tldC0+bmV3KCk7Cit9CisKK3N1YiBfX2xpc3RlbgoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBteSAkc29jayA9IElPOjpTb2NrZXQ6OlVOSVgtPm5ldygKKyAgICAgICAgVHlwZSAgICAgID0+IElPOjpTb2NrZXQ6OlNPQ0tfU1RSRUFNLAorICAgICAgICBMb2NhbCAgICAgPT4gJHNlbGYtPntwYXRofSwKKyAgICAgICAgTGlzdGVuICAgID0+ICRzZWxmLT57cXVldWV9KQorICAgIHx8IGRvIHsKKyAgICAgICAgbXkgJGVycm9yID0gJ1VuaXhTZXJ2ZXJTb2NrZXQ6IENvdWxkIG5vdCBiaW5kIHRvICcgLgorICAgICAgICAgICAgICAgICAgICAkc2VsZi0+e3BhdGh9IC4gJyAoJyAuICQhIC4gJyknOworICAgICAgICBpZiAoJHNlbGYtPntkZWJ1Z30pIHsKKyAgICAgICAgICAgICRzZWxmLT57ZGVidWdIYW5kbGVyfS0+KCRlcnJvcik7CisgICAgICAgIH0KKyAgICAgICAgZGllIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbi0+bmV3KCRlcnJvciwgVGhyaWZ0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTik7CisgICAgfTsKKworICAgIHJldHVybiAkc29jazsKK30KKworMTsKZGlmZiAtLWdpdCBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvVW5peFNvY2tldC5wbSBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvVW5peFNvY2tldC5wbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTM4NmQxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BlcmwvbGliL1RocmlmdC9Vbml4U29ja2V0LnBtCkBAIC0wLDAgKzEsNjcgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCit1c2UgNS4xMC4wOwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKwordXNlIFRocmlmdDsKK3VzZSBUaHJpZnQ6OlNvY2tldDsKKwordXNlIElPOjpTb2NrZXQ6OlVOSVg7CisKK3BhY2thZ2UgVGhyaWZ0OjpVbml4U29ja2V0OwordXNlIGJhc2UgcXcoIFRocmlmdDo6U29ja2V0ICk7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CisKKyMKKyMgQ29uc3RydWN0b3IuCisjIFRha2VzIGEgdW5peCBkb21haW4gc29ja2V0IGZpbGVuYW1lLgorIyBTZWUgVGhyaWZ0OjpTb2NrZXQgZm9yIGJhc2UgY2xhc3MgcGFyYW1ldGVycy4KKyMgQHBhcmFtW2luXSAgcGF0aCAgIHBhdGggdG8gdW5peCBzb2NrZXQgZmlsZQorIyBAZXhhbXBsZSAgICBteSAkc29jayA9IFRocmlmdDo6VW5peFNvY2tldC0+bmV3KCRwYXRoKTsKKyMKK3N1YiBuZXcKK3sKKyAgICBteSAkY2xhc3NuYW1lID0gc2hpZnQ7CisgICAgbXkgJHNlbGYgICAgICA9ICRjbGFzc25hbWUtPlNVUEVSOjpuZXcoKTsKKyAgICAkc2VsZi0+e3BhdGh9ID0gc2hpZnQ7CisgICAgcmV0dXJuIGJsZXNzKCRzZWxmLCAkY2xhc3NuYW1lKTsKK30KKworc3ViIF9fb3BlbgoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBteSAkc29jayA9IElPOjpTb2NrZXQ6OlVOSVgtPm5ldygKKyAgICAgICAgVHlwZSAgICAgID0+IElPOjpTb2NrZXQ6OlNPQ0tfU1RSRUFNLAorICAgICAgICBQZWVyICAgICAgPT4gJHNlbGYtPntwYXRofSkKKyAgICB8fCBkbyB7CisgICAgICAgIG15ICRlcnJvciA9ICdVbml4U29ja2V0OiBDb3VsZCBub3QgY29ubmVjdCB0byAnIC4KKyAgICAgICAgICAgICRzZWxmLT57cGF0aH0gLiAnICgnIC4gJCEgLiAnKSc7CisgICAgICAgIGlmICgkc2VsZi0+e2RlYnVnfSkgeworICAgICAgICAgICAgJHNlbGYtPntkZWJ1Z0hhbmRsZXJ9LT4oJGVycm9yKTsKKyAgICAgICAgfQorICAgICAgICBkaWUgVGhyaWZ0OjpUVHJhbnNwb3J0RXhjZXB0aW9uLT5uZXcoJGVycm9yLCBUaHJpZnQ6OlRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOKTsKKyAgICB9OworCisgICAgcmV0dXJuICRzb2NrOworfQorCisxOwpkaWZmIC0tZ2l0IGEvbGliL3BlcmwvdGVzdC9NYWtlZmlsZS5hbSBiL2xpYi9wZXJsL3Rlc3QvTWFrZWZpbGUuYW0KaW5kZXggNzk1YWFlZC4uZGUwMzk3MSAxMDA2NDQKLS0tIGEvbGliL3BlcmwvdGVzdC9NYWtlZmlsZS5hbQorKysgYi9saWIvcGVybC90ZXN0L01ha2VmaWxlLmFtCkBAIC0xNywxNSArMTcsNCBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotVEhSSUZUID0gQHRvcF9idWlsZGRpckAvY29tcGlsZXIvY3BwL3RocmlmdAotVEhSSUZUX0lGID0gQHRvcF9zcmNkaXJAL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKLQotY2hlY2stbG9jYWw6IGdlbi1wZXJsL1RocmlmdFRlc3QvVHlwZXMucG0KLQotZ2VuLXBlcmwvVGhyaWZ0VGVzdC9UeXBlcy5wbTogJChUSFJJRlRfSUYpCi0JJChUSFJJRlQpIC0tZ2VuIHBlcmwgJChUSFJJRlRfSUYpCi0KLWNsZWFuLWxvY2FsOgotCXJtIC1yZiBnZW4tcGVybAotCi1FWFRSQV9ESVNUID0gbWVtb3J5X2J1ZmZlci50IHByb2Nlc3Nvci50CitFWFRSQV9ESVNUID0gbWVtb3J5X2J1ZmZlci50IHByb2Nlc3Nvci50IG11bHRpcGxleC50CmRpZmYgLS1naXQgYS9saWIvcGVybC90ZXN0L211bHRpcGxleC50IGIvbGliL3BlcmwvdGVzdC9tdWx0aXBsZXgudApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGE5YjRkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BlcmwvdGVzdC9tdWx0aXBsZXgudApAQCAtMCwwICsxLDIwMSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3VzZSBUZXN0OjpNb3JlIHRlc3RzID0+IDY7CisKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7CisKK3VzZSBUaHJpZnQ6OkJpbmFyeVByb3RvY29sOwordXNlIFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0OwordXNlIFRocmlmdDo6TWVtb3J5QnVmZmVyOwordXNlIFRocmlmdDo6TWVzc2FnZVR5cGU7Cit1c2UgVGhyaWZ0OjpNdWx0aXBsZXhlZFByb2Nlc3NvcjsKK3VzZSBUaHJpZnQ6OlNlcnZlcjsKK3VzZSBUaHJpZnQ6OlNvY2tldDsKKwordXNlIEJlbmNobWFya1NlcnZpY2U7Cit1c2UgQWdncjsKKwordXNlIGNvbnN0YW50IE5BTUVfQkVOQ0hNQVJLU0VSVklDRSA9PiAnQmVuY2htYXJrU2VydmljZSc7Cit1c2UgY29uc3RhbnQgTkFNRV9BR0dSICA9PiAgJ0FnZ3InOworCitteSAkYnVmZmVyICAgID0gVGhyaWZ0OjpNZW1vcnlCdWZmZXItPm5ldygxMDI0KTsKK215ICRhZ2dyX3Byb3RvY29sICA9IFRocmlmdDo6TXVsdGlwbGV4ZWRQcm90b2NvbC0+bmV3KFRocmlmdDo6QmluYXJ5UHJvdG9jb2wtPm5ldygkYnVmZmVyKSwgTkFNRV9BR0dSKTsKK215ICRhZ2dyX2NsaWVudCAgICA9IEFnZ3JDbGllbnQtPm5ldygkYWdncl9wcm90b2NvbCk7CitteSAkYmVuY2htYXJrX3Byb3RvY29sID0gVGhyaWZ0OjpNdWx0aXBsZXhlZFByb3RvY29sLT5uZXcoVGhyaWZ0OjpCaW5hcnlQcm90b2NvbC0+bmV3KCRidWZmZXIpLCBOQU1FX0JFTkNITUFSS1NFUlZJQ0UpOworbXkgJGJlbmNobWFya19jbGllbnQgPSBCZW5jaG1hcmtTZXJ2aWNlQ2xpZW50LT5uZXcoJGJlbmNobWFya19wcm90b2NvbCk7IAorCiskYnVmZmVyLT5vcGVuKCk7CisKK2ZvcihteSAkaSA9IDE7ICRpIDw9IDU7ICRpKyspIHsKKyAgICAkYWdncl9jbGllbnQtPnNlbmRfYWRkVmFsdWUoJGkpOworICAgICRhZ2dyX2NsaWVudC0+e3NlcWlkfSsrOworfQorCiskYWdncl9jbGllbnQtPnNlbmRfZ2V0VmFsdWVzKCk7CisKK2ZvcihteSAkaSA9IDE7ICRpIDw9IDU7ICRpKyspIHsKKyAgICAkYmVuY2htYXJrX2NsaWVudC0+c2VuZF9maWJvbmFjY2koJGkpOworICAgICRiZW5jaG1hcmtfY2xpZW50LT57c2VxaWR9Kys7Cit9CiskYmVuY2htYXJrX2NsaWVudC0+e3NlcWlkfS0tOworCitteSAkY2xpZW50X2NvbW1hbmRfYmluYXJ5ID0gJGJ1ZmZlci0+Z2V0QnVmZmVyOworJGJ1ZmZlci0+cmVzZXRCdWZmZXI7CisKKworIyBQcm9jZXNzIGJ5IHNlcnZlcgorbXkgJHNlcnZlcl9vdXRwdXRfYmluYXJ5OworeworICAgIG15ICRiZW5jaG1hcmtfaGFuZGxlciA9IE15OjpCZW5jaG1hcmtTZXJ2aWNlLT5uZXcoKTsKKyAgICBteSAkYmVuY2htYXJrX3Byb2Nlc3NvciA9IEJlbmNobWFya1NlcnZpY2VQcm9jZXNzb3ItPm5ldygkYmVuY2htYXJrX2hhbmRsZXIpOworICAgIG15ICRhZ2dyX2hhbmRsZXIgPSBNeTo6QWdnci0+bmV3KCk7IAorICAgIG15ICRhZ2dyX3Byb2Nlc3NvciA9IEFnZ3JQcm9jZXNzb3ItPm5ldygkYWdncl9oYW5kbGVyKTsKKyAgICAKKyAgICBteSAkcHJvdG9jb2xfZmFjdG9yeSA9IFRocmlmdDo6QmluYXJ5UHJvdG9jb2xGYWN0b3J5LT5uZXcoKTsKKworICAgIG15ICRpbnB1dF9idWZmZXIgICAgPSBUaHJpZnQ6Ok1lbW9yeUJ1ZmZlci0+bmV3KCk7CisgICAgJGlucHV0X2J1ZmZlci0+d3JpdGUoJGNsaWVudF9jb21tYW5kX2JpbmFyeSk7CisKKyAgICBteSAkaW5wdXRfcHJvdG9jb2wgID0gJHByb3RvY29sX2ZhY3RvcnktPmdldFByb3RvY29sKCRpbnB1dF9idWZmZXIpOworCisgICAgbXkgJG91dHB1dF9idWZmZXIgICA9IFRocmlmdDo6TWVtb3J5QnVmZmVyLT5uZXcoKTsKKyAgICBteSAkb3V0cHV0X3Byb3RvY29sID0gJHByb3RvY29sX2ZhY3RvcnktPmdldFByb3RvY29sKCRvdXRwdXRfYnVmZmVyKTsKKworICAgIG15ICRwcm9jZXNzb3IgPSBUaHJpZnQ6Ok11bHRpcGxleGVkUHJvY2Vzc29yLT5uZXcoKTsKKworICAgICRwcm9jZXNzb3ItPnJlZ2lzdGVyUHJvY2Vzc29yKE5BTUVfQkVOQ0hNQVJLU0VSVklDRSwgJGJlbmNobWFya19wcm9jZXNzb3IpOworICAgICRwcm9jZXNzb3ItPnJlZ2lzdGVyUHJvY2Vzc29yKE5BTUVfQUdHUiwgJGFnZ3JfcHJvY2Vzc29yKTsKKyAgICBteSAkcmVzdWx0OworICAgIGZvcihteSAkaSA9IDE7ICRpIDw9IDExOyAkaSsrKSB7CisgICAgICAgICRyZXN1bHQgPSAkcHJvY2Vzc29yLT5wcm9jZXNzKCRpbnB1dF9wcm90b2NvbCwgJG91dHB1dF9wcm90b2NvbCk7CisgICAgICAgIHByaW50ICJwcm9jZXNzIHJlc3VsdGVkIGluICRyZXN1bHRcbiI7CisgICAgfQorCisgICAgJHNlcnZlcl9vdXRwdXRfYmluYXJ5ID0gJG91dHB1dF9idWZmZXItPmdldEJ1ZmZlcigpOworfQorCiskYnVmZmVyLT53cml0ZSgkc2VydmVyX291dHB1dF9iaW5hcnkpOworCisKKworZm9yKG15ICRpID0gMTsgJGkgPD0gNTsgJGkrKykgeworICAgIG15ICgkZnVuY3Rpb25fbmFtZSwgJG1lc3NhZ2VfdHlwZSwgJHNlcXVlbmNlX2lkKTsKKworICAgICRhZ2dyX3Byb3RvY29sLT5yZWFkTWVzc2FnZUJlZ2luKFwkZnVuY3Rpb25fbmFtZSwgXCRtZXNzYWdlX3R5cGUsIFwkc2VxdWVuY2VfaWQpOworCisgICAgaWYgKCRtZXNzYWdlX3R5cGUgPT0gVGhyaWZ0OjpUTWVzc2FnZVR5cGU6OkVYQ0VQVElPTikgeworICAgICAgIGRpZTsKKyAgICB9CisgICAgCisgICAgbXkgJGFnZ3JfcmVzdWx0ID0gQWdncl9hZGRWYWx1ZV9yZXN1bHQtPm5ldygpOworICAgICRhZ2dyX3Jlc3VsdC0+cmVhZCgkYWdncl9wcm90b2NvbCk7CisgICAgJGFnZ3JfcHJvdG9jb2wtPnJlYWRNZXNzYWdlRW5kKCk7Cit9CisKK215ICgkZnVuY3Rpb25fbmFtZSwgJG1lc3NhZ2VfdHlwZSwgJHNlcXVlbmNlX2lkKTsKKworJGFnZ3JfcHJvdG9jb2wtPnJlYWRNZXNzYWdlQmVnaW4oXCRmdW5jdGlvbl9uYW1lLCBcJG1lc3NhZ2VfdHlwZSwgXCRzZXF1ZW5jZV9pZCk7CisKK2lmICgkbWVzc2FnZV90eXBlID09IFRocmlmdDo6VE1lc3NhZ2VUeXBlOjpFWENFUFRJT04pIHsKKyAgICBkaWU7Cit9CisgICAgCitteSAkYWdncl9yZXN1bHQgPSBBZ2dyX2dldFZhbHVlc19yZXN1bHQtPm5ldygpOworJGFnZ3JfcmVzdWx0LT5yZWFkKCRhZ2dyX3Byb3RvY29sKTsKKyRhZ2dyX3Byb3RvY29sLT5yZWFkTWVzc2FnZUVuZCgpOworCitpc19kZWVwbHkoJGFnZ3JfcmVzdWx0LT5zdWNjZXNzKCksIFsxLDIsMyw0LDVdKTsKKyAKKworZm9yZWFjaCBteSAkdmFsKCgxLDIsMyw1LDgpKSB7CisgICAgbXkgKCRmdW5jdGlvbl9uYW1lLCAkbWVzc2FnZV90eXBlLCAkc2VxdWVuY2VfaWQpOworCisgICAgJGJlbmNobWFya19wcm90b2NvbC0+cmVhZE1lc3NhZ2VCZWdpbihcJGZ1bmN0aW9uX25hbWUsIFwkbWVzc2FnZV90eXBlLCBcJHNlcXVlbmNlX2lkKTsKKworICAgIGlmICgkbWVzc2FnZV90eXBlID09IFRocmlmdDo6VE1lc3NhZ2VUeXBlOjpFWENFUFRJT04pIHsKKyAgICAgICAgZGllOworICAgIH0KKyAgICBteSAkYmVuY2htYXJrX3Jlc3VsdCA9IEJlbmNobWFya1NlcnZpY2VfZmlib25hY2NpX3Jlc3VsdC0+bmV3KCk7CisgICAgJGJlbmNobWFya19yZXN1bHQtPnJlYWQoJGJlbmNobWFya19wcm90b2NvbCk7CisgICAgJGJlbmNobWFya19wcm90b2NvbC0+cmVhZE1lc3NhZ2VFbmQoKTsKKyAgICAKKyAgICBpcygkYmVuY2htYXJrX3Jlc3VsdC0+c3VjY2VzcygpLCAkdmFsKTsKK30KKworCitwYWNrYWdlIE15OjpBZ2dyOwordXNlIGJhc2UgcXcoQWdncklmKTsgCisKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7IAorCitzdWIgbmV3IHsKKyAgICBteSAkY2xhc3NuYW1lID0gc2hpZnQ7CisgICAgbXkgJHNlbGYgICAgICA9IHt9OworICAgIAorICAgICRzZWxmLT57dmFsdWVzfSA9ICgpOworCisgICAgcmV0dXJuIGJsZXNzKCRzZWxmLCRjbGFzc25hbWUpOworfQorCitzdWIgYWRkVmFsdWV7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkdmFsdWUgPSBzaGlmdDsKKworICAgIHB1c2ggKEB7JHNlbGYtPnt2YWx1ZXN9fSwgJHZhbHVlKTsgIAorfQorCitzdWIgZ2V0VmFsdWVzeworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgCisgICByZXR1cm4gJHNlbGYtPnt2YWx1ZXN9OworfQorCisKKworcGFja2FnZSBNeTo6QmVuY2htYXJrU2VydmljZTsKK3VzZSBiYXNlIHF3KEJlbmNobWFya1NlcnZpY2VJZik7CisKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7CisKK3N1YiBuZXcgeworICAgIG15ICRjbGFzcyA9IHNoaWZ0OworICAgIHJldHVybiBibGVzcyB7fSwgJGNsYXNzOworfQorCitzdWIgZmlib25hY2NpIHsKKyAgICBteSAoJHNlbGYsICRuKSA9IEBfOworICAgIAorICAgIG15ICRwcmV2ID0gMDsKKyAgICBteSAkbmV4dDsKKyAgICBteSAkcmVzdWx0ID0gMTsKKyAgICAKKyAgICB3aGlsZSAoJG4gPiAwKSB7CisgICAgICAgICRuZXh0ID0gJHJlc3VsdCArICRwcmV2OworICAgICAgICAkcHJldiA9ICRyZXN1bHQ7CisgICAgICAgICRyZXN1bHQgPSAkbmV4dDsKKyAgICAgICAgLS0kbjsKKyAgICB9CisgICAgCisgICAgcmV0dXJuICRyZXN1bHQ7Cit9CisKZGlmZiAtLWdpdCBhL2xpYi9wZXJsL3Rlc3QvcHJvY2Vzc29yLnQgYi9saWIvcGVybC90ZXN0L3Byb2Nlc3Nvci50CmluZGV4IDFkOGJlNzMuLmY4MzMwMzUgMTAwNjQ0Ci0tLSBhL2xpYi9wZXJsL3Rlc3QvcHJvY2Vzc29yLnQKKysrIGIvbGliL3BlcmwvdGVzdC9wcm9jZXNzb3IudApAQCAtMjIsOSArMjIsOSBAQAogdXNlIHN0cmljdDsKIHVzZSB3YXJuaW5nczsKIAotdXNlIFRocmlmdDsKIHVzZSBUaHJpZnQ6OkJpbmFyeVByb3RvY29sOwogdXNlIFRocmlmdDo6TWVtb3J5QnVmZmVyOwordXNlIFRocmlmdDo6TWVzc2FnZVR5cGU7CiAKIHVzZSBUaHJpZnRUZXN0OjpUaHJpZnRUZXN0OwogdXNlIFRocmlmdFRlc3Q6OlR5cGVzOwpAQCAtNzIsNyArNzIsNyBAQAogICAgICRwcm90b2NvbC0+cmVhZE1lc3NhZ2VCZWdpbihcJGZ1bmN0aW9uX25hbWUsIFwkbWVzc2FnZV90eXBlLCBcJHNlcXVlbmNlX2lkKTsKICAgICBwcmludCAiICAkZnVuY3Rpb25fbmFtZSwgJG1lc3NhZ2VfdHlwZSwgJHNlcXVlbmNlX2lkXG4iOwogCi0gICAgaWYgKCRtZXNzYWdlX3R5cGUgPT0gVE1lc3NhZ2VUeXBlOjpFWENFUFRJT04pIHsKKyAgICBpZiAoJG1lc3NhZ2VfdHlwZSA9PSBUaHJpZnQ6OlRNZXNzYWdlVHlwZTo6RVhDRVBUSU9OKSB7CiAgICAgICAgIGRpZTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2xpYi9wZXJsL3Rvb2xzL0ZpeHVwRGlzdC5wbCBiL2xpYi9wZXJsL3Rvb2xzL0ZpeHVwRGlzdC5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGEyYjIwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BlcmwvdG9vbHMvRml4dXBEaXN0LnBsCkBAIC0wLDAgKzEsMzUgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjCisjIFRoaXMgd2lsbCBmaXggdXAgdGhlIGRpc3RyaWJ1dGlvbiBzbyB0aGF0IENQQU4gcHJvcGVybHkKKyMgaW5kZXhlcyBUaHJpZnQuCisjCisKK3VzZSA1LjEwLjA7Cit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOwordXNlIHV0Zjg7CisKK3VzZSBEYXRhOjpEdW1wZXI7Cit1c2UgQ1BBTjo6TWV0YTsKKworbXkgJG1ldGEgPSBDUEFOOjpNZXRhLT5sb2FkX2ZpbGUoJ01FVEEuanNvbicpOworJG1ldGEtPnsncHJvdmlkZXMnfSA9IHsgJ1RocmlmdCcgPT4geyAnZmlsZScgPT4gJ2xpYi9UaHJpZnQucG0nLCAndmVyc2lvbicgPT4gJG1ldGEtPnZlcnNpb24oKSB9IH07CiskbWV0YS0+c2F2ZSgnTUVUQS5qc29uJyk7CmRpZmYgLS1naXQgYS9saWIvcGhwL01ha2VmaWxlLmFtIGIvbGliL3BocC9NYWtlZmlsZS5hbQppbmRleCBlOWQ2NzNjLi44ZDkwNTBhIDEwMDc1NQotLS0gYS9saWIvcGhwL01ha2VmaWxlLmFtCisrKyBiL2xpYi9waHAvTWFrZWZpbGUuYW0KQEAgLTMxLDk0ICszMSwxMTQgQEAKIAogcGhwbW9kdWxlZGlyID0gYHBocC1jb25maWcgLS1leHRlbnNpb24tZGlyYAogcGhwbW9kdWxlX1NDUklQVFMgPSBzcmMvZXh0L3RocmlmdF9wcm90b2NvbC9tb2R1bGVzL3RocmlmdF9wcm90b2NvbC5zbworCitkaXN0Y2xlYW4tbG9jYWw6CisJY2QgJChwaHBtb2R1bGVfU0NSSVBUUykgJiYgJChQSFBJWkUpIC0tY2xlYW4KKwogZW5kaWYKIAotcGhwZGlyID0gJChQSFBfUFJFRklYKS9UaHJpZnQKK3BocGRpciA9ICQoUEhQX1BSRUZJWCkvCitwaHBfREFUQSA9IFwKKyAgbGliL1RNdWx0aXBsZXhlZFByb2Nlc3Nvci5waHAKIAogcGhwYmFzZWRpciA9ICQocGhwZGlyKS9CYXNlCiBwaHBiYXNlX0RBVEEgPSBcCi0gIGxpYi9UaHJpZnQvQmFzZS9UQmFzZS5waHAKKyAgbGliL0Jhc2UvVEJhc2UucGhwCiAKIHBocGNsYXNzbG9hZGVyZGlyID0gJChwaHBkaXIpL0NsYXNzTG9hZGVyCiBwaHBjbGFzc2xvYWRlcl9EQVRBID0gXAotICBsaWIvVGhyaWZ0L0NsYXNzTG9hZGVyL1RocmlmdENsYXNzTG9hZGVyLnBocAorICBsaWIvQ2xhc3NMb2FkZXIvVGhyaWZ0Q2xhc3NMb2FkZXIucGhwCiAKIHBocGV4Y2VwdGlvbmRpciA9ICQocGhwZGlyKS9FeGNlcHRpb24KIHBocGV4Y2VwdGlvbl9EQVRBID0gXAotICBsaWIvVGhyaWZ0L0V4Y2VwdGlvbi9UQXBwbGljYXRpb25FeGNlcHRpb24ucGhwIFwKLSAgbGliL1RocmlmdC9FeGNlcHRpb24vVEV4Y2VwdGlvbi5waHAgXAotICBsaWIvVGhyaWZ0L0V4Y2VwdGlvbi9UUHJvdG9jb2xFeGNlcHRpb24ucGhwIFwKLSAgbGliL1RocmlmdC9FeGNlcHRpb24vVFRyYW5zcG9ydEV4Y2VwdGlvbi5waHAKKyAgbGliL0V4Y2VwdGlvbi9UQXBwbGljYXRpb25FeGNlcHRpb24ucGhwIFwKKyAgbGliL0V4Y2VwdGlvbi9URXhjZXB0aW9uLnBocCBcCisgIGxpYi9FeGNlcHRpb24vVFByb3RvY29sRXhjZXB0aW9uLnBocCBcCisgIGxpYi9FeGNlcHRpb24vVFRyYW5zcG9ydEV4Y2VwdGlvbi5waHAKIAogcGhwZmFjdG9yeWRpciA9ICQocGhwZGlyKS9GYWN0b3J5CiBwaHBmYWN0b3J5X0RBVEEgPSBcCi0gIGxpYi9UaHJpZnQvRmFjdG9yeS9UQmluYXJ5UHJvdG9jb2xGYWN0b3J5LnBocCBcCi0gIGxpYi9UaHJpZnQvRmFjdG9yeS9UQ29tcGFjdFByb3RvY29sRmFjdG9yeS5waHAgXAotICBsaWIvVGhyaWZ0L0ZhY3RvcnkvVEpTT05Qcm90b2NvbEZhY3RvcnkucGhwIFwKLSAgbGliL1RocmlmdC9GYWN0b3J5L1RQcm90b2NvbEZhY3RvcnkucGhwIFwKLSAgbGliL1RocmlmdC9GYWN0b3J5L1RTdHJpbmdGdW5jRmFjdG9yeS5waHAgXAotICBsaWIvVGhyaWZ0L0ZhY3RvcnkvVFRyYW5zcG9ydEZhY3RvcnkucGhwCisgIGxpYi9GYWN0b3J5L1RCaW5hcnlQcm90b2NvbEZhY3RvcnkucGhwIFwKKyAgbGliL0ZhY3RvcnkvVENvbXBhY3RQcm90b2NvbEZhY3RvcnkucGhwIFwKKyAgbGliL0ZhY3RvcnkvVEpTT05Qcm90b2NvbEZhY3RvcnkucGhwIFwKKyAgbGliL0ZhY3RvcnkvVFByb3RvY29sRmFjdG9yeS5waHAgXAorICBsaWIvRmFjdG9yeS9UU3RyaW5nRnVuY0ZhY3RvcnkucGhwIFwKKyAgbGliL0ZhY3RvcnkvVFRyYW5zcG9ydEZhY3RvcnkucGhwCiAKIHBocHByb3RvY29sZGlyID0gJChwaHBkaXIpL1Byb3RvY29sCiBwaHBwcm90b2NvbF9EQVRBID0gXAotICBsaWIvVGhyaWZ0L1Byb3RvY29sL1RCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkLnBocCBcCi0gIGxpYi9UaHJpZnQvUHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLnBocCBcCi0gIGxpYi9UaHJpZnQvUHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5waHAgXAotICBsaWIvVGhyaWZ0L1Byb3RvY29sL1RKU09OUHJvdG9jb2wucGhwIFwKLSAgbGliL1RocmlmdC9Qcm90b2NvbC9UUHJvdG9jb2wucGhwCisgIGxpYi9Qcm90b2NvbC9UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZC5waHAgXAorICBsaWIvUHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLnBocCBcCisgIGxpYi9Qcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLnBocCBcCisgIGxpYi9Qcm90b2NvbC9USlNPTlByb3RvY29sLnBocCBcCisgIGxpYi9Qcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5waHAgXAorICBsaWIvUHJvdG9jb2wvVFByb3RvY29sLnBocCBcCisgIGxpYi9Qcm90b2NvbC9UUHJvdG9jb2xEZWNvcmF0b3IucGhwIFwKKyAgbGliL1Byb3RvY29sL1RTaW1wbGVKU09OUHJvdG9jb2wucGhwCiAKIHBocHByb3RvY29sanNvbmRpciA9ICQocGhwcHJvdG9jb2xkaXIpL0pTT04KIHBocHByb3RvY29sanNvbl9EQVRBID0gXAotICBsaWIvVGhyaWZ0L1Byb3RvY29sL0pTT04vQmFzZUNvbnRleHQucGhwIFwKLSAgbGliL1RocmlmdC9Qcm90b2NvbC9KU09OL0xpc3RDb250ZXh0LnBocCBcCi0gIGxpYi9UaHJpZnQvUHJvdG9jb2wvSlNPTi9Mb29rYWhlYWRSZWFkZXIucGhwIFwKLSAgbGliL1RocmlmdC9Qcm90b2NvbC9KU09OL1BhaXJDb250ZXh0LnBocAorICBsaWIvUHJvdG9jb2wvSlNPTi9CYXNlQ29udGV4dC5waHAgXAorICBsaWIvUHJvdG9jb2wvSlNPTi9MaXN0Q29udGV4dC5waHAgXAorICBsaWIvUHJvdG9jb2wvSlNPTi9Mb29rYWhlYWRSZWFkZXIucGhwIFwKKyAgbGliL1Byb3RvY29sL0pTT04vUGFpckNvbnRleHQucGhwCisKK3BocHByb3RvY29sc2ltcGxlanNvbmRpciA9ICQocGhwcHJvdG9jb2xkaXIpL1NpbXBsZUpTT04KK3BocHByb3RvY29sc2ltcGxlanNvbl9EQVRBID0gXAorICBsaWIvUHJvdG9jb2wvU2ltcGxlSlNPTi9Db2xsZWN0aW9uTWFwS2V5RXhjZXB0aW9uLnBocCBcCisgIGxpYi9Qcm90b2NvbC9TaW1wbGVKU09OL0NvbnRleHQucGhwIFwKKyAgbGliL1Byb3RvY29sL1NpbXBsZUpTT04vTGlzdENvbnRleHQucGhwIFwKKyAgbGliL1Byb3RvY29sL1NpbXBsZUpTT04vTWFwQ29udGV4dC5waHAgXAorICBsaWIvUHJvdG9jb2wvU2ltcGxlSlNPTi9TdHJ1Y3RDb250ZXh0LnBocAogCiBwaHBzZXJpYWxpemVyZGlyID0gJChwaHBkaXIpL1NlcmlhbGl6ZXIKIHBocHNlcmlhbGl6ZXJfREFUQSA9IFwKLSAgbGliL1RocmlmdC9TZXJpYWxpemVyL1RCaW5hcnlTZXJpYWxpemVyLnBocAorICBsaWIvU2VyaWFsaXplci9UQmluYXJ5U2VyaWFsaXplci5waHAKIAogcGhwc2VydmVyZGlyID0gJChwaHBkaXIpL1NlcnZlcgogcGhwc2VydmVyX0RBVEEgPSBcCi0gIGxpYi9UaHJpZnQvU2VydmVyL1RTZXJ2ZXJTb2NrZXQucGhwIFwKLSAgbGliL1RocmlmdC9TZXJ2ZXIvVEZvcmtpbmdTZXJ2ZXIucGhwIFwKLSAgbGliL1RocmlmdC9TZXJ2ZXIvVFNlcnZlci5waHAgXAotICBsaWIvVGhyaWZ0L1NlcnZlci9UU2VydmVyVHJhbnNwb3J0LnBocCBcCi0gIGxpYi9UaHJpZnQvU2VydmVyL1RTaW1wbGVTZXJ2ZXIucGhwCisgIGxpYi9TZXJ2ZXIvVFNlcnZlclNvY2tldC5waHAgXAorICBsaWIvU2VydmVyL1RGb3JraW5nU2VydmVyLnBocCBcCisgIGxpYi9TZXJ2ZXIvVFNlcnZlci5waHAgXAorICBsaWIvU2VydmVyL1RTZXJ2ZXJUcmFuc3BvcnQucGhwIFwKKyAgbGliL1NlcnZlci9UU2ltcGxlU2VydmVyLnBocAogCiBwaHBzdHJpbmdmdW5jZGlyID0gJChwaHBkaXIpL1N0cmluZ0Z1bmMKIHBocHN0cmluZ2Z1bmNfREFUQSA9IFwKLSAgbGliL1RocmlmdC9TdHJpbmdGdW5jL01ic3RyaW5nLnBocCBcCi0gIGxpYi9UaHJpZnQvU3RyaW5nRnVuYy9Db3JlLnBocCBcCi0gIGxpYi9UaHJpZnQvU3RyaW5nRnVuYy9UU3RyaW5nRnVuYy5waHAKKyAgbGliL1N0cmluZ0Z1bmMvTWJzdHJpbmcucGhwIFwKKyAgbGliL1N0cmluZ0Z1bmMvQ29yZS5waHAgXAorICBsaWIvU3RyaW5nRnVuYy9UU3RyaW5nRnVuYy5waHAKIAogcGhwdHJhbnNwb3J0ZGlyID0gJChwaHBkaXIpL1RyYW5zcG9ydAogcGhwdHJhbnNwb3J0X0RBVEEgPSBcCi0gIGxpYi9UaHJpZnQvVHJhbnNwb3J0L1RCdWZmZXJlZFRyYW5zcG9ydC5waHAgXAotICBsaWIvVGhyaWZ0L1RyYW5zcG9ydC9UQ3VybENsaWVudC5waHAgXAotICBsaWIvVGhyaWZ0L1RyYW5zcG9ydC9URnJhbWVkVHJhbnNwb3J0LnBocCBcCi0gIGxpYi9UaHJpZnQvVHJhbnNwb3J0L1RIdHRwQ2xpZW50LnBocCBcCi0gIGxpYi9UaHJpZnQvVHJhbnNwb3J0L1RNZW1vcnlCdWZmZXIucGhwIFwKLSAgbGliL1RocmlmdC9UcmFuc3BvcnQvVE51bGxUcmFuc3BvcnQucGhwIFwKLSAgbGliL1RocmlmdC9UcmFuc3BvcnQvVFBocFN0cmVhbS5waHAgXAotICBsaWIvVGhyaWZ0L1RyYW5zcG9ydC9UU29ja2V0LnBocCBcCi0gIGxpYi9UaHJpZnQvVHJhbnNwb3J0L1RTb2NrZXRQb29sLnBocCBcCi0gIGxpYi9UaHJpZnQvVHJhbnNwb3J0L1RUcmFuc3BvcnQucGhwCisgIGxpYi9UcmFuc3BvcnQvVEJ1ZmZlcmVkVHJhbnNwb3J0LnBocCBcCisgIGxpYi9UcmFuc3BvcnQvVEN1cmxDbGllbnQucGhwIFwKKyAgbGliL1RyYW5zcG9ydC9URnJhbWVkVHJhbnNwb3J0LnBocCBcCisgIGxpYi9UcmFuc3BvcnQvVEh0dHBDbGllbnQucGhwIFwKKyAgbGliL1RyYW5zcG9ydC9UTWVtb3J5QnVmZmVyLnBocCBcCisgIGxpYi9UcmFuc3BvcnQvVE51bGxUcmFuc3BvcnQucGhwIFwKKyAgbGliL1RyYW5zcG9ydC9UUGhwU3RyZWFtLnBocCBcCisgIGxpYi9UcmFuc3BvcnQvVFNvY2tldC5waHAgXAorICBsaWIvVHJhbnNwb3J0L1RTb2NrZXRQb29sLnBocCBcCisgIGxpYi9UcmFuc3BvcnQvVFRyYW5zcG9ydC5waHAKIAogcGhwdHlwZWRpciA9ICQocGhwZGlyKS9UeXBlCiBwaHB0eXBlX0RBVEEgPSBcCi0gIGxpYi9UaHJpZnQvVHlwZS9UTWVzc2FnZVR5cGUucGhwIFwKLSAgbGliL1RocmlmdC9UeXBlL1RUeXBlLnBocAorICBsaWIvVHlwZS9UTWVzc2FnZVR5cGUucGhwIFwKKyAgbGliL1R5cGUvVFR5cGUucGhwIFwKKyAgbGliL1R5cGUvVENvbnN0YW50LnBocAogCiBFWFRSQV9ESVNUID0gXAogICBsaWIgXAogICBzcmMvYXV0b2xvYWQucGhwIFwKKyAgc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvY29uZmlnLm00IFwKICAgc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvY29uZmlnLnczMiBcCiAgIHNyYy9leHQvdGhyaWZ0X3Byb3RvY29sL3BocF90aHJpZnRfcHJvdG9jb2wuY3BwIFwKICAgc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvcGhwX3RocmlmdF9wcm90b2NvbC5oIFwKICAgc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvcnVuLXRlc3RzLnBocCBcCiAgIHNyYy9UaHJpZnQucGhwIFwKICAgc3JjL1RTdHJpbmdVdGlscy5waHAgXAorICBjb2Rpbmdfc3RhbmRhcmRzLm1kIFwKICAgdGhyaWZ0X3Byb3RvY29sLmluaSBcCiAgIFJFQURNRS5hcGFjaGUubWQgXAogICBSRUFETUUubWQKZGlmZiAtLWdpdCBhL2xpYi9waHAvUkVBRE1FLm1kIGIvbGliL3BocC9SRUFETUUubWQKaW5kZXggYzI0ZWUyYy4uNzE3MDEwNCAxMDA2NDQKLS0tIGEvbGliL3BocC9SRUFETUUubWQKKysrIGIvbGliL3BocC9SRUFETUUubWQKQEAgLTEsNyArMSw2IEBACiBUaHJpZnQgUEhQIFNvZnR3YXJlIExpYnJhcnkKIAotTGljZW5zZQotPT09PT09PQorIyBMaWNlbnNlCiAKIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCkBAIC0yMCw4ICsxOSw3IEBACiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCiB1bmRlciB0aGUgTGljZW5zZS4KIAotVXNpbmcgVGhyaWZ0IHdpdGggUEhQCi09PT09PT09PT09PT09PT09PT09PT0KKyMgVXNpbmcgVGhyaWZ0IHdpdGggUEhQCiAKIFRocmlmdCByZXF1aXJlcyBQSFAgNS4gVGhyaWZ0IG1ha2VzIGFzIGZldyBhc3N1bXB0aW9ucyBhYm91dCB5b3VyIFBIUAogZW52aXJvbm1lbnQgYXMgcG9zc2libGUgd2hpbGUgdHJ5aW5nIHRvIG1ha2Ugc29tZSBtb3JlIGFkdmFuY2VkIFBIUApAQCAtMjksMjUgKzI3LDM0IEBACiAKIFRvIHVzZSBUaHJpZnQgaW4geW91ciBQSFAgY29kZWJhc2UsIHRha2UgdGhlIGZvbGxvd2luZyBzdGVwczoKIAotIzEpIENvcHkgYWxsIG9mIHRocmlmdC9saWIvcGhwL2xpYiBpbnRvIHlvdXIgUEhQIGNvZGViYXNlCi0jMikgQ29uZmlndXJlIFN5bWZvbnkgQXV0b2xvYWRlciAob3Igd2hhdGV2ZXIgeW91IHVzdWFsbHkgdXNlKQorMS4gQ29weSBhbGwgb2YgdGhyaWZ0L2xpYi9waHAvbGliIGludG8geW91ciBQSFAgY29kZWJhc2UKKzIuIENvbmZpZ3VyZSBTeW1mb255IEF1dG9sb2FkZXIgKG9yIHdoYXRldmVyIHlvdSB1c3VhbGx5IHVzZSkKIAogQWZ0ZXIgdGhhdCwgeW91IGhhdmUgdG8gbWFudWFsbHkgaW5jbHVkZSB0aGUgVGhyaWZ0IHBhY2thZ2UKIGNyZWF0ZWQgYnkgdGhlIGNvbXBpbGVyOgogCitgYGAKIHJlcXVpcmVfb25jZSAncGFja2FnZXMvU2VydmljZS9TZXJ2aWNlLnBocCc7CiByZXF1aXJlX29uY2UgJ3BhY2thZ2VzL1NlcnZpY2UvVHlwZXMucGhwJzsKK2BgYAogCi1EZXBlbmRlbmNpZXMKLT09PT09PT09PT09PQorIyBEZXBlbmRlbmNpZXMKIAogUEhQX0lOVF9TSVpFCiAKLSAgVGhpcyBidWlsdC1pbiBzaWduYWxzIHdoZXRoZXIgeW91ciBhcmNoaXRlY3R1cmUgaXMgMzIgb3IgNjQgYml0IGFuZCBpcwotICB1c2VkIGJ5IHRoZSBUQmluYXJ5UHJvdG9jb2wgdG8gcHJvcGVybHkgdXNlIHBhY2soKSBhbmQgdW5wYWNrKCkgdG8KLSAgc2VyaWFsaXplIGRhdGEuCisgICAgVGhpcyBidWlsdC1pbiBzaWduYWxzIHdoZXRoZXIgeW91ciBhcmNoaXRlY3R1cmUgaXMgMzIgb3IgNjQgYml0IGFuZCBpcworICAgIHVzZWQgYnkgdGhlIFRCaW5hcnlQcm90b2NvbCB0byBwcm9wZXJseSB1c2UgcGFjaygpIGFuZCB1bnBhY2soKSB0bworICAgIHNlcmlhbGl6ZSBkYXRhLgogCiBhcGNfZmV0Y2goKSwgYXBjX3N0b3JlKCkKIAotICBBUEMgY2FjaGUgaXMgdXNlZCBieSB0aGUgVFNvY2tldFBvb2wgY2xhc3MuIElmIHlvdSBkbyBub3QgaGF2ZSBBUEMgaW5zdGFsbGVkLAotICBUaHJpZnQgd2lsbCBmaWxsIGluIG51bGwgc3R1YiBmdW5jdGlvbiBkZWZpbml0aW9ucy4KKyAgICBBUEMgY2FjaGUgaXMgdXNlZCBieSB0aGUgVFNvY2tldFBvb2wgY2xhc3MuIElmIHlvdSBkbyBub3QgaGF2ZSBBUEMgaW5zdGFsbGVkLAorICAgIFRocmlmdCB3aWxsIGZpbGwgaW4gbnVsbCBzdHViIGZ1bmN0aW9uIGRlZmluaXRpb25zLgorCisjIEJyZWFraW5nIENoYW5nZXMKKworIyMgMC4xMi4wCisKKzEuIFtQU1ItNF0oaHR0cHM6Ly93d3cucGhwLWZpZy5vcmcvcHNyL3Bzci00LykgbG9hZGVyIGlzIG5vdyB0aGUgZGVmYXVsdC4gSWYgeW91IHdhbnQgdG8gdXNlIGNsYXNzIG1hcHMgaW5zdGVhZCwgdXNlIGAtZ2VuIHBocDpjbGFzc21hcGAuCisKKzIuIElmIHVzaW5nIFBTUi00LCB1c2UgYCR0aHJpZnRDbGFzc0xvYWRlci0+cmVnaXN0ZXJOYW1lc3BhY2UoJ25hbWVzcGFjZScsICc8cGF0aD4nKWAgaW5zdGVhZCBvZiBgJHRocmlmdENsYXNzTG9hZGVyLT5yZWdpc3RlckRlZmluaXRpb24oJ25hbWVzcGFjZScsICc8cGF0aD4nKWAuCmRpZmYgLS1naXQgYS9saWIvcGhwL2NvZGluZ19zdGFuZGFyZHMubWQgYi9saWIvcGhwL2NvZGluZ19zdGFuZGFyZHMubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTIxNzUzOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvY29kaW5nX3N0YW5kYXJkcy5tZApAQCAtMCwwICsxLDUgQEAKKyMjIFBIUCBDb2RpbmcgU3RhbmRhcmRzCisKK1BsZWFzZSBmb2xsb3c6CisgKiBbVGhyaWZ0IEdlbmVyYWwgQ29kaW5nIFN0YW5kYXJkc10oL2RvYy9jb2Rpbmdfc3RhbmRhcmRzLm1kKQorICogW1BTUi0yXShodHRwOi8vd3d3LnBocC1maWcub3JnL3Bzci9wc3ItMi8pCmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9CYXNlL1RCYXNlLnBocCBiL2xpYi9waHAvbGliL0Jhc2UvVEJhc2UucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2MWI2MzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9CYXNlL1RCYXNlLnBocApAQCAtMCwwICsxLDM4MiBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0CisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxCYXNlOworCit1c2UgVGhyaWZ0XFR5cGVcVFR5cGU7CisKKy8qKgorICogQmFzZSBjbGFzcyBmcm9tIHdoaWNoIG90aGVyIFRocmlmdCBzdHJ1Y3RzIGV4dGVuZC4gVGhpcyBpcyBzbyB0aGF0IHdlIGNhbgorICogY3V0IGJhY2sgb24gdGhlIHNpemUgb2YgdGhlIGdlbmVyYXRlZCBjb2RlIHdoaWNoIGlzIHR1cm5pbmcgb3V0IHRvIGhhdmUgYQorICogbm9udHJpdmlhbCBjb3N0IGp1c3QgdG8gbG9hZCB0aGFua3MgdG8gdGhlIHdvbmRyb3VzbHkgYWJ5c21hbCBpbXBsZW1lbnRhdGlvbgorICogb2YgUEhQLiBOb3RlIHRoYXQgY29kZSBpcyBpbnRlbnRpb25hbGx5IGR1cGxpY2F0ZWQgaW4gaGVyZSB0byBhdm9pZCBtYWtpbmcKKyAqIGZ1bmN0aW9uIGNhbGxzIGZvciBldmVyeSBmaWVsZCBvciBtZW1iZXIgb2YgYSBjb250YWluZXIuLgorICovCithYnN0cmFjdCBjbGFzcyBUQmFzZQoreworICAgIHB1YmxpYyBzdGF0aWMgJHRtZXRob2QgPSBhcnJheSgKKyAgICAgICAgVFR5cGU6OkJPT0wgPT4gJ0Jvb2wnLAorICAgICAgICBUVHlwZTo6QllURSA9PiAnQnl0ZScsCisgICAgICAgIFRUeXBlOjpJMTYgPT4gJ0kxNicsCisgICAgICAgIFRUeXBlOjpJMzIgPT4gJ0kzMicsCisgICAgICAgIFRUeXBlOjpJNjQgPT4gJ0k2NCcsCisgICAgICAgIFRUeXBlOjpET1VCTEUgPT4gJ0RvdWJsZScsCisgICAgICAgIFRUeXBlOjpTVFJJTkcgPT4gJ1N0cmluZycKKyAgICApOworCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHJlYWQoJGlucHV0KTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZSgkb3V0cHV0KTsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkc3BlYyA9IG51bGwsICR2YWxzID0gbnVsbCkKKyAgICB7CisgICAgICAgIGlmIChpc19hcnJheSgkc3BlYykgJiYgaXNfYXJyYXkoJHZhbHMpKSB7CisgICAgICAgICAgICBmb3JlYWNoICgkc3BlYyBhcyAkZmlkID0+ICRmc3BlYykgeworICAgICAgICAgICAgICAgICR2YXIgPSAkZnNwZWNbJ3ZhciddOworICAgICAgICAgICAgICAgIGlmIChpc3NldCgkdmFsc1skdmFyXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgJHRoaXMtPiR2YXIgPSAkdmFsc1skdmFyXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gX193YWtldXAoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPl9fY29uc3RydWN0KGdldF9vYmplY3RfdmFycygkdGhpcykpOworICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gX3JlYWRNYXAoJiR2YXIsICRzcGVjLCAkaW5wdXQpCisgICAgeworICAgICAgICAkeGZlciA9IDA7CisgICAgICAgICRrdHlwZSA9ICRzcGVjWydrdHlwZSddOworICAgICAgICAkdnR5cGUgPSAkc3BlY1sndnR5cGUnXTsKKyAgICAgICAgJGtyZWFkID0gJHZyZWFkID0gbnVsbDsKKyAgICAgICAgaWYgKGlzc2V0KFRCYXNlOjokdG1ldGhvZFska3R5cGVdKSkgeworICAgICAgICAgICAgJGtyZWFkID0gJ3JlYWQnIC4gVEJhc2U6OiR0bWV0aG9kWyRrdHlwZV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAka3NwZWMgPSAkc3BlY1sna2V5J107CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlzc2V0KFRCYXNlOjokdG1ldGhvZFskdnR5cGVdKSkgeworICAgICAgICAgICAgJHZyZWFkID0gJ3JlYWQnIC4gVEJhc2U6OiR0bWV0aG9kWyR2dHlwZV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkdnNwZWMgPSAkc3BlY1sndmFsJ107CisgICAgICAgIH0KKyAgICAgICAgJHZhciA9IGFycmF5KCk7CisgICAgICAgICRfa3R5cGUgPSAkX3Z0eXBlID0gJHNpemUgPSAwOworICAgICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRNYXBCZWdpbigkX2t0eXBlLCAkX3Z0eXBlLCAkc2l6ZSk7CisgICAgICAgIGZvciAoJGkgPSAwOyAkaSA8ICRzaXplOyArKyRpKSB7CisgICAgICAgICAgICAka2V5ID0gJHZhbCA9IG51bGw7CisgICAgICAgICAgICBpZiAoJGtyZWFkICE9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT4ka3JlYWQoJGtleSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoJGt0eXBlKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OlNUUlVDVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICRjbGFzcyA9ICRrc3BlY1snY2xhc3MnXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICRrZXkgPSBuZXcgJGNsYXNzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAka2V5LT5yZWFkKCRpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTWFwKCRrZXksICRrc3BlYywgJGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpMU1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRMaXN0KCRrZXksICRrc3BlYywgJGlucHV0LCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTGlzdCgka2V5LCAka3NwZWMsICRpbnB1dCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoJHZyZWFkICE9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT4kdnJlYWQoJHZhbCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoJHZ0eXBlKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OlNUUlVDVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICRjbGFzcyA9ICR2c3BlY1snY2xhc3MnXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICR2YWwgPSBuZXcgJGNsYXNzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdmFsLT5yZWFkKCRpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTWFwKCR2YWwsICR2c3BlYywgJGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpMU1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRMaXN0KCR2YWwsICR2c3BlYywgJGlucHV0LCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTGlzdCgkdmFsLCAkdnNwZWMsICRpbnB1dCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAkdmFyWyRrZXldID0gJHZhbDsKKyAgICAgICAgfQorICAgICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRNYXBFbmQoKTsKKworICAgICAgICByZXR1cm4gJHhmZXI7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBfcmVhZExpc3QoJiR2YXIsICRzcGVjLCAkaW5wdXQsICRzZXQgPSBmYWxzZSkKKyAgICB7CisgICAgICAgICR4ZmVyID0gMDsKKyAgICAgICAgJGV0eXBlID0gJHNwZWNbJ2V0eXBlJ107CisgICAgICAgICRlcmVhZCA9ICR2cmVhZCA9IG51bGw7CisgICAgICAgIGlmIChpc3NldChUQmFzZTo6JHRtZXRob2RbJGV0eXBlXSkpIHsKKyAgICAgICAgICAgICRlcmVhZCA9ICdyZWFkJyAuIFRCYXNlOjokdG1ldGhvZFskZXR5cGVdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJGVzcGVjID0gJHNwZWNbJ2VsZW0nXTsKKyAgICAgICAgfQorICAgICAgICAkdmFyID0gYXJyYXkoKTsKKyAgICAgICAgJF9ldHlwZSA9ICRzaXplID0gMDsKKyAgICAgICAgaWYgKCRzZXQpIHsKKyAgICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZFNldEJlZ2luKCRfZXR5cGUsICRzaXplKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZExpc3RCZWdpbigkX2V0eXBlLCAkc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgJHNpemU7ICsrJGkpIHsKKyAgICAgICAgICAgICRlbGVtID0gbnVsbDsKKyAgICAgICAgICAgIGlmICgkZXJlYWQgIT09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPiRlcmVhZCgkZWxlbSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICRlc3BlYyA9ICRzcGVjWydlbGVtJ107CisgICAgICAgICAgICAgICAgc3dpdGNoICgkZXR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgorICAgICAgICAgICAgICAgICAgICAgICAgJGNsYXNzID0gJGVzcGVjWydjbGFzcyddOworICAgICAgICAgICAgICAgICAgICAgICAgJGVsZW0gPSBuZXcgJGNsYXNzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkZWxlbS0+cmVhZCgkaW5wdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6Ok1BUDoKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fcmVhZE1hcCgkZWxlbSwgJGVzcGVjLCAkaW5wdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fcmVhZExpc3QoJGVsZW0sICRlc3BlYywgJGlucHV0LCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTGlzdCgkZWxlbSwgJGVzcGVjLCAkaW5wdXQsIHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCRzZXQpIHsKKyAgICAgICAgICAgICAgICAkdmFyWyRlbGVtXSA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICR2YXIgW10gPSAkZWxlbTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoJHNldCkgeworICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkU2V0RW5kKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRMaXN0RW5kKCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gJHhmZXI7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGZ1bmN0aW9uIF9yZWFkKCRjbGFzcywgJHNwZWMsICRpbnB1dCkKKyAgICB7CisgICAgICAgICR4ZmVyID0gMDsKKyAgICAgICAgJGZuYW1lID0gbnVsbDsKKyAgICAgICAgJGZ0eXBlID0gMDsKKyAgICAgICAgJGZpZCA9IDA7CisgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZFN0cnVjdEJlZ2luKCRmbmFtZSk7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRGaWVsZEJlZ2luKCRmbmFtZSwgJGZ0eXBlLCAkZmlkKTsKKyAgICAgICAgICAgIGlmICgkZnR5cGUgPT0gVFR5cGU6OlNUT1ApIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpc3NldCgkc3BlY1skZmlkXSkpIHsKKyAgICAgICAgICAgICAgICAkZnNwZWMgPSAkc3BlY1skZmlkXTsKKyAgICAgICAgICAgICAgICAkdmFyID0gJGZzcGVjWyd2YXInXTsKKyAgICAgICAgICAgICAgICBpZiAoJGZ0eXBlID09ICRmc3BlY1sndHlwZSddKSB7CisgICAgICAgICAgICAgICAgICAgICR4ZmVyID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzc2V0KFRCYXNlOjokdG1ldGhvZFskZnR5cGVdKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgJGZ1bmMgPSAncmVhZCcgLiBUQmFzZTo6JHRtZXRob2RbJGZ0eXBlXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+JGZ1bmMoJHRoaXMtPiR2YXIpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICgkZnR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpTVFJVQ1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjbGFzcyA9ICRmc3BlY1snY2xhc3MnXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPiR2YXIgPSBuZXcgJGNsYXNzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT4kdmFyLT5yZWFkKCRpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6Ok1BUDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTWFwKCR0aGlzLT4kdmFyLCAkZnNwZWMsICRpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTGlzdCgkdGhpcy0+JHZhciwgJGZzcGVjLCAkaW5wdXQsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRMaXN0KCR0aGlzLT4kdmFyLCAkZnNwZWMsICRpbnB1dCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5za2lwKCRmdHlwZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPnNraXAoJGZ0eXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZEZpZWxkRW5kKCk7CisgICAgICAgIH0KKyAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkU3RydWN0RW5kKCk7CisKKyAgICAgICAgcmV0dXJuICR4ZmVyOworICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gX3dyaXRlTWFwKCR2YXIsICRzcGVjLCAkb3V0cHV0KQorICAgIHsKKyAgICAgICAgJHhmZXIgPSAwOworICAgICAgICAka3R5cGUgPSAkc3BlY1sna3R5cGUnXTsKKyAgICAgICAgJHZ0eXBlID0gJHNwZWNbJ3Z0eXBlJ107CisgICAgICAgICRrd3JpdGUgPSAkdndyaXRlID0gbnVsbDsKKyAgICAgICAgaWYgKGlzc2V0KFRCYXNlOjokdG1ldGhvZFska3R5cGVdKSkgeworICAgICAgICAgICAgJGt3cml0ZSA9ICd3cml0ZScgLiBUQmFzZTo6JHRtZXRob2RbJGt0eXBlXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICRrc3BlYyA9ICRzcGVjWydrZXknXTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXNzZXQoVEJhc2U6OiR0bWV0aG9kWyR2dHlwZV0pKSB7CisgICAgICAgICAgICAkdndyaXRlID0gJ3dyaXRlJyAuIFRCYXNlOjokdG1ldGhvZFskdnR5cGVdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJHZzcGVjID0gJHNwZWNbJ3ZhbCddOworICAgICAgICB9CisgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlTWFwQmVnaW4oJGt0eXBlLCAkdnR5cGUsIGNvdW50KCR2YXIpKTsKKyAgICAgICAgZm9yZWFjaCAoJHZhciBhcyAka2V5ID0+ICR2YWwpIHsKKyAgICAgICAgICAgIGlmIChpc3NldCgka3dyaXRlKSkgeworICAgICAgICAgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPiRrd3JpdGUoJGtleSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoJGt0eXBlKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OlNUUlVDVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICRrZXktPndyaXRlKCRvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6Ok1BUDoKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVNYXAoJGtleSwgJGtzcGVjLCAkb3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpMU1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTGlzdCgka2V5LCAka3NwZWMsICRvdXRwdXQsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpTRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTGlzdCgka2V5LCAka3NwZWMsICRvdXRwdXQsIHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGlzc2V0KCR2d3JpdGUpKSB7CisgICAgICAgICAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+JHZ3cml0ZSgkdmFsKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3dpdGNoICgkdnR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHZhbC0+d3JpdGUoJG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZU1hcCgkdmFsLCAkdnNwZWMsICRvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVMaXN0KCR2YWwsICR2c3BlYywgJG91dHB1dCwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OlNFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVMaXN0KCR2YWwsICR2c3BlYywgJG91dHB1dCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVNYXBFbmQoKTsKKworICAgICAgICByZXR1cm4gJHhmZXI7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBfd3JpdGVMaXN0KCR2YXIsICRzcGVjLCAkb3V0cHV0LCAkc2V0ID0gZmFsc2UpCisgICAgeworICAgICAgICAkeGZlciA9IDA7CisgICAgICAgICRldHlwZSA9ICRzcGVjWydldHlwZSddOworICAgICAgICAkZXdyaXRlID0gbnVsbDsKKyAgICAgICAgaWYgKGlzc2V0KFRCYXNlOjokdG1ldGhvZFskZXR5cGVdKSkgeworICAgICAgICAgICAgJGV3cml0ZSA9ICd3cml0ZScgLiBUQmFzZTo6JHRtZXRob2RbJGV0eXBlXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICRlc3BlYyA9ICRzcGVjWydlbGVtJ107CisgICAgICAgIH0KKyAgICAgICAgaWYgKCRzZXQpIHsKKyAgICAgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU2V0QmVnaW4oJGV0eXBlLCBjb3VudCgkdmFyKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUxpc3RCZWdpbigkZXR5cGUsIGNvdW50KCR2YXIpKTsKKyAgICAgICAgfQorICAgICAgICBmb3JlYWNoICgkdmFyIGFzICRrZXkgPT4gJHZhbCkgeworICAgICAgICAgICAgJGVsZW0gPSAkc2V0ID8gJGtleSA6ICR2YWw7CisgICAgICAgICAgICBpZiAoaXNzZXQoJGV3cml0ZSkpIHsKKyAgICAgICAgICAgICAgICAkeGZlciArPSAkb3V0cHV0LT4kZXdyaXRlKCRlbGVtKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3dpdGNoICgkZXR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJGVsZW0tPndyaXRlKCRvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6Ok1BUDoKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVNYXAoJGVsZW0sICRlc3BlYywgJG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TFNUOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZUxpc3QoJGVsZW0sICRlc3BlYywgJG91dHB1dCwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OlNFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVMaXN0KCRlbGVtLCAkZXNwZWMsICRvdXRwdXQsIHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICgkc2V0KSB7CisgICAgICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZVNldEVuZCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVMaXN0RW5kKCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gJHhmZXI7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGZ1bmN0aW9uIF93cml0ZSgkY2xhc3MsICRzcGVjLCAkb3V0cHV0KQorICAgIHsKKyAgICAgICAgJHhmZXIgPSAwOworICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZVN0cnVjdEJlZ2luKCRjbGFzcyk7CisgICAgICAgIGZvcmVhY2ggKCRzcGVjIGFzICRmaWQgPT4gJGZzcGVjKSB7CisgICAgICAgICAgICAkdmFyID0gJGZzcGVjWyd2YXInXTsKKyAgICAgICAgICAgIGlmICgkdGhpcy0+JHZhciAhPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICRmdHlwZSA9ICRmc3BlY1sndHlwZSddOworICAgICAgICAgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRCZWdpbigkdmFyLCAkZnR5cGUsICRmaWQpOworICAgICAgICAgICAgICAgIGlmIChpc3NldChUQmFzZTo6JHRtZXRob2RbJGZ0eXBlXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgJGZ1bmMgPSAnd3JpdGUnIC4gVEJhc2U6OiR0bWV0aG9kWyRmdHlwZV07CisgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPiRmdW5jKCR0aGlzLT4kdmFyKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKCRmdHlwZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT4kdmFyLT53cml0ZSgkb3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6Ok1BUDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTWFwKCR0aGlzLT4kdmFyLCAkZnNwZWMsICRvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TFNUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVMaXN0KCR0aGlzLT4kdmFyLCAkZnNwZWMsICRvdXRwdXQsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OlNFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTGlzdCgkdGhpcy0+JHZhciwgJGZzcGVjLCAkb3V0cHV0LCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkRW5kKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZFN0b3AoKTsKKyAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTdHJ1Y3RFbmQoKTsKKworICAgICAgICByZXR1cm4gJHhmZXI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvQ2xhc3NMb2FkZXIvVGhyaWZ0Q2xhc3NMb2FkZXIucGhwIGIvbGliL3BocC9saWIvQ2xhc3NMb2FkZXIvVGhyaWZ0Q2xhc3NMb2FkZXIucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzNjFiZDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9DbGFzc0xvYWRlci9UaHJpZnRDbGFzc0xvYWRlci5waHAKQEAgLTAsMCArMSwyMDYgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIENsYXNzTG9hZGVyIHRvIGxvYWQgVGhyaWZ0IGxpYnJhcnkgYW5kIGRlZmluaXRpb25zCisgKiBJbnNwaXJlZCBmcm9tIFVuaXZlcnNhbENsYXNzTG9hZGVyIGZyb20gU3ltZm9ueSAyCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LmNsYXNzbG9hZGVyCisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxDbGFzc0xvYWRlcjsKKworY2xhc3MgVGhyaWZ0Q2xhc3NMb2FkZXIKK3sKKyAgICAvKioKKyAgICAgKiBOYW1lc3BhY2VzIHBhdGgKKyAgICAgKiBAdmFyIGFycmF5CisgICAgICovCisgICAgcHJvdGVjdGVkICRuYW1lc3BhY2VzID0gYXJyYXkoKTsKKworICAgIC8qKgorICAgICAqIFRocmlmdCBkZWZpbml0aW9uIHBhdGhzCisgICAgICogQHZhciB0eXBlCisgICAgICovCisgICAgcHJvdGVjdGVkICRkZWZpbml0aW9ucyA9IGFycmF5KCk7CisKKyAgICAvKioKKyAgICAgKiBEbyB3ZSB1c2UgQVBDIGNhY2hlID8KKyAgICAgKiBAdmFyIGJvb2xlYW4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJGFwYyA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogQVBDIENhY2hlIHByZWZpeAorICAgICAqIEB2YXIgc3RyaW5nCisgICAgICovCisgICAgcHJvdGVjdGVkICRhcGNfcHJlZml4OworCisgICAgLyoqCisgICAgICogU2V0IGF1dG9sb2FkZXIgdG8gdXNlIEFQQyBjYWNoZQorICAgICAqIEBwYXJhbSBib29sZWFuICRhcGMKKyAgICAgKiBAcGFyYW0gc3RyaW5nICRhcGNfcHJlZml4CisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRhcGMgPSBmYWxzZSwgJGFwY19wcmVmaXggPSBudWxsKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmFwYyA9ICRhcGM7CisgICAgICAgICR0aGlzLT5hcGNfcHJlZml4ID0gJGFwY19wcmVmaXg7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVnaXN0ZXJzIGEgbmFtZXNwYWNlLgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAkbmFtZXNwYWNlIFRoZSBuYW1lc3BhY2UKKyAgICAgKiBAcGFyYW0gYXJyYXl8c3RyaW5nICRwYXRocyBUaGUgbG9jYXRpb24ocykgb2YgdGhlIG5hbWVzcGFjZQorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiByZWdpc3Rlck5hbWVzcGFjZSgkbmFtZXNwYWNlLCAkcGF0aHMpCisgICAgeworICAgICAgICAkdGhpcy0+bmFtZXNwYWNlc1skbmFtZXNwYWNlXSA9IChhcnJheSkkcGF0aHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVnaXN0ZXJzIGEgVGhyaWZ0IGRlZmluaXRpb24gbmFtZXNwYWNlLgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAkbmFtZXNwYWNlIFRoZSBkZWZpbml0aW9uIG5hbWVzcGFjZQorICAgICAqIEBwYXJhbSBhcnJheXxzdHJpbmcgJHBhdGhzIFRoZSBsb2NhdGlvbihzKSBvZiB0aGUgZGVmaW5pdGlvbiBuYW1lc3BhY2UKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVnaXN0ZXJEZWZpbml0aW9uKCRuYW1lc3BhY2UsICRwYXRocykKKyAgICB7CisgICAgICAgICR0aGlzLT5kZWZpbml0aW9uc1skbmFtZXNwYWNlXSA9IChhcnJheSkkcGF0aHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVnaXN0ZXJzIHRoaXMgaW5zdGFuY2UgYXMgYW4gYXV0b2xvYWRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBCb29sZWFuICRwcmVwZW5kIFdoZXRoZXIgdG8gcHJlcGVuZCB0aGUgYXV0b2xvYWRlciBvciBub3QKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVnaXN0ZXIoJHByZXBlbmQgPSBmYWxzZSkKKyAgICB7CisgICAgICAgIHNwbF9hdXRvbG9hZF9yZWdpc3RlcihhcnJheSgkdGhpcywgJ2xvYWRDbGFzcycpLCB0cnVlLCAkcHJlcGVuZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9hZHMgdGhlIGdpdmVuIGNsYXNzLCBkZWZpbml0aW9uIG9yIGludGVyZmFjZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJpbmcgJGNsYXNzIFRoZSBuYW1lIG9mIHRoZSBjbGFzcworICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBsb2FkQ2xhc3MoJGNsYXNzKQorICAgIHsKKyAgICAgICAgaWYgKCh0cnVlID09PSAkdGhpcy0+YXBjICYmICgkZmlsZSA9ICR0aGlzLT5maW5kRmlsZUluQXBjKCRjbGFzcykpKSBvcgorICAgICAgICAgICAgKCRmaWxlID0gJHRoaXMtPmZpbmRGaWxlKCRjbGFzcykpCisgICAgICAgICkgeworICAgICAgICAgICAgcmVxdWlyZV9vbmNlICRmaWxlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9hZHMgdGhlIGdpdmVuIGNsYXNzIG9yIGludGVyZmFjZSBpbiBBUEMuCisgICAgICogQHBhcmFtICBzdHJpbmcgJGNsYXNzIFRoZSBuYW1lIG9mIHRoZSBjbGFzcworICAgICAqIEByZXR1cm4gc3RyaW5nCisgICAgICovCisgICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGZpbmRGaWxlSW5BcGMoJGNsYXNzKQorICAgIHsKKyAgICAgICAgaWYgKGZhbHNlID09PSAkZmlsZSA9IGFwY19mZXRjaCgkdGhpcy0+YXBjX3ByZWZpeCAuICRjbGFzcykpIHsKKyAgICAgICAgICAgIGFwY19zdG9yZSgkdGhpcy0+YXBjX3ByZWZpeCAuICRjbGFzcywgJGZpbGUgPSAkdGhpcy0+ZmluZEZpbGUoJGNsYXNzKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gJGZpbGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmluZCBjbGFzcyBpbiBuYW1lc3BhY2VzIG9yIGRlZmluaXRpb25zIGRpcmVjdG9yaWVzCisgICAgICogQHBhcmFtICBzdHJpbmcgJGNsYXNzCisgICAgICogQHJldHVybiBzdHJpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gZmluZEZpbGUoJGNsYXNzKQorICAgIHsKKyAgICAgICAgLy8gUmVtb3ZlIGZpcnN0IGJhY2tzbGFzaAorICAgICAgICBpZiAoJ1xcJyA9PSAkY2xhc3NbMF0pIHsKKyAgICAgICAgICAgICRjbGFzcyA9IHN1YnN0cigkY2xhc3MsIDEpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZhbHNlICE9PSAkcG9zID0gc3RycnBvcygkY2xhc3MsICdcXCcpKSB7CisgICAgICAgICAgICAvLyBOYW1lc3BhY2VkIGNsYXNzIG5hbWUKKyAgICAgICAgICAgICRuYW1lc3BhY2UgPSBzdWJzdHIoJGNsYXNzLCAwLCAkcG9zKTsKKworICAgICAgICAgICAgLy8gSXRlcmF0ZSBpbiBub3JtYWwgbmFtZXNwYWNlcworICAgICAgICAgICAgZm9yZWFjaCAoJHRoaXMtPm5hbWVzcGFjZXMgYXMgJG5zID0+ICRkaXJzKSB7CisgICAgICAgICAgICAgICAgLy9Eb24ndCBpbnRlcmZlcmUgd2l0aCBvdGhlciBhdXRvbG9hZGVycworICAgICAgICAgICAgICAgIGlmICgwICE9PSBzdHJwb3MoJG5hbWVzcGFjZSwgJG5zKSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3JlYWNoICgkZGlycyBhcyAkZGlyKSB7CisgICAgICAgICAgICAgICAgICAgICRjbGFzc05hbWUgPSBzdWJzdHIoJGNsYXNzLCAkcG9zICsgMSk7CisKKyAgICAgICAgICAgICAgICAgICAgJGZpbGUgPSAkZGlyIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJfcmVwbGFjZSgnXFwnLCBESVJFQ1RPUllfU0VQQVJBVE9SLCAkbmFtZXNwYWNlKSAuCisgICAgICAgICAgICAgICAgICAgICAgICBESVJFQ1RPUllfU0VQQVJBVE9SIC4KKyAgICAgICAgICAgICAgICAgICAgICAgICRjbGFzc05hbWUgLiAnLnBocCc7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGVfZXhpc3RzKCRmaWxlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRmaWxlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBJdGVyYXRlIGluIFRocmlmdCBuYW1lc3BhY2VzCisKKyAgICAgICAgICAgIC8vIFJlbW92ZSBmaXJzdCBwYXJ0IG9mIG5hbWVzcGFjZQorICAgICAgICAgICAgJG0gPSBleHBsb2RlKCdcXCcsICRjbGFzcyk7CisKKyAgICAgICAgICAgIC8vIElnbm9yZSB3cm9uZyBjYWxsCisgICAgICAgICAgICBpZiAoY291bnQoJG0pIDw9IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICRjbGFzcyA9IGFycmF5X3BvcCgkbSk7CisgICAgICAgICAgICAkbmFtZXNwYWNlID0gaW1wbG9kZSgnXFwnLCAkbSk7CisKKyAgICAgICAgICAgIGZvcmVhY2ggKCR0aGlzLT5kZWZpbml0aW9ucyBhcyAkbnMgPT4gJGRpcnMpIHsKKyAgICAgICAgICAgICAgICAvL0Rvbid0IGludGVyZmVyZSB3aXRoIG90aGVyIGF1dG9sb2FkZXJzCisgICAgICAgICAgICAgICAgaWYgKDAgIT09IHN0cnBvcygkbmFtZXNwYWNlLCAkbnMpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRkaXJzIGFzICRkaXIpIHsKKyAgICAgICAgICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgICAgICAgICAqIEF2YWlsYWJsZSBpbiBzZXJ2aWNlOiBJbnRlcmZhY2UsIENsaWVudCwgUHJvY2Vzc29yLCBSZXN0CisgICAgICAgICAgICAgICAgICAgICAqIEFuZCBldmVyeSBzZXJ2aWNlIG1ldGhvZHMgKF8uKykKKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIGlmICgwID09PSBwcmVnX21hdGNoKCcjKC4rKShpZnxjbGllbnR8cHJvY2Vzc29yfHJlc3QpJCNpJywgJGNsYXNzLCAkbikgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAwID09PSBwcmVnX21hdGNoKCcjKC4rKV9bYS16MC05XStfKGFyZ3N8cmVzdWx0KSQjaScsICRjbGFzcywgJG4pCisgICAgICAgICAgICAgICAgICAgICkgeworICAgICAgICAgICAgICAgICAgICAgICAgJGNsYXNzTmFtZSA9ICdUeXBlcyc7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAkY2xhc3NOYW1lID0gJG5bMV07CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAkZmlsZSA9ICRkaXIgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9yZXBsYWNlKCdcXCcsIERJUkVDVE9SWV9TRVBBUkFUT1IsICRuYW1lc3BhY2UpIC4KKyAgICAgICAgICAgICAgICAgICAgICAgIERJUkVDVE9SWV9TRVBBUkFUT1IgLgorICAgICAgICAgICAgICAgICAgICAgICAgJGNsYXNzTmFtZSAuICcucGhwJzsKKworICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZV9leGlzdHMoJGZpbGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJGZpbGU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9FeGNlcHRpb24vVEFwcGxpY2F0aW9uRXhjZXB0aW9uLnBocCBiL2xpYi9waHAvbGliL0V4Y2VwdGlvbi9UQXBwbGljYXRpb25FeGNlcHRpb24ucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViYjZhNmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9FeGNlcHRpb24vVEFwcGxpY2F0aW9uRXhjZXB0aW9uLnBocApAQCAtMCwwICsxLDc2IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XEV4Y2VwdGlvbjsKKwordXNlIFRocmlmdFxUeXBlXFRUeXBlOworCitjbGFzcyBUQXBwbGljYXRpb25FeGNlcHRpb24gZXh0ZW5kcyBURXhjZXB0aW9uCit7CisgICAgcHVibGljIHN0YXRpYyAkX1RTUEVDID0KKyAgICAgICAgYXJyYXkoMSA9PiBhcnJheSgndmFyJyA9PiAnbWVzc2FnZScsCisgICAgICAgICAgICAndHlwZScgPT4gVFR5cGU6OlNUUklORyksCisgICAgICAgICAgICAyID0+IGFycmF5KCd2YXInID0+ICdjb2RlJywKKyAgICAgICAgICAgICAgICAndHlwZScgPT4gVFR5cGU6OkkzMikpOworCisgICAgY29uc3QgVU5LTk9XTiA9IDA7CisgICAgY29uc3QgVU5LTk9XTl9NRVRIT0QgPSAxOworICAgIGNvbnN0IElOVkFMSURfTUVTU0FHRV9UWVBFID0gMjsKKyAgICBjb25zdCBXUk9OR19NRVRIT0RfTkFNRSA9IDM7CisgICAgY29uc3QgQkFEX1NFUVVFTkNFX0lEID0gNDsKKyAgICBjb25zdCBNSVNTSU5HX1JFU1VMVCA9IDU7CisgICAgY29uc3QgSU5URVJOQUxfRVJST1IgPSA2OworICAgIGNvbnN0IFBST1RPQ09MX0VSUk9SID0gNzsKKyAgICBjb25zdCBJTlZBTElEX1RSQU5TRk9STSA9IDg7CisgICAgY29uc3QgSU5WQUxJRF9QUk9UT0NPTCA9IDk7CisgICAgY29uc3QgVU5TVVBQT1JURURfQ0xJRU5UX1RZUEUgPSAxMDsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkbWVzc2FnZSA9IG51bGwsICRjb2RlID0gMCkKKyAgICB7CisgICAgICAgIHBhcmVudDo6X19jb25zdHJ1Y3QoJG1lc3NhZ2UsICRjb2RlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZCgkb3V0cHV0KQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5fcmVhZCgnVEFwcGxpY2F0aW9uRXhjZXB0aW9uJywgc2VsZjo6JF9UU1BFQywgJG91dHB1dCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlKCRvdXRwdXQpCisgICAgeworICAgICAgICAkeGZlciA9IDA7CisgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU3RydWN0QmVnaW4oJ1RBcHBsaWNhdGlvbkV4Y2VwdGlvbicpOworICAgICAgICBpZiAoJG1lc3NhZ2UgPSAkdGhpcy0+Z2V0TWVzc2FnZSgpKSB7CisgICAgICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkQmVnaW4oJ21lc3NhZ2UnLCBUVHlwZTo6U1RSSU5HLCAxKTsKKyAgICAgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU3RyaW5nKCRtZXNzYWdlKTsKKyAgICAgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRFbmQoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoJGNvZGUgPSAkdGhpcy0+Z2V0Q29kZSgpKSB7CisgICAgICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkQmVnaW4oJ3R5cGUnLCBUVHlwZTo6STMyLCAyKTsKKyAgICAgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlSTMyKCRjb2RlKTsKKyAgICAgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRFbmQoKTsKKyAgICAgICAgfQorICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkU3RvcCgpOworICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZVN0cnVjdEVuZCgpOworCisgICAgICAgIHJldHVybiAkeGZlcjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9FeGNlcHRpb24vVEV4Y2VwdGlvbi5waHAgYi9saWIvcGhwL2xpYi9FeGNlcHRpb24vVEV4Y2VwdGlvbi5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RiZjgzMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL0V4Y2VwdGlvbi9URXhjZXB0aW9uLnBocApAQCAtMCwwICsxLDM4NCBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0CisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxFeGNlcHRpb247CisKK3VzZSBUaHJpZnRcVHlwZVxUVHlwZTsKK3VzZSBUaHJpZnRcQmFzZVxUQmFzZTsKKworLyoqCisgKiBOT1RFKG1jc2xlZSk6IFRoaXMgY3VycmVudGx5IGNvbnRhaW5zIGEgdG9uIG9mIGR1cGxpY2F0ZWQgY29kZSBmcm9tIFRCYXNlCisgKiBiZWNhdXNlIHdlIG5lZWQgdG8gc2F2ZSBDUFUgY3ljbGVzIGFuZCB0aGlzIGlzIG5vdCB5ZXQgaW4gYW4gZXh0ZW5zaW9uLgorICogSWRlYWxseSB3ZSdkIG11bHRpcGx5LWluaGVyaXQgVEV4Y2VwdGlvbiBmcm9tIGJvdGggRXhjZXB0aW9uIGFuZCBCYXNlLCBidXQKKyAqIHRoYXQncyBub3QgcG9zc2libGUgaW4gUEhQIGFuZCB0aGVyZSBhcmUgbm8gbW9kdWxlcyBlaXRoZXIsIHNvIGZvciBub3cgd2UKKyAqIGFwb2xvZ2V0aWNhbGx5IHRha2UgYSB0cmlwIHRvIEhhY2tUb3duLgorICoKKyAqIENhbiBiZSBjYWxsZWQgd2l0aCBzdGFuZGFyZCBFeGNlcHRpb24gY29uc3RydWN0b3IgKG1lc3NhZ2UsIGNvZGUpIG9yIHdpdGgKKyAqIFRocmlmdCBCYXNlIG9iamVjdCBjb25zdHJ1Y3RvciAoc3BlYywgdmFscykuCisgKgorICogQHBhcmFtIG1peGVkICRwMSBNZXNzYWdlIChzdHJpbmcpIG9yIHR5cGUtc3BlYyAoYXJyYXkpCisgKiBAcGFyYW0gbWl4ZWQgJHAyIENvZGUgKGludGVnZXIpIG9yIHZhbHVlcyAoYXJyYXkpCisgKi8KK2NsYXNzIFRFeGNlcHRpb24gZXh0ZW5kcyBcRXhjZXB0aW9uCit7CisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRwMSA9IG51bGwsICRwMiA9IDApCisgICAgeworICAgICAgICBpZiAoaXNfYXJyYXkoJHAxKSAmJiBpc19hcnJheSgkcDIpKSB7CisgICAgICAgICAgICAkc3BlYyA9ICRwMTsKKyAgICAgICAgICAgICR2YWxzID0gJHAyOworICAgICAgICAgICAgZm9yZWFjaCAoJHNwZWMgYXMgJGZpZCA9PiAkZnNwZWMpIHsKKyAgICAgICAgICAgICAgICAkdmFyID0gJGZzcGVjWyd2YXInXTsKKyAgICAgICAgICAgICAgICBpZiAoaXNzZXQoJHZhbHNbJHZhcl0pKSB7CisgICAgICAgICAgICAgICAgICAgICR0aGlzLT4kdmFyID0gJHZhbHNbJHZhcl07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkcDEsICRwMik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljICR0bWV0aG9kID0gYXJyYXkoCisgICAgICAgIFRUeXBlOjpCT09MID0+ICdCb29sJywKKyAgICAgICAgVFR5cGU6OkJZVEUgPT4gJ0J5dGUnLAorICAgICAgICBUVHlwZTo6STE2ID0+ICdJMTYnLAorICAgICAgICBUVHlwZTo6STMyID0+ICdJMzInLAorICAgICAgICBUVHlwZTo6STY0ID0+ICdJNjQnLAorICAgICAgICBUVHlwZTo6RE9VQkxFID0+ICdEb3VibGUnLAorICAgICAgICBUVHlwZTo6U1RSSU5HID0+ICdTdHJpbmcnCisgICAgKTsKKworICAgIHByaXZhdGUgZnVuY3Rpb24gX3JlYWRNYXAoJiR2YXIsICRzcGVjLCAkaW5wdXQpCisgICAgeworICAgICAgICAkeGZlciA9IDA7CisgICAgICAgICRrdHlwZSA9ICRzcGVjWydrdHlwZSddOworICAgICAgICAkdnR5cGUgPSAkc3BlY1sndnR5cGUnXTsKKyAgICAgICAgJGtyZWFkID0gJHZyZWFkID0gbnVsbDsKKyAgICAgICAgaWYgKGlzc2V0KFRCYXNlOjokdG1ldGhvZFska3R5cGVdKSkgeworICAgICAgICAgICAgJGtyZWFkID0gJ3JlYWQnIC4gVEJhc2U6OiR0bWV0aG9kWyRrdHlwZV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAka3NwZWMgPSAkc3BlY1sna2V5J107CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlzc2V0KFRCYXNlOjokdG1ldGhvZFskdnR5cGVdKSkgeworICAgICAgICAgICAgJHZyZWFkID0gJ3JlYWQnIC4gVEJhc2U6OiR0bWV0aG9kWyR2dHlwZV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkdnNwZWMgPSAkc3BlY1sndmFsJ107CisgICAgICAgIH0KKyAgICAgICAgJHZhciA9IGFycmF5KCk7CisgICAgICAgICRfa3R5cGUgPSAkX3Z0eXBlID0gJHNpemUgPSAwOworICAgICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRNYXBCZWdpbigkX2t0eXBlLCAkX3Z0eXBlLCAkc2l6ZSk7CisgICAgICAgIGZvciAoJGkgPSAwOyAkaSA8ICRzaXplOyArKyRpKSB7CisgICAgICAgICAgICAka2V5ID0gJHZhbCA9IG51bGw7CisgICAgICAgICAgICBpZiAoJGtyZWFkICE9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT4ka3JlYWQoJGtleSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoJGt0eXBlKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OlNUUlVDVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICRjbGFzcyA9ICRrc3BlY1snY2xhc3MnXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICRrZXkgPSBuZXcgJGNsYXNzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAka2V5LT5yZWFkKCRpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTWFwKCRrZXksICRrc3BlYywgJGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpMU1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRMaXN0KCRrZXksICRrc3BlYywgJGlucHV0LCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTGlzdCgka2V5LCAka3NwZWMsICRpbnB1dCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoJHZyZWFkICE9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT4kdnJlYWQoJHZhbCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoJHZ0eXBlKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OlNUUlVDVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICRjbGFzcyA9ICR2c3BlY1snY2xhc3MnXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICR2YWwgPSBuZXcgJGNsYXNzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdmFsLT5yZWFkKCRpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTWFwKCR2YWwsICR2c3BlYywgJGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpMU1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRMaXN0KCR2YWwsICR2c3BlYywgJGlucHV0LCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTGlzdCgkdmFsLCAkdnNwZWMsICRpbnB1dCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAkdmFyWyRrZXldID0gJHZhbDsKKyAgICAgICAgfQorICAgICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRNYXBFbmQoKTsKKworICAgICAgICByZXR1cm4gJHhmZXI7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBfcmVhZExpc3QoJiR2YXIsICRzcGVjLCAkaW5wdXQsICRzZXQgPSBmYWxzZSkKKyAgICB7CisgICAgICAgICR4ZmVyID0gMDsKKyAgICAgICAgJGV0eXBlID0gJHNwZWNbJ2V0eXBlJ107CisgICAgICAgICRlcmVhZCA9ICR2cmVhZCA9IG51bGw7CisgICAgICAgIGlmIChpc3NldChUQmFzZTo6JHRtZXRob2RbJGV0eXBlXSkpIHsKKyAgICAgICAgICAgICRlcmVhZCA9ICdyZWFkJyAuIFRCYXNlOjokdG1ldGhvZFskZXR5cGVdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJGVzcGVjID0gJHNwZWNbJ2VsZW0nXTsKKyAgICAgICAgfQorICAgICAgICAkdmFyID0gYXJyYXkoKTsKKyAgICAgICAgJF9ldHlwZSA9ICRzaXplID0gMDsKKyAgICAgICAgaWYgKCRzZXQpIHsKKyAgICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZFNldEJlZ2luKCRfZXR5cGUsICRzaXplKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZExpc3RCZWdpbigkX2V0eXBlLCAkc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgJHNpemU7ICsrJGkpIHsKKyAgICAgICAgICAgICRlbGVtID0gbnVsbDsKKyAgICAgICAgICAgIGlmICgkZXJlYWQgIT09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPiRlcmVhZCgkZWxlbSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICRlc3BlYyA9ICRzcGVjWydlbGVtJ107CisgICAgICAgICAgICAgICAgc3dpdGNoICgkZXR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgorICAgICAgICAgICAgICAgICAgICAgICAgJGNsYXNzID0gJGVzcGVjWydjbGFzcyddOworICAgICAgICAgICAgICAgICAgICAgICAgJGVsZW0gPSBuZXcgJGNsYXNzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkZWxlbS0+cmVhZCgkaW5wdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6Ok1BUDoKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fcmVhZE1hcCgkZWxlbSwgJGVzcGVjLCAkaW5wdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fcmVhZExpc3QoJGVsZW0sICRlc3BlYywgJGlucHV0LCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTGlzdCgkZWxlbSwgJGVzcGVjLCAkaW5wdXQsIHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCRzZXQpIHsKKyAgICAgICAgICAgICAgICAkdmFyWyRlbGVtXSA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICR2YXIgW10gPSAkZWxlbTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoJHNldCkgeworICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkU2V0RW5kKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRMaXN0RW5kKCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gJHhmZXI7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGZ1bmN0aW9uIF9yZWFkKCRjbGFzcywgJHNwZWMsICRpbnB1dCkKKyAgICB7CisgICAgICAgICR4ZmVyID0gMDsKKyAgICAgICAgJGZuYW1lID0gbnVsbDsKKyAgICAgICAgJGZ0eXBlID0gMDsKKyAgICAgICAgJGZpZCA9IDA7CisgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZFN0cnVjdEJlZ2luKCRmbmFtZSk7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRGaWVsZEJlZ2luKCRmbmFtZSwgJGZ0eXBlLCAkZmlkKTsKKyAgICAgICAgICAgIGlmICgkZnR5cGUgPT0gVFR5cGU6OlNUT1ApIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpc3NldCgkc3BlY1skZmlkXSkpIHsKKyAgICAgICAgICAgICAgICAkZnNwZWMgPSAkc3BlY1skZmlkXTsKKyAgICAgICAgICAgICAgICAkdmFyID0gJGZzcGVjWyd2YXInXTsKKyAgICAgICAgICAgICAgICBpZiAoJGZ0eXBlID09ICRmc3BlY1sndHlwZSddKSB7CisgICAgICAgICAgICAgICAgICAgICR4ZmVyID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzc2V0KFRCYXNlOjokdG1ldGhvZFskZnR5cGVdKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgJGZ1bmMgPSAncmVhZCcgLiBUQmFzZTo6JHRtZXRob2RbJGZ0eXBlXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+JGZ1bmMoJHRoaXMtPiR2YXIpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICgkZnR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpTVFJVQ1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjbGFzcyA9ICRmc3BlY1snY2xhc3MnXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPiR2YXIgPSBuZXcgJGNsYXNzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT4kdmFyLT5yZWFkKCRpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6Ok1BUDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTWFwKCR0aGlzLT4kdmFyLCAkZnNwZWMsICRpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTGlzdCgkdGhpcy0+JHZhciwgJGZzcGVjLCAkaW5wdXQsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRMaXN0KCR0aGlzLT4kdmFyLCAkZnNwZWMsICRpbnB1dCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5za2lwKCRmdHlwZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPnNraXAoJGZ0eXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZEZpZWxkRW5kKCk7CisgICAgICAgIH0KKyAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkU3RydWN0RW5kKCk7CisKKyAgICAgICAgcmV0dXJuICR4ZmVyOworICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gX3dyaXRlTWFwKCR2YXIsICRzcGVjLCAkb3V0cHV0KQorICAgIHsKKyAgICAgICAgJHhmZXIgPSAwOworICAgICAgICAka3R5cGUgPSAkc3BlY1sna3R5cGUnXTsKKyAgICAgICAgJHZ0eXBlID0gJHNwZWNbJ3Z0eXBlJ107CisgICAgICAgICRrd3JpdGUgPSAkdndyaXRlID0gbnVsbDsKKyAgICAgICAgaWYgKGlzc2V0KFRCYXNlOjokdG1ldGhvZFska3R5cGVdKSkgeworICAgICAgICAgICAgJGt3cml0ZSA9ICd3cml0ZScgLiBUQmFzZTo6JHRtZXRob2RbJGt0eXBlXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICRrc3BlYyA9ICRzcGVjWydrZXknXTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXNzZXQoVEJhc2U6OiR0bWV0aG9kWyR2dHlwZV0pKSB7CisgICAgICAgICAgICAkdndyaXRlID0gJ3dyaXRlJyAuIFRCYXNlOjokdG1ldGhvZFskdnR5cGVdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJHZzcGVjID0gJHNwZWNbJ3ZhbCddOworICAgICAgICB9CisgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlTWFwQmVnaW4oJGt0eXBlLCAkdnR5cGUsIGNvdW50KCR2YXIpKTsKKyAgICAgICAgZm9yZWFjaCAoJHZhciBhcyAka2V5ID0+ICR2YWwpIHsKKyAgICAgICAgICAgIGlmIChpc3NldCgka3dyaXRlKSkgeworICAgICAgICAgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPiRrd3JpdGUoJGtleSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoJGt0eXBlKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OlNUUlVDVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICRrZXktPndyaXRlKCRvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6Ok1BUDoKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVNYXAoJGtleSwgJGtzcGVjLCAkb3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpMU1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTGlzdCgka2V5LCAka3NwZWMsICRvdXRwdXQsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpTRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTGlzdCgka2V5LCAka3NwZWMsICRvdXRwdXQsIHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGlzc2V0KCR2d3JpdGUpKSB7CisgICAgICAgICAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+JHZ3cml0ZSgkdmFsKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3dpdGNoICgkdnR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHZhbC0+d3JpdGUoJG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZU1hcCgkdmFsLCAkdnNwZWMsICRvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVMaXN0KCR2YWwsICR2c3BlYywgJG91dHB1dCwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OlNFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVMaXN0KCR2YWwsICR2c3BlYywgJG91dHB1dCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVNYXBFbmQoKTsKKworICAgICAgICByZXR1cm4gJHhmZXI7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBfd3JpdGVMaXN0KCR2YXIsICRzcGVjLCAkb3V0cHV0LCAkc2V0ID0gZmFsc2UpCisgICAgeworICAgICAgICAkeGZlciA9IDA7CisgICAgICAgICRldHlwZSA9ICRzcGVjWydldHlwZSddOworICAgICAgICAkZXdyaXRlID0gbnVsbDsKKyAgICAgICAgaWYgKGlzc2V0KFRCYXNlOjokdG1ldGhvZFskZXR5cGVdKSkgeworICAgICAgICAgICAgJGV3cml0ZSA9ICd3cml0ZScgLiBUQmFzZTo6JHRtZXRob2RbJGV0eXBlXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICRlc3BlYyA9ICRzcGVjWydlbGVtJ107CisgICAgICAgIH0KKyAgICAgICAgaWYgKCRzZXQpIHsKKyAgICAgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU2V0QmVnaW4oJGV0eXBlLCBjb3VudCgkdmFyKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUxpc3RCZWdpbigkZXR5cGUsIGNvdW50KCR2YXIpKTsKKyAgICAgICAgfQorICAgICAgICBmb3JlYWNoICgkdmFyIGFzICRrZXkgPT4gJHZhbCkgeworICAgICAgICAgICAgJGVsZW0gPSAkc2V0ID8gJGtleSA6ICR2YWw7CisgICAgICAgICAgICBpZiAoaXNzZXQoJGV3cml0ZSkpIHsKKyAgICAgICAgICAgICAgICAkeGZlciArPSAkb3V0cHV0LT4kZXdyaXRlKCRlbGVtKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3dpdGNoICgkZXR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJGVsZW0tPndyaXRlKCRvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6Ok1BUDoKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVNYXAoJGVsZW0sICRlc3BlYywgJG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TFNUOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZUxpc3QoJGVsZW0sICRlc3BlYywgJG91dHB1dCwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OlNFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVMaXN0KCRlbGVtLCAkZXNwZWMsICRvdXRwdXQsIHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICgkc2V0KSB7CisgICAgICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZVNldEVuZCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVMaXN0RW5kKCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gJHhmZXI7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGZ1bmN0aW9uIF93cml0ZSgkY2xhc3MsICRzcGVjLCAkb3V0cHV0KQorICAgIHsKKyAgICAgICAgJHhmZXIgPSAwOworICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZVN0cnVjdEJlZ2luKCRjbGFzcyk7CisgICAgICAgIGZvcmVhY2ggKCRzcGVjIGFzICRmaWQgPT4gJGZzcGVjKSB7CisgICAgICAgICAgICAkdmFyID0gJGZzcGVjWyd2YXInXTsKKyAgICAgICAgICAgIGlmICgkdGhpcy0+JHZhciAhPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICRmdHlwZSA9ICRmc3BlY1sndHlwZSddOworICAgICAgICAgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRCZWdpbigkdmFyLCAkZnR5cGUsICRmaWQpOworICAgICAgICAgICAgICAgIGlmIChpc3NldChUQmFzZTo6JHRtZXRob2RbJGZ0eXBlXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgJGZ1bmMgPSAnd3JpdGUnIC4gVEJhc2U6OiR0bWV0aG9kWyRmdHlwZV07CisgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPiRmdW5jKCR0aGlzLT4kdmFyKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKCRmdHlwZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT4kdmFyLT53cml0ZSgkb3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6Ok1BUDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTWFwKCR0aGlzLT4kdmFyLCAkZnNwZWMsICRvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TFNUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVMaXN0KCR0aGlzLT4kdmFyLCAkZnNwZWMsICRvdXRwdXQsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OlNFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTGlzdCgkdGhpcy0+JHZhciwgJGZzcGVjLCAkb3V0cHV0LCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkRW5kKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZFN0b3AoKTsKKyAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTdHJ1Y3RFbmQoKTsKKworICAgICAgICByZXR1cm4gJHhmZXI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvRXhjZXB0aW9uL1RQcm90b2NvbEV4Y2VwdGlvbi5waHAgYi9saWIvcGhwL2xpYi9FeGNlcHRpb24vVFByb3RvY29sRXhjZXB0aW9uLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTU1ZDQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvRXhjZXB0aW9uL1RQcm90b2NvbEV4Y2VwdGlvbi5waHAKQEAgLTAsMCArMSw1MCBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnByb3RvY29sCisgKiBAYXV0aG9yOiBybWFyaW4gKG1hcmluLnJhZHVAZmFjZWJvb2suY29tKQorICovCisKK25hbWVzcGFjZSBUaHJpZnRcRXhjZXB0aW9uOworCisvKioKKyAqIFByb3RvY29sIG1vZHVsZS4gQ29udGFpbnMgYWxsIHRoZSB0eXBlcyBhbmQgZGVmaW5pdGlvbnMgbmVlZGVkIHRvIGltcGxlbWVudAorICogYSBwcm90b2NvbCBlbmNvZGVyL2RlY29kZXIuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnByb3RvY29sCisgKi8KKworLyoqCisgKiBQcm90b2NvbCBleGNlcHRpb25zCisgKi8KK2NsYXNzIFRQcm90b2NvbEV4Y2VwdGlvbiBleHRlbmRzIFRFeGNlcHRpb24KK3sKKyAgICBjb25zdCBVTktOT1dOID0gMDsKKyAgICBjb25zdCBJTlZBTElEX0RBVEEgPSAxOworICAgIGNvbnN0IE5FR0FUSVZFX1NJWkUgPSAyOworICAgIGNvbnN0IFNJWkVfTElNSVQgPSAzOworICAgIGNvbnN0IEJBRF9WRVJTSU9OID0gNDsKKyAgICBjb25zdCBOT1RfSU1QTEVNRU5URUQgPSA1OworICAgIGNvbnN0IERFUFRIX0xJTUlUID0gNjsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkbWVzc2FnZSA9IG51bGwsICRjb2RlID0gMCkKKyAgICB7CisgICAgICAgIHBhcmVudDo6X19jb25zdHJ1Y3QoJG1lc3NhZ2UsICRjb2RlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9FeGNlcHRpb24vVFRyYW5zcG9ydEV4Y2VwdGlvbi5waHAgYi9saWIvcGhwL2xpYi9FeGNlcHRpb24vVFRyYW5zcG9ydEV4Y2VwdGlvbi5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q4ZDU2NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL0V4Y2VwdGlvbi9UVHJhbnNwb3J0RXhjZXB0aW9uLnBocApAQCAtMCwwICsxLDQwIEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0CisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxFeGNlcHRpb247CisKKy8qKgorICogVHJhbnNwb3J0IGV4Y2VwdGlvbnMKKyAqLworY2xhc3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBleHRlbmRzIFRFeGNlcHRpb24KK3sKKyAgICBjb25zdCBVTktOT1dOID0gMDsKKyAgICBjb25zdCBOT1RfT1BFTiA9IDE7CisgICAgY29uc3QgQUxSRUFEWV9PUEVOID0gMjsKKyAgICBjb25zdCBUSU1FRF9PVVQgPSAzOworICAgIGNvbnN0IEVORF9PRl9GSUxFID0gNDsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkbWVzc2FnZSA9IG51bGwsICRjb2RlID0gMCkKKyAgICB7CisgICAgICAgIHBhcmVudDo6X19jb25zdHJ1Y3QoJG1lc3NhZ2UsICRjb2RlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9GYWN0b3J5L1RCaW5hcnlQcm90b2NvbEZhY3RvcnkucGhwIGIvbGliL3BocC9saWIvRmFjdG9yeS9UQmluYXJ5UHJvdG9jb2xGYWN0b3J5LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTE5MTgzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvRmFjdG9yeS9UQmluYXJ5UHJvdG9jb2xGYWN0b3J5LnBocApAQCAtMCwwICsxLDQ1IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XEZhY3Rvcnk7CisKK3VzZSBUaHJpZnRcUHJvdG9jb2xcVEJpbmFyeVByb3RvY29sOworCisvKioKKyAqIEJpbmFyeSBQcm90b2NvbCBGYWN0b3J5CisgKi8KK2NsYXNzIFRCaW5hcnlQcm90b2NvbEZhY3RvcnkgaW1wbGVtZW50cyBUUHJvdG9jb2xGYWN0b3J5Cit7CisgICAgcHJpdmF0ZSAkc3RyaWN0UmVhZF8gPSBmYWxzZTsKKyAgICBwcml2YXRlICRzdHJpY3RXcml0ZV8gPSBmYWxzZTsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkc3RyaWN0UmVhZCA9IGZhbHNlLCAkc3RyaWN0V3JpdGUgPSBmYWxzZSkKKyAgICB7CisgICAgICAgICR0aGlzLT5zdHJpY3RSZWFkXyA9ICRzdHJpY3RSZWFkOworICAgICAgICAkdGhpcy0+c3RyaWN0V3JpdGVfID0gJHN0cmljdFdyaXRlOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRQcm90b2NvbCgkdHJhbnMpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IFRCaW5hcnlQcm90b2NvbCgkdHJhbnMsICR0aGlzLT5zdHJpY3RSZWFkXywgJHRoaXMtPnN0cmljdFdyaXRlXyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvRmFjdG9yeS9UQ29tcGFjdFByb3RvY29sRmFjdG9yeS5waHAgYi9saWIvcGhwL2xpYi9GYWN0b3J5L1RDb21wYWN0UHJvdG9jb2xGYWN0b3J5LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWZiOGZmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvRmFjdG9yeS9UQ29tcGFjdFByb3RvY29sRmFjdG9yeS5waHAKQEAgLTAsMCArMSw0MCBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnByb3RvY29sCisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxGYWN0b3J5OworCit1c2UgVGhyaWZ0XFByb3RvY29sXFRDb21wYWN0UHJvdG9jb2w7CisKKy8qKgorICogQ29tcGFjdCBQcm90b2NvbCBGYWN0b3J5CisgKi8KK2NsYXNzIFRDb21wYWN0UHJvdG9jb2xGYWN0b3J5IGltcGxlbWVudHMgVFByb3RvY29sRmFjdG9yeQoreworICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpCisgICAgeworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRQcm90b2NvbCgkdHJhbnMpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IFRDb21wYWN0UHJvdG9jb2woJHRyYW5zKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9GYWN0b3J5L1RKU09OUHJvdG9jb2xGYWN0b3J5LnBocCBiL2xpYi9waHAvbGliL0ZhY3RvcnkvVEpTT05Qcm90b2NvbEZhY3RvcnkucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiZmIxZDcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9GYWN0b3J5L1RKU09OUHJvdG9jb2xGYWN0b3J5LnBocApAQCAtMCwwICsxLDQwIEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XEZhY3Rvcnk7CisKK3VzZSBUaHJpZnRcUHJvdG9jb2xcVEpTT05Qcm90b2NvbDsKKworLyoqCisgKiBKU09OIFByb3RvY29sIEZhY3RvcnkKKyAqLworY2xhc3MgVEpTT05Qcm90b2NvbEZhY3RvcnkgaW1wbGVtZW50cyBUUHJvdG9jb2xGYWN0b3J5Cit7CisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkKKyAgICB7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGdldFByb3RvY29sKCR0cmFucykKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgVEpTT05Qcm90b2NvbCgkdHJhbnMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL0ZhY3RvcnkvVFByb3RvY29sRmFjdG9yeS5waHAgYi9saWIvcGhwL2xpYi9GYWN0b3J5L1RQcm90b2NvbEZhY3RvcnkucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzMDY2YzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9GYWN0b3J5L1RQcm90b2NvbEZhY3RvcnkucGhwCkBAIC0wLDAgKzEsMzYgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcRmFjdG9yeTsKKworLyoqCisgKiBQcm90b2NvbCBmYWN0b3J5IGNyZWF0ZXMgcHJvdG9jb2wgb2JqZWN0cyBmcm9tIHRyYW5zcG9ydHMKKyAqLworaW50ZXJmYWNlIFRQcm90b2NvbEZhY3RvcnkKK3sKKyAgICAvKioKKyAgICAgKiBCdWlsZCBhIHByb3RvY29sIGZyb20gdGhlIGJhc2UgdHJhbnNwb3J0CisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRocmlmdFxQcm90b2NvbFxUUHJvdG9jb2wgcHJvdG9jb2wKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0UHJvdG9jb2woJHRyYW5zKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL0ZhY3RvcnkvVFN0cmluZ0Z1bmNGYWN0b3J5LnBocCBiL2xpYi9waHAvbGliL0ZhY3RvcnkvVFN0cmluZ0Z1bmNGYWN0b3J5LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGRlNGQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvRmFjdG9yeS9UU3RyaW5nRnVuY0ZhY3RvcnkucGhwCkBAIC0wLDAgKzEsNjYgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XEZhY3Rvcnk7CisKK3VzZSBUaHJpZnRcU3RyaW5nRnVuY1xDb3JlOwordXNlIFRocmlmdFxTdHJpbmdGdW5jXE1ic3RyaW5nOwordXNlIFRocmlmdFxTdHJpbmdGdW5jXFRTdHJpbmdGdW5jOworCitjbGFzcyBUU3RyaW5nRnVuY0ZhY3RvcnkKK3sKKyAgICBwcml2YXRlIHN0YXRpYyAkX2luc3RhbmNlOworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBTaW5nbGV0b24gaW5zdGFuY2Ugb2YgVFN0cmluZ0Z1bmMgaW1wbGVtZW50YXRpb24gdGhhdCBpcworICAgICAqIGNvbXBhdGlibGUgd2l0aCB0aGUgY3VycmVudCBzeXN0ZW0ncyBtYnN0cmluZy5mdW5jX292ZXJsb2FkIHNldHRpbmdzLgorICAgICAqCisgICAgICogQHJldHVybiBUU3RyaW5nRnVuYworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY3JlYXRlKCkKKyAgICB7CisgICAgICAgIGlmICghc2VsZjo6JF9pbnN0YW5jZSkgeworICAgICAgICAgICAgc2VsZjo6X3NldEluc3RhbmNlKCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc2VsZjo6JF9pbnN0YW5jZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBfc2V0SW5zdGFuY2UoKQorICAgIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbm5vdCB1c2Ugc3RyKiBmdW5jdGlvbnMgZm9yIGJ5dGUgY291bnRpbmcgYmVjYXVzZSBtdWx0aWJ5dGUKKyAgICAgICAgICogY2hhcmFjdGVycyB3aWxsIGJlIHJlYWQgYSBzaW5nbGUgYnl0ZXMuCisgICAgICAgICAqCisgICAgICAgICAqIFNlZTogaHR0cDovL3BocC5uZXQvbWFudWFsL2VuL21ic3RyaW5nLm92ZXJsb2FkLnBocAorICAgICAgICAgKi8KKyAgICAgICAgaWYgKGluaV9nZXQoJ21ic3RyaW5nLmZ1bmNfb3ZlcmxvYWQnKSAmIDIpIHsKKyAgICAgICAgICAgIHNlbGY6OiRfaW5zdGFuY2UgPSBuZXcgTWJzdHJpbmcoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogbWJzdHJpbmcgaXMgbm90IGluc3RhbGxlZCBvciBkb2VzIG5vdCBoYXZlIGZ1bmN0aW9uIG92ZXJsb2FkaW5nCisgICAgICAgICAgICAgKiBvZiB0aGUgc3RyKiBmdW5jdGlvbnMgZW5hYmxlZCBzbyB1c2UgUEhQIGNvcmUgc3RyKiBmdW5jdGlvbnMgZm9yCisgICAgICAgICAgICAgKiBieXRlIGNvdW50aW5nLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBzZWxmOjokX2luc3RhbmNlID0gbmV3IENvcmUoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL0ZhY3RvcnkvVFRyYW5zcG9ydEZhY3RvcnkucGhwIGIvbGliL3BocC9saWIvRmFjdG9yeS9UVHJhbnNwb3J0RmFjdG9yeS5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNmMmVlYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL0ZhY3RvcnkvVFRyYW5zcG9ydEZhY3RvcnkucGhwCkBAIC0wLDAgKzEsMTggQEAKKzw/cGhwCisKK25hbWVzcGFjZSBUaHJpZnRcRmFjdG9yeTsKKwordXNlIFRocmlmdFxUcmFuc3BvcnRcVFRyYW5zcG9ydDsKKworY2xhc3MgVFRyYW5zcG9ydEZhY3RvcnkKK3sKKyAgICAvKioKKyAgICAgKiBAc3RhdGljCisgICAgICogQHBhcmFtIFRUcmFuc3BvcnQgJHRyYW5zcG9ydAorICAgICAqIEByZXR1cm4gVFRyYW5zcG9ydAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0VHJhbnNwb3J0KFRUcmFuc3BvcnQgJHRyYW5zcG9ydCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdHJhbnNwb3J0OworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1Byb3RvY29sL0pTT04vQmFzZUNvbnRleHQucGhwIGIvbGliL3BocC9saWIvUHJvdG9jb2wvSlNPTi9CYXNlQ29udGV4dC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFiY2I0OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1Byb3RvY29sL0pTT04vQmFzZUNvbnRleHQucGhwCkBAIC0wLDAgKzEsMzkgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcUHJvdG9jb2xcSlNPTjsKKworY2xhc3MgQmFzZUNvbnRleHQKK3sKKyAgICBwdWJsaWMgZnVuY3Rpb24gZXNjYXBlTnVtKCkKKyAgICB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoKQorICAgIHsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZCgpCisgICAgeworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1Byb3RvY29sL0pTT04vTGlzdENvbnRleHQucGhwIGIvbGliL3BocC9saWIvUHJvdG9jb2wvSlNPTi9MaXN0Q29udGV4dC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVmNjU5NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1Byb3RvY29sL0pTT04vTGlzdENvbnRleHQucGhwCkBAIC0wLDAgKzEsNTQgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcUHJvdG9jb2xcSlNPTjsKKwordXNlIFRocmlmdFxQcm90b2NvbFxUSlNPTlByb3RvY29sOworCitjbGFzcyBMaXN0Q29udGV4dCBleHRlbmRzIEJhc2VDb250ZXh0Cit7CisgICAgcHJpdmF0ZSAkZmlyc3RfID0gdHJ1ZTsKKyAgICBwcml2YXRlICRwXzsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkcCkKKyAgICB7CisgICAgICAgICR0aGlzLT5wXyA9ICRwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZSgpCisgICAgeworICAgICAgICBpZiAoJHRoaXMtPmZpcnN0XykgeworICAgICAgICAgICAgJHRoaXMtPmZpcnN0XyA9IGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJHRoaXMtPnBfLT5nZXRUcmFuc3BvcnQoKS0+d3JpdGUoVEpTT05Qcm90b2NvbDo6Q09NTUEpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWQoKQorICAgIHsKKyAgICAgICAgaWYgKCR0aGlzLT5maXJzdF8pIHsKKyAgICAgICAgICAgICR0aGlzLT5maXJzdF8gPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICR0aGlzLT5wXy0+cmVhZEpTT05TeW50YXhDaGFyKFRKU09OUHJvdG9jb2w6OkNPTU1BKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1Byb3RvY29sL0pTT04vTG9va2FoZWFkUmVhZGVyLnBocCBiL2xpYi9waHAvbGliL1Byb3RvY29sL0pTT04vTG9va2FoZWFkUmVhZGVyLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjE4YzQwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvUHJvdG9jb2wvSlNPTi9Mb29rYWhlYWRSZWFkZXIucGhwCkBAIC0wLDAgKzEsNTcgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcUHJvdG9jb2xcSlNPTjsKKworY2xhc3MgTG9va2FoZWFkUmVhZGVyCit7CisgICAgcHJpdmF0ZSAkaGFzRGF0YV8gPSBmYWxzZTsKKyAgICBwcml2YXRlICRkYXRhXyA9IGFycmF5KCk7CisgICAgcHJpdmF0ZSAkcF87CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHApCisgICAgeworICAgICAgICAkdGhpcy0+cF8gPSAkcDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZCgpCisgICAgeworICAgICAgICBpZiAoJHRoaXMtPmhhc0RhdGFfKSB7CisgICAgICAgICAgICAkdGhpcy0+aGFzRGF0YV8gPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICR0aGlzLT5kYXRhXyA9ICR0aGlzLT5wXy0+Z2V0VHJhbnNwb3J0KCktPnJlYWRBbGwoMSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc3Vic3RyKCR0aGlzLT5kYXRhXywgMCwgMSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHBlZWsoKQorICAgIHsKKyAgICAgICAgaWYgKCEkdGhpcy0+aGFzRGF0YV8pIHsKKyAgICAgICAgICAgICR0aGlzLT5kYXRhXyA9ICR0aGlzLT5wXy0+Z2V0VHJhbnNwb3J0KCktPnJlYWRBbGwoMSk7CisgICAgICAgIH0KKworICAgICAgICAkdGhpcy0+aGFzRGF0YV8gPSB0cnVlOworCisgICAgICAgIHJldHVybiBzdWJzdHIoJHRoaXMtPmRhdGFfLCAwLCAxKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9Qcm90b2NvbC9KU09OL1BhaXJDb250ZXh0LnBocCBiL2xpYi9waHAvbGliL1Byb3RvY29sL0pTT04vUGFpckNvbnRleHQucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiMzUzYzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9Qcm90b2NvbC9KU09OL1BhaXJDb250ZXh0LnBocApAQCAtMCwwICsxLDY0IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFByb3RvY29sXEpTT047CisKK3VzZSBUaHJpZnRcUHJvdG9jb2xcVEpTT05Qcm90b2NvbDsKKworY2xhc3MgUGFpckNvbnRleHQgZXh0ZW5kcyBCYXNlQ29udGV4dAoreworICAgIHByaXZhdGUgJGZpcnN0XyA9IHRydWU7CisgICAgcHJpdmF0ZSAkY29sb25fID0gdHJ1ZTsKKyAgICBwcml2YXRlICRwXyA9IG51bGw7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHApCisgICAgeworICAgICAgICAkdGhpcy0+cF8gPSAkcDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoKQorICAgIHsKKyAgICAgICAgaWYgKCR0aGlzLT5maXJzdF8pIHsKKyAgICAgICAgICAgICR0aGlzLT5maXJzdF8gPSBmYWxzZTsKKyAgICAgICAgICAgICR0aGlzLT5jb2xvbl8gPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJHRoaXMtPnBfLT5nZXRUcmFuc3BvcnQoKS0+d3JpdGUoJHRoaXMtPmNvbG9uXyA/IFRKU09OUHJvdG9jb2w6OkNPTE9OIDogVEpTT05Qcm90b2NvbDo6Q09NTUEpOworICAgICAgICAgICAgJHRoaXMtPmNvbG9uXyA9ICEkdGhpcy0+Y29sb25fOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWQoKQorICAgIHsKKyAgICAgICAgaWYgKCR0aGlzLT5maXJzdF8pIHsKKyAgICAgICAgICAgICR0aGlzLT5maXJzdF8gPSBmYWxzZTsKKyAgICAgICAgICAgICR0aGlzLT5jb2xvbl8gPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJHRoaXMtPnBfLT5yZWFkSlNPTlN5bnRheENoYXIoJHRoaXMtPmNvbG9uXyA/IFRKU09OUHJvdG9jb2w6OkNPTE9OIDogVEpTT05Qcm90b2NvbDo6Q09NTUEpOworICAgICAgICAgICAgJHRoaXMtPmNvbG9uXyA9ICEkdGhpcy0+Y29sb25fOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGVzY2FwZU51bSgpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbG9uXzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9Qcm90b2NvbC9TaW1wbGVKU09OL0NvbGxlY3Rpb25NYXBLZXlFeGNlcHRpb24ucGhwIGIvbGliL3BocC9saWIvUHJvdG9jb2wvU2ltcGxlSlNPTi9Db2xsZWN0aW9uTWFwS2V5RXhjZXB0aW9uLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjJiODVhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvUHJvdG9jb2wvU2ltcGxlSlNPTi9Db2xsZWN0aW9uTWFwS2V5RXhjZXB0aW9uLnBocApAQCAtMCwwICsxLDMzIEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFByb3RvY29sXFNpbXBsZUpTT047CisKK3VzZSBUaHJpZnRcRXhjZXB0aW9uXFRFeGNlcHRpb247CisKK2NsYXNzIENvbGxlY3Rpb25NYXBLZXlFeGNlcHRpb24gZXh0ZW5kcyBURXhjZXB0aW9uCit7CisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRtZXNzYWdlKQorICAgIHsKKyAgICAgICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkbWVzc2FnZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvUHJvdG9jb2wvU2ltcGxlSlNPTi9Db250ZXh0LnBocCBiL2xpYi9waHAvbGliL1Byb3RvY29sL1NpbXBsZUpTT04vQ29udGV4dC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJkMTZmYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1Byb3RvY29sL1NpbXBsZUpTT04vQ29udGV4dC5waHAKQEAgLTAsMCArMSwzNSBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnByb3RvY29sCisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxQcm90b2NvbFxTaW1wbGVKU09OOworCitjbGFzcyBDb250ZXh0Cit7CisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlKCkKKyAgICB7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGlzTWFwS2V5KCkKKyAgICB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9Qcm90b2NvbC9TaW1wbGVKU09OL0xpc3RDb250ZXh0LnBocCBiL2xpYi9waHAvbGliL1Byb3RvY29sL1NpbXBsZUpTT04vTGlzdENvbnRleHQucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmMzQ2ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9Qcm90b2NvbC9TaW1wbGVKU09OL0xpc3RDb250ZXh0LnBocApAQCAtMCwwICsxLDQ1IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFByb3RvY29sXFNpbXBsZUpTT047CisKK3VzZSBUaHJpZnRcUHJvdG9jb2xcVFNpbXBsZUpTT05Qcm90b2NvbDsKKworY2xhc3MgTGlzdENvbnRleHQgZXh0ZW5kcyBDb250ZXh0Cit7CisgICAgcHJvdGVjdGVkICRmaXJzdF8gPSB0cnVlOworICAgIHByaXZhdGUgJHBfOworCisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRwKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnBfID0gJHA7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlKCkKKyAgICB7CisgICAgICAgIGlmICgkdGhpcy0+Zmlyc3RfKSB7CisgICAgICAgICAgICAkdGhpcy0+Zmlyc3RfID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkdGhpcy0+cF8tPmdldFRyYW5zcG9ydCgpLT53cml0ZShUU2ltcGxlSlNPTlByb3RvY29sOjpDT01NQSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9Qcm90b2NvbC9TaW1wbGVKU09OL01hcENvbnRleHQucGhwIGIvbGliL3BocC9saWIvUHJvdG9jb2wvU2ltcGxlSlNPTi9NYXBDb250ZXh0LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWMwNjBkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvUHJvdG9jb2wvU2ltcGxlSlNPTi9NYXBDb250ZXh0LnBocApAQCAtMCwwICsxLDQ3IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFByb3RvY29sXFNpbXBsZUpTT047CisKK2NsYXNzIE1hcENvbnRleHQgZXh0ZW5kcyBTdHJ1Y3RDb250ZXh0Cit7CisgICAgcHJvdGVjdGVkICRpc0tleSA9IHRydWU7CisgICAgcHJpdmF0ZSAkcF87CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHApCisgICAgeworICAgICAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCRwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoKQorICAgIHsKKyAgICAgICAgcGFyZW50Ojp3cml0ZSgpOworICAgICAgICAkdGhpcy0+aXNLZXkgPSAhJHRoaXMtPmlzS2V5OworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBpc01hcEtleSgpCisgICAgeworICAgICAgICAvLyB3ZSB3YW50IHRvIGNvZXJjZSBtYXAga2V5cyB0byBqc29uIHN0cmluZ3MgcmVnYXJkbGVzcworICAgICAgICAvLyBvZiB0aGVpciB0eXBlCisgICAgICAgIHJldHVybiAkdGhpcy0+aXNLZXk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvUHJvdG9jb2wvU2ltcGxlSlNPTi9TdHJ1Y3RDb250ZXh0LnBocCBiL2xpYi9waHAvbGliL1Byb3RvY29sL1NpbXBsZUpTT04vU3RydWN0Q29udGV4dC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhhNjJkMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1Byb3RvY29sL1NpbXBsZUpTT04vU3RydWN0Q29udGV4dC5waHAKQEAgLTAsMCArMSw1MiBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnByb3RvY29sCisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxQcm90b2NvbFxTaW1wbGVKU09OOworCit1c2UgVGhyaWZ0XFByb3RvY29sXFRTaW1wbGVKU09OUHJvdG9jb2w7CisKK2NsYXNzIFN0cnVjdENvbnRleHQgZXh0ZW5kcyBDb250ZXh0Cit7CisgICAgcHJvdGVjdGVkICRmaXJzdF8gPSB0cnVlOworICAgIHByb3RlY3RlZCAkY29sb25fID0gdHJ1ZTsKKyAgICBwcml2YXRlICRwXzsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkcCkKKyAgICB7CisgICAgICAgICR0aGlzLT5wXyA9ICRwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZSgpCisgICAgeworICAgICAgICBpZiAoJHRoaXMtPmZpcnN0XykgeworICAgICAgICAgICAgJHRoaXMtPmZpcnN0XyA9IGZhbHNlOworICAgICAgICAgICAgJHRoaXMtPmNvbG9uXyA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkdGhpcy0+cF8tPmdldFRyYW5zcG9ydCgpLT53cml0ZSgKKyAgICAgICAgICAgICAgICAkdGhpcy0+Y29sb25fID8KKyAgICAgICAgICAgICAgICAgICAgVFNpbXBsZUpTT05Qcm90b2NvbDo6Q09MT04gOgorICAgICAgICAgICAgICAgICAgICBUU2ltcGxlSlNPTlByb3RvY29sOjpDT01NQQorICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICR0aGlzLT5jb2xvbl8gPSAhJHRoaXMtPmNvbG9uXzsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5waHAgYi9saWIvcGhwL2xpYi9Qcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkYTVjMGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9Qcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wucGhwCkBAIC0wLDAgKzEsNDUzIEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFByb3RvY29sOworCit1c2UgVGhyaWZ0XFR5cGVcVFR5cGU7Cit1c2UgVGhyaWZ0XEV4Y2VwdGlvblxUUHJvdG9jb2xFeGNlcHRpb247Cit1c2UgVGhyaWZ0XEZhY3RvcnlcVFN0cmluZ0Z1bmNGYWN0b3J5OworCisvKioKKyAqIEJpbmFyeSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVGhyaWZ0IHByb3RvY29sLgorICoKKyAqLworY2xhc3MgVEJpbmFyeVByb3RvY29sIGV4dGVuZHMgVFByb3RvY29sCit7CisgICAgY29uc3QgVkVSU0lPTl9NQVNLID0gMHhmZmZmMDAwMDsKKyAgICBjb25zdCBWRVJTSU9OXzEgPSAweDgwMDEwMDAwOworCisgICAgcHJvdGVjdGVkICRzdHJpY3RSZWFkXyA9IGZhbHNlOworICAgIHByb3RlY3RlZCAkc3RyaWN0V3JpdGVfID0gdHJ1ZTsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkdHJhbnMsICRzdHJpY3RSZWFkID0gZmFsc2UsICRzdHJpY3RXcml0ZSA9IHRydWUpCisgICAgeworICAgICAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCR0cmFucyk7CisgICAgICAgICR0aGlzLT5zdHJpY3RSZWFkXyA9ICRzdHJpY3RSZWFkOworICAgICAgICAkdGhpcy0+c3RyaWN0V3JpdGVfID0gJHN0cmljdFdyaXRlOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1lc3NhZ2VCZWdpbigkbmFtZSwgJHR5cGUsICRzZXFpZCkKKyAgICB7CisgICAgICAgIGlmICgkdGhpcy0+c3RyaWN0V3JpdGVfKSB7CisgICAgICAgICAgICAkdmVyc2lvbiA9IHNlbGY6OlZFUlNJT05fMSB8ICR0eXBlOworCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICAkdGhpcy0+d3JpdGVJMzIoJHZlcnNpb24pICsKKyAgICAgICAgICAgICAgICAkdGhpcy0+d3JpdGVTdHJpbmcoJG5hbWUpICsKKyAgICAgICAgICAgICAgICAkdGhpcy0+d3JpdGVJMzIoJHNlcWlkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgICR0aGlzLT53cml0ZVN0cmluZygkbmFtZSkgKworICAgICAgICAgICAgICAgICR0aGlzLT53cml0ZUJ5dGUoJHR5cGUpICsKKyAgICAgICAgICAgICAgICAkdGhpcy0+d3JpdGVJMzIoJHNlcWlkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1lc3NhZ2VFbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU3RydWN0QmVnaW4oJG5hbWUpCisgICAgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJ1Y3RFbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRCZWdpbigkZmllbGROYW1lLCAkZmllbGRUeXBlLCAkZmllbGRJZCkKKyAgICB7CisgICAgICAgIHJldHVybgorICAgICAgICAgICAgJHRoaXMtPndyaXRlQnl0ZSgkZmllbGRUeXBlKSArCisgICAgICAgICAgICAkdGhpcy0+d3JpdGVJMTYoJGZpZWxkSWQpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkRW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkU3RvcCgpCisgICAgeworICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICR0aGlzLT53cml0ZUJ5dGUoVFR5cGU6OlNUT1ApOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1hcEJlZ2luKCRrZXlUeXBlLCAkdmFsVHlwZSwgJHNpemUpCisgICAgeworICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICR0aGlzLT53cml0ZUJ5dGUoJGtleVR5cGUpICsKKyAgICAgICAgICAgICR0aGlzLT53cml0ZUJ5dGUoJHZhbFR5cGUpICsKKyAgICAgICAgICAgICR0aGlzLT53cml0ZUkzMigkc2l6ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWFwRW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUxpc3RCZWdpbigkZWxlbVR5cGUsICRzaXplKQorICAgIHsKKyAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAkdGhpcy0+d3JpdGVCeXRlKCRlbGVtVHlwZSkgKworICAgICAgICAgICAgJHRoaXMtPndyaXRlSTMyKCRzaXplKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVMaXN0RW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVNldEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpCisgICAgeworICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICR0aGlzLT53cml0ZUJ5dGUoJGVsZW1UeXBlKSArCisgICAgICAgICAgICAkdGhpcy0+d3JpdGVJMzIoJHNpemUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVNldEVuZCgpCisgICAgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVCb29sKCR2YWx1ZSkKKyAgICB7CisgICAgICAgICRkYXRhID0gcGFjaygnYycsICR2YWx1ZSA/IDEgOiAwKTsKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoJGRhdGEsIDEpOworCisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUJ5dGUoJHZhbHVlKQorICAgIHsKKyAgICAgICAgJGRhdGEgPSBwYWNrKCdjJywgJHZhbHVlKTsKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoJGRhdGEsIDEpOworCisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUkxNigkdmFsdWUpCisgICAgeworICAgICAgICAkZGF0YSA9IHBhY2soJ24nLCAkdmFsdWUpOworICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZSgkZGF0YSwgMik7CisKKyAgICAgICAgcmV0dXJuIDI7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTMyKCR2YWx1ZSkKKyAgICB7CisgICAgICAgICRkYXRhID0gcGFjaygnTicsICR2YWx1ZSk7CisgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKCRkYXRhLCA0KTsKKworICAgICAgICByZXR1cm4gNDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJNjQoJHZhbHVlKQorICAgIHsKKyAgICAgICAgLy8gSWYgd2UgYXJlIG9uIGEgMzJiaXQgYXJjaGl0ZWN0dXJlIHdlIGhhdmUgdG8gZXhwbGljaXRseSBkZWFsIHdpdGgKKyAgICAgICAgLy8gNjQtYml0IHR3b3MtY29tcGxlbWVudCBhcml0aG1ldGljIHNpbmNlIFBIUCB3YW50cyB0byB0cmVhdCBhbGwgaW50cworICAgICAgICAvLyBhcyBzaWduZWQgYW5kIGFueSBpbnQgb3ZlciAyXjMxIC0gMSBhcyBhIGZsb2F0CisgICAgICAgIGlmIChQSFBfSU5UX1NJWkUgPT0gNCkgeworICAgICAgICAgICAgJG5lZyA9ICR2YWx1ZSA8IDA7CisKKyAgICAgICAgICAgIGlmICgkbmVnKSB7CisgICAgICAgICAgICAgICAgJHZhbHVlICo9IC0xOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAkaGkgPSAoaW50KSgkdmFsdWUgLyA0Mjk0OTY3Mjk2KTsKKyAgICAgICAgICAgICRsbyA9IChpbnQpJHZhbHVlOworCisgICAgICAgICAgICBpZiAoJG5lZykgeworICAgICAgICAgICAgICAgICRoaSA9IH4kaGk7CisgICAgICAgICAgICAgICAgJGxvID0gfiRsbzsKKyAgICAgICAgICAgICAgICBpZiAoKCRsbyAmIChpbnQpMHhmZmZmZmZmZikgPT0gKGludCkweGZmZmZmZmZmKSB7CisgICAgICAgICAgICAgICAgICAgICRsbyA9IDA7CisgICAgICAgICAgICAgICAgICAgICRoaSsrOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICRsbysrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICRkYXRhID0gcGFjaygnTjInLCAkaGksICRsbyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkaGkgPSAkdmFsdWUgPj4gMzI7CisgICAgICAgICAgICAkbG8gPSAkdmFsdWUgJiAweEZGRkZGRkZGOworICAgICAgICAgICAgJGRhdGEgPSBwYWNrKCdOMicsICRoaSwgJGxvKTsKKyAgICAgICAgfQorCisgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKCRkYXRhLCA4KTsKKworICAgICAgICByZXR1cm4gODsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVEb3VibGUoJHZhbHVlKQorICAgIHsKKyAgICAgICAgJGRhdGEgPSBwYWNrKCdkJywgJHZhbHVlKTsKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc3RycmV2KCRkYXRhKSwgOCk7CisKKyAgICAgICAgcmV0dXJuIDg7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU3RyaW5nKCR2YWx1ZSkKKyAgICB7CisgICAgICAgICRsZW4gPSBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHZhbHVlKTsKKyAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT53cml0ZUkzMigkbGVuKTsKKyAgICAgICAgaWYgKCRsZW4pIHsKKyAgICAgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKCR2YWx1ZSwgJGxlbik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gJHJlc3VsdCArICRsZW47CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNZXNzYWdlQmVnaW4oJiRuYW1lLCAmJHR5cGUsICYkc2VxaWQpCisgICAgeworICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPnJlYWRJMzIoJHN6KTsKKyAgICAgICAgaWYgKCRzeiA8IDApIHsKKyAgICAgICAgICAgICR2ZXJzaW9uID0gKGludCkoJHN6ICYgc2VsZjo6VkVSU0lPTl9NQVNLKTsKKyAgICAgICAgICAgIGlmICgkdmVyc2lvbiAhPSAoaW50KXNlbGY6OlZFUlNJT05fMSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oJ0JhZCB2ZXJzaW9uIGlkZW50aWZpZXI6ICcgLiAkc3osIFRQcm90b2NvbEV4Y2VwdGlvbjo6QkFEX1ZFUlNJT04pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgJHR5cGUgPSAkc3ogJiAweDAwMDAwMGZmOworICAgICAgICAgICAgJHJlc3VsdCArPQorICAgICAgICAgICAgICAgICR0aGlzLT5yZWFkU3RyaW5nKCRuYW1lKSArCisgICAgICAgICAgICAgICAgJHRoaXMtPnJlYWRJMzIoJHNlcWlkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICgkdGhpcy0+c3RyaWN0UmVhZF8pIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAnTm8gdmVyc2lvbiBpZGVudGlmaWVyLCBvbGQgcHJvdG9jb2wgY2xpZW50PycsCisgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEV4Y2VwdGlvbjo6QkFEX1ZFUlNJT04KKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBIYW5kbGUgcHJlLXZlcnNpb25lZCBpbnB1dAorICAgICAgICAgICAgICAgICRuYW1lID0gJHRoaXMtPnRyYW5zXy0+cmVhZEFsbCgkc3opOworICAgICAgICAgICAgICAgICRyZXN1bHQgKz0KKyAgICAgICAgICAgICAgICAgICAgJHN6ICsKKyAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnJlYWRCeXRlKCR0eXBlKSArCisgICAgICAgICAgICAgICAgICAgICR0aGlzLT5yZWFkSTMyKCRzZXFpZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gJHJlc3VsdDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1lc3NhZ2VFbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJ1Y3RCZWdpbigmJG5hbWUpCisgICAgeworICAgICAgICAkbmFtZSA9ICcnOworCisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RydWN0RW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkRmllbGRCZWdpbigmJG5hbWUsICYkZmllbGRUeXBlLCAmJGZpZWxkSWQpCisgICAgeworICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPnJlYWRCeXRlKCRmaWVsZFR5cGUpOworICAgICAgICBpZiAoJGZpZWxkVHlwZSA9PSBUVHlwZTo6U1RPUCkgeworICAgICAgICAgICAgJGZpZWxkSWQgPSAwOworCisgICAgICAgICAgICByZXR1cm4gJHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICAkcmVzdWx0ICs9ICR0aGlzLT5yZWFkSTE2KCRmaWVsZElkKTsKKworICAgICAgICByZXR1cm4gJHJlc3VsdDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEZpZWxkRW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWFwQmVnaW4oJiRrZXlUeXBlLCAmJHZhbFR5cGUsICYkc2l6ZSkKKyAgICB7CisgICAgICAgIHJldHVybgorICAgICAgICAgICAgJHRoaXMtPnJlYWRCeXRlKCRrZXlUeXBlKSArCisgICAgICAgICAgICAkdGhpcy0+cmVhZEJ5dGUoJHZhbFR5cGUpICsKKyAgICAgICAgICAgICR0aGlzLT5yZWFkSTMyKCRzaXplKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1hcEVuZCgpCisgICAgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZExpc3RCZWdpbigmJGVsZW1UeXBlLCAmJHNpemUpCisgICAgeworICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICR0aGlzLT5yZWFkQnl0ZSgkZWxlbVR5cGUpICsKKyAgICAgICAgICAgICR0aGlzLT5yZWFkSTMyKCRzaXplKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZExpc3RFbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTZXRCZWdpbigmJGVsZW1UeXBlLCAmJHNpemUpCisgICAgeworICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICR0aGlzLT5yZWFkQnl0ZSgkZWxlbVR5cGUpICsKKyAgICAgICAgICAgICR0aGlzLT5yZWFkSTMyKCRzaXplKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFNldEVuZCgpCisgICAgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEJvb2woJiR2YWx1ZSkKKyAgICB7CisgICAgICAgICRkYXRhID0gJHRoaXMtPnRyYW5zXy0+cmVhZEFsbCgxKTsKKyAgICAgICAgJGFyciA9IHVucGFjaygnYycsICRkYXRhKTsKKyAgICAgICAgJHZhbHVlID0gJGFyclsxXSA9PSAxOworCisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkQnl0ZSgmJHZhbHVlKQorICAgIHsKKyAgICAgICAgJGRhdGEgPSAkdGhpcy0+dHJhbnNfLT5yZWFkQWxsKDEpOworICAgICAgICAkYXJyID0gdW5wYWNrKCdjJywgJGRhdGEpOworICAgICAgICAkdmFsdWUgPSAkYXJyWzFdOworCisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkSTE2KCYkdmFsdWUpCisgICAgeworICAgICAgICAkZGF0YSA9ICR0aGlzLT50cmFuc18tPnJlYWRBbGwoMik7CisgICAgICAgICRhcnIgPSB1bnBhY2soJ24nLCAkZGF0YSk7CisgICAgICAgICR2YWx1ZSA9ICRhcnJbMV07CisgICAgICAgIGlmICgkdmFsdWUgPiAweDdmZmYpIHsKKyAgICAgICAgICAgICR2YWx1ZSA9IDAgLSAoKCR2YWx1ZSAtIDEpIF4gMHhmZmZmKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAyOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkSTMyKCYkdmFsdWUpCisgICAgeworICAgICAgICAkZGF0YSA9ICR0aGlzLT50cmFuc18tPnJlYWRBbGwoNCk7CisgICAgICAgICRhcnIgPSB1bnBhY2soJ04nLCAkZGF0YSk7CisgICAgICAgICR2YWx1ZSA9ICRhcnJbMV07CisgICAgICAgIGlmICgkdmFsdWUgPiAweDdmZmZmZmZmKSB7CisgICAgICAgICAgICAkdmFsdWUgPSAwIC0gKCgkdmFsdWUgLSAxKSBeIDB4ZmZmZmZmZmYpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIDQ7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRJNjQoJiR2YWx1ZSkKKyAgICB7CisgICAgICAgICRkYXRhID0gJHRoaXMtPnRyYW5zXy0+cmVhZEFsbCg4KTsKKworICAgICAgICAkYXJyID0gdW5wYWNrKCdOMicsICRkYXRhKTsKKworICAgICAgICAvLyBJZiB3ZSBhcmUgb24gYSAzMmJpdCBhcmNoaXRlY3R1cmUgd2UgaGF2ZSB0byBleHBsaWNpdGx5IGRlYWwgd2l0aAorICAgICAgICAvLyA2NC1iaXQgdHdvcy1jb21wbGVtZW50IGFyaXRobWV0aWMgc2luY2UgUEhQIHdhbnRzIHRvIHRyZWF0IGFsbCBpbnRzCisgICAgICAgIC8vIGFzIHNpZ25lZCBhbmQgYW55IGludCBvdmVyIDJeMzEgLSAxIGFzIGEgZmxvYXQKKyAgICAgICAgaWYgKFBIUF9JTlRfU0laRSA9PSA0KSB7CisgICAgICAgICAgICAkaGkgPSAkYXJyWzFdOworICAgICAgICAgICAgJGxvID0gJGFyclsyXTsKKyAgICAgICAgICAgICRpc05lZyA9ICRoaSA8IDA7CisKKyAgICAgICAgICAgIC8vIENoZWNrIGZvciBhIG5lZ2F0aXZlCisgICAgICAgICAgICBpZiAoJGlzTmVnKSB7CisgICAgICAgICAgICAgICAgJGhpID0gfiRoaSAmIChpbnQpMHhmZmZmZmZmZjsKKyAgICAgICAgICAgICAgICAkbG8gPSB+JGxvICYgKGludCkweGZmZmZmZmZmOworCisgICAgICAgICAgICAgICAgaWYgKCRsbyA9PSAoaW50KTB4ZmZmZmZmZmYpIHsKKyAgICAgICAgICAgICAgICAgICAgJGhpKys7CisgICAgICAgICAgICAgICAgICAgICRsbyA9IDA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgJGxvKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBGb3JjZSAzMmJpdCB3b3JkcyBpbiBleGNlc3Mgb2YgMkcgdG8gcGUgcG9zaXRpdmUgLSB3ZSBkZWFsIHdpZ2ggc2lnbgorICAgICAgICAgICAgLy8gZXhwbGljaXRseSBiZWxvdworCisgICAgICAgICAgICBpZiAoJGhpICYgKGludCkweDgwMDAwMDAwKSB7CisgICAgICAgICAgICAgICAgJGhpICY9IChpbnQpMHg3ZmZmZmZmZjsKKyAgICAgICAgICAgICAgICAkaGkgKz0gMHg4MDAwMDAwMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCRsbyAmIChpbnQpMHg4MDAwMDAwMCkgeworICAgICAgICAgICAgICAgICRsbyAmPSAoaW50KTB4N2ZmZmZmZmY7CisgICAgICAgICAgICAgICAgJGxvICs9IDB4ODAwMDAwMDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICR2YWx1ZSA9ICRoaSAqIDQyOTQ5NjcyOTYgKyAkbG87CisKKyAgICAgICAgICAgIGlmICgkaXNOZWcpIHsKKyAgICAgICAgICAgICAgICAkdmFsdWUgPSAwIC0gJHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gVXBjYXN0IG5lZ2F0aXZlcyBpbiBMU0IgYml0CisgICAgICAgICAgICBpZiAoJGFyclsyXSAmIDB4ODAwMDAwMDApIHsKKyAgICAgICAgICAgICAgICAkYXJyWzJdID0gJGFyclsyXSAmIDB4ZmZmZmZmZmY7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIENoZWNrIGZvciBhIG5lZ2F0aXZlCisgICAgICAgICAgICBpZiAoJGFyclsxXSAmIDB4ODAwMDAwMDApIHsKKyAgICAgICAgICAgICAgICAkYXJyWzFdID0gJGFyclsxXSAmIDB4ZmZmZmZmZmY7CisgICAgICAgICAgICAgICAgJGFyclsxXSA9ICRhcnJbMV0gXiAweGZmZmZmZmZmOworICAgICAgICAgICAgICAgICRhcnJbMl0gPSAkYXJyWzJdIF4gMHhmZmZmZmZmZjsKKyAgICAgICAgICAgICAgICAkdmFsdWUgPSAwIC0gJGFyclsxXSAqIDQyOTQ5NjcyOTYgLSAkYXJyWzJdIC0gMTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgJHZhbHVlID0gJGFyclsxXSAqIDQyOTQ5NjcyOTYgKyAkYXJyWzJdOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIDg7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWREb3VibGUoJiR2YWx1ZSkKKyAgICB7CisgICAgICAgICRkYXRhID0gc3RycmV2KCR0aGlzLT50cmFuc18tPnJlYWRBbGwoOCkpOworICAgICAgICAkYXJyID0gdW5wYWNrKCdkJywgJGRhdGEpOworICAgICAgICAkdmFsdWUgPSAkYXJyWzFdOworCisgICAgICAgIHJldHVybiA4OworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RyaW5nKCYkdmFsdWUpCisgICAgeworICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPnJlYWRJMzIoJGxlbik7CisgICAgICAgIGlmICgkbGVuKSB7CisgICAgICAgICAgICAkdmFsdWUgPSAkdGhpcy0+dHJhbnNfLT5yZWFkQWxsKCRsZW4pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJHZhbHVlID0gJyc7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gJHJlc3VsdCArICRsZW47CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvUHJvdG9jb2wvVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQucGhwIGIvbGliL3BocC9saWIvUHJvdG9jb2wvVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmNzk5YTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9Qcm90b2NvbC9UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZC5waHAKQEAgLTAsMCArMSw2NyBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnByb3RvY29sCisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxQcm90b2NvbDsKKwordXNlIFRocmlmdFxUcmFuc3BvcnRcVEJ1ZmZlcmVkVHJhbnNwb3J0OworCisvKioKKyAqIEFjY2VsZXJhdGVkIGJpbmFyeSBwcm90b2NvbDogdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSB0aHJpZnRfcHJvdG9jb2wKKyAqIGV4dGVuc2lvbiBmb3IgZmFzdGVyIGRlc2VyaWFsaXphdGlvbgorICovCitjbGFzcyBUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCBleHRlbmRzIFRCaW5hcnlQcm90b2NvbAoreworICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkdHJhbnMsICRzdHJpY3RSZWFkID0gZmFsc2UsICRzdHJpY3RXcml0ZSA9IHRydWUpCisgICAgeworICAgICAgICAvLyBJZiB0aGUgdHJhbnNwb3J0IGRvZXNuJ3QgaW1wbGVtZW50IHB1dEJhY2ssIHdyYXAgaXQgaW4gYQorICAgICAgICAvLyBUQnVmZmVyZWRUcmFuc3BvcnQgKHdoaWNoIGRvZXMpCisKKyAgICAgICAgLy8gTk9URSAodC5oZWludHopOiBUaGlzIGlzIHZlcnkgZXZpbCB0byBkbywgYmVjYXVzZSB0aGUgVEJ1ZmZlcmVkVHJhbnNwb3J0IG1heSBzd2FsbG93IGJ5dGVzLCB3aGljaAorICAgICAgICAvLyBhcmUgdGhlbiBuZXZlciB3cml0dGVuIHRvIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydC4gVGhpcyBoYXBwZW5zIHByZWNpc2VseSB3aGVuIGEgbnVtYmVyIG9mIGJ5dGVzCisgICAgICAgIC8vIGxlc3MgdGhhbiB0aGUgbWF4IGJ1ZmZlciBzaXplICg1MTIgYnkgZGVmYXVsdCkgaXMgd3JpdHRlbiB0byB0aGUgdHJhbnNwb3J0IGFuZCB0aGVuIGZsdXNoKCkgaXMgTk9UCisgICAgICAgIC8vIGNhbGxlZC4gSW4gdGhhdCBjYXNlIHRoZSBkYXRhIHN0YXlzIGluIHRoZSB3cml0ZUJ1ZmZlciBvZiB0aGUgdHJhbnNwb3J0LCBmcm9tIHdoZXJlIGl0IGNhbiBuZXZlciBiZQorICAgICAgICAvLyBhY2Nlc3NlZCBhZ2FpbiAoZm9yIGV4YW1wbGUgdGhyb3VnaCByZWFkKCkpLgorICAgICAgICAvLworICAgICAgICAvLyBTaW5jZSB0aGUgY2FsbGVyIG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90IGtub3cgYWJvdXQgdGhlIHdyYXBwaW5nIHRyYW5zcG9ydCwgdGhpcyBjcmVhdGVzIGJ1Z3Mgd2hpY2gKKyAgICAgICAgLy8gYXJlIHZlcnkgZGlmZmljdWx0IHRvIGZpbmQuIEhlbmNlIHRoZSB3cmFwcGluZyBvZiBhIHRyYW5zcG9ydCBpbiBhIGJ1ZmZlciBzaG91bGQgYmUgbGVmdCB0byB0aGUKKyAgICAgICAgLy8gY2FsbGluZyBjb2RlLiBBbiBpbnRlcmZhY2UgY291bGQgdXNlZCB0byBtYW5kYXRlIHRoZSBwcmVzZW5jZSBvZiB0aGUgcHV0QmFjaygpIG1ldGhvZCBpbiB0aGUgdHJhbnNwb3J0LgorICAgICAgICAvLworICAgICAgICAvLyBJIGFtIGxlYXZpbmcgdGhpcyBjb2RlIGluIG5vbmV0aGVsZXNzLCBiZWNhdXNlIHRoZXJlIG1heSBiZSBhcHBsaWNhdGlvbnMgZGVwZW5kaW5nIG9uIHRoaXMgYmVoYXZpb3IuCisgICAgICAgIC8vCisgICAgICAgIC8vIEBzZWUgVEhSSUZULTE1NzkKKworICAgICAgICBpZiAoIW1ldGhvZF9leGlzdHMoJHRyYW5zLCAncHV0QmFjaycpKSB7CisgICAgICAgICAgICAkdHJhbnMgPSBuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KCR0cmFucyk7CisgICAgICAgIH0KKyAgICAgICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkdHJhbnMsICRzdHJpY3RSZWFkLCAkc3RyaWN0V3JpdGUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBpc1N0cmljdFJlYWQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5zdHJpY3RSZWFkXzsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gaXNTdHJpY3RXcml0ZSgpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPnN0cmljdFdyaXRlXzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9Qcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLnBocCBiL2xpYi9waHAvbGliL1Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhZjJhMjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9Qcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLnBocApAQCAtMCwwICsxLDczOSBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnByb3RvY29sCisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxQcm90b2NvbDsKKwordXNlIFRocmlmdFxUeXBlXFRUeXBlOwordXNlIFRocmlmdFxFeGNlcHRpb25cVFByb3RvY29sRXhjZXB0aW9uOwordXNlIFRocmlmdFxGYWN0b3J5XFRTdHJpbmdGdW5jRmFjdG9yeTsKKworLyoqCisgKiBDb21wYWN0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBUaHJpZnQgcHJvdG9jb2wuCisgKgorICovCitjbGFzcyBUQ29tcGFjdFByb3RvY29sIGV4dGVuZHMgVFByb3RvY29sCit7CisgICAgY29uc3QgQ09NUEFDVF9TVE9QID0gMHgwMDsKKyAgICBjb25zdCBDT01QQUNUX1RSVUUgPSAweDAxOworICAgIGNvbnN0IENPTVBBQ1RfRkFMU0UgPSAweDAyOworICAgIGNvbnN0IENPTVBBQ1RfQllURSA9IDB4MDM7CisgICAgY29uc3QgQ09NUEFDVF9JMTYgPSAweDA0OworICAgIGNvbnN0IENPTVBBQ1RfSTMyID0gMHgwNTsKKyAgICBjb25zdCBDT01QQUNUX0k2NCA9IDB4MDY7CisgICAgY29uc3QgQ09NUEFDVF9ET1VCTEUgPSAweDA3OworICAgIGNvbnN0IENPTVBBQ1RfQklOQVJZID0gMHgwODsKKyAgICBjb25zdCBDT01QQUNUX0xJU1QgPSAweDA5OworICAgIGNvbnN0IENPTVBBQ1RfU0VUID0gMHgwQTsKKyAgICBjb25zdCBDT01QQUNUX01BUCA9IDB4MEI7CisgICAgY29uc3QgQ09NUEFDVF9TVFJVQ1QgPSAweDBDOworCisgICAgY29uc3QgU1RBVEVfQ0xFQVIgPSAwOworICAgIGNvbnN0IFNUQVRFX0ZJRUxEX1dSSVRFID0gMTsKKyAgICBjb25zdCBTVEFURV9WQUxVRV9XUklURSA9IDI7CisgICAgY29uc3QgU1RBVEVfQ09OVEFJTkVSX1dSSVRFID0gMzsKKyAgICBjb25zdCBTVEFURV9CT09MX1dSSVRFID0gNDsKKyAgICBjb25zdCBTVEFURV9GSUVMRF9SRUFEID0gNTsKKyAgICBjb25zdCBTVEFURV9DT05UQUlORVJfUkVBRCA9IDY7CisgICAgY29uc3QgU1RBVEVfVkFMVUVfUkVBRCA9IDc7CisgICAgY29uc3QgU1RBVEVfQk9PTF9SRUFEID0gODsKKworICAgIGNvbnN0IFZFUlNJT05fTUFTSyA9IDB4MWY7CisgICAgY29uc3QgVkVSU0lPTiA9IDE7CisgICAgY29uc3QgUFJPVE9DT0xfSUQgPSAweDgyOworICAgIGNvbnN0IFRZUEVfTUFTSyA9IDB4ZTA7CisgICAgY29uc3QgVFlQRV9CSVRTID0gMHgwNzsKKyAgICBjb25zdCBUWVBFX1NISUZUX0FNT1VOVCA9IDU7CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljICRjdHlwZXMgPSBhcnJheSgKKyAgICAgICAgVFR5cGU6OlNUT1AgPT4gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9TVE9QLAorICAgICAgICBUVHlwZTo6Qk9PTCA9PiBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX1RSVUUsIC8vIHVzZWQgZm9yIGNvbGxlY3Rpb24KKyAgICAgICAgVFR5cGU6OkJZVEUgPT4gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9CWVRFLAorICAgICAgICBUVHlwZTo6STE2ID0+IFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfSTE2LAorICAgICAgICBUVHlwZTo6STMyID0+IFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfSTMyLAorICAgICAgICBUVHlwZTo6STY0ID0+IFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfSTY0LAorICAgICAgICBUVHlwZTo6RE9VQkxFID0+IFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfRE9VQkxFLAorICAgICAgICBUVHlwZTo6U1RSSU5HID0+IFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfQklOQVJZLAorICAgICAgICBUVHlwZTo6U1RSVUNUID0+IFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfU1RSVUNULAorICAgICAgICBUVHlwZTo6TFNUID0+IFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfTElTVCwKKyAgICAgICAgVFR5cGU6OlNFVCA9PiBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX1NFVCwKKyAgICAgICAgVFR5cGU6Ok1BUCA9PiBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX01BUCwKKyAgICApOworCisgICAgcHJvdGVjdGVkIHN0YXRpYyAkdHR5cGVzID0gYXJyYXkoCisgICAgICAgIFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfU1RPUCA9PiBUVHlwZTo6U1RPUCwKKyAgICAgICAgVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9UUlVFID0+IFRUeXBlOjpCT09MLCAvLyB1c2VkIGZvciBjb2xsZWN0aW9uCisgICAgICAgIFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfRkFMU0UgPT4gVFR5cGU6OkJPT0wsCisgICAgICAgIFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfQllURSA9PiBUVHlwZTo6QllURSwKKyAgICAgICAgVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9JMTYgPT4gVFR5cGU6OkkxNiwKKyAgICAgICAgVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9JMzIgPT4gVFR5cGU6OkkzMiwKKyAgICAgICAgVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9JNjQgPT4gVFR5cGU6Okk2NCwKKyAgICAgICAgVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9ET1VCTEUgPT4gVFR5cGU6OkRPVUJMRSwKKyAgICAgICAgVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9CSU5BUlkgPT4gVFR5cGU6OlNUUklORywKKyAgICAgICAgVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9TVFJVQ1QgPT4gVFR5cGU6OlNUUlVDVCwKKyAgICAgICAgVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9MSVNUID0+IFRUeXBlOjpMU1QsCisgICAgICAgIFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfU0VUID0+IFRUeXBlOjpTRVQsCisgICAgICAgIFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfTUFQID0+IFRUeXBlOjpNQVAsCisgICAgKTsKKworICAgIHByb3RlY3RlZCAkc3RhdGUgPSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9DTEVBUjsKKyAgICBwcm90ZWN0ZWQgJGxhc3RGaWQgPSAwOworICAgIHByb3RlY3RlZCAkYm9vbEZpZCA9IG51bGw7CisgICAgcHJvdGVjdGVkICRib29sVmFsdWUgPSBudWxsOworICAgIHByb3RlY3RlZCAkc3RydWN0cyA9IGFycmF5KCk7CisgICAgcHJvdGVjdGVkICRjb250YWluZXJzID0gYXJyYXkoKTsKKworICAgIC8vIFNvbWUgdmFyaW50IC8gemlnemFnIGhlbHBlciBtZXRob2RzCisgICAgcHVibGljIGZ1bmN0aW9uIHRvWmlnWmFnKCRuLCAkYml0cykKKyAgICB7CisgICAgICAgIHJldHVybiAoJG4gPDwgMSkgXiAoJG4gPj4gKCRiaXRzIC0gMSkpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBmcm9tWmlnWmFnKCRuKQorICAgIHsKKyAgICAgICAgcmV0dXJuICgkbiA+PiAxKSBeIC0oJG4gJiAxKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0VmFyaW50KCRkYXRhKQorICAgIHsKKyAgICAgICAgJG91dCA9ICIiOworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgaWYgKCgkZGF0YSAmIH4weDdmKSA9PT0gMCkgeworICAgICAgICAgICAgICAgICRvdXQgLj0gY2hyKCRkYXRhKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgJG91dCAuPSBjaHIoKCRkYXRhICYgMHhmZikgfCAweDgwKTsKKyAgICAgICAgICAgICAgICAkZGF0YSA9ICRkYXRhID4+IDc7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gJG91dDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVWYXJpbnQoJGRhdGEpCisgICAgeworICAgICAgICAkb3V0ID0gJHRoaXMtPmdldFZhcmludCgkZGF0YSk7CisgICAgICAgICRyZXN1bHQgPSBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJG91dCk7CisgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKCRvdXQsICRyZXN1bHQpOworCisgICAgICAgIHJldHVybiAkcmVzdWx0OworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkVmFyaW50KCYkcmVzdWx0KQorICAgIHsKKyAgICAgICAgJGlkeCA9IDA7CisgICAgICAgICRzaGlmdCA9IDA7CisgICAgICAgICRyZXN1bHQgPSAwOworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgJHggPSAkdGhpcy0+dHJhbnNfLT5yZWFkQWxsKDEpOworICAgICAgICAgICAgJGFyciA9IHVucGFjaygnQycsICR4KTsKKyAgICAgICAgICAgICRieXRlID0gJGFyclsxXTsKKyAgICAgICAgICAgICRpZHggKz0gMTsKKyAgICAgICAgICAgICRyZXN1bHQgfD0gKCRieXRlICYgMHg3ZikgPDwgJHNoaWZ0OworICAgICAgICAgICAgaWYgKCgkYnl0ZSA+PiA3KSA9PT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiAkaWR4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgJHNoaWZ0ICs9IDc7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gJGlkeDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHRyYW5zKQorICAgIHsKKyAgICAgICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkdHJhbnMpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1lc3NhZ2VCZWdpbigkbmFtZSwgJHR5cGUsICRzZXFpZCkKKyAgICB7CisgICAgICAgICR3cml0dGVuID0KKyAgICAgICAgICAgICR0aGlzLT53cml0ZVVCeXRlKFRDb21wYWN0UHJvdG9jb2w6OlBST1RPQ09MX0lEKSArCisgICAgICAgICAgICAkdGhpcy0+d3JpdGVVQnl0ZShUQ29tcGFjdFByb3RvY29sOjpWRVJTSU9OIHwKKyAgICAgICAgICAgICAgICAoJHR5cGUgPDwgVENvbXBhY3RQcm90b2NvbDo6VFlQRV9TSElGVF9BTU9VTlQpKSArCisgICAgICAgICAgICAkdGhpcy0+d3JpdGVWYXJpbnQoJHNlcWlkKSArCisgICAgICAgICAgICAkdGhpcy0+d3JpdGVTdHJpbmcoJG5hbWUpOworICAgICAgICAkdGhpcy0+c3RhdGUgPSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9WQUxVRV9XUklURTsKKworICAgICAgICByZXR1cm4gJHdyaXR0ZW47CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWVzc2FnZUVuZCgpCisgICAgeworICAgICAgICAkdGhpcy0+c3RhdGUgPSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9DTEVBUjsKKworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJ1Y3RCZWdpbigkbmFtZSkKKyAgICB7CisgICAgICAgICR0aGlzLT5zdHJ1Y3RzW10gPSBhcnJheSgkdGhpcy0+c3RhdGUsICR0aGlzLT5sYXN0RmlkKTsKKyAgICAgICAgJHRoaXMtPnN0YXRlID0gVENvbXBhY3RQcm90b2NvbDo6U1RBVEVfRklFTERfV1JJVEU7CisgICAgICAgICR0aGlzLT5sYXN0RmlkID0gMDsKKworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJ1Y3RFbmQoKQorICAgIHsKKyAgICAgICAgJG9sZF92YWx1ZXMgPSBhcnJheV9wb3AoJHRoaXMtPnN0cnVjdHMpOworICAgICAgICAkdGhpcy0+c3RhdGUgPSAkb2xkX3ZhbHVlc1swXTsKKyAgICAgICAgJHRoaXMtPmxhc3RGaWQgPSAkb2xkX3ZhbHVlc1sxXTsKKworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZFN0b3AoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT53cml0ZUJ5dGUoMCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRIZWFkZXIoJHR5cGUsICRmaWQpCisgICAgeworICAgICAgICAkd3JpdHRlbiA9IDA7CisgICAgICAgICRkZWx0YSA9ICRmaWQgLSAkdGhpcy0+bGFzdEZpZDsKKyAgICAgICAgaWYgKDAgPCAkZGVsdGEgJiYgJGRlbHRhIDw9IDE1KSB7CisgICAgICAgICAgICAkd3JpdHRlbiA9ICR0aGlzLT53cml0ZVVCeXRlKCgkZGVsdGEgPDwgNCkgfCAkdHlwZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkd3JpdHRlbiA9ICR0aGlzLT53cml0ZUJ5dGUoJHR5cGUpICsKKyAgICAgICAgICAgICAgICAkdGhpcy0+d3JpdGVJMTYoJGZpZCk7CisgICAgICAgIH0KKyAgICAgICAgJHRoaXMtPmxhc3RGaWQgPSAkZmlkOworCisgICAgICAgIHJldHVybiAkd3JpdHRlbjsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZEJlZ2luKCRmaWVsZF9uYW1lLCAkZmllbGRfdHlwZSwgJGZpZWxkX2lkKQorICAgIHsKKyAgICAgICAgaWYgKCRmaWVsZF90eXBlID09IFRUWVBFOjpCT09MKSB7CisgICAgICAgICAgICAkdGhpcy0+c3RhdGUgPSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9CT09MX1dSSVRFOworICAgICAgICAgICAgJHRoaXMtPmJvb2xGaWQgPSAkZmllbGRfaWQ7CisKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJHRoaXMtPnN0YXRlID0gVENvbXBhY3RQcm90b2NvbDo6U1RBVEVfVkFMVUVfV1JJVEU7CisKKyAgICAgICAgICAgIHJldHVybiAkdGhpcy0+d3JpdGVGaWVsZEhlYWRlcihzZWxmOjokY3R5cGVzWyRmaWVsZF90eXBlXSwgJGZpZWxkX2lkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkRW5kKCkKKyAgICB7CisgICAgICAgICR0aGlzLT5zdGF0ZSA9IFRDb21wYWN0UHJvdG9jb2w6OlNUQVRFX0ZJRUxEX1dSSVRFOworCisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUNvbGxlY3Rpb25CZWdpbigkZXR5cGUsICRzaXplKQorICAgIHsKKyAgICAgICAgJHdyaXR0ZW4gPSAwOworICAgICAgICBpZiAoJHNpemUgPD0gMTQpIHsKKyAgICAgICAgICAgICR3cml0dGVuID0gJHRoaXMtPndyaXRlVUJ5dGUoJHNpemUgPDwgNCB8CisgICAgICAgICAgICAgICAgc2VsZjo6JGN0eXBlc1skZXR5cGVdKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICR3cml0dGVuID0gJHRoaXMtPndyaXRlVUJ5dGUoMHhmMCB8CisgICAgICAgICAgICAgICAgICAgIHNlbGY6OiRjdHlwZXNbJGV0eXBlXSkgKworICAgICAgICAgICAgICAgICR0aGlzLT53cml0ZVZhcmludCgkc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgJHRoaXMtPmNvbnRhaW5lcnNbXSA9ICR0aGlzLT5zdGF0ZTsKKyAgICAgICAgJHRoaXMtPnN0YXRlID0gVENvbXBhY3RQcm90b2NvbDo6U1RBVEVfQ09OVEFJTkVSX1dSSVRFOworCisgICAgICAgIHJldHVybiAkd3JpdHRlbjsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNYXBCZWdpbigka2V5X3R5cGUsICR2YWxfdHlwZSwgJHNpemUpCisgICAgeworICAgICAgICAkd3JpdHRlbiA9IDA7CisgICAgICAgIGlmICgkc2l6ZSA9PSAwKSB7CisgICAgICAgICAgICAkd3JpdHRlbiA9ICR0aGlzLT53cml0ZUJ5dGUoMCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkd3JpdHRlbiA9ICR0aGlzLT53cml0ZVZhcmludCgkc2l6ZSkgKworICAgICAgICAgICAgICAgICR0aGlzLT53cml0ZVVCeXRlKHNlbGY6OiRjdHlwZXNbJGtleV90eXBlXSA8PCA0IHwKKyAgICAgICAgICAgICAgICAgICAgc2VsZjo6JGN0eXBlc1skdmFsX3R5cGVdKTsKKyAgICAgICAgfQorICAgICAgICAkdGhpcy0+Y29udGFpbmVyc1tdID0gJHRoaXMtPnN0YXRlOworCisgICAgICAgIHJldHVybiAkd3JpdHRlbjsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVDb2xsZWN0aW9uRW5kKCkKKyAgICB7CisgICAgICAgICR0aGlzLT5zdGF0ZSA9IGFycmF5X3BvcCgkdGhpcy0+Y29udGFpbmVycyk7CisKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWFwRW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+d3JpdGVDb2xsZWN0aW9uRW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTGlzdEJlZ2luKCRlbGVtX3R5cGUsICRzaXplKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT53cml0ZUNvbGxlY3Rpb25CZWdpbigkZWxlbV90eXBlLCAkc2l6ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTGlzdEVuZCgpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPndyaXRlQ29sbGVjdGlvbkVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVNldEJlZ2luKCRlbGVtX3R5cGUsICRzaXplKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT53cml0ZUNvbGxlY3Rpb25CZWdpbigkZWxlbV90eXBlLCAkc2l6ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU2V0RW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+d3JpdGVDb2xsZWN0aW9uRW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlQm9vbCgkdmFsdWUpCisgICAgeworICAgICAgICBpZiAoJHRoaXMtPnN0YXRlID09IFRDb21wYWN0UHJvdG9jb2w6OlNUQVRFX0JPT0xfV1JJVEUpIHsKKyAgICAgICAgICAgICRjdHlwZSA9IFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfRkFMU0U7CisgICAgICAgICAgICBpZiAoJHZhbHVlKSB7CisgICAgICAgICAgICAgICAgJGN0eXBlID0gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9UUlVFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gJHRoaXMtPndyaXRlRmllbGRIZWFkZXIoJGN0eXBlLCAkdGhpcy0+Ym9vbEZpZCk7CisgICAgICAgIH0gZWxzZWlmICgkdGhpcy0+c3RhdGUgPT0gVENvbXBhY3RQcm90b2NvbDo6U1RBVEVfQ09OVEFJTkVSX1dSSVRFKSB7CisgICAgICAgICAgICByZXR1cm4gJHRoaXMtPndyaXRlQnl0ZSgkdmFsdWUgPyAxIDogMCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCdJbnZhbGlkIHN0YXRlIGluIGNvbXBhY3QgcHJvdG9jb2wnKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUJ5dGUoJHZhbHVlKQorICAgIHsKKyAgICAgICAgJGRhdGEgPSBwYWNrKCdjJywgJHZhbHVlKTsKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoJGRhdGEsIDEpOworCisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVVCeXRlKCRieXRlKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUocGFjaygnQycsICRieXRlKSwgMSk7CisKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTE2KCR2YWx1ZSkKKyAgICB7CisgICAgICAgICR0aGluZyA9ICR0aGlzLT50b1ppZ1phZygkdmFsdWUsIDE2KTsKKworICAgICAgICByZXR1cm4gJHRoaXMtPndyaXRlVmFyaW50KCR0aGluZyk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTMyKCR2YWx1ZSkKKyAgICB7CisgICAgICAgICR0aGluZyA9ICR0aGlzLT50b1ppZ1phZygkdmFsdWUsIDMyKTsKKworICAgICAgICByZXR1cm4gJHRoaXMtPndyaXRlVmFyaW50KCR0aGluZyk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRG91YmxlKCR2YWx1ZSkKKyAgICB7CisgICAgICAgICRkYXRhID0gcGFjaygnZCcsICR2YWx1ZSk7CisgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKCRkYXRhLCA4KTsKKworICAgICAgICByZXR1cm4gODsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJpbmcoJHZhbHVlKQorICAgIHsKKyAgICAgICAgJGxlbiA9IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkdmFsdWUpOworICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPndyaXRlVmFyaW50KCRsZW4pOworICAgICAgICBpZiAoJGxlbikgeworICAgICAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoJHZhbHVlLCAkbGVuKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAkcmVzdWx0ICsgJGxlbjsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEZpZWxkQmVnaW4oJiRuYW1lLCAmJGZpZWxkX3R5cGUsICYkZmllbGRfaWQpCisgICAgeworICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPnJlYWRVQnl0ZSgkY29tcGFjdF90eXBlX2FuZF9kZWx0YSk7CisKKyAgICAgICAgJGNvbXBhY3RfdHlwZSA9ICRjb21wYWN0X3R5cGVfYW5kX2RlbHRhICYgMHgwZjsKKworICAgICAgICBpZiAoJGNvbXBhY3RfdHlwZSA9PSBUVHlwZTo6U1RPUCkgeworICAgICAgICAgICAgJGZpZWxkX3R5cGUgPSAkY29tcGFjdF90eXBlOworICAgICAgICAgICAgJGZpZWxkX2lkID0gMDsKKworICAgICAgICAgICAgcmV0dXJuICRyZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgJGRlbHRhID0gJGNvbXBhY3RfdHlwZV9hbmRfZGVsdGEgPj4gNDsKKyAgICAgICAgaWYgKCRkZWx0YSA9PSAwKSB7CisgICAgICAgICAgICAkcmVzdWx0ICs9ICR0aGlzLT5yZWFkSTE2KCRmaWVsZF9pZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkZmllbGRfaWQgPSAkdGhpcy0+bGFzdEZpZCArICRkZWx0YTsKKyAgICAgICAgfQorICAgICAgICAkdGhpcy0+bGFzdEZpZCA9ICRmaWVsZF9pZDsKKyAgICAgICAgJGZpZWxkX3R5cGUgPSAkdGhpcy0+Z2V0VFR5cGUoJGNvbXBhY3RfdHlwZSk7CisKKyAgICAgICAgaWYgKCRjb21wYWN0X3R5cGUgPT0gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9UUlVFKSB7CisgICAgICAgICAgICAkdGhpcy0+c3RhdGUgPSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9CT09MX1JFQUQ7CisgICAgICAgICAgICAkdGhpcy0+Ym9vbFZhbHVlID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlaWYgKCRjb21wYWN0X3R5cGUgPT0gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9GQUxTRSkgeworICAgICAgICAgICAgJHRoaXMtPnN0YXRlID0gVENvbXBhY3RQcm90b2NvbDo6U1RBVEVfQk9PTF9SRUFEOworICAgICAgICAgICAgJHRoaXMtPmJvb2xWYWx1ZSA9IGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJHRoaXMtPnN0YXRlID0gVENvbXBhY3RQcm90b2NvbDo6U1RBVEVfVkFMVUVfUkVBRDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAkcmVzdWx0OworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkRmllbGRFbmQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnN0YXRlID0gVENvbXBhY3RQcm90b2NvbDo6U1RBVEVfRklFTERfUkVBRDsKKworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFVCeXRlKCYkdmFsdWUpCisgICAgeworICAgICAgICAkZGF0YSA9ICR0aGlzLT50cmFuc18tPnJlYWRBbGwoMSk7CisgICAgICAgICRhcnIgPSB1bnBhY2soJ0MnLCAkZGF0YSk7CisgICAgICAgICR2YWx1ZSA9ICRhcnJbMV07CisKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRCeXRlKCYkdmFsdWUpCisgICAgeworICAgICAgICAkZGF0YSA9ICR0aGlzLT50cmFuc18tPnJlYWRBbGwoMSk7CisgICAgICAgICRhcnIgPSB1bnBhY2soJ2MnLCAkZGF0YSk7CisgICAgICAgICR2YWx1ZSA9ICRhcnJbMV07CisKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRaaWdaYWcoJiR2YWx1ZSkKKyAgICB7CisgICAgICAgICRyZXN1bHQgPSAkdGhpcy0+cmVhZFZhcmludCgkdmFsdWUpOworICAgICAgICAkdmFsdWUgPSAkdGhpcy0+ZnJvbVppZ1phZygkdmFsdWUpOworCisgICAgICAgIHJldHVybiAkcmVzdWx0OworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWVzc2FnZUJlZ2luKCYkbmFtZSwgJiR0eXBlLCAmJHNlcWlkKQorICAgIHsKKyAgICAgICAgJHByb3RvSWQgPSAwOworICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPnJlYWRVQnl0ZSgkcHJvdG9JZCk7CisgICAgICAgIGlmICgkcHJvdG9JZCAhPSBUQ29tcGFjdFByb3RvY29sOjpQUk9UT0NPTF9JRCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbignQmFkIHByb3RvY29sIGlkIGluIFRDb21wYWN0IG1lc3NhZ2UnKTsKKyAgICAgICAgfQorICAgICAgICAkdmVyVHlwZSA9IDA7CisgICAgICAgICRyZXN1bHQgKz0gJHRoaXMtPnJlYWRVQnl0ZSgkdmVyVHlwZSk7CisgICAgICAgICR0eXBlID0gKCR2ZXJUeXBlID4+IFRDb21wYWN0UHJvdG9jb2w6OlRZUEVfU0hJRlRfQU1PVU5UKSAmIFRDb21wYWN0UHJvdG9jb2w6OlRZUEVfQklUUzsKKyAgICAgICAgJHZlcnNpb24gPSAkdmVyVHlwZSAmIFRDb21wYWN0UHJvdG9jb2w6OlZFUlNJT05fTUFTSzsKKyAgICAgICAgaWYgKCR2ZXJzaW9uICE9IFRDb21wYWN0UHJvdG9jb2w6OlZFUlNJT04pIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oJ0JhZCB2ZXJzaW9uIGluIFRDb21wYWN0IG1lc3NhZ2UnKTsKKyAgICAgICAgfQorICAgICAgICAkcmVzdWx0ICs9ICR0aGlzLT5yZWFkVmFyaW50KCRzZXFpZCk7CisgICAgICAgICRyZXN1bHQgKz0gJHRoaXMtPnJlYWRTdHJpbmcoJG5hbWUpOworCisgICAgICAgIHJldHVybiAkcmVzdWx0OworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWVzc2FnZUVuZCgpCisgICAgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cnVjdEJlZ2luKCYkbmFtZSkKKyAgICB7CisgICAgICAgICRuYW1lID0gJyc7IC8vIHVudXNlZAorICAgICAgICAkdGhpcy0+c3RydWN0c1tdID0gYXJyYXkoJHRoaXMtPnN0YXRlLCAkdGhpcy0+bGFzdEZpZCk7CisgICAgICAgICR0aGlzLT5zdGF0ZSA9IFRDb21wYWN0UHJvdG9jb2w6OlNUQVRFX0ZJRUxEX1JFQUQ7CisgICAgICAgICR0aGlzLT5sYXN0RmlkID0gMDsKKworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cnVjdEVuZCgpCisgICAgeworICAgICAgICAkbGFzdCA9IGFycmF5X3BvcCgkdGhpcy0+c3RydWN0cyk7CisgICAgICAgICR0aGlzLT5zdGF0ZSA9ICRsYXN0WzBdOworICAgICAgICAkdGhpcy0+bGFzdEZpZCA9ICRsYXN0WzFdOworCisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkQ29sbGVjdGlvbkJlZ2luKCYkdHlwZSwgJiRzaXplKQorICAgIHsKKyAgICAgICAgJHNpemVUeXBlID0gMDsKKyAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5yZWFkVUJ5dGUoJHNpemVUeXBlKTsKKyAgICAgICAgJHNpemUgPSAkc2l6ZVR5cGUgPj4gNDsKKyAgICAgICAgJHR5cGUgPSAkdGhpcy0+Z2V0VFR5cGUoJHNpemVUeXBlKTsKKyAgICAgICAgaWYgKCRzaXplID09IDE1KSB7CisgICAgICAgICAgICAkcmVzdWx0ICs9ICR0aGlzLT5yZWFkVmFyaW50KCRzaXplKTsKKyAgICAgICAgfQorICAgICAgICAkdGhpcy0+Y29udGFpbmVyc1tdID0gJHRoaXMtPnN0YXRlOworICAgICAgICAkdGhpcy0+c3RhdGUgPSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9DT05UQUlORVJfUkVBRDsKKworICAgICAgICByZXR1cm4gJHJlc3VsdDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1hcEJlZ2luKCYka2V5X3R5cGUsICYkdmFsX3R5cGUsICYkc2l6ZSkKKyAgICB7CisgICAgICAgICRyZXN1bHQgPSAkdGhpcy0+cmVhZFZhcmludCgkc2l6ZSk7CisgICAgICAgICR0eXBlcyA9IDA7CisgICAgICAgIGlmICgkc2l6ZSA+IDApIHsKKyAgICAgICAgICAgICRyZXN1bHQgKz0gJHRoaXMtPnJlYWRVQnl0ZSgkdHlwZXMpOworICAgICAgICB9CisgICAgICAgICR2YWxfdHlwZSA9ICR0aGlzLT5nZXRUVHlwZSgkdHlwZXMpOworICAgICAgICAka2V5X3R5cGUgPSAkdGhpcy0+Z2V0VFR5cGUoJHR5cGVzID4+IDQpOworICAgICAgICAkdGhpcy0+Y29udGFpbmVyc1tdID0gJHRoaXMtPnN0YXRlOworICAgICAgICAkdGhpcy0+c3RhdGUgPSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9DT05UQUlORVJfUkVBRDsKKworICAgICAgICByZXR1cm4gJHJlc3VsdDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZENvbGxlY3Rpb25FbmQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnN0YXRlID0gYXJyYXlfcG9wKCR0aGlzLT5jb250YWluZXJzKTsKKworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1hcEVuZCgpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPnJlYWRDb2xsZWN0aW9uRW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRMaXN0QmVnaW4oJiRlbGVtX3R5cGUsICYkc2l6ZSkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+cmVhZENvbGxlY3Rpb25CZWdpbigkZWxlbV90eXBlLCAkc2l6ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRMaXN0RW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+cmVhZENvbGxlY3Rpb25FbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFNldEJlZ2luKCYkZWxlbV90eXBlLCAmJHNpemUpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPnJlYWRDb2xsZWN0aW9uQmVnaW4oJGVsZW1fdHlwZSwgJHNpemUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU2V0RW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+cmVhZENvbGxlY3Rpb25FbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEJvb2woJiR2YWx1ZSkKKyAgICB7CisgICAgICAgIGlmICgkdGhpcy0+c3RhdGUgPT0gVENvbXBhY3RQcm90b2NvbDo6U1RBVEVfQk9PTF9SRUFEKSB7CisgICAgICAgICAgICAkdmFsdWUgPSAkdGhpcy0+Ym9vbFZhbHVlOworCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfSBlbHNlaWYgKCR0aGlzLT5zdGF0ZSA9PSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9DT05UQUlORVJfUkVBRCkgeworICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5yZWFkQnl0ZSgkdmFsdWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbignSW52YWxpZCBzdGF0ZSBpbiBjb21wYWN0IHByb3RvY29sJyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEkxNigmJHZhbHVlKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5yZWFkWmlnWmFnKCR2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRJMzIoJiR2YWx1ZSkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+cmVhZFppZ1phZygkdmFsdWUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkRG91YmxlKCYkdmFsdWUpCisgICAgeworICAgICAgICAkZGF0YSA9ICR0aGlzLT50cmFuc18tPnJlYWRBbGwoOCk7CisgICAgICAgICRhcnIgPSB1bnBhY2soJ2QnLCAkZGF0YSk7CisgICAgICAgICR2YWx1ZSA9ICRhcnJbMV07CisKKyAgICAgICAgcmV0dXJuIDg7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJpbmcoJiR2YWx1ZSkKKyAgICB7CisgICAgICAgICRyZXN1bHQgPSAkdGhpcy0+cmVhZFZhcmludCgkbGVuKTsKKyAgICAgICAgaWYgKCRsZW4pIHsKKyAgICAgICAgICAgICR2YWx1ZSA9ICR0aGlzLT50cmFuc18tPnJlYWRBbGwoJGxlbik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkdmFsdWUgPSAnJzsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAkcmVzdWx0ICsgJGxlbjsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0VFR5cGUoJGJ5dGUpCisgICAgeworICAgICAgICByZXR1cm4gc2VsZjo6JHR0eXBlc1skYnl0ZSAmIDB4MGZdOworICAgIH0KKworICAgIC8vIElmIHdlIGFyZSBvbiBhIDMyYml0IGFyY2hpdGVjdHVyZSB3ZSBoYXZlIHRvIGV4cGxpY2l0bHkgZGVhbCB3aXRoCisgICAgLy8gNjQtYml0IHR3b3MtY29tcGxlbWVudCBhcml0aG1ldGljIHNpbmNlIFBIUCB3YW50cyB0byB0cmVhdCBhbGwgaW50cworICAgIC8vIGFzIHNpZ25lZCBhbmQgYW55IGludCBvdmVyIDJeMzEgLSAxIGFzIGEgZmxvYXQKKworICAgIC8vIFJlYWQgYW5kIHdyaXRlIEk2NCBhcyB0d28gMzIgYml0IG51bWJlcnMgJGhpIGFuZCAkbG8KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkSTY0KCYkdmFsdWUpCisgICAgeworICAgICAgICAvLyBSZWFkIHZhcmludCBmcm9tIHdpcmUKKyAgICAgICAgJGhpID0gMDsKKyAgICAgICAgJGxvID0gMDsKKworICAgICAgICAkaWR4ID0gMDsKKyAgICAgICAgJHNoaWZ0ID0gMDsKKworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgJHggPSAkdGhpcy0+dHJhbnNfLT5yZWFkQWxsKDEpOworICAgICAgICAgICAgJGFyciA9IHVucGFjaygnQycsICR4KTsKKyAgICAgICAgICAgICRieXRlID0gJGFyclsxXTsKKyAgICAgICAgICAgICRpZHggKz0gMTsKKyAgICAgICAgICAgIC8vIFNoaWZ0IGhpIGFuZCBsbyB0b2dldGhlci4KKyAgICAgICAgICAgIGlmICgkc2hpZnQgPCAyOCkgeworICAgICAgICAgICAgICAgICRsbyB8PSAoKCRieXRlICYgMHg3ZikgPDwgJHNoaWZ0KTsKKyAgICAgICAgICAgIH0gZWxzZWlmICgkc2hpZnQgPT0gMjgpIHsKKyAgICAgICAgICAgICAgICAkbG8gfD0gKCgkYnl0ZSAmIDB4MGYpIDw8IDI4KTsKKyAgICAgICAgICAgICAgICAkaGkgfD0gKCgkYnl0ZSAmIDB4NzApID4+IDQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAkaGkgfD0gKCgkYnl0ZSAmIDB4N2YpIDw8ICgkc2hpZnQgLSAzMikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCgkYnl0ZSA+PiA3KSA9PT0gMCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgJHNoaWZ0ICs9IDc7CisgICAgICAgIH0KKworICAgICAgICAvLyBOb3csIHVuemlnIGl0LgorICAgICAgICAkeG9yZXIgPSAwOworICAgICAgICBpZiAoJGxvICYgMSkgeworICAgICAgICAgICAgJHhvcmVyID0gMHhmZmZmZmZmZjsKKyAgICAgICAgfQorICAgICAgICAkbG8gPSAoJGxvID4+IDEpICYgMHg3ZmZmZmZmZjsKKyAgICAgICAgJGxvID0gJGxvIHwgKCgkaGkgJiAxKSA8PCAzMSk7CisgICAgICAgICRoaSA9ICgkaGkgPj4gMSkgXiAkeG9yZXI7CisgICAgICAgICRsbyA9ICRsbyBeICR4b3JlcjsKKworICAgICAgICAvLyBOb3cgcHV0ICRoaSBhbmQgJGxvIGJhY2sgdG9nZXRoZXIKKyAgICAgICAgJGlzTmVnID0gJGhpIDwgMCB8fCAkaGkgJiAweDgwMDAwMDAwOworCisgICAgICAgIC8vIENoZWNrIGZvciBhIG5lZ2F0aXZlCisgICAgICAgIGlmICgkaXNOZWcpIHsKKyAgICAgICAgICAgICRoaSA9IH4kaGkgJiAoaW50KTB4ZmZmZmZmZmY7CisgICAgICAgICAgICAkbG8gPSB+JGxvICYgKGludCkweGZmZmZmZmZmOworCisgICAgICAgICAgICBpZiAoJGxvID09IChpbnQpMHhmZmZmZmZmZikgeworICAgICAgICAgICAgICAgICRoaSsrOworICAgICAgICAgICAgICAgICRsbyA9IDA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICRsbysrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gRm9yY2UgMzJiaXQgd29yZHMgaW4gZXhjZXNzIG9mIDJHIHRvIGJlIHBvc2l0aXZlIC0gd2UgZGVhbCB3aXRoIHNpZ24KKyAgICAgICAgLy8gZXhwbGljaXRseSBiZWxvdworCisgICAgICAgIGlmICgkaGkgJiAoaW50KTB4ODAwMDAwMDApIHsKKyAgICAgICAgICAgICRoaSAmPSAoaW50KTB4N2ZmZmZmZmY7CisgICAgICAgICAgICAkaGkgKz0gMHg4MDAwMDAwMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgkbG8gJiAoaW50KTB4ODAwMDAwMDApIHsKKyAgICAgICAgICAgICRsbyAmPSAoaW50KTB4N2ZmZmZmZmY7CisgICAgICAgICAgICAkbG8gKz0gMHg4MDAwMDAwMDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENyZWF0ZSBhcyBuZWdhdGl2ZSB2YWx1ZSBmaXJzdCwgc2luY2Ugd2UgY2FuIHN0b3JlIC0yXjYzIGJ1dCBub3QgMl42MworICAgICAgICAkdmFsdWUgPSAtJGhpICogNDI5NDk2NzI5NiAtICRsbzsKKworICAgICAgICBpZiAoISRpc05lZykgeworICAgICAgICAgICAgJHZhbHVlID0gLSR2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAkaWR4OworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUk2NCgkdmFsdWUpCisgICAgeworICAgICAgICAvLyBJZiB3ZSBhcmUgaW4gYW4gSTMyIHJhbmdlLCB1c2UgdGhlIGVhc3kgbWV0aG9kIGJlbG93LgorICAgICAgICBpZiAoKCR2YWx1ZSA+IDQyOTQ5NjcyOTYpIHx8ICgkdmFsdWUgPCAtNDI5NDk2NzI5NikpIHsKKyAgICAgICAgICAgIC8vIENvbnZlcnQgJHZhbHVlIHRvICRoaSBhbmQgJGxvCisgICAgICAgICAgICAkbmVnID0gJHZhbHVlIDwgMDsKKworICAgICAgICAgICAgaWYgKCRuZWcpIHsKKyAgICAgICAgICAgICAgICAkdmFsdWUgKj0gLTE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICRoaSA9IChpbnQpJHZhbHVlID4+IDMyOworICAgICAgICAgICAgJGxvID0gKGludCkkdmFsdWUgJiAweGZmZmZmZmZmOworCisgICAgICAgICAgICBpZiAoJG5lZykgeworICAgICAgICAgICAgICAgICRoaSA9IH4kaGk7CisgICAgICAgICAgICAgICAgJGxvID0gfiRsbzsKKyAgICAgICAgICAgICAgICBpZiAoKCRsbyAmIChpbnQpMHhmZmZmZmZmZikgPT0gKGludCkweGZmZmZmZmZmKSB7CisgICAgICAgICAgICAgICAgICAgICRsbyA9IDA7CisgICAgICAgICAgICAgICAgICAgICRoaSsrOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICRsbysrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gTm93IGRvIHRoZSB6aWdnaW5nIGFuZCB6YWdnaW5nLgorICAgICAgICAgICAgJHhvcmVyID0gMDsKKyAgICAgICAgICAgIGlmICgkbmVnKSB7CisgICAgICAgICAgICAgICAgJHhvcmVyID0gMHhmZmZmZmZmZjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICRsb3diaXQgPSAoJGxvID4+IDMxKSAmIDE7CisgICAgICAgICAgICAkaGkgPSAoJGhpIDw8IDEpIHwgJGxvd2JpdDsKKyAgICAgICAgICAgICRsbyA9ICgkbG8gPDwgMSk7CisgICAgICAgICAgICAkbG8gPSAoJGxvIF4gJHhvcmVyKSAmIDB4ZmZmZmZmZmY7CisgICAgICAgICAgICAkaGkgPSAoJGhpIF4gJHhvcmVyKSAmIDB4ZmZmZmZmZmY7CisKKyAgICAgICAgICAgIC8vIG5vdyB3cml0ZSBvdXQgdGhlIHZhcmludCwgZW5zdXJpbmcgd2Ugc2hpZnQgYm90aCBoaSBhbmQgbG8KKyAgICAgICAgICAgICRvdXQgPSAiIjsKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAgICAgaWYgKCgkbG8gJiB+MHg3ZikgPT09IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgJGhpID09PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICRvdXQgLj0gY2hyKCRsbyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICRvdXQgLj0gY2hyKCgkbG8gJiAweGZmKSB8IDB4ODApOworICAgICAgICAgICAgICAgICAgICAkbG8gPSAkbG8gPj4gNzsKKyAgICAgICAgICAgICAgICAgICAgJGxvID0gJGxvIHwgKCRoaSA8PCAyNSk7CisgICAgICAgICAgICAgICAgICAgICRoaSA9ICRoaSA+PiA3OworICAgICAgICAgICAgICAgICAgICAvLyBSaWdodCBzaGlmdCBjYXJyaWVzIHNpZ24sIGJ1dCB3ZSBkb24ndCB3YW50IGl0IHRvLgorICAgICAgICAgICAgICAgICAgICAkaGkgPSAkaGkgJiAoMTI3IDw8IDI1KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICRyZXQgPSBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJG91dCk7CisgICAgICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZSgkb3V0LCAkcmV0KTsKKworICAgICAgICAgICAgcmV0dXJuICRyZXQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gJHRoaXMtPndyaXRlVmFyaW50KCR0aGlzLT50b1ppZ1phZygkdmFsdWUsIDY0KSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9Qcm90b2NvbC9USlNPTlByb3RvY29sLnBocCBiL2xpYi9waHAvbGliL1Byb3RvY29sL1RKU09OUHJvdG9jb2wucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxNDQ4ODQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9Qcm90b2NvbC9USlNPTlByb3RvY29sLnBocApAQCAtMCwwICsxLDgxNSBAQAorPD9waHAKKworLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFByb3RvY29sOworCit1c2UgVGhyaWZ0XFR5cGVcVFR5cGU7Cit1c2UgVGhyaWZ0XEV4Y2VwdGlvblxUUHJvdG9jb2xFeGNlcHRpb247Cit1c2UgVGhyaWZ0XFByb3RvY29sXEpTT05cQmFzZUNvbnRleHQ7Cit1c2UgVGhyaWZ0XFByb3RvY29sXEpTT05cTG9va2FoZWFkUmVhZGVyOwordXNlIFRocmlmdFxQcm90b2NvbFxKU09OXFBhaXJDb250ZXh0OwordXNlIFRocmlmdFxQcm90b2NvbFxKU09OXExpc3RDb250ZXh0OworCisvKioKKyAqIEpTT04gaW1wbGVtZW50YXRpb24gb2YgdGhyaWZ0IHByb3RvY29sLCBwb3J0ZWQgZnJvbSBKYXZhLgorICovCitjbGFzcyBUSlNPTlByb3RvY29sIGV4dGVuZHMgVFByb3RvY29sCit7CisgICAgY29uc3QgQ09NTUEgPSAnLCc7CisgICAgY29uc3QgQ09MT04gPSAnOic7CisgICAgY29uc3QgTEJSQUNFID0gJ3snOworICAgIGNvbnN0IFJCUkFDRSA9ICd9JzsKKyAgICBjb25zdCBMQlJBQ0tFVCA9ICdbJzsKKyAgICBjb25zdCBSQlJBQ0tFVCA9ICddJzsKKyAgICBjb25zdCBRVU9URSA9ICciJzsKKyAgICBjb25zdCBCQUNLU0xBU0ggPSAnXFwnOworICAgIGNvbnN0IFpFUk8gPSAnMCc7CisgICAgY29uc3QgRVNDU0VRID0gJ1xcJzsKKyAgICBjb25zdCBET1VCTEVFU0MgPSAnX19ET1VCTEVfRVNDQVBFX1NFUVVFTkNFX18nOworCisgICAgY29uc3QgVkVSU0lPTiA9IDE7CisKKyAgICBwdWJsaWMgc3RhdGljICRKU09OX0NIQVJfVEFCTEUgPSBhcnJheSgKKyAgICAgICAgLyogIDAgICAxICAgMiAgIDMgICA0ICAgNSAgIDYgICA3ICAgOCAgIDkgICBBICAgQiAgIEMgICBEICAgRSAgIEYgKi8KKyAgICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgJ2InLCAndCcsICduJywgMCwgJ2YnLCAncicsIDAsIDAsIC8vIDAKKyAgICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgLy8gMQorICAgICAgICAxLCAxLCAnIicsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIC8vIDIKKyAgICApOworCisgICAgcHVibGljIHN0YXRpYyAkRVNDQVBFX0NIQVJTID0gYXJyYXkoJyInLCAnXFwnLCAnLycsICJiIiwgImYiLCAibiIsICJyIiwgInQiKTsKKworICAgIHB1YmxpYyBzdGF0aWMgJEVTQ0FQRV9DSEFSX1ZBTFMgPSBhcnJheSgKKyAgICAgICAgJyInLCAnXFwnLCAnLycsICJceDA4IiwgIlxmIiwgIlxuIiwgIlxyIiwgIlx0IiwKKyAgICApOworCisgICAgY29uc3QgTkFNRV9CT09MID0gInRmIjsKKyAgICBjb25zdCBOQU1FX0JZVEUgPSAiaTgiOworICAgIGNvbnN0IE5BTUVfSTE2ID0gImkxNiI7CisgICAgY29uc3QgTkFNRV9JMzIgPSAiaTMyIjsKKyAgICBjb25zdCBOQU1FX0k2NCA9ICJpNjQiOworICAgIGNvbnN0IE5BTUVfRE9VQkxFID0gImRibCI7CisgICAgY29uc3QgTkFNRV9TVFJVQ1QgPSAicmVjIjsKKyAgICBjb25zdCBOQU1FX1NUUklORyA9ICJzdHIiOworICAgIGNvbnN0IE5BTUVfTUFQID0gIm1hcCI7CisgICAgY29uc3QgTkFNRV9MSVNUID0gImxzdCI7CisgICAgY29uc3QgTkFNRV9TRVQgPSAic2V0IjsKKworICAgIHByaXZhdGUgZnVuY3Rpb24gZ2V0VHlwZU5hbWVGb3JUeXBlSUQoJHR5cGVJRCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAoJHR5cGVJRCkgeworICAgICAgICAgICAgY2FzZSBUVHlwZTo6Qk9PTDoKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZjo6TkFNRV9CT09MOworICAgICAgICAgICAgY2FzZSBUVHlwZTo6QllURToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZjo6TkFNRV9CWVRFOworICAgICAgICAgICAgY2FzZSBUVHlwZTo6STE2OgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmOjpOQU1FX0kxNjsKKyAgICAgICAgICAgIGNhc2UgVFR5cGU6OkkzMjoKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZjo6TkFNRV9JMzI7CisgICAgICAgICAgICBjYXNlIFRUeXBlOjpJNjQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGY6Ok5BTUVfSTY0OworICAgICAgICAgICAgY2FzZSBUVHlwZTo6RE9VQkxFOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmOjpOQU1FX0RPVUJMRTsKKyAgICAgICAgICAgIGNhc2UgVFR5cGU6OlNUUklORzoKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZjo6TkFNRV9TVFJJTkc7CisgICAgICAgICAgICBjYXNlIFRUeXBlOjpTVFJVQ1Q6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGY6Ok5BTUVfU1RSVUNUOworICAgICAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmOjpOQU1FX01BUDsKKyAgICAgICAgICAgIGNhc2UgVFR5cGU6OlNFVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZjo6TkFNRV9TRVQ7CisgICAgICAgICAgICBjYXNlIFRUeXBlOjpMU1Q6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGY6Ok5BTUVfTElTVDsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigiVW5yZWNvZ25pemVkIHR5cGUiLCBUUHJvdG9jb2xFeGNlcHRpb246OlVOS05PV04pOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBnZXRUeXBlSURGb3JUeXBlTmFtZSgkbmFtZSkKKyAgICB7CisgICAgICAgICRyZXN1bHQgPSBUVHlwZTo6U1RPUDsKKworICAgICAgICBpZiAoc3RybGVuKCRuYW1lKSA+IDEpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoc3Vic3RyKCRuYW1lLCAwLCAxKSkgeworICAgICAgICAgICAgICAgIGNhc2UgJ2QnOgorICAgICAgICAgICAgICAgICAgICAkcmVzdWx0ID0gVFR5cGU6OkRPVUJMRTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnaSc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3Vic3RyKCRuYW1lLCAxLCAxKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnOCc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCA9IFRUeXBlOjpCWVRFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnMSc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCA9IFRUeXBlOjpJMTY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICczJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcmVzdWx0ID0gVFR5cGU6OkkzMjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzYnOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyZXN1bHQgPSBUVHlwZTo6STY0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJ2wnOgorICAgICAgICAgICAgICAgICAgICAkcmVzdWx0ID0gVFR5cGU6OkxTVDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnbSc6CisgICAgICAgICAgICAgICAgICAgICRyZXN1bHQgPSBUVHlwZTo6TUFQOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICdyJzoKKyAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCA9IFRUeXBlOjpTVFJVQ1Q7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJ3MnOgorICAgICAgICAgICAgICAgICAgICBpZiAoc3Vic3RyKCRuYW1lLCAxLCAxKSA9PSAndCcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICRyZXN1bHQgPSBUVHlwZTo6U1RSSU5HOworICAgICAgICAgICAgICAgICAgICB9IGVsc2VpZiAoc3Vic3RyKCRuYW1lLCAxLCAxKSA9PSAnZScpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICRyZXN1bHQgPSBUVHlwZTo6U0VUOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJ3QnOgorICAgICAgICAgICAgICAgICAgICAkcmVzdWx0ID0gVFR5cGU6OkJPT0w7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICgkcmVzdWx0ID09IFRUeXBlOjpTVE9QKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCJVbnJlY29nbml6ZWQgdHlwZSIsIFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAkcmVzdWx0OworICAgIH0KKworICAgIHB1YmxpYyAkY29udGV4dFN0YWNrXyA9IGFycmF5KCk7CisgICAgcHVibGljICRjb250ZXh0XzsKKyAgICBwdWJsaWMgJHJlYWRlcl87CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIHB1c2hDb250ZXh0KCRjKQorICAgIHsKKyAgICAgICAgYXJyYXlfcHVzaCgkdGhpcy0+Y29udGV4dFN0YWNrXywgJHRoaXMtPmNvbnRleHRfKTsKKyAgICAgICAgJHRoaXMtPmNvbnRleHRfID0gJGM7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBwb3BDb250ZXh0KCkKKyAgICB7CisgICAgICAgICR0aGlzLT5jb250ZXh0XyA9IGFycmF5X3BvcCgkdGhpcy0+Y29udGV4dFN0YWNrXyk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCR0cmFucykKKyAgICB7CisgICAgICAgIHBhcmVudDo6X19jb25zdHJ1Y3QoJHRyYW5zKTsKKyAgICAgICAgJHRoaXMtPmNvbnRleHRfID0gbmV3IEJhc2VDb250ZXh0KCk7CisgICAgICAgICR0aGlzLT5yZWFkZXJfID0gbmV3IExvb2thaGVhZFJlYWRlcigkdGhpcyk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlc2V0KCkKKyAgICB7CisgICAgICAgICR0aGlzLT5jb250ZXh0U3RhY2tfID0gYXJyYXkoKTsKKyAgICAgICAgJHRoaXMtPmNvbnRleHRfID0gbmV3IEJhc2VDb250ZXh0KCk7CisgICAgICAgICR0aGlzLT5yZWFkZXJfID0gbmV3IExvb2thaGVhZFJlYWRlcigkdGhpcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSAkdG1wYnVmXyA9IGFycmF5KDQpOworCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRKU09OU3ludGF4Q2hhcigkYikKKyAgICB7CisgICAgICAgICRjaCA9ICR0aGlzLT5yZWFkZXJfLT5yZWFkKCk7CisKKyAgICAgICAgaWYgKHN1YnN0cigkY2gsIDAsIDEpICE9ICRiKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCJVbmV4cGVjdGVkIGNoYXJhY3RlcjogIiAuICRjaCwgVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBoZXhWYWwoJHMpCisgICAgeworICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCBzdHJsZW4oJHMpOyAkaSsrKSB7CisgICAgICAgICAgICAkY2ggPSBzdWJzdHIoJHMsICRpLCAxKTsKKworICAgICAgICAgICAgaWYgKCEoJGNoID49ICJhIiAmJiAkY2ggPD0gImYiKSAmJiAhKCRjaCA+PSAiMCIgJiYgJGNoIDw9ICI5IikpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCJFeHBlY3RlZCBoZXggY2hhcmFjdGVyICIgLiAkY2gsIFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBoZXhkZWMoJHMpOworICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gaGV4Q2hhcigkdmFsKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGRlY2hleCgkdmFsKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIGhhc0pTT05VbmVzY2FwZWRVbmljb2RlKCkKKyAgICB7CisgICAgICAgIGlmIChQSFBfTUFKT1JfVkVSU0lPTiA+IDUgfHwgKFBIUF9NQUpPUl9WRVJTSU9OID09IDUgJiYgUEhQX01JTk9SX1ZFUlNJT04gPj0gNCkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gdW5lc2NhcGVkVW5pY29kZSgkc3RyKQorICAgIHsKKyAgICAgICAgaWYgKCR0aGlzLT5oYXNKU09OVW5lc2NhcGVkVW5pY29kZSgpKSB7CisgICAgICAgICAgICByZXR1cm4ganNvbl9lbmNvZGUoJHN0ciwgSlNPTl9VTkVTQ0FQRURfVU5JQ09ERSk7CisgICAgICAgIH0KKworICAgICAgICAkanNvbiA9IGpzb25fZW5jb2RlKCRzdHIpOworCisgICAgICAgIC8qCisgICAgICAgICAqIFVuZXNjYXBlZCBjaGFyYWN0ZXIgb3V0c2lkZSB0aGUgQmFzaWMgTXVsdGlsaW5ndWFsIFBsYW5lCisgICAgICAgICAqIEhpZ2ggc3Vycm9nYXRlOiAweEQ4MDAgLSAweERCRkYKKyAgICAgICAgICogTG93IHN1cnJvZ2F0ZTogMHhEQzAwIC0gMHhERkZGCisgICAgICAgICAqLworICAgICAgICAkanNvbiA9IHByZWdfcmVwbGFjZV9jYWxsYmFjaygKKyAgICAgICAgICAgICcvXFxcXHUoZFs4OWFiXVswLTlhLWZdezJ9KVxcXFx1KGRbY2RlZl1bMC05YS1mXXsyfSkvaScsCisgICAgICAgICAgICBmdW5jdGlvbiAoJG1hdGNoZXMpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbWJfY29udmVydF9lbmNvZGluZyhwYWNrKCdIKicsICRtYXRjaGVzWzFdIC4gJG1hdGNoZXNbMl0pLCAnVVRGLTgnLCAnVVRGLTE2QkUnKTsKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAkanNvbgorICAgICAgICApOworCisgICAgICAgIC8qCisgICAgICAgICAqIFVuZXNjYXBlZCBjaGFyYWN0ZXJzIHdpdGhpbiB0aGUgQmFzaWMgTXVsdGlsaW5ndWFsIFBsYW5lCisgICAgICAgICAqLworICAgICAgICAkanNvbiA9IHByZWdfcmVwbGFjZV9jYWxsYmFjaygKKyAgICAgICAgICAgICcvXFxcXHUoWzAtOWEtZl17NH0pL2knLAorICAgICAgICAgICAgZnVuY3Rpb24gKCRtYXRjaGVzKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1iX2NvbnZlcnRfZW5jb2RpbmcocGFjaygnSConLCAkbWF0Y2hlc1sxXSksICdVVEYtOCcsICdVVEYtMTZCRScpOworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICRqc29uCisgICAgICAgICk7CisKKyAgICAgICAgcmV0dXJuICRqc29uOworICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gd3JpdGVKU09OU3RyaW5nKCRiKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmNvbnRleHRfLT53cml0ZSgpOworCisgICAgICAgIGlmIChpc19udW1lcmljKCRiKSAmJiAkdGhpcy0+Y29udGV4dF8tPmVzY2FwZU51bSgpKSB7CisgICAgICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpRVU9URSk7CisgICAgICAgIH0KKworICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZSgkdGhpcy0+dW5lc2NhcGVkVW5pY29kZSgkYikpOworCisgICAgICAgIGlmIChpc19udW1lcmljKCRiKSAmJiAkdGhpcy0+Y29udGV4dF8tPmVzY2FwZU51bSgpKSB7CisgICAgICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpRVU9URSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIHdyaXRlSlNPTkludGVnZXIoJG51bSkKKyAgICB7CisgICAgICAgICR0aGlzLT5jb250ZXh0Xy0+d3JpdGUoKTsKKworICAgICAgICBpZiAoJHRoaXMtPmNvbnRleHRfLT5lc2NhcGVOdW0oKSkgeworICAgICAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6UVVPVEUpOworICAgICAgICB9CisKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoJG51bSk7CisKKyAgICAgICAgaWYgKCR0aGlzLT5jb250ZXh0Xy0+ZXNjYXBlTnVtKCkpIHsKKyAgICAgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OlFVT1RFKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gd3JpdGVKU09ORG91YmxlKCRudW0pCisgICAgeworICAgICAgICAkdGhpcy0+Y29udGV4dF8tPndyaXRlKCk7CisKKyAgICAgICAgaWYgKCR0aGlzLT5jb250ZXh0Xy0+ZXNjYXBlTnVtKCkpIHsKKyAgICAgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OlFVT1RFKTsKKyAgICAgICAgfQorCisgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKGpzb25fZW5jb2RlKCRudW0pKTsKKworICAgICAgICBpZiAoJHRoaXMtPmNvbnRleHRfLT5lc2NhcGVOdW0oKSkgeworICAgICAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6UVVPVEUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiB3cml0ZUpTT05CYXNlNjQoJGRhdGEpCisgICAgeworICAgICAgICAkdGhpcy0+Y29udGV4dF8tPndyaXRlKCk7CisgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OlFVT1RFKTsKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoanNvbl9lbmNvZGUoYmFzZTY0X2VuY29kZSgkZGF0YSkpKTsKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6UVVPVEUpOworICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gd3JpdGVKU09OT2JqZWN0U3RhcnQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmNvbnRleHRfLT53cml0ZSgpOworICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpMQlJBQ0UpOworICAgICAgICAkdGhpcy0+cHVzaENvbnRleHQobmV3IFBhaXJDb250ZXh0KCR0aGlzKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiB3cml0ZUpTT05PYmplY3RFbmQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnBvcENvbnRleHQoKTsKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6UkJSQUNFKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIHdyaXRlSlNPTkFycmF5U3RhcnQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmNvbnRleHRfLT53cml0ZSgpOworICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpMQlJBQ0tFVCk7CisgICAgICAgICR0aGlzLT5wdXNoQ29udGV4dChuZXcgTGlzdENvbnRleHQoJHRoaXMpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIHdyaXRlSlNPTkFycmF5RW5kKCkKKyAgICB7CisgICAgICAgICR0aGlzLT5wb3BDb250ZXh0KCk7CisgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OlJCUkFDS0VUKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIHJlYWRKU09OU3RyaW5nKCRza2lwQ29udGV4dCkKKyAgICB7CisgICAgICAgIGlmICghJHNraXBDb250ZXh0KSB7CisgICAgICAgICAgICAkdGhpcy0+Y29udGV4dF8tPnJlYWQoKTsKKyAgICAgICAgfQorCisgICAgICAgICRqc29uU3RyaW5nID0gJyc7CisgICAgICAgICRsYXN0Q2hhciA9IG51bGw7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAkY2ggPSAkdGhpcy0+cmVhZGVyXy0+cmVhZCgpOworICAgICAgICAgICAgJGpzb25TdHJpbmcgLj0gJGNoOworICAgICAgICAgICAgaWYgKCRjaCA9PSBzZWxmOjpRVU9URSAmJgorICAgICAgICAgICAgICAgICRsYXN0Q2hhciAhPT0gbnVsbCAmJgorICAgICAgICAgICAgICAgICRsYXN0Q2hhciAhPT0gc2VsZjo6RVNDU0VRKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoJGNoID09IHNlbGY6OkVTQ1NFUSAmJiAkbGFzdENoYXIgPT0gc2VsZjo6RVNDU0VRKSB7CisgICAgICAgICAgICAgICAgJGxhc3RDaGFyID0gc2VsZjo6RE9VQkxFRVNDOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAkbGFzdENoYXIgPSAkY2g7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4ganNvbl9kZWNvZGUoJGpzb25TdHJpbmcpOworICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gaXNKU09OTnVtZXJpYygkYikKKyAgICB7CisgICAgICAgIHN3aXRjaCAoJGIpIHsKKyAgICAgICAgICAgIGNhc2UgJysnOgorICAgICAgICAgICAgY2FzZSAnLSc6CisgICAgICAgICAgICBjYXNlICcuJzoKKyAgICAgICAgICAgIGNhc2UgJzAnOgorICAgICAgICAgICAgY2FzZSAnMSc6CisgICAgICAgICAgICBjYXNlICcyJzoKKyAgICAgICAgICAgIGNhc2UgJzMnOgorICAgICAgICAgICAgY2FzZSAnNCc6CisgICAgICAgICAgICBjYXNlICc1JzoKKyAgICAgICAgICAgIGNhc2UgJzYnOgorICAgICAgICAgICAgY2FzZSAnNyc6CisgICAgICAgICAgICBjYXNlICc4JzoKKyAgICAgICAgICAgIGNhc2UgJzknOgorICAgICAgICAgICAgY2FzZSAnRSc6CisgICAgICAgICAgICBjYXNlICdlJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIHJlYWRKU09OTnVtZXJpY0NoYXJzKCkKKyAgICB7CisgICAgICAgICRzdHJibGQgPSBhcnJheSgpOworCisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAkY2ggPSAkdGhpcy0+cmVhZGVyXy0+cGVlaygpOworCisgICAgICAgICAgICBpZiAoISR0aGlzLT5pc0pTT05OdW1lcmljKCRjaCkpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgJHN0cmJsZFtdID0gJHRoaXMtPnJlYWRlcl8tPnJlYWQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBpbXBsb2RlKCIiLCAkc3RyYmxkKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIHJlYWRKU09OSW50ZWdlcigpCisgICAgeworICAgICAgICAkdGhpcy0+Y29udGV4dF8tPnJlYWQoKTsKKworICAgICAgICBpZiAoJHRoaXMtPmNvbnRleHRfLT5lc2NhcGVOdW0oKSkgeworICAgICAgICAgICAgJHRoaXMtPnJlYWRKU09OU3ludGF4Q2hhcihzZWxmOjpRVU9URSk7CisgICAgICAgIH0KKworICAgICAgICAkc3RyID0gJHRoaXMtPnJlYWRKU09OTnVtZXJpY0NoYXJzKCk7CisKKyAgICAgICAgaWYgKCR0aGlzLT5jb250ZXh0Xy0+ZXNjYXBlTnVtKCkpIHsKKyAgICAgICAgICAgICR0aGlzLT5yZWFkSlNPTlN5bnRheENoYXIoc2VsZjo6UVVPVEUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFpc19udW1lcmljKCRzdHIpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCJJbnZhbGlkIGRhdGEgaW4gbnVtZXJpYzogIiAuICRzdHIsIFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBpbnR2YWwoJHN0cik7CisgICAgfQorCisgICAgLyoqCisgICAgICogSWRlbnRpY2FsIHRvIHJlYWRKU09OSW50ZWdlciBidXQgd2l0aG91dCB0aGUgZmluYWwgY2FzdC4KKyAgICAgKiBOZWVkZWQgZm9yIHByb3BlciBoYW5kbGluZyBvZiBpNjQgb24gMzIgYml0IG1hY2hpbmVzLiAgV2h5IGEKKyAgICAgKiBzZXBhcmF0ZSBmdW5jdGlvbj8gIFNvIHdlIGRvbid0IGhhdmUgdG8gZm9yY2UgdGhlIHJlc3Qgb2YgdGhlCisgICAgICogdXNlIGNhc2VzIHRocm91Z2ggdGhlIGV4dHJhIGNvbmRpdGlvbmFsLgorICAgICAqLworICAgIHByaXZhdGUgZnVuY3Rpb24gcmVhZEpTT05JbnRlZ2VyQXNTdHJpbmcoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmNvbnRleHRfLT5yZWFkKCk7CisKKyAgICAgICAgaWYgKCR0aGlzLT5jb250ZXh0Xy0+ZXNjYXBlTnVtKCkpIHsKKyAgICAgICAgICAgICR0aGlzLT5yZWFkSlNPTlN5bnRheENoYXIoc2VsZjo6UVVPVEUpOworICAgICAgICB9CisKKyAgICAgICAgJHN0ciA9ICR0aGlzLT5yZWFkSlNPTk51bWVyaWNDaGFycygpOworCisgICAgICAgIGlmICgkdGhpcy0+Y29udGV4dF8tPmVzY2FwZU51bSgpKSB7CisgICAgICAgICAgICAkdGhpcy0+cmVhZEpTT05TeW50YXhDaGFyKHNlbGY6OlFVT1RFKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghaXNfbnVtZXJpYygkc3RyKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigiSW52YWxpZCBkYXRhIGluIG51bWVyaWM6ICIgLiAkc3RyLCBUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gJHN0cjsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIHJlYWRKU09ORG91YmxlKCkKKyAgICB7CisgICAgICAgICR0aGlzLT5jb250ZXh0Xy0+cmVhZCgpOworCisgICAgICAgIGlmIChzdWJzdHIoJHRoaXMtPnJlYWRlcl8tPnBlZWsoKSwgMCwgMSkgPT0gc2VsZjo6UVVPVEUpIHsKKyAgICAgICAgICAgICRhcnIgPSAkdGhpcy0+cmVhZEpTT05TdHJpbmcodHJ1ZSk7CisKKyAgICAgICAgICAgIGlmICgkYXJyID09ICJOYU4iKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5BTjsKKyAgICAgICAgICAgIH0gZWxzZWlmICgkYXJyID09ICJJbmZpbml0eSIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gSU5GOworICAgICAgICAgICAgfSBlbHNlaWYgKCEkdGhpcy0+Y29udGV4dF8tPmVzY2FwZU51bSgpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIk51bWVyaWMgZGF0YSB1bmV4cGVjdGVkbHkgcXVvdGVkICIgLiAkYXJyLAorICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQQorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBmbG9hdHZhbCgkYXJyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICgkdGhpcy0+Y29udGV4dF8tPmVzY2FwZU51bSgpKSB7CisgICAgICAgICAgICAgICAgJHRoaXMtPnJlYWRKU09OU3ludGF4Q2hhcihzZWxmOjpRVU9URSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBmbG9hdHZhbCgkdGhpcy0+cmVhZEpTT05OdW1lcmljQ2hhcnMoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIHJlYWRKU09OQmFzZTY0KCkKKyAgICB7CisgICAgICAgICRhcnIgPSAkdGhpcy0+cmVhZEpTT05TdHJpbmcoZmFsc2UpOworICAgICAgICAkZGF0YSA9IGJhc2U2NF9kZWNvZGUoJGFyciwgdHJ1ZSk7CisKKyAgICAgICAgaWYgKCRkYXRhID09PSBmYWxzZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigiSW52YWxpZCBiYXNlNjQgZGF0YSAiIC4gJGFyciwgVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICRkYXRhOworICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gcmVhZEpTT05PYmplY3RTdGFydCgpCisgICAgeworICAgICAgICAkdGhpcy0+Y29udGV4dF8tPnJlYWQoKTsKKyAgICAgICAgJHRoaXMtPnJlYWRKU09OU3ludGF4Q2hhcihzZWxmOjpMQlJBQ0UpOworICAgICAgICAkdGhpcy0+cHVzaENvbnRleHQobmV3IFBhaXJDb250ZXh0KCR0aGlzKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiByZWFkSlNPTk9iamVjdEVuZCgpCisgICAgeworICAgICAgICAkdGhpcy0+cmVhZEpTT05TeW50YXhDaGFyKHNlbGY6OlJCUkFDRSk7CisgICAgICAgICR0aGlzLT5wb3BDb250ZXh0KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiByZWFkSlNPTkFycmF5U3RhcnQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmNvbnRleHRfLT5yZWFkKCk7CisgICAgICAgICR0aGlzLT5yZWFkSlNPTlN5bnRheENoYXIoc2VsZjo6TEJSQUNLRVQpOworICAgICAgICAkdGhpcy0+cHVzaENvbnRleHQobmV3IExpc3RDb250ZXh0KCR0aGlzKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiByZWFkSlNPTkFycmF5RW5kKCkKKyAgICB7CisgICAgICAgICR0aGlzLT5yZWFkSlNPTlN5bnRheENoYXIoc2VsZjo6UkJSQUNLRVQpOworICAgICAgICAkdGhpcy0+cG9wQ29udGV4dCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlcyB0aGUgbWVzc2FnZSBoZWFkZXIKKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgRnVuY3Rpb24gbmFtZQorICAgICAqIEBwYXJhbSBpbnQgJHR5cGUgbWVzc2FnZSB0eXBlIFRNZXNzYWdlVHlwZTo6Q0FMTCBvciBUTWVzc2FnZVR5cGU6OlJFUExZCisgICAgICogQHBhcmFtIGludCAkc2VxaWQgVGhlIHNlcXVlbmNlIGlkIG9mIHRoaXMgbWVzc2FnZQorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1lc3NhZ2VCZWdpbigkbmFtZSwgJHR5cGUsICRzZXFpZCkKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05BcnJheVN0YXJ0KCk7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05JbnRlZ2VyKHNlbGY6OlZFUlNJT04pOworICAgICAgICAkdGhpcy0+d3JpdGVKU09OU3RyaW5nKCRuYW1lKTsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTkludGVnZXIoJHR5cGUpOworICAgICAgICAkdGhpcy0+d3JpdGVKU09OSW50ZWdlcigkc2VxaWQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsb3NlIHRoZSBtZXNzYWdlCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWVzc2FnZUVuZCgpCisgICAgeworICAgICAgICAkdGhpcy0+d3JpdGVKU09OQXJyYXlFbmQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgYSBzdHJ1Y3QgaGVhZGVyLgorICAgICAqCisgICAgICogQHBhcmFtICBzdHJpbmcgJG5hbWUgU3RydWN0IG5hbWUKKyAgICAgKiBAdGhyb3dzIFRFeGNlcHRpb24gb24gd3JpdGUgZXJyb3IKKyAgICAgKiBAcmV0dXJuIGludCAgICAgICAgSG93IG1hbnkgYnl0ZXMgd3JpdHRlbgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cnVjdEJlZ2luKCRuYW1lKQorICAgIHsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTk9iamVjdFN0YXJ0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xvc2UgYSBzdHJ1Y3QuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFRFeGNlcHRpb24gb24gd3JpdGUgZXJyb3IKKyAgICAgKiBAcmV0dXJuIGludCAgICAgICAgSG93IG1hbnkgYnl0ZXMgd3JpdHRlbgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cnVjdEVuZCgpCisgICAgeworICAgICAgICAkdGhpcy0+d3JpdGVKU09OT2JqZWN0RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRCZWdpbigkZmllbGROYW1lLCAkZmllbGRUeXBlLCAkZmllbGRJZCkKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05JbnRlZ2VyKCRmaWVsZElkKTsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTk9iamVjdFN0YXJ0KCk7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05TdHJpbmcoJHRoaXMtPmdldFR5cGVOYW1lRm9yVHlwZUlEKCRmaWVsZFR5cGUpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZEVuZCgpCisgICAgeworICAgICAgICAkdGhpcy0+d3JpdGVKc29uT2JqZWN0RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRTdG9wKCkKKyAgICB7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWFwQmVnaW4oJGtleVR5cGUsICR2YWxUeXBlLCAkc2l6ZSkKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05BcnJheVN0YXJ0KCk7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05TdHJpbmcoJHRoaXMtPmdldFR5cGVOYW1lRm9yVHlwZUlEKCRrZXlUeXBlKSk7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05TdHJpbmcoJHRoaXMtPmdldFR5cGVOYW1lRm9yVHlwZUlEKCR2YWxUeXBlKSk7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05JbnRlZ2VyKCRzaXplKTsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTk9iamVjdFN0YXJ0KCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWFwRW5kKCkKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05PYmplY3RFbmQoKTsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTkFycmF5RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTGlzdEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpCisgICAgeworICAgICAgICAkdGhpcy0+d3JpdGVKU09OQXJyYXlTdGFydCgpOworICAgICAgICAkdGhpcy0+d3JpdGVKU09OU3RyaW5nKCR0aGlzLT5nZXRUeXBlTmFtZUZvclR5cGVJRCgkZWxlbVR5cGUpKTsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTkludGVnZXIoJHNpemUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUxpc3RFbmQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTkFycmF5RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU2V0QmVnaW4oJGVsZW1UeXBlLCAkc2l6ZSkKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05BcnJheVN0YXJ0KCk7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05TdHJpbmcoJHRoaXMtPmdldFR5cGVOYW1lRm9yVHlwZUlEKCRlbGVtVHlwZSkpOworICAgICAgICAkdGhpcy0+d3JpdGVKU09OSW50ZWdlcigkc2l6ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU2V0RW5kKCkKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05BcnJheUVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUJvb2woJGJvb2wpCisgICAgeworICAgICAgICAkdGhpcy0+d3JpdGVKU09OSW50ZWdlcigkYm9vbCA/IDEgOiAwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVCeXRlKCRieXRlKQorICAgIHsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTkludGVnZXIoJGJ5dGUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUkxNigkaTE2KQorICAgIHsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTkludGVnZXIoJGkxNik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTMyKCRpMzIpCisgICAgeworICAgICAgICAkdGhpcy0+d3JpdGVKU09OSW50ZWdlcigkaTMyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJNjQoJGk2NCkKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05JbnRlZ2VyKCRpNjQpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZURvdWJsZSgkZHViKQorICAgIHsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTkRvdWJsZSgkZHViKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJpbmcoJHN0cikKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05TdHJpbmcoJHN0cik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZHMgdGhlIG1lc3NhZ2UgaGVhZGVyCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lIEZ1bmN0aW9uIG5hbWUKKyAgICAgKiBAcGFyYW0gaW50ICR0eXBlIG1lc3NhZ2UgdHlwZSBUTWVzc2FnZVR5cGU6OkNBTEwgb3IgVE1lc3NhZ2VUeXBlOjpSRVBMWQorICAgICAqIEBwYXJlbSBpbnQgJHNlcWlkIFRoZSBzZXF1ZW5jZSBpZCBvZiB0aGlzIG1lc3NhZ2UKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1lc3NhZ2VCZWdpbigmJG5hbWUsICYkdHlwZSwgJiRzZXFpZCkKKyAgICB7CisgICAgICAgICR0aGlzLT5yZWFkSlNPTkFycmF5U3RhcnQoKTsKKworICAgICAgICBpZiAoJHRoaXMtPnJlYWRKU09OSW50ZWdlcigpICE9IHNlbGY6OlZFUlNJT04pIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oIk1lc3NhZ2UgY29udGFpbmVkIGJhZCB2ZXJzaW9uIiwgVFByb3RvY29sRXhjZXB0aW9uOjpCQURfVkVSU0lPTik7CisgICAgICAgIH0KKworICAgICAgICAkbmFtZSA9ICR0aGlzLT5yZWFkSlNPTlN0cmluZyhmYWxzZSk7CisgICAgICAgICR0eXBlID0gJHRoaXMtPnJlYWRKU09OSW50ZWdlcigpOworICAgICAgICAkc2VxaWQgPSAkdGhpcy0+cmVhZEpTT05JbnRlZ2VyKCk7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZCB0aGUgY2xvc2Ugb2YgbWVzc2FnZQorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWVzc2FnZUVuZCgpCisgICAgeworICAgICAgICAkdGhpcy0+cmVhZEpTT05BcnJheUVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RydWN0QmVnaW4oJiRuYW1lKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnJlYWRKU09OT2JqZWN0U3RhcnQoKTsKKworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cnVjdEVuZCgpCisgICAgeworICAgICAgICAkdGhpcy0+cmVhZEpTT05PYmplY3RFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEZpZWxkQmVnaW4oJiRuYW1lLCAmJGZpZWxkVHlwZSwgJiRmaWVsZElkKQorICAgIHsKKyAgICAgICAgJGNoID0gJHRoaXMtPnJlYWRlcl8tPnBlZWsoKTsKKyAgICAgICAgJG5hbWUgPSAiIjsKKworICAgICAgICBpZiAoc3Vic3RyKCRjaCwgMCwgMSkgPT0gc2VsZjo6UkJSQUNFKSB7CisgICAgICAgICAgICAkZmllbGRUeXBlID0gVFR5cGU6OlNUT1A7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkZmllbGRJZCA9ICR0aGlzLT5yZWFkSlNPTkludGVnZXIoKTsKKyAgICAgICAgICAgICR0aGlzLT5yZWFkSlNPTk9iamVjdFN0YXJ0KCk7CisgICAgICAgICAgICAkZmllbGRUeXBlID0gJHRoaXMtPmdldFR5cGVJREZvclR5cGVOYW1lKCR0aGlzLT5yZWFkSlNPTlN0cmluZyhmYWxzZSkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRGaWVsZEVuZCgpCisgICAgeworICAgICAgICAkdGhpcy0+cmVhZEpTT05PYmplY3RFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1hcEJlZ2luKCYka2V5VHlwZSwgJiR2YWxUeXBlLCAmJHNpemUpCisgICAgeworICAgICAgICAkdGhpcy0+cmVhZEpTT05BcnJheVN0YXJ0KCk7CisgICAgICAgICRrZXlUeXBlID0gJHRoaXMtPmdldFR5cGVJREZvclR5cGVOYW1lKCR0aGlzLT5yZWFkSlNPTlN0cmluZyhmYWxzZSkpOworICAgICAgICAkdmFsVHlwZSA9ICR0aGlzLT5nZXRUeXBlSURGb3JUeXBlTmFtZSgkdGhpcy0+cmVhZEpTT05TdHJpbmcoZmFsc2UpKTsKKyAgICAgICAgJHNpemUgPSAkdGhpcy0+cmVhZEpTT05JbnRlZ2VyKCk7CisgICAgICAgICR0aGlzLT5yZWFkSlNPTk9iamVjdFN0YXJ0KCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNYXBFbmQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnJlYWRKU09OT2JqZWN0RW5kKCk7CisgICAgICAgICR0aGlzLT5yZWFkSlNPTkFycmF5RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRMaXN0QmVnaW4oJiRlbGVtVHlwZSwgJiRzaXplKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnJlYWRKU09OQXJyYXlTdGFydCgpOworICAgICAgICAkZWxlbVR5cGUgPSAkdGhpcy0+Z2V0VHlwZUlERm9yVHlwZU5hbWUoJHRoaXMtPnJlYWRKU09OU3RyaW5nKGZhbHNlKSk7CisgICAgICAgICRzaXplID0gJHRoaXMtPnJlYWRKU09OSW50ZWdlcigpOworCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTGlzdEVuZCgpCisgICAgeworICAgICAgICAkdGhpcy0+cmVhZEpTT05BcnJheUVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU2V0QmVnaW4oJiRlbGVtVHlwZSwgJiRzaXplKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnJlYWRKU09OQXJyYXlTdGFydCgpOworICAgICAgICAkZWxlbVR5cGUgPSAkdGhpcy0+Z2V0VHlwZUlERm9yVHlwZU5hbWUoJHRoaXMtPnJlYWRKU09OU3RyaW5nKGZhbHNlKSk7CisgICAgICAgICRzaXplID0gJHRoaXMtPnJlYWRKU09OSW50ZWdlcigpOworCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU2V0RW5kKCkKKyAgICB7CisgICAgICAgICR0aGlzLT5yZWFkSlNPTkFycmF5RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRCb29sKCYkYm9vbCkKKyAgICB7CisgICAgICAgICRib29sID0gJHRoaXMtPnJlYWRKU09OSW50ZWdlcigpID09IDAgPyBmYWxzZSA6IHRydWU7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRCeXRlKCYkYnl0ZSkKKyAgICB7CisgICAgICAgICRieXRlID0gJHRoaXMtPnJlYWRKU09OSW50ZWdlcigpOworCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkSTE2KCYkaTE2KQorICAgIHsKKyAgICAgICAgJGkxNiA9ICR0aGlzLT5yZWFkSlNPTkludGVnZXIoKTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEkzMigmJGkzMikKKyAgICB7CisgICAgICAgICRpMzIgPSAkdGhpcy0+cmVhZEpTT05JbnRlZ2VyKCk7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRJNjQoJiRpNjQpCisgICAgeworICAgICAgICBpZiAoUEhQX0lOVF9TSVpFID09PSA0KSB7CisgICAgICAgICAgICAkaTY0ID0gJHRoaXMtPnJlYWRKU09OSW50ZWdlckFzU3RyaW5nKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkaTY0ID0gJHRoaXMtPnJlYWRKU09OSW50ZWdlcigpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWREb3VibGUoJiRkdWIpCisgICAgeworICAgICAgICAkZHViID0gJHRoaXMtPnJlYWRKU09ORG91YmxlKCk7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJpbmcoJiRzdHIpCisgICAgeworICAgICAgICAkc3RyID0gJHRoaXMtPnJlYWRKU09OU3RyaW5nKGZhbHNlKTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9Qcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5waHAgYi9saWIvcGhwL2xpYi9Qcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU3OWMwOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLnBocApAQCAtMCwwICsxLDg1IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFByb3RvY29sOworCit1c2UgVGhyaWZ0XFR5cGVcVE1lc3NhZ2VUeXBlOworCisvKioKKyAqIDxjb2RlPlRNdWx0aXBsZXhlZFByb3RvY29sPC9jb2RlPiBpcyBhIHByb3RvY29sLWluZGVwZW5kZW50IGNvbmNyZXRlIGRlY29yYXRvcgorICogdGhhdCBhbGxvd3MgYSBUaHJpZnQgY2xpZW50IHRvIGNvbW11bmljYXRlIHdpdGggYSBtdWx0aXBsZXhpbmcgVGhyaWZ0IHNlcnZlciwKKyAqIGJ5IHByZXBlbmRpbmcgdGhlIHNlcnZpY2UgbmFtZSB0byB0aGUgZnVuY3Rpb24gbmFtZSBkdXJpbmcgZnVuY3Rpb24gY2FsbHMuCisgKgorICogQHBhY2thZ2UgVGhyaWZ0XFByb3RvY29sCisgKi8KK2NsYXNzIFRNdWx0aXBsZXhlZFByb3RvY29sIGV4dGVuZHMgVFByb3RvY29sRGVjb3JhdG9yCit7CisgICAgLyoqCisgICAgICogU2VwYXJhdG9yIGJldHdlZW4gc2VydmljZSBuYW1lIGFuZCBmdW5jdGlvbiBuYW1lLgorICAgICAqIFNob3VsZCBiZSB0aGUgc2FtZSBhcyB1c2VkIGF0IG11bHRpcGxleGVkIFRocmlmdCBzZXJ2ZXIuCisgICAgICoKKyAgICAgKiBAdmFyIHN0cmluZworICAgICAqLworICAgIGNvbnN0IFNFUEFSQVRPUiA9ICI6IjsKKworICAgIC8qKgorICAgICAqIFRoZSBuYW1lIG9mIHNlcnZpY2UuCisgICAgICoKKyAgICAgKiBAdmFyIHN0cmluZworICAgICAqLworICAgIHByaXZhdGUgJHNlcnZpY2VOYW1lXzsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIG9mIDxjb2RlPlRNdWx0aXBsZXhlZFByb3RvY29sPC9jb2RlPiBjbGFzcy4KKyAgICAgKgorICAgICAqIFdyYXAgdGhlIHNwZWNpZmllZCBwcm90b2NvbCwgYWxsb3dpbmcgaXQgdG8gYmUgdXNlZCB0byBjb21tdW5pY2F0ZSB3aXRoIGEKKyAgICAgKiBtdWx0aXBsZXhpbmcgc2VydmVyLiAgVGhlIDxjb2RlPiRzZXJ2aWNlTmFtZTwvY29kZT4gaXMgcmVxdWlyZWQgYXMgaXQgaXMKKyAgICAgKiBwcmVwZW5kZWQgdG8gdGhlIG1lc3NhZ2UgaGVhZGVyIHNvIHRoYXQgdGhlIG11bHRpcGxleGluZyBzZXJ2ZXIgY2FuIGJyb2tlcgorICAgICAqIHRoZSBmdW5jdGlvbiBjYWxsIHRvIHRoZSBwcm9wZXIgc2VydmljZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBUUHJvdG9jb2wgJHByb3RvY29sCisgICAgICogQHBhcmFtIHN0cmluZyAgICAkc2VydmljZU5hbWUgVGhlIG5hbWUgb2Ygc2VydmljZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoVFByb3RvY29sICRwcm90b2NvbCwgJHNlcnZpY2VOYW1lKQorICAgIHsKKyAgICAgICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkcHJvdG9jb2wpOworICAgICAgICAkdGhpcy0+c2VydmljZU5hbWVfID0gJHNlcnZpY2VOYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlcyB0aGUgbWVzc2FnZSBoZWFkZXIuCisgICAgICogUHJlcGVuZHMgdGhlIHNlcnZpY2UgbmFtZSB0byB0aGUgZnVuY3Rpb24gbmFtZSwgc2VwYXJhdGVkIGJ5IDxjb2RlPlRNdWx0aXBsZXhlZFByb3RvY29sOjpTRVBBUkFUT1I8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAkbmFtZSAgRnVuY3Rpb24gbmFtZS4KKyAgICAgKiBAcGFyYW0gaW50ICAgICR0eXBlICBNZXNzYWdlIHR5cGUuCisgICAgICogQHBhcmFtIGludCAgICAkc2VxaWQgVGhlIHNlcXVlbmNlIGlkIG9mIHRoaXMgbWVzc2FnZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNZXNzYWdlQmVnaW4oJG5hbWUsICR0eXBlLCAkc2VxaWQpCisgICAgeworICAgICAgICBpZiAoJHR5cGUgPT0gVE1lc3NhZ2VUeXBlOjpDQUxMIHx8ICR0eXBlID09IFRNZXNzYWdlVHlwZTo6T05FV0FZKSB7CisgICAgICAgICAgICAkbmFtZVdpdGhTZXJ2aWNlID0gJHRoaXMtPnNlcnZpY2VOYW1lXyAuIHNlbGY6OlNFUEFSQVRPUiAuICRuYW1lOworICAgICAgICAgICAgcGFyZW50Ojp3cml0ZU1lc3NhZ2VCZWdpbigkbmFtZVdpdGhTZXJ2aWNlLCAkdHlwZSwgJHNlcWlkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBhcmVudDo6d3JpdGVNZXNzYWdlQmVnaW4oJG5hbWUsICR0eXBlLCAkc2VxaWQpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvUHJvdG9jb2wvVFByb3RvY29sLnBocCBiL2xpYi9waHAvbGliL1Byb3RvY29sL1RQcm90b2NvbC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFhY2ViNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1Byb3RvY29sL1RQcm90b2NvbC5waHAKQEAgLTAsMCArMSwzNTAgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcUHJvdG9jb2w7CisKK3VzZSBUaHJpZnRcVHlwZVxUVHlwZTsKK3VzZSBUaHJpZnRcRXhjZXB0aW9uXFRQcm90b2NvbEV4Y2VwdGlvbjsKKworLyoqCisgKiBQcm90b2NvbCBiYXNlIGNsYXNzIG1vZHVsZS4KKyAqLworYWJzdHJhY3QgY2xhc3MgVFByb3RvY29sCit7CisgICAgLyoqCisgICAgICogVW5kZXJseWluZyB0cmFuc3BvcnQKKyAgICAgKgorICAgICAqIEB2YXIgVFRyYW5zcG9ydAorICAgICAqLworICAgIHByb3RlY3RlZCAkdHJhbnNfOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHRyYW5zKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zXyA9ICR0cmFuczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBY2Nlc3NvciBmb3IgdHJhbnNwb3J0CisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRUcmFuc3BvcnQKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0VHJhbnNwb3J0KCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+dHJhbnNfOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlcyB0aGUgbWVzc2FnZSBoZWFkZXIKKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgRnVuY3Rpb24gbmFtZQorICAgICAqIEBwYXJhbSBpbnQgJHR5cGUgbWVzc2FnZSB0eXBlIFRNZXNzYWdlVHlwZTo6Q0FMTCBvciBUTWVzc2FnZVR5cGU6OlJFUExZCisgICAgICogQHBhcmFtIGludCAkc2VxaWQgVGhlIHNlcXVlbmNlIGlkIG9mIHRoaXMgbWVzc2FnZQorICAgICAqLworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1lc3NhZ2VCZWdpbigkbmFtZSwgJHR5cGUsICRzZXFpZCk7CisKKyAgICAvKioKKyAgICAgKiBDbG9zZSB0aGUgbWVzc2FnZQorICAgICAqLworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1lc3NhZ2VFbmQoKTsKKworICAgIC8qKgorICAgICAqIFdyaXRlcyBhIHN0cnVjdCBoZWFkZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lIFN0cnVjdCBuYW1lCisgICAgICogQHRocm93cyBURXhjZXB0aW9uIG9uIHdyaXRlIGVycm9yCisgICAgICogQHJldHVybiBpbnQgSG93IG1hbnkgYnl0ZXMgd3JpdHRlbgorICAgICAqLworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cnVjdEJlZ2luKCRuYW1lKTsKKworICAgIC8qKgorICAgICAqIENsb3NlIGEgc3RydWN0LgorICAgICAqCisgICAgICogQHRocm93cyBURXhjZXB0aW9uIG9uIHdyaXRlIGVycm9yCisgICAgICogQHJldHVybiBpbnQgSG93IG1hbnkgYnl0ZXMgd3JpdHRlbgorICAgICAqLworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cnVjdEVuZCgpOworCisgICAgLyoKKyAgICAgKiBTdGFydHMgYSBmaWVsZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJpbmcgICAgICRuYW1lIEZpZWxkIG5hbWUKKyAgICAgKiBAcGFyYW0gaW50ICAgICAgICAkdHlwZSBGaWVsZCB0eXBlCisgICAgICogQHBhcmFtIGludCAgICAgICAgJGZpZCAgRmllbGQgaWQKKyAgICAgKiBAdGhyb3dzIFRFeGNlcHRpb24gb24gd3JpdGUgZXJyb3IKKyAgICAgKiBAcmV0dXJuIGludCBIb3cgbWFueSBieXRlcyB3cml0dGVuCisgICAgICovCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRCZWdpbigkZmllbGROYW1lLCAkZmllbGRUeXBlLCAkZmllbGRJZCk7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZEVuZCgpOworCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRTdG9wKCk7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNYXBCZWdpbigka2V5VHlwZSwgJHZhbFR5cGUsICRzaXplKTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1hcEVuZCgpOworCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHdyaXRlTGlzdEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpOworCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHdyaXRlTGlzdEVuZCgpOworCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHdyaXRlU2V0QmVnaW4oJGVsZW1UeXBlLCAkc2l6ZSk7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTZXRFbmQoKTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZUJvb2woJGJvb2wpOworCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHdyaXRlQnl0ZSgkYnl0ZSk7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJMTYoJGkxNik7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJMzIoJGkzMik7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJNjQoJGk2NCk7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gd3JpdGVEb3VibGUoJGR1Yik7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJpbmcoJHN0cik7CisKKyAgICAvKioKKyAgICAgKiBSZWFkcyB0aGUgbWVzc2FnZSBoZWFkZXIKKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgRnVuY3Rpb24gbmFtZQorICAgICAqIEBwYXJhbSBpbnQgJHR5cGUgbWVzc2FnZSB0eXBlIFRNZXNzYWdlVHlwZTo6Q0FMTCBvciBUTWVzc2FnZVR5cGU6OlJFUExZCisgICAgICogQHBhcmVtIGludCAkc2VxaWQgVGhlIHNlcXVlbmNlIGlkIG9mIHRoaXMgbWVzc2FnZQorICAgICAqLworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkTWVzc2FnZUJlZ2luKCYkbmFtZSwgJiR0eXBlLCAmJHNlcWlkKTsKKworICAgIC8qKgorICAgICAqIFJlYWQgdGhlIGNsb3NlIG9mIG1lc3NhZ2UKKyAgICAgKi8KKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVhZE1lc3NhZ2VFbmQoKTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkU3RydWN0QmVnaW4oJiRuYW1lKTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkU3RydWN0RW5kKCk7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVhZEZpZWxkQmVnaW4oJiRuYW1lLCAmJGZpZWxkVHlwZSwgJiRmaWVsZElkKTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkRmllbGRFbmQoKTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkTWFwQmVnaW4oJiRrZXlUeXBlLCAmJHZhbFR5cGUsICYkc2l6ZSk7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVhZE1hcEVuZCgpOworCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHJlYWRMaXN0QmVnaW4oJiRlbGVtVHlwZSwgJiRzaXplKTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkTGlzdEVuZCgpOworCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHJlYWRTZXRCZWdpbigmJGVsZW1UeXBlLCAmJHNpemUpOworCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHJlYWRTZXRFbmQoKTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkQm9vbCgmJGJvb2wpOworCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHJlYWRCeXRlKCYkYnl0ZSk7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVhZEkxNigmJGkxNik7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVhZEkzMigmJGkzMik7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVhZEk2NCgmJGk2NCk7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVhZERvdWJsZSgmJGR1Yik7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cmluZygmJHN0cik7CisKKyAgICAvKioKKyAgICAgKiBUaGUgc2tpcCBmdW5jdGlvbiBpcyBhIHV0aWxpdHkgdG8gcGFyc2Ugb3ZlciB1bnJlY29nbml6ZWQgZGF0ZSB3aXRob3V0CisgICAgICogY2F1c2luZyBjb3JydXB0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIFRUeXBlICR0eXBlIFdoYXQgdHlwZSBpcyBpdAorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBza2lwKCR0eXBlKQorICAgIHsKKyAgICAgICAgc3dpdGNoICgkdHlwZSkgeworICAgICAgICAgICAgY2FzZSBUVHlwZTo6Qk9PTDoKKyAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnJlYWRCb29sKCRib29sKTsKKyAgICAgICAgICAgIGNhc2UgVFR5cGU6OkJZVEU6CisgICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5yZWFkQnl0ZSgkYnl0ZSk7CisgICAgICAgICAgICBjYXNlIFRUeXBlOjpJMTY6CisgICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5yZWFkSTE2KCRpMTYpOworICAgICAgICAgICAgY2FzZSBUVHlwZTo6STMyOgorICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+cmVhZEkzMigkaTMyKTsKKyAgICAgICAgICAgIGNhc2UgVFR5cGU6Okk2NDoKKyAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnJlYWRJNjQoJGk2NCk7CisgICAgICAgICAgICBjYXNlIFRUeXBlOjpET1VCTEU6CisgICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5yZWFkRG91YmxlKCRkdWIpOworICAgICAgICAgICAgY2FzZSBUVHlwZTo6U1RSSU5HOgorICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+cmVhZFN0cmluZygkc3RyKTsKKyAgICAgICAgICAgIGNhc2UgVFR5cGU6OlNUUlVDVDoKKyAgICAgICAgICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPnJlYWRTdHJ1Y3RCZWdpbigkbmFtZSk7CisgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCArPSAkdGhpcy0+cmVhZEZpZWxkQmVnaW4oJG5hbWUsICRmdHlwZSwgJGZpZCk7CisgICAgICAgICAgICAgICAgICAgIGlmICgkZnR5cGUgPT0gVFR5cGU6OlNUT1ApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICRyZXN1bHQgKz0gJHRoaXMtPnNraXAoJGZ0eXBlKTsKKyAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCArPSAkdGhpcy0+cmVhZEZpZWxkRW5kKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICRyZXN1bHQgKz0gJHRoaXMtPnJlYWRTdHJ1Y3RFbmQoKTsKKworICAgICAgICAgICAgICAgIHJldHVybiAkcmVzdWx0OworCisgICAgICAgICAgICBjYXNlIFRUeXBlOjpNQVA6CisgICAgICAgICAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5yZWFkTWFwQmVnaW4oJGtleVR5cGUsICR2YWxUeXBlLCAkc2l6ZSk7CisgICAgICAgICAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgJHNpemU7ICRpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCArPSAkdGhpcy0+c2tpcCgka2V5VHlwZSk7CisgICAgICAgICAgICAgICAgICAgICRyZXN1bHQgKz0gJHRoaXMtPnNraXAoJHZhbFR5cGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAkcmVzdWx0ICs9ICR0aGlzLT5yZWFkTWFwRW5kKCk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gJHJlc3VsdDsKKworICAgICAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgorICAgICAgICAgICAgICAgICRyZXN1bHQgPSAkdGhpcy0+cmVhZFNldEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpOworICAgICAgICAgICAgICAgIGZvciAoJGkgPSAwOyAkaSA8ICRzaXplOyAkaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICRyZXN1bHQgKz0gJHRoaXMtPnNraXAoJGVsZW1UeXBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgJHJlc3VsdCArPSAkdGhpcy0+cmVhZFNldEVuZCgpOworCisgICAgICAgICAgICAgICAgcmV0dXJuICRyZXN1bHQ7CisKKyAgICAgICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKKyAgICAgICAgICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPnJlYWRMaXN0QmVnaW4oJGVsZW1UeXBlLCAkc2l6ZSk7CisgICAgICAgICAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgJHNpemU7ICRpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCArPSAkdGhpcy0+c2tpcCgkZWxlbVR5cGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAkcmVzdWx0ICs9ICR0aGlzLT5yZWFkTGlzdEVuZCgpOworCisgICAgICAgICAgICAgICAgcmV0dXJuICRyZXN1bHQ7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgJ1Vua25vd24gZmllbGQgdHlwZTogJyAuICR0eXBlLAorICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQQorICAgICAgICAgICAgICAgICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVdGlsaXR5IGZvciBza2lwcGluZyBiaW5hcnkgZGF0YQorICAgICAqCisgICAgICogQHBhcmFtIFRUcmFuc3BvcnQgJGl0cmFucyBUVHJhbnNwb3J0IG9iamVjdAorICAgICAqIEBwYXJhbSBpbnQgJHR5cGUgRmllbGQgdHlwZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc2tpcEJpbmFyeSgkaXRyYW5zLCAkdHlwZSkKKyAgICB7CisgICAgICAgIHN3aXRjaCAoJHR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgVFR5cGU6OkJPT0w6CisgICAgICAgICAgICAgICAgcmV0dXJuICRpdHJhbnMtPnJlYWRBbGwoMSk7CisgICAgICAgICAgICBjYXNlIFRUeXBlOjpCWVRFOgorICAgICAgICAgICAgICAgIHJldHVybiAkaXRyYW5zLT5yZWFkQWxsKDEpOworICAgICAgICAgICAgY2FzZSBUVHlwZTo6STE2OgorICAgICAgICAgICAgICAgIHJldHVybiAkaXRyYW5zLT5yZWFkQWxsKDIpOworICAgICAgICAgICAgY2FzZSBUVHlwZTo6STMyOgorICAgICAgICAgICAgICAgIHJldHVybiAkaXRyYW5zLT5yZWFkQWxsKDQpOworICAgICAgICAgICAgY2FzZSBUVHlwZTo6STY0OgorICAgICAgICAgICAgICAgIHJldHVybiAkaXRyYW5zLT5yZWFkQWxsKDgpOworICAgICAgICAgICAgY2FzZSBUVHlwZTo6RE9VQkxFOgorICAgICAgICAgICAgICAgIHJldHVybiAkaXRyYW5zLT5yZWFkQWxsKDgpOworICAgICAgICAgICAgY2FzZSBUVHlwZTo6U1RSSU5HOgorICAgICAgICAgICAgICAgICRsZW4gPSB1bnBhY2soJ04nLCAkaXRyYW5zLT5yZWFkQWxsKDQpKTsKKyAgICAgICAgICAgICAgICAkbGVuID0gJGxlblsxXTsKKyAgICAgICAgICAgICAgICBpZiAoJGxlbiA+IDB4N2ZmZmZmZmYpIHsKKyAgICAgICAgICAgICAgICAgICAgJGxlbiA9IDAgLSAoKCRsZW4gLSAxKSBeIDB4ZmZmZmZmZmYpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiA0ICsgJGl0cmFucy0+cmVhZEFsbCgkbGVuKTsKKworICAgICAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgorICAgICAgICAgICAgICAgICRyZXN1bHQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAgICAgICAgICRmdHlwZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICRmaWQgPSAwOworICAgICAgICAgICAgICAgICAgICAkZGF0YSA9ICRpdHJhbnMtPnJlYWRBbGwoMSk7CisgICAgICAgICAgICAgICAgICAgICRhcnIgPSB1bnBhY2soJ2MnLCAkZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICRmdHlwZSA9ICRhcnJbMV07CisgICAgICAgICAgICAgICAgICAgIGlmICgkZnR5cGUgPT0gVFR5cGU6OlNUT1ApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIEkxNiBmaWVsZCBpZAorICAgICAgICAgICAgICAgICAgICAkcmVzdWx0ICs9ICRpdHJhbnMtPnJlYWRBbGwoMik7CisgICAgICAgICAgICAgICAgICAgICRyZXN1bHQgKz0gc2VsZjo6c2tpcEJpbmFyeSgkaXRyYW5zLCAkZnR5cGUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiAkcmVzdWx0OworCisgICAgICAgICAgICBjYXNlIFRUeXBlOjpNQVA6CisgICAgICAgICAgICAgICAgLy8gS3R5cGUKKyAgICAgICAgICAgICAgICAkZGF0YSA9ICRpdHJhbnMtPnJlYWRBbGwoMSk7CisgICAgICAgICAgICAgICAgJGFyciA9IHVucGFjaygnYycsICRkYXRhKTsKKyAgICAgICAgICAgICAgICAka3R5cGUgPSAkYXJyWzFdOworICAgICAgICAgICAgICAgIC8vIFZ0eXBlCisgICAgICAgICAgICAgICAgJGRhdGEgPSAkaXRyYW5zLT5yZWFkQWxsKDEpOworICAgICAgICAgICAgICAgICRhcnIgPSB1bnBhY2soJ2MnLCAkZGF0YSk7CisgICAgICAgICAgICAgICAgJHZ0eXBlID0gJGFyclsxXTsKKyAgICAgICAgICAgICAgICAvLyBTaXplCisgICAgICAgICAgICAgICAgJGRhdGEgPSAkaXRyYW5zLT5yZWFkQWxsKDQpOworICAgICAgICAgICAgICAgICRhcnIgPSB1bnBhY2soJ04nLCAkZGF0YSk7CisgICAgICAgICAgICAgICAgJHNpemUgPSAkYXJyWzFdOworICAgICAgICAgICAgICAgIGlmICgkc2l6ZSA+IDB4N2ZmZmZmZmYpIHsKKyAgICAgICAgICAgICAgICAgICAgJHNpemUgPSAwIC0gKCgkc2l6ZSAtIDEpIF4gMHhmZmZmZmZmZik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICRyZXN1bHQgPSA2OworICAgICAgICAgICAgICAgIGZvciAoJGkgPSAwOyAkaSA8ICRzaXplOyAkaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICRyZXN1bHQgKz0gc2VsZjo6c2tpcEJpbmFyeSgkaXRyYW5zLCAka3R5cGUpOworICAgICAgICAgICAgICAgICAgICAkcmVzdWx0ICs9IHNlbGY6OnNraXBCaW5hcnkoJGl0cmFucywgJHZ0eXBlKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gJHJlc3VsdDsKKworICAgICAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgorICAgICAgICAgICAgY2FzZSBUVHlwZTo6TFNUOgorICAgICAgICAgICAgICAgIC8vIFZ0eXBlCisgICAgICAgICAgICAgICAgJGRhdGEgPSAkaXRyYW5zLT5yZWFkQWxsKDEpOworICAgICAgICAgICAgICAgICRhcnIgPSB1bnBhY2soJ2MnLCAkZGF0YSk7CisgICAgICAgICAgICAgICAgJHZ0eXBlID0gJGFyclsxXTsKKyAgICAgICAgICAgICAgICAvLyBTaXplCisgICAgICAgICAgICAgICAgJGRhdGEgPSAkaXRyYW5zLT5yZWFkQWxsKDQpOworICAgICAgICAgICAgICAgICRhcnIgPSB1bnBhY2soJ04nLCAkZGF0YSk7CisgICAgICAgICAgICAgICAgJHNpemUgPSAkYXJyWzFdOworICAgICAgICAgICAgICAgIGlmICgkc2l6ZSA+IDB4N2ZmZmZmZmYpIHsKKyAgICAgICAgICAgICAgICAgICAgJHNpemUgPSAwIC0gKCgkc2l6ZSAtIDEpIF4gMHhmZmZmZmZmZik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICRyZXN1bHQgPSA1OworICAgICAgICAgICAgICAgIGZvciAoJGkgPSAwOyAkaSA8ICRzaXplOyAkaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICRyZXN1bHQgKz0gc2VsZjo6c2tpcEJpbmFyeSgkaXRyYW5zLCAkdnR5cGUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiAkcmVzdWx0OworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICdVbmtub3duIGZpZWxkIHR5cGU6ICcgLiAkdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEKKyAgICAgICAgICAgICAgICApOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvUHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLnBocCBiL2xpYi9waHAvbGliL1Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg1ZTBiOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5waHAKQEAgLTAsMCArMSwyODUgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcUHJvdG9jb2w7CisKK3VzZSBUaHJpZnRcRXhjZXB0aW9uXFRFeGNlcHRpb247CisKKy8qKgorICogPGNvZGU+VFByb3RvY29sRGVjb3JhdG9yPC9jb2RlPiBmb3J3YXJkcyBhbGwgcmVxdWVzdHMgdG8gYW4gZW5jbG9zZWQKKyAqIDxjb2RlPlRQcm90b2NvbDwvY29kZT4gaW5zdGFuY2UsIHByb3ZpZGluZyBhIHdheSB0byBhdXRob3IgY29uY2lzZQorICogY29uY3JldGUgZGVjb3JhdG9yIHN1YmNsYXNzZXMuIFdoaWxlIGl0IGhhcyBubyBhYnN0cmFjdCBtZXRob2RzLCBpdAorICogaXMgbWFya2VkIGFic3RyYWN0IGFzIGEgcmVtaW5kZXIgdGhhdCBieSBpdHNlbGYsIGl0IGRvZXMgbm90IG1vZGlmeQorICogdGhlIGJlaGF2aW91ciBvZiB0aGUgZW5jbG9zZWQgPGNvZGU+VFByb3RvY29sPC9jb2RlPi4KKyAqCisgKiBAcGFja2FnZSBUaHJpZnRcUHJvdG9jb2wKKyAqLworYWJzdHJhY3QgY2xhc3MgVFByb3RvY29sRGVjb3JhdG9yIGV4dGVuZHMgVFByb3RvY29sCit7CisgICAgLyoqCisgICAgICogSW5zdGFuY2Ugb2YgcHJvdG9jb2wsIHRvIHdoaWNoIGFsbCBvcGVyYXRpb25zIHdpbGwgYmUgZm9yd2FyZGVkLgorICAgICAqCisgICAgICogQHZhciBUUHJvdG9jb2wKKyAgICAgKi8KKyAgICBwcml2YXRlICRjb25jcmV0ZVByb3RvY29sXzsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIG9mIDxjb2RlPlRQcm90b2NvbERlY29yYXRvcjwvY29kZT4gY2xhc3MuCisgICAgICogRW5jbG9zZXMgdGhlIHNwZWNpZmllZCBwcm90b2NvbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBUUHJvdG9jb2wgJHByb3RvY29sIEFsbCBvcGVyYXRpb25zIHdpbGwgYmUgZm9yd2FyZCB0byB0aGlzIGluc3RhbmNlLiBNdXN0IGJlIG5vbi1udWxsLgorICAgICAqLworICAgIHByb3RlY3RlZCBmdW5jdGlvbiBfX2NvbnN0cnVjdChUUHJvdG9jb2wgJHByb3RvY29sKQorICAgIHsKKyAgICAgICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkcHJvdG9jb2wtPmdldFRyYW5zcG9ydCgpKTsKKyAgICAgICAgJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfID0gJHByb3RvY29sOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlcyB0aGUgbWVzc2FnZSBoZWFkZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lICBGdW5jdGlvbiBuYW1lCisgICAgICogQHBhcmFtIGludCAgICAkdHlwZSAgbWVzc2FnZSB0eXBlIFRNZXNzYWdlVHlwZTo6Q0FMTCBvciBUTWVzc2FnZVR5cGU6OlJFUExZCisgICAgICogQHBhcmFtIGludCAgICAkc2VxaWQgVGhlIHNlcXVlbmNlIGlkIG9mIHRoaXMgbWVzc2FnZQorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1lc3NhZ2VCZWdpbigkbmFtZSwgJHR5cGUsICRzZXFpZCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPndyaXRlTWVzc2FnZUJlZ2luKCRuYW1lLCAkdHlwZSwgJHNlcWlkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbG9zZXMgdGhlIG1lc3NhZ2UuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWVzc2FnZUVuZCgpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZU1lc3NhZ2VFbmQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgYSBzdHJ1Y3QgaGVhZGVyLgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAkbmFtZSBTdHJ1Y3QgbmFtZQorICAgICAqCisgICAgICogQHRocm93cyBURXhjZXB0aW9uIG9uIHdyaXRlIGVycm9yCisgICAgICogQHJldHVybiBpbnQgICAgICAgIEhvdyBtYW55IGJ5dGVzIHdyaXR0ZW4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJ1Y3RCZWdpbigkbmFtZSkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPndyaXRlU3RydWN0QmVnaW4oJG5hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsb3NlIGEgc3RydWN0LgorICAgICAqCisgICAgICogQHRocm93cyBURXhjZXB0aW9uIG9uIHdyaXRlIGVycm9yCisgICAgICogQHJldHVybiBpbnQgICAgICAgIEhvdyBtYW55IGJ5dGVzIHdyaXR0ZW4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJ1Y3RFbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+d3JpdGVTdHJ1Y3RFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZEJlZ2luKCRmaWVsZE5hbWUsICRmaWVsZFR5cGUsICRmaWVsZElkKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+d3JpdGVGaWVsZEJlZ2luKCRmaWVsZE5hbWUsICRmaWVsZFR5cGUsICRmaWVsZElkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZEVuZCgpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZUZpZWxkRW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRTdG9wKCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPndyaXRlRmllbGRTdG9wKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWFwQmVnaW4oJGtleVR5cGUsICR2YWxUeXBlLCAkc2l6ZSkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPndyaXRlTWFwQmVnaW4oJGtleVR5cGUsICR2YWxUeXBlLCAkc2l6ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWFwRW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPndyaXRlTWFwRW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTGlzdEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZUxpc3RCZWdpbigkZWxlbVR5cGUsICRzaXplKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVMaXN0RW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPndyaXRlTGlzdEVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVNldEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZVNldEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVNldEVuZCgpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZVNldEVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUJvb2woJGJvb2wpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZUJvb2woJGJvb2wpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUJ5dGUoJGJ5dGUpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZUJ5dGUoJGJ5dGUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUkxNigkaTE2KQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+d3JpdGVJMTYoJGkxNik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTMyKCRpMzIpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZUkzMigkaTMyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJNjQoJGk2NCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPndyaXRlSTY0KCRpNjQpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZURvdWJsZSgkZHViKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+d3JpdGVEb3VibGUoJGR1Yik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU3RyaW5nKCRzdHIpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZVN0cmluZygkc3RyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkcyB0aGUgbWVzc2FnZSBoZWFkZXIKKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgIEZ1bmN0aW9uIG5hbWUKKyAgICAgKiBAcGFyYW0gaW50ICAgICR0eXBlICBtZXNzYWdlIHR5cGUgVE1lc3NhZ2VUeXBlOjpDQUxMIG9yIFRNZXNzYWdlVHlwZTo6UkVQTFkKKyAgICAgKiBAcGFyYW0gaW50ICAgICRzZXFpZCBUaGUgc2VxdWVuY2UgaWQgb2YgdGhpcyBtZXNzYWdlCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNZXNzYWdlQmVnaW4oJiRuYW1lLCAmJHR5cGUsICYkc2VxaWQpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT5yZWFkTWVzc2FnZUJlZ2luKCRuYW1lLCAkdHlwZSwgJHNlcWlkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkIHRoZSBjbG9zZSBvZiBtZXNzYWdlCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNZXNzYWdlRW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPnJlYWRNZXNzYWdlRW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJ1Y3RCZWdpbigmJG5hbWUpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT5yZWFkU3RydWN0QmVnaW4oJG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RydWN0RW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPnJlYWRTdHJ1Y3RFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEZpZWxkQmVnaW4oJiRuYW1lLCAmJGZpZWxkVHlwZSwgJiRmaWVsZElkKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+cmVhZEZpZWxkQmVnaW4oJG5hbWUsICRmaWVsZFR5cGUsICRmaWVsZElkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEZpZWxkRW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPnJlYWRGaWVsZEVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWFwQmVnaW4oJiRrZXlUeXBlLCAmJHZhbFR5cGUsICYkc2l6ZSkKKyAgICB7CisgICAgICAgICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+cmVhZE1hcEJlZ2luKCRrZXlUeXBlLCAkdmFsVHlwZSwgJHNpemUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWFwRW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPnJlYWRNYXBFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZExpc3RCZWdpbigmJGVsZW1UeXBlLCAmJHNpemUpCisgICAgeworICAgICAgICAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPnJlYWRMaXN0QmVnaW4oJGVsZW1UeXBlLCAkc2l6ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRMaXN0RW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPnJlYWRMaXN0RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTZXRCZWdpbigmJGVsZW1UeXBlLCAmJHNpemUpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT5yZWFkU2V0QmVnaW4oJGVsZW1UeXBlLCAkc2l6ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTZXRFbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+cmVhZFNldEVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkQm9vbCgmJGJvb2wpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT5yZWFkQm9vbCgkYm9vbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRCeXRlKCYkYnl0ZSkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPnJlYWRCeXRlKCRieXRlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEkxNigmJGkxNikKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPnJlYWRJMTYoJGkxNik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRJMzIoJiRpMzIpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT5yZWFkSTMyKCRpMzIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkSTY0KCYkaTY0KQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+cmVhZEk2NCgkaTY0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZERvdWJsZSgmJGR1YikKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPnJlYWREb3VibGUoJGR1Yik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJpbmcoJiRzdHIpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT5yZWFkU3RyaW5nKCRzdHIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1Byb3RvY29sL1RTaW1wbGVKU09OUHJvdG9jb2wucGhwIGIvbGliL3BocC9saWIvUHJvdG9jb2wvVFNpbXBsZUpTT05Qcm90b2NvbC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNmMWY2NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1Byb3RvY29sL1RTaW1wbGVKU09OUHJvdG9jb2wucGhwCkBAIC0wLDAgKzEsMzc0IEBACis8P3BocAorCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcUHJvdG9jb2w7CisKK3VzZSBUaHJpZnRcRXhjZXB0aW9uXFRFeGNlcHRpb247Cit1c2UgVGhyaWZ0XEV4Y2VwdGlvblxUUHJvdG9jb2xFeGNlcHRpb247Cit1c2UgVGhyaWZ0XFByb3RvY29sXFNpbXBsZUpTT05cQ29udGV4dDsKK3VzZSBUaHJpZnRcUHJvdG9jb2xcU2ltcGxlSlNPTlxMaXN0Q29udGV4dDsKK3VzZSBUaHJpZnRcUHJvdG9jb2xcU2ltcGxlSlNPTlxTdHJ1Y3RDb250ZXh0OwordXNlIFRocmlmdFxQcm90b2NvbFxTaW1wbGVKU09OXE1hcENvbnRleHQ7Cit1c2UgVGhyaWZ0XFByb3RvY29sXFNpbXBsZUpTT05cQ29sbGVjdGlvbk1hcEtleUV4Y2VwdGlvbjsKKworLyoqCisgKiBTaW1wbGVKU09OIGltcGxlbWVudGF0aW9uIG9mIHRocmlmdCBwcm90b2NvbCwgcG9ydGVkIGZyb20gSmF2YS4KKyAqLworY2xhc3MgVFNpbXBsZUpTT05Qcm90b2NvbCBleHRlbmRzIFRQcm90b2NvbAoreworICAgIGNvbnN0IENPTU1BID0gJywnOworICAgIGNvbnN0IENPTE9OID0gJzonOworICAgIGNvbnN0IExCUkFDRSA9ICd7JzsKKyAgICBjb25zdCBSQlJBQ0UgPSAnfSc7CisgICAgY29uc3QgTEJSQUNLRVQgPSAnWyc7CisgICAgY29uc3QgUkJSQUNLRVQgPSAnXSc7CisgICAgY29uc3QgUVVPVEUgPSAnIic7CisKKyAgICBjb25zdCBOQU1FX01BUCA9ICJtYXAiOworICAgIGNvbnN0IE5BTUVfTElTVCA9ICJsc3QiOworICAgIGNvbnN0IE5BTUVfU0VUID0gInNldCI7CisKKyAgICBwcm90ZWN0ZWQgJHdyaXRlQ29udGV4dF8gPSBudWxsOworICAgIHByb3RlY3RlZCAkd3JpdGVDb250ZXh0U3RhY2tfID0gW107CisKKyAgICAvKioKKyAgICAgKiBQdXNoIGEgbmV3IHdyaXRlIGNvbnRleHQgb250byB0aGUgc3RhY2suCisgICAgICovCisgICAgcHJvdGVjdGVkIGZ1bmN0aW9uIHB1c2hXcml0ZUNvbnRleHQoQ29udGV4dCAkYykKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUNvbnRleHRTdGFja19bXSA9ICR0aGlzLT53cml0ZUNvbnRleHRfOworICAgICAgICAkdGhpcy0+d3JpdGVDb250ZXh0XyA9ICRjOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBvcCB0aGUgbGFzdCB3cml0ZSBjb250ZXh0IG9mZiB0aGUgc3RhY2sKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gcG9wV3JpdGVDb250ZXh0KCkKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUNvbnRleHRfID0gYXJyYXlfcG9wKCR0aGlzLT53cml0ZUNvbnRleHRTdGFja18pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFVzZWQgdG8gbWFrZSBzdXJlIHRoYXQgd2UgYXJlIG5vdCBlbmNvdW50ZXJpbmcgYSBtYXAgd2hvc2Uga2V5cyBhcmUgY29udGFpbmVycworICAgICAqLworICAgIHByb3RlY3RlZCBmdW5jdGlvbiBhc3NlcnRDb250ZXh0SXNOb3RNYXBLZXkoJGludmFsaWRLZXlUeXBlKQorICAgIHsKKyAgICAgICAgaWYgKCR0aGlzLT53cml0ZUNvbnRleHRfLT5pc01hcEtleSgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQ29sbGVjdGlvbk1hcEtleUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiQ2Fubm90IHNlcmlhbGl6ZSBhIG1hcCB3aXRoIGtleXMgdGhhdCBhcmUgb2YgdHlwZSAiIC4KKyAgICAgICAgICAgICAgICAkaW52YWxpZEtleVR5cGUKKyAgICAgICAgICAgICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIHdyaXRlSlNPTlN0cmluZygkYikKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUNvbnRleHRfLT53cml0ZSgpOworCisgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKGpzb25fZW5jb2RlKChzdHJpbmcpJGIpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIHdyaXRlSlNPTkludGVnZXIoJG51bSkKKyAgICB7CisgICAgICAgICRpc01hcEtleSA9ICR0aGlzLT53cml0ZUNvbnRleHRfLT5pc01hcEtleSgpOworCisgICAgICAgICR0aGlzLT53cml0ZUNvbnRleHRfLT53cml0ZSgpOworCisgICAgICAgIGlmICgkaXNNYXBLZXkpIHsKKyAgICAgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OlFVT1RFKTsKKyAgICAgICAgfQorCisgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKChpbnQpJG51bSk7CisKKyAgICAgICAgaWYgKCRpc01hcEtleSkgeworICAgICAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6UVVPVEUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiB3cml0ZUpTT05Eb3VibGUoJG51bSkKKyAgICB7CisgICAgICAgICRpc01hcEtleSA9ICR0aGlzLT53cml0ZUNvbnRleHRfLT5pc01hcEtleSgpOworCisgICAgICAgICR0aGlzLT53cml0ZUNvbnRleHRfLT53cml0ZSgpOworCisgICAgICAgIGlmICgkaXNNYXBLZXkpIHsKKyAgICAgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OlFVT1RFKTsKKyAgICAgICAgfQorCisgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKGpzb25fZW5jb2RlKChmbG9hdCkkbnVtKSk7CisKKyAgICAgICAgaWYgKCRpc01hcEtleSkgeworICAgICAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6UVVPVEUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHRyYW5zKQorICAgIHsKKyAgICAgICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkdHJhbnMpOworICAgICAgICAkdGhpcy0+d3JpdGVDb250ZXh0XyA9IG5ldyBDb250ZXh0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGVzIHRoZSBtZXNzYWdlIGhlYWRlcgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAkbmFtZSAgRnVuY3Rpb24gbmFtZQorICAgICAqIEBwYXJhbSBpbnQgICAgJHR5cGUgIG1lc3NhZ2UgdHlwZSBUTWVzc2FnZVR5cGU6OkNBTEwgb3IgVE1lc3NhZ2VUeXBlOjpSRVBMWQorICAgICAqIEBwYXJhbSBpbnQgICAgJHNlcWlkIFRoZSBzZXF1ZW5jZSBpZCBvZiB0aGlzIG1lc3NhZ2UKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNZXNzYWdlQmVnaW4oJG5hbWUsICR0eXBlLCAkc2VxaWQpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpMQlJBQ0tFVCk7CisgICAgICAgICR0aGlzLT5wdXNoV3JpdGVDb250ZXh0KG5ldyBMaXN0Q29udGV4dCgkdGhpcykpOworICAgICAgICAkdGhpcy0+d3JpdGVKU09OU3RyaW5nKCRuYW1lKTsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTkludGVnZXIoJHR5cGUpOworICAgICAgICAkdGhpcy0+d3JpdGVKU09OSW50ZWdlcigkc2VxaWQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsb3NlIHRoZSBtZXNzYWdlCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWVzc2FnZUVuZCgpCisgICAgeworICAgICAgICAkdGhpcy0+cG9wV3JpdGVDb250ZXh0KCk7CisgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OlJCUkFDS0VUKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgYSBzdHJ1Y3QgaGVhZGVyLgorICAgICAqCisgICAgICogQHBhcmFtICBzdHJpbmcgICAgICRuYW1lIFN0cnVjdCBuYW1lCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU3RydWN0QmVnaW4oJG5hbWUpCisgICAgeworICAgICAgICAkdGhpcy0+d3JpdGVDb250ZXh0Xy0+d3JpdGUoKTsKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6TEJSQUNFKTsKKyAgICAgICAgJHRoaXMtPnB1c2hXcml0ZUNvbnRleHQobmV3IFN0cnVjdENvbnRleHQoJHRoaXMpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbG9zZSBhIHN0cnVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJ1Y3RFbmQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnBvcFdyaXRlQ29udGV4dCgpOworICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpSQlJBQ0UpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkQmVnaW4oJGZpZWxkTmFtZSwgJGZpZWxkVHlwZSwgJGZpZWxkSWQpCisgICAgeworICAgICAgICAkdGhpcy0+d3JpdGVKU09OU3RyaW5nKCRmaWVsZE5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkRW5kKCkKKyAgICB7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRTdG9wKCkKKyAgICB7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWFwQmVnaW4oJGtleVR5cGUsICR2YWxUeXBlLCAkc2l6ZSkKKyAgICB7CisgICAgICAgICR0aGlzLT5hc3NlcnRDb250ZXh0SXNOb3RNYXBLZXkoc2VsZjo6TkFNRV9NQVApOworICAgICAgICAkdGhpcy0+d3JpdGVDb250ZXh0Xy0+d3JpdGUoKTsKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6TEJSQUNFKTsKKyAgICAgICAgJHRoaXMtPnB1c2hXcml0ZUNvbnRleHQobmV3IE1hcENvbnRleHQoJHRoaXMpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNYXBFbmQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnBvcFdyaXRlQ29udGV4dCgpOworICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpSQlJBQ0UpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUxpc3RCZWdpbigkZWxlbVR5cGUsICRzaXplKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmFzc2VydENvbnRleHRJc05vdE1hcEtleShzZWxmOjpOQU1FX0xJU1QpOworICAgICAgICAkdGhpcy0+d3JpdGVDb250ZXh0Xy0+d3JpdGUoKTsKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6TEJSQUNLRVQpOworICAgICAgICAkdGhpcy0+cHVzaFdyaXRlQ29udGV4dChuZXcgTGlzdENvbnRleHQoJHRoaXMpKTsKKyAgICAgICAgLy8gTm8gbWV0YWRhdGEhCisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTGlzdEVuZCgpCisgICAgeworICAgICAgICAkdGhpcy0+cG9wV3JpdGVDb250ZXh0KCk7CisgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OlJCUkFDS0VUKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTZXRCZWdpbigkZWxlbVR5cGUsICRzaXplKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmFzc2VydENvbnRleHRJc05vdE1hcEtleShzZWxmOjpOQU1FX1NFVCk7CisgICAgICAgICR0aGlzLT53cml0ZUNvbnRleHRfLT53cml0ZSgpOworICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpMQlJBQ0tFVCk7CisgICAgICAgICR0aGlzLT5wdXNoV3JpdGVDb250ZXh0KG5ldyBMaXN0Q29udGV4dCgkdGhpcykpOworICAgICAgICAvLyBObyBtZXRhZGF0YSEKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTZXRFbmQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnBvcFdyaXRlQ29udGV4dCgpOworICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpSQlJBQ0tFVCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlQm9vbCgkYm9vbCkKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05JbnRlZ2VyKCRib29sID8gMSA6IDApOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUJ5dGUoJGJ5dGUpCisgICAgeworICAgICAgICAkdGhpcy0+d3JpdGVKU09OSW50ZWdlcigkYnl0ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTE2KCRpMTYpCisgICAgeworICAgICAgICAkdGhpcy0+d3JpdGVKU09OSW50ZWdlcigkaTE2KTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJMzIoJGkzMikKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05JbnRlZ2VyKCRpMzIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUk2NCgkaTY0KQorICAgIHsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTkludGVnZXIoJGk2NCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRG91YmxlKCRkdWIpCisgICAgeworICAgICAgICAkdGhpcy0+d3JpdGVKU09ORG91YmxlKCRkdWIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cmluZygkc3RyKQorICAgIHsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTlN0cmluZygkc3RyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkaW5nIG1ldGhvZHMuCisgICAgICoKKyAgICAgKiBzaW1wbGVqc29uIGlzIG5vdCBtZWFudCB0byBiZSByZWFkIGJhY2sgaW50byB0aHJpZnQKKyAgICAgKiAtIHNlZSBodHRwOi8vd2lraS5hcGFjaGUub3JnL3RocmlmdC9UaHJpZnRVc2FnZUphdmEKKyAgICAgKiAtIHVzZSBKU09OIGluc3RlYWQKKyAgICAgKi8KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWVzc2FnZUJlZ2luKCYkbmFtZSwgJiR0eXBlLCAmJHNlcWlkKQorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWVzc2FnZUVuZCgpCisgICAgeworICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJ1Y3RCZWdpbigmJG5hbWUpCisgICAgeworICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJ1Y3RFbmQoKQorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkRmllbGRCZWdpbigmJG5hbWUsICYkZmllbGRUeXBlLCAmJGZpZWxkSWQpCisgICAgeworICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRGaWVsZEVuZCgpCisgICAgeworICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNYXBCZWdpbigmJGtleVR5cGUsICYkdmFsVHlwZSwgJiRzaXplKQorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWFwRW5kKCkKKyAgICB7CisgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZExpc3RCZWdpbigmJGVsZW1UeXBlLCAmJHNpemUpCisgICAgeworICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRMaXN0RW5kKCkKKyAgICB7CisgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFNldEJlZ2luKCYkZWxlbVR5cGUsICYkc2l6ZSkKKyAgICB7CisgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFNldEVuZCgpCisgICAgeworICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRCb29sKCYkYm9vbCkKKyAgICB7CisgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEJ5dGUoJiRieXRlKQorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkSTE2KCYkaTE2KQorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkSTMyKCYkaTMyKQorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkSTY0KCYkaTY0KQorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkRG91YmxlKCYkZHViKQorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RyaW5nKCYkc3RyKQorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1NlcmlhbGl6ZXIvVEJpbmFyeVNlcmlhbGl6ZXIucGhwIGIvbGliL3BocC9saWIvU2VyaWFsaXplci9UQmluYXJ5U2VyaWFsaXplci5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQyYjE0NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1NlcmlhbGl6ZXIvVEJpbmFyeVNlcmlhbGl6ZXIucGhwCkBAIC0wLDAgKzEsODcgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAorICogQGF1dGhvcjogcm1hcmluIChtYXJpbi5yYWR1QGZhY2Vib29rLmNvbSkKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFNlcmlhbGl6ZXI7CisKK3VzZSBUaHJpZnRcVHJhbnNwb3J0XFRNZW1vcnlCdWZmZXI7Cit1c2UgVGhyaWZ0XFByb3RvY29sXFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkOwordXNlIFRocmlmdFxUeXBlXFRNZXNzYWdlVHlwZTsKKworLyoqCisgKiBVdGlsaXR5IGNsYXNzIGZvciBzZXJpYWxpemluZyBhbmQgZGVzZXJpYWxpemluZworICogYSB0aHJpZnQgb2JqZWN0IHVzaW5nIFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkLgorICovCitjbGFzcyBUQmluYXJ5U2VyaWFsaXplcgoreworICAgIC8vIE5PVEUocm1hcmluKTogQmVjYXVzZSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYmluYXJ5CisgICAgLy8gYWRkcyBhIGJlZ2luIG1lc3NhZ2UgcHJlZml4LCB5b3UgY2Fubm90IHNwZWNpZnkKKyAgICAvLyBhIHRyYW5zcG9ydCBpbiB3aGljaCB0byBzZXJpYWxpemUgYW4gb2JqZWN0LiBJdCBoYXMgdG8KKyAgICAvLyBiZSBhIHN0cmluZy4gT3RoZXJ3aXNlIHdlIHdpbGwgYnJlYWsgdGhlIGNvbXBhdGliaWxpdHkgd2l0aAorICAgIC8vIG5vcm1hbCBkZXNlcmlhbGl6YXRpb24uCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzZXJpYWxpemUoJG9iamVjdCkKKyAgICB7CisgICAgICAgICR0cmFuc3BvcnQgPSBuZXcgVE1lbW9yeUJ1ZmZlcigpOworICAgICAgICAkcHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQoJHRyYW5zcG9ydCk7CisgICAgICAgIGlmIChmdW5jdGlvbl9leGlzdHMoJ3RocmlmdF9wcm90b2NvbF93cml0ZV9iaW5hcnknKSkgeworICAgICAgICAgICAgdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2JpbmFyeSgKKyAgICAgICAgICAgICAgICAkcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgJG9iamVjdC0+Z2V0TmFtZSgpLAorICAgICAgICAgICAgICAgIFRNZXNzYWdlVHlwZTo6UkVQTFksCisgICAgICAgICAgICAgICAgJG9iamVjdCwKKyAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICRwcm90b2NvbC0+aXNTdHJpY3RXcml0ZSgpCisgICAgICAgICAgICApOworCisgICAgICAgICAgICAkcHJvdG9jb2wtPnJlYWRNZXNzYWdlQmVnaW4oJHVudXNlZF9uYW1lLCAkdW51c2VkX3R5cGUsICR1bnVzZWRfc2VxaWQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJG9iamVjdC0+d3JpdGUoJHByb3RvY29sKTsKKyAgICAgICAgfQorICAgICAgICAkcHJvdG9jb2wtPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOworCisgICAgICAgIHJldHVybiAkdHJhbnNwb3J0LT5nZXRCdWZmZXIoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGRlc2VyaWFsaXplKCRzdHJpbmdfb2JqZWN0LCAkY2xhc3NfbmFtZSwgJGJ1ZmZlcl9zaXplID0gODE5MikKKyAgICB7CisgICAgICAgICR0cmFuc3BvcnQgPSBuZXcgVE1lbW9yeUJ1ZmZlcigpOworICAgICAgICAkcHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQoJHRyYW5zcG9ydCk7CisgICAgICAgIGlmIChmdW5jdGlvbl9leGlzdHMoJ3RocmlmdF9wcm90b2NvbF9yZWFkX2JpbmFyeScpKSB7CisgICAgICAgICAgICAvLyBOT1RFICh0LmhlaW50eikgVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQgaW50ZXJuYWxseSB3cmFwcyBvdXIgVE1lbW9yeUJ1ZmZlciBpbiBhCisgICAgICAgICAgICAvLyBUQnVmZmVyZWRUcmFuc3BvcnQsIHNvIHdlIGhhdmUgdG8gcmV0cmlldmUgaXQgYWdhaW4gb3IgcmlzayBsb3NpbmcgZGF0YSB3aGVuIHdyaXRpbmcKKyAgICAgICAgICAgIC8vIGxlc3MgdGhhbiA1MTIgYnl0ZXMgdG8gdGhlIHRyYW5zcG9ydCAoc2VlIHRoZSBjb21tZW50IHRoZXJlIGFzIHdlbGwpLgorICAgICAgICAgICAgLy8gQHNlZSBUSFJJRlQtMTU3OQorICAgICAgICAgICAgJHByb3RvY29sLT53cml0ZU1lc3NhZ2VCZWdpbignJywgVE1lc3NhZ2VUeXBlOjpSRVBMWSwgMCk7CisgICAgICAgICAgICAkcHJvdG9jb2xUcmFuc3BvcnQgPSAkcHJvdG9jb2wtPmdldFRyYW5zcG9ydCgpOworICAgICAgICAgICAgJHByb3RvY29sVHJhbnNwb3J0LT53cml0ZSgkc3RyaW5nX29iamVjdCk7CisgICAgICAgICAgICAkcHJvdG9jb2xUcmFuc3BvcnQtPmZsdXNoKCk7CisKKyAgICAgICAgICAgIHJldHVybiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9iaW5hcnkoJHByb3RvY29sLCAkY2xhc3NfbmFtZSwgJHByb3RvY29sLT5pc1N0cmljdFJlYWQoKSwgJGJ1ZmZlcl9zaXplKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICR0cmFuc3BvcnQtPndyaXRlKCRzdHJpbmdfb2JqZWN0KTsKKyAgICAgICAgICAgICRvYmplY3QgPSBuZXcgJGNsYXNzX25hbWUoKTsKKyAgICAgICAgICAgICRvYmplY3QtPnJlYWQoJHByb3RvY29sKTsKKworICAgICAgICAgICAgcmV0dXJuICRvYmplY3Q7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9TZXJ2ZXIvVEZvcmtpbmdTZXJ2ZXIucGhwIGIvbGliL3BocC9saWIvU2VydmVyL1RGb3JraW5nU2VydmVyLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmI2ZTkxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvU2VydmVyL1RGb3JraW5nU2VydmVyLnBocApAQCAtMCwwICsxLDEyNSBAQAorPD9waHAKKworbmFtZXNwYWNlIFRocmlmdFxTZXJ2ZXI7CisKK3VzZSBUaHJpZnRcVHJhbnNwb3J0XFRUcmFuc3BvcnQ7Cit1c2UgVGhyaWZ0XEV4Y2VwdGlvblxURXhjZXB0aW9uOwordXNlIFRocmlmdFxFeGNlcHRpb25cVFRyYW5zcG9ydEV4Y2VwdGlvbjsKKworLyoqCisgKiBBIGZvcmtpbmcgaW1wbGVtZW50YXRpb24gb2YgYSBUaHJpZnQgc2VydmVyLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC5zZXJ2ZXIKKyAqLworY2xhc3MgVEZvcmtpbmdTZXJ2ZXIgZXh0ZW5kcyBUU2VydmVyCit7CisgICAgLyoqCisgICAgICogRmxhZyBmb3IgdGhlIG1haW4gc2VydmluZyBsb29wCisgICAgICoKKyAgICAgKiBAdmFyIGJvb2wKKyAgICAgKi8KKyAgICBwcml2YXRlICRzdG9wXyA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogTGlzdCBvZiBjaGlsZHJlbi4KKyAgICAgKgorICAgICAqIEB2YXIgYXJyYXkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJGNoaWxkcmVuXyA9IGFycmF5KCk7CisKKyAgICAvKioKKyAgICAgKiBMaXN0ZW5zIGZvciBuZXcgY2xpZW50IHVzaW5nIHRoZSBzdXBwbGllZAorICAgICAqIHRyYW5zcG9ydC4gV2UgZm9yayB3aGVuIGEgbmV3IGNvbm5lY3Rpb24KKyAgICAgKiBhcnJpdmVzLgorICAgICAqCisgICAgICogQHJldHVybiB2b2lkCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHNlcnZlKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnRfLT5saXN0ZW4oKTsKKworICAgICAgICB3aGlsZSAoISR0aGlzLT5zdG9wXykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAkdHJhbnNwb3J0ID0gJHRoaXMtPnRyYW5zcG9ydF8tPmFjY2VwdCgpOworCisgICAgICAgICAgICAgICAgaWYgKCR0cmFuc3BvcnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAkcGlkID0gcGNudGxfZm9yaygpOworCisgICAgICAgICAgICAgICAgICAgIGlmICgkcGlkID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmhhbmRsZVBhcmVudCgkdHJhbnNwb3J0LCAkcGlkKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlaWYgKCRwaWQgPT09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5oYW5kbGVDaGlsZCgkdHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCdGYWlsZWQgdG8gZm9yaycpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiAkZSkgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAkdGhpcy0+Y29sbGVjdENoaWxkcmVuKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb2RlIHJ1biBieSB0aGUgcGFyZW50CisgICAgICoKKyAgICAgKiBAcGFyYW0gVFRyYW5zcG9ydCAkdHJhbnNwb3J0CisgICAgICogQHBhcmFtIGludCAkcGlkCisgICAgICogQHJldHVybiB2b2lkCisgICAgICovCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBoYW5kbGVQYXJlbnQoVFRyYW5zcG9ydCAkdHJhbnNwb3J0LCAkcGlkKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmNoaWxkcmVuX1skcGlkXSA9ICR0cmFuc3BvcnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29kZSBydW4gYnkgdGhlIGNoaWxkLgorICAgICAqCisgICAgICogQHBhcmFtIFRUcmFuc3BvcnQgJHRyYW5zcG9ydAorICAgICAqIEByZXR1cm4gdm9pZAorICAgICAqLworICAgIHByaXZhdGUgZnVuY3Rpb24gaGFuZGxlQ2hpbGQoVFRyYW5zcG9ydCAkdHJhbnNwb3J0KQorICAgIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICRpbnB1dFRyYW5zcG9ydCA9ICR0aGlzLT5pbnB1dFRyYW5zcG9ydEZhY3RvcnlfLT5nZXRUcmFuc3BvcnQoJHRyYW5zcG9ydCk7CisgICAgICAgICAgICAkb3V0cHV0VHJhbnNwb3J0ID0gJHRoaXMtPm91dHB1dFRyYW5zcG9ydEZhY3RvcnlfLT5nZXRUcmFuc3BvcnQoJHRyYW5zcG9ydCk7CisgICAgICAgICAgICAkaW5wdXRQcm90b2NvbCA9ICR0aGlzLT5pbnB1dFByb3RvY29sRmFjdG9yeV8tPmdldFByb3RvY29sKCRpbnB1dFRyYW5zcG9ydCk7CisgICAgICAgICAgICAkb3V0cHV0UHJvdG9jb2wgPSAkdGhpcy0+b3V0cHV0UHJvdG9jb2xGYWN0b3J5Xy0+Z2V0UHJvdG9jb2woJG91dHB1dFRyYW5zcG9ydCk7CisgICAgICAgICAgICB3aGlsZSAoJHRoaXMtPnByb2Nlc3Nvcl8tPnByb2Nlc3MoJGlucHV0UHJvdG9jb2wsICRvdXRwdXRQcm90b2NvbCkpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEAkdHJhbnNwb3J0LT5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uICRlKSB7CisgICAgICAgIH0KKworICAgICAgICBleGl0KDApOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbGxlY3RzIGFueSBjaGlsZHJlbiB3ZSBtYXkgaGF2ZQorICAgICAqCisgICAgICogQHJldHVybiB2b2lkCisgICAgICovCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBjb2xsZWN0Q2hpbGRyZW4oKQorICAgIHsKKyAgICAgICAgZm9yZWFjaCAoJHRoaXMtPmNoaWxkcmVuXyBhcyAkcGlkID0+ICR0cmFuc3BvcnQpIHsKKyAgICAgICAgICAgIGlmIChwY250bF93YWl0cGlkKCRwaWQsICRzdGF0dXMsIFdOT0hBTkcpID4gMCkgeworICAgICAgICAgICAgICAgIHVuc2V0KCR0aGlzLT5jaGlsZHJlbl9bJHBpZF0pOworICAgICAgICAgICAgICAgIGlmICgkdHJhbnNwb3J0KSB7CisgICAgICAgICAgICAgICAgICAgIEAkdHJhbnNwb3J0LT5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFN0b3BzIHRoZSBzZXJ2ZXIgcnVubmluZy4gS2lsbHMgdGhlIHRyYW5zcG9ydAorICAgICAqIGFuZCB0aGVuIHN0b3BzIHRoZSBtYWluIHNlcnZpbmcgbG9vcAorICAgICAqCisgICAgICogQHJldHVybiB2b2lkCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHN0b3AoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydF8tPmNsb3NlKCk7CisgICAgICAgICR0aGlzLT5zdG9wXyA9IHRydWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvU2VydmVyL1RTU0xTZXJ2ZXJTb2NrZXQucGhwIGIvbGliL3BocC9saWIvU2VydmVyL1RTU0xTZXJ2ZXJTb2NrZXQucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjNTg5YjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9TZXJ2ZXIvVFNTTFNlcnZlclNvY2tldC5waHAKQEAgLTAsMCArMSw5NyBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK25hbWVzcGFjZSBUaHJpZnRcU2VydmVyOworCit1c2UgVGhyaWZ0XFRyYW5zcG9ydFxUU1NMU29ja2V0OworCisvKioKKyAqIFNvY2tldCBpbXBsZW1lbnRhdGlvbiBvZiBhIHNlcnZlciBhZ2VudC4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0CisgKi8KK2NsYXNzIFRTU0xTZXJ2ZXJTb2NrZXQgZXh0ZW5kcyBUU2VydmVyU29ja2V0Cit7CisgICAgLyoqCisgICAgICogUmVtb3RlIHBvcnQKKyAgICAgKgorICAgICAqIEB2YXIgcmVzb3VyY2UKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJGNvbnRleHRfID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFNlcnZlclNvY2tldCBjb25zdHJ1Y3RvcgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAkaG9zdCBIb3N0IHRvIGxpc3RlbiBvbgorICAgICAqIEBwYXJhbSBpbnQgJHBvcnQgUG9ydCB0byBsaXN0ZW4gb24KKyAgICAgKiBAcGFyYW0gcmVzb3VyY2UgJGNvbnRleHQgU3RyZWFtIGNvbnRleHQKKyAgICAgKiBAcmV0dXJuIHZvaWQKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGhvc3QgPSAnbG9jYWxob3N0JywgJHBvcnQgPSA5MDkwLCAkY29udGV4dCA9IG51bGwpCisgICAgeworICAgICAgICAkc3NsX2hvc3QgPSAkdGhpcy0+Z2V0U1NMSG9zdCgkaG9zdCk7CisgICAgICAgIHBhcmVudDo6X19jb25zdHJ1Y3QoJHNzbF9ob3N0LCAkcG9ydCk7CisgICAgICAgICR0aGlzLT5jb250ZXh0XyA9ICRjb250ZXh0OworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRTU0xIb3N0KCRob3N0KQorICAgIHsKKyAgICAgICAgJHRyYW5zcG9ydF9wcm90b2NvbF9sb2MgPSBzdHJwb3MoJGhvc3QsICI6Ly8iKTsKKyAgICAgICAgaWYgKCR0cmFuc3BvcnRfcHJvdG9jb2xfbG9jID09PSBmYWxzZSkgeworICAgICAgICAgICAgJGhvc3QgPSAnc3NsOi8vJyAuICRob3N0OworICAgICAgICB9CisgICAgICAgIHJldHVybiAkaG9zdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPcGVucyBhIG5ldyBzb2NrZXQgc2VydmVyIGhhbmRsZQorICAgICAqCisgICAgICogQHJldHVybiB2b2lkCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIGxpc3RlbigpCisgICAgeworICAgICAgICAkdGhpcy0+bGlzdGVuZXJfID0gQHN0cmVhbV9zb2NrZXRfc2VydmVyKAorICAgICAgICAgICAgJHRoaXMtPmhvc3RfIC4gJzonIC4gJHRoaXMtPnBvcnRfLAorICAgICAgICAgICAgJGVycm5vLAorICAgICAgICAgICAgJGVycnN0ciwKKyAgICAgICAgICAgIFNUUkVBTV9TRVJWRVJfQklORCB8IFNUUkVBTV9TRVJWRVJfTElTVEVOLAorICAgICAgICAgICAgJHRoaXMtPmNvbnRleHRfCisgICAgICAgICk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW1wbGVtZW50YXRpb24gb2YgYWNjZXB0LiBJZiBub3QgY2xpZW50IGlzIGFjY2VwdGVkIGluIHRoZSBnaXZlbiB0aW1lCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRTb2NrZXQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gYWNjZXB0SW1wbCgpCisgICAgeworICAgICAgICAkaGFuZGxlID0gQHN0cmVhbV9zb2NrZXRfYWNjZXB0KCR0aGlzLT5saXN0ZW5lcl8sICR0aGlzLT5hY2NlcHRUaW1lb3V0XyAvIDEwMDAuMCk7CisgICAgICAgIGlmICghJGhhbmRsZSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICAkc29ja2V0ID0gbmV3IFRTU0xTb2NrZXQoKTsKKyAgICAgICAgJHNvY2tldC0+c2V0SGFuZGxlKCRoYW5kbGUpOworCisgICAgICAgIHJldHVybiAkc29ja2V0OworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1NlcnZlci9UU2VydmVyLnBocCBiL2xpYi9waHAvbGliL1NlcnZlci9UU2VydmVyLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjhjMzc4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvU2VydmVyL1RTZXJ2ZXIucGhwCkBAIC0wLDAgKzEsMTAyIEBACis8P3BocAorCituYW1lc3BhY2UgVGhyaWZ0XFNlcnZlcjsKKwordXNlIFRocmlmdFxGYWN0b3J5XFRUcmFuc3BvcnRGYWN0b3J5OwordXNlIFRocmlmdFxGYWN0b3J5XFRQcm90b2NvbEZhY3Rvcnk7CisKKy8qKgorICogR2VuZXJpYyBjbGFzcyBmb3IgYSBUaHJpZnQgc2VydmVyLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC5zZXJ2ZXIKKyAqLworYWJzdHJhY3QgY2xhc3MgVFNlcnZlcgoreworICAgIC8qKgorICAgICAqIFByb2Nlc3NvciB0byBoYW5kbGUgbmV3IGNsaWVudHMKKyAgICAgKgorICAgICAqIEB2YXIgVFByb2Nlc3NvcgorICAgICAqLworICAgIHByb3RlY3RlZCAkcHJvY2Vzc29yXzsKKworICAgIC8qKgorICAgICAqIFNlcnZlciB0cmFuc3BvcnQgdG8gYmUgdXNlZCBmb3IgbGlzdGVuaW5nCisgICAgICogYW5kIGFjY2VwdGluZyBuZXcgY2xpZW50cworICAgICAqCisgICAgICogQHZhciBUU2VydmVyVHJhbnNwb3J0CisgICAgICovCisgICAgcHJvdGVjdGVkICR0cmFuc3BvcnRfOworCisgICAgLyoqCisgICAgICogSW5wdXQgdHJhbnNwb3J0IGZhY3RvcnkKKyAgICAgKgorICAgICAqIEB2YXIgVFRyYW5zcG9ydEZhY3RvcnkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJGlucHV0VHJhbnNwb3J0RmFjdG9yeV87CisKKyAgICAvKioKKyAgICAgKiBPdXRwdXQgdHJhbnNwb3J0IGZhY3RvcnkKKyAgICAgKgorICAgICAqIEB2YXIgVFRyYW5zcG9ydEZhY3RvcnkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJG91dHB1dFRyYW5zcG9ydEZhY3RvcnlfOworCisgICAgLyoqCisgICAgICogSW5wdXQgcHJvdG9jb2wgZmFjdG9yeQorICAgICAqCisgICAgICogQHZhciBUUHJvdG9jb2xGYWN0b3J5CisgICAgICovCisgICAgcHJvdGVjdGVkICRpbnB1dFByb3RvY29sRmFjdG9yeV87CisKKyAgICAvKioKKyAgICAgKiBPdXRwdXQgcHJvdG9jb2wgZmFjdG9yeQorICAgICAqCisgICAgICogQHZhciBUUHJvdG9jb2xGYWN0b3J5CisgICAgICovCisgICAgcHJvdGVjdGVkICRvdXRwdXRQcm90b2NvbEZhY3RvcnlfOworCisgICAgLyoqCisgICAgICogU2V0cyB1cCBhbGwgdGhlIGZhY3RvcmllcywgZXRjCisgICAgICoKKyAgICAgKiBAcGFyYW0gb2JqZWN0ICRwcm9jZXNzb3IKKyAgICAgKiBAcGFyYW0gVFNlcnZlclRyYW5zcG9ydCAkdHJhbnNwb3J0CisgICAgICogQHBhcmFtIFRUcmFuc3BvcnRGYWN0b3J5ICRpbnB1dFRyYW5zcG9ydEZhY3RvcnkKKyAgICAgKiBAcGFyYW0gVFRyYW5zcG9ydEZhY3RvcnkgJG91dHB1dFRyYW5zcG9ydEZhY3RvcnkKKyAgICAgKiBAcGFyYW0gVFByb3RvY29sRmFjdG9yeSAkaW5wdXRQcm90b2NvbEZhY3RvcnkKKyAgICAgKiBAcGFyYW0gVFByb3RvY29sRmFjdG9yeSAkb3V0cHV0UHJvdG9jb2xGYWN0b3J5CisgICAgICogQHJldHVybiB2b2lkCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KAorICAgICAgICAkcHJvY2Vzc29yLAorICAgICAgICBUU2VydmVyVHJhbnNwb3J0ICR0cmFuc3BvcnQsCisgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5ICRpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5ICRvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICBUUHJvdG9jb2xGYWN0b3J5ICRpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgVFByb3RvY29sRmFjdG9yeSAkb3V0cHV0UHJvdG9jb2xGYWN0b3J5CisgICAgKSB7CisgICAgICAgICR0aGlzLT5wcm9jZXNzb3JfID0gJHByb2Nlc3NvcjsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydF8gPSAkdHJhbnNwb3J0OworICAgICAgICAkdGhpcy0+aW5wdXRUcmFuc3BvcnRGYWN0b3J5XyA9ICRpbnB1dFRyYW5zcG9ydEZhY3Rvcnk7CisgICAgICAgICR0aGlzLT5vdXRwdXRUcmFuc3BvcnRGYWN0b3J5XyA9ICRvdXRwdXRUcmFuc3BvcnRGYWN0b3J5OworICAgICAgICAkdGhpcy0+aW5wdXRQcm90b2NvbEZhY3RvcnlfID0gJGlucHV0UHJvdG9jb2xGYWN0b3J5OworICAgICAgICAkdGhpcy0+b3V0cHV0UHJvdG9jb2xGYWN0b3J5XyA9ICRvdXRwdXRQcm90b2NvbEZhY3Rvcnk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VydmVzIHRoZSBzZXJ2ZXIuIFRoaXMgc2hvdWxkIG5ldmVyIHJldHVybgorICAgICAqIHVubGVzcyBhIHByb2JsZW0gcGVybWl0cyBpdCB0byBkbyBzbyBvciBpdAorICAgICAqIGlzIGludGVycnVwdGVkIGludGVudGlvbmFsbHkKKyAgICAgKgorICAgICAqIEBhYnN0cmFjdAorICAgICAqIEByZXR1cm4gdm9pZAorICAgICAqLworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiBzZXJ2ZSgpOworCisgICAgLyoqCisgICAgICogU3RvcHMgdGhlIHNlcnZlciBzZXJ2aW5nCisgICAgICoKKyAgICAgKiBAYWJzdHJhY3QKKyAgICAgKiBAcmV0dXJuIHZvaWQKKyAgICAgKi8KKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gc3RvcCgpOworfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvU2VydmVyL1RTZXJ2ZXJTb2NrZXQucGhwIGIvbGliL3BocC9saWIvU2VydmVyL1RTZXJ2ZXJTb2NrZXQucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmMzhmYjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9TZXJ2ZXIvVFNlcnZlclNvY2tldC5waHAKQEAgLTAsMCArMSwxMjQgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFNlcnZlcjsKKwordXNlIFRocmlmdFxUcmFuc3BvcnRcVFNvY2tldDsKKworLyoqCisgKiBTb2NrZXQgaW1wbGVtZW50YXRpb24gb2YgYSBzZXJ2ZXIgYWdlbnQuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAorICovCitjbGFzcyBUU2VydmVyU29ja2V0IGV4dGVuZHMgVFNlcnZlclRyYW5zcG9ydAoreworICAgIC8qKgorICAgICAqIEhhbmRsZSBmb3IgdGhlIGxpc3RlbmVyIHNvY2tldAorICAgICAqCisgICAgICogQHZhciByZXNvdXJjZQorICAgICAqLworICAgIHByb3RlY3RlZCAkbGlzdGVuZXJfOworCisgICAgLyoqCisgICAgICogUG9ydCBmb3IgdGhlIGxpc3RlbmVyIHRvIGxpc3RlbiBvbgorICAgICAqCisgICAgICogQHZhciBpbnQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJHBvcnRfOworCisgICAgLyoqCisgICAgICogVGltZW91dCB3aGVuIGxpc3RlbmluZyBmb3IgYSBuZXcgY2xpZW50CisgICAgICoKKyAgICAgKiBAdmFyIGludAorICAgICAqLworICAgIHByb3RlY3RlZCAkYWNjZXB0VGltZW91dF8gPSAzMDAwMDsKKworICAgIC8qKgorICAgICAqIEhvc3QgdG8gbGlzdGVuIG9uCisgICAgICoKKyAgICAgKiBAdmFyIHN0cmluZworICAgICAqLworICAgIHByb3RlY3RlZCAkaG9zdF87CisKKyAgICAvKioKKyAgICAgKiBTZXJ2ZXJTb2NrZXQgY29uc3RydWN0b3IKKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJpbmcgJGhvc3QgSG9zdCB0byBsaXN0ZW4gb24KKyAgICAgKiBAcGFyYW0gaW50ICRwb3J0IFBvcnQgdG8gbGlzdGVuIG9uCisgICAgICogQHJldHVybiB2b2lkCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRob3N0ID0gJ2xvY2FsaG9zdCcsICRwb3J0ID0gOTA5MCkKKyAgICB7CisgICAgICAgICR0aGlzLT5ob3N0XyA9ICRob3N0OworICAgICAgICAkdGhpcy0+cG9ydF8gPSAkcG9ydDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBhY2NlcHQgdGltZW91dAorICAgICAqCisgICAgICogQHBhcmFtIGludCAkYWNjZXB0VGltZW91dAorICAgICAqIEByZXR1cm4gdm9pZAorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRBY2NlcHRUaW1lb3V0KCRhY2NlcHRUaW1lb3V0KQorICAgIHsKKyAgICAgICAgJHRoaXMtPmFjY2VwdFRpbWVvdXRfID0gJGFjY2VwdFRpbWVvdXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogT3BlbnMgYSBuZXcgc29ja2V0IHNlcnZlciBoYW5kbGUKKyAgICAgKgorICAgICAqIEByZXR1cm4gdm9pZAorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBsaXN0ZW4oKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmxpc3RlbmVyXyA9IHN0cmVhbV9zb2NrZXRfc2VydmVyKCd0Y3A6Ly8nIC4gJHRoaXMtPmhvc3RfIC4gJzonIC4gJHRoaXMtPnBvcnRfKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbG9zZXMgdGhlIHNvY2tldCBzZXJ2ZXIgaGFuZGxlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHZvaWQKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gY2xvc2UoKQorICAgIHsKKyAgICAgICAgQGZjbG9zZSgkdGhpcy0+bGlzdGVuZXJfKTsKKyAgICAgICAgJHRoaXMtPmxpc3RlbmVyXyA9IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW1wbGVtZW50YXRpb24gb2YgYWNjZXB0LiBJZiBub3QgY2xpZW50IGlzIGFjY2VwdGVkIGluIHRoZSBnaXZlbiB0aW1lCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRTb2NrZXQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gYWNjZXB0SW1wbCgpCisgICAgeworICAgICAgICAkaGFuZGxlID0gQHN0cmVhbV9zb2NrZXRfYWNjZXB0KCR0aGlzLT5saXN0ZW5lcl8sICR0aGlzLT5hY2NlcHRUaW1lb3V0XyAvIDEwMDAuMCk7CisgICAgICAgIGlmICghJGhhbmRsZSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICAkc29ja2V0ID0gbmV3IFRTb2NrZXQoKTsKKyAgICAgICAgJHNvY2tldC0+c2V0SGFuZGxlKCRoYW5kbGUpOworCisgICAgICAgIHJldHVybiAkc29ja2V0OworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1NlcnZlci9UU2VydmVyVHJhbnNwb3J0LnBocCBiL2xpYi9waHAvbGliL1NlcnZlci9UU2VydmVyVHJhbnNwb3J0LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWEyN2FmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvU2VydmVyL1RTZXJ2ZXJUcmFuc3BvcnQucGhwCkBAIC0wLDAgKzEsNTYgQEAKKzw/cGhwCisKK25hbWVzcGFjZSBUaHJpZnRcU2VydmVyOworCit1c2UgVGhyaWZ0XEV4Y2VwdGlvblxUVHJhbnNwb3J0RXhjZXB0aW9uOworCisvKioKKyAqIEdlbmVyaWMgY2xhc3MgZm9yIFNlcnZlciBhZ2VudC4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0CisgKi8KK2Fic3RyYWN0IGNsYXNzIFRTZXJ2ZXJUcmFuc3BvcnQKK3sKKyAgICAvKioKKyAgICAgKiBMaXN0IGZvciBuZXcgY2xpZW50cworICAgICAqCisgICAgICogQGFic3RyYWN0CisgICAgICogQHJldHVybiB2b2lkCisgICAgICovCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIGxpc3RlbigpOworCisgICAgLyoqCisgICAgICogQ2xvc2UgdGhlIHNlcnZlcgorICAgICAqCisgICAgICogQGFic3RyYWN0CisgICAgICogQHJldHVybiB2b2lkCisgICAgICovCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIGNsb3NlKCk7CisKKyAgICAvKioKKyAgICAgKiBTdWJjbGFzc2VzIHNob3VsZCB1c2UgdGhpcyB0byBpbXBsZW1lbnQKKyAgICAgKiBhY2NlcHQuCisgICAgICoKKyAgICAgKiBAYWJzdHJhY3QKKyAgICAgKiBAcmV0dXJuIFRUcmFuc3BvcnQKKyAgICAgKi8KKyAgICBhYnN0cmFjdCBwcm90ZWN0ZWQgZnVuY3Rpb24gYWNjZXB0SW1wbCgpOworCisgICAgLyoqCisgICAgICogVXNlcyB0aGUgYWNjZXB0IGltcGxlbXRhdGlvbi4gSWYgbnVsbCBpcyByZXR1cm5lZCwgYW4KKyAgICAgKiBleGNlcHRpb24gaXMgdGhyb3duLgorICAgICAqCisgICAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uCisgICAgICogQHJldHVybiBUVHJhbnNwb3J0CisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIGFjY2VwdCgpCisgICAgeworICAgICAgICAkdHJhbnNwb3J0ID0gJHRoaXMtPmFjY2VwdEltcGwoKTsKKworICAgICAgICBpZiAoJHRyYW5zcG9ydCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiYWNjZXB0KCkgbWF5IG5vdCByZXR1cm4gTlVMTCIpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICR0cmFuc3BvcnQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvU2VydmVyL1RTaW1wbGVTZXJ2ZXIucGhwIGIvbGliL3BocC9saWIvU2VydmVyL1RTaW1wbGVTZXJ2ZXIucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjMWRkYTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9TZXJ2ZXIvVFNpbXBsZVNlcnZlci5waHAKQEAgLTAsMCArMSw2MCBAQAorPD9waHAKKworbmFtZXNwYWNlIFRocmlmdFxTZXJ2ZXI7CisKK3VzZSBUaHJpZnRcRXhjZXB0aW9uXFRUcmFuc3BvcnRFeGNlcHRpb247CisKKy8qKgorICogU2ltcGxlIGltcGxlbXRhdGlvbiBvZiBhIFRocmlmdCBzZXJ2ZXIuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnNlcnZlcgorICovCitjbGFzcyBUU2ltcGxlU2VydmVyIGV4dGVuZHMgVFNlcnZlcgoreworICAgIC8qKgorICAgICAqIEZsYWcgZm9yIHRoZSBtYWluIHNlcnZpbmcgbG9vcAorICAgICAqCisgICAgICogQHZhciBib29sCisgICAgICovCisgICAgcHJpdmF0ZSAkc3RvcF8gPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIExpc3RlbnMgZm9yIG5ldyBjbGllbnQgdXNpbmcgdGhlIHN1cHBsaWVkCisgICAgICogdHJhbnNwb3J0LiBJdCBoYW5kbGVzIFRUcmFuc3BvcnRFeGNlcHRpb25zCisgICAgICogdG8gYXZvaWQgdGltZW91dHMgZXRjIGtpbGxpbmcgaXQKKyAgICAgKgorICAgICAqIEByZXR1cm4gdm9pZAorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBzZXJ2ZSgpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0Xy0+bGlzdGVuKCk7CisKKyAgICAgICAgd2hpbGUgKCEkdGhpcy0+c3RvcF8pIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgJHRyYW5zcG9ydCA9ICR0aGlzLT50cmFuc3BvcnRfLT5hY2NlcHQoKTsKKworICAgICAgICAgICAgICAgIGlmICgkdHJhbnNwb3J0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgJGlucHV0VHJhbnNwb3J0ID0gJHRoaXMtPmlucHV0VHJhbnNwb3J0RmFjdG9yeV8tPmdldFRyYW5zcG9ydCgkdHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICAgICAgJG91dHB1dFRyYW5zcG9ydCA9ICR0aGlzLT5vdXRwdXRUcmFuc3BvcnRGYWN0b3J5Xy0+Z2V0VHJhbnNwb3J0KCR0cmFuc3BvcnQpOworICAgICAgICAgICAgICAgICAgICAkaW5wdXRQcm90b2NvbCA9ICR0aGlzLT5pbnB1dFByb3RvY29sRmFjdG9yeV8tPmdldFByb3RvY29sKCRpbnB1dFRyYW5zcG9ydCk7CisgICAgICAgICAgICAgICAgICAgICRvdXRwdXRQcm90b2NvbCA9ICR0aGlzLT5vdXRwdXRQcm90b2NvbEZhY3RvcnlfLT5nZXRQcm90b2NvbCgkb3V0cHV0VHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCR0aGlzLT5wcm9jZXNzb3JfLT5wcm9jZXNzKCRpbnB1dFByb3RvY29sLCAkb3V0cHV0UHJvdG9jb2wpKSB7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uICRlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdG9wcyB0aGUgc2VydmVyIHJ1bm5pbmcuIEtpbGxzIHRoZSB0cmFuc3BvcnQKKyAgICAgKiBhbmQgdGhlbiBzdG9wcyB0aGUgbWFpbiBzZXJ2aW5nIGxvb3AKKyAgICAgKgorICAgICAqIEByZXR1cm4gdm9pZAorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBzdG9wKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnRfLT5jbG9zZSgpOworICAgICAgICAkdGhpcy0+c3RvcF8gPSB0cnVlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1N0b3JlZE1lc3NhZ2VQcm90b2NvbC5waHAgYi9saWIvcGhwL2xpYi9TdG9yZWRNZXNzYWdlUHJvdG9jb2wucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0YWFhYTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9TdG9yZWRNZXNzYWdlUHJvdG9jb2wucGhwCkBAIC0wLDAgKzEsNTMgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC5wcm9jZXNzb3IKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0OworCit1c2UgVGhyaWZ0XFByb3RvY29sXFRQcm90b2NvbDsKK3VzZSBUaHJpZnRcUHJvdG9jb2xcVFByb3RvY29sRGVjb3JhdG9yOworCisvKioKKyAqICBPdXIgZ29hbCB3YXMgdG8gd29yayB3aXRoIGFueSBwcm90b2NvbC4gSW4gb3JkZXIgdG8gZG8gdGhhdCwgd2UgbmVlZGVkCisgKiAgdG8gYWxsb3cgdGhlbSB0byBjYWxsIHJlYWRNZXNzYWdlQmVnaW4oKSBhbmQgZ2V0IHRoZSBNZXNzYWdlIGluIGV4YWN0bHkKKyAqICB0aGUgc3RhbmRhcmQgZm9ybWF0LCB3aXRob3V0IHRoZSBzZXJ2aWNlIG5hbWUgcHJlcGVuZGVkIHRvIHRoZSBNZXNzYWdlIG5hbWUuCisgKi8KK2NsYXNzIFN0b3JlZE1lc3NhZ2VQcm90b2NvbCBleHRlbmRzIFRQcm90b2NvbERlY29yYXRvcgoreworICAgIHByaXZhdGUgJGZuYW1lXzsKKyAgICBwcml2YXRlICRtdHlwZV87CisgICAgcHJpdmF0ZSAkcnNlcWlkXzsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChUUHJvdG9jb2wgJHByb3RvY29sLCAkZm5hbWUsICRtdHlwZSwgJHJzZXFpZCkKKyAgICB7CisgICAgICAgIHBhcmVudDo6X19jb25zdHJ1Y3QoJHByb3RvY29sKTsKKyAgICAgICAgJHRoaXMtPmZuYW1lXyAgPSAkZm5hbWU7CisgICAgICAgICR0aGlzLT5tdHlwZV8gID0gJG10eXBlOworICAgICAgICAkdGhpcy0+cnNlcWlkXyA9ICRyc2VxaWQ7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNZXNzYWdlQmVnaW4oJiRuYW1lLCAmJHR5cGUsICYkc2VxaWQpCisgICAgeworICAgICAgICAkbmFtZSAgPSAkdGhpcy0+Zm5hbWVfOworICAgICAgICAkdHlwZSAgPSAkdGhpcy0+bXR5cGVfOworICAgICAgICAkc2VxaWQgPSAkdGhpcy0+cnNlcWlkXzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9TdHJpbmdGdW5jL0NvcmUucGhwIGIvbGliL3BocC9saWIvU3RyaW5nRnVuYy9Db3JlLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWE3NWIzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvU3RyaW5nRnVuYy9Db3JlLnBocApAQCAtMCwwICsxLDQwIEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxTdHJpbmdGdW5jOworCitjbGFzcyBDb3JlIGltcGxlbWVudHMgVFN0cmluZ0Z1bmMKK3sKKyAgICBwdWJsaWMgZnVuY3Rpb24gc3Vic3RyKCRzdHIsICRzdGFydCwgJGxlbmd0aCA9IG51bGwpCisgICAgeworICAgICAgICAvLyBzcGVjaWZ5aW5nIGEgbnVsbCAkbGVuZ3RoIHdvdWxkIHJldHVybiBhbiBlbXB0eSBzdHJpbmcKKyAgICAgICAgaWYgKCRsZW5ndGggPT09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBzdWJzdHIoJHN0ciwgJHN0YXJ0KTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzdWJzdHIoJHN0ciwgJHN0YXJ0LCAkbGVuZ3RoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gc3RybGVuKCRzdHIpCisgICAgeworICAgICAgICByZXR1cm4gc3RybGVuKCRzdHIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1N0cmluZ0Z1bmMvTWJzdHJpbmcucGhwIGIvbGliL3BocC9saWIvU3RyaW5nRnVuYy9NYnN0cmluZy5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY4ZmYxOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1N0cmluZ0Z1bmMvTWJzdHJpbmcucGhwCkBAIC0wLDAgKzEsNDYgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFN0cmluZ0Z1bmM7CisKK2NsYXNzIE1ic3RyaW5nIGltcGxlbWVudHMgVFN0cmluZ0Z1bmMKK3sKKyAgICBwdWJsaWMgZnVuY3Rpb24gc3Vic3RyKCRzdHIsICRzdGFydCwgJGxlbmd0aCA9IG51bGwpCisgICAgeworICAgICAgICAvKioKKyAgICAgICAgICogV2UgbmVlZCB0byBzZXQgdGhlIGNoYXJzZXQgcGFyYW1ldGVyLCB3aGljaCBpcyB0aGUgc2Vjb25kCisgICAgICAgICAqIG9wdGlvbmFsIHBhcmFtZXRlciBhbmQgdGhlIGZpcnN0IG9wdGlvbmFsIHBhcmFtZXRlciBjYW4ndAorICAgICAgICAgKiBiZSBudWxsIG9yIGZhbHNlIGFzIGEgIm1hZ2ljIiB2YWx1ZSBiZWNhdXNlIHRoYXQgd291bGQKKyAgICAgICAgICogY2F1c2UgYW4gZW1wdHkgc3RyaW5nIHRvIGJlIHJldHVybmVkLCBzbyB3ZSBuZWVkIHRvCisgICAgICAgICAqIGFjdHVhbGx5IGNhbGN1bGF0ZSB0aGUgcHJvcGVyIGxlbmd0aCB2YWx1ZS4KKyAgICAgICAgICovCisgICAgICAgIGlmICgkbGVuZ3RoID09PSBudWxsKSB7CisgICAgICAgICAgICAkbGVuZ3RoID0gJHRoaXMtPnN0cmxlbigkc3RyKSAtICRzdGFydDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBtYl9zdWJzdHIoJHN0ciwgJHN0YXJ0LCAkbGVuZ3RoLCAnOGJpdCcpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBzdHJsZW4oJHN0cikKKyAgICB7CisgICAgICAgIHJldHVybiBtYl9zdHJsZW4oJHN0ciwgJzhiaXQnKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9TdHJpbmdGdW5jL1RTdHJpbmdGdW5jLnBocCBiL2xpYi9waHAvbGliL1N0cmluZ0Z1bmMvVFN0cmluZ0Z1bmMucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlYTQ5N2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9TdHJpbmdGdW5jL1RTdHJpbmdGdW5jLnBocApAQCAtMCwwICsxLDI4IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxTdHJpbmdGdW5jOworCitpbnRlcmZhY2UgVFN0cmluZ0Z1bmMKK3sKKyAgICBwdWJsaWMgZnVuY3Rpb24gc3Vic3RyKCRzdHIsICRzdGFydCwgJGxlbmd0aCA9IG51bGwpOworICAgIHB1YmxpYyBmdW5jdGlvbiBzdHJsZW4oJHN0cik7Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IucGhwIGIvbGliL3BocC9saWIvVE11bHRpcGxleGVkUHJvY2Vzc29yLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjRhOTY4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvVE11bHRpcGxleGVkUHJvY2Vzc29yLnBocApAQCAtMCwwICsxLDExOCBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnByb2Nlc3NvcgorICovCisKK25hbWVzcGFjZSBUaHJpZnQ7CisKK3VzZSBUaHJpZnRcRXhjZXB0aW9uXFRFeGNlcHRpb247Cit1c2UgVGhyaWZ0XFByb3RvY29sXFRQcm90b2NvbDsKK3VzZSBUaHJpZnRcUHJvdG9jb2xcVE11bHRpcGxleGVkUHJvdG9jb2w7Cit1c2UgVGhyaWZ0XFR5cGVcVE1lc3NhZ2VUeXBlOworCisvKioKKyAqIDxjb2RlPlRNdWx0aXBsZXhlZFByb2Nlc3NvcjwvY29kZT4gaXMgYSBQcm9jZXNzb3IgYWxsb3dpbmcKKyAqIGEgc2luZ2xlIDxjb2RlPlRTZXJ2ZXI8L2NvZGU+IHRvIHByb3ZpZGUgbXVsdGlwbGUgc2VydmljZXMuCisgKgorICogPHA+VG8gZG8gc28sIHlvdSBpbnN0YW50aWF0ZSB0aGUgcHJvY2Vzc29yIGFuZCB0aGVuIHJlZ2lzdGVyIGFkZGl0aW9uYWwKKyAqIHByb2Nlc3NvcnMgd2l0aCBpdCwgYXMgc2hvd24gaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlOjwvcD4KKyAqCisgKiA8YmxvY2txdW90ZT48Y29kZT4KKyAqICAgICAkcHJvY2Vzc29yID0gbmV3IFRNdWx0aXBsZXhlZFByb2Nlc3NvcigpOworICoKKyAqICAgICBwcm9jZXNzb3ItPnJlZ2lzdGVyUHJvY2Vzc29yKAorICogICAgICAgICAiQ2FsY3VsYXRvciIsCisgKiAgICAgICAgIG5ldyBcdHV0b3JpYWxcQ2FsY3VsYXRvclByb2Nlc3NvcihuZXcgQ2FsY3VsYXRvckhhbmRsZXIoKSkpOworICoKKyAqICAgICBwcm9jZXNzb3ItPnJlZ2lzdGVyUHJvY2Vzc29yKAorICogICAgICAgICAiV2VhdGhlclJlcG9ydCIsCisgKiAgICAgICAgIG5ldyBcdHV0b3JpYWxcV2VhdGhlclJlcG9ydFByb2Nlc3NvcihuZXcgV2VhdGhlclJlcG9ydEhhbmRsZXIoKSkpOworICoKKyAqICAgICAkcHJvY2Vzc29yLT5wcm9jZXNzKCRwcm90b2NvbCwgJHByb3RvY29sKTsKKyAqIDwvY29kZT48L2Jsb2NrcXVvdGU+CisgKi8KKworY2xhc3MgVE11bHRpcGxleGVkUHJvY2Vzc29yCit7CisgICAgcHJpdmF0ZSAkc2VydmljZVByb2Nlc3Nvck1hcF87CisKKyAgICAvKioKKyAgICAgKiAnUmVnaXN0ZXInIGEgc2VydmljZSB3aXRoIHRoaXMgPGNvZGU+VE11bHRpcGxleGVkUHJvY2Vzc29yPC9jb2RlPi4gIFRoaXMKKyAgICAgKiBhbGxvd3MgdXMgdG8gYnJva2VyIHJlcXVlc3RzIHRvIGluZGl2aWR1YWwgc2VydmljZXMgYnkgdXNpbmcgdGhlIHNlcnZpY2UKKyAgICAgKiBuYW1lIHRvIHNlbGVjdCB0aGVtIGF0IHJlcXVlc3QgdGltZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXJ2aWNlTmFtZSBOYW1lIG9mIGEgc2VydmljZSwgaGFzIHRvIGJlIGlkZW50aWNhbCB0byB0aGUgbmFtZQorICAgICAqIGRlY2xhcmVkIGluIHRoZSBUaHJpZnQgSURMLCBlLmcuICJXZWF0aGVyUmVwb3J0Ii4KKyAgICAgKiBAcGFyYW0gcHJvY2Vzc29yIEltcGxlbWVudGF0aW9uIG9mIGEgc2VydmljZSwgdXN1YWxseSByZWZlcnJlZCB0bworICAgICAqIGFzICJoYW5kbGVycyIsIGUuZy4gV2VhdGhlclJlcG9ydEhhbmRsZXIgaW1wbGVtZW50aW5nIFdlYXRoZXJSZXBvcnQuSWZhY2UuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHJlZ2lzdGVyUHJvY2Vzc29yKCRzZXJ2aWNlTmFtZSwgJHByb2Nlc3NvcikKKyAgICB7CisgICAgICAgICR0aGlzLT5zZXJ2aWNlUHJvY2Vzc29yTWFwX1skc2VydmljZU5hbWVdID0gJHByb2Nlc3NvcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIDxjb2RlPnByb2Nlc3M8L2NvZGU+IHBlcmZvcm1zIHRoZSBmb2xsb3dpbmcgc3RlcHM6CisgICAgICoKKyAgICAgKiA8b2w+CisgICAgICogICAgIDxsaT5SZWFkIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG1lc3NhZ2UuPC9saT4KKyAgICAgKiAgICAgPGxpPkV4dHJhY3QgdGhlIHNlcnZpY2UgbmFtZSBmcm9tIHRoZSBtZXNzYWdlLjwvbGk+CisgICAgICogICAgIDxsaT5Vc2luZyB0aGUgc2VydmljZSBuYW1lIHRvIGxvY2F0ZSB0aGUgYXBwcm9wcmlhdGUgcHJvY2Vzc29yLjwvbGk+CisgICAgICogICAgIDxsaT5EaXNwYXRjaCB0byB0aGUgcHJvY2Vzc29yLCB3aXRoIGEgZGVjb3JhdGVkIGluc3RhbmNlIG9mIFRQcm90b2NvbAorICAgICAqICAgICAgICAgdGhhdCBhbGxvd3MgcmVhZE1lc3NhZ2VCZWdpbigpIHRvIHJldHVybiB0aGUgb3JpZ2luYWwgTWVzc2FnZS48L2xpPgorICAgICAqIDwvb2w+CisgICAgICoKKyAgICAgKiBAdGhyb3dzIFRFeGNlcHRpb24gSWYgdGhlIG1lc3NhZ2UgdHlwZSBpcyBub3QgQ0FMTCBvciBPTkVXQVksIGlmCisgICAgICogICAgICAgICAgICAgICAgICAgIHRoZSBzZXJ2aWNlIG5hbWUgd2FzIG5vdCBmb3VuZCBpbiB0aGUgbWVzc2FnZSwgb3IgaWYgdGhlIHNlcnZpY2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgbmFtZSB3YXMgbm90IGZvdW5kIGluIHRoZSBzZXJ2aWNlIG1hcC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gcHJvY2VzcyhUUHJvdG9jb2wgJGlucHV0LCBUUHJvdG9jb2wgJG91dHB1dCkKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAgICBVc2UgdGhlIGFjdHVhbCB1bmRlcmx5aW5nIHByb3RvY29sIChlLmcuIFRCaW5hcnlQcm90b2NvbCkgdG8gcmVhZCB0aGUKKyAgICAgICAgICAgIG1lc3NhZ2UgaGVhZGVyLiBUaGlzIHB1bGxzIHRoZSBtZXNzYWdlICJvZmYgdGhlIHdpcmUiLCB3aGljaCB3ZSdsbAorICAgICAgICAgICAgZGVhbCB3aXRoIGF0IHRoZSBlbmQgb2YgdGhpcyBtZXRob2QuCisgICAgICAgICovCisgICAgICAgICRpbnB1dC0+cmVhZE1lc3NhZ2VCZWdpbigkZm5hbWUsICRtdHlwZSwgJHJzZXFpZCk7CisKKyAgICAgICAgaWYgKCRtdHlwZSAhPT0gVE1lc3NhZ2VUeXBlOjpDQUxMICYmICRtdHlwZSAhPSBUTWVzc2FnZVR5cGU6Ok9ORVdBWSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIlRoaXMgc2hvdWxkIG5vdCBoYXZlIGhhcHBlbmVkIT8iKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEV4dHJhY3QgdGhlIHNlcnZpY2UgbmFtZSBhbmQgdGhlIG5ldyBNZXNzYWdlIG5hbWUuCisgICAgICAgIGlmIChzdHJwb3MoJGZuYW1lLCBUTXVsdGlwbGV4ZWRQcm90b2NvbDo6U0VQQVJBVE9SKSA9PT0gZmFsc2UpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJTZXJ2aWNlIG5hbWUgbm90IGZvdW5kIGluIG1lc3NhZ2UgbmFtZTogeyRmbmFtZX0uIERpZCB5b3UgIiAuCisgICAgICAgICAgICAgICAgImZvcmdldCB0byB1c2UgYSBUTXVsdGlwbGV4UHJvdG9jb2wgaW4geW91ciBjbGllbnQ/Iik7CisgICAgICAgIH0KKyAgICAgICAgbGlzdCgkc2VydmljZU5hbWUsICRtZXNzYWdlTmFtZSkgPSBleHBsb2RlKCc6JywgJGZuYW1lLCAyKTsKKyAgICAgICAgaWYgKCFhcnJheV9rZXlfZXhpc3RzKCRzZXJ2aWNlTmFtZSwgJHRoaXMtPnNlcnZpY2VQcm9jZXNzb3JNYXBfKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIlNlcnZpY2UgbmFtZSBub3QgZm91bmQ6IHskc2VydmljZU5hbWV9LiAgRGlkIHlvdSBmb3JnZXQgIiAuCisgICAgICAgICAgICAgICAgInRvIGNhbGwgcmVnaXN0ZXJQcm9jZXNzb3IoKT8iKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIERpc3BhdGNoIHByb2Nlc3NpbmcgdG8gdGhlIHN0b3JlZCBwcm9jZXNzb3IKKyAgICAgICAgJHByb2Nlc3NvciA9ICR0aGlzLT5zZXJ2aWNlUHJvY2Vzc29yTWFwX1skc2VydmljZU5hbWVdOworCisgICAgICAgIHJldHVybiAkcHJvY2Vzc29yLT5wcm9jZXNzKAorICAgICAgICAgICAgbmV3IFN0b3JlZE1lc3NhZ2VQcm90b2NvbCgkaW5wdXQsICRtZXNzYWdlTmFtZSwgJG10eXBlLCAkcnNlcWlkKSwKKyAgICAgICAgICAgICRvdXRwdXQKKyAgICAgICAgKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvQmFzZS9UQmFzZS5waHAgYi9saWIvcGhwL2xpYi9UaHJpZnQvQmFzZS9UQmFzZS5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkNWI1MjYuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9saWIvVGhyaWZ0L0Jhc2UvVEJhc2UucGhwCisrKyAvZGV2L251bGwKQEAgLTEsMzY3ICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdAotICovCi0KLW5hbWVzcGFjZSBUaHJpZnRcQmFzZTsKLQotdXNlIFRocmlmdFxUeXBlXFRUeXBlOwotCi0vKioKLSAqIEJhc2UgY2xhc3MgZnJvbSB3aGljaCBvdGhlciBUaHJpZnQgc3RydWN0cyBleHRlbmQuIFRoaXMgaXMgc28gdGhhdCB3ZSBjYW4KLSAqIGN1dCBiYWNrIG9uIHRoZSBzaXplIG9mIHRoZSBnZW5lcmF0ZWQgY29kZSB3aGljaCBpcyB0dXJuaW5nIG91dCB0byBoYXZlIGEKLSAqIG5vbnRyaXZpYWwgY29zdCBqdXN0IHRvIGxvYWQgdGhhbmtzIHRvIHRoZSB3b25kcm91c2x5IGFieXNtYWwgaW1wbGVtZW50YXRpb24KLSAqIG9mIFBIUC4gTm90ZSB0aGF0IGNvZGUgaXMgaW50ZW50aW9uYWxseSBkdXBsaWNhdGVkIGluIGhlcmUgdG8gYXZvaWQgbWFraW5nCi0gKiBmdW5jdGlvbiBjYWxscyBmb3IgZXZlcnkgZmllbGQgb3IgbWVtYmVyIG9mIGEgY29udGFpbmVyLi4KLSAqLwotYWJzdHJhY3QgY2xhc3MgVEJhc2UgewotCi0gIHN0YXRpYyAkdG1ldGhvZCA9IGFycmF5KFRUeXBlOjpCT09MICAgPT4gJ0Jvb2wnLAotICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZTo6QllURSAgID0+ICdCeXRlJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGU6OkkxNiAgICA9PiAnSTE2JywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGU6OkkzMiAgICA9PiAnSTMyJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGU6Okk2NCAgICA9PiAnSTY0JywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGU6OkRPVUJMRSA9PiAnRG91YmxlJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGU6OlNUUklORyA9PiAnU3RyaW5nJyk7Ci0KLSAgYWJzdHJhY3QgZnVuY3Rpb24gcmVhZCgkaW5wdXQpOwotCi0gIGFic3RyYWN0IGZ1bmN0aW9uIHdyaXRlKCRvdXRwdXQpOwotCi0gIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkc3BlYz1udWxsLCAkdmFscz1udWxsKSB7Ci0gICAgaWYgKGlzX2FycmF5KCRzcGVjKSAmJiBpc19hcnJheSgkdmFscykpIHsKLSAgICAgIGZvcmVhY2ggKCRzcGVjIGFzICRmaWQgPT4gJGZzcGVjKSB7Ci0gICAgICAgICR2YXIgPSAkZnNwZWNbJ3ZhciddOwotICAgICAgICBpZiAoaXNzZXQoJHZhbHNbJHZhcl0pKSB7Ci0gICAgICAgICAgJHRoaXMtPiR2YXIgPSAkdmFsc1skdmFyXTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiBfX3dha2V1cCgpCi0gIHsKLSAgICAkdGhpcy0+X19jb25zdHJ1Y3QoZ2V0X29iamVjdF92YXJzKCR0aGlzKSk7Ci0gIH0KLQotICBwcml2YXRlIGZ1bmN0aW9uIF9yZWFkTWFwKCYkdmFyLCAkc3BlYywgJGlucHV0KSB7Ci0gICAgJHhmZXIgPSAwOwotICAgICRrdHlwZSA9ICRzcGVjWydrdHlwZSddOwotICAgICR2dHlwZSA9ICRzcGVjWyd2dHlwZSddOwotICAgICRrcmVhZCA9ICR2cmVhZCA9IG51bGw7Ci0gICAgaWYgKGlzc2V0KFRCYXNlOjokdG1ldGhvZFska3R5cGVdKSkgewotICAgICAgJGtyZWFkID0gJ3JlYWQnLlRCYXNlOjokdG1ldGhvZFska3R5cGVdOwotICAgIH0gZWxzZSB7Ci0gICAgICAka3NwZWMgPSAkc3BlY1sna2V5J107Ci0gICAgfQotICAgIGlmIChpc3NldChUQmFzZTo6JHRtZXRob2RbJHZ0eXBlXSkpIHsKLSAgICAgICR2cmVhZCA9ICdyZWFkJy5UQmFzZTo6JHRtZXRob2RbJHZ0eXBlXTsKLSAgICB9IGVsc2UgewotICAgICAgJHZzcGVjID0gJHNwZWNbJ3ZhbCddOwotICAgIH0KLSAgICAkdmFyID0gYXJyYXkoKTsKLSAgICAkX2t0eXBlID0gJF92dHlwZSA9ICRzaXplID0gMDsKLSAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRNYXBCZWdpbigkX2t0eXBlLCAkX3Z0eXBlLCAkc2l6ZSk7Ci0gICAgZm9yICgkaSA9IDA7ICRpIDwgJHNpemU7ICsrJGkpIHsKLSAgICAgICRrZXkgPSAkdmFsID0gbnVsbDsKLSAgICAgIGlmICgka3JlYWQgIT09IG51bGwpIHsKLSAgICAgICAgJHhmZXIgKz0gJGlucHV0LT4ka3JlYWQoJGtleSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzd2l0Y2ggKCRrdHlwZSkgewotICAgICAgICBjYXNlIFRUeXBlOjpTVFJVQ1Q6Ci0gICAgICAgICAgJGNsYXNzID0gJGtzcGVjWydjbGFzcyddOwotICAgICAgICAgICRrZXkgPSBuZXcgJGNsYXNzKCk7Ci0gICAgICAgICAgJHhmZXIgKz0gJGtleS0+cmVhZCgkaW5wdXQpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRUeXBlOjpNQVA6Ci0gICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTWFwKCRrZXksICRrc3BlYywgJGlucHV0KTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUVHlwZTo6TFNUOgotICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fcmVhZExpc3QoJGtleSwgJGtzcGVjLCAkaW5wdXQsIGZhbHNlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgotICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fcmVhZExpc3QoJGtleSwgJGtzcGVjLCAkaW5wdXQsIHRydWUpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoJHZyZWFkICE9PSBudWxsKSB7Ci0gICAgICAgICR4ZmVyICs9ICRpbnB1dC0+JHZyZWFkKCR2YWwpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc3dpdGNoICgkdnR5cGUpIHsKLSAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgotICAgICAgICAgICRjbGFzcyA9ICR2c3BlY1snY2xhc3MnXTsKLSAgICAgICAgICAkdmFsID0gbmV3ICRjbGFzcygpOwotICAgICAgICAgICR4ZmVyICs9ICR2YWwtPnJlYWQoJGlucHV0KTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgotICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fcmVhZE1hcCgkdmFsLCAkdnNwZWMsICRpbnB1dCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKLSAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRMaXN0KCR2YWwsICR2c3BlYywgJGlucHV0LCBmYWxzZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVFR5cGU6OlNFVDoKLSAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRMaXN0KCR2YWwsICR2c3BlYywgJGlucHV0LCB0cnVlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgJHZhclska2V5XSA9ICR2YWw7Ci0gICAgfQotICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZE1hcEVuZCgpOwotICAgIHJldHVybiAkeGZlcjsKLSAgfQotCi0gIHByaXZhdGUgZnVuY3Rpb24gX3JlYWRMaXN0KCYkdmFyLCAkc3BlYywgJGlucHV0LCAkc2V0PWZhbHNlKSB7Ci0gICAgJHhmZXIgPSAwOwotICAgICRldHlwZSA9ICRzcGVjWydldHlwZSddOwotICAgICRlcmVhZCA9ICR2cmVhZCA9IG51bGw7Ci0gICAgaWYgKGlzc2V0KFRCYXNlOjokdG1ldGhvZFskZXR5cGVdKSkgewotICAgICAgJGVyZWFkID0gJ3JlYWQnLlRCYXNlOjokdG1ldGhvZFskZXR5cGVdOwotICAgIH0gZWxzZSB7Ci0gICAgICAkZXNwZWMgPSAkc3BlY1snZWxlbSddOwotICAgIH0KLSAgICAkdmFyID0gYXJyYXkoKTsKLSAgICAkX2V0eXBlID0gJHNpemUgPSAwOwotICAgIGlmICgkc2V0KSB7Ci0gICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRTZXRCZWdpbigkX2V0eXBlLCAkc2l6ZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZExpc3RCZWdpbigkX2V0eXBlLCAkc2l6ZSk7Ci0gICAgfQotICAgIGZvciAoJGkgPSAwOyAkaSA8ICRzaXplOyArKyRpKSB7Ci0gICAgICAkZWxlbSA9IG51bGw7Ci0gICAgICBpZiAoJGVyZWFkICE9PSBudWxsKSB7Ci0gICAgICAgICR4ZmVyICs9ICRpbnB1dC0+JGVyZWFkKCRlbGVtKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgICRlc3BlYyA9ICRzcGVjWydlbGVtJ107Ci0gICAgICAgIHN3aXRjaCAoJGV0eXBlKSB7Ci0gICAgICAgIGNhc2UgVFR5cGU6OlNUUlVDVDoKLSAgICAgICAgICAkY2xhc3MgPSAkZXNwZWNbJ2NsYXNzJ107Ci0gICAgICAgICAgJGVsZW0gPSBuZXcgJGNsYXNzKCk7Ci0gICAgICAgICAgJHhmZXIgKz0gJGVsZW0tPnJlYWQoJGlucHV0KTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgotICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fcmVhZE1hcCgkZWxlbSwgJGVzcGVjLCAkaW5wdXQpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRUeXBlOjpMU1Q6Ci0gICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTGlzdCgkZWxlbSwgJGVzcGVjLCAkaW5wdXQsIGZhbHNlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgotICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fcmVhZExpc3QoJGVsZW0sICRlc3BlYywgJGlucHV0LCB0cnVlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKCRzZXQpIHsKLSAgICAgICAgJHZhclskZWxlbV0gPSB0cnVlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgJHZhciBbXT0gJGVsZW07Ci0gICAgICB9Ci0gICAgfQotICAgIGlmICgkc2V0KSB7Ci0gICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRTZXRFbmQoKTsKLSAgICB9IGVsc2UgewotICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkTGlzdEVuZCgpOwotICAgIH0KLSAgICByZXR1cm4gJHhmZXI7Ci0gIH0KLQotICBwcm90ZWN0ZWQgZnVuY3Rpb24gX3JlYWQoJGNsYXNzLCAkc3BlYywgJGlucHV0KSB7Ci0gICAgJHhmZXIgPSAwOwotICAgICRmbmFtZSA9IG51bGw7Ci0gICAgJGZ0eXBlID0gMDsKLSAgICAkZmlkID0gMDsKLSAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRTdHJ1Y3RCZWdpbigkZm5hbWUpOwotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRGaWVsZEJlZ2luKCRmbmFtZSwgJGZ0eXBlLCAkZmlkKTsKLSAgICAgIGlmICgkZnR5cGUgPT0gVFR5cGU6OlNUT1ApIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBpZiAoaXNzZXQoJHNwZWNbJGZpZF0pKSB7Ci0gICAgICAgICRmc3BlYyA9ICRzcGVjWyRmaWRdOwotICAgICAgICAkdmFyID0gJGZzcGVjWyd2YXInXTsKLSAgICAgICAgaWYgKCRmdHlwZSA9PSAkZnNwZWNbJ3R5cGUnXSkgewotICAgICAgICAgICR4ZmVyID0gMDsKLSAgICAgICAgICBpZiAoaXNzZXQoVEJhc2U6OiR0bWV0aG9kWyRmdHlwZV0pKSB7Ci0gICAgICAgICAgICAkZnVuYyA9ICdyZWFkJy5UQmFzZTo6JHRtZXRob2RbJGZ0eXBlXTsKLSAgICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+JGZ1bmMoJHRoaXMtPiR2YXIpOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKCRmdHlwZSkgewotICAgICAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgotICAgICAgICAgICAgICAkY2xhc3MgPSAkZnNwZWNbJ2NsYXNzJ107Ci0gICAgICAgICAgICAgICR0aGlzLT4kdmFyID0gbmV3ICRjbGFzcygpOwotICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+JHZhci0+cmVhZCgkaW5wdXQpOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgVFR5cGU6Ok1BUDoKLSAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTWFwKCR0aGlzLT4kdmFyLCAkZnNwZWMsICRpbnB1dCk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBUVHlwZTo6TFNUOgotICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRMaXN0KCR0aGlzLT4kdmFyLCAkZnNwZWMsICRpbnB1dCwgZmFsc2UpOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgVFR5cGU6OlNFVDoKLSAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTGlzdCgkdGhpcy0+JHZhciwgJGZzcGVjLCAkaW5wdXQsIHRydWUpOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5za2lwKCRmdHlwZSk7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgICR4ZmVyICs9ICRpbnB1dC0+c2tpcCgkZnR5cGUpOwotICAgICAgfQotICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkRmllbGRFbmQoKTsKLSAgICB9Ci0gICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkU3RydWN0RW5kKCk7Ci0gICAgcmV0dXJuICR4ZmVyOwotICB9Ci0KLSAgcHJpdmF0ZSBmdW5jdGlvbiBfd3JpdGVNYXAoJHZhciwgJHNwZWMsICRvdXRwdXQpIHsKLSAgICAkeGZlciA9IDA7Ci0gICAgJGt0eXBlID0gJHNwZWNbJ2t0eXBlJ107Ci0gICAgJHZ0eXBlID0gJHNwZWNbJ3Z0eXBlJ107Ci0gICAgJGt3cml0ZSA9ICR2d3JpdGUgPSBudWxsOwotICAgIGlmIChpc3NldChUQmFzZTo6JHRtZXRob2RbJGt0eXBlXSkpIHsKLSAgICAgICRrd3JpdGUgPSAnd3JpdGUnLlRCYXNlOjokdG1ldGhvZFska3R5cGVdOwotICAgIH0gZWxzZSB7Ci0gICAgICAka3NwZWMgPSAkc3BlY1sna2V5J107Ci0gICAgfQotICAgIGlmIChpc3NldChUQmFzZTo6JHRtZXRob2RbJHZ0eXBlXSkpIHsKLSAgICAgICR2d3JpdGUgPSAnd3JpdGUnLlRCYXNlOjokdG1ldGhvZFskdnR5cGVdOwotICAgIH0gZWxzZSB7Ci0gICAgICAkdnNwZWMgPSAkc3BlY1sndmFsJ107Ci0gICAgfQotICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlTWFwQmVnaW4oJGt0eXBlLCAkdnR5cGUsIGNvdW50KCR2YXIpKTsKLSAgICBmb3JlYWNoICgkdmFyIGFzICRrZXkgPT4gJHZhbCkgewotICAgICAgaWYgKGlzc2V0KCRrd3JpdGUpKSB7Ci0gICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPiRrd3JpdGUoJGtleSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzd2l0Y2ggKCRrdHlwZSkgewotICAgICAgICBjYXNlIFRUeXBlOjpTVFJVQ1Q6Ci0gICAgICAgICAgJHhmZXIgKz0gJGtleS0+d3JpdGUoJG91dHB1dCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVFR5cGU6Ok1BUDoKLSAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTWFwKCRrZXksICRrc3BlYywgJG91dHB1dCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKLSAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTGlzdCgka2V5LCAka3NwZWMsICRvdXRwdXQsIGZhbHNlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgotICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVMaXN0KCRrZXksICRrc3BlYywgJG91dHB1dCwgdHJ1ZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChpc3NldCgkdndyaXRlKSkgewotICAgICAgICAkeGZlciArPSAkb3V0cHV0LT4kdndyaXRlKCR2YWwpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc3dpdGNoICgkdnR5cGUpIHsKLSAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgotICAgICAgICAgICR4ZmVyICs9ICR2YWwtPndyaXRlKCRvdXRwdXQpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRUeXBlOjpNQVA6Ci0gICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZU1hcCgkdmFsLCAkdnNwZWMsICRvdXRwdXQpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRUeXBlOjpMU1Q6Ci0gICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZUxpc3QoJHZhbCwgJHZzcGVjLCAkb3V0cHV0LCBmYWxzZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVFR5cGU6OlNFVDoKLSAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTGlzdCgkdmFsLCAkdnNwZWMsICRvdXRwdXQsIHRydWUpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlTWFwRW5kKCk7Ci0gICAgcmV0dXJuICR4ZmVyOwotICB9Ci0KLSAgcHJpdmF0ZSBmdW5jdGlvbiBfd3JpdGVMaXN0KCR2YXIsICRzcGVjLCAkb3V0cHV0LCAkc2V0PWZhbHNlKSB7Ci0gICAgJHhmZXIgPSAwOwotICAgICRldHlwZSA9ICRzcGVjWydldHlwZSddOwotICAgICRld3JpdGUgPSBudWxsOwotICAgIGlmIChpc3NldChUQmFzZTo6JHRtZXRob2RbJGV0eXBlXSkpIHsKLSAgICAgICRld3JpdGUgPSAnd3JpdGUnLlRCYXNlOjokdG1ldGhvZFskZXR5cGVdOwotICAgIH0gZWxzZSB7Ci0gICAgICAkZXNwZWMgPSAkc3BlY1snZWxlbSddOwotICAgIH0KLSAgICBpZiAoJHNldCkgewotICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTZXRCZWdpbigkZXR5cGUsIGNvdW50KCR2YXIpKTsKLSAgICB9IGVsc2UgewotICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVMaXN0QmVnaW4oJGV0eXBlLCBjb3VudCgkdmFyKSk7Ci0gICAgfQotICAgIGZvcmVhY2ggKCR2YXIgYXMgJGtleSA9PiAkdmFsKSB7Ci0gICAgICAkZWxlbSA9ICRzZXQgPyAka2V5IDogJHZhbDsKLSAgICAgIGlmIChpc3NldCgkZXdyaXRlKSkgewotICAgICAgICAkeGZlciArPSAkb3V0cHV0LT4kZXdyaXRlKCRlbGVtKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHN3aXRjaCAoJGV0eXBlKSB7Ci0gICAgICAgIGNhc2UgVFR5cGU6OlNUUlVDVDoKLSAgICAgICAgICAkeGZlciArPSAkZWxlbS0+d3JpdGUoJG91dHB1dCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVFR5cGU6Ok1BUDoKLSAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTWFwKCRlbGVtLCAkZXNwZWMsICRvdXRwdXQpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRUeXBlOjpMU1Q6Ci0gICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZUxpc3QoJGVsZW0sICRlc3BlYywgJG91dHB1dCwgZmFsc2UpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRUeXBlOjpTRVQ6Ci0gICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZUxpc3QoJGVsZW0sICRlc3BlYywgJG91dHB1dCwgdHJ1ZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKCRzZXQpIHsKLSAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU2V0RW5kKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlTGlzdEVuZCgpOwotICAgIH0KLSAgICByZXR1cm4gJHhmZXI7Ci0gIH0KLQotICBwcm90ZWN0ZWQgZnVuY3Rpb24gX3dyaXRlKCRjbGFzcywgJHNwZWMsICRvdXRwdXQpIHsKLSAgICAkeGZlciA9IDA7Ci0gICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTdHJ1Y3RCZWdpbigkY2xhc3MpOwotICAgIGZvcmVhY2ggKCRzcGVjIGFzICRmaWQgPT4gJGZzcGVjKSB7Ci0gICAgICAkdmFyID0gJGZzcGVjWyd2YXInXTsKLSAgICAgIGlmICgkdGhpcy0+JHZhciAhPT0gbnVsbCkgewotICAgICAgICAkZnR5cGUgPSAkZnNwZWNbJ3R5cGUnXTsKLSAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZEJlZ2luKCR2YXIsICRmdHlwZSwgJGZpZCk7Ci0gICAgICAgIGlmIChpc3NldChUQmFzZTo6JHRtZXRob2RbJGZ0eXBlXSkpIHsKLSAgICAgICAgICAkZnVuYyA9ICd3cml0ZScuVEJhc2U6OiR0bWV0aG9kWyRmdHlwZV07Ci0gICAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+JGZ1bmMoJHRoaXMtPiR2YXIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHN3aXRjaCAoJGZ0eXBlKSB7Ci0gICAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgotICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPiR2YXItPndyaXRlKCRvdXRwdXQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgotICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZU1hcCgkdGhpcy0+JHZhciwgJGZzcGVjLCAkb3V0cHV0KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKLSAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVMaXN0KCR0aGlzLT4kdmFyLCAkZnNwZWMsICRvdXRwdXQsIGZhbHNlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgVFR5cGU6OlNFVDoKLSAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVMaXN0KCR0aGlzLT4kdmFyLCAkZnNwZWMsICRvdXRwdXQsIHRydWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRFbmQoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZFN0b3AoKTsKLSAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZVN0cnVjdEVuZCgpOwotICAgIHJldHVybiAkeGZlcjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVGhyaWZ0L0NsYXNzTG9hZGVyL1RocmlmdENsYXNzTG9hZGVyLnBocCBiL2xpYi9waHAvbGliL1RocmlmdC9DbGFzc0xvYWRlci9UaHJpZnRDbGFzc0xvYWRlci5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjZTkzZjUuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9saWIvVGhyaWZ0L0NsYXNzTG9hZGVyL1RocmlmdENsYXNzTG9hZGVyLnBocAorKysgL2Rldi9udWxsCkBAIC0xLDIyMyArMCwwIEBACi08P3BocAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBDbGFzc0xvYWRlciB0byBsb2FkIFRocmlmdCBsaWJyYXJ5IGFuZCBkZWZpbml0aW9ucwotICogSW5zcGlyZWQgZnJvbSBVbml2ZXJzYWxDbGFzc0xvYWRlciBmcm9tIFN5bWZvbnkgMiAKLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQuY2xhc3Nsb2FkZXIKLSAqLwotCi1uYW1lc3BhY2UgVGhyaWZ0XENsYXNzTG9hZGVyOwotCi1jbGFzcyBUaHJpZnRDbGFzc0xvYWRlcgotewotICAgIC8qKgotICAgICAqIE5hbWVzcGFjZXMgcGF0aAotICAgICAqIEB2YXIgYXJyYXkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgJG5hbWVzcGFjZXMgPSBhcnJheSgpOwotCi0gICAgLyoqCi0gICAgICogVGhyaWZ0IGRlZmluaXRpb24gcGF0aHMKLSAgICAgKiBAdmFyIHR5cGUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgJGRlZmluaXRpb25zID0gYXJyYXkoKTsKLQotICAgIC8qKgotICAgICAqIERvIHdlIHVzZSBBUEMgY2FjaGUgPwotICAgICAqIEB2YXIgYm9vbGVhbgotICAgICAqLwotICAgIHByb3RlY3RlZCAkYXBjID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBBUEMgQ2FjaGUgcHJlZml4Ci0gICAgICogQHZhciBzdHJpbmcKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgJGFwY19wcmVmaXg7Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgYXV0b2xvYWRlciB0byB1c2UgQVBDIGNhY2hlCi0gICAgICogQHBhcmFtIGJvb2xlYW4gJGFwYwotICAgICAqIEBwYXJhbSBzdHJpbmcgJGFwY19wcmVmaXgKLSAgICAgKi8KLSAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGFwYyA9IGZhbHNlLCAkYXBjX3ByZWZpeCA9IG51bGwpCi0gICAgewotICAgICAgICAkdGhpcy0+YXBjID0gJGFwYzsKLSAgICAgICAgJHRoaXMtPmFwY19wcmVmaXggPSAkYXBjX3ByZWZpeDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWdpc3RlcnMgYSBuYW1lc3BhY2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3RyaW5nICAgICAgICRuYW1lc3BhY2UgVGhlIG5hbWVzcGFjZQotICAgICAqIEBwYXJhbSBhcnJheXxzdHJpbmcgJHBhdGhzICAgICBUaGUgbG9jYXRpb24ocykgb2YgdGhlIG5hbWVzcGFjZQotICAgICAqLwotICAgIHB1YmxpYyBmdW5jdGlvbiByZWdpc3Rlck5hbWVzcGFjZSgkbmFtZXNwYWNlLCAkcGF0aHMpCi0gICAgewotICAgICAgICAkdGhpcy0+bmFtZXNwYWNlc1skbmFtZXNwYWNlXSA9IChhcnJheSkgJHBhdGhzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlZ2lzdGVycyBhIFRocmlmdCBkZWZpbml0aW9uIG5hbWVzcGFjZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzdHJpbmcgICAgICAgJG5hbWVzcGFjZSBUaGUgZGVmaW5pdGlvbiBuYW1lc3BhY2UKLSAgICAgKiBAcGFyYW0gYXJyYXl8c3RyaW5nICRwYXRocyAgICAgVGhlIGxvY2F0aW9uKHMpIG9mIHRoZSBkZWZpbml0aW9uIG5hbWVzcGFjZQotICAgICAqLwotICAgIHB1YmxpYyBmdW5jdGlvbiByZWdpc3RlckRlZmluaXRpb24oJG5hbWVzcGFjZSwgJHBhdGhzKQotICAgIHsKLSAgICAgICAgJHRoaXMtPmRlZmluaXRpb25zWyRuYW1lc3BhY2VdID0gKGFycmF5KSAkcGF0aHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVnaXN0ZXJzIHRoaXMgaW5zdGFuY2UgYXMgYW4gYXV0b2xvYWRlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBCb29sZWFuICRwcmVwZW5kIFdoZXRoZXIgdG8gcHJlcGVuZCB0aGUgYXV0b2xvYWRlciBvciBub3QKLSAgICAgKi8KLSAgICBwdWJsaWMgZnVuY3Rpb24gcmVnaXN0ZXIoJHByZXBlbmQgPSBmYWxzZSkKLSAgICB7Ci0gICAgICAgIHNwbF9hdXRvbG9hZF9yZWdpc3RlcihhcnJheSgkdGhpcywgJ2xvYWRDbGFzcycpLCB0cnVlLCAkcHJlcGVuZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTG9hZHMgdGhlIGdpdmVuIGNsYXNzLCBkZWZpbml0aW9uIG9yIGludGVyZmFjZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzdHJpbmcgJGNsYXNzIFRoZSBuYW1lIG9mIHRoZSBjbGFzcwotICAgICAqLwotICAgIHB1YmxpYyBmdW5jdGlvbiBsb2FkQ2xhc3MoJGNsYXNzKQotICAgIHsKLSAgICAgICAgaWYgKAotICAgICAgICAgICAgKHRydWUgPT09ICR0aGlzLT5hcGMgJiYgKCRmaWxlID0gJHRoaXMtPmZpbmRGaWxlSW5BcGMoJGNsYXNzKSkpIG9yCi0gICAgICAgICAgICAoJGZpbGUgPSAkdGhpcy0+ZmluZEZpbGUoJGNsYXNzKSkKLSAgICAgICAgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXF1aXJlX29uY2UgJGZpbGU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMb2FkcyB0aGUgZ2l2ZW4gY2xhc3Mgb3IgaW50ZXJmYWNlIGluIEFQQy4KLSAgICAgKiBAcGFyYW0gc3RyaW5nICRjbGFzcyBUaGUgbmFtZSBvZiB0aGUgY2xhc3MKLSAgICAgKiBAcmV0dXJuIHN0cmluZwotICAgICAqLwotICAgIHByb3RlY3RlZCBmdW5jdGlvbiBmaW5kRmlsZUluQXBjKCRjbGFzcykKLSAgICB7Ci0gICAgICAgIGlmIChmYWxzZSA9PT0gJGZpbGUgPSBhcGNfZmV0Y2goJHRoaXMtPmFwY19wcmVmaXguJGNsYXNzKSkgewotICAgICAgICAgICAgYXBjX3N0b3JlKCR0aGlzLT5hcGNfcHJlZml4LiRjbGFzcywgJGZpbGUgPSAkdGhpcy0+ZmluZEZpbGUoJGNsYXNzKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gJGZpbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmluZCBjbGFzcyBpbiBuYW1lc3BhY2VzIG9yIGRlZmluaXRpb25zIGRpcmVjdG9yaWVzCi0gICAgICogQHBhcmFtIHN0cmluZyAkY2xhc3MKLSAgICAgKiBAcmV0dXJuIHN0cmluZwotICAgICAqLwotICAgIHB1YmxpYyBmdW5jdGlvbiBmaW5kRmlsZSgkY2xhc3MpCi0gICAgewotICAgICAgICAvLyBSZW1vdmUgZmlyc3QgYmFja3NsYXNoCi0gICAgICAgIGlmICgnXFwnID09ICRjbGFzc1swXSkKLSAgICAgICAgewotICAgICAgICAgICAgJGNsYXNzID0gc3Vic3RyKCRjbGFzcywgMSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZmFsc2UgIT09ICRwb3MgPSBzdHJycG9zKCRjbGFzcywgJ1xcJykpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIE5hbWVzcGFjZWQgY2xhc3MgbmFtZQotICAgICAgICAgICAgJG5hbWVzcGFjZSA9IHN1YnN0cigkY2xhc3MsIDAsICRwb3MpOwotCi0gICAgICAgICAgICAvLyBJdGVyYXRlIGluIG5vcm1hbCBuYW1lc3BhY2VzCi0gICAgICAgICAgICBmb3JlYWNoICgkdGhpcy0+bmFtZXNwYWNlcyBhcyAkbnMgPT4gJGRpcnMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy9Eb24ndCBpbnRlcmZlcmUgd2l0aCBvdGhlciBhdXRvbG9hZGVycwotICAgICAgICAgICAgICAgIGlmICgwICE9PSBzdHJwb3MoJG5hbWVzcGFjZSwgJG5zKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRkaXJzIGFzICRkaXIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAkY2xhc3NOYW1lID0gc3Vic3RyKCRjbGFzcywgJHBvcyArIDEpOwotCi0gICAgICAgICAgICAgICAgICAgICRmaWxlID0gJGRpci5ESVJFQ1RPUllfU0VQQVJBVE9SLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX3JlcGxhY2UoJ1xcJywgRElSRUNUT1JZX1NFUEFSQVRPUiwgJG5hbWVzcGFjZSkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESVJFQ1RPUllfU0VQQVJBVE9SLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNsYXNzTmFtZS4nLnBocCc7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGVfZXhpc3RzKCRmaWxlKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRmaWxlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBJdGVyYXRlIGluIFRocmlmdCBuYW1lc3BhY2VzCi0KLSAgICAgICAgICAgIC8vIFJlbW92ZSBmaXJzdCBwYXJ0IG9mIG5hbWVzcGFjZQotICAgICAgICAgICAgJG0gPSBleHBsb2RlKCdcXCcsICRjbGFzcyk7Ci0KLSAgICAgICAgICAgIC8vIElnbm9yZSB3cm9uZyBjYWxsCi0gICAgICAgICAgICBpZihjb3VudCgkbSkgPD0gMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICRjbGFzcyA9IGFycmF5X3BvcCgkbSk7Ci0gICAgICAgICAgICAkbmFtZXNwYWNlID0gaW1wbG9kZSgnXFwnLCAkbSk7Ci0KLSAgICAgICAgICAgIGZvcmVhY2ggKCR0aGlzLT5kZWZpbml0aW9ucyBhcyAkbnMgPT4gJGRpcnMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy9Eb24ndCBpbnRlcmZlcmUgd2l0aCBvdGhlciBhdXRvbG9hZGVycwotICAgICAgICAgICAgICAgIGlmICgwICE9PSBzdHJwb3MoJG5hbWVzcGFjZSwgJG5zKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRkaXJzIGFzICRkaXIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICogQXZhaWxhYmxlIGluIHNlcnZpY2U6IEludGVyZmFjZSwgQ2xpZW50LCBQcm9jZXNzb3IsIFJlc3QKLSAgICAgICAgICAgICAgICAgICAgICogQW5kIGV2ZXJ5IHNlcnZpY2UgbWV0aG9kcyAoXy4rKQotICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYoCi0gICAgICAgICAgICAgICAgICAgICAgICAwID09PSBwcmVnX21hdGNoKCcjKC4rKShpZnxjbGllbnR8cHJvY2Vzc29yfHJlc3QpJCNpJywgJGNsYXNzLCAkbikgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAwID09PSBwcmVnX21hdGNoKCcjKC4rKV9bYS16MC05XStfKGFyZ3N8cmVzdWx0KSQjaScsICRjbGFzcywgJG4pCi0gICAgICAgICAgICAgICAgICAgICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgJGNsYXNzTmFtZSA9ICdUeXBlcyc7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAkY2xhc3NOYW1lID0gJG5bMV07Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAkZmlsZSA9ICRkaXIuRElSRUNUT1JZX1NFUEFSQVRPUiAuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfcmVwbGFjZSgnXFwnLCBESVJFQ1RPUllfU0VQQVJBVE9SLCAkbmFtZXNwYWNlKSAuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESVJFQ1RPUllfU0VQQVJBVE9SIC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjbGFzc05hbWUgLiAnLnBocCc7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGVfZXhpc3RzKCRmaWxlKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRmaWxlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVGhyaWZ0L0V4Y2VwdGlvbi9UQXBwbGljYXRpb25FeGNlcHRpb24ucGhwIGIvbGliL3BocC9saWIvVGhyaWZ0L0V4Y2VwdGlvbi9UQXBwbGljYXRpb25FeGNlcHRpb24ucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDgxOTczLi4wMDAwMDAwCi0tLSBhL2xpYi9waHAvbGliL1RocmlmdC9FeGNlcHRpb24vVEFwcGxpY2F0aW9uRXhjZXB0aW9uLnBocAorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdAotICovCi0KLW5hbWVzcGFjZSBUaHJpZnRcRXhjZXB0aW9uOwotCi11c2UgVGhyaWZ0XEV4Y2VwdGlvblxURXhjZXB0aW9uOwotdXNlIFRocmlmdFxUeXBlXFRUeXBlOwotCi1jbGFzcyBUQXBwbGljYXRpb25FeGNlcHRpb24gZXh0ZW5kcyBURXhjZXB0aW9uIHsKLSAgc3RhdGljICRfVFNQRUMgPQotICAgIGFycmF5KDEgPT4gYXJyYXkoJ3ZhcicgPT4gJ21lc3NhZ2UnLAotICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnID0+IFRUeXBlOjpTVFJJTkcpLAotICAgICAgICAgIDIgPT4gYXJyYXkoJ3ZhcicgPT4gJ2NvZGUnLAotICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnID0+IFRUeXBlOjpJMzIpKTsKLQotICBjb25zdCBVTktOT1dOID0gMDsKLSAgY29uc3QgVU5LTk9XTl9NRVRIT0QgPSAxOwotICBjb25zdCBJTlZBTElEX01FU1NBR0VfVFlQRSA9IDI7Ci0gIGNvbnN0IFdST05HX01FVEhPRF9OQU1FID0gMzsKLSAgY29uc3QgQkFEX1NFUVVFTkNFX0lEID0gNDsKLSAgY29uc3QgTUlTU0lOR19SRVNVTFQgPSA1OwotICBjb25zdCBJTlRFUk5BTF9FUlJPUiA9IDY7Ci0gIGNvbnN0IFBST1RPQ09MX0VSUk9SID0gNzsKLSAgY29uc3QgSU5WQUxJRF9UUkFOU0ZPUk0gPSA4OwotICBjb25zdCBJTlZBTElEX1BST1RPQ09MID0gOTsKLSAgY29uc3QgVU5TVVBQT1JURURfQ0xJRU5UX1RZUEUgPSAxMDsKLQotICBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkbWVzc2FnZT1udWxsLCAkY29kZT0wKSB7Ci0gICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkbWVzc2FnZSwgJGNvZGUpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWQoJG91dHB1dCkgewotICAgIHJldHVybiAkdGhpcy0+X3JlYWQoJ1RBcHBsaWNhdGlvbkV4Y2VwdGlvbicsIHNlbGY6OiRfVFNQRUMsICRvdXRwdXQpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlKCRvdXRwdXQpIHsKLSAgICAkeGZlciA9IDA7Ci0gICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTdHJ1Y3RCZWdpbignVEFwcGxpY2F0aW9uRXhjZXB0aW9uJyk7Ci0gICAgaWYgKCRtZXNzYWdlID0gJHRoaXMtPmdldE1lc3NhZ2UoKSkgewotICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZEJlZ2luKCdtZXNzYWdlJywgVFR5cGU6OlNUUklORywgMSk7Ci0gICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZVN0cmluZygkbWVzc2FnZSk7Ci0gICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkRW5kKCk7Ci0gICAgfQotICAgIGlmICgkY29kZSA9ICR0aGlzLT5nZXRDb2RlKCkpIHsKLSAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRCZWdpbigndHlwZScsIFRUeXBlOjpJMzIsIDIpOwotICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVJMzIoJGNvZGUpOwotICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZEVuZCgpOwotICAgIH0KLSAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkU3RvcCgpOwotICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU3RydWN0RW5kKCk7Ci0gICAgcmV0dXJuICR4ZmVyOwotICB9Ci19CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvRXhjZXB0aW9uL1RFeGNlcHRpb24ucGhwIGIvbGliL3BocC9saWIvVGhyaWZ0L0V4Y2VwdGlvbi9URXhjZXB0aW9uLnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU4Y2QyOC4uMDAwMDAwMAotLS0gYS9saWIvcGhwL2xpYi9UaHJpZnQvRXhjZXB0aW9uL1RFeGNlcHRpb24ucGhwCisrKyAvZGV2L251bGwKQEAgLTEsMzY5ICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdAotICovCi0KLW5hbWVzcGFjZSBUaHJpZnRcRXhjZXB0aW9uOwotCi11c2UgVGhyaWZ0XFR5cGVcVFR5cGU7Ci11c2UgVGhyaWZ0XEJhc2VcVEJhc2U7Ci0KLS8qKgotICogTk9URShtY3NsZWUpOiBUaGlzIGN1cnJlbnRseSBjb250YWlucyBhIHRvbiBvZiBkdXBsaWNhdGVkIGNvZGUgZnJvbSBUQmFzZQotICogYmVjYXVzZSB3ZSBuZWVkIHRvIHNhdmUgQ1BVIGN5Y2xlcyBhbmQgdGhpcyBpcyBub3QgeWV0IGluIGFuIGV4dGVuc2lvbi4KLSAqIElkZWFsbHkgd2UnZCBtdWx0aXBseS1pbmhlcml0IFRFeGNlcHRpb24gZnJvbSBib3RoIEV4Y2VwdGlvbiBhbmQgQmFzZSwgYnV0Ci0gKiB0aGF0J3Mgbm90IHBvc3NpYmxlIGluIFBIUCBhbmQgdGhlcmUgYXJlIG5vIG1vZHVsZXMgZWl0aGVyLCBzbyBmb3Igbm93IHdlCi0gKiBhcG9sb2dldGljYWxseSB0YWtlIGEgdHJpcCB0byBIYWNrVG93bi4KLSAqCi0gKiBDYW4gYmUgY2FsbGVkIHdpdGggc3RhbmRhcmQgRXhjZXB0aW9uIGNvbnN0cnVjdG9yIChtZXNzYWdlLCBjb2RlKSBvciB3aXRoCi0gKiBUaHJpZnQgQmFzZSBvYmplY3QgY29uc3RydWN0b3IgKHNwZWMsIHZhbHMpLgotICoKLSAqIEBwYXJhbSBtaXhlZCAkcDEgTWVzc2FnZSAoc3RyaW5nKSBvciB0eXBlLXNwZWMgKGFycmF5KQotICogQHBhcmFtIG1peGVkICRwMiBDb2RlIChpbnRlZ2VyKSBvciB2YWx1ZXMgKGFycmF5KQotICovCi1jbGFzcyBURXhjZXB0aW9uIGV4dGVuZHMgXEV4Y2VwdGlvbiB7Ci0gIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRwMT1udWxsLCAkcDI9MCkgewotICAgIGlmIChpc19hcnJheSgkcDEpICYmIGlzX2FycmF5KCRwMikpIHsKLSAgICAgICRzcGVjID0gJHAxOwotICAgICAgJHZhbHMgPSAkcDI7Ci0gICAgICBmb3JlYWNoICgkc3BlYyBhcyAkZmlkID0+ICRmc3BlYykgewotICAgICAgICAkdmFyID0gJGZzcGVjWyd2YXInXTsKLSAgICAgICAgaWYgKGlzc2V0KCR2YWxzWyR2YXJdKSkgewotICAgICAgICAgICR0aGlzLT4kdmFyID0gJHZhbHNbJHZhcl07Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkcDEsICRwMik7Ci0gICAgfQotICB9Ci0KLSAgc3RhdGljICR0bWV0aG9kID0gYXJyYXkoVFR5cGU6OkJPT0wgICA9PiAnQm9vbCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFRUeXBlOjpCWVRFICAgPT4gJ0J5dGUnLAotICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZTo6STE2ICAgID0+ICdJMTYnLAotICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZTo6STMyICAgID0+ICdJMzInLAotICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZTo6STY0ICAgID0+ICdJNjQnLAotICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZTo6RE9VQkxFID0+ICdEb3VibGUnLAotICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZTo6U1RSSU5HID0+ICdTdHJpbmcnKTsKLQotICBwcml2YXRlIGZ1bmN0aW9uIF9yZWFkTWFwKCYkdmFyLCAkc3BlYywgJGlucHV0KSB7Ci0gICAgJHhmZXIgPSAwOwotICAgICRrdHlwZSA9ICRzcGVjWydrdHlwZSddOwotICAgICR2dHlwZSA9ICRzcGVjWyd2dHlwZSddOwotICAgICRrcmVhZCA9ICR2cmVhZCA9IG51bGw7Ci0gICAgaWYgKGlzc2V0KFRCYXNlOjokdG1ldGhvZFska3R5cGVdKSkgewotICAgICAgJGtyZWFkID0gJ3JlYWQnLlRCYXNlOjokdG1ldGhvZFska3R5cGVdOwotICAgIH0gZWxzZSB7Ci0gICAgICAka3NwZWMgPSAkc3BlY1sna2V5J107Ci0gICAgfQotICAgIGlmIChpc3NldChUQmFzZTo6JHRtZXRob2RbJHZ0eXBlXSkpIHsKLSAgICAgICR2cmVhZCA9ICdyZWFkJy5UQmFzZTo6JHRtZXRob2RbJHZ0eXBlXTsKLSAgICB9IGVsc2UgewotICAgICAgJHZzcGVjID0gJHNwZWNbJ3ZhbCddOwotICAgIH0KLSAgICAkdmFyID0gYXJyYXkoKTsKLSAgICAkX2t0eXBlID0gJF92dHlwZSA9ICRzaXplID0gMDsKLSAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRNYXBCZWdpbigkX2t0eXBlLCAkX3Z0eXBlLCAkc2l6ZSk7Ci0gICAgZm9yICgkaSA9IDA7ICRpIDwgJHNpemU7ICsrJGkpIHsKLSAgICAgICRrZXkgPSAkdmFsID0gbnVsbDsKLSAgICAgIGlmICgka3JlYWQgIT09IG51bGwpIHsKLSAgICAgICAgJHhmZXIgKz0gJGlucHV0LT4ka3JlYWQoJGtleSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzd2l0Y2ggKCRrdHlwZSkgewotICAgICAgICBjYXNlIFRUeXBlOjpTVFJVQ1Q6Ci0gICAgICAgICAgJGNsYXNzID0gJGtzcGVjWydjbGFzcyddOwotICAgICAgICAgICRrZXkgPSBuZXcgJGNsYXNzKCk7Ci0gICAgICAgICAgJHhmZXIgKz0gJGtleS0+cmVhZCgkaW5wdXQpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRUeXBlOjpNQVA6Ci0gICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTWFwKCRrZXksICRrc3BlYywgJGlucHV0KTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUVHlwZTo6TFNUOgotICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fcmVhZExpc3QoJGtleSwgJGtzcGVjLCAkaW5wdXQsIGZhbHNlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgotICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fcmVhZExpc3QoJGtleSwgJGtzcGVjLCAkaW5wdXQsIHRydWUpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoJHZyZWFkICE9PSBudWxsKSB7Ci0gICAgICAgICR4ZmVyICs9ICRpbnB1dC0+JHZyZWFkKCR2YWwpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc3dpdGNoICgkdnR5cGUpIHsKLSAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgotICAgICAgICAgICRjbGFzcyA9ICR2c3BlY1snY2xhc3MnXTsKLSAgICAgICAgICAkdmFsID0gbmV3ICRjbGFzcygpOwotICAgICAgICAgICR4ZmVyICs9ICR2YWwtPnJlYWQoJGlucHV0KTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgotICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fcmVhZE1hcCgkdmFsLCAkdnNwZWMsICRpbnB1dCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKLSAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRMaXN0KCR2YWwsICR2c3BlYywgJGlucHV0LCBmYWxzZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVFR5cGU6OlNFVDoKLSAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRMaXN0KCR2YWwsICR2c3BlYywgJGlucHV0LCB0cnVlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgJHZhclska2V5XSA9ICR2YWw7Ci0gICAgfQotICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZE1hcEVuZCgpOwotICAgIHJldHVybiAkeGZlcjsKLSAgfQotCi0gIHByaXZhdGUgZnVuY3Rpb24gX3JlYWRMaXN0KCYkdmFyLCAkc3BlYywgJGlucHV0LCAkc2V0PWZhbHNlKSB7Ci0gICAgJHhmZXIgPSAwOwotICAgICRldHlwZSA9ICRzcGVjWydldHlwZSddOwotICAgICRlcmVhZCA9ICR2cmVhZCA9IG51bGw7Ci0gICAgaWYgKGlzc2V0KFRCYXNlOjokdG1ldGhvZFskZXR5cGVdKSkgewotICAgICAgJGVyZWFkID0gJ3JlYWQnLlRCYXNlOjokdG1ldGhvZFskZXR5cGVdOwotICAgIH0gZWxzZSB7Ci0gICAgICAkZXNwZWMgPSAkc3BlY1snZWxlbSddOwotICAgIH0KLSAgICAkdmFyID0gYXJyYXkoKTsKLSAgICAkX2V0eXBlID0gJHNpemUgPSAwOwotICAgIGlmICgkc2V0KSB7Ci0gICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRTZXRCZWdpbigkX2V0eXBlLCAkc2l6ZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZExpc3RCZWdpbigkX2V0eXBlLCAkc2l6ZSk7Ci0gICAgfQotICAgIGZvciAoJGkgPSAwOyAkaSA8ICRzaXplOyArKyRpKSB7Ci0gICAgICAkZWxlbSA9IG51bGw7Ci0gICAgICBpZiAoJGVyZWFkICE9PSBudWxsKSB7Ci0gICAgICAgICR4ZmVyICs9ICRpbnB1dC0+JGVyZWFkKCRlbGVtKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgICRlc3BlYyA9ICRzcGVjWydlbGVtJ107Ci0gICAgICAgIHN3aXRjaCAoJGV0eXBlKSB7Ci0gICAgICAgIGNhc2UgVFR5cGU6OlNUUlVDVDoKLSAgICAgICAgICAkY2xhc3MgPSAkZXNwZWNbJ2NsYXNzJ107Ci0gICAgICAgICAgJGVsZW0gPSBuZXcgJGNsYXNzKCk7Ci0gICAgICAgICAgJHhmZXIgKz0gJGVsZW0tPnJlYWQoJGlucHV0KTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgotICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fcmVhZE1hcCgkZWxlbSwgJGVzcGVjLCAkaW5wdXQpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRUeXBlOjpMU1Q6Ci0gICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTGlzdCgkZWxlbSwgJGVzcGVjLCAkaW5wdXQsIGZhbHNlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgotICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fcmVhZExpc3QoJGVsZW0sICRlc3BlYywgJGlucHV0LCB0cnVlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKCRzZXQpIHsKLSAgICAgICAgJHZhclskZWxlbV0gPSB0cnVlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgJHZhciBbXT0gJGVsZW07Ci0gICAgICB9Ci0gICAgfQotICAgIGlmICgkc2V0KSB7Ci0gICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRTZXRFbmQoKTsKLSAgICB9IGVsc2UgewotICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkTGlzdEVuZCgpOwotICAgIH0KLSAgICByZXR1cm4gJHhmZXI7Ci0gIH0KLQotICBwcm90ZWN0ZWQgZnVuY3Rpb24gX3JlYWQoJGNsYXNzLCAkc3BlYywgJGlucHV0KSB7Ci0gICAgJHhmZXIgPSAwOwotICAgICRmbmFtZSA9IG51bGw7Ci0gICAgJGZ0eXBlID0gMDsKLSAgICAkZmlkID0gMDsKLSAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRTdHJ1Y3RCZWdpbigkZm5hbWUpOwotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRGaWVsZEJlZ2luKCRmbmFtZSwgJGZ0eXBlLCAkZmlkKTsKLSAgICAgIGlmICgkZnR5cGUgPT0gVFR5cGU6OlNUT1ApIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBpZiAoaXNzZXQoJHNwZWNbJGZpZF0pKSB7Ci0gICAgICAgICRmc3BlYyA9ICRzcGVjWyRmaWRdOwotICAgICAgICAkdmFyID0gJGZzcGVjWyd2YXInXTsKLSAgICAgICAgaWYgKCRmdHlwZSA9PSAkZnNwZWNbJ3R5cGUnXSkgewotICAgICAgICAgICR4ZmVyID0gMDsKLSAgICAgICAgICBpZiAoaXNzZXQoVEJhc2U6OiR0bWV0aG9kWyRmdHlwZV0pKSB7Ci0gICAgICAgICAgICAkZnVuYyA9ICdyZWFkJy5UQmFzZTo6JHRtZXRob2RbJGZ0eXBlXTsKLSAgICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+JGZ1bmMoJHRoaXMtPiR2YXIpOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKCRmdHlwZSkgewotICAgICAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgotICAgICAgICAgICAgICAkY2xhc3MgPSAkZnNwZWNbJ2NsYXNzJ107Ci0gICAgICAgICAgICAgICR0aGlzLT4kdmFyID0gbmV3ICRjbGFzcygpOwotICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+JHZhci0+cmVhZCgkaW5wdXQpOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgVFR5cGU6Ok1BUDoKLSAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTWFwKCR0aGlzLT4kdmFyLCAkZnNwZWMsICRpbnB1dCk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBUVHlwZTo6TFNUOgotICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRMaXN0KCR0aGlzLT4kdmFyLCAkZnNwZWMsICRpbnB1dCwgZmFsc2UpOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgVFR5cGU6OlNFVDoKLSAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTGlzdCgkdGhpcy0+JHZhciwgJGZzcGVjLCAkaW5wdXQsIHRydWUpOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5za2lwKCRmdHlwZSk7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgICR4ZmVyICs9ICRpbnB1dC0+c2tpcCgkZnR5cGUpOwotICAgICAgfQotICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkRmllbGRFbmQoKTsKLSAgICB9Ci0gICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkU3RydWN0RW5kKCk7Ci0gICAgcmV0dXJuICR4ZmVyOwotICB9Ci0KLSAgcHJpdmF0ZSBmdW5jdGlvbiBfd3JpdGVNYXAoJHZhciwgJHNwZWMsICRvdXRwdXQpIHsKLSAgICAkeGZlciA9IDA7Ci0gICAgJGt0eXBlID0gJHNwZWNbJ2t0eXBlJ107Ci0gICAgJHZ0eXBlID0gJHNwZWNbJ3Z0eXBlJ107Ci0gICAgJGt3cml0ZSA9ICR2d3JpdGUgPSBudWxsOwotICAgIGlmIChpc3NldChUQmFzZTo6JHRtZXRob2RbJGt0eXBlXSkpIHsKLSAgICAgICRrd3JpdGUgPSAnd3JpdGUnLlRCYXNlOjokdG1ldGhvZFska3R5cGVdOwotICAgIH0gZWxzZSB7Ci0gICAgICAka3NwZWMgPSAkc3BlY1sna2V5J107Ci0gICAgfQotICAgIGlmIChpc3NldChUQmFzZTo6JHRtZXRob2RbJHZ0eXBlXSkpIHsKLSAgICAgICR2d3JpdGUgPSAnd3JpdGUnLlRCYXNlOjokdG1ldGhvZFskdnR5cGVdOwotICAgIH0gZWxzZSB7Ci0gICAgICAkdnNwZWMgPSAkc3BlY1sndmFsJ107Ci0gICAgfQotICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlTWFwQmVnaW4oJGt0eXBlLCAkdnR5cGUsIGNvdW50KCR2YXIpKTsKLSAgICBmb3JlYWNoICgkdmFyIGFzICRrZXkgPT4gJHZhbCkgewotICAgICAgaWYgKGlzc2V0KCRrd3JpdGUpKSB7Ci0gICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPiRrd3JpdGUoJGtleSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzd2l0Y2ggKCRrdHlwZSkgewotICAgICAgICBjYXNlIFRUeXBlOjpTVFJVQ1Q6Ci0gICAgICAgICAgJHhmZXIgKz0gJGtleS0+d3JpdGUoJG91dHB1dCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVFR5cGU6Ok1BUDoKLSAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTWFwKCRrZXksICRrc3BlYywgJG91dHB1dCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKLSAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTGlzdCgka2V5LCAka3NwZWMsICRvdXRwdXQsIGZhbHNlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgotICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVMaXN0KCRrZXksICRrc3BlYywgJG91dHB1dCwgdHJ1ZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChpc3NldCgkdndyaXRlKSkgewotICAgICAgICAkeGZlciArPSAkb3V0cHV0LT4kdndyaXRlKCR2YWwpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc3dpdGNoICgkdnR5cGUpIHsKLSAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgotICAgICAgICAgICR4ZmVyICs9ICR2YWwtPndyaXRlKCRvdXRwdXQpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRUeXBlOjpNQVA6Ci0gICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZU1hcCgkdmFsLCAkdnNwZWMsICRvdXRwdXQpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRUeXBlOjpMU1Q6Ci0gICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZUxpc3QoJHZhbCwgJHZzcGVjLCAkb3V0cHV0LCBmYWxzZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVFR5cGU6OlNFVDoKLSAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTGlzdCgkdmFsLCAkdnNwZWMsICRvdXRwdXQsIHRydWUpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlTWFwRW5kKCk7Ci0gICAgcmV0dXJuICR4ZmVyOwotICB9Ci0KLSAgcHJpdmF0ZSBmdW5jdGlvbiBfd3JpdGVMaXN0KCR2YXIsICRzcGVjLCAkb3V0cHV0LCAkc2V0PWZhbHNlKSB7Ci0gICAgJHhmZXIgPSAwOwotICAgICRldHlwZSA9ICRzcGVjWydldHlwZSddOwotICAgICRld3JpdGUgPSBudWxsOwotICAgIGlmIChpc3NldChUQmFzZTo6JHRtZXRob2RbJGV0eXBlXSkpIHsKLSAgICAgICRld3JpdGUgPSAnd3JpdGUnLlRCYXNlOjokdG1ldGhvZFskZXR5cGVdOwotICAgIH0gZWxzZSB7Ci0gICAgICAkZXNwZWMgPSAkc3BlY1snZWxlbSddOwotICAgIH0KLSAgICBpZiAoJHNldCkgewotICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTZXRCZWdpbigkZXR5cGUsIGNvdW50KCR2YXIpKTsKLSAgICB9IGVsc2UgewotICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVMaXN0QmVnaW4oJGV0eXBlLCBjb3VudCgkdmFyKSk7Ci0gICAgfQotICAgIGZvcmVhY2ggKCR2YXIgYXMgJGtleSA9PiAkdmFsKSB7Ci0gICAgICAkZWxlbSA9ICRzZXQgPyAka2V5IDogJHZhbDsKLSAgICAgIGlmIChpc3NldCgkZXdyaXRlKSkgewotICAgICAgICAkeGZlciArPSAkb3V0cHV0LT4kZXdyaXRlKCRlbGVtKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHN3aXRjaCAoJGV0eXBlKSB7Ci0gICAgICAgIGNhc2UgVFR5cGU6OlNUUlVDVDoKLSAgICAgICAgICAkeGZlciArPSAkZWxlbS0+d3JpdGUoJG91dHB1dCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVFR5cGU6Ok1BUDoKLSAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTWFwKCRlbGVtLCAkZXNwZWMsICRvdXRwdXQpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRUeXBlOjpMU1Q6Ci0gICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZUxpc3QoJGVsZW0sICRlc3BlYywgJG91dHB1dCwgZmFsc2UpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRUeXBlOjpTRVQ6Ci0gICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZUxpc3QoJGVsZW0sICRlc3BlYywgJG91dHB1dCwgdHJ1ZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKCRzZXQpIHsKLSAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU2V0RW5kKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlTGlzdEVuZCgpOwotICAgIH0KLSAgICByZXR1cm4gJHhmZXI7Ci0gIH0KLQotICBwcm90ZWN0ZWQgZnVuY3Rpb24gX3dyaXRlKCRjbGFzcywgJHNwZWMsICRvdXRwdXQpIHsKLSAgICAkeGZlciA9IDA7Ci0gICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTdHJ1Y3RCZWdpbigkY2xhc3MpOwotICAgIGZvcmVhY2ggKCRzcGVjIGFzICRmaWQgPT4gJGZzcGVjKSB7Ci0gICAgICAkdmFyID0gJGZzcGVjWyd2YXInXTsKLSAgICAgIGlmICgkdGhpcy0+JHZhciAhPT0gbnVsbCkgewotICAgICAgICAkZnR5cGUgPSAkZnNwZWNbJ3R5cGUnXTsKLSAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZEJlZ2luKCR2YXIsICRmdHlwZSwgJGZpZCk7Ci0gICAgICAgIGlmIChpc3NldChUQmFzZTo6JHRtZXRob2RbJGZ0eXBlXSkpIHsKLSAgICAgICAgICAkZnVuYyA9ICd3cml0ZScuVEJhc2U6OiR0bWV0aG9kWyRmdHlwZV07Ci0gICAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+JGZ1bmMoJHRoaXMtPiR2YXIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHN3aXRjaCAoJGZ0eXBlKSB7Ci0gICAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgotICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPiR2YXItPndyaXRlKCRvdXRwdXQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgotICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZU1hcCgkdGhpcy0+JHZhciwgJGZzcGVjLCAkb3V0cHV0KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKLSAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVMaXN0KCR0aGlzLT4kdmFyLCAkZnNwZWMsICRvdXRwdXQsIGZhbHNlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgVFR5cGU6OlNFVDoKLSAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVMaXN0KCR0aGlzLT4kdmFyLCAkZnNwZWMsICRvdXRwdXQsIHRydWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRFbmQoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZFN0b3AoKTsKLSAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZVN0cnVjdEVuZCgpOwotICAgIHJldHVybiAkeGZlcjsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvRXhjZXB0aW9uL1RQcm90b2NvbEV4Y2VwdGlvbi5waHAgYi9saWIvcGhwL2xpYi9UaHJpZnQvRXhjZXB0aW9uL1RQcm90b2NvbEV4Y2VwdGlvbi5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyNTI5ZjUuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9saWIvVGhyaWZ0L0V4Y2VwdGlvbi9UUHJvdG9jb2xFeGNlcHRpb24ucGhwCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotPD9waHAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnByb3RvY29sCi0gKiBAYXV0aG9yOiBybWFyaW4gKG1hcmluLnJhZHVAZmFjZWJvb2suY29tKQotICovCi0KLW5hbWVzcGFjZSBUaHJpZnRcRXhjZXB0aW9uOwotCi11c2UgVGhyaWZ0XEV4Y2VwdGlvblxURXhjZXB0aW9uOwotCi0vKioKLSAqIFByb3RvY29sIG1vZHVsZS4gQ29udGFpbnMgYWxsIHRoZSB0eXBlcyBhbmQgZGVmaW5pdGlvbnMgbmVlZGVkIHRvIGltcGxlbWVudAotICogYSBwcm90b2NvbCBlbmNvZGVyL2RlY29kZXIuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnByb3RvY29sCi0gKi8KLQotLyoqCi0gKiBQcm90b2NvbCBleGNlcHRpb25zCi0gKi8KLWNsYXNzIFRQcm90b2NvbEV4Y2VwdGlvbiBleHRlbmRzIFRFeGNlcHRpb24gewotICBjb25zdCBVTktOT1dOID0gMDsKLSAgY29uc3QgSU5WQUxJRF9EQVRBID0gMTsKLSAgY29uc3QgTkVHQVRJVkVfU0laRSA9IDI7Ci0gIGNvbnN0IFNJWkVfTElNSVQgPSAzOwotICBjb25zdCBCQURfVkVSU0lPTiA9IDQ7Ci0gIGNvbnN0IE5PVF9JTVBMRU1FTlRFRCA9IDU7Ci0gIGNvbnN0IERFUFRIX0xJTUlUID0gNjsKLQotICBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkbWVzc2FnZT1udWxsLCAkY29kZT0wKSB7Ci0gICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkbWVzc2FnZSwgJGNvZGUpOwotICB9Ci19CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvRXhjZXB0aW9uL1RUcmFuc3BvcnRFeGNlcHRpb24ucGhwIGIvbGliL3BocC9saWIvVGhyaWZ0L0V4Y2VwdGlvbi9UVHJhbnNwb3J0RXhjZXB0aW9uLnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ2N2ViOS4uMDAwMDAwMAotLS0gYS9saWIvcGhwL2xpYi9UaHJpZnQvRXhjZXB0aW9uL1RUcmFuc3BvcnRFeGNlcHRpb24ucGhwCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotPD9waHAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAotICovCi0KLW5hbWVzcGFjZSBUaHJpZnRcRXhjZXB0aW9uOwotCi11c2UgVGhyaWZ0XEV4Y2VwdGlvblxURXhjZXB0aW9uOwotCi0vKioKLSAqIFRyYW5zcG9ydCBleGNlcHRpb25zCi0gKi8KLWNsYXNzIFRUcmFuc3BvcnRFeGNlcHRpb24gZXh0ZW5kcyBURXhjZXB0aW9uIHsKLQotICBjb25zdCBVTktOT1dOID0gMDsKLSAgY29uc3QgTk9UX09QRU4gPSAxOwotICBjb25zdCBBTFJFQURZX09QRU4gPSAyOwotICBjb25zdCBUSU1FRF9PVVQgPSAzOwotICBjb25zdCBFTkRfT0ZfRklMRSA9IDQ7Ci0KLSAgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJG1lc3NhZ2U9bnVsbCwgJGNvZGU9MCkgewotICAgIHBhcmVudDo6X19jb25zdHJ1Y3QoJG1lc3NhZ2UsICRjb2RlKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RocmlmdC9GYWN0b3J5L1RCaW5hcnlQcm90b2NvbEZhY3RvcnkucGhwIGIvbGliL3BocC9saWIvVGhyaWZ0L0ZhY3RvcnkvVEJpbmFyeVByb3RvY29sRmFjdG9yeS5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1ZGE1NjcuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9saWIvVGhyaWZ0L0ZhY3RvcnkvVEJpbmFyeVByb3RvY29sRmFjdG9yeS5waHAKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi08P3BocAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKLSAqLwotCi1uYW1lc3BhY2UgVGhyaWZ0XEZhY3Rvcnk7Ci0KLXVzZSBUaHJpZnRcRmFjdG9yeVxUUHJvdG9jb2xGYWN0b3J5OwotdXNlIFRocmlmdFxQcm90b2NvbFxUQmluYXJ5UHJvdG9jb2w7Ci0KLS8qKgotICogQmluYXJ5IFByb3RvY29sIEZhY3RvcnkKLSAqLwotY2xhc3MgVEJpbmFyeVByb3RvY29sRmFjdG9yeSBpbXBsZW1lbnRzIFRQcm90b2NvbEZhY3RvcnkgewotICBwcml2YXRlICRzdHJpY3RSZWFkXyA9IGZhbHNlOwotICBwcml2YXRlICRzdHJpY3RXcml0ZV8gPSBmYWxzZTsKLQotICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHN0cmljdFJlYWQ9ZmFsc2UsICRzdHJpY3RXcml0ZT1mYWxzZSkgewotICAgICR0aGlzLT5zdHJpY3RSZWFkXyA9ICRzdHJpY3RSZWFkOwotICAgICR0aGlzLT5zdHJpY3RXcml0ZV8gPSAkc3RyaWN0V3JpdGU7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gZ2V0UHJvdG9jb2woJHRyYW5zKSB7Ci0gICAgcmV0dXJuIG5ldyBUQmluYXJ5UHJvdG9jb2woJHRyYW5zLCAkdGhpcy0+c3RyaWN0UmVhZF8sICR0aGlzLT5zdHJpY3RXcml0ZV8pOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVGhyaWZ0L0ZhY3RvcnkvVENvbXBhY3RQcm90b2NvbEZhY3RvcnkucGhwIGIvbGliL3BocC9saWIvVGhyaWZ0L0ZhY3RvcnkvVENvbXBhY3RQcm90b2NvbEZhY3RvcnkucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Zjk3MmFhLi4wMDAwMDAwCi0tLSBhL2xpYi9waHAvbGliL1RocmlmdC9GYWN0b3J5L1RDb21wYWN0UHJvdG9jb2xGYWN0b3J5LnBocAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAotICovCi0KLW5hbWVzcGFjZSBUaHJpZnRcRmFjdG9yeTsKLQotdXNlIFRocmlmdFxGYWN0b3J5XFRQcm90b2NvbEZhY3Rvcnk7Ci11c2UgVGhyaWZ0XFByb3RvY29sXFRDb21wYWN0UHJvdG9jb2w7Ci0KLS8qKgotICogQ29tcGFjdCBQcm90b2NvbCBGYWN0b3J5Ci0gKi8KLWNsYXNzIFRDb21wYWN0UHJvdG9jb2xGYWN0b3J5IGltcGxlbWVudHMgVFByb3RvY29sRmFjdG9yeSB7Ci0KLSAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkgewotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIGdldFByb3RvY29sKCR0cmFucykgewotICAgIHJldHVybiBuZXcgVENvbXBhY3RQcm90b2NvbCgkdHJhbnMpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVGhyaWZ0L0ZhY3RvcnkvVEpTT05Qcm90b2NvbEZhY3RvcnkucGhwIGIvbGliL3BocC9saWIvVGhyaWZ0L0ZhY3RvcnkvVEpTT05Qcm90b2NvbEZhY3RvcnkucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2U0MzkxLi4wMDAwMDAwCi0tLSBhL2xpYi9waHAvbGliL1RocmlmdC9GYWN0b3J5L1RKU09OUHJvdG9jb2xGYWN0b3J5LnBocAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAotICovCi0KLW5hbWVzcGFjZSBUaHJpZnRcRmFjdG9yeTsKLQotdXNlIFRocmlmdFxGYWN0b3J5XFRQcm90b2NvbEZhY3Rvcnk7Ci11c2UgVGhyaWZ0XFByb3RvY29sXFRKU09OUHJvdG9jb2w7Ci0KLS8qKgotICogSlNPTiBQcm90b2NvbCBGYWN0b3J5Ci0gKi8KLWNsYXNzIFRKU09OUHJvdG9jb2xGYWN0b3J5IGltcGxlbWVudHMgVFByb3RvY29sRmFjdG9yeQotewotICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRQcm90b2NvbCgkdHJhbnMpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IFRKU09OUHJvdG9jb2woJHRyYW5zKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvRmFjdG9yeS9UUHJvdG9jb2xGYWN0b3J5LnBocCBiL2xpYi9waHAvbGliL1RocmlmdC9GYWN0b3J5L1RQcm90b2NvbEZhY3RvcnkucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjMyMmViLi4wMDAwMDAwCi0tLSBhL2xpYi9waHAvbGliL1RocmlmdC9GYWN0b3J5L1RQcm90b2NvbEZhY3RvcnkucGhwCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotPD9waHAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnByb3RvY29sCi0gKi8KLQotbmFtZXNwYWNlIFRocmlmdFxGYWN0b3J5OwotCi0vKioKLSAqIFByb3RvY29sIGZhY3RvcnkgY3JlYXRlcyBwcm90b2NvbCBvYmplY3RzIGZyb20gdHJhbnNwb3J0cwotICovCi1pbnRlcmZhY2UgVFByb3RvY29sRmFjdG9yeSB7Ci0gIC8qKgotICAgKiBCdWlsZCBhIHByb3RvY29sIGZyb20gdGhlIGJhc2UgdHJhbnNwb3J0Ci0gICAqCi0gICAqIEByZXR1cm4gVGhyaWZ0XFByb3RvY29sXFRQcm90b2NvbCBwcm90b2NvbAotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIGdldFByb3RvY29sKCR0cmFucyk7Ci19CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvRmFjdG9yeS9UU3RyaW5nRnVuY0ZhY3RvcnkucGhwIGIvbGliL3BocC9saWIvVGhyaWZ0L0ZhY3RvcnkvVFN0cmluZ0Z1bmNGYWN0b3J5LnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRjMzY0OS4uMDAwMDAwMAotLS0gYS9saWIvcGhwL2xpYi9UaHJpZnQvRmFjdG9yeS9UU3RyaW5nRnVuY0ZhY3RvcnkucGhwCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotPD9waHAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLW5hbWVzcGFjZSBUaHJpZnRcRmFjdG9yeTsKLQotdXNlIFRocmlmdFxTdHJpbmdGdW5jXE1ic3RyaW5nOwotdXNlIFRocmlmdFxTdHJpbmdGdW5jXENvcmU7Ci0KLWNsYXNzIFRTdHJpbmdGdW5jRmFjdG9yeSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgJF9pbnN0YW5jZTsKLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgU2luZ2xldG9uIGluc3RhbmNlIG9mIFRTdHJpbmdGdW5jIGltcGxlbWVudGF0aW9uIHRoYXQgaXMKLSAgICAgKiBjb21wYXRpYmxlIHdpdGggdGhlIGN1cnJlbnQgc3lzdGVtJ3MgbWJzdHJpbmcuZnVuY19vdmVybG9hZCBzZXR0aW5ncy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVFN0cmluZ0Z1bmMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNyZWF0ZSgpIHsKLSAgICAgICAgaWYoIXNlbGY6OiRfaW5zdGFuY2UpIHsKLSAgICAgICAgICAgIHNlbGY6Ol9zZXRJbnN0YW5jZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHNlbGY6OiRfaW5zdGFuY2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gX3NldEluc3RhbmNlKCkgewotICAgICAgICAvKioKLSAgICAgICAgICogQ2Fubm90IHVzZSBzdHIqIGZ1bmN0aW9ucyBmb3IgYnl0ZSBjb3VudGluZyBiZWNhdXNlIG11bHRpYnl0ZQotICAgICAgICAgKiBjaGFyYWN0ZXJzIHdpbGwgYmUgcmVhZCBhIHNpbmdsZSBieXRlcy4KLSAgICAgICAgICoKLSAgICAgICAgICogU2VlOiBodHRwOi8vdXMucGhwLm5ldC9tYW51YWwvZW4vbWJzdHJpbmcub3ZlcmxvYWQucGhwCi0gICAgICAgICAqLwotICAgICAgICBpZihpbmlfZ2V0KCdtYnN0cmluZy5mdW5jX292ZXJsb2FkJykgJiAyKSB7Ci0gICAgICAgICAgICBzZWxmOjokX2luc3RhbmNlID0gbmV3IE1ic3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIG1ic3RyaW5nIGlzIG5vdCBpbnN0YWxsZWQgb3IgZG9lcyBub3QgaGF2ZSBmdW5jdGlvbiBvdmVybG9hZGluZwotICAgICAgICAgKiBvZiB0aGUgc3RyKiBmdW5jdGlvbnMgZW5hYmxlZCBzbyB1c2UgUEhQIGNvcmUgc3RyKiBmdW5jdGlvbnMgZm9yCi0gICAgICAgICAqIGJ5dGUgY291bnRpbmcuCi0gICAgICAgICAqLwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHNlbGY6OiRfaW5zdGFuY2UgPSBuZXcgQ29yZSgpOwotICAgICAgICB9Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RocmlmdC9GYWN0b3J5L1RUcmFuc3BvcnRGYWN0b3J5LnBocCBiL2xpYi9waHAvbGliL1RocmlmdC9GYWN0b3J5L1RUcmFuc3BvcnRGYWN0b3J5LnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNhZTEyMy4uMDAwMDAwMAotLS0gYS9saWIvcGhwL2xpYi9UaHJpZnQvRmFjdG9yeS9UVHJhbnNwb3J0RmFjdG9yeS5waHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi08P3BocAotCi1uYW1lc3BhY2UgVGhyaWZ0XEZhY3Rvcnk7Ci0KLXVzZSBUaHJpZnRcVHJhbnNwb3J0XFRUcmFuc3BvcnQ7Ci0KLWNsYXNzIFRUcmFuc3BvcnRGYWN0b3J5IHsKLSAgLyoqCi0gICAqIEBzdGF0aWMKLSAgICogQHBhcmFtIFRUcmFuc3BvcnQgJHRyYW5zcG9ydAotICAgKiBAcmV0dXJuIFRUcmFuc3BvcnQKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0VHJhbnNwb3J0KFRUcmFuc3BvcnQgJHRyYW5zcG9ydCkgewotICAgIHJldHVybiAkdHJhbnNwb3J0OwotICB9Ci19CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvUHJvdG9jb2wvSlNPTi9CYXNlQ29udGV4dC5waHAgYi9saWIvcGhwL2xpYi9UaHJpZnQvUHJvdG9jb2wvSlNPTi9CYXNlQ29udGV4dC5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5NmU1MDQuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9saWIvVGhyaWZ0L1Byb3RvY29sL0pTT04vQmFzZUNvbnRleHQucGhwCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPD9waHAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnByb3RvY29sCi0gKi8KLQotbmFtZXNwYWNlIFRocmlmdFxQcm90b2NvbFxKU09OOwotCi1jbGFzcyBCYXNlQ29udGV4dAotewotICAgIGZ1bmN0aW9uIGVzY2FwZU51bSgpCi0gICAgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgZnVuY3Rpb24gd3JpdGUoKQotICAgIHsKLSAgICB9Ci0KLSAgICBmdW5jdGlvbiByZWFkKCkKLSAgICB7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RocmlmdC9Qcm90b2NvbC9KU09OL0xpc3RDb250ZXh0LnBocCBiL2xpYi9waHAvbGliL1RocmlmdC9Qcm90b2NvbC9KU09OL0xpc3RDb250ZXh0LnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJiNzViMS4uMDAwMDAwMAotLS0gYS9saWIvcGhwL2xpYi9UaHJpZnQvUHJvdG9jb2wvSlNPTi9MaXN0Q29udGV4dC5waHAKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi08P3BocAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKLSAqLwotCi1uYW1lc3BhY2UgVGhyaWZ0XFByb3RvY29sXEpTT047Ci0KLXVzZSBUaHJpZnRcUHJvdG9jb2xcSlNPTlxCYXNlQ29udGV4dDsKLXVzZSBUaHJpZnRcUHJvdG9jb2xcVEpTT05Qcm90b2NvbDsKLQotY2xhc3MgTGlzdENvbnRleHQgZXh0ZW5kcyBCYXNlQ29udGV4dAotewotICAgIHByaXZhdGUgJGZpcnN0XyA9IHRydWU7Ci0gICAgcHJpdmF0ZSAkcF87Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHApIHsKLSAgICAgICAgJHRoaXMtPnBfID0gJHA7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlKCkgewotICAgICAgICBpZiAoJHRoaXMtPmZpcnN0XykgewotICAgICAgICAgICAgJHRoaXMtPmZpcnN0XyA9IGZhbHNlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgJHRoaXMtPnBfLT5nZXRUcmFuc3BvcnQoKS0+d3JpdGUoVEpTT05Qcm90b2NvbDo6Q09NTUEpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlYWQoKSB7Ci0gICAgICAgIGlmICgkdGhpcy0+Zmlyc3RfKSB7Ci0gICAgICAgICAgICAkdGhpcy0+Zmlyc3RfID0gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAkdGhpcy0+cF8tPnJlYWRKU09OU3ludGF4Q2hhcihUSlNPTlByb3RvY29sOjpDT01NQSk7Ci0gICAgICAgIH0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVGhyaWZ0L1Byb3RvY29sL0pTT04vTG9va2FoZWFkUmVhZGVyLnBocCBiL2xpYi9waHAvbGliL1RocmlmdC9Qcm90b2NvbC9KU09OL0xvb2thaGVhZFJlYWRlci5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyOGI1ZmMuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9saWIvVGhyaWZ0L1Byb3RvY29sL0pTT04vTG9va2FoZWFkUmVhZGVyLnBocAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAotICovCi0KLW5hbWVzcGFjZSBUaHJpZnRcUHJvdG9jb2xcSlNPTjsKLQotY2xhc3MgTG9va2FoZWFkUmVhZGVyCi17Ci0gICAgcHJpdmF0ZSAkaGFzRGF0YV8gPSBmYWxzZTsKLSAgICBwcml2YXRlICRkYXRhXyA9IGFycmF5KCk7Ci0gICAgcHJpdmF0ZSAkcF87Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHApCi0gICAgewotICAgICAgICAkdGhpcy0+cF8gPSAkcDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZCgpIHsKLSAgICAgICAgaWYgKCR0aGlzLT5oYXNEYXRhXykgewotICAgICAgICAgICAgJHRoaXMtPmhhc0RhdGFfID0gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAkdGhpcy0+ZGF0YV8gPSAkdGhpcy0+cF8tPmdldFRyYW5zcG9ydCgpLT5yZWFkQWxsKDEpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHN1YnN0cigkdGhpcy0+ZGF0YV8sIDAsIDEpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiBwZWVrKCkgewotICAgICAgICBpZiAoISR0aGlzLT5oYXNEYXRhXykgewotICAgICAgICAgICAgJHRoaXMtPmRhdGFfID0gJHRoaXMtPnBfLT5nZXRUcmFuc3BvcnQoKS0+cmVhZEFsbCgxKTsKLSAgICAgICAgfQotCi0gICAgICAgICR0aGlzLT5oYXNEYXRhXyA9IHRydWU7Ci0gICAgICAgIHJldHVybiBzdWJzdHIoJHRoaXMtPmRhdGFfLCAwLCAxKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVGhyaWZ0L1Byb3RvY29sL0pTT04vUGFpckNvbnRleHQucGhwIGIvbGliL3BocC9saWIvVGhyaWZ0L1Byb3RvY29sL0pTT04vUGFpckNvbnRleHQucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzg3ZGQzLi4wMDAwMDAwCi0tLSBhL2xpYi9waHAvbGliL1RocmlmdC9Qcm90b2NvbC9KU09OL1BhaXJDb250ZXh0LnBocAorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAotICovCi0KLW5hbWVzcGFjZSBUaHJpZnRcUHJvdG9jb2xcSlNPTjsKLQotdXNlIFRocmlmdFxQcm90b2NvbFxKU09OXEJhc2VDb250ZXh0OwotdXNlIFRocmlmdFxQcm90b2NvbFxUSlNPTlByb3RvY29sOwotCi1jbGFzcyBQYWlyQ29udGV4dCBleHRlbmRzIEJhc2VDb250ZXh0IHsKLSAgICBwcml2YXRlICRmaXJzdF8gPSB0cnVlOwotICAgIHByaXZhdGUgJGNvbG9uXyA9IHRydWU7Ci0gICAgcHJpdmF0ZSAkcF8gPSBudWxsOwotCi0gICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRwKSB7Ci0gICAgICAgICR0aGlzLT5wXyA9ICRwOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZSgpIHsKLSAgICAgICAgaWYgKCR0aGlzLT5maXJzdF8pIHsKLSAgICAgICAgICAgICR0aGlzLT5maXJzdF8gPSBmYWxzZTsKLSAgICAgICAgICAgICR0aGlzLT5jb2xvbl8gPSB0cnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgJHRoaXMtPnBfLT5nZXRUcmFuc3BvcnQoKS0+d3JpdGUoJHRoaXMtPmNvbG9uXyA/IFRKU09OUHJvdG9jb2w6OkNPTE9OIDogVEpTT05Qcm90b2NvbDo6Q09NTUEpOwotICAgICAgICAgICAgJHRoaXMtPmNvbG9uXyA9ICEkdGhpcy0+Y29sb25fOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlYWQoKSB7Ci0gICAgICAgIGlmICgkdGhpcy0+Zmlyc3RfKSB7Ci0gICAgICAgICAgICAkdGhpcy0+Zmlyc3RfID0gZmFsc2U7Ci0gICAgICAgICAgICAkdGhpcy0+Y29sb25fID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICR0aGlzLT5wXy0+cmVhZEpTT05TeW50YXhDaGFyKCR0aGlzLT5jb2xvbl8gPyBUSlNPTlByb3RvY29sOjpDT0xPTiA6IFRKU09OUHJvdG9jb2w6OkNPTU1BKTsKLSAgICAgICAgICAgICR0aGlzLT5jb2xvbl8gPSAhJHRoaXMtPmNvbG9uXzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiBlc2NhcGVOdW0oKSB7Ci0gICAgICAgIHJldHVybiAkdGhpcy0+Y29sb25fOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvUHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLnBocCBiL2xpYi9waHAvbGliL1RocmlmdC9Qcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWZkZGFjLi4wMDAwMDAwCi0tLSBhL2xpYi9waHAvbGliL1RocmlmdC9Qcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wucGhwCisrKyAvZGV2L251bGwKQEAgLTEsMzk2ICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAotICovCi0KLW5hbWVzcGFjZSBUaHJpZnRcUHJvdG9jb2w7Ci0KLXVzZSBUaHJpZnRcUHJvdG9jb2xcVFByb3RvY29sOwotdXNlIFRocmlmdFxUeXBlXFRUeXBlOwotdXNlIFRocmlmdFxFeGNlcHRpb25cVFByb3RvY29sRXhjZXB0aW9uOwotdXNlIFRocmlmdFxGYWN0b3J5XFRTdHJpbmdGdW5jRmFjdG9yeTsKLQotLyoqCi0gKiBCaW5hcnkgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRocmlmdCBwcm90b2NvbC4KLSAqCi0gKi8KLWNsYXNzIFRCaW5hcnlQcm90b2NvbCBleHRlbmRzIFRQcm90b2NvbCB7Ci0KLSAgY29uc3QgVkVSU0lPTl9NQVNLID0gMHhmZmZmMDAwMDsKLSAgY29uc3QgVkVSU0lPTl8xID0gMHg4MDAxMDAwMDsKLQotICBwcm90ZWN0ZWQgJHN0cmljdFJlYWRfID0gZmFsc2U7Ci0gIHByb3RlY3RlZCAkc3RyaWN0V3JpdGVfID0gdHJ1ZTsKLQotICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHRyYW5zLCAkc3RyaWN0UmVhZD1mYWxzZSwgJHN0cmljdFdyaXRlPXRydWUpIHsKLSAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCR0cmFucyk7Ci0gICAgJHRoaXMtPnN0cmljdFJlYWRfID0gJHN0cmljdFJlYWQ7Ci0gICAgJHRoaXMtPnN0cmljdFdyaXRlXyA9ICRzdHJpY3RXcml0ZTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1lc3NhZ2VCZWdpbigkbmFtZSwgJHR5cGUsICRzZXFpZCkgewotICAgIGlmICgkdGhpcy0+c3RyaWN0V3JpdGVfKSB7Ci0gICAgICAkdmVyc2lvbiA9IHNlbGY6OlZFUlNJT05fMSB8ICR0eXBlOwotICAgICAgcmV0dXJuCi0gICAgICAgICR0aGlzLT53cml0ZUkzMigkdmVyc2lvbikgKwotICAgICAgICAkdGhpcy0+d3JpdGVTdHJpbmcoJG5hbWUpICsKLSAgICAgICAgJHRoaXMtPndyaXRlSTMyKCRzZXFpZCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybgotICAgICAgICAkdGhpcy0+d3JpdGVTdHJpbmcoJG5hbWUpICsKLSAgICAgICAgJHRoaXMtPndyaXRlQnl0ZSgkdHlwZSkgKwotICAgICAgICAkdGhpcy0+d3JpdGVJMzIoJHNlcWlkKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNZXNzYWdlRW5kKCkgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU3RydWN0QmVnaW4oJG5hbWUpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cnVjdEVuZCgpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkQmVnaW4oJGZpZWxkTmFtZSwgJGZpZWxkVHlwZSwgJGZpZWxkSWQpIHsKLSAgICByZXR1cm4KLSAgICAgICR0aGlzLT53cml0ZUJ5dGUoJGZpZWxkVHlwZSkgKwotICAgICAgJHRoaXMtPndyaXRlSTE2KCRmaWVsZElkKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkRW5kKCkgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRTdG9wKCkgewotICAgIHJldHVybgotICAgICAgJHRoaXMtPndyaXRlQnl0ZShUVHlwZTo6U1RPUCk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNYXBCZWdpbigka2V5VHlwZSwgJHZhbFR5cGUsICRzaXplKSB7Ci0gICAgcmV0dXJuCi0gICAgICAkdGhpcy0+d3JpdGVCeXRlKCRrZXlUeXBlKSArCi0gICAgICAkdGhpcy0+d3JpdGVCeXRlKCR2YWxUeXBlKSArCi0gICAgICAkdGhpcy0+d3JpdGVJMzIoJHNpemUpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWFwRW5kKCkgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTGlzdEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpIHsKLSAgICByZXR1cm4KLSAgICAgICR0aGlzLT53cml0ZUJ5dGUoJGVsZW1UeXBlKSArCi0gICAgICAkdGhpcy0+d3JpdGVJMzIoJHNpemUpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTGlzdEVuZCgpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVNldEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpIHsKLSAgICByZXR1cm4KLSAgICAgICR0aGlzLT53cml0ZUJ5dGUoJGVsZW1UeXBlKSArCi0gICAgICAkdGhpcy0+d3JpdGVJMzIoJHNpemUpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU2V0RW5kKCkgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlQm9vbCgkdmFsdWUpIHsKLSAgICAkZGF0YSA9IHBhY2soJ2MnLCAkdmFsdWUgPyAxIDogMCk7Ci0gICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoJGRhdGEsIDEpOwotICAgIHJldHVybiAxOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlQnl0ZSgkdmFsdWUpIHsKLSAgICAkZGF0YSA9IHBhY2soJ2MnLCAkdmFsdWUpOwotICAgICR0aGlzLT50cmFuc18tPndyaXRlKCRkYXRhLCAxKTsKLSAgICByZXR1cm4gMTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUkxNigkdmFsdWUpIHsKLSAgICAkZGF0YSA9IHBhY2soJ24nLCAkdmFsdWUpOwotICAgICR0aGlzLT50cmFuc18tPndyaXRlKCRkYXRhLCAyKTsKLSAgICByZXR1cm4gMjsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUkzMigkdmFsdWUpIHsKLSAgICAkZGF0YSA9IHBhY2soJ04nLCAkdmFsdWUpOwotICAgICR0aGlzLT50cmFuc18tPndyaXRlKCRkYXRhLCA0KTsKLSAgICByZXR1cm4gNDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUk2NCgkdmFsdWUpIHsKLSAgICAvLyBJZiB3ZSBhcmUgb24gYSAzMmJpdCBhcmNoaXRlY3R1cmUgd2UgaGF2ZSB0byBleHBsaWNpdGx5IGRlYWwgd2l0aAotICAgIC8vIDY0LWJpdCB0d29zLWNvbXBsZW1lbnQgYXJpdGhtZXRpYyBzaW5jZSBQSFAgd2FudHMgdG8gdHJlYXQgYWxsIGludHMKLSAgICAvLyBhcyBzaWduZWQgYW5kIGFueSBpbnQgb3ZlciAyXjMxIC0gMSBhcyBhIGZsb2F0Ci0gICAgaWYgKFBIUF9JTlRfU0laRSA9PSA0KSB7Ci0gICAgICAkbmVnID0gJHZhbHVlIDwgMDsKLQotICAgICAgaWYgKCRuZWcpIHsKLSAgICAgICAgJHZhbHVlICo9IC0xOwotICAgICAgfQotCi0gICAgICAkaGkgPSAoaW50KSgkdmFsdWUgLyA0Mjk0OTY3Mjk2KTsKLSAgICAgICRsbyA9IChpbnQpJHZhbHVlOwotCi0gICAgICBpZiAoJG5lZykgewotICAgICAgICAkaGkgPSB+JGhpOwotICAgICAgICAkbG8gPSB+JGxvOwotICAgICAgICBpZiAoKCRsbyAmIChpbnQpMHhmZmZmZmZmZikgPT0gKGludCkweGZmZmZmZmZmKSB7Ci0gICAgICAgICAgJGxvID0gMDsKLSAgICAgICAgICAkaGkrKzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAkbG8rKzsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgJGRhdGEgPSBwYWNrKCdOMicsICRoaSwgJGxvKTsKLQotICAgIH0gZWxzZSB7Ci0gICAgICAkaGkgPSAkdmFsdWUgPj4gMzI7Ci0gICAgICAkbG8gPSAkdmFsdWUgJiAweEZGRkZGRkZGOwotICAgICAgJGRhdGEgPSBwYWNrKCdOMicsICRoaSwgJGxvKTsKLSAgICB9Ci0KLSAgICAkdGhpcy0+dHJhbnNfLT53cml0ZSgkZGF0YSwgOCk7Ci0gICAgcmV0dXJuIDg7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVEb3VibGUoJHZhbHVlKSB7Ci0gICAgJGRhdGEgPSBwYWNrKCdkJywgJHZhbHVlKTsKLSAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzdHJyZXYoJGRhdGEpLCA4KTsKLSAgICByZXR1cm4gODsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cmluZygkdmFsdWUpIHsKLSAgICAkbGVuID0gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCR2YWx1ZSk7Ci0gICAgJHJlc3VsdCA9ICR0aGlzLT53cml0ZUkzMigkbGVuKTsKLSAgICBpZiAoJGxlbikgewotICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoJHZhbHVlLCAkbGVuKTsKLSAgICB9Ci0gICAgcmV0dXJuICRyZXN1bHQgKyAkbGVuOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRNZXNzYWdlQmVnaW4oJiRuYW1lLCAmJHR5cGUsICYkc2VxaWQpIHsKLSAgICAkcmVzdWx0ID0gJHRoaXMtPnJlYWRJMzIoJHN6KTsKLSAgICBpZiAoJHN6IDwgMCkgewotICAgICAgJHZlcnNpb24gPSAoaW50KSAoJHN6ICYgc2VsZjo6VkVSU0lPTl9NQVNLKTsKLSAgICAgIGlmICgkdmVyc2lvbiAhPSAoaW50KSBzZWxmOjpWRVJTSU9OXzEpIHsKLSAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbignQmFkIHZlcnNpb24gaWRlbnRpZmllcjogJy4kc3osIFRQcm90b2NvbEV4Y2VwdGlvbjo6QkFEX1ZFUlNJT04pOwotICAgICAgfQotICAgICAgJHR5cGUgPSAkc3ogJiAweDAwMDAwMGZmOwotICAgICAgJHJlc3VsdCArPQotICAgICAgICAkdGhpcy0+cmVhZFN0cmluZygkbmFtZSkgKwotICAgICAgICAkdGhpcy0+cmVhZEkzMigkc2VxaWQpOwotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAoJHRoaXMtPnN0cmljdFJlYWRfKSB7Ci0gICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oJ05vIHZlcnNpb24gaWRlbnRpZmllciwgb2xkIHByb3RvY29sIGNsaWVudD8nLCBUUHJvdG9jb2xFeGNlcHRpb246OkJBRF9WRVJTSU9OKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIEhhbmRsZSBwcmUtdmVyc2lvbmVkIGlucHV0Ci0gICAgICAgICRuYW1lID0gJHRoaXMtPnRyYW5zXy0+cmVhZEFsbCgkc3opOwotICAgICAgICAkcmVzdWx0ICs9Ci0gICAgICAgICAgJHN6ICsKLSAgICAgICAgICAkdGhpcy0+cmVhZEJ5dGUoJHR5cGUpICsKLSAgICAgICAgICAkdGhpcy0+cmVhZEkzMigkc2VxaWQpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gJHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkTWVzc2FnZUVuZCgpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RydWN0QmVnaW4oJiRuYW1lKSB7Ci0gICAgJG5hbWUgPSAnJzsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RydWN0RW5kKCkgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRGaWVsZEJlZ2luKCYkbmFtZSwgJiRmaWVsZFR5cGUsICYkZmllbGRJZCkgewotICAgICRyZXN1bHQgPSAkdGhpcy0+cmVhZEJ5dGUoJGZpZWxkVHlwZSk7Ci0gICAgaWYgKCRmaWVsZFR5cGUgPT0gVFR5cGU6OlNUT1ApIHsKLSAgICAgICRmaWVsZElkID0gMDsKLSAgICAgIHJldHVybiAkcmVzdWx0OwotICAgIH0KLSAgICAkcmVzdWx0ICs9ICR0aGlzLT5yZWFkSTE2KCRmaWVsZElkKTsKLSAgICByZXR1cm4gJHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkRmllbGRFbmQoKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1hcEJlZ2luKCYka2V5VHlwZSwgJiR2YWxUeXBlLCAmJHNpemUpIHsKLSAgICByZXR1cm4KLSAgICAgICR0aGlzLT5yZWFkQnl0ZSgka2V5VHlwZSkgKwotICAgICAgJHRoaXMtPnJlYWRCeXRlKCR2YWxUeXBlKSArCi0gICAgICAkdGhpcy0+cmVhZEkzMigkc2l6ZSk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1hcEVuZCgpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkTGlzdEJlZ2luKCYkZWxlbVR5cGUsICYkc2l6ZSkgewotICAgIHJldHVybgotICAgICAgJHRoaXMtPnJlYWRCeXRlKCRlbGVtVHlwZSkgKwotICAgICAgJHRoaXMtPnJlYWRJMzIoJHNpemUpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRMaXN0RW5kKCkgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRTZXRCZWdpbigmJGVsZW1UeXBlLCAmJHNpemUpIHsKLSAgICByZXR1cm4KLSAgICAgICR0aGlzLT5yZWFkQnl0ZSgkZWxlbVR5cGUpICsKLSAgICAgICR0aGlzLT5yZWFkSTMyKCRzaXplKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkU2V0RW5kKCkgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRCb29sKCYkdmFsdWUpIHsKLSAgICAkZGF0YSA9ICR0aGlzLT50cmFuc18tPnJlYWRBbGwoMSk7Ci0gICAgJGFyciA9IHVucGFjaygnYycsICRkYXRhKTsKLSAgICAkdmFsdWUgPSAkYXJyWzFdID09IDE7Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZEJ5dGUoJiR2YWx1ZSkgewotICAgICRkYXRhID0gJHRoaXMtPnRyYW5zXy0+cmVhZEFsbCgxKTsKLSAgICAkYXJyID0gdW5wYWNrKCdjJywgJGRhdGEpOwotICAgICR2YWx1ZSA9ICRhcnJbMV07Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZEkxNigmJHZhbHVlKSB7Ci0gICAgJGRhdGEgPSAkdGhpcy0+dHJhbnNfLT5yZWFkQWxsKDIpOwotICAgICRhcnIgPSB1bnBhY2soJ24nLCAkZGF0YSk7Ci0gICAgJHZhbHVlID0gJGFyclsxXTsKLSAgICBpZiAoJHZhbHVlID4gMHg3ZmZmKSB7Ci0gICAgICAkdmFsdWUgPSAwIC0gKCgkdmFsdWUgLSAxKSBeIDB4ZmZmZik7Ci0gICAgfQotICAgIHJldHVybiAyOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRJMzIoJiR2YWx1ZSkgewotICAgICRkYXRhID0gJHRoaXMtPnRyYW5zXy0+cmVhZEFsbCg0KTsKLSAgICAkYXJyID0gdW5wYWNrKCdOJywgJGRhdGEpOwotICAgICR2YWx1ZSA9ICRhcnJbMV07Ci0gICAgaWYgKCR2YWx1ZSA+IDB4N2ZmZmZmZmYpIHsKLSAgICAgICR2YWx1ZSA9IDAgLSAoKCR2YWx1ZSAtIDEpIF4gMHhmZmZmZmZmZik7Ci0gICAgfQotICAgIHJldHVybiA0OwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRJNjQoJiR2YWx1ZSkgewotICAgICRkYXRhID0gJHRoaXMtPnRyYW5zXy0+cmVhZEFsbCg4KTsKLQotICAgICRhcnIgPSB1bnBhY2soJ04yJywgJGRhdGEpOwotCi0gICAgLy8gSWYgd2UgYXJlIG9uIGEgMzJiaXQgYXJjaGl0ZWN0dXJlIHdlIGhhdmUgdG8gZXhwbGljaXRseSBkZWFsIHdpdGgKLSAgICAvLyA2NC1iaXQgdHdvcy1jb21wbGVtZW50IGFyaXRobWV0aWMgc2luY2UgUEhQIHdhbnRzIHRvIHRyZWF0IGFsbCBpbnRzCi0gICAgLy8gYXMgc2lnbmVkIGFuZCBhbnkgaW50IG92ZXIgMl4zMSAtIDEgYXMgYSBmbG9hdAotICAgIGlmIChQSFBfSU5UX1NJWkUgPT0gNCkgewotCi0gICAgICAkaGkgPSAkYXJyWzFdOwotICAgICAgJGxvID0gJGFyclsyXTsKLSAgICAgICRpc05lZyA9ICRoaSAgPCAwOwotCi0gICAgICAvLyBDaGVjayBmb3IgYSBuZWdhdGl2ZQotICAgICAgaWYgKCRpc05lZykgewotICAgICAgICAkaGkgPSB+JGhpICYgKGludCkweGZmZmZmZmZmOwotICAgICAgICAkbG8gPSB+JGxvICYgKGludCkweGZmZmZmZmZmOwotCi0gICAgICAgIGlmICgkbG8gPT0gKGludCkweGZmZmZmZmZmKSB7Ci0gICAgICAgICAgJGhpKys7Ci0gICAgICAgICAgJGxvID0gMDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAkbG8rKzsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvLyBGb3JjZSAzMmJpdCB3b3JkcyBpbiBleGNlc3Mgb2YgMkcgdG8gcGUgcG9zaXRpdmUgLSB3ZSBkZWFsIHdpZ2ggc2lnbgotICAgICAgLy8gZXhwbGljaXRseSBiZWxvdwotCi0gICAgICBpZiAoJGhpICYgKGludCkweDgwMDAwMDAwKSB7Ci0gICAgICAgICRoaSAmPSAoaW50KTB4N2ZmZmZmZmY7Ci0gICAgICAgICRoaSArPSAweDgwMDAwMDAwOwotICAgICAgfQotCi0gICAgICBpZiAoJGxvICYgKGludCkweDgwMDAwMDAwKSB7Ci0gICAgICAgICRsbyAmPSAoaW50KTB4N2ZmZmZmZmY7Ci0gICAgICAgICRsbyArPSAweDgwMDAwMDAwOwotICAgICAgfQotCi0gICAgICAkdmFsdWUgPSAkaGkgKiA0Mjk0OTY3Mjk2ICsgJGxvOwotCi0gICAgICBpZiAoJGlzTmVnKSB7Ci0gICAgICAgICR2YWx1ZSA9IDAgLSAkdmFsdWU7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLQotICAgICAgLy8gVXBjYXN0IG5lZ2F0aXZlcyBpbiBMU0IgYml0Ci0gICAgICBpZiAoJGFyclsyXSAmIDB4ODAwMDAwMDApIHsKLSAgICAgICAgJGFyclsyXSA9ICRhcnJbMl0gJiAweGZmZmZmZmZmOwotICAgICAgfQotCi0gICAgICAvLyBDaGVjayBmb3IgYSBuZWdhdGl2ZQotICAgICAgaWYgKCRhcnJbMV0gJiAweDgwMDAwMDAwKSB7Ci0gICAgICAgICRhcnJbMV0gPSAkYXJyWzFdICYgMHhmZmZmZmZmZjsKLSAgICAgICAgJGFyclsxXSA9ICRhcnJbMV0gXiAweGZmZmZmZmZmOwotICAgICAgICAkYXJyWzJdID0gJGFyclsyXSBeIDB4ZmZmZmZmZmY7Ci0gICAgICAgICR2YWx1ZSA9IDAgLSAkYXJyWzFdKjQyOTQ5NjcyOTYgLSAkYXJyWzJdIC0gMTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgICR2YWx1ZSA9ICRhcnJbMV0qNDI5NDk2NzI5NiArICRhcnJbMl07Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIDg7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZERvdWJsZSgmJHZhbHVlKSB7Ci0gICAgJGRhdGEgPSBzdHJyZXYoJHRoaXMtPnRyYW5zXy0+cmVhZEFsbCg4KSk7Ci0gICAgJGFyciA9IHVucGFjaygnZCcsICRkYXRhKTsKLSAgICAkdmFsdWUgPSAkYXJyWzFdOwotICAgIHJldHVybiA4OwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJpbmcoJiR2YWx1ZSkgewotICAgICRyZXN1bHQgPSAkdGhpcy0+cmVhZEkzMigkbGVuKTsKLSAgICBpZiAoJGxlbikgewotICAgICAgJHZhbHVlID0gJHRoaXMtPnRyYW5zXy0+cmVhZEFsbCgkbGVuKTsKLSAgICB9IGVsc2UgewotICAgICAgJHZhbHVlID0gJyc7Ci0gICAgfQotICAgIHJldHVybiAkcmVzdWx0ICsgJGxlbjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVGhyaWZ0L1Byb3RvY29sL1RCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkLnBocCBiL2xpYi9waHAvbGliL1RocmlmdC9Qcm90b2NvbC9UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZC5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhNDBjZTkuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9saWIvVGhyaWZ0L1Byb3RvY29sL1RCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkLnBocAorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAotICovCi0KLW5hbWVzcGFjZSBUaHJpZnRcUHJvdG9jb2w7Ci0KLXVzZSBUaHJpZnRcUHJvdG9jb2xcVEJpbmFyeVByb3RvY29sOwotdXNlIFRocmlmdFxUcmFuc3BvcnRcVEJ1ZmZlcmVkVHJhbnNwb3J0OwotCi0vKioKLSAqIEFjY2VsZXJhdGVkIGJpbmFyeSBwcm90b2NvbDogdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSB0aHJpZnRfcHJvdG9jb2wKLSAqIGV4dGVuc2lvbiBmb3IgZmFzdGVyIGRlc2VyaWFsaXphdGlvbgotICovCi1jbGFzcyBUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCBleHRlbmRzIFRCaW5hcnlQcm90b2NvbCB7Ci0gIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkdHJhbnMsICRzdHJpY3RSZWFkPWZhbHNlLCAkc3RyaWN0V3JpdGU9dHJ1ZSkgewotICAgIC8vIElmIHRoZSB0cmFuc3BvcnQgZG9lc24ndCBpbXBsZW1lbnQgcHV0QmFjaywgd3JhcCBpdCBpbiBhCi0gICAgLy8gVEJ1ZmZlcmVkVHJhbnNwb3J0ICh3aGljaCBkb2VzKQotICAgIAotICAgIC8vIE5PVEUgKHQuaGVpbnR6KTogVGhpcyBpcyB2ZXJ5IGV2aWwgdG8gZG8sIGJlY2F1c2UgdGhlIFRCdWZmZXJlZFRyYW5zcG9ydCBtYXkgc3dhbGxvdyBieXRlcywgd2hpY2gKLSAgICAvLyBhcmUgdGhlbiBuZXZlciB3cml0dGVuIHRvIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydC4gVGhpcyBoYXBwZW5zIHByZWNpc2VseSB3aGVuIGEgbnVtYmVyIG9mIGJ5dGVzCi0gICAgLy8gbGVzcyB0aGFuIHRoZSBtYXggYnVmZmVyIHNpemUgKDUxMiBieSBkZWZhdWx0KSBpcyB3cml0dGVuIHRvIHRoZSB0cmFuc3BvcnQgYW5kIHRoZW4gZmx1c2goKSBpcyBOT1QKLSAgICAvLyBjYWxsZWQuIEluIHRoYXQgY2FzZSB0aGUgZGF0YSBzdGF5cyBpbiB0aGUgd3JpdGVCdWZmZXIgb2YgdGhlIHRyYW5zcG9ydCwgZnJvbSB3aGVyZSBpdCBjYW4gbmV2ZXIgYmUKLSAgICAvLyBhY2Nlc3NlZCBhZ2FpbiAoZm9yIGV4YW1wbGUgdGhyb3VnaCByZWFkKCkpLgotICAgIC8vCi0gICAgLy8gU2luY2UgdGhlIGNhbGxlciBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBrbm93IGFib3V0IHRoZSB3cmFwcGluZyB0cmFuc3BvcnQsIHRoaXMgY3JlYXRlcyBidWdzIHdoaWNoCi0gICAgLy8gYXJlIHZlcnkgZGlmZmljdWx0IHRvIGZpbmQuIEhlbmNlIHRoZSB3cmFwcGluZyBvZiBhIHRyYW5zcG9ydCBpbiBhIGJ1ZmZlciBzaG91bGQgYmUgbGVmdCB0byB0aGUKLSAgICAvLyBjYWxsaW5nIGNvZGUuIEFuIGludGVyZmFjZSBjb3VsZCB1c2VkIHRvIG1hbmRhdGUgdGhlIHByZXNlbmNlIG9mIHRoZSBwdXRCYWNrKCkgbWV0aG9kIGluIHRoZSB0cmFuc3BvcnQuCi0gICAgLy8KLSAgICAvLyBJIGFtIGxlYXZpbmcgdGhpcyBjb2RlIGluIG5vbmV0aGVsZXNzLCBiZWNhdXNlIHRoZXJlIG1heSBiZSBhcHBsaWNhdGlvbnMgZGVwZW5kaW5nIG9uIHRoaXMgYmVoYXZpb3IuCi0gICAgLy8KLSAgICAvLyBAc2VlIFRIUklGVC0xNTc5Ci0gICAgCi0gICAgaWYgKCFtZXRob2RfZXhpc3RzKCR0cmFucywgJ3B1dEJhY2snKSkgewotICAgICAgJHRyYW5zID0gbmV3IFRCdWZmZXJlZFRyYW5zcG9ydCgkdHJhbnMpOwotICAgIH0KLSAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCR0cmFucywgJHN0cmljdFJlYWQsICRzdHJpY3RXcml0ZSk7Ci0gIH0KLSAgcHVibGljIGZ1bmN0aW9uIGlzU3RyaWN0UmVhZCgpIHsKLSAgICByZXR1cm4gJHRoaXMtPnN0cmljdFJlYWRfOwotICB9Ci0gIHB1YmxpYyBmdW5jdGlvbiBpc1N0cmljdFdyaXRlKCkgewotICAgIHJldHVybiAkdGhpcy0+c3RyaWN0V3JpdGVfOwotICB9Ci19CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvUHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5waHAgYi9saWIvcGhwL2xpYi9UaHJpZnQvUHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4YTcxZDYuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9saWIvVGhyaWZ0L1Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wucGhwCisrKyAvZGV2L251bGwKQEAgLTEsNjY5ICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAotICovCi0KLW5hbWVzcGFjZSBUaHJpZnRcUHJvdG9jb2w7Ci0KLXVzZSBUaHJpZnRcUHJvdG9jb2xcVFByb3RvY29sOwotdXNlIFRocmlmdFxUeXBlXFRUeXBlOwotdXNlIFRocmlmdFxFeGNlcHRpb25cVFByb3RvY29sRXhjZXB0aW9uOwotdXNlIFRocmlmdFxGYWN0b3J5XFRTdHJpbmdGdW5jRmFjdG9yeTsKLQotLyoqCi0gKiBDb21wYWN0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBUaHJpZnQgcHJvdG9jb2wuCi0gKgotICovCi1jbGFzcyBUQ29tcGFjdFByb3RvY29sIGV4dGVuZHMgVFByb3RvY29sIHsKLQotICBjb25zdCBDT01QQUNUX1NUT1AgPSAweDAwOwotICBjb25zdCBDT01QQUNUX1RSVUUgPSAweDAxOwotICBjb25zdCBDT01QQUNUX0ZBTFNFID0gMHgwMjsKLSAgY29uc3QgQ09NUEFDVF9CWVRFID0gMHgwMzsKLSAgY29uc3QgQ09NUEFDVF9JMTYgPSAweDA0OwotICBjb25zdCBDT01QQUNUX0kzMiA9IDB4MDU7Ci0gIGNvbnN0IENPTVBBQ1RfSTY0ID0gMHgwNjsKLSAgY29uc3QgQ09NUEFDVF9ET1VCTEUgPSAweDA3OwotICBjb25zdCBDT01QQUNUX0JJTkFSWSA9IDB4MDg7Ci0gIGNvbnN0IENPTVBBQ1RfTElTVCA9IDB4MDk7Ci0gIGNvbnN0IENPTVBBQ1RfU0VUID0gMHgwQTsKLSAgY29uc3QgQ09NUEFDVF9NQVAgPSAweDBCOwotICBjb25zdCBDT01QQUNUX1NUUlVDVCA9IDB4MEM7Ci0KLSAgY29uc3QgU1RBVEVfQ0xFQVIgPSAwOwotICBjb25zdCBTVEFURV9GSUVMRF9XUklURSA9IDE7Ci0gIGNvbnN0IFNUQVRFX1ZBTFVFX1dSSVRFID0gMjsKLSAgY29uc3QgU1RBVEVfQ09OVEFJTkVSX1dSSVRFID0gMzsKLSAgY29uc3QgU1RBVEVfQk9PTF9XUklURSA9IDQ7Ci0gIGNvbnN0IFNUQVRFX0ZJRUxEX1JFQUQgPSA1OwotICBjb25zdCBTVEFURV9DT05UQUlORVJfUkVBRCA9IDY7Ci0gIGNvbnN0IFNUQVRFX1ZBTFVFX1JFQUQgPSA3OwotICBjb25zdCBTVEFURV9CT09MX1JFQUQgPSA4OwotCi0gIGNvbnN0IFZFUlNJT05fTUFTSyA9IDB4MWY7Ci0gIGNvbnN0IFZFUlNJT04gPSAxOwotICBjb25zdCBQUk9UT0NPTF9JRCA9IDB4ODI7Ci0gIGNvbnN0IFRZUEVfTUFTSyA9IDB4ZTA7Ci0gIGNvbnN0IFRZUEVfQklUUyA9IDB4MDc7Ci0gIGNvbnN0IFRZUEVfU0hJRlRfQU1PVU5UID0gNTsKLQotICBwcm90ZWN0ZWQgc3RhdGljICRjdHlwZXMgPSBhcnJheSgKLSAgICBUVHlwZTo6U1RPUCA9PiBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX1NUT1AsCi0gICAgVFR5cGU6OkJPT0wgPT4gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9UUlVFLCAvLyB1c2VkIGZvciBjb2xsZWN0aW9uCi0gICAgVFR5cGU6OkJZVEUgPT4gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9CWVRFLAotICAgIFRUeXBlOjpJMTYgPT4gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9JMTYsCi0gICAgVFR5cGU6OkkzMiA9PiBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX0kzMiwKLSAgICBUVHlwZTo6STY0ID0+IFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfSTY0LAotICAgIFRUeXBlOjpET1VCTEUgPT4gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9ET1VCTEUsCi0gICAgVFR5cGU6OlNUUklORyA9PiBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX0JJTkFSWSwKLSAgICBUVHlwZTo6U1RSVUNUID0+IFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfU1RSVUNULAotICAgIFRUeXBlOjpMU1QgPT4gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9MSVNULAotICAgIFRUeXBlOjpTRVQgPT4gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9TRVQsCi0gICAgVFR5cGU6Ok1BUCA9PiBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX01BUCwKLSAgKTsKLQotICBwcm90ZWN0ZWQgc3RhdGljICR0dHlwZXMgPSBhcnJheSgKLSAgICBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX1NUT1AgPT4gVFR5cGU6OlNUT1AgLAotICAgIFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfVFJVRSA9PiBUVHlwZTo6Qk9PTCwgLy8gdXNlZCBmb3IgY29sbGVjdGlvbgotICAgIFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfRkFMU0UgPT4gVFR5cGU6OkJPT0wsCi0gICAgVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9CWVRFID0+IFRUeXBlOjpCWVRFLAotICAgIFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfSTE2ID0+IFRUeXBlOjpJMTYsCi0gICAgVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9JMzIgPT4gVFR5cGU6OkkzMiwKLSAgICBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX0k2NCA9PiBUVHlwZTo6STY0LAotICAgIFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfRE9VQkxFID0+IFRUeXBlOjpET1VCTEUsCi0gICAgVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9CSU5BUlkgPT4gVFR5cGU6OlNUUklORywKLSAgICBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX1NUUlVDVCA9PiBUVHlwZTo6U1RSVUNULAotICAgIFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfTElTVCA9PiBUVHlwZTo6TFNULAotICAgIFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfU0VUID0+IFRUeXBlOjpTRVQsCi0gICAgVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9NQVAgPT4gVFR5cGU6Ok1BUCwKLSAgKTsKLQotICBwcm90ZWN0ZWQgJHN0YXRlID0gVENvbXBhY3RQcm90b2NvbDo6U1RBVEVfQ0xFQVI7Ci0gIHByb3RlY3RlZCAkbGFzdEZpZCA9IDA7Ci0gIHByb3RlY3RlZCAkYm9vbEZpZCA9IG51bGw7Ci0gIHByb3RlY3RlZCAkYm9vbFZhbHVlID0gbnVsbDsKLSAgcHJvdGVjdGVkICRzdHJ1Y3RzID0gYXJyYXkoKTsKLSAgcHJvdGVjdGVkICRjb250YWluZXJzID0gYXJyYXkoKTsKLQotICAvLyBTb21lIHZhcmludCAvIHppZ3phZyBoZWxwZXIgbWV0aG9kcwotICBwdWJsaWMgZnVuY3Rpb24gdG9aaWdaYWcoJG4sICRiaXRzKSB7Ci0gICAgcmV0dXJuICgkbiA8PCAxKSBeICgkbiA+PiAoJGJpdHMgLSAxKSk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gZnJvbVppZ1phZygkbikgewotICAgIHJldHVybiAoJG4gPj4gMSkgXiAtKCRuICYgMSk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gZ2V0VmFyaW50KCRkYXRhKSB7Ci0gICAgJG91dCA9ICIiOwotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICBpZiAoKCRkYXRhICYgfjB4N2YpID09PSAwKSB7Ci0gICAgICAgICRvdXQgLj0gY2hyKCRkYXRhKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAkb3V0IC49IGNocigoJGRhdGEgJiAweGZmKSB8IDB4ODApOwotICAgICAgICAkZGF0YSA9ICRkYXRhID4+IDc7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiAkb3V0OwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlVmFyaW50KCRkYXRhKSB7Ci0gICAgJG91dCA9ICR0aGlzLT5nZXRWYXJpbnQoJGRhdGEpOwotICAgICRyZXN1bHQgPSBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJG91dCk7Ci0gICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoJG91dCwgJHJlc3VsdCk7Ci0gICAgcmV0dXJuICRyZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZFZhcmludCgmJHJlc3VsdCkgewotICAgICRpZHggPSAwOwotICAgICRzaGlmdCA9IDA7Ci0gICAgJHJlc3VsdCA9IDA7Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICR4ID0gJHRoaXMtPnRyYW5zXy0+cmVhZEFsbCgxKTsKLSAgICAgICRhcnIgPSB1bnBhY2soJ0MnLCAkeCk7Ci0gICAgICAkYnl0ZSA9ICRhcnJbMV07Ci0gICAgICAkaWR4ICs9IDE7Ci0gICAgICAkcmVzdWx0IHw9ICgkYnl0ZSAmIDB4N2YpIDw8ICRzaGlmdDsKLSAgICAgIGlmICgoJGJ5dGUgPj4gNykgPT09IDApIHsKLSAgICAgICAgcmV0dXJuICRpZHg7Ci0gICAgICB9Ci0gICAgICAkc2hpZnQgKz0gNzsKLSAgICB9Ci0KLSAgICByZXR1cm4gJGlkeDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkdHJhbnMpIHsKLSAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCR0cmFucyk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNZXNzYWdlQmVnaW4oJG5hbWUsICR0eXBlLCAkc2VxaWQpIHsKLSAgICAkd3JpdHRlbiA9Ci0gICAgICAkdGhpcy0+d3JpdGVVQnl0ZShUQ29tcGFjdFByb3RvY29sOjpQUk9UT0NPTF9JRCkgKwotICAgICAgJHRoaXMtPndyaXRlVUJ5dGUoVENvbXBhY3RQcm90b2NvbDo6VkVSU0lPTiB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAoJHR5cGUgPDwgVENvbXBhY3RQcm90b2NvbDo6VFlQRV9TSElGVF9BTU9VTlQpKSArCi0gICAgICAkdGhpcy0+d3JpdGVWYXJpbnQoJHNlcWlkKSArCi0gICAgICAkdGhpcy0+d3JpdGVTdHJpbmcoJG5hbWUpOwotICAgICR0aGlzLT5zdGF0ZSA9IFRDb21wYWN0UHJvdG9jb2w6OlNUQVRFX1ZBTFVFX1dSSVRFOwotICAgIHJldHVybiAkd3JpdHRlbjsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1lc3NhZ2VFbmQoKSB7Ci0gICAgJHRoaXMtPnN0YXRlID0gVENvbXBhY3RQcm90b2NvbDo6U1RBVEVfQ0xFQVI7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJ1Y3RCZWdpbigkbmFtZSkgewotICAgICR0aGlzLT5zdHJ1Y3RzW10gPSBhcnJheSgkdGhpcy0+c3RhdGUsICR0aGlzLT5sYXN0RmlkKTsKLSAgICAkdGhpcy0+c3RhdGUgPSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9GSUVMRF9XUklURTsKLSAgICAkdGhpcy0+bGFzdEZpZCA9IDA7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJ1Y3RFbmQoKSB7Ci0gICAgJG9sZF92YWx1ZXMgPSBhcnJheV9wb3AoJHRoaXMtPnN0cnVjdHMpOwotICAgICR0aGlzLT5zdGF0ZSA9ICRvbGRfdmFsdWVzWzBdOwotICAgICR0aGlzLT5sYXN0RmlkID0gJG9sZF92YWx1ZXNbMV07Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZFN0b3AoKSB7Ci0gICAgcmV0dXJuICR0aGlzLT53cml0ZUJ5dGUoMCk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZEhlYWRlcigkdHlwZSwgJGZpZCkgewotICAgICR3cml0dGVuID0gMDsKLSAgICAkZGVsdGEgPSAkZmlkIC0gJHRoaXMtPmxhc3RGaWQ7Ci0gICAgaWYgKDAgPCAkZGVsdGEgJiYgJGRlbHRhIDw9IDE1KSB7Ci0gICAgICAkd3JpdHRlbiA9ICR0aGlzLT53cml0ZVVCeXRlKCgkZGVsdGEgPDwgNCkgfCAkdHlwZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICR3cml0dGVuID0gJHRoaXMtPndyaXRlQnl0ZSgkdHlwZSkgKwotICAgICAgICAkdGhpcy0+d3JpdGVJMTYoJGZpZCk7Ci0gICAgfQotICAgICR0aGlzLT5sYXN0RmlkID0gJGZpZDsKLSAgICByZXR1cm4gJHdyaXR0ZW47Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZEJlZ2luKCRmaWVsZF9uYW1lLCAkZmllbGRfdHlwZSwgJGZpZWxkX2lkKSB7Ci0gICAgaWYgKCRmaWVsZF90eXBlID09IFRUWVBFOjpCT09MKSB7Ci0gICAgICAkdGhpcy0+c3RhdGUgPSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9CT09MX1dSSVRFOwotICAgICAgJHRoaXMtPmJvb2xGaWQgPSAkZmllbGRfaWQ7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9IGVsc2UgewotICAgICAgJHRoaXMtPnN0YXRlID0gVENvbXBhY3RQcm90b2NvbDo6U1RBVEVfVkFMVUVfV1JJVEU7Ci0gICAgICByZXR1cm4gJHRoaXMtPndyaXRlRmllbGRIZWFkZXIoc2VsZjo6JGN0eXBlc1skZmllbGRfdHlwZV0sICRmaWVsZF9pZCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRFbmQoKSB7Ci0gICAgJHRoaXMtPnN0YXRlID0gVENvbXBhY3RQcm90b2NvbDo6U1RBVEVfRklFTERfV1JJVEU7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVDb2xsZWN0aW9uQmVnaW4oJGV0eXBlLCAkc2l6ZSkgewotICAgICR3cml0dGVuID0gMDsKLSAgICBpZiAoJHNpemUgPD0gMTQpIHsKLSAgICAgICR3cml0dGVuID0gJHRoaXMtPndyaXRlVUJ5dGUoJHNpemUgPDwgNCB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmOjokY3R5cGVzWyRldHlwZV0pOwotICAgIH0gZWxzZSB7Ci0gICAgICAkd3JpdHRlbiA9ICR0aGlzLT53cml0ZVVCeXRlKDB4ZjAgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmOjokY3R5cGVzWyRldHlwZV0pICsKLSAgICAgICAgJHRoaXMtPndyaXRlVmFyaW50KCRzaXplKTsKLSAgICB9Ci0gICAgJHRoaXMtPmNvbnRhaW5lcnNbXSA9ICR0aGlzLT5zdGF0ZTsKLSAgICAkdGhpcy0+c3RhdGUgPSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9DT05UQUlORVJfV1JJVEU7Ci0KLSAgICByZXR1cm4gJHdyaXR0ZW47Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNYXBCZWdpbigka2V5X3R5cGUsICR2YWxfdHlwZSwgJHNpemUpIHsKLSAgICAkd3JpdHRlbiA9IDA7Ci0gICAgaWYgKCRzaXplID09IDApIHsKLSAgICAgICR3cml0dGVuID0gJHRoaXMtPndyaXRlQnl0ZSgwKTsKLSAgICB9IGVsc2UgewotICAgICAgJHdyaXR0ZW4gPSAkdGhpcy0+d3JpdGVWYXJpbnQoJHNpemUpICsKLSAgICAgICAgJHRoaXMtPndyaXRlVUJ5dGUoc2VsZjo6JGN0eXBlc1ska2V5X3R5cGVdIDw8IDQgfAotICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmOjokY3R5cGVzWyR2YWxfdHlwZV0pOwotICAgIH0KLSAgICAkdGhpcy0+Y29udGFpbmVyc1tdID0gJHRoaXMtPnN0YXRlOwotICAgIHJldHVybiAkd3JpdHRlbjsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUNvbGxlY3Rpb25FbmQoKSB7Ci0gICAgJHRoaXMtPnN0YXRlID0gYXJyYXlfcG9wKCR0aGlzLT5jb250YWluZXJzKTsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1hcEVuZCgpIHsKLSAgICByZXR1cm4gJHRoaXMtPndyaXRlQ29sbGVjdGlvbkVuZCgpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTGlzdEJlZ2luKCRlbGVtX3R5cGUsICRzaXplKSB7Ci0gICAgcmV0dXJuICR0aGlzLT53cml0ZUNvbGxlY3Rpb25CZWdpbigkZWxlbV90eXBlLCAkc2l6ZSk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVMaXN0RW5kKCkgewotICAgIHJldHVybiAkdGhpcy0+d3JpdGVDb2xsZWN0aW9uRW5kKCk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTZXRCZWdpbigkZWxlbV90eXBlLCAkc2l6ZSkgewotICAgIHJldHVybiAkdGhpcy0+d3JpdGVDb2xsZWN0aW9uQmVnaW4oJGVsZW1fdHlwZSwgJHNpemUpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU2V0RW5kKCkgewotICAgIHJldHVybiAkdGhpcy0+d3JpdGVDb2xsZWN0aW9uRW5kKCk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVCb29sKCR2YWx1ZSkgewotICAgIGlmICgkdGhpcy0+c3RhdGUgPT0gVENvbXBhY3RQcm90b2NvbDo6U1RBVEVfQk9PTF9XUklURSkgewotICAgICAgJGN0eXBlID0gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9GQUxTRTsKLSAgICAgIGlmICgkdmFsdWUpIHsKLSAgICAgICAgJGN0eXBlID0gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9UUlVFOwotICAgICAgfQotICAgICAgcmV0dXJuICR0aGlzLT53cml0ZUZpZWxkSGVhZGVyKCRjdHlwZSwgJHRoaXMtPmJvb2xGaWQpOwotICAgIH0gZWxzZSBpZiAoJHRoaXMtPnN0YXRlID09IFRDb21wYWN0UHJvdG9jb2w6OlNUQVRFX0NPTlRBSU5FUl9XUklURSkgewotICAgICAgcmV0dXJuICR0aGlzLT53cml0ZUJ5dGUoJHZhbHVlID8gMSA6IDApOwotICAgIH0gZWxzZSB7Ci0gICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCdJbnZhbGlkIHN0YXRlIGluIGNvbXBhY3QgcHJvdG9jb2wnKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVCeXRlKCR2YWx1ZSkgewotICAgICRkYXRhID0gcGFjaygnYycsICR2YWx1ZSk7Ci0gICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoJGRhdGEsIDEpOwotICAgIHJldHVybiAxOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlVUJ5dGUoJGJ5dGUpIHsKLSAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShwYWNrKCdDJywgJGJ5dGUpLCAxKTsKLSAgICByZXR1cm4gMTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUkxNigkdmFsdWUpIHsKLSAgICAkdGhpbmcgPSAkdGhpcy0+dG9aaWdaYWcoJHZhbHVlLCAxNik7Ci0gICAgcmV0dXJuICR0aGlzLT53cml0ZVZhcmludCgkdGhpbmcpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTMyKCR2YWx1ZSkgewotICAgICR0aGluZyA9ICR0aGlzLT50b1ppZ1phZygkdmFsdWUsIDMyKTsKLSAgICByZXR1cm4gJHRoaXMtPndyaXRlVmFyaW50KCR0aGluZyk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVEb3VibGUoJHZhbHVlKSB7Ci0gICAgJGRhdGEgPSBwYWNrKCdkJywgJHZhbHVlKTsKLSAgICAkdGhpcy0+dHJhbnNfLT53cml0ZSgkZGF0YSwgOCk7Ci0gICAgcmV0dXJuIDg7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJpbmcoJHZhbHVlKSB7Ci0gICAgJGxlbiA9IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkdmFsdWUpOwotICAgICRyZXN1bHQgPSAkdGhpcy0+d3JpdGVWYXJpbnQoJGxlbik7Ci0gICAgaWYgKCRsZW4pIHsKLSAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKCR2YWx1ZSwgJGxlbik7Ci0gICAgfQotICAgIHJldHVybiAkcmVzdWx0ICsgJGxlbjsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkRmllbGRCZWdpbigmJG5hbWUsICYkZmllbGRfdHlwZSwgJiRmaWVsZF9pZCkgewotICAgICRyZXN1bHQgPSAkdGhpcy0+cmVhZFVCeXRlKCRmaWVsZF90eXBlKTsKLQotICAgIGlmICgoJGZpZWxkX3R5cGUgJiAweDBmKSA9PSBUVHlwZTo6U1RPUCkgewotICAgICAgJGZpZWxkX2lkID0gMDsKLSAgICAgIHJldHVybiAkcmVzdWx0OwotICAgIH0KLSAgICAkZGVsdGEgPSAkZmllbGRfdHlwZSA+PiA0OwotICAgIGlmICgkZGVsdGEgPT0gMCkgewotICAgICAgJHJlc3VsdCArPSAkdGhpcy0+cmVhZEkxNigkZmllbGRfaWQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAkZmllbGRfaWQgPSAkdGhpcy0+bGFzdEZpZCArICRkZWx0YTsKLSAgICB9Ci0gICAgJHRoaXMtPmxhc3RGaWQgPSAkZmllbGRfaWQ7Ci0gICAgJGZpZWxkX3R5cGUgPSAkdGhpcy0+Z2V0VFR5cGUoJGZpZWxkX3R5cGUgJiAweDBmKTsKLSAgICBpZiAoJGZpZWxkX3R5cGUgPT0gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9UUlVFKSB7Ci0gICAgICAkdGhpcy0+c3RhdGUgPSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9CT09MX1JFQUQ7Ci0gICAgICAkdGhpcy0+Ym9vbFZhbHVlID0gdHJ1ZTsKLSAgICB9IGVsc2UgaWYgKCRmaWVsZF90eXBlID09IFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfRkFMU0UpIHsKLSAgICAgICR0aGlzLT5zdGF0ZSA9IFRDb21wYWN0UHJvdG9jb2w6OlNUQVRFX0JPT0xfUkVBRDsKLSAgICAgICR0aGlzLT5ib29sVmFsdWUgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgJHRoaXMtPnN0YXRlID0gVENvbXBhY3RQcm90b2NvbDo6U1RBVEVfVkFMVUVfUkVBRDsKLSAgICB9Ci0gICAgcmV0dXJuICRyZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZEZpZWxkRW5kKCkgewotICAgICR0aGlzLT5zdGF0ZSA9IFRDb21wYWN0UHJvdG9jb2w6OlNUQVRFX0ZJRUxEX1JFQUQ7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZFVCeXRlKCYkdmFsdWUpIHsKLSAgICAkZGF0YSA9ICR0aGlzLT50cmFuc18tPnJlYWRBbGwoMSk7Ci0gICAgJGFyciA9IHVucGFjaygnQycsICRkYXRhKTsKLSAgICAkdmFsdWUgPSAkYXJyWzFdOwotICAgIHJldHVybiAxOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRCeXRlKCYkdmFsdWUpIHsKLSAgICAkZGF0YSA9ICR0aGlzLT50cmFuc18tPnJlYWRBbGwoMSk7Ci0gICAgJGFyciA9IHVucGFjaygnYycsICRkYXRhKTsKLSAgICAkdmFsdWUgPSAkYXJyWzFdOwotICAgIHJldHVybiAxOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRaaWdaYWcoJiR2YWx1ZSkgewotICAgICRyZXN1bHQgPSAkdGhpcy0+cmVhZFZhcmludCgkdmFsdWUpOwotICAgICR2YWx1ZSA9ICR0aGlzLT5mcm9tWmlnWmFnKCR2YWx1ZSk7Ci0gICAgcmV0dXJuICRyZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1lc3NhZ2VCZWdpbigmJG5hbWUsICYkdHlwZSwgJiRzZXFpZCkgewotICAgICRwcm90b0lkID0gMDsKLSAgICAkcmVzdWx0ID0gJHRoaXMtPnJlYWRVQnl0ZSgkcHJvdG9JZCk7Ci0gICAgaWYgKCRwcm90b0lkICE9IFRDb21wYWN0UHJvdG9jb2w6OlBST1RPQ09MX0lEKSB7Ci0gICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCdCYWQgcHJvdG9jb2wgaWQgaW4gVENvbXBhY3QgbWVzc2FnZScpOwotICAgIH0KLSAgICAkdmVyVHlwZSA9IDA7Ci0gICAgJHJlc3VsdCArPSAkdGhpcy0+cmVhZFVCeXRlKCR2ZXJUeXBlKTsKLSAgICAkdHlwZSA9ICgkdmVyVHlwZSA+PiBUQ29tcGFjdFByb3RvY29sOjpUWVBFX1NISUZUX0FNT1VOVCkgJiBUQ29tcGFjdFByb3RvY29sOjpUWVBFX0JJVFM7Ci0gICAgJHZlcnNpb24gPSAkdmVyVHlwZSAmIFRDb21wYWN0UHJvdG9jb2w6OlZFUlNJT05fTUFTSzsKLSAgICBpZiAoJHZlcnNpb24gIT0gVENvbXBhY3RQcm90b2NvbDo6VkVSU0lPTikgewotICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbignQmFkIHZlcnNpb24gaW4gVENvbXBhY3QgbWVzc2FnZScpOwotICAgIH0KLSAgICAkcmVzdWx0ICs9ICR0aGlzLT5yZWFkVmFyaW50KCRzZXFpZCk7Ci0gICAgJHJlc3VsdCArPSAkdGhpcy0+cmVhZFN0cmluZygkbmFtZSk7Ci0KLSAgICByZXR1cm4gJHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkTWVzc2FnZUVuZCgpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RydWN0QmVnaW4oJiRuYW1lKSB7Ci0gICAgJG5hbWUgPSAnJzsgLy8gdW51c2VkCi0gICAgJHRoaXMtPnN0cnVjdHNbXSA9IGFycmF5KCR0aGlzLT5zdGF0ZSwgJHRoaXMtPmxhc3RGaWQpOwotICAgICR0aGlzLT5zdGF0ZSA9IFRDb21wYWN0UHJvdG9jb2w6OlNUQVRFX0ZJRUxEX1JFQUQ7Ci0gICAgJHRoaXMtPmxhc3RGaWQgPSAwOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJ1Y3RFbmQoKSB7Ci0gICAgJGxhc3QgPSBhcnJheV9wb3AoJHRoaXMtPnN0cnVjdHMpOwotICAgICR0aGlzLT5zdGF0ZSA9ICRsYXN0WzBdOwotICAgICR0aGlzLT5sYXN0RmlkID0gJGxhc3RbMV07Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZENvbGxlY3Rpb25CZWdpbigmJHR5cGUsICYkc2l6ZSkgewotICAgICRzaXplVHlwZSA9IDA7Ci0gICAgJHJlc3VsdCA9ICR0aGlzLT5yZWFkVUJ5dGUoJHNpemVUeXBlKTsKLSAgICAkc2l6ZSA9ICRzaXplVHlwZSA+PiA0OwotICAgICR0eXBlID0gJHRoaXMtPmdldFRUeXBlKCRzaXplVHlwZSk7Ci0gICAgaWYgKCRzaXplID09IDE1KSB7Ci0gICAgICAkcmVzdWx0ICs9ICR0aGlzLT5yZWFkVmFyaW50KCRzaXplKTsKLSAgICB9Ci0gICAgJHRoaXMtPmNvbnRhaW5lcnNbXSA9ICR0aGlzLT5zdGF0ZTsKLSAgICAkdGhpcy0+c3RhdGUgPSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9DT05UQUlORVJfUkVBRDsKLQotICAgIHJldHVybiAkcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRNYXBCZWdpbigmJGtleV90eXBlLCAmJHZhbF90eXBlLCAmJHNpemUpIHsKLSAgICAkcmVzdWx0ID0gJHRoaXMtPnJlYWRWYXJpbnQoJHNpemUpOwotICAgICR0eXBlcyA9IDA7Ci0gICAgaWYgKCRzaXplID4gMCkgewotICAgICAgJHJlc3VsdCArPSAkdGhpcy0+cmVhZFVCeXRlKCR0eXBlcyk7Ci0gICAgfQotICAgICR2YWxfdHlwZSA9ICR0aGlzLT5nZXRUVHlwZSgkdHlwZXMpOwotICAgICRrZXlfdHlwZSA9ICR0aGlzLT5nZXRUVHlwZSgkdHlwZXMgPj4gNCk7Ci0gICAgJHRoaXMtPmNvbnRhaW5lcnNbXSA9ICR0aGlzLT5zdGF0ZTsKLSAgICAkdGhpcy0+c3RhdGUgPSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9DT05UQUlORVJfUkVBRDsKLQotICAgIHJldHVybiAkcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRDb2xsZWN0aW9uRW5kKCkgewotICAgICR0aGlzLT5zdGF0ZSA9IGFycmF5X3BvcCgkdGhpcy0+Y29udGFpbmVycyk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1hcEVuZCgpIHsKLSAgICByZXR1cm4gJHRoaXMtPnJlYWRDb2xsZWN0aW9uRW5kKCk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZExpc3RCZWdpbigmJGVsZW1fdHlwZSwgJiRzaXplKSB7Ci0gICAgcmV0dXJuICR0aGlzLT5yZWFkQ29sbGVjdGlvbkJlZ2luKCRlbGVtX3R5cGUsICRzaXplKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkTGlzdEVuZCgpIHsKLSAgICByZXR1cm4gJHRoaXMtPnJlYWRDb2xsZWN0aW9uRW5kKCk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZFNldEJlZ2luKCYkZWxlbV90eXBlLCAmJHNpemUpIHsKLSAgICByZXR1cm4gJHRoaXMtPnJlYWRDb2xsZWN0aW9uQmVnaW4oJGVsZW1fdHlwZSwgJHNpemUpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRTZXRFbmQoKSB7Ci0gICAgcmV0dXJuICR0aGlzLT5yZWFkQ29sbGVjdGlvbkVuZCgpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRCb29sKCYkdmFsdWUpIHsKLSAgICBpZiAoJHRoaXMtPnN0YXRlID09IFRDb21wYWN0UHJvdG9jb2w6OlNUQVRFX0JPT0xfUkVBRCkgewotICAgICAgJHZhbHVlID0gJHRoaXMtPmJvb2xWYWx1ZTsKLSAgICAgIHJldHVybiAwOwotICAgIH0gZWxzZSBpZiAoJHRoaXMtPnN0YXRlID09IFRDb21wYWN0UHJvdG9jb2w6OlNUQVRFX0NPTlRBSU5FUl9SRUFEKSB7Ci0gICAgICByZXR1cm4gJHRoaXMtPnJlYWRCeXRlKCR2YWx1ZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oJ0ludmFsaWQgc3RhdGUgaW4gY29tcGFjdCBwcm90b2NvbCcpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkSTE2KCYkdmFsdWUpIHsKLSAgICByZXR1cm4gJHRoaXMtPnJlYWRaaWdaYWcoJHZhbHVlKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkSTMyKCYkdmFsdWUpIHsKLSAgICByZXR1cm4gJHRoaXMtPnJlYWRaaWdaYWcoJHZhbHVlKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkRG91YmxlKCYkdmFsdWUpIHsKLSAgICAkZGF0YSA9ICR0aGlzLT50cmFuc18tPnJlYWRBbGwoOCk7Ci0gICAgJGFyciA9IHVucGFjaygnZCcsICRkYXRhKTsKLSAgICAkdmFsdWUgPSAkYXJyWzFdOwotICAgIHJldHVybiA4OwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJpbmcoJiR2YWx1ZSkgewotICAgICRyZXN1bHQgPSAkdGhpcy0+cmVhZFZhcmludCgkbGVuKTsKLSAgICBpZiAoJGxlbikgewotICAgICAgJHZhbHVlID0gJHRoaXMtPnRyYW5zXy0+cmVhZEFsbCgkbGVuKTsKLSAgICB9IGVsc2UgewotICAgICAgJHZhbHVlID0gJyc7Ci0gICAgfQotICAgIHJldHVybiAkcmVzdWx0ICsgJGxlbjsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiBnZXRUVHlwZSgkYnl0ZSkgewotICAgIHJldHVybiBzZWxmOjokdHR5cGVzWyRieXRlICYgMHgwZl07Ci0gIH0KLQotICAvLyBJZiB3ZSBhcmUgb24gYSAzMmJpdCBhcmNoaXRlY3R1cmUgd2UgaGF2ZSB0byBleHBsaWNpdGx5IGRlYWwgd2l0aAotICAvLyA2NC1iaXQgdHdvcy1jb21wbGVtZW50IGFyaXRobWV0aWMgc2luY2UgUEhQIHdhbnRzIHRvIHRyZWF0IGFsbCBpbnRzCi0gIC8vIGFzIHNpZ25lZCBhbmQgYW55IGludCBvdmVyIDJeMzEgLSAxIGFzIGEgZmxvYXQKLQotICAvLyBSZWFkIGFuZCB3cml0ZSBJNjQgYXMgdHdvIDMyIGJpdCBudW1iZXJzICRoaSBhbmQgJGxvCi0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRJNjQoJiR2YWx1ZSkgewotICAgIC8vIFJlYWQgdmFyaW50IGZyb20gd2lyZQotICAgICRoaSA9IDA7Ci0gICAgJGxvID0gMDsKLQotICAgICRpZHggPSAwOwotICAgICRzaGlmdCA9IDA7Ci0KLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgJHggPSAkdGhpcy0+dHJhbnNfLT5yZWFkQWxsKDEpOwotICAgICAgJGFyciA9IHVucGFjaygnQycsICR4KTsKLSAgICAgICRieXRlID0gJGFyclsxXTsKLSAgICAgICRpZHggKz0gMTsKLSAgICAgIGlmICgkc2hpZnQgPCAzMikgewotICAgICAgICAkbG8gfD0gKCgkYnl0ZSAmIDB4N2YpIDw8ICRzaGlmdCkgJgotICAgICAgICAgIDB4MDAwMDAwMDBmZmZmZmZmZjsKLSAgICAgIH0KLSAgICAgIC8vIFNoaWZ0IGhpIGFuZCBsbyB0b2dldGhlci4KLSAgICAgIGlmICgkc2hpZnQgPj0gMzIpIHsKLSAgICAgICAgJGhpIHw9ICgoJGJ5dGUgJiAweDdmKSA8PCAoJHNoaWZ0IC0gMzIpKTsKLSAgICAgIH0gZWxzZSBpZiAoJHNoaWZ0ID4gMjUpIHsKLSAgICAgICAgJGhpIHw9ICgoJGJ5dGUgJiAweDdmKSA+PiAoJHNoaWZ0IC0gMjUpKTsKLSAgICAgIH0KLSAgICAgIGlmICgoJGJ5dGUgPj4gNykgPT09IDApIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAkc2hpZnQgKz0gNzsKLSAgICB9Ci0KLSAgICAvLyBOb3csIHVuemlnIGl0LgotICAgICR4b3JlciA9IDA7Ci0gICAgaWYgKCRsbyAmIDEpIHsKLSAgICAgICR4b3JlciA9IDB4ZmZmZmZmZmY7Ci0gICAgfQotICAgICRsbyA9ICgkbG8gPj4gMSkgJiAweDdmZmZmZmZmOwotICAgICRsbyA9ICRsbyB8ICgoJGhpICYgMSkgPDwgMzEpOwotICAgICRoaSA9ICgkaGkgPj4gMSkgXiAkeG9yZXI7Ci0gICAgJGxvID0gJGxvIF4gJHhvcmVyOwotCi0gICAgLy8gTm93IHB1dCAkaGkgYW5kICRsbyBiYWNrIHRvZ2V0aGVyCi0gICAgaWYgKHRydWUpIHsKLSAgICAgICRpc05lZyA9ICRoaSAgPCAwOwotCi0gICAgICAvLyBDaGVjayBmb3IgYSBuZWdhdGl2ZQotICAgICAgaWYgKCRpc05lZykgewotICAgICAgICAkaGkgPSB+JGhpICYgKGludCkweGZmZmZmZmZmOwotICAgICAgICAkbG8gPSB+JGxvICYgKGludCkweGZmZmZmZmZmOwotCi0gICAgICAgIGlmICgkbG8gPT0gKGludCkweGZmZmZmZmZmKSB7Ci0gICAgICAgICAgJGhpKys7Ci0gICAgICAgICAgJGxvID0gMDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAkbG8rKzsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvLyBGb3JjZSAzMmJpdCB3b3JkcyBpbiBleGNlc3Mgb2YgMkcgdG8gYmUgcG9zaXRpdmUgLSB3ZSBkZWFsIHdpdGggc2lnbgotICAgICAgLy8gZXhwbGljaXRseSBiZWxvdwotCi0gICAgICBpZiAoJGhpICYgKGludCkweDgwMDAwMDAwKSB7Ci0gICAgICAgICRoaSAmPSAoaW50KTB4N2ZmZmZmZmY7Ci0gICAgICAgICRoaSArPSAweDgwMDAwMDAwOwotICAgICAgfQotCi0gICAgICBpZiAoJGxvICYgKGludCkweDgwMDAwMDAwKSB7Ci0gICAgICAgICRsbyAmPSAoaW50KTB4N2ZmZmZmZmY7Ci0gICAgICAgICRsbyArPSAweDgwMDAwMDAwOwotICAgICAgfQotCi0gICAgICAkdmFsdWUgPSAkaGkgKiA0Mjk0OTY3Mjk2ICsgJGxvOwotCi0gICAgICBpZiAoJGlzTmVnKSB7Ci0gICAgICAgICR2YWx1ZSA9IDAgLSAkdmFsdWU7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLQotICAgICAgLy8gVXBjYXN0IG5lZ2F0aXZlcyBpbiBMU0IgYml0Ci0gICAgICBpZiAoJGFyclsyXSAmIDB4ODAwMDAwMDApIHsKLSAgICAgICAgJGFyclsyXSA9ICRhcnJbMl0gJiAweGZmZmZmZmZmOwotICAgICAgfQotCi0gICAgICAvLyBDaGVjayBmb3IgYSBuZWdhdGl2ZQotICAgICAgaWYgKCRhcnJbMV0gJiAweDgwMDAwMDAwKSB7Ci0gICAgICAgICRhcnJbMV0gPSAkYXJyWzFdICYgMHhmZmZmZmZmZjsKLSAgICAgICAgJGFyclsxXSA9ICRhcnJbMV0gXiAweGZmZmZmZmZmOwotICAgICAgICAkYXJyWzJdID0gJGFyclsyXSBeIDB4ZmZmZmZmZmY7Ci0gICAgICAgICR2YWx1ZSA9IDAgLSAkYXJyWzFdICogNDI5NDk2NzI5NiAtICRhcnJbMl0gLSAxOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgJHZhbHVlID0gJGFyclsxXSAqIDQyOTQ5NjcyOTYgKyAkYXJyWzJdOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiAkaWR4OwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTY0KCR2YWx1ZSkgewotICAgIC8vIElmIHdlIGFyZSBpbiBhbiBJMzIgcmFuZ2UsIHVzZSB0aGUgZWFzeSBtZXRob2QgYmVsb3cuCi0gICAgaWYgKCgkdmFsdWUgPiA0Mjk0OTY3Mjk2KSB8fCAoJHZhbHVlIDwgLTQyOTQ5NjcyOTYpKSB7Ci0gICAgICAvLyBDb252ZXJ0ICR2YWx1ZSB0byAkaGkgYW5kICRsbwotICAgICAgJG5lZyA9ICR2YWx1ZSA8IDA7Ci0KLSAgICAgIGlmICgkbmVnKSB7Ci0gICAgICAgICR2YWx1ZSAqPSAtMTsKLSAgICAgIH0KLQotICAgICAgJGhpID0gKGludCkkdmFsdWUgPj4gMzI7Ci0gICAgICAkbG8gPSAoaW50KSR2YWx1ZSAmIDB4ZmZmZmZmZmY7Ci0KLSAgICAgIGlmICgkbmVnKSB7Ci0gICAgICAgICRoaSA9IH4kaGk7Ci0gICAgICAgICRsbyA9IH4kbG87Ci0gICAgICAgIGlmICgoJGxvICYgKGludCkweGZmZmZmZmZmKSA9PSAoaW50KTB4ZmZmZmZmZmYpIHsKLSAgICAgICAgICAkbG8gPSAwOwotICAgICAgICAgICRoaSsrOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICRsbysrOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8vIE5vdyBkbyB0aGUgemlnZ2luZyBhbmQgemFnZ2luZy4KLSAgICAgICR4b3JlciA9IDA7Ci0gICAgICBpZiAoJG5lZykgewotICAgICAgICAkeG9yZXIgPSAweGZmZmZmZmZmOwotICAgICAgfQotICAgICAgJGxvd2JpdCA9ICgkbG8gPj4gMzEpICYgMTsKLSAgICAgICRoaSA9ICgkaGkgPDwgMSkgfCAkbG93Yml0OwotICAgICAgJGxvID0gKCRsbyA8PCAxKTsKLSAgICAgICRsbyA9ICgkbG8gXiAkeG9yZXIpICYgMHhmZmZmZmZmZjsKLSAgICAgICRoaSA9ICgkaGkgXiAkeG9yZXIpICYgMHhmZmZmZmZmZjsKLQotICAgICAgLy8gbm93IHdyaXRlIG91dCB0aGUgdmFyaW50LCBlbnN1cmluZyB3ZSBzaGlmdCBib3RoIGhpIGFuZCBsbwotICAgICAgJG91dCA9ICIiOwotICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgaWYgKCgkbG8gJiB+MHg3ZikgPT09IDAgJiYKLSAgICAgICAgICAgJGhpID09PSAwKSB7Ci0gICAgICAgICAgJG91dCAuPSBjaHIoJGxvKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAkb3V0IC49IGNocigoJGxvICYgMHhmZikgfCAweDgwKTsKLSAgICAgICAgICAkbG8gPSAkbG8gPj4gNzsKLSAgICAgICAgICAkbG8gPSAkbG8gfCAoJGhpIDw8IDI1KTsKLSAgICAgICAgICAkaGkgPSAkaGkgPj4gNzsKLSAgICAgICAgICAvLyBSaWdodCBzaGlmdCBjYXJyaWVzIHNpZ24sIGJ1dCB3ZSBkb24ndCB3YW50IGl0IHRvLgotICAgICAgICAgICRoaSA9ICRoaSAmICgxMjcgPDwgMjUpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgICRyZXQgPSBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJG91dCk7Ci0gICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZSgkb3V0LCAkcmV0KTsKLQotICAgICAgcmV0dXJuICRyZXQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiAkdGhpcy0+d3JpdGVWYXJpbnQoJHRoaXMtPnRvWmlnWmFnKCR2YWx1ZSwgNjQpKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RocmlmdC9Qcm90b2NvbC9USlNPTlByb3RvY29sLnBocCBiL2xpYi9waHAvbGliL1RocmlmdC9Qcm90b2NvbC9USlNPTlByb3RvY29sLnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDAyNDAxYS4uMDAwMDAwMAotLS0gYS9saWIvcGhwL2xpYi9UaHJpZnQvUHJvdG9jb2wvVEpTT05Qcm90b2NvbC5waHAKKysrIC9kZXYvbnVsbApAQCAtMSw2OTQgKzAsMCBAQAotPD9waHAKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKLSAqLwotCi1uYW1lc3BhY2UgVGhyaWZ0XFByb3RvY29sOwotCi11c2UgVGhyaWZ0XFByb3RvY29sXFRQcm90b2NvbDsKLXVzZSBUaHJpZnRcVHlwZVxUVHlwZTsKLXVzZSBUaHJpZnRcRXhjZXB0aW9uXFRQcm90b2NvbEV4Y2VwdGlvbjsKLXVzZSBUaHJpZnRcUHJvdG9jb2xcSlNPTlxCYXNlQ29udGV4dDsKLXVzZSBUaHJpZnRcUHJvdG9jb2xcSlNPTlxMb29rYWhlYWRSZWFkZXI7Ci11c2UgVGhyaWZ0XFByb3RvY29sXEpTT05cUGFpckNvbnRleHQ7Ci11c2UgVGhyaWZ0XFByb3RvY29sXEpTT05cTGlzdENvbnRleHQ7Ci0KLS8qKgotICogSlNPTiBpbXBsZW1lbnRhdGlvbiBvZiB0aHJpZnQgcHJvdG9jb2wsIHBvcnRlZCBmcm9tIEphdmEuCi0gKi8KLWNsYXNzIFRKU09OUHJvdG9jb2wgZXh0ZW5kcyBUUHJvdG9jb2wKLXsKLSAgICBjb25zdCBDT01NQSA9ICcsJzsKLSAgICBjb25zdCBDT0xPTiA9ICc6JzsKLSAgICBjb25zdCBMQlJBQ0UgPSAneyc7Ci0gICAgY29uc3QgUkJSQUNFID0gJ30nOwotICAgIGNvbnN0IExCUkFDS0VUID0gJ1snOwotICAgIGNvbnN0IFJCUkFDS0VUID0gJ10nOwotICAgIGNvbnN0IFFVT1RFID0gJyInOwotICAgIGNvbnN0IEJBQ0tTTEFTSCA9ICdcXCc7Ci0gICAgY29uc3QgWkVSTyA9ICcwJzsKLSAgICBjb25zdCBFU0NTRVEgPSAnXFwnOwotICAgIGNvbnN0IERPVUJMRUVTQyA9ICdfX0RPVUJMRV9FU0NBUEVfU0VRVUVOQ0VfXyc7Ci0KLSAgICBjb25zdCBWRVJTSU9OID0gMTsKLQotICAgIHB1YmxpYyBzdGF0aWMgJEpTT05fQ0hBUl9UQUJMRSA9IGFycmF5KAotICAgICAgICAvKiAgMCAgIDEgICAyICAgMyAgIDQgICA1ICAgNiAgIDcgICA4ICAgOSAgIEEgICBCICAgQyAgIEQgICBFICAgRiAqLwotICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAnYicsICd0JywgJ24nLCAwLCAnZicsICdyJywgMCwgMCwgLy8gMAotICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAvLyAxCi0gICAgICAgIDEsIDEsICciJywgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgLy8gMgotICAgICk7Ci0KLSAgICBwdWJsaWMgc3RhdGljICRFU0NBUEVfQ0hBUlMgPSBhcnJheSgnIicsICdcXCcsICcvJywgImIiLCAiZiIsICJuIiwgInIiLCAidCIpOwotCi0gICAgcHVibGljIHN0YXRpYyAkRVNDQVBFX0NIQVJfVkFMUyA9IGFycmF5KAotICAgICAgICAnIicsICdcXCcsICcvJywgIlx4MDgiLCAiXGYiLCAiXG4iLCAiXHIiLCAiXHQiLAotICAgICk7Ci0KLSAgICBjb25zdCBOQU1FX0JPT0wgPSAidGYiOwotICAgIGNvbnN0IE5BTUVfQllURSA9ICJpOCI7Ci0gICAgY29uc3QgTkFNRV9JMTYgPSAiaTE2IjsKLSAgICBjb25zdCBOQU1FX0kzMiA9ICJpMzIiOwotICAgIGNvbnN0IE5BTUVfSTY0ID0gImk2NCI7Ci0gICAgY29uc3QgTkFNRV9ET1VCTEUgPSAiZGJsIjsKLSAgICBjb25zdCBOQU1FX1NUUlVDVCA9ICJyZWMiOwotICAgIGNvbnN0IE5BTUVfU1RSSU5HID0gInN0ciI7Ci0gICAgY29uc3QgTkFNRV9NQVAgPSAibWFwIjsKLSAgICBjb25zdCBOQU1FX0xJU1QgPSAibHN0IjsKLSAgICBjb25zdCBOQU1FX1NFVCA9ICJzZXQiOwotCi0gICAgcHJpdmF0ZSBmdW5jdGlvbiBnZXRUeXBlTmFtZUZvclR5cGVJRCgkdHlwZUlEKQotICAgIHsKLSAgICAgICAgc3dpdGNoICgkdHlwZUlEKSB7Ci0gICAgICAgICAgICBjYXNlIFRUeXBlOjpCT09MOgotICAgICAgICAgICAgICAgIHJldHVybiBzZWxmOjpOQU1FX0JPT0w7Ci0gICAgICAgICAgICBjYXNlIFRUeXBlOjpCWVRFOgotICAgICAgICAgICAgICAgIHJldHVybiBzZWxmOjpOQU1FX0JZVEU7Ci0gICAgICAgICAgICBjYXNlIFRUeXBlOjpJMTY6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGY6Ok5BTUVfSTE2OwotICAgICAgICAgICAgY2FzZSBUVHlwZTo6STMyOgotICAgICAgICAgICAgICAgIHJldHVybiBzZWxmOjpOQU1FX0kzMjsKLSAgICAgICAgICAgIGNhc2UgVFR5cGU6Okk2NDoKLSAgICAgICAgICAgICAgICByZXR1cm4gc2VsZjo6TkFNRV9JNjQ7Ci0gICAgICAgICAgICBjYXNlIFRUeXBlOjpET1VCTEU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGY6Ok5BTUVfRE9VQkxFOwotICAgICAgICAgICAgY2FzZSBUVHlwZTo6U1RSSU5HOgotICAgICAgICAgICAgICAgIHJldHVybiBzZWxmOjpOQU1FX1NUUklORzsKLSAgICAgICAgICAgIGNhc2UgVFR5cGU6OlNUUlVDVDoKLSAgICAgICAgICAgICAgICByZXR1cm4gc2VsZjo6TkFNRV9TVFJVQ1Q7Ci0gICAgICAgICAgICBjYXNlIFRUeXBlOjpNQVA6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGY6Ok5BTUVfTUFQOwotICAgICAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgotICAgICAgICAgICAgICAgIHJldHVybiBzZWxmOjpOQU1FX1NFVDsKLSAgICAgICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKLSAgICAgICAgICAgICAgICByZXR1cm4gc2VsZjo6TkFNRV9MSVNUOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCJVbnJlY29nbml6ZWQgdHlwZSIsIFRQcm90b2NvbEV4Y2VwdGlvbjo6VU5LTk9XTik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGZ1bmN0aW9uIGdldFR5cGVJREZvclR5cGVOYW1lKCRuYW1lKQotICAgIHsKLSAgICAgICAgJHJlc3VsdCA9IFRUeXBlOjpTVE9QOwotCi0gICAgICAgIGlmIChzdHJsZW4oJG5hbWUpID4gMSkgewotICAgICAgICAgICAgc3dpdGNoIChzdWJzdHIoJG5hbWUsIDAsIDEpKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAnZCc6Ci0gICAgICAgICAgICAgICAgICAgICRyZXN1bHQgPSBUVHlwZTo6RE9VQkxFOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlICdpJzoKLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJzdHIoJG5hbWUsIDEsIDEpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICc4JzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcmVzdWx0ID0gVFR5cGU6OkJZVEU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcxJzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcmVzdWx0ID0gVFR5cGU6OkkxNjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzMnOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyZXN1bHQgPSBUVHlwZTo6STMyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnNic6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCA9IFRUeXBlOjpJNjQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAnbCc6Ci0gICAgICAgICAgICAgICAgICAgICRyZXN1bHQgPSBUVHlwZTo6TFNUOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlICdtJzoKLSAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCA9IFRUeXBlOjpNQVA7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgJ3InOgotICAgICAgICAgICAgICAgICAgICAkcmVzdWx0ID0gVFR5cGU6OlNUUlVDVDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAncyc6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdWJzdHIoJG5hbWUsIDEsIDEpID09ICd0JykgewotICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCA9IFRUeXBlOjpTVFJJTkc7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3Vic3RyKCRuYW1lLCAxLCAxKSA9PSAnZScpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICRyZXN1bHQgPSBUVHlwZTo6U0VUOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgJ3QnOgotICAgICAgICAgICAgICAgICAgICAkcmVzdWx0ID0gVFR5cGU6OkJPT0w7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICgkcmVzdWx0ID09IFRUeXBlOjpTVE9QKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCJVbnJlY29nbml6ZWQgdHlwZSIsIFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gJHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgJGNvbnRleHRTdGFja18gPSBhcnJheSgpOwotICAgIHB1YmxpYyAkY29udGV4dF87Ci0gICAgcHVibGljICRyZWFkZXJfOwotCi0gICAgcHJpdmF0ZSBmdW5jdGlvbiBwdXNoQ29udGV4dCgkYykgewotICAgICAgICBhcnJheV9wdXNoKCR0aGlzLT5jb250ZXh0U3RhY2tfLCAkdGhpcy0+Y29udGV4dF8pOwotICAgICAgICAkdGhpcy0+Y29udGV4dF8gPSAkYzsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZ1bmN0aW9uIHBvcENvbnRleHQoKSB7Ci0gICAgICAgICR0aGlzLT5jb250ZXh0XyA9IGFycmF5X3BvcCgkdGhpcy0+Y29udGV4dFN0YWNrXyk7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCR0cmFucykgewotICAgICAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCR0cmFucyk7Ci0gICAgICAgICR0aGlzLT5jb250ZXh0XyA9IG5ldyBCYXNlQ29udGV4dCgpOwotICAgICAgICAkdGhpcy0+cmVhZGVyXyA9IG5ldyBMb29rYWhlYWRSZWFkZXIoJHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiByZXNldCgpIHsKLSAgICAgICAgJHRoaXMtPmNvbnRleHRTdGFja18gPSBhcnJheSgpOwotICAgICAgICAkdGhpcy0+Y29udGV4dF8gPSBuZXcgQmFzZUNvbnRleHQoKTsKLSAgICAgICAgJHRoaXMtPnJlYWRlcl8gPSBuZXcgTG9va2FoZWFkUmVhZGVyKCR0aGlzKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlICR0bXBidWZfID0gYXJyYXkoNCk7Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEpTT05TeW50YXhDaGFyKCRiKSB7Ci0gICAgICAgICRjaCA9ICR0aGlzLT5yZWFkZXJfLT5yZWFkKCk7Ci0KLSAgICAgICAgaWYgKHN1YnN0cigkY2gsIDAsIDEpICE9ICRiKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCJVbmV4cGVjdGVkIGNoYXJhY3RlcjogIiAuICRjaCwgVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmdW5jdGlvbiBoZXhWYWwoJHMpIHsKLSAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgc3RybGVuKCRzKTsgJGkrKykgewotICAgICAgICAgICAgJGNoID0gc3Vic3RyKCRzLCAkaSwgMSk7Ci0KLSAgICAgICAgICAgIGlmICghKCRjaCA+PSAiYSIgJiYgJGNoIDw9ICJmIikgJiYgISgkY2ggPj0gIjAiICYmICRjaCA8PSAiOSIpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigiRXhwZWN0ZWQgaGV4IGNoYXJhY3RlciAiIC4gJGNoLCBUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gaGV4ZGVjKCRzKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZ1bmN0aW9uIGhleENoYXIoJHZhbCkgewotICAgICAgICByZXR1cm4gZGVjaGV4KCR2YWwpOwotICAgIH0KLQotICAgIHByaXZhdGUgZnVuY3Rpb24gd3JpdGVKU09OU3RyaW5nKCRiKSB7Ci0gICAgICAgICR0aGlzLT5jb250ZXh0Xy0+d3JpdGUoKTsKLQotICAgICAgICBpZiAoaXNfbnVtZXJpYygkYikgJiYgJHRoaXMtPmNvbnRleHRfLT5lc2NhcGVOdW0oKSkgewotICAgICAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6UVVPVEUpOwotICAgICAgICB9Ci0KLSAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoanNvbl9lbmNvZGUoJGIpKTsKLQotICAgICAgICBpZiAoaXNfbnVtZXJpYygkYikgJiYgJHRoaXMtPmNvbnRleHRfLT5lc2NhcGVOdW0oKSkgewotICAgICAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6UVVPVEUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmdW5jdGlvbiB3cml0ZUpTT05JbnRlZ2VyKCRudW0pIHsKLSAgICAgICAgJHRoaXMtPmNvbnRleHRfLT53cml0ZSgpOwotCi0gICAgICAgIGlmICgkdGhpcy0+Y29udGV4dF8tPmVzY2FwZU51bSgpKSB7Ci0gICAgICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpRVU9URSk7Ci0gICAgICAgIH0KLQotICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZSgkbnVtKTsKLQotICAgICAgICBpZiAoJHRoaXMtPmNvbnRleHRfLT5lc2NhcGVOdW0oKSkgewotICAgICAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6UVVPVEUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmdW5jdGlvbiB3cml0ZUpTT05Eb3VibGUoJG51bSkgewotICAgICAgICAkdGhpcy0+Y29udGV4dF8tPndyaXRlKCk7Ci0KLSAgICAgICAgaWYgKCR0aGlzLT5jb250ZXh0Xy0+ZXNjYXBlTnVtKCkpIHsKLSAgICAgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OlFVT1RFKTsKLSAgICAgICAgfQotCi0gICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKGpzb25fZW5jb2RlKCRudW0pKTsKLQotICAgICAgICBpZiAoJHRoaXMtPmNvbnRleHRfLT5lc2NhcGVOdW0oKSkgewotICAgICAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6UVVPVEUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmdW5jdGlvbiB3cml0ZUpTT05CYXNlNjQoJGRhdGEpIHsKLSAgICAgICAgJHRoaXMtPmNvbnRleHRfLT53cml0ZSgpOwotICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpRVU9URSk7Ci0gICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKGpzb25fZW5jb2RlKGJhc2U2NF9lbmNvZGUoJGRhdGEpKSk7Ci0gICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OlFVT1RFKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZ1bmN0aW9uIHdyaXRlSlNPTk9iamVjdFN0YXJ0KCkgewotICAgICAgJHRoaXMtPmNvbnRleHRfLT53cml0ZSgpOwotICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6TEJSQUNFKTsKLSAgICAgICR0aGlzLT5wdXNoQ29udGV4dChuZXcgUGFpckNvbnRleHQoJHRoaXMpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZ1bmN0aW9uIHdyaXRlSlNPTk9iamVjdEVuZCgpIHsKLSAgICAgICR0aGlzLT5wb3BDb250ZXh0KCk7Ci0gICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpSQlJBQ0UpOwotICAgIH0KLQotICAgIHByaXZhdGUgZnVuY3Rpb24gd3JpdGVKU09OQXJyYXlTdGFydCgpIHsKLSAgICAgICR0aGlzLT5jb250ZXh0Xy0+d3JpdGUoKTsKLSAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OkxCUkFDS0VUKTsKLSAgICAgICR0aGlzLT5wdXNoQ29udGV4dChuZXcgTGlzdENvbnRleHQoJHRoaXMpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZ1bmN0aW9uIHdyaXRlSlNPTkFycmF5RW5kKCkgewotICAgICAgJHRoaXMtPnBvcENvbnRleHQoKTsKLSAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OlJCUkFDS0VUKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZ1bmN0aW9uIHJlYWRKU09OU3RyaW5nKCRza2lwQ29udGV4dCkgewotICAgICAgaWYgKCEkc2tpcENvbnRleHQpIHsKLSAgICAgICAgJHRoaXMtPmNvbnRleHRfLT5yZWFkKCk7Ci0gICAgICB9Ci0KLSAgICAgICRqc29uU3RyaW5nID0gJyc7Ci0gICAgICAkbGFzdENoYXIgPSBOVUxMOwotICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgJGNoID0gJHRoaXMtPnJlYWRlcl8tPnJlYWQoKTsKLSAgICAgICAgJGpzb25TdHJpbmcgLj0gJGNoOwotICAgICAgICBpZiAoJGNoID09IHNlbGY6OlFVT1RFICYmCi0gICAgICAgICAgJGxhc3RDaGFyICE9PSBOVUxMICYmCi0gICAgICAgICAgICAkbGFzdENoYXIgIT09IHNlbGY6OkVTQ1NFUSkgewotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmICgkY2ggPT0gc2VsZjo6RVNDU0VRICYmICRsYXN0Q2hhciA9PSBzZWxmOjpFU0NTRVEpIHsKLSAgICAgICAgICAkbGFzdENoYXIgPSBzZWxmOjpET1VCTEVFU0M7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgJGxhc3RDaGFyID0gJGNoOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4ganNvbl9kZWNvZGUoJGpzb25TdHJpbmcpOwotICAgIH0KLQotICAgIHByaXZhdGUgZnVuY3Rpb24gaXNKU09OTnVtZXJpYygkYikgewotICAgICAgICBzd2l0Y2ggKCRiKSB7Ci0gICAgICAgICAgICBjYXNlICcrJzoKLSAgICAgICAgICAgIGNhc2UgJy0nOgotICAgICAgICAgICAgY2FzZSAnLic6Ci0gICAgICAgICAgICBjYXNlICcwJzoKLSAgICAgICAgICAgIGNhc2UgJzEnOgotICAgICAgICAgICAgY2FzZSAnMic6Ci0gICAgICAgICAgICBjYXNlICczJzoKLSAgICAgICAgICAgIGNhc2UgJzQnOgotICAgICAgICAgICAgY2FzZSAnNSc6Ci0gICAgICAgICAgICBjYXNlICc2JzoKLSAgICAgICAgICAgIGNhc2UgJzcnOgotICAgICAgICAgICAgY2FzZSAnOCc6Ci0gICAgICAgICAgICBjYXNlICc5JzoKLSAgICAgICAgICAgIGNhc2UgJ0UnOgotICAgICAgICAgICAgY2FzZSAnZSc6Ci0gICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmdW5jdGlvbiByZWFkSlNPTk51bWVyaWNDaGFycygpIHsKLSAgICAgICAgJHN0cmJsZCA9IGFycmF5KCk7Ci0KLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgICRjaCA9ICR0aGlzLT5yZWFkZXJfLT5wZWVrKCk7Ci0KLSAgICAgICAgICAgIGlmICghJHRoaXMtPmlzSlNPTk51bWVyaWMoJGNoKSkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAkc3RyYmxkW10gPSAkdGhpcy0+cmVhZGVyXy0+cmVhZCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGltcGxvZGUoIiIsICRzdHJibGQpOwotICAgIH0KLQotICAgIHByaXZhdGUgZnVuY3Rpb24gcmVhZEpTT05JbnRlZ2VyKCkgewotICAgICAgICAkdGhpcy0+Y29udGV4dF8tPnJlYWQoKTsKLQotICAgICAgICBpZiAoJHRoaXMtPmNvbnRleHRfLT5lc2NhcGVOdW0oKSkgewotICAgICAgICAgICAgJHRoaXMtPnJlYWRKU09OU3ludGF4Q2hhcihzZWxmOjpRVU9URSk7Ci0gICAgICAgIH0KLQotICAgICAgICAkc3RyID0gJHRoaXMtPnJlYWRKU09OTnVtZXJpY0NoYXJzKCk7Ci0KLSAgICAgICAgaWYgKCR0aGlzLT5jb250ZXh0Xy0+ZXNjYXBlTnVtKCkpIHsKLSAgICAgICAgICAgICR0aGlzLT5yZWFkSlNPTlN5bnRheENoYXIoc2VsZjo6UVVPVEUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFpc19udW1lcmljKCRzdHIpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCJJbnZhbGlkIGRhdGEgaW4gbnVtZXJpYzogIiAuICRzdHIsIFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBpbnR2YWwoJHN0cik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSWRlbnRpY2FsIHRvIHJlYWRKU09OSW50ZWdlciBidXQgd2l0aG91dCB0aGUgZmluYWwgY2FzdC4KLSAgICAgKiBOZWVkZWQgZm9yIHByb3BlciBoYW5kbGluZyBvZiBpNjQgb24gMzIgYml0IG1hY2hpbmVzLiAgV2h5IGEKLSAgICAgKiBzZXBhcmF0ZSBmdW5jdGlvbj8gIFNvIHdlIGRvbid0IGhhdmUgdG8gZm9yY2UgdGhlIHJlc3Qgb2YgdGhlCi0gICAgICogdXNlIGNhc2VzIHRocm91Z2ggdGhlIGV4dHJhIGNvbmRpdGlvbmFsLgotICAgICAqLwotICAgIHByaXZhdGUgZnVuY3Rpb24gcmVhZEpTT05JbnRlZ2VyQXNTdHJpbmcoKSB7Ci0gICAgICAgICR0aGlzLT5jb250ZXh0Xy0+cmVhZCgpOwotCi0gICAgICAgIGlmICgkdGhpcy0+Y29udGV4dF8tPmVzY2FwZU51bSgpKSB7Ci0gICAgICAgICAgICAkdGhpcy0+cmVhZEpTT05TeW50YXhDaGFyKHNlbGY6OlFVT1RFKTsKLSAgICAgICAgfQotCi0gICAgICAgICRzdHIgPSAkdGhpcy0+cmVhZEpTT05OdW1lcmljQ2hhcnMoKTsKLQotICAgICAgICBpZiAoJHRoaXMtPmNvbnRleHRfLT5lc2NhcGVOdW0oKSkgewotICAgICAgICAgICAgJHRoaXMtPnJlYWRKU09OU3ludGF4Q2hhcihzZWxmOjpRVU9URSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIWlzX251bWVyaWMoJHN0cikpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oIkludmFsaWQgZGF0YSBpbiBudW1lcmljOiAiIC4gJHN0ciwgVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuICRzdHI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmdW5jdGlvbiByZWFkSlNPTkRvdWJsZSgpIHsKLSAgICAgICAgJHRoaXMtPmNvbnRleHRfLT5yZWFkKCk7Ci0KLSAgICAgICAgaWYgKHN1YnN0cigkdGhpcy0+cmVhZGVyXy0+cGVlaygpLCAwLCAxKSA9PSBzZWxmOjpRVU9URSkgewotICAgICAgICAgICAgJGFyciA9ICR0aGlzLT5yZWFkSlNPTlN0cmluZyh0cnVlKTsKLQotICAgICAgICAgICAgaWYgKCRhcnIgPT0gIk5hTiIpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gTkFOOwotICAgICAgICAgICAgfSBlbHNlIGlmICgkYXJyID09ICJJbmZpbml0eSIpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gSU5GOwotICAgICAgICAgICAgfSBlbHNlIGlmICghJHRoaXMtPmNvbnRleHRfLT5lc2NhcGVOdW0oKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oIk51bWVyaWMgZGF0YSB1bmV4cGVjdGVkbHkgcXVvdGVkICIgLiAkYXJyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIGZsb2F0dmFsKCRhcnIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKCR0aGlzLT5jb250ZXh0Xy0+ZXNjYXBlTnVtKCkpIHsKLSAgICAgICAgICAgICAgICAkdGhpcy0+cmVhZEpTT05TeW50YXhDaGFyKHNlbGY6OlFVT1RFKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIGZsb2F0dmFsKCR0aGlzLT5yZWFkSlNPTk51bWVyaWNDaGFycygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgZnVuY3Rpb24gcmVhZEpTT05CYXNlNjQoKSB7Ci0gICAgICAgICRhcnIgPSAkdGhpcy0+cmVhZEpTT05TdHJpbmcoZmFsc2UpOwotICAgICAgICAkZGF0YSA9IGJhc2U2NF9kZWNvZGUoJGFyciwgdHJ1ZSk7Ci0KLSAgICAgICAgaWYgKCRkYXRhID09PSBmYWxzZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigiSW52YWxpZCBiYXNlNjQgZGF0YSAiIC4gJGFyciwgVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuICRkYXRhOwotICAgIH0KLQotICAgIHByaXZhdGUgZnVuY3Rpb24gcmVhZEpTT05PYmplY3RTdGFydCgpIHsKLSAgICAgICAgJHRoaXMtPmNvbnRleHRfLT5yZWFkKCk7Ci0gICAgICAgICR0aGlzLT5yZWFkSlNPTlN5bnRheENoYXIoc2VsZjo6TEJSQUNFKTsKLSAgICAgICAgJHRoaXMtPnB1c2hDb250ZXh0KG5ldyBQYWlyQ29udGV4dCgkdGhpcykpOwotICAgIH0KLQotICAgIHByaXZhdGUgZnVuY3Rpb24gcmVhZEpTT05PYmplY3RFbmQoKSB7Ci0gICAgICAgICR0aGlzLT5yZWFkSlNPTlN5bnRheENoYXIoc2VsZjo6UkJSQUNFKTsKLSAgICAgICAgJHRoaXMtPnBvcENvbnRleHQoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZ1bmN0aW9uIHJlYWRKU09OQXJyYXlTdGFydCgpCi0gICAgewotICAgICAgICAkdGhpcy0+Y29udGV4dF8tPnJlYWQoKTsKLSAgICAgICAgJHRoaXMtPnJlYWRKU09OU3ludGF4Q2hhcihzZWxmOjpMQlJBQ0tFVCk7Ci0gICAgICAgICR0aGlzLT5wdXNoQ29udGV4dChuZXcgTGlzdENvbnRleHQoJHRoaXMpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZ1bmN0aW9uIHJlYWRKU09OQXJyYXlFbmQoKSB7Ci0gICAgICAgICR0aGlzLT5yZWFkSlNPTlN5bnRheENoYXIoc2VsZjo6UkJSQUNLRVQpOwotICAgICAgICAkdGhpcy0+cG9wQ29udGV4dCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyaXRlcyB0aGUgbWVzc2FnZSBoZWFkZXIKLSAgICAgKgotICAgICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgRnVuY3Rpb24gbmFtZQotICAgICAqIEBwYXJhbSBpbnQgJHR5cGUgbWVzc2FnZSB0eXBlIFRNZXNzYWdlVHlwZTo6Q0FMTCBvciBUTWVzc2FnZVR5cGU6OlJFUExZCi0gICAgICogQHBhcmFtIGludCAkc2VxaWQgVGhlIHNlcXVlbmNlIGlkIG9mIHRoaXMgbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1lc3NhZ2VCZWdpbigkbmFtZSwgJHR5cGUsICRzZXFpZCkgewotICAgICAgICAkdGhpcy0+d3JpdGVKU09OQXJyYXlTdGFydCgpOwotICAgICAgICAkdGhpcy0+d3JpdGVKU09OSW50ZWdlcihzZWxmOjpWRVJTSU9OKTsKLSAgICAgICAgJHRoaXMtPndyaXRlSlNPTlN0cmluZygkbmFtZSk7Ci0gICAgICAgICR0aGlzLT53cml0ZUpTT05JbnRlZ2VyKCR0eXBlKTsKLSAgICAgICAgJHRoaXMtPndyaXRlSlNPTkludGVnZXIoJHNlcWlkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDbG9zZSB0aGUgbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1lc3NhZ2VFbmQoKSB7Ci0gICAgICAgICR0aGlzLT53cml0ZUpTT05BcnJheUVuZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyaXRlcyBhIHN0cnVjdCBoZWFkZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3RyaW5nICAgICAkbmFtZSBTdHJ1Y3QgbmFtZQotICAgICAqIEB0aHJvd3MgVEV4Y2VwdGlvbiBvbiB3cml0ZSBlcnJvcgotICAgICAqIEByZXR1cm4gaW50IEhvdyBtYW55IGJ5dGVzIHdyaXR0ZW4KLSAgICAgKi8KLSAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJ1Y3RCZWdpbigkbmFtZSkgewotICAgICAgICAkdGhpcy0+d3JpdGVKU09OT2JqZWN0U3RhcnQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDbG9zZSBhIHN0cnVjdC4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgVEV4Y2VwdGlvbiBvbiB3cml0ZSBlcnJvcgotICAgICAqIEByZXR1cm4gaW50IEhvdyBtYW55IGJ5dGVzIHdyaXR0ZW4KLSAgICAgKi8KLSAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJ1Y3RFbmQoKSB7Ci0gICAgICAgICR0aGlzLT53cml0ZUpTT05PYmplY3RFbmQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZEJlZ2luKCRmaWVsZE5hbWUsICRmaWVsZFR5cGUsICRmaWVsZElkKSB7Ci0gICAgICAgICR0aGlzLT53cml0ZUpTT05JbnRlZ2VyKCRmaWVsZElkKTsKLSAgICAgICAgJHRoaXMtPndyaXRlSlNPTk9iamVjdFN0YXJ0KCk7Ci0gICAgICAgICR0aGlzLT53cml0ZUpTT05TdHJpbmcoJHRoaXMtPmdldFR5cGVOYW1lRm9yVHlwZUlEKCRmaWVsZFR5cGUpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZEVuZCgpIHsKLSAgICAgICAgJHRoaXMtPndyaXRlSnNvbk9iamVjdEVuZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkU3RvcCgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNYXBCZWdpbigka2V5VHlwZSwgJHZhbFR5cGUsICRzaXplKSB7Ci0gICAgICAgICR0aGlzLT53cml0ZUpTT05BcnJheVN0YXJ0KCk7Ci0gICAgICAgICR0aGlzLT53cml0ZUpTT05TdHJpbmcoJHRoaXMtPmdldFR5cGVOYW1lRm9yVHlwZUlEKCRrZXlUeXBlKSk7Ci0gICAgICAgICR0aGlzLT53cml0ZUpTT05TdHJpbmcoJHRoaXMtPmdldFR5cGVOYW1lRm9yVHlwZUlEKCR2YWxUeXBlKSk7Ci0gICAgICAgICR0aGlzLT53cml0ZUpTT05JbnRlZ2VyKCRzaXplKTsKLSAgICAgICAgJHRoaXMtPndyaXRlSlNPTk9iamVjdFN0YXJ0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWFwRW5kKCkgewotICAgICAgICAkdGhpcy0+d3JpdGVKU09OT2JqZWN0RW5kKCk7Ci0gICAgICAgICR0aGlzLT53cml0ZUpTT05BcnJheUVuZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUxpc3RCZWdpbigkZWxlbVR5cGUsICRzaXplKSB7Ci0gICAgICAgICR0aGlzLT53cml0ZUpTT05BcnJheVN0YXJ0KCk7Ci0gICAgICAgICR0aGlzLT53cml0ZUpTT05TdHJpbmcoJHRoaXMtPmdldFR5cGVOYW1lRm9yVHlwZUlEKCRlbGVtVHlwZSkpOwotICAgICAgICAkdGhpcy0+d3JpdGVKU09OSW50ZWdlcigkc2l6ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTGlzdEVuZCgpIHsKLSAgICAgICAgJHRoaXMtPndyaXRlSlNPTkFycmF5RW5kKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU2V0QmVnaW4oJGVsZW1UeXBlLCAkc2l6ZSkgewotICAgICAgICAkdGhpcy0+d3JpdGVKU09OQXJyYXlTdGFydCgpOwotICAgICAgICAkdGhpcy0+d3JpdGVKU09OU3RyaW5nKCR0aGlzLT5nZXRUeXBlTmFtZUZvclR5cGVJRCgkZWxlbVR5cGUpKTsKLSAgICAgICAgJHRoaXMtPndyaXRlSlNPTkludGVnZXIoJHNpemUpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVNldEVuZCgpIHsKLSAgICAgICAgJHRoaXMtPndyaXRlSlNPTkFycmF5RW5kKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlQm9vbCgkYm9vbCkgewotICAgICAgICAkdGhpcy0+d3JpdGVKU09OSW50ZWdlcigkYm9vbCA/IDEgOiAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVCeXRlKCRieXRlKSB7Ci0gICAgICAgICR0aGlzLT53cml0ZUpTT05JbnRlZ2VyKCRieXRlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJMTYoJGkxNikgewotICAgICAgICAkdGhpcy0+d3JpdGVKU09OSW50ZWdlcigkaTE2KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJMzIoJGkzMikgewotICAgICAgICAkdGhpcy0+d3JpdGVKU09OSW50ZWdlcigkaTMyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJNjQoJGk2NCkgewotICAgICAgICAkdGhpcy0+d3JpdGVKU09OSW50ZWdlcigkaTY0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVEb3VibGUoJGR1YikgewotICAgICAgICAkdGhpcy0+d3JpdGVKU09ORG91YmxlKCRkdWIpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cmluZygkc3RyKSB7Ci0gICAgICAgICR0aGlzLT53cml0ZUpTT05TdHJpbmcoJHN0cik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVhZHMgdGhlIG1lc3NhZ2UgaGVhZGVyCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lIEZ1bmN0aW9uIG5hbWUKLSAgICAgKiBAcGFyYW0gaW50ICR0eXBlIG1lc3NhZ2UgdHlwZSBUTWVzc2FnZVR5cGU6OkNBTEwgb3IgVE1lc3NhZ2VUeXBlOjpSRVBMWQotICAgICAqIEBwYXJlbSBpbnQgJHNlcWlkIFRoZSBzZXF1ZW5jZSBpZCBvZiB0aGlzIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1lc3NhZ2VCZWdpbigmJG5hbWUsICYkdHlwZSwgJiRzZXFpZCkgewotICAgICAgICAkdGhpcy0+cmVhZEpTT05BcnJheVN0YXJ0KCk7Ci0KLSAgICAgICAgaWYgKCR0aGlzLT5yZWFkSlNPTkludGVnZXIoKSAhPSBzZWxmOjpWRVJTSU9OKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCJNZXNzYWdlIGNvbnRhaW5lZCBiYWQgdmVyc2lvbiIsIFRQcm90b2NvbEV4Y2VwdGlvbjo6QkFEX1ZFUlNJT04pOwotICAgICAgICB9Ci0KLSAgICAgICAgJG5hbWUgPSAkdGhpcy0+cmVhZEpTT05TdHJpbmcoZmFsc2UpOwotICAgICAgICAkdHlwZSA9ICR0aGlzLT5yZWFkSlNPTkludGVnZXIoKTsKLSAgICAgICAgJHNlcWlkID0gJHRoaXMtPnJlYWRKU09OSW50ZWdlcigpOwotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlYWQgdGhlIGNsb3NlIG9mIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1lc3NhZ2VFbmQoKSB7Ci0gICAgICAgICR0aGlzLT5yZWFkSlNPTkFycmF5RW5kKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJ1Y3RCZWdpbigmJG5hbWUpIHsKLSAgICAgICAgJHRoaXMtPnJlYWRKU09OT2JqZWN0U3RhcnQoKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJ1Y3RFbmQoKSB7Ci0gICAgICAgICR0aGlzLT5yZWFkSlNPTk9iamVjdEVuZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkRmllbGRCZWdpbigmJG5hbWUsICYkZmllbGRUeXBlLCAmJGZpZWxkSWQpIHsKLSAgICAgICAgJGNoID0gJHRoaXMtPnJlYWRlcl8tPnBlZWsoKTsKLSAgICAgICAgJG5hbWUgPSAiIjsKLQotICAgICAgICBpZiAoc3Vic3RyKCRjaCwgMCwgMSkgPT0gc2VsZjo6UkJSQUNFKSB7Ci0gICAgICAgICAgICAkZmllbGRUeXBlID0gVFR5cGU6OlNUT1A7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAkZmllbGRJZCA9ICR0aGlzLT5yZWFkSlNPTkludGVnZXIoKTsKLSAgICAgICAgICAgICR0aGlzLT5yZWFkSlNPTk9iamVjdFN0YXJ0KCk7Ci0gICAgICAgICAgICAkZmllbGRUeXBlID0gJHRoaXMtPmdldFR5cGVJREZvclR5cGVOYW1lKCR0aGlzLT5yZWFkSlNPTlN0cmluZyhmYWxzZSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlYWRGaWVsZEVuZCgpIHsKLSAgICAgICAgJHRoaXMtPnJlYWRKU09OT2JqZWN0RW5kKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNYXBCZWdpbigmJGtleVR5cGUsICYkdmFsVHlwZSwgJiRzaXplKSB7Ci0gICAgICAgICR0aGlzLT5yZWFkSlNPTkFycmF5U3RhcnQoKTsKLSAgICAgICAgJGtleVR5cGUgPSAkdGhpcy0+Z2V0VHlwZUlERm9yVHlwZU5hbWUoJHRoaXMtPnJlYWRKU09OU3RyaW5nKGZhbHNlKSk7Ci0gICAgICAgICR2YWxUeXBlID0gJHRoaXMtPmdldFR5cGVJREZvclR5cGVOYW1lKCR0aGlzLT5yZWFkSlNPTlN0cmluZyhmYWxzZSkpOwotICAgICAgICAkc2l6ZSA9ICR0aGlzLT5yZWFkSlNPTkludGVnZXIoKTsKLSAgICAgICAgJHRoaXMtPnJlYWRKU09OT2JqZWN0U3RhcnQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1hcEVuZCgpIHsKLSAgICAgICAgJHRoaXMtPnJlYWRKU09OT2JqZWN0RW5kKCk7Ci0gICAgICAgICR0aGlzLT5yZWFkSlNPTkFycmF5RW5kKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlYWRMaXN0QmVnaW4oJiRlbGVtVHlwZSwgJiRzaXplKSB7Ci0gICAgICAgICR0aGlzLT5yZWFkSlNPTkFycmF5U3RhcnQoKTsKLSAgICAgICAgJGVsZW1UeXBlID0gJHRoaXMtPmdldFR5cGVJREZvclR5cGVOYW1lKCR0aGlzLT5yZWFkSlNPTlN0cmluZyhmYWxzZSkpOwotICAgICAgICAkc2l6ZSA9ICR0aGlzLT5yZWFkSlNPTkludGVnZXIoKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlYWRMaXN0RW5kKCkgewotICAgICAgICAkdGhpcy0+cmVhZEpTT05BcnJheUVuZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU2V0QmVnaW4oJiRlbGVtVHlwZSwgJiRzaXplKSB7Ci0gICAgICAgICR0aGlzLT5yZWFkSlNPTkFycmF5U3RhcnQoKTsKLSAgICAgICAgJGVsZW1UeXBlID0gJHRoaXMtPmdldFR5cGVJREZvclR5cGVOYW1lKCR0aGlzLT5yZWFkSlNPTlN0cmluZyhmYWxzZSkpOwotICAgICAgICAkc2l6ZSA9ICR0aGlzLT5yZWFkSlNPTkludGVnZXIoKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTZXRFbmQoKSB7Ci0gICAgICAgICR0aGlzLT5yZWFkSlNPTkFycmF5RW5kKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlYWRCb29sKCYkYm9vbCkgewotICAgICAgICAkYm9vbCA9ICR0aGlzLT5yZWFkSlNPTkludGVnZXIoKSA9PSAwID8gZmFsc2UgOiB0cnVlOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEJ5dGUoJiRieXRlKSB7Ci0gICAgICAgICRieXRlID0gJHRoaXMtPnJlYWRKU09OSW50ZWdlcigpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEkxNigmJGkxNikgewotICAgICAgICAkaTE2ID0gJHRoaXMtPnJlYWRKU09OSW50ZWdlcigpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEkzMigmJGkzMikgewotICAgICAgICAkaTMyID0gJHRoaXMtPnJlYWRKU09OSW50ZWdlcigpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEk2NCgmJGk2NCkgewotICAgICAgICBpZiAoIFBIUF9JTlRfU0laRSA9PT0gNCApIHsKLSAgICAgICAgICAgICRpNjQgPSAkdGhpcy0+cmVhZEpTT05JbnRlZ2VyQXNTdHJpbmcoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICRpNjQgPSAkdGhpcy0+cmVhZEpTT05JbnRlZ2VyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlYWREb3VibGUoJiRkdWIpIHsKLSAgICAgICAgJGR1YiA9ICR0aGlzLT5yZWFkSlNPTkRvdWJsZSgpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cmluZygmJHN0cikgewotICAgICAgICAkc3RyID0gJHRoaXMtPnJlYWRKU09OU3RyaW5nKGZhbHNlKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVGhyaWZ0L1Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLnBocCBiL2xpYi9waHAvbGliL1RocmlmdC9Qcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwZjg2OWYuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9saWIvVGhyaWZ0L1Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLnBocAorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAotICovCi0KLW5hbWVzcGFjZSBUaHJpZnRcUHJvdG9jb2w7Ci0KLXVzZSBUaHJpZnRcVHlwZVxUTWVzc2FnZVR5cGU7Ci0KLS8qKgotICogPGNvZGU+VE11bHRpcGxleGVkUHJvdG9jb2w8L2NvZGU+IGlzIGEgcHJvdG9jb2wtaW5kZXBlbmRlbnQgY29uY3JldGUgZGVjb3JhdG9yCi0gKiB0aGF0IGFsbG93cyBhIFRocmlmdCBjbGllbnQgdG8gY29tbXVuaWNhdGUgd2l0aCBhIG11bHRpcGxleGluZyBUaHJpZnQgc2VydmVyLAotICogYnkgcHJlcGVuZGluZyB0aGUgc2VydmljZSBuYW1lIHRvIHRoZSBmdW5jdGlvbiBuYW1lIGR1cmluZyBmdW5jdGlvbiBjYWxscy4KLSAqCi0gKiBAcGFja2FnZSBUaHJpZnRcUHJvdG9jb2wKLSAqLwotY2xhc3MgVE11bHRpcGxleGVkUHJvdG9jb2wgZXh0ZW5kcyBUUHJvdG9jb2xEZWNvcmF0b3IKLXsKLSAgICAvKioKLSAgICAgKiBTZXBhcmF0b3IgYmV0d2VlbiBzZXJ2aWNlIG5hbWUgYW5kIGZ1bmN0aW9uIG5hbWUuCi0gICAgICogU2hvdWxkIGJlIHRoZSBzYW1lIGFzIHVzZWQgYXQgbXVsdGlwbGV4ZWQgVGhyaWZ0IHNlcnZlci4KLSAgICAgKgotICAgICAqIEB2YXIgc3RyaW5nCi0gICAgICovCi0gICAgY29uc3QgU0VQQVJBVE9SID0gIjoiOwotCi0gICAgLyoqCi0gICAgICogVGhlIG5hbWUgb2Ygc2VydmljZS4KLSAgICAgKgotICAgICAqIEB2YXIgc3RyaW5nCi0gICAgICovCi0gICAgcHJpdmF0ZSAkc2VydmljZU5hbWVfOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3Igb2YgPGNvZGU+VE11bHRpcGxleGVkUHJvdG9jb2w8L2NvZGU+IGNsYXNzLgotICAgICAqCi0gICAgICogV3JhcCB0aGUgc3BlY2lmaWVkIHByb3RvY29sLCBhbGxvd2luZyBpdCB0byBiZSB1c2VkIHRvIGNvbW11bmljYXRlIHdpdGggYQotICAgICAqIG11bHRpcGxleGluZyBzZXJ2ZXIuICBUaGUgPGNvZGU+JHNlcnZpY2VOYW1lPC9jb2RlPiBpcyByZXF1aXJlZCBhcyBpdCBpcwotICAgICAqIHByZXBlbmRlZCB0byB0aGUgbWVzc2FnZSBoZWFkZXIgc28gdGhhdCB0aGUgbXVsdGlwbGV4aW5nIHNlcnZlciBjYW4gYnJva2VyCi0gICAgICogdGhlIGZ1bmN0aW9uIGNhbGwgdG8gdGhlIHByb3BlciBzZXJ2aWNlLgotICAgICAqCi0gICAgICogQHBhcmFtIFRQcm90b2NvbCAkcHJvdG9jb2wKLSAgICAgKiBAcGFyYW0gc3RyaW5nICAgICRzZXJ2aWNlTmFtZSBUaGUgbmFtZSBvZiBzZXJ2aWNlLgotICAgICAqLwotICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChUUHJvdG9jb2wgJHByb3RvY29sLCAkc2VydmljZU5hbWUpCi0gICAgewotICAgICAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCRwcm90b2NvbCk7Ci0gICAgICAgICR0aGlzLT5zZXJ2aWNlTmFtZV8gPSAkc2VydmljZU5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JpdGVzIHRoZSBtZXNzYWdlIGhlYWRlci4KLSAgICAgKiBQcmVwZW5kcyB0aGUgc2VydmljZSBuYW1lIHRvIHRoZSBmdW5jdGlvbiBuYW1lLCBzZXBhcmF0ZWQgYnkgPGNvZGU+VE11bHRpcGxleGVkUHJvdG9jb2w6OlNFUEFSQVRPUjwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lICBGdW5jdGlvbiBuYW1lLgotICAgICAqIEBwYXJhbSBpbnQgICAgJHR5cGUgIE1lc3NhZ2UgdHlwZS4KLSAgICAgKiBAcGFyYW0gaW50ICAgICRzZXFpZCBUaGUgc2VxdWVuY2UgaWQgb2YgdGhpcyBtZXNzYWdlLgotICAgICAqLwotICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1lc3NhZ2VCZWdpbigkbmFtZSwgJHR5cGUsICRzZXFpZCkKLSAgICB7Ci0gICAgICAgIGlmICgkdHlwZSA9PSBUTWVzc2FnZVR5cGU6OkNBTEwgfHwgJHR5cGUgPT0gVE1lc3NhZ2VUeXBlOjpPTkVXQVkpIHsKLSAgICAgICAgICAgICRuYW1lV2l0aFNlcnZpY2UgPSAkdGhpcy0+c2VydmljZU5hbWVfIC4gc2VsZjo6U0VQQVJBVE9SIC4gJG5hbWU7Ci0gICAgICAgICAgICBwYXJlbnQ6OndyaXRlTWVzc2FnZUJlZ2luKCRuYW1lV2l0aFNlcnZpY2UsICR0eXBlLCAkc2VxaWQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcGFyZW50Ojp3cml0ZU1lc3NhZ2VCZWdpbigkbmFtZSwgJHR5cGUsICRzZXFpZCk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0gClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVGhyaWZ0L1Byb3RvY29sL1RQcm90b2NvbC5waHAgYi9saWIvcGhwL2xpYi9UaHJpZnQvUHJvdG9jb2wvVFByb3RvY29sLnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzgwZmYxMC4uMDAwMDAwMAotLS0gYS9saWIvcGhwL2xpYi9UaHJpZnQvUHJvdG9jb2wvVFByb3RvY29sLnBocAorKysgL2Rldi9udWxsCkBAIC0xLDM0MCArMCwwIEBACi08P3BocAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKLSAqLwotCi1uYW1lc3BhY2UgVGhyaWZ0XFByb3RvY29sOwotCi11c2UgVGhyaWZ0XFR5cGVcVFR5cGU7Ci11c2UgVGhyaWZ0XEV4Y2VwdGlvblxUUHJvdG9jb2xFeGNlcHRpb247Ci0KLS8qKgotICogUHJvdG9jb2wgYmFzZSBjbGFzcyBtb2R1bGUuCi0gKi8KLWFic3RyYWN0IGNsYXNzIFRQcm90b2NvbCB7Ci0KLSAgLyoqCi0gICAqIFVuZGVybHlpbmcgdHJhbnNwb3J0Ci0gICAqCi0gICAqIEB2YXIgVFRyYW5zcG9ydAotICAgKi8KLSAgcHJvdGVjdGVkICR0cmFuc187Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yCi0gICAqLwotICBwcm90ZWN0ZWQgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHRyYW5zKSB7Ci0gICAgJHRoaXMtPnRyYW5zXyA9ICR0cmFuczsKLSAgfQotCi0gIC8qKgotICAgKiBBY2Nlc3NvciBmb3IgdHJhbnNwb3J0Ci0gICAqCi0gICAqIEByZXR1cm4gVFRyYW5zcG9ydAotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIGdldFRyYW5zcG9ydCgpIHsKLSAgICByZXR1cm4gJHRoaXMtPnRyYW5zXzsKLSAgfQotCi0gIC8qKgotICAgKiBXcml0ZXMgdGhlIG1lc3NhZ2UgaGVhZGVyCi0gICAqCi0gICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgRnVuY3Rpb24gbmFtZQotICAgKiBAcGFyYW0gaW50ICR0eXBlIG1lc3NhZ2UgdHlwZSBUTWVzc2FnZVR5cGU6OkNBTEwgb3IgVE1lc3NhZ2VUeXBlOjpSRVBMWQotICAgKiBAcGFyYW0gaW50ICRzZXFpZCBUaGUgc2VxdWVuY2UgaWQgb2YgdGhpcyBtZXNzYWdlCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gd3JpdGVNZXNzYWdlQmVnaW4oJG5hbWUsICR0eXBlLCAkc2VxaWQpOwotCi0gIC8qKgotICAgKiBDbG9zZSB0aGUgbWVzc2FnZQotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHdyaXRlTWVzc2FnZUVuZCgpOwotCi0gIC8qKgotICAgKiBXcml0ZXMgYSBzdHJ1Y3QgaGVhZGVyLgotICAgKgotICAgKiBAcGFyYW0gc3RyaW5nICAgICAkbmFtZSBTdHJ1Y3QgbmFtZQotICAgKiBAdGhyb3dzIFRFeGNlcHRpb24gb24gd3JpdGUgZXJyb3IKLSAgICogQHJldHVybiBpbnQgSG93IG1hbnkgYnl0ZXMgd3JpdHRlbgotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHdyaXRlU3RydWN0QmVnaW4oJG5hbWUpOwotCi0gIC8qKgotICAgKiBDbG9zZSBhIHN0cnVjdC4KLSAgICoKLSAgICogQHRocm93cyBURXhjZXB0aW9uIG9uIHdyaXRlIGVycm9yCi0gICAqIEByZXR1cm4gaW50IEhvdyBtYW55IGJ5dGVzIHdyaXR0ZW4KLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiB3cml0ZVN0cnVjdEVuZCgpOwotCi0gIC8qCi0gICAqIFN0YXJ0cyBhIGZpZWxkLgotICAgKgotICAgKiBAcGFyYW0gc3RyaW5nICAgICAkbmFtZSBGaWVsZCBuYW1lCi0gICAqIEBwYXJhbSBpbnQgICAgICAgICR0eXBlIEZpZWxkIHR5cGUKLSAgICogQHBhcmFtIGludCAgICAgICAgJGZpZCAgRmllbGQgaWQKLSAgICogQHRocm93cyBURXhjZXB0aW9uIG9uIHdyaXRlIGVycm9yCi0gICAqIEByZXR1cm4gaW50IEhvdyBtYW55IGJ5dGVzIHdyaXR0ZW4KLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiB3cml0ZUZpZWxkQmVnaW4oJGZpZWxkTmFtZSwgJGZpZWxkVHlwZSwgJGZpZWxkSWQpOwotCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiB3cml0ZUZpZWxkRW5kKCk7Ci0KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHdyaXRlRmllbGRTdG9wKCk7Ci0KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHdyaXRlTWFwQmVnaW4oJGtleVR5cGUsICR2YWxUeXBlLCAkc2l6ZSk7Ci0KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHdyaXRlTWFwRW5kKCk7Ci0KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHdyaXRlTGlzdEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpOwotCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiB3cml0ZUxpc3RFbmQoKTsKLQotICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gd3JpdGVTZXRCZWdpbigkZWxlbVR5cGUsICRzaXplKTsKLQotICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gd3JpdGVTZXRFbmQoKTsKLQotICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gd3JpdGVCb29sKCRib29sKTsKLQotICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gd3JpdGVCeXRlKCRieXRlKTsKLQotICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gd3JpdGVJMTYoJGkxNik7Ci0KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHdyaXRlSTMyKCRpMzIpOwotCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiB3cml0ZUk2NCgkaTY0KTsKLQotICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gd3JpdGVEb3VibGUoJGR1Yik7Ci0KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHdyaXRlU3RyaW5nKCRzdHIpOwotCi0gIC8qKgotICAgKiBSZWFkcyB0aGUgbWVzc2FnZSBoZWFkZXIKLSAgICoKLSAgICogQHBhcmFtIHN0cmluZyAkbmFtZSBGdW5jdGlvbiBuYW1lCi0gICAqIEBwYXJhbSBpbnQgJHR5cGUgbWVzc2FnZSB0eXBlIFRNZXNzYWdlVHlwZTo6Q0FMTCBvciBUTWVzc2FnZVR5cGU6OlJFUExZCi0gICAqIEBwYXJlbSBpbnQgJHNlcWlkIFRoZSBzZXF1ZW5jZSBpZCBvZiB0aGlzIG1lc3NhZ2UKLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiByZWFkTWVzc2FnZUJlZ2luKCYkbmFtZSwgJiR0eXBlLCAmJHNlcWlkKTsKLQotICAvKioKLSAgICogUmVhZCB0aGUgY2xvc2Ugb2YgbWVzc2FnZQotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHJlYWRNZXNzYWdlRW5kKCk7Ci0KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHJlYWRTdHJ1Y3RCZWdpbigmJG5hbWUpOwotCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiByZWFkU3RydWN0RW5kKCk7Ci0KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHJlYWRGaWVsZEJlZ2luKCYkbmFtZSwgJiRmaWVsZFR5cGUsICYkZmllbGRJZCk7Ci0KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHJlYWRGaWVsZEVuZCgpOwotCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiByZWFkTWFwQmVnaW4oJiRrZXlUeXBlLCAmJHZhbFR5cGUsICYkc2l6ZSk7Ci0KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHJlYWRNYXBFbmQoKTsKLQotICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gcmVhZExpc3RCZWdpbigmJGVsZW1UeXBlLCAmJHNpemUpOwotCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiByZWFkTGlzdEVuZCgpOwotCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiByZWFkU2V0QmVnaW4oJiRlbGVtVHlwZSwgJiRzaXplKTsKLQotICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gcmVhZFNldEVuZCgpOwotCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiByZWFkQm9vbCgmJGJvb2wpOwotCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiByZWFkQnl0ZSgmJGJ5dGUpOwotCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiByZWFkSTE2KCYkaTE2KTsKLQotICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gcmVhZEkzMigmJGkzMik7Ci0KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHJlYWRJNjQoJiRpNjQpOwotCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiByZWFkRG91YmxlKCYkZHViKTsKLQotICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gcmVhZFN0cmluZygmJHN0cik7Ci0KLSAgLyoqCi0gICAqIFRoZSBza2lwIGZ1bmN0aW9uIGlzIGEgdXRpbGl0eSB0byBwYXJzZSBvdmVyIHVucmVjb2duaXplZCBkYXRlIHdpdGhvdXQKLSAgICogY2F1c2luZyBjb3JydXB0aW9uLgotICAgKgotICAgKiBAcGFyYW0gVFR5cGUgJHR5cGUgV2hhdCB0eXBlIGlzIGl0Ci0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gc2tpcCgkdHlwZSkgewotICAgIHN3aXRjaCAoJHR5cGUpIHsKLSAgICBjYXNlIFRUeXBlOjpCT09MOgotICAgICAgcmV0dXJuICR0aGlzLT5yZWFkQm9vbCgkYm9vbCk7Ci0gICAgY2FzZSBUVHlwZTo6QllURToKLSAgICAgIHJldHVybiAkdGhpcy0+cmVhZEJ5dGUoJGJ5dGUpOwotICAgIGNhc2UgVFR5cGU6OkkxNjoKLSAgICAgIHJldHVybiAkdGhpcy0+cmVhZEkxNigkaTE2KTsKLSAgICBjYXNlIFRUeXBlOjpJMzI6Ci0gICAgICByZXR1cm4gJHRoaXMtPnJlYWRJMzIoJGkzMik7Ci0gICAgY2FzZSBUVHlwZTo6STY0OgotICAgICAgcmV0dXJuICR0aGlzLT5yZWFkSTY0KCRpNjQpOwotICAgIGNhc2UgVFR5cGU6OkRPVUJMRToKLSAgICAgIHJldHVybiAkdGhpcy0+cmVhZERvdWJsZSgkZHViKTsKLSAgICBjYXNlIFRUeXBlOjpTVFJJTkc6Ci0gICAgICByZXR1cm4gJHRoaXMtPnJlYWRTdHJpbmcoJHN0cik7Ci0gICAgY2FzZSBUVHlwZTo6U1RSVUNUOgotICAgICAgewotICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPnJlYWRTdHJ1Y3RCZWdpbigkbmFtZSk7Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgJHJlc3VsdCArPSAkdGhpcy0+cmVhZEZpZWxkQmVnaW4oJG5hbWUsICRmdHlwZSwgJGZpZCk7Ci0gICAgICAgICAgaWYgKCRmdHlwZSA9PSBUVHlwZTo6U1RPUCkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgICRyZXN1bHQgKz0gJHRoaXMtPnNraXAoJGZ0eXBlKTsKLSAgICAgICAgICAkcmVzdWx0ICs9ICR0aGlzLT5yZWFkRmllbGRFbmQoKTsKLSAgICAgICAgfQotICAgICAgICAkcmVzdWx0ICs9ICR0aGlzLT5yZWFkU3RydWN0RW5kKCk7Ci0gICAgICAgIHJldHVybiAkcmVzdWx0OwotICAgICAgfQotICAgIGNhc2UgVFR5cGU6Ok1BUDoKLSAgICAgIHsKLSAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5yZWFkTWFwQmVnaW4oJGtleVR5cGUsICR2YWxUeXBlLCAkc2l6ZSk7Ci0gICAgICAgIGZvciAoJGkgPSAwOyAkaSA8ICRzaXplOyAkaSsrKSB7Ci0gICAgICAgICAgJHJlc3VsdCArPSAkdGhpcy0+c2tpcCgka2V5VHlwZSk7Ci0gICAgICAgICAgJHJlc3VsdCArPSAkdGhpcy0+c2tpcCgkdmFsVHlwZSk7Ci0gICAgICAgIH0KLSAgICAgICAgJHJlc3VsdCArPSAkdGhpcy0+cmVhZE1hcEVuZCgpOwotICAgICAgICByZXR1cm4gJHJlc3VsdDsKLSAgICAgIH0KLSAgICBjYXNlIFRUeXBlOjpTRVQ6Ci0gICAgICB7Ci0gICAgICAgICRyZXN1bHQgPSAkdGhpcy0+cmVhZFNldEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpOwotICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCAkc2l6ZTsgJGkrKykgewotICAgICAgICAgICRyZXN1bHQgKz0gJHRoaXMtPnNraXAoJGVsZW1UeXBlKTsKLSAgICAgICAgfQotICAgICAgICAkcmVzdWx0ICs9ICR0aGlzLT5yZWFkU2V0RW5kKCk7Ci0gICAgICAgIHJldHVybiAkcmVzdWx0OwotICAgICAgfQotICAgIGNhc2UgVFR5cGU6OkxTVDoKLSAgICAgIHsKLSAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5yZWFkTGlzdEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpOwotICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCAkc2l6ZTsgJGkrKykgewotICAgICAgICAgICRyZXN1bHQgKz0gJHRoaXMtPnNraXAoJGVsZW1UeXBlKTsKLSAgICAgICAgfQotICAgICAgICAkcmVzdWx0ICs9ICR0aGlzLT5yZWFkTGlzdEVuZCgpOwotICAgICAgICByZXR1cm4gJHJlc3VsdDsKLSAgICAgIH0KLSAgICBkZWZhdWx0OgotICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbignVW5rbm93biBmaWVsZCB0eXBlOiAnLiR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFV0aWxpdHkgZm9yIHNraXBwaW5nIGJpbmFyeSBkYXRhCi0gICAqCi0gICAqIEBwYXJhbSBUVHJhbnNwb3J0ICRpdHJhbnMgVFRyYW5zcG9ydCBvYmplY3QKLSAgICogQHBhcmFtIGludCAgICAgICAgJHR5cGUgICBGaWVsZCB0eXBlCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNraXBCaW5hcnkoJGl0cmFucywgJHR5cGUpIHsKLSAgICBzd2l0Y2ggKCR0eXBlKSB7Ci0gICAgY2FzZSBUVHlwZTo6Qk9PTDoKLSAgICAgIHJldHVybiAkaXRyYW5zLT5yZWFkQWxsKDEpOwotICAgIGNhc2UgVFR5cGU6OkJZVEU6Ci0gICAgICByZXR1cm4gJGl0cmFucy0+cmVhZEFsbCgxKTsKLSAgICBjYXNlIFRUeXBlOjpJMTY6Ci0gICAgICByZXR1cm4gJGl0cmFucy0+cmVhZEFsbCgyKTsKLSAgICBjYXNlIFRUeXBlOjpJMzI6Ci0gICAgICByZXR1cm4gJGl0cmFucy0+cmVhZEFsbCg0KTsKLSAgICBjYXNlIFRUeXBlOjpJNjQ6Ci0gICAgICByZXR1cm4gJGl0cmFucy0+cmVhZEFsbCg4KTsKLSAgICBjYXNlIFRUeXBlOjpET1VCTEU6Ci0gICAgICByZXR1cm4gJGl0cmFucy0+cmVhZEFsbCg4KTsKLSAgICBjYXNlIFRUeXBlOjpTVFJJTkc6Ci0gICAgICAkbGVuID0gdW5wYWNrKCdOJywgJGl0cmFucy0+cmVhZEFsbCg0KSk7Ci0gICAgICAkbGVuID0gJGxlblsxXTsKLSAgICAgIGlmICgkbGVuID4gMHg3ZmZmZmZmZikgewotICAgICAgICAkbGVuID0gMCAtICgoJGxlbiAtIDEpIF4gMHhmZmZmZmZmZik7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gNCArICRpdHJhbnMtPnJlYWRBbGwoJGxlbik7Ci0gICAgY2FzZSBUVHlwZTo6U1RSVUNUOgotICAgICAgewotICAgICAgICAkcmVzdWx0ID0gMDsKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAkZnR5cGUgPSAwOwotICAgICAgICAgICRmaWQgPSAwOwotICAgICAgICAgICRkYXRhID0gJGl0cmFucy0+cmVhZEFsbCgxKTsKLSAgICAgICAgICAkYXJyID0gdW5wYWNrKCdjJywgJGRhdGEpOwotICAgICAgICAgICRmdHlwZSA9ICRhcnJbMV07Ci0gICAgICAgICAgaWYgKCRmdHlwZSA9PSBUVHlwZTo6U1RPUCkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIC8vIEkxNiBmaWVsZCBpZAotICAgICAgICAgICRyZXN1bHQgKz0gJGl0cmFucy0+cmVhZEFsbCgyKTsKLSAgICAgICAgICAkcmVzdWx0ICs9IHNlbGY6OnNraXBCaW5hcnkoJGl0cmFucywgJGZ0eXBlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gJHJlc3VsdDsKLSAgICAgIH0KLSAgICBjYXNlIFRUeXBlOjpNQVA6Ci0gICAgICB7Ci0gICAgICAgIC8vIEt0eXBlCi0gICAgICAgICRkYXRhID0gJGl0cmFucy0+cmVhZEFsbCgxKTsKLSAgICAgICAgJGFyciA9IHVucGFjaygnYycsICRkYXRhKTsKLSAgICAgICAgJGt0eXBlID0gJGFyclsxXTsKLSAgICAgICAgLy8gVnR5cGUKLSAgICAgICAgJGRhdGEgPSAkaXRyYW5zLT5yZWFkQWxsKDEpOwotICAgICAgICAkYXJyID0gdW5wYWNrKCdjJywgJGRhdGEpOwotICAgICAgICAkdnR5cGUgPSAkYXJyWzFdOwotICAgICAgICAvLyBTaXplCi0gICAgICAgICRkYXRhID0gJGl0cmFucy0+cmVhZEFsbCg0KTsKLSAgICAgICAgJGFyciA9IHVucGFjaygnTicsICRkYXRhKTsKLSAgICAgICAgJHNpemUgPSAkYXJyWzFdOwotICAgICAgICBpZiAoJHNpemUgPiAweDdmZmZmZmZmKSB7Ci0gICAgICAgICAgJHNpemUgPSAwIC0gKCgkc2l6ZSAtIDEpIF4gMHhmZmZmZmZmZik7Ci0gICAgICAgIH0KLSAgICAgICAgJHJlc3VsdCA9IDY7Ci0gICAgICAgIGZvciAoJGkgPSAwOyAkaSA8ICRzaXplOyAkaSsrKSB7Ci0gICAgICAgICAgJHJlc3VsdCArPSBzZWxmOjpza2lwQmluYXJ5KCRpdHJhbnMsICRrdHlwZSk7Ci0gICAgICAgICAgJHJlc3VsdCArPSBzZWxmOjpza2lwQmluYXJ5KCRpdHJhbnMsICR2dHlwZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICRyZXN1bHQ7Ci0gICAgICB9Ci0gICAgY2FzZSBUVHlwZTo6U0VUOgotICAgIGNhc2UgVFR5cGU6OkxTVDoKLSAgICAgIHsKLSAgICAgICAgLy8gVnR5cGUKLSAgICAgICAgJGRhdGEgPSAkaXRyYW5zLT5yZWFkQWxsKDEpOwotICAgICAgICAkYXJyID0gdW5wYWNrKCdjJywgJGRhdGEpOwotICAgICAgICAkdnR5cGUgPSAkYXJyWzFdOwotICAgICAgICAvLyBTaXplCi0gICAgICAgICRkYXRhID0gJGl0cmFucy0+cmVhZEFsbCg0KTsKLSAgICAgICAgJGFyciA9IHVucGFjaygnTicsICRkYXRhKTsKLSAgICAgICAgJHNpemUgPSAkYXJyWzFdOwotICAgICAgICBpZiAoJHNpemUgPiAweDdmZmZmZmZmKSB7Ci0gICAgICAgICAgJHNpemUgPSAwIC0gKCgkc2l6ZSAtIDEpIF4gMHhmZmZmZmZmZik7Ci0gICAgICAgIH0KLSAgICAgICAgJHJlc3VsdCA9IDU7Ci0gICAgICAgIGZvciAoJGkgPSAwOyAkaSA8ICRzaXplOyAkaSsrKSB7Ci0gICAgICAgICAgJHJlc3VsdCArPSBzZWxmOjpza2lwQmluYXJ5KCRpdHJhbnMsICR2dHlwZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICRyZXN1bHQ7Ci0gICAgICB9Ci0gICAgZGVmYXVsdDoKLSAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oJ1Vua25vd24gZmllbGQgdHlwZTogJy4kdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVGhyaWZ0L1Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5waHAgYi9saWIvcGhwL2xpYi9UaHJpZnQvUHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYxNzQ2Yy4uMDAwMDAwMAotLS0gYS9saWIvcGhwL2xpYi9UaHJpZnQvUHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLnBocAorKysgL2Rldi9udWxsCkBAIC0xLDI4NCArMCwwIEBACi08P3BocAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKLSAqLwotCi1uYW1lc3BhY2UgVGhyaWZ0XFByb3RvY29sOwotdXNlIFRocmlmdFxFeGNlcHRpb25cVEV4Y2VwdGlvbjsKLQotLyoqCi0gKiA8Y29kZT5UUHJvdG9jb2xEZWNvcmF0b3I8L2NvZGU+IGZvcndhcmRzIGFsbCByZXF1ZXN0cyB0byBhbiBlbmNsb3NlZAotICogPGNvZGU+VFByb3RvY29sPC9jb2RlPiBpbnN0YW5jZSwgcHJvdmlkaW5nIGEgd2F5IHRvIGF1dGhvciBjb25jaXNlCi0gKiBjb25jcmV0ZSBkZWNvcmF0b3Igc3ViY2xhc3Nlcy4gV2hpbGUgaXQgaGFzIG5vIGFic3RyYWN0IG1ldGhvZHMsIGl0Ci0gKiBpcyBtYXJrZWQgYWJzdHJhY3QgYXMgYSByZW1pbmRlciB0aGF0IGJ5IGl0c2VsZiwgaXQgZG9lcyBub3QgbW9kaWZ5Ci0gKiB0aGUgYmVoYXZpb3VyIG9mIHRoZSBlbmNsb3NlZCA8Y29kZT5UUHJvdG9jb2w8L2NvZGU+LgotICoKLSAqIEBwYWNrYWdlIFRocmlmdFxQcm90b2NvbAotICovCi1hYnN0cmFjdCBjbGFzcyBUUHJvdG9jb2xEZWNvcmF0b3IgZXh0ZW5kcyBUUHJvdG9jb2wKLXsKLSAgICAvKioKLSAgICAgKiBJbnN0YW5jZSBvZiBwcm90b2NvbCwgdG8gd2hpY2ggYWxsIG9wZXJhdGlvbnMgd2lsbCBiZSBmb3J3YXJkZWQuCi0gICAgICoKLSAgICAgKiBAdmFyIFRQcm90b2NvbAotICAgICAqLwotICAgIHByaXZhdGUgJGNvbmNyZXRlUHJvdG9jb2xfOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3Igb2YgPGNvZGU+VFByb3RvY29sRGVjb3JhdG9yPC9jb2RlPiBjbGFzcy4KLSAgICAgKiBFbmNsb3NlcyB0aGUgc3BlY2lmaWVkIHByb3RvY29sLgotICAgICAqCi0gICAgICogQHBhcmFtIFRQcm90b2NvbCAkcHJvdG9jb2wgQWxsIG9wZXJhdGlvbnMgd2lsbCBiZSBmb3J3YXJkIHRvIHRoaXMgaW5zdGFuY2UuIE11c3QgYmUgbm9uLW51bGwuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGZ1bmN0aW9uIF9fY29uc3RydWN0KFRQcm90b2NvbCAkcHJvdG9jb2wpCi0gICAgewotICAgICAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCRwcm90b2NvbC0+Z2V0VHJhbnNwb3J0KCkpOwotICAgICAgICAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8gPSAkcHJvdG9jb2w7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JpdGVzIHRoZSBtZXNzYWdlIGhlYWRlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgIEZ1bmN0aW9uIG5hbWUKLSAgICAgKiBAcGFyYW0gaW50ICAgICR0eXBlICBtZXNzYWdlIHR5cGUgVE1lc3NhZ2VUeXBlOjpDQUxMIG9yIFRNZXNzYWdlVHlwZTo6UkVQTFkKLSAgICAgKiBAcGFyYW0gaW50ICAgICRzZXFpZCBUaGUgc2VxdWVuY2UgaWQgb2YgdGhpcyBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWVzc2FnZUJlZ2luKCRuYW1lLCAkdHlwZSwgJHNlcWlkKQotICAgIHsKLSAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+d3JpdGVNZXNzYWdlQmVnaW4oJG5hbWUsICR0eXBlLCAkc2VxaWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENsb3NlcyB0aGUgbWVzc2FnZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNZXNzYWdlRW5kKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPndyaXRlTWVzc2FnZUVuZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyaXRlcyBhIHN0cnVjdCBoZWFkZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lIFN0cnVjdCBuYW1lCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIFRFeGNlcHRpb24gb24gd3JpdGUgZXJyb3IKLSAgICAgKiBAcmV0dXJuIGludCBIb3cgbWFueSBieXRlcyB3cml0dGVuCi0gICAgICovCi0gICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU3RydWN0QmVnaW4oJG5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZVN0cnVjdEJlZ2luKCRuYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDbG9zZSBhIHN0cnVjdC4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgVEV4Y2VwdGlvbiBvbiB3cml0ZSBlcnJvcgotICAgICAqIEByZXR1cm4gaW50IEhvdyBtYW55IGJ5dGVzIHdyaXR0ZW4KLSAgICAgKi8KLSAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJ1Y3RFbmQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+d3JpdGVTdHJ1Y3RFbmQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZEJlZ2luKCRmaWVsZE5hbWUsICRmaWVsZFR5cGUsICRmaWVsZElkKQotICAgIHsKLSAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+d3JpdGVGaWVsZEJlZ2luKCRmaWVsZE5hbWUsICRmaWVsZFR5cGUsICRmaWVsZElkKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZEVuZCgpCi0gICAgewotICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZUZpZWxkRW5kKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRTdG9wKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPndyaXRlRmllbGRTdG9wKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWFwQmVnaW4oJGtleVR5cGUsICR2YWxUeXBlLCAkc2l6ZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPndyaXRlTWFwQmVnaW4oJGtleVR5cGUsICR2YWxUeXBlLCAkc2l6ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWFwRW5kKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPndyaXRlTWFwRW5kKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTGlzdEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpCi0gICAgewotICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZUxpc3RCZWdpbigkZWxlbVR5cGUsICRzaXplKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVMaXN0RW5kKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPndyaXRlTGlzdEVuZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVNldEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpCi0gICAgewotICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZVNldEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVNldEVuZCgpCi0gICAgewotICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZVNldEVuZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUJvb2woJGJvb2wpCi0gICAgewotICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZUJvb2woJGJvb2wpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUJ5dGUoJGJ5dGUpCi0gICAgewotICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZUJ5dGUoJGJ5dGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUkxNigkaTE2KQotICAgIHsKLSAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+d3JpdGVJMTYoJGkxNik7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTMyKCRpMzIpCi0gICAgewotICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZUkzMigkaTMyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJNjQoJGk2NCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPndyaXRlSTY0KCRpNjQpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZURvdWJsZSgkZHViKQotICAgIHsKLSAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+d3JpdGVEb3VibGUoJGR1Yik7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU3RyaW5nKCRzdHIpCi0gICAgewotICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZVN0cmluZygkc3RyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWFkcyB0aGUgbWVzc2FnZSBoZWFkZXIKLSAgICAgKgotICAgICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgIEZ1bmN0aW9uIG5hbWUKLSAgICAgKiBAcGFyYW0gaW50ICAgICR0eXBlICBtZXNzYWdlIHR5cGUgVE1lc3NhZ2VUeXBlOjpDQUxMIG9yIFRNZXNzYWdlVHlwZTo6UkVQTFkKLSAgICAgKiBAcGFyYW0gaW50ICAgICRzZXFpZCBUaGUgc2VxdWVuY2UgaWQgb2YgdGhpcyBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNZXNzYWdlQmVnaW4oJiRuYW1lLCAmJHR5cGUsICYkc2VxaWQpCi0gICAgewotICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT5yZWFkTWVzc2FnZUJlZ2luKCRuYW1lLCAkdHlwZSwgJHNlcWlkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWFkIHRoZSBjbG9zZSBvZiBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNZXNzYWdlRW5kKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPnJlYWRNZXNzYWdlRW5kKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJ1Y3RCZWdpbigmJG5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT5yZWFkU3RydWN0QmVnaW4oJG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RydWN0RW5kKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPnJlYWRTdHJ1Y3RFbmQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEZpZWxkQmVnaW4oJiRuYW1lLCAmJGZpZWxkVHlwZSwgJiRmaWVsZElkKQotICAgIHsKLSAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+cmVhZEZpZWxkQmVnaW4oJG5hbWUsICRmaWVsZFR5cGUsICRmaWVsZElkKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEZpZWxkRW5kKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPnJlYWRGaWVsZEVuZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWFwQmVnaW4oJiRrZXlUeXBlLCAmJHZhbFR5cGUsICYkc2l6ZSkKLSAgICB7Ci0gICAgICAgICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+cmVhZE1hcEJlZ2luKCRrZXlUeXBlLCAkdmFsVHlwZSwgJHNpemUpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWFwRW5kKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPnJlYWRNYXBFbmQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZExpc3RCZWdpbigmJGVsZW1UeXBlLCAmJHNpemUpCi0gICAgewotICAgICAgICAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPnJlYWRMaXN0QmVnaW4oJGVsZW1UeXBlLCAkc2l6ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlYWRMaXN0RW5kKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPnJlYWRMaXN0RW5kKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTZXRCZWdpbigmJGVsZW1UeXBlLCAmJHNpemUpCi0gICAgewotICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT5yZWFkU2V0QmVnaW4oJGVsZW1UeXBlLCAkc2l6ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTZXRFbmQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+cmVhZFNldEVuZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkQm9vbCgmJGJvb2wpCi0gICAgewotICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT5yZWFkQm9vbCgkYm9vbCk7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlYWRCeXRlKCYkYnl0ZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPnJlYWRCeXRlKCRieXRlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEkxNigmJGkxNikKLSAgICB7Ci0gICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPnJlYWRJMTYoJGkxNik7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlYWRJMzIoJiRpMzIpCi0gICAgewotICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT5yZWFkSTMyKCRpMzIpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkSTY0KCYkaTY0KQotICAgIHsKLSAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+cmVhZEk2NCgkaTY0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZERvdWJsZSgmJGR1YikKLSAgICB7Ci0gICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPnJlYWREb3VibGUoJGR1Yik7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJpbmcoJiRzdHIpCi0gICAgewotICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT5yZWFkU3RyaW5nKCRzdHIpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RocmlmdC9TZXJpYWxpemVyL1RCaW5hcnlTZXJpYWxpemVyLnBocCBiL2xpYi9waHAvbGliL1RocmlmdC9TZXJpYWxpemVyL1RCaW5hcnlTZXJpYWxpemVyLnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGUwYWY4Ny4uMDAwMDAwMAotLS0gYS9saWIvcGhwL2xpYi9UaHJpZnQvU2VyaWFsaXplci9UQmluYXJ5U2VyaWFsaXplci5waHAKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi08P3BocAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKLSAqIEBhdXRob3I6IHJtYXJpbiAobWFyaW4ucmFkdUBmYWNlYm9vay5jb20pCi0gKi8KLQotbmFtZXNwYWNlIFRocmlmdFxTZXJpYWxpemVyOwotCi11c2UgVGhyaWZ0XFRyYW5zcG9ydFxUTWVtb3J5QnVmZmVyOwotdXNlIFRocmlmdFxQcm90b2NvbFxUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZDsKLXVzZSBUaHJpZnRcVHlwZVxUTWVzc2FnZVR5cGU7Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyBmb3Igc2VyaWFsaXppbmcgYW5kIGRlc2VyaWFsaXppbmcKLSAqIGEgdGhyaWZ0IG9iamVjdCB1c2luZyBUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZC4KLSAqLwotY2xhc3MgVEJpbmFyeVNlcmlhbGl6ZXIgewotCi0gIC8vIE5PVEUocm1hcmluKTogQmVjYXVzZSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYmluYXJ5Ci0gIC8vIGFkZHMgYSBiZWdpbiBtZXNzYWdlIHByZWZpeCwgeW91IGNhbm5vdCBzcGVjaWZ5Ci0gIC8vIGEgdHJhbnNwb3J0IGluIHdoaWNoIHRvIHNlcmlhbGl6ZSBhbiBvYmplY3QuIEl0IGhhcyB0bwotICAvLyBiZSBhIHN0cmluZy4gT3RoZXJ3aXNlIHdlIHdpbGwgYnJlYWsgdGhlIGNvbXBhdGliaWxpdHkgd2l0aAotICAvLyBub3JtYWwgZGVzZXJpYWxpemF0aW9uLgotICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNlcmlhbGl6ZSgkb2JqZWN0KSB7Ci0gICAgJHRyYW5zcG9ydCA9IG5ldyBUTWVtb3J5QnVmZmVyKCk7Ci0gICAgJHByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkKCR0cmFuc3BvcnQpOwotICAgIGlmIChmdW5jdGlvbl9leGlzdHMoJ3RocmlmdF9wcm90b2NvbF93cml0ZV9iaW5hcnknKSkgewotICAgICAgdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2JpbmFyeSgkcHJvdG9jb2wsICRvYmplY3QtPmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE1lc3NhZ2VUeXBlOjpSRVBMWSwgJG9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgJHByb3RvY29sLT5pc1N0cmljdFdyaXRlKCkpOwotCi0gICAgICAkcHJvdG9jb2wtPnJlYWRNZXNzYWdlQmVnaW4oJHVudXNlZF9uYW1lLCAkdW51c2VkX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHVudXNlZF9zZXFpZCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICRvYmplY3QtPndyaXRlKCRwcm90b2NvbCk7Ci0gICAgfQotICAgICRwcm90b2NvbC0+Z2V0VHJhbnNwb3J0KCktPmZsdXNoKCk7Ci0gICAgcmV0dXJuICR0cmFuc3BvcnQtPmdldEJ1ZmZlcigpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBkZXNlcmlhbGl6ZSgkc3RyaW5nX29iamVjdCwgJGNsYXNzX25hbWUpIHsKLSAgICAgJHRyYW5zcG9ydCA9IG5ldyBUTWVtb3J5QnVmZmVyKCk7Ci0gICAgICRwcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCgkdHJhbnNwb3J0KTsKLSAgICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygndGhyaWZ0X3Byb3RvY29sX3JlYWRfYmluYXJ5JykpIHsKLSAgICAgICAvLyBOT1RFICh0LmhlaW50eikgVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQgaW50ZXJuYWxseSB3cmFwcyBvdXIgVE1lbW9yeUJ1ZmZlciBpbiBhCi0gICAgICAgLy8gVEJ1ZmZlcmVkVHJhbnNwb3J0LCBzbyB3ZSBoYXZlIHRvIHJldHJpZXZlIGl0IGFnYWluIG9yIHJpc2sgbG9zaW5nIGRhdGEgd2hlbiB3cml0aW5nCi0gICAgICAgLy8gbGVzcyB0aGFuIDUxMiBieXRlcyB0byB0aGUgdHJhbnNwb3J0IChzZWUgdGhlIGNvbW1lbnQgdGhlcmUgYXMgd2VsbCkuCi0gICAgICAgLy8gQHNlZSBUSFJJRlQtMTU3OQotICAgICAgICRwcm90b2NvbC0+d3JpdGVNZXNzYWdlQmVnaW4oJycsIFRNZXNzYWdlVHlwZTo6UkVQTFksIDApOwotICAgICAgICRwcm90b2NvbFRyYW5zcG9ydCA9ICRwcm90b2NvbC0+Z2V0VHJhbnNwb3J0KCk7Ci0gICAgICAgJHByb3RvY29sVHJhbnNwb3J0LT53cml0ZSgkc3RyaW5nX29iamVjdCk7Ci0gICAgICAgJHByb3RvY29sVHJhbnNwb3J0LT5mbHVzaCgpOwotICAgICAgIHJldHVybiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9iaW5hcnkoJHByb3RvY29sLCAkY2xhc3NfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwcm90b2NvbC0+aXNTdHJpY3RSZWFkKCkpOwotICAgICB9IGVsc2UgewotICAgICAgICR0cmFuc3BvcnQtPndyaXRlKCRzdHJpbmdfb2JqZWN0KTsKLSAgICAgICAkb2JqZWN0ID0gbmV3ICRjbGFzc19uYW1lKCk7Ci0gICAgICAgJG9iamVjdC0+cmVhZCgkcHJvdG9jb2wpOwotICAgICAgIHJldHVybiAkb2JqZWN0OwotICAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RocmlmdC9TZXJ2ZXIvVEZvcmtpbmdTZXJ2ZXIucGhwIGIvbGliL3BocC9saWIvVGhyaWZ0L1NlcnZlci9URm9ya2luZ1NlcnZlci5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmY2EzMDUuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9saWIvVGhyaWZ0L1NlcnZlci9URm9ya2luZ1NlcnZlci5waHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotPD9waHAKLQotbmFtZXNwYWNlIFRocmlmdFxTZXJ2ZXI7Ci0KLXVzZSBUaHJpZnRcU2VydmVyXFRTZXJ2ZXI7Ci11c2UgVGhyaWZ0XFRyYW5zcG9ydFxUVHJhbnNwb3J0OwotdXNlIFRocmlmdFxFeGNlcHRpb25cVEV4Y2VwdGlvbjsKLXVzZSBUaHJpZnRcRXhjZXB0aW9uXFRUcmFuc3BvcnRFeGNlcHRpb247Ci0KLS8qKgotICogQSBmb3JraW5nIGltcGxlbWVudGF0aW9uIG9mIGEgVGhyaWZ0IHNlcnZlci4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQuc2VydmVyCi0gKi8KLWNsYXNzIFRGb3JraW5nU2VydmVyIGV4dGVuZHMgVFNlcnZlciB7Ci0gIC8qKgotICAgKiBGbGFnIGZvciB0aGUgbWFpbiBzZXJ2aW5nIGxvb3AKLSAgICoKLSAgICogQHZhciBib29sCi0gICAqLwotICBwcml2YXRlICRzdG9wXyA9IGZhbHNlOwotCi0gIC8qKgotICAgKiBMaXN0IG9mIGNoaWxkcmVuLgotICAgKgotICAgKiBAdmFyIGFycmF5Ci0gICAqLwotICBwcm90ZWN0ZWQgJGNoaWxkcmVuXyA9IGFycmF5KCk7Ci0KLSAgLyoqCi0gICAqIExpc3RlbnMgZm9yIG5ldyBjbGllbnQgdXNpbmcgdGhlIHN1cHBsaWVkCi0gICAqIHRyYW5zcG9ydC4gV2UgZm9yayB3aGVuIGEgbmV3IGNvbm5lY3Rpb24KLSAgICogYXJyaXZlcy4KLSAgICoKLSAgICogQHJldHVybiB2b2lkCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gc2VydmUoKSB7Ci0gICAgJHRoaXMtPnRyYW5zcG9ydF8tPmxpc3RlbigpOwotCi0gICAgd2hpbGUgKCEkdGhpcy0+c3RvcF8pIHsKLSAgICAgIHRyeSB7Ci0gICAgICAgICR0cmFuc3BvcnQgPSAkdGhpcy0+dHJhbnNwb3J0Xy0+YWNjZXB0KCk7Ci0KLSAgICAgICAgaWYgKCR0cmFuc3BvcnQgIT0gbnVsbCkgewotICAgICAgICAgICRwaWQgPSBwY250bF9mb3JrKCk7Ci0KLSAgICAgICAgICBpZiAoJHBpZCA+IDApIHsKLSAgICAgICAgICAgICR0aGlzLT5oYW5kbGVQYXJlbnQoJHRyYW5zcG9ydCwgJHBpZCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKCRwaWQgPT09IDApIHsKLSAgICAgICAgICAgICR0aGlzLT5oYW5kbGVDaGlsZCgkdHJhbnNwb3J0KTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbignRmFpbGVkIHRvIGZvcmsnKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uICRlKSB7IH0KLQotICAgICAgJHRoaXMtPmNvbGxlY3RDaGlsZHJlbigpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBDb2RlIHJ1biBieSB0aGUgcGFyZW50Ci0gICAqCi0gICAqIEBwYXJhbSBUVHJhbnNwb3J0ICR0cmFuc3BvcnQKLSAgICogQHBhcmFtIGludCAkcGlkCi0gICAqIEByZXR1cm4gdm9pZAotICAgKi8KLSAgcHJpdmF0ZSBmdW5jdGlvbiBoYW5kbGVQYXJlbnQoVFRyYW5zcG9ydCAkdHJhbnNwb3J0LCAkcGlkKSB7Ci0gICAgJHRoaXMtPmNoaWxkcmVuX1skcGlkXSA9ICR0cmFuc3BvcnQ7Ci0gIH0KLQotICAvKioKLSAgICogQ29kZSBydW4gYnkgdGhlIGNoaWxkLgotICAgKgotICAgKiBAcGFyYW0gVFRyYW5zcG9ydCAkdHJhbnNwb3J0Ci0gICAqIEByZXR1cm4gdm9pZAotICAgKi8KLSAgcHJpdmF0ZSBmdW5jdGlvbiBoYW5kbGVDaGlsZChUVHJhbnNwb3J0ICR0cmFuc3BvcnQpIHsKLSAgICB0cnkgewotICAgICAgJGlucHV0VHJhbnNwb3J0ID0gJHRoaXMtPmlucHV0VHJhbnNwb3J0RmFjdG9yeV8tPmdldFRyYW5zcG9ydCgkdHJhbnNwb3J0KTsKLSAgICAgICRvdXRwdXRUcmFuc3BvcnQgPSAkdGhpcy0+b3V0cHV0VHJhbnNwb3J0RmFjdG9yeV8tPmdldFRyYW5zcG9ydCgkdHJhbnNwb3J0KTsKLSAgICAgICRpbnB1dFByb3RvY29sID0gJHRoaXMtPmlucHV0UHJvdG9jb2xGYWN0b3J5Xy0+Z2V0UHJvdG9jb2woJGlucHV0VHJhbnNwb3J0KTsKLSAgICAgICRvdXRwdXRQcm90b2NvbCA9ICR0aGlzLT5vdXRwdXRQcm90b2NvbEZhY3RvcnlfLT5nZXRQcm90b2NvbCgkb3V0cHV0VHJhbnNwb3J0KTsKLSAgICAgIHdoaWxlICgkdGhpcy0+cHJvY2Vzc29yXy0+cHJvY2VzcygkaW5wdXRQcm90b2NvbCwgJG91dHB1dFByb3RvY29sKSkgeyB9Ci0gICAgICBAJHRyYW5zcG9ydC0+Y2xvc2UoKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gJGUpIHsgfQotCi0gICAgZXhpdCgwKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb2xsZWN0cyBhbnkgY2hpbGRyZW4gd2UgbWF5IGhhdmUKLSAgICoKLSAgICogQHJldHVybiB2b2lkCi0gICAqLwotICBwcml2YXRlIGZ1bmN0aW9uIGNvbGxlY3RDaGlsZHJlbigpIHsKLSAgICBmb3JlYWNoICgkdGhpcy0+Y2hpbGRyZW5fIGFzICRwaWQgPT4gJHRyYW5zcG9ydCkgewotICAgICAgaWYgKHBjbnRsX3dhaXRwaWQoJHBpZCwgJHN0YXR1cywgV05PSEFORykgPiAwKSB7Ci0gICAgICAgIHVuc2V0KCR0aGlzLT5jaGlsZHJlbl9bJHBpZF0pOwotICAgICAgICBpZiAoJHRyYW5zcG9ydCkgQCR0cmFuc3BvcnQtPmNsb3NlKCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFN0b3BzIHRoZSBzZXJ2ZXIgcnVubmluZy4gS2lsbHMgdGhlIHRyYW5zcG9ydAotICAgKiBhbmQgdGhlbiBzdG9wcyB0aGUgbWFpbiBzZXJ2aW5nIGxvb3AKLSAgICoKLSAgICogQHJldHVybiB2b2lkCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gc3RvcCgpIHsKLSAgICAkdGhpcy0+dHJhbnNwb3J0Xy0+Y2xvc2UoKTsKLSAgICAkdGhpcy0+c3RvcF8gPSB0cnVlOwotICB9Ci19CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvU2VydmVyL1RTZXJ2ZXIucGhwIGIvbGliL3BocC9saWIvVGhyaWZ0L1NlcnZlci9UU2VydmVyLnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQzYmY0Yi4uMDAwMDAwMAotLS0gYS9saWIvcGhwL2xpYi9UaHJpZnQvU2VydmVyL1RTZXJ2ZXIucGhwCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLTw/cGhwCi0KLW5hbWVzcGFjZSBUaHJpZnRcU2VydmVyOwotCi11c2UgVGhyaWZ0XFNlcnZlclxUU2VydmVyVHJhbnNwb3J0OwotdXNlIFRocmlmdFxGYWN0b3J5XFRUcmFuc3BvcnRGYWN0b3J5OwotdXNlIFRocmlmdFxGYWN0b3J5XFRQcm90b2NvbEZhY3Rvcnk7Ci0KLS8qKgotICogR2VuZXJpYyBjbGFzcyBmb3IgYSBUaHJpZnQgc2VydmVyLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC5zZXJ2ZXIKLSAqLwotYWJzdHJhY3QgY2xhc3MgVFNlcnZlciB7Ci0KLSAgLyoqCi0gICAqIFByb2Nlc3NvciB0byBoYW5kbGUgbmV3IGNsaWVudHMKLSAgICoKLSAgICogQHZhciBUUHJvY2Vzc29yCi0gICAqLwotICBwcm90ZWN0ZWQgJHByb2Nlc3Nvcl87Ci0KLSAgLyoqCi0gICAqIFNlcnZlciB0cmFuc3BvcnQgdG8gYmUgdXNlZCBmb3IgbGlzdGVuaW5nCi0gICAqIGFuZCBhY2NlcHRpbmcgbmV3IGNsaWVudHMKLSAgICoKLSAgICogQHZhciBUU2VydmVyVHJhbnNwb3J0Ci0gICAqLwotICBwcm90ZWN0ZWQgJHRyYW5zcG9ydF87Ci0KLSAgLyoqCi0gICAqIElucHV0IHRyYW5zcG9ydCBmYWN0b3J5Ci0gICAqCi0gICAqIEB2YXIgVFRyYW5zcG9ydEZhY3RvcnkKLSAgICovCi0gIHByb3RlY3RlZCAkaW5wdXRUcmFuc3BvcnRGYWN0b3J5XzsKLQotICAvKioKLSAgICogT3V0cHV0IHRyYW5zcG9ydCBmYWN0b3J5Ci0gICAqCi0gICAqIEB2YXIgVFRyYW5zcG9ydEZhY3RvcnkKLSAgICovCi0gIHByb3RlY3RlZCAkb3V0cHV0VHJhbnNwb3J0RmFjdG9yeV87Ci0KLSAgLyoqCi0gICAqIElucHV0IHByb3RvY29sIGZhY3RvcnkKLSAgICoKLSAgICogQHZhciBUUHJvdG9jb2xGYWN0b3J5Ci0gICAqLwotICBwcm90ZWN0ZWQgJGlucHV0UHJvdG9jb2xGYWN0b3J5XzsKLQotICAvKioKLSAgICogT3V0cHV0IHByb3RvY29sIGZhY3RvcnkKLSAgICoKLSAgICogQHZhciBUUHJvdG9jb2xGYWN0b3J5Ci0gICAqLwotICBwcm90ZWN0ZWQgJG91dHB1dFByb3RvY29sRmFjdG9yeV87Ci0KLSAgLyoqCi0gICAqIFNldHMgdXAgYWxsIHRoZSBmYWN0b3JpZXMsIGV0YwotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0ICRwcm9jZXNzb3IKLSAgICogQHBhcmFtIFRTZXJ2ZXJUcmFuc3BvcnQgJHRyYW5zcG9ydAotICAgKiBAcGFyYW0gVFRyYW5zcG9ydEZhY3RvcnkgJGlucHV0VHJhbnNwb3J0RmFjdG9yeQotICAgKiBAcGFyYW0gVFRyYW5zcG9ydEZhY3RvcnkgJG91dHB1dFRyYW5zcG9ydEZhY3RvcnkKLSAgICogQHBhcmFtIFRQcm90b2NvbEZhY3RvcnkgJGlucHV0UHJvdG9jb2xGYWN0b3J5Ci0gICAqIEBwYXJhbSBUUHJvdG9jb2xGYWN0b3J5ICRvdXRwdXRQcm90b2NvbEZhY3RvcnkKLSAgICogQHJldHVybiB2b2lkCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgJHRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5ICRpbnB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSAkb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEZhY3RvcnkgJGlucHV0UHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSAkb3V0cHV0UHJvdG9jb2xGYWN0b3J5KSB7Ci0gICAgJHRoaXMtPnByb2Nlc3Nvcl8gPSAkcHJvY2Vzc29yOwotICAgICR0aGlzLT50cmFuc3BvcnRfID0gJHRyYW5zcG9ydDsKLSAgICAkdGhpcy0+aW5wdXRUcmFuc3BvcnRGYWN0b3J5XyA9ICRpbnB1dFRyYW5zcG9ydEZhY3Rvcnk7Ci0gICAgJHRoaXMtPm91dHB1dFRyYW5zcG9ydEZhY3RvcnlfID0gJG91dHB1dFRyYW5zcG9ydEZhY3Rvcnk7Ci0gICAgJHRoaXMtPmlucHV0UHJvdG9jb2xGYWN0b3J5XyA9ICRpbnB1dFByb3RvY29sRmFjdG9yeTsKLSAgICAkdGhpcy0+b3V0cHV0UHJvdG9jb2xGYWN0b3J5XyA9ICRvdXRwdXRQcm90b2NvbEZhY3Rvcnk7Ci0gIH0KLQotICAvKioKLSAgICogU2VydmVzIHRoZSBzZXJ2ZXIuIFRoaXMgc2hvdWxkIG5ldmVyIHJldHVybgotICAgKiB1bmxlc3MgYSBwcm9ibGVtIHBlcm1pdHMgaXQgdG8gZG8gc28gb3IgaXQKLSAgICogaXMgaW50ZXJydXB0ZWQgaW50ZW50aW9uYWxseQotICAgKgotICAgKiBAYWJzdHJhY3QKLSAgICogQHJldHVybiB2b2lkCi0gICAqLwotICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gc2VydmUoKTsKLQotICAvKioKLSAgICogU3RvcHMgdGhlIHNlcnZlciBzZXJ2aW5nCi0gICAqCi0gICAqIEBhYnN0cmFjdAotICAgKiBAcmV0dXJuIHZvaWQKLSAgICovCi0gIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiBzdG9wKCk7Ci19CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvU2VydmVyL1RTZXJ2ZXJTb2NrZXQucGhwIGIvbGliL3BocC9saWIvVGhyaWZ0L1NlcnZlci9UU2VydmVyU29ja2V0LnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBhNmZiOS4uMDAwMDAwMAotLS0gYS9saWIvcGhwL2xpYi9UaHJpZnQvU2VydmVyL1RTZXJ2ZXJTb2NrZXQucGhwCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotPD9waHAKLQotbmFtZXNwYWNlIFRocmlmdFxTZXJ2ZXI7Ci0KLXVzZSBUaHJpZnRcU2VydmVyXFRTZXJ2ZXJUcmFuc3BvcnQ7Ci11c2UgVGhyaWZ0XFRyYW5zcG9ydFxUU29ja2V0OwotCi0vKioKLSAqIFNvY2tldCBpbXBsZW1lbnRhdGlvbiBvZiBhIHNlcnZlciBhZ2VudC4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0Ci0gKi8KLWNsYXNzIFRTZXJ2ZXJTb2NrZXQgZXh0ZW5kcyBUU2VydmVyVHJhbnNwb3J0IHsKLQotICAvKioKLSAgICogSGFuZGxlIGZvciB0aGUgbGlzdGVuZXIgc29ja2V0Ci0gICAqCi0gICAqIEB2YXIgcmVzb3VyY2UKLSAgICovCi0gIHByaXZhdGUgJGxpc3RlbmVyXzsKLQotICAvKioKLSAgICogUG9ydCBmb3IgdGhlIGxpc3RlbmVyIHRvIGxpc3RlbiBvbgotICAgKgotICAgKiBAdmFyIGludAotICAgKi8KLSAgcHJpdmF0ZSAkcG9ydF87Ci0KLSAgLyoqCi0gICAqIFRpbWVvdXQgd2hlbiBsaXN0ZW5pbmcgZm9yIGEgbmV3IGNsaWVudAotICAgKgotICAgKiBAdmFyIGludAotICAgKi8KLSAgcHJpdmF0ZSAkYWNjZXB0VGltZW91dF8gPSAzMDAwMDsKLQotICAvKioKLSAgICogSG9zdCB0byBsaXN0ZW4gb24KLSAgICoKLSAgICogQHZhciBzdHJpbmcKLSAgICovCi0gIHByaXZhdGUgJGhvc3RfOwotCi0gIC8qKgotICAgKiBTZXJ2ZXJTb2NrZXQgY29uc3RydWN0b3IKLSAgICoKLSAgICogQHBhcmFtIHN0cmluZyAkaG9zdCAgICAgICAgSG9zdCB0byBsaXN0ZW4gb24KLSAgICogQHBhcmFtIGludCAkcG9ydCAgICAgICAgICAgUG9ydCB0byBsaXN0ZW4gb24KLSAgICogQHJldHVybiB2b2lkCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGhvc3QgPSAnbG9jYWxob3N0JywgJHBvcnQgPSA5MDkwKSB7Ci0gICAgJHRoaXMtPmhvc3RfID0gJGhvc3Q7Ci0gICAgJHRoaXMtPnBvcnRfID0gJHBvcnQ7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgYWNjZXB0IHRpbWVvdXQKLSAgICoKLSAgICogQHBhcmFtIGludCAkYWNjZXB0VGltZW91dAotICAgKiBAcmV0dXJuIHZvaWQKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBzZXRBY2NlcHRUaW1lb3V0KCRhY2NlcHRUaW1lb3V0KSB7Ci0gICAgJHRoaXMtPmFjY2VwdFRpbWVvdXRfID0gJGFjY2VwdFRpbWVvdXQ7Ci0gIH0KLQotICAvKioKLSAgICogT3BlbnMgYSBuZXcgc29ja2V0IHNlcnZlciBoYW5kbGUKLSAgICoKLSAgICogQHJldHVybiB2b2lkCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gbGlzdGVuKCkgewotICAgICR0aGlzLT5saXN0ZW5lcl8gPSBzdHJlYW1fc29ja2V0X3NlcnZlcigndGNwOi8vJyAuICR0aGlzLT5ob3N0XyAuICc6JyAuICR0aGlzLT5wb3J0Xyk7Ci0gIH0KLQotICAvKioKLSAgICogQ2xvc2VzIHRoZSBzb2NrZXQgc2VydmVyIGhhbmRsZQotICAgKgotICAgKiBAcmV0dXJuIHZvaWQKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBjbG9zZSgpIHsKLSAgICBAZmNsb3NlKCR0aGlzLT5saXN0ZW5lcl8pOwotICAgICR0aGlzLT5saXN0ZW5lcl8gPSBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIEltcGxlbWVudGF0aW9uIG9mIGFjY2VwdC4gSWYgbm90IGNsaWVudCBpcyBhY2NlcHRlZCBpbiB0aGUgZ2l2ZW4gdGltZQotICAgKgotICAgKiBAcmV0dXJuIFRTb2NrZXQKLSAgICovCi0gIHByb3RlY3RlZCBmdW5jdGlvbiBhY2NlcHRJbXBsKCkgewotICAgICRoYW5kbGUgPSBAc3RyZWFtX3NvY2tldF9hY2NlcHQoJHRoaXMtPmxpc3RlbmVyXywgJHRoaXMtPmFjY2VwdFRpbWVvdXRfIC8gMTAwMC4wKTsKLSAgICBpZighJGhhbmRsZSkgcmV0dXJuIG51bGw7Ci0KLSAgICAkc29ja2V0ID0gbmV3IFRTb2NrZXQoKTsKLSAgICAkc29ja2V0LT5zZXRIYW5kbGUoJGhhbmRsZSk7Ci0KLSAgICByZXR1cm4gJHNvY2tldDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVGhyaWZ0L1NlcnZlci9UU2VydmVyVHJhbnNwb3J0LnBocCBiL2xpYi9waHAvbGliL1RocmlmdC9TZXJ2ZXIvVFNlcnZlclRyYW5zcG9ydC5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzMjQ3MTIuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9saWIvVGhyaWZ0L1NlcnZlci9UU2VydmVyVHJhbnNwb3J0LnBocAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLTw/cGhwCi0KLW5hbWVzcGFjZSBUaHJpZnRcU2VydmVyOwotCi11c2UgVGhyaWZ0XEV4Y2VwdGlvblxUVHJhbnNwb3J0RXhjZXB0aW9uOwotCi0vKioKLSAqIEdlbmVyaWMgY2xhc3MgZm9yIFNlcnZlciBhZ2VudC4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0Ci0gKi8KLWFic3RyYWN0IGNsYXNzIFRTZXJ2ZXJUcmFuc3BvcnQgewotICAvKioKLSAgICogTGlzdCBmb3IgbmV3IGNsaWVudHMKLSAgICoKLSAgICogQGFic3RyYWN0Ci0gICAqIEByZXR1cm4gdm9pZAotICAgKi8KLSAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIGxpc3RlbigpOwotCi0gIC8qKgotICAgKiBDbG9zZSB0aGUgc2VydmVyCi0gICAqCi0gICAqIEBhYnN0cmFjdAotICAgKiBAcmV0dXJuIHZvaWQKLSAgICovCi0gIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiBjbG9zZSgpOwotCi0gIC8qKgotICAgKiBTdWJjbGFzc2VzIHNob3VsZCB1c2UgdGhpcyB0byBpbXBsZW1lbnQKLSAgICogYWNjZXB0LgotICAgKgotICAgKiBAYWJzdHJhY3QKLSAgICogQHJldHVybiBUVHJhbnNwb3J0Ci0gICAqLwotICBwcm90ZWN0ZWQgYWJzdHJhY3QgZnVuY3Rpb24gYWNjZXB0SW1wbCgpOwotCi0gIC8qKgotICAgKiBVc2VzIHRoZSBhY2NlcHQgaW1wbGVtdGF0aW9uLiBJZiBudWxsIGlzIHJldHVybmVkLCBhbgotICAgKiBleGNlcHRpb24gaXMgdGhyb3duLgotICAgKgotICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24KLSAgICogQHJldHVybiBUVHJhbnNwb3J0Ci0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gYWNjZXB0KCkgewotICAgICR0cmFuc3BvcnQgPSAkdGhpcy0+YWNjZXB0SW1wbCgpOwotCi0gICAgaWYgKCR0cmFuc3BvcnQgPT0gbnVsbCkgewotICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oImFjY2VwdCgpIG1heSBub3QgcmV0dXJuIE5VTEwiKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gJHRyYW5zcG9ydDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVGhyaWZ0L1NlcnZlci9UU2ltcGxlU2VydmVyLnBocCBiL2xpYi9waHAvbGliL1RocmlmdC9TZXJ2ZXIvVFNpbXBsZVNlcnZlci5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5MGU0OGYuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9saWIvVGhyaWZ0L1NlcnZlci9UU2ltcGxlU2VydmVyLnBocAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLTw/cGhwCi0KLW5hbWVzcGFjZSBUaHJpZnRcU2VydmVyOwotCi11c2UgVGhyaWZ0XFNlcnZlclxUU2VydmVyOwotdXNlIFRocmlmdFxFeGNlcHRpb25cVFRyYW5zcG9ydEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBTaW1wbGUgaW1wbGVtdGF0aW9uIG9mIGEgVGhyaWZ0IHNlcnZlci4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQuc2VydmVyCi0gKi8KLWNsYXNzIFRTaW1wbGVTZXJ2ZXIgZXh0ZW5kcyBUU2VydmVyIHsKLSAgLyoqCi0gICAqIEZsYWcgZm9yIHRoZSBtYWluIHNlcnZpbmcgbG9vcAotICAgKgotICAgKiBAdmFyIGJvb2wKLSAgICovCi0gIHByaXZhdGUgJHN0b3BfID0gZmFsc2U7Ci0KLSAgLyoqCi0gICAqIExpc3RlbnMgZm9yIG5ldyBjbGllbnQgdXNpbmcgdGhlIHN1cHBsaWVkCi0gICAqIHRyYW5zcG9ydC4gSXQgaGFuZGxlcyBUVHJhbnNwb3J0RXhjZXB0aW9ucwotICAgKiB0byBhdm9pZCB0aW1lb3V0cyBldGMga2lsbGluZyBpdAotICAgKgotICAgKiBAcmV0dXJuIHZvaWQKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBzZXJ2ZSgpIHsKLSAgICAkdGhpcy0+dHJhbnNwb3J0Xy0+bGlzdGVuKCk7Ci0KLSAgICB3aGlsZSAoISR0aGlzLT5zdG9wXykgewotICAgICAgdHJ5IHsKLSAgICAgICAgJHRyYW5zcG9ydCA9ICR0aGlzLT50cmFuc3BvcnRfLT5hY2NlcHQoKTsKLQotICAgICAgICBpZiAoJHRyYW5zcG9ydCAhPSBudWxsKSB7Ci0gICAgICAgICAgJGlucHV0VHJhbnNwb3J0ID0gJHRoaXMtPmlucHV0VHJhbnNwb3J0RmFjdG9yeV8tPmdldFRyYW5zcG9ydCgkdHJhbnNwb3J0KTsKLSAgICAgICAgICAkb3V0cHV0VHJhbnNwb3J0ID0gJHRoaXMtPm91dHB1dFRyYW5zcG9ydEZhY3RvcnlfLT5nZXRUcmFuc3BvcnQoJHRyYW5zcG9ydCk7Ci0gICAgICAgICAgJGlucHV0UHJvdG9jb2wgPSAkdGhpcy0+aW5wdXRQcm90b2NvbEZhY3RvcnlfLT5nZXRQcm90b2NvbCgkaW5wdXRUcmFuc3BvcnQpOwotICAgICAgICAgICRvdXRwdXRQcm90b2NvbCA9ICR0aGlzLT5vdXRwdXRQcm90b2NvbEZhY3RvcnlfLT5nZXRQcm90b2NvbCgkb3V0cHV0VHJhbnNwb3J0KTsKLSAgICAgICAgICB3aGlsZSAoJHRoaXMtPnByb2Nlc3Nvcl8tPnByb2Nlc3MoJGlucHV0UHJvdG9jb2wsICRvdXRwdXRQcm90b2NvbCkpIHsgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiAkZSkgeyB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFN0b3BzIHRoZSBzZXJ2ZXIgcnVubmluZy4gS2lsbHMgdGhlIHRyYW5zcG9ydAotICAgKiBhbmQgdGhlbiBzdG9wcyB0aGUgbWFpbiBzZXJ2aW5nIGxvb3AKLSAgICoKLSAgICogQHJldHVybiB2b2lkCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gc3RvcCgpIHsKLSAgICAkdGhpcy0+dHJhbnNwb3J0Xy0+Y2xvc2UoKTsKLSAgICAkdGhpcy0+c3RvcF8gPSB0cnVlOwotICB9Ci19CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvU3RyaW5nRnVuYy9Db3JlLnBocCBiL2xpYi9waHAvbGliL1RocmlmdC9TdHJpbmdGdW5jL0NvcmUucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzhhNWIyLi4wMDAwMDAwCi0tLSBhL2xpYi9waHAvbGliL1RocmlmdC9TdHJpbmdGdW5jL0NvcmUucGhwCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPD9waHAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLW5hbWVzcGFjZSBUaHJpZnRcU3RyaW5nRnVuYzsKLQotdXNlIFRocmlmdFxTdHJpbmdGdW5jXFRTdHJpbmdGdW5jOwotCi1jbGFzcyBDb3JlIGltcGxlbWVudHMgVFN0cmluZ0Z1bmMgewotICAgIHB1YmxpYyBmdW5jdGlvbiBzdWJzdHIoJHN0ciwgJHN0YXJ0LCAkbGVuZ3RoID0gbnVsbCkgewotICAgICAgICAvLyBzcGVjaWZ5aW5nIGEgbnVsbCAkbGVuZ3RoIHdvdWxkIHJldHVybiBhbiBlbXB0eSBzdHJpbmcKLSAgICAgICAgaWYoJGxlbmd0aCA9PT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHN1YnN0cigkc3RyLCAkc3RhcnQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdWJzdHIoJHN0ciwgJHN0YXJ0LCAkbGVuZ3RoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gc3RybGVuKCRzdHIpIHsKLSAgICAgICAgcmV0dXJuIHN0cmxlbigkc3RyKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVGhyaWZ0L1N0cmluZ0Z1bmMvTWJzdHJpbmcucGhwIGIvbGliL3BocC9saWIvVGhyaWZ0L1N0cmluZ0Z1bmMvTWJzdHJpbmcucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWFjZTEzLi4wMDAwMDAwCi0tLSBhL2xpYi9waHAvbGliL1RocmlmdC9TdHJpbmdGdW5jL01ic3RyaW5nLnBocAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi1uYW1lc3BhY2UgVGhyaWZ0XFN0cmluZ0Z1bmM7Ci0KLXVzZSBUaHJpZnRcU3RyaW5nRnVuY1xUU3RyaW5nRnVuYzsKLQotY2xhc3MgTWJzdHJpbmcgaW1wbGVtZW50cyBUU3RyaW5nRnVuYyB7Ci0gICAgcHVibGljIGZ1bmN0aW9uIHN1YnN0cigkc3RyLCAkc3RhcnQsICRsZW5ndGggPSBudWxsKSB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBXZSBuZWVkIHRvIHNldCB0aGUgY2hhcnNldCBwYXJhbWV0ZXIsIHdoaWNoIGlzIHRoZSBzZWNvbmQKLSAgICAgICAgICogb3B0aW9uYWwgcGFyYW1ldGVyIGFuZCB0aGUgZmlyc3Qgb3B0aW9uYWwgcGFyYW1ldGVyIGNhbid0Ci0gICAgICAgICAqIGJlIG51bGwgb3IgZmFsc2UgYXMgYSAibWFnaWMiIHZhbHVlIGJlY2F1c2UgdGhhdCB3b3VsZAotICAgICAgICAgKiBjYXVzZSBhbiBlbXB0eSBzdHJpbmcgdG8gYmUgcmV0dXJuZWQsIHNvIHdlIG5lZWQgdG8KLSAgICAgICAgICogYWN0dWFsbHkgY2FsY3VsYXRlIHRoZSBwcm9wZXIgbGVuZ3RoIHZhbHVlLgotICAgICAgICAgKi8KLSAgICAgICAgaWYoJGxlbmd0aCA9PT0gbnVsbCkgewotICAgICAgICAgICAgJGxlbmd0aCA9ICR0aGlzLT5zdHJsZW4oJHN0cikgLSAkc3RhcnQ7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbWJfc3Vic3RyKCRzdHIsICRzdGFydCwgJGxlbmd0aCwgJzhiaXQnKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gc3RybGVuKCRzdHIpIHsKLSAgICAgICAgcmV0dXJuIG1iX3N0cmxlbigkc3RyLCAnOGJpdCcpOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvU3RyaW5nRnVuYy9UU3RyaW5nRnVuYy5waHAgYi9saWIvcGhwL2xpYi9UaHJpZnQvU3RyaW5nRnVuYy9UU3RyaW5nRnVuYy5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1YmIzOTAuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9saWIvVGhyaWZ0L1N0cmluZ0Z1bmMvVFN0cmluZ0Z1bmMucGhwCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPD9waHAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLW5hbWVzcGFjZSBUaHJpZnRcU3RyaW5nRnVuYzsKLQotaW50ZXJmYWNlIFRTdHJpbmdGdW5jIHsKLSAgICBwdWJsaWMgZnVuY3Rpb24gc3Vic3RyKCRzdHIsICRzdGFydCwgJGxlbmd0aCA9IG51bGwpOwotICAgIHB1YmxpYyBmdW5jdGlvbiBzdHJsZW4oJHN0cik7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVGhyaWZ0L1RNdWx0aXBsZXhlZFByb2Nlc3Nvci5waHAgYi9saWIvcGhwL2xpYi9UaHJpZnQvVE11bHRpcGxleGVkUHJvY2Vzc29yLnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYyZTMyNS4uMDAwMDAwMAotLS0gYS9saWIvcGhwL2xpYi9UaHJpZnQvVE11bHRpcGxleGVkUHJvY2Vzc29yLnBocAorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi08P3BocAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQucHJvY2Vzc29yCi0gKi8KLQotbmFtZXNwYWNlIFRocmlmdDsKLQotdXNlIFRocmlmdFxFeGNlcHRpb25cVEV4Y2VwdGlvbjsKLXVzZSBUaHJpZnRcUHJvdG9jb2xcVFByb3RvY29sOwotdXNlIFRocmlmdFxQcm90b2NvbFxUTXVsdGlwbGV4ZWRQcm90b2NvbDsKLXVzZSBUaHJpZnRcUHJvdG9jb2xcVFByb3RvY29sRGVjb3JhdG9yOwotdXNlIFRocmlmdFxUeXBlXFRNZXNzYWdlVHlwZTsKLQotLyoqCi0gKiA8Y29kZT5UTXVsdGlwbGV4ZWRQcm9jZXNzb3I8L2NvZGU+IGlzIGEgUHJvY2Vzc29yIGFsbG93aW5nCi0gKiBhIHNpbmdsZSA8Y29kZT5UU2VydmVyPC9jb2RlPiB0byBwcm92aWRlIG11bHRpcGxlIHNlcnZpY2VzLgotICoKLSAqIDxwPlRvIGRvIHNvLCB5b3UgaW5zdGFudGlhdGUgdGhlIHByb2Nlc3NvciBhbmQgdGhlbiByZWdpc3RlciBhZGRpdGlvbmFsCi0gKiBwcm9jZXNzb3JzIHdpdGggaXQsIGFzIHNob3duIGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZTo8L3A+Ci0gKgotICogPGJsb2NrcXVvdGU+PGNvZGU+Ci0gKiAgICAgJHByb2Nlc3NvciA9IG5ldyBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IoKTsKLSAqCi0gKiAgICAgcHJvY2Vzc29yLT5yZWdpc3RlclByb2Nlc3NvcigKLSAqICAgICAgICAgIkNhbGN1bGF0b3IiLAotICogICAgICAgICBuZXcgXHR1dG9yaWFsXENhbGN1bGF0b3JQcm9jZXNzb3IobmV3IENhbGN1bGF0b3JIYW5kbGVyKCkpKTsKLSAqCi0gKiAgICAgcHJvY2Vzc29yLT5yZWdpc3RlclByb2Nlc3NvcigKLSAqICAgICAgICAgIldlYXRoZXJSZXBvcnQiLAotICogICAgICAgICBuZXcgXHR1dG9yaWFsXFdlYXRoZXJSZXBvcnRQcm9jZXNzb3IobmV3IFdlYXRoZXJSZXBvcnRIYW5kbGVyKCkpKTsKLSAqCi0gKiAgICAgJHByb2Nlc3Nvci0+cHJvY2VzcygkcHJvdG9jb2wsICRwcm90b2NvbCk7Ci0gKiA8L2NvZGU+PC9ibG9ja3F1b3RlPgotICovCi0KLWNsYXNzIFRNdWx0aXBsZXhlZFByb2Nlc3NvciB7Ci0gICAgcHJpdmF0ZSAkc2VydmljZVByb2Nlc3Nvck1hcF87Ci0KLSAgICAvKioKLSAgICAgKiAnUmVnaXN0ZXInIGEgc2VydmljZSB3aXRoIHRoaXMgPGNvZGU+VE11bHRpcGxleGVkUHJvY2Vzc29yPC9jb2RlPi4gIFRoaXMKLSAgICAgKiBhbGxvd3MgdXMgdG8gYnJva2VyIHJlcXVlc3RzIHRvIGluZGl2aWR1YWwgc2VydmljZXMgYnkgdXNpbmcgdGhlIHNlcnZpY2UKLSAgICAgKiBuYW1lIHRvIHNlbGVjdCB0aGVtIGF0IHJlcXVlc3QgdGltZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZXJ2aWNlTmFtZSBOYW1lIG9mIGEgc2VydmljZSwgaGFzIHRvIGJlIGlkZW50aWNhbCB0byB0aGUgbmFtZQotICAgICAqIGRlY2xhcmVkIGluIHRoZSBUaHJpZnQgSURMLCBlLmcuICJXZWF0aGVyUmVwb3J0Ii4KLSAgICAgKiBAcGFyYW0gcHJvY2Vzc29yIEltcGxlbWVudGF0aW9uIG9mIGEgc2VydmljZSwgdXN1c2FsbHkgcmVmZXJyZWQgdG8KLSAgICAgKiBhcyAiaGFuZGxlcnMiLCBlLmcuIFdlYXRoZXJSZXBvcnRIYW5kbGVyIGltcGxlbWVudGluZyBXZWF0aGVyUmVwb3J0LklmYWNlLgotICAgICAqLwotICAgIHB1YmxpYyBmdW5jdGlvbiByZWdpc3RlclByb2Nlc3Nvcigkc2VydmljZU5hbWUsICRwcm9jZXNzb3IpIHsKLSAgICAgICAgJHRoaXMtPnNlcnZpY2VQcm9jZXNzb3JNYXBfWyRzZXJ2aWNlTmFtZV0gPSAkcHJvY2Vzc29yOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgPGNvZGU+cHJvY2VzczwvY29kZT4gcGVyZm9ybXMgdGhlIGZvbGxvd2luZyBzdGVwczoKLSAgICAgKgotICAgICAqIDxvbD4KLSAgICAgKiAgICAgPGxpPlJlYWQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbWVzc2FnZS48L2xpPgotICAgICAqICAgICA8bGk+RXh0cmFjdCB0aGUgc2VydmljZSBuYW1lIGZyb20gdGhlIG1lc3NhZ2UuPC9saT4KLSAgICAgKiAgICAgPGxpPlVzaW5nIHRoZSBzZXJ2aWNlIG5hbWUgdG8gbG9jYXRlIHRoZSBhcHByb3ByaWF0ZSBwcm9jZXNzb3IuPC9saT4KLSAgICAgKiAgICAgPGxpPkRpc3BhdGNoIHRvIHRoZSBwcm9jZXNzb3IsIHdpdGggYSBkZWNvcmF0ZWQgaW5zdGFuY2Ugb2YgVFByb3RvY29sCi0gICAgICogICAgICAgICB0aGF0IGFsbG93cyByZWFkTWVzc2FnZUJlZ2luKCkgdG8gcmV0dXJuIHRoZSBvcmlnaW5hbCBNZXNzYWdlLjwvbGk+Ci0gICAgICogPC9vbD4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgVEV4Y2VwdGlvbiBJZiB0aGUgbWVzc2FnZSB0eXBlIGlzIG5vdCBDQUxMIG9yIE9ORVdBWSwgaWYKLSAgICAgKiB0aGUgc2VydmljZSBuYW1lIHdhcyBub3QgZm91bmQgaW4gdGhlIG1lc3NhZ2UsIG9yIGlmIHRoZSBzZXJ2aWNlCi0gICAgICogbmFtZSB3YXMgbm90IGZvdW5kIGluIHRoZSBzZXJ2aWNlIG1hcC4KLSAgICAgKi8KLSAgICBwdWJsaWMgZnVuY3Rpb24gcHJvY2VzcyhUUHJvdG9jb2wgJGlucHV0LCBUUHJvdG9jb2wgJG91dHB1dCkgewotICAgICAgICAvKgotICAgICAgICAgICAgVXNlIHRoZSBhY3R1YWwgdW5kZXJseWluZyBwcm90b2NvbCAoZS5nLiBUQmluYXJ5UHJvdG9jb2wpIHRvIHJlYWQgdGhlCi0gICAgICAgICAgICBtZXNzYWdlIGhlYWRlci4gVGhpcyBwdWxscyB0aGUgbWVzc2FnZSAib2ZmIHRoZSB3aXJlIiwgd2hpY2ggd2UnbGwKLSAgICAgICAgICAgIGRlYWwgd2l0aCBhdCB0aGUgZW5kIG9mIHRoaXMgbWV0aG9kLgotICAgICAgICAqLwotICAgICAgICAkaW5wdXQtPnJlYWRNZXNzYWdlQmVnaW4oJGZuYW1lLCAkbXR5cGUsICRyc2VxaWQpOwotCi0gICAgICAgIGlmICgkbXR5cGUgIT09IFRNZXNzYWdlVHlwZTo6Q0FMTCAmJiAkbXR5cGUgIT0gVE1lc3NhZ2VUeXBlOjpPTkVXQVkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJUaGlzIHNob3VsZCBub3QgaGF2ZSBoYXBwZW5lZCE/Iik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBFeHRyYWN0IHRoZSBzZXJ2aWNlIG5hbWUgYW5kIHRoZSBuZXcgTWVzc2FnZSBuYW1lLgotICAgICAgICBpZiAoc3RycG9zKCRmbmFtZSwgVE11bHRpcGxleGVkUHJvdG9jb2w6OlNFUEFSQVRPUikgPT09IGZhbHNlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiU2VydmljZSBuYW1lIG5vdCBmb3VuZCBpbiBtZXNzYWdlIG5hbWU6IHskZm5hbWV9LiBEaWQgeW91ICIgLgotICAgICAgICAgICAgICAgICJmb3JnZXQgdG8gdXNlIGEgVE11bHRpcGxleFByb3RvY29sIGluIHlvdXIgY2xpZW50PyIpOwotICAgICAgICB9Ci0gICAgICAgIGxpc3QoJHNlcnZpY2VOYW1lLCAkbWVzc2FnZU5hbWUpID0gZXhwbG9kZSgnOicsICRmbmFtZSwgMik7Ci0gICAgICAgIGlmICghYXJyYXlfa2V5X2V4aXN0cygkc2VydmljZU5hbWUsICR0aGlzLT5zZXJ2aWNlUHJvY2Vzc29yTWFwXykpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJTZXJ2aWNlIG5hbWUgbm90IGZvdW5kOiB7JHNlcnZpY2VOYW1lfS4gIERpZCB5b3UgZm9yZ2V0ICIgLgotICAgICAgICAgICAgICAgICJ0byBjYWxsIHJlZ2lzdGVyUHJvY2Vzc29yKCk/Iik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBEaXNwYXRjaCBwcm9jZXNzaW5nIHRvIHRoZSBzdG9yZWQgcHJvY2Vzc29yCi0gICAgICAgICRwcm9jZXNzb3IgPSAkdGhpcy0+c2VydmljZVByb2Nlc3Nvck1hcF9bJHNlcnZpY2VOYW1lXTsKLSAgICAgICAgcmV0dXJuICRwcm9jZXNzb3ItPnByb2Nlc3MoCi0gICAgICAgICAgICBuZXcgU3RvcmVkTWVzc2FnZVByb3RvY29sKCRpbnB1dCwgJG1lc3NhZ2VOYW1lLCAkbXR5cGUsICRyc2VxaWQpLCAkb3V0cHV0Ci0gICAgICAgICk7Ci0gICAgfQotfQotCi0vKioKLSAqICBPdXIgZ29hbCB3YXMgdG8gd29yayB3aXRoIGFueSBwcm90b2NvbC4gSW4gb3JkZXIgdG8gZG8gdGhhdCwgd2UgbmVlZGVkCi0gKiAgdG8gYWxsb3cgdGhlbSB0byBjYWxsIHJlYWRNZXNzYWdlQmVnaW4oKSBhbmQgZ2V0IHRoZSBNZXNzYWdlIGluIGV4YWN0bHkKLSAqICB0aGUgc3RhbmRhcmQgZm9ybWF0LCB3aXRob3V0IHRoZSBzZXJ2aWNlIG5hbWUgcHJlcGVuZGVkIHRvIHRoZSBNZXNzYWdlIG5hbWUuCi0gKi8KLWNsYXNzIFN0b3JlZE1lc3NhZ2VQcm90b2NvbCBleHRlbmRzIFRQcm90b2NvbERlY29yYXRvciB7Ci0gICAgcHJpdmF0ZSAkZm5hbWVfLCAkbXR5cGVfLCAkcnNlcWlkXzsKLQotICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChUUHJvdG9jb2wgJHByb3RvY29sLCAkZm5hbWUsICRtdHlwZSwgJHJzZXFpZCkgewotICAgICAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCRwcm90b2NvbCk7Ci0gICAgICAgICR0aGlzLT5mbmFtZV8gID0gJGZuYW1lOwotICAgICAgICAkdGhpcy0+bXR5cGVfICA9ICRtdHlwZTsKLSAgICAgICAgJHRoaXMtPnJzZXFpZF8gPSAkcnNlcWlkOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWVzc2FnZUJlZ2luKCYkbmFtZSwgJiR0eXBlLCAmJHNlcWlkKSB7Ci0gICAgICAgICRuYW1lICA9ICR0aGlzLT5mbmFtZV87Ci0gICAgICAgICR0eXBlICA9ICR0aGlzLT5tdHlwZV87Ci0gICAgICAgICRzZXFpZCA9ICR0aGlzLT5yc2VxaWRfOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RocmlmdC9UcmFuc3BvcnQvVEJ1ZmZlcmVkVHJhbnNwb3J0LnBocCBiL2xpYi9waHAvbGliL1RocmlmdC9UcmFuc3BvcnQvVEJ1ZmZlcmVkVHJhbnNwb3J0LnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjcwYzAwNC4uMDAwMDAwMAotLS0gYS9saWIvcGhwL2xpYi9UaHJpZnQvVHJhbnNwb3J0L1RCdWZmZXJlZFRyYW5zcG9ydC5waHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotPD9waHAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAotICovCi0KLW5hbWVzcGFjZSBUaHJpZnRcVHJhbnNwb3J0OwotCi11c2UgVGhyaWZ0XFRyYW5zcG9ydFxUVHJhbnNwb3J0OwotdXNlIFRocmlmdFxGYWN0b3J5XFRTdHJpbmdGdW5jRmFjdG9yeTsKLQotLyoqCi0gKiBCdWZmZXJlZCB0cmFuc3BvcnQuIFN0b3JlcyBkYXRhIHRvIGFuIGludGVybmFsIGJ1ZmZlciB0aGF0IGl0IGRvZXNuJ3QKLSAqIGFjdHVhbGx5IHdyaXRlIG91dCB1bnRpbCBmbHVzaCBpcyBjYWxsZWQuIEZvciByZWFkaW5nLCB3ZSBkbyBhIGdyZWVkeQotICogcmVhZCBhbmQgdGhlbiBzZXJ2ZSBkYXRhIG91dCBvZiB0aGUgaW50ZXJuYWwgYnVmZmVyLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKLSAqLwotY2xhc3MgVEJ1ZmZlcmVkVHJhbnNwb3J0IGV4dGVuZHMgVFRyYW5zcG9ydCB7Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLiBDcmVhdGVzIGEgYnVmZmVyZWQgdHJhbnNwb3J0IGFyb3VuZCBhbiB1bmRlcmx5aW5nIHRyYW5zcG9ydAotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCR0cmFuc3BvcnQ9bnVsbCwgJHJCdWZTaXplPTUxMiwgJHdCdWZTaXplPTUxMikgewotICAgICR0aGlzLT50cmFuc3BvcnRfID0gJHRyYW5zcG9ydDsKLSAgICAkdGhpcy0+ckJ1ZlNpemVfID0gJHJCdWZTaXplOwotICAgICR0aGlzLT53QnVmU2l6ZV8gPSAkd0J1ZlNpemU7Ci0gIH0KLQotICAvKioKLSAgICogVGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0Ci0gICAqCi0gICAqIEB2YXIgVFRyYW5zcG9ydAotICAgKi8KLSAgcHJvdGVjdGVkICR0cmFuc3BvcnRfID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIHJlY2VpdmUgYnVmZmVyIHNpemUKLSAgICoKLSAgICogQHZhciBpbnQKLSAgICovCi0gIHByb3RlY3RlZCAkckJ1ZlNpemVfID0gNTEyOwotCi0gIC8qKgotICAgKiBUaGUgd3JpdGUgYnVmZmVyIHNpemUKLSAgICoKLSAgICogQHZhciBpbnQKLSAgICovCi0gIHByb3RlY3RlZCAkd0J1ZlNpemVfID0gNTEyOwotCi0gIC8qKgotICAgKiBUaGUgd3JpdGUgYnVmZmVyLgotICAgKgotICAgKiBAdmFyIHN0cmluZwotICAgKi8KLSAgcHJvdGVjdGVkICR3QnVmXyA9ICcnOwotCi0gIC8qKgotICAgKiBUaGUgcmVhZCBidWZmZXIuCi0gICAqCi0gICAqIEB2YXIgc3RyaW5nCi0gICAqLwotICBwcm90ZWN0ZWQgJHJCdWZfID0gJyc7Ci0KLSAgcHVibGljIGZ1bmN0aW9uIGlzT3BlbigpIHsKLSAgICByZXR1cm4gJHRoaXMtPnRyYW5zcG9ydF8tPmlzT3BlbigpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIG9wZW4oKSB7Ci0gICAgJHRoaXMtPnRyYW5zcG9ydF8tPm9wZW4oKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiBjbG9zZSgpIHsKLSAgICAkdGhpcy0+dHJhbnNwb3J0Xy0+Y2xvc2UoKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiBwdXRCYWNrKCRkYXRhKSB7Ci0gICAgaWYgKFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkdGhpcy0+ckJ1Zl8pID09PSAwKSB7Ci0gICAgICAkdGhpcy0+ckJ1Zl8gPSAkZGF0YTsKLSAgICB9IGVsc2UgewotICAgICAgJHRoaXMtPnJCdWZfID0gKCRkYXRhIC4gJHRoaXMtPnJCdWZfKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogVGhlIHJlYXNvbiB0aGF0IHdlIGN1c3RvbWl6ZSByZWFkQWxsIGhlcmUgaXMgdGhhdCB0aGUgbWFqb3JpdHkgb2YgUEhQCi0gICAqIHN0cmVhbXMgYXJlIGFscmVhZHkgaW50ZXJuYWxseSBidWZmZXJlZCBieSBQSFAuIFRoZSBzb2NrZXQgc3RyZWFtLCBmb3IKLSAgICogZXhhbXBsZSwgYnVmZmVycyBpbnRlcm5hbGx5IGFuZCBibG9ja3MgaWYgeW91IGNhbGwgcmVhZCB3aXRoICRsZW4gZ3JlYXRlcgotICAgKiB0aGFuIHRoZSBhbW91bnQgb2YgZGF0YSBhdmFpbGFibGUsIHVubGlrZSByZWN2KCkgaW4gQy4KLSAgICoKLSAgICogVGhlcmVmb3JlLCB1c2UgdGhlIHJlYWRBbGwgbWV0aG9kIG9mIHRoZSB3cmFwcGVkIHRyYW5zcG9ydCBpbnNpZGUKLSAgICogdGhlIGJ1ZmZlcmVkIHJlYWRBbGwuCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gcmVhZEFsbCgkbGVuKSB7Ci0gICAgJGhhdmUgPSBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHRoaXMtPnJCdWZfKTsKLSAgICBpZiAoJGhhdmUgPT0gMCkgewotICAgICAgJGRhdGEgPSAkdGhpcy0+dHJhbnNwb3J0Xy0+cmVhZEFsbCgkbGVuKTsKLSAgICB9IGVsc2UgaWYgKCRoYXZlIDwgJGxlbikgewotICAgICAgJGRhdGEgPSAkdGhpcy0+ckJ1Zl87Ci0gICAgICAkdGhpcy0+ckJ1Zl8gPSAnJzsKLSAgICAgICRkYXRhIC49ICR0aGlzLT50cmFuc3BvcnRfLT5yZWFkQWxsKCRsZW4gLSAkaGF2ZSk7Ci0gICAgfSBlbHNlIGlmICgkaGF2ZSA9PSAkbGVuKSB7Ci0gICAgICAkZGF0YSA9ICR0aGlzLT5yQnVmXzsKLSAgICAgICR0aGlzLT5yQnVmXyA9ICcnOwotICAgIH0gZWxzZSBpZiAoJGhhdmUgPiAkbGVuKSB7Ci0gICAgICAkZGF0YSA9IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN1YnN0cigkdGhpcy0+ckJ1Zl8sIDAsICRsZW4pOwotICAgICAgJHRoaXMtPnJCdWZfID0gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3Vic3RyKCR0aGlzLT5yQnVmXywgJGxlbik7Ci0gICAgfQotICAgIHJldHVybiAkZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkKCRsZW4pIHsKLSAgICBpZiAoVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCR0aGlzLT5yQnVmXykgPT09IDApIHsKLSAgICAgICR0aGlzLT5yQnVmXyA9ICR0aGlzLT50cmFuc3BvcnRfLT5yZWFkKCR0aGlzLT5yQnVmU2l6ZV8pOwotICAgIH0KLQotICAgIGlmIChUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHRoaXMtPnJCdWZfKSA8PSAkbGVuKSB7Ci0gICAgICAkcmV0ID0gJHRoaXMtPnJCdWZfOwotICAgICAgJHRoaXMtPnJCdWZfID0gJyc7Ci0gICAgICByZXR1cm4gJHJldDsKLSAgICB9Ci0KLSAgICAkcmV0ID0gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3Vic3RyKCR0aGlzLT5yQnVmXywgMCwgJGxlbik7Ci0gICAgJHRoaXMtPnJCdWZfID0gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3Vic3RyKCR0aGlzLT5yQnVmXywgJGxlbik7Ci0gICAgcmV0dXJuICRyZXQ7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJGJ1ZikgewotICAgICR0aGlzLT53QnVmXyAuPSAkYnVmOwotICAgIGlmIChUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHRoaXMtPndCdWZfKSA+PSAkdGhpcy0+d0J1ZlNpemVfKSB7Ci0gICAgICAkb3V0ID0gJHRoaXMtPndCdWZfOwotCi0gICAgICAvLyBOb3RlIHRoYXQgd2UgY2xlYXIgdGhlIGludGVybmFsIHdCdWZfIHByaW9yIHRvIHRoZSB1bmRlcmx5aW5nIHdyaXRlCi0gICAgICAvLyB0byBlbnN1cmUgd2UncmUgaW4gYSBzYW5lIHN0YXRlIChpLmUuIGludGVybmFsIGJ1ZmZlciBjbGVhbmVkKQotICAgICAgLy8gaWYgdGhlIHVuZGVybHlpbmcgd3JpdGUgdGhyb3dzIHVwIGFuIGV4Y2VwdGlvbgotICAgICAgJHRoaXMtPndCdWZfID0gJyc7Ci0gICAgICAkdGhpcy0+dHJhbnNwb3J0Xy0+d3JpdGUoJG91dCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIGZsdXNoKCkgewotICAgIGlmIChUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHRoaXMtPndCdWZfKSA+IDApIHsKLSAgICAgICRvdXQgPSAkdGhpcy0+d0J1Zl87Ci0KLSAgICAgIC8vIE5vdGUgdGhhdCB3ZSBjbGVhciB0aGUgaW50ZXJuYWwgd0J1Zl8gcHJpb3IgdG8gdGhlIHVuZGVybHlpbmcgd3JpdGUKLSAgICAgIC8vIHRvIGVuc3VyZSB3ZSdyZSBpbiBhIHNhbmUgc3RhdGUgKGkuZS4gaW50ZXJuYWwgYnVmZmVyIGNsZWFuZWQpCi0gICAgICAvLyBpZiB0aGUgdW5kZXJseWluZyB3cml0ZSB0aHJvd3MgdXAgYW4gZXhjZXB0aW9uCi0gICAgICAkdGhpcy0+d0J1Zl8gPSAnJzsKLSAgICAgICR0aGlzLT50cmFuc3BvcnRfLT53cml0ZSgkb3V0KTsKLSAgICB9Ci0gICAgJHRoaXMtPnRyYW5zcG9ydF8tPmZsdXNoKCk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVGhyaWZ0L1RyYW5zcG9ydC9UQ3VybENsaWVudC5waHAgYi9saWIvcGhwL2xpYi9UaHJpZnQvVHJhbnNwb3J0L1RDdXJsQ2xpZW50LnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVlZWZlMS4uMDAwMDAwMAotLS0gYS9saWIvcGhwL2xpYi9UaHJpZnQvVHJhbnNwb3J0L1RDdXJsQ2xpZW50LnBocAorKysgL2Rldi9udWxsCkBAIC0xLDIyMiArMCwwIEBACi08P3BocAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0Ci0gKi8KLQotbmFtZXNwYWNlIFRocmlmdFxUcmFuc3BvcnQ7Ci0KLXVzZSBUaHJpZnRcVHJhbnNwb3J0XFRUcmFuc3BvcnQ7Ci11c2UgVGhyaWZ0XEV4Y2VwdGlvblxUVHJhbnNwb3J0RXhjZXB0aW9uOwotdXNlIFRocmlmdFxGYWN0b3J5XFRTdHJpbmdGdW5jRmFjdG9yeTsKLQotLyoqCi0gKiBIVFRQIGNsaWVudCBmb3IgVGhyaWZ0Ci0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAotICovCi1jbGFzcyBUQ3VybENsaWVudCBleHRlbmRzIFRUcmFuc3BvcnQgewotCi0gIHByaXZhdGUgc3RhdGljICRjdXJsSGFuZGxlOwotCi0gIC8qKgotICAgKiBUaGUgaG9zdCB0byBjb25uZWN0IHRvCi0gICAqCi0gICAqIEB2YXIgc3RyaW5nCi0gICAqLwotICBwcm90ZWN0ZWQgJGhvc3RfOwotCi0gIC8qKgotICAgKiBUaGUgcG9ydCB0byBjb25uZWN0IG9uCi0gICAqCi0gICAqIEB2YXIgaW50Ci0gICAqLwotICBwcm90ZWN0ZWQgJHBvcnRfOwotCi0gIC8qKgotICAgKiBUaGUgVVJJIHRvIHJlcXVlc3QKLSAgICoKLSAgICogQHZhciBzdHJpbmcKLSAgICovCi0gIHByb3RlY3RlZCAkdXJpXzsKLQotICAvKioKLSAgICogVGhlIHNjaGVtZSB0byB1c2UgZm9yIHRoZSByZXF1ZXN0LCBpLmUuIGh0dHAsIGh0dHBzCi0gICAqCi0gICAqIEB2YXIgc3RyaW5nCi0gICAqLwotICBwcm90ZWN0ZWQgJHNjaGVtZV87Ci0KLSAgLyoqCi0gICAqIEJ1ZmZlciBmb3IgdGhlIEhUVFAgcmVxdWVzdCBkYXRhCi0gICAqCi0gICAqIEB2YXIgc3RyaW5nCi0gICAqLwotICBwcm90ZWN0ZWQgJHJlcXVlc3RfOwotCi0gIC8qKgotICAgKiBCdWZmZXIgZm9yIHRoZSBIVFRQIHJlc3BvbnNlIGRhdGEuCi0gICAqCi0gICAqIEB2YXIgYmluYXJ5IHN0cmluZwotICAgKi8KLSAgcHJvdGVjdGVkICRyZXNwb25zZV87Ci0KLSAgLyoqCi0gICAqIFJlYWQgdGltZW91dAotICAgKgotICAgKiBAdmFyIGZsb2F0Ci0gICAqLwotICBwcm90ZWN0ZWQgJHRpbWVvdXRfOwotCi0gIC8qKgotICAgKiBNYWtlIGEgbmV3IEhUVFAgY2xpZW50LgotICAgKgotICAgKiBAcGFyYW0gc3RyaW5nICRob3N0Ci0gICAqIEBwYXJhbSBpbnQgICAgJHBvcnQKLSAgICogQHBhcmFtIHN0cmluZyAkdXJpCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGhvc3QsICRwb3J0PTgwLCAkdXJpPScnLCAkc2NoZW1lID0gJ2h0dHAnKSB7Ci0gICAgaWYgKChUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHVyaSkgPiAwKSAmJiAoJHVyaXswfSAhPSAnLycpKSB7Ci0gICAgICAkdXJpID0gJy8nLiR1cmk7Ci0gICAgfQotICAgICR0aGlzLT5zY2hlbWVfID0gJHNjaGVtZTsKLSAgICAkdGhpcy0+aG9zdF8gPSAkaG9zdDsKLSAgICAkdGhpcy0+cG9ydF8gPSAkcG9ydDsKLSAgICAkdGhpcy0+dXJpXyA9ICR1cmk7Ci0gICAgJHRoaXMtPnJlcXVlc3RfID0gJyc7Ci0gICAgJHRoaXMtPnJlc3BvbnNlXyA9IG51bGw7Ci0gICAgJHRoaXMtPnRpbWVvdXRfID0gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgcmVhZCB0aW1lb3V0Ci0gICAqCi0gICAqIEBwYXJhbSBmbG9hdCAkdGltZW91dAotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIHNldFRpbWVvdXRTZWNzKCR0aW1lb3V0KSB7Ci0gICAgJHRoaXMtPnRpbWVvdXRfID0gJHRpbWVvdXQ7Ci0gIH0KLQotICAvKioKLSAgICogV2hldGhlciB0aGlzIHRyYW5zcG9ydCBpcyBvcGVuLgotICAgKgotICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiBvcGVuCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gaXNPcGVuKCkgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLyoqCi0gICAqIE9wZW4gdGhlIHRyYW5zcG9ydCBmb3IgcmVhZGluZy93cml0aW5nCi0gICAqCi0gICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBjYW5ub3Qgb3BlbgotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIG9wZW4oKSB7Ci0gIH0KLQotICAvKioKLSAgICogQ2xvc2UgdGhlIHRyYW5zcG9ydC4KLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBjbG9zZSgpIHsKLSAgICAkdGhpcy0+cmVxdWVzdF8gPSAnJzsKLSAgICAkdGhpcy0+cmVzcG9uc2VfID0gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZWFkIHNvbWUgZGF0YSBpbnRvIHRoZSBhcnJheS4KLSAgICoKLSAgICogQHBhcmFtIGludCAgICAkbGVuIEhvdyBtdWNoIHRvIHJlYWQKLSAgICogQHJldHVybiBzdHJpbmcgVGhlIGRhdGEgdGhhdCBoYXMgYmVlbiByZWFkCi0gICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBjYW5ub3QgcmVhZCBhbnkgbW9yZSBkYXRhCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gcmVhZCgkbGVuKSB7Ci0gICAgaWYgKCRsZW4gPj0gc3RybGVuKCR0aGlzLT5yZXNwb25zZV8pKSB7Ci0gICAgICByZXR1cm4gJHRoaXMtPnJlc3BvbnNlXzsKLSAgICB9IGVsc2UgewotICAgICAgJHJldCA9IHN1YnN0cigkdGhpcy0+cmVzcG9uc2VfLCAwLCAkbGVuKTsKLSAgICAgICR0aGlzLT5yZXNwb25zZV8gPSBzdWJzdHIoJHRoaXMtPnJlc3BvbnNlXywgJGxlbik7Ci0gICAgICByZXR1cm4gJHJldDsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogV3JpdGVzIHNvbWUgZGF0YSBpbnRvIHRoZSBwZW5kaW5nIGJ1ZmZlcgotICAgKgotICAgKiBAcGFyYW0gc3RyaW5nICRidWYgIFRoZSBkYXRhIHRvIHdyaXRlCi0gICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiB3cml0aW5nIGZhaWxzCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJGJ1ZikgewotICAgICR0aGlzLT5yZXF1ZXN0XyAuPSAkYnVmOwotICB9Ci0KLSAgLyoqCi0gICAqIE9wZW5zIGFuZCBzZW5kcyB0aGUgYWN0dWFsIHJlcXVlc3Qgb3ZlciB0aGUgSFRUUCBjb25uZWN0aW9uCi0gICAqCi0gICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBhIHdyaXRpbmcgZXJyb3Igb2NjdXJzCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gZmx1c2goKSB7Ci0gICAgaWYgKCFzZWxmOjokY3VybEhhbmRsZSkgewotICAgICAgcmVnaXN0ZXJfc2h1dGRvd25fZnVuY3Rpb24oYXJyYXkoJ1RocmlmdFxcVHJhbnNwb3J0XFxUQ3VybENsaWVudCcsICdjbG9zZUN1cmxIYW5kbGUnKSk7Ci0gICAgICBzZWxmOjokY3VybEhhbmRsZSA9IGN1cmxfaW5pdCgpOwotICAgICAgY3VybF9zZXRvcHQoc2VsZjo6JGN1cmxIYW5kbGUsIENVUkxPUFRfUkVUVVJOVFJBTlNGRVIsIHRydWUpOwotICAgICAgY3VybF9zZXRvcHQoc2VsZjo6JGN1cmxIYW5kbGUsIENVUkxPUFRfQklOQVJZVFJBTlNGRVIsIHRydWUpOwotICAgICAgY3VybF9zZXRvcHQoc2VsZjo6JGN1cmxIYW5kbGUsIENVUkxPUFRfVVNFUkFHRU5ULCAnUEhQL1RDdXJsQ2xpZW50Jyk7Ci0gICAgICBjdXJsX3NldG9wdChzZWxmOjokY3VybEhhbmRsZSwgQ1VSTE9QVF9DVVNUT01SRVFVRVNULCAnUE9TVCcpOwotICAgICAgY3VybF9zZXRvcHQoc2VsZjo6JGN1cmxIYW5kbGUsIENVUkxPUFRfRk9MTE9XTE9DQVRJT04sIHRydWUpOwotICAgICAgY3VybF9zZXRvcHQoc2VsZjo6JGN1cmxIYW5kbGUsIENVUkxPUFRfTUFYUkVESVJTLCAxKTsKLSAgICB9Ci0gICAgLy8gR29kLCBQSFAgcmVhbGx5IGhhcyBzb21lIGVzb3RlcmljIHdheXMgb2YgZG9pbmcgc2ltcGxlIHRoaW5ncy4KLSAgICAkaG9zdCA9ICR0aGlzLT5ob3N0Xy4oJHRoaXMtPnBvcnRfICE9IDgwID8gJzonLiR0aGlzLT5wb3J0XyA6ICcnKTsKLSAgICAkZnVsbFVybCA9ICR0aGlzLT5zY2hlbWVfLiI6Ly8iLiRob3N0LiR0aGlzLT51cmlfOwotCi0gICAgJGhlYWRlcnMgPSBhcnJheSgnQWNjZXB0OiBhcHBsaWNhdGlvbi94LXRocmlmdCcsCi0gICAgICAgICAgICAgICAgICAgICAnQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LXRocmlmdCcsCi0gICAgICAgICAgICAgICAgICAgICAnQ29udGVudC1MZW5ndGg6ICcuVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCR0aGlzLT5yZXF1ZXN0XykpOwotICAgIGN1cmxfc2V0b3B0KHNlbGY6OiRjdXJsSGFuZGxlLCBDVVJMT1BUX0hUVFBIRUFERVIsICRoZWFkZXJzKTsKLQotICAgIGlmICgkdGhpcy0+dGltZW91dF8gPiAwKSB7Ci0gICAgICBjdXJsX3NldG9wdChzZWxmOjokY3VybEhhbmRsZSwgQ1VSTE9QVF9USU1FT1VULCAkdGhpcy0+dGltZW91dF8pOwotICAgIH0KLSAgICBjdXJsX3NldG9wdChzZWxmOjokY3VybEhhbmRsZSwgQ1VSTE9QVF9QT1NURklFTERTLCAkdGhpcy0+cmVxdWVzdF8pOwotICAgICR0aGlzLT5yZXF1ZXN0XyA9ICcnOwotCi0gICAgY3VybF9zZXRvcHQoc2VsZjo6JGN1cmxIYW5kbGUsIENVUkxPUFRfVVJMLCAkZnVsbFVybCk7Ci0gICAgJHRoaXMtPnJlc3BvbnNlXyA9IGN1cmxfZXhlYyhzZWxmOjokY3VybEhhbmRsZSk7Ci0KLSAgICAvLyBDb25uZWN0IGZhaWxlZD8KLSAgICBpZiAoISR0aGlzLT5yZXNwb25zZV8pIHsKLSAgICAgIGN1cmxfY2xvc2Uoc2VsZjo6JGN1cmxIYW5kbGUpOwotICAgICAgc2VsZjo6JGN1cmxIYW5kbGUgPSBudWxsOwotICAgICAgJGVycm9yID0gJ1RDdXJsQ2xpZW50OiBDb3VsZCBub3QgY29ubmVjdCB0byAnLiRmdWxsVXJsOwotICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJGVycm9yLCBUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTik7Ci0gICAgfQotICB9Ci0KLSAgc3RhdGljIGZ1bmN0aW9uIGNsb3NlQ3VybEhhbmRsZSgpIHsKLSAgICB0cnkgewotICAgICAgaWYgKHNlbGY6OiRjdXJsSGFuZGxlKSB7Ci0gICAgICAgIGN1cmxfY2xvc2Uoc2VsZjo6JGN1cmxIYW5kbGUpOwotICAgICAgICBzZWxmOjokY3VybEhhbmRsZSA9IG51bGw7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoXEV4Y2VwdGlvbiAkeCkgewotICAgICAgZXJyb3JfbG9nKCdUaGVyZSB3YXMgYW4gZXJyb3IgY2xvc2luZyB0aGUgY3VybCBoYW5kbGU6ICcgLiAkeC0+Z2V0TWVzc2FnZSgpKTsKLSAgICB9Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVGhyaWZ0L1RyYW5zcG9ydC9URnJhbWVkVHJhbnNwb3J0LnBocCBiL2xpYi9waHAvbGliL1RocmlmdC9UcmFuc3BvcnQvVEZyYW1lZFRyYW5zcG9ydC5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4MGQ1NDguLjAwMDAwMDAKLS0tIGEvbGliL3BocC9saWIvVGhyaWZ0L1RyYW5zcG9ydC9URnJhbWVkVHJhbnNwb3J0LnBocAorKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi08P3BocAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0Ci0gKi8KLQotbmFtZXNwYWNlIFRocmlmdFxUcmFuc3BvcnQ7Ci0KLXVzZSBUaHJpZnRcVHJhbnNwb3J0XFRUcmFuc3BvcnQ7Ci11c2UgVGhyaWZ0XEZhY3RvcnlcVFN0cmluZ0Z1bmNGYWN0b3J5OwotCi0vKioKLSAqIEZyYW1lZCB0cmFuc3BvcnQuIFdyaXRlcyBhbmQgcmVhZHMgZGF0YSBpbiBjaHVua3MgdGhhdCBhcmUgc3RhbXBlZCB3aXRoCi0gKiB0aGVpciBsZW5ndGguCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAotICovCi1jbGFzcyBURnJhbWVkVHJhbnNwb3J0IGV4dGVuZHMgVFRyYW5zcG9ydCB7Ci0KLSAgLyoqCi0gICAqIFVuZGVybHlpbmcgdHJhbnNwb3J0IG9iamVjdC4KLSAgICoKLSAgICogQHZhciBUVHJhbnNwb3J0Ci0gICAqLwotICBwcml2YXRlICR0cmFuc3BvcnRfOwotCi0gIC8qKgotICAgKiBCdWZmZXIgZm9yIHJlYWQgZGF0YS4KLSAgICoKLSAgICogQHZhciBzdHJpbmcKLSAgICovCi0gIHByaXZhdGUgJHJCdWZfOwotCi0gIC8qKgotICAgKiBCdWZmZXIgZm9yIHF1ZXVlZCBvdXRwdXQgZGF0YQotICAgKgotICAgKiBAdmFyIHN0cmluZwotICAgKi8KLSAgcHJpdmF0ZSAkd0J1Zl87Ci0KLSAgLyoqCi0gICAqIFdoZXRoZXIgdG8gZnJhbWUgcmVhZHMKLSAgICoKLSAgICogQHZhciBib29sCi0gICAqLwotICBwcml2YXRlICRyZWFkXzsKLQotICAvKioKLSAgICogV2hldGhlciB0byBmcmFtZSB3cml0ZXMKLSAgICoKLSAgICogQHZhciBib29sCi0gICAqLwotICBwcml2YXRlICR3cml0ZV87Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKgotICAgKiBAcGFyYW0gVFRyYW5zcG9ydCAkdHJhbnNwb3J0IFVuZGVybHlpbmcgdHJhbnNwb3J0Ci0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHRyYW5zcG9ydD1udWxsLCAkcmVhZD10cnVlLCAkd3JpdGU9dHJ1ZSkgewotICAgICR0aGlzLT50cmFuc3BvcnRfID0gJHRyYW5zcG9ydDsKLSAgICAkdGhpcy0+cmVhZF8gPSAkcmVhZDsKLSAgICAkdGhpcy0+d3JpdGVfID0gJHdyaXRlOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIGlzT3BlbigpIHsKLSAgICByZXR1cm4gJHRoaXMtPnRyYW5zcG9ydF8tPmlzT3BlbigpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIG9wZW4oKSB7Ci0gICAgJHRoaXMtPnRyYW5zcG9ydF8tPm9wZW4oKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiBjbG9zZSgpIHsKLSAgICAkdGhpcy0+dHJhbnNwb3J0Xy0+Y2xvc2UoKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZWFkcyBmcm9tIHRoZSBidWZmZXIuIFdoZW4gbW9yZSBkYXRhIGlzIHJlcXVpcmVkIHJlYWRzIGFub3RoZXIgZW50aXJlCi0gICAqIGNodW5rIGFuZCBzZXJ2ZXMgZnV0dXJlIHJlYWRzIG91dCBvZiB0aGF0LgotICAgKgotICAgKiBAcGFyYW0gaW50ICRsZW4gSG93IG11Y2ggZGF0YQotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWQoJGxlbikgewotICAgIGlmICghJHRoaXMtPnJlYWRfKSB7Ci0gICAgICByZXR1cm4gJHRoaXMtPnRyYW5zcG9ydF8tPnJlYWQoJGxlbik7Ci0gICAgfQotCi0gICAgaWYgKFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkdGhpcy0+ckJ1Zl8pID09PSAwKSB7Ci0gICAgICAkdGhpcy0+cmVhZEZyYW1lKCk7Ci0gICAgfQotCi0gICAgLy8gSnVzdCByZXR1cm4gZnVsbCBidWZmCi0gICAgaWYgKCRsZW4gPj0gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCR0aGlzLT5yQnVmXykpIHsKLSAgICAgICRvdXQgPSAkdGhpcy0+ckJ1Zl87Ci0gICAgICAkdGhpcy0+ckJ1Zl8gPSBudWxsOwotICAgICAgcmV0dXJuICRvdXQ7Ci0gICAgfQotCi0gICAgLy8gUmV0dXJuIFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN1YnN0cgotICAgICRvdXQgPSBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdWJzdHIoJHRoaXMtPnJCdWZfLCAwLCAkbGVuKTsKLSAgICAkdGhpcy0+ckJ1Zl8gPSBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdWJzdHIoJHRoaXMtPnJCdWZfLCAkbGVuKTsKLSAgICByZXR1cm4gJG91dDsKLSAgfQotCi0gIC8qKgotICAgKiBQdXQgcHJldmlvdXNseSByZWFkIGRhdGEgYmFjayBpbnRvIHRoZSBidWZmZXIKLSAgICoKLSAgICogQHBhcmFtIHN0cmluZyAkZGF0YSBkYXRhIHRvIHJldHVybgotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIHB1dEJhY2soJGRhdGEpIHsKLSAgICBpZiAoVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCR0aGlzLT5yQnVmXykgPT09IDApIHsKLSAgICAgICR0aGlzLT5yQnVmXyA9ICRkYXRhOwotICAgIH0gZWxzZSB7Ci0gICAgICAkdGhpcy0+ckJ1Zl8gPSAoJGRhdGEgLiAkdGhpcy0+ckJ1Zl8pOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBSZWFkcyBhIGNodW5rIG9mIGRhdGEgaW50byB0aGUgaW50ZXJuYWwgcmVhZCBidWZmZXIuCi0gICAqLwotICBwcml2YXRlIGZ1bmN0aW9uIHJlYWRGcmFtZSgpIHsKLSAgICAkYnVmID0gJHRoaXMtPnRyYW5zcG9ydF8tPnJlYWRBbGwoNCk7Ci0gICAgJHZhbCA9IHVucGFjaygnTicsICRidWYpOwotICAgICRzeiA9ICR2YWxbMV07Ci0KLSAgICAkdGhpcy0+ckJ1Zl8gPSAkdGhpcy0+dHJhbnNwb3J0Xy0+cmVhZEFsbCgkc3opOwotICB9Ci0KLSAgLyoqCi0gICAqIFdyaXRlcyBzb21lIGRhdGEgdG8gdGhlIHBlbmRpbmcgb3V0cHV0IGJ1ZmZlci4KLSAgICoKLSAgICogQHBhcmFtIHN0cmluZyAkYnVmIFRoZSBkYXRhCi0gICAqIEBwYXJhbSBpbnQgICAgJGxlbiBMaW1pdCBvZiBieXRlcyB0byB3cml0ZQotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlKCRidWYsICRsZW49bnVsbCkgewotICAgIGlmICghJHRoaXMtPndyaXRlXykgewotICAgICAgcmV0dXJuICR0aGlzLT50cmFuc3BvcnRfLT53cml0ZSgkYnVmLCAkbGVuKTsKLSAgICB9Ci0KLSAgICBpZiAoJGxlbiAhPT0gbnVsbCAmJiAkbGVuIDwgVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCRidWYpKSB7Ci0gICAgICAkYnVmID0gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3Vic3RyKCRidWYsIDAsICRsZW4pOwotICAgIH0KLSAgICAkdGhpcy0+d0J1Zl8gLj0gJGJ1ZjsKLSAgfQotCi0gIC8qKgotICAgKiBXcml0ZXMgdGhlIG91dHB1dCBidWZmZXIgdG8gdGhlIHN0cmVhbSBpbiB0aGUgZm9ybWF0IG9mIGEgNC1ieXRlIGxlbmd0aAotICAgKiBmb2xsb3dlZCBieSB0aGUgYWN0dWFsIGRhdGEuCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gZmx1c2goKSB7Ci0gICAgaWYgKCEkdGhpcy0+d3JpdGVfIHx8IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkdGhpcy0+d0J1Zl8pID09IDApIHsKLSAgICAgIHJldHVybiAkdGhpcy0+dHJhbnNwb3J0Xy0+Zmx1c2goKTsKLSAgICB9Ci0KLSAgICAkb3V0ID0gcGFjaygnTicsIFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkdGhpcy0+d0J1Zl8pKTsKLSAgICAkb3V0IC49ICR0aGlzLT53QnVmXzsKLQotICAgIC8vIE5vdGUgdGhhdCB3ZSBjbGVhciB0aGUgaW50ZXJuYWwgd0J1Zl8gcHJpb3IgdG8gdGhlIHVuZGVybHlpbmcgd3JpdGUKLSAgICAvLyB0byBlbnN1cmUgd2UncmUgaW4gYSBzYW5lIHN0YXRlIChpLmUuIGludGVybmFsIGJ1ZmZlciBjbGVhbmVkKQotICAgIC8vIGlmIHRoZSB1bmRlcmx5aW5nIHdyaXRlIHRocm93cyB1cCBhbiBleGNlcHRpb24KLSAgICAkdGhpcy0+d0J1Zl8gPSAnJzsKLSAgICAkdGhpcy0+dHJhbnNwb3J0Xy0+d3JpdGUoJG91dCk7Ci0gICAgJHRoaXMtPnRyYW5zcG9ydF8tPmZsdXNoKCk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVGhyaWZ0L1RyYW5zcG9ydC9USHR0cENsaWVudC5waHAgYi9saWIvcGhwL2xpYi9UaHJpZnQvVHJhbnNwb3J0L1RIdHRwQ2xpZW50LnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ2YjE4YS4uMDAwMDAwMAotLS0gYS9saWIvcGhwL2xpYi9UaHJpZnQvVHJhbnNwb3J0L1RIdHRwQ2xpZW50LnBocAorKysgL2Rldi9udWxsCkBAIC0xLDIyMSArMCwwIEBACi08P3BocAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0Ci0gKi8KLQotbmFtZXNwYWNlIFRocmlmdFxUcmFuc3BvcnQ7Ci0KLXVzZSBUaHJpZnRcVHJhbnNwb3J0XFRUcmFuc3BvcnQ7Ci11c2UgVGhyaWZ0XEV4Y2VwdGlvblxUVHJhbnNwb3J0RXhjZXB0aW9uOwotdXNlIFRocmlmdFxGYWN0b3J5XFRTdHJpbmdGdW5jRmFjdG9yeTsKLQotLyoqCi0gKiBIVFRQIGNsaWVudCBmb3IgVGhyaWZ0Ci0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAotICovCi1jbGFzcyBUSHR0cENsaWVudCBleHRlbmRzIFRUcmFuc3BvcnQgewotCi0gIC8qKgotICAgKiBUaGUgaG9zdCB0byBjb25uZWN0IHRvCi0gICAqCi0gICAqIEB2YXIgc3RyaW5nCi0gICAqLwotICBwcm90ZWN0ZWQgJGhvc3RfOwotCi0gIC8qKgotICAgKiBUaGUgcG9ydCB0byBjb25uZWN0IG9uCi0gICAqCi0gICAqIEB2YXIgaW50Ci0gICAqLwotICBwcm90ZWN0ZWQgJHBvcnRfOwotCi0gIC8qKgotICAgKiBUaGUgVVJJIHRvIHJlcXVlc3QKLSAgICoKLSAgICogQHZhciBzdHJpbmcKLSAgICovCi0gIHByb3RlY3RlZCAkdXJpXzsKLQotICAvKioKLSAgICogVGhlIHNjaGVtZSB0byB1c2UgZm9yIHRoZSByZXF1ZXN0LCBpLmUuIGh0dHAsIGh0dHBzCi0gICAqCi0gICAqIEB2YXIgc3RyaW5nCi0gICAqLwotICBwcm90ZWN0ZWQgJHNjaGVtZV87Ci0KLSAgLyoqCi0gICAqIEJ1ZmZlciBmb3IgdGhlIEhUVFAgcmVxdWVzdCBkYXRhCi0gICAqCi0gICAqIEB2YXIgc3RyaW5nCi0gICAqLwotICBwcm90ZWN0ZWQgJGJ1Zl87Ci0KLSAgLyoqCi0gICAqIElucHV0IHNvY2tldCBzdHJlYW0uCi0gICAqCi0gICAqIEB2YXIgcmVzb3VyY2UKLSAgICovCi0gIHByb3RlY3RlZCAkaGFuZGxlXzsKLQotICAvKioKLSAgICogUmVhZCB0aW1lb3V0Ci0gICAqCi0gICAqIEB2YXIgZmxvYXQKLSAgICovCi0gIHByb3RlY3RlZCAkdGltZW91dF87Ci0KLSAgLyoqCi0gICAqIGh0dHAgaGVhZGVycwotICAgKgotICAgKiBAdmFyIGFycmF5Ci0gICAqLwotICBwcm90ZWN0ZWQgJGhlYWRlcnNfOwotCi0gIC8qKgotICAgKiBNYWtlIGEgbmV3IEhUVFAgY2xpZW50LgotICAgKgotICAgKiBAcGFyYW0gc3RyaW5nICRob3N0Ci0gICAqIEBwYXJhbSBpbnQgICAgJHBvcnQKLSAgICogQHBhcmFtIHN0cmluZyAkdXJpCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGhvc3QsICRwb3J0PTgwLCAkdXJpPScnLCAkc2NoZW1lID0gJ2h0dHAnKSB7Ci0gICAgaWYgKChUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHVyaSkgPiAwKSAmJiAoJHVyaXswfSAhPSAnLycpKSB7Ci0gICAgICAkdXJpID0gJy8nLiR1cmk7Ci0gICAgfQotICAgICR0aGlzLT5zY2hlbWVfID0gJHNjaGVtZTsKLSAgICAkdGhpcy0+aG9zdF8gPSAkaG9zdDsKLSAgICAkdGhpcy0+cG9ydF8gPSAkcG9ydDsKLSAgICAkdGhpcy0+dXJpXyA9ICR1cmk7Ci0gICAgJHRoaXMtPmJ1Zl8gPSAnJzsKLSAgICAkdGhpcy0+aGFuZGxlXyA9IG51bGw7Ci0gICAgJHRoaXMtPnRpbWVvdXRfID0gbnVsbDsKLSAgICAkdGhpcy0+aGVhZGVyc18gPSBhcnJheSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCByZWFkIHRpbWVvdXQKLSAgICoKLSAgICogQHBhcmFtIGZsb2F0ICR0aW1lb3V0Ci0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gc2V0VGltZW91dFNlY3MoJHRpbWVvdXQpIHsKLSAgICAkdGhpcy0+dGltZW91dF8gPSAkdGltZW91dDsKLSAgfQotCi0gIC8qKgotICAgKiBXaGV0aGVyIHRoaXMgdHJhbnNwb3J0IGlzIG9wZW4uCi0gICAqCi0gICAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIGlmIG9wZW4KLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBpc09wZW4oKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKioKLSAgICogT3BlbiB0aGUgdHJhbnNwb3J0IGZvciByZWFkaW5nL3dyaXRpbmcKLSAgICoKLSAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIGNhbm5vdCBvcGVuCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gb3BlbigpIHt9Ci0KLSAgLyoqCi0gICAqIENsb3NlIHRoZSB0cmFuc3BvcnQuCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gY2xvc2UoKSB7Ci0gICAgaWYgKCR0aGlzLT5oYW5kbGVfKSB7Ci0gICAgICBAZmNsb3NlKCR0aGlzLT5oYW5kbGVfKTsKLSAgICAgICR0aGlzLT5oYW5kbGVfID0gbnVsbDsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmVhZCBzb21lIGRhdGEgaW50byB0aGUgYXJyYXkuCi0gICAqCi0gICAqIEBwYXJhbSBpbnQgICAgJGxlbiBIb3cgbXVjaCB0byByZWFkCi0gICAqIEByZXR1cm4gc3RyaW5nIFRoZSBkYXRhIHRoYXQgaGFzIGJlZW4gcmVhZAotICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgY2Fubm90IHJlYWQgYW55IG1vcmUgZGF0YQotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWQoJGxlbikgewotICAgICRkYXRhID0gQGZyZWFkKCR0aGlzLT5oYW5kbGVfLCAkbGVuKTsKLSAgICBpZiAoJGRhdGEgPT09IEZBTFNFIHx8ICRkYXRhID09PSAnJykgewotICAgICAgJG1kID0gc3RyZWFtX2dldF9tZXRhX2RhdGEoJHRoaXMtPmhhbmRsZV8pOwotICAgICAgaWYgKCRtZFsndGltZWRfb3V0J10pIHsKLSAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJ1RIdHRwQ2xpZW50OiB0aW1lZCBvdXQgcmVhZGluZyAnLiRsZW4uJyBieXRlcyBmcm9tICcuJHRoaXMtPmhvc3RfLic6Jy4kdGhpcy0+cG9ydF8uJHRoaXMtPnVyaV8sIFRUcmFuc3BvcnRFeGNlcHRpb246OlRJTUVEX09VVCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbignVEh0dHBDbGllbnQ6IENvdWxkIG5vdCByZWFkICcuJGxlbi4nIGJ5dGVzIGZyb20gJy4kdGhpcy0+aG9zdF8uJzonLiR0aGlzLT5wb3J0Xy4kdGhpcy0+dXJpXywgVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTik7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiAkZGF0YTsKLSAgfQotCi0gIC8qKgotICAgKiBXcml0ZXMgc29tZSBkYXRhIGludG8gdGhlIHBlbmRpbmcgYnVmZmVyCi0gICAqCi0gICAqIEBwYXJhbSBzdHJpbmcgJGJ1ZiAgVGhlIGRhdGEgdG8gd3JpdGUKLSAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIHdyaXRpbmcgZmFpbHMKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZSgkYnVmKSB7Ci0gICAgJHRoaXMtPmJ1Zl8gLj0gJGJ1ZjsKLSAgfQotCi0gIC8qKgotICAgKiBPcGVucyBhbmQgc2VuZHMgdGhlIGFjdHVhbCByZXF1ZXN0IG92ZXIgdGhlIEhUVFAgY29ubmVjdGlvbgotICAgKgotICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgYSB3cml0aW5nIGVycm9yIG9jY3VycwotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIGZsdXNoKCkgewotICAgIC8vIEdvZCwgUEhQIHJlYWxseSBoYXMgc29tZSBlc290ZXJpYyB3YXlzIG9mIGRvaW5nIHNpbXBsZSB0aGluZ3MuCi0gICAgJGhvc3QgPSAkdGhpcy0+aG9zdF8uKCR0aGlzLT5wb3J0XyAhPSA4MCA/ICc6Jy4kdGhpcy0+cG9ydF8gOiAnJyk7Ci0KLSAgICAkaGVhZGVycyA9IGFycmF5KCk7Ci0gICAgJGRlZmF1bHRIZWFkZXJzID0gYXJyYXkoJ0hvc3QnID0+ICRob3N0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICdBY2NlcHQnID0+ICdhcHBsaWNhdGlvbi94LXRocmlmdCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1VzZXItQWdlbnQnID0+ICdQSFAvVEh0dHBDbGllbnQnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGUnID0+ICdhcHBsaWNhdGlvbi94LXRocmlmdCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtTGVuZ3RoJyA9PiBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHRoaXMtPmJ1Zl8pKTsKLSAgICBmb3JlYWNoIChhcnJheV9tZXJnZSgkZGVmYXVsdEhlYWRlcnMsICR0aGlzLT5oZWFkZXJzXykgYXMgJGtleSA9PiAkdmFsdWUpIHsKLSAgICAgICAgJGhlYWRlcnNbXSA9ICIka2V5OiAkdmFsdWUiOwotICAgIH0KLQotICAgICRvcHRpb25zID0gYXJyYXkoJ21ldGhvZCcgPT4gJ1BPU1QnLAotICAgICAgICAgICAgICAgICAgICAgJ2hlYWRlcicgPT4gaW1wbG9kZSgiXHJcbiIsICRoZWFkZXJzKSwKLSAgICAgICAgICAgICAgICAgICAgICdtYXhfcmVkaXJlY3RzJyA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgJ2NvbnRlbnQnID0+ICR0aGlzLT5idWZfKTsKLSAgICBpZiAoJHRoaXMtPnRpbWVvdXRfID4gMCkgewotICAgICAgJG9wdGlvbnNbJ3RpbWVvdXQnXSA9ICR0aGlzLT50aW1lb3V0XzsKLSAgICB9Ci0gICAgJHRoaXMtPmJ1Zl8gPSAnJzsKLQotICAgICRjb250ZXh0aWQgPSBzdHJlYW1fY29udGV4dF9jcmVhdGUoYXJyYXkoJ2h0dHAnID0+ICRvcHRpb25zKSk7Ci0gICAgJHRoaXMtPmhhbmRsZV8gPSBAZm9wZW4oJHRoaXMtPnNjaGVtZV8uJzovLycuJGhvc3QuJHRoaXMtPnVyaV8sICdyJywgZmFsc2UsICRjb250ZXh0aWQpOwotCi0gICAgLy8gQ29ubmVjdCBmYWlsZWQ/Ci0gICAgaWYgKCR0aGlzLT5oYW5kbGVfID09PSBGQUxTRSkgewotICAgICAgJHRoaXMtPmhhbmRsZV8gPSBudWxsOwotICAgICAgJGVycm9yID0gJ1RIdHRwQ2xpZW50OiBDb3VsZCBub3QgY29ubmVjdCB0byAnLiRob3N0LiR0aGlzLT51cmlfOwotICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJGVycm9yLCBUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTik7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIGFkZEhlYWRlcnMoJGhlYWRlcnMpIHsKLSAgICAkdGhpcy0+aGVhZGVyc18gPSBhcnJheV9tZXJnZSgkdGhpcy0+aGVhZGVyc18sICRoZWFkZXJzKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvVHJhbnNwb3J0L1RNZW1vcnlCdWZmZXIucGhwIGIvbGliL3BocC9saWIvVGhyaWZ0L1RyYW5zcG9ydC9UTWVtb3J5QnVmZmVyLnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTExZmFiNi4uMDAwMDAwMAotLS0gYS9saWIvcGhwL2xpYi9UaHJpZnQvVHJhbnNwb3J0L1RNZW1vcnlCdWZmZXIucGhwCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotPD9waHAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAotICovCi0KLW5hbWVzcGFjZSBUaHJpZnRcVHJhbnNwb3J0OwotCi11c2UgVGhyaWZ0XFRyYW5zcG9ydFxUVHJhbnNwb3J0OwotdXNlIFRocmlmdFxFeGNlcHRpb25cVFRyYW5zcG9ydEV4Y2VwdGlvbjsKLXVzZSBUaHJpZnRcRmFjdG9yeVxUU3RyaW5nRnVuY0ZhY3Rvcnk7Ci0KLS8qKgotICogQSBtZW1vcnkgYnVmZmVyIGlzIGEgdHJhbnBzb3J0IHRoYXQgc2ltcGx5IHJlYWRzIGZyb20gYW5kIHdyaXRlcyB0byBhbgotICogaW4tbWVtb3J5IHN0cmluZyBidWZmZXIuIEFueXRpbWUgeW91IGNhbGwgd3JpdGUgb24gaXQsIHRoZSBkYXRhIGlzIHNpbXBseQotICogcGxhY2VkIGludG8gYSBidWZmZXIsIGFuZCBhbnl0aW1lIHlvdSBjYWxsIHJlYWQsIGRhdGEgaXMgcmVhZCBmcm9tIHRoYXQKLSAqIGJ1ZmZlci4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0Ci0gKi8KLWNsYXNzIFRNZW1vcnlCdWZmZXIgZXh0ZW5kcyBUVHJhbnNwb3J0IHsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IuIE9wdGlvbmFsbHkgcGFzcyBhbiBpbml0aWFsIHZhbHVlCi0gICAqIGZvciB0aGUgYnVmZmVyLgotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRidWYgPSAnJykgewotICAgICR0aGlzLT5idWZfID0gJGJ1ZjsKLSAgfQotCi0gIHByb3RlY3RlZCAkYnVmXyA9ICcnOwotCi0gIHB1YmxpYyBmdW5jdGlvbiBpc09wZW4oKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gb3BlbigpIHt9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIGNsb3NlKCkge30KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJGJ1ZikgewotICAgICR0aGlzLT5idWZfIC49ICRidWY7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZCgkbGVuKSB7Ci0gICAgJGJ1Zkxlbmd0aCA9IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkdGhpcy0+YnVmXyk7Ci0KLSAgICBpZiAoJGJ1Zkxlbmd0aCA9PT0gMCkgewotICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJ1RNZW1vcnlCdWZmZXI6IENvdWxkIG5vdCByZWFkICcgLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGxlbiAuICcgYnl0ZXMgZnJvbSBidWZmZXIuJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04pOwotICAgIH0KLQotICAgIGlmICgkYnVmTGVuZ3RoIDw9ICRsZW4pIHsKLSAgICAgICRyZXQgPSAkdGhpcy0+YnVmXzsKLSAgICAgICR0aGlzLT5idWZfID0gJyc7Ci0gICAgICByZXR1cm4gJHJldDsKLSAgICB9Ci0KLSAgICAkcmV0ID0gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3Vic3RyKCR0aGlzLT5idWZfLCAwLCAkbGVuKTsKLSAgICAkdGhpcy0+YnVmXyA9IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN1YnN0cigkdGhpcy0+YnVmXywgJGxlbik7Ci0KLSAgICByZXR1cm4gJHJldDsKLSAgfQotCi0gIGZ1bmN0aW9uIGdldEJ1ZmZlcigpIHsKLSAgICByZXR1cm4gJHRoaXMtPmJ1Zl87Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gYXZhaWxhYmxlKCkgewotICAgIHJldHVybiBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHRoaXMtPmJ1Zl8pOwotICB9Ci19CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvVHJhbnNwb3J0L1ROdWxsVHJhbnNwb3J0LnBocCBiL2xpYi9waHAvbGliL1RocmlmdC9UcmFuc3BvcnQvVE51bGxUcmFuc3BvcnQucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmYxMGVkLi4wMDAwMDAwCi0tLSBhL2xpYi9waHAvbGliL1RocmlmdC9UcmFuc3BvcnQvVE51bGxUcmFuc3BvcnQucGhwCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotPD9waHAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAotICovCi0KLW5hbWVzcGFjZSBUaHJpZnRcVHJhbnNwb3J0OwotCi11c2UgVGhyaWZ0XFRyYW5zcG9ydFxUVHJhbnNwb3J0OwotdXNlIFRocmlmdFxFeGNlcHRpb25cVFRyYW5zcG9ydEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBUcmFuc3BvcnQgdGhhdCBvbmx5IGFjY2VwdHMgd3JpdGVzIGFuZCBpZ25vcmVzIHRoZW0uCi0gKiBUaGlzIGlzIHVzZWZ1bCBmb3IgbWVhc3VyaW5nIHRoZSBzZXJpYWxpemVkIHNpemUgb2Ygc3RydWN0dXJlcy4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0Ci0gKi8KLWNsYXNzIFROdWxsVHJhbnNwb3J0IGV4dGVuZHMgVFRyYW5zcG9ydCB7Ci0KLSAgcHVibGljIGZ1bmN0aW9uIGlzT3BlbigpIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiBvcGVuKCkge30KLQotICBwdWJsaWMgZnVuY3Rpb24gY2xvc2UoKSB7fQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkKCRsZW4pIHsKLSAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQ2FuJ3QgcmVhZCBmcm9tIFROdWxsVHJhbnNwb3J0LiIpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlKCRidWYpIHt9Ci0KLX0KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RocmlmdC9UcmFuc3BvcnQvVFBocFN0cmVhbS5waHAgYi9saWIvcGhwL2xpYi9UaHJpZnQvVHJhbnNwb3J0L1RQaHBTdHJlYW0ucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTFkMGNmLi4wMDAwMDAwCi0tLSBhL2xpYi9waHAvbGliL1RocmlmdC9UcmFuc3BvcnQvVFBocFN0cmVhbS5waHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotPD9waHAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAotICovCi0KLW5hbWVzcGFjZSBUaHJpZnRcVHJhbnNwb3J0OwotCi11c2UgVGhyaWZ0XFRyYW5zcG9ydFxUVHJhbnNwb3J0OwotdXNlIFRocmlmdFxFeGNlcHRpb25cVEV4Y2VwdGlvbjsKLXVzZSBUaHJpZnRcRmFjdG9yeVxUU3RyaW5nRnVuY0ZhY3Rvcnk7Ci0KLS8qKgotICogUGhwIHN0cmVhbSB0cmFuc3BvcnQuIFJlYWRzIHRvIGFuZCB3cml0ZXMgZnJvbSB0aGUgcGhwIHN0YW5kYXJkIHN0cmVhbXMKLSAqIHBocDovL2lucHV0IGFuZCBwaHA6Ly9vdXRwdXQKLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0Ci0gKi8KLWNsYXNzIFRQaHBTdHJlYW0gZXh0ZW5kcyBUVHJhbnNwb3J0IHsKLQotICBjb25zdCBNT0RFX1IgPSAxOwotICBjb25zdCBNT0RFX1cgPSAyOwotCi0gIHByaXZhdGUgJGluU3RyZWFtXyA9IG51bGw7Ci0KLSAgcHJpdmF0ZSAkb3V0U3RyZWFtXyA9IG51bGw7Ci0KLSAgcHJpdmF0ZSAkcmVhZF8gPSBmYWxzZTsKLQotICBwcml2YXRlICR3cml0ZV8gPSBmYWxzZTsKLQotICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJG1vZGUpIHsKLSAgICAkdGhpcy0+cmVhZF8gPSAkbW9kZSAmIHNlbGY6Ok1PREVfUjsKLSAgICAkdGhpcy0+d3JpdGVfID0gJG1vZGUgJiBzZWxmOjpNT0RFX1c7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gb3BlbigpIHsKLSAgICBpZiAoJHRoaXMtPnJlYWRfKSB7Ci0gICAgICAkdGhpcy0+aW5TdHJlYW1fID0gQGZvcGVuKHNlbGY6OmluU3RyZWFtTmFtZSgpLCAncicpOwotICAgICAgaWYgKCFpc19yZXNvdXJjZSgkdGhpcy0+aW5TdHJlYW1fKSkgewotICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbignVFBocFN0cmVhbTogQ291bGQgbm90IG9wZW4gcGhwOi8vaW5wdXQnKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKCR0aGlzLT53cml0ZV8pIHsKLSAgICAgICR0aGlzLT5vdXRTdHJlYW1fID0gQGZvcGVuKCdwaHA6Ly9vdXRwdXQnLCAndycpOwotICAgICAgaWYgKCFpc19yZXNvdXJjZSgkdGhpcy0+b3V0U3RyZWFtXykpIHsKLSAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oJ1RQaHBTdHJlYW06IENvdWxkIG5vdCBvcGVuIHBocDovL291dHB1dCcpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiBjbG9zZSgpIHsKLSAgICBpZiAoJHRoaXMtPnJlYWRfKSB7Ci0gICAgICBAZmNsb3NlKCR0aGlzLT5pblN0cmVhbV8pOwotICAgICAgJHRoaXMtPmluU3RyZWFtXyA9IG51bGw7Ci0gICAgfQotICAgIGlmICgkdGhpcy0+d3JpdGVfKSB7Ci0gICAgICBAZmNsb3NlKCR0aGlzLT5vdXRTdHJlYW1fKTsKLSAgICAgICR0aGlzLT5vdXRTdHJlYW1fID0gbnVsbDsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gaXNPcGVuKCkgewotICAgIHJldHVybgotICAgICAgKCEkdGhpcy0+cmVhZF8gfHwgaXNfcmVzb3VyY2UoJHRoaXMtPmluU3RyZWFtXykpICYmCi0gICAgICAoISR0aGlzLT53cml0ZV8gfHwgaXNfcmVzb3VyY2UoJHRoaXMtPm91dFN0cmVhbV8pKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkKCRsZW4pIHsKLSAgICAkZGF0YSA9IEBmcmVhZCgkdGhpcy0+aW5TdHJlYW1fLCAkbGVuKTsKLSAgICBpZiAoJGRhdGEgPT09IEZBTFNFIHx8ICRkYXRhID09PSAnJykgewotICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oJ1RQaHBTdHJlYW06IENvdWxkIG5vdCByZWFkICcuJGxlbi4nIGJ5dGVzJyk7Ci0gICAgfQotICAgIHJldHVybiAkZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZSgkYnVmKSB7Ci0gICAgd2hpbGUgKFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkYnVmKSA+IDApIHsKLSAgICAgICRnb3QgPSBAZndyaXRlKCR0aGlzLT5vdXRTdHJlYW1fLCAkYnVmKTsKLSAgICAgIGlmICgkZ290ID09PSAwIHx8ICRnb3QgPT09IEZBTFNFKSB7Ci0gICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCdUUGhwU3RyZWFtOiBDb3VsZCBub3Qgd3JpdGUgJy5UU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJGJ1ZikuJyBieXRlcycpOwotICAgICAgfQotICAgICAgJGJ1ZiA9IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN1YnN0cigkYnVmLCAkZ290KTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gZmx1c2goKSB7Ci0gICAgQGZmbHVzaCgkdGhpcy0+b3V0U3RyZWFtXyk7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBpblN0cmVhbU5hbWUoKSB7Ci0gICAgaWYgKHBocF9zYXBpX25hbWUoKSA9PSAnY2xpJykgewotICAgICAgcmV0dXJuICdwaHA6Ly9zdGRpbic7Ci0gICAgfQotICAgIHJldHVybiAncGhwOi8vaW5wdXQnOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RocmlmdC9UcmFuc3BvcnQvVFNvY2tldC5waHAgYi9saWIvcGhwL2xpYi9UaHJpZnQvVHJhbnNwb3J0L1RTb2NrZXQucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWQzYmY3Li4wMDAwMDAwCi0tLSBhL2xpYi9waHAvbGliL1RocmlmdC9UcmFuc3BvcnQvVFNvY2tldC5waHAKKysrIC9kZXYvbnVsbApAQCAtMSwzMjYgKzAsMCBAQAotPD9waHAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAotICovCi0KLW5hbWVzcGFjZSBUaHJpZnRcVHJhbnNwb3J0OwotCi11c2UgVGhyaWZ0XFRyYW5zcG9ydFxUVHJhbnNwb3J0OwotdXNlIFRocmlmdFxFeGNlcHRpb25cVEV4Y2VwdGlvbjsKLXVzZSBUaHJpZnRcRXhjZXB0aW9uXFRUcmFuc3BvcnRFeGNlcHRpb247Ci11c2UgVGhyaWZ0XEZhY3RvcnlcVFN0cmluZ0Z1bmNGYWN0b3J5OwotCi0vKioKLSAqIFNvY2tldHMgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRUcmFuc3BvcnQgaW50ZXJmYWNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKLSAqLwotY2xhc3MgVFNvY2tldCBleHRlbmRzIFRUcmFuc3BvcnQgewotCi0gIC8qKgotICAgKiBIYW5kbGUgdG8gUEhQIHNvY2tldAotICAgKgotICAgKiBAdmFyIHJlc291cmNlCi0gICAqLwotICBwcml2YXRlICRoYW5kbGVfID0gbnVsbDsKLQotICAvKioKLSAgICogUmVtb3RlIGhvc3RuYW1lCi0gICAqCi0gICAqIEB2YXIgc3RyaW5nCi0gICAqLwotICBwcm90ZWN0ZWQgJGhvc3RfID0gJ2xvY2FsaG9zdCc7Ci0KLSAgLyoqCi0gICAqIFJlbW90ZSBwb3J0Ci0gICAqCi0gICAqIEB2YXIgaW50Ci0gICAqLwotICBwcm90ZWN0ZWQgJHBvcnRfID0gJzkwOTAnOwotCi0gIC8qKgotICAgKiBTZW5kIHRpbWVvdXQgaW4gc2Vjb25kcy4KLSAgICoKLSAgICogQ29tYmluZWQgd2l0aCBzZW5kVGltZW91dFVzZWMgdGhpcyBpcyB1c2VkIGZvciBzZW5kIHRpbWVvdXRzLgotICAgKgotICAgKiBAdmFyIGludAotICAgKi8KLSAgcHJpdmF0ZSAkc2VuZFRpbWVvdXRTZWNfID0gMDsKLQotICAvKioKLSAgICogU2VuZCB0aW1lb3V0IGluIG1pY3Jvc2Vjb25kcy4KLSAgICoKLSAgICogQ29tYmluZWQgd2l0aCBzZW5kVGltZW91dFNlYyB0aGlzIGlzIHVzZWQgZm9yIHNlbmQgdGltZW91dHMuCi0gICAqCi0gICAqIEB2YXIgaW50Ci0gICAqLwotICBwcml2YXRlICRzZW5kVGltZW91dFVzZWNfID0gMTAwMDAwOwotCi0gIC8qKgotICAgKiBSZWN2IHRpbWVvdXQgaW4gc2Vjb25kcwotICAgKgotICAgKiBDb21iaW5lZCB3aXRoIHJlY3ZUaW1lb3V0VXNlYyB0aGlzIGlzIHVzZWQgZm9yIHJlY3YgdGltZW91dHMuCi0gICAqCi0gICAqIEB2YXIgaW50Ci0gICAqLwotICBwcml2YXRlICRyZWN2VGltZW91dFNlY18gPSAwOwotCi0gIC8qKgotICAgKiBSZWN2IHRpbWVvdXQgaW4gbWljcm9zZWNvbmRzCi0gICAqCi0gICAqIENvbWJpbmVkIHdpdGggcmVjdlRpbWVvdXRTZWMgdGhpcyBpcyB1c2VkIGZvciByZWN2IHRpbWVvdXRzLgotICAgKgotICAgKiBAdmFyIGludAotICAgKi8KLSAgcHJpdmF0ZSAkcmVjdlRpbWVvdXRVc2VjXyA9IDc1MDAwMDsKLQotICAvKioKLSAgICogUGVyc2lzdGVudCBzb2NrZXQgb3IgcGxhaW4/Ci0gICAqCi0gICAqIEB2YXIgYm9vbAotICAgKi8KLSAgcHJvdGVjdGVkICRwZXJzaXN0XyA9IEZBTFNFOwotCi0gIC8qKgotICAgKiBEZWJ1Z2dpbmcgb24/Ci0gICAqCi0gICAqIEB2YXIgYm9vbAotICAgKi8KLSAgcHJvdGVjdGVkICRkZWJ1Z18gPSBGQUxTRTsKLQotICAvKioKLSAgICogRGVidWcgaGFuZGxlcgotICAgKgotICAgKiBAdmFyIG1peGVkCi0gICAqLwotICBwcm90ZWN0ZWQgJGRlYnVnSGFuZGxlcl8gPSBudWxsOwotCi0gIC8qKgotICAgKiBTb2NrZXQgY29uc3RydWN0b3IKLSAgICoKLSAgICogQHBhcmFtIHN0cmluZyAkaG9zdCAgICAgICAgIFJlbW90ZSBob3N0bmFtZQotICAgKiBAcGFyYW0gaW50ICAgICRwb3J0ICAgICAgICAgUmVtb3RlIHBvcnQKLSAgICogQHBhcmFtIGJvb2wgICAkcGVyc2lzdCAgICAgIFdoZXRoZXIgdG8gdXNlIGEgcGVyc2lzdGVudCBzb2NrZXQKLSAgICogQHBhcmFtIHN0cmluZyAkZGVidWdIYW5kbGVyIEZ1bmN0aW9uIHRvIGNhbGwgZm9yIGVycm9yIGxvZ2dpbmcKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkaG9zdD0nbG9jYWxob3N0JywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwb3J0PTkwOTAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcGVyc2lzdD1GQUxTRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRkZWJ1Z0hhbmRsZXI9bnVsbCkgewotICAgICR0aGlzLT5ob3N0XyA9ICRob3N0OwotICAgICR0aGlzLT5wb3J0XyA9ICRwb3J0OwotICAgICR0aGlzLT5wZXJzaXN0XyA9ICRwZXJzaXN0OwotICAgICR0aGlzLT5kZWJ1Z0hhbmRsZXJfID0gJGRlYnVnSGFuZGxlciA/ICRkZWJ1Z0hhbmRsZXIgOiAnZXJyb3JfbG9nJzsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gcmVzb3VyY2UgJGhhbmRsZQotICAgKiBAcmV0dXJuIHZvaWQKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBzZXRIYW5kbGUoJGhhbmRsZSkgewotICAgICR0aGlzLT5oYW5kbGVfID0gJGhhbmRsZTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBzZW5kIHRpbWVvdXQuCi0gICAqCi0gICAqIEBwYXJhbSBpbnQgJHRpbWVvdXQgIFRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLgotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIHNldFNlbmRUaW1lb3V0KCR0aW1lb3V0KSB7Ci0gICAgJHRoaXMtPnNlbmRUaW1lb3V0U2VjXyA9IGZsb29yKCR0aW1lb3V0IC8gMTAwMCk7Ci0gICAgJHRoaXMtPnNlbmRUaW1lb3V0VXNlY18gPQotICAgICAgICAgICAgKCR0aW1lb3V0IC0gKCR0aGlzLT5zZW5kVGltZW91dFNlY18gKiAxMDAwKSkgKiAxMDAwOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHJlY2VpdmUgdGltZW91dC4KLSAgICoKLSAgICogQHBhcmFtIGludCAkdGltZW91dCAgVGltZW91dCBpbiBtaWxsaXNlY29uZHMuCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gc2V0UmVjdlRpbWVvdXQoJHRpbWVvdXQpIHsKLSAgICAkdGhpcy0+cmVjdlRpbWVvdXRTZWNfID0gZmxvb3IoJHRpbWVvdXQgLyAxMDAwKTsKLSAgICAkdGhpcy0+cmVjdlRpbWVvdXRVc2VjXyA9Ci0gICAgICAgICAgICAoJHRpbWVvdXQgLSAoJHRoaXMtPnJlY3ZUaW1lb3V0U2VjXyAqIDEwMDApKSAqIDEwMDA7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyBkZWJ1Z2dpbmcgb3V0cHV0IG9uIG9yIG9mZgotICAgKgotICAgKiBAcGFyYW0gYm9vbCAkZGVidWcKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBzZXREZWJ1ZygkZGVidWcpIHsKLSAgICAkdGhpcy0+ZGVidWdfID0gJGRlYnVnOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgaG9zdCB0aGF0IHRoaXMgc29ja2V0IGlzIGNvbm5lY3RlZCB0bwotICAgKgotICAgKiBAcmV0dXJuIHN0cmluZyBob3N0Ci0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gZ2V0SG9zdCgpIHsKLSAgICByZXR1cm4gJHRoaXMtPmhvc3RfOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgcmVtb3RlIHBvcnQgdGhhdCB0aGlzIHNvY2tldCBpcyBjb25uZWN0ZWQgdG8KLSAgICoKLSAgICogQHJldHVybiBpbnQgcG9ydAotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIGdldFBvcnQoKSB7Ci0gICAgcmV0dXJuICR0aGlzLT5wb3J0XzsKLSAgfQotCi0gIC8qKgotICAgKiBUZXN0cyB3aGV0aGVyIHRoaXMgaXMgb3BlbgotICAgKgotICAgKiBAcmV0dXJuIGJvb2wgdHJ1ZSBpZiB0aGUgc29ja2V0IGlzIG9wZW4KLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBpc09wZW4oKSB7Ci0gICAgcmV0dXJuIGlzX3Jlc291cmNlKCR0aGlzLT5oYW5kbGVfKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb25uZWN0cyB0aGUgc29ja2V0LgotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIG9wZW4oKSB7Ci0gICAgaWYgKCR0aGlzLT5pc09wZW4oKSkgewotICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJ1NvY2tldCBhbHJlYWR5IGNvbm5lY3RlZCcsIFRUcmFuc3BvcnRFeGNlcHRpb246OkFMUkVBRFlfT1BFTik7Ci0gICAgfQotCi0gICAgaWYgKGVtcHR5KCR0aGlzLT5ob3N0XykpIHsKLSAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCdDYW5ub3Qgb3BlbiBudWxsIGhvc3QnLCBUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTik7Ci0gICAgfQotCi0gICAgaWYgKCR0aGlzLT5wb3J0XyA8PSAwKSB7Ci0gICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbignQ2Fubm90IG9wZW4gd2l0aG91dCBwb3J0JywgVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4pOwotICAgIH0KLQotICAgIGlmICgkdGhpcy0+cGVyc2lzdF8pIHsKLSAgICAgICR0aGlzLT5oYW5kbGVfID0gQHBmc29ja29wZW4oJHRoaXMtPmhvc3RfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+cG9ydF8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRlcnJubywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGVycnN0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnNlbmRUaW1lb3V0U2VjXyArICgkdGhpcy0+c2VuZFRpbWVvdXRVc2VjXyAvIDEwMDAwMDApKTsKLSAgICB9IGVsc2UgewotICAgICAgJHRoaXMtPmhhbmRsZV8gPSBAZnNvY2tvcGVuKCR0aGlzLT5ob3N0XywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+cG9ydF8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGVycm5vLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRlcnJzdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnNlbmRUaW1lb3V0U2VjXyArICgkdGhpcy0+c2VuZFRpbWVvdXRVc2VjXyAvIDEwMDAwMDApKTsKLSAgICB9Ci0KLSAgICAvLyBDb25uZWN0IGZhaWxlZD8KLSAgICBpZiAoJHRoaXMtPmhhbmRsZV8gPT09IEZBTFNFKSB7Ci0gICAgICAkZXJyb3IgPSAnVFNvY2tldDogQ291bGQgbm90IGNvbm5lY3QgdG8gJy4kdGhpcy0+aG9zdF8uJzonLiR0aGlzLT5wb3J0Xy4nICgnLiRlcnJzdHIuJyBbJy4kZXJybm8uJ10pJzsKLSAgICAgIGlmICgkdGhpcy0+ZGVidWdfKSB7Ci0gICAgICAgIGNhbGxfdXNlcl9mdW5jKCR0aGlzLT5kZWJ1Z0hhbmRsZXJfLCAkZXJyb3IpOwotICAgICAgfQotICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oJGVycm9yKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQ2xvc2VzIHRoZSBzb2NrZXQuCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gY2xvc2UoKSB7Ci0gICAgaWYgKCEkdGhpcy0+cGVyc2lzdF8pIHsKLSAgICAgIEBmY2xvc2UoJHRoaXMtPmhhbmRsZV8pOwotICAgICAgJHRoaXMtPmhhbmRsZV8gPSBudWxsOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBSZWFkIGZyb20gdGhlIHNvY2tldCBhdCBtb3N0ICRsZW4gYnl0ZXMuCi0gICAqCi0gICAqIFRoaXMgbWV0aG9kIHdpbGwgbm90IHdhaXQgZm9yIGFsbCB0aGUgcmVxdWVzdGVkIGRhdGEsIGl0IHdpbGwgcmV0dXJuIGFzCi0gICAqIHNvb24gYXMgYW55IGRhdGEgaXMgcmVjZWl2ZWQuCi0gICAqCi0gICAqIEBwYXJhbSBpbnQgJGxlbiBNYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byByZWFkLgotICAgKiBAcmV0dXJuIHN0cmluZyBCaW5hcnkgZGF0YQotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWQoJGxlbikgewotICAgICRudWxsID0gbnVsbDsKLSAgICAkcmVhZCA9IGFycmF5KCR0aGlzLT5oYW5kbGVfKTsKLSAgICAkcmVhZGFibGUgPSBAc3RyZWFtX3NlbGVjdCgkcmVhZCwgJG51bGwsICRudWxsLCAkdGhpcy0+cmVjdlRpbWVvdXRTZWNfLCAkdGhpcy0+cmVjdlRpbWVvdXRVc2VjXyk7Ci0KLSAgICBpZiAoJHJlYWRhYmxlID4gMCkgewotICAgICAgJGRhdGEgPSBAc3RyZWFtX3NvY2tldF9yZWN2ZnJvbSgkdGhpcy0+aGFuZGxlXywgJGxlbik7Ci0gICAgICBpZiAoJGRhdGEgPT09IGZhbHNlKSB7Ci0gICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJ1RTb2NrZXQ6IENvdWxkIG5vdCByZWFkICcuJGxlbi4nIGJ5dGVzIGZyb20gJy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+aG9zdF8uJzonLiR0aGlzLT5wb3J0Xyk7Ci0gICAgICB9IGVsc2VpZigkZGF0YSA9PSAnJyAmJiBmZW9mKCR0aGlzLT5oYW5kbGVfKSkgewotICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCdUU29ja2V0IHJlYWQgMCBieXRlcycpOwotICAgICAgICB9Ci0KLSAgICAgIHJldHVybiAkZGF0YTsKLSAgICB9IGVsc2UgaWYgKCRyZWFkYWJsZSA9PT0gMCkgewotICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbignVFNvY2tldDogdGltZWQgb3V0IHJlYWRpbmcgJy4kbGVuLicgYnl0ZXMgZnJvbSAnLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+aG9zdF8uJzonLiR0aGlzLT5wb3J0Xyk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbignVFNvY2tldDogQ291bGQgbm90IHJlYWQgJy4kbGVuLicgYnl0ZXMgZnJvbSAnLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+aG9zdF8uJzonLiR0aGlzLT5wb3J0Xyk7Ci0gICAgICB9Ci0gICAgfQotCi0gIC8qKgotICAgKiBXcml0ZSB0byB0aGUgc29ja2V0LgotICAgKgotICAgKiBAcGFyYW0gc3RyaW5nICRidWYgVGhlIGRhdGEgdG8gd3JpdGUKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZSgkYnVmKSB7Ci0gICAgJG51bGwgPSBudWxsOwotICAgICR3cml0ZSA9IGFycmF5KCR0aGlzLT5oYW5kbGVfKTsKLQotICAgIC8vIGtlZXAgd3JpdGluZyB1bnRpbCBhbGwgdGhlIGRhdGEgaGFzIGJlZW4gd3JpdHRlbgotICAgIHdoaWxlIChUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJGJ1ZikgPiAwKSB7Ci0gICAgICAvLyB3YWl0IGZvciBzdHJlYW0gdG8gYmVjb21lIGF2YWlsYWJsZSBmb3Igd3JpdGluZwotICAgICAgJHdyaXRhYmxlID0gQHN0cmVhbV9zZWxlY3QoJG51bGwsICR3cml0ZSwgJG51bGwsICR0aGlzLT5zZW5kVGltZW91dFNlY18sICR0aGlzLT5zZW5kVGltZW91dFVzZWNfKTsKLSAgICAgIGlmICgkd3JpdGFibGUgPiAwKSB7Ci0gICAgICAgIC8vIHdyaXRlIGJ1ZmZlciB0byBzdHJlYW0KLSAgICAgICAgJHdyaXR0ZW4gPSBAc3RyZWFtX3NvY2tldF9zZW5kdG8oJHRoaXMtPmhhbmRsZV8sICRidWYpOwotICAgICAgICBpZiAoJHdyaXR0ZW4gPT09IC0xIHx8ICR3cml0dGVuID09PSBmYWxzZSkgewotICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCdUU29ja2V0OiBDb3VsZCBub3Qgd3JpdGUgJy5UU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJGJ1ZikuJyBieXRlcyAnLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+aG9zdF8uJzonLiR0aGlzLT5wb3J0Xyk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gZGV0ZXJtaW5lIGhvdyBtdWNoIG9mIHRoZSBidWZmZXIgaXMgbGVmdCB0byB3cml0ZQotICAgICAgICAkYnVmID0gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3Vic3RyKCRidWYsICR3cml0dGVuKTsKLSAgICAgIH0gZWxzZSBpZiAoJHdyaXRhYmxlID09PSAwKSB7Ci0gICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJ1RTb2NrZXQ6IHRpbWVkIG91dCB3cml0aW5nICcuVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCRidWYpLicgYnl0ZXMgZnJvbSAnLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5ob3N0Xy4nOicuJHRoaXMtPnBvcnRfKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCdUU29ja2V0OiBDb3VsZCBub3Qgd3JpdGUgJy5UU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJGJ1ZikuJyBieXRlcyAnLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmhvc3RfLic6Jy4kdGhpcy0+cG9ydF8pOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gIC8qKgotICAgKiBGbHVzaCBvdXRwdXQgdG8gdGhlIHNvY2tldC4KLSAgICoKLSAgICogU2luY2UgcmVhZCgpLCByZWFkQWxsKCkgYW5kIHdyaXRlKCkgb3BlcmF0ZSBvbiB0aGUgc29ja2V0cyBkaXJlY3RseSwKLSAgICogdGhpcyBpcyBhIG5vLW9wCi0gICAqCi0gICAqIElmIHlvdSB3aXNoIHRvIGhhdmUgZmx1c2hhYmxlIGJ1ZmZlcmluZyBiZWhhdmlvdXIsIHdyYXAgdGhpcyBUU29ja2V0Ci0gICAqIGluIGEgVEJ1ZmZlcmVkVHJhbnNwb3J0LgotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIGZsdXNoKCkgewotICAgIC8vIG5vLW9wCi0gICAgfQotICB9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvVHJhbnNwb3J0L1RTb2NrZXRQb29sLnBocCBiL2xpYi9waHAvbGliL1RocmlmdC9UcmFuc3BvcnQvVFNvY2tldFBvb2wucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTYxMGNiLi4wMDAwMDAwCi0tLSBhL2xpYi9waHAvbGliL1RocmlmdC9UcmFuc3BvcnQvVFNvY2tldFBvb2wucGhwCisrKyAvZGV2L251bGwKQEAgLTEsMjk1ICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKLSAqLwotCi1uYW1lc3BhY2UgVGhyaWZ0XFRyYW5zcG9ydDsKLQotdXNlIFRocmlmdFxUcmFuc3BvcnRcVFNvY2tldDsKLXVzZSBUaHJpZnRcRXhjZXB0aW9uXFRFeGNlcHRpb247Ci0KLS8qKgotICogVGhpcyBsaWJyYXJ5IG1ha2VzIHVzZSBvZiBBUEMgY2FjaGUgdG8gbWFrZSBob3N0cyBhcyBkb3duIGluIGEgd2ViCi0gKiBlbnZpcm9ubWVudC4gSWYgeW91IGFyZSBydW5uaW5nIGZyb20gdGhlIENMSSBvciBvbiBhIHN5c3RlbSB3aXRob3V0IEFQQwotICogaW5zdGFsbGVkLCB0aGVuIHRoZXNlIG51bGwgZnVuY3Rpb25zIHdpbGwgc3RlcCBpbiBhbmQgYWN0IGxpa2UgY2FjaGUKLSAqIG1pc3Nlcy4KLSAqLwotaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2FwY19mZXRjaCcpKSB7Ci0gIGZ1bmN0aW9uIGFwY19mZXRjaCgka2V5KSB7IHJldHVybiBGQUxTRTsgfQotICBmdW5jdGlvbiBhcGNfc3RvcmUoJGtleSwgJHZhciwgJHR0bD0wKSB7IHJldHVybiBGQUxTRTsgfQotfQotCi0vKioKLSAqIFNvY2tldHMgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRUcmFuc3BvcnQgaW50ZXJmYWNlIHRoYXQgYWxsb3dzIGNvbm5lY3Rpb24KLSAqIHRvIGEgcG9vbCBvZiBzZXJ2ZXJzLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKLSAqLwotY2xhc3MgVFNvY2tldFBvb2wgZXh0ZW5kcyBUU29ja2V0IHsKLQotICAvKioKLSAgICogUmVtb3RlIHNlcnZlcnMuIEFycmF5IG9mIGFzc29jaWF0aXZlIGFycmF5cyB3aXRoICdob3N0JyBhbmQgJ3BvcnQnIGtleXMKLSAgICovCi0gIHByaXZhdGUgJHNlcnZlcnNfID0gYXJyYXkoKTsKLQotICAvKioKLSAgICogSG93IG1hbnkgdGltZXMgdG8gcmV0cnkgZWFjaCBob3N0IGluIGNvbm5lY3QKLSAgICoKLSAgICogQHZhciBpbnQKLSAgICovCi0gIHByaXZhdGUgJG51bVJldHJpZXNfID0gMTsKLQotICAvKioKLSAgICogUmV0cnkgaW50ZXJ2YWwgaW4gc2Vjb25kcywgaG93IGxvbmcgdG8gbm90IHRyeSBhIGhvc3QgaWYgaXQgaGFzIGJlZW4KLSAgICogbWFya2VkIGFzIGRvd24uCi0gICAqCi0gICAqIEB2YXIgaW50Ci0gICAqLwotICBwcml2YXRlICRyZXRyeUludGVydmFsXyA9IDYwOwotCi0gIC8qKgotICAgKiBNYXggY29uc2VjdXRpdmUgZmFpbHVyZXMgYmVmb3JlIG1hcmtpbmcgYSBob3N0IGRvd24uCi0gICAqCi0gICAqIEB2YXIgaW50Ci0gICAqLwotICBwcml2YXRlICRtYXhDb25zZWN1dGl2ZUZhaWx1cmVzXyA9IDE7Ci0KLSAgLyoqCi0gICAqIFRyeSBob3N0cyBpbiBvcmRlcj8gb3IgUmFuZG9taXplZD8KLSAgICoKLSAgICogQHZhciBib29sCi0gICAqLwotICBwcml2YXRlICRyYW5kb21pemVfID0gVFJVRTsKLQotICAvKioKLSAgICogQWx3YXlzIHRyeSBsYXN0IGhvc3QsIGV2ZW4gaWYgbWFya2VkIGRvd24/Ci0gICAqCi0gICAqIEB2YXIgYm9vbAotICAgKi8KLSAgcHJpdmF0ZSAkYWx3YXlzVHJ5TGFzdF8gPSBUUlVFOwotCi0gIC8qKgotICAgKiBTb2NrZXQgcG9vbCBjb25zdHJ1Y3RvcgotICAgKgotICAgKiBAcGFyYW0gYXJyYXkgICRob3N0cyAgICAgICAgTGlzdCBvZiByZW1vdGUgaG9zdG5hbWVzCi0gICAqIEBwYXJhbSBtaXhlZCAgJHBvcnRzICAgICAgICBBcnJheSBvZiByZW1vdGUgcG9ydHMsIG9yIGEgc2luZ2xlIGNvbW1vbiBwb3J0Ci0gICAqIEBwYXJhbSBib29sICAgJHBlcnNpc3QgICAgICBXaGV0aGVyIHRvIHVzZSBhIHBlcnNpc3RlbnQgc29ja2V0Ci0gICAqIEBwYXJhbSBtaXhlZCAgJGRlYnVnSGFuZGxlciBGdW5jdGlvbiBmb3IgZXJyb3IgbG9nZ2luZwotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRob3N0cz1hcnJheSgnbG9jYWxob3N0JyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcG9ydHM9YXJyYXkoOTA5MCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcGVyc2lzdD1GQUxTRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRkZWJ1Z0hhbmRsZXI9bnVsbCkgewotICAgIHBhcmVudDo6X19jb25zdHJ1Y3QobnVsbCwgMCwgJHBlcnNpc3QsICRkZWJ1Z0hhbmRsZXIpOwotCi0gICAgaWYgKCFpc19hcnJheSgkcG9ydHMpKSB7Ci0gICAgICAkcG9ydCA9ICRwb3J0czsKLSAgICAgICRwb3J0cyA9IGFycmF5KCk7Ci0gICAgICBmb3JlYWNoICgkaG9zdHMgYXMgJGtleSA9PiAkdmFsKSB7Ci0gICAgICAgICRwb3J0c1ska2V5XSA9ICRwb3J0OwotICAgICAgfQotICAgIH0KLQotICAgIGZvcmVhY2ggKCRob3N0cyBhcyAka2V5ID0+ICRob3N0KSB7Ci0gICAgICAkdGhpcy0+c2VydmVyc18gW109IGFycmF5KCdob3N0JyA9PiAkaG9zdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BvcnQnID0+ICRwb3J0c1ska2V5XSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEFkZCBhIHNlcnZlciB0byB0aGUgcG9vbAotICAgKgotICAgKiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHByZXZlbnQgeW91IGZyb20gYWRkaW5nIGEgZHVwbGljYXRlIHNlcnZlciBlbnRyeS4KLSAgICoKLSAgICogQHBhcmFtIHN0cmluZyAkaG9zdCBob3N0bmFtZSBvciBJUAotICAgKiBAcGFyYW0gaW50ICRwb3J0IHBvcnQKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBhZGRTZXJ2ZXIoJGhvc3QsICRwb3J0KSB7Ci0gICAgJHRoaXMtPnNlcnZlcnNfW10gPSBhcnJheSgnaG9zdCcgPT4gJGhvc3QsICdwb3J0JyA9PiAkcG9ydCk7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyBob3cgbWFueSB0aW1lIHRvIGtlZXAgcmV0cnlpbmcgYSBob3N0IGluIHRoZSBjb25uZWN0IGZ1bmN0aW9uLgotICAgKgotICAgKiBAcGFyYW0gaW50ICRudW1SZXRyaWVzCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gc2V0TnVtUmV0cmllcygkbnVtUmV0cmllcykgewotICAgICR0aGlzLT5udW1SZXRyaWVzXyA9ICRudW1SZXRyaWVzOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgaG93IGxvbmcgdG8gd2FpdCB1bnRpbCByZXRyeWluZyBhIGhvc3QgaWYgaXQgd2FzIG1hcmtlZCBkb3duCi0gICAqCi0gICAqIEBwYXJhbSBpbnQgJG51bVJldHJpZXMKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBzZXRSZXRyeUludGVydmFsKCRyZXRyeUludGVydmFsKSB7Ci0gICAgJHRoaXMtPnJldHJ5SW50ZXJ2YWxfID0gJHJldHJ5SW50ZXJ2YWw7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyBob3cgbWFueSB0aW1lIHRvIGtlZXAgcmV0cnlpbmcgYSBob3N0IGJlZm9yZSBtYXJraW5nIGl0IGFzIGRvd24uCi0gICAqCi0gICAqIEBwYXJhbSBpbnQgJG51bVJldHJpZXMKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBzZXRNYXhDb25zZWN1dGl2ZUZhaWx1cmVzKCRtYXhDb25zZWN1dGl2ZUZhaWx1cmVzKSB7Ci0gICAgJHRoaXMtPm1heENvbnNlY3V0aXZlRmFpbHVyZXNfID0gJG1heENvbnNlY3V0aXZlRmFpbHVyZXM7Ci0gIH0KLQotICAvKioKLSAgICogVHVybnMgcmFuZG9taXphdGlvbiBpbiBjb25uZWN0IG9yZGVyIG9uIG9yIG9mZi4KLSAgICoKLSAgICogQHBhcmFtIGJvb2wgJHJhbmRvbWl6ZQotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIHNldFJhbmRvbWl6ZSgkcmFuZG9taXplKSB7Ci0gICAgJHRoaXMtPnJhbmRvbWl6ZV8gPSAkcmFuZG9taXplOwotICB9Ci0KLSAgLyoqCi0gICAqIFdoZXRoZXIgdG8gYWx3YXlzIHRyeSB0aGUgbGFzdCBzZXJ2ZXIuCi0gICAqCi0gICAqIEBwYXJhbSBib29sICRhbHdheXNUcnlMYXN0Ci0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gc2V0QWx3YXlzVHJ5TGFzdCgkYWx3YXlzVHJ5TGFzdCkgewotICAgICR0aGlzLT5hbHdheXNUcnlMYXN0XyA9ICRhbHdheXNUcnlMYXN0OwotICB9Ci0KLQotICAvKioKLSAgICogQ29ubmVjdHMgdGhlIHNvY2tldCBieSBpdGVyYXRpbmcgdGhyb3VnaCBhbGwgdGhlIHNlcnZlcnMgaW4gdGhlIHBvb2wKLSAgICogYW5kIHRyeWluZyB0byBmaW5kIG9uZSB0aGF0IHdvcmtzLgotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIG9wZW4oKSB7Ci0gICAgLy8gQ2hlY2sgaWYgd2Ugd2FudCBvcmRlciByYW5kb21pemF0aW9uCi0gICAgaWYgKCR0aGlzLT5yYW5kb21pemVfKSB7Ci0gICAgICBzaHVmZmxlKCR0aGlzLT5zZXJ2ZXJzXyk7Ci0gICAgfQotCi0gICAgLy8gQ291bnQgc2VydmVycyB0byBpZGVudGlmeSB0aGUgImxhc3QiIG9uZQotICAgICRudW1TZXJ2ZXJzID0gY291bnQoJHRoaXMtPnNlcnZlcnNfKTsKLQotICAgIGZvciAoJGkgPSAwOyAkaSA8ICRudW1TZXJ2ZXJzOyArKyRpKSB7Ci0KLSAgICAgIC8vIFRoaXMgZXh0cmFjdHMgdGhlICRob3N0IGFuZCAkcG9ydCB2YXJpYWJsZXMKLSAgICAgIGV4dHJhY3QoJHRoaXMtPnNlcnZlcnNfWyRpXSk7Ci0KLSAgICAgIC8vIENoZWNrIEFQQyBjYWNoZSBmb3IgYSByZWNvcmQgb2YgdGhpcyBzZXJ2ZXIgYmVpbmcgZG93bgotICAgICAgJGZhaWx0aW1lS2V5ID0gJ3RocmlmdF9mYWlsdGltZTonLiRob3N0Lic6Jy4kcG9ydC4nfic7Ci0KLSAgICAgIC8vIENhY2hlIG1pc3M/IEFzc3VtZSBpdCdzIE9LCi0gICAgICAkbGFzdEZhaWx0aW1lID0gYXBjX2ZldGNoKCRmYWlsdGltZUtleSk7Ci0gICAgICBpZiAoJGxhc3RGYWlsdGltZSA9PT0gRkFMU0UpIHsKLSAgICAgICAgJGxhc3RGYWlsdGltZSA9IDA7Ci0gICAgICB9Ci0KLSAgICAgICRyZXRyeUludGVydmFsUGFzc2VkID0gRkFMU0U7Ci0KLSAgICAgIC8vIENhY2hlIGhpdC4uLm1ha2Ugc3VyZSBlbm91Z2ggdGhlIHJldHJ5IGludGVydmFsIGhhcyBlbGFwc2VkCi0gICAgICBpZiAoJGxhc3RGYWlsdGltZSA+IDApIHsKLSAgICAgICAgJGVsYXBzZWQgPSB0aW1lKCkgLSAkbGFzdEZhaWx0aW1lOwotICAgICAgICBpZiAoJGVsYXBzZWQgPiAkdGhpcy0+cmV0cnlJbnRlcnZhbF8pIHsKLSAgICAgICAgICAkcmV0cnlJbnRlcnZhbFBhc3NlZCA9IFRSVUU7Ci0gICAgICAgICAgaWYgKCR0aGlzLT5kZWJ1Z18pIHsKLSAgICAgICAgICAgIGNhbGxfdXNlcl9mdW5jKCR0aGlzLT5kZWJ1Z0hhbmRsZXJfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RTb2NrZXRQb29sOiByZXRyeUludGVydmFsICcuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAnKCcuJHRoaXMtPnJldHJ5SW50ZXJ2YWxfLicpICcuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAnaGFzIHBhc3NlZCBmb3IgaG9zdCAnLiRob3N0Lic6Jy4kcG9ydCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8vIE9ubHkgY29ubmVjdCBpZiBub3QgaW4gdGhlIG1pZGRsZSBvZiBhIGZhaWwgaW50ZXJ2YWwsIE9SIGlmIHRoaXMKLSAgICAgIC8vIGlzIHRoZSBMQVNUIHNlcnZlciB3ZSBhcmUgdHJ5aW5nLCBqdXN0IGhhbW1lciBhd2F5IG9uIGl0Ci0gICAgICAkaXNMYXN0U2VydmVyID0gRkFMU0U7Ci0gICAgICBpZiAoJHRoaXMtPmFsd2F5c1RyeUxhc3RfKSB7Ci0gICAgICAgICRpc0xhc3RTZXJ2ZXIgPSAoJGkgPT0gKCRudW1TZXJ2ZXJzIC0gMSkpOwotICAgICAgfQotCi0gICAgICBpZiAoKCRsYXN0RmFpbHRpbWUgPT09IDApIHx8Ci0gICAgICAgICAgKCRpc0xhc3RTZXJ2ZXIpIHx8Ci0gICAgICAgICAgKCRsYXN0RmFpbHRpbWUgPiAwICYmICRyZXRyeUludGVydmFsUGFzc2VkKSkgewotCi0gICAgICAgIC8vIFNldCB1bmRlcmx5aW5nIFRTb2NrZXQgcGFyYW1zIHRvIHRoaXMgb25lCi0gICAgICAgICR0aGlzLT5ob3N0XyA9ICRob3N0OwotICAgICAgICAkdGhpcy0+cG9ydF8gPSAkcG9ydDsKLQotICAgICAgICAvLyBUcnkgdXAgdG8gbnVtUmV0cmllc18gY29ubmVjdGlvbnMgcGVyIHNlcnZlcgotICAgICAgICBmb3IgKCRhdHRlbXB0ID0gMDsgJGF0dGVtcHQgPCAkdGhpcy0+bnVtUmV0cmllc187ICRhdHRlbXB0KyspIHsKLSAgICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gVXNlIHRoZSB1bmRlcmx5aW5nIFRTb2NrZXQgb3BlbiBmdW5jdGlvbgotICAgICAgICAgICAgcGFyZW50OjpvcGVuKCk7Ci0KLSAgICAgICAgICAgIC8vIE9ubHkgY2xlYXIgdGhlIGZhaWx1cmUgY291bnRzIGlmIHJlcXVpcmVkIHRvIGRvIHNvCi0gICAgICAgICAgICBpZiAoJGxhc3RGYWlsdGltZSA+IDApIHsKLSAgICAgICAgICAgICAgYXBjX3N0b3JlKCRmYWlsdGltZUtleSwgMCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFN1Y2Nlc3NmdWwgY29ubmVjdGlvbiwgcmV0dXJuIG5vdwotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgICAgfSBjYXRjaCAoVEV4Y2VwdGlvbiAkdHgpIHsKLSAgICAgICAgICAgIC8vIENvbm5lY3Rpb24gZmFpbGVkCi0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTWFyayBmYWlsdXJlIG9mIHRoaXMgaG9zdCBpbiB0aGUgY2FjaGUKLSAgICAgICAgJGNvbnNlY2ZhaWxzS2V5ID0gJ3RocmlmdF9jb25zZWNmYWlsczonLiRob3N0Lic6Jy4kcG9ydC4nfic7Ci0KLSAgICAgICAgLy8gSWdub3JlIGNhY2hlIG1pc3NlcwotICAgICAgICAkY29uc2VjZmFpbHMgPSBhcGNfZmV0Y2goJGNvbnNlY2ZhaWxzS2V5KTsKLSAgICAgICAgaWYgKCRjb25zZWNmYWlscyA9PT0gRkFMU0UpIHsKLSAgICAgICAgICAkY29uc2VjZmFpbHMgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSW5jcmVtZW50IGJ5IG9uZQotICAgICAgICAkY29uc2VjZmFpbHMrKzsKLQotICAgICAgICAvLyBMb2cgYW5kIGNhY2hlIHRoaXMgZmFpbHVyZQotICAgICAgICBpZiAoJGNvbnNlY2ZhaWxzID49ICR0aGlzLT5tYXhDb25zZWN1dGl2ZUZhaWx1cmVzXykgewotICAgICAgICAgIGlmICgkdGhpcy0+ZGVidWdfKSB7Ci0gICAgICAgICAgICBjYWxsX3VzZXJfZnVuYygkdGhpcy0+ZGVidWdIYW5kbGVyXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICdUU29ja2V0UG9vbDogbWFya2luZyAnLiRob3N0Lic6Jy4kcG9ydC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICcgYXMgZG93biBmb3IgJy4kdGhpcy0+cmV0cnlJbnRlcnZhbF8uJyBzZWNzICcuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAnYWZ0ZXIgJy4kY29uc2VjZmFpbHMuJyBmYWlsZWQgYXR0ZW1wdHMuJyk7Ci0gICAgICAgICAgfQotICAgICAgICAgIC8vIFN0b3JlIHRoZSBmYWlsdXJlIHRpbWUKLSAgICAgICAgICBhcGNfc3RvcmUoJGZhaWx0aW1lS2V5LCB0aW1lKCkpOwotCi0gICAgICAgICAgLy8gQ2xlYXIgdGhlIGNvdW50IG9mIGNvbnNlY3V0aXZlIGZhaWx1cmVzCi0gICAgICAgICAgYXBjX3N0b3JlKCRjb25zZWNmYWlsc0tleSwgMCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgYXBjX3N0b3JlKCRjb25zZWNmYWlsc0tleSwgJGNvbnNlY2ZhaWxzKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIC8vIE9oIG5vOyB3ZSBmYWlsZWQgdGhlbSBhbGwuIFRoZSBzeXN0ZW0gaXMgdG90YWxseSBpbGwhCi0gICAgJGVycm9yID0gJ1RTb2NrZXRQb29sOiBBbGwgaG9zdHMgaW4gcG9vbCBhcmUgZG93bi4gJzsKLSAgICAkaG9zdHMgPSBhcnJheSgpOwotICAgIGZvcmVhY2ggKCR0aGlzLT5zZXJ2ZXJzXyBhcyAkc2VydmVyKSB7Ci0gICAgICAkaG9zdHMgW109ICRzZXJ2ZXJbJ2hvc3QnXS4nOicuJHNlcnZlclsncG9ydCddOwotICAgIH0KLSAgICAkaG9zdGxpc3QgPSBpbXBsb2RlKCcsJywgJGhvc3RzKTsKLSAgICAkZXJyb3IgLj0gJygnLiRob3N0bGlzdC4nKSc7Ci0gICAgaWYgKCR0aGlzLT5kZWJ1Z18pIHsKLSAgICAgIGNhbGxfdXNlcl9mdW5jKCR0aGlzLT5kZWJ1Z0hhbmRsZXJfLCAkZXJyb3IpOwotICAgIH0KLSAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigkZXJyb3IpOwotICB9Ci19CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvVHJhbnNwb3J0L1RUcmFuc3BvcnQucGhwIGIvbGliL3BocC9saWIvVGhyaWZ0L1RyYW5zcG9ydC9UVHJhbnNwb3J0LnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU0NDM2Ni4uMDAwMDAwMAotLS0gYS9saWIvcGhwL2xpYi9UaHJpZnQvVHJhbnNwb3J0L1RUcmFuc3BvcnQucGhwCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotPD9waHAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAotICovCi0KLW5hbWVzcGFjZSBUaHJpZnRcVHJhbnNwb3J0OwotCi11c2UgVGhyaWZ0XEZhY3RvcnlcVFN0cmluZ0Z1bmNGYWN0b3J5OwotCi0vKioKLSAqIEJhc2UgaW50ZXJmYWNlIGZvciBhIHRyYW5zcG9ydCBhZ2VudC4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0Ci0gKi8KLWFic3RyYWN0IGNsYXNzIFRUcmFuc3BvcnQgewotCi0gIC8qKgotICAgKiBXaGV0aGVyIHRoaXMgdHJhbnNwb3J0IGlzIG9wZW4uCi0gICAqCi0gICAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIGlmIG9wZW4KLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiBpc09wZW4oKTsKLQotICAvKioKLSAgICogT3BlbiB0aGUgdHJhbnNwb3J0IGZvciByZWFkaW5nL3dyaXRpbmcKLSAgICoKLSAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIGNhbm5vdCBvcGVuCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gb3BlbigpOwotCi0gIC8qKgotICAgKiBDbG9zZSB0aGUgdHJhbnNwb3J0LgotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIGNsb3NlKCk7Ci0KLSAgLyoqCi0gICAqIFJlYWQgc29tZSBkYXRhIGludG8gdGhlIGFycmF5LgotICAgKgotICAgKiBAcGFyYW0gaW50ICAgICRsZW4gSG93IG11Y2ggdG8gcmVhZAotICAgKiBAcmV0dXJuIHN0cmluZyBUaGUgZGF0YSB0aGF0IGhhcyBiZWVuIHJlYWQKLSAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIGNhbm5vdCByZWFkIGFueSBtb3JlIGRhdGEKLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiByZWFkKCRsZW4pOwotCi0gIC8qKgotICAgKiBHdWFyYW50ZWVzIHRoYXQgdGhlIGZ1bGwgYW1vdW50IG9mIGRhdGEgaXMgcmVhZC4KLSAgICoKLSAgICogQHJldHVybiBzdHJpbmcgVGhlIGRhdGEsIG9mIGV4YWN0IGxlbmd0aAotICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgY2Fubm90IHJlYWQgZGF0YQotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRBbGwoJGxlbikgewotICAgIC8vIHJldHVybiAkdGhpcy0+cmVhZCgkbGVuKTsKLQotICAgICRkYXRhID0gJyc7Ci0gICAgJGdvdCA9IDA7Ci0gICAgd2hpbGUgKCgkZ290ID0gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCRkYXRhKSkgPCAkbGVuKSB7Ci0gICAgICAkZGF0YSAuPSAkdGhpcy0+cmVhZCgkbGVuIC0gJGdvdCk7Ci0gICAgfQotICAgIHJldHVybiAkZGF0YTsKLSAgfQotCi0gIC8qKgotICAgKiBXcml0ZXMgdGhlIGdpdmVuIGRhdGEgb3V0LgotICAgKgotICAgKiBAcGFyYW0gc3RyaW5nICRidWYgIFRoZSBkYXRhIHRvIHdyaXRlCi0gICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiB3cml0aW5nIGZhaWxzCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gd3JpdGUoJGJ1Zik7Ci0KLSAgLyoqCi0gICAqIEZsdXNoZXMgYW55IHBlbmRpbmcgZGF0YSBvdXQgb2YgYSBidWZmZXIKLSAgICoKLSAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIGEgd3JpdGluZyBlcnJvciBvY2N1cnMKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBmbHVzaCgpIHt9Ci19CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvVHlwZS9UQ29uc3RhbnQucGhwIGIvbGliL3BocC9saWIvVGhyaWZ0L1R5cGUvVENvbnN0YW50LnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU5Y2ZkMi4uMDAwMDAwMAotLS0gYS9saWIvcGhwL2xpYi9UaHJpZnQvVHlwZS9UQ29uc3RhbnQucGhwCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotPD9waHAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0Ci0gKi8KLQotbmFtZXNwYWNlIFRocmlmdFxUeXBlOwotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIGNvbnN0YW50IE1hbmFnZW1lbnQKLSAqLwotYWJzdHJhY3QgY2xhc3MgVENvbnN0YW50Ci17Ci0gICAgLyoqCi0gICAgICogRG9uJ3QgaW5zdGFuY2lhdGUgdGhpcyBjbGFzcwotICAgICAqLwotICAgIHByb3RlY3RlZCBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpIHt9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBjb25zdGFudCB2YWx1ZQotICAgICAqIEBwYXJhbSBzdHJpbmcgJGNvbnN0YW50Ci0gICAgICogQHJldHVybiBtaXhlZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0KCRjb25zdGFudCkKLSAgICB7Ci0gICAgICAgIGlmKGlzX251bGwoc3RhdGljOjokJGNvbnN0YW50KSkKLSAgICAgICAgewotICAgICAgICAgICAgc3RhdGljOjokJGNvbnN0YW50ID0gY2FsbF91c2VyX2Z1bmMoCi0gICAgICAgICAgICAgICAgICAgIHNwcmludGYoJ3N0YXRpYzo6aW5pdF8lcycsICRjb25zdGFudCkKLSAgICAgICAgICAgICAgICApOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHN0YXRpYzo6JCRjb25zdGFudDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvVHlwZS9UTWVzc2FnZVR5cGUucGhwIGIvbGliL3BocC9saWIvVGhyaWZ0L1R5cGUvVE1lc3NhZ2VUeXBlLnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjgxYzQ1Yy4uMDAwMDAwMAotLS0gYS9saWIvcGhwL2xpYi9UaHJpZnQvVHlwZS9UTWVzc2FnZVR5cGUucGhwCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPD9waHAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0Ci0gKi8KLQotbmFtZXNwYWNlIFRocmlmdFxUeXBlOwotCi0vKioKLSAqIE1lc3NhZ2UgdHlwZXMgZm9yIFJQQwotICovCi1jbGFzcyBUTWVzc2FnZVR5cGUgewotICBjb25zdCBDQUxMICA9IDE7Ci0gIGNvbnN0IFJFUExZID0gMjsKLSAgY29uc3QgRVhDRVBUSU9OID0gMzsKLSAgY29uc3QgT05FV0FZID0gNDsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvVHlwZS9UVHlwZS5waHAgYi9saWIvcGhwL2xpYi9UaHJpZnQvVHlwZS9UVHlwZS5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxY2YyMjguLjAwMDAwMDAKLS0tIGEvbGliL3BocC9saWIvVGhyaWZ0L1R5cGUvVFR5cGUucGhwCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotPD9waHAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0Ci0gKi8KLQotbmFtZXNwYWNlIFRocmlmdFxUeXBlOwotCi0vKioKLSAqIERhdGEgdHlwZXMgdGhhdCBjYW4gYmUgc2VudCB2aWEgVGhyaWZ0Ci0gKi8KLWNsYXNzIFRUeXBlIHsKLSAgY29uc3QgU1RPUCAgID0gMDsKLSAgY29uc3QgVk9JRCAgID0gMTsKLSAgY29uc3QgQk9PTCAgID0gMjsKLSAgY29uc3QgQllURSAgID0gMzsKLSAgY29uc3QgSTA4ICAgID0gMzsKLSAgY29uc3QgRE9VQkxFID0gNDsKLSAgY29uc3QgSTE2ICAgID0gNjsKLSAgY29uc3QgSTMyICAgID0gODsKLSAgY29uc3QgSTY0ICAgID0gMTA7Ci0gIGNvbnN0IFNUUklORyA9IDExOwotICBjb25zdCBVVEY3ICAgPSAxMTsKLSAgY29uc3QgU1RSVUNUID0gMTI7Ci0gIGNvbnN0IE1BUCAgICA9IDEzOwotICBjb25zdCBTRVQgICAgPSAxNDsKLSAgY29uc3QgTFNUICAgID0gMTU7ICAgIC8vIE4uQi4gY2Fubm90IHVzZSBMSVNUIGtleXdvcmQgaW4gUEhQIQotICBjb25zdCBVVEY4ICAgPSAxNjsKLSAgY29uc3QgVVRGMTYgID0gMTc7Ci19CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVEJ1ZmZlcmVkVHJhbnNwb3J0LnBocCBiL2xpYi9waHAvbGliL1RyYW5zcG9ydC9UQnVmZmVyZWRUcmFuc3BvcnQucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1M2M1YWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVEJ1ZmZlcmVkVHJhbnNwb3J0LnBocApAQCAtMCwwICsxLDIwNiBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcVHJhbnNwb3J0OworCit1c2UgVGhyaWZ0XEV4Y2VwdGlvblxUVHJhbnNwb3J0RXhjZXB0aW9uOwordXNlIFRocmlmdFxGYWN0b3J5XFRTdHJpbmdGdW5jRmFjdG9yeTsKKworLyoqCisgKiBCdWZmZXJlZCB0cmFuc3BvcnQuIFN0b3JlcyBkYXRhIHRvIGFuIGludGVybmFsIGJ1ZmZlciB0aGF0IGl0IGRvZXNuJ3QKKyAqIGFjdHVhbGx5IHdyaXRlIG91dCB1bnRpbCBmbHVzaCBpcyBjYWxsZWQuIEZvciByZWFkaW5nLCB3ZSBkbyBhIGdyZWVkeQorICogcmVhZCBhbmQgdGhlbiBzZXJ2ZSBkYXRhIG91dCBvZiB0aGUgaW50ZXJuYWwgYnVmZmVyLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKKyAqLworY2xhc3MgVEJ1ZmZlcmVkVHJhbnNwb3J0IGV4dGVuZHMgVFRyYW5zcG9ydAoreworICAgIC8qKgorICAgICAqIFRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydAorICAgICAqCisgICAgICogQHZhciBUVHJhbnNwb3J0CisgICAgICovCisgICAgcHJvdGVjdGVkICR0cmFuc3BvcnRfOworCisgICAgLyoqCisgICAgICogVGhlIHJlY2VpdmUgYnVmZmVyIHNpemUKKyAgICAgKgorICAgICAqIEB2YXIgaW50CisgICAgICovCisgICAgcHJvdGVjdGVkICRyQnVmU2l6ZV8gPSA1MTI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgd3JpdGUgYnVmZmVyIHNpemUKKyAgICAgKgorICAgICAqIEB2YXIgaW50CisgICAgICovCisgICAgcHJvdGVjdGVkICR3QnVmU2l6ZV8gPSA1MTI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgd3JpdGUgYnVmZmVyLgorICAgICAqCisgICAgICogQHZhciBzdHJpbmcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJHdCdWZfID0gJyc7CisKKyAgICAvKioKKyAgICAgKiBUaGUgcmVhZCBidWZmZXIuCisgICAgICoKKyAgICAgKiBAdmFyIHN0cmluZworICAgICAqLworICAgIHByb3RlY3RlZCAkckJ1Zl8gPSAnJzsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLiBDcmVhdGVzIGEgYnVmZmVyZWQgdHJhbnNwb3J0IGFyb3VuZCBhbiB1bmRlcmx5aW5nIHRyYW5zcG9ydAorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkdHJhbnNwb3J0LCAkckJ1ZlNpemUgPSA1MTIsICR3QnVmU2l6ZSA9IDUxMikKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnRfID0gJHRyYW5zcG9ydDsKKyAgICAgICAgJHRoaXMtPnJCdWZTaXplXyA9ICRyQnVmU2l6ZTsKKyAgICAgICAgJHRoaXMtPndCdWZTaXplXyA9ICR3QnVmU2l6ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gaXNPcGVuKCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+dHJhbnNwb3J0Xy0+aXNPcGVuKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQGluaGVyaXRkb2MKKyAgICAgKgorICAgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBvcGVuKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnRfLT5vcGVuKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGNsb3NlKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnRfLT5jbG9zZSgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBwdXRCYWNrKCRkYXRhKQorICAgIHsKKyAgICAgICAgaWYgKFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkdGhpcy0+ckJ1Zl8pID09PSAwKSB7CisgICAgICAgICAgICAkdGhpcy0+ckJ1Zl8gPSAkZGF0YTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICR0aGlzLT5yQnVmXyA9ICgkZGF0YSAuICR0aGlzLT5yQnVmXyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgcmVhc29uIHRoYXQgd2UgY3VzdG9taXplIHJlYWRBbGwgaGVyZSBpcyB0aGF0IHRoZSBtYWpvcml0eSBvZiBQSFAKKyAgICAgKiBzdHJlYW1zIGFyZSBhbHJlYWR5IGludGVybmFsbHkgYnVmZmVyZWQgYnkgUEhQLiBUaGUgc29ja2V0IHN0cmVhbSwgZm9yCisgICAgICogZXhhbXBsZSwgYnVmZmVycyBpbnRlcm5hbGx5IGFuZCBibG9ja3MgaWYgeW91IGNhbGwgcmVhZCB3aXRoICRsZW4gZ3JlYXRlcgorICAgICAqIHRoYW4gdGhlIGFtb3VudCBvZiBkYXRhIGF2YWlsYWJsZSwgdW5saWtlIHJlY3YoKSBpbiBDLgorICAgICAqCisgICAgICogVGhlcmVmb3JlLCB1c2UgdGhlIHJlYWRBbGwgbWV0aG9kIG9mIHRoZSB3cmFwcGVkIHRyYW5zcG9ydCBpbnNpZGUKKyAgICAgKiB0aGUgYnVmZmVyZWQgcmVhZEFsbC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkQWxsKCRsZW4pCisgICAgeworICAgICAgICAkaGF2ZSA9IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkdGhpcy0+ckJ1Zl8pOworICAgICAgICBpZiAoJGhhdmUgPT0gMCkgeworICAgICAgICAgICAgJGRhdGEgPSAkdGhpcy0+dHJhbnNwb3J0Xy0+cmVhZEFsbCgkbGVuKTsKKyAgICAgICAgfSBlbHNlaWYgKCRoYXZlIDwgJGxlbikgeworICAgICAgICAgICAgJGRhdGEgPSAkdGhpcy0+ckJ1Zl87CisgICAgICAgICAgICAkdGhpcy0+ckJ1Zl8gPSAnJzsKKyAgICAgICAgICAgICRkYXRhIC49ICR0aGlzLT50cmFuc3BvcnRfLT5yZWFkQWxsKCRsZW4gLSAkaGF2ZSk7CisgICAgICAgIH0gZWxzZWlmICgkaGF2ZSA9PSAkbGVuKSB7CisgICAgICAgICAgICAkZGF0YSA9ICR0aGlzLT5yQnVmXzsKKyAgICAgICAgICAgICR0aGlzLT5yQnVmXyA9ICcnOworICAgICAgICB9IGVsc2VpZiAoJGhhdmUgPiAkbGVuKSB7CisgICAgICAgICAgICAkZGF0YSA9IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN1YnN0cigkdGhpcy0+ckJ1Zl8sIDAsICRsZW4pOworICAgICAgICAgICAgJHRoaXMtPnJCdWZfID0gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3Vic3RyKCR0aGlzLT5yQnVmXywgJGxlbik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gJGRhdGE7CisgICAgfQorCisgICAgLyoqCisgICAgICogQGluaGVyaXRkb2MKKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnQgJGxlbgorICAgICAqIEByZXR1cm4gc3RyaW5nCisgICAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWQoJGxlbikKKyAgICB7CisgICAgICAgIGlmIChUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHRoaXMtPnJCdWZfKSA9PT0gMCkgeworICAgICAgICAgICAgJHRoaXMtPnJCdWZfID0gJHRoaXMtPnRyYW5zcG9ydF8tPnJlYWQoJHRoaXMtPnJCdWZTaXplXyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCR0aGlzLT5yQnVmXykgPD0gJGxlbikgeworICAgICAgICAgICAgJHJldCA9ICR0aGlzLT5yQnVmXzsKKyAgICAgICAgICAgICR0aGlzLT5yQnVmXyA9ICcnOworCisgICAgICAgICAgICByZXR1cm4gJHJldDsKKyAgICAgICAgfQorCisgICAgICAgICRyZXQgPSBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdWJzdHIoJHRoaXMtPnJCdWZfLCAwLCAkbGVuKTsKKyAgICAgICAgJHRoaXMtPnJCdWZfID0gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3Vic3RyKCR0aGlzLT5yQnVmXywgJGxlbik7CisKKyAgICAgICAgcmV0dXJuICRyZXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQGluaGVyaXRkb2MKKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJpbmcgJGJ1ZgorICAgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZSgkYnVmKQorICAgIHsKKyAgICAgICAgJHRoaXMtPndCdWZfIC49ICRidWY7CisgICAgICAgIGlmIChUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHRoaXMtPndCdWZfKSA+PSAkdGhpcy0+d0J1ZlNpemVfKSB7CisgICAgICAgICAgICAkb3V0ID0gJHRoaXMtPndCdWZfOworCisgICAgICAgICAgICAvLyBOb3RlIHRoYXQgd2UgY2xlYXIgdGhlIGludGVybmFsIHdCdWZfIHByaW9yIHRvIHRoZSB1bmRlcmx5aW5nIHdyaXRlCisgICAgICAgICAgICAvLyB0byBlbnN1cmUgd2UncmUgaW4gYSBzYW5lIHN0YXRlIChpLmUuIGludGVybmFsIGJ1ZmZlciBjbGVhbmVkKQorICAgICAgICAgICAgLy8gaWYgdGhlIHVuZGVybHlpbmcgd3JpdGUgdGhyb3dzIHVwIGFuIGV4Y2VwdGlvbgorICAgICAgICAgICAgJHRoaXMtPndCdWZfID0gJyc7CisgICAgICAgICAgICAkdGhpcy0+dHJhbnNwb3J0Xy0+d3JpdGUoJG91dCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAaW5oZXJpdGRvYworICAgICAqCisgICAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIGZsdXNoKCkKKyAgICB7CisgICAgICAgIGlmIChUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHRoaXMtPndCdWZfKSA+IDApIHsKKyAgICAgICAgICAgICRvdXQgPSAkdGhpcy0+d0J1Zl87CisKKyAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB3ZSBjbGVhciB0aGUgaW50ZXJuYWwgd0J1Zl8gcHJpb3IgdG8gdGhlIHVuZGVybHlpbmcgd3JpdGUKKyAgICAgICAgICAgIC8vIHRvIGVuc3VyZSB3ZSdyZSBpbiBhIHNhbmUgc3RhdGUgKGkuZS4gaW50ZXJuYWwgYnVmZmVyIGNsZWFuZWQpCisgICAgICAgICAgICAvLyBpZiB0aGUgdW5kZXJseWluZyB3cml0ZSB0aHJvd3MgdXAgYW4gZXhjZXB0aW9uCisgICAgICAgICAgICAkdGhpcy0+d0J1Zl8gPSAnJzsKKyAgICAgICAgICAgICR0aGlzLT50cmFuc3BvcnRfLT53cml0ZSgkb3V0KTsKKyAgICAgICAgfQorICAgICAgICAkdGhpcy0+dHJhbnNwb3J0Xy0+Zmx1c2goKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVEN1cmxDbGllbnQucGhwIGIvbGliL3BocC9saWIvVHJhbnNwb3J0L1RDdXJsQ2xpZW50LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODJiNDNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvVHJhbnNwb3J0L1RDdXJsQ2xpZW50LnBocApAQCAtMCwwICsxLDI3NiBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcVHJhbnNwb3J0OworCit1c2UgVGhyaWZ0XEV4Y2VwdGlvblxUVHJhbnNwb3J0RXhjZXB0aW9uOwordXNlIFRocmlmdFxGYWN0b3J5XFRTdHJpbmdGdW5jRmFjdG9yeTsKKworLyoqCisgKiBIVFRQIGNsaWVudCBmb3IgVGhyaWZ0CisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAorICovCitjbGFzcyBUQ3VybENsaWVudCBleHRlbmRzIFRUcmFuc3BvcnQKK3sKKyAgICBwcml2YXRlIHN0YXRpYyAkY3VybEhhbmRsZTsKKworICAgIC8qKgorICAgICAqIFRoZSBob3N0IHRvIGNvbm5lY3QgdG8KKyAgICAgKgorICAgICAqIEB2YXIgc3RyaW5nCisgICAgICovCisgICAgcHJvdGVjdGVkICRob3N0XzsKKworICAgIC8qKgorICAgICAqIFRoZSBwb3J0IHRvIGNvbm5lY3Qgb24KKyAgICAgKgorICAgICAqIEB2YXIgaW50CisgICAgICovCisgICAgcHJvdGVjdGVkICRwb3J0XzsKKworICAgIC8qKgorICAgICAqIFRoZSBVUkkgdG8gcmVxdWVzdAorICAgICAqCisgICAgICogQHZhciBzdHJpbmcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJHVyaV87CisKKyAgICAvKioKKyAgICAgKiBUaGUgc2NoZW1lIHRvIHVzZSBmb3IgdGhlIHJlcXVlc3QsIGkuZS4gaHR0cCwgaHR0cHMKKyAgICAgKgorICAgICAqIEB2YXIgc3RyaW5nCisgICAgICovCisgICAgcHJvdGVjdGVkICRzY2hlbWVfOworCisgICAgLyoqCisgICAgICogQnVmZmVyIGZvciB0aGUgSFRUUCByZXF1ZXN0IGRhdGEKKyAgICAgKgorICAgICAqIEB2YXIgc3RyaW5nCisgICAgICovCisgICAgcHJvdGVjdGVkICRyZXF1ZXN0XzsKKworICAgIC8qKgorICAgICAqIEJ1ZmZlciBmb3IgdGhlIEhUVFAgcmVzcG9uc2UgZGF0YS4KKyAgICAgKgorICAgICAqIEB2YXIgYmluYXJ5IHN0cmluZworICAgICAqLworICAgIHByb3RlY3RlZCAkcmVzcG9uc2VfOworCisgICAgLyoqCisgICAgICogUmVhZCB0aW1lb3V0CisgICAgICoKKyAgICAgKiBAdmFyIGZsb2F0CisgICAgICovCisgICAgcHJvdGVjdGVkICR0aW1lb3V0XzsKKworICAgIC8qKgorICAgICAqIGh0dHAgaGVhZGVycworICAgICAqCisgICAgICogQHZhciBhcnJheQorICAgICAqLworICAgIHByb3RlY3RlZCAkaGVhZGVyc187CisKKyAgICAvKioKKyAgICAgKiBNYWtlIGEgbmV3IEhUVFAgY2xpZW50LgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAkaG9zdAorICAgICAqIEBwYXJhbSBpbnQgJHBvcnQKKyAgICAgKiBAcGFyYW0gc3RyaW5nICR1cmkKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGhvc3QsICRwb3J0ID0gODAsICR1cmkgPSAnJywgJHNjaGVtZSA9ICdodHRwJykKKyAgICB7CisgICAgICAgIGlmICgoVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCR1cmkpID4gMCkgJiYgKCR1cml7MH0gIT0gJy8nKSkgeworICAgICAgICAgICAgJHVyaSA9ICcvJyAuICR1cmk7CisgICAgICAgIH0KKyAgICAgICAgJHRoaXMtPnNjaGVtZV8gPSAkc2NoZW1lOworICAgICAgICAkdGhpcy0+aG9zdF8gPSAkaG9zdDsKKyAgICAgICAgJHRoaXMtPnBvcnRfID0gJHBvcnQ7CisgICAgICAgICR0aGlzLT51cmlfID0gJHVyaTsKKyAgICAgICAgJHRoaXMtPnJlcXVlc3RfID0gJyc7CisgICAgICAgICR0aGlzLT5yZXNwb25zZV8gPSBudWxsOworICAgICAgICAkdGhpcy0+dGltZW91dF8gPSBudWxsOworICAgICAgICAkdGhpcy0+aGVhZGVyc18gPSBhcnJheSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCByZWFkIHRpbWVvdXQKKyAgICAgKgorICAgICAqIEBwYXJhbSBmbG9hdCAkdGltZW91dAorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRUaW1lb3V0U2VjcygkdGltZW91dCkKKyAgICB7CisgICAgICAgICR0aGlzLT50aW1lb3V0XyA9ICR0aW1lb3V0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhpcyB0cmFuc3BvcnQgaXMgb3Blbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIGlmIG9wZW4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gaXNPcGVuKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIE9wZW4gdGhlIHRyYW5zcG9ydCBmb3IgcmVhZGluZy93cml0aW5nCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgY2Fubm90IG9wZW4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gb3BlbigpCisgICAgeworICAgIH0KKworICAgIC8qKgorICAgICAqIENsb3NlIHRoZSB0cmFuc3BvcnQuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIGNsb3NlKCkKKyAgICB7CisgICAgICAgICR0aGlzLT5yZXF1ZXN0XyA9ICcnOworICAgICAgICAkdGhpcy0+cmVzcG9uc2VfID0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkIHNvbWUgZGF0YSBpbnRvIHRoZSBhcnJheS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnQgJGxlbiBIb3cgbXVjaCB0byByZWFkCisgICAgICogQHJldHVybiBzdHJpbmcgVGhlIGRhdGEgdGhhdCBoYXMgYmVlbiByZWFkCisgICAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIGNhbm5vdCByZWFkIGFueSBtb3JlIGRhdGEKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZCgkbGVuKQorICAgIHsKKyAgICAgICAgaWYgKCRsZW4gPj0gc3RybGVuKCR0aGlzLT5yZXNwb25zZV8pKSB7CisgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnJlc3BvbnNlXzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICRyZXQgPSBzdWJzdHIoJHRoaXMtPnJlc3BvbnNlXywgMCwgJGxlbik7CisgICAgICAgICAgICAkdGhpcy0+cmVzcG9uc2VfID0gc3Vic3RyKCR0aGlzLT5yZXNwb25zZV8sICRsZW4pOworCisgICAgICAgICAgICByZXR1cm4gJHJldDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEd1YXJhbnRlZXMgdGhhdCB0aGUgZnVsbCBhbW91bnQgb2YgZGF0YSBpcyByZWFkLiBTaW5jZSBUQ3VybENsaWVudCBnZXRzIGVudGlyZSBwYXlsb2FkIGF0CisgICAgICogb25jZSwgcGFyZW50IHJlYWRBbGwgY2Fubm90IGJlIHVzZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHN0cmluZyBUaGUgZGF0YSwgb2YgZXhhY3QgbGVuZ3RoCisgICAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIGNhbm5vdCByZWFkIGRhdGEKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEFsbCgkbGVuKQorICAgIHsKKyAgICAgICAgJGRhdGEgPSAkdGhpcy0+cmVhZCgkbGVuKTsKKworICAgICAgICBpZiAoVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCRkYXRhKSAhPT0gJGxlbikgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJ1RDdXJsQ2xpZW50IGNvdWxkIG5vdCByZWFkICcuJGxlbi4nIGJ5dGVzJyk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gJGRhdGE7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGVzIHNvbWUgZGF0YSBpbnRvIHRoZSBwZW5kaW5nIGJ1ZmZlcgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAkYnVmIFRoZSBkYXRhIHRvIHdyaXRlCisgICAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIHdyaXRpbmcgZmFpbHMKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJGJ1ZikKKyAgICB7CisgICAgICAgICR0aGlzLT5yZXF1ZXN0XyAuPSAkYnVmOworICAgIH0KKworICAgIC8qKgorICAgICAqIE9wZW5zIGFuZCBzZW5kcyB0aGUgYWN0dWFsIHJlcXVlc3Qgb3ZlciB0aGUgSFRUUCBjb25uZWN0aW9uCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgYSB3cml0aW5nIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBmbHVzaCgpCisgICAgeworICAgICAgICBpZiAoIXNlbGY6OiRjdXJsSGFuZGxlKSB7CisgICAgICAgICAgICByZWdpc3Rlcl9zaHV0ZG93bl9mdW5jdGlvbihhcnJheSgnVGhyaWZ0XFxUcmFuc3BvcnRcXFRDdXJsQ2xpZW50JywgJ2Nsb3NlQ3VybEhhbmRsZScpKTsKKyAgICAgICAgICAgIHNlbGY6OiRjdXJsSGFuZGxlID0gY3VybF9pbml0KCk7CisgICAgICAgICAgICBjdXJsX3NldG9wdChzZWxmOjokY3VybEhhbmRsZSwgQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiwgdHJ1ZSk7CisgICAgICAgICAgICBjdXJsX3NldG9wdChzZWxmOjokY3VybEhhbmRsZSwgQ1VSTE9QVF9CSU5BUllUUkFOU0ZFUiwgdHJ1ZSk7CisgICAgICAgICAgICBjdXJsX3NldG9wdChzZWxmOjokY3VybEhhbmRsZSwgQ1VSTE9QVF9VU0VSQUdFTlQsICdQSFAvVEN1cmxDbGllbnQnKTsKKyAgICAgICAgICAgIGN1cmxfc2V0b3B0KHNlbGY6OiRjdXJsSGFuZGxlLCBDVVJMT1BUX0NVU1RPTVJFUVVFU1QsICdQT1NUJyk7CisgICAgICAgICAgICBjdXJsX3NldG9wdChzZWxmOjokY3VybEhhbmRsZSwgQ1VSTE9QVF9GT0xMT1dMT0NBVElPTiwgdHJ1ZSk7CisgICAgICAgICAgICBjdXJsX3NldG9wdChzZWxmOjokY3VybEhhbmRsZSwgQ1VSTE9QVF9NQVhSRURJUlMsIDEpOworICAgICAgICB9CisgICAgICAgIC8vIEdvZCwgUEhQIHJlYWxseSBoYXMgc29tZSBlc290ZXJpYyB3YXlzIG9mIGRvaW5nIHNpbXBsZSB0aGluZ3MuCisgICAgICAgICRob3N0ID0gJHRoaXMtPmhvc3RfIC4gKCR0aGlzLT5wb3J0XyAhPSA4MCA/ICc6JyAuICR0aGlzLT5wb3J0XyA6ICcnKTsKKyAgICAgICAgJGZ1bGxVcmwgPSAkdGhpcy0+c2NoZW1lXyAuICI6Ly8iIC4gJGhvc3QgLiAkdGhpcy0+dXJpXzsKKworICAgICAgICAkaGVhZGVycyA9IGFycmF5KCk7CisgICAgICAgICRkZWZhdWx0SGVhZGVycyA9IGFycmF5KCdBY2NlcHQnID0+ICdhcHBsaWNhdGlvbi94LXRocmlmdCcsCisgICAgICAgICAgICAnQ29udGVudC1UeXBlJyA9PiAnYXBwbGljYXRpb24veC10aHJpZnQnLAorICAgICAgICAgICAgJ0NvbnRlbnQtTGVuZ3RoJyA9PiBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHRoaXMtPnJlcXVlc3RfKSk7CisgICAgICAgIGZvcmVhY2ggKGFycmF5X21lcmdlKCRkZWZhdWx0SGVhZGVycywgJHRoaXMtPmhlYWRlcnNfKSBhcyAka2V5ID0+ICR2YWx1ZSkgeworICAgICAgICAgICAgJGhlYWRlcnNbXSA9ICIka2V5OiAkdmFsdWUiOworICAgICAgICB9CisKKyAgICAgICAgY3VybF9zZXRvcHQoc2VsZjo6JGN1cmxIYW5kbGUsIENVUkxPUFRfSFRUUEhFQURFUiwgJGhlYWRlcnMpOworCisgICAgICAgIGlmICgkdGhpcy0+dGltZW91dF8gPiAwKSB7CisgICAgICAgICAgICBjdXJsX3NldG9wdChzZWxmOjokY3VybEhhbmRsZSwgQ1VSTE9QVF9USU1FT1VULCAkdGhpcy0+dGltZW91dF8pOworICAgICAgICB9CisgICAgICAgIGN1cmxfc2V0b3B0KHNlbGY6OiRjdXJsSGFuZGxlLCBDVVJMT1BUX1BPU1RGSUVMRFMsICR0aGlzLT5yZXF1ZXN0Xyk7CisgICAgICAgICR0aGlzLT5yZXF1ZXN0XyA9ICcnOworCisgICAgICAgIGN1cmxfc2V0b3B0KHNlbGY6OiRjdXJsSGFuZGxlLCBDVVJMT1BUX1VSTCwgJGZ1bGxVcmwpOworICAgICAgICAkdGhpcy0+cmVzcG9uc2VfID0gY3VybF9leGVjKHNlbGY6OiRjdXJsSGFuZGxlKTsKKyAgICAgICAgJHJlc3BvbnNlRXJyb3IgPSBjdXJsX2Vycm9yKHNlbGY6OiRjdXJsSGFuZGxlKTsKKworICAgICAgICAkY29kZSA9IGN1cmxfZ2V0aW5mbyhzZWxmOjokY3VybEhhbmRsZSwgQ1VSTElORk9fSFRUUF9DT0RFKTsKKworICAgICAgICAvLyBIYW5kbGUgbm9uIDIwMCBzdGF0dXMgY29kZSAvIGNvbm5lY3QgZmFpbHVyZQorICAgICAgICBpZiAoJHRoaXMtPnJlc3BvbnNlXyA9PT0gZmFsc2UgfHwgJGNvZGUgIT09IDIwMCkgeworICAgICAgICAgICAgY3VybF9jbG9zZShzZWxmOjokY3VybEhhbmRsZSk7CisgICAgICAgICAgICBzZWxmOjokY3VybEhhbmRsZSA9IG51bGw7CisgICAgICAgICAgICAkdGhpcy0+cmVzcG9uc2VfID0gbnVsbDsKKyAgICAgICAgICAgICRlcnJvciA9ICdUQ3VybENsaWVudDogQ291bGQgbm90IGNvbm5lY3QgdG8gJyAuICRmdWxsVXJsOworICAgICAgICAgICAgaWYgKCRyZXNwb25zZUVycm9yKSB7CisgICAgICAgICAgICAgICAgJGVycm9yIC49ICcsICcgLiAkcmVzcG9uc2VFcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgkY29kZSkgeworICAgICAgICAgICAgICAgICRlcnJvciAuPSAnLCBIVFRQIHN0YXR1cyBjb2RlOiAnIC4gJGNvZGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigkZXJyb3IsIFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04pOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjbG9zZUN1cmxIYW5kbGUoKQorICAgIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChzZWxmOjokY3VybEhhbmRsZSkgeworICAgICAgICAgICAgICAgIGN1cmxfY2xvc2Uoc2VsZjo6JGN1cmxIYW5kbGUpOworICAgICAgICAgICAgICAgIHNlbGY6OiRjdXJsSGFuZGxlID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoXEV4Y2VwdGlvbiAkeCkgeworICAgICAgICAgICAgZXJyb3JfbG9nKCdUaGVyZSB3YXMgYW4gZXJyb3IgY2xvc2luZyB0aGUgY3VybCBoYW5kbGU6ICcgLiAkeC0+Z2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBhZGRIZWFkZXJzKCRoZWFkZXJzKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmhlYWRlcnNfID0gYXJyYXlfbWVyZ2UoJHRoaXMtPmhlYWRlcnNfLCAkaGVhZGVycyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnQucGhwIGIvbGliL3BocC9saWIvVHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnQucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5ZDE4NjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVEZyYW1lZFRyYW5zcG9ydC5waHAKQEAgLTAsMCArMSwxOTIgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFRyYW5zcG9ydDsKKwordXNlIFRocmlmdFxGYWN0b3J5XFRTdHJpbmdGdW5jRmFjdG9yeTsKKworLyoqCisgKiBGcmFtZWQgdHJhbnNwb3J0LiBXcml0ZXMgYW5kIHJlYWRzIGRhdGEgaW4gY2h1bmtzIHRoYXQgYXJlIHN0YW1wZWQgd2l0aAorICogdGhlaXIgbGVuZ3RoLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKKyAqLworY2xhc3MgVEZyYW1lZFRyYW5zcG9ydCBleHRlbmRzIFRUcmFuc3BvcnQKK3sKKyAgICAvKioKKyAgICAgKiBVbmRlcmx5aW5nIHRyYW5zcG9ydCBvYmplY3QuCisgICAgICoKKyAgICAgKiBAdmFyIFRUcmFuc3BvcnQKKyAgICAgKi8KKyAgICBwcml2YXRlICR0cmFuc3BvcnRfOworCisgICAgLyoqCisgICAgICogQnVmZmVyIGZvciByZWFkIGRhdGEuCisgICAgICoKKyAgICAgKiBAdmFyIHN0cmluZworICAgICAqLworICAgIHByaXZhdGUgJHJCdWZfOworCisgICAgLyoqCisgICAgICogQnVmZmVyIGZvciBxdWV1ZWQgb3V0cHV0IGRhdGEKKyAgICAgKgorICAgICAqIEB2YXIgc3RyaW5nCisgICAgICovCisgICAgcHJpdmF0ZSAkd0J1Zl87CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRvIGZyYW1lIHJlYWRzCisgICAgICoKKyAgICAgKiBAdmFyIGJvb2wKKyAgICAgKi8KKyAgICBwcml2YXRlICRyZWFkXzsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gZnJhbWUgd3JpdGVzCisgICAgICoKKyAgICAgKiBAdmFyIGJvb2wKKyAgICAgKi8KKyAgICBwcml2YXRlICR3cml0ZV87CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBUVHJhbnNwb3J0ICR0cmFuc3BvcnQgVW5kZXJseWluZyB0cmFuc3BvcnQKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHRyYW5zcG9ydCA9IG51bGwsICRyZWFkID0gdHJ1ZSwgJHdyaXRlID0gdHJ1ZSkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnRfID0gJHRyYW5zcG9ydDsKKyAgICAgICAgJHRoaXMtPnJlYWRfID0gJHJlYWQ7CisgICAgICAgICR0aGlzLT53cml0ZV8gPSAkd3JpdGU7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGlzT3BlbigpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPnRyYW5zcG9ydF8tPmlzT3BlbigpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBvcGVuKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnRfLT5vcGVuKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGNsb3NlKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnRfLT5jbG9zZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWRzIGZyb20gdGhlIGJ1ZmZlci4gV2hlbiBtb3JlIGRhdGEgaXMgcmVxdWlyZWQgcmVhZHMgYW5vdGhlciBlbnRpcmUKKyAgICAgKiBjaHVuayBhbmQgc2VydmVzIGZ1dHVyZSByZWFkcyBvdXQgb2YgdGhhdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnQgJGxlbiBIb3cgbXVjaCBkYXRhCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWQoJGxlbikKKyAgICB7CisgICAgICAgIGlmICghJHRoaXMtPnJlYWRfKSB7CisgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnRyYW5zcG9ydF8tPnJlYWQoJGxlbik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCR0aGlzLT5yQnVmXykgPT09IDApIHsKKyAgICAgICAgICAgICR0aGlzLT5yZWFkRnJhbWUoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEp1c3QgcmV0dXJuIGZ1bGwgYnVmZgorICAgICAgICBpZiAoJGxlbiA+PSBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHRoaXMtPnJCdWZfKSkgeworICAgICAgICAgICAgJG91dCA9ICR0aGlzLT5yQnVmXzsKKyAgICAgICAgICAgICR0aGlzLT5yQnVmXyA9IG51bGw7CisKKyAgICAgICAgICAgIHJldHVybiAkb3V0OworICAgICAgICB9CisKKyAgICAgICAgLy8gUmV0dXJuIFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN1YnN0cgorICAgICAgICAkb3V0ID0gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3Vic3RyKCR0aGlzLT5yQnVmXywgMCwgJGxlbik7CisgICAgICAgICR0aGlzLT5yQnVmXyA9IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN1YnN0cigkdGhpcy0+ckJ1Zl8sICRsZW4pOworCisgICAgICAgIHJldHVybiAkb3V0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFB1dCBwcmV2aW91c2x5IHJlYWQgZGF0YSBiYWNrIGludG8gdGhlIGJ1ZmZlcgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAkZGF0YSBkYXRhIHRvIHJldHVybgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBwdXRCYWNrKCRkYXRhKQorICAgIHsKKyAgICAgICAgaWYgKFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkdGhpcy0+ckJ1Zl8pID09PSAwKSB7CisgICAgICAgICAgICAkdGhpcy0+ckJ1Zl8gPSAkZGF0YTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICR0aGlzLT5yQnVmXyA9ICgkZGF0YSAuICR0aGlzLT5yQnVmXyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkcyBhIGNodW5rIG9mIGRhdGEgaW50byB0aGUgaW50ZXJuYWwgcmVhZCBidWZmZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBmdW5jdGlvbiByZWFkRnJhbWUoKQorICAgIHsKKyAgICAgICAgJGJ1ZiA9ICR0aGlzLT50cmFuc3BvcnRfLT5yZWFkQWxsKDQpOworICAgICAgICAkdmFsID0gdW5wYWNrKCdOJywgJGJ1Zik7CisgICAgICAgICRzeiA9ICR2YWxbMV07CisKKyAgICAgICAgJHRoaXMtPnJCdWZfID0gJHRoaXMtPnRyYW5zcG9ydF8tPnJlYWRBbGwoJHN6KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgc29tZSBkYXRhIHRvIHRoZSBwZW5kaW5nIG91dHB1dCBidWZmZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyaW5nICRidWYgVGhlIGRhdGEKKyAgICAgKiBAcGFyYW0gaW50ICRsZW4gTGltaXQgb2YgYnl0ZXMgdG8gd3JpdGUKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJGJ1ZiwgJGxlbiA9IG51bGwpCisgICAgeworICAgICAgICBpZiAoISR0aGlzLT53cml0ZV8pIHsKKyAgICAgICAgICAgIHJldHVybiAkdGhpcy0+dHJhbnNwb3J0Xy0+d3JpdGUoJGJ1ZiwgJGxlbik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoJGxlbiAhPT0gbnVsbCAmJiAkbGVuIDwgVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCRidWYpKSB7CisgICAgICAgICAgICAkYnVmID0gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3Vic3RyKCRidWYsIDAsICRsZW4pOworICAgICAgICB9CisgICAgICAgICR0aGlzLT53QnVmXyAuPSAkYnVmOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlcyB0aGUgb3V0cHV0IGJ1ZmZlciB0byB0aGUgc3RyZWFtIGluIHRoZSBmb3JtYXQgb2YgYSA0LWJ5dGUgbGVuZ3RoCisgICAgICogZm9sbG93ZWQgYnkgdGhlIGFjdHVhbCBkYXRhLgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBmbHVzaCgpCisgICAgeworICAgICAgICBpZiAoISR0aGlzLT53cml0ZV8gfHwgVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCR0aGlzLT53QnVmXykgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuICR0aGlzLT50cmFuc3BvcnRfLT5mbHVzaCgpOworICAgICAgICB9CisKKyAgICAgICAgJG91dCA9IHBhY2soJ04nLCBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHRoaXMtPndCdWZfKSk7CisgICAgICAgICRvdXQgLj0gJHRoaXMtPndCdWZfOworCisgICAgICAgIC8vIE5vdGUgdGhhdCB3ZSBjbGVhciB0aGUgaW50ZXJuYWwgd0J1Zl8gcHJpb3IgdG8gdGhlIHVuZGVybHlpbmcgd3JpdGUKKyAgICAgICAgLy8gdG8gZW5zdXJlIHdlJ3JlIGluIGEgc2FuZSBzdGF0ZSAoaS5lLiBpbnRlcm5hbCBidWZmZXIgY2xlYW5lZCkKKyAgICAgICAgLy8gaWYgdGhlIHVuZGVybHlpbmcgd3JpdGUgdGhyb3dzIHVwIGFuIGV4Y2VwdGlvbgorICAgICAgICAkdGhpcy0+d0J1Zl8gPSAnJzsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydF8tPndyaXRlKCRvdXQpOworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0Xy0+Zmx1c2goKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVEh0dHBDbGllbnQucGhwIGIvbGliL3BocC9saWIvVHJhbnNwb3J0L1RIdHRwQ2xpZW50LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTU4ODA5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvVHJhbnNwb3J0L1RIdHRwQ2xpZW50LnBocApAQCAtMCwwICsxLDI1OCBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcVHJhbnNwb3J0OworCit1c2UgVGhyaWZ0XEV4Y2VwdGlvblxUVHJhbnNwb3J0RXhjZXB0aW9uOwordXNlIFRocmlmdFxGYWN0b3J5XFRTdHJpbmdGdW5jRmFjdG9yeTsKKworLyoqCisgKiBIVFRQIGNsaWVudCBmb3IgVGhyaWZ0CisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAorICovCitjbGFzcyBUSHR0cENsaWVudCBleHRlbmRzIFRUcmFuc3BvcnQKK3sKKyAgICAvKioKKyAgICAgKiBUaGUgaG9zdCB0byBjb25uZWN0IHRvCisgICAgICoKKyAgICAgKiBAdmFyIHN0cmluZworICAgICAqLworICAgIHByb3RlY3RlZCAkaG9zdF87CisKKyAgICAvKioKKyAgICAgKiBUaGUgcG9ydCB0byBjb25uZWN0IG9uCisgICAgICoKKyAgICAgKiBAdmFyIGludAorICAgICAqLworICAgIHByb3RlY3RlZCAkcG9ydF87CisKKyAgICAvKioKKyAgICAgKiBUaGUgVVJJIHRvIHJlcXVlc3QKKyAgICAgKgorICAgICAqIEB2YXIgc3RyaW5nCisgICAgICovCisgICAgcHJvdGVjdGVkICR1cmlfOworCisgICAgLyoqCisgICAgICogVGhlIHNjaGVtZSB0byB1c2UgZm9yIHRoZSByZXF1ZXN0LCBpLmUuIGh0dHAsIGh0dHBzCisgICAgICoKKyAgICAgKiBAdmFyIHN0cmluZworICAgICAqLworICAgIHByb3RlY3RlZCAkc2NoZW1lXzsKKworICAgIC8qKgorICAgICAqIEJ1ZmZlciBmb3IgdGhlIEhUVFAgcmVxdWVzdCBkYXRhCisgICAgICoKKyAgICAgKiBAdmFyIHN0cmluZworICAgICAqLworICAgIHByb3RlY3RlZCAkYnVmXzsKKworICAgIC8qKgorICAgICAqIElucHV0IHNvY2tldCBzdHJlYW0uCisgICAgICoKKyAgICAgKiBAdmFyIHJlc291cmNlCisgICAgICovCisgICAgcHJvdGVjdGVkICRoYW5kbGVfOworCisgICAgLyoqCisgICAgICogUmVhZCB0aW1lb3V0CisgICAgICoKKyAgICAgKiBAdmFyIGZsb2F0CisgICAgICovCisgICAgcHJvdGVjdGVkICR0aW1lb3V0XzsKKworICAgIC8qKgorICAgICAqIGh0dHAgaGVhZGVycworICAgICAqCisgICAgICogQHZhciBhcnJheQorICAgICAqLworICAgIHByb3RlY3RlZCAkaGVhZGVyc187CisKKyAgICAvKioKKyAgICAgKiBDb250ZXh0IGFkZGl0aW9uYWwgb3B0aW9ucworICAgICAqCisgICAgICogQHZhciBhcnJheQorICAgICAqLworICAgIHByb3RlY3RlZCAkY29udGV4dF87CisKKyAgICAvKioKKyAgICAgKiBNYWtlIGEgbmV3IEhUVFAgY2xpZW50LgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAkaG9zdAorICAgICAqIEBwYXJhbSBpbnQgICAgJHBvcnQKKyAgICAgKiBAcGFyYW0gc3RyaW5nICR1cmkKKyAgICAgKiBAcGFyYW0gc3RyaW5nICRzY2hlbWUKKyAgICAgKiBAcGFyYW0gYXJyYXkgICRjb250ZXh0CisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRob3N0LCAkcG9ydCA9IDgwLCAkdXJpID0gJycsICRzY2hlbWUgPSAnaHR0cCcsIGFycmF5ICRjb250ZXh0ID0gYXJyYXkoKSkKKyAgICB7CisgICAgICAgIGlmICgoVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCR1cmkpID4gMCkgJiYgKCR1cml7MH0gIT0gJy8nKSkgeworICAgICAgICAgICAgJHVyaSA9ICcvJyAuICR1cmk7CisgICAgICAgIH0KKyAgICAgICAgJHRoaXMtPnNjaGVtZV8gPSAkc2NoZW1lOworICAgICAgICAkdGhpcy0+aG9zdF8gPSAkaG9zdDsKKyAgICAgICAgJHRoaXMtPnBvcnRfID0gJHBvcnQ7CisgICAgICAgICR0aGlzLT51cmlfID0gJHVyaTsKKyAgICAgICAgJHRoaXMtPmJ1Zl8gPSAnJzsKKyAgICAgICAgJHRoaXMtPmhhbmRsZV8gPSBudWxsOworICAgICAgICAkdGhpcy0+dGltZW91dF8gPSBudWxsOworICAgICAgICAkdGhpcy0+aGVhZGVyc18gPSBhcnJheSgpOworICAgICAgICAkdGhpcy0+Y29udGV4dF8gPSAkY29udGV4dDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgcmVhZCB0aW1lb3V0CisgICAgICoKKyAgICAgKiBAcGFyYW0gZmxvYXQgJHRpbWVvdXQKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gc2V0VGltZW91dFNlY3MoJHRpbWVvdXQpCisgICAgeworICAgICAgICAkdGhpcy0+dGltZW91dF8gPSAkdGltZW91dDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRoaXMgdHJhbnNwb3J0IGlzIG9wZW4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiBvcGVuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIGlzT3BlbigpCisgICAgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPcGVuIHRoZSB0cmFuc3BvcnQgZm9yIHJlYWRpbmcvd3JpdGluZworICAgICAqCisgICAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIGNhbm5vdCBvcGVuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIG9wZW4oKQorICAgIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbG9zZSB0aGUgdHJhbnNwb3J0LgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBjbG9zZSgpCisgICAgeworICAgICAgICBpZiAoJHRoaXMtPmhhbmRsZV8pIHsKKyAgICAgICAgICAgIEBmY2xvc2UoJHRoaXMtPmhhbmRsZV8pOworICAgICAgICAgICAgJHRoaXMtPmhhbmRsZV8gPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZCBzb21lIGRhdGEgaW50byB0aGUgYXJyYXkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW50ICRsZW4gSG93IG11Y2ggdG8gcmVhZAorICAgICAqIEByZXR1cm4gc3RyaW5nIFRoZSBkYXRhIHRoYXQgaGFzIGJlZW4gcmVhZAorICAgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBjYW5ub3QgcmVhZCBhbnkgbW9yZSBkYXRhCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWQoJGxlbikKKyAgICB7CisgICAgICAgICRkYXRhID0gQGZyZWFkKCR0aGlzLT5oYW5kbGVfLCAkbGVuKTsKKyAgICAgICAgaWYgKCRkYXRhID09PSBmYWxzZSB8fCAkZGF0YSA9PT0gJycpIHsKKyAgICAgICAgICAgICRtZCA9IHN0cmVhbV9nZXRfbWV0YV9kYXRhKCR0aGlzLT5oYW5kbGVfKTsKKyAgICAgICAgICAgIGlmICgkbWRbJ3RpbWVkX291dCddKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICdUSHR0cENsaWVudDogdGltZWQgb3V0IHJlYWRpbmcgJyAuICRsZW4gLiAnIGJ5dGVzIGZyb20gJyAuCisgICAgICAgICAgICAgICAgICAgICR0aGlzLT5ob3N0XyAuICc6JyAuICR0aGlzLT5wb3J0XyAuICR0aGlzLT51cmlfLAorICAgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uOjpUSU1FRF9PVVQKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgJ1RIdHRwQ2xpZW50OiBDb3VsZCBub3QgcmVhZCAnIC4gJGxlbiAuICcgYnl0ZXMgZnJvbSAnIC4KKyAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmhvc3RfIC4gJzonIC4gJHRoaXMtPnBvcnRfIC4gJHRoaXMtPnVyaV8sCisgICAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04KKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICRkYXRhOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlcyBzb21lIGRhdGEgaW50byB0aGUgcGVuZGluZyBidWZmZXIKKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJpbmcgJGJ1ZiBUaGUgZGF0YSB0byB3cml0ZQorICAgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiB3cml0aW5nIGZhaWxzCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlKCRidWYpCisgICAgeworICAgICAgICAkdGhpcy0+YnVmXyAuPSAkYnVmOworICAgIH0KKworICAgIC8qKgorICAgICAqIE9wZW5zIGFuZCBzZW5kcyB0aGUgYWN0dWFsIHJlcXVlc3Qgb3ZlciB0aGUgSFRUUCBjb25uZWN0aW9uCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgYSB3cml0aW5nIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBmbHVzaCgpCisgICAgeworICAgICAgICAvLyBHb2QsIFBIUCByZWFsbHkgaGFzIHNvbWUgZXNvdGVyaWMgd2F5cyBvZiBkb2luZyBzaW1wbGUgdGhpbmdzLgorICAgICAgICAkaG9zdCA9ICR0aGlzLT5ob3N0XyAuICgkdGhpcy0+cG9ydF8gIT0gODAgPyAnOicgLiAkdGhpcy0+cG9ydF8gOiAnJyk7CisKKyAgICAgICAgJGhlYWRlcnMgPSBhcnJheSgpOworICAgICAgICAkZGVmYXVsdEhlYWRlcnMgPSBhcnJheSgnSG9zdCcgPT4gJGhvc3QsCisgICAgICAgICAgICAnQWNjZXB0JyA9PiAnYXBwbGljYXRpb24veC10aHJpZnQnLAorICAgICAgICAgICAgJ1VzZXItQWdlbnQnID0+ICdQSFAvVEh0dHBDbGllbnQnLAorICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZScgPT4gJ2FwcGxpY2F0aW9uL3gtdGhyaWZ0JywKKyAgICAgICAgICAgICdDb250ZW50LUxlbmd0aCcgPT4gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCR0aGlzLT5idWZfKSk7CisgICAgICAgIGZvcmVhY2ggKGFycmF5X21lcmdlKCRkZWZhdWx0SGVhZGVycywgJHRoaXMtPmhlYWRlcnNfKSBhcyAka2V5ID0+ICR2YWx1ZSkgeworICAgICAgICAgICAgJGhlYWRlcnNbXSA9ICIka2V5OiAkdmFsdWUiOworICAgICAgICB9CisKKyAgICAgICAgJG9wdGlvbnMgPSAkdGhpcy0+Y29udGV4dF87CisKKyAgICAgICAgJGJhc2VIdHRwT3B0aW9ucyA9IGlzc2V0KCRvcHRpb25zWyJodHRwIl0pID8gJG9wdGlvbnNbImh0dHAiXSA6IGFycmF5KCk7CisKKyAgICAgICAgJGh0dHBPcHRpb25zID0gJGJhc2VIdHRwT3B0aW9ucyArIGFycmF5KCdtZXRob2QnID0+ICdQT1NUJywKKyAgICAgICAgICAgICdoZWFkZXInID0+IGltcGxvZGUoIlxyXG4iLCAkaGVhZGVycyksCisgICAgICAgICAgICAnbWF4X3JlZGlyZWN0cycgPT4gMSwKKyAgICAgICAgICAgICdjb250ZW50JyA9PiAkdGhpcy0+YnVmXyk7CisgICAgICAgIGlmICgkdGhpcy0+dGltZW91dF8gPiAwKSB7CisgICAgICAgICAgICAkaHR0cE9wdGlvbnNbJ3RpbWVvdXQnXSA9ICR0aGlzLT50aW1lb3V0XzsKKyAgICAgICAgfQorICAgICAgICAkdGhpcy0+YnVmXyA9ICcnOworCisgICAgICAgICRvcHRpb25zWyJodHRwIl0gPSAkaHR0cE9wdGlvbnM7CisgICAgICAgICRjb250ZXh0aWQgPSBzdHJlYW1fY29udGV4dF9jcmVhdGUoJG9wdGlvbnMpOworICAgICAgICAkdGhpcy0+aGFuZGxlXyA9IEBmb3BlbigKKyAgICAgICAgICAgICR0aGlzLT5zY2hlbWVfIC4gJzovLycgLiAkaG9zdCAuICR0aGlzLT51cmlfLAorICAgICAgICAgICAgJ3InLAorICAgICAgICAgICAgZmFsc2UsCisgICAgICAgICAgICAkY29udGV4dGlkCisgICAgICAgICk7CisKKyAgICAgICAgLy8gQ29ubmVjdCBmYWlsZWQ/CisgICAgICAgIGlmICgkdGhpcy0+aGFuZGxlXyA9PT0gZmFsc2UpIHsKKyAgICAgICAgICAgICR0aGlzLT5oYW5kbGVfID0gbnVsbDsKKyAgICAgICAgICAgICRlcnJvciA9ICdUSHR0cENsaWVudDogQ291bGQgbm90IGNvbm5lY3QgdG8gJyAuICRob3N0IC4gJHRoaXMtPnVyaV87CisgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigkZXJyb3IsIFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBhZGRIZWFkZXJzKCRoZWFkZXJzKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmhlYWRlcnNfID0gYXJyYXlfbWVyZ2UoJHRoaXMtPmhlYWRlcnNfLCAkaGVhZGVycyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVHJhbnNwb3J0L1RNZW1vcnlCdWZmZXIucGhwIGIvbGliL3BocC9saWIvVHJhbnNwb3J0L1RNZW1vcnlCdWZmZXIucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlZTAzYTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVE1lbW9yeUJ1ZmZlci5waHAKQEAgLTAsMCArMSwxMDYgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFRyYW5zcG9ydDsKKwordXNlIFRocmlmdFxFeGNlcHRpb25cVFRyYW5zcG9ydEV4Y2VwdGlvbjsKK3VzZSBUaHJpZnRcRmFjdG9yeVxUU3RyaW5nRnVuY0ZhY3Rvcnk7CisKKy8qKgorICogQSBtZW1vcnkgYnVmZmVyIGlzIGEgdHJhbnBzb3J0IHRoYXQgc2ltcGx5IHJlYWRzIGZyb20gYW5kIHdyaXRlcyB0byBhbgorICogaW4tbWVtb3J5IHN0cmluZyBidWZmZXIuIEFueXRpbWUgeW91IGNhbGwgd3JpdGUgb24gaXQsIHRoZSBkYXRhIGlzIHNpbXBseQorICogcGxhY2VkIGludG8gYSBidWZmZXIsIGFuZCBhbnl0aW1lIHlvdSBjYWxsIHJlYWQsIGRhdGEgaXMgcmVhZCBmcm9tIHRoYXQKKyAqIGJ1ZmZlci4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0CisgKi8KK2NsYXNzIFRNZW1vcnlCdWZmZXIgZXh0ZW5kcyBUVHJhbnNwb3J0Cit7CisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuIE9wdGlvbmFsbHkgcGFzcyBhbiBpbml0aWFsIHZhbHVlCisgICAgICogZm9yIHRoZSBidWZmZXIuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRidWYgPSAnJykKKyAgICB7CisgICAgICAgICR0aGlzLT5idWZfID0gJGJ1ZjsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgJGJ1Zl8gPSAnJzsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBpc09wZW4oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIG9wZW4oKQorICAgIHsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gY2xvc2UoKQorICAgIHsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJGJ1ZikKKyAgICB7CisgICAgICAgICR0aGlzLT5idWZfIC49ICRidWY7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWQoJGxlbikKKyAgICB7CisgICAgICAgICRidWZMZW5ndGggPSBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHRoaXMtPmJ1Zl8pOworCisgICAgICAgIGlmICgkYnVmTGVuZ3RoID09PSAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAnVE1lbW9yeUJ1ZmZlcjogQ291bGQgbm90IHJlYWQgJyAuCisgICAgICAgICAgICAgICAgJGxlbiAuICcgYnl0ZXMgZnJvbSBidWZmZXIuJywKKyAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOCisgICAgICAgICAgICApOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCRidWZMZW5ndGggPD0gJGxlbikgeworICAgICAgICAgICAgJHJldCA9ICR0aGlzLT5idWZfOworICAgICAgICAgICAgJHRoaXMtPmJ1Zl8gPSAnJzsKKworICAgICAgICAgICAgcmV0dXJuICRyZXQ7CisgICAgICAgIH0KKworICAgICAgICAkcmV0ID0gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3Vic3RyKCR0aGlzLT5idWZfLCAwLCAkbGVuKTsKKyAgICAgICAgJHRoaXMtPmJ1Zl8gPSBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdWJzdHIoJHRoaXMtPmJ1Zl8sICRsZW4pOworCisgICAgICAgIHJldHVybiAkcmV0OworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRCdWZmZXIoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5idWZfOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBhdmFpbGFibGUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkdGhpcy0+YnVmXyk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHB1dEJhY2soJGRhdGEpCisgICAgeworICAgICAgICAkdGhpcy0+YnVmXyA9ICRkYXRhIC4gJHRoaXMtPmJ1Zl87CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVHJhbnNwb3J0L1ROdWxsVHJhbnNwb3J0LnBocCBiL2xpYi9waHAvbGliL1RyYW5zcG9ydC9UTnVsbFRyYW5zcG9ydC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2UwODZiNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1RyYW5zcG9ydC9UTnVsbFRyYW5zcG9ydC5waHAKQEAgLTAsMCArMSw1NiBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcVHJhbnNwb3J0OworCit1c2UgVGhyaWZ0XEV4Y2VwdGlvblxUVHJhbnNwb3J0RXhjZXB0aW9uOworCisvKioKKyAqIFRyYW5zcG9ydCB0aGF0IG9ubHkgYWNjZXB0cyB3cml0ZXMgYW5kIGlnbm9yZXMgdGhlbS4KKyAqIFRoaXMgaXMgdXNlZnVsIGZvciBtZWFzdXJpbmcgdGhlIHNlcmlhbGl6ZWQgc2l6ZSBvZiBzdHJ1Y3R1cmVzLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKKyAqLworY2xhc3MgVE51bGxUcmFuc3BvcnQgZXh0ZW5kcyBUVHJhbnNwb3J0Cit7CisgICAgcHVibGljIGZ1bmN0aW9uIGlzT3BlbigpCisgICAgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gb3BlbigpCisgICAgeworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBjbG9zZSgpCisgICAgeworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkKCRsZW4pCisgICAgeworICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQ2FuJ3QgcmVhZCBmcm9tIFROdWxsVHJhbnNwb3J0LiIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZSgkYnVmKQorICAgIHsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVFBocFN0cmVhbS5waHAgYi9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVFBocFN0cmVhbS5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI4MjNmZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1RyYW5zcG9ydC9UUGhwU3RyZWFtLnBocApAQCAtMCwwICsxLDEyNCBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcVHJhbnNwb3J0OworCit1c2UgVGhyaWZ0XEV4Y2VwdGlvblxURXhjZXB0aW9uOwordXNlIFRocmlmdFxGYWN0b3J5XFRTdHJpbmdGdW5jRmFjdG9yeTsKKworLyoqCisgKiBQaHAgc3RyZWFtIHRyYW5zcG9ydC4gUmVhZHMgdG8gYW5kIHdyaXRlcyBmcm9tIHRoZSBwaHAgc3RhbmRhcmQgc3RyZWFtcworICogcGhwOi8vaW5wdXQgYW5kIHBocDovL291dHB1dAorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKKyAqLworY2xhc3MgVFBocFN0cmVhbSBleHRlbmRzIFRUcmFuc3BvcnQKK3sKKyAgICBjb25zdCBNT0RFX1IgPSAxOworICAgIGNvbnN0IE1PREVfVyA9IDI7CisKKyAgICBwcml2YXRlICRpblN0cmVhbV8gPSBudWxsOworCisgICAgcHJpdmF0ZSAkb3V0U3RyZWFtXyA9IG51bGw7CisKKyAgICBwcml2YXRlICRyZWFkXyA9IGZhbHNlOworCisgICAgcHJpdmF0ZSAkd3JpdGVfID0gZmFsc2U7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJG1vZGUpCisgICAgeworICAgICAgICAkdGhpcy0+cmVhZF8gPSAkbW9kZSAmIHNlbGY6Ok1PREVfUjsKKyAgICAgICAgJHRoaXMtPndyaXRlXyA9ICRtb2RlICYgc2VsZjo6TU9ERV9XOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBvcGVuKCkKKyAgICB7CisgICAgICAgIGlmICgkdGhpcy0+cmVhZF8pIHsKKyAgICAgICAgICAgICR0aGlzLT5pblN0cmVhbV8gPSBAZm9wZW4oc2VsZjo6aW5TdHJlYW1OYW1lKCksICdyJyk7CisgICAgICAgICAgICBpZiAoIWlzX3Jlc291cmNlKCR0aGlzLT5pblN0cmVhbV8pKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oJ1RQaHBTdHJlYW06IENvdWxkIG5vdCBvcGVuIHBocDovL2lucHV0Jyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCR0aGlzLT53cml0ZV8pIHsKKyAgICAgICAgICAgICR0aGlzLT5vdXRTdHJlYW1fID0gQGZvcGVuKCdwaHA6Ly9vdXRwdXQnLCAndycpOworICAgICAgICAgICAgaWYgKCFpc19yZXNvdXJjZSgkdGhpcy0+b3V0U3RyZWFtXykpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbignVFBocFN0cmVhbTogQ291bGQgbm90IG9wZW4gcGhwOi8vb3V0cHV0Jyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gY2xvc2UoKQorICAgIHsKKyAgICAgICAgaWYgKCR0aGlzLT5yZWFkXykgeworICAgICAgICAgICAgQGZjbG9zZSgkdGhpcy0+aW5TdHJlYW1fKTsKKyAgICAgICAgICAgICR0aGlzLT5pblN0cmVhbV8gPSBudWxsOworICAgICAgICB9CisgICAgICAgIGlmICgkdGhpcy0+d3JpdGVfKSB7CisgICAgICAgICAgICBAZmNsb3NlKCR0aGlzLT5vdXRTdHJlYW1fKTsKKyAgICAgICAgICAgICR0aGlzLT5vdXRTdHJlYW1fID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBpc09wZW4oKQorICAgIHsKKyAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAoISR0aGlzLT5yZWFkXyB8fCBpc19yZXNvdXJjZSgkdGhpcy0+aW5TdHJlYW1fKSkgJiYKKyAgICAgICAgICAgICghJHRoaXMtPndyaXRlXyB8fCBpc19yZXNvdXJjZSgkdGhpcy0+b3V0U3RyZWFtXykpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkKCRsZW4pCisgICAgeworICAgICAgICAkZGF0YSA9IEBmcmVhZCgkdGhpcy0+aW5TdHJlYW1fLCAkbGVuKTsKKyAgICAgICAgaWYgKCRkYXRhID09PSBmYWxzZSB8fCAkZGF0YSA9PT0gJycpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCdUUGhwU3RyZWFtOiBDb3VsZCBub3QgcmVhZCAnIC4gJGxlbiAuICcgYnl0ZXMnKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAkZGF0YTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJGJ1ZikKKyAgICB7CisgICAgICAgIHdoaWxlIChUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJGJ1ZikgPiAwKSB7CisgICAgICAgICAgICAkZ290ID0gQGZ3cml0ZSgkdGhpcy0+b3V0U3RyZWFtXywgJGJ1Zik7CisgICAgICAgICAgICBpZiAoJGdvdCA9PT0gMCB8fCAkZ290ID09PSBmYWxzZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAnVFBocFN0cmVhbTogQ291bGQgbm90IHdyaXRlICcgLiBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJGJ1ZikgLiAnIGJ5dGVzJworICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAkYnVmID0gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3Vic3RyKCRidWYsICRnb3QpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGZsdXNoKCkKKyAgICB7CisgICAgICAgIEBmZmx1c2goJHRoaXMtPm91dFN0cmVhbV8pOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGluU3RyZWFtTmFtZSgpCisgICAgeworICAgICAgICBpZiAocGhwX3NhcGlfbmFtZSgpID09ICdjbGknKSB7CisgICAgICAgICAgICByZXR1cm4gJ3BocDovL3N0ZGluJzsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAncGhwOi8vaW5wdXQnOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RyYW5zcG9ydC9UU1NMU29ja2V0LnBocCBiL2xpYi9waHAvbGliL1RyYW5zcG9ydC9UU1NMU29ja2V0LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGEwYWRiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvVHJhbnNwb3J0L1RTU0xTb2NrZXQucGhwCkBAIC0wLDAgKzEsMTE3IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0CisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxUcmFuc3BvcnQ7CisKK3VzZSBUaHJpZnRcRXhjZXB0aW9uXFRFeGNlcHRpb247Cit1c2UgVGhyaWZ0XEV4Y2VwdGlvblxUVHJhbnNwb3J0RXhjZXB0aW9uOwordXNlIFRocmlmdFxGYWN0b3J5XFRTdHJpbmdGdW5jRmFjdG9yeTsKKworLyoqCisgKiBTb2NrZXRzIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUVHJhbnNwb3J0IGludGVyZmFjZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0CisgKi8KK2NsYXNzIFRTU0xTb2NrZXQgZXh0ZW5kcyBUU29ja2V0Cit7CisgICAgLyoqCisgICAgICogUmVtb3RlIHBvcnQKKyAgICAgKgorICAgICAqIEB2YXIgcmVzb3VyY2UKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJGNvbnRleHRfID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFNvY2tldCBjb25zdHJ1Y3RvcgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAkaG9zdCBSZW1vdGUgaG9zdG5hbWUKKyAgICAgKiBAcGFyYW0gaW50ICRwb3J0IFJlbW90ZSBwb3J0CisgICAgICogQHBhcmFtIHJlc291cmNlICRjb250ZXh0IFN0cmVhbSBjb250ZXh0CisgICAgICogQHBhcmFtIGJvb2wgJHBlcnNpc3QgV2hldGhlciB0byB1c2UgYSBwZXJzaXN0ZW50IHNvY2tldAorICAgICAqIEBwYXJhbSBzdHJpbmcgJGRlYnVnSGFuZGxlciBGdW5jdGlvbiB0byBjYWxsIGZvciBlcnJvciBsb2dnaW5nCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KAorICAgICAgICAkaG9zdCA9ICdsb2NhbGhvc3QnLAorICAgICAgICAkcG9ydCA9IDkwOTAsCisgICAgICAgICRjb250ZXh0ID0gbnVsbCwKKyAgICAgICAgJGRlYnVnSGFuZGxlciA9IG51bGwKKyAgICApIHsKKyAgICAgICAgJHRoaXMtPmhvc3RfID0gJHRoaXMtPmdldFNTTEhvc3QoJGhvc3QpOworICAgICAgICAkdGhpcy0+cG9ydF8gPSAkcG9ydDsKKyAgICAgICAgJHRoaXMtPmNvbnRleHRfID0gJGNvbnRleHQ7CisgICAgICAgICR0aGlzLT5kZWJ1Z0hhbmRsZXJfID0gJGRlYnVnSGFuZGxlciA/ICRkZWJ1Z0hhbmRsZXIgOiAnZXJyb3JfbG9nJzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgaG9zdCBuYW1lIHdpdGggU1NMIHRyYW5zcG9ydCBwcm90b2NvbAorICAgICAqIGlmIG5vIHRyYW5zcG9ydCBwcm90b2NvbCBhbHJlYWR5IHNwZWNpZmllZCBpbgorICAgICAqIHRoZSBob3N0IG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyaW5nICRob3N0IEhvc3QgdG8gbGlzdGVuIG9uCisgICAgICogQHJldHVybiBzdHJpbmcgJGhvc3QgICBIb3N0IG5hbWUgd2l0aCB0cmFuc3BvcnQgcHJvdG9jb2wKKyAgICAgKi8KKyAgICBwcml2YXRlIGZ1bmN0aW9uIGdldFNTTEhvc3QoJGhvc3QpCisgICAgeworICAgICAgICAkdHJhbnNwb3J0X3Byb3RvY29sX2xvYyA9IHN0cnBvcygkaG9zdCwgIjovLyIpOworICAgICAgICBpZiAoJHRyYW5zcG9ydF9wcm90b2NvbF9sb2MgPT09IGZhbHNlKSB7CisgICAgICAgICAgICAkaG9zdCA9ICdzc2w6Ly8nIC4gJGhvc3Q7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICRob3N0OworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbm5lY3RzIHRoZSBzb2NrZXQuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIG9wZW4oKQorICAgIHsKKyAgICAgICAgaWYgKCR0aGlzLT5pc09wZW4oKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJ1NvY2tldCBhbHJlYWR5IGNvbm5lY3RlZCcsIFRUcmFuc3BvcnRFeGNlcHRpb246OkFMUkVBRFlfT1BFTik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZW1wdHkoJHRoaXMtPmhvc3RfKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJ0Nhbm5vdCBvcGVuIG51bGwgaG9zdCcsIFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgkdGhpcy0+cG9ydF8gPD0gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJ0Nhbm5vdCBvcGVuIHdpdGhvdXQgcG9ydCcsIFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOKTsKKyAgICAgICAgfQorCisgICAgICAgICR0aGlzLT5oYW5kbGVfID0gQHN0cmVhbV9zb2NrZXRfY2xpZW50KAorICAgICAgICAgICAgJHRoaXMtPmhvc3RfIC4gJzonIC4gJHRoaXMtPnBvcnRfLAorICAgICAgICAgICAgJGVycm5vLAorICAgICAgICAgICAgJGVycnN0ciwKKyAgICAgICAgICAgICR0aGlzLT5zZW5kVGltZW91dFNlY18gKyAoJHRoaXMtPnNlbmRUaW1lb3V0VXNlY18gLyAxMDAwMDAwKSwKKyAgICAgICAgICAgIFNUUkVBTV9DTElFTlRfQ09OTkVDVCwKKyAgICAgICAgICAgICR0aGlzLT5jb250ZXh0XworICAgICAgICApOworCisgICAgICAgIC8vIENvbm5lY3QgZmFpbGVkPworICAgICAgICBpZiAoJHRoaXMtPmhhbmRsZV8gPT09IGZhbHNlKSB7CisgICAgICAgICAgICAkZXJyb3IgPSAnVFNvY2tldDogQ291bGQgbm90IGNvbm5lY3QgdG8gJyAuCisgICAgICAgICAgICAgICAgJHRoaXMtPmhvc3RfIC4gJzonIC4gJHRoaXMtPnBvcnRfIC4gJyAoJyAuICRlcnJzdHIgLiAnIFsnIC4gJGVycm5vIC4gJ10pJzsKKyAgICAgICAgICAgIGlmICgkdGhpcy0+ZGVidWdfKSB7CisgICAgICAgICAgICAgICAgY2FsbF91c2VyX2Z1bmMoJHRoaXMtPmRlYnVnSGFuZGxlcl8sICRlcnJvcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigkZXJyb3IpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVHJhbnNwb3J0L1RTb2NrZXQucGhwIGIvbGliL3BocC9saWIvVHJhbnNwb3J0L1RTb2NrZXQucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxNDdlZmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVFNvY2tldC5waHAKQEAgLTAsMCArMSwzNjYgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFRyYW5zcG9ydDsKKwordXNlIFRocmlmdFxFeGNlcHRpb25cVEV4Y2VwdGlvbjsKK3VzZSBUaHJpZnRcRXhjZXB0aW9uXFRUcmFuc3BvcnRFeGNlcHRpb247Cit1c2UgVGhyaWZ0XEZhY3RvcnlcVFN0cmluZ0Z1bmNGYWN0b3J5OworCisvKioKKyAqIFNvY2tldHMgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRUcmFuc3BvcnQgaW50ZXJmYWNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKKyAqLworY2xhc3MgVFNvY2tldCBleHRlbmRzIFRUcmFuc3BvcnQKK3sKKyAgICAvKioKKyAgICAgKiBIYW5kbGUgdG8gUEhQIHNvY2tldAorICAgICAqCisgICAgICogQHZhciByZXNvdXJjZQorICAgICAqLworICAgIHByb3RlY3RlZCAkaGFuZGxlXyA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBSZW1vdGUgaG9zdG5hbWUKKyAgICAgKgorICAgICAqIEB2YXIgc3RyaW5nCisgICAgICovCisgICAgcHJvdGVjdGVkICRob3N0XyA9ICdsb2NhbGhvc3QnOworCisgICAgLyoqCisgICAgICogUmVtb3RlIHBvcnQKKyAgICAgKgorICAgICAqIEB2YXIgaW50CisgICAgICovCisgICAgcHJvdGVjdGVkICRwb3J0XyA9ICc5MDkwJzsKKworICAgIC8qKgorICAgICAqIFNlbmQgdGltZW91dCBpbiBzZWNvbmRzLgorICAgICAqCisgICAgICogQ29tYmluZWQgd2l0aCBzZW5kVGltZW91dFVzZWMgdGhpcyBpcyB1c2VkIGZvciBzZW5kIHRpbWVvdXRzLgorICAgICAqCisgICAgICogQHZhciBpbnQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJHNlbmRUaW1lb3V0U2VjXyA9IDA7CisKKyAgICAvKioKKyAgICAgKiBTZW5kIHRpbWVvdXQgaW4gbWljcm9zZWNvbmRzLgorICAgICAqCisgICAgICogQ29tYmluZWQgd2l0aCBzZW5kVGltZW91dFNlYyB0aGlzIGlzIHVzZWQgZm9yIHNlbmQgdGltZW91dHMuCisgICAgICoKKyAgICAgKiBAdmFyIGludAorICAgICAqLworICAgIHByb3RlY3RlZCAkc2VuZFRpbWVvdXRVc2VjXyA9IDEwMDAwMDsKKworICAgIC8qKgorICAgICAqIFJlY3YgdGltZW91dCBpbiBzZWNvbmRzCisgICAgICoKKyAgICAgKiBDb21iaW5lZCB3aXRoIHJlY3ZUaW1lb3V0VXNlYyB0aGlzIGlzIHVzZWQgZm9yIHJlY3YgdGltZW91dHMuCisgICAgICoKKyAgICAgKiBAdmFyIGludAorICAgICAqLworICAgIHByb3RlY3RlZCAkcmVjdlRpbWVvdXRTZWNfID0gMDsKKworICAgIC8qKgorICAgICAqIFJlY3YgdGltZW91dCBpbiBtaWNyb3NlY29uZHMKKyAgICAgKgorICAgICAqIENvbWJpbmVkIHdpdGggcmVjdlRpbWVvdXRTZWMgdGhpcyBpcyB1c2VkIGZvciByZWN2IHRpbWVvdXRzLgorICAgICAqCisgICAgICogQHZhciBpbnQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJHJlY3ZUaW1lb3V0VXNlY18gPSA3NTAwMDA7CisKKyAgICAvKioKKyAgICAgKiBQZXJzaXN0ZW50IHNvY2tldCBvciBwbGFpbj8KKyAgICAgKgorICAgICAqIEB2YXIgYm9vbAorICAgICAqLworICAgIHByb3RlY3RlZCAkcGVyc2lzdF8gPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIERlYnVnZ2luZyBvbj8KKyAgICAgKgorICAgICAqIEB2YXIgYm9vbAorICAgICAqLworICAgIHByb3RlY3RlZCAkZGVidWdfID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBEZWJ1ZyBoYW5kbGVyCisgICAgICoKKyAgICAgKiBAdmFyIG1peGVkCisgICAgICovCisgICAgcHJvdGVjdGVkICRkZWJ1Z0hhbmRsZXJfID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFNvY2tldCBjb25zdHJ1Y3RvcgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAkaG9zdCBSZW1vdGUgaG9zdG5hbWUKKyAgICAgKiBAcGFyYW0gaW50ICRwb3J0IFJlbW90ZSBwb3J0CisgICAgICogQHBhcmFtIGJvb2wgJHBlcnNpc3QgV2hldGhlciB0byB1c2UgYSBwZXJzaXN0ZW50IHNvY2tldAorICAgICAqIEBwYXJhbSBzdHJpbmcgJGRlYnVnSGFuZGxlciBGdW5jdGlvbiB0byBjYWxsIGZvciBlcnJvciBsb2dnaW5nCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KAorICAgICAgICAkaG9zdCA9ICdsb2NhbGhvc3QnLAorICAgICAgICAkcG9ydCA9IDkwOTAsCisgICAgICAgICRwZXJzaXN0ID0gZmFsc2UsCisgICAgICAgICRkZWJ1Z0hhbmRsZXIgPSBudWxsCisgICAgKSB7CisgICAgICAgICR0aGlzLT5ob3N0XyA9ICRob3N0OworICAgICAgICAkdGhpcy0+cG9ydF8gPSAkcG9ydDsKKyAgICAgICAgJHRoaXMtPnBlcnNpc3RfID0gJHBlcnNpc3Q7CisgICAgICAgICR0aGlzLT5kZWJ1Z0hhbmRsZXJfID0gJGRlYnVnSGFuZGxlciA/ICRkZWJ1Z0hhbmRsZXIgOiAnZXJyb3JfbG9nJzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2UgJGhhbmRsZQorICAgICAqIEByZXR1cm4gdm9pZAorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRIYW5kbGUoJGhhbmRsZSkKKyAgICB7CisgICAgICAgICR0aGlzLT5oYW5kbGVfID0gJGhhbmRsZTsKKyAgICAgICAgc3RyZWFtX3NldF9ibG9ja2luZygkdGhpcy0+aGFuZGxlXywgZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHNlbmQgdGltZW91dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnQgJHRpbWVvdXQgVGltZW91dCBpbiBtaWxsaXNlY29uZHMuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHNldFNlbmRUaW1lb3V0KCR0aW1lb3V0KQorICAgIHsKKyAgICAgICAgJHRoaXMtPnNlbmRUaW1lb3V0U2VjXyA9IGZsb29yKCR0aW1lb3V0IC8gMTAwMCk7CisgICAgICAgICR0aGlzLT5zZW5kVGltZW91dFVzZWNfID0KKyAgICAgICAgICAgICgkdGltZW91dCAtICgkdGhpcy0+c2VuZFRpbWVvdXRTZWNfICogMTAwMCkpICogMTAwMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSByZWNlaXZlIHRpbWVvdXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW50ICR0aW1lb3V0IFRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRSZWN2VGltZW91dCgkdGltZW91dCkKKyAgICB7CisgICAgICAgICR0aGlzLT5yZWN2VGltZW91dFNlY18gPSBmbG9vcigkdGltZW91dCAvIDEwMDApOworICAgICAgICAkdGhpcy0+cmVjdlRpbWVvdXRVc2VjXyA9CisgICAgICAgICAgICAoJHRpbWVvdXQgLSAoJHRoaXMtPnJlY3ZUaW1lb3V0U2VjXyAqIDEwMDApKSAqIDEwMDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBkZWJ1Z2dpbmcgb3V0cHV0IG9uIG9yIG9mZgorICAgICAqCisgICAgICogQHBhcmFtIGJvb2wgJGRlYnVnCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHNldERlYnVnKCRkZWJ1ZykKKyAgICB7CisgICAgICAgICR0aGlzLT5kZWJ1Z18gPSAkZGVidWc7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBob3N0IHRoYXQgdGhpcyBzb2NrZXQgaXMgY29ubmVjdGVkIHRvCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHN0cmluZyBob3N0CisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIGdldEhvc3QoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5ob3N0XzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHJlbW90ZSBwb3J0IHRoYXQgdGhpcyBzb2NrZXQgaXMgY29ubmVjdGVkIHRvCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGludCBwb3J0CisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIGdldFBvcnQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5wb3J0XzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyB3aGV0aGVyIHRoaXMgaXMgb3BlbgorICAgICAqCisgICAgICogQHJldHVybiBib29sIHRydWUgaWYgdGhlIHNvY2tldCBpcyBvcGVuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIGlzT3BlbigpCisgICAgeworICAgICAgICByZXR1cm4gaXNfcmVzb3VyY2UoJHRoaXMtPmhhbmRsZV8pOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbm5lY3RzIHRoZSBzb2NrZXQuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIG9wZW4oKQorICAgIHsKKyAgICAgICAgaWYgKCR0aGlzLT5pc09wZW4oKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJ1NvY2tldCBhbHJlYWR5IGNvbm5lY3RlZCcsIFRUcmFuc3BvcnRFeGNlcHRpb246OkFMUkVBRFlfT1BFTik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZW1wdHkoJHRoaXMtPmhvc3RfKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJ0Nhbm5vdCBvcGVuIG51bGwgaG9zdCcsIFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgkdGhpcy0+cG9ydF8gPD0gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJ0Nhbm5vdCBvcGVuIHdpdGhvdXQgcG9ydCcsIFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgkdGhpcy0+cGVyc2lzdF8pIHsKKyAgICAgICAgICAgICR0aGlzLT5oYW5kbGVfID0gQHBmc29ja29wZW4oCisgICAgICAgICAgICAgICAgJHRoaXMtPmhvc3RfLAorICAgICAgICAgICAgICAgICR0aGlzLT5wb3J0XywKKyAgICAgICAgICAgICAgICAkZXJybm8sCisgICAgICAgICAgICAgICAgJGVycnN0ciwKKyAgICAgICAgICAgICAgICAkdGhpcy0+c2VuZFRpbWVvdXRTZWNfICsgKCR0aGlzLT5zZW5kVGltZW91dFVzZWNfIC8gMTAwMDAwMCkKKyAgICAgICAgICAgICk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkdGhpcy0+aGFuZGxlXyA9IEBmc29ja29wZW4oCisgICAgICAgICAgICAgICAgJHRoaXMtPmhvc3RfLAorICAgICAgICAgICAgICAgICR0aGlzLT5wb3J0XywKKyAgICAgICAgICAgICAgICAkZXJybm8sCisgICAgICAgICAgICAgICAgJGVycnN0ciwKKyAgICAgICAgICAgICAgICAkdGhpcy0+c2VuZFRpbWVvdXRTZWNfICsgKCR0aGlzLT5zZW5kVGltZW91dFVzZWNfIC8gMTAwMDAwMCkKKyAgICAgICAgICAgICk7CisgICAgICAgIH0KKworICAgICAgICAvLyBDb25uZWN0IGZhaWxlZD8KKyAgICAgICAgaWYgKCR0aGlzLT5oYW5kbGVfID09PSBmYWxzZSkgeworICAgICAgICAgICAgJGVycm9yID0gJ1RTb2NrZXQ6IENvdWxkIG5vdCBjb25uZWN0IHRvICcgLgorICAgICAgICAgICAgICAgICR0aGlzLT5ob3N0XyAuICc6JyAuICR0aGlzLT5wb3J0XyAuICcgKCcgLiAkZXJyc3RyIC4gJyBbJyAuICRlcnJubyAuICddKSc7CisgICAgICAgICAgICBpZiAoJHRoaXMtPmRlYnVnXykgeworICAgICAgICAgICAgICAgIGNhbGxfdXNlcl9mdW5jKCR0aGlzLT5kZWJ1Z0hhbmRsZXJfLCAkZXJyb3IpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oJGVycm9yKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChmdW5jdGlvbl9leGlzdHMoJ3NvY2tldF9pbXBvcnRfc3RyZWFtJykgJiYgZnVuY3Rpb25fZXhpc3RzKCdzb2NrZXRfc2V0X29wdGlvbicpKSB7CisgICAgICAgICAgICAkc29ja2V0ID0gc29ja2V0X2ltcG9ydF9zdHJlYW0oJHRoaXMtPmhhbmRsZV8pOworICAgICAgICAgICAgc29ja2V0X3NldF9vcHRpb24oJHNvY2tldCwgU09MX1RDUCwgVENQX05PREVMQVksIDEpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xvc2VzIHRoZSBzb2NrZXQuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIGNsb3NlKCkKKyAgICB7CisgICAgICAgIEBmY2xvc2UoJHRoaXMtPmhhbmRsZV8pOworICAgICAgICAkdGhpcy0+aGFuZGxlXyA9IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZCBmcm9tIHRoZSBzb2NrZXQgYXQgbW9zdCAkbGVuIGJ5dGVzLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2Qgd2lsbCBub3Qgd2FpdCBmb3IgYWxsIHRoZSByZXF1ZXN0ZWQgZGF0YSwgaXQgd2lsbCByZXR1cm4gYXMKKyAgICAgKiBzb29uIGFzIGFueSBkYXRhIGlzIHJlY2VpdmVkLgorICAgICAqCisgICAgICogQHBhcmFtIGludCAkbGVuIE1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQuCisgICAgICogQHJldHVybiBzdHJpbmcgQmluYXJ5IGRhdGEKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZCgkbGVuKQorICAgIHsKKyAgICAgICAgJG51bGwgPSBudWxsOworICAgICAgICAkcmVhZCA9IGFycmF5KCR0aGlzLT5oYW5kbGVfKTsKKyAgICAgICAgJHJlYWRhYmxlID0gQHN0cmVhbV9zZWxlY3QoCisgICAgICAgICAgICAkcmVhZCwKKyAgICAgICAgICAgICRudWxsLAorICAgICAgICAgICAgJG51bGwsCisgICAgICAgICAgICAkdGhpcy0+cmVjdlRpbWVvdXRTZWNfLAorICAgICAgICAgICAgJHRoaXMtPnJlY3ZUaW1lb3V0VXNlY18KKyAgICAgICAgKTsKKworICAgICAgICBpZiAoJHJlYWRhYmxlID4gMCkgeworICAgICAgICAgICAgJGRhdGEgPSBmcmVhZCgkdGhpcy0+aGFuZGxlXywgJGxlbik7CisgICAgICAgICAgICBpZiAoJGRhdGEgPT09IGZhbHNlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJ1RTb2NrZXQ6IENvdWxkIG5vdCByZWFkICcgLiAkbGVuIC4gJyBieXRlcyBmcm9tICcgLgorICAgICAgICAgICAgICAgICAgICAkdGhpcy0+aG9zdF8gLiAnOicgLiAkdGhpcy0+cG9ydF8pOworICAgICAgICAgICAgfSBlbHNlaWYgKCRkYXRhID09ICcnICYmIGZlb2YoJHRoaXMtPmhhbmRsZV8pKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJ1RTb2NrZXQgcmVhZCAwIGJ5dGVzJyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiAkZGF0YTsKKyAgICAgICAgfSBlbHNlaWYgKCRyZWFkYWJsZSA9PT0gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJ1RTb2NrZXQ6IHRpbWVkIG91dCByZWFkaW5nICcgLiAkbGVuIC4gJyBieXRlcyBmcm9tICcgLgorICAgICAgICAgICAgICAgICR0aGlzLT5ob3N0XyAuICc6JyAuICR0aGlzLT5wb3J0Xyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbignVFNvY2tldDogQ291bGQgbm90IHJlYWQgJyAuICRsZW4gLiAnIGJ5dGVzIGZyb20gJyAuCisgICAgICAgICAgICAgICAgJHRoaXMtPmhvc3RfIC4gJzonIC4gJHRoaXMtPnBvcnRfKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlIHRvIHRoZSBzb2NrZXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyaW5nICRidWYgVGhlIGRhdGEgdG8gd3JpdGUKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJGJ1ZikKKyAgICB7CisgICAgICAgICRudWxsID0gbnVsbDsKKyAgICAgICAgJHdyaXRlID0gYXJyYXkoJHRoaXMtPmhhbmRsZV8pOworCisgICAgICAgIC8vIGtlZXAgd3JpdGluZyB1bnRpbCBhbGwgdGhlIGRhdGEgaGFzIGJlZW4gd3JpdHRlbgorICAgICAgICB3aGlsZSAoVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCRidWYpID4gMCkgeworICAgICAgICAgICAgLy8gd2FpdCBmb3Igc3RyZWFtIHRvIGJlY29tZSBhdmFpbGFibGUgZm9yIHdyaXRpbmcKKyAgICAgICAgICAgICR3cml0YWJsZSA9IEBzdHJlYW1fc2VsZWN0KAorICAgICAgICAgICAgICAgICRudWxsLAorICAgICAgICAgICAgICAgICR3cml0ZSwKKyAgICAgICAgICAgICAgICAkbnVsbCwKKyAgICAgICAgICAgICAgICAkdGhpcy0+c2VuZFRpbWVvdXRTZWNfLAorICAgICAgICAgICAgICAgICR0aGlzLT5zZW5kVGltZW91dFVzZWNfCisgICAgICAgICAgICApOworICAgICAgICAgICAgaWYgKCR3cml0YWJsZSA+IDApIHsKKyAgICAgICAgICAgICAgICAvLyB3cml0ZSBidWZmZXIgdG8gc3RyZWFtCisgICAgICAgICAgICAgICAgJHdyaXR0ZW4gPSBmd3JpdGUoJHRoaXMtPmhhbmRsZV8sICRidWYpOworICAgICAgICAgICAgICAgIGlmICgkd3JpdHRlbiA9PT0gLTEgfHwgJHdyaXR0ZW4gPT09IGZhbHNlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgJ1RTb2NrZXQ6IENvdWxkIG5vdCB3cml0ZSAnIC4gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCRidWYpIC4gJyBieXRlcyAnIC4KKyAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5ob3N0XyAuICc6JyAuICR0aGlzLT5wb3J0XworICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBkZXRlcm1pbmUgaG93IG11Y2ggb2YgdGhlIGJ1ZmZlciBpcyBsZWZ0IHRvIHdyaXRlCisgICAgICAgICAgICAgICAgJGJ1ZiA9IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN1YnN0cigkYnVmLCAkd3JpdHRlbik7CisgICAgICAgICAgICB9IGVsc2VpZiAoJHdyaXRhYmxlID09PSAwKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICdUU29ja2V0OiB0aW1lZCBvdXQgd3JpdGluZyAnIC4gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCRidWYpIC4gJyBieXRlcyBmcm9tICcgLgorICAgICAgICAgICAgICAgICAgICAkdGhpcy0+aG9zdF8gLiAnOicgLiAkdGhpcy0+cG9ydF8KKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgJ1RTb2NrZXQ6IENvdWxkIG5vdCB3cml0ZSAnIC4gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCRidWYpIC4gJyBieXRlcyAnIC4KKyAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmhvc3RfIC4gJzonIC4gJHRoaXMtPnBvcnRfCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZsdXNoIG91dHB1dCB0byB0aGUgc29ja2V0LgorICAgICAqCisgICAgICogU2luY2UgcmVhZCgpLCByZWFkQWxsKCkgYW5kIHdyaXRlKCkgb3BlcmF0ZSBvbiB0aGUgc29ja2V0cyBkaXJlY3RseSwKKyAgICAgKiB0aGlzIGlzIGEgbm8tb3AKKyAgICAgKgorICAgICAqIElmIHlvdSB3aXNoIHRvIGhhdmUgZmx1c2hhYmxlIGJ1ZmZlcmluZyBiZWhhdmlvdXIsIHdyYXAgdGhpcyBUU29ja2V0CisgICAgICogaW4gYSBUQnVmZmVyZWRUcmFuc3BvcnQuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIGZsdXNoKCkKKyAgICB7CisgICAgICAgIC8vIG5vLW9wCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVHJhbnNwb3J0L1RTb2NrZXRQb29sLnBocCBiL2xpYi9waHAvbGliL1RyYW5zcG9ydC9UU29ja2V0UG9vbC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I5ZThkZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1RyYW5zcG9ydC9UU29ja2V0UG9vbC5waHAKQEAgLTAsMCArMSwzMTAgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFRyYW5zcG9ydDsKKwordXNlIFRocmlmdFxFeGNlcHRpb25cVEV4Y2VwdGlvbjsKKworLyoqCisgKiBUaGlzIGxpYnJhcnkgbWFrZXMgdXNlIG9mIEFQQyBjYWNoZSB0byBtYWtlIGhvc3RzIGFzIGRvd24gaW4gYSB3ZWIKKyAqIGVudmlyb25tZW50LiBJZiB5b3UgYXJlIHJ1bm5pbmcgZnJvbSB0aGUgQ0xJIG9yIG9uIGEgc3lzdGVtIHdpdGhvdXQgQVBDCisgKiBpbnN0YWxsZWQsIHRoZW4gdGhlc2UgbnVsbCBmdW5jdGlvbnMgd2lsbCBzdGVwIGluIGFuZCBhY3QgbGlrZSBjYWNoZQorICogbWlzc2VzLgorICovCitpZiAoIWZ1bmN0aW9uX2V4aXN0cygnYXBjX2ZldGNoJykpIHsKKyAgICBmdW5jdGlvbiBhcGNfZmV0Y2goJGtleSkKKyAgICB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiBhcGNfc3RvcmUoJGtleSwgJHZhciwgJHR0bCA9IDApCisgICAgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQorCisvKioKKyAqIFNvY2tldHMgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRUcmFuc3BvcnQgaW50ZXJmYWNlIHRoYXQgYWxsb3dzIGNvbm5lY3Rpb24KKyAqIHRvIGEgcG9vbCBvZiBzZXJ2ZXJzLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKKyAqLworY2xhc3MgVFNvY2tldFBvb2wgZXh0ZW5kcyBUU29ja2V0Cit7CisgICAgLyoqCisgICAgICogUmVtb3RlIHNlcnZlcnMuIEFycmF5IG9mIGFzc29jaWF0aXZlIGFycmF5cyB3aXRoICdob3N0JyBhbmQgJ3BvcnQnIGtleXMKKyAgICAgKi8KKyAgICBwcml2YXRlICRzZXJ2ZXJzXyA9IGFycmF5KCk7CisKKyAgICAvKioKKyAgICAgKiBIb3cgbWFueSB0aW1lcyB0byByZXRyeSBlYWNoIGhvc3QgaW4gY29ubmVjdAorICAgICAqCisgICAgICogQHZhciBpbnQKKyAgICAgKi8KKyAgICBwcml2YXRlICRudW1SZXRyaWVzXyA9IDE7CisKKyAgICAvKioKKyAgICAgKiBSZXRyeSBpbnRlcnZhbCBpbiBzZWNvbmRzLCBob3cgbG9uZyB0byBub3QgdHJ5IGEgaG9zdCBpZiBpdCBoYXMgYmVlbgorICAgICAqIG1hcmtlZCBhcyBkb3duLgorICAgICAqCisgICAgICogQHZhciBpbnQKKyAgICAgKi8KKyAgICBwcml2YXRlICRyZXRyeUludGVydmFsXyA9IDYwOworCisgICAgLyoqCisgICAgICogTWF4IGNvbnNlY3V0aXZlIGZhaWx1cmVzIGJlZm9yZSBtYXJraW5nIGEgaG9zdCBkb3duLgorICAgICAqCisgICAgICogQHZhciBpbnQKKyAgICAgKi8KKyAgICBwcml2YXRlICRtYXhDb25zZWN1dGl2ZUZhaWx1cmVzXyA9IDE7CisKKyAgICAvKioKKyAgICAgKiBUcnkgaG9zdHMgaW4gb3JkZXI/IG9yIFJhbmRvbWl6ZWQ/CisgICAgICoKKyAgICAgKiBAdmFyIGJvb2wKKyAgICAgKi8KKyAgICBwcml2YXRlICRyYW5kb21pemVfID0gdHJ1ZTsKKworICAgIC8qKgorICAgICAqIEFsd2F5cyB0cnkgbGFzdCBob3N0LCBldmVuIGlmIG1hcmtlZCBkb3duPworICAgICAqCisgICAgICogQHZhciBib29sCisgICAgICovCisgICAgcHJpdmF0ZSAkYWx3YXlzVHJ5TGFzdF8gPSB0cnVlOworCisgICAgLyoqCisgICAgICogU29ja2V0IHBvb2wgY29uc3RydWN0b3IKKyAgICAgKgorICAgICAqIEBwYXJhbSBhcnJheSAkaG9zdHMgTGlzdCBvZiByZW1vdGUgaG9zdG5hbWVzCisgICAgICogQHBhcmFtIG1peGVkICRwb3J0cyBBcnJheSBvZiByZW1vdGUgcG9ydHMsIG9yIGEgc2luZ2xlIGNvbW1vbiBwb3J0CisgICAgICogQHBhcmFtIGJvb2wgJHBlcnNpc3QgV2hldGhlciB0byB1c2UgYSBwZXJzaXN0ZW50IHNvY2tldAorICAgICAqIEBwYXJhbSBtaXhlZCAkZGVidWdIYW5kbGVyIEZ1bmN0aW9uIGZvciBlcnJvciBsb2dnaW5nCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KAorICAgICAgICAkaG9zdHMgPSBhcnJheSgnbG9jYWxob3N0JyksCisgICAgICAgICRwb3J0cyA9IGFycmF5KDkwOTApLAorICAgICAgICAkcGVyc2lzdCA9IGZhbHNlLAorICAgICAgICAkZGVidWdIYW5kbGVyID0gbnVsbAorICAgICkgeworICAgICAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KG51bGwsIDAsICRwZXJzaXN0LCAkZGVidWdIYW5kbGVyKTsKKworICAgICAgICBpZiAoIWlzX2FycmF5KCRwb3J0cykpIHsKKyAgICAgICAgICAgICRwb3J0ID0gJHBvcnRzOworICAgICAgICAgICAgJHBvcnRzID0gYXJyYXkoKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKCRob3N0cyBhcyAka2V5ID0+ICR2YWwpIHsKKyAgICAgICAgICAgICAgICAkcG9ydHNbJGtleV0gPSAkcG9ydDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvcmVhY2ggKCRob3N0cyBhcyAka2V5ID0+ICRob3N0KSB7CisgICAgICAgICAgICAkdGhpcy0+c2VydmVyc18gW10gPSBhcnJheSgnaG9zdCcgPT4gJGhvc3QsCisgICAgICAgICAgICAgICAgJ3BvcnQnID0+ICRwb3J0c1ska2V5XSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBzZXJ2ZXIgdG8gdGhlIHBvb2wKKyAgICAgKgorICAgICAqIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcHJldmVudCB5b3UgZnJvbSBhZGRpbmcgYSBkdXBsaWNhdGUgc2VydmVyIGVudHJ5LgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAkaG9zdCBob3N0bmFtZSBvciBJUAorICAgICAqIEBwYXJhbSBpbnQgJHBvcnQgcG9ydAorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBhZGRTZXJ2ZXIoJGhvc3QsICRwb3J0KQorICAgIHsKKyAgICAgICAgJHRoaXMtPnNlcnZlcnNfW10gPSBhcnJheSgnaG9zdCcgPT4gJGhvc3QsICdwb3J0JyA9PiAkcG9ydCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBob3cgbWFueSB0aW1lIHRvIGtlZXAgcmV0cnlpbmcgYSBob3N0IGluIHRoZSBjb25uZWN0IGZ1bmN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGludCAkbnVtUmV0cmllcworICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBzZXROdW1SZXRyaWVzKCRudW1SZXRyaWVzKQorICAgIHsKKyAgICAgICAgJHRoaXMtPm51bVJldHJpZXNfID0gJG51bVJldHJpZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBob3cgbG9uZyB0byB3YWl0IHVudGlsIHJldHJ5aW5nIGEgaG9zdCBpZiBpdCB3YXMgbWFya2VkIGRvd24KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnQgJG51bVJldHJpZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gc2V0UmV0cnlJbnRlcnZhbCgkcmV0cnlJbnRlcnZhbCkKKyAgICB7CisgICAgICAgICR0aGlzLT5yZXRyeUludGVydmFsXyA9ICRyZXRyeUludGVydmFsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgaG93IG1hbnkgdGltZSB0byBrZWVwIHJldHJ5aW5nIGEgaG9zdCBiZWZvcmUgbWFya2luZyBpdCBhcyBkb3duLgorICAgICAqCisgICAgICogQHBhcmFtIGludCAkbnVtUmV0cmllcworICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRNYXhDb25zZWN1dGl2ZUZhaWx1cmVzKCRtYXhDb25zZWN1dGl2ZUZhaWx1cmVzKQorICAgIHsKKyAgICAgICAgJHRoaXMtPm1heENvbnNlY3V0aXZlRmFpbHVyZXNfID0gJG1heENvbnNlY3V0aXZlRmFpbHVyZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogVHVybnMgcmFuZG9taXphdGlvbiBpbiBjb25uZWN0IG9yZGVyIG9uIG9yIG9mZi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBib29sICRyYW5kb21pemUKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gc2V0UmFuZG9taXplKCRyYW5kb21pemUpCisgICAgeworICAgICAgICAkdGhpcy0+cmFuZG9taXplXyA9ICRyYW5kb21pemU7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciB0byBhbHdheXMgdHJ5IHRoZSBsYXN0IHNlcnZlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBib29sICRhbHdheXNUcnlMYXN0CisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHNldEFsd2F5c1RyeUxhc3QoJGFsd2F5c1RyeUxhc3QpCisgICAgeworICAgICAgICAkdGhpcy0+YWx3YXlzVHJ5TGFzdF8gPSAkYWx3YXlzVHJ5TGFzdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25uZWN0cyB0aGUgc29ja2V0IGJ5IGl0ZXJhdGluZyB0aHJvdWdoIGFsbCB0aGUgc2VydmVycyBpbiB0aGUgcG9vbAorICAgICAqIGFuZCB0cnlpbmcgdG8gZmluZCBvbmUgdGhhdCB3b3Jrcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gb3BlbigpCisgICAgeworICAgICAgICAvLyBDaGVjayBpZiB3ZSB3YW50IG9yZGVyIHJhbmRvbWl6YXRpb24KKyAgICAgICAgaWYgKCR0aGlzLT5yYW5kb21pemVfKSB7CisgICAgICAgICAgICBzaHVmZmxlKCR0aGlzLT5zZXJ2ZXJzXyk7CisgICAgICAgIH0KKworICAgICAgICAvLyBDb3VudCBzZXJ2ZXJzIHRvIGlkZW50aWZ5IHRoZSAibGFzdCIgb25lCisgICAgICAgICRudW1TZXJ2ZXJzID0gY291bnQoJHRoaXMtPnNlcnZlcnNfKTsKKworICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCAkbnVtU2VydmVyczsgKyskaSkgeworICAgICAgICAgICAgLy8gVGhpcyBleHRyYWN0cyB0aGUgJGhvc3QgYW5kICRwb3J0IHZhcmlhYmxlcworICAgICAgICAgICAgZXh0cmFjdCgkdGhpcy0+c2VydmVyc19bJGldKTsKKworICAgICAgICAgICAgLy8gQ2hlY2sgQVBDIGNhY2hlIGZvciBhIHJlY29yZCBvZiB0aGlzIHNlcnZlciBiZWluZyBkb3duCisgICAgICAgICAgICAkZmFpbHRpbWVLZXkgPSAndGhyaWZ0X2ZhaWx0aW1lOicgLiAkaG9zdCAuICc6JyAuICRwb3J0IC4gJ34nOworCisgICAgICAgICAgICAvLyBDYWNoZSBtaXNzPyBBc3N1bWUgaXQncyBPSworICAgICAgICAgICAgJGxhc3RGYWlsdGltZSA9IGFwY19mZXRjaCgkZmFpbHRpbWVLZXkpOworICAgICAgICAgICAgaWYgKCRsYXN0RmFpbHRpbWUgPT09IGZhbHNlKSB7CisgICAgICAgICAgICAgICAgJGxhc3RGYWlsdGltZSA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICRyZXRyeUludGVydmFsUGFzc2VkID0gZmFsc2U7CisKKyAgICAgICAgICAgIC8vIENhY2hlIGhpdC4uLm1ha2Ugc3VyZSBlbm91Z2ggdGhlIHJldHJ5IGludGVydmFsIGhhcyBlbGFwc2VkCisgICAgICAgICAgICBpZiAoJGxhc3RGYWlsdGltZSA+IDApIHsKKyAgICAgICAgICAgICAgICAkZWxhcHNlZCA9IHRpbWUoKSAtICRsYXN0RmFpbHRpbWU7CisgICAgICAgICAgICAgICAgaWYgKCRlbGFwc2VkID4gJHRoaXMtPnJldHJ5SW50ZXJ2YWxfKSB7CisgICAgICAgICAgICAgICAgICAgICRyZXRyeUludGVydmFsUGFzc2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5kZWJ1Z18pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxfdXNlcl9mdW5jKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5kZWJ1Z0hhbmRsZXJfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUU29ja2V0UG9vbDogcmV0cnlJbnRlcnZhbCAnIC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnKCcgLiAkdGhpcy0+cmV0cnlJbnRlcnZhbF8gLiAnKSAnIC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaGFzIHBhc3NlZCBmb3IgaG9zdCAnIC4gJGhvc3QgLiAnOicgLiAkcG9ydAorICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gT25seSBjb25uZWN0IGlmIG5vdCBpbiB0aGUgbWlkZGxlIG9mIGEgZmFpbCBpbnRlcnZhbCwgT1IgaWYgdGhpcworICAgICAgICAgICAgLy8gaXMgdGhlIExBU1Qgc2VydmVyIHdlIGFyZSB0cnlpbmcsIGp1c3QgaGFtbWVyIGF3YXkgb24gaXQKKyAgICAgICAgICAgICRpc0xhc3RTZXJ2ZXIgPSBmYWxzZTsKKyAgICAgICAgICAgIGlmICgkdGhpcy0+YWx3YXlzVHJ5TGFzdF8pIHsKKyAgICAgICAgICAgICAgICAkaXNMYXN0U2VydmVyID0gKCRpID09ICgkbnVtU2VydmVycyAtIDEpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCgkbGFzdEZhaWx0aW1lID09PSAwKSB8fAorICAgICAgICAgICAgICAgICgkaXNMYXN0U2VydmVyKSB8fAorICAgICAgICAgICAgICAgICgkbGFzdEZhaWx0aW1lID4gMCAmJiAkcmV0cnlJbnRlcnZhbFBhc3NlZCkpIHsKKyAgICAgICAgICAgICAgICAvLyBTZXQgdW5kZXJseWluZyBUU29ja2V0IHBhcmFtcyB0byB0aGlzIG9uZQorICAgICAgICAgICAgICAgICR0aGlzLT5ob3N0XyA9ICRob3N0OworICAgICAgICAgICAgICAgICR0aGlzLT5wb3J0XyA9ICRwb3J0OworCisgICAgICAgICAgICAgICAgLy8gVHJ5IHVwIHRvIG51bVJldHJpZXNfIGNvbm5lY3Rpb25zIHBlciBzZXJ2ZXIKKyAgICAgICAgICAgICAgICBmb3IgKCRhdHRlbXB0ID0gMDsgJGF0dGVtcHQgPCAkdGhpcy0+bnVtUmV0cmllc187ICRhdHRlbXB0KyspIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVzZSB0aGUgdW5kZXJseWluZyBUU29ja2V0IG9wZW4gZnVuY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudDo6b3BlbigpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IGNsZWFyIHRoZSBmYWlsdXJlIGNvdW50cyBpZiByZXF1aXJlZCB0byBkbyBzbworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRsYXN0RmFpbHRpbWUgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBjX3N0b3JlKCRmYWlsdGltZUtleSwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN1Y2Nlc3NmdWwgY29ubmVjdGlvbiwgcmV0dXJuIG5vdworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChURXhjZXB0aW9uICR0eCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29ubmVjdGlvbiBmYWlsZWQKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIE1hcmsgZmFpbHVyZSBvZiB0aGlzIGhvc3QgaW4gdGhlIGNhY2hlCisgICAgICAgICAgICAgICAgJGNvbnNlY2ZhaWxzS2V5ID0gJ3RocmlmdF9jb25zZWNmYWlsczonIC4gJGhvc3QgLiAnOicgLiAkcG9ydCAuICd+JzsKKworICAgICAgICAgICAgICAgIC8vIElnbm9yZSBjYWNoZSBtaXNzZXMKKyAgICAgICAgICAgICAgICAkY29uc2VjZmFpbHMgPSBhcGNfZmV0Y2goJGNvbnNlY2ZhaWxzS2V5KTsKKyAgICAgICAgICAgICAgICBpZiAoJGNvbnNlY2ZhaWxzID09PSBmYWxzZSkgeworICAgICAgICAgICAgICAgICAgICAkY29uc2VjZmFpbHMgPSAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIEluY3JlbWVudCBieSBvbmUKKyAgICAgICAgICAgICAgICAkY29uc2VjZmFpbHMrKzsKKworICAgICAgICAgICAgICAgIC8vIExvZyBhbmQgY2FjaGUgdGhpcyBmYWlsdXJlCisgICAgICAgICAgICAgICAgaWYgKCRjb25zZWNmYWlscyA+PSAkdGhpcy0+bWF4Q29uc2VjdXRpdmVGYWlsdXJlc18pIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5kZWJ1Z18pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxfdXNlcl9mdW5jKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5kZWJ1Z0hhbmRsZXJfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUU29ja2V0UG9vbDogbWFya2luZyAnIC4gJGhvc3QgLiAnOicgLiAkcG9ydCAuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyBhcyBkb3duIGZvciAnIC4gJHRoaXMtPnJldHJ5SW50ZXJ2YWxfIC4gJyBzZWNzICcgLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhZnRlciAnIC4gJGNvbnNlY2ZhaWxzIC4gJyBmYWlsZWQgYXR0ZW1wdHMuJworICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBTdG9yZSB0aGUgZmFpbHVyZSB0aW1lCisgICAgICAgICAgICAgICAgICAgIGFwY19zdG9yZSgkZmFpbHRpbWVLZXksIHRpbWUoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gQ2xlYXIgdGhlIGNvdW50IG9mIGNvbnNlY3V0aXZlIGZhaWx1cmVzCisgICAgICAgICAgICAgICAgICAgIGFwY19zdG9yZSgkY29uc2VjZmFpbHNLZXksIDApOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGFwY19zdG9yZSgkY29uc2VjZmFpbHNLZXksICRjb25zZWNmYWlscyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gT2ggbm87IHdlIGZhaWxlZCB0aGVtIGFsbC4gVGhlIHN5c3RlbSBpcyB0b3RhbGx5IGlsbCEKKyAgICAgICAgJGVycm9yID0gJ1RTb2NrZXRQb29sOiBBbGwgaG9zdHMgaW4gcG9vbCBhcmUgZG93bi4gJzsKKyAgICAgICAgJGhvc3RzID0gYXJyYXkoKTsKKyAgICAgICAgZm9yZWFjaCAoJHRoaXMtPnNlcnZlcnNfIGFzICRzZXJ2ZXIpIHsKKyAgICAgICAgICAgICRob3N0cyBbXSA9ICRzZXJ2ZXJbJ2hvc3QnXSAuICc6JyAuICRzZXJ2ZXJbJ3BvcnQnXTsKKyAgICAgICAgfQorICAgICAgICAkaG9zdGxpc3QgPSBpbXBsb2RlKCcsJywgJGhvc3RzKTsKKyAgICAgICAgJGVycm9yIC49ICcoJyAuICRob3N0bGlzdCAuICcpJzsKKyAgICAgICAgaWYgKCR0aGlzLT5kZWJ1Z18pIHsKKyAgICAgICAgICAgIGNhbGxfdXNlcl9mdW5jKCR0aGlzLT5kZWJ1Z0hhbmRsZXJfLCAkZXJyb3IpOworICAgICAgICB9CisgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCRlcnJvcik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVHJhbnNwb3J0L1RUcmFuc3BvcnQucGhwIGIvbGliL3BocC9saWIvVHJhbnNwb3J0L1RUcmFuc3BvcnQucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1OTIxYzYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVFRyYW5zcG9ydC5waHAKQEAgLTAsMCArMSw5OCBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcVHJhbnNwb3J0OworCit1c2UgVGhyaWZ0XEV4Y2VwdGlvblxUVHJhbnNwb3J0RXhjZXB0aW9uOwordXNlIFRocmlmdFxGYWN0b3J5XFRTdHJpbmdGdW5jRmFjdG9yeTsKKworLyoqCisgKiBCYXNlIGludGVyZmFjZSBmb3IgYSB0cmFuc3BvcnQgYWdlbnQuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAorICovCithYnN0cmFjdCBjbGFzcyBUVHJhbnNwb3J0Cit7CisgICAgLyoqCisgICAgICogV2hldGhlciB0aGlzIHRyYW5zcG9ydCBpcyBvcGVuLgorICAgICAqCisgICAgICogQHJldHVybiBib29sZWFuIHRydWUgaWYgb3BlbgorICAgICAqLworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiBpc09wZW4oKTsKKworICAgIC8qKgorICAgICAqIE9wZW4gdGhlIHRyYW5zcG9ydCBmb3IgcmVhZGluZy93cml0aW5nCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgY2Fubm90IG9wZW4KKyAgICAgKi8KKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gb3BlbigpOworCisgICAgLyoqCisgICAgICogQ2xvc2UgdGhlIHRyYW5zcG9ydC4KKyAgICAgKi8KKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gY2xvc2UoKTsKKworICAgIC8qKgorICAgICAqIFJlYWQgc29tZSBkYXRhIGludG8gdGhlIGFycmF5LgorICAgICAqCisgICAgICogQHBhcmFtIGludCAkbGVuIEhvdyBtdWNoIHRvIHJlYWQKKyAgICAgKiBAcmV0dXJuIHN0cmluZyBUaGUgZGF0YSB0aGF0IGhhcyBiZWVuIHJlYWQKKyAgICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgY2Fubm90IHJlYWQgYW55IG1vcmUgZGF0YQorICAgICAqLworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkKCRsZW4pOworCisgICAgLyoqCisgICAgICogR3VhcmFudGVlcyB0aGF0IHRoZSBmdWxsIGFtb3VudCBvZiBkYXRhIGlzIHJlYWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHN0cmluZyBUaGUgZGF0YSwgb2YgZXhhY3QgbGVuZ3RoCisgICAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIGNhbm5vdCByZWFkIGRhdGEKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEFsbCgkbGVuKQorICAgIHsKKyAgICAgICAgLy8gcmV0dXJuICR0aGlzLT5yZWFkKCRsZW4pOworCisgICAgICAgICRkYXRhID0gJyc7CisgICAgICAgICRnb3QgPSAwOworICAgICAgICB3aGlsZSAoKCRnb3QgPSBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJGRhdGEpKSA8ICRsZW4pIHsKKyAgICAgICAgICAgICRkYXRhIC49ICR0aGlzLT5yZWFkKCRsZW4gLSAkZ290KTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAkZGF0YTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgdGhlIGdpdmVuIGRhdGEgb3V0LgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAkYnVmIFRoZSBkYXRhIHRvIHdyaXRlCisgICAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIHdyaXRpbmcgZmFpbHMKKyAgICAgKi8KKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJGJ1Zik7CisKKyAgICAvKioKKyAgICAgKiBGbHVzaGVzIGFueSBwZW5kaW5nIGRhdGEgb3V0IG9mIGEgYnVmZmVyCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgYSB3cml0aW5nIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBmbHVzaCgpCisgICAgeworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1R5cGUvVENvbnN0YW50LnBocCBiL2xpYi9waHAvbGliL1R5cGUvVENvbnN0YW50LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTVkYTRhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvVHlwZS9UQ29uc3RhbnQucGhwCkBAIC0wLDAgKzEsNTIgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcVHlwZTsKKworLyoqCisgKiBCYXNlIGNsYXNzIGZvciBjb25zdGFudCBNYW5hZ2VtZW50CisgKi8KK2Fic3RyYWN0IGNsYXNzIFRDb25zdGFudAoreworICAgIC8qKgorICAgICAqIERvbid0IGluc3RhbmNpYXRlIHRoaXMgY2xhc3MKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQorICAgIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYSBjb25zdGFudCB2YWx1ZQorICAgICAqIEBwYXJhbSAgc3RyaW5nICRjb25zdGFudAorICAgICAqIEByZXR1cm4gbWl4ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldCgkY29uc3RhbnQpCisgICAgeworICAgICAgICBpZiAoaXNfbnVsbChzdGF0aWM6OiQkY29uc3RhbnQpKSB7CisgICAgICAgICAgICBzdGF0aWM6OiQkY29uc3RhbnQgPSBjYWxsX3VzZXJfZnVuYygKKyAgICAgICAgICAgICAgICBzcHJpbnRmKCdzdGF0aWM6OmluaXRfJXMnLCAkY29uc3RhbnQpCisgICAgICAgICAgICApOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHN0YXRpYzo6JCRjb25zdGFudDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UeXBlL1RNZXNzYWdlVHlwZS5waHAgYi9saWIvcGhwL2xpYi9UeXBlL1RNZXNzYWdlVHlwZS5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM5YWU2MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1R5cGUvVE1lc3NhZ2VUeXBlLnBocApAQCAtMCwwICsxLDM0IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFR5cGU7CisKKy8qKgorICogTWVzc2FnZSB0eXBlcyBmb3IgUlBDCisgKi8KK2NsYXNzIFRNZXNzYWdlVHlwZQoreworICAgIGNvbnN0IENBTEwgID0gMTsKKyAgICBjb25zdCBSRVBMWSA9IDI7CisgICAgY29uc3QgRVhDRVBUSU9OID0gMzsKKyAgICBjb25zdCBPTkVXQVkgPSA0OworfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVHlwZS9UVHlwZS5waHAgYi9saWIvcGhwL2xpYi9UeXBlL1RUeXBlLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmRiMTVmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvVHlwZS9UVHlwZS5waHAKQEAgLTAsMCArMSw0NyBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0CisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxUeXBlOworCisvKioKKyAqIERhdGEgdHlwZXMgdGhhdCBjYW4gYmUgc2VudCB2aWEgVGhyaWZ0CisgKi8KK2NsYXNzIFRUeXBlCit7CisgICAgY29uc3QgU1RPUCAgID0gMDsKKyAgICBjb25zdCBWT0lEICAgPSAxOworICAgIGNvbnN0IEJPT0wgICA9IDI7CisgICAgY29uc3QgQllURSAgID0gMzsKKyAgICBjb25zdCBJMDggICAgPSAzOworICAgIGNvbnN0IERPVUJMRSA9IDQ7CisgICAgY29uc3QgSTE2ICAgID0gNjsKKyAgICBjb25zdCBJMzIgICAgPSA4OworICAgIGNvbnN0IEk2NCAgICA9IDEwOworICAgIGNvbnN0IFNUUklORyA9IDExOworICAgIGNvbnN0IFVURjcgICA9IDExOworICAgIGNvbnN0IFNUUlVDVCA9IDEyOworICAgIGNvbnN0IE1BUCAgICA9IDEzOworICAgIGNvbnN0IFNFVCAgICA9IDE0OworICAgIGNvbnN0IExTVCAgICA9IDE1OyAgICAvLyBOLkIuIGNhbm5vdCB1c2UgTElTVCBrZXl3b3JkIGluIFBIUCEKKyAgICBjb25zdCBVVEY4ICAgPSAxNjsKKyAgICBjb25zdCBVVEYxNiAgPSAxNzsKK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvc3JjL1RTdHJpbmdVdGlscy5waHAgYi9saWIvcGhwL3NyYy9UU3RyaW5nVXRpbHMucGhwCmluZGV4IDY5NjcyZTguLjg5NGJhZjggMTAwNjQ0Ci0tLSBhL2xpYi9waHAvc3JjL1RTdHJpbmdVdGlscy5waHAKKysrIGIvbGliL3BocC9zcmMvVFN0cmluZ1V0aWxzLnBocApAQCAtMSwyOCArMSwzMyBAQAogPD9waHAKIAotaW50ZXJmYWNlIFRTdHJpbmdGdW5jIHsKK2ludGVyZmFjZSBUU3RyaW5nRnVuYworewogICAgIHB1YmxpYyBmdW5jdGlvbiBzdWJzdHIoJHN0ciwgJHN0YXJ0LCAkbGVuZ3RoID0gbnVsbCk7CiAgICAgcHVibGljIGZ1bmN0aW9uIHN0cmxlbigkc3RyKTsKIH0KIAogY2xhc3MgVFN0cmluZ0Z1bmNfQ29yZQogaW1wbGVtZW50cyBUU3RyaW5nRnVuYyB7Ci0gICAgcHVibGljIGZ1bmN0aW9uIHN1YnN0cigkc3RyLCAkc3RhcnQsICRsZW5ndGggPSBudWxsKSB7CisgICAgcHVibGljIGZ1bmN0aW9uIHN1YnN0cigkc3RyLCAkc3RhcnQsICRsZW5ndGggPSBudWxsKQorICAgIHsKICAgICAgICAgLy8gc3BlY2lmeWluZyBhIG51bGwgJGxlbmd0aCB3b3VsZCByZXR1cm4gYW4gZW1wdHkgc3RyaW5nCi0gICAgICAgIGlmKCRsZW5ndGggPT09IG51bGwpIHsKKyAgICAgICAgaWYgKCRsZW5ndGggPT09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiBzdWJzdHIoJHN0ciwgJHN0YXJ0KTsKICAgICAgICAgfQorCiAgICAgICAgIHJldHVybiBzdWJzdHIoJHN0ciwgJHN0YXJ0LCAkbGVuZ3RoKTsKICAgICB9CiAKLSAgICBwdWJsaWMgZnVuY3Rpb24gc3RybGVuKCRzdHIpIHsKKyAgICBwdWJsaWMgZnVuY3Rpb24gc3RybGVuKCRzdHIpCisgICAgewogICAgICAgICByZXR1cm4gc3RybGVuKCRzdHIpOwogICAgIH0KIH0KIAogY2xhc3MgVFN0cmluZ0Z1bmNfTWJzdHJpbmcKIGltcGxlbWVudHMgVFN0cmluZ0Z1bmMgewotICAgIHB1YmxpYyBmdW5jdGlvbiBzdWJzdHIoJHN0ciwgJHN0YXJ0LCAkbGVuZ3RoID0gbnVsbCkgeworICAgIHB1YmxpYyBmdW5jdGlvbiBzdWJzdHIoJHN0ciwgJHN0YXJ0LCAkbGVuZ3RoID0gbnVsbCkKKyAgICB7CiAgICAgICAgIC8qKgogICAgICAgICAgKiBXZSBuZWVkIHRvIHNldCB0aGUgY2hhcnNldCBwYXJhbWV0ZXIsIHdoaWNoIGlzIHRoZSBzZWNvbmQKICAgICAgICAgICogb3B0aW9uYWwgcGFyYW1ldGVyIGFuZCB0aGUgZmlyc3Qgb3B0aW9uYWwgcGFyYW1ldGVyIGNhbid0CkBAIC0zMCwxOSArMzUsMjEgQEAKICAgICAgICAgICogY2F1c2UgYW4gZW1wdHkgc3RyaW5nIHRvIGJlIHJldHVybmVkLCBzbyB3ZSBuZWVkIHRvCiAgICAgICAgICAqIGFjdHVhbGx5IGNhbGN1bGF0ZSB0aGUgcHJvcGVyIGxlbmd0aCB2YWx1ZS4KICAgICAgICAgICovCi0gICAgICAgIGlmKCRsZW5ndGggPT09IG51bGwpIHsKKyAgICAgICAgaWYgKCRsZW5ndGggPT09IG51bGwpIHsKICAgICAgICAgICAgICRsZW5ndGggPSAkdGhpcy0+c3RybGVuKCRzdHIpIC0gJHN0YXJ0OwogICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIG1iX3N1YnN0cigkc3RyLCAkc3RhcnQsICRsZW5ndGgsICc4Yml0Jyk7CiAgICAgfQogCi0gICAgcHVibGljIGZ1bmN0aW9uIHN0cmxlbigkc3RyKSB7CisgICAgcHVibGljIGZ1bmN0aW9uIHN0cmxlbigkc3RyKQorICAgIHsKICAgICAgICAgcmV0dXJuIG1iX3N0cmxlbigkc3RyLCAnOGJpdCcpOwogICAgIH0KIH0KIAotY2xhc3MgVFN0cmluZ0Z1bmNGYWN0b3J5IHsKK2NsYXNzIFRTdHJpbmdGdW5jRmFjdG9yeQorewogICAgIHByaXZhdGUgc3RhdGljICRfaW5zdGFuY2U7CiAKICAgICAvKioKQEAgLTUxLDIyICs1OCwyNCBAQAogICAgICAqCiAgICAgICogQHJldHVybiBUU3RyaW5nRnVuYwogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY3JlYXRlKCkgewotICAgICAgICBpZighc2VsZjo6JF9pbnN0YW5jZSkgeworICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY3JlYXRlKCkKKyAgICB7CisgICAgICAgIGlmICghc2VsZjo6JF9pbnN0YW5jZSkgewogICAgICAgICAgICAgc2VsZjo6X3NldEluc3RhbmNlKCk7CiAgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gc2VsZjo6JF9pbnN0YW5jZTsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBfc2V0SW5zdGFuY2UoKSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gX3NldEluc3RhbmNlKCkKKyAgICB7CiAgICAgICAgIC8qKgogICAgICAgICAgKiBDYW5ub3QgdXNlIHN0ciogZnVuY3Rpb25zIGZvciBieXRlIGNvdW50aW5nIGJlY2F1c2UgbXVsdGlieXRlCiAgICAgICAgICAqIGNoYXJhY3RlcnMgd2lsbCBiZSByZWFkIGEgc2luZ2xlIGJ5dGVzLgogICAgICAgICAgKgogICAgICAgICAgKiBTZWU6IGh0dHA6Ly91cy5waHAubmV0L21hbnVhbC9lbi9tYnN0cmluZy5vdmVybG9hZC5waHAKICAgICAgICAgICovCi0gICAgICAgIGlmKGluaV9nZXQoJ21ic3RyaW5nLmZ1bmNfb3ZlcmxvYWQnKSAmIDIpIHsKKyAgICAgICAgaWYgKGluaV9nZXQoJ21ic3RyaW5nLmZ1bmNfb3ZlcmxvYWQnKSAmIDIpIHsKICAgICAgICAgICAgIHNlbGY6OiRfaW5zdGFuY2UgPSBuZXcgVFN0cmluZ0Z1bmNfTWJzdHJpbmcoKTsKICAgICAgICAgfQogICAgICAgICAvKioKZGlmZiAtLWdpdCBhL2xpYi9waHAvc3JjL1RocmlmdC5waHAgYi9saWIvcGhwL3NyYy9UaHJpZnQucGhwCmluZGV4IGM4NDUzOTUuLjRmZTQzOTIgMTAwNjQ0Ci0tLSBhL2xpYi9waHAvc3JjL1RocmlmdC5waHAKKysrIGIvbGliL3BocC9zcmMvVGhyaWZ0LnBocApAQCAtMjAsMTEgKzIwLDExIEBACiAgKiBAcGFja2FnZSB0aHJpZnQKICAqLwogCi0KIC8qKgogICogRGF0YSB0eXBlcyB0aGF0IGNhbiBiZSBzZW50IHZpYSBUaHJpZnQKICAqLwotY2xhc3MgVFR5cGUgeworY2xhc3MgVFR5cGUKK3sKICAgY29uc3QgU1RPUCAgID0gMDsKICAgY29uc3QgVk9JRCAgID0gMTsKICAgY29uc3QgQk9PTCAgID0gMjsKQEAgLTQ3LDcgKzQ3LDggQEAKIC8qKgogICogTWVzc2FnZSB0eXBlcyBmb3IgUlBDCiAgKi8KLWNsYXNzIFRNZXNzYWdlVHlwZSB7CitjbGFzcyBUTWVzc2FnZVR5cGUKK3sKICAgY29uc3QgQ0FMTCAgPSAxOwogICBjb25zdCBSRVBMWSA9IDI7CiAgIGNvbnN0IEVYQ0VQVElPTiA9IDM7CkBAIC02Nyw4ICs2OCwxMCBAQAogICogQHBhcmFtIG1peGVkICRwMSBNZXNzYWdlIChzdHJpbmcpIG9yIHR5cGUtc3BlYyAoYXJyYXkpCiAgKiBAcGFyYW0gbWl4ZWQgJHAyIENvZGUgKGludGVnZXIpIG9yIHZhbHVlcyAoYXJyYXkpCiAgKi8KLWNsYXNzIFRFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotICBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkcDE9bnVsbCwgJHAyPTApIHsKK2NsYXNzIFRFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24KK3sKKyAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRwMT1udWxsLCAkcDI9MCkKKyAgewogICAgIGlmIChpc19hcnJheSgkcDEpICYmIGlzX2FycmF5KCRwMikpIHsKICAgICAgICRzcGVjID0gJHAxOwogICAgICAgJHZhbHMgPSAkcDI7CkBAIC05MSw3ICs5NCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUeXBlOjpET1VCTEUgPT4gJ0RvdWJsZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUeXBlOjpTVFJJTkcgPT4gJ1N0cmluZycpOwogCi0gIHByaXZhdGUgZnVuY3Rpb24gX3JlYWRNYXAoJiR2YXIsICRzcGVjLCAkaW5wdXQpIHsKKyAgcHJpdmF0ZSBmdW5jdGlvbiBfcmVhZE1hcCgmJHZhciwgJHNwZWMsICRpbnB1dCkKKyAgewogICAgICR4ZmVyID0gMDsKICAgICAka3R5cGUgPSAkc3BlY1sna3R5cGUnXTsKICAgICAkdnR5cGUgPSAkc3BlY1sndnR5cGUnXTsKQEAgLTE1NCwxMCArMTU4LDEyIEBACiAgICAgICAkdmFyWyRrZXldID0gJHZhbDsKICAgICB9CiAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkTWFwRW5kKCk7CisKICAgICByZXR1cm4gJHhmZXI7CiAgIH0KIAotICBwcml2YXRlIGZ1bmN0aW9uIF9yZWFkTGlzdCgmJHZhciwgJHNwZWMsICRpbnB1dCwgJHNldD1mYWxzZSkgeworICBwcml2YXRlIGZ1bmN0aW9uIF9yZWFkTGlzdCgmJHZhciwgJHNwZWMsICRpbnB1dCwgJHNldD1mYWxzZSkKKyAgewogICAgICR4ZmVyID0gMDsKICAgICAkZXR5cGUgPSAkc3BlY1snZXR5cGUnXTsKICAgICAkZXJlYWQgPSAkdnJlYWQgPSBudWxsOwpAQCAtMjA3LDEwICsyMTMsMTIgQEAKICAgICB9IGVsc2UgewogICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkTGlzdEVuZCgpOwogICAgIH0KKwogICAgIHJldHVybiAkeGZlcjsKICAgfQogCi0gIHByb3RlY3RlZCBmdW5jdGlvbiBfcmVhZCgkY2xhc3MsICRzcGVjLCAkaW5wdXQpIHsKKyAgcHJvdGVjdGVkIGZ1bmN0aW9uIF9yZWFkKCRjbGFzcywgJHNwZWMsICRpbnB1dCkKKyAgewogICAgICR4ZmVyID0gMDsKICAgICAkZm5hbWUgPSBudWxsOwogICAgICRmdHlwZSA9IDA7CkBAIC0yNTYsMTAgKzI2NCwxMiBAQAogICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkRmllbGRFbmQoKTsKICAgICB9CiAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkU3RydWN0RW5kKCk7CisKICAgICByZXR1cm4gJHhmZXI7CiAgIH0KIAotICBwcml2YXRlIGZ1bmN0aW9uIF93cml0ZU1hcCgkdmFyLCAkc3BlYywgJG91dHB1dCkgeworICBwcml2YXRlIGZ1bmN0aW9uIF93cml0ZU1hcCgkdmFyLCAkc3BlYywgJG91dHB1dCkKKyAgewogICAgICR4ZmVyID0gMDsKICAgICAka3R5cGUgPSAkc3BlY1sna3R5cGUnXTsKICAgICAkdnR5cGUgPSAkc3BlY1sndnR5cGUnXTsKQEAgLTMxNCwxMCArMzI0LDEyIEBACiAgICAgICB9CiAgICAgfQogICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlTWFwRW5kKCk7CisKICAgICByZXR1cm4gJHhmZXI7CiAgIH0KIAotICBwcml2YXRlIGZ1bmN0aW9uIF93cml0ZUxpc3QoJHZhciwgJHNwZWMsICRvdXRwdXQsICRzZXQ9ZmFsc2UpIHsKKyAgcHJpdmF0ZSBmdW5jdGlvbiBfd3JpdGVMaXN0KCR2YXIsICRzcGVjLCAkb3V0cHV0LCAkc2V0PWZhbHNlKQorICB7CiAgICAgJHhmZXIgPSAwOwogICAgICRldHlwZSA9ICRzcGVjWydldHlwZSddOwogICAgICRld3JpdGUgPSBudWxsOwpAQCAtMzU3LDEwICszNjksMTIgQEAKICAgICB9IGVsc2UgewogICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVMaXN0RW5kKCk7CiAgICAgfQorCiAgICAgcmV0dXJuICR4ZmVyOwogICB9CiAKLSAgcHJvdGVjdGVkIGZ1bmN0aW9uIF93cml0ZSgkY2xhc3MsICRzcGVjLCAkb3V0cHV0KSB7CisgIHByb3RlY3RlZCBmdW5jdGlvbiBfd3JpdGUoJGNsYXNzLCAkc3BlYywgJG91dHB1dCkKKyAgewogICAgICR4ZmVyID0gMDsKICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZVN0cnVjdEJlZ2luKCRjbGFzcyk7CiAgICAgZm9yZWFjaCAoJHNwZWMgYXMgJGZpZCA9PiAkZnNwZWMpIHsKQEAgLTM5Miw2ICs0MDYsNyBAQAogICAgIH0KICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkU3RvcCgpOwogICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU3RydWN0RW5kKCk7CisKICAgICByZXR1cm4gJHhmZXI7CiAgIH0KIApAQCAtNDA0LDggKzQxOSw4IEBACiAgKiBvZiBQSFAuIE5vdGUgdGhhdCBjb2RlIGlzIGludGVudGlvbmFsbHkgZHVwbGljYXRlZCBpbiBoZXJlIHRvIGF2b2lkIG1ha2luZwogICogZnVuY3Rpb24gY2FsbHMgZm9yIGV2ZXJ5IGZpZWxkIG9yIG1lbWJlciBvZiBhIGNvbnRhaW5lci4uCiAgKi8KLWFic3RyYWN0IGNsYXNzIFRCYXNlIHsKLQorYWJzdHJhY3QgY2xhc3MgVEJhc2UKK3sKICAgc3RhdGljICR0bWV0aG9kID0gYXJyYXkoVFR5cGU6OkJPT0wgICA9PiAnQm9vbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUeXBlOjpCWVRFICAgPT4gJ0J5dGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZTo6STE2ICAgID0+ICdJMTYnLApAQCAtNDE0LDExICs0MjksMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGU6OkRPVUJMRSA9PiAnRG91YmxlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGU6OlNUUklORyA9PiAnU3RyaW5nJyk7CiAKLSAgYWJzdHJhY3QgZnVuY3Rpb24gcmVhZCgkaW5wdXQpOworICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVhZCgkaW5wdXQpOwogCi0gIGFic3RyYWN0IGZ1bmN0aW9uIHdyaXRlKCRvdXRwdXQpOworICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJG91dHB1dCk7CiAKLSAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRzcGVjPW51bGwsICR2YWxzPW51bGwpIHsKKyAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRzcGVjPW51bGwsICR2YWxzPW51bGwpCisgIHsKICAgICBpZiAoaXNfYXJyYXkoJHNwZWMpICYmIGlzX2FycmF5KCR2YWxzKSkgewogICAgICAgZm9yZWFjaCAoJHNwZWMgYXMgJGZpZCA9PiAkZnNwZWMpIHsKICAgICAgICAgJHZhciA9ICRmc3BlY1sndmFyJ107CkBAIC00MjksNyArNDQ1LDggQEAKICAgICB9CiAgIH0KIAotICBwcml2YXRlIGZ1bmN0aW9uIF9yZWFkTWFwKCYkdmFyLCAkc3BlYywgJGlucHV0KSB7CisgIHByaXZhdGUgZnVuY3Rpb24gX3JlYWRNYXAoJiR2YXIsICRzcGVjLCAkaW5wdXQpCisgIHsKICAgICAkeGZlciA9IDA7CiAgICAgJGt0eXBlID0gJHNwZWNbJ2t0eXBlJ107CiAgICAgJHZ0eXBlID0gJHNwZWNbJ3Z0eXBlJ107CkBAIC00OTIsMTAgKzUwOSwxMiBAQAogICAgICAgJHZhclska2V5XSA9ICR2YWw7CiAgICAgfQogICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZE1hcEVuZCgpOworCiAgICAgcmV0dXJuICR4ZmVyOwogICB9CiAKLSAgcHJpdmF0ZSBmdW5jdGlvbiBfcmVhZExpc3QoJiR2YXIsICRzcGVjLCAkaW5wdXQsICRzZXQ9ZmFsc2UpIHsKKyAgcHJpdmF0ZSBmdW5jdGlvbiBfcmVhZExpc3QoJiR2YXIsICRzcGVjLCAkaW5wdXQsICRzZXQ9ZmFsc2UpCisgIHsKICAgICAkeGZlciA9IDA7CiAgICAgJGV0eXBlID0gJHNwZWNbJ2V0eXBlJ107CiAgICAgJGVyZWFkID0gJHZyZWFkID0gbnVsbDsKQEAgLTU0NSwxMCArNTY0LDEyIEBACiAgICAgfSBlbHNlIHsKICAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZExpc3RFbmQoKTsKICAgICB9CisKICAgICByZXR1cm4gJHhmZXI7CiAgIH0KIAotICBwcm90ZWN0ZWQgZnVuY3Rpb24gX3JlYWQoJGNsYXNzLCAkc3BlYywgJGlucHV0KSB7CisgIHByb3RlY3RlZCBmdW5jdGlvbiBfcmVhZCgkY2xhc3MsICRzcGVjLCAkaW5wdXQpCisgIHsKICAgICAkeGZlciA9IDA7CiAgICAgJGZuYW1lID0gbnVsbDsKICAgICAkZnR5cGUgPSAwOwpAQCAtNTk0LDEwICs2MTUsMTIgQEAKICAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZEZpZWxkRW5kKCk7CiAgICAgfQogICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZFN0cnVjdEVuZCgpOworCiAgICAgcmV0dXJuICR4ZmVyOwogICB9CiAKLSAgcHJpdmF0ZSBmdW5jdGlvbiBfd3JpdGVNYXAoJHZhciwgJHNwZWMsICRvdXRwdXQpIHsKKyAgcHJpdmF0ZSBmdW5jdGlvbiBfd3JpdGVNYXAoJHZhciwgJHNwZWMsICRvdXRwdXQpCisgIHsKICAgICAkeGZlciA9IDA7CiAgICAgJGt0eXBlID0gJHNwZWNbJ2t0eXBlJ107CiAgICAgJHZ0eXBlID0gJHNwZWNbJ3Z0eXBlJ107CkBAIC02NTIsMTAgKzY3NSwxMiBAQAogICAgICAgfQogICAgIH0KICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZU1hcEVuZCgpOworCiAgICAgcmV0dXJuICR4ZmVyOwogICB9CiAKLSAgcHJpdmF0ZSBmdW5jdGlvbiBfd3JpdGVMaXN0KCR2YXIsICRzcGVjLCAkb3V0cHV0LCAkc2V0PWZhbHNlKSB7CisgIHByaXZhdGUgZnVuY3Rpb24gX3dyaXRlTGlzdCgkdmFyLCAkc3BlYywgJG91dHB1dCwgJHNldD1mYWxzZSkKKyAgewogICAgICR4ZmVyID0gMDsKICAgICAkZXR5cGUgPSAkc3BlY1snZXR5cGUnXTsKICAgICAkZXdyaXRlID0gbnVsbDsKQEAgLTY5NSwxMCArNzIwLDEyIEBACiAgICAgfSBlbHNlIHsKICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlTGlzdEVuZCgpOwogICAgIH0KKwogICAgIHJldHVybiAkeGZlcjsKICAgfQogCi0gIHByb3RlY3RlZCBmdW5jdGlvbiBfd3JpdGUoJGNsYXNzLCAkc3BlYywgJG91dHB1dCkgeworICBwcm90ZWN0ZWQgZnVuY3Rpb24gX3dyaXRlKCRjbGFzcywgJHNwZWMsICRvdXRwdXQpCisgIHsKICAgICAkeGZlciA9IDA7CiAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTdHJ1Y3RCZWdpbigkY2xhc3MpOwogICAgIGZvcmVhY2ggKCRzcGVjIGFzICRmaWQgPT4gJGZzcGVjKSB7CkBAIC03MzAsMTEgKzc1NywxMyBAQAogICAgIH0KICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkU3RvcCgpOwogICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU3RydWN0RW5kKCk7CisKICAgICByZXR1cm4gJHhmZXI7CiAgIH0KIH0KIAotY2xhc3MgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGV4dGVuZHMgVEV4Y2VwdGlvbiB7CitjbGFzcyBUQXBwbGljYXRpb25FeGNlcHRpb24gZXh0ZW5kcyBURXhjZXB0aW9uCit7CiAgIHN0YXRpYyAkX1RTUEVDID0KICAgICBhcnJheSgxID0+IGFycmF5KCd2YXInID0+ICdtZXNzYWdlJywKICAgICAgICAgICAgICAgICAgICAgICd0eXBlJyA9PiBUVHlwZTo6U1RSSU5HKSwKQEAgLTc1MCwxNSArNzc5LDE4IEBACiAgIGNvbnN0IElOVEVSTkFMX0VSUk9SID0gNjsKICAgY29uc3QgUFJPVE9DT0xfRVJST1IgPSA3OwogCi0gIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRtZXNzYWdlPW51bGwsICRjb2RlPTApIHsKKyAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRtZXNzYWdlPW51bGwsICRjb2RlPTApCisgIHsKICAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCRtZXNzYWdlLCAkY29kZSk7CiAgIH0KIAotICBwdWJsaWMgZnVuY3Rpb24gcmVhZCgkb3V0cHV0KSB7CisgIHB1YmxpYyBmdW5jdGlvbiByZWFkKCRvdXRwdXQpCisgIHsKICAgICByZXR1cm4gJHRoaXMtPl9yZWFkKCdUQXBwbGljYXRpb25FeGNlcHRpb24nLCBzZWxmOjokX1RTUEVDLCAkb3V0cHV0KTsKICAgfQogCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZSgkb3V0cHV0KSB7CisgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZSgkb3V0cHV0KQorICB7CiAgICAgJHhmZXIgPSAwOwogICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU3RydWN0QmVnaW4oJ1RBcHBsaWNhdGlvbkV4Y2VwdGlvbicpOwogICAgIGlmICgkbWVzc2FnZSA9ICR0aGlzLT5nZXRNZXNzYWdlKCkpIHsKQEAgLTc3Myw2ICs4MDUsNyBAQAogICAgIH0KICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkU3RvcCgpOwogICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU3RydWN0RW5kKCk7CisKICAgICByZXR1cm4gJHhmZXI7CiAgIH0KIH0KQEAgLTc4Niw0ICs4MTksMyBAQAogaW5jbHVkZV9vbmNlICRHTE9CQUxTWydUSFJJRlRfUk9PVCddLicvcHJvdG9jb2wvVFByb3RvY29sLnBocCc7CiBpbmNsdWRlX29uY2UgJEdMT0JBTFNbJ1RIUklGVF9ST09UJ10uJy90cmFuc3BvcnQvVFRyYW5zcG9ydC5waHAnOwogaW5jbHVkZV9vbmNlICRHTE9CQUxTWydUSFJJRlRfUk9PVCddLicvVFN0cmluZ1V0aWxzLnBocCc7Ci0KZGlmZiAtLWdpdCBhL2xpYi9waHAvc3JjL2F1dG9sb2FkLnBocCBiL2xpYi9waHAvc3JjL2F1dG9sb2FkLnBocAppbmRleCAzYTM1NTQ1Li44NWJkNzk3IDEwMDY0NAotLS0gYS9saWIvcGhwL3NyYy9hdXRvbG9hZC5waHAKKysrIGIvbGliL3BocC9zcmMvYXV0b2xvYWQucGhwCkBAIC0yMCw3ICsyMCw2IEBACiAgKiBAcGFja2FnZSB0aHJpZnQKICAqLwogCi0KIC8qKgogICogSW5jbHVkZSB0aGlzIGZpbGUgaWYgeW91IHdpc2ggdG8gdXNlIGF1dG9sb2FkIHdpdGggeW91ciBQSFAgZ2VuZXJhdGVkIFRocmlmdAogICogY29kZS4gVGhlIGdlbmVyYXRlZCBjb2RlIHdpbGwgKm5vdCogaW5jbHVkZSBhbnkgZGVmaW5lZCBUaHJpZnQgY2xhc3NlcyBieQpAQCAtMzcsMTIgKzM2LDEzIEBACiAkR0xPQkFMU1snQVVUT0xPQURfSE9PS1MnXSA9IGFycmF5KCk7CiAKIGlmICghZnVuY3Rpb25fZXhpc3RzKCdfX2F1dG9sb2FkJykpIHsKLSAgZnVuY3Rpb24gX19hdXRvbG9hZCgkY2xhc3MpIHsKKyAgZnVuY3Rpb24gX19hdXRvbG9hZCgkY2xhc3MpCisgIHsKICAgICBnbG9iYWwgJFRIUklGVF9BVVRPTE9BRDsKICAgICAkY2xhc3NsID0gc3RydG9sb3dlcigkY2xhc3MpOwogICAgIGlmIChpc3NldCgkVEhSSUZUX0FVVE9MT0FEWyRjbGFzc2xdKSkgewogICAgICAgaW5jbHVkZV9vbmNlICRHTE9CQUxTWydUSFJJRlRfUk9PVCddLicvcGFja2FnZXMvJy4kVEhSSUZUX0FVVE9MT0FEWyRjbGFzc2xdOwotICAgIH0gZWxzZSBpZiAoIWVtcHR5KCRHTE9CQUxTWydBVVRPTE9BRF9IT09LUyddKSkgeworICAgIH0gZWxzZWlmICghZW1wdHkoJEdMT0JBTFNbJ0FVVE9MT0FEX0hPT0tTJ10pKSB7CiAgICAgICBmb3JlYWNoICgkR0xPQkFMU1snQVVUT0xPQURfSE9PS1MnXSBhcyAkaG9vaykgewogICAgICAgICAkaG9vaygkY2xhc3MpOwogICAgICAgfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9jb25maWcubTQgYi9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL2NvbmZpZy5tNAppbmRleCAyYzMzOGEwLi5lMjEzOGM4IDEwMDY0NAotLS0gYS9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL2NvbmZpZy5tNAorKysgYi9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL2NvbmZpZy5tNApAQCAtMiwxNCArMiwzMyBAQAogZG5sIENvcHlpbmcgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGlzIGZpbGUsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCiBkbmwgYXJlIHBlcm1pdHRlZCBpbiBhbnkgbWVkaXVtIHdpdGhvdXQgcm95YWx0eSBwcm92aWRlZCB0aGUgY29weXJpZ2h0CiBkbmwgbm90aWNlIGFuZCB0aGlzIG5vdGljZSBhcmUgcHJlc2VydmVkLgorZG5sCitkbmwgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorZG5sIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCitkbmwgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK2RubCByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK2RubCB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCitkbmwgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorZG5sIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorZG5sCitkbmwgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorZG5sCitkbmwgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorZG5sIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCitkbmwgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCitkbmwgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKK2RubCBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCitkbmwgdW5kZXIgdGhlIExpY2Vuc2UuCiAKIFBIUF9BUkdfRU5BQkxFKHRocmlmdF9wcm90b2NvbCwgd2hldGhlciB0byBlbmFibGUgdGhlIHRocmlmdF9wcm90b2NvbCBleHRlbnNpb24sCi1bICAtLWVuYWJsZS10aHJpZnRfcHJvdG9jb2wJRW5hYmxlIHRoZSBmYnRocmlmdF9wcm90b2NvbCBleHRlbnNpb25dKQorWyAgLS1lbmFibGUtdGhyaWZ0X3Byb3RvY29sCUVuYWJsZSB0aGUgdGhyaWZ0X3Byb3RvY29sIGV4dGVuc2lvbl0pCiAKIGlmIHRlc3QgIiRQSFBfVEhSSUZUX1BST1RPQ09MIiAhPSAibm8iOyB0aGVuCiAgIFBIUF9SRVFVSVJFX0NYWCgpCiAgIFBIUF9BRERfTElCUkFSWV9XSVRIX1BBVEgoc3RkYysrLCAiIiwgVEhSSUZUX1BST1RPQ09MX1NIQVJFRF9MSUJBREQpCiAgIFBIUF9TVUJTVChUSFJJRlRfUFJPVE9DT0xfU0hBUkVEX0xJQkFERCkKKyAgQ1hYRkxBR1M9IiRDWFhGTEFHUyAtc3RkPWMrKzExIgorCiAgIFBIUF9ORVdfRVhURU5TSU9OKHRocmlmdF9wcm90b2NvbCwgcGhwX3RocmlmdF9wcm90b2NvbC5jcHAsICRleHRfc2hhcmVkKQogZmkKIApkaWZmIC0tZ2l0IGEvbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9waHBfdGhyaWZ0X3Byb3RvY29sLmNwcCBiL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvcGhwX3RocmlmdF9wcm90b2NvbC5jcHAKaW5kZXggMTdhNzMyNC4uNjNjODkwNSAxMDA2NDQKLS0tIGEvbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9waHBfdGhyaWZ0X3Byb3RvY29sLmNwcAorKysgYi9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL3BocF90aHJpZnRfcHJvdG9jb2wuY3BwCkBAIC0xNiwyNSArMTYsMjMgQEAKICAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCi0KICNpZmRlZiBIQVZFX0NPTkZJR19ICiAjaW5jbHVkZSAiY29uZmlnLmgiCiAjZW5kaWYKIAorI2luY2x1ZGUgInBocC5oIgorI2luY2x1ZGUgInplbmRfaW50ZXJmYWNlcy5oIgorI2luY2x1ZGUgInplbmRfZXhjZXB0aW9ucy5oIgorI2luY2x1ZGUgInBocF90aHJpZnRfcHJvdG9jb2wuaCIKKworI2lmIFBIUF9WRVJTSU9OX0lEID49IDcwMDAwCisKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpZiBkZWZpbmVkKCBXSU4zMiApIHx8IGRlZmluZWQoIF9XSU42NCApCi10eXBlZGVmIGludCAgaW50MzJfdDsgCi10eXBlZGVmIHNpZ25lZCBjaGFyIGludDhfdDsKLXR5cGVkZWYgdW5zaWduZWQgY2hhciAgIHVpbnQ4X3Q7Ci10eXBlZGVmIHVuc2lnbmVkIHNob3J0ICB1aW50MTZfdDsKLXR5cGVkZWYgbG9uZyBsb25nICBpbnQ2NF90OwotdHlwZWRlZiB1bnNpZ25lZCAgIHVpbnQzMl90OyAKLXR5cGVkZWYgc2hvcnQgIGludDE2X3Q7IAotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgICB1aW50NjRfdDsKLSNlbHNlCi0jaW5jbHVkZSA8YXJwYS9pbmV0Lmg+IAotI2VuZGlmCisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKyNpbmNsdWRlIDxjc3RkaW50PgogI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CiAKICNpZm5kZWYgYnN3YXBfNjQKICNkZWZpbmUJYnN3YXBfNjQoeCkgICAgICgoKHVpbnQ2NF90KSh4KSA8PCA1NikgfCBcCkBAIC04NywyNiArODUsMjIgQEAKIGNvbnN0IGludCBJTlZBTElEX0RBVEEgPSAxOwogY29uc3QgaW50IEJBRF9WRVJTSU9OID0gNDsKIAotI2luY2x1ZGUgInBocC5oIgotI2luY2x1ZGUgInplbmRfaW50ZXJmYWNlcy5oIgotI2luY2x1ZGUgInplbmRfZXhjZXB0aW9ucy5oIgotI2luY2x1ZGUgInBocF90aHJpZnRfcHJvdG9jb2wuaCIKLQogc3RhdGljIHplbmRfZnVuY3Rpb25fZW50cnkgdGhyaWZ0X3Byb3RvY29sX2Z1bmN0aW9uc1tdID0gewotICBQSFBfRkUodGhyaWZ0X3Byb3RvY29sX3dyaXRlX2JpbmFyeSwgTlVMTCkKLSAgUEhQX0ZFKHRocmlmdF9wcm90b2NvbF9yZWFkX2JpbmFyeSwgTlVMTCkKLSAge05VTEwsIE5VTEwsIE5VTEx9Ci19IDsKKyAgUEhQX0ZFKHRocmlmdF9wcm90b2NvbF93cml0ZV9iaW5hcnksIG51bGxwdHIpCisgIFBIUF9GRSh0aHJpZnRfcHJvdG9jb2xfcmVhZF9iaW5hcnksIG51bGxwdHIpCisgIFBIUF9GRSh0aHJpZnRfcHJvdG9jb2xfcmVhZF9iaW5hcnlfYWZ0ZXJfbWVzc2FnZV9iZWdpbiwgbnVsbHB0cikKKyAge251bGxwdHIsIG51bGxwdHIsIG51bGxwdHJ9Cit9OwogCiB6ZW5kX21vZHVsZV9lbnRyeSB0aHJpZnRfcHJvdG9jb2xfbW9kdWxlX2VudHJ5ID0gewogICBTVEFOREFSRF9NT0RVTEVfSEVBREVSLAogICAidGhyaWZ0X3Byb3RvY29sIiwKICAgdGhyaWZ0X3Byb3RvY29sX2Z1bmN0aW9ucywKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKKyAgbnVsbHB0ciwKKyAgbnVsbHB0ciwKKyAgbnVsbHB0ciwKKyAgbnVsbHB0ciwKKyAgbnVsbHB0ciwKICAgIjEuMCIsCiAgIFNUQU5EQVJEX01PRFVMRV9QUk9QRVJUSUVTCiB9OwpAQCAtMTE3LDQyICsxMTEsNjEgQEAKIAogY2xhc3MgUEhQRXhjZXB0aW9uV3JhcHBlciA6IHB1YmxpYyBzdGQ6OmV4Y2VwdGlvbiB7CiBwdWJsaWM6Ci0gIFBIUEV4Y2VwdGlvbldyYXBwZXIoenZhbCogX2V4KSB0aHJvdygpIDogZXgoX2V4KSB7Ci0gICAgc25wcmludGYoX3doYXQsIDQwLCAiUEhQIGV4Y2VwdGlvbiB6dmFsPSVwIiwgZXgpOworICBQSFBFeGNlcHRpb25XcmFwcGVyKHp2YWwqIF9leCkgdGhyb3coKSB7CisgICAgWlZBTF9DT1BZKCZleCwgX2V4KTsKKyAgICBzbnByaW50Zihfd2hhdCwgNDAsICJQSFAgZXhjZXB0aW9uIHp2YWw9JXAiLCBfZXgpOwogICB9Ci0gIGNvbnN0IGNoYXIqIHdoYXQoKSBjb25zdCB0aHJvdygpIHsgcmV0dXJuIF93aGF0OyB9Ci0gIH5QSFBFeGNlcHRpb25XcmFwcGVyKCkgdGhyb3coKSB7fQotICBvcGVyYXRvciB6dmFsKigpIGNvbnN0IHRocm93KCkgeyByZXR1cm4gY29uc3RfY2FzdDx6dmFsKj4oZXgpOyB9IC8vIFplbmQgQVBJIGRvZXNuJ3QgZG8gJ2NvbnN0Jy4uLgorCisgIFBIUEV4Y2VwdGlvbldyYXBwZXIoemVuZF9vYmplY3QqIF9leG9iaikgdGhyb3coKSB7CisgICAgWlZBTF9PQkooJmV4LCBfZXhvYmopOworICAgIHNucHJpbnRmKF93aGF0LCA0MCwgIlBIUCBleGNlcHRpb24genZhbD0lcCIsIF9leG9iaik7CisgIH0KKyAgflBIUEV4Y2VwdGlvbldyYXBwZXIoKSB0aHJvdygpIHsKKyAgICB6dmFsX2R0b3IoJmV4KTsKKyAgfQorCisgIGNvbnN0IGNoYXIqIHdoYXQoKSBjb25zdCB0aHJvdygpIHsKKyAgICByZXR1cm4gX3doYXQ7CisgIH0KKyAgb3BlcmF0b3IgenZhbCooKSBjb25zdCB0aHJvdygpIHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDx6dmFsKj4oJmV4KTsKKyAgfSAvLyBaZW5kIEFQSSBkb2Vzbid0IGRvICdjb25zdCcuLi4KIHByb3RlY3RlZDoKLSAgenZhbCogZXg7CisgIHp2YWwgZXg7CiAgIGNoYXIgX3doYXRbNDBdOwogfSA7CiAKIGNsYXNzIFBIUFRyYW5zcG9ydCB7Ci1wdWJsaWM6Ci0gIHp2YWwqIHByb3RvY29sKCkgeyByZXR1cm4gcDsgfQotICB6dmFsKiB0cmFuc3BvcnQoKSB7IHJldHVybiB0OyB9CiBwcm90ZWN0ZWQ6Ci0gIFBIUFRyYW5zcG9ydCgpIHt9CisgIFBIUFRyYW5zcG9ydCh6dmFsKiBfcCwgc2l6ZV90IF9idWZmZXJfc2l6ZSkgeworICAgIGFzc2VydChaX1RZUEVfUChfcCkgPT0gSVNfT0JKRUNUKTsKIAotICB2b2lkIGNvbnN0cnVjdF93aXRoX3p2YWwoenZhbCogX3AsIHNpemVfdCBfYnVmZmVyX3NpemUpIHsKKyAgICBaVkFMX1VOREVGKCZ0KTsKKwogICAgIGJ1ZmZlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGVtYWxsb2MoX2J1ZmZlcl9zaXplKSk7CiAgICAgYnVmZmVyX3B0ciA9IGJ1ZmZlcjsKICAgICBidWZmZXJfdXNlZCA9IDA7CiAgICAgYnVmZmVyX3NpemUgPSBfYnVmZmVyX3NpemU7Ci0gICAgcCA9IF9wOwogCiAgICAgLy8gR2V0IHRoZSB0cmFuc3BvcnQgZm9yIHRoZSBwYXNzZWQgcHJvdG9jb2wKICAgICB6dmFsIGdldHRyYW5zcG9ydDsKLSAgICBaVkFMX1NUUklORygmZ2V0dHJhbnNwb3J0LCAiZ2V0VHJhbnNwb3J0IiwgMCk7Ci0gICAgTUFLRV9TVERfWlZBTCh0KTsKLSAgICBaVkFMX05VTEwodCk7Ci0gICAgVFNSTUxTX0ZFVENIKCk7Ci0gICAgY2FsbF91c2VyX2Z1bmN0aW9uKEVHKGZ1bmN0aW9uX3RhYmxlKSwgJnAsICZnZXR0cmFuc3BvcnQsIHQsIDAsIE5VTEwgVFNSTUxTX0NDKTsKKyAgICBaVkFMX1NUUklORygmZ2V0dHJhbnNwb3J0LCAiZ2V0VHJhbnNwb3J0Iik7CisgICAgY2FsbF91c2VyX2Z1bmN0aW9uKG51bGxwdHIsIF9wLCAmZ2V0dHJhbnNwb3J0LCAmdCwgMCwgbnVsbHB0cik7CisKKyAgICB6dmFsX2R0b3IoJmdldHRyYW5zcG9ydCk7CisKKyAgICBpZiAoRUcoZXhjZXB0aW9uKSkgeworICAgICAgemVuZF9vYmplY3QgKmV4ID0gRUcoZXhjZXB0aW9uKTsKKyAgICAgIEVHKGV4Y2VwdGlvbikgPSBudWxscHRyOworICAgICAgdGhyb3cgUEhQRXhjZXB0aW9uV3JhcHBlcihleCk7CisgICAgfQorCisgICAgYXNzZXJ0KFpfVFlQRSh0KSA9PSBJU19PQkpFQ1QpOwogICB9CisKICAgflBIUFRyYW5zcG9ydCgpIHsKICAgICBlZnJlZShidWZmZXIpOwotICAgIHp2YWxfcHRyX2R0b3IoJnQpOworICAgIHp2YWxfZHRvcigmdCk7CiAgIH0KIAogICBjaGFyKiBidWZmZXI7CkBAIC0xNjAsMjAgKzE3MywxNCBAQAogICBzaXplX3QgYnVmZmVyX3VzZWQ7CiAgIHNpemVfdCBidWZmZXJfc2l6ZTsKIAotICB6dmFsKiBwOwotICB6dmFsKiB0OworICB6dmFsIHQ7CiB9OwogCiAKIGNsYXNzIFBIUE91dHB1dFRyYW5zcG9ydCA6IHB1YmxpYyBQSFBUcmFuc3BvcnQgewogcHVibGljOgotICBQSFBPdXRwdXRUcmFuc3BvcnQoenZhbCogX3AsIHNpemVfdCBfYnVmZmVyX3NpemUgPSA4MTkyKSB7Ci0gICAgY29uc3RydWN0X3dpdGhfenZhbChfcCwgX2J1ZmZlcl9zaXplKTsKLSAgfQotCi0gIH5QSFBPdXRwdXRUcmFuc3BvcnQoKSB7Ci0gICAgLy9mbHVzaCgpOwotICB9CisgIFBIUE91dHB1dFRyYW5zcG9ydCh6dmFsKiBfcCwgc2l6ZV90IF9idWZmZXJfc2l6ZSA9IDgxOTIpIDogUEhQVHJhbnNwb3J0KF9wLCBfYnVmZmVyX3NpemUpIHsgfQorICB+UEhQT3V0cHV0VHJhbnNwb3J0KCkgeyB9CiAKICAgdm9pZCB3cml0ZShjb25zdCBjaGFyKiBkYXRhLCBzaXplX3QgbGVuKSB7CiAgICAgaWYgKChsZW4gKyBidWZmZXJfdXNlZCkgPiBidWZmZXJfc2l6ZSkgewpAQCAtMjMxLDMyICsyMzgsMzUgQEAKICAgICB9CiAgIH0KICAgdm9pZCBkaXJlY3RGbHVzaCgpIHsKLSAgICB6dmFsIHJldDsKKyAgICB6dmFsIHJldCwgZmx1c2hmbjsKICAgICBaVkFMX05VTEwoJnJldCk7Ci0gICAgenZhbCBmbHVzaGZuOwotICAgIFpWQUxfU1RSSU5HKCZmbHVzaGZuLCAiZmx1c2giLCAwKTsKLSAgICBUU1JNTFNfRkVUQ0goKTsKLSAgICBjYWxsX3VzZXJfZnVuY3Rpb24oRUcoZnVuY3Rpb25fdGFibGUpLCAmdCwgJmZsdXNoZm4sICZyZXQsIDAsIE5VTEwgVFNSTUxTX0NDKTsKLSAgICB6dmFsX2R0b3IoJnJldCk7Ci0gIH0KLSAgdm9pZCBkaXJlY3RXcml0ZShjb25zdCBjaGFyKiBkYXRhLCBzaXplX3QgbGVuKSB7Ci0gICAgenZhbCB3cml0ZWZuOwotICAgIFpWQUxfU1RSSU5HKCZ3cml0ZWZuLCAid3JpdGUiLCAwKTsKLSAgICBjaGFyKiBuZXdidWYgPSAoY2hhciopZW1hbGxvYyhsZW4gKyAxKTsKLSAgICBtZW1jcHkobmV3YnVmLCBkYXRhLCBsZW4pOwotICAgIG5ld2J1ZltsZW5dID0gJ1wwJzsKLSAgICB6dmFsICphcmdzWzFdOwotICAgIE1BS0VfU1REX1pWQUwoYXJnc1swXSk7Ci0gICAgWlZBTF9TVFJJTkdMKGFyZ3NbMF0sIG5ld2J1ZiwgbGVuLCAwKTsKLSAgICBUU1JNTFNfRkVUQ0goKTsKLSAgICB6dmFsIHJldDsKLSAgICBaVkFMX05VTEwoJnJldCk7Ci0gICAgY2FsbF91c2VyX2Z1bmN0aW9uKEVHKGZ1bmN0aW9uX3RhYmxlKSwgJnQsICZ3cml0ZWZuLCAmcmV0LCAxLCBhcmdzIFRTUk1MU19DQyk7Ci0gICAgenZhbF9wdHJfZHRvcihhcmdzKTsKKyAgICBaVkFMX1NUUklORygmZmx1c2hmbiwgImZsdXNoIik7CisKKyAgICBjYWxsX3VzZXJfZnVuY3Rpb24oRUcoZnVuY3Rpb25fdGFibGUpLCAmKHRoaXMtPnQpLCAmZmx1c2hmbiwgJnJldCwgMCwgbnVsbHB0cik7CisgICAgenZhbF9kdG9yKCZmbHVzaGZuKTsKICAgICB6dmFsX2R0b3IoJnJldCk7CiAgICAgaWYgKEVHKGV4Y2VwdGlvbikpIHsKLSAgICAgIHp2YWwqIGV4ID0gRUcoZXhjZXB0aW9uKTsKLSAgICAgIEVHKGV4Y2VwdGlvbikgPSBOVUxMOworICAgICAgemVuZF9vYmplY3QgKmV4ID0gRUcoZXhjZXB0aW9uKTsKKyAgICAgIEVHKGV4Y2VwdGlvbikgPSBudWxscHRyOworICAgICAgdGhyb3cgUEhQRXhjZXB0aW9uV3JhcHBlcihleCk7CisgICAgfQorICB9CisgIHZvaWQgZGlyZWN0V3JpdGUoY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IGxlbikgeworICAgIHp2YWwgYXJnc1sxXSwgcmV0LCB3cml0ZWZuOworCisgICAgWlZBTF9TVFJJTkcoJndyaXRlZm4sICJ3cml0ZSIpOworICAgIFpWQUxfU1RSSU5HTCgmYXJnc1swXSwgZGF0YSwgbGVuKTsKKworICAgIFpWQUxfTlVMTCgmcmV0KTsKKyAgICBjYWxsX3VzZXJfZnVuY3Rpb24oRUcoZnVuY3Rpb25fdGFibGUpLCAmKHRoaXMtPnQpLCAmd3JpdGVmbiwgJnJldCwgMSwgYXJncyk7CisKKyAgICB6dmFsX2R0b3IoJndyaXRlZm4pOworICAgIHp2YWxfZHRvcigmcmV0KTsKKyAgICB6dmFsX2R0b3IoJmFyZ3NbMF0pOworCisgICAgaWYgKEVHKGV4Y2VwdGlvbikpIHsKKyAgICAgIHplbmRfb2JqZWN0ICpleCA9IEVHKGV4Y2VwdGlvbik7CisgICAgICBFRyhleGNlcHRpb24pID0gbnVsbHB0cjsKICAgICAgIHRocm93IFBIUEV4Y2VwdGlvbldyYXBwZXIoZXgpOwogICAgIH0KICAgfQpAQCAtMjY0LDggKzI3NCw3IEBACiAKIGNsYXNzIFBIUElucHV0VHJhbnNwb3J0IDogcHVibGljIFBIUFRyYW5zcG9ydCB7CiBwdWJsaWM6Ci0gIFBIUElucHV0VHJhbnNwb3J0KHp2YWwqIF9wLCBzaXplX3QgX2J1ZmZlcl9zaXplID0gODE5MikgewotICAgIGNvbnN0cnVjdF93aXRoX3p2YWwoX3AsIF9idWZmZXJfc2l6ZSk7CisgIFBIUElucHV0VHJhbnNwb3J0KHp2YWwqIF9wLCBzaXplX3QgX2J1ZmZlcl9zaXplID0gODE5MikgOiBQSFBUcmFuc3BvcnQoX3AsIF9idWZmZXJfc2l6ZSkgewogICB9CiAKICAgflBIUElucHV0VHJhbnNwb3J0KCkgewpAQCAtMjc0LDI0ICsyODMsMjEgQEAKIAogICB2b2lkIHB1dF9iYWNrKCkgewogICAgIGlmIChidWZmZXJfdXNlZCkgewotICAgICAgenZhbCBwdXRiYWNrZm47Ci0gICAgICBaVkFMX1NUUklORygmcHV0YmFja2ZuLCAicHV0QmFjayIsIDApOwotCi0gICAgICBjaGFyKiBuZXdidWYgPSAoY2hhciopZW1hbGxvYyhidWZmZXJfdXNlZCArIDEpOwotICAgICAgbWVtY3B5KG5ld2J1ZiwgYnVmZmVyX3B0ciwgYnVmZmVyX3VzZWQpOwotICAgICAgbmV3YnVmW2J1ZmZlcl91c2VkXSA9ICdcMCc7Ci0KLSAgICAgIHp2YWwgKmFyZ3NbMV07Ci0gICAgICBNQUtFX1NURF9aVkFMKGFyZ3NbMF0pOwotICAgICAgWlZBTF9TVFJJTkdMKGFyZ3NbMF0sIG5ld2J1ZiwgYnVmZmVyX3VzZWQsIDApOwotCi0gICAgICBUU1JNTFNfRkVUQ0goKTsKLQotICAgICAgenZhbCByZXQ7CisgICAgICB6dmFsIGFyZ3NbMV0sIHJldCwgcHV0YmFja2ZuOworICAgICAgWlZBTF9TVFJJTkdMKCZhcmdzWzBdLCBidWZmZXJfcHRyLCBidWZmZXJfdXNlZCk7CisgICAgICBaVkFMX1NUUklORygmcHV0YmFja2ZuLCAicHV0QmFjayIpOwogICAgICAgWlZBTF9OVUxMKCZyZXQpOwotICAgICAgY2FsbF91c2VyX2Z1bmN0aW9uKEVHKGZ1bmN0aW9uX3RhYmxlKSwgJnQsICZwdXRiYWNrZm4sICZyZXQsIDEsIGFyZ3MgVFNSTUxTX0NDKTsKLSAgICAgIHp2YWxfcHRyX2R0b3IoYXJncyk7CisKKyAgICAgIGNhbGxfdXNlcl9mdW5jdGlvbihFRyhmdW5jdGlvbl90YWJsZSksICYodGhpcy0+dCksICZwdXRiYWNrZm4sICZyZXQsIDEsIGFyZ3MpOworCisgICAgICB6dmFsX2R0b3IoJnB1dGJhY2tmbik7CiAgICAgICB6dmFsX2R0b3IoJnJldCk7CisgICAgICB6dmFsX2R0b3IoJmFyZ3NbMF0pOworICAgICAgaWYgKEVHKGV4Y2VwdGlvbikpIHsKKyAgICAgICAgemVuZF9vYmplY3QgKmV4ID0gRUcoZXhjZXB0aW9uKTsKKyAgICAgICAgRUcoZXhjZXB0aW9uKSA9IG51bGxwdHI7CisgICAgICAgIHRocm93IFBIUEV4Y2VwdGlvbldyYXBwZXIoZXgpOworICAgICAgfQogICAgIH0KICAgICBidWZmZXJfdXNlZCA9IDA7CiAgICAgYnVmZmVyX3B0ciA9IGJ1ZmZlcjsKQEAgLTI5OSw3ICszMDUsNyBAQAogCiAgIHZvaWQgc2tpcChzaXplX3QgbGVuKSB7CiAgICAgd2hpbGUgKGxlbikgewotICAgICAgc2l6ZV90IGNodW5rX3NpemUgPSBNSU4obGVuLCBidWZmZXJfdXNlZCk7CisgICAgICBzaXplX3QgY2h1bmtfc2l6ZSA9IChzdGQ6Om1pbikobGVuLCBidWZmZXJfdXNlZCk7CiAgICAgICBpZiAoY2h1bmtfc2l6ZSkgewogICAgICAgICBidWZmZXJfcHRyID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oYnVmZmVyX3B0cikgKyBjaHVua19zaXplOwogICAgICAgICBidWZmZXJfdXNlZCAtPSBjaHVua19zaXplOwpAQCAtMzEyLDcgKzMxOCw3IEBACiAKICAgdm9pZCByZWFkQnl0ZXModm9pZCogYnVmLCBzaXplX3QgbGVuKSB7CiAgICAgd2hpbGUgKGxlbikgewotICAgICAgc2l6ZV90IGNodW5rX3NpemUgPSBNSU4obGVuLCBidWZmZXJfdXNlZCk7CisgICAgICBzaXplX3QgY2h1bmtfc2l6ZSA9IChzdGQ6Om1pbikobGVuLCBidWZmZXJfdXNlZCk7CiAgICAgICBpZiAoY2h1bmtfc2l6ZSkgewogICAgICAgICBtZW1jcHkoYnVmLCBidWZmZXJfcHRyLCBjaHVua19zaXplKTsKICAgICAgICAgYnVmZmVyX3B0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGJ1ZmZlcl9wdHIpICsgY2h1bmtfc2l6ZTsKQEAgLTM1MywyOSArMzU5LDI5IEBACiAgIHZvaWQgcmVmaWxsKCkgewogICAgIGFzc2VydChidWZmZXJfdXNlZCA9PSAwKTsKICAgICB6dmFsIHJldHZhbDsKLSAgICBaVkFMX05VTEwoJnJldHZhbCk7Ci0KLSAgICB6dmFsICphcmdzWzFdOwotICAgIE1BS0VfU1REX1pWQUwoYXJnc1swXSk7Ci0gICAgWlZBTF9MT05HKGFyZ3NbMF0sIGJ1ZmZlcl9zaXplKTsKLQotICAgIFRTUk1MU19GRVRDSCgpOwotCisgICAgenZhbCBhcmdzWzFdOwogICAgIHp2YWwgZnVuY25hbWU7Ci0gICAgWlZBTF9TVFJJTkcoJmZ1bmNuYW1lLCAicmVhZCIsIDApOwogCi0gICAgY2FsbF91c2VyX2Z1bmN0aW9uKEVHKGZ1bmN0aW9uX3RhYmxlKSwgJnQsICZmdW5jbmFtZSwgJnJldHZhbCwgMSwgYXJncyBUU1JNTFNfQ0MpOwotICAgIHp2YWxfcHRyX2R0b3IoYXJncyk7CisgICAgWlZBTF9OVUxMKCZyZXR2YWwpOworICAgIFpWQUxfTE9ORygmYXJnc1swXSwgYnVmZmVyX3NpemUpOworCisgICAgWlZBTF9TVFJJTkcoJmZ1bmNuYW1lLCAicmVhZCIpOworCisgICAgY2FsbF91c2VyX2Z1bmN0aW9uKEVHKGZ1bmN0aW9uX3RhYmxlKSwgJih0aGlzLT50KSwgJmZ1bmNuYW1lLCAmcmV0dmFsLCAxLCBhcmdzKTsKKyAgICB6dmFsX2R0b3IoJmFyZ3NbMF0pOworICAgIHp2YWxfZHRvcigmZnVuY25hbWUpOwogCiAgICAgaWYgKEVHKGV4Y2VwdGlvbikpIHsKICAgICAgIHp2YWxfZHRvcigmcmV0dmFsKTsKLSAgICAgIHp2YWwqIGV4ID0gRUcoZXhjZXB0aW9uKTsKLSAgICAgIEVHKGV4Y2VwdGlvbikgPSBOVUxMOworCisgICAgICB6ZW5kX29iamVjdCAqZXggPSBFRyhleGNlcHRpb24pOworICAgICAgRUcoZXhjZXB0aW9uKSA9IG51bGxwdHI7CiAgICAgICB0aHJvdyBQSFBFeGNlcHRpb25XcmFwcGVyKGV4KTsKICAgICB9CiAKICAgICBidWZmZXJfdXNlZCA9IFpfU1RSTEVOKHJldHZhbCk7CiAgICAgbWVtY3B5KGJ1ZmZlciwgWl9TVFJWQUwocmV0dmFsKSwgYnVmZmVyX3VzZWQpOworCiAgICAgenZhbF9kdG9yKCZyZXR2YWwpOwogCiAgICAgYnVmZmVyX3B0ciA9IGJ1ZmZlcjsKQEAgLTM4MywyMjIgKzM4OSw2MyBAQAogCiB9OwogCitzdGF0aWMKIHZvaWQgYmluYXJ5X2Rlc2VyaWFsaXplX3NwZWMoenZhbCogenRoaXMsIFBIUElucHV0VHJhbnNwb3J0JiB0cmFuc3BvcnQsIEhhc2hUYWJsZSogc3BlYyk7CitzdGF0aWMKIHZvaWQgYmluYXJ5X3NlcmlhbGl6ZV9zcGVjKHp2YWwqIHp0aGlzLCBQSFBPdXRwdXRUcmFuc3BvcnQmIHRyYW5zcG9ydCwgSGFzaFRhYmxlKiBzcGVjKTsKLXZvaWQgYmluYXJ5X3NlcmlhbGl6ZShpbnQ4X3QgdGhyaWZ0X3R5cGVJRCwgUEhQT3V0cHV0VHJhbnNwb3J0JiB0cmFuc3BvcnQsIHp2YWwqKiB2YWx1ZSwgSGFzaFRhYmxlKiBmaWVsZHNwZWMpOwotdm9pZCBza2lwX2VsZW1lbnQobG9uZyB0aHJpZnRfdHlwZUlELCBQSFBJbnB1dFRyYW5zcG9ydCYgdHJhbnNwb3J0KTsKLXZvaWQgcHJvdG9jb2xfd3JpdGVNZXNzYWdlQmVnaW4oenZhbCAqdHJhbnNwb3J0LCBjb25zdCBjaGFyKiBtZXRob2RfbmFtZSwgaW50MzJfdCBtc2d0eXBlLCBpbnQzMl90IHNlcUlEKTsKLQorc3RhdGljCit2b2lkIGJpbmFyeV9zZXJpYWxpemUoaW50OF90IHRocmlmdF90eXBlSUQsIFBIUE91dHB1dFRyYW5zcG9ydCYgdHJhbnNwb3J0LCB6dmFsKiB2YWx1ZSwgSGFzaFRhYmxlKiBmaWVsZHNwZWMpOworc3RhdGljIGlubGluZQorYm9vbCB0dHlwZV9pc19zY2FsYXIoaW50OF90IHQpOwogCiAvLyBDcmVhdGUgYSBQSFAgb2JqZWN0IGdpdmVuIGEgdHlwZW5hbWUgYW5kIGNhbGwgdGhlIGN0b3IsIG9wdGlvbmFsbHkgcGFzc2luZyB1cCB0byAyIGFyZ3VtZW50cwotdm9pZCBjcmVhdGVPYmplY3QoY2hhciogb2JqX3R5cGVuYW1lLCB6dmFsKiByZXR1cm5fdmFsdWUsIGludCBuYXJncyA9IDAsIHp2YWwqIGFyZzEgPSBOVUxMLCB6dmFsKiBhcmcyID0gTlVMTCkgewotICBUU1JNTFNfRkVUQ0goKTsKLSAgc2l6ZV90IG9ial90eXBlbmFtZV9sZW4gPSBzdHJsZW4ob2JqX3R5cGVuYW1lKTsKLSAgemVuZF9jbGFzc19lbnRyeSogY2UgPSB6ZW5kX2ZldGNoX2NsYXNzKG9ial90eXBlbmFtZSwgb2JqX3R5cGVuYW1lX2xlbiwgWkVORF9GRVRDSF9DTEFTU19ERUZBVUxUIFRTUk1MU19DQyk7CitzdGF0aWMKK3ZvaWQgY3JlYXRlT2JqZWN0KGNvbnN0IGNoYXIqIG9ial90eXBlbmFtZSwgenZhbCogcmV0dXJuX3ZhbHVlLCBpbnQgbmFyZ3MgPSAwLCB6dmFsKiBhcmcxID0gbnVsbHB0ciwgenZhbCogYXJnMiA9IG51bGxwdHIpIHsKKyAgLyogaXMgdGhlcmUgYSBiZXR0ZXIgd2F5IHRvIGRvIHRoYXQgb24gdGhlIHN0YWNrID8gKi8KKyAgemVuZF9zdHJpbmcgKm9ial9uYW1lID0gemVuZF9zdHJpbmdfaW5pdChvYmpfdHlwZW5hbWUsIHN0cmxlbihvYmpfdHlwZW5hbWUpLCAwKTsKKyAgemVuZF9jbGFzc19lbnRyeSogY2UgPSB6ZW5kX2ZldGNoX2NsYXNzKG9ial9uYW1lLCBaRU5EX0ZFVENIX0NMQVNTX0RFRkFVTFQpOworICB6ZW5kX3N0cmluZ19yZWxlYXNlKG9ial9uYW1lKTsKKwogICBpZiAoISBjZSkgewotICAgIHBocF9lcnJvcl9kb2NyZWYoTlVMTCBUU1JNTFNfQ0MsIEVfRVJST1IsICJDbGFzcyAlcyBkb2VzIG5vdCBleGlzdCIsIG9ial90eXBlbmFtZSk7CisgICAgcGhwX2Vycm9yX2RvY3JlZihudWxscHRyLCBFX0VSUk9SLCAiQ2xhc3MgJXMgZG9lcyBub3QgZXhpc3QiLCBvYmpfdHlwZW5hbWUpOwogICAgIFJFVFVSTl9OVUxMKCk7CiAgIH0KIAotICBvYmplY3RfYW5kX3Byb3BlcnRpZXNfaW5pdChyZXR1cm5fdmFsdWUsIGNlLCBOVUxMKTsKLSAgemVuZF9mdW5jdGlvbiogY29uc3RydWN0b3IgPSB6ZW5kX3N0ZF9nZXRfY29uc3RydWN0b3IocmV0dXJuX3ZhbHVlIFRTUk1MU19DQyk7Ci0gIHp2YWwqIGN0b3JfcnYgPSBOVUxMOwotICB6ZW5kX2NhbGxfbWV0aG9kKCZyZXR1cm5fdmFsdWUsIGNlLCAmY29uc3RydWN0b3IsIE5VTEwsIDAsICZjdG9yX3J2LCBuYXJncywgYXJnMSwgYXJnMiBUU1JNTFNfQ0MpOwotICB6dmFsX3B0cl9kdG9yKCZjdG9yX3J2KTsKKyAgb2JqZWN0X2FuZF9wcm9wZXJ0aWVzX2luaXQocmV0dXJuX3ZhbHVlLCBjZSwgbnVsbHB0cik7CisgIHplbmRfZnVuY3Rpb24qIGNvbnN0cnVjdG9yID0gemVuZF9zdGRfZ2V0X2NvbnN0cnVjdG9yKFpfT0JKX1AocmV0dXJuX3ZhbHVlKSk7CisgIHp2YWwgY3Rvcl9ydjsKKyAgemVuZF9jYWxsX21ldGhvZChyZXR1cm5fdmFsdWUsIGNlLCAmY29uc3RydWN0b3IsIE5VTEwsIDAsICZjdG9yX3J2LCBuYXJncywgYXJnMSwgYXJnMik7CisgIHp2YWxfZHRvcigmY3Rvcl9ydik7CisgIGlmIChFRyhleGNlcHRpb24pKSB7CisgICAgemVuZF9vYmplY3QgKmV4ID0gRUcoZXhjZXB0aW9uKTsKKyAgICBFRyhleGNlcHRpb24pID0gbnVsbHB0cjsKKyAgICB0aHJvdyBQSFBFeGNlcHRpb25XcmFwcGVyKGV4KTsKKyAgfQogfQogCi12b2lkIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbihjaGFyKiB3aGF0LCBsb25nIGVycm9yY29kZSkgewotICBUU1JNTFNfRkVUQ0goKTsKK3N0YXRpYwordm9pZCB0aHJvd190cHJvdG9jb2xleGNlcHRpb24oY29uc3QgY2hhciogd2hhdCwgbG9uZyBlcnJvcmNvZGUpIHsKKyAgenZhbCB6d2hhdCwgemVycm9yY29kZTsKIAotICB6dmFsICp6d2hhdCwgKnplcnJvcmNvZGU7Ci0gIE1BS0VfU1REX1pWQUwoendoYXQpOwotICBNQUtFX1NURF9aVkFMKHplcnJvcmNvZGUpOworICBaVkFMX1NUUklORygmendoYXQsIHdoYXQpOworICBaVkFMX0xPTkcoJnplcnJvcmNvZGUsIGVycm9yY29kZSk7CiAKLSAgWlZBTF9TVFJJTkcoendoYXQsIHdoYXQsIDEpOwotICBaVkFMX0xPTkcoemVycm9yY29kZSwgZXJyb3Jjb2RlKTsKKyAgenZhbCBleDsKKyAgY3JlYXRlT2JqZWN0KCJcXFRocmlmdFxcRXhjZXB0aW9uXFxUUHJvdG9jb2xFeGNlcHRpb24iLCAmZXgsIDIsICZ6d2hhdCwgJnplcnJvcmNvZGUpOwogCi0gIHp2YWwqIGV4OwotICBNQUtFX1NURF9aVkFMKGV4KTsKLSAgY3JlYXRlT2JqZWN0KCJcXFRocmlmdFxcRXhjZXB0aW9uXFxUUHJvdG9jb2xFeGNlcHRpb24iLCBleCwgMiwgendoYXQsIHplcnJvcmNvZGUpOwotICB6dmFsX3B0cl9kdG9yKCZ6d2hhdCk7Ci0gIHp2YWxfcHRyX2R0b3IoJnplcnJvcmNvZGUpOwotICB0aHJvdyBQSFBFeGNlcHRpb25XcmFwcGVyKGV4KTsKKyAgenZhbF9kdG9yKCZ6d2hhdCk7CisgIHp2YWxfZHRvcigmemVycm9yY29kZSk7CisKKyAgdGhyb3cgUEhQRXhjZXB0aW9uV3JhcHBlcigmZXgpOwogfQogCiAvLyBTZXRzIEVHKGV4Y2VwdGlvbiksIGNhbGwgdGhpcyBhbmQgdGhlbiBSRVRVUk5fTlVMTCgpOwotdm9pZCB0aHJvd196ZW5kX2V4Y2VwdGlvbl9mcm9tX3N0ZF9leGNlcHRpb24oY29uc3Qgc3RkOjpleGNlcHRpb24mIGV4IFRTUk1MU19EQykgewotICB6ZW5kX3Rocm93X2V4Y2VwdGlvbih6ZW5kX2V4Y2VwdGlvbl9nZXRfZGVmYXVsdChUU1JNTFNfQyksIGNvbnN0X2Nhc3Q8Y2hhcio+KGV4LndoYXQoKSksIDAgVFNSTUxTX0NDKTsKK3N0YXRpYwordm9pZCB0aHJvd196ZW5kX2V4Y2VwdGlvbl9mcm9tX3N0ZF9leGNlcHRpb24oY29uc3Qgc3RkOjpleGNlcHRpb24mIGV4KSB7CisgIHplbmRfdGhyb3dfZXhjZXB0aW9uKHplbmRfZXhjZXB0aW9uX2dldF9kZWZhdWx0KCksIGNvbnN0X2Nhc3Q8Y2hhcio+KGV4LndoYXQoKSksIDApOwogfQogCi0KLXZvaWQgYmluYXJ5X2Rlc2VyaWFsaXplKGludDhfdCB0aHJpZnRfdHlwZUlELCBQSFBJbnB1dFRyYW5zcG9ydCYgdHJhbnNwb3J0LCB6dmFsKiByZXR1cm5fdmFsdWUsIEhhc2hUYWJsZSogZmllbGRzcGVjKSB7Ci0gIHp2YWwqKiB2YWxfcHRyOwotICBaX1RZUEVfUChyZXR1cm5fdmFsdWUpID0gSVNfTlVMTDsgLy8ganVzdCBpbiBjYXNlCi0KLSAgc3dpdGNoICh0aHJpZnRfdHlwZUlEKSB7Ci0gICAgY2FzZSBUX1NUT1A6Ci0gICAgY2FzZSBUX1ZPSUQ6Ci0gICAgICBSRVRVUk5fTlVMTCgpOwotICAgICAgcmV0dXJuOwotICAgIGNhc2UgVF9TVFJVQ1Q6IHsKLSAgICAgIGlmICh6ZW5kX2hhc2hfZmluZChmaWVsZHNwZWMsICJjbGFzcyIsIDYsICh2b2lkKiopJnZhbF9wdHIpICE9IFNVQ0NFU1MpIHsKLSAgICAgICAgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKCJubyBjbGFzcyB0eXBlIGluIHNwZWMiLCBJTlZBTElEX0RBVEEpOwotICAgICAgICBza2lwX2VsZW1lbnQoVF9TVFJVQ1QsIHRyYW5zcG9ydCk7Ci0gICAgICAgIFJFVFVSTl9OVUxMKCk7Ci0gICAgICB9Ci0gICAgICBjaGFyKiBzdHJ1Y3RUeXBlID0gWl9TVFJWQUxfUFAodmFsX3B0cik7Ci0gICAgICBjcmVhdGVPYmplY3Qoc3RydWN0VHlwZSwgcmV0dXJuX3ZhbHVlKTsKLSAgICAgIGlmIChaX1RZUEVfUChyZXR1cm5fdmFsdWUpID09IElTX05VTEwpIHsKLSAgICAgICAgLy8gdW5hYmxlIHRvIGNyZWF0ZSBjbGFzcyBlbnRyeQotICAgICAgICBza2lwX2VsZW1lbnQoVF9TVFJVQ1QsIHRyYW5zcG9ydCk7Ci0gICAgICAgIFJFVFVSTl9OVUxMKCk7Ci0gICAgICB9Ci0gICAgICBUU1JNTFNfRkVUQ0goKTsKLSAgICAgIHp2YWwqIHNwZWMgPSB6ZW5kX3JlYWRfc3RhdGljX3Byb3BlcnR5KHplbmRfZ2V0X2NsYXNzX2VudHJ5KHJldHVybl92YWx1ZSBUU1JNTFNfQ0MpLCAiX1RTUEVDIiwgNiwgZmFsc2UgVFNSTUxTX0NDKTsKLSAgICAgIGlmIChaX1RZUEVfUChzcGVjKSAhPSBJU19BUlJBWSkgewotICAgICAgICBjaGFyIGVycmJ1ZlsxMjhdOwotICAgICAgICBzbnByaW50ZihlcnJidWYsIDEyOCwgInNwZWMgZm9yICVzIGlzIHdyb25nIHR5cGU6ICVkXG4iLCBzdHJ1Y3RUeXBlLCBaX1RZUEVfUChzcGVjKSk7Ci0gICAgICAgIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbihlcnJidWYsIElOVkFMSURfREFUQSk7Ci0gICAgICAgIFJFVFVSTl9OVUxMKCk7Ci0gICAgICB9Ci0gICAgICBiaW5hcnlfZGVzZXJpYWxpemVfc3BlYyhyZXR1cm5fdmFsdWUsIHRyYW5zcG9ydCwgWl9BUlJWQUxfUChzcGVjKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfSBicmVhazsKLSAgICBjYXNlIFRfQk9PTDogewotICAgICAgdWludDhfdCBjOwotICAgICAgdHJhbnNwb3J0LnJlYWRCeXRlcygmYywgMSk7Ci0gICAgICBSRVRVUk5fQk9PTChjICE9IDApOwotICAgIH0KLSAgLy9jYXNlIFRfSTA4OiAvLyBzYW1lIG51bWVyaWMgdmFsdWUgYXMgVF9CWVRFCi0gICAgY2FzZSBUX0JZVEU6IHsKLSAgICAgIHVpbnQ4X3QgYzsKLSAgICAgIHRyYW5zcG9ydC5yZWFkQnl0ZXMoJmMsIDEpOwotICAgICAgUkVUVVJOX0xPTkcoKGludDhfdCljKTsKLSAgICB9Ci0gICAgY2FzZSBUX0kxNjogewotICAgICAgdWludDE2X3QgYzsKLSAgICAgIHRyYW5zcG9ydC5yZWFkQnl0ZXMoJmMsIDIpOwotICAgICAgUkVUVVJOX0xPTkcoKGludDE2X3QpbnRvaHMoYykpOwotICAgIH0KLSAgICBjYXNlIFRfSTMyOiB7Ci0gICAgICB1aW50MzJfdCBjOwotICAgICAgdHJhbnNwb3J0LnJlYWRCeXRlcygmYywgNCk7Ci0gICAgICBSRVRVUk5fTE9ORygoaW50MzJfdCludG9obChjKSk7Ci0gICAgfQotICAgIGNhc2UgVF9VNjQ6Ci0gICAgY2FzZSBUX0k2NDogewotICAgICAgdWludDY0X3QgYzsKLSAgICAgIHRyYW5zcG9ydC5yZWFkQnl0ZXMoJmMsIDgpOwotICAgICAgUkVUVVJOX0xPTkcoKGludDY0X3QpbnRvaGxsKGMpKTsKLSAgICB9Ci0gICAgY2FzZSBUX0RPVUJMRTogewotICAgICAgdW5pb24gewotICAgICAgICB1aW50NjRfdCBjOwotICAgICAgICBkb3VibGUgZDsKLSAgICAgIH0gYTsKLSAgICAgIHRyYW5zcG9ydC5yZWFkQnl0ZXMoJihhLmMpLCA4KTsKLSAgICAgIGEuYyA9IG50b2hsbChhLmMpOwotICAgICAgUkVUVVJOX0RPVUJMRShhLmQpOwotICAgIH0KLSAgICAvL2Nhc2UgVF9VVEY3OiAvLyBhbGlhc2VzIFRfU1RSSU5HCi0gICAgY2FzZSBUX1VURjg6Ci0gICAgY2FzZSBUX1VURjE2OgotICAgIGNhc2UgVF9TVFJJTkc6IHsKLSAgICAgIHVpbnQzMl90IHNpemUgPSB0cmFuc3BvcnQucmVhZFUzMigpOwotICAgICAgaWYgKHNpemUpIHsKLSAgICAgICAgY2hhciogc3RyYnVmID0gKGNoYXIqKSBlbWFsbG9jKHNpemUgKyAxKTsKLSAgICAgICAgdHJhbnNwb3J0LnJlYWRCeXRlcyhzdHJidWYsIHNpemUpOwotICAgICAgICBzdHJidWZbc2l6ZV0gPSAnXDAnOwotICAgICAgICBaVkFMX1NUUklOR0wocmV0dXJuX3ZhbHVlLCBzdHJidWYsIHNpemUsIDApOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgWlZBTF9FTVBUWV9TVFJJTkcocmV0dXJuX3ZhbHVlKTsKLSAgICAgIH0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgY2FzZSBUX01BUDogeyAvLyBhcnJheSBvZiBrZXkgLT4gdmFsdWUKLSAgICAgIHVpbnQ4X3QgdHlwZXNbMl07Ci0gICAgICB0cmFuc3BvcnQucmVhZEJ5dGVzKHR5cGVzLCAyKTsKLSAgICAgIHVpbnQzMl90IHNpemUgPSB0cmFuc3BvcnQucmVhZFUzMigpOwotICAgICAgYXJyYXlfaW5pdChyZXR1cm5fdmFsdWUpOwotCi0gICAgICB6ZW5kX2hhc2hfZmluZChmaWVsZHNwZWMsICJrZXkiLCA0LCAodm9pZCoqKSZ2YWxfcHRyKTsKLSAgICAgIEhhc2hUYWJsZSoga2V5c3BlYyA9IFpfQVJSVkFMX1BQKHZhbF9wdHIpOwotICAgICAgemVuZF9oYXNoX2ZpbmQoZmllbGRzcGVjLCAidmFsIiwgNCwgKHZvaWQqKikmdmFsX3B0cik7Ci0gICAgICBIYXNoVGFibGUqIHZhbHNwZWMgPSBaX0FSUlZBTF9QUCh2YWxfcHRyKTsKLQotICAgICAgZm9yICh1aW50MzJfdCBzID0gMDsgcyA8IHNpemU7ICsrcykgewotICAgICAgICB6dmFsICp2YWx1ZTsKLSAgICAgICAgTUFLRV9TVERfWlZBTCh2YWx1ZSk7Ci0KLSAgICAgICAgenZhbCoga2V5OwotICAgICAgICBNQUtFX1NURF9aVkFMKGtleSk7Ci0KLSAgICAgICAgYmluYXJ5X2Rlc2VyaWFsaXplKHR5cGVzWzBdLCB0cmFuc3BvcnQsIGtleSwga2V5c3BlYyk7Ci0gICAgICAgIGJpbmFyeV9kZXNlcmlhbGl6ZSh0eXBlc1sxXSwgdHJhbnNwb3J0LCB2YWx1ZSwgdmFsc3BlYyk7Ci0gICAgICAgIGlmIChaX1RZUEVfUChrZXkpID09IElTX0xPTkcpIHsKLSAgICAgICAgICB6ZW5kX2hhc2hfaW5kZXhfdXBkYXRlKHJldHVybl92YWx1ZS0+dmFsdWUuaHQsIFpfTFZBTF9QKGtleSksICZ2YWx1ZSwgc2l6ZW9mKHp2YWwgKiksIE5VTEwpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgIGlmIChaX1RZUEVfUChrZXkpICE9IElTX1NUUklORykgY29udmVydF90b19zdHJpbmcoa2V5KTsKLSAgICAgICAgICB6ZW5kX2hhc2hfdXBkYXRlKHJldHVybl92YWx1ZS0+dmFsdWUuaHQsIFpfU1RSVkFMX1Aoa2V5KSwgWl9TVFJMRU5fUChrZXkpICsgMSwgJnZhbHVlLCBzaXplb2YoenZhbCAqKSwgTlVMTCk7Ci0gICAgICAgIH0KLSAgICAgICAgenZhbF9wdHJfZHRvcigma2V5KTsKLSAgICAgIH0KLSAgICAgIHJldHVybjsgLy8gcmV0dXJuX3ZhbHVlIGFscmVhZHkgcG9wdWxhdGVkCi0gICAgfQotICAgIGNhc2UgVF9MSVNUOiB7IC8vIGFycmF5IHdpdGggYXV0b2dlbmVyYXRlZCBudW1lcmljIGtleXMKLSAgICAgIGludDhfdCB0eXBlID0gdHJhbnNwb3J0LnJlYWRJOCgpOwotICAgICAgdWludDMyX3Qgc2l6ZSA9IHRyYW5zcG9ydC5yZWFkVTMyKCk7Ci0gICAgICB6ZW5kX2hhc2hfZmluZChmaWVsZHNwZWMsICJlbGVtIiwgNSwgKHZvaWQqKikmdmFsX3B0cik7Ci0gICAgICBIYXNoVGFibGUqIGVsZW1zcGVjID0gWl9BUlJWQUxfUFAodmFsX3B0cik7Ci0KLSAgICAgIGFycmF5X2luaXQocmV0dXJuX3ZhbHVlKTsKLSAgICAgIGZvciAodWludDMyX3QgcyA9IDA7IHMgPCBzaXplOyArK3MpIHsKLSAgICAgICAgenZhbCAqdmFsdWU7Ci0gICAgICAgIE1BS0VfU1REX1pWQUwodmFsdWUpOwotICAgICAgICBiaW5hcnlfZGVzZXJpYWxpemUodHlwZSwgdHJhbnNwb3J0LCB2YWx1ZSwgZWxlbXNwZWMpOwotICAgICAgICB6ZW5kX2hhc2hfbmV4dF9pbmRleF9pbnNlcnQocmV0dXJuX3ZhbHVlLT52YWx1ZS5odCwgJnZhbHVlLCBzaXplb2YoenZhbCAqKSwgTlVMTCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGNhc2UgVF9TRVQ6IHsgLy8gYXJyYXkgb2Yga2V5IC0+IFRSVUUKLSAgICAgIHVpbnQ4X3QgdHlwZTsKLSAgICAgIHVpbnQzMl90IHNpemU7Ci0gICAgICB0cmFuc3BvcnQucmVhZEJ5dGVzKCZ0eXBlLCAxKTsKLSAgICAgIHRyYW5zcG9ydC5yZWFkQnl0ZXMoJnNpemUsIDQpOwotICAgICAgc2l6ZSA9IG50b2hsKHNpemUpOwotICAgICAgemVuZF9oYXNoX2ZpbmQoZmllbGRzcGVjLCAiZWxlbSIsIDUsICh2b2lkKiopJnZhbF9wdHIpOwotICAgICAgSGFzaFRhYmxlKiBlbGVtc3BlYyA9IFpfQVJSVkFMX1BQKHZhbF9wdHIpOwotCi0gICAgICBhcnJheV9pbml0KHJldHVybl92YWx1ZSk7Ci0KLSAgICAgIGZvciAodWludDMyX3QgcyA9IDA7IHMgPCBzaXplOyArK3MpIHsKLSAgICAgICAgenZhbCoga2V5OwotICAgICAgICB6dmFsKiB2YWx1ZTsKLSAgICAgICAgTUFLRV9TVERfWlZBTChrZXkpOwotICAgICAgICBNQUtFX1NURF9aVkFMKHZhbHVlKTsKLSAgICAgICAgWlZBTF9UUlVFKHZhbHVlKTsKLQotICAgICAgICBiaW5hcnlfZGVzZXJpYWxpemUodHlwZSwgdHJhbnNwb3J0LCBrZXksIGVsZW1zcGVjKTsKLQotICAgICAgICBpZiAoWl9UWVBFX1Aoa2V5KSA9PSBJU19MT05HKSB7Ci0gICAgICAgICAgemVuZF9oYXNoX2luZGV4X3VwZGF0ZShyZXR1cm5fdmFsdWUtPnZhbHVlLmh0LCBaX0xWQUxfUChrZXkpLCAmdmFsdWUsIHNpemVvZih6dmFsICopLCBOVUxMKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICBpZiAoWl9UWVBFX1Aoa2V5KSAhPSBJU19TVFJJTkcpIGNvbnZlcnRfdG9fc3RyaW5nKGtleSk7Ci0gICAgICAgICAgemVuZF9oYXNoX3VwZGF0ZShyZXR1cm5fdmFsdWUtPnZhbHVlLmh0LCBaX1NUUlZBTF9QKGtleSksIFpfU1RSTEVOX1Aoa2V5KSArIDEsICZ2YWx1ZSwgc2l6ZW9mKHp2YWwgKiksIE5VTEwpOwotICAgICAgICB9Ci0gICAgICAgIHp2YWxfcHRyX2R0b3IoJmtleSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm47Ci0gICAgfQotICB9OwotCi0gIGNoYXIgZXJyYnVmWzEyOF07Ci0gIHNwcmludGYoZXJyYnVmLCAiVW5rbm93biB0aHJpZnQgdHlwZUlEICVkIiwgdGhyaWZ0X3R5cGVJRCk7Ci0gIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbihlcnJidWYsIElOVkFMSURfREFUQSk7Ci19Ci0KK3N0YXRpYwogdm9pZCBza2lwX2VsZW1lbnQobG9uZyB0aHJpZnRfdHlwZUlELCBQSFBJbnB1dFRyYW5zcG9ydCYgdHJhbnNwb3J0KSB7CiAgIHN3aXRjaCAodGhyaWZ0X3R5cGVJRCkgewogICAgIGNhc2UgVF9TVE9QOgpAQCAtNjU4LDEwMSArNTA1LDQ3MiBAQAogICB0aHJvd190cHJvdG9jb2xleGNlcHRpb24oZXJyYnVmLCBJTlZBTElEX0RBVEEpOwogfQogCi12b2lkIHByb3RvY29sX3dyaXRlTWVzc2FnZUJlZ2luKHp2YWwqIHRyYW5zcG9ydCwgY29uc3QgY2hhciogbWV0aG9kX25hbWUsIGludDMyX3QgbXNndHlwZSwgaW50MzJfdCBzZXFJRCkgewotICBUU1JNTFNfRkVUQ0goKTsKLSAgenZhbCAqYXJnc1szXTsKLQotICBNQUtFX1NURF9aVkFMKGFyZ3NbMF0pOwotICBaVkFMX1NUUklOR0woYXJnc1swXSwgKGNoYXIqKW1ldGhvZF9uYW1lLCBzdHJsZW4obWV0aG9kX25hbWUpLCAxKTsKLQotICBNQUtFX1NURF9aVkFMKGFyZ3NbMV0pOwotICBaVkFMX0xPTkcoYXJnc1sxXSwgbXNndHlwZSk7Ci0KLSAgTUFLRV9TVERfWlZBTChhcmdzWzJdKTsKLSAgWlZBTF9MT05HKGFyZ3NbMl0sIHNlcUlEKTsKLQotICB6dmFsIHJldDsKLSAgWlZBTF9OVUxMKCZyZXQpOwotCi0gIHp2YWwgd3JpdGVNZXNzYWdlZm47Ci0gIFpWQUxfU1RSSU5HKCZ3cml0ZU1lc3NhZ2VmbiwgIndyaXRlTWVzc2FnZUJlZ2luIiwgMCk7Ci0KLSAgY2FsbF91c2VyX2Z1bmN0aW9uKEVHKGZ1bmN0aW9uX3RhYmxlKSwgJnRyYW5zcG9ydCwgJndyaXRlTWVzc2FnZWZuLCAmcmV0LCAzLCBhcmdzIFRTUk1MU19DQyk7Ci0KLSAgenZhbF9wdHJfZHRvcigmYXJnc1swXSk7Ci0gIHp2YWxfcHRyX2R0b3IoJmFyZ3NbMV0pOwotICB6dmFsX3B0cl9kdG9yKCZhcmdzWzJdKTsKLSAgenZhbF9kdG9yKCZyZXQpOworc3RhdGljIGlubGluZQorYm9vbCB6dmFsX2lzX2Jvb2woenZhbCogdikgeworICByZXR1cm4gWl9UWVBFX1AodikgPT0gSVNfVFJVRSB8fCBaX1RZUEVfUCh2KSA9PSBJU19GQUxTRTsKIH0KIAotdm9pZCBiaW5hcnlfc2VyaWFsaXplX2hhc2h0YWJsZV9rZXkoaW50OF90IGtleXR5cGUsIFBIUE91dHB1dFRyYW5zcG9ydCYgdHJhbnNwb3J0LCBIYXNoVGFibGUqIGh0LCBIYXNoUG9zaXRpb24mIGh0X3Bvcykgeworc3RhdGljCit2b2lkIGJpbmFyeV9kZXNlcmlhbGl6ZShpbnQ4X3QgdGhyaWZ0X3R5cGVJRCwgUEhQSW5wdXRUcmFuc3BvcnQmIHRyYW5zcG9ydCwgenZhbCogcmV0dXJuX3ZhbHVlLCBIYXNoVGFibGUqIGZpZWxkc3BlYykgeworICBaVkFMX05VTEwocmV0dXJuX3ZhbHVlKTsKKworICBzd2l0Y2ggKHRocmlmdF90eXBlSUQpIHsKKyAgICBjYXNlIFRfU1RPUDoKKyAgICBjYXNlIFRfVk9JRDoKKyAgICAgIFJFVFVSTl9OVUxMKCk7CisgICAgICByZXR1cm47CisgICAgY2FzZSBUX1NUUlVDVDogeworICAgICAgenZhbCogdmFsX3B0ciA9IHplbmRfaGFzaF9zdHJfZmluZChmaWVsZHNwZWMsICJjbGFzcyIsIHNpemVvZigiY2xhc3MiKS0xKTsKKyAgICAgIGlmICh2YWxfcHRyID09IG51bGxwdHIpIHsKKyAgICAgICAgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKCJubyBjbGFzcyB0eXBlIGluIHNwZWMiLCBJTlZBTElEX0RBVEEpOworICAgICAgICBza2lwX2VsZW1lbnQoVF9TVFJVQ1QsIHRyYW5zcG9ydCk7CisgICAgICAgIFJFVFVSTl9OVUxMKCk7CisgICAgICB9CisKKyAgICAgIGNoYXIqIHN0cnVjdFR5cGUgPSBaX1NUUlZBTF9QKHZhbF9wdHIpOworICAgICAgLy8gQ3JlYXRlIGFuIG9iamVjdCBpbiBQSFAgdXNlcmxhbmQgYmFzZWQgb24gb3VyIHNwZWMKKyAgICAgIGNyZWF0ZU9iamVjdChzdHJ1Y3RUeXBlLCByZXR1cm5fdmFsdWUpOworICAgICAgaWYgKFpfVFlQRV9QKHJldHVybl92YWx1ZSkgPT0gSVNfTlVMTCkgeworICAgICAgICAvLyB1bmFibGUgdG8gY3JlYXRlIGNsYXNzIGVudHJ5CisgICAgICAgIHNraXBfZWxlbWVudChUX1NUUlVDVCwgdHJhbnNwb3J0KTsKKyAgICAgICAgUkVUVVJOX05VTEwoKTsKKyAgICAgIH0KKworICAgICAgenZhbCogc3BlYyA9IHplbmRfcmVhZF9zdGF0aWNfcHJvcGVydHkoWl9PQkpDRV9QKHJldHVybl92YWx1ZSksICJfVFNQRUMiLCBzaXplb2YoIl9UU1BFQyIpLTEsIGZhbHNlKTsKKyAgICAgIFpWQUxfREVSRUYoc3BlYyk7CisgICAgICBpZiAoRUcoZXhjZXB0aW9uKSkgeworICAgICAgICB6ZW5kX29iamVjdCAqZXggPSBFRyhleGNlcHRpb24pOworICAgICAgICBFRyhleGNlcHRpb24pID0gbnVsbHB0cjsKKyAgICAgICAgdGhyb3cgUEhQRXhjZXB0aW9uV3JhcHBlcihleCk7CisgICAgICB9CisgICAgICBpZiAoWl9UWVBFX1Aoc3BlYykgIT0gSVNfQVJSQVkpIHsKKyAgICAgICAgY2hhciBlcnJidWZbMTI4XTsKKyAgICAgICAgc25wcmludGYoZXJyYnVmLCAxMjgsICJzcGVjIGZvciAlcyBpcyB3cm9uZyB0eXBlOiAlZFxuIiwgc3RydWN0VHlwZSwgWl9UWVBFX1Aoc3BlYykpOworICAgICAgICB0aHJvd190cHJvdG9jb2xleGNlcHRpb24oZXJyYnVmLCBJTlZBTElEX0RBVEEpOworICAgICAgICBSRVRVUk5fTlVMTCgpOworICAgICAgfQorICAgICAgYmluYXJ5X2Rlc2VyaWFsaXplX3NwZWMocmV0dXJuX3ZhbHVlLCB0cmFuc3BvcnQsIFpfQVJSVkFMX1Aoc3BlYykpOworICAgICAgcmV0dXJuOworICAgIH0gYnJlYWs7CisgICAgY2FzZSBUX0JPT0w6IHsKKyAgICAgIHVpbnQ4X3QgYzsKKyAgICAgIHRyYW5zcG9ydC5yZWFkQnl0ZXMoJmMsIDEpOworICAgICAgUkVUVVJOX0JPT0woYyAhPSAwKTsKKyAgICB9CisgIC8vY2FzZSBUX0kwODogLy8gc2FtZSBudW1lcmljIHZhbHVlIGFzIFRfQllURQorICAgIGNhc2UgVF9CWVRFOiB7CisgICAgICB1aW50OF90IGM7CisgICAgICB0cmFuc3BvcnQucmVhZEJ5dGVzKCZjLCAxKTsKKyAgICAgIFJFVFVSTl9MT05HKChpbnQ4X3QpYyk7CisgICAgfQorICAgIGNhc2UgVF9JMTY6IHsKKyAgICAgIHVpbnQxNl90IGM7CisgICAgICB0cmFuc3BvcnQucmVhZEJ5dGVzKCZjLCAyKTsKKyAgICAgIFJFVFVSTl9MT05HKChpbnQxNl90KW50b2hzKGMpKTsKKyAgICB9CisgICAgY2FzZSBUX0kzMjogeworICAgICAgdWludDMyX3QgYzsKKyAgICAgIHRyYW5zcG9ydC5yZWFkQnl0ZXMoJmMsIDQpOworICAgICAgUkVUVVJOX0xPTkcoKGludDMyX3QpbnRvaGwoYykpOworICAgIH0KKyAgICBjYXNlIFRfVTY0OgorICAgIGNhc2UgVF9JNjQ6IHsKKyAgICAgIHVpbnQ2NF90IGM7CisgICAgICB0cmFuc3BvcnQucmVhZEJ5dGVzKCZjLCA4KTsKKyAgICAgIFJFVFVSTl9MT05HKChpbnQ2NF90KW50b2hsbChjKSk7CisgICAgfQorICAgIGNhc2UgVF9ET1VCTEU6IHsKKyAgICAgIHVuaW9uIHsKKyAgICAgICAgdWludDY0X3QgYzsKKyAgICAgICAgZG91YmxlIGQ7CisgICAgICB9IGE7CisgICAgICB0cmFuc3BvcnQucmVhZEJ5dGVzKCYoYS5jKSwgOCk7CisgICAgICBhLmMgPSBudG9obGwoYS5jKTsKKyAgICAgIFJFVFVSTl9ET1VCTEUoYS5kKTsKKyAgICB9CisgICAgLy9jYXNlIFRfVVRGNzogLy8gYWxpYXNlcyBUX1NUUklORworICAgIGNhc2UgVF9VVEY4OgorICAgIGNhc2UgVF9VVEYxNjoKKyAgICBjYXNlIFRfU1RSSU5HOiB7CisgICAgICB1aW50MzJfdCBzaXplID0gdHJhbnNwb3J0LnJlYWRVMzIoKTsKKyAgICAgIGlmIChzaXplKSB7CisgICAgICAgIGNoYXIgc3RyYnVmW3NpemUrMV07CisgICAgICAgIHRyYW5zcG9ydC5yZWFkQnl0ZXMoc3RyYnVmLCBzaXplKTsKKyAgICAgICAgc3RyYnVmW3NpemVdID0gJ1wwJzsKKyAgICAgICAgWlZBTF9TVFJJTkdMKHJldHVybl92YWx1ZSwgc3RyYnVmLCBzaXplKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIFpWQUxfRU1QVFlfU1RSSU5HKHJldHVybl92YWx1ZSk7CisgICAgICB9CisgICAgICByZXR1cm47CisgICAgfQorICAgIGNhc2UgVF9NQVA6IHsgLy8gYXJyYXkgb2Yga2V5IC0+IHZhbHVlCisgICAgICB1aW50OF90IHR5cGVzWzJdOworICAgICAgdHJhbnNwb3J0LnJlYWRCeXRlcyh0eXBlcywgMik7CisgICAgICB1aW50MzJfdCBzaXplID0gdHJhbnNwb3J0LnJlYWRVMzIoKTsKKyAgICAgIGFycmF5X2luaXQocmV0dXJuX3ZhbHVlKTsKKworICAgICAgenZhbCAqdmFsX3B0cjsKKyAgICAgIHZhbF9wdHIgPSB6ZW5kX2hhc2hfc3RyX2ZpbmQoZmllbGRzcGVjLCAia2V5Iiwgc2l6ZW9mKCJrZXkiKS0xKTsKKyAgICAgIEhhc2hUYWJsZSoga2V5c3BlYyA9IFpfQVJSVkFMX1AodmFsX3B0cik7CisgICAgICB2YWxfcHRyID0gemVuZF9oYXNoX3N0cl9maW5kKGZpZWxkc3BlYywgInZhbCIsIHNpemVvZigidmFsIiktMSk7CisgICAgICBIYXNoVGFibGUqIHZhbHNwZWMgPSBaX0FSUlZBTF9QKHZhbF9wdHIpOworCisgICAgICBmb3IgKHVpbnQzMl90IHMgPSAwOyBzIDwgc2l6ZTsgKytzKSB7CisgICAgICAgIHp2YWwga2V5LCB2YWx1ZTsKKworICAgICAgICBiaW5hcnlfZGVzZXJpYWxpemUodHlwZXNbMF0sIHRyYW5zcG9ydCwgJmtleSwga2V5c3BlYyk7CisgICAgICAgIGJpbmFyeV9kZXNlcmlhbGl6ZSh0eXBlc1sxXSwgdHJhbnNwb3J0LCAmdmFsdWUsIHZhbHNwZWMpOworICAgICAgICBpZiAoWl9UWVBFKGtleSkgPT0gSVNfTE9ORykgeworICAgICAgICAgIHplbmRfaGFzaF9pbmRleF91cGRhdGUoWl9BUlJfUChyZXR1cm5fdmFsdWUpLCBaX0xWQUwoa2V5KSwgJnZhbHVlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAoWl9UWVBFKGtleSkgIT0gSVNfU1RSSU5HKSBjb252ZXJ0X3RvX3N0cmluZygma2V5KTsKKyAgICAgICAgICB6ZW5kX3N5bXRhYmxlX3VwZGF0ZShaX0FSUl9QKHJldHVybl92YWx1ZSksIFpfU1RSKGtleSksICZ2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgenZhbF9kdG9yKCZrZXkpOworICAgICAgfQorICAgICAgcmV0dXJuOyAvLyByZXR1cm5fdmFsdWUgYWxyZWFkeSBwb3B1bGF0ZWQKKyAgICB9CisgICAgY2FzZSBUX0xJU1Q6IHsgLy8gYXJyYXkgd2l0aCBhdXRvZ2VuZXJhdGVkIG51bWVyaWMga2V5cworICAgICAgaW50OF90IHR5cGUgPSB0cmFuc3BvcnQucmVhZEk4KCk7CisgICAgICB1aW50MzJfdCBzaXplID0gdHJhbnNwb3J0LnJlYWRVMzIoKTsKKyAgICAgIHp2YWwgKnZhbF9wdHIgPSB6ZW5kX2hhc2hfc3RyX2ZpbmQoZmllbGRzcGVjLCAiZWxlbSIsIHNpemVvZigiZWxlbSIpLTEpOworICAgICAgSGFzaFRhYmxlKiBlbGVtc3BlYyA9IFpfQVJSVkFMX1AodmFsX3B0cik7CisKKyAgICAgIGFycmF5X2luaXQocmV0dXJuX3ZhbHVlKTsKKyAgICAgIGZvciAodWludDMyX3QgcyA9IDA7IHMgPCBzaXplOyArK3MpIHsKKyAgICAgICAgenZhbCB2YWx1ZTsKKyAgICAgICAgYmluYXJ5X2Rlc2VyaWFsaXplKHR5cGUsIHRyYW5zcG9ydCwgJnZhbHVlLCBlbGVtc3BlYyk7CisgICAgICAgIHplbmRfaGFzaF9uZXh0X2luZGV4X2luc2VydChaX0FSUl9QKHJldHVybl92YWx1ZSksICZ2YWx1ZSk7CisgICAgICB9CisgICAgICByZXR1cm47CisgICAgfQorICAgIGNhc2UgVF9TRVQ6IHsgLy8gYXJyYXkgb2Yga2V5IC0+IFRSVUUKKyAgICAgIHVpbnQ4X3QgdHlwZTsKKyAgICAgIHVpbnQzMl90IHNpemU7CisgICAgICB0cmFuc3BvcnQucmVhZEJ5dGVzKCZ0eXBlLCAxKTsKKyAgICAgIHRyYW5zcG9ydC5yZWFkQnl0ZXMoJnNpemUsIDQpOworICAgICAgc2l6ZSA9IG50b2hsKHNpemUpOworICAgICAgenZhbCAqdmFsX3B0ciA9IHplbmRfaGFzaF9zdHJfZmluZChmaWVsZHNwZWMsICJlbGVtIiwgc2l6ZW9mKCJlbGVtIiktMSk7CisgICAgICBIYXNoVGFibGUqIGVsZW1zcGVjID0gWl9BUlJWQUxfUCh2YWxfcHRyKTsKKworICAgICAgYXJyYXlfaW5pdChyZXR1cm5fdmFsdWUpOworCisgICAgICBmb3IgKHVpbnQzMl90IHMgPSAwOyBzIDwgc2l6ZTsgKytzKSB7CisgICAgICAgIHp2YWwga2V5LCB2YWx1ZTsKKyAgICAgICAgWlZBTF9UUlVFKCZ2YWx1ZSk7CisKKyAgICAgICAgYmluYXJ5X2Rlc2VyaWFsaXplKHR5cGUsIHRyYW5zcG9ydCwgJmtleSwgZWxlbXNwZWMpOworCisgICAgICAgIGlmIChaX1RZUEUoa2V5KSA9PSBJU19MT05HKSB7CisgICAgICAgICAgemVuZF9oYXNoX2luZGV4X3VwZGF0ZShaX0FSUl9QKHJldHVybl92YWx1ZSksIFpfTFZBTChrZXkpLCAmdmFsdWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlmIChaX1RZUEUoa2V5KSAhPSBJU19TVFJJTkcpIGNvbnZlcnRfdG9fc3RyaW5nKCZrZXkpOworICAgICAgICAgIHplbmRfc3ltdGFibGVfdXBkYXRlKFpfQVJSX1AocmV0dXJuX3ZhbHVlKSwgWl9TVFIoa2V5KSwgJnZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICB6dmFsX2R0b3IoJmtleSk7CisgICAgICB9CisgICAgICByZXR1cm47CisgICAgfQorICB9OworCisgIGNoYXIgZXJyYnVmWzEyOF07CisgIHNwcmludGYoZXJyYnVmLCAiVW5rbm93biB0aHJpZnQgdHlwZUlEICVkIiwgdGhyaWZ0X3R5cGVJRCk7CisgIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbihlcnJidWYsIElOVkFMSURfREFUQSk7Cit9CisKK3N0YXRpYwordm9pZCBiaW5hcnlfc2VyaWFsaXplX2hhc2h0YWJsZV9rZXkoaW50OF90IGtleXR5cGUsIFBIUE91dHB1dFRyYW5zcG9ydCYgdHJhbnNwb3J0LCBIYXNoVGFibGUqIGh0LCBIYXNoUG9zaXRpb24mIGh0X3BvcywgSGFzaFRhYmxlKiBzcGVjKSB7CiAgIGJvb2wga2V5dHlwZV9pc19udW1lcmljID0gKCEoKGtleXR5cGUgPT0gVF9TVFJJTkcpIHx8IChrZXl0eXBlID09IFRfVVRGOCkgfHwgKGtleXR5cGUgPT0gVF9VVEYxNikpKTsKIAotICBjaGFyKiBrZXk7CisgIHplbmRfc3RyaW5nKiBrZXk7CiAgIHVpbnQga2V5X2xlbjsKICAgbG9uZyBpbmRleCA9IDA7CiAKLSAgenZhbCogejsKLSAgTUFLRV9TVERfWlZBTCh6KTsKKyAgenZhbCB6OwogCi0gIGludCByZXMgPSB6ZW5kX2hhc2hfZ2V0X2N1cnJlbnRfa2V5X2V4KGh0LCAma2V5LCAma2V5X2xlbiwgKHVsb25nKikmaW5kZXgsIDAsICZodF9wb3MpOwotICBpZiAoa2V5dHlwZV9pc19udW1lcmljKSB7Ci0gICAgaWYgKHJlcyA9PSBIQVNIX0tFWV9JU19TVFJJTkcpIHsKLSAgICAgIGluZGV4ID0gc3RydG9sKGtleSwgTlVMTCwgMTApOwotICAgIH0KLSAgICBaVkFMX0xPTkcoeiwgaW5kZXgpOworICBpbnQgcmVzID0gemVuZF9oYXNoX2dldF9jdXJyZW50X2tleV9leChodCwgJmtleSwgKHplbmRfdWxvbmcqKSZpbmRleCwgJmh0X3Bvcyk7CisgIGlmIChyZXMgPT0gSEFTSF9LRVlfSVNfU1RSSU5HKSB7CisgICAgWlZBTF9TVFJfQ09QWSgmeiwga2V5KTsKICAgfSBlbHNlIHsKLSAgICBjaGFyIGJ1Zls2NF07Ci0gICAgaWYgKHJlcyA9PSBIQVNIX0tFWV9JU19TVFJJTkcpIHsKLSAgICAgIGtleV9sZW4gLT0gMTsgLy8gc2tpcCB0aGUgbnVsbCB0ZXJtaW5hdG9yCi0gICAgfSBlbHNlIHsKLSAgICAgIHNwcmludGYoYnVmLCAiJWxkIiwgaW5kZXgpOwotICAgICAga2V5ID0gYnVmOyBrZXlfbGVuID0gc3RybGVuKGJ1Zik7Ci0gICAgfQotICAgIFpWQUxfU1RSSU5HTCh6LCBrZXksIGtleV9sZW4sIDEpOworICAgIFpWQUxfTE9ORygmeiwgaW5kZXgpOwogICB9Ci0gIGJpbmFyeV9zZXJpYWxpemUoa2V5dHlwZSwgdHJhbnNwb3J0LCAmeiwgTlVMTCk7Ci0gIHp2YWxfcHRyX2R0b3IoJnopOworICBiaW5hcnlfc2VyaWFsaXplKGtleXR5cGUsIHRyYW5zcG9ydCwgJnosIHNwZWMpOworICB6dmFsX2R0b3IoJnopOwogfQogCi1pbmxpbmUgYm9vbCB0dHlwZV9pc19pbnQoaW50OF90IHQpIHsKK3N0YXRpYwordm9pZCBiaW5hcnlfc2VyaWFsaXplKGludDhfdCB0aHJpZnRfdHlwZUlELCBQSFBPdXRwdXRUcmFuc3BvcnQmIHRyYW5zcG9ydCwgenZhbCogdmFsdWUsIEhhc2hUYWJsZSogZmllbGRzcGVjKSB7CisgIGlmICh2YWx1ZSkgeworICAgIFpWQUxfREVSRUYodmFsdWUpOworICB9CisgIC8vIEF0IHRoaXMgcG9pbnQgdGhlIHR5cGVJRCAoYW5kIGZpZWxkIG51bSwgaWYgYXBwbGljYWJsZSkgc2hvdWxkJ3ZlIGFscmVhZHkgYmVlbiB3cml0dGVuIHRvIHRoZSBvdXRwdXQgc28gYWxsIHdlIG5lZWQgdG8gZG8gaXMgd3JpdGUgdGhlIHBheWxvYWQuCisgIHN3aXRjaCAodGhyaWZ0X3R5cGVJRCkgeworICAgIGNhc2UgVF9TVE9QOgorICAgIGNhc2UgVF9WT0lEOgorICAgICAgcmV0dXJuOworICAgIGNhc2UgVF9TVFJVQ1Q6IHsKKyAgICAgIGlmIChaX1RZUEVfUCh2YWx1ZSkgIT0gSVNfT0JKRUNUKSB7CisgICAgICAgIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbigiQXR0ZW1wdCB0byBzZW5kIG5vbi1vYmplY3QgdHlwZSBhcyBhIFRfU1RSVUNUIiwgSU5WQUxJRF9EQVRBKTsKKyAgICAgIH0KKyAgICAgIHp2YWwqIHNwZWMgPSB6ZW5kX3JlYWRfc3RhdGljX3Byb3BlcnR5KFpfT0JKQ0VfUCh2YWx1ZSksICJfVFNQRUMiLCBzaXplb2YoIl9UU1BFQyIpLTEsIHRydWUpOworICAgICAgaWYgKHNwZWMgJiYgWl9UWVBFX1Aoc3BlYykgPT0gSVNfUkVGRVJFTkNFKSB7CisgICAgICAgIFpWQUxfREVSRUYoc3BlYyk7CisgICAgICB9CisgICAgICBpZiAoIXNwZWMgfHwgWl9UWVBFX1Aoc3BlYykgIT0gSVNfQVJSQVkpIHsKKyAgICAgICAgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKCJBdHRlbXB0IHRvIHNlbmQgbm9uLVRocmlmdCBvYmplY3QgYXMgYSBUX1NUUlVDVCIsIElOVkFMSURfREFUQSk7CisgICAgICB9CisgICAgICBiaW5hcnlfc2VyaWFsaXplX3NwZWModmFsdWUsIHRyYW5zcG9ydCwgWl9BUlJWQUxfUChzcGVjKSk7CisgICAgfSByZXR1cm47CisgICAgY2FzZSBUX0JPT0w6CisgICAgICBpZiAoIXp2YWxfaXNfYm9vbCh2YWx1ZSkpIGNvbnZlcnRfdG9fYm9vbGVhbih2YWx1ZSk7CisgICAgICB0cmFuc3BvcnQud3JpdGVJOChaX1RZUEVfSU5GT19QKHZhbHVlKSA9PSBJU19UUlVFID8gMSA6IDApOworICAgICAgcmV0dXJuOworICAgIGNhc2UgVF9CWVRFOgorICAgICAgaWYgKFpfVFlQRV9QKHZhbHVlKSAhPSBJU19MT05HKSBjb252ZXJ0X3RvX2xvbmcodmFsdWUpOworICAgICAgdHJhbnNwb3J0LndyaXRlSTgoWl9MVkFMX1AodmFsdWUpKTsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIFRfSTE2OgorICAgICAgaWYgKFpfVFlQRV9QKHZhbHVlKSAhPSBJU19MT05HKSBjb252ZXJ0X3RvX2xvbmcodmFsdWUpOworICAgICAgdHJhbnNwb3J0LndyaXRlSTE2KFpfTFZBTF9QKHZhbHVlKSk7CisgICAgICByZXR1cm47CisgICAgY2FzZSBUX0kzMjoKKyAgICAgIGlmIChaX1RZUEVfUCh2YWx1ZSkgIT0gSVNfTE9ORykgY29udmVydF90b19sb25nKHZhbHVlKTsKKyAgICAgIHRyYW5zcG9ydC53cml0ZUkzMihaX0xWQUxfUCh2YWx1ZSkpOworICAgICAgcmV0dXJuOworICAgIGNhc2UgVF9JNjQ6CisgICAgY2FzZSBUX1U2NDogeworICAgICAgaW50NjRfdCBsX2RhdGE7CisjaWYgZGVmaW5lZChfTFA2NCkgfHwgZGVmaW5lZChfV0lONjQpCisgICAgICBpZiAoWl9UWVBFX1AodmFsdWUpICE9IElTX0xPTkcpIGNvbnZlcnRfdG9fbG9uZyh2YWx1ZSk7CisgICAgICBsX2RhdGEgPSBaX0xWQUxfUCh2YWx1ZSk7CisjZWxzZQorICAgICAgaWYgKFpfVFlQRV9QKHZhbHVlKSAhPSBJU19ET1VCTEUpIGNvbnZlcnRfdG9fZG91YmxlKHZhbHVlKTsKKyAgICAgIGxfZGF0YSA9IChpbnQ2NF90KVpfRFZBTF9QKHZhbHVlKTsKKyNlbmRpZgorICAgICAgdHJhbnNwb3J0LndyaXRlSTY0KGxfZGF0YSk7CisgICAgfSByZXR1cm47CisgICAgY2FzZSBUX0RPVUJMRTogeworICAgICAgdW5pb24geworICAgICAgICBpbnQ2NF90IGM7CisgICAgICAgIGRvdWJsZSBkOworICAgICAgfSBhOworICAgICAgaWYgKFpfVFlQRV9QKHZhbHVlKSAhPSBJU19ET1VCTEUpIGNvbnZlcnRfdG9fZG91YmxlKHZhbHVlKTsKKyAgICAgIGEuZCA9IFpfRFZBTF9QKHZhbHVlKTsKKyAgICAgIHRyYW5zcG9ydC53cml0ZUk2NChhLmMpOworICAgIH0gcmV0dXJuOworICAgIGNhc2UgVF9VVEY4OgorICAgIGNhc2UgVF9VVEYxNjoKKyAgICBjYXNlIFRfU1RSSU5HOgorICAgICAgaWYgKFpfVFlQRV9QKHZhbHVlKSAhPSBJU19TVFJJTkcpIGNvbnZlcnRfdG9fc3RyaW5nKHZhbHVlKTsKKyAgICAgIHRyYW5zcG9ydC53cml0ZVN0cmluZyhaX1NUUlZBTF9QKHZhbHVlKSwgWl9TVFJMRU5fUCh2YWx1ZSkpOworICAgICAgcmV0dXJuOworICAgIGNhc2UgVF9NQVA6IHsKKyAgICAgIGlmIChaX1RZUEVfUCh2YWx1ZSkgIT0gSVNfQVJSQVkpIGNvbnZlcnRfdG9fYXJyYXkodmFsdWUpOworICAgICAgaWYgKFpfVFlQRV9QKHZhbHVlKSAhPSBJU19BUlJBWSkgeworICAgICAgICB0aHJvd190cHJvdG9jb2xleGNlcHRpb24oIkF0dGVtcHQgdG8gc2VuZCBhbiBpbmNvbXBhdGlibGUgdHlwZSBhcyBhbiBhcnJheSAoVF9NQVApIiwgSU5WQUxJRF9EQVRBKTsKKyAgICAgIH0KKyAgICAgIEhhc2hUYWJsZSogaHQgPSBaX0FSUlZBTF9QKHZhbHVlKTsKKyAgICAgIHp2YWwqIHZhbF9wdHI7CisKKyAgICAgIHZhbF9wdHIgPSB6ZW5kX2hhc2hfc3RyX2ZpbmQoZmllbGRzcGVjLCAia3R5cGUiLCBzaXplb2YoImt0eXBlIiktMSk7CisgICAgICBpZiAoWl9UWVBFX1AodmFsX3B0cikgIT0gSVNfTE9ORykgY29udmVydF90b19sb25nKHZhbF9wdHIpOworICAgICAgdWludDhfdCBrZXl0eXBlID0gWl9MVkFMX1AodmFsX3B0cik7CisgICAgICB0cmFuc3BvcnQud3JpdGVJOChrZXl0eXBlKTsKKyAgICAgIHZhbF9wdHIgPSB6ZW5kX2hhc2hfc3RyX2ZpbmQoZmllbGRzcGVjLCAidnR5cGUiLCBzaXplb2YoInZ0eXBlIiktMSk7CisgICAgICBpZiAoWl9UWVBFX1AodmFsX3B0cikgIT0gSVNfTE9ORykgY29udmVydF90b19sb25nKHZhbF9wdHIpOworICAgICAgdWludDhfdCB2YWx0eXBlID0gWl9MVkFMX1AodmFsX3B0cik7CisgICAgICB0cmFuc3BvcnQud3JpdGVJOCh2YWx0eXBlKTsKKworICAgICAgdmFsX3B0ciA9IHplbmRfaGFzaF9zdHJfZmluZChmaWVsZHNwZWMsICJ2YWwiLCBzaXplb2YoInZhbCIpLTEpOworICAgICAgSGFzaFRhYmxlKiB2YWxzcGVjID0gWl9BUlJWQUxfUCh2YWxfcHRyKTsKKyAgICAgIEhhc2hUYWJsZSoga2V5c3BlYyA9IFpfQVJSVkFMX1AoemVuZF9oYXNoX3N0cl9maW5kKGZpZWxkc3BlYywgImtleSIsIHNpemVvZigia2V5IiktMSkpOworCisgICAgICB0cmFuc3BvcnQud3JpdGVJMzIoemVuZF9oYXNoX251bV9lbGVtZW50cyhodCkpOworICAgICAgSGFzaFBvc2l0aW9uIGtleV9wdHI7CisgICAgICBmb3IgKHplbmRfaGFzaF9pbnRlcm5hbF9wb2ludGVyX3Jlc2V0X2V4KGh0LCAma2V5X3B0cik7CisgICAgICAgICAgICh2YWxfcHRyID0gemVuZF9oYXNoX2dldF9jdXJyZW50X2RhdGFfZXgoaHQsICZrZXlfcHRyKSkgIT0gbnVsbHB0cjsKKyAgICAgICAgICAgemVuZF9oYXNoX21vdmVfZm9yd2FyZF9leChodCwgJmtleV9wdHIpKSB7CisgICAgICAgIGJpbmFyeV9zZXJpYWxpemVfaGFzaHRhYmxlX2tleShrZXl0eXBlLCB0cmFuc3BvcnQsIGh0LCBrZXlfcHRyLCBrZXlzcGVjKTsKKyAgICAgICAgYmluYXJ5X3NlcmlhbGl6ZSh2YWx0eXBlLCB0cmFuc3BvcnQsIHZhbF9wdHIsIHZhbHNwZWMpOworICAgICAgfQorICAgIH0gcmV0dXJuOworICAgIGNhc2UgVF9MSVNUOiB7CisgICAgICBpZiAoWl9UWVBFX1AodmFsdWUpICE9IElTX0FSUkFZKSBjb252ZXJ0X3RvX2FycmF5KHZhbHVlKTsKKyAgICAgIGlmIChaX1RZUEVfUCh2YWx1ZSkgIT0gSVNfQVJSQVkpIHsKKyAgICAgICAgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKCJBdHRlbXB0IHRvIHNlbmQgYW4gaW5jb21wYXRpYmxlIHR5cGUgYXMgYW4gYXJyYXkgKFRfTElTVCkiLCBJTlZBTElEX0RBVEEpOworICAgICAgfQorICAgICAgSGFzaFRhYmxlKiBodCA9IFpfQVJSVkFMX1AodmFsdWUpOworICAgICAgenZhbCogdmFsX3B0cjsKKworICAgICAgdmFsX3B0ciA9IHplbmRfaGFzaF9zdHJfZmluZChmaWVsZHNwZWMsICJldHlwZSIsIHNpemVvZigiZXR5cGUiKS0xKTsKKyAgICAgIGlmIChaX1RZUEVfUCh2YWxfcHRyKSAhPSBJU19MT05HKSBjb252ZXJ0X3RvX2xvbmcodmFsX3B0cik7CisgICAgICB1aW50OF90IHZhbHR5cGUgPSBaX0xWQUxfUCh2YWxfcHRyKTsKKyAgICAgIHRyYW5zcG9ydC53cml0ZUk4KHZhbHR5cGUpOworCisgICAgICB2YWxfcHRyID0gemVuZF9oYXNoX3N0cl9maW5kKGZpZWxkc3BlYywgImVsZW0iLCBzaXplb2YoImVsZW0iKS0xKTsKKyAgICAgIEhhc2hUYWJsZSogdmFsc3BlYyA9IFpfQVJSVkFMX1AodmFsX3B0cik7CisKKyAgICAgIHRyYW5zcG9ydC53cml0ZUkzMih6ZW5kX2hhc2hfbnVtX2VsZW1lbnRzKGh0KSk7CisgICAgICBIYXNoUG9zaXRpb24ga2V5X3B0cjsKKyAgICAgIGZvciAoemVuZF9oYXNoX2ludGVybmFsX3BvaW50ZXJfcmVzZXRfZXgoaHQsICZrZXlfcHRyKTsKKyAgICAgICAgICAgKHZhbF9wdHIgPSB6ZW5kX2hhc2hfZ2V0X2N1cnJlbnRfZGF0YV9leChodCwgJmtleV9wdHIpKSAhPSBudWxscHRyOworICAgICAgICAgICB6ZW5kX2hhc2hfbW92ZV9mb3J3YXJkX2V4KGh0LCAma2V5X3B0cikpIHsKKyAgICAgICAgYmluYXJ5X3NlcmlhbGl6ZSh2YWx0eXBlLCB0cmFuc3BvcnQsIHZhbF9wdHIsIHZhbHNwZWMpOworICAgICAgfQorICAgIH0gcmV0dXJuOworICAgIGNhc2UgVF9TRVQ6IHsKKyAgICAgIGlmIChaX1RZUEVfUCh2YWx1ZSkgIT0gSVNfQVJSQVkpIGNvbnZlcnRfdG9fYXJyYXkodmFsdWUpOworICAgICAgaWYgKFpfVFlQRV9QKHZhbHVlKSAhPSBJU19BUlJBWSkgeworICAgICAgICB0aHJvd190cHJvdG9jb2xleGNlcHRpb24oIkF0dGVtcHQgdG8gc2VuZCBhbiBpbmNvbXBhdGlibGUgdHlwZSBhcyBhbiBhcnJheSAoVF9TRVQpIiwgSU5WQUxJRF9EQVRBKTsKKyAgICAgIH0KKyAgICAgIEhhc2hUYWJsZSogaHQgPSBaX0FSUlZBTF9QKHZhbHVlKTsKKyAgICAgIHp2YWwqIHZhbF9wdHI7CisKKyAgICAgIHZhbF9wdHIgPSB6ZW5kX2hhc2hfc3RyX2ZpbmQoZmllbGRzcGVjLCAiZXR5cGUiLCBzaXplb2YoImV0eXBlIiktMSk7CisgICAgICBIYXNoVGFibGUqIHNwZWMgPSBaX0FSUlZBTF9QKHplbmRfaGFzaF9zdHJfZmluZChmaWVsZHNwZWMsICJlbGVtIiwgc2l6ZW9mKCJlbGVtIiktMSkpOworICAgICAgaWYgKFpfVFlQRV9QKHZhbF9wdHIpICE9IElTX0xPTkcpIGNvbnZlcnRfdG9fbG9uZyh2YWxfcHRyKTsKKyAgICAgIHVpbnQ4X3Qga2V5dHlwZSA9IFpfTFZBTF9QKHZhbF9wdHIpOworICAgICAgdHJhbnNwb3J0LndyaXRlSTgoa2V5dHlwZSk7CisKKyAgICAgIHRyYW5zcG9ydC53cml0ZUkzMih6ZW5kX2hhc2hfbnVtX2VsZW1lbnRzKGh0KSk7CisgICAgICBIYXNoUG9zaXRpb24ga2V5X3B0cjsKKyAgICAgIGlmKHR0eXBlX2lzX3NjYWxhcihrZXl0eXBlKSl7CisgICAgICAgIGZvciAoemVuZF9oYXNoX2ludGVybmFsX3BvaW50ZXJfcmVzZXRfZXgoaHQsICZrZXlfcHRyKTsKKyAgICAgICAgICAgICAodmFsX3B0ciA9IHplbmRfaGFzaF9nZXRfY3VycmVudF9kYXRhX2V4KGh0LCAma2V5X3B0cikpICE9IG51bGxwdHI7CisgICAgICAgICAgICAgemVuZF9oYXNoX21vdmVfZm9yd2FyZF9leChodCwgJmtleV9wdHIpKSB7CisgICAgICAgICAgYmluYXJ5X3NlcmlhbGl6ZV9oYXNodGFibGVfa2V5KGtleXR5cGUsIHRyYW5zcG9ydCwgaHQsIGtleV9wdHIsIHNwZWMpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBmb3IgKHplbmRfaGFzaF9pbnRlcm5hbF9wb2ludGVyX3Jlc2V0X2V4KGh0LCAma2V5X3B0cik7CisgICAgICAgICAgICAgKHZhbF9wdHIgPSB6ZW5kX2hhc2hfZ2V0X2N1cnJlbnRfZGF0YV9leChodCwgJmtleV9wdHIpKSAhPSBudWxscHRyOworICAgICAgICAgICAgIHplbmRfaGFzaF9tb3ZlX2ZvcndhcmRfZXgoaHQsICZrZXlfcHRyKSkgeworICAgICAgICAgIGJpbmFyeV9zZXJpYWxpemUoa2V5dHlwZSwgdHJhbnNwb3J0LCB2YWxfcHRyLCBzcGVjKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gcmV0dXJuOworICB9OworCisgIGNoYXIgZXJyYnVmWzEyOF07CisgIHNucHJpbnRmKGVycmJ1ZiwgMTI4LCAiVW5rbm93biB0aHJpZnQgdHlwZUlEICVkIiwgdGhyaWZ0X3R5cGVJRCk7CisgIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbihlcnJidWYsIElOVkFMSURfREFUQSk7Cit9CisKK3N0YXRpYwordm9pZCBwcm90b2NvbF93cml0ZU1lc3NhZ2VCZWdpbih6dmFsKiB0cmFuc3BvcnQsIHplbmRfc3RyaW5nKiBtZXRob2RfbmFtZSwgaW50MzJfdCBtc2d0eXBlLCBpbnQzMl90IHNlcUlEKSB7CisgIHp2YWwgYXJnc1szXTsKKyAgenZhbCByZXQ7CisgIHp2YWwgd3JpdGVNZXNzYWdlZm47CisKKyAgWlZBTF9TVFJfQ09QWSgmYXJnc1swXSwgbWV0aG9kX25hbWUpOworICBaVkFMX0xPTkcoJmFyZ3NbMV0sIG1zZ3R5cGUpOworICBaVkFMX0xPTkcoJmFyZ3NbMl0sIHNlcUlEKTsKKyAgWlZBTF9OVUxMKCZyZXQpOworICBaVkFMX1NUUklORygmd3JpdGVNZXNzYWdlZm4sICJ3cml0ZU1lc3NhZ2VCZWdpbiIpOworCisgIGNhbGxfdXNlcl9mdW5jdGlvbihFRyhmdW5jdGlvbl90YWJsZSksIHRyYW5zcG9ydCwgJndyaXRlTWVzc2FnZWZuLCAmcmV0LCAzLCBhcmdzKTsKKworICB6dmFsX2R0b3IoJndyaXRlTWVzc2FnZWZuKTsKKyAgenZhbF9kdG9yKCZhcmdzWzJdKTsgenZhbF9kdG9yKCZhcmdzWzFdKTsgenZhbF9kdG9yKCZhcmdzWzBdKTsKKyAgenZhbF9kdG9yKCZyZXQpOworICBpZiAoRUcoZXhjZXB0aW9uKSkgeworICAgIHplbmRfb2JqZWN0ICpleCA9IEVHKGV4Y2VwdGlvbik7CisgICAgRUcoZXhjZXB0aW9uKSA9IG51bGxwdHI7CisgICAgdGhyb3cgUEhQRXhjZXB0aW9uV3JhcHBlcihleCk7CisgIH0KK30KKworc3RhdGljIGlubGluZQorYm9vbCB0dHlwZV9pc19pbnQoaW50OF90IHQpIHsKICAgcmV0dXJuICgodCA9PSBUX0JZVEUpIHx8ICgodCA+PSBUX0kxNikgICYmICh0IDw9IFRfSTY0KSkpOwogfQorc3RhdGljIGlubGluZQorYm9vbCB0dHlwZV9pc19zY2FsYXIoaW50OF90IHQpIHsKKyAgcmV0dXJuICEoKHQgPT0gVF9TVFJVQ1QpIHx8ICggdD09IFRfTUFQKSAgfHwgKHQgPT0gVF9TRVQpIHx8ICh0ID09IFRfTElTVCkpOworfQogCi1pbmxpbmUgYm9vbCB0dHlwZXNfYXJlX2NvbXBhdGlibGUoaW50OF90IHQxLCBpbnQ4X3QgdDIpIHsKK3N0YXRpYyBpbmxpbmUKK2Jvb2wgdHR5cGVzX2FyZV9jb21wYXRpYmxlKGludDhfdCB0MSwgaW50OF90IHQyKSB7CiAgIC8vIEludGVnZXIgdHlwZXMgb2YgZGlmZmVyZW50IHdpZHRocyBhcmUgY29uc2lkZXJlZCBjb21wYXRpYmxlOwogICAvLyBvdGhlcndpc2UgdGhlIHR5cGVJRCBtdXN0IG1hdGNoLgogICByZXR1cm4gKCh0MSA9PSB0MikgfHwgKHR0eXBlX2lzX2ludCh0MSkgJiYgdHR5cGVfaXNfaW50KHQyKSkpOwogfQogCisvL2lzIHVzZWQgdG8gdmFsaWRhdGUgb2JqZWN0cyBiZWZvcmUgc2VyaWFsaXphdGlvbiBhbmQgYWZ0ZXIgZGVzZXJpYWxpemF0aW9uLiBGb3Igbm93LCBvbmx5IHJlcXVpcmVkIGZpZWxkcyBhcmUgdmFsaWRhdGVkLgorc3RhdGljCit2b2lkIHZhbGlkYXRlX3RocmlmdF9vYmplY3QoenZhbCogb2JqZWN0KSB7CisgICAgemVuZF9jbGFzc19lbnRyeSogb2JqZWN0X2NsYXNzX2VudHJ5ID0gWl9PQkpDRV9QKG9iamVjdCk7CisgICAgenZhbCogaXNfdmFsaWRhdGUgPSB6ZW5kX3JlYWRfc3RhdGljX3Byb3BlcnR5KG9iamVjdF9jbGFzc19lbnRyeSwgImlzVmFsaWRhdGUiLCBzaXplb2YoImlzVmFsaWRhdGUiKS0xLCB0cnVlKTsKKyAgICBpZiAoaXNfdmFsaWRhdGUpIHsKKyAgICAgIFpWQUxfREVSRUYoaXNfdmFsaWRhdGUpOworICAgIH0KKyAgICB6dmFsKiBzcGVjID0gemVuZF9yZWFkX3N0YXRpY19wcm9wZXJ0eShvYmplY3RfY2xhc3NfZW50cnksICJfVFNQRUMiLCBzaXplb2YoIl9UU1BFQyIpLTEsIHRydWUpOworICAgIGlmIChzcGVjKSB7CisgICAgICBaVkFMX0RFUkVGKHNwZWMpOworICAgIH0KKyAgICBIYXNoUG9zaXRpb24ga2V5X3B0cjsKKyAgICB6dmFsKiB2YWxfcHRyOworCisgICAgaWYgKGlzX3ZhbGlkYXRlICYmIFpfVFlQRV9JTkZPX1AoaXNfdmFsaWRhdGUpID09IElTX1RSVUUpIHsKKyAgICAgICAgZm9yICh6ZW5kX2hhc2hfaW50ZXJuYWxfcG9pbnRlcl9yZXNldF9leChaX0FSUlZBTF9QKHNwZWMpLCAma2V5X3B0cik7CisgICAgICAgICAgICh2YWxfcHRyID0gemVuZF9oYXNoX2dldF9jdXJyZW50X2RhdGFfZXgoWl9BUlJWQUxfUChzcGVjKSwgJmtleV9wdHIpKSAhPSBudWxscHRyOworICAgICAgICAgICB6ZW5kX2hhc2hfbW92ZV9mb3J3YXJkX2V4KFpfQVJSVkFMX1Aoc3BlYyksICZrZXlfcHRyKSkgeworCisgICAgICAgICAgICB6ZW5kX3Vsb25nIGZpZWxkbm87CisgICAgICAgICAgICBpZiAoemVuZF9oYXNoX2dldF9jdXJyZW50X2tleV9leChaX0FSUlZBTF9QKHNwZWMpLCBudWxscHRyLCAmZmllbGRubywgJmtleV9wdHIpICE9IEhBU0hfS0VZX0lTX0xPTkcpIHsKKyAgICAgICAgICAgICAgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKCJCYWQga2V5dHlwZSBpbiBUU1BFQyAoZXhwZWN0ZWQgJ2xvbmcnKSIsIElOVkFMSURfREFUQSk7CisgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEhhc2hUYWJsZSogZmllbGRzcGVjID0gWl9BUlJWQUxfUCh2YWxfcHRyKTsKKworICAgICAgICAgICAgLy8gZmllbGQgbmFtZQorICAgICAgICAgICAgenZhbCogenZhcm5hbWUgPSB6ZW5kX2hhc2hfc3RyX2ZpbmQoZmllbGRzcGVjLCAidmFyIiwgc2l6ZW9mKCJ2YXIiKS0xKTsKKyAgICAgICAgICAgIGNoYXIqIHZhcm5hbWUgPSBaX1NUUlZBTF9QKHp2YXJuYW1lKTsKKworICAgICAgICAgICAgenZhbCogaXNfcmVxdWlyZWQgPSB6ZW5kX2hhc2hfc3RyX2ZpbmQoZmllbGRzcGVjLCAiaXNSZXF1aXJlZCIsIHNpemVvZigiaXNSZXF1aXJlZCIpLTEpOworICAgICAgICAgICAgenZhbCBydjsKKyAgICAgICAgICAgIHp2YWwqIHByb3AgPSB6ZW5kX3JlYWRfcHJvcGVydHkob2JqZWN0X2NsYXNzX2VudHJ5LCBvYmplY3QsIHZhcm5hbWUsIHN0cmxlbih2YXJuYW1lKSwgZmFsc2UsICZydik7CisKKyAgICAgICAgICAgIGlmIChaX1RZUEVfSU5GT19QKGlzX3JlcXVpcmVkKSA9PSBJU19UUlVFICYmIFpfVFlQRV9QKHByb3ApID09IElTX05VTEwpIHsKKyAgICAgICAgICAgICAgICBjaGFyIGVycmJ1ZlsxMjhdOworICAgICAgICAgICAgICAgIHNucHJpbnRmKGVycmJ1ZiwgMTI4LCAiUmVxdWlyZWQgZmllbGQgJXMuJXMgaXMgdW5zZXQhIiwgWlNUUl9WQUwob2JqZWN0X2NsYXNzX2VudHJ5LT5uYW1lKSwgdmFybmFtZSk7CisgICAgICAgICAgICAgICAgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKGVycmJ1ZiwgSU5WQUxJRF9EQVRBKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljCiB2b2lkIGJpbmFyeV9kZXNlcmlhbGl6ZV9zcGVjKHp2YWwqIHp0aGlzLCBQSFBJbnB1dFRyYW5zcG9ydCYgdHJhbnNwb3J0LCBIYXNoVGFibGUqIHNwZWMpIHsKICAgLy8gU0VUIGFuZCBMSVNUIGhhdmUgJ2VsZW0nID0+IGFycmF5KCd0eXBlJywgW29wdGlvbmFsXSAnY2xhc3MnKQogICAvLyBNQVAgaGFzICd2YWwnID0+IGFycmF5KCd0eXBlJywgW29wdGlvbmFdICdjbGFzcycpCi0gIFRTUk1MU19GRVRDSCgpOwotICB6ZW5kX2NsYXNzX2VudHJ5KiBjZSA9IHplbmRfZ2V0X2NsYXNzX2VudHJ5KHp0aGlzIFRTUk1MU19DQyk7CisgIHplbmRfY2xhc3NfZW50cnkqIGNlID0gWl9PQkpDRV9QKHp0aGlzKTsKICAgd2hpbGUgKHRydWUpIHsKLSAgICB6dmFsKiogdmFsX3B0ciA9IE5VTEw7Ci0KICAgICBpbnQ4X3QgdHR5cGUgPSB0cmFuc3BvcnQucmVhZEk4KCk7Ci0gICAgaWYgKHR0eXBlID09IFRfU1RPUCkgcmV0dXJuOworICAgIGlmICh0dHlwZSA9PSBUX1NUT1ApIHsKKyAgICAgIHZhbGlkYXRlX3RocmlmdF9vYmplY3QoenRoaXMpOworICAgICAgcmV0dXJuOworICAgIH0KKwogICAgIGludDE2X3QgZmllbGRubyA9IHRyYW5zcG9ydC5yZWFkSTE2KCk7Ci0gICAgaWYgKHplbmRfaGFzaF9pbmRleF9maW5kKHNwZWMsIGZpZWxkbm8sICh2b2lkKiopJnZhbF9wdHIpID09IFNVQ0NFU1MpIHsKLSAgICAgIEhhc2hUYWJsZSogZmllbGRzcGVjID0gWl9BUlJWQUxfUFAodmFsX3B0cik7CisgICAgenZhbCogdmFsX3B0ciA9IHplbmRfaGFzaF9pbmRleF9maW5kKHNwZWMsIGZpZWxkbm8pOworICAgIGlmICh2YWxfcHRyICE9IG51bGxwdHIpIHsKKyAgICAgIEhhc2hUYWJsZSogZmllbGRzcGVjID0gWl9BUlJWQUxfUCh2YWxfcHRyKTsKICAgICAgIC8vIHB1bGwgdGhlIGZpZWxkIG5hbWUKLSAgICAgIC8vIHplbmQgaGFzaCB0YWJsZXMgdXNlIHRoZSBudWxsIGF0IHRoZSBlbmQgaW4gdGhlIGxlbmd0aC4uLiBzbyBzdHJsZW4oaGFzaCBrZXkpICsgMS4KLSAgICAgIHplbmRfaGFzaF9maW5kKGZpZWxkc3BlYywgInZhciIsIDQsICh2b2lkKiopJnZhbF9wdHIpOwotICAgICAgY2hhciogdmFybmFtZSA9IFpfU1RSVkFMX1BQKHZhbF9wdHIpOworICAgICAgdmFsX3B0ciA9IHplbmRfaGFzaF9zdHJfZmluZChmaWVsZHNwZWMsICJ2YXIiLCBzaXplb2YoInZhciIpLTEpOworICAgICAgY2hhciogdmFybmFtZSA9IFpfU1RSVkFMX1AodmFsX3B0cik7CiAKICAgICAgIC8vIGFuZCB0aGUgdHlwZQotICAgICAgemVuZF9oYXNoX2ZpbmQoZmllbGRzcGVjLCAidHlwZSIsIDUsICh2b2lkKiopJnZhbF9wdHIpOwotICAgICAgaWYgKFpfVFlQRV9QUCh2YWxfcHRyKSAhPSBJU19MT05HKSBjb252ZXJ0X3RvX2xvbmcoKnZhbF9wdHIpOwotICAgICAgaW50OF90IGV4cGVjdGVkX3R0eXBlID0gWl9MVkFMX1BQKHZhbF9wdHIpOworICAgICAgdmFsX3B0ciA9IHplbmRfaGFzaF9zdHJfZmluZChmaWVsZHNwZWMsICJ0eXBlIiwgc2l6ZW9mKCJ0eXBlIiktMSk7CisgICAgICBpZiAoWl9UWVBFX1AodmFsX3B0cikgIT0gSVNfTE9ORykgY29udmVydF90b19sb25nKHZhbF9wdHIpOworICAgICAgaW50OF90IGV4cGVjdGVkX3R0eXBlID0gWl9MVkFMX1AodmFsX3B0cik7CiAKICAgICAgIGlmICh0dHlwZXNfYXJlX2NvbXBhdGlibGUodHR5cGUsIGV4cGVjdGVkX3R0eXBlKSkgewotICAgICAgICB6dmFsKiBydiA9IE5VTEw7Ci0gICAgICAgIE1BS0VfU1REX1pWQUwocnYpOwotICAgICAgICBiaW5hcnlfZGVzZXJpYWxpemUodHR5cGUsIHRyYW5zcG9ydCwgcnYsIGZpZWxkc3BlYyk7Ci0gICAgICAgIHplbmRfdXBkYXRlX3Byb3BlcnR5KGNlLCB6dGhpcywgdmFybmFtZSwgc3RybGVuKHZhcm5hbWUpLCBydiBUU1JNTFNfQ0MpOworICAgICAgICB6dmFsIHJ2OworICAgICAgICBaVkFMX1VOREVGKCZydik7CisKKyAgICAgICAgYmluYXJ5X2Rlc2VyaWFsaXplKHR0eXBlLCB0cmFuc3BvcnQsICZydiwgZmllbGRzcGVjKTsKKyAgICAgICAgemVuZF91cGRhdGVfcHJvcGVydHkoY2UsIHp0aGlzLCB2YXJuYW1lLCBzdHJsZW4odmFybmFtZSksICZydik7CisKICAgICAgICAgenZhbF9wdHJfZHRvcigmcnYpOwogICAgICAgfSBlbHNlIHsKICAgICAgICAgc2tpcF9lbGVtZW50KHR0eXBlLCB0cmFuc3BvcnQpOwpAQCAtNzYzLDE3MSArOTgxLDQ0IEBACiAgIH0KIH0KIAotdm9pZCBiaW5hcnlfc2VyaWFsaXplKGludDhfdCB0aHJpZnRfdHlwZUlELCBQSFBPdXRwdXRUcmFuc3BvcnQmIHRyYW5zcG9ydCwgenZhbCoqIHZhbHVlLCBIYXNoVGFibGUqIGZpZWxkc3BlYykgewotICAvLyBBdCB0aGlzIHBvaW50IHRoZSB0eXBlSUQgKGFuZCBmaWVsZCBudW0sIGlmIGFwcGxpY2FibGUpIHNob3VsZCd2ZSBhbHJlYWR5IGJlZW4gd3JpdHRlbiB0byB0aGUgb3V0cHV0IHNvIGFsbCB3ZSBuZWVkIHRvIGRvIGlzIHdyaXRlIHRoZSBwYXlsb2FkLgotICBzd2l0Y2ggKHRocmlmdF90eXBlSUQpIHsKLSAgICBjYXNlIFRfU1RPUDoKLSAgICBjYXNlIFRfVk9JRDoKLSAgICAgIHJldHVybjsKLSAgICBjYXNlIFRfU1RSVUNUOiB7Ci0gICAgICBUU1JNTFNfRkVUQ0goKTsKLSAgICAgIGlmIChaX1RZUEVfUFAodmFsdWUpICE9IElTX09CSkVDVCkgewotICAgICAgICB0aHJvd190cHJvdG9jb2xleGNlcHRpb24oIkF0dGVtcHQgdG8gc2VuZCBub24tb2JqZWN0IHR5cGUgYXMgYSBUX1NUUlVDVCIsIElOVkFMSURfREFUQSk7Ci0gICAgICB9Ci0gICAgICB6dmFsKiBzcGVjID0gemVuZF9yZWFkX3N0YXRpY19wcm9wZXJ0eSh6ZW5kX2dldF9jbGFzc19lbnRyeSgqdmFsdWUgVFNSTUxTX0NDKSwgIl9UU1BFQyIsIDYsIGZhbHNlIFRTUk1MU19DQyk7Ci0gICAgICBpZiAoWl9UWVBFX1Aoc3BlYykgIT0gSVNfQVJSQVkpIHsKLSAgICAgICAgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKCJBdHRlbXB0IHRvIHNlbmQgbm9uLVRocmlmdCBvYmplY3QgYXMgYSBUX1NUUlVDVCIsIElOVkFMSURfREFUQSk7Ci0gICAgICB9Ci0gICAgICBiaW5hcnlfc2VyaWFsaXplX3NwZWMoKnZhbHVlLCB0cmFuc3BvcnQsIFpfQVJSVkFMX1Aoc3BlYykpOwotICAgIH0gcmV0dXJuOwotICAgIGNhc2UgVF9CT09MOgotICAgICAgaWYgKFpfVFlQRV9QUCh2YWx1ZSkgIT0gSVNfQk9PTCkgY29udmVydF90b19ib29sZWFuKCp2YWx1ZSk7Ci0gICAgICB0cmFuc3BvcnQud3JpdGVJOChaX0JWQUxfUFAodmFsdWUpID8gMSA6IDApOwotICAgICAgcmV0dXJuOwotICAgIGNhc2UgVF9CWVRFOgotICAgICAgaWYgKFpfVFlQRV9QUCh2YWx1ZSkgIT0gSVNfTE9ORykgY29udmVydF90b19sb25nKCp2YWx1ZSk7Ci0gICAgICB0cmFuc3BvcnQud3JpdGVJOChaX0xWQUxfUFAodmFsdWUpKTsKLSAgICAgIHJldHVybjsKLSAgICBjYXNlIFRfSTE2OgotICAgICAgaWYgKFpfVFlQRV9QUCh2YWx1ZSkgIT0gSVNfTE9ORykgY29udmVydF90b19sb25nKCp2YWx1ZSk7Ci0gICAgICB0cmFuc3BvcnQud3JpdGVJMTYoWl9MVkFMX1BQKHZhbHVlKSk7Ci0gICAgICByZXR1cm47Ci0gICAgY2FzZSBUX0kzMjoKLSAgICAgIGlmIChaX1RZUEVfUFAodmFsdWUpICE9IElTX0xPTkcpIGNvbnZlcnRfdG9fbG9uZygqdmFsdWUpOwotICAgICAgdHJhbnNwb3J0LndyaXRlSTMyKFpfTFZBTF9QUCh2YWx1ZSkpOwotICAgICAgcmV0dXJuOwotICAgIGNhc2UgVF9JNjQ6Ci0gICAgY2FzZSBUX1U2NDogewotICAgICAgaW50NjRfdCBsX2RhdGE7Ci0jaWYgZGVmaW5lZChfTFA2NCkgfHwgZGVmaW5lZChfV0lONjQpCi0gICAgICBpZiAoWl9UWVBFX1BQKHZhbHVlKSAhPSBJU19MT05HKSBjb252ZXJ0X3RvX2xvbmcoKnZhbHVlKTsKLSAgICAgIGxfZGF0YSA9IFpfTFZBTF9QUCh2YWx1ZSk7Ci0jZWxzZQotICAgICAgaWYgKFpfVFlQRV9QUCh2YWx1ZSkgIT0gSVNfRE9VQkxFKSBjb252ZXJ0X3RvX2RvdWJsZSgqdmFsdWUpOwotICAgICAgbF9kYXRhID0gKGludDY0X3QpWl9EVkFMX1BQKHZhbHVlKTsKLSNlbmRpZgotICAgICAgdHJhbnNwb3J0LndyaXRlSTY0KGxfZGF0YSk7Ci0gICAgfSByZXR1cm47Ci0gICAgY2FzZSBUX0RPVUJMRTogewotICAgICAgdW5pb24gewotICAgICAgICBpbnQ2NF90IGM7Ci0gICAgICAgIGRvdWJsZSBkOwotICAgICAgfSBhOwotICAgICAgaWYgKFpfVFlQRV9QUCh2YWx1ZSkgIT0gSVNfRE9VQkxFKSBjb252ZXJ0X3RvX2RvdWJsZSgqdmFsdWUpOwotICAgICAgYS5kID0gWl9EVkFMX1BQKHZhbHVlKTsKLSAgICAgIHRyYW5zcG9ydC53cml0ZUk2NChhLmMpOwotICAgIH0gcmV0dXJuOwotICAgIC8vY2FzZSBUX1VURjc6Ci0gICAgY2FzZSBUX1VURjg6Ci0gICAgY2FzZSBUX1VURjE2OgotICAgIGNhc2UgVF9TVFJJTkc6Ci0gICAgICBpZiAoWl9UWVBFX1BQKHZhbHVlKSAhPSBJU19TVFJJTkcpIGNvbnZlcnRfdG9fc3RyaW5nKCp2YWx1ZSk7Ci0gICAgICB0cmFuc3BvcnQud3JpdGVTdHJpbmcoWl9TVFJWQUxfUFAodmFsdWUpLCBaX1NUUkxFTl9QUCh2YWx1ZSkpOwotICAgICAgcmV0dXJuOwotICAgIGNhc2UgVF9NQVA6IHsKLSAgICAgIGlmIChaX1RZUEVfUFAodmFsdWUpICE9IElTX0FSUkFZKSBjb252ZXJ0X3RvX2FycmF5KCp2YWx1ZSk7Ci0gICAgICBpZiAoWl9UWVBFX1BQKHZhbHVlKSAhPSBJU19BUlJBWSkgewotICAgICAgICB0aHJvd190cHJvdG9jb2xleGNlcHRpb24oIkF0dGVtcHQgdG8gc2VuZCBhbiBpbmNvbXBhdGlibGUgdHlwZSBhcyBhbiBhcnJheSAoVF9NQVApIiwgSU5WQUxJRF9EQVRBKTsKLSAgICAgIH0KLSAgICAgIEhhc2hUYWJsZSogaHQgPSBaX0FSUlZBTF9QUCh2YWx1ZSk7Ci0gICAgICB6dmFsKiogdmFsX3B0cjsKLQotICAgICAgemVuZF9oYXNoX2ZpbmQoZmllbGRzcGVjLCAia3R5cGUiLCA2LCAodm9pZCoqKSZ2YWxfcHRyKTsKLSAgICAgIGlmIChaX1RZUEVfUFAodmFsX3B0cikgIT0gSVNfTE9ORykgY29udmVydF90b19sb25nKCp2YWxfcHRyKTsKLSAgICAgIHVpbnQ4X3Qga2V5dHlwZSA9IFpfTFZBTF9QUCh2YWxfcHRyKTsKLSAgICAgIHRyYW5zcG9ydC53cml0ZUk4KGtleXR5cGUpOwotICAgICAgemVuZF9oYXNoX2ZpbmQoZmllbGRzcGVjLCAidnR5cGUiLCA2LCAodm9pZCoqKSZ2YWxfcHRyKTsKLSAgICAgIGlmIChaX1RZUEVfUFAodmFsX3B0cikgIT0gSVNfTE9ORykgY29udmVydF90b19sb25nKCp2YWxfcHRyKTsKLSAgICAgIHVpbnQ4X3QgdmFsdHlwZSA9IFpfTFZBTF9QUCh2YWxfcHRyKTsKLSAgICAgIHRyYW5zcG9ydC53cml0ZUk4KHZhbHR5cGUpOwotCi0gICAgICB6ZW5kX2hhc2hfZmluZChmaWVsZHNwZWMsICJ2YWwiLCA0LCAodm9pZCoqKSZ2YWxfcHRyKTsKLSAgICAgIEhhc2hUYWJsZSogdmFsc3BlYyA9IFpfQVJSVkFMX1BQKHZhbF9wdHIpOwotCi0gICAgICB0cmFuc3BvcnQud3JpdGVJMzIoemVuZF9oYXNoX251bV9lbGVtZW50cyhodCkpOwotICAgICAgSGFzaFBvc2l0aW9uIGtleV9wdHI7Ci0gICAgICBmb3IgKHplbmRfaGFzaF9pbnRlcm5hbF9wb2ludGVyX3Jlc2V0X2V4KGh0LCAma2V5X3B0cik7IHplbmRfaGFzaF9nZXRfY3VycmVudF9kYXRhX2V4KGh0LCAodm9pZCoqKSZ2YWxfcHRyLCAma2V5X3B0cikgPT0gU1VDQ0VTUzsgemVuZF9oYXNoX21vdmVfZm9yd2FyZF9leChodCwgJmtleV9wdHIpKSB7Ci0gICAgICAgIGJpbmFyeV9zZXJpYWxpemVfaGFzaHRhYmxlX2tleShrZXl0eXBlLCB0cmFuc3BvcnQsIGh0LCBrZXlfcHRyKTsKLSAgICAgICAgYmluYXJ5X3NlcmlhbGl6ZSh2YWx0eXBlLCB0cmFuc3BvcnQsIHZhbF9wdHIsIHZhbHNwZWMpOwotICAgICAgfQotICAgIH0gcmV0dXJuOwotICAgIGNhc2UgVF9MSVNUOiB7Ci0gICAgICBpZiAoWl9UWVBFX1BQKHZhbHVlKSAhPSBJU19BUlJBWSkgY29udmVydF90b19hcnJheSgqdmFsdWUpOwotICAgICAgaWYgKFpfVFlQRV9QUCh2YWx1ZSkgIT0gSVNfQVJSQVkpIHsKLSAgICAgICAgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKCJBdHRlbXB0IHRvIHNlbmQgYW4gaW5jb21wYXRpYmxlIHR5cGUgYXMgYW4gYXJyYXkgKFRfTElTVCkiLCBJTlZBTElEX0RBVEEpOwotICAgICAgfQotICAgICAgSGFzaFRhYmxlKiBodCA9IFpfQVJSVkFMX1BQKHZhbHVlKTsKLSAgICAgIHp2YWwqKiB2YWxfcHRyOwotCi0gICAgICB6ZW5kX2hhc2hfZmluZChmaWVsZHNwZWMsICJldHlwZSIsIDYsICh2b2lkKiopJnZhbF9wdHIpOwotICAgICAgaWYgKFpfVFlQRV9QUCh2YWxfcHRyKSAhPSBJU19MT05HKSBjb252ZXJ0X3RvX2xvbmcoKnZhbF9wdHIpOwotICAgICAgdWludDhfdCB2YWx0eXBlID0gWl9MVkFMX1BQKHZhbF9wdHIpOwotICAgICAgdHJhbnNwb3J0LndyaXRlSTgodmFsdHlwZSk7Ci0KLSAgICAgIHplbmRfaGFzaF9maW5kKGZpZWxkc3BlYywgImVsZW0iLCA1LCAodm9pZCoqKSZ2YWxfcHRyKTsKLSAgICAgIEhhc2hUYWJsZSogdmFsc3BlYyA9IFpfQVJSVkFMX1BQKHZhbF9wdHIpOwotCi0gICAgICB0cmFuc3BvcnQud3JpdGVJMzIoemVuZF9oYXNoX251bV9lbGVtZW50cyhodCkpOwotICAgICAgSGFzaFBvc2l0aW9uIGtleV9wdHI7Ci0gICAgICBmb3IgKHplbmRfaGFzaF9pbnRlcm5hbF9wb2ludGVyX3Jlc2V0X2V4KGh0LCAma2V5X3B0cik7IHplbmRfaGFzaF9nZXRfY3VycmVudF9kYXRhX2V4KGh0LCAodm9pZCoqKSZ2YWxfcHRyLCAma2V5X3B0cikgPT0gU1VDQ0VTUzsgemVuZF9oYXNoX21vdmVfZm9yd2FyZF9leChodCwgJmtleV9wdHIpKSB7Ci0gICAgICAgIGJpbmFyeV9zZXJpYWxpemUodmFsdHlwZSwgdHJhbnNwb3J0LCB2YWxfcHRyLCB2YWxzcGVjKTsKLSAgICAgIH0KLSAgICB9IHJldHVybjsKLSAgICBjYXNlIFRfU0VUOiB7Ci0gICAgICBpZiAoWl9UWVBFX1BQKHZhbHVlKSAhPSBJU19BUlJBWSkgY29udmVydF90b19hcnJheSgqdmFsdWUpOwotICAgICAgaWYgKFpfVFlQRV9QUCh2YWx1ZSkgIT0gSVNfQVJSQVkpIHsKLSAgICAgICAgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKCJBdHRlbXB0IHRvIHNlbmQgYW4gaW5jb21wYXRpYmxlIHR5cGUgYXMgYW4gYXJyYXkgKFRfU0VUKSIsIElOVkFMSURfREFUQSk7Ci0gICAgICB9Ci0gICAgICBIYXNoVGFibGUqIGh0ID0gWl9BUlJWQUxfUFAodmFsdWUpOwotICAgICAgenZhbCoqIHZhbF9wdHI7Ci0KLSAgICAgIHplbmRfaGFzaF9maW5kKGZpZWxkc3BlYywgImV0eXBlIiwgNiwgKHZvaWQqKikmdmFsX3B0cik7Ci0gICAgICBpZiAoWl9UWVBFX1BQKHZhbF9wdHIpICE9IElTX0xPTkcpIGNvbnZlcnRfdG9fbG9uZygqdmFsX3B0cik7Ci0gICAgICB1aW50OF90IGtleXR5cGUgPSBaX0xWQUxfUFAodmFsX3B0cik7Ci0gICAgICB0cmFuc3BvcnQud3JpdGVJOChrZXl0eXBlKTsKLQotICAgICAgdHJhbnNwb3J0LndyaXRlSTMyKHplbmRfaGFzaF9udW1fZWxlbWVudHMoaHQpKTsKLSAgICAgIEhhc2hQb3NpdGlvbiBrZXlfcHRyOwotICAgICAgZm9yICh6ZW5kX2hhc2hfaW50ZXJuYWxfcG9pbnRlcl9yZXNldF9leChodCwgJmtleV9wdHIpOyB6ZW5kX2hhc2hfZ2V0X2N1cnJlbnRfZGF0YV9leChodCwgKHZvaWQqKikmdmFsX3B0ciwgJmtleV9wdHIpID09IFNVQ0NFU1M7IHplbmRfaGFzaF9tb3ZlX2ZvcndhcmRfZXgoaHQsICZrZXlfcHRyKSkgewotICAgICAgICBiaW5hcnlfc2VyaWFsaXplX2hhc2h0YWJsZV9rZXkoa2V5dHlwZSwgdHJhbnNwb3J0LCBodCwga2V5X3B0cik7Ci0gICAgICB9Ci0gICAgfSByZXR1cm47Ci0gIH07Ci0gIGNoYXIgZXJyYnVmWzEyOF07Ci0gIHNwcmludGYoZXJyYnVmLCAiVW5rbm93biB0aHJpZnQgdHlwZUlEICVkIiwgdGhyaWZ0X3R5cGVJRCk7Ci0gIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbihlcnJidWYsIElOVkFMSURfREFUQSk7Ci19Ci0KLQorc3RhdGljCiB2b2lkIGJpbmFyeV9zZXJpYWxpemVfc3BlYyh6dmFsKiB6dGhpcywgUEhQT3V0cHV0VHJhbnNwb3J0JiB0cmFuc3BvcnQsIEhhc2hUYWJsZSogc3BlYykgeworCisgIHZhbGlkYXRlX3RocmlmdF9vYmplY3QoenRoaXMpOworCiAgIEhhc2hQb3NpdGlvbiBrZXlfcHRyOwotICB6dmFsKiogdmFsX3B0cjsKKyAgenZhbCogdmFsX3B0cjsKIAotICBUU1JNTFNfRkVUQ0goKTsKLSAgemVuZF9jbGFzc19lbnRyeSogY2UgPSB6ZW5kX2dldF9jbGFzc19lbnRyeSh6dGhpcyBUU1JNTFNfQ0MpOworICBmb3IgKHplbmRfaGFzaF9pbnRlcm5hbF9wb2ludGVyX3Jlc2V0X2V4KHNwZWMsICZrZXlfcHRyKTsKKyAgICAgICAodmFsX3B0ciA9IHplbmRfaGFzaF9nZXRfY3VycmVudF9kYXRhX2V4KHNwZWMsICZrZXlfcHRyKSkgIT0gbnVsbHB0cjsKKyAgICAgICB6ZW5kX2hhc2hfbW92ZV9mb3J3YXJkX2V4KHNwZWMsICZrZXlfcHRyKSkgewogCi0gIGZvciAoemVuZF9oYXNoX2ludGVybmFsX3BvaW50ZXJfcmVzZXRfZXgoc3BlYywgJmtleV9wdHIpOyB6ZW5kX2hhc2hfZ2V0X2N1cnJlbnRfZGF0YV9leChzcGVjLCAodm9pZCoqKSZ2YWxfcHRyLCAma2V5X3B0cikgPT0gU1VDQ0VTUzsgemVuZF9oYXNoX21vdmVfZm9yd2FyZF9leChzcGVjLCAma2V5X3B0cikpIHsKLSAgICB1bG9uZyBmaWVsZG5vOwotICAgIGlmICh6ZW5kX2hhc2hfZ2V0X2N1cnJlbnRfa2V5X2V4KHNwZWMsIE5VTEwsIE5VTEwsICZmaWVsZG5vLCAwLCAma2V5X3B0cikgIT0gSEFTSF9LRVlfSVNfTE9ORykgeworICAgIHplbmRfdWxvbmcgZmllbGRubzsKKyAgICBpZiAoemVuZF9oYXNoX2dldF9jdXJyZW50X2tleV9leChzcGVjLCBudWxscHRyLCAmZmllbGRubywgJmtleV9wdHIpICE9IEhBU0hfS0VZX0lTX0xPTkcpIHsKICAgICAgIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbigiQmFkIGtleXR5cGUgaW4gVFNQRUMgKGV4cGVjdGVkICdsb25nJykiLCBJTlZBTElEX0RBVEEpOwogICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBIYXNoVGFibGUqIGZpZWxkc3BlYyA9IFpfQVJSVkFMX1BQKHZhbF9wdHIpOworICAgIEhhc2hUYWJsZSogZmllbGRzcGVjID0gWl9BUlJWQUxfUCh2YWxfcHRyKTsKIAogICAgIC8vIGZpZWxkIG5hbWUKLSAgICB6ZW5kX2hhc2hfZmluZChmaWVsZHNwZWMsICJ2YXIiLCA0LCAodm9pZCoqKSZ2YWxfcHRyKTsKLSAgICBjaGFyKiB2YXJuYW1lID0gWl9TVFJWQUxfUFAodmFsX3B0cik7CisgICAgdmFsX3B0ciA9IHplbmRfaGFzaF9zdHJfZmluZChmaWVsZHNwZWMsICJ2YXIiLCBzaXplb2YoInZhciIpLTEpOworICAgIGNoYXIqIHZhcm5hbWUgPSBaX1NUUlZBTF9QKHZhbF9wdHIpOwogCiAgICAgLy8gdGhyaWZ0IHR5cGUKLSAgICB6ZW5kX2hhc2hfZmluZChmaWVsZHNwZWMsICJ0eXBlIiwgNSwgKHZvaWQqKikmdmFsX3B0cik7Ci0gICAgaWYgKFpfVFlQRV9QUCh2YWxfcHRyKSAhPSBJU19MT05HKSBjb252ZXJ0X3RvX2xvbmcoKnZhbF9wdHIpOwotICAgIGludDhfdCB0dHlwZSA9IFpfTFZBTF9QUCh2YWxfcHRyKTsKKyAgICB2YWxfcHRyID0gemVuZF9oYXNoX3N0cl9maW5kKGZpZWxkc3BlYywgInR5cGUiLCBzaXplb2YoInR5cGUiKS0xKTsKKyAgICBpZiAoWl9UWVBFX1AodmFsX3B0cikgIT0gSVNfTE9ORykgY29udmVydF90b19sb25nKHZhbF9wdHIpOworICAgIGludDhfdCB0dHlwZSA9IFpfTFZBTF9QKHZhbF9wdHIpOwogCi0gICAgenZhbCogcHJvcCA9IHplbmRfcmVhZF9wcm9wZXJ0eShjZSwgenRoaXMsIHZhcm5hbWUsIHN0cmxlbih2YXJuYW1lKSwgZmFsc2UgVFNSTUxTX0NDKTsKKyAgICB6dmFsIHJ2OworICAgIHp2YWwqIHByb3AgPSB6ZW5kX3JlYWRfcHJvcGVydHkoWl9PQkpDRV9QKHp0aGlzKSwgenRoaXMsIHZhcm5hbWUsIHN0cmxlbih2YXJuYW1lKSwgZmFsc2UsICZydik7CisKKyAgICBpZiAoWl9UWVBFX1AocHJvcCkgPT0gSVNfUkVGRVJFTkNFKXsKKyAgICAgIFpWQUxfVU5SRUYocHJvcCk7CisgICAgfQogICAgIGlmIChaX1RZUEVfUChwcm9wKSAhPSBJU19OVUxMKSB7CiAgICAgICB0cmFuc3BvcnQud3JpdGVJOCh0dHlwZSk7CiAgICAgICB0cmFuc3BvcnQud3JpdGVJMTYoZmllbGRubyk7Ci0gICAgICBiaW5hcnlfc2VyaWFsaXplKHR0eXBlLCB0cmFuc3BvcnQsICZwcm9wLCBmaWVsZHNwZWMpOworICAgICAgYmluYXJ5X3NlcmlhbGl6ZSh0dHlwZSwgdHJhbnNwb3J0LCBwcm9wLCBmaWVsZHNwZWMpOwogICAgIH0KICAgfQogICB0cmFuc3BvcnQud3JpdGVJOChUX1NUT1ApOyAvLyBzdHJ1Y3QgZW5kCkBAIC05MzUsOTMgKzEwMjYsNTkgQEAKIAogLy8gNiBwYXJhbXM6ICR0cmFuc3BvcnQgJG1ldGhvZF9uYW1lICR0dHlwZSAkcmVxdWVzdF9zdHJ1Y3QgJHNlcUlEICRzdHJpY3Rfd3JpdGUKIFBIUF9GVU5DVElPTih0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYmluYXJ5KSB7Ci0gIGludCBhcmdjID0gWkVORF9OVU1fQVJHUygpOwotICBpZiAoYXJnYyA8IDYpIHsKLSAgICBXUk9OR19QQVJBTV9DT1VOVDsKKyAgenZhbCAqcHJvdG9jb2w7CisgIHp2YWwgKnJlcXVlc3Rfc3RydWN0OworICB6ZW5kX3N0cmluZyAqbWV0aG9kX25hbWU7CisgIGxvbmcgbXNndHlwZSwgc2VxSUQ7CisgIHplbmRfYm9vbCBzdHJpY3Rfd3JpdGU7CisKKyAgaWYgKHplbmRfcGFyc2VfcGFyYW1ldGVyc19leChaRU5EX1BBUlNFX1BBUkFNU19RVUlFVCwgWkVORF9OVU1fQVJHUygpLCAib1Nsb2xiIiwKKyAgICAmcHJvdG9jb2wsICZtZXRob2RfbmFtZSwgJm1zZ3R5cGUsCisgICAgJnJlcXVlc3Rfc3RydWN0LCAmc2VxSUQsICZzdHJpY3Rfd3JpdGUpID09IEZBSUxVUkUpIHsKKyAgICAgIHJldHVybjsKICAgfQogCi0gIHp2YWwgKioqYXJncyA9ICh6dmFsKioqKSBlbWFsbG9jKGFyZ2MgKiBzaXplb2YoenZhbCoqKSk7Ci0gIHplbmRfZ2V0X3BhcmFtZXRlcnNfYXJyYXlfZXgoYXJnYywgYXJncyk7Ci0KLSAgaWYgKFpfVFlQRV9QUChhcmdzWzBdKSAhPSBJU19PQkpFQ1QpIHsKLSAgICBwaHBfZXJyb3JfZG9jcmVmKE5VTEwgVFNSTUxTX0NDLCBFX0VSUk9SLCAiMXN0IHBhcmFtZXRlciBpcyBub3QgYW4gb2JqZWN0ICh0cmFuc3BvcnQpIik7Ci0gICAgZWZyZWUoYXJncyk7Ci0gICAgUkVUVVJOX05VTEwoKTsKLSAgfQotCi0gIGlmIChaX1RZUEVfUFAoYXJnc1sxXSkgIT0gSVNfU1RSSU5HKSB7Ci0gICAgcGhwX2Vycm9yX2RvY3JlZihOVUxMIFRTUk1MU19DQywgRV9FUlJPUiwgIjJuZCBwYXJhbWV0ZXIgaXMgbm90IGEgc3RyaW5nIChtZXRob2QgbmFtZSkiKTsKLSAgICBlZnJlZShhcmdzKTsKLSAgICBSRVRVUk5fTlVMTCgpOwotICB9Ci0KLSAgaWYgKFpfVFlQRV9QUChhcmdzWzNdKSAhPSBJU19PQkpFQ1QpIHsKLSAgICBwaHBfZXJyb3JfZG9jcmVmKE5VTEwgVFNSTUxTX0NDLCBFX0VSUk9SLCAiNHRoIHBhcmFtZXRlciBpcyBub3QgYW4gb2JqZWN0IChyZXF1ZXN0IHN0cnVjdCkiKTsKLSAgICBlZnJlZShhcmdzKTsKLSAgICBSRVRVUk5fTlVMTCgpOwotICB9Ci0KLQogICB0cnkgewotICAgIFBIUE91dHB1dFRyYW5zcG9ydCB0cmFuc3BvcnQoKmFyZ3NbMF0pOwotICAgIHp2YWwgKnByb3RvY29sID0gKmFyZ3NbMF07Ci0gICAgY29uc3QgY2hhciogbWV0aG9kX25hbWUgPSBaX1NUUlZBTF9QUChhcmdzWzFdKTsKLSAgICBjb252ZXJ0X3RvX2xvbmcoKmFyZ3NbMl0pOwotICAgIGludDMyX3QgbXNndHlwZSA9IFpfTFZBTF9QUChhcmdzWzJdKTsKLSAgICB6dmFsKiByZXF1ZXN0X3N0cnVjdCA9ICphcmdzWzNdOwotICAgIGNvbnZlcnRfdG9fbG9uZygqYXJnc1s0XSk7Ci0gICAgaW50MzJfdCBzZXFJRCA9IFpfTFZBTF9QUChhcmdzWzRdKTsKLSAgICBjb252ZXJ0X3RvX2Jvb2xlYW4oKmFyZ3NbNV0pOwotICAgIGJvb2wgc3RyaWN0V3JpdGUgPSBaX0JWQUxfUFAoYXJnc1s1XSk7Ci0gICAgZWZyZWUoYXJncyk7Ci0gICAgYXJncyA9IE5VTEw7Ci0gICAgcHJvdG9jb2xfd3JpdGVNZXNzYWdlQmVnaW4ocHJvdG9jb2wsIG1ldGhvZF9uYW1lLCBtc2d0eXBlLCBzZXFJRCk7Ci0gICAgenZhbCogc3BlYyA9IHplbmRfcmVhZF9zdGF0aWNfcHJvcGVydHkoemVuZF9nZXRfY2xhc3NfZW50cnkocmVxdWVzdF9zdHJ1Y3QgVFNSTUxTX0NDKSwgIl9UU1BFQyIsIDYsIGZhbHNlIFRTUk1MU19DQyk7Ci0gICAgaWYgKFpfVFlQRV9QKHNwZWMpICE9IElTX0FSUkFZKSB7Ci0gICAgICAgIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbigiQXR0ZW1wdCB0byBzZW5kIG5vbi1UaHJpZnQgb2JqZWN0IiwgSU5WQUxJRF9EQVRBKTsKKyAgICB6dmFsKiBzcGVjID0gemVuZF9yZWFkX3N0YXRpY19wcm9wZXJ0eShaX09CSkNFX1AocmVxdWVzdF9zdHJ1Y3QpLCAiX1RTUEVDIiwgc2l6ZW9mKCJfVFNQRUMiKS0xLCB0cnVlKTsKKyAgICBpZiAoc3BlYykgeworICAgICAgWlZBTF9ERVJFRihzcGVjKTsKICAgICB9CisKKyAgICBpZiAoIXNwZWMgfHwgWl9UWVBFX1Aoc3BlYykgIT0gSVNfQVJSQVkpIHsKKyAgICAgIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbigiQXR0ZW1wdCBzZXJpYWxpemUgZnJvbSBub24tVGhyaWZ0IG9iamVjdCIsIElOVkFMSURfREFUQSk7CisgICAgfQorCisgICAgUEhQT3V0cHV0VHJhbnNwb3J0IHRyYW5zcG9ydChwcm90b2NvbCk7CisgICAgcHJvdG9jb2xfd3JpdGVNZXNzYWdlQmVnaW4ocHJvdG9jb2wsIG1ldGhvZF9uYW1lLCAoaW50MzJfdCkgbXNndHlwZSwgKGludDMyX3QpIHNlcUlEKTsKICAgICBiaW5hcnlfc2VyaWFsaXplX3NwZWMocmVxdWVzdF9zdHJ1Y3QsIHRyYW5zcG9ydCwgWl9BUlJWQUxfUChzcGVjKSk7CiAgICAgdHJhbnNwb3J0LmZsdXNoKCk7CisKICAgfSBjYXRjaCAoY29uc3QgUEhQRXhjZXB0aW9uV3JhcHBlciYgZXgpIHsKLSAgICB6ZW5kX3Rocm93X2V4Y2VwdGlvbl9vYmplY3QoZXggVFNSTUxTX0NDKTsKKyAgICAvLyBleCB3aWxsIGJlIGRlc3RydWN0ZWQsIHNvIGNvcHkgdG8gYSB6dmFsIHRoYXQgemVuZF90aHJvd19leGNlcHRpb25fb2JqZWN0IGNhbiB0YWtlIG93bmVyc2hpcCBvZgorICAgIHp2YWwgbXlleDsKKyAgICBaVkFMX0NPUFkoJm15ZXgsIGV4KTsKKyAgICB6ZW5kX3Rocm93X2V4Y2VwdGlvbl9vYmplY3QoJm15ZXgpOwogICAgIFJFVFVSTl9OVUxMKCk7CiAgIH0gY2F0Y2ggKGNvbnN0IHN0ZDo6ZXhjZXB0aW9uJiBleCkgewotICAgIHRocm93X3plbmRfZXhjZXB0aW9uX2Zyb21fc3RkX2V4Y2VwdGlvbihleCBUU1JNTFNfQ0MpOworICAgIHRocm93X3plbmRfZXhjZXB0aW9uX2Zyb21fc3RkX2V4Y2VwdGlvbihleCk7CiAgICAgUkVUVVJOX05VTEwoKTsKICAgfQogfQogCi0vLyAzIHBhcmFtczogJHRyYW5zcG9ydCAkcmVzcG9uc2VfVHlwZW5hbWUgJHN0cmljdF9yZWFkCisKKy8vIDQgcGFyYW1zOiAkdHJhbnNwb3J0ICRyZXNwb25zZV9UeXBlbmFtZSAkc3RyaWN0X3JlYWQgJGJ1ZmZlcl9zaXplCiBQSFBfRlVOQ1RJT04odGhyaWZ0X3Byb3RvY29sX3JlYWRfYmluYXJ5KSB7Ci0gIGludCBhcmdjID0gWkVORF9OVU1fQVJHUygpOworICB6dmFsICpwcm90b2NvbDsKKyAgemVuZF9zdHJpbmcgKm9ial90eXBlbmFtZTsKKyAgemVuZF9ib29sIHN0cmljdF9yZWFkOworICBzaXplX3QgYnVmZmVyX3NpemUgPSA4MTkyOwogCi0gIGlmIChhcmdjIDwgMykgewotICAgIFdST05HX1BBUkFNX0NPVU5UOwotICB9Ci0KLSAgenZhbCAqKiphcmdzID0gKHp2YWwqKiopIGVtYWxsb2MoYXJnYyAqIHNpemVvZih6dmFsKiopKTsKLSAgemVuZF9nZXRfcGFyYW1ldGVyc19hcnJheV9leChhcmdjLCBhcmdzKTsKLQotICBpZiAoWl9UWVBFX1BQKGFyZ3NbMF0pICE9IElTX09CSkVDVCkgewotICAgIHBocF9lcnJvcl9kb2NyZWYoTlVMTCBUU1JNTFNfQ0MsIEVfRVJST1IsICIxc3QgcGFyYW1ldGVyIGlzIG5vdCBhbiBvYmplY3QgKHRyYW5zcG9ydCkiKTsKLSAgICBlZnJlZShhcmdzKTsKLSAgICBSRVRVUk5fTlVMTCgpOwotICB9Ci0KLSAgaWYgKFpfVFlQRV9QUChhcmdzWzFdKSAhPSBJU19TVFJJTkcpIHsKLSAgICBwaHBfZXJyb3JfZG9jcmVmKE5VTEwgVFNSTUxTX0NDLCBFX0VSUk9SLCAiMm5kIHBhcmFtZXRlciBpcyBub3QgYSBzdHJpbmcgKHR5cGVuYW1lIG9mIGV4cGVjdGVkIHJlc3BvbnNlIHN0cnVjdCkiKTsKLSAgICBlZnJlZShhcmdzKTsKLSAgICBSRVRVUk5fTlVMTCgpOworICBpZiAoemVuZF9wYXJzZV9wYXJhbWV0ZXJzKFpFTkRfTlVNX0FSR1MoKSwgIm9TYnxsIiwgJnByb3RvY29sLCAmb2JqX3R5cGVuYW1lLCAmc3RyaWN0X3JlYWQsICZidWZmZXJfc2l6ZSkgPT0gRkFJTFVSRSkgeworICAgIHJldHVybjsKICAgfQogCiAgIHRyeSB7Ci0gICAgUEhQSW5wdXRUcmFuc3BvcnQgdHJhbnNwb3J0KCphcmdzWzBdKTsKLSAgICBjaGFyKiBvYmpfdHlwZW5hbWUgPSBaX1NUUlZBTF9QUChhcmdzWzFdKTsKLSAgICBjb252ZXJ0X3RvX2Jvb2xlYW4oKmFyZ3NbMl0pOwotICAgIGJvb2wgc3RyaWN0X3JlYWQgPSBaX0JWQUxfUFAoYXJnc1syXSk7Ci0gICAgZWZyZWUoYXJncyk7Ci0gICAgYXJncyA9IE5VTEw7Ci0KKyAgICBQSFBJbnB1dFRyYW5zcG9ydCB0cmFuc3BvcnQocHJvdG9jb2wsIGJ1ZmZlcl9zaXplKTsKICAgICBpbnQ4X3QgbWVzc2FnZVR5cGUgPSAwOwogICAgIGludDMyX3Qgc3ogPSB0cmFuc3BvcnQucmVhZEkzMigpOwogCkBAIC0xMDQ3LDIzICsxMTA0LDY5IEBACiAgICAgfQogCiAgICAgaWYgKG1lc3NhZ2VUeXBlID09IFRfRVhDRVBUSU9OKSB7Ci0gICAgICB6dmFsKiBleDsKLSAgICAgIE1BS0VfU1REX1pWQUwoZXgpOwotICAgICAgY3JlYXRlT2JqZWN0KCJcXFRocmlmdFxcRXhjZXB0aW9uXFxUQXBwbGljYXRpb25FeGNlcHRpb24iLCBleCk7Ci0gICAgICB6dmFsKiBzcGVjID0gemVuZF9yZWFkX3N0YXRpY19wcm9wZXJ0eSh6ZW5kX2dldF9jbGFzc19lbnRyeShleCBUU1JNTFNfQ0MpLCAiX1RTUEVDIiwgNiwgZmFsc2UgVFNSTUxTX0NDKTsKLSAgICAgIGJpbmFyeV9kZXNlcmlhbGl6ZV9zcGVjKGV4LCB0cmFuc3BvcnQsIFpfQVJSVkFMX1Aoc3BlYykpOwotICAgICAgdGhyb3cgUEhQRXhjZXB0aW9uV3JhcHBlcihleCk7CisgICAgICB6dmFsIGV4OworICAgICAgY3JlYXRlT2JqZWN0KCJcXFRocmlmdFxcRXhjZXB0aW9uXFxUQXBwbGljYXRpb25FeGNlcHRpb24iLCAmZXgpOworICAgICAgenZhbCogc3BlYyA9IHplbmRfcmVhZF9zdGF0aWNfcHJvcGVydHkoWl9PQkpDRShleCksICJfVFNQRUMiLCBzaXplb2YoIl9UUFNFQyIpLTEsIGZhbHNlKTsKKyAgICAgIFpWQUxfREVSRUYoc3BlYyk7CisgICAgICBpZiAoRUcoZXhjZXB0aW9uKSkgeworICAgICAgICB6ZW5kX29iamVjdCAqZXggPSBFRyhleGNlcHRpb24pOworICAgICAgICBFRyhleGNlcHRpb24pID0gbnVsbHB0cjsKKyAgICAgICAgdGhyb3cgUEhQRXhjZXB0aW9uV3JhcHBlcihleCk7CisgICAgICB9CisgICAgICBiaW5hcnlfZGVzZXJpYWxpemVfc3BlYygmZXgsIHRyYW5zcG9ydCwgWl9BUlJWQUxfUChzcGVjKSk7CisgICAgICB0aHJvdyBQSFBFeGNlcHRpb25XcmFwcGVyKCZleCk7CiAgICAgfQogCi0gICAgY3JlYXRlT2JqZWN0KG9ial90eXBlbmFtZSwgcmV0dXJuX3ZhbHVlKTsKLSAgICB6dmFsKiBzcGVjID0gemVuZF9yZWFkX3N0YXRpY19wcm9wZXJ0eSh6ZW5kX2dldF9jbGFzc19lbnRyeShyZXR1cm5fdmFsdWUgVFNSTUxTX0NDKSwgIl9UU1BFQyIsIDYsIGZhbHNlIFRTUk1MU19DQyk7CisgICAgY3JlYXRlT2JqZWN0KFpTVFJfVkFMKG9ial90eXBlbmFtZSksIHJldHVybl92YWx1ZSk7CisgICAgenZhbCogc3BlYyA9IHplbmRfcmVhZF9zdGF0aWNfcHJvcGVydHkoWl9PQkpDRV9QKHJldHVybl92YWx1ZSksICJfVFNQRUMiLCBzaXplb2YoIl9UU1BFQyIpLTEsIHRydWUpOworICAgIGlmIChzcGVjKSB7CisgICAgICBaVkFMX0RFUkVGKHNwZWMpOworICAgIH0KKyAgICBpZiAoIXNwZWMgfHwgWl9UWVBFX1Aoc3BlYykgIT0gSVNfQVJSQVkpIHsKKyAgICAgIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbigiQXR0ZW1wdCBkZXNlcmlhbGl6ZSB0byBub24tVGhyaWZ0IG9iamVjdCIsIElOVkFMSURfREFUQSk7CisgICAgfQogICAgIGJpbmFyeV9kZXNlcmlhbGl6ZV9zcGVjKHJldHVybl92YWx1ZSwgdHJhbnNwb3J0LCBaX0FSUlZBTF9QKHNwZWMpKTsKICAgfSBjYXRjaCAoY29uc3QgUEhQRXhjZXB0aW9uV3JhcHBlciYgZXgpIHsKLSAgICB6ZW5kX3Rocm93X2V4Y2VwdGlvbl9vYmplY3QoZXggVFNSTUxTX0NDKTsKKyAgICAvLyBleCB3aWxsIGJlIGRlc3RydWN0ZWQsIHNvIGNvcHkgdG8gYSB6dmFsIHRoYXQgemVuZF90aHJvd19leGNlcHRpb25fb2JqZWN0IGNhbiBvd25lcnNoaXAgb2YKKyAgICB6dmFsIG15ZXg7CisgICAgWlZBTF9DT1BZKCZteWV4LCBleCk7CisgICAgenZhbF9kdG9yKHJldHVybl92YWx1ZSk7CisgICAgemVuZF90aHJvd19leGNlcHRpb25fb2JqZWN0KCZteWV4KTsKICAgICBSRVRVUk5fTlVMTCgpOwogICB9IGNhdGNoIChjb25zdCBzdGQ6OmV4Y2VwdGlvbiYgZXgpIHsKLSAgICB0aHJvd196ZW5kX2V4Y2VwdGlvbl9mcm9tX3N0ZF9leGNlcHRpb24oZXggVFNSTUxTX0NDKTsKKyAgICB0aHJvd196ZW5kX2V4Y2VwdGlvbl9mcm9tX3N0ZF9leGNlcHRpb24oZXgpOwogICAgIFJFVFVSTl9OVUxMKCk7CiAgIH0KIH0KIAorLy8gNCBwYXJhbXM6ICR0cmFuc3BvcnQgJHJlc3BvbnNlX1R5cGVuYW1lICRzdHJpY3RfcmVhZCAkYnVmZmVyX3NpemUKK1BIUF9GVU5DVElPTih0aHJpZnRfcHJvdG9jb2xfcmVhZF9iaW5hcnlfYWZ0ZXJfbWVzc2FnZV9iZWdpbikgeworICB6dmFsICpwcm90b2NvbDsKKyAgemVuZF9zdHJpbmcgKm9ial90eXBlbmFtZTsKKyAgemVuZF9ib29sIHN0cmljdF9yZWFkOworICBzaXplX3QgYnVmZmVyX3NpemUgPSA4MTkyOworCisgIGlmICh6ZW5kX3BhcnNlX3BhcmFtZXRlcnMoWkVORF9OVU1fQVJHUygpLCAib1NifGwiLCAmcHJvdG9jb2wsICZvYmpfdHlwZW5hbWUsICZzdHJpY3RfcmVhZCwgJmJ1ZmZlcl9zaXplKSA9PSBGQUlMVVJFKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgdHJ5IHsKKyAgICBQSFBJbnB1dFRyYW5zcG9ydCB0cmFuc3BvcnQocHJvdG9jb2wsIGJ1ZmZlcl9zaXplKTsKKworICAgIGNyZWF0ZU9iamVjdChaU1RSX1ZBTChvYmpfdHlwZW5hbWUpLCByZXR1cm5fdmFsdWUpOworICAgIHp2YWwqIHNwZWMgPSB6ZW5kX3JlYWRfc3RhdGljX3Byb3BlcnR5KFpfT0JKQ0VfUChyZXR1cm5fdmFsdWUpLCAiX1RTUEVDIiwgc2l6ZW9mKCJfVFNQRUMiKS0xLCBmYWxzZSk7CisgICAgWlZBTF9ERVJFRihzcGVjKTsKKyAgICBiaW5hcnlfZGVzZXJpYWxpemVfc3BlYyhyZXR1cm5fdmFsdWUsIHRyYW5zcG9ydCwgWl9BUlJWQUxfUChzcGVjKSk7CisgIH0gY2F0Y2ggKGNvbnN0IFBIUEV4Y2VwdGlvbldyYXBwZXImIGV4KSB7CisgICAgLy8gZXggd2lsbCBiZSBkZXN0cnVjdGVkLCBzbyBjb3B5IHRvIGEgenZhbCB0aGF0IHplbmRfdGhyb3dfZXhjZXB0aW9uX29iamVjdCBjYW4gdGFrZSBvd25lcnNoaXAgb2YKKyAgICB6dmFsIG15ZXg7CisgICAgWlZBTF9DT1BZKCZteWV4LCBleCk7CisgICAgemVuZF90aHJvd19leGNlcHRpb25fb2JqZWN0KCZteWV4KTsKKyAgICBSRVRVUk5fTlVMTCgpOworICB9IGNhdGNoIChjb25zdCBzdGQ6OmV4Y2VwdGlvbiYgZXgpIHsKKyAgICB0aHJvd196ZW5kX2V4Y2VwdGlvbl9mcm9tX3N0ZF9leGNlcHRpb24oZXgpOworICAgIFJFVFVSTl9OVUxMKCk7CisgIH0KK30KKworI2VuZGlmIC8qIFBIUF9WRVJTSU9OX0lEID49IDcwMDAwICovCmRpZmYgLS1naXQgYS9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL3BocF90aHJpZnRfcHJvdG9jb2wuaCBiL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvcGhwX3RocmlmdF9wcm90b2NvbC5oCmluZGV4IDQ0ZDAzY2MuLjA0MjA5OTcgMTAwNjQ0Ci0tLSBhL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvcGhwX3RocmlmdF9wcm90b2NvbC5oCisrKyBiL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvcGhwX3RocmlmdF9wcm90b2NvbC5oCkBAIC0yMSw2ICsyMSw3IEBACiAKIFBIUF9GVU5DVElPTih0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYmluYXJ5KTsKIFBIUF9GVU5DVElPTih0aHJpZnRfcHJvdG9jb2xfcmVhZF9iaW5hcnkpOworUEhQX0ZVTkNUSU9OKHRocmlmdF9wcm90b2NvbF9yZWFkX2JpbmFyeV9hZnRlcl9tZXNzYWdlX2JlZ2luKTsKIAogZXh0ZXJuIHplbmRfbW9kdWxlX2VudHJ5IHRocmlmdF9wcm90b2NvbF9tb2R1bGVfZW50cnk7CiAjZGVmaW5lIHBocGV4dF90aHJpZnRfcHJvdG9jb2xfcHRyICZ0aHJpZnRfcHJvdG9jb2xfbW9kdWxlX2VudHJ5CmRpZmYgLS1naXQgYS9saWIvcGhwL3Rlc3QvRml4dHVyZXMucGhwIGIvbGliL3BocC90ZXN0L0ZpeHR1cmVzLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDU3ZDgzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC90ZXN0L0ZpeHR1cmVzLnBocApAQCAtMCwwICsxLDE5NCBAQAorPD9waHAKKworLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQudGVzdAorICovCisKK25hbWVzcGFjZSBUZXN0XFRocmlmdDsKKwordXNlIFRocmlmdFRlc3RcWHRydWN0OwordXNlIFRocmlmdFRlc3RcWHRydWN0MjsKK3VzZSBUaHJpZnRUZXN0XE51bWJlcno7Cit1c2UgVGhyaWZ0VGVzdFxJbnNhbml0eTsKKworY2xhc3MgRml4dHVyZXMKK3sKKyAgICBwdWJsaWMgc3RhdGljICRidWZzaXplID0gODE5MjsgLy9iaWcgZW5vdWdoIHRvIHJlYWQgYmlnZ2VzdCBzZXJpYWxpemVkIEZpeHR1cmUgYXJnLgorICAgIHB1YmxpYyBzdGF0aWMgJHRlc3RBcmdzID0gYXJyYXkoKTsKKworICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcG9wdWxhdGVUZXN0QXJncygpCisgICAgeworICAgICAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RTdHJpbmcxJ10gPSAiQWZyaWthYW5zLCBBbGVtYW5uaXNjaCwgQXJhZ29uw6lzLCDYp9mE2LnYsdio2YrYqSwg2YXYtdix2YksIEFzdHVyaWFudSwgQXltYXIgYXJ1LCBBesmZcmJheWNhbiwg0JHQsNGI0qHQvtGA0YIsIEJvYXJpc2NoLCDFvWVtYWl0xJfFoWthLCDQkdC10LvQsNGA0YPRgdC60LDRjywg0JHQtdC70LDRgNGD0YHQutCw0Y8gKNGC0LDRgNCw0YjQutC10LLRltGG0LApLCDQkdGK0LvQs9Cw0YDRgdC60LgsIEJhbWFuYW5rYW4sIOCmrOCmvuCmguCmsuCmviwgQnJlemhvbmVnLCBCb3NhbnNraSwgQ2F0YWzDoCwgTcOsbmctZMSVzKRuZy1uZ+G5s8yELCDQndC+0YXRh9C40LnQvSwgQ2VidWFubywg4Y+j4Y6z4Y6pLCDEjGVza3ksINCh0LvQvtCy0aPMgdC90YzRgdC60YogLyDisJTisI7isJHisILisKHisJDisKDisJTisI3isJ8sINCn05HQstCw0YjQu9CwLCBDeW1yYWVnLCBEYW5zaywgWmF6YWtpLCDei96o3ojerN6A3qjehN6m3pDesCwgzpXOu867zrfOvc65zrrOrCwgRW1pbGnDoG4gZSBydW1hZ27DsmwsIEVuZ2xpc2gsIEVzcGVyYW50bywgRXNwYcOxb2wsIEVlc3RpLCBFdXNrYXJhLCDZgdin2LHYs9uMLCBTdW9taSwgVsO1cm8sIEbDuHJveXNrdCwgRnJhbsOnYWlzLCBBcnBldGFuLCBGdXJsYW4sIEZyeXNrLCBHYWVpbGdlLCDotJvoqp4sIEfDoGlkaGxpZywgR2FsZWdvLCBBdmHDsWUn4bq9LCDgqpfgq4HgqpzgqrDgqr7gqqTgq4AsIEdhZWxnLCDXoteR16jXmdeqLCDgpLngpL/gpKjgpY3gpKbgpYAsIEZpamkgSGluZGksIEhydmF0c2tpLCBLcmV5w7JsIGF5aXN5ZW4sIE1hZ3lhciwg1YDVodW11aXWgNWl1bYsIEludGVybGluZ3VhLCBCYWhhc2EgSW5kb25lc2lhLCBJbG9rYW5vLCBJZG8sIMONc2xlbnNrYSwgSXRhbGlhbm8sIOaXpeacrOiqniwgTG9qYmFuLCBCYXNhIEphd2EsIOGDpeGDkOGDoOGDl+GDo+GDmuGDmCwgS29uZ28sIEthbGFhbGxpc3V0LCDgspXgsqjgs43gsqjgsqEsIO2VnOq1reyWtCwg0JrRitCw0YDQsNGH0LDQuS3QnNCw0LvQutGK0LDRgCwgUmlwb2FyaXNjaCwgS3VyZMOuLCDQmtC+0LzQuCwgS2VybmV3ZWssINCa0YvRgNCz0YvQt9GH0LAsIExhdGluYSwgTGFkaW5vLCBMw6t0emVidWVyZ2VzY2gsIExpbWJ1cmdzLCBMaW5nw6FsYSwg4Lql4Lqy4LqnLCBMaWV0dXZpxbMsIExhdHZpZcWhdSwgQmFzYSBCYW55dW1hc2FuLCBNYWxhZ2FzeSwg0JzQsNC60LXQtNC+0L3RgdC60LgsIOC0ruC0suC0r+C0vuC0s+C0giwg4KSu4KSw4KS+4KSg4KWALCBCYWhhc2EgTWVsYXl1LCDZhdin2LLZkNix2YjZhtuMLCBObmFwdWxpdGFubywgTmVkZXJzYWtzaXNjaCwg4KSo4KWH4KSq4KS+4KSyIOCkreCkvuCkt+CkviwgTmVkZXJsYW5kcywg4oCqTm9yc2sgKG55bm9yc2sp4oCsLCDigKpOb3JzayAoYm9rbcOlbCnigKwsIE5vdW9ybWFuZCwgRGluw6kgYml6YWFkLCBPY2NpdGFuLCDQmNGA0L7QvdCw0YMsIFBhcGlhbWVudHUsIERlaXRzY2gsIE5vcmZ1ayAvIFBpdGtlcm4sIFBvbHNraSwg2b7Zhtis2KfYqNuMLCDZvtqa2KrZiCwgUG9ydHVndcOqcywgUnVuYSBTaW1pLCBSdW1hbnRzY2gsIFJvbWFuaSwgUm9tw6JuxIMsINCg0YPRgdGB0LrQuNC5LCDQodCw0YXQsCDRgtGL0LvQsCwgU2FyZHUsIFNpY2lsaWFudSwgU2NvdHMsIFPDoW1lZ2llbGxhLCBTaW1wbGUgRW5nbGlzaCwgU2xvdmVuxI1pbmEsIFNsb3ZlbsWhxI1pbmEsINCh0YDQv9GB0LrQuCAvIFNycHNraSwgU2VlbHRlcnNrLCBTdmVuc2thLCBLaXN3YWhpbGksIOCupOCuruCuv+CutOCvjSwg4LCk4LGG4LCy4LGB4LCX4LGBLCDQotC+0rfQuNC606MsIOC5hOC4l+C4oiwgVMO8cmttZW7Dp2UsIFRhZ2Fsb2csIFTDvHJrw6dlLCDQotCw0YLQsNGA0YfQsC9UYXRhcsOnYSwg0KPQutGA0LDRl9C90YHRjNC60LAsINin2LHYr9mILCBUaeG6v25nIFZp4buHdCwgVm9sYXDDvGssIFdhbG9uLCBXaW5hcmF5LCDlkLTor60sIGlzaVhob3NhLCDXmdeZ1rTXk9eZ16ksIFlvcsO5YsOhLCBaZcOqdXdzLCDkuK3mlocsIELDom4tbMOibS1nw7osIOeyteiqniI7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0U3RyaW5nMiddID0KKyAgICAgICAgICAgICJxdW90ZTogXFxcIiBiYWNrc2xhc2g6IiAuCisgICAgICAgICAgICAiIGZvcndhcmRzbGFzaC1lc2NhcGVkOiBcXC8gIiAuCisgICAgICAgICAgICAiIGJhY2tzcGFjZTogXGIgZm9ybWZlZWQ6IFxmIG5ld2xpbmU6IFxuIHJldHVybjogXHIgdGFiOiAiIC4KKyAgICAgICAgICAgICIgbm93LWFsbC1vZi10aGVtLXRvZ2V0aGVyOiBcIlxcXC9cYlxuXHJcdCIgLgorICAgICAgICAgICAgIiBub3ctYS1idW5jaC1vZi1qdW5rOiAhQCNcJCUmKCkoJiUkI3t9e308Pjw+PCI7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0U3RyaW5nMyddID0KKyAgICAgICAgICAgICJzdHJpbmcgdGhhdCBlbmRzIGluIGRvdWJsZS1iYWNrc2xhc2ggXFxcXCI7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0VW5pY29kZVN0cmluZ1dpdGhOb25CTVAnXSA9CisgICAgICAgICAgICAi4Liq4Lin4Lix4Liq4LiU4Li1L/Cdkq8iOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdERvdWJsZSddID0gMy4xNDE1OTI2NTM1ODk4OworCisgICAgICAgIC8vIFRPRE86IGFkZCB0ZXN0QmluYXJ5KCkgY2FsbAorCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdEJ5dGUnXSA9IDB4MDE7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0STMyJ10gPSBwb3coMiwgMzApOworCisgICAgICAgIGlmIChQSFBfSU5UX1NJWkUgPT0gOCkgeworICAgICAgICAgICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0STY0J10gPSBwb3coMiwgNjApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0STY0J10gPSAiMTE1MjkyMTUwNDYwNjg0NzAwMCI7CisgICAgICAgIH0KKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RTdHJ1Y3QnXSA9CisgICAgICAgICAgICBuZXcgWHRydWN0KAorICAgICAgICAgICAgICAgIGFycmF5KAorICAgICAgICAgICAgICAgICAgICAnc3RyaW5nX3RoaW5nJyA9PiAnd29ya2VkJywKKyAgICAgICAgICAgICAgICAgICAgJ2J5dGVfdGhpbmcnID0+IDB4MDEsCisgICAgICAgICAgICAgICAgICAgICdpMzJfdGhpbmcnID0+IHBvdygyLCAzMCksCisgICAgICAgICAgICAgICAgICAgICdpNjRfdGhpbmcnID0+IHNlbGY6OiR0ZXN0QXJnc1sndGVzdEk2NCddCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgKTsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3ROZXN0TmVzdGVkJ10gPQorICAgICAgICAgICAgbmV3IFh0cnVjdCgKKyAgICAgICAgICAgICAgICBhcnJheSgKKyAgICAgICAgICAgICAgICAgICAgJ3N0cmluZ190aGluZycgPT4gJ3dvcmtlZCcsCisgICAgICAgICAgICAgICAgICAgICdieXRlX3RoaW5nJyA9PiAweDAxLAorICAgICAgICAgICAgICAgICAgICAnaTMyX3RoaW5nJyA9PiBwb3coMiwgMzApLAorICAgICAgICAgICAgICAgICAgICAnaTY0X3RoaW5nJyA9PiBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RJNjQnXQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICk7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0TmVzdCddID0KKyAgICAgICAgICAgIG5ldyBYdHJ1Y3QyKAorICAgICAgICAgICAgICAgIGFycmF5KAorICAgICAgICAgICAgICAgICAgICAnYnl0ZV90aGluZycgPT4gMHgwMSwKKyAgICAgICAgICAgICAgICAgICAgJ3N0cnVjdF90aGluZycgPT4gc2VsZjo6JHRlc3RBcmdzWyd0ZXN0TmVzdE5lc3RlZCddLAorICAgICAgICAgICAgICAgICAgICAnaTMyX3RoaW5nJyA9PiBwb3coMiwgMTUpCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgKTsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RNYXAnXSA9CisgICAgICAgICAgICBhcnJheSgKKyAgICAgICAgICAgICAgICA3ID0+IDc3LAorICAgICAgICAgICAgICAgIDggPT4gODgsCisgICAgICAgICAgICAgICAgOSA9PiA5OQorICAgICAgICAgICAgKTsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RTdHJpbmdNYXAnXSA9CisgICAgICAgICAgICBhcnJheSgKKyAgICAgICAgICAgICAgICAiYSIgPT4gIjEyMyIsCisgICAgICAgICAgICAgICAgImEgYiIgPT4gIndpdGggc3BhY2VzICIsCisgICAgICAgICAgICAgICAgInNhbWUiID0+ICJzYW1lIiwKKyAgICAgICAgICAgICAgICAiMCIgPT4gIm51bWVyaWMga2V5IiwKKyAgICAgICAgICAgICAgICAibG9uZ1ZhbHVlIiA9PiBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RTdHJpbmcxJ10sCisgICAgICAgICAgICAgICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0U3RyaW5nMSddID0+ICJsb25nIGtleSIKKyAgICAgICAgICAgICk7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0U2V0J10gPSBhcnJheSgxID0+IHRydWUsIDUgPT4gdHJ1ZSwgNiA9PiB0cnVlKTsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RMaXN0J10gPSBhcnJheSgxLCAyLCAzKTsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RFbnVtJ10gPSBOdW1iZXJ6OjpPTkU7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0VHlwZWRlZiddID0gNjk7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0TWFwTWFwRXhwZWN0ZWRSZXN1bHQnXSA9CisgICAgICAgICAgICBhcnJheSgKKyAgICAgICAgICAgICAgICA0ID0+IGFycmF5KAorICAgICAgICAgICAgICAgICAgICAxID0+IDEsCisgICAgICAgICAgICAgICAgICAgIDIgPT4gMiwKKyAgICAgICAgICAgICAgICAgICAgMyA9PiAzLAorICAgICAgICAgICAgICAgICAgICA0ID0+IDQsCisgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgICAtNCA9PiBhcnJheSgKKyAgICAgICAgICAgICAgICAgICAgLTQgPT4gLTQsCisgICAgICAgICAgICAgICAgICAgIC0zID0+IC0zLAorICAgICAgICAgICAgICAgICAgICAtMiA9PiAtMiwKKyAgICAgICAgICAgICAgICAgICAgLTEgPT4gLTEKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICApOworCisgICAgICAgIC8vIHRlc3RJbnNhbml0eSAuLi4gdGFrZXMgYSBmZXcgc3RlcHMgdG8gc2V0IHVwIQorCisgICAgICAgICR4dHJ1Y3QxID0KKyAgICAgICAgICAgIG5ldyBYdHJ1Y3QoCisgICAgICAgICAgICAgICAgYXJyYXkoCisgICAgICAgICAgICAgICAgICAgICdzdHJpbmdfdGhpbmcnID0+ICdHb29kYnllNCcsCisgICAgICAgICAgICAgICAgICAgICdieXRlX3RoaW5nJyA9PiA0LAorICAgICAgICAgICAgICAgICAgICAnaTMyX3RoaW5nJyA9PiA0LAorICAgICAgICAgICAgICAgICAgICAnaTY0X3RoaW5nJyA9PiA0CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgKTsKKworICAgICAgICAkeHRydWN0MiA9CisgICAgICAgICAgICBuZXcgWHRydWN0KAorICAgICAgICAgICAgICAgIGFycmF5KAorICAgICAgICAgICAgICAgICAgICAnc3RyaW5nX3RoaW5nJyA9PiAnSGVsbG8yJywKKyAgICAgICAgICAgICAgICAgICAgJ2J5dGVfdGhpbmcnID0+IDIsCisgICAgICAgICAgICAgICAgICAgICdpMzJfdGhpbmcnID0+IDIsCisgICAgICAgICAgICAgICAgICAgICdpNjRfdGhpbmcnID0+IDIKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICApOworCisgICAgICAgICR1c2VyTWFwID0KKyAgICAgICAgICAgIGFycmF5KAorICAgICAgICAgICAgICAgIE51bWJlcno6OkZJVkUgPT4gNSwKKyAgICAgICAgICAgICAgICBOdW1iZXJ6OjpFSUdIVCA9PiA4CisgICAgICAgICAgICApOworCisgICAgICAgICRpbnNhbml0eTIgPQorICAgICAgICAgICAgbmV3IEluc2FuaXR5KAorICAgICAgICAgICAgICAgIGFycmF5KAorICAgICAgICAgICAgICAgICAgICAndXNlck1hcCcgPT4gJHVzZXJNYXAsCisgICAgICAgICAgICAgICAgICAgICd4dHJ1Y3RzJyA9PiBhcnJheSgkeHRydWN0MSwgJHh0cnVjdDIpCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgKTsKKworICAgICAgICAkaW5zYW5pdHkzID0gJGluc2FuaXR5MjsKKworICAgICAgICAkaW5zYW5pdHk2ID0KKyAgICAgICAgICAgIG5ldyBJbnNhbml0eSgKKyAgICAgICAgICAgICAgICBhcnJheSgKKyAgICAgICAgICAgICAgICAgICAgJ3VzZXJNYXAnID0+IG51bGwsCisgICAgICAgICAgICAgICAgICAgICd4dHJ1Y3RzJyA9PiBudWxsCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgKTsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RJbnNhbml0eUV4cGVjdGVkUmVzdWx0J10gPQorICAgICAgICAgICAgYXJyYXkoCisgICAgICAgICAgICAgICAgIjEiID0+IGFycmF5KAorICAgICAgICAgICAgICAgICAgICBOdW1iZXJ6OjpUV08gPT4gJGluc2FuaXR5MiwKKyAgICAgICAgICAgICAgICAgICAgTnVtYmVyejo6VEhSRUUgPT4gJGluc2FuaXR5MworICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgICAgIjIiID0+IGFycmF5KAorICAgICAgICAgICAgICAgICAgICBOdW1iZXJ6OjpTSVggPT4gJGluc2FuaXR5NgorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC90ZXN0L0pzb25TZXJpYWxpemUvSnNvblNlcmlhbGl6ZVRlc3QucGhwIGIvbGliL3BocC90ZXN0L0pzb25TZXJpYWxpemUvSnNvblNlcmlhbGl6ZVRlc3QucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2Njg2NTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL3Rlc3QvSnNvblNlcmlhbGl6ZS9Kc29uU2VyaWFsaXplVGVzdC5waHAKQEAgLTAsMCArMSwxMTYgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK25hbWVzcGFjZSBUZXN0XFRocmlmdFxKc29uU2VyaWFsaXplOworCit1c2UgUEhQVW5pdFxGcmFtZXdvcmtcVGVzdENhc2U7Cit1c2Ugc3RkQ2xhc3M7CisKK3JlcXVpcmUgX19ESVJfXyAuICcvLi4vLi4vLi4vLi4vdmVuZG9yL2F1dG9sb2FkLnBocCc7CisKKy8qKgorICogQHJ1blRlc3RzSW5TZXBhcmF0ZVByb2Nlc3NlcworICovCitjbGFzcyBKc29uU2VyaWFsaXplVGVzdCBleHRlbmRzIFRlc3RDYXNlCit7CisgICAgcHJvdGVjdGVkIGZ1bmN0aW9uIHNldFVwKCkKKyAgICB7CisgICAgICAgIGlmICh2ZXJzaW9uX2NvbXBhcmUocGhwdmVyc2lvbigpLCAnNS40JywgJzwnKSkgeworICAgICAgICAgICAgJHRoaXMtPm1hcmtUZXN0U2tpcHBlZCgnUmVxdWlyZXMgUEhQIDUuNCBvciBuZXdlciEnKTsKKyAgICAgICAgfQorICAgICAgICAvKiogQHZhciBcQ29tcG9zZXJcQXV0b2xvYWRcQ2xhc3NMb2FkZXIgJGxvYWRlciAqLworICAgICAgICAkbG9hZGVyID0gcmVxdWlyZSBfX0RJUl9fIC4gJy8uLi8uLi8uLi8uLi92ZW5kb3IvYXV0b2xvYWQucGhwJzsKKyAgICAgICAgJGxvYWRlci0+YWRkUHNyNCgnJywgX19ESVJfXyAuICcvLi4vcGFja2FnZXMvcGhwanMnKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdEVtcHR5U3RydWN0KCkKKyAgICB7CisgICAgICAgICRlbXB0eSA9IG5ldyBcVGhyaWZ0VGVzdFxFbXB0eVN0cnVjdChhcnJheSgnbm9uX2V4aXN0aW5nX2tleScgPT4gJ2JhcicpKTsKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscyhuZXcgc3RkQ2xhc3MoKSwganNvbl9kZWNvZGUoanNvbl9lbmNvZGUoJGVtcHR5KSkpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U3RyaW5nc0FuZEludHMoKQorICAgIHsKKyAgICAgICAgJGlucHV0ID0gYXJyYXkoCisgICAgICAgICAgICAnc3RyaW5nX3RoaW5nJyA9PiAnZm9vJywKKyAgICAgICAgICAgICdpNjRfdGhpbmcnID0+IDEyMzQ1Njc4OTAsCisgICAgICAgICk7CisgICAgICAgICR4dHJ1Y3QgPSBuZXcgXFRocmlmdFRlc3RcWHRydWN0KCRpbnB1dCk7CisKKyAgICAgICAgLy8gWHRydWN0J3MgJ2kzMl90aGluZycgYW5kICdieXRlX3RoaW5nJyBmaWVsZHMgc2hvdWxkIG5vdCBiZSBwcmVzZW50IGhlcmUhCisgICAgICAgICRleHBlY3RlZCA9IG5ldyBzdGRDbGFzcygpOworICAgICAgICAkZXhwZWN0ZWQtPnN0cmluZ190aGluZyA9ICRpbnB1dFsnc3RyaW5nX3RoaW5nJ107CisgICAgICAgICRleHBlY3RlZC0+aTY0X3RoaW5nID0gJGlucHV0WydpNjRfdGhpbmcnXTsKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsIGpzb25fZGVjb2RlKGpzb25fZW5jb2RlKCR4dHJ1Y3QpKSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3ROZXN0ZWRTdHJ1Y3RzKCkKKyAgICB7CisgICAgICAgICR4dHJ1Y3QyID0gbmV3IFxUaHJpZnRUZXN0XFh0cnVjdDIoYXJyYXkoCisgICAgICAgICAgICAnYnl0ZV90aGluZycgPT4gNDIsCisgICAgICAgICAgICAnc3RydWN0X3RoaW5nJyA9PiBuZXcgXFRocmlmdFRlc3RcWHRydWN0KGFycmF5KAorICAgICAgICAgICAgICAgICdpMzJfdGhpbmcnID0+IDEyMzQ1NiwKKyAgICAgICAgICAgICkpLAorICAgICAgICApKTsKKworICAgICAgICAkZXhwZWN0ZWQgPSBuZXcgc3RkQ2xhc3MoKTsKKyAgICAgICAgJGV4cGVjdGVkLT5ieXRlX3RoaW5nID0gJHh0cnVjdDItPmJ5dGVfdGhpbmc7CisgICAgICAgICRleHBlY3RlZC0+c3RydWN0X3RoaW5nID0gbmV3IHN0ZENsYXNzKCk7CisgICAgICAgICRleHBlY3RlZC0+c3RydWN0X3RoaW5nLT5pMzJfdGhpbmcgPSAkeHRydWN0Mi0+c3RydWN0X3RoaW5nLT5pMzJfdGhpbmc7CisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCBqc29uX2RlY29kZShqc29uX2VuY29kZSgkeHRydWN0MikpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdEluc2FuaXR5KCkKKyAgICB7CisgICAgICAgICR4aW5wdXQgPSBhcnJheSgnc3RyaW5nX3RoaW5nJyA9PiAnZm9vJyk7CisgICAgICAgICR4dHJ1Y3QgPSBuZXcgXFRocmlmdFRlc3RcWHRydWN0KCR4aW5wdXQpOworICAgICAgICAkaW5zYW5pdHkgPSBuZXcgXFRocmlmdFRlc3RcSW5zYW5pdHkoYXJyYXkoCisgICAgICAgICAgICAneHRydWN0cycgPT4gYXJyYXkoJHh0cnVjdCwgJHh0cnVjdCwgJHh0cnVjdCkKKyAgICAgICAgKSk7CisgICAgICAgICRleHBlY3RlZCA9IG5ldyBzdGRDbGFzcygpOworICAgICAgICAkZXhwZWN0ZWQtPnh0cnVjdHMgPSBhcnJheSgob2JqZWN0KSR4aW5wdXQsIChvYmplY3QpJHhpbnB1dCwgKG9iamVjdCkkeGlucHV0KTsKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsIGpzb25fZGVjb2RlKGpzb25fZW5jb2RlKCRpbnNhbml0eSkpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdE5lc3RlZExpc3RzKCkKKyAgICB7CisgICAgICAgICRib25rID0gbmV3IFxUaHJpZnRUZXN0XEJvbmsoYXJyYXkoJ21lc3NhZ2UnID0+ICdmb28nKSk7CisgICAgICAgICRuZXN0ZWQgPSBuZXcgXFRocmlmdFRlc3RcTmVzdGVkTGlzdHNCb25rKGFycmF5KCdib25rJyA9PiBhcnJheShhcnJheShhcnJheSgkYm9uaykpKSkpOworICAgICAgICAkZXhwZWN0ZWQgPSBuZXcgc3RkQ2xhc3MoKTsKKyAgICAgICAgJGV4cGVjdGVkLT5ib25rID0gYXJyYXkoYXJyYXkoYXJyYXkoKG9iamVjdClhcnJheSgnbWVzc2FnZScgPT4gJ2ZvbycpKSkpOworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwganNvbl9kZWNvZGUoanNvbl9lbmNvZGUoJG5lc3RlZCkpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdE1hcHMoKQorICAgIHsKKyAgICAgICAgJGludG1hcCA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RNYXBfYXJncyhbJ3RoaW5nJyA9PiBbMCA9PiAnemVybyddXSk7CisgICAgICAgICRlbXB0eW1hcCA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RNYXBfYXJncyhbXSk7CisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJ3sidGhpbmciOnsiMCI6Inplcm8ifX0nLCBqc29uX2VuY29kZSgkaW50bWFwKSk7CisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJ3t9JywganNvbl9lbmNvZGUoJGVtcHR5bWFwKSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RTY2FsYXJUeXBlcygpCisgICAgeworICAgICAgICAkYiA9IG5ldyBcVGhyaWZ0VGVzdFxCb29scyhbJ2ltX3RydWUnID0+ICcxJywgJ2ltX2ZhbHNlJyA9PiAnMCddKTsKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygneyJpbV90cnVlIjp0cnVlLCJpbV9mYWxzZSI6ZmFsc2V9JywganNvbl9lbmNvZGUoJGIpKTsKKyAgICAgICAgJHMgPSBuZXcgXFRocmlmdFRlc3RcU3RydWN0QShbJ3MnID0+IDQyXSk7CisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJ3sicyI6IjQyIn0nLCBqc29uX2VuY29kZSgkcykpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvdGVzdC9NYWtlZmlsZS5hbSBiL2xpYi9waHAvdGVzdC9NYWtlZmlsZS5hbQppbmRleCA4NjljNTQ0Li40ODI0Njg4IDEwMDc1NQotLS0gYS9saWIvcGhwL3Rlc3QvTWFrZWZpbGUuYW0KKysrIGIvbGliL3BocC90ZXN0L01ha2VmaWxlLmFtCkBAIC0xNywxMSArMTcsMTEgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLVRIUklGVCA9ICQodG9wX2J1aWxkZGlyKS9jb21waWxlci9jcHAvdGhyaWZ0CitQSFBVTklUPXBocCAkKHRvcF9zcmNkaXIpL3ZlbmRvci9iaW4vcGhwdW5pdAogCiBzdHViczogLi4vLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdCAgVGVzdFZhbGlkYXRvcnMudGhyaWZ0Ci0JbWtkaXIgLXAgLi9wYWNrYWdlcwotCSQoVEhSSUZUKSAtLWdlbiBwaHAgLXIgLS1vdXQgLi9wYWNrYWdlcyAuLi8uLi8uLi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CisJbWtkaXIgLXAgLi9wYWNrYWdlcy9waHAKKwkkKFRIUklGVCkgLS1nZW4gcGhwIC1yIC0tb3V0IC4vcGFja2FnZXMvcGhwIC4uLy4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKIAlta2RpciAtcCAuL3BhY2thZ2VzL3BocHYKIAlta2RpciAtcCAuL3BhY2thZ2VzL3BocHZvCiAJbWtkaXIgLXAgLi9wYWNrYWdlcy9waHBqcwpAQCAtMjksMjIgKzI5LDIxIEBACiAJJChUSFJJRlQpIC0tZ2VuIHBocDp2YWxpZGF0ZSxvb3AgLXIgLS1vdXQgLi9wYWNrYWdlcy9waHB2byAgVGVzdFZhbGlkYXRvcnMudGhyaWZ0CiAJJChUSFJJRlQpIC0tZ2VuIHBocDpqc29uICAgICAgICAgLXIgLS1vdXQgLi9wYWNrYWdlcy9waHBqcyAgVGVzdFZhbGlkYXRvcnMudGhyaWZ0CiAKLWNoZWNrLWpzb24tc2VyaWFsaXplcjogc3R1YnMKLWlmIEhBVkVfUEhQVU5JVAotCSQoUEhQVU5JVCkgLS1sb2ctanVuaXQ9VEVTVC1qc29uLXNlcmlhbGl6ZXIueG1sIFRlc3QvVGhyaWZ0L0pzb25TZXJpYWxpemUvCi1lbmRpZgorZGVwczogJCh0b3Bfc3JjZGlyKS9jb21wb3Nlci5qc29uCisJY29tcG9zZXIgaW5zdGFsbCAtLXdvcmtpbmctZGlyPSQodG9wX3NyY2RpcikKIAotY2hlY2stdmFsaWRhdG9yOiBzdHVicyAKLQlwaHAgVGVzdC9UaHJpZnQvVGVzdFZhbGlkYXRvcnMucGhwIAotCXBocCBUZXN0L1RocmlmdC9UZXN0VmFsaWRhdG9ycy5waHAgLW9vcCAKK2FsbC1sb2NhbDogZGVwcwogCi1jaGVjay1wcm90b2NvbDoJc3R1YnMKLWlmIEhBVkVfUEhQVU5JVAotCSQoUEhQVU5JVCkgLS1sb2ctanVuaXQ9VEVTVC1sb2ctanNvbi1wcm90b2NvbC54bWwgVGVzdC9UaHJpZnQvUHJvdG9jb2wvVGVzdFRKU09OUHJvdG9jb2wucGhwCi0JJChQSFBVTklUKSAtLWxvZy1qdW5pdD1URVNULWJpbmFyeS1zZXJpYWxpemVyLnhtbCBUZXN0L1RocmlmdC9Qcm90b2NvbC9UZXN0QmluYXJ5U2VyaWFsaXplci5waHAKLWVuZGlmCitjaGVjay1qc29uLXNlcmlhbGl6ZXI6IGRlcHMgc3R1YnMKKwkkKFBIUFVOSVQpIC0tbG9nLWp1bml0PVRFU1QtbG9nLWpzb24tc2VyaWFsaXplci54bWwgSnNvblNlcmlhbGl6ZS8KIAotY2hlY2s6IHN0dWJzIFwKK2NoZWNrLXZhbGlkYXRvcjogZGVwcyBzdHVicworCSQoUEhQVU5JVCkgLS1sb2ctanVuaXQ9VEVTVC1sb2ctdmFsaWRhdG9yLnhtbCBWYWxpZGF0b3IvCisKK2NoZWNrLXByb3RvY29sOglkZXBzIHN0dWJzCisJJChQSFBVTklUKSAtLWxvZy1qdW5pdD1URVNULWxvZy1wcm90b2NvbC54bWwgUHJvdG9jb2wvCisKK2NoZWNrOiBkZXBzIHN0dWJzIFwKICAgY2hlY2stcHJvdG9jb2wgXAogICBjaGVjay12YWxpZGF0b3IgXAogICBjaGVjay1qc29uLXNlcmlhbGl6ZXIKQEAgLTUyLDYgKzUxLDMgQEAKIGNsZWFuLWxvY2FsOgogCSQoUk0pIC1yIC4vcGFja2FnZXMKIAkkKFJNKSBURVNULSoueG1sCi0KLUVYVFJBX0RJU1QgPSBUZXN0Ci0KZGlmZiAtLWdpdCBhL2xpYi9waHAvdGVzdC9Qcm90b2NvbC9CaW5hcnlTZXJpYWxpemVyVGVzdC5waHAgYi9saWIvcGhwL3Rlc3QvUHJvdG9jb2wvQmluYXJ5U2VyaWFsaXplclRlc3QucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxYjBiYjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL3Rlc3QvUHJvdG9jb2wvQmluYXJ5U2VyaWFsaXplclRlc3QucGhwCkBAIC0wLDAgKzEsNjAgQEAKKzw/cGhwCisKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRlc3QKKyAqLworCituYW1lc3BhY2UgVGVzdFxUaHJpZnRcUHJvdG9jb2w7CisKK3VzZSBQSFBVbml0XEZyYW1ld29ya1xUZXN0Q2FzZTsKK3VzZSBUaHJpZnRcU2VyaWFsaXplclxUQmluYXJ5U2VyaWFsaXplcjsKKworcmVxdWlyZSBfX0RJUl9fIC4gJy8uLi8uLi8uLi8uLi92ZW5kb3IvYXV0b2xvYWQucGhwJzsKKworLyoqKgorICogVGhpcyB0ZXN0IHN1aXRlIGRlcGVuZHMgb24gcnVubmluZyB0aGUgY29tcGlsZXIgYWdhaW5zdCB0aGUKKyAqIHN0YW5kYXJkIFRocmlmdFRlc3QudGhyaWZ0IGZpbGU6CisgKgorICogbGliL3BocC90ZXN0JCAuLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC0tZ2VuIHBocCAtciBcCisgKiAgIC0tb3V0IC4vcGFja2FnZXMgLi4vLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorICoKKyAqIEBydW5UZXN0c0luU2VwYXJhdGVQcm9jZXNzZXMKKyAqLworY2xhc3MgQmluYXJ5U2VyaWFsaXplclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZQoreworICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRVcCgpCisgICAgeworICAgICAgICAvKiogQHZhciBcQ29tcG9zZXJcQXV0b2xvYWRcQ2xhc3NMb2FkZXIgJGxvYWRlciAqLworICAgICAgICAkbG9hZGVyID0gcmVxdWlyZSBfX0RJUl9fIC4gJy8uLi8uLi8uLi8uLi92ZW5kb3IvYXV0b2xvYWQucGhwJzsKKyAgICAgICAgJGxvYWRlci0+YWRkUHNyNCgnJywgX19ESVJfXyAuICcvLi4vcGFja2FnZXMvcGhwJyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2UgdHJ5IHRvIHNlcmlhbGl6ZSBhbmQgZGVzZXJpYWxpemUgYSByYW5kb20gb2JqZWN0IHRvIG1ha2Ugc3VyZSBubyBleGNlcHRpb25zIGFyZSB0aHJvd24uCisgICAgICogQHNlZSBUSFJJRlQtMTU3OQorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0QmluYXJ5U2VyaWFsaXplcigpCisgICAgeworICAgICAgICAkc3RydWN0ID0gbmV3IFxUaHJpZnRUZXN0XFh0cnVjdChhcnJheSgnc3RyaW5nX3RoaW5nJyA9PiAnYWJjJykpOworICAgICAgICAkc2VyaWFsaXplZCA9IFRCaW5hcnlTZXJpYWxpemVyOjpzZXJpYWxpemUoJHN0cnVjdCwgJ1RocmlmdFRlc3RcXFh0cnVjdCcpOworICAgICAgICAkZGVzZXJpYWxpemVkID0gVEJpbmFyeVNlcmlhbGl6ZXI6OmRlc2VyaWFsaXplKCRzZXJpYWxpemVkLCAnVGhyaWZ0VGVzdFxcWHRydWN0Jyk7CisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJHN0cnVjdCwgJGRlc2VyaWFsaXplZCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC90ZXN0L1Byb3RvY29sL1RKU09OUHJvdG9jb2xGaXh0dXJlcy5waHAgYi9saWIvcGhwL3Rlc3QvUHJvdG9jb2wvVEpTT05Qcm90b2NvbEZpeHR1cmVzLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDkwMzlmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC90ZXN0L1Byb3RvY29sL1RKU09OUHJvdG9jb2xGaXh0dXJlcy5waHAKQEAgLTAsMCArMSw3NCBAQAorPD9waHAKKworLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQudGVzdAorICovCisKK25hbWVzcGFjZSBUZXN0XFRocmlmdFxQcm90b2NvbDsKKworY2xhc3MgVEpTT05Qcm90b2NvbEZpeHR1cmVzCit7CisgICAgcHVibGljIHN0YXRpYyAkdGVzdEFyZ3NKU09OID0gYXJyYXkoKTsKKworICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcG9wdWxhdGVUZXN0QXJnc0pTT04oKQorICAgIHsKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdFZvaWQnXSA9ICd7fSc7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cmluZzEnXSA9ICd7IjEiOnsic3RyIjoiQWZyaWthYW5zLCBBbGVtYW5uaXNjaCwgQXJhZ29uw6lzLCDYp9mE2LnYsdio2YrYqSwg2YXYtdix2YksIEFzdHVyaWFudSwgQXltYXIgYXJ1LCBBesmZcmJheWNhbiwg0JHQsNGI0qHQvtGA0YIsIEJvYXJpc2NoLCDFvWVtYWl0xJfFoWthLCDQkdC10LvQsNGA0YPRgdC60LDRjywg0JHQtdC70LDRgNGD0YHQutCw0Y8gKNGC0LDRgNCw0YjQutC10LLRltGG0LApLCDQkdGK0LvQs9Cw0YDRgdC60LgsIEJhbWFuYW5rYW4sIOCmrOCmvuCmguCmsuCmviwgQnJlemhvbmVnLCBCb3NhbnNraSwgQ2F0YWzDoCwgTcOsbmctZMSVzKRuZy1uZ+G5s8yELCDQndC+0YXRh9C40LnQvSwgQ2VidWFubywg4Y+j4Y6z4Y6pLCDEjGVza3ksINCh0LvQvtCy0aPMgdC90YzRgdC60YogXC8g4rCU4rCO4rCR4rCC4rCh4rCQ4rCg4rCU4rCN4rCfLCDQp9OR0LLQsNGI0LvQsCwgQ3ltcmFlZywgRGFuc2ssIFphemFraSwg3oveqN6I3qzegN6o3oTept6Q3rAsIM6VzrvOu863zr3Ouc66zqwsIEVtaWxpw6BuIGUgcnVtYWduw7JsLCBFbmdsaXNoLCBFc3BlcmFudG8sIEVzcGHDsW9sLCBFZXN0aSwgRXVza2FyYSwg2YHYp9ix2LPbjCwgU3VvbWksIFbDtXJvLCBGw7hyb3lza3QsIEZyYW7Dp2FpcywgQXJwZXRhbiwgRnVybGFuLCBGcnlzaywgR2FlaWxnZSwg6LSb6KqeLCBHw6BpZGhsaWcsIEdhbGVnbywgQXZhw7FlXCfhur0sIOCql+CrgeCqnOCqsOCqvuCqpOCrgCwgR2FlbGcsINei15HXqNeZ16osIOCkueCkv+CkqOCljeCkpuClgCwgRmlqaSBIaW5kaSwgSHJ2YXRza2ksIEtyZXnDsmwgYXlpc3llbiwgTWFneWFyLCDVgNWh1bXVpdaA1aXVtiwgSW50ZXJsaW5ndWEsIEJhaGFzYSBJbmRvbmVzaWEsIElsb2thbm8sIElkbywgw41zbGVuc2thLCBJdGFsaWFubywg5pel5pys6KqeLCBMb2piYW4sIEJhc2EgSmF3YSwg4YOl4YOQ4YOg4YOX4YOj4YOa4YOYLCBLb25nbywgS2FsYWFsbGlzdXQsIOCyleCyqOCzjeCyqOCyoSwg7ZWc6rWt7Ja0LCDQmtGK0LDRgNCw0YfQsNC5LdCc0LDQu9C60YrQsNGALCBSaXBvYXJpc2NoLCBLdXJkw64sINCa0L7QvNC4LCBLZXJuZXdlaywg0JrRi9GA0LPRi9C30YfQsCwgTGF0aW5hLCBMYWRpbm8sIEzDq3R6ZWJ1ZXJnZXNjaCwgTGltYnVyZ3MsIExpbmfDoWxhLCDguqXgurLguqcsIExpZXR1dmnFsywgTGF0dmllxaF1LCBCYXNhIEJhbnl1bWFzYW4sIE1hbGFnYXN5LCDQnNCw0LrQtdC00L7QvdGB0LrQuCwg4LSu4LSy4LSv4LS+4LSz4LSCLCDgpK7gpLDgpL7gpKDgpYAsIEJhaGFzYSBNZWxheXUsINmF2KfYstmQ2LHZiNmG24wsIE5uYXB1bGl0YW5vLCBOZWRlcnNha3Npc2NoLCDgpKjgpYfgpKrgpL7gpLIg4KSt4KS+4KS34KS+LCBOZWRlcmxhbmRzLCDigKpOb3JzayAobnlub3JzaynigKwsIOKAqk5vcnNrIChib2ttw6VsKeKArCwgTm91b3JtYW5kLCBEaW7DqSBiaXphYWQsIE9jY2l0YW4sINCY0YDQvtC90LDRgywgUGFwaWFtZW50dSwgRGVpdHNjaCwgTm9yZnVrIFwvIFBpdGtlcm4sIFBvbHNraSwg2b7Zhtis2KfYqNuMLCDZvtqa2KrZiCwgUG9ydHVndcOqcywgUnVuYSBTaW1pLCBSdW1hbnRzY2gsIFJvbWFuaSwgUm9tw6JuxIMsINCg0YPRgdGB0LrQuNC5LCDQodCw0YXQsCDRgtGL0LvQsCwgU2FyZHUsIFNpY2lsaWFudSwgU2NvdHMsIFPDoW1lZ2llbGxhLCBTaW1wbGUgRW5nbGlzaCwgU2xvdmVuxI1pbmEsIFNsb3ZlbsWhxI1pbmEsINCh0YDQv9GB0LrQuCBcLyBTcnBza2ksIFNlZWx0ZXJzaywgU3ZlbnNrYSwgS2lzd2FoaWxpLCDgrqTgrq7grr/grrTgr40sIOCwpOCxhuCwsuCxgeCwl+CxgSwg0KLQvtK30LjQutOjLCDguYTguJfguKIsIFTDvHJrbWVuw6dlLCBUYWdhbG9nLCBUw7xya8OnZSwg0KLQsNGC0LDRgNGH0LBcL1RhdGFyw6dhLCDQo9C60YDQsNGX0L3RgdGM0LrQsCwg2KfYsdiv2YgsIFRp4bq/bmcgVmnhu4d0LCBWb2xhcMO8aywgV2Fsb24sIFdpbmFyYXksIOWQtOivrSwgaXNpWGhvc2EsINeZ15nWtNeT15nXqSwgWW9yw7liw6EsIFplw6p1d3MsIOS4reaWhywgQsOibi1sw6JtLWfDuiwg57K16KqeIn19JzsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RyaW5nMiddID0gJ3siMSI6eyJzdHIiOiJxdW90ZTogXFxcXFwiIGJhY2tzbGFzaDogZm9yd2FyZHNsYXNoLWVzY2FwZWQ6IFxcXFxcLyAgYmFja3NwYWNlOiBcXFxcYiBmb3JtZmVlZDogXGYgbmV3bGluZTogXG4gcmV0dXJuOiBcciB0YWI6ICBub3ctYWxsLW9mLXRoZW0tdG9nZXRoZXI6IFwiXFxcXFxcXFxcL1xcXFxiXG5cclx0IG5vdy1hLWJ1bmNoLW9mLWp1bms6ICFAIyQlJigpKCYlJCN7fXt9PD48PjwifX0nOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJpbmczJ10gPSAneyIxIjp7InN0ciI6InN0cmluZyB0aGF0IGVuZHMgaW4gZG91YmxlLWJhY2tzbGFzaCBcXFxcXFxcXCJ9fSc7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdFVuaWNvZGVTdHJpbmdXaXRoTm9uQk1QJ10gPSAneyIxIjp7InN0ciI6IuC4quC4p+C4seC4quC4lOC4tVwv8J2SryJ9fSc7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdERvdWJsZSddID0gJ3siMSI6eyJkYmwiOjMuMTQxNTkyNjUzNTg5OH19JzsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0Qnl0ZSddID0gJ3siMSI6eyJpOCI6MX19JzsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0STMyJ10gPSAneyIxIjp7ImkzMiI6MTA3Mzc0MTgyNH19JzsKKworICAgICAgICBpZiAoUEhQX0lOVF9TSVpFID09IDgpIHsKKyAgICAgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RJNjQnXSA9ICd7IjEiOnsiaTY0IjonIC4gcG93KDIsIDYwKSAuICd9fSc7CisgICAgICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RydWN0J10gPSAneyIxIjp7InJlYyI6eyIxIjp7InN0ciI6IndvcmtlZCJ9LCI0Ijp7Imk4IjoxfSwiOSI6eyJpMzIiOjEwNzM3NDE4MjR9LCIxMSI6eyJpNjQiOicgLiBwb3coMiwgNjApIC4gJ319fX0nOworICAgICAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdE5lc3QnXSA9ICd7IjEiOnsicmVjIjp7IjEiOnsiaTgiOjF9LCIyIjp7InJlYyI6eyIxIjp7InN0ciI6IndvcmtlZCJ9LCI0Ijp7Imk4IjoxfSwiOSI6eyJpMzIiOjEwNzM3NDE4MjR9LCIxMSI6eyJpNjQiOicgLiBwb3coMiwgNjApIC4gJ319fSwiMyI6eyJpMzIiOjMyNzY4fX19fSc7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0STY0J10gPSAneyIxIjp7Imk2NCI6MTE1MjkyMTUwNDYwNjg0NzAwMH19JzsKKyAgICAgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJ1Y3QnXSA9ICd7IjEiOnsicmVjIjp7IjEiOnsic3RyIjoid29ya2VkIn0sIjQiOnsiaTgiOjF9LCI5Ijp7ImkzMiI6MTA3Mzc0MTgyNH0sIjExIjp7Imk2NCI6MTE1MjkyMTUwNDYwNjg0NzAwMH19fX0nOworICAgICAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdE5lc3QnXSA9ICd7IjEiOnsicmVjIjp7IjEiOnsiaTgiOjF9LCIyIjp7InJlYyI6eyIxIjp7InN0ciI6IndvcmtlZCJ9LCI0Ijp7Imk4IjoxfSwiOSI6eyJpMzIiOjEwNzM3NDE4MjR9LCIxMSI6eyJpNjQiOjExNTI5MjE1MDQ2MDY4NDcwMDB9fX0sIjMiOnsiaTMyIjozMjc2OH19fX0nOworICAgICAgICB9CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdE1hcCddID0gJ3siMSI6eyJtYXAiOlsiaTMyIiwiaTMyIiwzLHsiNyI6NzcsIjgiOjg4LCI5Ijo5OX1dfX0nOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJpbmdNYXAnXSA9ICd7IjEiOnsibWFwIjpbInN0ciIsInN0ciIsNix7ImEiOiIxMjMiLCJhIGIiOiJ3aXRoIHNwYWNlcyAiLCJzYW1lIjoic2FtZSIsIjAiOiJudW1lcmljIGtleSIsImxvbmdWYWx1ZSI6IkFmcmlrYWFucywgQWxlbWFubmlzY2gsIEFyYWdvblx1MDBlOXMsIFx1MDYyN1x1MDY0NFx1MDYzOVx1MDYzMVx1MDYyOFx1MDY0YVx1MDYyOSwgXHUwNjQ1XHUwNjM1XHUwNjMxXHUwNjQ5LCBBc3R1cmlhbnUsIEF5bWFyIGFydSwgQXpcdTAyNTlyYmF5Y2FuLCBcdTA0MTFcdTA0MzBcdTA0NDhcdTA0YTFcdTA0M2VcdTA0NDBcdTA0NDIsIEJvYXJpc2NoLCBcdTAxN2RlbWFpdFx1MDExN1x1MDE2MWthLCBcdTA0MTFcdTA0MzVcdTA0M2JcdTA0MzBcdTA0NDBcdTA0NDNcdTA0NDFcdTA0M2FcdTA0MzBcdTA0NGYsIFx1MDQxMVx1MDQzNVx1MDQzYlx1MDQzMFx1MDQ0MFx1MDQ0M1x1MDQ0MVx1MDQzYVx1MDQzMFx1MDQ0ZiAoXHUwNDQyXHUwNDMwXHUwNDQwXHUwNDMwXHUwNDQ4XHUwNDNhXHUwNDM1XHUwNDMyXHUwNDU2XHUwNDQ2XHUwNDMwKSwgXHUwNDExXHUwNDRhXHUwNDNiXHUwNDMzXHUwNDMwXHUwNDQwXHUwNDQxXHUwNDNhXHUwNDM4LCBCYW1hbmFua2FuLCBcdTA5YWNcdTA5YmVcdTA5ODJcdTA5YjJcdTA5YmUsIEJyZXpob25lZywgQm9zYW5za2ksIENhdGFsXHUwMGUwLCBNXHUwMGVjbmctZFx1MDExNVx1MDMyNG5nLW5nXHUxZTczXHUwMzA0LCBcdTA0MWRcdTA0M2VcdTA0NDVcdTA0NDdcdTA0MzhcdTA0MzlcdTA0M2QsIENlYnVhbm8sIFx1MTNlM1x1MTNiM1x1MTNhOSwgXHUwMTBjZXNreSwgXHUwNDIxXHUwNDNiXHUwNDNlXHUwNDMyXHUwNDYzXHUwMzAxXHUwNDNkXHUwNDRjXHUwNDQxXHUwNDNhXHUwNDRhIFwvIFx1MmMxNFx1MmMwZVx1MmMxMVx1MmMwMlx1MmMyMVx1MmMxMFx1MmMyMFx1MmMxNFx1MmMwZFx1MmMxZiwgXHUwNDI3XHUwNGQxXHUwNDMyXHUwNDMwXHUwNDQ4XHUwNDNiXHUwNDMwLCBDeW1yYWVnLCBEYW5zaywgWmF6YWtpLCBcdTA3OGJcdTA3YThcdTA3ODhcdTA3YWNcdTA3ODBcdTA3YThcdTA3ODRcdTA3YTZcdTA3OTBcdTA3YjAsIFx1MDM5NVx1MDNiYlx1MDNiYlx1MDNiN1x1MDNiZFx1MDNiOVx1MDNiYVx1MDNhYywgRW1pbGlcdTAwZTBuIGUgcnVtYWduXHUwMGYybCwgRW5nbGlzaCwgRXNwZXJhbnRvLCBFc3BhXHUwMGYxb2wsIEVlc3RpLCBFdXNrYXJhLCBcdTA2NDFcdTA2MjdcdTA2MzFcdTA2MzNcdTA2Y2MsIFN1b21pLCBWXHUwMGY1cm8sIEZcdTAwZjhyb3lza3QsIEZyYW5cdTAwZTdhaXMsIEFycGV0YW4sIEZ1cmxhbiwgRnJ5c2ssIEdhZWlsZ2UsIFx1OGQxYlx1OGE5ZSwgR1x1MDBlMGlkaGxpZywgR2FsZWdvLCBBdmFcdTAwZjFlXCdcdTFlYmQsIFx1MGE5N1x1MGFjMVx1MGE5Y1x1MGFiMFx1MGFiZVx1MGFhNFx1MGFjMCwgR2FlbGcsIFx1MDVlMlx1MDVkMVx1MDVlOFx1MDVkOVx1MDVlYSwgXHUwOTM5XHUwOTNmXHUwOTI4XHUwOTRkXHUwOTI2XHUwOTQwLCBGaWppIEhpbmRpLCBIcnZhdHNraSwgS3JleVx1MDBmMmwgYXlpc3llbiwgTWFneWFyLCBcdTA1NDBcdTA1NjFcdTA1NzVcdTA1NjVcdTA1ODBcdTA1NjVcdTA1NzYsIEludGVybGluZ3VhLCBCYWhhc2EgSW5kb25lc2lhLCBJbG9rYW5vLCBJZG8sIFx1MDBjZHNsZW5za2EsIEl0YWxpYW5vLCBcdTY1ZTVcdTY3MmNcdThhOWUsIExvamJhbiwgQmFzYSBKYXdhLCBcdTEwZTVcdTEwZDBcdTEwZTBcdTEwZDdcdTEwZTNcdTEwZGFcdTEwZDgsIEtvbmdvLCBLYWxhYWxsaXN1dCwgXHUwYzk1XHUwY2E4XHUwY2NkXHUwY2E4XHUwY2ExLCBcdWQ1NWNcdWFkNmRcdWM1YjQsIFx1MDQxYVx1MDQ0YVx1MDQzMFx1MDQ0MFx1MDQzMFx1MDQ0N1x1MDQzMFx1MDQzOS1cdTA0MWNcdTA0MzBcdTA0M2JcdTA0M2FcdTA0NGFcdTA0MzBcdTA0NDAsIFJpcG9hcmlzY2gsIEt1cmRcdTAwZWUsIFx1MDQxYVx1MDQzZVx1MDQzY1x1MDQzOCwgS2VybmV3ZWssIFx1MDQxYVx1MDQ0Ylx1MDQ0MFx1MDQzM1x1MDQ0Ylx1MDQzN1x1MDQ0N1x1MDQzMCwgTGF0aW5hLCBMYWRpbm8sIExcdTAwZWJ0emVidWVyZ2VzY2gsIExpbWJ1cmdzLCBMaW5nXHUwMGUxbGEsIFx1MGVhNVx1MGViMlx1MGVhNywgTGlldHV2aVx1MDE3MywgTGF0dmllXHUwMTYxdSwgQmFzYSBCYW55dW1hc2FuLCBNYWxhZ2FzeSwgXHUwNDFjXHUwNDMwXHUwNDNhXHUwNDM1XHUwNDM0XHUwNDNlXHUwNDNkXHUwNDQxXHUwNDNhXHUwNDM4LCBcdTBkMmVcdTBkMzJcdTBkMmZcdTBkM2VcdTBkMzNcdTBkMDIsIFx1MDkyZVx1MDkzMFx1MDkzZVx1MDkyMFx1MDk0MCwgQmFoYXNhIE1lbGF5dSwgXHUwNjQ1XHUwNjI3XHUwNjMyXHUwNjUwXHUwNjMxXHUwNjQ4XHUwNjQ2XHUwNmNjLCBObmFwdWxpdGFubywgTmVkZXJzYWtzaXNjaCwgXHUwOTI4XHUwOTQ3XHUwOTJhXHUwOTNlXHUwOTMyIFx1MDkyZFx1MDkzZVx1MDkzN1x1MDkzZSwgTmVkZXJsYW5kcywgXHUyMDJhTm9yc2sgKG55bm9yc2spXHUyMDJjLCBcdTIwMmFOb3JzayAoYm9rbVx1MDBlNWwpXHUyMDJjLCBOb3Vvcm1hbmQsIERpblx1MDBlOSBiaXphYWQsIE9jY2l0YW4sIFx1MDQxOFx1MDQ0MFx1MDQzZVx1MDQzZFx1MDQzMFx1MDQ0MywgUGFwaWFtZW50dSwgRGVpdHNjaCwgTm9yZnVrIFwvIFBpdGtlcm4sIFBvbHNraSwgXHUwNjdlXHUwNjQ2XHUwNjJjXHUwNjI3XHUwNjI4XHUwNmNjLCBcdTA2N2VcdTA2OWFcdTA2MmFcdTA2NDgsIFBvcnR1Z3VcdTAwZWFzLCBSdW5hIFNpbWksIFJ1bWFudHNjaCwgUm9tYW5pLCBSb21cdTAwZTJuXHUwMTAzLCBcdTA0MjBcdTA0NDNcdTA0NDFcdTA0NDFcdTA0M2FcdTA0MzhcdTA0MzksIFx1MDQyMVx1MDQzMFx1MDQ0NVx1MDQzMCBcdTA0NDJcdTA0NGJcdTA0M2JcdTA0MzAsIFNhcmR1LCBTaWNpbGlhbnUsIFNjb3RzLCBTXHUwMGUxbWVnaWVsbGEsIFNpbXBsZSBFbmdsaXNoLCBTbG92ZW5cdTAxMGRpbmEsIFNsb3Zlblx1MDE2MVx1MDEwZGluYSwgXHUwNDIxXHUwNDQwXHUwNDNmXHUwNDQxXHUwNDNhXHUwNDM4IFwvIFNycHNraSwgU2VlbHRlcnNrLCBTdmVuc2thLCBLaXN3YWhpbGksIFx1MGJhNFx1MGJhZVx1MGJiZlx1MGJiNFx1MGJjZCwgXHUwYzI0XHUwYzQ2XHUwYzMyXHUwYzQxXHUwYzE3XHUwYzQxLCBcdTA0MjJcdTA0M2VcdTA0YjdcdTA0MzhcdTA0M2FcdTA0ZTMsIFx1MGU0NFx1MGUxN1x1MGUyMiwgVFx1MDBmY3JrbWVuXHUwMGU3ZSwgVGFnYWxvZywgVFx1MDBmY3JrXHUwMGU3ZSwgXHUwNDIyXHUwNDMwXHUwNDQyXHUwNDMwXHUwNDQwXHUwNDQ3XHUwNDMwXC9UYXRhclx1MDBlN2EsIFx1MDQyM1x1MDQzYVx1MDQ0MFx1MDQzMFx1MDQ1N1x1MDQzZFx1MDQ0MVx1MDQ0Y1x1MDQzYVx1MDQzMCwgXHUwNjI3XHUwNjMxXHUwNjJmXHUwNjQ4LCBUaVx1MWViZm5nIFZpXHUxZWM3dCwgVm9sYXBcdTAwZmNrLCBXYWxvbiwgV2luYXJheSwgXHU1NDM0XHU4YmVkLCBpc2lYaG9zYSwgXHUwNWQ5XHUwNWQ5XHUwNWI0XHUwNWQzXHUwNWQ5XHUwNWU5LCBZb3JcdTAwZjliXHUwMGUxLCBaZVx1MDBlYXV3cywgXHU0ZTJkXHU2NTg3LCBCXHUwMGUybi1sXHUwMGUybS1nXHUwMGZhLCBcdTdjYjVcdThhOWUiLCJBZnJpa2FhbnMsIEFsZW1hbm5pc2NoLCBBcmFnb25cdTAwZTlzLCBcdTA2MjdcdTA2NDRcdTA2MzlcdTA2MzFcdTA2MjhcdTA2NGFcdTA2MjksIFx1MDY0NVx1MDYzNVx1MDYzMVx1MDY0OSwgQXN0dXJpYW51LCBBeW1hciBhcnUsIEF6XHUwMjU5cmJheWNhbiwgXHUwNDExXHUwNDMwXHUwNDQ4XHUwNGExXHUwNDNlXHUwNDQwXHUwNDQyLCBCb2FyaXNjaCwgXHUwMTdkZW1haXRcdTAxMTdcdTAxNjFrYSwgXHUwNDExXHUwNDM1XHUwNDNiXHUwNDMwXHUwNDQwXHUwNDQzXHUwNDQxXHUwNDNhXHUwNDMwXHUwNDRmLCBcdTA0MTFcdTA0MzVcdTA0M2JcdTA0MzBcdTA0NDBcdTA0NDNcdTA0NDFcdTA0M2FcdTA0MzBcdTA0NGYgKFx1MDQ0Mlx1MDQzMFx1MDQ0MFx1MDQzMFx1MDQ0OFx1MDQzYVx1MDQzNVx1MDQzMlx1MDQ1Nlx1MDQ0Nlx1MDQzMCksIFx1MDQxMVx1MDQ0YVx1MDQzYlx1MDQzM1x1MDQzMFx1MDQ0MFx1MDQ0MVx1MDQzYVx1MDQzOCwgQmFtYW5hbmthbiwgXHUwOWFjXHUwOWJlXHUwOTgyXHUwOWIyXHUwOWJlLCBCcmV6aG9uZWcsIEJvc2Fuc2tpLCBDYXRhbFx1MDBlMCwgTVx1MDBlY25nLWRcdTAxMTVcdTAzMjRuZy1uZ1x1MWU3M1x1MDMwNCwgXHUwNDFkXHUwNDNlXHUwNDQ1XHUwNDQ3XHUwNDM4XHUwNDM5XHUwNDNkLCBDZWJ1YW5vLCBcdTEzZTNcdTEzYjNcdTEzYTksIFx1MDEwY2Vza3ksIFx1MDQyMVx1MDQzYlx1MDQzZVx1MDQzMlx1MDQ2M1x1MDMwMVx1MDQzZFx1MDQ0Y1x1MDQ0MVx1MDQzYVx1MDQ0YSBcLyBcdTJjMTRcdTJjMGVcdTJjMTFcdTJjMDJcdTJjMjFcdTJjMTBcdTJjMjBcdTJjMTRcdTJjMGRcdTJjMWYsIFx1MDQyN1x1MDRkMVx1MDQzMlx1MDQzMFx1MDQ0OFx1MDQzYlx1MDQzMCwgQ3ltcmFlZywgRGFuc2ssIFphemFraSwgXHUwNzhiXHUwN2E4XHUwNzg4XHUwN2FjXHUwNzgwXHUwN2E4XHUwNzg0XHUwN2E2XHUwNzkwXHUwN2IwLCBcdTAzOTVcdTAzYmJcdTAzYmJcdTAzYjdcdTAzYmRcdTAzYjlcdTAzYmFcdTAzYWMsIEVtaWxpXHUwMGUwbiBlIHJ1bWFnblx1MDBmMmwsIEVuZ2xpc2gsIEVzcGVyYW50bywgRXNwYVx1MDBmMW9sLCBFZXN0aSwgRXVza2FyYSwgXHUwNjQxXHUwNjI3XHUwNjMxXHUwNjMzXHUwNmNjLCBTdW9taSwgVlx1MDBmNXJvLCBGXHUwMGY4cm95c2t0LCBGcmFuXHUwMGU3YWlzLCBBcnBldGFuLCBGdXJsYW4sIEZyeXNrLCBHYWVpbGdlLCBcdThkMWJcdThhOWUsIEdcdTAwZTBpZGhsaWcsIEdhbGVnbywgQXZhXHUwMGYxZVwnXHUxZWJkLCBcdTBhOTdcdTBhYzFcdTBhOWNcdTBhYjBcdTBhYmVcdTBhYTRcdTBhYzAsIEdhZWxnLCBcdTA1ZTJcdTA1ZDFcdTA1ZThcdTA1ZDlcdTA1ZWEsIFx1MDkzOVx1MDkzZlx1MDkyOFx1MDk0ZFx1MDkyNlx1MDk0MCwgRmlqaSBIaW5kaSwgSHJ2YXRza2ksIEtyZXlcdTAwZjJsIGF5aXN5ZW4sIE1hZ3lhciwgXHUwNTQwXHUwNTYxXHUwNTc1XHUwNTY1XHUwNTgwXHUwNTY1XHUwNTc2LCBJbnRlcmxpbmd1YSwgQmFoYXNhIEluZG9uZXNpYSwgSWxva2FubywgSWRvLCBcdTAwY2RzbGVuc2thLCBJdGFsaWFubywgXHU2NWU1XHU2NzJjXHU4YTllLCBMb2piYW4sIEJhc2EgSmF3YSwgXHUxMGU1XHUxMGQwXHUxMGUwXHUxMGQ3XHUxMGUzXHUxMGRhXHUxMGQ4LCBLb25nbywgS2FsYWFsbGlzdXQsIFx1MGM5NVx1MGNhOFx1MGNjZFx1MGNhOFx1MGNhMSwgXHVkNTVjXHVhZDZkXHVjNWI0LCBcdTA0MWFcdTA0NGFcdTA0MzBcdTA0NDBcdTA0MzBcdTA0NDdcdTA0MzBcdTA0MzktXHUwNDFjXHUwNDMwXHUwNDNiXHUwNDNhXHUwNDRhXHUwNDMwXHUwNDQwLCBSaXBvYXJpc2NoLCBLdXJkXHUwMGVlLCBcdTA0MWFcdTA0M2VcdTA0M2NcdTA0MzgsIEtlcm5ld2VrLCBcdTA0MWFcdTA0NGJcdTA0NDBcdTA0MzNcdTA0NGJcdTA0MzdcdTA0NDdcdTA0MzAsIExhdGluYSwgTGFkaW5vLCBMXHUwMGVidHplYnVlcmdlc2NoLCBMaW1idXJncywgTGluZ1x1MDBlMWxhLCBcdTBlYTVcdTBlYjJcdTBlYTcsIExpZXR1dmlcdTAxNzMsIExhdHZpZVx1MDE2MXUsIEJhc2EgQmFueXVtYXNhbiwgTWFsYWdhc3ksIFx1MDQxY1x1MDQzMFx1MDQzYVx1MDQzNVx1MDQzNFx1MDQzZVx1MDQzZFx1MDQ0MVx1MDQzYVx1MDQzOCwgXHUwZDJlXHUwZDMyXHUwZDJmXHUwZDNlXHUwZDMzXHUwZDAyLCBcdTA5MmVcdTA5MzBcdTA5M2VcdTA5MjBcdTA5NDAsIEJhaGFzYSBNZWxheXUsIFx1MDY0NVx1MDYyN1x1MDYzMlx1MDY1MFx1MDYzMVx1MDY0OFx1MDY0Nlx1MDZjYywgTm5hcHVsaXRhbm8sIE5lZGVyc2Frc2lzY2gsIFx1MDkyOFx1MDk0N1x1MDkyYVx1MDkzZVx1MDkzMiBcdTA5MmRcdTA5M2VcdTA5MzdcdTA5M2UsIE5lZGVybGFuZHMsIFx1MjAyYU5vcnNrIChueW5vcnNrKVx1MjAyYywgXHUyMDJhTm9yc2sgKGJva21cdTAwZTVsKVx1MjAyYywgTm91b3JtYW5kLCBEaW5cdTAwZTkgYml6YWFkLCBPY2NpdGFuLCBcdTA0MThcdTA0NDBcdTA0M2VcdTA0M2RcdTA0MzBcdTA0NDMsIFBhcGlhbWVudHUsIERlaXRzY2gsIE5vcmZ1ayBcLyBQaXRrZXJuLCBQb2xza2ksIFx1MDY3ZVx1MDY0Nlx1MDYyY1x1MDYyN1x1MDYyOFx1MDZjYywgXHUwNjdlXHUwNjlhXHUwNjJhXHUwNjQ4LCBQb3J0dWd1XHUwMGVhcywgUnVuYSBTaW1pLCBSdW1hbnRzY2gsIFJvbWFuaSwgUm9tXHUwMGUyblx1MDEwMywgXHUwNDIwXHUwNDQzXHUwNDQxXHUwNDQxXHUwNDNhXHUwNDM4XHUwNDM5LCBcdTA0MjFcdTA0MzBcdTA0NDVcdTA0MzAgXHUwNDQyXHUwNDRiXHUwNDNiXHUwNDMwLCBTYXJkdSwgU2ljaWxpYW51LCBTY290cywgU1x1MDBlMW1lZ2llbGxhLCBTaW1wbGUgRW5nbGlzaCwgU2xvdmVuXHUwMTBkaW5hLCBTbG92ZW5cdTAxNjFcdTAxMGRpbmEsIFx1MDQyMVx1MDQ0MFx1MDQzZlx1MDQ0MVx1MDQzYVx1MDQzOCBcLyBTcnBza2ksIFNlZWx0ZXJzaywgU3ZlbnNrYSwgS2lzd2FoaWxpLCBcdTBiYTRcdTBiYWVcdTBiYmZcdTBiYjRcdTBiY2QsIFx1MGMyNFx1MGM0Nlx1MGMzMlx1MGM0MVx1MGMxN1x1MGM0MSwgXHUwNDIyXHUwNDNlXHUwNGI3XHUwNDM4XHUwNDNhXHUwNGUzLCBcdTBlNDRcdTBlMTdcdTBlMjIsIFRcdTAwZmNya21lblx1MDBlN2UsIFRhZ2Fsb2csIFRcdTAwZmNya1x1MDBlN2UsIFx1MDQyMlx1MDQzMFx1MDQ0Mlx1MDQzMFx1MDQ0MFx1MDQ0N1x1MDQzMFwvVGF0YXJcdTAwZTdhLCBcdTA0MjNcdTA0M2FcdTA0NDBcdTA0MzBcdTA0NTdcdTA0M2RcdTA0NDFcdTA0NGNcdTA0M2FcdTA0MzAsIFx1MDYyN1x1MDYzMVx1MDYyZlx1MDY0OCwgVGlcdTFlYmZuZyBWaVx1MWVjN3QsIFZvbGFwXHUwMGZjaywgV2Fsb24sIFdpbmFyYXksIFx1NTQzNFx1OGJlZCwgaXNpWGhvc2EsIFx1MDVkOVx1MDVkOVx1MDViNFx1MDVkM1x1MDVkOVx1MDVlOSwgWW9yXHUwMGY5Ylx1MDBlMSwgWmVcdTAwZWF1d3MsIFx1NGUyZFx1NjU4NywgQlx1MDBlMm4tbFx1MDBlMm0tZ1x1MDBmYSwgXHU3Y2I1XHU4YTllIjoibG9uZyBrZXkifV19fSc7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdFNldCddID0gJ3siMSI6eyJzZXQiOlsiaTMyIiwzLDEsNSw2XX19JzsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0TGlzdCddID0gJ3siMSI6eyJsc3QiOlsiaTMyIiwzLDEsMiwzXX19JzsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0RW51bSddID0gJ3siMSI6eyJpMzIiOjF9fSc7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdFR5cGVkZWYnXSA9ICd7IjEiOnsiaTY0Ijo2OX19JzsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0TWFwTWFwJ10gPSAneyIwIjp7Im1hcCI6WyJpMzIiLCJtYXAiLDIseyI0IjpbImkzMiIsImkzMiIsNCx7IjEiOjEsIjIiOjIsIjMiOjMsIjQiOjR9XSwiLTQiOlsiaTMyIiwiaTMyIiw0LHsiLTQiOi00LCItMyI6LTMsIi0yIjotMiwiLTEiOi0xfV19XX19JzsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0SW5zYW5pdHknXSA9ICd7IjAiOnsibWFwIjpbImk2NCIsIm1hcCIsMix7IjEiOlsiaTMyIiwicmVjIiwyLHsiMiI6eyIxIjp7Im1hcCI6WyJpMzIiLCJpNjQiLDIseyI1Ijo1LCI4Ijo4fV19LCIyIjp7ImxzdCI6WyJyZWMiLDIseyIxIjp7InN0ciI6Ikdvb2RieWU0In0sIjQiOnsiaTgiOjR9LCI5Ijp7ImkzMiI6NH0sIjExIjp7Imk2NCI6NH19LHsiMSI6eyJzdHIiOiJIZWxsbzIifSwiNCI6eyJpOCI6Mn0sIjkiOnsiaTMyIjoyfSwiMTEiOnsiaTY0IjoyfX1dfX0sIjMiOnsiMSI6eyJtYXAiOlsiaTMyIiwiaTY0IiwyLHsiNSI6NSwiOCI6OH1dfSwiMiI6eyJsc3QiOlsicmVjIiwyLHsiMSI6eyJzdHIiOiJHb29kYnllNCJ9LCI0Ijp7Imk4Ijo0fSwiOSI6eyJpMzIiOjR9LCIxMSI6eyJpNjQiOjR9fSx7IjEiOnsic3RyIjoiSGVsbG8yIn0sIjQiOnsiaTgiOjJ9LCI5Ijp7ImkzMiI6Mn0sIjExIjp7Imk2NCI6Mn19XX19fV0sIjIiOlsiaTMyIiwicmVjIiwxLHsiNiI6e319XX1dfX0nOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvdGVzdC9Qcm90b2NvbC9USlNPTlByb3RvY29sVGVzdC5waHAgYi9saWIvcGhwL3Rlc3QvUHJvdG9jb2wvVEpTT05Qcm90b2NvbFRlc3QucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmMGVjY2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL3Rlc3QvUHJvdG9jb2wvVEpTT05Qcm90b2NvbFRlc3QucGhwCkBAIC0wLDAgKzEsNTE4IEBACis8P3BocAorCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50ZXN0CisgKi8KKworbmFtZXNwYWNlIFRlc3RcVGhyaWZ0XFByb3RvY29sOworCit1c2UgUEhQVW5pdFxGcmFtZXdvcmtcVGVzdENhc2U7Cit1c2UgVGVzdFxUaHJpZnRcRml4dHVyZXM7Cit1c2UgVGhyaWZ0XFByb3RvY29sXFRKU09OUHJvdG9jb2w7Cit1c2UgVGhyaWZ0XFRyYW5zcG9ydFxUTWVtb3J5QnVmZmVyOworCityZXF1aXJlIF9fRElSX18gLiAnLy4uLy4uLy4uLy4uL3ZlbmRvci9hdXRvbG9hZC5waHAnOworCisvKioqCisgKiBUaGlzIHRlc3Qgc3VpdGUgZGVwZW5kcyBvbiBydW5uaW5nIHRoZSBjb21waWxlciBhZ2FpbnN0IHRoZQorICogc3RhbmRhcmQgVGhyaWZ0VGVzdC50aHJpZnQgZmlsZToKKyAqCisgKiBsaWIvcGhwL3Rlc3QkIC4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLS1nZW4gcGhwIC1yIFwKKyAqICAgLS1vdXQgLi9wYWNrYWdlcyAuLi8uLi8uLi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CisgKgorICogQHJ1blRlc3RzSW5TZXBhcmF0ZVByb2Nlc3NlcworICovCitjbGFzcyBUSlNPTlByb3RvY29sVGVzdCBleHRlbmRzIFRlc3RDYXNlCit7CisgICAgcHJpdmF0ZSAkdHJhbnNwb3J0OworICAgIHByaXZhdGUgJHByb3RvY29sOworCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzZXRVcEJlZm9yZUNsYXNzKCkKKyAgICB7CisgICAgICAgIC8qKiBAdmFyIFxDb21wb3NlclxBdXRvbG9hZFxDbGFzc0xvYWRlciAkbG9hZGVyICovCisgICAgICAgICRsb2FkZXIgPSByZXF1aXJlIF9fRElSX18gLiAnLy4uLy4uLy4uLy4uL3ZlbmRvci9hdXRvbG9hZC5waHAnOworICAgICAgICAkbG9hZGVyLT5hZGRQc3I0KCcnLCBfX0RJUl9fIC4gJy8uLi9wYWNrYWdlcy9waHAnKTsKKworICAgICAgICBGaXh0dXJlczo6cG9wdWxhdGVUZXN0QXJncygpOworICAgICAgICBUSlNPTlByb3RvY29sRml4dHVyZXM6OnBvcHVsYXRlVGVzdEFyZ3NKU09OKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHNldFVwKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnQgPSBuZXcgVE1lbW9yeUJ1ZmZlcigpOworICAgICAgICAkdGhpcy0+cHJvdG9jb2wgPSBuZXcgVEpTT05Qcm90b2NvbCgkdGhpcy0+dHJhbnNwb3J0KTsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydC0+b3BlbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdSSVRFIFRFU1RTCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RWb2lkV3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0Vm9pZF9hcmdzKCk7CisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFZvaWQnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RTdHJpbmcxV3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0U3RyaW5nX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdFN0cmluZzEnXTsKKyAgICAgICAgJGFyZ3MtPndyaXRlKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoRml4dHVyZXM6OiRidWZzaXplKTsKKyAgICAgICAgJGV4cGVjdGVkID0gVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RyaW5nMSddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFN0cmluZzJXcml0ZSgpCisgICAgeworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RTdHJpbmdfYXJncygpOworICAgICAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0U3RyaW5nMiddOworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJpbmcyJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0RG91YmxlV3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0RG91YmxlX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdERvdWJsZSddOworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3REb3VibGUnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RCeXRlV3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0Qnl0ZV9hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RCeXRlJ107CisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdEJ5dGUnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RJMzJXcml0ZSgpCisgICAgeworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RJMzJfYXJncygpOworICAgICAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0STMyJ107CisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdEkzMiddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdEk2NFdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdEk2NF9hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RJNjQnXTsKKyAgICAgICAgJGFyZ3MtPndyaXRlKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoRml4dHVyZXM6OiRidWZzaXplKTsKKyAgICAgICAgJGV4cGVjdGVkID0gVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0STY0J107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U3RydWN0V3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0U3RydWN0X2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdFN0cnVjdCddOworCisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cnVjdCddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdE5lc3RXcml0ZSgpCisgICAgeworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3ROZXN0X2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdE5lc3QnXTsKKworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3ROZXN0J107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0TWFwV3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0TWFwX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdE1hcCddOworCisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdE1hcCddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFN0cmluZ01hcFdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFN0cmluZ01hcF9hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RTdHJpbmdNYXAnXTsKKworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJpbmdNYXAnXTsKKworICAgICAgICAvKgorICAgICAgICAgKiBUaGUgJGFjdHVhbCByZXR1cm5zIHVuZXNjYXBlZCBzdHJpbmcuCisgICAgICAgICAqIEl0IGlzIHJlcXVpcmVkIHRvIHRvIGRlY29kZSB0aGVuIGVuY29kZSBpdCBhZ2FpbgorICAgICAgICAgKiB0byBnZXQgdGhlIGV4cGVjdGVkIGVzY2FwZWQgdW5pY29kZS4KKyAgICAgICAgICovCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCBqc29uX2VuY29kZShqc29uX2RlY29kZSgkYWN0dWFsKSkpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U2V0V3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0U2V0X2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdFNldCddOworCisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFNldCddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdExpc3RXcml0ZSgpCisgICAgeworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RMaXN0X2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdExpc3QnXTsKKworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RMaXN0J107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0RW51bVdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdEVudW1fYXJncygpOworICAgICAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0RW51bSddOworCisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdEVudW0nXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RUeXBlZGVmV3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0VHlwZWRlZl9hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RUeXBlZGVmJ107CisKKyAgICAgICAgJGFyZ3MtPndyaXRlKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoRml4dHVyZXM6OiRidWZzaXplKTsKKyAgICAgICAgJGV4cGVjdGVkID0gVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0VHlwZWRlZiddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSRUFEIFRFU1RTCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RWb2lkUmVhZCgpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKKyAgICAgICAgICAgIFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFZvaWQnXQorICAgICAgICApOworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RWb2lkX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnJlYWQoJHRoaXMtPnByb3RvY29sKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFN0cmluZzFSZWFkKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnQtPndyaXRlKAorICAgICAgICAgICAgVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RyaW5nMSddCisgICAgICAgICk7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFN0cmluZ19hcmdzKCk7CisgICAgICAgICRhcmdzLT5yZWFkKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICRhcmdzLT50aGluZzsKKyAgICAgICAgJGV4cGVjdGVkID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdFN0cmluZzEnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RTdHJpbmcyUmVhZCgpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKKyAgICAgICAgICAgIFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cmluZzInXQorICAgICAgICApOworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RTdHJpbmdfYXJncygpOworICAgICAgICAkYXJncy0+cmVhZCgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkYXJncy0+dGhpbmc7CisgICAgICAgICRleHBlY3RlZCA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RTdHJpbmcyJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U3RyaW5nM1dyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFN0cmluZ19hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RTdHJpbmczJ107CisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cmluZzMnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RTdHJpbmc0V3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0U3RyaW5nX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdFVuaWNvZGVTdHJpbmdXaXRoTm9uQk1QJ107CisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFVuaWNvZGVTdHJpbmdXaXRoTm9uQk1QJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0RG91YmxlUmVhZCgpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKKyAgICAgICAgICAgIFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdERvdWJsZSddCisgICAgICAgICk7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdERvdWJsZV9hcmdzKCk7CisgICAgICAgICRhcmdzLT5yZWFkKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICRhcmdzLT50aGluZzsKKyAgICAgICAgJGV4cGVjdGVkID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdERvdWJsZSddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdEJ5dGVSZWFkKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnQtPndyaXRlKAorICAgICAgICAgICAgVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0Qnl0ZSddCisgICAgICAgICk7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdEJ5dGVfYXJncygpOworICAgICAgICAkYXJncy0+cmVhZCgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkYXJncy0+dGhpbmc7CisgICAgICAgICRleHBlY3RlZCA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RCeXRlJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0STMyUmVhZCgpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKKyAgICAgICAgICAgIFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdEkzMiddCisgICAgICAgICk7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdEkzMl9hcmdzKCk7CisgICAgICAgICRhcmdzLT5yZWFkKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICRhcmdzLT50aGluZzsKKyAgICAgICAgJGV4cGVjdGVkID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdEkzMiddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdEk2NFJlYWQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydC0+d3JpdGUoCisgICAgICAgICAgICBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RJNjQnXQorICAgICAgICApOworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RJNjRfYXJncygpOworICAgICAgICAkYXJncy0+cmVhZCgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkYXJncy0+dGhpbmc7CisgICAgICAgICRleHBlY3RlZCA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RJNjQnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RTdHJ1Y3RSZWFkKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnQtPndyaXRlKAorICAgICAgICAgICAgVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RydWN0J10KKyAgICAgICAgKTsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0U3RydWN0X2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnJlYWQoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJGFyZ3MtPnRoaW5nOworICAgICAgICAkZXhwZWN0ZWQgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0U3RydWN0J107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0TmVzdFJlYWQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydC0+d3JpdGUoCisgICAgICAgICAgICBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3ROZXN0J10KKyAgICAgICAgKTsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0TmVzdF9hcmdzKCk7CisgICAgICAgICRhcmdzLT5yZWFkKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICRhcmdzLT50aGluZzsKKyAgICAgICAgJGV4cGVjdGVkID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdE5lc3QnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RNYXBSZWFkKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnQtPndyaXRlKAorICAgICAgICAgICAgVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0TWFwJ10KKyAgICAgICAgKTsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0TWFwX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnJlYWQoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJGFyZ3MtPnRoaW5nOworICAgICAgICAkZXhwZWN0ZWQgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0TWFwJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U3RyaW5nTWFwUmVhZCgpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKKyAgICAgICAgICAgIFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cmluZ01hcCddCisgICAgICAgICk7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFN0cmluZ01hcF9hcmdzKCk7CisgICAgICAgICRhcmdzLT5yZWFkKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICRhcmdzLT50aGluZzsKKyAgICAgICAgJGV4cGVjdGVkID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdFN0cmluZ01hcCddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFNldFJlYWQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydC0+d3JpdGUoCisgICAgICAgICAgICBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTZXQnXQorICAgICAgICApOworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RTZXRfYXJncygpOworICAgICAgICAkYXJncy0+cmVhZCgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkYXJncy0+dGhpbmc7CisgICAgICAgICRleHBlY3RlZCA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RTZXQnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RMaXN0UmVhZCgpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKKyAgICAgICAgICAgIFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdExpc3QnXQorICAgICAgICApOworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RMaXN0X2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnJlYWQoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJGFyZ3MtPnRoaW5nOworICAgICAgICAkZXhwZWN0ZWQgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0TGlzdCddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdEVudW1SZWFkKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnQtPndyaXRlKAorICAgICAgICAgICAgVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0RW51bSddCisgICAgICAgICk7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdEVudW1fYXJncygpOworICAgICAgICAkYXJncy0+cmVhZCgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkYXJncy0+dGhpbmc7CisgICAgICAgICRleHBlY3RlZCA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RFbnVtJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0VHlwZWRlZlJlYWQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydC0+d3JpdGUoCisgICAgICAgICAgICBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RUeXBlZGVmJ10KKyAgICAgICAgKTsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0VHlwZWRlZl9hcmdzKCk7CisgICAgICAgICRhcmdzLT5yZWFkKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICRhcmdzLT50aGluZzsKKyAgICAgICAgJGV4cGVjdGVkID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdFR5cGVkZWYnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RNYXBNYXBSZWFkKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnQtPndyaXRlKAorICAgICAgICAgICAgVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0TWFwTWFwJ10KKyAgICAgICAgKTsKKyAgICAgICAgJHJlc3VsdCA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RNYXBNYXBfcmVzdWx0KCk7CisgICAgICAgICRyZXN1bHQtPnJlYWQoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHJlc3VsdC0+c3VjY2VzczsKKyAgICAgICAgJGV4cGVjdGVkID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdE1hcE1hcEV4cGVjdGVkUmVzdWx0J107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0SW5zYW5pdHlSZWFkKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnQtPndyaXRlKAorICAgICAgICAgICAgVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0SW5zYW5pdHknXQorICAgICAgICApOworICAgICAgICAkcmVzdWx0ID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdEluc2FuaXR5X3Jlc3VsdCgpOworICAgICAgICAkcmVzdWx0LT5yZWFkKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICRyZXN1bHQtPnN1Y2Nlc3M7CisgICAgICAgICRleHBlY3RlZCA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RJbnNhbml0eUV4cGVjdGVkUmVzdWx0J107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvdGVzdC9Qcm90b2NvbC9UU2ltcGxlSlNPTlByb3RvY29sRml4dHVyZXMucGhwIGIvbGliL3BocC90ZXN0L1Byb3RvY29sL1RTaW1wbGVKU09OUHJvdG9jb2xGaXh0dXJlcy5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ3ZmQ4NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvdGVzdC9Qcm90b2NvbC9UU2ltcGxlSlNPTlByb3RvY29sRml4dHVyZXMucGhwCkBAIC0wLDAgKzEsNjcgQEAKKzw/cGhwCisKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRlc3QKKyAqLworCituYW1lc3BhY2UgdGVzdFxUaHJpZnRcUHJvdG9jb2w7CisKK2NsYXNzIFRTaW1wbGVKU09OUHJvdG9jb2xGaXh0dXJlcworeworICAgIHB1YmxpYyBzdGF0aWMgJHRlc3RBcmdzSlNPTiA9IGFycmF5KCk7CisKKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHBvcHVsYXRlVGVzdEFyZ3NTaW1wbGVKU09OKCkKKyAgICB7CisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RWb2lkJ10gPSAne30nOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJpbmcxJ10gPSAneyJ0aGluZyI6IkFmcmlrYWFucywgQWxlbWFubmlzY2gsIEFyYWdvblx1MDBlOXMsIFx1MDYyN1x1MDY0NFx1MDYzOVx1MDYzMVx1MDYyOFx1MDY0YVx1MDYyOSwgXHUwNjQ1XHUwNjM1XHUwNjMxXHUwNjQ5LCBBc3R1cmlhbnUsIEF5bWFyIGFydSwgQXpcdTAyNTlyYmF5Y2FuLCBcdTA0MTFcdTA0MzBcdTA0NDhcdTA0YTFcdTA0M2VcdTA0NDBcdTA0NDIsIEJvYXJpc2NoLCBcdTAxN2RlbWFpdFx1MDExN1x1MDE2MWthLCBcdTA0MTFcdTA0MzVcdTA0M2JcdTA0MzBcdTA0NDBcdTA0NDNcdTA0NDFcdTA0M2FcdTA0MzBcdTA0NGYsIFx1MDQxMVx1MDQzNVx1MDQzYlx1MDQzMFx1MDQ0MFx1MDQ0M1x1MDQ0MVx1MDQzYVx1MDQzMFx1MDQ0ZiAoXHUwNDQyXHUwNDMwXHUwNDQwXHUwNDMwXHUwNDQ4XHUwNDNhXHUwNDM1XHUwNDMyXHUwNDU2XHUwNDQ2XHUwNDMwKSwgXHUwNDExXHUwNDRhXHUwNDNiXHUwNDMzXHUwNDMwXHUwNDQwXHUwNDQxXHUwNDNhXHUwNDM4LCBCYW1hbmFua2FuLCBcdTA5YWNcdTA5YmVcdTA5ODJcdTA5YjJcdTA5YmUsIEJyZXpob25lZywgQm9zYW5za2ksIENhdGFsXHUwMGUwLCBNXHUwMGVjbmctZFx1MDExNVx1MDMyNG5nLW5nXHUxZTczXHUwMzA0LCBcdTA0MWRcdTA0M2VcdTA0NDVcdTA0NDdcdTA0MzhcdTA0MzlcdTA0M2QsIENlYnVhbm8sIFx1MTNlM1x1MTNiM1x1MTNhOSwgXHUwMTBjZXNreSwgXHUwNDIxXHUwNDNiXHUwNDNlXHUwNDMyXHUwNDYzXHUwMzAxXHUwNDNkXHUwNDRjXHUwNDQxXHUwNDNhXHUwNDRhIFwvIFx1MmMxNFx1MmMwZVx1MmMxMVx1MmMwMlx1MmMyMVx1MmMxMFx1MmMyMFx1MmMxNFx1MmMwZFx1MmMxZiwgXHUwNDI3XHUwNGQxXHUwNDMyXHUwNDMwXHUwNDQ4XHUwNDNiXHUwNDMwLCBDeW1yYWVnLCBEYW5zaywgWmF6YWtpLCBcdTA3OGJcdTA3YThcdTA3ODhcdTA3YWNcdTA3ODBcdTA3YThcdTA3ODRcdTA3YTZcdTA3OTBcdTA3YjAsIFx1MDM5NVx1MDNiYlx1MDNiYlx1MDNiN1x1MDNiZFx1MDNiOVx1MDNiYVx1MDNhYywgRW1pbGlcdTAwZTBuIGUgcnVtYWduXHUwMGYybCwgRW5nbGlzaCwgRXNwZXJhbnRvLCBFc3BhXHUwMGYxb2wsIEVlc3RpLCBFdXNrYXJhLCBcdTA2NDFcdTA2MjdcdTA2MzFcdTA2MzNcdTA2Y2MsIFN1b21pLCBWXHUwMGY1cm8sIEZcdTAwZjhyb3lza3QsIEZyYW5cdTAwZTdhaXMsIEFycGV0YW4sIEZ1cmxhbiwgRnJ5c2ssIEdhZWlsZ2UsIFx1OGQxYlx1OGE5ZSwgR1x1MDBlMGlkaGxpZywgR2FsZWdvLCBBdmFcdTAwZjFlXCdcdTFlYmQsIFx1MGE5N1x1MGFjMVx1MGE5Y1x1MGFiMFx1MGFiZVx1MGFhNFx1MGFjMCwgR2FlbGcsIFx1MDVlMlx1MDVkMVx1MDVlOFx1MDVkOVx1MDVlYSwgXHUwOTM5XHUwOTNmXHUwOTI4XHUwOTRkXHUwOTI2XHUwOTQwLCBGaWppIEhpbmRpLCBIcnZhdHNraSwgS3JleVx1MDBmMmwgYXlpc3llbiwgTWFneWFyLCBcdTA1NDBcdTA1NjFcdTA1NzVcdTA1NjVcdTA1ODBcdTA1NjVcdTA1NzYsIEludGVybGluZ3VhLCBCYWhhc2EgSW5kb25lc2lhLCBJbG9rYW5vLCBJZG8sIFx1MDBjZHNsZW5za2EsIEl0YWxpYW5vLCBcdTY1ZTVcdTY3MmNcdThhOWUsIExvamJhbiwgQmFzYSBKYXdhLCBcdTEwZTVcdTEwZDBcdTEwZTBcdTEwZDdcdTEwZTNcdTEwZGFcdTEwZDgsIEtvbmdvLCBLYWxhYWxsaXN1dCwgXHUwYzk1XHUwY2E4XHUwY2NkXHUwY2E4XHUwY2ExLCBcdWQ1NWNcdWFkNmRcdWM1YjQsIFx1MDQxYVx1MDQ0YVx1MDQzMFx1MDQ0MFx1MDQzMFx1MDQ0N1x1MDQzMFx1MDQzOS1cdTA0MWNcdTA0MzBcdTA0M2JcdTA0M2FcdTA0NGFcdTA0MzBcdTA0NDAsIFJpcG9hcmlzY2gsIEt1cmRcdTAwZWUsIFx1MDQxYVx1MDQzZVx1MDQzY1x1MDQzOCwgS2VybmV3ZWssIFx1MDQxYVx1MDQ0Ylx1MDQ0MFx1MDQzM1x1MDQ0Ylx1MDQzN1x1MDQ0N1x1MDQzMCwgTGF0aW5hLCBMYWRpbm8sIExcdTAwZWJ0emVidWVyZ2VzY2gsIExpbWJ1cmdzLCBMaW5nXHUwMGUxbGEsIFx1MGVhNVx1MGViMlx1MGVhNywgTGlldHV2aVx1MDE3MywgTGF0dmllXHUwMTYxdSwgQmFzYSBCYW55dW1hc2FuLCBNYWxhZ2FzeSwgXHUwNDFjXHUwNDMwXHUwNDNhXHUwNDM1XHUwNDM0XHUwNDNlXHUwNDNkXHUwNDQxXHUwNDNhXHUwNDM4LCBcdTBkMmVcdTBkMzJcdTBkMmZcdTBkM2VcdTBkMzNcdTBkMDIsIFx1MDkyZVx1MDkzMFx1MDkzZVx1MDkyMFx1MDk0MCwgQmFoYXNhIE1lbGF5dSwgXHUwNjQ1XHUwNjI3XHUwNjMyXHUwNjUwXHUwNjMxXHUwNjQ4XHUwNjQ2XHUwNmNjLCBObmFwdWxpdGFubywgTmVkZXJzYWtzaXNjaCwgXHUwOTI4XHUwOTQ3XHUwOTJhXHUwOTNlXHUwOTMyIFx1MDkyZFx1MDkzZVx1MDkzN1x1MDkzZSwgTmVkZXJsYW5kcywgXHUyMDJhTm9yc2sgKG55bm9yc2spXHUyMDJjLCBcdTIwMmFOb3JzayAoYm9rbVx1MDBlNWwpXHUyMDJjLCBOb3Vvcm1hbmQsIERpblx1MDBlOSBiaXphYWQsIE9jY2l0YW4sIFx1MDQxOFx1MDQ0MFx1MDQzZVx1MDQzZFx1MDQzMFx1MDQ0MywgUGFwaWFtZW50dSwgRGVpdHNjaCwgTm9yZnVrIFwvIFBpdGtlcm4sIFBvbHNraSwgXHUwNjdlXHUwNjQ2XHUwNjJjXHUwNjI3XHUwNjI4XHUwNmNjLCBcdTA2N2VcdTA2OWFcdTA2MmFcdTA2NDgsIFBvcnR1Z3VcdTAwZWFzLCBSdW5hIFNpbWksIFJ1bWFudHNjaCwgUm9tYW5pLCBSb21cdTAwZTJuXHUwMTAzLCBcdTA0MjBcdTA0NDNcdTA0NDFcdTA0NDFcdTA0M2FcdTA0MzhcdTA0MzksIFx1MDQyMVx1MDQzMFx1MDQ0NVx1MDQzMCBcdTA0NDJcdTA0NGJcdTA0M2JcdTA0MzAsIFNhcmR1LCBTaWNpbGlhbnUsIFNjb3RzLCBTXHUwMGUxbWVnaWVsbGEsIFNpbXBsZSBFbmdsaXNoLCBTbG92ZW5cdTAxMGRpbmEsIFNsb3Zlblx1MDE2MVx1MDEwZGluYSwgXHUwNDIxXHUwNDQwXHUwNDNmXHUwNDQxXHUwNDNhXHUwNDM4IFwvIFNycHNraSwgU2VlbHRlcnNrLCBTdmVuc2thLCBLaXN3YWhpbGksIFx1MGJhNFx1MGJhZVx1MGJiZlx1MGJiNFx1MGJjZCwgXHUwYzI0XHUwYzQ2XHUwYzMyXHUwYzQxXHUwYzE3XHUwYzQxLCBcdTA0MjJcdTA0M2VcdTA0YjdcdTA0MzhcdTA0M2FcdTA0ZTMsIFx1MGU0NFx1MGUxN1x1MGUyMiwgVFx1MDBmY3JrbWVuXHUwMGU3ZSwgVGFnYWxvZywgVFx1MDBmY3JrXHUwMGU3ZSwgXHUwNDIyXHUwNDMwXHUwNDQyXHUwNDMwXHUwNDQwXHUwNDQ3XHUwNDMwXC9UYXRhclx1MDBlN2EsIFx1MDQyM1x1MDQzYVx1MDQ0MFx1MDQzMFx1MDQ1N1x1MDQzZFx1MDQ0MVx1MDQ0Y1x1MDQzYVx1MDQzMCwgXHUwNjI3XHUwNjMxXHUwNjJmXHUwNjQ4LCBUaVx1MWViZm5nIFZpXHUxZWM3dCwgVm9sYXBcdTAwZmNrLCBXYWxvbiwgV2luYXJheSwgXHU1NDM0XHU4YmVkLCBpc2lYaG9zYSwgXHUwNWQ5XHUwNWQ5XHUwNWI0XHUwNWQzXHUwNWQ5XHUwNWU5LCBZb3JcdTAwZjliXHUwMGUxLCBaZVx1MDBlYXV3cywgXHU0ZTJkXHU2NTg3LCBCXHUwMGUybi1sXHUwMGUybS1nXHUwMGZhLCBcdTdjYjVcdThhOWUifSc7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cmluZzInXSA9ICd7InRoaW5nIjoicXVvdGU6IFxcXFxcIiBiYWNrc2xhc2g6IGZvcndhcmRzbGFzaC1lc2NhcGVkOiBcXFxcXC8gIGJhY2tzcGFjZTogXFxcXGIgZm9ybWZlZWQ6IFxmIG5ld2xpbmU6IFxuIHJldHVybjogXHIgdGFiOiAgbm93LWFsbC1vZi10aGVtLXRvZ2V0aGVyOiBcIlxcXFxcXFxcXC9cXFxcYlxuXHJcdCBub3ctYS1idW5jaC1vZi1qdW5rOiAhQCMkJSYoKSgmJSQje317fTw+PD48In0nOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3REb3VibGUnXSA9ICd7InRoaW5nIjozLjE0MTU5MjY1MzU4OTh9JzsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0Qnl0ZSddID0gJ3sidGhpbmciOjF9JzsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0STMyJ10gPSAneyJ0aGluZyI6MTA3Mzc0MTgyNH0nOworCisgICAgICAgIGlmIChQSFBfSU5UX1NJWkUgPT0gOCkgeworICAgICAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdEk2NCddID0gJ3sidGhpbmciOicgLiBwb3coMiwgNjApIC4gJ30nOworICAgICAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cnVjdCddID0gJ3sidGhpbmciOnsic3RyaW5nX3RoaW5nIjoid29ya2VkIiwiYnl0ZV90aGluZyI6MSwiaTMyX3RoaW5nIjoxMDczNzQxODI0LCJpNjRfdGhpbmciOicgLiBwb3coMiwgNjApIC4gJ319JzsKKyAgICAgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3ROZXN0J10gPSAneyJ0aGluZyI6eyJieXRlX3RoaW5nIjoxLCJzdHJ1Y3RfdGhpbmciOnsic3RyaW5nX3RoaW5nIjoid29ya2VkIiwiYnl0ZV90aGluZyI6MSwiaTMyX3RoaW5nIjoxMDczNzQxODI0LCJpNjRfdGhpbmciOicgLiBwb3coMiwgNjApIC4gJ30sImkzMl90aGluZyI6MzI3Njh9fSc7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0STY0J10gPSAneyJ0aGluZyI6MTE1MjkyMTUwNDYwNjg0NzAwMH0nOworCisgICAgICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RydWN0J10gPSAneyJ0aGluZyI6eyJzdHJpbmdfdGhpbmciOiJ3b3JrZWQiLCJieXRlX3RoaW5nIjoxLCJpMzJfdGhpbmciOjEwNzM3NDE4MjQsImk2NF90aGluZyI6MTE1MjkyMTUwNDYwNjg0NzAwMH19JzsKKyAgICAgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3ROZXN0J10gPSAneyJ0aGluZyI6eyJieXRlX3RoaW5nIjoxLCJzdHJ1Y3RfdGhpbmciOnsic3RyaW5nX3RoaW5nIjoid29ya2VkIiwiYnl0ZV90aGluZyI6MSwiaTMyX3RoaW5nIjoxMDczNzQxODI0LCJpNjRfdGhpbmciOjExNTI5MjE1MDQ2MDY4NDcwMDB9LCJpMzJfdGhpbmciOjMyNzY4fX0nOworICAgICAgICB9CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdE1hcCddID0gJ3sidGhpbmciOnsiNyI6NzcsIjgiOjg4LCI5Ijo5OX19JzsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RyaW5nTWFwJ10gPSAneyJ0aGluZyI6eyJhIjoiMTIzIiwiYSBiIjoid2l0aCBzcGFjZXMgIiwic2FtZSI6InNhbWUiLCIwIjoibnVtZXJpYyBrZXkiLCJsb25nVmFsdWUiOiJBZnJpa2FhbnMsIEFsZW1hbm5pc2NoLCBBcmFnb25cdTAwZTlzLCBcdTA2MjdcdTA2NDRcdTA2MzlcdTA2MzFcdTA2MjhcdTA2NGFcdTA2MjksIFx1MDY0NVx1MDYzNVx1MDYzMVx1MDY0OSwgQXN0dXJpYW51LCBBeW1hciBhcnUsIEF6XHUwMjU5cmJheWNhbiwgXHUwNDExXHUwNDMwXHUwNDQ4XHUwNGExXHUwNDNlXHUwNDQwXHUwNDQyLCBCb2FyaXNjaCwgXHUwMTdkZW1haXRcdTAxMTdcdTAxNjFrYSwgXHUwNDExXHUwNDM1XHUwNDNiXHUwNDMwXHUwNDQwXHUwNDQzXHUwNDQxXHUwNDNhXHUwNDMwXHUwNDRmLCBcdTA0MTFcdTA0MzVcdTA0M2JcdTA0MzBcdTA0NDBcdTA0NDNcdTA0NDFcdTA0M2FcdTA0MzBcdTA0NGYgKFx1MDQ0Mlx1MDQzMFx1MDQ0MFx1MDQzMFx1MDQ0OFx1MDQzYVx1MDQzNVx1MDQzMlx1MDQ1Nlx1MDQ0Nlx1MDQzMCksIFx1MDQxMVx1MDQ0YVx1MDQzYlx1MDQzM1x1MDQzMFx1MDQ0MFx1MDQ0MVx1MDQzYVx1MDQzOCwgQmFtYW5hbmthbiwgXHUwOWFjXHUwOWJlXHUwOTgyXHUwOWIyXHUwOWJlLCBCcmV6aG9uZWcsIEJvc2Fuc2tpLCBDYXRhbFx1MDBlMCwgTVx1MDBlY25nLWRcdTAxMTVcdTAzMjRuZy1uZ1x1MWU3M1x1MDMwNCwgXHUwNDFkXHUwNDNlXHUwNDQ1XHUwNDQ3XHUwNDM4XHUwNDM5XHUwNDNkLCBDZWJ1YW5vLCBcdTEzZTNcdTEzYjNcdTEzYTksIFx1MDEwY2Vza3ksIFx1MDQyMVx1MDQzYlx1MDQzZVx1MDQzMlx1MDQ2M1x1MDMwMVx1MDQzZFx1MDQ0Y1x1MDQ0MVx1MDQzYVx1MDQ0YSBcLyBcdTJjMTRcdTJjMGVcdTJjMTFcdTJjMDJcdTJjMjFcdTJjMTBcdTJjMjBcdTJjMTRcdTJjMGRcdTJjMWYsIFx1MDQyN1x1MDRkMVx1MDQzMlx1MDQzMFx1MDQ0OFx1MDQzYlx1MDQzMCwgQ3ltcmFlZywgRGFuc2ssIFphemFraSwgXHUwNzhiXHUwN2E4XHUwNzg4XHUwN2FjXHUwNzgwXHUwN2E4XHUwNzg0XHUwN2E2XHUwNzkwXHUwN2IwLCBcdTAzOTVcdTAzYmJcdTAzYmJcdTAzYjdcdTAzYmRcdTAzYjlcdTAzYmFcdTAzYWMsIEVtaWxpXHUwMGUwbiBlIHJ1bWFnblx1MDBmMmwsIEVuZ2xpc2gsIEVzcGVyYW50bywgRXNwYVx1MDBmMW9sLCBFZXN0aSwgRXVza2FyYSwgXHUwNjQxXHUwNjI3XHUwNjMxXHUwNjMzXHUwNmNjLCBTdW9taSwgVlx1MDBmNXJvLCBGXHUwMGY4cm95c2t0LCBGcmFuXHUwMGU3YWlzLCBBcnBldGFuLCBGdXJsYW4sIEZyeXNrLCBHYWVpbGdlLCBcdThkMWJcdThhOWUsIEdcdTAwZTBpZGhsaWcsIEdhbGVnbywgQXZhXHUwMGYxZVwnXHUxZWJkLCBcdTBhOTdcdTBhYzFcdTBhOWNcdTBhYjBcdTBhYmVcdTBhYTRcdTBhYzAsIEdhZWxnLCBcdTA1ZTJcdTA1ZDFcdTA1ZThcdTA1ZDlcdTA1ZWEsIFx1MDkzOVx1MDkzZlx1MDkyOFx1MDk0ZFx1MDkyNlx1MDk0MCwgRmlqaSBIaW5kaSwgSHJ2YXRza2ksIEtyZXlcdTAwZjJsIGF5aXN5ZW4sIE1hZ3lhciwgXHUwNTQwXHUwNTYxXHUwNTc1XHUwNTY1XHUwNTgwXHUwNTY1XHUwNTc2LCBJbnRlcmxpbmd1YSwgQmFoYXNhIEluZG9uZXNpYSwgSWxva2FubywgSWRvLCBcdTAwY2RzbGVuc2thLCBJdGFsaWFubywgXHU2NWU1XHU2NzJjXHU4YTllLCBMb2piYW4sIEJhc2EgSmF3YSwgXHUxMGU1XHUxMGQwXHUxMGUwXHUxMGQ3XHUxMGUzXHUxMGRhXHUxMGQ4LCBLb25nbywgS2FsYWFsbGlzdXQsIFx1MGM5NVx1MGNhOFx1MGNjZFx1MGNhOFx1MGNhMSwgXHVkNTVjXHVhZDZkXHVjNWI0LCBcdTA0MWFcdTA0NGFcdTA0MzBcdTA0NDBcdTA0MzBcdTA0NDdcdTA0MzBcdTA0MzktXHUwNDFjXHUwNDMwXHUwNDNiXHUwNDNhXHUwNDRhXHUwNDMwXHUwNDQwLCBSaXBvYXJpc2NoLCBLdXJkXHUwMGVlLCBcdTA0MWFcdTA0M2VcdTA0M2NcdTA0MzgsIEtlcm5ld2VrLCBcdTA0MWFcdTA0NGJcdTA0NDBcdTA0MzNcdTA0NGJcdTA0MzdcdTA0NDdcdTA0MzAsIExhdGluYSwgTGFkaW5vLCBMXHUwMGVidHplYnVlcmdlc2NoLCBMaW1idXJncywgTGluZ1x1MDBlMWxhLCBcdTBlYTVcdTBlYjJcdTBlYTcsIExpZXR1dmlcdTAxNzMsIExhdHZpZVx1MDE2MXUsIEJhc2EgQmFueXVtYXNhbiwgTWFsYWdhc3ksIFx1MDQxY1x1MDQzMFx1MDQzYVx1MDQzNVx1MDQzNFx1MDQzZVx1MDQzZFx1MDQ0MVx1MDQzYVx1MDQzOCwgXHUwZDJlXHUwZDMyXHUwZDJmXHUwZDNlXHUwZDMzXHUwZDAyLCBcdTA5MmVcdTA5MzBcdTA5M2VcdTA5MjBcdTA5NDAsIEJhaGFzYSBNZWxheXUsIFx1MDY0NVx1MDYyN1x1MDYzMlx1MDY1MFx1MDYzMVx1MDY0OFx1MDY0Nlx1MDZjYywgTm5hcHVsaXRhbm8sIE5lZGVyc2Frc2lzY2gsIFx1MDkyOFx1MDk0N1x1MDkyYVx1MDkzZVx1MDkzMiBcdTA5MmRcdTA5M2VcdTA5MzdcdTA5M2UsIE5lZGVybGFuZHMsIFx1MjAyYU5vcnNrIChueW5vcnNrKVx1MjAyYywgXHUyMDJhTm9yc2sgKGJva21cdTAwZTVsKVx1MjAyYywgTm91b3JtYW5kLCBEaW5cdTAwZTkgYml6YWFkLCBPY2NpdGFuLCBcdTA0MThcdTA0NDBcdTA0M2VcdTA0M2RcdTA0MzBcdTA0NDMsIFBhcGlhbWVudHUsIERlaXRzY2gsIE5vcmZ1ayBcLyBQaXRrZXJuLCBQb2xza2ksIFx1MDY3ZVx1MDY0Nlx1MDYyY1x1MDYyN1x1MDYyOFx1MDZjYywgXHUwNjdlXHUwNjlhXHUwNjJhXHUwNjQ4LCBQb3J0dWd1XHUwMGVhcywgUnVuYSBTaW1pLCBSdW1hbnRzY2gsIFJvbWFuaSwgUm9tXHUwMGUyblx1MDEwMywgXHUwNDIwXHUwNDQzXHUwNDQxXHUwNDQxXHUwNDNhXHUwNDM4XHUwNDM5LCBcdTA0MjFcdTA0MzBcdTA0NDVcdTA0MzAgXHUwNDQyXHUwNDRiXHUwNDNiXHUwNDMwLCBTYXJkdSwgU2ljaWxpYW51LCBTY290cywgU1x1MDBlMW1lZ2llbGxhLCBTaW1wbGUgRW5nbGlzaCwgU2xvdmVuXHUwMTBkaW5hLCBTbG92ZW5cdTAxNjFcdTAxMGRpbmEsIFx1MDQyMVx1MDQ0MFx1MDQzZlx1MDQ0MVx1MDQzYVx1MDQzOCBcLyBTcnBza2ksIFNlZWx0ZXJzaywgU3ZlbnNrYSwgS2lzd2FoaWxpLCBcdTBiYTRcdTBiYWVcdTBiYmZcdTBiYjRcdTBiY2QsIFx1MGMyNFx1MGM0Nlx1MGMzMlx1MGM0MVx1MGMxN1x1MGM0MSwgXHUwNDIyXHUwNDNlXHUwNGI3XHUwNDM4XHUwNDNhXHUwNGUzLCBcdTBlNDRcdTBlMTdcdTBlMjIsIFRcdTAwZmNya21lblx1MDBlN2UsIFRhZ2Fsb2csIFRcdTAwZmNya1x1MDBlN2UsIFx1MDQyMlx1MDQzMFx1MDQ0Mlx1MDQzMFx1MDQ0MFx1MDQ0N1x1MDQzMFwvVGF0YXJcdTAwZTdhLCBcdTA0MjNcdTA0M2FcdTA0NDBcdTA0MzBcdTA0NTdcdTA0M2RcdTA0NDFcdTA0NGNcdTA0M2FcdTA0MzAsIFx1MDYyN1x1MDYzMVx1MDYyZlx1MDY0OCwgVGlcdTFlYmZuZyBWaVx1MWVjN3QsIFZvbGFwXHUwMGZjaywgV2Fsb24sIFdpbmFyYXksIFx1NTQzNFx1OGJlZCwgaXNpWGhvc2EsIFx1MDVkOVx1MDVkOVx1MDViNFx1MDVkM1x1MDVkOVx1MDVlOSwgWW9yXHUwMGY5Ylx1MDBlMSwgWmVcdTAwZWF1d3MsIFx1NGUyZFx1NjU4NywgQlx1MDBlMm4tbFx1MDBlMm0tZ1x1MDBmYSwgXHU3Y2I1XHU4YTllIiwiQWZyaWthYW5zLCBBbGVtYW5uaXNjaCwgQXJhZ29uXHUwMGU5cywgXHUwNjI3XHUwNjQ0XHUwNjM5XHUwNjMxXHUwNjI4XHUwNjRhXHUwNjI5LCBcdTA2NDVcdTA2MzVcdTA2MzFcdTA2NDksIEFzdHVyaWFudSwgQXltYXIgYXJ1LCBBelx1MDI1OXJiYXljYW4sIFx1MDQxMVx1MDQzMFx1MDQ0OFx1MDRhMVx1MDQzZVx1MDQ0MFx1MDQ0MiwgQm9hcmlzY2gsIFx1MDE3ZGVtYWl0XHUwMTE3XHUwMTYxa2EsIFx1MDQxMVx1MDQzNVx1MDQzYlx1MDQzMFx1MDQ0MFx1MDQ0M1x1MDQ0MVx1MDQzYVx1MDQzMFx1MDQ0ZiwgXHUwNDExXHUwNDM1XHUwNDNiXHUwNDMwXHUwNDQwXHUwNDQzXHUwNDQxXHUwNDNhXHUwNDMwXHUwNDRmIChcdTA0NDJcdTA0MzBcdTA0NDBcdTA0MzBcdTA0NDhcdTA0M2FcdTA0MzVcdTA0MzJcdTA0NTZcdTA0NDZcdTA0MzApLCBcdTA0MTFcdTA0NGFcdTA0M2JcdTA0MzNcdTA0MzBcdTA0NDBcdTA0NDFcdTA0M2FcdTA0MzgsIEJhbWFuYW5rYW4sIFx1MDlhY1x1MDliZVx1MDk4Mlx1MDliMlx1MDliZSwgQnJlemhvbmVnLCBCb3NhbnNraSwgQ2F0YWxcdTAwZTAsIE1cdTAwZWNuZy1kXHUwMTE1XHUwMzI0bmctbmdcdTFlNzNcdTAzMDQsIFx1MDQxZFx1MDQzZVx1MDQ0NVx1MDQ0N1x1MDQzOFx1MDQzOVx1MDQzZCwgQ2VidWFubywgXHUxM2UzXHUxM2IzXHUxM2E5LCBcdTAxMGNlc2t5LCBcdTA0MjFcdTA0M2JcdTA0M2VcdTA0MzJcdTA0NjNcdTAzMDFcdTA0M2RcdTA0NGNcdTA0NDFcdTA0M2FcdTA0NGEgXC8gXHUyYzE0XHUyYzBlXHUyYzExXHUyYzAyXHUyYzIxXHUyYzEwXHUyYzIwXHUyYzE0XHUyYzBkXHUyYzFmLCBcdTA0MjdcdTA0ZDFcdTA0MzJcdTA0MzBcdTA0NDhcdTA0M2JcdTA0MzAsIEN5bXJhZWcsIERhbnNrLCBaYXpha2ksIFx1MDc4Ylx1MDdhOFx1MDc4OFx1MDdhY1x1MDc4MFx1MDdhOFx1MDc4NFx1MDdhNlx1MDc5MFx1MDdiMCwgXHUwMzk1XHUwM2JiXHUwM2JiXHUwM2I3XHUwM2JkXHUwM2I5XHUwM2JhXHUwM2FjLCBFbWlsaVx1MDBlMG4gZSBydW1hZ25cdTAwZjJsLCBFbmdsaXNoLCBFc3BlcmFudG8sIEVzcGFcdTAwZjFvbCwgRWVzdGksIEV1c2thcmEsIFx1MDY0MVx1MDYyN1x1MDYzMVx1MDYzM1x1MDZjYywgU3VvbWksIFZcdTAwZjVybywgRlx1MDBmOHJveXNrdCwgRnJhblx1MDBlN2FpcywgQXJwZXRhbiwgRnVybGFuLCBGcnlzaywgR2FlaWxnZSwgXHU4ZDFiXHU4YTllLCBHXHUwMGUwaWRobGlnLCBHYWxlZ28sIEF2YVx1MDBmMWVcJ1x1MWViZCwgXHUwYTk3XHUwYWMxXHUwYTljXHUwYWIwXHUwYWJlXHUwYWE0XHUwYWMwLCBHYWVsZywgXHUwNWUyXHUwNWQxXHUwNWU4XHUwNWQ5XHUwNWVhLCBcdTA5MzlcdTA5M2ZcdTA5MjhcdTA5NGRcdTA5MjZcdTA5NDAsIEZpamkgSGluZGksIEhydmF0c2tpLCBLcmV5XHUwMGYybCBheWlzeWVuLCBNYWd5YXIsIFx1MDU0MFx1MDU2MVx1MDU3NVx1MDU2NVx1MDU4MFx1MDU2NVx1MDU3NiwgSW50ZXJsaW5ndWEsIEJhaGFzYSBJbmRvbmVzaWEsIElsb2thbm8sIElkbywgXHUwMGNkc2xlbnNrYSwgSXRhbGlhbm8sIFx1NjVlNVx1NjcyY1x1OGE5ZSwgTG9qYmFuLCBCYXNhIEphd2EsIFx1MTBlNVx1MTBkMFx1MTBlMFx1MTBkN1x1MTBlM1x1MTBkYVx1MTBkOCwgS29uZ28sIEthbGFhbGxpc3V0LCBcdTBjOTVcdTBjYThcdTBjY2RcdTBjYThcdTBjYTEsIFx1ZDU1Y1x1YWQ2ZFx1YzViNCwgXHUwNDFhXHUwNDRhXHUwNDMwXHUwNDQwXHUwNDMwXHUwNDQ3XHUwNDMwXHUwNDM5LVx1MDQxY1x1MDQzMFx1MDQzYlx1MDQzYVx1MDQ0YVx1MDQzMFx1MDQ0MCwgUmlwb2FyaXNjaCwgS3VyZFx1MDBlZSwgXHUwNDFhXHUwNDNlXHUwNDNjXHUwNDM4LCBLZXJuZXdlaywgXHUwNDFhXHUwNDRiXHUwNDQwXHUwNDMzXHUwNDRiXHUwNDM3XHUwNDQ3XHUwNDMwLCBMYXRpbmEsIExhZGlubywgTFx1MDBlYnR6ZWJ1ZXJnZXNjaCwgTGltYnVyZ3MsIExpbmdcdTAwZTFsYSwgXHUwZWE1XHUwZWIyXHUwZWE3LCBMaWV0dXZpXHUwMTczLCBMYXR2aWVcdTAxNjF1LCBCYXNhIEJhbnl1bWFzYW4sIE1hbGFnYXN5LCBcdTA0MWNcdTA0MzBcdTA0M2FcdTA0MzVcdTA0MzRcdTA0M2VcdTA0M2RcdTA0NDFcdTA0M2FcdTA0MzgsIFx1MGQyZVx1MGQzMlx1MGQyZlx1MGQzZVx1MGQzM1x1MGQwMiwgXHUwOTJlXHUwOTMwXHUwOTNlXHUwOTIwXHUwOTQwLCBCYWhhc2EgTWVsYXl1LCBcdTA2NDVcdTA2MjdcdTA2MzJcdTA2NTBcdTA2MzFcdTA2NDhcdTA2NDZcdTA2Y2MsIE5uYXB1bGl0YW5vLCBOZWRlcnNha3Npc2NoLCBcdTA5MjhcdTA5NDdcdTA5MmFcdTA5M2VcdTA5MzIgXHUwOTJkXHUwOTNlXHUwOTM3XHUwOTNlLCBOZWRlcmxhbmRzLCBcdTIwMmFOb3JzayAobnlub3JzaylcdTIwMmMsIFx1MjAyYU5vcnNrIChib2ttXHUwMGU1bClcdTIwMmMsIE5vdW9ybWFuZCwgRGluXHUwMGU5IGJpemFhZCwgT2NjaXRhbiwgXHUwNDE4XHUwNDQwXHUwNDNlXHUwNDNkXHUwNDMwXHUwNDQzLCBQYXBpYW1lbnR1LCBEZWl0c2NoLCBOb3JmdWsgXC8gUGl0a2VybiwgUG9sc2tpLCBcdTA2N2VcdTA2NDZcdTA2MmNcdTA2MjdcdTA2MjhcdTA2Y2MsIFx1MDY3ZVx1MDY5YVx1MDYyYVx1MDY0OCwgUG9ydHVndVx1MDBlYXMsIFJ1bmEgU2ltaSwgUnVtYW50c2NoLCBSb21hbmksIFJvbVx1MDBlMm5cdTAxMDMsIFx1MDQyMFx1MDQ0M1x1MDQ0MVx1MDQ0MVx1MDQzYVx1MDQzOFx1MDQzOSwgXHUwNDIxXHUwNDMwXHUwNDQ1XHUwNDMwIFx1MDQ0Mlx1MDQ0Ylx1MDQzYlx1MDQzMCwgU2FyZHUsIFNpY2lsaWFudSwgU2NvdHMsIFNcdTAwZTFtZWdpZWxsYSwgU2ltcGxlIEVuZ2xpc2gsIFNsb3Zlblx1MDEwZGluYSwgU2xvdmVuXHUwMTYxXHUwMTBkaW5hLCBcdTA0MjFcdTA0NDBcdTA0M2ZcdTA0NDFcdTA0M2FcdTA0MzggXC8gU3Jwc2tpLCBTZWVsdGVyc2ssIFN2ZW5za2EsIEtpc3dhaGlsaSwgXHUwYmE0XHUwYmFlXHUwYmJmXHUwYmI0XHUwYmNkLCBcdTBjMjRcdTBjNDZcdTBjMzJcdTBjNDFcdTBjMTdcdTBjNDEsIFx1MDQyMlx1MDQzZVx1MDRiN1x1MDQzOFx1MDQzYVx1MDRlMywgXHUwZTQ0XHUwZTE3XHUwZTIyLCBUXHUwMGZjcmttZW5cdTAwZTdlLCBUYWdhbG9nLCBUXHUwMGZjcmtcdTAwZTdlLCBcdTA0MjJcdTA0MzBcdTA0NDJcdTA0MzBcdTA0NDBcdTA0NDdcdTA0MzBcL1RhdGFyXHUwMGU3YSwgXHUwNDIzXHUwNDNhXHUwNDQwXHUwNDMwXHUwNDU3XHUwNDNkXHUwNDQxXHUwNDRjXHUwNDNhXHUwNDMwLCBcdTA2MjdcdTA2MzFcdTA2MmZcdTA2NDgsIFRpXHUxZWJmbmcgVmlcdTFlYzd0LCBWb2xhcFx1MDBmY2ssIFdhbG9uLCBXaW5hcmF5LCBcdTU0MzRcdThiZWQsIGlzaVhob3NhLCBcdTA1ZDlcdTA1ZDlcdTA1YjRcdTA1ZDNcdTA1ZDlcdTA1ZTksIFlvclx1MDBmOWJcdTAwZTEsIFplXHUwMGVhdXdzLCBcdTRlMmRcdTY1ODcsIEJcdTAwZTJuLWxcdTAwZTJtLWdcdTAwZmEsIFx1N2NiNVx1OGE5ZSI6Imxvbmcga2V5In19JzsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0U2V0J10gPSAneyJ0aGluZyI6WzEsNSw2XX0nOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RMaXN0J10gPSAneyJ0aGluZyI6WzEsMiwzXX0nOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RFbnVtJ10gPSAneyJ0aGluZyI6MX0nOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RUeXBlZGVmJ10gPSAneyJ0aGluZyI6Njl9JzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL3Rlc3QvUHJvdG9jb2wvVFNpbXBsZUpTT05Qcm90b2NvbFRlc3QucGhwIGIvbGliL3BocC90ZXN0L1Byb3RvY29sL1RTaW1wbGVKU09OUHJvdG9jb2xUZXN0LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGExMzczCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC90ZXN0L1Byb3RvY29sL1RTaW1wbGVKU09OUHJvdG9jb2xUZXN0LnBocApAQCAtMCwwICsxLDI1NCBAQAorPD9waHAKKworLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQudGVzdAorICovCisKK25hbWVzcGFjZSBUZXN0XFRocmlmdFxQcm90b2NvbDsKKwordXNlIFBIUFVuaXRcRnJhbWV3b3JrXFRlc3RDYXNlOwordXNlIFRlc3RcVGhyaWZ0XEZpeHR1cmVzOwordXNlIFRocmlmdFxQcm90b2NvbFxUU2ltcGxlSlNPTlByb3RvY29sOwordXNlIFRocmlmdFxUcmFuc3BvcnRcVE1lbW9yeUJ1ZmZlcjsKKworcmVxdWlyZSBfX0RJUl9fIC4gJy8uLi8uLi8uLi8uLi92ZW5kb3IvYXV0b2xvYWQucGhwJzsKKworLyoqKgorICogVGhpcyB0ZXN0IHN1aXRlIGRlcGVuZHMgb24gcnVubmluZyB0aGUgY29tcGlsZXIgYWdhaW5zdCB0aGUKKyAqIHN0YW5kYXJkIFRocmlmdFRlc3QudGhyaWZ0IGZpbGU6CisgKgorICogbGliL3BocC90ZXN0JCAuLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC0tZ2VuIHBocCAtciBcCisgKiAgIC0tb3V0IC4vcGFja2FnZXMgLi4vLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorICoKKyAqIEBydW5UZXN0c0luU2VwYXJhdGVQcm9jZXNzZXMKKyAqLworY2xhc3MgVFNpbXBsZUpTT05Qcm90b2NvbFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZQoreworICAgIHByaXZhdGUgJHRyYW5zcG9ydDsKKyAgICBwcml2YXRlICRwcm90b2NvbDsKKworICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc2V0VXBCZWZvcmVDbGFzcygpCisgICAgeworCisgICAgICAgIC8qKiBAdmFyIFxDb21wb3NlclxBdXRvbG9hZFxDbGFzc0xvYWRlciAkbG9hZGVyICovCisgICAgICAgICRsb2FkZXIgPSByZXF1aXJlIF9fRElSX18gLiAnLy4uLy4uLy4uLy4uL3ZlbmRvci9hdXRvbG9hZC5waHAnOworICAgICAgICAkbG9hZGVyLT5hZGRQc3I0KCcnLCBfX0RJUl9fIC4gJy8uLi9wYWNrYWdlcy9waHAnKTsKKworICAgICAgICBGaXh0dXJlczo6cG9wdWxhdGVUZXN0QXJncygpOworICAgICAgICBUU2ltcGxlSlNPTlByb3RvY29sRml4dHVyZXM6OnBvcHVsYXRlVGVzdEFyZ3NTaW1wbGVKU09OKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHNldFVwKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnQgPSBuZXcgVE1lbW9yeUJ1ZmZlcigpOworICAgICAgICAkdGhpcy0+cHJvdG9jb2wgPSBuZXcgVFNpbXBsZUpTT05Qcm90b2NvbCgkdGhpcy0+dHJhbnNwb3J0KTsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydC0+b3BlbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdSSVRFIFRFU1RTCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RWb2lkV3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0Vm9pZF9hcmdzKCk7CisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRTaW1wbGVKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFZvaWQnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RTdHJpbmcxV3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0U3RyaW5nX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdFN0cmluZzEnXTsKKyAgICAgICAgJGFyZ3MtPndyaXRlKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoRml4dHVyZXM6OiRidWZzaXplKTsKKyAgICAgICAgJGV4cGVjdGVkID0gVFNpbXBsZUpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RyaW5nMSddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFN0cmluZzJXcml0ZSgpCisgICAgeworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RTdHJpbmdfYXJncygpOworICAgICAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0U3RyaW5nMiddOworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUU2ltcGxlSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJpbmcyJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0RG91YmxlV3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0RG91YmxlX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdERvdWJsZSddOworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUU2ltcGxlSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3REb3VibGUnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RCeXRlV3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0Qnl0ZV9hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RCeXRlJ107CisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRTaW1wbGVKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdEJ5dGUnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RJMzJXcml0ZSgpCisgICAgeworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RJMzJfYXJncygpOworICAgICAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0STMyJ107CisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRTaW1wbGVKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdEkzMiddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdEk2NFdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdEk2NF9hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RJNjQnXTsKKyAgICAgICAgJGFyZ3MtPndyaXRlKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoRml4dHVyZXM6OiRidWZzaXplKTsKKyAgICAgICAgJGV4cGVjdGVkID0gVFNpbXBsZUpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0STY0J107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U3RydWN0V3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0U3RydWN0X2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdFN0cnVjdCddOworCisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRTaW1wbGVKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cnVjdCddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdE5lc3RXcml0ZSgpCisgICAgeworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3ROZXN0X2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdE5lc3QnXTsKKworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUU2ltcGxlSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3ROZXN0J107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0TWFwV3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0TWFwX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdE1hcCddOworCisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRTaW1wbGVKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdE1hcCddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFN0cmluZ01hcFdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFN0cmluZ01hcF9hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RTdHJpbmdNYXAnXTsKKworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUU2ltcGxlSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJpbmdNYXAnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RTZXRXcml0ZSgpCisgICAgeworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RTZXRfYXJncygpOworICAgICAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0U2V0J107CisKKyAgICAgICAgJGFyZ3MtPndyaXRlKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoRml4dHVyZXM6OiRidWZzaXplKTsKKyAgICAgICAgJGV4cGVjdGVkID0gVFNpbXBsZUpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0U2V0J107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0TGlzdFdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdExpc3RfYXJncygpOworICAgICAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0TGlzdCddOworCisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRTaW1wbGVKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdExpc3QnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RFbnVtV3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0RW51bV9hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RFbnVtJ107CisKKyAgICAgICAgJGFyZ3MtPndyaXRlKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoRml4dHVyZXM6OiRidWZzaXplKTsKKyAgICAgICAgJGV4cGVjdGVkID0gVFNpbXBsZUpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0RW51bSddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFR5cGVkZWZXcml0ZSgpCisgICAgeworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RUeXBlZGVmX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdFR5cGVkZWYnXTsKKworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUU2ltcGxlSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RUeXBlZGVmJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvdGVzdC9UZXN0L1RocmlmdC9GaXh0dXJlcy5waHAgYi9saWIvcGhwL3Rlc3QvVGVzdC9UaHJpZnQvRml4dHVyZXMucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjg2ZjU5Li4wMDAwMDAwCi0tLSBhL2xpYi9waHAvdGVzdC9UZXN0L1RocmlmdC9GaXh0dXJlcy5waHAKKysrIC9kZXYvbnVsbApAQCAtMSwxOTIgKzAsMCBAQAotPD9waHAKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQudGVzdAotICovCi0KLW5hbWVzcGFjZSBUZXN0XFRocmlmdDsKLQotdXNlIFRocmlmdFRlc3RcWHRydWN0OwotdXNlIFRocmlmdFRlc3RcWHRydWN0MjsKLXVzZSBUaHJpZnRUZXN0XE51bWJlcno7Ci11c2UgVGhyaWZ0VGVzdFxJbnNhbml0eTsKLQotY2xhc3MgRml4dHVyZXMKLXsKLSAgcHVibGljIHN0YXRpYyAkdGVzdEFyZ3MgPSBhcnJheSgpOwotCi0gIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcG9wdWxhdGVUZXN0QXJncygpCi0gIHsKLSAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RTdHJpbmcxJ10gPSAiQWZyaWthYW5zLCBBbGVtYW5uaXNjaCwgQXJhZ29uw6lzLCDYp9mE2LnYsdio2YrYqSwg2YXYtdix2YksIEFzdHVyaWFudSwgQXltYXIgYXJ1LCBBesmZcmJheWNhbiwg0JHQsNGI0qHQvtGA0YIsIEJvYXJpc2NoLCDFvWVtYWl0xJfFoWthLCDQkdC10LvQsNGA0YPRgdC60LDRjywg0JHQtdC70LDRgNGD0YHQutCw0Y8gKNGC0LDRgNCw0YjQutC10LLRltGG0LApLCDQkdGK0LvQs9Cw0YDRgdC60LgsIEJhbWFuYW5rYW4sIOCmrOCmvuCmguCmsuCmviwgQnJlemhvbmVnLCBCb3NhbnNraSwgQ2F0YWzDoCwgTcOsbmctZMSVzKRuZy1uZ+G5s8yELCDQndC+0YXRh9C40LnQvSwgQ2VidWFubywg4Y+j4Y6z4Y6pLCDEjGVza3ksINCh0LvQvtCy0aPMgdC90YzRgdC60YogLyDisJTisI7isJHisILisKHisJDisKDisJTisI3isJ8sINCn05HQstCw0YjQu9CwLCBDeW1yYWVnLCBEYW5zaywgWmF6YWtpLCDei96o3ojerN6A3qjehN6m3pDesCwgzpXOu867zrfOvc65zrrOrCwgRW1pbGnDoG4gZSBydW1hZ27DsmwsIEVuZ2xpc2gsIEVzcGVyYW50bywgRXNwYcOxb2wsIEVlc3RpLCBFdXNrYXJhLCDZgdin2LHYs9uMLCBTdW9taSwgVsO1cm8sIEbDuHJveXNrdCwgRnJhbsOnYWlzLCBBcnBldGFuLCBGdXJsYW4sIEZyeXNrLCBHYWVpbGdlLCDotJvoqp4sIEfDoGlkaGxpZywgR2FsZWdvLCBBdmHDsWUn4bq9LCDgqpfgq4HgqpzgqrDgqr7gqqTgq4AsIEdhZWxnLCDXoteR16jXmdeqLCDgpLngpL/gpKjgpY3gpKbgpYAsIEZpamkgSGluZGksIEhydmF0c2tpLCBLcmV5w7JsIGF5aXN5ZW4sIE1hZ3lhciwg1YDVodW11aXWgNWl1bYsIEludGVybGluZ3VhLCBCYWhhc2EgSW5kb25lc2lhLCBJbG9rYW5vLCBJZG8sIMONc2xlbnNrYSwgSXRhbGlhbm8sIOaXpeacrOiqniwgTG9qYmFuLCBCYXNhIEphd2EsIOGDpeGDkOGDoOGDl+GDo+GDmuGDmCwgS29uZ28sIEthbGFhbGxpc3V0LCDgspXgsqjgs43gsqjgsqEsIO2VnOq1reyWtCwg0JrRitCw0YDQsNGH0LDQuS3QnNCw0LvQutGK0LDRgCwgUmlwb2FyaXNjaCwgS3VyZMOuLCDQmtC+0LzQuCwgS2VybmV3ZWssINCa0YvRgNCz0YvQt9GH0LAsIExhdGluYSwgTGFkaW5vLCBMw6t0emVidWVyZ2VzY2gsIExpbWJ1cmdzLCBMaW5nw6FsYSwg4Lql4Lqy4LqnLCBMaWV0dXZpxbMsIExhdHZpZcWhdSwgQmFzYSBCYW55dW1hc2FuLCBNYWxhZ2FzeSwg0JzQsNC60LXQtNC+0L3RgdC60LgsIOC0ruC0suC0r+C0vuC0s+C0giwg4KSu4KSw4KS+4KSg4KWALCBCYWhhc2EgTWVsYXl1LCDZhdin2LLZkNix2YjZhtuMLCBObmFwdWxpdGFubywgTmVkZXJzYWtzaXNjaCwg4KSo4KWH4KSq4KS+4KSyIOCkreCkvuCkt+CkviwgTmVkZXJsYW5kcywg4oCqTm9yc2sgKG55bm9yc2sp4oCsLCDigKpOb3JzayAoYm9rbcOlbCnigKwsIE5vdW9ybWFuZCwgRGluw6kgYml6YWFkLCBPY2NpdGFuLCDQmNGA0L7QvdCw0YMsIFBhcGlhbWVudHUsIERlaXRzY2gsIE5vcmZ1ayAvIFBpdGtlcm4sIFBvbHNraSwg2b7Zhtis2KfYqNuMLCDZvtqa2KrZiCwgUG9ydHVndcOqcywgUnVuYSBTaW1pLCBSdW1hbnRzY2gsIFJvbWFuaSwgUm9tw6JuxIMsINCg0YPRgdGB0LrQuNC5LCDQodCw0YXQsCDRgtGL0LvQsCwgU2FyZHUsIFNpY2lsaWFudSwgU2NvdHMsIFPDoW1lZ2llbGxhLCBTaW1wbGUgRW5nbGlzaCwgU2xvdmVuxI1pbmEsIFNsb3ZlbsWhxI1pbmEsINCh0YDQv9GB0LrQuCAvIFNycHNraSwgU2VlbHRlcnNrLCBTdmVuc2thLCBLaXN3YWhpbGksIOCupOCuruCuv+CutOCvjSwg4LCk4LGG4LCy4LGB4LCX4LGBLCDQotC+0rfQuNC606MsIOC5hOC4l+C4oiwgVMO8cmttZW7Dp2UsIFRhZ2Fsb2csIFTDvHJrw6dlLCDQotCw0YLQsNGA0YfQsC9UYXRhcsOnYSwg0KPQutGA0LDRl9C90YHRjNC60LAsINin2LHYr9mILCBUaeG6v25nIFZp4buHdCwgVm9sYXDDvGssIFdhbG9uLCBXaW5hcmF5LCDlkLTor60sIGlzaVhob3NhLCDXmdeZ1rTXk9eZ16ksIFlvcsO5YsOhLCBaZcOqdXdzLCDkuK3mlocsIELDom4tbMOibS1nw7osIOeyteiqniI7Ci0KLSAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RTdHJpbmcyJ10gPQotICAgICAgInF1b3RlOiBcXFwiIGJhY2tzbGFzaDoiIC4KLSAgICAgICIgZm9yd2FyZHNsYXNoLWVzY2FwZWQ6IFxcLyAiIC4KLSAgICAgICIgYmFja3NwYWNlOiBcYiBmb3JtZmVlZDogXGYgbmV3bGluZTogXG4gcmV0dXJuOiBcciB0YWI6ICIgLgotICAgICAgIiBub3ctYWxsLW9mLXRoZW0tdG9nZXRoZXI6IFwiXFxcL1xiXG5cclx0IiAuCi0gICAgICAiIG5vdy1hLWJ1bmNoLW9mLWp1bms6ICFAI1wkJSYoKSgmJSQje317fTw+PD48IjsKLQotICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdFN0cmluZzMnXSA9Ci0gICAgICAic3RyaW5nIHRoYXQgZW5kcyBpbiBkb3VibGUtYmFja3NsYXNoIFxcXFwiOwotCi0gICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0RG91YmxlJ10gPSAzLjE0MTU5MjY1MzU4OTg7Ci0KLSAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RCeXRlJ10gPSAweDAxOwotCi0gICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0STMyJ10gPSBwb3coIDIsIDMwICk7Ci0KLSAgICBpZiAoIFBIUF9JTlRfU0laRSA9PSA4ICkKLSAgICB7Ci0gICAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RJNjQnXSA9IHBvdyggMiwgNjAgKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdEk2NCddID0gIjExNTI5MjE1MDQ2MDY4NDcwMDAiOwotICAgIH0KLQotICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdFN0cnVjdCddID0KLSAgICAgIG5ldyBYdHJ1Y3QoCi0gICAgICAgICAgICBhcnJheSgKLSAgICAgICAgICAgICAgICAgICAgJ3N0cmluZ190aGluZycgPT4gJ3dvcmtlZCcsCi0gICAgICAgICAgICAgICAgICAgICdieXRlX3RoaW5nJyA9PiAweDAxLAotICAgICAgICAgICAgICAgICAgICAnaTMyX3RoaW5nJyA9PiBwb3coIDIsIDMwICksCi0gICAgICAgICAgICAgICAgICAgICdpNjRfdGhpbmcnID0+IHNlbGY6OiR0ZXN0QXJnc1sndGVzdEk2NCddCi0gICAgICAgICAgICAgICAgICAgICkKLSAgICAgICAgICAgICk7Ci0KLSAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3ROZXN0TmVzdGVkJ10gPQotICAgICAgbmV3IFh0cnVjdCgKLSAgICAgICAgICAgIGFycmF5KAotICAgICAgICAgICAgICAgICAgICAnc3RyaW5nX3RoaW5nJyA9PiAnd29ya2VkJywKLSAgICAgICAgICAgICAgICAgICAgJ2J5dGVfdGhpbmcnID0+IDB4MDEsCi0gICAgICAgICAgICAgICAgICAgICdpMzJfdGhpbmcnID0+IHBvdyggMiwgMzAgKSwKLSAgICAgICAgICAgICAgICAgICAgJ2k2NF90aGluZycgPT4gc2VsZjo6JHRlc3RBcmdzWyd0ZXN0STY0J10KLSAgICAgICAgICAgICAgICAgICAgKQotICAgICAgICAgICAgKTsKLQotICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdE5lc3QnXSA9Ci0gICAgICBuZXcgWHRydWN0MigKLSAgICAgICAgICAgIGFycmF5KAotICAgICAgICAgICAgICAgICdieXRlX3RoaW5nJyA9PiAweDAxLAotICAgICAgICAgICAgICAgICdzdHJ1Y3RfdGhpbmcnID0+IHNlbGY6OiR0ZXN0QXJnc1sndGVzdE5lc3ROZXN0ZWQnXSwKLSAgICAgICAgICAgICAgICAnaTMyX3RoaW5nJyA9PiBwb3coIDIsIDE1ICkKLSAgICAgICAgICAgICAgICApCi0gICAgICAgICAgICApOwotCi0gICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0TWFwJ10gPQotICAgICAgYXJyYXkoCi0gICAgICAgICAgICA3ID0+IDc3LAotICAgICAgICAgICAgOCA9PiA4OCwKLSAgICAgICAgICAgIDkgPT4gOTkKLSAgICAgICAgICAgICk7Ci0KLSAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RTdHJpbmdNYXAnXSA9Ci0gICAgICBhcnJheSgKLSAgICAgICAgICAgICJhIiA9PiAiMTIzIiwKLSAgICAgICAgICAgICJhIGIiID0+ICJ3aXRoIHNwYWNlcyAiLAotICAgICAgICAgICAgInNhbWUiID0+ICJzYW1lIiwKLSAgICAgICAgICAgICIwIiA9PiAibnVtZXJpYyBrZXkiLAotICAgICAgICAgICAgImxvbmdWYWx1ZSIgPT4gc2VsZjo6JHRlc3RBcmdzWyd0ZXN0U3RyaW5nMSddLAotICAgICAgICAgICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0U3RyaW5nMSddID0+ICJsb25nIGtleSIKLSAgICAgICAgICAgICk7Ci0KLSAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RTZXQnXSA9IGFycmF5KCAxID0+IHRydWUsIDUgPT4gdHJ1ZSwgNiA9PiB0cnVlICk7Ci0KLSAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RMaXN0J10gPSBhcnJheSggMSwgMiwgMyApOwotCi0gICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0RW51bSddID0gTnVtYmVyejo6T05FOwotCi0gICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0VHlwZWRlZiddID0gNjk7Ci0KLSAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RNYXBNYXBFeHBlY3RlZFJlc3VsdCddID0KLSAgICAgIGFycmF5KAotICAgICAgICAgICAgNCA9PiBhcnJheSgKLSAgICAgICAgICAgICAgICAgICAgICAgMSA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAyID0+IDIsCi0gICAgICAgICAgICAgICAgICAgICAgIDMgPT4gMywKLSAgICAgICAgICAgICAgICAgICAgICAgNCA9PiA0LAotICAgICAgICAgICAgICAgICAgICAgICApLAotICAgICAgICAgICAgLTQgPT4gYXJyYXkoCi0gICAgICAgICAgICAgICAgICAgICAgICAtNCA9PiAtNCwKLSAgICAgICAgICAgICAgICAgICAgICAgIC0zID0+IC0zLAotICAgICAgICAgICAgICAgICAgICAgICAgLTIgPT4gLTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAtMSA9PiAtMQotICAgICAgICAgICAgICAgICAgICAgICAgKQotICAgICAgICAgICAgKTsKLQotICAgIC8vIHRlc3RJbnNhbml0eSAuLi4gdGFrZXMgYSBmZXcgc3RlcHMgdG8gc2V0IHVwIQotCi0gICAgJHh0cnVjdDEgPQotICAgICAgbmV3IFh0cnVjdCgKLSAgICAgICAgICAgIGFycmF5KAotICAgICAgICAgICAgICAgICdzdHJpbmdfdGhpbmcnID0+ICdHb29kYnllNCcsCi0gICAgICAgICAgICAgICAgJ2J5dGVfdGhpbmcnID0+IDQsCi0gICAgICAgICAgICAgICAgJ2kzMl90aGluZycgPT4gNCwKLSAgICAgICAgICAgICAgICAnaTY0X3RoaW5nJyA9PiA0Ci0gICAgICAgICAgICAgICAgKQotICAgICAgICAgICAgKTsKLQotICAgICR4dHJ1Y3QyID0KLSAgICAgIG5ldyBYdHJ1Y3QoCi0gICAgICAgICAgICBhcnJheSgKLSAgICAgICAgICAgICAgICAnc3RyaW5nX3RoaW5nJyA9PiAnSGVsbG8yJywKLSAgICAgICAgICAgICAgICAnYnl0ZV90aGluZycgPT4yLAotICAgICAgICAgICAgICAgICdpMzJfdGhpbmcnID0+IDIsCi0gICAgICAgICAgICAgICAgJ2k2NF90aGluZycgPT4gMgotICAgICAgICAgICAgICAgICkKLSAgICAgICAgICAgICk7Ci0KLSAgICAkdXNlck1hcCA9Ci0gICAgICBhcnJheSgKLSAgICAgICAgICAgIE51bWJlcno6OkZJVkUgPT4gNSwKLSAgICAgICAgICAgIE51bWJlcno6OkVJR0hUID0+IDgKLSAgICAgICAgICAgICk7Ci0KLSAgICAkaW5zYW5pdHkyID0KLSAgICAgIG5ldyBJbnNhbml0eSgKLSAgICAgICAgICAgIGFycmF5KAotICAgICAgICAgICAgICAgICd1c2VyTWFwJyA9PiAkdXNlck1hcCwKLSAgICAgICAgICAgICAgICAneHRydWN0cycgPT4gYXJyYXkoJHh0cnVjdDEsJHh0cnVjdDIpCi0gICAgICAgICAgICAgICAgKQotICAgICAgICAgICAgKTsKLQotICAgICRpbnNhbml0eTMgPSAkaW5zYW5pdHkyOwotCi0gICAgJGluc2FuaXR5NiA9Ci0gICAgICBuZXcgSW5zYW5pdHkoCi0gICAgICAgICAgICBhcnJheSgKLSAgICAgICAgICAgICAgICAndXNlck1hcCcgPT4gbnVsbCwKLSAgICAgICAgICAgICAgICAneHRydWN0cycgPT4gbnVsbAotICAgICAgICAgICAgICAgICkKLSAgICAgICAgICAgICk7Ci0KLSAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RJbnNhbml0eUV4cGVjdGVkUmVzdWx0J10gPQotICAgICAgYXJyYXkoCi0gICAgICAgICAgICAiMSIgPT4gYXJyYXkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyejo6VFdPID0+ICRpbnNhbml0eTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyejo6VEhSRUUgPT4gJGluc2FuaXR5MwotICAgICAgICAgICAgICAgICAgICApLAotICAgICAgICAgICAgIjIiID0+IGFycmF5KAotICAgICAgICAgICAgICAgICAgICAgICAgIE51bWJlcno6OlNJWCA9PiAkaW5zYW5pdHk2Ci0gICAgICAgICAgICAgICAgICAgICkKLSAgICAgICAgICAgICk7Ci0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvbGliL3BocC90ZXN0L1Rlc3QvVGhyaWZ0L0pzb25TZXJpYWxpemUvSnNvblNlcmlhbGl6ZVRlc3QucGhwIGIvbGliL3BocC90ZXN0L1Rlc3QvVGhyaWZ0L0pzb25TZXJpYWxpemUvSnNvblNlcmlhbGl6ZVRlc3QucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTMyNGYwLi4wMDAwMDAwCi0tLSBhL2xpYi9waHAvdGVzdC9UZXN0L1RocmlmdC9Kc29uU2VyaWFsaXplL0pzb25TZXJpYWxpemVUZXN0LnBocAorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLW5hbWVzcGFjZSBUZXN0XFRocmlmdFxKc29uU2VyaWFsaXplOwotCi11c2Ugc3RkQ2xhc3M7Ci11c2UgVGVzdFxUaHJpZnRcRml4dHVyZXM7Ci11c2UgVGhyaWZ0XENsYXNzTG9hZGVyXFRocmlmdENsYXNzTG9hZGVyOwotdXNlIFRocmlmdFxTZXJpYWxpemVyXFRCaW5hcnlTZXJpYWxpemVyOwotCi1yZXF1aXJlX29uY2UgX19ESVJfXy4nLy4uLy4uLy4uLy4uL2xpYi9UaHJpZnQvQ2xhc3NMb2FkZXIvVGhyaWZ0Q2xhc3NMb2FkZXIucGhwJzsKLQotJGxvYWRlciA9IG5ldyBUaHJpZnRDbGFzc0xvYWRlcigpOwotJGxvYWRlci0+cmVnaXN0ZXJOYW1lc3BhY2UoJ1RocmlmdCcsIF9fRElSX18gLiAnLy4uLy4uLy4uLy4uL2xpYicpOwotJGxvYWRlci0+cmVnaXN0ZXJOYW1lc3BhY2UoJ1Rlc3QnLCBfX0RJUl9fIC4gJy8uLi8uLi8uLicpOwotJGxvYWRlci0+cmVnaXN0ZXJEZWZpbml0aW9uKCdUaHJpZnRUZXN0JywgX19ESVJfXyAuICcvLi4vLi4vLi4vcGFja2FnZXMvcGhwanMnKTsKLSRsb2FkZXItPnJlZ2lzdGVyKCk7Ci0KLWNsYXNzIEpzb25TZXJpYWxpemVUZXN0IGV4dGVuZHMgXFBIUFVuaXRfRnJhbWV3b3JrX1Rlc3RDYXNlCi17Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHRlc3RFbXB0eVN0cnVjdCgpIHsKLSAgICAkZW1wdHkgPSBuZXcgXFRocmlmdFRlc3RcRW1wdHlTdHJ1Y3QoYXJyYXkoJ25vbl9leGlzdGluZ19rZXknID0+ICdiYXInKSk7Ci0gICAgJHRoaXMtPmFzc2VydEVxdWFscyhuZXcgc3RkQ2xhc3MsIGpzb25fZGVjb2RlKGpzb25fZW5jb2RlKCRlbXB0eSkpKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U3RyaW5nc0FuZEludHMoKSB7Ci0gICAgJGlucHV0ID0gYXJyYXkoCi0gICAgICAnc3RyaW5nX3RoaW5nJyA9PiAnZm9vJywKLSAgICAgICdpNjRfdGhpbmcnID0+IDEyMzQ1Njc4OTAsCi0gICAgKTsKLSAgICAkeHRydWN0ID0gbmV3IFxUaHJpZnRUZXN0XFh0cnVjdCgkaW5wdXQpOwotCi0gICAgLy8gWHRydWN0J3MgJ2kzMl90aGluZycgYW5kICdieXRlX3RoaW5nJyBmaWVsZHMgc2hvdWxkIG5vdCBiZSBwcmVzZW50IGhlcmUhCi0gICAgJGV4cGVjdGVkID0gbmV3IHN0ZENsYXNzOwotICAgICRleHBlY3RlZC0+c3RyaW5nX3RoaW5nID0gJGlucHV0WydzdHJpbmdfdGhpbmcnXTsKLSAgICAkZXhwZWN0ZWQtPmk2NF90aGluZyA9ICRpbnB1dFsnaTY0X3RoaW5nJ107Ci0gICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsIGpzb25fZGVjb2RlKGpzb25fZW5jb2RlKCR4dHJ1Y3QpKSk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gdGVzdE5lc3RlZFN0cnVjdHMoKSB7Ci0gICAgJHh0cnVjdDIgPSBuZXcgXFRocmlmdFRlc3RcWHRydWN0MihhcnJheSgKLSAgICAgICdieXRlX3RoaW5nJyA9PiA0MiwKLSAgICAgICdzdHJ1Y3RfdGhpbmcnID0+IG5ldyBcVGhyaWZ0VGVzdFxYdHJ1Y3QoYXJyYXkoCi0gICAgICAgICdpMzJfdGhpbmcnID0+IDEyMzQ1NiwKLSAgICAgICkpLAotICAgICkpOwotCi0gICAgJGV4cGVjdGVkID0gbmV3IHN0ZENsYXNzOwotICAgICRleHBlY3RlZC0+Ynl0ZV90aGluZyA9ICR4dHJ1Y3QyLT5ieXRlX3RoaW5nOwotICAgICRleHBlY3RlZC0+c3RydWN0X3RoaW5nID0gbmV3IHN0ZENsYXNzOwotICAgICRleHBlY3RlZC0+c3RydWN0X3RoaW5nLT5pMzJfdGhpbmcgPSAkeHRydWN0Mi0+c3RydWN0X3RoaW5nLT5pMzJfdGhpbmc7Ci0gICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsIGpzb25fZGVjb2RlKGpzb25fZW5jb2RlKCR4dHJ1Y3QyKSkpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHRlc3RJbnNhbml0eSgpIHsKLSAgICAkeGlucHV0ID0gYXJyYXkoJ3N0cmluZ190aGluZycgPT4gJ2ZvbycpOwotICAgICR4dHJ1Y3QgPSBuZXcgXFRocmlmdFRlc3RcWHRydWN0KCR4aW5wdXQpOwotICAgICRpbnNhbml0eSA9IG5ldyBcVGhyaWZ0VGVzdFxJbnNhbml0eShhcnJheSgKLSAgICAgICd4dHJ1Y3RzJyA9PiBhcnJheSgkeHRydWN0LCAkeHRydWN0LCAkeHRydWN0KQotICAgICkpOwotICAgICRleHBlY3RlZCA9IG5ldyBzdGRDbGFzczsKLSAgICAkZXhwZWN0ZWQtPnh0cnVjdHMgPSBhcnJheSgob2JqZWN0KSR4aW5wdXQsIChvYmplY3QpJHhpbnB1dCwgKG9iamVjdCkkeGlucHV0KTsKLSAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwganNvbl9kZWNvZGUoanNvbl9lbmNvZGUoJGluc2FuaXR5KSkpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHRlc3ROZXN0ZWRMaXN0cygpIHsKLSAgICAkYm9uayA9IG5ldyBcVGhyaWZ0VGVzdFxCb25rKGFycmF5KCdtZXNzYWdlJyA9PiAnZm9vJykpOwotICAgICRuZXN0ZWQgPSBuZXcgXFRocmlmdFRlc3RcTmVzdGVkTGlzdHNCb25rKGFycmF5KCdib25rJyA9PiBhcnJheShhcnJheShhcnJheSgkYm9uaykpKSkpOwotICAgICRleHBlY3RlZCA9IG5ldyBzdGRDbGFzczsKLSAgICAkZXhwZWN0ZWQtPmJvbmsgPSBhcnJheShhcnJheShhcnJheSgob2JqZWN0KWFycmF5KCdtZXNzYWdlJyA9PiAnZm9vJykpKSk7Ci0gICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsIGpzb25fZGVjb2RlKGpzb25fZW5jb2RlKCRuZXN0ZWQpKSk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvbGliL3BocC90ZXN0L1Rlc3QvVGhyaWZ0L1Byb3RvY29sL1Rlc3RCaW5hcnlTZXJpYWxpemVyLnBocCBiL2xpYi9waHAvdGVzdC9UZXN0L1RocmlmdC9Qcm90b2NvbC9UZXN0QmluYXJ5U2VyaWFsaXplci5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1ZmVhZGQuLjAwMDAwMDAKLS0tIGEvbGliL3BocC90ZXN0L1Rlc3QvVGhyaWZ0L1Byb3RvY29sL1Rlc3RCaW5hcnlTZXJpYWxpemVyLnBocAorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLTw/cGhwCi0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnRlc3QKLSAqLwotCi1uYW1lc3BhY2UgdGVzdFxUaHJpZnRcUHJvdG9jb2w7Ci0KLXVzZSBUaHJpZnRcQ2xhc3NMb2FkZXJcVGhyaWZ0Q2xhc3NMb2FkZXI7Ci11c2UgVGhyaWZ0XFNlcmlhbGl6ZXJcVEJpbmFyeVNlcmlhbGl6ZXI7Ci0KLXJlcXVpcmVfb25jZSBfX0RJUl9fLicvLi4vLi4vLi4vLi4vbGliL1RocmlmdC9DbGFzc0xvYWRlci9UaHJpZnRDbGFzc0xvYWRlci5waHAnOwotCi0kbG9hZGVyID0gbmV3IFRocmlmdENsYXNzTG9hZGVyKCk7Ci0kbG9hZGVyLT5yZWdpc3Rlck5hbWVzcGFjZSgnVGhyaWZ0JywgX19ESVJfXyAuICcvLi4vLi4vLi4vLi4vbGliJyk7Ci0kbG9hZGVyLT5yZWdpc3Rlck5hbWVzcGFjZSgnVGVzdCcsIF9fRElSX18gLiAnLy4uLy4uLy4uJyk7Ci0kbG9hZGVyLT5yZWdpc3RlckRlZmluaXRpb24oJ1RocmlmdFRlc3QnLCBfX0RJUl9fIC4gJy8uLi8uLi8uLi9wYWNrYWdlcycpOwotJGxvYWRlci0+cmVnaXN0ZXIoKTsKLQotLyoqKgotICogVGhpcyB0ZXN0IHN1aXRlIGRlcGVuZHMgb24gcnVubmluZyB0aGUgY29tcGlsZXIgYWdhaW5zdCB0aGUKLSAqIHN0YW5kYXJkIFRocmlmdFRlc3QudGhyaWZ0IGZpbGU6Ci0gKgotICogbGliL3BocC90ZXN0JCAuLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC0tZ2VuIHBocCAtciBcCi0gKiAgIC0tb3V0IC4vcGFja2FnZXMgLi4vLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdAotICovCi0KLWNsYXNzIFRlc3RCaW5hcnlTZXJpYWxpemVyIGV4dGVuZHMgXFBIUFVuaXRfRnJhbWV3b3JrX1Rlc3RDYXNlCi17Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHNldFVwKCkKLSAgewotICB9Ci0KLSAgLyoqCi0gICAgKiBXZSB0cnkgdG8gc2VyaWFsaXplIGFuZCBkZXNlcmlhbGl6ZSBhIHJhbmRvbSBvYmplY3QgdG8gbWFrZSBzdXJlIG5vIGV4Y2VwdGlvbnMgYXJlIHRocm93bi4KLSAgICAqIEBzZWUgVEhSSUZULTE1NzkKLSAgICAqLwotICBwdWJsaWMgZnVuY3Rpb24gdGVzdEJpbmFyeVNlcmlhbGl6ZXIoKQotICB7Ci0gICAgJHN0cnVjdCA9IG5ldyBcVGhyaWZ0VGVzdFxYdHJ1Y3QoYXJyYXkoJ3N0cmluZ190aGluZycgPT4gJ2FiYycpKTsKLSAgICAkc2VyaWFsaXplZCA9IFRCaW5hcnlTZXJpYWxpemVyOjpzZXJpYWxpemUoJHN0cnVjdCwgJ1RocmlmdFRlc3RcXFh0cnVjdCcpOwotICAgICRkZXNlcmlhbGl6ZWQgPSBUQmluYXJ5U2VyaWFsaXplcjo6ZGVzZXJpYWxpemUoJHNlcmlhbGl6ZWQsICdUaHJpZnRUZXN0XFxYdHJ1Y3QnKTsKLSAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRzdHJ1Y3QsICRkZXNlcmlhbGl6ZWQpOwotICB9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvbGliL3BocC90ZXN0L1Rlc3QvVGhyaWZ0L1Byb3RvY29sL1Rlc3RUSlNPTlByb3RvY29sLnBocCBiL2xpYi9waHAvdGVzdC9UZXN0L1RocmlmdC9Qcm90b2NvbC9UZXN0VEpTT05Qcm90b2NvbC5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ1YWE2OWMuLjAwMDAwMDAKLS0tIGEvbGliL3BocC90ZXN0L1Rlc3QvVGhyaWZ0L1Byb3RvY29sL1Rlc3RUSlNPTlByb3RvY29sLnBocAorKysgL2Rldi9udWxsCkBAIC0xLDU2OCArMCwwIEBACi08P3BocAotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC50ZXN0Ci0gKi8KLQotbmFtZXNwYWNlIHRlc3RcVGhyaWZ0XFByb3RvY29sOwotCi11c2UgVGhyaWZ0XENsYXNzTG9hZGVyXFRocmlmdENsYXNzTG9hZGVyOwotdXNlIFRlc3RcVGhyaWZ0XEZpeHR1cmVzOwotdXNlIFRocmlmdFxUcmFuc3BvcnRcVE1lbW9yeUJ1ZmZlcjsKLXVzZSBUaHJpZnRcUHJvdG9jb2xcVEpTT05Qcm90b2NvbDsKLQotCi1kZWZpbmUoICdCVUZTSVonLCA4MTkyICk7IC8vYmlnIGVub3VnaCB0byByZWFkIGJpZ2dlc3Qgc2VyaWFsaXplZCBGaXh0dXJlIGFyZy4KLQotcmVxdWlyZV9vbmNlIF9fRElSX18uJy8uLi8uLi8uLi8uLi9saWIvVGhyaWZ0L0NsYXNzTG9hZGVyL1RocmlmdENsYXNzTG9hZGVyLnBocCc7Ci0KLSRsb2FkZXIgPSBuZXcgVGhyaWZ0Q2xhc3NMb2FkZXIoKTsKLSRsb2FkZXItPnJlZ2lzdGVyTmFtZXNwYWNlKCdUaHJpZnQnLCBfX0RJUl9fIC4gJy8uLi8uLi8uLi8uLi9saWInKTsKLSRsb2FkZXItPnJlZ2lzdGVyTmFtZXNwYWNlKCdUZXN0JywgX19ESVJfXyAuICcvLi4vLi4vLi4nKTsKLSRsb2FkZXItPnJlZ2lzdGVyRGVmaW5pdGlvbignVGhyaWZ0VGVzdCcsIF9fRElSX18gLiAnLy4uLy4uLy4uL3BhY2thZ2VzJyk7Ci0kbG9hZGVyLT5yZWdpc3RlcigpOwotCi0vKioqCi0gKiBUaGlzIHRlc3Qgc3VpdGUgZGVwZW5kcyBvbiBydW5uaW5nIHRoZSBjb21waWxlciBhZ2FpbnN0IHRoZQotICogc3RhbmRhcmQgVGhyaWZ0VGVzdC50aHJpZnQgZmlsZToKLSAqCi0gKiBsaWIvcGhwL3Rlc3QkIC4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLS1nZW4gcGhwIC1yIFwKLSAqICAgLS1vdXQgLi9wYWNrYWdlcyAuLi8uLi8uLi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0Ci0gKi8KLQotY2xhc3MgVGVzdFRKU09OUHJvdG9jb2wgZXh0ZW5kcyBcUEhQVW5pdF9GcmFtZXdvcmtfVGVzdENhc2UKLXsKLSAgcHJpdmF0ZSAkdHJhbnNwb3J0OwotICBwcml2YXRlICRwcm90b2NvbDsKLQotICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNldFVwQmVmb3JlQ2xhc3MoKQotICB7Ci0gICAgRml4dHVyZXM6OnBvcHVsYXRlVGVzdEFyZ3MoKTsKLSAgICBUZXN0VEpTT05Qcm90b2NvbF9GaXh0dXJlczo6cG9wdWxhdGVUZXN0QXJnc0pTT04oKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiBzZXRVcCgpCi0gIHsKLSAgICAkdGhpcy0+dHJhbnNwb3J0ID0gbmV3IFRNZW1vcnlCdWZmZXIoKTsKLSAgICAkdGhpcy0+cHJvdG9jb2wgPSBuZXcgVEpTT05Qcm90b2NvbCgkdGhpcy0+dHJhbnNwb3J0KTsKLSAgICAkdGhpcy0+dHJhbnNwb3J0LT5vcGVuKCk7Ci0gIH0KLQotICAvKioqCi0gICAqIFdSSVRFIFRFU1RTCi0gICAqLwotCi0gIHB1YmxpYyBmdW5jdGlvbiB0ZXN0Vm9pZF9Xcml0ZSgpCi0gIHsKLSAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RWb2lkX2FyZ3MoKTsKLSAgICAkYXJncy0+d3JpdGUoICR0aGlzLT5wcm90b2NvbCApOwotCi0gICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoIEJVRlNJWiApOwotICAgICRleHBlY3RlZCA9IFRlc3RUSlNPTlByb3RvY29sX0ZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0Vm9pZCddOwotCi0gICAgJHRoaXMtPmFzc2VydEVxdWFscyggJGV4cGVjdGVkLCAkYWN0dWFsICk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gdGVzdFN0cmluZzFfV3JpdGUoKQotICB7Ci0gICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0U3RyaW5nX2FyZ3MoKTsKLSAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0U3RyaW5nMSddOwotICAgICRhcmdzLT53cml0ZSggJHRoaXMtPnByb3RvY29sICk7Ci0KLSAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZCggQlVGU0laICk7Ci0gICAgJGV4cGVjdGVkID0gVGVzdFRKU09OUHJvdG9jb2xfRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJpbmcxJ107Ci0KLSAgICAjJHRoaXMtPmFzc2VydEVxdWFscyggJGV4cGVjdGVkLCAkYWN0dWFsICk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gdGVzdFN0cmluZzJfV3JpdGUoKQotICB7Ci0gICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0U3RyaW5nX2FyZ3MoKTsKLSAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0U3RyaW5nMiddOwotICAgICRhcmdzLT53cml0ZSggJHRoaXMtPnByb3RvY29sICk7Ci0KLSAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZCggQlVGU0laICk7Ci0gICAgJGV4cGVjdGVkID0gVGVzdFRKU09OUHJvdG9jb2xfRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJpbmcyJ107Ci0KLSAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCAkZXhwZWN0ZWQsICRhY3R1YWwgKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB0ZXN0RG91YmxlX1dyaXRlKCkKLSAgewotICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdERvdWJsZV9hcmdzKCk7Ci0gICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdERvdWJsZSddOwotICAgICRhcmdzLT53cml0ZSggJHRoaXMtPnByb3RvY29sICk7Ci0KLSAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZCggQlVGU0laICk7Ci0gICAgJGV4cGVjdGVkID0gVGVzdFRKU09OUHJvdG9jb2xfRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3REb3VibGUnXTsKLQotICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoICRleHBlY3RlZCwgJGFjdHVhbCApOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHRlc3RCeXRlX1dyaXRlKCkKLSAgewotICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdEJ5dGVfYXJncygpOwotICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RCeXRlJ107Ci0gICAgJGFyZ3MtPndyaXRlKCAkdGhpcy0+cHJvdG9jb2wgKTsKLQotICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKCBCVUZTSVogKTsKLSAgICAkZXhwZWN0ZWQgPSBUZXN0VEpTT05Qcm90b2NvbF9GaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdEJ5dGUnXTsKLQotICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoICRleHBlY3RlZCwgJGFjdHVhbCApOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHRlc3RJMzJfV3JpdGUoKQotICB7Ci0gICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0STMyX2FyZ3MoKTsKLSAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0STMyJ107Ci0gICAgJGFyZ3MtPndyaXRlKCAkdGhpcy0+cHJvdG9jb2wgKTsKLQotICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKCBCVUZTSVogKTsKLSAgICAkZXhwZWN0ZWQgPSBUZXN0VEpTT05Qcm90b2NvbF9GaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdEkzMiddOwotCi0gICAgJHRoaXMtPmFzc2VydEVxdWFscyggJGV4cGVjdGVkLCAkYWN0dWFsICk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gdGVzdEk2NF9Xcml0ZSgpCi0gIHsKLSAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RJNjRfYXJncygpOwotICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RJNjQnXTsKLSAgICAkYXJncy0+d3JpdGUoICR0aGlzLT5wcm90b2NvbCApOwotCi0gICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoIEJVRlNJWiApOwotICAgICRleHBlY3RlZCA9IFRlc3RUSlNPTlByb3RvY29sX0ZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0STY0J107Ci0KLSAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCAkZXhwZWN0ZWQsICRhY3R1YWwgKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U3RydWN0X1dyaXRlKCkKLSAgewotICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFN0cnVjdF9hcmdzKCk7Ci0gICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdFN0cnVjdCddOwotCi0gICAgJGFyZ3MtPndyaXRlKCAkdGhpcy0+cHJvdG9jb2wgKTsKLQotICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKCBCVUZTSVogKTsKLSAgICAkZXhwZWN0ZWQgPSBUZXN0VEpTT05Qcm90b2NvbF9GaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cnVjdCddOwotCi0gICAgJHRoaXMtPmFzc2VydEVxdWFscyggJGV4cGVjdGVkLCAkYWN0dWFsICk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gdGVzdE5lc3RfV3JpdGUoKQotICB7Ci0gICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0TmVzdF9hcmdzKCk7Ci0gICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdE5lc3QnXTsKLQotICAgICRhcmdzLT53cml0ZSggJHRoaXMtPnByb3RvY29sICk7Ci0KLSAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZCggQlVGU0laICk7Ci0gICAgJGV4cGVjdGVkID0gVGVzdFRKU09OUHJvdG9jb2xfRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3ROZXN0J107Ci0KLSAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCAkZXhwZWN0ZWQsICRhY3R1YWwgKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB0ZXN0TWFwX1dyaXRlKCkKLSAgewotICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdE1hcF9hcmdzKCk7Ci0gICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdE1hcCddOwotCi0gICAgJGFyZ3MtPndyaXRlKCAkdGhpcy0+cHJvdG9jb2wgKTsKLQotICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKCBCVUZTSVogKTsKLSAgICAkZXhwZWN0ZWQgPSBUZXN0VEpTT05Qcm90b2NvbF9GaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdE1hcCddOwotCi0gICAgJHRoaXMtPmFzc2VydEVxdWFscyggJGV4cGVjdGVkLCAkYWN0dWFsICk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gdGVzdFN0cmluZ01hcF9Xcml0ZSgpCi0gIHsKLSAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RTdHJpbmdNYXBfYXJncygpOwotICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RTdHJpbmdNYXAnXTsKLQotICAgICRhcmdzLT53cml0ZSggJHRoaXMtPnByb3RvY29sICk7Ci0KLSAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZCggQlVGU0laICk7Ci0gICAgJGV4cGVjdGVkID0gVGVzdFRKU09OUHJvdG9jb2xfRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJpbmdNYXAnXTsKLQotICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoICRleHBlY3RlZCwgJGFjdHVhbCApOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHRlc3RTZXRfV3JpdGUoKQotICB7Ci0gICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0U2V0X2FyZ3MoKTsKLSAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0U2V0J107Ci0KLSAgICAkYXJncy0+d3JpdGUoICR0aGlzLT5wcm90b2NvbCApOwotCi0gICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoIEJVRlNJWiApOwotICAgICRleHBlY3RlZCA9IFRlc3RUSlNPTlByb3RvY29sX0ZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0U2V0J107Ci0KLSAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCAkZXhwZWN0ZWQsICRhY3R1YWwgKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB0ZXN0TGlzdF9Xcml0ZSgpCi0gIHsKLSAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RMaXN0X2FyZ3MoKTsKLSAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0TGlzdCddOwotCi0gICAgJGFyZ3MtPndyaXRlKCAkdGhpcy0+cHJvdG9jb2wgKTsKLQotICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKCBCVUZTSVogKTsKLSAgICAkZXhwZWN0ZWQgPSBUZXN0VEpTT05Qcm90b2NvbF9GaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdExpc3QnXTsKLQotICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoICRleHBlY3RlZCwgJGFjdHVhbCApOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHRlc3RFbnVtX1dyaXRlKCkKLSAgewotICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdEVudW1fYXJncygpOwotICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RFbnVtJ107Ci0KLSAgICAkYXJncy0+d3JpdGUoICR0aGlzLT5wcm90b2NvbCApOwotCi0gICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoIEJVRlNJWiApOwotICAgICRleHBlY3RlZCA9IFRlc3RUSlNPTlByb3RvY29sX0ZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0RW51bSddOwotCi0gICAgJHRoaXMtPmFzc2VydEVxdWFscyggJGV4cGVjdGVkLCAkYWN0dWFsICk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gdGVzdFR5cGVkZWZfV3JpdGUoKQotICB7Ci0gICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0VHlwZWRlZl9hcmdzKCk7Ci0gICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdFR5cGVkZWYnXTsKLQotICAgICRhcmdzLT53cml0ZSggJHRoaXMtPnByb3RvY29sICk7Ci0KLSAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZCggQlVGU0laICk7Ci0gICAgJGV4cGVjdGVkID0gVGVzdFRKU09OUHJvdG9jb2xfRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RUeXBlZGVmJ107Ci0KLSAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCAkZXhwZWN0ZWQsICRhY3R1YWwgKTsKLSAgfQotCi0gIC8qKioKLSAgICogUkVBRCBURVNUUwotICAgKi8KLQotICBwdWJsaWMgZnVuY3Rpb24gdGVzdFZvaWRfUmVhZCgpCi0gIHsKLSAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKLQkJCSAgICBUZXN0VEpTT05Qcm90b2NvbF9GaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFZvaWQnXQotCQkJICAgICk7Ci0gICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0Vm9pZF9hcmdzKCk7Ci0gICAgJGFyZ3MtPnJlYWQoICR0aGlzLT5wcm90b2NvbCApOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHRlc3RTdHJpbmcxX1JlYWQoKQotICB7Ci0gICAgJHRoaXMtPnRyYW5zcG9ydC0+d3JpdGUoCi0JCQkgICAgVGVzdFRKU09OUHJvdG9jb2xfRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJpbmcxJ10KLQkJCSAgICApOwotICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFN0cmluZ19hcmdzKCk7Ci0gICAgJGFyZ3MtPnJlYWQoICR0aGlzLT5wcm90b2NvbCApOwotCi0gICAgJGFjdHVhbCA9ICRhcmdzLT50aGluZzsKLSAgICAkZXhwZWN0ZWQgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0U3RyaW5nMSddOwotCi0gICAgJHRoaXMtPmFzc2VydEVxdWFscyggJGV4cGVjdGVkLCAkYWN0dWFsICk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gdGVzdFN0cmluZzJfUmVhZCgpCi0gIHsKLSAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKLQkJCSAgICBUZXN0VEpTT05Qcm90b2NvbF9GaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cmluZzInXQotCQkJICAgICk7Ci0gICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0U3RyaW5nX2FyZ3MoKTsKLSAgICAkYXJncy0+cmVhZCggJHRoaXMtPnByb3RvY29sICk7Ci0KLSAgICAkYWN0dWFsID0gJGFyZ3MtPnRoaW5nOwotICAgICRleHBlY3RlZCA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RTdHJpbmcyJ107Ci0KLSAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCAkZXhwZWN0ZWQsICRhY3R1YWwgKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U3RyaW5nM19Xcml0ZSgpCi0gIHsKLSAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RTdHJpbmdfYXJncygpOwotICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RTdHJpbmczJ107Ci0gICAgJGFyZ3MtPndyaXRlKCAkdGhpcy0+cHJvdG9jb2wgKTsKLQotICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKCBCVUZTSVogKTsKLSAgICAkZXhwZWN0ZWQgPSBUZXN0VEpTT05Qcm90b2NvbF9GaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cmluZzMnXTsKLQotICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoICRleHBlY3RlZCwgJGFjdHVhbCApOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHRlc3REb3VibGVfUmVhZCgpCi0gIHsKLSAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKLQkJCSAgICBUZXN0VEpTT05Qcm90b2NvbF9GaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdERvdWJsZSddCi0JCQkgICAgKTsKLSAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3REb3VibGVfYXJncygpOwotICAgICRhcmdzLT5yZWFkKCAkdGhpcy0+cHJvdG9jb2wgKTsKLQotICAgICRhY3R1YWwgPSAkYXJncy0+dGhpbmc7Ci0gICAgJGV4cGVjdGVkID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdERvdWJsZSddOwotCi0gICAgJHRoaXMtPmFzc2VydEVxdWFscyggJGV4cGVjdGVkLCAkYWN0dWFsICk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gdGVzdEJ5dGVfUmVhZCgpCi0gIHsKLSAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKLQkJCSAgICBUZXN0VEpTT05Qcm90b2NvbF9GaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdEJ5dGUnXQotCQkJICAgICk7Ci0gICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0Qnl0ZV9hcmdzKCk7Ci0gICAgJGFyZ3MtPnJlYWQoICR0aGlzLT5wcm90b2NvbCApOwotCi0gICAgJGFjdHVhbCA9ICRhcmdzLT50aGluZzsKLSAgICAkZXhwZWN0ZWQgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0Qnl0ZSddOwotCi0gICAgJHRoaXMtPmFzc2VydEVxdWFscyggJGV4cGVjdGVkLCAkYWN0dWFsICk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gdGVzdEkzMl9SZWFkKCkKLSAgewotICAgICR0aGlzLT50cmFuc3BvcnQtPndyaXRlKAotCQkJICAgIFRlc3RUSlNPTlByb3RvY29sX0ZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0STMyJ10KLQkJCSAgICApOwotICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdEkzMl9hcmdzKCk7Ci0gICAgJGFyZ3MtPnJlYWQoICR0aGlzLT5wcm90b2NvbCApOwotCi0gICAgJGFjdHVhbCA9ICRhcmdzLT50aGluZzsKLSAgICAkZXhwZWN0ZWQgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0STMyJ107Ci0KLSAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCAkZXhwZWN0ZWQsICRhY3R1YWwgKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB0ZXN0STY0X1JlYWQoKQotICB7Ci0gICAgJHRoaXMtPnRyYW5zcG9ydC0+d3JpdGUoCi0JCQkgICAgVGVzdFRKU09OUHJvdG9jb2xfRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RJNjQnXQotCQkJICAgICk7Ci0gICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0STY0X2FyZ3MoKTsKLSAgICAkYXJncy0+cmVhZCggJHRoaXMtPnByb3RvY29sICk7Ci0KLSAgICAkYWN0dWFsID0gJGFyZ3MtPnRoaW5nOwotICAgICRleHBlY3RlZCA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RJNjQnXTsKLQotICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoICRleHBlY3RlZCwgJGFjdHVhbCApOwotCi0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gdGVzdFN0cnVjdF9SZWFkKCkKLSAgewotICAgICR0aGlzLT50cmFuc3BvcnQtPndyaXRlKAotCQkJICAgIFRlc3RUSlNPTlByb3RvY29sX0ZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RydWN0J10KLQkJCSAgICApOwotICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFN0cnVjdF9hcmdzKCk7Ci0gICAgJGFyZ3MtPnJlYWQoICR0aGlzLT5wcm90b2NvbCApOwotCi0gICAgJGFjdHVhbCA9ICRhcmdzLT50aGluZzsKLSAgICAkZXhwZWN0ZWQgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0U3RydWN0J107Ci0KLSAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCAkZXhwZWN0ZWQsICRhY3R1YWwgKTsKLQotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHRlc3ROZXN0X1JlYWQoKQotICB7Ci0gICAgJHRoaXMtPnRyYW5zcG9ydC0+d3JpdGUoCi0JCQkgICAgVGVzdFRKU09OUHJvdG9jb2xfRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3ROZXN0J10KLQkJCSAgICApOwotICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdE5lc3RfYXJncygpOwotICAgICRhcmdzLT5yZWFkKCAkdGhpcy0+cHJvdG9jb2wgKTsKLQotICAgICRhY3R1YWwgPSAkYXJncy0+dGhpbmc7Ci0gICAgJGV4cGVjdGVkID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdE5lc3QnXTsKLQotICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoICRleHBlY3RlZCwgJGFjdHVhbCApOwotCi0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gdGVzdE1hcF9SZWFkKCkKLSAgewotICAgICR0aGlzLT50cmFuc3BvcnQtPndyaXRlKAotCQkJICAgIFRlc3RUSlNPTlByb3RvY29sX0ZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0TWFwJ10KLQkJCSAgICApOwotICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdE1hcF9hcmdzKCk7Ci0gICAgJGFyZ3MtPnJlYWQoICR0aGlzLT5wcm90b2NvbCApOwotCi0gICAgJGFjdHVhbCA9ICRhcmdzLT50aGluZzsKLSAgICAkZXhwZWN0ZWQgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0TWFwJ107Ci0KLSAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCAkZXhwZWN0ZWQsICRhY3R1YWwgKTsKLQotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHRlc3RTdHJpbmdNYXBfUmVhZCgpCi0gIHsKLSAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKLQkJCSAgICBUZXN0VEpTT05Qcm90b2NvbF9GaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cmluZ01hcCddCi0JCQkgICAgKTsKLSAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RTdHJpbmdNYXBfYXJncygpOwotICAgICRhcmdzLT5yZWFkKCAkdGhpcy0+cHJvdG9jb2wgKTsKLQotICAgICRhY3R1YWwgPSAkYXJncy0+dGhpbmc7Ci0gICAgJGV4cGVjdGVkID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdFN0cmluZ01hcCddOwotCi0gICAgJHRoaXMtPmFzc2VydEVxdWFscyggJGV4cGVjdGVkLCAkYWN0dWFsICk7Ci0KLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U2V0X1JlYWQoKQotICB7Ci0gICAgJHRoaXMtPnRyYW5zcG9ydC0+d3JpdGUoCi0JCQkgICAgVGVzdFRKU09OUHJvdG9jb2xfRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTZXQnXQotCQkJICAgICk7Ci0gICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0U2V0X2FyZ3MoKTsKLSAgICAkYXJncy0+cmVhZCggJHRoaXMtPnByb3RvY29sICk7Ci0KLSAgICAkYWN0dWFsID0gJGFyZ3MtPnRoaW5nOwotICAgICRleHBlY3RlZCA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RTZXQnXTsKLQotICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoICRleHBlY3RlZCwgJGFjdHVhbCApOwotCi0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gdGVzdExpc3RfUmVhZCgpCi0gIHsKLSAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKLQkJCSAgICBUZXN0VEpTT05Qcm90b2NvbF9GaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdExpc3QnXQotCQkJICAgICk7Ci0gICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0TGlzdF9hcmdzKCk7Ci0gICAgJGFyZ3MtPnJlYWQoICR0aGlzLT5wcm90b2NvbCApOwotCi0gICAgJGFjdHVhbCA9ICRhcmdzLT50aGluZzsKLSAgICAkZXhwZWN0ZWQgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0TGlzdCddOwotCi0gICAgJHRoaXMtPmFzc2VydEVxdWFscyggJGV4cGVjdGVkLCAkYWN0dWFsICk7Ci0KLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB0ZXN0RW51bV9SZWFkKCkKLSAgewotICAgICR0aGlzLT50cmFuc3BvcnQtPndyaXRlKAotCQkJICAgIFRlc3RUSlNPTlByb3RvY29sX0ZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0RW51bSddCi0JCQkgICAgKTsKLSAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RFbnVtX2FyZ3MoKTsKLSAgICAkYXJncy0+cmVhZCggJHRoaXMtPnByb3RvY29sICk7Ci0KLSAgICAkYWN0dWFsID0gJGFyZ3MtPnRoaW5nOwotICAgICRleHBlY3RlZCA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RFbnVtJ107Ci0KLSAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCAkZXhwZWN0ZWQsICRhY3R1YWwgKTsKLQotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHRlc3RUeXBlZGVmX1JlYWQoKQotICB7Ci0gICAgJHRoaXMtPnRyYW5zcG9ydC0+d3JpdGUoCi0JCQkgICAgVGVzdFRKU09OUHJvdG9jb2xfRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RUeXBlZGVmJ10KLQkJCSAgICApOwotICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFR5cGVkZWZfYXJncygpOwotICAgICRhcmdzLT5yZWFkKCAkdGhpcy0+cHJvdG9jb2wgKTsKLQotICAgICRhY3R1YWwgPSAkYXJncy0+dGhpbmc7Ci0gICAgJGV4cGVjdGVkID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdFR5cGVkZWYnXTsKLQotICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoICRleHBlY3RlZCwgJGFjdHVhbCApOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHRlc3RNYXBNYXBfUmVhZCgpCi0gIHsKLSAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKLQkJCSAgICBUZXN0VEpTT05Qcm90b2NvbF9GaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdE1hcE1hcCddCi0JCQkgICAgKTsKLSAgICAkcmVzdWx0ID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdE1hcE1hcF9yZXN1bHQoKTsKLSAgICAkcmVzdWx0LT5yZWFkKCAkdGhpcy0+cHJvdG9jb2wgKTsKLQotICAgICRhY3R1YWwgPSAkcmVzdWx0LT5zdWNjZXNzOwotICAgICRleHBlY3RlZCA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RNYXBNYXBFeHBlY3RlZFJlc3VsdCddOwotCi0gICAgJHRoaXMtPmFzc2VydEVxdWFscyggJGV4cGVjdGVkLCAkYWN0dWFsICk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gdGVzdEluc2FuaXR5X1JlYWQoKQotICB7Ci0gICAgJHRoaXMtPnRyYW5zcG9ydC0+d3JpdGUoCi0JCQkgICAgVGVzdFRKU09OUHJvdG9jb2xfRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RJbnNhbml0eSddCi0JCQkgICAgKTsKLSAgICAkcmVzdWx0ID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdEluc2FuaXR5X3Jlc3VsdCgpOwotICAgICRyZXN1bHQtPnJlYWQoICR0aGlzLT5wcm90b2NvbCApOwotCi0gICAgJGFjdHVhbCA9ICRyZXN1bHQtPnN1Y2Nlc3M7Ci0gICAgJGV4cGVjdGVkID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdEluc2FuaXR5RXhwZWN0ZWRSZXN1bHQnXTsKLQotICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoICRleHBlY3RlZCwgJGFjdHVhbCApOwotICB9Ci0KLX0KLQotY2xhc3MgVGVzdFRKU09OUHJvdG9jb2xfRml4dHVyZXMKLXsKLSAgcHVibGljIHN0YXRpYyAkdGVzdEFyZ3NKU09OID0gYXJyYXkoKTsKLQotICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHBvcHVsYXRlVGVzdEFyZ3NKU09OKCkKLSAgewotICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RWb2lkJ10gPSAne30nOwotCi0gICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cmluZzEnXSA9ICd7IjEiOnsic3RyIjoiQWZyaWthYW5zLCBBbGVtYW5uaXNjaCwgQXJhZ29uXHUwMGU5cywgXHUwNjI3XHUwNjQ0XHUwNjM5XHUwNjMxXHUwNjI4XHUwNjRhXHUwNjI5LCBcdTA2NDVcdTA2MzVcdTA2MzFcdTA2NDksIEFzdHVyaWFudSwgQXltYXIgYXJ1LCBBelx1MDI1OXJiYXljYW4sIFx1MDQxMVx1MDQzMFx1MDQ0OFx1MDRhMVx1MDQzZVx1MDQ0MFx1MDQ0MiwgQm9hcmlzY2gsIFx1MDE3ZGVtYWl0XHUwMTE3XHUwMTYxa2EsIFx1MDQxMVx1MDQzNVx1MDQzYlx1MDQzMFx1MDQ0MFx1MDQ0M1x1MDQ0MVx1MDQzYVx1MDQzMFx1MDQ0ZiwgXHUwNDExXHUwNDM1XHUwNDNiXHUwNDMwXHUwNDQwXHUwNDQzXHUwNDQxXHUwNDNhXHUwNDMwXHUwNDRmIChcdTA0NDJcdTA0MzBcdTA0NDBcdTA0MzBcdTA0NDhcdTA0M2FcdTA0MzVcdTA0MzJcdTA0NTZcdTA0NDZcdTA0MzApLCBcdTA0MTFcdTA0NGFcdTA0M2JcdTA0MzNcdTA0MzBcdTA0NDBcdTA0NDFcdTA0M2FcdTA0MzgsIEJhbWFuYW5rYW4sIFx1MDlhY1x1MDliZVx1MDk4Mlx1MDliMlx1MDliZSwgQnJlemhvbmVnLCBCb3NhbnNraSwgQ2F0YWxcdTAwZTAsIE1cdTAwZWNuZy1kXHUwMTE1XHUwMzI0bmctbmdcdTFlNzNcdTAzMDQsIFx1MDQxZFx1MDQzZVx1MDQ0NVx1MDQ0N1x1MDQzOFx1MDQzOVx1MDQzZCwgQ2VidWFubywgXHUxM2UzXHUxM2IzXHUxM2E5LCBcdTAxMGNlc2t5LCBcdTA0MjFcdTA0M2JcdTA0M2VcdTA0MzJcdTA0NjNcdTAzMDFcdTA0M2RcdTA0NGNcdTA0NDFcdTA0M2FcdTA0NGEgXC8gXHUyYzE0XHUyYzBlXHUyYzExXHUyYzAyXHUyYzIxXHUyYzEwXHUyYzIwXHUyYzE0XHUyYzBkXHUyYzFmLCBcdTA0MjdcdTA0ZDFcdTA0MzJcdTA0MzBcdTA0NDhcdTA0M2JcdTA0MzAsIEN5bXJhZWcsIERhbnNrLCBaYXpha2ksIFx1MDc4Ylx1MDdhOFx1MDc4OFx1MDdhY1x1MDc4MFx1MDdhOFx1MDc4NFx1MDdhNlx1MDc5MFx1MDdiMCwgXHUwMzk1XHUwM2JiXHUwM2JiXHUwM2I3XHUwM2JkXHUwM2I5XHUwM2JhXHUwM2FjLCBFbWlsaVx1MDBlMG4gZSBydW1hZ25cdTAwZjJsLCBFbmdsaXNoLCBFc3BlcmFudG8sIEVzcGFcdTAwZjFvbCwgRWVzdGksIEV1c2thcmEsIFx1MDY0MVx1MDYyN1x1MDYzMVx1MDYzM1x1MDZjYywgU3VvbWksIFZcdTAwZjVybywgRlx1MDBmOHJveXNrdCwgRnJhblx1MDBlN2FpcywgQXJwZXRhbiwgRnVybGFuLCBGcnlzaywgR2FlaWxnZSwgXHU4ZDFiXHU4YTllLCBHXHUwMGUwaWRobGlnLCBHYWxlZ28sIEF2YVx1MDBmMWVcJ1x1MWViZCwgXHUwYTk3XHUwYWMxXHUwYTljXHUwYWIwXHUwYWJlXHUwYWE0XHUwYWMwLCBHYWVsZywgXHUwNWUyXHUwNWQxXHUwNWU4XHUwNWQ5XHUwNWVhLCBcdTA5MzlcdTA5M2ZcdTA5MjhcdTA5NGRcdTA5MjZcdTA5NDAsIEZpamkgSGluZGksIEhydmF0c2tpLCBLcmV5XHUwMGYybCBheWlzeWVuLCBNYWd5YXIsIFx1MDU0MFx1MDU2MVx1MDU3NVx1MDU2NVx1MDU4MFx1MDU2NVx1MDU3NiwgSW50ZXJsaW5ndWEsIEJhaGFzYSBJbmRvbmVzaWEsIElsb2thbm8sIElkbywgXHUwMGNkc2xlbnNrYSwgSXRhbGlhbm8sIFx1NjVlNVx1NjcyY1x1OGE5ZSwgTG9qYmFuLCBCYXNhIEphd2EsIFx1MTBlNVx1MTBkMFx1MTBlMFx1MTBkN1x1MTBlM1x1MTBkYVx1MTBkOCwgS29uZ28sIEthbGFhbGxpc3V0LCBcdTBjOTVcdTBjYThcdTBjY2RcdTBjYThcdTBjYTEsIFx1ZDU1Y1x1YWQ2ZFx1YzViNCwgXHUwNDFhXHUwNDRhXHUwNDMwXHUwNDQwXHUwNDMwXHUwNDQ3XHUwNDMwXHUwNDM5LVx1MDQxY1x1MDQzMFx1MDQzYlx1MDQzYVx1MDQ0YVx1MDQzMFx1MDQ0MCwgUmlwb2FyaXNjaCwgS3VyZFx1MDBlZSwgXHUwNDFhXHUwNDNlXHUwNDNjXHUwNDM4LCBLZXJuZXdlaywgXHUwNDFhXHUwNDRiXHUwNDQwXHUwNDMzXHUwNDRiXHUwNDM3XHUwNDQ3XHUwNDMwLCBMYXRpbmEsIExhZGlubywgTFx1MDBlYnR6ZWJ1ZXJnZXNjaCwgTGltYnVyZ3MsIExpbmdcdTAwZTFsYSwgXHUwZWE1XHUwZWIyXHUwZWE3LCBMaWV0dXZpXHUwMTczLCBMYXR2aWVcdTAxNjF1LCBCYXNhIEJhbnl1bWFzYW4sIE1hbGFnYXN5LCBcdTA0MWNcdTA0MzBcdTA0M2FcdTA0MzVcdTA0MzRcdTA0M2VcdTA0M2RcdTA0NDFcdTA0M2FcdTA0MzgsIFx1MGQyZVx1MGQzMlx1MGQyZlx1MGQzZVx1MGQzM1x1MGQwMiwgXHUwOTJlXHUwOTMwXHUwOTNlXHUwOTIwXHUwOTQwLCBCYWhhc2EgTWVsYXl1LCBcdTA2NDVcdTA2MjdcdTA2MzJcdTA2NTBcdTA2MzFcdTA2NDhcdTA2NDZcdTA2Y2MsIE5uYXB1bGl0YW5vLCBOZWRlcnNha3Npc2NoLCBcdTA5MjhcdTA5NDdcdTA5MmFcdTA5M2VcdTA5MzIgXHUwOTJkXHUwOTNlXHUwOTM3XHUwOTNlLCBOZWRlcmxhbmRzLCBcdTIwMmFOb3JzayAobnlub3JzaylcdTIwMmMsIFx1MjAyYU5vcnNrIChib2ttXHUwMGU1bClcdTIwMmMsIE5vdW9ybWFuZCwgRGluXHUwMGU5IGJpemFhZCwgT2NjaXRhbiwgXHUwNDE4XHUwNDQwXHUwNDNlXHUwNDNkXHUwNDMwXHUwNDQzLCBQYXBpYW1lbnR1LCBEZWl0c2NoLCBOb3JmdWsgXC8gUGl0a2VybiwgUG9sc2tpLCBcdTA2N2VcdTA2NDZcdTA2MmNcdTA2MjdcdTA2MjhcdTA2Y2MsIFx1MDY3ZVx1MDY5YVx1MDYyYVx1MDY0OCwgUG9ydHVndVx1MDBlYXMsIFJ1bmEgU2ltaSwgUnVtYW50c2NoLCBSb21hbmksIFJvbVx1MDBlMm5cdTAxMDMsIFx1MDQyMFx1MDQ0M1x1MDQ0MVx1MDQ0MVx1MDQzYVx1MDQzOFx1MDQzOSwgXHUwNDIxXHUwNDMwXHUwNDQ1XHUwNDMwIFx1MDQ0Mlx1MDQ0Ylx1MDQzYlx1MDQzMCwgU2FyZHUsIFNpY2lsaWFudSwgU2NvdHMsIFNcdTAwZTFtZWdpZWxsYSwgU2ltcGxlIEVuZ2xpc2gsIFNsb3Zlblx1MDEwZGluYSwgU2xvdmVuXHUwMTYxXHUwMTBkaW5hLCBcdTA0MjFcdTA0NDBcdTA0M2ZcdTA0NDFcdTA0M2FcdTA0MzggXC8gU3Jwc2tpLCBTZWVsdGVyc2ssIFN2ZW5za2EsIEtpc3dhaGlsaSwgXHUwYmE0XHUwYmFlXHUwYmJmXHUwYmI0XHUwYmNkLCBcdTBjMjRcdTBjNDZcdTBjMzJcdTBjNDFcdTBjMTdcdTBjNDEsIFx1MDQyMlx1MDQzZVx1MDRiN1x1MDQzOFx1MDQzYVx1MDRlMywgXHUwZTQ0XHUwZTE3XHUwZTIyLCBUXHUwMGZjcmttZW5cdTAwZTdlLCBUYWdhbG9nLCBUXHUwMGZjcmtcdTAwZTdlLCBcdTA0MjJcdTA0MzBcdTA0NDJcdTA0MzBcdTA0NDBcdTA0NDdcdTA0MzBcL1RhdGFyXHUwMGU3YSwgXHUwNDIzXHUwNDNhXHUwNDQwXHUwNDMwXHUwNDU3XHUwNDNkXHUwNDQxXHUwNDRjXHUwNDNhXHUwNDMwLCBcdTA2MjdcdTA2MzFcdTA2MmZcdTA2NDgsIFRpXHUxZWJmbmcgVmlcdTFlYzd0LCBWb2xhcFx1MDBmY2ssIFdhbG9uLCBXaW5hcmF5LCBcdTU0MzRcdThiZWQsIGlzaVhob3NhLCBcdTA1ZDlcdTA1ZDlcdTA1YjRcdTA1ZDNcdTA1ZDlcdTA1ZTksIFlvclx1MDBmOWJcdTAwZTEsIFplXHUwMGVhdXdzLCBcdTRlMmRcdTY1ODcsIEJcdTAwZTJuLWxcdTAwZTJtLWdcdTAwZmEsIFx1N2NiNVx1OGE5ZSJ9fSc7Ci0KLSAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RyaW5nMiddID0gJ3siMSI6eyJzdHIiOiJxdW90ZTogXFxcXFwiIGJhY2tzbGFzaDogZm9yd2FyZHNsYXNoLWVzY2FwZWQ6IFxcXFxcLyAgYmFja3NwYWNlOiBcXFxcYiBmb3JtZmVlZDogXGYgbmV3bGluZTogXG4gcmV0dXJuOiBcciB0YWI6ICBub3ctYWxsLW9mLXRoZW0tdG9nZXRoZXI6IFwiXFxcXFxcXFxcL1xcXFxiXG5cclx0IG5vdy1hLWJ1bmNoLW9mLWp1bms6ICFAIyQlJigpKCYlJCN7fXt9PD48PjwifX0nOwotCi0gICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cmluZzMnXSA9ICd7IjEiOnsic3RyIjoic3RyaW5nIHRoYXQgZW5kcyBpbiBkb3VibGUtYmFja3NsYXNoIFxcXFxcXFxcIn19JzsKLQotICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3REb3VibGUnXSA9ICd7IjEiOnsiZGJsIjozLjE0MTU5MjY1MzU4OTh9fSc7Ci0KLSAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0Qnl0ZSddID0gJ3siMSI6eyJpOCI6MX19JzsKLQotICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RJMzInXSA9ICd7IjEiOnsiaTMyIjoxMDczNzQxODI0fX0nOwotCi0gICAgaWYgKCBQSFBfSU5UX1NJWkUgPT0gOCApCi0gICAgewotICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdEk2NCddID0gJ3siMSI6eyJpNjQiOicucG93KCAyLCA2MCApLid9fSc7Ci0gICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RydWN0J10gPSAneyIxIjp7InJlYyI6eyIxIjp7InN0ciI6IndvcmtlZCJ9LCI0Ijp7Imk4IjoxfSwiOSI6eyJpMzIiOjEwNzM3NDE4MjR9LCIxMSI6eyJpNjQiOicucG93KCAyLCA2MCApLid9fX19JzsKLSAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3ROZXN0J10gPSAneyIxIjp7InJlYyI6eyIxIjp7Imk4IjoxfSwiMiI6eyJyZWMiOnsiMSI6eyJzdHIiOiJ3b3JrZWQifSwiNCI6eyJpOCI6MX0sIjkiOnsiaTMyIjoxMDczNzQxODI0fSwiMTEiOnsiaTY0IjonLnBvdyggMiwgNjAgKS4nfX19LCIzIjp7ImkzMiI6MzI3Njh9fX19JzsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RJNjQnXSA9ICd7IjEiOnsiaTY0IjoxMTUyOTIxNTA0NjA2ODQ3MDAwfX0nOwotICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cnVjdCddID0gJ3siMSI6eyJyZWMiOnsiMSI6eyJzdHIiOiJ3b3JrZWQifSwiNCI6eyJpOCI6MX0sIjkiOnsiaTMyIjoxMDczNzQxODI0fSwiMTEiOnsiaTY0IjoxMTUyOTIxNTA0NjA2ODQ3MDAwfX19fSc7Ci0gICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0TmVzdCddID0gJ3siMSI6eyJyZWMiOnsiMSI6eyJpOCI6MX0sIjIiOnsicmVjIjp7IjEiOnsic3RyIjoid29ya2VkIn0sIjQiOnsiaTgiOjF9LCI5Ijp7ImkzMiI6MTA3Mzc0MTgyNH0sIjExIjp7Imk2NCI6MTE1MjkyMTUwNDYwNjg0NzAwMH19fSwiMyI6eyJpMzIiOjMyNzY4fX19fSc7Ci0gICAgfQotCi0gICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdE1hcCddID0gJ3siMSI6eyJtYXAiOlsiaTMyIiwiaTMyIiwzLHsiNyI6NzcsIjgiOjg4LCI5Ijo5OX1dfX0nOwotCi0gICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cmluZ01hcCddID0gJ3siMSI6eyJtYXAiOlsic3RyIiwic3RyIiw2LHsiYSI6IjEyMyIsImEgYiI6IndpdGggc3BhY2VzICIsInNhbWUiOiJzYW1lIiwiMCI6Im51bWVyaWMga2V5IiwibG9uZ1ZhbHVlIjoiQWZyaWthYW5zLCBBbGVtYW5uaXNjaCwgQXJhZ29uXHUwMGU5cywgXHUwNjI3XHUwNjQ0XHUwNjM5XHUwNjMxXHUwNjI4XHUwNjRhXHUwNjI5LCBcdTA2NDVcdTA2MzVcdTA2MzFcdTA2NDksIEFzdHVyaWFudSwgQXltYXIgYXJ1LCBBelx1MDI1OXJiYXljYW4sIFx1MDQxMVx1MDQzMFx1MDQ0OFx1MDRhMVx1MDQzZVx1MDQ0MFx1MDQ0MiwgQm9hcmlzY2gsIFx1MDE3ZGVtYWl0XHUwMTE3XHUwMTYxa2EsIFx1MDQxMVx1MDQzNVx1MDQzYlx1MDQzMFx1MDQ0MFx1MDQ0M1x1MDQ0MVx1MDQzYVx1MDQzMFx1MDQ0ZiwgXHUwNDExXHUwNDM1XHUwNDNiXHUwNDMwXHUwNDQwXHUwNDQzXHUwNDQxXHUwNDNhXHUwNDMwXHUwNDRmIChcdTA0NDJcdTA0MzBcdTA0NDBcdTA0MzBcdTA0NDhcdTA0M2FcdTA0MzVcdTA0MzJcdTA0NTZcdTA0NDZcdTA0MzApLCBcdTA0MTFcdTA0NGFcdTA0M2JcdTA0MzNcdTA0MzBcdTA0NDBcdTA0NDFcdTA0M2FcdTA0MzgsIEJhbWFuYW5rYW4sIFx1MDlhY1x1MDliZVx1MDk4Mlx1MDliMlx1MDliZSwgQnJlemhvbmVnLCBCb3NhbnNraSwgQ2F0YWxcdTAwZTAsIE1cdTAwZWNuZy1kXHUwMTE1XHUwMzI0bmctbmdcdTFlNzNcdTAzMDQsIFx1MDQxZFx1MDQzZVx1MDQ0NVx1MDQ0N1x1MDQzOFx1MDQzOVx1MDQzZCwgQ2VidWFubywgXHUxM2UzXHUxM2IzXHUxM2E5LCBcdTAxMGNlc2t5LCBcdTA0MjFcdTA0M2JcdTA0M2VcdTA0MzJcdTA0NjNcdTAzMDFcdTA0M2RcdTA0NGNcdTA0NDFcdTA0M2FcdTA0NGEgXC8gXHUyYzE0XHUyYzBlXHUyYzExXHUyYzAyXHUyYzIxXHUyYzEwXHUyYzIwXHUyYzE0XHUyYzBkXHUyYzFmLCBcdTA0MjdcdTA0ZDFcdTA0MzJcdTA0MzBcdTA0NDhcdTA0M2JcdTA0MzAsIEN5bXJhZWcsIERhbnNrLCBaYXpha2ksIFx1MDc4Ylx1MDdhOFx1MDc4OFx1MDdhY1x1MDc4MFx1MDdhOFx1MDc4NFx1MDdhNlx1MDc5MFx1MDdiMCwgXHUwMzk1XHUwM2JiXHUwM2JiXHUwM2I3XHUwM2JkXHUwM2I5XHUwM2JhXHUwM2FjLCBFbWlsaVx1MDBlMG4gZSBydW1hZ25cdTAwZjJsLCBFbmdsaXNoLCBFc3BlcmFudG8sIEVzcGFcdTAwZjFvbCwgRWVzdGksIEV1c2thcmEsIFx1MDY0MVx1MDYyN1x1MDYzMVx1MDYzM1x1MDZjYywgU3VvbWksIFZcdTAwZjVybywgRlx1MDBmOHJveXNrdCwgRnJhblx1MDBlN2FpcywgQXJwZXRhbiwgRnVybGFuLCBGcnlzaywgR2FlaWxnZSwgXHU4ZDFiXHU4YTllLCBHXHUwMGUwaWRobGlnLCBHYWxlZ28sIEF2YVx1MDBmMWVcJ1x1MWViZCwgXHUwYTk3XHUwYWMxXHUwYTljXHUwYWIwXHUwYWJlXHUwYWE0XHUwYWMwLCBHYWVsZywgXHUwNWUyXHUwNWQxXHUwNWU4XHUwNWQ5XHUwNWVhLCBcdTA5MzlcdTA5M2ZcdTA5MjhcdTA5NGRcdTA5MjZcdTA5NDAsIEZpamkgSGluZGksIEhydmF0c2tpLCBLcmV5XHUwMGYybCBheWlzeWVuLCBNYWd5YXIsIFx1MDU0MFx1MDU2MVx1MDU3NVx1MDU2NVx1MDU4MFx1MDU2NVx1MDU3NiwgSW50ZXJsaW5ndWEsIEJhaGFzYSBJbmRvbmVzaWEsIElsb2thbm8sIElkbywgXHUwMGNkc2xlbnNrYSwgSXRhbGlhbm8sIFx1NjVlNVx1NjcyY1x1OGE5ZSwgTG9qYmFuLCBCYXNhIEphd2EsIFx1MTBlNVx1MTBkMFx1MTBlMFx1MTBkN1x1MTBlM1x1MTBkYVx1MTBkOCwgS29uZ28sIEthbGFhbGxpc3V0LCBcdTBjOTVcdTBjYThcdTBjY2RcdTBjYThcdTBjYTEsIFx1ZDU1Y1x1YWQ2ZFx1YzViNCwgXHUwNDFhXHUwNDRhXHUwNDMwXHUwNDQwXHUwNDMwXHUwNDQ3XHUwNDMwXHUwNDM5LVx1MDQxY1x1MDQzMFx1MDQzYlx1MDQzYVx1MDQ0YVx1MDQzMFx1MDQ0MCwgUmlwb2FyaXNjaCwgS3VyZFx1MDBlZSwgXHUwNDFhXHUwNDNlXHUwNDNjXHUwNDM4LCBLZXJuZXdlaywgXHUwNDFhXHUwNDRiXHUwNDQwXHUwNDMzXHUwNDRiXHUwNDM3XHUwNDQ3XHUwNDMwLCBMYXRpbmEsIExhZGlubywgTFx1MDBlYnR6ZWJ1ZXJnZXNjaCwgTGltYnVyZ3MsIExpbmdcdTAwZTFsYSwgXHUwZWE1XHUwZWIyXHUwZWE3LCBMaWV0dXZpXHUwMTczLCBMYXR2aWVcdTAxNjF1LCBCYXNhIEJhbnl1bWFzYW4sIE1hbGFnYXN5LCBcdTA0MWNcdTA0MzBcdTA0M2FcdTA0MzVcdTA0MzRcdTA0M2VcdTA0M2RcdTA0NDFcdTA0M2FcdTA0MzgsIFx1MGQyZVx1MGQzMlx1MGQyZlx1MGQzZVx1MGQzM1x1MGQwMiwgXHUwOTJlXHUwOTMwXHUwOTNlXHUwOTIwXHUwOTQwLCBCYWhhc2EgTWVsYXl1LCBcdTA2NDVcdTA2MjdcdTA2MzJcdTA2NTBcdTA2MzFcdTA2NDhcdTA2NDZcdTA2Y2MsIE5uYXB1bGl0YW5vLCBOZWRlcnNha3Npc2NoLCBcdTA5MjhcdTA5NDdcdTA5MmFcdTA5M2VcdTA5MzIgXHUwOTJkXHUwOTNlXHUwOTM3XHUwOTNlLCBOZWRlcmxhbmRzLCBcdTIwMmFOb3JzayAobnlub3JzaylcdTIwMmMsIFx1MjAyYU5vcnNrIChib2ttXHUwMGU1bClcdTIwMmMsIE5vdW9ybWFuZCwgRGluXHUwMGU5IGJpemFhZCwgT2NjaXRhbiwgXHUwNDE4XHUwNDQwXHUwNDNlXHUwNDNkXHUwNDMwXHUwNDQzLCBQYXBpYW1lbnR1LCBEZWl0c2NoLCBOb3JmdWsgXC8gUGl0a2VybiwgUG9sc2tpLCBcdTA2N2VcdTA2NDZcdTA2MmNcdTA2MjdcdTA2MjhcdTA2Y2MsIFx1MDY3ZVx1MDY5YVx1MDYyYVx1MDY0OCwgUG9ydHVndVx1MDBlYXMsIFJ1bmEgU2ltaSwgUnVtYW50c2NoLCBSb21hbmksIFJvbVx1MDBlMm5cdTAxMDMsIFx1MDQyMFx1MDQ0M1x1MDQ0MVx1MDQ0MVx1MDQzYVx1MDQzOFx1MDQzOSwgXHUwNDIxXHUwNDMwXHUwNDQ1XHUwNDMwIFx1MDQ0Mlx1MDQ0Ylx1MDQzYlx1MDQzMCwgU2FyZHUsIFNpY2lsaWFudSwgU2NvdHMsIFNcdTAwZTFtZWdpZWxsYSwgU2ltcGxlIEVuZ2xpc2gsIFNsb3Zlblx1MDEwZGluYSwgU2xvdmVuXHUwMTYxXHUwMTBkaW5hLCBcdTA0MjFcdTA0NDBcdTA0M2ZcdTA0NDFcdTA0M2FcdTA0MzggXC8gU3Jwc2tpLCBTZWVsdGVyc2ssIFN2ZW5za2EsIEtpc3dhaGlsaSwgXHUwYmE0XHUwYmFlXHUwYmJmXHUwYmI0XHUwYmNkLCBcdTBjMjRcdTBjNDZcdTBjMzJcdTBjNDFcdTBjMTdcdTBjNDEsIFx1MDQyMlx1MDQzZVx1MDRiN1x1MDQzOFx1MDQzYVx1MDRlMywgXHUwZTQ0XHUwZTE3XHUwZTIyLCBUXHUwMGZjcmttZW5cdTAwZTdlLCBUYWdhbG9nLCBUXHUwMGZjcmtcdTAwZTdlLCBcdTA0MjJcdTA0MzBcdTA0NDJcdTA0MzBcdTA0NDBcdTA0NDdcdTA0MzBcL1RhdGFyXHUwMGU3YSwgXHUwNDIzXHUwNDNhXHUwNDQwXHUwNDMwXHUwNDU3XHUwNDNkXHUwNDQxXHUwNDRjXHUwNDNhXHUwNDMwLCBcdTA2MjdcdTA2MzFcdTA2MmZcdTA2NDgsIFRpXHUxZWJmbmcgVmlcdTFlYzd0LCBWb2xhcFx1MDBmY2ssIFdhbG9uLCBXaW5hcmF5LCBcdTU0MzRcdThiZWQsIGlzaVhob3NhLCBcdTA1ZDlcdTA1ZDlcdTA1YjRcdTA1ZDNcdTA1ZDlcdTA1ZTksIFlvclx1MDBmOWJcdTAwZTEsIFplXHUwMGVhdXdzLCBcdTRlMmRcdTY1ODcsIEJcdTAwZTJuLWxcdTAwZTJtLWdcdTAwZmEsIFx1N2NiNVx1OGE5ZSIsIkFmcmlrYWFucywgQWxlbWFubmlzY2gsIEFyYWdvblx1MDBlOXMsIFx1MDYyN1x1MDY0NFx1MDYzOVx1MDYzMVx1MDYyOFx1MDY0YVx1MDYyOSwgXHUwNjQ1XHUwNjM1XHUwNjMxXHUwNjQ5LCBBc3R1cmlhbnUsIEF5bWFyIGFydSwgQXpcdTAyNTlyYmF5Y2FuLCBcdTA0MTFcdTA0MzBcdTA0NDhcdTA0YTFcdTA0M2VcdTA0NDBcdTA0NDIsIEJvYXJpc2NoLCBcdTAxN2RlbWFpdFx1MDExN1x1MDE2MWthLCBcdTA0MTFcdTA0MzVcdTA0M2JcdTA0MzBcdTA0NDBcdTA0NDNcdTA0NDFcdTA0M2FcdTA0MzBcdTA0NGYsIFx1MDQxMVx1MDQzNVx1MDQzYlx1MDQzMFx1MDQ0MFx1MDQ0M1x1MDQ0MVx1MDQzYVx1MDQzMFx1MDQ0ZiAoXHUwNDQyXHUwNDMwXHUwNDQwXHUwNDMwXHUwNDQ4XHUwNDNhXHUwNDM1XHUwNDMyXHUwNDU2XHUwNDQ2XHUwNDMwKSwgXHUwNDExXHUwNDRhXHUwNDNiXHUwNDMzXHUwNDMwXHUwNDQwXHUwNDQxXHUwNDNhXHUwNDM4LCBCYW1hbmFua2FuLCBcdTA5YWNcdTA5YmVcdTA5ODJcdTA5YjJcdTA5YmUsIEJyZXpob25lZywgQm9zYW5za2ksIENhdGFsXHUwMGUwLCBNXHUwMGVjbmctZFx1MDExNVx1MDMyNG5nLW5nXHUxZTczXHUwMzA0LCBcdTA0MWRcdTA0M2VcdTA0NDVcdTA0NDdcdTA0MzhcdTA0MzlcdTA0M2QsIENlYnVhbm8sIFx1MTNlM1x1MTNiM1x1MTNhOSwgXHUwMTBjZXNreSwgXHUwNDIxXHUwNDNiXHUwNDNlXHUwNDMyXHUwNDYzXHUwMzAxXHUwNDNkXHUwNDRjXHUwNDQxXHUwNDNhXHUwNDRhIFwvIFx1MmMxNFx1MmMwZVx1MmMxMVx1MmMwMlx1MmMyMVx1MmMxMFx1MmMyMFx1MmMxNFx1MmMwZFx1MmMxZiwgXHUwNDI3XHUwNGQxXHUwNDMyXHUwNDMwXHUwNDQ4XHUwNDNiXHUwNDMwLCBDeW1yYWVnLCBEYW5zaywgWmF6YWtpLCBcdTA3OGJcdTA3YThcdTA3ODhcdTA3YWNcdTA3ODBcdTA3YThcdTA3ODRcdTA3YTZcdTA3OTBcdTA3YjAsIFx1MDM5NVx1MDNiYlx1MDNiYlx1MDNiN1x1MDNiZFx1MDNiOVx1MDNiYVx1MDNhYywgRW1pbGlcdTAwZTBuIGUgcnVtYWduXHUwMGYybCwgRW5nbGlzaCwgRXNwZXJhbnRvLCBFc3BhXHUwMGYxb2wsIEVlc3RpLCBFdXNrYXJhLCBcdTA2NDFcdTA2MjdcdTA2MzFcdTA2MzNcdTA2Y2MsIFN1b21pLCBWXHUwMGY1cm8sIEZcdTAwZjhyb3lza3QsIEZyYW5cdTAwZTdhaXMsIEFycGV0YW4sIEZ1cmxhbiwgRnJ5c2ssIEdhZWlsZ2UsIFx1OGQxYlx1OGE5ZSwgR1x1MDBlMGlkaGxpZywgR2FsZWdvLCBBdmFcdTAwZjFlXCdcdTFlYmQsIFx1MGE5N1x1MGFjMVx1MGE5Y1x1MGFiMFx1MGFiZVx1MGFhNFx1MGFjMCwgR2FlbGcsIFx1MDVlMlx1MDVkMVx1MDVlOFx1MDVkOVx1MDVlYSwgXHUwOTM5XHUwOTNmXHUwOTI4XHUwOTRkXHUwOTI2XHUwOTQwLCBGaWppIEhpbmRpLCBIcnZhdHNraSwgS3JleVx1MDBmMmwgYXlpc3llbiwgTWFneWFyLCBcdTA1NDBcdTA1NjFcdTA1NzVcdTA1NjVcdTA1ODBcdTA1NjVcdTA1NzYsIEludGVybGluZ3VhLCBCYWhhc2EgSW5kb25lc2lhLCBJbG9rYW5vLCBJZG8sIFx1MDBjZHNsZW5za2EsIEl0YWxpYW5vLCBcdTY1ZTVcdTY3MmNcdThhOWUsIExvamJhbiwgQmFzYSBKYXdhLCBcdTEwZTVcdTEwZDBcdTEwZTBcdTEwZDdcdTEwZTNcdTEwZGFcdTEwZDgsIEtvbmdvLCBLYWxhYWxsaXN1dCwgXHUwYzk1XHUwY2E4XHUwY2NkXHUwY2E4XHUwY2ExLCBcdWQ1NWNcdWFkNmRcdWM1YjQsIFx1MDQxYVx1MDQ0YVx1MDQzMFx1MDQ0MFx1MDQzMFx1MDQ0N1x1MDQzMFx1MDQzOS1cdTA0MWNcdTA0MzBcdTA0M2JcdTA0M2FcdTA0NGFcdTA0MzBcdTA0NDAsIFJpcG9hcmlzY2gsIEt1cmRcdTAwZWUsIFx1MDQxYVx1MDQzZVx1MDQzY1x1MDQzOCwgS2VybmV3ZWssIFx1MDQxYVx1MDQ0Ylx1MDQ0MFx1MDQzM1x1MDQ0Ylx1MDQzN1x1MDQ0N1x1MDQzMCwgTGF0aW5hLCBMYWRpbm8sIExcdTAwZWJ0emVidWVyZ2VzY2gsIExpbWJ1cmdzLCBMaW5nXHUwMGUxbGEsIFx1MGVhNVx1MGViMlx1MGVhNywgTGlldHV2aVx1MDE3MywgTGF0dmllXHUwMTYxdSwgQmFzYSBCYW55dW1hc2FuLCBNYWxhZ2FzeSwgXHUwNDFjXHUwNDMwXHUwNDNhXHUwNDM1XHUwNDM0XHUwNDNlXHUwNDNkXHUwNDQxXHUwNDNhXHUwNDM4LCBcdTBkMmVcdTBkMzJcdTBkMmZcdTBkM2VcdTBkMzNcdTBkMDIsIFx1MDkyZVx1MDkzMFx1MDkzZVx1MDkyMFx1MDk0MCwgQmFoYXNhIE1lbGF5dSwgXHUwNjQ1XHUwNjI3XHUwNjMyXHUwNjUwXHUwNjMxXHUwNjQ4XHUwNjQ2XHUwNmNjLCBObmFwdWxpdGFubywgTmVkZXJzYWtzaXNjaCwgXHUwOTI4XHUwOTQ3XHUwOTJhXHUwOTNlXHUwOTMyIFx1MDkyZFx1MDkzZVx1MDkzN1x1MDkzZSwgTmVkZXJsYW5kcywgXHUyMDJhTm9yc2sgKG55bm9yc2spXHUyMDJjLCBcdTIwMmFOb3JzayAoYm9rbVx1MDBlNWwpXHUyMDJjLCBOb3Vvcm1hbmQsIERpblx1MDBlOSBiaXphYWQsIE9jY2l0YW4sIFx1MDQxOFx1MDQ0MFx1MDQzZVx1MDQzZFx1MDQzMFx1MDQ0MywgUGFwaWFtZW50dSwgRGVpdHNjaCwgTm9yZnVrIFwvIFBpdGtlcm4sIFBvbHNraSwgXHUwNjdlXHUwNjQ2XHUwNjJjXHUwNjI3XHUwNjI4XHUwNmNjLCBcdTA2N2VcdTA2OWFcdTA2MmFcdTA2NDgsIFBvcnR1Z3VcdTAwZWFzLCBSdW5hIFNpbWksIFJ1bWFudHNjaCwgUm9tYW5pLCBSb21cdTAwZTJuXHUwMTAzLCBcdTA0MjBcdTA0NDNcdTA0NDFcdTA0NDFcdTA0M2FcdTA0MzhcdTA0MzksIFx1MDQyMVx1MDQzMFx1MDQ0NVx1MDQzMCBcdTA0NDJcdTA0NGJcdTA0M2JcdTA0MzAsIFNhcmR1LCBTaWNpbGlhbnUsIFNjb3RzLCBTXHUwMGUxbWVnaWVsbGEsIFNpbXBsZSBFbmdsaXNoLCBTbG92ZW5cdTAxMGRpbmEsIFNsb3Zlblx1MDE2MVx1MDEwZGluYSwgXHUwNDIxXHUwNDQwXHUwNDNmXHUwNDQxXHUwNDNhXHUwNDM4IFwvIFNycHNraSwgU2VlbHRlcnNrLCBTdmVuc2thLCBLaXN3YWhpbGksIFx1MGJhNFx1MGJhZVx1MGJiZlx1MGJiNFx1MGJjZCwgXHUwYzI0XHUwYzQ2XHUwYzMyXHUwYzQxXHUwYzE3XHUwYzQxLCBcdTA0MjJcdTA0M2VcdTA0YjdcdTA0MzhcdTA0M2FcdTA0ZTMsIFx1MGU0NFx1MGUxN1x1MGUyMiwgVFx1MDBmY3JrbWVuXHUwMGU3ZSwgVGFnYWxvZywgVFx1MDBmY3JrXHUwMGU3ZSwgXHUwNDIyXHUwNDMwXHUwNDQyXHUwNDMwXHUwNDQwXHUwNDQ3XHUwNDMwXC9UYXRhclx1MDBlN2EsIFx1MDQyM1x1MDQzYVx1MDQ0MFx1MDQzMFx1MDQ1N1x1MDQzZFx1MDQ0MVx1MDQ0Y1x1MDQzYVx1MDQzMCwgXHUwNjI3XHUwNjMxXHUwNjJmXHUwNjQ4LCBUaVx1MWViZm5nIFZpXHUxZWM3dCwgVm9sYXBcdTAwZmNrLCBXYWxvbiwgV2luYXJheSwgXHU1NDM0XHU4YmVkLCBpc2lYaG9zYSwgXHUwNWQ5XHUwNWQ5XHUwNWI0XHUwNWQzXHUwNWQ5XHUwNWU5LCBZb3JcdTAwZjliXHUwMGUxLCBaZVx1MDBlYXV3cywgXHU0ZTJkXHU2NTg3LCBCXHUwMGUybi1sXHUwMGUybS1nXHUwMGZhLCBcdTdjYjVcdThhOWUiOiJsb25nIGtleSJ9XX19JzsKLQotICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTZXQnXSA9ICd7IjEiOnsic2V0IjpbImkzMiIsMywxLDUsNl19fSc7Ci0KLSAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0TGlzdCddID0gJ3siMSI6eyJsc3QiOlsiaTMyIiwzLDEsMiwzXX19JzsKLQotICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RFbnVtJ10gPSAneyIxIjp7ImkzMiI6MX19JzsKLQotICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RUeXBlZGVmJ10gPSAneyIxIjp7Imk2NCI6Njl9fSc7Ci0KLSAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0TWFwTWFwJ10gPSAneyIwIjp7Im1hcCI6WyJpMzIiLCJtYXAiLDIseyI0IjpbImkzMiIsImkzMiIsNCx7IjEiOjEsIjIiOjIsIjMiOjMsIjQiOjR9XSwiLTQiOlsiaTMyIiwiaTMyIiw0LHsiLTQiOi00LCItMyI6LTMsIi0yIjotMiwiLTEiOi0xfV19XX19JzsKLQotICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RJbnNhbml0eSddID0gJ3siMCI6eyJtYXAiOlsiaTY0IiwibWFwIiwyLHsiMSI6WyJpMzIiLCJyZWMiLDIseyIyIjp7IjEiOnsibWFwIjpbImkzMiIsImk2NCIsMix7IjUiOjUsIjgiOjh9XX0sIjIiOnsibHN0IjpbInJlYyIsMix7IjEiOnsic3RyIjoiR29vZGJ5ZTQifSwiNCI6eyJpOCI6NH0sIjkiOnsiaTMyIjo0fSwiMTEiOnsiaTY0Ijo0fX0seyIxIjp7InN0ciI6IkhlbGxvMiJ9LCI0Ijp7Imk4IjoyfSwiOSI6eyJpMzIiOjJ9LCIxMSI6eyJpNjQiOjJ9fV19fSwiMyI6eyIxIjp7Im1hcCI6WyJpMzIiLCJpNjQiLDIseyI1Ijo1LCI4Ijo4fV19LCIyIjp7ImxzdCI6WyJyZWMiLDIseyIxIjp7InN0ciI6Ikdvb2RieWU0In0sIjQiOnsiaTgiOjR9LCI5Ijp7ImkzMiI6NH0sIjExIjp7Imk2NCI6NH19LHsiMSI6eyJzdHIiOiJIZWxsbzIifSwiNCI6eyJpOCI6Mn0sIjkiOnsiaTMyIjoyfSwiMTEiOnsiaTY0IjoyfX1dfX19XSwiMiI6WyJpMzIiLCJyZWMiLDEseyI2Ijp7fX1dfV19fSc7Ci0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvbGliL3BocC90ZXN0L1Rlc3QvVGhyaWZ0L1Rlc3RWYWxpZGF0b3JzLnBocCBiL2xpYi9waHAvdGVzdC9UZXN0L1RocmlmdC9UZXN0VmFsaWRhdG9ycy5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjOTI0MDQuLjAwMDAwMDAKLS0tIGEvbGliL3BocC90ZXN0L1Rlc3QvVGhyaWZ0L1Rlc3RWYWxpZGF0b3JzLnBocAorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi08P3BocAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1uYW1lc3BhY2UgdGVzdFxwaHA7Ci0KLXJlcXVpcmVfb25jZSBfX0RJUl9fLicvLi4vLi4vLi4vbGliL1RocmlmdC9DbGFzc0xvYWRlci9UaHJpZnRDbGFzc0xvYWRlci5waHAnOwotCi11c2UgVGhyaWZ0XENsYXNzTG9hZGVyXFRocmlmdENsYXNzTG9hZGVyOwotdXNlIFRocmlmdFxFeGNlcHRpb25cVFByb3RvY29sRXhjZXB0aW9uOwotdXNlIFRocmlmdFxQcm90b2NvbFxUQmluYXJ5UHJvdG9jb2w7Ci11c2UgVGhyaWZ0XFRyYW5zcG9ydFxUTWVtb3J5QnVmZmVyOwotCi0kb29wX21vZGUgPSAoaXNzZXQoJGFyZ3ZbMV0pICYmICRhcmd2WzFdID09PSAnLW9vcCcpOwotJEdFTl9ESVIgPSAkb29wX21vZGUgPyAncGhwdm8nIDogJ3BocHYnOwotCi0kbG9hZGVyID0gbmV3IFRocmlmdENsYXNzTG9hZGVyKCk7Ci0kbG9hZGVyLT5yZWdpc3Rlck5hbWVzcGFjZSgnVGhyaWZ0JywgX19ESVJfXyAuICcvLi4vLi4vLi4vbGliJyk7Ci0kbG9hZGVyLT5yZWdpc3RlckRlZmluaXRpb24oJ1RocmlmdFRlc3QnLCBfX0RJUl9fIC4gJy8uLi8uLi9wYWNrYWdlcy8nIC4gJEdFTl9ESVIpOwotJGxvYWRlci0+cmVnaXN0ZXJEZWZpbml0aW9uKCdUZXN0VmFsaWRhdG9ycycsIF9fRElSX18gLiAnLy4uLy4uL3BhY2thZ2VzLycgLiAkR0VOX0RJUik7Ci0kbG9hZGVyLT5yZWdpc3RlcigpOwotCi0vLyBXb3VsZCBiZSBuaWNlIHRvIGhhdmUgUEhQVW5pdCBoZXJlLCBidXQgZm9yIG5vdyBqdXN0IGhhY2sgaXQuCi0KLXNldF9leGNlcHRpb25faGFuZGxlcihmdW5jdGlvbigkZSkgewotICAgIG15X2Fzc2VydChmYWxzZSwgIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIGNhdWdodDogIiAuICRlLT5nZXRNZXNzYWdlKCkpOwotfSk7Ci0KLXNldF9lcnJvcl9oYW5kbGVyKGZ1bmN0aW9uKCRlcnJubywgJGVycm1zZykgewotICAgIG15X2Fzc2VydChmYWxzZSwgIlVuZXhwZWN0ZWQgUEhQIGVycm9yOiAiIC4gJGVycm1zZyk7Ci19KTsKLQotLy8gRW1wdHkgc3RydWN0cyBzaG91bGQgbm90IGhhdmUgdmFsaWRhdG9ycwotYXNzZXJ0X2hhc19ub19yZWFkX3ZhbGlkYXRvcignVGhyaWZ0VGVzdFxFbXB0eVN0cnVjdCcpOwotYXNzZXJ0X2hhc19ub193cml0ZV92YWxpZGF0b3IoJ1RocmlmdFRlc3RcRW1wdHlTdHJ1Y3QnKTsKLQotLy8gQm9uayBoYXMgb25seSBvcHRfaW5fcmVxX291dCBmaWVsZHMKLXsKLSAgICBhc3NlcnRfaGFzX25vX3JlYWRfdmFsaWRhdG9yKCdUaHJpZnRUZXN0XEJvbmsnKTsKLSAgICBhc3NlcnRfaGFzX2Ffd3JpdGVfdmFsaWRhdG9yKCdUaHJpZnRUZXN0XEJvbmsnKTsKLSAgICB7Ci0gICAgICAgIC8vIENoZWNrIHRoYXQgd2UgY2FuIHJlYWQgYW4gZW1wdHkgb2JqZWN0Ci0gICAgICAgICRib25rID0gbmV3IFxUaHJpZnRUZXN0XEJvbmsoKTsKLSAgICAgICAgJHRyYW5zcG9ydCA9IG5ldyBUTWVtb3J5QnVmZmVyKCJcMDAwIik7Ci0gICAgICAgICRwcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2woJHRyYW5zcG9ydCk7Ci0gICAgICAgICRib25rLT5yZWFkKCRwcm90b2NvbCk7Ci0gICAgfQotICAgIHsKLSAgICAgICAgLy8gLi4uYnV0IG5vdCB3cml0ZSBhbiBlbXB0eSBvYmplY3QKLSAgICAgICAgJGJvbmsgPSBuZXcgXFRocmlmdFRlc3RcQm9uaygpOwotICAgICAgICAkdHJhbnNwb3J0ID0gbmV3IFRNZW1vcnlCdWZmZXIoKTsKLSAgICAgICAgJHByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbCgkdHJhbnNwb3J0KTsKLSAgICAgICAgYXNzZXJ0X3Byb3RvY29sX2V4Y2VwdGlvbl90aHJvd24oZnVuY3Rpb24oKSB1c2UgKCRib25rLCAkcHJvdG9jb2wpIHsgJGJvbmstPndyaXRlKCRwcm90b2NvbCk7IH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdCb25rIHdhcyBhYmxlIHRvIHdyaXRlIGFuIGVtcHR5IG9iamVjdCcpOwotICAgIH0KLX0KLQotLy8gU3RydWN0QSBoYXMgYSBzaW5nbGUgcmVxdWlyZWQgZmllbGQKLXsKLSAgICBhc3NlcnRfaGFzX2FfcmVhZF92YWxpZGF0b3IoJ1RocmlmdFRlc3RcU3RydWN0QScpOwotICAgIGFzc2VydF9oYXNfYV93cml0ZV92YWxpZGF0b3IoJ1RocmlmdFRlc3RcU3RydWN0QScpOwotICAgIHsKLSAgICAgICAgLy8gQ2hlY2sgdGhhdCB3ZSBhcmUgbm90IGFibGUgdG8gd3JpdGUgU3RydWN0QSB3aXRoIGEgbWlzc2luZyByZXF1aXJlZCBmaWVsZAotICAgICAgICAkc3RydWN0YSA9IG5ldyBcVGhyaWZ0VGVzdFxTdHJ1Y3RBKCk7Ci0gICAgICAgICR0cmFuc3BvcnQgPSBuZXcgVE1lbW9yeUJ1ZmZlcigpOwotICAgICAgICAkcHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKCR0cmFuc3BvcnQpOwotICAgICAgICBhc3NlcnRfcHJvdG9jb2xfZXhjZXB0aW9uX3Rocm93bihmdW5jdGlvbigpIHVzZSAoJHN0cnVjdGEsICRwcm90b2NvbCkgeyAkc3RydWN0YS0+d3JpdGUoJHByb3RvY29sKTsgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1N0cnVjdEEgd2FzIGFibGUgdG8gd3JpdGUgYW4gZW1wdHkgb2JqZWN0Jyk7Ci0gICAgfQotICAgIHsKLSAgICAgICAgLy8gQ2hlY2sgdGhhdCB3ZSBhcmUgYWJsZSB0byByZWFkIGFuZCB3cml0ZSBhIG1lc3NhZ2Ugd2l0aCBhIGdvb2QgU3RydWN0QQotICAgICAgICAkdHJhbnNwb3J0ID0gbmV3IFRNZW1vcnlCdWZmZXIoYmFzZTY0X2RlY29kZSgnQ3dBQkFBQUFBMkZpWXdBPScpKTsKLSAgICAgICAgJHByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbCgkdHJhbnNwb3J0KTsKLSAgICAgICAgJHN0cnVjdGEgPSBuZXcgXFRocmlmdFRlc3RcU3RydWN0QSgpOwotICAgICAgICAkc3RydWN0YS0+cmVhZCgkcHJvdG9jb2wpOwotICAgICAgICAkc3RydWN0YS0+d3JpdGUoJHByb3RvY29sKTsKLSAgICB9Ci19Ci0KLS8vIFVuaW9ucyBzaG91bGQgbm90IGdldCB3cml0ZSB2YWxpZGF0b3JzCi1hc3NlcnRfaGFzX25vX3dyaXRlX3ZhbGlkYXRvcignVGVzdFZhbGlkYXRvcnNcVW5pb25PZlN0cmluZ3MnKTsKLQotLy8gU2VydmljZSBfcmVzdWx0IGNsYXNzZXMgc2hvdWxkIG5vdCBnZXQgYW55IHZhbGlkYXRvcnMKLWFzc2VydF9oYXNfbm9fcmVhZF92YWxpZGF0b3IoJ1Rlc3RWYWxpZGF0b3JzXFRlc3RTZXJ2aWNlX3Rlc3RfcmVzdWx0Jyk7Ci1hc3NlcnRfaGFzX25vX3dyaXRlX3ZhbGlkYXRvcignVGVzdFZhbGlkYXRvcnNcVGVzdFNlcnZpY2VfdGVzdF9yZXN1bHQnKTsKLQotZnVuY3Rpb24gYXNzZXJ0X2hhc19hX3JlYWRfdmFsaWRhdG9yKCRjbGFzcykgewotICAgIG15X2Fzc2VydChoYXNfcmVhZF92YWxpZGF0b3JfbWV0aG9kKCRjbGFzcyksCi0gICAgICAgICAgICAgICRjbGFzcyAuICcgY2xhc3Mgc2hvdWxkIGhhdmUgYSByZWFkIHZhbGlkYXRvcicpOwotfQotCi1mdW5jdGlvbiBhc3NlcnRfaGFzX25vX3JlYWRfdmFsaWRhdG9yKCRjbGFzcykgewotICAgIG15X2Fzc2VydCghaGFzX3JlYWRfdmFsaWRhdG9yX21ldGhvZCgkY2xhc3MpLAotICAgICAgICAgICAgICAkY2xhc3MgLiAnIGNsYXNzIHNob3VsZCBub3QgaGF2ZSBhIHJlYWQgdmFsaWRhdG9yJyk7Ci19Ci0KLWZ1bmN0aW9uIGFzc2VydF9oYXNfYV93cml0ZV92YWxpZGF0b3IoJGNsYXNzKSB7Ci0gICAgbXlfYXNzZXJ0KGhhc193cml0ZV92YWxpZGF0b3JfbWV0aG9kKCRjbGFzcyksCi0gICAgICAgICAgICAgICRjbGFzcyAuICcgY2xhc3Mgc2hvdWxkIGhhdmUgYSB3cml0ZSB2YWxpZGF0b3InKTsKLX0KLQotZnVuY3Rpb24gYXNzZXJ0X2hhc19ub193cml0ZV92YWxpZGF0b3IoJGNsYXNzKSB7Ci0gICAgbXlfYXNzZXJ0KCFoYXNfd3JpdGVfdmFsaWRhdG9yX21ldGhvZCgkY2xhc3MpLAotICAgICAgICAgICAgICAkY2xhc3MgLiAnIGNsYXNzIHNob3VsZCBub3QgaGF2ZSBhIHdyaXRlIHZhbGlkYXRvcicpOwotfQotCi1mdW5jdGlvbiBhc3NlcnRfcHJvdG9jb2xfZXhjZXB0aW9uX3Rocm93bigkY2FsbGFibGUsICRtZXNzYWdlKSB7Ci0gICAgdHJ5IHsKLSAgICAgICAgY2FsbF91c2VyX2Z1bmMoJGNhbGxhYmxlKTsKLSAgICAgICAgbXlfYXNzZXJ0KGZhbHNlLCAkbWVzc2FnZSk7Ci0gICAgfSBjYXRjaCAoVFByb3RvY29sRXhjZXB0aW9uICRlKSB7Ci0gICAgfQotfQotCi1mdW5jdGlvbiBoYXNfd3JpdGVfdmFsaWRhdG9yX21ldGhvZCgkY2xhc3MpIHsKLSAgICAkcmMgPSBuZXcgXFJlZmxlY3Rpb25DbGFzcygkY2xhc3MpOwotICAgIHJldHVybiAkcmMtPmhhc01ldGhvZCgnX3ZhbGlkYXRlRm9yV3JpdGUnKTsKLX0KLQotZnVuY3Rpb24gaGFzX3JlYWRfdmFsaWRhdG9yX21ldGhvZCgkY2xhc3MpIHsKLSAgICAkcmMgPSBuZXcgXFJlZmxlY3Rpb25DbGFzcygkY2xhc3MpOwotICAgIHJldHVybiAkcmMtPmhhc01ldGhvZCgnX3ZhbGlkYXRlRm9yUmVhZCcpOwotfQotCi1mdW5jdGlvbiBteV9hc3NlcnQoJHNvbWV0aGluZywgJG1lc3NhZ2UpIHsKLSAgICBpZiAoISRzb21ldGhpbmcpIHsKLSAgICAgICAgZndyaXRlKFNUREVSUiwgYmFzZW5hbWUoX19GSUxFX18pIC4gIiBGQUlMRUQ6ICRtZXNzYWdlXG4iKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9saWIvcGhwL3Rlc3QvVmFsaWRhdG9yL0Jhc2VWYWxpZGF0b3JUZXN0LnBocCBiL2xpYi9waHAvdGVzdC9WYWxpZGF0b3IvQmFzZVZhbGlkYXRvclRlc3QucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwMjkwODMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL3Rlc3QvVmFsaWRhdG9yL0Jhc2VWYWxpZGF0b3JUZXN0LnBocApAQCAtMCwwICsxLDE1NCBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworbmFtZXNwYWNlIFRlc3RcVGhyaWZ0OworCit1c2UgUEhQVW5pdFxGcmFtZXdvcmtcVGVzdENhc2U7Cit1c2UgVGhyaWZ0XEV4Y2VwdGlvblxUUHJvdG9jb2xFeGNlcHRpb247Cit1c2UgVGhyaWZ0XFByb3RvY29sXFRCaW5hcnlQcm90b2NvbDsKK3VzZSBUaHJpZnRcVHJhbnNwb3J0XFRNZW1vcnlCdWZmZXI7CisKK2Fic3RyYWN0IGNsYXNzIEJhc2VWYWxpZGF0b3JUZXN0IGV4dGVuZHMgVGVzdENhc2UKK3sKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdEVtcHR5U3RydWN0VmFsaWRhdG9yKCkKKyAgICB7CisgICAgICAgICR0aGlzLT5hc3NlcnROb1JlYWRWYWxpZGF0b3IoJ1RocmlmdFRlc3RcRW1wdHlTdHJ1Y3QnKTsKKyAgICAgICAgJHRoaXMtPmFzc2VydE5vV3JpdGVWYWxpZGF0b3IoJ1RocmlmdFRlc3RcRW1wdHlTdHJ1Y3QnKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdEJvbmtWYWxpZGF0b3IoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmFzc2VydE5vUmVhZFZhbGlkYXRvcignVGhyaWZ0VGVzdFxCb25rJyk7CisgICAgICAgICR0aGlzLT5hc3NlcnRIYXNXcml0ZVZhbGlkYXRvcignVGhyaWZ0VGVzdFxCb25rJyk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RTdHJ1Y3RBVmFsaWRhdG9yKCkKKyAgICB7CisgICAgICAgICR0aGlzLT5hc3NlcnRIYXNSZWFkVmFsaWRhdG9yKCdUaHJpZnRUZXN0XFN0cnVjdEEnKTsKKyAgICAgICAgJHRoaXMtPmFzc2VydEhhc1dyaXRlVmFsaWRhdG9yKCdUaHJpZnRUZXN0XFN0cnVjdEEnKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFVuaW9uT2ZTdHJpbmdzVmFsaWRhdG9yKCkKKyAgICB7CisgICAgICAgICR0aGlzLT5hc3NlcnROb1dyaXRlVmFsaWRhdG9yKCdUZXN0VmFsaWRhdG9yc1xVbmlvbk9mU3RyaW5ncycpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U2VydmljZVJlc3VsdFZhbGlkYXRvcigpCisgICAgeworICAgICAgICAkdGhpcy0+YXNzZXJ0Tm9SZWFkVmFsaWRhdG9yKCdUZXN0VmFsaWRhdG9yc1xUZXN0U2VydmljZV90ZXN0X3Jlc3VsdCcpOworICAgICAgICAkdGhpcy0+YXNzZXJ0Tm9Xcml0ZVZhbGlkYXRvcignVGVzdFZhbGlkYXRvcnNcVGVzdFNlcnZpY2VfdGVzdF9yZXN1bHQnKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFJlYWRFbXB0eSgpCisgICAgeworICAgICAgICAkYm9uayA9IG5ldyBcVGhyaWZ0VGVzdFxCb25rKCk7CisgICAgICAgICR0cmFuc3BvcnQgPSBuZXcgVE1lbW9yeUJ1ZmZlcigiXDAwMCIpOworICAgICAgICAkcHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKCR0cmFuc3BvcnQpOworICAgICAgICAkYm9uay0+cmVhZCgkcHJvdG9jb2wpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0V3JpdGVFbXB0eSgpCisgICAgeworICAgICAgICAkYm9uayA9IG5ldyBcVGhyaWZ0VGVzdFxCb25rKCk7CisgICAgICAgICR0cmFuc3BvcnQgPSBuZXcgVE1lbW9yeUJ1ZmZlcigpOworICAgICAgICAkcHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKCR0cmFuc3BvcnQpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgJGJvbmstPndyaXRlKCRwcm90b2NvbCk7CisgICAgICAgICAgICAkdGhpcy0+ZmFpbCgnQm9uayB3YXMgYWJsZSB0byB3cml0ZSBhbiBlbXB0eSBvYmplY3QnKTsKKyAgICAgICAgfSBjYXRjaCAoVFByb3RvY29sRXhjZXB0aW9uICRlKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFdyaXRlV2l0aE1pc3NpbmdSZXF1aXJlZCgpCisgICAgeworICAgICAgICAvLyBDaGVjayB0aGF0IHdlIGFyZSBub3QgYWJsZSB0byB3cml0ZSBTdHJ1Y3RBIHdpdGggYSBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkCisgICAgICAgICRzdHJ1Y3RhID0gbmV3IFxUaHJpZnRUZXN0XFN0cnVjdEEoKTsKKyAgICAgICAgJHRyYW5zcG9ydCA9IG5ldyBUTWVtb3J5QnVmZmVyKCk7CisgICAgICAgICRwcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2woJHRyYW5zcG9ydCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICRzdHJ1Y3RhLT53cml0ZSgkcHJvdG9jb2wpOworICAgICAgICAgICAgJHRoaXMtPmZhaWwoJ1N0cnVjdEEgd2FzIGFibGUgdG8gd3JpdGUgYW4gZW1wdHkgb2JqZWN0Jyk7CisgICAgICAgIH0gY2F0Y2ggKFRQcm90b2NvbEV4Y2VwdGlvbiAkZSkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RSZWFkU3RydWN0QSgpCisgICAgeworICAgICAgICAkdHJhbnNwb3J0ID0gbmV3IFRNZW1vcnlCdWZmZXIoYmFzZTY0X2RlY29kZSgnQ3dBQkFBQUFBMkZpWXdBPScpKTsKKyAgICAgICAgJHByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbCgkdHJhbnNwb3J0KTsKKyAgICAgICAgJHN0cnVjdGEgPSBuZXcgXFRocmlmdFRlc3RcU3RydWN0QSgpOworICAgICAgICAkc3RydWN0YS0+cmVhZCgkcHJvdG9jb2wpOworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCJhYmMiLCAkc3RydWN0YS0+cyk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RXcml0ZVN0cnVjdEEoKQorICAgIHsKKyAgICAgICAgJHRyYW5zcG9ydCA9IG5ldyBUTWVtb3J5QnVmZmVyKCk7CisgICAgICAgICRwcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2woJHRyYW5zcG9ydCk7CisgICAgICAgICRzdHJ1Y3RhID0gbmV3IFxUaHJpZnRUZXN0XFN0cnVjdEEoKTsKKyAgICAgICAgJHN0cnVjdGEtPnMgPSAiYWJjIjsKKyAgICAgICAgJHN0cnVjdGEtPndyaXRlKCRwcm90b2NvbCk7CisgICAgICAgICR3cml0ZVJlc3VsdCA9IGJhc2U2NF9lbmNvZGUoJHRyYW5zcG9ydC0+Z2V0QnVmZmVyKCkpOworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCdDd0FCQUFBQUEyRmlZd0E9JywgJHdyaXRlUmVzdWx0KTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZ1bmN0aW9uIGFzc2VydEhhc1JlYWRWYWxpZGF0b3IoJGNsYXNzKQorICAgIHsKKyAgICAgICAgaWYgKCFzdGF0aWM6Omhhc1JlYWRWYWxpZGF0b3IoJGNsYXNzKSkgeworICAgICAgICAgICAgc3RhdGljOjpmYWlsKCRjbGFzcyAuICcgY2xhc3Mgc2hvdWxkIGhhdmUgYSByZWFkIHZhbGlkYXRvcicpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmdW5jdGlvbiBhc3NlcnROb1JlYWRWYWxpZGF0b3IoJGNsYXNzKQorICAgIHsKKyAgICAgICAgaWYgKHN0YXRpYzo6aGFzUmVhZFZhbGlkYXRvcigkY2xhc3MpKSB7CisgICAgICAgICAgICBzdGF0aWM6OmZhaWwoJGNsYXNzIC4gJyBjbGFzcyBzaG91bGQgbm90IGhhdmUgYSB3cml0ZSB2YWxpZGF0b3InKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBzdGF0aWMgZnVuY3Rpb24gYXNzZXJ0SGFzV3JpdGVWYWxpZGF0b3IoJGNsYXNzKQorICAgIHsKKyAgICAgICAgaWYgKCFzdGF0aWM6Omhhc1dyaXRlVmFsaWRhdG9yKCRjbGFzcykpIHsKKyAgICAgICAgICAgIHN0YXRpYzo6ZmFpbCgkY2xhc3MgLiAnIGNsYXNzIHNob3VsZCBoYXZlIGEgd3JpdGUgdmFsaWRhdG9yJyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZ1bmN0aW9uIGFzc2VydE5vV3JpdGVWYWxpZGF0b3IoJGNsYXNzKQorICAgIHsKKyAgICAgICAgaWYgKHN0YXRpYzo6aGFzV3JpdGVWYWxpZGF0b3IoJGNsYXNzKSkgeworICAgICAgICAgICAgc3RhdGljOjpmYWlsKCRjbGFzcyAuICcgY2xhc3Mgc2hvdWxkIG5vdCBoYXZlIGEgd3JpdGUgdmFsaWRhdG9yJyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBoYXNSZWFkVmFsaWRhdG9yKCRjbGFzcykKKyAgICB7CisgICAgICAgICRyYyA9IG5ldyBcUmVmbGVjdGlvbkNsYXNzKCRjbGFzcyk7CisKKyAgICAgICAgcmV0dXJuICRyYy0+aGFzTWV0aG9kKCdfdmFsaWRhdGVGb3JSZWFkJyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gaGFzV3JpdGVWYWxpZGF0b3IoJGNsYXNzKQorICAgIHsKKyAgICAgICAgJHJjID0gbmV3IFxSZWZsZWN0aW9uQ2xhc3MoJGNsYXNzKTsKKworICAgICAgICByZXR1cm4gJHJjLT5oYXNNZXRob2QoJ192YWxpZGF0ZUZvcldyaXRlJyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC90ZXN0L1ZhbGlkYXRvci9WYWxpZGF0b3JUZXN0LnBocCBiL2xpYi9waHAvdGVzdC9WYWxpZGF0b3IvVmFsaWRhdG9yVGVzdC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE2YzdhOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvdGVzdC9WYWxpZGF0b3IvVmFsaWRhdG9yVGVzdC5waHAKQEAgLTAsMCArMSw0MSBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworbmFtZXNwYWNlIFRlc3RcVGhyaWZ0OworCityZXF1aXJlIF9fRElSX18gLiAnLy4uLy4uLy4uLy4uL3ZlbmRvci9hdXRvbG9hZC5waHAnOworCit1c2UgVGhyaWZ0XENsYXNzTG9hZGVyXFRocmlmdENsYXNzTG9hZGVyOworCisvKioKKyAqIENsYXNzIFRlc3RWYWxpZGF0b3JzCisgKiBAcGFja2FnZSBUZXN0XFRocmlmdAorICoKKyAqIEBydW5UZXN0c0luU2VwYXJhdGVQcm9jZXNzZXMKKyAqLworY2xhc3MgVmFsaWRhdG9yVGVzdCBleHRlbmRzIEJhc2VWYWxpZGF0b3JUZXN0Cit7CisgICAgcHVibGljIGZ1bmN0aW9uIHNldFVwKCkKKyAgICB7CisgICAgICAgIC8qKiBAdmFyIFxDb21wb3NlclxBdXRvbG9hZFxDbGFzc0xvYWRlciAkbG9hZGVyICovCisgICAgICAgICRsb2FkZXIgPSByZXF1aXJlIF9fRElSX18gLiAnLy4uLy4uLy4uLy4uL3ZlbmRvci9hdXRvbG9hZC5waHAnOworICAgICAgICAkbG9hZGVyLT5hZGRQc3I0KCcnLCBfX0RJUl9fIC4gJy8uLi9wYWNrYWdlcy9waHB2Jyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC90ZXN0L1ZhbGlkYXRvci9WYWxpZGF0b3JUZXN0T29wLnBocCBiL2xpYi9waHAvdGVzdC9WYWxpZGF0b3IvVmFsaWRhdG9yVGVzdE9vcC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNiY2E0ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvdGVzdC9WYWxpZGF0b3IvVmFsaWRhdG9yVGVzdE9vcC5waHAKQEAgLTAsMCArMSw0MSBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworbmFtZXNwYWNlIFRlc3RcVGhyaWZ0OworCityZXF1aXJlX29uY2UgX19ESVJfXyAuICcvLi4vLi4vLi4vLi4vdmVuZG9yL2F1dG9sb2FkLnBocCc7CisKK3VzZSBUaHJpZnRcQ2xhc3NMb2FkZXJcVGhyaWZ0Q2xhc3NMb2FkZXI7CisKKy8qKgorICogQ2xhc3MgVGVzdFZhbGlkYXRvcnNPb3AKKyAqIEBwYWNrYWdlIFRlc3RcVGhyaWZ0CisgKgorICogQHJ1blRlc3RzSW5TZXBhcmF0ZVByb2Nlc3NlcworICovCitjbGFzcyBWYWxpZGF0b3JUZXN0T29wIGV4dGVuZHMgQmFzZVZhbGlkYXRvclRlc3QKK3sKKyAgICBwdWJsaWMgZnVuY3Rpb24gc2V0VXAoKQorICAgIHsKKyAgICAgICAgLyoqIEB2YXIgXENvbXBvc2VyXEF1dG9sb2FkXENsYXNzTG9hZGVyICRsb2FkZXIgKi8KKyAgICAgICAgJGxvYWRlciA9IHJlcXVpcmUgX19ESVJfXyAuICcvLi4vLi4vLi4vLi4vdmVuZG9yL2F1dG9sb2FkLnBocCc7CisgICAgICAgICRsb2FkZXItPmFkZFBzcjQoJycsIF9fRElSX18gLiAnLy4uL3BhY2thZ2VzL3BocHZvJyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3B5L0NNYWtlTGlzdHMudHh0IGIvbGliL3B5L0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiYjkxZmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHkvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwzMSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2luY2x1ZGVfZGlyZWN0b3JpZXMoJHtQWVRIT05fSU5DTFVERV9ESVJTfSkKKworYWRkX2N1c3RvbV90YXJnZXQocHl0aG9uX2J1aWxkIEFMTAorICAgIENPTU1BTkQgJHtQWVRIT05fRVhFQ1VUQUJMRX0gc2V0dXAucHkgYnVpbGQKKyAgICBXT1JLSU5HX0RJUkVDVE9SWSAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0KKyAgICBDT01NRU5UICJCdWlsZGluZyBQeXRob24gbGlicmFyeSIKKykKKworaWYoQlVJTERfVEVTVElORykKKyAgICBhZGRfdGVzdChQeXRob25UZXN0U1NMU29ja2V0ICR7UFlUSE9OX0VYRUNVVEFCTEV9ICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS90ZXN0L3Rlc3Rfc3Nsc29ja2V0LnB5KQorICAgIGFkZF90ZXN0KFB5dGhvblRocmlmdEpzb24gJHtQWVRIT05fRVhFQ1VUQUJMRX0gJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3Rlc3QvdGhyaWZ0X2pzb24ucHkpCitlbmRpZigpCmRpZmYgLS1naXQgYS9saWIvcHkvTUFOSUZFU1QuaW4gYi9saWIvcHkvTUFOSUZFU1QuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY1NGUyOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weS9NQU5JRkVTVC5pbgpAQCAtMCwwICsxIEBACitpbmNsdWRlIHNyYy9leHQvKgpkaWZmIC0tZ2l0IGEvbGliL3B5L01ha2VmaWxlLmFtIGIvbGliL3B5L01ha2VmaWxlLmFtCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggYWRiOTBmMy4uNTg2MTg1OAotLS0gYS9saWIvcHkvTWFrZWZpbGUuYW0KKysrIGIvbGliL3B5L01ha2VmaWxlLmFtCkBAIC0xOSw3ICsxOSwxOCBAQAogQVVUT01BS0VfT1BUSU9OUyA9IHNlcmlhbC10ZXN0cwogREVTVERJUiA/PSAvCiAKLWFsbC1sb2NhbDoKK2lmIFdJVEhfUFkzCitweTMtYnVpbGQ6CisJJChQWVRIT04zKSBzZXR1cC5weSBidWlsZAorcHkzLXRlc3Q6IHB5My1idWlsZAorCSQoUFlUSE9OMykgdGVzdC90aHJpZnRfanNvbi5weQorCSQoUFlUSE9OMykgdGVzdC90ZXN0X3NzbHNvY2tldC5weQorZWxzZQorcHkzLWJ1aWxkOgorcHkzLXRlc3Q6CitlbmRpZgorCithbGwtbG9jYWw6IHB5My1idWlsZAogCSQoUFlUSE9OKSBzZXR1cC5weSBidWlsZAogCiAjIFdlJ3JlIGlnbm9yaW5nIHByZWZpeCBoZXJlIGJlY2F1c2Ugc2l0ZS1wYWNrYWdlcyBzZWVtcyB0byBiZQpAQCAtMzIsMTEgKzQzLDE3IEBACiBjbGVhbi1sb2NhbDoKIAkkKFJNKSAtciBidWlsZAogCi1jaGVjay1sb2NhbDogYWxsCitjaGVjay1sb2NhbDogYWxsIHB5My10ZXN0CisJJChQWVRIT04pIHRlc3QvdGhyaWZ0X2pzb24ucHkKKwkkKFBZVEhPTikgdGVzdC90ZXN0X3NzbHNvY2tldC5weQogCiBFWFRSQV9ESVNUID0gXAorCUNNYWtlTGlzdHMudHh0IFwKKwlNQU5JRkVTVC5pbiBcCisJY29kaW5nX3N0YW5kYXJkcy5tZCBcCiAJY29tcGF0IFwKIAlzZXR1cC5weSBcCiAJc2V0dXAuY2ZnIFwKIAlzcmMgXAorCXRlc3QgXAogCVJFQURNRS5tZApkaWZmIC0tZ2l0IGEvbGliL3B5L2NvZGluZ19zdGFuZGFyZHMubWQgYi9saWIvcHkvY29kaW5nX3N0YW5kYXJkcy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzU2MGI1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5L2NvZGluZ19zdGFuZGFyZHMubWQKQEAgLTAsMCArMSw3IEBACisjIyBQeXRob24gQ29kaW5nIFN0YW5kYXJkcworCitQbGVhc2UgZm9sbG93OgorICogW1RocmlmdCBHZW5lcmFsIENvZGluZyBTdGFuZGFyZHNdKC9kb2MvY29kaW5nX3N0YW5kYXJkcy5tZCkKKyAqIENvZGUgU3R5bGUgZm9yIFB5dGhvbiBDb2RlIFtQRVA4XShodHRwOi8vbGVnYWN5LnB5dGhvbi5vcmcvZGV2L3BlcHMvcGVwLTAwMDgvKQorCitXaGVuIGluIGRvdWJ0IC0gY2hlY2sgd2l0aCA8aHR0cDovL3d3dy5weWxpbnQub3JnLz4gb3Igb25saW5lIHdpdGggPGh0dHA6Ly9wZXA4b25saW5lLmNvbT4uCmRpZmYgLS1naXQgYS9saWIvcHkvc2V0dXAuY2ZnIGIvbGliL3B5L3NldHVwLmNmZwppbmRleCBjNmRhYjQwLi5jOWVkMGFlIDEwMDY0NAotLS0gYS9saWIvcHkvc2V0dXAuY2ZnCisrKyBiL2xpYi9weS9zZXR1cC5jZmcKQEAgLTIsMyArMiw1IEBACiBvcHRpbWl6ZSA9IDEKIFttZXRhZGF0YV0KIGRlc2NyaXB0aW9uLWZpbGUgPSBSRUFETUUubWQKK1tmbGFrZThdCittYXgtbGluZS1sZW5ndGggPSAxMDAKZGlmZiAtLWdpdCBhL2xpYi9weS9zZXR1cC5weSBiL2xpYi9weS9zZXR1cC5weQppbmRleCA0M2U3N2YyLi4zY2YxNDY5IDEwMDY0NAotLS0gYS9saWIvcHkvc2V0dXAucHkKKysrIGIvbGliL3B5L3NldHVwLnB5CkBAIC05LDcgKzksNyBAQAogIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCiAjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogIwotIwlodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICMKICMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAogIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgpAQCAtMjIsOCArMjIsOCBAQAogaW1wb3J0IHN5cwogdHJ5OgogICAgIGZyb20gc2V0dXB0b29scyBpbXBvcnQgc2V0dXAsIEV4dGVuc2lvbgotZXhjZXB0OgotICAgIGZyb20gZGlzdHV0aWxzLmNvcmUgaW1wb3J0IHNldHVwLCBFeHRlbnNpb24sIENvbW1hbmQKK2V4Y2VwdCBFeGNlcHRpb246CisgICAgZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQgc2V0dXAsIEV4dGVuc2lvbgogCiBmcm9tIGRpc3R1dGlscy5jb21tYW5kLmJ1aWxkX2V4dCBpbXBvcnQgYnVpbGRfZXh0CiBmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IENDb21waWxlckVycm9yLCBEaXN0dXRpbHNFeGVjRXJyb3IsIERpc3R1dGlsc1BsYXRmb3JtRXJyb3IKQEAgLTMxLDc4ICszMSwxMDcgQEAKICMgRml4IHRvIGJ1aWxkIHNkaXN0IHVuZGVyIHZhZ3JhbnQKIGltcG9ydCBvcwogaWYgJ3ZhZ3JhbnQnIGluIHN0cihvcy5lbnZpcm9uKToKLSAgICBkZWwgb3MubGluaworICAgIHRyeToKKyAgICAgICAgZGVsIG9zLmxpbmsKKyAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgIHBhc3MKIAotaW5jbHVkZV9kaXJzID0gW10KK2luY2x1ZGVfZGlycyA9IFsnc3JjJ10KIGlmIHN5cy5wbGF0Zm9ybSA9PSAnd2luMzInOgogICAgIGluY2x1ZGVfZGlycy5hcHBlbmQoJ2NvbXBhdC93aW4zMicpCiAgICAgZXh0X2Vycm9ycyA9IChDQ29tcGlsZXJFcnJvciwgRGlzdHV0aWxzRXhlY0Vycm9yLCBEaXN0dXRpbHNQbGF0Zm9ybUVycm9yLCBJT0Vycm9yKQogZWxzZToKICAgICBleHRfZXJyb3JzID0gKENDb21waWxlckVycm9yLCBEaXN0dXRpbHNFeGVjRXJyb3IsIERpc3R1dGlsc1BsYXRmb3JtRXJyb3IpCiAKKwogY2xhc3MgQnVpbGRGYWlsZWQoRXhjZXB0aW9uKToKICAgICBwYXNzCiAKKwogY2xhc3MgdmVfYnVpbGRfZXh0KGJ1aWxkX2V4dCk6CiAgICAgZGVmIHJ1bihzZWxmKToKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgYnVpbGRfZXh0LnJ1bihzZWxmKQotICAgICAgICBleGNlcHQgRGlzdHV0aWxzUGxhdGZvcm1FcnJvciBhcyB4OgorICAgICAgICBleGNlcHQgRGlzdHV0aWxzUGxhdGZvcm1FcnJvcjoKICAgICAgICAgICAgIHJhaXNlIEJ1aWxkRmFpbGVkKCkKIAogICAgIGRlZiBidWlsZF9leHRlbnNpb24oc2VsZiwgZXh0KToKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgYnVpbGRfZXh0LmJ1aWxkX2V4dGVuc2lvbihzZWxmLCBleHQpCi0gICAgICAgIGV4Y2VwdCBleHRfZXJyb3JzIGFzIHg6CisgICAgICAgIGV4Y2VwdCBleHRfZXJyb3JzOgogICAgICAgICAgICAgcmFpc2UgQnVpbGRGYWlsZWQoKQogCisKIGRlZiBydW5fc2V0dXAod2l0aF9iaW5hcnkpOgogICAgIGlmIHdpdGhfYmluYXJ5OgogICAgICAgICBleHRlbnNpb25zID0gZGljdCgKLSAgICAgICAgICAgIGV4dF9tb2R1bGVzID0gWwotICAgICAgICAgICAgICAgICBFeHRlbnNpb24oJ3RocmlmdC5wcm90b2NvbC5mYXN0YmluYXJ5JywKLSAgICAgICAgICAgICAgICAgICAgICAgc291cmNlcyA9IFsnc3JjL3Byb3RvY29sL2Zhc3RiaW5hcnkuYyddLAotICAgICAgICAgICAgICAgICAgICBpbmNsdWRlX2RpcnMgPSBpbmNsdWRlX2RpcnMsCi0gICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgZXh0X21vZHVsZXM9WworICAgICAgICAgICAgICAgIEV4dGVuc2lvbigndGhyaWZ0LnByb3RvY29sLmZhc3RiaW5hcnknLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VzPVsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvZXh0L21vZHVsZS5jcHAnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9leHQvdHlwZXMuY3BwJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvZXh0L2JpbmFyeS5jcHAnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9leHQvY29tcGFjdC5jcHAnLAorICAgICAgICAgICAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlX2RpcnM9aW5jbHVkZV9kaXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICBdLAogICAgICAgICAgICAgY21kY2xhc3M9ZGljdChidWlsZF9leHQ9dmVfYnVpbGRfZXh0KQogICAgICAgICApCiAgICAgZWxzZToKICAgICAgICAgZXh0ZW5zaW9ucyA9IGRpY3QoKQotICAgICAgICAKLSAgICBzZXR1cChuYW1lID0gJ3RocmlmdCcsCi0gICAgICAgIHZlcnNpb24gPSAnMC45LjInLAotICAgICAgICBkZXNjcmlwdGlvbiA9ICdQeXRob24gYmluZGluZ3MgZm9yIHRoZSBBcGFjaGUgVGhyaWZ0IFJQQyBzeXN0ZW0nLAotICAgICAgICBhdXRob3IgPSAnVGhyaWZ0IERldmVsb3BlcnMnLAotICAgICAgICBhdXRob3JfZW1haWwgPSAnZGV2QHRocmlmdC5hcGFjaGUub3JnJywKLSAgICAgICAgdXJsID0gJ2h0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZycsCi0gICAgICAgIGxpY2Vuc2UgPSAnQXBhY2hlIExpY2Vuc2UgMi4wJywKLSAgICAgICAgcGFja2FnZXMgPSBbCi0gICAgICAgICAgICAndGhyaWZ0JywKLSAgICAgICAgICAgICd0aHJpZnQucHJvdG9jb2wnLAotICAgICAgICAgICAgJ3RocmlmdC50cmFuc3BvcnQnLAotICAgICAgICAgICAgJ3RocmlmdC5zZXJ2ZXInLAotICAgICAgICBdLAotICAgICAgICBwYWNrYWdlX2RpciA9IHsndGhyaWZ0JyA6ICdzcmMnfSwKLSAgICAgICAgY2xhc3NpZmllcnMgPSBbCi0gICAgICAgICAgICAnRGV2ZWxvcG1lbnQgU3RhdHVzIDo6IDUgLSBQcm9kdWN0aW9uL1N0YWJsZScsCi0gICAgICAgICAgICAnRW52aXJvbm1lbnQgOjogQ29uc29sZScsCi0gICAgICAgICAgICAnSW50ZW5kZWQgQXVkaWVuY2UgOjogRGV2ZWxvcGVycycsCi0gICAgICAgICAgICAnUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uJywKLSAgICAgICAgICAgICdQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMicsCi0gICAgICAgICAgICAnVG9waWMgOjogU29mdHdhcmUgRGV2ZWxvcG1lbnQgOjogTGlicmFyaWVzJywKLSAgICAgICAgICAgICdUb3BpYyA6OiBTeXN0ZW0gOjogTmV0d29ya2luZycKLSAgICAgICAgXSwKLSAgICAgICAgdXNlXzJ0bzMgPSBUcnVlLAotICAgICAgICAqKmV4dGVuc2lvbnMKLSAgICApCisKKyAgICBzc2xfZGVwcyA9IFtdCisgICAgaWYgc3lzLnZlcnNpb25faW5mb1swXSA9PSAyOgorICAgICAgICBzc2xfZGVwcy5hcHBlbmQoJ2lwYWRkcmVzcycpCisgICAgaWYgc3lzLmhleHZlcnNpb24gPCAweDAzMDUwMDAwOgorICAgICAgICBzc2xfZGVwcy5hcHBlbmQoJ2JhY2twb3J0cy5zc2xfbWF0Y2hfaG9zdG5hbWU+PTMuNScpCisgICAgdG9ybmFkb19kZXBzID0gWyd0b3JuYWRvPj00LjAnXQorICAgIHR3aXN0ZWRfZGVwcyA9IFsndHdpc3RlZCddCisKKyAgICBzZXR1cChuYW1lPSd0aHJpZnQnLAorICAgICAgICAgIHZlcnNpb249JzEuMC4wJywKKyAgICAgICAgICBkZXNjcmlwdGlvbj0nUHl0aG9uIGJpbmRpbmdzIGZvciB0aGUgQXBhY2hlIFRocmlmdCBSUEMgc3lzdGVtJywKKyAgICAgICAgICBhdXRob3I9J0FwYWNoZSBUaHJpZnQgRGV2ZWxvcGVycycsCisgICAgICAgICAgYXV0aG9yX2VtYWlsPSdkZXZAdGhyaWZ0LmFwYWNoZS5vcmcnLAorICAgICAgICAgIHVybD0naHR0cDovL3RocmlmdC5hcGFjaGUub3JnJywKKyAgICAgICAgICBsaWNlbnNlPSdBcGFjaGUgTGljZW5zZSAyLjAnLAorICAgICAgICAgIGluc3RhbGxfcmVxdWlyZXM9WydzaXg+PTEuNy4yJ10sCisgICAgICAgICAgZXh0cmFzX3JlcXVpcmU9eworICAgICAgICAgICAgICAnc3NsJzogc3NsX2RlcHMsCisgICAgICAgICAgICAgICd0b3JuYWRvJzogdG9ybmFkb19kZXBzLAorICAgICAgICAgICAgICAndHdpc3RlZCc6IHR3aXN0ZWRfZGVwcywKKyAgICAgICAgICAgICAgJ2FsbCc6IHNzbF9kZXBzICsgdG9ybmFkb19kZXBzICsgdHdpc3RlZF9kZXBzLAorICAgICAgICAgIH0sCisgICAgICAgICAgcGFja2FnZXM9WworICAgICAgICAgICAgICAndGhyaWZ0JywKKyAgICAgICAgICAgICAgJ3RocmlmdC5wcm90b2NvbCcsCisgICAgICAgICAgICAgICd0aHJpZnQudHJhbnNwb3J0JywKKyAgICAgICAgICAgICAgJ3RocmlmdC5zZXJ2ZXInLAorICAgICAgICAgIF0sCisgICAgICAgICAgcGFja2FnZV9kaXI9eyd0aHJpZnQnOiAnc3JjJ30sCisgICAgICAgICAgY2xhc3NpZmllcnM9WworICAgICAgICAgICAgICAnRGV2ZWxvcG1lbnQgU3RhdHVzIDo6IDUgLSBQcm9kdWN0aW9uL1N0YWJsZScsCisgICAgICAgICAgICAgICdFbnZpcm9ubWVudCA6OiBDb25zb2xlJywKKyAgICAgICAgICAgICAgJ0ludGVuZGVkIEF1ZGllbmNlIDo6IERldmVsb3BlcnMnLAorICAgICAgICAgICAgICAnUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uJywKKyAgICAgICAgICAgICAgJ1Byb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAyJywKKyAgICAgICAgICAgICAgJ1Byb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAzJywKKyAgICAgICAgICAgICAgJ1RvcGljIDo6IFNvZnR3YXJlIERldmVsb3BtZW50IDo6IExpYnJhcmllcycsCisgICAgICAgICAgICAgICdUb3BpYyA6OiBTeXN0ZW0gOjogTmV0d29ya2luZycKKyAgICAgICAgICBdLAorICAgICAgICAgIHppcF9zYWZlPUZhbHNlLAorICAgICAgICAgICoqZXh0ZW5zaW9ucworICAgICAgICAgICkKKwogCiB0cnk6Ci0gICAgcnVuX3NldHVwKFRydWUpCisgICAgd2l0aF9iaW5hcnkgPSBUcnVlCisgICAgcnVuX3NldHVwKHdpdGhfYmluYXJ5KQogZXhjZXB0IEJ1aWxkRmFpbGVkOgogICAgIHByaW50KCkKICAgICBwcmludCgnKicgKiA4MCkKLSAgICBwcmludCgiQW4gZXJyb3Igb2NjdXJlZCB3aGlsZSB0cnlpbmcgdG8gY29tcGlsZSB3aXRoIHRoZSBDIGV4dGVuc2lvbiBlbmFibGVkIikKKyAgICBwcmludCgiQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgdHJ5aW5nIHRvIGNvbXBpbGUgd2l0aCB0aGUgQyBleHRlbnNpb24gZW5hYmxlZCIpCiAgICAgcHJpbnQoIkF0dGVtcHRpbmcgdG8gYnVpbGQgd2l0aG91dCB0aGUgZXh0ZW5zaW9uIG5vdyIpCiAgICAgcHJpbnQoJyonICogODApCiAgICAgcHJpbnQoKQpkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IucHkgYi9saWIvcHkvc3JjL1RNdWx0aXBsZXhlZFByb2Nlc3Nvci5weQppbmRleCBhOGQ1NTY1Li4zYWM1YWYwIDEwMDY0NAotLS0gYS9saWIvcHkvc3JjL1RNdWx0aXBsZXhlZFByb2Nlc3Nvci5weQorKysgYi9saWIvcHkvc3JjL1RNdWx0aXBsZXhlZFByb2Nlc3Nvci5weQpAQCAtMjAsMzkgKzIwLDM1IEBACiBmcm9tIHRocmlmdC5UaHJpZnQgaW1wb3J0IFRQcm9jZXNzb3IsIFRNZXNzYWdlVHlwZSwgVEV4Y2VwdGlvbgogZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRQcm90b2NvbERlY29yYXRvciwgVE11bHRpcGxleGVkUHJvdG9jb2wKIAorCiBjbGFzcyBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IoVFByb2Nlc3Nvcik6Ci0gIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICBzZWxmLnNlcnZpY2VzID0ge30KKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuc2VydmljZXMgPSB7fQogCi0gIGRlZiByZWdpc3RlclByb2Nlc3NvcihzZWxmLCBzZXJ2aWNlTmFtZSwgcHJvY2Vzc29yKToKLSAgICBzZWxmLnNlcnZpY2VzW3NlcnZpY2VOYW1lXSA9IHByb2Nlc3NvcgorICAgIGRlZiByZWdpc3RlclByb2Nlc3NvcihzZWxmLCBzZXJ2aWNlTmFtZSwgcHJvY2Vzc29yKToKKyAgICAgICAgc2VsZi5zZXJ2aWNlc1tzZXJ2aWNlTmFtZV0gPSBwcm9jZXNzb3IKIAotICBkZWYgcHJvY2VzcyhzZWxmLCBpcHJvdCwgb3Byb3QpOgotICAgIChuYW1lLCB0eXBlLCBzZXFpZCkgPSBpcHJvdC5yZWFkTWVzc2FnZUJlZ2luKCk7Ci0gICAgaWYgdHlwZSAhPSBUTWVzc2FnZVR5cGUuQ0FMTCAmIHR5cGUgIT0gVE1lc3NhZ2VUeXBlLk9ORVdBWToKLSAgICAgIHJhaXNlIFRFeGNlcHRpb24oIlRNdWx0aXBsZXggcHJvdG9jb2wgb25seSBzdXBwb3J0cyBDQUxMICYgT05FV0FZIikKKyAgICBkZWYgcHJvY2VzcyhzZWxmLCBpcHJvdCwgb3Byb3QpOgorICAgICAgICAobmFtZSwgdHlwZSwgc2VxaWQpID0gaXByb3QucmVhZE1lc3NhZ2VCZWdpbigpCisgICAgICAgIGlmIHR5cGUgIT0gVE1lc3NhZ2VUeXBlLkNBTEwgYW5kIHR5cGUgIT0gVE1lc3NhZ2VUeXBlLk9ORVdBWToKKyAgICAgICAgICAgIHJhaXNlIFRFeGNlcHRpb24oIlRNdWx0aXBsZXhlZCBwcm90b2NvbCBvbmx5IHN1cHBvcnRzIENBTEwgJiBPTkVXQVkiKQogCi0gICAgaW5kZXggPSBuYW1lLmZpbmQoVE11bHRpcGxleGVkUHJvdG9jb2wuU0VQQVJBVE9SKQotICAgIGlmIGluZGV4IDwgMDoKLSAgICAgIHJhaXNlIFRFeGNlcHRpb24oIlNlcnZpY2UgbmFtZSBub3QgZm91bmQgaW4gbWVzc2FnZSBuYW1lOiAiICsgbmFtZSArICIuIERpZCB5b3UgZm9yZ2V0IHRvIHVzZSBUTXVsdGlwbGV4UHJvdG9jb2wgaW4geW91ciBjbGllbnQ/IikKKyAgICAgICAgaW5kZXggPSBuYW1lLmZpbmQoVE11bHRpcGxleGVkUHJvdG9jb2wuU0VQQVJBVE9SKQorICAgICAgICBpZiBpbmRleCA8IDA6CisgICAgICAgICAgICByYWlzZSBURXhjZXB0aW9uKCJTZXJ2aWNlIG5hbWUgbm90IGZvdW5kIGluIG1lc3NhZ2UgbmFtZTogIiArIG5hbWUgKyAiLiBEaWQgeW91IGZvcmdldCB0byB1c2UgVE11bHRpcGxleGVkUHJvdG9jb2wgaW4geW91ciBjbGllbnQ/IikKIAotICAgIHNlcnZpY2VOYW1lID0gbmFtZVswOmluZGV4XQotICAgIGNhbGwgPSBuYW1lW2luZGV4K2xlbihUTXVsdGlwbGV4ZWRQcm90b2NvbC5TRVBBUkFUT1IpOl0KLSAgICBpZiBub3Qgc2VydmljZU5hbWUgaW4gc2VsZi5zZXJ2aWNlczoKLSAgICAgIHJhaXNlIFRFeGNlcHRpb24oIlNlcnZpY2UgbmFtZSBub3QgZm91bmQ6ICIgKyBzZXJ2aWNlTmFtZSArICIuIERpZCB5b3UgZm9yZ2V0IHRvIGNhbGwgcmVnaXN0ZXJQcm9jZXNzb3IoKT8iKQorICAgICAgICBzZXJ2aWNlTmFtZSA9IG5hbWVbMDppbmRleF0KKyAgICAgICAgY2FsbCA9IG5hbWVbaW5kZXggKyBsZW4oVE11bHRpcGxleGVkUHJvdG9jb2wuU0VQQVJBVE9SKTpdCisgICAgICAgIGlmIHNlcnZpY2VOYW1lIG5vdCBpbiBzZWxmLnNlcnZpY2VzOgorICAgICAgICAgICAgcmFpc2UgVEV4Y2VwdGlvbigiU2VydmljZSBuYW1lIG5vdCBmb3VuZDogIiArIHNlcnZpY2VOYW1lICsgIi4gRGlkIHlvdSBmb3JnZXQgdG8gY2FsbCByZWdpc3RlclByb2Nlc3NvcigpPyIpCiAKLSAgICBzdGFuZGFyZE1lc3NhZ2UgPSAoCi0gICAgICBjYWxsLAotICAgICAgdHlwZSwKLSAgICAgIHNlcWlkCi0gICAgKQotICAgIHJldHVybiBzZWxmLnNlcnZpY2VzW3NlcnZpY2VOYW1lXS5wcm9jZXNzKFN0b3JlZE1lc3NhZ2VQcm90b2NvbChpcHJvdCwgc3RhbmRhcmRNZXNzYWdlKSwgb3Byb3QpCisgICAgICAgIHN0YW5kYXJkTWVzc2FnZSA9IChjYWxsLCB0eXBlLCBzZXFpZCkKKyAgICAgICAgcmV0dXJuIHNlbGYuc2VydmljZXNbc2VydmljZU5hbWVdLnByb2Nlc3MoU3RvcmVkTWVzc2FnZVByb3RvY29sKGlwcm90LCBzdGFuZGFyZE1lc3NhZ2UpLCBvcHJvdCkKIAogCiBjbGFzcyBTdG9yZWRNZXNzYWdlUHJvdG9jb2woVFByb3RvY29sRGVjb3JhdG9yLlRQcm90b2NvbERlY29yYXRvcik6Ci0gIGRlZiBfX2luaXRfXyhzZWxmLCBwcm90b2NvbCwgbWVzc2FnZUJlZ2luKToKLSAgICBUUHJvdG9jb2xEZWNvcmF0b3IuVFByb3RvY29sRGVjb3JhdG9yLl9faW5pdF9fKHNlbGYsIHByb3RvY29sKQotICAgIHNlbGYubWVzc2FnZUJlZ2luID0gbWVzc2FnZUJlZ2luCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHByb3RvY29sLCBtZXNzYWdlQmVnaW4pOgorICAgICAgICBzZWxmLm1lc3NhZ2VCZWdpbiA9IG1lc3NhZ2VCZWdpbgogCi0gIGRlZiByZWFkTWVzc2FnZUJlZ2luKHNlbGYpOgotICAgIHJldHVybiBzZWxmLm1lc3NhZ2VCZWdpbgorICAgIGRlZiByZWFkTWVzc2FnZUJlZ2luKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5tZXNzYWdlQmVnaW4KZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvVFJlY3Vyc2l2ZS5weSBiL2xpYi9weS9zcmMvVFJlY3Vyc2l2ZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmYyMDJjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5L3NyYy9UUmVjdXJzaXZlLnB5CkBAIC0wLDAgKzEsODMgQEAKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0Citmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGRpdmlzaW9uCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHVuaWNvZGVfbGl0ZXJhbHMKKworZnJvbSB0aHJpZnQuVGhyaWZ0IGltcG9ydCBUVHlwZQorCitUWVBFX0lEWCA9IDEKK1NQRUNfQVJHU19JRFggPSAzCitTUEVDX0FSR1NfQ0xBU1NfUkVGX0lEWCA9IDAKK1NQRUNfQVJHU19USFJJRlRfU1BFQ19JRFggPSAxCisKKworZGVmIGZpeF9zcGVjKGFsbF9zdHJ1Y3RzKToKKyAgICAiIiJXaXJlIHVwIHJlY3Vyc2l2ZSByZWZlcmVuY2VzIGZvciBhbGwgVFN0cnVjdCBkZWZpbml0aW9ucyBpbnNpZGUgb2YgZWFjaCB0aHJpZnRfc3BlYy4iIiIKKyAgICBmb3Igc3RydWMgaW4gYWxsX3N0cnVjdHM6CisgICAgICAgIHNwZWMgPSBzdHJ1Yy50aHJpZnRfc3BlYworICAgICAgICBmb3IgdGhyaWZ0X3NwZWMgaW4gc3BlYzoKKyAgICAgICAgICAgIGlmIHRocmlmdF9zcGVjIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGVsaWYgdGhyaWZ0X3NwZWNbVFlQRV9JRFhdID09IFRUeXBlLlNUUlVDVDoKKyAgICAgICAgICAgICAgICBvdGhlciA9IHRocmlmdF9zcGVjW1NQRUNfQVJHU19JRFhdW1NQRUNfQVJHU19DTEFTU19SRUZfSURYXS50aHJpZnRfc3BlYworICAgICAgICAgICAgICAgIHRocmlmdF9zcGVjW1NQRUNfQVJHU19JRFhdW1NQRUNfQVJHU19USFJJRlRfU1BFQ19JRFhdID0gb3RoZXIKKyAgICAgICAgICAgIGVsaWYgdGhyaWZ0X3NwZWNbVFlQRV9JRFhdIGluIChUVHlwZS5MSVNULCBUVHlwZS5TRVQpOgorICAgICAgICAgICAgICAgIF9maXhfbGlzdF9vcl9zZXQodGhyaWZ0X3NwZWNbU1BFQ19BUkdTX0lEWF0pCisgICAgICAgICAgICBlbGlmIHRocmlmdF9zcGVjW1RZUEVfSURYXSA9PSBUVHlwZS5NQVA6CisgICAgICAgICAgICAgICAgX2ZpeF9tYXAodGhyaWZ0X3NwZWNbU1BFQ19BUkdTX0lEWF0pCisKKworZGVmIF9maXhfbGlzdF9vcl9zZXQoZWxlbWVudF90eXBlKToKKyAgICAjIEZvciBhIGxpc3Qgb3Igc2V0LCB0aGUgdGhyaWZ0X3NwZWMgZW50cnkgbG9va3MgbGlrZSwKKyAgICAjICgxLCBUVHlwZS5MSVNULCAnbGlzdGVyJywgKFRUeXBlLlNUUlVDVCwgW1JlY0xpc3QsIE5vbmVdLCBGYWxzZSksIE5vbmUsICksICAjIDEKKyAgICAjIHNvIGBgZWxlbWVudF90eXBlYGAgd2lsbCBiZSwKKyAgICAjIChUVHlwZS5TVFJVQ1QsIFtSZWNMaXN0LCBOb25lXSwgRmFsc2UpCisgICAgaWYgZWxlbWVudF90eXBlWzBdID09IFRUeXBlLlNUUlVDVDoKKyAgICAgICAgZWxlbWVudF90eXBlWzFdWzFdID0gZWxlbWVudF90eXBlWzFdWzBdLnRocmlmdF9zcGVjCisgICAgZWxpZiBlbGVtZW50X3R5cGVbMF0gaW4gKFRUeXBlLkxJU1QsIFRUeXBlLlNFVCk6CisgICAgICAgIF9maXhfbGlzdF9vcl9zZXQoZWxlbWVudF90eXBlWzFdKQorICAgIGVsaWYgZWxlbWVudF90eXBlWzBdID09IFRUeXBlLk1BUDoKKyAgICAgICAgX2ZpeF9tYXAoZWxlbWVudF90eXBlWzFdKQorCisKK2RlZiBfZml4X21hcChlbGVtZW50X3R5cGUpOgorICAgICMgRm9yIGEgbWFwIG9mIGtleSAtPiB2YWx1ZSB0eXBlLCBgYGVsZW1lbnRfdHlwZWBgIHdpbGwgYmUsCisgICAgIyAoVFR5cGUuSTE2LCBOb25lLCBUVHlwZS5TVFJVQ1QsIFtSZWNNYXBCYXNpYywgTm9uZV0sIEZhbHNlKSwgTm9uZSwgKQorICAgICMgd2hpY2ggaXMganVzdCBhIG5vcm1hbCBzdHJ1Y3QgZGVmaW5pdGlvbi4KKyAgICAjCisgICAgIyBGb3IgYSBtYXAgb2Yga2V5IC0+IGxpc3QgLyBzZXQsIGBgZWxlbWVudF90eXBlYGAgd2lsbCBiZSwKKyAgICAjIChUVHlwZS5JMTYsIE5vbmUsIFRUeXBlLkxJU1QsIChUVHlwZS5TVFJVQ1QsIFtSZWNNYXBMaXN0LCBOb25lXSwgRmFsc2UpLCBGYWxzZSkKKyAgICAjIGFuZCB3ZSBuZWVkIHRvIHByb2Nlc3MgdGhlIDNyZCBlbGVtZW50IGFzIGEgbGlzdC4KKyAgICAjCisgICAgIyBGb3IgYSBtYXAgb2Yga2V5IC0+IG1hcCwgYGBlbGVtZW50X3R5cGVgYCB3aWxsIGJlLAorICAgICMgKFRUeXBlLkkxNiwgTm9uZSwgVFR5cGUuTUFQLCAoVFR5cGUuSTE2LCBOb25lLCBUVHlwZS5TVFJVQ1QsCisgICAgIyAgW1JlY01hcE1hcCwgTm9uZV0sIEZhbHNlKSwgRmFsc2UpCisgICAgIyBhbmQgbmVlZCB0byBwcm9jZXNzIDNyZCBlbGVtZW50IGFzIGEgbWFwLgorCisgICAgIyBJcyB0aGUgbWFwIGtleSBhIHN0cnVjdD8KKyAgICBpZiBlbGVtZW50X3R5cGVbMF0gPT0gVFR5cGUuU1RSVUNUOgorICAgICAgICBlbGVtZW50X3R5cGVbMV1bMV0gPSBlbGVtZW50X3R5cGVbMV1bMF0udGhyaWZ0X3NwZWMKKyAgICBlbGlmIGVsZW1lbnRfdHlwZVswXSBpbiAoVFR5cGUuTElTVCwgVFR5cGUuU0VUKToKKyAgICAgICAgX2ZpeF9saXN0X29yX3NldChlbGVtZW50X3R5cGVbMV0pCisgICAgZWxpZiBlbGVtZW50X3R5cGVbMF0gPT0gVFR5cGUuTUFQOgorICAgICAgICBfZml4X21hcChlbGVtZW50X3R5cGVbMV0pCisKKyAgICAjIElzIHRoZSBtYXAgdmFsdWUgYSBzdHJ1Y3Q/CisgICAgaWYgZWxlbWVudF90eXBlWzJdID09IFRUeXBlLlNUUlVDVDoKKyAgICAgICAgZWxlbWVudF90eXBlWzNdWzFdID0gZWxlbWVudF90eXBlWzNdWzBdLnRocmlmdF9zcGVjCisgICAgZWxpZiBlbGVtZW50X3R5cGVbMl0gaW4gKFRUeXBlLkxJU1QsIFRUeXBlLlNFVCk6CisgICAgICAgIF9maXhfbGlzdF9vcl9zZXQoZWxlbWVudF90eXBlWzNdKQorICAgIGVsaWYgZWxlbWVudF90eXBlWzJdID09IFRUeXBlLk1BUDoKKyAgICAgICAgX2ZpeF9tYXAoZWxlbWVudF90eXBlWzNdKQpkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9UU0NvbnMucHkgYi9saWIvcHkvc3JjL1RTQ29ucy5weQppbmRleCBkYThkMjgzLi5iYzY3ZDcwIDEwMDY0NAotLS0gYS9saWIvcHkvc3JjL1RTQ29ucy5weQorKysgYi9saWIvcHkvc3JjL1RTQ29ucy5weQpAQCAtMTksMTcgKzE5LDE4IEBACiAKIGZyb20gb3MgaW1wb3J0IHBhdGgKIGZyb20gU0NvbnMuQnVpbGRlciBpbXBvcnQgQnVpbGRlcgorZnJvbSBzaXgubW92ZXMgaW1wb3J0IG1hcAogCiAKIGRlZiBzY29uc19lbnYoZW52LCBhZGQ9JycpOgotICBvcGF0aCA9IHBhdGguZGlybmFtZShwYXRoLmFic3BhdGgoJyRUQVJHRVQnKSkKLSAgbHN0ciA9ICd0aHJpZnQgLS1nZW4gY3BwIC1vICcgKyBvcGF0aCArICcgJyArIGFkZCArICcgJFNPVVJDRScKLSAgY3BwYnVpbGQgPSBCdWlsZGVyKGFjdGlvbj1sc3RyKQotICBlbnYuQXBwZW5kKEJVSUxERVJTPXsnVGhyaWZ0Q3BwJzogY3BwYnVpbGR9KQorICAgIG9wYXRoID0gcGF0aC5kaXJuYW1lKHBhdGguYWJzcGF0aCgnJFRBUkdFVCcpKQorICAgIGxzdHIgPSAndGhyaWZ0IC0tZ2VuIGNwcCAtbyAnICsgb3BhdGggKyAnICcgKyBhZGQgKyAnICRTT1VSQ0UnCisgICAgY3BwYnVpbGQgPSBCdWlsZGVyKGFjdGlvbj1sc3RyKQorICAgIGVudi5BcHBlbmQoQlVJTERFUlM9eydUaHJpZnRDcHAnOiBjcHBidWlsZH0pCiAKIAogZGVmIGdlbl9jcHAoZW52LCBkaXIsIGZpbGUpOgotICBzY29uc19lbnYoZW52KQotICBzdWZmaXhlcyA9IFsnX3R5cGVzLmgnLCAnX3R5cGVzLmNwcCddCi0gIHRhcmdldHMgPSBtYXAobGFtYmRhIHM6ICdnZW4tY3BwLycgKyBmaWxlICsgcywgc3VmZml4ZXMpCi0gIHJldHVybiBlbnYuVGhyaWZ0Q3BwKHRhcmdldHMsIGRpciArIGZpbGUgKyAnLnRocmlmdCcpCisgICAgc2NvbnNfZW52KGVudikKKyAgICBzdWZmaXhlcyA9IFsnX3R5cGVzLmgnLCAnX3R5cGVzLmNwcCddCisgICAgdGFyZ2V0cyA9IG1hcChsYW1iZGEgczogJ2dlbi1jcHAvJyArIGZpbGUgKyBzLCBzdWZmaXhlcykKKyAgICByZXR1cm4gZW52LlRocmlmdENwcCh0YXJnZXRzLCBkaXIgKyBmaWxlICsgJy50aHJpZnQnKQpkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9UU2VyaWFsaXphdGlvbi5weSBiL2xpYi9weS9zcmMvVFNlcmlhbGl6YXRpb24ucHkKaW5kZXggOGE1OGQ4OS4uZmJiZTc2OCAxMDA2NDQKLS0tIGEvbGliL3B5L3NyYy9UU2VyaWFsaXphdGlvbi5weQorKysgYi9saWIvcHkvc3JjL1RTZXJpYWxpemF0aW9uLnB5CkBAIC0xNyw4ICsxNyw4IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1mcm9tIHByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wKLWZyb20gdHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0Citmcm9tIC5wcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sCitmcm9tIC50cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQKIAogCiBkZWYgc2VyaWFsaXplKHRocmlmdF9vYmplY3QsCmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL1RUb3JuYWRvLnB5IGIvbGliL3B5L3NyYy9UVG9ybmFkby5weQppbmRleCBlZjNlMGYyLi41ZWZmMTFkIDEwMDY0NAotLS0gYS9saWIvcHkvc3JjL1RUb3JuYWRvLnB5CisrKyBiL2xpYi9weS9zcmMvVFRvcm5hZG8ucHkKQEAgLTE4LDEzICsxOCwxMSBAQAogIwogCiBmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoraW1wb3J0IGxvZ2dpbmcKIGltcG9ydCBzb2NrZXQKIGltcG9ydCBzdHJ1Y3QKIAotaW1wb3J0IGxvZ2dpbmcKLWxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQotCi1mcm9tIHRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydEV4Y2VwdGlvbiwgVFRyYW5zcG9ydEJhc2UsIFRNZW1vcnlCdWZmZXIKK2Zyb20gLnRyYW5zcG9ydC5UVHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0RXhjZXB0aW9uLCBUVHJhbnNwb3J0QmFzZSwgVE1lbW9yeUJ1ZmZlcgogCiBmcm9tIGlvIGltcG9ydCBCeXRlc0lPCiBmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBkZXF1ZQpAQCAtMzMsNiArMzEsOCBAQAogCiBfX2FsbF9fID0gWydUVG9ybmFkb1NlcnZlcicsICdUVG9ybmFkb1N0cmVhbVRyYW5zcG9ydCddCiAKK2xvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQorCiAKIGNsYXNzIF9Mb2NrKG9iamVjdCk6CiAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgpAQCAtMTY0LDE0ICsxNjQsMjAgQEAKIAogICAgIEBnZW4uY29yb3V0aW5lCiAgICAgZGVmIGhhbmRsZV9zdHJlYW0oc2VsZiwgc3RyZWFtLCBhZGRyZXNzKToKLSAgICAgICAgaG9zdCwgcG9ydCA9IGFkZHJlc3MKKyAgICAgICAgaG9zdCwgcG9ydCA9IGFkZHJlc3NbOjJdCiAgICAgICAgIHRyYW5zID0gVFRvcm5hZG9TdHJlYW1UcmFuc3BvcnQoaG9zdD1ob3N0LCBwb3J0PXBvcnQsIHN0cmVhbT1zdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9fbG9vcD1zZWxmLmlvX2xvb3ApCiAgICAgICAgIG9wcm90ID0gc2VsZi5fb3Byb3RfZmFjdG9yeS5nZXRQcm90b2NvbCh0cmFucykKIAogICAgICAgICB0cnk6CiAgICAgICAgICAgICB3aGlsZSBub3QgdHJhbnMuc3RyZWFtLmNsb3NlZCgpOgotICAgICAgICAgICAgICAgIGZyYW1lID0geWllbGQgdHJhbnMucmVhZEZyYW1lKCkKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGZyYW1lID0geWllbGQgdHJhbnMucmVhZEZyYW1lKCkKKyAgICAgICAgICAgICAgICBleGNlcHQgVFRyYW5zcG9ydEV4Y2VwdGlvbiBhcyBlOgorICAgICAgICAgICAgICAgICAgICBpZiBlLnR5cGUgPT0gVFRyYW5zcG9ydEV4Y2VwdGlvbi5FTkRfT0ZfRklMRToKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZQogICAgICAgICAgICAgICAgIHRyID0gVE1lbW9yeUJ1ZmZlcihmcmFtZSkKICAgICAgICAgICAgICAgICBpcHJvdCA9IHNlbGYuX2lwcm90X2ZhY3RvcnkuZ2V0UHJvdG9jb2wodHIpCiAgICAgICAgICAgICAgICAgeWllbGQgc2VsZi5fcHJvY2Vzc29yLnByb2Nlc3MoaXByb3QsIG9wcm90KQpkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9UaHJpZnQucHkgYi9saWIvcHkvc3JjL1RocmlmdC5weQppbmRleCA5ODkwYWY3Li4wMDk0MWQ4IDEwMDY0NAotLS0gYS9saWIvcHkvc3JjL1RocmlmdC5weQorKysgYi9saWIvcHkvc3JjL1RocmlmdC5weQpAQCAtMjAsMTUxICsyMCwxNzMgQEAKIGltcG9ydCBzeXMKIAogCi1jbGFzcyBUVHlwZToKLSAgU1RPUCAgID0gMAotICBWT0lEICAgPSAxCi0gIEJPT0wgICA9IDIKLSAgQllURSAgID0gMwotICBJMDggICAgPSAzCi0gIERPVUJMRSA9IDQKLSAgSTE2ICAgID0gNgotICBJMzIgICAgPSA4Ci0gIEk2NCAgICA9IDEwCi0gIFNUUklORyA9IDExCi0gIFVURjcgICA9IDExCi0gIFNUUlVDVCA9IDEyCi0gIE1BUCAgICA9IDEzCi0gIFNFVCAgICA9IDE0Ci0gIExJU1QgICA9IDE1Ci0gIFVURjggICA9IDE2Ci0gIFVURjE2ICA9IDE3CitjbGFzcyBUVHlwZShvYmplY3QpOgorICAgIFNUT1AgPSAwCisgICAgVk9JRCA9IDEKKyAgICBCT09MID0gMgorICAgIEJZVEUgPSAzCisgICAgSTA4ID0gMworICAgIERPVUJMRSA9IDQKKyAgICBJMTYgPSA2CisgICAgSTMyID0gOAorICAgIEk2NCA9IDEwCisgICAgU1RSSU5HID0gMTEKKyAgICBVVEY3ID0gMTEKKyAgICBTVFJVQ1QgPSAxMgorICAgIE1BUCA9IDEzCisgICAgU0VUID0gMTQKKyAgICBMSVNUID0gMTUKKyAgICBVVEY4ID0gMTYKKyAgICBVVEYxNiA9IDE3CiAKLSAgX1ZBTFVFU19UT19OQU1FUyA9ICgnU1RPUCcsCi0gICAgICAgICAgICAgICAgICAgICAgJ1ZPSUQnLAotICAgICAgICAgICAgICAgICAgICAgICdCT09MJywKLSAgICAgICAgICAgICAgICAgICAgICAnQllURScsCi0gICAgICAgICAgICAgICAgICAgICAgJ0RPVUJMRScsCi0gICAgICAgICAgICAgICAgICAgICAgTm9uZSwKLSAgICAgICAgICAgICAgICAgICAgICAnSTE2JywKLSAgICAgICAgICAgICAgICAgICAgICBOb25lLAotICAgICAgICAgICAgICAgICAgICAgICdJMzInLAotICAgICAgICAgICAgICAgICAgICAgIE5vbmUsCi0gICAgICAgICAgICAgICAgICAgICAnSTY0JywKLSAgICAgICAgICAgICAgICAgICAgICdTVFJJTkcnLAotICAgICAgICAgICAgICAgICAgICAgJ1NUUlVDVCcsCi0gICAgICAgICAgICAgICAgICAgICAnTUFQJywKLSAgICAgICAgICAgICAgICAgICAgICdTRVQnLAotICAgICAgICAgICAgICAgICAgICAgJ0xJU1QnLAotICAgICAgICAgICAgICAgICAgICAgJ1VURjgnLAotICAgICAgICAgICAgICAgICAgICAgJ1VURjE2JykKKyAgICBfVkFMVUVTX1RPX05BTUVTID0gKAorICAgICAgICAnU1RPUCcsCisgICAgICAgICdWT0lEJywKKyAgICAgICAgJ0JPT0wnLAorICAgICAgICAnQllURScsCisgICAgICAgICdET1VCTEUnLAorICAgICAgICBOb25lLAorICAgICAgICAnSTE2JywKKyAgICAgICAgTm9uZSwKKyAgICAgICAgJ0kzMicsCisgICAgICAgIE5vbmUsCisgICAgICAgICdJNjQnLAorICAgICAgICAnU1RSSU5HJywKKyAgICAgICAgJ1NUUlVDVCcsCisgICAgICAgICdNQVAnLAorICAgICAgICAnU0VUJywKKyAgICAgICAgJ0xJU1QnLAorICAgICAgICAnVVRGOCcsCisgICAgICAgICdVVEYxNicsCisgICAgKQogCiAKLWNsYXNzIFRNZXNzYWdlVHlwZToKLSAgQ0FMTCA9IDEKLSAgUkVQTFkgPSAyCi0gIEVYQ0VQVElPTiA9IDMKLSAgT05FV0FZID0gNAorY2xhc3MgVE1lc3NhZ2VUeXBlKG9iamVjdCk6CisgICAgQ0FMTCA9IDEKKyAgICBSRVBMWSA9IDIKKyAgICBFWENFUFRJT04gPSAzCisgICAgT05FV0FZID0gNAogCiAKLWNsYXNzIFRQcm9jZXNzb3I6Ci0gICIiIkJhc2UgY2xhc3MgZm9yIHByb2NzZXNzb3IsIHdoaWNoIHdvcmtzIG9uIHR3byBzdHJlYW1zLiIiIgorY2xhc3MgVFByb2Nlc3NvcihvYmplY3QpOgorICAgICIiIkJhc2UgY2xhc3MgZm9yIHByb2Nlc3Nvciwgd2hpY2ggd29ya3Mgb24gdHdvIHN0cmVhbXMuIiIiCiAKLSAgZGVmIHByb2Nlc3MoaXByb3QsIG9wcm90KToKLSAgICBwYXNzCisgICAgZGVmIHByb2Nlc3Moc2VsZiwgaXByb3QsIG9wcm90KToKKyAgICAgICAgcGFzcwogCiAKIGNsYXNzIFRFeGNlcHRpb24oRXhjZXB0aW9uKToKLSAgIiIiQmFzZSBjbGFzcyBmb3IgYWxsIHRocmlmdCBleGNlcHRpb25zLiIiIgorICAgICIiIkJhc2UgY2xhc3MgZm9yIGFsbCB0aHJpZnQgZXhjZXB0aW9ucy4iIiIKIAotICAjIEJhc2VFeGNlcHRpb24ubWVzc2FnZSBpcyBkZXByZWNhdGVkIGluIFB5dGhvbiB2WzIuNiwzLjApCi0gIGlmICgyLCA2LCAwKSA8PSBzeXMudmVyc2lvbl9pbmZvIDwgKDMsIDApOgotICAgIGRlZiBfZ2V0X21lc3NhZ2Uoc2VsZik6Ci0gICAgICByZXR1cm4gc2VsZi5fbWVzc2FnZQorICAgICMgQmFzZUV4Y2VwdGlvbi5tZXNzYWdlIGlzIGRlcHJlY2F0ZWQgaW4gUHl0aG9uIHZbMi42LDMuMCkKKyAgICBpZiAoMiwgNiwgMCkgPD0gc3lzLnZlcnNpb25faW5mbyA8ICgzLCAwKToKKyAgICAgICAgZGVmIF9nZXRfbWVzc2FnZShzZWxmKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9tZXNzYWdlCiAKLSAgICBkZWYgX3NldF9tZXNzYWdlKHNlbGYsIG1lc3NhZ2UpOgotICAgICAgc2VsZi5fbWVzc2FnZSA9IG1lc3NhZ2UKLSAgICBtZXNzYWdlID0gcHJvcGVydHkoX2dldF9tZXNzYWdlLCBfc2V0X21lc3NhZ2UpCisgICAgICAgIGRlZiBfc2V0X21lc3NhZ2Uoc2VsZiwgbWVzc2FnZSk6CisgICAgICAgICAgICBzZWxmLl9tZXNzYWdlID0gbWVzc2FnZQorICAgICAgICBtZXNzYWdlID0gcHJvcGVydHkoX2dldF9tZXNzYWdlLCBfc2V0X21lc3NhZ2UpCiAKLSAgZGVmIF9faW5pdF9fKHNlbGYsIG1lc3NhZ2U9Tm9uZSk6Ci0gICAgRXhjZXB0aW9uLl9faW5pdF9fKHNlbGYsIG1lc3NhZ2UpCi0gICAgc2VsZi5tZXNzYWdlID0gbWVzc2FnZQorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtZXNzYWdlPU5vbmUpOgorICAgICAgICBFeGNlcHRpb24uX19pbml0X18oc2VsZiwgbWVzc2FnZSkKKyAgICAgICAgc2VsZi5tZXNzYWdlID0gbWVzc2FnZQogCiAKIGNsYXNzIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihURXhjZXB0aW9uKToKLSAgIiIiQXBwbGljYXRpb24gbGV2ZWwgdGhyaWZ0IGV4Y2VwdGlvbnMuIiIiCisgICAgIiIiQXBwbGljYXRpb24gbGV2ZWwgdGhyaWZ0IGV4Y2VwdGlvbnMuIiIiCiAKLSAgVU5LTk9XTiA9IDAKLSAgVU5LTk9XTl9NRVRIT0QgPSAxCi0gIElOVkFMSURfTUVTU0FHRV9UWVBFID0gMgotICBXUk9OR19NRVRIT0RfTkFNRSA9IDMKLSAgQkFEX1NFUVVFTkNFX0lEID0gNAotICBNSVNTSU5HX1JFU1VMVCA9IDUKLSAgSU5URVJOQUxfRVJST1IgPSA2Ci0gIFBST1RPQ09MX0VSUk9SID0gNwotICBJTlZBTElEX1RSQU5TRk9STSA9IDgKLSAgSU5WQUxJRF9QUk9UT0NPTCA9IDkKLSAgVU5TVVBQT1JURURfQ0xJRU5UX1RZUEUgPSAxMAorICAgIFVOS05PV04gPSAwCisgICAgVU5LTk9XTl9NRVRIT0QgPSAxCisgICAgSU5WQUxJRF9NRVNTQUdFX1RZUEUgPSAyCisgICAgV1JPTkdfTUVUSE9EX05BTUUgPSAzCisgICAgQkFEX1NFUVVFTkNFX0lEID0gNAorICAgIE1JU1NJTkdfUkVTVUxUID0gNQorICAgIElOVEVSTkFMX0VSUk9SID0gNgorICAgIFBST1RPQ09MX0VSUk9SID0gNworICAgIElOVkFMSURfVFJBTlNGT1JNID0gOAorICAgIElOVkFMSURfUFJPVE9DT0wgPSA5CisgICAgVU5TVVBQT1JURURfQ0xJRU5UX1RZUEUgPSAxMAogCi0gIGRlZiBfX2luaXRfXyhzZWxmLCB0eXBlPVVOS05PV04sIG1lc3NhZ2U9Tm9uZSk6Ci0gICAgVEV4Y2VwdGlvbi5fX2luaXRfXyhzZWxmLCBtZXNzYWdlKQotICAgIHNlbGYudHlwZSA9IHR5cGUKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdHlwZT1VTktOT1dOLCBtZXNzYWdlPU5vbmUpOgorICAgICAgICBURXhjZXB0aW9uLl9faW5pdF9fKHNlbGYsIG1lc3NhZ2UpCisgICAgICAgIHNlbGYudHlwZSA9IHR5cGUKIAotICBkZWYgX19zdHJfXyhzZWxmKToKLSAgICBpZiBzZWxmLm1lc3NhZ2U6Ci0gICAgICByZXR1cm4gc2VsZi5tZXNzYWdlCi0gICAgZWxpZiBzZWxmLnR5cGUgPT0gc2VsZi5VTktOT1dOX01FVEhPRDoKLSAgICAgIHJldHVybiAnVW5rbm93biBtZXRob2QnCi0gICAgZWxpZiBzZWxmLnR5cGUgPT0gc2VsZi5JTlZBTElEX01FU1NBR0VfVFlQRToKLSAgICAgIHJldHVybiAnSW52YWxpZCBtZXNzYWdlIHR5cGUnCi0gICAgZWxpZiBzZWxmLnR5cGUgPT0gc2VsZi5XUk9OR19NRVRIT0RfTkFNRToKLSAgICAgIHJldHVybiAnV3JvbmcgbWV0aG9kIG5hbWUnCi0gICAgZWxpZiBzZWxmLnR5cGUgPT0gc2VsZi5CQURfU0VRVUVOQ0VfSUQ6Ci0gICAgICByZXR1cm4gJ0JhZCBzZXF1ZW5jZSBJRCcKLSAgICBlbGlmIHNlbGYudHlwZSA9PSBzZWxmLk1JU1NJTkdfUkVTVUxUOgotICAgICAgcmV0dXJuICdNaXNzaW5nIHJlc3VsdCcKLSAgICBlbGlmIHNlbGYudHlwZSA9PSBzZWxmLklOVEVSTkFMX0VSUk9SOgotICAgICAgcmV0dXJuICdJbnRlcm5hbCBlcnJvcicKLSAgICBlbGlmIHNlbGYudHlwZSA9PSBzZWxmLlBST1RPQ09MX0VSUk9SOgotICAgICAgcmV0dXJuICdQcm90b2NvbCBlcnJvcicKLSAgICBlbGlmIHNlbGYudHlwZSA9PSBzZWxmLklOVkFMSURfVFJBTlNGT1JNOgotICAgICAgcmV0dXJuICdJbnZhbGlkIHRyYW5zZm9ybScKLSAgICBlbGlmIHNlbGYudHlwZSA9PSBzZWxmLklOVkFMSURfUFJPVE9DT0w6Ci0gICAgICByZXR1cm4gJ0ludmFsaWQgcHJvdG9jb2wnCi0gICAgZWxpZiBzZWxmLnR5cGUgPT0gc2VsZi5VTlNVUFBPUlRFRF9DTElFTlRfVFlQRToKLSAgICAgIHJldHVybiAnVW5zdXBwb3J0ZWQgY2xpZW50IHR5cGUnCi0gICAgZWxzZToKLSAgICAgIHJldHVybiAnRGVmYXVsdCAodW5rbm93bikgVEFwcGxpY2F0aW9uRXhjZXB0aW9uJwotCi0gIGRlZiByZWFkKHNlbGYsIGlwcm90KToKLSAgICBpcHJvdC5yZWFkU3RydWN0QmVnaW4oKQotICAgIHdoaWxlIFRydWU6Ci0gICAgICAoZm5hbWUsIGZ0eXBlLCBmaWQpID0gaXByb3QucmVhZEZpZWxkQmVnaW4oKQotICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuU1RPUDoKLSAgICAgICAgYnJlYWsKLSAgICAgIGlmIGZpZCA9PSAxOgotICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5TVFJJTkc6Ci0gICAgICAgICAgc2VsZi5tZXNzYWdlID0gaXByb3QucmVhZFN0cmluZygpCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIGlmIHNlbGYubWVzc2FnZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLm1lc3NhZ2UKKyAgICAgICAgZWxpZiBzZWxmLnR5cGUgPT0gc2VsZi5VTktOT1dOX01FVEhPRDoKKyAgICAgICAgICAgIHJldHVybiAnVW5rbm93biBtZXRob2QnCisgICAgICAgIGVsaWYgc2VsZi50eXBlID09IHNlbGYuSU5WQUxJRF9NRVNTQUdFX1RZUEU6CisgICAgICAgICAgICByZXR1cm4gJ0ludmFsaWQgbWVzc2FnZSB0eXBlJworICAgICAgICBlbGlmIHNlbGYudHlwZSA9PSBzZWxmLldST05HX01FVEhPRF9OQU1FOgorICAgICAgICAgICAgcmV0dXJuICdXcm9uZyBtZXRob2QgbmFtZScKKyAgICAgICAgZWxpZiBzZWxmLnR5cGUgPT0gc2VsZi5CQURfU0VRVUVOQ0VfSUQ6CisgICAgICAgICAgICByZXR1cm4gJ0JhZCBzZXF1ZW5jZSBJRCcKKyAgICAgICAgZWxpZiBzZWxmLnR5cGUgPT0gc2VsZi5NSVNTSU5HX1JFU1VMVDoKKyAgICAgICAgICAgIHJldHVybiAnTWlzc2luZyByZXN1bHQnCisgICAgICAgIGVsaWYgc2VsZi50eXBlID09IHNlbGYuSU5URVJOQUxfRVJST1I6CisgICAgICAgICAgICByZXR1cm4gJ0ludGVybmFsIGVycm9yJworICAgICAgICBlbGlmIHNlbGYudHlwZSA9PSBzZWxmLlBST1RPQ09MX0VSUk9SOgorICAgICAgICAgICAgcmV0dXJuICdQcm90b2NvbCBlcnJvcicKKyAgICAgICAgZWxpZiBzZWxmLnR5cGUgPT0gc2VsZi5JTlZBTElEX1RSQU5TRk9STToKKyAgICAgICAgICAgIHJldHVybiAnSW52YWxpZCB0cmFuc2Zvcm0nCisgICAgICAgIGVsaWYgc2VsZi50eXBlID09IHNlbGYuSU5WQUxJRF9QUk9UT0NPTDoKKyAgICAgICAgICAgIHJldHVybiAnSW52YWxpZCBwcm90b2NvbCcKKyAgICAgICAgZWxpZiBzZWxmLnR5cGUgPT0gc2VsZi5VTlNVUFBPUlRFRF9DTElFTlRfVFlQRToKKyAgICAgICAgICAgIHJldHVybiAnVW5zdXBwb3J0ZWQgY2xpZW50IHR5cGUnCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKLSAgICAgIGVsaWYgZmlkID09IDI6Ci0gICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLkkzMjoKLSAgICAgICAgICBzZWxmLnR5cGUgPSBpcHJvdC5yZWFkSTMyKCkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQotICAgICAgZWxzZToKLSAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKLSAgICAgIGlwcm90LnJlYWRGaWVsZEVuZCgpCi0gICAgaXByb3QucmVhZFN0cnVjdEVuZCgpCisgICAgICAgICAgICByZXR1cm4gJ0RlZmF1bHQgKHVua25vd24pIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbicKIAotICBkZWYgd3JpdGUoc2VsZiwgb3Byb3QpOgotICAgIG9wcm90LndyaXRlU3RydWN0QmVnaW4oJ1RBcHBsaWNhdGlvbkV4Y2VwdGlvbicpCi0gICAgaWYgc2VsZi5tZXNzYWdlIGlzIG5vdCBOb25lOgotICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKCdtZXNzYWdlJywgVFR5cGUuU1RSSU5HLCAxKQotICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoc2VsZi5tZXNzYWdlKQotICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpCi0gICAgaWYgc2VsZi50eXBlIGlzIG5vdCBOb25lOgotICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKCd0eXBlJywgVFR5cGUuSTMyLCAyKQotICAgICAgb3Byb3Qud3JpdGVJMzIoc2VsZi50eXBlKQotICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpCi0gICAgb3Byb3Qud3JpdGVGaWVsZFN0b3AoKQotICAgIG9wcm90LndyaXRlU3RydWN0RW5kKCkKKyAgICBkZWYgcmVhZChzZWxmLCBpcHJvdCk6CisgICAgICAgIGlwcm90LnJlYWRTdHJ1Y3RCZWdpbigpCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAoZm5hbWUsIGZ0eXBlLCBmaWQpID0gaXByb3QucmVhZEZpZWxkQmVnaW4oKQorICAgICAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuU1RPUDoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgaWYgZmlkID09IDE6CisgICAgICAgICAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuU1RSSU5HOgorICAgICAgICAgICAgICAgICAgICBzZWxmLm1lc3NhZ2UgPSBpcHJvdC5yZWFkU3RyaW5nKCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQorICAgICAgICAgICAgZWxpZiBmaWQgPT0gMjoKKyAgICAgICAgICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5JMzI6CisgICAgICAgICAgICAgICAgICAgIHNlbGYudHlwZSA9IGlwcm90LnJlYWRJMzIoKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCisgICAgICAgICAgICBpcHJvdC5yZWFkRmllbGRFbmQoKQorICAgICAgICBpcHJvdC5yZWFkU3RydWN0RW5kKCkKKworICAgIGRlZiB3cml0ZShzZWxmLCBvcHJvdCk6CisgICAgICAgIG9wcm90LndyaXRlU3RydWN0QmVnaW4oJ1RBcHBsaWNhdGlvbkV4Y2VwdGlvbicpCisgICAgICAgIGlmIHNlbGYubWVzc2FnZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbignbWVzc2FnZScsIFRUeXBlLlNUUklORywgMSkKKyAgICAgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKHNlbGYubWVzc2FnZSkKKyAgICAgICAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKQorICAgICAgICBpZiBzZWxmLnR5cGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oJ3R5cGUnLCBUVHlwZS5JMzIsIDIpCisgICAgICAgICAgICBvcHJvdC53cml0ZUkzMihzZWxmLnR5cGUpCisgICAgICAgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCkKKyAgICAgICAgb3Byb3Qud3JpdGVGaWVsZFN0b3AoKQorICAgICAgICBvcHJvdC53cml0ZVN0cnVjdEVuZCgpCisKKworY2xhc3MgVEZyb3plbkRpY3QoZGljdCk6CisgICAgIiIiQSBkaWN0aW9uYXJ5IHRoYXQgaXMgImZyb3plbiIgbGlrZSBhIGZyb3plbnNldCIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHN1cGVyKFRGcm96ZW5EaWN0LCBzZWxmKS5fX2luaXRfXygqYXJncywgKiprd2FyZ3MpCisgICAgICAgICMgU29ydCB0aGUgaXRlbXMgc28gdGhleSB3aWxsIGJlIGluIGEgY29uc2lzdGVudCBvcmRlci4KKyAgICAgICAgIyBYT1IgaW4gdGhlIGhhc2ggb2YgdGhlIGNsYXNzIHNvIHdlIGRvbid0IGNvbGxpZGUgd2l0aAorICAgICAgICAjIHRoZSBoYXNoIG9mIGEgbGlzdCBvZiB0dXBsZXMuCisgICAgICAgIHNlbGYuX19oYXNodmFsID0gaGFzaChURnJvemVuRGljdCkgXiBoYXNoKHR1cGxlKHNvcnRlZChzZWxmLml0ZW1zKCkpKSkKKworICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCAqYXJncyk6CisgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiQ2FuJ3QgbW9kaWZ5IGZyb3plbiBURnJlZXphYmxlRGljdCIpCisKKyAgICBkZWYgX19kZWxpdGVtX18oc2VsZiwgKmFyZ3MpOgorICAgICAgICByYWlzZSBUeXBlRXJyb3IoIkNhbid0IG1vZGlmeSBmcm96ZW4gVEZyZWV6YWJsZURpY3QiKQorCisgICAgZGVmIF9faGFzaF9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fX2hhc2h2YWwKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvY29tcGF0LnB5IGIvbGliL3B5L3NyYy9jb21wYXQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU4MjcxZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weS9zcmMvY29tcGF0LnB5CkBAIC0wLDAgKzEsNDYgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitpbXBvcnQgc3lzCisKK2lmIHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMjoKKworICAgIGZyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTyBhcyBCdWZmZXJJTworCisgICAgZGVmIGJpbmFyeV90b19zdHIoYmluX3ZhbCk6CisgICAgICAgIHJldHVybiBiaW5fdmFsCisKKyAgICBkZWYgc3RyX3RvX2JpbmFyeShzdHJfdmFsKToKKyAgICAgICAgcmV0dXJuIHN0cl92YWwKKworICAgIGRlZiBieXRlX2luZGV4KGJ5dGVzX3ZhbCwgaSk6CisgICAgICAgIHJldHVybiBvcmQoYnl0ZXNfdmFsW2ldKQorCitlbHNlOgorCisgICAgZnJvbSBpbyBpbXBvcnQgQnl0ZXNJTyBhcyBCdWZmZXJJTyAgIyBub3FhCisKKyAgICBkZWYgYmluYXJ5X3RvX3N0cihiaW5fdmFsKToKKyAgICAgICAgcmV0dXJuIGJpbl92YWwuZGVjb2RlKCd1dGY4JykKKworICAgIGRlZiBzdHJfdG9fYmluYXJ5KHN0cl92YWwpOgorICAgICAgICByZXR1cm4gYnl0ZXMoc3RyX3ZhbCwgJ3V0ZjgnKQorCisgICAgZGVmIGJ5dGVfaW5kZXgoYnl0ZXNfdmFsLCBpKToKKyAgICAgICAgcmV0dXJuIGJ5dGVzX3ZhbFtpXQpkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9leHQvYmluYXJ5LmNwcCBiL2xpYi9weS9zcmMvZXh0L2JpbmFyeS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVkOGQ5MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weS9zcmMvZXh0L2JpbmFyeS5jcHAKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiZXh0L2JpbmFyeS5oIgorbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBweSB7CisKK2Jvb2wgQmluYXJ5UHJvdG9jb2w6OnJlYWRGaWVsZEJlZ2luKFRUeXBlJiB0eXBlLCBpbnQxNl90JiB0YWcpIHsKKyAgdWludDhfdCBiID0gMDsKKyAgaWYgKCFyZWFkQnl0ZShiKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICB0eXBlID0gc3RhdGljX2Nhc3Q8VFR5cGU+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+IGJ1ZjsKKyAgc2l6ZV90IHBvczsKK307CisjZW5kaWYKKworLyoqCisgKiBBIGNhY2hlIG9mIHRoZSBzcGVjX2FyZ3MgZm9yIGEgc2V0IG9yIGxpc3QsCisgKiBzbyB3ZSBkb24ndCBoYXZlIHRvIGtlZXAgY2FsbGluZyBQeVR1cGxlX0dFVF9JVEVNLgorICovCitzdHJ1Y3QgU2V0TGlzdFR5cGVBcmdzIHsKKyAgVFR5cGUgZWxlbWVudF90eXBlOworICBQeU9iamVjdCogdHlwZWFyZ3M7CisgIGJvb2wgaW1tdXRhYmxlOworfTsKKworLyoqCisgKiBBIGNhY2hlIG9mIHRoZSBzcGVjX2FyZ3MgZm9yIGEgbWFwLAorICogc28gd2UgZG9uJ3QgaGF2ZSB0byBrZWVwIGNhbGxpbmcgUHlUdXBsZV9HRVRfSVRFTS4KKyAqLworc3RydWN0IE1hcFR5cGVBcmdzIHsKKyAgVFR5cGUga3RhZzsKKyAgVFR5cGUgdnRhZzsKKyAgUHlPYmplY3QqIGt0eXBlYXJnczsKKyAgUHlPYmplY3QqIHZ0eXBlYXJnczsKKyAgYm9vbCBpbW11dGFibGU7Cit9OworCisvKioKKyAqIEEgY2FjaGUgb2YgdGhlIHNwZWNfYXJncyBmb3IgYSBzdHJ1Y3QsCisgKiBzbyB3ZSBkb24ndCBoYXZlIHRvIGtlZXAgY2FsbGluZyBQeVR1cGxlX0dFVF9JVEVNLgorICovCitzdHJ1Y3QgU3RydWN0VHlwZUFyZ3MgeworICBQeU9iamVjdCoga2xhc3M7CisgIFB5T2JqZWN0KiBzcGVjOworICBib29sIGltbXV0YWJsZTsKK307CisKKy8qKgorICogQSBjYWNoZSBvZiB0aGUgaXRlbSBzcGVjIGZyb20gYSBzdHJ1Y3Qgc3BlY2lmaWNhdGlvbiwKKyAqIHNvIHdlIGRvbid0IGhhdmUgdG8ga2VlcCBjYWxsaW5nIFB5VHVwbGVfR0VUX0lURU0uCisgKi8KK3N0cnVjdCBTdHJ1Y3RJdGVtU3BlYyB7CisgIGludCB0YWc7CisgIFRUeXBlIHR5cGU7CisgIFB5T2JqZWN0KiBhdHRybmFtZTsKKyAgUHlPYmplY3QqIHR5cGVhcmdzOworICBQeU9iamVjdCogZGVmdmFsOworfTsKKworYm9vbCBwYXJzZV9zZXRfbGlzdF9hcmdzKFNldExpc3RUeXBlQXJncyogZGVzdCwgUHlPYmplY3QqIHR5cGVhcmdzKTsKKworYm9vbCBwYXJzZV9tYXBfYXJncyhNYXBUeXBlQXJncyogZGVzdCwgUHlPYmplY3QqIHR5cGVhcmdzKTsKKworYm9vbCBwYXJzZV9zdHJ1Y3RfYXJncyhTdHJ1Y3RUeXBlQXJncyogZGVzdCwgUHlPYmplY3QqIHR5cGVhcmdzKTsKKworYm9vbCBwYXJzZV9zdHJ1Y3RfaXRlbV9zcGVjKFN0cnVjdEl0ZW1TcGVjKiBkZXN0LCBQeU9iamVjdCogc3BlY190dXBsZSk7Cit9Cit9Cit9CisKKyNlbmRpZiAvLyBUSFJJRlRfUFlfVFlQRVNfSApkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9wcm90b2NvbC9UQmFzZS5weSBiL2xpYi9weS9zcmMvcHJvdG9jb2wvVEJhc2UucHkKaW5kZXggNmNiZDVmMy4uOWFlMWIxMSAxMDA2NDQKLS0tIGEvbGliL3B5L3NyYy9wcm90b2NvbC9UQmFzZS5weQorKysgYi9saWIvcHkvc3JjL3Byb3RvY29sL1RCYXNlLnB5CkBAIC0xNyw2NSArMTcsNjYgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLWZyb20gdGhyaWZ0LlRocmlmdCBpbXBvcnQgKgotZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbAogZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0CiAKLXRyeToKLSAgZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IGZhc3RiaW5hcnkKLWV4Y2VwdDoKLSAgZmFzdGJpbmFyeSA9IE5vbmUKLQogCiBjbGFzcyBUQmFzZShvYmplY3QpOgotICBfX3Nsb3RzX18gPSBbXQorICAgIF9fc2xvdHNfXyA9ICgpCiAKLSAgZGVmIF9fcmVwcl9fKHNlbGYpOgotICAgIEwgPSBbJyVzPSVyJyAlIChrZXksIGdldGF0dHIoc2VsZiwga2V5KSkKLSAgICAgICAgICAgICAgZm9yIGtleSBpbiBzZWxmLl9fc2xvdHNfX10KLSAgICByZXR1cm4gJyVzKCVzKScgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sICcsICcuam9pbihMKSkKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIEwgPSBbJyVzPSVyJyAlIChrZXksIGdldGF0dHIoc2VsZiwga2V5KSkgZm9yIGtleSBpbiBzZWxmLl9fc2xvdHNfX10KKyAgICAgICAgcmV0dXJuICclcyglcyknICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCAnLCAnLmpvaW4oTCkpCiAKLSAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6Ci0gICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKToKLSAgICAgIHJldHVybiBGYWxzZQotICAgIGZvciBhdHRyIGluIHNlbGYuX19zbG90c19fOgotICAgICAgbXlfdmFsID0gZ2V0YXR0cihzZWxmLCBhdHRyKQotICAgICAgb3RoZXJfdmFsID0gZ2V0YXR0cihvdGhlciwgYXR0cikKLSAgICAgIGlmIG15X3ZhbCAhPSBvdGhlcl92YWw6Ci0gICAgICAgIHJldHVybiBGYWxzZQotICAgIHJldHVybiBUcnVlCisgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBzZWxmLl9fY2xhc3NfXyk6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgZm9yIGF0dHIgaW4gc2VsZi5fX3Nsb3RzX186CisgICAgICAgICAgICBteV92YWwgPSBnZXRhdHRyKHNlbGYsIGF0dHIpCisgICAgICAgICAgICBvdGhlcl92YWwgPSBnZXRhdHRyKG90aGVyLCBhdHRyKQorICAgICAgICAgICAgaWYgbXlfdmFsICE9IG90aGVyX3ZhbDoKKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgcmV0dXJuIFRydWUKIAotICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKLSAgICByZXR1cm4gbm90IChzZWxmID09IG90aGVyKQorICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgorICAgICAgICByZXR1cm4gbm90IChzZWxmID09IG90aGVyKQogCi0gIGRlZiByZWFkKHNlbGYsIGlwcm90KToKLSAgICBpZiAoaXByb3QuX19jbGFzc19fID09IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCBhbmQKLSAgICAgICAgaXNpbnN0YW5jZShpcHJvdC50cmFucywgVFRyYW5zcG9ydC5DUmVhZGFibGVUcmFuc3BvcnQpIGFuZAotICAgICAgICBzZWxmLnRocmlmdF9zcGVjIGlzIG5vdCBOb25lIGFuZAotICAgICAgICBmYXN0YmluYXJ5IGlzIG5vdCBOb25lKToKLSAgICAgIGZhc3RiaW5hcnkuZGVjb2RlX2JpbmFyeShzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlwcm90LnRyYW5zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxmLl9fY2xhc3NfXywgc2VsZi50aHJpZnRfc3BlYykpCi0gICAgICByZXR1cm4KLSAgICBpcHJvdC5yZWFkU3RydWN0KHNlbGYsIHNlbGYudGhyaWZ0X3NwZWMpCisgICAgZGVmIHJlYWQoc2VsZiwgaXByb3QpOgorICAgICAgICBpZiAoaXByb3QuX2Zhc3RfZGVjb2RlIGlzIG5vdCBOb25lIGFuZAorICAgICAgICAgICAgICAgIGlzaW5zdGFuY2UoaXByb3QudHJhbnMsIFRUcmFuc3BvcnQuQ1JlYWRhYmxlVHJhbnNwb3J0KSBhbmQKKyAgICAgICAgICAgICAgICBzZWxmLnRocmlmdF9zcGVjIGlzIG5vdCBOb25lKToKKyAgICAgICAgICAgIGlwcm90Ll9mYXN0X2RlY29kZShzZWxmLCBpcHJvdCwgW3NlbGYuX19jbGFzc19fLCBzZWxmLnRocmlmdF9zcGVjXSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlwcm90LnJlYWRTdHJ1Y3Qoc2VsZiwgc2VsZi50aHJpZnRfc3BlYykKIAotICBkZWYgd3JpdGUoc2VsZiwgb3Byb3QpOgotICAgIGlmIChvcHJvdC5fX2NsYXNzX18gPT0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkIGFuZAotICAgICAgICBzZWxmLnRocmlmdF9zcGVjIGlzIG5vdCBOb25lIGFuZAotICAgICAgICBmYXN0YmluYXJ5IGlzIG5vdCBOb25lKToKLSAgICAgIG9wcm90LnRyYW5zLndyaXRlKAotICAgICAgICBmYXN0YmluYXJ5LmVuY29kZV9iaW5hcnkoc2VsZiwgKHNlbGYuX19jbGFzc19fLCBzZWxmLnRocmlmdF9zcGVjKSkpCi0gICAgICByZXR1cm4KLSAgICBvcHJvdC53cml0ZVN0cnVjdChzZWxmLCBzZWxmLnRocmlmdF9zcGVjKQorICAgIGRlZiB3cml0ZShzZWxmLCBvcHJvdCk6CisgICAgICAgIGlmIChvcHJvdC5fZmFzdF9lbmNvZGUgaXMgbm90IE5vbmUgYW5kIHNlbGYudGhyaWZ0X3NwZWMgaXMgbm90IE5vbmUpOgorICAgICAgICAgICAgb3Byb3QudHJhbnMud3JpdGUoCisgICAgICAgICAgICAgICAgb3Byb3QuX2Zhc3RfZW5jb2RlKHNlbGYsIFtzZWxmLl9fY2xhc3NfXywgc2VsZi50aHJpZnRfc3BlY10pKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgb3Byb3Qud3JpdGVTdHJ1Y3Qoc2VsZiwgc2VsZi50aHJpZnRfc3BlYykKIAogCi1jbGFzcyBURXhjZXB0aW9uQmFzZShFeGNlcHRpb24pOgotICAjIG9sZCBzdHlsZSBjbGFzcyBzbyBweXRob24yLjQgY2FuIHJhaXNlIGV4Y2VwdGlvbnMgZGVyaXZlZCBmcm9tIHRoaXMKLSAgIyAgVGhpcyBjYW4ndCBpbmhlcml0IGZyb20gVEJhc2UgYmVjYXVzZSBvZiB0aGF0IGxpbWl0YXRpb24uCi0gIF9fc2xvdHNfXyA9IFtdCitjbGFzcyBURXhjZXB0aW9uQmFzZShUQmFzZSwgRXhjZXB0aW9uKToKKyAgICBwYXNzCiAKLSAgX19yZXByX18gPSBUQmFzZS5fX3JlcHJfXy5pbV9mdW5jCi0gIF9fZXFfXyA9IFRCYXNlLl9fZXFfXy5pbV9mdW5jCi0gIF9fbmVfXyA9IFRCYXNlLl9fbmVfXy5pbV9mdW5jCi0gIHJlYWQgPSBUQmFzZS5yZWFkLmltX2Z1bmMKLSAgd3JpdGUgPSBUQmFzZS53cml0ZS5pbV9mdW5jCisKK2NsYXNzIFRGcm96ZW5CYXNlKFRCYXNlKToKKyAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwgKmFyZ3MpOgorICAgICAgICByYWlzZSBUeXBlRXJyb3IoIkNhbid0IG1vZGlmeSBmcm96ZW4gc3RydWN0IikKKworICAgIGRlZiBfX2RlbGl0ZW1fXyhzZWxmLCAqYXJncyk6CisgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiQ2FuJ3QgbW9kaWZ5IGZyb3plbiBzdHJ1Y3QiKQorCisgICAgZGVmIF9faGFzaF9fKHNlbGYsICphcmdzKToKKyAgICAgICAgcmV0dXJuIGhhc2goc2VsZi5fX2NsYXNzX18pIF4gaGFzaChzZWxmLl9fc2xvdHNfXykKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiByZWFkKGNscywgaXByb3QpOgorICAgICAgICBpZiAoaXByb3QuX2Zhc3RfZGVjb2RlIGlzIG5vdCBOb25lIGFuZAorICAgICAgICAgICAgICAgIGlzaW5zdGFuY2UoaXByb3QudHJhbnMsIFRUcmFuc3BvcnQuQ1JlYWRhYmxlVHJhbnNwb3J0KSBhbmQKKyAgICAgICAgICAgICAgICBjbHMudGhyaWZ0X3NwZWMgaXMgbm90IE5vbmUpOgorICAgICAgICAgICAgc2VsZiA9IGNscygpCisgICAgICAgICAgICByZXR1cm4gaXByb3QuX2Zhc3RfZGVjb2RlKE5vbmUsIGlwcm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2VsZi5fX2NsYXNzX18sIHNlbGYudGhyaWZ0X3NwZWNdKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIGlwcm90LnJlYWRTdHJ1Y3QoY2xzLCBjbHMudGhyaWZ0X3NwZWMsIFRydWUpCmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5weSBiL2xpYi9weS9zcmMvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLnB5CmluZGV4IDZmZGQwOGMuLmY2YmU3NzIgMTAwNjQ0Ci0tLSBhL2xpYi9weS9zcmMvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLnB5CisrKyBiL2xpYi9weS9zcmMvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLnB5CkBAIC0xNywyNDQgKzE3LDI4NSBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotZnJvbSBUUHJvdG9jb2wgaW1wb3J0ICoKK2Zyb20gLlRQcm90b2NvbCBpbXBvcnQgVFR5cGUsIFRQcm90b2NvbEJhc2UsIFRQcm90b2NvbEV4Y2VwdGlvbgogZnJvbSBzdHJ1Y3QgaW1wb3J0IHBhY2ssIHVucGFjawogCiAKIGNsYXNzIFRCaW5hcnlQcm90b2NvbChUUHJvdG9jb2xCYXNlKToKLSAgIiIiQmluYXJ5IGltcGxlbWVudGF0aW9uIG9mIHRoZSBUaHJpZnQgcHJvdG9jb2wgZHJpdmVyLiIiIgorICAgICIiIkJpbmFyeSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVGhyaWZ0IHByb3RvY29sIGRyaXZlci4iIiIKIAotICAjIE5hc3R5SGF4eC4gUHl0aG9uIDIuNCsgb24gMzItYml0IG1hY2hpbmVzIGZvcmNlcyBoZXggY29uc3RhbnRzIHRvIGJlCi0gICMgcG9zaXRpdmUsIGNvbnZlcnRpbmcgdGhpcyBpbnRvIGEgbG9uZy4gSWYgd2UgaGFyZGNvZGUgdGhlIGludCB2YWx1ZQotICAjIGluc3RlYWQgaXQnbGwgc3RheSBpbiAzMiBiaXQtbGFuZC4KKyAgICAjIE5hc3R5SGF4eC4gUHl0aG9uIDIuNCsgb24gMzItYml0IG1hY2hpbmVzIGZvcmNlcyBoZXggY29uc3RhbnRzIHRvIGJlCisgICAgIyBwb3NpdGl2ZSwgY29udmVydGluZyB0aGlzIGludG8gYSBsb25nLiBJZiB3ZSBoYXJkY29kZSB0aGUgaW50IHZhbHVlCisgICAgIyBpbnN0ZWFkIGl0J2xsIHN0YXkgaW4gMzIgYml0LWxhbmQuCiAKLSAgIyBWRVJTSU9OX01BU0sgPSAweGZmZmYwMDAwCi0gIFZFUlNJT05fTUFTSyA9IC02NTUzNgorICAgICMgVkVSU0lPTl9NQVNLID0gMHhmZmZmMDAwMAorICAgIFZFUlNJT05fTUFTSyA9IC02NTUzNgogCi0gICMgVkVSU0lPTl8xID0gMHg4MDAxMDAwMAotICBWRVJTSU9OXzEgPSAtMjE0NzQxODExMgorICAgICMgVkVSU0lPTl8xID0gMHg4MDAxMDAwMAorICAgIFZFUlNJT05fMSA9IC0yMTQ3NDE4MTEyCiAKLSAgVFlQRV9NQVNLID0gMHgwMDAwMDBmZgorICAgIFRZUEVfTUFTSyA9IDB4MDAwMDAwZmYKIAotICBkZWYgX19pbml0X18oc2VsZiwgdHJhbnMsIHN0cmljdFJlYWQ9RmFsc2UsIHN0cmljdFdyaXRlPVRydWUpOgotICAgIFRQcm90b2NvbEJhc2UuX19pbml0X18oc2VsZiwgdHJhbnMpCi0gICAgc2VsZi5zdHJpY3RSZWFkID0gc3RyaWN0UmVhZAotICAgIHNlbGYuc3RyaWN0V3JpdGUgPSBzdHJpY3RXcml0ZQorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0cmFucywgc3RyaWN0UmVhZD1GYWxzZSwgc3RyaWN0V3JpdGU9VHJ1ZSwgKiprd2FyZ3MpOgorICAgICAgICBUUHJvdG9jb2xCYXNlLl9faW5pdF9fKHNlbGYsIHRyYW5zKQorICAgICAgICBzZWxmLnN0cmljdFJlYWQgPSBzdHJpY3RSZWFkCisgICAgICAgIHNlbGYuc3RyaWN0V3JpdGUgPSBzdHJpY3RXcml0ZQorICAgICAgICBzZWxmLnN0cmluZ19sZW5ndGhfbGltaXQgPSBrd2FyZ3MuZ2V0KCdzdHJpbmdfbGVuZ3RoX2xpbWl0JywgTm9uZSkKKyAgICAgICAgc2VsZi5jb250YWluZXJfbGVuZ3RoX2xpbWl0ID0ga3dhcmdzLmdldCgnY29udGFpbmVyX2xlbmd0aF9saW1pdCcsIE5vbmUpCiAKLSAgZGVmIHdyaXRlTWVzc2FnZUJlZ2luKHNlbGYsIG5hbWUsIHR5cGUsIHNlcWlkKToKLSAgICBpZiBzZWxmLnN0cmljdFdyaXRlOgotICAgICAgc2VsZi53cml0ZUkzMihUQmluYXJ5UHJvdG9jb2wuVkVSU0lPTl8xIHwgdHlwZSkKLSAgICAgIHNlbGYud3JpdGVTdHJpbmcobmFtZSkKLSAgICAgIHNlbGYud3JpdGVJMzIoc2VxaWQpCi0gICAgZWxzZToKLSAgICAgIHNlbGYud3JpdGVTdHJpbmcobmFtZSkKLSAgICAgIHNlbGYud3JpdGVCeXRlKHR5cGUpCi0gICAgICBzZWxmLndyaXRlSTMyKHNlcWlkKQorICAgIGRlZiBfY2hlY2tfc3RyaW5nX2xlbmd0aChzZWxmLCBsZW5ndGgpOgorICAgICAgICBzZWxmLl9jaGVja19sZW5ndGgoc2VsZi5zdHJpbmdfbGVuZ3RoX2xpbWl0LCBsZW5ndGgpCiAKLSAgZGVmIHdyaXRlTWVzc2FnZUVuZChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIF9jaGVja19jb250YWluZXJfbGVuZ3RoKHNlbGYsIGxlbmd0aCk6CisgICAgICAgIHNlbGYuX2NoZWNrX2xlbmd0aChzZWxmLmNvbnRhaW5lcl9sZW5ndGhfbGltaXQsIGxlbmd0aCkKIAotICBkZWYgd3JpdGVTdHJ1Y3RCZWdpbihzZWxmLCBuYW1lKToKLSAgICBwYXNzCisgICAgZGVmIHdyaXRlTWVzc2FnZUJlZ2luKHNlbGYsIG5hbWUsIHR5cGUsIHNlcWlkKToKKyAgICAgICAgaWYgc2VsZi5zdHJpY3RXcml0ZToKKyAgICAgICAgICAgIHNlbGYud3JpdGVJMzIoVEJpbmFyeVByb3RvY29sLlZFUlNJT05fMSB8IHR5cGUpCisgICAgICAgICAgICBzZWxmLndyaXRlU3RyaW5nKG5hbWUpCisgICAgICAgICAgICBzZWxmLndyaXRlSTMyKHNlcWlkKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi53cml0ZVN0cmluZyhuYW1lKQorICAgICAgICAgICAgc2VsZi53cml0ZUJ5dGUodHlwZSkKKyAgICAgICAgICAgIHNlbGYud3JpdGVJMzIoc2VxaWQpCiAKLSAgZGVmIHdyaXRlU3RydWN0RW5kKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVNZXNzYWdlRW5kKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHdyaXRlRmllbGRCZWdpbihzZWxmLCBuYW1lLCB0eXBlLCBpZCk6Ci0gICAgc2VsZi53cml0ZUJ5dGUodHlwZSkKLSAgICBzZWxmLndyaXRlSTE2KGlkKQorICAgIGRlZiB3cml0ZVN0cnVjdEJlZ2luKHNlbGYsIG5hbWUpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHdyaXRlRmllbGRFbmQoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiB3cml0ZVN0cnVjdEVuZChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiB3cml0ZUZpZWxkU3RvcChzZWxmKToKLSAgICBzZWxmLndyaXRlQnl0ZShUVHlwZS5TVE9QKQorICAgIGRlZiB3cml0ZUZpZWxkQmVnaW4oc2VsZiwgbmFtZSwgdHlwZSwgaWQpOgorICAgICAgICBzZWxmLndyaXRlQnl0ZSh0eXBlKQorICAgICAgICBzZWxmLndyaXRlSTE2KGlkKQogCi0gIGRlZiB3cml0ZU1hcEJlZ2luKHNlbGYsIGt0eXBlLCB2dHlwZSwgc2l6ZSk6Ci0gICAgc2VsZi53cml0ZUJ5dGUoa3R5cGUpCi0gICAgc2VsZi53cml0ZUJ5dGUodnR5cGUpCi0gICAgc2VsZi53cml0ZUkzMihzaXplKQorICAgIGRlZiB3cml0ZUZpZWxkRW5kKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHdyaXRlTWFwRW5kKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVGaWVsZFN0b3Aoc2VsZik6CisgICAgICAgIHNlbGYud3JpdGVCeXRlKFRUeXBlLlNUT1ApCiAKLSAgZGVmIHdyaXRlTGlzdEJlZ2luKHNlbGYsIGV0eXBlLCBzaXplKToKLSAgICBzZWxmLndyaXRlQnl0ZShldHlwZSkKLSAgICBzZWxmLndyaXRlSTMyKHNpemUpCisgICAgZGVmIHdyaXRlTWFwQmVnaW4oc2VsZiwga3R5cGUsIHZ0eXBlLCBzaXplKToKKyAgICAgICAgc2VsZi53cml0ZUJ5dGUoa3R5cGUpCisgICAgICAgIHNlbGYud3JpdGVCeXRlKHZ0eXBlKQorICAgICAgICBzZWxmLndyaXRlSTMyKHNpemUpCiAKLSAgZGVmIHdyaXRlTGlzdEVuZChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHdyaXRlTWFwRW5kKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHdyaXRlU2V0QmVnaW4oc2VsZiwgZXR5cGUsIHNpemUpOgotICAgIHNlbGYud3JpdGVCeXRlKGV0eXBlKQotICAgIHNlbGYud3JpdGVJMzIoc2l6ZSkKKyAgICBkZWYgd3JpdGVMaXN0QmVnaW4oc2VsZiwgZXR5cGUsIHNpemUpOgorICAgICAgICBzZWxmLndyaXRlQnl0ZShldHlwZSkKKyAgICAgICAgc2VsZi53cml0ZUkzMihzaXplKQogCi0gIGRlZiB3cml0ZVNldEVuZChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHdyaXRlTGlzdEVuZChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiB3cml0ZUJvb2woc2VsZiwgYm9vbCk6Ci0gICAgaWYgYm9vbDoKLSAgICAgIHNlbGYud3JpdGVCeXRlKDEpCi0gICAgZWxzZToKLSAgICAgIHNlbGYud3JpdGVCeXRlKDApCisgICAgZGVmIHdyaXRlU2V0QmVnaW4oc2VsZiwgZXR5cGUsIHNpemUpOgorICAgICAgICBzZWxmLndyaXRlQnl0ZShldHlwZSkKKyAgICAgICAgc2VsZi53cml0ZUkzMihzaXplKQogCi0gIGRlZiB3cml0ZUJ5dGUoc2VsZiwgYnl0ZSk6Ci0gICAgYnVmZiA9IHBhY2soIiFiIiwgYnl0ZSkKLSAgICBzZWxmLnRyYW5zLndyaXRlKGJ1ZmYpCisgICAgZGVmIHdyaXRlU2V0RW5kKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHdyaXRlSTE2KHNlbGYsIGkxNik6Ci0gICAgYnVmZiA9IHBhY2soIiFoIiwgaTE2KQotICAgIHNlbGYudHJhbnMud3JpdGUoYnVmZikKKyAgICBkZWYgd3JpdGVCb29sKHNlbGYsIGJvb2wpOgorICAgICAgICBpZiBib29sOgorICAgICAgICAgICAgc2VsZi53cml0ZUJ5dGUoMSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYud3JpdGVCeXRlKDApCiAKLSAgZGVmIHdyaXRlSTMyKHNlbGYsIGkzMik6Ci0gICAgYnVmZiA9IHBhY2soIiFpIiwgaTMyKQotICAgIHNlbGYudHJhbnMud3JpdGUoYnVmZikKKyAgICBkZWYgd3JpdGVCeXRlKHNlbGYsIGJ5dGUpOgorICAgICAgICBidWZmID0gcGFjaygiIWIiLCBieXRlKQorICAgICAgICBzZWxmLnRyYW5zLndyaXRlKGJ1ZmYpCiAKLSAgZGVmIHdyaXRlSTY0KHNlbGYsIGk2NCk6Ci0gICAgYnVmZiA9IHBhY2soIiFxIiwgaTY0KQotICAgIHNlbGYudHJhbnMud3JpdGUoYnVmZikKKyAgICBkZWYgd3JpdGVJMTYoc2VsZiwgaTE2KToKKyAgICAgICAgYnVmZiA9IHBhY2soIiFoIiwgaTE2KQorICAgICAgICBzZWxmLnRyYW5zLndyaXRlKGJ1ZmYpCiAKLSAgZGVmIHdyaXRlRG91YmxlKHNlbGYsIGR1Yik6Ci0gICAgYnVmZiA9IHBhY2soIiFkIiwgZHViKQotICAgIHNlbGYudHJhbnMud3JpdGUoYnVmZikKKyAgICBkZWYgd3JpdGVJMzIoc2VsZiwgaTMyKToKKyAgICAgICAgYnVmZiA9IHBhY2soIiFpIiwgaTMyKQorICAgICAgICBzZWxmLnRyYW5zLndyaXRlKGJ1ZmYpCiAKLSAgZGVmIHdyaXRlU3RyaW5nKHNlbGYsIHN0cik6Ci0gICAgc2VsZi53cml0ZUkzMihsZW4oc3RyKSkKLSAgICBzZWxmLnRyYW5zLndyaXRlKHN0cikKKyAgICBkZWYgd3JpdGVJNjQoc2VsZiwgaTY0KToKKyAgICAgICAgYnVmZiA9IHBhY2soIiFxIiwgaTY0KQorICAgICAgICBzZWxmLnRyYW5zLndyaXRlKGJ1ZmYpCiAKLSAgZGVmIHJlYWRNZXNzYWdlQmVnaW4oc2VsZik6Ci0gICAgc3ogPSBzZWxmLnJlYWRJMzIoKQotICAgIGlmIHN6IDwgMDoKLSAgICAgIHZlcnNpb24gPSBzeiAmIFRCaW5hcnlQcm90b2NvbC5WRVJTSU9OX01BU0sKLSAgICAgIGlmIHZlcnNpb24gIT0gVEJpbmFyeVByb3RvY29sLlZFUlNJT05fMToKLSAgICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uKAotICAgICAgICAgIHR5cGU9VFByb3RvY29sRXhjZXB0aW9uLkJBRF9WRVJTSU9OLAotICAgICAgICAgIG1lc3NhZ2U9J0JhZCB2ZXJzaW9uIGluIHJlYWRNZXNzYWdlQmVnaW46ICVkJyAlIChzeikpCi0gICAgICB0eXBlID0gc3ogJiBUQmluYXJ5UHJvdG9jb2wuVFlQRV9NQVNLCi0gICAgICBuYW1lID0gc2VsZi5yZWFkU3RyaW5nKCkKLSAgICAgIHNlcWlkID0gc2VsZi5yZWFkSTMyKCkKLSAgICBlbHNlOgotICAgICAgaWYgc2VsZi5zdHJpY3RSZWFkOgotICAgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24odHlwZT1UUHJvdG9jb2xFeGNlcHRpb24uQkFEX1ZFUlNJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlPSdObyBwcm90b2NvbCB2ZXJzaW9uIGhlYWRlcicpCi0gICAgICBuYW1lID0gc2VsZi50cmFucy5yZWFkQWxsKHN6KQotICAgICAgdHlwZSA9IHNlbGYucmVhZEJ5dGUoKQotICAgICAgc2VxaWQgPSBzZWxmLnJlYWRJMzIoKQotICAgIHJldHVybiAobmFtZSwgdHlwZSwgc2VxaWQpCisgICAgZGVmIHdyaXRlRG91YmxlKHNlbGYsIGR1Yik6CisgICAgICAgIGJ1ZmYgPSBwYWNrKCIhZCIsIGR1YikKKyAgICAgICAgc2VsZi50cmFucy53cml0ZShidWZmKQogCi0gIGRlZiByZWFkTWVzc2FnZUVuZChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHdyaXRlQmluYXJ5KHNlbGYsIHN0cik6CisgICAgICAgIHNlbGYud3JpdGVJMzIobGVuKHN0cikpCisgICAgICAgIHNlbGYudHJhbnMud3JpdGUoc3RyKQogCi0gIGRlZiByZWFkU3RydWN0QmVnaW4oc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiByZWFkTWVzc2FnZUJlZ2luKHNlbGYpOgorICAgICAgICBzeiA9IHNlbGYucmVhZEkzMigpCisgICAgICAgIGlmIHN6IDwgMDoKKyAgICAgICAgICAgIHZlcnNpb24gPSBzeiAmIFRCaW5hcnlQcm90b2NvbC5WRVJTSU9OX01BU0sKKyAgICAgICAgICAgIGlmIHZlcnNpb24gIT0gVEJpbmFyeVByb3RvY29sLlZFUlNJT05fMToKKyAgICAgICAgICAgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgIHR5cGU9VFByb3RvY29sRXhjZXB0aW9uLkJBRF9WRVJTSU9OLAorICAgICAgICAgICAgICAgICAgICBtZXNzYWdlPSdCYWQgdmVyc2lvbiBpbiByZWFkTWVzc2FnZUJlZ2luOiAlZCcgJSAoc3opKQorICAgICAgICAgICAgdHlwZSA9IHN6ICYgVEJpbmFyeVByb3RvY29sLlRZUEVfTUFTSworICAgICAgICAgICAgbmFtZSA9IHNlbGYucmVhZFN0cmluZygpCisgICAgICAgICAgICBzZXFpZCA9IHNlbGYucmVhZEkzMigpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBzZWxmLnN0cmljdFJlYWQ6CisgICAgICAgICAgICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uKHR5cGU9VFByb3RvY29sRXhjZXB0aW9uLkJBRF9WRVJTSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlPSdObyBwcm90b2NvbCB2ZXJzaW9uIGhlYWRlcicpCisgICAgICAgICAgICBuYW1lID0gc2VsZi50cmFucy5yZWFkQWxsKHN6KQorICAgICAgICAgICAgdHlwZSA9IHNlbGYucmVhZEJ5dGUoKQorICAgICAgICAgICAgc2VxaWQgPSBzZWxmLnJlYWRJMzIoKQorICAgICAgICByZXR1cm4gKG5hbWUsIHR5cGUsIHNlcWlkKQogCi0gIGRlZiByZWFkU3RydWN0RW5kKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgcmVhZE1lc3NhZ2VFbmQoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgcmVhZEZpZWxkQmVnaW4oc2VsZik6Ci0gICAgdHlwZSA9IHNlbGYucmVhZEJ5dGUoKQotICAgIGlmIHR5cGUgPT0gVFR5cGUuU1RPUDoKLSAgICAgIHJldHVybiAoTm9uZSwgdHlwZSwgMCkKLSAgICBpZCA9IHNlbGYucmVhZEkxNigpCi0gICAgcmV0dXJuIChOb25lLCB0eXBlLCBpZCkKKyAgICBkZWYgcmVhZFN0cnVjdEJlZ2luKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHJlYWRGaWVsZEVuZChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHJlYWRTdHJ1Y3RFbmQoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgcmVhZE1hcEJlZ2luKHNlbGYpOgotICAgIGt0eXBlID0gc2VsZi5yZWFkQnl0ZSgpCi0gICAgdnR5cGUgPSBzZWxmLnJlYWRCeXRlKCkKLSAgICBzaXplID0gc2VsZi5yZWFkSTMyKCkKLSAgICByZXR1cm4gKGt0eXBlLCB2dHlwZSwgc2l6ZSkKKyAgICBkZWYgcmVhZEZpZWxkQmVnaW4oc2VsZik6CisgICAgICAgIHR5cGUgPSBzZWxmLnJlYWRCeXRlKCkKKyAgICAgICAgaWYgdHlwZSA9PSBUVHlwZS5TVE9QOgorICAgICAgICAgICAgcmV0dXJuIChOb25lLCB0eXBlLCAwKQorICAgICAgICBpZCA9IHNlbGYucmVhZEkxNigpCisgICAgICAgIHJldHVybiAoTm9uZSwgdHlwZSwgaWQpCiAKLSAgZGVmIHJlYWRNYXBFbmQoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiByZWFkRmllbGRFbmQoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgcmVhZExpc3RCZWdpbihzZWxmKToKLSAgICBldHlwZSA9IHNlbGYucmVhZEJ5dGUoKQotICAgIHNpemUgPSBzZWxmLnJlYWRJMzIoKQotICAgIHJldHVybiAoZXR5cGUsIHNpemUpCisgICAgZGVmIHJlYWRNYXBCZWdpbihzZWxmKToKKyAgICAgICAga3R5cGUgPSBzZWxmLnJlYWRCeXRlKCkKKyAgICAgICAgdnR5cGUgPSBzZWxmLnJlYWRCeXRlKCkKKyAgICAgICAgc2l6ZSA9IHNlbGYucmVhZEkzMigpCisgICAgICAgIHNlbGYuX2NoZWNrX2NvbnRhaW5lcl9sZW5ndGgoc2l6ZSkKKyAgICAgICAgcmV0dXJuIChrdHlwZSwgdnR5cGUsIHNpemUpCiAKLSAgZGVmIHJlYWRMaXN0RW5kKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgcmVhZE1hcEVuZChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiByZWFkU2V0QmVnaW4oc2VsZik6Ci0gICAgZXR5cGUgPSBzZWxmLnJlYWRCeXRlKCkKLSAgICBzaXplID0gc2VsZi5yZWFkSTMyKCkKLSAgICByZXR1cm4gKGV0eXBlLCBzaXplKQorICAgIGRlZiByZWFkTGlzdEJlZ2luKHNlbGYpOgorICAgICAgICBldHlwZSA9IHNlbGYucmVhZEJ5dGUoKQorICAgICAgICBzaXplID0gc2VsZi5yZWFkSTMyKCkKKyAgICAgICAgc2VsZi5fY2hlY2tfY29udGFpbmVyX2xlbmd0aChzaXplKQorICAgICAgICByZXR1cm4gKGV0eXBlLCBzaXplKQogCi0gIGRlZiByZWFkU2V0RW5kKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgcmVhZExpc3RFbmQoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgcmVhZEJvb2woc2VsZik6Ci0gICAgYnl0ZSA9IHNlbGYucmVhZEJ5dGUoKQotICAgIGlmIGJ5dGUgPT0gMDoKLSAgICAgIHJldHVybiBGYWxzZQotICAgIHJldHVybiBUcnVlCisgICAgZGVmIHJlYWRTZXRCZWdpbihzZWxmKToKKyAgICAgICAgZXR5cGUgPSBzZWxmLnJlYWRCeXRlKCkKKyAgICAgICAgc2l6ZSA9IHNlbGYucmVhZEkzMigpCisgICAgICAgIHNlbGYuX2NoZWNrX2NvbnRhaW5lcl9sZW5ndGgoc2l6ZSkKKyAgICAgICAgcmV0dXJuIChldHlwZSwgc2l6ZSkKIAotICBkZWYgcmVhZEJ5dGUoc2VsZik6Ci0gICAgYnVmZiA9IHNlbGYudHJhbnMucmVhZEFsbCgxKQotICAgIHZhbCwgPSB1bnBhY2soJyFiJywgYnVmZikKLSAgICByZXR1cm4gdmFsCisgICAgZGVmIHJlYWRTZXRFbmQoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgcmVhZEkxNihzZWxmKToKLSAgICBidWZmID0gc2VsZi50cmFucy5yZWFkQWxsKDIpCi0gICAgdmFsLCA9IHVucGFjaygnIWgnLCBidWZmKQotICAgIHJldHVybiB2YWwKKyAgICBkZWYgcmVhZEJvb2woc2VsZik6CisgICAgICAgIGJ5dGUgPSBzZWxmLnJlYWRCeXRlKCkKKyAgICAgICAgaWYgYnl0ZSA9PSAwOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIHJldHVybiBUcnVlCiAKLSAgZGVmIHJlYWRJMzIoc2VsZik6Ci0gICAgYnVmZiA9IHNlbGYudHJhbnMucmVhZEFsbCg0KQotICAgIHZhbCwgPSB1bnBhY2soJyFpJywgYnVmZikKLSAgICByZXR1cm4gdmFsCisgICAgZGVmIHJlYWRCeXRlKHNlbGYpOgorICAgICAgICBidWZmID0gc2VsZi50cmFucy5yZWFkQWxsKDEpCisgICAgICAgIHZhbCwgPSB1bnBhY2soJyFiJywgYnVmZikKKyAgICAgICAgcmV0dXJuIHZhbAogCi0gIGRlZiByZWFkSTY0KHNlbGYpOgotICAgIGJ1ZmYgPSBzZWxmLnRyYW5zLnJlYWRBbGwoOCkKLSAgICB2YWwsID0gdW5wYWNrKCchcScsIGJ1ZmYpCi0gICAgcmV0dXJuIHZhbAorICAgIGRlZiByZWFkSTE2KHNlbGYpOgorICAgICAgICBidWZmID0gc2VsZi50cmFucy5yZWFkQWxsKDIpCisgICAgICAgIHZhbCwgPSB1bnBhY2soJyFoJywgYnVmZikKKyAgICAgICAgcmV0dXJuIHZhbAogCi0gIGRlZiByZWFkRG91YmxlKHNlbGYpOgotICAgIGJ1ZmYgPSBzZWxmLnRyYW5zLnJlYWRBbGwoOCkKLSAgICB2YWwsID0gdW5wYWNrKCchZCcsIGJ1ZmYpCi0gICAgcmV0dXJuIHZhbAorICAgIGRlZiByZWFkSTMyKHNlbGYpOgorICAgICAgICBidWZmID0gc2VsZi50cmFucy5yZWFkQWxsKDQpCisgICAgICAgIHZhbCwgPSB1bnBhY2soJyFpJywgYnVmZikKKyAgICAgICAgcmV0dXJuIHZhbAogCi0gIGRlZiByZWFkU3RyaW5nKHNlbGYpOgotICAgIGxlbiA9IHNlbGYucmVhZEkzMigpCi0gICAgc3RyID0gc2VsZi50cmFucy5yZWFkQWxsKGxlbikKLSAgICByZXR1cm4gc3RyCisgICAgZGVmIHJlYWRJNjQoc2VsZik6CisgICAgICAgIGJ1ZmYgPSBzZWxmLnRyYW5zLnJlYWRBbGwoOCkKKyAgICAgICAgdmFsLCA9IHVucGFjaygnIXEnLCBidWZmKQorICAgICAgICByZXR1cm4gdmFsCisKKyAgICBkZWYgcmVhZERvdWJsZShzZWxmKToKKyAgICAgICAgYnVmZiA9IHNlbGYudHJhbnMucmVhZEFsbCg4KQorICAgICAgICB2YWwsID0gdW5wYWNrKCchZCcsIGJ1ZmYpCisgICAgICAgIHJldHVybiB2YWwKKworICAgIGRlZiByZWFkQmluYXJ5KHNlbGYpOgorICAgICAgICBzaXplID0gc2VsZi5yZWFkSTMyKCkKKyAgICAgICAgc2VsZi5fY2hlY2tfc3RyaW5nX2xlbmd0aChzaXplKQorICAgICAgICBzID0gc2VsZi50cmFucy5yZWFkQWxsKHNpemUpCisgICAgICAgIHJldHVybiBzCiAKIAotY2xhc3MgVEJpbmFyeVByb3RvY29sRmFjdG9yeToKLSAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmljdFJlYWQ9RmFsc2UsIHN0cmljdFdyaXRlPVRydWUpOgotICAgIHNlbGYuc3RyaWN0UmVhZCA9IHN0cmljdFJlYWQKLSAgICBzZWxmLnN0cmljdFdyaXRlID0gc3RyaWN0V3JpdGUKK2NsYXNzIFRCaW5hcnlQcm90b2NvbEZhY3Rvcnkob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc3RyaWN0UmVhZD1GYWxzZSwgc3RyaWN0V3JpdGU9VHJ1ZSwgKiprd2FyZ3MpOgorICAgICAgICBzZWxmLnN0cmljdFJlYWQgPSBzdHJpY3RSZWFkCisgICAgICAgIHNlbGYuc3RyaWN0V3JpdGUgPSBzdHJpY3RXcml0ZQorICAgICAgICBzZWxmLnN0cmluZ19sZW5ndGhfbGltaXQgPSBrd2FyZ3MuZ2V0KCdzdHJpbmdfbGVuZ3RoX2xpbWl0JywgTm9uZSkKKyAgICAgICAgc2VsZi5jb250YWluZXJfbGVuZ3RoX2xpbWl0ID0ga3dhcmdzLmdldCgnY29udGFpbmVyX2xlbmd0aF9saW1pdCcsIE5vbmUpCiAKLSAgZGVmIGdldFByb3RvY29sKHNlbGYsIHRyYW5zKToKLSAgICBwcm90ID0gVEJpbmFyeVByb3RvY29sKHRyYW5zLCBzZWxmLnN0cmljdFJlYWQsIHNlbGYuc3RyaWN0V3JpdGUpCi0gICAgcmV0dXJuIHByb3QKKyAgICBkZWYgZ2V0UHJvdG9jb2woc2VsZiwgdHJhbnMpOgorICAgICAgICBwcm90ID0gVEJpbmFyeVByb3RvY29sKHRyYW5zLCBzZWxmLnN0cmljdFJlYWQsIHNlbGYuc3RyaWN0V3JpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX2xlbmd0aF9saW1pdD1zZWxmLnN0cmluZ19sZW5ndGhfbGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyX2xlbmd0aF9saW1pdD1zZWxmLmNvbnRhaW5lcl9sZW5ndGhfbGltaXQpCisgICAgICAgIHJldHVybiBwcm90CiAKIAogY2xhc3MgVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQoVEJpbmFyeVByb3RvY29sKToKLSAgIiIiQy1BY2NlbGVyYXRlZCB2ZXJzaW9uIG9mIFRCaW5hcnlQcm90b2NvbC4KKyAgICAiIiJDLUFjY2VsZXJhdGVkIHZlcnNpb24gb2YgVEJpbmFyeVByb3RvY29sLgogCi0gIFRoaXMgY2xhc3MgZG9lcyBub3Qgb3ZlcnJpZGUgYW55IG9mIFRCaW5hcnlQcm90b2NvbCdzIG1ldGhvZHMsCi0gIGJ1dCB0aGUgZ2VuZXJhdGVkIGNvZGUgcmVjb2duaXplcyBpdCBkaXJlY3RseSBhbmQgd2lsbCBjYWxsIGludG8KLSAgb3VyIEMgbW9kdWxlIHRvIGRvIHRoZSBlbmNvZGluZywgYnlwYXNzaW5nIHRoaXMgb2JqZWN0IGVudGlyZWx5LgotICBXZSBpbmhlcml0IGZyb20gVEJpbmFyeVByb3RvY29sIHNvIHRoYXQgdGhlIG5vcm1hbCBUQmluYXJ5UHJvdG9jb2wKLSAgZW5jb2RpbmcgY2FuIGhhcHBlbiBpZiB0aGUgZmFzdGJpbmFyeSBtb2R1bGUgZG9lc24ndCB3b3JrIGZvciBzb21lCi0gIHJlYXNvbi4gIChUT0RPKGRyZWlzcyk6IE1ha2UgdGhpcyBoYXBwZW4gc2FuZWx5IGluIG1vcmUgY2FzZXMuKQorICAgIFRoaXMgY2xhc3MgZG9lcyBub3Qgb3ZlcnJpZGUgYW55IG9mIFRCaW5hcnlQcm90b2NvbCdzIG1ldGhvZHMsCisgICAgYnV0IHRoZSBnZW5lcmF0ZWQgY29kZSByZWNvZ25pemVzIGl0IGRpcmVjdGx5IGFuZCB3aWxsIGNhbGwgaW50bworICAgIG91ciBDIG1vZHVsZSB0byBkbyB0aGUgZW5jb2RpbmcsIGJ5cGFzc2luZyB0aGlzIG9iamVjdCBlbnRpcmVseS4KKyAgICBXZSBpbmhlcml0IGZyb20gVEJpbmFyeVByb3RvY29sIHNvIHRoYXQgdGhlIG5vcm1hbCBUQmluYXJ5UHJvdG9jb2wKKyAgICBlbmNvZGluZyBjYW4gaGFwcGVuIGlmIHRoZSBmYXN0YmluYXJ5IG1vZHVsZSBkb2Vzbid0IHdvcmsgZm9yIHNvbWUKKyAgICByZWFzb24uICAoVE9ETyhkcmVpc3MpOiBNYWtlIHRoaXMgaGFwcGVuIHNhbmVseSBpbiBtb3JlIGNhc2VzLikKKyAgICBUbyBkaXNhYmxlIHRoaXMgYmVoYXZpb3IsIHBhc3MgZmFsbGJhY2s9RmFsc2UgY29uc3RydWN0b3IgYXJndW1lbnQuCiAKLSAgSW4gb3JkZXIgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIEMgbW9kdWxlLCBqdXN0IHVzZQotICBUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCBpbnN0ZWFkIG9mIFRCaW5hcnlQcm90b2NvbC4KKyAgICBJbiBvcmRlciB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGUgQyBtb2R1bGUsIGp1c3QgdXNlCisgICAgVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQgaW5zdGVhZCBvZiBUQmluYXJ5UHJvdG9jb2wuCiAKLSAgTk9URTogIFRoaXMgY29kZSB3YXMgY29udHJpYnV0ZWQgYnkgYW4gZXh0ZXJuYWwgZGV2ZWxvcGVyLgotICAgICAgICAgVGhlIGludGVybmFsIFRocmlmdCB0ZWFtIGhhcyByZXZpZXdlZCBhbmQgdGVzdGVkIGl0LAotICAgICAgICAgYnV0IHdlIGNhbm5vdCBndWFyYW50ZWUgdGhhdCBpdCBpcyBwcm9kdWN0aW9uLXJlYWR5LgotICAgICAgICAgUGxlYXNlIGZlZWwgZnJlZSB0byByZXBvcnQgYnVncyBhbmQvb3Igc3VjY2VzcyBzdG9yaWVzCi0gICAgICAgICB0byB0aGUgcHVibGljIG1haWxpbmcgbGlzdC4KLSAgIiIiCi0gIHBhc3MKKyAgICBOT1RFOiAgVGhpcyBjb2RlIHdhcyBjb250cmlidXRlZCBieSBhbiBleHRlcm5hbCBkZXZlbG9wZXIuCisgICAgICAgICAgIFRoZSBpbnRlcm5hbCBUaHJpZnQgdGVhbSBoYXMgcmV2aWV3ZWQgYW5kIHRlc3RlZCBpdCwKKyAgICAgICAgICAgYnV0IHdlIGNhbm5vdCBndWFyYW50ZWUgdGhhdCBpdCBpcyBwcm9kdWN0aW9uLXJlYWR5LgorICAgICAgICAgICBQbGVhc2UgZmVlbCBmcmVlIHRvIHJlcG9ydCBidWdzIGFuZC9vciBzdWNjZXNzIHN0b3JpZXMKKyAgICAgICAgICAgdG8gdGhlIHB1YmxpYyBtYWlsaW5nIGxpc3QuCisgICAgIiIiCisgICAgcGFzcworCisgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIGZhbGxiYWNrID0ga3dhcmdzLnBvcCgnZmFsbGJhY2snLCBUcnVlKQorICAgICAgICBzdXBlcihUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCwgc2VsZikuX19pbml0X18oKmFyZ3MsICoqa3dhcmdzKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgZmFzdGJpbmFyeQorICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICBpZiBub3QgZmFsbGJhY2s6CisgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX2Zhc3RfZGVjb2RlID0gZmFzdGJpbmFyeS5kZWNvZGVfYmluYXJ5CisgICAgICAgICAgICBzZWxmLl9mYXN0X2VuY29kZSA9IGZhc3RiaW5hcnkuZW5jb2RlX2JpbmFyeQogCiAKLWNsYXNzIFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeToKLSAgZGVmIGdldFByb3RvY29sKHNlbGYsIHRyYW5zKToKLSAgICByZXR1cm4gVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQodHJhbnMpCitjbGFzcyBUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3Rvcnkob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwKKyAgICAgICAgICAgICAgICAgc3RyaW5nX2xlbmd0aF9saW1pdD1Ob25lLAorICAgICAgICAgICAgICAgICBjb250YWluZXJfbGVuZ3RoX2xpbWl0PU5vbmUsCisgICAgICAgICAgICAgICAgIGZhbGxiYWNrPVRydWUpOgorICAgICAgICBzZWxmLnN0cmluZ19sZW5ndGhfbGltaXQgPSBzdHJpbmdfbGVuZ3RoX2xpbWl0CisgICAgICAgIHNlbGYuY29udGFpbmVyX2xlbmd0aF9saW1pdCA9IGNvbnRhaW5lcl9sZW5ndGhfbGltaXQKKyAgICAgICAgc2VsZi5fZmFsbGJhY2sgPSBmYWxsYmFjaworCisgICAgZGVmIGdldFByb3RvY29sKHNlbGYsIHRyYW5zKToKKyAgICAgICAgcmV0dXJuIFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkKAorICAgICAgICAgICAgdHJhbnMsCisgICAgICAgICAgICBzdHJpbmdfbGVuZ3RoX2xpbWl0PXNlbGYuc3RyaW5nX2xlbmd0aF9saW1pdCwKKyAgICAgICAgICAgIGNvbnRhaW5lcl9sZW5ndGhfbGltaXQ9c2VsZi5jb250YWluZXJfbGVuZ3RoX2xpbWl0LAorICAgICAgICAgICAgZmFsbGJhY2s9c2VsZi5fZmFsbGJhY2spCmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wucHkgYi9saWIvcHkvc3JjL3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wucHkKaW5kZXggNzA1NGFiMC4uZTQ4NWNmZiAxMDA2NDQKLS0tIGEvbGliL3B5L3NyYy9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLnB5CisrKyBiL2xpYi9weS9zcmMvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5weQpAQCAtMTcsOSArMTcsMTEgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLWZyb20gVFByb3RvY29sIGltcG9ydCAqCitmcm9tIC5UUHJvdG9jb2wgaW1wb3J0IFRUeXBlLCBUUHJvdG9jb2xCYXNlLCBUUHJvdG9jb2xFeGNlcHRpb24sIGNoZWNrSW50ZWdlckxpbWl0cwogZnJvbSBzdHJ1Y3QgaW1wb3J0IHBhY2ssIHVucGFjawogCitmcm9tIC4uY29tcGF0IGltcG9ydCBiaW5hcnlfdG9fc3RyLCBzdHJfdG9fYmluYXJ5CisKIF9fYWxsX18gPSBbJ1RDb21wYWN0UHJvdG9jb2wnLCAnVENvbXBhY3RQcm90b2NvbEZhY3RvcnknXQogCiBDTEVBUiA9IDAKQEAgLTM0LDM3MiArMzYsNDQwIEBACiAKIAogZGVmIG1ha2VfaGVscGVyKHZfZnJvbSwgY29udGFpbmVyKToKLSAgZGVmIGhlbHBlcihmdW5jKToKLSAgICBkZWYgbmVzdGVkKHNlbGYsICphcmdzLCAqKmt3YXJncyk6Ci0gICAgICBhc3NlcnQgc2VsZi5zdGF0ZSBpbiAodl9mcm9tLCBjb250YWluZXIpLCAoc2VsZi5zdGF0ZSwgdl9mcm9tLCBjb250YWluZXIpCi0gICAgICByZXR1cm4gZnVuYyhzZWxmLCAqYXJncywgKiprd2FyZ3MpCi0gICAgcmV0dXJuIG5lc3RlZAotICByZXR1cm4gaGVscGVyCisgICAgZGVmIGhlbHBlcihmdW5jKToKKyAgICAgICAgZGVmIG5lc3RlZChzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICAgICAgYXNzZXJ0IHNlbGYuc3RhdGUgaW4gKHZfZnJvbSwgY29udGFpbmVyKSwgKHNlbGYuc3RhdGUsIHZfZnJvbSwgY29udGFpbmVyKQorICAgICAgICAgICAgcmV0dXJuIGZ1bmMoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKQorICAgICAgICByZXR1cm4gbmVzdGVkCisgICAgcmV0dXJuIGhlbHBlcgorCisKIHdyaXRlciA9IG1ha2VfaGVscGVyKFZBTFVFX1dSSVRFLCBDT05UQUlORVJfV1JJVEUpCiByZWFkZXIgPSBtYWtlX2hlbHBlcihWQUxVRV9SRUFELCBDT05UQUlORVJfUkVBRCkKIAogCiBkZWYgbWFrZVppZ1phZyhuLCBiaXRzKToKLSAgY2hlY2tJbnRlZ2VyTGltaXRzKG4sIGJpdHMpCi0gIHJldHVybiAobiA8PCAxKSBeIChuID4+IChiaXRzIC0gMSkpCisgICAgY2hlY2tJbnRlZ2VyTGltaXRzKG4sIGJpdHMpCisgICAgcmV0dXJuIChuIDw8IDEpIF4gKG4gPj4gKGJpdHMgLSAxKSkKIAogCiBkZWYgZnJvbVppZ1phZyhuKToKLSAgcmV0dXJuIChuID4+IDEpIF4gLShuICYgMSkKKyAgICByZXR1cm4gKG4gPj4gMSkgXiAtKG4gJiAxKQogCiAKIGRlZiB3cml0ZVZhcmludCh0cmFucywgbik6Ci0gIG91dCA9IFtdCi0gIHdoaWxlIFRydWU6Ci0gICAgaWYgbiAmIH4weDdmID09IDA6Ci0gICAgICBvdXQuYXBwZW5kKG4pCi0gICAgICBicmVhawotICAgIGVsc2U6Ci0gICAgICBvdXQuYXBwZW5kKChuICYgMHhmZikgfCAweDgwKQotICAgICAgbiA9IG4gPj4gNwotICB0cmFucy53cml0ZSgnJy5qb2luKG1hcChjaHIsIG91dCkpKQorICAgIG91dCA9IGJ5dGVhcnJheSgpCisgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgaWYgbiAmIH4weDdmID09IDA6CisgICAgICAgICAgICBvdXQuYXBwZW5kKG4pCisgICAgICAgICAgICBicmVhaworICAgICAgICBlbHNlOgorICAgICAgICAgICAgb3V0LmFwcGVuZCgobiAmIDB4ZmYpIHwgMHg4MCkKKyAgICAgICAgICAgIG4gPSBuID4+IDcKKyAgICB0cmFucy53cml0ZShieXRlcyhvdXQpKQogCiAKIGRlZiByZWFkVmFyaW50KHRyYW5zKToKLSAgcmVzdWx0ID0gMAotICBzaGlmdCA9IDAKLSAgd2hpbGUgVHJ1ZToKLSAgICB4ID0gdHJhbnMucmVhZEFsbCgxKQotICAgIGJ5dGUgPSBvcmQoeCkKLSAgICByZXN1bHQgfD0gKGJ5dGUgJiAweDdmKSA8PCBzaGlmdAotICAgIGlmIGJ5dGUgPj4gNyA9PSAwOgotICAgICAgcmV0dXJuIHJlc3VsdAotICAgIHNoaWZ0ICs9IDcKKyAgICByZXN1bHQgPSAwCisgICAgc2hpZnQgPSAwCisgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgeCA9IHRyYW5zLnJlYWRBbGwoMSkKKyAgICAgICAgYnl0ZSA9IG9yZCh4KQorICAgICAgICByZXN1bHQgfD0gKGJ5dGUgJiAweDdmKSA8PCBzaGlmdAorICAgICAgICBpZiBieXRlID4+IDcgPT0gMDoKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQKKyAgICAgICAgc2hpZnQgKz0gNwogCiAKLWNsYXNzIENvbXBhY3RUeXBlOgotICBTVE9QID0gMHgwMAotICBUUlVFID0gMHgwMQotICBGQUxTRSA9IDB4MDIKLSAgQllURSA9IDB4MDMKLSAgSTE2ID0gMHgwNAotICBJMzIgPSAweDA1Ci0gIEk2NCA9IDB4MDYKLSAgRE9VQkxFID0gMHgwNwotICBCSU5BUlkgPSAweDA4Ci0gIExJU1QgPSAweDA5Ci0gIFNFVCA9IDB4MEEKLSAgTUFQID0gMHgwQgotICBTVFJVQ1QgPSAweDBDCitjbGFzcyBDb21wYWN0VHlwZShvYmplY3QpOgorICAgIFNUT1AgPSAweDAwCisgICAgVFJVRSA9IDB4MDEKKyAgICBGQUxTRSA9IDB4MDIKKyAgICBCWVRFID0gMHgwMworICAgIEkxNiA9IDB4MDQKKyAgICBJMzIgPSAweDA1CisgICAgSTY0ID0gMHgwNgorICAgIERPVUJMRSA9IDB4MDcKKyAgICBCSU5BUlkgPSAweDA4CisgICAgTElTVCA9IDB4MDkKKyAgICBTRVQgPSAweDBBCisgICAgTUFQID0gMHgwQgorICAgIFNUUlVDVCA9IDB4MEMKIAotQ1RZUEVTID0ge1RUeXBlLlNUT1A6IENvbXBhY3RUeXBlLlNUT1AsCi0gICAgICAgICAgVFR5cGUuQk9PTDogQ29tcGFjdFR5cGUuVFJVRSwgICMgdXNlZCBmb3IgY29sbGVjdGlvbgotICAgICAgICAgIFRUeXBlLkJZVEU6IENvbXBhY3RUeXBlLkJZVEUsCi0gICAgICAgICAgVFR5cGUuSTE2OiBDb21wYWN0VHlwZS5JMTYsCi0gICAgICAgICAgVFR5cGUuSTMyOiBDb21wYWN0VHlwZS5JMzIsCi0gICAgICAgICAgVFR5cGUuSTY0OiBDb21wYWN0VHlwZS5JNjQsCi0gICAgICAgICAgVFR5cGUuRE9VQkxFOiBDb21wYWN0VHlwZS5ET1VCTEUsCi0gICAgICAgICAgVFR5cGUuU1RSSU5HOiBDb21wYWN0VHlwZS5CSU5BUlksCi0gICAgICAgICAgVFR5cGUuU1RSVUNUOiBDb21wYWN0VHlwZS5TVFJVQ1QsCi0gICAgICAgICAgVFR5cGUuTElTVDogQ29tcGFjdFR5cGUuTElTVCwKLSAgICAgICAgICBUVHlwZS5TRVQ6IENvbXBhY3RUeXBlLlNFVCwKLSAgICAgICAgICBUVHlwZS5NQVA6IENvbXBhY3RUeXBlLk1BUAotICAgICAgICAgIH0KKworQ1RZUEVTID0geworICAgIFRUeXBlLlNUT1A6IENvbXBhY3RUeXBlLlNUT1AsCisgICAgVFR5cGUuQk9PTDogQ29tcGFjdFR5cGUuVFJVRSwgICMgdXNlZCBmb3IgY29sbGVjdGlvbgorICAgIFRUeXBlLkJZVEU6IENvbXBhY3RUeXBlLkJZVEUsCisgICAgVFR5cGUuSTE2OiBDb21wYWN0VHlwZS5JMTYsCisgICAgVFR5cGUuSTMyOiBDb21wYWN0VHlwZS5JMzIsCisgICAgVFR5cGUuSTY0OiBDb21wYWN0VHlwZS5JNjQsCisgICAgVFR5cGUuRE9VQkxFOiBDb21wYWN0VHlwZS5ET1VCTEUsCisgICAgVFR5cGUuU1RSSU5HOiBDb21wYWN0VHlwZS5CSU5BUlksCisgICAgVFR5cGUuU1RSVUNUOiBDb21wYWN0VHlwZS5TVFJVQ1QsCisgICAgVFR5cGUuTElTVDogQ29tcGFjdFR5cGUuTElTVCwKKyAgICBUVHlwZS5TRVQ6IENvbXBhY3RUeXBlLlNFVCwKKyAgICBUVHlwZS5NQVA6IENvbXBhY3RUeXBlLk1BUCwKK30KIAogVFRZUEVTID0ge30KIGZvciBrLCB2IGluIENUWVBFUy5pdGVtcygpOgotICBUVFlQRVNbdl0gPSBrCisgICAgVFRZUEVTW3ZdID0gawogVFRZUEVTW0NvbXBhY3RUeXBlLkZBTFNFXSA9IFRUeXBlLkJPT0wKIGRlbCBrCiBkZWwgdgogCiAKIGNsYXNzIFRDb21wYWN0UHJvdG9jb2woVFByb3RvY29sQmFzZSk6Ci0gICIiIkNvbXBhY3QgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRocmlmdCBwcm90b2NvbCBkcml2ZXIuIiIiCisgICAgIiIiQ29tcGFjdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVGhyaWZ0IHByb3RvY29sIGRyaXZlci4iIiIKIAotICBQUk9UT0NPTF9JRCA9IDB4ODIKLSAgVkVSU0lPTiA9IDEKLSAgVkVSU0lPTl9NQVNLID0gMHgxZgotICBUWVBFX01BU0sgPSAweGUwCi0gIFRZUEVfQklUUyA9IDB4MDcKLSAgVFlQRV9TSElGVF9BTU9VTlQgPSA1CisgICAgUFJPVE9DT0xfSUQgPSAweDgyCisgICAgVkVSU0lPTiA9IDEKKyAgICBWRVJTSU9OX01BU0sgPSAweDFmCisgICAgVFlQRV9NQVNLID0gMHhlMAorICAgIFRZUEVfQklUUyA9IDB4MDcKKyAgICBUWVBFX1NISUZUX0FNT1VOVCA9IDUKIAotICBkZWYgX19pbml0X18oc2VsZiwgdHJhbnMpOgotICAgIFRQcm90b2NvbEJhc2UuX19pbml0X18oc2VsZiwgdHJhbnMpCi0gICAgc2VsZi5zdGF0ZSA9IENMRUFSCi0gICAgc2VsZi5fX2xhc3RfZmlkID0gMAotICAgIHNlbGYuX19ib29sX2ZpZCA9IE5vbmUKLSAgICBzZWxmLl9fYm9vbF92YWx1ZSA9IE5vbmUKLSAgICBzZWxmLl9fc3RydWN0cyA9IFtdCi0gICAgc2VsZi5fX2NvbnRhaW5lcnMgPSBbXQorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0cmFucywKKyAgICAgICAgICAgICAgICAgc3RyaW5nX2xlbmd0aF9saW1pdD1Ob25lLAorICAgICAgICAgICAgICAgICBjb250YWluZXJfbGVuZ3RoX2xpbWl0PU5vbmUpOgorICAgICAgICBUUHJvdG9jb2xCYXNlLl9faW5pdF9fKHNlbGYsIHRyYW5zKQorICAgICAgICBzZWxmLnN0YXRlID0gQ0xFQVIKKyAgICAgICAgc2VsZi5fX2xhc3RfZmlkID0gMAorICAgICAgICBzZWxmLl9fYm9vbF9maWQgPSBOb25lCisgICAgICAgIHNlbGYuX19ib29sX3ZhbHVlID0gTm9uZQorICAgICAgICBzZWxmLl9fc3RydWN0cyA9IFtdCisgICAgICAgIHNlbGYuX19jb250YWluZXJzID0gW10KKyAgICAgICAgc2VsZi5zdHJpbmdfbGVuZ3RoX2xpbWl0ID0gc3RyaW5nX2xlbmd0aF9saW1pdAorICAgICAgICBzZWxmLmNvbnRhaW5lcl9sZW5ndGhfbGltaXQgPSBjb250YWluZXJfbGVuZ3RoX2xpbWl0CiAKLSAgZGVmIF9fd3JpdGVWYXJpbnQoc2VsZiwgbik6Ci0gICAgd3JpdGVWYXJpbnQoc2VsZi50cmFucywgbikKKyAgICBkZWYgX2NoZWNrX3N0cmluZ19sZW5ndGgoc2VsZiwgbGVuZ3RoKToKKyAgICAgICAgc2VsZi5fY2hlY2tfbGVuZ3RoKHNlbGYuc3RyaW5nX2xlbmd0aF9saW1pdCwgbGVuZ3RoKQogCi0gIGRlZiB3cml0ZU1lc3NhZ2VCZWdpbihzZWxmLCBuYW1lLCB0eXBlLCBzZXFpZCk6Ci0gICAgYXNzZXJ0IHNlbGYuc3RhdGUgPT0gQ0xFQVIKLSAgICBzZWxmLl9fd3JpdGVVQnl0ZShzZWxmLlBST1RPQ09MX0lEKQotICAgIHNlbGYuX193cml0ZVVCeXRlKHNlbGYuVkVSU0lPTiB8ICh0eXBlIDw8IHNlbGYuVFlQRV9TSElGVF9BTU9VTlQpKQotICAgIHNlbGYuX193cml0ZVZhcmludChzZXFpZCkKLSAgICBzZWxmLl9fd3JpdGVTdHJpbmcobmFtZSkKLSAgICBzZWxmLnN0YXRlID0gVkFMVUVfV1JJVEUKKyAgICBkZWYgX2NoZWNrX2NvbnRhaW5lcl9sZW5ndGgoc2VsZiwgbGVuZ3RoKToKKyAgICAgICAgc2VsZi5fY2hlY2tfbGVuZ3RoKHNlbGYuY29udGFpbmVyX2xlbmd0aF9saW1pdCwgbGVuZ3RoKQogCi0gIGRlZiB3cml0ZU1lc3NhZ2VFbmQoc2VsZik6Ci0gICAgYXNzZXJ0IHNlbGYuc3RhdGUgPT0gVkFMVUVfV1JJVEUKLSAgICBzZWxmLnN0YXRlID0gQ0xFQVIKKyAgICBkZWYgX193cml0ZVZhcmludChzZWxmLCBuKToKKyAgICAgICAgd3JpdGVWYXJpbnQoc2VsZi50cmFucywgbikKIAotICBkZWYgd3JpdGVTdHJ1Y3RCZWdpbihzZWxmLCBuYW1lKToKLSAgICBhc3NlcnQgc2VsZi5zdGF0ZSBpbiAoQ0xFQVIsIENPTlRBSU5FUl9XUklURSwgVkFMVUVfV1JJVEUpLCBzZWxmLnN0YXRlCi0gICAgc2VsZi5fX3N0cnVjdHMuYXBwZW5kKChzZWxmLnN0YXRlLCBzZWxmLl9fbGFzdF9maWQpKQotICAgIHNlbGYuc3RhdGUgPSBGSUVMRF9XUklURQotICAgIHNlbGYuX19sYXN0X2ZpZCA9IDAKKyAgICBkZWYgd3JpdGVNZXNzYWdlQmVnaW4oc2VsZiwgbmFtZSwgdHlwZSwgc2VxaWQpOgorICAgICAgICBhc3NlcnQgc2VsZi5zdGF0ZSA9PSBDTEVBUgorICAgICAgICBzZWxmLl9fd3JpdGVVQnl0ZShzZWxmLlBST1RPQ09MX0lEKQorICAgICAgICBzZWxmLl9fd3JpdGVVQnl0ZShzZWxmLlZFUlNJT04gfCAodHlwZSA8PCBzZWxmLlRZUEVfU0hJRlRfQU1PVU5UKSkKKyAgICAgICAgc2VsZi5fX3dyaXRlVmFyaW50KHNlcWlkKQorICAgICAgICBzZWxmLl9fd3JpdGVCaW5hcnkoc3RyX3RvX2JpbmFyeShuYW1lKSkKKyAgICAgICAgc2VsZi5zdGF0ZSA9IFZBTFVFX1dSSVRFCiAKLSAgZGVmIHdyaXRlU3RydWN0RW5kKHNlbGYpOgotICAgIGFzc2VydCBzZWxmLnN0YXRlID09IEZJRUxEX1dSSVRFCi0gICAgc2VsZi5zdGF0ZSwgc2VsZi5fX2xhc3RfZmlkID0gc2VsZi5fX3N0cnVjdHMucG9wKCkKKyAgICBkZWYgd3JpdGVNZXNzYWdlRW5kKHNlbGYpOgorICAgICAgICBhc3NlcnQgc2VsZi5zdGF0ZSA9PSBWQUxVRV9XUklURQorICAgICAgICBzZWxmLnN0YXRlID0gQ0xFQVIKIAotICBkZWYgd3JpdGVGaWVsZFN0b3Aoc2VsZik6Ci0gICAgc2VsZi5fX3dyaXRlQnl0ZSgwKQorICAgIGRlZiB3cml0ZVN0cnVjdEJlZ2luKHNlbGYsIG5hbWUpOgorICAgICAgICBhc3NlcnQgc2VsZi5zdGF0ZSBpbiAoQ0xFQVIsIENPTlRBSU5FUl9XUklURSwgVkFMVUVfV1JJVEUpLCBzZWxmLnN0YXRlCisgICAgICAgIHNlbGYuX19zdHJ1Y3RzLmFwcGVuZCgoc2VsZi5zdGF0ZSwgc2VsZi5fX2xhc3RfZmlkKSkKKyAgICAgICAgc2VsZi5zdGF0ZSA9IEZJRUxEX1dSSVRFCisgICAgICAgIHNlbGYuX19sYXN0X2ZpZCA9IDAKIAotICBkZWYgX193cml0ZUZpZWxkSGVhZGVyKHNlbGYsIHR5cGUsIGZpZCk6Ci0gICAgZGVsdGEgPSBmaWQgLSBzZWxmLl9fbGFzdF9maWQKLSAgICBpZiAwIDwgZGVsdGEgPD0gMTU6Ci0gICAgICBzZWxmLl9fd3JpdGVVQnl0ZShkZWx0YSA8PCA0IHwgdHlwZSkKLSAgICBlbHNlOgotICAgICAgc2VsZi5fX3dyaXRlQnl0ZSh0eXBlKQotICAgICAgc2VsZi5fX3dyaXRlSTE2KGZpZCkKLSAgICBzZWxmLl9fbGFzdF9maWQgPSBmaWQKKyAgICBkZWYgd3JpdGVTdHJ1Y3RFbmQoc2VsZik6CisgICAgICAgIGFzc2VydCBzZWxmLnN0YXRlID09IEZJRUxEX1dSSVRFCisgICAgICAgIHNlbGYuc3RhdGUsIHNlbGYuX19sYXN0X2ZpZCA9IHNlbGYuX19zdHJ1Y3RzLnBvcCgpCiAKLSAgZGVmIHdyaXRlRmllbGRCZWdpbihzZWxmLCBuYW1lLCB0eXBlLCBmaWQpOgotICAgIGFzc2VydCBzZWxmLnN0YXRlID09IEZJRUxEX1dSSVRFLCBzZWxmLnN0YXRlCi0gICAgaWYgdHlwZSA9PSBUVHlwZS5CT09MOgotICAgICAgc2VsZi5zdGF0ZSA9IEJPT0xfV1JJVEUKLSAgICAgIHNlbGYuX19ib29sX2ZpZCA9IGZpZAotICAgIGVsc2U6Ci0gICAgICBzZWxmLnN0YXRlID0gVkFMVUVfV1JJVEUKLSAgICAgIHNlbGYuX193cml0ZUZpZWxkSGVhZGVyKENUWVBFU1t0eXBlXSwgZmlkKQorICAgIGRlZiB3cml0ZUZpZWxkU3RvcChzZWxmKToKKyAgICAgICAgc2VsZi5fX3dyaXRlQnl0ZSgwKQogCi0gIGRlZiB3cml0ZUZpZWxkRW5kKHNlbGYpOgotICAgIGFzc2VydCBzZWxmLnN0YXRlIGluIChWQUxVRV9XUklURSwgQk9PTF9XUklURSksIHNlbGYuc3RhdGUKLSAgICBzZWxmLnN0YXRlID0gRklFTERfV1JJVEUKKyAgICBkZWYgX193cml0ZUZpZWxkSGVhZGVyKHNlbGYsIHR5cGUsIGZpZCk6CisgICAgICAgIGRlbHRhID0gZmlkIC0gc2VsZi5fX2xhc3RfZmlkCisgICAgICAgIGlmIDAgPCBkZWx0YSA8PSAxNToKKyAgICAgICAgICAgIHNlbGYuX193cml0ZVVCeXRlKGRlbHRhIDw8IDQgfCB0eXBlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fX3dyaXRlQnl0ZSh0eXBlKQorICAgICAgICAgICAgc2VsZi5fX3dyaXRlSTE2KGZpZCkKKyAgICAgICAgc2VsZi5fX2xhc3RfZmlkID0gZmlkCiAKLSAgZGVmIF9fd3JpdGVVQnl0ZShzZWxmLCBieXRlKToKLSAgICBzZWxmLnRyYW5zLndyaXRlKHBhY2soJyFCJywgYnl0ZSkpCisgICAgZGVmIHdyaXRlRmllbGRCZWdpbihzZWxmLCBuYW1lLCB0eXBlLCBmaWQpOgorICAgICAgICBhc3NlcnQgc2VsZi5zdGF0ZSA9PSBGSUVMRF9XUklURSwgc2VsZi5zdGF0ZQorICAgICAgICBpZiB0eXBlID09IFRUeXBlLkJPT0w6CisgICAgICAgICAgICBzZWxmLnN0YXRlID0gQk9PTF9XUklURQorICAgICAgICAgICAgc2VsZi5fX2Jvb2xfZmlkID0gZmlkCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnN0YXRlID0gVkFMVUVfV1JJVEUKKyAgICAgICAgICAgIHNlbGYuX193cml0ZUZpZWxkSGVhZGVyKENUWVBFU1t0eXBlXSwgZmlkKQogCi0gIGRlZiBfX3dyaXRlQnl0ZShzZWxmLCBieXRlKToKLSAgICBzZWxmLnRyYW5zLndyaXRlKHBhY2soJyFiJywgYnl0ZSkpCisgICAgZGVmIHdyaXRlRmllbGRFbmQoc2VsZik6CisgICAgICAgIGFzc2VydCBzZWxmLnN0YXRlIGluIChWQUxVRV9XUklURSwgQk9PTF9XUklURSksIHNlbGYuc3RhdGUKKyAgICAgICAgc2VsZi5zdGF0ZSA9IEZJRUxEX1dSSVRFCiAKLSAgZGVmIF9fd3JpdGVJMTYoc2VsZiwgaTE2KToKLSAgICBzZWxmLl9fd3JpdGVWYXJpbnQobWFrZVppZ1phZyhpMTYsIDE2KSkKKyAgICBkZWYgX193cml0ZVVCeXRlKHNlbGYsIGJ5dGUpOgorICAgICAgICBzZWxmLnRyYW5zLndyaXRlKHBhY2soJyFCJywgYnl0ZSkpCiAKLSAgZGVmIF9fd3JpdGVTaXplKHNlbGYsIGkzMik6Ci0gICAgc2VsZi5fX3dyaXRlVmFyaW50KGkzMikKKyAgICBkZWYgX193cml0ZUJ5dGUoc2VsZiwgYnl0ZSk6CisgICAgICAgIHNlbGYudHJhbnMud3JpdGUocGFjaygnIWInLCBieXRlKSkKIAotICBkZWYgd3JpdGVDb2xsZWN0aW9uQmVnaW4oc2VsZiwgZXR5cGUsIHNpemUpOgotICAgIGFzc2VydCBzZWxmLnN0YXRlIGluIChWQUxVRV9XUklURSwgQ09OVEFJTkVSX1dSSVRFKSwgc2VsZi5zdGF0ZQotICAgIGlmIHNpemUgPD0gMTQ6Ci0gICAgICBzZWxmLl9fd3JpdGVVQnl0ZShzaXplIDw8IDQgfCBDVFlQRVNbZXR5cGVdKQotICAgIGVsc2U6Ci0gICAgICBzZWxmLl9fd3JpdGVVQnl0ZSgweGYwIHwgQ1RZUEVTW2V0eXBlXSkKLSAgICAgIHNlbGYuX193cml0ZVNpemUoc2l6ZSkKLSAgICBzZWxmLl9fY29udGFpbmVycy5hcHBlbmQoc2VsZi5zdGF0ZSkKLSAgICBzZWxmLnN0YXRlID0gQ09OVEFJTkVSX1dSSVRFCi0gIHdyaXRlU2V0QmVnaW4gPSB3cml0ZUNvbGxlY3Rpb25CZWdpbgotICB3cml0ZUxpc3RCZWdpbiA9IHdyaXRlQ29sbGVjdGlvbkJlZ2luCisgICAgZGVmIF9fd3JpdGVJMTYoc2VsZiwgaTE2KToKKyAgICAgICAgc2VsZi5fX3dyaXRlVmFyaW50KG1ha2VaaWdaYWcoaTE2LCAxNikpCiAKLSAgZGVmIHdyaXRlTWFwQmVnaW4oc2VsZiwga3R5cGUsIHZ0eXBlLCBzaXplKToKLSAgICBhc3NlcnQgc2VsZi5zdGF0ZSBpbiAoVkFMVUVfV1JJVEUsIENPTlRBSU5FUl9XUklURSksIHNlbGYuc3RhdGUKLSAgICBpZiBzaXplID09IDA6Ci0gICAgICBzZWxmLl9fd3JpdGVCeXRlKDApCi0gICAgZWxzZToKLSAgICAgIHNlbGYuX193cml0ZVNpemUoc2l6ZSkKLSAgICAgIHNlbGYuX193cml0ZVVCeXRlKENUWVBFU1trdHlwZV0gPDwgNCB8IENUWVBFU1t2dHlwZV0pCi0gICAgc2VsZi5fX2NvbnRhaW5lcnMuYXBwZW5kKHNlbGYuc3RhdGUpCi0gICAgc2VsZi5zdGF0ZSA9IENPTlRBSU5FUl9XUklURQorICAgIGRlZiBfX3dyaXRlU2l6ZShzZWxmLCBpMzIpOgorICAgICAgICBzZWxmLl9fd3JpdGVWYXJpbnQoaTMyKQogCi0gIGRlZiB3cml0ZUNvbGxlY3Rpb25FbmQoc2VsZik6Ci0gICAgYXNzZXJ0IHNlbGYuc3RhdGUgPT0gQ09OVEFJTkVSX1dSSVRFLCBzZWxmLnN0YXRlCi0gICAgc2VsZi5zdGF0ZSA9IHNlbGYuX19jb250YWluZXJzLnBvcCgpCi0gIHdyaXRlTWFwRW5kID0gd3JpdGVDb2xsZWN0aW9uRW5kCi0gIHdyaXRlU2V0RW5kID0gd3JpdGVDb2xsZWN0aW9uRW5kCi0gIHdyaXRlTGlzdEVuZCA9IHdyaXRlQ29sbGVjdGlvbkVuZAorICAgIGRlZiB3cml0ZUNvbGxlY3Rpb25CZWdpbihzZWxmLCBldHlwZSwgc2l6ZSk6CisgICAgICAgIGFzc2VydCBzZWxmLnN0YXRlIGluIChWQUxVRV9XUklURSwgQ09OVEFJTkVSX1dSSVRFKSwgc2VsZi5zdGF0ZQorICAgICAgICBpZiBzaXplIDw9IDE0OgorICAgICAgICAgICAgc2VsZi5fX3dyaXRlVUJ5dGUoc2l6ZSA8PCA0IHwgQ1RZUEVTW2V0eXBlXSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX193cml0ZVVCeXRlKDB4ZjAgfCBDVFlQRVNbZXR5cGVdKQorICAgICAgICAgICAgc2VsZi5fX3dyaXRlU2l6ZShzaXplKQorICAgICAgICBzZWxmLl9fY29udGFpbmVycy5hcHBlbmQoc2VsZi5zdGF0ZSkKKyAgICAgICAgc2VsZi5zdGF0ZSA9IENPTlRBSU5FUl9XUklURQorICAgIHdyaXRlU2V0QmVnaW4gPSB3cml0ZUNvbGxlY3Rpb25CZWdpbgorICAgIHdyaXRlTGlzdEJlZ2luID0gd3JpdGVDb2xsZWN0aW9uQmVnaW4KIAotICBkZWYgd3JpdGVCb29sKHNlbGYsIGJvb2wpOgotICAgIGlmIHNlbGYuc3RhdGUgPT0gQk9PTF9XUklURToKLSAgICAgIGlmIGJvb2w6Ci0gICAgICAgIGN0eXBlID0gQ29tcGFjdFR5cGUuVFJVRQotICAgICAgZWxzZToKLSAgICAgICAgY3R5cGUgPSBDb21wYWN0VHlwZS5GQUxTRQotICAgICAgc2VsZi5fX3dyaXRlRmllbGRIZWFkZXIoY3R5cGUsIHNlbGYuX19ib29sX2ZpZCkKLSAgICBlbGlmIHNlbGYuc3RhdGUgPT0gQ09OVEFJTkVSX1dSSVRFOgotICAgICAgaWYgYm9vbDoKLSAgICAgICAgc2VsZi5fX3dyaXRlQnl0ZShDb21wYWN0VHlwZS5UUlVFKQotICAgICAgZWxzZToKLSAgICAgICAgc2VsZi5fX3dyaXRlQnl0ZShDb21wYWN0VHlwZS5GQUxTRSkKLSAgICBlbHNlOgotICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoIkludmFsaWQgc3RhdGUgaW4gY29tcGFjdCBwcm90b2NvbCIpCisgICAgZGVmIHdyaXRlTWFwQmVnaW4oc2VsZiwga3R5cGUsIHZ0eXBlLCBzaXplKToKKyAgICAgICAgYXNzZXJ0IHNlbGYuc3RhdGUgaW4gKFZBTFVFX1dSSVRFLCBDT05UQUlORVJfV1JJVEUpLCBzZWxmLnN0YXRlCisgICAgICAgIGlmIHNpemUgPT0gMDoKKyAgICAgICAgICAgIHNlbGYuX193cml0ZUJ5dGUoMCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX193cml0ZVNpemUoc2l6ZSkKKyAgICAgICAgICAgIHNlbGYuX193cml0ZVVCeXRlKENUWVBFU1trdHlwZV0gPDwgNCB8IENUWVBFU1t2dHlwZV0pCisgICAgICAgIHNlbGYuX19jb250YWluZXJzLmFwcGVuZChzZWxmLnN0YXRlKQorICAgICAgICBzZWxmLnN0YXRlID0gQ09OVEFJTkVSX1dSSVRFCiAKLSAgd3JpdGVCeXRlID0gd3JpdGVyKF9fd3JpdGVCeXRlKQotICB3cml0ZUkxNiA9IHdyaXRlcihfX3dyaXRlSTE2KQorICAgIGRlZiB3cml0ZUNvbGxlY3Rpb25FbmQoc2VsZik6CisgICAgICAgIGFzc2VydCBzZWxmLnN0YXRlID09IENPTlRBSU5FUl9XUklURSwgc2VsZi5zdGF0ZQorICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5fX2NvbnRhaW5lcnMucG9wKCkKKyAgICB3cml0ZU1hcEVuZCA9IHdyaXRlQ29sbGVjdGlvbkVuZAorICAgIHdyaXRlU2V0RW5kID0gd3JpdGVDb2xsZWN0aW9uRW5kCisgICAgd3JpdGVMaXN0RW5kID0gd3JpdGVDb2xsZWN0aW9uRW5kCiAKLSAgQHdyaXRlcgotICBkZWYgd3JpdGVJMzIoc2VsZiwgaTMyKToKLSAgICBzZWxmLl9fd3JpdGVWYXJpbnQobWFrZVppZ1phZyhpMzIsIDMyKSkKKyAgICBkZWYgd3JpdGVCb29sKHNlbGYsIGJvb2wpOgorICAgICAgICBpZiBzZWxmLnN0YXRlID09IEJPT0xfV1JJVEU6CisgICAgICAgICAgICBpZiBib29sOgorICAgICAgICAgICAgICAgIGN0eXBlID0gQ29tcGFjdFR5cGUuVFJVRQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBjdHlwZSA9IENvbXBhY3RUeXBlLkZBTFNFCisgICAgICAgICAgICBzZWxmLl9fd3JpdGVGaWVsZEhlYWRlcihjdHlwZSwgc2VsZi5fX2Jvb2xfZmlkKQorICAgICAgICBlbGlmIHNlbGYuc3RhdGUgPT0gQ09OVEFJTkVSX1dSSVRFOgorICAgICAgICAgICAgaWYgYm9vbDoKKyAgICAgICAgICAgICAgICBzZWxmLl9fd3JpdGVCeXRlKENvbXBhY3RUeXBlLlRSVUUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuX193cml0ZUJ5dGUoQ29tcGFjdFR5cGUuRkFMU0UpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigiSW52YWxpZCBzdGF0ZSBpbiBjb21wYWN0IHByb3RvY29sIikKIAotICBAd3JpdGVyCi0gIGRlZiB3cml0ZUk2NChzZWxmLCBpNjQpOgotICAgIHNlbGYuX193cml0ZVZhcmludChtYWtlWmlnWmFnKGk2NCwgNjQpKQorICAgIHdyaXRlQnl0ZSA9IHdyaXRlcihfX3dyaXRlQnl0ZSkKKyAgICB3cml0ZUkxNiA9IHdyaXRlcihfX3dyaXRlSTE2KQogCi0gIEB3cml0ZXIKLSAgZGVmIHdyaXRlRG91YmxlKHNlbGYsIGR1Yik6Ci0gICAgc2VsZi50cmFucy53cml0ZShwYWNrKCc8ZCcsIGR1YikpCisgICAgQHdyaXRlcgorICAgIGRlZiB3cml0ZUkzMihzZWxmLCBpMzIpOgorICAgICAgICBzZWxmLl9fd3JpdGVWYXJpbnQobWFrZVppZ1phZyhpMzIsIDMyKSkKIAotICBkZWYgX193cml0ZVN0cmluZyhzZWxmLCBzKToKLSAgICBzZWxmLl9fd3JpdGVTaXplKGxlbihzKSkKLSAgICBzZWxmLnRyYW5zLndyaXRlKHMpCi0gIHdyaXRlU3RyaW5nID0gd3JpdGVyKF9fd3JpdGVTdHJpbmcpCisgICAgQHdyaXRlcgorICAgIGRlZiB3cml0ZUk2NChzZWxmLCBpNjQpOgorICAgICAgICBzZWxmLl9fd3JpdGVWYXJpbnQobWFrZVppZ1phZyhpNjQsIDY0KSkKIAotICBkZWYgcmVhZEZpZWxkQmVnaW4oc2VsZik6Ci0gICAgYXNzZXJ0IHNlbGYuc3RhdGUgPT0gRklFTERfUkVBRCwgc2VsZi5zdGF0ZQotICAgIHR5cGUgPSBzZWxmLl9fcmVhZFVCeXRlKCkKLSAgICBpZiB0eXBlICYgMHgwZiA9PSBUVHlwZS5TVE9QOgotICAgICAgcmV0dXJuIChOb25lLCAwLCAwKQotICAgIGRlbHRhID0gdHlwZSA+PiA0Ci0gICAgaWYgZGVsdGEgPT0gMDoKLSAgICAgIGZpZCA9IHNlbGYuX19yZWFkSTE2KCkKLSAgICBlbHNlOgotICAgICAgZmlkID0gc2VsZi5fX2xhc3RfZmlkICsgZGVsdGEKLSAgICBzZWxmLl9fbGFzdF9maWQgPSBmaWQKLSAgICB0eXBlID0gdHlwZSAmIDB4MGYKLSAgICBpZiB0eXBlID09IENvbXBhY3RUeXBlLlRSVUU6Ci0gICAgICBzZWxmLnN0YXRlID0gQk9PTF9SRUFECi0gICAgICBzZWxmLl9fYm9vbF92YWx1ZSA9IFRydWUKLSAgICBlbGlmIHR5cGUgPT0gQ29tcGFjdFR5cGUuRkFMU0U6Ci0gICAgICBzZWxmLnN0YXRlID0gQk9PTF9SRUFECi0gICAgICBzZWxmLl9fYm9vbF92YWx1ZSA9IEZhbHNlCi0gICAgZWxzZToKLSAgICAgIHNlbGYuc3RhdGUgPSBWQUxVRV9SRUFECi0gICAgcmV0dXJuIChOb25lLCBzZWxmLl9fZ2V0VFR5cGUodHlwZSksIGZpZCkKKyAgICBAd3JpdGVyCisgICAgZGVmIHdyaXRlRG91YmxlKHNlbGYsIGR1Yik6CisgICAgICAgIHNlbGYudHJhbnMud3JpdGUocGFjaygnPGQnLCBkdWIpKQogCi0gIGRlZiByZWFkRmllbGRFbmQoc2VsZik6Ci0gICAgYXNzZXJ0IHNlbGYuc3RhdGUgaW4gKFZBTFVFX1JFQUQsIEJPT0xfUkVBRCksIHNlbGYuc3RhdGUKLSAgICBzZWxmLnN0YXRlID0gRklFTERfUkVBRAorICAgIGRlZiBfX3dyaXRlQmluYXJ5KHNlbGYsIHMpOgorICAgICAgICBzZWxmLl9fd3JpdGVTaXplKGxlbihzKSkKKyAgICAgICAgc2VsZi50cmFucy53cml0ZShzKQorICAgIHdyaXRlQmluYXJ5ID0gd3JpdGVyKF9fd3JpdGVCaW5hcnkpCiAKLSAgZGVmIF9fcmVhZFVCeXRlKHNlbGYpOgotICAgIHJlc3VsdCwgPSB1bnBhY2soJyFCJywgc2VsZi50cmFucy5yZWFkQWxsKDEpKQotICAgIHJldHVybiByZXN1bHQKKyAgICBkZWYgcmVhZEZpZWxkQmVnaW4oc2VsZik6CisgICAgICAgIGFzc2VydCBzZWxmLnN0YXRlID09IEZJRUxEX1JFQUQsIHNlbGYuc3RhdGUKKyAgICAgICAgdHlwZSA9IHNlbGYuX19yZWFkVUJ5dGUoKQorICAgICAgICBpZiB0eXBlICYgMHgwZiA9PSBUVHlwZS5TVE9QOgorICAgICAgICAgICAgcmV0dXJuIChOb25lLCAwLCAwKQorICAgICAgICBkZWx0YSA9IHR5cGUgPj4gNAorICAgICAgICBpZiBkZWx0YSA9PSAwOgorICAgICAgICAgICAgZmlkID0gc2VsZi5fX3JlYWRJMTYoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZmlkID0gc2VsZi5fX2xhc3RfZmlkICsgZGVsdGEKKyAgICAgICAgc2VsZi5fX2xhc3RfZmlkID0gZmlkCisgICAgICAgIHR5cGUgPSB0eXBlICYgMHgwZgorICAgICAgICBpZiB0eXBlID09IENvbXBhY3RUeXBlLlRSVUU6CisgICAgICAgICAgICBzZWxmLnN0YXRlID0gQk9PTF9SRUFECisgICAgICAgICAgICBzZWxmLl9fYm9vbF92YWx1ZSA9IFRydWUKKyAgICAgICAgZWxpZiB0eXBlID09IENvbXBhY3RUeXBlLkZBTFNFOgorICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IEJPT0xfUkVBRAorICAgICAgICAgICAgc2VsZi5fX2Jvb2xfdmFsdWUgPSBGYWxzZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IFZBTFVFX1JFQUQKKyAgICAgICAgcmV0dXJuIChOb25lLCBzZWxmLl9fZ2V0VFR5cGUodHlwZSksIGZpZCkKIAotICBkZWYgX19yZWFkQnl0ZShzZWxmKToKLSAgICByZXN1bHQsID0gdW5wYWNrKCchYicsIHNlbGYudHJhbnMucmVhZEFsbCgxKSkKLSAgICByZXR1cm4gcmVzdWx0CisgICAgZGVmIHJlYWRGaWVsZEVuZChzZWxmKToKKyAgICAgICAgYXNzZXJ0IHNlbGYuc3RhdGUgaW4gKFZBTFVFX1JFQUQsIEJPT0xfUkVBRCksIHNlbGYuc3RhdGUKKyAgICAgICAgc2VsZi5zdGF0ZSA9IEZJRUxEX1JFQUQKIAotICBkZWYgX19yZWFkVmFyaW50KHNlbGYpOgotICAgIHJldHVybiByZWFkVmFyaW50KHNlbGYudHJhbnMpCisgICAgZGVmIF9fcmVhZFVCeXRlKHNlbGYpOgorICAgICAgICByZXN1bHQsID0gdW5wYWNrKCchQicsIHNlbGYudHJhbnMucmVhZEFsbCgxKSkKKyAgICAgICAgcmV0dXJuIHJlc3VsdAogCi0gIGRlZiBfX3JlYWRaaWdaYWcoc2VsZik6Ci0gICAgcmV0dXJuIGZyb21aaWdaYWcoc2VsZi5fX3JlYWRWYXJpbnQoKSkKKyAgICBkZWYgX19yZWFkQnl0ZShzZWxmKToKKyAgICAgICAgcmVzdWx0LCA9IHVucGFjaygnIWInLCBzZWxmLnRyYW5zLnJlYWRBbGwoMSkpCisgICAgICAgIHJldHVybiByZXN1bHQKIAotICBkZWYgX19yZWFkU2l6ZShzZWxmKToKLSAgICByZXN1bHQgPSBzZWxmLl9fcmVhZFZhcmludCgpCi0gICAgaWYgcmVzdWx0IDwgMDoKLSAgICAgIHJhaXNlIFRFeGNlcHRpb24oIkxlbmd0aCA8IDAiKQotICAgIHJldHVybiByZXN1bHQKKyAgICBkZWYgX19yZWFkVmFyaW50KHNlbGYpOgorICAgICAgICByZXR1cm4gcmVhZFZhcmludChzZWxmLnRyYW5zKQogCi0gIGRlZiByZWFkTWVzc2FnZUJlZ2luKHNlbGYpOgotICAgIGFzc2VydCBzZWxmLnN0YXRlID09IENMRUFSCi0gICAgcHJvdG9faWQgPSBzZWxmLl9fcmVhZFVCeXRlKCkKLSAgICBpZiBwcm90b19pZCAhPSBzZWxmLlBST1RPQ09MX0lEOgotICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5CQURfVkVSU0lPTiwKLSAgICAgICAgICAnQmFkIHByb3RvY29sIGlkIGluIHRoZSBtZXNzYWdlOiAlZCcgJSBwcm90b19pZCkKLSAgICB2ZXJfdHlwZSA9IHNlbGYuX19yZWFkVUJ5dGUoKQotICAgIHR5cGUgPSAodmVyX3R5cGUgPj4gc2VsZi5UWVBFX1NISUZUX0FNT1VOVCkgJiBzZWxmLlRZUEVfQklUUwotICAgIHZlcnNpb24gPSB2ZXJfdHlwZSAmIHNlbGYuVkVSU0lPTl9NQVNLCi0gICAgaWYgdmVyc2lvbiAhPSBzZWxmLlZFUlNJT046Ci0gICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLkJBRF9WRVJTSU9OLAotICAgICAgICAgICdCYWQgdmVyc2lvbjogJWQgKGV4cGVjdCAlZCknICUgKHZlcnNpb24sIHNlbGYuVkVSU0lPTikpCi0gICAgc2VxaWQgPSBzZWxmLl9fcmVhZFZhcmludCgpCi0gICAgbmFtZSA9IHNlbGYuX19yZWFkU3RyaW5nKCkKLSAgICByZXR1cm4gKG5hbWUsIHR5cGUsIHNlcWlkKQorICAgIGRlZiBfX3JlYWRaaWdaYWcoc2VsZik6CisgICAgICAgIHJldHVybiBmcm9tWmlnWmFnKHNlbGYuX19yZWFkVmFyaW50KCkpCiAKLSAgZGVmIHJlYWRNZXNzYWdlRW5kKHNlbGYpOgotICAgIGFzc2VydCBzZWxmLnN0YXRlID09IENMRUFSCi0gICAgYXNzZXJ0IGxlbihzZWxmLl9fc3RydWN0cykgPT0gMAorICAgIGRlZiBfX3JlYWRTaXplKHNlbGYpOgorICAgICAgICByZXN1bHQgPSBzZWxmLl9fcmVhZFZhcmludCgpCisgICAgICAgIGlmIHJlc3VsdCA8IDA6CisgICAgICAgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24oIkxlbmd0aCA8IDAiKQorICAgICAgICByZXR1cm4gcmVzdWx0CiAKLSAgZGVmIHJlYWRTdHJ1Y3RCZWdpbihzZWxmKToKLSAgICBhc3NlcnQgc2VsZi5zdGF0ZSBpbiAoQ0xFQVIsIENPTlRBSU5FUl9SRUFELCBWQUxVRV9SRUFEKSwgc2VsZi5zdGF0ZQotICAgIHNlbGYuX19zdHJ1Y3RzLmFwcGVuZCgoc2VsZi5zdGF0ZSwgc2VsZi5fX2xhc3RfZmlkKSkKLSAgICBzZWxmLnN0YXRlID0gRklFTERfUkVBRAotICAgIHNlbGYuX19sYXN0X2ZpZCA9IDAKKyAgICBkZWYgcmVhZE1lc3NhZ2VCZWdpbihzZWxmKToKKyAgICAgICAgYXNzZXJ0IHNlbGYuc3RhdGUgPT0gQ0xFQVIKKyAgICAgICAgcHJvdG9faWQgPSBzZWxmLl9fcmVhZFVCeXRlKCkKKyAgICAgICAgaWYgcHJvdG9faWQgIT0gc2VsZi5QUk9UT0NPTF9JRDoKKyAgICAgICAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uQkFEX1ZFUlNJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0JhZCBwcm90b2NvbCBpZCBpbiB0aGUgbWVzc2FnZTogJWQnICUgcHJvdG9faWQpCisgICAgICAgIHZlcl90eXBlID0gc2VsZi5fX3JlYWRVQnl0ZSgpCisgICAgICAgIHR5cGUgPSAodmVyX3R5cGUgPj4gc2VsZi5UWVBFX1NISUZUX0FNT1VOVCkgJiBzZWxmLlRZUEVfQklUUworICAgICAgICB2ZXJzaW9uID0gdmVyX3R5cGUgJiBzZWxmLlZFUlNJT05fTUFTSworICAgICAgICBpZiB2ZXJzaW9uICE9IHNlbGYuVkVSU0lPTjoKKyAgICAgICAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uQkFEX1ZFUlNJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0JhZCB2ZXJzaW9uOiAlZCAoZXhwZWN0ICVkKScgJSAodmVyc2lvbiwgc2VsZi5WRVJTSU9OKSkKKyAgICAgICAgc2VxaWQgPSBzZWxmLl9fcmVhZFZhcmludCgpCisgICAgICAgIG5hbWUgPSBiaW5hcnlfdG9fc3RyKHNlbGYuX19yZWFkQmluYXJ5KCkpCisgICAgICAgIHJldHVybiAobmFtZSwgdHlwZSwgc2VxaWQpCiAKLSAgZGVmIHJlYWRTdHJ1Y3RFbmQoc2VsZik6Ci0gICAgYXNzZXJ0IHNlbGYuc3RhdGUgPT0gRklFTERfUkVBRAotICAgIHNlbGYuc3RhdGUsIHNlbGYuX19sYXN0X2ZpZCA9IHNlbGYuX19zdHJ1Y3RzLnBvcCgpCisgICAgZGVmIHJlYWRNZXNzYWdlRW5kKHNlbGYpOgorICAgICAgICBhc3NlcnQgc2VsZi5zdGF0ZSA9PSBDTEVBUgorICAgICAgICBhc3NlcnQgbGVuKHNlbGYuX19zdHJ1Y3RzKSA9PSAwCiAKLSAgZGVmIHJlYWRDb2xsZWN0aW9uQmVnaW4oc2VsZik6Ci0gICAgYXNzZXJ0IHNlbGYuc3RhdGUgaW4gKFZBTFVFX1JFQUQsIENPTlRBSU5FUl9SRUFEKSwgc2VsZi5zdGF0ZQotICAgIHNpemVfdHlwZSA9IHNlbGYuX19yZWFkVUJ5dGUoKQotICAgIHNpemUgPSBzaXplX3R5cGUgPj4gNAotICAgIHR5cGUgPSBzZWxmLl9fZ2V0VFR5cGUoc2l6ZV90eXBlKQotICAgIGlmIHNpemUgPT0gMTU6Ci0gICAgICBzaXplID0gc2VsZi5fX3JlYWRTaXplKCkKLSAgICBzZWxmLl9fY29udGFpbmVycy5hcHBlbmQoc2VsZi5zdGF0ZSkKLSAgICBzZWxmLnN0YXRlID0gQ09OVEFJTkVSX1JFQUQKLSAgICByZXR1cm4gdHlwZSwgc2l6ZQotICByZWFkU2V0QmVnaW4gPSByZWFkQ29sbGVjdGlvbkJlZ2luCi0gIHJlYWRMaXN0QmVnaW4gPSByZWFkQ29sbGVjdGlvbkJlZ2luCisgICAgZGVmIHJlYWRTdHJ1Y3RCZWdpbihzZWxmKToKKyAgICAgICAgYXNzZXJ0IHNlbGYuc3RhdGUgaW4gKENMRUFSLCBDT05UQUlORVJfUkVBRCwgVkFMVUVfUkVBRCksIHNlbGYuc3RhdGUKKyAgICAgICAgc2VsZi5fX3N0cnVjdHMuYXBwZW5kKChzZWxmLnN0YXRlLCBzZWxmLl9fbGFzdF9maWQpKQorICAgICAgICBzZWxmLnN0YXRlID0gRklFTERfUkVBRAorICAgICAgICBzZWxmLl9fbGFzdF9maWQgPSAwCiAKLSAgZGVmIHJlYWRNYXBCZWdpbihzZWxmKToKLSAgICBhc3NlcnQgc2VsZi5zdGF0ZSBpbiAoVkFMVUVfUkVBRCwgQ09OVEFJTkVSX1JFQUQpLCBzZWxmLnN0YXRlCi0gICAgc2l6ZSA9IHNlbGYuX19yZWFkU2l6ZSgpCi0gICAgdHlwZXMgPSAwCi0gICAgaWYgc2l6ZSA+IDA6Ci0gICAgICB0eXBlcyA9IHNlbGYuX19yZWFkVUJ5dGUoKQotICAgIHZ0eXBlID0gc2VsZi5fX2dldFRUeXBlKHR5cGVzKQotICAgIGt0eXBlID0gc2VsZi5fX2dldFRUeXBlKHR5cGVzID4+IDQpCi0gICAgc2VsZi5fX2NvbnRhaW5lcnMuYXBwZW5kKHNlbGYuc3RhdGUpCi0gICAgc2VsZi5zdGF0ZSA9IENPTlRBSU5FUl9SRUFECi0gICAgcmV0dXJuIChrdHlwZSwgdnR5cGUsIHNpemUpCisgICAgZGVmIHJlYWRTdHJ1Y3RFbmQoc2VsZik6CisgICAgICAgIGFzc2VydCBzZWxmLnN0YXRlID09IEZJRUxEX1JFQUQKKyAgICAgICAgc2VsZi5zdGF0ZSwgc2VsZi5fX2xhc3RfZmlkID0gc2VsZi5fX3N0cnVjdHMucG9wKCkKIAotICBkZWYgcmVhZENvbGxlY3Rpb25FbmQoc2VsZik6Ci0gICAgYXNzZXJ0IHNlbGYuc3RhdGUgPT0gQ09OVEFJTkVSX1JFQUQsIHNlbGYuc3RhdGUKLSAgICBzZWxmLnN0YXRlID0gc2VsZi5fX2NvbnRhaW5lcnMucG9wKCkKLSAgcmVhZFNldEVuZCA9IHJlYWRDb2xsZWN0aW9uRW5kCi0gIHJlYWRMaXN0RW5kID0gcmVhZENvbGxlY3Rpb25FbmQKLSAgcmVhZE1hcEVuZCA9IHJlYWRDb2xsZWN0aW9uRW5kCisgICAgZGVmIHJlYWRDb2xsZWN0aW9uQmVnaW4oc2VsZik6CisgICAgICAgIGFzc2VydCBzZWxmLnN0YXRlIGluIChWQUxVRV9SRUFELCBDT05UQUlORVJfUkVBRCksIHNlbGYuc3RhdGUKKyAgICAgICAgc2l6ZV90eXBlID0gc2VsZi5fX3JlYWRVQnl0ZSgpCisgICAgICAgIHNpemUgPSBzaXplX3R5cGUgPj4gNAorICAgICAgICB0eXBlID0gc2VsZi5fX2dldFRUeXBlKHNpemVfdHlwZSkKKyAgICAgICAgaWYgc2l6ZSA9PSAxNToKKyAgICAgICAgICAgIHNpemUgPSBzZWxmLl9fcmVhZFNpemUoKQorICAgICAgICBzZWxmLl9jaGVja19jb250YWluZXJfbGVuZ3RoKHNpemUpCisgICAgICAgIHNlbGYuX19jb250YWluZXJzLmFwcGVuZChzZWxmLnN0YXRlKQorICAgICAgICBzZWxmLnN0YXRlID0gQ09OVEFJTkVSX1JFQUQKKyAgICAgICAgcmV0dXJuIHR5cGUsIHNpemUKKyAgICByZWFkU2V0QmVnaW4gPSByZWFkQ29sbGVjdGlvbkJlZ2luCisgICAgcmVhZExpc3RCZWdpbiA9IHJlYWRDb2xsZWN0aW9uQmVnaW4KIAotICBkZWYgcmVhZEJvb2woc2VsZik6Ci0gICAgaWYgc2VsZi5zdGF0ZSA9PSBCT09MX1JFQUQ6Ci0gICAgICByZXR1cm4gc2VsZi5fX2Jvb2xfdmFsdWUgPT0gQ29tcGFjdFR5cGUuVFJVRQotICAgIGVsaWYgc2VsZi5zdGF0ZSA9PSBDT05UQUlORVJfUkVBRDoKLSAgICAgIHJldHVybiBzZWxmLl9fcmVhZEJ5dGUoKSA9PSBDb21wYWN0VHlwZS5UUlVFCi0gICAgZWxzZToKLSAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCJJbnZhbGlkIHN0YXRlIGluIGNvbXBhY3QgcHJvdG9jb2w6ICVkIiAlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXRlKQorICAgIGRlZiByZWFkTWFwQmVnaW4oc2VsZik6CisgICAgICAgIGFzc2VydCBzZWxmLnN0YXRlIGluIChWQUxVRV9SRUFELCBDT05UQUlORVJfUkVBRCksIHNlbGYuc3RhdGUKKyAgICAgICAgc2l6ZSA9IHNlbGYuX19yZWFkU2l6ZSgpCisgICAgICAgIHNlbGYuX2NoZWNrX2NvbnRhaW5lcl9sZW5ndGgoc2l6ZSkKKyAgICAgICAgdHlwZXMgPSAwCisgICAgICAgIGlmIHNpemUgPiAwOgorICAgICAgICAgICAgdHlwZXMgPSBzZWxmLl9fcmVhZFVCeXRlKCkKKyAgICAgICAgdnR5cGUgPSBzZWxmLl9fZ2V0VFR5cGUodHlwZXMpCisgICAgICAgIGt0eXBlID0gc2VsZi5fX2dldFRUeXBlKHR5cGVzID4+IDQpCisgICAgICAgIHNlbGYuX19jb250YWluZXJzLmFwcGVuZChzZWxmLnN0YXRlKQorICAgICAgICBzZWxmLnN0YXRlID0gQ09OVEFJTkVSX1JFQUQKKyAgICAgICAgcmV0dXJuIChrdHlwZSwgdnR5cGUsIHNpemUpCiAKLSAgcmVhZEJ5dGUgPSByZWFkZXIoX19yZWFkQnl0ZSkKLSAgX19yZWFkSTE2ID0gX19yZWFkWmlnWmFnCi0gIHJlYWRJMTYgPSByZWFkZXIoX19yZWFkWmlnWmFnKQotICByZWFkSTMyID0gcmVhZGVyKF9fcmVhZFppZ1phZykKLSAgcmVhZEk2NCA9IHJlYWRlcihfX3JlYWRaaWdaYWcpCisgICAgZGVmIHJlYWRDb2xsZWN0aW9uRW5kKHNlbGYpOgorICAgICAgICBhc3NlcnQgc2VsZi5zdGF0ZSA9PSBDT05UQUlORVJfUkVBRCwgc2VsZi5zdGF0ZQorICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5fX2NvbnRhaW5lcnMucG9wKCkKKyAgICByZWFkU2V0RW5kID0gcmVhZENvbGxlY3Rpb25FbmQKKyAgICByZWFkTGlzdEVuZCA9IHJlYWRDb2xsZWN0aW9uRW5kCisgICAgcmVhZE1hcEVuZCA9IHJlYWRDb2xsZWN0aW9uRW5kCiAKLSAgQHJlYWRlcgotICBkZWYgcmVhZERvdWJsZShzZWxmKToKLSAgICBidWZmID0gc2VsZi50cmFucy5yZWFkQWxsKDgpCi0gICAgdmFsLCA9IHVucGFjaygnPGQnLCBidWZmKQotICAgIHJldHVybiB2YWwKKyAgICBkZWYgcmVhZEJvb2woc2VsZik6CisgICAgICAgIGlmIHNlbGYuc3RhdGUgPT0gQk9PTF9SRUFEOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19ib29sX3ZhbHVlID09IENvbXBhY3RUeXBlLlRSVUUKKyAgICAgICAgZWxpZiBzZWxmLnN0YXRlID09IENPTlRBSU5FUl9SRUFEOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19yZWFkQnl0ZSgpID09IENvbXBhY3RUeXBlLlRSVUUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCJJbnZhbGlkIHN0YXRlIGluIGNvbXBhY3QgcHJvdG9jb2w6ICVkIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXRlKQogCi0gIGRlZiBfX3JlYWRTdHJpbmcoc2VsZik6Ci0gICAgbGVuID0gc2VsZi5fX3JlYWRTaXplKCkKLSAgICByZXR1cm4gc2VsZi50cmFucy5yZWFkQWxsKGxlbikKLSAgcmVhZFN0cmluZyA9IHJlYWRlcihfX3JlYWRTdHJpbmcpCisgICAgcmVhZEJ5dGUgPSByZWFkZXIoX19yZWFkQnl0ZSkKKyAgICBfX3JlYWRJMTYgPSBfX3JlYWRaaWdaYWcKKyAgICByZWFkSTE2ID0gcmVhZGVyKF9fcmVhZFppZ1phZykKKyAgICByZWFkSTMyID0gcmVhZGVyKF9fcmVhZFppZ1phZykKKyAgICByZWFkSTY0ID0gcmVhZGVyKF9fcmVhZFppZ1phZykKIAotICBkZWYgX19nZXRUVHlwZShzZWxmLCBieXRlKToKLSAgICByZXR1cm4gVFRZUEVTW2J5dGUgJiAweDBmXQorICAgIEByZWFkZXIKKyAgICBkZWYgcmVhZERvdWJsZShzZWxmKToKKyAgICAgICAgYnVmZiA9IHNlbGYudHJhbnMucmVhZEFsbCg4KQorICAgICAgICB2YWwsID0gdW5wYWNrKCc8ZCcsIGJ1ZmYpCisgICAgICAgIHJldHVybiB2YWwKKworICAgIGRlZiBfX3JlYWRCaW5hcnkoc2VsZik6CisgICAgICAgIHNpemUgPSBzZWxmLl9fcmVhZFNpemUoKQorICAgICAgICBzZWxmLl9jaGVja19zdHJpbmdfbGVuZ3RoKHNpemUpCisgICAgICAgIHJldHVybiBzZWxmLnRyYW5zLnJlYWRBbGwoc2l6ZSkKKyAgICByZWFkQmluYXJ5ID0gcmVhZGVyKF9fcmVhZEJpbmFyeSkKKworICAgIGRlZiBfX2dldFRUeXBlKHNlbGYsIGJ5dGUpOgorICAgICAgICByZXR1cm4gVFRZUEVTW2J5dGUgJiAweDBmXQogCiAKLWNsYXNzIFRDb21wYWN0UHJvdG9jb2xGYWN0b3J5OgotICBkZWYgX19pbml0X18oc2VsZik6CitjbGFzcyBUQ29tcGFjdFByb3RvY29sRmFjdG9yeShvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLAorICAgICAgICAgICAgICAgICBzdHJpbmdfbGVuZ3RoX2xpbWl0PU5vbmUsCisgICAgICAgICAgICAgICAgIGNvbnRhaW5lcl9sZW5ndGhfbGltaXQ9Tm9uZSk6CisgICAgICAgIHNlbGYuc3RyaW5nX2xlbmd0aF9saW1pdCA9IHN0cmluZ19sZW5ndGhfbGltaXQKKyAgICAgICAgc2VsZi5jb250YWluZXJfbGVuZ3RoX2xpbWl0ID0gY29udGFpbmVyX2xlbmd0aF9saW1pdAorCisgICAgZGVmIGdldFByb3RvY29sKHNlbGYsIHRyYW5zKToKKyAgICAgICAgcmV0dXJuIFRDb21wYWN0UHJvdG9jb2wodHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RyaW5nX2xlbmd0aF9saW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250YWluZXJfbGVuZ3RoX2xpbWl0KQorCisKK2NsYXNzIFRDb21wYWN0UHJvdG9jb2xBY2NlbGVyYXRlZChUQ29tcGFjdFByb3RvY29sKToKKyAgICAiIiJDLUFjY2VsZXJhdGVkIHZlcnNpb24gb2YgVENvbXBhY3RQcm90b2NvbC4KKworICAgIFRoaXMgY2xhc3MgZG9lcyBub3Qgb3ZlcnJpZGUgYW55IG9mIFRDb21wYWN0UHJvdG9jb2wncyBtZXRob2RzLAorICAgIGJ1dCB0aGUgZ2VuZXJhdGVkIGNvZGUgcmVjb2duaXplcyBpdCBkaXJlY3RseSBhbmQgd2lsbCBjYWxsIGludG8KKyAgICBvdXIgQyBtb2R1bGUgdG8gZG8gdGhlIGVuY29kaW5nLCBieXBhc3NpbmcgdGhpcyBvYmplY3QgZW50aXJlbHkuCisgICAgV2UgaW5oZXJpdCBmcm9tIFRDb21wYWN0UHJvdG9jb2wgc28gdGhhdCB0aGUgbm9ybWFsIFRDb21wYWN0UHJvdG9jb2wKKyAgICBlbmNvZGluZyBjYW4gaGFwcGVuIGlmIHRoZSBmYXN0YmluYXJ5IG1vZHVsZSBkb2Vzbid0IHdvcmsgZm9yIHNvbWUKKyAgICByZWFzb24uCisgICAgVG8gZGlzYWJsZSB0aGlzIGJlaGF2aW9yLCBwYXNzIGZhbGxiYWNrPUZhbHNlIGNvbnN0cnVjdG9yIGFyZ3VtZW50LgorCisgICAgSW4gb3JkZXIgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIEMgbW9kdWxlLCBqdXN0IHVzZQorICAgIFRDb21wYWN0UHJvdG9jb2xBY2NlbGVyYXRlZCBpbnN0ZWFkIG9mIFRDb21wYWN0UHJvdG9jb2wuCisgICAgIiIiCiAgICAgcGFzcwogCi0gIGRlZiBnZXRQcm90b2NvbChzZWxmLCB0cmFucyk6Ci0gICAgcmV0dXJuIFRDb21wYWN0UHJvdG9jb2wodHJhbnMpCisgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIGZhbGxiYWNrID0ga3dhcmdzLnBvcCgnZmFsbGJhY2snLCBUcnVlKQorICAgICAgICBzdXBlcihUQ29tcGFjdFByb3RvY29sQWNjZWxlcmF0ZWQsIHNlbGYpLl9faW5pdF9fKCphcmdzLCAqKmt3YXJncykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IGZhc3RiaW5hcnkKKyAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgaWYgbm90IGZhbGxiYWNrOgorICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9mYXN0X2RlY29kZSA9IGZhc3RiaW5hcnkuZGVjb2RlX2NvbXBhY3QKKyAgICAgICAgICAgIHNlbGYuX2Zhc3RfZW5jb2RlID0gZmFzdGJpbmFyeS5lbmNvZGVfY29tcGFjdAorCisKK2NsYXNzIFRDb21wYWN0UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3Rvcnkob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwKKyAgICAgICAgICAgICAgICAgc3RyaW5nX2xlbmd0aF9saW1pdD1Ob25lLAorICAgICAgICAgICAgICAgICBjb250YWluZXJfbGVuZ3RoX2xpbWl0PU5vbmUsCisgICAgICAgICAgICAgICAgIGZhbGxiYWNrPVRydWUpOgorICAgICAgICBzZWxmLnN0cmluZ19sZW5ndGhfbGltaXQgPSBzdHJpbmdfbGVuZ3RoX2xpbWl0CisgICAgICAgIHNlbGYuY29udGFpbmVyX2xlbmd0aF9saW1pdCA9IGNvbnRhaW5lcl9sZW5ndGhfbGltaXQKKyAgICAgICAgc2VsZi5fZmFsbGJhY2sgPSBmYWxsYmFjaworCisgICAgZGVmIGdldFByb3RvY29sKHNlbGYsIHRyYW5zKToKKyAgICAgICAgcmV0dXJuIFRDb21wYWN0UHJvdG9jb2xBY2NlbGVyYXRlZCgKKyAgICAgICAgICAgIHRyYW5zLAorICAgICAgICAgICAgc3RyaW5nX2xlbmd0aF9saW1pdD1zZWxmLnN0cmluZ19sZW5ndGhfbGltaXQsCisgICAgICAgICAgICBjb250YWluZXJfbGVuZ3RoX2xpbWl0PXNlbGYuY29udGFpbmVyX2xlbmd0aF9saW1pdCwKKyAgICAgICAgICAgIGZhbGxiYWNrPXNlbGYuX2ZhbGxiYWNrKQpkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9wcm90b2NvbC9USGVhZGVyUHJvdG9jb2wucHkgYi9saWIvcHkvc3JjL3Byb3RvY29sL1RIZWFkZXJQcm90b2NvbC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjdhNzQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5L3NyYy9wcm90b2NvbC9USGVhZGVyUHJvdG9jb2wucHkKQEAgLTAsMCArMSwyMjUgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitmcm9tIHRocmlmdC5wcm90b2NvbC5UQmluYXJ5UHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkCitmcm9tIHRocmlmdC5wcm90b2NvbC5UQ29tcGFjdFByb3RvY29sIGltcG9ydCBUQ29tcGFjdFByb3RvY29sQWNjZWxlcmF0ZWQKK2Zyb20gdGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBpbXBvcnQgVFByb3RvY29sQmFzZSwgVFByb3RvY29sRXhjZXB0aW9uCitmcm9tIHRocmlmdC5UaHJpZnQgaW1wb3J0IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiwgVE1lc3NhZ2VUeXBlCitmcm9tIHRocmlmdC50cmFuc3BvcnQuVEhlYWRlclRyYW5zcG9ydCBpbXBvcnQgVEhlYWRlclRyYW5zcG9ydCwgVEhlYWRlclN1YnByb3RvY29sSUQsIFRIZWFkZXJDbGllbnRUeXBlCisKKworUFJPVE9DT0xTX0JZX0lEID0geworICAgIFRIZWFkZXJTdWJwcm90b2NvbElELkJJTkFSWTogVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQsCisgICAgVEhlYWRlclN1YnByb3RvY29sSUQuQ09NUEFDVDogVENvbXBhY3RQcm90b2NvbEFjY2VsZXJhdGVkLAorfQorCisKK2NsYXNzIFRIZWFkZXJQcm90b2NvbChUUHJvdG9jb2xCYXNlKToKKyAgICAiIiJBIGZyYW1lZCBwcm90b2NvbCB3aXRoIGhlYWRlcnMgYW5kIHBheWxvYWQgdHJhbnNmb3Jtcy4KKworICAgIFRIZWFkZXJQcm90b2NvbCBmcmFtZXMgb3RoZXIgVGhyaWZ0IHByb3RvY29scyBhbmQgYWRkcyBzdXBwb3J0IGZvciBvcHRpb25hbAorICAgIG91dC1vZi1iYW5kIGhlYWRlcnMuIFRoZSBjdXJyZW50bHkgc3VwcG9ydGVkIHN1YnByb3RvY29scyBhcmUKKyAgICBUQmluYXJ5UHJvdG9jb2wgYW5kIFRDb21wYWN0UHJvdG9jb2wuCisKKyAgICBJdCdzIGFsc28gcG9zc2libGUgdG8gYXBwbHkgdHJhbnNmb3JtcyB0byB0aGUgZW5jb2RlZCBtZXNzYWdlIHBheWxvYWQuIFRoZQorICAgIG9ubHkgdHJhbnNmb3JtIGN1cnJlbnRseSBzdXBwb3J0ZWQgaXMgdG8gZ3ppcC4KKworICAgIFdoZW4gdXNlZCBpbiBhIHNlcnZlciwgVEhlYWRlclByb3RvY29sIGNhbiBhY2NlcHQgbWVzc2FnZXMgZnJvbQorICAgIG5vbi1USGVhZGVyUHJvdG9jb2wgY2xpZW50cyBpZiBhbGxvd2VkIChzZWUgYGFsbG93ZWRfY2xpZW50X3R5cGVzYCkuIFRoaXMKKyAgICBpbmNsdWRlcyBmcmFtZWQgYW5kIHVuZnJhbWVkIHRyYW5zcG9ydHMgYW5kIGJvdGggVEJpbmFyeVByb3RvY29sIGFuZAorICAgIFRDb21wYWN0UHJvdG9jb2wuIFRoZSBzZXJ2ZXIgd2lsbCByZXNwb25kIGluIHRoZSBhcHByb3ByaWF0ZSBkaWFsZWN0IGZvcgorICAgIHRoZSBjb25uZWN0ZWQgY2xpZW50LiBIVFRQIGNsaWVudHMgYXJlIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkLgorCisgICAgVEhlYWRlclByb3RvY29sIGRvZXMgbm90IGN1cnJlbnRseSBzdXBwb3J0IFRIVFRQU2VydmVyLCBUTm9uYmxvY2tpbmdTZXJ2ZXIsCisgICAgb3IgVFByb2Nlc3NQb29sU2VydmVyLgorCisgICAgU2VlIGRvYy9zcGVjcy9IZWFkZXJGb3JtYXQubWQgZm9yIGRldGFpbHMgb2YgdGhlIHdpcmUgZm9ybWF0LgorCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdHJhbnNwb3J0LCBhbGxvd2VkX2NsaWVudF90eXBlcyk6CisgICAgICAgICMgbXVjaCBvZiB0aGUgYWN0dWFsIHdvcmsgZm9yIFRIZWFkZXJQcm90b2NvbCBoYXBwZW5zIGRvd24gaW4KKyAgICAgICAgIyBUSGVhZGVyVHJhbnNwb3J0IHNpbmNlIHdlIG5lZWQgdG8gZG8gbG93LWxldmVsIHNoZW5hbmlnYW5zIHRvIGRldGVjdAorICAgICAgICAjIGlmIHRoZSBjbGllbnQgaXMgc2VuZGluZyB1cyBoZWFkZXJzIG9yIG9uZSBvZiB0aGUgaGVhZGVybGVzcyBmb3JtYXRzCisgICAgICAgICMgd2Ugc3VwcG9ydC4gdGhpcyB3cmFwcyB0aGUgcmVhbCB0cmFuc3BvcnQgd2l0aCB0aGUgb25lIHRoYXQgZG9lcyBhbGwKKyAgICAgICAgIyB0aGUgbWFnaWMuCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHRyYW5zcG9ydCwgVEhlYWRlclRyYW5zcG9ydCk6CisgICAgICAgICAgICB0cmFuc3BvcnQgPSBUSGVhZGVyVHJhbnNwb3J0KHRyYW5zcG9ydCwgYWxsb3dlZF9jbGllbnRfdHlwZXMpCisgICAgICAgIHN1cGVyKFRIZWFkZXJQcm90b2NvbCwgc2VsZikuX19pbml0X18odHJhbnNwb3J0KQorICAgICAgICBzZWxmLl9zZXRfcHJvdG9jb2woKQorCisgICAgZGVmIGdldF9oZWFkZXJzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi50cmFucy5nZXRfaGVhZGVycygpCisKKyAgICBkZWYgc2V0X2hlYWRlcihzZWxmLCBrZXksIHZhbHVlKToKKyAgICAgICAgc2VsZi50cmFucy5zZXRfaGVhZGVyKGtleSwgdmFsdWUpCisKKyAgICBkZWYgY2xlYXJfaGVhZGVycyhzZWxmKToKKyAgICAgICAgc2VsZi50cmFucy5jbGVhcl9oZWFkZXJzKCkKKworICAgIGRlZiBhZGRfdHJhbnNmb3JtKHNlbGYsIHRyYW5zZm9ybV9pZCk6CisgICAgICAgIHNlbGYudHJhbnMuYWRkX3RyYW5zZm9ybSh0cmFuc2Zvcm1faWQpCisKKyAgICBkZWYgd3JpdGVNZXNzYWdlQmVnaW4oc2VsZiwgbmFtZSwgdHR5cGUsIHNlcWlkKToKKyAgICAgICAgc2VsZi50cmFucy5zZXF1ZW5jZV9pZCA9IHNlcWlkCisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC53cml0ZU1lc3NhZ2VCZWdpbihuYW1lLCB0dHlwZSwgc2VxaWQpCisKKyAgICBkZWYgd3JpdGVNZXNzYWdlRW5kKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wud3JpdGVNZXNzYWdlRW5kKCkKKworICAgIGRlZiB3cml0ZVN0cnVjdEJlZ2luKHNlbGYsIG5hbWUpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wud3JpdGVTdHJ1Y3RCZWdpbihuYW1lKQorCisgICAgZGVmIHdyaXRlU3RydWN0RW5kKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wud3JpdGVTdHJ1Y3RFbmQoKQorCisgICAgZGVmIHdyaXRlRmllbGRCZWdpbihzZWxmLCBuYW1lLCB0dHlwZSwgZmlkKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLndyaXRlRmllbGRCZWdpbihuYW1lLCB0dHlwZSwgZmlkKQorCisgICAgZGVmIHdyaXRlRmllbGRFbmQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC53cml0ZUZpZWxkRW5kKCkKKworICAgIGRlZiB3cml0ZUZpZWxkU3RvcChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLndyaXRlRmllbGRTdG9wKCkKKworICAgIGRlZiB3cml0ZU1hcEJlZ2luKHNlbGYsIGt0eXBlLCB2dHlwZSwgc2l6ZSk6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC53cml0ZU1hcEJlZ2luKGt0eXBlLCB2dHlwZSwgc2l6ZSkKKworICAgIGRlZiB3cml0ZU1hcEVuZChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLndyaXRlTWFwRW5kKCkKKworICAgIGRlZiB3cml0ZUxpc3RCZWdpbihzZWxmLCBldHlwZSwgc2l6ZSk6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC53cml0ZUxpc3RCZWdpbihldHlwZSwgc2l6ZSkKKworICAgIGRlZiB3cml0ZUxpc3RFbmQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC53cml0ZUxpc3RFbmQoKQorCisgICAgZGVmIHdyaXRlU2V0QmVnaW4oc2VsZiwgZXR5cGUsIHNpemUpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wud3JpdGVTZXRCZWdpbihldHlwZSwgc2l6ZSkKKworICAgIGRlZiB3cml0ZVNldEVuZChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLndyaXRlU2V0RW5kKCkKKworICAgIGRlZiB3cml0ZUJvb2woc2VsZiwgYm9vbF92YWwpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wud3JpdGVCb29sKGJvb2xfdmFsKQorCisgICAgZGVmIHdyaXRlQnl0ZShzZWxmLCBieXRlKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLndyaXRlQnl0ZShieXRlKQorCisgICAgZGVmIHdyaXRlSTE2KHNlbGYsIGkxNik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC53cml0ZUkxNihpMTYpCisKKyAgICBkZWYgd3JpdGVJMzIoc2VsZiwgaTMyKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLndyaXRlSTMyKGkzMikKKworICAgIGRlZiB3cml0ZUk2NChzZWxmLCBpNjQpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wud3JpdGVJNjQoaTY0KQorCisgICAgZGVmIHdyaXRlRG91YmxlKHNlbGYsIGR1Yik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC53cml0ZURvdWJsZShkdWIpCisKKyAgICBkZWYgd3JpdGVCaW5hcnkoc2VsZiwgc3RyX3ZhbCk6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC53cml0ZUJpbmFyeShzdHJfdmFsKQorCisgICAgZGVmIF9zZXRfcHJvdG9jb2woc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHByb3RvY29sX2NscyA9IFBST1RPQ09MU19CWV9JRFtzZWxmLnRyYW5zLnByb3RvY29sX2lkXQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICByYWlzZSBUQXBwbGljYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfUFJPVE9DT0wsCisgICAgICAgICAgICAgICAgIlVua25vd24gcHJvdG9jb2wgcmVxdWVzdGVkLiIsCisgICAgICAgICAgICApCisKKyAgICAgICAgc2VsZi5fcHJvdG9jb2wgPSBwcm90b2NvbF9jbHMoc2VsZi50cmFucykKKyAgICAgICAgc2VsZi5fZmFzdF9lbmNvZGUgPSBzZWxmLl9wcm90b2NvbC5fZmFzdF9lbmNvZGUKKyAgICAgICAgc2VsZi5fZmFzdF9kZWNvZGUgPSBzZWxmLl9wcm90b2NvbC5fZmFzdF9kZWNvZGUKKworICAgIGRlZiByZWFkTWVzc2FnZUJlZ2luKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLnRyYW5zLnJlYWRGcmFtZSgwKQorICAgICAgICAgICAgc2VsZi5fc2V0X3Byb3RvY29sKCkKKyAgICAgICAgZXhjZXB0IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBhcyBleGM6CisgICAgICAgICAgICBzZWxmLl9wcm90b2NvbC53cml0ZU1lc3NhZ2VCZWdpbihiIiIsIFRNZXNzYWdlVHlwZS5FWENFUFRJT04sIDApCisgICAgICAgICAgICBleGMud3JpdGUoc2VsZi5fcHJvdG9jb2wpCisgICAgICAgICAgICBzZWxmLl9wcm90b2NvbC53cml0ZU1lc3NhZ2VFbmQoKQorICAgICAgICAgICAgc2VsZi50cmFucy5mbHVzaCgpCisKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLnJlYWRNZXNzYWdlQmVnaW4oKQorCisgICAgZGVmIHJlYWRNZXNzYWdlRW5kKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wucmVhZE1lc3NhZ2VFbmQoKQorCisgICAgZGVmIHJlYWRTdHJ1Y3RCZWdpbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLnJlYWRTdHJ1Y3RCZWdpbigpCisKKyAgICBkZWYgcmVhZFN0cnVjdEVuZChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLnJlYWRTdHJ1Y3RFbmQoKQorCisgICAgZGVmIHJlYWRGaWVsZEJlZ2luKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wucmVhZEZpZWxkQmVnaW4oKQorCisgICAgZGVmIHJlYWRGaWVsZEVuZChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLnJlYWRGaWVsZEVuZCgpCisKKyAgICBkZWYgcmVhZE1hcEJlZ2luKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wucmVhZE1hcEJlZ2luKCkKKworICAgIGRlZiByZWFkTWFwRW5kKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wucmVhZE1hcEVuZCgpCisKKyAgICBkZWYgcmVhZExpc3RCZWdpbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLnJlYWRMaXN0QmVnaW4oKQorCisgICAgZGVmIHJlYWRMaXN0RW5kKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wucmVhZExpc3RFbmQoKQorCisgICAgZGVmIHJlYWRTZXRCZWdpbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLnJlYWRTZXRCZWdpbigpCisKKyAgICBkZWYgcmVhZFNldEVuZChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLnJlYWRTZXRFbmQoKQorCisgICAgZGVmIHJlYWRCb29sKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wucmVhZEJvb2woKQorCisgICAgZGVmIHJlYWRCeXRlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wucmVhZEJ5dGUoKQorCisgICAgZGVmIHJlYWRJMTYoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC5yZWFkSTE2KCkKKworICAgIGRlZiByZWFkSTMyKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wucmVhZEkzMigpCisKKyAgICBkZWYgcmVhZEk2NChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLnJlYWRJNjQoKQorCisgICAgZGVmIHJlYWREb3VibGUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC5yZWFkRG91YmxlKCkKKworICAgIGRlZiByZWFkQmluYXJ5KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wucmVhZEJpbmFyeSgpCisKKworY2xhc3MgVEhlYWRlclByb3RvY29sRmFjdG9yeShvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhbGxvd2VkX2NsaWVudF90eXBlcz0oVEhlYWRlckNsaWVudFR5cGUuSEVBREVSUywpKToKKyAgICAgICAgc2VsZi5hbGxvd2VkX2NsaWVudF90eXBlcyA9IGFsbG93ZWRfY2xpZW50X3R5cGVzCisKKyAgICBkZWYgZ2V0UHJvdG9jb2woc2VsZiwgdHJhbnMpOgorICAgICAgICByZXR1cm4gVEhlYWRlclByb3RvY29sKHRyYW5zLCBzZWxmLmFsbG93ZWRfY2xpZW50X3R5cGVzKQpkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9wcm90b2NvbC9USlNPTlByb3RvY29sLnB5IGIvbGliL3B5L3NyYy9wcm90b2NvbC9USlNPTlByb3RvY29sLnB5CmluZGV4IDljMTg3N2IuLmRiMjA5OWEgMTAwNjQ0Ci0tLSBhL2xpYi9weS9zcmMvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5weQorKysgYi9saWIvcHkvc3JjL3Byb3RvY29sL1RKU09OUHJvdG9jb2wucHkKQEAgLTE3LDExICsxNywxNCBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotZnJvbSBUUHJvdG9jb2wgaW1wb3J0IFRUeXBlLCBUUHJvdG9jb2xCYXNlLCBUUHJvdG9jb2xFeGNlcHRpb24sIFwKLSAgICBjaGVja0ludGVnZXJMaW1pdHMKK2Zyb20gLlRQcm90b2NvbCBpbXBvcnQgKFRUeXBlLCBUUHJvdG9jb2xCYXNlLCBUUHJvdG9jb2xFeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBjaGVja0ludGVnZXJMaW1pdHMpCiBpbXBvcnQgYmFzZTY0Ci1pbXBvcnQganNvbgogaW1wb3J0IG1hdGgKK2ltcG9ydCBzeXMKKworZnJvbSAuLmNvbXBhdCBpbXBvcnQgc3RyX3RvX2JpbmFyeQorCiAKIF9fYWxsX18gPSBbJ1RKU09OUHJvdG9jb2wnLAogICAgICAgICAgICAnVEpTT05Qcm90b2NvbEZhY3RvcnknLApAQCAtMzAsNTAzICszMyw2MDggQEAKIAogVkVSU0lPTiA9IDEKIAotQ09NTUEgPSAnLCcKLUNPTE9OID0gJzonCi1MQlJBQ0UgPSAneycKLVJCUkFDRSA9ICd9JwotTEJSQUNLRVQgPSAnWycKLVJCUkFDS0VUID0gJ10nCi1RVU9URSA9ICciJwotQkFDS1NMQVNIID0gJ1xcJwotWkVSTyA9ICcwJworQ09NTUEgPSBiJywnCitDT0xPTiA9IGInOicKK0xCUkFDRSA9IGIneycKK1JCUkFDRSA9IGInfScKK0xCUkFDS0VUID0gYidbJworUkJSQUNLRVQgPSBiJ10nCitRVU9URSA9IGInIicKK0JBQ0tTTEFTSCA9IGInXFwnCitaRVJPID0gYicwJwogCi1FU0NTRVEgPSAnXFx1MDAnCi1FU0NBUEVfQ0hBUiA9ICciXFxiZm5ydCcKLUVTQ0FQRV9DSEFSX1ZBTFMgPSBbJyInLCAnXFwnLCAnXGInLCAnXGYnLCAnXG4nLCAnXHInLCAnXHQnXQotTlVNRVJJQ19DSEFSID0gJystLjAxMjM0NTY3ODlFZScKK0VTQ1NFUTAgPSBvcmQoJ1xcJykKK0VTQ1NFUTEgPSBvcmQoJ3UnKQorRVNDQVBFX0NIQVJfVkFMUyA9IHsKKyAgICAnIic6ICdcXCInLAorICAgICdcXCc6ICdcXFxcJywKKyAgICAnXGInOiAnXFxiJywKKyAgICAnXGYnOiAnXFxmJywKKyAgICAnXG4nOiAnXFxuJywKKyAgICAnXHInOiAnXFxyJywKKyAgICAnXHQnOiAnXFx0JywKKyAgICAjICcvJzogJ1xcLycsCit9CitFU0NBUEVfQ0hBUlMgPSB7CisgICAgYiciJzogJyInLAorICAgIGInXFwnOiAnXFwnLAorICAgIGInYic6ICdcYicsCisgICAgYidmJzogJ1xmJywKKyAgICBiJ24nOiAnXG4nLAorICAgIGIncic6ICdccicsCisgICAgYid0JzogJ1x0JywKKyAgICBiJy8nOiAnLycsCit9CitOVU1FUklDX0NIQVIgPSBiJystLjAxMjM0NTY3ODlFZScKIAotQ1RZUEVTID0ge1RUeXBlLkJPT0w6ICAgICAgICd0ZicsCi0gICAgICAgICAgVFR5cGUuQllURTogICAgICAgJ2k4JywKLSAgICAgICAgICBUVHlwZS5JMTY6ICAgICAgICAnaTE2JywKLSAgICAgICAgICBUVHlwZS5JMzI6ICAgICAgICAnaTMyJywKLSAgICAgICAgICBUVHlwZS5JNjQ6ICAgICAgICAnaTY0JywKLSAgICAgICAgICBUVHlwZS5ET1VCTEU6ICAgICAnZGJsJywKLSAgICAgICAgICBUVHlwZS5TVFJJTkc6ICAgICAnc3RyJywKLSAgICAgICAgICBUVHlwZS5TVFJVQ1Q6ICAgICAncmVjJywKLSAgICAgICAgICBUVHlwZS5MSVNUOiAgICAgICAnbHN0JywKLSAgICAgICAgICBUVHlwZS5TRVQ6ICAgICAgICAnc2V0JywKLSAgICAgICAgICBUVHlwZS5NQVA6ICAgICAgICAnbWFwJ30KK0NUWVBFUyA9IHsKKyAgICBUVHlwZS5CT09MOiAndGYnLAorICAgIFRUeXBlLkJZVEU6ICdpOCcsCisgICAgVFR5cGUuSTE2OiAnaTE2JywKKyAgICBUVHlwZS5JMzI6ICdpMzInLAorICAgIFRUeXBlLkk2NDogJ2k2NCcsCisgICAgVFR5cGUuRE9VQkxFOiAnZGJsJywKKyAgICBUVHlwZS5TVFJJTkc6ICdzdHInLAorICAgIFRUeXBlLlNUUlVDVDogJ3JlYycsCisgICAgVFR5cGUuTElTVDogJ2xzdCcsCisgICAgVFR5cGUuU0VUOiAnc2V0JywKKyAgICBUVHlwZS5NQVA6ICdtYXAnLAorfQogCiBKVFlQRVMgPSB7fQogZm9yIGtleSBpbiBDVFlQRVMua2V5cygpOgotICBKVFlQRVNbQ1RZUEVTW2tleV1dID0ga2V5CisgICAgSlRZUEVTW0NUWVBFU1trZXldXSA9IGtleQogCiAKIGNsYXNzIEpTT05CYXNlQ29udGV4dChvYmplY3QpOgogCi0gIGRlZiBfX2luaXRfXyhzZWxmLCBwcm90b2NvbCk6Ci0gICAgc2VsZi5wcm90b2NvbCA9IHByb3RvY29sCi0gICAgc2VsZi5maXJzdCA9IFRydWUKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcHJvdG9jb2wpOgorICAgICAgICBzZWxmLnByb3RvY29sID0gcHJvdG9jb2wKKyAgICAgICAgc2VsZi5maXJzdCA9IFRydWUKIAotICBkZWYgZG9JTyhzZWxmLCBmdW5jdGlvbik6Ci0gICAgcGFzcwotICAKLSAgZGVmIHdyaXRlKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgZG9JTyhzZWxmLCBmdW5jdGlvbik6CisgICAgICAgIHBhc3MKIAotICBkZWYgcmVhZChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHdyaXRlKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIGVzY2FwZU51bShzZWxmKToKLSAgICByZXR1cm4gRmFsc2UKKyAgICBkZWYgcmVhZChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiBfX3N0cl9fKHNlbGYpOgotICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXworICAgIGRlZiBlc2NhcGVOdW0oc2VsZik6CisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXwogCiAKIGNsYXNzIEpTT05MaXN0Q29udGV4dChKU09OQmFzZUNvbnRleHQpOgotICAgIAotICBkZWYgZG9JTyhzZWxmLCBmdW5jdGlvbik6Ci0gICAgaWYgc2VsZi5maXJzdCBpcyBUcnVlOgotICAgICAgc2VsZi5maXJzdCA9IEZhbHNlCi0gICAgZWxzZToKLSAgICAgIGZ1bmN0aW9uKENPTU1BKQogCi0gIGRlZiB3cml0ZShzZWxmKToKLSAgICBzZWxmLmRvSU8oc2VsZi5wcm90b2NvbC50cmFucy53cml0ZSkKKyAgICBkZWYgZG9JTyhzZWxmLCBmdW5jdGlvbik6CisgICAgICAgIGlmIHNlbGYuZmlyc3QgaXMgVHJ1ZToKKyAgICAgICAgICAgIHNlbGYuZmlyc3QgPSBGYWxzZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZnVuY3Rpb24oQ09NTUEpCiAKLSAgZGVmIHJlYWQoc2VsZik6Ci0gICAgc2VsZi5kb0lPKHNlbGYucHJvdG9jb2wucmVhZEpTT05TeW50YXhDaGFyKQorICAgIGRlZiB3cml0ZShzZWxmKToKKyAgICAgICAgc2VsZi5kb0lPKHNlbGYucHJvdG9jb2wudHJhbnMud3JpdGUpCisKKyAgICBkZWYgcmVhZChzZWxmKToKKyAgICAgICAgc2VsZi5kb0lPKHNlbGYucHJvdG9jb2wucmVhZEpTT05TeW50YXhDaGFyKQogCiAKIGNsYXNzIEpTT05QYWlyQ29udGV4dChKU09OQmFzZUNvbnRleHQpOgotICAKLSAgZGVmIF9faW5pdF9fKHNlbGYsIHByb3RvY29sKToKLSAgICBzdXBlcihKU09OUGFpckNvbnRleHQsIHNlbGYpLl9faW5pdF9fKHByb3RvY29sKQotICAgIHNlbGYuY29sb24gPSBUcnVlCiAKLSAgZGVmIGRvSU8oc2VsZiwgZnVuY3Rpb24pOgotICAgIGlmIHNlbGYuZmlyc3Q6Ci0gICAgICBzZWxmLmZpcnN0ID0gRmFsc2UKLSAgICAgIHNlbGYuY29sb24gPSBUcnVlCi0gICAgZWxzZToKLSAgICAgIGZ1bmN0aW9uKENPTE9OIGlmIHNlbGYuY29sb24gZWxzZSBDT01NQSkKLSAgICAgIHNlbGYuY29sb24gPSBub3Qgc2VsZi5jb2xvbgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwcm90b2NvbCk6CisgICAgICAgIHN1cGVyKEpTT05QYWlyQ29udGV4dCwgc2VsZikuX19pbml0X18ocHJvdG9jb2wpCisgICAgICAgIHNlbGYuY29sb24gPSBUcnVlCiAKLSAgZGVmIHdyaXRlKHNlbGYpOgotICAgIHNlbGYuZG9JTyhzZWxmLnByb3RvY29sLnRyYW5zLndyaXRlKQorICAgIGRlZiBkb0lPKHNlbGYsIGZ1bmN0aW9uKToKKyAgICAgICAgaWYgc2VsZi5maXJzdDoKKyAgICAgICAgICAgIHNlbGYuZmlyc3QgPSBGYWxzZQorICAgICAgICAgICAgc2VsZi5jb2xvbiA9IFRydWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZ1bmN0aW9uKENPTE9OIGlmIHNlbGYuY29sb24gZWxzZSBDT01NQSkKKyAgICAgICAgICAgIHNlbGYuY29sb24gPSBub3Qgc2VsZi5jb2xvbgogCi0gIGRlZiByZWFkKHNlbGYpOgotICAgIHNlbGYuZG9JTyhzZWxmLnByb3RvY29sLnJlYWRKU09OU3ludGF4Q2hhcikKKyAgICBkZWYgd3JpdGUoc2VsZik6CisgICAgICAgIHNlbGYuZG9JTyhzZWxmLnByb3RvY29sLnRyYW5zLndyaXRlKQogCi0gIGRlZiBlc2NhcGVOdW0oc2VsZik6Ci0gICAgcmV0dXJuIHNlbGYuY29sb24KKyAgICBkZWYgcmVhZChzZWxmKToKKyAgICAgICAgc2VsZi5kb0lPKHNlbGYucHJvdG9jb2wucmVhZEpTT05TeW50YXhDaGFyKQogCi0gIGRlZiBfX3N0cl9fKHNlbGYpOgotICAgIHJldHVybiAnJXMsIGNvbG9uPSVzJyAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgc2VsZi5jb2xvbikKKyAgICBkZWYgZXNjYXBlTnVtKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5jb2xvbgorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldHVybiAnJXMsIGNvbG9uPSVzJyAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgc2VsZi5jb2xvbikKIAogCiBjbGFzcyBMb29rYWhlYWRSZWFkZXIoKToKLSAgaGFzRGF0YSA9IEZhbHNlCi0gIGRhdGEgPSAnJworICAgIGhhc0RhdGEgPSBGYWxzZQorICAgIGRhdGEgPSAnJwogCi0gIGRlZiBfX2luaXRfXyhzZWxmLCBwcm90b2NvbCk6Ci0gICAgc2VsZi5wcm90b2NvbCA9IHByb3RvY29sCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHByb3RvY29sKToKKyAgICAgICAgc2VsZi5wcm90b2NvbCA9IHByb3RvY29sCiAKLSAgZGVmIHJlYWQoc2VsZik6Ci0gICAgaWYgc2VsZi5oYXNEYXRhIGlzIFRydWU6Ci0gICAgICBzZWxmLmhhc0RhdGEgPSBGYWxzZQotICAgIGVsc2U6Ci0gICAgICBzZWxmLmRhdGEgPSBzZWxmLnByb3RvY29sLnRyYW5zLnJlYWQoMSkKLSAgICByZXR1cm4gc2VsZi5kYXRhCisgICAgZGVmIHJlYWQoc2VsZik6CisgICAgICAgIGlmIHNlbGYuaGFzRGF0YSBpcyBUcnVlOgorICAgICAgICAgICAgc2VsZi5oYXNEYXRhID0gRmFsc2UKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZGF0YSA9IHNlbGYucHJvdG9jb2wudHJhbnMucmVhZCgxKQorICAgICAgICByZXR1cm4gc2VsZi5kYXRhCiAKLSAgZGVmIHBlZWsoc2VsZik6Ci0gICAgaWYgc2VsZi5oYXNEYXRhIGlzIEZhbHNlOgotICAgICAgc2VsZi5kYXRhID0gc2VsZi5wcm90b2NvbC50cmFucy5yZWFkKDEpCi0gICAgc2VsZi5oYXNEYXRhID0gVHJ1ZQotICAgIHJldHVybiBzZWxmLmRhdGEKKyAgICBkZWYgcGVlayhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5oYXNEYXRhIGlzIEZhbHNlOgorICAgICAgICAgICAgc2VsZi5kYXRhID0gc2VsZi5wcm90b2NvbC50cmFucy5yZWFkKDEpCisgICAgICAgIHNlbGYuaGFzRGF0YSA9IFRydWUKKyAgICAgICAgcmV0dXJuIHNlbGYuZGF0YQorCiAKIGNsYXNzIFRKU09OUHJvdG9jb2xCYXNlKFRQcm90b2NvbEJhc2UpOgogCi0gIGRlZiBfX2luaXRfXyhzZWxmLCB0cmFucyk6Ci0gICAgVFByb3RvY29sQmFzZS5fX2luaXRfXyhzZWxmLCB0cmFucykKLSAgICBzZWxmLnJlc2V0V3JpdGVDb250ZXh0KCkKLSAgICBzZWxmLnJlc2V0UmVhZENvbnRleHQoKQorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0cmFucyk6CisgICAgICAgIFRQcm90b2NvbEJhc2UuX19pbml0X18oc2VsZiwgdHJhbnMpCisgICAgICAgIHNlbGYucmVzZXRXcml0ZUNvbnRleHQoKQorICAgICAgICBzZWxmLnJlc2V0UmVhZENvbnRleHQoKQogCi0gIGRlZiByZXNldFdyaXRlQ29udGV4dChzZWxmKToKLSAgICBzZWxmLmNvbnRleHQgPSBKU09OQmFzZUNvbnRleHQoc2VsZikKLSAgICBzZWxmLmNvbnRleHRTdGFjayA9IFtzZWxmLmNvbnRleHRdCisgICAgIyBXZSBkb24ndCBoYXZlIGxlbmd0aCBsaW1pdCBpbXBsZW1lbnRhdGlvbiBmb3IgSlNPTiBwcm90b2NvbHMKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgc3RyaW5nX2xlbmd0aF9saW1pdChzZW5mKToKKyAgICAgICAgcmV0dXJuIE5vbmUKIAotICBkZWYgcmVzZXRSZWFkQ29udGV4dChzZWxmKToKLSAgICBzZWxmLnJlc2V0V3JpdGVDb250ZXh0KCkKLSAgICBzZWxmLnJlYWRlciA9IExvb2thaGVhZFJlYWRlcihzZWxmKQorICAgIEBwcm9wZXJ0eQorICAgIGRlZiBjb250YWluZXJfbGVuZ3RoX2xpbWl0KHNlbmYpOgorICAgICAgICByZXR1cm4gTm9uZQogCi0gIGRlZiBwdXNoQ29udGV4dChzZWxmLCBjdHgpOgotICAgIHNlbGYuY29udGV4dFN0YWNrLmFwcGVuZChjdHgpCi0gICAgc2VsZi5jb250ZXh0ID0gY3R4CisgICAgZGVmIHJlc2V0V3JpdGVDb250ZXh0KHNlbGYpOgorICAgICAgICBzZWxmLmNvbnRleHQgPSBKU09OQmFzZUNvbnRleHQoc2VsZikKKyAgICAgICAgc2VsZi5jb250ZXh0U3RhY2sgPSBbc2VsZi5jb250ZXh0XQogCi0gIGRlZiBwb3BDb250ZXh0KHNlbGYpOgotICAgIHNlbGYuY29udGV4dFN0YWNrLnBvcCgpCi0gICAgaWYgc2VsZi5jb250ZXh0U3RhY2s6Ci0gICAgICBzZWxmLmNvbnRleHQgPSBzZWxmLmNvbnRleHRTdGFja1stMV0KLSAgICBlbHNlOgotICAgICAgc2VsZi5jb250ZXh0ID0gSlNPTkJhc2VDb250ZXh0KHNlbGYpCisgICAgZGVmIHJlc2V0UmVhZENvbnRleHQoc2VsZik6CisgICAgICAgIHNlbGYucmVzZXRXcml0ZUNvbnRleHQoKQorICAgICAgICBzZWxmLnJlYWRlciA9IExvb2thaGVhZFJlYWRlcihzZWxmKQogCi0gIGRlZiB3cml0ZUpTT05TdHJpbmcoc2VsZiwgc3RyaW5nKToKLSAgICBzZWxmLmNvbnRleHQud3JpdGUoKQotICAgIHNlbGYudHJhbnMud3JpdGUoanNvbi5kdW1wcyhzdHJpbmcpKQorICAgIGRlZiBwdXNoQ29udGV4dChzZWxmLCBjdHgpOgorICAgICAgICBzZWxmLmNvbnRleHRTdGFjay5hcHBlbmQoY3R4KQorICAgICAgICBzZWxmLmNvbnRleHQgPSBjdHgKIAotICBkZWYgd3JpdGVKU09OTnVtYmVyKHNlbGYsIG51bWJlcik6Ci0gICAgc2VsZi5jb250ZXh0LndyaXRlKCkKLSAgICBqc051bWJlciA9IHN0cihudW1iZXIpCi0gICAgaWYgc2VsZi5jb250ZXh0LmVzY2FwZU51bSgpOgotICAgICAganNOdW1iZXIgPSAiJXMlcyVzIiAlIChRVU9URSwganNOdW1iZXIsICBRVU9URSkKLSAgICBzZWxmLnRyYW5zLndyaXRlKGpzTnVtYmVyKQotCi0gIGRlZiB3cml0ZUpTT05CYXNlNjQoc2VsZiwgYmluYXJ5KToKLSAgICBzZWxmLmNvbnRleHQud3JpdGUoKQotICAgIHNlbGYudHJhbnMud3JpdGUoUVVPVEUpCi0gICAgc2VsZi50cmFucy53cml0ZShiYXNlNjQuYjY0ZW5jb2RlKGJpbmFyeSkpCi0gICAgc2VsZi50cmFucy53cml0ZShRVU9URSkKLQotICBkZWYgd3JpdGVKU09OT2JqZWN0U3RhcnQoc2VsZik6Ci0gICAgc2VsZi5jb250ZXh0LndyaXRlKCkKLSAgICBzZWxmLnRyYW5zLndyaXRlKExCUkFDRSkKLSAgICBzZWxmLnB1c2hDb250ZXh0KEpTT05QYWlyQ29udGV4dChzZWxmKSkKLQotICBkZWYgd3JpdGVKU09OT2JqZWN0RW5kKHNlbGYpOgotICAgIHNlbGYucG9wQ29udGV4dCgpCi0gICAgc2VsZi50cmFucy53cml0ZShSQlJBQ0UpCi0KLSAgZGVmIHdyaXRlSlNPTkFycmF5U3RhcnQoc2VsZik6Ci0gICAgc2VsZi5jb250ZXh0LndyaXRlKCkKLSAgICBzZWxmLnRyYW5zLndyaXRlKExCUkFDS0VUKQotICAgIHNlbGYucHVzaENvbnRleHQoSlNPTkxpc3RDb250ZXh0KHNlbGYpKQotCi0gIGRlZiB3cml0ZUpTT05BcnJheUVuZChzZWxmKToKLSAgICBzZWxmLnBvcENvbnRleHQoKQotICAgIHNlbGYudHJhbnMud3JpdGUoUkJSQUNLRVQpCi0KLSAgZGVmIHJlYWRKU09OU3ludGF4Q2hhcihzZWxmLCBjaGFyYWN0ZXIpOgotICAgIGN1cnJlbnQgPSBzZWxmLnJlYWRlci5yZWFkKCkKLSAgICBpZiBjaGFyYWN0ZXIgIT0gY3VycmVudDoKLSAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmV4cGVjdGVkIGNoYXJhY3RlcjogJXMiICUgY3VycmVudCkKLQotICBkZWYgcmVhZEpTT05TdHJpbmcoc2VsZiwgc2tpcENvbnRleHQpOgotICAgIHN0cmluZyA9IFtdCi0gICAgaWYgc2tpcENvbnRleHQgaXMgRmFsc2U6Ci0gICAgICBzZWxmLmNvbnRleHQucmVhZCgpCi0gICAgc2VsZi5yZWFkSlNPTlN5bnRheENoYXIoUVVPVEUpCi0gICAgd2hpbGUgVHJ1ZToKLSAgICAgIGNoYXJhY3RlciA9IHNlbGYucmVhZGVyLnJlYWQoKQotICAgICAgaWYgY2hhcmFjdGVyID09IFFVT1RFOgotICAgICAgICBicmVhawotICAgICAgaWYgY2hhcmFjdGVyID09IEVTQ1NFUVswXToKLSAgICAgICAgY2hhcmFjdGVyID0gc2VsZi5yZWFkZXIucmVhZCgpCi0gICAgICAgIGlmIGNoYXJhY3RlciA9PSBFU0NTRVFbMV06Ci0gICAgICAgICAgc2VsZi5yZWFkSlNPTlN5bnRheENoYXIoWkVSTykKLSAgICAgICAgICBzZWxmLnJlYWRKU09OU3ludGF4Q2hhcihaRVJPKQotICAgICAgICAgIGNoYXJhY3RlciA9IGpzb24uSlNPTkRlY29kZXIoKS5kZWNvZGUoJyJcdTAwJXMiJyAlIHNlbGYudHJhbnMucmVhZCgyKSkKKyAgICBkZWYgcG9wQ29udGV4dChzZWxmKToKKyAgICAgICAgc2VsZi5jb250ZXh0U3RhY2sucG9wKCkKKyAgICAgICAgaWYgc2VsZi5jb250ZXh0U3RhY2s6CisgICAgICAgICAgICBzZWxmLmNvbnRleHQgPSBzZWxmLmNvbnRleHRTdGFja1stMV0KICAgICAgICAgZWxzZToKLSAgICAgICAgICBvZmYgPSBFU0NBUEVfQ0hBUi5maW5kKGNoYXJhY3RlcikKLSAgICAgICAgICBpZiBvZmYgPT0gLTE6CisgICAgICAgICAgICBzZWxmLmNvbnRleHQgPSBKU09OQmFzZUNvbnRleHQoc2VsZikKKworICAgIGRlZiB3cml0ZUpTT05TdHJpbmcoc2VsZiwgc3RyaW5nKToKKyAgICAgICAgc2VsZi5jb250ZXh0LndyaXRlKCkKKyAgICAgICAganNvbl9zdHIgPSBbJyInXQorICAgICAgICBmb3IgcyBpbiBzdHJpbmc6CisgICAgICAgICAgICBlc2NhcGVkID0gRVNDQVBFX0NIQVJfVkFMUy5nZXQocywgcykKKyAgICAgICAgICAgIGpzb25fc3RyLmFwcGVuZChlc2NhcGVkKQorICAgICAgICBqc29uX3N0ci5hcHBlbmQoJyInKQorICAgICAgICBzZWxmLnRyYW5zLndyaXRlKHN0cl90b19iaW5hcnkoJycuam9pbihqc29uX3N0cikpKQorCisgICAgZGVmIHdyaXRlSlNPTk51bWJlcihzZWxmLCBudW1iZXIsIGZvcm1hdHRlcj0nezB9Jyk6CisgICAgICAgIHNlbGYuY29udGV4dC53cml0ZSgpCisgICAgICAgIGpzTnVtYmVyID0gc3RyKGZvcm1hdHRlci5mb3JtYXQobnVtYmVyKSkuZW5jb2RlKCdhc2NpaScpCisgICAgICAgIGlmIHNlbGYuY29udGV4dC5lc2NhcGVOdW0oKToKKyAgICAgICAgICAgIHNlbGYudHJhbnMud3JpdGUoUVVPVEUpCisgICAgICAgICAgICBzZWxmLnRyYW5zLndyaXRlKGpzTnVtYmVyKQorICAgICAgICAgICAgc2VsZi50cmFucy53cml0ZShRVU9URSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYudHJhbnMud3JpdGUoanNOdW1iZXIpCisKKyAgICBkZWYgd3JpdGVKU09OQmFzZTY0KHNlbGYsIGJpbmFyeSk6CisgICAgICAgIHNlbGYuY29udGV4dC53cml0ZSgpCisgICAgICAgIHNlbGYudHJhbnMud3JpdGUoUVVPVEUpCisgICAgICAgIHNlbGYudHJhbnMud3JpdGUoYmFzZTY0LmI2NGVuY29kZShiaW5hcnkpKQorICAgICAgICBzZWxmLnRyYW5zLndyaXRlKFFVT1RFKQorCisgICAgZGVmIHdyaXRlSlNPTk9iamVjdFN0YXJ0KHNlbGYpOgorICAgICAgICBzZWxmLmNvbnRleHQud3JpdGUoKQorICAgICAgICBzZWxmLnRyYW5zLndyaXRlKExCUkFDRSkKKyAgICAgICAgc2VsZi5wdXNoQ29udGV4dChKU09OUGFpckNvbnRleHQoc2VsZikpCisKKyAgICBkZWYgd3JpdGVKU09OT2JqZWN0RW5kKHNlbGYpOgorICAgICAgICBzZWxmLnBvcENvbnRleHQoKQorICAgICAgICBzZWxmLnRyYW5zLndyaXRlKFJCUkFDRSkKKworICAgIGRlZiB3cml0ZUpTT05BcnJheVN0YXJ0KHNlbGYpOgorICAgICAgICBzZWxmLmNvbnRleHQud3JpdGUoKQorICAgICAgICBzZWxmLnRyYW5zLndyaXRlKExCUkFDS0VUKQorICAgICAgICBzZWxmLnB1c2hDb250ZXh0KEpTT05MaXN0Q29udGV4dChzZWxmKSkKKworICAgIGRlZiB3cml0ZUpTT05BcnJheUVuZChzZWxmKToKKyAgICAgICAgc2VsZi5wb3BDb250ZXh0KCkKKyAgICAgICAgc2VsZi50cmFucy53cml0ZShSQlJBQ0tFVCkKKworICAgIGRlZiByZWFkSlNPTlN5bnRheENoYXIoc2VsZiwgY2hhcmFjdGVyKToKKyAgICAgICAgY3VycmVudCA9IHNlbGYucmVhZGVyLnJlYWQoKQorICAgICAgICBpZiBjaGFyYWN0ZXIgIT0gY3VycmVudDoKICAgICAgICAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBjb250cm9sIGNoYXIiKQotICAgICAgICAgIGNoYXJhY3RlciA9IEVTQ0FQRV9DSEFSX1ZBTFNbb2ZmXQotICAgICAgc3RyaW5nLmFwcGVuZChjaGFyYWN0ZXIpCi0gICAgcmV0dXJuICcnLmpvaW4oc3RyaW5nKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmV4cGVjdGVkIGNoYXJhY3RlcjogJXMiICUgY3VycmVudCkKIAotICBkZWYgaXNKU09OTnVtZXJpYyhzZWxmLCBjaGFyYWN0ZXIpOgotICAgIHJldHVybiAoVHJ1ZSBpZiBOVU1FUklDX0NIQVIuZmluZChjaGFyYWN0ZXIpICE9IC0gMSBlbHNlIEZhbHNlKQorICAgIGRlZiBfaXNIaWdoU3Vycm9nYXRlKHNlbGYsIGNvZGV1bml0KToKKyAgICAgICAgcmV0dXJuIGNvZGV1bml0ID49IDB4ZDgwMCBhbmQgY29kZXVuaXQgPD0gMHhkYmZmCiAKLSAgZGVmIHJlYWRKU09OUXVvdGVzKHNlbGYpOgotICAgIGlmIChzZWxmLmNvbnRleHQuZXNjYXBlTnVtKCkpOgotICAgICAgc2VsZi5yZWFkSlNPTlN5bnRheENoYXIoUVVPVEUpCisgICAgZGVmIF9pc0xvd1N1cnJvZ2F0ZShzZWxmLCBjb2RldW5pdCk6CisgICAgICAgIHJldHVybiBjb2RldW5pdCA+PSAweGRjMDAgYW5kIGNvZGV1bml0IDw9IDB4ZGZmZgogCi0gIGRlZiByZWFkSlNPTk51bWVyaWNDaGFycyhzZWxmKToKLSAgICBudW1lcmljID0gW10KLSAgICB3aGlsZSBUcnVlOgotICAgICAgY2hhcmFjdGVyID0gc2VsZi5yZWFkZXIucGVlaygpCi0gICAgICBpZiBzZWxmLmlzSlNPTk51bWVyaWMoY2hhcmFjdGVyKSBpcyBGYWxzZToKLSAgICAgICAgYnJlYWsKLSAgICAgIG51bWVyaWMuYXBwZW5kKHNlbGYucmVhZGVyLnJlYWQoKSkKLSAgICByZXR1cm4gJycuam9pbihudW1lcmljKQorICAgIGRlZiBfdG9DaGFyKHNlbGYsIGhpZ2gsIGxvdz1Ob25lKToKKyAgICAgICAgaWYgbm90IGxvdzoKKyAgICAgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMjoKKyAgICAgICAgICAgICAgICByZXR1cm4gKCJcXHUlMDR4IiAlIGhpZ2gpLmRlY29kZSgndW5pY29kZS1lc2NhcGUnKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5lbmNvZGUoJ3V0Zi04JykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIGNocihoaWdoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY29kZXBvaW50ID0gKDEgPDwgMTYpICsgKChoaWdoICYgMHgzZmYpIDw8IDEwKQorICAgICAgICAgICAgY29kZXBvaW50ICs9IGxvdyAmIDB4M2ZmCisgICAgICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzBdID09IDI6CisgICAgICAgICAgICAgICAgcyA9ICJcXFUlMDh4IiAlIGNvZGVwb2ludAorICAgICAgICAgICAgICAgIHJldHVybiBzLmRlY29kZSgndW5pY29kZS1lc2NhcGUnKS5lbmNvZGUoJ3V0Zi04JykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIGNocihjb2RlcG9pbnQpCiAKLSAgZGVmIHJlYWRKU09OSW50ZWdlcihzZWxmKToKLSAgICBzZWxmLmNvbnRleHQucmVhZCgpCi0gICAgc2VsZi5yZWFkSlNPTlF1b3RlcygpCi0gICAgbnVtZXJpYyA9IHNlbGYucmVhZEpTT05OdW1lcmljQ2hhcnMoKQotICAgIHNlbGYucmVhZEpTT05RdW90ZXMoKQotICAgIHRyeToKLSAgICAgIHJldHVybiBpbnQobnVtZXJpYykKLSAgICBleGNlcHQgVmFsdWVFcnJvcjoKLSAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCYWQgZGF0YSBlbmNvdW50ZWQgaW4gbnVtZXJpYyBkYXRhIikKLQotICBkZWYgcmVhZEpTT05Eb3VibGUoc2VsZik6Ci0gICAgc2VsZi5jb250ZXh0LnJlYWQoKQotICAgIGlmIHNlbGYucmVhZGVyLnBlZWsoKSA9PSBRVU9URToKLSAgICAgIHN0cmluZyAgPSBzZWxmLnJlYWRKU09OU3RyaW5nKFRydWUpCi0gICAgICB0cnk6Ci0gICAgICAgIGRvdWJsZSA9IGZsb2F0KHN0cmluZykKLSAgICAgICAgaWYgKHNlbGYuY29udGV4dC5lc2NhcGVOdW0gaXMgRmFsc2UgYW5kCi0gICAgICAgICAgICBub3QgbWF0aC5pc2luZihkb3VibGUpIGFuZAotICAgICAgICAgICAgbm90IG1hdGguaXNuYW4oZG91YmxlKSk6Ci0gICAgICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOdW1lcmljIGRhdGEgdW5leHBlY3RlZGx5IHF1b3RlZCIpCi0gICAgICAgIHJldHVybiBkb3VibGUKLSAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgotICAgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCYWQgZGF0YSBlbmNvdW50ZWQgaW4gbnVtZXJpYyBkYXRhIikKLSAgICBlbHNlOgotICAgICAgaWYgc2VsZi5jb250ZXh0LmVzY2FwZU51bSgpIGlzIFRydWU6CisgICAgZGVmIHJlYWRKU09OU3RyaW5nKHNlbGYsIHNraXBDb250ZXh0KToKKyAgICAgICAgaGlnaFN1cnJvZ2F0ZSA9IE5vbmUKKyAgICAgICAgc3RyaW5nID0gW10KKyAgICAgICAgaWYgc2tpcENvbnRleHQgaXMgRmFsc2U6CisgICAgICAgICAgICBzZWxmLmNvbnRleHQucmVhZCgpCiAgICAgICAgIHNlbGYucmVhZEpTT05TeW50YXhDaGFyKFFVT1RFKQotICAgICAgdHJ5OgotICAgICAgICByZXR1cm4gZmxvYXQoc2VsZi5yZWFkSlNPTk51bWVyaWNDaGFycygpKQotICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6Ci0gICAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJhZCBkYXRhIGVuY291bnRlZCBpbiBudW1lcmljIGRhdGEiKQorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgY2hhcmFjdGVyID0gc2VsZi5yZWFkZXIucmVhZCgpCisgICAgICAgICAgICBpZiBjaGFyYWN0ZXIgPT0gUVVPVEU6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGlmIG9yZChjaGFyYWN0ZXIpID09IEVTQ1NFUTA6CisgICAgICAgICAgICAgICAgY2hhcmFjdGVyID0gc2VsZi5yZWFkZXIucmVhZCgpCisgICAgICAgICAgICAgICAgaWYgb3JkKGNoYXJhY3RlcikgPT0gRVNDU0VRMToKKyAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyID0gc2VsZi50cmFucy5yZWFkKDQpLmRlY29kZSgnYXNjaWknKQorICAgICAgICAgICAgICAgICAgICBjb2RldW5pdCA9IGludChjaGFyYWN0ZXIsIDE2KQorICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLl9pc0hpZ2hTdXJyb2dhdGUoY29kZXVuaXQpOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgaGlnaFN1cnJvZ2F0ZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBsb3cgc3Vycm9nYXRlIGNoYXIiKQorICAgICAgICAgICAgICAgICAgICAgICAgaGlnaFN1cnJvZ2F0ZSA9IGNvZGV1bml0CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICBlbGlmIHNlbGYuX2lzTG93U3Vycm9nYXRlKGNvZGV1bml0KToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBoaWdoU3Vycm9nYXRlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGhpZ2ggc3Vycm9nYXRlIGNoYXIiKQorICAgICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyID0gc2VsZi5fdG9DaGFyKGhpZ2hTdXJyb2dhdGUsIGNvZGV1bml0KQorICAgICAgICAgICAgICAgICAgICAgICAgaGlnaFN1cnJvZ2F0ZSA9IE5vbmUKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlciA9IHNlbGYuX3RvQ2hhcihjb2RldW5pdCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBpZiBjaGFyYWN0ZXIgbm90IGluIEVTQ0FQRV9DSEFSUzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBjb250cm9sIGNoYXIiKQorICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgPSBFU0NBUEVfQ0hBUlNbY2hhcmFjdGVyXQorICAgICAgICAgICAgZWxpZiBjaGFyYWN0ZXIgaW4gRVNDQVBFX0NIQVJfVkFMUzoKKyAgICAgICAgICAgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuZXNjYXBlZCBjb250cm9sIGNoYXIiKQorICAgICAgICAgICAgZWxpZiBzeXMudmVyc2lvbl9pbmZvWzBdID4gMjoKKyAgICAgICAgICAgICAgICB1dGY4X2J5dGVzID0gYnl0ZWFycmF5KFtvcmQoY2hhcmFjdGVyKV0pCisgICAgICAgICAgICAgICAgd2hpbGUgb3JkKHNlbGYucmVhZGVyLnBlZWsoKSkgPj0gMHg4MDoKKyAgICAgICAgICAgICAgICAgICAgdXRmOF9ieXRlcy5hcHBlbmQob3JkKHNlbGYucmVhZGVyLnJlYWQoKSkpCisgICAgICAgICAgICAgICAgY2hhcmFjdGVyID0gdXRmOF9ieXRlcy5kZWNvZGUoJ3V0ZjgnKQorICAgICAgICAgICAgc3RyaW5nLmFwcGVuZChjaGFyYWN0ZXIpCiAKLSAgZGVmIHJlYWRKU09OQmFzZTY0KHNlbGYpOgotICAgIHN0cmluZyA9IHNlbGYucmVhZEpTT05TdHJpbmcoRmFsc2UpCi0gICAgcmV0dXJuIGJhc2U2NC5iNjRkZWNvZGUoc3RyaW5nKQorICAgICAgICAgICAgaWYgaGlnaFN1cnJvZ2F0ZToKKyAgICAgICAgICAgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGxvdyBzdXJyb2dhdGUgY2hhciIpCisgICAgICAgIHJldHVybiAnJy5qb2luKHN0cmluZykKIAotICBkZWYgcmVhZEpTT05PYmplY3RTdGFydChzZWxmKToKLSAgICBzZWxmLmNvbnRleHQucmVhZCgpCi0gICAgc2VsZi5yZWFkSlNPTlN5bnRheENoYXIoTEJSQUNFKQotICAgIHNlbGYucHVzaENvbnRleHQoSlNPTlBhaXJDb250ZXh0KHNlbGYpKQorICAgIGRlZiBpc0pTT05OdW1lcmljKHNlbGYsIGNoYXJhY3Rlcik6CisgICAgICAgIHJldHVybiAoVHJ1ZSBpZiBOVU1FUklDX0NIQVIuZmluZChjaGFyYWN0ZXIpICE9IC0gMSBlbHNlIEZhbHNlKQogCi0gIGRlZiByZWFkSlNPTk9iamVjdEVuZChzZWxmKToKLSAgICBzZWxmLnJlYWRKU09OU3ludGF4Q2hhcihSQlJBQ0UpCi0gICAgc2VsZi5wb3BDb250ZXh0KCkKKyAgICBkZWYgcmVhZEpTT05RdW90ZXMoc2VsZik6CisgICAgICAgIGlmIChzZWxmLmNvbnRleHQuZXNjYXBlTnVtKCkpOgorICAgICAgICAgICAgc2VsZi5yZWFkSlNPTlN5bnRheENoYXIoUVVPVEUpCiAKLSAgZGVmIHJlYWRKU09OQXJyYXlTdGFydChzZWxmKToKLSAgICBzZWxmLmNvbnRleHQucmVhZCgpCi0gICAgc2VsZi5yZWFkSlNPTlN5bnRheENoYXIoTEJSQUNLRVQpCi0gICAgc2VsZi5wdXNoQ29udGV4dChKU09OTGlzdENvbnRleHQoc2VsZikpCisgICAgZGVmIHJlYWRKU09OTnVtZXJpY0NoYXJzKHNlbGYpOgorICAgICAgICBudW1lcmljID0gW10KKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIGNoYXJhY3RlciA9IHNlbGYucmVhZGVyLnBlZWsoKQorICAgICAgICAgICAgaWYgc2VsZi5pc0pTT05OdW1lcmljKGNoYXJhY3RlcikgaXMgRmFsc2U6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIG51bWVyaWMuYXBwZW5kKHNlbGYucmVhZGVyLnJlYWQoKSkKKyAgICAgICAgcmV0dXJuIGInJy5qb2luKG51bWVyaWMpLmRlY29kZSgnYXNjaWknKQogCi0gIGRlZiByZWFkSlNPTkFycmF5RW5kKHNlbGYpOgotICAgIHNlbGYucmVhZEpTT05TeW50YXhDaGFyKFJCUkFDS0VUKQotICAgIHNlbGYucG9wQ29udGV4dCgpCisgICAgZGVmIHJlYWRKU09OSW50ZWdlcihzZWxmKToKKyAgICAgICAgc2VsZi5jb250ZXh0LnJlYWQoKQorICAgICAgICBzZWxmLnJlYWRKU09OUXVvdGVzKCkKKyAgICAgICAgbnVtZXJpYyA9IHNlbGYucmVhZEpTT05OdW1lcmljQ2hhcnMoKQorICAgICAgICBzZWxmLnJlYWRKU09OUXVvdGVzKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIGludChudW1lcmljKQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCYWQgZGF0YSBlbmNvdW50ZWQgaW4gbnVtZXJpYyBkYXRhIikKKworICAgIGRlZiByZWFkSlNPTkRvdWJsZShzZWxmKToKKyAgICAgICAgc2VsZi5jb250ZXh0LnJlYWQoKQorICAgICAgICBpZiBzZWxmLnJlYWRlci5wZWVrKCkgPT0gUVVPVEU6CisgICAgICAgICAgICBzdHJpbmcgPSBzZWxmLnJlYWRKU09OU3RyaW5nKFRydWUpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZG91YmxlID0gZmxvYXQoc3RyaW5nKQorICAgICAgICAgICAgICAgIGlmIChzZWxmLmNvbnRleHQuZXNjYXBlTnVtIGlzIEZhbHNlIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgbm90IG1hdGguaXNpbmYoZG91YmxlKSBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBtYXRoLmlzbmFuKGRvdWJsZSkpOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgIk51bWVyaWMgZGF0YSB1bmV4cGVjdGVkbHkgcXVvdGVkIikKKyAgICAgICAgICAgICAgICByZXR1cm4gZG91YmxlCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJhZCBkYXRhIGVuY291bnRlZCBpbiBudW1lcmljIGRhdGEiKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgc2VsZi5jb250ZXh0LmVzY2FwZU51bSgpIGlzIFRydWU6CisgICAgICAgICAgICAgICAgc2VsZi5yZWFkSlNPTlN5bnRheENoYXIoUVVPVEUpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmV0dXJuIGZsb2F0KHNlbGYucmVhZEpTT05OdW1lcmljQ2hhcnMoKSkKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmFkIGRhdGEgZW5jb3VudGVkIGluIG51bWVyaWMgZGF0YSIpCisKKyAgICBkZWYgcmVhZEpTT05CYXNlNjQoc2VsZik6CisgICAgICAgIHN0cmluZyA9IHNlbGYucmVhZEpTT05TdHJpbmcoRmFsc2UpCisgICAgICAgIHNpemUgPSBsZW4oc3RyaW5nKQorICAgICAgICBtID0gc2l6ZSAlIDQKKyAgICAgICAgIyBGb3JjZSBwYWRkaW5nIHNpbmNlIGI2NGVuY29kZSBtZXRob2QgZG9lcyBub3QgYWxsb3cgaXQKKyAgICAgICAgaWYgbSAhPSAwOgorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoNCAtIG0pOgorICAgICAgICAgICAgICAgIHN0cmluZyArPSAnPScKKyAgICAgICAgcmV0dXJuIGJhc2U2NC5iNjRkZWNvZGUoc3RyaW5nKQorCisgICAgZGVmIHJlYWRKU09OT2JqZWN0U3RhcnQoc2VsZik6CisgICAgICAgIHNlbGYuY29udGV4dC5yZWFkKCkKKyAgICAgICAgc2VsZi5yZWFkSlNPTlN5bnRheENoYXIoTEJSQUNFKQorICAgICAgICBzZWxmLnB1c2hDb250ZXh0KEpTT05QYWlyQ29udGV4dChzZWxmKSkKKworICAgIGRlZiByZWFkSlNPTk9iamVjdEVuZChzZWxmKToKKyAgICAgICAgc2VsZi5yZWFkSlNPTlN5bnRheENoYXIoUkJSQUNFKQorICAgICAgICBzZWxmLnBvcENvbnRleHQoKQorCisgICAgZGVmIHJlYWRKU09OQXJyYXlTdGFydChzZWxmKToKKyAgICAgICAgc2VsZi5jb250ZXh0LnJlYWQoKQorICAgICAgICBzZWxmLnJlYWRKU09OU3ludGF4Q2hhcihMQlJBQ0tFVCkKKyAgICAgICAgc2VsZi5wdXNoQ29udGV4dChKU09OTGlzdENvbnRleHQoc2VsZikpCisKKyAgICBkZWYgcmVhZEpTT05BcnJheUVuZChzZWxmKToKKyAgICAgICAgc2VsZi5yZWFkSlNPTlN5bnRheENoYXIoUkJSQUNLRVQpCisgICAgICAgIHNlbGYucG9wQ29udGV4dCgpCiAKIAogY2xhc3MgVEpTT05Qcm90b2NvbChUSlNPTlByb3RvY29sQmFzZSk6CiAKLSAgZGVmIHJlYWRNZXNzYWdlQmVnaW4oc2VsZik6Ci0gICAgc2VsZi5yZXNldFJlYWRDb250ZXh0KCkKLSAgICBzZWxmLnJlYWRKU09OQXJyYXlTdGFydCgpCi0gICAgaWYgc2VsZi5yZWFkSlNPTkludGVnZXIoKSAhPSBWRVJTSU9OOgotICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5CQURfVkVSU0lPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWVzc2FnZSBjb250YWluZWQgYmFkIHZlcnNpb24uIikKLSAgICBuYW1lID0gc2VsZi5yZWFkSlNPTlN0cmluZyhGYWxzZSkKLSAgICB0eXBlbiA9IHNlbGYucmVhZEpTT05JbnRlZ2VyKCkKLSAgICBzZXFpZCA9IHNlbGYucmVhZEpTT05JbnRlZ2VyKCkKLSAgICByZXR1cm4gKG5hbWUsIHR5cGVuLCBzZXFpZCkKKyAgICBkZWYgcmVhZE1lc3NhZ2VCZWdpbihzZWxmKToKKyAgICAgICAgc2VsZi5yZXNldFJlYWRDb250ZXh0KCkKKyAgICAgICAgc2VsZi5yZWFkSlNPTkFycmF5U3RhcnQoKQorICAgICAgICBpZiBzZWxmLnJlYWRKU09OSW50ZWdlcigpICE9IFZFUlNJT046CisgICAgICAgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLkJBRF9WRVJTSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNZXNzYWdlIGNvbnRhaW5lZCBiYWQgdmVyc2lvbi4iKQorICAgICAgICBuYW1lID0gc2VsZi5yZWFkSlNPTlN0cmluZyhGYWxzZSkKKyAgICAgICAgdHlwZW4gPSBzZWxmLnJlYWRKU09OSW50ZWdlcigpCisgICAgICAgIHNlcWlkID0gc2VsZi5yZWFkSlNPTkludGVnZXIoKQorICAgICAgICByZXR1cm4gKG5hbWUsIHR5cGVuLCBzZXFpZCkKIAotICBkZWYgcmVhZE1lc3NhZ2VFbmQoc2VsZik6Ci0gICAgc2VsZi5yZWFkSlNPTkFycmF5RW5kKCkKKyAgICBkZWYgcmVhZE1lc3NhZ2VFbmQoc2VsZik6CisgICAgICAgIHNlbGYucmVhZEpTT05BcnJheUVuZCgpCiAKLSAgZGVmIHJlYWRTdHJ1Y3RCZWdpbihzZWxmKToKLSAgICBzZWxmLnJlYWRKU09OT2JqZWN0U3RhcnQoKQorICAgIGRlZiByZWFkU3RydWN0QmVnaW4oc2VsZik6CisgICAgICAgIHNlbGYucmVhZEpTT05PYmplY3RTdGFydCgpCiAKLSAgZGVmIHJlYWRTdHJ1Y3RFbmQoc2VsZik6Ci0gICAgc2VsZi5yZWFkSlNPTk9iamVjdEVuZCgpCisgICAgZGVmIHJlYWRTdHJ1Y3RFbmQoc2VsZik6CisgICAgICAgIHNlbGYucmVhZEpTT05PYmplY3RFbmQoKQogCi0gIGRlZiByZWFkRmllbGRCZWdpbihzZWxmKToKLSAgICBjaGFyYWN0ZXIgPSBzZWxmLnJlYWRlci5wZWVrKCkKLSAgICB0dHlwZSA9IDAKLSAgICBpZCA9IDAKLSAgICBpZiBjaGFyYWN0ZXIgPT0gUkJSQUNFOgotICAgICAgdHR5cGUgPSBUVHlwZS5TVE9QCi0gICAgZWxzZToKLSAgICAgIGlkID0gc2VsZi5yZWFkSlNPTkludGVnZXIoKQotICAgICAgc2VsZi5yZWFkSlNPTk9iamVjdFN0YXJ0KCkKLSAgICAgIHR0eXBlID0gSlRZUEVTW3NlbGYucmVhZEpTT05TdHJpbmcoRmFsc2UpXQotICAgIHJldHVybiAoTm9uZSwgdHR5cGUsIGlkKQorICAgIGRlZiByZWFkRmllbGRCZWdpbihzZWxmKToKKyAgICAgICAgY2hhcmFjdGVyID0gc2VsZi5yZWFkZXIucGVlaygpCisgICAgICAgIHR0eXBlID0gMAorICAgICAgICBpZCA9IDAKKyAgICAgICAgaWYgY2hhcmFjdGVyID09IFJCUkFDRToKKyAgICAgICAgICAgIHR0eXBlID0gVFR5cGUuU1RPUAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWQgPSBzZWxmLnJlYWRKU09OSW50ZWdlcigpCisgICAgICAgICAgICBzZWxmLnJlYWRKU09OT2JqZWN0U3RhcnQoKQorICAgICAgICAgICAgdHR5cGUgPSBKVFlQRVNbc2VsZi5yZWFkSlNPTlN0cmluZyhGYWxzZSldCisgICAgICAgIHJldHVybiAoTm9uZSwgdHR5cGUsIGlkKQogCi0gIGRlZiByZWFkRmllbGRFbmQoc2VsZik6Ci0gICAgc2VsZi5yZWFkSlNPTk9iamVjdEVuZCgpCisgICAgZGVmIHJlYWRGaWVsZEVuZChzZWxmKToKKyAgICAgICAgc2VsZi5yZWFkSlNPTk9iamVjdEVuZCgpCiAKLSAgZGVmIHJlYWRNYXBCZWdpbihzZWxmKToKLSAgICBzZWxmLnJlYWRKU09OQXJyYXlTdGFydCgpCi0gICAga2V5VHlwZSA9IEpUWVBFU1tzZWxmLnJlYWRKU09OU3RyaW5nKEZhbHNlKV0KLSAgICB2YWx1ZVR5cGUgPSBKVFlQRVNbc2VsZi5yZWFkSlNPTlN0cmluZyhGYWxzZSldCi0gICAgc2l6ZSA9IHNlbGYucmVhZEpTT05JbnRlZ2VyKCkKLSAgICBzZWxmLnJlYWRKU09OT2JqZWN0U3RhcnQoKQotICAgIHJldHVybiAoa2V5VHlwZSwgdmFsdWVUeXBlLCBzaXplKQorICAgIGRlZiByZWFkTWFwQmVnaW4oc2VsZik6CisgICAgICAgIHNlbGYucmVhZEpTT05BcnJheVN0YXJ0KCkKKyAgICAgICAga2V5VHlwZSA9IEpUWVBFU1tzZWxmLnJlYWRKU09OU3RyaW5nKEZhbHNlKV0KKyAgICAgICAgdmFsdWVUeXBlID0gSlRZUEVTW3NlbGYucmVhZEpTT05TdHJpbmcoRmFsc2UpXQorICAgICAgICBzaXplID0gc2VsZi5yZWFkSlNPTkludGVnZXIoKQorICAgICAgICBzZWxmLnJlYWRKU09OT2JqZWN0U3RhcnQoKQorICAgICAgICByZXR1cm4gKGtleVR5cGUsIHZhbHVlVHlwZSwgc2l6ZSkKIAotICBkZWYgcmVhZE1hcEVuZChzZWxmKToKLSAgICBzZWxmLnJlYWRKU09OT2JqZWN0RW5kKCkKLSAgICBzZWxmLnJlYWRKU09OQXJyYXlFbmQoKQorICAgIGRlZiByZWFkTWFwRW5kKHNlbGYpOgorICAgICAgICBzZWxmLnJlYWRKU09OT2JqZWN0RW5kKCkKKyAgICAgICAgc2VsZi5yZWFkSlNPTkFycmF5RW5kKCkKIAotICBkZWYgcmVhZENvbGxlY3Rpb25CZWdpbihzZWxmKToKLSAgICBzZWxmLnJlYWRKU09OQXJyYXlTdGFydCgpCi0gICAgZWxlbVR5cGUgPSBKVFlQRVNbc2VsZi5yZWFkSlNPTlN0cmluZyhGYWxzZSldCi0gICAgc2l6ZSA9IHNlbGYucmVhZEpTT05JbnRlZ2VyKCkKLSAgICByZXR1cm4gKGVsZW1UeXBlLCBzaXplKQotICByZWFkTGlzdEJlZ2luID0gcmVhZENvbGxlY3Rpb25CZWdpbgotICByZWFkU2V0QmVnaW4gPSByZWFkQ29sbGVjdGlvbkJlZ2luCisgICAgZGVmIHJlYWRDb2xsZWN0aW9uQmVnaW4oc2VsZik6CisgICAgICAgIHNlbGYucmVhZEpTT05BcnJheVN0YXJ0KCkKKyAgICAgICAgZWxlbVR5cGUgPSBKVFlQRVNbc2VsZi5yZWFkSlNPTlN0cmluZyhGYWxzZSldCisgICAgICAgIHNpemUgPSBzZWxmLnJlYWRKU09OSW50ZWdlcigpCisgICAgICAgIHJldHVybiAoZWxlbVR5cGUsIHNpemUpCisgICAgcmVhZExpc3RCZWdpbiA9IHJlYWRDb2xsZWN0aW9uQmVnaW4KKyAgICByZWFkU2V0QmVnaW4gPSByZWFkQ29sbGVjdGlvbkJlZ2luCiAKLSAgZGVmIHJlYWRDb2xsZWN0aW9uRW5kKHNlbGYpOgotICAgIHNlbGYucmVhZEpTT05BcnJheUVuZCgpCi0gIHJlYWRTZXRFbmQgPSByZWFkQ29sbGVjdGlvbkVuZAotICByZWFkTGlzdEVuZCA9IHJlYWRDb2xsZWN0aW9uRW5kCisgICAgZGVmIHJlYWRDb2xsZWN0aW9uRW5kKHNlbGYpOgorICAgICAgICBzZWxmLnJlYWRKU09OQXJyYXlFbmQoKQorICAgIHJlYWRTZXRFbmQgPSByZWFkQ29sbGVjdGlvbkVuZAorICAgIHJlYWRMaXN0RW5kID0gcmVhZENvbGxlY3Rpb25FbmQKIAotICBkZWYgcmVhZEJvb2woc2VsZik6Ci0gICAgcmV0dXJuIChGYWxzZSBpZiBzZWxmLnJlYWRKU09OSW50ZWdlcigpID09IDAgZWxzZSBUcnVlKQorICAgIGRlZiByZWFkQm9vbChzZWxmKToKKyAgICAgICAgcmV0dXJuIChGYWxzZSBpZiBzZWxmLnJlYWRKU09OSW50ZWdlcigpID09IDAgZWxzZSBUcnVlKQogCi0gIGRlZiByZWFkTnVtYmVyKHNlbGYpOgotICAgIHJldHVybiBzZWxmLnJlYWRKU09OSW50ZWdlcigpCi0gIHJlYWRCeXRlID0gcmVhZE51bWJlcgotICByZWFkSTE2ID0gcmVhZE51bWJlcgotICByZWFkSTMyID0gcmVhZE51bWJlcgotICByZWFkSTY0ID0gcmVhZE51bWJlcgorICAgIGRlZiByZWFkTnVtYmVyKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5yZWFkSlNPTkludGVnZXIoKQorICAgIHJlYWRCeXRlID0gcmVhZE51bWJlcgorICAgIHJlYWRJMTYgPSByZWFkTnVtYmVyCisgICAgcmVhZEkzMiA9IHJlYWROdW1iZXIKKyAgICByZWFkSTY0ID0gcmVhZE51bWJlcgogCi0gIGRlZiByZWFkRG91YmxlKHNlbGYpOgotICAgIHJldHVybiBzZWxmLnJlYWRKU09ORG91YmxlKCkKKyAgICBkZWYgcmVhZERvdWJsZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYucmVhZEpTT05Eb3VibGUoKQogCi0gIGRlZiByZWFkU3RyaW5nKHNlbGYpOgotICAgIHJldHVybiBzZWxmLnJlYWRKU09OU3RyaW5nKEZhbHNlKQorICAgIGRlZiByZWFkU3RyaW5nKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5yZWFkSlNPTlN0cmluZyhGYWxzZSkKIAotICBkZWYgcmVhZEJpbmFyeShzZWxmKToKLSAgICByZXR1cm4gc2VsZi5yZWFkSlNPTkJhc2U2NCgpCisgICAgZGVmIHJlYWRCaW5hcnkoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnJlYWRKU09OQmFzZTY0KCkKIAotICBkZWYgd3JpdGVNZXNzYWdlQmVnaW4oc2VsZiwgbmFtZSwgcmVxdWVzdF90eXBlLCBzZXFpZCk6Ci0gICAgc2VsZi5yZXNldFdyaXRlQ29udGV4dCgpCi0gICAgc2VsZi53cml0ZUpTT05BcnJheVN0YXJ0KCkKLSAgICBzZWxmLndyaXRlSlNPTk51bWJlcihWRVJTSU9OKQotICAgIHNlbGYud3JpdGVKU09OU3RyaW5nKG5hbWUpCi0gICAgc2VsZi53cml0ZUpTT05OdW1iZXIocmVxdWVzdF90eXBlKQotICAgIHNlbGYud3JpdGVKU09OTnVtYmVyKHNlcWlkKQorICAgIGRlZiB3cml0ZU1lc3NhZ2VCZWdpbihzZWxmLCBuYW1lLCByZXF1ZXN0X3R5cGUsIHNlcWlkKToKKyAgICAgICAgc2VsZi5yZXNldFdyaXRlQ29udGV4dCgpCisgICAgICAgIHNlbGYud3JpdGVKU09OQXJyYXlTdGFydCgpCisgICAgICAgIHNlbGYud3JpdGVKU09OTnVtYmVyKFZFUlNJT04pCisgICAgICAgIHNlbGYud3JpdGVKU09OU3RyaW5nKG5hbWUpCisgICAgICAgIHNlbGYud3JpdGVKU09OTnVtYmVyKHJlcXVlc3RfdHlwZSkKKyAgICAgICAgc2VsZi53cml0ZUpTT05OdW1iZXIoc2VxaWQpCiAKLSAgZGVmIHdyaXRlTWVzc2FnZUVuZChzZWxmKToKLSAgICBzZWxmLndyaXRlSlNPTkFycmF5RW5kKCkKKyAgICBkZWYgd3JpdGVNZXNzYWdlRW5kKHNlbGYpOgorICAgICAgICBzZWxmLndyaXRlSlNPTkFycmF5RW5kKCkKIAotICBkZWYgd3JpdGVTdHJ1Y3RCZWdpbihzZWxmLCBuYW1lKToKLSAgICBzZWxmLndyaXRlSlNPTk9iamVjdFN0YXJ0KCkKKyAgICBkZWYgd3JpdGVTdHJ1Y3RCZWdpbihzZWxmLCBuYW1lKToKKyAgICAgICAgc2VsZi53cml0ZUpTT05PYmplY3RTdGFydCgpCiAKLSAgZGVmIHdyaXRlU3RydWN0RW5kKHNlbGYpOgotICAgIHNlbGYud3JpdGVKU09OT2JqZWN0RW5kKCkKKyAgICBkZWYgd3JpdGVTdHJ1Y3RFbmQoc2VsZik6CisgICAgICAgIHNlbGYud3JpdGVKU09OT2JqZWN0RW5kKCkKIAotICBkZWYgd3JpdGVGaWVsZEJlZ2luKHNlbGYsIG5hbWUsIHR0eXBlLCBpZCk6Ci0gICAgc2VsZi53cml0ZUpTT05OdW1iZXIoaWQpCi0gICAgc2VsZi53cml0ZUpTT05PYmplY3RTdGFydCgpCi0gICAgc2VsZi53cml0ZUpTT05TdHJpbmcoQ1RZUEVTW3R0eXBlXSkKKyAgICBkZWYgd3JpdGVGaWVsZEJlZ2luKHNlbGYsIG5hbWUsIHR0eXBlLCBpZCk6CisgICAgICAgIHNlbGYud3JpdGVKU09OTnVtYmVyKGlkKQorICAgICAgICBzZWxmLndyaXRlSlNPTk9iamVjdFN0YXJ0KCkKKyAgICAgICAgc2VsZi53cml0ZUpTT05TdHJpbmcoQ1RZUEVTW3R0eXBlXSkKIAotICBkZWYgd3JpdGVGaWVsZEVuZChzZWxmKToKLSAgICBzZWxmLndyaXRlSlNPTk9iamVjdEVuZCgpCisgICAgZGVmIHdyaXRlRmllbGRFbmQoc2VsZik6CisgICAgICAgIHNlbGYud3JpdGVKU09OT2JqZWN0RW5kKCkKIAotICBkZWYgd3JpdGVGaWVsZFN0b3Aoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiB3cml0ZUZpZWxkU3RvcChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiB3cml0ZU1hcEJlZ2luKHNlbGYsIGt0eXBlLCB2dHlwZSwgc2l6ZSk6Ci0gICAgc2VsZi53cml0ZUpTT05BcnJheVN0YXJ0KCkKLSAgICBzZWxmLndyaXRlSlNPTlN0cmluZyhDVFlQRVNba3R5cGVdKQotICAgIHNlbGYud3JpdGVKU09OU3RyaW5nKENUWVBFU1t2dHlwZV0pCi0gICAgc2VsZi53cml0ZUpTT05OdW1iZXIoc2l6ZSkKLSAgICBzZWxmLndyaXRlSlNPTk9iamVjdFN0YXJ0KCkKKyAgICBkZWYgd3JpdGVNYXBCZWdpbihzZWxmLCBrdHlwZSwgdnR5cGUsIHNpemUpOgorICAgICAgICBzZWxmLndyaXRlSlNPTkFycmF5U3RhcnQoKQorICAgICAgICBzZWxmLndyaXRlSlNPTlN0cmluZyhDVFlQRVNba3R5cGVdKQorICAgICAgICBzZWxmLndyaXRlSlNPTlN0cmluZyhDVFlQRVNbdnR5cGVdKQorICAgICAgICBzZWxmLndyaXRlSlNPTk51bWJlcihzaXplKQorICAgICAgICBzZWxmLndyaXRlSlNPTk9iamVjdFN0YXJ0KCkKIAotICBkZWYgd3JpdGVNYXBFbmQoc2VsZik6Ci0gICAgc2VsZi53cml0ZUpTT05PYmplY3RFbmQoKQotICAgIHNlbGYud3JpdGVKU09OQXJyYXlFbmQoKQotICAgIAotICBkZWYgd3JpdGVMaXN0QmVnaW4oc2VsZiwgZXR5cGUsIHNpemUpOgotICAgIHNlbGYud3JpdGVKU09OQXJyYXlTdGFydCgpCi0gICAgc2VsZi53cml0ZUpTT05TdHJpbmcoQ1RZUEVTW2V0eXBlXSkKLSAgICBzZWxmLndyaXRlSlNPTk51bWJlcihzaXplKQotICAgIAotICBkZWYgd3JpdGVMaXN0RW5kKHNlbGYpOgotICAgIHNlbGYud3JpdGVKU09OQXJyYXlFbmQoKQorICAgIGRlZiB3cml0ZU1hcEVuZChzZWxmKToKKyAgICAgICAgc2VsZi53cml0ZUpTT05PYmplY3RFbmQoKQorICAgICAgICBzZWxmLndyaXRlSlNPTkFycmF5RW5kKCkKIAotICBkZWYgd3JpdGVTZXRCZWdpbihzZWxmLCBldHlwZSwgc2l6ZSk6Ci0gICAgc2VsZi53cml0ZUpTT05BcnJheVN0YXJ0KCkKLSAgICBzZWxmLndyaXRlSlNPTlN0cmluZyhDVFlQRVNbZXR5cGVdKQotICAgIHNlbGYud3JpdGVKU09OTnVtYmVyKHNpemUpCi0gICAgCi0gIGRlZiB3cml0ZVNldEVuZChzZWxmKToKLSAgICBzZWxmLndyaXRlSlNPTkFycmF5RW5kKCkKKyAgICBkZWYgd3JpdGVMaXN0QmVnaW4oc2VsZiwgZXR5cGUsIHNpemUpOgorICAgICAgICBzZWxmLndyaXRlSlNPTkFycmF5U3RhcnQoKQorICAgICAgICBzZWxmLndyaXRlSlNPTlN0cmluZyhDVFlQRVNbZXR5cGVdKQorICAgICAgICBzZWxmLndyaXRlSlNPTk51bWJlcihzaXplKQogCi0gIGRlZiB3cml0ZUJvb2woc2VsZiwgYm9vbGVhbik6Ci0gICAgc2VsZi53cml0ZUpTT05OdW1iZXIoMSBpZiBib29sZWFuIGlzIFRydWUgZWxzZSAwKQorICAgIGRlZiB3cml0ZUxpc3RFbmQoc2VsZik6CisgICAgICAgIHNlbGYud3JpdGVKU09OQXJyYXlFbmQoKQogCi0gIGRlZiB3cml0ZUJ5dGUoc2VsZiwgYnl0ZSk6Ci0gICAgY2hlY2tJbnRlZ2VyTGltaXRzKGJ5dGUsIDgpCi0gICAgc2VsZi53cml0ZUpTT05OdW1iZXIoYnl0ZSkKKyAgICBkZWYgd3JpdGVTZXRCZWdpbihzZWxmLCBldHlwZSwgc2l6ZSk6CisgICAgICAgIHNlbGYud3JpdGVKU09OQXJyYXlTdGFydCgpCisgICAgICAgIHNlbGYud3JpdGVKU09OU3RyaW5nKENUWVBFU1tldHlwZV0pCisgICAgICAgIHNlbGYud3JpdGVKU09OTnVtYmVyKHNpemUpCiAKLSAgZGVmIHdyaXRlSTE2KHNlbGYsIGkxNik6Ci0gICAgY2hlY2tJbnRlZ2VyTGltaXRzKGkxNiwgMTYpCi0gICAgc2VsZi53cml0ZUpTT05OdW1iZXIoaTE2KQorICAgIGRlZiB3cml0ZVNldEVuZChzZWxmKToKKyAgICAgICAgc2VsZi53cml0ZUpTT05BcnJheUVuZCgpCiAKLSAgZGVmIHdyaXRlSTMyKHNlbGYsIGkzMik6Ci0gICAgY2hlY2tJbnRlZ2VyTGltaXRzKGkzMiwgMzIpCi0gICAgc2VsZi53cml0ZUpTT05OdW1iZXIoaTMyKQorICAgIGRlZiB3cml0ZUJvb2woc2VsZiwgYm9vbGVhbik6CisgICAgICAgIHNlbGYud3JpdGVKU09OTnVtYmVyKDEgaWYgYm9vbGVhbiBpcyBUcnVlIGVsc2UgMCkKIAotICBkZWYgd3JpdGVJNjQoc2VsZiwgaTY0KToKLSAgICBjaGVja0ludGVnZXJMaW1pdHMoaTY0LCA2NCkKLSAgICBzZWxmLndyaXRlSlNPTk51bWJlcihpNjQpCisgICAgZGVmIHdyaXRlQnl0ZShzZWxmLCBieXRlKToKKyAgICAgICAgY2hlY2tJbnRlZ2VyTGltaXRzKGJ5dGUsIDgpCisgICAgICAgIHNlbGYud3JpdGVKU09OTnVtYmVyKGJ5dGUpCiAKLSAgZGVmIHdyaXRlRG91YmxlKHNlbGYsIGRibCk6Ci0gICAgc2VsZi53cml0ZUpTT05OdW1iZXIoZGJsKQorICAgIGRlZiB3cml0ZUkxNihzZWxmLCBpMTYpOgorICAgICAgICBjaGVja0ludGVnZXJMaW1pdHMoaTE2LCAxNikKKyAgICAgICAgc2VsZi53cml0ZUpTT05OdW1iZXIoaTE2KQogCi0gIGRlZiB3cml0ZVN0cmluZyhzZWxmLCBzdHJpbmcpOgotICAgIHNlbGYud3JpdGVKU09OU3RyaW5nKHN0cmluZykKLSAgICAKLSAgZGVmIHdyaXRlQmluYXJ5KHNlbGYsIGJpbmFyeSk6Ci0gICAgc2VsZi53cml0ZUpTT05CYXNlNjQoYmluYXJ5KQorICAgIGRlZiB3cml0ZUkzMihzZWxmLCBpMzIpOgorICAgICAgICBjaGVja0ludGVnZXJMaW1pdHMoaTMyLCAzMikKKyAgICAgICAgc2VsZi53cml0ZUpTT05OdW1iZXIoaTMyKQorCisgICAgZGVmIHdyaXRlSTY0KHNlbGYsIGk2NCk6CisgICAgICAgIGNoZWNrSW50ZWdlckxpbWl0cyhpNjQsIDY0KQorICAgICAgICBzZWxmLndyaXRlSlNPTk51bWJlcihpNjQpCisKKyAgICBkZWYgd3JpdGVEb3VibGUoc2VsZiwgZGJsKToKKyAgICAgICAgIyAxNyBzaWduaWZpY2FudCBkaWdpdHMgc2hvdWxkIGJlIGp1c3QgZW5vdWdoIGZvciBhbnkgZG91YmxlIHByZWNpc2lvbgorICAgICAgICAjIHZhbHVlLgorICAgICAgICBzZWxmLndyaXRlSlNPTk51bWJlcihkYmwsICd7MDouMTdnfScpCisKKyAgICBkZWYgd3JpdGVTdHJpbmcoc2VsZiwgc3RyaW5nKToKKyAgICAgICAgc2VsZi53cml0ZUpTT05TdHJpbmcoc3RyaW5nKQorCisgICAgZGVmIHdyaXRlQmluYXJ5KHNlbGYsIGJpbmFyeSk6CisgICAgICAgIHNlbGYud3JpdGVKU09OQmFzZTY0KGJpbmFyeSkKIAogCi1jbGFzcyBUSlNPTlByb3RvY29sRmFjdG9yeToKK2NsYXNzIFRKU09OUHJvdG9jb2xGYWN0b3J5KG9iamVjdCk6CisgICAgZGVmIGdldFByb3RvY29sKHNlbGYsIHRyYW5zKToKKyAgICAgICAgcmV0dXJuIFRKU09OUHJvdG9jb2wodHJhbnMpCiAKLSAgZGVmIGdldFByb3RvY29sKHNlbGYsIHRyYW5zKToKLSAgICByZXR1cm4gVEpTT05Qcm90b2NvbCh0cmFucykKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgc3RyaW5nX2xlbmd0aF9saW1pdChzZW5mKToKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBjb250YWluZXJfbGVuZ3RoX2xpbWl0KHNlbmYpOgorICAgICAgICByZXR1cm4gTm9uZQogCiAKIGNsYXNzIFRTaW1wbGVKU09OUHJvdG9jb2woVEpTT05Qcm90b2NvbEJhc2UpOgogICAgICIiIlNpbXBsZSwgcmVhZGFibGUsIHdyaXRlLW9ubHkgSlNPTiBwcm90b2NvbC4KLSAgICAKKwogICAgIFVzZWZ1bCBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBzY3JpcHRpbmcgbGFuZ3VhZ2VzLgogICAgICIiIgogCiAgICAgZGVmIHJlYWRNZXNzYWdlQmVnaW4oc2VsZik6CiAgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoKQotICAgIAorCiAgICAgZGVmIHJlYWRNZXNzYWdlRW5kKHNlbGYpOgogICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCkKLSAgICAKKwogICAgIGRlZiByZWFkU3RydWN0QmVnaW4oc2VsZik6CiAgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoKQotICAgIAorCiAgICAgZGVmIHJlYWRTdHJ1Y3RFbmQoc2VsZik6CiAgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoKQotICAgIAorCiAgICAgZGVmIHdyaXRlTWVzc2FnZUJlZ2luKHNlbGYsIG5hbWUsIHJlcXVlc3RfdHlwZSwgc2VxaWQpOgogICAgICAgICBzZWxmLnJlc2V0V3JpdGVDb250ZXh0KCkKLSAgICAKKwogICAgIGRlZiB3cml0ZU1lc3NhZ2VFbmQoc2VsZik6CiAgICAgICAgIHBhc3MKLSAgICAKKwogICAgIGRlZiB3cml0ZVN0cnVjdEJlZ2luKHNlbGYsIG5hbWUpOgogICAgICAgICBzZWxmLndyaXRlSlNPTk9iamVjdFN0YXJ0KCkKLSAgICAKKwogICAgIGRlZiB3cml0ZVN0cnVjdEVuZChzZWxmKToKICAgICAgICAgc2VsZi53cml0ZUpTT05PYmplY3RFbmQoKQotICAgICAgCisKICAgICBkZWYgd3JpdGVGaWVsZEJlZ2luKHNlbGYsIG5hbWUsIHR0eXBlLCBmaWQpOgogICAgICAgICBzZWxmLndyaXRlSlNPTlN0cmluZyhuYW1lKQotICAgIAorCiAgICAgZGVmIHdyaXRlRmllbGRFbmQoc2VsZik6CiAgICAgICAgIHBhc3MKLSAgICAKKwogICAgIGRlZiB3cml0ZU1hcEJlZ2luKHNlbGYsIGt0eXBlLCB2dHlwZSwgc2l6ZSk6CiAgICAgICAgIHNlbGYud3JpdGVKU09OT2JqZWN0U3RhcnQoKQotICAgIAorCiAgICAgZGVmIHdyaXRlTWFwRW5kKHNlbGYpOgogICAgICAgICBzZWxmLndyaXRlSlNPTk9iamVjdEVuZCgpCi0gICAgCisKICAgICBkZWYgX3dyaXRlQ29sbGVjdGlvbkJlZ2luKHNlbGYsIGV0eXBlLCBzaXplKToKICAgICAgICAgc2VsZi53cml0ZUpTT05BcnJheVN0YXJ0KCkKLSAgICAKKwogICAgIGRlZiBfd3JpdGVDb2xsZWN0aW9uRW5kKHNlbGYpOgogICAgICAgICBzZWxmLndyaXRlSlNPTkFycmF5RW5kKCkKICAgICB3cml0ZUxpc3RCZWdpbiA9IF93cml0ZUNvbGxlY3Rpb25CZWdpbgpAQCAtNTQ5LDE2ICs2NTcsMTYgQEAKICAgICBkZWYgd3JpdGVJNjQoc2VsZiwgaTY0KToKICAgICAgICAgY2hlY2tJbnRlZ2VyTGltaXRzKGk2NCwgNjQpCiAgICAgICAgIHNlbGYud3JpdGVKU09OTnVtYmVyKGk2NCkKLSAgICAKKwogICAgIGRlZiB3cml0ZUJvb2woc2VsZiwgYm9vbGVhbik6CiAgICAgICAgIHNlbGYud3JpdGVKU09OTnVtYmVyKDEgaWYgYm9vbGVhbiBpcyBUcnVlIGVsc2UgMCkKIAogICAgIGRlZiB3cml0ZURvdWJsZShzZWxmLCBkYmwpOgogICAgICAgICBzZWxmLndyaXRlSlNPTk51bWJlcihkYmwpCi0gICAgCisKICAgICBkZWYgd3JpdGVTdHJpbmcoc2VsZiwgc3RyaW5nKToKICAgICAgICAgc2VsZi53cml0ZUpTT05TdHJpbmcoc3RyaW5nKQotICAgICAgCisKICAgICBkZWYgd3JpdGVCaW5hcnkoc2VsZiwgYmluYXJ5KToKICAgICAgICAgc2VsZi53cml0ZUpTT05CYXNlNjQoYmluYXJ5KQogCmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL3Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLnB5IGIvbGliL3B5L3NyYy9wcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5weQppbmRleCBkMjVmMzY3Li4wZjgzOTBmIDEwMDY0NAotLS0gYS9saWIvcHkvc3JjL3Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLnB5CisrKyBiL2xpYi9weS9zcmMvcHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wucHkKQEAgLTIyLDE4ICsyMiwxOCBAQAogCiBTRVBBUkFUT1IgPSAiOiIKIAotY2xhc3MgVE11bHRpcGxleGVkUHJvdG9jb2woVFByb3RvY29sRGVjb3JhdG9yLlRQcm90b2NvbERlY29yYXRvcik6Ci0gIGRlZiBfX2luaXRfXyhzZWxmLCBwcm90b2NvbCwgc2VydmljZU5hbWUpOgotICAgIFRQcm90b2NvbERlY29yYXRvci5UUHJvdG9jb2xEZWNvcmF0b3IuX19pbml0X18oc2VsZiwgcHJvdG9jb2wpCi0gICAgc2VsZi5zZXJ2aWNlTmFtZSA9IHNlcnZpY2VOYW1lCiAKLSAgZGVmIHdyaXRlTWVzc2FnZUJlZ2luKHNlbGYsIG5hbWUsIHR5cGUsIHNlcWlkKToKLSAgICBpZiAodHlwZSA9PSBUTWVzc2FnZVR5cGUuQ0FMTCBvcgotICAgICAgICB0eXBlID09IFRNZXNzYWdlVHlwZS5PTkVXQVkpOgotICAgICAgc2VsZi5wcm90b2NvbC53cml0ZU1lc3NhZ2VCZWdpbigKLSAgICAgICAgc2VsZi5zZXJ2aWNlTmFtZSArIFNFUEFSQVRPUiArIG5hbWUsCi0gICAgICAgIHR5cGUsCi0gICAgICAgIHNlcWlkCi0gICAgICApCi0gICAgZWxzZToKLSAgICAgIHNlbGYucHJvdG9jb2wud3JpdGVNZXNzYWdlQmVnaW4obmFtZSwgdHlwZSwgc2VxaWQpCitjbGFzcyBUTXVsdGlwbGV4ZWRQcm90b2NvbChUUHJvdG9jb2xEZWNvcmF0b3IuVFByb3RvY29sRGVjb3JhdG9yKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcHJvdG9jb2wsIHNlcnZpY2VOYW1lKToKKyAgICAgICAgc2VsZi5zZXJ2aWNlTmFtZSA9IHNlcnZpY2VOYW1lCisKKyAgICBkZWYgd3JpdGVNZXNzYWdlQmVnaW4oc2VsZiwgbmFtZSwgdHlwZSwgc2VxaWQpOgorICAgICAgICBpZiAodHlwZSA9PSBUTWVzc2FnZVR5cGUuQ0FMTCBvcgorICAgICAgICAgICAgICAgIHR5cGUgPT0gVE1lc3NhZ2VUeXBlLk9ORVdBWSk6CisgICAgICAgICAgICBzdXBlcihUTXVsdGlwbGV4ZWRQcm90b2NvbCwgc2VsZikud3JpdGVNZXNzYWdlQmVnaW4oCisgICAgICAgICAgICAgICAgc2VsZi5zZXJ2aWNlTmFtZSArIFNFUEFSQVRPUiArIG5hbWUsCisgICAgICAgICAgICAgICAgdHlwZSwKKyAgICAgICAgICAgICAgICBzZXFpZAorICAgICAgICAgICAgKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc3VwZXIoVE11bHRpcGxleGVkUHJvdG9jb2wsIHNlbGYpLndyaXRlTWVzc2FnZUJlZ2luKG5hbWUsIHR5cGUsIHNlcWlkKQpkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9wcm90b2NvbC9UUHJvdG9jb2wucHkgYi9saWIvcHkvc3JjL3Byb3RvY29sL1RQcm90b2NvbC5weQppbmRleCAzMTFhNjM1Li44MzE0Y2Y2IDEwMDY0NAotLS0gYS9saWIvcHkvc3JjL3Byb3RvY29sL1RQcm90b2NvbC5weQorKysgYi9saWIvcHkvc3JjL3Byb3RvY29sL1RQcm90b2NvbC5weQpAQCAtMTcsMzkwICsxNywzODggQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLWZyb20gdGhyaWZ0LlRocmlmdCBpbXBvcnQgKgorZnJvbSB0aHJpZnQuVGhyaWZ0IGltcG9ydCBURXhjZXB0aW9uLCBUVHlwZSwgVEZyb3plbkRpY3QKK2Zyb20gdGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0RXhjZXB0aW9uCitmcm9tIC4uY29tcGF0IGltcG9ydCBiaW5hcnlfdG9fc3RyLCBzdHJfdG9fYmluYXJ5CisKK2ltcG9ydCBzaXgKK2ltcG9ydCBzeXMKK2Zyb20gaXRlcnRvb2xzIGltcG9ydCBpc2xpY2UKK2Zyb20gc2l4Lm1vdmVzIGltcG9ydCB6aXAKIAogCiBjbGFzcyBUUHJvdG9jb2xFeGNlcHRpb24oVEV4Y2VwdGlvbik6Ci0gICIiIkN1c3RvbSBQcm90b2NvbCBFeGNlcHRpb24gY2xhc3MiIiIKKyAgICAiIiJDdXN0b20gUHJvdG9jb2wgRXhjZXB0aW9uIGNsYXNzIiIiCiAKLSAgVU5LTk9XTiA9IDAKLSAgSU5WQUxJRF9EQVRBID0gMQotICBORUdBVElWRV9TSVpFID0gMgotICBTSVpFX0xJTUlUID0gMwotICBCQURfVkVSU0lPTiA9IDQKLSAgTk9UX0lNUExFTUVOVEVEID0gNQotICBERVBUSF9MSU1JVCA9IDYKKyAgICBVTktOT1dOID0gMAorICAgIElOVkFMSURfREFUQSA9IDEKKyAgICBORUdBVElWRV9TSVpFID0gMgorICAgIFNJWkVfTElNSVQgPSAzCisgICAgQkFEX1ZFUlNJT04gPSA0CisgICAgTk9UX0lNUExFTUVOVEVEID0gNQorICAgIERFUFRIX0xJTUlUID0gNgorICAgIElOVkFMSURfUFJPVE9DT0wgPSA3CiAKLSAgZGVmIF9faW5pdF9fKHNlbGYsIHR5cGU9VU5LTk9XTiwgbWVzc2FnZT1Ob25lKToKLSAgICBURXhjZXB0aW9uLl9faW5pdF9fKHNlbGYsIG1lc3NhZ2UpCi0gICAgc2VsZi50eXBlID0gdHlwZQorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0eXBlPVVOS05PV04sIG1lc3NhZ2U9Tm9uZSk6CisgICAgICAgIFRFeGNlcHRpb24uX19pbml0X18oc2VsZiwgbWVzc2FnZSkKKyAgICAgICAgc2VsZi50eXBlID0gdHlwZQogCiAKLWNsYXNzIFRQcm90b2NvbEJhc2U6Ci0gICIiIkJhc2UgY2xhc3MgZm9yIFRocmlmdCBwcm90b2NvbCBkcml2ZXIuIiIiCitjbGFzcyBUUHJvdG9jb2xCYXNlKG9iamVjdCk6CisgICAgIiIiQmFzZSBjbGFzcyBmb3IgVGhyaWZ0IHByb3RvY29sIGRyaXZlci4iIiIKIAotICBkZWYgX19pbml0X18oc2VsZiwgdHJhbnMpOgotICAgIHNlbGYudHJhbnMgPSB0cmFucworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0cmFucyk6CisgICAgICAgIHNlbGYudHJhbnMgPSB0cmFucworICAgICAgICBzZWxmLl9mYXN0X2RlY29kZSA9IE5vbmUKKyAgICAgICAgc2VsZi5fZmFzdF9lbmNvZGUgPSBOb25lCiAKLSAgZGVmIHdyaXRlTWVzc2FnZUJlZ2luKHNlbGYsIG5hbWUsIHR0eXBlLCBzZXFpZCk6Ci0gICAgcGFzcworICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgX2NoZWNrX2xlbmd0aChsaW1pdCwgbGVuZ3RoKToKKyAgICAgICAgaWYgbGVuZ3RoIDwgMDoKKyAgICAgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5ORUdBVElWRV9TSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTmVnYXRpdmUgbGVuZ3RoOiAlZCcgJSBsZW5ndGgpCisgICAgICAgIGlmIGxpbWl0IGlzIG5vdCBOb25lIGFuZCBsZW5ndGggPiBsaW1pdDoKKyAgICAgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5TSVpFX0xJTUlULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTGVuZ3RoIGV4Y2VlZGVkIG1heCBhbGxvd2VkOiAlZCcgJSBsaW1pdCkKIAotICBkZWYgd3JpdGVNZXNzYWdlRW5kKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVNZXNzYWdlQmVnaW4oc2VsZiwgbmFtZSwgdHR5cGUsIHNlcWlkKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiB3cml0ZVN0cnVjdEJlZ2luKHNlbGYsIG5hbWUpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVNZXNzYWdlRW5kKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHdyaXRlU3RydWN0RW5kKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVTdHJ1Y3RCZWdpbihzZWxmLCBuYW1lKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiB3cml0ZUZpZWxkQmVnaW4oc2VsZiwgbmFtZSwgdHR5cGUsIGZpZCk6Ci0gICAgcGFzcworICAgIGRlZiB3cml0ZVN0cnVjdEVuZChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiB3cml0ZUZpZWxkRW5kKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVGaWVsZEJlZ2luKHNlbGYsIG5hbWUsIHR0eXBlLCBmaWQpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHdyaXRlRmllbGRTdG9wKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVGaWVsZEVuZChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiB3cml0ZU1hcEJlZ2luKHNlbGYsIGt0eXBlLCB2dHlwZSwgc2l6ZSk6Ci0gICAgcGFzcworICAgIGRlZiB3cml0ZUZpZWxkU3RvcChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiB3cml0ZU1hcEVuZChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHdyaXRlTWFwQmVnaW4oc2VsZiwga3R5cGUsIHZ0eXBlLCBzaXplKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiB3cml0ZUxpc3RCZWdpbihzZWxmLCBldHlwZSwgc2l6ZSk6Ci0gICAgcGFzcworICAgIGRlZiB3cml0ZU1hcEVuZChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiB3cml0ZUxpc3RFbmQoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiB3cml0ZUxpc3RCZWdpbihzZWxmLCBldHlwZSwgc2l6ZSk6CisgICAgICAgIHBhc3MKIAotICBkZWYgd3JpdGVTZXRCZWdpbihzZWxmLCBldHlwZSwgc2l6ZSk6Ci0gICAgcGFzcworICAgIGRlZiB3cml0ZUxpc3RFbmQoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgd3JpdGVTZXRFbmQoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiB3cml0ZVNldEJlZ2luKHNlbGYsIGV0eXBlLCBzaXplKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiB3cml0ZUJvb2woc2VsZiwgYm9vbF92YWwpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVTZXRFbmQoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgd3JpdGVCeXRlKHNlbGYsIGJ5dGUpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVCb29sKHNlbGYsIGJvb2xfdmFsKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiB3cml0ZUkxNihzZWxmLCBpMTYpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVCeXRlKHNlbGYsIGJ5dGUpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHdyaXRlSTMyKHNlbGYsIGkzMik6Ci0gICAgcGFzcworICAgIGRlZiB3cml0ZUkxNihzZWxmLCBpMTYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHdyaXRlSTY0KHNlbGYsIGk2NCk6Ci0gICAgcGFzcworICAgIGRlZiB3cml0ZUkzMihzZWxmLCBpMzIpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHdyaXRlRG91YmxlKHNlbGYsIGR1Yik6Ci0gICAgcGFzcworICAgIGRlZiB3cml0ZUk2NChzZWxmLCBpNjQpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHdyaXRlU3RyaW5nKHNlbGYsIHN0cl92YWwpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVEb3VibGUoc2VsZiwgZHViKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiByZWFkTWVzc2FnZUJlZ2luKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVTdHJpbmcoc2VsZiwgc3RyX3ZhbCk6CisgICAgICAgIHNlbGYud3JpdGVCaW5hcnkoc3RyX3RvX2JpbmFyeShzdHJfdmFsKSkKIAotICBkZWYgcmVhZE1lc3NhZ2VFbmQoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiB3cml0ZUJpbmFyeShzZWxmLCBzdHJfdmFsKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiByZWFkU3RydWN0QmVnaW4oc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiB3cml0ZVV0Zjgoc2VsZiwgc3RyX3ZhbCk6CisgICAgICAgIHNlbGYud3JpdGVTdHJpbmcoc3RyX3ZhbC5lbmNvZGUoJ3V0ZjgnKSkKIAotICBkZWYgcmVhZFN0cnVjdEVuZChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHJlYWRNZXNzYWdlQmVnaW4oc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgcmVhZEZpZWxkQmVnaW4oc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiByZWFkTWVzc2FnZUVuZChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiByZWFkRmllbGRFbmQoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiByZWFkU3RydWN0QmVnaW4oc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgcmVhZE1hcEJlZ2luKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgcmVhZFN0cnVjdEVuZChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiByZWFkTWFwRW5kKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgcmVhZEZpZWxkQmVnaW4oc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgcmVhZExpc3RCZWdpbihzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHJlYWRGaWVsZEVuZChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiByZWFkTGlzdEVuZChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHJlYWRNYXBCZWdpbihzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiByZWFkU2V0QmVnaW4oc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiByZWFkTWFwRW5kKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHJlYWRTZXRFbmQoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiByZWFkTGlzdEJlZ2luKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHJlYWRCb29sKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgcmVhZExpc3RFbmQoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgcmVhZEJ5dGUoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiByZWFkU2V0QmVnaW4oc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgcmVhZEkxNihzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHJlYWRTZXRFbmQoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgcmVhZEkzMihzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHJlYWRCb29sKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHJlYWRJNjQoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiByZWFkQnl0ZShzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiByZWFkRG91YmxlKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgcmVhZEkxNihzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiByZWFkU3RyaW5nKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgcmVhZEkzMihzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiBza2lwKHNlbGYsIHR0eXBlKToKLSAgICBpZiB0dHlwZSA9PSBUVHlwZS5TVE9QOgotICAgICAgcmV0dXJuCi0gICAgZWxpZiB0dHlwZSA9PSBUVHlwZS5CT09MOgotICAgICAgc2VsZi5yZWFkQm9vbCgpCi0gICAgZWxpZiB0dHlwZSA9PSBUVHlwZS5CWVRFOgotICAgICAgc2VsZi5yZWFkQnl0ZSgpCi0gICAgZWxpZiB0dHlwZSA9PSBUVHlwZS5JMTY6Ci0gICAgICBzZWxmLnJlYWRJMTYoKQotICAgIGVsaWYgdHR5cGUgPT0gVFR5cGUuSTMyOgotICAgICAgc2VsZi5yZWFkSTMyKCkKLSAgICBlbGlmIHR0eXBlID09IFRUeXBlLkk2NDoKLSAgICAgIHNlbGYucmVhZEk2NCgpCi0gICAgZWxpZiB0dHlwZSA9PSBUVHlwZS5ET1VCTEU6Ci0gICAgICBzZWxmLnJlYWREb3VibGUoKQotICAgIGVsaWYgdHR5cGUgPT0gVFR5cGUuU1RSSU5HOgotICAgICAgc2VsZi5yZWFkU3RyaW5nKCkKLSAgICBlbGlmIHR0eXBlID09IFRUeXBlLlNUUlVDVDoKLSAgICAgIG5hbWUgPSBzZWxmLnJlYWRTdHJ1Y3RCZWdpbigpCi0gICAgICB3aGlsZSBUcnVlOgotICAgICAgICAobmFtZSwgdHR5cGUsIGlkKSA9IHNlbGYucmVhZEZpZWxkQmVnaW4oKQorICAgIGRlZiByZWFkSTY0KHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgcmVhZERvdWJsZShzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIHJlYWRTdHJpbmcoc2VsZik6CisgICAgICAgIHJldHVybiBiaW5hcnlfdG9fc3RyKHNlbGYucmVhZEJpbmFyeSgpKQorCisgICAgZGVmIHJlYWRCaW5hcnkoc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIGRlZiByZWFkVXRmOChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYucmVhZFN0cmluZygpLmRlY29kZSgndXRmOCcpCisKKyAgICBkZWYgc2tpcChzZWxmLCB0dHlwZSk6CiAgICAgICAgIGlmIHR0eXBlID09IFRUeXBlLlNUT1A6Ci0gICAgICAgICAgYnJlYWsKLSAgICAgICAgc2VsZi5za2lwKHR0eXBlKQotICAgICAgICBzZWxmLnJlYWRGaWVsZEVuZCgpCi0gICAgICBzZWxmLnJlYWRTdHJ1Y3RFbmQoKQotICAgIGVsaWYgdHR5cGUgPT0gVFR5cGUuTUFQOgotICAgICAgKGt0eXBlLCB2dHlwZSwgc2l6ZSkgPSBzZWxmLnJlYWRNYXBCZWdpbigpCi0gICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2l6ZSk6Ci0gICAgICAgIHNlbGYuc2tpcChrdHlwZSkKLSAgICAgICAgc2VsZi5za2lwKHZ0eXBlKQotICAgICAgc2VsZi5yZWFkTWFwRW5kKCkKLSAgICBlbGlmIHR0eXBlID09IFRUeXBlLlNFVDoKLSAgICAgIChldHlwZSwgc2l6ZSkgPSBzZWxmLnJlYWRTZXRCZWdpbigpCi0gICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2l6ZSk6Ci0gICAgICAgIHNlbGYuc2tpcChldHlwZSkKLSAgICAgIHNlbGYucmVhZFNldEVuZCgpCi0gICAgZWxpZiB0dHlwZSA9PSBUVHlwZS5MSVNUOgotICAgICAgKGV0eXBlLCBzaXplKSA9IHNlbGYucmVhZExpc3RCZWdpbigpCi0gICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2l6ZSk6Ci0gICAgICAgIHNlbGYuc2tpcChldHlwZSkKLSAgICAgIHNlbGYucmVhZExpc3RFbmQoKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGVsaWYgdHR5cGUgPT0gVFR5cGUuQk9PTDoKKyAgICAgICAgICAgIHNlbGYucmVhZEJvb2woKQorICAgICAgICBlbGlmIHR0eXBlID09IFRUeXBlLkJZVEU6CisgICAgICAgICAgICBzZWxmLnJlYWRCeXRlKCkKKyAgICAgICAgZWxpZiB0dHlwZSA9PSBUVHlwZS5JMTY6CisgICAgICAgICAgICBzZWxmLnJlYWRJMTYoKQorICAgICAgICBlbGlmIHR0eXBlID09IFRUeXBlLkkzMjoKKyAgICAgICAgICAgIHNlbGYucmVhZEkzMigpCisgICAgICAgIGVsaWYgdHR5cGUgPT0gVFR5cGUuSTY0OgorICAgICAgICAgICAgc2VsZi5yZWFkSTY0KCkKKyAgICAgICAgZWxpZiB0dHlwZSA9PSBUVHlwZS5ET1VCTEU6CisgICAgICAgICAgICBzZWxmLnJlYWREb3VibGUoKQorICAgICAgICBlbGlmIHR0eXBlID09IFRUeXBlLlNUUklORzoKKyAgICAgICAgICAgIHNlbGYucmVhZFN0cmluZygpCisgICAgICAgIGVsaWYgdHR5cGUgPT0gVFR5cGUuU1RSVUNUOgorICAgICAgICAgICAgbmFtZSA9IHNlbGYucmVhZFN0cnVjdEJlZ2luKCkKKyAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgKG5hbWUsIHR0eXBlLCBpZCkgPSBzZWxmLnJlYWRGaWVsZEJlZ2luKCkKKyAgICAgICAgICAgICAgICBpZiB0dHlwZSA9PSBUVHlwZS5TVE9QOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIHNlbGYuc2tpcCh0dHlwZSkKKyAgICAgICAgICAgICAgICBzZWxmLnJlYWRGaWVsZEVuZCgpCisgICAgICAgICAgICBzZWxmLnJlYWRTdHJ1Y3RFbmQoKQorICAgICAgICBlbGlmIHR0eXBlID09IFRUeXBlLk1BUDoKKyAgICAgICAgICAgIChrdHlwZSwgdnR5cGUsIHNpemUpID0gc2VsZi5yZWFkTWFwQmVnaW4oKQorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2Uoc2l6ZSk6CisgICAgICAgICAgICAgICAgc2VsZi5za2lwKGt0eXBlKQorICAgICAgICAgICAgICAgIHNlbGYuc2tpcCh2dHlwZSkKKyAgICAgICAgICAgIHNlbGYucmVhZE1hcEVuZCgpCisgICAgICAgIGVsaWYgdHR5cGUgPT0gVFR5cGUuU0VUOgorICAgICAgICAgICAgKGV0eXBlLCBzaXplKSA9IHNlbGYucmVhZFNldEJlZ2luKCkKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKHNpemUpOgorICAgICAgICAgICAgICAgIHNlbGYuc2tpcChldHlwZSkKKyAgICAgICAgICAgIHNlbGYucmVhZFNldEVuZCgpCisgICAgICAgIGVsaWYgdHR5cGUgPT0gVFR5cGUuTElTVDoKKyAgICAgICAgICAgIChldHlwZSwgc2l6ZSkgPSBzZWxmLnJlYWRMaXN0QmVnaW4oKQorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2Uoc2l6ZSk6CisgICAgICAgICAgICAgICAgc2VsZi5za2lwKGV0eXBlKQorICAgICAgICAgICAgc2VsZi5yZWFkTGlzdEVuZCgpCiAKLSAgIyB0dXBsZSBvZjogKCAncmVhZGVyIG1ldGhvZCcgbmFtZSwgaXNfY29udGFpbmVyIGJvb2wsICd3cml0ZXJfbWV0aG9kJyBuYW1lICkKLSAgX1RUWVBFX0hBTkRMRVJTID0gKAotICAgICAgIChOb25lLCBOb25lLCBGYWxzZSksICAjIDAgVFR5cGUuU1RPUAotICAgICAgIChOb25lLCBOb25lLCBGYWxzZSksICAjIDEgVFR5cGUuVk9JRCAjIFRPRE86IGhhbmRsZSB2b2lkPwotICAgICAgICgncmVhZEJvb2wnLCAnd3JpdGVCb29sJywgRmFsc2UpLCAgIyAyIFRUeXBlLkJPT0wKLSAgICAgICAoJ3JlYWRCeXRlJywgICd3cml0ZUJ5dGUnLCBGYWxzZSksICAjIDMgVFR5cGUuQllURSBhbmQgSTA4Ci0gICAgICAgKCdyZWFkRG91YmxlJywgJ3dyaXRlRG91YmxlJywgRmFsc2UpLCAgIyA0IFRUeXBlLkRPVUJMRQotICAgICAgIChOb25lLCBOb25lLCBGYWxzZSksICAjIDUgdW5kZWZpbmVkCi0gICAgICAgKCdyZWFkSTE2JywgJ3dyaXRlSTE2JywgRmFsc2UpLCAgIyA2IFRUeXBlLkkxNgotICAgICAgIChOb25lLCBOb25lLCBGYWxzZSksICAjIDcgdW5kZWZpbmVkCi0gICAgICAgKCdyZWFkSTMyJywgJ3dyaXRlSTMyJywgRmFsc2UpLCAgIyA4IFRUeXBlLkkzMgotICAgICAgIChOb25lLCBOb25lLCBGYWxzZSksICAjIDkgdW5kZWZpbmVkCi0gICAgICAgKCdyZWFkSTY0JywgJ3dyaXRlSTY0JywgRmFsc2UpLCAgIyAxMCBUVHlwZS5JNjQKLSAgICAgICAoJ3JlYWRTdHJpbmcnLCAnd3JpdGVTdHJpbmcnLCBGYWxzZSksICAjIDExIFRUeXBlLlNUUklORyBhbmQgVVRGNwotICAgICAgICgncmVhZENvbnRhaW5lclN0cnVjdCcsICd3cml0ZUNvbnRhaW5lclN0cnVjdCcsIFRydWUpLCAgIyAxMiAqLlNUUlVDVAotICAgICAgICgncmVhZENvbnRhaW5lck1hcCcsICd3cml0ZUNvbnRhaW5lck1hcCcsIFRydWUpLCAgIyAxMyBUVHlwZS5NQVAKLSAgICAgICAoJ3JlYWRDb250YWluZXJTZXQnLCAnd3JpdGVDb250YWluZXJTZXQnLCBUcnVlKSwgICMgMTQgVFR5cGUuU0VUCi0gICAgICAgKCdyZWFkQ29udGFpbmVyTGlzdCcsICd3cml0ZUNvbnRhaW5lckxpc3QnLCBUcnVlKSwgICMgMTUgVFR5cGUuTElTVAotICAgICAgIChOb25lLCBOb25lLCBGYWxzZSksICAjIDE2IFRUeXBlLlVURjggIyBUT0RPOiBoYW5kbGUgdXRmOCB0eXBlcz8KLSAgICAgICAoTm9uZSwgTm9uZSwgRmFsc2UpICAjIDE3IFRUeXBlLlVURjE2ICMgVE9ETzogaGFuZGxlIHV0ZjE2IHR5cGVzPwotICAgICAgKQorICAgICMgdHVwbGUgb2Y6ICggJ3JlYWRlciBtZXRob2QnIG5hbWUsIGlzX2NvbnRhaW5lciBib29sLCAnd3JpdGVyX21ldGhvZCcgbmFtZSApCisgICAgX1RUWVBFX0hBTkRMRVJTID0gKAorICAgICAgICAoTm9uZSwgTm9uZSwgRmFsc2UpLCAgIyAwIFRUeXBlLlNUT1AKKyAgICAgICAgKE5vbmUsIE5vbmUsIEZhbHNlKSwgICMgMSBUVHlwZS5WT0lEICMgVE9ETzogaGFuZGxlIHZvaWQ/CisgICAgICAgICgncmVhZEJvb2wnLCAnd3JpdGVCb29sJywgRmFsc2UpLCAgIyAyIFRUeXBlLkJPT0wKKyAgICAgICAgKCdyZWFkQnl0ZScsICd3cml0ZUJ5dGUnLCBGYWxzZSksICAjIDMgVFR5cGUuQllURSBhbmQgSTA4CisgICAgICAgICgncmVhZERvdWJsZScsICd3cml0ZURvdWJsZScsIEZhbHNlKSwgICMgNCBUVHlwZS5ET1VCTEUKKyAgICAgICAgKE5vbmUsIE5vbmUsIEZhbHNlKSwgICMgNSB1bmRlZmluZWQKKyAgICAgICAgKCdyZWFkSTE2JywgJ3dyaXRlSTE2JywgRmFsc2UpLCAgIyA2IFRUeXBlLkkxNgorICAgICAgICAoTm9uZSwgTm9uZSwgRmFsc2UpLCAgIyA3IHVuZGVmaW5lZAorICAgICAgICAoJ3JlYWRJMzInLCAnd3JpdGVJMzInLCBGYWxzZSksICAjIDggVFR5cGUuSTMyCisgICAgICAgIChOb25lLCBOb25lLCBGYWxzZSksICAjIDkgdW5kZWZpbmVkCisgICAgICAgICgncmVhZEk2NCcsICd3cml0ZUk2NCcsIEZhbHNlKSwgICMgMTAgVFR5cGUuSTY0CisgICAgICAgICgncmVhZFN0cmluZycsICd3cml0ZVN0cmluZycsIEZhbHNlKSwgICMgMTEgVFR5cGUuU1RSSU5HIGFuZCBVVEY3CisgICAgICAgICgncmVhZENvbnRhaW5lclN0cnVjdCcsICd3cml0ZUNvbnRhaW5lclN0cnVjdCcsIFRydWUpLCAgIyAxMiAqLlNUUlVDVAorICAgICAgICAoJ3JlYWRDb250YWluZXJNYXAnLCAnd3JpdGVDb250YWluZXJNYXAnLCBUcnVlKSwgICMgMTMgVFR5cGUuTUFQCisgICAgICAgICgncmVhZENvbnRhaW5lclNldCcsICd3cml0ZUNvbnRhaW5lclNldCcsIFRydWUpLCAgIyAxNCBUVHlwZS5TRVQKKyAgICAgICAgKCdyZWFkQ29udGFpbmVyTGlzdCcsICd3cml0ZUNvbnRhaW5lckxpc3QnLCBUcnVlKSwgICMgMTUgVFR5cGUuTElTVAorICAgICAgICAoTm9uZSwgTm9uZSwgRmFsc2UpLCAgIyAxNiBUVHlwZS5VVEY4ICMgVE9ETzogaGFuZGxlIHV0ZjggdHlwZXM/CisgICAgICAgIChOb25lLCBOb25lLCBGYWxzZSkgICMgMTcgVFR5cGUuVVRGMTYgIyBUT0RPOiBoYW5kbGUgdXRmMTYgdHlwZXM/CisgICAgKQogCi0gIGRlZiByZWFkRmllbGRCeVRUeXBlKHNlbGYsIHR0eXBlLCBzcGVjKToKLSAgICB0cnk6Ci0gICAgICAocl9oYW5kbGVyLCB3X2hhbmRsZXIsIGlzX2NvbnRhaW5lcikgPSBzZWxmLl9UVFlQRV9IQU5ETEVSU1t0dHlwZV0KLSAgICBleGNlcHQgSW5kZXhFcnJvcjoKLSAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbih0eXBlPVRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT0nSW52YWxpZCBmaWVsZCB0eXBlICVkJyAlICh0dHlwZSkpCi0gICAgaWYgcl9oYW5kbGVyIGlzIE5vbmU6Ci0gICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24odHlwZT1UUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9J0ludmFsaWQgZmllbGQgdHlwZSAlZCcgJSAodHR5cGUpKQotICAgIHJlYWRlciA9IGdldGF0dHIoc2VsZiwgcl9oYW5kbGVyKQotICAgIGlmIG5vdCBpc19jb250YWluZXI6Ci0gICAgICByZXR1cm4gcmVhZGVyKCkKLSAgICByZXR1cm4gcmVhZGVyKHNwZWMpCisgICAgZGVmIF90dHlwZV9oYW5kbGVycyhzZWxmLCB0dHlwZSwgc3BlYyk6CisgICAgICAgIGlmIHNwZWMgPT0gJ0JJTkFSWSc6CisgICAgICAgICAgICBpZiB0dHlwZSAhPSBUVHlwZS5TVFJJTkc6CisgICAgICAgICAgICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uKHR5cGU9VFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT0nSW52YWxpZCBiaW5hcnkgZmllbGQgdHlwZSAlZCcgJSB0dHlwZSkKKyAgICAgICAgICAgIHJldHVybiAoJ3JlYWRCaW5hcnknLCAnd3JpdGVCaW5hcnknLCBGYWxzZSkKKyAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mb1swXSA9PSAyIGFuZCBzcGVjID09ICdVVEY4JzoKKyAgICAgICAgICAgIGlmIHR0eXBlICE9IFRUeXBlLlNUUklORzoKKyAgICAgICAgICAgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24odHlwZT1UUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlPSdJbnZhbGlkIHN0cmluZyBmaWVsZCB0eXBlICVkJyAlIHR0eXBlKQorICAgICAgICAgICAgcmV0dXJuICgncmVhZFV0ZjgnLCAnd3JpdGVVdGY4JywgRmFsc2UpCisgICAgICAgIHJldHVybiBzZWxmLl9UVFlQRV9IQU5ETEVSU1t0dHlwZV0gaWYgdHR5cGUgPCBsZW4oc2VsZi5fVFRZUEVfSEFORExFUlMpIGVsc2UgKE5vbmUsIE5vbmUsIEZhbHNlKQogCi0gIGRlZiByZWFkQ29udGFpbmVyTGlzdChzZWxmLCBzcGVjKToKLSAgICByZXN1bHRzID0gW10KLSAgICB0dHlwZSwgdHNwZWMgPSBzcGVjWzBdLCBzcGVjWzFdCi0gICAgcl9oYW5kbGVyID0gc2VsZi5fVFRZUEVfSEFORExFUlNbdHR5cGVdWzBdCi0gICAgcmVhZGVyID0gZ2V0YXR0cihzZWxmLCByX2hhbmRsZXIpCi0gICAgKGxpc3RfdHlwZSwgbGlzdF9sZW4pID0gc2VsZi5yZWFkTGlzdEJlZ2luKCkKLSAgICBpZiB0c3BlYyBpcyBOb25lOgotICAgICAgIyBsaXN0IHZhbHVlcyBhcmUgc2ltcGxlIHR5cGVzCi0gICAgICBmb3IgaWR4IGluIHhyYW5nZShsaXN0X2xlbik6Ci0gICAgICAgIHJlc3VsdHMuYXBwZW5kKHJlYWRlcigpKQotICAgIGVsc2U6Ci0gICAgICAjIHRoaXMgaXMgbGlrZSBhbiBpbmxpbmVkIHJlYWRGaWVsZEJ5VFR5cGUKLSAgICAgIGNvbnRhaW5lcl9yZWFkZXIgPSBzZWxmLl9UVFlQRV9IQU5ETEVSU1tsaXN0X3R5cGVdWzBdCi0gICAgICB2YWxfcmVhZGVyID0gZ2V0YXR0cihzZWxmLCBjb250YWluZXJfcmVhZGVyKQotICAgICAgZm9yIGlkeCBpbiB4cmFuZ2UobGlzdF9sZW4pOgotICAgICAgICB2YWwgPSB2YWxfcmVhZGVyKHRzcGVjKQotICAgICAgICByZXN1bHRzLmFwcGVuZCh2YWwpCi0gICAgc2VsZi5yZWFkTGlzdEVuZCgpCi0gICAgcmV0dXJuIHJlc3VsdHMKKyAgICBkZWYgX3JlYWRfYnlfdHR5cGUoc2VsZiwgdHR5cGUsIHNwZWMsIGVzcGVjKToKKyAgICAgICAgcmVhZGVyX25hbWUsIF8sIGlzX2NvbnRhaW5lciA9IHNlbGYuX3R0eXBlX2hhbmRsZXJzKHR0eXBlLCBlc3BlYykKKyAgICAgICAgaWYgcmVhZGVyX25hbWUgaXMgTm9uZToKKyAgICAgICAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbih0eXBlPVRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT0nSW52YWxpZCB0eXBlICVkJyAlICh0dHlwZSkpCisgICAgICAgIHJlYWRlcl9mdW5jID0gZ2V0YXR0cihzZWxmLCByZWFkZXJfbmFtZSkKKyAgICAgICAgcmVhZCA9IChsYW1iZGE6IHJlYWRlcl9mdW5jKGVzcGVjKSkgaWYgaXNfY29udGFpbmVyIGVsc2UgcmVhZGVyX2Z1bmMKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIHlpZWxkIHJlYWQoKQogCi0gIGRlZiByZWFkQ29udGFpbmVyU2V0KHNlbGYsIHNwZWMpOgotICAgIHJlc3VsdHMgPSBzZXQoKQotICAgIHR0eXBlLCB0c3BlYyA9IHNwZWNbMF0sIHNwZWNbMV0KLSAgICByX2hhbmRsZXIgPSBzZWxmLl9UVFlQRV9IQU5ETEVSU1t0dHlwZV1bMF0KLSAgICByZWFkZXIgPSBnZXRhdHRyKHNlbGYsIHJfaGFuZGxlcikKLSAgICAoc2V0X3R5cGUsIHNldF9sZW4pID0gc2VsZi5yZWFkU2V0QmVnaW4oKQotICAgIGlmIHRzcGVjIGlzIE5vbmU6Ci0gICAgICAjIHNldCBtZW1iZXJzIGFyZSBzaW1wbGUgdHlwZXMKLSAgICAgIGZvciBpZHggaW4geHJhbmdlKHNldF9sZW4pOgotICAgICAgICByZXN1bHRzLmFkZChyZWFkZXIoKSkKLSAgICBlbHNlOgotICAgICAgY29udGFpbmVyX3JlYWRlciA9IHNlbGYuX1RUWVBFX0hBTkRMRVJTW3NldF90eXBlXVswXQotICAgICAgdmFsX3JlYWRlciA9IGdldGF0dHIoc2VsZiwgY29udGFpbmVyX3JlYWRlcikKLSAgICAgIGZvciBpZHggaW4geHJhbmdlKHNldF9sZW4pOgotICAgICAgICByZXN1bHRzLmFkZCh2YWxfcmVhZGVyKHRzcGVjKSkKLSAgICBzZWxmLnJlYWRTZXRFbmQoKQotICAgIHJldHVybiByZXN1bHRzCisgICAgZGVmIHJlYWRGaWVsZEJ5VFR5cGUoc2VsZiwgdHR5cGUsIHNwZWMpOgorICAgICAgICByZXR1cm4gbmV4dChzZWxmLl9yZWFkX2J5X3R0eXBlKHR0eXBlLCBzcGVjLCBzcGVjKSkKIAotICBkZWYgcmVhZENvbnRhaW5lclN0cnVjdChzZWxmLCBzcGVjKToKLSAgICAob2JqX2NsYXNzLCBvYmpfc3BlYykgPSBzcGVjCi0gICAgb2JqID0gb2JqX2NsYXNzKCkKLSAgICBvYmoucmVhZChzZWxmKQotICAgIHJldHVybiBvYmoKKyAgICBkZWYgcmVhZENvbnRhaW5lckxpc3Qoc2VsZiwgc3BlYyk6CisgICAgICAgIHR0eXBlLCB0c3BlYywgaXNfaW1tdXRhYmxlID0gc3BlYworICAgICAgICAobGlzdF90eXBlLCBsaXN0X2xlbikgPSBzZWxmLnJlYWRMaXN0QmVnaW4oKQorICAgICAgICAjIFRPRE86IGNvbXBhcmUgdHlwZXMgd2UganVzdCBkZWNvZGVkIHdpdGggdGhyaWZ0X3NwZWMKKyAgICAgICAgZWxlbXMgPSBpc2xpY2Uoc2VsZi5fcmVhZF9ieV90dHlwZSh0dHlwZSwgc3BlYywgdHNwZWMpLCBsaXN0X2xlbikKKyAgICAgICAgcmVzdWx0cyA9ICh0dXBsZSBpZiBpc19pbW11dGFibGUgZWxzZSBsaXN0KShlbGVtcykKKyAgICAgICAgc2VsZi5yZWFkTGlzdEVuZCgpCisgICAgICAgIHJldHVybiByZXN1bHRzCiAKLSAgZGVmIHJlYWRDb250YWluZXJNYXAoc2VsZiwgc3BlYyk6Ci0gICAgcmVzdWx0cyA9IGRpY3QoKQotICAgIGtleV90dHlwZSwga2V5X3NwZWMgPSBzcGVjWzBdLCBzcGVjWzFdCi0gICAgdmFsX3R0eXBlLCB2YWxfc3BlYyA9IHNwZWNbMl0sIHNwZWNbM10KLSAgICAobWFwX2t0eXBlLCBtYXBfdnR5cGUsIG1hcF9sZW4pID0gc2VsZi5yZWFkTWFwQmVnaW4oKQotICAgICMgVE9ETzogY29tcGFyZSB0eXBlcyB3ZSBqdXN0IGRlY29kZWQgd2l0aCB0aHJpZnRfc3BlYyBhbmQKLSAgICAjIGFib3J0L3NraXAgaWYgdHlwZXMgZGlzYWdyZWUKLSAgICBrZXlfcmVhZGVyID0gZ2V0YXR0cihzZWxmLCBzZWxmLl9UVFlQRV9IQU5ETEVSU1trZXlfdHR5cGVdWzBdKQotICAgIHZhbF9yZWFkZXIgPSBnZXRhdHRyKHNlbGYsIHNlbGYuX1RUWVBFX0hBTkRMRVJTW3ZhbF90dHlwZV1bMF0pCi0gICAgIyBsaXN0IHZhbHVlcyBhcmUgc2ltcGxlIHR5cGVzCi0gICAgZm9yIGlkeCBpbiB4cmFuZ2UobWFwX2xlbik6Ci0gICAgICBpZiBrZXlfc3BlYyBpcyBOb25lOgotICAgICAgICBrX3ZhbCA9IGtleV9yZWFkZXIoKQotICAgICAgZWxzZToKLSAgICAgICAga192YWwgPSBzZWxmLnJlYWRGaWVsZEJ5VFR5cGUoa2V5X3R0eXBlLCBrZXlfc3BlYykKLSAgICAgIGlmIHZhbF9zcGVjIGlzIE5vbmU6Ci0gICAgICAgIHZfdmFsID0gdmFsX3JlYWRlcigpCi0gICAgICBlbHNlOgotICAgICAgICB2X3ZhbCA9IHNlbGYucmVhZEZpZWxkQnlUVHlwZSh2YWxfdHR5cGUsIHZhbF9zcGVjKQotICAgICAgIyB0aGlzIHJhaXNlcyBhIFR5cGVFcnJvciB3aXRoIHVuaGFzaGFibGUga2V5cyB0eXBlcwotICAgICAgIyBpLmUuIHRoaXMgZmFpbHM6IGQ9ZGljdCgpOyBkW1swLDFdXSA9IDIKLSAgICAgIHJlc3VsdHNba192YWxdID0gdl92YWwKLSAgICBzZWxmLnJlYWRNYXBFbmQoKQotICAgIHJldHVybiByZXN1bHRzCisgICAgZGVmIHJlYWRDb250YWluZXJTZXQoc2VsZiwgc3BlYyk6CisgICAgICAgIHR0eXBlLCB0c3BlYywgaXNfaW1tdXRhYmxlID0gc3BlYworICAgICAgICAoc2V0X3R5cGUsIHNldF9sZW4pID0gc2VsZi5yZWFkU2V0QmVnaW4oKQorICAgICAgICAjIFRPRE86IGNvbXBhcmUgdHlwZXMgd2UganVzdCBkZWNvZGVkIHdpdGggdGhyaWZ0X3NwZWMKKyAgICAgICAgZWxlbXMgPSBpc2xpY2Uoc2VsZi5fcmVhZF9ieV90dHlwZSh0dHlwZSwgc3BlYywgdHNwZWMpLCBzZXRfbGVuKQorICAgICAgICByZXN1bHRzID0gKGZyb3plbnNldCBpZiBpc19pbW11dGFibGUgZWxzZSBzZXQpKGVsZW1zKQorICAgICAgICBzZWxmLnJlYWRTZXRFbmQoKQorICAgICAgICByZXR1cm4gcmVzdWx0cwogCi0gIGRlZiByZWFkU3RydWN0KHNlbGYsIG9iaiwgdGhyaWZ0X3NwZWMpOgotICAgIHNlbGYucmVhZFN0cnVjdEJlZ2luKCkKLSAgICB3aGlsZSBUcnVlOgotICAgICAgKGZuYW1lLCBmdHlwZSwgZmlkKSA9IHNlbGYucmVhZEZpZWxkQmVnaW4oKQotICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuU1RPUDoKLSAgICAgICAgYnJlYWsKLSAgICAgIHRyeToKLSAgICAgICAgZmllbGQgPSB0aHJpZnRfc3BlY1tmaWRdCi0gICAgICBleGNlcHQgSW5kZXhFcnJvcjoKLSAgICAgICAgc2VsZi5za2lwKGZ0eXBlKQotICAgICAgZWxzZToKLSAgICAgICAgaWYgZmllbGQgaXMgbm90IE5vbmUgYW5kIGZ0eXBlID09IGZpZWxkWzFdOgotICAgICAgICAgIGZuYW1lID0gZmllbGRbMl0KLSAgICAgICAgICBmc3BlYyA9IGZpZWxkWzNdCi0gICAgICAgICAgdmFsID0gc2VsZi5yZWFkRmllbGRCeVRUeXBlKGZ0eXBlLCBmc3BlYykKLSAgICAgICAgICBzZXRhdHRyKG9iaiwgZm5hbWUsIHZhbCkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICBzZWxmLnNraXAoZnR5cGUpCi0gICAgICBzZWxmLnJlYWRGaWVsZEVuZCgpCi0gICAgc2VsZi5yZWFkU3RydWN0RW5kKCkKKyAgICBkZWYgcmVhZENvbnRhaW5lclN0cnVjdChzZWxmLCBzcGVjKToKKyAgICAgICAgKG9ial9jbGFzcywgb2JqX3NwZWMpID0gc3BlYworICAgICAgICBvYmogPSBvYmpfY2xhc3MoKQorICAgICAgICBvYmoucmVhZChzZWxmKQorICAgICAgICByZXR1cm4gb2JqCiAKLSAgZGVmIHdyaXRlQ29udGFpbmVyU3RydWN0KHNlbGYsIHZhbCwgc3BlYyk6Ci0gICAgdmFsLndyaXRlKHNlbGYpCisgICAgZGVmIHJlYWRDb250YWluZXJNYXAoc2VsZiwgc3BlYyk6CisgICAgICAgIGt0eXBlLCBrc3BlYywgdnR5cGUsIHZzcGVjLCBpc19pbW11dGFibGUgPSBzcGVjCisgICAgICAgIChtYXBfa3R5cGUsIG1hcF92dHlwZSwgbWFwX2xlbikgPSBzZWxmLnJlYWRNYXBCZWdpbigpCisgICAgICAgICMgVE9ETzogY29tcGFyZSB0eXBlcyB3ZSBqdXN0IGRlY29kZWQgd2l0aCB0aHJpZnRfc3BlYyBhbmQKKyAgICAgICAgIyBhYm9ydC9za2lwIGlmIHR5cGVzIGRpc2FncmVlCisgICAgICAgIGtleXMgPSBzZWxmLl9yZWFkX2J5X3R0eXBlKGt0eXBlLCBzcGVjLCBrc3BlYykKKyAgICAgICAgdmFscyA9IHNlbGYuX3JlYWRfYnlfdHR5cGUodnR5cGUsIHNwZWMsIHZzcGVjKQorICAgICAgICBrZXl2YWxzID0gaXNsaWNlKHppcChrZXlzLCB2YWxzKSwgbWFwX2xlbikKKyAgICAgICAgcmVzdWx0cyA9IChURnJvemVuRGljdCBpZiBpc19pbW11dGFibGUgZWxzZSBkaWN0KShrZXl2YWxzKQorICAgICAgICBzZWxmLnJlYWRNYXBFbmQoKQorICAgICAgICByZXR1cm4gcmVzdWx0cwogCi0gIGRlZiB3cml0ZUNvbnRhaW5lckxpc3Qoc2VsZiwgdmFsLCBzcGVjKToKLSAgICBzZWxmLndyaXRlTGlzdEJlZ2luKHNwZWNbMF0sIGxlbih2YWwpKQotICAgIHJfaGFuZGxlciwgd19oYW5kbGVyLCBpc19jb250YWluZXIgPSBzZWxmLl9UVFlQRV9IQU5ETEVSU1tzcGVjWzBdXQotICAgIGVfd3JpdGVyID0gZ2V0YXR0cihzZWxmLCB3X2hhbmRsZXIpCi0gICAgaWYgbm90IGlzX2NvbnRhaW5lcjoKLSAgICAgIGZvciBlbGVtIGluIHZhbDoKLSAgICAgICAgZV93cml0ZXIoZWxlbSkKLSAgICBlbHNlOgotICAgICAgZm9yIGVsZW0gaW4gdmFsOgotICAgICAgICBlX3dyaXRlcihlbGVtLCBzcGVjWzFdKQotICAgIHNlbGYud3JpdGVMaXN0RW5kKCkKKyAgICBkZWYgcmVhZFN0cnVjdChzZWxmLCBvYmosIHRocmlmdF9zcGVjLCBpc19pbW11dGFibGU9RmFsc2UpOgorICAgICAgICBpZiBpc19pbW11dGFibGU6CisgICAgICAgICAgICBmaWVsZHMgPSB7fQorICAgICAgICBzZWxmLnJlYWRTdHJ1Y3RCZWdpbigpCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAoZm5hbWUsIGZ0eXBlLCBmaWQpID0gc2VsZi5yZWFkRmllbGRCZWdpbigpCisgICAgICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5TVE9QOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZmllbGQgPSB0aHJpZnRfc3BlY1tmaWRdCisgICAgICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoKKyAgICAgICAgICAgICAgICBzZWxmLnNraXAoZnR5cGUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIGZpZWxkIGlzIG5vdCBOb25lIGFuZCBmdHlwZSA9PSBmaWVsZFsxXToKKyAgICAgICAgICAgICAgICAgICAgZm5hbWUgPSBmaWVsZFsyXQorICAgICAgICAgICAgICAgICAgICBmc3BlYyA9IGZpZWxkWzNdCisgICAgICAgICAgICAgICAgICAgIHZhbCA9IHNlbGYucmVhZEZpZWxkQnlUVHlwZShmdHlwZSwgZnNwZWMpCisgICAgICAgICAgICAgICAgICAgIGlmIGlzX2ltbXV0YWJsZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkc1tmbmFtZV0gPSB2YWwKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldGF0dHIob2JqLCBmbmFtZSwgdmFsKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc2tpcChmdHlwZSkKKyAgICAgICAgICAgIHNlbGYucmVhZEZpZWxkRW5kKCkKKyAgICAgICAgc2VsZi5yZWFkU3RydWN0RW5kKCkKKyAgICAgICAgaWYgaXNfaW1tdXRhYmxlOgorICAgICAgICAgICAgcmV0dXJuIG9iaigqKmZpZWxkcykKIAotICBkZWYgd3JpdGVDb250YWluZXJTZXQoc2VsZiwgdmFsLCBzcGVjKToKLSAgICBzZWxmLndyaXRlU2V0QmVnaW4oc3BlY1swXSwgbGVuKHZhbCkpCi0gICAgcl9oYW5kbGVyLCB3X2hhbmRsZXIsIGlzX2NvbnRhaW5lciA9IHNlbGYuX1RUWVBFX0hBTkRMRVJTW3NwZWNbMF1dCi0gICAgZV93cml0ZXIgPSBnZXRhdHRyKHNlbGYsIHdfaGFuZGxlcikKLSAgICBpZiBub3QgaXNfY29udGFpbmVyOgotICAgICAgZm9yIGVsZW0gaW4gdmFsOgotICAgICAgICBlX3dyaXRlcihlbGVtKQotICAgIGVsc2U6Ci0gICAgICBmb3IgZWxlbSBpbiB2YWw6Ci0gICAgICAgIGVfd3JpdGVyKGVsZW0sIHNwZWNbMV0pCi0gICAgc2VsZi53cml0ZVNldEVuZCgpCisgICAgZGVmIHdyaXRlQ29udGFpbmVyU3RydWN0KHNlbGYsIHZhbCwgc3BlYyk6CisgICAgICAgIHZhbC53cml0ZShzZWxmKQogCi0gIGRlZiB3cml0ZUNvbnRhaW5lck1hcChzZWxmLCB2YWwsIHNwZWMpOgotICAgIGtfdHlwZSA9IHNwZWNbMF0KLSAgICB2X3R5cGUgPSBzcGVjWzJdCi0gICAgaWdub3JlLCBrdHlwZV9uYW1lLCBrX2lzX2NvbnRhaW5lciA9IHNlbGYuX1RUWVBFX0hBTkRMRVJTW2tfdHlwZV0KLSAgICBpZ25vcmUsIHZ0eXBlX25hbWUsIHZfaXNfY29udGFpbmVyID0gc2VsZi5fVFRZUEVfSEFORExFUlNbdl90eXBlXQotICAgIGtfd3JpdGVyID0gZ2V0YXR0cihzZWxmLCBrdHlwZV9uYW1lKQotICAgIHZfd3JpdGVyID0gZ2V0YXR0cihzZWxmLCB2dHlwZV9uYW1lKQotICAgIHNlbGYud3JpdGVNYXBCZWdpbihrX3R5cGUsIHZfdHlwZSwgbGVuKHZhbCkpCi0gICAgZm9yIG1fa2V5LCBtX3ZhbCBpbiB2YWwuaXRlcml0ZW1zKCk6Ci0gICAgICBpZiBub3Qga19pc19jb250YWluZXI6Ci0gICAgICAgIGtfd3JpdGVyKG1fa2V5KQotICAgICAgZWxzZToKLSAgICAgICAga193cml0ZXIobV9rZXksIHNwZWNbMV0pCi0gICAgICBpZiBub3Qgdl9pc19jb250YWluZXI6Ci0gICAgICAgIHZfd3JpdGVyKG1fdmFsKQotICAgICAgZWxzZToKLSAgICAgICAgdl93cml0ZXIobV92YWwsIHNwZWNbM10pCi0gICAgc2VsZi53cml0ZU1hcEVuZCgpCisgICAgZGVmIHdyaXRlQ29udGFpbmVyTGlzdChzZWxmLCB2YWwsIHNwZWMpOgorICAgICAgICB0dHlwZSwgdHNwZWMsIF8gPSBzcGVjCisgICAgICAgIHNlbGYud3JpdGVMaXN0QmVnaW4odHR5cGUsIGxlbih2YWwpKQorICAgICAgICBmb3IgXyBpbiBzZWxmLl93cml0ZV9ieV90dHlwZSh0dHlwZSwgdmFsLCBzcGVjLCB0c3BlYyk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHNlbGYud3JpdGVMaXN0RW5kKCkKIAotICBkZWYgd3JpdGVTdHJ1Y3Qoc2VsZiwgb2JqLCB0aHJpZnRfc3BlYyk6Ci0gICAgc2VsZi53cml0ZVN0cnVjdEJlZ2luKG9iai5fX2NsYXNzX18uX19uYW1lX18pCi0gICAgZm9yIGZpZWxkIGluIHRocmlmdF9zcGVjOgotICAgICAgaWYgZmllbGQgaXMgTm9uZToKLSAgICAgICAgY29udGludWUKLSAgICAgIGZuYW1lID0gZmllbGRbMl0KLSAgICAgIHZhbCA9IGdldGF0dHIob2JqLCBmbmFtZSkKLSAgICAgIGlmIHZhbCBpcyBOb25lOgotICAgICAgICAjIHNraXAgd3JpdGluZyBvdXQgdW5zZXQgZmllbGRzCi0gICAgICAgIGNvbnRpbnVlCi0gICAgICBmaWQgPSBmaWVsZFswXQotICAgICAgZnR5cGUgPSBmaWVsZFsxXQotICAgICAgZnNwZWMgPSBmaWVsZFszXQotICAgICAgIyBnZXQgdGhlIHdyaXRlciBtZXRob2QgZm9yIHRoaXMgdmFsdWUKLSAgICAgIHNlbGYud3JpdGVGaWVsZEJlZ2luKGZuYW1lLCBmdHlwZSwgZmlkKQotICAgICAgc2VsZi53cml0ZUZpZWxkQnlUVHlwZShmdHlwZSwgdmFsLCBmc3BlYykKLSAgICAgIHNlbGYud3JpdGVGaWVsZEVuZCgpCi0gICAgc2VsZi53cml0ZUZpZWxkU3RvcCgpCi0gICAgc2VsZi53cml0ZVN0cnVjdEVuZCgpCisgICAgZGVmIHdyaXRlQ29udGFpbmVyU2V0KHNlbGYsIHZhbCwgc3BlYyk6CisgICAgICAgIHR0eXBlLCB0c3BlYywgXyA9IHNwZWMKKyAgICAgICAgc2VsZi53cml0ZVNldEJlZ2luKHR0eXBlLCBsZW4odmFsKSkKKyAgICAgICAgZm9yIF8gaW4gc2VsZi5fd3JpdGVfYnlfdHR5cGUodHR5cGUsIHZhbCwgc3BlYywgdHNwZWMpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLndyaXRlU2V0RW5kKCkKIAotICBkZWYgd3JpdGVGaWVsZEJ5VFR5cGUoc2VsZiwgdHR5cGUsIHZhbCwgc3BlYyk6Ci0gICAgcl9oYW5kbGVyLCB3X2hhbmRsZXIsIGlzX2NvbnRhaW5lciA9IHNlbGYuX1RUWVBFX0hBTkRMRVJTW3R0eXBlXQotICAgIHdyaXRlciA9IGdldGF0dHIoc2VsZiwgd19oYW5kbGVyKQotICAgIGlmIGlzX2NvbnRhaW5lcjoKLSAgICAgIHdyaXRlcih2YWwsIHNwZWMpCi0gICAgZWxzZToKLSAgICAgIHdyaXRlcih2YWwpCisgICAgZGVmIHdyaXRlQ29udGFpbmVyTWFwKHNlbGYsIHZhbCwgc3BlYyk6CisgICAgICAgIGt0eXBlLCBrc3BlYywgdnR5cGUsIHZzcGVjLCBfID0gc3BlYworICAgICAgICBzZWxmLndyaXRlTWFwQmVnaW4oa3R5cGUsIHZ0eXBlLCBsZW4odmFsKSkKKyAgICAgICAgZm9yIF8gaW4gemlwKHNlbGYuX3dyaXRlX2J5X3R0eXBlKGt0eXBlLCBzaXguaXRlcmtleXModmFsKSwgc3BlYywga3NwZWMpLAorICAgICAgICAgICAgICAgICAgICAgc2VsZi5fd3JpdGVfYnlfdHR5cGUodnR5cGUsIHNpeC5pdGVydmFsdWVzKHZhbCksIHNwZWMsIHZzcGVjKSk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHNlbGYud3JpdGVNYXBFbmQoKQorCisgICAgZGVmIHdyaXRlU3RydWN0KHNlbGYsIG9iaiwgdGhyaWZ0X3NwZWMpOgorICAgICAgICBzZWxmLndyaXRlU3RydWN0QmVnaW4ob2JqLl9fY2xhc3NfXy5fX25hbWVfXykKKyAgICAgICAgZm9yIGZpZWxkIGluIHRocmlmdF9zcGVjOgorICAgICAgICAgICAgaWYgZmllbGQgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZm5hbWUgPSBmaWVsZFsyXQorICAgICAgICAgICAgdmFsID0gZ2V0YXR0cihvYmosIGZuYW1lKQorICAgICAgICAgICAgaWYgdmFsIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgIyBza2lwIHdyaXRpbmcgb3V0IHVuc2V0IGZpZWxkcworICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBmaWQgPSBmaWVsZFswXQorICAgICAgICAgICAgZnR5cGUgPSBmaWVsZFsxXQorICAgICAgICAgICAgZnNwZWMgPSBmaWVsZFszXQorICAgICAgICAgICAgc2VsZi53cml0ZUZpZWxkQmVnaW4oZm5hbWUsIGZ0eXBlLCBmaWQpCisgICAgICAgICAgICBzZWxmLndyaXRlRmllbGRCeVRUeXBlKGZ0eXBlLCB2YWwsIGZzcGVjKQorICAgICAgICAgICAgc2VsZi53cml0ZUZpZWxkRW5kKCkKKyAgICAgICAgc2VsZi53cml0ZUZpZWxkU3RvcCgpCisgICAgICAgIHNlbGYud3JpdGVTdHJ1Y3RFbmQoKQorCisgICAgZGVmIF93cml0ZV9ieV90dHlwZShzZWxmLCB0dHlwZSwgdmFscywgc3BlYywgZXNwZWMpOgorICAgICAgICBfLCB3cml0ZXJfbmFtZSwgaXNfY29udGFpbmVyID0gc2VsZi5fdHR5cGVfaGFuZGxlcnModHR5cGUsIGVzcGVjKQorICAgICAgICB3cml0ZXJfZnVuYyA9IGdldGF0dHIoc2VsZiwgd3JpdGVyX25hbWUpCisgICAgICAgIHdyaXRlID0gKGxhbWJkYSB2OiB3cml0ZXJfZnVuYyh2LCBlc3BlYykpIGlmIGlzX2NvbnRhaW5lciBlbHNlIHdyaXRlcl9mdW5jCisgICAgICAgIGZvciB2IGluIHZhbHM6CisgICAgICAgICAgICB5aWVsZCB3cml0ZSh2KQorCisgICAgZGVmIHdyaXRlRmllbGRCeVRUeXBlKHNlbGYsIHR0eXBlLCB2YWwsIHNwZWMpOgorICAgICAgICBuZXh0KHNlbGYuX3dyaXRlX2J5X3R0eXBlKHR0eXBlLCBbdmFsXSwgc3BlYywgc3BlYykpCisKIAogZGVmIGNoZWNrSW50ZWdlckxpbWl0cyhpLCBiaXRzKToKICAgICBpZiBiaXRzID09IDggYW5kIChpIDwgLTEyOCBvciBpID4gMTI3KToKQEAgLTQxMyw5ICs0MTEsMTAgQEAKICAgICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaTMyIHJlcXVpcmVzIC0yMTQ3NDgzNjQ4IDw9IG51bWJlciA8PSAyMTQ3NDgzNjQ3IikKICAgICBlbGlmIGJpdHMgPT0gNjQgYW5kIChpIDwgLTkyMjMzNzIwMzY4NTQ3NzU4MDggb3IgaSA+IDkyMjMzNzIwMzY4NTQ3NzU4MDcpOgotICAgICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImk2NCByZXF1aXJlcyAtOTIyMzM3MjAzNjg1NDc3NTgwOCA8PSBudW1iZXIgPD0gOTIyMzM3MjAzNjg1NDc3NTgwNyIpCisgICAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImk2NCByZXF1aXJlcyAtOTIyMzM3MjAzNjg1NDc3NTgwOCA8PSBudW1iZXIgPD0gOTIyMzM3MjAzNjg1NDc3NTgwNyIpCiAKLWNsYXNzIFRQcm90b2NvbEZhY3Rvcnk6Ci0gIGRlZiBnZXRQcm90b2NvbChzZWxmLCB0cmFucyk6Ci0gICAgcGFzcworCitjbGFzcyBUUHJvdG9jb2xGYWN0b3J5KG9iamVjdCk6CisgICAgZGVmIGdldFByb3RvY29sKHNlbGYsIHRyYW5zKToKKyAgICAgICAgcGFzcwpkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9wcm90b2NvbC9UUHJvdG9jb2xEZWNvcmF0b3IucHkgYi9saWIvcHkvc3JjL3Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5weQppbmRleCAzZTllNTAwLi5mNTU0NmM3IDEwMDY0NAotLS0gYS9saWIvcHkvc3JjL3Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5weQorKysgYi9saWIvcHkvc3JjL3Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5weQpAQCAtMTcsMjYgKzE3LDEwIEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1mcm9tIHRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgaW1wb3J0IFRQcm90b2NvbEJhc2UKLWZyb20gdHlwZXMgaW1wb3J0ICoKIAotY2xhc3MgVFByb3RvY29sRGVjb3JhdG9yKCk6Ci0gIGRlZiBfX2luaXRfXyhzZWxmLCBwcm90b2NvbCk6Ci0gICAgVFByb3RvY29sQmFzZShwcm90b2NvbCkKLSAgICBzZWxmLnByb3RvY29sID0gcHJvdG9jb2wKLQotICBkZWYgX19nZXRhdHRyX18oc2VsZiwgbmFtZSk6Ci0gICAgaWYgaGFzYXR0cihzZWxmLnByb3RvY29sLCBuYW1lKToKLSAgICAgIG1lbWJlciA9IGdldGF0dHIoc2VsZi5wcm90b2NvbCwgbmFtZSkKLSAgICAgIGlmIHR5cGUobWVtYmVyKSBpbiBbTWV0aG9kVHlwZSwgVW5ib3VuZE1ldGhvZFR5cGUsIEZ1bmN0aW9uVHlwZSwgTGFtYmRhVHlwZSwgQnVpbHRpbkZ1bmN0aW9uVHlwZSwgQnVpbHRpbk1ldGhvZFR5cGVdOgotICAgICAgICByZXR1cm4gbGFtYmRhICphcmdzLCAqKmt3YXJnczogc2VsZi5fd3JhcChtZW1iZXIsIGFyZ3MsIGt3YXJncykKLSAgICAgIGVsc2U6Ci0gICAgICAgIHJldHVybiBtZW1iZXIKLSAgICByYWlzZSBBdHRyaWJ1dGVFcnJvcihuYW1lKQotCi0gIGRlZiBfd3JhcChzZWxmLCBmdW5jLCBhcmdzLCBrd2FyZ3MpOgotICAgIGlmIHR5cGUoZnVuYykgPT0gTWV0aG9kVHlwZToKLSAgICAgIHJlc3VsdCA9IGZ1bmMoKmFyZ3MsICoqa3dhcmdzKQotICAgIGVsc2U6Ci0gICAgICByZXN1bHQgPSBmdW5jKHNlbGYucHJvdG9jb2wsICphcmdzLCAqKmt3YXJncykKLSAgICByZXR1cm4gcmVzdWx0CitjbGFzcyBUUHJvdG9jb2xEZWNvcmF0b3Iob2JqZWN0KToKKyAgICBkZWYgX19uZXdfXyhjbHMsIHByb3RvY29sLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICBkZWNvcmF0ZWRfY2xzID0gdHlwZSgnJy5qb2luKFsnRGVjb3JhdGVkJywgcHJvdG9jb2wuX19jbGFzc19fLl9fbmFtZV9fXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbHMsIHByb3RvY29sLl9fY2xhc3NfXyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sLl9fZGljdF9fKQorICAgICAgICByZXR1cm4gb2JqZWN0Ll9fbmV3X18oZGVjb3JhdGVkX2NscykKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvcHJvdG9jb2wvX19pbml0X18ucHkgYi9saWIvcHkvc3JjL3Byb3RvY29sL19faW5pdF9fLnB5CmluZGV4IDdlZWZiNDUuLjcxNDhmNjYgMTAwNjQ0Ci0tLSBhL2xpYi9weS9zcmMvcHJvdG9jb2wvX19pbml0X18ucHkKKysrIGIvbGliL3B5L3NyYy9wcm90b2NvbC9fX2luaXRfXy5weQpAQCAtMTcsNCArMTcsNSBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotX19hbGxfXyA9IFsnZmFzdGJpbmFyeScsICdUQmFzZScsICdUQmluYXJ5UHJvdG9jb2wnLCAnVENvbXBhY3RQcm90b2NvbCcsICdUSlNPTlByb3RvY29sJywgJ1RQcm90b2NvbCddCitfX2FsbF9fID0gWydmYXN0YmluYXJ5JywgJ1RCYXNlJywgJ1RCaW5hcnlQcm90b2NvbCcsICdUQ29tcGFjdFByb3RvY29sJywKKyAgICAgICAgICAgJ1RKU09OUHJvdG9jb2wnLCAnVFByb3RvY29sJ10KZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvcHJvdG9jb2wvZmFzdGJpbmFyeS5jIGIvbGliL3B5L3NyYy9wcm90b2NvbC9mYXN0YmluYXJ5LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjZTU2NjAuLjAwMDAwMDAKLS0tIGEvbGliL3B5L3NyYy9wcm90b2NvbC9mYXN0YmluYXJ5LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjE5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPFB5dGhvbi5oPgotI2luY2x1ZGUgImNTdHJpbmdJTy5oIgotI2luY2x1ZGUgPHN0ZGludC5oPgotI2lmbmRlZiBfV0lOMzIKLSMgaW5jbHVkZSA8c3RkYm9vbC5oPgotIyBpbmNsdWRlIDxuZXRpbmV0L2luLmg+Ci0jZWxzZQotIyBpbmNsdWRlIDxXaW5Tb2NrMi5oPgotIyBwcmFnbWEgY29tbWVudCAobGliLCAid3MyXzMyLmxpYiIpCi0jIGRlZmluZSBCSUdfRU5ESUFOICg0MzIxKQotIyBkZWZpbmUgTElUVExFX0VORElBTiAoMTIzNCkKLSMgZGVmaW5lIEJZVEVfT1JERVIgTElUVExFX0VORElBTgotIyBpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiBfTVNDX1ZFUiA8IDE2MDAKLSAgIHR5cGVkZWYgaW50IF9Cb29sOwotIyAgZGVmaW5lIGJvb2wgX0Jvb2wKLSMgIGRlZmluZSBmYWxzZSAwIAotIyAgZGVmaW5lIHRydWUgMQotIyBlbmRpZgotIyBkZWZpbmUgaW5saW5lIF9faW5saW5lCi0jZW5kaWYKLQotLyogRml4IGVuZGlhbm5lc3MgaXNzdWVzIG9uIFNvbGFyaXMgKi8KLSNpZiBkZWZpbmVkIChfX1NWUjQpICYmIGRlZmluZWQgKF9fc3VuKQotICNpZiBkZWZpbmVkKF9faTM4NikgJiYgIWRlZmluZWQoX19pMzg2X18pCi0gICNkZWZpbmUgX19pMzg2X18KLSAjZW5kaWYKLQotICNpZm5kZWYgQklHX0VORElBTgotICAjZGVmaW5lIEJJR19FTkRJQU4gKDQzMjEpCi0gI2VuZGlmCi0gI2lmbmRlZiBMSVRUTEVfRU5ESUFOCi0gICNkZWZpbmUgTElUVExFX0VORElBTiAoMTIzNCkKLSAjZW5kaWYKLQotIC8qIEkzODYgaXMgTEUsIGV2ZW4gb24gU29sYXJpcyAqLwotICNpZiAhZGVmaW5lZChCWVRFX09SREVSKSAmJiBkZWZpbmVkKF9faTM4Nl9fKQotICAjZGVmaW5lIEJZVEVfT1JERVIgTElUVExFX0VORElBTgotICNlbmRpZgotI2VuZGlmCi0KLS8vIFRPRE8oZHJlaXNzKTogZGVmdmFsIGFwcGVhcnMgdG8gYmUgdW51c2VkLiAgTG9vayBpbnRvIHJlbW92aW5nIGl0LgotLy8gVE9ETyhkcmVpc3MpOiBNYWtlIHBhcnNlX3NwZWNfYXJncyByZWN1cnNpdmUsIGFuZCBjYWNoZSB0aGUgb3V0cHV0Ci0vLyAgICAgICAgICAgICAgIHBlcm1hbmVudGx5IGluIHRoZSBvYmplY3QuICAoTWFsbG9jIGFuZCBvcnBoYW4uKQotLy8gVE9ETyhkcmVpc3MpOiBXaHkgZG8gd2UgbmVlZCBjU3RyaW5nSU8gZm9yIHJlYWRpbmcsIHdoeSBub3QganVzdCBjaGFyKj8KLS8vICAgICAgICAgICAgICAgQ2FuIGNTdHJpbmdJTyBsZXQgdXMgd29yayB3aXRoIGEgQnVmZmVyZWRUcmFuc3BvcnQ/Ci0vLyBUT0RPKGRyZWlzcyk6IERvbid0IGlnbm9yZSB0aGUgcnYgZnJvbSBjd3JpdGUgKG1heWJlKS4KLQotLyogPT09PT09IEJFR0lOIFVUSUxJVElFUyA9PT09PT0gKi8KLQotI2RlZmluZSBJTklUX09VVEJVRl9TSVpFIDEyOAotCi0vLyBTdG9sZW4gb3V0IG9mIFRQcm90b2NvbC5oLgotLy8gSXQgd291bGQgYmUgYSBodWdlIHBhaW4gdG8gaGF2ZSBib3RoIGdldCB0aGlzIGZyb20gb25lIHBsYWNlLgotdHlwZWRlZiBlbnVtIFRUeXBlIHsKLSAgVF9TVE9QICAgICAgID0gMCwKLSAgVF9WT0lEICAgICAgID0gMSwKLSAgVF9CT09MICAgICAgID0gMiwKLSAgVF9CWVRFICAgICAgID0gMywKLSAgVF9JMDggICAgICAgID0gMywKLSAgVF9JMTYgICAgICAgID0gNiwKLSAgVF9JMzIgICAgICAgID0gOCwKLSAgVF9VNjQgICAgICAgID0gOSwKLSAgVF9JNjQgICAgICAgID0gMTAsCi0gIFRfRE9VQkxFICAgICA9IDQsCi0gIFRfU1RSSU5HICAgICA9IDExLAotICBUX1VURjcgICAgICAgPSAxMSwKLSAgVF9TVFJVQ1QgICAgID0gMTIsCi0gIFRfTUFQICAgICAgICA9IDEzLAotICBUX1NFVCAgICAgICAgPSAxNCwKLSAgVF9MSVNUICAgICAgID0gMTUsCi0gIFRfVVRGOCAgICAgICA9IDE2LAotICBUX1VURjE2ICAgICAgPSAxNwotfSBUVHlwZTsKLQotI2lmbmRlZiBfX0JZVEVfT1JERVIKLSMgaWYgZGVmaW5lZChCWVRFX09SREVSKSAmJiBkZWZpbmVkKExJVFRMRV9FTkRJQU4pICYmIGRlZmluZWQoQklHX0VORElBTikKLSMgIGRlZmluZSBfX0JZVEVfT1JERVIgQllURV9PUkRFUgotIyAgZGVmaW5lIF9fTElUVExFX0VORElBTiBMSVRUTEVfRU5ESUFOCi0jICBkZWZpbmUgX19CSUdfRU5ESUFOIEJJR19FTkRJQU4KLSMgZWxzZQotIyAgZXJyb3IgIkNhbm5vdCBkZXRlcm1pbmUgZW5kaWFubmVzcyIKLSMgZW5kaWYKLSNlbmRpZgotCi0vLyBTYW1lIGNvbW1lbnQgYXMgdGhlIGVudW0uICBTb3JyeS4KLSNpZiBfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOCi0jIGRlZmluZSBudG9obGwobikgKG4pCi0jIGRlZmluZSBodG9ubGwobikgKG4pCi0jZWxpZiBfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOCi0jIGlmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19HTElCQ19fKQotIyAgaW5jbHVkZSA8Ynl0ZXN3YXAuaD4KLSMgIGRlZmluZSBudG9obGwobikgYnN3YXBfNjQobikKLSMgIGRlZmluZSBodG9ubGwobikgYnN3YXBfNjQobikKLSMgZWxzZSAvKiBHTlVDICYgR0xJQkMgKi8KLSMgIGRlZmluZSBudG9obGwobikgKCAoKCh1bnNpZ25lZCBsb25nIGxvbmcpbnRvaGwobikpIDw8IDMyKSArIG50b2hsKG4gPj4gMzIpICkKLSMgIGRlZmluZSBodG9ubGwobikgKCAoKCh1bnNpZ25lZCBsb25nIGxvbmcpaHRvbmwobikpIDw8IDMyKSArIGh0b25sKG4gPj4gMzIpICkKLSMgZW5kaWYgLyogR05VQyAmIEdMSUJDICovCi0jZWxzZSAvKiBfX0JZVEVfT1JERVIgKi8KLSMgZXJyb3IgIkNhbid0IGRlZmluZSBodG9ubGwgb3IgbnRvaGxsISIKLSNlbmRpZgotCi0vLyBEb2luZyBhIGJlbmNobWFyayBzaG93cyB0aGF0IGludGVybmluZyBhY3R1YWxseSBtYWtlcyBhIGRpZmZlcmVuY2UsIGFtYXppbmdseS4KLSNkZWZpbmUgSU5URVJOX1NUUklORyh2YWx1ZSkgX2ludGVybl8gIyMgdmFsdWUKLQotI2RlZmluZSBJTlRfQ09OVl9FUlJPUl9PQ0NVUlJFRCh2KSAoICgodikgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkgKQotI2RlZmluZSBDSEVDS19SQU5HRSh2LCBtaW4sIG1heCkgKCAoKHYpIDw9IChtYXgpKSAmJiAoKHYpID49IChtaW4pKSApCi0KLS8vIFB5X3NzaXplX3Qgd2FzIG5vdCBkZWZpbmVkIGJlZm9yZSBQeXRob24gMi41Ci0jaWYgKFBZX1ZFUlNJT05fSEVYIDwgMHgwMjA1MDAwMCkKLXR5cGVkZWYgaW50IFB5X3NzaXplX3Q7Ci0jZW5kaWYKLQotLyoqCi0gKiBBIGNhY2hlIG9mIHRoZSBzcGVjX2FyZ3MgZm9yIGEgc2V0IG9yIGxpc3QsCi0gKiBzbyB3ZSBkb24ndCBoYXZlIHRvIGtlZXAgY2FsbGluZyBQeVR1cGxlX0dFVF9JVEVNLgotICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIFRUeXBlIGVsZW1lbnRfdHlwZTsKLSAgUHlPYmplY3QqIHR5cGVhcmdzOwotfSBTZXRMaXN0VHlwZUFyZ3M7Ci0KLS8qKgotICogQSBjYWNoZSBvZiB0aGUgc3BlY19hcmdzIGZvciBhIG1hcCwKLSAqIHNvIHdlIGRvbid0IGhhdmUgdG8ga2VlcCBjYWxsaW5nIFB5VHVwbGVfR0VUX0lURU0uCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgVFR5cGUga3RhZzsKLSAgVFR5cGUgdnRhZzsKLSAgUHlPYmplY3QqIGt0eXBlYXJnczsKLSAgUHlPYmplY3QqIHZ0eXBlYXJnczsKLX0gTWFwVHlwZUFyZ3M7Ci0KLS8qKgotICogQSBjYWNoZSBvZiB0aGUgc3BlY19hcmdzIGZvciBhIHN0cnVjdCwKLSAqIHNvIHdlIGRvbid0IGhhdmUgdG8ga2VlcCBjYWxsaW5nIFB5VHVwbGVfR0VUX0lURU0uCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgUHlPYmplY3QqIGtsYXNzOwotICBQeU9iamVjdCogc3BlYzsKLX0gU3RydWN0VHlwZUFyZ3M7Ci0KLS8qKgotICogQSBjYWNoZSBvZiB0aGUgaXRlbSBzcGVjIGZyb20gYSBzdHJ1Y3Qgc3BlY2lmaWNhdGlvbiwKLSAqIHNvIHdlIGRvbid0IGhhdmUgdG8ga2VlcCBjYWxsaW5nIFB5VHVwbGVfR0VUX0lURU0uCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgaW50IHRhZzsKLSAgVFR5cGUgdHlwZTsKLSAgUHlPYmplY3QqIGF0dHJuYW1lOwotICBQeU9iamVjdCogdHlwZWFyZ3M7Ci0gIFB5T2JqZWN0KiBkZWZ2YWw7Ci19IFN0cnVjdEl0ZW1TcGVjOwotCi0vKioKLSAqIEEgY2FjaGUgb2YgdGhlIHR3byBrZXkgYXR0cmlidXRlcyBvZiBhIENSZWFkYWJsZVRyYW5zcG9ydCwKLSAqIHNvIHdlIGRvbid0IGhhdmUgdG8ga2VlcCBjYWxsaW5nIFB5T2JqZWN0X0dldEF0dHIuCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgUHlPYmplY3QqIHN0cmluZ2lvYnVmOwotICBQeU9iamVjdCogcmVmaWxsX2NhbGxhYmxlOwotfSBEZWNvZGVCdWZmZXI7Ci0KLS8qKiBQb2ludGVyIHRvIGludGVybmVkIHN0cmluZyB0byBzcGVlZCB1cCBhdHRyaWJ1dGUgbG9va3VwLiAqLwotc3RhdGljIFB5T2JqZWN0KiBJTlRFUk5fU1RSSU5HKGNzdHJpbmdpb19idWYpOwotLyoqIFBvaW50ZXIgdG8gaW50ZXJuZWQgc3RyaW5nIHRvIHNwZWVkIHVwIGF0dHJpYnV0ZSBsb29rdXAuICovCi1zdGF0aWMgUHlPYmplY3QqIElOVEVSTl9TVFJJTkcoY3N0cmluZ2lvX3JlZmlsbCk7Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbAotY2hlY2tfc3NpemVfdF8zMihQeV9zc2l6ZV90IGxlbikgewotICAvLyBlcnJvciBmcm9tIGdldHRpbmcgdGhlIGludAotICBpZiAoSU5UX0NPTlZfRVJST1JfT0NDVVJSRUQobGVuKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIUNIRUNLX1JBTkdFKGxlbiwgMCwgSU5UMzJfTUFYKSkgewotICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLCAic3RyaW5nIHNpemUgb3V0IG9mIHJhbmdlIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wKLXBhcnNlX3B5aW50KFB5T2JqZWN0KiBvLCBpbnQzMl90KiByZXQsIGludDMyX3QgbWluLCBpbnQzMl90IG1heCkgewotICBsb25nIHZhbCA9IFB5SW50X0FzTG9uZyhvKTsKLQotICBpZiAoSU5UX0NPTlZfRVJST1JfT0NDVVJSRUQodmFsKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIUNIRUNLX1JBTkdFKHZhbCwgbWluLCBtYXgpKSB7Ci0gICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsICJpbnQgb3V0IG9mIHJhbmdlIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgKnJldCA9IChpbnQzMl90KSB2YWw7Ci0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qIC0tLSBGVU5DVElPTlMgVE8gUEFSU0UgU1RSVUNUIFNQRUNJRklDQVRPSU5TIC0tLSAqLwotCi1zdGF0aWMgYm9vbAotcGFyc2Vfc2V0X2xpc3RfYXJncyhTZXRMaXN0VHlwZUFyZ3MqIGRlc3QsIFB5T2JqZWN0KiB0eXBlYXJncykgewotICBpZiAoUHlUdXBsZV9TaXplKHR5cGVhcmdzKSAhPSAyKSB7Ci0gICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImV4cGVjdGluZyB0dXBsZSBvZiBzaXplIDIgZm9yIGxpc3Qvc2V0IHR5cGUgYXJncyIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGRlc3QtPmVsZW1lbnRfdHlwZSA9IFB5SW50X0FzTG9uZyhQeVR1cGxlX0dFVF9JVEVNKHR5cGVhcmdzLCAwKSk7Ci0gIGlmIChJTlRfQ09OVl9FUlJPUl9PQ0NVUlJFRChkZXN0LT5lbGVtZW50X3R5cGUpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZGVzdC0+dHlwZWFyZ3MgPSBQeVR1cGxlX0dFVF9JVEVNKHR5cGVhcmdzLCAxKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2wKLXBhcnNlX21hcF9hcmdzKE1hcFR5cGVBcmdzKiBkZXN0LCBQeU9iamVjdCogdHlwZWFyZ3MpIHsKLSAgaWYgKFB5VHVwbGVfU2l6ZSh0eXBlYXJncykgIT0gNCkgewotICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJleHBlY3RpbmcgNCBhcmd1bWVudHMgZm9yIHR5cGVhcmdzIHRvIG1hcCIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGRlc3QtPmt0YWcgPSBQeUludF9Bc0xvbmcoUHlUdXBsZV9HRVRfSVRFTSh0eXBlYXJncywgMCkpOwotICBpZiAoSU5UX0NPTlZfRVJST1JfT0NDVVJSRUQoZGVzdC0+a3RhZykpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBkZXN0LT52dGFnID0gUHlJbnRfQXNMb25nKFB5VHVwbGVfR0VUX0lURU0odHlwZWFyZ3MsIDIpKTsKLSAgaWYgKElOVF9DT05WX0VSUk9SX09DQ1VSUkVEKGRlc3QtPnZ0YWcpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZGVzdC0+a3R5cGVhcmdzID0gUHlUdXBsZV9HRVRfSVRFTSh0eXBlYXJncywgMSk7Ci0gIGRlc3QtPnZ0eXBlYXJncyA9IFB5VHVwbGVfR0VUX0lURU0odHlwZWFyZ3MsIDMpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbAotcGFyc2Vfc3RydWN0X2FyZ3MoU3RydWN0VHlwZUFyZ3MqIGRlc3QsIFB5T2JqZWN0KiB0eXBlYXJncykgewotICBpZiAoUHlUdXBsZV9TaXplKHR5cGVhcmdzKSAhPSAyKSB7Ci0gICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImV4cGVjdGluZyB0dXBsZSBvZiBzaXplIDIgZm9yIHN0cnVjdCBhcmdzIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZGVzdC0+a2xhc3MgPSBQeVR1cGxlX0dFVF9JVEVNKHR5cGVhcmdzLCAwKTsKLSAgZGVzdC0+c3BlYyA9IFB5VHVwbGVfR0VUX0lURU0odHlwZWFyZ3MsIDEpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgaW50Ci1wYXJzZV9zdHJ1Y3RfaXRlbV9zcGVjKFN0cnVjdEl0ZW1TcGVjKiBkZXN0LCBQeU9iamVjdCogc3BlY190dXBsZSkgewotCi0gIC8vIGknZCBsaWtlIHRvIHVzZSBQYXJzZUFyZ3MgaGVyZSwgYnV0IGl0IHNlZW1zIHRvIGJlIGEgYm90dGxlbmVjay4KLSAgaWYgKFB5VHVwbGVfU2l6ZShzcGVjX3R1cGxlKSAhPSA1KSB7Ci0gICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImV4cGVjdGluZyA1IGFyZ3VtZW50cyBmb3Igc3BlYyB0dXBsZSIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGRlc3QtPnRhZyA9IFB5SW50X0FzTG9uZyhQeVR1cGxlX0dFVF9JVEVNKHNwZWNfdHVwbGUsIDApKTsKLSAgaWYgKElOVF9DT05WX0VSUk9SX09DQ1VSUkVEKGRlc3QtPnRhZykpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBkZXN0LT50eXBlID0gUHlJbnRfQXNMb25nKFB5VHVwbGVfR0VUX0lURU0oc3BlY190dXBsZSwgMSkpOwotICBpZiAoSU5UX0NPTlZfRVJST1JfT0NDVVJSRUQoZGVzdC0+dHlwZSkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBkZXN0LT5hdHRybmFtZSA9IFB5VHVwbGVfR0VUX0lURU0oc3BlY190dXBsZSwgMik7Ci0gIGRlc3QtPnR5cGVhcmdzID0gUHlUdXBsZV9HRVRfSVRFTShzcGVjX3R1cGxlLCAzKTsKLSAgZGVzdC0+ZGVmdmFsID0gUHlUdXBsZV9HRVRfSVRFTShzcGVjX3R1cGxlLCA0KTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qID09PT09PSBFTkQgVVRJTElUSUVTID09PT09PSAqLwotCi0KLS8qID09PT09PSBCRUdJTiBXUklUSU5HIEZVTkNUSU9OUyA9PT09PT0gKi8KLQotLyogLS0tIExPVy1MRVZFTCBXUklUSU5HIEZVTkNUSU9OUyAtLS0gKi8KLQotc3RhdGljIHZvaWQgd3JpdGVCeXRlKFB5T2JqZWN0KiBvdXRidWYsIGludDhfdCB2YWwpIHsKLSAgaW50OF90IG5ldCA9IHZhbDsKLSAgUHljU3RyaW5nSU8tPmN3cml0ZShvdXRidWYsIChjaGFyKikmbmV0LCBzaXplb2YoaW50OF90KSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHdyaXRlSTE2KFB5T2JqZWN0KiBvdXRidWYsIGludDE2X3QgdmFsKSB7Ci0gIGludDE2X3QgbmV0ID0gKGludDE2X3QpaHRvbnModmFsKTsKLSAgUHljU3RyaW5nSU8tPmN3cml0ZShvdXRidWYsIChjaGFyKikmbmV0LCBzaXplb2YoaW50MTZfdCkpOwotfQotCi1zdGF0aWMgdm9pZCB3cml0ZUkzMihQeU9iamVjdCogb3V0YnVmLCBpbnQzMl90IHZhbCkgewotICBpbnQzMl90IG5ldCA9IChpbnQzMl90KWh0b25sKHZhbCk7Ci0gIFB5Y1N0cmluZ0lPLT5jd3JpdGUob3V0YnVmLCAoY2hhciopJm5ldCwgc2l6ZW9mKGludDMyX3QpKTsKLX0KLQotc3RhdGljIHZvaWQgd3JpdGVJNjQoUHlPYmplY3QqIG91dGJ1ZiwgaW50NjRfdCB2YWwpIHsKLSAgaW50NjRfdCBuZXQgPSAoaW50NjRfdClodG9ubGwodmFsKTsKLSAgUHljU3RyaW5nSU8tPmN3cml0ZShvdXRidWYsIChjaGFyKikmbmV0LCBzaXplb2YoaW50NjRfdCkpOwotfQotCi1zdGF0aWMgdm9pZCB3cml0ZURvdWJsZShQeU9iamVjdCogb3V0YnVmLCBkb3VibGUgZHViKSB7Ci0gIC8vIFVuZm9ydHVuYXRlbHksIGJpdHdpc2VfY2FzdCBkb2Vzbid0IHdvcmsgaW4gQy4gIEJhZCBDIQotICB1bmlvbiB7Ci0gICAgZG91YmxlIGY7Ci0gICAgaW50NjRfdCB0OwotICB9IHRyYW5zZmVyOwotICB0cmFuc2Zlci5mID0gZHViOwotICB3cml0ZUk2NChvdXRidWYsIHRyYW5zZmVyLnQpOwotfQotCi0KLS8qIC0tLSBNQUlOIFJFQ1VSU0lWRSBPVVRQVVQgRlVDTlRJT04gLS0gKi8KLQotc3RhdGljIGludAotb3V0cHV0X3ZhbChQeU9iamVjdCogb3V0cHV0LCBQeU9iamVjdCogdmFsdWUsIFRUeXBlIHR5cGUsIFB5T2JqZWN0KiB0eXBlYXJncykgewotICAvKgotICAgKiBSZWZjb3VudGluZyBTdHJhdGVneToKLSAgICoKLSAgICogV2UgYXNzdW1lIHRoYXQgZWxlbWVudHMgb2YgdGhlIHRocmlmdF9zcGVjIHR1cGxlIGFyZSBub3QgZ29pbmcgdG8gYmUKLSAgICogbXV0YXRlZCwgc28gd2UgZG9uJ3QgcmVmIGNvdW50IHRob3NlIGF0IGFsbC4gT3RoZXIgdGhhbiB0aGF0LCB3ZSB0cnkgdG8KLSAgICoga2VlcCBhIHJlZmVyZW5jZSB0byBhbGwgdGhlIHVzZXItY3JlYXRlZCBvYmplY3RzIHdoaWxlIHdlIHdvcmsgd2l0aCB0aGVtLgotICAgKiBvdXRwdXRfdmFsIGFzc3VtZXMgdGhhdCBhIHJlZmVyZW5jZSBpcyBhbHJlYWR5IGhlbGQuIFRoZSAqY2FsbGVyKiBpcwotICAgKiByZXNwb25zaWJsZSBmb3IgaGFuZGxpbmcgcmVmZXJlbmNlcwotICAgKi8KLQotICBzd2l0Y2ggKHR5cGUpIHsKLQotICBjYXNlIFRfQk9PTDogewotICAgIGludCB2ID0gUHlPYmplY3RfSXNUcnVlKHZhbHVlKTsKLSAgICBpZiAodiA9PSAtMSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHdyaXRlQnl0ZShvdXRwdXQsIChpbnQ4X3QpIHYpOwotICAgIGJyZWFrOwotICB9Ci0gIGNhc2UgVF9JMDg6IHsKLSAgICBpbnQzMl90IHZhbDsKLQotICAgIGlmICghcGFyc2VfcHlpbnQodmFsdWUsICZ2YWwsIElOVDhfTUlOLCBJTlQ4X01BWCkpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB3cml0ZUJ5dGUob3V0cHV0LCAoaW50OF90KSB2YWwpOwotICAgIGJyZWFrOwotICB9Ci0gIGNhc2UgVF9JMTY6IHsKLSAgICBpbnQzMl90IHZhbDsKLQotICAgIGlmICghcGFyc2VfcHlpbnQodmFsdWUsICZ2YWwsIElOVDE2X01JTiwgSU5UMTZfTUFYKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHdyaXRlSTE2KG91dHB1dCwgKGludDE2X3QpIHZhbCk7Ci0gICAgYnJlYWs7Ci0gIH0KLSAgY2FzZSBUX0kzMjogewotICAgIGludDMyX3QgdmFsOwotCi0gICAgaWYgKCFwYXJzZV9weWludCh2YWx1ZSwgJnZhbCwgSU5UMzJfTUlOLCBJTlQzMl9NQVgpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgd3JpdGVJMzIob3V0cHV0LCB2YWwpOwotICAgIGJyZWFrOwotICB9Ci0gIGNhc2UgVF9JNjQ6IHsKLSAgICBpbnQ2NF90IG52YWwgPSBQeUxvbmdfQXNMb25nTG9uZyh2YWx1ZSk7Ci0KLSAgICBpZiAoSU5UX0NPTlZfRVJST1JfT0NDVVJSRUQobnZhbCkpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpZiAoIUNIRUNLX1JBTkdFKG52YWwsIElOVDY0X01JTiwgSU5UNjRfTUFYKSkgewotICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsICJpbnQgb3V0IG9mIHJhbmdlIik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgd3JpdGVJNjQob3V0cHV0LCBudmFsKTsKLSAgICBicmVhazsKLSAgfQotCi0gIGNhc2UgVF9ET1VCTEU6IHsKLSAgICBkb3VibGUgbnZhbCA9IFB5RmxvYXRfQXNEb3VibGUodmFsdWUpOwotICAgIGlmIChudmFsID09IC0xLjAgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHdyaXRlRG91YmxlKG91dHB1dCwgbnZhbCk7Ci0gICAgYnJlYWs7Ci0gIH0KLQotICBjYXNlIFRfU1RSSU5HOiB7Ci0gICAgUHlfc3NpemVfdCBsZW4gPSBQeVN0cmluZ19TaXplKHZhbHVlKTsKLQotICAgIGlmICghY2hlY2tfc3NpemVfdF8zMihsZW4pKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgd3JpdGVJMzIob3V0cHV0LCAoaW50MzJfdCkgbGVuKTsKLSAgICBQeWNTdHJpbmdJTy0+Y3dyaXRlKG91dHB1dCwgUHlTdHJpbmdfQXNTdHJpbmcodmFsdWUpLCAoaW50MzJfdCkgbGVuKTsKLSAgICBicmVhazsKLSAgfQotCi0gIGNhc2UgVF9MSVNUOgotICBjYXNlIFRfU0VUOiB7Ci0gICAgUHlfc3NpemVfdCBsZW47Ci0gICAgU2V0TGlzdFR5cGVBcmdzIHBhcnNlZGFyZ3M7Ci0gICAgUHlPYmplY3QgKml0ZW07Ci0gICAgUHlPYmplY3QgKml0ZXJhdG9yOwotCi0gICAgaWYgKCFwYXJzZV9zZXRfbGlzdF9hcmdzKCZwYXJzZWRhcmdzLCB0eXBlYXJncykpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBsZW4gPSBQeU9iamVjdF9MZW5ndGgodmFsdWUpOwotCi0gICAgaWYgKCFjaGVja19zc2l6ZV90XzMyKGxlbikpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB3cml0ZUJ5dGUob3V0cHV0LCBwYXJzZWRhcmdzLmVsZW1lbnRfdHlwZSk7Ci0gICAgd3JpdGVJMzIob3V0cHV0LCAoaW50MzJfdCkgbGVuKTsKLQotICAgIGl0ZXJhdG9yID0gIFB5T2JqZWN0X0dldEl0ZXIodmFsdWUpOwotICAgIGlmIChpdGVyYXRvciA9PSBOVUxMKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgd2hpbGUgKChpdGVtID0gUHlJdGVyX05leHQoaXRlcmF0b3IpKSkgewotICAgICAgaWYgKCFvdXRwdXRfdmFsKG91dHB1dCwgaXRlbSwgcGFyc2VkYXJncy5lbGVtZW50X3R5cGUsIHBhcnNlZGFyZ3MudHlwZWFyZ3MpKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKLSAgICAgICAgUHlfREVDUkVGKGl0ZXJhdG9yKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgUHlfREVDUkVGKGl0ZW0pOwotICAgIH0KLQotICAgIFB5X0RFQ1JFRihpdGVyYXRvcik7Ci0KLSAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGJyZWFrOwotICB9Ci0KLSAgY2FzZSBUX01BUDogewotICAgIFB5T2JqZWN0ICprLCAqdjsKLSAgICBQeV9zc2l6ZV90IHBvcyA9IDA7Ci0gICAgUHlfc3NpemVfdCBsZW47Ci0KLSAgICBNYXBUeXBlQXJncyBwYXJzZWRhcmdzOwotCi0gICAgbGVuID0gUHlEaWN0X1NpemUodmFsdWUpOwotICAgIGlmICghY2hlY2tfc3NpemVfdF8zMihsZW4pKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKCFwYXJzZV9tYXBfYXJncygmcGFyc2VkYXJncywgdHlwZWFyZ3MpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgd3JpdGVCeXRlKG91dHB1dCwgcGFyc2VkYXJncy5rdGFnKTsKLSAgICB3cml0ZUJ5dGUob3V0cHV0LCBwYXJzZWRhcmdzLnZ0YWcpOwotICAgIHdyaXRlSTMyKG91dHB1dCwgbGVuKTsKLQotICAgIC8vIFRPRE8oYm1hdXJlcik6IHNob3VsZCBzdXBwb3J0IGFueSBtYXBwaW5nLCBub3QganVzdCBkaWN0cwotICAgIHdoaWxlIChQeURpY3RfTmV4dCh2YWx1ZSwgJnBvcywgJmssICZ2KSkgewotICAgICAgLy8gVE9ETyhkcmVpc3MpOiBUaGluayBoYXJkIGFib3V0IHdoZXRoZXIgdGhlc2UgSU5DUkVGcyBhY3R1YWxseQotICAgICAgLy8gICAgICAgICAgICAgICB0dXJuIGFueSB1bnNhZmUgc2NlbmFyaW9zIGludG8gc2FmZSBzY2VuYXJpb3MuCi0gICAgICBQeV9JTkNSRUYoayk7Ci0gICAgICBQeV9JTkNSRUYodik7Ci0KLSAgICAgIGlmICghb3V0cHV0X3ZhbChvdXRwdXQsIGssIHBhcnNlZGFyZ3Mua3RhZywgcGFyc2VkYXJncy5rdHlwZWFyZ3MpCi0gICAgICAgICAgfHwgIW91dHB1dF92YWwob3V0cHV0LCB2LCBwYXJzZWRhcmdzLnZ0YWcsIHBhcnNlZGFyZ3MudnR5cGVhcmdzKSkgewotICAgICAgICBQeV9ERUNSRUYoayk7Ci0gICAgICAgIFB5X0RFQ1JFRih2KTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgUHlfREVDUkVGKGspOwotICAgICAgUHlfREVDUkVGKHYpOwotICAgIH0KLSAgICBicmVhazsKLSAgfQotCi0gIC8vIFRPRE8oZHJlaXNzKTogQ29uc2lkZXIgYnJlYWtpbmcgdGhpcyBvdXQgYXMgYSBmdW5jdGlvbgotICAvLyAgICAgICAgICAgICAgIHRoZSB3YXkgd2UgZGlkIGZvciBkZWNvZGVfc3RydWN0LgotICBjYXNlIFRfU1RSVUNUOiB7Ci0gICAgU3RydWN0VHlwZUFyZ3MgcGFyc2VkYXJnczsKLSAgICBQeV9zc2l6ZV90IG5zcGVjOwotICAgIFB5X3NzaXplX3QgaTsKLQotICAgIGlmICghcGFyc2Vfc3RydWN0X2FyZ3MoJnBhcnNlZGFyZ3MsIHR5cGVhcmdzKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIG5zcGVjID0gUHlUdXBsZV9TaXplKHBhcnNlZGFyZ3Muc3BlYyk7Ci0KLSAgICBpZiAobnNwZWMgPT0gLTEpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbnNwZWM7IGkrKykgewotICAgICAgU3RydWN0SXRlbVNwZWMgcGFyc2Vkc3BlYzsKLSAgICAgIFB5T2JqZWN0KiBzcGVjX3R1cGxlOwotICAgICAgUHlPYmplY3QqIGluc3R2YWwgPSBOVUxMOwotCi0gICAgICBzcGVjX3R1cGxlID0gUHlUdXBsZV9HRVRfSVRFTShwYXJzZWRhcmdzLnNwZWMsIGkpOwotICAgICAgaWYgKHNwZWNfdHVwbGUgPT0gUHlfTm9uZSkgewotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgaWYgKCFwYXJzZV9zdHJ1Y3RfaXRlbV9zcGVjICgmcGFyc2Vkc3BlYywgc3BlY190dXBsZSkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotCi0gICAgICBpbnN0dmFsID0gUHlPYmplY3RfR2V0QXR0cih2YWx1ZSwgcGFyc2Vkc3BlYy5hdHRybmFtZSk7Ci0KLSAgICAgIGlmICghaW5zdHZhbCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChpbnN0dmFsID09IFB5X05vbmUpIHsKLSAgICAgICAgUHlfREVDUkVGKGluc3R2YWwpOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgd3JpdGVCeXRlKG91dHB1dCwgKGludDhfdCkgcGFyc2Vkc3BlYy50eXBlKTsKLSAgICAgIHdyaXRlSTE2KG91dHB1dCwgcGFyc2Vkc3BlYy50YWcpOwotCi0gICAgICBpZiAoIW91dHB1dF92YWwob3V0cHV0LCBpbnN0dmFsLCBwYXJzZWRzcGVjLnR5cGUsIHBhcnNlZHNwZWMudHlwZWFyZ3MpKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihpbnN0dmFsKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotCi0gICAgICBQeV9ERUNSRUYoaW5zdHZhbCk7Ci0gICAgfQotCi0gICAgd3JpdGVCeXRlKG91dHB1dCwgKGludDhfdClUX1NUT1ApOwotICAgIGJyZWFrOwotICB9Ci0KLSAgY2FzZSBUX1NUT1A6Ci0gIGNhc2UgVF9WT0lEOgotICBjYXNlIFRfVVRGMTY6Ci0gIGNhc2UgVF9VVEY4OgotICBjYXNlIFRfVTY0OgotICBkZWZhdWx0OgotICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJVbmV4cGVjdGVkIFRUeXBlIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotCi0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKiAtLS0gVE9QLUxFVkVMIFdSQVBQRVIgRk9SIE9VVFBVVCAtLSAqLwotCi1zdGF0aWMgUHlPYmplY3QgKgotZW5jb2RlX2JpbmFyeShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpIHsKLSAgUHlPYmplY3QqIGVuY19vYmo7Ci0gIFB5T2JqZWN0KiB0eXBlX2FyZ3M7Ci0gIFB5T2JqZWN0KiBidWY7Ci0gIFB5T2JqZWN0KiByZXQgPSBOVUxMOwotCi0gIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT08iLCAmZW5jX29iaiwgJnR5cGVfYXJncykpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIGJ1ZiA9IFB5Y1N0cmluZ0lPLT5OZXdPdXRwdXQoSU5JVF9PVVRCVUZfU0laRSk7Ci0gIGlmIChvdXRwdXRfdmFsKGJ1ZiwgZW5jX29iaiwgVF9TVFJVQ1QsIHR5cGVfYXJncykpIHsKLSAgICByZXQgPSBQeWNTdHJpbmdJTy0+Y2dldHZhbHVlKGJ1Zik7Ci0gIH0KLQotICBQeV9ERUNSRUYoYnVmKTsKLSAgcmV0dXJuIHJldDsKLX0KLQotLyogPT09PT09IEVORCBXUklUSU5HIEZVTkNUSU9OUyA9PT09PT0gKi8KLQotCi0vKiA9PT09PT0gQkVHSU4gUkVBRElORyBGVU5DVElPTlMgPT09PT09ICovCi0KLS8qIC0tLSBMT1ctTEVWRUwgUkVBRElORyBGVU5DVElPTlMgLS0tICovCi0KLXN0YXRpYyB2b2lkCi1mcmVlX2RlY29kZWJ1ZihEZWNvZGVCdWZmZXIqIGQpIHsKLSAgUHlfWERFQ1JFRihkLT5zdHJpbmdpb2J1Zik7Ci0gIFB5X1hERUNSRUYoZC0+cmVmaWxsX2NhbGxhYmxlKTsKLX0KLQotc3RhdGljIGJvb2wKLWRlY29kZV9idWZmZXJfZnJvbV9vYmooRGVjb2RlQnVmZmVyKiBkZXN0LCBQeU9iamVjdCogb2JqKSB7Ci0gIGRlc3QtPnN0cmluZ2lvYnVmID0gUHlPYmplY3RfR2V0QXR0cihvYmosIElOVEVSTl9TVFJJTkcoY3N0cmluZ2lvX2J1ZikpOwotICBpZiAoIWRlc3QtPnN0cmluZ2lvYnVmKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKCFQeWNTdHJpbmdJT19JbnB1dENoZWNrKGRlc3QtPnN0cmluZ2lvYnVmKSkgewotICAgIGZyZWVfZGVjb2RlYnVmKGRlc3QpOwotICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJleHBlY3Rpbmcgc3RyaW5naW8gaW5wdXQiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBkZXN0LT5yZWZpbGxfY2FsbGFibGUgPSBQeU9iamVjdF9HZXRBdHRyKG9iaiwgSU5URVJOX1NUUklORyhjc3RyaW5naW9fcmVmaWxsKSk7Ci0KLSAgaWYoIWRlc3QtPnJlZmlsbF9jYWxsYWJsZSkgewotICAgIGZyZWVfZGVjb2RlYnVmKGRlc3QpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmICghUHlDYWxsYWJsZV9DaGVjayhkZXN0LT5yZWZpbGxfY2FsbGFibGUpKSB7Ci0gICAgZnJlZV9kZWNvZGVidWYoZGVzdCk7Ci0gICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImV4cGVjdGluZyBjYWxsYWJsZSIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbCByZWFkQnl0ZXMoRGVjb2RlQnVmZmVyKiBpbnB1dCwgY2hhcioqIG91dHB1dCwgaW50IGxlbikgewotICBpbnQgcmVhZDsKLQotICAvLyBUT0RPKGRyZWlzcyk6IERvbid0IGZlYXIgdGhlIG1hbGxvYy4gIFRoaW5rIGFib3V0IHRha2luZyBhIGNvcHkgb2YKLSAgLy8gICAgICAgICAgICAgICB0aGUgcGFydGlhbCByZWFkIGluc3RlYWQgb2YgZm9yY2luZyB0aGUgdHJhbnNwb3J0Ci0gIC8vICAgICAgICAgICAgICAgdG8gcHJlcGVuZCBpdCB0byBpdHMgYnVmZmVyLgotCi0gIHJlYWQgPSBQeWNTdHJpbmdJTy0+Y3JlYWQoaW5wdXQtPnN0cmluZ2lvYnVmLCBvdXRwdXQsIGxlbik7Ci0KLSAgaWYgKHJlYWQgPT0gbGVuKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0gZWxzZSBpZiAocmVhZCA9PSAtMSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfSBlbHNlIHsKLSAgICBQeU9iamVjdCogbmV3aW9idWY7Ci0KLSAgICAvLyB1c2luZyBidWlsZGluZyBmdW5jdGlvbnMgYXMgdGhpcyBpcyBhIHJhcmUgY29kZXBhdGgKLSAgICBuZXdpb2J1ZiA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbigKLSAgICAgICAgaW5wdXQtPnJlZmlsbF9jYWxsYWJsZSwgInMjaSIsICpvdXRwdXQsIHJlYWQsIGxlbiwgTlVMTCk7Ci0gICAgaWYgKG5ld2lvYnVmID09IE5VTEwpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyBtdXN0IGRvIHRoaXMgKkFGVEVSKiB0aGUgY2FsbCBzbyB0aGF0IHdlIGRvbid0IGRlcmVmIHRoZSBpbyBidWZmZXIKLSAgICBQeV9DTEVBUihpbnB1dC0+c3RyaW5naW9idWYpOwotICAgIGlucHV0LT5zdHJpbmdpb2J1ZiA9IG5ld2lvYnVmOwotCi0gICAgcmVhZCA9IFB5Y1N0cmluZ0lPLT5jcmVhZChpbnB1dC0+c3RyaW5naW9idWYsIG91dHB1dCwgbGVuKTsKLQotICAgIGlmIChyZWFkID09IGxlbikgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfSBlbHNlIGlmIChyZWFkID09IC0xKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIFRPRE8oZHJlaXNzKTogVGhpcyBjb3VsZCBiZSBhIHZhbGlkIGNvZGUgcGF0aCBmb3IgYmlnIGJpbmFyeSBibG9icy4KLSAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0gICAgICAgICAgInJlZmlsbCBjbGFpbWVkIHRvIGhhdmUgcmVmaWxsZWQgdGhlIGJ1ZmZlciwgYnV0IGRpZG4ndCEhIik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci19Ci0KLXN0YXRpYyBpbnQ4X3QgcmVhZEJ5dGUoRGVjb2RlQnVmZmVyKiBpbnB1dCkgewotICBjaGFyKiBidWY7Ci0gIGlmICghcmVhZEJ5dGVzKGlucHV0LCAmYnVmLCBzaXplb2YoaW50OF90KSkpIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICByZXR1cm4gKihpbnQ4X3QqKSBidWY7Ci19Ci0KLXN0YXRpYyBpbnQxNl90IHJlYWRJMTYoRGVjb2RlQnVmZmVyKiBpbnB1dCkgewotICBjaGFyKiBidWY7Ci0gIGlmICghcmVhZEJ5dGVzKGlucHV0LCAmYnVmLCBzaXplb2YoaW50MTZfdCkpKSB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgcmV0dXJuIChpbnQxNl90KSBudG9ocygqKGludDE2X3QqKSBidWYpOwotfQotCi1zdGF0aWMgaW50MzJfdCByZWFkSTMyKERlY29kZUJ1ZmZlciogaW5wdXQpIHsKLSAgY2hhciogYnVmOwotICBpZiAoIXJlYWRCeXRlcyhpbnB1dCwgJmJ1Ziwgc2l6ZW9mKGludDMyX3QpKSkgewotICAgIHJldHVybiAtMTsKLSAgfQotICByZXR1cm4gKGludDMyX3QpIG50b2hsKCooaW50MzJfdCopIGJ1Zik7Ci19Ci0KLQotc3RhdGljIGludDY0X3QgcmVhZEk2NChEZWNvZGVCdWZmZXIqIGlucHV0KSB7Ci0gIGNoYXIqIGJ1ZjsKLSAgaWYgKCFyZWFkQnl0ZXMoaW5wdXQsICZidWYsIHNpemVvZihpbnQ2NF90KSkpIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICByZXR1cm4gKGludDY0X3QpIG50b2hsbCgqKGludDY0X3QqKSBidWYpOwotfQotCi1zdGF0aWMgZG91YmxlIHJlYWREb3VibGUoRGVjb2RlQnVmZmVyKiBpbnB1dCkgewotICB1bmlvbiB7Ci0gICAgaW50NjRfdCBmOwotICAgIGRvdWJsZSB0OwotICB9IHRyYW5zZmVyOwotCi0gIHRyYW5zZmVyLmYgPSByZWFkSTY0KGlucHV0KTsKLSAgaWYgKHRyYW5zZmVyLmYgPT0gLTEpIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgcmV0dXJuIHRyYW5zZmVyLnQ7Ci19Ci0KLXN0YXRpYyBib29sCi1jaGVja1R5cGVCeXRlKERlY29kZUJ1ZmZlciogaW5wdXQsIFRUeXBlIGV4cGVjdGVkKSB7Ci0gIFRUeXBlIGdvdCA9IHJlYWRCeXRlKGlucHV0KTsKLSAgaWYgKElOVF9DT05WX0VSUk9SX09DQ1VSUkVEKGdvdCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAoZXhwZWN0ZWQgIT0gZ290KSB7Ci0gICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImdvdCB3cm9uZyB0dHlwZSB3aGlsZSByZWFkaW5nIGZpZWxkIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbAotc2tpcChEZWNvZGVCdWZmZXIqIGlucHV0LCBUVHlwZSB0eXBlKSB7Ci0jZGVmaW5lIFNLSVBCWVRFUyhuKSBcCi0gIGRvIHsgXAotICAgIGlmICghcmVhZEJ5dGVzKGlucHV0LCAmZHVtbXlfYnVmLCAobikpKSB7IFwKLSAgICAgIHJldHVybiBmYWxzZTsgXAotICAgIH0gXAotICB9IHdoaWxlKDApCi0KLSAgY2hhciogZHVtbXlfYnVmOwotCi0gIHN3aXRjaCAodHlwZSkgewotCi0gIGNhc2UgVF9CT09MOgotICBjYXNlIFRfSTA4OiBTS0lQQllURVMoMSk7IGJyZWFrOwotICBjYXNlIFRfSTE2OiBTS0lQQllURVMoMik7IGJyZWFrOwotICBjYXNlIFRfSTMyOiBTS0lQQllURVMoNCk7IGJyZWFrOwotICBjYXNlIFRfSTY0OgotICBjYXNlIFRfRE9VQkxFOiBTS0lQQllURVMoOCk7IGJyZWFrOwotCi0gIGNhc2UgVF9TVFJJTkc6IHsKLSAgICAvLyBUT0RPKGRyZWlzcyk6IEZpbmQgb3V0IGlmIHRoZXNlIGNoZWNrX3NzaXplX3QzMnMgYXJlIHJlYWxseSBuZWNlc3NhcnkuCi0gICAgaW50IGxlbiA9IHJlYWRJMzIoaW5wdXQpOwotICAgIGlmICghY2hlY2tfc3NpemVfdF8zMihsZW4pKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIFNLSVBCWVRFUyhsZW4pOwotICAgIGJyZWFrOwotICB9Ci0KLSAgY2FzZSBUX0xJU1Q6Ci0gIGNhc2UgVF9TRVQ6IHsKLSAgICBUVHlwZSBldHlwZTsKLSAgICBpbnQgbGVuLCBpOwotCi0gICAgZXR5cGUgPSByZWFkQnl0ZShpbnB1dCk7Ci0gICAgaWYgKGV0eXBlID09IC0xKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgbGVuID0gcmVhZEkzMihpbnB1dCk7Ci0gICAgaWYgKCFjaGVja19zc2l6ZV90XzMyKGxlbikpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLSAgICAgIGlmICghc2tpcChpbnB1dCwgZXR5cGUpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgYnJlYWs7Ci0gIH0KLQotICBjYXNlIFRfTUFQOiB7Ci0gICAgVFR5cGUga3R5cGUsIHZ0eXBlOwotICAgIGludCBsZW4sIGk7Ci0KLSAgICBrdHlwZSA9IHJlYWRCeXRlKGlucHV0KTsKLSAgICBpZiAoa3R5cGUgPT0gLTEpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB2dHlwZSA9IHJlYWRCeXRlKGlucHV0KTsKLSAgICBpZiAodnR5cGUgPT0gLTEpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBsZW4gPSByZWFkSTMyKGlucHV0KTsKLSAgICBpZiAoIWNoZWNrX3NzaXplX3RfMzIobGVuKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgICAgaWYgKCEoc2tpcChpbnB1dCwga3R5cGUpICYmIHNraXAoaW5wdXQsIHZ0eXBlKSkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIH0KLSAgICBicmVhazsKLSAgfQotCi0gIGNhc2UgVF9TVFJVQ1Q6IHsKLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgVFR5cGUgdHlwZTsKLQotICAgICAgdHlwZSA9IHJlYWRCeXRlKGlucHV0KTsKLSAgICAgIGlmICh0eXBlID09IC0xKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLQotICAgICAgaWYgKHR5cGUgPT0gVF9TVE9QKQotICAgICAgICBicmVhazsKLQotICAgICAgU0tJUEJZVEVTKDIpOyAvLyB0YWcKLSAgICAgIGlmICghc2tpcChpbnB1dCwgdHlwZSkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIH0KLSAgICBicmVhazsKLSAgfQotCi0gIGNhc2UgVF9TVE9QOgotICBjYXNlIFRfVk9JRDoKLSAgY2FzZSBUX1VURjE2OgotICBjYXNlIFRfVVRGODoKLSAgY2FzZSBUX1U2NDoKLSAgZGVmYXVsdDoKLSAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiVW5leHBlY3RlZCBUVHlwZSIpOwotICAgIHJldHVybiBmYWxzZTsKLQotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLSN1bmRlZiBTS0lQQllURVMKLX0KLQotCi0vKiAtLS0gSEVMUEVSIEZVTkNUSU9OIEZPUiBERUNPREVfVkFMIC0tLSAqLwotCi1zdGF0aWMgUHlPYmplY3QqCi1kZWNvZGVfdmFsKERlY29kZUJ1ZmZlciogaW5wdXQsIFRUeXBlIHR5cGUsIFB5T2JqZWN0KiB0eXBlYXJncyk7Ci0KLXN0YXRpYyBib29sCi1kZWNvZGVfc3RydWN0KERlY29kZUJ1ZmZlciogaW5wdXQsIFB5T2JqZWN0KiBvdXRwdXQsIFB5T2JqZWN0KiBzcGVjX3NlcSkgewotICBpbnQgc3BlY19zZXFfbGVuID0gUHlUdXBsZV9TaXplKHNwZWNfc2VxKTsKLSAgaWYgKHNwZWNfc2VxX2xlbiA9PSAtMSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHdoaWxlICh0cnVlKSB7Ci0gICAgVFR5cGUgdHlwZTsKLSAgICBpbnQxNl90IHRhZzsKLSAgICBQeU9iamVjdCogaXRlbV9zcGVjOwotICAgIFB5T2JqZWN0KiBmaWVsZHZhbCA9IE5VTEw7Ci0gICAgU3RydWN0SXRlbVNwZWMgcGFyc2Vkc3BlYzsKLQotICAgIHR5cGUgPSByZWFkQnl0ZShpbnB1dCk7Ci0gICAgaWYgKHR5cGUgPT0gLTEpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKHR5cGUgPT0gVF9TVE9QKSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgdGFnID0gcmVhZEkxNihpbnB1dCk7Ci0gICAgaWYgKElOVF9DT05WX0VSUk9SX09DQ1VSUkVEKHRhZykpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKHRhZyA+PSAwICYmIHRhZyA8IHNwZWNfc2VxX2xlbikgewotICAgICAgaXRlbV9zcGVjID0gUHlUdXBsZV9HRVRfSVRFTShzcGVjX3NlcSwgdGFnKTsKLSAgICB9IGVsc2UgewotICAgICAgaXRlbV9zcGVjID0gUHlfTm9uZTsKLSAgICB9Ci0KLSAgICBpZiAoaXRlbV9zcGVjID09IFB5X05vbmUpIHsKLSAgICAgIGlmICghc2tpcChpbnB1dCwgdHlwZSkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCFwYXJzZV9zdHJ1Y3RfaXRlbV9zcGVjKCZwYXJzZWRzcGVjLCBpdGVtX3NwZWMpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGlmIChwYXJzZWRzcGVjLnR5cGUgIT0gdHlwZSkgewotICAgICAgaWYgKCFza2lwKGlucHV0LCB0eXBlKSkgewotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAic3RydWN0IGZpZWxkIGhhZCB3cm9uZyB0eXBlIHdoaWxlIHJlYWRpbmcgYW5kIGNhbid0IGJlIHNraXBwZWQiKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgZmllbGR2YWwgPSBkZWNvZGVfdmFsKGlucHV0LCBwYXJzZWRzcGVjLnR5cGUsIHBhcnNlZHNwZWMudHlwZWFyZ3MpOwotICAgIGlmIChmaWVsZHZhbCA9PSBOVUxMKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKFB5T2JqZWN0X1NldEF0dHIob3V0cHV0LCBwYXJzZWRzcGVjLmF0dHJuYW1lLCBmaWVsZHZhbCkgPT0gLTEpIHsKLSAgICAgIFB5X0RFQ1JFRihmaWVsZHZhbCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIFB5X0RFQ1JFRihmaWVsZHZhbCk7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyogLS0tIE1BSU4gUkVDVVJTSVZFIElOUFVUIEZVQ05USU9OIC0tLSAqLwotCi0vLyBSZXR1cm5zIGEgbmV3IHJlZmVyZW5jZS4KLXN0YXRpYyBQeU9iamVjdCoKLWRlY29kZV92YWwoRGVjb2RlQnVmZmVyKiBpbnB1dCwgVFR5cGUgdHlwZSwgUHlPYmplY3QqIHR5cGVhcmdzKSB7Ci0gIHN3aXRjaCAodHlwZSkgewotCi0gIGNhc2UgVF9CT09MOiB7Ci0gICAgaW50OF90IHYgPSByZWFkQnl0ZShpbnB1dCk7Ci0gICAgaWYgKElOVF9DT05WX0VSUk9SX09DQ1VSUkVEKHYpKSB7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBzd2l0Y2ggKHYpIHsKLSAgICBjYXNlIDA6IFB5X1JFVFVSTl9GQUxTRTsKLSAgICBjYXNlIDE6IFB5X1JFVFVSTl9UUlVFOwotICAgIC8vIERvbid0IGxhdWdoLiAgVGhpcyBpcyBhIHBvdGVudGlhbGx5IHNlcmlvdXMgaXNzdWUuCi0gICAgZGVmYXVsdDogUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImJvb2xlYW4gb3V0IG9mIHJhbmdlIik7IHJldHVybiBOVUxMOwotICAgIH0KLSAgICBicmVhazsKLSAgfQotICBjYXNlIFRfSTA4OiB7Ci0gICAgaW50OF90IHYgPSByZWFkQnl0ZShpbnB1dCk7Ci0gICAgaWYgKElOVF9DT05WX0VSUk9SX09DQ1VSUkVEKHYpKSB7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcodik7Ci0gIH0KLSAgY2FzZSBUX0kxNjogewotICAgIGludDE2X3QgdiA9IHJlYWRJMTYoaW5wdXQpOwotICAgIGlmIChJTlRfQ09OVl9FUlJPUl9PQ0NVUlJFRCh2KSkgewotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyh2KTsKLSAgfQotICBjYXNlIFRfSTMyOiB7Ci0gICAgaW50MzJfdCB2ID0gcmVhZEkzMihpbnB1dCk7Ci0gICAgaWYgKElOVF9DT05WX0VSUk9SX09DQ1VSUkVEKHYpKSB7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHYpOwotICB9Ci0KLSAgY2FzZSBUX0k2NDogewotICAgIGludDY0X3QgdiA9IHJlYWRJNjQoaW5wdXQpOwotICAgIGlmIChJTlRfQ09OVl9FUlJPUl9PQ0NVUlJFRCh2KSkgewotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIC8vIFRPRE8oZHJlaXNzKTogRmluZCBvdXQgaWYgd2UgY2FuIHRha2UgdGhpcyBmYXN0cGF0aCBhbHdheXMgd2hlbgotICAgIC8vICAgICAgICAgICAgICAgc2l6ZW9mKGxvbmcpID09IHNpemVvZihsb25nIGxvbmcpLgotICAgIGlmIChDSEVDS19SQU5HRSh2LCBMT05HX01JTiwgTE9OR19NQVgpKSB7Ci0gICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIHYpOwotICAgIH0KLQotICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmdMb25nKHYpOwotICB9Ci0KLSAgY2FzZSBUX0RPVUJMRTogewotICAgIGRvdWJsZSB2ID0gcmVhZERvdWJsZShpbnB1dCk7Ci0gICAgaWYgKHYgPT0gLTEuMCAmJiBQeUVycl9PY2N1cnJlZCgpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUodik7Ci0gIH0KLQotICBjYXNlIFRfU1RSSU5HOiB7Ci0gICAgUHlfc3NpemVfdCBsZW4gPSByZWFkSTMyKGlucHV0KTsKLSAgICBjaGFyKiBidWY7Ci0gICAgaWYgKCFyZWFkQnl0ZXMoaW5wdXQsICZidWYsIGxlbikpIHsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShidWYsIGxlbik7Ci0gIH0KLQotICBjYXNlIFRfTElTVDoKLSAgY2FzZSBUX1NFVDogewotICAgIFNldExpc3RUeXBlQXJncyBwYXJzZWRhcmdzOwotICAgIGludDMyX3QgbGVuOwotICAgIFB5T2JqZWN0KiByZXQgPSBOVUxMOwotICAgIGludCBpOwotCi0gICAgaWYgKCFwYXJzZV9zZXRfbGlzdF9hcmdzKCZwYXJzZWRhcmdzLCB0eXBlYXJncykpIHsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIGlmICghY2hlY2tUeXBlQnl0ZShpbnB1dCwgcGFyc2VkYXJncy5lbGVtZW50X3R5cGUpKSB7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBsZW4gPSByZWFkSTMyKGlucHV0KTsKLSAgICBpZiAoIWNoZWNrX3NzaXplX3RfMzIobGVuKSkgewotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgcmV0ID0gUHlMaXN0X05ldyhsZW4pOwotICAgIGlmICghcmV0KSB7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLSAgICAgIFB5T2JqZWN0KiBpdGVtID0gZGVjb2RlX3ZhbChpbnB1dCwgcGFyc2VkYXJncy5lbGVtZW50X3R5cGUsIHBhcnNlZGFyZ3MudHlwZWFyZ3MpOwotICAgICAgaWYgKCFpdGVtKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihyZXQpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgIH0KLSAgICAgIFB5TGlzdF9TRVRfSVRFTShyZXQsIGksIGl0ZW0pOwotICAgIH0KLQotICAgIC8vIFRPRE8oZHJlaXNzKTogQ29uc2lkZXIgYml0aW5nIHRoZSBidWxsZXQgYW5kIG1ha2luZyB0d28gc2VwYXJhdGUgY2FzZXMKLSAgICAvLyAgICAgICAgICAgICAgIGZvciBsaXN0IGFuZCBzZXQsIGF2b2lkaW5nIHRoaXMgcG9zdCBmYWN0byBjb252ZXJzaW9uLgotICAgIGlmICh0eXBlID09IFRfU0VUKSB7Ci0gICAgICBQeU9iamVjdCogc2V0cmV0OwotI2lmIChQWV9WRVJTSU9OX0hFWCA8IDB4MDIwNTAwMDApCi0gICAgICAvLyBoYWNrIG5lZWRlZCBmb3Igb2xkZXIgdmVyc2lvbnMKLSAgICAgIHNldHJldCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoKFB5T2JqZWN0KikmUHlTZXRfVHlwZSwgcmV0LCBOVUxMKTsKLSNlbHNlCi0gICAgICAvLyBvZmZpY2lhbCB2ZXJzaW9uCi0gICAgICBzZXRyZXQgPSBQeVNldF9OZXcocmV0KTsKLSNlbmRpZgotICAgICAgUHlfREVDUkVGKHJldCk7Ci0gICAgICByZXR1cm4gc2V0cmV0OwotICAgIH0KLSAgICByZXR1cm4gcmV0OwotICB9Ci0KLSAgY2FzZSBUX01BUDogewotICAgIGludDMyX3QgbGVuOwotICAgIGludCBpOwotICAgIE1hcFR5cGVBcmdzIHBhcnNlZGFyZ3M7Ci0gICAgUHlPYmplY3QqIHJldCA9IE5VTEw7Ci0KLSAgICBpZiAoIXBhcnNlX21hcF9hcmdzKCZwYXJzZWRhcmdzLCB0eXBlYXJncykpIHsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIGlmICghY2hlY2tUeXBlQnl0ZShpbnB1dCwgcGFyc2VkYXJncy5rdGFnKSkgewotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGlmICghY2hlY2tUeXBlQnl0ZShpbnB1dCwgcGFyc2VkYXJncy52dGFnKSkgewotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgbGVuID0gcmVhZEkzMihpbnB1dCk7Ci0gICAgaWYgKCFjaGVja19zc2l6ZV90XzMyKGxlbikpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXQgPSBQeURpY3RfTmV3KCk7Ci0gICAgaWYgKCFyZXQpIHsKLSAgICAgIGdvdG8gZXJyb3I7Ci0gICAgfQotCi0gICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICBQeU9iamVjdCogayA9IE5VTEw7Ci0gICAgICBQeU9iamVjdCogdiA9IE5VTEw7Ci0gICAgICBrID0gZGVjb2RlX3ZhbChpbnB1dCwgcGFyc2VkYXJncy5rdGFnLCBwYXJzZWRhcmdzLmt0eXBlYXJncyk7Ci0gICAgICBpZiAoayA9PSBOVUxMKSB7Ci0gICAgICAgIGdvdG8gbG9vcF9lcnJvcjsKLSAgICAgIH0KLSAgICAgIHYgPSBkZWNvZGVfdmFsKGlucHV0LCBwYXJzZWRhcmdzLnZ0YWcsIHBhcnNlZGFyZ3MudnR5cGVhcmdzKTsKLSAgICAgIGlmICh2ID09IE5VTEwpIHsKLSAgICAgICAgZ290byBsb29wX2Vycm9yOwotICAgICAgfQotICAgICAgaWYgKFB5RGljdF9TZXRJdGVtKHJldCwgaywgdikgPT0gLTEpIHsKLSAgICAgICAgZ290byBsb29wX2Vycm9yOwotICAgICAgfQotCi0gICAgICBQeV9ERUNSRUYoayk7Ci0gICAgICBQeV9ERUNSRUYodik7Ci0gICAgICBjb250aW51ZTsKLQotICAgICAgLy8gWXVjayEgIERlc3RydWN0b3JzLCBhbnlvbmU/Ci0gICAgICBsb29wX2Vycm9yOgotICAgICAgUHlfWERFQ1JFRihrKTsKLSAgICAgIFB5X1hERUNSRUYodik7Ci0gICAgICBnb3RvIGVycm9yOwotICAgIH0KLQotICAgIHJldHVybiByZXQ7Ci0KLSAgICBlcnJvcjoKLSAgICBQeV9YREVDUkVGKHJldCk7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICBjYXNlIFRfU1RSVUNUOiB7Ci0gICAgU3RydWN0VHlwZUFyZ3MgcGFyc2VkYXJnczsKLQlQeU9iamVjdCogcmV0OwotICAgIGlmICghcGFyc2Vfc3RydWN0X2FyZ3MoJnBhcnNlZGFyZ3MsIHR5cGVhcmdzKSkgewotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgcmV0ID0gUHlPYmplY3RfQ2FsbE9iamVjdChwYXJzZWRhcmdzLmtsYXNzLCBOVUxMKTsKLSAgICBpZiAoIXJldCkgewotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKCFkZWNvZGVfc3RydWN0KGlucHV0LCByZXQsIHBhcnNlZGFyZ3Muc3BlYykpIHsKLSAgICAgIFB5X0RFQ1JFRihyZXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJldDsKLSAgfQotCi0gIGNhc2UgVF9TVE9QOgotICBjYXNlIFRfVk9JRDoKLSAgY2FzZSBUX1VURjE2OgotICBjYXNlIFRfVVRGODoKLSAgY2FzZSBUX1U2NDoKLSAgZGVmYXVsdDoKLSAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiVW5leHBlY3RlZCBUVHlwZSIpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci19Ci0KLQotLyogLS0tIFRPUC1MRVZFTCBXUkFQUEVSIEZPUiBJTlBVVCAtLSAqLwotCi1zdGF0aWMgUHlPYmplY3QqCi1kZWNvZGVfYmluYXJ5KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykgewotICBQeU9iamVjdCogb3V0cHV0X29iaiA9IE5VTEw7Ci0gIFB5T2JqZWN0KiB0cmFuc3BvcnQgPSBOVUxMOwotICBQeU9iamVjdCogdHlwZWFyZ3MgPSBOVUxMOwotICBTdHJ1Y3RUeXBlQXJncyBwYXJzZWRhcmdzOwotICBEZWNvZGVCdWZmZXIgaW5wdXQgPSB7MCwgMH07Ci0gIAotICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9PTyIsICZvdXRwdXRfb2JqLCAmdHJhbnNwb3J0LCAmdHlwZWFyZ3MpKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICBpZiAoIXBhcnNlX3N0cnVjdF9hcmdzKCZwYXJzZWRhcmdzLCB0eXBlYXJncykpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIGlmICghZGVjb2RlX2J1ZmZlcl9mcm9tX29iaigmaW5wdXQsIHRyYW5zcG9ydCkpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIGlmICghZGVjb2RlX3N0cnVjdCgmaW5wdXQsIG91dHB1dF9vYmosIHBhcnNlZGFyZ3Muc3BlYykpIHsKLSAgICBmcmVlX2RlY29kZWJ1ZigmaW5wdXQpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgZnJlZV9kZWNvZGVidWYoJmlucHV0KTsKLQotICBQeV9SRVRVUk5fTk9ORTsKLX0KLQotLyogPT09PT09IEVORCBSRUFESU5HIEZVTkNUSU9OUyA9PT09PT0gKi8KLQotCi0vKiAtLSBQWVRIT04gTU9EVUxFIFNFVFVQIFNUVUZGIC0tLSAqLwotCi1zdGF0aWMgUHlNZXRob2REZWYgVGhyaWZ0RmFzdEJpbmFyeU1ldGhvZHNbXSA9IHsKLQotICB7ImVuY29kZV9iaW5hcnkiLCAgZW5jb2RlX2JpbmFyeSwgTUVUSF9WQVJBUkdTLCAiIn0sCi0gIHsiZGVjb2RlX2JpbmFyeSIsICBkZWNvZGVfYmluYXJ5LCBNRVRIX1ZBUkFSR1MsICIifSwKLQotICB7TlVMTCwgTlVMTCwgMCwgTlVMTH0gICAgICAgIC8qIFNlbnRpbmVsICovCi19OwotCi1QeU1PRElOSVRfRlVOQwotaW5pdGZhc3RiaW5hcnkodm9pZCkgewotI2RlZmluZSBJTklUX0lOVEVSTl9TVFJJTkcodmFsdWUpIFwKLSAgZG8geyBcCi0gICAgSU5URVJOX1NUUklORyh2YWx1ZSkgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCN2YWx1ZSk7IFwKLSAgICBpZighSU5URVJOX1NUUklORyh2YWx1ZSkpIHJldHVybjsgXAotICB9IHdoaWxlKDApCi0KLSAgSU5JVF9JTlRFUk5fU1RSSU5HKGNzdHJpbmdpb19idWYpOwotICBJTklUX0lOVEVSTl9TVFJJTkcoY3N0cmluZ2lvX3JlZmlsbCk7Ci0jdW5kZWYgSU5JVF9JTlRFUk5fU1RSSU5HCi0KLSAgUHljU3RyaW5nX0lNUE9SVDsKLSAgaWYgKFB5Y1N0cmluZ0lPID09IE5VTEwpIHJldHVybjsKLQotICAodm9pZCkgUHlfSW5pdE1vZHVsZSgidGhyaWZ0LnByb3RvY29sLmZhc3RiaW5hcnkiLCBUaHJpZnRGYXN0QmluYXJ5TWV0aG9kcyk7Ci19CmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL3NlcnZlci9USHR0cFNlcnZlci5weSBiL2xpYi9weS9zcmMvc2VydmVyL1RIdHRwU2VydmVyLnB5CmluZGV4IGJlNTRiYWIuLjg1Y2Y0MDAgMTAwNjQ0Ci0tLSBhL2xpYi9weS9zcmMvc2VydmVyL1RIdHRwU2VydmVyLnB5CisrKyBiL2xpYi9weS9zcmMvc2VydmVyL1RIdHRwU2VydmVyLnB5CkBAIC0xNyw3MSArMTcsOTAgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLWltcG9ydCBCYXNlSFRUUFNlcnZlcgoraW1wb3J0IHNzbAorCitmcm9tIHNpeC5tb3ZlcyBpbXBvcnQgQmFzZUhUVFBTZXJ2ZXIKIAogZnJvbSB0aHJpZnQuc2VydmVyIGltcG9ydCBUU2VydmVyCiBmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQKIAogCiBjbGFzcyBSZXNwb25zZUV4Y2VwdGlvbihFeGNlcHRpb24pOgotICAiIiJBbGxvd3MgaGFuZGxlcnMgdG8gb3ZlcnJpZGUgdGhlIEhUVFAgcmVzcG9uc2UKKyAgICAiIiJBbGxvd3MgaGFuZGxlcnMgdG8gb3ZlcnJpZGUgdGhlIEhUVFAgcmVzcG9uc2UKIAotICBOb3JtYWxseSwgVEh0dHBTZXJ2ZXIgYWx3YXlzIHNlbmRzIGEgMjAwIHJlc3BvbnNlLiAgSWYgYSBoYW5kbGVyIHdhbnRzCi0gIHRvIG92ZXJyaWRlIHRoaXMgYmVoYXZpb3IgKGUuZy4sIHRvIHNpbXVsYXRlIGEgbWlzY29uZmlndXJlZCBvcgotICBvdmVybG9hZGVkIHdlYiBzZXJ2ZXIgZHVyaW5nIHRlc3RpbmcpLCBpdCBjYW4gcmFpc2UgYSBSZXNwb25zZUV4Y2VwdGlvbi4KLSAgVGhlIGZ1bmN0aW9uIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3Igd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUKLSAgUmVxdWVzdEhhbmRsZXIgYXMgaXRzIG9ubHkgYXJndW1lbnQuCi0gICIiIgotICBkZWYgX19pbml0X18oc2VsZiwgaGFuZGxlcik6Ci0gICAgc2VsZi5oYW5kbGVyID0gaGFuZGxlcgorICAgIE5vcm1hbGx5LCBUSHR0cFNlcnZlciBhbHdheXMgc2VuZHMgYSAyMDAgcmVzcG9uc2UuICBJZiBhIGhhbmRsZXIgd2FudHMKKyAgICB0byBvdmVycmlkZSB0aGlzIGJlaGF2aW9yIChlLmcuLCB0byBzaW11bGF0ZSBhIG1pc2NvbmZpZ3VyZWQgb3IKKyAgICBvdmVybG9hZGVkIHdlYiBzZXJ2ZXIgZHVyaW5nIHRlc3RpbmcpLCBpdCBjYW4gcmFpc2UgYSBSZXNwb25zZUV4Y2VwdGlvbi4KKyAgICBUaGUgZnVuY3Rpb24gcGFzc2VkIHRvIHRoZSBjb25zdHJ1Y3RvciB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZQorICAgIFJlcXVlc3RIYW5kbGVyIGFzIGl0cyBvbmx5IGFyZ3VtZW50LgorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBoYW5kbGVyKToKKyAgICAgICAgc2VsZi5oYW5kbGVyID0gaGFuZGxlcgogCiAKIGNsYXNzIFRIdHRwU2VydmVyKFRTZXJ2ZXIuVFNlcnZlcik6Ci0gICIiIkEgc2ltcGxlIEhUVFAtYmFzZWQgVGhyaWZ0IHNlcnZlcgorICAgICIiIkEgc2ltcGxlIEhUVFAtYmFzZWQgVGhyaWZ0IHNlcnZlcgogCi0gIFRoaXMgY2xhc3MgaXMgbm90IHZlcnkgcGVyZm9ybWFudCwgYnV0IGl0IGlzIHVzZWZ1bCAoZm9yIGV4YW1wbGUpIGZvcgotICBhY3RpbmcgYXMgYSBtb2NrIHZlcnNpb24gb2YgYW4gQXBhY2hlLWJhc2VkIFBIUCBUaHJpZnQgZW5kcG9pbnQuCi0gICIiIgotICBkZWYgX19pbml0X18oc2VsZiwKLSAgICAgICAgICAgICAgIHByb2Nlc3NvciwKLSAgICAgICAgICAgICAgIHNlcnZlcl9hZGRyZXNzLAotICAgICAgICAgICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgICAgICBvdXRwdXRQcm90b2NvbEZhY3Rvcnk9Tm9uZSwKLSAgICAgICAgICAgICAgIHNlcnZlcl9jbGFzcz1CYXNlSFRUUFNlcnZlci5IVFRQU2VydmVyKToKLSAgICAiIiJTZXQgdXAgcHJvdG9jb2wgZmFjdG9yaWVzIGFuZCBIVFRQIHNlcnZlci4KLQotICAgIFNlZSBCYXNlSFRUUFNlcnZlciBmb3Igc2VydmVyX2FkZHJlc3MuCi0gICAgU2VlIFRTZXJ2ZXIgZm9yIHByb3RvY29sIGZhY3Rvcmllcy4KKyAgICBUaGlzIGNsYXNzIGlzIG5vdCB2ZXJ5IHBlcmZvcm1hbnQsIGJ1dCBpdCBpcyB1c2VmdWwgKGZvciBleGFtcGxlKSBmb3IKKyAgICBhY3RpbmcgYXMgYSBtb2NrIHZlcnNpb24gb2YgYW4gQXBhY2hlLWJhc2VkIFBIUCBUaHJpZnQgZW5kcG9pbnQuCiAgICAgIiIiCi0gICAgaWYgb3V0cHV0UHJvdG9jb2xGYWN0b3J5IGlzIE5vbmU6Ci0gICAgICBvdXRwdXRQcm90b2NvbEZhY3RvcnkgPSBpbnB1dFByb3RvY29sRmFjdG9yeQorICAgIGRlZiBfX2luaXRfXyhzZWxmLAorICAgICAgICAgICAgICAgICBwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgIHNlcnZlcl9hZGRyZXNzLAorICAgICAgICAgICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5PU5vbmUsCisgICAgICAgICAgICAgICAgIHNlcnZlcl9jbGFzcz1CYXNlSFRUUFNlcnZlci5IVFRQU2VydmVyLAorICAgICAgICAgICAgICAgICAqKmt3YXJncyk6CisgICAgICAgICIiIlNldCB1cCBwcm90b2NvbCBmYWN0b3JpZXMgYW5kIEhUVFAgKG9yIEhUVFBTKSBzZXJ2ZXIuCiAKLSAgICBUU2VydmVyLlRTZXJ2ZXIuX19pbml0X18oc2VsZiwgcHJvY2Vzc29yLCBOb25lLCBOb25lLCBOb25lLAotICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KQorICAgICAgICBTZWUgQmFzZUhUVFBTZXJ2ZXIgZm9yIHNlcnZlcl9hZGRyZXNzLgorICAgICAgICBTZWUgVFNlcnZlciBmb3IgcHJvdG9jb2wgZmFjdG9yaWVzLgogCi0gICAgdGh0dHBzZXJ2ZXIgPSBzZWxmCisgICAgICAgIFRvIG1ha2UgYSBzZWN1cmUgc2VydmVyLCBwcm92aWRlIHRoZSBuYW1lZCBhcmd1bWVudHM6CisgICAgICAgICogY2FmaWxlICAgIC0gdG8gdmFsaWRhdGUgY2xpZW50cyBbb3B0aW9uYWxdCisgICAgICAgICogY2VydF9maWxlIC0gdGhlIHNlcnZlciBjZXJ0CisgICAgICAgICoga2V5X2ZpbGUgIC0gdGhlIHNlcnZlcidzIGtleQorICAgICAgICAiIiIKKyAgICAgICAgaWYgb3V0cHV0UHJvdG9jb2xGYWN0b3J5IGlzIE5vbmU6CisgICAgICAgICAgICBvdXRwdXRQcm90b2NvbEZhY3RvcnkgPSBpbnB1dFByb3RvY29sRmFjdG9yeQogCi0gICAgY2xhc3MgUmVxdWVzdEhhbmRlcihCYXNlSFRUUFNlcnZlci5CYXNlSFRUUFJlcXVlc3RIYW5kbGVyKToKLSAgICAgIGRlZiBkb19QT1NUKHNlbGYpOgotICAgICAgICAjIERvbid0IGNhcmUgYWJvdXQgdGhlIHJlcXVlc3QgcGF0aC4KLSAgICAgICAgaXRyYW5zID0gVFRyYW5zcG9ydC5URmlsZU9iamVjdFRyYW5zcG9ydChzZWxmLnJmaWxlKQotICAgICAgICBvdHJhbnMgPSBUVHJhbnNwb3J0LlRGaWxlT2JqZWN0VHJhbnNwb3J0KHNlbGYud2ZpbGUpCi0gICAgICAgIGl0cmFucyA9IFRUcmFuc3BvcnQuVEJ1ZmZlcmVkVHJhbnNwb3J0KAotICAgICAgICAgIGl0cmFucywgaW50KHNlbGYuaGVhZGVyc1snQ29udGVudC1MZW5ndGgnXSkpCi0gICAgICAgIG90cmFucyA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcigpCi0gICAgICAgIGlwcm90ID0gdGh0dHBzZXJ2ZXIuaW5wdXRQcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2woaXRyYW5zKQotICAgICAgICBvcHJvdCA9IHRodHRwc2VydmVyLm91dHB1dFByb3RvY29sRmFjdG9yeS5nZXRQcm90b2NvbChvdHJhbnMpCi0gICAgICAgIHRyeToKLSAgICAgICAgICB0aHR0cHNlcnZlci5wcm9jZXNzb3IucHJvY2VzcyhpcHJvdCwgb3Byb3QpCi0gICAgICAgIGV4Y2VwdCBSZXNwb25zZUV4Y2VwdGlvbiwgZXhuOgotICAgICAgICAgIGV4bi5oYW5kbGVyKHNlbGYpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgc2VsZi5zZW5kX3Jlc3BvbnNlKDIwMCkKLSAgICAgICAgICBzZWxmLnNlbmRfaGVhZGVyKCJjb250ZW50LXR5cGUiLCAiYXBwbGljYXRpb24veC10aHJpZnQiKQotICAgICAgICAgIHNlbGYuZW5kX2hlYWRlcnMoKQotICAgICAgICAgIHNlbGYud2ZpbGUud3JpdGUob3RyYW5zLmdldHZhbHVlKCkpCisgICAgICAgIFRTZXJ2ZXIuVFNlcnZlci5fX2luaXRfXyhzZWxmLCBwcm9jZXNzb3IsIE5vbmUsIE5vbmUsIE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KQogCi0gICAgc2VsZi5odHRwZCA9IHNlcnZlcl9jbGFzcyhzZXJ2ZXJfYWRkcmVzcywgUmVxdWVzdEhhbmRlcikKKyAgICAgICAgdGh0dHBzZXJ2ZXIgPSBzZWxmCiAKLSAgZGVmIHNlcnZlKHNlbGYpOgotICAgIHNlbGYuaHR0cGQuc2VydmVfZm9yZXZlcigpCisgICAgICAgIGNsYXNzIFJlcXVlc3RIYW5kZXIoQmFzZUhUVFBTZXJ2ZXIuQmFzZUhUVFBSZXF1ZXN0SGFuZGxlcik6CisgICAgICAgICAgICBkZWYgZG9fUE9TVChzZWxmKToKKyAgICAgICAgICAgICAgICAjIERvbid0IGNhcmUgYWJvdXQgdGhlIHJlcXVlc3QgcGF0aC4KKyAgICAgICAgICAgICAgICBpdHJhbnMgPSBUVHJhbnNwb3J0LlRGaWxlT2JqZWN0VHJhbnNwb3J0KHNlbGYucmZpbGUpCisgICAgICAgICAgICAgICAgb3RyYW5zID0gVFRyYW5zcG9ydC5URmlsZU9iamVjdFRyYW5zcG9ydChzZWxmLndmaWxlKQorICAgICAgICAgICAgICAgIGl0cmFucyA9IFRUcmFuc3BvcnQuVEJ1ZmZlcmVkVHJhbnNwb3J0KAorICAgICAgICAgICAgICAgICAgICBpdHJhbnMsIGludChzZWxmLmhlYWRlcnNbJ0NvbnRlbnQtTGVuZ3RoJ10pKQorICAgICAgICAgICAgICAgIG90cmFucyA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcigpCisgICAgICAgICAgICAgICAgaXByb3QgPSB0aHR0cHNlcnZlci5pbnB1dFByb3RvY29sRmFjdG9yeS5nZXRQcm90b2NvbChpdHJhbnMpCisgICAgICAgICAgICAgICAgb3Byb3QgPSB0aHR0cHNlcnZlci5vdXRwdXRQcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2wob3RyYW5zKQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgdGh0dHBzZXJ2ZXIucHJvY2Vzc29yLnByb2Nlc3MoaXByb3QsIG9wcm90KQorICAgICAgICAgICAgICAgIGV4Y2VwdCBSZXNwb25zZUV4Y2VwdGlvbiBhcyBleG46CisgICAgICAgICAgICAgICAgICAgIGV4bi5oYW5kbGVyKHNlbGYpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zZW5kX3Jlc3BvbnNlKDIwMCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zZW5kX2hlYWRlcigiY29udGVudC10eXBlIiwgImFwcGxpY2F0aW9uL3gtdGhyaWZ0IikKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5lbmRfaGVhZGVycygpCisgICAgICAgICAgICAgICAgICAgIHNlbGYud2ZpbGUud3JpdGUob3RyYW5zLmdldHZhbHVlKCkpCisKKyAgICAgICAgc2VsZi5odHRwZCA9IHNlcnZlcl9jbGFzcyhzZXJ2ZXJfYWRkcmVzcywgUmVxdWVzdEhhbmRlcikKKworICAgICAgICBpZiAoa3dhcmdzLmdldCgnY2FmaWxlJykgb3Iga3dhcmdzLmdldCgnY2VydF9maWxlJykgb3Iga3dhcmdzLmdldCgna2V5X2ZpbGUnKSk6CisgICAgICAgICAgICBjb250ZXh0ID0gc3NsLmNyZWF0ZV9kZWZhdWx0X2NvbnRleHQoY2FmaWxlPWt3YXJncy5nZXQoJ2NhZmlsZScpKQorICAgICAgICAgICAgY29udGV4dC5jaGVja19ob3N0bmFtZSA9IEZhbHNlCisgICAgICAgICAgICBjb250ZXh0LmxvYWRfY2VydF9jaGFpbihrd2FyZ3MuZ2V0KCdjZXJ0X2ZpbGUnKSwga3dhcmdzLmdldCgna2V5X2ZpbGUnKSkKKyAgICAgICAgICAgIGNvbnRleHQudmVyaWZ5X21vZGUgPSBzc2wuQ0VSVF9SRVFVSVJFRCBpZiBrd2FyZ3MuZ2V0KCdjYWZpbGUnKSBlbHNlIHNzbC5DRVJUX05PTkUKKyAgICAgICAgICAgIHNlbGYuaHR0cGQuc29ja2V0ID0gY29udGV4dC53cmFwX3NvY2tldChzZWxmLmh0dHBkLnNvY2tldCwgc2VydmVyX3NpZGU9VHJ1ZSkKKworICAgIGRlZiBzZXJ2ZShzZWxmKToKKyAgICAgICAgc2VsZi5odHRwZC5zZXJ2ZV9mb3JldmVyKCkKKworICAgIGRlZiBzaHV0ZG93bihzZWxmKToKKyAgICAgICAgc2VsZi5odHRwZC5zb2NrZXQuY2xvc2UoKQorICAgICAgICAjIHNlbGYuaHR0cGQuc2h1dGRvd24oKSAjIGhhbmdzIGZvcmV2ZXIsIHB5dGhvbiBkb2Vzbid0IGhhbmRsZSBQT0xMTlZBTCBwcm9wZXJseSEKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvc2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5weSBiL2xpYi9weS9zcmMvc2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5weQppbmRleCA0YTAzNWI2Li5mNjJkNDg2IDEwMDY0NAotLS0gYS9saWIvcHkvc3JjL3NlcnZlci9UTm9uYmxvY2tpbmdTZXJ2ZXIucHkKKysrIGIvbGliL3B5L3NyYy9zZXJ2ZXIvVE5vbmJsb2NraW5nU2VydmVyLnB5CkBAIC0yNCwyMCArMjQsMjMgQEAKIFRoZSB0aHJlYWQgcG9vb2wgc2hvdWxkIGJlIHNpemVkIGZvciBjb25jdXJyZW50IHRhc2tzLCBub3QKIG1heGltdW0gY29ubmVjdGlvbnMKICIiIgotaW1wb3J0IHRocmVhZGluZwotaW1wb3J0IHNvY2tldAotaW1wb3J0IFF1ZXVlCi1pbXBvcnQgc2VsZWN0Ci1pbXBvcnQgc3RydWN0CiAKIGltcG9ydCBsb2dnaW5nCi1sb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKK2ltcG9ydCBzZWxlY3QKK2ltcG9ydCBzb2NrZXQKK2ltcG9ydCBzdHJ1Y3QKK2ltcG9ydCB0aHJlYWRpbmcKKworZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgZGVxdWUKK2Zyb20gc2l4Lm1vdmVzIGltcG9ydCBxdWV1ZQogCiBmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQKIGZyb20gdGhyaWZ0LnByb3RvY29sLlRCaW5hcnlQcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sRmFjdG9yeQogCiBfX2FsbF9fID0gWydUTm9uYmxvY2tpbmdTZXJ2ZXInXQogCitsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKKwogCiBjbGFzcyBXb3JrZXIodGhyZWFkaW5nLlRocmVhZCk6CiAgICAgIiIiV29ya2VyIGlzIGEgc21hbGwgaGVscGVyIHRvIHByb2Nlc3MgaW5jb21pbmcgY29ubmVjdGlvbi4iIiIKQEAgLTU2LDggKzU5LDkgQEAKICAgICAgICAgICAgICAgICBwcm9jZXNzb3IucHJvY2VzcyhpcHJvdCwgb3Byb3QpCiAgICAgICAgICAgICAgICAgY2FsbGJhY2soVHJ1ZSwgb3RyYW5zLmdldHZhbHVlKCkpCiAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgotICAgICAgICAgICAgICAgIGxvZ2dlci5leGNlcHRpb24oIkV4Y2VwdGlvbiB3aGlsZSBwcm9jZXNzaW5nIHJlcXVlc3QiKQotICAgICAgICAgICAgICAgIGNhbGxiYWNrKEZhbHNlLCAnJykKKyAgICAgICAgICAgICAgICBsb2dnZXIuZXhjZXB0aW9uKCJFeGNlcHRpb24gd2hpbGUgcHJvY2Vzc2luZyByZXF1ZXN0IiwgZXhjX2luZm89VHJ1ZSkKKyAgICAgICAgICAgICAgICBjYWxsYmFjayhGYWxzZSwgYicnKQorCiAKIFdBSVRfTEVOID0gMAogV0FJVF9NRVNTQUdFID0gMQpAQCAtODMsMTEgKzg3LDI0IEBACiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHJldHVybiBmdW5jKHNlbGYsICphcmdzLCAqKmt3YXJncykKICAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvcjoKKyAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnaWdub3Jpbmcgc29ja2V0IGV4Y2VwdGlvbicsIGV4Y19pbmZvPVRydWUpCiAgICAgICAgICAgICBzZWxmLmNsb3NlKCkKICAgICByZXR1cm4gcmVhZAogCiAKLWNsYXNzIENvbm5lY3Rpb246CitjbGFzcyBNZXNzYWdlKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG9mZnNldCwgbGVuXywgaGVhZGVyKToKKyAgICAgICAgc2VsZi5vZmZzZXQgPSBvZmZzZXQKKyAgICAgICAgc2VsZi5sZW4gPSBsZW5fCisgICAgICAgIHNlbGYuYnVmZmVyID0gTm9uZQorICAgICAgICBzZWxmLmlzX2hlYWRlciA9IGhlYWRlcgorCisgICAgQHByb3BlcnR5CisgICAgZGVmIGVuZChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYub2Zmc2V0ICsgc2VsZi5sZW4KKworCitjbGFzcyBDb25uZWN0aW9uKG9iamVjdCk6CiAgICAgIiIiQmFzaWMgY2xhc3MgaXMgcmVwcmVzZW50ZWQgY29ubmVjdGlvbi4KIAogICAgIEl0IGNhbiBiZSBpbiBzdGF0ZToKQEAgLTEwNCw2OCArMTIxLDYwIEBACiAgICAgICAgIHNlbGYuc29ja2V0LnNldGJsb2NraW5nKEZhbHNlKQogICAgICAgICBzZWxmLnN0YXR1cyA9IFdBSVRfTEVOCiAgICAgICAgIHNlbGYubGVuID0gMAotICAgICAgICBzZWxmLm1lc3NhZ2UgPSAnJworICAgICAgICBzZWxmLnJlY2VpdmVkID0gZGVxdWUoKQorICAgICAgICBzZWxmLl9yZWFkaW5nID0gTWVzc2FnZSgwLCA0LCBUcnVlKQorICAgICAgICBzZWxmLl9yYnVmID0gYicnCisgICAgICAgIHNlbGYuX3didWYgPSBiJycKICAgICAgICAgc2VsZi5sb2NrID0gdGhyZWFkaW5nLkxvY2soKQogICAgICAgICBzZWxmLndha2VfdXAgPSB3YWtlX3VwCi0KLSAgICBkZWYgX3JlYWRfbGVuKHNlbGYpOgotICAgICAgICAiIiJSZWFkcyBsZW5ndGggb2YgcmVxdWVzdC4KLQotICAgICAgICBJdCdzIGEgc2FmZXIgYWx0ZXJuYXRpdmUgdG8gc2VsZi5zb2NrZXQucmVjdig0KQotICAgICAgICAiIiIKLSAgICAgICAgcmVhZCA9IHNlbGYuc29ja2V0LnJlY3YoNCAtIGxlbihzZWxmLm1lc3NhZ2UpKQotICAgICAgICBpZiBsZW4ocmVhZCkgPT0gMDoKLSAgICAgICAgICAgICMgaWYgd2UgcmVhZCAwIGJ5dGVzIGFuZCBzZWxmLm1lc3NhZ2UgaXMgZW1wdHksIHRoZW4KLSAgICAgICAgICAgICMgdGhlIGNsaWVudCBjbG9zZWQgdGhlIGNvbm5lY3Rpb24KLSAgICAgICAgICAgIGlmIGxlbihzZWxmLm1lc3NhZ2UpICE9IDA6Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJjYW4ndCByZWFkIGZyYW1lIHNpemUgZnJvbSBzb2NrZXQiKQotICAgICAgICAgICAgc2VsZi5jbG9zZSgpCi0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgc2VsZi5tZXNzYWdlICs9IHJlYWQKLSAgICAgICAgaWYgbGVuKHNlbGYubWVzc2FnZSkgPT0gNDoKLSAgICAgICAgICAgIHNlbGYubGVuLCA9IHN0cnVjdC51bnBhY2soJyFpJywgc2VsZi5tZXNzYWdlKQotICAgICAgICAgICAgaWYgc2VsZi5sZW4gPCAwOgotICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcigibmVnYXRpdmUgZnJhbWUgc2l6ZSwgaXQgc2VlbXMgY2xpZW50ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkb2Vzbid0IHVzZSBGcmFtZWRUcmFuc3BvcnQiKQotICAgICAgICAgICAgICAgIHNlbGYuY2xvc2UoKQotICAgICAgICAgICAgZWxpZiBzZWxmLmxlbiA9PSAwOgotICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiZW1wdHkgZnJhbWUsIGl0J3MgcmVhbGx5IHN0cmFuZ2UiKQotICAgICAgICAgICAgICAgIHNlbGYuY2xvc2UoKQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBzZWxmLm1lc3NhZ2UgPSAnJwotICAgICAgICAgICAgICAgIHNlbGYuc3RhdHVzID0gV0FJVF9NRVNTQUdFCisgICAgICAgIHNlbGYucmVtYWluaW5nID0gRmFsc2UKIAogICAgIEBzb2NrZXRfZXhjZXB0aW9uCiAgICAgZGVmIHJlYWQoc2VsZik6CiAgICAgICAgICIiIlJlYWRzIGRhdGEgZnJvbSBzdHJlYW0gYW5kIHN3aXRjaCBzdGF0ZS4iIiIKICAgICAgICAgYXNzZXJ0IHNlbGYuc3RhdHVzIGluIChXQUlUX0xFTiwgV0FJVF9NRVNTQUdFKQotICAgICAgICBpZiBzZWxmLnN0YXR1cyA9PSBXQUlUX0xFTjoKLSAgICAgICAgICAgIHNlbGYuX3JlYWRfbGVuKCkKLSAgICAgICAgICAgICMgZ28gYmFjayB0byB0aGUgbWFpbiBsb29wIGhlcmUgZm9yIHNpbXBsaWNpdHkgaW5zdGVhZCBvZgotICAgICAgICAgICAgIyBmYWxsaW5nIHRocm91Z2gsIGV2ZW4gdGhvdWdoIHRoZXJlIGlzIGEgZ29vZCBjaGFuY2UgdGhhdAotICAgICAgICAgICAgIyB0aGUgbWVzc2FnZSBpcyBhbHJlYWR5IGF2YWlsYWJsZQotICAgICAgICBlbGlmIHNlbGYuc3RhdHVzID09IFdBSVRfTUVTU0FHRToKLSAgICAgICAgICAgIHJlYWQgPSBzZWxmLnNvY2tldC5yZWN2KHNlbGYubGVuIC0gbGVuKHNlbGYubWVzc2FnZSkpCi0gICAgICAgICAgICBpZiBsZW4ocmVhZCkgPT0gMDoKLSAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoImNhbid0IHJlYWQgZnJhbWUgZnJvbSBzb2NrZXQgKGdldCAlZCBvZiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJWQgYnl0ZXMpIiAlIChsZW4oc2VsZi5tZXNzYWdlKSwgc2VsZi5sZW4pKQorICAgICAgICBhc3NlcnQgbm90IHNlbGYucmVjZWl2ZWQKKyAgICAgICAgYnVmX3NpemUgPSA4MTkyCisgICAgICAgIGZpcnN0ID0gVHJ1ZQorICAgICAgICBkb25lID0gRmFsc2UKKyAgICAgICAgd2hpbGUgbm90IGRvbmU6CisgICAgICAgICAgICByZWFkID0gc2VsZi5zb2NrZXQucmVjdihidWZfc2l6ZSkKKyAgICAgICAgICAgIHJsZW4gPSBsZW4ocmVhZCkKKyAgICAgICAgICAgIGRvbmUgPSBybGVuIDwgYnVmX3NpemUKKyAgICAgICAgICAgIHNlbGYuX3JidWYgKz0gcmVhZAorICAgICAgICAgICAgaWYgZmlyc3QgYW5kIHJsZW4gPT0gMDoKKyAgICAgICAgICAgICAgICBpZiBzZWxmLnN0YXR1cyAhPSBXQUlUX0xFTiBvciBzZWxmLl9yYnVmOgorICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ2NvdWxkIG5vdCByZWFkIGZyYW1lIGZyb20gc29ja2V0JykKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ3JlYWQgemVybyBsZW5ndGguIGNsaWVudCBtaWdodCBoYXZlIGRpc2Nvbm5lY3RlZCcpCiAgICAgICAgICAgICAgICAgc2VsZi5jbG9zZSgpCi0gICAgICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICBzZWxmLm1lc3NhZ2UgKz0gcmVhZAotICAgICAgICAgICAgaWYgbGVuKHNlbGYubWVzc2FnZSkgPT0gc2VsZi5sZW46CisgICAgICAgICAgICB3aGlsZSBsZW4oc2VsZi5fcmJ1ZikgPj0gc2VsZi5fcmVhZGluZy5lbmQ6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5fcmVhZGluZy5pc19oZWFkZXI6CisgICAgICAgICAgICAgICAgICAgIG1sZW4sID0gc3RydWN0LnVucGFjaygnIWknLCBzZWxmLl9yYnVmWzo0XSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fcmVhZGluZyA9IE1lc3NhZ2Uoc2VsZi5fcmVhZGluZy5lbmQsIG1sZW4sIEZhbHNlKQorICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXR1cyA9IFdBSVRfTUVTU0FHRQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX3JlYWRpbmcuYnVmZmVyID0gc2VsZi5fcmJ1ZgorICAgICAgICAgICAgICAgICAgICBzZWxmLnJlY2VpdmVkLmFwcGVuZChzZWxmLl9yZWFkaW5nKQorICAgICAgICAgICAgICAgICAgICBzZWxmLl9yYnVmID0gc2VsZi5fcmJ1ZltzZWxmLl9yZWFkaW5nLmVuZDpdCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX3JlYWRpbmcgPSBNZXNzYWdlKDAsIDQsIFRydWUpCisgICAgICAgICAgICBmaXJzdCA9IEZhbHNlCisgICAgICAgICAgICBpZiBzZWxmLnJlY2VpdmVkOgogICAgICAgICAgICAgICAgIHNlbGYuc3RhdHVzID0gV0FJVF9QUk9DRVNTCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgc2VsZi5yZW1haW5pbmcgPSBub3QgZG9uZQogCiAgICAgQHNvY2tldF9leGNlcHRpb24KICAgICBkZWYgd3JpdGUoc2VsZik6CiAgICAgICAgICIiIldyaXRlcyBkYXRhIGZyb20gc29ja2V0IGFuZCBzd2l0Y2ggc3RhdGUuIiIiCiAgICAgICAgIGFzc2VydCBzZWxmLnN0YXR1cyA9PSBTRU5EX0FOU1dFUgotICAgICAgICBzZW50ID0gc2VsZi5zb2NrZXQuc2VuZChzZWxmLm1lc3NhZ2UpCi0gICAgICAgIGlmIHNlbnQgPT0gbGVuKHNlbGYubWVzc2FnZSk6CisgICAgICAgIHNlbnQgPSBzZWxmLnNvY2tldC5zZW5kKHNlbGYuX3didWYpCisgICAgICAgIGlmIHNlbnQgPT0gbGVuKHNlbGYuX3didWYpOgogICAgICAgICAgICAgc2VsZi5zdGF0dXMgPSBXQUlUX0xFTgotICAgICAgICAgICAgc2VsZi5tZXNzYWdlID0gJycKKyAgICAgICAgICAgIHNlbGYuX3didWYgPSBiJycKICAgICAgICAgICAgIHNlbGYubGVuID0gMAogICAgICAgICBlbHNlOgotICAgICAgICAgICAgc2VsZi5tZXNzYWdlID0gc2VsZi5tZXNzYWdlW3NlbnQ6XQorICAgICAgICAgICAgc2VsZi5fd2J1ZiA9IHNlbGYuX3didWZbc2VudDpdCiAKICAgICBAbG9ja2VkCiAgICAgZGVmIHJlYWR5KHNlbGYsIGFsbF9vaywgbWVzc2FnZSk6CkBAIC0xODUsMTMgKzE5NCwxMyBAQAogICAgICAgICAgICAgc2VsZi5jbG9zZSgpCiAgICAgICAgICAgICBzZWxmLndha2VfdXAoKQogICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIHNlbGYubGVuID0gJycKKyAgICAgICAgc2VsZi5sZW4gPSAwCiAgICAgICAgIGlmIGxlbihtZXNzYWdlKSA9PSAwOgogICAgICAgICAgICAgIyBpdCB3YXMgYSBvbmV3YXkgcmVxdWVzdCwgZG8gbm90IHdyaXRlIGFuc3dlcgotICAgICAgICAgICAgc2VsZi5tZXNzYWdlID0gJycKKyAgICAgICAgICAgIHNlbGYuX3didWYgPSBiJycKICAgICAgICAgICAgIHNlbGYuc3RhdHVzID0gV0FJVF9MRU4KICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYubWVzc2FnZSA9IHN0cnVjdC5wYWNrKCchaScsIGxlbihtZXNzYWdlKSkgKyBtZXNzYWdlCisgICAgICAgICAgICBzZWxmLl93YnVmID0gc3RydWN0LnBhY2soJyFpJywgbGVuKG1lc3NhZ2UpKSArIG1lc3NhZ2UKICAgICAgICAgICAgIHNlbGYuc3RhdHVzID0gU0VORF9BTlNXRVIKICAgICAgICAgc2VsZi53YWtlX3VwKCkKIApAQCAtMjIxLDcgKzIzMCw3IEBACiAgICAgICAgIHNlbGYuc29ja2V0LmNsb3NlKCkKIAogCi1jbGFzcyBUTm9uYmxvY2tpbmdTZXJ2ZXI6CitjbGFzcyBUTm9uYmxvY2tpbmdTZXJ2ZXIob2JqZWN0KToKICAgICAiIiJOb24tYmxvY2tpbmcgc2VydmVyLiIiIgogCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsCkBAIC0yMzYsNyArMjQ1LDcgQEAKICAgICAgICAgc2VsZi5vdXRfcHJvdG9jb2wgPSBvdXRwdXRQcm90b2NvbEZhY3Rvcnkgb3Igc2VsZi5pbl9wcm90b2NvbAogICAgICAgICBzZWxmLnRocmVhZHMgPSBpbnQodGhyZWFkcykKICAgICAgICAgc2VsZi5jbGllbnRzID0ge30KLSAgICAgICAgc2VsZi50YXNrcyA9IFF1ZXVlLlF1ZXVlKCkKKyAgICAgICAgc2VsZi50YXNrcyA9IHF1ZXVlLlF1ZXVlKCkKICAgICAgICAgc2VsZi5fcmVhZCwgc2VsZi5fd3JpdGUgPSBzb2NrZXQuc29ja2V0cGFpcigpCiAgICAgICAgIHNlbGYucHJlcGFyZWQgPSBGYWxzZQogICAgICAgICBzZWxmLl9zdG9wID0gRmFsc2UKQEAgLTI1Miw3ICsyNjEsNyBAQAogICAgICAgICBpZiBzZWxmLnByZXBhcmVkOgogICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgIHNlbGYuc29ja2V0Lmxpc3RlbigpCi0gICAgICAgIGZvciBfIGluIHhyYW5nZShzZWxmLnRocmVhZHMpOgorICAgICAgICBmb3IgXyBpbiByYW5nZShzZWxmLnRocmVhZHMpOgogICAgICAgICAgICAgdGhyZWFkID0gV29ya2VyKHNlbGYudGFza3MpCiAgICAgICAgICAgICB0aHJlYWQuc2V0RGFlbW9uKFRydWUpCiAgICAgICAgICAgICB0aHJlYWQuc3RhcnQoKQpAQCAtMjYxLDcgKzI3MCw3IEBACiAgICAgZGVmIHdha2VfdXAoc2VsZik6CiAgICAgICAgICIiIldha2UgdXAgbWFpbiB0aHJlYWQuCiAKLSAgICAgICAgVGhlIHNlcnZlciB1c3VhbHkgd2FpdHMgaW4gc2VsZWN0IGNhbGwgaW4gd2Ugc2hvdWxkIHRlcm1pbmF0ZSBvbmUuCisgICAgICAgIFRoZSBzZXJ2ZXIgdXN1YWxseSB3YWl0cyBpbiBzZWxlY3QgY2FsbCBpbiB3ZSBzaG91bGQgdGVybWluYXRlIG9uZS4KICAgICAgICAgVGhlIHNpbXBsZXN0IHdheSBpcyB1c2luZyBzb2NrZXRwYWlyLgogCiAgICAgICAgIFNlbGVjdCBhbHdheXMgd2FpdCB0byByZWFkIGZyb20gdGhlIGZpcnN0IHNvY2tldCBvZiBzb2NrZXRwYWlyLgpAQCAtMjY5LDcgKzI3OCw3IEBACiAgICAgICAgIEluIHRoaXMgY2FzZSwgd2UgY2FuIGp1c3Qgd3JpdGUgYW55dGhpbmcgdG8gdGhlIHNlY29uZCBzb2NrZXQgZnJvbQogICAgICAgICBzb2NrZXRwYWlyLgogICAgICAgICAiIiIKLSAgICAgICAgc2VsZi5fd3JpdGUuc2VuZCgnMScpCisgICAgICAgIHNlbGYuX3dyaXRlLnNlbmQoYicxJykKIAogICAgIGRlZiBzdG9wKHNlbGYpOgogICAgICAgICAiIiJTdG9wIHRoZSBzZXJ2ZXIuCkBAIC0yOTAsMTQgKzI5OSwyMCBAQAogICAgICAgICAiIiJEb2VzIHNlbGVjdCBvbiBvcGVuIGNvbm5lY3Rpb25zLiIiIgogICAgICAgICByZWFkYWJsZSA9IFtzZWxmLnNvY2tldC5oYW5kbGUuZmlsZW5vKCksIHNlbGYuX3JlYWQuZmlsZW5vKCldCiAgICAgICAgIHdyaXRhYmxlID0gW10KLSAgICAgICAgZm9yIGksIGNvbm5lY3Rpb24gaW4gc2VsZi5jbGllbnRzLml0ZW1zKCk6CisgICAgICAgIHJlbWFpbmluZyA9IFtdCisgICAgICAgIGZvciBpLCBjb25uZWN0aW9uIGluIGxpc3Qoc2VsZi5jbGllbnRzLml0ZW1zKCkpOgogICAgICAgICAgICAgaWYgY29ubmVjdGlvbi5pc19yZWFkYWJsZSgpOgogICAgICAgICAgICAgICAgIHJlYWRhYmxlLmFwcGVuZChjb25uZWN0aW9uLmZpbGVubygpKQorICAgICAgICAgICAgICAgIGlmIGNvbm5lY3Rpb24ucmVtYWluaW5nIG9yIGNvbm5lY3Rpb24ucmVjZWl2ZWQ6CisgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZy5hcHBlbmQoY29ubmVjdGlvbi5maWxlbm8oKSkKICAgICAgICAgICAgIGlmIGNvbm5lY3Rpb24uaXNfd3JpdGVhYmxlKCk6CiAgICAgICAgICAgICAgICAgd3JpdGFibGUuYXBwZW5kKGNvbm5lY3Rpb24uZmlsZW5vKCkpCiAgICAgICAgICAgICBpZiBjb25uZWN0aW9uLmlzX2Nsb3NlZCgpOgogICAgICAgICAgICAgICAgIGRlbCBzZWxmLmNsaWVudHNbaV0KLSAgICAgICAgcmV0dXJuIHNlbGVjdC5zZWxlY3QocmVhZGFibGUsIHdyaXRhYmxlLCByZWFkYWJsZSkKKyAgICAgICAgaWYgcmVtYWluaW5nOgorICAgICAgICAgICAgcmV0dXJuIHJlbWFpbmluZywgW10sIFtdLCBGYWxzZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGVjdC5zZWxlY3QocmVhZGFibGUsIHdyaXRhYmxlLCByZWFkYWJsZSkgKyAoVHJ1ZSwpCiAKICAgICBkZWYgaGFuZGxlKHNlbGYpOgogICAgICAgICAiIiJIYW5kbGUgcmVxdWVzdHMuCkBAIC0zMDUsMjAgKzMyMCwyNyBAQAogICAgICAgICBXQVJOSU5HISBZb3UgbXVzdCBjYWxsIHByZXBhcmUoKSBCRUZPUkUgY2FsbGluZyBoYW5kbGUoKQogICAgICAgICAiIiIKICAgICAgICAgYXNzZXJ0IHNlbGYucHJlcGFyZWQsICJZb3UgaGF2ZSB0byBjYWxsIHByZXBhcmUgYmVmb3JlIGhhbmRsZSIKLSAgICAgICAgcnNldCwgd3NldCwgeHNldCA9IHNlbGYuX3NlbGVjdCgpCisgICAgICAgIHJzZXQsIHdzZXQsIHhzZXQsIHNlbGVjdGVkID0gc2VsZi5fc2VsZWN0KCkKICAgICAgICAgZm9yIHJlYWRhYmxlIGluIHJzZXQ6CiAgICAgICAgICAgICBpZiByZWFkYWJsZSA9PSBzZWxmLl9yZWFkLmZpbGVubygpOgogICAgICAgICAgICAgICAgICMgZG9uJ3QgY2FyZSBpIGp1c3QgbmVlZCB0byBjbGVhbiByZWFkYWJsZSBmbGFnCiAgICAgICAgICAgICAgICAgc2VsZi5fcmVhZC5yZWN2KDEwMjQpCiAgICAgICAgICAgICBlbGlmIHJlYWRhYmxlID09IHNlbGYuc29ja2V0LmhhbmRsZS5maWxlbm8oKToKLSAgICAgICAgICAgICAgICBjbGllbnQgPSBzZWxmLnNvY2tldC5hY2NlcHQoKS5oYW5kbGUKLSAgICAgICAgICAgICAgICBzZWxmLmNsaWVudHNbY2xpZW50LmZpbGVubygpXSA9IENvbm5lY3Rpb24oY2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLndha2VfdXApCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBjbGllbnQgPSBzZWxmLnNvY2tldC5hY2NlcHQoKQorICAgICAgICAgICAgICAgICAgICBpZiBjbGllbnQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNsaWVudHNbY2xpZW50LmhhbmRsZS5maWxlbm8oKV0gPSBDb25uZWN0aW9uKGNsaWVudC5oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYud2FrZV91cCkKKyAgICAgICAgICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yOgorICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ2Vycm9yIHdoaWxlIGFjY2VwdGluZycsIGV4Y19pbmZvPVRydWUpCiAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24gPSBzZWxmLmNsaWVudHNbcmVhZGFibGVdCi0gICAgICAgICAgICAgICAgY29ubmVjdGlvbi5yZWFkKCkKLSAgICAgICAgICAgICAgICBpZiBjb25uZWN0aW9uLnN0YXR1cyA9PSBXQUlUX1BST0NFU1M6Ci0gICAgICAgICAgICAgICAgICAgIGl0cmFuc3BvcnQgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoY29ubmVjdGlvbi5tZXNzYWdlKQorICAgICAgICAgICAgICAgIGlmIHNlbGVjdGVkOgorICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLnJlYWQoKQorICAgICAgICAgICAgICAgIGlmIGNvbm5lY3Rpb24ucmVjZWl2ZWQ6CisgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uc3RhdHVzID0gV0FJVF9QUk9DRVNTCisgICAgICAgICAgICAgICAgICAgIG1zZyA9IGNvbm5lY3Rpb24ucmVjZWl2ZWQucG9wbGVmdCgpCisgICAgICAgICAgICAgICAgICAgIGl0cmFuc3BvcnQgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIobXNnLmJ1ZmZlciwgbXNnLm9mZnNldCkKICAgICAgICAgICAgICAgICAgICAgb3RyYW5zcG9ydCA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcigpCiAgICAgICAgICAgICAgICAgICAgIGlwcm90ID0gc2VsZi5pbl9wcm90b2NvbC5nZXRQcm90b2NvbChpdHJhbnNwb3J0KQogICAgICAgICAgICAgICAgICAgICBvcHJvdCA9IHNlbGYub3V0X3Byb3RvY29sLmdldFByb3RvY29sKG90cmFuc3BvcnQpCkBAIC0zMzIsNyArMzU0LDcgQEAKIAogICAgIGRlZiBjbG9zZShzZWxmKToKICAgICAgICAgIiIiQ2xvc2VzIHRoZSBzZXJ2ZXIuIiIiCi0gICAgICAgIGZvciBfIGluIHhyYW5nZShzZWxmLnRocmVhZHMpOgorICAgICAgICBmb3IgXyBpbiByYW5nZShzZWxmLnRocmVhZHMpOgogICAgICAgICAgICAgc2VsZi50YXNrcy5wdXQoW05vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmVdKQogICAgICAgICBzZWxmLnNvY2tldC5jbG9zZSgpCiAgICAgICAgIHNlbGYucHJlcGFyZWQgPSBGYWxzZQpkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9zZXJ2ZXIvVFByb2Nlc3NQb29sU2VydmVyLnB5IGIvbGliL3B5L3NyYy9zZXJ2ZXIvVFByb2Nlc3NQb29sU2VydmVyLnB5CmluZGV4IGVlZmI2MjMuLmZlNmRjODEgMTAwNjQ0Ci0tLSBhL2xpYi9weS9zcmMvc2VydmVyL1RQcm9jZXNzUG9vbFNlcnZlci5weQorKysgYi9saWIvcHkvc3JjL3NlcnZlci9UUHJvY2Vzc1Bvb2xTZXJ2ZXIucHkKQEAgLTE5LDEzICsxOSwxNCBAQAogCiAKIGltcG9ydCBsb2dnaW5nCi1sb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKIAotZnJvbSBtdWx0aXByb2Nlc3NpbmcgaW1wb3J0ICBQcm9jZXNzLCBWYWx1ZSwgQ29uZGl0aW9uLCByZWR1Y3Rpb24KK2Zyb20gbXVsdGlwcm9jZXNzaW5nIGltcG9ydCBQcm9jZXNzLCBWYWx1ZSwgQ29uZGl0aW9uCiAKLWZyb20gVFNlcnZlciBpbXBvcnQgVFNlcnZlcgorZnJvbSAuVFNlcnZlciBpbXBvcnQgVFNlcnZlcgogZnJvbSB0aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnRFeGNlcHRpb24KIAorbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCisKIAogY2xhc3MgVFByb2Nlc3NQb29sU2VydmVyKFRTZXJ2ZXIpOgogICAgICIiIlNlcnZlciB3aXRoIGEgZml4ZWQgc2l6ZSBwb29sIG9mIHdvcmtlciBzdWJwcm9jZXNzZXMgdG8gc2VydmljZSByZXF1ZXN0cwpAQCAtNTksMTEgKzYwLDExIEBACiAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgY2xpZW50ID0gc2VsZi5zZXJ2ZXJUcmFuc3BvcnQuYWNjZXB0KCkKICAgICAgICAgICAgICAgICBpZiBub3QgY2xpZW50OgotICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgICBzZWxmLnNlcnZlQ2xpZW50KGNsaWVudCkKICAgICAgICAgICAgIGV4Y2VwdCAoS2V5Ym9hcmRJbnRlcnJ1cHQsIFN5c3RlbUV4aXQpOgogICAgICAgICAgICAgICAgIHJldHVybiAwCi0gICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uLCB4OgorICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyB4OgogICAgICAgICAgICAgICAgIGxvZ2dlci5leGNlcHRpb24oeCkKIAogICAgIGRlZiBzZXJ2ZUNsaWVudChzZWxmLCBjbGllbnQpOgpAQCAtNzYsOSArNzcsOSBAQAogICAgICAgICB0cnk6CiAgICAgICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICAgICAgIHNlbGYucHJvY2Vzc29yLnByb2Nlc3MoaXByb3QsIG9wcm90KQotICAgICAgICBleGNlcHQgVFRyYW5zcG9ydEV4Y2VwdGlvbiwgdHg6CisgICAgICAgIGV4Y2VwdCBUVHJhbnNwb3J0RXhjZXB0aW9uOgogICAgICAgICAgICAgcGFzcwotICAgICAgICBleGNlcHQgRXhjZXB0aW9uLCB4OgorICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIHg6CiAgICAgICAgICAgICBsb2dnZXIuZXhjZXB0aW9uKHgpCiAKICAgICAgICAgaXRyYW5zLmNsb3NlKCkKQEAgLTk5LDcgKzEwMCw3IEBACiAgICAgICAgICAgICAgICAgdy5kYWVtb24gPSBUcnVlCiAgICAgICAgICAgICAgICAgdy5zdGFydCgpCiAgICAgICAgICAgICAgICAgc2VsZi53b3JrZXJzLmFwcGVuZCh3KQotICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiwgeDoKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgeDoKICAgICAgICAgICAgICAgICBsb2dnZXIuZXhjZXB0aW9uKHgpCiAKICAgICAgICAgIyB3YWl0IHVudGlsIHRoZSBjb25kaXRpb24gaXMgc2V0IGJ5IHN0b3AoKQpAQCAtMTEwLDcgKzExMSw3IEBACiAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgIGV4Y2VwdCAoU3lzdGVtRXhpdCwgS2V5Ym9hcmRJbnRlcnJ1cHQpOgogICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uLCB4OgorICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyB4OgogICAgICAgICAgICAgICAgIGxvZ2dlci5leGNlcHRpb24oeCkKIAogICAgICAgICBzZWxmLmlzUnVubmluZy52YWx1ZSA9IEZhbHNlCmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL3NlcnZlci9UU2VydmVyLnB5IGIvbGliL3B5L3NyYy9zZXJ2ZXIvVFNlcnZlci5weQppbmRleCAwMGZkOGNmLi5kZjJhN2JiIDEwMDY0NAotLS0gYS9saWIvcHkvc3JjL3NlcnZlci9UU2VydmVyLnB5CisrKyBiL2xpYi9weS9zcmMvc2VydmVyL1RTZXJ2ZXIucHkKQEAgLTE3LDI2MyArMTcsMzA3IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1pbXBvcnQgUXVldWUKLWltcG9ydCBvcwotaW1wb3J0IHN5cwotaW1wb3J0IHRocmVhZGluZwotaW1wb3J0IHRyYWNlYmFjawotCitmcm9tIHNpeC5tb3ZlcyBpbXBvcnQgcXVldWUKIGltcG9ydCBsb2dnaW5nCi1sb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKK2ltcG9ydCBvcworaW1wb3J0IHRocmVhZGluZwogCi1mcm9tIHRocmlmdC5UaHJpZnQgaW1wb3J0IFRQcm9jZXNzb3IKIGZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wKK2Zyb20gdGhyaWZ0LnByb3RvY29sLlRIZWFkZXJQcm90b2NvbCBpbXBvcnQgVEhlYWRlclByb3RvY29sRmFjdG9yeQogZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0CiAKK2xvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQogCi1jbGFzcyBUU2VydmVyOgotICAiIiJCYXNlIGludGVyZmFjZSBmb3IgYSBzZXJ2ZXIsIHdoaWNoIG11c3QgaGF2ZSBhIHNlcnZlKCkgbWV0aG9kLgogCi0gIFRocmVlIGNvbnN0cnVjdG9ycyBmb3IgYWxsIHNlcnZlcnM6Ci0gIDEpIChwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCkKLSAgMikgKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpCi0gIDMpIChwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5LCBvdXRwdXRQcm90b2NvbEZhY3RvcnkpCi0gICIiIgotICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MpOgotICAgIGlmIChsZW4oYXJncykgPT0gMik6Ci0gICAgICBzZWxmLl9faW5pdEFyZ3NfXyhhcmdzWzBdLCBhcmdzWzFdLAotICAgICAgICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydC5UVHJhbnNwb3J0RmFjdG9yeUJhc2UoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnQuVFRyYW5zcG9ydEZhY3RvcnlCYXNlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSkKLSAgICBlbGlmIChsZW4oYXJncykgPT0gNCk6Ci0gICAgICBzZWxmLl9faW5pdEFyZ3NfXyhhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzJdLCBhcmdzWzNdLCBhcmdzWzNdKQotICAgIGVsaWYgKGxlbihhcmdzKSA9PSA2KToKLSAgICAgIHNlbGYuX19pbml0QXJnc19fKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10sIGFyZ3NbNF0sIGFyZ3NbNV0pCitjbGFzcyBUU2VydmVyKG9iamVjdCk6CisgICAgIiIiQmFzZSBpbnRlcmZhY2UgZm9yIGEgc2VydmVyLCB3aGljaCBtdXN0IGhhdmUgYSBzZXJ2ZSgpIG1ldGhvZC4KIAotICBkZWYgX19pbml0QXJnc19fKHNlbGYsIHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KToKLSAgICBzZWxmLnByb2Nlc3NvciA9IHByb2Nlc3NvcgotICAgIHNlbGYuc2VydmVyVHJhbnNwb3J0ID0gc2VydmVyVHJhbnNwb3J0Ci0gICAgc2VsZi5pbnB1dFRyYW5zcG9ydEZhY3RvcnkgPSBpbnB1dFRyYW5zcG9ydEZhY3RvcnkKLSAgICBzZWxmLm91dHB1dFRyYW5zcG9ydEZhY3RvcnkgPSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5Ci0gICAgc2VsZi5pbnB1dFByb3RvY29sRmFjdG9yeSA9IGlucHV0UHJvdG9jb2xGYWN0b3J5Ci0gICAgc2VsZi5vdXRwdXRQcm90b2NvbEZhY3RvcnkgPSBvdXRwdXRQcm90b2NvbEZhY3RvcnkKKyAgICBUaHJlZSBjb25zdHJ1Y3RvcnMgZm9yIGFsbCBzZXJ2ZXJzOgorICAgIDEpIChwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCkKKyAgICAyKSAocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSkKKyAgICAzKSAocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnksIG91dHB1dFByb3RvY29sRmFjdG9yeSkKKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MpOgorICAgICAgICBpZiAobGVuKGFyZ3MpID09IDIpOgorICAgICAgICAgICAgc2VsZi5fX2luaXRBcmdzX18oYXJnc1swXSwgYXJnc1sxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnQuVFRyYW5zcG9ydEZhY3RvcnlCYXNlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0LlRUcmFuc3BvcnRGYWN0b3J5QmFzZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpCisgICAgICAgIGVsaWYgKGxlbihhcmdzKSA9PSA0KToKKyAgICAgICAgICAgIHNlbGYuX19pbml0QXJnc19fKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbMl0sIGFyZ3NbM10sIGFyZ3NbM10pCisgICAgICAgIGVsaWYgKGxlbihhcmdzKSA9PSA2KToKKyAgICAgICAgICAgIHNlbGYuX19pbml0QXJnc19fKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10sIGFyZ3NbNF0sIGFyZ3NbNV0pCiAKLSAgZGVmIHNlcnZlKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgX19pbml0QXJnc19fKHNlbGYsIHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LCBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnksIG91dHB1dFByb3RvY29sRmFjdG9yeSk6CisgICAgICAgIHNlbGYucHJvY2Vzc29yID0gcHJvY2Vzc29yCisgICAgICAgIHNlbGYuc2VydmVyVHJhbnNwb3J0ID0gc2VydmVyVHJhbnNwb3J0CisgICAgICAgIHNlbGYuaW5wdXRUcmFuc3BvcnRGYWN0b3J5ID0gaW5wdXRUcmFuc3BvcnRGYWN0b3J5CisgICAgICAgIHNlbGYub3V0cHV0VHJhbnNwb3J0RmFjdG9yeSA9IG91dHB1dFRyYW5zcG9ydEZhY3RvcnkKKyAgICAgICAgc2VsZi5pbnB1dFByb3RvY29sRmFjdG9yeSA9IGlucHV0UHJvdG9jb2xGYWN0b3J5CisgICAgICAgIHNlbGYub3V0cHV0UHJvdG9jb2xGYWN0b3J5ID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5CisKKyAgICAgICAgaW5wdXRfaXNfaGVhZGVyID0gaXNpbnN0YW5jZShzZWxmLmlucHV0UHJvdG9jb2xGYWN0b3J5LCBUSGVhZGVyUHJvdG9jb2xGYWN0b3J5KQorICAgICAgICBvdXRwdXRfaXNfaGVhZGVyID0gaXNpbnN0YW5jZShzZWxmLm91dHB1dFByb3RvY29sRmFjdG9yeSwgVEhlYWRlclByb3RvY29sRmFjdG9yeSkKKyAgICAgICAgaWYgYW55KChpbnB1dF9pc19oZWFkZXIsIG91dHB1dF9pc19oZWFkZXIpKSBhbmQgaW5wdXRfaXNfaGVhZGVyICE9IG91dHB1dF9pc19oZWFkZXI6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJUSGVhZGVyUHJvdG9jb2wgc2VydmVycyByZXF1aXJlIHRoYXQgYm90aCB0aGUgaW5wdXQgYW5kICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm91dHB1dCBwcm90b2NvbHMgYXJlIFRIZWFkZXJQcm90b2NvbC4iKQorCisgICAgZGVmIHNlcnZlKHNlbGYpOgorICAgICAgICBwYXNzCiAKIAogY2xhc3MgVFNpbXBsZVNlcnZlcihUU2VydmVyKToKLSAgIiIiU2ltcGxlIHNpbmdsZS10aHJlYWRlZCBzZXJ2ZXIgdGhhdCBqdXN0IHB1bXBzIGFyb3VuZCBvbmUgdHJhbnNwb3J0LiIiIgorICAgICIiIlNpbXBsZSBzaW5nbGUtdGhyZWFkZWQgc2VydmVyIHRoYXQganVzdCBwdW1wcyBhcm91bmQgb25lIHRyYW5zcG9ydC4iIiIKIAotICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MpOgotICAgIFRTZXJ2ZXIuX19pbml0X18oc2VsZiwgKmFyZ3MpCisgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzKToKKyAgICAgICAgVFNlcnZlci5fX2luaXRfXyhzZWxmLCAqYXJncykKIAotICBkZWYgc2VydmUoc2VsZik6Ci0gICAgc2VsZi5zZXJ2ZXJUcmFuc3BvcnQubGlzdGVuKCkKLSAgICB3aGlsZSBUcnVlOgotICAgICAgY2xpZW50ID0gc2VsZi5zZXJ2ZXJUcmFuc3BvcnQuYWNjZXB0KCkKLSAgICAgIGlmIG5vdCBjbGllbnQ6Ci0gICAgICAgIGNvbnRpbnVlCi0gICAgICBpdHJhbnMgPSBzZWxmLmlucHV0VHJhbnNwb3J0RmFjdG9yeS5nZXRUcmFuc3BvcnQoY2xpZW50KQotICAgICAgb3RyYW5zID0gc2VsZi5vdXRwdXRUcmFuc3BvcnRGYWN0b3J5LmdldFRyYW5zcG9ydChjbGllbnQpCi0gICAgICBpcHJvdCA9IHNlbGYuaW5wdXRQcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2woaXRyYW5zKQotICAgICAgb3Byb3QgPSBzZWxmLm91dHB1dFByb3RvY29sRmFjdG9yeS5nZXRQcm90b2NvbChvdHJhbnMpCi0gICAgICB0cnk6CisgICAgZGVmIHNlcnZlKHNlbGYpOgorICAgICAgICBzZWxmLnNlcnZlclRyYW5zcG9ydC5saXN0ZW4oKQogICAgICAgICB3aGlsZSBUcnVlOgotICAgICAgICAgIHNlbGYucHJvY2Vzc29yLnByb2Nlc3MoaXByb3QsIG9wcm90KQotICAgICAgZXhjZXB0IFRUcmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbiwgdHg6Ci0gICAgICAgIHBhc3MKLSAgICAgIGV4Y2VwdCBFeGNlcHRpb24sIHg6Ci0gICAgICAgIGxvZ2dlci5leGNlcHRpb24oeCkKKyAgICAgICAgICAgIGNsaWVudCA9IHNlbGYuc2VydmVyVHJhbnNwb3J0LmFjY2VwdCgpCisgICAgICAgICAgICBpZiBub3QgY2xpZW50OgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAKLSAgICAgIGl0cmFucy5jbG9zZSgpCi0gICAgICBvdHJhbnMuY2xvc2UoKQorICAgICAgICAgICAgaXRyYW5zID0gc2VsZi5pbnB1dFRyYW5zcG9ydEZhY3RvcnkuZ2V0VHJhbnNwb3J0KGNsaWVudCkKKyAgICAgICAgICAgIGlwcm90ID0gc2VsZi5pbnB1dFByb3RvY29sRmFjdG9yeS5nZXRQcm90b2NvbChpdHJhbnMpCisKKyAgICAgICAgICAgICMgZm9yIFRIZWFkZXJQcm90b2NvbCwgd2UgbXVzdCB1c2UgdGhlIHNhbWUgcHJvdG9jb2wgaW5zdGFuY2UgZm9yCisgICAgICAgICAgICAjIGlucHV0IGFuZCBvdXRwdXQgc28gdGhhdCB0aGUgcmVzcG9uc2UgaXMgaW4gdGhlIHNhbWUgZGlhbGVjdCB0aGF0CisgICAgICAgICAgICAjIHRoZSBzZXJ2ZXIgZGV0ZWN0ZWQgdGhlIHJlcXVlc3Qgd2FzIGluLgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShzZWxmLmlucHV0UHJvdG9jb2xGYWN0b3J5LCBUSGVhZGVyUHJvdG9jb2xGYWN0b3J5KToKKyAgICAgICAgICAgICAgICBvdHJhbnMgPSBOb25lCisgICAgICAgICAgICAgICAgb3Byb3QgPSBpcHJvdAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBvdHJhbnMgPSBzZWxmLm91dHB1dFRyYW5zcG9ydEZhY3RvcnkuZ2V0VHJhbnNwb3J0KGNsaWVudCkKKyAgICAgICAgICAgICAgICBvcHJvdCA9IHNlbGYub3V0cHV0UHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKG90cmFucykKKworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgICAgIHNlbGYucHJvY2Vzc29yLnByb2Nlc3MoaXByb3QsIG9wcm90KQorICAgICAgICAgICAgZXhjZXB0IFRUcmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIHg6CisgICAgICAgICAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbih4KQorCisgICAgICAgICAgICBpdHJhbnMuY2xvc2UoKQorICAgICAgICAgICAgaWYgb3RyYW5zOgorICAgICAgICAgICAgICAgIG90cmFucy5jbG9zZSgpCiAKIAogY2xhc3MgVFRocmVhZGVkU2VydmVyKFRTZXJ2ZXIpOgotICAiIiJUaHJlYWRlZCBzZXJ2ZXIgdGhhdCBzcGF3bnMgYSBuZXcgdGhyZWFkIHBlciBlYWNoIGNvbm5lY3Rpb24uIiIiCisgICAgIiIiVGhyZWFkZWQgc2VydmVyIHRoYXQgc3Bhd25zIGEgbmV3IHRocmVhZCBwZXIgZWFjaCBjb25uZWN0aW9uLiIiIgogCi0gIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgotICAgIFRTZXJ2ZXIuX19pbml0X18oc2VsZiwgKmFyZ3MpCi0gICAgc2VsZi5kYWVtb24gPSBrd2FyZ3MuZ2V0KCJkYWVtb24iLCBGYWxzZSkKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgVFNlcnZlci5fX2luaXRfXyhzZWxmLCAqYXJncykKKyAgICAgICAgc2VsZi5kYWVtb24gPSBrd2FyZ3MuZ2V0KCJkYWVtb24iLCBGYWxzZSkKIAotICBkZWYgc2VydmUoc2VsZik6Ci0gICAgc2VsZi5zZXJ2ZXJUcmFuc3BvcnQubGlzdGVuKCkKLSAgICB3aGlsZSBUcnVlOgotICAgICAgdHJ5OgotICAgICAgICBjbGllbnQgPSBzZWxmLnNlcnZlclRyYW5zcG9ydC5hY2NlcHQoKQotICAgICAgICBpZiBub3QgY2xpZW50OgotICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgIHQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1zZWxmLmhhbmRsZSwgYXJncz0oY2xpZW50LCkpCi0gICAgICAgIHQuc2V0RGFlbW9uKHNlbGYuZGFlbW9uKQotICAgICAgICB0LnN0YXJ0KCkKLSAgICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKLSAgICAgICAgcmFpc2UKLSAgICAgIGV4Y2VwdCBFeGNlcHRpb24sIHg6Ci0gICAgICAgIGxvZ2dlci5leGNlcHRpb24oeCkKKyAgICBkZWYgc2VydmUoc2VsZik6CisgICAgICAgIHNlbGYuc2VydmVyVHJhbnNwb3J0Lmxpc3RlbigpCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgY2xpZW50ID0gc2VsZi5zZXJ2ZXJUcmFuc3BvcnQuYWNjZXB0KCkKKyAgICAgICAgICAgICAgICBpZiBub3QgY2xpZW50OgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIHQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1zZWxmLmhhbmRsZSwgYXJncz0oY2xpZW50LCkpCisgICAgICAgICAgICAgICAgdC5zZXREYWVtb24oc2VsZi5kYWVtb24pCisgICAgICAgICAgICAgICAgdC5zdGFydCgpCisgICAgICAgICAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6CisgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgeDoKKyAgICAgICAgICAgICAgICBsb2dnZXIuZXhjZXB0aW9uKHgpCiAKLSAgZGVmIGhhbmRsZShzZWxmLCBjbGllbnQpOgotICAgIGl0cmFucyA9IHNlbGYuaW5wdXRUcmFuc3BvcnRGYWN0b3J5LmdldFRyYW5zcG9ydChjbGllbnQpCi0gICAgb3RyYW5zID0gc2VsZi5vdXRwdXRUcmFuc3BvcnRGYWN0b3J5LmdldFRyYW5zcG9ydChjbGllbnQpCi0gICAgaXByb3QgPSBzZWxmLmlucHV0UHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKGl0cmFucykKLSAgICBvcHJvdCA9IHNlbGYub3V0cHV0UHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKG90cmFucykKLSAgICB0cnk6Ci0gICAgICB3aGlsZSBUcnVlOgotICAgICAgICBzZWxmLnByb2Nlc3Nvci5wcm9jZXNzKGlwcm90LCBvcHJvdCkKLSAgICBleGNlcHQgVFRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uLCB0eDoKLSAgICAgIHBhc3MKLSAgICBleGNlcHQgRXhjZXB0aW9uLCB4OgotICAgICAgbG9nZ2VyLmV4Y2VwdGlvbih4KQorICAgIGRlZiBoYW5kbGUoc2VsZiwgY2xpZW50KToKKyAgICAgICAgaXRyYW5zID0gc2VsZi5pbnB1dFRyYW5zcG9ydEZhY3RvcnkuZ2V0VHJhbnNwb3J0KGNsaWVudCkKKyAgICAgICAgaXByb3QgPSBzZWxmLmlucHV0UHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKGl0cmFucykKIAotICAgIGl0cmFucy5jbG9zZSgpCi0gICAgb3RyYW5zLmNsb3NlKCkKKyAgICAgICAgIyBmb3IgVEhlYWRlclByb3RvY29sLCB3ZSBtdXN0IHVzZSB0aGUgc2FtZSBwcm90b2NvbCBpbnN0YW5jZSBmb3IgaW5wdXQKKyAgICAgICAgIyBhbmQgb3V0cHV0IHNvIHRoYXQgdGhlIHJlc3BvbnNlIGlzIGluIHRoZSBzYW1lIGRpYWxlY3QgdGhhdCB0aGUKKyAgICAgICAgIyBzZXJ2ZXIgZGV0ZWN0ZWQgdGhlIHJlcXVlc3Qgd2FzIGluLgorICAgICAgICBpZiBpc2luc3RhbmNlKHNlbGYuaW5wdXRQcm90b2NvbEZhY3RvcnksIFRIZWFkZXJQcm90b2NvbEZhY3RvcnkpOgorICAgICAgICAgICAgb3RyYW5zID0gTm9uZQorICAgICAgICAgICAgb3Byb3QgPSBpcHJvdAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgb3RyYW5zID0gc2VsZi5vdXRwdXRUcmFuc3BvcnRGYWN0b3J5LmdldFRyYW5zcG9ydChjbGllbnQpCisgICAgICAgICAgICBvcHJvdCA9IHNlbGYub3V0cHV0UHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKG90cmFucykKKworICAgICAgICB0cnk6CisgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgIHNlbGYucHJvY2Vzc29yLnByb2Nlc3MoaXByb3QsIG9wcm90KQorICAgICAgICBleGNlcHQgVFRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uOgorICAgICAgICAgICAgcGFzcworICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIHg6CisgICAgICAgICAgICBsb2dnZXIuZXhjZXB0aW9uKHgpCisKKyAgICAgICAgaXRyYW5zLmNsb3NlKCkKKyAgICAgICAgaWYgb3RyYW5zOgorICAgICAgICAgICAgb3RyYW5zLmNsb3NlKCkKIAogCiBjbGFzcyBUVGhyZWFkUG9vbFNlcnZlcihUU2VydmVyKToKLSAgIiIiU2VydmVyIHdpdGggYSBmaXhlZCBzaXplIHBvb2wgb2YgdGhyZWFkcyB3aGljaCBzZXJ2aWNlIHJlcXVlc3RzLiIiIgorICAgICIiIlNlcnZlciB3aXRoIGEgZml4ZWQgc2l6ZSBwb29sIG9mIHRocmVhZHMgd2hpY2ggc2VydmljZSByZXF1ZXN0cy4iIiIKIAotICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKLSAgICBUU2VydmVyLl9faW5pdF9fKHNlbGYsICphcmdzKQotICAgIHNlbGYuY2xpZW50cyA9IFF1ZXVlLlF1ZXVlKCkKLSAgICBzZWxmLnRocmVhZHMgPSAxMAotICAgIHNlbGYuZGFlbW9uID0ga3dhcmdzLmdldCgiZGFlbW9uIiwgRmFsc2UpCisgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIFRTZXJ2ZXIuX19pbml0X18oc2VsZiwgKmFyZ3MpCisgICAgICAgIHNlbGYuY2xpZW50cyA9IHF1ZXVlLlF1ZXVlKCkKKyAgICAgICAgc2VsZi50aHJlYWRzID0gMTAKKyAgICAgICAgc2VsZi5kYWVtb24gPSBrd2FyZ3MuZ2V0KCJkYWVtb24iLCBGYWxzZSkKIAotICBkZWYgc2V0TnVtVGhyZWFkcyhzZWxmLCBudW0pOgotICAgICIiIlNldCB0aGUgbnVtYmVyIG9mIHdvcmtlciB0aHJlYWRzIHRoYXQgc2hvdWxkIGJlIGNyZWF0ZWQiIiIKLSAgICBzZWxmLnRocmVhZHMgPSBudW0KKyAgICBkZWYgc2V0TnVtVGhyZWFkcyhzZWxmLCBudW0pOgorICAgICAgICAiIiJTZXQgdGhlIG51bWJlciBvZiB3b3JrZXIgdGhyZWFkcyB0aGF0IHNob3VsZCBiZSBjcmVhdGVkIiIiCisgICAgICAgIHNlbGYudGhyZWFkcyA9IG51bQogCi0gIGRlZiBzZXJ2ZVRocmVhZChzZWxmKToKLSAgICAiIiJMb29wIGFyb3VuZCBnZXR0aW5nIGNsaWVudHMgZnJvbSB0aGUgc2hhcmVkIHF1ZXVlIGFuZCBwcm9jZXNzIHRoZW0uIiIiCi0gICAgd2hpbGUgVHJ1ZToKLSAgICAgIHRyeToKLSAgICAgICAgY2xpZW50ID0gc2VsZi5jbGllbnRzLmdldCgpCi0gICAgICAgIHNlbGYuc2VydmVDbGllbnQoY2xpZW50KQotICAgICAgZXhjZXB0IEV4Y2VwdGlvbiwgeDoKLSAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbih4KQorICAgIGRlZiBzZXJ2ZVRocmVhZChzZWxmKToKKyAgICAgICAgIiIiTG9vcCBhcm91bmQgZ2V0dGluZyBjbGllbnRzIGZyb20gdGhlIHNoYXJlZCBxdWV1ZSBhbmQgcHJvY2VzcyB0aGVtLiIiIgorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGNsaWVudCA9IHNlbGYuY2xpZW50cy5nZXQoKQorICAgICAgICAgICAgICAgIHNlbGYuc2VydmVDbGllbnQoY2xpZW50KQorICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyB4OgorICAgICAgICAgICAgICAgIGxvZ2dlci5leGNlcHRpb24oeCkKIAotICBkZWYgc2VydmVDbGllbnQoc2VsZiwgY2xpZW50KToKLSAgICAiIiJQcm9jZXNzIGlucHV0L291dHB1dCBmcm9tIGEgY2xpZW50IGZvciBhcyBsb25nIGFzIHBvc3NpYmxlIiIiCi0gICAgaXRyYW5zID0gc2VsZi5pbnB1dFRyYW5zcG9ydEZhY3RvcnkuZ2V0VHJhbnNwb3J0KGNsaWVudCkKLSAgICBvdHJhbnMgPSBzZWxmLm91dHB1dFRyYW5zcG9ydEZhY3RvcnkuZ2V0VHJhbnNwb3J0KGNsaWVudCkKLSAgICBpcHJvdCA9IHNlbGYuaW5wdXRQcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2woaXRyYW5zKQotICAgIG9wcm90ID0gc2VsZi5vdXRwdXRQcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2wob3RyYW5zKQotICAgIHRyeToKLSAgICAgIHdoaWxlIFRydWU6Ci0gICAgICAgIHNlbGYucHJvY2Vzc29yLnByb2Nlc3MoaXByb3QsIG9wcm90KQotICAgIGV4Y2VwdCBUVHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb24sIHR4OgotICAgICAgcGFzcwotICAgIGV4Y2VwdCBFeGNlcHRpb24sIHg6Ci0gICAgICBsb2dnZXIuZXhjZXB0aW9uKHgpCisgICAgZGVmIHNlcnZlQ2xpZW50KHNlbGYsIGNsaWVudCk6CisgICAgICAgICIiIlByb2Nlc3MgaW5wdXQvb3V0cHV0IGZyb20gYSBjbGllbnQgZm9yIGFzIGxvbmcgYXMgcG9zc2libGUiIiIKKyAgICAgICAgaXRyYW5zID0gc2VsZi5pbnB1dFRyYW5zcG9ydEZhY3RvcnkuZ2V0VHJhbnNwb3J0KGNsaWVudCkKKyAgICAgICAgaXByb3QgPSBzZWxmLmlucHV0UHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKGl0cmFucykKIAotICAgIGl0cmFucy5jbG9zZSgpCi0gICAgb3RyYW5zLmNsb3NlKCkKKyAgICAgICAgIyBmb3IgVEhlYWRlclByb3RvY29sLCB3ZSBtdXN0IHVzZSB0aGUgc2FtZSBwcm90b2NvbCBpbnN0YW5jZSBmb3IgaW5wdXQKKyAgICAgICAgIyBhbmQgb3V0cHV0IHNvIHRoYXQgdGhlIHJlc3BvbnNlIGlzIGluIHRoZSBzYW1lIGRpYWxlY3QgdGhhdCB0aGUKKyAgICAgICAgIyBzZXJ2ZXIgZGV0ZWN0ZWQgdGhlIHJlcXVlc3Qgd2FzIGluLgorICAgICAgICBpZiBpc2luc3RhbmNlKHNlbGYuaW5wdXRQcm90b2NvbEZhY3RvcnksIFRIZWFkZXJQcm90b2NvbEZhY3RvcnkpOgorICAgICAgICAgICAgb3RyYW5zID0gTm9uZQorICAgICAgICAgICAgb3Byb3QgPSBpcHJvdAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgb3RyYW5zID0gc2VsZi5vdXRwdXRUcmFuc3BvcnRGYWN0b3J5LmdldFRyYW5zcG9ydChjbGllbnQpCisgICAgICAgICAgICBvcHJvdCA9IHNlbGYub3V0cHV0UHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKG90cmFucykKIAotICBkZWYgc2VydmUoc2VsZik6Ci0gICAgIiIiU3RhcnQgYSBmaXhlZCBudW1iZXIgb2Ygd29ya2VyIHRocmVhZHMgYW5kIHB1dCBjbGllbnQgaW50byBhIHF1ZXVlIiIiCi0gICAgZm9yIGkgaW4gcmFuZ2Uoc2VsZi50aHJlYWRzKToKLSAgICAgIHRyeToKLSAgICAgICAgdCA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PXNlbGYuc2VydmVUaHJlYWQpCi0gICAgICAgIHQuc2V0RGFlbW9uKHNlbGYuZGFlbW9uKQotICAgICAgICB0LnN0YXJ0KCkKLSAgICAgIGV4Y2VwdCBFeGNlcHRpb24sIHg6Ci0gICAgICAgIGxvZ2dlci5leGNlcHRpb24oeCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICAgICBzZWxmLnByb2Nlc3Nvci5wcm9jZXNzKGlwcm90LCBvcHJvdCkKKyAgICAgICAgZXhjZXB0IFRUcmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyB4OgorICAgICAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbih4KQogCi0gICAgIyBQdW1wIHRoZSBzb2NrZXQgZm9yIGNsaWVudHMKLSAgICBzZWxmLnNlcnZlclRyYW5zcG9ydC5saXN0ZW4oKQotICAgIHdoaWxlIFRydWU6Ci0gICAgICB0cnk6Ci0gICAgICAgIGNsaWVudCA9IHNlbGYuc2VydmVyVHJhbnNwb3J0LmFjY2VwdCgpCi0gICAgICAgIGlmIG5vdCBjbGllbnQ6Ci0gICAgICAgICAgY29udGludWUKLSAgICAgICAgc2VsZi5jbGllbnRzLnB1dChjbGllbnQpCi0gICAgICBleGNlcHQgRXhjZXB0aW9uLCB4OgotICAgICAgICBsb2dnZXIuZXhjZXB0aW9uKHgpCisgICAgICAgIGl0cmFucy5jbG9zZSgpCisgICAgICAgIGlmIG90cmFuczoKKyAgICAgICAgICAgIG90cmFucy5jbG9zZSgpCisKKyAgICBkZWYgc2VydmUoc2VsZik6CisgICAgICAgICIiIlN0YXJ0IGEgZml4ZWQgbnVtYmVyIG9mIHdvcmtlciB0aHJlYWRzIGFuZCBwdXQgY2xpZW50IGludG8gYSBxdWV1ZSIiIgorICAgICAgICBmb3IgaSBpbiByYW5nZShzZWxmLnRocmVhZHMpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1zZWxmLnNlcnZlVGhyZWFkKQorICAgICAgICAgICAgICAgIHQuc2V0RGFlbW9uKHNlbGYuZGFlbW9uKQorICAgICAgICAgICAgICAgIHQuc3RhcnQoKQorICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyB4OgorICAgICAgICAgICAgICAgIGxvZ2dlci5leGNlcHRpb24oeCkKKworICAgICAgICAjIFB1bXAgdGhlIHNvY2tldCBmb3IgY2xpZW50cworICAgICAgICBzZWxmLnNlcnZlclRyYW5zcG9ydC5saXN0ZW4oKQorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGNsaWVudCA9IHNlbGYuc2VydmVyVHJhbnNwb3J0LmFjY2VwdCgpCisgICAgICAgICAgICAgICAgaWYgbm90IGNsaWVudDoKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBzZWxmLmNsaWVudHMucHV0KGNsaWVudCkKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgeDoKKyAgICAgICAgICAgICAgICBsb2dnZXIuZXhjZXB0aW9uKHgpCiAKIAogY2xhc3MgVEZvcmtpbmdTZXJ2ZXIoVFNlcnZlcik6Ci0gICIiIkEgVGhyaWZ0IHNlcnZlciB0aGF0IGZvcmtzIGEgbmV3IHByb2Nlc3MgZm9yIGVhY2ggcmVxdWVzdAorICAgICIiIkEgVGhyaWZ0IHNlcnZlciB0aGF0IGZvcmtzIGEgbmV3IHByb2Nlc3MgZm9yIGVhY2ggcmVxdWVzdAogCi0gIFRoaXMgaXMgbW9yZSBzY2FsYWJsZSB0aGFuIHRoZSB0aHJlYWRlZCBzZXJ2ZXIgYXMgaXQgZG9lcyBub3QgY2F1c2UKLSAgR0lMIGNvbnRlbnRpb24uCisgICAgVGhpcyBpcyBtb3JlIHNjYWxhYmxlIHRoYW4gdGhlIHRocmVhZGVkIHNlcnZlciBhcyBpdCBkb2VzIG5vdCBjYXVzZQorICAgIEdJTCBjb250ZW50aW9uLgogCi0gIE5vdGUgdGhhdCB0aGlzIGhhcyBkaWZmZXJlbnQgc2VtYW50aWNzIGZyb20gdGhlIHRocmVhZGluZyBzZXJ2ZXIuCi0gIFNwZWNpZmljYWxseSwgdXBkYXRlcyB0byBzaGFyZWQgdmFyaWFibGVzIHdpbGwgbm8gbG9uZ2VyIGJlIHNoYXJlZC4KLSAgSXQgd2lsbCBhbHNvIG5vdCB3b3JrIG9uIHdpbmRvd3MuCisgICAgTm90ZSB0aGF0IHRoaXMgaGFzIGRpZmZlcmVudCBzZW1hbnRpY3MgZnJvbSB0aGUgdGhyZWFkaW5nIHNlcnZlci4KKyAgICBTcGVjaWZpY2FsbHksIHVwZGF0ZXMgdG8gc2hhcmVkIHZhcmlhYmxlcyB3aWxsIG5vIGxvbmdlciBiZSBzaGFyZWQuCisgICAgSXQgd2lsbCBhbHNvIG5vdCB3b3JrIG9uIHdpbmRvd3MuCiAKLSAgVGhpcyBjb2RlIGlzIGhlYXZpbHkgaW5zcGlyZWQgYnkgU29ja2V0U2VydmVyLkZvcmtpbmdNaXhJbiBpbiB0aGUKLSAgUHl0aG9uIHN0ZGxpYi4KLSAgIiIiCi0gIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncyk6Ci0gICAgVFNlcnZlci5fX2luaXRfXyhzZWxmLCAqYXJncykKLSAgICBzZWxmLmNoaWxkcmVuID0gW10KKyAgICBUaGlzIGNvZGUgaXMgaGVhdmlseSBpbnNwaXJlZCBieSBTb2NrZXRTZXJ2ZXIuRm9ya2luZ01peEluIGluIHRoZQorICAgIFB5dGhvbiBzdGRsaWIuCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzKToKKyAgICAgICAgVFNlcnZlci5fX2luaXRfXyhzZWxmLCAqYXJncykKKyAgICAgICAgc2VsZi5jaGlsZHJlbiA9IFtdCiAKLSAgZGVmIHNlcnZlKHNlbGYpOgotICAgIGRlZiB0cnlfY2xvc2UoZmlsZSk6Ci0gICAgICB0cnk6Ci0gICAgICAgIGZpbGUuY2xvc2UoKQotICAgICAgZXhjZXB0IElPRXJyb3IsIGU6Ci0gICAgICAgIGxvZ2dlci53YXJuaW5nKGUsIGV4Y19pbmZvPVRydWUpCi0KLSAgICBzZWxmLnNlcnZlclRyYW5zcG9ydC5saXN0ZW4oKQotICAgIHdoaWxlIFRydWU6Ci0gICAgICBjbGllbnQgPSBzZWxmLnNlcnZlclRyYW5zcG9ydC5hY2NlcHQoKQotICAgICAgaWYgbm90IGNsaWVudDoKLSAgICAgICAgY29udGludWUKLSAgICAgIHRyeToKLSAgICAgICAgcGlkID0gb3MuZm9yaygpCi0KLSAgICAgICAgaWYgcGlkOiAgIyBwYXJlbnQKLSAgICAgICAgICAjIGFkZCBiZWZvcmUgY29sbGVjdCwgb3RoZXJ3aXNlIHlvdSByYWNlIHcvIHdhaXRwaWQKLSAgICAgICAgICBzZWxmLmNoaWxkcmVuLmFwcGVuZChwaWQpCi0gICAgICAgICAgc2VsZi5jb2xsZWN0X2NoaWxkcmVuKCkKLQotICAgICAgICAgICMgUGFyZW50IG11c3QgY2xvc2Ugc29ja2V0IG9yIHRoZSBjb25uZWN0aW9uIG1heSBub3QgZ2V0Ci0gICAgICAgICAgIyBjbG9zZWQgcHJvbXB0bHkKLSAgICAgICAgICBpdHJhbnMgPSBzZWxmLmlucHV0VHJhbnNwb3J0RmFjdG9yeS5nZXRUcmFuc3BvcnQoY2xpZW50KQotICAgICAgICAgIG90cmFucyA9IHNlbGYub3V0cHV0VHJhbnNwb3J0RmFjdG9yeS5nZXRUcmFuc3BvcnQoY2xpZW50KQotICAgICAgICAgIHRyeV9jbG9zZShpdHJhbnMpCi0gICAgICAgICAgdHJ5X2Nsb3NlKG90cmFucykKLSAgICAgICAgZWxzZToKLSAgICAgICAgICBpdHJhbnMgPSBzZWxmLmlucHV0VHJhbnNwb3J0RmFjdG9yeS5nZXRUcmFuc3BvcnQoY2xpZW50KQotICAgICAgICAgIG90cmFucyA9IHNlbGYub3V0cHV0VHJhbnNwb3J0RmFjdG9yeS5nZXRUcmFuc3BvcnQoY2xpZW50KQotCi0gICAgICAgICAgaXByb3QgPSBzZWxmLmlucHV0UHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKGl0cmFucykKLSAgICAgICAgICBvcHJvdCA9IHNlbGYub3V0cHV0UHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKG90cmFucykKLQotICAgICAgICAgIGVjb2RlID0gMAotICAgICAgICAgIHRyeToKKyAgICBkZWYgc2VydmUoc2VsZik6CisgICAgICAgIGRlZiB0cnlfY2xvc2UoZmlsZSk6CiAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgIHdoaWxlIFRydWU6Ci0gICAgICAgICAgICAgICAgc2VsZi5wcm9jZXNzb3IucHJvY2VzcyhpcHJvdCwgb3Byb3QpCi0gICAgICAgICAgICBleGNlcHQgVFRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uLCB0eDoKLSAgICAgICAgICAgICAgcGFzcwotICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiwgZToKLSAgICAgICAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbihlKQotICAgICAgICAgICAgICBlY29kZSA9IDEKLSAgICAgICAgICBmaW5hbGx5OgotICAgICAgICAgICAgdHJ5X2Nsb3NlKGl0cmFucykKLSAgICAgICAgICAgIHRyeV9jbG9zZShvdHJhbnMpCisgICAgICAgICAgICAgICAgZmlsZS5jbG9zZSgpCisgICAgICAgICAgICBleGNlcHQgSU9FcnJvciBhcyBlOgorICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKGUsIGV4Y19pbmZvPVRydWUpCiAKLSAgICAgICAgICBvcy5fZXhpdChlY29kZSkKKyAgICAgICAgc2VsZi5zZXJ2ZXJUcmFuc3BvcnQubGlzdGVuKCkKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIGNsaWVudCA9IHNlbGYuc2VydmVyVHJhbnNwb3J0LmFjY2VwdCgpCisgICAgICAgICAgICBpZiBub3QgY2xpZW50OgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGlkID0gb3MuZm9yaygpCiAKLSAgICAgIGV4Y2VwdCBUVHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb24sIHR4OgotICAgICAgICBwYXNzCi0gICAgICBleGNlcHQgRXhjZXB0aW9uLCB4OgotICAgICAgICBsb2dnZXIuZXhjZXB0aW9uKHgpCisgICAgICAgICAgICAgICAgaWYgcGlkOiAgIyBwYXJlbnQKKyAgICAgICAgICAgICAgICAgICAgIyBhZGQgYmVmb3JlIGNvbGxlY3QsIG90aGVyd2lzZSB5b3UgcmFjZSB3LyB3YWl0cGlkCisgICAgICAgICAgICAgICAgICAgIHNlbGYuY2hpbGRyZW4uYXBwZW5kKHBpZCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5jb2xsZWN0X2NoaWxkcmVuKCkKIAotICBkZWYgY29sbGVjdF9jaGlsZHJlbihzZWxmKToKLSAgICB3aGlsZSBzZWxmLmNoaWxkcmVuOgotICAgICAgdHJ5OgotICAgICAgICBwaWQsIHN0YXR1cyA9IG9zLndhaXRwaWQoMCwgb3MuV05PSEFORykKLSAgICAgIGV4Y2VwdCBvcy5lcnJvcjoKLSAgICAgICAgcGlkID0gTm9uZQorICAgICAgICAgICAgICAgICAgICAjIFBhcmVudCBtdXN0IGNsb3NlIHNvY2tldCBvciB0aGUgY29ubmVjdGlvbiBtYXkgbm90IGdldAorICAgICAgICAgICAgICAgICAgICAjIGNsb3NlZCBwcm9tcHRseQorICAgICAgICAgICAgICAgICAgICBpdHJhbnMgPSBzZWxmLmlucHV0VHJhbnNwb3J0RmFjdG9yeS5nZXRUcmFuc3BvcnQoY2xpZW50KQorICAgICAgICAgICAgICAgICAgICBvdHJhbnMgPSBzZWxmLm91dHB1dFRyYW5zcG9ydEZhY3RvcnkuZ2V0VHJhbnNwb3J0KGNsaWVudCkKKyAgICAgICAgICAgICAgICAgICAgdHJ5X2Nsb3NlKGl0cmFucykKKyAgICAgICAgICAgICAgICAgICAgdHJ5X2Nsb3NlKG90cmFucykKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBpdHJhbnMgPSBzZWxmLmlucHV0VHJhbnNwb3J0RmFjdG9yeS5nZXRUcmFuc3BvcnQoY2xpZW50KQorICAgICAgICAgICAgICAgICAgICBpcHJvdCA9IHNlbGYuaW5wdXRQcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2woaXRyYW5zKQogCi0gICAgICBpZiBwaWQ6Ci0gICAgICAgIHNlbGYuY2hpbGRyZW4ucmVtb3ZlKHBpZCkKLSAgICAgIGVsc2U6Ci0gICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgICMgZm9yIFRIZWFkZXJQcm90b2NvbCwgd2UgbXVzdCB1c2UgdGhlIHNhbWUgcHJvdG9jb2wKKyAgICAgICAgICAgICAgICAgICAgIyBpbnN0YW5jZSBmb3IgaW5wdXQgYW5kIG91dHB1dCBzbyB0aGF0IHRoZSByZXNwb25zZSBpcyBpbgorICAgICAgICAgICAgICAgICAgICAjIHRoZSBzYW1lIGRpYWxlY3QgdGhhdCB0aGUgc2VydmVyIGRldGVjdGVkIHRoZSByZXF1ZXN0IHdhcworICAgICAgICAgICAgICAgICAgICAjIGluLgorICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHNlbGYuaW5wdXRQcm90b2NvbEZhY3RvcnksIFRIZWFkZXJQcm90b2NvbEZhY3RvcnkpOgorICAgICAgICAgICAgICAgICAgICAgICAgb3RyYW5zID0gTm9uZQorICAgICAgICAgICAgICAgICAgICAgICAgb3Byb3QgPSBpcHJvdAorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgb3RyYW5zID0gc2VsZi5vdXRwdXRUcmFuc3BvcnRGYWN0b3J5LmdldFRyYW5zcG9ydChjbGllbnQpCisgICAgICAgICAgICAgICAgICAgICAgICBvcHJvdCA9IHNlbGYub3V0cHV0UHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKG90cmFucykKKworICAgICAgICAgICAgICAgICAgICBlY29kZSA9IDAKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucHJvY2Vzc29yLnByb2Nlc3MoaXByb3QsIG9wcm90KQorICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFRUcmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbihlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjb2RlID0gMQorICAgICAgICAgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgICAgICAgICAgdHJ5X2Nsb3NlKGl0cmFucykKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG90cmFuczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnlfY2xvc2Uob3RyYW5zKQorCisgICAgICAgICAgICAgICAgICAgIG9zLl9leGl0KGVjb2RlKQorCisgICAgICAgICAgICBleGNlcHQgVFRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgeDoKKyAgICAgICAgICAgICAgICBsb2dnZXIuZXhjZXB0aW9uKHgpCisKKyAgICBkZWYgY29sbGVjdF9jaGlsZHJlbihzZWxmKToKKyAgICAgICAgd2hpbGUgc2VsZi5jaGlsZHJlbjoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwaWQsIHN0YXR1cyA9IG9zLndhaXRwaWQoMCwgb3MuV05PSEFORykKKyAgICAgICAgICAgIGV4Y2VwdCBvcy5lcnJvcjoKKyAgICAgICAgICAgICAgICBwaWQgPSBOb25lCisKKyAgICAgICAgICAgIGlmIHBpZDoKKyAgICAgICAgICAgICAgICBzZWxmLmNoaWxkcmVuLnJlbW92ZShwaWQpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGJyZWFrCmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL3RyYW5zcG9ydC9USGVhZGVyVHJhbnNwb3J0LnB5IGIvbGliL3B5L3NyYy90cmFuc3BvcnQvVEhlYWRlclRyYW5zcG9ydC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGQ1NjQwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5L3NyYy90cmFuc3BvcnQvVEhlYWRlclRyYW5zcG9ydC5weQpAQCAtMCwwICsxLDM1MiBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2ltcG9ydCBzdHJ1Y3QKK2ltcG9ydCB6bGliCisKK2Zyb20gdGhyaWZ0LmNvbXBhdCBpbXBvcnQgQnVmZmVySU8sIGJ5dGVfaW5kZXgKK2Zyb20gdGhyaWZ0LnByb3RvY29sLlRCaW5hcnlQcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sCitmcm9tIHRocmlmdC5wcm90b2NvbC5UQ29tcGFjdFByb3RvY29sIGltcG9ydCBUQ29tcGFjdFByb3RvY29sLCByZWFkVmFyaW50LCB3cml0ZVZhcmludAorZnJvbSB0aHJpZnQuVGhyaWZ0IGltcG9ydCBUQXBwbGljYXRpb25FeGNlcHRpb24KK2Zyb20gdGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0IGltcG9ydCAoCisgICAgQ1JlYWRhYmxlVHJhbnNwb3J0LAorICAgIFRNZW1vcnlCdWZmZXIsCisgICAgVFRyYW5zcG9ydEJhc2UsCisgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbiwKKykKKworCitVMTYgPSBzdHJ1Y3QuU3RydWN0KCIhSCIpCitJMzIgPSBzdHJ1Y3QuU3RydWN0KCIhaSIpCitIRUFERVJfTUFHSUMgPSAweDBGRkYKK0hBUkRfTUFYX0ZSQU1FX1NJWkUgPSAweDNGRkZGRkZGCisKKworY2xhc3MgVEhlYWRlckNsaWVudFR5cGUob2JqZWN0KToKKyAgICBIRUFERVJTID0gMHgwMAorCisgICAgRlJBTUVEX0JJTkFSWSA9IDB4MDEKKyAgICBVTkZSQU1FRF9CSU5BUlkgPSAweDAyCisKKyAgICBGUkFNRURfQ09NUEFDVCA9IDB4MDMKKyAgICBVTkZSQU1FRF9DT01QQUNUID0gMHgwNAorCisKK2NsYXNzIFRIZWFkZXJTdWJwcm90b2NvbElEKG9iamVjdCk6CisgICAgQklOQVJZID0gMHgwMAorICAgIENPTVBBQ1QgPSAweDAyCisKKworY2xhc3MgVEluZm9IZWFkZXJUeXBlKG9iamVjdCk6CisgICAgS0VZX1ZBTFVFID0gMHgwMQorCisKK2NsYXNzIFRIZWFkZXJUcmFuc2Zvcm1JRChvYmplY3QpOgorICAgIFpMSUIgPSAweDAxCisKKworUkVBRF9UUkFOU0ZPUk1TX0JZX0lEID0geworICAgIFRIZWFkZXJUcmFuc2Zvcm1JRC5aTElCOiB6bGliLmRlY29tcHJlc3MsCit9CisKKworV1JJVEVfVFJBTlNGT1JNU19CWV9JRCA9IHsKKyAgICBUSGVhZGVyVHJhbnNmb3JtSUQuWkxJQjogemxpYi5jb21wcmVzcywKK30KKworCitkZWYgX3JlYWRTdHJpbmcodHJhbnMpOgorICAgIHNpemUgPSByZWFkVmFyaW50KHRyYW5zKQorICAgIGlmIHNpemUgPCAwOgorICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5ORUdBVElWRV9TSVpFLAorICAgICAgICAgICAgIk5lZ2F0aXZlIGxlbmd0aCIKKyAgICAgICAgKQorICAgIHJldHVybiB0cmFucy5yZWFkKHNpemUpCisKKworZGVmIF93cml0ZVN0cmluZyh0cmFucywgdmFsdWUpOgorICAgIHdyaXRlVmFyaW50KHRyYW5zLCBsZW4odmFsdWUpKQorICAgIHRyYW5zLndyaXRlKHZhbHVlKQorCisKK2NsYXNzIFRIZWFkZXJUcmFuc3BvcnQoVFRyYW5zcG9ydEJhc2UsIENSZWFkYWJsZVRyYW5zcG9ydCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRyYW5zcG9ydCwgYWxsb3dlZF9jbGllbnRfdHlwZXMpOgorICAgICAgICBzZWxmLl90cmFuc3BvcnQgPSB0cmFuc3BvcnQKKyAgICAgICAgc2VsZi5fY2xpZW50X3R5cGUgPSBUSGVhZGVyQ2xpZW50VHlwZS5IRUFERVJTCisgICAgICAgIHNlbGYuX2FsbG93ZWRfY2xpZW50X3R5cGVzID0gYWxsb3dlZF9jbGllbnRfdHlwZXMKKworICAgICAgICBzZWxmLl9yZWFkX2J1ZmZlciA9IEJ1ZmZlcklPKGIiIikKKyAgICAgICAgc2VsZi5fcmVhZF9oZWFkZXJzID0ge30KKworICAgICAgICBzZWxmLl93cml0ZV9idWZmZXIgPSBCdWZmZXJJTygpCisgICAgICAgIHNlbGYuX3dyaXRlX2hlYWRlcnMgPSB7fQorICAgICAgICBzZWxmLl93cml0ZV90cmFuc2Zvcm1zID0gW10KKworICAgICAgICBzZWxmLmZsYWdzID0gMAorICAgICAgICBzZWxmLnNlcXVlbmNlX2lkID0gMAorICAgICAgICBzZWxmLl9wcm90b2NvbF9pZCA9IFRIZWFkZXJTdWJwcm90b2NvbElELkJJTkFSWQorICAgICAgICBzZWxmLl9tYXhfZnJhbWVfc2l6ZSA9IEhBUkRfTUFYX0ZSQU1FX1NJWkUKKworICAgIGRlZiBpc09wZW4oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl90cmFuc3BvcnQuaXNPcGVuKCkKKworICAgIGRlZiBvcGVuKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fdHJhbnNwb3J0Lm9wZW4oKQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fdHJhbnNwb3J0LmNsb3NlKCkKKworICAgIGRlZiBnZXRfaGVhZGVycyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3JlYWRfaGVhZGVycworCisgICAgZGVmIHNldF9oZWFkZXIoc2VsZiwga2V5LCB2YWx1ZSk6CisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGtleSwgYnl0ZXMpOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiaGVhZGVyIG5hbWVzIG11c3QgYmUgYnl0ZXMiKQorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh2YWx1ZSwgYnl0ZXMpOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiaGVhZGVyIHZhbHVlcyBtdXN0IGJlIGJ5dGVzIikKKyAgICAgICAgc2VsZi5fd3JpdGVfaGVhZGVyc1trZXldID0gdmFsdWUKKworICAgIGRlZiBjbGVhcl9oZWFkZXJzKHNlbGYpOgorICAgICAgICBzZWxmLl93cml0ZV9oZWFkZXJzLmNsZWFyKCkKKworICAgIGRlZiBhZGRfdHJhbnNmb3JtKHNlbGYsIHRyYW5zZm9ybV9pZCk6CisgICAgICAgIGlmIHRyYW5zZm9ybV9pZCBub3QgaW4gV1JJVEVfVFJBTlNGT1JNU19CWV9JRDoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInVua25vd24gdHJhbnNmb3JtIikKKyAgICAgICAgc2VsZi5fd3JpdGVfdHJhbnNmb3Jtcy5hcHBlbmQodHJhbnNmb3JtX2lkKQorCisgICAgZGVmIHNldF9tYXhfZnJhbWVfc2l6ZShzZWxmLCBzaXplKToKKyAgICAgICAgaWYgbm90IDAgPCBzaXplIDwgSEFSRF9NQVhfRlJBTUVfU0laRToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm1heGltdW0gZnJhbWUgc2l6ZSBzaG91bGQgYmUgPCAlZCBhbmQgPiAwIiAlIEhBUkRfTUFYX0ZSQU1FX1NJWkUpCisgICAgICAgIHNlbGYuX21heF9mcmFtZV9zaXplID0gc2l6ZQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIHByb3RvY29sX2lkKHNlbGYpOgorICAgICAgICBpZiBzZWxmLl9jbGllbnRfdHlwZSA9PSBUSGVhZGVyQ2xpZW50VHlwZS5IRUFERVJTOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sX2lkCisgICAgICAgIGVsaWYgc2VsZi5fY2xpZW50X3R5cGUgaW4gKFRIZWFkZXJDbGllbnRUeXBlLkZSQU1FRF9CSU5BUlksIFRIZWFkZXJDbGllbnRUeXBlLlVORlJBTUVEX0JJTkFSWSk6CisgICAgICAgICAgICByZXR1cm4gVEhlYWRlclN1YnByb3RvY29sSUQuQklOQVJZCisgICAgICAgIGVsaWYgc2VsZi5fY2xpZW50X3R5cGUgaW4gKFRIZWFkZXJDbGllbnRUeXBlLkZSQU1FRF9DT01QQUNULCBUSGVhZGVyQ2xpZW50VHlwZS5VTkZSQU1FRF9DT01QQUNUKToKKyAgICAgICAgICAgIHJldHVybiBUSGVhZGVyU3VicHJvdG9jb2xJRC5DT01QQUNUCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uSU5WQUxJRF9DTElFTlRfVFlQRSwKKyAgICAgICAgICAgICAgICAiUHJvdG9jb2wgSUQgbm90IGtub3cgZm9yIGNsaWVudCB0eXBlICVkIiAlIHNlbGYuX2NsaWVudF90eXBlLAorICAgICAgICAgICAgKQorCisgICAgZGVmIHJlYWQoc2VsZiwgc3opOgorICAgICAgICAjIGlmIHRoZXJlIGFyZSBieXRlcyBsZWZ0IGluIHRoZSBidWZmZXIsIHByb2R1Y2UgdGhvc2UgZmlyc3QuCisgICAgICAgIGJ5dGVzX3JlYWQgPSBzZWxmLl9yZWFkX2J1ZmZlci5yZWFkKHN6KQorICAgICAgICBieXRlc19sZWZ0X3RvX3JlYWQgPSBzeiAtIGxlbihieXRlc19yZWFkKQorICAgICAgICBpZiBieXRlc19sZWZ0X3RvX3JlYWQgPT0gMDoKKyAgICAgICAgICAgIHJldHVybiBieXRlc19yZWFkCisKKyAgICAgICAgIyBpZiB3ZSd2ZSBkZXRlcm1pbmVkIHRoaXMgaXMgYW4gdW5mcmFtZWQgY2xpZW50LCBqdXN0IHBhc3MgdGhlIHJlYWQKKyAgICAgICAgIyB0aHJvdWdoIHRvIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCB1bnRpbCB3ZSdyZSByZXNldCBhZ2FpbiBhdCB0aGUKKyAgICAgICAgIyBiZWdpbm5pbmcgb2YgdGhlIG5leHQgbWVzc2FnZS4KKyAgICAgICAgaWYgc2VsZi5fY2xpZW50X3R5cGUgaW4gKFRIZWFkZXJDbGllbnRUeXBlLlVORlJBTUVEX0JJTkFSWSwgVEhlYWRlckNsaWVudFR5cGUuVU5GUkFNRURfQ09NUEFDVCk6CisgICAgICAgICAgICByZXR1cm4gYnl0ZXNfcmVhZCArIHNlbGYuX3RyYW5zcG9ydC5yZWFkKGJ5dGVzX2xlZnRfdG9fcmVhZCkKKworICAgICAgICAjIHdlJ3JlIGVtcHR5IGFuZCAobWF5YmUpIGZyYW1lZC4gZmlsbCB0aGUgYnVmZmVycyB3aXRoIHRoZSBuZXh0IGZyYW1lLgorICAgICAgICBzZWxmLnJlYWRGcmFtZShieXRlc19sZWZ0X3RvX3JlYWQpCisgICAgICAgIHJldHVybiBieXRlc19yZWFkICsgc2VsZi5fcmVhZF9idWZmZXIucmVhZChieXRlc19sZWZ0X3RvX3JlYWQpCisKKyAgICBkZWYgX3NldF9jbGllbnRfdHlwZShzZWxmLCBjbGllbnRfdHlwZSk6CisgICAgICAgIGlmIGNsaWVudF90eXBlIG5vdCBpbiBzZWxmLl9hbGxvd2VkX2NsaWVudF90eXBlczoKKyAgICAgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5JTlZBTElEX0NMSUVOVF9UWVBFLAorICAgICAgICAgICAgICAgICJDbGllbnQgdHlwZSAlZCBub3QgYWxsb3dlZCBieSBzZXJ2ZXIuIiAlIGNsaWVudF90eXBlLAorICAgICAgICAgICAgKQorICAgICAgICBzZWxmLl9jbGllbnRfdHlwZSA9IGNsaWVudF90eXBlCisKKyAgICBkZWYgcmVhZEZyYW1lKHNlbGYsIHJlcV9zeik6CisgICAgICAgICMgdGhlIGZpcnN0IHdvcmQgY291bGQgZWl0aGVyIGJlIHRoZSBsZW5ndGggZmllbGQgb2YgYSBmcmFtZWQgbWVzc2FnZQorICAgICAgICAjIG9yIHRoZSBmaXJzdCBieXRlcyBvZiBhbiB1bmZyYW1lZCBtZXNzYWdlLgorICAgICAgICBmaXJzdF93b3JkID0gc2VsZi5fdHJhbnNwb3J0LnJlYWRBbGwoSTMyLnNpemUpCisgICAgICAgIGZyYW1lX3NpemUsID0gSTMyLnVucGFjayhmaXJzdF93b3JkKQorICAgICAgICBpc191bmZyYW1lZCA9IEZhbHNlCisgICAgICAgIGlmIGZyYW1lX3NpemUgJiBUQmluYXJ5UHJvdG9jb2wuVkVSU0lPTl9NQVNLID09IFRCaW5hcnlQcm90b2NvbC5WRVJTSU9OXzE6CisgICAgICAgICAgICBzZWxmLl9zZXRfY2xpZW50X3R5cGUoVEhlYWRlckNsaWVudFR5cGUuVU5GUkFNRURfQklOQVJZKQorICAgICAgICAgICAgaXNfdW5mcmFtZWQgPSBUcnVlCisgICAgICAgIGVsaWYgKGJ5dGVfaW5kZXgoZmlyc3Rfd29yZCwgMCkgPT0gVENvbXBhY3RQcm90b2NvbC5QUk9UT0NPTF9JRCBhbmQKKyAgICAgICAgICAgICAgYnl0ZV9pbmRleChmaXJzdF93b3JkLCAxKSAmIFRDb21wYWN0UHJvdG9jb2wuVkVSU0lPTl9NQVNLID09IFRDb21wYWN0UHJvdG9jb2wuVkVSU0lPTik6CisgICAgICAgICAgICBzZWxmLl9zZXRfY2xpZW50X3R5cGUoVEhlYWRlckNsaWVudFR5cGUuVU5GUkFNRURfQ09NUEFDVCkKKyAgICAgICAgICAgIGlzX3VuZnJhbWVkID0gVHJ1ZQorCisgICAgICAgIGlmIGlzX3VuZnJhbWVkOgorICAgICAgICAgICAgYnl0ZXNfbGVmdF90b19yZWFkID0gcmVxX3N6IC0gSTMyLnNpemUKKyAgICAgICAgICAgIGlmIGJ5dGVzX2xlZnRfdG9fcmVhZCA+IDA6CisgICAgICAgICAgICAgICAgcmVzdCA9IHNlbGYuX3RyYW5zcG9ydC5yZWFkKGJ5dGVzX2xlZnRfdG9fcmVhZCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmVzdCA9IGIiIgorICAgICAgICAgICAgc2VsZi5fcmVhZF9idWZmZXIgPSBCdWZmZXJJTyhmaXJzdF93b3JkICsgcmVzdCkKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICMgb2ssIHdlJ3JlIHN0aWxsIGhlcmUgc28gd2UncmUgZnJhbWVkLgorICAgICAgICBpZiBmcmFtZV9zaXplID4gc2VsZi5fbWF4X2ZyYW1lX3NpemU6CisgICAgICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uU0laRV9MSU1JVCwKKyAgICAgICAgICAgICAgICAiRnJhbWUgd2FzIHRvbyBsYXJnZS4iLAorICAgICAgICAgICAgKQorICAgICAgICByZWFkX2J1ZmZlciA9IEJ1ZmZlcklPKHNlbGYuX3RyYW5zcG9ydC5yZWFkQWxsKGZyYW1lX3NpemUpKQorCisgICAgICAgICMgdGhlIG5leHQgd29yZCBpcyBlaXRoZXIgZ29pbmcgdG8gYmUgdGhlIHZlcnNpb24gZmllbGQgb2YgYQorICAgICAgICAjIGJpbmFyeS9jb21wYWN0IHByb3RvY29sIG1lc3NhZ2Ugb3IgdGhlIG1hZ2ljIHZhbHVlICsgZmxhZ3Mgb2YgYQorICAgICAgICAjIGhlYWRlciBwcm90b2NvbCBtZXNzYWdlLgorICAgICAgICBzZWNvbmRfd29yZCA9IHJlYWRfYnVmZmVyLnJlYWQoSTMyLnNpemUpCisgICAgICAgIHZlcnNpb24sID0gSTMyLnVucGFjayhzZWNvbmRfd29yZCkKKyAgICAgICAgcmVhZF9idWZmZXIuc2VlaygwKQorICAgICAgICBpZiB2ZXJzaW9uID4+IDE2ID09IEhFQURFUl9NQUdJQzoKKyAgICAgICAgICAgIHNlbGYuX3NldF9jbGllbnRfdHlwZShUSGVhZGVyQ2xpZW50VHlwZS5IRUFERVJTKQorICAgICAgICAgICAgc2VsZi5fcmVhZF9idWZmZXIgPSBzZWxmLl9wYXJzZV9oZWFkZXJfZm9ybWF0KHJlYWRfYnVmZmVyKQorICAgICAgICBlbGlmIHZlcnNpb24gJiBUQmluYXJ5UHJvdG9jb2wuVkVSU0lPTl9NQVNLID09IFRCaW5hcnlQcm90b2NvbC5WRVJTSU9OXzE6CisgICAgICAgICAgICBzZWxmLl9zZXRfY2xpZW50X3R5cGUoVEhlYWRlckNsaWVudFR5cGUuRlJBTUVEX0JJTkFSWSkKKyAgICAgICAgICAgIHNlbGYuX3JlYWRfYnVmZmVyID0gcmVhZF9idWZmZXIKKyAgICAgICAgZWxpZiAoYnl0ZV9pbmRleChzZWNvbmRfd29yZCwgMCkgPT0gVENvbXBhY3RQcm90b2NvbC5QUk9UT0NPTF9JRCBhbmQKKyAgICAgICAgICAgICAgYnl0ZV9pbmRleChzZWNvbmRfd29yZCwgMSkgJiBUQ29tcGFjdFByb3RvY29sLlZFUlNJT05fTUFTSyA9PSBUQ29tcGFjdFByb3RvY29sLlZFUlNJT04pOgorICAgICAgICAgICAgc2VsZi5fc2V0X2NsaWVudF90eXBlKFRIZWFkZXJDbGllbnRUeXBlLkZSQU1FRF9DT01QQUNUKQorICAgICAgICAgICAgc2VsZi5fcmVhZF9idWZmZXIgPSByZWFkX2J1ZmZlcgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLklOVkFMSURfQ0xJRU5UX1RZUEUsCisgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBkZXRlY3QgY2xpZW50IHRyYW5zcG9ydCB0eXBlLiIsCisgICAgICAgICAgICApCisKKyAgICBkZWYgX3BhcnNlX2hlYWRlcl9mb3JtYXQoc2VsZiwgYnVmZmVyKToKKyAgICAgICAgIyBtYWtlIEJ1ZmZlcklPIGxvb2sgbGlrZSBUVHJhbnNwb3J0IGZvciB2YXJpbnQgaGVscGVycworICAgICAgICBidWZmZXJfdHJhbnNwb3J0ID0gVE1lbW9yeUJ1ZmZlcigpCisgICAgICAgIGJ1ZmZlcl90cmFuc3BvcnQuX2J1ZmZlciA9IGJ1ZmZlcgorCisgICAgICAgIGJ1ZmZlci5yZWFkKDIpICAjIGRpc2NhcmQgdGhlIG1hZ2ljIGJ5dGVzCisgICAgICAgIHNlbGYuZmxhZ3MsID0gVTE2LnVucGFjayhidWZmZXIucmVhZChVMTYuc2l6ZSkpCisgICAgICAgIHNlbGYuc2VxdWVuY2VfaWQsID0gSTMyLnVucGFjayhidWZmZXIucmVhZChJMzIuc2l6ZSkpCisKKyAgICAgICAgaGVhZGVyX2xlbmd0aCA9IFUxNi51bnBhY2soYnVmZmVyLnJlYWQoVTE2LnNpemUpKVswXSAqIDQKKyAgICAgICAgZW5kX29mX2hlYWRlcnMgPSBidWZmZXIudGVsbCgpICsgaGVhZGVyX2xlbmd0aAorICAgICAgICBpZiBlbmRfb2ZfaGVhZGVycyA+IGxlbihidWZmZXIuZ2V0dmFsdWUoKSk6CisgICAgICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uU0laRV9MSU1JVCwKKyAgICAgICAgICAgICAgICAiSGVhZGVyIHNpemUgaXMgbGFyZ2VyIHRoYW4gd2hvbGUgZnJhbWUuIiwKKyAgICAgICAgICAgICkKKworICAgICAgICBzZWxmLl9wcm90b2NvbF9pZCA9IHJlYWRWYXJpbnQoYnVmZmVyX3RyYW5zcG9ydCkKKworICAgICAgICB0cmFuc2Zvcm1zID0gW10KKyAgICAgICAgdHJhbnNmb3JtX2NvdW50ID0gcmVhZFZhcmludChidWZmZXJfdHJhbnNwb3J0KQorICAgICAgICBmb3IgXyBpbiByYW5nZSh0cmFuc2Zvcm1fY291bnQpOgorICAgICAgICAgICAgdHJhbnNmb3JtX2lkID0gcmVhZFZhcmludChidWZmZXJfdHJhbnNwb3J0KQorICAgICAgICAgICAgaWYgdHJhbnNmb3JtX2lkIG5vdCBpbiBSRUFEX1RSQU5TRk9STVNfQllfSUQ6CisgICAgICAgICAgICAgICAgcmFpc2UgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICBUQXBwbGljYXRpb25FeGNlcHRpb24uSU5WQUxJRF9UUkFOU0ZPUk0sCisgICAgICAgICAgICAgICAgICAgICJVbmtub3duIHRyYW5zZm9ybTogJWQiICUgdHJhbnNmb3JtX2lkLAorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIHRyYW5zZm9ybXMuYXBwZW5kKHRyYW5zZm9ybV9pZCkKKyAgICAgICAgdHJhbnNmb3Jtcy5yZXZlcnNlKCkKKworICAgICAgICBoZWFkZXJzID0ge30KKyAgICAgICAgd2hpbGUgYnVmZmVyLnRlbGwoKSA8IGVuZF9vZl9oZWFkZXJzOgorICAgICAgICAgICAgaGVhZGVyX3R5cGUgPSByZWFkVmFyaW50KGJ1ZmZlcl90cmFuc3BvcnQpCisgICAgICAgICAgICBpZiBoZWFkZXJfdHlwZSA9PSBUSW5mb0hlYWRlclR5cGUuS0VZX1ZBTFVFOgorICAgICAgICAgICAgICAgIGNvdW50ID0gcmVhZFZhcmludChidWZmZXJfdHJhbnNwb3J0KQorICAgICAgICAgICAgICAgIGZvciBfIGluIHJhbmdlKGNvdW50KToKKyAgICAgICAgICAgICAgICAgICAga2V5ID0gX3JlYWRTdHJpbmcoYnVmZmVyX3RyYW5zcG9ydCkKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBfcmVhZFN0cmluZyhidWZmZXJfdHJhbnNwb3J0KQorICAgICAgICAgICAgICAgICAgICBoZWFkZXJzW2tleV0gPSB2YWx1ZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBicmVhayAgIyBpZ25vcmUgdW5rbm93biBoZWFkZXJzCisgICAgICAgIHNlbGYuX3JlYWRfaGVhZGVycyA9IGhlYWRlcnMKKworICAgICAgICAjIHNraXAgcGFkZGluZyAvIGFueXRoaW5nIHdlIGRpZG4ndCB1bmRlcnN0YW5kCisgICAgICAgIGJ1ZmZlci5zZWVrKGVuZF9vZl9oZWFkZXJzKQorCisgICAgICAgIHBheWxvYWQgPSBidWZmZXIucmVhZCgpCisgICAgICAgIGZvciB0cmFuc2Zvcm1faWQgaW4gdHJhbnNmb3JtczoKKyAgICAgICAgICAgIHRyYW5zZm9ybV9mbiA9IFJFQURfVFJBTlNGT1JNU19CWV9JRFt0cmFuc2Zvcm1faWRdCisgICAgICAgICAgICBwYXlsb2FkID0gdHJhbnNmb3JtX2ZuKHBheWxvYWQpCisgICAgICAgIHJldHVybiBCdWZmZXJJTyhwYXlsb2FkKQorCisgICAgZGVmIHdyaXRlKHNlbGYsIGJ1Zik6CisgICAgICAgIHNlbGYuX3dyaXRlX2J1ZmZlci53cml0ZShidWYpCisKKyAgICBkZWYgZmx1c2goc2VsZik6CisgICAgICAgIHBheWxvYWQgPSBzZWxmLl93cml0ZV9idWZmZXIuZ2V0dmFsdWUoKQorICAgICAgICBzZWxmLl93cml0ZV9idWZmZXIgPSBCdWZmZXJJTygpCisKKyAgICAgICAgYnVmZmVyID0gQnVmZmVySU8oKQorICAgICAgICBpZiBzZWxmLl9jbGllbnRfdHlwZSA9PSBUSGVhZGVyQ2xpZW50VHlwZS5IRUFERVJTOgorICAgICAgICAgICAgZm9yIHRyYW5zZm9ybV9pZCBpbiBzZWxmLl93cml0ZV90cmFuc2Zvcm1zOgorICAgICAgICAgICAgICAgIHRyYW5zZm9ybV9mbiA9IFdSSVRFX1RSQU5TRk9STVNfQllfSURbdHJhbnNmb3JtX2lkXQorICAgICAgICAgICAgICAgIHBheWxvYWQgPSB0cmFuc2Zvcm1fZm4ocGF5bG9hZCkKKworICAgICAgICAgICAgaGVhZGVycyA9IEJ1ZmZlcklPKCkKKyAgICAgICAgICAgIHdyaXRlVmFyaW50KGhlYWRlcnMsIHNlbGYuX3Byb3RvY29sX2lkKQorICAgICAgICAgICAgd3JpdGVWYXJpbnQoaGVhZGVycywgbGVuKHNlbGYuX3dyaXRlX3RyYW5zZm9ybXMpKQorICAgICAgICAgICAgZm9yIHRyYW5zZm9ybV9pZCBpbiBzZWxmLl93cml0ZV90cmFuc2Zvcm1zOgorICAgICAgICAgICAgICAgIHdyaXRlVmFyaW50KGhlYWRlcnMsIHRyYW5zZm9ybV9pZCkKKyAgICAgICAgICAgIGlmIHNlbGYuX3dyaXRlX2hlYWRlcnM6CisgICAgICAgICAgICAgICAgd3JpdGVWYXJpbnQoaGVhZGVycywgVEluZm9IZWFkZXJUeXBlLktFWV9WQUxVRSkKKyAgICAgICAgICAgICAgICB3cml0ZVZhcmludChoZWFkZXJzLCBsZW4oc2VsZi5fd3JpdGVfaGVhZGVycykpCisgICAgICAgICAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gc2VsZi5fd3JpdGVfaGVhZGVycy5pdGVtcygpOgorICAgICAgICAgICAgICAgICAgICBfd3JpdGVTdHJpbmcoaGVhZGVycywga2V5KQorICAgICAgICAgICAgICAgICAgICBfd3JpdGVTdHJpbmcoaGVhZGVycywgdmFsdWUpCisgICAgICAgICAgICAgICAgc2VsZi5fd3JpdGVfaGVhZGVycyA9IHt9CisgICAgICAgICAgICBwYWRkaW5nX25lZWRlZCA9ICg0IC0gKGxlbihoZWFkZXJzLmdldHZhbHVlKCkpICUgNCkpICUgNAorICAgICAgICAgICAgaGVhZGVycy53cml0ZShiIlx4MDAiICogcGFkZGluZ19uZWVkZWQpCisgICAgICAgICAgICBoZWFkZXJfYnl0ZXMgPSBoZWFkZXJzLmdldHZhbHVlKCkKKworICAgICAgICAgICAgYnVmZmVyLndyaXRlKEkzMi5wYWNrKDEwICsgbGVuKGhlYWRlcl9ieXRlcykgKyBsZW4ocGF5bG9hZCkpKQorICAgICAgICAgICAgYnVmZmVyLndyaXRlKFUxNi5wYWNrKEhFQURFUl9NQUdJQykpCisgICAgICAgICAgICBidWZmZXIud3JpdGUoVTE2LnBhY2soc2VsZi5mbGFncykpCisgICAgICAgICAgICBidWZmZXIud3JpdGUoSTMyLnBhY2soc2VsZi5zZXF1ZW5jZV9pZCkpCisgICAgICAgICAgICBidWZmZXIud3JpdGUoVTE2LnBhY2sobGVuKGhlYWRlcl9ieXRlcykgLy8gNCkpCisgICAgICAgICAgICBidWZmZXIud3JpdGUoaGVhZGVyX2J5dGVzKQorICAgICAgICAgICAgYnVmZmVyLndyaXRlKHBheWxvYWQpCisgICAgICAgIGVsaWYgc2VsZi5fY2xpZW50X3R5cGUgaW4gKFRIZWFkZXJDbGllbnRUeXBlLkZSQU1FRF9CSU5BUlksIFRIZWFkZXJDbGllbnRUeXBlLkZSQU1FRF9DT01QQUNUKToKKyAgICAgICAgICAgIGJ1ZmZlci53cml0ZShJMzIucGFjayhsZW4ocGF5bG9hZCkpKQorICAgICAgICAgICAgYnVmZmVyLndyaXRlKHBheWxvYWQpCisgICAgICAgIGVsaWYgc2VsZi5fY2xpZW50X3R5cGUgaW4gKFRIZWFkZXJDbGllbnRUeXBlLlVORlJBTUVEX0JJTkFSWSwgVEhlYWRlckNsaWVudFR5cGUuVU5GUkFNRURfQ09NUEFDVCk6CisgICAgICAgICAgICBidWZmZXIud3JpdGUocGF5bG9hZCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5JTlZBTElEX0NMSUVOVF9UWVBFLAorICAgICAgICAgICAgICAgICJVbmtub3duIGNsaWVudCB0eXBlLiIsCisgICAgICAgICAgICApCisKKyAgICAgICAgIyB0aGUgZnJhbWUgbGVuZ3RoIGZpZWxkIGRvZXNuJ3QgY291bnQgdG93YXJkcyB0aGUgZnJhbWUgcGF5bG9hZCBzaXplCisgICAgICAgIGZyYW1lX2J5dGVzID0gYnVmZmVyLmdldHZhbHVlKCkKKyAgICAgICAgZnJhbWVfcGF5bG9hZF9zaXplID0gbGVuKGZyYW1lX2J5dGVzKSAtIDQKKyAgICAgICAgaWYgZnJhbWVfcGF5bG9hZF9zaXplID4gc2VsZi5fbWF4X2ZyYW1lX3NpemU6CisgICAgICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uU0laRV9MSU1JVCwKKyAgICAgICAgICAgICAgICAiQXR0ZW1wdGluZyB0byBzZW5kIGZyYW1lIHRoYXQgaXMgdG9vIGxhcmdlLiIsCisgICAgICAgICAgICApCisKKyAgICAgICAgc2VsZi5fdHJhbnNwb3J0LndyaXRlKGZyYW1lX2J5dGVzKQorICAgICAgICBzZWxmLl90cmFuc3BvcnQuZmx1c2goKQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIGNzdHJpbmdpb19idWYoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9yZWFkX2J1ZmZlcgorCisgICAgZGVmIGNzdHJpbmdpb19yZWZpbGwoc2VsZiwgcGFydGlhbHJlYWQsIHJlcWxlbik6CisgICAgICAgIHJlc3VsdCA9IGJ5dGVhcnJheShwYXJ0aWFscmVhZCkKKyAgICAgICAgd2hpbGUgbGVuKHJlc3VsdCkgPCByZXFsZW46CisgICAgICAgICAgICByZXN1bHQgKz0gc2VsZi5yZWFkKHJlcWxlbiAtIGxlbihyZXN1bHQpKQorICAgICAgICBzZWxmLl9yZWFkX2J1ZmZlciA9IEJ1ZmZlcklPKHJlc3VsdCkKKyAgICAgICAgcmV0dXJuIHNlbGYuX3JlYWRfYnVmZmVyCmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL3RyYW5zcG9ydC9USHR0cENsaWVudC5weSBiL2xpYi9weS9zcmMvdHJhbnNwb3J0L1RIdHRwQ2xpZW50LnB5CmluZGV4IGVhODBhMWEuLjM3YjBhNGQgMTAwNjQ0Ci0tLSBhL2xpYi9weS9zcmMvdHJhbnNwb3J0L1RIdHRwQ2xpZW50LnB5CisrKyBiL2xpYi9weS9zcmMvdHJhbnNwb3J0L1RIdHRwQ2xpZW50LnB5CkBAIC0xNywxMzMgKzE3LDE3MSBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotaW1wb3J0IGh0dHBsaWIKK2Zyb20gaW8gaW1wb3J0IEJ5dGVzSU8KIGltcG9ydCBvcwotaW1wb3J0IHNvY2tldAoraW1wb3J0IHNzbAogaW1wb3J0IHN5cwotaW1wb3J0IHVybGxpYgotaW1wb3J0IHVybHBhcnNlCiBpbXBvcnQgd2FybmluZ3MKK2ltcG9ydCBiYXNlNjQKIAotZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCitmcm9tIHNpeC5tb3ZlcyBpbXBvcnQgdXJsbGliCitmcm9tIHNpeC5tb3ZlcyBpbXBvcnQgaHR0cF9jbGllbnQKIAotZnJvbSBUVHJhbnNwb3J0IGltcG9ydCAqCitmcm9tIC5UVHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0QmFzZQoraW1wb3J0IHNpeAogCiAKIGNsYXNzIFRIdHRwQ2xpZW50KFRUcmFuc3BvcnRCYXNlKToKLSAgIiIiSHR0cCBpbXBsZW1lbnRhdGlvbiBvZiBUVHJhbnNwb3J0IGJhc2UuIiIiCisgICAgIiIiSHR0cCBpbXBsZW1lbnRhdGlvbiBvZiBUVHJhbnNwb3J0IGJhc2UuIiIiCiAKLSAgZGVmIF9faW5pdF9fKHNlbGYsIHVyaV9vcl9ob3N0LCBwb3J0PU5vbmUsIHBhdGg9Tm9uZSk6Ci0gICAgIiIiVEh0dHBDbGllbnQgc3VwcG9ydHMgdHdvIGRpZmZlcmVudCB0eXBlcyBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzLgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB1cmlfb3JfaG9zdCwgcG9ydD1Ob25lLCBwYXRoPU5vbmUsIGNhZmlsZT1Ob25lLCBjZXJ0X2ZpbGU9Tm9uZSwga2V5X2ZpbGU9Tm9uZSwgc3NsX2NvbnRleHQ9Tm9uZSk6CisgICAgICAgICIiIlRIdHRwQ2xpZW50IHN1cHBvcnRzIHR3byBkaWZmZXJlbnQgdHlwZXMgb2YgY29uc3RydWN0aW9uOgogCi0gICAgVEh0dHBDbGllbnQoaG9zdCwgcG9ydCwgcGF0aCkgLSBkZXByZWNhdGVkCi0gICAgVEh0dHBDbGllbnQodXJpKQorICAgICAgICBUSHR0cENsaWVudChob3N0LCBwb3J0LCBwYXRoKSAtIGRlcHJlY2F0ZWQKKyAgICAgICAgVEh0dHBDbGllbnQodXJpLCBbcG9ydD08bj4sIHBhdGg9PHM+LCBjYWZpbGU9PGZpbGVuYW1lPiwgY2VydF9maWxlPTxmaWxlbmFtZT4sIGtleV9maWxlPTxmaWxlbmFtZT4sIHNzbF9jb250ZXh0PTxjb250ZXh0Pl0pCiAKLSAgICBPbmx5IHRoZSBzZWNvbmQgc3VwcG9ydHMgaHR0cHMuCi0gICAgIiIiCi0gICAgaWYgcG9ydCBpcyBub3QgTm9uZToKLSAgICAgIHdhcm5pbmdzLndhcm4oCi0gICAgICAgICJQbGVhc2UgdXNlIHRoZSBUSHR0cENsaWVudCgnaHR0cDovL2hvc3Q6cG9ydC9wYXRoJykgc3ludGF4IiwKLSAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLAotICAgICAgICBzdGFja2xldmVsPTIpCi0gICAgICBzZWxmLmhvc3QgPSB1cmlfb3JfaG9zdAotICAgICAgc2VsZi5wb3J0ID0gcG9ydAotICAgICAgYXNzZXJ0IHBhdGgKLSAgICAgIHNlbGYucGF0aCA9IHBhdGgKLSAgICAgIHNlbGYuc2NoZW1lID0gJ2h0dHAnCi0gICAgZWxzZToKLSAgICAgIHBhcnNlZCA9IHVybHBhcnNlLnVybHBhcnNlKHVyaV9vcl9ob3N0KQotICAgICAgc2VsZi5zY2hlbWUgPSBwYXJzZWQuc2NoZW1lCi0gICAgICBhc3NlcnQgc2VsZi5zY2hlbWUgaW4gKCdodHRwJywgJ2h0dHBzJykKLSAgICAgIGlmIHNlbGYuc2NoZW1lID09ICdodHRwJzoKLSAgICAgICAgc2VsZi5wb3J0ID0gcGFyc2VkLnBvcnQgb3IgaHR0cGxpYi5IVFRQX1BPUlQKLSAgICAgIGVsaWYgc2VsZi5zY2hlbWUgPT0gJ2h0dHBzJzoKLSAgICAgICAgc2VsZi5wb3J0ID0gcGFyc2VkLnBvcnQgb3IgaHR0cGxpYi5IVFRQU19QT1JUCi0gICAgICBzZWxmLmhvc3QgPSBwYXJzZWQuaG9zdG5hbWUKLSAgICAgIHNlbGYucGF0aCA9IHBhcnNlZC5wYXRoCi0gICAgICBpZiBwYXJzZWQucXVlcnk6Ci0gICAgICAgIHNlbGYucGF0aCArPSAnPyVzJyAlIHBhcnNlZC5xdWVyeQotICAgIHNlbGYuX193YnVmID0gU3RyaW5nSU8oKQotICAgIHNlbGYuX19odHRwID0gTm9uZQotICAgIHNlbGYuX190aW1lb3V0ID0gTm9uZQotICAgIHNlbGYuX19jdXN0b21faGVhZGVycyA9IE5vbmUKKyAgICAgICAgT25seSB0aGUgc2Vjb25kIHN1cHBvcnRzIGh0dHBzLiAgVG8gcHJvcGVybHkgYXV0aGVudGljYXRlIGFnYWluc3QgdGhlIHNlcnZlciwKKyAgICAgICAgcHJvdmlkZSB0aGUgY2xpZW50J3MgaWRlbnRpdHkgYnkgc3BlY2lmeWluZyBjZXJ0X2ZpbGUgYW5kIGtleV9maWxlLiAgVG8gcHJvcGVybHkKKyAgICAgICAgYXV0aGVudGljYXRlIHRoZSBzZXJ2ZXIsIHNwZWNpZnkgZWl0aGVyIGNhZmlsZSBvciBzc2xfY29udGV4dCB3aXRoIGEgQ0EgZGVmaW5lZC4KKyAgICAgICAgTk9URTogaWYgYm90aCBjYWZpbGUgYW5kIHNzbF9jb250ZXh0IGFyZSBkZWZpbmVkLCBzc2xfY29udGV4dCB3aWxsIG92ZXJyaWRlIGNhZmlsZS4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHBvcnQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICB3YXJuaW5ncy53YXJuKAorICAgICAgICAgICAgICAgICJQbGVhc2UgdXNlIHRoZSBUSHR0cENsaWVudCgnaHR0cHtzfTovL2hvc3Q6cG9ydC9wYXRoJykgY29uc3RydWN0b3IiLAorICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywKKyAgICAgICAgICAgICAgICBzdGFja2xldmVsPTIpCisgICAgICAgICAgICBzZWxmLmhvc3QgPSB1cmlfb3JfaG9zdAorICAgICAgICAgICAgc2VsZi5wb3J0ID0gcG9ydAorICAgICAgICAgICAgYXNzZXJ0IHBhdGgKKyAgICAgICAgICAgIHNlbGYucGF0aCA9IHBhdGgKKyAgICAgICAgICAgIHNlbGYuc2NoZW1lID0gJ2h0dHAnCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwYXJzZWQgPSB1cmxsaWIucGFyc2UudXJscGFyc2UodXJpX29yX2hvc3QpCisgICAgICAgICAgICBzZWxmLnNjaGVtZSA9IHBhcnNlZC5zY2hlbWUKKyAgICAgICAgICAgIGFzc2VydCBzZWxmLnNjaGVtZSBpbiAoJ2h0dHAnLCAnaHR0cHMnKQorICAgICAgICAgICAgaWYgc2VsZi5zY2hlbWUgPT0gJ2h0dHAnOgorICAgICAgICAgICAgICAgIHNlbGYucG9ydCA9IHBhcnNlZC5wb3J0IG9yIGh0dHBfY2xpZW50LkhUVFBfUE9SVAorICAgICAgICAgICAgZWxpZiBzZWxmLnNjaGVtZSA9PSAnaHR0cHMnOgorICAgICAgICAgICAgICAgIHNlbGYucG9ydCA9IHBhcnNlZC5wb3J0IG9yIGh0dHBfY2xpZW50LkhUVFBTX1BPUlQKKyAgICAgICAgICAgICAgICBzZWxmLmNlcnRmaWxlID0gY2VydF9maWxlCisgICAgICAgICAgICAgICAgc2VsZi5rZXlmaWxlID0ga2V5X2ZpbGUKKyAgICAgICAgICAgICAgICBzZWxmLmNvbnRleHQgPSBzc2wuY3JlYXRlX2RlZmF1bHRfY29udGV4dChjYWZpbGU9Y2FmaWxlKSBpZiAoY2FmaWxlIGFuZCBub3Qgc3NsX2NvbnRleHQpIGVsc2Ugc3NsX2NvbnRleHQKKyAgICAgICAgICAgIHNlbGYuaG9zdCA9IHBhcnNlZC5ob3N0bmFtZQorICAgICAgICAgICAgc2VsZi5wYXRoID0gcGFyc2VkLnBhdGgKKyAgICAgICAgICAgIGlmIHBhcnNlZC5xdWVyeToKKyAgICAgICAgICAgICAgICBzZWxmLnBhdGggKz0gJz8lcycgJSBwYXJzZWQucXVlcnkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcHJveHkgPSB1cmxsaWIucmVxdWVzdC5nZXRwcm94aWVzKClbc2VsZi5zY2hlbWVdCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHByb3h5ID0gTm9uZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgdXJsbGliLnJlcXVlc3QucHJveHlfYnlwYXNzKHNlbGYuaG9zdCk6CisgICAgICAgICAgICAgICAgcHJveHkgPSBOb25lCisgICAgICAgIGlmIHByb3h5OgorICAgICAgICAgICAgcGFyc2VkID0gdXJsbGliLnBhcnNlLnVybHBhcnNlKHByb3h5KQorICAgICAgICAgICAgc2VsZi5yZWFsaG9zdCA9IHNlbGYuaG9zdAorICAgICAgICAgICAgc2VsZi5yZWFscG9ydCA9IHNlbGYucG9ydAorICAgICAgICAgICAgc2VsZi5ob3N0ID0gcGFyc2VkLmhvc3RuYW1lCisgICAgICAgICAgICBzZWxmLnBvcnQgPSBwYXJzZWQucG9ydAorICAgICAgICAgICAgc2VsZi5wcm94eV9hdXRoID0gc2VsZi5iYXNpY19wcm94eV9hdXRoX2hlYWRlcihwYXJzZWQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnJlYWxob3N0ID0gc2VsZi5yZWFscG9ydCA9IHNlbGYucHJveHlfYXV0aCA9IE5vbmUKKyAgICAgICAgc2VsZi5fX3didWYgPSBCeXRlc0lPKCkKKyAgICAgICAgc2VsZi5fX2h0dHAgPSBOb25lCisgICAgICAgIHNlbGYuX19odHRwX3Jlc3BvbnNlID0gTm9uZQorICAgICAgICBzZWxmLl9fdGltZW91dCA9IE5vbmUKKyAgICAgICAgc2VsZi5fX2N1c3RvbV9oZWFkZXJzID0gTm9uZQogCi0gIGRlZiBvcGVuKHNlbGYpOgotICAgIGlmIHNlbGYuc2NoZW1lID09ICdodHRwJzoKLSAgICAgIHNlbGYuX19odHRwID0gaHR0cGxpYi5IVFRQKHNlbGYuaG9zdCwgc2VsZi5wb3J0KQotICAgIGVsc2U6Ci0gICAgICBzZWxmLl9faHR0cCA9IGh0dHBsaWIuSFRUUFMoc2VsZi5ob3N0LCBzZWxmLnBvcnQpCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBiYXNpY19wcm94eV9hdXRoX2hlYWRlcihwcm94eSk6CisgICAgICAgIGlmIHByb3h5IGlzIE5vbmUgb3Igbm90IHByb3h5LnVzZXJuYW1lOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgYXAgPSAiJXM6JXMiICUgKHVybGxpYi5wYXJzZS51bnF1b3RlKHByb3h5LnVzZXJuYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVybGxpYi5wYXJzZS51bnF1b3RlKHByb3h5LnBhc3N3b3JkKSkKKyAgICAgICAgY3IgPSBiYXNlNjQuYjY0ZW5jb2RlKGFwKS5zdHJpcCgpCisgICAgICAgIHJldHVybiAiQmFzaWMgIiArIGNyCiAKLSAgZGVmIGNsb3NlKHNlbGYpOgotICAgIHNlbGYuX19odHRwLmNsb3NlKCkKLSAgICBzZWxmLl9faHR0cCA9IE5vbmUKKyAgICBkZWYgdXNpbmdfcHJveHkoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnJlYWxob3N0IGlzIG5vdCBOb25lCiAKLSAgZGVmIGlzT3BlbihzZWxmKToKLSAgICByZXR1cm4gc2VsZi5fX2h0dHAgaXMgbm90IE5vbmUKKyAgICBkZWYgb3BlbihzZWxmKToKKyAgICAgICAgaWYgc2VsZi5zY2hlbWUgPT0gJ2h0dHAnOgorICAgICAgICAgICAgc2VsZi5fX2h0dHAgPSBodHRwX2NsaWVudC5IVFRQQ29ubmVjdGlvbihzZWxmLmhvc3QsIHNlbGYucG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dD1zZWxmLl9fdGltZW91dCkKKyAgICAgICAgZWxpZiBzZWxmLnNjaGVtZSA9PSAnaHR0cHMnOgorICAgICAgICAgICAgc2VsZi5fX2h0dHAgPSBodHRwX2NsaWVudC5IVFRQU0Nvbm5lY3Rpb24oc2VsZi5ob3N0LCBzZWxmLnBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlfZmlsZT1zZWxmLmtleWZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0X2ZpbGU9c2VsZi5jZXJ0ZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQ9c2VsZi5fX3RpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0PXNlbGYuY29udGV4dCkKKyAgICAgICAgaWYgc2VsZi51c2luZ19wcm94eSgpOgorICAgICAgICAgICAgc2VsZi5fX2h0dHAuc2V0X3R1bm5lbChzZWxmLnJlYWxob3N0LCBzZWxmLnJlYWxwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IlByb3h5LUF1dGhvcml6YXRpb24iOiBzZWxmLnByb3h5X2F1dGh9KQogCi0gIGRlZiBzZXRUaW1lb3V0KHNlbGYsIG1zKToKLSAgICBpZiBub3QgaGFzYXR0cihzb2NrZXQsICdnZXRkZWZhdWx0dGltZW91dCcpOgotICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgc2VsZi5fX2h0dHAuY2xvc2UoKQorICAgICAgICBzZWxmLl9faHR0cCA9IE5vbmUKKyAgICAgICAgc2VsZi5fX2h0dHBfcmVzcG9uc2UgPSBOb25lCiAKLSAgICBpZiBtcyBpcyBOb25lOgotICAgICAgc2VsZi5fX3RpbWVvdXQgPSBOb25lCi0gICAgZWxzZToKLSAgICAgIHNlbGYuX190aW1lb3V0ID0gbXMgLyAxMDAwLjAKKyAgICBkZWYgaXNPcGVuKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fX2h0dHAgaXMgbm90IE5vbmUKIAotICBkZWYgc2V0Q3VzdG9tSGVhZGVycyhzZWxmLCBoZWFkZXJzKToKLSAgICBzZWxmLl9fY3VzdG9tX2hlYWRlcnMgPSBoZWFkZXJzCisgICAgZGVmIHNldFRpbWVvdXQoc2VsZiwgbXMpOgorICAgICAgICBpZiBtcyBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5fX3RpbWVvdXQgPSBOb25lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9fdGltZW91dCA9IG1zIC8gMTAwMC4wCiAKLSAgZGVmIHJlYWQoc2VsZiwgc3opOgotICAgIHJldHVybiBzZWxmLl9faHR0cC5maWxlLnJlYWQoc3opCisgICAgZGVmIHNldEN1c3RvbUhlYWRlcnMoc2VsZiwgaGVhZGVycyk6CisgICAgICAgIHNlbGYuX19jdXN0b21faGVhZGVycyA9IGhlYWRlcnMKIAotICBkZWYgd3JpdGUoc2VsZiwgYnVmKToKLSAgICBzZWxmLl9fd2J1Zi53cml0ZShidWYpCisgICAgZGVmIHJlYWQoc2VsZiwgc3opOgorICAgICAgICByZXR1cm4gc2VsZi5fX2h0dHBfcmVzcG9uc2UucmVhZChzeikKIAotICBkZWYgX193aXRoVGltZW91dChmKToKLSAgICBkZWYgX2YoKmFyZ3MsICoqa3dhcmdzKToKLSAgICAgIG9yaWdfdGltZW91dCA9IHNvY2tldC5nZXRkZWZhdWx0dGltZW91dCgpCi0gICAgICBzb2NrZXQuc2V0ZGVmYXVsdHRpbWVvdXQoYXJnc1swXS5fX3RpbWVvdXQpCi0gICAgICByZXN1bHQgPSBmKCphcmdzLCAqKmt3YXJncykKLSAgICAgIHNvY2tldC5zZXRkZWZhdWx0dGltZW91dChvcmlnX3RpbWVvdXQpCi0gICAgICByZXR1cm4gcmVzdWx0Ci0gICAgcmV0dXJuIF9mCisgICAgZGVmIHdyaXRlKHNlbGYsIGJ1Zik6CisgICAgICAgIHNlbGYuX193YnVmLndyaXRlKGJ1ZikKIAotICBkZWYgZmx1c2goc2VsZik6Ci0gICAgaWYgc2VsZi5pc09wZW4oKToKLSAgICAgIHNlbGYuY2xvc2UoKQotICAgIHNlbGYub3BlbigpCisgICAgZGVmIGZsdXNoKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmlzT3BlbigpOgorICAgICAgICAgICAgc2VsZi5jbG9zZSgpCisgICAgICAgIHNlbGYub3BlbigpCiAKLSAgICAjIFB1bGwgZGF0YSBvdXQgb2YgYnVmZmVyCi0gICAgZGF0YSA9IHNlbGYuX193YnVmLmdldHZhbHVlKCkKLSAgICBzZWxmLl9fd2J1ZiA9IFN0cmluZ0lPKCkKKyAgICAgICAgIyBQdWxsIGRhdGEgb3V0IG9mIGJ1ZmZlcgorICAgICAgICBkYXRhID0gc2VsZi5fX3didWYuZ2V0dmFsdWUoKQorICAgICAgICBzZWxmLl9fd2J1ZiA9IEJ5dGVzSU8oKQogCi0gICAgIyBIVFRQIHJlcXVlc3QKLSAgICBzZWxmLl9faHR0cC5wdXRyZXF1ZXN0KCdQT1NUJywgc2VsZi5wYXRoKQorICAgICAgICAjIEhUVFAgcmVxdWVzdAorICAgICAgICBpZiBzZWxmLnVzaW5nX3Byb3h5KCkgYW5kIHNlbGYuc2NoZW1lID09ICJodHRwIjoKKyAgICAgICAgICAgICMgbmVlZCBmdWxsIFVSTCBvZiByZWFsIGhvc3QgZm9yIEhUVFAgcHJveHkgaGVyZSAoSFRUUFMgdXNlcyBDT05ORUNUIHR1bm5lbCkKKyAgICAgICAgICAgIHNlbGYuX19odHRwLnB1dHJlcXVlc3QoJ1BPU1QnLCAiaHR0cDovLyVzOiVzJXMiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGYucmVhbGhvc3QsIHNlbGYucmVhbHBvcnQsIHNlbGYucGF0aCkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9faHR0cC5wdXRyZXF1ZXN0KCdQT1NUJywgc2VsZi5wYXRoKQogCi0gICAgIyBXcml0ZSBoZWFkZXJzCi0gICAgc2VsZi5fX2h0dHAucHV0aGVhZGVyKCdIb3N0Jywgc2VsZi5ob3N0KQotICAgIHNlbGYuX19odHRwLnB1dGhlYWRlcignQ29udGVudC1UeXBlJywgJ2FwcGxpY2F0aW9uL3gtdGhyaWZ0JykKLSAgICBzZWxmLl9faHR0cC5wdXRoZWFkZXIoJ0NvbnRlbnQtTGVuZ3RoJywgc3RyKGxlbihkYXRhKSkpCisgICAgICAgICMgV3JpdGUgaGVhZGVycworICAgICAgICBzZWxmLl9faHR0cC5wdXRoZWFkZXIoJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi94LXRocmlmdCcpCisgICAgICAgIHNlbGYuX19odHRwLnB1dGhlYWRlcignQ29udGVudC1MZW5ndGgnLCBzdHIobGVuKGRhdGEpKSkKKyAgICAgICAgaWYgc2VsZi51c2luZ19wcm94eSgpIGFuZCBzZWxmLnNjaGVtZSA9PSAiaHR0cCIgYW5kIHNlbGYucHJveHlfYXV0aCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuX19odHRwLnB1dGhlYWRlcigiUHJveHktQXV0aG9yaXphdGlvbiIsIHNlbGYucHJveHlfYXV0aCkKIAotICAgIGlmIG5vdCBzZWxmLl9fY3VzdG9tX2hlYWRlcnMgb3IgJ1VzZXItQWdlbnQnIG5vdCBpbiBzZWxmLl9fY3VzdG9tX2hlYWRlcnM6Ci0gICAgICB1c2VyX2FnZW50ID0gJ1B5dGhvbi9USHR0cENsaWVudCcKLSAgICAgIHNjcmlwdCA9IG9zLnBhdGguYmFzZW5hbWUoc3lzLmFyZ3ZbMF0pCi0gICAgICBpZiBzY3JpcHQ6Ci0gICAgICAgIHVzZXJfYWdlbnQgPSAnJXMgKCVzKScgJSAodXNlcl9hZ2VudCwgdXJsbGliLnF1b3RlKHNjcmlwdCkpCi0gICAgICBzZWxmLl9faHR0cC5wdXRoZWFkZXIoJ1VzZXItQWdlbnQnLCB1c2VyX2FnZW50KQorICAgICAgICBpZiBub3Qgc2VsZi5fX2N1c3RvbV9oZWFkZXJzIG9yICdVc2VyLUFnZW50JyBub3QgaW4gc2VsZi5fX2N1c3RvbV9oZWFkZXJzOgorICAgICAgICAgICAgdXNlcl9hZ2VudCA9ICdQeXRob24vVEh0dHBDbGllbnQnCisgICAgICAgICAgICBzY3JpcHQgPSBvcy5wYXRoLmJhc2VuYW1lKHN5cy5hcmd2WzBdKQorICAgICAgICAgICAgaWYgc2NyaXB0OgorICAgICAgICAgICAgICAgIHVzZXJfYWdlbnQgPSAnJXMgKCVzKScgJSAodXNlcl9hZ2VudCwgdXJsbGliLnBhcnNlLnF1b3RlKHNjcmlwdCkpCisgICAgICAgICAgICBzZWxmLl9faHR0cC5wdXRoZWFkZXIoJ1VzZXItQWdlbnQnLCB1c2VyX2FnZW50KQogCi0gICAgaWYgc2VsZi5fX2N1c3RvbV9oZWFkZXJzOgotICAgICAgICBmb3Iga2V5LCB2YWwgaW4gc2VsZi5fX2N1c3RvbV9oZWFkZXJzLml0ZXJpdGVtcygpOgotICAgICAgICAgICAgc2VsZi5fX2h0dHAucHV0aGVhZGVyKGtleSwgdmFsKQorICAgICAgICBpZiBzZWxmLl9fY3VzdG9tX2hlYWRlcnM6CisgICAgICAgICAgICBmb3Iga2V5LCB2YWwgaW4gc2l4Lml0ZXJpdGVtcyhzZWxmLl9fY3VzdG9tX2hlYWRlcnMpOgorICAgICAgICAgICAgICAgIHNlbGYuX19odHRwLnB1dGhlYWRlcihrZXksIHZhbCkKIAotICAgIHNlbGYuX19odHRwLmVuZGhlYWRlcnMoKQorICAgICAgICBzZWxmLl9faHR0cC5lbmRoZWFkZXJzKCkKIAotICAgICMgV3JpdGUgcGF5bG9hZAotICAgIHNlbGYuX19odHRwLnNlbmQoZGF0YSkKKyAgICAgICAgIyBXcml0ZSBwYXlsb2FkCisgICAgICAgIHNlbGYuX19odHRwLnNlbmQoZGF0YSkKIAotICAgICMgR2V0IHJlcGx5IHRvIGZsdXNoIHRoZSByZXF1ZXN0Ci0gICAgc2VsZi5jb2RlLCBzZWxmLm1lc3NhZ2UsIHNlbGYuaGVhZGVycyA9IHNlbGYuX19odHRwLmdldHJlcGx5KCkKLQotICAjIERlY29yYXRlIGlmIHdlIGtub3cgaG93IHRvIHRpbWVvdXQKLSAgaWYgaGFzYXR0cihzb2NrZXQsICdnZXRkZWZhdWx0dGltZW91dCcpOgotICAgIGZsdXNoID0gX193aXRoVGltZW91dChmbHVzaCkKKyAgICAgICAgIyBHZXQgcmVwbHkgdG8gZmx1c2ggdGhlIHJlcXVlc3QKKyAgICAgICAgc2VsZi5fX2h0dHBfcmVzcG9uc2UgPSBzZWxmLl9faHR0cC5nZXRyZXNwb25zZSgpCisgICAgICAgIHNlbGYuY29kZSA9IHNlbGYuX19odHRwX3Jlc3BvbnNlLnN0YXR1cworICAgICAgICBzZWxmLm1lc3NhZ2UgPSBzZWxmLl9faHR0cF9yZXNwb25zZS5yZWFzb24KKyAgICAgICAgc2VsZi5oZWFkZXJzID0gc2VsZi5fX2h0dHBfcmVzcG9uc2UubXNnCmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL3RyYW5zcG9ydC9UU1NMU29ja2V0LnB5IGIvbGliL3B5L3NyYy90cmFuc3BvcnQvVFNTTFNvY2tldC5weQppbmRleCA4MWUwOTg0Li5iNTRjYTVkIDEwMDY0NAotLS0gYS9saWIvcHkvc3JjL3RyYW5zcG9ydC9UU1NMU29ja2V0LnB5CisrKyBiL2xpYi9weS9zcmMvdHJhbnNwb3J0L1RTU0xTb2NrZXQucHkKQEAgLTE3LDE5OCArMTcsMzgwIEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCitpbXBvcnQgbG9nZ2luZwogaW1wb3J0IG9zCiBpbXBvcnQgc29ja2V0CiBpbXBvcnQgc3NsCitpbXBvcnQgc3lzCitpbXBvcnQgd2FybmluZ3MKIAorZnJvbSAuc3NsY29tcGF0IGltcG9ydCBfbWF0Y2hfaG9zdG5hbWUsIF9tYXRjaF9oYXNfaXBhZGRyZXNzCiBmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRTb2NrZXQKIGZyb20gdGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0RXhjZXB0aW9uCiAKK2xvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQord2FybmluZ3MuZmlsdGVyd2FybmluZ3MoCisgICAgJ2RlZmF1bHQnLCBjYXRlZ29yeT1EZXByZWNhdGlvbldhcm5pbmcsIG1vZHVsZT1fX25hbWVfXykKIAotY2xhc3MgVFNTTFNvY2tldChUU29ja2V0LlRTb2NrZXQpOgotICAiIiIKLSAgU1NMIGltcGxlbWVudGF0aW9uIG9mIGNsaWVudC1zaWRlIFRTb2NrZXQKIAotICBUaGlzIGNsYXNzIGNyZWF0ZXMgb3V0Ym91bmQgc29ja2V0cyB3cmFwcGVkIHVzaW5nIHRoZQotICBweXRob24gc3RhbmRhcmQgc3NsIG1vZHVsZSBmb3IgZW5jcnlwdGVkIGNvbm5lY3Rpb25zLgorY2xhc3MgVFNTTEJhc2Uob2JqZWN0KToKKyAgICAjIFNTTENvbnRleHQgaXMgbm90IGF2YWlsYWJsZSBmb3IgUHl0aG9uIDwgMi43LjkKKyAgICBfaGFzX3NzbF9jb250ZXh0ID0gc3lzLmhleHZlcnNpb24gPj0gMHgwMjA3MDlGMAogCi0gIFRoZSBwcm90b2NvbCB1c2VkIGlzIHNldCB1c2luZyB0aGUgY2xhc3MgdmFyaWFibGUKLSAgU1NMX1ZFUlNJT04sIHdoaWNoIG11c3QgYmUgb25lIG9mIHNzbC5QUk9UT0NPTF8qIGFuZAotICBkZWZhdWx0cyB0byAgc3NsLlBST1RPQ09MX1RMU3YxIGZvciBncmVhdGVzdCBzZWN1cml0eS4KLSAgIiIiCi0gIFNTTF9WRVJTSU9OID0gc3NsLlBST1RPQ09MX1RMU3YxCisgICAgIyBjaXBoZXJzIGFyZ3VtZW50IGlzIG5vdCBhdmFpbGFibGUgZm9yIFB5dGhvbiA8IDIuNy4wCisgICAgX2hhc19jaXBoZXJzID0gc3lzLmhleHZlcnNpb24gPj0gMHgwMjA3MDBGMAogCi0gIGRlZiBfX2luaXRfXyhzZWxmLAotICAgICAgICAgICAgICAgaG9zdD0nbG9jYWxob3N0JywKLSAgICAgICAgICAgICAgIHBvcnQ9OTA5MCwKLSAgICAgICAgICAgICAgIHZhbGlkYXRlPVRydWUsCi0gICAgICAgICAgICAgICBjYV9jZXJ0cz1Ob25lLAotICAgICAgICAgICAgICAga2V5ZmlsZT1Ob25lLAotICAgICAgICAgICAgICAgY2VydGZpbGU9Tm9uZSwKLSAgICAgICAgICAgICAgIHVuaXhfc29ja2V0PU5vbmUpOgotICAgICIiIkNyZWF0ZSBTU0wgVFNvY2tldAorICAgICMgRm9yIHB5dGhvbiA+PSAyLjcuOSwgdXNlIGxhdGVzdCBUTFMgdGhhdCBib3RoIGNsaWVudCBhbmQgc2VydmVyCisgICAgIyBzdXBwb3J0cy4KKyAgICAjIFNTTCAyLjAgYW5kIDMuMCBhcmUgZGlzYWJsZWQgdmlhIHNzbC5PUF9OT19TU0x2MiBhbmQgc3NsLk9QX05PX1NTTHYzLgorICAgICMgRm9yIHB5dGhvbiA8IDIuNy45LCB1c2UgVExTIDEuMCBzaW5jZSBUTFN2MV9YIG5vciBPUF9OT19TU0x2WCBpcworICAgICMgdW5hdmFpbGFibGUuCisgICAgX2RlZmF1bHRfcHJvdG9jb2wgPSBzc2wuUFJPVE9DT0xfU1NMdjIzIGlmIF9oYXNfc3NsX2NvbnRleHQgZWxzZSBcCisgICAgICAgIHNzbC5QUk9UT0NPTF9UTFN2MQogCi0gICAgQHBhcmFtIHZhbGlkYXRlOiBTZXQgdG8gRmFsc2UgdG8gZGlzYWJsZSBTU0wgY2VydGlmaWNhdGUgdmFsaWRhdGlvbgotICAgIEB0eXBlIHZhbGlkYXRlOiBib29sCi0gICAgQHBhcmFtIGNhX2NlcnRzOiBGaWxlbmFtZSB0byB0aGUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IHBlbSBmaWxlLCBwb3NzaWJseSBhCi0gICAgZmlsZSBkb3dubG9hZGVkIGZyb206IGh0dHA6Ly9jdXJsLmhheHguc2UvY2EvY2FjZXJ0LnBlbSAgVGhpcyBpcyBwYXNzZWQgdG8KLSAgICB0aGUgc3NsX3dyYXAgZnVuY3Rpb24gYXMgdGhlICdjYV9jZXJ0cycgcGFyYW1ldGVyLgotICAgIEB0eXBlIGNhX2NlcnRzOiBzdHIKLSAgICBAcGFyYW0ga2V5ZmlsZTogVGhlIHByaXZhdGUga2V5Ci0gICAgQHR5cGUga2V5ZmlsZTogc3RyCi0gICAgQHBhcmFtIGNlcnRmaWxlOiBUaGUgY2VydCBmaWxlCi0gICAgQHR5cGUgY2VydGZpbGU6IHN0cgotICAgIAotICAgIFJhaXNlcyBhbiBJT0Vycm9yIGV4Y2VwdGlvbiBpZiB2YWxpZGF0ZSBpcyBUcnVlIGFuZCB0aGUgY2FfY2VydHMgZmlsZSBpcwotICAgIE5vbmUsIG5vdCBwcmVzZW50IG9yIHVucmVhZGFibGUuCisgICAgZGVmIF9pbml0X2NvbnRleHQoc2VsZiwgc3NsX3ZlcnNpb24pOgorICAgICAgICBpZiBzZWxmLl9oYXNfc3NsX2NvbnRleHQ6CisgICAgICAgICAgICBzZWxmLl9jb250ZXh0ID0gc3NsLlNTTENvbnRleHQoc3NsX3ZlcnNpb24pCisgICAgICAgICAgICBpZiBzZWxmLl9jb250ZXh0LnByb3RvY29sID09IHNzbC5QUk9UT0NPTF9TU0x2MjM6CisgICAgICAgICAgICAgICAgc2VsZi5fY29udGV4dC5vcHRpb25zIHw9IHNzbC5PUF9OT19TU0x2MgorICAgICAgICAgICAgICAgIHNlbGYuX2NvbnRleHQub3B0aW9ucyB8PSBzc2wuT1BfTk9fU1NMdjMKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX2NvbnRleHQgPSBOb25lCisgICAgICAgICAgICBzZWxmLl9zc2xfdmVyc2lvbiA9IHNzbF92ZXJzaW9uCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgX3Nob3VsZF92ZXJpZnkoc2VsZik6CisgICAgICAgIGlmIHNlbGYuX2hhc19zc2xfY29udGV4dDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9jb250ZXh0LnZlcmlmeV9tb2RlICE9IHNzbC5DRVJUX05PTkUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmNlcnRfcmVxcyAhPSBzc2wuQ0VSVF9OT05FCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgc3NsX3ZlcnNpb24oc2VsZik6CisgICAgICAgIGlmIHNlbGYuX2hhc19zc2xfY29udGV4dDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnNzbF9jb250ZXh0LnByb3RvY29sCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fc3NsX3ZlcnNpb24KKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBzc2xfY29udGV4dChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvbnRleHQKKworICAgIFNTTF9WRVJTSU9OID0gX2RlZmF1bHRfcHJvdG9jb2wKICAgICAiIiIKLSAgICBzZWxmLnZhbGlkYXRlID0gdmFsaWRhdGUKLSAgICBzZWxmLmlzX3ZhbGlkID0gRmFsc2UKLSAgICBzZWxmLnBlZXJjZXJ0ID0gTm9uZQotICAgIGlmIG5vdCB2YWxpZGF0ZToKLSAgICAgIHNlbGYuY2VydF9yZXFzID0gc3NsLkNFUlRfTk9ORQotICAgIGVsc2U6Ci0gICAgICBzZWxmLmNlcnRfcmVxcyA9IHNzbC5DRVJUX1JFUVVJUkVECi0gICAgc2VsZi5jYV9jZXJ0cyA9IGNhX2NlcnRzCi0gICAgc2VsZi5rZXlmaWxlID0ga2V5ZmlsZQotICAgIHNlbGYuY2VydGZpbGUgPSBjZXJ0ZmlsZQotICAgIGlmIHZhbGlkYXRlOgotICAgICAgaWYgY2FfY2VydHMgaXMgTm9uZSBvciBub3Qgb3MuYWNjZXNzKGNhX2NlcnRzLCBvcy5SX09LKToKLSAgICAgICAgcmFpc2UgSU9FcnJvcignQ2VydGlmaWNhdGUgQXV0aG9yaXR5IGNhX2NlcnRzIGZpbGUgIiVzIiAnCi0gICAgICAgICAgICAgICAgICAgICAgJ2lzIG5vdCByZWFkYWJsZSwgY2Fubm90IHZhbGlkYXRlIFNTTCAnCi0gICAgICAgICAgICAgICAgICAgICAgJ2NlcnRpZmljYXRlcy4nICUgKGNhX2NlcnRzKSkKLSAgICBUU29ja2V0LlRTb2NrZXQuX19pbml0X18oc2VsZiwgaG9zdCwgcG9ydCwgdW5peF9zb2NrZXQpCisgIERlZmF1bHQgU1NMIHZlcnNpb24uCisgIEZvciBiYWNrd29yZCBjb21wYXRpYmlsaXR5LCBpdCBjYW4gYmUgbW9kaWZpZWQuCisgIFVzZSBfX2luaXRfXyBrZXl3b2FyZCBhcmd1bWVudCAic3NsX3ZlcnNpb24iIGluc3RlYWQuCisgICIiIgogCi0gIGRlZiBvcGVuKHNlbGYpOgotICAgIHRyeToKLSAgICAgIHJlczAgPSBzZWxmLl9yZXNvbHZlQWRkcigpCi0gICAgICBmb3IgcmVzIGluIHJlczA6Ci0gICAgICAgIHNvY2tfZmFtaWx5LCBzb2NrX3R5cGUgPSByZXNbMDoyXQotICAgICAgICBpcF9wb3J0ID0gcmVzWzRdCi0gICAgICAgIHBsYWluX3NvY2sgPSBzb2NrZXQuc29ja2V0KHNvY2tfZmFtaWx5LCBzb2NrX3R5cGUpCi0gICAgICAgIHNlbGYuaGFuZGxlID0gc3NsLndyYXBfc29ja2V0KHBsYWluX3NvY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzbF92ZXJzaW9uPXNlbGYuU1NMX1ZFUlNJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvX2hhbmRzaGFrZV9vbl9jb25uZWN0PVRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhX2NlcnRzPXNlbGYuY2FfY2VydHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleWZpbGU9c2VsZi5rZXlmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0ZmlsZT1zZWxmLmNlcnRmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0X3JlcXM9c2VsZi5jZXJ0X3JlcXMpCi0gICAgICAgIHNlbGYuaGFuZGxlLnNldHRpbWVvdXQoc2VsZi5fdGltZW91dCkKKyAgICBkZWYgX2RlcHJlY2F0ZWRfYXJnKHNlbGYsIGFyZ3MsIGt3YXJncywgcG9zLCBrZXkpOgorICAgICAgICBpZiBsZW4oYXJncykgPD0gcG9zOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHJlYWxfcG9zID0gcG9zICsgMworICAgICAgICB3YXJuaW5ncy53YXJuKAorICAgICAgICAgICAgJyVkdGggcG9zaXRpb25hbCBhcmd1bWVudCBpcyBkZXByZWNhdGVkLicKKyAgICAgICAgICAgICdwbGVhc2UgdXNlIGtleXdhcmQgYXJndW1lbnQgaW5zdGVhbmQuJworICAgICAgICAgICAgJSByZWFsX3BvcywgRGVwcmVjYXRpb25XYXJuaW5nLCBzdGFja2xldmVsPTMpCisKKyAgICAgICAgaWYga2V5IGluIGt3YXJnczoKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigKKyAgICAgICAgICAgICAgICAnRHVwbGljYXRlIGFyZ3VtZW50OiAlZHRoIGFyZ3VtZW50IGFuZCAlcyBrZXl3YXJkIGFyZ3VtZW50LicKKyAgICAgICAgICAgICAgICAlIChyZWFsX3Bvcywga2V5KSkKKyAgICAgICAga3dhcmdzW2tleV0gPSBhcmdzW3Bvc10KKworICAgIGRlZiBfdW5peF9zb2NrZXRfYXJnKHNlbGYsIGhvc3QsIHBvcnQsIGFyZ3MsIGt3YXJncyk6CisgICAgICAgIGtleSA9ICd1bml4X3NvY2tldCcKKyAgICAgICAgaWYgaG9zdCBpcyBOb25lIGFuZCBwb3J0IGlzIE5vbmUgYW5kIGxlbihhcmdzKSA9PSAxIGFuZCBrZXkgbm90IGluIGt3YXJnczoKKyAgICAgICAgICAgIGt3YXJnc1trZXldID0gYXJnc1swXQorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwga2V5KToKKyAgICAgICAgaWYga2V5ID09ICdTU0xfVkVSU0lPTic6CisgICAgICAgICAgICB3YXJuaW5ncy53YXJuKAorICAgICAgICAgICAgICAgICdTU0xfVkVSU0lPTiBpcyBkZXByZWNhdGVkLicKKyAgICAgICAgICAgICAgICAncGxlYXNlIHVzZSBzc2xfdmVyc2lvbiBhdHRyaWJ1dGUgaW5zdGVhZC4nLAorICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgc3RhY2tsZXZlbD0yKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYuc3NsX3ZlcnNpb24KKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzZXJ2ZXJfc2lkZSwgaG9zdCwgc3NsX29wdHMpOgorICAgICAgICBzZWxmLl9zZXJ2ZXJfc2lkZSA9IHNlcnZlcl9zaWRlCisgICAgICAgIGlmIFRTU0xCYXNlLlNTTF9WRVJTSU9OICE9IHNlbGYuX2RlZmF1bHRfcHJvdG9jb2w6CisgICAgICAgICAgICB3YXJuaW5ncy53YXJuKAorICAgICAgICAgICAgICAgICdTU0xfVkVSU0lPTiBpcyBkZXByZWNhdGVkLicKKyAgICAgICAgICAgICAgICAncGxlYXNlIHVzZSBzc2xfdmVyc2lvbiBrZXl3YXJkIGFyZ3VtZW50IGluc3RlYWQuJywKKyAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIHN0YWNrbGV2ZWw9MikKKyAgICAgICAgc2VsZi5fY29udGV4dCA9IHNzbF9vcHRzLnBvcCgnc3NsX2NvbnRleHQnLCBOb25lKQorICAgICAgICBzZWxmLl9zZXJ2ZXJfaG9zdG5hbWUgPSBOb25lCisgICAgICAgIGlmIG5vdCBzZWxmLl9zZXJ2ZXJfc2lkZToKKyAgICAgICAgICAgIHNlbGYuX3NlcnZlcl9ob3N0bmFtZSA9IHNzbF9vcHRzLnBvcCgnc2VydmVyX2hvc3RuYW1lJywgaG9zdCkKKyAgICAgICAgaWYgc2VsZi5fY29udGV4dDoKKyAgICAgICAgICAgIHNlbGYuX2N1c3RvbV9jb250ZXh0ID0gVHJ1ZQorICAgICAgICAgICAgaWYgc3NsX29wdHM6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKKyAgICAgICAgICAgICAgICAgICAgJ0luY29tcGF0aWJsZSBhcmd1bWVudHM6IHNzbF9jb250ZXh0IGFuZCAlcycKKyAgICAgICAgICAgICAgICAgICAgJSAnICcuam9pbihzc2xfb3B0cy5rZXlzKCkpKQorICAgICAgICAgICAgaWYgbm90IHNlbGYuX2hhc19zc2xfY29udGV4dDoKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAorICAgICAgICAgICAgICAgICAgICAnc3NsX2NvbnRleHQgaXMgbm90IGF2YWlsYWJsZSBmb3IgdGhpcyB2ZXJzaW9uIG9mIFB5dGhvbicpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9jdXN0b21fY29udGV4dCA9IEZhbHNlCisgICAgICAgICAgICBzc2xfdmVyc2lvbiA9IHNzbF9vcHRzLnBvcCgnc3NsX3ZlcnNpb24nLCBUU1NMQmFzZS5TU0xfVkVSU0lPTikKKyAgICAgICAgICAgIHNlbGYuX2luaXRfY29udGV4dChzc2xfdmVyc2lvbikKKyAgICAgICAgICAgIHNlbGYuY2VydF9yZXFzID0gc3NsX29wdHMucG9wKCdjZXJ0X3JlcXMnLCBzc2wuQ0VSVF9SRVFVSVJFRCkKKyAgICAgICAgICAgIHNlbGYuY2FfY2VydHMgPSBzc2xfb3B0cy5wb3AoJ2NhX2NlcnRzJywgTm9uZSkKKyAgICAgICAgICAgIHNlbGYua2V5ZmlsZSA9IHNzbF9vcHRzLnBvcCgna2V5ZmlsZScsIE5vbmUpCisgICAgICAgICAgICBzZWxmLmNlcnRmaWxlID0gc3NsX29wdHMucG9wKCdjZXJ0ZmlsZScsIE5vbmUpCisgICAgICAgICAgICBzZWxmLmNpcGhlcnMgPSBzc2xfb3B0cy5wb3AoJ2NpcGhlcnMnLCBOb25lKQorCisgICAgICAgICAgICBpZiBzc2xfb3B0czoKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAorICAgICAgICAgICAgICAgICAgICAnVW5rbm93biBrZXl3b3JkIGFyZ3VtZW50czogJywgJyAnLmpvaW4oc3NsX29wdHMua2V5cygpKSkKKworICAgICAgICAgICAgaWYgc2VsZi5fc2hvdWxkX3ZlcmlmeToKKyAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5jYV9jZXJ0czoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKKyAgICAgICAgICAgICAgICAgICAgICAgICdjYV9jZXJ0cyBpcyBuZWVkZWQgd2hlbiBjZXJ0X3JlcXMgaXMgbm90IHNzbC5DRVJUX05PTkUnKQorICAgICAgICAgICAgICAgIGlmIG5vdCBvcy5hY2Nlc3Moc2VsZi5jYV9jZXJ0cywgb3MuUl9PSyk6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoJ0NlcnRpZmljYXRlIEF1dGhvcml0eSBjYV9jZXJ0cyBmaWxlICIlcyIgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpcyBub3QgcmVhZGFibGUsIGNhbm5vdCB2YWxpZGF0ZSBTU0wgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjZXJ0aWZpY2F0ZXMuJyAlIChzZWxmLmNhX2NlcnRzKSkKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBjZXJ0ZmlsZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NlcnRmaWxlCisKKyAgICBAY2VydGZpbGUuc2V0dGVyCisgICAgZGVmIGNlcnRmaWxlKHNlbGYsIGNlcnRmaWxlKToKKyAgICAgICAgaWYgc2VsZi5fc2VydmVyX3NpZGUgYW5kIG5vdCBjZXJ0ZmlsZToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ2NlcnRmaWxlIGlzIG5lZWRlZCBmb3Igc2VydmVyLXNpZGUnKQorICAgICAgICBpZiBjZXJ0ZmlsZSBhbmQgbm90IG9zLmFjY2VzcyhjZXJ0ZmlsZSwgb3MuUl9PSyk6CisgICAgICAgICAgICByYWlzZSBJT0Vycm9yKCdObyBzdWNoIGNlcnRmaWxlIGZvdW5kOiAlcycgJSAoY2VydGZpbGUpKQorICAgICAgICBzZWxmLl9jZXJ0ZmlsZSA9IGNlcnRmaWxlCisKKyAgICBkZWYgX3dyYXBfc29ja2V0KHNlbGYsIHNvY2spOgorICAgICAgICBpZiBzZWxmLl9oYXNfc3NsX2NvbnRleHQ6CisgICAgICAgICAgICBpZiBub3Qgc2VsZi5fY3VzdG9tX2NvbnRleHQ6CisgICAgICAgICAgICAgICAgc2VsZi5zc2xfY29udGV4dC52ZXJpZnlfbW9kZSA9IHNlbGYuY2VydF9yZXFzCisgICAgICAgICAgICAgICAgaWYgc2VsZi5jZXJ0ZmlsZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zc2xfY29udGV4dC5sb2FkX2NlcnRfY2hhaW4oc2VsZi5jZXJ0ZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5rZXlmaWxlKQorICAgICAgICAgICAgICAgIGlmIHNlbGYuY2lwaGVyczoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zc2xfY29udGV4dC5zZXRfY2lwaGVycyhzZWxmLmNpcGhlcnMpCisgICAgICAgICAgICAgICAgaWYgc2VsZi5jYV9jZXJ0czoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zc2xfY29udGV4dC5sb2FkX3ZlcmlmeV9sb2NhdGlvbnMoc2VsZi5jYV9jZXJ0cykKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnNzbF9jb250ZXh0LndyYXBfc29ja2V0KAorICAgICAgICAgICAgICAgIHNvY2ssIHNlcnZlcl9zaWRlPXNlbGYuX3NlcnZlcl9zaWRlLAorICAgICAgICAgICAgICAgIHNlcnZlcl9ob3N0bmFtZT1zZWxmLl9zZXJ2ZXJfaG9zdG5hbWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzc2xfb3B0cyA9IHsKKyAgICAgICAgICAgICAgICAnc3NsX3ZlcnNpb24nOiBzZWxmLl9zc2xfdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAnc2VydmVyX3NpZGUnOiBzZWxmLl9zZXJ2ZXJfc2lkZSwKKyAgICAgICAgICAgICAgICAnY2FfY2VydHMnOiBzZWxmLmNhX2NlcnRzLAorICAgICAgICAgICAgICAgICdrZXlmaWxlJzogc2VsZi5rZXlmaWxlLAorICAgICAgICAgICAgICAgICdjZXJ0ZmlsZSc6IHNlbGYuY2VydGZpbGUsCisgICAgICAgICAgICAgICAgJ2NlcnRfcmVxcyc6IHNlbGYuY2VydF9yZXFzLAorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgc2VsZi5jaXBoZXJzOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuX2hhc19jaXBoZXJzOgorICAgICAgICAgICAgICAgICAgICBzc2xfb3B0c1snY2lwaGVycyddID0gc2VsZi5jaXBoZXJzCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoCisgICAgICAgICAgICAgICAgICAgICAgICAnY2lwaGVycyBpcyBzcGVjaWZpZWQgYnV0IGlnbm9yZWQgZHVlIHRvIG9sZCBQeXRob24gdmVyc2lvbicpCisgICAgICAgICAgICByZXR1cm4gc3NsLndyYXBfc29ja2V0KHNvY2ssICoqc3NsX29wdHMpCisKKworY2xhc3MgVFNTTFNvY2tldChUU29ja2V0LlRTb2NrZXQsIFRTU0xCYXNlKToKKyAgICAiIiIKKyAgICBTU0wgaW1wbGVtZW50YXRpb24gb2YgVFNvY2tldAorCisgICAgVGhpcyBjbGFzcyBjcmVhdGVzIG91dGJvdW5kIHNvY2tldHMgd3JhcHBlZCB1c2luZyB0aGUKKyAgICBweXRob24gc3RhbmRhcmQgc3NsIG1vZHVsZSBmb3IgZW5jcnlwdGVkIGNvbm5lY3Rpb25zLgorICAgICIiIgorCisgICAgIyBOZXcgc2lnbmF0dXJlCisgICAgIyBkZWYgX19pbml0X18oc2VsZiwgaG9zdD0nbG9jYWxob3N0JywgcG9ydD05MDkwLCB1bml4X3NvY2tldD1Ob25lLAorICAgICMgICAgICAgICAgICAgICoqc3NsX2FyZ3MpOgorICAgICMgRGVwcmVjYXRlZCBzaWduYXR1cmUKKyAgICAjIGRlZiBfX2luaXRfXyhzZWxmLCBob3N0PSdsb2NhbGhvc3QnLCBwb3J0PTkwOTAsIHZhbGlkYXRlPVRydWUsCisgICAgIyAgICAgICAgICAgICAgY2FfY2VydHM9Tm9uZSwga2V5ZmlsZT1Ob25lLCBjZXJ0ZmlsZT1Ob25lLAorICAgICMgICAgICAgICAgICAgIHVuaXhfc29ja2V0PU5vbmUsIGNpcGhlcnM9Tm9uZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGhvc3Q9J2xvY2FsaG9zdCcsIHBvcnQ9OTA5MCwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgIiIiUG9zaXRpb25hbCBhcmd1bWVudHM6IGBgaG9zdGBgLCBgYHBvcnRgYCwgYGB1bml4X3NvY2tldGBgCisKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudHM6IGBga2V5ZmlsZWBgLCBgYGNlcnRmaWxlYGAsIGBgY2VydF9yZXFzYGAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBgYHNzbF92ZXJzaW9uYGAsIGBgY2FfY2VydHNgYCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGBgY2lwaGVyc2BgIChQeXRob24gMi43LjAgb3IgbGF0ZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYGBzZXJ2ZXJfaG9zdG5hbWVgYCAoUHl0aG9uIDIuNy45IG9yIGxhdGVyKQorICAgICAgICBQYXNzZWQgdG8gc3NsLndyYXBfc29ja2V0LiBTZWUgc3NsLndyYXBfc29ja2V0IGRvY3VtZW50YXRpb24uCisKKyAgICAgICAgQWx0ZXJuYXRpdmUga2V5d29yZCBhcmd1bWVudHM6IChQeXRob24gMi43Ljkgb3IgbGF0ZXIpCisgICAgICAgICAgYGBzc2xfY29udGV4dGBgOiBzc2wuU1NMQ29udGV4dCB0byBiZSB1c2VkIGZvciBTU0xDb250ZXh0LndyYXBfc29ja2V0CisgICAgICAgICAgYGBzZXJ2ZXJfaG9zdG5hbWVgYDogUGFzc2VkIHRvIFNTTENvbnRleHQud3JhcF9zb2NrZXQKKworICAgICAgICBDb21tb24ga2V5d29yZCBhcmd1bWVudDoKKyAgICAgICAgICBgYHZhbGlkYXRlX2NhbGxiYWNrYGAgKGNlcnQsIGhvc3RuYW1lKSAtPiBOb25lOgorICAgICAgICAgICAgICBDYWxsZWQgYWZ0ZXIgU1NMIGhhbmRzaGFrZS4gQ2FuIHJhaXNlIHdoZW4gaG9zdG5hbWUgZG9lcyBub3QKKyAgICAgICAgICAgICAgbWF0Y2ggdGhlIGNlcnQuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmlzX3ZhbGlkID0gRmFsc2UKKyAgICAgICAgc2VsZi5wZWVyY2VydCA9IE5vbmUKKworICAgICAgICBpZiBhcmdzOgorICAgICAgICAgICAgaWYgbGVuKGFyZ3MpID4gNjoKKyAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ1RvbyBtYW55IHBvc2l0aW9uYWwgYXJndW1lbnQnKQorICAgICAgICAgICAgaWYgbm90IHNlbGYuX3VuaXhfc29ja2V0X2FyZyhob3N0LCBwb3J0LCBhcmdzLCBrd2FyZ3MpOgorICAgICAgICAgICAgICAgIHNlbGYuX2RlcHJlY2F0ZWRfYXJnKGFyZ3MsIGt3YXJncywgMCwgJ3ZhbGlkYXRlJykKKyAgICAgICAgICAgIHNlbGYuX2RlcHJlY2F0ZWRfYXJnKGFyZ3MsIGt3YXJncywgMSwgJ2NhX2NlcnRzJykKKyAgICAgICAgICAgIHNlbGYuX2RlcHJlY2F0ZWRfYXJnKGFyZ3MsIGt3YXJncywgMiwgJ2tleWZpbGUnKQorICAgICAgICAgICAgc2VsZi5fZGVwcmVjYXRlZF9hcmcoYXJncywga3dhcmdzLCAzLCAnY2VydGZpbGUnKQorICAgICAgICAgICAgc2VsZi5fZGVwcmVjYXRlZF9hcmcoYXJncywga3dhcmdzLCA0LCAndW5peF9zb2NrZXQnKQorICAgICAgICAgICAgc2VsZi5fZGVwcmVjYXRlZF9hcmcoYXJncywga3dhcmdzLCA1LCAnY2lwaGVycycpCisKKyAgICAgICAgdmFsaWRhdGUgPSBrd2FyZ3MucG9wKCd2YWxpZGF0ZScsIE5vbmUpCisgICAgICAgIGlmIHZhbGlkYXRlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgY2VydF9yZXFzX25hbWUgPSAnQ0VSVF9SRVFVSVJFRCcgaWYgdmFsaWRhdGUgZWxzZSAnQ0VSVF9OT05FJworICAgICAgICAgICAgd2FybmluZ3Mud2FybigKKyAgICAgICAgICAgICAgICAndmFsaWRhdGUgaXMgZGVwcmVjYXRlZC4gcGxlYXNlIHVzZSBjZXJ0X3JlcXM9c3NsLiVzIGluc3RlYWQnCisgICAgICAgICAgICAgICAgJSBjZXJ0X3JlcXNfbmFtZSwKKyAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIHN0YWNrbGV2ZWw9MikKKyAgICAgICAgICAgIGlmICdjZXJ0X3JlcXMnIGluIGt3YXJnczoKKyAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ0Nhbm5vdCBzcGVjaWZ5IGJvdGggdmFsaWRhdGUgYW5kIGNlcnRfcmVxcycpCisgICAgICAgICAgICBrd2FyZ3NbJ2NlcnRfcmVxcyddID0gc3NsLkNFUlRfUkVRVUlSRUQgaWYgdmFsaWRhdGUgZWxzZSBzc2wuQ0VSVF9OT05FCisKKyAgICAgICAgdW5peF9zb2NrZXQgPSBrd2FyZ3MucG9wKCd1bml4X3NvY2tldCcsIE5vbmUpCisgICAgICAgIHNlbGYuX3ZhbGlkYXRlX2NhbGxiYWNrID0ga3dhcmdzLnBvcCgndmFsaWRhdGVfY2FsbGJhY2snLCBfbWF0Y2hfaG9zdG5hbWUpCisgICAgICAgIFRTU0xCYXNlLl9faW5pdF9fKHNlbGYsIEZhbHNlLCBob3N0LCBrd2FyZ3MpCisgICAgICAgIFRTb2NrZXQuVFNvY2tldC5fX2luaXRfXyhzZWxmLCBob3N0LCBwb3J0LCB1bml4X3NvY2tldCkKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiB2YWxpZGF0ZShzZWxmKToKKyAgICAgICAgd2FybmluZ3Mud2FybigndmFsaWRhdGUgaXMgZGVwcmVjYXRlZC4gcGxlYXNlIHVzZSBjZXJ0X3JlcXMgaW5zdGVhZCcsCisgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCBzdGFja2xldmVsPTIpCisgICAgICAgIHJldHVybiBzZWxmLmNlcnRfcmVxcyAhPSBzc2wuQ0VSVF9OT05FCisKKyAgICBAdmFsaWRhdGUuc2V0dGVyCisgICAgZGVmIHZhbGlkYXRlKHNlbGYsIHZhbHVlKToKKyAgICAgICAgd2FybmluZ3Mud2FybigndmFsaWRhdGUgaXMgZGVwcmVjYXRlZC4gcGxlYXNlIHVzZSBjZXJ0X3JlcXMgaW5zdGVhZCcsCisgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCBzdGFja2xldmVsPTIpCisgICAgICAgIHNlbGYuY2VydF9yZXFzID0gc3NsLkNFUlRfUkVRVUlSRUQgaWYgdmFsdWUgZWxzZSBzc2wuQ0VSVF9OT05FCisKKyAgICBkZWYgX2RvX29wZW4oc2VsZiwgZmFtaWx5LCBzb2NrdHlwZSk6CisgICAgICAgIHBsYWluX3NvY2sgPSBzb2NrZXQuc29ja2V0KGZhbWlseSwgc29ja3R5cGUpCiAgICAgICAgIHRyeToKLSAgICAgICAgICBzZWxmLmhhbmRsZS5jb25uZWN0KGlwX3BvcnQpCi0gICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3IsIGU6Ci0gICAgICAgICAgaWYgcmVzIGlzIG5vdCByZXMwWy0xXToKLSAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHJhaXNlIGUKLSAgICAgICAgYnJlYWsKLSAgICBleGNlcHQgc29ja2V0LmVycm9yLCBlOgotICAgICAgaWYgc2VsZi5fdW5peF9zb2NrZXQ6Ci0gICAgICAgIG1lc3NhZ2UgPSAnQ291bGQgbm90IGNvbm5lY3QgdG8gc2VjdXJlIHNvY2tldCAlczogJXMnIFwKLSAgICAgICAgICAgICAgICAlIChzZWxmLl91bml4X3NvY2tldCwgZSkKLSAgICAgIGVsc2U6Ci0gICAgICAgIG1lc3NhZ2UgPSAnQ291bGQgbm90IGNvbm5lY3QgdG8gJXM6JWQ6ICVzJyAlIChzZWxmLmhvc3QsIHNlbGYucG9ydCwgZSkKLSAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24odHlwZT1UVHJhbnNwb3J0RXhjZXB0aW9uLk5PVF9PUEVOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlPW1lc3NhZ2UpCi0gICAgaWYgc2VsZi52YWxpZGF0ZToKLSAgICAgIHNlbGYuX3ZhbGlkYXRlX2NlcnQoKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3dyYXBfc29ja2V0KHBsYWluX3NvY2spCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgICAgICBwbGFpbl9zb2NrLmNsb3NlKCkKKyAgICAgICAgICAgIG1zZyA9ICdmYWlsZWQgdG8gaW5pdGlhbGl6ZSBTU0wnCisgICAgICAgICAgICBsb2dnZXIuZXhjZXB0aW9uKG1zZykKKyAgICAgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwgbXNnKQogCi0gIGRlZiBfdmFsaWRhdGVfY2VydChzZWxmKToKLSAgICAiIiJpbnRlcm5hbCBtZXRob2QgdG8gdmFsaWRhdGUgdGhlIHBlZXIncyBTU0wgY2VydGlmaWNhdGUsIGFuZCB0byBjaGVjayB0aGUKLSAgICBjb21tb25OYW1lIG9mIHRoZSBjZXJ0aWZpY2F0ZSB0byBlbnN1cmUgaXQgbWF0Y2hlcyB0aGUgaG9zdG5hbWUgd2UKLSAgICB1c2VkIHRvIG1ha2UgdGhpcyBjb25uZWN0aW9uLiAgRG9lcyBub3Qgc3VwcG9ydCBzdWJqZWN0QWx0TmFtZSByZWNvcmRzCi0gICAgaW4gY2VydGlmaWNhdGVzLgorICAgIGRlZiBvcGVuKHNlbGYpOgorICAgICAgICBzdXBlcihUU1NMU29ja2V0LCBzZWxmKS5vcGVuKCkKKyAgICAgICAgaWYgc2VsZi5fc2hvdWxkX3ZlcmlmeToKKyAgICAgICAgICAgIHNlbGYucGVlcmNlcnQgPSBzZWxmLmhhbmRsZS5nZXRwZWVyY2VydCgpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5fdmFsaWRhdGVfY2FsbGJhY2soc2VsZi5wZWVyY2VydCwgc2VsZi5fc2VydmVyX2hvc3RuYW1lKQorICAgICAgICAgICAgICAgIHNlbGYuaXNfdmFsaWQgPSBUcnVlCisgICAgICAgICAgICBleGNlcHQgVFRyYW5zcG9ydEV4Y2VwdGlvbjoKKyAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBleDoKKyAgICAgICAgICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uVU5LTk9XTiwgc3RyKGV4KSkKIAotICAgIHJhaXNlcyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIHRoZSBjZXJ0aWZpY2F0ZSBmYWlscyB2YWxpZGF0aW9uLgorCitjbGFzcyBUU1NMU2VydmVyU29ja2V0KFRTb2NrZXQuVFNlcnZlclNvY2tldCwgVFNTTEJhc2UpOgorICAgICIiIlNTTCBpbXBsZW1lbnRhdGlvbiBvZiBUU2VydmVyU29ja2V0CisKKyAgICBUaGlzIHVzZXMgdGhlIHNzbCBtb2R1bGUncyB3cmFwX3NvY2tldCgpIG1ldGhvZCB0byBwcm92aWRlIFNTTAorICAgIG5lZ290aWF0ZWQgZW5jcnlwdGlvbi4KICAgICAiIiIKLSAgICBjZXJ0ID0gc2VsZi5oYW5kbGUuZ2V0cGVlcmNlcnQoKQotICAgIHNlbGYucGVlcmNlcnQgPSBjZXJ0Ci0gICAgaWYgJ3N1YmplY3QnIG5vdCBpbiBjZXJ0OgotICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbigKLSAgICAgICAgdHlwZT1UVHJhbnNwb3J0RXhjZXB0aW9uLk5PVF9PUEVOLAotICAgICAgICBtZXNzYWdlPSdObyBTU0wgY2VydGlmaWNhdGUgZm91bmQgZnJvbSAlczolcycgJSAoc2VsZi5ob3N0LCBzZWxmLnBvcnQpKQotICAgIGZpZWxkcyA9IGNlcnRbJ3N1YmplY3QnXQotICAgIGZvciBmaWVsZCBpbiBmaWVsZHM6Ci0gICAgICAjIGVuc3VyZSBzdHJ1Y3R1cmUgd2UgZ2V0IGJhY2sgaXMgd2hhdCB3ZSBleHBlY3QKLSAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGZpZWxkLCB0dXBsZSk6Ci0gICAgICAgIGNvbnRpbnVlCi0gICAgICBjZXJ0X3BhaXIgPSBmaWVsZFswXQotICAgICAgaWYgbGVuKGNlcnRfcGFpcikgPCAyOgotICAgICAgICBjb250aW51ZQotICAgICAgY2VydF9rZXksIGNlcnRfdmFsdWUgPSBjZXJ0X3BhaXJbMDoyXQotICAgICAgaWYgY2VydF9rZXkgIT0gJ2NvbW1vbk5hbWUnOgotICAgICAgICBjb250aW51ZQotICAgICAgY2VydGhvc3QgPSBjZXJ0X3ZhbHVlCi0gICAgICAjIHRoaXMgY2hlY2sgc2hvdWxkIGJlIHBlcmZvcm1lZCBieSBzb21lIHNvcnQgb2YgQWNjZXNzIE1hbmFnZXIKLSAgICAgIGlmIGNlcnRob3N0ID09IHNlbGYuaG9zdDoKLSAgICAgICAgIyBzdWNjZXNzLCBjZXJ0IGNvbW1vbk5hbWUgbWF0Y2hlcyBkZXNpcmVkIGhvc3RuYW1lCi0gICAgICAgIHNlbGYuaXNfdmFsaWQgPSBUcnVlCi0gICAgICAgIHJldHVybgotICAgICAgZWxzZToKLSAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbigKLSAgICAgICAgICB0eXBlPVRUcmFuc3BvcnRFeGNlcHRpb24uVU5LTk9XTiwKLSAgICAgICAgICBtZXNzYWdlPSdIb3N0bmFtZSB3ZSBjb25uZWN0ZWQgdG8gIiVzIiBkb2VzblwndCBtYXRjaCBjZXJ0aWZpY2F0ZSAnCi0gICAgICAgICAgICAgICAgICAncHJvdmlkZWQgY29tbW9uTmFtZSAiJXMiJyAlIChzZWxmLmhvc3QsIGNlcnRob3N0KSkKLSAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uKAotICAgICAgdHlwZT1UVHJhbnNwb3J0RXhjZXB0aW9uLlVOS05PV04sCi0gICAgICBtZXNzYWdlPSdDb3VsZCBub3QgdmFsaWRhdGUgU1NMIGNlcnRpZmljYXRlIGZyb20gJwotICAgICAgICAgICAgICAnaG9zdCAiJXMiLiAgQ2VydD0lcycgJSAoc2VsZi5ob3N0LCBjZXJ0KSkKIAorICAgICMgTmV3IHNpZ25hdHVyZQorICAgICMgZGVmIF9faW5pdF9fKHNlbGYsIGhvc3Q9J2xvY2FsaG9zdCcsIHBvcnQ9OTA5MCwgdW5peF9zb2NrZXQ9Tm9uZSwgKipzc2xfYXJncyk6CisgICAgIyBEZXByZWNhdGVkIHNpZ25hdHVyZQorICAgICMgZGVmIF9faW5pdF9fKHNlbGYsIGhvc3Q9Tm9uZSwgcG9ydD05MDkwLCBjZXJ0ZmlsZT0nY2VydC5wZW0nLCB1bml4X3NvY2tldD1Ob25lLCBjaXBoZXJzPU5vbmUpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBob3N0PU5vbmUsIHBvcnQ9OTA5MCwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgIiIiUG9zaXRpb25hbCBhcmd1bWVudHM6IGBgaG9zdGBgLCBgYHBvcnRgYCwgYGB1bml4X3NvY2tldGBgCiAKLWNsYXNzIFRTU0xTZXJ2ZXJTb2NrZXQoVFNvY2tldC5UU2VydmVyU29ja2V0KToKLSAgIiIiU1NMIGltcGxlbWVudGF0aW9uIG9mIFRTZXJ2ZXJTb2NrZXQKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudHM6IGBga2V5ZmlsZWBgLCBgYGNlcnRmaWxlYGAsIGBgY2VydF9yZXFzYGAsIGBgc3NsX3ZlcnNpb25gYCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGBgY2FfY2VydHNgYCwgYGBjaXBoZXJzYGAgKFB5dGhvbiAyLjcuMCBvciBsYXRlcikKKyAgICAgICAgU2VlIHNzbC53cmFwX3NvY2tldCBkb2N1bWVudGF0aW9uLgogCi0gIFRoaXMgdXNlcyB0aGUgc3NsIG1vZHVsZSdzIHdyYXBfc29ja2V0KCkgbWV0aG9kIHRvIHByb3ZpZGUgU1NMCi0gIG5lZ290aWF0ZWQgZW5jcnlwdGlvbi4KLSAgIiIiCi0gIFNTTF9WRVJTSU9OID0gc3NsLlBST1RPQ09MX1RMU3YxCisgICAgICAgIEFsdGVybmF0aXZlIGtleXdvcmQgYXJndW1lbnRzOiAoUHl0aG9uIDIuNy45IG9yIGxhdGVyKQorICAgICAgICAgIGBgc3NsX2NvbnRleHRgYDogc3NsLlNTTENvbnRleHQgdG8gYmUgdXNlZCBmb3IgU1NMQ29udGV4dC53cmFwX3NvY2tldAorICAgICAgICAgIGBgc2VydmVyX2hvc3RuYW1lYGA6IFBhc3NlZCB0byBTU0xDb250ZXh0LndyYXBfc29ja2V0CiAKLSAgZGVmIF9faW5pdF9fKHNlbGYsCi0gICAgICAgICAgICAgICBob3N0PU5vbmUsCi0gICAgICAgICAgICAgICBwb3J0PTkwOTAsCi0gICAgICAgICAgICAgICBjZXJ0ZmlsZT0nY2VydC5wZW0nLAotICAgICAgICAgICAgICAgdW5peF9zb2NrZXQ9Tm9uZSk6Ci0gICAgIiIiSW5pdGlhbGl6ZSBhIFRTU0xTZXJ2ZXJTb2NrZXQKKyAgICAgICAgQ29tbW9uIGtleXdvcmQgYXJndW1lbnQ6CisgICAgICAgICAgYGB2YWxpZGF0ZV9jYWxsYmFja2BgIChjZXJ0LCBob3N0bmFtZSkgLT4gTm9uZToKKyAgICAgICAgICAgICAgQ2FsbGVkIGFmdGVyIFNTTCBoYW5kc2hha2UuIENhbiByYWlzZSB3aGVuIGhvc3RuYW1lIGRvZXMgbm90CisgICAgICAgICAgICAgIG1hdGNoIHRoZSBjZXJ0LgorICAgICAgICAiIiIKKyAgICAgICAgaWYgYXJnczoKKyAgICAgICAgICAgIGlmIGxlbihhcmdzKSA+IDM6CisgICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdUb28gbWFueSBwb3NpdGlvbmFsIGFyZ3VtZW50JykKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLl91bml4X3NvY2tldF9hcmcoaG9zdCwgcG9ydCwgYXJncywga3dhcmdzKToKKyAgICAgICAgICAgICAgICBzZWxmLl9kZXByZWNhdGVkX2FyZyhhcmdzLCBrd2FyZ3MsIDAsICdjZXJ0ZmlsZScpCisgICAgICAgICAgICBzZWxmLl9kZXByZWNhdGVkX2FyZyhhcmdzLCBrd2FyZ3MsIDEsICd1bml4X3NvY2tldCcpCisgICAgICAgICAgICBzZWxmLl9kZXByZWNhdGVkX2FyZyhhcmdzLCBrd2FyZ3MsIDIsICdjaXBoZXJzJykKIAotICAgIEBwYXJhbSBjZXJ0ZmlsZTogZmlsZW5hbWUgb2YgdGhlIHNlcnZlciBjZXJ0aWZpY2F0ZSwgZGVmYXVsdHMgdG8gY2VydC5wZW0KLSAgICBAdHlwZSBjZXJ0ZmlsZTogc3RyCi0gICAgQHBhcmFtIGhvc3Q6IFRoZSBob3N0bmFtZSBvciBJUCB0byBiaW5kIHRoZSBsaXN0ZW4gc29ja2V0IHRvLAotICAgICAgICAgICAgICAgICBpLmUuICdsb2NhbGhvc3QnIGZvciBvbmx5IGFsbG93aW5nIGxvY2FsIG5ldHdvcmsgY29ubmVjdGlvbnMuCi0gICAgICAgICAgICAgICAgIFBhc3MgTm9uZSB0byBiaW5kIHRvIGFsbCBpbnRlcmZhY2VzLgotICAgIEB0eXBlIGhvc3Q6IHN0cgotICAgIEBwYXJhbSBwb3J0OiBUaGUgcG9ydCB0byBsaXN0ZW4gb24gZm9yIGluYm91bmQgY29ubmVjdGlvbnMuCi0gICAgQHR5cGUgcG9ydDogaW50Ci0gICAgIiIiCi0gICAgc2VsZi5zZXRDZXJ0ZmlsZShjZXJ0ZmlsZSkKLSAgICBUU29ja2V0LlRTZXJ2ZXJTb2NrZXQuX19pbml0X18oc2VsZiwgaG9zdCwgcG9ydCkKKyAgICAgICAgaWYgJ3NzbF9jb250ZXh0JyBub3QgaW4ga3dhcmdzOgorICAgICAgICAgICAgIyBQcmVzZXJ2ZSBleGlzdGluZyBiZWhhdmlvcnMgZm9yIGRlZmF1bHQgdmFsdWVzCisgICAgICAgICAgICBpZiAnY2VydF9yZXFzJyBub3QgaW4ga3dhcmdzOgorICAgICAgICAgICAgICAgIGt3YXJnc1snY2VydF9yZXFzJ10gPSBzc2wuQ0VSVF9OT05FCisgICAgICAgICAgICBpZidjZXJ0ZmlsZScgbm90IGluIGt3YXJnczoKKyAgICAgICAgICAgICAgICBrd2FyZ3NbJ2NlcnRmaWxlJ10gPSAnY2VydC5wZW0nCiAKLSAgZGVmIHNldENlcnRmaWxlKHNlbGYsIGNlcnRmaWxlKToKLSAgICAiIiJTZXQgb3IgY2hhbmdlIHRoZSBzZXJ2ZXIgY2VydGlmaWNhdGUgZmlsZSB1c2VkIHRvIHdyYXAgbmV3IGNvbm5lY3Rpb25zLgorICAgICAgICB1bml4X3NvY2tldCA9IGt3YXJncy5wb3AoJ3VuaXhfc29ja2V0JywgTm9uZSkKKyAgICAgICAgc2VsZi5fdmFsaWRhdGVfY2FsbGJhY2sgPSBcCisgICAgICAgICAgICBrd2FyZ3MucG9wKCd2YWxpZGF0ZV9jYWxsYmFjaycsIF9tYXRjaF9ob3N0bmFtZSkKKyAgICAgICAgVFNTTEJhc2UuX19pbml0X18oc2VsZiwgVHJ1ZSwgTm9uZSwga3dhcmdzKQorICAgICAgICBUU29ja2V0LlRTZXJ2ZXJTb2NrZXQuX19pbml0X18oc2VsZiwgaG9zdCwgcG9ydCwgdW5peF9zb2NrZXQpCisgICAgICAgIGlmIHNlbGYuX3Nob3VsZF92ZXJpZnkgYW5kIG5vdCBfbWF0Y2hfaGFzX2lwYWRkcmVzczoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ05lZWQgaXBhZGRyZXNzIGFuZCBiYWNrcG9ydHMuc3NsX21hdGNoX2hvc3RuYW1lICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZSB0byB2ZXJpZnkgY2xpZW50IGNlcnRpZmljYXRlJykKIAotICAgIEBwYXJhbSBjZXJ0ZmlsZTogVGhlIGZpbGVuYW1lIG9mIHRoZSBzZXJ2ZXIgY2VydGlmaWNhdGUsCi0gICAgICAgICAgICAgICAgICAgICBpLmUuICcvZXRjL2NlcnRzL3NlcnZlci5wZW0nCi0gICAgQHR5cGUgY2VydGZpbGU6IHN0cgorICAgIGRlZiBzZXRDZXJ0ZmlsZShzZWxmLCBjZXJ0ZmlsZSk6CisgICAgICAgICIiIlNldCBvciBjaGFuZ2UgdGhlIHNlcnZlciBjZXJ0aWZpY2F0ZSBmaWxlIHVzZWQgdG8gd3JhcCBuZXcKKyAgICAgICAgY29ubmVjdGlvbnMuCiAKLSAgICBSYWlzZXMgYW4gSU9FcnJvciBleGNlcHRpb24gaWYgdGhlIGNlcnRmaWxlIGlzIG5vdCBwcmVzZW50IG9yIHVucmVhZGFibGUuCi0gICAgIiIiCi0gICAgaWYgbm90IG9zLmFjY2VzcyhjZXJ0ZmlsZSwgb3MuUl9PSyk6Ci0gICAgICByYWlzZSBJT0Vycm9yKCdObyBzdWNoIGNlcnRmaWxlIGZvdW5kOiAlcycgJSAoY2VydGZpbGUpKQotICAgIHNlbGYuY2VydGZpbGUgPSBjZXJ0ZmlsZQorICAgICAgICBAcGFyYW0gY2VydGZpbGU6IFRoZSBmaWxlbmFtZSBvZiB0aGUgc2VydmVyIGNlcnRpZmljYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGkuZS4gJy9ldGMvY2VydHMvc2VydmVyLnBlbScKKyAgICAgICAgQHR5cGUgY2VydGZpbGU6IHN0cgogCi0gIGRlZiBhY2NlcHQoc2VsZik6Ci0gICAgcGxhaW5fY2xpZW50LCBhZGRyID0gc2VsZi5oYW5kbGUuYWNjZXB0KCkKLSAgICB0cnk6Ci0gICAgICBjbGllbnQgPSBzc2wud3JhcF9zb2NrZXQocGxhaW5fY2xpZW50LCBjZXJ0ZmlsZT1zZWxmLmNlcnRmaWxlLAotICAgICAgICAgICAgICAgICAgICAgIHNlcnZlcl9zaWRlPVRydWUsIHNzbF92ZXJzaW9uPXNlbGYuU1NMX1ZFUlNJT04pCi0gICAgZXhjZXB0IHNzbC5TU0xFcnJvciwgc3NsX2V4YzoKLSAgICAgICMgZmFpbGVkIGhhbmRzaGFrZS9zc2wgd3JhcCwgY2xvc2Ugc29ja2V0IHRvIGNsaWVudAotICAgICAgcGxhaW5fY2xpZW50LmNsb3NlKCkKLSAgICAgICMgcmFpc2Ugc3NsX2V4YwotICAgICAgIyBXZSBjYW4ndCByYWlzZSB0aGUgZXhjZXB0aW9uLCBiZWNhdXNlIGl0IGtpbGxzIG1vc3QgVFNlcnZlciBkZXJpdmVkCi0gICAgICAjIHNlcnZlKCkgbWV0aG9kcy4KLSAgICAgICMgSW5zdGVhZCwgcmV0dXJuIE5vbmUsIGFuZCBsZXQgdGhlIFRTZXJ2ZXIgaW5zdGFuY2UgZGVhbCB3aXRoIGl0IGluCi0gICAgICAjIG90aGVyIGV4Y2VwdGlvbiBoYW5kbGluZy4gIChidXQgVFNpbXBsZVNlcnZlciBkaWVzIGFueXdheSkKLSAgICAgIHJldHVybiBOb25lCi0gICAgcmVzdWx0ID0gVFNvY2tldC5UU29ja2V0KCkKLSAgICByZXN1bHQuc2V0SGFuZGxlKGNsaWVudCkKLSAgICByZXR1cm4gcmVzdWx0CisgICAgICAgIFJhaXNlcyBhbiBJT0Vycm9yIGV4Y2VwdGlvbiBpZiB0aGUgY2VydGZpbGUgaXMgbm90IHByZXNlbnQgb3IgdW5yZWFkYWJsZS4KKyAgICAgICAgIiIiCisgICAgICAgIHdhcm5pbmdzLndhcm4oCisgICAgICAgICAgICAnc2V0Q2VydGZpbGUgaXMgZGVwcmVjYXRlZC4gcGxlYXNlIHVzZSBjZXJ0ZmlsZSBwcm9wZXJ0eSBpbnN0ZWFkLicsCisgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIHN0YWNrbGV2ZWw9MikKKyAgICAgICAgc2VsZi5jZXJ0ZmlsZSA9IGNlcnRmaWxlCisKKyAgICBkZWYgYWNjZXB0KHNlbGYpOgorICAgICAgICBwbGFpbl9jbGllbnQsIGFkZHIgPSBzZWxmLmhhbmRsZS5hY2NlcHQoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBjbGllbnQgPSBzZWxmLl93cmFwX3NvY2tldChwbGFpbl9jbGllbnQpCisgICAgICAgIGV4Y2VwdCAoc3NsLlNTTEVycm9yLCBzb2NrZXQuZXJyb3IsIE9TRXJyb3IpOgorICAgICAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbignRXJyb3Igd2hpbGUgYWNjZXB0aW5nIGZyb20gJXMnLCBhZGRyKQorICAgICAgICAgICAgIyBmYWlsZWQgaGFuZHNoYWtlL3NzbCB3cmFwLCBjbG9zZSBzb2NrZXQgdG8gY2xpZW50CisgICAgICAgICAgICBwbGFpbl9jbGllbnQuY2xvc2UoKQorICAgICAgICAgICAgIyByYWlzZQorICAgICAgICAgICAgIyBXZSBjYW4ndCByYWlzZSB0aGUgZXhjZXB0aW9uLCBiZWNhdXNlIGl0IGtpbGxzIG1vc3QgVFNlcnZlciBkZXJpdmVkCisgICAgICAgICAgICAjIHNlcnZlKCkgbWV0aG9kcy4KKyAgICAgICAgICAgICMgSW5zdGVhZCwgcmV0dXJuIE5vbmUsIGFuZCBsZXQgdGhlIFRTZXJ2ZXIgaW5zdGFuY2UgZGVhbCB3aXRoIGl0IGluCisgICAgICAgICAgICAjIG90aGVyIGV4Y2VwdGlvbiBoYW5kbGluZy4gIChidXQgVFNpbXBsZVNlcnZlciBkaWVzIGFueXdheSkKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICAgICAgaWYgc2VsZi5fc2hvdWxkX3ZlcmlmeToKKyAgICAgICAgICAgIGNsaWVudC5wZWVyY2VydCA9IGNsaWVudC5nZXRwZWVyY2VydCgpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5fdmFsaWRhdGVfY2FsbGJhY2soY2xpZW50LnBlZXJjZXJ0LCBhZGRyWzBdKQorICAgICAgICAgICAgICAgIGNsaWVudC5pc192YWxpZCA9IFRydWUKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oJ0ZhaWxlZCB0byB2YWxpZGF0ZSBjbGllbnQgY2VydGlmaWNhdGUgYWRkcmVzczogJXMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJbMF0sIGV4Y19pbmZvPVRydWUpCisgICAgICAgICAgICAgICAgY2xpZW50LmNsb3NlKCkKKyAgICAgICAgICAgICAgICBwbGFpbl9jbGllbnQuY2xvc2UoKQorICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICAgICAgcmVzdWx0ID0gVFNvY2tldC5UU29ja2V0KCkKKyAgICAgICAgcmVzdWx0LmhhbmRsZSA9IGNsaWVudAorICAgICAgICByZXR1cm4gcmVzdWx0CmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL3RyYW5zcG9ydC9UU29ja2V0LnB5IGIvbGliL3B5L3NyYy90cmFuc3BvcnQvVFNvY2tldC5weQppbmRleCAwMTc1YmRjLi5hN2Q2NjE3IDEwMDY0NAotLS0gYS9saWIvcHkvc3JjL3RyYW5zcG9ydC9UU29ja2V0LnB5CisrKyBiL2xpYi9weS9zcmMvdHJhbnNwb3J0L1RTb2NrZXQucHkKQEAgLTE4LDE2MyArMTgsMTg0IEBACiAjCiAKIGltcG9ydCBlcnJubworaW1wb3J0IGxvZ2dpbmcKIGltcG9ydCBvcwogaW1wb3J0IHNvY2tldAogaW1wb3J0IHN5cwogCi1mcm9tIFRUcmFuc3BvcnQgaW1wb3J0ICoKK2Zyb20gLlRUcmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnRCYXNlLCBUVHJhbnNwb3J0RXhjZXB0aW9uLCBUU2VydmVyVHJhbnNwb3J0QmFzZQorCitsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKIAogCiBjbGFzcyBUU29ja2V0QmFzZShUVHJhbnNwb3J0QmFzZSk6Ci0gIGRlZiBfcmVzb2x2ZUFkZHIoc2VsZik6Ci0gICAgaWYgc2VsZi5fdW5peF9zb2NrZXQgaXMgbm90IE5vbmU6Ci0gICAgICByZXR1cm4gWyhzb2NrZXQuQUZfVU5JWCwgc29ja2V0LlNPQ0tfU1RSRUFNLCBOb25lLCBOb25lLAotICAgICAgICAgICAgICAgc2VsZi5fdW5peF9zb2NrZXQpXQotICAgIGVsc2U6Ci0gICAgICByZXR1cm4gc29ja2V0LmdldGFkZHJpbmZvKHNlbGYuaG9zdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9zb2NrZXRfZmFtaWx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2NrZXQuU09DS19TVFJFQU0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tldC5BSV9QQVNTSVZFIHwgc29ja2V0LkFJX0FERFJDT05GSUcpCisgICAgZGVmIF9yZXNvbHZlQWRkcihzZWxmKToKKyAgICAgICAgaWYgc2VsZi5fdW5peF9zb2NrZXQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICByZXR1cm4gWyhzb2NrZXQuQUZfVU5JWCwgc29ja2V0LlNPQ0tfU1RSRUFNLCBOb25lLCBOb25lLAorICAgICAgICAgICAgICAgICAgICAgc2VsZi5fdW5peF9zb2NrZXQpXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNvY2tldC5nZXRhZGRyaW5mbyhzZWxmLmhvc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fc29ja2V0X2ZhbWlseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0LlNPQ0tfU1RSRUFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2NrZXQuQUlfUEFTU0lWRSB8IHNvY2tldC5BSV9BRERSQ09ORklHKQogCi0gIGRlZiBjbG9zZShzZWxmKToKLSAgICBpZiBzZWxmLmhhbmRsZToKLSAgICAgIHNlbGYuaGFuZGxlLmNsb3NlKCkKLSAgICAgIHNlbGYuaGFuZGxlID0gTm9uZQorICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5oYW5kbGU6CisgICAgICAgICAgICBzZWxmLmhhbmRsZS5jbG9zZSgpCisgICAgICAgICAgICBzZWxmLmhhbmRsZSA9IE5vbmUKIAogCiBjbGFzcyBUU29ja2V0KFRTb2NrZXRCYXNlKToKLSAgIiIiU29ja2V0IGltcGxlbWVudGF0aW9uIG9mIFRUcmFuc3BvcnQgYmFzZS4iIiIKKyAgICAiIiJTb2NrZXQgaW1wbGVtZW50YXRpb24gb2YgVFRyYW5zcG9ydCBiYXNlLiIiIgogCi0gIGRlZiBfX2luaXRfXyhzZWxmLCBob3N0PSdsb2NhbGhvc3QnLCBwb3J0PTkwOTAsIHVuaXhfc29ja2V0PU5vbmUsIHNvY2tldF9mYW1pbHk9c29ja2V0LkFGX1VOU1BFQyk6Ci0gICAgIiIiSW5pdGlhbGl6ZSBhIFRTb2NrZXQKKyAgICBkZWYgX19pbml0X18oc2VsZiwgaG9zdD0nbG9jYWxob3N0JywgcG9ydD05MDkwLCB1bml4X3NvY2tldD1Ob25lLCBzb2NrZXRfZmFtaWx5PXNvY2tldC5BRl9VTlNQRUMpOgorICAgICAgICAiIiJJbml0aWFsaXplIGEgVFNvY2tldAogCi0gICAgQHBhcmFtIGhvc3Qoc3RyKSAgVGhlIGhvc3QgdG8gY29ubmVjdCB0by4KLSAgICBAcGFyYW0gcG9ydChpbnQpICBUaGUgKFRDUCkgcG9ydCB0byBjb25uZWN0IHRvLgotICAgIEBwYXJhbSB1bml4X3NvY2tldChzdHIpICBUaGUgZmlsZW5hbWUgb2YgYSB1bml4IHNvY2tldCB0byBjb25uZWN0IHRvLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaG9zdCBhbmQgcG9ydCB3aWxsIGJlIGlnbm9yZWQuKQotICAgIEBwYXJhbSBzb2NrZXRfZmFtaWx5KGludCkgIFRoZSBzb2NrZXQgZmFtaWx5IHRvIHVzZSB3aXRoIHRoaXMgc29ja2V0LgotICAgICIiIgotICAgIHNlbGYuaG9zdCA9IGhvc3QKLSAgICBzZWxmLnBvcnQgPSBwb3J0Ci0gICAgc2VsZi5oYW5kbGUgPSBOb25lCi0gICAgc2VsZi5fdW5peF9zb2NrZXQgPSB1bml4X3NvY2tldAotICAgIHNlbGYuX3RpbWVvdXQgPSBOb25lCi0gICAgc2VsZi5fc29ja2V0X2ZhbWlseSA9IHNvY2tldF9mYW1pbHkKKyAgICAgICAgQHBhcmFtIGhvc3Qoc3RyKSAgVGhlIGhvc3QgdG8gY29ubmVjdCB0by4KKyAgICAgICAgQHBhcmFtIHBvcnQoaW50KSAgVGhlIChUQ1ApIHBvcnQgdG8gY29ubmVjdCB0by4KKyAgICAgICAgQHBhcmFtIHVuaXhfc29ja2V0KHN0cikgIFRoZSBmaWxlbmFtZSBvZiBhIHVuaXggc29ja2V0IHRvIGNvbm5lY3QgdG8uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaG9zdCBhbmQgcG9ydCB3aWxsIGJlIGlnbm9yZWQuKQorICAgICAgICBAcGFyYW0gc29ja2V0X2ZhbWlseShpbnQpICBUaGUgc29ja2V0IGZhbWlseSB0byB1c2Ugd2l0aCB0aGlzIHNvY2tldC4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuaG9zdCA9IGhvc3QKKyAgICAgICAgc2VsZi5wb3J0ID0gcG9ydAorICAgICAgICBzZWxmLmhhbmRsZSA9IE5vbmUKKyAgICAgICAgc2VsZi5fdW5peF9zb2NrZXQgPSB1bml4X3NvY2tldAorICAgICAgICBzZWxmLl90aW1lb3V0ID0gTm9uZQorICAgICAgICBzZWxmLl9zb2NrZXRfZmFtaWx5ID0gc29ja2V0X2ZhbWlseQogCi0gIGRlZiBzZXRIYW5kbGUoc2VsZiwgaCk6Ci0gICAgc2VsZi5oYW5kbGUgPSBoCisgICAgZGVmIHNldEhhbmRsZShzZWxmLCBoKToKKyAgICAgICAgc2VsZi5oYW5kbGUgPSBoCiAKLSAgZGVmIGlzT3BlbihzZWxmKToKLSAgICByZXR1cm4gc2VsZi5oYW5kbGUgaXMgbm90IE5vbmUKKyAgICBkZWYgaXNPcGVuKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5oYW5kbGUgaXMgbm90IE5vbmUKIAotICBkZWYgc2V0VGltZW91dChzZWxmLCBtcyk6Ci0gICAgaWYgbXMgaXMgTm9uZToKLSAgICAgIHNlbGYuX3RpbWVvdXQgPSBOb25lCi0gICAgZWxzZToKLSAgICAgIHNlbGYuX3RpbWVvdXQgPSBtcyAvIDEwMDAuMAorICAgIGRlZiBzZXRUaW1lb3V0KHNlbGYsIG1zKToKKyAgICAgICAgaWYgbXMgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuX3RpbWVvdXQgPSBOb25lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl90aW1lb3V0ID0gbXMgLyAxMDAwLjAKIAotICAgIGlmIHNlbGYuaGFuZGxlIGlzIG5vdCBOb25lOgotICAgICAgc2VsZi5oYW5kbGUuc2V0dGltZW91dChzZWxmLl90aW1lb3V0KQorICAgICAgICBpZiBzZWxmLmhhbmRsZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuaGFuZGxlLnNldHRpbWVvdXQoc2VsZi5fdGltZW91dCkKIAotICBkZWYgb3BlbihzZWxmKToKLSAgICB0cnk6Ci0gICAgICByZXMwID0gc2VsZi5fcmVzb2x2ZUFkZHIoKQotICAgICAgZm9yIHJlcyBpbiByZXMwOgotICAgICAgICBzZWxmLmhhbmRsZSA9IHNvY2tldC5zb2NrZXQocmVzWzBdLCByZXNbMV0pCi0gICAgICAgIHNlbGYuaGFuZGxlLnNldHRpbWVvdXQoc2VsZi5fdGltZW91dCkKKyAgICBkZWYgX2RvX29wZW4oc2VsZiwgZmFtaWx5LCBzb2NrdHlwZSk6CisgICAgICAgIHJldHVybiBzb2NrZXQuc29ja2V0KGZhbWlseSwgc29ja3R5cGUpCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgX2FkZHJlc3Moc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl91bml4X3NvY2tldCBpZiBzZWxmLl91bml4X3NvY2tldCBlbHNlICclczolZCcgJSAoc2VsZi5ob3N0LCBzZWxmLnBvcnQpCisKKyAgICBkZWYgb3BlbihzZWxmKToKKyAgICAgICAgaWYgc2VsZi5oYW5kbGU6CisgICAgICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uQUxSRUFEWV9PUEVOKQogICAgICAgICB0cnk6Ci0gICAgICAgICAgc2VsZi5oYW5kbGUuY29ubmVjdChyZXNbNF0pCi0gICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3IsIGU6Ci0gICAgICAgICAgaWYgcmVzIGlzIG5vdCByZXMwWy0xXToKLSAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHJhaXNlIGUKLSAgICAgICAgYnJlYWsKLSAgICBleGNlcHQgc29ja2V0LmVycm9yLCBlOgotICAgICAgaWYgc2VsZi5fdW5peF9zb2NrZXQ6Ci0gICAgICAgIG1lc3NhZ2UgPSAnQ291bGQgbm90IGNvbm5lY3QgdG8gc29ja2V0ICVzJyAlIHNlbGYuX3VuaXhfc29ja2V0Ci0gICAgICBlbHNlOgotICAgICAgICBtZXNzYWdlID0gJ0NvdWxkIG5vdCBjb25uZWN0IHRvICVzOiVkJyAlIChzZWxmLmhvc3QsIHNlbGYucG9ydCkKLSAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24odHlwZT1UVHJhbnNwb3J0RXhjZXB0aW9uLk5PVF9PUEVOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlPW1lc3NhZ2UpCisgICAgICAgICAgICBhZGRycyA9IHNlbGYuX3Jlc29sdmVBZGRyKCkKKyAgICAgICAgZXhjZXB0IHNvY2tldC5nYWllcnJvcjoKKyAgICAgICAgICAgIG1zZyA9ICdmYWlsZWQgdG8gcmVzb2x2ZSBzb2NrYWRkciBmb3IgJyArIHN0cihzZWxmLl9hZGRyZXNzKQorICAgICAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbihtc2cpCisgICAgICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uTk9UX09QRU4sIG1zZykKKyAgICAgICAgZm9yIGZhbWlseSwgc29ja3R5cGUsIF8sIF8sIHNvY2thZGRyIGluIGFkZHJzOgorICAgICAgICAgICAgaGFuZGxlID0gc2VsZi5fZG9fb3BlbihmYW1pbHksIHNvY2t0eXBlKQorICAgICAgICAgICAgaGFuZGxlLnNldHRpbWVvdXQoc2VsZi5fdGltZW91dCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBoYW5kbGUuY29ubmVjdChzb2NrYWRkcikKKyAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZSA9IGhhbmRsZQorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvcjoKKyAgICAgICAgICAgICAgICBoYW5kbGUuY2xvc2UoKQorICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdDb3VsZCBub3QgY29ubmVjdCB0byAlcycsIHNvY2thZGRyLCBleGNfaW5mbz1UcnVlKQorICAgICAgICBtc2cgPSAnQ291bGQgbm90IGNvbm5lY3QgdG8gYW55IG9mICVzJyAlIGxpc3QobWFwKGxhbWJkYSBhOiBhWzRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJzKSkKKyAgICAgICAgbG9nZ2VyLmVycm9yKG1zZykKKyAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLk5PVF9PUEVOLCBtc2cpCiAKLSAgZGVmIHJlYWQoc2VsZiwgc3opOgotICAgIHRyeToKLSAgICAgIGJ1ZmYgPSBzZWxmLmhhbmRsZS5yZWN2KHN6KQotICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3IsIGU6Ci0gICAgICBpZiAoZS5hcmdzWzBdID09IGVycm5vLkVDT05OUkVTRVQgYW5kCi0gICAgICAgICAgKHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJyBvciBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnZnJlZWJzZCcpKSk6Ci0gICAgICAgICMgZnJlZWJzZCBhbmQgTWFjaCBkb24ndCBmb2xsb3cgUE9TSVggc2VtYW50aWMgb2YgcmVjdgotICAgICAgICAjIGFuZCBmYWlsIHdpdGggRUNPTk5SRVNFVCBpZiBwZWVyIHBlcmZvcm1lZCBzaHV0ZG93bi4KLSAgICAgICAgIyBTZWUgY29ycmVzcG9uZGluZyBjb21tZW50IGFuZCBjb2RlIGluIFRTb2NrZXQ6OnJlYWQoKQotICAgICAgICAjIGluIGxpYi9jcHAvc3JjL3RyYW5zcG9ydC9UU29ja2V0LmNwcC4KLSAgICAgICAgc2VsZi5jbG9zZSgpCi0gICAgICAgICMgVHJpZ2dlciB0aGUgY2hlY2sgdG8gcmFpc2UgdGhlIEVORF9PRl9GSUxFIGV4Y2VwdGlvbiBiZWxvdy4KLSAgICAgICAgYnVmZiA9ICcnCi0gICAgICBlbHNlOgotICAgICAgICByYWlzZQotICAgIGlmIGxlbihidWZmKSA9PSAwOgotICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbih0eXBlPVRUcmFuc3BvcnRFeGNlcHRpb24uRU5EX09GX0ZJTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9J1RTb2NrZXQgcmVhZCAwIGJ5dGVzJykKLSAgICByZXR1cm4gYnVmZgorICAgIGRlZiByZWFkKHNlbGYsIHN6KToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgYnVmZiA9IHNlbGYuaGFuZGxlLnJlY3Yoc3opCisgICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3IgYXMgZToKKyAgICAgICAgICAgIGlmIChlLmFyZ3NbMF0gPT0gZXJybm8uRUNPTk5SRVNFVCBhbmQKKyAgICAgICAgICAgICAgICAgICAgKHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJyBvciBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnZnJlZWJzZCcpKSk6CisgICAgICAgICAgICAgICAgIyBmcmVlYnNkIGFuZCBNYWNoIGRvbid0IGZvbGxvdyBQT1NJWCBzZW1hbnRpYyBvZiByZWN2CisgICAgICAgICAgICAgICAgIyBhbmQgZmFpbCB3aXRoIEVDT05OUkVTRVQgaWYgcGVlciBwZXJmb3JtZWQgc2h1dGRvd24uCisgICAgICAgICAgICAgICAgIyBTZWUgY29ycmVzcG9uZGluZyBjb21tZW50IGFuZCBjb2RlIGluIFRTb2NrZXQ6OnJlYWQoKQorICAgICAgICAgICAgICAgICMgaW4gbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RTb2NrZXQuY3BwLgorICAgICAgICAgICAgICAgIHNlbGYuY2xvc2UoKQorICAgICAgICAgICAgICAgICMgVHJpZ2dlciB0aGUgY2hlY2sgdG8gcmFpc2UgdGhlIEVORF9PRl9GSUxFIGV4Y2VwdGlvbiBiZWxvdy4KKyAgICAgICAgICAgICAgICBidWZmID0gJycKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgaWYgbGVuKGJ1ZmYpID09IDA6CisgICAgICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uKHR5cGU9VFRyYW5zcG9ydEV4Y2VwdGlvbi5FTkRfT0ZfRklMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT0nVFNvY2tldCByZWFkIDAgYnl0ZXMnKQorICAgICAgICByZXR1cm4gYnVmZgogCi0gIGRlZiB3cml0ZShzZWxmLCBidWZmKToKLSAgICBpZiBub3Qgc2VsZi5oYW5kbGU6Ci0gICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uKHR5cGU9VFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT0nVHJhbnNwb3J0IG5vdCBvcGVuJykKLSAgICBzZW50ID0gMAotICAgIGhhdmUgPSBsZW4oYnVmZikKLSAgICB3aGlsZSBzZW50IDwgaGF2ZToKLSAgICAgIHBsdXMgPSBzZWxmLmhhbmRsZS5zZW5kKGJ1ZmYpCi0gICAgICBpZiBwbHVzID09IDA6Ci0gICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24odHlwZT1UVHJhbnNwb3J0RXhjZXB0aW9uLkVORF9PRl9GSUxFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9J1RTb2NrZXQgc2VudCAwIGJ5dGVzJykKLSAgICAgIHNlbnQgKz0gcGx1cwotICAgICAgYnVmZiA9IGJ1ZmZbcGx1czpdCisgICAgZGVmIHdyaXRlKHNlbGYsIGJ1ZmYpOgorICAgICAgICBpZiBub3Qgc2VsZi5oYW5kbGU6CisgICAgICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uKHR5cGU9VFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT0nVHJhbnNwb3J0IG5vdCBvcGVuJykKKyAgICAgICAgc2VudCA9IDAKKyAgICAgICAgaGF2ZSA9IGxlbihidWZmKQorICAgICAgICB3aGlsZSBzZW50IDwgaGF2ZToKKyAgICAgICAgICAgIHBsdXMgPSBzZWxmLmhhbmRsZS5zZW5kKGJ1ZmYpCisgICAgICAgICAgICBpZiBwbHVzID09IDA6CisgICAgICAgICAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbih0eXBlPVRUcmFuc3BvcnRFeGNlcHRpb24uRU5EX09GX0ZJTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlPSdUU29ja2V0IHNlbnQgMCBieXRlcycpCisgICAgICAgICAgICBzZW50ICs9IHBsdXMKKyAgICAgICAgICAgIGJ1ZmYgPSBidWZmW3BsdXM6XQogCi0gIGRlZiBmbHVzaChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIGZsdXNoKHNlbGYpOgorICAgICAgICBwYXNzCiAKIAogY2xhc3MgVFNlcnZlclNvY2tldChUU29ja2V0QmFzZSwgVFNlcnZlclRyYW5zcG9ydEJhc2UpOgotICAiIiJTb2NrZXQgaW1wbGVtZW50YXRpb24gb2YgVFNlcnZlclRyYW5zcG9ydCBiYXNlLiIiIgorICAgICIiIlNvY2tldCBpbXBsZW1lbnRhdGlvbiBvZiBUU2VydmVyVHJhbnNwb3J0IGJhc2UuIiIiCiAKLSAgZGVmIF9faW5pdF9fKHNlbGYsIGhvc3Q9Tm9uZSwgcG9ydD05MDkwLCB1bml4X3NvY2tldD1Ob25lLCBzb2NrZXRfZmFtaWx5PXNvY2tldC5BRl9VTlNQRUMpOgotICAgIHNlbGYuaG9zdCA9IGhvc3QKLSAgICBzZWxmLnBvcnQgPSBwb3J0Ci0gICAgc2VsZi5fdW5peF9zb2NrZXQgPSB1bml4X3NvY2tldAotICAgIHNlbGYuX3NvY2tldF9mYW1pbHkgPSBzb2NrZXRfZmFtaWx5Ci0gICAgc2VsZi5oYW5kbGUgPSBOb25lCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGhvc3Q9Tm9uZSwgcG9ydD05MDkwLCB1bml4X3NvY2tldD1Ob25lLCBzb2NrZXRfZmFtaWx5PXNvY2tldC5BRl9VTlNQRUMpOgorICAgICAgICBzZWxmLmhvc3QgPSBob3N0CisgICAgICAgIHNlbGYucG9ydCA9IHBvcnQKKyAgICAgICAgc2VsZi5fdW5peF9zb2NrZXQgPSB1bml4X3NvY2tldAorICAgICAgICBzZWxmLl9zb2NrZXRfZmFtaWx5ID0gc29ja2V0X2ZhbWlseQorICAgICAgICBzZWxmLmhhbmRsZSA9IE5vbmUKKyAgICAgICAgc2VsZi5fYmFja2xvZyA9IDEyOAogCi0gIGRlZiBsaXN0ZW4oc2VsZik6Ci0gICAgcmVzMCA9IHNlbGYuX3Jlc29sdmVBZGRyKCkKLSAgICBzb2NrZXRfZmFtaWx5ID0gc2VsZi5fc29ja2V0X2ZhbWlseSA9PSBzb2NrZXQuQUZfVU5TUEVDIGFuZCBzb2NrZXQuQUZfSU5FVDYgb3Igc2VsZi5fc29ja2V0X2ZhbWlseQotICAgIGZvciByZXMgaW4gcmVzMDoKLSAgICAgIGlmIHJlc1swXSBpcyBzb2NrZXRfZmFtaWx5IG9yIHJlcyBpcyByZXMwWy0xXToKLSAgICAgICAgYnJlYWsKKyAgICBkZWYgc2V0QmFja2xvZyhzZWxmLCBiYWNrbG9nPU5vbmUpOgorICAgICAgICBpZiBub3Qgc2VsZi5oYW5kbGU6CisgICAgICAgICAgICBzZWxmLl9iYWNrbG9nID0gYmFja2xvZworICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBXZSBjYW5uJ3QgdXBkYXRlIGJhY2tsb2cgd2hlbiBpdCBpcyBhbHJlYWR5IGxpc3RlbmluZywgc2luY2UgdGhlCisgICAgICAgICAgICAjIGhhbmRsZSBoYXMgYmVlbiBjcmVhdGVkLgorICAgICAgICAgICAgbG9nZ2VyLndhcm4oJ1lvdSBoYXZlIHRvIHNldCBiYWNrbG9nIGJlZm9yZSBsaXN0ZW4uJykKIAotICAgICMgV2UgbmVlZCByZW1vdmUgdGhlIG9sZCB1bml4IHNvY2tldCBpZiB0aGUgZmlsZSBleGlzdHMgYW5kCi0gICAgIyBub2JvZHkgaXMgbGlzdGVuaW5nIG9uIGl0LgotICAgIGlmIHNlbGYuX3VuaXhfc29ja2V0OgotICAgICAgdG1wID0gc29ja2V0LnNvY2tldChyZXNbMF0sIHJlc1sxXSkKLSAgICAgIHRyeToKLSAgICAgICAgdG1wLmNvbm5lY3QocmVzWzRdKQotICAgICAgZXhjZXB0IHNvY2tldC5lcnJvciwgZXJyOgotICAgICAgICBlbm8sIG1lc3NhZ2UgPSBlcnIuYXJncwotICAgICAgICBpZiBlbm8gPT0gZXJybm8uRUNPTk5SRUZVU0VEOgotICAgICAgICAgIG9zLnVubGluayhyZXNbNF0pCisgICAgZGVmIGxpc3RlbihzZWxmKToKKyAgICAgICAgcmVzMCA9IHNlbGYuX3Jlc29sdmVBZGRyKCkKKyAgICAgICAgc29ja2V0X2ZhbWlseSA9IHNlbGYuX3NvY2tldF9mYW1pbHkgPT0gc29ja2V0LkFGX1VOU1BFQyBhbmQgc29ja2V0LkFGX0lORVQ2IG9yIHNlbGYuX3NvY2tldF9mYW1pbHkKKyAgICAgICAgZm9yIHJlcyBpbiByZXMwOgorICAgICAgICAgICAgaWYgcmVzWzBdIGlzIHNvY2tldF9mYW1pbHkgb3IgcmVzIGlzIHJlczBbLTFdOgorICAgICAgICAgICAgICAgIGJyZWFrCiAKLSAgICBzZWxmLmhhbmRsZSA9IHNvY2tldC5zb2NrZXQocmVzWzBdLCByZXNbMV0pCi0gICAgc2VsZi5oYW5kbGUuc2V0c29ja29wdChzb2NrZXQuU09MX1NPQ0tFVCwgc29ja2V0LlNPX1JFVVNFQUREUiwgMSkKLSAgICBpZiBoYXNhdHRyKHNlbGYuaGFuZGxlLCAnc2V0dGltZW91dCcpOgotICAgICAgc2VsZi5oYW5kbGUuc2V0dGltZW91dChOb25lKQotICAgIHNlbGYuaGFuZGxlLmJpbmQocmVzWzRdKQotICAgIHNlbGYuaGFuZGxlLmxpc3RlbigxMjgpCisgICAgICAgICMgV2UgbmVlZCByZW1vdmUgdGhlIG9sZCB1bml4IHNvY2tldCBpZiB0aGUgZmlsZSBleGlzdHMgYW5kCisgICAgICAgICMgbm9ib2R5IGlzIGxpc3RlbmluZyBvbiBpdC4KKyAgICAgICAgaWYgc2VsZi5fdW5peF9zb2NrZXQ6CisgICAgICAgICAgICB0bXAgPSBzb2NrZXQuc29ja2V0KHJlc1swXSwgcmVzWzFdKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHRtcC5jb25uZWN0KHJlc1s0XSkKKyAgICAgICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3IgYXMgZXJyOgorICAgICAgICAgICAgICAgIGVubywgbWVzc2FnZSA9IGVyci5hcmdzCisgICAgICAgICAgICAgICAgaWYgZW5vID09IGVycm5vLkVDT05OUkVGVVNFRDoKKyAgICAgICAgICAgICAgICAgICAgb3MudW5saW5rKHJlc1s0XSkKIAotICBkZWYgYWNjZXB0KHNlbGYpOgotICAgIGNsaWVudCwgYWRkciA9IHNlbGYuaGFuZGxlLmFjY2VwdCgpCi0gICAgcmVzdWx0ID0gVFNvY2tldCgpCi0gICAgcmVzdWx0LnNldEhhbmRsZShjbGllbnQpCi0gICAgcmV0dXJuIHJlc3VsdAorICAgICAgICBzZWxmLmhhbmRsZSA9IHNvY2tldC5zb2NrZXQocmVzWzBdLCByZXNbMV0pCisgICAgICAgIHNlbGYuaGFuZGxlLnNldHNvY2tvcHQoc29ja2V0LlNPTF9TT0NLRVQsIHNvY2tldC5TT19SRVVTRUFERFIsIDEpCisgICAgICAgIGlmIGhhc2F0dHIoc2VsZi5oYW5kbGUsICdzZXR0aW1lb3V0Jyk6CisgICAgICAgICAgICBzZWxmLmhhbmRsZS5zZXR0aW1lb3V0KE5vbmUpCisgICAgICAgIHNlbGYuaGFuZGxlLmJpbmQocmVzWzRdKQorICAgICAgICBzZWxmLmhhbmRsZS5saXN0ZW4oc2VsZi5fYmFja2xvZykKKworICAgIGRlZiBhY2NlcHQoc2VsZik6CisgICAgICAgIGNsaWVudCwgYWRkciA9IHNlbGYuaGFuZGxlLmFjY2VwdCgpCisgICAgICAgIHJlc3VsdCA9IFRTb2NrZXQoKQorICAgICAgICByZXN1bHQuc2V0SGFuZGxlKGNsaWVudCkKKyAgICAgICAgcmV0dXJuIHJlc3VsdApkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydC5weSBiL2xpYi9weS9zcmMvdHJhbnNwb3J0L1RUcmFuc3BvcnQucHkKaW5kZXggNWFiMmZkZS4uZDEzMDYwZiAxMDA2NDQKLS0tIGEvbGliL3B5L3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydC5weQorKysgYi9saWIvcHkvc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0LnB5CkBAIC0xNyw0MjUgKzE3LDQzOSBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCiBmcm9tIHN0cnVjdCBpbXBvcnQgcGFjaywgdW5wYWNrCiBmcm9tIHRocmlmdC5UaHJpZnQgaW1wb3J0IFRFeGNlcHRpb24KK2Zyb20gLi5jb21wYXQgaW1wb3J0IEJ1ZmZlcklPCiAKIAogY2xhc3MgVFRyYW5zcG9ydEV4Y2VwdGlvbihURXhjZXB0aW9uKToKLSAgIiIiQ3VzdG9tIFRyYW5zcG9ydCBFeGNlcHRpb24gY2xhc3MiIiIKKyAgICAiIiJDdXN0b20gVHJhbnNwb3J0IEV4Y2VwdGlvbiBjbGFzcyIiIgogCi0gIFVOS05PV04gPSAwCi0gIE5PVF9PUEVOID0gMQotICBBTFJFQURZX09QRU4gPSAyCi0gIFRJTUVEX09VVCA9IDMKLSAgRU5EX09GX0ZJTEUgPSA0CisgICAgVU5LTk9XTiA9IDAKKyAgICBOT1RfT1BFTiA9IDEKKyAgICBBTFJFQURZX09QRU4gPSAyCisgICAgVElNRURfT1VUID0gMworICAgIEVORF9PRl9GSUxFID0gNAorICAgIE5FR0FUSVZFX1NJWkUgPSA1CisgICAgU0laRV9MSU1JVCA9IDYKKyAgICBJTlZBTElEX0NMSUVOVF9UWVBFID0gNwogCi0gIGRlZiBfX2luaXRfXyhzZWxmLCB0eXBlPVVOS05PV04sIG1lc3NhZ2U9Tm9uZSk6Ci0gICAgVEV4Y2VwdGlvbi5fX2luaXRfXyhzZWxmLCBtZXNzYWdlKQotICAgIHNlbGYudHlwZSA9IHR5cGUKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdHlwZT1VTktOT1dOLCBtZXNzYWdlPU5vbmUpOgorICAgICAgICBURXhjZXB0aW9uLl9faW5pdF9fKHNlbGYsIG1lc3NhZ2UpCisgICAgICAgIHNlbGYudHlwZSA9IHR5cGUKIAogCi1jbGFzcyBUVHJhbnNwb3J0QmFzZToKLSAgIiIiQmFzZSBjbGFzcyBmb3IgVGhyaWZ0IHRyYW5zcG9ydCBsYXllci4iIiIKK2NsYXNzIFRUcmFuc3BvcnRCYXNlKG9iamVjdCk6CisgICAgIiIiQmFzZSBjbGFzcyBmb3IgVGhyaWZ0IHRyYW5zcG9ydCBsYXllci4iIiIKIAotICBkZWYgaXNPcGVuKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgaXNPcGVuKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIG9wZW4oc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiBvcGVuKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIGNsb3NlKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgcmVhZChzZWxmLCBzeik6Ci0gICAgcGFzcworICAgIGRlZiByZWFkKHNlbGYsIHN6KToKKyAgICAgICAgcGFzcwogCi0gIGRlZiByZWFkQWxsKHNlbGYsIHN6KToKLSAgICBidWZmID0gJycKLSAgICBoYXZlID0gMAotICAgIHdoaWxlIChoYXZlIDwgc3opOgotICAgICAgY2h1bmsgPSBzZWxmLnJlYWQoc3ogLSBoYXZlKQotICAgICAgaGF2ZSArPSBsZW4oY2h1bmspCi0gICAgICBidWZmICs9IGNodW5rCisgICAgZGVmIHJlYWRBbGwoc2VsZiwgc3opOgorICAgICAgICBidWZmID0gYicnCisgICAgICAgIGhhdmUgPSAwCisgICAgICAgIHdoaWxlIChoYXZlIDwgc3opOgorICAgICAgICAgICAgY2h1bmsgPSBzZWxmLnJlYWQoc3ogLSBoYXZlKQorICAgICAgICAgICAgY2h1bmtMZW4gPSBsZW4oY2h1bmspCisgICAgICAgICAgICBoYXZlICs9IGNodW5rTGVuCisgICAgICAgICAgICBidWZmICs9IGNodW5rCiAKLSAgICAgIGlmIGxlbihjaHVuaykgPT0gMDoKLSAgICAgICAgcmFpc2UgRU9GRXJyb3IoKQorICAgICAgICAgICAgaWYgY2h1bmtMZW4gPT0gMDoKKyAgICAgICAgICAgICAgICByYWlzZSBFT0ZFcnJvcigpCiAKLSAgICByZXR1cm4gYnVmZgorICAgICAgICByZXR1cm4gYnVmZgogCi0gIGRlZiB3cml0ZShzZWxmLCBidWYpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGUoc2VsZiwgYnVmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiBmbHVzaChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIGZsdXNoKHNlbGYpOgorICAgICAgICBwYXNzCiAKIAogIyBUaGlzIGNsYXNzIHNob3VsZCBiZSB0aG91Z2h0IG9mIGFzIGFuIGludGVyZmFjZS4KLWNsYXNzIENSZWFkYWJsZVRyYW5zcG9ydDoKLSAgIiIiYmFzZSBjbGFzcyBmb3IgdHJhbnNwb3J0cyB0aGF0IGFyZSByZWFkYWJsZSBmcm9tIEMiIiIKK2NsYXNzIENSZWFkYWJsZVRyYW5zcG9ydChvYmplY3QpOgorICAgICIiImJhc2UgY2xhc3MgZm9yIHRyYW5zcG9ydHMgdGhhdCBhcmUgcmVhZGFibGUgZnJvbSBDIiIiCiAKLSAgIyBUT0RPKGRyZWlzcyk6IFRoaW5rIGFib3V0IGNoYW5naW5nIHRoaXMgaW50ZXJmYWNlIHRvIGFsbG93IHVzIHRvIHVzZQotICAjICAgICAgICAgICAgICAgYSAoUHl0aG9uLCBub3QgYykgU3RyaW5nSU8gaW5zdGVhZCwgYmVjYXVzZSBpdCBhbGxvd3MKLSAgIyAgICAgICAgICAgICAgIHlvdSB0byB3cml0ZSBhZnRlciByZWFkaW5nLgorICAgICMgVE9ETyhkcmVpc3MpOiBUaGluayBhYm91dCBjaGFuZ2luZyB0aGlzIGludGVyZmFjZSB0byBhbGxvdyB1cyB0byB1c2UKKyAgICAjICAgICAgICAgICAgICAgYSAoUHl0aG9uLCBub3QgYykgU3RyaW5nSU8gaW5zdGVhZCwgYmVjYXVzZSBpdCBhbGxvd3MKKyAgICAjICAgICAgICAgICAgICAgeW91IHRvIHdyaXRlIGFmdGVyIHJlYWRpbmcuCiAKLSAgIyBOT1RFOiBUaGlzIGlzIGEgY2xhc3NpYyBjbGFzcywgc28gcHJvcGVydGllcyB3aWxsIE5PVCB3b3JrCi0gICMgICAgICAgY29ycmVjdGx5IGZvciBzZXR0aW5nLgotICBAcHJvcGVydHkKLSAgZGVmIGNzdHJpbmdpb19idWYoc2VsZik6Ci0gICAgIiIiQSBjU3RyaW5nSU8gYnVmZmVyIHRoYXQgY29udGFpbnMgdGhlIGN1cnJlbnQgY2h1bmsgd2UgYXJlIHJlYWRpbmcuIiIiCi0gICAgcGFzcworICAgICMgTk9URTogVGhpcyBpcyBhIGNsYXNzaWMgY2xhc3MsIHNvIHByb3BlcnRpZXMgd2lsbCBOT1Qgd29yaworICAgICMgICAgICAgY29ycmVjdGx5IGZvciBzZXR0aW5nLgorICAgIEBwcm9wZXJ0eQorICAgIGRlZiBjc3RyaW5naW9fYnVmKHNlbGYpOgorICAgICAgICAiIiJBIGNTdHJpbmdJTyBidWZmZXIgdGhhdCBjb250YWlucyB0aGUgY3VycmVudCBjaHVuayB3ZSBhcmUgcmVhZGluZy4iIiIKKyAgICAgICAgcGFzcwogCi0gIGRlZiBjc3RyaW5naW9fcmVmaWxsKHNlbGYsIHBhcnRpYWxyZWFkLCByZXFsZW4pOgotICAgICIiIlJlZmlsbHMgY3N0cmluZ2lvX2J1Zi4KKyAgICBkZWYgY3N0cmluZ2lvX3JlZmlsbChzZWxmLCBwYXJ0aWFscmVhZCwgcmVxbGVuKToKKyAgICAgICAgIiIiUmVmaWxscyBjc3RyaW5naW9fYnVmLgogCi0gICAgUmV0dXJucyB0aGUgY3VycmVudGx5IHVzZWQgYnVmZmVyICh3aGljaCBjYW4gYnV0IG5lZWQgbm90IGJlIHRoZSBzYW1lIGFzCi0gICAgdGhlIG9sZCBjc3RyaW5naW9fYnVmKS4gcGFydGlhbHJlYWQgaXMgd2hhdCB0aGUgQyBjb2RlIGhhcyByZWFkIGZyb20gdGhlCi0gICAgYnVmZmVyLCBhbmQgc2hvdWxkIGJlIGluc2VydGVkIGludG8gdGhlIGJ1ZmZlciBiZWZvcmUgYW55IG1vcmUgcmVhZHMuICBUaGUKLSAgICByZXR1cm4gdmFsdWUgbXVzdCBiZSBhIG5ldywgbm90IGJvcnJvd2VkIHJlZmVyZW5jZS4gIFNvbWV0aGluZyBhbG9uZyB0aGUKLSAgICBsaW5lcyBvZiBzZWxmLl9idWYgc2hvdWxkIGJlIGZpbmUuCisgICAgICAgIFJldHVybnMgdGhlIGN1cnJlbnRseSB1c2VkIGJ1ZmZlciAod2hpY2ggY2FuIGJ1dCBuZWVkIG5vdCBiZSB0aGUgc2FtZSBhcworICAgICAgICB0aGUgb2xkIGNzdHJpbmdpb19idWYpLiBwYXJ0aWFscmVhZCBpcyB3aGF0IHRoZSBDIGNvZGUgaGFzIHJlYWQgZnJvbSB0aGUKKyAgICAgICAgYnVmZmVyLCBhbmQgc2hvdWxkIGJlIGluc2VydGVkIGludG8gdGhlIGJ1ZmZlciBiZWZvcmUgYW55IG1vcmUgcmVhZHMuICBUaGUKKyAgICAgICAgcmV0dXJuIHZhbHVlIG11c3QgYmUgYSBuZXcsIG5vdCBib3Jyb3dlZCByZWZlcmVuY2UuICBTb21ldGhpbmcgYWxvbmcgdGhlCisgICAgICAgIGxpbmVzIG9mIHNlbGYuX2J1ZiBzaG91bGQgYmUgZmluZS4KIAotICAgIElmIHJlcWxlbiBieXRlcyBjYW4ndCBiZSByZWFkLCB0aHJvdyBFT0ZFcnJvci4KLSAgICAiIiIKLSAgICBwYXNzCisgICAgICAgIElmIHJlcWxlbiBieXRlcyBjYW4ndCBiZSByZWFkLCB0aHJvdyBFT0ZFcnJvci4KKyAgICAgICAgIiIiCisgICAgICAgIHBhc3MKIAogCi1jbGFzcyBUU2VydmVyVHJhbnNwb3J0QmFzZToKLSAgIiIiQmFzZSBjbGFzcyBmb3IgVGhyaWZ0IHNlcnZlciB0cmFuc3BvcnRzLiIiIgorY2xhc3MgVFNlcnZlclRyYW5zcG9ydEJhc2Uob2JqZWN0KToKKyAgICAiIiJCYXNlIGNsYXNzIGZvciBUaHJpZnQgc2VydmVyIHRyYW5zcG9ydHMuIiIiCiAKLSAgZGVmIGxpc3RlbihzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIGxpc3RlbihzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiBhY2NlcHQoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiBhY2NlcHQoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgY2xvc2Uoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgcGFzcwogCiAKLWNsYXNzIFRUcmFuc3BvcnRGYWN0b3J5QmFzZToKLSAgIiIiQmFzZSBjbGFzcyBmb3IgYSBUcmFuc3BvcnQgRmFjdG9yeSIiIgorY2xhc3MgVFRyYW5zcG9ydEZhY3RvcnlCYXNlKG9iamVjdCk6CisgICAgIiIiQmFzZSBjbGFzcyBmb3IgYSBUcmFuc3BvcnQgRmFjdG9yeSIiIgogCi0gIGRlZiBnZXRUcmFuc3BvcnQoc2VsZiwgdHJhbnMpOgotICAgIHJldHVybiB0cmFucworICAgIGRlZiBnZXRUcmFuc3BvcnQoc2VsZiwgdHJhbnMpOgorICAgICAgICByZXR1cm4gdHJhbnMKIAogCi1jbGFzcyBUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5OgotICAiIiJGYWN0b3J5IHRyYW5zcG9ydCB0aGF0IGJ1aWxkcyBidWZmZXJlZCB0cmFuc3BvcnRzIiIiCitjbGFzcyBUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KG9iamVjdCk6CisgICAgIiIiRmFjdG9yeSB0cmFuc3BvcnQgdGhhdCBidWlsZHMgYnVmZmVyZWQgdHJhbnNwb3J0cyIiIgogCi0gIGRlZiBnZXRUcmFuc3BvcnQoc2VsZiwgdHJhbnMpOgotICAgIGJ1ZmZlcmVkID0gVEJ1ZmZlcmVkVHJhbnNwb3J0KHRyYW5zKQotICAgIHJldHVybiBidWZmZXJlZAorICAgIGRlZiBnZXRUcmFuc3BvcnQoc2VsZiwgdHJhbnMpOgorICAgICAgICBidWZmZXJlZCA9IFRCdWZmZXJlZFRyYW5zcG9ydCh0cmFucykKKyAgICAgICAgcmV0dXJuIGJ1ZmZlcmVkCiAKIAogY2xhc3MgVEJ1ZmZlcmVkVHJhbnNwb3J0KFRUcmFuc3BvcnRCYXNlLCBDUmVhZGFibGVUcmFuc3BvcnQpOgotICAiIiJDbGFzcyB0aGF0IHdyYXBzIGFub3RoZXIgdHJhbnNwb3J0IGFuZCBidWZmZXJzIGl0cyBJL08uCisgICAgIiIiQ2xhc3MgdGhhdCB3cmFwcyBhbm90aGVyIHRyYW5zcG9ydCBhbmQgYnVmZmVycyBpdHMgSS9PLgogCi0gIFRoZSBpbXBsZW1lbnRhdGlvbiB1c2VzIGEgKGNvbmZpZ3VyYWJsZSkgZml4ZWQtc2l6ZSByZWFkIGJ1ZmZlcgotICBidXQgYnVmZmVycyBhbGwgd3JpdGVzIHVudGlsIGEgZmx1c2ggaXMgcGVyZm9ybWVkLgotICAiIiIKLSAgREVGQVVMVF9CVUZGRVIgPSA0MDk2CisgICAgVGhlIGltcGxlbWVudGF0aW9uIHVzZXMgYSAoY29uZmlndXJhYmxlKSBmaXhlZC1zaXplIHJlYWQgYnVmZmVyCisgICAgYnV0IGJ1ZmZlcnMgYWxsIHdyaXRlcyB1bnRpbCBhIGZsdXNoIGlzIHBlcmZvcm1lZC4KKyAgICAiIiIKKyAgICBERUZBVUxUX0JVRkZFUiA9IDQwOTYKIAotICBkZWYgX19pbml0X18oc2VsZiwgdHJhbnMsIHJidWZfc2l6ZT1ERUZBVUxUX0JVRkZFUik6Ci0gICAgc2VsZi5fX3RyYW5zID0gdHJhbnMKLSAgICBzZWxmLl9fd2J1ZiA9IFN0cmluZ0lPKCkKLSAgICBzZWxmLl9fcmJ1ZiA9IFN0cmluZ0lPKCIiKQotICAgIHNlbGYuX19yYnVmX3NpemUgPSByYnVmX3NpemUKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdHJhbnMsIHJidWZfc2l6ZT1ERUZBVUxUX0JVRkZFUik6CisgICAgICAgIHNlbGYuX190cmFucyA9IHRyYW5zCisgICAgICAgIHNlbGYuX193YnVmID0gQnVmZmVySU8oKQorICAgICAgICAjIFBhc3Mgc3RyaW5nIGFyZ3VtZW50IHRvIGluaXRpYWxpemUgcmVhZCBidWZmZXIgYXMgY1N0cmluZ0lPLklucHV0VHlwZQorICAgICAgICBzZWxmLl9fcmJ1ZiA9IEJ1ZmZlcklPKGInJykKKyAgICAgICAgc2VsZi5fX3JidWZfc2l6ZSA9IHJidWZfc2l6ZQogCi0gIGRlZiBpc09wZW4oc2VsZik6Ci0gICAgcmV0dXJuIHNlbGYuX190cmFucy5pc09wZW4oKQorICAgIGRlZiBpc09wZW4oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9fdHJhbnMuaXNPcGVuKCkKIAotICBkZWYgb3BlbihzZWxmKToKLSAgICByZXR1cm4gc2VsZi5fX3RyYW5zLm9wZW4oKQorICAgIGRlZiBvcGVuKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fX3RyYW5zLm9wZW4oKQogCi0gIGRlZiBjbG9zZShzZWxmKToKLSAgICByZXR1cm4gc2VsZi5fX3RyYW5zLmNsb3NlKCkKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9fdHJhbnMuY2xvc2UoKQogCi0gIGRlZiByZWFkKHNlbGYsIHN6KToKLSAgICByZXQgPSBzZWxmLl9fcmJ1Zi5yZWFkKHN6KQotICAgIGlmIGxlbihyZXQpICE9IDA6Ci0gICAgICByZXR1cm4gcmV0CisgICAgZGVmIHJlYWQoc2VsZiwgc3opOgorICAgICAgICByZXQgPSBzZWxmLl9fcmJ1Zi5yZWFkKHN6KQorICAgICAgICBpZiBsZW4ocmV0KSAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHJldAorICAgICAgICBzZWxmLl9fcmJ1ZiA9IEJ1ZmZlcklPKHNlbGYuX190cmFucy5yZWFkKG1heChzeiwgc2VsZi5fX3JidWZfc2l6ZSkpKQorICAgICAgICByZXR1cm4gc2VsZi5fX3JidWYucmVhZChzeikKIAotICAgIHNlbGYuX19yYnVmID0gU3RyaW5nSU8oc2VsZi5fX3RyYW5zLnJlYWQobWF4KHN6LCBzZWxmLl9fcmJ1Zl9zaXplKSkpCi0gICAgcmV0dXJuIHNlbGYuX19yYnVmLnJlYWQoc3opCisgICAgZGVmIHdyaXRlKHNlbGYsIGJ1Zik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuX193YnVmLndyaXRlKGJ1ZikKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgorICAgICAgICAgICAgIyBvbiBleGNlcHRpb24gcmVzZXQgd2J1ZiBzbyBpdCBkb2Vzbid0IGNvbnRhaW4gYSBwYXJ0aWFsIGZ1bmN0aW9uIGNhbGwKKyAgICAgICAgICAgIHNlbGYuX193YnVmID0gQnVmZmVySU8oKQorICAgICAgICAgICAgcmFpc2UgZQogCi0gIGRlZiB3cml0ZShzZWxmLCBidWYpOgotICAgIHNlbGYuX193YnVmLndyaXRlKGJ1ZikKKyAgICBkZWYgZmx1c2goc2VsZik6CisgICAgICAgIG91dCA9IHNlbGYuX193YnVmLmdldHZhbHVlKCkKKyAgICAgICAgIyByZXNldCB3YnVmIGJlZm9yZSB3cml0ZS9mbHVzaCB0byBwcmVzZXJ2ZSBzdGF0ZSBvbiB1bmRlcmx5aW5nIGZhaWx1cmUKKyAgICAgICAgc2VsZi5fX3didWYgPSBCdWZmZXJJTygpCisgICAgICAgIHNlbGYuX190cmFucy53cml0ZShvdXQpCisgICAgICAgIHNlbGYuX190cmFucy5mbHVzaCgpCiAKLSAgZGVmIGZsdXNoKHNlbGYpOgotICAgIG91dCA9IHNlbGYuX193YnVmLmdldHZhbHVlKCkKLSAgICAjIHJlc2V0IHdidWYgYmVmb3JlIHdyaXRlL2ZsdXNoIHRvIHByZXNlcnZlIHN0YXRlIG9uIHVuZGVybHlpbmcgZmFpbHVyZQotICAgIHNlbGYuX193YnVmID0gU3RyaW5nSU8oKQotICAgIHNlbGYuX190cmFucy53cml0ZShvdXQpCi0gICAgc2VsZi5fX3RyYW5zLmZsdXNoKCkKKyAgICAjIEltcGxlbWVudCB0aGUgQ1JlYWRhYmxlVHJhbnNwb3J0IGludGVyZmFjZS4KKyAgICBAcHJvcGVydHkKKyAgICBkZWYgY3N0cmluZ2lvX2J1ZihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX19yYnVmCiAKLSAgIyBJbXBsZW1lbnQgdGhlIENSZWFkYWJsZVRyYW5zcG9ydCBpbnRlcmZhY2UuCi0gIEBwcm9wZXJ0eQotICBkZWYgY3N0cmluZ2lvX2J1ZihzZWxmKToKLSAgICByZXR1cm4gc2VsZi5fX3JidWYKKyAgICBkZWYgY3N0cmluZ2lvX3JlZmlsbChzZWxmLCBwYXJ0aWFscmVhZCwgcmVxbGVuKToKKyAgICAgICAgcmV0c3RyaW5nID0gcGFydGlhbHJlYWQKKyAgICAgICAgaWYgcmVxbGVuIDwgc2VsZi5fX3JidWZfc2l6ZToKKyAgICAgICAgICAgICMgdHJ5IHRvIG1ha2UgYSByZWFkIG9mIGFzIG11Y2ggYXMgd2UgY2FuLgorICAgICAgICAgICAgcmV0c3RyaW5nICs9IHNlbGYuX190cmFucy5yZWFkKHNlbGYuX19yYnVmX3NpemUpCiAKLSAgZGVmIGNzdHJpbmdpb19yZWZpbGwoc2VsZiwgcGFydGlhbHJlYWQsIHJlcWxlbik6Ci0gICAgcmV0c3RyaW5nID0gcGFydGlhbHJlYWQKLSAgICBpZiByZXFsZW4gPCBzZWxmLl9fcmJ1Zl9zaXplOgotICAgICAgIyB0cnkgdG8gbWFrZSBhIHJlYWQgb2YgYXMgbXVjaCBhcyB3ZSBjYW4uCi0gICAgICByZXRzdHJpbmcgKz0gc2VsZi5fX3RyYW5zLnJlYWQoc2VsZi5fX3JidWZfc2l6ZSkKKyAgICAgICAgIyBidXQgbWFrZSBzdXJlIHdlIGRvIHJlYWQgcmVxbGVuIGJ5dGVzLgorICAgICAgICBpZiBsZW4ocmV0c3RyaW5nKSA8IHJlcWxlbjoKKyAgICAgICAgICAgIHJldHN0cmluZyArPSBzZWxmLl9fdHJhbnMucmVhZEFsbChyZXFsZW4gLSBsZW4ocmV0c3RyaW5nKSkKIAotICAgICMgYnV0IG1ha2Ugc3VyZSB3ZSBkbyByZWFkIHJlcWxlbiBieXRlcy4KLSAgICBpZiBsZW4ocmV0c3RyaW5nKSA8IHJlcWxlbjoKLSAgICAgIHJldHN0cmluZyArPSBzZWxmLl9fdHJhbnMucmVhZEFsbChyZXFsZW4gLSBsZW4ocmV0c3RyaW5nKSkKLQotICAgIHNlbGYuX19yYnVmID0gU3RyaW5nSU8ocmV0c3RyaW5nKQotICAgIHJldHVybiBzZWxmLl9fcmJ1ZgorICAgICAgICBzZWxmLl9fcmJ1ZiA9IEJ1ZmZlcklPKHJldHN0cmluZykKKyAgICAgICAgcmV0dXJuIHNlbGYuX19yYnVmCiAKIAogY2xhc3MgVE1lbW9yeUJ1ZmZlcihUVHJhbnNwb3J0QmFzZSwgQ1JlYWRhYmxlVHJhbnNwb3J0KToKLSAgIiIiV3JhcHMgYSBjU3RyaW5nSU8gb2JqZWN0IGFzIGEgVFRyYW5zcG9ydC4KKyAgICAiIiJXcmFwcyBhIGNCeXRlc0lPIG9iamVjdCBhcyBhIFRUcmFuc3BvcnQuCiAKLSAgTk9URTogVW5saWtlIHRoZSBDKysgdmVyc2lvbiBvZiB0aGlzIGNsYXNzLCB5b3UgY2Fubm90IHdyaXRlIHRvIGl0Ci0gICAgICAgIHRoZW4gaW1tZWRpYXRlbHkgcmVhZCBmcm9tIGl0LiAgSWYgeW91IHdhbnQgdG8gcmVhZCBmcm9tIGEKLSAgICAgICAgVE1lbW9yeUJ1ZmZlciwgeW91IG11c3QgZWl0aGVyIHBhc3MgYSBzdHJpbmcgdG8gdGhlIGNvbnN0cnVjdG9yLgotICBUT0RPKGRyZWlzcyk6IE1ha2UgdGhpcyB3b3JrIGxpa2UgdGhlIEMrKyB2ZXJzaW9uLgotICAiIiIKKyAgICBOT1RFOiBVbmxpa2UgdGhlIEMrKyB2ZXJzaW9uIG9mIHRoaXMgY2xhc3MsIHlvdSBjYW5ub3Qgd3JpdGUgdG8gaXQKKyAgICAgICAgICB0aGVuIGltbWVkaWF0ZWx5IHJlYWQgZnJvbSBpdC4gIElmIHlvdSB3YW50IHRvIHJlYWQgZnJvbSBhCisgICAgICAgICAgVE1lbW9yeUJ1ZmZlciwgeW91IG11c3QgZWl0aGVyIHBhc3MgYSBzdHJpbmcgdG8gdGhlIGNvbnN0cnVjdG9yLgorICAgIFRPRE8oZHJlaXNzKTogTWFrZSB0aGlzIHdvcmsgbGlrZSB0aGUgQysrIHZlcnNpb24uCisgICAgIiIiCiAKLSAgZGVmIF9faW5pdF9fKHNlbGYsIHZhbHVlPU5vbmUpOgotICAgICIiInZhbHVlIC0tIGEgdmFsdWUgdG8gcmVhZCBmcm9tIGZvciBzdHJpbmdpbworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2YWx1ZT1Ob25lLCBvZmZzZXQ9MCk6CisgICAgICAgICIiInZhbHVlIC0tIGEgdmFsdWUgdG8gcmVhZCBmcm9tIGZvciBzdHJpbmdpbwogCi0gICAgSWYgdmFsdWUgaXMgc2V0LCB0aGlzIHdpbGwgYmUgYSB0cmFuc3BvcnQgZm9yIHJlYWRpbmcsCi0gICAgb3RoZXJ3aXNlLCBpdCBpcyBmb3Igd3JpdGluZyIiIgotICAgIGlmIHZhbHVlIGlzIG5vdCBOb25lOgotICAgICAgc2VsZi5fYnVmZmVyID0gU3RyaW5nSU8odmFsdWUpCi0gICAgZWxzZToKLSAgICAgIHNlbGYuX2J1ZmZlciA9IFN0cmluZ0lPKCkKKyAgICAgICAgSWYgdmFsdWUgaXMgc2V0LCB0aGlzIHdpbGwgYmUgYSB0cmFuc3BvcnQgZm9yIHJlYWRpbmcsCisgICAgICAgIG90aGVyd2lzZSwgaXQgaXMgZm9yIHdyaXRpbmciIiIKKyAgICAgICAgaWYgdmFsdWUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLl9idWZmZXIgPSBCdWZmZXJJTyh2YWx1ZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX2J1ZmZlciA9IEJ1ZmZlcklPKCkKKyAgICAgICAgaWYgb2Zmc2V0OgorICAgICAgICAgICAgc2VsZi5fYnVmZmVyLnNlZWsob2Zmc2V0KQogCi0gIGRlZiBpc09wZW4oc2VsZik6Ci0gICAgcmV0dXJuIG5vdCBzZWxmLl9idWZmZXIuY2xvc2VkCisgICAgZGVmIGlzT3BlbihzZWxmKToKKyAgICAgICAgcmV0dXJuIG5vdCBzZWxmLl9idWZmZXIuY2xvc2VkCiAKLSAgZGVmIG9wZW4oc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiBvcGVuKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIGNsb3NlKHNlbGYpOgotICAgIHNlbGYuX2J1ZmZlci5jbG9zZSgpCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBzZWxmLl9idWZmZXIuY2xvc2UoKQogCi0gIGRlZiByZWFkKHNlbGYsIHN6KToKLSAgICByZXR1cm4gc2VsZi5fYnVmZmVyLnJlYWQoc3opCisgICAgZGVmIHJlYWQoc2VsZiwgc3opOgorICAgICAgICByZXR1cm4gc2VsZi5fYnVmZmVyLnJlYWQoc3opCiAKLSAgZGVmIHdyaXRlKHNlbGYsIGJ1Zik6Ci0gICAgc2VsZi5fYnVmZmVyLndyaXRlKGJ1ZikKKyAgICBkZWYgd3JpdGUoc2VsZiwgYnVmKToKKyAgICAgICAgc2VsZi5fYnVmZmVyLndyaXRlKGJ1ZikKIAotICBkZWYgZmx1c2goc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiBmbHVzaChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiBnZXR2YWx1ZShzZWxmKToKLSAgICByZXR1cm4gc2VsZi5fYnVmZmVyLmdldHZhbHVlKCkKKyAgICBkZWYgZ2V0dmFsdWUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9idWZmZXIuZ2V0dmFsdWUoKQogCi0gICMgSW1wbGVtZW50IHRoZSBDUmVhZGFibGVUcmFuc3BvcnQgaW50ZXJmYWNlLgotICBAcHJvcGVydHkKLSAgZGVmIGNzdHJpbmdpb19idWYoc2VsZik6Ci0gICAgcmV0dXJuIHNlbGYuX2J1ZmZlcgorICAgICMgSW1wbGVtZW50IHRoZSBDUmVhZGFibGVUcmFuc3BvcnQgaW50ZXJmYWNlLgorICAgIEBwcm9wZXJ0eQorICAgIGRlZiBjc3RyaW5naW9fYnVmKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fYnVmZmVyCiAKLSAgZGVmIGNzdHJpbmdpb19yZWZpbGwoc2VsZiwgcGFydGlhbHJlYWQsIHJlcWxlbik6Ci0gICAgIyBvbmx5IG9uZSBzaG90IGF0IHJlYWRpbmcuLi4KLSAgICByYWlzZSBFT0ZFcnJvcigpCisgICAgZGVmIGNzdHJpbmdpb19yZWZpbGwoc2VsZiwgcGFydGlhbHJlYWQsIHJlcWxlbik6CisgICAgICAgICMgb25seSBvbmUgc2hvdCBhdCByZWFkaW5nLi4uCisgICAgICAgIHJhaXNlIEVPRkVycm9yKCkKIAogCi1jbGFzcyBURnJhbWVkVHJhbnNwb3J0RmFjdG9yeToKLSAgIiIiRmFjdG9yeSB0cmFuc3BvcnQgdGhhdCBidWlsZHMgZnJhbWVkIHRyYW5zcG9ydHMiIiIKK2NsYXNzIFRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5KG9iamVjdCk6CisgICAgIiIiRmFjdG9yeSB0cmFuc3BvcnQgdGhhdCBidWlsZHMgZnJhbWVkIHRyYW5zcG9ydHMiIiIKIAotICBkZWYgZ2V0VHJhbnNwb3J0KHNlbGYsIHRyYW5zKToKLSAgICBmcmFtZWQgPSBURnJhbWVkVHJhbnNwb3J0KHRyYW5zKQotICAgIHJldHVybiBmcmFtZWQKKyAgICBkZWYgZ2V0VHJhbnNwb3J0KHNlbGYsIHRyYW5zKToKKyAgICAgICAgZnJhbWVkID0gVEZyYW1lZFRyYW5zcG9ydCh0cmFucykKKyAgICAgICAgcmV0dXJuIGZyYW1lZAogCiAKIGNsYXNzIFRGcmFtZWRUcmFuc3BvcnQoVFRyYW5zcG9ydEJhc2UsIENSZWFkYWJsZVRyYW5zcG9ydCk6Ci0gICIiIkNsYXNzIHRoYXQgd3JhcHMgYW5vdGhlciB0cmFuc3BvcnQgYW5kIGZyYW1lcyBpdHMgSS9PIHdoZW4gd3JpdGluZy4iIiIKKyAgICAiIiJDbGFzcyB0aGF0IHdyYXBzIGFub3RoZXIgdHJhbnNwb3J0IGFuZCBmcmFtZXMgaXRzIEkvTyB3aGVuIHdyaXRpbmcuIiIiCiAKLSAgZGVmIF9faW5pdF9fKHNlbGYsIHRyYW5zLCk6Ci0gICAgc2VsZi5fX3RyYW5zID0gdHJhbnMKLSAgICBzZWxmLl9fcmJ1ZiA9IFN0cmluZ0lPKCkKLSAgICBzZWxmLl9fd2J1ZiA9IFN0cmluZ0lPKCkKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdHJhbnMsKToKKyAgICAgICAgc2VsZi5fX3RyYW5zID0gdHJhbnMKKyAgICAgICAgc2VsZi5fX3JidWYgPSBCdWZmZXJJTyhiJycpCisgICAgICAgIHNlbGYuX193YnVmID0gQnVmZmVySU8oKQogCi0gIGRlZiBpc09wZW4oc2VsZik6Ci0gICAgcmV0dXJuIHNlbGYuX190cmFucy5pc09wZW4oKQorICAgIGRlZiBpc09wZW4oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9fdHJhbnMuaXNPcGVuKCkKIAotICBkZWYgb3BlbihzZWxmKToKLSAgICByZXR1cm4gc2VsZi5fX3RyYW5zLm9wZW4oKQorICAgIGRlZiBvcGVuKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fX3RyYW5zLm9wZW4oKQogCi0gIGRlZiBjbG9zZShzZWxmKToKLSAgICByZXR1cm4gc2VsZi5fX3RyYW5zLmNsb3NlKCkKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9fdHJhbnMuY2xvc2UoKQogCi0gIGRlZiByZWFkKHNlbGYsIHN6KToKLSAgICByZXQgPSBzZWxmLl9fcmJ1Zi5yZWFkKHN6KQotICAgIGlmIGxlbihyZXQpICE9IDA6Ci0gICAgICByZXR1cm4gcmV0CisgICAgZGVmIHJlYWQoc2VsZiwgc3opOgorICAgICAgICByZXQgPSBzZWxmLl9fcmJ1Zi5yZWFkKHN6KQorICAgICAgICBpZiBsZW4ocmV0KSAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHJldAogCi0gICAgc2VsZi5yZWFkRnJhbWUoKQotICAgIHJldHVybiBzZWxmLl9fcmJ1Zi5yZWFkKHN6KQorICAgICAgICBzZWxmLnJlYWRGcmFtZSgpCisgICAgICAgIHJldHVybiBzZWxmLl9fcmJ1Zi5yZWFkKHN6KQogCi0gIGRlZiByZWFkRnJhbWUoc2VsZik6Ci0gICAgYnVmZiA9IHNlbGYuX190cmFucy5yZWFkQWxsKDQpCi0gICAgc3osID0gdW5wYWNrKCchaScsIGJ1ZmYpCi0gICAgc2VsZi5fX3JidWYgPSBTdHJpbmdJTyhzZWxmLl9fdHJhbnMucmVhZEFsbChzeikpCisgICAgZGVmIHJlYWRGcmFtZShzZWxmKToKKyAgICAgICAgYnVmZiA9IHNlbGYuX190cmFucy5yZWFkQWxsKDQpCisgICAgICAgIHN6LCA9IHVucGFjaygnIWknLCBidWZmKQorICAgICAgICBzZWxmLl9fcmJ1ZiA9IEJ1ZmZlcklPKHNlbGYuX190cmFucy5yZWFkQWxsKHN6KSkKIAotICBkZWYgd3JpdGUoc2VsZiwgYnVmKToKLSAgICBzZWxmLl9fd2J1Zi53cml0ZShidWYpCisgICAgZGVmIHdyaXRlKHNlbGYsIGJ1Zik6CisgICAgICAgIHNlbGYuX193YnVmLndyaXRlKGJ1ZikKIAotICBkZWYgZmx1c2goc2VsZik6Ci0gICAgd291dCA9IHNlbGYuX193YnVmLmdldHZhbHVlKCkKLSAgICB3c3ogPSBsZW4od291dCkKLSAgICAjIHJlc2V0IHdidWYgYmVmb3JlIHdyaXRlL2ZsdXNoIHRvIHByZXNlcnZlIHN0YXRlIG9uIHVuZGVybHlpbmcgZmFpbHVyZQotICAgIHNlbGYuX193YnVmID0gU3RyaW5nSU8oKQotICAgICMgTi5CLjogRG9pbmcgdGhpcyBzdHJpbmcgY29uY2F0ZW5hdGlvbiBpcyBXQVkgY2hlYXBlciB0aGFuIG1ha2luZwotICAgICMgdHdvIHNlcGFyYXRlIGNhbGxzIHRvIHRoZSB1bmRlcmx5aW5nIHNvY2tldCBvYmplY3QuIFNvY2tldCB3cml0ZXMgaW4KLSAgICAjIFB5dGhvbiB0dXJuIG91dCB0byBiZSBSRUFMTFkgZXhwZW5zaXZlLCBidXQgaXQgc2VlbXMgdG8gZG8gYSBwcmV0dHkKLSAgICAjIGdvb2Qgam9iIG9mIG1hbmFnaW5nIHN0cmluZyBidWZmZXIgb3BlcmF0aW9ucyB3aXRob3V0IGV4Y2Vzc2l2ZSBjb3BpZXMKLSAgICBidWYgPSBwYWNrKCIhaSIsIHdzeikgKyB3b3V0Ci0gICAgc2VsZi5fX3RyYW5zLndyaXRlKGJ1ZikKLSAgICBzZWxmLl9fdHJhbnMuZmx1c2goKQorICAgIGRlZiBmbHVzaChzZWxmKToKKyAgICAgICAgd291dCA9IHNlbGYuX193YnVmLmdldHZhbHVlKCkKKyAgICAgICAgd3N6ID0gbGVuKHdvdXQpCisgICAgICAgICMgcmVzZXQgd2J1ZiBiZWZvcmUgd3JpdGUvZmx1c2ggdG8gcHJlc2VydmUgc3RhdGUgb24gdW5kZXJseWluZyBmYWlsdXJlCisgICAgICAgIHNlbGYuX193YnVmID0gQnVmZmVySU8oKQorICAgICAgICAjIE4uQi46IERvaW5nIHRoaXMgc3RyaW5nIGNvbmNhdGVuYXRpb24gaXMgV0FZIGNoZWFwZXIgdGhhbiBtYWtpbmcKKyAgICAgICAgIyB0d28gc2VwYXJhdGUgY2FsbHMgdG8gdGhlIHVuZGVybHlpbmcgc29ja2V0IG9iamVjdC4gU29ja2V0IHdyaXRlcyBpbgorICAgICAgICAjIFB5dGhvbiB0dXJuIG91dCB0byBiZSBSRUFMTFkgZXhwZW5zaXZlLCBidXQgaXQgc2VlbXMgdG8gZG8gYSBwcmV0dHkKKyAgICAgICAgIyBnb29kIGpvYiBvZiBtYW5hZ2luZyBzdHJpbmcgYnVmZmVyIG9wZXJhdGlvbnMgd2l0aG91dCBleGNlc3NpdmUgY29waWVzCisgICAgICAgIGJ1ZiA9IHBhY2soIiFpIiwgd3N6KSArIHdvdXQKKyAgICAgICAgc2VsZi5fX3RyYW5zLndyaXRlKGJ1ZikKKyAgICAgICAgc2VsZi5fX3RyYW5zLmZsdXNoKCkKIAotICAjIEltcGxlbWVudCB0aGUgQ1JlYWRhYmxlVHJhbnNwb3J0IGludGVyZmFjZS4KLSAgQHByb3BlcnR5Ci0gIGRlZiBjc3RyaW5naW9fYnVmKHNlbGYpOgotICAgIHJldHVybiBzZWxmLl9fcmJ1ZgorICAgICMgSW1wbGVtZW50IHRoZSBDUmVhZGFibGVUcmFuc3BvcnQgaW50ZXJmYWNlLgorICAgIEBwcm9wZXJ0eQorICAgIGRlZiBjc3RyaW5naW9fYnVmKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fX3JidWYKIAotICBkZWYgY3N0cmluZ2lvX3JlZmlsbChzZWxmLCBwcmVmaXgsIHJlcWxlbik6Ci0gICAgIyBzZWxmLl9fcmJ1ZiB3aWxsIGFscmVhZHkgYmUgZW1wdHkgaGVyZSBiZWNhdXNlIGZhc3RiaW5hcnkgZG9lc24ndAotICAgICMgYXNrIGZvciBhIHJlZmlsbCB1bnRpbCB0aGUgcHJldmlvdXMgYnVmZmVyIGlzIGVtcHR5LiAgVGhlcmVmb3JlLAotICAgICMgd2UgY2FuIHN0YXJ0IHJlYWRpbmcgbmV3IGZyYW1lcyBpbW1lZGlhdGVseS4KLSAgICB3aGlsZSBsZW4ocHJlZml4KSA8IHJlcWxlbjoKLSAgICAgIHNlbGYucmVhZEZyYW1lKCkKLSAgICAgIHByZWZpeCArPSBzZWxmLl9fcmJ1Zi5nZXR2YWx1ZSgpCi0gICAgc2VsZi5fX3JidWYgPSBTdHJpbmdJTyhwcmVmaXgpCi0gICAgcmV0dXJuIHNlbGYuX19yYnVmCisgICAgZGVmIGNzdHJpbmdpb19yZWZpbGwoc2VsZiwgcHJlZml4LCByZXFsZW4pOgorICAgICAgICAjIHNlbGYuX19yYnVmIHdpbGwgYWxyZWFkeSBiZSBlbXB0eSBoZXJlIGJlY2F1c2UgZmFzdGJpbmFyeSBkb2Vzbid0CisgICAgICAgICMgYXNrIGZvciBhIHJlZmlsbCB1bnRpbCB0aGUgcHJldmlvdXMgYnVmZmVyIGlzIGVtcHR5LiAgVGhlcmVmb3JlLAorICAgICAgICAjIHdlIGNhbiBzdGFydCByZWFkaW5nIG5ldyBmcmFtZXMgaW1tZWRpYXRlbHkuCisgICAgICAgIHdoaWxlIGxlbihwcmVmaXgpIDwgcmVxbGVuOgorICAgICAgICAgICAgc2VsZi5yZWFkRnJhbWUoKQorICAgICAgICAgICAgcHJlZml4ICs9IHNlbGYuX19yYnVmLmdldHZhbHVlKCkKKyAgICAgICAgc2VsZi5fX3JidWYgPSBCdWZmZXJJTyhwcmVmaXgpCisgICAgICAgIHJldHVybiBzZWxmLl9fcmJ1ZgogCiAKIGNsYXNzIFRGaWxlT2JqZWN0VHJhbnNwb3J0KFRUcmFuc3BvcnRCYXNlKToKLSAgIiIiV3JhcHMgYSBmaWxlLWxpa2Ugb2JqZWN0IHRvIG1ha2UgaXQgd29yayBhcyBhIFRocmlmdCB0cmFuc3BvcnQuIiIiCisgICAgIiIiV3JhcHMgYSBmaWxlLWxpa2Ugb2JqZWN0IHRvIG1ha2UgaXQgd29yayBhcyBhIFRocmlmdCB0cmFuc3BvcnQuIiIiCiAKLSAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGVvYmopOgotICAgIHNlbGYuZmlsZW9iaiA9IGZpbGVvYmoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZW9iaik6CisgICAgICAgIHNlbGYuZmlsZW9iaiA9IGZpbGVvYmoKIAotICBkZWYgaXNPcGVuKHNlbGYpOgotICAgIHJldHVybiBUcnVlCisgICAgZGVmIGlzT3BlbihzZWxmKToKKyAgICAgICAgcmV0dXJuIFRydWUKIAotICBkZWYgY2xvc2Uoc2VsZik6Ci0gICAgc2VsZi5maWxlb2JqLmNsb3NlKCkKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIHNlbGYuZmlsZW9iai5jbG9zZSgpCiAKLSAgZGVmIHJlYWQoc2VsZiwgc3opOgotICAgIHJldHVybiBzZWxmLmZpbGVvYmoucmVhZChzeikKKyAgICBkZWYgcmVhZChzZWxmLCBzeik6CisgICAgICAgIHJldHVybiBzZWxmLmZpbGVvYmoucmVhZChzeikKIAotICBkZWYgd3JpdGUoc2VsZiwgYnVmKToKLSAgICBzZWxmLmZpbGVvYmoud3JpdGUoYnVmKQorICAgIGRlZiB3cml0ZShzZWxmLCBidWYpOgorICAgICAgICBzZWxmLmZpbGVvYmoud3JpdGUoYnVmKQogCi0gIGRlZiBmbHVzaChzZWxmKToKLSAgICBzZWxmLmZpbGVvYmouZmx1c2goKQorICAgIGRlZiBmbHVzaChzZWxmKToKKyAgICAgICAgc2VsZi5maWxlb2JqLmZsdXNoKCkKIAogCiBjbGFzcyBUU2FzbENsaWVudFRyYW5zcG9ydChUVHJhbnNwb3J0QmFzZSwgQ1JlYWRhYmxlVHJhbnNwb3J0KToKLSAgIiIiCi0gIFNBU0wgdHJhbnNwb3J0IAotICAiIiIKLQotICBTVEFSVCA9IDEKLSAgT0sgPSAyCi0gIEJBRCA9IDMKLSAgRVJST1IgPSA0Ci0gIENPTVBMRVRFID0gNQotCi0gIGRlZiBfX2luaXRfXyhzZWxmLCB0cmFuc3BvcnQsIGhvc3QsIHNlcnZpY2UsIG1lY2hhbmlzbT0nR1NTQVBJJywKLSAgICAgICoqc2FzbF9rd2FyZ3MpOgogICAgICIiIgotICAgIHRyYW5zcG9ydDogYW4gdW5kZXJseWluZyB0cmFuc3BvcnQgdG8gdXNlLCB0eXBpY2FsbHkganVzdCBhIFRTb2NrZXQKLSAgICBob3N0OiB0aGUgbmFtZSBvZiB0aGUgc2VydmVyLCBmcm9tIGEgU0FTTCBwZXJzcGVjdGl2ZQotICAgIHNlcnZpY2U6IHRoZSBuYW1lIG9mIHRoZSBzZXJ2ZXIncyBzZXJ2aWNlLCBmcm9tIGEgU0FTTCBwZXJzcGVjdGl2ZQotICAgIG1lY2hhbmlzbTogdGhlIG5hbWUgb2YgdGhlIHByZWZlcnJlZCBtZWNoYW5pc20gdG8gdXNlCi0KLSAgICBBbGwgb3RoZXIga3dhcmdzIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBwdXJlc2FzbC5jbGllbnQuU0FTTENsaWVudAotICAgIGNvbnN0cnVjdG9yLgorICAgIFNBU0wgdHJhbnNwb3J0CiAgICAgIiIiCiAKLSAgICBmcm9tIHB1cmVzYXNsLmNsaWVudCBpbXBvcnQgU0FTTENsaWVudAorICAgIFNUQVJUID0gMQorICAgIE9LID0gMgorICAgIEJBRCA9IDMKKyAgICBFUlJPUiA9IDQKKyAgICBDT01QTEVURSA9IDUKIAotICAgIHNlbGYudHJhbnNwb3J0ID0gdHJhbnNwb3J0Ci0gICAgc2VsZi5zYXNsID0gU0FTTENsaWVudChob3N0LCBzZXJ2aWNlLCBtZWNoYW5pc20sICoqc2FzbF9rd2FyZ3MpCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRyYW5zcG9ydCwgaG9zdCwgc2VydmljZSwgbWVjaGFuaXNtPSdHU1NBUEknLAorICAgICAgICAgICAgICAgICAqKnNhc2xfa3dhcmdzKToKKyAgICAgICAgIiIiCisgICAgICAgIHRyYW5zcG9ydDogYW4gdW5kZXJseWluZyB0cmFuc3BvcnQgdG8gdXNlLCB0eXBpY2FsbHkganVzdCBhIFRTb2NrZXQKKyAgICAgICAgaG9zdDogdGhlIG5hbWUgb2YgdGhlIHNlcnZlciwgZnJvbSBhIFNBU0wgcGVyc3BlY3RpdmUKKyAgICAgICAgc2VydmljZTogdGhlIG5hbWUgb2YgdGhlIHNlcnZlcidzIHNlcnZpY2UsIGZyb20gYSBTQVNMIHBlcnNwZWN0aXZlCisgICAgICAgIG1lY2hhbmlzbTogdGhlIG5hbWUgb2YgdGhlIHByZWZlcnJlZCBtZWNoYW5pc20gdG8gdXNlCiAKLSAgICBzZWxmLl9fd2J1ZiA9IFN0cmluZ0lPKCkKLSAgICBzZWxmLl9fcmJ1ZiA9IFN0cmluZ0lPKCkKKyAgICAgICAgQWxsIG90aGVyIGt3YXJncyB3aWxsIGJlIHBhc3NlZCB0byB0aGUgcHVyZXNhc2wuY2xpZW50LlNBU0xDbGllbnQKKyAgICAgICAgY29uc3RydWN0b3IuCisgICAgICAgICIiIgogCi0gIGRlZiBvcGVuKHNlbGYpOgotICAgIGlmIG5vdCBzZWxmLnRyYW5zcG9ydC5pc09wZW4oKToKLSAgICAgIHNlbGYudHJhbnNwb3J0Lm9wZW4oKQorICAgICAgICBmcm9tIHB1cmVzYXNsLmNsaWVudCBpbXBvcnQgU0FTTENsaWVudAogCi0gICAgc2VsZi5zZW5kX3Nhc2xfbXNnKHNlbGYuU1RBUlQsIHNlbGYuc2FzbC5tZWNoYW5pc20pCi0gICAgc2VsZi5zZW5kX3Nhc2xfbXNnKHNlbGYuT0ssIHNlbGYuc2FzbC5wcm9jZXNzKCkpCisgICAgICAgIHNlbGYudHJhbnNwb3J0ID0gdHJhbnNwb3J0CisgICAgICAgIHNlbGYuc2FzbCA9IFNBU0xDbGllbnQoaG9zdCwgc2VydmljZSwgbWVjaGFuaXNtLCAqKnNhc2xfa3dhcmdzKQogCi0gICAgd2hpbGUgVHJ1ZToKLSAgICAgIHN0YXR1cywgY2hhbGxlbmdlID0gc2VsZi5yZWN2X3Nhc2xfbXNnKCkKLSAgICAgIGlmIHN0YXR1cyA9PSBzZWxmLk9LOgotICAgICAgICBzZWxmLnNlbmRfc2FzbF9tc2coc2VsZi5PSywgc2VsZi5zYXNsLnByb2Nlc3MoY2hhbGxlbmdlKSkKLSAgICAgIGVsaWYgc3RhdHVzID09IHNlbGYuQ09NUExFVEU6Ci0gICAgICAgIGlmIG5vdCBzZWxmLnNhc2wuY29tcGxldGU6Ci0gICAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbigiVGhlIHNlcnZlciBlcnJvbmVvdXNseSBpbmRpY2F0ZWQgIgotICAgICAgICAgICAgICAidGhhdCBTQVNMIG5lZ290aWF0aW9uIHdhcyBjb21wbGV0ZSIpCisgICAgICAgIHNlbGYuX193YnVmID0gQnVmZmVySU8oKQorICAgICAgICBzZWxmLl9fcmJ1ZiA9IEJ1ZmZlcklPKGInJykKKworICAgIGRlZiBvcGVuKHNlbGYpOgorICAgICAgICBpZiBub3Qgc2VsZi50cmFuc3BvcnQuaXNPcGVuKCk6CisgICAgICAgICAgICBzZWxmLnRyYW5zcG9ydC5vcGVuKCkKKworICAgICAgICBzZWxmLnNlbmRfc2FzbF9tc2coc2VsZi5TVEFSVCwgc2VsZi5zYXNsLm1lY2hhbmlzbSkKKyAgICAgICAgc2VsZi5zZW5kX3Nhc2xfbXNnKHNlbGYuT0ssIHNlbGYuc2FzbC5wcm9jZXNzKCkpCisKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIHN0YXR1cywgY2hhbGxlbmdlID0gc2VsZi5yZWN2X3Nhc2xfbXNnKCkKKyAgICAgICAgICAgIGlmIHN0YXR1cyA9PSBzZWxmLk9LOgorICAgICAgICAgICAgICAgIHNlbGYuc2VuZF9zYXNsX21zZyhzZWxmLk9LLCBzZWxmLnNhc2wucHJvY2VzcyhjaGFsbGVuZ2UpKQorICAgICAgICAgICAgZWxpZiBzdGF0dXMgPT0gc2VsZi5DT01QTEVURToKKyAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5zYXNsLmNvbXBsZXRlOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgc2VydmVyIGVycm9uZW91c2x5IGluZGljYXRlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAidGhhdCBTQVNMIG5lZ290aWF0aW9uIHdhcyBjb21wbGV0ZSIpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgIkJhZCBTQVNMIG5lZ290aWF0aW9uIHN0YXR1czogJWQgKCVzKSIKKyAgICAgICAgICAgICAgICAgICAgJSAoc3RhdHVzLCBjaGFsbGVuZ2UpKQorCisgICAgZGVmIHNlbmRfc2FzbF9tc2coc2VsZiwgc3RhdHVzLCBib2R5KToKKyAgICAgICAgaGVhZGVyID0gcGFjaygiPkJJIiwgc3RhdHVzLCBsZW4oYm9keSkpCisgICAgICAgIHNlbGYudHJhbnNwb3J0LndyaXRlKGhlYWRlciArIGJvZHkpCisgICAgICAgIHNlbGYudHJhbnNwb3J0LmZsdXNoKCkKKworICAgIGRlZiByZWN2X3Nhc2xfbXNnKHNlbGYpOgorICAgICAgICBoZWFkZXIgPSBzZWxmLnRyYW5zcG9ydC5yZWFkQWxsKDUpCisgICAgICAgIHN0YXR1cywgbGVuZ3RoID0gdW5wYWNrKCI+QkkiLCBoZWFkZXIpCisgICAgICAgIGlmIGxlbmd0aCA+IDA6CisgICAgICAgICAgICBwYXlsb2FkID0gc2VsZi50cmFuc3BvcnQucmVhZEFsbChsZW5ndGgpCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgYnJlYWsKLSAgICAgIGVsc2U6Ci0gICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24oIkJhZCBTQVNMIG5lZ290aWF0aW9uIHN0YXR1czogJWQgKCVzKSIKLSAgICAgICAgICAgICUgKHN0YXR1cywgY2hhbGxlbmdlKSkKKyAgICAgICAgICAgIHBheWxvYWQgPSAiIgorICAgICAgICByZXR1cm4gc3RhdHVzLCBwYXlsb2FkCiAKLSAgZGVmIHNlbmRfc2FzbF9tc2coc2VsZiwgc3RhdHVzLCBib2R5KToKLSAgICBoZWFkZXIgPSBwYWNrKCI+QkkiLCBzdGF0dXMsIGxlbihib2R5KSkKLSAgICBzZWxmLnRyYW5zcG9ydC53cml0ZShoZWFkZXIgKyBib2R5KQotICAgIHNlbGYudHJhbnNwb3J0LmZsdXNoKCkKKyAgICBkZWYgd3JpdGUoc2VsZiwgZGF0YSk6CisgICAgICAgIHNlbGYuX193YnVmLndyaXRlKGRhdGEpCiAKLSAgZGVmIHJlY3Zfc2FzbF9tc2coc2VsZik6Ci0gICAgaGVhZGVyID0gc2VsZi50cmFuc3BvcnQucmVhZEFsbCg1KQotICAgIHN0YXR1cywgbGVuZ3RoID0gdW5wYWNrKCI+QkkiLCBoZWFkZXIpCi0gICAgaWYgbGVuZ3RoID4gMDoKLSAgICAgIHBheWxvYWQgPSBzZWxmLnRyYW5zcG9ydC5yZWFkQWxsKGxlbmd0aCkKLSAgICBlbHNlOgotICAgICAgcGF5bG9hZCA9ICIiCi0gICAgcmV0dXJuIHN0YXR1cywgcGF5bG9hZAorICAgIGRlZiBmbHVzaChzZWxmKToKKyAgICAgICAgZGF0YSA9IHNlbGYuX193YnVmLmdldHZhbHVlKCkKKyAgICAgICAgZW5jb2RlZCA9IHNlbGYuc2FzbC53cmFwKGRhdGEpCisgICAgICAgIHNlbGYudHJhbnNwb3J0LndyaXRlKCcnLmpvaW4oKHBhY2soIiFpIiwgbGVuKGVuY29kZWQpKSwgZW5jb2RlZCkpKQorICAgICAgICBzZWxmLnRyYW5zcG9ydC5mbHVzaCgpCisgICAgICAgIHNlbGYuX193YnVmID0gQnVmZmVySU8oKQogCi0gIGRlZiB3cml0ZShzZWxmLCBkYXRhKToKLSAgICBzZWxmLl9fd2J1Zi53cml0ZShkYXRhKQorICAgIGRlZiByZWFkKHNlbGYsIHN6KToKKyAgICAgICAgcmV0ID0gc2VsZi5fX3JidWYucmVhZChzeikKKyAgICAgICAgaWYgbGVuKHJldCkgIT0gMDoKKyAgICAgICAgICAgIHJldHVybiByZXQKIAotICBkZWYgZmx1c2goc2VsZik6Ci0gICAgZGF0YSA9IHNlbGYuX193YnVmLmdldHZhbHVlKCkKLSAgICBlbmNvZGVkID0gc2VsZi5zYXNsLndyYXAoZGF0YSkKLSAgICBzZWxmLnRyYW5zcG9ydC53cml0ZSgnJy5qb2luKChwYWNrKCIhaSIsIGxlbihlbmNvZGVkKSksIGVuY29kZWQpKSkKLSAgICBzZWxmLnRyYW5zcG9ydC5mbHVzaCgpCi0gICAgc2VsZi5fX3didWYgPSBTdHJpbmdJTygpCisgICAgICAgIHNlbGYuX3JlYWRfZnJhbWUoKQorICAgICAgICByZXR1cm4gc2VsZi5fX3JidWYucmVhZChzeikKIAotICBkZWYgcmVhZChzZWxmLCBzeik6Ci0gICAgcmV0ID0gc2VsZi5fX3JidWYucmVhZChzeikKLSAgICBpZiBsZW4ocmV0KSAhPSAwOgotICAgICAgcmV0dXJuIHJldAorICAgIGRlZiBfcmVhZF9mcmFtZShzZWxmKToKKyAgICAgICAgaGVhZGVyID0gc2VsZi50cmFuc3BvcnQucmVhZEFsbCg0KQorICAgICAgICBsZW5ndGgsID0gdW5wYWNrKCchaScsIGhlYWRlcikKKyAgICAgICAgZW5jb2RlZCA9IHNlbGYudHJhbnNwb3J0LnJlYWRBbGwobGVuZ3RoKQorICAgICAgICBzZWxmLl9fcmJ1ZiA9IEJ1ZmZlcklPKHNlbGYuc2FzbC51bndyYXAoZW5jb2RlZCkpCiAKLSAgICBzZWxmLl9yZWFkX2ZyYW1lKCkKLSAgICByZXR1cm4gc2VsZi5fX3JidWYucmVhZChzeikKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIHNlbGYuc2FzbC5kaXNwb3NlKCkKKyAgICAgICAgc2VsZi50cmFuc3BvcnQuY2xvc2UoKQogCi0gIGRlZiBfcmVhZF9mcmFtZShzZWxmKToKLSAgICBoZWFkZXIgPSBzZWxmLnRyYW5zcG9ydC5yZWFkQWxsKDQpCi0gICAgbGVuZ3RoLCA9IHVucGFjaygnIWknLCBoZWFkZXIpCi0gICAgZW5jb2RlZCA9IHNlbGYudHJhbnNwb3J0LnJlYWRBbGwobGVuZ3RoKQotICAgIHNlbGYuX19yYnVmID0gU3RyaW5nSU8oc2VsZi5zYXNsLnVud3JhcChlbmNvZGVkKSkKKyAgICAjIGJhc2VkIG9uIFRGcmFtZWRUcmFuc3BvcnQKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgY3N0cmluZ2lvX2J1ZihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX19yYnVmCiAKLSAgZGVmIGNsb3NlKHNlbGYpOgotICAgIHNlbGYuc2FzbC5kaXNwb3NlKCkKLSAgICBzZWxmLnRyYW5zcG9ydC5jbG9zZSgpCi0KLSAgIyBiYXNlZCBvbiBURnJhbWVkVHJhbnNwb3J0Ci0gIEBwcm9wZXJ0eQotICBkZWYgY3N0cmluZ2lvX2J1ZihzZWxmKToKLSAgICByZXR1cm4gc2VsZi5fX3JidWYKLQotICBkZWYgY3N0cmluZ2lvX3JlZmlsbChzZWxmLCBwcmVmaXgsIHJlcWxlbik6Ci0gICAgIyBzZWxmLl9fcmJ1ZiB3aWxsIGFscmVhZHkgYmUgZW1wdHkgaGVyZSBiZWNhdXNlIGZhc3RiaW5hcnkgZG9lc24ndAotICAgICMgYXNrIGZvciBhIHJlZmlsbCB1bnRpbCB0aGUgcHJldmlvdXMgYnVmZmVyIGlzIGVtcHR5LiAgVGhlcmVmb3JlLAotICAgICMgd2UgY2FuIHN0YXJ0IHJlYWRpbmcgbmV3IGZyYW1lcyBpbW1lZGlhdGVseS4KLSAgICB3aGlsZSBsZW4ocHJlZml4KSA8IHJlcWxlbjoKLSAgICAgIHNlbGYuX3JlYWRfZnJhbWUoKQotICAgICAgcHJlZml4ICs9IHNlbGYuX19yYnVmLmdldHZhbHVlKCkKLSAgICBzZWxmLl9fcmJ1ZiA9IFN0cmluZ0lPKHByZWZpeCkKLSAgICByZXR1cm4gc2VsZi5fX3JidWYKLQorICAgIGRlZiBjc3RyaW5naW9fcmVmaWxsKHNlbGYsIHByZWZpeCwgcmVxbGVuKToKKyAgICAgICAgIyBzZWxmLl9fcmJ1ZiB3aWxsIGFscmVhZHkgYmUgZW1wdHkgaGVyZSBiZWNhdXNlIGZhc3RiaW5hcnkgZG9lc24ndAorICAgICAgICAjIGFzayBmb3IgYSByZWZpbGwgdW50aWwgdGhlIHByZXZpb3VzIGJ1ZmZlciBpcyBlbXB0eS4gIFRoZXJlZm9yZSwKKyAgICAgICAgIyB3ZSBjYW4gc3RhcnQgcmVhZGluZyBuZXcgZnJhbWVzIGltbWVkaWF0ZWx5LgorICAgICAgICB3aGlsZSBsZW4ocHJlZml4KSA8IHJlcWxlbjoKKyAgICAgICAgICAgIHNlbGYuX3JlYWRfZnJhbWUoKQorICAgICAgICAgICAgcHJlZml4ICs9IHNlbGYuX19yYnVmLmdldHZhbHVlKCkKKyAgICAgICAgc2VsZi5fX3JidWYgPSBCdWZmZXJJTyhwcmVmaXgpCisgICAgICAgIHJldHVybiBzZWxmLl9fcmJ1ZgpkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy90cmFuc3BvcnQvVFR3aXN0ZWQucHkgYi9saWIvcHkvc3JjL3RyYW5zcG9ydC9UVHdpc3RlZC5weQppbmRleCAyOWJiZDRjLi5hMjdmMGFkIDEwMDY0NAotLS0gYS9saWIvcHkvc3JjL3RyYW5zcG9ydC9UVHdpc3RlZC5weQorKysgYi9saWIvcHkvc3JjL3RyYW5zcG9ydC9UVHdpc3RlZC5weQpAQCAtMTcsMTAgKzE3LDEwIEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCitmcm9tIGlvIGltcG9ydCBCeXRlc0lPCiBpbXBvcnQgc3RydWN0Ci1mcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KIAotZnJvbSB6b3BlLmludGVyZmFjZSBpbXBvcnQgaW1wbGVtZW50cywgSW50ZXJmYWNlLCBBdHRyaWJ1dGUKK2Zyb20gem9wZS5pbnRlcmZhY2UgaW1wb3J0IGltcGxlbWVudGVyLCBJbnRlcmZhY2UsIEF0dHJpYnV0ZQogZnJvbSB0d2lzdGVkLmludGVybmV0LnByb3RvY29sIGltcG9ydCBTZXJ2ZXJGYWN0b3J5LCBDbGllbnRGYWN0b3J5LCBcCiAgICAgY29ubmVjdGlvbkRvbmUKIGZyb20gdHdpc3RlZC5pbnRlcm5ldCBpbXBvcnQgZGVmZXIKQEAgLTM0LDE0ICszNCwxNCBAQAogY2xhc3MgVE1lc3NhZ2VTZW5kZXJUcmFuc3BvcnQoVFRyYW5zcG9ydC5UVHJhbnNwb3J0QmFzZSk6CiAKICAgICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgICAgIHNlbGYuX193YnVmID0gU3RyaW5nSU8oKQorICAgICAgICBzZWxmLl9fd2J1ZiA9IEJ5dGVzSU8oKQogCiAgICAgZGVmIHdyaXRlKHNlbGYsIGJ1Zik6CiAgICAgICAgIHNlbGYuX193YnVmLndyaXRlKGJ1ZikKIAogICAgIGRlZiBmbHVzaChzZWxmKToKICAgICAgICAgbXNnID0gc2VsZi5fX3didWYuZ2V0dmFsdWUoKQotICAgICAgICBzZWxmLl9fd2J1ZiA9IFN0cmluZ0lPKCkKKyAgICAgICAgc2VsZi5fX3didWYgPSBCeXRlc0lPKCkKICAgICAgICAgcmV0dXJuIHNlbGYuc2VuZE1lc3NhZ2UobXNnKQogCiAgICAgZGVmIHNlbmRNZXNzYWdlKHNlbGYsIG1lc3NhZ2UpOgpAQCAtODIsMTEgKzgyLDE4IEBACiAgICAgICAgIHNlbGYuc3RhcnRlZC5jYWxsYmFjayhzZWxmLmNsaWVudCkKIAogICAgIGRlZiBjb25uZWN0aW9uTG9zdChzZWxmLCByZWFzb249Y29ubmVjdGlvbkRvbmUpOgotICAgICAgICBmb3IgaywgdiBpbiBzZWxmLmNsaWVudC5fcmVxcy5pdGVyaXRlbXMoKToKKyAgICAgICAgIyB0aGUgY2FsbGVkIGVycmJhY2tzIGNhbiBhZGQgaXRlbXMgdG8gb3VyIGNsaWVudCdzIF9yZXFzLAorICAgICAgICAjIHNvIHdlIG5lZWQgdG8gdXNlIGEgdG1wLCBhbmQgaXRlcmF0ZSB1bnRpbCBubyBtb3JlIHJlcXVlc3RzCisgICAgICAgICMgYXJlIGFkZGVkIGR1cmluZyBlcnJiYWNrcworICAgICAgICBpZiBzZWxmLmNsaWVudDoKICAgICAgICAgICAgIHRleCA9IFRUcmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICB0eXBlPVRUcmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbi5FTkRfT0ZfRklMRSwKLSAgICAgICAgICAgICAgICBtZXNzYWdlPSdDb25uZWN0aW9uIGNsb3NlZCcpCi0gICAgICAgICAgICB2LmVycmJhY2sodGV4KQorICAgICAgICAgICAgICAgIG1lc3NhZ2U9J0Nvbm5lY3Rpb24gY2xvc2VkICglcyknICUgcmVhc29uKQorICAgICAgICAgICAgd2hpbGUgc2VsZi5jbGllbnQuX3JlcXM6CisgICAgICAgICAgICAgICAgXywgdiA9IHNlbGYuY2xpZW50Ll9yZXFzLnBvcGl0ZW0oKQorICAgICAgICAgICAgICAgIHYuZXJyYmFjayh0ZXgpCisgICAgICAgICAgICBkZWwgc2VsZi5jbGllbnQuX3JlcXMKKyAgICAgICAgICAgIHNlbGYuY2xpZW50ID0gTm9uZQogCiAgICAgZGVmIHN0cmluZ1JlY2VpdmVkKHNlbGYsIGZyYW1lKToKICAgICAgICAgdHIgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoZnJhbWUpCkBAIC0xMTMsNyArMTIwLDcgQEAKICAgICBNQVhfTEVOR1RIID0gMiAqKiAzMSAtIDEKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjbGllbnRfY2xhc3MsIGlwcm90X2ZhY3RvcnksIG9wcm90X2ZhY3Rvcnk9Tm9uZSwKLSAgICAgICAgICAgIGhvc3Q9Tm9uZSwgc2VydmljZT1Ob25lLCBtZWNoYW5pc209J0dTU0FQSScsICoqc2FzbF9rd2FyZ3MpOgorICAgICAgICAgICAgICAgICBob3N0PU5vbmUsIHNlcnZpY2U9Tm9uZSwgbWVjaGFuaXNtPSdHU1NBUEknLCAqKnNhc2xfa3dhcmdzKToKICAgICAgICAgIiIiCiAgICAgICAgIGhvc3Q6IHRoZSBuYW1lIG9mIHRoZSBzZXJ2ZXIsIGZyb20gYSBTQVNMIHBlcnNwZWN0aXZlCiAgICAgICAgIHNlcnZpY2U6IHRoZSBuYW1lIG9mIHRoZSBzZXJ2ZXIncyBzZXJ2aWNlLCBmcm9tIGEgU0FTTCBwZXJzcGVjdGl2ZQpAQCAtMjI5LDcgKzIzNiw3IEBACiAKICAgICAgICAgZCA9IHNlbGYuZmFjdG9yeS5wcm9jZXNzb3IucHJvY2VzcyhpcHJvdCwgb3Byb3QpCiAgICAgICAgIGQuYWRkQ2FsbGJhY2tzKHNlbGYucHJvY2Vzc09rLCBzZWxmLnByb2Nlc3NFcnJvciwKLSAgICAgICAgICAgIGNhbGxiYWNrQXJncz0odG1vLCkpCisgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrQXJncz0odG1vLCkpCiAKIAogY2xhc3MgSVRocmlmdFNlcnZlckZhY3RvcnkoSW50ZXJmYWNlKToKQEAgLTI1MCwxMCArMjU3LDkgQEAKICAgICBvcHJvdF9mYWN0b3J5ID0gQXR0cmlidXRlKCJPdXRwdXQgcHJvdG9jb2wgZmFjdG9yeSIpCiAKIAorQGltcGxlbWVudGVyKElUaHJpZnRTZXJ2ZXJGYWN0b3J5KQogY2xhc3MgVGhyaWZ0U2VydmVyRmFjdG9yeShTZXJ2ZXJGYWN0b3J5KToKIAotICAgIGltcGxlbWVudHMoSVRocmlmdFNlcnZlckZhY3RvcnkpCi0KICAgICBwcm90b2NvbCA9IFRocmlmdFNlcnZlclByb3RvY29sCiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgcHJvY2Vzc29yLCBpcHJvdF9mYWN0b3J5LCBvcHJvdF9mYWN0b3J5PU5vbmUpOgpAQCAtMjY1LDEwICsyNzEsOSBAQAogICAgICAgICAgICAgc2VsZi5vcHJvdF9mYWN0b3J5ID0gb3Byb3RfZmFjdG9yeQogCiAKK0BpbXBsZW1lbnRlcihJVGhyaWZ0Q2xpZW50RmFjdG9yeSkKIGNsYXNzIFRocmlmdENsaWVudEZhY3RvcnkoQ2xpZW50RmFjdG9yeSk6CiAKLSAgICBpbXBsZW1lbnRzKElUaHJpZnRDbGllbnRGYWN0b3J5KQotCiAgICAgcHJvdG9jb2wgPSBUaHJpZnRDbGllbnRQcm90b2NvbAogCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNsaWVudF9jbGFzcywgaXByb3RfZmFjdG9yeSwgb3Byb3RfZmFjdG9yeT1Ob25lKToKQEAgLTI4MSw3ICsyODYsNyBAQAogCiAgICAgZGVmIGJ1aWxkUHJvdG9jb2woc2VsZiwgYWRkcik6CiAgICAgICAgIHAgPSBzZWxmLnByb3RvY29sKHNlbGYuY2xpZW50X2NsYXNzLCBzZWxmLmlwcm90X2ZhY3RvcnksCi0gICAgICAgICAgICBzZWxmLm9wcm90X2ZhY3RvcnkpCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub3Byb3RfZmFjdG9yeSkKICAgICAgICAgcC5mYWN0b3J5ID0gc2VsZgogICAgICAgICByZXR1cm4gcAogCkBAIC0yOTEsNyArMjk2LDcgQEAKICAgICBhbGxvd2VkTWV0aG9kcyA9ICgnUE9TVCcsKQogCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHByb2Nlc3NvciwgaW5wdXRQcm90b2NvbEZhY3RvcnksCi0gICAgICAgIG91dHB1dFByb3RvY29sRmFjdG9yeT1Ob25lKToKKyAgICAgICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5PU5vbmUpOgogICAgICAgICByZXNvdXJjZS5SZXNvdXJjZS5fX2luaXRfXyhzZWxmKQogICAgICAgICBzZWxmLmlucHV0UHJvdG9jb2xGYWN0b3J5ID0gaW5wdXRQcm90b2NvbEZhY3RvcnkKICAgICAgICAgaWYgb3V0cHV0UHJvdG9jb2xGYWN0b3J5IGlzIE5vbmU6CmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL3RyYW5zcG9ydC9UWmxpYlRyYW5zcG9ydC5weSBiL2xpYi9weS9zcmMvdHJhbnNwb3J0L1RabGliVHJhbnNwb3J0LnB5CmluZGV4IGEyZjQyYTUuLmU4NDg1NzkgMTAwNjQ0Ci0tLSBhL2xpYi9weS9zcmMvdHJhbnNwb3J0L1RabGliVHJhbnNwb3J0LnB5CisrKyBiL2xpYi9weS9zcmMvdHJhbnNwb3J0L1RabGliVHJhbnNwb3J0LnB5CkBAIC0yNCwyMjUgKzI0LDIyNSBAQAogCiBmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGRpdmlzaW9uCiBpbXBvcnQgemxpYgotZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCi1mcm9tIFRUcmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnRCYXNlLCBDUmVhZGFibGVUcmFuc3BvcnQKK2Zyb20gLlRUcmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnRCYXNlLCBDUmVhZGFibGVUcmFuc3BvcnQKK2Zyb20gLi5jb21wYXQgaW1wb3J0IEJ1ZmZlcklPCiAKIAogY2xhc3MgVFpsaWJUcmFuc3BvcnRGYWN0b3J5KG9iamVjdCk6Ci0gICIiIkZhY3RvcnkgdHJhbnNwb3J0IHRoYXQgYnVpbGRzIHpsaWIgY29tcHJlc3NlZCB0cmFuc3BvcnRzLgorICAgICIiIkZhY3RvcnkgdHJhbnNwb3J0IHRoYXQgYnVpbGRzIHpsaWIgY29tcHJlc3NlZCB0cmFuc3BvcnRzLgogCi0gIFRoaXMgZmFjdG9yeSBjYWNoZXMgdGhlIGxhc3Qgc2luZ2xlIGNsaWVudC90cmFuc3BvcnQgdGhhdCBpdCB3YXMgcGFzc2VkCi0gIGFuZCByZXR1cm5zIHRoZSBzYW1lIFRabGliVHJhbnNwb3J0IG9iamVjdCB0aGF0IHdhcyBjcmVhdGVkLgorICAgIFRoaXMgZmFjdG9yeSBjYWNoZXMgdGhlIGxhc3Qgc2luZ2xlIGNsaWVudC90cmFuc3BvcnQgdGhhdCBpdCB3YXMgcGFzc2VkCisgICAgYW5kIHJldHVybnMgdGhlIHNhbWUgVFpsaWJUcmFuc3BvcnQgb2JqZWN0IHRoYXQgd2FzIGNyZWF0ZWQuCiAKLSAgVGhpcyBjYWNoaW5nIG1lYW5zIHRoZSBUU2VydmVyIGNsYXNzIHdpbGwgZ2V0IHRoZSBfc2FtZV8gdHJhbnNwb3J0Ci0gIG9iamVjdCBmb3IgYm90aCBpbnB1dCBhbmQgb3V0cHV0IHRyYW5zcG9ydHMgZnJvbSB0aGlzIGZhY3RvcnkuCi0gIChGb3Igbm9uLXRocmVhZGVkIHNjZW5hcmlvcyBvbmx5LCBzaW5jZSB0aGUgY2FjaGUgb25seSBob2xkcyBvbmUgb2JqZWN0KQorICAgIFRoaXMgY2FjaGluZyBtZWFucyB0aGUgVFNlcnZlciBjbGFzcyB3aWxsIGdldCB0aGUgX3NhbWVfIHRyYW5zcG9ydAorICAgIG9iamVjdCBmb3IgYm90aCBpbnB1dCBhbmQgb3V0cHV0IHRyYW5zcG9ydHMgZnJvbSB0aGlzIGZhY3RvcnkuCisgICAgKEZvciBub24tdGhyZWFkZWQgc2NlbmFyaW9zIG9ubHksIHNpbmNlIHRoZSBjYWNoZSBvbmx5IGhvbGRzIG9uZSBvYmplY3QpCiAKLSAgVGhlIHB1cnBvc2Ugb2YgdGhpcyBjYWNoaW5nIGlzIHRvIGFsbG9jYXRlIG9ubHkgb25lIFRabGliVHJhbnNwb3J0IHdoZXJlCi0gIG9ubHkgb25lIGlzIHJlYWxseSBuZWVkZWQgKHNpbmNlIGl0IG11c3QgaGF2ZSBzZXBhcmF0ZSByZWFkL3dyaXRlIGJ1ZmZlcnMpLAotICBhbmQgbWFrZXMgdGhlIHN0YXRpc3RpY3MgZnJvbSBnZXRDb21wU2F2aW5ncygpIGFuZCBnZXRDb21wUmF0aW8oKQotICBlYXNpZXIgdG8gdW5kZXJzdGFuZC4KLSAgIiIiCi0gICMgY2xhc3Mgc2NvcGVkIGNhY2hlIG9mIGxhc3QgdHJhbnNwb3J0IGdpdmVuIGFuZCB6bGlidHJhbnNwb3J0IHJldHVybmVkCi0gIF9sYXN0X3RyYW5zID0gTm9uZQotICBfbGFzdF96ID0gTm9uZQotCi0gIGRlZiBnZXRUcmFuc3BvcnQoc2VsZiwgdHJhbnMsIGNvbXByZXNzbGV2ZWw9OSk6Ci0gICAgIiIiV3JhcCBhIHRyYW5zcG9ydCwgdHJhbnMsIHdpdGggdGhlIFRabGliVHJhbnNwb3J0Ci0gICAgY29tcHJlc3NlZCB0cmFuc3BvcnQgY2xhc3MsIHJldHVybmluZyBhIG5ldwotICAgIHRyYW5zcG9ydCB0byB0aGUgY2FsbGVyLgotCi0gICAgQHBhcmFtIGNvbXByZXNzbGV2ZWw6IFRoZSB6bGliIGNvbXByZXNzaW9uIGxldmVsLCByYW5naW5nCi0gICAgZnJvbSAwIChubyBjb21wcmVzc2lvbikgdG8gOSAoYmVzdCBjb21wcmVzc2lvbikuICBEZWZhdWx0cyB0byA5LgotICAgIEB0eXBlIGNvbXByZXNzbGV2ZWw6IGludAotCi0gICAgVGhpcyBtZXRob2QgcmV0dXJucyBhIFRabGliVHJhbnNwb3J0IHdoaWNoIHdyYXBzIHRoZQotICAgIHBhc3NlZCBDe3RyYW5zfSBUVHJhbnNwb3J0IGRlcml2ZWQgaW5zdGFuY2UuCisgICAgVGhlIHB1cnBvc2Ugb2YgdGhpcyBjYWNoaW5nIGlzIHRvIGFsbG9jYXRlIG9ubHkgb25lIFRabGliVHJhbnNwb3J0IHdoZXJlCisgICAgb25seSBvbmUgaXMgcmVhbGx5IG5lZWRlZCAoc2luY2UgaXQgbXVzdCBoYXZlIHNlcGFyYXRlIHJlYWQvd3JpdGUgYnVmZmVycyksCisgICAgYW5kIG1ha2VzIHRoZSBzdGF0aXN0aWNzIGZyb20gZ2V0Q29tcFNhdmluZ3MoKSBhbmQgZ2V0Q29tcFJhdGlvKCkKKyAgICBlYXNpZXIgdG8gdW5kZXJzdGFuZC4KICAgICAiIiIKLSAgICBpZiB0cmFucyA9PSBzZWxmLl9sYXN0X3RyYW5zOgotICAgICAgcmV0dXJuIHNlbGYuX2xhc3RfegotICAgIHp0cmFucyA9IFRabGliVHJhbnNwb3J0KHRyYW5zLCBjb21wcmVzc2xldmVsKQotICAgIHNlbGYuX2xhc3RfdHJhbnMgPSB0cmFucwotICAgIHNlbGYuX2xhc3RfeiA9IHp0cmFucwotICAgIHJldHVybiB6dHJhbnMKKyAgICAjIGNsYXNzIHNjb3BlZCBjYWNoZSBvZiBsYXN0IHRyYW5zcG9ydCBnaXZlbiBhbmQgemxpYnRyYW5zcG9ydCByZXR1cm5lZAorICAgIF9sYXN0X3RyYW5zID0gTm9uZQorICAgIF9sYXN0X3ogPSBOb25lCisKKyAgICBkZWYgZ2V0VHJhbnNwb3J0KHNlbGYsIHRyYW5zLCBjb21wcmVzc2xldmVsPTkpOgorICAgICAgICAiIiJXcmFwIGEgdHJhbnNwb3J0LCB0cmFucywgd2l0aCB0aGUgVFpsaWJUcmFuc3BvcnQKKyAgICAgICAgY29tcHJlc3NlZCB0cmFuc3BvcnQgY2xhc3MsIHJldHVybmluZyBhIG5ldworICAgICAgICB0cmFuc3BvcnQgdG8gdGhlIGNhbGxlci4KKworICAgICAgICBAcGFyYW0gY29tcHJlc3NsZXZlbDogVGhlIHpsaWIgY29tcHJlc3Npb24gbGV2ZWwsIHJhbmdpbmcKKyAgICAgICAgZnJvbSAwIChubyBjb21wcmVzc2lvbikgdG8gOSAoYmVzdCBjb21wcmVzc2lvbikuICBEZWZhdWx0cyB0byA5LgorICAgICAgICBAdHlwZSBjb21wcmVzc2xldmVsOiBpbnQKKworICAgICAgICBUaGlzIG1ldGhvZCByZXR1cm5zIGEgVFpsaWJUcmFuc3BvcnQgd2hpY2ggd3JhcHMgdGhlCisgICAgICAgIHBhc3NlZCBDe3RyYW5zfSBUVHJhbnNwb3J0IGRlcml2ZWQgaW5zdGFuY2UuCisgICAgICAgICIiIgorICAgICAgICBpZiB0cmFucyA9PSBzZWxmLl9sYXN0X3RyYW5zOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2xhc3RfegorICAgICAgICB6dHJhbnMgPSBUWmxpYlRyYW5zcG9ydCh0cmFucywgY29tcHJlc3NsZXZlbCkKKyAgICAgICAgc2VsZi5fbGFzdF90cmFucyA9IHRyYW5zCisgICAgICAgIHNlbGYuX2xhc3RfeiA9IHp0cmFucworICAgICAgICByZXR1cm4genRyYW5zCiAKIAogY2xhc3MgVFpsaWJUcmFuc3BvcnQoVFRyYW5zcG9ydEJhc2UsIENSZWFkYWJsZVRyYW5zcG9ydCk6Ci0gICIiIkNsYXNzIHRoYXQgd3JhcHMgYSB0cmFuc3BvcnQgd2l0aCB6bGliLCBjb21wcmVzc2luZyB3cml0ZXMKLSAgYW5kIGRlY29tcHJlc3NlcyByZWFkcywgdXNpbmcgdGhlIHB5dGhvbiBzdGFuZGFyZAotICBsaWJyYXJ5IHpsaWIgbW9kdWxlLgotICAiIiIKLSAgIyBSZWFkIGJ1ZmZlciBzaXplIGZvciB0aGUgcHl0aG9uIGZhc3RiaW5hcnkgQyBleHRlbnNpb24sCi0gICMgdGhlIFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkIGNsYXNzLgotICBERUZBVUxUX0JVRkZTSVpFID0gNDA5NgotCi0gIGRlZiBfX2luaXRfXyhzZWxmLCB0cmFucywgY29tcHJlc3NsZXZlbD05KToKLSAgICAiIiJDcmVhdGUgYSBuZXcgVFpsaWJUcmFuc3BvcnQsIHdyYXBwaW5nIEN7dHJhbnN9LCBhbm90aGVyCi0gICAgVFRyYW5zcG9ydCBkZXJpdmVkIG9iamVjdC4KLQotICAgIEBwYXJhbSB0cmFuczogQSB0aHJpZnQgdHJhbnNwb3J0IG9iamVjdCwgaS5lLiBhIFRTb2NrZXQoKSBvYmplY3QuCi0gICAgQHR5cGUgdHJhbnM6IFRUcmFuc3BvcnQKLSAgICBAcGFyYW0gY29tcHJlc3NsZXZlbDogVGhlIHpsaWIgY29tcHJlc3Npb24gbGV2ZWwsIHJhbmdpbmcKLSAgICBmcm9tIDAgKG5vIGNvbXByZXNzaW9uKSB0byA5IChiZXN0IGNvbXByZXNzaW9uKS4gIERlZmF1bHQgaXMgOS4KLSAgICBAdHlwZSBjb21wcmVzc2xldmVsOiBpbnQKKyAgICAiIiJDbGFzcyB0aGF0IHdyYXBzIGEgdHJhbnNwb3J0IHdpdGggemxpYiwgY29tcHJlc3Npbmcgd3JpdGVzCisgICAgYW5kIGRlY29tcHJlc3NlcyByZWFkcywgdXNpbmcgdGhlIHB5dGhvbiBzdGFuZGFyZAorICAgIGxpYnJhcnkgemxpYiBtb2R1bGUuCiAgICAgIiIiCi0gICAgc2VsZi5fX3RyYW5zID0gdHJhbnMKLSAgICBzZWxmLmNvbXByZXNzbGV2ZWwgPSBjb21wcmVzc2xldmVsCi0gICAgc2VsZi5fX3JidWYgPSBTdHJpbmdJTygpCi0gICAgc2VsZi5fX3didWYgPSBTdHJpbmdJTygpCi0gICAgc2VsZi5faW5pdF96bGliKCkKLSAgICBzZWxmLl9pbml0X3N0YXRzKCkKKyAgICAjIFJlYWQgYnVmZmVyIHNpemUgZm9yIHRoZSBweXRob24gZmFzdGJpbmFyeSBDIGV4dGVuc2lvbiwKKyAgICAjIHRoZSBUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCBjbGFzcy4KKyAgICBERUZBVUxUX0JVRkZTSVpFID0gNDA5NgogCi0gIGRlZiBfcmVpbml0X2J1ZmZlcnMoc2VsZik6Ci0gICAgIiIiSW50ZXJuYWwgbWV0aG9kIHRvIGluaXRpYWxpemUvcmVzZXQgdGhlIGludGVybmFsIFN0cmluZ0lPIG9iamVjdHMKLSAgICBmb3IgcmVhZCBhbmQgd3JpdGUgYnVmZmVycy4KLSAgICAiIiIKLSAgICBzZWxmLl9fcmJ1ZiA9IFN0cmluZ0lPKCkKLSAgICBzZWxmLl9fd2J1ZiA9IFN0cmluZ0lPKCkKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdHJhbnMsIGNvbXByZXNzbGV2ZWw9OSk6CisgICAgICAgICIiIkNyZWF0ZSBhIG5ldyBUWmxpYlRyYW5zcG9ydCwgd3JhcHBpbmcgQ3t0cmFuc30sIGFub3RoZXIKKyAgICAgICAgVFRyYW5zcG9ydCBkZXJpdmVkIG9iamVjdC4KIAotICBkZWYgX2luaXRfc3RhdHMoc2VsZik6Ci0gICAgIiIiSW50ZXJuYWwgbWV0aG9kIHRvIHJlc2V0IHRoZSBpbnRlcm5hbCBzdGF0aXN0aWNzIGNvdW50ZXJzCi0gICAgZm9yIGNvbXByZXNzaW9uIHJhdGlvcyBhbmQgYmFuZHdpZHRoIHNhdmluZ3MuCi0gICAgIiIiCi0gICAgc2VsZi5ieXRlc19pbiA9IDAKLSAgICBzZWxmLmJ5dGVzX291dCA9IDAKLSAgICBzZWxmLmJ5dGVzX2luX2NvbXAgPSAwCi0gICAgc2VsZi5ieXRlc19vdXRfY29tcCA9IDAKKyAgICAgICAgQHBhcmFtIHRyYW5zOiBBIHRocmlmdCB0cmFuc3BvcnQgb2JqZWN0LCBpLmUuIGEgVFNvY2tldCgpIG9iamVjdC4KKyAgICAgICAgQHR5cGUgdHJhbnM6IFRUcmFuc3BvcnQKKyAgICAgICAgQHBhcmFtIGNvbXByZXNzbGV2ZWw6IFRoZSB6bGliIGNvbXByZXNzaW9uIGxldmVsLCByYW5naW5nCisgICAgICAgIGZyb20gMCAobm8gY29tcHJlc3Npb24pIHRvIDkgKGJlc3QgY29tcHJlc3Npb24pLiAgRGVmYXVsdCBpcyA5LgorICAgICAgICBAdHlwZSBjb21wcmVzc2xldmVsOiBpbnQKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX190cmFucyA9IHRyYW5zCisgICAgICAgIHNlbGYuY29tcHJlc3NsZXZlbCA9IGNvbXByZXNzbGV2ZWwKKyAgICAgICAgc2VsZi5fX3JidWYgPSBCdWZmZXJJTygpCisgICAgICAgIHNlbGYuX193YnVmID0gQnVmZmVySU8oKQorICAgICAgICBzZWxmLl9pbml0X3psaWIoKQorICAgICAgICBzZWxmLl9pbml0X3N0YXRzKCkKIAotICBkZWYgX2luaXRfemxpYihzZWxmKToKLSAgICAiIiJJbnRlcm5hbCBtZXRob2QgZm9yIHNldHRpbmcgdXAgdGhlIHpsaWIgY29tcHJlc3Npb24gYW5kCi0gICAgZGVjb21wcmVzc2lvbiBvYmplY3RzLgotICAgICIiIgotICAgIHNlbGYuX3pjb21wX3JlYWQgPSB6bGliLmRlY29tcHJlc3NvYmooKQotICAgIHNlbGYuX3pjb21wX3dyaXRlID0gemxpYi5jb21wcmVzc29iaihzZWxmLmNvbXByZXNzbGV2ZWwpCisgICAgZGVmIF9yZWluaXRfYnVmZmVycyhzZWxmKToKKyAgICAgICAgIiIiSW50ZXJuYWwgbWV0aG9kIHRvIGluaXRpYWxpemUvcmVzZXQgdGhlIGludGVybmFsIFN0cmluZ0lPIG9iamVjdHMKKyAgICAgICAgZm9yIHJlYWQgYW5kIHdyaXRlIGJ1ZmZlcnMuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl9fcmJ1ZiA9IEJ1ZmZlcklPKCkKKyAgICAgICAgc2VsZi5fX3didWYgPSBCdWZmZXJJTygpCiAKLSAgZGVmIGdldENvbXBSYXRpbyhzZWxmKToKLSAgICAiIiJHZXQgdGhlIGN1cnJlbnQgbWVhc3VyZWQgY29tcHJlc3Npb24gcmF0aW9zIChpbixvdXQpIGZyb20KLSAgICB0aGlzIHRyYW5zcG9ydC4KKyAgICBkZWYgX2luaXRfc3RhdHMoc2VsZik6CisgICAgICAgICIiIkludGVybmFsIG1ldGhvZCB0byByZXNldCB0aGUgaW50ZXJuYWwgc3RhdGlzdGljcyBjb3VudGVycworICAgICAgICBmb3IgY29tcHJlc3Npb24gcmF0aW9zIGFuZCBiYW5kd2lkdGggc2F2aW5ncy4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuYnl0ZXNfaW4gPSAwCisgICAgICAgIHNlbGYuYnl0ZXNfb3V0ID0gMAorICAgICAgICBzZWxmLmJ5dGVzX2luX2NvbXAgPSAwCisgICAgICAgIHNlbGYuYnl0ZXNfb3V0X2NvbXAgPSAwCiAKLSAgICBSZXR1cm5zIGEgdHVwbGUgb2Y6Ci0gICAgKGluYm91bmRfY29tcHJlc3Npb25fcmF0aW8sIG91dGJvdW5kX2NvbXByZXNzaW9uX3JhdGlvKQorICAgIGRlZiBfaW5pdF96bGliKHNlbGYpOgorICAgICAgICAiIiJJbnRlcm5hbCBtZXRob2QgZm9yIHNldHRpbmcgdXAgdGhlIHpsaWIgY29tcHJlc3Npb24gYW5kCisgICAgICAgIGRlY29tcHJlc3Npb24gb2JqZWN0cy4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX3pjb21wX3JlYWQgPSB6bGliLmRlY29tcHJlc3NvYmooKQorICAgICAgICBzZWxmLl96Y29tcF93cml0ZSA9IHpsaWIuY29tcHJlc3NvYmooc2VsZi5jb21wcmVzc2xldmVsKQogCi0gICAgVGhlIGNvbXByZXNzaW9uIHJhdGlvcyBhcmUgY29tcHV0ZWQgYXM6Ci0gICAgICAgIGNvbXByZXNzZWQgLyB1bmNvbXByZXNzZWQKKyAgICBkZWYgZ2V0Q29tcFJhdGlvKHNlbGYpOgorICAgICAgICAiIiJHZXQgdGhlIGN1cnJlbnQgbWVhc3VyZWQgY29tcHJlc3Npb24gcmF0aW9zIChpbixvdXQpIGZyb20KKyAgICAgICAgdGhpcyB0cmFuc3BvcnQuCiAKLSAgICBFLmcuLCBkYXRhIHRoYXQgY29tcHJlc3NlcyBieSAxMHggd2lsbCBoYXZlIGEgcmF0aW8gb2Y6IDAuMTAKLSAgICBhbmQgZGF0YSB0aGF0IGNvbXByZXNzZXMgdG8gaGFsZiBvZiB0cyBvcmlnaW5hbCBzaXplIHdpbGwKLSAgICBoYXZlIGEgcmF0aW8gb2YgMC41CisgICAgICAgIFJldHVybnMgYSB0dXBsZSBvZjoKKyAgICAgICAgKGluYm91bmRfY29tcHJlc3Npb25fcmF0aW8sIG91dGJvdW5kX2NvbXByZXNzaW9uX3JhdGlvKQogCi0gICAgTm9uZSBpcyByZXR1cm5lZCBpZiBubyBieXRlcyBoYXZlIHlldCBiZWVuIHByb2Nlc3NlZCBpbgotICAgIGEgcGFydGljdWxhciBkaXJlY3Rpb24uCi0gICAgIiIiCi0gICAgcl9wZXJjZW50LCB3X3BlcmNlbnQgPSAoTm9uZSwgTm9uZSkKLSAgICBpZiBzZWxmLmJ5dGVzX2luID4gMDoKLSAgICAgIHJfcGVyY2VudCA9IHNlbGYuYnl0ZXNfaW5fY29tcCAvIHNlbGYuYnl0ZXNfaW4KLSAgICBpZiBzZWxmLmJ5dGVzX291dCA+IDA6Ci0gICAgICB3X3BlcmNlbnQgPSBzZWxmLmJ5dGVzX291dF9jb21wIC8gc2VsZi5ieXRlc19vdXQKLSAgICByZXR1cm4gKHJfcGVyY2VudCwgd19wZXJjZW50KQorICAgICAgICBUaGUgY29tcHJlc3Npb24gcmF0aW9zIGFyZSBjb21wdXRlZCBhczoKKyAgICAgICAgICAgIGNvbXByZXNzZWQgLyB1bmNvbXByZXNzZWQKIAotICBkZWYgZ2V0Q29tcFNhdmluZ3Moc2VsZik6Ci0gICAgIiIiR2V0IHRoZSBjdXJyZW50IGNvdW50IG9mIHNhdmVkIGJ5dGVzIGR1ZSB0byBkYXRhCi0gICAgY29tcHJlc3Npb24uCisgICAgICAgIEUuZy4sIGRhdGEgdGhhdCBjb21wcmVzc2VzIGJ5IDEweCB3aWxsIGhhdmUgYSByYXRpbyBvZjogMC4xMAorICAgICAgICBhbmQgZGF0YSB0aGF0IGNvbXByZXNzZXMgdG8gaGFsZiBvZiB0cyBvcmlnaW5hbCBzaXplIHdpbGwKKyAgICAgICAgaGF2ZSBhIHJhdGlvIG9mIDAuNQogCi0gICAgUmV0dXJucyBhIHR1cGxlIG9mOgotICAgIChpbmJvdW5kX3NhdmVkX2J5dGVzLCBvdXRib3VuZF9zYXZlZF9ieXRlcykKKyAgICAgICAgTm9uZSBpcyByZXR1cm5lZCBpZiBubyBieXRlcyBoYXZlIHlldCBiZWVuIHByb2Nlc3NlZCBpbgorICAgICAgICBhIHBhcnRpY3VsYXIgZGlyZWN0aW9uLgorICAgICAgICAiIiIKKyAgICAgICAgcl9wZXJjZW50LCB3X3BlcmNlbnQgPSAoTm9uZSwgTm9uZSkKKyAgICAgICAgaWYgc2VsZi5ieXRlc19pbiA+IDA6CisgICAgICAgICAgICByX3BlcmNlbnQgPSBzZWxmLmJ5dGVzX2luX2NvbXAgLyBzZWxmLmJ5dGVzX2luCisgICAgICAgIGlmIHNlbGYuYnl0ZXNfb3V0ID4gMDoKKyAgICAgICAgICAgIHdfcGVyY2VudCA9IHNlbGYuYnl0ZXNfb3V0X2NvbXAgLyBzZWxmLmJ5dGVzX291dAorICAgICAgICByZXR1cm4gKHJfcGVyY2VudCwgd19wZXJjZW50KQogCi0gICAgTm90ZTogaWYgY29tcHJlc3Npb24gaXMgYWN0dWFsbHkgZXhwYW5kaW5nIHlvdXIKLSAgICBkYXRhIChvbmx5IGxpa2VseSB3aXRoIHZlcnkgdGlueSB0aHJpZnQgb2JqZWN0cyksIHRoZW4KLSAgICB0aGUgdmFsdWVzIHJldHVybmVkIHdpbGwgYmUgbmVnYXRpdmUuCi0gICAgIiIiCi0gICAgcl9zYXZlZCA9IHNlbGYuYnl0ZXNfaW4gLSBzZWxmLmJ5dGVzX2luX2NvbXAKLSAgICB3X3NhdmVkID0gc2VsZi5ieXRlc19vdXQgLSBzZWxmLmJ5dGVzX291dF9jb21wCi0gICAgcmV0dXJuIChyX3NhdmVkLCB3X3NhdmVkKQorICAgIGRlZiBnZXRDb21wU2F2aW5ncyhzZWxmKToKKyAgICAgICAgIiIiR2V0IHRoZSBjdXJyZW50IGNvdW50IG9mIHNhdmVkIGJ5dGVzIGR1ZSB0byBkYXRhCisgICAgICAgIGNvbXByZXNzaW9uLgogCi0gIGRlZiBpc09wZW4oc2VsZik6Ci0gICAgIiIiUmV0dXJuIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCdzIG9wZW4gc3RhdHVzIiIiCi0gICAgcmV0dXJuIHNlbGYuX190cmFucy5pc09wZW4oKQorICAgICAgICBSZXR1cm5zIGEgdHVwbGUgb2Y6CisgICAgICAgIChpbmJvdW5kX3NhdmVkX2J5dGVzLCBvdXRib3VuZF9zYXZlZF9ieXRlcykKIAotICBkZWYgb3BlbihzZWxmKToKLSAgICAiIiJPcGVuIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCIiIgotICAgIHNlbGYuX2luaXRfc3RhdHMoKQotICAgIHJldHVybiBzZWxmLl9fdHJhbnMub3BlbigpCisgICAgICAgIE5vdGU6IGlmIGNvbXByZXNzaW9uIGlzIGFjdHVhbGx5IGV4cGFuZGluZyB5b3VyCisgICAgICAgIGRhdGEgKG9ubHkgbGlrZWx5IHdpdGggdmVyeSB0aW55IHRocmlmdCBvYmplY3RzKSwgdGhlbgorICAgICAgICB0aGUgdmFsdWVzIHJldHVybmVkIHdpbGwgYmUgbmVnYXRpdmUuCisgICAgICAgICIiIgorICAgICAgICByX3NhdmVkID0gc2VsZi5ieXRlc19pbiAtIHNlbGYuYnl0ZXNfaW5fY29tcAorICAgICAgICB3X3NhdmVkID0gc2VsZi5ieXRlc19vdXQgLSBzZWxmLmJ5dGVzX291dF9jb21wCisgICAgICAgIHJldHVybiAocl9zYXZlZCwgd19zYXZlZCkKIAotICBkZWYgbGlzdGVuKHNlbGYpOgotICAgICIiIkludm9rZSB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQncyBsaXN0ZW4oKSBtZXRob2QiIiIKLSAgICBzZWxmLl9fdHJhbnMubGlzdGVuKCkKKyAgICBkZWYgaXNPcGVuKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0J3Mgb3BlbiBzdGF0dXMiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX190cmFucy5pc09wZW4oKQogCi0gIGRlZiBhY2NlcHQoc2VsZik6Ci0gICAgIiIiQWNjZXB0IGNvbm5lY3Rpb25zIG9uIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCIiIgotICAgIHJldHVybiBzZWxmLl9fdHJhbnMuYWNjZXB0KCkKKyAgICBkZWYgb3BlbihzZWxmKToKKyAgICAgICAgIiIiT3BlbiB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQiIiIKKyAgICAgICAgc2VsZi5faW5pdF9zdGF0cygpCisgICAgICAgIHJldHVybiBzZWxmLl9fdHJhbnMub3BlbigpCiAKLSAgZGVmIGNsb3NlKHNlbGYpOgotICAgICIiIkNsb3NlIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCwiIiIKLSAgICBzZWxmLl9yZWluaXRfYnVmZmVycygpCi0gICAgc2VsZi5faW5pdF96bGliKCkKLSAgICByZXR1cm4gc2VsZi5fX3RyYW5zLmNsb3NlKCkKKyAgICBkZWYgbGlzdGVuKHNlbGYpOgorICAgICAgICAiIiJJbnZva2UgdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0J3MgbGlzdGVuKCkgbWV0aG9kIiIiCisgICAgICAgIHNlbGYuX190cmFucy5saXN0ZW4oKQogCi0gIGRlZiByZWFkKHNlbGYsIHN6KToKLSAgICAiIiJSZWFkIHVwIHRvIHN6IGJ5dGVzIGZyb20gdGhlIGRlY29tcHJlc3NlZCBieXRlcyBidWZmZXIsIGFuZAotICAgIHJlYWQgZnJvbSB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQgaWYgdGhlIGRlY29tcHJlc3Npb24KLSAgICBidWZmZXIgaXMgZW1wdHkuCi0gICAgIiIiCi0gICAgcmV0ID0gc2VsZi5fX3JidWYucmVhZChzeikKLSAgICBpZiBsZW4ocmV0KSA+IDA6Ci0gICAgICByZXR1cm4gcmV0Ci0gICAgIyBrZWVwIHJlYWRpbmcgZnJvbSB0cmFuc3BvcnQgdW50aWwgc29tZXRoaW5nIGNvbWVzIGJhY2sKLSAgICB3aGlsZSBUcnVlOgotICAgICAgaWYgc2VsZi5yZWFkQ29tcChzeik6Ci0gICAgICAgIGJyZWFrCi0gICAgcmV0ID0gc2VsZi5fX3JidWYucmVhZChzeikKLSAgICByZXR1cm4gcmV0CisgICAgZGVmIGFjY2VwdChzZWxmKToKKyAgICAgICAgIiIiQWNjZXB0IGNvbm5lY3Rpb25zIG9uIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCIiIgorICAgICAgICByZXR1cm4gc2VsZi5fX3RyYW5zLmFjY2VwdCgpCiAKLSAgZGVmIHJlYWRDb21wKHNlbGYsIHN6KToKLSAgICAiIiJSZWFkIGNvbXByZXNzZWQgZGF0YSBmcm9tIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCwgdGhlbgotICAgIGRlY29tcHJlc3MgaXQgYW5kIGFwcGVuZCBpdCB0byB0aGUgaW50ZXJuYWwgU3RyaW5nSU8gcmVhZCBidWZmZXIKLSAgICAiIiIKLSAgICB6YnVmID0gc2VsZi5fX3RyYW5zLnJlYWQoc3opCi0gICAgemJ1ZiA9IHNlbGYuX3pjb21wX3JlYWQudW5jb25zdW1lZF90YWlsICsgemJ1ZgotICAgIGJ1ZiA9IHNlbGYuX3pjb21wX3JlYWQuZGVjb21wcmVzcyh6YnVmKQotICAgIHNlbGYuYnl0ZXNfaW4gKz0gbGVuKHpidWYpCi0gICAgc2VsZi5ieXRlc19pbl9jb21wICs9IGxlbihidWYpCi0gICAgb2xkID0gc2VsZi5fX3JidWYucmVhZCgpCi0gICAgc2VsZi5fX3JidWYgPSBTdHJpbmdJTyhvbGQgKyBidWYpCi0gICAgaWYgbGVuKG9sZCkgKyBsZW4oYnVmKSA9PSAwOgotICAgICAgcmV0dXJuIEZhbHNlCi0gICAgcmV0dXJuIFRydWUKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgICIiIkNsb3NlIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCwiIiIKKyAgICAgICAgc2VsZi5fcmVpbml0X2J1ZmZlcnMoKQorICAgICAgICBzZWxmLl9pbml0X3psaWIoKQorICAgICAgICByZXR1cm4gc2VsZi5fX3RyYW5zLmNsb3NlKCkKIAotICBkZWYgd3JpdGUoc2VsZiwgYnVmKToKLSAgICAiIiJXcml0ZSBzb21lIGJ5dGVzLCBwdXR0aW5nIHRoZW0gaW50byB0aGUgaW50ZXJuYWwgd3JpdGUKLSAgICBidWZmZXIgZm9yIGV2ZW50dWFsIGNvbXByZXNzaW9uLgotICAgICIiIgotICAgIHNlbGYuX193YnVmLndyaXRlKGJ1ZikKKyAgICBkZWYgcmVhZChzZWxmLCBzeik6CisgICAgICAgICIiIlJlYWQgdXAgdG8gc3ogYnl0ZXMgZnJvbSB0aGUgZGVjb21wcmVzc2VkIGJ5dGVzIGJ1ZmZlciwgYW5kCisgICAgICAgIHJlYWQgZnJvbSB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQgaWYgdGhlIGRlY29tcHJlc3Npb24KKyAgICAgICAgYnVmZmVyIGlzIGVtcHR5LgorICAgICAgICAiIiIKKyAgICAgICAgcmV0ID0gc2VsZi5fX3JidWYucmVhZChzeikKKyAgICAgICAgaWYgbGVuKHJldCkgPiAwOgorICAgICAgICAgICAgcmV0dXJuIHJldAorICAgICAgICAjIGtlZXAgcmVhZGluZyBmcm9tIHRyYW5zcG9ydCB1bnRpbCBzb21ldGhpbmcgY29tZXMgYmFjaworICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgaWYgc2VsZi5yZWFkQ29tcChzeik6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgcmV0ID0gc2VsZi5fX3JidWYucmVhZChzeikKKyAgICAgICAgcmV0dXJuIHJldAogCi0gIGRlZiBmbHVzaChzZWxmKToKLSAgICAiIiJGbHVzaCBhbnkgcXVldWVkIHVwIGRhdGEgaW4gdGhlIHdyaXRlIGJ1ZmZlciBhbmQgZW5zdXJlIHRoZQotICAgIGNvbXByZXNzaW9uIGJ1ZmZlciBpcyBmbHVzaGVkIG91dCB0byB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQKLSAgICAiIiIKLSAgICB3b3V0ID0gc2VsZi5fX3didWYuZ2V0dmFsdWUoKQotICAgIGlmIGxlbih3b3V0KSA+IDA6Ci0gICAgICB6YnVmID0gc2VsZi5femNvbXBfd3JpdGUuY29tcHJlc3Mod291dCkKLSAgICAgIHNlbGYuYnl0ZXNfb3V0ICs9IGxlbih3b3V0KQotICAgICAgc2VsZi5ieXRlc19vdXRfY29tcCArPSBsZW4oemJ1ZikKLSAgICBlbHNlOgotICAgICAgemJ1ZiA9ICcnCi0gICAgenRhaWwgPSBzZWxmLl96Y29tcF93cml0ZS5mbHVzaCh6bGliLlpfU1lOQ19GTFVTSCkKLSAgICBzZWxmLmJ5dGVzX291dF9jb21wICs9IGxlbih6dGFpbCkKLSAgICBpZiAobGVuKHpidWYpICsgbGVuKHp0YWlsKSkgPiAwOgotICAgICAgc2VsZi5fX3didWYgPSBTdHJpbmdJTygpCi0gICAgICBzZWxmLl9fdHJhbnMud3JpdGUoemJ1ZiArIHp0YWlsKQotICAgIHNlbGYuX190cmFucy5mbHVzaCgpCisgICAgZGVmIHJlYWRDb21wKHNlbGYsIHN6KToKKyAgICAgICAgIiIiUmVhZCBjb21wcmVzc2VkIGRhdGEgZnJvbSB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQsIHRoZW4KKyAgICAgICAgZGVjb21wcmVzcyBpdCBhbmQgYXBwZW5kIGl0IHRvIHRoZSBpbnRlcm5hbCBTdHJpbmdJTyByZWFkIGJ1ZmZlcgorICAgICAgICAiIiIKKyAgICAgICAgemJ1ZiA9IHNlbGYuX190cmFucy5yZWFkKHN6KQorICAgICAgICB6YnVmID0gc2VsZi5femNvbXBfcmVhZC51bmNvbnN1bWVkX3RhaWwgKyB6YnVmCisgICAgICAgIGJ1ZiA9IHNlbGYuX3pjb21wX3JlYWQuZGVjb21wcmVzcyh6YnVmKQorICAgICAgICBzZWxmLmJ5dGVzX2luICs9IGxlbih6YnVmKQorICAgICAgICBzZWxmLmJ5dGVzX2luX2NvbXAgKz0gbGVuKGJ1ZikKKyAgICAgICAgb2xkID0gc2VsZi5fX3JidWYucmVhZCgpCisgICAgICAgIHNlbGYuX19yYnVmID0gQnVmZmVySU8ob2xkICsgYnVmKQorICAgICAgICBpZiBsZW4ob2xkKSArIGxlbihidWYpID09IDA6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgcmV0dXJuIFRydWUKIAotICBAcHJvcGVydHkKLSAgZGVmIGNzdHJpbmdpb19idWYoc2VsZik6Ci0gICAgIiIiSW1wbGVtZW50IHRoZSBDUmVhZGFibGVUcmFuc3BvcnQgaW50ZXJmYWNlIiIiCi0gICAgcmV0dXJuIHNlbGYuX19yYnVmCisgICAgZGVmIHdyaXRlKHNlbGYsIGJ1Zik6CisgICAgICAgICIiIldyaXRlIHNvbWUgYnl0ZXMsIHB1dHRpbmcgdGhlbSBpbnRvIHRoZSBpbnRlcm5hbCB3cml0ZQorICAgICAgICBidWZmZXIgZm9yIGV2ZW50dWFsIGNvbXByZXNzaW9uLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5fX3didWYud3JpdGUoYnVmKQogCi0gIGRlZiBjc3RyaW5naW9fcmVmaWxsKHNlbGYsIHBhcnRpYWxyZWFkLCByZXFsZW4pOgotICAgICIiIkltcGxlbWVudCB0aGUgQ1JlYWRhYmxlVHJhbnNwb3J0IGludGVyZmFjZSBmb3IgcmVmaWxsIiIiCi0gICAgcmV0c3RyaW5nID0gcGFydGlhbHJlYWQKLSAgICBpZiByZXFsZW4gPCBzZWxmLkRFRkFVTFRfQlVGRlNJWkU6Ci0gICAgICByZXRzdHJpbmcgKz0gc2VsZi5yZWFkKHNlbGYuREVGQVVMVF9CVUZGU0laRSkKLSAgICB3aGlsZSBsZW4ocmV0c3RyaW5nKSA8IHJlcWxlbjoKLSAgICAgIHJldHN0cmluZyArPSBzZWxmLnJlYWQocmVxbGVuIC0gbGVuKHJldHN0cmluZykpCi0gICAgc2VsZi5fX3JidWYgPSBTdHJpbmdJTyhyZXRzdHJpbmcpCi0gICAgcmV0dXJuIHNlbGYuX19yYnVmCisgICAgZGVmIGZsdXNoKHNlbGYpOgorICAgICAgICAiIiJGbHVzaCBhbnkgcXVldWVkIHVwIGRhdGEgaW4gdGhlIHdyaXRlIGJ1ZmZlciBhbmQgZW5zdXJlIHRoZQorICAgICAgICBjb21wcmVzc2lvbiBidWZmZXIgaXMgZmx1c2hlZCBvdXQgdG8gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0CisgICAgICAgICIiIgorICAgICAgICB3b3V0ID0gc2VsZi5fX3didWYuZ2V0dmFsdWUoKQorICAgICAgICBpZiBsZW4od291dCkgPiAwOgorICAgICAgICAgICAgemJ1ZiA9IHNlbGYuX3pjb21wX3dyaXRlLmNvbXByZXNzKHdvdXQpCisgICAgICAgICAgICBzZWxmLmJ5dGVzX291dCArPSBsZW4od291dCkKKyAgICAgICAgICAgIHNlbGYuYnl0ZXNfb3V0X2NvbXAgKz0gbGVuKHpidWYpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB6YnVmID0gJycKKyAgICAgICAgenRhaWwgPSBzZWxmLl96Y29tcF93cml0ZS5mbHVzaCh6bGliLlpfU1lOQ19GTFVTSCkKKyAgICAgICAgc2VsZi5ieXRlc19vdXRfY29tcCArPSBsZW4oenRhaWwpCisgICAgICAgIGlmIChsZW4oemJ1ZikgKyBsZW4oenRhaWwpKSA+IDA6CisgICAgICAgICAgICBzZWxmLl9fd2J1ZiA9IEJ1ZmZlcklPKCkKKyAgICAgICAgICAgIHNlbGYuX190cmFucy53cml0ZSh6YnVmICsgenRhaWwpCisgICAgICAgIHNlbGYuX190cmFucy5mbHVzaCgpCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgY3N0cmluZ2lvX2J1ZihzZWxmKToKKyAgICAgICAgIiIiSW1wbGVtZW50IHRoZSBDUmVhZGFibGVUcmFuc3BvcnQgaW50ZXJmYWNlIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9fcmJ1ZgorCisgICAgZGVmIGNzdHJpbmdpb19yZWZpbGwoc2VsZiwgcGFydGlhbHJlYWQsIHJlcWxlbik6CisgICAgICAgICIiIkltcGxlbWVudCB0aGUgQ1JlYWRhYmxlVHJhbnNwb3J0IGludGVyZmFjZSBmb3IgcmVmaWxsIiIiCisgICAgICAgIHJldHN0cmluZyA9IHBhcnRpYWxyZWFkCisgICAgICAgIGlmIHJlcWxlbiA8IHNlbGYuREVGQVVMVF9CVUZGU0laRToKKyAgICAgICAgICAgIHJldHN0cmluZyArPSBzZWxmLnJlYWQoc2VsZi5ERUZBVUxUX0JVRkZTSVpFKQorICAgICAgICB3aGlsZSBsZW4ocmV0c3RyaW5nKSA8IHJlcWxlbjoKKyAgICAgICAgICAgIHJldHN0cmluZyArPSBzZWxmLnJlYWQocmVxbGVuIC0gbGVuKHJldHN0cmluZykpCisgICAgICAgIHNlbGYuX19yYnVmID0gQnVmZmVySU8ocmV0c3RyaW5nKQorICAgICAgICByZXR1cm4gc2VsZi5fX3JidWYKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvdHJhbnNwb3J0L3NzbGNvbXBhdC5weSBiL2xpYi9weS9zcmMvdHJhbnNwb3J0L3NzbGNvbXBhdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjAwY2IyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5L3NyYy90cmFuc3BvcnQvc3NsY29tcGF0LnB5CkBAIC0wLDAgKzEsMTAwIEBACisjCisjIGxpY2Vuc2VkIHRvIHRoZSBhcGFjaGUgc29mdHdhcmUgZm91bmRhdGlvbiAoYXNmKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIHNlZSB0aGUgbm90aWNlIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIHRoZSBhc2YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgYXBhY2hlIGxpY2Vuc2UsIHZlcnNpb24gMi4wICh0aGUKKyMgImxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBsaWNlbnNlLiB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIGxpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvbGljZW5zZS0yLjAKKyMKKyMgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgbGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiYXMgaXMiIGJhc2lzLCB3aXRob3V0IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBhbnkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworaW1wb3J0IGxvZ2dpbmcKK2ltcG9ydCBzeXMKKworZnJvbSB0aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnRFeGNlcHRpb24KKworbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCisKKworZGVmIGxlZ2FjeV92YWxpZGF0ZV9jYWxsYmFjayhjZXJ0LCBob3N0bmFtZSk6CisgICAgIiIibGVnYWN5IG1ldGhvZCB0byB2YWxpZGF0ZSB0aGUgcGVlcidzIFNTTCBjZXJ0aWZpY2F0ZSwgYW5kIHRvIGNoZWNrCisgICAgdGhlIGNvbW1vbk5hbWUgb2YgdGhlIGNlcnRpZmljYXRlIHRvIGVuc3VyZSBpdCBtYXRjaGVzIHRoZSBob3N0bmFtZSB3ZQorICAgIHVzZWQgdG8gbWFrZSB0aGlzIGNvbm5lY3Rpb24uICBEb2VzIG5vdCBzdXBwb3J0IHN1YmplY3RBbHROYW1lIHJlY29yZHMKKyAgICBpbiBjZXJ0aWZpY2F0ZXMuCisKKyAgICByYWlzZXMgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiB0aGUgY2VydGlmaWNhdGUgZmFpbHMgdmFsaWRhdGlvbi4KKyAgICAiIiIKKyAgICBpZiAnc3ViamVjdCcgbm90IGluIGNlcnQ6CisgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLk5PVF9PUEVOLAorICAgICAgICAgICAgJ05vIFNTTCBjZXJ0aWZpY2F0ZSBmb3VuZCBmcm9tICVzJyAlIGhvc3RuYW1lKQorICAgIGZpZWxkcyA9IGNlcnRbJ3N1YmplY3QnXQorICAgIGZvciBmaWVsZCBpbiBmaWVsZHM6CisgICAgICAgICMgZW5zdXJlIHN0cnVjdHVyZSB3ZSBnZXQgYmFjayBpcyB3aGF0IHdlIGV4cGVjdAorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShmaWVsZCwgdHVwbGUpOgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgY2VydF9wYWlyID0gZmllbGRbMF0KKyAgICAgICAgaWYgbGVuKGNlcnRfcGFpcikgPCAyOgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgY2VydF9rZXksIGNlcnRfdmFsdWUgPSBjZXJ0X3BhaXJbMDoyXQorICAgICAgICBpZiBjZXJ0X2tleSAhPSAnY29tbW9uTmFtZSc6CisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBjZXJ0aG9zdCA9IGNlcnRfdmFsdWUKKyAgICAgICAgIyB0aGlzIGNoZWNrIHNob3VsZCBiZSBwZXJmb3JtZWQgYnkgc29tZSBzb3J0IG9mIEFjY2VzcyBNYW5hZ2VyCisgICAgICAgIGlmIGNlcnRob3N0ID09IGhvc3RuYW1lOgorICAgICAgICAgICAgIyBzdWNjZXNzLCBjZXJ0IGNvbW1vbk5hbWUgbWF0Y2hlcyBkZXNpcmVkIGhvc3RuYW1lCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5VTktOT1dOLAorICAgICAgICAgICAgICAgICdIb3N0bmFtZSB3ZSBjb25uZWN0ZWQgdG8gIiVzIiBkb2VzblwndCBtYXRjaCBjZXJ0aWZpY2F0ZSAnCisgICAgICAgICAgICAgICAgJ3Byb3ZpZGVkIGNvbW1vbk5hbWUgIiVzIicgJSAoaG9zdG5hbWUsIGNlcnRob3N0KSkKKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLlVOS05PV04sCisgICAgICAgICdDb3VsZCBub3QgdmFsaWRhdGUgU1NMIGNlcnRpZmljYXRlIGZyb20gaG9zdCAiJXMiLiAgQ2VydD0lcycKKyAgICAgICAgJSAoaG9zdG5hbWUsIGNlcnQpKQorCisKK2RlZiBfb3B0aW9uYWxfZGVwZW5kZW5jaWVzKCk6CisgICAgdHJ5OgorICAgICAgICBpbXBvcnQgaXBhZGRyZXNzICAjIG5vcWEKKyAgICAgICAgbG9nZ2VyLmRlYnVnKCdpcGFkZHJlc3MgbW9kdWxlIGlzIGF2YWlsYWJsZScpCisgICAgICAgIGlwYWRkciA9IFRydWUKKyAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgIGxvZ2dlci53YXJuKCdpcGFkZHJlc3MgbW9kdWxlIGlzIHVuYXZhaWxhYmxlJykKKyAgICAgICAgaXBhZGRyID0gRmFsc2UKKworICAgIGlmIHN5cy5oZXh2ZXJzaW9uIDwgMHgwMzA1MDBGMDoKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZnJvbSBiYWNrcG9ydHMuc3NsX21hdGNoX2hvc3RuYW1lIGltcG9ydCBtYXRjaF9ob3N0bmFtZSwgX192ZXJzaW9uX18gYXMgdmVyCisgICAgICAgICAgICB2ZXIgPSBsaXN0KG1hcChpbnQsIHZlci5zcGxpdCgnLicpKSkKKyAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnYmFja3BvcnRzLnNzbF9tYXRjaF9ob3N0bmFtZSBtb2R1bGUgaXMgYXZhaWxhYmxlJykKKyAgICAgICAgICAgIG1hdGNoID0gbWF0Y2hfaG9zdG5hbWUKKyAgICAgICAgICAgIGlmIHZlclswXSAqIDEwICsgdmVyWzFdID49IDM1OgorICAgICAgICAgICAgICAgIHJldHVybiBpcGFkZHIsIG1hdGNoCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCdiYWNrcG9ydHMuc3NsX21hdGNoX2hvc3RuYW1lIG1vZHVsZSBpcyB0b28gb2xkJykKKyAgICAgICAgICAgICAgICBpcGFkZHIgPSBGYWxzZQorICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICBsb2dnZXIud2FybignYmFja3BvcnRzLnNzbF9tYXRjaF9ob3N0bmFtZSBpcyB1bmF2YWlsYWJsZScpCisgICAgICAgICAgICBpcGFkZHIgPSBGYWxzZQorICAgIHRyeToKKyAgICAgICAgZnJvbSBzc2wgaW1wb3J0IG1hdGNoX2hvc3RuYW1lCisgICAgICAgIGxvZ2dlci5kZWJ1Zygnc3NsLm1hdGNoX2hvc3RuYW1lIGlzIGF2YWlsYWJsZScpCisgICAgICAgIG1hdGNoID0gbWF0Y2hfaG9zdG5hbWUKKyAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgIGxvZ2dlci53YXJuKCd1c2luZyBsZWdhY3kgdmFsaWRhdGlvbiBjYWxsYmFjaycpCisgICAgICAgIG1hdGNoID0gbGVnYWN5X3ZhbGlkYXRlX2NhbGxiYWNrCisgICAgcmV0dXJuIGlwYWRkciwgbWF0Y2gKKworCitfbWF0Y2hfaGFzX2lwYWRkcmVzcywgX21hdGNoX2hvc3RuYW1lID0gX29wdGlvbmFsX2RlcGVuZGVuY2llcygpCmRpZmYgLS1naXQgYS9saWIvcHkvdGVzdC9faW1wb3J0X2xvY2FsX3RocmlmdC5weSBiL2xpYi9weS90ZXN0L19pbXBvcnRfbG9jYWxfdGhyaWZ0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyMjMxMjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHkvdGVzdC9faW1wb3J0X2xvY2FsX3RocmlmdC5weQpAQCAtMCwwICsxLDMwIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworaW1wb3J0IGdsb2IKK2ltcG9ydCBvcworaW1wb3J0IHN5cworCitTQ1JJUFRfRElSID0gb3MucGF0aC5yZWFscGF0aChvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pKQorUk9PVF9ESVIgPSBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5kaXJuYW1lKG9zLnBhdGguZGlybmFtZShTQ1JJUFRfRElSKSkpCisKK2ZvciBsaWJwYXRoIGluIGdsb2IuZ2xvYihvcy5wYXRoLmpvaW4oUk9PVF9ESVIsICdsaWInLCAncHknLCAnYnVpbGQnLCAnbGliLionKSk6CisgICAgaWYgbGlicGF0aC5lbmRzd2l0aCgnLSVkLiVkJyAlIChzeXMudmVyc2lvbl9pbmZvWzBdLCBzeXMudmVyc2lvbl9pbmZvWzFdKSk6CisgICAgICAgIHN5cy5wYXRoLmluc2VydCgwLCBsaWJwYXRoKQorICAgICAgICBicmVhawpkaWZmIC0tZ2l0IGEvbGliL3B5L3Rlc3QvdGVzdF9zc2xzb2NrZXQucHkgYi9saWIvcHkvdGVzdC90ZXN0X3NzbHNvY2tldC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTM0NGU1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5L3Rlc3QvdGVzdF9zc2xzb2NrZXQucHkKQEAgLTAsMCArMSwzNDYgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitpbXBvcnQgaW5zcGVjdAoraW1wb3J0IGxvZ2dpbmcKK2ltcG9ydCBvcworaW1wb3J0IHBsYXRmb3JtCitpbXBvcnQgc3NsCitpbXBvcnQgc3lzCitpbXBvcnQgdGVtcGZpbGUKK2ltcG9ydCB0aHJlYWRpbmcKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHdhcm5pbmdzCitmcm9tIGNvbnRleHRsaWIgaW1wb3J0IGNvbnRleHRtYW5hZ2VyCisKK2ltcG9ydCBfaW1wb3J0X2xvY2FsX3RocmlmdCAgIyBub3FhCisKK1NDUklQVF9ESVIgPSBvcy5wYXRoLnJlYWxwYXRoKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykpCitST09UX0RJUiA9IG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5kaXJuYW1lKFNDUklQVF9ESVIpKSkKK1NFUlZFUl9QRU0gPSBvcy5wYXRoLmpvaW4oUk9PVF9ESVIsICd0ZXN0JywgJ2tleXMnLCAnc2VydmVyLnBlbScpCitTRVJWRVJfQ0VSVCA9IG9zLnBhdGguam9pbihST09UX0RJUiwgJ3Rlc3QnLCAna2V5cycsICdzZXJ2ZXIuY3J0JykKK1NFUlZFUl9LRVkgPSBvcy5wYXRoLmpvaW4oUk9PVF9ESVIsICd0ZXN0JywgJ2tleXMnLCAnc2VydmVyLmtleScpCitDTElFTlRfQ0VSVF9OT19JUCA9IG9zLnBhdGguam9pbihST09UX0RJUiwgJ3Rlc3QnLCAna2V5cycsICdjbGllbnQuY3J0JykKK0NMSUVOVF9LRVlfTk9fSVAgPSBvcy5wYXRoLmpvaW4oUk9PVF9ESVIsICd0ZXN0JywgJ2tleXMnLCAnY2xpZW50LmtleScpCitDTElFTlRfQ0VSVCA9IG9zLnBhdGguam9pbihST09UX0RJUiwgJ3Rlc3QnLCAna2V5cycsICdjbGllbnRfdjMuY3J0JykKK0NMSUVOVF9LRVkgPSBvcy5wYXRoLmpvaW4oUk9PVF9ESVIsICd0ZXN0JywgJ2tleXMnLCAnY2xpZW50X3YzLmtleScpCitDTElFTlRfQ0EgPSBvcy5wYXRoLmpvaW4oUk9PVF9ESVIsICd0ZXN0JywgJ2tleXMnLCAnQ0EucGVtJykKKworVEVTVF9DSVBIRVJTID0gJ0RFUy1DQkMzLVNIQTpFQ0RIRS1SU0EtQUVTMTI4LUdDTS1TSEEyNTYnCisKKworY2xhc3MgU2VydmVyQWNjZXB0b3IodGhyZWFkaW5nLlRocmVhZCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNlcnZlciwgZXhwZWN0X2ZhaWx1cmU9RmFsc2UpOgorICAgICAgICBzdXBlcihTZXJ2ZXJBY2NlcHRvciwgc2VsZikuX19pbml0X18oKQorICAgICAgICBzZWxmLmRhZW1vbiA9IFRydWUKKyAgICAgICAgc2VsZi5fc2VydmVyID0gc2VydmVyCisgICAgICAgIHNlbGYuX2xpc3RlbmluZyA9IHRocmVhZGluZy5FdmVudCgpCisgICAgICAgIHNlbGYuX3BvcnQgPSBOb25lCisgICAgICAgIHNlbGYuX3BvcnRfYm91bmQgPSB0aHJlYWRpbmcuRXZlbnQoKQorICAgICAgICBzZWxmLl9jbGllbnQgPSBOb25lCisgICAgICAgIHNlbGYuX2NsaWVudF9hY2NlcHRlZCA9IHRocmVhZGluZy5FdmVudCgpCisgICAgICAgIHNlbGYuX2V4cGVjdF9mYWlsdXJlID0gZXhwZWN0X2ZhaWx1cmUKKyAgICAgICAgZnJhbWUgPSBpbnNwZWN0LnN0YWNrKDMpWzJdCisgICAgICAgIHNlbGYubmFtZSA9IGZyYW1lWzNdCisgICAgICAgIGRlbCBmcmFtZQorCisgICAgZGVmIHJ1bihzZWxmKToKKyAgICAgICAgc2VsZi5fc2VydmVyLmxpc3RlbigpCisgICAgICAgIHNlbGYuX2xpc3RlbmluZy5zZXQoKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGFkZHJlc3MgPSBzZWxmLl9zZXJ2ZXIuaGFuZGxlLmdldHNvY2tuYW1lKCkKKyAgICAgICAgICAgIGlmIGxlbihhZGRyZXNzKSA+IDE6CisgICAgICAgICAgICAgICAgIyBBRl9JTkVUIGFkZHJlc3NlcyBhcmUgMi10dXBsZXMgKGhvc3QsIHBvcnQpIGFuZCBBRl9JTkVUNiBhcmUKKyAgICAgICAgICAgICAgICAjIDQtdHVwbGVzIChob3N0LCBwb3J0LCAuLi4pLCBidXQgaW4gZWFjaCBjYXNlIHBvcnQgaXMgaW4gdGhlIHNlY29uZCBzbG90LgorICAgICAgICAgICAgICAgIHNlbGYuX3BvcnQgPSBhZGRyZXNzWzFdCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLl9wb3J0X2JvdW5kLnNldCgpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5fY2xpZW50ID0gc2VsZi5fc2VydmVyLmFjY2VwdCgpCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgICAgICBsb2dnaW5nLmV4Y2VwdGlvbignZXJyb3Igb24gc2VydmVyIHNpZGUgKCVzKTonICUgc2VsZi5uYW1lKQorICAgICAgICAgICAgaWYgbm90IHNlbGYuX2V4cGVjdF9mYWlsdXJlOgorICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLl9jbGllbnRfYWNjZXB0ZWQuc2V0KCkKKworICAgIGRlZiBhd2FpdF9saXN0ZW5pbmcoc2VsZik6CisgICAgICAgIHNlbGYuX2xpc3RlbmluZy53YWl0KCkKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBwb3J0KHNlbGYpOgorICAgICAgICBzZWxmLl9wb3J0X2JvdW5kLndhaXQoKQorICAgICAgICByZXR1cm4gc2VsZi5fcG9ydAorCisgICAgQHByb3BlcnR5CisgICAgZGVmIGNsaWVudChzZWxmKToKKyAgICAgICAgc2VsZi5fY2xpZW50X2FjY2VwdGVkLndhaXQoKQorICAgICAgICByZXR1cm4gc2VsZi5fY2xpZW50CisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIGlmIHNlbGYuX2NsaWVudDoKKyAgICAgICAgICAgIHNlbGYuX2NsaWVudC5jbG9zZSgpCisgICAgICAgIHNlbGYuX3NlcnZlci5jbG9zZSgpCisKKworIyBQeXRob24gMi42IGNvbXBhdAorY2xhc3MgQXNzZXJ0UmFpc2VzKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGV4cGVjdGVkKToKKyAgICAgICAgc2VsZi5fZXhwZWN0ZWQgPSBleHBlY3RlZAorCisgICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIF9fZXhpdF9fKHNlbGYsIGV4Y190eXBlLCBleGNfdmFsdWUsIHRyYWNlYmFjayk6CisgICAgICAgIGlmIG5vdCBleGNfdHlwZSBvciBub3QgaXNzdWJjbGFzcyhleGNfdHlwZSwgc2VsZi5fZXhwZWN0ZWQpOgorICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCdmYWlsJykKKyAgICAgICAgcmV0dXJuIFRydWUKKworCitjbGFzcyBUU1NMU29ja2V0VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIF9zZXJ2ZXJfc29ja2V0KHNlbGYsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIFRTU0xTZXJ2ZXJTb2NrZXQocG9ydD0wLCAqKmt3YXJncykKKworICAgIEBjb250ZXh0bWFuYWdlcgorICAgIGRlZiBfY29ubmVjdGFibGVfY2xpZW50KHNlbGYsIHNlcnZlciwgZXhwZWN0X2ZhaWx1cmU9RmFsc2UsIHBhdGg9Tm9uZSwgKipjbGllbnRfa3dhcmdzKToKKyAgICAgICAgYWNjID0gU2VydmVyQWNjZXB0b3Ioc2VydmVyLCBleHBlY3RfZmFpbHVyZSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgYWNjLnN0YXJ0KCkKKyAgICAgICAgICAgIGFjYy5hd2FpdF9saXN0ZW5pbmcoKQorCisgICAgICAgICAgICBob3N0LCBwb3J0ID0gKCdsb2NhbGhvc3QnLCBhY2MucG9ydCkgaWYgcGF0aCBpcyBOb25lIGVsc2UgKE5vbmUsIE5vbmUpCisgICAgICAgICAgICBjbGllbnQgPSBUU1NMU29ja2V0KGhvc3QsIHBvcnQsIHVuaXhfc29ja2V0PXBhdGgsICoqY2xpZW50X2t3YXJncykKKyAgICAgICAgICAgIHlpZWxkIGFjYywgY2xpZW50CisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBhY2MuY2xvc2UoKQorCisgICAgZGVmIF9hc3NlcnRfY29ubmVjdGlvbl9mYWlsdXJlKHNlbGYsIHNlcnZlciwgcGF0aD1Ob25lLCAqKmNsaWVudF9hcmdzKToKKyAgICAgICAgbG9nZ2luZy5kaXNhYmxlKGxvZ2dpbmcuQ1JJVElDQUwpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdpdGggc2VsZi5fY29ubmVjdGFibGVfY2xpZW50KHNlcnZlciwgVHJ1ZSwgcGF0aD1wYXRoLCAqKmNsaWVudF9hcmdzKSBhcyAoYWNjLCBjbGllbnQpOgorICAgICAgICAgICAgICAgICMgV2UgbmVlZCB0byB3YWl0IGZvciBhIGNvbm5lY3Rpb24gZmFpbHVyZSwgYnV0IG5vdCB0b28gbG9uZy4gIDIwbXMgaXMgYSB0dW5hYmxlCisgICAgICAgICAgICAgICAgIyBjb21wcm9taXNlIGJldHdlZW4gdGVzdCBzcGVlZCBhbmQgc3RhYmlsaXR5CisgICAgICAgICAgICAgICAgY2xpZW50LnNldFRpbWVvdXQoMjApCisgICAgICAgICAgICAgICAgd2l0aCBzZWxmLl9hc3NlcnRfcmFpc2VzKFRUcmFuc3BvcnRFeGNlcHRpb24pOgorICAgICAgICAgICAgICAgICAgICBjbGllbnQub3BlbigpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGFjYy5jbGllbnQgaXMgTm9uZSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGxvZ2dpbmcuZGlzYWJsZShsb2dnaW5nLk5PVFNFVCkKKworICAgIGRlZiBfYXNzZXJ0X3JhaXNlcyhzZWxmLCBleGMpOgorICAgICAgICBpZiBzeXMuaGV4dmVyc2lvbiA+PSAweDAyMDcwMEYwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuYXNzZXJ0UmFpc2VzKGV4YykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBBc3NlcnRSYWlzZXMoZXhjKQorCisgICAgZGVmIF9hc3NlcnRfY29ubmVjdGlvbl9zdWNjZXNzKHNlbGYsIHNlcnZlciwgcGF0aD1Ob25lLCAqKmNsaWVudF9hcmdzKToKKyAgICAgICAgd2l0aCBzZWxmLl9jb25uZWN0YWJsZV9jbGllbnQoc2VydmVyLCBwYXRoPXBhdGgsICoqY2xpZW50X2FyZ3MpIGFzIChhY2MsIGNsaWVudCk6CisgICAgICAgICAgICBjbGllbnQub3BlbigpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGFjYy5jbGllbnQgaXMgbm90IE5vbmUpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIGNsaWVudC5jbG9zZSgpCisKKyAgICAjIGRlcHJlY2F0ZWQgZmVhdHVyZQorICAgIGRlZiB0ZXN0X2RlcHJlY2F0aW9uKHNlbGYpOgorICAgICAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKHJlY29yZD1UcnVlKSBhcyB3OgorICAgICAgICAgICAgd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoJ2Fsd2F5cycsIGNhdGVnb3J5PURlcHJlY2F0aW9uV2FybmluZywgbW9kdWxlPXNlbGYuX19tb2R1bGVfXykKKyAgICAgICAgICAgIFRTU0xTb2NrZXQoJ2xvY2FsaG9zdCcsIDAsIHZhbGlkYXRlPVRydWUsIGNhX2NlcnRzPVNFUlZFUl9DRVJUKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odyksIDEpCisKKyAgICAgICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncyhyZWNvcmQ9VHJ1ZSkgYXMgdzoKKyAgICAgICAgICAgIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCdhbHdheXMnLCBjYXRlZ29yeT1EZXByZWNhdGlvbldhcm5pbmcsIG1vZHVsZT1zZWxmLl9fbW9kdWxlX18pCisgICAgICAgICAgICAjIERlcHJlY2F0ZWQgc2lnbmF0dXJlCisgICAgICAgICAgICAjIGRlZiBfX2luaXRfXyhzZWxmLCBob3N0PSdsb2NhbGhvc3QnLCBwb3J0PTkwOTAsIHZhbGlkYXRlPVRydWUsIGNhX2NlcnRzPU5vbmUsIGtleWZpbGU9Tm9uZSwgY2VydGZpbGU9Tm9uZSwgdW5peF9zb2NrZXQ9Tm9uZSwgY2lwaGVycz1Ob25lKToKKyAgICAgICAgICAgIFRTU0xTb2NrZXQoJ2xvY2FsaG9zdCcsIDAsIFRydWUsIFNFUlZFUl9DRVJULCBDTElFTlRfS0VZLCBDTElFTlRfQ0VSVCwgTm9uZSwgVEVTVF9DSVBIRVJTKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odyksIDcpCisKKyAgICAgICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncyhyZWNvcmQ9VHJ1ZSkgYXMgdzoKKyAgICAgICAgICAgIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCdhbHdheXMnLCBjYXRlZ29yeT1EZXByZWNhdGlvbldhcm5pbmcsIG1vZHVsZT1zZWxmLl9fbW9kdWxlX18pCisgICAgICAgICAgICAjIERlcHJlY2F0ZWQgc2lnbmF0dXJlCisgICAgICAgICAgICAjIGRlZiBfX2luaXRfXyhzZWxmLCBob3N0PU5vbmUsIHBvcnQ9OTA5MCwgY2VydGZpbGU9J2NlcnQucGVtJywgdW5peF9zb2NrZXQ9Tm9uZSwgY2lwaGVycz1Ob25lKToKKyAgICAgICAgICAgIFRTU0xTZXJ2ZXJTb2NrZXQoTm9uZSwgMCwgU0VSVkVSX1BFTSwgTm9uZSwgVEVTVF9DSVBIRVJTKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odyksIDMpCisKKyAgICAjIGRlcHJlY2F0ZWQgZmVhdHVyZQorICAgIGRlZiB0ZXN0X3NldF9jZXJ0X3JlcXNfYnlfdmFsaWRhdGUoc2VsZik6CisgICAgICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MocmVjb3JkPVRydWUpIGFzIHc6CisgICAgICAgICAgICB3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygnYWx3YXlzJywgY2F0ZWdvcnk9RGVwcmVjYXRpb25XYXJuaW5nLCBtb2R1bGU9c2VsZi5fX21vZHVsZV9fKQorICAgICAgICAgICAgYzEgPSBUU1NMU29ja2V0KCdsb2NhbGhvc3QnLCAwLCB2YWxpZGF0ZT1UcnVlLCBjYV9jZXJ0cz1TRVJWRVJfQ0VSVCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYzEuY2VydF9yZXFzLCBzc2wuQ0VSVF9SRVFVSVJFRCkKKworICAgICAgICAgICAgYzEgPSBUU1NMU29ja2V0KCdsb2NhbGhvc3QnLCAwLCB2YWxpZGF0ZT1GYWxzZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYzEuY2VydF9yZXFzLCBzc2wuQ0VSVF9OT05FKQorCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih3KSwgMikKKworICAgICMgZGVwcmVjYXRlZCBmZWF0dXJlCisgICAgZGVmIHRlc3Rfc2V0X3ZhbGlkYXRlX2J5X2NlcnRfcmVxcyhzZWxmKToKKyAgICAgICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncyhyZWNvcmQ9VHJ1ZSkgYXMgdzoKKyAgICAgICAgICAgIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCdhbHdheXMnLCBjYXRlZ29yeT1EZXByZWNhdGlvbldhcm5pbmcsIG1vZHVsZT1zZWxmLl9fbW9kdWxlX18pCisgICAgICAgICAgICBjMSA9IFRTU0xTb2NrZXQoJ2xvY2FsaG9zdCcsIDAsIGNlcnRfcmVxcz1zc2wuQ0VSVF9OT05FKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShjMS52YWxpZGF0ZSkKKworICAgICAgICAgICAgYzIgPSBUU1NMU29ja2V0KCdsb2NhbGhvc3QnLCAwLCBjZXJ0X3JlcXM9c3NsLkNFUlRfUkVRVUlSRUQsIGNhX2NlcnRzPVNFUlZFUl9DRVJUKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGMyLnZhbGlkYXRlKQorCisgICAgICAgICAgICBjMyA9IFRTU0xTb2NrZXQoJ2xvY2FsaG9zdCcsIDAsIGNlcnRfcmVxcz1zc2wuQ0VSVF9PUFRJT05BTCwgY2FfY2VydHM9U0VSVkVSX0NFUlQpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoYzMudmFsaWRhdGUpCisKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHcpLCAzKQorCisgICAgZGVmIHRlc3RfdW5peF9kb21haW5fc29ja2V0KHNlbGYpOgorICAgICAgICBpZiBwbGF0Zm9ybS5zeXN0ZW0oKSA9PSAnV2luZG93cyc6CisgICAgICAgICAgICBwcmludCgnc2tpcHBpbmcgdGVzdF91bml4X2RvbWFpbl9zb2NrZXQnKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGZkLCBwYXRoID0gdGVtcGZpbGUubWtzdGVtcCgpCisgICAgICAgIG9zLmNsb3NlKGZkKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZXJ2ZXIgPSBzZWxmLl9zZXJ2ZXJfc29ja2V0KHVuaXhfc29ja2V0PXBhdGgsIGtleWZpbGU9U0VSVkVSX0tFWSwgY2VydGZpbGU9U0VSVkVSX0NFUlQpCisgICAgICAgICAgICBzZWxmLl9hc3NlcnRfY29ubmVjdGlvbl9zdWNjZXNzKHNlcnZlciwgcGF0aD1wYXRoLCBjZXJ0X3JlcXM9c3NsLkNFUlRfTk9ORSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIG9zLnVubGluayhwYXRoKQorCisgICAgZGVmIHRlc3Rfc2VydmVyX2NlcnQoc2VsZik6CisgICAgICAgIHNlcnZlciA9IHNlbGYuX3NlcnZlcl9zb2NrZXQoa2V5ZmlsZT1TRVJWRVJfS0VZLCBjZXJ0ZmlsZT1TRVJWRVJfQ0VSVCkKKyAgICAgICAgc2VsZi5fYXNzZXJ0X2Nvbm5lY3Rpb25fc3VjY2VzcyhzZXJ2ZXIsIGNlcnRfcmVxcz1zc2wuQ0VSVF9SRVFVSVJFRCwgY2FfY2VydHM9U0VSVkVSX0NFUlQpCisKKyAgICAgICAgc2VydmVyID0gc2VsZi5fc2VydmVyX3NvY2tldChrZXlmaWxlPVNFUlZFUl9LRVksIGNlcnRmaWxlPVNFUlZFUl9DRVJUKQorICAgICAgICAjIHNlcnZlciBjZXJ0IG5vdCBpbiBjYV9jZXJ0cworICAgICAgICBzZWxmLl9hc3NlcnRfY29ubmVjdGlvbl9mYWlsdXJlKHNlcnZlciwgY2VydF9yZXFzPXNzbC5DRVJUX1JFUVVJUkVELCBjYV9jZXJ0cz1DTElFTlRfQ0VSVCkKKworICAgICAgICBzZXJ2ZXIgPSBzZWxmLl9zZXJ2ZXJfc29ja2V0KGtleWZpbGU9U0VSVkVSX0tFWSwgY2VydGZpbGU9U0VSVkVSX0NFUlQpCisgICAgICAgIHNlbGYuX2Fzc2VydF9jb25uZWN0aW9uX3N1Y2Nlc3Moc2VydmVyLCBjZXJ0X3JlcXM9c3NsLkNFUlRfTk9ORSkKKworICAgIGRlZiB0ZXN0X3NldF9zZXJ2ZXJfY2VydChzZWxmKToKKyAgICAgICAgc2VydmVyID0gc2VsZi5fc2VydmVyX3NvY2tldChrZXlmaWxlPVNFUlZFUl9LRVksIGNlcnRmaWxlPUNMSUVOVF9DRVJUKQorICAgICAgICB3aXRoIHNlbGYuX2Fzc2VydF9yYWlzZXMoRXhjZXB0aW9uKToKKyAgICAgICAgICAgIHNlcnZlci5jZXJ0ZmlsZSA9ICdmb28nCisgICAgICAgIHdpdGggc2VsZi5fYXNzZXJ0X3JhaXNlcyhFeGNlcHRpb24pOgorICAgICAgICAgICAgc2VydmVyLmNlcnRmaWxlID0gTm9uZQorICAgICAgICBzZXJ2ZXIuY2VydGZpbGUgPSBTRVJWRVJfQ0VSVAorICAgICAgICBzZWxmLl9hc3NlcnRfY29ubmVjdGlvbl9zdWNjZXNzKHNlcnZlciwgY2VydF9yZXFzPXNzbC5DRVJUX1JFUVVJUkVELCBjYV9jZXJ0cz1TRVJWRVJfQ0VSVCkKKworICAgIGRlZiB0ZXN0X2NsaWVudF9jZXJ0KHNlbGYpOgorICAgICAgICBpZiBub3QgX21hdGNoX2hhc19pcGFkZHJlc3M6CisgICAgICAgICAgICBwcmludCgnc2tpcHBpbmcgdGVzdF9jbGllbnRfY2VydCcpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VydmVyID0gc2VsZi5fc2VydmVyX3NvY2tldCgKKyAgICAgICAgICAgIGNlcnRfcmVxcz1zc2wuQ0VSVF9SRVFVSVJFRCwga2V5ZmlsZT1TRVJWRVJfS0VZLAorICAgICAgICAgICAgY2VydGZpbGU9U0VSVkVSX0NFUlQsIGNhX2NlcnRzPUNMSUVOVF9DRVJUKQorICAgICAgICBzZWxmLl9hc3NlcnRfY29ubmVjdGlvbl9mYWlsdXJlKHNlcnZlciwgY2VydF9yZXFzPXNzbC5DRVJUX05PTkUsIGNlcnRmaWxlPVNFUlZFUl9DRVJULCBrZXlmaWxlPVNFUlZFUl9LRVkpCisKKyAgICAgICAgc2VydmVyID0gc2VsZi5fc2VydmVyX3NvY2tldCgKKyAgICAgICAgICAgIGNlcnRfcmVxcz1zc2wuQ0VSVF9SRVFVSVJFRCwga2V5ZmlsZT1TRVJWRVJfS0VZLAorICAgICAgICAgICAgY2VydGZpbGU9U0VSVkVSX0NFUlQsIGNhX2NlcnRzPUNMSUVOVF9DQSkKKyAgICAgICAgc2VsZi5fYXNzZXJ0X2Nvbm5lY3Rpb25fZmFpbHVyZShzZXJ2ZXIsIGNlcnRfcmVxcz1zc2wuQ0VSVF9OT05FLCBjZXJ0ZmlsZT1DTElFTlRfQ0VSVF9OT19JUCwga2V5ZmlsZT1DTElFTlRfS0VZX05PX0lQKQorCisgICAgICAgIHNlcnZlciA9IHNlbGYuX3NlcnZlcl9zb2NrZXQoCisgICAgICAgICAgICBjZXJ0X3JlcXM9c3NsLkNFUlRfUkVRVUlSRUQsIGtleWZpbGU9U0VSVkVSX0tFWSwKKyAgICAgICAgICAgIGNlcnRmaWxlPVNFUlZFUl9DRVJULCBjYV9jZXJ0cz1DTElFTlRfQ0EpCisgICAgICAgIHNlbGYuX2Fzc2VydF9jb25uZWN0aW9uX3N1Y2Nlc3Moc2VydmVyLCBjZXJ0X3JlcXM9c3NsLkNFUlRfTk9ORSwgY2VydGZpbGU9Q0xJRU5UX0NFUlQsIGtleWZpbGU9Q0xJRU5UX0tFWSkKKworICAgICAgICBzZXJ2ZXIgPSBzZWxmLl9zZXJ2ZXJfc29ja2V0KAorICAgICAgICAgICAgY2VydF9yZXFzPXNzbC5DRVJUX09QVElPTkFMLCBrZXlmaWxlPVNFUlZFUl9LRVksCisgICAgICAgICAgICBjZXJ0ZmlsZT1TRVJWRVJfQ0VSVCwgY2FfY2VydHM9Q0xJRU5UX0NBKQorICAgICAgICBzZWxmLl9hc3NlcnRfY29ubmVjdGlvbl9zdWNjZXNzKHNlcnZlciwgY2VydF9yZXFzPXNzbC5DRVJUX05PTkUsIGNlcnRmaWxlPUNMSUVOVF9DRVJULCBrZXlmaWxlPUNMSUVOVF9LRVkpCisKKyAgICBkZWYgdGVzdF9jaXBoZXJzKHNlbGYpOgorICAgICAgICBzZXJ2ZXIgPSBzZWxmLl9zZXJ2ZXJfc29ja2V0KGtleWZpbGU9U0VSVkVSX0tFWSwgY2VydGZpbGU9U0VSVkVSX0NFUlQsIGNpcGhlcnM9VEVTVF9DSVBIRVJTKQorICAgICAgICBzZWxmLl9hc3NlcnRfY29ubmVjdGlvbl9zdWNjZXNzKHNlcnZlciwgY2FfY2VydHM9U0VSVkVSX0NFUlQsIGNpcGhlcnM9VEVTVF9DSVBIRVJTKQorCisgICAgICAgIGlmIG5vdCBUU1NMU29ja2V0Ll9oYXNfY2lwaGVyczoKKyAgICAgICAgICAgICMgdW5pdHRlc3Quc2tpcCBpcyBub3QgYXZhaWxhYmxlIGZvciBQeXRob24gMi42CisgICAgICAgICAgICBwcmludCgnc2tpcHBpbmcgdGVzdF9jaXBoZXJzJykKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZXJ2ZXIgPSBzZWxmLl9zZXJ2ZXJfc29ja2V0KGtleWZpbGU9U0VSVkVSX0tFWSwgY2VydGZpbGU9U0VSVkVSX0NFUlQpCisgICAgICAgIHNlbGYuX2Fzc2VydF9jb25uZWN0aW9uX2ZhaWx1cmUoc2VydmVyLCBjYV9jZXJ0cz1TRVJWRVJfQ0VSVCwgY2lwaGVycz0nTlVMTCcpCisKKyAgICAgICAgc2VydmVyID0gc2VsZi5fc2VydmVyX3NvY2tldChrZXlmaWxlPVNFUlZFUl9LRVksIGNlcnRmaWxlPVNFUlZFUl9DRVJULCBjaXBoZXJzPVRFU1RfQ0lQSEVSUykKKyAgICAgICAgc2VsZi5fYXNzZXJ0X2Nvbm5lY3Rpb25fZmFpbHVyZShzZXJ2ZXIsIGNhX2NlcnRzPVNFUlZFUl9DRVJULCBjaXBoZXJzPSdOVUxMJykKKworICAgIGRlZiB0ZXN0X3NzbDJfYW5kX3NzbDNfZGlzYWJsZWQoc2VsZik6CisgICAgICAgIGlmIG5vdCBoYXNhdHRyKHNzbCwgJ1BST1RPQ09MX1NTTHYzJyk6CisgICAgICAgICAgICBwcmludCgnUFJPVE9DT0xfU1NMdjMgaXMgbm90IGF2YWlsYWJsZScpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZXJ2ZXIgPSBzZWxmLl9zZXJ2ZXJfc29ja2V0KGtleWZpbGU9U0VSVkVSX0tFWSwgY2VydGZpbGU9U0VSVkVSX0NFUlQpCisgICAgICAgICAgICBzZWxmLl9hc3NlcnRfY29ubmVjdGlvbl9mYWlsdXJlKHNlcnZlciwgY2FfY2VydHM9U0VSVkVSX0NFUlQsIHNzbF92ZXJzaW9uPXNzbC5QUk9UT0NPTF9TU0x2MykKKworICAgICAgICAgICAgc2VydmVyID0gc2VsZi5fc2VydmVyX3NvY2tldChrZXlmaWxlPVNFUlZFUl9LRVksIGNlcnRmaWxlPVNFUlZFUl9DRVJULCBzc2xfdmVyc2lvbj1zc2wuUFJPVE9DT0xfU1NMdjMpCisgICAgICAgICAgICBzZWxmLl9hc3NlcnRfY29ubmVjdGlvbl9mYWlsdXJlKHNlcnZlciwgY2FfY2VydHM9U0VSVkVSX0NFUlQpCisKKyAgICAgICAgaWYgbm90IGhhc2F0dHIoc3NsLCAnUFJPVE9DT0xfU1NMdjInKToKKyAgICAgICAgICAgIHByaW50KCdQUk9UT0NPTF9TU0x2MiBpcyBub3QgYXZhaWxhYmxlJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlcnZlciA9IHNlbGYuX3NlcnZlcl9zb2NrZXQoa2V5ZmlsZT1TRVJWRVJfS0VZLCBjZXJ0ZmlsZT1TRVJWRVJfQ0VSVCkKKyAgICAgICAgICAgIHNlbGYuX2Fzc2VydF9jb25uZWN0aW9uX2ZhaWx1cmUoc2VydmVyLCBjYV9jZXJ0cz1TRVJWRVJfQ0VSVCwgc3NsX3ZlcnNpb249c3NsLlBST1RPQ09MX1NTTHYyKQorCisgICAgICAgICAgICBzZXJ2ZXIgPSBzZWxmLl9zZXJ2ZXJfc29ja2V0KGtleWZpbGU9U0VSVkVSX0tFWSwgY2VydGZpbGU9U0VSVkVSX0NFUlQsIHNzbF92ZXJzaW9uPXNzbC5QUk9UT0NPTF9TU0x2MikKKyAgICAgICAgICAgIHNlbGYuX2Fzc2VydF9jb25uZWN0aW9uX2ZhaWx1cmUoc2VydmVyLCBjYV9jZXJ0cz1TRVJWRVJfQ0VSVCkKKworICAgIGRlZiB0ZXN0X25ld2VyX3RscyhzZWxmKToKKyAgICAgICAgaWYgbm90IFRTU0xTb2NrZXQuX2hhc19zc2xfY29udGV4dDoKKyAgICAgICAgICAgICMgdW5pdHRlc3Quc2tpcCBpcyBub3QgYXZhaWxhYmxlIGZvciBQeXRob24gMi42CisgICAgICAgICAgICBwcmludCgnc2tpcHBpbmcgdGVzdF9uZXdlcl90bHMnKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIG5vdCBoYXNhdHRyKHNzbCwgJ1BST1RPQ09MX1RMU3YxXzInKToKKyAgICAgICAgICAgIHByaW50KCdQUk9UT0NPTF9UTFN2MV8yIGlzIG5vdCBhdmFpbGFibGUnKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VydmVyID0gc2VsZi5fc2VydmVyX3NvY2tldChrZXlmaWxlPVNFUlZFUl9LRVksIGNlcnRmaWxlPVNFUlZFUl9DRVJULCBzc2xfdmVyc2lvbj1zc2wuUFJPVE9DT0xfVExTdjFfMikKKyAgICAgICAgICAgIHNlbGYuX2Fzc2VydF9jb25uZWN0aW9uX3N1Y2Nlc3Moc2VydmVyLCBjYV9jZXJ0cz1TRVJWRVJfQ0VSVCwgc3NsX3ZlcnNpb249c3NsLlBST1RPQ09MX1RMU3YxXzIpCisKKyAgICAgICAgaWYgbm90IGhhc2F0dHIoc3NsLCAnUFJPVE9DT0xfVExTdjFfMScpOgorICAgICAgICAgICAgcHJpbnQoJ1BST1RPQ09MX1RMU3YxXzEgaXMgbm90IGF2YWlsYWJsZScpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZXJ2ZXIgPSBzZWxmLl9zZXJ2ZXJfc29ja2V0KGtleWZpbGU9U0VSVkVSX0tFWSwgY2VydGZpbGU9U0VSVkVSX0NFUlQsIHNzbF92ZXJzaW9uPXNzbC5QUk9UT0NPTF9UTFN2MV8xKQorICAgICAgICAgICAgc2VsZi5fYXNzZXJ0X2Nvbm5lY3Rpb25fc3VjY2VzcyhzZXJ2ZXIsIGNhX2NlcnRzPVNFUlZFUl9DRVJULCBzc2xfdmVyc2lvbj1zc2wuUFJPVE9DT0xfVExTdjFfMSkKKworICAgICAgICBpZiBub3QgaGFzYXR0cihzc2wsICdQUk9UT0NPTF9UTFN2MV8xJykgb3Igbm90IGhhc2F0dHIoc3NsLCAnUFJPVE9DT0xfVExTdjFfMicpOgorICAgICAgICAgICAgcHJpbnQoJ1BST1RPQ09MX1RMU3YxXzEgYW5kL29yIFBST1RPQ09MX1RMU3YxXzIgaXMgbm90IGF2YWlsYWJsZScpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZXJ2ZXIgPSBzZWxmLl9zZXJ2ZXJfc29ja2V0KGtleWZpbGU9U0VSVkVSX0tFWSwgY2VydGZpbGU9U0VSVkVSX0NFUlQsIHNzbF92ZXJzaW9uPXNzbC5QUk9UT0NPTF9UTFN2MV8yKQorICAgICAgICAgICAgc2VsZi5fYXNzZXJ0X2Nvbm5lY3Rpb25fZmFpbHVyZShzZXJ2ZXIsIGNhX2NlcnRzPVNFUlZFUl9DRVJULCBzc2xfdmVyc2lvbj1zc2wuUFJPVE9DT0xfVExTdjFfMSkKKworICAgIGRlZiB0ZXN0X3NzbF9jb250ZXh0KHNlbGYpOgorICAgICAgICBpZiBub3QgVFNTTFNvY2tldC5faGFzX3NzbF9jb250ZXh0OgorICAgICAgICAgICAgIyB1bml0dGVzdC5za2lwIGlzIG5vdCBhdmFpbGFibGUgZm9yIFB5dGhvbiAyLjYKKyAgICAgICAgICAgIHByaW50KCdza2lwcGluZyB0ZXN0X3NzbF9jb250ZXh0JykKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZXJ2ZXJfY29udGV4dCA9IHNzbC5jcmVhdGVfZGVmYXVsdF9jb250ZXh0KHNzbC5QdXJwb3NlLkNMSUVOVF9BVVRIKQorICAgICAgICBzZXJ2ZXJfY29udGV4dC5sb2FkX2NlcnRfY2hhaW4oU0VSVkVSX0NFUlQsIFNFUlZFUl9LRVkpCisgICAgICAgIHNlcnZlcl9jb250ZXh0LmxvYWRfdmVyaWZ5X2xvY2F0aW9ucyhDTElFTlRfQ0EpCisgICAgICAgIHNlcnZlcl9jb250ZXh0LnZlcmlmeV9tb2RlID0gc3NsLkNFUlRfUkVRVUlSRUQKKyAgICAgICAgc2VydmVyID0gc2VsZi5fc2VydmVyX3NvY2tldChzc2xfY29udGV4dD1zZXJ2ZXJfY29udGV4dCkKKworICAgICAgICBjbGllbnRfY29udGV4dCA9IHNzbC5jcmVhdGVfZGVmYXVsdF9jb250ZXh0KHNzbC5QdXJwb3NlLlNFUlZFUl9BVVRIKQorICAgICAgICBjbGllbnRfY29udGV4dC5sb2FkX2NlcnRfY2hhaW4oQ0xJRU5UX0NFUlQsIENMSUVOVF9LRVkpCisgICAgICAgIGNsaWVudF9jb250ZXh0LmxvYWRfdmVyaWZ5X2xvY2F0aW9ucyhTRVJWRVJfQ0VSVCkKKyAgICAgICAgY2xpZW50X2NvbnRleHQudmVyaWZ5X21vZGUgPSBzc2wuQ0VSVF9SRVFVSVJFRAorCisgICAgICAgIHNlbGYuX2Fzc2VydF9jb25uZWN0aW9uX3N1Y2Nlc3Moc2VydmVyLCBzc2xfY29udGV4dD1jbGllbnRfY29udGV4dCkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIGxvZ2dpbmcuYmFzaWNDb25maWcobGV2ZWw9bG9nZ2luZy5XQVJOKQorICAgIGZyb20gdGhyaWZ0LnRyYW5zcG9ydC5UU1NMU29ja2V0IGltcG9ydCBUU1NMU29ja2V0LCBUU1NMU2VydmVyU29ja2V0LCBfbWF0Y2hfaGFzX2lwYWRkcmVzcworICAgIGZyb20gdGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0RXhjZXB0aW9uCisKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weS90ZXN0L3RocmlmdF9qc29uLnB5IGIvbGliL3B5L3Rlc3QvdGhyaWZ0X2pzb24ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBlN2E0NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weS90ZXN0L3RocmlmdF9qc29uLnB5CkBAIC0wLDAgKzEsNTEgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitpbXBvcnQgc3lzCitpbXBvcnQgdW5pdHRlc3QKKworaW1wb3J0IF9pbXBvcnRfbG9jYWxfdGhyaWZ0ICAjIG5vcWEKK2Zyb20gdGhyaWZ0LnByb3RvY29sLlRKU09OUHJvdG9jb2wgaW1wb3J0IFRKU09OUHJvdG9jb2wKK2Zyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydAorCisjCisjIEluIG9yZGVyIHRvIHJ1biB0aGUgdGVzdCB1bmRlciBXaW5kb3dzLiBXZSBuZWVkIHRvIGNyZWF0ZSBzeW1ib2xpYyBsaW5rCisjIG5hbWUgJ3RocmlmdCcgdG8gJy4uL3NyYycgZm9sZGVyIGJ5IHVzaW5nOgorIworIyBta2xpbmsgL0QgdGhyaWZ0IC4uXHNyYworIworCisKK2NsYXNzIFRlc3RKU09OU3RyaW5nKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2VzY2FwZWRfdW5pY29kZV9zdHJpbmcoc2VsZik6CisgICAgICAgIHVuaWNvZGVfanNvbiA9IGInImhlbGxvIFxcdTBlMDFcXHUwZTAyXFx1MGUwM1xcdWQ4MzVcXHVkY2FiXFx1ZGI0MFxcdWRjNzAgdW5pY29kZSInCisgICAgICAgIHVuaWNvZGVfdGV4dCA9IHUnaGVsbG8gXHUwZTAxXHUwZTAyXHUwZTAzXFUwMDAxRDRBQlxVMDAwRTAwNzAgdW5pY29kZScKKworICAgICAgICBidWYgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIodW5pY29kZV9qc29uKQorICAgICAgICB0cmFuc3BvcnQgPSBUVHJhbnNwb3J0LlRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkoKS5nZXRUcmFuc3BvcnQoYnVmKQorICAgICAgICBwcm90b2NvbCA9IFRKU09OUHJvdG9jb2wodHJhbnNwb3J0KQorCisgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMjoKKyAgICAgICAgICAgIHVuaWNvZGVfdGV4dCA9IHVuaWNvZGVfdGV4dC5lbmNvZGUoJ3V0ZjgnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHByb3RvY29sLnJlYWRTdHJpbmcoKSwgdW5pY29kZV90ZXh0KQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9saWIvcmIvTWFrZWZpbGUuYW0gYi9saWIvcmIvTWFrZWZpbGUuYW0KaW5kZXggMmQwYzEyZS4uMTM3ZWRiNCAxMDA3NTUKLS0tIGEvbGliL3JiL01ha2VmaWxlLmFtCisrKyBiL2xpYi9yYi9NYWtlZmlsZS5hbQpAQCAtMjMsMTIgKzIzLDEzIEBACiAKIGFsbC1sb2NhbDoKIAkkKEJVTkRMRVIpIGluc3RhbGwKLQkkKEJVTkRMRVIpIGV4ZWMgcmFrZQorCSQoQlVORExFUikgZXhlYyByYWtlIGJ1aWxkX2V4dAogCiBpbnN0YWxsLWV4ZWMtaG9vazoKIAkkKEJVTkRMRVIpIGV4ZWMgcmFrZSBpbnN0YWxsCiAKIGNsZWFuLWxvY2FsOgorCSQoQlVORExFUikgaW5zdGFsbAogCSQoQlVORExFUikgZXhlYyByYWtlIGNsZWFuCiAKIGNoZWNrLWxvY2FsOiBhbGwKQEAgLTM4LDYgKzM5LDcgQEAKIGVuZGlmCiAKIEVYVFJBX0RJU1QgPSBcCisJY29kaW5nX3N0YW5kYXJkcy5tZCBcCiAJUmFrZWZpbGUgXAogCUdlbWZpbGUgXAogCXRocmlmdC5nZW1zcGVjIFwKZGlmZiAtLWdpdCBhL2xpYi9yYi9SYWtlZmlsZSBiL2xpYi9yYi9SYWtlZmlsZQppbmRleCBlZjAwYTlmLi41ZTVlNWFjIDEwMDY0NAotLS0gYS9saWIvcmIvUmFrZWZpbGUKKysrIGIvbGliL3JiL1Jha2VmaWxlCkBAIC0zOCw3ICszOCw3IEBACiBlbmQKIAogZGVzYyAnQ29tcGlsZSB0aGUgLnRocmlmdCBmaWxlcyBmb3IgdGhlIHNwZWNzJwotdGFzayA6J2dlbi1yYicgPT4gWzonZ2VuLXJiOnNwZWMnLCA6J2dlbi1yYjpuYW1lc3BhY2VkX3NwZWMnLCA6J2dlbi1yYjpiZW5jaG1hcmsnLCA6J2dlbi1yYjpkZWJ1Z19wcm90byddCit0YXNrIDonZ2VuLXJiJyA9PiBbOidnZW4tcmI6c3BlYycsIDonZ2VuLXJiOm5hbWVzcGFjZWRfc3BlYycsIDonZ2VuLXJiOmZsYXRfc3BlYycsIDonZ2VuLXJiOmJlbmNobWFyaycsIDonZ2VuLXJiOmRlYnVnX3Byb3RvJ10KIG5hbWVzcGFjZSA6J2dlbi1yYicgZG8KICAgdGFzayA6J3NwZWMnIGRvCiAgICAgZGlyID0gRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICcvc3BlYycKQEAgLTQ3LDcgKzQ3LDE1IEBACiAKICAgdGFzayA6J25hbWVzcGFjZWRfc3BlYycgZG8KICAgICBkaXIgPSBGaWxlLmRpcm5hbWUoX19GSUxFX18pICsgJy9zcGVjJwotICAgIHNoIFRIUklGVCwgJy0tZ2VuJywgJ3JiOm5hbWVzcGFjZWQnLCAnLXJlY3Vyc2UnLCAnLW8nLCBkaXIsICIje2Rpcn0vVGhyaWZ0TmFtZXNwYWNlZFNwZWMudGhyaWZ0IgorICAgIHNoIFRIUklGVCwgJy0tZ2VuJywgJ3JiOm5hbWVzcGFjZWQnLCAnLS1yZWN1cnNlJywgJy1vJywgZGlyLCAiI3tkaXJ9L1RocmlmdE5hbWVzcGFjZWRTcGVjLnRocmlmdCIKKyAgICBzaCBUSFJJRlQsICctLWdlbicsICdyYjpuYW1lc3BhY2VkJywgJy0tcmVjdXJzZScsICctbycsIGRpciwgIiN7ZGlyfS9CYXNlU2VydmljZS50aHJpZnQiCisgICAgc2ggVEhSSUZULCAnLS1nZW4nLCAncmI6bmFtZXNwYWNlZCcsICctLXJlY3Vyc2UnLCAnLW8nLCBkaXIsICIje2Rpcn0vRXh0ZW5kZWRTZXJ2aWNlLnRocmlmdCIKKyAgZW5kCisKKyAgdGFzayA6J2ZsYXRfc3BlYycgZG8KKyAgICBkaXIgPSBGaWxlLmRpcm5hbWUoX19GSUxFX18pICsgJy9zcGVjJworICAgIG1rZGlyX3AoIiN7ZGlyfS9nZW4tcmIvZmxhdCIpCisgICAgc2ggVEhSSUZULCAnLS1nZW4nLCAncmInLCAnLS1yZWN1cnNlJywgJy1vdXQnLCAiI3tkaXJ9L2dlbi1yYi9mbGF0IiwgIiN7ZGlyfS9UaHJpZnROYW1lc3BhY2VkU3BlYy50aHJpZnQiCiAgIGVuZAogCiAgIHRhc2sgOidiZW5jaG1hcmsnIGRvCkBAIC02Myw2ICs3MSw3IEBACiAKIGRlc2MgIkJ1aWxkIHRoZSBuYXRpdmUgbGlicmFyeSIKIHRhc2sgOmJ1aWxkX2V4dCA9PiA6J2dlbi1yYicgZG8KKyAgIG5leHQgaWYgZGVmaW5lZD8oUlVCWV9FTkdJTkUpICYmIFJVQllfRU5HSU5FID1+IC9qcnVieS8KICAgIERpcjo6Y2hkaXIoRmlsZTo6ZGlybmFtZSgnZXh0L2V4dGNvbmYucmInKSkgZG8KICAgICAgIHVubGVzcyBzaCAicnVieSAje0ZpbGU6OmJhc2VuYW1lKCdleHQvZXh0Y29uZi5yYicpfSIKICAgICAgICAgJHN0ZGVyci5wdXRzICJGYWlsZWQgdG8gcnVuIGV4dGNvbmYiCkBAIC03OCw3ICs4Nyw3IEBACiBkZXNjICdSdW4gdGhlIGNvbXBpbGVyIHRlc3RzIChyZXF1aXJlcyBmdWxsIHRocmlmdCBjaGVja291dCknCiB0YXNrIDp0ZXN0IGRvCiAgICMgZW5zdXJlIHRoaXMgaXMgYSBmdWxsIHRocmlmdCBjaGVja291dCBhbmQgbm90IGEgdGFyYmFsbCBvZiB0aGUgcnVieSBsaWJzCi0gIGNtZCA9ICdoZWFkIC0xIC4uLy4uL1JFQURNRSAyPi9kZXYvbnVsbCB8IGdyZXAgVGhyaWZ0ID4vZGV2L251bGwgMj4vZGV2L251bGwnCisgIGNtZCA9ICdoZWFkIC0xIC4uLy4uL1JFQURNRS5tZCAyPi9kZXYvbnVsbCB8IGdyZXAgVGhyaWZ0ID4vZGV2L251bGwgMj4vZGV2L251bGwnCiAgIHN5c3RlbShjbWQpIG9yIGZhaWwgInJha2UgdGVzdCByZXF1aXJlcyBhIGZ1bGwgdGhyaWZ0IGNoZWNrb3V0IgogICBzaCAnbWFrZScsICctQycsIEZpbGUuZGlybmFtZShfX0ZJTEVfXykgKyAiLy4uLy4uL3Rlc3QvcmIiLCAiY2hlY2siCiBlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9jb2Rpbmdfc3RhbmRhcmRzLm1kIGIvbGliL3JiL2NvZGluZ19zdGFuZGFyZHMubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEwMzkwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9yYi9jb2Rpbmdfc3RhbmRhcmRzLm1kCkBAIC0wLDAgKzEgQEAKK1BsZWFzZSBmb2xsb3cgW0dlbmVyYWwgQ29kaW5nIFN0YW5kYXJkc10oL2RvYy9jb2Rpbmdfc3RhbmRhcmRzLm1kKQpkaWZmIC0tZ2l0IGEvbGliL3JiL2V4dC9iaW5hcnlfcHJvdG9jb2xfYWNjZWxlcmF0ZWQuYyBiL2xpYi9yYi9leHQvYmluYXJ5X3Byb3RvY29sX2FjY2VsZXJhdGVkLmMKaW5kZXggOGIyN2RiYy4uNjVjYmU1ZiAxMDA2NDQKLS0tIGEvbGliL3JiL2V4dC9iaW5hcnlfcHJvdG9jb2xfYWNjZWxlcmF0ZWQuYworKysgYi9saWIvcmIvZXh0L2JpbmFyeV9wcm90b2NvbF9hY2NlbGVyYXRlZC5jCkBAIC0yODMsMjcgKzI4MywyNyBAQAogICByZXR1cm4gUW5pbDsKIH0KIAotVkFMVUUgcmJfdGhpZnRfYmluYXJ5X3Byb3RvX3JlYWRfc3RydWN0X2JlZ2luKFZBTFVFIHNlbGYpIHsKK1ZBTFVFIHJiX3RocmlmdF9iaW5hcnlfcHJvdG9fcmVhZF9zdHJ1Y3RfYmVnaW4oVkFMVUUgc2VsZikgewogICByZXR1cm4gUW5pbDsKIH0KIAotVkFMVUUgcmJfdGhpZnRfYmluYXJ5X3Byb3RvX3JlYWRfc3RydWN0X2VuZChWQUxVRSBzZWxmKSB7CitWQUxVRSByYl90aHJpZnRfYmluYXJ5X3Byb3RvX3JlYWRfc3RydWN0X2VuZChWQUxVRSBzZWxmKSB7CiAgIHJldHVybiBRbmlsOwogfQogCi1WQUxVRSByYl90aGlmdF9iaW5hcnlfcHJvdG9fcmVhZF9maWVsZF9lbmQoVkFMVUUgc2VsZikgeworVkFMVUUgcmJfdGhyaWZ0X2JpbmFyeV9wcm90b19yZWFkX2ZpZWxkX2VuZChWQUxVRSBzZWxmKSB7CiAgIHJldHVybiBRbmlsOwogfQogCi1WQUxVRSByYl90aGlmdF9iaW5hcnlfcHJvdG9fcmVhZF9tYXBfZW5kKFZBTFVFIHNlbGYpIHsKK1ZBTFVFIHJiX3RocmlmdF9iaW5hcnlfcHJvdG9fcmVhZF9tYXBfZW5kKFZBTFVFIHNlbGYpIHsKICAgcmV0dXJuIFFuaWw7CiB9CiAKLVZBTFVFIHJiX3RoaWZ0X2JpbmFyeV9wcm90b19yZWFkX2xpc3RfZW5kKFZBTFVFIHNlbGYpIHsKK1ZBTFVFIHJiX3RocmlmdF9iaW5hcnlfcHJvdG9fcmVhZF9saXN0X2VuZChWQUxVRSBzZWxmKSB7CiAgIHJldHVybiBRbmlsOwogfQogCi1WQUxVRSByYl90aGlmdF9iaW5hcnlfcHJvdG9fcmVhZF9zZXRfZW5kKFZBTFVFIHNlbGYpIHsKK1ZBTFVFIHJiX3RocmlmdF9iaW5hcnlfcHJvdG9fcmVhZF9zZXRfZW5kKFZBTFVFIHNlbGYpIHsKICAgcmV0dXJuIFFuaWw7CiB9CiAKQEAgLTQ0OSwxMiArNDQ5LDEyIEBACiAgIHJiX2RlZmluZV9tZXRob2QoYnBhX2NsYXNzLCAicmVhZF9iaW5hcnkiLCAgICAgICAgIHJiX3RocmlmdF9iaW5hcnlfcHJvdG9fcmVhZF9iaW5hcnksIDApOwogICAvLyB1bnVzZWQgbWV0aG9kcwogICByYl9kZWZpbmVfbWV0aG9kKGJwYV9jbGFzcywgInJlYWRfbWVzc2FnZV9lbmQiLCByYl90aHJpZnRfYmluYXJ5X3Byb3RvX3JlYWRfbWVzc2FnZV9lbmQsIDApOwotICByYl9kZWZpbmVfbWV0aG9kKGJwYV9jbGFzcywgInJlYWRfc3RydWN0X2JlZ2luIiwgcmJfdGhpZnRfYmluYXJ5X3Byb3RvX3JlYWRfc3RydWN0X2JlZ2luLCAwKTsKLSAgcmJfZGVmaW5lX21ldGhvZChicGFfY2xhc3MsICJyZWFkX3N0cnVjdF9lbmQiLCByYl90aGlmdF9iaW5hcnlfcHJvdG9fcmVhZF9zdHJ1Y3RfZW5kLCAwKTsKLSAgcmJfZGVmaW5lX21ldGhvZChicGFfY2xhc3MsICJyZWFkX2ZpZWxkX2VuZCIsIHJiX3RoaWZ0X2JpbmFyeV9wcm90b19yZWFkX2ZpZWxkX2VuZCwgMCk7Ci0gIHJiX2RlZmluZV9tZXRob2QoYnBhX2NsYXNzLCAicmVhZF9tYXBfZW5kIiwgcmJfdGhpZnRfYmluYXJ5X3Byb3RvX3JlYWRfbWFwX2VuZCwgMCk7Ci0gIHJiX2RlZmluZV9tZXRob2QoYnBhX2NsYXNzLCAicmVhZF9saXN0X2VuZCIsIHJiX3RoaWZ0X2JpbmFyeV9wcm90b19yZWFkX2xpc3RfZW5kLCAwKTsKLSAgcmJfZGVmaW5lX21ldGhvZChicGFfY2xhc3MsICJyZWFkX3NldF9lbmQiLCByYl90aGlmdF9iaW5hcnlfcHJvdG9fcmVhZF9zZXRfZW5kLCAwKTsKKyAgcmJfZGVmaW5lX21ldGhvZChicGFfY2xhc3MsICJyZWFkX3N0cnVjdF9iZWdpbiIsIHJiX3RocmlmdF9iaW5hcnlfcHJvdG9fcmVhZF9zdHJ1Y3RfYmVnaW4sIDApOworICByYl9kZWZpbmVfbWV0aG9kKGJwYV9jbGFzcywgInJlYWRfc3RydWN0X2VuZCIsIHJiX3RocmlmdF9iaW5hcnlfcHJvdG9fcmVhZF9zdHJ1Y3RfZW5kLCAwKTsKKyAgcmJfZGVmaW5lX21ldGhvZChicGFfY2xhc3MsICJyZWFkX2ZpZWxkX2VuZCIsIHJiX3RocmlmdF9iaW5hcnlfcHJvdG9fcmVhZF9maWVsZF9lbmQsIDApOworICByYl9kZWZpbmVfbWV0aG9kKGJwYV9jbGFzcywgInJlYWRfbWFwX2VuZCIsIHJiX3RocmlmdF9iaW5hcnlfcHJvdG9fcmVhZF9tYXBfZW5kLCAwKTsKKyAgcmJfZGVmaW5lX21ldGhvZChicGFfY2xhc3MsICJyZWFkX2xpc3RfZW5kIiwgcmJfdGhyaWZ0X2JpbmFyeV9wcm90b19yZWFkX2xpc3RfZW5kLCAwKTsKKyAgcmJfZGVmaW5lX21ldGhvZChicGFfY2xhc3MsICJyZWFkX3NldF9lbmQiLCByYl90aHJpZnRfYmluYXJ5X3Byb3RvX3JlYWRfc2V0X2VuZCwgMCk7CiAKICAgcmJ1Zl9pdmFyX2lkID0gcmJfaW50ZXJuKCJAcmJ1ZiIpOwogfQpkaWZmIC0tZ2l0IGEvbGliL3JiL2V4dC9zdHJ1Y3QuYyBiL2xpYi9yYi9leHQvc3RydWN0LmMKaW5kZXggZjUwMGQwMy4uZTNhYTg1NSAxMDA2NDQKLS0tIGEvbGliL3JiL2V4dC9zdHJ1Y3QuYworKysgYi9saWIvcmIvZXh0L3N0cnVjdC5jCkBAIC0yOTAsNyArMjkwLDcgQEAKIAogICAgIGlmIChUWVBFKHZhbHVlKSA9PSBUX0FSUkFZKSB7CiAgICAgICBpdGVtcyA9IHZhbHVlOwotICAgIH0gZWxzZSB7ICAgICAgICAKKyAgICB9IGVsc2UgewogICAgICAgaWYgKHJiX2NTZXQgPT0gQ0xBU1NfT0YodmFsdWUpKSB7CiAgICAgICAgIGl0ZW1zID0gcmJfZnVuY2FsbCh2YWx1ZSwgZW50cmllc19tZXRob2RfaWQsIDApOwogICAgICAgfSBlbHNlIHsKQEAgLTY3MCw2ICs2NzAsMTAgQEAKIAogICBWQUxVRSBmaWVsZF9pbmZvID0gcmJfaGFzaF9hcmVmKHN0cnVjdF9maWVsZHMsIGZpZWxkX2lkKTsKIAorICBpZihOSUxfUChmaWVsZF9pbmZvKSkgeworICAgIHJiX3JhaXNlKHJiX2VSdW50aW1lRXJyb3IsICJzZXRfZmllbGQgaXMgbm90IHZhbGlkIGZvciB0aGlzIHVuaW9uISIpOworICB9CisKICAgVkFMVUUgdHR5cGVfdmFsdWUgPSByYl9oYXNoX2FyZWYoZmllbGRfaW5mbywgdHlwZV9zeW0pOwogICBpbnQgdHR5cGUgPSBGSVgySU5UKHR0eXBlX3ZhbHVlKTsKIApkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQucmIgYi9saWIvcmIvbGliL3RocmlmdC5yYgppbmRleCBmYjllMDRhLi4wZjU4MTIyIDEwMDY0NAotLS0gYS9saWIvcmIvbGliL3RocmlmdC5yYgorKysgYi9saWIvcmIvbGliL3RocmlmdC5yYgpAQCAtMSw0ICsxLDQgQEAKLSMgCisjCiAjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKICMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKICMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KQEAgLTYsMTYgKzYsMTYgQEAKICMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQogIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCiAjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIyAKKyMKICMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMgCisjCiAjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKICMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KICMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCiAjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCiAjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jIAorIwogIyBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgogIyBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgogIyBkZXRhaWxzLgpAQCAtMjcsNiArMjcsNyBAQAogcmVxdWlyZSAndGhyaWZ0L2V4Y2VwdGlvbnMnCiByZXF1aXJlICd0aHJpZnQvdHlwZXMnCiByZXF1aXJlICd0aHJpZnQvcHJvY2Vzc29yJworcmVxdWlyZSAndGhyaWZ0L211bHRpcGxleGVkX3Byb2Nlc3NvcicKIHJlcXVpcmUgJ3RocmlmdC9jbGllbnQnCiByZXF1aXJlICd0aHJpZnQvc3RydWN0JwogcmVxdWlyZSAndGhyaWZ0L3VuaW9uJwpAQCAtNDIsMTIgKzQzLDE1IEBACiByZXF1aXJlICd0aHJpZnQvcHJvdG9jb2wvYmluYXJ5X3Byb3RvY29sX2FjY2VsZXJhdGVkJwogcmVxdWlyZSAndGhyaWZ0L3Byb3RvY29sL2NvbXBhY3RfcHJvdG9jb2wnCiByZXF1aXJlICd0aHJpZnQvcHJvdG9jb2wvanNvbl9wcm90b2NvbCcKK3JlcXVpcmUgJ3RocmlmdC9wcm90b2NvbC9tdWx0aXBsZXhlZF9wcm90b2NvbCcKIAogIyB0cmFuc3BvcnQKIHJlcXVpcmUgJ3RocmlmdC90cmFuc3BvcnQvYmFzZV90cmFuc3BvcnQnCiByZXF1aXJlICd0aHJpZnQvdHJhbnNwb3J0L2Jhc2Vfc2VydmVyX3RyYW5zcG9ydCcKIHJlcXVpcmUgJ3RocmlmdC90cmFuc3BvcnQvc29ja2V0JworcmVxdWlyZSAndGhyaWZ0L3RyYW5zcG9ydC9zc2xfc29ja2V0JwogcmVxdWlyZSAndGhyaWZ0L3RyYW5zcG9ydC9zZXJ2ZXJfc29ja2V0JworcmVxdWlyZSAndGhyaWZ0L3RyYW5zcG9ydC9zc2xfc2VydmVyX3NvY2tldCcKIHJlcXVpcmUgJ3RocmlmdC90cmFuc3BvcnQvdW5peF9zb2NrZXQnCiByZXF1aXJlICd0aHJpZnQvdHJhbnNwb3J0L3VuaXhfc2VydmVyX3NvY2tldCcKIHJlcXVpcmUgJ3RocmlmdC90cmFuc3BvcnQvYnVmZmVyZWRfdHJhbnNwb3J0JwpkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvbXVsdGlwbGV4ZWRfcHJvY2Vzc29yLnJiIGIvbGliL3JiL2xpYi90aHJpZnQvbXVsdGlwbGV4ZWRfcHJvY2Vzc29yLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3MzRjMDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcmIvbGliL3RocmlmdC9tdWx0aXBsZXhlZF9wcm9jZXNzb3IucmIKQEAgLTAsMCArMSw3NiBAQAorIyAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIyAKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMgCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3JlcXVpcmUgJ3RocmlmdC9wcm90b2NvbC9wcm90b2NvbF9kZWNvcmF0b3InCityZXF1aXJlICd0aHJpZnQvcHJvdG9jb2wvYmFzZV9wcm90b2NvbCcKKworbW9kdWxlIFRocmlmdAorICBjbGFzcyBNdWx0aXBsZXhlZFByb2Nlc3NvcgorICAgIGRlZiBpbml0aWFsaXplCisgICAgICBAYWN0dWFsX3Byb2Nlc3NvcnMgPSB7fQorICAgIGVuZAorIAorICAgIGRlZiByZWdpc3Rlcl9wcm9jZXNzb3Ioc2VydmljZV9uYW1lLCBwcm9jZXNzb3IpCisgICAgICBAYWN0dWFsX3Byb2Nlc3NvcnNbc2VydmljZV9uYW1lXSA9IHByb2Nlc3NvcgorICAgIGVuZAorIAorICAgIGRlZiBwcm9jZXNzKGlwcm90LCBvcHJvdCkKKyAgICAgIG5hbWUsIHR5cGUsIHNlcWlkID0gaXByb3QucmVhZF9tZXNzYWdlX2JlZ2luCisgICAgICBjaGVja190eXBlKHR5cGUpCisgICAgICBjaGVja19zZXBhcmF0b3IobmFtZSkKKyAgICAgIHNlcnZpY2VfbmFtZSwgbWV0aG9kID0gbmFtZS5zcGxpdCgnOicpCisgICAgICBwcm9jZXNzb3Ioc2VydmljZV9uYW1lKS5wcm9jZXNzKFN0b3JlZE1lc3NhZ2VQcm90b2NvbC5uZXcoaXByb3QsIFttZXRob2QsIHR5cGUsIHNlcWlkXSksIG9wcm90KQorICAgIGVuZAorCisgICAgcHJvdGVjdGVkCisKKyAgICBkZWYgcHJvY2Vzc29yKHNlcnZpY2VfbmFtZSkKKyAgICAgIGlmIEBhY3R1YWxfcHJvY2Vzc29ycy5oYXNfa2V5PyhzZXJ2aWNlX25hbWUpCisgICAgICAgIEBhY3R1YWxfcHJvY2Vzc29yc1tzZXJ2aWNlX25hbWVdCisgICAgICBlbHNlCisgICAgICAgIHJhaXNlIFRocmlmdDo6RXhjZXB0aW9uLm5ldygiU2VydmljZSBuYW1lIG5vdCBmb3VuZDogI3tzZXJ2aWNlX25hbWV9LiBEaWQgeW91IGZvcmdldCB0byBjYWxsICN7c2VsZi5jbGFzcy5uYW1lfSNyZWdpc3Rlcl9wcm9jZXNzb3I/IikKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgZGVmIGNoZWNrX3R5cGUodHlwZSkKKyAgICAgIHVubGVzcyBbTWVzc2FnZVR5cGVzOjpDQUxMLCBNZXNzYWdlVHlwZXM6Ok9ORVdBWV0uaW5jbHVkZT8odHlwZSkKKyAgICAgICAgcmFpc2UgVGhyaWZ0OjpFeGNlcHRpb24ubmV3KCdUaGlzIHNob3VsZCBub3QgaGF2ZSBoYXBwZW5lZCE/JykKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgZGVmIGNoZWNrX3NlcGFyYXRvcihuYW1lKQorICAgICAgaWYgbmFtZS5jb3VudCgnOicpIDwgMQorICAgICAgICByYWlzZSBUaHJpZnQ6OkV4Y2VwdGlvbi5uZXcoIlNlcnZpY2UgbmFtZSBub3QgZm91bmQgaW4gbWVzc2FnZSBuYW1lOiAje25hbWV9LiBEaWQgeW91IGZvcmdldCB0byB1c2UgYSBUaHJpZnQ6OlByb3RvY29sOjpNdWx0aXBsZXhlZFByb3RvY29sIGluIHlvdXIgY2xpZW50PyIpCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCisKKyAgY2xhc3MgU3RvcmVkTWVzc2FnZVByb3RvY29sIDwgQmFzZVByb3RvY29sCisKKyAgICBpbmNsdWRlIFByb3RvY29sRGVjb3JhdG9yCisgICAgCisgICAgZGVmIGluaXRpYWxpemUocHJvdG9jb2wsIG1lc3NhZ2VfYmVnaW4pCisgICAgICBzdXBlcihwcm90b2NvbCkKKyAgICAgIEBtZXNzYWdlX2JlZ2luID0gbWVzc2FnZV9iZWdpbgorICAgIGVuZAorCisgICAgZGVmIHJlYWRfbWVzc2FnZV9iZWdpbgorICAgICAgQG1lc3NhZ2VfYmVnaW4KKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3Byb2Nlc3Nvci5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0L3Byb2Nlc3Nvci5yYgppbmRleCA1ZDllMGExLi5jZTIxZTEyIDEwMDY0NAotLS0gYS9saWIvcmIvbGliL3RocmlmdC9wcm9jZXNzb3IucmIKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvcHJvY2Vzc29yLnJiCkBAIC0xNywyNSArMTcsMzYgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjIAogCityZXF1aXJlICdsb2dnZXInCisKIG1vZHVsZSBUaHJpZnQKICAgbW9kdWxlIFByb2Nlc3NvcgotICAgIGRlZiBpbml0aWFsaXplKGhhbmRsZXIpCisgICAgZGVmIGluaXRpYWxpemUoaGFuZGxlciwgbG9nZ2VyPW5pbCkKICAgICAgIEBoYW5kbGVyID0gaGFuZGxlcgorICAgICAgaWYgbG9nZ2VyLm5pbD8KKyAgICAgICAgQGxvZ2dlciA9IExvZ2dlci5uZXcoU1RERVJSKQorICAgICAgICBAbG9nZ2VyLmxldmVsID0gTG9nZ2VyOjpXQVJOCisgICAgICBlbHNlCisgICAgICAgIEBsb2dnZXIgPSBsb2dnZXIKKyAgICAgIGVuZAogICAgIGVuZAogCiAgICAgZGVmIHByb2Nlc3MoaXByb3QsIG9wcm90KQogICAgICAgbmFtZSwgdHlwZSwgc2VxaWQgID0gaXByb3QucmVhZF9tZXNzYWdlX2JlZ2luCiAgICAgICBpZiByZXNwb25kX3RvPygicHJvY2Vzc18je25hbWV9IikKLSAgICAgICAgc2VuZCgicHJvY2Vzc18je25hbWV9Iiwgc2VxaWQsIGlwcm90LCBvcHJvdCkKKyAgICAgICAgYmVnaW4KKyAgICAgICAgICBzZW5kKCJwcm9jZXNzXyN7bmFtZX0iLCBzZXFpZCwgaXByb3QsIG9wcm90KQorICAgICAgICByZXNjdWUgPT4gZQorICAgICAgICAgIHggPSBBcHBsaWNhdGlvbkV4Y2VwdGlvbi5uZXcoQXBwbGljYXRpb25FeGNlcHRpb246OklOVEVSTkFMX0VSUk9SLCAnSW50ZXJuYWwgZXJyb3InKQorICAgICAgICAgIEBsb2dnZXIuZGVidWcgIkludGVybmFsIGVycm9yIDogI3tlLm1lc3NhZ2V9XG4je2UuYmFja3RyYWNlLmpvaW4oIlxuIil9IgorICAgICAgICAgIHdyaXRlX2Vycm9yKHgsIG9wcm90LCBuYW1lLCBzZXFpZCkKKyAgICAgICAgZW5kCiAgICAgICAgIHRydWUKICAgICAgIGVsc2UKICAgICAgICAgaXByb3Quc2tpcChUeXBlczo6U1RSVUNUKQogICAgICAgICBpcHJvdC5yZWFkX21lc3NhZ2VfZW5kCiAgICAgICAgIHggPSBBcHBsaWNhdGlvbkV4Y2VwdGlvbi5uZXcoQXBwbGljYXRpb25FeGNlcHRpb246OlVOS05PV05fTUVUSE9ELCAnVW5rbm93biBmdW5jdGlvbiAnK25hbWUpCi0gICAgICAgIG9wcm90LndyaXRlX21lc3NhZ2VfYmVnaW4obmFtZSwgTWVzc2FnZVR5cGVzOjpFWENFUFRJT04sIHNlcWlkKQotICAgICAgICB4LndyaXRlKG9wcm90KQotICAgICAgICBvcHJvdC53cml0ZV9tZXNzYWdlX2VuZAotICAgICAgICBvcHJvdC50cmFucy5mbHVzaAorICAgICAgICB3cml0ZV9lcnJvcih4LCBvcHJvdCwgbmFtZSwgc2VxaWQpCiAgICAgICAgIGZhbHNlCiAgICAgICBlbmQKICAgICBlbmQKQEAgLTUzLDUgKzY0LDEyIEBACiAgICAgICBvcHJvdC53cml0ZV9tZXNzYWdlX2VuZAogICAgICAgb3Byb3QudHJhbnMuZmx1c2gKICAgICBlbmQKKworICAgIGRlZiB3cml0ZV9lcnJvcihlcnIsIG9wcm90LCBuYW1lLCBzZXFpZCkKKyAgICAgIG9wcm90LndyaXRlX21lc3NhZ2VfYmVnaW4obmFtZSwgTWVzc2FnZVR5cGVzOjpFWENFUFRJT04sIHNlcWlkKQorICAgICAgZXJyLndyaXRlKG9wcm90KQorICAgICAgb3Byb3Qud3JpdGVfbWVzc2FnZV9lbmQKKyAgICAgIG9wcm90LnRyYW5zLmZsdXNoCisgICAgZW5kCiAgIGVuZAogZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC9wcm90b2NvbC9iYXNlX3Byb3RvY29sLnJiIGIvbGliL3JiL2xpYi90aHJpZnQvcHJvdG9jb2wvYmFzZV9wcm90b2NvbC5yYgppbmRleCA4OGY0NGQ0Li41YzY5M2U5IDEwMDY0NAotLS0gYS9saWIvcmIvbGliL3RocmlmdC9wcm90b2NvbC9iYXNlX3Byb3RvY29sLnJiCisrKyBiL2xpYi9yYi9saWIvdGhyaWZ0L3Byb3RvY29sL2Jhc2VfcHJvdG9jb2wucmIKQEAgLTM2OSwxMSArMzY5LDE5IEBACiAgICAgICAgIHJlYWRfbGlzdF9lbmQKICAgICAgIGVuZAogICAgIGVuZAorICAgIAorICAgIGRlZiB0b19zCisgICAgICAiI3t0cmFucy50b19zfSIKKyAgICBlbmQKICAgZW5kCiAKICAgY2xhc3MgQmFzZVByb3RvY29sRmFjdG9yeQogICAgIGRlZiBnZXRfcHJvdG9jb2wodHJhbnMpCiAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCiAgICAgZW5kCisgICAgCisgICAgZGVmIHRvX3MKKyAgICAgICJiYXNlIgorICAgIGVuZAogICBlbmQKLWVuZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK2VuZApkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvcHJvdG9jb2wvYmluYXJ5X3Byb3RvY29sLnJiIGIvbGliL3JiL2xpYi90aHJpZnQvcHJvdG9jb2wvYmluYXJ5X3Byb3RvY29sLnJiCmluZGV4IGU3MGIxZTMuLmQ4Mjc5ZGIgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L3Byb3RvY29sL2JpbmFyeV9wcm90b2NvbC5yYgorKysgYi9saWIvcmIvbGliL3RocmlmdC9wcm90b2NvbC9iaW5hcnlfcHJvdG9jb2wucmIKQEAgLTIyNiwxMiArMjI2LDE5IEBACiAgICAgICBzaXplID0gcmVhZF9pMzIKICAgICAgIHRyYW5zLnJlYWRfYWxsKHNpemUpCiAgICAgZW5kCi0KKyAgICAKKyAgICBkZWYgdG9fcworICAgICAgImJpbmFyeSgje3N1cGVyLnRvX3N9KSIKKyAgICBlbmQKICAgZW5kCiAKICAgY2xhc3MgQmluYXJ5UHJvdG9jb2xGYWN0b3J5IDwgQmFzZVByb3RvY29sRmFjdG9yeQogICAgIGRlZiBnZXRfcHJvdG9jb2wodHJhbnMpCiAgICAgICByZXR1cm4gVGhyaWZ0OjpCaW5hcnlQcm90b2NvbC5uZXcodHJhbnMpCiAgICAgZW5kCisgICAgCisgICAgZGVmIHRvX3MKKyAgICAgICJiaW5hcnkiCisgICAgZW5kCiAgIGVuZAogZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC9wcm90b2NvbC9iaW5hcnlfcHJvdG9jb2xfYWNjZWxlcmF0ZWQucmIgYi9saWIvcmIvbGliL3RocmlmdC9wcm90b2NvbC9iaW5hcnlfcHJvdG9jb2xfYWNjZWxlcmF0ZWQucmIKaW5kZXggNzBlYTY1Mi4uMDliMDI2NCAxMDA2NDQKLS0tIGEvbGliL3JiL2xpYi90aHJpZnQvcHJvdG9jb2wvYmluYXJ5X3Byb3RvY29sX2FjY2VsZXJhdGVkLnJiCisrKyBiL2xpYi9yYi9saWIvdGhyaWZ0L3Byb3RvY29sL2JpbmFyeV9wcm90b2NvbF9hY2NlbGVyYXRlZC5yYgpAQCAtMzUsNSArMzUsMTMgQEAKICAgICAgICAgQmluYXJ5UHJvdG9jb2wubmV3KHRyYW5zKQogICAgICAgZW5kCiAgICAgZW5kCisKKyAgICBkZWYgdG9fcworICAgICAgaWYgKGRlZmluZWQ/IEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQpCisgICAgICAgICJiaW5hcnktYWNjZWwiCisgICAgICBlbHNlCisgICAgICAgICJiaW5hcnkiCisgICAgICBlbmQKKyAgICBlbmQKICAgZW5kCiBlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3Byb3RvY29sL2NvbXBhY3RfcHJvdG9jb2wucmIgYi9saWIvcmIvbGliL3RocmlmdC9wcm90b2NvbC9jb21wYWN0X3Byb3RvY29sLnJiCmluZGV4IDYwNWVlYTYuLjFmOWJkMzAgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L3Byb3RvY29sL2NvbXBhY3RfcHJvdG9jb2wucmIKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvcHJvdG9jb2wvY29tcGFjdF9wcm90b2NvbC5yYgpAQCAtMzQ1LDYgKzM0NSwxMCBAQAogICAgICAgc2l6ZSA9IHJlYWRfdmFyaW50MzIoKQogICAgICAgdHJhbnMucmVhZF9hbGwoc2l6ZSkKICAgICBlbmQKKyAgICAKKyAgICBkZWYgdG9fcworICAgICAgImNvbXBhY3QoI3tzdXBlci50b19zfSkiCisgICAgZW5kCiAKICAgICBwcml2YXRlCiAgICAgCkBAIC00MzEsNSArNDM1LDkgQEAKICAgICBkZWYgZ2V0X3Byb3RvY29sKHRyYW5zKQogICAgICAgQ29tcGFjdFByb3RvY29sLm5ldyh0cmFucykKICAgICBlbmQKKyAgICAKKyAgICBkZWYgdG9fcworICAgICAgImNvbXBhY3QiCisgICAgZW5kCiAgIGVuZAogZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC9wcm90b2NvbC9qc29uX3Byb3RvY29sLnJiIGIvbGliL3JiL2xpYi90aHJpZnQvcHJvdG9jb2wvanNvbl9wcm90b2NvbC5yYgppbmRleCA5ZjAwNjlkLi45MWU3NGU0IDEwMDY0NAotLS0gYS9saWIvcmIvbGliL3RocmlmdC9wcm90b2NvbC9qc29uX3Byb3RvY29sLnJiCisrKyBiL2xpYi9yYi9saWIvdGhyaWZ0L3Byb3RvY29sL2pzb25fcHJvdG9jb2wucmIKQEAgLTE4LDYgKzE4LDcgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjIAogCityZXF1aXJlICdiYXNlNjQnCiAKIG1vZHVsZSBUaHJpZnQKICAgY2xhc3MgTG9va2FoZWFkUmVhZGVyCkBAIC0zMTAsNyArMzExLDcgQEAKICAgICBkZWYgd3JpdGVfanNvbl9iYXNlNjQoc3RyKQogICAgICAgQGNvbnRleHQud3JpdGUodHJhbnMpCiAgICAgICB0cmFucy53cml0ZShAQGtKU09OU3RyaW5nRGVsaW1pdGVyKQotICAgICAgd3JpdGVfanNvbl9zdHJpbmcoW3N0cl0ucGFjaygibSIpKQorICAgICAgdHJhbnMud3JpdGUoQmFzZTY0LnN0cmljdF9lbmNvZGU2NChzdHIpKQogICAgICAgdHJhbnMud3JpdGUoQEBrSlNPTlN0cmluZ0RlbGltaXRlcikKICAgICBlbmQKIApAQCAtMzMyLDcgKzMzMyw3IEBACiAgICAgIyAiTmFOIiBvciAiSW5maW5pdHkiIG9yICItSW5maW5pdHkiLgogICAgIGRlZiB3cml0ZV9qc29uX2RvdWJsZShudW0pCiAgICAgICBAY29udGV4dC53cml0ZSh0cmFucykKLSAgICAgICMgTm9ybWFsaXplIG91dHB1dCBvZiBib29zdDo6bGV4aWNhbF9jYXN0IGZvciBOYU5zIGFuZCBJbmZpbml0aWVzCisgICAgICAjIE5vcm1hbGl6ZSBvdXRwdXQgb2YgdGhyaWZ0Ojp0b19zdHJpbmcgZm9yIE5hTnMgYW5kIEluZmluaXRpZXMKICAgICAgIHNwZWNpYWwgPSBmYWxzZTsKICAgICAgIGlmIChudW0ubmFuPykKICAgICAgICAgc3BlY2lhbCA9IHRydWU7CkBAIC01MTMsNyArNTE0LDcgQEAKICAgICAgICMgVGhlIGVsZW1lbnRzIG9mIHRoaXMgYXJyYXkgbXVzdCBtYXRjaCB1cCB3aXRoIHRoZSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIGluCiAgICAgICAjIGVzY2FwZV9jaGFycwogICAgICAgZXNjYXBlX2NoYXJfdmFscyA9IFsKLSAgICAgICAgJyInLCAnXFwnLCAnLycsICdcYicsICdcZicsICdcbicsICdccicsICdcdCcsCisgICAgICAgICJcIiIsICJcXCIsICJcLyIsICJcYiIsICJcZiIsICJcbiIsICJcciIsICJcdCIsCiAgICAgICBdCiAKICAgICAgIGlmICFza2lwQ29udGV4dApAQCAtNTQ2LDcgKzU0NywxNSBAQAogCiAgICAgIyBSZWFkcyBhIGJsb2NrIG9mIGJhc2U2NCBjaGFyYWN0ZXJzLCBkZWNvZGluZyBpdCwgYW5kIHJldHVybnMgdmlhIHN0cgogICAgIGRlZiByZWFkX2pzb25fYmFzZTY0Ci0gICAgICByZWFkX2pzb25fc3RyaW5nLnVucGFjaygibSIpWzBdCisgICAgICBzdHIgPSByZWFkX2pzb25fc3RyaW5nCisgICAgICBtID0gc3RyLmxlbmd0aCAlIDQKKyAgICAgIGlmIG0gIT0gMAorICAgICAgICAjIEFkZCBtaXNzaW5nIHBhZGRpbmcKKyAgICAgICAgKDQgLSBtKS50aW1lcyBkbworICAgICAgICAgIHN0ciArPSAnPScKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICAgIEJhc2U2NC5zdHJpY3RfZGVjb2RlNjQoc3RyKQogICAgIGVuZAogCiAgICAgIyBSZWFkcyBhIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMsIHN0b3BwaW5nIGF0IHRoZSBmaXJzdCBvbmUgdGhhdCBpcyBub3QKQEAgLTc1OSwxMSArNzY4LDE5IEBACiAgICAgZGVmIHJlYWRfYmluYXJ5CiAgICAgICByZWFkX2pzb25fYmFzZTY0CiAgICAgZW5kCisKKyAgICBkZWYgdG9fcworICAgICAgImpzb24oI3tzdXBlci50b19zfSkiCisgICAgZW5kCiAgIGVuZAogCiAgIGNsYXNzIEpzb25Qcm90b2NvbEZhY3RvcnkgPCBCYXNlUHJvdG9jb2xGYWN0b3J5CiAgICAgZGVmIGdldF9wcm90b2NvbCh0cmFucykKICAgICAgIHJldHVybiBUaHJpZnQ6Okpzb25Qcm90b2NvbC5uZXcodHJhbnMpCiAgICAgZW5kCisKKyAgICBkZWYgdG9fcworICAgICAgImpzb24iCisgICAgZW5kCiAgIGVuZAogZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC9wcm90b2NvbC9tdWx0aXBsZXhlZF9wcm90b2NvbC5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0L3Byb3RvY29sL211bHRpcGxleGVkX3Byb3RvY29sLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0NDI4YTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcmIvbGliL3RocmlmdC9wcm90b2NvbC9tdWx0aXBsZXhlZF9wcm90b2NvbC5yYgpAQCAtMCwwICsxLDQ0IEBACisjIAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjIAorIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIyAKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKworcmVxdWlyZSAndGhyaWZ0L3Byb3RvY29sL3Byb3RvY29sX2RlY29yYXRvcicKKworbW9kdWxlIFRocmlmdAorICBjbGFzcyBNdWx0aXBsZXhlZFByb3RvY29sIDwgQmFzZVByb3RvY29sCisKKyAgICBpbmNsdWRlIFByb3RvY29sRGVjb3JhdG9yCisKKyAgICBkZWYgaW5pdGlhbGl6ZShwcm90b2NvbCwgc2VydmljZV9uYW1lKQorICAgICAgc3VwZXIocHJvdG9jb2wpCisgICAgICBAc2VydmljZV9uYW1lID0gc2VydmljZV9uYW1lCisgICAgZW5kCisKKyAgICBkZWYgd3JpdGVfbWVzc2FnZV9iZWdpbihuYW1lLCB0eXBlLCBzZXFpZCkKKyAgICAgIGNhc2UgdHlwZQorICAgICAgd2hlbiBNZXNzYWdlVHlwZXM6OkNBTEwsIE1lc3NhZ2VUeXBlczo6T05FV0FZCisgICAgICAgIEBwcm90b2NvbC53cml0ZV9tZXNzYWdlX2JlZ2luKCIje0BzZXJ2aWNlX25hbWV9OiN7bmFtZX0iLCB0eXBlLCBzZXFpZCkKKyAgICAgIGVsc2UKKyAgICAgICAgQHByb3RvY29sLndyaXRlX21lc3NhZ2VfYmVnaW4obmFtZSwgdHlwZSwgc2VxaWQpCisgICAgICBlbmQgCisgICAgZW5kCisgICAgCisgICAgZGVmIHRvX3MKKyAgICAgICJtdWx0aXBsZXhlZCgje0BzZXJ2aWNlX25hbWU9QHByb3RvY29sLnRvX3N9KSIKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3Byb3RvY29sL3Byb3RvY29sX2RlY29yYXRvci5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0L3Byb3RvY29sL3Byb3RvY29sX2RlY29yYXRvci5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWUzYzE1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvcHJvdG9jb2wvcHJvdG9jb2xfZGVjb3JhdG9yLnJiCkBAIC0wLDAgKzEsMTk0IEBACisjIAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjIAorIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIyAKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKworbW9kdWxlIFRocmlmdAorICBtb2R1bGUgUHJvdG9jb2xEZWNvcmF0b3IKKworICAgIGRlZiBpbml0aWFsaXplKHByb3RvY29sKQorICAgICAgQHByb3RvY29sID0gcHJvdG9jb2wKKyAgICBlbmQKKworICAgIGRlZiB0cmFucworICAgICAgQHByb3RvY29sLnRyYW5zCisgICAgZW5kCisKKyAgICBkZWYgd3JpdGVfbWVzc2FnZV9iZWdpbihuYW1lLCB0eXBlLCBzZXFpZCkKKyAgICAgIEBwcm90b2NvbC53cml0ZV9tZXNzYWdlX2JlZ2luCisgICAgZW5kCisKKyAgICBkZWYgd3JpdGVfbWVzc2FnZV9lbmQKKyAgICAgIEBwcm90b2NvbC53cml0ZV9tZXNzYWdlX2VuZAorICAgIGVuZAorCisgICAgZGVmIHdyaXRlX3N0cnVjdF9iZWdpbihuYW1lKQorICAgICAgQHByb3RvY29sLndyaXRlX3N0cnVjdF9iZWdpbihuYW1lKQorICAgIGVuZAorCisgICAgZGVmIHdyaXRlX3N0cnVjdF9lbmQKKyAgICAgIEBwcm90b2NvbC53cml0ZV9zdHJ1Y3RfZW5kCisgICAgZW5kCisKKyAgICBkZWYgd3JpdGVfZmllbGRfYmVnaW4obmFtZSwgdHlwZSwgaWQpCisgICAgICBAcHJvdG9jb2wud3JpdGVfZmllbGRfYmVnaW4obmFtZSwgdHlwZSwgaWQpCisgICAgZW5kCisKKyAgICBkZWYgd3JpdGVfZmllbGRfZW5kCisgICAgICBAcHJvdG9jb2wud3JpdGVfZmllbGRfZW5kCisgICAgZW5kCisKKyAgICBkZWYgd3JpdGVfZmllbGRfc3RvcAorICAgICAgQHByb3RvY29sLndyaXRlX2ZpZWxkX3N0b3AKKyAgICBlbmQKKworICAgIGRlZiB3cml0ZV9tYXBfYmVnaW4oa3R5cGUsIHZ0eXBlLCBzaXplKQorICAgICAgQHByb3RvY29sLndyaXRlX21hcF9iZWdpbihrdHlwZSwgdnR5cGUsIHNpemUpCisgICAgZW5kCisKKyAgICBkZWYgd3JpdGVfbWFwX2VuZAorICAgICAgQHByb3RvY29sLndyaXRlX21hcF9lbmQKKyAgICBlbmQKKworICAgIGRlZiB3cml0ZV9saXN0X2JlZ2luKGV0eXBlLCBzaXplKQorICAgICAgQHByb3RvY29sLndyaXRlX2xpc3RfYmVnaW4oZXR5cGUsIHNpemUpCisgICAgZW5kCisKKyAgICBkZWYgd3JpdGVfbGlzdF9lbmQKKyAgICAgIEBwcm90b2NvbC53cml0ZV9saXN0X2VuZAorICAgIGVuZAorCisgICAgZGVmIHdyaXRlX3NldF9iZWdpbihldHlwZSwgc2l6ZSkKKyAgICAgIEBwcm90b2NvbC53cml0ZV9zZXRfYmVnaW4oZXR5cGUsIHNpemUpCisgICAgZW5kCisKKyAgICBkZWYgd3JpdGVfc2V0X2VuZAorICAgICAgQHByb3RvY29sLndyaXRlX3NldF9lbmQKKyAgICBlbmQKKworICAgIGRlZiB3cml0ZV9ib29sKGJvb2wpCisgICAgICBAcHJvdG9jb2wud3JpdGVfYm9vbChib29sKQorICAgIGVuZAorCisgICAgZGVmIHdyaXRlX2J5dGUoYnl0ZSkKKyAgICAgIEBwcm90b2NvbC53cml0ZV9ieXRlKGJ5dGUpCisgICAgZW5kCisKKyAgICBkZWYgd3JpdGVfaTE2KGkxNikKKyAgICAgIEBwcm90b2NvbC53cml0ZV9pMTYoaTE2KQorICAgIGVuZAorCisgICAgZGVmIHdyaXRlX2kzMihpMzIpCisgICAgICBAcHJvdG9jb2wud3JpdGVfaTMyKGkzMikKKyAgICBlbmQKKworICAgIGRlZiB3cml0ZV9pNjQoaTY0KQorICAgICAgQHByb3RvY29sLndyaXRlX2k2NChpNjQpCisgICAgZW5kCisKKyAgICBkZWYgd3JpdGVfZG91YmxlKGR1YikKKyAgICAgIEBwcm90b2NvbC53cml0ZV9kb3VibGUoZHViKQorICAgIGVuZAorCisgICAgZGVmIHdyaXRlX3N0cmluZyhzdHIpCisgICAgICBAcHJvdG9jb2wud3JpdGVfc3RyaW5nKHN0cikKKyAgICBlbmQKKworICAgIGRlZiB3cml0ZV9iaW5hcnkoYnVmKQorICAgICAgQHByb3RvY29sLndyaXRlX2JpbmFyeShidWYpCisgICAgZW5kCisKKyAgICBkZWYgcmVhZF9tZXNzYWdlX2JlZ2luCisgICAgICBAcHJvdG9jb2wucmVhZF9tZXNzYWdlX2JlZ2luCisgICAgZW5kCisKKyAgICBkZWYgcmVhZF9tZXNzYWdlX2VuZAorICAgICAgQHByb3RvY29sLnJlYWRfbWVzc2FnZV9lbmQKKyAgICBlbmQKKworICAgIGRlZiByZWFkX3N0cnVjdF9iZWdpbgorICAgICAgQHByb3RvY29sLnJlYWRfc3RydWN0X2JlZ2luCisgICAgZW5kCisKKyAgICBkZWYgcmVhZF9zdHJ1Y3RfZW5kCisgICAgICBAcHJvdG9jb2wucmVhZF9zdHJ1Y3RfZW5kCisgICAgZW5kCisKKyAgICBkZWYgcmVhZF9maWVsZF9iZWdpbgorICAgICAgQHByb3RvY29sLnJlYWRfZmllbGRfYmVnaW4KKyAgICBlbmQKKworICAgIGRlZiByZWFkX2ZpZWxkX2VuZAorICAgICAgQHByb3RvY29sLnJlYWRfZmllbGRfZW5kCisgICAgZW5kCisKKyAgICBkZWYgcmVhZF9tYXBfYmVnaW4KKyAgICAgIEBwcm90b2NvbC5yZWFkX21hcF9iZWdpbgorICAgIGVuZAorCisgICAgZGVmIHJlYWRfbWFwX2VuZAorICAgICAgQHByb3RvY29sLnJlYWRfbWFwX2VuZAorICAgIGVuZAorCisgICAgZGVmIHJlYWRfbGlzdF9iZWdpbgorICAgICAgQHByb3RvY29sLnJlYWRfbGlzdF9iZWdpbgorICAgIGVuZAorCisgICAgZGVmIHJlYWRfbGlzdF9lbmQKKyAgICAgIEBwcm90b2NvbC5yZWFkX2xpc3RfZW5kCisgICAgZW5kCisKKyAgICBkZWYgcmVhZF9zZXRfYmVnaW4KKyAgICAgIEBwcm90b2NvbC5yZWFkX3NldF9iZWdpbgorICAgIGVuZAorCisgICAgZGVmIHJlYWRfc2V0X2VuZAorICAgICAgQHByb3RvY29sLnJlYWRfc2V0X2VuZAorICAgIGVuZAorCisgICAgZGVmIHJlYWRfYm9vbAorICAgICAgQHByb3RvY29sLnJlYWRfYm9vbAorICAgIGVuZAorCisgICAgZGVmIHJlYWRfYnl0ZQorICAgICAgQHByb3RvY29sLnJlYWRfYnl0ZQorICAgIGVuZAorCisgICAgZGVmIHJlYWRfaTE2CisgICAgICBAcHJvdG9jb2wucmVhZF9pMTYKKyAgICBlbmQKKworICAgIGRlZiByZWFkX2kzMgorICAgICAgQHByb3RvY29sLnJlYWRfaTMyCisgICAgZW5kCisKKyAgICBkZWYgcmVhZF9pNjQKKyAgICAgIEBwcm90b2NvbC5yZWFkX2k2NAorICAgIGVuZAorCisgICAgZGVmIHJlYWRfZG91YmxlCisgICAgICBAcHJvdG9jb2wucmVhZF9kb3VibGUKKyAgICBlbmQKKworICAgIGRlZiByZWFkX3N0cmluZworICAgICAgQHByb3RvY29sLnJlYWRfc3RyaW5nCisgICAgZW5kCisKKyAgICBkZWYgcmVhZF9iaW5hcnkKKyAgICAgIEBwcm90b2NvbC5yZWFkX2JpbmFyeQorICAgIGVuZAorICBlbmQKK2VuZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3NlcnZlci9iYXNlX3NlcnZlci5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0L3NlcnZlci9iYXNlX3NlcnZlci5yYgppbmRleCAxZWUxMjEzLi5hYTRkMDljIDEwMDY0NAotLS0gYS9saWIvcmIvbGliL3RocmlmdC9zZXJ2ZXIvYmFzZV9zZXJ2ZXIucmIKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvc2VydmVyL2Jhc2Vfc2VydmVyLnJiCkBAIC0yNiw2ICsyNiwxMiBAQAogICAgICAgQHByb3RvY29sX2ZhY3RvcnkgPSBwcm90b2NvbF9mYWN0b3J5ID8gcHJvdG9jb2xfZmFjdG9yeSA6IFRocmlmdDo6QmluYXJ5UHJvdG9jb2xGYWN0b3J5Lm5ldwogICAgIGVuZAogCi0gICAgZGVmIHNlcnZlOyBuaWw7IGVuZAorICAgIGRlZiBzZXJ2ZQorICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorICAgIGVuZAorCisgICAgZGVmIHRvX3MKKyAgICAgICJzZXJ2ZXIoI3tAcHJvdG9jb2xfZmFjdG9yeS50b19zfSgje0B0cmFuc3BvcnRfZmFjdG9yeS50b19zfSgje0BzZXJ2ZXJfdHJhbnNwb3J0LnRvX3N9KSkpIgorICAgIGVuZAogICBlbmQKLWVuZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK2VuZApkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvc2VydmVyL3NpbXBsZV9zZXJ2ZXIucmIgYi9saWIvcmIvbGliL3RocmlmdC9zZXJ2ZXIvc2ltcGxlX3NlcnZlci5yYgppbmRleCAyMWU4NjU5Li45MDVmZTliIDEwMDY0NAotLS0gYS9saWIvcmIvbGliL3RocmlmdC9zZXJ2ZXIvc2ltcGxlX3NlcnZlci5yYgorKysgYi9saWIvcmIvbGliL3RocmlmdC9zZXJ2ZXIvc2ltcGxlX3NlcnZlci5yYgpAQCAtMzksNSArMzksOSBAQAogICAgICAgICBAc2VydmVyX3RyYW5zcG9ydC5jbG9zZQogICAgICAgZW5kCiAgICAgZW5kCisgICAgCisgICAgZGVmIHRvX3MKKyAgICAgICJzaW1wbGUoI3tzdXBlci50b19zfSkiCisgICAgZW5kCiAgIGVuZAotZW5kClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC9zZXJ2ZXIvdGhyZWFkX3Bvb2xfc2VydmVyLnJiIGIvbGliL3JiL2xpYi90aHJpZnQvc2VydmVyL3RocmVhZF9wb29sX3NlcnZlci5yYgppbmRleCA4Y2VjODA1Li5iYjc1NGFkIDEwMDY0NAotLS0gYS9saWIvcmIvbGliL3RocmlmdC9zZXJ2ZXIvdGhyZWFkX3Bvb2xfc2VydmVyLnJiCisrKyBiL2xpYi9yYi9saWIvdGhyaWZ0L3NlcnZlci90aHJlYWRfcG9vbF9zZXJ2ZXIucmIKQEAgLTcxLDUgKzcxLDkgQEAKICAgICAgICAgQHNlcnZlcl90cmFuc3BvcnQuY2xvc2UKICAgICAgIGVuZAogICAgIGVuZAorICAgIAorICAgIGRlZiB0b19zCisgICAgICAidGhyZWFkcG9vbCgje3N1cGVyLnRvX3N9KSIKKyAgICBlbmQKICAgZW5kCi1lbmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3NlcnZlci90aHJlYWRlZF9zZXJ2ZXIucmIgYi9saWIvcmIvbGliL3RocmlmdC9zZXJ2ZXIvdGhyZWFkZWRfc2VydmVyLnJiCmluZGV4IGEyYzkxN2MuLjg4ZWUxODMgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L3NlcnZlci90aHJlYWRlZF9zZXJ2ZXIucmIKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvc2VydmVyL3RocmVhZGVkX3NlcnZlci5yYgpAQCAtNDMsNSArNDMsOSBAQAogICAgICAgICBAc2VydmVyX3RyYW5zcG9ydC5jbG9zZQogICAgICAgZW5kCiAgICAgZW5kCisgICAgCisgICAgZGVmIHRvX3MKKyAgICAgICJ0aHJlYWRlZCgje3N1cGVyLnRvX3N9KSIKKyAgICBlbmQKICAgZW5kCi1lbmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9iYXNlX3NlcnZlcl90cmFuc3BvcnQucmIgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvYmFzZV9zZXJ2ZXJfdHJhbnNwb3J0LnJiCmluZGV4IDY4YzVhZjAuLjAxMDU0NjMgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9iYXNlX3NlcnZlcl90cmFuc3BvcnQucmIKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L2Jhc2Vfc2VydmVyX3RyYW5zcG9ydC5yYgpAQCAtMzQsNCArMzQsNCBAQAogICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgogICAgIGVuZAogICBlbmQKLWVuZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK2VuZApkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L2Jhc2VfdHJhbnNwb3J0LnJiIGIvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L2Jhc2VfdHJhbnNwb3J0LnJiCmluZGV4IDg3OTAzMjYuLjk3ZTU5MzUgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9iYXNlX3RyYW5zcG9ydC5yYgorKysgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvYmFzZV90cmFuc3BvcnQucmIKQEAgLTk5LDExICs5OSwxOSBAQAogICAgIGFsaWFzX21ldGhvZCA6PDwsIDp3cml0ZQogCiAgICAgZGVmIGZsdXNoOyBlbmQKKworICAgIGRlZiB0b19zCisgICAgICAiYmFzZSIKKyAgICBlbmQKICAgZW5kCiAgIAogICBjbGFzcyBCYXNlVHJhbnNwb3J0RmFjdG9yeQogICAgIGRlZiBnZXRfdHJhbnNwb3J0KHRyYW5zKQogICAgICAgcmV0dXJuIHRyYW5zCiAgICAgZW5kCisgICAgCisgICAgZGVmIHRvX3MKKyAgICAgICJiYXNlIgorICAgIGVuZAogICBlbmQKIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L2J1ZmZlcmVkX3RyYW5zcG9ydC5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9idWZmZXJlZF90cmFuc3BvcnQucmIKaW5kZXggNzgxZDNjNi4uNGZlOWM0MSAxMDA2NDQKLS0tIGEvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L2J1ZmZlcmVkX3RyYW5zcG9ydC5yYgorKysgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvYnVmZmVyZWRfdHJhbnNwb3J0LnJiCkBAIC0xMDQsMTEgKzEwNCwxOSBAQAogICAgICAgCiAgICAgICBAdHJhbnNwb3J0LmZsdXNoCiAgICAgZW5kCisKKyAgICBkZWYgdG9fcworICAgICAgImJ1ZmZlcmVkKCN7QHRyYW5zcG9ydC50b19zfSkiCisgICAgZW5kCiAgIGVuZAogCiAgIGNsYXNzIEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSA8IEJhc2VUcmFuc3BvcnRGYWN0b3J5CiAgICAgZGVmIGdldF90cmFuc3BvcnQodHJhbnNwb3J0KQogICAgICAgcmV0dXJuIEJ1ZmZlcmVkVHJhbnNwb3J0Lm5ldyh0cmFuc3BvcnQpCiAgICAgZW5kCisgICAgCisgICAgZGVmIHRvX3MKKyAgICAgICJidWZmZXJlZCIKKyAgICBlbmQKICAgZW5kCi1lbmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9mcmFtZWRfdHJhbnNwb3J0LnJiIGIvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L2ZyYW1lZF90cmFuc3BvcnQucmIKaW5kZXggZDgwNmNlMC4uOTUzMTc3OCAxMDA2NDQKLS0tIGEvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L2ZyYW1lZF90cmFuc3BvcnQucmIKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L2ZyYW1lZF90cmFuc3BvcnQucmIKQEAgLTk5LDYgKzk5LDEwIEBACiAgICAgICBAd2J1ZiA9IEJ5dGVzLmVtcHR5X2J5dGVfYnVmZmVyCiAgICAgZW5kCiAKKyAgICBkZWYgdG9fcworICAgICAgImZyYW1lZCgje0B0cmFuc3BvcnQudG9fc30pIgorICAgIGVuZAorCiAgICAgcHJpdmF0ZQogCiAgICAgZGVmIHJlYWRfZnJhbWUKQEAgLTExMyw1ICsxMTcsOSBAQAogICAgIGRlZiBnZXRfdHJhbnNwb3J0KHRyYW5zcG9ydCkKICAgICAgIHJldHVybiBGcmFtZWRUcmFuc3BvcnQubmV3KHRyYW5zcG9ydCkKICAgICBlbmQKKyAgICAKKyAgICBkZWYgdG9fcworICAgICAgImZyYW1lZCIKKyAgICBlbmQKICAgZW5kCi1lbmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9odHRwX2NsaWVudF90cmFuc3BvcnQucmIgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvaHR0cF9jbGllbnRfdHJhbnNwb3J0LnJiCmluZGV4IDc3ZmZlMzUuLjVjMWRkNWMgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9odHRwX2NsaWVudF90cmFuc3BvcnQucmIKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L2h0dHBfY2xpZW50X3RyYW5zcG9ydC5yYgpAQCAtNTAsNyArNTAsMTIgQEAKICAgICAgIGRhdGEgPSByZXNwLmJvZHkKICAgICAgIGRhdGEgPSBCeXRlcy5mb3JjZV9iaW5hcnlfZW5jb2RpbmcoZGF0YSkKICAgICAgIEBpbmJ1ZiA9IFN0cmluZ0lPLm5ldyBkYXRhCisgICAgZW5zdXJlCiAgICAgICBAb3V0YnVmID0gQnl0ZXMuZW1wdHlfYnl0ZV9idWZmZXIKICAgICBlbmQKKyAgICAKKyAgICBkZWYgdG9fcworICAgICAgIkB7c2VsZi51cmx9IgorICAgIGVuZAogICBlbmQKIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L2lvX3N0cmVhbV90cmFuc3BvcnQucmIgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvaW9fc3RyZWFtX3RyYW5zcG9ydC5yYgppbmRleCBlM2M4Mzc5Li5jY2VjNjhmIDEwMDY0NAotLS0gYS9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvaW9fc3RyZWFtX3RyYW5zcG9ydC5yYgorKysgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvaW9fc3RyZWFtX3RyYW5zcG9ydC5yYgpAQCAtMzUsNSArMzUsOCBAQAogICAgIGRlZiB3cml0ZShidWYpOyBAb3V0cHV0LndyaXRlKEJ5dGVzLmZvcmNlX2JpbmFyeV9lbmNvZGluZyhidWYpKSBlbmQKICAgICBkZWYgY2xvc2U7IEBpbnB1dC5jbG9zZTsgQG91dHB1dC5jbG9zZSBlbmQKICAgICBkZWYgdG9faW87IEBpbnB1dCBlbmQgIyB3ZSdyZSBhc3N1bWluZyB0aGlzIGlzIHVzZWQgaW4gYSBJTy5zZWxlY3QgZm9yIHJlYWRpbmcKKyAgICBkZWYgdG9fcworICAgICAgImlvc3RyZWFtKGlucHV0PSN7QGlucHV0LnRvX3N9LG91dHB1dD0je0BvdXRwdXQudG9fc30pIgorICAgIGVuZAogICBlbmQKLWVuZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK2VuZApkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L21lbW9yeV9idWZmZXJfdHJhbnNwb3J0LnJiIGIvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L21lbW9yeV9idWZmZXJfdHJhbnNwb3J0LnJiCmluZGV4IGFkNWFkODUuLjQ2OWVhNzMgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9tZW1vcnlfYnVmZmVyX3RyYW5zcG9ydC5yYgorKysgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvbWVtb3J5X2J1ZmZlcl90cmFuc3BvcnQucmIKQEAgLTEyMSw1ICsxMjEsOSBAQAogICAgICAgZW5kCiAgICAgICBvdXQuam9pbigiICIpCiAgICAgZW5kCisgICAgCisgICAgZGVmIHRvX3MKKyAgICAgICJtZW1vcnkiCisgICAgZW5kCiAgIGVuZAogZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvc2VydmVyX3NvY2tldC5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9zZXJ2ZXJfc29ja2V0LnJiCmluZGV4IDdmZWI5YWIuLjUwMDAyMzIgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9zZXJ2ZXJfc29ja2V0LnJiCisrKyBiL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9zZXJ2ZXJfc29ja2V0LnJiCkBAIC01OSw1ICs1OSwxMCBAQAogICAgIGVuZAogCiAgICAgYWxpYXMgdG9faW8gaGFuZGxlCisKKyAgICBkZWYgdG9fcworICAgICAgInNvY2tldCgje0Bob3N0fToje0Bwb3J0fSkiCisgICAgZW5kCisKICAgZW5kCi1lbmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9zb2NrZXQucmIgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvc29ja2V0LnJiCmluZGV4IDJiN2NhMDkuLmY1ZTZmM2IgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9zb2NrZXQucmIKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L3NvY2tldC5yYgpAQCAtMzMsMjYgKzMzLDI4IEBACiAgICAgYXR0cl9hY2Nlc3NvciA6aGFuZGxlLCA6dGltZW91dAogCiAgICAgZGVmIG9wZW4KLSAgICAgIGJlZ2luCi0gICAgICAgIGFkZHJpbmZvID0gOjpTb2NrZXQ6OmdldGFkZHJpbmZvKEBob3N0LCBAcG9ydCwgbmlsLCA6OlNvY2tldDo6U09DS19TVFJFQU0pLmZpcnN0Ci0gICAgICAgIEBoYW5kbGUgPSA6OlNvY2tldC5uZXcoYWRkcmluZm9bNF0sIDo6U29ja2V0OjpTT0NLX1NUUkVBTSwgMCkKLSAgICAgICAgQGhhbmRsZS5zZXRzb2Nrb3B0KDo6U29ja2V0OjpJUFBST1RPX1RDUCwgOjpTb2NrZXQ6OlRDUF9OT0RFTEFZLCAxKQotICAgICAgICBzb2NrYWRkciA9IDo6U29ja2V0LnNvY2thZGRyX2luKGFkZHJpbmZvWzFdLCBhZGRyaW5mb1szXSkKKyAgICAgIGZvciBhZGRyaW5mbyBpbiA6OlNvY2tldDo6Z2V0YWRkcmluZm8oQGhvc3QsIEBwb3J0LCBuaWwsIDo6U29ja2V0OjpTT0NLX1NUUkVBTSkgZG8KICAgICAgICAgYmVnaW4KLSAgICAgICAgICBAaGFuZGxlLmNvbm5lY3Rfbm9uYmxvY2soc29ja2FkZHIpCi0gICAgICAgIHJlc2N1ZSBFcnJubzo6RUlOUFJPR1JFU1MKLSAgICAgICAgICB1bmxlc3MgSU8uc2VsZWN0KG5pbCwgWyBAaGFuZGxlIF0sIG5pbCwgQHRpbWVvdXQpCi0gICAgICAgICAgICByYWlzZSBUcmFuc3BvcnRFeGNlcHRpb24ubmV3KFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJDb25uZWN0aW9uIHRpbWVvdXQgdG8gI3tAZGVzY30iKQotICAgICAgICAgIGVuZAorICAgICAgICAgIHNvY2tldCA9IDo6U29ja2V0Lm5ldyhhZGRyaW5mb1s0XSwgOjpTb2NrZXQ6OlNPQ0tfU1RSRUFNLCAwKQorICAgICAgICAgIHNvY2tldC5zZXRzb2Nrb3B0KDo6U29ja2V0OjpJUFBST1RPX1RDUCwgOjpTb2NrZXQ6OlRDUF9OT0RFTEFZLCAxKQorICAgICAgICAgIHNvY2thZGRyID0gOjpTb2NrZXQuc29ja2FkZHJfaW4oYWRkcmluZm9bMV0sIGFkZHJpbmZvWzNdKQogICAgICAgICAgIGJlZ2luCi0gICAgICAgICAgICBAaGFuZGxlLmNvbm5lY3Rfbm9uYmxvY2soc29ja2FkZHIpCi0gICAgICAgICAgcmVzY3VlIEVycm5vOjpFSVNDT05OCisgICAgICAgICAgICBzb2NrZXQuY29ubmVjdF9ub25ibG9jayhzb2NrYWRkcikKKyAgICAgICAgICByZXNjdWUgRXJybm86OkVJTlBST0dSRVNTCisgICAgICAgICAgICB1bmxlc3MgSU8uc2VsZWN0KG5pbCwgWyBzb2NrZXQgXSwgbmlsLCBAdGltZW91dCkKKyAgICAgICAgICAgICAgbmV4dAorICAgICAgICAgICAgZW5kCisgICAgICAgICAgICBiZWdpbgorICAgICAgICAgICAgICBzb2NrZXQuY29ubmVjdF9ub25ibG9jayhzb2NrYWRkcikKKyAgICAgICAgICAgIHJlc2N1ZSBFcnJubzo6RUlTQ09OTgorICAgICAgICAgICAgZW5kCiAgICAgICAgICAgZW5kCisgICAgICAgICAgcmV0dXJuIEBoYW5kbGUgPSBzb2NrZXQKKyAgICAgICAgcmVzY3VlIFN0YW5kYXJkRXJyb3IgPT4gZQorICAgICAgICAgIG5leHQKICAgICAgICAgZW5kCi0gICAgICAgIEBoYW5kbGUKLSAgICAgIHJlc2N1ZSBTdGFuZGFyZEVycm9yID0+IGUKLSAgICAgICAgcmFpc2UgVHJhbnNwb3J0RXhjZXB0aW9uLm5ldyhUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiQ291bGQgbm90IGNvbm5lY3QgdG8gI3tAZGVzY306ICN7ZX0iKQogICAgICAgZW5kCisgICAgICByYWlzZSBUcmFuc3BvcnRFeGNlcHRpb24ubmV3KFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJDb3VsZCBub3QgY29ubmVjdCB0byAje0BkZXNjfTogI3tlfSIpCiAgICAgZW5kCiAKICAgICBkZWYgb3Blbj8KQEAgLTEzMiw4ICsxMzQsMTAgQEAKICAgICAgIEBoYW5kbGUgPSBuaWwKICAgICBlbmQKIAotICAgIGRlZiB0b19pbwotICAgICAgQGhhbmRsZQorICAgIGFsaWFzIHRvX2lvIGhhbmRsZQorCisgICAgZGVmIHRvX3MKKyAgICAgICJzb2NrZXQoI3tAaG9zdH06I3tAcG9ydH0pIgogICAgIGVuZAogICBlbmQKIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L3NzbF9zZXJ2ZXJfc29ja2V0LnJiIGIvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L3NzbF9zZXJ2ZXJfc29ja2V0LnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhYmQ1ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvc3NsX3NlcnZlcl9zb2NrZXQucmIKQEAgLTAsMCArMSw0MSBAQAorIyBlbmNvZGluZzogYXNjaWktOGJpdAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3JlcXVpcmUgJ3NvY2tldCcKKworbW9kdWxlIFRocmlmdAorICBjbGFzcyBTU0xTZXJ2ZXJTb2NrZXQgPCBTZXJ2ZXJTb2NrZXQKKyAgICBkZWYgaW5pdGlhbGl6ZShob3N0X29yX3BvcnQsIHBvcnQgPSBuaWwsIHNzbF9jb250ZXh0ID0gbmlsKQorICAgICAgc3VwZXIoaG9zdF9vcl9wb3J0LCBwb3J0KQorICAgICAgQHNzbF9jb250ZXh0ID0gc3NsX2NvbnRleHQKKyAgICBlbmQKKworICAgIGF0dHJfYWNjZXNzb3IgOnNzbF9jb250ZXh0CisKKyAgICBkZWYgbGlzdGVuCisgICAgICBzb2NrZXQgPSBUQ1BTZXJ2ZXIubmV3KEBob3N0LCBAcG9ydCkKKyAgICAgIEBoYW5kbGUgPSBPcGVuU1NMOjpTU0w6OlNTTFNlcnZlci5uZXcoc29ja2V0LCBAc3NsX2NvbnRleHQpCisgICAgZW5kCisgICAgCisgICAgZGVmIHRvX3MKKyAgICAgICJzc2woI3tzdXBlci50b19zfSkiCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvc3NsX3NvY2tldC5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9zc2xfc29ja2V0LnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhYjk2YWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvc3NsX3NvY2tldC5yYgpAQCAtMCwwICsxLDUxIEBACisjIGVuY29kaW5nOiBhc2NpaS04Yml0CisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKworbW9kdWxlIFRocmlmdAorICBjbGFzcyBTU0xTb2NrZXQgPCBTb2NrZXQKKyAgICBkZWYgaW5pdGlhbGl6ZShob3N0PSdsb2NhbGhvc3QnLCBwb3J0PTkwOTAsIHRpbWVvdXQ9bmlsLCBzc2xfY29udGV4dD1uaWwpCisgICAgICBzdXBlcihob3N0LCBwb3J0LCB0aW1lb3V0KQorICAgICAgQHNzbF9jb250ZXh0ID0gc3NsX2NvbnRleHQKKyAgICBlbmQKKworICAgIGF0dHJfYWNjZXNzb3IgOnNzbF9jb250ZXh0CisKKyAgICBkZWYgb3BlbgorICAgICAgc29ja2V0ID0gc3VwZXIKKyAgICAgIEBoYW5kbGUgPSBPcGVuU1NMOjpTU0w6OlNTTFNvY2tldC5uZXcoc29ja2V0LCBAc3NsX2NvbnRleHQpCisgICAgICBiZWdpbgorICAgICAgICBAaGFuZGxlLmNvbm5lY3Rfbm9uYmxvY2sKKyAgICAgICAgQGhhbmRsZS5wb3N0X2Nvbm5lY3Rpb25fY2hlY2soQGhvc3QpCisgICAgICAgIEBoYW5kbGUKKyAgICAgIHJlc2N1ZSBJTzo6V2FpdFJlYWRhYmxlCisgICAgICAgIElPLnNlbGVjdChbIEBoYW5kbGUgXSwgbmlsLCBuaWwsIEB0aW1lb3V0KQorICAgICAgICByZXRyeQorICAgICAgcmVzY3VlIElPOjpXYWl0V3JpdGFibGUKKyAgICAgICAgSU8uc2VsZWN0KG5pbCwgWyBAaGFuZGxlIF0sIG5pbCwgQHRpbWVvdXQpCisgICAgICAgIHJldHJ5CisgICAgICByZXNjdWUgU3RhbmRhcmRFcnJvciA9PiBlCisgICAgICAgIHJhaXNlIFRyYW5zcG9ydEV4Y2VwdGlvbi5uZXcoVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIkNvdWxkIG5vdCBjb25uZWN0IHRvICN7QGRlc2N9OiAje2V9IikKKyAgICAgIGVuZAorICAgIGVuZAorICAgIAorICAgIGRlZiB0b19zCisgICAgICAic3NsKCN7c3VwZXIudG9fc30pIgorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L3VuaXhfc2VydmVyX3NvY2tldC5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC91bml4X3NlcnZlcl9zb2NrZXQucmIKaW5kZXggYTEzNWQyNS4uMDU3ZDEyMiAxMDA2NDQKLS0tIGEvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L3VuaXhfc2VydmVyX3NvY2tldC5yYgorKysgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvdW5peF9zZXJ2ZXJfc29ja2V0LnJiCkBAIC01Niw1ICs1Niw5IEBACiAgICAgZW5kCiAKICAgICBhbGlhcyB0b19pbyBoYW5kbGUKKworICAgIGRlZiB0b19zCisgICAgICAiZG9tYWluKCN7QHBhdGh9KSIKKyAgICBlbmQKICAgZW5kCi1lbmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC91bml4X3NvY2tldC5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC91bml4X3NvY2tldC5yYgppbmRleCA4ZjY5MmU0Li41ZGZmZDU5IDEwMDY0NAotLS0gYS9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvdW5peF9zb2NrZXQucmIKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L3VuaXhfc29ja2V0LnJiCkBAIC0zNiw1ICszNiw5IEBACiAgICAgICAgIHJhaXNlIFRyYW5zcG9ydEV4Y2VwdGlvbi5uZXcoVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIkNvdWxkIG5vdCBvcGVuIFVOSVggc29ja2V0IGF0ICN7QHBhdGh9IikKICAgICAgIGVuZAogICAgIGVuZAorICAgIAorICAgIGRlZiB0b19zCisgICAgICAiZG9tYWluKCN7QHBhdGh9KSIKKyAgICBlbmQKICAgZW5kCi1lbmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3VuaW9uLnJiIGIvbGliL3JiL2xpYi90aHJpZnQvdW5pb24ucmIKaW5kZXggYTcwNThmMi4uNDkwYzU1YyAxMDA2NDQKLS0tIGEvbGliL3JiL2xpYi90aHJpZnQvdW5pb24ucmIKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvdW5pb24ucmIKQEAgLTg3LDEyICs4Nyw5IEBACiAgICAgZW5kCiAKICAgICBkZWYgPT0ob3RoZXIpCi0gICAgICBvdGhlciAhPSBuaWwgJiYgQHNldGZpZWxkID09IG90aGVyLmdldF9zZXRfZmllbGQgJiYgQHZhbHVlID09IG90aGVyLmdldF92YWx1ZQorICAgICAgb3RoZXIuZXF1YWw/KHNlbGYpIHx8IG90aGVyLmluc3RhbmNlX29mPyhzZWxmLmNsYXNzKSAmJiBAc2V0ZmllbGQgPT0gb3RoZXIuZ2V0X3NldF9maWVsZCAmJiBAdmFsdWUgPT0gb3RoZXIuZ2V0X3ZhbHVlCiAgICAgZW5kCi0KLSAgICBkZWYgZXFsPyhvdGhlcikKLSAgICAgIHNlbGYuY2xhc3MgPT0gb3RoZXIuY2xhc3MgJiYgc2VsZiA9PSBvdGhlcgotICAgIGVuZAorICAgIGFsaWFzX21ldGhvZCA6ZXFsPywgOj09CiAKICAgICBkZWYgaGFzaAogICAgICAgW3NlbGYuY2xhc3MubmFtZSwgQHNldGZpZWxkLCBAdmFsdWVdLmhhc2gKQEAgLTE3Niw0ICsxNzMsNCBAQAogICAgICAgZW5kCiAgICAgZW5kCiAgIGVuZAotZW5kClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9CYXNlU2VydmljZS50aHJpZnQgYi9saWIvcmIvc3BlYy9CYXNlU2VydmljZS50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM3ZDMyYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9yYi9zcGVjL0Jhc2VTZXJ2aWNlLnRocmlmdApAQCAtMCwwICsxLDI3IEBACisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworbmFtZXNwYWNlIHJiIEJhc2UKKworc3RydWN0IEhlbGxvIHsKKyAgMTogc3RyaW5nIGdyZWV0aW5nID0gImhlbGxvIHdvcmxkIgorfQorCitzZXJ2aWNlIEJhc2VTZXJ2aWNlIHsKKyAgSGVsbG8gZ3JlZXRpbmcoMTpib29sIGVuZ2xpc2gpCit9CmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9FeHRlbmRlZFNlcnZpY2UudGhyaWZ0IGIvbGliL3JiL3NwZWMvRXh0ZW5kZWRTZXJ2aWNlLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTZiNzA1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3JiL3NwZWMvRXh0ZW5kZWRTZXJ2aWNlLnRocmlmdApAQCAtMCwwICsxLDI1IEBACisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworbmFtZXNwYWNlIHJiIEV4dGVuZGVkCisKK2luY2x1ZGUgIkJhc2VTZXJ2aWNlLnRocmlmdCIKKworc2VydmljZSBFeHRlbmRlZFNlcnZpY2UgZXh0ZW5kcyBCYXNlU2VydmljZS5CYXNlU2VydmljZSB7CisgIHZvaWQgcGluZygpCit9CmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9iYXNlX3Byb3RvY29sX3NwZWMucmIgYi9saWIvcmIvc3BlYy9iYXNlX3Byb3RvY29sX3NwZWMucmIKaW5kZXggZWM1MGM0OC4uZWNhOTM2YiAxMDA2NDQKLS0tIGEvbGliL3JiL3NwZWMvYmFzZV9wcm90b2NvbF9zcGVjLnJiCisrKyBiL2xpYi9yYi9zcGVjL2Jhc2VfcHJvdG9jb2xfc3BlYy5yYgpAQCAtMjIsNDEgKzIyLDQ2IEBACiBkZXNjcmliZSAnQmFzZVByb3RvY29sJyBkbwogCiAgIGJlZm9yZSg6ZWFjaCkgZG8KLSAgICBAdHJhbnMgPSBtb2NrKCJNb2NrVHJhbnNwb3J0IikKKyAgICBAdHJhbnMgPSBkb3VibGUoIk1vY2tUcmFuc3BvcnQiKQogICAgIEBwcm90ID0gVGhyaWZ0OjpCYXNlUHJvdG9jb2wubmV3KEB0cmFucykKICAgZW5kCiAKICAgZGVzY3JpYmUgVGhyaWZ0OjpCYXNlUHJvdG9jb2wgZG8KICAgICAjIG1vc3Qgb2YgdGhlIG1ldGhvZHMgYXJlIHN0dWJzLCBzbyB3ZSBjYW4gaWdub3JlIHRoZW0KIAorICAgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHJlYXNvbmFibGUgdG9fcyIgZG8KKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOnRvX3MpLm9uY2UuYW5kX3JldHVybigidHJhbnMiKQorICAgICAgZXhwZWN0KEBwcm90LnRvX3MpLnRvIGVxKCJ0cmFucyIpCisgICAgZW5kCisKICAgICBpdCAic2hvdWxkIG1ha2UgdHJhbnMgYWNjZXNzaWJsZSIgZG8KLSAgICAgIEBwcm90LnRyYW5zLnNob3VsZCBlcWwoQHRyYW5zKQorICAgICAgZXhwZWN0KEBwcm90LnRyYW5zKS50byBlcWwoQHRyYW5zKQogICAgIGVuZAogCiAgICAgaXQgJ3Nob3VsZCB3cml0ZSBvdXQgYSBmaWVsZCBuaWNlbHkgKGRlcHJlY2F0ZWQgd3JpdGVfZmllbGQgc2lnbmF0dXJlKScgZG8KLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgnZmllbGQnLCAndHlwZScsICdmaWQnKS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfdHlwZSkud2l0aCh7Om5hbWUgPT4gJ2ZpZWxkJywgOnR5cGUgPT4gJ3R5cGUnfSwgJ3ZhbHVlJykub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX2VuZCkub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgnZmllbGQnLCAndHlwZScsICdmaWQnKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3R5cGUpLndpdGgoezpuYW1lID0+ICdmaWVsZCcsIDp0eXBlID0+ICd0eXBlJ30sICd2YWx1ZScpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfZW5kKS5vcmRlcmVkCiAgICAgICBAcHJvdC53cml0ZV9maWVsZCgnZmllbGQnLCAndHlwZScsICdmaWQnLCAndmFsdWUnKQogICAgIGVuZAogCiAgICAgaXQgJ3Nob3VsZCB3cml0ZSBvdXQgYSBmaWVsZCBuaWNlbHknIGRvCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoJ2ZpZWxkJywgJ3R5cGUnLCAnZmlkJykub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX3R5cGUpLndpdGgoezpuYW1lID0+ICdmaWVsZCcsIDp0eXBlID0+ICd0eXBlJywgOmJpbmFyeSA9PiBmYWxzZX0sICd2YWx1ZScpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9lbmQpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoJ2ZpZWxkJywgJ3R5cGUnLCAnZmlkJykub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV90eXBlKS53aXRoKHs6bmFtZSA9PiAnZmllbGQnLCA6dHlwZSA9PiAndHlwZScsIDpiaW5hcnkgPT4gZmFsc2V9LCAndmFsdWUnKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2VuZCkub3JkZXJlZAogICAgICAgQHByb3Qud3JpdGVfZmllbGQoezpuYW1lID0+ICdmaWVsZCcsIDp0eXBlID0+ICd0eXBlJywgOmJpbmFyeSA9PiBmYWxzZX0sICdmaWQnLCAndmFsdWUnKQogICAgIGVuZAogCiAgICAgaXQgJ3Nob3VsZCB3cml0ZSBvdXQgdGhlIGRpZmZlcmVudCB0eXBlcyAoZGVwcmVjYXRlZCB3cml0ZV90eXBlIHNpZ25hdHVyZSknIGRvCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfYm9vbCkud2l0aCgnYm9vbCcpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9ieXRlKS53aXRoKCdieXRlJykub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2RvdWJsZSkud2l0aCgnZG91YmxlJykub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2kxNikud2l0aCgnaTE2Jykub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2kzMikud2l0aCgnaTMyJykub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2k2NCkud2l0aCgnaTY0Jykub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX3N0cmluZykud2l0aCgnc3RyaW5nJykub3JkZXJlZAotICAgICAgc3RydWN0ID0gbW9jaygnU3RydWN0JykKLSAgICAgIHN0cnVjdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGUpLndpdGgoQHByb3QpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfYm9vbCkud2l0aCgnYm9vbCcpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfYnl0ZSkud2l0aCgnYnl0ZScpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZG91YmxlKS53aXRoKCdkb3VibGUnKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2kxNikud2l0aCgnaTE2Jykub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV9pMzIpLndpdGgoJ2kzMicpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfaTY0KS53aXRoKCdpNjQnKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3N0cmluZykud2l0aCgnc3RyaW5nJykub3JkZXJlZAorICAgICAgc3RydWN0ID0gZG91YmxlKCdTdHJ1Y3QnKQorICAgICAgZXhwZWN0KHN0cnVjdCkudG8gcmVjZWl2ZSg6d3JpdGUpLndpdGgoQHByb3QpLm9yZGVyZWQKICAgICAgIEBwcm90LndyaXRlX3R5cGUoVGhyaWZ0OjpUeXBlczo6Qk9PTCwgJ2Jvb2wnKQogICAgICAgQHByb3Qud3JpdGVfdHlwZShUaHJpZnQ6OlR5cGVzOjpCWVRFLCAnYnl0ZScpCiAgICAgICBAcHJvdC53cml0ZV90eXBlKFRocmlmdDo6VHlwZXM6OkRPVUJMRSwgJ2RvdWJsZScpCkBAIC03MiwxNiArNzcsMTYgQEAKICAgICBlbmQKIAogICAgIGl0ICdzaG91bGQgd3JpdGUgb3V0IHRoZSBkaWZmZXJlbnQgdHlwZXMnIGRvCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfYm9vbCkud2l0aCgnYm9vbCcpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9ieXRlKS53aXRoKCdieXRlJykub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2RvdWJsZSkud2l0aCgnZG91YmxlJykub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2kxNikud2l0aCgnaTE2Jykub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2kzMikud2l0aCgnaTMyJykub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2k2NCkud2l0aCgnaTY0Jykub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX3N0cmluZykud2l0aCgnc3RyaW5nJykub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2JpbmFyeSkud2l0aCgnYmluYXJ5Jykub3JkZXJlZAotICAgICAgc3RydWN0ID0gbW9jaygnU3RydWN0JykKLSAgICAgIHN0cnVjdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGUpLndpdGgoQHByb3QpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfYm9vbCkud2l0aCgnYm9vbCcpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfYnl0ZSkud2l0aCgnYnl0ZScpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZG91YmxlKS53aXRoKCdkb3VibGUnKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2kxNikud2l0aCgnaTE2Jykub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV9pMzIpLndpdGgoJ2kzMicpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfaTY0KS53aXRoKCdpNjQnKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3N0cmluZykud2l0aCgnc3RyaW5nJykub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV9iaW5hcnkpLndpdGgoJ2JpbmFyeScpLm9yZGVyZWQKKyAgICAgIHN0cnVjdCA9IGRvdWJsZSgnU3RydWN0JykKKyAgICAgIGV4cGVjdChzdHJ1Y3QpLnRvIHJlY2VpdmUoOndyaXRlKS53aXRoKEBwcm90KS5vcmRlcmVkCiAgICAgICBAcHJvdC53cml0ZV90eXBlKHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpCT09MfSwgJ2Jvb2wnKQogICAgICAgQHByb3Qud3JpdGVfdHlwZSh7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6QllURX0sICdieXRlJykKICAgICAgIEBwcm90LndyaXRlX3R5cGUoezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkRPVUJMRX0sICdkb3VibGUnKQpAQCAtOTgsMTMgKzEwMywxMyBAQAogICAgIGVuZAogCiAgICAgaXQgJ3Nob3VsZCByZWFkIHRoZSBkaWZmZXJlbnQgdHlwZXMgKGRlcHJlY2F0ZWQgcmVhZF90eXBlIHNpZ25hdHVyZSknIGRvCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9ib29sKS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9ieXRlKS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9pMTYpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2kzMikub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfaTY0KS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9kb3VibGUpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX3N0cmluZykub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2Jvb2wpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9ieXRlKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfaTE2KS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfaTMyKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfaTY0KS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfZG91YmxlKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfc3RyaW5nKS5vcmRlcmVkCiAgICAgICBAcHJvdC5yZWFkX3R5cGUoVGhyaWZ0OjpUeXBlczo6Qk9PTCkKICAgICAgIEBwcm90LnJlYWRfdHlwZShUaHJpZnQ6OlR5cGVzOjpCWVRFKQogICAgICAgQHByb3QucmVhZF90eXBlKFRocmlmdDo6VHlwZXM6OkkxNikKQEAgLTEyMCwxNCArMTI1LDE0IEBACiAgICAgZW5kCiAKICAgICBpdCAnc2hvdWxkIHJlYWQgdGhlIGRpZmZlcmVudCB0eXBlcycgZG8KLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2Jvb2wpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2J5dGUpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2kxNikub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfaTMyKS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9pNjQpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2RvdWJsZSkub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfc3RyaW5nKS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9iaW5hcnkpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9ib29sKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfYnl0ZSkub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2kxNikub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2kzMikub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2k2NCkub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2RvdWJsZSkub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX3N0cmluZykub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2JpbmFyeSkub3JkZXJlZAogICAgICAgQHByb3QucmVhZF90eXBlKHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpCT09MfSkKICAgICAgIEBwcm90LnJlYWRfdHlwZSh7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6QllURX0pCiAgICAgICBAcHJvdC5yZWFkX3R5cGUoezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkkxNn0pCkBAIC0xNDQsMTMgKzE0OSwxMyBAQAogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBza2lwIHRoZSBiYXNpYyB0eXBlcyIgZG8KLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2Jvb2wpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2J5dGUpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2kxNikub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfaTMyKS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9pNjQpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2RvdWJsZSkub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfc3RyaW5nKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfYm9vbCkub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2J5dGUpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9pMTYpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9pMzIpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9pNjQpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9kb3VibGUpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9zdHJpbmcpLm9yZGVyZWQKICAgICAgIEBwcm90LnNraXAoVGhyaWZ0OjpUeXBlczo6Qk9PTCkKICAgICAgIEBwcm90LnNraXAoVGhyaWZ0OjpUeXBlczo6QllURSkKICAgICAgIEBwcm90LnNraXAoVGhyaWZ0OjpUeXBlczo6STE2KQpAQCAtMTYzLDQ3ICsxNjgsNDcgQEAKIAogICAgIGl0ICJzaG91bGQgc2tpcCBzdHJ1Y3RzIiBkbwogICAgICAgcmVhbF9za2lwID0gQHByb3QubWV0aG9kKDpza2lwKQotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfc3RydWN0X2JlZ2luKS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9maWVsZF9iZWdpbikuZXhhY3RseSg0KS50aW1lcy5hbmRfcmV0dXJuKAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX3N0cnVjdF9iZWdpbikub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2ZpZWxkX2JlZ2luKS5leGFjdGx5KDQpLnRpbWVzLmFuZF9yZXR1cm4oCiAgICAgICAgIFsnZmllbGQgMScsIFRocmlmdDo6VHlwZXM6OlNUUklORywgMV0sCiAgICAgICAgIFsnZmllbGQgMicsIFRocmlmdDo6VHlwZXM6OkkzMiwgMl0sCiAgICAgICAgIFsnZmllbGQgMycsIFRocmlmdDo6VHlwZXM6Ok1BUCwgM10sCiAgICAgICAgIFtuaWwsIFRocmlmdDo6VHlwZXM6OlNUT1AsIDBdCiAgICAgICApCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9maWVsZF9lbmQpLmV4YWN0bHkoMykudGltZXMKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX3N0cmluZykuZXhhY3RseSgzKS50aW1lcwotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfaTMyKS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9tYXBfYmVnaW4pLm9yZGVyZWQuYW5kX3JldHVybihbVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCBUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDFdKQorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2ZpZWxkX2VuZCkuZXhhY3RseSgzKS50aW1lcworICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX3N0cmluZykuZXhhY3RseSgzKS50aW1lcworICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2kzMikub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX21hcF9iZWdpbikub3JkZXJlZC5hbmRfcmV0dXJuKFtUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIFRocmlmdDo6VHlwZXM6OlNUUklORywgMV0pCiAgICAgICAjIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX3N0cmluZykuZXhhY3RseSgyKS50aW1lcwotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfbWFwX2VuZCkub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfc3RydWN0X2VuZCkub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX21hcF9lbmQpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9zdHJ1Y3RfZW5kKS5vcmRlcmVkCiAgICAgICByZWFsX3NraXAuY2FsbChUaHJpZnQ6OlR5cGVzOjpTVFJVQ1QpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHNraXAgbWFwcyIgZG8KICAgICAgIHJlYWxfc2tpcCA9IEBwcm90Lm1ldGhvZCg6c2tpcCkKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX21hcF9iZWdpbikub3JkZXJlZC5hbmRfcmV0dXJuKFtUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIFRocmlmdDo6VHlwZXM6OlNUUlVDVCwgMV0pCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9zdHJpbmcpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX3N0cnVjdF9iZWdpbikub3JkZXJlZC5hbmRfcmV0dXJuKFsic29tZV9zdHJ1Y3QiXSkKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2ZpZWxkX2JlZ2luKS5vcmRlcmVkLmFuZF9yZXR1cm4oW25pbCwgVGhyaWZ0OjpUeXBlczo6U1RPUCwgbmlsXSk7Ci0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9zdHJ1Y3RfZW5kKS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9tYXBfZW5kKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfbWFwX2JlZ2luKS5vcmRlcmVkLmFuZF9yZXR1cm4oW1RocmlmdDo6VHlwZXM6OlNUUklORywgVGhyaWZ0OjpUeXBlczo6U1RSVUNULCAxXSkKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9zdHJpbmcpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9zdHJ1Y3RfYmVnaW4pLm9yZGVyZWQuYW5kX3JldHVybihbInNvbWVfc3RydWN0Il0pCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfZmllbGRfYmVnaW4pLm9yZGVyZWQuYW5kX3JldHVybihbbmlsLCBUaHJpZnQ6OlR5cGVzOjpTVE9QLCBuaWxdKTsKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9zdHJ1Y3RfZW5kKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfbWFwX2VuZCkub3JkZXJlZAogICAgICAgcmVhbF9za2lwLmNhbGwoVGhyaWZ0OjpUeXBlczo6TUFQKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBza2lwIHNldHMiIGRvCiAgICAgICByZWFsX3NraXAgPSBAcHJvdC5tZXRob2QoOnNraXApCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9zZXRfYmVnaW4pLm9yZGVyZWQuYW5kX3JldHVybihbVGhyaWZ0OjpUeXBlczo6STY0LCA5XSkKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2k2NCkub3JkZXJlZC5leGFjdGx5KDkpLnRpbWVzCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9zZXRfZW5kKQorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX3NldF9iZWdpbikub3JkZXJlZC5hbmRfcmV0dXJuKFtUaHJpZnQ6OlR5cGVzOjpJNjQsIDldKQorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2k2NCkub3JkZXJlZC5leGFjdGx5KDkpLnRpbWVzCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfc2V0X2VuZCkKICAgICAgIHJlYWxfc2tpcC5jYWxsKFRocmlmdDo6VHlwZXM6OlNFVCkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgc2tpcCBsaXN0cyIgZG8KICAgICAgIHJlYWxfc2tpcCA9IEBwcm90Lm1ldGhvZCg6c2tpcCkKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2xpc3RfYmVnaW4pLm9yZGVyZWQuYW5kX3JldHVybihbVGhyaWZ0OjpUeXBlczo6RE9VQkxFLCAxMV0pCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9kb3VibGUpLm9yZGVyZWQuZXhhY3RseSgxMSkudGltZXMKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2xpc3RfZW5kKQorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2xpc3RfYmVnaW4pLm9yZGVyZWQuYW5kX3JldHVybihbVGhyaWZ0OjpUeXBlczo6RE9VQkxFLCAxMV0pCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfZG91YmxlKS5vcmRlcmVkLmV4YWN0bHkoMTEpLnRpbWVzCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfbGlzdF9lbmQpCiAgICAgICByZWFsX3NraXAuY2FsbChUaHJpZnQ6OlR5cGVzOjpMSVNUKQogICAgIGVuZAogICBlbmQKQEAgLTIxMSw3ICsyMTYsMTEgQEAKICAgZGVzY3JpYmUgVGhyaWZ0OjpCYXNlUHJvdG9jb2xGYWN0b3J5IGRvCiAgICAgaXQgInNob3VsZCByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yIiBkbwogICAgICAgIyByZXR1cm5pbmcgbmlsIHNpbmNlIFByb3RvY29sIGlzIGp1c3QgYW4gYWJzdHJhY3QgY2xhc3MKLSAgICAgIGxhbWJkYSB7VGhyaWZ0OjpCYXNlUHJvdG9jb2xGYWN0b3J5Lm5ldy5nZXRfcHJvdG9jb2wobW9jaygiTW9ja1RyYW5zcG9ydCIpKX0uc2hvdWxkIHJhaXNlX2Vycm9yKE5vdEltcGxlbWVudGVkRXJyb3IpCisgICAgICBleHBlY3Qge1RocmlmdDo6QmFzZVByb3RvY29sRmFjdG9yeS5uZXcuZ2V0X3Byb3RvY29sKGRvdWJsZSgiTW9ja1RyYW5zcG9ydCIpKX0udG8gcmFpc2VfZXJyb3IoTm90SW1wbGVtZW50ZWRFcnJvcikKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHJlYXNvbmFibGUgdG9fcyIgZG8KKyAgICAgIGV4cGVjdChUaHJpZnQ6OkJhc2VQcm90b2NvbEZhY3RvcnkubmV3LnRvX3MpLnRvIGVxKCJiYXNlIikKICAgICBlbmQKICAgZW5kCiBlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL2Jhc2VfdHJhbnNwb3J0X3NwZWMucmIgYi9saWIvcmIvc3BlYy9iYXNlX3RyYW5zcG9ydF9zcGVjLnJiCmluZGV4IDQxOTY1NzIuLmQyZjYwYWEgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9zcGVjL2Jhc2VfdHJhbnNwb3J0X3NwZWMucmIKKysrIGIvbGliL3JiL3NwZWMvYmFzZV90cmFuc3BvcnRfc3BlYy5yYgpAQCAtMjQsMTA1ICsyNCwxMTkgQEAKICAgZGVzY3JpYmUgVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb24gZG8KICAgICBpdCAic2hvdWxkIG1ha2UgdHlwZSBhY2Nlc3NpYmxlIiBkbwogICAgICAgZXhjID0gVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb24ubmV3KFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uOjpBTFJFQURZX09QRU4sICJtc2ciKQotICAgICAgZXhjLnR5cGUuc2hvdWxkID09IFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uOjpBTFJFQURZX09QRU4KLSAgICAgIGV4Yy5tZXNzYWdlLnNob3VsZCA9PSAibXNnIgorICAgICAgZXhwZWN0KGV4Yy50eXBlKS50byBlcShUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbjo6QUxSRUFEWV9PUEVOKQorICAgICAgZXhwZWN0KGV4Yy5tZXNzYWdlKS50byBlcSgibXNnIikKICAgICBlbmQKICAgZW5kCiAKICAgZGVzY3JpYmUgVGhyaWZ0OjpCYXNlVHJhbnNwb3J0IGRvCiAgICAgaXQgInNob3VsZCByZWFkIHRoZSBzcGVjaWZpZWQgc2l6ZSIgZG8KICAgICAgIHRyYW5zcG9ydCA9IFRocmlmdDo6QmFzZVRyYW5zcG9ydC5uZXcKLSAgICAgIHRyYW5zcG9ydC5zaG91bGRfcmVjZWl2ZSg6cmVhZCkud2l0aCg0MCkub3JkZXJlZC5hbmRfcmV0dXJuKCIxMCBsZXR0ZXJzIikKLSAgICAgIHRyYW5zcG9ydC5zaG91bGRfcmVjZWl2ZSg6cmVhZCkud2l0aCgzMCkub3JkZXJlZC5hbmRfcmV0dXJuKCJmaWZ0ZWVuIGxldHRlcnMiKQotICAgICAgdHJhbnNwb3J0LnNob3VsZF9yZWNlaXZlKDpyZWFkKS53aXRoKDE1KS5vcmRlcmVkLmFuZF9yZXR1cm4oIm1vcmUgY2hhcmFjdGVycyIpCi0gICAgICB0cmFuc3BvcnQucmVhZF9hbGwoNDApLnNob3VsZCA9PSAiMTAgbGV0dGVyc2ZpZnRlZW4gbGV0dGVyc21vcmUgY2hhcmFjdGVycyIKKyAgICAgIGV4cGVjdCh0cmFuc3BvcnQpLnRvIHJlY2VpdmUoOnJlYWQpLndpdGgoNDApLm9yZGVyZWQuYW5kX3JldHVybigiMTAgbGV0dGVycyIpCisgICAgICBleHBlY3QodHJhbnNwb3J0KS50byByZWNlaXZlKDpyZWFkKS53aXRoKDMwKS5vcmRlcmVkLmFuZF9yZXR1cm4oImZpZnRlZW4gbGV0dGVycyIpCisgICAgICBleHBlY3QodHJhbnNwb3J0KS50byByZWNlaXZlKDpyZWFkKS53aXRoKDE1KS5vcmRlcmVkLmFuZF9yZXR1cm4oIm1vcmUgY2hhcmFjdGVycyIpCisgICAgICBleHBlY3QodHJhbnNwb3J0LnJlYWRfYWxsKDQwKSkudG8gZXEoIjEwIGxldHRlcnNmaWZ0ZWVuIGxldHRlcnNtb3JlIGNoYXJhY3RlcnMiKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBzdHViIG91dCB0aGUgcmVzdCBvZiB0aGUgbWV0aG9kcyIgZG8KICAgICAgICMgY2FuJ3QgdGVzdCBmb3Igc3R1YmJpbmVzcywgc28ganVzdCBtYWtlIHN1cmUgdGhleSdyZSBkZWZpbmVkCiAgICAgICBbOm9wZW4/LCA6b3BlbiwgOmNsb3NlLCA6cmVhZCwgOndyaXRlLCA6Zmx1c2hdLmVhY2ggZG8gfHN5bXwKLSAgICAgICAgVGhyaWZ0OjpCYXNlVHJhbnNwb3J0Lm1ldGhvZF9kZWZpbmVkPyhzeW0pLnNob3VsZCBiZV90cnVlCisgICAgICAgIGV4cGVjdChUaHJpZnQ6OkJhc2VUcmFuc3BvcnQubWV0aG9kX2RlZmluZWQ/KHN5bSkpLnRvIGJlX3RydXRoeQogICAgICAgZW5kCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGFsaWFzIDw8IHRvIHdyaXRlIiBkbwotICAgICAgVGhyaWZ0OjpCYXNlVHJhbnNwb3J0Lmluc3RhbmNlX21ldGhvZCg6PDwpLnNob3VsZCA9PSBUaHJpZnQ6OkJhc2VUcmFuc3BvcnQuaW5zdGFuY2VfbWV0aG9kKDp3cml0ZSkKKyAgICAgIGV4cGVjdChUaHJpZnQ6OkJhc2VUcmFuc3BvcnQuaW5zdGFuY2VfbWV0aG9kKDo8PCkpLnRvIGVxKFRocmlmdDo6QmFzZVRyYW5zcG9ydC5pbnN0YW5jZV9tZXRob2QoOndyaXRlKSkKKyAgICBlbmQKKyAgICAKKyAgICBpdCAic2hvdWxkIHByb3ZpZGUgYSByZWFzb25hYmxlIHRvX3MiIGRvCisgICAgICBleHBlY3QoVGhyaWZ0OjpCYXNlVHJhbnNwb3J0Lm5ldy50b19zKS50byBlcSgiYmFzZSIpCiAgICAgZW5kCiAgIGVuZAogCiAgIGRlc2NyaWJlIFRocmlmdDo6QmFzZVNlcnZlclRyYW5zcG9ydCBkbwogICAgIGl0ICJzaG91bGQgc3R1YiBvdXQgaXRzIG1ldGhvZHMiIGRvCiAgICAgICBbOmxpc3RlbiwgOmFjY2VwdCwgOmNsb3NlXS5lYWNoIGRvIHxzeW18Ci0gICAgICAgIFRocmlmdDo6QmFzZVNlcnZlclRyYW5zcG9ydC5tZXRob2RfZGVmaW5lZD8oc3ltKS5zaG91bGQgYmVfdHJ1ZQorICAgICAgICBleHBlY3QoVGhyaWZ0OjpCYXNlU2VydmVyVHJhbnNwb3J0Lm1ldGhvZF9kZWZpbmVkPyhzeW0pKS50byBiZV90cnV0aHkKICAgICAgIGVuZAogICAgIGVuZAogICBlbmQKIAogICBkZXNjcmliZSBUaHJpZnQ6OkJhc2VUcmFuc3BvcnRGYWN0b3J5IGRvCiAgICAgaXQgInNob3VsZCByZXR1cm4gdGhlIHRyYW5zcG9ydCBpdCdzIGdpdmVuIiBkbwotICAgICAgdHJhbnNwb3J0ID0gbW9jaygiVHJhbnNwb3J0IikKLSAgICAgIFRocmlmdDo6QmFzZVRyYW5zcG9ydEZhY3RvcnkubmV3LmdldF90cmFuc3BvcnQodHJhbnNwb3J0KS5zaG91bGQgZXFsKHRyYW5zcG9ydCkKKyAgICAgIHRyYW5zcG9ydCA9IGRvdWJsZSgiVHJhbnNwb3J0IikKKyAgICAgIGV4cGVjdChUaHJpZnQ6OkJhc2VUcmFuc3BvcnRGYWN0b3J5Lm5ldy5nZXRfdHJhbnNwb3J0KHRyYW5zcG9ydCkpLnRvIGVxbCh0cmFuc3BvcnQpCisgICAgZW5kCisgICAgCisgICAgaXQgInNob3VsZCBwcm92aWRlIGEgcmVhc29uYWJsZSB0b19zIiBkbworICAgICAgZXhwZWN0KFRocmlmdDo6QmFzZVRyYW5zcG9ydEZhY3RvcnkubmV3LnRvX3MpLnRvIGVxKCJiYXNlIikKICAgICBlbmQKICAgZW5kCiAKICAgZGVzY3JpYmUgVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydCBkbworICAgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHRvX3MgdGhhdCBkZXNjcmliZXMgdGhlIGVuY2Fwc3VsYXRpb24iIGRvCisgICAgICB0cmFucyA9IGRvdWJsZSgiVHJhbnNwb3J0IikKKyAgICAgIGV4cGVjdCh0cmFucykudG8gcmVjZWl2ZSg6dG9fcykuYW5kX3JldHVybigibW9jayIpCisgICAgICBleHBlY3QoVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydC5uZXcodHJhbnMpLnRvX3MpLnRvIGVxKCJidWZmZXJlZChtb2NrKSIpCisgICAgZW5kCisKICAgICBpdCAic2hvdWxkIHBhc3MgdGhyb3VnaCBldmVyeXRoaW5nIGJ1dCB3cml0ZS9mbHVzaC9yZWFkIiBkbwotICAgICAgdHJhbnMgPSBtb2NrKCJUcmFuc3BvcnQiKQotICAgICAgdHJhbnMuc2hvdWxkX3JlY2VpdmUoOm9wZW4/KS5vcmRlcmVkLmFuZF9yZXR1cm4oIisgb3Blbj8iKQotICAgICAgdHJhbnMuc2hvdWxkX3JlY2VpdmUoOm9wZW4pLm9yZGVyZWQuYW5kX3JldHVybigiKyBvcGVuIikKLSAgICAgIHRyYW5zLnNob3VsZF9yZWNlaXZlKDpmbHVzaCkub3JkZXJlZCAjIGZyb20gdGhlIGNsb3NlCi0gICAgICB0cmFucy5zaG91bGRfcmVjZWl2ZSg6Y2xvc2UpLm9yZGVyZWQuYW5kX3JldHVybigiKyBjbG9zZSIpCisgICAgICB0cmFucyA9IGRvdWJsZSgiVHJhbnNwb3J0IikKKyAgICAgIGV4cGVjdCh0cmFucykudG8gcmVjZWl2ZSg6b3Blbj8pLm9yZGVyZWQuYW5kX3JldHVybigiKyBvcGVuPyIpCisgICAgICBleHBlY3QodHJhbnMpLnRvIHJlY2VpdmUoOm9wZW4pLm9yZGVyZWQuYW5kX3JldHVybigiKyBvcGVuIikKKyAgICAgIGV4cGVjdCh0cmFucykudG8gcmVjZWl2ZSg6Zmx1c2gpLm9yZGVyZWQgIyBmcm9tIHRoZSBjbG9zZQorICAgICAgZXhwZWN0KHRyYW5zKS50byByZWNlaXZlKDpjbG9zZSkub3JkZXJlZC5hbmRfcmV0dXJuKCIrIGNsb3NlIikKICAgICAgIGJ0cmFucyA9IFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnQubmV3KHRyYW5zKQotICAgICAgYnRyYW5zLm9wZW4/LnNob3VsZCA9PSAiKyBvcGVuPyIKLSAgICAgIGJ0cmFucy5vcGVuLnNob3VsZCA9PSAiKyBvcGVuIgotICAgICAgYnRyYW5zLmNsb3NlLnNob3VsZCA9PSAiKyBjbG9zZSIKKyAgICAgIGV4cGVjdChidHJhbnMub3Blbj8pLnRvIGVxKCIrIG9wZW4/IikKKyAgICAgIGV4cGVjdChidHJhbnMub3BlbikudG8gZXEoIisgb3BlbiIpCisgICAgICBleHBlY3QoYnRyYW5zLmNsb3NlKS50byBlcSgiKyBjbG9zZSIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGJ1ZmZlciByZWFkcyBpbiBjaHVua3Mgb2YgI3tUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0OjpERUZBVUxUX0JVRkZFUn0iIGRvCi0gICAgICB0cmFucyA9IG1vY2soIlRyYW5zcG9ydCIpCi0gICAgICB0cmFucy5zaG91bGRfcmVjZWl2ZSg6cmVhZCkud2l0aChUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0OjpERUZBVUxUX0JVRkZFUikuYW5kX3JldHVybigibG9ydW0gaXBzdW0gZG9sb3IgZW1ldCIpCisgICAgICB0cmFucyA9IGRvdWJsZSgiVHJhbnNwb3J0IikKKyAgICAgIGV4cGVjdCh0cmFucykudG8gcmVjZWl2ZSg6cmVhZCkud2l0aChUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0OjpERUZBVUxUX0JVRkZFUikuYW5kX3JldHVybigibG9ydW0gaXBzdW0gZG9sb3IgZW1ldCIpCiAgICAgICBidHJhbnMgPSBUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0Lm5ldyh0cmFucykKLSAgICAgIGJ0cmFucy5yZWFkKDYpLnNob3VsZCA9PSAibG9ydW0gIgotICAgICAgYnRyYW5zLnJlYWQoNikuc2hvdWxkID09ICJpcHN1bSAiCi0gICAgICBidHJhbnMucmVhZCg2KS5zaG91bGQgPT0gImRvbG9yICIKLSAgICAgIGJ0cmFucy5yZWFkKDYpLnNob3VsZCA9PSAiZW1ldCIKKyAgICAgIGV4cGVjdChidHJhbnMucmVhZCg2KSkudG8gZXEoImxvcnVtICIpCisgICAgICBleHBlY3QoYnRyYW5zLnJlYWQoNikpLnRvIGVxKCJpcHN1bSAiKQorICAgICAgZXhwZWN0KGJ0cmFucy5yZWFkKDYpKS50byBlcSgiZG9sb3IgIikKKyAgICAgIGV4cGVjdChidHJhbnMucmVhZCg2KSkudG8gZXEoImVtZXQiKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBidWZmZXIgd3JpdGVzIGFuZCBzZW5kIHRoZW0gb24gZmx1c2giIGRvCi0gICAgICB0cmFucyA9IG1vY2soIlRyYW5zcG9ydCIpCisgICAgICB0cmFucyA9IGRvdWJsZSgiVHJhbnNwb3J0IikKICAgICAgIGJ0cmFucyA9IFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnQubmV3KHRyYW5zKQogICAgICAgYnRyYW5zLndyaXRlKCJvbmUvIikKICAgICAgIGJ0cmFucy53cml0ZSgidHdvLyIpCiAgICAgICBidHJhbnMud3JpdGUoInRocmVlLyIpCi0gICAgICB0cmFucy5zaG91bGRfcmVjZWl2ZSg6d3JpdGUpLndpdGgoIm9uZS90d28vdGhyZWUvIikub3JkZXJlZAotICAgICAgdHJhbnMuc2hvdWxkX3JlY2VpdmUoOmZsdXNoKS5vcmRlcmVkCisgICAgICBleHBlY3QodHJhbnMpLnRvIHJlY2VpdmUoOndyaXRlKS53aXRoKCJvbmUvdHdvL3RocmVlLyIpLm9yZGVyZWQKKyAgICAgIGV4cGVjdCh0cmFucykudG8gcmVjZWl2ZSg6Zmx1c2gpLm9yZGVyZWQKICAgICAgIGJ0cmFucy5mbHVzaAogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBvbmx5IHNlbmQgYnVmZmVyZWQgZGF0YSBvbmNlIiBkbwotICAgICAgdHJhbnMgPSBtb2NrKCJUcmFuc3BvcnQiKQorICAgICAgdHJhbnMgPSBkb3VibGUoIlRyYW5zcG9ydCIpCiAgICAgICBidHJhbnMgPSBUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0Lm5ldyh0cmFucykKICAgICAgIGJ0cmFucy53cml0ZSgib25lLyIpCiAgICAgICBidHJhbnMud3JpdGUoInR3by8iKQogICAgICAgYnRyYW5zLndyaXRlKCJ0aHJlZS8iKQotICAgICAgdHJhbnMuc2hvdWxkX3JlY2VpdmUoOndyaXRlKS53aXRoKCJvbmUvdHdvL3RocmVlLyIpCi0gICAgICB0cmFucy5zdHViISg6Zmx1c2gpCisgICAgICBleHBlY3QodHJhbnMpLnRvIHJlY2VpdmUoOndyaXRlKS53aXRoKCJvbmUvdHdvL3RocmVlLyIpCisgICAgICBhbGxvdyh0cmFucykudG8gcmVjZWl2ZSg6Zmx1c2gpCiAgICAgICBidHJhbnMuZmx1c2gKICAgICAgICMgTm90aGluZyB0byBmbHVzaCB3aXRoIG5vIGRhdGEKICAgICAgIGJ0cmFucy5mbHVzaAogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBmbHVzaCBvbiBjbG9zZSIgZG8KLSAgICAgIHRyYW5zID0gbW9jaygiVHJhbnNwb3J0IikKLSAgICAgIHRyYW5zLnNob3VsZF9yZWNlaXZlKDpjbG9zZSkKKyAgICAgIHRyYW5zID0gZG91YmxlKCJUcmFuc3BvcnQiKQorICAgICAgZXhwZWN0KHRyYW5zKS50byByZWNlaXZlKDpjbG9zZSkKICAgICAgIGJ0cmFucyA9IFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnQubmV3KHRyYW5zKQotICAgICAgYnRyYW5zLnNob3VsZF9yZWNlaXZlKDpmbHVzaCkKKyAgICAgIGV4cGVjdChidHJhbnMpLnRvIHJlY2VpdmUoOmZsdXNoKQogICAgICAgYnRyYW5zLmNsb3NlCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIG5vdCB3cml0ZSB0byBzb2NrZXQgaWYgdGhlcmUncyBubyBkYXRhIiBkbwotICAgICAgdHJhbnMgPSBtb2NrKCJUcmFuc3BvcnQiKQotICAgICAgdHJhbnMuc2hvdWxkX3JlY2VpdmUoOmZsdXNoKQorICAgICAgdHJhbnMgPSBkb3VibGUoIlRyYW5zcG9ydCIpCisgICAgICBleHBlY3QodHJhbnMpLnRvIHJlY2VpdmUoOmZsdXNoKQogICAgICAgYnRyYW5zID0gVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydC5uZXcodHJhbnMpCiAgICAgICBidHJhbnMuZmx1c2gKICAgICBlbmQKQEAgLTEzMCw4MCArMTQ0LDkwIEBACiAKICAgZGVzY3JpYmUgVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkgZG8KICAgICBpdCAic2hvdWxkIHdyYXAgdGhlIGdpdmVuIHRyYW5zcG9ydCBpbiBhIEJ1ZmZlcmVkVHJhbnNwb3J0IiBkbwotICAgICAgdHJhbnMgPSBtb2NrKCJUcmFuc3BvcnQiKQotICAgICAgYnRyYW5zID0gbW9jaygiQnVmZmVyZWRUcmFuc3BvcnQiKQotICAgICAgVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydC5zaG91bGRfcmVjZWl2ZSg6bmV3KS53aXRoKHRyYW5zKS5hbmRfcmV0dXJuKGJ0cmFucykKLSAgICAgIFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5Lm5ldy5nZXRfdHJhbnNwb3J0KHRyYW5zKS5zaG91bGQgPT0gYnRyYW5zCisgICAgICB0cmFucyA9IGRvdWJsZSgiVHJhbnNwb3J0IikKKyAgICAgIGJ0cmFucyA9IGRvdWJsZSgiQnVmZmVyZWRUcmFuc3BvcnQiKQorICAgICAgZXhwZWN0KFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnQpLnRvIHJlY2VpdmUoOm5ldykud2l0aCh0cmFucykuYW5kX3JldHVybihidHJhbnMpCisgICAgICBleHBlY3QoVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkubmV3LmdldF90cmFuc3BvcnQodHJhbnMpKS50byBlcShidHJhbnMpCisgICAgZW5kCisgICAgCisgICAgaXQgInNob3VsZCBwcm92aWRlIGEgcmVhc29uYWJsZSB0b19zIiBkbworICAgICAgZXhwZWN0KFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5Lm5ldy50b19zKS50byBlcSgiYnVmZmVyZWQiKQogICAgIGVuZAogICBlbmQKIAogICBkZXNjcmliZSBUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydCBkbwogICAgIGJlZm9yZSg6ZWFjaCkgZG8KLSAgICAgIEB0cmFucyA9IG1vY2soIlRyYW5zcG9ydCIpCisgICAgICBAdHJhbnMgPSBkb3VibGUoIlRyYW5zcG9ydCIpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHByb3ZpZGUgYSB0b19zIHRoYXQgZGVzY3JpYmVzIHRoZSBlbmNhcHN1bGF0aW9uIiBkbworICAgICAgdHJhbnMgPSBkb3VibGUoIlRyYW5zcG9ydCIpCisgICAgICBleHBlY3QodHJhbnMpLnRvIHJlY2VpdmUoOnRvX3MpLmFuZF9yZXR1cm4oIm1vY2siKQorICAgICAgZXhwZWN0KFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0Lm5ldyh0cmFucykudG9fcykudG8gZXEoImZyYW1lZChtb2NrKSIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHBhc3MgdGhyb3VnaCBvcGVuPy9vcGVuL2Nsb3NlIiBkbwogICAgICAgZnRyYW5zID0gVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnQubmV3KEB0cmFucykKLSAgICAgIEB0cmFucy5zaG91bGRfcmVjZWl2ZSg6b3Blbj8pLm9yZGVyZWQuYW5kX3JldHVybigiKyBvcGVuPyIpCi0gICAgICBAdHJhbnMuc2hvdWxkX3JlY2VpdmUoOm9wZW4pLm9yZGVyZWQuYW5kX3JldHVybigiKyBvcGVuIikKLSAgICAgIEB0cmFucy5zaG91bGRfcmVjZWl2ZSg6Y2xvc2UpLm9yZGVyZWQuYW5kX3JldHVybigiKyBjbG9zZSIpCi0gICAgICBmdHJhbnMub3Blbj8uc2hvdWxkID09ICIrIG9wZW4/IgotICAgICAgZnRyYW5zLm9wZW4uc2hvdWxkID09ICIrIG9wZW4iCi0gICAgICBmdHJhbnMuY2xvc2Uuc2hvdWxkID09ICIrIGNsb3NlIgorICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6b3Blbj8pLm9yZGVyZWQuYW5kX3JldHVybigiKyBvcGVuPyIpCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDpvcGVuKS5vcmRlcmVkLmFuZF9yZXR1cm4oIisgb3BlbiIpCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDpjbG9zZSkub3JkZXJlZC5hbmRfcmV0dXJuKCIrIGNsb3NlIikKKyAgICAgIGV4cGVjdChmdHJhbnMub3Blbj8pLnRvIGVxKCIrIG9wZW4/IikKKyAgICAgIGV4cGVjdChmdHJhbnMub3BlbikudG8gZXEoIisgb3BlbiIpCisgICAgICBleHBlY3QoZnRyYW5zLmNsb3NlKS50byBlcSgiKyBjbG9zZSIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHBhc3MgdGhyb3VnaCByZWFkIHdoZW4gcmVhZCBpcyB0dXJuZWQgb2ZmIiBkbwogICAgICAgZnRyYW5zID0gVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnQubmV3KEB0cmFucywgZmFsc2UsIHRydWUpCi0gICAgICBAdHJhbnMuc2hvdWxkX3JlY2VpdmUoOnJlYWQpLndpdGgoMTcpLm9yZGVyZWQuYW5kX3JldHVybigiKyByZWFkIikKLSAgICAgIGZ0cmFucy5yZWFkKDE3KS5zaG91bGQgPT0gIisgcmVhZCIKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOnJlYWQpLndpdGgoMTcpLm9yZGVyZWQuYW5kX3JldHVybigiKyByZWFkIikKKyAgICAgIGV4cGVjdChmdHJhbnMucmVhZCgxNykpLnRvIGVxKCIrIHJlYWQiKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBwYXNzIHRocm91Z2ggd3JpdGUvZmx1c2ggd2hlbiB3cml0ZSBpcyB0dXJuZWQgb2ZmIiBkbwogICAgICAgZnRyYW5zID0gVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnQubmV3KEB0cmFucywgdHJ1ZSwgZmFsc2UpCi0gICAgICBAdHJhbnMuc2hvdWxkX3JlY2VpdmUoOndyaXRlKS53aXRoKCJmb28iKS5vcmRlcmVkLmFuZF9yZXR1cm4oIisgd3JpdGUiKQotICAgICAgQHRyYW5zLnNob3VsZF9yZWNlaXZlKDpmbHVzaCkub3JkZXJlZC5hbmRfcmV0dXJuKCIrIGZsdXNoIikKLSAgICAgIGZ0cmFucy53cml0ZSgiZm9vIikuc2hvdWxkID09ICIrIHdyaXRlIgotICAgICAgZnRyYW5zLmZsdXNoLnNob3VsZCA9PSAiKyBmbHVzaCIKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOndyaXRlKS53aXRoKCJmb28iKS5vcmRlcmVkLmFuZF9yZXR1cm4oIisgd3JpdGUiKQorICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6Zmx1c2gpLm9yZGVyZWQuYW5kX3JldHVybigiKyBmbHVzaCIpCisgICAgICBleHBlY3QoZnRyYW5zLndyaXRlKCJmb28iKSkudG8gZXEoIisgd3JpdGUiKQorICAgICAgZXhwZWN0KGZ0cmFucy5mbHVzaCkudG8gZXEoIisgZmx1c2giKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByZXR1cm4gYSBmdWxsIGZyYW1lIGlmIGFza2VkIGZvciA+PSB0aGUgZnJhbWUncyBsZW5ndGgiIGRvCiAgICAgICBmcmFtZSA9ICJ0aGlzIGlzIGEgZnJhbWUiCi0gICAgICBAdHJhbnMuc2hvdWxkX3JlY2VpdmUoOnJlYWRfYWxsKS53aXRoKDQpLmFuZF9yZXR1cm4oIlwwMDBcMDAwXDAwMFwwMTciKQotICAgICAgQHRyYW5zLnNob3VsZF9yZWNlaXZlKDpyZWFkX2FsbCkud2l0aChmcmFtZS5sZW5ndGgpLmFuZF9yZXR1cm4oZnJhbWUpCi0gICAgICBUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydC5uZXcoQHRyYW5zKS5yZWFkKGZyYW1lLmxlbmd0aCArIDEwKS5zaG91bGQgPT0gZnJhbWUKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOnJlYWRfYWxsKS53aXRoKDQpLmFuZF9yZXR1cm4oIlwwMDBcMDAwXDAwMFwwMTciKQorICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6cmVhZF9hbGwpLndpdGgoZnJhbWUubGVuZ3RoKS5hbmRfcmV0dXJuKGZyYW1lKQorICAgICAgZXhwZWN0KFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0Lm5ldyhAdHJhbnMpLnJlYWQoZnJhbWUubGVuZ3RoICsgMTApKS50byBlcShmcmFtZSkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmV0dXJuIHNsaWNlcyBvZiB0aGUgZnJhbWUgd2hlbiBhc2tlZCBmb3IgPCB0aGUgZnJhbWUncyBsZW5ndGgiIGRvCiAgICAgICBmcmFtZSA9ICJ0aGlzIGlzIGEgZnJhbWUiCi0gICAgICBAdHJhbnMuc2hvdWxkX3JlY2VpdmUoOnJlYWRfYWxsKS53aXRoKDQpLmFuZF9yZXR1cm4oIlwwMDBcMDAwXDAwMFwwMTciKQotICAgICAgQHRyYW5zLnNob3VsZF9yZWNlaXZlKDpyZWFkX2FsbCkud2l0aChmcmFtZS5sZW5ndGgpLmFuZF9yZXR1cm4oZnJhbWUpCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDpyZWFkX2FsbCkud2l0aCg0KS5hbmRfcmV0dXJuKCJcMDAwXDAwMFwwMDBcMDE3IikKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOnJlYWRfYWxsKS53aXRoKGZyYW1lLmxlbmd0aCkuYW5kX3JldHVybihmcmFtZSkKICAgICAgIGZ0cmFucyA9IFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0Lm5ldyhAdHJhbnMpCi0gICAgICBmdHJhbnMucmVhZCg0KS5zaG91bGQgPT0gInRoaXMiCi0gICAgICBmdHJhbnMucmVhZCg0KS5zaG91bGQgPT0gIiBpcyAiCi0gICAgICBmdHJhbnMucmVhZCgxNikuc2hvdWxkID09ICJhIGZyYW1lIgorICAgICAgZXhwZWN0KGZ0cmFucy5yZWFkKDQpKS50byBlcSgidGhpcyIpCisgICAgICBleHBlY3QoZnRyYW5zLnJlYWQoNCkpLnRvIGVxKCIgaXMgIikKKyAgICAgIGV4cGVjdChmdHJhbnMucmVhZCgxNikpLnRvIGVxKCJhIGZyYW1lIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmV0dXJuIG5vdGhpbmcgaWYgYXNrZWQgZm9yIDw9IDAiIGRvCi0gICAgICBUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydC5uZXcoQHRyYW5zKS5yZWFkKC0yKS5zaG91bGQgPT0gIiIKKyAgICAgIGV4cGVjdChUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydC5uZXcoQHRyYW5zKS5yZWFkKC0yKSkudG8gZXEoIiIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHB1bGwgYSBuZXcgZnJhbWUgd2hlbiB0aGUgZmlyc3QgaXMgZXhoYXVzdGVkIiBkbwogICAgICAgZnJhbWUgPSAidGhpcyBpcyBhIGZyYW1lIgogICAgICAgZnJhbWUyID0gInlldCBhbm90aGVyIGZyYW1lIgotICAgICAgQHRyYW5zLnNob3VsZF9yZWNlaXZlKDpyZWFkX2FsbCkud2l0aCg0KS5hbmRfcmV0dXJuKCJcMDAwXDAwMFwwMDBcMDE3IiwgIlwwMDBcMDAwXDAwMFwwMjEiKQotICAgICAgQHRyYW5zLnNob3VsZF9yZWNlaXZlKDpyZWFkX2FsbCkud2l0aChmcmFtZS5sZW5ndGgpLmFuZF9yZXR1cm4oZnJhbWUpCi0gICAgICBAdHJhbnMuc2hvdWxkX3JlY2VpdmUoOnJlYWRfYWxsKS53aXRoKGZyYW1lMi5sZW5ndGgpLmFuZF9yZXR1cm4oZnJhbWUyKQorICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6cmVhZF9hbGwpLndpdGgoNCkuYW5kX3JldHVybigiXDAwMFwwMDBcMDAwXDAxNyIsICJcMDAwXDAwMFwwMDBcMDIxIikKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOnJlYWRfYWxsKS53aXRoKGZyYW1lLmxlbmd0aCkuYW5kX3JldHVybihmcmFtZSkKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOnJlYWRfYWxsKS53aXRoKGZyYW1lMi5sZW5ndGgpLmFuZF9yZXR1cm4oZnJhbWUyKQogICAgICAgZnRyYW5zID0gVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnQubmV3KEB0cmFucykKLSAgICAgIGZ0cmFucy5yZWFkKDQpLnNob3VsZCA9PSAidGhpcyIKLSAgICAgIGZ0cmFucy5yZWFkKDgpLnNob3VsZCA9PSAiIGlzIGEgZnIiCi0gICAgICBmdHJhbnMucmVhZCg2KS5zaG91bGQgPT0gImFtZSIKLSAgICAgIGZ0cmFucy5yZWFkKDQpLnNob3VsZCA9PSAieWV0ICIKLSAgICAgIGZ0cmFucy5yZWFkKDE2KS5zaG91bGQgPT0gImFub3RoZXIgZnJhbWUiCisgICAgICBleHBlY3QoZnRyYW5zLnJlYWQoNCkpLnRvIGVxKCJ0aGlzIikKKyAgICAgIGV4cGVjdChmdHJhbnMucmVhZCg4KSkudG8gZXEoIiBpcyBhIGZyIikKKyAgICAgIGV4cGVjdChmdHJhbnMucmVhZCg2KSkudG8gZXEoImFtZSIpCisgICAgICBleHBlY3QoZnRyYW5zLnJlYWQoNCkpLnRvIGVxKCJ5ZXQgIikKKyAgICAgIGV4cGVjdChmdHJhbnMucmVhZCgxNikpLnRvIGVxKCJhbm90aGVyIGZyYW1lIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgYnVmZmVyIHdyaXRlcyIgZG8KICAgICAgIGZ0cmFucyA9IFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0Lm5ldyhAdHJhbnMpCi0gICAgICBAdHJhbnMuc2hvdWxkX25vdF9yZWNlaXZlKDp3cml0ZSkKKyAgICAgIGV4cGVjdChAdHJhbnMpLm5vdF90byByZWNlaXZlKDp3cml0ZSkKICAgICAgIGZ0cmFucy53cml0ZSgiZm9vIikKICAgICAgIGZ0cmFucy53cml0ZSgiYmFyIikKICAgICAgIGZ0cmFucy53cml0ZSgidGhpcyBpcyBhIGZyYW1lIikKQEAgLTIxMywxNSArMjM3LDE1IEBACiAgICAgICBmdHJhbnMgPSBUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydC5uZXcoQHRyYW5zKQogICAgICAgZnRyYW5zLndyaXRlKCJmb29iYXIiLCAzKQogICAgICAgZnRyYW5zLndyaXRlKCJiYXJmb28iLCAxKQotICAgICAgQHRyYW5zLnN0dWIhKDpmbHVzaCkKLSAgICAgIEB0cmFucy5zaG91bGRfcmVjZWl2ZSg6d3JpdGUpLndpdGgoIlwwMDBcMDAwXDAwMFwwMDRmb29iIikKKyAgICAgIGFsbG93KEB0cmFucykudG8gcmVjZWl2ZSg6Zmx1c2gpCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDp3cml0ZSkud2l0aCgiXDAwMFwwMDBcMDAwXDAwNGZvb2IiKQogICAgICAgZnRyYW5zLmZsdXNoCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGZsdXNoIGZyYW1lcyB3aXRoIGEgNC1ieXRlIGhlYWRlciIgZG8KICAgICAgIGZ0cmFucyA9IFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0Lm5ldyhAdHJhbnMpCi0gICAgICBAdHJhbnMuc2hvdWxkX3JlY2VpdmUoOndyaXRlKS53aXRoKCJcMDAwXDAwMFwwMDBcMDM1b25lL3R3by90aHJlZS90aGlzIGlzIGEgZnJhbWUiKS5vcmRlcmVkCi0gICAgICBAdHJhbnMuc2hvdWxkX3JlY2VpdmUoOmZsdXNoKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDp3cml0ZSkud2l0aCgiXDAwMFwwMDBcMDAwXDAzNW9uZS90d28vdGhyZWUvdGhpcyBpcyBhIGZyYW1lIikub3JkZXJlZAorICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6Zmx1c2gpLm9yZGVyZWQKICAgICAgIGZ0cmFucy53cml0ZSgib25lLyIpCiAgICAgICBmdHJhbnMud3JpdGUoInR3by8iKQogICAgICAgZnRyYW5zLndyaXRlKCJ0aHJlZS8iKQpAQCAtMjMxLDIyICsyNTUsMjYgQEAKIAogICAgIGl0ICJzaG91bGQgbm90IGZsdXNoIHRoZSBzYW1lIGJ1ZmZlcmVkIGRhdGEgdHdpY2UiIGRvCiAgICAgICBmdHJhbnMgPSBUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydC5uZXcoQHRyYW5zKQotICAgICAgQHRyYW5zLnNob3VsZF9yZWNlaXZlKDp3cml0ZSkud2l0aCgiXDAwMFwwMDBcMDAwXDAwN2Zvby9iYXIiKQotICAgICAgQHRyYW5zLnN0dWIhKDpmbHVzaCkKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOndyaXRlKS53aXRoKCJcMDAwXDAwMFwwMDBcMDA3Zm9vL2JhciIpCisgICAgICBhbGxvdyhAdHJhbnMpLnRvIHJlY2VpdmUoOmZsdXNoKQogICAgICAgZnRyYW5zLndyaXRlKCJmb28iKQogICAgICAgZnRyYW5zLndyaXRlKCIvYmFyIikKICAgICAgIGZ0cmFucy5mbHVzaAotICAgICAgQHRyYW5zLnNob3VsZF9yZWNlaXZlKDp3cml0ZSkud2l0aCgiXDAwMFwwMDBcMDAwXDAwMCIpCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDp3cml0ZSkud2l0aCgiXDAwMFwwMDBcMDAwXDAwMCIpCiAgICAgICBmdHJhbnMuZmx1c2gKICAgICBlbmQKICAgZW5kCiAKICAgZGVzY3JpYmUgVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnRGYWN0b3J5IGRvCiAgICAgaXQgInNob3VsZCB3cmFwIHRoZSBnaXZlbiB0cmFuc3BvcnQgaW4gYSBGcmFtZWRUcmFuc3BvcnQiIGRvCi0gICAgICB0cmFucyA9IG1vY2soIlRyYW5zcG9ydCIpCi0gICAgICBUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydC5zaG91bGRfcmVjZWl2ZSg6bmV3KS53aXRoKHRyYW5zKQorICAgICAgdHJhbnMgPSBkb3VibGUoIlRyYW5zcG9ydCIpCisgICAgICBleHBlY3QoVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnQpLnRvIHJlY2VpdmUoOm5ldykud2l0aCh0cmFucykKICAgICAgIFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0RmFjdG9yeS5uZXcuZ2V0X3RyYW5zcG9ydCh0cmFucykKICAgICBlbmQKKyAgICAKKyAgICBpdCAic2hvdWxkIHByb3ZpZGUgYSByZWFzb25hYmxlIHRvX3MiIGRvCisgICAgICBleHBlY3QoVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnRGYWN0b3J5Lm5ldy50b19zKS50byBlcSgiZnJhbWVkIikKKyAgICBlbmQKICAgZW5kCiAKICAgZGVzY3JpYmUgVGhyaWZ0OjpNZW1vcnlCdWZmZXJUcmFuc3BvcnQgZG8KQEAgLTI1NCw5NiArMjgyLDEwNiBAQAogICAgICAgQGJ1ZmZlciA9IFRocmlmdDo6TWVtb3J5QnVmZmVyVHJhbnNwb3J0Lm5ldwogICAgIGVuZAogCisgICAgaXQgInNob3VsZCBwcm92aWRlIGEgcmVhc29uYWJsZSB0b19zIiBkbworICAgICAgZXhwZWN0KEBidWZmZXIudG9fcykudG8gZXEoIm1lbW9yeSIpCisgICAgZW5kCisKICAgICBpdCAic2hvdWxkIGFjY2VwdCBhIGJ1ZmZlciBvbiBpbnB1dCBhbmQgdXNlIGl0IGRpcmVjdGx5IiBkbwogICAgICAgcyA9ICJ0aGlzIGlzIGEgdGVzdCIKICAgICAgIEBidWZmZXIgPSBUaHJpZnQ6Ok1lbW9yeUJ1ZmZlclRyYW5zcG9ydC5uZXcocykKLSAgICAgIEBidWZmZXIucmVhZCg0KS5zaG91bGQgPT0gInRoaXMiCisgICAgICBleHBlY3QoQGJ1ZmZlci5yZWFkKDQpKS50byBlcSgidGhpcyIpCiAgICAgICBzLnNsaWNlISgtNC4uLTEpCi0gICAgICBAYnVmZmVyLnJlYWQoQGJ1ZmZlci5hdmFpbGFibGUpLnNob3VsZCA9PSAiIGlzIGEgIgorICAgICAgZXhwZWN0KEBidWZmZXIucmVhZChAYnVmZmVyLmF2YWlsYWJsZSkpLnRvIGVxKCIgaXMgYSAiKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBhbHdheXMgcmVtYWluIG9wZW4iIGRvCi0gICAgICBAYnVmZmVyLnNob3VsZCBiZV9vcGVuCisgICAgICBleHBlY3QoQGJ1ZmZlcikudG8gYmVfb3BlbgogICAgICAgQGJ1ZmZlci5jbG9zZQotICAgICAgQGJ1ZmZlci5zaG91bGQgYmVfb3BlbgorICAgICAgZXhwZWN0KEBidWZmZXIpLnRvIGJlX29wZW4KICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmVzcG9uZCB0byBwZWVrIGFuZCBhdmFpbGFibGUiIGRvCiAgICAgICBAYnVmZmVyLndyaXRlICJzb21lIGRhdGEiCi0gICAgICBAYnVmZmVyLnBlZWsuc2hvdWxkIGJlX3RydWUKLSAgICAgIEBidWZmZXIuYXZhaWxhYmxlLnNob3VsZCA9PSA5CisgICAgICBleHBlY3QoQGJ1ZmZlci5wZWVrKS50byBiZV90cnV0aHkKKyAgICAgIGV4cGVjdChAYnVmZmVyLmF2YWlsYWJsZSkudG8gZXEoOSkKICAgICAgIEBidWZmZXIucmVhZCg0KQotICAgICAgQGJ1ZmZlci5wZWVrLnNob3VsZCBiZV90cnVlCi0gICAgICBAYnVmZmVyLmF2YWlsYWJsZS5zaG91bGQgPT0gNQorICAgICAgZXhwZWN0KEBidWZmZXIucGVlaykudG8gYmVfdHJ1dGh5CisgICAgICBleHBlY3QoQGJ1ZmZlci5hdmFpbGFibGUpLnRvIGVxKDUpCiAgICAgICBAYnVmZmVyLnJlYWQoNSkKLSAgICAgIEBidWZmZXIucGVlay5zaG91bGQgYmVfZmFsc2UKLSAgICAgIEBidWZmZXIuYXZhaWxhYmxlLnNob3VsZCA9PSAwCisgICAgICBleHBlY3QoQGJ1ZmZlci5wZWVrKS50byBiZV9mYWxzZXkKKyAgICAgIGV4cGVjdChAYnVmZmVyLmF2YWlsYWJsZSkudG8gZXEoMCkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgYmUgYWJsZSB0byByZXNldCB0aGUgYnVmZmVyIiBkbwogICAgICAgQGJ1ZmZlci53cml0ZSAidGVzdCBkYXRhIgogICAgICAgQGJ1ZmZlci5yZXNldF9idWZmZXIoImZvb2JhciIpCi0gICAgICBAYnVmZmVyLmF2YWlsYWJsZS5zaG91bGQgPT0gNgotICAgICAgQGJ1ZmZlci5yZWFkKEBidWZmZXIuYXZhaWxhYmxlKS5zaG91bGQgPT0gImZvb2JhciIKKyAgICAgIGV4cGVjdChAYnVmZmVyLmF2YWlsYWJsZSkudG8gZXEoNikKKyAgICAgIGV4cGVjdChAYnVmZmVyLnJlYWQoQGJ1ZmZlci5hdmFpbGFibGUpKS50byBlcSgiZm9vYmFyIikKICAgICAgIEBidWZmZXIucmVzZXRfYnVmZmVyCi0gICAgICBAYnVmZmVyLmF2YWlsYWJsZS5zaG91bGQgPT0gMAorICAgICAgZXhwZWN0KEBidWZmZXIuYXZhaWxhYmxlKS50byBlcSgwKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBjb3B5IHRoZSBnaXZlbiBzdHJpbmcgd2hlbiByZXNldHRpbmcgdGhlIGJ1ZmZlciIgZG8KICAgICAgIHMgPSAidGhpcyBpcyBhIHRlc3QiCiAgICAgICBAYnVmZmVyLnJlc2V0X2J1ZmZlcihzKQotICAgICAgQGJ1ZmZlci5hdmFpbGFibGUuc2hvdWxkID09IDE0CisgICAgICBleHBlY3QoQGJ1ZmZlci5hdmFpbGFibGUpLnRvIGVxKDE0KQogICAgICAgQGJ1ZmZlci5yZWFkKDEwKQotICAgICAgQGJ1ZmZlci5hdmFpbGFibGUuc2hvdWxkID09IDQKLSAgICAgIHMuc2hvdWxkID09ICJ0aGlzIGlzIGEgdGVzdCIKKyAgICAgIGV4cGVjdChAYnVmZmVyLmF2YWlsYWJsZSkudG8gZXEoNCkKKyAgICAgIGV4cGVjdChzKS50byBlcSgidGhpcyBpcyBhIHRlc3QiKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByZXR1cm4gZnJvbSByZWFkIHdoYXQgd2FzIGdpdmVuIGluIHdyaXRlIiBkbwogICAgICAgQGJ1ZmZlci53cml0ZSAidGVzdCBkYXRhIgotICAgICAgQGJ1ZmZlci5yZWFkKDQpLnNob3VsZCA9PSAidGVzdCIKLSAgICAgIEBidWZmZXIucmVhZChAYnVmZmVyLmF2YWlsYWJsZSkuc2hvdWxkID09ICIgZGF0YSIKKyAgICAgIGV4cGVjdChAYnVmZmVyLnJlYWQoNCkpLnRvIGVxKCJ0ZXN0IikKKyAgICAgIGV4cGVjdChAYnVmZmVyLnJlYWQoQGJ1ZmZlci5hdmFpbGFibGUpKS50byBlcSgiIGRhdGEiKQogICAgICAgQGJ1ZmZlci53cml0ZSAiZm9vIgogICAgICAgQGJ1ZmZlci53cml0ZSAiIGJhciIKLSAgICAgIEBidWZmZXIucmVhZChAYnVmZmVyLmF2YWlsYWJsZSkuc2hvdWxkID09ICJmb28gYmFyIgorICAgICAgZXhwZWN0KEBidWZmZXIucmVhZChAYnVmZmVyLmF2YWlsYWJsZSkpLnRvIGVxKCJmb28gYmFyIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgdGhyb3cgYW4gRU9GRXJyb3Igd2hlbiB0aGVyZSBpc24ndCBlbm91Z2ggZGF0YSBpbiB0aGUgYnVmZmVyIiBkbwogICAgICAgQGJ1ZmZlci5yZXNldF9idWZmZXIoIiIpCi0gICAgICBsYW1iZGF7QGJ1ZmZlci5yZWFkKDEpfS5zaG91bGQgcmFpc2VfZXJyb3IoRU9GRXJyb3IpCisgICAgICBleHBlY3R7QGJ1ZmZlci5yZWFkKDEpfS50byByYWlzZV9lcnJvcihFT0ZFcnJvcikKIAogICAgICAgQGJ1ZmZlci5yZXNldF9idWZmZXIoIjEyMzQiKQotICAgICAgbGFtYmRhe0BidWZmZXIucmVhZCg1KX0uc2hvdWxkIHJhaXNlX2Vycm9yKEVPRkVycm9yKQorICAgICAgZXhwZWN0e0BidWZmZXIucmVhZCg1KX0udG8gcmFpc2VfZXJyb3IoRU9GRXJyb3IpCiAgICAgZW5kCiAgIGVuZAogCiAgIGRlc2NyaWJlIFRocmlmdDo6SU9TdHJlYW1UcmFuc3BvcnQgZG8KICAgICBiZWZvcmUoOmVhY2gpIGRvCi0gICAgICBAaW5wdXQgPSBtb2NrKCJJbnB1dCIsIDpjbG9zZWQ/ID0+IGZhbHNlKQotICAgICAgQG91dHB1dCA9IG1vY2soIk91dHB1dCIsIDpjbG9zZWQ/ID0+IGZhbHNlKQorICAgICAgQGlucHV0ID0gZG91YmxlKCJJbnB1dCIsIDpjbG9zZWQ/ID0+IGZhbHNlKQorICAgICAgQG91dHB1dCA9IGRvdWJsZSgiT3V0cHV0IiwgOmNsb3NlZD8gPT4gZmFsc2UpCiAgICAgICBAdHJhbnMgPSBUaHJpZnQ6OklPU3RyZWFtVHJhbnNwb3J0Lm5ldyhAaW5wdXQsIEBvdXRwdXQpCiAgICAgZW5kCiAKKyAgICBpdCAic2hvdWxkIHByb3ZpZGUgYSByZWFzb25hYmxlIHRvX3MiIGRvCisgICAgICBleHBlY3QoQGlucHV0KS50byByZWNlaXZlKDp0b19zKS5hbmRfcmV0dXJuKCJtb2NrX2lucHV0IikKKyAgICAgIGV4cGVjdChAb3V0cHV0KS50byByZWNlaXZlKDp0b19zKS5hbmRfcmV0dXJuKCJtb2NrX291dHB1dCIpCisgICAgICBleHBlY3QoQHRyYW5zLnRvX3MpLnRvIGVxKCJpb3N0cmVhbShpbnB1dD1tb2NrX2lucHV0LG91dHB1dD1tb2NrX291dHB1dCkiKQorICAgIGVuZAorCiAgICAgaXQgInNob3VsZCBiZSBvcGVuIGFzIGxvbmcgYXMgYm90aCBpbnB1dCBvciBvdXRwdXQgYXJlIG9wZW4iIGRvCi0gICAgICBAdHJhbnMuc2hvdWxkIGJlX29wZW4KLSAgICAgIEBpbnB1dC5zdHViISg6Y2xvc2VkPykuYW5kX3JldHVybih0cnVlKQotICAgICAgQHRyYW5zLnNob3VsZCBiZV9vcGVuCi0gICAgICBAaW5wdXQuc3R1YiEoOmNsb3NlZD8pLmFuZF9yZXR1cm4oZmFsc2UpCi0gICAgICBAb3V0cHV0LnN0dWIhKDpjbG9zZWQ/KS5hbmRfcmV0dXJuKHRydWUpCi0gICAgICBAdHJhbnMuc2hvdWxkIGJlX29wZW4KLSAgICAgIEBpbnB1dC5zdHViISg6Y2xvc2VkPykuYW5kX3JldHVybih0cnVlKQotICAgICAgQHRyYW5zLnNob3VsZF9ub3QgYmVfb3BlbgorICAgICAgZXhwZWN0KEB0cmFucykudG8gYmVfb3BlbgorICAgICAgYWxsb3coQGlucHV0KS50byByZWNlaXZlKDpjbG9zZWQ/KS5hbmRfcmV0dXJuKHRydWUpCisgICAgICBleHBlY3QoQHRyYW5zKS50byBiZV9vcGVuCisgICAgICBhbGxvdyhAaW5wdXQpLnRvIHJlY2VpdmUoOmNsb3NlZD8pLmFuZF9yZXR1cm4oZmFsc2UpCisgICAgICBhbGxvdyhAb3V0cHV0KS50byByZWNlaXZlKDpjbG9zZWQ/KS5hbmRfcmV0dXJuKHRydWUpCisgICAgICBleHBlY3QoQHRyYW5zKS50byBiZV9vcGVuCisgICAgICBhbGxvdyhAaW5wdXQpLnRvIHJlY2VpdmUoOmNsb3NlZD8pLmFuZF9yZXR1cm4odHJ1ZSkKKyAgICAgIGV4cGVjdChAdHJhbnMpLm5vdF90byBiZV9vcGVuCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHBhc3MgdGhyb3VnaCByZWFkL3dyaXRlIHRvIGlucHV0L291dHB1dCIgZG8KLSAgICAgIEBpbnB1dC5zaG91bGRfcmVjZWl2ZSg6cmVhZCkud2l0aCgxNykuYW5kX3JldHVybigiKyByZWFkIikKLSAgICAgIEBvdXRwdXQuc2hvdWxkX3JlY2VpdmUoOndyaXRlKS53aXRoKCJmb29iYXIiKS5hbmRfcmV0dXJuKCIrIHdyaXRlIikKLSAgICAgIEB0cmFucy5yZWFkKDE3KS5zaG91bGQgPT0gIisgcmVhZCIKLSAgICAgIEB0cmFucy53cml0ZSgiZm9vYmFyIikuc2hvdWxkID09ICIrIHdyaXRlIgorICAgICAgZXhwZWN0KEBpbnB1dCkudG8gcmVjZWl2ZSg6cmVhZCkud2l0aCgxNykuYW5kX3JldHVybigiKyByZWFkIikKKyAgICAgIGV4cGVjdChAb3V0cHV0KS50byByZWNlaXZlKDp3cml0ZSkud2l0aCgiZm9vYmFyIikuYW5kX3JldHVybigiKyB3cml0ZSIpCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoMTcpKS50byBlcSgiKyByZWFkIikKKyAgICAgIGV4cGVjdChAdHJhbnMud3JpdGUoImZvb2JhciIpKS50byBlcSgiKyB3cml0ZSIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGNsb3NlIGJvdGggaW5wdXQgYW5kIG91dHB1dCB3aGVuIGNsb3NlZCIgZG8KLSAgICAgIEBpbnB1dC5zaG91bGRfcmVjZWl2ZSg6Y2xvc2UpCi0gICAgICBAb3V0cHV0LnNob3VsZF9yZWNlaXZlKDpjbG9zZSkKKyAgICAgIGV4cGVjdChAaW5wdXQpLnRvIHJlY2VpdmUoOmNsb3NlKQorICAgICAgZXhwZWN0KEBvdXRwdXQpLnRvIHJlY2VpdmUoOmNsb3NlKQogICAgICAgQHRyYW5zLmNsb3NlCiAgICAgZW5kCiAgIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvYmluYXJ5X3Byb3RvY29sX2FjY2VsZXJhdGVkX3NwZWMucmIgYi9saWIvcmIvc3BlYy9iaW5hcnlfcHJvdG9jb2xfYWNjZWxlcmF0ZWRfc3BlYy5yYgppbmRleCBiYWM5ZWE3Li5iMmNkMDRiIDEwMDY0NAotLS0gYS9saWIvcmIvc3BlYy9iaW5hcnlfcHJvdG9jb2xfYWNjZWxlcmF0ZWRfc3BlYy5yYgorKysgYi9saWIvcmIvc3BlYy9iaW5hcnlfcHJvdG9jb2xfYWNjZWxlcmF0ZWRfc3BlYy5yYgpAQCAtMzMsMTAgKzMzLDE0IEBACiAKICAgICBkZXNjcmliZSBUaHJpZnQ6OkJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5IGRvCiAgICAgICBpdCAic2hvdWxkIGNyZWF0ZSBhIEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQiIGRvCi0gICAgICAgIFRocmlmdDo6QmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3RvcnkubmV3LmdldF9wcm90b2NvbChtb2NrKCJNb2NrVHJhbnNwb3J0IikpLnNob3VsZCBiZV9pbnN0YW5jZV9vZihUaHJpZnQ6OkJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQpCisgICAgICAgIGV4cGVjdChUaHJpZnQ6OkJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5Lm5ldy5nZXRfcHJvdG9jb2woZG91YmxlKCJNb2NrVHJhbnNwb3J0IikpKS50byBiZV9pbnN0YW5jZV9vZihUaHJpZnQ6OkJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQpCisgICAgICBlbmQKKworICAgICAgaXQgInNob3VsZCBwcm92aWRlIGEgcmVhc29uYWJsZSB0b19zIiBkbworICAgICAgICBleHBlY3QoVGhyaWZ0OjpCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeS5uZXcudG9fcykudG8gZXEoImJpbmFyeS1hY2NlbCIpCiAgICAgICBlbmQKICAgICBlbmQKICAgZW5kCiBlbHNlCiAgIHB1dHMgInNraXBwaW5nIEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQgc3BlYyBiZWNhdXNlIGl0IGlzIG5vdCBkZWZpbmVkLiIKLWVuZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK2VuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvYmluYXJ5X3Byb3RvY29sX3NwZWMucmIgYi9saWIvcmIvc3BlYy9iaW5hcnlfcHJvdG9jb2xfc3BlYy5yYgppbmRleCAzMjc3MmQzLi4wNjVmNWNlIDEwMDY0NAotLS0gYS9saWIvcmIvc3BlYy9iaW5hcnlfcHJvdG9jb2xfc3BlYy5yYgorKysgYi9saWIvcmIvc3BlYy9iaW5hcnlfcHJvdG9jb2xfc3BlYy5yYgpAQCAtMzgsMjkgKzM4LDM3IEBACiAgICAgaXQgInNob3VsZCByZWFkIGEgbWVzc2FnZSBoZWFkZXIiIGRvCiAgICAgICBAdHJhbnMud3JpdGUoW3Byb3RvY29sX2NsYXNzLmNvbnN0X2dldCg6VkVSU0lPTl8xKSB8IFRocmlmdDo6TWVzc2FnZVR5cGVzOjpSRVBMWV0ucGFjaygnTicpKQogICAgICAgQHRyYW5zLndyaXRlKFs0Ml0ucGFjaygnTicpKQotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfc3RyaW5nKS5hbmRfcmV0dXJuKCd0ZXN0TWVzc2FnZScpCi0gICAgICBAcHJvdC5yZWFkX21lc3NhZ2VfYmVnaW4uc2hvdWxkID09IFsndGVzdE1lc3NhZ2UnLCBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6UkVQTFksIDQyXQorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX3N0cmluZykuYW5kX3JldHVybigndGVzdE1lc3NhZ2UnKQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfbWVzc2FnZV9iZWdpbikudG8gZXEoWyd0ZXN0TWVzc2FnZScsIFRocmlmdDo6TWVzc2FnZVR5cGVzOjpSRVBMWSwgNDJdKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByYWlzZSBhbiBleGNlcHRpb24gaWYgdGhlIG1lc3NhZ2UgaGVhZGVyIGhhcyB0aGUgd3JvbmcgdmVyc2lvbiIgZG8KLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2kzMikuYW5kX3JldHVybigtMSkKLSAgICAgIGxhbWJkYSB7IEBwcm90LnJlYWRfbWVzc2FnZV9iZWdpbiB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uLCAnTWlzc2luZyB2ZXJzaW9uIGlkZW50aWZpZXInKSBkbyB8ZXwKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9pMzIpLmFuZF9yZXR1cm4oLTEpCisgICAgICBleHBlY3QgeyBAcHJvdC5yZWFkX21lc3NhZ2VfYmVnaW4gfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uLCAnTWlzc2luZyB2ZXJzaW9uIGlkZW50aWZpZXInKSBkbyB8ZXwKICAgICAgICAgZS50eXBlID09IFRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb246OkJBRF9WRVJTSU9OCiAgICAgICBlbmQKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmFpc2UgYW4gZXhjZXB0aW9uIGlmIHRoZSBtZXNzYWdlIGhlYWRlciBkb2VzIG5vdCBleGlzdCBhbmQgc3RyaWN0X3JlYWQgaXMgZW5hYmxlZCIgZG8KLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2kzMikuYW5kX3JldHVybig0MikKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpzdHJpY3RfcmVhZCkuYW5kX3JldHVybih0cnVlKQotICAgICAgbGFtYmRhIHsgQHByb3QucmVhZF9tZXNzYWdlX2JlZ2luIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb24sICdObyB2ZXJzaW9uIGlkZW50aWZpZXIsIG9sZCBwcm90b2NvbCBjbGllbnQ/JykgZG8gfGV8CisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfaTMyKS5hbmRfcmV0dXJuKDQyKQorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpzdHJpY3RfcmVhZCkuYW5kX3JldHVybih0cnVlKQorICAgICAgZXhwZWN0IHsgQHByb3QucmVhZF9tZXNzYWdlX2JlZ2luIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpQcm90b2NvbEV4Y2VwdGlvbiwgJ05vIHZlcnNpb24gaWRlbnRpZmllciwgb2xkIHByb3RvY29sIGNsaWVudD8nKSBkbyB8ZXwKICAgICAgICAgZS50eXBlID09IFRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb246OkJBRF9WRVJTSU9OCiAgICAgICBlbmQKICAgICBlbmQKKworICAgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHJlYXNvbmFibGUgdG9fcyIgZG8KKyAgICAgIGV4cGVjdChAcHJvdC50b19zKS50byBlcSgiYmluYXJ5KG1lbW9yeSkiKQorICAgIGVuZAogICBlbmQKIAogICBkZXNjcmliZSBUaHJpZnQ6OkJpbmFyeVByb3RvY29sRmFjdG9yeSBkbwogICAgIGl0ICJzaG91bGQgY3JlYXRlIGEgQmluYXJ5UHJvdG9jb2wiIGRvCi0gICAgICBUaHJpZnQ6OkJpbmFyeVByb3RvY29sRmFjdG9yeS5uZXcuZ2V0X3Byb3RvY29sKG1vY2soIk1vY2tUcmFuc3BvcnQiKSkuc2hvdWxkIGJlX2luc3RhbmNlX29mKFRocmlmdDo6QmluYXJ5UHJvdG9jb2wpCisgICAgICBleHBlY3QoVGhyaWZ0OjpCaW5hcnlQcm90b2NvbEZhY3RvcnkubmV3LmdldF9wcm90b2NvbChkb3VibGUoIk1vY2tUcmFuc3BvcnQiKSkpLnRvIGJlX2luc3RhbmNlX29mKFRocmlmdDo6QmluYXJ5UHJvdG9jb2wpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHByb3ZpZGUgYSByZWFzb25hYmxlIHRvX3MiIGRvCisgICAgICBleHBlY3QoVGhyaWZ0OjpCaW5hcnlQcm90b2NvbEZhY3RvcnkubmV3LnRvX3MpLnRvIGVxKCJiaW5hcnkiKQogICAgIGVuZAogICBlbmQKIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvYmluYXJ5X3Byb3RvY29sX3NwZWNfc2hhcmVkLnJiIGIvbGliL3JiL3NwZWMvYmluYXJ5X3Byb3RvY29sX3NwZWNfc2hhcmVkLnJiCmluZGV4IGM2MTViNTguLjU4ZDY1ZjAgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9zcGVjL2JpbmFyeV9wcm90b2NvbF9zcGVjX3NoYXJlZC5yYgorKysgYi9saWIvcmIvc3BlYy9iaW5hcnlfcHJvdG9jb2xfc3BlY19zaGFyZWQucmIKQEAgLTI3LDM0ICsyNywzNCBAQAogICBlbmQKIAogICBpdCAic2hvdWxkIGRlZmluZSB0aGUgcHJvcGVyIFZFUlNJT05fMSwgVkVSU0lPTl9NQVNLIEFORCBUWVBFX01BU0siIGRvCi0gICAgcHJvdG9jb2xfY2xhc3MuY29uc3RfZ2V0KDpWRVJTSU9OX01BU0spLnNob3VsZCA9PSAweGZmZmYwMDAwCi0gICAgcHJvdG9jb2xfY2xhc3MuY29uc3RfZ2V0KDpWRVJTSU9OXzEpLnNob3VsZCA9PSAweDgwMDEwMDAwCi0gICAgcHJvdG9jb2xfY2xhc3MuY29uc3RfZ2V0KDpUWVBFX01BU0spLnNob3VsZCA9PSAweDAwMDAwMGZmCisgICAgZXhwZWN0KHByb3RvY29sX2NsYXNzLmNvbnN0X2dldCg6VkVSU0lPTl9NQVNLKSkudG8gZXEoMHhmZmZmMDAwMCkKKyAgICBleHBlY3QocHJvdG9jb2xfY2xhc3MuY29uc3RfZ2V0KDpWRVJTSU9OXzEpKS50byBlcSgweDgwMDEwMDAwKQorICAgIGV4cGVjdChwcm90b2NvbF9jbGFzcy5jb25zdF9nZXQoOlRZUEVfTUFTSykpLnRvIGVxKDB4MDAwMDAwZmYpCiAgIGVuZAogCiAgIGl0ICJzaG91bGQgbWFrZSBzdHJpY3RfcmVhZCByZWFkYWJsZSIgZG8KLSAgICBAcHJvdC5zdHJpY3RfcmVhZC5zaG91bGQgZXFsKHRydWUpCisgICAgZXhwZWN0KEBwcm90LnN0cmljdF9yZWFkKS50byBlcWwodHJ1ZSkKICAgZW5kCiAKICAgaXQgInNob3VsZCBtYWtlIHN0cmljdF93cml0ZSByZWFkYWJsZSIgZG8KLSAgICBAcHJvdC5zdHJpY3Rfd3JpdGUuc2hvdWxkIGVxbCh0cnVlKQorICAgIGV4cGVjdChAcHJvdC5zdHJpY3Rfd3JpdGUpLnRvIGVxbCh0cnVlKQogICBlbmQgICAgCiAKICAgaXQgInNob3VsZCB3cml0ZSB0aGUgbWVzc2FnZSBoZWFkZXIiIGRvCiAgICAgQHByb3Qud3JpdGVfbWVzc2FnZV9iZWdpbigndGVzdE1lc3NhZ2UnLCBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6Q0FMTCwgMTcpCi0gICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09IFtwcm90b2NvbF9jbGFzcy5jb25zdF9nZXQoOlZFUlNJT05fMSkgfCBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6Q0FMTCwgInRlc3RNZXNzYWdlIi5zaXplLCAidGVzdE1lc3NhZ2UiLCAxN10ucGFjaygiTk5hMTFOIikKKyAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKFtwcm90b2NvbF9jbGFzcy5jb25zdF9nZXQoOlZFUlNJT05fMSkgfCBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6Q0FMTCwgInRlc3RNZXNzYWdlIi5zaXplLCAidGVzdE1lc3NhZ2UiLCAxN10ucGFjaygiTk5hMTFOIikpCiAgIGVuZAogICAKICAgaXQgInNob3VsZCB3cml0ZSB0aGUgbWVzc2FnZSBoZWFkZXIgd2l0aG91dCB2ZXJzaW9uIHdoZW4gd3JpdGVzIGFyZSBub3Qgc3RyaWN0IiBkbwogICAgIEBwcm90ID0gcHJvdG9jb2xfY2xhc3MubmV3KEB0cmFucywgdHJ1ZSwgZmFsc2UpICMgbm8gc3RyaWN0IHdyaXRlCiAgICAgQHByb3Qud3JpdGVfbWVzc2FnZV9iZWdpbigndGVzdE1lc3NhZ2UnLCBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6Q0FMTCwgMTcpCi0gICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICJcMDAwXDAwMFwwMDBcdnRlc3RNZXNzYWdlXDAwMVwwMDBcMDAwXDAwMFwwMjEiCisgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiXDAwMFwwMDBcMDAwXHZ0ZXN0TWVzc2FnZVwwMDFcMDAwXDAwMFwwMDBcMDIxIikKICAgZW5kCiAgIAogICBpdCAic2hvdWxkIHdyaXRlIHRoZSBtZXNzYWdlIGhlYWRlciB3aXRoIGEgdmVyc2lvbiB3aGVuIHdyaXRlcyBhcmUgc3RyaWN0IiBkbwogICAgIEBwcm90ID0gcHJvdG9jb2xfY2xhc3MubmV3KEB0cmFucykgIyBzdHJpY3Qgd3JpdGUKICAgICBAcHJvdC53cml0ZV9tZXNzYWdlX2JlZ2luKCd0ZXN0TWVzc2FnZScsIFRocmlmdDo6TWVzc2FnZVR5cGVzOjpDQUxMLCAxNykKLSAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIlwyMDBcMDAxXDAwMFwwMDFcMDAwXDAwMFwwMDBcdnRlc3RNZXNzYWdlXDAwMFwwMDBcMDAwXDAyMSIKKyAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJcMjAwXDAwMVwwMDBcMDAxXDAwMFwwMDBcMDAwXHZ0ZXN0TWVzc2FnZVwwMDBcMDAwXDAwMFwwMjEiKQogICBlbmQKICAgCiAKQEAgLTYyLDY0ICs2Miw2NyBAQAogCiAgIGl0ICJzaG91bGQgd3JpdGUgdGhlIGZpZWxkIGhlYWRlciIgZG8KICAgICBAcHJvdC53cml0ZV9maWVsZF9iZWdpbignZm9vJywgVGhyaWZ0OjpUeXBlczo6RE9VQkxFLCAzKQotICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSBbVGhyaWZ0OjpUeXBlczo6RE9VQkxFLCAzXS5wYWNrKCJjbiIpCisgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcShbVGhyaWZ0OjpUeXBlczo6RE9VQkxFLCAzXS5wYWNrKCJjbiIpKQogICBlbmQKICAgCiAgICMgZmllbGQgZm9vdGVyIGlzIGEgbm9vcAogICAKICAgaXQgInNob3VsZCB3cml0ZSB0aGUgU1RPUCBmaWVsZCIgZG8KICAgICBAcHJvdC53cml0ZV9maWVsZF9zdG9wCi0gICAgQHRyYW5zLnJlYWQoMSkuc2hvdWxkID09ICJcMDAwIgorICAgIGV4cGVjdChAdHJhbnMucmVhZCgxKSkudG8gZXEoIlwwMDAiKQogICBlbmQKICAgCiAgIGl0ICJzaG91bGQgd3JpdGUgdGhlIG1hcCBoZWFkZXIiIGRvCiAgICAgQHByb3Qud3JpdGVfbWFwX2JlZ2luKFRocmlmdDo6VHlwZXM6OlNUUklORywgVGhyaWZ0OjpUeXBlczo6TElTVCwgMTcpCi0gICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09IFtUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIFRocmlmdDo6VHlwZXM6OkxJU1QsIDE3XS5wYWNrKCJjY04iKTsKKyAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKFtUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIFRocmlmdDo6VHlwZXM6OkxJU1QsIDE3XS5wYWNrKCJjY04iKSk7CiAgIGVuZAogICAgCiAgICMgbWFwIGZvb3RlciBpcyBhIG5vb3AKICAgCiAgIGl0ICJzaG91bGQgd3JpdGUgdGhlIGxpc3QgaGVhZGVyIiBkbwogICAgIEBwcm90LndyaXRlX2xpc3RfYmVnaW4oVGhyaWZ0OjpUeXBlczo6STE2LCA0MikKLSAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gW1RocmlmdDo6VHlwZXM6OkkxNiwgNDJdLnBhY2soImNOIikKKyAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKFtUaHJpZnQ6OlR5cGVzOjpJMTYsIDQyXS5wYWNrKCJjTiIpKQogICBlbmQKICAgCiAgICMgbGlzdCBmb290ZXIgaXMgYSBub29wCiAgIAogICBpdCAic2hvdWxkIHdyaXRlIHRoZSBzZXQgaGVhZGVyIiBkbwogICAgIEBwcm90LndyaXRlX3NldF9iZWdpbihUaHJpZnQ6OlR5cGVzOjpJMTYsIDQyKQotICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSBbVGhyaWZ0OjpUeXBlczo6STE2LCA0Ml0ucGFjaygiY04iKQorICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoW1RocmlmdDo6VHlwZXM6OkkxNiwgNDJdLnBhY2soImNOIikpCiAgIGVuZAogICAKICAgaXQgInNob3VsZCB3cml0ZSBhIGJvb2wiIGRvCiAgICAgQHByb3Qud3JpdGVfYm9vbCh0cnVlKQogICAgIEBwcm90LndyaXRlX2Jvb2woZmFsc2UpCi0gICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICJcMDAxXDAwMCIKKyAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJcMDAxXDAwMCIpCiAgIGVuZAogICAKICAgaXQgInNob3VsZCB0cmVhdCBhIG5pbCBib29sIGFzIGZhbHNlIiBkbwogICAgIEBwcm90LndyaXRlX2Jvb2wobmlsKQotICAgIEB0cmFucy5yZWFkKDEpLnNob3VsZCA9PSAiXDAwMCIKKyAgICBleHBlY3QoQHRyYW5zLnJlYWQoMSkpLnRvIGVxKCJcMDAwIikKICAgZW5kCiAgIAogICBpdCAic2hvdWxkIHdyaXRlIGEgYnl0ZSIgZG8KICAgICAjIGJ5dGUgaXMgc21hbGwgZW5vdWdoLCBsZXQncyBjaGVjayAtMTI4Li4xMjcKICAgICAoLTEyOC4uMTI3KS5lYWNoIGRvIHxpfAogICAgICAgQHByb3Qud3JpdGVfYnl0ZShpKQotICAgICAgQHRyYW5zLnJlYWQoMSkuc2hvdWxkID09IFtpXS5wYWNrKCdjJykKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZCgxKSkudG8gZXEoW2ldLnBhY2soJ2MnKSkKICAgICBlbmQKLSAgICAjIGhhbmRpbmcgaXQgbnVtYmVycyBvdXQgb2Ygc2lnbmVkIHJhbmdlIHNob3VsZCBjbGlwCi0gICAgQHRyYW5zLnJzcGVjX3ZlcmlmeQorICBlbmQKKworICBpdCAic2hvdWxkIGNsaXAgbnVtYmVycyBvdXQgb2Ygc2lnbmVkIHJhbmdlIiBkbwogICAgICgxMjguLjI1NSkuZWFjaCBkbyB8aXwKICAgICAgIEBwcm90LndyaXRlX2J5dGUoaSkKLSAgICAgIEB0cmFucy5yZWFkKDEpLnNob3VsZCA9PSBbaV0ucGFjaygnYycpCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoMSkpLnRvIGVxKFtpXS5wYWNrKCdjJykpCiAgICAgZW5kCi0gICAgIyBhbmQgbGFzdGx5LCBhIEJpZ251bSBpcyBnb2luZyB0byBlcnJvciBvdXQKLSAgICBsYW1iZGEgeyBAcHJvdC53cml0ZV9ieXRlKDIqKjY1KSB9LnNob3VsZCByYWlzZV9lcnJvcihSYW5nZUVycm9yKQorICBlbmQKKworICBpdCAiZXJyb3JzIG91dCB3aXRoIGEgQmlnbnVtIiBkbworICAgIGV4cGVjdCB7IEBwcm90LndyaXRlX2J5dGUoMioqNjUpIH0udG8gcmFpc2VfZXJyb3IoUmFuZ2VFcnJvcikKICAgZW5kCiAgIAogICBpdCAic2hvdWxkIGVycm9yIGdyYWNlZnVsbHkgd2hlbiB0cnlpbmcgdG8gd3JpdGUgYSBuaWwgYnl0ZSIgZG8KLSAgICBsYW1iZGEgeyBAcHJvdC53cml0ZV9ieXRlKG5pbCkgfS5zaG91bGQgcmFpc2VfZXJyb3IKKyAgICBleHBlY3QgeyBAcHJvdC53cml0ZV9ieXRlKG5pbCkgfS50byByYWlzZV9lcnJvcgogICBlbmQKICAgCiAgIGl0ICJzaG91bGQgd3JpdGUgYW4gaTE2IiBkbwpAQCAtMTMxLDE0ICsxMzQsMTQgQEAKICAgICAjIGFuZCB0cnkgc29tZXRoaW5nIG91dCBvZiBzaWduZWQgcmFuZ2UsIGl0IHNob3VsZCBjbGlwCiAgICAgQHByb3Qud3JpdGVfaTE2KDIqKjE1ICsgNSkKICAgICAKLSAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIlwyMDBcMDAwXDM3NFwwMDBcMDAwXDAyMVwwMDBcMDAwXDMzMFwzNjBcMDA2XDI3M1wxNzdcMzc3XDIwMFwwMDUiCisgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiXDIwMFwwMDBcMzc0XDAwMFwwMDBcMDIxXDAwMFwwMDBcMzMwXDM2MFwwMDZcMjczXDE3N1wzNzdcMjAwXDAwNSIpCiAgICAgCiAgICAgIyBhIEJpZ251bSBzaG91bGQgZXJyb3IKICAgICAjIGxhbWJkYSB7IEBwcm90LndyaXRlX2kxNigyKio2NSkgfS5zaG91bGQgcmFpc2VfZXJyb3IoUmFuZ2VFcnJvcikKICAgZW5kCiAgIAogICBpdCAic2hvdWxkIGVycm9yIGdyYWNlZnVsbHkgd2hlbiB0cnlpbmcgdG8gd3JpdGUgYSBuaWwgaTE2IiBkbwotICAgIGxhbWJkYSB7IEBwcm90LndyaXRlX2kxNihuaWwpIH0uc2hvdWxkIHJhaXNlX2Vycm9yCisgICAgZXhwZWN0IHsgQHByb3Qud3JpdGVfaTE2KG5pbCkgfS50byByYWlzZV9lcnJvcgogICBlbmQKICAgCiAgIGl0ICJzaG91bGQgd3JpdGUgYW4gaTMyIiBkbwpAQCAtMTQ4LDE0ICsxNTEsMTQgQEAKICAgICAgIEBwcm90LndyaXRlX2kzMihpKQogICAgIGVuZAogICAgICMgdHJ5IHNvbWV0aGluZyBvdXQgb2Ygc2lnbmVkIHJhbmdlLCBpdCBzaG91bGQgY2xpcAotICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAiXDIwMFwwMDBcMDAwXDAwMCIgKyAiXDM3N1wzNzZcMDM3XHIiICsgIlwzNzdcMzc3XDM2NlwwMzQiICsgIlwzNzdcMzc3XDM3N1wzNzUiICsgIlwwMDBcMDAwXDAwMFwwMDAiICsgIlwwMDAjXDM0MFwyMDMiICsgIlwwMDBcMDAwMCsiICsgIlwxNzdcMzc3XDM3N1wzNzciCisgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiXDIwMFwwMDBcMDAwXDAwMCIgKyAiXDM3N1wzNzZcMDM3XHIiICsgIlwzNzdcMzc3XDM2NlwwMzQiICsgIlwzNzdcMzc3XDM3N1wzNzUiICsgIlwwMDBcMDAwXDAwMFwwMDAiICsgIlwwMDAjXDM0MFwyMDMiICsgIlwwMDBcMDAwMCsiICsgIlwxNzdcMzc3XDM3N1wzNzciKQogICAgIFsyICoqIDMxICsgNSwgMiAqKiA2NSArIDVdLmVhY2ggZG8gfGl8Ci0gICAgICBsYW1iZGEgeyBAcHJvdC53cml0ZV9pMzIoaSkgfS5zaG91bGQgcmFpc2VfZXJyb3IoUmFuZ2VFcnJvcikgIAorICAgICAgZXhwZWN0IHsgQHByb3Qud3JpdGVfaTMyKGkpIH0udG8gcmFpc2VfZXJyb3IoUmFuZ2VFcnJvcikgIAogICAgIGVuZAogICBlbmQKICAgCiAgIGl0ICJzaG91bGQgZXJyb3IgZ3JhY2VmdWxseSB3aGVuIHRyeWluZyB0byB3cml0ZSBhIG5pbCBpMzIiIGRvCi0gICAgbGFtYmRhIHsgQHByb3Qud3JpdGVfaTMyKG5pbCkgfS5zaG91bGQgcmFpc2VfZXJyb3IKKyAgICBleHBlY3QgeyBAcHJvdC53cml0ZV9pMzIobmlsKSB9LnRvIHJhaXNlX2Vycm9yCiAgIGVuZAogICAKICAgaXQgInNob3VsZCB3cml0ZSBhbiBpNjQiIGRvCkBAIC0xNjUsNyArMTY4LDcgQEAKICAgICAgIEBwcm90LndyaXRlX2k2NChpKQogICAgIGVuZAogICAgICMgdHJ5IHNvbWV0aGluZyBvdXQgb2Ygc2lnbmVkIHJhbmdlLCBpdCBzaG91bGQgY2xpcAotICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSBbIlwyMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwIiwKKyAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKFsiXDIwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDAiLAogICAgICAgIlwzNzdcMzc3XDM2NFwzMDNcMDM1XDI0NCtdIiwKICAgICAgICJcMzc3XDM3N1wzNzdcMzc3XDM3NlwyMzE6XDM0MSIsCiAgICAgICAiXDM3N1wzNzdcMzc3XDM3N1wzNzdcMzc3XDM3N1wwMjYiLApAQCAtMTczLDEyICsxNzYsMTIgQEAKICAgICAgICJcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDA0XDMxNyIsCiAgICAgICAiXDAwMFwwMDBcMDAwXDAwMFwwMDAjXDM0MFwyMDQiLAogICAgICAgIlwwMDBcMDAwXDAwMFwwMDJcMzQwXDMxMX5cMzY1IiwKLSAgICAgICJcMTc3XDM3N1wzNzdcMzc3XDM3N1wzNzdcMzc3XDM3NyJdLmpvaW4oIiIpCi0gICAgbGFtYmRhIHsgQHByb3Qud3JpdGVfaTY0KDIgKiogNjUgKyA1KSB9LnNob3VsZCByYWlzZV9lcnJvcihSYW5nZUVycm9yKQorICAgICAgIlwxNzdcMzc3XDM3N1wzNzdcMzc3XDM3N1wzNzdcMzc3Il0uam9pbigiIikpCisgICAgZXhwZWN0IHsgQHByb3Qud3JpdGVfaTY0KDIgKiogNjUgKyA1KSB9LnRvIHJhaXNlX2Vycm9yKFJhbmdlRXJyb3IpCiAgIGVuZAogICAKICAgaXQgInNob3VsZCBlcnJvciBncmFjZWZ1bGx5IHdoZW4gdHJ5aW5nIHRvIHdyaXRlIGEgbmlsIGk2NCIgZG8KLSAgICBsYW1iZGEgeyBAcHJvdC53cml0ZV9pNjQobmlsKSB9LnNob3VsZCByYWlzZV9lcnJvcgorICAgIGV4cGVjdCB7IEBwcm90LndyaXRlX2k2NChuaWwpIH0udG8gcmFpc2VfZXJyb3IKICAgZW5kCiAgIAogICBpdCAic2hvdWxkIHdyaXRlIGEgZG91YmxlIiBkbwpAQCAtMTg2LDEyICsxODksMTIgQEAKICAgICB2YWx1ZXMgPSBbRmxvYXQ6Ok1JTiwtMTIzMS4xNTMyNSwgLTEyMzEyMy4yMywgLTIzLjIzNTE1MTIzLCAwLCAxMjM1MS4xMzI1LCA1MjMuMjMsIEZsb2F0OjpNQVhdCiAgICAgdmFsdWVzLmVhY2ggZG8gfGZ8CiAgICAgICBAcHJvdC53cml0ZV9kb3VibGUoZikKLSAgICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSBbZl0ucGFjaygiRyIpCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKFtmXS5wYWNrKCJHIikpCiAgICAgZW5kCiAgIGVuZAogICAKICAgaXQgInNob3VsZCBlcnJvciBncmFjZWZ1bGx5IHdoZW4gdHJ5aW5nIHRvIHdyaXRlIGEgbmlsIGRvdWJsZSIgZG8KLSAgICBsYW1iZGEgeyBAcHJvdC53cml0ZV9kb3VibGUobmlsKSB9LnNob3VsZCByYWlzZV9lcnJvcgorICAgIGV4cGVjdCB7IEBwcm90LndyaXRlX2RvdWJsZShuaWwpIH0udG8gcmFpc2VfZXJyb3IKICAgZW5kCiAKICAgaWYgUlVCWV9WRVJTSU9OID49ICcxLjknCkBAIC0xOTksMTExICsyMDIsMTExIEBACiAgICAgICBzdHIgPSAnYWJjJwogICAgICAgQHByb3Qud3JpdGVfc3RyaW5nKHN0cikKICAgICAgIGEgPSBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKQotICAgICAgYS5lbmNvZGluZy5zaG91bGQgPT0gRW5jb2Rpbmc6OkJJTkFSWQotICAgICAgYS51bnBhY2soJ0MqJykuc2hvdWxkID09IFsweDAwLCAweDAwLCAweDAwLCAweDAzLCAweDYxLCAweDYyLCAweDYzXQorICAgICAgZXhwZWN0KGEuZW5jb2RpbmcpLnRvIGVxKEVuY29kaW5nOjpCSU5BUlkpCisgICAgICBleHBlY3QoYS51bnBhY2soJ0MqJykpLnRvIGVxKFsweDAwLCAweDAwLCAweDAwLCAweDAzLCAweDYxLCAweDYyLCAweDYzXSkKICAgICBlbmQKIAogICAgIGl0ICdzaG91bGQgd3JpdGUgYSBzdHJpbmcgd2l0aCB1bmljb2RlIGNoYXJhY3RlcnMnIGRvCiAgICAgICBzdHIgPSAiYWJjIFx1MjBBQyBcdTIwQUQiLmVuY29kZSgnVVRGLTgnKQogICAgICAgQHByb3Qud3JpdGVfc3RyaW5nKHN0cikKICAgICAgIGEgPSBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKQotICAgICAgYS5lbmNvZGluZy5zaG91bGQgPT0gRW5jb2Rpbmc6OkJJTkFSWQotICAgICAgYS51bnBhY2soJ0MqJykuc2hvdWxkID09IFsweDAwLCAweDAwLCAweDAwLCAweDBCLCAweDYxLCAweDYyLCAweDYzLCAweDIwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEUyLCAweDgyLCAweEFDLCAweDIwLCAweEUyLCAweDgyLCAweEFEXQorICAgICAgZXhwZWN0KGEuZW5jb2RpbmcpLnRvIGVxKEVuY29kaW5nOjpCSU5BUlkpCisgICAgICBleHBlY3QoYS51bnBhY2soJ0MqJykpLnRvIGVxKFsweDAwLCAweDAwLCAweDAwLCAweDBCLCAweDYxLCAweDYyLCAweDYzLCAweDIwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEUyLCAweDgyLCAweEFDLCAweDIwLCAweEUyLCAweDgyLCAweEFEXSkKICAgICBlbmQKIAogICAgIGl0ICdzaG91bGQgd3JpdGUgc2hvdWxkIHdyaXRlIGEgc3RyaW5nIHdpdGggdW5pY29kZSBjaGFyYWN0ZXJzIGFuZCB0cmFuc2NvZGluZycgZG8KICAgICAgIHN0ciA9ICJhYmMgXHUyMEFDIi5lbmNvZGUoJ0lTTy04ODU5LTE1JykKICAgICAgIEBwcm90LndyaXRlX3N0cmluZyhzdHIpCiAgICAgICBhID0gQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkKLSAgICAgIGEuZW5jb2Rpbmcuc2hvdWxkID09IEVuY29kaW5nOjpCSU5BUlkKLSAgICAgIGEudW5wYWNrKCdDKicpLnNob3VsZCA9PSBbMHgwMCwgMHgwMCwgMHgwMCwgMHgwNywgMHg2MSwgMHg2MiwgMHg2MywgMHgyMCwgMHhFMiwgMHg4MiwgMHhBQ10KKyAgICAgIGV4cGVjdChhLmVuY29kaW5nKS50byBlcShFbmNvZGluZzo6QklOQVJZKQorICAgICAgZXhwZWN0KGEudW5wYWNrKCdDKicpKS50byBlcShbMHgwMCwgMHgwMCwgMHgwMCwgMHgwNywgMHg2MSwgMHg2MiwgMHg2MywgMHgyMCwgMHhFMiwgMHg4MiwgMHhBQ10pCiAgICAgZW5kCiAKICAgICBpdCAnc2hvdWxkIHdyaXRlIGEgYmluYXJ5IHN0cmluZycgZG8KICAgICAgIGJ1ZmZlciA9IFswLCAxLCAyLCAzXS5wYWNrKCdDKicpCiAgICAgICBAcHJvdC53cml0ZV9iaW5hcnkoYnVmZmVyKQogICAgICAgYSA9IEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpCi0gICAgICBhLmVuY29kaW5nLnNob3VsZCA9PSBFbmNvZGluZzo6QklOQVJZCi0gICAgICBhLnVucGFjaygnQyonKS5zaG91bGQgPT0gWzB4MDAsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDNdCisgICAgICBleHBlY3QoYS5lbmNvZGluZykudG8gZXEoRW5jb2Rpbmc6OkJJTkFSWSkKKyAgICAgIGV4cGVjdChhLnVucGFjaygnQyonKSkudG8gZXEoWzB4MDAsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDNdKQogICAgIGVuZAogICBlbHNlCiAgICAgaXQgJ3Nob3VsZCB3cml0ZSBhIHN0cmluZycgZG8KICAgICAgIHN0ciA9ICdhYmMnCiAgICAgICBAcHJvdC53cml0ZV9zdHJpbmcoc3RyKQogICAgICAgYSA9IEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpCi0gICAgICBhLnVucGFjaygnQyonKS5zaG91bGQgPT0gWzB4MDAsIDB4MDAsIDB4MDAsIDB4MDMsIDB4NjEsIDB4NjIsIDB4NjNdCisgICAgICBleHBlY3QoYS51bnBhY2soJ0MqJykpLnRvIGVxKFsweDAwLCAweDAwLCAweDAwLCAweDAzLCAweDYxLCAweDYyLCAweDYzXSkKICAgICBlbmQKIAogICAgIGl0ICdzaG91bGQgd3JpdGUgYSBiaW5hcnkgc3RyaW5nJyBkbwogICAgICAgYnVmZmVyID0gWzAsIDEsIDIsIDNdLnBhY2soJ0MqJykKICAgICAgIEBwcm90LndyaXRlX2JpbmFyeShidWZmZXIpCiAgICAgICBhID0gQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkKLSAgICAgIGEudW5wYWNrKCdDKicpLnNob3VsZCA9PSBbMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMSwgMHgwMiwgMHgwM10KKyAgICAgIGV4cGVjdChhLnVucGFjaygnQyonKSkudG8gZXEoWzB4MDAsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDNdKQogICAgIGVuZAogICBlbmQKIAogICBpdCAic2hvdWxkIGVycm9yIGdyYWNlZnVsbHkgd2hlbiB0cnlpbmcgdG8gd3JpdGUgYSBuaWwgc3RyaW5nIiBkbwotICAgIGxhbWJkYSB7IEBwcm90LndyaXRlX3N0cmluZyhuaWwpIH0uc2hvdWxkIHJhaXNlX2Vycm9yCisgICAgZXhwZWN0IHsgQHByb3Qud3JpdGVfc3RyaW5nKG5pbCkgfS50byByYWlzZV9lcnJvcgogICBlbmQKICAgCiAgIGl0ICJzaG91bGQgd3JpdGUgdGhlIG1lc3NhZ2UgaGVhZGVyIHdpdGhvdXQgdmVyc2lvbiB3aGVuIHdyaXRlcyBhcmUgbm90IHN0cmljdCIgZG8KICAgICBAcHJvdCA9IHByb3RvY29sX2NsYXNzLm5ldyhAdHJhbnMsIHRydWUsIGZhbHNlKSAjIG5vIHN0cmljdCB3cml0ZQogICAgIEBwcm90LndyaXRlX21lc3NhZ2VfYmVnaW4oJ3Rlc3RNZXNzYWdlJywgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OkNBTEwsIDE3KQotICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAiXDAwMFwwMDBcMDAwXHZ0ZXN0TWVzc2FnZVwwMDFcMDAwXDAwMFwwMDBcMDIxIgorICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIlwwMDBcMDAwXDAwMFx2dGVzdE1lc3NhZ2VcMDAxXDAwMFwwMDBcMDAwXDAyMSIpCiAgIGVuZAogICAgIAogICBpdCAic2hvdWxkIHdyaXRlIHRoZSBtZXNzYWdlIGhlYWRlciB3aXRoIGEgdmVyc2lvbiB3aGVuIHdyaXRlcyBhcmUgc3RyaWN0IiBkbwogICAgIEBwcm90ID0gcHJvdG9jb2xfY2xhc3MubmV3KEB0cmFucykgIyBzdHJpY3Qgd3JpdGUKICAgICBAcHJvdC53cml0ZV9tZXNzYWdlX2JlZ2luKCd0ZXN0TWVzc2FnZScsIFRocmlmdDo6TWVzc2FnZVR5cGVzOjpDQUxMLCAxNykKLSAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIlwyMDBcMDAxXDAwMFwwMDFcMDAwXDAwMFwwMDBcdnRlc3RNZXNzYWdlXDAwMFwwMDBcMDAwXDAyMSIKKyAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJcMjAwXDAwMVwwMDBcMDAxXDAwMFwwMDBcMDAwXHZ0ZXN0TWVzc2FnZVwwMDBcMDAwXDAwMFwwMjEiKQogICBlbmQKICAgCiAgICMgbWVzc2FnZSBmb290ZXIgaXMgYSBub29wCiAgIAogICBpdCAic2hvdWxkIHJlYWQgYSBmaWVsZCBoZWFkZXIiIGRvCiAgICAgQHRyYW5zLndyaXRlKFtUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDNdLnBhY2soImNuIikpCi0gICAgQHByb3QucmVhZF9maWVsZF9iZWdpbi5zaG91bGQgPT0gW25pbCwgVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCAzXQorICAgIGV4cGVjdChAcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKS50byBlcShbbmlsLCBUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDNdKQogICBlbmQKICAgCiAgICMgZmllbGQgZm9vdGVyIGlzIGEgbm9vcAogICAKICAgaXQgInNob3VsZCByZWFkIGEgc3RvcCBmaWVsZCIgZG8KICAgICBAdHJhbnMud3JpdGUoW1RocmlmdDo6VHlwZXM6OlNUT1BdLnBhY2soImMiKSk7Ci0gICAgQHByb3QucmVhZF9maWVsZF9iZWdpbi5zaG91bGQgPT0gW25pbCwgVGhyaWZ0OjpUeXBlczo6U1RPUCwgMF0KKyAgICBleHBlY3QoQHByb3QucmVhZF9maWVsZF9iZWdpbikudG8gZXEoW25pbCwgVGhyaWZ0OjpUeXBlczo6U1RPUCwgMF0pCiAgIGVuZAogCiAgIGl0ICJzaG91bGQgcmVhZCBhIG1hcCBoZWFkZXIiIGRvCiAgICAgQHRyYW5zLndyaXRlKFtUaHJpZnQ6OlR5cGVzOjpET1VCTEUsIFRocmlmdDo6VHlwZXM6Okk2NCwgNDJdLnBhY2soImNjTiIpKQotICAgIEBwcm90LnJlYWRfbWFwX2JlZ2luLnNob3VsZCA9PSBbVGhyaWZ0OjpUeXBlczo6RE9VQkxFLCBUaHJpZnQ6OlR5cGVzOjpJNjQsIDQyXQorICAgIGV4cGVjdChAcHJvdC5yZWFkX21hcF9iZWdpbikudG8gZXEoW1RocmlmdDo6VHlwZXM6OkRPVUJMRSwgVGhyaWZ0OjpUeXBlczo6STY0LCA0Ml0pCiAgIGVuZAogICAKICAgIyBtYXAgZm9vdGVyIGlzIGEgbm9vcAogICAKICAgaXQgInNob3VsZCByZWFkIGEgbGlzdCBoZWFkZXIiIGRvCiAgICAgQHRyYW5zLndyaXRlKFtUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDE3XS5wYWNrKCJjTiIpKQotICAgIEBwcm90LnJlYWRfbGlzdF9iZWdpbi5zaG91bGQgPT0gW1RocmlmdDo6VHlwZXM6OlNUUklORywgMTddCisgICAgZXhwZWN0KEBwcm90LnJlYWRfbGlzdF9iZWdpbikudG8gZXEoW1RocmlmdDo6VHlwZXM6OlNUUklORywgMTddKQogICBlbmQKICAgCiAgICMgbGlzdCBmb290ZXIgaXMgYSBub29wCiAgIAogICBpdCAic2hvdWxkIHJlYWQgYSBzZXQgaGVhZGVyIiBkbwogICAgIEB0cmFucy53cml0ZShbVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCAxN10ucGFjaygiY04iKSkKLSAgICBAcHJvdC5yZWFkX3NldF9iZWdpbi5zaG91bGQgPT0gW1RocmlmdDo6VHlwZXM6OlNUUklORywgMTddCisgICAgZXhwZWN0KEBwcm90LnJlYWRfc2V0X2JlZ2luKS50byBlcShbVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCAxN10pCiAgIGVuZAogICAKICAgIyBzZXQgZm9vdGVyIGlzIGEgbm9vcAogICAKICAgaXQgInNob3VsZCByZWFkIGEgYm9vbCIgZG8KICAgICBAdHJhbnMud3JpdGUoIlwwMDFcMDAwIik7Ci0gICAgQHByb3QucmVhZF9ib29sLnNob3VsZCA9PSB0cnVlCi0gICAgQHByb3QucmVhZF9ib29sLnNob3VsZCA9PSBmYWxzZQorICAgIGV4cGVjdChAcHJvdC5yZWFkX2Jvb2wpLnRvIGVxKHRydWUpCisgICAgZXhwZWN0KEBwcm90LnJlYWRfYm9vbCkudG8gZXEoZmFsc2UpCiAgIGVuZAogICAKICAgaXQgInNob3VsZCByZWFkIGEgYnl0ZSIgZG8KICAgICBbLTEyOCwgLTU3LCAtMywgMCwgMTcsIDI0LCAxMjddLmVhY2ggZG8gfGl8CiAgICAgICBAdHJhbnMud3JpdGUoW2ldLnBhY2soImMiKSkKLSAgICAgIEBwcm90LnJlYWRfYnl0ZS5zaG91bGQgPT0gaQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfYnl0ZSkudG8gZXEoaSkKICAgICBlbmQKICAgZW5kCiAgIApAQCAtMzExLDcgKzMxNCw3IEBACiAgICAgIyB0cnkgYSBzY2F0dGVyaW5nIG9mIHZhbHVlcywgaW5jbHVkaW5nIG1pbi9tYXgKICAgICBbLTIqKjE1LCAtNTIzNywgLTM1MywgMCwgMTUyNywgMjIzNCwgMioqMTUtMV0uZWFjaCBkbyB8aXwKICAgICAgIEB0cmFucy53cml0ZShbaV0ucGFjaygibiIpKTsKLSAgICAgIEBwcm90LnJlYWRfaTE2LnNob3VsZCA9PSBpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9pMTYpLnRvIGVxKGkpCiAgICAgZW5kCiAgIGVuZAogICAKQEAgLTMxOSw3ICszMjIsNyBAQAogICAgICMgdHJ5IGEgc2NhdHRlcmluZyBvZiB2YWx1ZXMsIGluY2x1ZGluZyBtaW4vbWF4CiAgICAgWy0yKiozMSwgLTIzNTEyNSwgLTYyMzYsIDAsIDIzNTEsIDEyMzEyMywgMioqMzEtMV0uZWFjaCBkbyB8aXwKICAgICAgIEB0cmFucy53cml0ZShbaV0ucGFjaygiTiIpKQotICAgICAgQHByb3QucmVhZF9pMzIuc2hvdWxkID09IGkKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2kzMikudG8gZXEoaSkKICAgICBlbmQKICAgZW5kCiAgIApAQCAtMzI3LDcgKzMzMCw3IEBACiAgICAgIyB0cnkgYSBzY2F0dGVyaW5nIG9mIHZhbHVlcywgaW5jbHVkaW5nIG1pbi9tYXgKICAgICBbLTIqKjYzLCAtMTIzNTEyMzEyLCAtNjM0NiwgMCwgMzIsIDIzNDYzMjIzMjMsIDIqKjYzLTFdLmVhY2ggZG8gfGl8CiAgICAgICBAdHJhbnMud3JpdGUoW2kgPj4gMzIsIGkgJiAweEZGRkZGRkZGXS5wYWNrKCJOTiIpKQotICAgICAgQHByb3QucmVhZF9pNjQuc2hvdWxkID09IGkKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2k2NCkudG8gZXEoaSkKICAgICBlbmQKICAgZW5kCiAgIApAQCAtMzM1LDcgKzMzOCw3IEBACiAgICAgIyB0cnkgYSByYW5kb20gc2NhdHRlcmluZyBvZiB2YWx1ZXMsIGluY2x1ZGluZyBtaW4vbWF4CiAgICAgW0Zsb2F0OjpNSU4sIC0yMzEyMzEuMTIzNTEsIC0zMjMuMjMzNTEzLCAwLCAxMjMuMjM1MTIzNSwgMjM1MTIzNS4xMjM1MTIzNSwgRmxvYXQ6Ok1BWF0uZWFjaCBkbyB8ZnwKICAgICAgIEB0cmFucy53cml0ZShbZl0ucGFjaygiRyIpKTsKLSAgICAgIEBwcm90LnJlYWRfZG91YmxlLnNob3VsZCA9PSBmCisgICAgICBleHBlY3QoQHByb3QucmVhZF9kb3VibGUpLnRvIGVxKGYpCiAgICAgZW5kCiAgIGVuZAogCkBAIC0zNDUsOCArMzQ4LDggQEAKICAgICAgIGJ1ZmZlciA9IFsweDAwLCAweDAwLCAweDAwLCAweDAzLCAweDYxLCAweDYyLCAweDYzXS5wYWNrKCdDKicpCiAgICAgICBAdHJhbnMud3JpdGUoYnVmZmVyKQogICAgICAgYSA9IEBwcm90LnJlYWRfc3RyaW5nCi0gICAgICBhLnNob3VsZCA9PSAnYWJjJy5lbmNvZGUoJ1VURi04JykKLSAgICAgIGEuZW5jb2Rpbmcuc2hvdWxkID09IEVuY29kaW5nOjpVVEZfOAorICAgICAgZXhwZWN0KGEpLnRvIGVxKCdhYmMnLmVuY29kZSgnVVRGLTgnKSkKKyAgICAgIGV4cGVjdChhLmVuY29kaW5nKS50byBlcShFbmNvZGluZzo6VVRGXzgpCiAgICAgZW5kCiAKICAgICBpdCAnc2hvdWxkIHJlYWQgYSBzdHJpbmcgY29udGFpbmluZyB1bmljb2RlIGNoYXJhY3RlcnMgZnJvbSBVVEYtOCBlbmNvZGVkIGJ1ZmZlcicgZG8KQEAgLTM1NCw0NCArMzU3LDQ0IEBACiAgICAgICBidWZmZXIgPSBbMHgwMCwgMHgwMCwgMHgwMCwgMHgwMywgMHhFMiwgMHg4MiwgMHhBQ10ucGFjaygnQyonKQogICAgICAgQHRyYW5zLndyaXRlKGJ1ZmZlcikKICAgICAgIGEgPSBAcHJvdC5yZWFkX3N0cmluZwotICAgICAgYS5zaG91bGQgPT0gIlx1MjBBQyIuZW5jb2RlKCdVVEYtOCcpCi0gICAgICBhLmVuY29kaW5nLnNob3VsZCA9PSBFbmNvZGluZzo6VVRGXzgKKyAgICAgIGV4cGVjdChhKS50byBlcSgiXHUyMEFDIi5lbmNvZGUoJ1VURi04JykpCisgICAgICBleHBlY3QoYS5lbmNvZGluZykudG8gZXEoRW5jb2Rpbmc6OlVURl84KQogICAgIGVuZAogCiAgICAgaXQgJ3Nob3VsZCByZWFkIGEgYmluYXJ5IHN0cmluZycgZG8KICAgICAgIGJ1ZmZlciA9IFsweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAxLCAweDAyLCAweDAzXS5wYWNrKCdDKicpCiAgICAgICBAdHJhbnMud3JpdGUoYnVmZmVyKQogICAgICAgYSA9IEBwcm90LnJlYWRfYmluYXJ5Ci0gICAgICBhLnNob3VsZCA9PSBbMHgwMCwgMHgwMSwgMHgwMiwgMHgwM10ucGFjaygnQyonKQotICAgICAgYS5lbmNvZGluZy5zaG91bGQgPT0gRW5jb2Rpbmc6OkJJTkFSWQorICAgICAgZXhwZWN0KGEpLnRvIGVxKFsweDAwLCAweDAxLCAweDAyLCAweDAzXS5wYWNrKCdDKicpKQorICAgICAgZXhwZWN0KGEuZW5jb2RpbmcpLnRvIGVxKEVuY29kaW5nOjpCSU5BUlkpCiAgICAgZW5kCiAgIGVsc2UKICAgICBpdCAnc2hvdWxkIHJlYWQgYSBzdHJpbmcnIGRvCiAgICAgICAjIGkzMiBvZiB2YWx1ZSAzLCBmb2xsb3dlZCBieSB0aHJlZSBjaGFyYWN0ZXJzL1VURi04IGJ5dGVzICdhJywgJ2InLCAnYycKICAgICAgIGJ1ZmZlciA9IFsweDAwLCAweDAwLCAweDAwLCAweDAzLCAweDYxLCAweDYyLCAweDYzXS5wYWNrKCdDKicpCiAgICAgICBAdHJhbnMud3JpdGUoYnVmZmVyKQotICAgICAgQHByb3QucmVhZF9zdHJpbmcuc2hvdWxkID09ICdhYmMnCisgICAgICBleHBlY3QoQHByb3QucmVhZF9zdHJpbmcpLnRvIGVxKCdhYmMnKQogICAgIGVuZAogCiAgICAgaXQgJ3Nob3VsZCByZWFkIGEgYmluYXJ5IHN0cmluZycgZG8KICAgICAgIGJ1ZmZlciA9IFsweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAxLCAweDAyLCAweDAzXS5wYWNrKCdDKicpCiAgICAgICBAdHJhbnMud3JpdGUoYnVmZmVyKQogICAgICAgYSA9IEBwcm90LnJlYWRfYmluYXJ5Ci0gICAgICBhLnNob3VsZCA9PSBbMHgwMCwgMHgwMSwgMHgwMiwgMHgwM10ucGFjaygnQyonKQorICAgICAgZXhwZWN0KGEpLnRvIGVxKFsweDAwLCAweDAxLCAweDAyLCAweDAzXS5wYWNrKCdDKicpKQogICAgIGVuZAogICBlbmQKIAogICBpdCAic2hvdWxkIHBlcmZvcm0gYSBjb21wbGV0ZSBycGMgd2l0aCBubyBhcmdzIG9yIHJldHVybiIgZG8KICAgICBzcnZfdGVzdCgKICAgICAgIHByb2Mge3xjbGllbnR8IGNsaWVudC5zZW5kX3ZvaWRNZXRob2QoKX0sCi0gICAgICBwcm9jIHt8Y2xpZW50fCBjbGllbnQucmVjdl92b2lkTWV0aG9kLnNob3VsZCA9PSBuaWx9CisgICAgICBwcm9jIHt8Y2xpZW50fCBleHBlY3QoY2xpZW50LnJlY3Zfdm9pZE1ldGhvZCkudG8gZXEobmlsKX0KICAgICApCiAgIGVuZAogCiAgIGl0ICJzaG91bGQgcGVyZm9ybSBhIGNvbXBsZXRlIHJwYyB3aXRoIGEgcHJpbWl0aXZlIHJldHVybiB0eXBlIiBkbwogICAgIHNydl90ZXN0KAogICAgICAgcHJvYyB7fGNsaWVudHwgY2xpZW50LnNlbmRfcHJpbWl0aXZlTWV0aG9kKCl9LAotICAgICAgcHJvYyB7fGNsaWVudHwgY2xpZW50LnJlY3ZfcHJpbWl0aXZlTWV0aG9kLnNob3VsZCA9PSAxfQorICAgICAgcHJvYyB7fGNsaWVudHwgZXhwZWN0KGNsaWVudC5yZWN2X3ByaW1pdGl2ZU1ldGhvZCkudG8gZXEoMSl9CiAgICAgKQogICBlbmQKIApAQCAtNDAyLDcgKzQwNSw3IEBACiAgICAgICAgIHJlc3VsdCA9IGNsaWVudC5yZWN2X3N0cnVjdE1ldGhvZAogICAgICAgICByZXN1bHQuc2V0X2J5dGVfbWFwID0gbmlsCiAgICAgICAgIHJlc3VsdC5tYXBfYnl0ZV9tYXAgPSBuaWwKLSAgICAgICAgcmVzdWx0LnNob3VsZCA9PSBGaXh0dXJlczo6Q09NUEFDVF9QUk9UT0NPTF9URVNUX1NUUlVDVAorICAgICAgICBleHBlY3QocmVzdWx0KS50byBlcShGaXh0dXJlczo6Q09NUEFDVF9QUk9UT0NPTF9URVNUX1NUUlVDVCkKICAgICAgIH0KICAgICApCiAgIGVuZApAQCAtNDIzLDkgKzQyNiw5IEBACiAgICAgY2xpZW50cHJvdG8gPSBwcm90b2NvbF9jbGFzcy5uZXcoY2xpZW50c2lkZSkKICAgICBzZXJ2ZXJwcm90byA9IHByb3RvY29sX2NsYXNzLm5ldyhzZXJ2ZXJzaWRlKQogCi0gICAgcHJvY2Vzc29yID0gU3J2OjpQcm9jZXNzb3IubmV3KFNydkhhbmRsZXIubmV3KQorICAgIHByb2Nlc3NvciA9IFRocmlmdDo6VGVzdDo6U3J2OjpQcm9jZXNzb3IubmV3KFNydkhhbmRsZXIubmV3KQogCi0gICAgY2xpZW50ID0gU3J2OjpDbGllbnQubmV3KGNsaWVudHByb3RvLCBjbGllbnRwcm90bykKKyAgICBjbGllbnQgPSBUaHJpZnQ6OlRlc3Q6OlNydjo6Q2xpZW50Lm5ldyhjbGllbnRwcm90bywgY2xpZW50cHJvdG8pCiAKICAgICAjIGZpcnN0IGJsb2NrCiAgICAgZmlyc3RibG9jay5jYWxsKGNsaWVudCkKZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL2J5dGVzX3NwZWMucmIgYi9saWIvcmIvc3BlYy9ieXRlc19zcGVjLnJiCmluZGV4IGI4MmUzMDQuLjJlODY1M2MgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9zcGVjL2J5dGVzX3NwZWMucmIKKysrIGIvbGliL3JiL3NwZWMvYnl0ZXNfc3BlYy5yYgpAQCAtMjUsMzMgKzI1LDMzIEBACiAgICAgZGVzY3JpYmUgJy5lbXB0eV9ieXRlX2J1ZmZlcicgZG8KICAgICAgIGl0ICdzaG91bGQgY3JlYXRlIGFuIGVtcHR5IGJ1ZmZlcicgZG8KICAgICAgICAgYiA9IFRocmlmdDo6Qnl0ZXMuZW1wdHlfYnl0ZV9idWZmZXIKLSAgICAgICAgYi5sZW5ndGguc2hvdWxkID09IDAKLSAgICAgICAgYi5lbmNvZGluZy5zaG91bGQgPT0gRW5jb2Rpbmc6OkJJTkFSWQorICAgICAgICBleHBlY3QoYi5sZW5ndGgpLnRvIGVxKDApCisgICAgICAgIGV4cGVjdChiLmVuY29kaW5nKS50byBlcShFbmNvZGluZzo6QklOQVJZKQogICAgICAgZW5kCiAKICAgICAgIGl0ICdzaG91bGQgY3JlYXRlIGFuIGVtcHR5IGJ1ZmZlciBvZiBnaXZlbiBzaXplJyBkbwogICAgICAgICBiID0gVGhyaWZ0OjpCeXRlcy5lbXB0eV9ieXRlX2J1ZmZlciAyCi0gICAgICAgIGIubGVuZ3RoLnNob3VsZCA9PSAyCi0gICAgICAgIGIuZ2V0Ynl0ZSgwKS5zaG91bGQgPT0gMAotICAgICAgICBiLmdldGJ5dGUoMSkuc2hvdWxkID09IDAKLSAgICAgICAgYi5lbmNvZGluZy5zaG91bGQgPT0gRW5jb2Rpbmc6OkJJTkFSWQorICAgICAgICBleHBlY3QoYi5sZW5ndGgpLnRvIGVxKDIpCisgICAgICAgIGV4cGVjdChiLmdldGJ5dGUoMCkpLnRvIGVxKDApCisgICAgICAgIGV4cGVjdChiLmdldGJ5dGUoMSkpLnRvIGVxKDApCisgICAgICAgIGV4cGVjdChiLmVuY29kaW5nKS50byBlcShFbmNvZGluZzo6QklOQVJZKQogICAgICAgZW5kCiAgICAgZW5kCiAKICAgICBkZXNjcmliZSAnLmZvcmNlX2JpbmFyeV9lbmNvZGluZycgZG8KICAgICAgIGl0ICdzaG91bGQgY2hhbmdlIGVuY29kaW5nJyBkbwogICAgICAgICBlID0gJ1NUUklORycuZW5jb2RlKCdVVEYtOCcpCi0gICAgICAgIGUuZW5jb2Rpbmcuc2hvdWxkX25vdCA9PSBFbmNvZGluZzo6QklOQVJZCisgICAgICAgIGV4cGVjdChlLmVuY29kaW5nKS5ub3RfdG8gZXEoRW5jb2Rpbmc6OkJJTkFSWSkKICAgICAgICAgYSA9IFRocmlmdDo6Qnl0ZXMuZm9yY2VfYmluYXJ5X2VuY29kaW5nIGUKLSAgICAgICAgYS5lbmNvZGluZy5zaG91bGQgPT0gRW5jb2Rpbmc6OkJJTkFSWQorICAgICAgICBleHBlY3QoYS5lbmNvZGluZykudG8gZXEoRW5jb2Rpbmc6OkJJTkFSWSkKICAgICAgIGVuZAogICAgIGVuZAogCiAgICAgZGVzY3JpYmUgJy5nZXRfc3RyaW5nX2J5dGUnIGRvCiAgICAgICBpdCAnc2hvdWxkIGdldCB0aGUgYnl0ZSBhdCBpbmRleCcgZG8KICAgICAgICAgcyA9ICJceDQxXHg0MiIKLSAgICAgICAgVGhyaWZ0OjpCeXRlcy5nZXRfc3RyaW5nX2J5dGUocywgMCkuc2hvdWxkID09IDB4NDEKLSAgICAgICAgVGhyaWZ0OjpCeXRlcy5nZXRfc3RyaW5nX2J5dGUocywgMSkuc2hvdWxkID09IDB4NDIKKyAgICAgICAgZXhwZWN0KFRocmlmdDo6Qnl0ZXMuZ2V0X3N0cmluZ19ieXRlKHMsIDApKS50byBlcSgweDQxKQorICAgICAgICBleHBlY3QoVGhyaWZ0OjpCeXRlcy5nZXRfc3RyaW5nX2J5dGUocywgMSkpLnRvIGVxKDB4NDIpCiAgICAgICBlbmQKICAgICBlbmQKIApAQCAtNTksNDIgKzU5LDQyIEBACiAgICAgICBpdCAnc2hvdWxkIHNldCBieXRlIHZhbHVlIGF0IGluZGV4JyBkbwogICAgICAgICBzID0gIlx4NDFceDQyIgogICAgICAgICBUaHJpZnQ6OkJ5dGVzLnNldF9zdHJpbmdfYnl0ZShzLCAwLCAweDQzKQotICAgICAgICBzLmdldGJ5dGUoMCkuc2hvdWxkID09IDB4NDMKLSAgICAgICAgcy5zaG91bGQgPT0gJ0NCJworICAgICAgICBleHBlY3Qocy5nZXRieXRlKDApKS50byBlcSgweDQzKQorICAgICAgICBleHBlY3QocykudG8gZXEoJ0NCJykKICAgICAgIGVuZAogICAgIGVuZAogCiAgICAgZGVzY3JpYmUgJy5jb252ZXJ0X3RvX3V0ZjhfYnl0ZV9idWZmZXInIGRvCiAgICAgICBpdCAnc2hvdWxkIGNvbnZlcnQgVVRGLTggU3RyaW5nIHRvIGJ5dGUgYnVmZmVyJyBkbwogICAgICAgICBlID0gIlx1MjBBQyIuZW5jb2RlKCdVVEYtOCcpICMgYSBzdHJpbmcgd2l0aCBldXJvIHNpZ24gY2hhcmFjdGVyIFUrMjBBQwotICAgICAgICBlLmxlbmd0aC5zaG91bGQgPT0gMQorICAgICAgICBleHBlY3QoZS5sZW5ndGgpLnRvIGVxKDEpCiAKICAgICAgICAgYSA9IFRocmlmdDo6Qnl0ZXMuY29udmVydF90b191dGY4X2J5dGVfYnVmZmVyIGUKLSAgICAgICAgYS5lbmNvZGluZy5zaG91bGQgPT0gRW5jb2Rpbmc6OkJJTkFSWQotICAgICAgICBhLmxlbmd0aC5zaG91bGQgPT0gMwotICAgICAgICBhLnVucGFjaygnQyonKS5zaG91bGQgPT0gWzB4RTIsIDB4ODIsIDB4QUNdCisgICAgICAgIGV4cGVjdChhLmVuY29kaW5nKS50byBlcShFbmNvZGluZzo6QklOQVJZKQorICAgICAgICBleHBlY3QoYS5sZW5ndGgpLnRvIGVxKDMpCisgICAgICAgIGV4cGVjdChhLnVucGFjaygnQyonKSkudG8gZXEoWzB4RTIsIDB4ODIsIDB4QUNdKQogICAgICAgZW5kCiAKICAgICAgIGl0ICdzaG91bGQgY29udmVydCBJU08tODg1OS0xNSBTdHJpbmcgdG8gVVRGLTggYnl0ZSBidWZmZXInIGRvCiAgICAgICAgICMgQXNzdW1wdGlvbnMKICAgICAgICAgZSA9ICJcdTIwQUMiLmVuY29kZSgnSVNPLTg4NTktMTUnKSAjIGEgc3RyaW5nIHdpdGggZXVybyBzaWduIGNoYXJhY3RlciBVKzIwQUMsIHRoZW4gY29udmVydGVkIHRvIElTTy04ODU5LTE1Ci0gICAgICAgIGUubGVuZ3RoLnNob3VsZCA9PSAxCi0gICAgICAgIGUudW5wYWNrKCdDKicpLnNob3VsZCA9PSBbMHhBNF0gIyBldXJvIHNpZ24gaXMgYSBkaWZmZXJlbnQgY29kZSBwb2ludCBpbiBJU08tODg1OS0xNQorICAgICAgICBleHBlY3QoZS5sZW5ndGgpLnRvIGVxKDEpCisgICAgICAgIGV4cGVjdChlLnVucGFjaygnQyonKSkudG8gZXEoWzB4QTRdKSAjIGV1cm8gc2lnbiBpcyBhIGRpZmZlcmVudCBjb2RlIHBvaW50IGluIElTTy04ODU5LTE1CiAKICAgICAgICAgYSA9IFRocmlmdDo6Qnl0ZXMuY29udmVydF90b191dGY4X2J5dGVfYnVmZmVyIGUKLSAgICAgICAgYS5lbmNvZGluZy5zaG91bGQgPT0gRW5jb2Rpbmc6OkJJTkFSWQotICAgICAgICBhLmxlbmd0aC5zaG91bGQgPT0gMwotICAgICAgICBhLnVucGFjaygnQyonKS5zaG91bGQgPT0gWzB4RTIsIDB4ODIsIDB4QUNdCisgICAgICAgIGV4cGVjdChhLmVuY29kaW5nKS50byBlcShFbmNvZGluZzo6QklOQVJZKQorICAgICAgICBleHBlY3QoYS5sZW5ndGgpLnRvIGVxKDMpCisgICAgICAgIGV4cGVjdChhLnVucGFjaygnQyonKSkudG8gZXEoWzB4RTIsIDB4ODIsIDB4QUNdKQogICAgICAgZW5kCiAgICAgZW5kCiAKICAgICBkZXNjcmliZSAnLmNvbnZlcnRfdG9fc3RyaW5nJyBkbwogICAgICAgaXQgJ3Nob3VsZCBjb252ZXJ0IFVURi04IGJ5dGUgYnVmZmVyIHRvIGEgVVRGLTggU3RyaW5nJyBkbwogICAgICAgICBlID0gWzB4RTIsIDB4ODIsIDB4QUNdLnBhY2soIkMqIikKLSAgICAgICAgZS5lbmNvZGluZy5zaG91bGQgPT0gRW5jb2Rpbmc6OkJJTkFSWQorICAgICAgICBleHBlY3QoZS5lbmNvZGluZykudG8gZXEoRW5jb2Rpbmc6OkJJTkFSWSkKICAgICAgICAgYSA9IFRocmlmdDo6Qnl0ZXMuY29udmVydF90b19zdHJpbmcgZQotICAgICAgICBhLmVuY29kaW5nLnNob3VsZCA9PSBFbmNvZGluZzo6VVRGXzgKLSAgICAgICAgYS5zaG91bGQgPT0gIlx1MjBBQyIKKyAgICAgICAgZXhwZWN0KGEuZW5jb2RpbmcpLnRvIGVxKEVuY29kaW5nOjpVVEZfOCkKKyAgICAgICAgZXhwZWN0KGEpLnRvIGVxKCJcdTIwQUMiKQogICAgICAgZW5kCiAgICAgZW5kCiAKQEAgLTEwMiwxNCArMTAyLDE0IEBACiAgICAgZGVzY3JpYmUgJy5lbXB0eV9ieXRlX2J1ZmZlcicgZG8KICAgICAgIGl0ICdzaG91bGQgY3JlYXRlIGFuIGVtcHR5IGJ1ZmZlcicgZG8KICAgICAgICAgYiA9IFRocmlmdDo6Qnl0ZXMuZW1wdHlfYnl0ZV9idWZmZXIKLSAgICAgICAgYi5sZW5ndGguc2hvdWxkID09IDAKKyAgICAgICAgZXhwZWN0KGIubGVuZ3RoKS50byBlcSgwKQogICAgICAgZW5kCiAKICAgICAgIGl0ICdzaG91bGQgY3JlYXRlIGFuIGVtcHR5IGJ1ZmZlciBvZiBnaXZlbiBzaXplJyBkbwogICAgICAgICBiID0gVGhyaWZ0OjpCeXRlcy5lbXB0eV9ieXRlX2J1ZmZlciAyCi0gICAgICAgIGIubGVuZ3RoLnNob3VsZCA9PSAyCi0gICAgICAgIGJbMF0uc2hvdWxkID09IDAKLSAgICAgICAgYlsxXS5zaG91bGQgPT0gMAorICAgICAgICBleHBlY3QoYi5sZW5ndGgpLnRvIGVxKDIpCisgICAgICAgIGV4cGVjdChiWzBdKS50byBlcSgwKQorICAgICAgICBleHBlY3QoYlsxXSkudG8gZXEoMCkKICAgICAgIGVuZAogICAgIGVuZAogCkBAIC0xMTcsMTYgKzExNywxNiBAQAogICAgICAgaXQgJ3Nob3VsZCBiZSBhIG5vLW9wJyBkbwogICAgICAgICBlID0gJ1NUUklORycKICAgICAgICAgYSA9IFRocmlmdDo6Qnl0ZXMuZm9yY2VfYmluYXJ5X2VuY29kaW5nIGUKLSAgICAgICAgYS5zaG91bGQgPT0gZQotICAgICAgICBhLnNob3VsZCBiZShlKQorICAgICAgICBleHBlY3QoYSkudG8gZXEoZSkKKyAgICAgICAgZXhwZWN0KGEpLnRvIGJlKGUpCiAgICAgICBlbmQKICAgICBlbmQKIAogICAgIGRlc2NyaWJlICcuZ2V0X3N0cmluZ19ieXRlJyBkbwogICAgICAgaXQgJ3Nob3VsZCBnZXQgdGhlIGJ5dGUgYXQgaW5kZXgnIGRvCiAgICAgICAgIHMgPSAiXHg0MVx4NDIiCi0gICAgICAgIFRocmlmdDo6Qnl0ZXMuZ2V0X3N0cmluZ19ieXRlKHMsIDApLnNob3VsZCA9PSAweDQxCi0gICAgICAgIFRocmlmdDo6Qnl0ZXMuZ2V0X3N0cmluZ19ieXRlKHMsIDEpLnNob3VsZCA9PSAweDQyCisgICAgICAgIGV4cGVjdChUaHJpZnQ6OkJ5dGVzLmdldF9zdHJpbmdfYnl0ZShzLCAwKSkudG8gZXEoMHg0MSkKKyAgICAgICAgZXhwZWN0KFRocmlmdDo6Qnl0ZXMuZ2V0X3N0cmluZ19ieXRlKHMsIDEpKS50byBlcSgweDQyKQogICAgICAgZW5kCiAgICAgZW5kCiAKQEAgLTEzNCw4ICsxMzQsOCBAQAogICAgICAgaXQgJ3Nob3VsZCBzZXQgYnl0ZSB2YWx1ZSBhdCBpbmRleCcgZG8KICAgICAgICAgcyA9ICJceDQxXHg0MiIKICAgICAgICAgVGhyaWZ0OjpCeXRlcy5zZXRfc3RyaW5nX2J5dGUocywgMCwgMHg0MykKLSAgICAgICAgc1swXS5zaG91bGQgPT0gMHg0MwotICAgICAgICBzLnNob3VsZCA9PSAnQ0InCisgICAgICAgIGV4cGVjdChzWzBdKS50byBlcSgweDQzKQorICAgICAgICBleHBlY3QocykudG8gZXEoJ0NCJykKICAgICAgIGVuZAogICAgIGVuZAogCkBAIC0xNDMsOCArMTQzLDggQEAKICAgICAgIGl0ICdzaG91bGQgYmUgYSBuby1vcCcgZG8KICAgICAgICAgZSA9ICdTVFJJTkcnCiAgICAgICAgIGEgPSBUaHJpZnQ6OkJ5dGVzLmNvbnZlcnRfdG9fdXRmOF9ieXRlX2J1ZmZlciBlCi0gICAgICAgIGEuc2hvdWxkID09IGUKLSAgICAgICAgYS5zaG91bGQgYmUoZSkKKyAgICAgICAgZXhwZWN0KGEpLnRvIGVxKGUpCisgICAgICAgIGV4cGVjdChhKS50byBiZShlKQogICAgICAgZW5kCiAgICAgZW5kCiAKQEAgLTE1Miw4ICsxNTIsOCBAQAogICAgICAgaXQgJ3Nob3VsZCBiZSBhIG5vLW9wJyBkbwogICAgICAgICBlID0gJ1NUUklORycKICAgICAgICAgYSA9IFRocmlmdDo6Qnl0ZXMuY29udmVydF90b19zdHJpbmcgZQotICAgICAgICBhLnNob3VsZCA9PSBlCi0gICAgICAgIGEuc2hvdWxkIGJlKGUpCisgICAgICAgIGV4cGVjdChhKS50byBlcShlKQorICAgICAgICBleHBlY3QoYSkudG8gYmUoZSkKICAgICAgIGVuZAogICAgIGVuZAogICBlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL2NsaWVudF9zcGVjLnJiIGIvbGliL3JiL3NwZWMvY2xpZW50X3NwZWMucmIKaW5kZXggZjhmZmU4YS4uZDVkNGNlZSAxMDA2NDQKLS0tIGEvbGliL3JiL3NwZWMvY2xpZW50X3NwZWMucmIKKysrIGIvbGliL3JiL3NwZWMvY2xpZW50X3NwZWMucmIKQEAgLTI2LDc0ICsyNiw3MyBAQAogICBlbmQKIAogICBiZWZvcmUoOmVhY2gpIGRvCi0gICAgQHByb3QgPSBtb2NrKCJNb2NrUHJvdG9jb2wiKQorICAgIEBwcm90ID0gZG91YmxlKCJNb2NrUHJvdG9jb2wiKQogICAgIEBjbGllbnQgPSBDbGllbnRTcGVjLm5ldyhAcHJvdCkKICAgZW5kCiAKICAgZGVzY3JpYmUgVGhyaWZ0OjpDbGllbnQgZG8KICAgICBpdCAic2hvdWxkIHJlLXVzZSBpcHJvdCBmb3Igb3Byb3QgaWYgbm90IG90aGVyd2lzZSBzcGVjaWZpZWQiIGRvCi0gICAgICBAY2xpZW50Lmluc3RhbmNlX3ZhcmlhYmxlX2dldCg6J0BpcHJvdCcpLnNob3VsZCBlcWwoQHByb3QpCi0gICAgICBAY2xpZW50Lmluc3RhbmNlX3ZhcmlhYmxlX2dldCg6J0BvcHJvdCcpLnNob3VsZCBlcWwoQHByb3QpCisgICAgICBleHBlY3QoQGNsaWVudC5pbnN0YW5jZV92YXJpYWJsZV9nZXQoOidAaXByb3QnKSkudG8gZXFsKEBwcm90KQorICAgICAgZXhwZWN0KEBjbGllbnQuaW5zdGFuY2VfdmFyaWFibGVfZ2V0KDonQG9wcm90JykpLnRvIGVxbChAcHJvdCkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgc2VuZCBhIHRlc3QgbWVzc2FnZSIgZG8KLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9tZXNzYWdlX2JlZ2luKS53aXRoKCd0ZXN0TWVzc2FnZScsIFRocmlmdDo6TWVzc2FnZVR5cGVzOjpDQUxMLCAwKQotICAgICAgbW9ja19hcmdzID0gbW9jaygnIzxUZXN0TWVzc2FnZV9hcmdzOm1vY2s+JykKLSAgICAgIG1vY2tfYXJncy5zaG91bGRfcmVjZWl2ZSg6Zm9vPSkud2l0aCgnZm9vJykKLSAgICAgIG1vY2tfYXJncy5zaG91bGRfcmVjZWl2ZSg6YmFyPSkud2l0aCg0MikKLSAgICAgIG1vY2tfYXJncy5zaG91bGRfcmVjZWl2ZSg6d3JpdGUpLndpdGgoQHByb3QpCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfbWVzc2FnZV9lbmQpCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6dHJhbnMpIGRvCi0gICAgICAgIG1vY2soJ3RyYW5zJykudGFwIGRvIHx0cmFuc3wKLSAgICAgICAgICB0cmFucy5zaG91bGRfcmVjZWl2ZSg6Zmx1c2gpCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX21lc3NhZ2VfYmVnaW4pLndpdGgoJ3Rlc3RNZXNzYWdlJywgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OkNBTEwsIDApCisgICAgICBtb2NrX2FyZ3MgPSBkb3VibGUoJyM8VGVzdE1lc3NhZ2VfYXJnczptb2NrPicpCisgICAgICBleHBlY3QobW9ja19hcmdzKS50byByZWNlaXZlKDpmb289KS53aXRoKCdmb28nKQorICAgICAgZXhwZWN0KG1vY2tfYXJncykudG8gcmVjZWl2ZSg6YmFyPSkud2l0aCg0MikKKyAgICAgIGV4cGVjdChtb2NrX2FyZ3MpLnRvIHJlY2VpdmUoOndyaXRlKS53aXRoKEBwcm90KQorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV9tZXNzYWdlX2VuZCkKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6dHJhbnMpIGRvCisgICAgICAgIGRvdWJsZSgndHJhbnMnKS50YXAgZG8gfHRyYW5zfAorICAgICAgICAgIGV4cGVjdCh0cmFucykudG8gcmVjZWl2ZSg6Zmx1c2gpCiAgICAgICAgIGVuZAogICAgICAgZW5kCi0gICAgICBrbGFzcyA9IHN0dWIoIlRlc3RNZXNzYWdlX2FyZ3MiLCA6bmV3ID0+IG1vY2tfYXJncykKKyAgICAgIGtsYXNzID0gZG91YmxlKCJUZXN0TWVzc2FnZV9hcmdzIiwgOm5ldyA9PiBtb2NrX2FyZ3MpCiAgICAgICBAY2xpZW50LnNlbmRfbWVzc2FnZSgndGVzdE1lc3NhZ2UnLCBrbGFzcywgOmZvbyA9PiAnZm9vJywgOmJhciA9PiA0MikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgaW5jcmVtZW50IHRoZSBzZXF1ZW5jZSBpZCB3aGVuIHNlbmRpbmcgbWVzc2FnZXMiIGRvCi0gICAgICBwZW5kaW5nICJpdCBzZWVtcyBzZXF1ZW5jZSBpZHMgYXJlIGNvbXBsZXRlbHkgaWdub3JlZCByaWdodCBub3ciIGRvCi0gICAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9tZXNzYWdlX2JlZ2luKS53aXRoKCd0ZXN0TWVzc2FnZScsICBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6Q0FMTCwgMCkub3JkZXJlZAotICAgICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfbWVzc2FnZV9iZWdpbikud2l0aCgndGVzdE1lc3NhZ2UyJywgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OkNBTEwsIDEpLm9yZGVyZWQKLSAgICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX21lc3NhZ2VfYmVnaW4pLndpdGgoJ3Rlc3RNZXNzYWdlMycsIFRocmlmdDo6TWVzc2FnZVR5cGVzOjpDQUxMLCAyKS5vcmRlcmVkCi0gICAgICAgIEBwcm90LnN0dWIhKDp3cml0ZV9tZXNzYWdlX2VuZCkKLSAgICAgICAgQHByb3Quc3R1YiEoOnRyYW5zKS5hbmRfcmV0dXJuIG1vY2soInRyYW5zIikuYXNfbnVsbF9vYmplY3QKLSAgICAgICAgQGNsaWVudC5zZW5kX21lc3NhZ2UoJ3Rlc3RNZXNzYWdlJywgbW9jaygiYXJncyBjbGFzcyIpLmFzX251bGxfb2JqZWN0KQotICAgICAgICBAY2xpZW50LnNlbmRfbWVzc2FnZSgndGVzdE1lc3NhZ2UyJywgbW9jaygiYXJncyBjbGFzcyIpLmFzX251bGxfb2JqZWN0KQotICAgICAgICBAY2xpZW50LnNlbmRfbWVzc2FnZSgndGVzdE1lc3NhZ2UzJywgbW9jaygiYXJncyBjbGFzcyIpLmFzX251bGxfb2JqZWN0KQotICAgICAgZW5kCisgICAgICBwZW5kaW5nICJpdCBzZWVtcyBzZXF1ZW5jZSBpZHMgYXJlIGNvbXBsZXRlbHkgaWdub3JlZCByaWdodCBub3ciCisgICAgICBAcHJvdC5leHBlY3QoOndyaXRlX21lc3NhZ2VfYmVnaW4pLndpdGgoJ3Rlc3RNZXNzYWdlJywgIFRocmlmdDo6TWVzc2FnZVR5cGVzOjpDQUxMLCAwKS5vcmRlcmVkCisgICAgICBAcHJvdC5leHBlY3QoOndyaXRlX21lc3NhZ2VfYmVnaW4pLndpdGgoJ3Rlc3RNZXNzYWdlMicsIFRocmlmdDo6TWVzc2FnZVR5cGVzOjpDQUxMLCAxKS5vcmRlcmVkCisgICAgICBAcHJvdC5leHBlY3QoOndyaXRlX21lc3NhZ2VfYmVnaW4pLndpdGgoJ3Rlc3RNZXNzYWdlMycsIFRocmlmdDo6TWVzc2FnZVR5cGVzOjpDQUxMLCAyKS5vcmRlcmVkCisgICAgICBAcHJvdC5zdHViISg6d3JpdGVfbWVzc2FnZV9lbmQpCisgICAgICBAcHJvdC5zdHViISg6dHJhbnMpLmFuZF9yZXR1cm4gZG91YmxlKCJ0cmFucyIpLmFzX251bGxfb2JqZWN0CisgICAgICBAY2xpZW50LnNlbmRfbWVzc2FnZSgndGVzdE1lc3NhZ2UnLCBkb3VibGUoImFyZ3MgY2xhc3MiKS5hc19udWxsX29iamVjdCkKKyAgICAgIEBjbGllbnQuc2VuZF9tZXNzYWdlKCd0ZXN0TWVzc2FnZTInLCBkb3VibGUoImFyZ3MgY2xhc3MiKS5hc19udWxsX29iamVjdCkKKyAgICAgIEBjbGllbnQuc2VuZF9tZXNzYWdlKCd0ZXN0TWVzc2FnZTMnLCBkb3VibGUoImFyZ3MgY2xhc3MiKS5hc19udWxsX29iamVjdCkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmVjZWl2ZSBhIHRlc3QgbWVzc2FnZSIgZG8KLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX21lc3NhZ2VfYmVnaW4pLmFuZF9yZXR1cm4gW25pbCwgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OkNBTEwsIDBdCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9tZXNzYWdlX2VuZCkKLSAgICAgIG1vY2tfa2xhc3MgPSBtb2NrKCIjPE1vY2tDbGFzczptb2NrPiIpCi0gICAgICBtb2NrX2tsYXNzLnNob3VsZF9yZWNlaXZlKDpyZWFkKS53aXRoKEBwcm90KQotICAgICAgQGNsaWVudC5yZWNlaXZlX21lc3NhZ2Uoc3R1YigiTW9ja0NsYXNzIiwgOm5ldyA9PiBtb2NrX2tsYXNzKSkKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9tZXNzYWdlX2JlZ2luKS5hbmRfcmV0dXJuIFtuaWwsIFRocmlmdDo6TWVzc2FnZVR5cGVzOjpDQUxMLCAwXQorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX21lc3NhZ2VfZW5kKQorICAgICAgbW9ja19rbGFzcyA9IGRvdWJsZSgiIzxNb2NrQ2xhc3M6bW9jaz4iKQorICAgICAgZXhwZWN0KG1vY2tfa2xhc3MpLnRvIHJlY2VpdmUoOnJlYWQpLndpdGgoQHByb3QpCisgICAgICBAY2xpZW50LnJlY2VpdmVfbWVzc2FnZShkb3VibGUoIk1vY2tDbGFzcyIsIDpuZXcgPT4gbW9ja19rbGFzcykpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGhhbmRsZSByZWNlaXZlZCBleGNlcHRpb25zIiBkbwotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfbWVzc2FnZV9iZWdpbikuYW5kX3JldHVybiBbbmlsLCBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6RVhDRVBUSU9OLCAwXQotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfbWVzc2FnZV9lbmQpCi0gICAgICBUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uLnNob3VsZF9yZWNlaXZlKDpuZXcpLmFuZF9yZXR1cm4gZG8KKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9tZXNzYWdlX2JlZ2luKS5hbmRfcmV0dXJuIFtuaWwsIFRocmlmdDo6TWVzc2FnZVR5cGVzOjpFWENFUFRJT04sIDBdCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfbWVzc2FnZV9lbmQpCisgICAgICBleHBlY3QoVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbikudG8gcmVjZWl2ZSg6bmV3KSBkbwogICAgICAgICBTdGFuZGFyZEVycm9yLm5ldy50YXAgZG8gfG1vY2tfZXhjfAotICAgICAgICAgIG1vY2tfZXhjLnNob3VsZF9yZWNlaXZlKDpyZWFkKS53aXRoKEBwcm90KQorICAgICAgICAgIGV4cGVjdChtb2NrX2V4YykudG8gcmVjZWl2ZSg6cmVhZCkud2l0aChAcHJvdCkKICAgICAgICAgZW5kCiAgICAgICBlbmQKLSAgICAgIGxhbWJkYSB7IEBjbGllbnQucmVjZWl2ZV9tZXNzYWdlKG5pbCkgfS5zaG91bGQgcmFpc2VfZXJyb3IoU3RhbmRhcmRFcnJvcikKKyAgICAgIGV4cGVjdCB7IEBjbGllbnQucmVjZWl2ZV9tZXNzYWdlKG5pbCkgfS50byByYWlzZV9lcnJvcihTdGFuZGFyZEVycm9yKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBjbG9zZSB0aGUgdHJhbnNwb3J0IGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBzZW5kaW5nIGEgbWVzc2FnZSIgZG8KLSAgICAgIEBwcm90LnN0dWIhKDp3cml0ZV9tZXNzYWdlX2JlZ2luKQotICAgICAgQHByb3Quc2hvdWxkX25vdF9yZWNlaXZlKDp3cml0ZV9tZXNzYWdlX2VuZCkKLSAgICAgIG1vY2tfYXJncyA9IG1vY2soIiM8VGVzdE1lc3NhZ2VfYXJnczptb2NrPiIpCi0gICAgICBtb2NrX2FyZ3Muc2hvdWxkX3JlY2VpdmUoOndyaXRlKS53aXRoKEBwcm90KS5hbmRfcmFpc2UoU3RhbmRhcmRFcnJvcikKLSAgICAgIHRyYW5zID0gbW9jaygiTW9ja1RyYW5zcG9ydCIpCi0gICAgICBAcHJvdC5zdHViISg6dHJhbnMpLmFuZF9yZXR1cm4odHJhbnMpCi0gICAgICB0cmFucy5zaG91bGRfcmVjZWl2ZSg6Y2xvc2UpCi0gICAgICBrbGFzcyA9IG1vY2soIlRlc3RNZXNzYWdlX2FyZ3MiLCA6bmV3ID0+IG1vY2tfYXJncykKLSAgICAgIGxhbWJkYSB7IEBjbGllbnQuc2VuZF9tZXNzYWdlKCJ0ZXN0TWVzc2FnZSIsIGtsYXNzKSB9LnNob3VsZCByYWlzZV9lcnJvcihTdGFuZGFyZEVycm9yKQorICAgICAgYWxsb3coQHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX21lc3NhZ2VfYmVnaW4pCisgICAgICBleHBlY3QoQHByb3QpLm5vdF90byByZWNlaXZlKDp3cml0ZV9tZXNzYWdlX2VuZCkKKyAgICAgIG1vY2tfYXJncyA9IGRvdWJsZSgiIzxUZXN0TWVzc2FnZV9hcmdzOm1vY2s+IikKKyAgICAgIGV4cGVjdChtb2NrX2FyZ3MpLnRvIHJlY2VpdmUoOndyaXRlKS53aXRoKEBwcm90KS5hbmRfcmFpc2UoU3RhbmRhcmRFcnJvcikKKyAgICAgIHRyYW5zID0gZG91YmxlKCJNb2NrVHJhbnNwb3J0IikKKyAgICAgIGFsbG93KEBwcm90KS50byByZWNlaXZlKDp0cmFucykuYW5kX3JldHVybih0cmFucykKKyAgICAgIGV4cGVjdCh0cmFucykudG8gcmVjZWl2ZSg6Y2xvc2UpCisgICAgICBrbGFzcyA9IGRvdWJsZSgiVGVzdE1lc3NhZ2VfYXJncyIsIDpuZXcgPT4gbW9ja19hcmdzKQorICAgICAgZXhwZWN0IHsgQGNsaWVudC5zZW5kX21lc3NhZ2UoInRlc3RNZXNzYWdlIiwga2xhc3MpIH0udG8gcmFpc2VfZXJyb3IoU3RhbmRhcmRFcnJvcikKICAgICBlbmQKICAgZW5kCiBlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL2NvbXBhY3RfcHJvdG9jb2xfc3BlYy5yYiBiL2xpYi9yYi9zcGVjL2NvbXBhY3RfcHJvdG9jb2xfc3BlYy5yYgppbmRleCBkYWFkNTgzLi41MTNkZDY5IDEwMDY0NAotLS0gYS9saWIvcmIvc3BlYy9jb21wYWN0X3Byb3RvY29sX3NwZWMucmIKKysrIGIvbGliL3JiL3NwZWMvY29tcGFjdF9wcm90b2NvbF9zcGVjLnJiCkBAIC00Miw3ICs0Miw3IEBACiAgICAgICAgIHByb3RvLnNlbmQod3JpdGVyKHByaW1pdGl2ZV90eXBlKSwgdmFsdWUpCiAgICAgICAgICMgcHV0cyAiYnVmOiAje3RyYW5zLmluc3BlY3RfYnVmZmVyfSIgaWYgcHJpbWl0aXZlX3R5cGUgPT0gOmk2NAogICAgICAgICByZWFkX2JhY2sgPSBwcm90by5zZW5kKHJlYWRlcihwcmltaXRpdmVfdHlwZSkpCi0gICAgICAgIHJlYWRfYmFjay5zaG91bGQgPT0gdmFsdWUKKyAgICAgICAgZXhwZWN0KHJlYWRfYmFjaykudG8gZXEodmFsdWUpCiAgICAgICBlbmQKICAgICBlbmQKICAgZW5kCkBAIC02MiwxMCArNjIsMTAgQEAKIAogICAgICAgICBwcm90byA9IFRocmlmdDo6Q29tcGFjdFByb3RvY29sLm5ldyh0cmFucykKICAgICAgICAgbmFtZSwgdHlwZSwgaWQgPSBwcm90by5yZWFkX2ZpZWxkX2JlZ2luCi0gICAgICAgIHR5cGUuc2hvdWxkID09IHRocmlmdF90eXBlCi0gICAgICAgIGlkLnNob3VsZCA9PSAxNQorICAgICAgICBleHBlY3QodHlwZSkudG8gZXEodGhyaWZ0X3R5cGUpCisgICAgICAgIGV4cGVjdChpZCkudG8gZXEoMTUpCiAgICAgICAgIHJlYWRfYmFjayA9IHByb3RvLnNlbmQocmVhZGVyKHByaW1pdGl2ZV90eXBlKSkKLSAgICAgICAgcmVhZF9iYWNrLnNob3VsZCA9PSB2YWx1ZQorICAgICAgICBleHBlY3QocmVhZF9iYWNrKS50byBlcSh2YWx1ZSkKICAgICAgICAgcHJvdG8ucmVhZF9maWVsZF9lbmQKICAgICAgIGVuZAogICAgIGVuZApAQCAtNzUsMTMgKzc1LDEzIEBACiAgICAgdHJhbnMgPSBUaHJpZnQ6Ok1lbW9yeUJ1ZmZlclRyYW5zcG9ydC5uZXcKICAgICBwcm90byA9IFRocmlmdDo6Q29tcGFjdFByb3RvY29sLm5ldyh0cmFucykKIAotICAgIHN0cnVjdCA9IENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QubmV3CisgICAgc3RydWN0ID0gVGhyaWZ0OjpUZXN0OjpDb21wYWN0UHJvdG9UZXN0U3RydWN0Lm5ldwogICAgICMgc2V0cyBhbmQgbWFwcyBkb24ndCBoYXNoIHdlbGwuLi4gbm90IHN1cmUgd2hhdCB0byBkbyBoZXJlLgogICAgIHN0cnVjdC53cml0ZShwcm90bykKIAotICAgIHN0cnVjdDIgPSBDb21wYWN0UHJvdG9UZXN0U3RydWN0Lm5ldworICAgIHN0cnVjdDIgPSBUaHJpZnQ6OlRlc3Q6OkNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QubmV3CiAgICAgc3RydWN0Mi5yZWFkKHByb3RvKSAgICAKLSAgICBzdHJ1Y3QyLnNob3VsZCA9PSBzdHJ1Y3QKKyAgICBleHBlY3Qoc3RydWN0MikudG8gZXEoc3RydWN0KQogICBlbmQKIAogICBpdCAic2hvdWxkIG1ha2UgbWV0aG9kIGNhbGxzIGNvcnJlY3RseSIgZG8KQEAgLTkxLDE5ICs5MSwxOSBAQAogICAgIGNsaWVudF9pbl90cmFucyA9IFRocmlmdDo6TWVtb3J5QnVmZmVyVHJhbnNwb3J0Lm5ldwogICAgIGNsaWVudF9pbl9wcm90byA9IFRocmlmdDo6Q29tcGFjdFByb3RvY29sLm5ldyhjbGllbnRfaW5fdHJhbnMpCiAKLSAgICBwcm9jZXNzb3IgPSBTcnY6OlByb2Nlc3Nvci5uZXcoSmFua3lIYW5kbGVyLm5ldykKKyAgICBwcm9jZXNzb3IgPSBUaHJpZnQ6OlRlc3Q6OlNydjo6UHJvY2Vzc29yLm5ldyhKYW5reUhhbmRsZXIubmV3KQogCi0gICAgY2xpZW50ID0gU3J2OjpDbGllbnQubmV3KGNsaWVudF9pbl9wcm90bywgY2xpZW50X291dF9wcm90bykKKyAgICBjbGllbnQgPSBUaHJpZnQ6OlRlc3Q6OlNydjo6Q2xpZW50Lm5ldyhjbGllbnRfaW5fcHJvdG8sIGNsaWVudF9vdXRfcHJvdG8pCiAgICAgY2xpZW50LnNlbmRfSmFua3koMSkKICAgICAjIHB1dHMgY2xpZW50X291dF90cmFucy5pbnNwZWN0X2J1ZmZlcgogICAgIHByb2Nlc3Nvci5wcm9jZXNzKGNsaWVudF9vdXRfcHJvdG8sIGNsaWVudF9pbl9wcm90bykKLSAgICBjbGllbnQucmVjdl9KYW5reS5zaG91bGQgPT0gMgorICAgIGV4cGVjdChjbGllbnQucmVjdl9KYW5reSkudG8gZXEoMikKICAgZW5kCiAgIAogICBpdCAic2hvdWxkIGRlYWwgd2l0aCBmaWVsZHMgZm9sbG93aW5nIGZpZWxkcyB0aGF0IGhhdmUgbm9uLWRlbHRhIGlkcyIgZG8KLSAgICBicmNwID0gQnJlYWtzUnVieUNvbXBhY3RQcm90b2NvbC5uZXcoCisgICAgYnJjcCA9IFRocmlmdDo6VGVzdDo6QnJlYWtzUnVieUNvbXBhY3RQcm90b2NvbC5uZXcoCiAgICAgICA6ZmllbGQxID0+ICJibGFoIiwgCi0gICAgICA6ZmllbGQyID0+IEJpZ0ZpZWxkSWRTdHJ1Y3QubmV3KAorICAgICAgOmZpZWxkMiA9PiBUaHJpZnQ6OlRlc3Q6OkJpZ0ZpZWxkSWRTdHJ1Y3QubmV3KAogICAgICAgICA6ZmllbGQxID0+ICJzdHJpbmcxIiwgCiAgICAgICAgIDpmaWVsZDIgPT4gInN0cmluZzIiKSwgCiAgICAgICA6ZmllbGQzID0+IDMpCkBAIC0xMTEsMjAgKzExMSwyNSBAQAogICAgIGJ5dGVzID0gc2VyLnNlcmlhbGl6ZShicmNwKQogCiAgICAgZGVzZXIgPSBUaHJpZnQ6OkRlc2VyaWFsaXplci5uZXcoVGhyaWZ0OjpDb21wYWN0UHJvdG9jb2xGYWN0b3J5Lm5ldykKLSAgICBicmNwMiA9IEJyZWFrc1J1YnlDb21wYWN0UHJvdG9jb2wubmV3CisgICAgYnJjcDIgPSBUaHJpZnQ6OlRlc3Q6OkJyZWFrc1J1YnlDb21wYWN0UHJvdG9jb2wubmV3CiAgICAgZGVzZXIuZGVzZXJpYWxpemUoYnJjcDIsIGJ5dGVzKQotICAgIGJyY3AyLnNob3VsZCA9PSBicmNwCisgICAgZXhwZWN0KGJyY3AyKS50byBlcShicmNwKQogICBlbmQKICAgCiAgIGl0ICJzaG91bGQgZGVzZXJpYWxpemUgYW4gZW1wdHkgbWFwIHRvIGFuIGVtcHR5IGhhc2giIGRvCi0gICAgc3RydWN0ID0gU2luZ2xlTWFwVGVzdFN0cnVjdC5uZXcoOmkzMl9tYXAgPT4ge30pCisgICAgc3RydWN0ID0gVGhyaWZ0OjpUZXN0OjpTaW5nbGVNYXBUZXN0U3RydWN0Lm5ldyg6aTMyX21hcCA9PiB7fSkKICAgICBzZXIgPSBUaHJpZnQ6OlNlcmlhbGl6ZXIubmV3KFRocmlmdDo6Q29tcGFjdFByb3RvY29sRmFjdG9yeS5uZXcpCiAgICAgYnl0ZXMgPSBzZXIuc2VyaWFsaXplKHN0cnVjdCkKIAogICAgIGRlc2VyID0gVGhyaWZ0OjpEZXNlcmlhbGl6ZXIubmV3KFRocmlmdDo6Q29tcGFjdFByb3RvY29sRmFjdG9yeS5uZXcpCi0gICAgc3RydWN0MiA9IFNpbmdsZU1hcFRlc3RTdHJ1Y3QubmV3CisgICAgc3RydWN0MiA9IFRocmlmdDo6VGVzdDo6U2luZ2xlTWFwVGVzdFN0cnVjdC5uZXcKICAgICBkZXNlci5kZXNlcmlhbGl6ZShzdHJ1Y3QyLCBieXRlcykKLSAgICBzdHJ1Y3Quc2hvdWxkID09IHN0cnVjdDIKKyAgICBleHBlY3Qoc3RydWN0KS50byBlcShzdHJ1Y3QyKQorICBlbmQKKyAgCisgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHJlYXNvbmFibGUgdG9fcyIgZG8KKyAgICB0cmFucyA9IFRocmlmdDo6TWVtb3J5QnVmZmVyVHJhbnNwb3J0Lm5ldworICAgIGV4cGVjdChUaHJpZnQ6OkNvbXBhY3RQcm90b2NvbC5uZXcodHJhbnMpLnRvX3MpLnRvIGVxKCJjb21wYWN0KG1lbW9yeSkiKQogICBlbmQKICAgCiAgIGNsYXNzIEphbmt5SGFuZGxlcgpAQCAtMTQxLDMgKzE0NiwxMyBAQAogICAgICJyZWFkXyN7c3ltLnRvX3N9IgogICBlbmQKIGVuZAorCitkZXNjcmliZSBUaHJpZnQ6OkNvbXBhY3RQcm90b2NvbEZhY3RvcnkgZG8KKyAgaXQgInNob3VsZCBjcmVhdGUgYSBDb21wYWN0UHJvdG9jb2wiIGRvCisgICAgZXhwZWN0KFRocmlmdDo6Q29tcGFjdFByb3RvY29sRmFjdG9yeS5uZXcuZ2V0X3Byb3RvY29sKGRvdWJsZSgiTW9ja1RyYW5zcG9ydCIpKSkudG8gYmVfaW5zdGFuY2Vfb2YoVGhyaWZ0OjpDb21wYWN0UHJvdG9jb2wpCisgIGVuZAorCisgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHJlYXNvbmFibGUgdG9fcyIgZG8KKyAgICBleHBlY3QoVGhyaWZ0OjpDb21wYWN0UHJvdG9jb2xGYWN0b3J5Lm5ldy50b19zKS50byBlcSgiY29tcGFjdCIpCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9leGNlcHRpb25fc3BlYy5yYiBiL2xpYi9yYi9zcGVjL2V4Y2VwdGlvbl9zcGVjLnJiCmluZGV4IGQxZGE2MjEuLjM3OWFlNjkgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9zcGVjL2V4Y2VwdGlvbl9zcGVjLnJiCisrKyBiL2xpYi9yYi9zcGVjL2V4Y2VwdGlvbl9zcGVjLnJiCkBAIC0yNCwxMDcgKzI0LDEwNyBAQAogICBkZXNjcmliZSBUaHJpZnQ6OkV4Y2VwdGlvbiBkbwogICAgIGl0ICJzaG91bGQgaGF2ZSBhbiBhY2Nlc3NpYmxlIG1lc3NhZ2UiIGRvCiAgICAgICBlID0gVGhyaWZ0OjpFeGNlcHRpb24ubmV3KCJ0ZXN0IG1lc3NhZ2UiKQotICAgICAgZS5tZXNzYWdlLnNob3VsZCA9PSAidGVzdCBtZXNzYWdlIgorICAgICAgZXhwZWN0KGUubWVzc2FnZSkudG8gZXEoInRlc3QgbWVzc2FnZSIpCiAgICAgZW5kCiAgIGVuZAogCiAgIGRlc2NyaWJlIFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb24gZG8KICAgICBpdCAic2hvdWxkIGluaGVyaXQgZnJvbSBUaHJpZnQ6OkV4Y2VwdGlvbiIgZG8KLSAgICAgIFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb24uc3VwZXJjbGFzcy5zaG91bGQgPT0gVGhyaWZ0OjpFeGNlcHRpb24KKyAgICAgIGV4cGVjdChUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uLnN1cGVyY2xhc3MpLnRvIGVxKFRocmlmdDo6RXhjZXB0aW9uKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBoYXZlIGFuIGFjY2Vzc2libGUgdHlwZSBhbmQgbWVzc2FnZSIgZG8KICAgICAgIGUgPSBUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uLm5ldwotICAgICAgZS50eXBlLnNob3VsZCA9PSBUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uOjpVTktOT1dOCi0gICAgICBlLm1lc3NhZ2Uuc2hvdWxkIGJlX25pbAorICAgICAgZXhwZWN0KGUudHlwZSkudG8gZXEoVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6VU5LTk9XTikKKyAgICAgIGV4cGVjdChlLm1lc3NhZ2UpLnRvIGJlX25pbAogICAgICAgZSA9IFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb24ubmV3KFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb246OlVOS05PV05fTUVUSE9ELCAidGVzdCBtZXNzYWdlIikKLSAgICAgIGUudHlwZS5zaG91bGQgPT0gVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6VU5LTk9XTl9NRVRIT0QKLSAgICAgIGUubWVzc2FnZS5zaG91bGQgPT0gInRlc3QgbWVzc2FnZSIKKyAgICAgIGV4cGVjdChlLnR5cGUpLnRvIGVxKFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb246OlVOS05PV05fTUVUSE9EKQorICAgICAgZXhwZWN0KGUubWVzc2FnZSkudG8gZXEoInRlc3QgbWVzc2FnZSIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJlYWQgYSBzdHJ1Y3Qgb2ZmIG9mIGEgcHJvdG9jb2wiIGRvCi0gICAgICBwcm90ID0gbW9jaygiTW9ja1Byb3RvY29sIikKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfc3RydWN0X2JlZ2luKS5vcmRlcmVkCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2ZpZWxkX2JlZ2luKS5leGFjdGx5KDMpLnRpbWVzLmFuZF9yZXR1cm4oCisgICAgICBwcm90ID0gZG91YmxlKCJNb2NrUHJvdG9jb2wiKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfc3RydWN0X2JlZ2luKS5vcmRlcmVkCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9maWVsZF9iZWdpbikuZXhhY3RseSgzKS50aW1lcy5hbmRfcmV0dXJuKAogICAgICAgICBbIm1lc3NhZ2UiLCBUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDFdLAogICAgICAgICBbInR5cGUiLCBUaHJpZnQ6OlR5cGVzOjpJMzIsIDJdLAogICAgICAgICBbbmlsLCBUaHJpZnQ6OlR5cGVzOjpTVE9QLCAwXQogICAgICAgKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9zdHJpbmcpLm9yZGVyZWQuYW5kX3JldHVybiAidGVzdCBtZXNzYWdlIgotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9pMzIpLm9yZGVyZWQuYW5kX3JldHVybiBUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uOjpCQURfU0VRVUVOQ0VfSUQKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfZmllbGRfZW5kKS5leGFjdGx5KDIpLnRpbWVzCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX3N0cnVjdF9lbmQpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX3N0cmluZykub3JkZXJlZC5hbmRfcmV0dXJuICJ0ZXN0IG1lc3NhZ2UiCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9pMzIpLm9yZGVyZWQuYW5kX3JldHVybiBUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uOjpCQURfU0VRVUVOQ0VfSUQKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX2ZpZWxkX2VuZCkuZXhhY3RseSgyKS50aW1lcworICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfc3RydWN0X2VuZCkub3JkZXJlZAogCiAgICAgICBlID0gVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbi5uZXcKICAgICAgIGUucmVhZChwcm90KQotICAgICAgZS5tZXNzYWdlLnNob3VsZCA9PSAidGVzdCBtZXNzYWdlIgotICAgICAgZS50eXBlLnNob3VsZCA9PSBUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uOjpCQURfU0VRVUVOQ0VfSUQKKyAgICAgIGV4cGVjdChlLm1lc3NhZ2UpLnRvIGVxKCJ0ZXN0IG1lc3NhZ2UiKQorICAgICAgZXhwZWN0KGUudHlwZSkudG8gZXEoVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6QkFEX1NFUVVFTkNFX0lEKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBza2lwIGJhZCBmaWVsZHMgd2hlbiByZWFkaW5nIGEgc3RydWN0IiBkbwotICAgICAgcHJvdCA9IG1vY2soIk1vY2tQcm90b2NvbCIpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX3N0cnVjdF9iZWdpbikub3JkZXJlZAotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9maWVsZF9iZWdpbikuZXhhY3RseSg1KS50aW1lcy5hbmRfcmV0dXJuKAorICAgICAgcHJvdCA9IGRvdWJsZSgiTW9ja1Byb3RvY29sIikKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX3N0cnVjdF9iZWdpbikub3JkZXJlZAorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfZmllbGRfYmVnaW4pLmV4YWN0bHkoNSkudGltZXMuYW5kX3JldHVybigKICAgICAgICAgWyJ0eXBlIiwgVGhyaWZ0OjpUeXBlczo6STMyLCAyXSwKICAgICAgICAgWyJ0eXBlIiwgVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCAyXSwKICAgICAgICAgWyJtZXNzYWdlIiwgVGhyaWZ0OjpUeXBlczo6TUFQLCAxXSwKICAgICAgICAgWyJtZXNzYWdlIiwgVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCAzXSwKICAgICAgICAgW25pbCwgVGhyaWZ0OjpUeXBlczo6U1RPUCwgMF0KICAgICAgICkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfaTMyKS5hbmRfcmV0dXJuIFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb246OklOVkFMSURfTUVTU0FHRV9UWVBFCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpza2lwKS53aXRoKFRocmlmdDo6VHlwZXM6OlNUUklORykudHdpY2UKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnNraXApLndpdGgoVGhyaWZ0OjpUeXBlczo6TUFQKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9maWVsZF9lbmQpLmV4YWN0bHkoNCkudGltZXMKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfc3RydWN0X2VuZCkub3JkZXJlZAorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfaTMyKS5hbmRfcmV0dXJuIFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb246OklOVkFMSURfTUVTU0FHRV9UWVBFCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6c2tpcCkud2l0aChUaHJpZnQ6OlR5cGVzOjpTVFJJTkcpLnR3aWNlCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6c2tpcCkud2l0aChUaHJpZnQ6OlR5cGVzOjpNQVApCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9maWVsZF9lbmQpLmV4YWN0bHkoNCkudGltZXMKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX3N0cnVjdF9lbmQpLm9yZGVyZWQKIAogICAgICAgZSA9IFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb24ubmV3CiAgICAgICBlLnJlYWQocHJvdCkKLSAgICAgIGUubWVzc2FnZS5zaG91bGQgYmVfbmlsCi0gICAgICBlLnR5cGUuc2hvdWxkID09IFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb246OklOVkFMSURfTUVTU0FHRV9UWVBFCisgICAgICBleHBlY3QoZS5tZXNzYWdlKS50byBiZV9uaWwKKyAgICAgIGV4cGVjdChlLnR5cGUpLnRvIGVxKFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb246OklOVkFMSURfTUVTU0FHRV9UWVBFKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCB3cml0ZSBhIFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb24gc3RydWN0IHRvIHRoZSBvcHJvdCIgZG8KLSAgICAgIHByb3QgPSBtb2NrKCJNb2NrUHJvdG9jb2wiKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2JlZ2luKS53aXRoKCJUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uIikub3JkZXJlZAotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoIm1lc3NhZ2UiLCBUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDEpLm9yZGVyZWQKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX3N0cmluZykud2l0aCgidGVzdCBtZXNzYWdlIikub3JkZXJlZAotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoInR5cGUiLCBUaHJpZnQ6OlR5cGVzOjpJMzIsIDIpLm9yZGVyZWQKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2kzMikud2l0aChUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uOjpVTktOT1dOX01FVEhPRCkub3JkZXJlZAotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfZW5kKS50d2ljZQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfc3RvcCkub3JkZXJlZAotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2VuZCkub3JkZXJlZAorICAgICAgcHJvdCA9IGRvdWJsZSgiTW9ja1Byb3RvY29sIikKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfYmVnaW4pLndpdGgoIlRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb24iKS5vcmRlcmVkCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoIm1lc3NhZ2UiLCBUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDEpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9zdHJpbmcpLndpdGgoInRlc3QgbWVzc2FnZSIpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgidHlwZSIsIFRocmlmdDo6VHlwZXM6OkkzMiwgMikub3JkZXJlZAorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2kzMikud2l0aChUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uOjpVTktOT1dOX01FVEhPRCkub3JkZXJlZAorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2VuZCkudHdpY2UKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9zdG9wKS5vcmRlcmVkCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2VuZCkub3JkZXJlZAogCiAgICAgICBlID0gVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbi5uZXcoVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6VU5LTk9XTl9NRVRIT0QsICJ0ZXN0IG1lc3NhZ2UiKQogICAgICAgZS53cml0ZShwcm90KQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBza2lwIG5pbCBmaWVsZHMgd2hlbiB3cml0aW5nIHRvIHRoZSBvcHJvdCIgZG8KLSAgICAgIHByb3QgPSBtb2NrKCJNb2NrUHJvdG9jb2wiKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2JlZ2luKS53aXRoKCJUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uIikub3JkZXJlZAotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoIm1lc3NhZ2UiLCBUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDEpLm9yZGVyZWQKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX3N0cmluZykud2l0aCgidGVzdCBtZXNzYWdlIikub3JkZXJlZAotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfZW5kKS5vcmRlcmVkCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9zdG9wKS5vcmRlcmVkCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfZW5kKS5vcmRlcmVkCisgICAgICBwcm90ID0gZG91YmxlKCJNb2NrUHJvdG9jb2wiKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3N0cnVjdF9iZWdpbikud2l0aCgiVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgibWVzc2FnZSIsIFRocmlmdDo6VHlwZXM6OlNUUklORywgMSkub3JkZXJlZAorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3N0cmluZykud2l0aCgidGVzdCBtZXNzYWdlIikub3JkZXJlZAorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2VuZCkub3JkZXJlZAorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX3N0b3ApLm9yZGVyZWQKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfZW5kKS5vcmRlcmVkCiAKICAgICAgIGUgPSBUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uLm5ldyhuaWwsICJ0ZXN0IG1lc3NhZ2UiKQogICAgICAgZS53cml0ZShwcm90KQogCi0gICAgICBwcm90ID0gbW9jaygiTW9ja1Byb3RvY29sIikKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX3N0cnVjdF9iZWdpbikud2l0aCgiVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpLm9yZGVyZWQKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCJ0eXBlIiwgVGhyaWZ0OjpUeXBlczo6STMyLCAyKS5vcmRlcmVkCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9pMzIpLndpdGgoVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6QkFEX1NFUVVFTkNFX0lEKS5vcmRlcmVkCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9lbmQpLm9yZGVyZWQKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX3N0b3ApLm9yZGVyZWQKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX3N0cnVjdF9lbmQpLm9yZGVyZWQKKyAgICAgIHByb3QgPSBkb3VibGUoIk1vY2tQcm90b2NvbCIpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2JlZ2luKS53aXRoKCJUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uIikub3JkZXJlZAorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCJ0eXBlIiwgVGhyaWZ0OjpUeXBlczo6STMyLCAyKS5vcmRlcmVkCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfaTMyKS53aXRoKFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb246OkJBRF9TRVFVRU5DRV9JRCkub3JkZXJlZAorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2VuZCkub3JkZXJlZAorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX3N0b3ApLm9yZGVyZWQKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfZW5kKS5vcmRlcmVkCiAKICAgICAgIGUgPSBUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uLm5ldyhUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uOjpCQURfU0VRVUVOQ0VfSUQpCiAgICAgICBlLndyaXRlKHByb3QpCiAKLSAgICAgIHByb3QgPSBtb2NrKCJNb2NrUHJvdG9jb2wiKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2JlZ2luKS53aXRoKCJUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uIikub3JkZXJlZAotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfc3RvcCkub3JkZXJlZAotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2VuZCkub3JkZXJlZAorICAgICAgcHJvdCA9IGRvdWJsZSgiTW9ja1Byb3RvY29sIikKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfYmVnaW4pLndpdGgoIlRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb24iKS5vcmRlcmVkCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfc3RvcCkub3JkZXJlZAorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3N0cnVjdF9lbmQpLm9yZGVyZWQKIAogICAgICAgZSA9IFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb24ubmV3KG5pbCkKICAgICAgIGUud3JpdGUocHJvdCkKQEAgLTEzNCw4ICsxMzQsOCBAQAogICBkZXNjcmliZSBUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uIGRvCiAgICAgaXQgInNob3VsZCBoYXZlIGFuIGFjY2Vzc2libGUgdHlwZSIgZG8KICAgICAgIHByb3QgPSBUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uLm5ldyhUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uOjpTSVpFX0xJTUlULCAibWVzc2FnZSIpCi0gICAgICBwcm90LnR5cGUuc2hvdWxkID09IFRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb246OlNJWkVfTElNSVQKLSAgICAgIHByb3QubWVzc2FnZS5zaG91bGQgPT0gIm1lc3NhZ2UiCisgICAgICBleHBlY3QocHJvdC50eXBlKS50byBlcShUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uOjpTSVpFX0xJTUlUKQorICAgICAgZXhwZWN0KHByb3QubWVzc2FnZSkudG8gZXEoIm1lc3NhZ2UiKQogICAgIGVuZAogICBlbmQKIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvZmxhdF9zcGVjLnJiIGIvbGliL3JiL3NwZWMvZmxhdF9zcGVjLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5MzA1NmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcmIvc3BlYy9mbGF0X3NwZWMucmIKQEAgLTAsMCArMSw2MiBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3JlcXVpcmUgJ3NwZWNfaGVscGVyJworCitkZXNjcmliZSAnZ2VuZXJhdGlvbicgZG8KKyAgYmVmb3JlIGRvCisgICAgcmVxdWlyZSAnbmFtZXNwYWNlZF9ub25ibG9ja2luZ19zZXJ2aWNlJworICBlbmQKKworICBpdCAiZGlkIG5vdCBnZW5lcmF0ZSB0aGUgd3JvbmcgZmlsZXMiIGRvCisgICAgcHJlZml4ID0gRmlsZS5leHBhbmRfcGF0aCgiLi4vZ2VuLXJiL2ZsYXQiLCBfX0ZJTEVfXykKKyAgICBbIm5hbWVzcGFjZWRfc3BlY19uYW1lc3BhY2UvbmFtZXNwYWNlZF9ub25ibG9ja2luZ19zZXJ2aWNlLnJiIiwKKyAgICAgIm5hbWVzcGFjZWRfc3BlY19uYW1lc3BhY2UvdGhyaWZ0X25hbWVzcGFjZWRfc3BlY19jb25zdGFudHMucmIiLAorICAgICAibmFtZXNwYWNlZF9zcGVjX25hbWVzcGFjZS90aHJpZnRfbmFtZXNwYWNlZF9zcGVjX3R5cGVzLnJiIiwKKyAgICAgIm90aGVyX25hbWVzcGFjZS9yZWZlcmVuY2VkX2NvbnN0YW50cy5yYiIsCisgICAgICJvdGhlcl9uYW1lc3BhY2UvcmVmZXJlbmNlZF90eXBlcy5yYiIKKyAgICBdLmVhY2ggZG8gfG5hbWV8CisgICAgICBleHBlY3QoRmlsZS5leGlzdD8oRmlsZS5qb2luKHByZWZpeCwgbmFtZSkpKS5ub3RfdG8gYmVfdHJ1dGh5CisgICAgZW5kCisgIGVuZAorCisgIGl0ICJnZW5lcmF0ZWQgdGhlIHJpZ2h0IGZpbGVzIiBkbworICAgIHByZWZpeCA9IEZpbGUuZXhwYW5kX3BhdGgoIi4uL2dlbi1yYi9mbGF0IiwgX19GSUxFX18pCisgICAgWyJuYW1lc3BhY2VkX25vbmJsb2NraW5nX3NlcnZpY2UucmIiLAorICAgICAidGhyaWZ0X25hbWVzcGFjZWRfc3BlY19jb25zdGFudHMucmIiLAorICAgICAidGhyaWZ0X25hbWVzcGFjZWRfc3BlY190eXBlcy5yYiIsCisgICAgICJyZWZlcmVuY2VkX2NvbnN0YW50cy5yYiIsCisgICAgICJyZWZlcmVuY2VkX3R5cGVzLnJiIgorICAgIF0uZWFjaCBkbyB8bmFtZXwKKyAgICAgIGV4cGVjdChGaWxlLmV4aXN0PyhGaWxlLmpvaW4ocHJlZml4LCBuYW1lKSkpLnRvIGJlX3RydXRoeQorICAgIGVuZAorICBlbmQKKworICBpdCAiaGFzIGEgc2VydmljZSBjbGFzcyBpbiB0aGUgcmlnaHQgcGxhY2UiIGRvCisgICAgZXhwZWN0KGRlZmluZWQ/KE5hbWVzcGFjZWRTcGVjTmFtZXNwYWNlOjpOYW1lc3BhY2VkTm9uYmxvY2tpbmdTZXJ2aWNlKSkudG8gYmVfdHJ1dGh5CisgIGVuZAorCisgIGl0ICJoYXMgYSBzdHJ1Y3QgaW4gdGhlIHJpZ2h0IHBsYWNlIiBkbworICAgIGV4cGVjdChkZWZpbmVkPyhOYW1lc3BhY2VkU3BlY05hbWVzcGFjZTo6SGVsbG8pKS50byBiZV90cnV0aHkKKyAgZW5kCisKKyAgaXQgInJlcXVpcmVkIGFuIGluY2x1ZGVkIGZpbGUiIGRvCisgICAgZXhwZWN0KGRlZmluZWQ/KE90aGVyTmFtZXNwYWNlOjpTb21lRW51bSkpLnRvIGJlX3RydXRoeQorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvaHR0cF9jbGllbnRfc3BlYy5yYiBiL2xpYi9yYi9zcGVjL2h0dHBfY2xpZW50X3NwZWMucmIKaW5kZXggNzkzZmM3My4uZGY0NzJhYiAxMDA2NDQKLS0tIGEvbGliL3JiL3NwZWMvaHR0cF9jbGllbnRfc3BlYy5yYgorKysgYi9saWIvcmIvc3BlYy9odHRwX2NsaWVudF9zcGVjLnJiCkBAIC0yNSwyOCArMjUsMzIgQEAKICAgICBiZWZvcmUoOmVhY2gpIGRvCiAgICAgICBAY2xpZW50ID0gVGhyaWZ0OjpIVFRQQ2xpZW50VHJhbnNwb3J0Lm5ldygiaHR0cDovL215LmRvbWFpbi5jb20vcGF0aC90by9zZXJ2aWNlP3BhcmFtPXZhbHVlIikKICAgICBlbmQKKyAgICAKKyAgICBpdCAic2hvdWxkIHByb3ZpZGUgYSByZWFzb25hYmxlIHRvX3MiIGRvCisgICAgICBAY2xpZW50LnRvX3MgPT0gImh0dHA6Ly9teS5kb21haW4uY29tL3BhdGgvdG8vc2VydmljZT9wYXJhbT12YWx1ZSIKKyAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgYWx3YXlzIGJlIG9wZW4iIGRvCi0gICAgICBAY2xpZW50LnNob3VsZCBiZV9vcGVuCisgICAgICBleHBlY3QoQGNsaWVudCkudG8gYmVfb3BlbgogICAgICAgQGNsaWVudC5jbG9zZQotICAgICAgQGNsaWVudC5zaG91bGQgYmVfb3BlbgorICAgICAgZXhwZWN0KEBjbGllbnQpLnRvIGJlX29wZW4KICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcG9zdCB2aWEgSFRUUCBhbmQgcmV0dXJuIHRoZSByZXN1bHRzIiBkbwogICAgICAgQGNsaWVudC53cml0ZSAiYSB0ZXN0IgogICAgICAgQGNsaWVudC53cml0ZSAiIGZyYW1lIgotICAgICAgTmV0OjpIVFRQLnNob3VsZF9yZWNlaXZlKDpuZXcpLndpdGgoIm15LmRvbWFpbi5jb20iLCA4MCkuYW5kX3JldHVybiBkbwotICAgICAgICBtb2NrKCJOZXQ6OkhUVFAiKS50YXAgZG8gfGh0dHB8Ci0gICAgICAgICAgaHR0cC5zaG91bGRfcmVjZWl2ZSg6dXNlX3NzbD0pLndpdGgoZmFsc2UpCi0gICAgICAgICAgaHR0cC5zaG91bGRfcmVjZWl2ZSg6cG9zdCkud2l0aCgiL3BhdGgvdG8vc2VydmljZT9wYXJhbT12YWx1ZSIsICJhIHRlc3QgZnJhbWUiLCB7IkNvbnRlbnQtVHlwZSI9PiJhcHBsaWNhdGlvbi94LXRocmlmdCJ9KS5hbmRfcmV0dXJuIGRvCi0gICAgICAgICAgICBtb2NrKCJOZXQ6OkhUVFBPSyIpLnRhcCBkbyB8cmVzcG9uc2V8Ci0gICAgICAgICAgICAgIHJlc3BvbnNlLnNob3VsZF9yZWNlaXZlKDpib2R5KS5hbmRfcmV0dXJuICJkYXRhIgorICAgICAgZXhwZWN0KE5ldDo6SFRUUCkudG8gcmVjZWl2ZSg6bmV3KS53aXRoKCJteS5kb21haW4uY29tIiwgODApIGRvCisgICAgICAgIGRvdWJsZSgiTmV0OjpIVFRQIikudGFwIGRvIHxodHRwfAorICAgICAgICAgIGV4cGVjdChodHRwKS50byByZWNlaXZlKDp1c2Vfc3NsPSkud2l0aChmYWxzZSkKKyAgICAgICAgICBleHBlY3QoaHR0cCkudG8gcmVjZWl2ZSg6cG9zdCkud2l0aCgiL3BhdGgvdG8vc2VydmljZT9wYXJhbT12YWx1ZSIsICJhIHRlc3QgZnJhbWUiLCB7IkNvbnRlbnQtVHlwZSI9PiJhcHBsaWNhdGlvbi94LXRocmlmdCJ9KSBkbworICAgICAgICAgICAgZG91YmxlKCJOZXQ6OkhUVFBPSyIpLnRhcCBkbyB8cmVzcG9uc2V8CisgICAgICAgICAgICAgIGV4cGVjdChyZXNwb25zZSkudG8gcmVjZWl2ZSg6Ym9keSkuYW5kX3JldHVybiAiZGF0YSIKICAgICAgICAgICAgIGVuZAogICAgICAgICAgIGVuZAogICAgICAgICBlbmQKICAgICAgIGVuZAogICAgICAgQGNsaWVudC5mbHVzaAotICAgICAgQGNsaWVudC5yZWFkKDEwKS5zaG91bGQgPT0gImRhdGEiCisgICAgICBleHBlY3QoQGNsaWVudC5yZWFkKDEwKSkudG8gZXEoImRhdGEiKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBzZW5kIGN1c3RvbSBoZWFkZXJzIGlmIGRlZmluZWQiIGRvCkBAIC01NSwxOCArNTksMzMgQEAKICAgICAgIGhlYWRlcnMgPSB7IkNvbnRlbnQtVHlwZSI9PiJhcHBsaWNhdGlvbi94LXRocmlmdCJ9Lm1lcmdlKGN1c3RvbV9oZWFkZXJzKQogCiAgICAgICBAY2xpZW50LmFkZF9oZWFkZXJzKGN1c3RvbV9oZWFkZXJzKQotICAgICAgTmV0OjpIVFRQLnNob3VsZF9yZWNlaXZlKDpuZXcpLndpdGgoIm15LmRvbWFpbi5jb20iLCA4MCkuYW5kX3JldHVybiBkbwotICAgICAgICBtb2NrKCJOZXQ6OkhUVFAiKS50YXAgZG8gfGh0dHB8Ci0gICAgICAgICAgaHR0cC5zaG91bGRfcmVjZWl2ZSg6dXNlX3NzbD0pLndpdGgoZmFsc2UpCi0gICAgICAgICAgaHR0cC5zaG91bGRfcmVjZWl2ZSg6cG9zdCkud2l0aCgiL3BhdGgvdG8vc2VydmljZT9wYXJhbT12YWx1ZSIsICJ0ZXN0IiwgaGVhZGVycykuYW5kX3JldHVybiBkbwotICAgICAgICAgICAgbW9jaygiTmV0OjpIVFRQT0siKS50YXAgZG8gfHJlc3BvbnNlfAotICAgICAgICAgICAgICByZXNwb25zZS5zaG91bGRfcmVjZWl2ZSg6Ym9keSkuYW5kX3JldHVybiAiZGF0YSIKKyAgICAgIGV4cGVjdChOZXQ6OkhUVFApLnRvIHJlY2VpdmUoOm5ldykud2l0aCgibXkuZG9tYWluLmNvbSIsIDgwKSBkbworICAgICAgICBkb3VibGUoIk5ldDo6SFRUUCIpLnRhcCBkbyB8aHR0cHwKKyAgICAgICAgICBleHBlY3QoaHR0cCkudG8gcmVjZWl2ZSg6dXNlX3NzbD0pLndpdGgoZmFsc2UpCisgICAgICAgICAgZXhwZWN0KGh0dHApLnRvIHJlY2VpdmUoOnBvc3QpLndpdGgoIi9wYXRoL3RvL3NlcnZpY2U/cGFyYW09dmFsdWUiLCAidGVzdCIsIGhlYWRlcnMpIGRvCisgICAgICAgICAgICBkb3VibGUoIk5ldDo6SFRUUE9LIikudGFwIGRvIHxyZXNwb25zZXwKKyAgICAgICAgICAgICAgZXhwZWN0KHJlc3BvbnNlKS50byByZWNlaXZlKDpib2R5KS5hbmRfcmV0dXJuICJkYXRhIgogICAgICAgICAgICAgZW5kCiAgICAgICAgICAgZW5kCiAgICAgICAgIGVuZAogICAgICAgZW5kCiAgICAgICBAY2xpZW50LmZsdXNoCiAgICAgZW5kCisKKyAgICBpdCAnc2hvdWxkIHJlc2V0IHRoZSBvdXRidWYgb24gSFRUUCBmYWlsdXJlcycgZG8KKyAgICAgIEBjbGllbnQud3JpdGUgInRlc3QiCisKKyAgICAgIGV4cGVjdChOZXQ6OkhUVFApLnRvIHJlY2VpdmUoOm5ldykud2l0aCgibXkuZG9tYWluLmNvbSIsIDgwKSBkbworICAgICAgICBkb3VibGUoIk5ldDo6SFRUUCIpLnRhcCBkbyB8aHR0cHwKKyAgICAgICAgICBleHBlY3QoaHR0cCkudG8gcmVjZWl2ZSg6dXNlX3NzbD0pLndpdGgoZmFsc2UpCisgICAgICAgICAgZXhwZWN0KGh0dHApLnRvIHJlY2VpdmUoOnBvc3QpLndpdGgoIi9wYXRoL3RvL3NlcnZpY2U/cGFyYW09dmFsdWUiLCAidGVzdCIsIHsiQ29udGVudC1UeXBlIj0+ImFwcGxpY2F0aW9uL3gtdGhyaWZ0In0pIHsgcmFpc2UgTmV0OjpSZWFkVGltZW91dCB9CisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIEBjbGllbnQuZmx1c2ggIHJlc2N1ZQorICAgICAgZXhwZWN0KEBjbGllbnQuaW5zdGFuY2VfdmFyaWFibGVfZ2V0KDpAb3V0YnVmKSkudG8gZXEoVGhyaWZ0OjpCeXRlcy5lbXB0eV9ieXRlX2J1ZmZlcikKKyAgICBlbmQKKwogICBlbmQKIAogICBkZXNjcmliZSAnc3NsIGVuYWJsZWQnIGRvCkBAIC04MCwyMCArOTksMjAgQEAKIAogICAgICAgY2xpZW50LndyaXRlICJ0ZXN0IgogCi0gICAgICBOZXQ6OkhUVFAuc2hvdWxkX3JlY2VpdmUoOm5ldykud2l0aCgibXkuZG9tYWluLmNvbSIsIDQ0MykuYW5kX3JldHVybiBkbwotICAgICAgICBtb2NrKCJOZXQ6OkhUVFAiKS50YXAgZG8gfGh0dHB8Ci0gICAgICAgICAgaHR0cC5zaG91bGRfcmVjZWl2ZSg6dXNlX3NzbD0pLndpdGgodHJ1ZSkKLSAgICAgICAgICBodHRwLnNob3VsZF9yZWNlaXZlKDp2ZXJpZnlfbW9kZT0pLndpdGgoT3BlblNTTDo6U1NMOjpWRVJJRllfUEVFUikKLSAgICAgICAgICBodHRwLnNob3VsZF9yZWNlaXZlKDpwb3N0KS53aXRoKEBzZXJ2aWNlX3BhdGgsICJ0ZXN0IiwKLSAgICAgICAgICAgICAgIkNvbnRlbnQtVHlwZSIgPT4gImFwcGxpY2F0aW9uL3gtdGhyaWZ0IikuYW5kX3JldHVybiBkbwotICAgICAgICAgICAgbW9jaygiTmV0OjpIVFRQT0siKS50YXAgZG8gfHJlc3BvbnNlfAotICAgICAgICAgICAgICByZXNwb25zZS5zaG91bGRfcmVjZWl2ZSg6Ym9keSkuYW5kX3JldHVybiAiZGF0YSIKKyAgICAgIGV4cGVjdChOZXQ6OkhUVFApLnRvIHJlY2VpdmUoOm5ldykud2l0aCgibXkuZG9tYWluLmNvbSIsIDQ0MykgZG8KKyAgICAgICAgZG91YmxlKCJOZXQ6OkhUVFAiKS50YXAgZG8gfGh0dHB8CisgICAgICAgICAgZXhwZWN0KGh0dHApLnRvIHJlY2VpdmUoOnVzZV9zc2w9KS53aXRoKHRydWUpCisgICAgICAgICAgZXhwZWN0KGh0dHApLnRvIHJlY2VpdmUoOnZlcmlmeV9tb2RlPSkud2l0aChPcGVuU1NMOjpTU0w6OlZFUklGWV9QRUVSKQorICAgICAgICAgIGV4cGVjdChodHRwKS50byByZWNlaXZlKDpwb3N0KS53aXRoKEBzZXJ2aWNlX3BhdGgsICJ0ZXN0IiwKKyAgICAgICAgICAgICAgIkNvbnRlbnQtVHlwZSIgPT4gImFwcGxpY2F0aW9uL3gtdGhyaWZ0IikgZG8KKyAgICAgICAgICAgIGRvdWJsZSgiTmV0OjpIVFRQT0siKS50YXAgZG8gfHJlc3BvbnNlfAorICAgICAgICAgICAgICBleHBlY3QocmVzcG9uc2UpLnRvIHJlY2VpdmUoOmJvZHkpLmFuZF9yZXR1cm4gImRhdGEiCiAgICAgICAgICAgICBlbmQKICAgICAgICAgICBlbmQKICAgICAgICAgZW5kCiAgICAgICBlbmQKICAgICAgIGNsaWVudC5mbHVzaAotICAgICAgY2xpZW50LnJlYWQoNCkuc2hvdWxkID09ICJkYXRhIgorICAgICAgZXhwZWN0KGNsaWVudC5yZWFkKDQpKS50byBlcSgiZGF0YSIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHNldCBTU0wgdmVyaWZ5IG1vZGUgd2hlbiBzcGVjaWZpZWQiIGRvCkBAIC0xMDEsMjAgKzEyMCwyMCBAQAogICAgICAgICAgIDpzc2xfdmVyaWZ5X21vZGUgPT4gT3BlblNTTDo6U1NMOjpWRVJJRllfTk9ORSkKIAogICAgICAgY2xpZW50LndyaXRlICJ0ZXN0IgotICAgICAgTmV0OjpIVFRQLnNob3VsZF9yZWNlaXZlKDpuZXcpLndpdGgoIm15LmRvbWFpbi5jb20iLCA0NDMpLmFuZF9yZXR1cm4gZG8KLSAgICAgICAgbW9jaygiTmV0OjpIVFRQIikudGFwIGRvIHxodHRwfAotICAgICAgICAgIGh0dHAuc2hvdWxkX3JlY2VpdmUoOnVzZV9zc2w9KS53aXRoKHRydWUpCi0gICAgICAgICAgaHR0cC5zaG91bGRfcmVjZWl2ZSg6dmVyaWZ5X21vZGU9KS53aXRoKE9wZW5TU0w6OlNTTDo6VkVSSUZZX05PTkUpCi0gICAgICAgICAgaHR0cC5zaG91bGRfcmVjZWl2ZSg6cG9zdCkud2l0aChAc2VydmljZV9wYXRoLCAidGVzdCIsCi0gICAgICAgICAgICAgICJDb250ZW50LVR5cGUiID0+ICJhcHBsaWNhdGlvbi94LXRocmlmdCIpLmFuZF9yZXR1cm4gZG8KLSAgICAgICAgICAgIG1vY2soIk5ldDo6SFRUUE9LIikudGFwIGRvIHxyZXNwb25zZXwKLSAgICAgICAgICAgICAgcmVzcG9uc2Uuc2hvdWxkX3JlY2VpdmUoOmJvZHkpLmFuZF9yZXR1cm4gImRhdGEiCisgICAgICBleHBlY3QoTmV0OjpIVFRQKS50byByZWNlaXZlKDpuZXcpLndpdGgoIm15LmRvbWFpbi5jb20iLCA0NDMpIGRvCisgICAgICAgIGRvdWJsZSgiTmV0OjpIVFRQIikudGFwIGRvIHxodHRwfAorICAgICAgICAgIGV4cGVjdChodHRwKS50byByZWNlaXZlKDp1c2Vfc3NsPSkud2l0aCh0cnVlKQorICAgICAgICAgIGV4cGVjdChodHRwKS50byByZWNlaXZlKDp2ZXJpZnlfbW9kZT0pLndpdGgoT3BlblNTTDo6U1NMOjpWRVJJRllfTk9ORSkKKyAgICAgICAgICBleHBlY3QoaHR0cCkudG8gcmVjZWl2ZSg6cG9zdCkud2l0aChAc2VydmljZV9wYXRoLCAidGVzdCIsCisgICAgICAgICAgICAgICJDb250ZW50LVR5cGUiID0+ICJhcHBsaWNhdGlvbi94LXRocmlmdCIpIGRvCisgICAgICAgICAgICBkb3VibGUoIk5ldDo6SFRUUE9LIikudGFwIGRvIHxyZXNwb25zZXwKKyAgICAgICAgICAgICAgZXhwZWN0KHJlc3BvbnNlKS50byByZWNlaXZlKDpib2R5KS5hbmRfcmV0dXJuICJkYXRhIgogICAgICAgICAgICAgZW5kCiAgICAgICAgICAgZW5kCiAgICAgICAgIGVuZAogICAgICAgZW5kCiAgICAgICBjbGllbnQuZmx1c2gKLSAgICAgIGNsaWVudC5yZWFkKDQpLnNob3VsZCA9PSAiZGF0YSIKKyAgICAgIGV4cGVjdChjbGllbnQucmVhZCg0KSkudG8gZXEoImRhdGEiKQogICAgIGVuZAogICBlbmQKIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvanNvbl9wcm90b2NvbF9zcGVjLnJiIGIvbGliL3JiL3NwZWMvanNvbl9wcm90b2NvbF9zcGVjLnJiCmluZGV4IDJmN2YxZTYuLmZlMWFmN2IgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9zcGVjL2pzb25fcHJvdG9jb2xfc3BlYy5yYgorKysgYi9saWIvcmIvc3BlYy9qc29uX3Byb3RvY29sX3NwZWMucmIKQEAgLTMwLDI1MiArMzAsMjU3IEBACiAKICAgICBpdCAic2hvdWxkIHdyaXRlIGpzb24gZXNjYXBlZCBjaGFyIiBkbwogICAgICAgQHByb3Qud3JpdGVfanNvbl9lc2NhcGVfY2hhcigiXG4iKQotICAgICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICdcdTAwMGEnCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCdcdTAwMGEnKQogCiAgICAgICBAcHJvdC53cml0ZV9qc29uX2VzY2FwZV9jaGFyKCIgIikKLSAgICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAnXHUwMDIwJworICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgnXHUwMDIwJykKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgd3JpdGUganNvbiBjaGFyIiBkbwogICAgICAgQHByb3Qud3JpdGVfanNvbl9jaGFyKCJcbiIpCi0gICAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gJ1xcbicKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoJ1xcbicpCiAKICAgICAgIEBwcm90LndyaXRlX2pzb25fY2hhcigiICIpCi0gICAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gJyAnCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCcgJykKIAogICAgICAgQHByb3Qud3JpdGVfanNvbl9jaGFyKCJcXCIpCi0gICAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIlxcXFwiCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJcXFxcIikKIAogICAgICAgQHByb3Qud3JpdGVfanNvbl9jaGFyKCJAIikKLSAgICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAnQCcKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoJ0AnKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCB3cml0ZSBqc29uIHN0cmluZyIgZG8KICAgICAgIEBwcm90LndyaXRlX2pzb25fc3RyaW5nKCJ0aGlzIGlzIGEgXFwganNvblxuc3RyaW5nIikKLSAgICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAiXCJ0aGlzIGlzIGEgXFxcXCBqc29uXFxuc3RyaW5nXCIiCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJcInRoaXMgaXMgYSBcXFxcIGpzb25cXG5zdHJpbmdcIiIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHdyaXRlIGpzb24gYmFzZTY0IiBkbwogICAgICAgQHByb3Qud3JpdGVfanNvbl9iYXNlNjQoInRoaXMgaXMgYSBiYXNlNjQgc3RyaW5nIikKLSAgICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAiXCJcImRHaHBjeUJwY3lCaElHSmhjMlUyTkNCemRISnBibWM9XFxuXCJcIiIKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIlwiZEdocGN5QnBjeUJoSUdKaGMyVTJOQ0J6ZEhKcGJtYz1cIiIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHdyaXRlIGpzb24gaW50ZWdlciIgZG8KICAgICAgIEBwcm90LndyaXRlX2pzb25faW50ZWdlcig0NSkKLSAgICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAiNDUiCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCI0NSIpCiAKICAgICAgIEBwcm90LndyaXRlX2pzb25faW50ZWdlcigzMzAwMCkKLSAgICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAiMzMwMDAiCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCIzMzAwMCIpCiAKICAgICAgIEBwcm90LndyaXRlX2pzb25faW50ZWdlcigzMDAwMDAwMDAwKQotICAgICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICIzMDAwMDAwMDAwIgorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiMzAwMDAwMDAwMCIpCiAKICAgICAgIEBwcm90LndyaXRlX2pzb25faW50ZWdlcig2MDAwMDAwMDAwKQotICAgICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICI2MDAwMDAwMDAwIgorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiNjAwMDAwMDAwMCIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHdyaXRlIGpzb24gZG91YmxlIiBkbwogICAgICAgQHByb3Qud3JpdGVfanNvbl9kb3VibGUoMTIuMykKLSAgICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAiMTIuMyIKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIjEyLjMiKQogCiAgICAgICBAcHJvdC53cml0ZV9qc29uX2RvdWJsZSgtMy4yMSkKLSAgICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAiLTMuMjEiCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCItMy4yMSIpCiAKICAgICAgIEBwcm90LndyaXRlX2pzb25fZG91YmxlKCgoKzEuMC8wLjApLygrMS4wLzAuMCkpKQotICAgICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICJcIk5hTlwiIgorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiXCJOYU5cIiIpCiAKICAgICAgIEBwcm90LndyaXRlX2pzb25fZG91YmxlKCgrMS4wLzAuMCkpCi0gICAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIlwiSW5maW5pdHlcIiIKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIlwiSW5maW5pdHlcIiIpCiAKICAgICAgIEBwcm90LndyaXRlX2pzb25fZG91YmxlKCgtMS4wLzAuMCkpCi0gICAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIlwiLUluZmluaXR5XCIiCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJcIi1JbmZpbml0eVwiIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgd3JpdGUganNvbiBvYmplY3Qgc3RhcnQiIGRvCiAgICAgICBAcHJvdC53cml0ZV9qc29uX29iamVjdF9zdGFydAotICAgICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICJ7IgorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgieyIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHdyaXRlIGpzb24gb2JqZWN0IGVuZCIgZG8KICAgICAgIEBwcm90LndyaXRlX2pzb25fb2JqZWN0X2VuZAotICAgICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICJ9IgorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgifSIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHdyaXRlIGpzb24gYXJyYXkgc3RhcnQiIGRvCiAgICAgICBAcHJvdC53cml0ZV9qc29uX2FycmF5X3N0YXJ0Ci0gICAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIlsiCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJbIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgd3JpdGUganNvbiBhcnJheSBlbmQiIGRvCiAgICAgICBAcHJvdC53cml0ZV9qc29uX2FycmF5X2VuZAotICAgICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICJdIgorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiXSIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHdyaXRlIG1lc3NhZ2UgYmVnaW4iIGRvCiAgICAgICBAcHJvdC53cml0ZV9tZXNzYWdlX2JlZ2luKCJuYW1lIiwgMTIsIDMyKQotICAgICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICJbMSxcIm5hbWVcIiwxMiwzMiIKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIlsxLFwibmFtZVwiLDEyLDMyIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgd3JpdGUgbWVzc2FnZSBlbmQiIGRvCiAgICAgICBAcHJvdC53cml0ZV9tZXNzYWdlX2VuZAotICAgICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICJdIgorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiXSIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHdyaXRlIHN0cnVjdCBiZWdpbiIgZG8KICAgICAgIEBwcm90LndyaXRlX3N0cnVjdF9iZWdpbigibmFtZSIpCi0gICAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gInsiCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJ7IikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgd3JpdGUgc3RydWN0IGVuZCIgZG8KICAgICAgIEBwcm90LndyaXRlX3N0cnVjdF9lbmQKLSAgICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAifSIKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIn0iKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCB3cml0ZSBmaWVsZCBiZWdpbiIgZG8KICAgICAgIEBwcm90LndyaXRlX2ZpZWxkX2JlZ2luKCJuYW1lIiwgVGhyaWZ0OjpUeXBlczo6U1RSVUNULCAzMikKLSAgICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAiMzJ7XCJyZWNcIiIKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIjMye1wicmVjXCIiKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCB3cml0ZSBmaWVsZCBlbmQiIGRvCiAgICAgICBAcHJvdC53cml0ZV9maWVsZF9lbmQKLSAgICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAifSIKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIn0iKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCB3cml0ZSBmaWVsZCBzdG9wIiBkbwogICAgICAgQHByb3Qud3JpdGVfZmllbGRfc3RvcAotICAgICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICIiCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCIiKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCB3cml0ZSBtYXAgYmVnaW4iIGRvCiAgICAgICBAcHJvdC53cml0ZV9tYXBfYmVnaW4oVGhyaWZ0OjpUeXBlczo6U1RSVUNULCBUaHJpZnQ6OlR5cGVzOjpMSVNULCAzMikKLSAgICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAiW1wicmVjXCIsXCJsc3RcIiwzMix7IgorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiW1wicmVjXCIsXCJsc3RcIiwzMix7IikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgd3JpdGUgbWFwIGVuZCIgZG8KICAgICAgIEBwcm90LndyaXRlX21hcF9lbmQKLSAgICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAifV0iCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJ9XSIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHdyaXRlIGxpc3QgYmVnaW4iIGRvCiAgICAgICBAcHJvdC53cml0ZV9saXN0X2JlZ2luKFRocmlmdDo6VHlwZXM6OlNUUlVDVCwgMzIpCi0gICAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIltcInJlY1wiLDMyIgorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiW1wicmVjXCIsMzIiKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCB3cml0ZSBsaXN0IGVuZCIgZG8KICAgICAgIEBwcm90LndyaXRlX2xpc3RfZW5kCi0gICAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIl0iCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJdIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgd3JpdGUgc2V0IGJlZ2luIiBkbwogICAgICAgQHByb3Qud3JpdGVfc2V0X2JlZ2luKFRocmlmdDo6VHlwZXM6OlNUUlVDVCwgMzIpCi0gICAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIltcInJlY1wiLDMyIgorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiW1wicmVjXCIsMzIiKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCB3cml0ZSBzZXQgZW5kIiBkbwogICAgICAgQHByb3Qud3JpdGVfc2V0X2VuZAotICAgICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICJdIgorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiXSIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHdyaXRlIGJvb2wiIGRvCiAgICAgICBAcHJvdC53cml0ZV9ib29sKHRydWUpCi0gICAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIjEiCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCIxIikKIAogICAgICAgQHByb3Qud3JpdGVfYm9vbChmYWxzZSkKLSAgICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAiMCIKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIjAiKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCB3cml0ZSBieXRlIiBkbwogICAgICAgQHByb3Qud3JpdGVfYnl0ZSgxMDApCi0gICAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIjEwMCIKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIjEwMCIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHdyaXRlIGkxNiIgZG8KICAgICAgIEBwcm90LndyaXRlX2kxNigxMDAwKQotICAgICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICIxMDAwIgorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiMTAwMCIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHdyaXRlIGkzMiIgZG8KICAgICAgIEBwcm90LndyaXRlX2kzMigzMDAwMDAwMDAwKQotICAgICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICIzMDAwMDAwMDAwIgorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiMzAwMDAwMDAwMCIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHdyaXRlIGk2NCIgZG8KICAgICAgIEBwcm90LndyaXRlX2k2NCg2MDAwMDAwMDAwKQotICAgICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICI2MDAwMDAwMDAwIgorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiNjAwMDAwMDAwMCIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHdyaXRlIGRvdWJsZSIgZG8KICAgICAgIEBwcm90LndyaXRlX2RvdWJsZSgxLjIzKQotICAgICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICIxLjIzIgorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiMS4yMyIpCiAKICAgICAgIEBwcm90LndyaXRlX2RvdWJsZSgtMzIuMSkKLSAgICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAiLTMyLjEiCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCItMzIuMSIpCiAKICAgICAgIEBwcm90LndyaXRlX2RvdWJsZSgoKCsxLjAvMC4wKS8oKzEuMC8wLjApKSkKLSAgICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAiXCJOYU5cIiIKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIlwiTmFOXCIiKQogCiAgICAgICBAcHJvdC53cml0ZV9kb3VibGUoKCsxLjAvMC4wKSkKLSAgICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAiXCJJbmZpbml0eVwiIgorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiXCJJbmZpbml0eVwiIikKIAogICAgICAgQHByb3Qud3JpdGVfZG91YmxlKCgtMS4wLzAuMCkpCi0gICAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIlwiLUluZmluaXR5XCIiCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJcIi1JbmZpbml0eVwiIikKICAgICBlbmQKIAogICAgIGlmIFJVQllfVkVSU0lPTiA+PSAnMS45JwogICAgICAgaXQgJ3Nob3VsZCB3cml0ZSBzdHJpbmcnIGRvCiAgICAgICAgIEBwcm90LndyaXRlX3N0cmluZygndGhpcyBpcyBhIHRlc3Qgc3RyaW5nJykKICAgICAgICAgYSA9IEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpCi0gICAgICAgIGEuc2hvdWxkID09ICcidGhpcyBpcyBhIHRlc3Qgc3RyaW5nIicuZm9yY2VfZW5jb2RpbmcoRW5jb2Rpbmc6OkJJTkFSWSkKLSAgICAgICAgYS5lbmNvZGluZy5zaG91bGQgPT0gRW5jb2Rpbmc6OkJJTkFSWQorICAgICAgICBleHBlY3QoYSkudG8gZXEoJyJ0aGlzIGlzIGEgdGVzdCBzdHJpbmciJy5mb3JjZV9lbmNvZGluZyhFbmNvZGluZzo6QklOQVJZKSkKKyAgICAgICAgZXhwZWN0KGEuZW5jb2RpbmcpLnRvIGVxKEVuY29kaW5nOjpCSU5BUlkpCiAgICAgICBlbmQKIAogICAgICAgaXQgJ3Nob3VsZCB3cml0ZSBzdHJpbmcgd2l0aCB1bmljb2RlIGNoYXJhY3RlcnMnIGRvCiAgICAgICAgIEBwcm90LndyaXRlX3N0cmluZygidGhpcyBpcyBhIHRlc3Qgc3RyaW5nIHdpdGggdW5pY29kZSBjaGFyYWN0ZXJzOiBcdTIwQUMgXHUyMEFEIikKICAgICAgICAgYSA9IEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpCi0gICAgICAgIGEuc2hvdWxkID09ICJcInRoaXMgaXMgYSB0ZXN0IHN0cmluZyB3aXRoIHVuaWNvZGUgY2hhcmFjdGVyczogXHUyMEFDIFx1MjBBRFwiIi5mb3JjZV9lbmNvZGluZyhFbmNvZGluZzo6QklOQVJZKQotICAgICAgICBhLmVuY29kaW5nLnNob3VsZCA9PSBFbmNvZGluZzo6QklOQVJZCisgICAgICAgIGV4cGVjdChhKS50byBlcSgiXCJ0aGlzIGlzIGEgdGVzdCBzdHJpbmcgd2l0aCB1bmljb2RlIGNoYXJhY3RlcnM6IFx1MjBBQyBcdTIwQURcIiIuZm9yY2VfZW5jb2RpbmcoRW5jb2Rpbmc6OkJJTkFSWSkpCisgICAgICAgIGV4cGVjdChhLmVuY29kaW5nKS50byBlcShFbmNvZGluZzo6QklOQVJZKQogICAgICAgZW5kCiAgICAgZWxzZQogICAgICAgaXQgJ3Nob3VsZCB3cml0ZSBzdHJpbmcnIGRvCiAgICAgICAgIEBwcm90LndyaXRlX3N0cmluZygndGhpcyBpcyBhIHRlc3Qgc3RyaW5nJykKLSAgICAgICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICcidGhpcyBpcyBhIHRlc3Qgc3RyaW5nIicKKyAgICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgnInRoaXMgaXMgYSB0ZXN0IHN0cmluZyInKQogICAgICAgZW5kCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHdyaXRlIGJpbmFyeSIgZG8KICAgICAgIEBwcm90LndyaXRlX2JpbmFyeSgidGhpcyBpcyBhIGJhc2U2NCBzdHJpbmciKQotICAgICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICJcIlwiZEdocGN5QnBjeUJoSUdKaGMyVTJOQ0J6ZEhKcGJtYz1cXG5cIlwiIgorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiXCJkR2hwY3lCcGN5QmhJR0poYzJVMk5DQnpkSEpwYm1jPVwiIikKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgd3JpdGUgbG9uZyBiaW5hcnkiIGRvCisgICAgICBAcHJvdC53cml0ZV9iaW5hcnkoKDAuLi4yNTYpLnRvX2EucGFjaygnQyonKSkKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIlwiQUFFQ0F3UUZCZ2NJQ1FvTERBME9EeEFSRWhNVUZSWVhHQmthR3h3ZEhoOGdJU0lqSkNVbUp5Z3BLaXNzTFM0dk1ERXlNelExTmpjNE9UbzdQRDArUDBCQlFrTkVSVVpIU0VsS1MweE5UazlRVVZKVFZGVldWMWhaV2x0Y1hWNWZZR0ZpWTJSbFptZG9hV3ByYkcxdWIzQnhjbk4wZFhaM2VIbDZlM3g5Zm4rQWdZS0RoSVdHaDRpSmlvdU1qWTZQa0pHU2s1U1ZscGVZbVpxYm5KMmVuNkNob3FPa3BhYW5xS21xcTZ5dHJxK3dzYkt6dExXMnQ3aTV1cnU4dmI2L3dNSEN3OFRGeHNmSXljckx6TTNPejlEUjB0UFUxZGJYMk5uYTI5emQzdC9nNGVMajVPWG01K2pwNnV2czdlN3Y4UEh5OC9UMTl2ZjQrZnI3L1AzKy93PT1cIiIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGdldCB0eXBlIG5hbWUgZm9yIHR5cGUgaWQiIGRvCiAgICAgICBleHBlY3Qge0Bwcm90LmdldF90eXBlX25hbWVfZm9yX3R5cGVfaWQoVGhyaWZ0OjpUeXBlczo6U1RPUCl9LnRvIHJhaXNlX2Vycm9yKE5vdEltcGxlbWVudGVkRXJyb3IpCiAgICAgICBleHBlY3Qge0Bwcm90LmdldF90eXBlX25hbWVfZm9yX3R5cGVfaWQoVGhyaWZ0OjpUeXBlczo6Vk9JRCl9LnRvIHJhaXNlX2Vycm9yKE5vdEltcGxlbWVudGVkRXJyb3IpCi0gICAgICBAcHJvdC5nZXRfdHlwZV9uYW1lX2Zvcl90eXBlX2lkKFRocmlmdDo6VHlwZXM6OkJPT0wpLnNob3VsZCA9PSAidGYiCi0gICAgICBAcHJvdC5nZXRfdHlwZV9uYW1lX2Zvcl90eXBlX2lkKFRocmlmdDo6VHlwZXM6OkJZVEUpLnNob3VsZCA9PSAiaTgiCi0gICAgICBAcHJvdC5nZXRfdHlwZV9uYW1lX2Zvcl90eXBlX2lkKFRocmlmdDo6VHlwZXM6OkRPVUJMRSkuc2hvdWxkID09ICJkYmwiCi0gICAgICBAcHJvdC5nZXRfdHlwZV9uYW1lX2Zvcl90eXBlX2lkKFRocmlmdDo6VHlwZXM6OkkxNikuc2hvdWxkID09ICJpMTYiCi0gICAgICBAcHJvdC5nZXRfdHlwZV9uYW1lX2Zvcl90eXBlX2lkKFRocmlmdDo6VHlwZXM6OkkzMikuc2hvdWxkID09ICJpMzIiCi0gICAgICBAcHJvdC5nZXRfdHlwZV9uYW1lX2Zvcl90eXBlX2lkKFRocmlmdDo6VHlwZXM6Okk2NCkuc2hvdWxkID09ICJpNjQiCi0gICAgICBAcHJvdC5nZXRfdHlwZV9uYW1lX2Zvcl90eXBlX2lkKFRocmlmdDo6VHlwZXM6OlNUUklORykuc2hvdWxkID09ICJzdHIiCi0gICAgICBAcHJvdC5nZXRfdHlwZV9uYW1lX2Zvcl90eXBlX2lkKFRocmlmdDo6VHlwZXM6OlNUUlVDVCkuc2hvdWxkID09ICJyZWMiCi0gICAgICBAcHJvdC5nZXRfdHlwZV9uYW1lX2Zvcl90eXBlX2lkKFRocmlmdDo6VHlwZXM6Ok1BUCkuc2hvdWxkID09ICJtYXAiCi0gICAgICBAcHJvdC5nZXRfdHlwZV9uYW1lX2Zvcl90eXBlX2lkKFRocmlmdDo6VHlwZXM6OlNFVCkuc2hvdWxkID09ICJzZXQiCi0gICAgICBAcHJvdC5nZXRfdHlwZV9uYW1lX2Zvcl90eXBlX2lkKFRocmlmdDo6VHlwZXM6OkxJU1QpLnNob3VsZCA9PSAibHN0IgorICAgICAgZXhwZWN0KEBwcm90LmdldF90eXBlX25hbWVfZm9yX3R5cGVfaWQoVGhyaWZ0OjpUeXBlczo6Qk9PTCkpLnRvIGVxKCJ0ZiIpCisgICAgICBleHBlY3QoQHByb3QuZ2V0X3R5cGVfbmFtZV9mb3JfdHlwZV9pZChUaHJpZnQ6OlR5cGVzOjpCWVRFKSkudG8gZXEoImk4IikKKyAgICAgIGV4cGVjdChAcHJvdC5nZXRfdHlwZV9uYW1lX2Zvcl90eXBlX2lkKFRocmlmdDo6VHlwZXM6OkRPVUJMRSkpLnRvIGVxKCJkYmwiKQorICAgICAgZXhwZWN0KEBwcm90LmdldF90eXBlX25hbWVfZm9yX3R5cGVfaWQoVGhyaWZ0OjpUeXBlczo6STE2KSkudG8gZXEoImkxNiIpCisgICAgICBleHBlY3QoQHByb3QuZ2V0X3R5cGVfbmFtZV9mb3JfdHlwZV9pZChUaHJpZnQ6OlR5cGVzOjpJMzIpKS50byBlcSgiaTMyIikKKyAgICAgIGV4cGVjdChAcHJvdC5nZXRfdHlwZV9uYW1lX2Zvcl90eXBlX2lkKFRocmlmdDo6VHlwZXM6Okk2NCkpLnRvIGVxKCJpNjQiKQorICAgICAgZXhwZWN0KEBwcm90LmdldF90eXBlX25hbWVfZm9yX3R5cGVfaWQoVGhyaWZ0OjpUeXBlczo6U1RSSU5HKSkudG8gZXEoInN0ciIpCisgICAgICBleHBlY3QoQHByb3QuZ2V0X3R5cGVfbmFtZV9mb3JfdHlwZV9pZChUaHJpZnQ6OlR5cGVzOjpTVFJVQ1QpKS50byBlcSgicmVjIikKKyAgICAgIGV4cGVjdChAcHJvdC5nZXRfdHlwZV9uYW1lX2Zvcl90eXBlX2lkKFRocmlmdDo6VHlwZXM6Ok1BUCkpLnRvIGVxKCJtYXAiKQorICAgICAgZXhwZWN0KEBwcm90LmdldF90eXBlX25hbWVfZm9yX3R5cGVfaWQoVGhyaWZ0OjpUeXBlczo6U0VUKSkudG8gZXEoInNldCIpCisgICAgICBleHBlY3QoQHByb3QuZ2V0X3R5cGVfbmFtZV9mb3JfdHlwZV9pZChUaHJpZnQ6OlR5cGVzOjpMSVNUKSkudG8gZXEoImxzdCIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGdldCB0eXBlIGlkIGZvciB0eXBlIG5hbWUiIGRvCiAgICAgICBleHBlY3Qge0Bwcm90LmdldF90eXBlX2lkX2Zvcl90eXBlX25hbWUoInBwIil9LnRvIHJhaXNlX2Vycm9yKE5vdEltcGxlbWVudGVkRXJyb3IpCi0gICAgICBAcHJvdC5nZXRfdHlwZV9pZF9mb3JfdHlwZV9uYW1lKCJ0ZiIpLnNob3VsZCA9PSBUaHJpZnQ6OlR5cGVzOjpCT09MCi0gICAgICBAcHJvdC5nZXRfdHlwZV9pZF9mb3JfdHlwZV9uYW1lKCJpOCIpLnNob3VsZCA9PSBUaHJpZnQ6OlR5cGVzOjpCWVRFCi0gICAgICBAcHJvdC5nZXRfdHlwZV9pZF9mb3JfdHlwZV9uYW1lKCJkYmwiKS5zaG91bGQgPT0gVGhyaWZ0OjpUeXBlczo6RE9VQkxFCi0gICAgICBAcHJvdC5nZXRfdHlwZV9pZF9mb3JfdHlwZV9uYW1lKCJpMTYiKS5zaG91bGQgPT0gVGhyaWZ0OjpUeXBlczo6STE2Ci0gICAgICBAcHJvdC5nZXRfdHlwZV9pZF9mb3JfdHlwZV9uYW1lKCJpMzIiKS5zaG91bGQgPT0gVGhyaWZ0OjpUeXBlczo6STMyCi0gICAgICBAcHJvdC5nZXRfdHlwZV9pZF9mb3JfdHlwZV9uYW1lKCJpNjQiKS5zaG91bGQgPT0gVGhyaWZ0OjpUeXBlczo6STY0Ci0gICAgICBAcHJvdC5nZXRfdHlwZV9pZF9mb3JfdHlwZV9uYW1lKCJzdHIiKS5zaG91bGQgPT0gVGhyaWZ0OjpUeXBlczo6U1RSSU5HCi0gICAgICBAcHJvdC5nZXRfdHlwZV9pZF9mb3JfdHlwZV9uYW1lKCJyZWMiKS5zaG91bGQgPT0gVGhyaWZ0OjpUeXBlczo6U1RSVUNUCi0gICAgICBAcHJvdC5nZXRfdHlwZV9pZF9mb3JfdHlwZV9uYW1lKCJtYXAiKS5zaG91bGQgPT0gVGhyaWZ0OjpUeXBlczo6TUFQCi0gICAgICBAcHJvdC5nZXRfdHlwZV9pZF9mb3JfdHlwZV9uYW1lKCJzZXQiKS5zaG91bGQgPT0gVGhyaWZ0OjpUeXBlczo6U0VUCi0gICAgICBAcHJvdC5nZXRfdHlwZV9pZF9mb3JfdHlwZV9uYW1lKCJsc3QiKS5zaG91bGQgPT0gVGhyaWZ0OjpUeXBlczo6TElTVAorICAgICAgZXhwZWN0KEBwcm90LmdldF90eXBlX2lkX2Zvcl90eXBlX25hbWUoInRmIikpLnRvIGVxKFRocmlmdDo6VHlwZXM6OkJPT0wpCisgICAgICBleHBlY3QoQHByb3QuZ2V0X3R5cGVfaWRfZm9yX3R5cGVfbmFtZSgiaTgiKSkudG8gZXEoVGhyaWZ0OjpUeXBlczo6QllURSkKKyAgICAgIGV4cGVjdChAcHJvdC5nZXRfdHlwZV9pZF9mb3JfdHlwZV9uYW1lKCJkYmwiKSkudG8gZXEoVGhyaWZ0OjpUeXBlczo6RE9VQkxFKQorICAgICAgZXhwZWN0KEBwcm90LmdldF90eXBlX2lkX2Zvcl90eXBlX25hbWUoImkxNiIpKS50byBlcShUaHJpZnQ6OlR5cGVzOjpJMTYpCisgICAgICBleHBlY3QoQHByb3QuZ2V0X3R5cGVfaWRfZm9yX3R5cGVfbmFtZSgiaTMyIikpLnRvIGVxKFRocmlmdDo6VHlwZXM6OkkzMikKKyAgICAgIGV4cGVjdChAcHJvdC5nZXRfdHlwZV9pZF9mb3JfdHlwZV9uYW1lKCJpNjQiKSkudG8gZXEoVGhyaWZ0OjpUeXBlczo6STY0KQorICAgICAgZXhwZWN0KEBwcm90LmdldF90eXBlX2lkX2Zvcl90eXBlX25hbWUoInN0ciIpKS50byBlcShUaHJpZnQ6OlR5cGVzOjpTVFJJTkcpCisgICAgICBleHBlY3QoQHByb3QuZ2V0X3R5cGVfaWRfZm9yX3R5cGVfbmFtZSgicmVjIikpLnRvIGVxKFRocmlmdDo6VHlwZXM6OlNUUlVDVCkKKyAgICAgIGV4cGVjdChAcHJvdC5nZXRfdHlwZV9pZF9mb3JfdHlwZV9uYW1lKCJtYXAiKSkudG8gZXEoVGhyaWZ0OjpUeXBlczo6TUFQKQorICAgICAgZXhwZWN0KEBwcm90LmdldF90eXBlX2lkX2Zvcl90eXBlX25hbWUoInNldCIpKS50byBlcShUaHJpZnQ6OlR5cGVzOjpTRVQpCisgICAgICBleHBlY3QoQHByb3QuZ2V0X3R5cGVfaWRfZm9yX3R5cGVfbmFtZSgibHN0IikpLnRvIGVxKFRocmlmdDo6VHlwZXM6OkxJU1QpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJlYWQganNvbiBzeW50YXggY2hhciIgZG8KQEAgLTI4Nyw0NyArMjkyLDY4IEBACiAKICAgICBpdCAic2hvdWxkIHJlYWQganNvbiBlc2NhcGUgY2hhciIgZG8KICAgICAgIEB0cmFucy53cml0ZSgnMDA1NCcpCi0gICAgICBAcHJvdC5yZWFkX2pzb25fZXNjYXBlX2NoYXIuc2hvdWxkID09ICdUJworICAgICAgZXhwZWN0KEBwcm90LnJlYWRfanNvbl9lc2NhcGVfY2hhcikudG8gZXEoJ1QnKQorCisgICAgICBAdHJhbnMud3JpdGUoIlwiXFxcIlwiIikKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2pzb25fc3RyaW5nKGZhbHNlKSkudG8gZXEoIlwiIikKKworICAgICAgQHRyYW5zLndyaXRlKCJcIlxcXFxcIiIpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9qc29uX3N0cmluZyhmYWxzZSkpLnRvIGVxKCJcXCIpCisKKyAgICAgIEB0cmFucy53cml0ZSgiXCJcXC9cIiIpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9qc29uX3N0cmluZyhmYWxzZSkpLnRvIGVxKCJcLyIpCisKKyAgICAgIEB0cmFucy53cml0ZSgiXCJcXGJcIiIpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9qc29uX3N0cmluZyhmYWxzZSkpLnRvIGVxKCJcYiIpCisKKyAgICAgIEB0cmFucy53cml0ZSgiXCJcXGZcIiIpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9qc29uX3N0cmluZyhmYWxzZSkpLnRvIGVxKCJcZiIpCisKKyAgICAgIEB0cmFucy53cml0ZSgiXCJcXG5cIiIpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9qc29uX3N0cmluZyhmYWxzZSkpLnRvIGVxKCJcbiIpCisKKyAgICAgIEB0cmFucy53cml0ZSgiXCJcXHJcIiIpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9qc29uX3N0cmluZyhmYWxzZSkpLnRvIGVxKCJcciIpCisKKyAgICAgIEB0cmFucy53cml0ZSgiXCJcXHRcIiIpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9qc29uX3N0cmluZyhmYWxzZSkpLnRvIGVxKCJcdCIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJlYWQganNvbiBzdHJpbmciIGRvCiAgICAgICBAdHJhbnMud3JpdGUoIlwiXFxQIikKICAgICAgIGV4cGVjdCB7QHByb3QucmVhZF9qc29uX3N0cmluZyhmYWxzZSl9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb24pCiAKLSAgICAgIEB0cmFucy53cml0ZSgiXCJcXG5cIiIpCi0gICAgICBAcHJvdC5yZWFkX2pzb25fc3RyaW5nKGZhbHNlKS5zaG91bGQgPT0gIlxcbiIKLQogICAgICAgQHRyYW5zLndyaXRlKCJcInRoaXMgaXMgYSB0ZXN0IHN0cmluZ1wiIikKLSAgICAgIEBwcm90LnJlYWRfanNvbl9zdHJpbmcuc2hvdWxkID09ICJ0aGlzIGlzIGEgdGVzdCBzdHJpbmciCisgICAgICBleHBlY3QoQHByb3QucmVhZF9qc29uX3N0cmluZykudG8gZXEoInRoaXMgaXMgYSB0ZXN0IHN0cmluZyIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJlYWQganNvbiBiYXNlNjQiIGRvCiAgICAgICBAdHJhbnMud3JpdGUoIlwiZEdocGN5QnBjeUJoSUhSbGMzUWdjM1J5YVc1blwiIikKLSAgICAgIEBwcm90LnJlYWRfanNvbl9iYXNlNjQuc2hvdWxkID09ICJ0aGlzIGlzIGEgdGVzdCBzdHJpbmciCisgICAgICBleHBlY3QoQHByb3QucmVhZF9qc29uX2Jhc2U2NCkudG8gZXEoInRoaXMgaXMgYSB0ZXN0IHN0cmluZyIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGlzIGpzb24gbnVtZXJpYyIgZG8KLSAgICAgIEBwcm90LmlzX2pzb25fbnVtZXJpYygiQSIpLnNob3VsZCA9PSBmYWxzZQotICAgICAgQHByb3QuaXNfanNvbl9udW1lcmljKCIrIikuc2hvdWxkID09IHRydWUKLSAgICAgIEBwcm90LmlzX2pzb25fbnVtZXJpYygiLSIpLnNob3VsZCA9PSB0cnVlCi0gICAgICBAcHJvdC5pc19qc29uX251bWVyaWMoIi4iKS5zaG91bGQgPT0gdHJ1ZQotICAgICAgQHByb3QuaXNfanNvbl9udW1lcmljKCIwIikuc2hvdWxkID09IHRydWUKLSAgICAgIEBwcm90LmlzX2pzb25fbnVtZXJpYygiMSIpLnNob3VsZCA9PSB0cnVlCi0gICAgICBAcHJvdC5pc19qc29uX251bWVyaWMoIjIiKS5zaG91bGQgPT0gdHJ1ZQotICAgICAgQHByb3QuaXNfanNvbl9udW1lcmljKCIzIikuc2hvdWxkID09IHRydWUKLSAgICAgIEBwcm90LmlzX2pzb25fbnVtZXJpYygiNCIpLnNob3VsZCA9PSB0cnVlCi0gICAgICBAcHJvdC5pc19qc29uX251bWVyaWMoIjUiKS5zaG91bGQgPT0gdHJ1ZQotICAgICAgQHByb3QuaXNfanNvbl9udW1lcmljKCI2Iikuc2hvdWxkID09IHRydWUKLSAgICAgIEBwcm90LmlzX2pzb25fbnVtZXJpYygiNyIpLnNob3VsZCA9PSB0cnVlCi0gICAgICBAcHJvdC5pc19qc29uX251bWVyaWMoIjgiKS5zaG91bGQgPT0gdHJ1ZQotICAgICAgQHByb3QuaXNfanNvbl9udW1lcmljKCI5Iikuc2hvdWxkID09IHRydWUKLSAgICAgIEBwcm90LmlzX2pzb25fbnVtZXJpYygiRSIpLnNob3VsZCA9PSB0cnVlCi0gICAgICBAcHJvdC5pc19qc29uX251bWVyaWMoImUiKS5zaG91bGQgPT0gdHJ1ZQorICAgICAgZXhwZWN0KEBwcm90LmlzX2pzb25fbnVtZXJpYygiQSIpKS50byBlcShmYWxzZSkKKyAgICAgIGV4cGVjdChAcHJvdC5pc19qc29uX251bWVyaWMoIisiKSkudG8gZXEodHJ1ZSkKKyAgICAgIGV4cGVjdChAcHJvdC5pc19qc29uX251bWVyaWMoIi0iKSkudG8gZXEodHJ1ZSkKKyAgICAgIGV4cGVjdChAcHJvdC5pc19qc29uX251bWVyaWMoIi4iKSkudG8gZXEodHJ1ZSkKKyAgICAgIGV4cGVjdChAcHJvdC5pc19qc29uX251bWVyaWMoIjAiKSkudG8gZXEodHJ1ZSkKKyAgICAgIGV4cGVjdChAcHJvdC5pc19qc29uX251bWVyaWMoIjEiKSkudG8gZXEodHJ1ZSkKKyAgICAgIGV4cGVjdChAcHJvdC5pc19qc29uX251bWVyaWMoIjIiKSkudG8gZXEodHJ1ZSkKKyAgICAgIGV4cGVjdChAcHJvdC5pc19qc29uX251bWVyaWMoIjMiKSkudG8gZXEodHJ1ZSkKKyAgICAgIGV4cGVjdChAcHJvdC5pc19qc29uX251bWVyaWMoIjQiKSkudG8gZXEodHJ1ZSkKKyAgICAgIGV4cGVjdChAcHJvdC5pc19qc29uX251bWVyaWMoIjUiKSkudG8gZXEodHJ1ZSkKKyAgICAgIGV4cGVjdChAcHJvdC5pc19qc29uX251bWVyaWMoIjYiKSkudG8gZXEodHJ1ZSkKKyAgICAgIGV4cGVjdChAcHJvdC5pc19qc29uX251bWVyaWMoIjciKSkudG8gZXEodHJ1ZSkKKyAgICAgIGV4cGVjdChAcHJvdC5pc19qc29uX251bWVyaWMoIjgiKSkudG8gZXEodHJ1ZSkKKyAgICAgIGV4cGVjdChAcHJvdC5pc19qc29uX251bWVyaWMoIjkiKSkudG8gZXEodHJ1ZSkKKyAgICAgIGV4cGVjdChAcHJvdC5pc19qc29uX251bWVyaWMoIkUiKSkudG8gZXEodHJ1ZSkKKyAgICAgIGV4cGVjdChAcHJvdC5pc19qc29uX251bWVyaWMoImUiKSkudG8gZXEodHJ1ZSkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmVhZCBqc29uIG51bWVyaWMgY2hhcnMiIGRvCiAgICAgICBAdHJhbnMud3JpdGUoIjEuNDUzRTQ1VCIpCi0gICAgICBAcHJvdC5yZWFkX2pzb25fbnVtZXJpY19jaGFycy5zaG91bGQgPT0gIjEuNDUzRTQ1IgorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfanNvbl9udW1lcmljX2NoYXJzKS50byBlcSgiMS40NTNFNDUiKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByZWFkIGpzb24gaW50ZWdlciIgZG8KQEAgLTMzNiw3ICszNjIsNyBAQAogICAgICAgQHByb3QucmVhZF9zdHJpbmcKIAogICAgICAgQHRyYW5zLndyaXRlKCIxNDUzVCIpCi0gICAgICBAcHJvdC5yZWFkX2pzb25faW50ZWdlci5zaG91bGQgPT0gMTQ1MworICAgICAgZXhwZWN0KEBwcm90LnJlYWRfanNvbl9pbnRlZ2VyKS50byBlcSgxNDUzKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByZWFkIGpzb24gZG91YmxlIiBkbwpAQCAtMzQ4LDM3ICszNzQsMzcgQEAKICAgICAgIGV4cGVjdCB7QHByb3QucmVhZF9qc29uX2RvdWJsZX0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpQcm90b2NvbEV4Y2VwdGlvbikKIAogICAgICAgQHRyYW5zLndyaXRlKCIxLjQ1M2UwMVwiXCIiKQotICAgICAgQHByb3QucmVhZF9qc29uX2RvdWJsZS5zaG91bGQgPT0gMTQuNTMKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2pzb25fZG91YmxlKS50byBlcSgxNC41MykKICAgICAgIEBwcm90LnJlYWRfc3RyaW5nCiAKICAgICAgIEB0cmFucy53cml0ZSgiXCJOYU5cIiIpCi0gICAgICBAcHJvdC5yZWFkX2pzb25fZG91YmxlLm5hbj8uc2hvdWxkID09IHRydWUKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2pzb25fZG91YmxlLm5hbj8pLnRvIGVxKHRydWUpCiAKICAgICAgIEB0cmFucy53cml0ZSgiXCJJbmZpbml0eVwiIikKLSAgICAgIEBwcm90LnJlYWRfanNvbl9kb3VibGUuc2hvdWxkID09ICsxLjAvMC4wCisgICAgICBleHBlY3QoQHByb3QucmVhZF9qc29uX2RvdWJsZSkudG8gZXEoKzEuMC8wLjApCiAKICAgICAgIEB0cmFucy53cml0ZSgiXCItSW5maW5pdHlcIiIpCi0gICAgICBAcHJvdC5yZWFkX2pzb25fZG91YmxlLnNob3VsZCA9PSAtMS4wLzAuMAorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfanNvbl9kb3VibGUpLnRvIGVxKC0xLjAvMC4wKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByZWFkIGpzb24gb2JqZWN0IHN0YXJ0IiBkbwogICAgICAgQHRyYW5zLndyaXRlKCJ7IikKLSAgICAgIEBwcm90LnJlYWRfanNvbl9vYmplY3Rfc3RhcnQuc2hvdWxkID09IG5pbAorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfanNvbl9vYmplY3Rfc3RhcnQpLnRvIGVxKG5pbCkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmVhZCBqc29uIG9iamVjdCBlbmQiIGRvCiAgICAgICBAdHJhbnMud3JpdGUoIn0iKQotICAgICAgQHByb3QucmVhZF9qc29uX29iamVjdF9lbmQuc2hvdWxkID09IG5pbAorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfanNvbl9vYmplY3RfZW5kKS50byBlcShuaWwpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJlYWQganNvbiBhcnJheSBzdGFydCIgZG8KICAgICAgIEB0cmFucy53cml0ZSgiWyIpCi0gICAgICBAcHJvdC5yZWFkX2pzb25fYXJyYXlfc3RhcnQuc2hvdWxkID09IG5pbAorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfanNvbl9hcnJheV9zdGFydCkudG8gZXEobmlsKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByZWFkIGpzb24gYXJyYXkgZW5kIiBkbwogICAgICAgQHRyYW5zLndyaXRlKCJdIikKLSAgICAgIEBwcm90LnJlYWRfanNvbl9hcnJheV9lbmQuc2hvdWxkID09IG5pbAorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfanNvbl9hcnJheV9lbmQpLnRvIGVxKG5pbCkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmVhZF9tZXNzYWdlX2JlZ2luIiBkbwpAQCAtMzg2LDEyOCArNDEyLDE0MSBAQAogICAgICAgZXhwZWN0IHtAcHJvdC5yZWFkX21lc3NhZ2VfYmVnaW59LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb24pCiAKICAgICAgIEB0cmFucy53cml0ZSgiWzEsXCJuYW1lXCIsMTIsMzJcIlwiIikKLSAgICAgIEBwcm90LnJlYWRfbWVzc2FnZV9iZWdpbi5zaG91bGQgPT0gWyJuYW1lIiwgMTIsIDMyXQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfbWVzc2FnZV9iZWdpbikudG8gZXEoWyJuYW1lIiwgMTIsIDMyXSkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmVhZCBtZXNzYWdlIGVuZCIgZG8KICAgICAgIEB0cmFucy53cml0ZSgiXSIpCi0gICAgICBAcHJvdC5yZWFkX21lc3NhZ2VfZW5kLnNob3VsZCA9PSBuaWwKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX21lc3NhZ2VfZW5kKS50byBlcShuaWwpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJlYWQgc3RydWN0IGJlZ2luIiBkbwogICAgICAgQHRyYW5zLndyaXRlKCJ7IikKLSAgICAgIEBwcm90LnJlYWRfc3RydWN0X2JlZ2luLnNob3VsZCA9PSBuaWwKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX3N0cnVjdF9iZWdpbikudG8gZXEobmlsKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByZWFkIHN0cnVjdCBlbmQiIGRvCiAgICAgICBAdHJhbnMud3JpdGUoIn0iKQotICAgICAgQHByb3QucmVhZF9zdHJ1Y3RfZW5kLnNob3VsZCA9PSBuaWwKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX3N0cnVjdF9lbmQpLnRvIGVxKG5pbCkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmVhZCBmaWVsZCBiZWdpbiIgZG8KICAgICAgIEB0cmFucy53cml0ZSgiMXtcInJlY1wiIikKLSAgICAgIEBwcm90LnJlYWRfZmllbGRfYmVnaW4uc2hvdWxkID09IFtuaWwsIDEyLCAxXQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfZmllbGRfYmVnaW4pLnRvIGVxKFtuaWwsIDEyLCAxXSkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmVhZCBmaWVsZCBlbmQiIGRvCiAgICAgICBAdHJhbnMud3JpdGUoIn0iKQotICAgICAgQHByb3QucmVhZF9maWVsZF9lbmQuc2hvdWxkID09IG5pbAorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfZmllbGRfZW5kKS50byBlcShuaWwpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJlYWQgbWFwIGJlZ2luIiBkbwogICAgICAgQHRyYW5zLndyaXRlKCJbXCJyZWNcIixcImxzdFwiLDIseyIpCi0gICAgICBAcHJvdC5yZWFkX21hcF9iZWdpbi5zaG91bGQgPT0gWzEyLCAxNSwgMl0KKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX21hcF9iZWdpbikudG8gZXEoWzEyLCAxNSwgMl0pCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJlYWQgbWFwIGVuZCIgZG8KICAgICAgIEB0cmFucy53cml0ZSgifV0iKQotICAgICAgQHByb3QucmVhZF9tYXBfZW5kLnNob3VsZCA9PSBuaWwKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX21hcF9lbmQpLnRvIGVxKG5pbCkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmVhZCBsaXN0IGJlZ2luIiBkbwogICAgICAgQHRyYW5zLndyaXRlKCJbXCJyZWNcIiwyXCJcIiIpCi0gICAgICBAcHJvdC5yZWFkX2xpc3RfYmVnaW4uc2hvdWxkID09IFsxMiwgMl0KKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2xpc3RfYmVnaW4pLnRvIGVxKFsxMiwgMl0pCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJlYWQgbGlzdCBlbmQiIGRvCiAgICAgICBAdHJhbnMud3JpdGUoIl0iKQotICAgICAgQHByb3QucmVhZF9saXN0X2VuZC5zaG91bGQgPT0gbmlsCisgICAgICBleHBlY3QoQHByb3QucmVhZF9saXN0X2VuZCkudG8gZXEobmlsKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByZWFkIHNldCBiZWdpbiIgZG8KICAgICAgIEB0cmFucy53cml0ZSgiW1wicmVjXCIsMlwiXCIiKQotICAgICAgQHByb3QucmVhZF9zZXRfYmVnaW4uc2hvdWxkID09IFsxMiwgMl0KKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX3NldF9iZWdpbikudG8gZXEoWzEyLCAyXSkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmVhZCBzZXQgZW5kIiBkbwogICAgICAgQHRyYW5zLndyaXRlKCJdIikKLSAgICAgIEBwcm90LnJlYWRfc2V0X2VuZC5zaG91bGQgPT0gbmlsCisgICAgICBleHBlY3QoQHByb3QucmVhZF9zZXRfZW5kKS50byBlcShuaWwpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJlYWQgYm9vbCIgZG8KICAgICAgIEB0cmFucy53cml0ZSgiMFwiXCIiKQotICAgICAgQHByb3QucmVhZF9ib29sLnNob3VsZCA9PSBmYWxzZQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfYm9vbCkudG8gZXEoZmFsc2UpCiAgICAgICBAcHJvdC5yZWFkX3N0cmluZwogCiAgICAgICBAdHJhbnMud3JpdGUoIjFcIlwiIikKLSAgICAgIEBwcm90LnJlYWRfYm9vbC5zaG91bGQgPT0gdHJ1ZQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfYm9vbCkudG8gZXEodHJ1ZSkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmVhZCBieXRlIiBkbwogICAgICAgQHRyYW5zLndyaXRlKCI2MFwiXCIiKQotICAgICAgQHByb3QucmVhZF9ieXRlLnNob3VsZCA9PSA2MAorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfYnl0ZSkudG8gZXEoNjApCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJlYWQgaTE2IiBkbwogICAgICAgQHRyYW5zLndyaXRlKCIxMDAwXCJcIiIpCi0gICAgICBAcHJvdC5yZWFkX2kxNi5zaG91bGQgPT0gMTAwMAorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfaTE2KS50byBlcSgxMDAwKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByZWFkIGkzMiIgZG8KICAgICAgIEB0cmFucy53cml0ZSgiMzAwMDAwMDAwMFwiXCIiKQotICAgICAgQHByb3QucmVhZF9pMzIuc2hvdWxkID09IDMwMDAwMDAwMDAKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2kzMikudG8gZXEoMzAwMDAwMDAwMCkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmVhZCBpNjQiIGRvCiAgICAgICBAdHJhbnMud3JpdGUoIjYwMDAwMDAwMDBcIlwiIikKLSAgICAgIEBwcm90LnJlYWRfaTY0LnNob3VsZCA9PSA2MDAwMDAwMDAwCisgICAgICBleHBlY3QoQHByb3QucmVhZF9pNjQpLnRvIGVxKDYwMDAwMDAwMDApCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJlYWQgZG91YmxlIiBkbwogICAgICAgQHRyYW5zLndyaXRlKCIxMi4yM1wiXCIiKQotICAgICAgQHByb3QucmVhZF9kb3VibGUuc2hvdWxkID09IDEyLjIzCisgICAgICBleHBlY3QoQHByb3QucmVhZF9kb3VibGUpLnRvIGVxKDEyLjIzKQogICAgIGVuZAogCiAgICAgaWYgUlVCWV9WRVJTSU9OID49ICcxLjknCiAgICAgICBpdCAnc2hvdWxkIHJlYWQgc3RyaW5nJyBkbwogICAgICAgICBAdHJhbnMud3JpdGUoJyJ0aGlzIGlzIGEgdGVzdCBzdHJpbmciJy5mb3JjZV9lbmNvZGluZyhFbmNvZGluZzo6QklOQVJZKSkKICAgICAgICAgYSA9IEBwcm90LnJlYWRfc3RyaW5nCi0gICAgICAgIGEuc2hvdWxkID09ICd0aGlzIGlzIGEgdGVzdCBzdHJpbmcnCi0gICAgICAgIGEuZW5jb2Rpbmcuc2hvdWxkID09IEVuY29kaW5nOjpVVEZfOAorICAgICAgICBleHBlY3QoYSkudG8gZXEoJ3RoaXMgaXMgYSB0ZXN0IHN0cmluZycpCisgICAgICAgIGV4cGVjdChhLmVuY29kaW5nKS50byBlcShFbmNvZGluZzo6VVRGXzgpCiAgICAgICBlbmQKIAogICAgICAgaXQgJ3Nob3VsZCByZWFkIHN0cmluZyB3aXRoIHVuaWNvZGUgY2hhcmFjdGVycycgZG8KICAgICAgICAgQHRyYW5zLndyaXRlKCcidGhpcyBpcyBhIHRlc3Qgc3RyaW5nIHdpdGggdW5pY29kZSBjaGFyYWN0ZXJzOiBcdTIwQUMgXHUyMEFEIicuZm9yY2VfZW5jb2RpbmcoRW5jb2Rpbmc6OkJJTkFSWSkpCiAgICAgICAgIGEgPSBAcHJvdC5yZWFkX3N0cmluZwotICAgICAgICBhLnNob3VsZCA9PSAidGhpcyBpcyBhIHRlc3Qgc3RyaW5nIHdpdGggdW5pY29kZSBjaGFyYWN0ZXJzOiBcdTIwQUMgXHUyMEFEIgotICAgICAgICBhLmVuY29kaW5nLnNob3VsZCA9PSBFbmNvZGluZzo6VVRGXzgKKyAgICAgICAgZXhwZWN0KGEpLnRvIGVxKCJ0aGlzIGlzIGEgdGVzdCBzdHJpbmcgd2l0aCB1bmljb2RlIGNoYXJhY3RlcnM6IFx1MjBBQyBcdTIwQUQiKQorICAgICAgICBleHBlY3QoYS5lbmNvZGluZykudG8gZXEoRW5jb2Rpbmc6OlVURl84KQogICAgICAgZW5kCiAgICAgZWxzZQogICAgICAgaXQgJ3Nob3VsZCByZWFkIHN0cmluZycgZG8KICAgICAgICAgQHRyYW5zLndyaXRlKCcidGhpcyBpcyBhIHRlc3Qgc3RyaW5nIicpCi0gICAgICAgIEBwcm90LnJlYWRfc3RyaW5nLnNob3VsZCA9PSAndGhpcyBpcyBhIHRlc3Qgc3RyaW5nJworICAgICAgICBleHBlY3QoQHByb3QucmVhZF9zdHJpbmcpLnRvIGVxKCd0aGlzIGlzIGEgdGVzdCBzdHJpbmcnKQogICAgICAgZW5kCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJlYWQgYmluYXJ5IiBkbwogICAgICAgQHRyYW5zLndyaXRlKCJcImRHaHBjeUJwY3lCaElIUmxjM1FnYzNSeWFXNW5cIiIpCi0gICAgICBAcHJvdC5yZWFkX2JpbmFyeS5zaG91bGQgPT0gInRoaXMgaXMgYSB0ZXN0IHN0cmluZyIKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2JpbmFyeSkudG8gZXEoInRoaXMgaXMgYSB0ZXN0IHN0cmluZyIpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHJlYWQgbG9uZyBiaW5hcnkiIGRvCisgICAgICBAdHJhbnMud3JpdGUoIlwiQUFFQ0F3UUZCZ2NJQ1FvTERBME9EeEFSRWhNVUZSWVhHQmthR3h3ZEhoOGdJU0lqSkNVbUp5Z3BLaXNzTFM0dk1ERXlNelExTmpjNE9UbzdQRDArUDBCQlFrTkVSVVpIU0VsS1MweE5UazlRVVZKVFZGVldWMWhaV2x0Y1hWNWZZR0ZpWTJSbFptZG9hV3ByYkcxdWIzQnhjbk4wZFhaM2VIbDZlM3g5Zm4rQWdZS0RoSVdHaDRpSmlvdU1qWTZQa0pHU2s1U1ZscGVZbVpxYm5KMmVuNkNob3FPa3BhYW5xS21xcTZ5dHJxK3dzYkt6dExXMnQ3aTV1cnU4dmI2L3dNSEN3OFRGeHNmSXljckx6TTNPejlEUjB0UFUxZGJYMk5uYTI5emQzdC9nNGVMajVPWG01K2pwNnV2czdlN3Y4UEh5OC9UMTl2ZjQrZnI3L1AzKy93PT1cIiIpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9iaW5hcnkuYnl0ZXMudG9fYSkudG8gZXEoKDAuLi4yNTYpLnRvX2EpCisgICAgZW5kCisgIAorICAgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHJlYXNvbmFibGUgdG9fcyIgZG8KKyAgICAgIGV4cGVjdChAcHJvdC50b19zKS50byBlcSgianNvbihtZW1vcnkpIikKICAgICBlbmQKICAgZW5kCiAKICAgZGVzY3JpYmUgVGhyaWZ0OjpKc29uUHJvdG9jb2xGYWN0b3J5IGRvCiAgICAgaXQgInNob3VsZCBjcmVhdGUgYSBKc29uUHJvdG9jb2wiIGRvCi0gICAgICBUaHJpZnQ6Okpzb25Qcm90b2NvbEZhY3RvcnkubmV3LmdldF9wcm90b2NvbChtb2NrKCJNb2NrVHJhbnNwb3J0IikpLnNob3VsZCBiZV9pbnN0YW5jZV9vZihUaHJpZnQ6Okpzb25Qcm90b2NvbCkKKyAgICAgIGV4cGVjdChUaHJpZnQ6Okpzb25Qcm90b2NvbEZhY3RvcnkubmV3LmdldF9wcm90b2NvbChkb3VibGUoIk1vY2tUcmFuc3BvcnQiKSkpLnRvIGJlX2luc3RhbmNlX29mKFRocmlmdDo6SnNvblByb3RvY29sKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCBwcm92aWRlIGEgcmVhc29uYWJsZSB0b19zIiBkbworICAgICAgZXhwZWN0KFRocmlmdDo6SnNvblByb3RvY29sRmFjdG9yeS5uZXcudG9fcykudG8gZXEoImpzb24iKQogICAgIGVuZAogICBlbmQKIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvbmFtZXNwYWNlZF9zcGVjLnJiIGIvbGliL3JiL3NwZWMvbmFtZXNwYWNlZF9zcGVjLnJiCmluZGV4IDhkNGY4OGIuLjRkNmQzNjkgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9zcGVjL25hbWVzcGFjZWRfc3BlYy5yYgorKysgYi9saWIvcmIvc3BlYy9uYW1lc3BhY2VkX3NwZWMucmIKQEAgLTMyLDcgKzMyLDcgQEAKICAgICAgIm90aGVyX25hbWVzcGFjZS9yZWZlcmVuY2VkX2NvbnN0YW50cy5yYiIsCiAgICAgICJvdGhlcl9uYW1lc3BhY2UvcmVmZXJlbmNlZF90eXBlcy5yYiIKICAgICBdLmVhY2ggZG8gfG5hbWV8Ci0gICAgICBGaWxlLmV4aXN0PyhGaWxlLmpvaW4ocHJlZml4LCBuYW1lKSkuc2hvdWxkIGJlX3RydWUKKyAgICAgIGV4cGVjdChGaWxlLmV4aXN0PyhGaWxlLmpvaW4ocHJlZml4LCBuYW1lKSkpLnRvIGJlX3RydXRoeQogICAgIGVuZAogICBlbmQKIApAQCAtNDQsMTkgKzQ0LDI0IEBACiAgICAgICJyZWZlcmVuY2VkX2NvbnN0YW50cy5yYiIsCiAgICAgICJyZWZlcmVuY2VkX3R5cGVzLnJiIgogICAgIF0uZWFjaCBkbyB8bmFtZXwKLSAgICAgIEZpbGUuZXhpc3Q/KEZpbGUuam9pbihwcmVmaXgsIG5hbWUpKS5zaG91bGRfbm90IGJlX3RydWUKKyAgICAgIGV4cGVjdChGaWxlLmV4aXN0PyhGaWxlLmpvaW4ocHJlZml4LCBuYW1lKSkpLm5vdF90byBiZV90cnV0aHkKICAgICBlbmQKICAgZW5kCiAKICAgaXQgImhhcyBhIHNlcnZpY2UgY2xhc3MgaW4gdGhlIHJpZ2h0IHBsYWNlIiBkbwotICAgIGRlZmluZWQ/KE5hbWVzcGFjZWRTcGVjTmFtZXNwYWNlOjpOYW1lc3BhY2VkTm9uYmxvY2tpbmdTZXJ2aWNlKS5zaG91bGQgYmVfdHJ1ZQorICAgIGV4cGVjdChkZWZpbmVkPyhOYW1lc3BhY2VkU3BlY05hbWVzcGFjZTo6TmFtZXNwYWNlZE5vbmJsb2NraW5nU2VydmljZSkpLnRvIGJlX3RydXRoeQogICBlbmQKIAogICBpdCAiaGFzIGEgc3RydWN0IGluIHRoZSByaWdodCBwbGFjZSIgZG8KLSAgICBkZWZpbmVkPyhOYW1lc3BhY2VkU3BlY05hbWVzcGFjZTo6SGVsbG8pLnNob3VsZCBiZV90cnVlCisgICAgZXhwZWN0KGRlZmluZWQ/KE5hbWVzcGFjZWRTcGVjTmFtZXNwYWNlOjpIZWxsbykpLnRvIGJlX3RydXRoeQogICBlbmQKIAogICBpdCAicmVxdWlyZWQgYW4gaW5jbHVkZWQgZmlsZSIgZG8KLSAgICBkZWZpbmVkPyhPdGhlck5hbWVzcGFjZTo6U29tZUVudW0pLnNob3VsZCBiZV90cnVlCisgICAgZXhwZWN0KGRlZmluZWQ/KE90aGVyTmFtZXNwYWNlOjpTb21lRW51bSkpLnRvIGJlX3RydXRoeQogICBlbmQKKworICBpdCAiZXh0ZW5kZWQgYSBzZXJ2aWNlIiBkbworICAgIHJlcXVpcmUgImV4dGVuZGVkL2V4dGVuZGVkX3NlcnZpY2UiCisgIGVuZAorCiBlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL25vbmJsb2NraW5nX3NlcnZlcl9zcGVjLnJiIGIvbGliL3JiL3NwZWMvbm9uYmxvY2tpbmdfc2VydmVyX3NwZWMucmIKaW5kZXggNzEyY2Y0NS4uNjEzZDg4MyAxMDA2NDQKLS0tIGEvbGliL3JiL3NwZWMvbm9uYmxvY2tpbmdfc2VydmVyX3NwZWMucmIKKysrIGIvbGliL3JiL3NwZWMvbm9uYmxvY2tpbmdfc2VydmVyX3NwZWMucmIKQEAgLTE3Niw4ICsxNzYsOCBAQAogCiAgICAgaXQgInNob3VsZCBoYW5kbGUgYmFzaWMgbWVzc2FnZSBwYXNzaW5nIiBkbwogICAgICAgY2xpZW50ID0gc2V0dXBfY2xpZW50Ci0gICAgICBjbGllbnQuZ3JlZXRpbmcodHJ1ZSkuc2hvdWxkID09IFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldwotICAgICAgY2xpZW50LmdyZWV0aW5nKGZhbHNlKS5zaG91bGQgPT0gU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3KDpncmVldGluZyA9PiAnQWxvaGEhJykKKyAgICAgIGV4cGVjdChjbGllbnQuZ3JlZXRpbmcodHJ1ZSkpLnRvIGVxKFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldykKKyAgICAgIGV4cGVjdChjbGllbnQuZ3JlZXRpbmcoZmFsc2UpKS50byBlcShTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcoOmdyZWV0aW5nID0+ICdBbG9oYSEnKSkKICAgICAgIEBzZXJ2ZXIuc2h1dGRvd24KICAgICBlbmQKIApAQCAtMTk1LDcgKzE5NSw3IEBACiAgICAgICBlbmQKICAgICAgIDQudGltZXMgeyB0cmFuc19xdWV1ZS5wb3AgfQogICAgICAgc2V0dXBfY2xpZW50LnVuYmxvY2soNCkKLSAgICAgIDQudGltZXMgeyBxdWV1ZS5wb3Auc2hvdWxkIGJlX3RydWUgfQorICAgICAgNC50aW1lcyB7IGV4cGVjdChxdWV1ZS5wb3ApLnRvIGJlX3RydXRoeSB9CiAgICAgICBAc2VydmVyLnNodXRkb3duCiAgICAgZW5kCiAKQEAgLTIxMiwxNSArMjEyLDE1IEBACiAgICAgICBxdWV1ZXNbNF0gPDwgOmhlbGxvCiAgICAgICBxdWV1ZXNbNV0gPDwgOmhlbGxvCiAgICAgICBxdWV1ZXNbNl0gPDwgOmhlbGxvCi0gICAgICAzLnRpbWVzIHsgcmVzdWx0LnBvcC5zaG91bGQgPT0gU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3IH0KLSAgICAgIGNsaWVudC5ncmVldGluZyh0cnVlKS5zaG91bGQgPT0gU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3CisgICAgICAzLnRpbWVzIHsgZXhwZWN0KHJlc3VsdC5wb3ApLnRvIGVxKFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldykgfQorICAgICAgZXhwZWN0KGNsaWVudC5ncmVldGluZyh0cnVlKSkudG8gZXEoU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3KQogICAgICAgcXVldWVzWzVdIDw8IFs6dW5ibG9jaywgNF0KLSAgICAgIDQudGltZXMgeyByZXN1bHQucG9wLnNob3VsZCBiZV90cnVlIH0KKyAgICAgIDQudGltZXMgeyBleHBlY3QocmVzdWx0LnBvcCkudG8gYmVfdHJ1dGh5IH0KICAgICAgIHF1ZXVlc1syXSA8PCA6aGVsbG8KLSAgICAgIHJlc3VsdC5wb3Auc2hvdWxkID09IFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldwotICAgICAgY2xpZW50LmdyZWV0aW5nKGZhbHNlKS5zaG91bGQgPT0gU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3KDpncmVldGluZyA9PiAnQWxvaGEhJykKKyAgICAgIGV4cGVjdChyZXN1bHQucG9wKS50byBlcShTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcpCisgICAgICBleHBlY3QoY2xpZW50LmdyZWV0aW5nKGZhbHNlKSkudG8gZXEoU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3KDpncmVldGluZyA9PiAnQWxvaGEhJykpCiAgICAgICA3LnRpbWVzIHsgcXVldWVzLnNoaWZ0IDw8IDpleGl0IH0KLSAgICAgIGNsaWVudC5ncmVldGluZyh0cnVlKS5zaG91bGQgPT0gU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3CisgICAgICBleHBlY3QoY2xpZW50LmdyZWV0aW5nKHRydWUpKS50byBlcShTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcpCiAgICAgICBAc2VydmVyLnNodXRkb3duCiAgICAgZW5kCiAKQEAgLTIyOSw3ICsyMjksNyBAQAogICAgICAgY2xpZW50ID0gc2V0dXBfY2xpZW50CiAgICAgICBjbGllbnQuZ3JlZXRpbmcoZmFsc2UpICMgZm9yY2UgYSBtZXNzYWdlIHBhc3MKICAgICAgIEBzZXJ2ZXIuc2h1dGRvd24KLSAgICAgIEBzZXJ2ZXJfdGhyZWFkLmpvaW4oMikuc2hvdWxkIGJlX2FuX2luc3RhbmNlX29mKFRocmVhZCkKKyAgICAgIGV4cGVjdChAc2VydmVyX3RocmVhZC5qb2luKDIpKS50byBiZV9hbl9pbnN0YW5jZV9vZihUaHJlYWQpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGNvbnRpbnVlIHByb2Nlc3NpbmcgYWN0aXZlIG1lc3NhZ2VzIHdoZW4gc2h1dHRpbmcgZG93biIgZG8KQEAgLTIzOCw4ICsyMzgsOCBAQAogICAgICAgY2xpZW50IDw8IDpzbGVlcAogICAgICAgc2xlZXAgMC4xICMgZ2l2ZSB0aGUgc2VydmVyIHRpbWUgdG8gc3RhcnQgcHJvY2Vzc2luZyB0aGUgY2xpZW50J3MgbWVzc2FnZQogICAgICAgQHNlcnZlci5zaHV0ZG93bgotICAgICAgQHNlcnZlcl90aHJlYWQuam9pbigyKS5zaG91bGQgYmVfYW5faW5zdGFuY2Vfb2YoVGhyZWFkKQotICAgICAgcmVzdWx0LnBvcC5zaG91bGQgPT0gOnNsZXB0CisgICAgICBleHBlY3QoQHNlcnZlcl90aHJlYWQuam9pbigyKSkudG8gYmVfYW5faW5zdGFuY2Vfb2YoVGhyZWFkKQorICAgICAgZXhwZWN0KHJlc3VsdC5wb3ApLnRvIGVxKDpzbGVwdCkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQga2lsbCBhY3RpdmUgbWVzc2FnZXMgd2hlbiB0aGV5IGRvbid0IGV4cGlyZSB3aGlsZSBzaHV0dGluZyBkb3duIiBkbwpAQCAtMjQ5LDE1ICsyNDksMTUgQEAKICAgICAgIHNsZWVwIDAuMSAjIHN0YXJ0IHByb2Nlc3NpbmcgdGhlIGNsaWVudCdzIG1lc3NhZ2UKICAgICAgIEBzZXJ2ZXIuc2h1dGRvd24oMSkKICAgICAgIEBjYXRjaF9leGNlcHRpb25zID0gdHJ1ZQotICAgICAgQHNlcnZlcl90aHJlYWQuam9pbigzKS5zaG91bGRfbm90IGJlX25pbAotICAgICAgcmVzdWx0LnNob3VsZCBiZV9lbXB0eQorICAgICAgZXhwZWN0KEBzZXJ2ZXJfdGhyZWFkLmpvaW4oMykpLm5vdF90byBiZV9uaWwKKyAgICAgIGV4cGVjdChyZXN1bHQpLnRvIGJlX2VtcHR5CiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGFsbG93IHNodXR0aW5nIGRvd24gaW4gcmVzcG9uc2UgdG8gYSBtZXNzYWdlIiBkbwogICAgICAgY2xpZW50ID0gc2V0dXBfY2xpZW50Ci0gICAgICBjbGllbnQuZ3JlZXRpbmcodHJ1ZSkuc2hvdWxkID09IFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldworICAgICAgZXhwZWN0KGNsaWVudC5ncmVldGluZyh0cnVlKSkudG8gZXEoU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3KQogICAgICAgY2xpZW50LnNodXRkb3duCi0gICAgICBAc2VydmVyX3RocmVhZC5qb2luKDIpLnNob3VsZF9ub3QgYmVfbmlsCisgICAgICBleHBlY3QoQHNlcnZlcl90aHJlYWQuam9pbigyKSkubm90X3RvIGJlX25pbAogICAgIGVuZAogICBlbmQKIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvcHJvY2Vzc29yX3NwZWMucmIgYi9saWIvcmIvc3BlYy9wcm9jZXNzb3Jfc3BlYy5yYgppbmRleCA5ODlmNWNjLi5kMzA1NTNmIDEwMDY0NAotLS0gYS9saWIvcmIvc3BlYy9wcm9jZXNzb3Jfc3BlYy5yYgorKysgYi9saWIvcmIvc3BlYy9wcm9jZXNzb3Jfc3BlYy5yYgpAQCAtMjcsNTIgKzI3LDUyIEBACiAKICAgZGVzY3JpYmUgVGhyaWZ0OjpQcm9jZXNzb3IgZG8KICAgICBiZWZvcmUoOmVhY2gpIGRvCi0gICAgICBAcHJvY2Vzc29yID0gUHJvY2Vzc29yU3BlYy5uZXcobW9jaygiTW9ja0hhbmRsZXIiKSkKLSAgICAgIEBwcm90ID0gbW9jaygiTW9ja1Byb3RvY29sIikKKyAgICAgIEBwcm9jZXNzb3IgPSBQcm9jZXNzb3JTcGVjLm5ldyhkb3VibGUoIk1vY2tIYW5kbGVyIikpCisgICAgICBAcHJvdCA9IGRvdWJsZSgiTW9ja1Byb3RvY29sIikKICAgICBlbmQKIAogICAgIGRlZiBtb2NrX3RyYW5zKG9iaikKLSAgICAgIG9iai5zaG91bGRfcmVjZWl2ZSg6dHJhbnMpLm9yZGVyZWQuYW5kX3JldHVybiBkbwotICAgICAgICBtb2NrKCJ0cmFucyIpLnRhcCBkbyB8dHJhbnN8Ci0gICAgICAgICAgdHJhbnMuc2hvdWxkX3JlY2VpdmUoOmZsdXNoKS5vcmRlcmVkCisgICAgICBleHBlY3Qob2JqKS50byByZWNlaXZlKDp0cmFucykub3JkZXJlZCBkbworICAgICAgICBkb3VibGUoInRyYW5zIikudGFwIGRvIHx0cmFuc3wKKyAgICAgICAgICBleHBlY3QodHJhbnMpLnRvIHJlY2VpdmUoOmZsdXNoKS5vcmRlcmVkCiAgICAgICAgIGVuZAogICAgICAgZW5kCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGNhbGwgcHJvY2Vzc188bWVzc2FnZT4gd2hlbiBpdCByZWNlaXZlcyB0aGF0IG1lc3NhZ2UiIGRvCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9tZXNzYWdlX2JlZ2luKS5vcmRlcmVkLmFuZF9yZXR1cm4gWyd0ZXN0TWVzc2FnZScsIFRocmlmdDo6TWVzc2FnZVR5cGVzOjpDQUxMLCAxN10KLSAgICAgIEBwcm9jZXNzb3Iuc2hvdWxkX3JlY2VpdmUoOnByb2Nlc3NfdGVzdE1lc3NhZ2UpLndpdGgoMTcsIEBwcm90LCBAcHJvdCkub3JkZXJlZAotICAgICAgQHByb2Nlc3Nvci5wcm9jZXNzKEBwcm90LCBAcHJvdCkuc2hvdWxkID09IHRydWUKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9tZXNzYWdlX2JlZ2luKS5vcmRlcmVkLmFuZF9yZXR1cm4gWyd0ZXN0TWVzc2FnZScsIFRocmlmdDo6TWVzc2FnZVR5cGVzOjpDQUxMLCAxN10KKyAgICAgIGV4cGVjdChAcHJvY2Vzc29yKS50byByZWNlaXZlKDpwcm9jZXNzX3Rlc3RNZXNzYWdlKS53aXRoKDE3LCBAcHJvdCwgQHByb3QpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvY2Vzc29yLnByb2Nlc3MoQHByb3QsIEBwcm90KSkudG8gZXEodHJ1ZSkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmFpc2UgYW4gQXBwbGljYXRpb25FeGNlcHRpb24gd2hlbiB0aGUgcmVjZWl2ZWQgbWVzc2FnZSBjYW5ub3QgYmUgcHJvY2Vzc2VkIiBkbwotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfbWVzc2FnZV9iZWdpbikub3JkZXJlZC5hbmRfcmV0dXJuIFsndGVzdE1lc3NhZ2UnLCBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6Q0FMTCwgNF0KLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpza2lwKS53aXRoKFRocmlmdDo6VHlwZXM6OlNUUlVDVCkub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfbWVzc2FnZV9lbmQpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9tZXNzYWdlX2JlZ2luKS53aXRoKCd0ZXN0TWVzc2FnZScsIFRocmlmdDo6TWVzc2FnZVR5cGVzOjpFWENFUFRJT04sIDQpLm9yZGVyZWQKLSAgICAgIGUgPSBtb2NrKFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb24pCi0gICAgICBlLnNob3VsZF9yZWNlaXZlKDp3cml0ZSkud2l0aChAcHJvdCkub3JkZXJlZAotICAgICAgVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbi5zaG91bGRfcmVjZWl2ZSg6bmV3KS53aXRoKFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb246OlVOS05PV05fTUVUSE9ELCAiVW5rbm93biBmdW5jdGlvbiB0ZXN0TWVzc2FnZSIpLmFuZF9yZXR1cm4oZSkKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9tZXNzYWdlX2VuZCkub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX21lc3NhZ2VfYmVnaW4pLm9yZGVyZWQuYW5kX3JldHVybiBbJ3Rlc3RNZXNzYWdlJywgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OkNBTEwsIDRdCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnNraXApLndpdGgoVGhyaWZ0OjpUeXBlczo6U1RSVUNUKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfbWVzc2FnZV9lbmQpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfbWVzc2FnZV9iZWdpbikud2l0aCgndGVzdE1lc3NhZ2UnLCBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6RVhDRVBUSU9OLCA0KS5vcmRlcmVkCisgICAgICBlID0gZG91YmxlKFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb24pCisgICAgICBleHBlY3QoZSkudG8gcmVjZWl2ZSg6d3JpdGUpLndpdGgoQHByb3QpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uKS50byByZWNlaXZlKDpuZXcpLndpdGgoVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6VU5LTk9XTl9NRVRIT0QsICJVbmtub3duIGZ1bmN0aW9uIHRlc3RNZXNzYWdlIikuYW5kX3JldHVybihlKQorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV9tZXNzYWdlX2VuZCkub3JkZXJlZAogICAgICAgbW9ja190cmFucyhAcHJvdCkKICAgICAgIEBwcm9jZXNzb3IucHJvY2VzcyhAcHJvdCwgQHByb3QpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHBhc3MgYXJncyBvZmYgdG8gdGhlIGFyZ3MgY2xhc3MiIGRvCi0gICAgICBhcmdzX2NsYXNzID0gbW9jaygiTW9ja0FyZ3NDbGFzcyIpCi0gICAgICBhcmdzID0gbW9jaygiIzxNb2NrQXJnc0NsYXNzOm1vY2s+IikudGFwIGRvIHxhcmdzfAotICAgICAgICBhcmdzLnNob3VsZF9yZWNlaXZlKDpyZWFkKS53aXRoKEBwcm90KS5vcmRlcmVkCisgICAgICBhcmdzX2NsYXNzID0gZG91YmxlKCJNb2NrQXJnc0NsYXNzIikKKyAgICAgIGFyZ3MgPSBkb3VibGUoIiM8TW9ja0FyZ3NDbGFzczptb2NrPiIpLnRhcCBkbyB8YXJnc3wKKyAgICAgICAgZXhwZWN0KGFyZ3MpLnRvIHJlY2VpdmUoOnJlYWQpLndpdGgoQHByb3QpLm9yZGVyZWQKICAgICAgIGVuZAotICAgICAgYXJnc19jbGFzcy5zaG91bGRfcmVjZWl2ZSg6bmV3KS5hbmRfcmV0dXJuIGFyZ3MKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX21lc3NhZ2VfZW5kKS5vcmRlcmVkCi0gICAgICBAcHJvY2Vzc29yLnJlYWRfYXJncyhAcHJvdCwgYXJnc19jbGFzcykuc2hvdWxkIGVxbChhcmdzKQorICAgICAgZXhwZWN0KGFyZ3NfY2xhc3MpLnRvIHJlY2VpdmUoOm5ldykuYW5kX3JldHVybiBhcmdzCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfbWVzc2FnZV9lbmQpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvY2Vzc29yLnJlYWRfYXJncyhAcHJvdCwgYXJnc19jbGFzcykpLnRvIGVxbChhcmdzKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCB3cml0ZSBvdXQgYSByZXBseSB3aGVuIGFza2VkIiBkbwotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX21lc3NhZ2VfYmVnaW4pLndpdGgoJ3Rlc3RNZXNzYWdlJywgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OlJFUExZLCAyMykub3JkZXJlZAotICAgICAgcmVzdWx0ID0gbW9jaygiTW9ja1Jlc3VsdCIpCi0gICAgICByZXN1bHQuc2hvdWxkX3JlY2VpdmUoOndyaXRlKS53aXRoKEBwcm90KS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfbWVzc2FnZV9lbmQpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfbWVzc2FnZV9iZWdpbikud2l0aCgndGVzdE1lc3NhZ2UnLCBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6UkVQTFksIDIzKS5vcmRlcmVkCisgICAgICByZXN1bHQgPSBkb3VibGUoIk1vY2tSZXN1bHQiKQorICAgICAgZXhwZWN0KHJlc3VsdCkudG8gcmVjZWl2ZSg6d3JpdGUpLndpdGgoQHByb3QpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfbWVzc2FnZV9lbmQpLm9yZGVyZWQKICAgICAgIG1vY2tfdHJhbnMoQHByb3QpCiAgICAgICBAcHJvY2Vzc29yLndyaXRlX3Jlc3VsdChyZXN1bHQsIEBwcm90LCAndGVzdE1lc3NhZ2UnLCAyMykKICAgICBlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL3NlcmlhbGl6ZXJfc3BlYy5yYiBiL2xpYi9yYi9zcGVjL3NlcmlhbGl6ZXJfc3BlYy5yYgppbmRleCA1OTliNDU0Li4yYTdkYzZkIDEwMDY0NAotLS0gYS9saWIvcmIvc3BlYy9zZXJpYWxpemVyX3NwZWMucmIKKysrIGIvbGliL3JiL3NwZWMvc2VyaWFsaXplcl9zcGVjLnJiCkBAIC0yNSwxOSArMjUsMTkgQEAKICAgICBpdCAic2hvdWxkIHNlcmlhbGl6ZSBzdHJ1Y3RzIHRvIGJpbmFyeSBieSBkZWZhdWx0IiBkbwogICAgICAgc2VyaWFsaXplciA9IFRocmlmdDo6U2VyaWFsaXplci5uZXcoVGhyaWZ0OjpCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeS5uZXcpCiAgICAgICBkYXRhID0gc2VyaWFsaXplci5zZXJpYWxpemUoU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3KDpncmVldGluZyA9PiAiJ0VsbG8gZ3V2J25vciEiKSkKLSAgICAgIGRhdGEuc2hvdWxkID09ICJceDBCXHgwMFx4MDFceDAwXHgwMFx4MDBceDBFJ0VsbG8gZ3V2J25vciFceDAwIgorICAgICAgZXhwZWN0KGRhdGEpLnRvIGVxKCJceDBCXHgwMFx4MDFceDAwXHgwMFx4MDBceDBFJ0VsbG8gZ3V2J25vciFceDAwIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgc2VyaWFsaXplIHN0cnVjdHMgdG8gdGhlIGdpdmVuIHByb3RvY29sIiBkbwotICAgICAgcHJvdG9jb2wgPSBUaHJpZnQ6OkJhc2VQcm90b2NvbC5uZXcobW9jaygidHJhbnNwb3J0IikpCi0gICAgICBwcm90b2NvbC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2JlZ2luKS53aXRoKCJTcGVjTmFtZXNwYWNlOjpIZWxsbyIpCi0gICAgICBwcm90b2NvbC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoImdyZWV0aW5nIiwgVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCAxKQotICAgICAgcHJvdG9jb2wuc2hvdWxkX3JlY2VpdmUoOndyaXRlX3N0cmluZykud2l0aCgiR29vZCBkYXkiKQotICAgICAgcHJvdG9jb2wuc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX2VuZCkKLSAgICAgIHByb3RvY29sLnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9zdG9wKQotICAgICAgcHJvdG9jb2wuc2hvdWxkX3JlY2VpdmUoOndyaXRlX3N0cnVjdF9lbmQpCi0gICAgICBwcm90b2NvbF9mYWN0b3J5ID0gbW9jaygiUHJvdG9jb2xGYWN0b3J5IikKLSAgICAgIHByb3RvY29sX2ZhY3Rvcnkuc3R1YiEoOmdldF9wcm90b2NvbCkuYW5kX3JldHVybihwcm90b2NvbCkKKyAgICAgIHByb3RvY29sID0gVGhyaWZ0OjpCYXNlUHJvdG9jb2wubmV3KGRvdWJsZSgidHJhbnNwb3J0IikpCisgICAgICBleHBlY3QocHJvdG9jb2wpLnRvIHJlY2VpdmUoOndyaXRlX3N0cnVjdF9iZWdpbikud2l0aCgiU3BlY05hbWVzcGFjZTo6SGVsbG8iKQorICAgICAgZXhwZWN0KHByb3RvY29sKS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgiZ3JlZXRpbmciLCBUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDEpCisgICAgICBleHBlY3QocHJvdG9jb2wpLnRvIHJlY2VpdmUoOndyaXRlX3N0cmluZykud2l0aCgiR29vZCBkYXkiKQorICAgICAgZXhwZWN0KHByb3RvY29sKS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9lbmQpCisgICAgICBleHBlY3QocHJvdG9jb2wpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX3N0b3ApCisgICAgICBleHBlY3QocHJvdG9jb2wpLnRvIHJlY2VpdmUoOndyaXRlX3N0cnVjdF9lbmQpCisgICAgICBwcm90b2NvbF9mYWN0b3J5ID0gZG91YmxlKCJQcm90b2NvbEZhY3RvcnkiKQorICAgICAgYWxsb3cocHJvdG9jb2xfZmFjdG9yeSkudG8gcmVjZWl2ZSg6Z2V0X3Byb3RvY29sKS5hbmRfcmV0dXJuKHByb3RvY29sKQogICAgICAgc2VyaWFsaXplciA9IFRocmlmdDo6U2VyaWFsaXplci5uZXcocHJvdG9jb2xfZmFjdG9yeSkKICAgICAgIHNlcmlhbGl6ZXIuc2VyaWFsaXplKFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldyg6Z3JlZXRpbmcgPT4gIkdvb2QgZGF5IikpCiAgICAgZW5kCkBAIC00NywyMSArNDcsMjEgQEAKICAgICBpdCAic2hvdWxkIGRlc2VyaWFsaXplIHN0cnVjdHMgZnJvbSBiaW5hcnkgYnkgZGVmYXVsdCIgZG8KICAgICAgIGRlc2VyaWFsaXplciA9IFRocmlmdDo6RGVzZXJpYWxpemVyLm5ldwogICAgICAgZGF0YSA9ICJceDBCXHgwMFx4MDFceDAwXHgwMFx4MDBceDBFJ0VsbG8gZ3V2J25vciFceDAwIgotICAgICAgZGVzZXJpYWxpemVyLmRlc2VyaWFsaXplKFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldywgZGF0YSkuc2hvdWxkID09IFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldyg6Z3JlZXRpbmcgPT4gIidFbGxvIGd1didub3IhIikKKyAgICAgIGV4cGVjdChkZXNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3LCBkYXRhKSkudG8gZXEoU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3KDpncmVldGluZyA9PiAiJ0VsbG8gZ3V2J25vciEiKSkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgZGVzZXJpYWxpemUgc3RydWN0cyBmcm9tIHRoZSBnaXZlbiBwcm90b2NvbCIgZG8KLSAgICAgIHByb3RvY29sID0gVGhyaWZ0OjpCYXNlUHJvdG9jb2wubmV3KG1vY2soInRyYW5zcG9ydCIpKQotICAgICAgcHJvdG9jb2wuc2hvdWxkX3JlY2VpdmUoOnJlYWRfc3RydWN0X2JlZ2luKS5hbmRfcmV0dXJuKCJTcGVjTmFtZXNwYWNlOjpIZWxsbyIpCi0gICAgICBwcm90b2NvbC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9maWVsZF9iZWdpbikuYW5kX3JldHVybihbImdyZWV0aW5nIiwgVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCAxXSwKKyAgICAgIHByb3RvY29sID0gVGhyaWZ0OjpCYXNlUHJvdG9jb2wubmV3KGRvdWJsZSgidHJhbnNwb3J0IikpCisgICAgICBleHBlY3QocHJvdG9jb2wpLnRvIHJlY2VpdmUoOnJlYWRfc3RydWN0X2JlZ2luKS5hbmRfcmV0dXJuKCJTcGVjTmFtZXNwYWNlOjpIZWxsbyIpCisgICAgICBleHBlY3QocHJvdG9jb2wpLnRvIHJlY2VpdmUoOnJlYWRfZmllbGRfYmVnaW4pLmFuZF9yZXR1cm4oWyJncmVldGluZyIsIFRocmlmdDo6VHlwZXM6OlNUUklORywgMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmlsLCBUaHJpZnQ6OlR5cGVzOjpTVE9QLCAwXSkKLSAgICAgIHByb3RvY29sLnNob3VsZF9yZWNlaXZlKDpyZWFkX3N0cmluZykuYW5kX3JldHVybigiR29vZCBkYXkiKQotICAgICAgcHJvdG9jb2wuc2hvdWxkX3JlY2VpdmUoOnJlYWRfZmllbGRfZW5kKQotICAgICAgcHJvdG9jb2wuc2hvdWxkX3JlY2VpdmUoOnJlYWRfc3RydWN0X2VuZCkKLSAgICAgIHByb3RvY29sX2ZhY3RvcnkgPSBtb2NrKCJQcm90b2NvbEZhY3RvcnkiKQotICAgICAgcHJvdG9jb2xfZmFjdG9yeS5zdHViISg6Z2V0X3Byb3RvY29sKS5hbmRfcmV0dXJuKHByb3RvY29sKQorICAgICAgZXhwZWN0KHByb3RvY29sKS50byByZWNlaXZlKDpyZWFkX3N0cmluZykuYW5kX3JldHVybigiR29vZCBkYXkiKQorICAgICAgZXhwZWN0KHByb3RvY29sKS50byByZWNlaXZlKDpyZWFkX2ZpZWxkX2VuZCkKKyAgICAgIGV4cGVjdChwcm90b2NvbCkudG8gcmVjZWl2ZSg6cmVhZF9zdHJ1Y3RfZW5kKQorICAgICAgcHJvdG9jb2xfZmFjdG9yeSA9IGRvdWJsZSgiUHJvdG9jb2xGYWN0b3J5IikKKyAgICAgIGFsbG93KHByb3RvY29sX2ZhY3RvcnkpLnRvIHJlY2VpdmUoOmdldF9wcm90b2NvbCkuYW5kX3JldHVybihwcm90b2NvbCkKICAgICAgIGRlc2VyaWFsaXplciA9IFRocmlmdDo6RGVzZXJpYWxpemVyLm5ldyhwcm90b2NvbF9mYWN0b3J5KQotICAgICAgZGVzZXJpYWxpemVyLmRlc2VyaWFsaXplKFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldywgIiIpLnNob3VsZCA9PSBTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcoOmdyZWV0aW5nID0+ICJHb29kIGRheSIpCisgICAgICBleHBlY3QoZGVzZXJpYWxpemVyLmRlc2VyaWFsaXplKFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldywgIiIpKS50byBlcShTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcoOmdyZWV0aW5nID0+ICJHb29kIGRheSIpKQogICAgIGVuZAogICBlbmQKIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvc2VydmVyX3NvY2tldF9zcGVjLnJiIGIvbGliL3JiL3NwZWMvc2VydmVyX3NvY2tldF9zcGVjLnJiCmluZGV4IDEzMDFkNTQuLmVjOWU1NTAgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9zcGVjL3NlcnZlcl9zb2NrZXRfc3BlYy5yYgorKysgYi9saWIvcmIvc3BlYy9zZXJ2ZXJfc29ja2V0X3NwZWMucmIKQEAgLTI4LDUyICsyOCw1NyBAQAogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBjcmVhdGUgYSBoYW5kbGUgd2hlbiBjYWxsaW5nIGxpc3RlbiIgZG8KLSAgICAgIFRDUFNlcnZlci5zaG91bGRfcmVjZWl2ZSg6bmV3KS53aXRoKG5pbCwgMTIzNCkKKyAgICAgIGV4cGVjdChUQ1BTZXJ2ZXIpLnRvIHJlY2VpdmUoOm5ldykud2l0aChuaWwsIDEyMzQpCiAgICAgICBAc29ja2V0Lmxpc3RlbgogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBhY2NlcHQgYW4gb3B0aW9uYWwgaG9zdCBhcmd1bWVudCIgZG8KICAgICAgIEBzb2NrZXQgPSBUaHJpZnQ6OlNlcnZlclNvY2tldC5uZXcoJ2xvY2FsaG9zdCcsIDEyMzQpCi0gICAgICBUQ1BTZXJ2ZXIuc2hvdWxkX3JlY2VpdmUoOm5ldykud2l0aCgnbG9jYWxob3N0JywgMTIzNCkKKyAgICAgIGV4cGVjdChUQ1BTZXJ2ZXIpLnRvIHJlY2VpdmUoOm5ldykud2l0aCgnbG9jYWxob3N0JywgMTIzNCkKKyAgICAgIEBzb2NrZXQudG9fcyA9PSAic2VydmVyKGxvY2FsaG9zdDoxMjM0KSIKICAgICAgIEBzb2NrZXQubGlzdGVuCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGNyZWF0ZSBhIFRocmlmdDo6U29ja2V0IHRvIHdyYXAgYWNjZXB0ZWQgc29ja2V0cyIgZG8KLSAgICAgIGhhbmRsZSA9IG1vY2soIlRDUFNlcnZlciIpCi0gICAgICBUQ1BTZXJ2ZXIuc2hvdWxkX3JlY2VpdmUoOm5ldykud2l0aChuaWwsIDEyMzQpLmFuZF9yZXR1cm4oaGFuZGxlKQorICAgICAgaGFuZGxlID0gZG91YmxlKCJUQ1BTZXJ2ZXIiKQorICAgICAgZXhwZWN0KFRDUFNlcnZlcikudG8gcmVjZWl2ZSg6bmV3KS53aXRoKG5pbCwgMTIzNCkuYW5kX3JldHVybihoYW5kbGUpCiAgICAgICBAc29ja2V0Lmxpc3RlbgotICAgICAgc29jayA9IG1vY2soInNvY2siKQotICAgICAgaGFuZGxlLnNob3VsZF9yZWNlaXZlKDphY2NlcHQpLmFuZF9yZXR1cm4oc29jaykKLSAgICAgIHRyYW5zID0gbW9jaygiU29ja2V0IikKLSAgICAgIFRocmlmdDo6U29ja2V0LnNob3VsZF9yZWNlaXZlKDpuZXcpLmFuZF9yZXR1cm4odHJhbnMpCi0gICAgICB0cmFucy5zaG91bGRfcmVjZWl2ZSg6aGFuZGxlPSkud2l0aChzb2NrKQotICAgICAgQHNvY2tldC5hY2NlcHQuc2hvdWxkID09IHRyYW5zCisgICAgICBzb2NrID0gZG91YmxlKCJzb2NrIikKKyAgICAgIGV4cGVjdChoYW5kbGUpLnRvIHJlY2VpdmUoOmFjY2VwdCkuYW5kX3JldHVybihzb2NrKQorICAgICAgdHJhbnMgPSBkb3VibGUoIlNvY2tldCIpCisgICAgICBleHBlY3QoVGhyaWZ0OjpTb2NrZXQpLnRvIHJlY2VpdmUoOm5ldykuYW5kX3JldHVybih0cmFucykKKyAgICAgIGV4cGVjdCh0cmFucykudG8gcmVjZWl2ZSg6aGFuZGxlPSkud2l0aChzb2NrKQorICAgICAgZXhwZWN0KEBzb2NrZXQuYWNjZXB0KS50byBlcSh0cmFucykKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgY2xvc2UgdGhlIGhhbmRsZSB3aGVuIGNsb3NlZCIgZG8KLSAgICAgIGhhbmRsZSA9IG1vY2soIlRDUFNlcnZlciIsIDpjbG9zZWQ/ID0+IGZhbHNlKQotICAgICAgVENQU2VydmVyLnNob3VsZF9yZWNlaXZlKDpuZXcpLndpdGgobmlsLCAxMjM0KS5hbmRfcmV0dXJuKGhhbmRsZSkKKyAgICAgIGhhbmRsZSA9IGRvdWJsZSgiVENQU2VydmVyIiwgOmNsb3NlZD8gPT4gZmFsc2UpCisgICAgICBleHBlY3QoVENQU2VydmVyKS50byByZWNlaXZlKDpuZXcpLndpdGgobmlsLCAxMjM0KS5hbmRfcmV0dXJuKGhhbmRsZSkKICAgICAgIEBzb2NrZXQubGlzdGVuCi0gICAgICBoYW5kbGUuc2hvdWxkX3JlY2VpdmUoOmNsb3NlKQorICAgICAgZXhwZWN0KGhhbmRsZSkudG8gcmVjZWl2ZSg6Y2xvc2UpCiAgICAgICBAc29ja2V0LmNsb3NlCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJldHVybiBuaWwgd2hlbiBhY2NlcHRpbmcgaWYgdGhlcmUgaXMgbm8gaGFuZGxlIiBkbwotICAgICAgQHNvY2tldC5hY2NlcHQuc2hvdWxkIGJlX25pbAorICAgICAgZXhwZWN0KEBzb2NrZXQuYWNjZXB0KS50byBiZV9uaWwKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmV0dXJuIHRydWUgZm9yIGNsb3NlZD8gd2hlbiBhcHByb3ByaWF0ZSIgZG8KLSAgICAgIGhhbmRsZSA9IG1vY2soIlRDUFNlcnZlciIsIDpjbG9zZWQ/ID0+IGZhbHNlKQotICAgICAgVENQU2VydmVyLnN0dWIhKDpuZXcpLmFuZF9yZXR1cm4oaGFuZGxlKQorICAgICAgaGFuZGxlID0gZG91YmxlKCJUQ1BTZXJ2ZXIiLCA6Y2xvc2VkPyA9PiBmYWxzZSkKKyAgICAgIGFsbG93KFRDUFNlcnZlcikudG8gcmVjZWl2ZSg6bmV3KS5hbmRfcmV0dXJuKGhhbmRsZSkKICAgICAgIEBzb2NrZXQubGlzdGVuCi0gICAgICBAc29ja2V0LnNob3VsZF9ub3QgYmVfY2xvc2VkCi0gICAgICBoYW5kbGUuc3R1YiEoOmNsb3NlKQorICAgICAgZXhwZWN0KEBzb2NrZXQpLm5vdF90byBiZV9jbG9zZWQKKyAgICAgIGFsbG93KGhhbmRsZSkudG8gcmVjZWl2ZSg6Y2xvc2UpCiAgICAgICBAc29ja2V0LmNsb3NlCi0gICAgICBAc29ja2V0LnNob3VsZCBiZV9jbG9zZWQKKyAgICAgIGV4cGVjdChAc29ja2V0KS50byBiZV9jbG9zZWQKICAgICAgIEBzb2NrZXQubGlzdGVuCi0gICAgICBAc29ja2V0LnNob3VsZF9ub3QgYmVfY2xvc2VkCi0gICAgICBoYW5kbGUuc3R1YiEoOmNsb3NlZD8pLmFuZF9yZXR1cm4odHJ1ZSkKLSAgICAgIEBzb2NrZXQuc2hvdWxkIGJlX2Nsb3NlZAorICAgICAgZXhwZWN0KEBzb2NrZXQpLm5vdF90byBiZV9jbG9zZWQKKyAgICAgIGFsbG93KGhhbmRsZSkudG8gcmVjZWl2ZSg6Y2xvc2VkPykuYW5kX3JldHVybih0cnVlKQorICAgICAgZXhwZWN0KEBzb2NrZXQpLnRvIGJlX2Nsb3NlZAorICAgIGVuZAorCisgICAgaXQgInNob3VsZCBwcm92aWRlIGEgcmVhc29uYWJsZSB0b19zIiBkbworICAgICAgZXhwZWN0KEBzb2NrZXQudG9fcykudG8gZXEoInNvY2tldCg6MTIzNCkiKQogICAgIGVuZAogICBlbmQKIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvc2VydmVyX3NwZWMucmIgYi9saWIvcmIvc3BlYy9zZXJ2ZXJfc3BlYy5yYgppbmRleCBlYWVjYmRhLi41N2Y1MjM3IDEwMDY0NAotLS0gYS9saWIvcmIvc3BlYy9zZXJ2ZXJfc3BlYy5yYgorKysgYi9saWIvcmIvc3BlYy9zZXJ2ZXJfc3BlYy5yYgpAQCAtMjEsOTUgKzIxLDEzNSBAQAogZGVzY3JpYmUgJ1NlcnZlcicgZG8KIAogICBkZXNjcmliZSBUaHJpZnQ6OkJhc2VTZXJ2ZXIgZG8KLSAgICBpdCAic2hvdWxkIGRlZmF1bHQgdG8gQmFzZVRyYW5zcG9ydEZhY3RvcnkgYW5kIEJpbmFyeVByb3RvY29sRmFjdG9yeSB3aGVuIG5vdCBzcGVjaWZpZWQiIGRvCi0gICAgICBzZXJ2ZXIgPSBUaHJpZnQ6OkJhc2VTZXJ2ZXIubmV3KG1vY2soIlByb2Nlc3NvciIpLCBtb2NrKCJCYXNlU2VydmVyVHJhbnNwb3J0IikpCi0gICAgICBzZXJ2ZXIuaW5zdGFuY2VfdmFyaWFibGVfZ2V0KDonQHRyYW5zcG9ydF9mYWN0b3J5Jykuc2hvdWxkIGJlX2FuX2luc3RhbmNlX29mKFRocmlmdDo6QmFzZVRyYW5zcG9ydEZhY3RvcnkpCi0gICAgICBzZXJ2ZXIuaW5zdGFuY2VfdmFyaWFibGVfZ2V0KDonQHByb3RvY29sX2ZhY3RvcnknKS5zaG91bGQgYmVfYW5faW5zdGFuY2Vfb2YoVGhyaWZ0OjpCaW5hcnlQcm90b2NvbEZhY3RvcnkpCisgICAgYmVmb3JlKDplYWNoKSBkbworICAgICAgQHByb2Nlc3NvciA9IGRvdWJsZSgiUHJvY2Vzc29yIikKKyAgICAgIEBzZXJ2ZXJUcmFucyA9IGRvdWJsZSgiU2VydmVyVHJhbnNwb3J0IikKKyAgICAgIEB0cmFucyA9IGRvdWJsZSgiQmFzZVRyYW5zcG9ydCIpCisgICAgICBAcHJvdCA9IGRvdWJsZSgiQmFzZVByb3RvY29sIikKKyAgICAgIEBzZXJ2ZXIgPSBkZXNjcmliZWRfY2xhc3MubmV3KEBwcm9jZXNzb3IsIEBzZXJ2ZXJUcmFucywgQHRyYW5zLCBAcHJvdCkKICAgICBlbmQKIAotICAgICMgc2VydmUgaXMgYSBub29wLCBzbyBjYW4ndCB0ZXN0IHRoYXQKKyAgICBpdCAic2hvdWxkIGRlZmF1bHQgdG8gQmFzZVRyYW5zcG9ydEZhY3RvcnkgYW5kIEJpbmFyeVByb3RvY29sRmFjdG9yeSB3aGVuIG5vdCBzcGVjaWZpZWQiIGRvCisgICAgICBAc2VydmVyID0gVGhyaWZ0OjpCYXNlU2VydmVyLm5ldyhkb3VibGUoIlByb2Nlc3NvciIpLCBkb3VibGUoIkJhc2VTZXJ2ZXJUcmFuc3BvcnQiKSkKKyAgICAgIGV4cGVjdChAc2VydmVyLmluc3RhbmNlX3ZhcmlhYmxlX2dldCg6J0B0cmFuc3BvcnRfZmFjdG9yeScpKS50byBiZV9hbl9pbnN0YW5jZV9vZihUaHJpZnQ6OkJhc2VUcmFuc3BvcnRGYWN0b3J5KQorICAgICAgZXhwZWN0KEBzZXJ2ZXIuaW5zdGFuY2VfdmFyaWFibGVfZ2V0KDonQHByb3RvY29sX2ZhY3RvcnknKSkudG8gYmVfYW5faW5zdGFuY2Vfb2YoVGhyaWZ0OjpCaW5hcnlQcm90b2NvbEZhY3RvcnkpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIG5vdCBzZXJ2ZSIgZG8KKyAgICAgIGV4cGVjdCB7IEBzZXJ2ZXIuc2VydmUoKX0udG8gcmFpc2VfZXJyb3IoTm90SW1wbGVtZW50ZWRFcnJvcikKKyAgICBlbmQKKyAgICAKKyAgICBpdCAic2hvdWxkIHByb3ZpZGUgYSByZWFzb25hYmxlIHRvX3MiIGRvCisgICAgICBleHBlY3QoQHNlcnZlclRyYW5zKS50byByZWNlaXZlKDp0b19zKS5vbmNlLmFuZF9yZXR1cm4oInNlcnZlclRyYW5zIikKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOnRvX3MpLm9uY2UuYW5kX3JldHVybigidHJhbnMiKQorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp0b19zKS5vbmNlLmFuZF9yZXR1cm4oInByb3QiKQorICAgICAgZXhwZWN0KEBzZXJ2ZXIudG9fcykudG8gZXEoInNlcnZlcihwcm90KHRyYW5zKHNlcnZlclRyYW5zKSkpIikKKyAgICBlbmQKICAgZW5kCiAKICAgZGVzY3JpYmUgVGhyaWZ0OjpTaW1wbGVTZXJ2ZXIgZG8KICAgICBiZWZvcmUoOmVhY2gpIGRvCi0gICAgICBAcHJvY2Vzc29yID0gbW9jaygiUHJvY2Vzc29yIikKLSAgICAgIEBzZXJ2ZXJUcmFucyA9IG1vY2soIlNlcnZlclRyYW5zcG9ydCIpCi0gICAgICBAdHJhbnMgPSBtb2NrKCJCYXNlVHJhbnNwb3J0IikKLSAgICAgIEBwcm90ID0gbW9jaygiQmFzZVByb3RvY29sIikKLSAgICAgIEBjbGllbnQgPSBtb2NrKCJDbGllbnQiKQorICAgICAgQHByb2Nlc3NvciA9IGRvdWJsZSgiUHJvY2Vzc29yIikKKyAgICAgIEBzZXJ2ZXJUcmFucyA9IGRvdWJsZSgiU2VydmVyVHJhbnNwb3J0IikKKyAgICAgIEB0cmFucyA9IGRvdWJsZSgiQmFzZVRyYW5zcG9ydCIpCisgICAgICBAcHJvdCA9IGRvdWJsZSgiQmFzZVByb3RvY29sIikKKyAgICAgIEBjbGllbnQgPSBkb3VibGUoIkNsaWVudCIpCiAgICAgICBAc2VydmVyID0gZGVzY3JpYmVkX2NsYXNzLm5ldyhAcHJvY2Vzc29yLCBAc2VydmVyVHJhbnMsIEB0cmFucywgQHByb3QpCiAgICAgZW5kCiAgICAgCisgICAgaXQgInNob3VsZCBwcm92aWRlIGEgcmVhc29uYWJsZSB0b19zIiBkbworICAgICAgZXhwZWN0KEBzZXJ2ZXJUcmFucykudG8gcmVjZWl2ZSg6dG9fcykub25jZS5hbmRfcmV0dXJuKCJzZXJ2ZXJUcmFucyIpCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDp0b19zKS5vbmNlLmFuZF9yZXR1cm4oInRyYW5zIikKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6dG9fcykub25jZS5hbmRfcmV0dXJuKCJwcm90IikKKyAgICAgIGV4cGVjdChAc2VydmVyLnRvX3MpLnRvIGVxKCJzaW1wbGUoc2VydmVyKHByb3QodHJhbnMoc2VydmVyVHJhbnMpKSkpIikKKyAgICBlbmQKKyAgICAKICAgICBpdCAic2hvdWxkIHNlcnZlIGluIHRoZSBtYWluIHRocmVhZCIgZG8KLSAgICAgIEBzZXJ2ZXJUcmFucy5zaG91bGRfcmVjZWl2ZSg6bGlzdGVuKS5vcmRlcmVkCi0gICAgICBAc2VydmVyVHJhbnMuc2hvdWxkX3JlY2VpdmUoOmFjY2VwdCkuZXhhY3RseSgzKS50aW1lcy5hbmRfcmV0dXJuKEBjbGllbnQpCi0gICAgICBAdHJhbnMuc2hvdWxkX3JlY2VpdmUoOmdldF90cmFuc3BvcnQpLmV4YWN0bHkoMykudGltZXMud2l0aChAY2xpZW50KS5hbmRfcmV0dXJuKEB0cmFucykKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpnZXRfcHJvdG9jb2wpLmV4YWN0bHkoMykudGltZXMud2l0aChAdHJhbnMpLmFuZF9yZXR1cm4oQHByb3QpCisgICAgICBleHBlY3QoQHNlcnZlclRyYW5zKS50byByZWNlaXZlKDpsaXN0ZW4pLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAc2VydmVyVHJhbnMpLnRvIHJlY2VpdmUoOmFjY2VwdCkuZXhhY3RseSgzKS50aW1lcy5hbmRfcmV0dXJuKEBjbGllbnQpCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDpnZXRfdHJhbnNwb3J0KS5leGFjdGx5KDMpLnRpbWVzLndpdGgoQGNsaWVudCkuYW5kX3JldHVybihAdHJhbnMpCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOmdldF9wcm90b2NvbCkuZXhhY3RseSgzKS50aW1lcy53aXRoKEB0cmFucykuYW5kX3JldHVybihAcHJvdCkKICAgICAgIHggPSAwCi0gICAgICBAcHJvY2Vzc29yLnNob3VsZF9yZWNlaXZlKDpwcm9jZXNzKS5leGFjdGx5KDMpLnRpbWVzLndpdGgoQHByb3QsIEBwcm90KS5hbmRfcmV0dXJuIGRvCisgICAgICBleHBlY3QoQHByb2Nlc3NvcikudG8gcmVjZWl2ZSg6cHJvY2VzcykuZXhhY3RseSgzKS50aW1lcy53aXRoKEBwcm90LCBAcHJvdCkgZG8KICAgICAgICAgY2FzZSAoeCArPSAxKQogICAgICAgICB3aGVuIDEgdGhlbiByYWlzZSBUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbgogICAgICAgICB3aGVuIDIgdGhlbiByYWlzZSBUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uCiAgICAgICAgIHdoZW4gMyB0aGVuIHRocm93IDpzdG9wCiAgICAgICAgIGVuZAogICAgICAgZW5kCi0gICAgICBAdHJhbnMuc2hvdWxkX3JlY2VpdmUoOmNsb3NlKS5leGFjdGx5KDMpLnRpbWVzCi0gICAgICBAc2VydmVyVHJhbnMuc2hvdWxkX3JlY2VpdmUoOmNsb3NlKS5vcmRlcmVkCi0gICAgICBsYW1iZGEgeyBAc2VydmVyLnNlcnZlIH0uc2hvdWxkIHRocm93X3N5bWJvbCg6c3RvcCkKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOmNsb3NlKS5leGFjdGx5KDMpLnRpbWVzCisgICAgICBleHBlY3QoQHNlcnZlclRyYW5zKS50byByZWNlaXZlKDpjbG9zZSkub3JkZXJlZAorICAgICAgZXhwZWN0IHsgQHNlcnZlci5zZXJ2ZSB9LnRvIHRocm93X3N5bWJvbCg6c3RvcCkKICAgICBlbmQKICAgZW5kCiAKICAgZGVzY3JpYmUgVGhyaWZ0OjpUaHJlYWRlZFNlcnZlciBkbwogICAgIGJlZm9yZSg6ZWFjaCkgZG8KLSAgICAgIEBwcm9jZXNzb3IgPSBtb2NrKCJQcm9jZXNzb3IiKQotICAgICAgQHNlcnZlclRyYW5zID0gbW9jaygiU2VydmVyVHJhbnNwb3J0IikKLSAgICAgIEB0cmFucyA9IG1vY2soIkJhc2VUcmFuc3BvcnQiKQotICAgICAgQHByb3QgPSBtb2NrKCJCYXNlUHJvdG9jb2wiKQotICAgICAgQGNsaWVudCA9IG1vY2soIkNsaWVudCIpCisgICAgICBAcHJvY2Vzc29yID0gZG91YmxlKCJQcm9jZXNzb3IiKQorICAgICAgQHNlcnZlclRyYW5zID0gZG91YmxlKCJTZXJ2ZXJUcmFuc3BvcnQiKQorICAgICAgQHRyYW5zID0gZG91YmxlKCJCYXNlVHJhbnNwb3J0IikKKyAgICAgIEBwcm90ID0gZG91YmxlKCJCYXNlUHJvdG9jb2wiKQorICAgICAgQGNsaWVudCA9IGRvdWJsZSgiQ2xpZW50IikKICAgICAgIEBzZXJ2ZXIgPSBkZXNjcmliZWRfY2xhc3MubmV3KEBwcm9jZXNzb3IsIEBzZXJ2ZXJUcmFucywgQHRyYW5zLCBAcHJvdCkKICAgICBlbmQKIAorICAgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHJlYXNvbmFibGUgdG9fcyIgZG8KKyAgICAgIGV4cGVjdChAc2VydmVyVHJhbnMpLnRvIHJlY2VpdmUoOnRvX3MpLm9uY2UuYW5kX3JldHVybigic2VydmVyVHJhbnMiKQorICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6dG9fcykub25jZS5hbmRfcmV0dXJuKCJ0cmFucyIpCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnRvX3MpLm9uY2UuYW5kX3JldHVybigicHJvdCIpCisgICAgICBleHBlY3QoQHNlcnZlci50b19zKS50byBlcSgidGhyZWFkZWQoc2VydmVyKHByb3QodHJhbnMoc2VydmVyVHJhbnMpKSkpIikKKyAgICBlbmQKKyAgICAKICAgICBpdCAic2hvdWxkIHNlcnZlIHVzaW5nIHRocmVhZHMiIGRvCi0gICAgICBAc2VydmVyVHJhbnMuc2hvdWxkX3JlY2VpdmUoOmxpc3Rlbikub3JkZXJlZAotICAgICAgQHNlcnZlclRyYW5zLnNob3VsZF9yZWNlaXZlKDphY2NlcHQpLmV4YWN0bHkoMykudGltZXMuYW5kX3JldHVybihAY2xpZW50KQotICAgICAgQHRyYW5zLnNob3VsZF9yZWNlaXZlKDpnZXRfdHJhbnNwb3J0KS5leGFjdGx5KDMpLnRpbWVzLndpdGgoQGNsaWVudCkuYW5kX3JldHVybihAdHJhbnMpCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6Z2V0X3Byb3RvY29sKS5leGFjdGx5KDMpLnRpbWVzLndpdGgoQHRyYW5zKS5hbmRfcmV0dXJuKEBwcm90KQotICAgICAgVGhyZWFkLnNob3VsZF9yZWNlaXZlKDpuZXcpLndpdGgoQHByb3QsIEB0cmFucykuZXhhY3RseSgzKS50aW1lcy5hbmRfeWllbGQoQHByb3QsIEB0cmFucykKKyAgICAgIGV4cGVjdChAc2VydmVyVHJhbnMpLnRvIHJlY2VpdmUoOmxpc3Rlbikub3JkZXJlZAorICAgICAgZXhwZWN0KEBzZXJ2ZXJUcmFucykudG8gcmVjZWl2ZSg6YWNjZXB0KS5leGFjdGx5KDMpLnRpbWVzLmFuZF9yZXR1cm4oQGNsaWVudCkKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOmdldF90cmFuc3BvcnQpLmV4YWN0bHkoMykudGltZXMud2l0aChAY2xpZW50KS5hbmRfcmV0dXJuKEB0cmFucykKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6Z2V0X3Byb3RvY29sKS5leGFjdGx5KDMpLnRpbWVzLndpdGgoQHRyYW5zKS5hbmRfcmV0dXJuKEBwcm90KQorICAgICAgZXhwZWN0KFRocmVhZCkudG8gcmVjZWl2ZSg6bmV3KS53aXRoKEBwcm90LCBAdHJhbnMpLmV4YWN0bHkoMykudGltZXMuYW5kX3lpZWxkKEBwcm90LCBAdHJhbnMpCiAgICAgICB4ID0gMAotICAgICAgQHByb2Nlc3Nvci5zaG91bGRfcmVjZWl2ZSg6cHJvY2VzcykuZXhhY3RseSgzKS50aW1lcy53aXRoKEBwcm90LCBAcHJvdCkuYW5kX3JldHVybiBkbworICAgICAgZXhwZWN0KEBwcm9jZXNzb3IpLnRvIHJlY2VpdmUoOnByb2Nlc3MpLmV4YWN0bHkoMykudGltZXMud2l0aChAcHJvdCwgQHByb3QpIGRvCiAgICAgICAgIGNhc2UgKHggKz0gMSkKICAgICAgICAgd2hlbiAxIHRoZW4gcmFpc2UgVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb24KICAgICAgICAgd2hlbiAyIHRoZW4gcmFpc2UgVGhyaWZ0OjpQcm90b2NvbEV4Y2VwdGlvbgogICAgICAgICB3aGVuIDMgdGhlbiB0aHJvdyA6c3RvcAogICAgICAgICBlbmQKICAgICAgIGVuZAotICAgICAgQHRyYW5zLnNob3VsZF9yZWNlaXZlKDpjbG9zZSkuZXhhY3RseSgzKS50aW1lcwotICAgICAgQHNlcnZlclRyYW5zLnNob3VsZF9yZWNlaXZlKDpjbG9zZSkub3JkZXJlZAotICAgICAgbGFtYmRhIHsgQHNlcnZlci5zZXJ2ZSB9LnNob3VsZCB0aHJvd19zeW1ib2woOnN0b3ApCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDpjbG9zZSkuZXhhY3RseSgzKS50aW1lcworICAgICAgZXhwZWN0KEBzZXJ2ZXJUcmFucykudG8gcmVjZWl2ZSg6Y2xvc2UpLm9yZGVyZWQKKyAgICAgIGV4cGVjdCB7IEBzZXJ2ZXIuc2VydmUgfS50byB0aHJvd19zeW1ib2woOnN0b3ApCiAgICAgZW5kCiAgIGVuZAogCiAgIGRlc2NyaWJlIFRocmlmdDo6VGhyZWFkUG9vbFNlcnZlciBkbwogICAgIGJlZm9yZSg6ZWFjaCkgZG8KLSAgICAgIEBwcm9jZXNzb3IgPSBtb2NrKCJQcm9jZXNzb3IiKQotICAgICAgQHNlcnZlcl90cmFucyA9IG1vY2soIlNlcnZlclRyYW5zcG9ydCIpCi0gICAgICBAdHJhbnMgPSBtb2NrKCJCYXNlVHJhbnNwb3J0IikKLSAgICAgIEBwcm90ID0gbW9jaygiQmFzZVByb3RvY29sIikKLSAgICAgIEBjbGllbnQgPSBtb2NrKCJDbGllbnQiKQorICAgICAgQHByb2Nlc3NvciA9IGRvdWJsZSgiUHJvY2Vzc29yIikKKyAgICAgIEBzZXJ2ZXJfdHJhbnMgPSBkb3VibGUoIlNlcnZlclRyYW5zcG9ydCIpCisgICAgICBAdHJhbnMgPSBkb3VibGUoIkJhc2VUcmFuc3BvcnQiKQorICAgICAgQHByb3QgPSBkb3VibGUoIkJhc2VQcm90b2NvbCIpCisgICAgICBAY2xpZW50ID0gZG91YmxlKCJDbGllbnQiKQogICAgICAgQHNlcnZlciA9IGRlc2NyaWJlZF9jbGFzcy5uZXcoQHByb2Nlc3NvciwgQHNlcnZlcl90cmFucywgQHRyYW5zLCBAcHJvdCkKKyAgICAgIHNsZWVwKDAuMTUpCiAgICAgZW5kCiAKKyAgICBpdCAic2hvdWxkIHByb3ZpZGUgYSByZWFzb25hYmxlIHRvX3MiIGRvCisgICAgICBleHBlY3QoQHNlcnZlcl90cmFucykudG8gcmVjZWl2ZSg6dG9fcykub25jZS5hbmRfcmV0dXJuKCJzZXJ2ZXJfdHJhbnMiKQorICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6dG9fcykub25jZS5hbmRfcmV0dXJuKCJ0cmFucyIpCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnRvX3MpLm9uY2UuYW5kX3JldHVybigicHJvdCIpCisgICAgICBleHBlY3QoQHNlcnZlci50b19zKS50byBlcSgidGhyZWFkcG9vbChzZXJ2ZXIocHJvdCh0cmFucyhzZXJ2ZXJfdHJhbnMpKSkpIikKKyAgICBlbmQKKyAgICAKICAgICBpdCAic2hvdWxkIHNlcnZlIGluc2lkZSBhIHRocmVhZCIgZG8KICAgICAgIGV4Y2VwdGlvbl9xID0gQHNlcnZlci5pbnN0YW5jZV92YXJpYWJsZV9nZXQoOkBleGNlcHRpb25fcSkKLSAgICAgIGRlc2NyaWJlZF9jbGFzcy5hbnlfaW5zdGFuY2Uuc2hvdWxkX3JlY2VpdmUoOnNlcnZlKSBkbyAKKyAgICAgIGV4cGVjdF9hbnlfaW5zdGFuY2Vfb2YoZGVzY3JpYmVkX2NsYXNzKS50byByZWNlaXZlKDpzZXJ2ZSkgZG8gCiAgICAgICAgIGV4Y2VwdGlvbl9xLnB1c2goU3RhbmRhcmRFcnJvci5uZXcoJ0VSUk9SJykpCiAgICAgICBlbmQKICAgICAgIGV4cGVjdCB7IEBzZXJ2ZXIucmVzY3VhYmxlX3NlcnZlIH0udG8ocmFpc2VfZXJyb3IoJ0VSUk9SJykpCisgICAgICBzbGVlcCgwLjE1KQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBhdm9pZCBydW5uaW5nIHRoZSBzZXJ2ZXIgdHdpY2Ugd2hlbiByZXRyeWluZyByZXNjdWFibGVfc2VydmUiIGRvCiAgICAgICBleGNlcHRpb25fcSA9IEBzZXJ2ZXIuaW5zdGFuY2VfdmFyaWFibGVfZ2V0KDpAZXhjZXB0aW9uX3EpCi0gICAgICBkZXNjcmliZWRfY2xhc3MuYW55X2luc3RhbmNlLnNob3VsZF9yZWNlaXZlKDpzZXJ2ZSkgZG8gCisgICAgICBleHBlY3RfYW55X2luc3RhbmNlX29mKGRlc2NyaWJlZF9jbGFzcykudG8gcmVjZWl2ZSg6c2VydmUpIGRvIAogICAgICAgICBleGNlcHRpb25fcS5wdXNoKFN0YW5kYXJkRXJyb3IubmV3KCdFUlJPUjEnKSkKICAgICAgICAgZXhjZXB0aW9uX3EucHVzaChTdGFuZGFyZEVycm9yLm5ldygnRVJST1IyJykpCiAgICAgICBlbmQKQEAgLTExOCwyOSArMTU4LDI5IEBACiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHNlcnZlIHVzaW5nIGEgdGhyZWFkIHBvb2wiIGRvCi0gICAgICB0aHJlYWRfcSA9IG1vY2soIlNpemVkUXVldWUiKQotICAgICAgZXhjZXB0aW9uX3EgPSBtb2NrKCJRdWV1ZSIpCisgICAgICB0aHJlYWRfcSA9IGRvdWJsZSgiU2l6ZWRRdWV1ZSIpCisgICAgICBleGNlcHRpb25fcSA9IGRvdWJsZSgiUXVldWUiKQogICAgICAgQHNlcnZlci5pbnN0YW5jZV92YXJpYWJsZV9zZXQoOkB0aHJlYWRfcSwgdGhyZWFkX3EpCiAgICAgICBAc2VydmVyLmluc3RhbmNlX3ZhcmlhYmxlX3NldCg6QGV4Y2VwdGlvbl9xLCBleGNlcHRpb25fcSkKLSAgICAgIEBzZXJ2ZXJfdHJhbnMuc2hvdWxkX3JlY2VpdmUoOmxpc3Rlbikub3JkZXJlZAotICAgICAgdGhyZWFkX3Euc2hvdWxkX3JlY2VpdmUoOnB1c2gpLndpdGgoOnRva2VuKQotICAgICAgdGhyZWFkX3Euc2hvdWxkX3JlY2VpdmUoOnBvcCkKLSAgICAgIFRocmVhZC5zaG91bGRfcmVjZWl2ZSg6bmV3KS5hbmRfeWllbGQKLSAgICAgIEBzZXJ2ZXJfdHJhbnMuc2hvdWxkX3JlY2VpdmUoOmFjY2VwdCkuZXhhY3RseSgzKS50aW1lcy5hbmRfcmV0dXJuKEBjbGllbnQpCi0gICAgICBAdHJhbnMuc2hvdWxkX3JlY2VpdmUoOmdldF90cmFuc3BvcnQpLmV4YWN0bHkoMykudGltZXMuYW5kX3JldHVybihAdHJhbnMpCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6Z2V0X3Byb3RvY29sKS5leGFjdGx5KDMpLnRpbWVzLmFuZF9yZXR1cm4oQHByb3QpCisgICAgICBleHBlY3QoQHNlcnZlcl90cmFucykudG8gcmVjZWl2ZSg6bGlzdGVuKS5vcmRlcmVkCisgICAgICBleHBlY3QodGhyZWFkX3EpLnRvIHJlY2VpdmUoOnB1c2gpLndpdGgoOnRva2VuKQorICAgICAgZXhwZWN0KHRocmVhZF9xKS50byByZWNlaXZlKDpwb3ApCisgICAgICBleHBlY3QoVGhyZWFkKS50byByZWNlaXZlKDpuZXcpLmFuZF95aWVsZAorICAgICAgZXhwZWN0KEBzZXJ2ZXJfdHJhbnMpLnRvIHJlY2VpdmUoOmFjY2VwdCkuZXhhY3RseSgzKS50aW1lcy5hbmRfcmV0dXJuKEBjbGllbnQpCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDpnZXRfdHJhbnNwb3J0KS5leGFjdGx5KDMpLnRpbWVzLmFuZF9yZXR1cm4oQHRyYW5zKQorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpnZXRfcHJvdG9jb2wpLmV4YWN0bHkoMykudGltZXMuYW5kX3JldHVybihAcHJvdCkKICAgICAgIHggPSAwCiAgICAgICBlcnJvciA9IFJ1bnRpbWVFcnJvci5uZXcoIlN0b3BwZWQiKQotICAgICAgQHByb2Nlc3Nvci5zaG91bGRfcmVjZWl2ZSg6cHJvY2VzcykuZXhhY3RseSgzKS50aW1lcy53aXRoKEBwcm90LCBAcHJvdCkuYW5kX3JldHVybiBkbworICAgICAgZXhwZWN0KEBwcm9jZXNzb3IpLnRvIHJlY2VpdmUoOnByb2Nlc3MpLmV4YWN0bHkoMykudGltZXMud2l0aChAcHJvdCwgQHByb3QpIGRvCiAgICAgICAgIGNhc2UgKHggKz0gMSkKICAgICAgICAgd2hlbiAxIHRoZW4gcmFpc2UgVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb24KICAgICAgICAgd2hlbiAyIHRoZW4gcmFpc2UgVGhyaWZ0OjpQcm90b2NvbEV4Y2VwdGlvbgogICAgICAgICB3aGVuIDMgdGhlbiByYWlzZSBlcnJvcgogICAgICAgICBlbmQKICAgICAgIGVuZAotICAgICAgQHRyYW5zLnNob3VsZF9yZWNlaXZlKDpjbG9zZSkuZXhhY3RseSgzKS50aW1lcwotICAgICAgZXhjZXB0aW9uX3Euc2hvdWxkX3JlY2VpdmUoOnB1c2gpLndpdGgoZXJyb3IpLmFuZF90aHJvdyg6c3RvcCkKLSAgICAgIEBzZXJ2ZXJfdHJhbnMuc2hvdWxkX3JlY2VpdmUoOmNsb3NlKQorICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6Y2xvc2UpLmV4YWN0bHkoMykudGltZXMKKyAgICAgIGV4cGVjdChleGNlcHRpb25fcSkudG8gcmVjZWl2ZSg6cHVzaCkud2l0aChlcnJvcikuYW5kX3Rocm93KDpzdG9wKQorICAgICAgZXhwZWN0KEBzZXJ2ZXJfdHJhbnMpLnRvIHJlY2VpdmUoOmNsb3NlKQogICAgICAgZXhwZWN0IHsgQHNlcnZlci5zZXJ2ZSB9LnRvKHRocm93X3N5bWJvbCg6c3RvcCkpCiAgICAgZW5kCiAgIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvc29ja2V0X3NwZWMucmIgYi9saWIvcmIvc3BlYy9zb2NrZXRfc3BlYy5yYgppbmRleCBlNmI2NzMyLi4yMDJjNzQ1IDEwMDY0NAotLS0gYS9saWIvcmIvc3BlYy9zb2NrZXRfc3BlYy5yYgorKysgYi9saWIvcmIvc3BlYy9zb2NrZXRfc3BlYy5yYgpAQCAtMjUsMzcgKzI1LDQ0IEBACiAgIGRlc2NyaWJlIFRocmlmdDo6U29ja2V0IGRvCiAgICAgYmVmb3JlKDplYWNoKSBkbwogICAgICAgQHNvY2tldCA9IFRocmlmdDo6U29ja2V0Lm5ldwotICAgICAgQGhhbmRsZSA9IG1vY2soIkhhbmRsZSIsIDpjbG9zZWQ/ID0+IGZhbHNlKQotICAgICAgQGhhbmRsZS5zdHViISg6Y2xvc2UpCi0gICAgICBAaGFuZGxlLnN0dWIhKDpjb25uZWN0X25vbmJsb2NrKQotICAgICAgQGhhbmRsZS5zdHViISg6c2V0c29ja29wdCkKLSAgICAgIDo6U29ja2V0LnN0dWIhKDpuZXcpLmFuZF9yZXR1cm4oQGhhbmRsZSkKKyAgICAgIEBoYW5kbGUgPSBkb3VibGUoIkhhbmRsZSIsIDpjbG9zZWQ/ID0+IGZhbHNlKQorICAgICAgYWxsb3coQGhhbmRsZSkudG8gcmVjZWl2ZSg6Y2xvc2UpCisgICAgICBhbGxvdyhAaGFuZGxlKS50byByZWNlaXZlKDpjb25uZWN0X25vbmJsb2NrKQorICAgICAgYWxsb3coQGhhbmRsZSkudG8gcmVjZWl2ZSg6c2V0c29ja29wdCkKKyAgICAgIGFsbG93KDo6U29ja2V0KS50byByZWNlaXZlKDpuZXcpLmFuZF9yZXR1cm4oQGhhbmRsZSkKICAgICBlbmQKIAogICAgIGl0X3Nob3VsZF9iZWhhdmVfbGlrZSAiYSBzb2NrZXQiCiAKICAgICBpdCAic2hvdWxkIHJhaXNlIGEgVHJhbnNwb3J0RXhjZXB0aW9uIHdoZW4gaXQgY2Fubm90IG9wZW4gYSBzb2NrZXQiIGRvCi0gICAgICA6OlNvY2tldC5zaG91bGRfcmVjZWl2ZSg6bmV3KS5hbmRfcmFpc2UoU3RhbmRhcmRFcnJvcikKLSAgICAgIGxhbWJkYSB7IEBzb2NrZXQub3BlbiB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbikgeyB8ZXwgZS50eXBlLnNob3VsZCA9PSBUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4gfQorICAgICAgZXhwZWN0KDo6U29ja2V0KS50byByZWNlaXZlKDpnZXRhZGRyaW5mbykud2l0aCgibG9jYWxob3N0IiwgOTA5MCwgbmlsLCA6OlNvY2tldDo6U09DS19TVFJFQU0pLmFuZF9yZXR1cm4oW1tdXSkKKyAgICAgIGV4cGVjdCB7IEBzb2NrZXQub3BlbiB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uKSB7IHxlfCBleHBlY3QoZS50eXBlKS50byBlcShUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4pIH0KICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgb3BlbiBhIDo6U29ja2V0IHdpdGggZGVmYXVsdCBhcmdzIiBkbwotICAgICAgOjpTb2NrZXQuc2hvdWxkX3JlY2VpdmUoOm5ldykuYW5kX3JldHVybihtb2NrKCJIYW5kbGUiLCA6Y29ubmVjdF9ub25ibG9jayA9PiB0cnVlLCA6c2V0c29ja29wdCA9PiBuaWwpKQotICAgICAgOjpTb2NrZXQuc2hvdWxkX3JlY2VpdmUoOmdldGFkZHJpbmZvKS53aXRoKCJsb2NhbGhvc3QiLCA5MDkwLCBuaWwsIDo6U29ja2V0OjpTT0NLX1NUUkVBTSkuYW5kX3JldHVybihbW11dKQotICAgICAgOjpTb2NrZXQuc2hvdWxkX3JlY2VpdmUoOnNvY2thZGRyX2luKQorICAgICAgZXhwZWN0KDo6U29ja2V0KS50byByZWNlaXZlKDpuZXcpLmFuZF9yZXR1cm4oZG91YmxlKCJIYW5kbGUiLCA6Y29ubmVjdF9ub25ibG9jayA9PiB0cnVlLCA6c2V0c29ja29wdCA9PiBuaWwpKQorICAgICAgZXhwZWN0KDo6U29ja2V0KS50byByZWNlaXZlKDpnZXRhZGRyaW5mbykud2l0aCgibG9jYWxob3N0IiwgOTA5MCwgbmlsLCA6OlNvY2tldDo6U09DS19TVFJFQU0pLmFuZF9yZXR1cm4oW1tdXSkKKyAgICAgIGV4cGVjdCg6OlNvY2tldCkudG8gcmVjZWl2ZSg6c29ja2FkZHJfaW4pCisgICAgICBAc29ja2V0LnRvX3MgPT0gInNvY2tldChsb2NhbGhvc3Q6OTA5MCkiCiAgICAgICBAc29ja2V0Lm9wZW4KICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgYWNjZXB0IGhvc3QvcG9ydCBvcHRpb25zIiBkbwotICAgICAgOjpTb2NrZXQuc2hvdWxkX3JlY2VpdmUoOm5ldykuYW5kX3JldHVybihtb2NrKCJIYW5kbGUiLCA6Y29ubmVjdF9ub25ibG9jayA9PiB0cnVlLCA6c2V0c29ja29wdCA9PiBuaWwpKQotICAgICAgOjpTb2NrZXQuc2hvdWxkX3JlY2VpdmUoOmdldGFkZHJpbmZvKS53aXRoKCJteS5kb21haW4iLCAxMjM0LCBuaWwsIDo6U29ja2V0OjpTT0NLX1NUUkVBTSkuYW5kX3JldHVybihbW11dKQotICAgICAgOjpTb2NrZXQuc2hvdWxkX3JlY2VpdmUoOnNvY2thZGRyX2luKQotICAgICAgVGhyaWZ0OjpTb2NrZXQubmV3KCdteS5kb21haW4nLCAxMjM0KS5vcGVuCisgICAgICBleHBlY3QoOjpTb2NrZXQpLnRvIHJlY2VpdmUoOm5ldykuYW5kX3JldHVybihkb3VibGUoIkhhbmRsZSIsIDpjb25uZWN0X25vbmJsb2NrID0+IHRydWUsIDpzZXRzb2Nrb3B0ID0+IG5pbCkpCisgICAgICBleHBlY3QoOjpTb2NrZXQpLnRvIHJlY2VpdmUoOmdldGFkZHJpbmZvKS53aXRoKCJteS5kb21haW4iLCAxMjM0LCBuaWwsIDo6U29ja2V0OjpTT0NLX1NUUkVBTSkuYW5kX3JldHVybihbW11dKQorICAgICAgZXhwZWN0KDo6U29ja2V0KS50byByZWNlaXZlKDpzb2NrYWRkcl9pbikKKyAgICAgIEBzb2NrZXQgPSBUaHJpZnQ6OlNvY2tldC5uZXcoJ215LmRvbWFpbicsIDEyMzQpLm9wZW4KKyAgICAgIEBzb2NrZXQudG9fcyA9PSAic29ja2V0KG15LmRvbWFpbjoxMjM0KSIKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgYWNjZXB0IGFuIG9wdGlvbmFsIHRpbWVvdXQiIGRvCi0gICAgICA6OlNvY2tldC5zdHViISg6bmV3KQotICAgICAgVGhyaWZ0OjpTb2NrZXQubmV3KCdsb2NhbGhvc3QnLCA4MDgwLCA1KS50aW1lb3V0LnNob3VsZCA9PSA1CisgICAgICBhbGxvdyg6OlNvY2tldCkudG8gcmVjZWl2ZSg6bmV3KQorICAgICAgZXhwZWN0KFRocmlmdDo6U29ja2V0Lm5ldygnbG9jYWxob3N0JywgODA4MCwgNSkudGltZW91dCkudG8gZXEoNSkKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHJlYXNvbmFibGUgdG9fcyIgZG8KKyAgICAgIGFsbG93KDo6U29ja2V0KS50byByZWNlaXZlKDpuZXcpCisgICAgICBleHBlY3QoVGhyaWZ0OjpTb2NrZXQubmV3KCdteWhvc3QnLCA4MDkwKS50b19zKS50byBlcSgic29ja2V0KG15aG9zdDo4MDkwKSIpCiAgICAgZW5kCiAgIGVuZAogZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9zb2NrZXRfc3BlY19zaGFyZWQucmIgYi9saWIvcmIvc3BlYy9zb2NrZXRfc3BlY19zaGFyZWQucmIKaW5kZXggNWZkZGMxNi4uMzJiZGI3MSAxMDA2NDQKLS0tIGEvbGliL3JiL3NwZWMvc29ja2V0X3NwZWNfc2hhcmVkLnJiCisrKyBiL2xpYi9yYi9zcGVjL3NvY2tldF9zcGVjX3NoYXJlZC5yYgpAQCAtMjEsODQgKzIxLDg0IEBACiAKIHNoYXJlZF9leGFtcGxlc19mb3IgImEgc29ja2V0IiBkbwogICBpdCAic2hvdWxkIG9wZW4gYSBzb2NrZXQiIGRvCi0gICAgQHNvY2tldC5vcGVuLnNob3VsZCA9PSBAaGFuZGxlCisgICAgZXhwZWN0KEBzb2NrZXQub3BlbikudG8gZXEoQGhhbmRsZSkKICAgZW5kCiAKICAgaXQgInNob3VsZCBiZSBvcGVuIHdoZW5ldmVyIGl0IGhhcyBhIGhhbmRsZSIgZG8KLSAgICBAc29ja2V0LnNob3VsZF9ub3QgYmVfb3BlbgorICAgIGV4cGVjdChAc29ja2V0KS5ub3RfdG8gYmVfb3BlbgogICAgIEBzb2NrZXQub3BlbgotICAgIEBzb2NrZXQuc2hvdWxkIGJlX29wZW4KKyAgICBleHBlY3QoQHNvY2tldCkudG8gYmVfb3BlbgogICAgIEBzb2NrZXQuaGFuZGxlID0gbmlsCi0gICAgQHNvY2tldC5zaG91bGRfbm90IGJlX29wZW4KKyAgICBleHBlY3QoQHNvY2tldCkubm90X3RvIGJlX29wZW4KICAgICBAc29ja2V0LmhhbmRsZSA9IEBoYW5kbGUKICAgICBAc29ja2V0LmNsb3NlCi0gICAgQHNvY2tldC5zaG91bGRfbm90IGJlX29wZW4KKyAgICBleHBlY3QoQHNvY2tldCkubm90X3RvIGJlX29wZW4KICAgZW5kCiAKICAgaXQgInNob3VsZCB3cml0ZSBkYXRhIHRvIHRoZSBoYW5kbGUiIGRvCiAgICAgQHNvY2tldC5vcGVuCi0gICAgQGhhbmRsZS5zaG91bGRfcmVjZWl2ZSg6d3JpdGUpLndpdGgoImZvb2JhciIpCisgICAgZXhwZWN0KEBoYW5kbGUpLnRvIHJlY2VpdmUoOndyaXRlKS53aXRoKCJmb29iYXIiKQogICAgIEBzb2NrZXQud3JpdGUoImZvb2JhciIpCi0gICAgQGhhbmRsZS5zaG91bGRfcmVjZWl2ZSg6d3JpdGUpLndpdGgoImZhaWwiKS5hbmRfcmFpc2UoU3RhbmRhcmRFcnJvcikKLSAgICBsYW1iZGEgeyBAc29ja2V0LndyaXRlKCJmYWlsIikgfS5zaG91bGQgcmFpc2VfZXJyb3IoVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb24pIHsgfGV8IGUudHlwZS5zaG91bGQgPT0gVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOIH0KKyAgICBleHBlY3QoQGhhbmRsZSkudG8gcmVjZWl2ZSg6d3JpdGUpLndpdGgoImZhaWwiKS5hbmRfcmFpc2UoU3RhbmRhcmRFcnJvcikKKyAgICBleHBlY3QgeyBAc29ja2V0LndyaXRlKCJmYWlsIikgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbikgeyB8ZXwgZXhwZWN0KGUudHlwZSkudG8gZXEoVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOKSB9CiAgIGVuZAogCiAgIGl0ICJzaG91bGQgcmFpc2UgYW4gZXJyb3Igd2hlbiBpdCBjYW5ub3QgcmVhZCBmcm9tIHRoZSBoYW5kbGUiIGRvCiAgICAgQHNvY2tldC5vcGVuCi0gICAgQGhhbmRsZS5zaG91bGRfcmVjZWl2ZSg6cmVhZHBhcnRpYWwpLndpdGgoMTcpLmFuZF9yYWlzZShTdGFuZGFyZEVycm9yKQotICAgIGxhbWJkYSB7IEBzb2NrZXQucmVhZCgxNykgfS5zaG91bGQgcmFpc2VfZXJyb3IoVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb24pIHsgfGV8IGUudHlwZS5zaG91bGQgPT0gVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOIH0KKyAgICBleHBlY3QoQGhhbmRsZSkudG8gcmVjZWl2ZSg6cmVhZHBhcnRpYWwpLndpdGgoMTcpLmFuZF9yYWlzZShTdGFuZGFyZEVycm9yKQorICAgIGV4cGVjdCB7IEBzb2NrZXQucmVhZCgxNykgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbikgeyB8ZXwgZXhwZWN0KGUudHlwZSkudG8gZXEoVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOKSB9CiAgIGVuZAogCiAgIGl0ICJzaG91bGQgcmV0dXJuIHRoZSBkYXRhIHJlYWQgd2hlbiByZWFkaW5nIGZyb20gdGhlIGhhbmRsZSB3b3JrcyIgZG8KICAgICBAc29ja2V0Lm9wZW4KLSAgICBAaGFuZGxlLnNob3VsZF9yZWNlaXZlKDpyZWFkcGFydGlhbCkud2l0aCgxNykuYW5kX3JldHVybigidGVzdCBkYXRhIikKLSAgICBAc29ja2V0LnJlYWQoMTcpLnNob3VsZCA9PSAidGVzdCBkYXRhIgorICAgIGV4cGVjdChAaGFuZGxlKS50byByZWNlaXZlKDpyZWFkcGFydGlhbCkud2l0aCgxNykuYW5kX3JldHVybigidGVzdCBkYXRhIikKKyAgICBleHBlY3QoQHNvY2tldC5yZWFkKDE3KSkudG8gZXEoInRlc3QgZGF0YSIpCiAgIGVuZAogCiAgIGl0ICJzaG91bGQgZGVjbGFyZSBpdHNlbGYgYXMgY2xvc2VkIHdoZW4gaXQgaGFzIGFuIGVycm9yIiBkbwogICAgIEBzb2NrZXQub3BlbgotICAgIEBoYW5kbGUuc2hvdWxkX3JlY2VpdmUoOndyaXRlKS53aXRoKCJmYWlsIikuYW5kX3JhaXNlKFN0YW5kYXJkRXJyb3IpCi0gICAgQHNvY2tldC5zaG91bGQgYmVfb3BlbgotICAgIGxhbWJkYSB7IEBzb2NrZXQud3JpdGUoImZhaWwiKSB9LnNob3VsZCByYWlzZV9lcnJvcgotICAgIEBzb2NrZXQuc2hvdWxkX25vdCBiZV9vcGVuCisgICAgZXhwZWN0KEBoYW5kbGUpLnRvIHJlY2VpdmUoOndyaXRlKS53aXRoKCJmYWlsIikuYW5kX3JhaXNlKFN0YW5kYXJkRXJyb3IpCisgICAgZXhwZWN0KEBzb2NrZXQpLnRvIGJlX29wZW4KKyAgICBleHBlY3QgeyBAc29ja2V0LndyaXRlKCJmYWlsIikgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbikgeyB8ZXwgZXhwZWN0KGUudHlwZSkudG8gZXEoVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOKSB9CisgICAgZXhwZWN0KEBzb2NrZXQpLm5vdF90byBiZV9vcGVuCiAgIGVuZAogCiAgIGl0ICJzaG91bGQgcmFpc2UgYW4gZXJyb3Igd2hlbiB0aGUgc3RyZWFtIGlzIGNsb3NlZCIgZG8KICAgICBAc29ja2V0Lm9wZW4KLSAgICBAaGFuZGxlLnN0dWIhKDpjbG9zZWQ/KS5hbmRfcmV0dXJuKHRydWUpCi0gICAgQHNvY2tldC5zaG91bGRfbm90IGJlX29wZW4KLSAgICBsYW1iZGEgeyBAc29ja2V0LndyaXRlKCJmYWlsIikgfS5zaG91bGQgcmFpc2VfZXJyb3IoSU9FcnJvciwgImNsb3NlZCBzdHJlYW0iKQotICAgIGxhbWJkYSB7IEBzb2NrZXQucmVhZCgxMCkgfS5zaG91bGQgcmFpc2VfZXJyb3IoSU9FcnJvciwgImNsb3NlZCBzdHJlYW0iKQorICAgIGFsbG93KEBoYW5kbGUpLnRvIHJlY2VpdmUoOmNsb3NlZD8pLmFuZF9yZXR1cm4odHJ1ZSkKKyAgICBleHBlY3QoQHNvY2tldCkubm90X3RvIGJlX29wZW4KKyAgICBleHBlY3QgeyBAc29ja2V0LndyaXRlKCJmYWlsIikgfS50byByYWlzZV9lcnJvcihJT0Vycm9yLCAiY2xvc2VkIHN0cmVhbSIpCisgICAgZXhwZWN0IHsgQHNvY2tldC5yZWFkKDEwKSB9LnRvIHJhaXNlX2Vycm9yKElPRXJyb3IsICJjbG9zZWQgc3RyZWFtIikKICAgZW5kCiAKICAgaXQgInNob3VsZCBzdXBwb3J0IHRoZSB0aW1lb3V0IGFjY2Vzc29yIGZvciByZWFkIiBkbwogICAgIEBzb2NrZXQudGltZW91dCA9IDMKICAgICBAc29ja2V0Lm9wZW4KLSAgICBJTy5zaG91bGRfcmVjZWl2ZSg6c2VsZWN0KS53aXRoKFtAaGFuZGxlXSwgbmlsLCBuaWwsIDMpLmFuZF9yZXR1cm4oW1tAaGFuZGxlXSwgW10sIFtdXSkKLSAgICBAaGFuZGxlLnNob3VsZF9yZWNlaXZlKDpyZWFkcGFydGlhbCkud2l0aCgxNykuYW5kX3JldHVybigidGVzdCBkYXRhIikKLSAgICBAc29ja2V0LnJlYWQoMTcpLnNob3VsZCA9PSAidGVzdCBkYXRhIgorICAgIGV4cGVjdChJTykudG8gcmVjZWl2ZSg6c2VsZWN0KS53aXRoKFtAaGFuZGxlXSwgbmlsLCBuaWwsIDMpLmFuZF9yZXR1cm4oW1tAaGFuZGxlXSwgW10sIFtdXSkKKyAgICBleHBlY3QoQGhhbmRsZSkudG8gcmVjZWl2ZSg6cmVhZHBhcnRpYWwpLndpdGgoMTcpLmFuZF9yZXR1cm4oInRlc3QgZGF0YSIpCisgICAgZXhwZWN0KEBzb2NrZXQucmVhZCgxNykpLnRvIGVxKCJ0ZXN0IGRhdGEiKQogICBlbmQKIAogICBpdCAic2hvdWxkIHN1cHBvcnQgdGhlIHRpbWVvdXQgYWNjZXNzb3IgZm9yIHdyaXRlIiBkbwogICAgIEBzb2NrZXQudGltZW91dCA9IDMKICAgICBAc29ja2V0Lm9wZW4KLSAgICBJTy5zaG91bGRfcmVjZWl2ZSg6c2VsZWN0KS53aXRoKG5pbCwgW0BoYW5kbGVdLCBuaWwsIDMpLnR3aWNlLmFuZF9yZXR1cm4oW1tdLCBbQGhhbmRsZV0sIFtdXSkKLSAgICBAaGFuZGxlLnNob3VsZF9yZWNlaXZlKDp3cml0ZV9ub25ibG9jaykud2l0aCgidGVzdCBkYXRhIikuYW5kX3JldHVybig0KQotICAgIEBoYW5kbGUuc2hvdWxkX3JlY2VpdmUoOndyaXRlX25vbmJsb2NrKS53aXRoKCIgZGF0YSIpLmFuZF9yZXR1cm4oNSkKLSAgICBAc29ja2V0LndyaXRlKCJ0ZXN0IGRhdGEiKS5zaG91bGQgPT0gOQorICAgIGV4cGVjdChJTykudG8gcmVjZWl2ZSg6c2VsZWN0KS53aXRoKG5pbCwgW0BoYW5kbGVdLCBuaWwsIDMpLnR3aWNlLmFuZF9yZXR1cm4oW1tdLCBbQGhhbmRsZV0sIFtdXSkKKyAgICBleHBlY3QoQGhhbmRsZSkudG8gcmVjZWl2ZSg6d3JpdGVfbm9uYmxvY2spLndpdGgoInRlc3QgZGF0YSIpLmFuZF9yZXR1cm4oNCkKKyAgICBleHBlY3QoQGhhbmRsZSkudG8gcmVjZWl2ZSg6d3JpdGVfbm9uYmxvY2spLndpdGgoIiBkYXRhIikuYW5kX3JldHVybig1KQorICAgIGV4cGVjdChAc29ja2V0LndyaXRlKCJ0ZXN0IGRhdGEiKSkudG8gZXEoOSkKICAgZW5kCiAKICAgaXQgInNob3VsZCByYWlzZSBhbiBlcnJvciB3aGVuIHJlYWQgdGltZXMgb3V0IiBkbwogICAgIEBzb2NrZXQudGltZW91dCA9IDAuNQogICAgIEBzb2NrZXQub3BlbgotICAgIElPLnNob3VsZF9yZWNlaXZlKDpzZWxlY3QpLm9uY2Uge3NsZWVwKDAuNSk7IG5pbH0KLSAgICBsYW1iZGEgeyBAc29ja2V0LnJlYWQoMTcpIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uKSB7IHxlfCBlLnR5cGUuc2hvdWxkID09IFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uOjpUSU1FRF9PVVQgfQorICAgIGV4cGVjdChJTykudG8gcmVjZWl2ZSg6c2VsZWN0KS5vbmNlIHtzbGVlcCgwLjUpOyBuaWx9CisgICAgZXhwZWN0IHsgQHNvY2tldC5yZWFkKDE3KSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uKSB7IHxlfCBleHBlY3QoZS50eXBlKS50byBlcShUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbjo6VElNRURfT1VUKSB9CiAgIGVuZAogCiAgIGl0ICJzaG91bGQgcmFpc2UgYW4gZXJyb3Igd2hlbiB3cml0ZSB0aW1lcyBvdXQiIGRvCiAgICAgQHNvY2tldC50aW1lb3V0ID0gMC41CiAgICAgQHNvY2tldC5vcGVuCi0gICAgSU8uc2hvdWxkX3JlY2VpdmUoOnNlbGVjdCkud2l0aChuaWwsIFtAaGFuZGxlXSwgbmlsLCAwLjUpLmFueV9udW1iZXJfb2ZfdGltZXMuYW5kX3JldHVybihuaWwpCi0gICAgbGFtYmRhIHsgQHNvY2tldC53cml0ZSgidGVzdCBkYXRhIikgfS5zaG91bGQgcmFpc2VfZXJyb3IoVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb24pIHsgfGV8IGUudHlwZS5zaG91bGQgPT0gVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb246OlRJTUVEX09VVCB9CisgICAgYWxsb3coSU8pLnRvIHJlY2VpdmUoOnNlbGVjdCkud2l0aChuaWwsIFtAaGFuZGxlXSwgbmlsLCAwLjUpLmFuZF9yZXR1cm4obmlsKQorICAgIGV4cGVjdCB7IEBzb2NrZXQud3JpdGUoInRlc3QgZGF0YSIpIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb24pIHsgfGV8IGV4cGVjdChlLnR5cGUpLnRvIGVxKFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uOjpUSU1FRF9PVVQpIH0KICAgZW5kCiBlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL3NwZWNfaGVscGVyLnJiIGIvbGliL3JiL3NwZWMvc3BlY19oZWxwZXIucmIKaW5kZXggODY2NGI2Ni4uNWJmOThkMCAxMDA2NDQKLS0tIGEvbGliL3JiL3NwZWMvc3BlY19oZWxwZXIucmIKKysrIGIvbGliL3JiL3NwZWMvc3BlY19oZWxwZXIucmIKQEAgLTU0LDggKzU0LDExIEBACiByZXF1aXJlICdub25ibG9ja2luZ19zZXJ2aWNlJwogCiBtb2R1bGUgRml4dHVyZXMKLSAgQ09NUEFDVF9QUk9UT0NPTF9URVNUX1NUUlVDVCA9IENPTVBBQ1RfVEVTVC5kdXAKKyAgQ09NUEFDVF9QUk9UT0NPTF9URVNUX1NUUlVDVCA9IFRocmlmdDo6VGVzdDo6Q09NUEFDVF9URVNULmR1cAogICBDT01QQUNUX1BST1RPQ09MX1RFU1RfU1RSVUNULmFfYmluYXJ5ID0gWzAsMSwyLDMsNCw1LDYsNyw4XS5wYWNrKCdjKicpCiAgIENPTVBBQ1RfUFJPVE9DT0xfVEVTVF9TVFJVQ1Quc2V0X2J5dGVfbWFwID0gbmlsCiAgIENPTVBBQ1RfUFJPVE9DT0xfVEVTVF9TVFJVQ1QubWFwX2J5dGVfbWFwID0gbmlsCiBlbmQKKworJDoudW5zaGlmdCBGaWxlLmpvaW4oRmlsZS5kaXJuYW1lKF9fRklMRV9fKSwgKiV3W2dlbi1yYi9mbGF0XSkKKwpkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvc3NsX3NlcnZlcl9zb2NrZXRfc3BlYy5yYiBiL2xpYi9yYi9zcGVjL3NzbF9zZXJ2ZXJfc29ja2V0X3NwZWMucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJlNjUxOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9yYi9zcGVjL3NzbF9zZXJ2ZXJfc29ja2V0X3NwZWMucmIKQEAgLTAsMCArMSwzNCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3JlcXVpcmUgJ3NwZWNfaGVscGVyJworcmVxdWlyZSBGaWxlLmV4cGFuZF9wYXRoKCIje0ZpbGUuZGlybmFtZShfX0ZJTEVfXyl9L3NvY2tldF9zcGVjX3NoYXJlZCIpCisKK2Rlc2NyaWJlICdTU0xTZXJ2ZXJTb2NrZXQnIGRvCisKKyAgZGVzY3JpYmUgVGhyaWZ0OjpTU0xTZXJ2ZXJTb2NrZXQgZG8KKyAgICBiZWZvcmUoOmVhY2gpIGRvCisgICAgICBAc29ja2V0ID0gVGhyaWZ0OjpTU0xTZXJ2ZXJTb2NrZXQubmV3KDEyMzQpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHByb3ZpZGUgYSByZWFzb25hYmxlIHRvX3MiIGRvCisgICAgICBleHBlY3QoQHNvY2tldC50b19zKS50byBlcSgic3NsKHNvY2tldCg6MTIzNCkpIikKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL3NzbF9zb2NrZXRfc3BlYy5yYiBiL2xpYi9yYi9zcGVjL3NzbF9zb2NrZXRfc3BlYy5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDhkOGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3JiL3NwZWMvc3NsX3NvY2tldF9zcGVjLnJiCkBAIC0wLDAgKzEsNzggQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCityZXF1aXJlICdzcGVjX2hlbHBlcicKK3JlcXVpcmUgRmlsZS5leHBhbmRfcGF0aCgiI3tGaWxlLmRpcm5hbWUoX19GSUxFX18pfS9zb2NrZXRfc3BlY19zaGFyZWQiKQorCitkZXNjcmliZSAnU1NMU29ja2V0JyBkbworCisgIGRlc2NyaWJlIFRocmlmdDo6U1NMU29ja2V0IGRvCisgICAgYmVmb3JlKDplYWNoKSBkbworICAgICAgQGNvbnRleHQgPSBPcGVuU1NMOjpTU0w6OlNTTENvbnRleHQubmV3CisgICAgICBAc29ja2V0ID0gVGhyaWZ0OjpTU0xTb2NrZXQubmV3CisgICAgICBAc2ltcGxlX3NvY2tldF9oYW5kbGUgPSBkb3VibGUoIkhhbmRsZSIsIDpjbG9zZWQ/ID0+IGZhbHNlKQorICAgICAgYWxsb3coQHNpbXBsZV9zb2NrZXRfaGFuZGxlKS50byByZWNlaXZlKDpjbG9zZSkKKyAgICAgIGFsbG93KEBzaW1wbGVfc29ja2V0X2hhbmRsZSkudG8gcmVjZWl2ZSg6Y29ubmVjdF9ub25ibG9jaykKKyAgICAgIGFsbG93KEBzaW1wbGVfc29ja2V0X2hhbmRsZSkudG8gcmVjZWl2ZSg6c2V0c29ja29wdCkKKworICAgICAgQGhhbmRsZSA9IGRvdWJsZShkb3VibGUoIlNTTEhhbmRsZSIsIDpjb25uZWN0X25vbmJsb2NrID0+IHRydWUsIDpwb3N0X2Nvbm5lY3Rpb25fY2hlY2sgPT4gdHJ1ZSksIDpjbG9zZWQ/ID0+IGZhbHNlKQorICAgICAgYWxsb3coQGhhbmRsZSkudG8gcmVjZWl2ZSg6Y29ubmVjdF9ub25ibG9jaykKKyAgICAgIGFsbG93KEBoYW5kbGUpLnRvIHJlY2VpdmUoOmNsb3NlKQorICAgICAgYWxsb3coQGhhbmRsZSkudG8gcmVjZWl2ZSg6cG9zdF9jb25uZWN0aW9uX2NoZWNrKQorCisgICAgICBhbGxvdyg6OlNvY2tldCkudG8gcmVjZWl2ZSg6bmV3KS5hbmRfcmV0dXJuKEBzaW1wbGVfc29ja2V0X2hhbmRsZSkKKyAgICAgIGFsbG93KE9wZW5TU0w6OlNTTDo6U1NMU29ja2V0KS50byByZWNlaXZlKDpuZXcpLmFuZF9yZXR1cm4oQGhhbmRsZSkKKyAgICBlbmQKKworICAgIGl0X3Nob3VsZF9iZWhhdmVfbGlrZSAiYSBzb2NrZXQiCisKKyAgICBpdCAic2hvdWxkIHJhaXNlIGEgVHJhbnNwb3J0RXhjZXB0aW9uIHdoZW4gaXQgY2Fubm90IG9wZW4gYSBzc2wgc29ja2V0IiBkbworICAgICAgZXhwZWN0KDo6U29ja2V0KS50byByZWNlaXZlKDpnZXRhZGRyaW5mbykud2l0aCgibG9jYWxob3N0IiwgOTA5MCwgbmlsLCA6OlNvY2tldDo6U09DS19TVFJFQU0pLmFuZF9yZXR1cm4oW1tdXSkKKyAgICAgIGV4cGVjdCB7IEBzb2NrZXQub3BlbiB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uKSB7IHxlfCBleHBlY3QoZS50eXBlKS50byBlcShUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4pIH0KKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgb3BlbiBhIDo6U29ja2V0IHdpdGggZGVmYXVsdCBhcmdzIiBkbworICAgICAgZXhwZWN0KE9wZW5TU0w6OlNTTDo6U1NMU29ja2V0KS50byByZWNlaXZlKDpuZXcpLndpdGgoQHNpbXBsZV9zb2NrZXRfaGFuZGxlLCBuaWwpLmFuZF9yZXR1cm4oQGhhbmRsZSkKKyAgICAgIGV4cGVjdChAaGFuZGxlKS50byByZWNlaXZlKDpwb3N0X2Nvbm5lY3Rpb25fY2hlY2spLndpdGgoJ2xvY2FsaG9zdCcpCisgICAgICBAc29ja2V0Lm9wZW4KKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgYWNjZXB0IGhvc3QvcG9ydCBvcHRpb25zIiBkbworICAgICAgaGFuZGxlID0gZG91YmxlKCJIYW5kbGUiLCA6Y29ubmVjdF9ub25ibG9jayA9PiB0cnVlLCA6c2V0c29ja29wdCA9PiBuaWwpCisgICAgICBhbGxvdyg6OlNvY2tldCkudG8gcmVjZWl2ZSg6bmV3KS5hbmRfcmV0dXJuKGhhbmRsZSkKKyAgICAgIGV4cGVjdCg6OlNvY2tldCkudG8gcmVjZWl2ZSg6Z2V0YWRkcmluZm8pLndpdGgoIm15LmRvbWFpbiIsIDEyMzQsIG5pbCwgOjpTb2NrZXQ6OlNPQ0tfU1RSRUFNKS5hbmRfcmV0dXJuKFtbXV0pCisgICAgICBleHBlY3QoOjpTb2NrZXQpLnRvIHJlY2VpdmUoOnNvY2thZGRyX2luKQorICAgICAgZXhwZWN0KE9wZW5TU0w6OlNTTDo6U1NMU29ja2V0KS50byByZWNlaXZlKDpuZXcpLndpdGgoaGFuZGxlLCBuaWwpLmFuZF9yZXR1cm4oQGhhbmRsZSkKKyAgICAgIGV4cGVjdChAaGFuZGxlKS50byByZWNlaXZlKDpwb3N0X2Nvbm5lY3Rpb25fY2hlY2spLndpdGgoJ215LmRvbWFpbicpCisgICAgICBUaHJpZnQ6OlNTTFNvY2tldC5uZXcoJ215LmRvbWFpbicsIDEyMzQsIDYwMDAsIG5pbCkub3BlbgorICAgIGVuZAorCisgICAgaXQgInNob3VsZCBhY2NlcHQgYW4gb3B0aW9uYWwgdGltZW91dCIgZG8KKyAgICAgIGV4cGVjdChUaHJpZnQ6OlNTTFNvY2tldC5uZXcoJ2xvY2FsaG9zdCcsIDgwODAsIDUpLnRpbWVvdXQpLnRvIGVxKDUpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIGFjY2VwdCBhbiBvcHRpb25hbCBjb250ZXh0IiBkbworICAgICAgZXhwZWN0KFRocmlmdDo6U1NMU29ja2V0Lm5ldygnbG9jYWxob3N0JywgODA4MCwgNSwgQGNvbnRleHQpLnNzbF9jb250ZXh0KS50byBlcShAY29udGV4dCkKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHJlYXNvbmFibGUgdG9fcyIgZG8KKyAgICAgIGV4cGVjdChUaHJpZnQ6OlNTTFNvY2tldC5uZXcoJ215aG9zdCcsIDgwOTApLnRvX3MpLnRvIGVxKCJzc2woc29ja2V0KG15aG9zdDo4MDkwKSkiKQorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvc3RydWN0X25lc3RlZF9jb250YWluZXJzX3NwZWMucmIgYi9saWIvcmIvc3BlYy9zdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfc3BlYy5yYgppbmRleCBkYzhjZTVmLi5kMDYzNTY5IDEwMDY0NAotLS0gYS9saWIvcmIvc3BlYy9zdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfc3BlYy5yYgorKysgYi9saWIvcmIvc3BlYy9zdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfc3BlYy5yYgpAQCAtMzksOSArMzksOSBAQAogICAgICAgICAgIHRocmlmdF9zdHJ1Y3QudmFsdWUgPSBbIFsxLCAyLCAzXSwgWzIsIDMsIDRdIF0KICAgICAgICAgICB0aHJpZnRfc3RydWN0LnZhbGlkYXRlCiAgICAgICAgIGVuZAotICAgICAgICBhLnNob3VsZCA9PSBiCisgICAgICAgIGV4cGVjdChhKS50byBlcShiKQogICAgICAgICBiLnZhbHVlLnB1c2ggWzMsIDQsIDVdCi0gICAgICAgIGEuc2hvdWxkX25vdCA9PSBiCisgICAgICAgIGV4cGVjdChhKS5ub3RfdG8gZXEoYikKICAgICAgIGVuZAogICAgIGVuZAogCkBAIC01Miw5ICs1Miw5IEBACiAgICAgICAgICAgdGhyaWZ0X3N0cnVjdC52YWx1ZSA9IFsgWzEsIDIsIDNdLCBbMiwgMywgNF0gXS50b19zZXQKICAgICAgICAgICB0aHJpZnRfc3RydWN0LnZhbGlkYXRlCiAgICAgICAgIGVuZAotICAgICAgICBhLnNob3VsZCA9PSBiCisgICAgICAgIGV4cGVjdChhKS50byBlcShiKQogICAgICAgICBiLnZhbHVlLmFkZCBbMywgNCwgNV0KLSAgICAgICAgYS5zaG91bGRfbm90ID09IGIKKyAgICAgICAgZXhwZWN0KGEpLm5vdF90byBlcShiKQogICAgICAgZW5kCiAgICAgZW5kCiAKQEAgLTY1LDkgKzY1LDkgQEAKICAgICAgICAgICB0aHJpZnRfc3RydWN0LnZhbHVlID0geyBbMSwgMiwgM10gPT4gMSwgWzIsIDMsIDRdID0+IDIgfQogICAgICAgICAgIHRocmlmdF9zdHJ1Y3QudmFsaWRhdGUKICAgICAgICAgZW5kCi0gICAgICAgIGEuc2hvdWxkID09IGIKKyAgICAgICAgZXhwZWN0KGEpLnRvIGVxKGIpCiAgICAgICAgIGIudmFsdWVbWzMsIDQsIDVdXSA9IDMKLSAgICAgICAgYS5zaG91bGRfbm90ID09IGIKKyAgICAgICAgZXhwZWN0KGEpLm5vdF90byBlcShiKQogICAgICAgZW5kCiAgICAgZW5kCiAKQEAgLTc4LDkgKzc4LDkgQEAKICAgICAgICAgICB0aHJpZnRfc3RydWN0LnZhbHVlID0geyAxID0+IFsxLCAyLCAzXSwgMiA9PiBbMiwgMywgNF0gfQogICAgICAgICAgIHRocmlmdF9zdHJ1Y3QudmFsaWRhdGUKICAgICAgICAgZW5kCi0gICAgICAgIGEuc2hvdWxkID09IGIKKyAgICAgICAgZXhwZWN0KGEpLnRvIGVxKGIpCiAgICAgICAgIGIudmFsdWVbM10gPSBbMywgNCwgNV0KLSAgICAgICAgYS5zaG91bGRfbm90ID09IGIKKyAgICAgICAgZXhwZWN0KGEpLm5vdF90byBlcShiKQogICAgICAgZW5kCiAgICAgZW5kCiAKQEAgLTkxLDkgKzkxLDkgQEAKICAgICAgICAgICB0aHJpZnRfc3RydWN0LnZhbHVlID0gWyBbMSwgMiwgM10udG9fc2V0LCBbMiwgMywgNF0udG9fc2V0IF0KICAgICAgICAgICB0aHJpZnRfc3RydWN0LnZhbGlkYXRlCiAgICAgICAgIGVuZAotICAgICAgICBhLnNob3VsZCA9PSBiCisgICAgICAgIGV4cGVjdChhKS50byBlcShiKQogICAgICAgICBiLnZhbHVlLnB1c2goWzMsIDQsIDVdLnRvX3NldCkKLSAgICAgICAgYS5zaG91bGRfbm90ID09IGIKKyAgICAgICAgZXhwZWN0KGEpLm5vdF90byBlcShiKQogICAgICAgZW5kCiAgICAgZW5kCiAKQEAgLTEwNCw5ICsxMDQsOSBAQAogICAgICAgICAgIHRocmlmdF9zdHJ1Y3QudmFsdWUgPSBbIFsxLCAyLCAzXS50b19zZXQsIFsyLCAzLCA0XS50b19zZXQgXS50b19zZXQKICAgICAgICAgICB0aHJpZnRfc3RydWN0LnZhbGlkYXRlCiAgICAgICAgIGVuZAotICAgICAgICBhLnNob3VsZCA9PSBiCisgICAgICAgIGV4cGVjdChhKS50byBlcShiKQogICAgICAgICBiLnZhbHVlLmFkZChbMywgNCwgNV0udG9fc2V0KQotICAgICAgICBhLnNob3VsZF9ub3QgPT0gYgorICAgICAgICBleHBlY3QoYSkubm90X3RvIGVxKGIpCiAgICAgICBlbmQKICAgICBlbmQKIApAQCAtMTE3LDkgKzExNyw5IEBACiAgICAgICAgICAgdGhyaWZ0X3N0cnVjdC52YWx1ZSA9IHsgWzEsIDIsIDNdLnRvX3NldCA9PiAxLCBbMiwgMywgNF0udG9fc2V0ID0+IDIgfQogICAgICAgICAgIHRocmlmdF9zdHJ1Y3QudmFsaWRhdGUKICAgICAgICAgZW5kCi0gICAgICAgIGEuc2hvdWxkID09IGIKKyAgICAgICAgZXhwZWN0KGEpLnRvIGVxKGIpCiAgICAgICAgIGIudmFsdWVbWzMsIDQsIDVdLnRvX3NldF0gPSAzCi0gICAgICAgIGEuc2hvdWxkX25vdCA9PSBiCisgICAgICAgIGV4cGVjdChhKS5ub3RfdG8gZXEoYikKICAgICAgIGVuZAogICAgIGVuZAogCkBAIC0xMzAsOSArMTMwLDkgQEAKICAgICAgICAgICB0aHJpZnRfc3RydWN0LnZhbHVlID0geyAxID0+IFsxLCAyLCAzXS50b19zZXQsIDIgPT4gWzIsIDMsIDRdLnRvX3NldCB9CiAgICAgICAgICAgdGhyaWZ0X3N0cnVjdC52YWxpZGF0ZQogICAgICAgICBlbmQKLSAgICAgICAgYS5zaG91bGQgPT0gYgorICAgICAgICBleHBlY3QoYSkudG8gZXEoYikKICAgICAgICAgYi52YWx1ZVszXSA9IFszLCA0LCA1XS50b19zZXQKLSAgICAgICAgYS5zaG91bGRfbm90ID09IGIKKyAgICAgICAgZXhwZWN0KGEpLm5vdF90byBlcShiKQogICAgICAgZW5kCiAgICAgZW5kCiAKQEAgLTE0Myw5ICsxNDMsOSBAQAogICAgICAgICAgIHRocmlmdF9zdHJ1Y3QudmFsdWUgPSBbIHsxID0+IDIsIDMgPT4gNH0sIHsyID0+IDMsIDQgPT4gNX0gXQogICAgICAgICAgIHRocmlmdF9zdHJ1Y3QudmFsaWRhdGUKICAgICAgICAgZW5kCi0gICAgICAgIGEuc2hvdWxkID09IGIKKyAgICAgICAgZXhwZWN0KGEpLnRvIGVxKGIpCiAgICAgICAgIGIudmFsdWUucHVzaCh7IDMgPT4gNCwgNSA9PiA2IH0pCi0gICAgICAgIGEuc2hvdWxkX25vdCA9PSBiCisgICAgICAgIGV4cGVjdChhKS5ub3RfdG8gZXEoYikKICAgICAgIGVuZAogICAgIGVuZAogCkBAIC0xNTYsOSArMTU2LDkgQEAKICAgICAgICAgICB0aHJpZnRfc3RydWN0LnZhbHVlID0gWyB7MSA9PiAyLCAzID0+IDR9LCB7MiA9PiAzLCA0ID0+IDV9IF0udG9fc2V0CiAgICAgICAgICAgdGhyaWZ0X3N0cnVjdC52YWxpZGF0ZQogICAgICAgICBlbmQKLSAgICAgICAgYS5zaG91bGQgPT0gYgorICAgICAgICBleHBlY3QoYSkudG8gZXEoYikKICAgICAgICAgYi52YWx1ZS5hZGQoeyAzID0+IDQsIDUgPT4gNiB9KQotICAgICAgICBhLnNob3VsZF9ub3QgPT0gYgorICAgICAgICBleHBlY3QoYSkubm90X3RvIGVxKGIpCiAgICAgICBlbmQKICAgICBlbmQKIApAQCAtMTY5LDkgKzE2OSw5IEBACiAgICAgICAgICAgdGhyaWZ0X3N0cnVjdC52YWx1ZSA9IHsgeyAxID0+IDIsIDMgPT4gNH0gPT4gMSwgezIgPT4gMywgNCA9PiA1fSAgPT4gMiB9CiAgICAgICAgICAgdGhyaWZ0X3N0cnVjdC52YWxpZGF0ZQogICAgICAgICBlbmQKLSAgICAgICAgYS5zaG91bGQgPT0gYgorICAgICAgICBleHBlY3QoYSkudG8gZXEoYikKICAgICAgICAgYi52YWx1ZVt7MyA9PiA0LCA1ID0+IDZ9XSA9IDMKLSAgICAgICAgYS5zaG91bGRfbm90ID09IGIKKyAgICAgICAgZXhwZWN0KGEpLm5vdF90byBlcShiKQogICAgICAgZW5kCiAgICAgZW5kCiAKQEAgLTE4Miw5ICsxODIsOSBAQAogICAgICAgICAgIHRocmlmdF9zdHJ1Y3QudmFsdWUgPSB7IDEgPT4geyAxID0+IDIsIDMgPT4gNH0sIDIgPT4gezIgPT4gMywgNCA9PiA1fSB9CiAgICAgICAgICAgdGhyaWZ0X3N0cnVjdC52YWxpZGF0ZQogICAgICAgICBlbmQKLSAgICAgICAgYS5zaG91bGQgPT0gYgorICAgICAgICBleHBlY3QoYSkudG8gZXEoYikKICAgICAgICAgYi52YWx1ZVszXSA9IHsgMyA9PiA0LCA1ID0+IDYgfQotICAgICAgICBhLnNob3VsZF9ub3QgPT0gYgorICAgICAgICBleHBlY3QoYSkubm90X3RvIGVxKGIpCiAgICAgICBlbmQKICAgICBlbmQKICAgZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9zdHJ1Y3Rfc3BlYy5yYiBiL2xpYi9yYi9zcGVjL3N0cnVjdF9zcGVjLnJiCmluZGV4IDY1MzRkNjEuLmJiZDUwMmIgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9zcGVjL3N0cnVjdF9zcGVjLnJiCisrKyBiL2xpYi9yYi9zcGVjL3N0cnVjdF9zcGVjLnJiCkBAIC0yNSw3ICsyNSw3IEBACiAgICAgaXQgInNob3VsZCBpdGVyYXRlIG92ZXIgYWxsIGZpZWxkcyBwcm9wZXJseSIgZG8KICAgICAgIGZpZWxkcyA9IHt9CiAgICAgICBTcGVjTmFtZXNwYWNlOjpGb28ubmV3LmVhY2hfZmllbGQgeyB8ZmlkLGZpZWxkX2luZm98IGZpZWxkc1tmaWRdID0gZmllbGRfaW5mbyB9Ci0gICAgICBmaWVsZHMuc2hvdWxkID09IFNwZWNOYW1lc3BhY2U6OkZvbzo6RklFTERTCisgICAgICBleHBlY3QoZmllbGRzKS50byBlcShTcGVjTmFtZXNwYWNlOjpGb286OkZJRUxEUykKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgaW5pdGlhbGl6ZSBhbGwgZmllbGRzIHRvIGRlZmF1bHRzIiBkbwpAQCAtMzksMTkgKzM5LDE5IEBACiAgICAgZW5kCiAKICAgICBkZWYgdmFsaWRhdGVfZGVmYXVsdF9hcmd1bWVudHMob2JqZWN0KQotICAgICAgb2JqZWN0LnNpbXBsZS5zaG91bGQgPT0gNTMKLSAgICAgIG9iamVjdC53b3Jkcy5zaG91bGQgPT0gIndvcmRzIgotICAgICAgb2JqZWN0LmhlbGxvLnNob3VsZCA9PSBTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcoOmdyZWV0aW5nID0+ICdoZWxsbywgd29ybGQhJykKLSAgICAgIG9iamVjdC5pbnRzLnNob3VsZCA9PSBbMSwgMiwgMiwgM10KLSAgICAgIG9iamVjdC5jb21wbGV4LnNob3VsZCBiZV9uaWwKLSAgICAgIG9iamVjdC5zaG9ydHMuc2hvdWxkID09IFNldC5uZXcoWzUsIDE3LCAyMzldKQorICAgICAgZXhwZWN0KG9iamVjdC5zaW1wbGUpLnRvIGVxKDUzKQorICAgICAgZXhwZWN0KG9iamVjdC53b3JkcykudG8gZXEoIndvcmRzIikKKyAgICAgIGV4cGVjdChvYmplY3QuaGVsbG8pLnRvIGVxKFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldyg6Z3JlZXRpbmcgPT4gJ2hlbGxvLCB3b3JsZCEnKSkKKyAgICAgIGV4cGVjdChvYmplY3QuaW50cykudG8gZXEoWzEsIDIsIDIsIDNdKQorICAgICAgZXhwZWN0KG9iamVjdC5jb21wbGV4KS50byBiZV9uaWwKKyAgICAgIGV4cGVjdChvYmplY3Quc2hvcnRzKS50byBlcShTZXQubmV3KFs1LCAxNywgMjM5XSkpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIG5vdCBzaGFyZSBkZWZhdWx0IHZhbHVlcyBiZXR3ZWVuIGluc3RhbmNlcyIgZG8KICAgICAgIGJlZ2luCiAgICAgICAgIHN0cnVjdCA9IFNwZWNOYW1lc3BhY2U6OkZvby5uZXcKICAgICAgICAgc3RydWN0LmludHMgPDwgMTcKLSAgICAgICAgU3BlY05hbWVzcGFjZTo6Rm9vLm5ldy5pbnRzLnNob3VsZCA9PSBbMSwyLDIsM10KKyAgICAgICAgZXhwZWN0KFNwZWNOYW1lc3BhY2U6OkZvby5uZXcuaW50cykudG8gZXEoWzEsMiwyLDNdKQogICAgICAgZW5zdXJlCiAgICAgICAgICMgZW5zdXJlIG5vIGxlYWthZ2UgdG8gb3RoZXIgdGVzdHMKICAgICAgICAgU3BlY05hbWVzcGFjZTo6Rm9vOjpGSUVMRFNbNF1bOmRlZmF1bHRdID0gWzEsMiwyLDNdCkBAIC02MCw0OCArNjAsNDggQEAKIAogICAgIGl0ICJzaG91bGQgcHJvcGVybHkgaW5pdGlhbGl6ZSBib29sZWFuIHZhbHVlcyIgZG8KICAgICAgIHN0cnVjdCA9IFNwZWNOYW1lc3BhY2U6OkJvb2xTdHJ1Y3QubmV3KDp5ZXNubyA9PiBmYWxzZSkKLSAgICAgIHN0cnVjdC55ZXNuby5zaG91bGQgYmVfZmFsc2UKKyAgICAgIGV4cGVjdChzdHJ1Y3QueWVzbm8pLnRvIGJlX2ZhbHNleQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBoYXZlIHByb3BlciA9PSBzZW1hbnRpY3MiIGRvCi0gICAgICBTcGVjTmFtZXNwYWNlOjpGb28ubmV3LnNob3VsZF9ub3QgPT0gU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3Ci0gICAgICBTcGVjTmFtZXNwYWNlOjpGb28ubmV3LnNob3VsZCA9PSBTcGVjTmFtZXNwYWNlOjpGb28ubmV3Ci0gICAgICBTcGVjTmFtZXNwYWNlOjpGb28ubmV3KDpzaW1wbGUgPT4gNTIpLnNob3VsZF9ub3QgPT0gU3BlY05hbWVzcGFjZTo6Rm9vLm5ldworICAgICAgZXhwZWN0KFNwZWNOYW1lc3BhY2U6OkZvby5uZXcpLm5vdF90byBlcShTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcpCisgICAgICBleHBlY3QoU3BlY05hbWVzcGFjZTo6Rm9vLm5ldykudG8gZXEoU3BlY05hbWVzcGFjZTo6Rm9vLm5ldykKKyAgICAgIGV4cGVjdChTcGVjTmFtZXNwYWNlOjpGb28ubmV3KDpzaW1wbGUgPT4gNTIpKS5ub3RfdG8gZXEoU3BlY05hbWVzcGFjZTo6Rm9vLm5ldykKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcHJpbnQgZW51bSB2YWx1ZSBuYW1lcyBpbiBpbnNwZWN0IiBkbwotICAgICAgU3BlY05hbWVzcGFjZTo6U3RydWN0V2l0aFNvbWVFbnVtLm5ldyg6c29tZV9lbnVtID0+IFNwZWNOYW1lc3BhY2U6OlNvbWVFbnVtOjpPTkUpLmluc3BlY3Quc2hvdWxkID09ICI8U3BlY05hbWVzcGFjZTo6U3RydWN0V2l0aFNvbWVFbnVtIHNvbWVfZW51bTpPTkUgKDApPiIKKyAgICAgIGV4cGVjdChTcGVjTmFtZXNwYWNlOjpTdHJ1Y3RXaXRoU29tZUVudW0ubmV3KDpzb21lX2VudW0gPT4gU3BlY05hbWVzcGFjZTo6U29tZUVudW06Ok9ORSkuaW5zcGVjdCkudG8gZXEoIjxTcGVjTmFtZXNwYWNlOjpTdHJ1Y3RXaXRoU29tZUVudW0gc29tZV9lbnVtOk9ORSAoMCk+IikKIAotICAgICAgU3BlY05hbWVzcGFjZTo6U3RydWN0V2l0aEVudW1NYXAubmV3KDpteV9tYXAgPT4ge1NwZWNOYW1lc3BhY2U6OlNvbWVFbnVtOjpPTkUgPT4gW1NwZWNOYW1lc3BhY2U6OlNvbWVFbnVtOjpUV09dfSkuaW5zcGVjdC5zaG91bGQgPT0gIjxTcGVjTmFtZXNwYWNlOjpTdHJ1Y3RXaXRoRW51bU1hcCBteV9tYXA6e09ORSAoMCk6IFtUV08gKDEpXX0+IgorICAgICAgZXhwZWN0KFNwZWNOYW1lc3BhY2U6OlN0cnVjdFdpdGhFbnVtTWFwLm5ldyg6bXlfbWFwID0+IHtTcGVjTmFtZXNwYWNlOjpTb21lRW51bTo6T05FID0+IFtTcGVjTmFtZXNwYWNlOjpTb21lRW51bTo6VFdPXX0pLmluc3BlY3QpLnRvIGVxKCI8U3BlY05hbWVzcGFjZTo6U3RydWN0V2l0aEVudW1NYXAgbXlfbWFwOntPTkUgKDApOiBbVFdPICgxKV19PiIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHByZXR0eSBwcmludCBiaW5hcnkgZmllbGRzIiBkbwotICAgICAgU3BlY05hbWVzcGFjZTo6Rm9vMi5uZXcoOm15X2JpbmFyeSA9PiAiXDAwMVwwMDJcMDAzIikuaW5zcGVjdC5zaG91bGQgPT0gIjxTcGVjTmFtZXNwYWNlOjpGb28yIG15X2JpbmFyeTowMTAyMDM+IgorICAgICAgZXhwZWN0KFNwZWNOYW1lc3BhY2U6OkZvbzIubmV3KDpteV9iaW5hcnkgPT4gIlwwMDFcMDAyXDAwMyIpLmluc3BlY3QpLnRvIGVxKCI8U3BlY05hbWVzcGFjZTo6Rm9vMiBteV9iaW5hcnk6MDEwMjAzPiIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIG9mZmVyIGZpZWxkPyBtZXRob2RzIiBkbwotICAgICAgU3BlY05hbWVzcGFjZTo6Rm9vLm5ldy5vcHRfc3RyaW5nPy5zaG91bGQgYmVfZmFsc2UKLSAgICAgIFNwZWNOYW1lc3BhY2U6OkZvby5uZXcoOnNpbXBsZSA9PiA1Mikuc2ltcGxlPy5zaG91bGQgYmVfdHJ1ZQotICAgICAgU3BlY05hbWVzcGFjZTo6Rm9vLm5ldyg6bXlfYm9vbCA9PiBmYWxzZSkubXlfYm9vbD8uc2hvdWxkIGJlX3RydWUKLSAgICAgIFNwZWNOYW1lc3BhY2U6OkZvby5uZXcoOm15X2Jvb2wgPT4gdHJ1ZSkubXlfYm9vbD8uc2hvdWxkIGJlX3RydWUKKyAgICAgIGV4cGVjdChTcGVjTmFtZXNwYWNlOjpGb28ubmV3Lm9wdF9zdHJpbmc/KS50byBiZV9mYWxzZXkKKyAgICAgIGV4cGVjdChTcGVjTmFtZXNwYWNlOjpGb28ubmV3KDpzaW1wbGUgPT4gNTIpLnNpbXBsZT8pLnRvIGJlX3RydXRoeQorICAgICAgZXhwZWN0KFNwZWNOYW1lc3BhY2U6OkZvby5uZXcoOm15X2Jvb2wgPT4gZmFsc2UpLm15X2Jvb2w/KS50byBiZV90cnV0aHkKKyAgICAgIGV4cGVjdChTcGVjTmFtZXNwYWNlOjpGb28ubmV3KDpteV9ib29sID0+IHRydWUpLm15X2Jvb2w/KS50byBiZV90cnV0aHkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgYmUgY29tcGFyYWJsZSIgZG8KICAgICAgIHMxID0gU3BlY05hbWVzcGFjZTo6U3RydWN0V2l0aFNvbWVFbnVtLm5ldyg6c29tZV9lbnVtID0+IFNwZWNOYW1lc3BhY2U6OlNvbWVFbnVtOjpPTkUpCiAgICAgICBzMiA9IFNwZWNOYW1lc3BhY2U6OlN0cnVjdFdpdGhTb21lRW51bS5uZXcoOnNvbWVfZW51bSA9PiBTcGVjTmFtZXNwYWNlOjpTb21lRW51bTo6VFdPKQogCi0gICAgICAoczEgPD0+IHMyKS5zaG91bGQgPT0gLTEKLSAgICAgIChzMiA8PT4gczEpLnNob3VsZCA9PSAxCi0gICAgICAoczEgPD0+IHMxKS5zaG91bGQgPT0gMAotICAgICAgKHMxIDw9PiBTcGVjTmFtZXNwYWNlOjpTdHJ1Y3RXaXRoU29tZUVudW0ubmV3KCkpLnNob3VsZCA9PSAtMQorICAgICAgZXhwZWN0KHMxIDw9PiBzMikudG8gZXEoLTEpCisgICAgICBleHBlY3QoczIgPD0+IHMxKS50byBlcSgxKQorICAgICAgZXhwZWN0KHMxIDw9PiBzMSkudG8gZXEoMCkKKyAgICAgIGV4cGVjdChzMSA8PT4gU3BlY05hbWVzcGFjZTo6U3RydWN0V2l0aFNvbWVFbnVtLm5ldygpKS50byBlcSgtMSkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmVhZCBpdHNlbGYgb2ZmIHRoZSB3aXJlIiBkbwogICAgICAgc3RydWN0ID0gU3BlY05hbWVzcGFjZTo6Rm9vLm5ldwotICAgICAgcHJvdCA9IFRocmlmdDo6QmFzZVByb3RvY29sLm5ldyhtb2NrKCJ0cmFuc3BvcnQiKSkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfc3RydWN0X2JlZ2luKS50d2ljZQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9zdHJ1Y3RfZW5kKS50d2ljZQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9maWVsZF9iZWdpbikuYW5kX3JldHVybigKKyAgICAgIHByb3QgPSBUaHJpZnQ6OkJhc2VQcm90b2NvbC5uZXcoZG91YmxlKCJ0cmFuc3BvcnQiKSkKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX3N0cnVjdF9iZWdpbikudHdpY2UKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX3N0cnVjdF9lbmQpLnR3aWNlCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9maWVsZF9iZWdpbikuYW5kX3JldHVybigKICAgICAgICAgWydjb21wbGV4JywgVGhyaWZ0OjpUeXBlczo6TUFQLCA1XSwgIyBGb28KICAgICAgICAgWyd3b3JkcycsIFRocmlmdDo6VHlwZXM6OlNUUklORywgMl0sICMgRm9vCiAgICAgICAgIFsnaGVsbG8nLCBUaHJpZnQ6OlR5cGVzOjpTVFJVQ1QsIDNdLCAjIEZvbwpAQCAtMTEyLDQ5ICsxMTIsNDkgQEAKICAgICAgICAgWydzaG9ydHMnLCBUaHJpZnQ6OlR5cGVzOjpTRVQsIDZdLCAjIEZvbwogICAgICAgICBbbmlsLCBUaHJpZnQ6OlR5cGVzOjpTVE9QLCAwXSAjIEhlbGxvCiAgICAgICApCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2ZpZWxkX2VuZCkuZXhhY3RseSg3KS50aW1lcwotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9tYXBfYmVnaW4pLmFuZF9yZXR1cm4oCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9maWVsZF9lbmQpLmV4YWN0bHkoNykudGltZXMKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX21hcF9iZWdpbikuYW5kX3JldHVybigKICAgICAgICAgW1RocmlmdDo6VHlwZXM6OkkzMiwgVGhyaWZ0OjpUeXBlczo6TUFQLCAyXSwgIyBjb21wbGV4CiAgICAgICAgICAgW1RocmlmdDo6VHlwZXM6OlNUUklORywgVGhyaWZ0OjpUeXBlczo6RE9VQkxFLCAyXSwgIyBjb21wbGV4LzEvdmFsdWUKICAgICAgICAgICBbVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCBUaHJpZnQ6OlR5cGVzOjpET1VCTEUsIDFdICMgY29tcGxleC8yL3ZhbHVlCiAgICAgICApCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX21hcF9lbmQpLmV4YWN0bHkoMykudGltZXMKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfbGlzdF9iZWdpbikuYW5kX3JldHVybihbVGhyaWZ0OjpUeXBlczo6STMyLCA0XSkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfbGlzdF9lbmQpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX3NldF9iZWdpbikuYW5kX3JldHVybihbVGhyaWZ0OjpUeXBlczo6STE2LCAyXSkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfc2V0X2VuZCkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfaTMyKS5hbmRfcmV0dXJuKAorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfbWFwX2VuZCkuZXhhY3RseSgzKS50aW1lcworICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfbGlzdF9iZWdpbikuYW5kX3JldHVybihbVGhyaWZ0OjpUeXBlczo6STMyLCA0XSkKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX2xpc3RfZW5kKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfc2V0X2JlZ2luKS5hbmRfcmV0dXJuKFtUaHJpZnQ6OlR5cGVzOjpJMTYsIDJdKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfc2V0X2VuZCkKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX2kzMikuYW5kX3JldHVybigKICAgICAgICAgMSwgMTQsICAgICAgICAjIGNvbXBsZXgga2V5cwogICAgICAgICA0MiwgICAgICAgICAgICMgc2ltcGxlCiAgICAgICAgIDQsIDIzLCA0LCAyOSAgIyBpbnRzCiAgICAgICApCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX3N0cmluZykuYW5kX3JldHVybigicGkiLCAiZSIsICJmZWlnZW5iYXVtIiwgImFwcGxlIGJhbmFuYSIsICJ3aGF0J3MgdXA/IikKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfZG91YmxlKS5hbmRfcmV0dXJuKE1hdGg6OlBJLCBNYXRoOjpFLCA0LjY2OTIwMTYwOSkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfaTE2KS5hbmRfcmV0dXJuKDIsIDMpCi0gICAgICBwcm90LnNob3VsZF9ub3RfcmVjZWl2ZSg6c2tpcCkKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX3N0cmluZykuYW5kX3JldHVybigicGkiLCAiZSIsICJmZWlnZW5iYXVtIiwgImFwcGxlIGJhbmFuYSIsICJ3aGF0J3MgdXA/IikKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX2RvdWJsZSkuYW5kX3JldHVybihNYXRoOjpQSSwgTWF0aDo6RSwgNC42NjkyMDE2MDkpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9pMTYpLmFuZF9yZXR1cm4oMiwgMykKKyAgICAgIGV4cGVjdChwcm90KS5ub3RfdG8gcmVjZWl2ZSg6c2tpcCkKICAgICAgIHN0cnVjdC5yZWFkKHByb3QpCiAKLSAgICAgIHN0cnVjdC5zaW1wbGUuc2hvdWxkID09IDQyCi0gICAgICBzdHJ1Y3QuY29tcGxleC5zaG91bGQgPT0gezEgPT4geyJwaSIgPT4gTWF0aDo6UEksICJlIiA9PiBNYXRoOjpFfSwgMTQgPT4geyJmZWlnZW5iYXVtIiA9PiA0LjY2OTIwMTYwOX19Ci0gICAgICBzdHJ1Y3QuaGVsbG8uc2hvdWxkID09IFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldyg6Z3JlZXRpbmcgPT4gIndoYXQncyB1cD8iKQotICAgICAgc3RydWN0LndvcmRzLnNob3VsZCA9PSAiYXBwbGUgYmFuYW5hIgotICAgICAgc3RydWN0LmludHMuc2hvdWxkID09IFs0LCAyMywgNCwgMjldCi0gICAgICBzdHJ1Y3Quc2hvcnRzLnNob3VsZCA9PSBTZXQubmV3KFszLCAyXSkKKyAgICAgIGV4cGVjdChzdHJ1Y3Quc2ltcGxlKS50byBlcSg0MikKKyAgICAgIGV4cGVjdChzdHJ1Y3QuY29tcGxleCkudG8gZXEoezEgPT4geyJwaSIgPT4gTWF0aDo6UEksICJlIiA9PiBNYXRoOjpFfSwgMTQgPT4geyJmZWlnZW5iYXVtIiA9PiA0LjY2OTIwMTYwOX19KQorICAgICAgZXhwZWN0KHN0cnVjdC5oZWxsbykudG8gZXEoU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3KDpncmVldGluZyA9PiAid2hhdCdzIHVwPyIpKQorICAgICAgZXhwZWN0KHN0cnVjdC53b3JkcykudG8gZXEoImFwcGxlIGJhbmFuYSIpCisgICAgICBleHBlY3Qoc3RydWN0LmludHMpLnRvIGVxKFs0LCAyMywgNCwgMjldKQorICAgICAgZXhwZWN0KHN0cnVjdC5zaG9ydHMpLnRvIGVxKFNldC5uZXcoWzMsIDJdKSkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgc2VyaWFsaXplIGZhbHNlIGJvb2xlYW4gZmllbGRzIGNvcnJlY3RseSIgZG8KICAgICAgIGIgPSBTcGVjTmFtZXNwYWNlOjpCb29sU3RydWN0Lm5ldyg6eWVzbm8gPT4gZmFsc2UpCiAgICAgICBwcm90ID0gVGhyaWZ0OjpCaW5hcnlQcm90b2NvbC5uZXcoVGhyaWZ0OjpNZW1vcnlCdWZmZXJUcmFuc3BvcnQubmV3KQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfYm9vbCkud2l0aChmYWxzZSkKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9ib29sKS53aXRoKGZhbHNlKQogICAgICAgYi53cml0ZShwcm90KQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBza2lwIHVuZXhwZWN0ZWQgZmllbGRzIGluIHN0cnVjdHMgYW5kIHVzZSBkZWZhdWx0IHZhbHVlcyIgZG8KICAgICAgIHN0cnVjdCA9IFNwZWNOYW1lc3BhY2U6OkZvby5uZXcKLSAgICAgIHByb3QgPSBUaHJpZnQ6OkJhc2VQcm90b2NvbC5uZXcobW9jaygidHJhbnNwb3J0IikpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX3N0cnVjdF9iZWdpbikKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfc3RydWN0X2VuZCkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfZmllbGRfYmVnaW4pLmFuZF9yZXR1cm4oCisgICAgICBwcm90ID0gVGhyaWZ0OjpCYXNlUHJvdG9jb2wubmV3KGRvdWJsZSgidHJhbnNwb3J0IikpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9zdHJ1Y3RfYmVnaW4pCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9zdHJ1Y3RfZW5kKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfZmllbGRfYmVnaW4pLmFuZF9yZXR1cm4oCiAgICAgICAgIFsnc2ltcGxlJywgVGhyaWZ0OjpUeXBlczo6STMyLCAxXSwKICAgICAgICAgWydjb21wbGV4JywgVGhyaWZ0OjpUeXBlczo6U1RSVUNULCA1XSwKICAgICAgICAgWyd0aGlueicsIFRocmlmdDo6VHlwZXM6Ok1BUCwgN10sCkBAIC0xNjIsNTUgKzE2Miw1NSBAQAogICAgICAgICBbJ3dvcmRzJywgVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCAyXSwKICAgICAgICAgW25pbCwgVGhyaWZ0OjpUeXBlczo6U1RPUCwgMF0KICAgICAgICkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfZmllbGRfZW5kKS5leGFjdGx5KDUpLnRpbWVzCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2kzMikuYW5kX3JldHVybig0MikKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfc3RyaW5nKS5hbmRfcmV0dXJuKCJmb29iYXIiKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6c2tpcCkud2l0aChUaHJpZnQ6OlR5cGVzOjpTVFJVQ1QpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpza2lwKS53aXRoKFRocmlmdDo6VHlwZXM6Ok1BUCkKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX2ZpZWxkX2VuZCkuZXhhY3RseSg1KS50aW1lcworICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfaTMyKS5hbmRfcmV0dXJuKDQyKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfc3RyaW5nKS5hbmRfcmV0dXJuKCJmb29iYXIiKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnNraXApLndpdGgoVGhyaWZ0OjpUeXBlczo6U1RSVUNUKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnNraXApLndpdGgoVGhyaWZ0OjpUeXBlczo6TUFQKQogICAgICAgIyBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX21hcF9iZWdpbikuYW5kX3JldHVybihbVGhyaWZ0OjpUeXBlczo6STMyLCBUaHJpZnQ6OlR5cGVzOjpJMzIsIDBdKQogICAgICAgIyBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX21hcF9lbmQpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpza2lwKS53aXRoKFRocmlmdDo6VHlwZXM6OkkzMikKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpza2lwKS53aXRoKFRocmlmdDo6VHlwZXM6OkkzMikKICAgICAgIHN0cnVjdC5yZWFkKHByb3QpCiAKLSAgICAgIHN0cnVjdC5zaW1wbGUuc2hvdWxkID09IDQyCi0gICAgICBzdHJ1Y3QuY29tcGxleC5zaG91bGQgYmVfbmlsCi0gICAgICBzdHJ1Y3Qud29yZHMuc2hvdWxkID09ICJmb29iYXIiCi0gICAgICBzdHJ1Y3QuaGVsbG8uc2hvdWxkID09IFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldyg6Z3JlZXRpbmcgPT4gJ2hlbGxvLCB3b3JsZCEnKQotICAgICAgc3RydWN0LmludHMuc2hvdWxkID09IFsxLCAyLCAyLCAzXQotICAgICAgc3RydWN0LnNob3J0cy5zaG91bGQgPT0gU2V0Lm5ldyhbNSwgMTcsIDIzOV0pCisgICAgICBleHBlY3Qoc3RydWN0LnNpbXBsZSkudG8gZXEoNDIpCisgICAgICBleHBlY3Qoc3RydWN0LmNvbXBsZXgpLnRvIGJlX25pbAorICAgICAgZXhwZWN0KHN0cnVjdC53b3JkcykudG8gZXEoImZvb2JhciIpCisgICAgICBleHBlY3Qoc3RydWN0LmhlbGxvKS50byBlcShTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcoOmdyZWV0aW5nID0+ICdoZWxsbywgd29ybGQhJykpCisgICAgICBleHBlY3Qoc3RydWN0LmludHMpLnRvIGVxKFsxLCAyLCAyLCAzXSkKKyAgICAgIGV4cGVjdChzdHJ1Y3Quc2hvcnRzKS50byBlcShTZXQubmV3KFs1LCAxNywgMjM5XSkpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHdyaXRlIGl0c2VsZiB0byB0aGUgd2lyZSIgZG8KLSAgICAgIHByb3QgPSBUaHJpZnQ6OkJhc2VQcm90b2NvbC5uZXcobW9jaygidHJhbnNwb3J0IikpICNtb2NrKCJQcm90b2NvbCIpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfYmVnaW4pLndpdGgoIlNwZWNOYW1lc3BhY2U6OkZvbyIpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfYmVnaW4pLndpdGgoIlNwZWNOYW1lc3BhY2U6OkhlbGxvIikKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX3N0cnVjdF9lbmQpLnR3aWNlCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgnaW50cycsIFRocmlmdDo6VHlwZXM6OkxJU1QsIDQpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9pMzIpLndpdGgoMSkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2kzMikud2l0aCgyKS50d2ljZQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfaTMyKS53aXRoKDMpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgnY29tcGxleCcsIFRocmlmdDo6VHlwZXM6Ok1BUCwgNSkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2kzMikud2l0aCg1KQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfc3RyaW5nKS53aXRoKCdmb28nKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZG91YmxlKS53aXRoKDEuMjMpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgnc2hvcnRzJywgVGhyaWZ0OjpUeXBlczo6U0VULCA2KQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfaTE2KS53aXRoKDUpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9pMTYpLndpdGgoMTcpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9pMTYpLndpdGgoMjM5KQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfc3RvcCkudHdpY2UKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX2VuZCkuZXhhY3RseSg2KS50aW1lcwotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoJ3NpbXBsZScsIFRocmlmdDo6VHlwZXM6OkkzMiwgMSkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2kzMikud2l0aCg1MykKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCdoZWxsbycsIFRocmlmdDo6VHlwZXM6OlNUUlVDVCwgMykKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCdncmVldGluZycsIFRocmlmdDo6VHlwZXM6OlNUUklORywgMSkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX3N0cmluZykud2l0aCgnaGVsbG8sIHdvcmxkIScpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9tYXBfYmVnaW4pLndpdGgoVGhyaWZ0OjpUeXBlczo6STMyLCBUaHJpZnQ6OlR5cGVzOjpNQVAsIDEpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9tYXBfYmVnaW4pLndpdGgoVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCBUaHJpZnQ6OlR5cGVzOjpET1VCTEUsIDEpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9tYXBfZW5kKS50d2ljZQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfbGlzdF9iZWdpbikud2l0aChUaHJpZnQ6OlR5cGVzOjpJMzIsIDQpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9saXN0X2VuZCkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX3NldF9iZWdpbikud2l0aChUaHJpZnQ6OlR5cGVzOjpJMTYsIDMpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9zZXRfZW5kKQorICAgICAgcHJvdCA9IFRocmlmdDo6QmFzZVByb3RvY29sLm5ldyhkb3VibGUoInRyYW5zcG9ydCIpKSAjbW9jaygiUHJvdG9jb2wiKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3N0cnVjdF9iZWdpbikud2l0aCgiU3BlY05hbWVzcGFjZTo6Rm9vIikKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfYmVnaW4pLndpdGgoIlNwZWNOYW1lc3BhY2U6OkhlbGxvIikKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfZW5kKS50d2ljZQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCdpbnRzJywgVGhyaWZ0OjpUeXBlczo6TElTVCwgNCkKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9pMzIpLndpdGgoMSkKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9pMzIpLndpdGgoMikudHdpY2UKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9pMzIpLndpdGgoMykKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgnY29tcGxleCcsIFRocmlmdDo6VHlwZXM6Ok1BUCwgNSkKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9pMzIpLndpdGgoNSkKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9zdHJpbmcpLndpdGgoJ2ZvbycpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZG91YmxlKS53aXRoKDEuMjMpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoJ3Nob3J0cycsIFRocmlmdDo6VHlwZXM6OlNFVCwgNikKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9pMTYpLndpdGgoNSkKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9pMTYpLndpdGgoMTcpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfaTE2KS53aXRoKDIzOSkKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9zdG9wKS50d2ljZQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2VuZCkuZXhhY3RseSg2KS50aW1lcworICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCdzaW1wbGUnLCBUaHJpZnQ6OlR5cGVzOjpJMzIsIDEpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfaTMyKS53aXRoKDUzKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCdoZWxsbycsIFRocmlmdDo6VHlwZXM6OlNUUlVDVCwgMykKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgnZ3JlZXRpbmcnLCBUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDEpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfc3RyaW5nKS53aXRoKCdoZWxsbywgd29ybGQhJykKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9tYXBfYmVnaW4pLndpdGgoVGhyaWZ0OjpUeXBlczo6STMyLCBUaHJpZnQ6OlR5cGVzOjpNQVAsIDEpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfbWFwX2JlZ2luKS53aXRoKFRocmlmdDo6VHlwZXM6OlNUUklORywgVGhyaWZ0OjpUeXBlczo6RE9VQkxFLCAxKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX21hcF9lbmQpLnR3aWNlCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfbGlzdF9iZWdpbikud2l0aChUaHJpZnQ6OlR5cGVzOjpJMzIsIDQpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfbGlzdF9lbmQpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfc2V0X2JlZ2luKS53aXRoKFRocmlmdDo6VHlwZXM6OkkxNiwgMykKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9zZXRfZW5kKQogCiAgICAgICBzdHJ1Y3QgPSBTcGVjTmFtZXNwYWNlOjpGb28ubmV3CiAgICAgICBzdHJ1Y3Qud29yZHMgPSBuaWwKQEAgLTIyMSw1MCArMjIxLDUwIEBACiAgICAgaXQgInNob3VsZCByYWlzZSBhbiBleGNlcHRpb24gaWYgcHJlc2VudGVkIHdpdGggYW4gdW5rbm93biBjb250YWluZXIiIGRvCiAgICAgICAjIHllYWggdGhpcyBpcyBzaWxseSwgYnV0IEknbSBnb2luZyBmb3IgY29kZSBjb3ZlcmFnZSBoZXJlCiAgICAgICBzdHJ1Y3QgPSBTcGVjTmFtZXNwYWNlOjpGb28ubmV3Ci0gICAgICBsYW1iZGEgeyBzdHJ1Y3Quc2VuZCA6d3JpdGVfY29udGFpbmVyLCBuaWwsIG5pbCwgezp0eXBlID0+ICJmb28ifSB9LnNob3VsZCByYWlzZV9lcnJvcihTdGFuZGFyZEVycm9yLCAiTm90IGEgY29udGFpbmVyIHR5cGU6IGZvbyIpCisgICAgICBleHBlY3QgeyBzdHJ1Y3Quc2VuZCA6d3JpdGVfY29udGFpbmVyLCBuaWwsIG5pbCwgezp0eXBlID0+ICJmb28ifSB9LnRvIHJhaXNlX2Vycm9yKFN0YW5kYXJkRXJyb3IsICJOb3QgYSBjb250YWluZXIgdHlwZTogZm9vIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgc3VwcG9ydCBvcHRpb25hbCB0eXBlLWNoZWNraW5nIGluIFRocmlmdDo6U3RydWN0Lm5ldyIgZG8KICAgICAgIFRocmlmdC50eXBlX2NoZWNraW5nID0gdHJ1ZQogICAgICAgYmVnaW4KLSAgICAgICAgbGFtYmRhIHsgU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3KDpncmVldGluZyA9PiAzKSB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvciwgIkV4cGVjdGVkIFR5cGVzOjpTVFJJTkcsIHJlY2VpdmVkIEZpeG51bSBmb3IgZmllbGQgZ3JlZXRpbmciKQorICAgICAgICBleHBlY3QgeyBTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcoOmdyZWV0aW5nID0+IDMpIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IsIC9FeHBlY3RlZCBUeXBlczo6U1RSSU5HLCByZWNlaXZlZCAoSW50ZWdlcnxGaXhudW0pIGZvciBmaWVsZCBncmVldGluZy8pCiAgICAgICBlbnN1cmUKICAgICAgICAgVGhyaWZ0LnR5cGVfY2hlY2tpbmcgPSBmYWxzZQogICAgICAgZW5kCi0gICAgICBsYW1iZGEgeyBTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcoOmdyZWV0aW5nID0+IDMpIH0uc2hvdWxkX25vdCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKKyAgICAgIGV4cGVjdCB7IFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldyg6Z3JlZXRpbmcgPT4gMykgfS5ub3RfdG8gcmFpc2VfZXJyb3IKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgc3VwcG9ydCBvcHRpb25hbCB0eXBlLWNoZWNraW5nIGluIGZpZWxkIGFjY2Vzc29ycyIgZG8KICAgICAgIFRocmlmdC50eXBlX2NoZWNraW5nID0gdHJ1ZQogICAgICAgYmVnaW4KICAgICAgICAgaGVsbG8gPSBTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcKLSAgICAgICAgbGFtYmRhIHsgaGVsbG8uZ3JlZXRpbmcgPSAzIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yLCAiRXhwZWN0ZWQgVHlwZXM6OlNUUklORywgcmVjZWl2ZWQgRml4bnVtIGZvciBmaWVsZCBncmVldGluZyIpCisgICAgICAgIGV4cGVjdCB7IGhlbGxvLmdyZWV0aW5nID0gMyB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yLCAvRXhwZWN0ZWQgVHlwZXM6OlNUUklORywgcmVjZWl2ZWQgKEludGVnZXJ8Rml4bnVtKSBmb3IgZmllbGQgZ3JlZXRpbmcvKQogICAgICAgZW5zdXJlCiAgICAgICAgIFRocmlmdC50eXBlX2NoZWNraW5nID0gZmFsc2UKICAgICAgIGVuZAotICAgICAgbGFtYmRhIHsgaGVsbG8uZ3JlZXRpbmcgPSAzIH0uc2hvdWxkX25vdCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKKyAgICAgIGV4cGVjdCB7IGhlbGxvLmdyZWV0aW5nID0gMyB9Lm5vdF90byByYWlzZV9lcnJvcgogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByYWlzZSBhbiBleGNlcHRpb24gd2hlbiB1bmtub3duIHR5cGVzIGFyZSBnaXZlbiB0byBUaHJpZnQ6OlN0cnVjdC5uZXciIGRvCi0gICAgICBsYW1iZGEgeyBTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcoOmZpc2ggPT4gJ3NhbG1vbicpIH0uc2hvdWxkIHJhaXNlX2Vycm9yKEV4Y2VwdGlvbiwgIlVua25vd24ga2V5IGdpdmVuIHRvIFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldzogZmlzaCIpCisgICAgICBleHBlY3QgeyBTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcoOmZpc2ggPT4gJ3NhbG1vbicpIH0udG8gcmFpc2VfZXJyb3IoRXhjZXB0aW9uLCAiVW5rbm93biBrZXkgZ2l2ZW4gdG8gU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3OiBmaXNoIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgc3VwcG9ydCBgcmFpc2UgWGNlcHRpb24sICdtZXNzYWdlJ2AgZm9yIEV4Y2VwdGlvbiBzdHJ1Y3RzIiBkbwogICAgICAgYmVnaW4KICAgICAgICAgcmFpc2UgU3BlY05hbWVzcGFjZTo6WGNlcHRpb24sICJzb21ldGhpbmcgaGFwcGVuZWQiCiAgICAgICByZXNjdWUgVGhyaWZ0OjpFeGNlcHRpb24gPT4gZQotICAgICAgICBlLm1lc3NhZ2Uuc2hvdWxkID09ICJzb21ldGhpbmcgaGFwcGVuZWQiCi0gICAgICAgIGUuY29kZS5zaG91bGQgPT0gMQorICAgICAgICBleHBlY3QoZS5tZXNzYWdlKS50byBlcSgic29tZXRoaW5nIGhhcHBlbmVkIikKKyAgICAgICAgZXhwZWN0KGUuY29kZSkudG8gZXEoMSkKICAgICAgICAgIyBlbnN1cmUgaXQgZ2V0cyBzZXJpYWxpemVkIHByb3Blcmx5LCB0aGlzIGlzIHRoZSByZWFsbHkgaW1wb3J0YW50IHBhcnQKLSAgICAgICAgcHJvdCA9IFRocmlmdDo6QmFzZVByb3RvY29sLm5ldyhtb2NrKCJ0cmFucyIpKQotICAgICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfYmVnaW4pLndpdGgoIlNwZWNOYW1lc3BhY2U6OlhjZXB0aW9uIikKLSAgICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2VuZCkKLSAgICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoJ21lc3NhZ2UnLCBUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDEpIywgInNvbWV0aGluZyBoYXBwZW5lZCIpCi0gICAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX3N0cmluZykud2l0aCgic29tZXRoaW5nIGhhcHBlbmVkIikKLSAgICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoJ2NvZGUnLCBUaHJpZnQ6OlR5cGVzOjpJMzIsIDIpIywgMSkKLSAgICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfaTMyKS53aXRoKDEpCi0gICAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX3N0b3ApCi0gICAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX2VuZCkudHdpY2UKKyAgICAgICAgcHJvdCA9IFRocmlmdDo6QmFzZVByb3RvY29sLm5ldyhkb3VibGUoInRyYW5zIikpCisgICAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfYmVnaW4pLndpdGgoIlNwZWNOYW1lc3BhY2U6OlhjZXB0aW9uIikKKyAgICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3N0cnVjdF9lbmQpCisgICAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgnbWVzc2FnZScsIFRocmlmdDo6VHlwZXM6OlNUUklORywgMSkjLCAic29tZXRoaW5nIGhhcHBlbmVkIikKKyAgICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3N0cmluZykud2l0aCgic29tZXRoaW5nIGhhcHBlbmVkIikKKyAgICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCdjb2RlJywgVGhyaWZ0OjpUeXBlczo6STMyLCAyKSMsIDEpCisgICAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9pMzIpLndpdGgoMSkKKyAgICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX3N0b3ApCisgICAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9lbmQpLnR3aWNlCiAKICAgICAgICAgZS53cml0ZShwcm90KQogICAgICAgZW5kCkBAIC0yNzQsMTcgKzI3NCwxNyBAQAogICAgICAgYmVnaW4KICAgICAgICAgcmFpc2UgU3BlY05hbWVzcGFjZTo6WGNlcHRpb24sIDptZXNzYWdlID0+ICJzb21ldGhpbmcgaGFwcGVuZWQiLCA6Y29kZSA9PiA1CiAgICAgICByZXNjdWUgVGhyaWZ0OjpFeGNlcHRpb24gPT4gZQotICAgICAgICBlLm1lc3NhZ2Uuc2hvdWxkID09ICJzb21ldGhpbmcgaGFwcGVuZWQiCi0gICAgICAgIGUuY29kZS5zaG91bGQgPT0gNQotICAgICAgICBwcm90ID0gVGhyaWZ0OjpCYXNlUHJvdG9jb2wubmV3KG1vY2soInRyYW5zIikpCi0gICAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX3N0cnVjdF9iZWdpbikud2l0aCgiU3BlY05hbWVzcGFjZTo6WGNlcHRpb24iKQotICAgICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfZW5kKQotICAgICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgnbWVzc2FnZScsIFRocmlmdDo6VHlwZXM6OlNUUklORywgMSkKLSAgICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfc3RyaW5nKS53aXRoKCJzb21ldGhpbmcgaGFwcGVuZWQiKQotICAgICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgnY29kZScsIFRocmlmdDo6VHlwZXM6OkkzMiwgMikKLSAgICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfaTMyKS53aXRoKDUpCi0gICAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX3N0b3ApCi0gICAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX2VuZCkudHdpY2UKKyAgICAgICAgZXhwZWN0KGUubWVzc2FnZSkudG8gZXEoInNvbWV0aGluZyBoYXBwZW5lZCIpCisgICAgICAgIGV4cGVjdChlLmNvZGUpLnRvIGVxKDUpCisgICAgICAgIHByb3QgPSBUaHJpZnQ6OkJhc2VQcm90b2NvbC5uZXcoZG91YmxlKCJ0cmFucyIpKQorICAgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2JlZ2luKS53aXRoKCJTcGVjTmFtZXNwYWNlOjpYY2VwdGlvbiIpCisgICAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfZW5kKQorICAgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoJ21lc3NhZ2UnLCBUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDEpCisgICAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9zdHJpbmcpLndpdGgoInNvbWV0aGluZyBoYXBwZW5lZCIpCisgICAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgnY29kZScsIFRocmlmdDo6VHlwZXM6OkkzMiwgMikKKyAgICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2kzMikud2l0aCg1KQorICAgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfc3RvcCkKKyAgICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2VuZCkudHdpY2UKIAogICAgICAgICBlLndyaXRlKHByb3QpCiAgICAgICBlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL3RoaW5faHR0cF9zZXJ2ZXJfc3BlYy5yYiBiL2xpYi9yYi9zcGVjL3RoaW5faHR0cF9zZXJ2ZXJfc3BlYy5yYgppbmRleCA1NTIwODM5Li42NjUzOTFiIDEwMDY0NAotLS0gYS9saWIvcmIvc3BlYy90aGluX2h0dHBfc2VydmVyX3NwZWMucmIKKysrIGIvbGliL3JiL3NwZWMvdGhpbl9odHRwX3NlcnZlcl9zcGVjLnJiCkBAIC0yMywyNCArMjMsMjQgQEAKIAogZGVzY3JpYmUgVGhyaWZ0OjpUaGluSFRUUFNlcnZlciBkbwogCi0gIGxldCg6cHJvY2Vzc29yKSB7IG1vY2soJ3Byb2Nlc3NvcicpIH0KKyAgbGV0KDpwcm9jZXNzb3IpIHsgZG91YmxlKCdwcm9jZXNzb3InKSB9CiAKICAgZGVzY3JpYmUgIiNpbml0aWFsaXplIiBkbwogCiAgICAgY29udGV4dCAid2hlbiB1c2luZyB0aGUgZGVmYXVsdHMiIGRvCiAKICAgICAgIGl0ICJiaW5kcyB0byBwb3J0IDgwLCB3aXRoIGhvc3QgMC4wLjAuMCwgYSBwYXRoIG9mICcvJyIgZG8KLSAgICAgICAgVGhpbjo6U2VydmVyLnNob3VsZF9yZWNlaXZlKDpuZXcpLndpdGgoJzAuMC4wLjAnLCA4MCwgYW5faW5zdGFuY2Vfb2YoUmFjazo6QnVpbGRlcikpCisgICAgICAgIGV4cGVjdChUaGluOjpTZXJ2ZXIpLnRvIHJlY2VpdmUoOm5ldykud2l0aCgnMC4wLjAuMCcsIDgwLCBhbl9pbnN0YW5jZV9vZihSYWNrOjpCdWlsZGVyKSkKICAgICAgICAgVGhyaWZ0OjpUaGluSFRUUFNlcnZlci5uZXcocHJvY2Vzc29yKQogICAgICAgZW5kCiAKICAgICAgIGl0ICdjcmVhdGVzIGEgVGhpbkhUVFBTZXJ2ZXI6OlJhY2tBcHBsaWNhdGlvbkNvbnRleHQnIGRvCi0gICAgICAgIFRocmlmdDo6VGhpbkhUVFBTZXJ2ZXI6OlJhY2tBcHBsaWNhdGlvbi5zaG91bGRfcmVjZWl2ZSg6Zm9yKS53aXRoKCIvIiwgcHJvY2Vzc29yLCBhbl9pbnN0YW5jZV9vZihUaHJpZnQ6OkJpbmFyeVByb3RvY29sRmFjdG9yeSkpLmFuZF9yZXR1cm4oYW55dGhpbmcpCisgICAgICAgIGV4cGVjdChUaHJpZnQ6OlRoaW5IVFRQU2VydmVyOjpSYWNrQXBwbGljYXRpb24pLnRvIHJlY2VpdmUoOmZvcikud2l0aCgiLyIsIHByb2Nlc3NvciwgYW5faW5zdGFuY2Vfb2YoVGhyaWZ0OjpCaW5hcnlQcm90b2NvbEZhY3RvcnkpKS5hbmRfcmV0dXJuKGFueXRoaW5nKQogICAgICAgICBUaHJpZnQ6OlRoaW5IVFRQU2VydmVyLm5ldyhwcm9jZXNzb3IpCiAgICAgICBlbmQKIAogICAgICAgaXQgInVzZXMgdGhlIEJpbmFyeVByb3RvY29sRmFjdG9yeSIgZG8KLSAgICAgICAgVGhyaWZ0OjpCaW5hcnlQcm90b2NvbEZhY3Rvcnkuc2hvdWxkX3JlY2VpdmUoOm5ldykKKyAgICAgICAgZXhwZWN0KFRocmlmdDo6QmluYXJ5UHJvdG9jb2xGYWN0b3J5KS50byByZWNlaXZlKDpuZXcpCiAgICAgICAgIFRocmlmdDo6VGhpbkhUVFBTZXJ2ZXIubmV3KHByb2Nlc3NvcikKICAgICAgIGVuZAogCkBAIC01Miw3ICs1Miw3IEBACiAgICAgICAgIGlwID0gIjE5Mi4xNjguMC4xIgogICAgICAgICBwb3J0ID0gMzAwMAogICAgICAgICBwYXRoID0gIi90aGluIgotICAgICAgICBUaGluOjpTZXJ2ZXIuc2hvdWxkX3JlY2VpdmUoOm5ldykud2l0aChpcCwgcG9ydCwgYW5faW5zdGFuY2Vfb2YoUmFjazo6QnVpbGRlcikpCisgICAgICAgIGV4cGVjdChUaGluOjpTZXJ2ZXIpLnRvIHJlY2VpdmUoOm5ldykud2l0aChpcCwgcG9ydCwgYW5faW5zdGFuY2Vfb2YoUmFjazo6QnVpbGRlcikpCiAgICAgICAgIFRocmlmdDo6VGhpbkhUVFBTZXJ2ZXIubmV3KHByb2Nlc3NvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDppcCA9PiBpcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpwb3J0ID0+IHBvcnQsCkBAIC02MCw3ICs2MCw3IEBACiAgICAgICBlbmQKIAogICAgICAgaXQgJ2NyZWF0ZXMgYSBUaGluSFRUUFNlcnZlcjo6UmFja0FwcGxpY2F0aW9uQ29udGV4dCB3aXRoIGEgZGlmZmVyZW50IHByb3RvY29sIGZhY3RvcnknIGRvCi0gICAgICAgIFRocmlmdDo6VGhpbkhUVFBTZXJ2ZXI6OlJhY2tBcHBsaWNhdGlvbi5zaG91bGRfcmVjZWl2ZSg6Zm9yKS53aXRoKCIvIiwgcHJvY2Vzc29yLCBhbl9pbnN0YW5jZV9vZihUaHJpZnQ6Okpzb25Qcm90b2NvbEZhY3RvcnkpKS5hbmRfcmV0dXJuKGFueXRoaW5nKQorICAgICAgICBleHBlY3QoVGhyaWZ0OjpUaGluSFRUUFNlcnZlcjo6UmFja0FwcGxpY2F0aW9uKS50byByZWNlaXZlKDpmb3IpLndpdGgoIi8iLCBwcm9jZXNzb3IsIGFuX2luc3RhbmNlX29mKFRocmlmdDo6SnNvblByb3RvY29sRmFjdG9yeSkpLmFuZF9yZXR1cm4oYW55dGhpbmcpCiAgICAgICAgIFRocmlmdDo6VGhpbkhUVFBTZXJ2ZXIubmV3KHByb2Nlc3NvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpwcm90b2NvbF9mYWN0b3J5ID0+IFRocmlmdDo6SnNvblByb3RvY29sRmFjdG9yeS5uZXcpCiAgICAgICBlbmQKQEAgLTcyLDEyICs3MiwxMiBAQAogICBkZXNjcmliZSAiI3NlcnZlIiBkbwogCiAgICAgaXQgJ3N0YXJ0cyB0aGUgVGhpbiBzZXJ2ZXInIGRvCi0gICAgICB1bmRlcmx5aW5nX3RoaW5fc2VydmVyID0gbW9jaygndGhpbiBzZXJ2ZXInLCA6c3RhcnQgPT4gdHJ1ZSkKLSAgICAgIFRoaW46OlNlcnZlci5zdHViKDpuZXcpLmFuZF9yZXR1cm4odW5kZXJseWluZ190aGluX3NlcnZlcikKKyAgICAgIHVuZGVybHlpbmdfdGhpbl9zZXJ2ZXIgPSBkb3VibGUoJ3RoaW4gc2VydmVyJywgOnN0YXJ0ID0+IHRydWUpCisgICAgICBhbGxvdyhUaGluOjpTZXJ2ZXIpLnRvIHJlY2VpdmUoOm5ldykuYW5kX3JldHVybih1bmRlcmx5aW5nX3RoaW5fc2VydmVyKQogCiAgICAgICB0aGluX3RocmlmdF9zZXJ2ZXIgPSBUaHJpZnQ6OlRoaW5IVFRQU2VydmVyLm5ldyhwcm9jZXNzb3IpCiAKLSAgICAgIHVuZGVybHlpbmdfdGhpbl9zZXJ2ZXIuc2hvdWxkX3JlY2VpdmUoOnN0YXJ0KQorICAgICAgZXhwZWN0KHVuZGVybHlpbmdfdGhpbl9zZXJ2ZXIpLnRvIHJlY2VpdmUoOnN0YXJ0KQogICAgICAgdGhpbl90aHJpZnRfc2VydmVyLnNlcnZlCiAgICAgZW5kCiAgIGVuZApAQCAtODcsOCArODcsOCBAQAogZGVzY3JpYmUgVGhyaWZ0OjpUaGluSFRUUFNlcnZlcjo6UmFja0FwcGxpY2F0aW9uIGRvCiAgIGluY2x1ZGUgUmFjazo6VGVzdDo6TWV0aG9kcwogCi0gIGxldCg6cHJvY2Vzc29yKSB7IG1vY2soJ3Byb2Nlc3NvcicpIH0KLSAgbGV0KDpwcm90b2NvbF9mYWN0b3J5KSB7IG1vY2soJ3Byb3RvY29sIGZhY3RvcnknKSB9CisgIGxldCg6cHJvY2Vzc29yKSB7IGRvdWJsZSgncHJvY2Vzc29yJykgfQorICBsZXQoOnByb3RvY29sX2ZhY3RvcnkpIHsgZG91YmxlKCdwcm90b2NvbCBmYWN0b3J5JykgfQogCiAgIGRlZiBhcHAKICAgICBUaHJpZnQ6OlRoaW5IVFRQU2VydmVyOjpSYWNrQXBwbGljYXRpb24uZm9yKCIvIiwgcHJvY2Vzc29yLCBwcm90b2NvbF9mYWN0b3J5KQpAQCAtOTksMTMgKzk5LDEzIEBACiAgICAgaXQgJ3JlY2VpdmVzIGEgbm9uLVBPU1QnIGRvCiAgICAgICBoZWFkZXIoJ0NvbnRlbnQtVHlwZScsICJhcHBsaWNhdGlvbi94LXRocmlmdCIpCiAgICAgICBnZXQgIi8iCi0gICAgICBsYXN0X3Jlc3BvbnNlLnN0YXR1cy5zaG91bGQgYmUgNDA0CisgICAgICBleHBlY3QobGFzdF9yZXNwb25zZS5zdGF0dXMpLnRvIGJlIDQwNAogICAgIGVuZAogCiAgICAgaXQgJ3JlY2VpdmVzIGEgaGVhZGVyIG90aGVyIHRoYW4gYXBwbGljYXRpb24veC10aHJpZnQnIGRvCiAgICAgICBoZWFkZXIoJ0NvbnRlbnQtVHlwZScsICJhcHBsaWNhdGlvbi9qc29uIikKICAgICAgIHBvc3QgIi8iCi0gICAgICBsYXN0X3Jlc3BvbnNlLnN0YXR1cy5zaG91bGQgYmUgNDA0CisgICAgICBleHBlY3QobGFzdF9yZXNwb25zZS5zdGF0dXMpLnRvIGJlIDQwNAogICAgIGVuZAogCiAgIGVuZApAQCAtMTEzLDI2ICsxMTMsMjYgQEAKICAgY29udGV4dCAiMjAwIHJlc3BvbnNlIiBkbwogCiAgICAgYmVmb3JlIGRvCi0gICAgICBwcm90b2NvbF9mYWN0b3J5LnN0dWIoOmdldF9wcm90b2NvbCkKLSAgICAgIHByb2Nlc3Nvci5zdHViKDpwcm9jZXNzKQorICAgICAgYWxsb3cocHJvdG9jb2xfZmFjdG9yeSkudG8gcmVjZWl2ZSg6Z2V0X3Byb3RvY29sKQorICAgICAgYWxsb3cocHJvY2Vzc29yKS50byByZWNlaXZlKDpwcm9jZXNzKQogICAgIGVuZAogCiAgICAgaXQgJ2NyZWF0ZXMgYW4gSU9TdHJlYW1UcmFuc3BvcnQnIGRvCiAgICAgICBoZWFkZXIoJ0NvbnRlbnQtVHlwZScsICJhcHBsaWNhdGlvbi94LXRocmlmdCIpCi0gICAgICBUaHJpZnQ6OklPU3RyZWFtVHJhbnNwb3J0LnNob3VsZF9yZWNlaXZlKDpuZXcpLndpdGgoYW5faW5zdGFuY2Vfb2YoUmFjazo6TGludDo6SW5wdXRXcmFwcGVyKSwgYW5faW5zdGFuY2Vfb2YoUmFjazo6UmVzcG9uc2UpKQorICAgICAgZXhwZWN0KFRocmlmdDo6SU9TdHJlYW1UcmFuc3BvcnQpLnRvIHJlY2VpdmUoOm5ldykud2l0aChhbl9pbnN0YW5jZV9vZihSYWNrOjpMaW50OjpJbnB1dFdyYXBwZXIpLCBhbl9pbnN0YW5jZV9vZihSYWNrOjpSZXNwb25zZSkpCiAgICAgICBwb3N0ICIvIgogICAgIGVuZAogCiAgICAgaXQgJ2ZldGNoZXMgdGhlIHJpZ2h0IHByb3RvY29sIGJhc2VkIG9uIHRoZSBUcmFuc3BvcnQnIGRvCiAgICAgICBoZWFkZXIoJ0NvbnRlbnQtVHlwZScsICJhcHBsaWNhdGlvbi94LXRocmlmdCIpCi0gICAgICBwcm90b2NvbF9mYWN0b3J5LnNob3VsZF9yZWNlaXZlKDpnZXRfcHJvdG9jb2wpLndpdGgoYW5faW5zdGFuY2Vfb2YoVGhyaWZ0OjpJT1N0cmVhbVRyYW5zcG9ydCkpCisgICAgICBleHBlY3QocHJvdG9jb2xfZmFjdG9yeSkudG8gcmVjZWl2ZSg6Z2V0X3Byb3RvY29sKS53aXRoKGFuX2luc3RhbmNlX29mKFRocmlmdDo6SU9TdHJlYW1UcmFuc3BvcnQpKQogICAgICAgcG9zdCAiLyIKICAgICBlbmQKIAogICAgIGl0ICdzdGF0dXMgY29kZSAyMDAnIGRvCiAgICAgICBoZWFkZXIoJ0NvbnRlbnQtVHlwZScsICJhcHBsaWNhdGlvbi94LXRocmlmdCIpCiAgICAgICBwb3N0ICIvIgotICAgICAgbGFzdF9yZXNwb25zZS5vaz8uc2hvdWxkIGJlX3RydWUKKyAgICAgIGV4cGVjdChsYXN0X3Jlc3BvbnNlLm9rPykudG8gYmVfdHJ1dGh5CiAgICAgZW5kCiAKICAgZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy90eXBlc19zcGVjLnJiIGIvbGliL3JiL3NwZWMvdHlwZXNfc3BlYy5yYgppbmRleCBiMmMzYTIwLi5kNTk1YWI1IDEwMDY0NAotLS0gYS9saWIvcmIvc3BlYy90eXBlc19zcGVjLnJiCisrKyBiL2xpYi9yYi9zcGVjL3R5cGVzX3NwZWMucmIKQEAgLTMxLDg1ICszMSw4OCBAQAogCiAgIGNvbnRleHQgJ3R5cGUgY2hlY2tpbmcnIGRvCiAgICAgaXQgInNob3VsZCByZXR1cm4gdGhlIHByb3BlciBuYW1lIGZvciBlYWNoIHR5cGUiIGRvCi0gICAgICBUaHJpZnQudHlwZV9uYW1lKFRocmlmdDo6VHlwZXM6OkkxNikuc2hvdWxkID09ICJUeXBlczo6STE2IgotICAgICAgVGhyaWZ0LnR5cGVfbmFtZShUaHJpZnQ6OlR5cGVzOjpWT0lEKS5zaG91bGQgPT0gIlR5cGVzOjpWT0lEIgotICAgICAgVGhyaWZ0LnR5cGVfbmFtZShUaHJpZnQ6OlR5cGVzOjpMSVNUKS5zaG91bGQgPT0gIlR5cGVzOjpMSVNUIgotICAgICAgVGhyaWZ0LnR5cGVfbmFtZSg0Mikuc2hvdWxkIGJlX25pbAorICAgICAgZXhwZWN0KFRocmlmdC50eXBlX25hbWUoVGhyaWZ0OjpUeXBlczo6STE2KSkudG8gZXEoIlR5cGVzOjpJMTYiKQorICAgICAgZXhwZWN0KFRocmlmdC50eXBlX25hbWUoVGhyaWZ0OjpUeXBlczo6Vk9JRCkpLnRvIGVxKCJUeXBlczo6Vk9JRCIpCisgICAgICBleHBlY3QoVGhyaWZ0LnR5cGVfbmFtZShUaHJpZnQ6OlR5cGVzOjpMSVNUKSkudG8gZXEoIlR5cGVzOjpMSVNUIikKKyAgICAgIGV4cGVjdChUaHJpZnQudHlwZV9uYW1lKDQyKSkudG8gYmVfbmlsCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGNoZWNrIHR5cGVzIHByb3Blcmx5IiBkbwogICAgICAgIyBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZShuaWwsIFRocmlmdDo6VHlwZXM6OlNUT1ApIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoMywgICAgICAgICAgICAgIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpTVE9QfSwgICA6Zm9vKSB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKG5pbCwgICAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6Vk9JRH0sICAgOmZvbykgfS5zaG91bGRfbm90IHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoMywgICAgICAgICAgICAgIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpWT0lEfSwgICA6Zm9vKSB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKHRydWUsICAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6Qk9PTH0sICAgOmZvbykgfS5zaG91bGRfbm90IHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoMywgICAgICAgICAgICAgIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpCT09MfSwgICA6Zm9vKSB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKDQyLCAgICAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6QllURX0sICAgOmZvbykgfS5zaG91bGRfbm90IHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoNDIsICAgICAgICAgICAgIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpJMTZ9LCAgICA6Zm9vKSB9LnNob3VsZF9ub3QgcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZSg0MiwgICAgICAgICAgICAgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkkzMn0sICAgIDpmb28pIH0uc2hvdWxkX25vdCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKDQyLCAgICAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6STY0fSwgICAgOmZvbykgfS5zaG91bGRfbm90IHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoMy4xNCwgICAgICAgICAgIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpJMzJ9LCAgICA6Zm9vKSB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKDMuMTQsICAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6RE9VQkxFfSwgOmZvbykgfS5zaG91bGRfbm90IHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoMywgICAgICAgICAgICAgIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpET1VCTEV9LCA6Zm9vKSB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKCIzIiwgICAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6U1RSSU5HfSwgOmZvbykgfS5zaG91bGRfbm90IHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoMywgICAgICAgICAgICAgIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpTVFJJTkd9LCA6Zm9vKSB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKDMsICAgICAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6U1RPUH0sICAgOmZvbykgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKG5pbCwgICAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6Vk9JRH0sICAgOmZvbykgfS5ub3RfdG8gcmFpc2VfZXJyb3IKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKDMsICAgICAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6Vk9JRH0sICAgOmZvbykgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKHRydWUsICAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6Qk9PTH0sICAgOmZvbykgfS5ub3RfdG8gcmFpc2VfZXJyb3IKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKDMsICAgICAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6Qk9PTH0sICAgOmZvbykgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKDQyLCAgICAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6QllURX0sICAgOmZvbykgfS5ub3RfdG8gcmFpc2VfZXJyb3IKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKDQyLCAgICAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6STE2fSwgICAgOmZvbykgfS5ub3RfdG8gcmFpc2VfZXJyb3IKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKDQyLCAgICAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6STMyfSwgICAgOmZvbykgfS5ub3RfdG8gcmFpc2VfZXJyb3IKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKDQyLCAgICAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6STY0fSwgICAgOmZvbykgfS5ub3RfdG8gcmFpc2VfZXJyb3IKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKDMuMTQsICAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6STMyfSwgICAgOmZvbykgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKDMuMTQsICAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6RE9VQkxFfSwgOmZvbykgfS5ub3RfdG8gcmFpc2VfZXJyb3IKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKDMsICAgICAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6RE9VQkxFfSwgOmZvbykgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKCIzIiwgICAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6U1RSSU5HfSwgOmZvbykgfS5ub3RfdG8gcmFpc2VfZXJyb3IKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKDMsICAgICAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6U1RSSU5HfSwgOmZvbykgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKICAgICAgIGhlbGxvID0gU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3Ci0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZShoZWxsbywgICAgICAgICAgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OlNUUlVDVCwgOmNsYXNzID0+IFNwZWNOYW1lc3BhY2U6OkhlbGxvfSwgOmZvbykgfS5zaG91bGRfbm90IHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoImZvbyIsICAgICAgICAgIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpTVFJVQ1R9LCA6Zm9vKSB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKHs6Zm9vID0+IDF9LCAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6TUFQfSwgICAgOmZvbykgfS5zaG91bGRfbm90IHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoWzFdLCAgICAgICAgICAgIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpNQVB9LCAgICA6Zm9vKSB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKFsxXSwgICAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6TElTVH0sICAgOmZvbykgfS5zaG91bGRfbm90IHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoezpmb28gPT4gMX0sICAgIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpMSVNUfSwgICA6Zm9vKSB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKFNldC5uZXcoWzEsMl0pLCB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6U0VUfSwgICAgOmZvbykgfS5zaG91bGRfbm90IHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoWzEsMl0sICAgICAgICAgIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpTRVR9LCAgICA6Zm9vKSB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKHs6Zm9vID0+IHRydWV9LCB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6U0VUfSwgICAgOmZvbykgfS5zaG91bGQgcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZShoZWxsbywgICAgICAgICAgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OlNUUlVDVCwgOmNsYXNzID0+IFNwZWNOYW1lc3BhY2U6OkhlbGxvfSwgOmZvbykgfS5ub3RfdG8gcmFpc2VfZXJyb3IKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKCJmb28iLCAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6U1RSVUNUfSwgOmZvbykgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKKyAgICAgIGZpZWxkID0gezp0eXBlID0+IFRocmlmdDo6VHlwZXM6Ok1BUCwgOmtleSA9PiB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6STMyfSwgOnZhbHVlID0+IHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpTVFJJTkd9fQorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoezEgPT4gIm9uZSJ9LCAgIGZpZWxkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICA6Zm9vKSB9Lm5vdF90byByYWlzZV9lcnJvcgorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoWzFdLCAgICAgICAgICAgIGZpZWxkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICA6Zm9vKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQorICAgICAgZmllbGQgPSB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6TElTVCwgOmVsZW1lbnQgPT4gezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkkzMn19CisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZShbMV0sICAgICAgICAgICAgZmllbGQsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpmb28pIH0ubm90X3RvIHJhaXNlX2Vycm9yCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZSh7OmZvbyA9PiAxfSwgICAgZmllbGQsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpmb28pIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCisgICAgICBmaWVsZCA9IHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpTRVQsIDplbGVtZW50ID0+IHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpJMzJ9fQorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoU2V0Lm5ldyhbMSwyXSksIGZpZWxkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICA6Zm9vKSB9Lm5vdF90byByYWlzZV9lcnJvcgorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoWzEsMl0sICAgICAgICAgIGZpZWxkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICA6Zm9vKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoezpmb28gPT4gdHJ1ZX0sIGZpZWxkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICA6Zm9vKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBlcnJvciBvdXQgaWYgbmlsIGlzIHBhc3NlZCBhbmQgc2tpcF90eXBlcyBpcyBmYWxzZSIgZG8KLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKG5pbCwgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkJPT0x9LCAgIDpmb28sIGZhbHNlKSB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKG5pbCwgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkJZVEV9LCAgIDpmb28sIGZhbHNlKSB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKG5pbCwgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkkxNn0sICAgIDpmb28sIGZhbHNlKSB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKG5pbCwgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkkzMn0sICAgIDpmb28sIGZhbHNlKSB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKG5pbCwgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6Okk2NH0sICAgIDpmb28sIGZhbHNlKSB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKG5pbCwgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkRPVUJMRX0sIDpmb28sIGZhbHNlKSB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKG5pbCwgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OlNUUklOR30sIDpmb28sIGZhbHNlKSB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKG5pbCwgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OlNUUlVDVH0sIDpmb28sIGZhbHNlKSB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKG5pbCwgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkxJU1R9LCAgIDpmb28sIGZhbHNlKSB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKG5pbCwgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OlNFVH0sICAgIDpmb28sIGZhbHNlKSB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKG5pbCwgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6Ok1BUH0sICAgIDpmb28sIGZhbHNlKSB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKG5pbCwgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkJPT0x9LCAgIDpmb28sIGZhbHNlKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUobmlsLCB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6QllURX0sICAgOmZvbywgZmFsc2UpIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZShuaWwsIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpJMTZ9LCAgICA6Zm9vLCBmYWxzZSkgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKG5pbCwgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkkzMn0sICAgIDpmb28sIGZhbHNlKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUobmlsLCB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6STY0fSwgICAgOmZvbywgZmFsc2UpIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZShuaWwsIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpET1VCTEV9LCA6Zm9vLCBmYWxzZSkgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKG5pbCwgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OlNUUklOR30sIDpmb28sIGZhbHNlKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUobmlsLCB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6U1RSVUNUfSwgOmZvbywgZmFsc2UpIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZShuaWwsIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpMSVNUfSwgICA6Zm9vLCBmYWxzZSkgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKG5pbCwgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OlNFVH0sICAgIDpmb28sIGZhbHNlKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUobmlsLCB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6TUFQfSwgICAgOmZvbywgZmFsc2UpIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGNoZWNrIGVsZW1lbnQgdHlwZXMgb24gY29udGFpbmVycyIgZG8KICAgICAgIGZpZWxkID0gezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkxJU1QsIDplbGVtZW50ID0+IHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpJMzJ9fQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoWzEsIDJdLCBmaWVsZCwgOmZvbykgfS5zaG91bGRfbm90IHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoWzEsIG5pbCwgMl0sIGZpZWxkLCA6Zm9vKSB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKFsxLCAyXSwgZmllbGQsIDpmb28pIH0ubm90X3RvIHJhaXNlX2Vycm9yCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZShbMSwgbmlsLCAyXSwgZmllbGQsIDpmb28pIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCiAgICAgICBmaWVsZCA9IHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpNQVAsIDprZXkgPT4gezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkkzMn0sIDp2YWx1ZSA9PiB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6U1RSSU5HfX0KLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKHsxID0+ICJvbmUiLCAyID0+ICJ0d28ifSwgZmllbGQsIDpmb28pIH0uc2hvdWxkX25vdCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKHsxID0+ICJvbmUiLCBuaWwgPT4gIm5pbCJ9LCBmaWVsZCwgOmZvbykgfS5zaG91bGQgcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZSh7MSA9PiBuaWwsIDIgPT4gInR3byJ9LCBmaWVsZCwgOmZvbykgfS5zaG91bGQgcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZSh7MSA9PiAib25lIiwgMiA9PiAidHdvIn0sIGZpZWxkLCA6Zm9vKSB9Lm5vdF90byByYWlzZV9lcnJvcgorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoezEgPT4gIm9uZSIsIG5pbCA9PiAibmlsIn0sIGZpZWxkLCA6Zm9vKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoezEgPT4gbmlsLCAyID0+ICJ0d28ifSwgZmllbGQsIDpmb28pIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCiAgICAgICBmaWVsZCA9IHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpTRVQsIDplbGVtZW50ID0+IHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpJMzJ9fQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoU2V0Lm5ldyhbMSwgMl0pLCBmaWVsZCwgOmZvbykgfS5zaG91bGRfbm90IHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoU2V0Lm5ldyhbMSwgbmlsLCAyXSksIGZpZWxkLCA6Zm9vKSB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKFNldC5uZXcoWzEsIDIuMywgMl0pLCBmaWVsZCwgOmZvbykgfS5zaG91bGQgcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZShTZXQubmV3KFsxLCAyXSksIGZpZWxkLCA6Zm9vKSB9Lm5vdF90byByYWlzZV9lcnJvcgorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoU2V0Lm5ldyhbMSwgbmlsLCAyXSksIGZpZWxkLCA6Zm9vKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoU2V0Lm5ldyhbMSwgMi4zLCAyXSksIGZpZWxkLCA6Zm9vKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQogCiAgICAgICBmaWVsZCA9IHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpTVFJVQ1QsIDpjbGFzcyA9PiBTcGVjTmFtZXNwYWNlOjpIZWxsb30KLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKFNwZWNOYW1lc3BhY2U6OkJvb2xTdHJ1Y3QsIGZpZWxkLCA6Zm9vKSB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKFNwZWNOYW1lc3BhY2U6OkJvb2xTdHJ1Y3QsIGZpZWxkLCA6Zm9vKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBnaXZlIHRoZSBUaHJpZnQ6OlR5cGVFcnJvciBhIHJlYWRhYmxlIG1lc3NhZ2UiIGRvCi0gICAgICBtc2cgPSAiRXhwZWN0ZWQgVHlwZXM6OlNUUklORywgcmVjZWl2ZWQgRml4bnVtIGZvciBmaWVsZCBmb28iCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZSgzLCB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6U1RSSU5HfSwgOmZvbykgfS5zaG91bGQgcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IsIG1zZykKLSAgICAgIG1zZyA9ICJFeHBlY3RlZCBUeXBlczo6U1RSSU5HLCByZWNlaXZlZCBGaXhudW0gZm9yIGZpZWxkIGZvby5lbGVtZW50IgorICAgICAgbXNnID0gL0V4cGVjdGVkIFR5cGVzOjpTVFJJTkcsIHJlY2VpdmVkIChJbnRlZ2VyfEZpeG51bSkgZm9yIGZpZWxkIGZvby8KKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKDMsIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpTVFJJTkd9LCA6Zm9vKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yLCBtc2cpCisgICAgICBtc2cgPSAvRXhwZWN0ZWQgVHlwZXM6OlNUUklORywgcmVjZWl2ZWQgKEludGVnZXJ8Rml4bnVtKSBmb3IgZmllbGQgZm9vLmVsZW1lbnQvCiAgICAgICBmaWVsZCA9IHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpMSVNULCA6ZWxlbWVudCA9PiB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6U1RSSU5HfX0KLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKFszXSwgZmllbGQsIDpmb28pIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yLCBtc2cpCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZShbM10sIGZpZWxkLCA6Zm9vKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yLCBtc2cpCiAgICAgICBtc2cgPSAiRXhwZWN0ZWQgVHlwZXM6OkkzMiwgcmVjZWl2ZWQgTmlsQ2xhc3MgZm9yIGZpZWxkIGZvby5lbGVtZW50LmtleSIKICAgICAgIGZpZWxkID0gezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkxJU1QsCiAgICAgICAgICAgICAgICA6ZWxlbWVudCA9PiB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6TUFQLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDprZXkgPT4gezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkkzMn0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOnZhbHVlID0+IHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpJMzJ9fX0KLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKFt7bmlsID0+IDN9XSwgZmllbGQsIDpmb28pIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yLCBtc2cpCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZShbe25pbCA9PiAzfV0sIGZpZWxkLCA6Zm9vKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yLCBtc2cpCiAgICAgICBtc2cgPSAiRXhwZWN0ZWQgVHlwZXM6OkkzMiwgcmVjZWl2ZWQgTmlsQ2xhc3MgZm9yIGZpZWxkIGZvby5lbGVtZW50LnZhbHVlIgotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoW3sxID0+IG5pbH1dLCBmaWVsZCwgOmZvbykgfS5zaG91bGQgcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IsIG1zZykKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKFt7MSA9PiBuaWx9XSwgZmllbGQsIDpmb28pIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IsIG1zZykKICAgICBlbmQKICAgZW5kCiBlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL3VuaW9uX3NwZWMucmIgYi9saWIvcmIvc3BlYy91bmlvbl9zcGVjLnJiCmluZGV4IGRkODQ5MDYuLjBjZTYzMDYgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9zcGVjL3VuaW9uX3NwZWMucmIKKysrIGIvbGliL3JiL3NwZWMvdW5pb25fc3BlYy5yYgpAQCAtMjQsNzMgKzI0LDg1IEBACiAgIGRlc2NyaWJlIFRocmlmdDo6VW5pb24gZG8KICAgICBpdCAic2hvdWxkIHJldHVybiBuaWwgdmFsdWUgaW4gdW5zZXQgdW5pb24iIGRvCiAgICAgICB1bmlvbiA9IFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldwotICAgICAgdW5pb24uZ2V0X3NldF9maWVsZC5zaG91bGQgPT0gbmlsCi0gICAgICB1bmlvbi5nZXRfdmFsdWUuc2hvdWxkID09IG5pbAorICAgICAgZXhwZWN0KHVuaW9uLmdldF9zZXRfZmllbGQpLnRvIGVxKG5pbCkKKyAgICAgIGV4cGVjdCh1bmlvbi5nZXRfdmFsdWUpLnRvIGVxKG5pbCkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgc2V0IGEgZmllbGQgYW5kIGJlIGFjY2Vzc2libGUgdGhyb3VnaCBnZXRfdmFsdWUgYW5kIHRoZSBuYW1lZCBmaWVsZCBhY2Nlc3NvciIgZG8KICAgICAgIHVuaW9uID0gU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3CiAgICAgICB1bmlvbi5pbnRlZ2VyMzIgPSAyNQotICAgICAgdW5pb24uZ2V0X3NldF9maWVsZC5zaG91bGQgPT0gOmludGVnZXIzMgotICAgICAgdW5pb24uZ2V0X3ZhbHVlLnNob3VsZCA9PSAyNQotICAgICAgdW5pb24uaW50ZWdlcjMyLnNob3VsZCA9PSAyNQorICAgICAgZXhwZWN0KHVuaW9uLmdldF9zZXRfZmllbGQpLnRvIGVxKDppbnRlZ2VyMzIpCisgICAgICBleHBlY3QodW5pb24uZ2V0X3ZhbHVlKS50byBlcSgyNSkKKyAgICAgIGV4cGVjdCh1bmlvbi5pbnRlZ2VyMzIpLnRvIGVxKDI1KQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCB3b3JrIGNvcnJlY3RseSB3aGVuIGluc3RhbnRpYXRlZCB3aXRoIHN0YXRpYyBmaWVsZCBjb25zdHJ1Y3RvcnMiIGRvCiAgICAgICB1bmlvbiA9IFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLmludGVnZXIzMig1KQotICAgICAgdW5pb24uZ2V0X3NldF9maWVsZC5zaG91bGQgPT0gOmludGVnZXIzMgotICAgICAgdW5pb24uaW50ZWdlcjMyLnNob3VsZCA9PSA1CisgICAgICBleHBlY3QodW5pb24uZ2V0X3NldF9maWVsZCkudG8gZXEoOmludGVnZXIzMikKKyAgICAgIGV4cGVjdCh1bmlvbi5pbnRlZ2VyMzIpLnRvIGVxKDUpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJhaXNlIGZvciB3cm9uZyBzZXQgZmllbGQiIGRvCiAgICAgICB1bmlvbiA9IFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldwogICAgICAgdW5pb24uaW50ZWdlcjMyID0gMjUKLSAgICAgIGxhbWJkYSB7IHVuaW9uLnNvbWVfY2hhcmFjdGVycyB9LnNob3VsZCByYWlzZV9lcnJvcihSdW50aW1lRXJyb3IsICJzb21lX2NoYXJhY3RlcnMgaXMgbm90IHVuaW9uJ3Mgc2V0IGZpZWxkLiIpCisgICAgICBleHBlY3QgeyB1bmlvbi5zb21lX2NoYXJhY3RlcnMgfS50byByYWlzZV9lcnJvcihSdW50aW1lRXJyb3IsICJzb21lX2NoYXJhY3RlcnMgaXMgbm90IHVuaW9uJ3Mgc2V0IGZpZWxkLiIpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHJhaXNlIGZvciB3cm9uZyBzZXQgZmllbGQgd2hlbiBoYXNoIGluaXRpYWxpemVkIGFuZCB0eXBlIGNoZWNraW5nIGlzIG9mZiIgZG8KKyAgICAgIFRocmlmdC50eXBlX2NoZWNraW5nID0gZmFsc2UKKyAgICAgIHVuaW9uID0gU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3KHtpbmNvcnJlY3RfZmllbGQ6IDppbmNvcnJlY3R9KQorICAgICAgZXhhbXBsZSA9IGxhbWJkYSB7IFRocmlmdDo6U2VyaWFsaXplci5uZXcuc2VyaWFsaXplKHVuaW9uKSB9CisgICAgICBleHBlY3QoZXhhbXBsZSkudG8gcmFpc2VfZXJyb3IoUnVudGltZUVycm9yLCAic2V0X2ZpZWxkIGlzIG5vdCB2YWxpZCBmb3IgdGhpcyB1bmlvbiEiKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBub3QgYmUgZXF1YWwgdG8gbmlsIiBkbwogICAgICAgdW5pb24gPSBTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcKLSAgICAgIHVuaW9uLnNob3VsZF9ub3QgPT0gbmlsCisgICAgICBleHBlY3QodW5pb24pLm5vdF90byBlcShuaWwpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIG5vdCBiZSBlcXVhbCB3aXRoIGFuIGVtcHR5IFN0cmluZyIgZG8KKyAgICAgIHVuaW9uID0gU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3CisgICAgICBleHBlY3QodW5pb24pLm5vdF90byBlcSgnJykKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgbm90IGVxdWF0ZSB0d28gZGlmZmVyZW50IHVuaW9ucywgaTMyIHZzLiBzdHJpbmciIGRvCiAgICAgICB1bmlvbiA9IFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldyg6aW50ZWdlcjMyLCAyNSkKICAgICAgIG90aGVyX3VuaW9uID0gU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3KDpzb21lX2NoYXJhY3RlcnMsICJibGFoISIpCi0gICAgICB1bmlvbi5zaG91bGRfbm90ID09IG90aGVyX3VuaW9uCisgICAgICBleHBlY3QodW5pb24pLm5vdF90byBlcShvdGhlcl91bmlvbikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcHJvcGVybHkgcmVzZXQgc2V0ZmllbGQgYW5kIHNldHZhbHVlIiBkbwogICAgICAgdW5pb24gPSBTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcoOmludGVnZXIzMiwgMjUpCi0gICAgICB1bmlvbi5nZXRfc2V0X2ZpZWxkLnNob3VsZCA9PSA6aW50ZWdlcjMyCisgICAgICBleHBlY3QodW5pb24uZ2V0X3NldF9maWVsZCkudG8gZXEoOmludGVnZXIzMikKICAgICAgIHVuaW9uLnNvbWVfY2hhcmFjdGVycyA9ICJibGFoISIKLSAgICAgIHVuaW9uLmdldF9zZXRfZmllbGQuc2hvdWxkID09IDpzb21lX2NoYXJhY3RlcnMKLSAgICAgIHVuaW9uLmdldF92YWx1ZS5zaG91bGQgPT0gImJsYWghIgotICAgICAgbGFtYmRhIHsgdW5pb24uaW50ZWdlcjMyIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFJ1bnRpbWVFcnJvciwgImludGVnZXIzMiBpcyBub3QgdW5pb24ncyBzZXQgZmllbGQuIikKKyAgICAgIGV4cGVjdCh1bmlvbi5nZXRfc2V0X2ZpZWxkKS50byBlcSg6c29tZV9jaGFyYWN0ZXJzKQorICAgICAgZXhwZWN0KHVuaW9uLmdldF92YWx1ZSkudG8gZXEoImJsYWghIikKKyAgICAgIGV4cGVjdCB7IHVuaW9uLmludGVnZXIzMiB9LnRvIHJhaXNlX2Vycm9yKFJ1bnRpbWVFcnJvciwgImludGVnZXIzMiBpcyBub3QgdW5pb24ncyBzZXQgZmllbGQuIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgbm90IGVxdWF0ZSB0d28gZGlmZmVyZW50IHVuaW9ucyB3aXRoIGRpZmZlcmVudCB2YWx1ZXMiIGRvCiAgICAgICB1bmlvbiA9IFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldyg6aW50ZWdlcjMyLCAyNSkKICAgICAgIG90aGVyX3VuaW9uID0gU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3KDppbnRlZ2VyMzIsIDQwMCkKLSAgICAgIHVuaW9uLnNob3VsZF9ub3QgPT0gb3RoZXJfdW5pb24KKyAgICAgIGV4cGVjdCh1bmlvbikubm90X3RvIGVxKG90aGVyX3VuaW9uKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBub3QgZXF1YXRlIHR3byBkaWZmZXJlbnQgdW5pb25zIHdpdGggZGlmZmVyZW50IGZpZWxkcyIgZG8KICAgICAgIHVuaW9uID0gU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3KDppbnRlZ2VyMzIsIDI1KQogICAgICAgb3RoZXJfdW5pb24gPSBTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcoOm90aGVyX2kzMiwgMjUpCi0gICAgICB1bmlvbi5zaG91bGRfbm90ID09IG90aGVyX3VuaW9uCisgICAgICBleHBlY3QodW5pb24pLm5vdF90byBlcShvdGhlcl91bmlvbikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgaW5zcGVjdCBwcm9wZXJseSIgZG8KICAgICAgIHVuaW9uID0gU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3KDppbnRlZ2VyMzIsIDI1KQotICAgICAgdW5pb24uaW5zcGVjdC5zaG91bGQgPT0gIjxTcGVjTmFtZXNwYWNlOjpNeV91bmlvbiBpbnRlZ2VyMzI6IDI1PiIKKyAgICAgIGV4cGVjdCh1bmlvbi5pbnNwZWN0KS50byBlcSgiPFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uIGludGVnZXIzMjogMjU+IikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgbm90IGFsbG93IHNldHRpbmcgd2l0aCBpbnN0YW5jZV92YXJpYWJsZV9zZXQiIGRvCiAgICAgICB1bmlvbiA9IFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldyg6aW50ZWdlcjMyLCAyNykKICAgICAgIHVuaW9uLmluc3RhbmNlX3ZhcmlhYmxlX3NldCg6QHNvbWVfY2hhcmFjdGVycywgImhhbGxvISIpCi0gICAgICB1bmlvbi5nZXRfc2V0X2ZpZWxkLnNob3VsZCA9PSA6aW50ZWdlcjMyCi0gICAgICB1bmlvbi5nZXRfdmFsdWUuc2hvdWxkID09IDI3Ci0gICAgICBsYW1iZGEgeyB1bmlvbi5zb21lX2NoYXJhY3RlcnMgfS5zaG91bGQgcmFpc2VfZXJyb3IoUnVudGltZUVycm9yLCAic29tZV9jaGFyYWN0ZXJzIGlzIG5vdCB1bmlvbidzIHNldCBmaWVsZC4iKQorICAgICAgZXhwZWN0KHVuaW9uLmdldF9zZXRfZmllbGQpLnRvIGVxKDppbnRlZ2VyMzIpCisgICAgICBleHBlY3QodW5pb24uZ2V0X3ZhbHVlKS50byBlcSgyNykKKyAgICAgIGV4cGVjdCB7IHVuaW9uLnNvbWVfY2hhcmFjdGVycyB9LnRvIHJhaXNlX2Vycm9yKFJ1bnRpbWVFcnJvciwgInNvbWVfY2hhcmFjdGVycyBpcyBub3QgdW5pb24ncyBzZXQgZmllbGQuIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgc2VyaWFsaXplIHRvIGJpbmFyeSBjb3JyZWN0bHkiIGRvCkBAIC0xMDIsNyArMTE0LDcgQEAKIAogICAgICAgb3RoZXJfdW5pb24gPSBTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcoOmludGVnZXIzMiwgMjUpCiAgICAgICBvdGhlcl91bmlvbi5yZWFkKHByb3RvKQotICAgICAgb3RoZXJfdW5pb24uc2hvdWxkID09IHVuaW9uCisgICAgICBleHBlY3Qob3RoZXJfdW5pb24pLnRvIGVxKHVuaW9uKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBzZXJpYWxpemUgdG8ganNvbiBjb3JyZWN0bHkiIGRvCkBAIC0xMTQsMjQgKzEyNiwyNCBAQAogCiAgICAgICBvdGhlcl91bmlvbiA9IFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldyg6aW50ZWdlcjMyLCAyNSkKICAgICAgIG90aGVyX3VuaW9uLnJlYWQocHJvdG8pCi0gICAgICBvdGhlcl91bmlvbi5zaG91bGQgPT0gdW5pb24KKyAgICAgIGV4cGVjdChvdGhlcl91bmlvbikudG8gZXEodW5pb24pCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJhaXNlIHdoZW4gdmFsaWRhdGluZyB1bnNldCB1bmlvbiIgZG8KICAgICAgIHVuaW9uID0gU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3Ci0gICAgICBsYW1iZGEgeyB1bmlvbi52YWxpZGF0ZSB9LnNob3VsZCByYWlzZV9lcnJvcihTdGFuZGFyZEVycm9yLCAiVW5pb24gZmllbGRzIGFyZSBub3Qgc2V0LiIpCisgICAgICBleHBlY3QgeyB1bmlvbi52YWxpZGF0ZSB9LnRvIHJhaXNlX2Vycm9yKFN0YW5kYXJkRXJyb3IsICJVbmlvbiBmaWVsZHMgYXJlIG5vdCBzZXQuIikKIAogICAgICAgb3RoZXJfdW5pb24gPSBTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcoOmludGVnZXIzMiwgMSkKLSAgICAgIGxhbWJkYSB7IG90aGVyX3VuaW9uLnZhbGlkYXRlIH0uc2hvdWxkX25vdCByYWlzZV9lcnJvcihTdGFuZGFyZEVycm9yLCAiVW5pb24gZmllbGRzIGFyZSBub3Qgc2V0LiIpCisgICAgICBleHBlY3QgeyBvdGhlcl91bmlvbi52YWxpZGF0ZSB9Lm5vdF90byByYWlzZV9lcnJvcgogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCB2YWxpZGF0ZSBhbiBlbnVtIGZpZWxkIHByb3Blcmx5IiBkbwogICAgICAgdW5pb24gPSBTcGVjTmFtZXNwYWNlOjpUZXN0VW5pb24ubmV3KDplbnVtX2ZpZWxkLCAzKQotICAgICAgdW5pb24uZ2V0X3NldF9maWVsZC5zaG91bGQgPT0gOmVudW1fZmllbGQKLSAgICAgIGxhbWJkYSB7IHVuaW9uLnZhbGlkYXRlIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb24sICJJbnZhbGlkIHZhbHVlIG9mIGZpZWxkIGVudW1fZmllbGQhIikKKyAgICAgIGV4cGVjdCh1bmlvbi5nZXRfc2V0X2ZpZWxkKS50byBlcSg6ZW51bV9maWVsZCkKKyAgICAgIGV4cGVjdCB7IHVuaW9uLnZhbGlkYXRlIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpQcm90b2NvbEV4Y2VwdGlvbiwgIkludmFsaWQgdmFsdWUgb2YgZmllbGQgZW51bV9maWVsZCEiKQogCiAgICAgICBvdGhlcl91bmlvbiA9IFNwZWNOYW1lc3BhY2U6OlRlc3RVbmlvbi5uZXcoOmVudW1fZmllbGQsIDEpCi0gICAgICBsYW1iZGEgeyBvdGhlcl91bmlvbi52YWxpZGF0ZSB9LnNob3VsZF9ub3QgcmFpc2VfZXJyb3IoVGhyaWZ0OjpQcm90b2NvbEV4Y2VwdGlvbiwgIkludmFsaWQgdmFsdWUgb2YgZmllbGQgZW51bV9maWVsZCEiKQorICAgICAgZXhwZWN0IHsgb3RoZXJfdW5pb24udmFsaWRhdGUgfS5ub3RfdG8gcmFpc2VfZXJyb3IKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcHJvcGVybHkgc2VyaWFsaXplIGFuZCBtYXRjaCBzdHJ1Y3RzIHdpdGggYSB1bmlvbiIgZG8KQEAgLTE0NiwzNyArMTU4LDM3IEBACiAgICAgICBvdGhlcl91bmlvbiA9IFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldyg6c29tZV9jaGFyYWN0ZXJzLCAiaGVsbG8gdGhlcmUiKQogICAgICAgc3d1MiA9IFNwZWNOYW1lc3BhY2U6OlN0cnVjdF93aXRoX3VuaW9uLm5ldyg6ZnVuX3VuaW9uID0+IG90aGVyX3VuaW9uKQogCi0gICAgICBzd3UyLnNob3VsZF9ub3QgPT0gc3d1CisgICAgICBleHBlY3Qoc3d1Mikubm90X3RvIGVxKHN3dSkKIAogICAgICAgc3d1Mi5yZWFkKHByb3RvKQotICAgICAgc3d1Mi5zaG91bGQgPT0gc3d1CisgICAgICBleHBlY3Qoc3d1MikudG8gZXEoc3d1KQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBzdXBwb3J0IG9sZCBzdHlsZSBjb25zdHJ1Y3RvciIgZG8KICAgICAgIHVuaW9uID0gU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3KDppbnRlZ2VyMzIgPT4gMjYpCi0gICAgICB1bmlvbi5nZXRfc2V0X2ZpZWxkLnNob3VsZCA9PSA6aW50ZWdlcjMyCi0gICAgICB1bmlvbi5nZXRfdmFsdWUuc2hvdWxkID09IDI2CisgICAgICBleHBlY3QodW5pb24uZ2V0X3NldF9maWVsZCkudG8gZXEoOmludGVnZXIzMikKKyAgICAgIGV4cGVjdCh1bmlvbi5nZXRfdmFsdWUpLnRvIGVxKDI2KQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBub3QgdGhyb3cgYW4gZXJyb3Igd2hlbiBpbnNwZWN0ZWQgYW5kIHVuc2V0IiBkbwotICAgICAgbGFtYmRhe1NwZWNOYW1lc3BhY2U6OlRlc3RVbmlvbi5uZXcoKS5pbnNwZWN0fS5zaG91bGRfbm90IHJhaXNlX2Vycm9yCisgICAgICBleHBlY3R7U3BlY05hbWVzcGFjZTo6VGVzdFVuaW9uLm5ldygpLmluc3BlY3R9Lm5vdF90byByYWlzZV9lcnJvcgogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBwcmludCBlbnVtIHZhbHVlIG5hbWUgd2hlbiBpbnNwZWN0ZWQiIGRvCi0gICAgICBTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcoOnNvbWVfZW51bSA9PiBTcGVjTmFtZXNwYWNlOjpTb21lRW51bTo6T05FKS5pbnNwZWN0LnNob3VsZCA9PSAiPFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uIHNvbWVfZW51bTogT05FICgwKT4iCisgICAgICBleHBlY3QoU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3KDpzb21lX2VudW0gPT4gU3BlY05hbWVzcGFjZTo6U29tZUVudW06Ok9ORSkuaW5zcGVjdCkudG8gZXEoIjxTcGVjTmFtZXNwYWNlOjpNeV91bmlvbiBzb21lX2VudW06IE9ORSAoMCk+IikKIAotICAgICAgU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3KDpteV9tYXAgPT4ge1NwZWNOYW1lc3BhY2U6OlNvbWVFbnVtOjpPTkUgPT4gW1NwZWNOYW1lc3BhY2U6OlNvbWVFbnVtOjpUV09dfSkuaW5zcGVjdC5zaG91bGQgPT0gIjxTcGVjTmFtZXNwYWNlOjpNeV91bmlvbiBteV9tYXA6IHtPTkUgKDApOiBbVFdPICgxKV19PiIKKyAgICAgIGV4cGVjdChTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcoOm15X21hcCA9PiB7U3BlY05hbWVzcGFjZTo6U29tZUVudW06Ok9ORSA9PiBbU3BlY05hbWVzcGFjZTo6U29tZUVudW06OlRXT119KS5pbnNwZWN0KS50byBlcSgiPFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uIG15X21hcDoge09ORSAoMCk6IFtUV08gKDEpXX0+IikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgb2ZmZXIgZmllbGQ/IG1ldGhvZHMiIGRvCi0gICAgICBTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcuc29tZV9lbnVtPy5zaG91bGQgYmVfZmFsc2UKLSAgICAgIFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldyg6c29tZV9lbnVtID0+IFNwZWNOYW1lc3BhY2U6OlNvbWVFbnVtOjpPTkUpLnNvbWVfZW51bT8uc2hvdWxkIGJlX3RydWUKLSAgICAgIFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldyg6aW1fdHJ1ZSA9PiBmYWxzZSkuaW1fdHJ1ZT8uc2hvdWxkIGJlX3RydWUKLSAgICAgIFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldyg6aW1fdHJ1ZSA9PiB0cnVlKS5pbV90cnVlPy5zaG91bGQgYmVfdHJ1ZQorICAgICAgZXhwZWN0KFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldy5zb21lX2VudW0/KS50byBiZV9mYWxzZXkKKyAgICAgIGV4cGVjdChTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcoOnNvbWVfZW51bSA9PiBTcGVjTmFtZXNwYWNlOjpTb21lRW51bTo6T05FKS5zb21lX2VudW0/KS50byBiZV90cnV0aHkKKyAgICAgIGV4cGVjdChTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcoOmltX3RydWUgPT4gZmFsc2UpLmltX3RydWU/KS50byBiZV90cnV0aHkKKyAgICAgIGV4cGVjdChTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcoOmltX3RydWUgPT4gdHJ1ZSkuaW1fdHJ1ZT8pLnRvIGJlX3RydXRoeQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBwcmV0dHkgcHJpbnQgYmluYXJ5IGZpZWxkcyIgZG8KLSAgICAgIFNwZWNOYW1lc3BhY2U6OlRlc3RVbmlvbi5uZXcoOmJpbmFyeV9maWVsZCA9PiAiXDAwMVwwMDJcMDAzIikuaW5zcGVjdC5zaG91bGQgPT0gIjxTcGVjTmFtZXNwYWNlOjpUZXN0VW5pb24gYmluYXJ5X2ZpZWxkOiAwMTAyMDM+IgorICAgICAgZXhwZWN0KFNwZWNOYW1lc3BhY2U6OlRlc3RVbmlvbi5uZXcoOmJpbmFyeV9maWVsZCA9PiAiXDAwMVwwMDJcMDAzIikuaW5zcGVjdCkudG8gZXEoIjxTcGVjTmFtZXNwYWNlOjpUZXN0VW5pb24gYmluYXJ5X2ZpZWxkOiAwMTAyMDM+IikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgYmUgY29tcGFyYWJsZSIgZG8KQEAgLTE5NSw3ICsyMDcsNyBAQAogICAgICAgZm9yIHkgaW4gMC4uMwogICAgICAgICBmb3IgeCBpbiAwLi4zCiAgICAgICAgICAgIyBwdXRzICIje29ianNbeV0uaW5zcGVjdH0gPD0+ICN7b2Jqc1t4XS5pbnNwZWN0fSBzaG91bGQgPT0gI3tyZWxhdGlvbnNoaXBzW3ldW3hdfSIKLSAgICAgICAgICAob2Jqc1t5XSA8PT4gb2Jqc1t4XSkuc2hvdWxkID09IHJlbGF0aW9uc2hpcHNbeV1beF0KKyAgICAgICAgICBleHBlY3Qob2Jqc1t5XSA8PT4gb2Jqc1t4XSkudG8gZXEocmVsYXRpb25zaGlwc1t5XVt4XSkKICAgICAgICAgZW5kCiAgICAgICBlbmQKICAgICBlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL3VuaXhfc29ja2V0X3NwZWMucmIgYi9saWIvcmIvc3BlYy91bml4X3NvY2tldF9zcGVjLnJiCmluZGV4IGNiNmNmZjMuLjg2MjNlOTUgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9zcGVjL3VuaXhfc29ja2V0X3NwZWMucmIKKysrIGIvbGliL3JiL3NwZWMvdW5peF9zb2NrZXRfc3BlYy5yYgpAQCAtMjYsMjEgKzI2LDI2IEBACiAgICAgYmVmb3JlKDplYWNoKSBkbwogICAgICAgQHBhdGggPSAnL3RtcC90aHJpZnRfc3BlY19zb2NrZXQnCiAgICAgICBAc29ja2V0ID0gVGhyaWZ0OjpVTklYU29ja2V0Lm5ldyhAcGF0aCkKLSAgICAgIEBoYW5kbGUgPSBtb2NrKCJIYW5kbGUiLCA6Y2xvc2VkPyA9PiBmYWxzZSkKLSAgICAgIEBoYW5kbGUuc3R1YiEoOmNsb3NlKQotICAgICAgOjpVTklYU29ja2V0LnN0dWIhKDpuZXcpLmFuZF9yZXR1cm4oQGhhbmRsZSkKKyAgICAgIEBoYW5kbGUgPSBkb3VibGUoIkhhbmRsZSIsIDpjbG9zZWQ/ID0+IGZhbHNlKQorICAgICAgYWxsb3coQGhhbmRsZSkudG8gcmVjZWl2ZSg6Y2xvc2UpCisgICAgICBhbGxvdyg6OlVOSVhTb2NrZXQpLnRvIHJlY2VpdmUoOm5ldykuYW5kX3JldHVybihAaGFuZGxlKQogICAgIGVuZAogCiAgICAgaXRfc2hvdWxkX2JlaGF2ZV9saWtlICJhIHNvY2tldCIKIAogICAgIGl0ICJzaG91bGQgcmFpc2UgYSBUcmFuc3BvcnRFeGNlcHRpb24gd2hlbiBpdCBjYW5ub3Qgb3BlbiBhIHNvY2tldCIgZG8KLSAgICAgIDo6VU5JWFNvY2tldC5zaG91bGRfcmVjZWl2ZSg6bmV3KS5hbmRfcmFpc2UoU3RhbmRhcmRFcnJvcikKLSAgICAgIGxhbWJkYSB7IEBzb2NrZXQub3BlbiB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbikgeyB8ZXwgZS50eXBlLnNob3VsZCA9PSBUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4gfQorICAgICAgZXhwZWN0KDo6VU5JWFNvY2tldCkudG8gcmVjZWl2ZSg6bmV3KS5hbmRfcmFpc2UoU3RhbmRhcmRFcnJvcikKKyAgICAgIGV4cGVjdCB7IEBzb2NrZXQub3BlbiB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uKSB7IHxlfCBleHBlY3QoZS50eXBlKS50byBlcShUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4pIH0KICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgYWNjZXB0IGFuIG9wdGlvbmFsIHRpbWVvdXQiIGRvCi0gICAgICA6OlVOSVhTb2NrZXQuc3R1YiEoOm5ldykKLSAgICAgIFRocmlmdDo6VU5JWFNvY2tldC5uZXcoQHBhdGgsIDUpLnRpbWVvdXQuc2hvdWxkID09IDUKKyAgICAgIGFsbG93KDo6VU5JWFNvY2tldCkudG8gcmVjZWl2ZSg6bmV3KQorICAgICAgZXhwZWN0KFRocmlmdDo6VU5JWFNvY2tldC5uZXcoQHBhdGgsIDUpLnRpbWVvdXQpLnRvIGVxKDUpCisgICAgZW5kCisgICAgCisgICAgaXQgInNob3VsZCBwcm92aWRlIGEgcmVhc29uYWJsZSB0b19zIiBkbworICAgICAgYWxsb3coOjpVTklYU29ja2V0KS50byByZWNlaXZlKDpuZXcpCisgICAgICBleHBlY3QoVGhyaWZ0OjpVTklYU29ja2V0Lm5ldyhAcGF0aCkudG9fcykudG8gZXEoImRvbWFpbigje0BwYXRofSkiKQogICAgIGVuZAogICBlbmQKIApAQCAtNTEsNTcgKzU2LDYxIEBACiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGNyZWF0ZSBhIGhhbmRsZSB3aGVuIGNhbGxpbmcgbGlzdGVuIiBkbwotICAgICAgVU5JWFNlcnZlci5zaG91bGRfcmVjZWl2ZSg6bmV3KS53aXRoKEBwYXRoKQorICAgICAgZXhwZWN0KFVOSVhTZXJ2ZXIpLnRvIHJlY2VpdmUoOm5ldykud2l0aChAcGF0aCkKICAgICAgIEBzb2NrZXQubGlzdGVuCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGNyZWF0ZSBhIFRocmlmdDo6VU5JWFNvY2tldCB0byB3cmFwIGFjY2VwdGVkIHNvY2tldHMiIGRvCi0gICAgICBoYW5kbGUgPSBtb2NrKCJVTklYU2VydmVyIikKLSAgICAgIFVOSVhTZXJ2ZXIuc2hvdWxkX3JlY2VpdmUoOm5ldykud2l0aChAcGF0aCkuYW5kX3JldHVybihoYW5kbGUpCisgICAgICBoYW5kbGUgPSBkb3VibGUoIlVOSVhTZXJ2ZXIiKQorICAgICAgZXhwZWN0KFVOSVhTZXJ2ZXIpLnRvIHJlY2VpdmUoOm5ldykud2l0aChAcGF0aCkuYW5kX3JldHVybihoYW5kbGUpCiAgICAgICBAc29ja2V0Lmxpc3RlbgotICAgICAgc29jayA9IG1vY2soInNvY2siKQotICAgICAgaGFuZGxlLnNob3VsZF9yZWNlaXZlKDphY2NlcHQpLmFuZF9yZXR1cm4oc29jaykKLSAgICAgIHRyYW5zID0gbW9jaygiVU5JWFNvY2tldCIpCi0gICAgICBUaHJpZnQ6OlVOSVhTb2NrZXQuc2hvdWxkX3JlY2VpdmUoOm5ldykuYW5kX3JldHVybih0cmFucykKLSAgICAgIHRyYW5zLnNob3VsZF9yZWNlaXZlKDpoYW5kbGU9KS53aXRoKHNvY2spCi0gICAgICBAc29ja2V0LmFjY2VwdC5zaG91bGQgPT0gdHJhbnMKKyAgICAgIHNvY2sgPSBkb3VibGUoInNvY2siKQorICAgICAgZXhwZWN0KGhhbmRsZSkudG8gcmVjZWl2ZSg6YWNjZXB0KS5hbmRfcmV0dXJuKHNvY2spCisgICAgICB0cmFucyA9IGRvdWJsZSgiVU5JWFNvY2tldCIpCisgICAgICBleHBlY3QoVGhyaWZ0OjpVTklYU29ja2V0KS50byByZWNlaXZlKDpuZXcpLmFuZF9yZXR1cm4odHJhbnMpCisgICAgICBleHBlY3QodHJhbnMpLnRvIHJlY2VpdmUoOmhhbmRsZT0pLndpdGgoc29jaykKKyAgICAgIGV4cGVjdChAc29ja2V0LmFjY2VwdCkudG8gZXEodHJhbnMpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGNsb3NlIHRoZSBoYW5kbGUgd2hlbiBjbG9zZWQiIGRvCi0gICAgICBoYW5kbGUgPSBtb2NrKCJVTklYU2VydmVyIiwgOmNsb3NlZD8gPT4gZmFsc2UpCi0gICAgICBVTklYU2VydmVyLnNob3VsZF9yZWNlaXZlKDpuZXcpLndpdGgoQHBhdGgpLmFuZF9yZXR1cm4oaGFuZGxlKQorICAgICAgaGFuZGxlID0gZG91YmxlKCJVTklYU2VydmVyIiwgOmNsb3NlZD8gPT4gZmFsc2UpCisgICAgICBleHBlY3QoVU5JWFNlcnZlcikudG8gcmVjZWl2ZSg6bmV3KS53aXRoKEBwYXRoKS5hbmRfcmV0dXJuKGhhbmRsZSkKICAgICAgIEBzb2NrZXQubGlzdGVuCi0gICAgICBoYW5kbGUuc2hvdWxkX3JlY2VpdmUoOmNsb3NlKQotICAgICAgRmlsZS5zdHViISg6ZGVsZXRlKQorICAgICAgZXhwZWN0KGhhbmRsZSkudG8gcmVjZWl2ZSg6Y2xvc2UpCisgICAgICBhbGxvdyhGaWxlKS50byByZWNlaXZlKDpkZWxldGUpCiAgICAgICBAc29ja2V0LmNsb3NlCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGRlbGV0ZSB0aGUgc29ja2V0IHdoZW4gY2xvc2VkIiBkbwotICAgICAgaGFuZGxlID0gbW9jaygiVU5JWFNlcnZlciIsIDpjbG9zZWQ/ID0+IGZhbHNlKQotICAgICAgVU5JWFNlcnZlci5zaG91bGRfcmVjZWl2ZSg6bmV3KS53aXRoKEBwYXRoKS5hbmRfcmV0dXJuKGhhbmRsZSkKKyAgICAgIGhhbmRsZSA9IGRvdWJsZSgiVU5JWFNlcnZlciIsIDpjbG9zZWQ/ID0+IGZhbHNlKQorICAgICAgZXhwZWN0KFVOSVhTZXJ2ZXIpLnRvIHJlY2VpdmUoOm5ldykud2l0aChAcGF0aCkuYW5kX3JldHVybihoYW5kbGUpCiAgICAgICBAc29ja2V0Lmxpc3RlbgotICAgICAgaGFuZGxlLnN0dWIhKDpjbG9zZSkKLSAgICAgIEZpbGUuc2hvdWxkX3JlY2VpdmUoOmRlbGV0ZSkud2l0aChAcGF0aCkKKyAgICAgIGFsbG93KGhhbmRsZSkudG8gcmVjZWl2ZSg6Y2xvc2UpCisgICAgICBleHBlY3QoRmlsZSkudG8gcmVjZWl2ZSg6ZGVsZXRlKS53aXRoKEBwYXRoKQogICAgICAgQHNvY2tldC5jbG9zZQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByZXR1cm4gbmlsIHdoZW4gYWNjZXB0aW5nIGlmIHRoZXJlIGlzIG5vIGhhbmRsZSIgZG8KLSAgICAgIEBzb2NrZXQuYWNjZXB0LnNob3VsZCBiZV9uaWwKKyAgICAgIGV4cGVjdChAc29ja2V0LmFjY2VwdCkudG8gYmVfbmlsCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJldHVybiB0cnVlIGZvciBjbG9zZWQ/IHdoZW4gYXBwcm9wcmlhdGUiIGRvCi0gICAgICBoYW5kbGUgPSBtb2NrKCJVTklYU2VydmVyIiwgOmNsb3NlZD8gPT4gZmFsc2UpCi0gICAgICBVTklYU2VydmVyLnN0dWIhKDpuZXcpLmFuZF9yZXR1cm4oaGFuZGxlKQotICAgICAgRmlsZS5zdHViISg6ZGVsZXRlKQorICAgICAgaGFuZGxlID0gZG91YmxlKCJVTklYU2VydmVyIiwgOmNsb3NlZD8gPT4gZmFsc2UpCisgICAgICBhbGxvdyhVTklYU2VydmVyKS50byByZWNlaXZlKDpuZXcpLmFuZF9yZXR1cm4oaGFuZGxlKQorICAgICAgYWxsb3coRmlsZSkudG8gcmVjZWl2ZSg6ZGVsZXRlKQogICAgICAgQHNvY2tldC5saXN0ZW4KLSAgICAgIEBzb2NrZXQuc2hvdWxkX25vdCBiZV9jbG9zZWQKLSAgICAgIGhhbmRsZS5zdHViISg6Y2xvc2UpCisgICAgICBleHBlY3QoQHNvY2tldCkubm90X3RvIGJlX2Nsb3NlZAorICAgICAgYWxsb3coaGFuZGxlKS50byByZWNlaXZlKDpjbG9zZSkKICAgICAgIEBzb2NrZXQuY2xvc2UKLSAgICAgIEBzb2NrZXQuc2hvdWxkIGJlX2Nsb3NlZAorICAgICAgZXhwZWN0KEBzb2NrZXQpLnRvIGJlX2Nsb3NlZAogICAgICAgQHNvY2tldC5saXN0ZW4KLSAgICAgIEBzb2NrZXQuc2hvdWxkX25vdCBiZV9jbG9zZWQKLSAgICAgIGhhbmRsZS5zdHViISg6Y2xvc2VkPykuYW5kX3JldHVybih0cnVlKQotICAgICAgQHNvY2tldC5zaG91bGQgYmVfY2xvc2VkCisgICAgICBleHBlY3QoQHNvY2tldCkubm90X3RvIGJlX2Nsb3NlZAorICAgICAgYWxsb3coaGFuZGxlKS50byByZWNlaXZlKDpjbG9zZWQ/KS5hbmRfcmV0dXJuKHRydWUpCisgICAgICBleHBlY3QoQHNvY2tldCkudG8gYmVfY2xvc2VkCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHByb3ZpZGUgYSByZWFzb25hYmxlIHRvX3MiIGRvCisgICAgICBleHBlY3QoQHNvY2tldC50b19zKS50byBlcSgiZG9tYWluKCN7QHBhdGh9KSIpCiAgICAgZW5kCiAgIGVuZAogZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvdGhyaWZ0LmdlbXNwZWMgYi9saWIvcmIvdGhyaWZ0LmdlbXNwZWMKaW5kZXggNjdiNDVkYy4uZTUzMTk0ZSAxMDA2NDQKLS0tIGEvbGliL3JiL3RocmlmdC5nZW1zcGVjCisrKyBiL2xpYi9yYi90aHJpZnQuZ2Vtc3BlYwpAQCAtMywxNCArMywxNCBAQAogCiBHZW06OlNwZWNpZmljYXRpb24ubmV3IGRvIHxzfAogICBzLm5hbWUgICAgICAgID0gJ3RocmlmdCcKLSAgcy52ZXJzaW9uICAgICA9ICcwLjkuMi4wJwotICBzLmF1dGhvcnMgICAgID0gWydUaHJpZnQgRGV2ZWxvcGVycyddCisgIHMudmVyc2lvbiAgICAgPSAnMS4wLjAnCisgIHMuYXV0aG9ycyAgICAgPSBbJ0FwYWNoZSBUaHJpZnQgRGV2ZWxvcGVycyddCiAgIHMuZW1haWwgICAgICAgPSBbJ2RldkB0aHJpZnQuYXBhY2hlLm9yZyddCiAgIHMuaG9tZXBhZ2UgICAgPSAnaHR0cDovL3RocmlmdC5hcGFjaGUub3JnJwogICBzLnN1bW1hcnkgICAgID0gJXF7UnVieSBiaW5kaW5ncyBmb3IgQXBhY2hlIFRocmlmdH0KICAgcy5kZXNjcmlwdGlvbiA9ICVxe1J1YnkgYmluZGluZ3MgZm9yIHRoZSBBcGFjaGUgVGhyaWZ0IFJQQyBzeXN0ZW19Ci0gIHMubGljZW5zZSA9ICdBcGFjaGUgMi4wJwotICBzLmV4dGVuc2lvbnMgPSBbJ2V4dC9leHRjb25mLnJiJ10KKyAgcy5saWNlbnNlICAgICA9ICdBcGFjaGUtMi4wJworICBzLmV4dGVuc2lvbnMgID0gWydleHQvZXh0Y29uZi5yYiddCiAKICAgcy5oYXNfcmRvYyAgICAgID0gdHJ1ZQogICBzLnJkb2Nfb3B0aW9ucyAgPSAld1stLWxpbmUtbnVtYmVycyAtLWlubGluZS1zb3VyY2UgLS10aXRsZSBUaHJpZnQgLS1tYWluIFJFQURNRV0KQEAgLTI3LDExICsyNywxNCBAQAogCiAgIHMucmVxdWlyZV9wYXRocyA9ICV3W2xpYiBleHRdCiAKLSAgcy5hZGRfZGV2ZWxvcG1lbnRfZGVwZW5kZW5jeSAncnNwZWMnLCAnfj4gMi4xMC4wJwotICBzLmFkZF9kZXZlbG9wbWVudF9kZXBlbmRlbmN5ICJyYWNrIiwgIn4+IDEuNS4yIgotICBzLmFkZF9kZXZlbG9wbWVudF9kZXBlbmRlbmN5ICJyYWNrLXRlc3QiLCAifj4gMC42LjIiCi0gIHMuYWRkX2RldmVsb3BtZW50X2RlcGVuZGVuY3kgInRoaW4iLCAifj4gMS41LjAiCi0gIHMuYWRkX2RldmVsb3BtZW50X2RlcGVuZGVuY3kgImJ1bmRsZXIiCi0gIHMuYWRkX2RldmVsb3BtZW50X2RlcGVuZGVuY3kgJ3Jha2UnCisgIHMuYWRkX2RldmVsb3BtZW50X2RlcGVuZGVuY3kgJ2J1bmRsZXInLCAgICAgICAgICAgICd+PiAxLjExJworICBzLmFkZF9kZXZlbG9wbWVudF9kZXBlbmRlbmN5ICdwcnknLCAgICAgICAgICAgICAgICAnfj4gMC4xMS4zJworICBzLmFkZF9kZXZlbG9wbWVudF9kZXBlbmRlbmN5ICdwcnktYnllYnVnJywgICAgICAgICAnfj4gMy42JworICBzLmFkZF9kZXZlbG9wbWVudF9kZXBlbmRlbmN5ICdwcnktc3RhY2tfZXhwbG9yZXInLCAnfj4gMC40LjkuMicKKyAgcy5hZGRfZGV2ZWxvcG1lbnRfZGVwZW5kZW5jeSAncmFjaycsICAgICAgICAgICAgICAgJ34+IDIuMCcKKyAgcy5hZGRfZGV2ZWxvcG1lbnRfZGVwZW5kZW5jeSAncmFjay10ZXN0JywgICAgICAgICAgJ34+IDAuOC4zJworICBzLmFkZF9kZXZlbG9wbWVudF9kZXBlbmRlbmN5ICdyYWtlJywgICAgICAgICAgICAgICAnfj4gMTIuMycKKyAgcy5hZGRfZGV2ZWxvcG1lbnRfZGVwZW5kZW5jeSAncnNwZWMnLCAgICAgICAgICAgICAgJ34+IDMuNycKKyAgcy5hZGRfZGV2ZWxvcG1lbnRfZGVwZW5kZW5jeSAndGhpbicsICAgICAgICAgICAgICAgJ34+IDEuNycKIGVuZAogCmRpZmYgLS1naXQgYS9saWIvcnMvQ2FyZ28udG9tbCBiL2xpYi9ycy9DYXJnby50b21sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkMzIxNzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcnMvQ2FyZ28udG9tbApAQCAtMCwwICsxLDE5IEBACitbcGFja2FnZV0KK25hbWUgPSAidGhyaWZ0IgorZGVzY3JpcHRpb24gPSAiUnVzdCBiaW5kaW5ncyBmb3IgdGhlIEFwYWNoZSBUaHJpZnQgUlBDIHN5c3RlbSIKK3ZlcnNpb24gPSAiMS4wLjAiCitsaWNlbnNlID0gIkFwYWNoZS0yLjAiCithdXRob3JzID0gWyJBcGFjaGUgVGhyaWZ0IERldmVsb3BlcnMgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4iXQoraG9tZXBhZ2UgPSAiaHR0cDovL3RocmlmdC5hcGFjaGUub3JnIgorZG9jdW1lbnRhdGlvbiA9ICJodHRwczovL3RocmlmdC5hcGFjaGUub3JnIgorcmVhZG1lID0gIlJFQURNRS5tZCIKK2V4Y2x1ZGUgPSBbIk1ha2VmaWxlKiIsICJ0ZXN0LyoqIiwgIiouaW1sIl0KK2tleXdvcmRzID0gWyJ0aHJpZnQiXQorCitbZGVwZW5kZW5jaWVzXQorYnl0ZW9yZGVyID0gIn4xLjIuMSIKK2ludGVnZXItZW5jb2RpbmcgPSAifjEuMC40IgorbG9nID0gIn4wLjMuOCIKK3RocmVhZHBvb2wgPSAifjEuNy4xIgordHJ5X2Zyb20gPSAifjAuMi4yIgorCmRpZmYgLS1naXQgYS9saWIvcnMvTWFrZWZpbGUuYW0gYi9saWIvcnMvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGEzNDEyMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ycy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDQ2IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworU1VCRElSUyA9IC4KKworaWYgV0lUSF9URVNUUworU1VCRElSUyArPSB0ZXN0CitlbmRpZgorCitpbnN0YWxsOgorCUBlY2hvICcjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIycKKwlAZWNobyAnIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMnCisJQGVjaG8gJ1RoZSBSdXN0IGNsaWVudCBsaWJyYXJ5IHNob3VsZCBiZSBpbnN0YWxsZWQgdmlhIGEgQ2FyZ28udG9tbCBkZXBlbmRlbmN5IC0gcGxlYXNlIHNlZSAvbGliL3JzL1JFQURNRS5tZCcKKwlAZWNobyAnIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMnCisJQGVjaG8gJyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjJworCitjaGVjay1sb2NhbDoKKwkkKENBUkdPKSB0ZXN0CisKK2FsbC1sb2NhbDoKKwkkKENBUkdPKSBidWlsZAorCitjbGVhbi1sb2NhbDoKKwkkKENBUkdPKSBjbGVhbgorCS0kKFJNKSBDYXJnby5sb2NrCisKK0VYVFJBX0RJU1QgPSBcCisJc3JjIFwKKwlDYXJnby50b21sIFwKKwlSRUFETUUubWQKZGlmZiAtLWdpdCBhL2xpYi9ycy9SRUFETUUubWQgYi9saWIvcnMvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjMzdhMTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcnMvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMTExIEBACisjIFJ1c3QgVGhyaWZ0IGxpYnJhcnkKKworIyMgT3ZlcnZpZXcKKworVGhpcyBjcmF0ZSBpbXBsZW1lbnRzIHRoZSBjb21wb25lbnRzIHJlcXVpcmVkIHRvIGJ1aWxkIGEgd29ya2luZyBUaHJpZnQgc2VydmVyCithbmQgY2xpZW50LiBJdCBpcyBkaXZpZGVkIGludG8gdGhlIGZvbGxvd2luZyBtb2R1bGVzOgorCisgMS4gZXJyb3JzCisgMi4gcHJvdG9jb2wKKyAzLiB0cmFuc3BvcnQKKyA0LiBzZXJ2ZXIKKyA1LiBhdXRvZ2VuCisKK1RoZSBtb2R1bGVzIGFyZSBsYXllcmVkIGFzIHNob3duLiBUaGUgYGdlbmVyYXRlZGAgbGF5ZXIgaXMgY29kZSBnZW5lcmF0ZWQgYnkgdGhlCitUaHJpZnQgY29tcGlsZXIncyBSdXN0IHBsdWdpbi4gSXQgdXNlcyB0aGUgY29tcG9uZW50cyBkZWZpbmVkIGluIHRoaXMgY3JhdGUgdG8KK3NlcmlhbGl6ZSBhbmQgZGVzZXJpYWxpemUgdHlwZXMgYW5kIGltcGxlbWVudCBSUEMuIFVzZXJzIGludGVyYWN0IHdpdGggdGhlc2UKK3R5cGVzIGFuZCBzZXJ2aWNlcyBieSB3cml0aW5nIHRoZWlyIG93biBjb2RlIG9uIHRvcC4KKworIGBgYHRleHQKKyArLS0tLS0tLS0tLS0rCisgfCAgYXBwIGRldiAgfAorICstLS0tLS0tLS0tLSsKKyB8IGdlbmVyYXRlZCB8IDwtPiBlcnJvcnMvcmVzdWx0cworICstLS0tLS0tLS0tLSsKKyB8ICBwcm90b2NvbCB8CisgKy0tLS0tLS0tLS0tKworIHwgdHJhbnNwb3J0IHwKKyArLS0tLS0tLS0tLS0rCisgYGBgCisKKyMjIFVzaW5nIHRoaXMgY3JhdGUKKworQWRkIGB0aHJpZnQgPSAieC55LnoiYCB0byB5b3VyIGBDYXJnby50b21sYCwgd2hlcmUgYHgueS56YCBpcyB0aGUgdmVyc2lvbiBvZiB0aGUKK1RocmlmdCBjb21waWxlciB5b3UncmUgdXNpbmcuCisKKyMjIEFQSSBEb2N1bWVudGF0aW9uCisKK0Z1bGwgW1J1c3Rkb2NdKGh0dHBzOi8vZG9jcy5ycy90aHJpZnQvKQorCisjIyBDb21wYXRpYmlsaXR5CisKK1RoZSBSdXN0IGxpYnJhcnkgYW5kIGF1dG8tZ2VuZXJhdGVkIGNvZGUgdGFyZ2V0cyBSdXN0IHZlcnNpb25zIDEuMjgrLgorSXQgZG9lcyBub3QgY3VycmVudGx5IHVzZSBhbnkgUnVzdCAyMDE4IGZlYXR1cmVzLgorCisjIyMgQnJlYWtpbmcgQ2hhbmdlcworCitCcmVha2luZyBjaGFuZ2VzIGFyZSBtaW5pbWl6ZWQuIFdoZW4gdGhleSBhcmUgbWFkZSB0aGV5IHdpbGwgYmUgb3V0bGluZWQgYmVsb3cgd2l0aCB0cmFuc2l0aW9uIGd1aWRlbGluZXMuCisKKyMjIyMjIFRocmlmdCAwLjEyLjAKKworKiAqKltUSFJJRlQtNDUyOV0qKiAtIFJ1c3QgZW51bSB2YXJpYW50cyBhcmUgbm93IGNhbWVsLWNhc2VkIGluc3RlYWQgb2YgdXBwZXJjYXNlZCB0byBjb25mb3JtIHRvIFJ1c3QgbmFtaW5nIGNvbnZlbnRpb25zCisKKyAgICBQcmV2aW91c2x5LCBlbnVtIHZhcmlhbnRzIHdlcmUgdXBwZXJjYXNlZCBpbiB0aGUgYXV0by1nZW5lcmF0ZWQgY29kZS4KKyAgICBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyB0aHJpZnQgZW51bToKKworICAgIGBgYHRocmlmdAorICAgIC8vIFRIUklGVAorICAgIGVudW0gT3BlcmF0aW9uIHsKKyAgICAgIEFERCwKKyAgICAgIFNVQlRSQUNULAorICAgICAgTVVMVElQTFksCisgICAgICBESVZJREUsCisgICAgfQorICAgIGBgYAorICAgIAorICAgIHVzZWQgdG8gZ2VuZXJhdGU6CisgICAgCisgICAgYGBgcnVzdAorICAgIC8vIE9MRCBBVVRPLUdFTkVSQVRFRCBSVVNUCisgICAgcHViIGVudW0gT3BlcmF0aW9uIHsKKyAgICAgICBBREQsCisgICAgICAgU1VCVFJBQ1QsCisgICAgICAgTVVMVElQTFksCisgICAgICAgRElWSURFLAorICAgICB9CisgICAgYGBgCisgICAgSXQgKm5vdyogZ2VuZXJhdGVzOgorICAgIGBgYHJ1c3QKKyAgICAvLyBORVcgQVVUTy1HRU5FUkFURUQgUlVTVAorICAgIHB1YiBlbnVtIE9wZXJhdGlvbiB7CisgICAgICAgQWRkLAorICAgICAgIFN1YnRyYWN0LAorICAgICAgIE11bHRpcGx5LAorICAgICAgIERpdmlkZSwKKyAgICAgfQorICAgIGBgYAorICAgIAorICAgIFlvdSB3aWxsIGhhdmUgdG8gY2hhbmdlIGFsbCBlbnVtIHZhcmlhbnRzIGluIHlvdXIgY29kZSB0byB1c2UgY2FtZWwtY2FzZWQgbmFtZXMuCisgICAgVGhpcyBzaG91bGQgYmUgYSBzZWFyY2ggYW5kIHJlcGxhY2UuCisKKyMjIENvbnRyaWJ1dGluZworCitCdWcgcmVwb3J0cyBhbmQgUFJzIGFyZSBhbHdheXMgd2VsY29tZSEgUGxlYXNlIHNlZSB0aGUKK1tUaHJpZnQgd2Vic2l0ZV0oaHR0cHM6Ly90aHJpZnQuYXBhY2hlLm9yZy8pIGZvciBtb3JlIGRldGFpbHMuCisKK1RocmlmdCBSdXN0IHN1cHBvcnQgcmVxdWlyZXMgY29kZSBpbiBzZXZlcmFsIGRpcmVjdG9yaWVzOgorCisqIGBjb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X3JzX2dlbmVyYXRvci5jY2A6IGJpbmRpbmcgY29kZSBnZW5lcmF0b3IKKyogYGxpYi9yc2A6IHJ1bnRpbWUgbGlicmFyeQorKiBgbGliL3JzL3Rlc3RgOiBzdXBwbGVtZW50YWwgdGVzdHMKKyogYHR1dG9yaWFsL3JzYDogdHV0b3JpYWwgY2xpZW50IGFuZCBzZXJ2ZXIKKyogYHRlc3QvcnNgOiBjcm9zcy1sYW5ndWFnZSB0ZXN0IGNsaWVudCBhbmQgc2VydmVyCisKK0FsbCBsaWJyYXJ5IGNvZGUsIHRlc3QgY29kZSBhbmQgYXV0by1nZW5lcmF0ZWQgY29kZSBjb21waWxlcyBhbmQgcGFzc2VzIGNsaXBweQord2l0aG91dCB3YXJuaW5ncy4gQWxsIG5ldyBjb2RlIG11c3QgZG8gdGhlIHNhbWUhIFdoZW4gbWFraW5nIGNoYW5nZXMgZW5zdXJlIHRoYXQ6CisKKyogYHJ1c3RjYCBkb2VzIGRvZXMgb3V0cHV0IGFueSB3YXJuaW5ncworKiBgY2xpcHB5YCB3aXRoIGRlZmF1bHQgc2V0dGluZ3MgZG9lcyBub3Qgb3V0cHV0IGFueSB3YXJuaW5ncyAoaW5jbHVkZXMgYXV0by1nZW5lcmF0ZWQgY29kZSkKKyogYGNhcmdvIHRlc3RgIGlzIHN1Y2Nlc3NmdWwKKyogYG1ha2UgcHJlY3Jvc3NgIGFuZCBgbWFrZSBjaGVja2AgYXJlIHN1Y2Nlc3NmdWwKKyogYHR1dG9yaWFsL2Jpbi90dXRvcmlhbF9jbGllbnRgIGFuZCBgdHV0b3JpYWwvYmluL3R1dG9yaWFsX3NlcnZlcmAgY29tbXVuaWNhdGUKZGlmZiAtLWdpdCBhL2xpYi9ycy9SRUxFQVNJTkcubWQgYi9saWIvcnMvUkVMRUFTSU5HLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3M2Q3YTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcnMvUkVMRUFTSU5HLm1kCkBAIC0wLDAgKzEsNTcgQEAKKyMgUHVibGlzaGluZyB0aGUgdGhyaWZ0IGNyYXRlCisKK1B1Ymxpc2hpbmcgdGhlIFJ1c3QgdGhyaWZ0IGNyYXRlIGlzIHN0cmFpZ2h0Zm9yd2FyZCwgYW5kIGludm9sdmVzIHR3byBtYWpvciBzdGVwczoKKworMS4gU2V0dGluZyB1cCB5b3VyIFtjcmF0ZXMuaW9dKGh0dHBzOi8vd3d3LmNyYXRlcy5pbykgYWNjb3VudCBfKG9uZS10aW1lKV8KKworMi4gUGFja2FnaW5nL3B1Ymxpc2hpbmcgdGhlIFJ1c3QgdGhyaWZ0IGNyYXRlIGl0c2VsZgorCisjIyBTZXQgdXAgeW91ciBjcmF0ZXMuaW8gYWNjb3VudCAob25lLXRpbWUpCisKKzEuIEdvIHRvIFtjcmF0ZXMuaW9dKGh0dHBzOi8vd3d3LmNyYXRlcy5pbykgYW5kIGNsaWNrIHRoZSBgTG9nIEluYCBidXR0b24gYXQgdGhlIHRvcCByaWdodC4KKworICAgTG9nIGluICoqYXMgdGhlIEdpdGh1YiB1c2VyIHdpdGggd3JpdGUgcGVybWlzc2lvbnMgdG8gdGhlIHRocmlmdCByZXBvISoqCisKKzIuIENsaWNrIHlvdXIgdXNlciBpY29uIGJ1dHRvbiBhdCB0aGUgdG9wIHJpZ2h0IGFuZCBzZWxlY3QgYEFjY291bnQgU2V0dGluZ3NgLgorCiszLiBDbGljayBgTmV3IFRva2VuYCBuZXh0IHRvIGBBUEkgQWNjZXNzYC4KKworICAgVGhpcyBnZW5lcmF0ZXMgYSBuZXcgQVBJIGtleSB0aGF0IGNhcmdvIHVzZXMgdG8gcHVibGlzaCBwYWNrYWdlcyB0byBjcmF0ZXMuaW8uCisgICBTdG9yZSB0aGlzIEFQSSBrZXkgc29tZXdoZXJlIHNhZmUuIElmIHlvdSB3aWxsIG9ubHkgdXNlIHRoaXMgR2l0aHViIGFjY291bnQgdG8KKyAgIHB1Ymxpc2ggY3JhdGVzIHRvIGNyYXRlcy5pbyB5b3UgY2FuIGZvbGxvdyB0aGUgaW5zdHJ1Y3Rpb25zIHRvIHNhdmUgdGhlCisgICBnZW5lcmF0ZWQga2V5IHRvIGB+Ly5jYXJnby9jcmVkZW50aWFsc2AuCisKKyMjIFBhY2thZ2UgYW5kIFB1Ymxpc2gKKworWW91IGNhbiB1c2UgdGhlIGF1dG9tYXRlZCBzY3JpcHQgb3IgcnVuIHRoZSByZWxlYXNlIHN0ZXBzIG1hbnVhbGx5LgorCisqKkltcG9ydGFudCoqOiBgY2FyZ29gIGV4cGVjdHMgdGhhdCB2ZXJzaW9uIG51bWJlcnMgZm9sbG93IHRoZSBzZW1hbnRpYyB2ZXJzaW9uaW5nIGZvcm1hdC4KK1RoaXMgbWVhbnMgdGhhdCBgVEhSSUZUX1JFTEVBU0VfVkVSU0lPTmAgbXVzdCBoYXZlIGEgbWFqb3IsIG1pbm9yIGFuZCBwYXRjaCBudW1iZXIsIGkuZS4sIG11c3QKK2JlIGluIHRoZSBmb3JtIGAjLiMjLiMjYC4KKworIyMjIyBBdXRvbWF0ZWQKKworUnVuIGAuL3JlbGVhc2Uuc2ggW1RIUklGVF9SRUxFQVNFX1ZFUlNJT05dYC4KKworX1JlcXVpcmVzIHlvdSB0byBoYXZlIHN0b3JlZCB5b3VyIGNyZWRlbnRpYWxzIGluIGB+Ly5jYXJnby9jcmVkZW50aWFsc2AuXworCisjIyMjIE1hbnVhbAorCisxLiBFZGl0IGBDYXJnby50b21sYCBhbmQgdXBkYXRlIHRoZSBgdmVyc2lvbiA9IDEuMGAga2V5IHRvIGB2ZXJzaW9uID0gW1RIUklGVF9SRUxFQVNFX1ZFUlNJT05dYAorCisyLiBgZ2l0IGFkZCBDYXJnby50b21sYAorCiszLiBgZ2l0IGNvbW1pdCAtbSAiVXBkYXRlIHRocmlmdCBjcmF0ZSB2ZXJzaW9uIHRvIFtUSFJJRlRfUkVMRUFTRV9WRVJTSU9OXSIgLW0gIkNsaWVudDogcnMiYAorCis0LiBgY2FyZ28gbG9naW5gCisKKyAgICBfKG5vdCByZXF1aXJlZCBpZiB5b3UgaGF2ZSBzdG9yZWQgeW91ciBjcmVkZW50aWFscyBpbiBgfi8uY2FyZ28vY3JlZGVudGlhbHNgKV8KKworNS4gYGNhcmdvIGNsZWFuYAorCis2LiBgY2FyZ28gcGFja2FnZWAKKworICAgVGhpcyBzdGVwIGZhaWxzIGlmIHRoZXJlIGFyZSBhbnkgdW5jb21taXR0ZWQgb3IgaWdub3JlZCBmaWxlcy4gRG8gKipub3QqKiB1c2UgdGhlIGAtLWFsbG93LWRpcnR5YAorICAgZmxhZyEgSW5zdGVhZCwgYWRkIHRoZSBoaWdobGlnaHRlZCBmaWxlcyBhcyBlbnRyaWVzIGluIHRoZSBgQ2FyZ28udG9tbGAgYGV4Y2x1ZGVgIGtleS4KKworNy4gYGNhcmdvIHB1Ymxpc2hgCmRpZmYgLS1naXQgYS9saWIvcnMvcmVsZWFzZS5zaCBiL2xpYi9ycy9yZWxlYXNlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmM0ZTViNDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcnMvcmVsZWFzZS5zaApAQCAtMCwwICsxLDI2IEBACisjIS9iaW4vYmFzaAorCitzZXQgLW8gZXJyZXhpdAorc2V0IC1vIHBpcGVmYWlsCitzZXQgLW8gbm91bnNldAorCitpZiAhIFtbICQjIC1lcSAxICYmICQxID1+IF5bMC05XShcLlswLTldWzAtOV0qKXsyfSQgXV07IHRoZW4KKyAgICAoPiYyIGVjaG8gIlVzYWdlOiAuL3B1Ymxpc2gtY3JhdGUuc2ggW1RIUklGVF9SRUxFQVNFX1ZFUlNJT05dICIpCisgICAgKD4mMiBlY2hvICIgICAgICAgVEhSSUZUX1JFTEVBU0VfVkVSU0lPTiBpcyBpbiBzZW1hbnRpYyB2ZXJzaW9uaW5nIGZvcm1hdCwgaS5lLiAjLiMjLiMjIikKKyAgICBleGl0IDEKK2ZpCisKK1RIUklGVF9SRUxFQVNFX1ZFUlNJT049JHsxOi19CisKK2VjaG8gIlVwZGF0aW5nIENhcmdvLnRvbWwgdG8gJHtUSFJJRlRfUkVMRUFTRV9WRVJTSU9OfSIKK3NlZCAtaS5vbGQgLWUgInMvXnZlcnNpb24gPSAuKiQvdmVyc2lvbiA9IFwiJHtUSFJJRlRfUkVMRUFTRV9WRVJTSU9OfVwiL2ciIENhcmdvLnRvbWwKK3JtIENhcmdvLnRvbWwub2xkCisKK2VjaG8gIkNvbW1pdHRpbmcgdXBkYXRlZCBDYXJnby50b21sIgorZ2l0IGFkZCBDYXJnby50b21sCitnaXQgY29tbWl0IC1tICJVcGRhdGUgdGhyaWZ0IGNyYXRlIHZlcnNpb24gdG8gJHtUSFJJRlRfUkVMRUFTRV9WRVJTSU9OfSIgLW0gIkNsaWVudDogcnMiCisKK2VjaG8gIlBhY2thZ2luZyBhbmQgcmVsZWFzaW5nIHJ1c3QgdGhyaWZ0IGNyYXRlIHdpdGggdmVyc2lvbiAke1RIUklGVF9SRUxFQVNFX1ZFUlNJT059IgorY2FyZ28gY2xlYW4KK2NhcmdvIHBhY2thZ2UKK2NhcmdvIHB1Ymxpc2gKZGlmZiAtLWdpdCBhL2xpYi9ycy9zcmMvYXV0b2dlbi5ycyBiL2xpYi9ycy9zcmMvYXV0b2dlbi5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGQ0MDgwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3JzL3NyYy9hdXRvZ2VuLnJzCkBAIC0wLDAgKzEsNDUgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8hIFRocmlmdCBjb21waWxlciBhdXRvLWdlbmVyYXRlZCBzdXBwb3J0LgorLy8hCisvLyEKKy8vISBUeXBlcyBhbmQgZnVuY3Rpb25zIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgVGhyaWZ0IGNvbXBpbGVyJ3MgUnVzdCBwbHVnaW4KKy8vISB0byBpbXBsZW1lbnQgcmVxdWlyZWQgZnVuY3Rpb25hbGl0eS4gVXNlcnMgc2hvdWxkIG5ldmVyIGhhdmUgdG8gdXNlIGNvZGUKKy8vISBpbiB0aGlzIG1vZHVsZSBkaXJlY3RseS4KKwordXNlIHByb3RvY29sOjp7VElucHV0UHJvdG9jb2wsIFRPdXRwdXRQcm90b2NvbH07CisKKy8vLyBTcGVjaWZpZXMgdGhlIG1pbmltdW0gZnVuY3Rpb25hbGl0eSBhbiBhdXRvLWdlbmVyYXRlZCBjbGllbnQgc2hvdWxkIHByb3ZpZGUKKy8vLyB0byBjb21tdW5pY2F0ZSB3aXRoIGEgVGhyaWZ0IHNlcnZlci4KK3B1YiB0cmFpdCBUVGhyaWZ0Q2xpZW50IHsKKyAgICAvLy8gUmV0dXJucyB0aGUgaW5wdXQgcHJvdG9jb2wgdXNlZCB0byByZWFkIHNlcmlhbGl6ZWQgVGhyaWZ0IG1lc3NhZ2VzCisgICAgLy8vIGZyb20gdGhlIFRocmlmdCBzZXJ2ZXIuCisgICAgZm4gaV9wcm90X211dCgmbXV0IHNlbGYpIC0+ICZtdXQgVElucHV0UHJvdG9jb2w7CisgICAgLy8vIFJldHVybnMgdGhlIG91dHB1dCBwcm90b2NvbCB1c2VkIHRvIHdyaXRlIHNlcmlhbGl6ZWQgVGhyaWZ0IG1lc3NhZ2VzCisgICAgLy8vIHRvIHRoZSBUaHJpZnQgc2VydmVyLgorICAgIGZuIG9fcHJvdF9tdXQoJm11dCBzZWxmKSAtPiAmbXV0IFRPdXRwdXRQcm90b2NvbDsKKyAgICAvLy8gUmV0dXJucyB0aGUgc2VxdWVuY2UgbnVtYmVyIG9mIHRoZSBsYXN0IG1lc3NhZ2Ugd3JpdHRlbiB0byB0aGUgVGhyaWZ0CisgICAgLy8vIHNlcnZlci4gUmV0dXJucyBgMGAgaWYgbm8gbWVzc2FnZXMgaGF2ZSBiZWVuIHdyaXR0ZW4uIFNlcXVlbmNlCisgICAgLy8vIG51bWJlcnMgc2hvdWxkICpuZXZlciogYmUgbmVnYXRpdmUsIGFuZCB0aGlzIG1ldGhvZCByZXR1cm5zIGFuIGBpMzJgCisgICAgLy8vIHNpbXBseSBiZWNhdXNlIHRoZSBUaHJpZnQgcHJvdG9jb2wgZW5jb2RlcyBzZXF1ZW5jZSBudW1iZXJzIGFzIGBpMzJgIG9uCisgICAgLy8vIHRoZSB3aXJlLgorICAgIGZuIHNlcXVlbmNlX251bWJlcigmc2VsZikgLT4gaTMyOyAvLyBGSVhNRTogY29uc2lkZXIgcmV0dXJuaW5nIGEgdTMyCisgICAgLy8vIEluY3JlbWVudHMgdGhlIHNlcXVlbmNlIG51bWJlciwgaW5kaWNhdGluZyB0aGF0IGEgbWVzc2FnZSB3aXRoIHRoYXQKKyAgICAvLy8gbnVtYmVyIGhhcyBiZWVuIHNlbnQgdG8gdGhlIFRocmlmdCBzZXJ2ZXIuCisgICAgZm4gaW5jcmVtZW50X3NlcXVlbmNlX251bWJlcigmbXV0IHNlbGYpIC0+IGkzMjsKK30KZGlmZiAtLWdpdCBhL2xpYi9ycy9zcmMvZXJyb3JzLnJzIGIvbGliL3JzL3NyYy9lcnJvcnMucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZhMjU3NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ycy9zcmMvZXJyb3JzLnJzCkBAIC0wLDAgKzEsNjcwIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzZSBzdGQ6OmNvbnZlcnQ6OntGcm9tLCBJbnRvfTsKK3VzZSBzdGQ6OmVycm9yOjpFcnJvciBhcyBTdGRFcnJvcjsKK3VzZSBzdGQ6OmZtdDo6e0RlYnVnLCBEaXNwbGF5LCBGb3JtYXR0ZXJ9OwordXNlIHN0ZDo6e2Vycm9yLCBmbXQsIGlvLCBzdHJpbmd9OwordXNlIHRyeV9mcm9tOjpUcnlGcm9tOworCit1c2UgcHJvdG9jb2w6OntURmllbGRJZGVudGlmaWVyLCBUSW5wdXRQcm90b2NvbCwgVE91dHB1dFByb3RvY29sLCBUU3RydWN0SWRlbnRpZmllciwgVFR5cGV9OworCisvLyBGSVhNRTogc2hvdWxkIGFsbCBteSBlcnJvciBzdHJ1Y3RzIGltcGwgZXJyb3I6OkVycm9yIGFzIHdlbGw/CisvLyBGSVhNRTogc2hvdWxkIGFsbCBmaWVsZHMgaW4gVHJhbnNwb3J0RXJyb3IsIFByb3RvY29sRXJyb3IgYW5kIEFwcGxpY2F0aW9uRXJyb3IgYmUgb3B0aW9uYWw/CisKKy8vLyBFcnJvciB0eXBlIHJldHVybmVkIGJ5IGFsbCBydW50aW1lIGxpYnJhcnkgZnVuY3Rpb25zLgorLy8vCisvLy8gYHRocmlmdDo6RXJyb3JgIGlzIHVzZWQgdGhyb3VnaG91dCB0aGlzIGNyYXRlIGFzIHdlbGwgYXMgaW4gYXV0by1nZW5lcmF0ZWQKKy8vLyBSdXN0IGNvZGUuIEl0IGNvbnNpc3RzIG9mIGZvdXIgdmFyaWFudHMgZGVmaW5lZCBieSBjb252ZW50aW9uIGFjcm9zcyBUaHJpZnQKKy8vLyBpbXBsZW1lbnRhdGlvbnM6CisvLy8KKy8vLyAxLiBgVHJhbnNwb3J0YDogZXJyb3JzIGVuY291bnRlcmVkIHdoaWxlIG9wZXJhdGluZyBvbiBJL08gY2hhbm5lbHMKKy8vLyAyLiBgUHJvdG9jb2xgOiBlcnJvcnMgZW5jb3VudGVyZWQgZHVyaW5nIHJ1bnRpbWUtbGlicmFyeSBwcm9jZXNzaW5nCisvLy8gMy4gYEFwcGxpY2F0aW9uYDogZXJyb3JzIGVuY291bnRlcmVkIHdpdGhpbiBhdXRvLWdlbmVyYXRlZCBjb2RlCisvLy8gNC4gYFVzZXJgOiBJREwtZGVmaW5lZCBleGNlcHRpb24gc3RydWN0cworLy8vCisvLy8gVGhlIGBBcHBsaWNhdGlvbmAgdmFyaWFudCBhbHNvIGZ1bmN0aW9ucyBhcyBhIGNhdGNoLWFsbDogYWxsIGhhbmRsZXIgZXJyb3JzCisvLy8gYXJlIGF1dG9tYXRpY2FsbHkgdHVybmVkIGludG8gYXBwbGljYXRpb24gZXJyb3JzLgorLy8vCisvLy8gQWxsIGVycm9yIHZhcmlhbnRzIGV4Y2VwdCBgRXJyb3I6OlVzZXJgIHRha2UgYW4gZXBvbnltb3VzIHN0cnVjdCB3aXRoIHR3bworLy8vIHJlcXVpcmVkIGZpZWxkczoKKy8vLworLy8vIDEuIGBraW5kYDogdmFyaWFudC1zcGVjaWZpYyBlbnVtIGlkZW50aWZ5aW5nIHRoZSBlcnJvciBzdWItdHlwZQorLy8vIDIuIGBtZXNzYWdlYDogaHVtYW4tcmVhZGFibGUgZXJyb3IgaW5mbyBzdHJpbmcKKy8vLworLy8vIGBraW5kYCBpcyBkZWZpbmVkIGJ5IGNvbnZlbnRpb24gd2hpbGUgYG1lc3NhZ2VgIGlzIGZyZWVmb3JtLiBJZiBub25lIG9mIHRoZQorLy8vIGVudW1lcmF0ZWQga2luZHMgYXJlIHN1aXRhYmxlIHVzZSBgVW5rbm93bmAuCisvLy8KKy8vLyBUbyBzaW1wbGlmeSBlcnJvciBjcmVhdGlvbiBjb252ZW5pZW5jZSBjb25zdHJ1Y3RvcnMgYXJlIGRlZmluZWQgZm9yIGFsbAorLy8vIHZhcmlhbnRzLCBhbmQgY29udmVyc2lvbnMgZnJvbSB0aGVpciBzdHJ1Y3RzIChgdGhyaWZ0OjpUcmFuc3BvcnRFcnJvcmAsCisvLy8gYHRocmlmdDo6UHJvdG9jb2xFcnJvcmAgYW5kIGB0aHJpZnQ6OkFwcGxpY2F0aW9uRXJyb3JgIGludG8gYHRocmlmdDo6RXJyb3JgLgorLy8vCisvLy8gIyBFeGFtcGxlcworLy8vCisvLy8gQ3JlYXRlIGEgYFRyYW5zcG9ydEVycm9yYC4KKy8vLworLy8vIGBgYAorLy8vIHVzZSB0aHJpZnQ7CisvLy8gdXNlIHRocmlmdDo6e1RyYW5zcG9ydEVycm9yLCBUcmFuc3BvcnRFcnJvcktpbmR9OworLy8vCisvLy8gLy8gZXhwbGljaXQKKy8vLyBsZXQgZXJyMDogdGhyaWZ0OjpSZXN1bHQ8KCk+ID0gRXJyKAorLy8vICAgdGhyaWZ0OjpFcnJvcjo6VHJhbnNwb3J0KAorLy8vICAgICBUcmFuc3BvcnRFcnJvciB7CisvLy8gICAgICAga2luZDogVHJhbnNwb3J0RXJyb3JLaW5kOjpUaW1lZE91dCwKKy8vLyAgICAgICBtZXNzYWdlOiBmb3JtYXQhKCJjb25uZWN0aW9uIHRvIHNlcnZlciB0aW1lZCBvdXQiKQorLy8vICAgICB9CisvLy8gICApCisvLy8gKTsKKy8vLworLy8vIC8vIHVzZSBjb252ZXJzaW9uCisvLy8gbGV0IGVycjE6IHRocmlmdDo6UmVzdWx0PCgpPiA9IEVycigKKy8vLyAgIHRocmlmdDo6RXJyb3I6OmZyb20oCisvLy8gICAgIFRyYW5zcG9ydEVycm9yIHsKKy8vLyAgICAgICBraW5kOiBUcmFuc3BvcnRFcnJvcktpbmQ6OlRpbWVkT3V0LAorLy8vICAgICAgIG1lc3NhZ2U6IGZvcm1hdCEoImNvbm5lY3Rpb24gdG8gc2VydmVyIHRpbWVkIG91dCIpCisvLy8gICAgIH0KKy8vLyAgICkKKy8vLyApOworLy8vCisvLy8gLy8gdXNlIHN0cnVjdCBjb25zdHJ1Y3RvcgorLy8vIGxldCBlcnIyOiB0aHJpZnQ6OlJlc3VsdDwoKT4gPSBFcnIoCisvLy8gICB0aHJpZnQ6OkVycm9yOjpUcmFuc3BvcnQoCisvLy8gICAgIFRyYW5zcG9ydEVycm9yOjpuZXcoCisvLy8gICAgICAgVHJhbnNwb3J0RXJyb3JLaW5kOjpUaW1lZE91dCwKKy8vLyAgICAgICAiY29ubmVjdGlvbiB0byBzZXJ2ZXIgdGltZWQgb3V0IgorLy8vICAgICApCisvLy8gICApCisvLy8gKTsKKy8vLworLy8vCisvLy8gLy8gdXNlIGVycm9yIHZhcmlhbnQgY29uc3RydWN0b3IKKy8vLyBsZXQgZXJyMzogdGhyaWZ0OjpSZXN1bHQ8KCk+ID0gRXJyKAorLy8vICAgdGhyaWZ0OjpuZXdfdHJhbnNwb3J0X2Vycm9yKAorLy8vICAgICBUcmFuc3BvcnRFcnJvcktpbmQ6OlRpbWVkT3V0LAorLy8vICAgICAiY29ubmVjdGlvbiB0byBzZXJ2ZXIgdGltZWQgb3V0IgorLy8vICAgKQorLy8vICk7CisvLy8gYGBgCisvLy8KKy8vLyBDcmVhdGUgYW4gZXJyb3IgZnJvbSBhIHN0cmluZy4KKy8vLworLy8vIGBgYAorLy8vIHVzZSB0aHJpZnQ7CisvLy8gdXNlIHRocmlmdDo6e0FwcGxpY2F0aW9uRXJyb3IsIEFwcGxpY2F0aW9uRXJyb3JLaW5kfTsKKy8vLworLy8vIC8vIHdlIGp1c3QgdXNlIGBGcm9tOjpmcm9tYCB0byBjb252ZXJ0IGEgYFN0cmluZ2AgaW50byBhIGB0aHJpZnQ6OkVycm9yYAorLy8vIGxldCBlcnIwOiB0aHJpZnQ6OlJlc3VsdDwoKT4gPSBFcnIoCisvLy8gICB0aHJpZnQ6OkVycm9yOjpmcm9tKCJUaGlzIGlzIGFuIGVycm9yIikKKy8vLyApOworLy8vCisvLy8gLy8gZXJyMCBpcyBlcXVpdmFsZW50IHRvLi4uCisvLy8gbGV0IGVycjE6IHRocmlmdDo6UmVzdWx0PCgpPiA9IEVycigKKy8vLyAgIHRocmlmdDo6RXJyb3I6OkFwcGxpY2F0aW9uKAorLy8vICAgICBBcHBsaWNhdGlvbkVycm9yIHsKKy8vLyAgICAgICBraW5kOiBBcHBsaWNhdGlvbkVycm9yS2luZDo6VW5rbm93biwKKy8vLyAgICAgICBtZXNzYWdlOiBmb3JtYXQhKCJUaGlzIGlzIGFuIGVycm9yIikKKy8vLyAgICAgfQorLy8vICAgKQorLy8vICk7CisvLy8gYGBgCisvLy8KKy8vLyBSZXR1cm4gYW4gSURMLWRlZmluZWQgZXhjZXB0aW9uLgorLy8vCisvLy8gYGBgdGV4dAorLy8vIC8vIFRocmlmdCBJREwgZXhjZXB0aW9uIGRlZmluaXRpb24uCisvLy8gZXhjZXB0aW9uIFhjZXB0aW9uIHsKKy8vLyAgIDE6IGkzMiBlcnJvckNvZGUsCisvLy8gICAyOiBzdHJpbmcgbWVzc2FnZQorLy8vIH0KKy8vLyBgYGAKKy8vLworLy8vIGBgYAorLy8vIHVzZSBzdGQ6OmNvbnZlcnQ6OkZyb207CisvLy8gdXNlIHN0ZDo6ZXJyb3I6OkVycm9yOworLy8vIHVzZSBzdGQ6OmZtdDsKKy8vLyB1c2Ugc3RkOjpmbXQ6OntEaXNwbGF5LCBGb3JtYXR0ZXJ9OworLy8vCisvLy8gLy8gYXV0by1nZW5lcmF0ZWQgYnkgdGhlIFRocmlmdCBjb21waWxlcgorLy8vICNbZGVyaXZlKENsb25lLCBEZWJ1ZywgRXEsIE9yZCwgUGFydGlhbEVxLCBQYXJ0aWFsT3JkKV0KKy8vLyBwdWIgc3RydWN0IFhjZXB0aW9uIHsKKy8vLyAgIHB1YiBlcnJvcl9jb2RlOiBPcHRpb248aTMyPiwKKy8vLyAgIHB1YiBtZXNzYWdlOiBPcHRpb248U3RyaW5nPiwKKy8vLyB9CisvLy8KKy8vLyAvLyBhdXRvLWdlbmVyYXRlZCBieSB0aGUgVGhyaWZ0IGNvbXBpbGVyCisvLy8gaW1wbCBFcnJvciBmb3IgWGNlcHRpb24geworLy8vICAgZm4gZGVzY3JpcHRpb24oJnNlbGYpIC0+ICZzdHIgeworLy8vICAgICAicmVtb3RlIHNlcnZpY2UgdGhyZXcgWGNlcHRpb24iCisvLy8gICB9CisvLy8gfQorLy8vCisvLy8gLy8gYXV0by1nZW5lcmF0ZWQgYnkgdGhlIFRocmlmdCBjb21waWxlcgorLy8vIGltcGwgRnJvbTxYY2VwdGlvbj4gZm9yIHRocmlmdDo6RXJyb3IgeworLy8vICAgZm4gZnJvbShlOiBYY2VwdGlvbikgLT4gU2VsZiB7CisvLy8gICAgIHRocmlmdDo6RXJyb3I6OlVzZXIoQm94OjpuZXcoZSkpCisvLy8gICB9CisvLy8gfQorLy8vCisvLy8gLy8gYXV0by1nZW5lcmF0ZWQgYnkgdGhlIFRocmlmdCBjb21waWxlcgorLy8vIGltcGwgRGlzcGxheSBmb3IgWGNlcHRpb24geworLy8vICAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IEZvcm1hdHRlcikgLT4gZm10OjpSZXN1bHQgeworLy8vICAgICBzZWxmLmRlc2NyaXB0aW9uKCkuZm10KGYpCisvLy8gICB9CisvLy8gfQorLy8vCisvLy8gLy8gaW4gdXNlciBjb2RlLi4uCisvLy8gbGV0IGVycjogdGhyaWZ0OjpSZXN1bHQ8KCk+ID0gRXJyKAorLy8vICAgdGhyaWZ0OjpFcnJvcjo6ZnJvbShYY2VwdGlvbiB7IGVycm9yX2NvZGU6IFNvbWUoMSksIG1lc3NhZ2U6IE5vbmUgfSkKKy8vLyApOworLy8vIGBgYAorcHViIGVudW0gRXJyb3IgeworICAgIC8vLyBFcnJvcnMgZW5jb3VudGVyZWQgd2hpbGUgb3BlcmF0aW5nIG9uIEkvTyBjaGFubmVscy4KKyAgICAvLy8KKyAgICAvLy8gVGhlc2UgaW5jbHVkZSAqY29ubmVjdGlvbiBjbG9zZWQqIGFuZCAqYmluZCBmYWlsdXJlKi4KKyAgICBUcmFuc3BvcnQoVHJhbnNwb3J0RXJyb3IpLAorICAgIC8vLyBFcnJvcnMgZW5jb3VudGVyZWQgZHVyaW5nIHJ1bnRpbWUtbGlicmFyeSBwcm9jZXNzaW5nLgorICAgIC8vLworICAgIC8vLyBUaGVzZSBpbmNsdWRlICptZXNzYWdlIHRvbyBsYXJnZSogYW5kICp1bnN1cHBvcnRlZCBwcm90b2NvbCB2ZXJzaW9uKi4KKyAgICBQcm90b2NvbChQcm90b2NvbEVycm9yKSwKKyAgICAvLy8gRXJyb3JzIGVuY291bnRlcmVkIHdpdGhpbiBhdXRvLWdlbmVyYXRlZCBjb2RlLCBvciB3aGVuIGluY29taW5nCisgICAgLy8vIG9yIG91dGdvaW5nIG1lc3NhZ2VzIHZpb2xhdGUgdGhlIFRocmlmdCBzcGVjLgorICAgIC8vLworICAgIC8vLyBUaGVzZSBpbmNsdWRlICpvdXQtb2Ytb3JkZXIgbWVzc2FnZXMqIGFuZCAqbWlzc2luZyByZXF1aXJlZCBzdHJ1Y3QKKyAgICAvLy8gZmllbGRzKi4KKyAgICAvLy8KKyAgICAvLy8gVGhpcyB2YXJpYW50IGFsc28gZnVuY3Rpb25zIGFzIGEgY2F0Y2gtYWxsOiBlcnJvcnMgZnJvbSBoYW5kbGVyCisgICAgLy8vIGZ1bmN0aW9ucyBhcmUgYXV0b21hdGljYWxseSByZXR1cm5lZCBhcyBhbiBgQXBwbGljYXRpb25FcnJvcmAuCisgICAgQXBwbGljYXRpb24oQXBwbGljYXRpb25FcnJvciksCisgICAgLy8vIElETC1kZWZpbmVkIGV4Y2VwdGlvbiBzdHJ1Y3RzLgorICAgIFVzZXIoQm94PGVycm9yOjpFcnJvciArIFN5bmMgKyBTZW5kPiksCit9CisKK2ltcGwgRXJyb3IgeworICAgIC8vLyBDcmVhdGUgYW4gYEFwcGxpY2F0aW9uRXJyb3JgIGZyb20gaXRzIHdpcmUgcmVwcmVzZW50YXRpb24uCisgICAgLy8vCisgICAgLy8vIEFwcGxpY2F0aW9uIGNvZGUgKipzaG91bGQgbmV2ZXIqKiBjYWxsIHRoaXMgbWV0aG9kIGRpcmVjdGx5LgorICAgIHB1YiBmbiByZWFkX2FwcGxpY2F0aW9uX2Vycm9yX2Zyb21faW5fcHJvdG9jb2woCisgICAgICAgIGk6ICZtdXQgVElucHV0UHJvdG9jb2wsCisgICAgKSAtPiA6OlJlc3VsdDxBcHBsaWNhdGlvbkVycm9yPiB7CisgICAgICAgIGxldCBtdXQgbWVzc2FnZSA9ICJnZW5lcmFsIHJlbW90ZSBlcnJvciIudG9fb3duZWQoKTsKKyAgICAgICAgbGV0IG11dCBraW5kID0gQXBwbGljYXRpb25FcnJvcktpbmQ6OlVua25vd247CisKKyAgICAgICAgaS5yZWFkX3N0cnVjdF9iZWdpbigpPzsKKworICAgICAgICBsb29wIHsKKyAgICAgICAgICAgIGxldCBmaWVsZF9pZGVudCA9IGkucmVhZF9maWVsZF9iZWdpbigpPzsKKworICAgICAgICAgICAgaWYgZmllbGRfaWRlbnQuZmllbGRfdHlwZSA9PSBUVHlwZTo6U3RvcCB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGxldCBpZCA9IGZpZWxkX2lkZW50CisgICAgICAgICAgICAgICAgLmlkCisgICAgICAgICAgICAgICAgLmV4cGVjdCgic2VuZGVyIHNob3VsZCBhbHdheXMgc3BlY2lmeSBpZCBmb3Igbm9uLVNUT1AgZmllbGQiKTsKKworICAgICAgICAgICAgbWF0Y2ggaWQgeworICAgICAgICAgICAgICAgIDEgPT4geworICAgICAgICAgICAgICAgICAgICBsZXQgcmVtb3RlX21lc3NhZ2UgPSBpLnJlYWRfc3RyaW5nKCk/OworICAgICAgICAgICAgICAgICAgICBpLnJlYWRfZmllbGRfZW5kKCk/OworICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gcmVtb3RlX21lc3NhZ2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIDIgPT4geworICAgICAgICAgICAgICAgICAgICBsZXQgcmVtb3RlX3R5cGVfYXNfaW50ID0gaS5yZWFkX2kzMigpPzsKKyAgICAgICAgICAgICAgICAgICAgbGV0IHJlbW90ZV9raW5kOiBBcHBsaWNhdGlvbkVycm9yS2luZCA9IFRyeUZyb206OnRyeV9mcm9tKHJlbW90ZV90eXBlX2FzX2ludCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC51bndyYXBfb3IoQXBwbGljYXRpb25FcnJvcktpbmQ6OlVua25vd24pOworICAgICAgICAgICAgICAgICAgICBpLnJlYWRfZmllbGRfZW5kKCk/OworICAgICAgICAgICAgICAgICAgICBraW5kID0gcmVtb3RlX2tpbmQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIF8gPT4geworICAgICAgICAgICAgICAgICAgICBpLnNraXAoZmllbGRfaWRlbnQuZmllbGRfdHlwZSk/OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGkucmVhZF9zdHJ1Y3RfZW5kKCk/OworCisgICAgICAgIE9rKEFwcGxpY2F0aW9uRXJyb3IgeworICAgICAgICAgICAga2luZDoga2luZCwKKyAgICAgICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UsCisgICAgICAgIH0pCisgICAgfQorCisgICAgLy8vIENvbnZlcnQgYW4gYEFwcGxpY2F0aW9uRXJyb3JgIGludG8gaXRzIHdpcmUgcmVwcmVzZW50YXRpb24gYW5kIHdyaXRlCisgICAgLy8vIGl0IHRvIHRoZSByZW1vdGUuCisgICAgLy8vCisgICAgLy8vIEFwcGxpY2F0aW9uIGNvZGUgKipzaG91bGQgbmV2ZXIqKiBjYWxsIHRoaXMgbWV0aG9kIGRpcmVjdGx5LgorICAgIHB1YiBmbiB3cml0ZV9hcHBsaWNhdGlvbl9lcnJvcl90b19vdXRfcHJvdG9jb2woCisgICAgICAgIGU6ICZBcHBsaWNhdGlvbkVycm9yLAorICAgICAgICBvOiAmbXV0IFRPdXRwdXRQcm90b2NvbCwKKyAgICApIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIG8ud3JpdGVfc3RydWN0X2JlZ2luKCZUU3RydWN0SWRlbnRpZmllciB7CisgICAgICAgICAgICBuYW1lOiAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uIi50b19vd25lZCgpLAorICAgICAgICB9KT87CisKKyAgICAgICAgbGV0IG1lc3NhZ2VfZmllbGQgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoIm1lc3NhZ2UiLCBUVHlwZTo6U3RyaW5nLCAxKTsKKyAgICAgICAgbGV0IHR5cGVfZmllbGQgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoInR5cGUiLCBUVHlwZTo6STMyLCAyKTsKKworICAgICAgICBvLndyaXRlX2ZpZWxkX2JlZ2luKCZtZXNzYWdlX2ZpZWxkKT87CisgICAgICAgIG8ud3JpdGVfc3RyaW5nKCZlLm1lc3NhZ2UpPzsKKyAgICAgICAgby53cml0ZV9maWVsZF9lbmQoKT87CisKKyAgICAgICAgby53cml0ZV9maWVsZF9iZWdpbigmdHlwZV9maWVsZCk/OworICAgICAgICBvLndyaXRlX2kzMihlLmtpbmQgYXMgaTMyKT87CisgICAgICAgIG8ud3JpdGVfZmllbGRfZW5kKCk/OworCisgICAgICAgIG8ud3JpdGVfZmllbGRfc3RvcCgpPzsKKyAgICAgICAgby53cml0ZV9zdHJ1Y3RfZW5kKCk/OworCisgICAgICAgIG8uZmx1c2goKQorICAgIH0KK30KKworaW1wbCBlcnJvcjo6RXJyb3IgZm9yIEVycm9yIHsKKyAgICBmbiBkZXNjcmlwdGlvbigmc2VsZikgLT4gJnN0ciB7CisgICAgICAgIG1hdGNoICpzZWxmIHsKKyAgICAgICAgICAgIEVycm9yOjpUcmFuc3BvcnQocmVmIGUpID0+IFRyYW5zcG9ydEVycm9yOjpkZXNjcmlwdGlvbihlKSwKKyAgICAgICAgICAgIEVycm9yOjpQcm90b2NvbChyZWYgZSkgPT4gUHJvdG9jb2xFcnJvcjo6ZGVzY3JpcHRpb24oZSksCisgICAgICAgICAgICBFcnJvcjo6QXBwbGljYXRpb24ocmVmIGUpID0+IEFwcGxpY2F0aW9uRXJyb3I6OmRlc2NyaXB0aW9uKGUpLAorICAgICAgICAgICAgRXJyb3I6OlVzZXIocmVmIGUpID0+IGUuZGVzY3JpcHRpb24oKSwKKyAgICAgICAgfQorICAgIH0KK30KKworaW1wbCBEZWJ1ZyBmb3IgRXJyb3IgeworICAgIGZuIGZtdCgmc2VsZiwgZjogJm11dCBGb3JtYXR0ZXIpIC0+IGZtdDo6UmVzdWx0IHsKKyAgICAgICAgbWF0Y2ggKnNlbGYgeworICAgICAgICAgICAgRXJyb3I6OlRyYW5zcG9ydChyZWYgZSkgPT4gRGVidWc6OmZtdChlLCBmKSwKKyAgICAgICAgICAgIEVycm9yOjpQcm90b2NvbChyZWYgZSkgPT4gRGVidWc6OmZtdChlLCBmKSwKKyAgICAgICAgICAgIEVycm9yOjpBcHBsaWNhdGlvbihyZWYgZSkgPT4gRGVidWc6OmZtdChlLCBmKSwKKyAgICAgICAgICAgIEVycm9yOjpVc2VyKHJlZiBlKSA9PiBEZWJ1Zzo6Zm10KGUsIGYpLAorICAgICAgICB9CisgICAgfQorfQorCitpbXBsIERpc3BsYXkgZm9yIEVycm9yIHsKKyAgICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgRm9ybWF0dGVyKSAtPiBmbXQ6OlJlc3VsdCB7CisgICAgICAgIG1hdGNoICpzZWxmIHsKKyAgICAgICAgICAgIEVycm9yOjpUcmFuc3BvcnQocmVmIGUpID0+IERpc3BsYXk6OmZtdChlLCBmKSwKKyAgICAgICAgICAgIEVycm9yOjpQcm90b2NvbChyZWYgZSkgPT4gRGlzcGxheTo6Zm10KGUsIGYpLAorICAgICAgICAgICAgRXJyb3I6OkFwcGxpY2F0aW9uKHJlZiBlKSA9PiBEaXNwbGF5OjpmbXQoZSwgZiksCisgICAgICAgICAgICBFcnJvcjo6VXNlcihyZWYgZSkgPT4gRGlzcGxheTo6Zm10KGUsIGYpLAorICAgICAgICB9CisgICAgfQorfQorCitpbXBsIEZyb208U3RyaW5nPiBmb3IgRXJyb3IgeworICAgIGZuIGZyb20oczogU3RyaW5nKSAtPiBTZWxmIHsKKyAgICAgICAgRXJyb3I6OkFwcGxpY2F0aW9uKEFwcGxpY2F0aW9uRXJyb3IgeworICAgICAgICAgICAga2luZDogQXBwbGljYXRpb25FcnJvcktpbmQ6OlVua25vd24sCisgICAgICAgICAgICBtZXNzYWdlOiBzLAorICAgICAgICB9KQorICAgIH0KK30KKworaW1wbDwnYT4gRnJvbTwmJ2Egc3RyPiBmb3IgRXJyb3IgeworICAgIGZuIGZyb20oczogJidhIHN0cikgLT4gU2VsZiB7CisgICAgICAgIEVycm9yOjpBcHBsaWNhdGlvbihBcHBsaWNhdGlvbkVycm9yIHsKKyAgICAgICAgICAgIGtpbmQ6IEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpVbmtub3duLAorICAgICAgICAgICAgbWVzc2FnZTogU3RyaW5nOjpmcm9tKHMpLAorICAgICAgICB9KQorICAgIH0KK30KKworaW1wbCBGcm9tPFRyYW5zcG9ydEVycm9yPiBmb3IgRXJyb3IgeworICAgIGZuIGZyb20oZTogVHJhbnNwb3J0RXJyb3IpIC0+IFNlbGYgeworICAgICAgICBFcnJvcjo6VHJhbnNwb3J0KGUpCisgICAgfQorfQorCitpbXBsIEZyb208UHJvdG9jb2xFcnJvcj4gZm9yIEVycm9yIHsKKyAgICBmbiBmcm9tKGU6IFByb3RvY29sRXJyb3IpIC0+IFNlbGYgeworICAgICAgICBFcnJvcjo6UHJvdG9jb2woZSkKKyAgICB9Cit9CisKK2ltcGwgRnJvbTxBcHBsaWNhdGlvbkVycm9yPiBmb3IgRXJyb3IgeworICAgIGZuIGZyb20oZTogQXBwbGljYXRpb25FcnJvcikgLT4gU2VsZiB7CisgICAgICAgIEVycm9yOjpBcHBsaWNhdGlvbihlKQorICAgIH0KK30KKworLy8vIENyZWF0ZSBhIG5ldyBgRXJyb3JgIGluc3RhbmNlIG9mIHR5cGUgYFRyYW5zcG9ydGAgdGhhdCB3cmFwcyBhCisvLy8gYFRyYW5zcG9ydEVycm9yYC4KK3B1YiBmbiBuZXdfdHJhbnNwb3J0X2Vycm9yPFM6IEludG88U3RyaW5nPj4oa2luZDogVHJhbnNwb3J0RXJyb3JLaW5kLCBtZXNzYWdlOiBTKSAtPiBFcnJvciB7CisgICAgRXJyb3I6OlRyYW5zcG9ydChUcmFuc3BvcnRFcnJvcjo6bmV3KGtpbmQsIG1lc3NhZ2UpKQorfQorCisvLy8gSW5mb3JtYXRpb24gYWJvdXQgSS9PIGVycm9ycy4KKyNbZGVyaXZlKERlYnVnLCBFcSwgUGFydGlhbEVxKV0KK3B1YiBzdHJ1Y3QgVHJhbnNwb3J0RXJyb3IgeworICAgIC8vLyBJL08gZXJyb3IgdmFyaWFudC4KKyAgICAvLy8KKyAgICAvLy8gSWYgYSBzcGVjaWZpYyBgVHJhbnNwb3J0RXJyb3JLaW5kYCBkb2VzIG5vdCBhcHBseSB1c2UKKyAgICAvLy8gYFRyYW5zcG9ydEVycm9yS2luZDo6VW5rbm93bmAuCisgICAgcHViIGtpbmQ6IFRyYW5zcG9ydEVycm9yS2luZCwKKyAgICAvLy8gSHVtYW4tcmVhZGFibGUgZXJyb3IgbWVzc2FnZS4KKyAgICBwdWIgbWVzc2FnZTogU3RyaW5nLAorfQorCitpbXBsIFRyYW5zcG9ydEVycm9yIHsKKyAgICAvLy8gQ3JlYXRlIGEgbmV3IGBUcmFuc3BvcnRFcnJvcmAuCisgICAgcHViIGZuIG5ldzxTOiBJbnRvPFN0cmluZz4+KGtpbmQ6IFRyYW5zcG9ydEVycm9yS2luZCwgbWVzc2FnZTogUykgLT4gVHJhbnNwb3J0RXJyb3IgeworICAgICAgICBUcmFuc3BvcnRFcnJvciB7CisgICAgICAgICAgICBraW5kOiBraW5kLAorICAgICAgICAgICAgbWVzc2FnZTogbWVzc2FnZS5pbnRvKCksCisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vLyBJL08gZXJyb3IgY2F0ZWdvcmllcy4KKy8vLworLy8vIFRoaXMgbGlzdCBtYXkgZ3JvdywgYW5kIGl0IGlzIG5vdCByZWNvbW1lbmRlZCB0byBtYXRjaCBhZ2FpbnN0IGl0LgorI1tkZXJpdmUoQ2xvbmUsIENvcHksIEVxLCBEZWJ1ZywgUGFydGlhbEVxKV0KK3B1YiBlbnVtIFRyYW5zcG9ydEVycm9yS2luZCB7CisgICAgLy8vIENhdGNoLWFsbCBJL08gZXJyb3IuCisgICAgVW5rbm93biA9IDAsCisgICAgLy8vIEFuIEkvTyBvcGVyYXRpb24gd2FzIGF0dGVtcHRlZCB3aGVuIHRoZSB0cmFuc3BvcnQgY2hhbm5lbCB3YXMgbm90IG9wZW4uCisgICAgTm90T3BlbiA9IDEsCisgICAgLy8vIFRoZSB0cmFuc3BvcnQgY2hhbm5lbCBjYW5ub3QgYmUgb3BlbmVkIGJlY2F1c2UgaXQgd2FzIG9wZW5lZCBwcmV2aW91c2x5LgorICAgIEFscmVhZHlPcGVuID0gMiwKKyAgICAvLy8gQW4gSS9PIG9wZXJhdGlvbiB0aW1lZCBvdXQuCisgICAgVGltZWRPdXQgPSAzLAorICAgIC8vLyBBIHJlYWQgY291bGQgbm90IGNvbXBsZXRlIGJlY2F1c2Ugbm8gYnl0ZXMgd2VyZSBhdmFpbGFibGUuCisgICAgRW5kT2ZGaWxlID0gNCwKKyAgICAvLy8gQW4gaW52YWxpZCAoYnVmZmVyL21lc3NhZ2UpIHNpemUgd2FzIHJlcXVlc3RlZCBvciByZWNlaXZlZC4KKyAgICBOZWdhdGl2ZVNpemUgPSA1LAorICAgIC8vLyBUb28gbGFyZ2UgYSBidWZmZXIgb3IgbWVzc2FnZSBzaXplIHdhcyByZXF1ZXN0ZWQgb3IgcmVjZWl2ZWQuCisgICAgU2l6ZUxpbWl0ID0gNiwKK30KKworaW1wbCBUcmFuc3BvcnRFcnJvciB7CisgICAgZm4gZGVzY3JpcHRpb24oJnNlbGYpIC0+ICZzdHIgeworICAgICAgICBtYXRjaCBzZWxmLmtpbmQgeworICAgICAgICAgICAgVHJhbnNwb3J0RXJyb3JLaW5kOjpVbmtub3duID0+ICJ0cmFuc3BvcnQgZXJyb3IiLAorICAgICAgICAgICAgVHJhbnNwb3J0RXJyb3JLaW5kOjpOb3RPcGVuID0+ICJub3Qgb3BlbiIsCisgICAgICAgICAgICBUcmFuc3BvcnRFcnJvcktpbmQ6OkFscmVhZHlPcGVuID0+ICJhbHJlYWR5IG9wZW4iLAorICAgICAgICAgICAgVHJhbnNwb3J0RXJyb3JLaW5kOjpUaW1lZE91dCA9PiAidGltZWQgb3V0IiwKKyAgICAgICAgICAgIFRyYW5zcG9ydEVycm9yS2luZDo6RW5kT2ZGaWxlID0+ICJlbmQgb2YgZmlsZSIsCisgICAgICAgICAgICBUcmFuc3BvcnRFcnJvcktpbmQ6Ok5lZ2F0aXZlU2l6ZSA9PiAibmVnYXRpdmUgc2l6ZSBtZXNzYWdlIiwKKyAgICAgICAgICAgIFRyYW5zcG9ydEVycm9yS2luZDo6U2l6ZUxpbWl0ID0+ICJtZXNzYWdlIHRvbyBsb25nIiwKKyAgICAgICAgfQorICAgIH0KK30KKworaW1wbCBEaXNwbGF5IGZvciBUcmFuc3BvcnRFcnJvciB7CisgICAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IEZvcm1hdHRlcikgLT4gZm10OjpSZXN1bHQgeworICAgICAgICB3cml0ZSEoZiwgInt9Iiwgc2VsZi5kZXNjcmlwdGlvbigpKQorICAgIH0KK30KKworaW1wbCBUcnlGcm9tPGkzMj4gZm9yIFRyYW5zcG9ydEVycm9yS2luZCB7CisgICAgdHlwZSBFcnIgPSBFcnJvcjsKKyAgICBmbiB0cnlfZnJvbShmcm9tOiBpMzIpIC0+IFJlc3VsdDxTZWxmLCBTZWxmOjpFcnI+IHsKKyAgICAgICAgbWF0Y2ggZnJvbSB7CisgICAgICAgICAgICAwID0+IE9rKFRyYW5zcG9ydEVycm9yS2luZDo6VW5rbm93biksCisgICAgICAgICAgICAxID0+IE9rKFRyYW5zcG9ydEVycm9yS2luZDo6Tm90T3BlbiksCisgICAgICAgICAgICAyID0+IE9rKFRyYW5zcG9ydEVycm9yS2luZDo6QWxyZWFkeU9wZW4pLAorICAgICAgICAgICAgMyA9PiBPayhUcmFuc3BvcnRFcnJvcktpbmQ6OlRpbWVkT3V0KSwKKyAgICAgICAgICAgIDQgPT4gT2soVHJhbnNwb3J0RXJyb3JLaW5kOjpFbmRPZkZpbGUpLAorICAgICAgICAgICAgNSA9PiBPayhUcmFuc3BvcnRFcnJvcktpbmQ6Ok5lZ2F0aXZlU2l6ZSksCisgICAgICAgICAgICA2ID0+IE9rKFRyYW5zcG9ydEVycm9yS2luZDo6U2l6ZUxpbWl0KSwKKyAgICAgICAgICAgIF8gPT4gRXJyKEVycm9yOjpQcm90b2NvbChQcm90b2NvbEVycm9yIHsKKyAgICAgICAgICAgICAgICBraW5kOiBQcm90b2NvbEVycm9yS2luZDo6VW5rbm93biwKKyAgICAgICAgICAgICAgICBtZXNzYWdlOiBmb3JtYXQhKCJjYW5ub3QgY29udmVydCB7fSB0byBUcmFuc3BvcnRFcnJvcktpbmQiLCBmcm9tKSwKKyAgICAgICAgICAgIH0pKSwKKyAgICAgICAgfQorICAgIH0KK30KKworaW1wbCBGcm9tPGlvOjpFcnJvcj4gZm9yIEVycm9yIHsKKyAgICBmbiBmcm9tKGVycjogaW86OkVycm9yKSAtPiBTZWxmIHsKKyAgICAgICAgbWF0Y2ggZXJyLmtpbmQoKSB7CisgICAgICAgICAgICBpbzo6RXJyb3JLaW5kOjpDb25uZWN0aW9uUmVzZXQKKyAgICAgICAgICAgIHwgaW86OkVycm9yS2luZDo6Q29ubmVjdGlvblJlZnVzZWQKKyAgICAgICAgICAgIHwgaW86OkVycm9yS2luZDo6Tm90Q29ubmVjdGVkID0+IEVycm9yOjpUcmFuc3BvcnQoVHJhbnNwb3J0RXJyb3IgeworICAgICAgICAgICAgICAgIGtpbmQ6IFRyYW5zcG9ydEVycm9yS2luZDo6Tm90T3BlbiwKKyAgICAgICAgICAgICAgICBtZXNzYWdlOiBlcnIuZGVzY3JpcHRpb24oKS50b19vd25lZCgpLAorICAgICAgICAgICAgfSksCisgICAgICAgICAgICBpbzo6RXJyb3JLaW5kOjpBbHJlYWR5RXhpc3RzID0+IEVycm9yOjpUcmFuc3BvcnQoVHJhbnNwb3J0RXJyb3IgeworICAgICAgICAgICAgICAgIGtpbmQ6IFRyYW5zcG9ydEVycm9yS2luZDo6QWxyZWFkeU9wZW4sCisgICAgICAgICAgICAgICAgbWVzc2FnZTogZXJyLmRlc2NyaXB0aW9uKCkudG9fb3duZWQoKSwKKyAgICAgICAgICAgIH0pLAorICAgICAgICAgICAgaW86OkVycm9yS2luZDo6VGltZWRPdXQgPT4gRXJyb3I6OlRyYW5zcG9ydChUcmFuc3BvcnRFcnJvciB7CisgICAgICAgICAgICAgICAga2luZDogVHJhbnNwb3J0RXJyb3JLaW5kOjpUaW1lZE91dCwKKyAgICAgICAgICAgICAgICBtZXNzYWdlOiBlcnIuZGVzY3JpcHRpb24oKS50b19vd25lZCgpLAorICAgICAgICAgICAgfSksCisgICAgICAgICAgICBpbzo6RXJyb3JLaW5kOjpVbmV4cGVjdGVkRW9mID0+IEVycm9yOjpUcmFuc3BvcnQoVHJhbnNwb3J0RXJyb3IgeworICAgICAgICAgICAgICAgIGtpbmQ6IFRyYW5zcG9ydEVycm9yS2luZDo6RW5kT2ZGaWxlLAorICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGVyci5kZXNjcmlwdGlvbigpLnRvX293bmVkKCksCisgICAgICAgICAgICB9KSwKKyAgICAgICAgICAgIF8gPT4geworICAgICAgICAgICAgICAgIEVycm9yOjpUcmFuc3BvcnQoVHJhbnNwb3J0RXJyb3IgeworICAgICAgICAgICAgICAgICAgICBraW5kOiBUcmFuc3BvcnRFcnJvcktpbmQ6OlVua25vd24sCisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGVyci5kZXNjcmlwdGlvbigpLnRvX293bmVkKCksIC8vIEZJWE1FOiB1c2UgaW8gZXJyb3IncyBkZWJ1ZyBzdHJpbmcKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitpbXBsIEZyb208c3RyaW5nOjpGcm9tVXRmOEVycm9yPiBmb3IgRXJyb3IgeworICAgIGZuIGZyb20oZXJyOiBzdHJpbmc6OkZyb21VdGY4RXJyb3IpIC0+IFNlbGYgeworICAgICAgICBFcnJvcjo6UHJvdG9jb2woUHJvdG9jb2xFcnJvciB7CisgICAgICAgICAgICBraW5kOiBQcm90b2NvbEVycm9yS2luZDo6SW52YWxpZERhdGEsCisgICAgICAgICAgICBtZXNzYWdlOiBlcnIuZGVzY3JpcHRpb24oKS50b19vd25lZCgpLCAvLyBGSVhNRTogdXNlIGZtdDo6RXJyb3IncyBkZWJ1ZyBzdHJpbmcKKyAgICAgICAgfSkKKyAgICB9Cit9CisKKy8vLyBDcmVhdGUgYSBuZXcgYEVycm9yYCBpbnN0YW5jZSBvZiB0eXBlIGBQcm90b2NvbGAgdGhhdCB3cmFwcyBhCisvLy8gYFByb3RvY29sRXJyb3JgLgorcHViIGZuIG5ld19wcm90b2NvbF9lcnJvcjxTOiBJbnRvPFN0cmluZz4+KGtpbmQ6IFByb3RvY29sRXJyb3JLaW5kLCBtZXNzYWdlOiBTKSAtPiBFcnJvciB7CisgICAgRXJyb3I6OlByb3RvY29sKFByb3RvY29sRXJyb3I6Om5ldyhraW5kLCBtZXNzYWdlKSkKK30KKworLy8vIEluZm9ybWF0aW9uIGFib3V0IGVycm9ycyB0aGF0IG9jY3VyIGluIHRoZSBydW50aW1lIGxpYnJhcnkuCisjW2Rlcml2ZShEZWJ1ZywgRXEsIFBhcnRpYWxFcSldCitwdWIgc3RydWN0IFByb3RvY29sRXJyb3IgeworICAgIC8vLyBQcm90b2NvbCBlcnJvciB2YXJpYW50LgorICAgIC8vLworICAgIC8vLyBJZiBhIHNwZWNpZmljIGBQcm90b2NvbEVycm9yS2luZGAgZG9lcyBub3QgYXBwbHkgdXNlCisgICAgLy8vIGBQcm90b2NvbEVycm9yS2luZDo6VW5rbm93bmAuCisgICAgcHViIGtpbmQ6IFByb3RvY29sRXJyb3JLaW5kLAorICAgIC8vLyBIdW1hbi1yZWFkYWJsZSBlcnJvciBtZXNzYWdlLgorICAgIHB1YiBtZXNzYWdlOiBTdHJpbmcsCit9CisKK2ltcGwgUHJvdG9jb2xFcnJvciB7CisgICAgLy8vIENyZWF0ZSBhIG5ldyBgUHJvdG9jb2xFcnJvcmAuCisgICAgcHViIGZuIG5ldzxTOiBJbnRvPFN0cmluZz4+KGtpbmQ6IFByb3RvY29sRXJyb3JLaW5kLCBtZXNzYWdlOiBTKSAtPiBQcm90b2NvbEVycm9yIHsKKyAgICAgICAgUHJvdG9jb2xFcnJvciB7CisgICAgICAgICAgICBraW5kOiBraW5kLAorICAgICAgICAgICAgbWVzc2FnZTogbWVzc2FnZS5pbnRvKCksCisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vLyBSdW50aW1lIGxpYnJhcnkgZXJyb3IgY2F0ZWdvcmllcy4KKy8vLworLy8vIFRoaXMgbGlzdCBtYXkgZ3JvdywgYW5kIGl0IGlzIG5vdCByZWNvbW1lbmRlZCB0byBtYXRjaCBhZ2FpbnN0IGl0LgorI1tkZXJpdmUoQ2xvbmUsIENvcHksIEVxLCBEZWJ1ZywgUGFydGlhbEVxKV0KK3B1YiBlbnVtIFByb3RvY29sRXJyb3JLaW5kIHsKKyAgICAvLy8gQ2F0Y2gtYWxsIHJ1bnRpbWUtbGlicmFyeSBlcnJvci4KKyAgICBVbmtub3duID0gMCwKKyAgICAvLy8gQW4gaW52YWxpZCBhcmd1bWVudCB3YXMgc3VwcGxpZWQgdG8gYSBsaWJyYXJ5IGZ1bmN0aW9uLCBvciBpbnZhbGlkIGRhdGEKKyAgICAvLy8gd2FzIHJlY2VpdmVkIGZyb20gYSBUaHJpZnQgZW5kcG9pbnQuCisgICAgSW52YWxpZERhdGEgPSAxLAorICAgIC8vLyBBbiBpbnZhbGlkIHNpemUgd2FzIHJlY2VpdmVkIGluIGFuIGVuY29kZWQgZmllbGQuCisgICAgTmVnYXRpdmVTaXplID0gMiwKKyAgICAvLy8gVGhyaWZ0IG1lc3NhZ2Ugb3IgZmllbGQgd2FzIHRvbyBsb25nLgorICAgIFNpemVMaW1pdCA9IDMsCisgICAgLy8vIFVuc3VwcG9ydGVkIG9yIHVua25vd24gVGhyaWZ0IHByb3RvY29sIHZlcnNpb24uCisgICAgQmFkVmVyc2lvbiA9IDQsCisgICAgLy8vIFVuc3VwcG9ydGVkIFRocmlmdCBwcm90b2NvbCwgc2VydmVyIG9yIGZpZWxkIHR5cGUuCisgICAgTm90SW1wbGVtZW50ZWQgPSA1LAorICAgIC8vLyBSZWFjaGVkIHRoZSBtYXhpbXVtIG5lc3RlZCBkZXB0aCB0byB3aGljaCBhbiBlbmNvZGVkIFRocmlmdCBmaWVsZCBjb3VsZAorICAgIC8vLyBiZSBza2lwcGVkLgorICAgIERlcHRoTGltaXQgPSA2LAorfQorCitpbXBsIFByb3RvY29sRXJyb3IgeworICAgIGZuIGRlc2NyaXB0aW9uKCZzZWxmKSAtPiAmc3RyIHsKKyAgICAgICAgbWF0Y2ggc2VsZi5raW5kIHsKKyAgICAgICAgICAgIFByb3RvY29sRXJyb3JLaW5kOjpVbmtub3duID0+ICJwcm90b2NvbCBlcnJvciIsCisgICAgICAgICAgICBQcm90b2NvbEVycm9yS2luZDo6SW52YWxpZERhdGEgPT4gImJhZCBkYXRhIiwKKyAgICAgICAgICAgIFByb3RvY29sRXJyb3JLaW5kOjpOZWdhdGl2ZVNpemUgPT4gIm5lZ2F0aXZlIG1lc3NhZ2Ugc2l6ZSIsCisgICAgICAgICAgICBQcm90b2NvbEVycm9yS2luZDo6U2l6ZUxpbWl0ID0+ICJtZXNzYWdlIHRvbyBsb25nIiwKKyAgICAgICAgICAgIFByb3RvY29sRXJyb3JLaW5kOjpCYWRWZXJzaW9uID0+ICJpbnZhbGlkIHRocmlmdCB2ZXJzaW9uIiwKKyAgICAgICAgICAgIFByb3RvY29sRXJyb3JLaW5kOjpOb3RJbXBsZW1lbnRlZCA9PiAibm90IGltcGxlbWVudGVkIiwKKyAgICAgICAgICAgIFByb3RvY29sRXJyb3JLaW5kOjpEZXB0aExpbWl0ID0+ICJtYXhpbXVtIHNraXAgZGVwdGggcmVhY2hlZCIsCisgICAgICAgIH0KKyAgICB9Cit9CisKK2ltcGwgRGlzcGxheSBmb3IgUHJvdG9jb2xFcnJvciB7CisgICAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IEZvcm1hdHRlcikgLT4gZm10OjpSZXN1bHQgeworICAgICAgICB3cml0ZSEoZiwgInt9Iiwgc2VsZi5kZXNjcmlwdGlvbigpKQorICAgIH0KK30KKworaW1wbCBUcnlGcm9tPGkzMj4gZm9yIFByb3RvY29sRXJyb3JLaW5kIHsKKyAgICB0eXBlIEVyciA9IEVycm9yOworICAgIGZuIHRyeV9mcm9tKGZyb206IGkzMikgLT4gUmVzdWx0PFNlbGYsIFNlbGY6OkVycj4geworICAgICAgICBtYXRjaCBmcm9tIHsKKyAgICAgICAgICAgIDAgPT4gT2soUHJvdG9jb2xFcnJvcktpbmQ6OlVua25vd24pLAorICAgICAgICAgICAgMSA9PiBPayhQcm90b2NvbEVycm9yS2luZDo6SW52YWxpZERhdGEpLAorICAgICAgICAgICAgMiA9PiBPayhQcm90b2NvbEVycm9yS2luZDo6TmVnYXRpdmVTaXplKSwKKyAgICAgICAgICAgIDMgPT4gT2soUHJvdG9jb2xFcnJvcktpbmQ6OlNpemVMaW1pdCksCisgICAgICAgICAgICA0ID0+IE9rKFByb3RvY29sRXJyb3JLaW5kOjpCYWRWZXJzaW9uKSwKKyAgICAgICAgICAgIDUgPT4gT2soUHJvdG9jb2xFcnJvcktpbmQ6Ok5vdEltcGxlbWVudGVkKSwKKyAgICAgICAgICAgIDYgPT4gT2soUHJvdG9jb2xFcnJvcktpbmQ6OkRlcHRoTGltaXQpLAorICAgICAgICAgICAgXyA9PiBFcnIoRXJyb3I6OlByb3RvY29sKFByb3RvY29sRXJyb3IgeworICAgICAgICAgICAgICAgIGtpbmQ6IFByb3RvY29sRXJyb3JLaW5kOjpVbmtub3duLAorICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGZvcm1hdCEoImNhbm5vdCBjb252ZXJ0IHt9IHRvIFByb3RvY29sRXJyb3JLaW5kIiwgZnJvbSksCisgICAgICAgICAgICB9KSksCisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vLyBDcmVhdGUgYSBuZXcgYEVycm9yYCBpbnN0YW5jZSBvZiB0eXBlIGBBcHBsaWNhdGlvbmAgdGhhdCB3cmFwcyBhbgorLy8vIGBBcHBsaWNhdGlvbkVycm9yYC4KK3B1YiBmbiBuZXdfYXBwbGljYXRpb25fZXJyb3I8UzogSW50bzxTdHJpbmc+PihraW5kOiBBcHBsaWNhdGlvbkVycm9yS2luZCwgbWVzc2FnZTogUykgLT4gRXJyb3IgeworICAgIEVycm9yOjpBcHBsaWNhdGlvbihBcHBsaWNhdGlvbkVycm9yOjpuZXcoa2luZCwgbWVzc2FnZSkpCit9CisKKy8vLyBJbmZvcm1hdGlvbiBhYm91dCBlcnJvcnMgaW4gYXV0by1nZW5lcmF0ZWQgY29kZSBvciBpbiB1c2VyLWltcGxlbWVudGVkCisvLy8gc2VydmljZSBoYW5kbGVycy4KKyNbZGVyaXZlKERlYnVnLCBFcSwgUGFydGlhbEVxKV0KK3B1YiBzdHJ1Y3QgQXBwbGljYXRpb25FcnJvciB7CisgICAgLy8vIEFwcGxpY2F0aW9uIGVycm9yIHZhcmlhbnQuCisgICAgLy8vCisgICAgLy8vIElmIGEgc3BlY2lmaWMgYEFwcGxpY2F0aW9uRXJyb3JLaW5kYCBkb2VzIG5vdCBhcHBseSB1c2UKKyAgICAvLy8gYEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpVbmtub3duYC4KKyAgICBwdWIga2luZDogQXBwbGljYXRpb25FcnJvcktpbmQsCisgICAgLy8vIEh1bWFuLXJlYWRhYmxlIGVycm9yIG1lc3NhZ2UuCisgICAgcHViIG1lc3NhZ2U6IFN0cmluZywKK30KKworaW1wbCBBcHBsaWNhdGlvbkVycm9yIHsKKyAgICAvLy8gQ3JlYXRlIGEgbmV3IGBBcHBsaWNhdGlvbkVycm9yYC4KKyAgICBwdWIgZm4gbmV3PFM6IEludG88U3RyaW5nPj4oa2luZDogQXBwbGljYXRpb25FcnJvcktpbmQsIG1lc3NhZ2U6IFMpIC0+IEFwcGxpY2F0aW9uRXJyb3IgeworICAgICAgICBBcHBsaWNhdGlvbkVycm9yIHsKKyAgICAgICAgICAgIGtpbmQ6IGtpbmQsCisgICAgICAgICAgICBtZXNzYWdlOiBtZXNzYWdlLmludG8oKSwKKyAgICAgICAgfQorICAgIH0KK30KKworLy8vIEF1dG8tZ2VuZXJhdGVkIG9yIHVzZXItaW1wbGVtZW50ZWQgY29kZSBlcnJvciBjYXRlZ29yaWVzLgorLy8vCisvLy8gVGhpcyBsaXN0IG1heSBncm93LCBhbmQgaXQgaXMgbm90IHJlY29tbWVuZGVkIHRvIG1hdGNoIGFnYWluc3QgaXQuCisjW2Rlcml2ZShDbG9uZSwgQ29weSwgRGVidWcsIEVxLCBQYXJ0aWFsRXEpXQorcHViIGVudW0gQXBwbGljYXRpb25FcnJvcktpbmQgeworICAgIC8vLyBDYXRjaC1hbGwgYXBwbGljYXRpb24gZXJyb3IuCisgICAgVW5rbm93biA9IDAsCisgICAgLy8vIE1hZGUgc2VydmljZSBjYWxsIHRvIGFuIHVua25vd24gc2VydmljZSBtZXRob2QuCisgICAgVW5rbm93bk1ldGhvZCA9IDEsCisgICAgLy8vIFJlY2VpdmVkIGFuIHVua25vd24gVGhyaWZ0IG1lc3NhZ2UgdHlwZS4gVGhhdCBpcywgbm90IG9uZSBvZiB0aGUKKyAgICAvLy8gYHRocmlmdDo6cHJvdG9jb2w6OlRNZXNzYWdlVHlwZWAgdmFyaWFudHMuCisgICAgSW52YWxpZE1lc3NhZ2VUeXBlID0gMiwKKyAgICAvLy8gTWV0aG9kIG5hbWUgaW4gYSBzZXJ2aWNlIHJlcGx5IGRvZXMgbm90IG1hdGNoIHRoZSBuYW1lIG9mIHRoZQorICAgIC8vLyByZWNlaXZpbmcgc2VydmljZSBtZXRob2QuCisgICAgV3JvbmdNZXRob2ROYW1lID0gMywKKyAgICAvLy8gUmVjZWl2ZWQgYW4gb3V0LW9mLW9yZGVyIFRocmlmdCBtZXNzYWdlLgorICAgIEJhZFNlcXVlbmNlSWQgPSA0LAorICAgIC8vLyBTZXJ2aWNlIHJlcGx5IGlzIG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzLgorICAgIE1pc3NpbmdSZXN1bHQgPSA1LAorICAgIC8vLyBBdXRvLWdlbmVyYXRlZCBjb2RlIGZhaWxlZCB1bmV4cGVjdGVkbHkuCisgICAgSW50ZXJuYWxFcnJvciA9IDYsCisgICAgLy8vIFRocmlmdCBwcm90b2NvbCBlcnJvci4gV2hlbiBwb3NzaWJsZSB1c2UgYEVycm9yOjpQcm90b2NvbEVycm9yYCB3aXRoIGEKKyAgICAvLy8gc3BlY2lmaWMgYFByb3RvY29sRXJyb3JLaW5kYCBpbnN0ZWFkLgorICAgIFByb3RvY29sRXJyb3IgPSA3LAorICAgIC8vLyAqVW5rbm93biouIEluY2x1ZGVkIG9ubHkgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBleGlzdGluZyBUaHJpZnQgaW1wbGVtZW50YXRpb25zLgorICAgIEludmFsaWRUcmFuc2Zvcm0gPSA4LCAvLyA/PworICAgIC8vLyBUaHJpZnQgZW5kcG9pbnQgcmVxdWVzdGVkLCBvciBpcyB1c2luZywgYW4gdW5zdXBwb3J0ZWQgZW5jb2RpbmcuCisgICAgSW52YWxpZFByb3RvY29sID0gOSwgLy8gPz8KKyAgICAvLy8gVGhyaWZ0IGVuZHBvaW50IHJlcXVlc3RlZCwgb3IgaXMgdXNpbmcsIGFuIHVuc3VwcG9ydGVkIGF1dG8tZ2VuZXJhdGVkIGNsaWVudCB0eXBlLgorICAgIFVuc3VwcG9ydGVkQ2xpZW50VHlwZSA9IDEwLCAvLyA/PworfQorCitpbXBsIEFwcGxpY2F0aW9uRXJyb3IgeworICAgIGZuIGRlc2NyaXB0aW9uKCZzZWxmKSAtPiAmc3RyIHsKKyAgICAgICAgbWF0Y2ggc2VsZi5raW5kIHsKKyAgICAgICAgICAgIEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpVbmtub3duID0+ICJzZXJ2aWNlIGVycm9yIiwKKyAgICAgICAgICAgIEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpVbmtub3duTWV0aG9kID0+ICJ1bmtub3duIHNlcnZpY2UgbWV0aG9kIiwKKyAgICAgICAgICAgIEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpJbnZhbGlkTWVzc2FnZVR5cGUgPT4gIndyb25nIG1lc3NhZ2UgdHlwZSByZWNlaXZlZCIsCisgICAgICAgICAgICBBcHBsaWNhdGlvbkVycm9yS2luZDo6V3JvbmdNZXRob2ROYW1lID0+ICJ1bmtub3duIG1ldGhvZCByZXBseSByZWNlaXZlZCIsCisgICAgICAgICAgICBBcHBsaWNhdGlvbkVycm9yS2luZDo6QmFkU2VxdWVuY2VJZCA9PiAib3V0IG9mIG9yZGVyIHNlcXVlbmNlIGlkIiwKKyAgICAgICAgICAgIEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpNaXNzaW5nUmVzdWx0ID0+ICJtaXNzaW5nIG1ldGhvZCByZXN1bHQiLAorICAgICAgICAgICAgQXBwbGljYXRpb25FcnJvcktpbmQ6OkludGVybmFsRXJyb3IgPT4gInJlbW90ZSBzZXJ2aWNlIHRocmV3IGV4Y2VwdGlvbiIsCisgICAgICAgICAgICBBcHBsaWNhdGlvbkVycm9yS2luZDo6UHJvdG9jb2xFcnJvciA9PiAicHJvdG9jb2wgZXJyb3IiLAorICAgICAgICAgICAgQXBwbGljYXRpb25FcnJvcktpbmQ6OkludmFsaWRUcmFuc2Zvcm0gPT4gImludmFsaWQgdHJhbnNmb3JtIiwKKyAgICAgICAgICAgIEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpJbnZhbGlkUHJvdG9jb2wgPT4gImludmFsaWQgcHJvdG9jb2wgcmVxdWVzdGVkIiwKKyAgICAgICAgICAgIEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpVbnN1cHBvcnRlZENsaWVudFR5cGUgPT4gInVuc3VwcG9ydGVkIHByb3RvY29sIGNsaWVudCIsCisgICAgICAgIH0KKyAgICB9Cit9CisKK2ltcGwgRGlzcGxheSBmb3IgQXBwbGljYXRpb25FcnJvciB7CisgICAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IEZvcm1hdHRlcikgLT4gZm10OjpSZXN1bHQgeworICAgICAgICB3cml0ZSEoZiwgInt9Iiwgc2VsZi5kZXNjcmlwdGlvbigpKQorICAgIH0KK30KKworaW1wbCBUcnlGcm9tPGkzMj4gZm9yIEFwcGxpY2F0aW9uRXJyb3JLaW5kIHsKKyAgICB0eXBlIEVyciA9IEVycm9yOworICAgIGZuIHRyeV9mcm9tKGZyb206IGkzMikgLT4gUmVzdWx0PFNlbGYsIFNlbGY6OkVycj4geworICAgICAgICBtYXRjaCBmcm9tIHsKKyAgICAgICAgICAgIDAgPT4gT2soQXBwbGljYXRpb25FcnJvcktpbmQ6OlVua25vd24pLAorICAgICAgICAgICAgMSA9PiBPayhBcHBsaWNhdGlvbkVycm9yS2luZDo6VW5rbm93bk1ldGhvZCksCisgICAgICAgICAgICAyID0+IE9rKEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpJbnZhbGlkTWVzc2FnZVR5cGUpLAorICAgICAgICAgICAgMyA9PiBPayhBcHBsaWNhdGlvbkVycm9yS2luZDo6V3JvbmdNZXRob2ROYW1lKSwKKyAgICAgICAgICAgIDQgPT4gT2soQXBwbGljYXRpb25FcnJvcktpbmQ6OkJhZFNlcXVlbmNlSWQpLAorICAgICAgICAgICAgNSA9PiBPayhBcHBsaWNhdGlvbkVycm9yS2luZDo6TWlzc2luZ1Jlc3VsdCksCisgICAgICAgICAgICA2ID0+IE9rKEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpJbnRlcm5hbEVycm9yKSwKKyAgICAgICAgICAgIDcgPT4gT2soQXBwbGljYXRpb25FcnJvcktpbmQ6OlByb3RvY29sRXJyb3IpLAorICAgICAgICAgICAgOCA9PiBPayhBcHBsaWNhdGlvbkVycm9yS2luZDo6SW52YWxpZFRyYW5zZm9ybSksCisgICAgICAgICAgICA5ID0+IE9rKEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpJbnZhbGlkUHJvdG9jb2wpLAorICAgICAgICAgICAgMTAgPT4gT2soQXBwbGljYXRpb25FcnJvcktpbmQ6OlVuc3VwcG9ydGVkQ2xpZW50VHlwZSksCisgICAgICAgICAgICBfID0+IEVycihFcnJvcjo6QXBwbGljYXRpb24oQXBwbGljYXRpb25FcnJvciB7CisgICAgICAgICAgICAgICAga2luZDogQXBwbGljYXRpb25FcnJvcktpbmQ6OlVua25vd24sCisgICAgICAgICAgICAgICAgbWVzc2FnZTogZm9ybWF0ISgiY2Fubm90IGNvbnZlcnQge30gdG8gQXBwbGljYXRpb25FcnJvcktpbmQiLCBmcm9tKSwKKyAgICAgICAgICAgIH0pKSwKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9ycy9zcmMvbGliLnJzIGIvbGliL3JzL3NyYy9saWIucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E1YzdkNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ycy9zcmMvbGliLnJzCkBAIC0wLDAgKzEsODcgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8hIFJ1c3QgcnVudGltZSBsaWJyYXJ5IGZvciB0aGUgQXBhY2hlIFRocmlmdCBSUEMgc3lzdGVtLgorLy8hCisvLyEgVGhpcyBjcmF0ZSBpbXBsZW1lbnRzIHRoZSBjb21wb25lbnRzIHJlcXVpcmVkIHRvIGJ1aWxkIGEgd29ya2luZworLy8hIFRocmlmdCBzZXJ2ZXIgYW5kIGNsaWVudC4gSXQgaXMgZGl2aWRlZCBpbnRvIHRoZSBmb2xsb3dpbmcgbW9kdWxlczoKKy8vIQorLy8hIDEuIGVycm9ycworLy8hIDIuIHByb3RvY29sCisvLyEgMy4gdHJhbnNwb3J0CisvLyEgNC4gc2VydmVyCisvLyEgNS4gYXV0b2dlbgorLy8hCisvLyEgVGhlIG1vZHVsZXMgYXJlIGxheWVyZWQgYXMgc2hvd24gaW4gdGhlIGRpYWdyYW0gYmVsb3cuIFRoZSBgYXV0b2dlbidkYAorLy8hIGxheWVyIGlzIGdlbmVyYXRlZCBieSB0aGUgVGhyaWZ0IGNvbXBpbGVyJ3MgUnVzdCBwbHVnaW4uIEl0IHVzZXMgdGhlCisvLyEgdHlwZXMgYW5kIGZ1bmN0aW9ucyBkZWZpbmVkIGluIHRoaXMgY3JhdGUgdG8gc2VyaWFsaXplIGFuZCBkZXNlcmlhbGl6ZQorLy8hIG1lc3NhZ2VzIGFuZCBpbXBsZW1lbnQgUlBDLiBVc2VycyBpbnRlcmFjdCB3aXRoIHRoZXNlIHR5cGVzIGFuZCBzZXJ2aWNlcworLy8hIGJ5IHdyaXRpbmcgdGhlaXIgb3duIGNvZGUgdGhhdCB1c2VzIHRoZSBhdXRvLWdlbmVyYXRlZCBjbGllbnRzIGFuZAorLy8hIHNlcnZlcnMuCisvLyEKKy8vISBgYGB0ZXh0CisvLyEgKy0tLS0tLS0tLS0tKworLy8hIHwgdXNlciBhcHAgIHwKKy8vISArLS0tLS0tLS0tLS0rCisvLyEgfCBhdXRvZ2VuJ2QgfCAodXNlcyBlcnJvcnMsIGF1dG9nZW4pCisvLyEgKy0tLS0tLS0tLS0tKworLy8hIHwgIHByb3RvY29sIHwKKy8vISArLS0tLS0tLS0tLS0rCisvLyEgfCB0cmFuc3BvcnQgfAorLy8hICstLS0tLS0tLS0tLSsKKy8vISBgYGAKKworIyFbY3JhdGVfdHlwZSA9ICJsaWIiXQorIyFbZG9jKHRlc3QoYXR0cihhbGxvdyh1bnVzZWRfdmFyaWFibGVzKSwgZGVueSh3YXJuaW5ncykpKSldCisKK2V4dGVybiBjcmF0ZSBieXRlb3JkZXI7CitleHRlcm4gY3JhdGUgaW50ZWdlcl9lbmNvZGluZzsKK2V4dGVybiBjcmF0ZSB0aHJlYWRwb29sOworZXh0ZXJuIGNyYXRlIHRyeV9mcm9tOworCisjW21hY3JvX3VzZV0KK2V4dGVybiBjcmF0ZSBsb2c7CisKKy8vIE5PVEU6IHRoaXMgbWFjcm8gaGFzIHRvIGJlIGRlZmluZWQgYmVmb3JlIGFueSBtb2R1bGVzLiBTZWU6CisvLyBodHRwczovL2RhbmllbGtlZXAuZ2l0aHViLmlvL3F1aWNrLWludHJvLXRvLW1hY3Jvcy5odG1sI3NvbWUtbW9yZS1nb3RjaGFzCisKKy8vLyBBc3NlcnQgdGhhdCBhbiBleHByZXNzaW9uIHJldHVybmluZyBhIGBSZXN1bHRgIGlzIGEgc3VjY2Vzcy4gSWYgaXQgaXMsCisvLy8gcmV0dXJuIHRoZSB2YWx1ZSBjb250YWluZWQgaW4gdGhlIHJlc3VsdCwgaS5lLiBgZXhwci51bndyYXAoKWAuCisjW2NmZyh0ZXN0KV0KK21hY3JvX3J1bGVzISBhc3NlcnRfc3VjY2VzcyB7CisgICAgKCRlOiBleHByKSA9PiB7eworICAgICAgICBsZXQgcmVzID0gJGU7CisgICAgICAgIGFzc2VydCEocmVzLmlzX29rKCkpOworICAgICAgICByZXMudW53cmFwKCkKKyAgICB9fTsKK30KKworcHViIG1vZCBwcm90b2NvbDsKK3B1YiBtb2Qgc2VydmVyOworcHViIG1vZCB0cmFuc3BvcnQ7CisKK21vZCBlcnJvcnM7CitwdWIgdXNlIGVycm9yczo6KjsKKworbW9kIGF1dG9nZW47CitwdWIgdXNlIGF1dG9nZW46Oio7CisKKy8vLyBSZXN1bHQgdHlwZSByZXR1cm5lZCBieSBhbGwgcnVudGltZSBsaWJyYXJ5IGZ1bmN0aW9ucy4KKy8vLworLy8vIEFzIGlzIGNvbnZlbnRpb24gdGhpcyBpcyBhIHR5cGVkZWYgb2YgYHN0ZDo6cmVzdWx0OjpSZXN1bHRgCisvLy8gd2l0aCBgRWAgZGVmaW5lZCBhcyB0aGUgYHRocmlmdDo6RXJyb3JgIHR5cGUuCitwdWIgdHlwZSBSZXN1bHQ8VD4gPSBzdGQ6OnJlc3VsdDo6UmVzdWx0PFQsIHNlbGY6OkVycm9yPjsKZGlmZiAtLWdpdCBhL2xpYi9ycy9zcmMvcHJvdG9jb2wvYmluYXJ5LnJzIGIvbGliL3JzL3NyYy9wcm90b2NvbC9iaW5hcnkucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTlhZmYzZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ycy9zcmMvcHJvdG9jb2wvYmluYXJ5LnJzCkBAIC0wLDAgKzEsOTU3IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzZSBieXRlb3JkZXI6OntCaWdFbmRpYW4sIEJ5dGVPcmRlciwgUmVhZEJ5dGVzRXh0LCBXcml0ZUJ5dGVzRXh0fTsKK3VzZSBzdGQ6OmNvbnZlcnQ6OkZyb207Cit1c2UgdHJ5X2Zyb206OlRyeUZyb207CisKK3VzZSBzdXBlcjo6eworICAgIFRGaWVsZElkZW50aWZpZXIsIFRJbnB1dFByb3RvY29sLCBUSW5wdXRQcm90b2NvbEZhY3RvcnksIFRMaXN0SWRlbnRpZmllciwgVE1hcElkZW50aWZpZXIsCisgICAgVE1lc3NhZ2VJZGVudGlmaWVyLCBUTWVzc2FnZVR5cGUsCit9OwordXNlIHN1cGVyOjp7VE91dHB1dFByb3RvY29sLCBUT3V0cHV0UHJvdG9jb2xGYWN0b3J5LCBUU2V0SWRlbnRpZmllciwgVFN0cnVjdElkZW50aWZpZXIsIFRUeXBlfTsKK3VzZSB0cmFuc3BvcnQ6OntUUmVhZFRyYW5zcG9ydCwgVFdyaXRlVHJhbnNwb3J0fTsKK3VzZSB7UHJvdG9jb2xFcnJvciwgUHJvdG9jb2xFcnJvcktpbmR9OworCitjb25zdCBCSU5BUllfUFJPVE9DT0xfVkVSU0lPTl8xOiB1MzIgPSAweDgwMDEwMDAwOworCisvLy8gUmVhZCBtZXNzYWdlcyBlbmNvZGVkIGluIHRoZSBUaHJpZnQgc2ltcGxlIGJpbmFyeSBlbmNvZGluZy4KKy8vLworLy8vIFRoZXJlIGFyZSB0d28gYXZhaWxhYmxlIG1vZGVzOiBgc3RyaWN0YCBhbmQgYG5vbi1zdHJpY3RgLCB3aGVyZSB0aGUKKy8vLyBgbm9uLXN0cmljdGAgdmVyc2lvbiBkb2VzIG5vdCBjaGVjayBmb3IgdGhlIHByb3RvY29sIHZlcnNpb24gaW4gdGhlCisvLy8gcmVjZWl2ZWQgbWVzc2FnZSBoZWFkZXIuCisvLy8KKy8vLyAjIEV4YW1wbGVzCisvLy8KKy8vLyBDcmVhdGUgYW5kIHVzZSBhIGBUQmluYXJ5SW5wdXRQcm90b2NvbGAuCisvLy8KKy8vLyBgYGBub19ydW4KKy8vLyB1c2UgdGhyaWZ0Ojpwcm90b2NvbDo6e1RCaW5hcnlJbnB1dFByb3RvY29sLCBUSW5wdXRQcm90b2NvbH07CisvLy8gdXNlIHRocmlmdDo6dHJhbnNwb3J0OjpUVGNwQ2hhbm5lbDsKKy8vLworLy8vIGxldCBtdXQgY2hhbm5lbCA9IFRUY3BDaGFubmVsOjpuZXcoKTsKKy8vLyBjaGFubmVsLm9wZW4oImxvY2FsaG9zdDo5MDkwIikudW53cmFwKCk7CisvLy8KKy8vLyBsZXQgbXV0IHByb3RvY29sID0gVEJpbmFyeUlucHV0UHJvdG9jb2w6Om5ldyhjaGFubmVsLCB0cnVlKTsKKy8vLworLy8vIGxldCByZWN2ZF9ib29sID0gcHJvdG9jb2wucmVhZF9ib29sKCkudW53cmFwKCk7CisvLy8gbGV0IHJlY3ZkX3N0cmluZyA9IHByb3RvY29sLnJlYWRfc3RyaW5nKCkudW53cmFwKCk7CisvLy8gYGBgCisjW2Rlcml2ZShEZWJ1ZyldCitwdWIgc3RydWN0IFRCaW5hcnlJbnB1dFByb3RvY29sPFQ+Cit3aGVyZQorICAgIFQ6IFRSZWFkVHJhbnNwb3J0LAoreworICAgIHN0cmljdDogYm9vbCwKKyAgICBwdWIgdHJhbnNwb3J0OiBULCAvLyBGSVhNRTogc2hvdWxkbid0IGJlIHB1YmxpYworfQorCitpbXBsPCdhLCBUPiBUQmluYXJ5SW5wdXRQcm90b2NvbDxUPgord2hlcmUKKyAgICBUOiBUUmVhZFRyYW5zcG9ydCwKK3sKKyAgICAvLy8gQ3JlYXRlIGEgYFRCaW5hcnlJbnB1dFByb3RvY29sYCB0aGF0IHJlYWRzIGJ5dGVzIGZyb20gYHRyYW5zcG9ydGAuCisgICAgLy8vCisgICAgLy8vIFNldCBgc3RyaWN0YCB0byBgdHJ1ZWAgaWYgYWxsIGluY29taW5nIG1lc3NhZ2VzIGNvbnRhaW4gdGhlIHByb3RvY29sCisgICAgLy8vIHZlcnNpb24gbnVtYmVyIGluIHRoZSBwcm90b2NvbCBoZWFkZXIuCisgICAgcHViIGZuIG5ldyh0cmFuc3BvcnQ6IFQsIHN0cmljdDogYm9vbCkgLT4gVEJpbmFyeUlucHV0UHJvdG9jb2w8VD4geworICAgICAgICBUQmluYXJ5SW5wdXRQcm90b2NvbCB7CisgICAgICAgICAgICBzdHJpY3Q6IHN0cmljdCwKKyAgICAgICAgICAgIHRyYW5zcG9ydDogdHJhbnNwb3J0LAorICAgICAgICB9CisgICAgfQorfQorCitpbXBsPFQ+IFRJbnB1dFByb3RvY29sIGZvciBUQmluYXJ5SW5wdXRQcm90b2NvbDxUPgord2hlcmUKKyAgICBUOiBUUmVhZFRyYW5zcG9ydCwKK3sKKyAgICAjW2NmZ19hdHRyKGZlYXR1cmUgPSAiY2FyZ28tY2xpcHB5IiwgYWxsb3coY29sbGFwc2libGVfaWYpKV0KKyAgICBmbiByZWFkX21lc3NhZ2VfYmVnaW4oJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxUTWVzc2FnZUlkZW50aWZpZXI+IHsKKyAgICAgICAgbGV0IG11dCBmaXJzdF9ieXRlcyA9IHZlYyFbMDsgNF07CisgICAgICAgIHNlbGYudHJhbnNwb3J0LnJlYWRfZXhhY3QoJm11dCBmaXJzdF9ieXRlc1suLl0pPzsKKworICAgICAgICAvLyB0aGUgdGhyaWZ0IHZlcnNpb24gaGVhZGVyIGlzIGludGVudGlvbmFsbHkgbmVnYXRpdmUKKyAgICAgICAgLy8gc28gdGhlIGZpcnN0IGNoZWNrIHdlJ2xsIGRvIGlzIHNlZSBpZiB0aGUgc2lnbiBiaXQgaXMgc2V0CisgICAgICAgIC8vIGFuZCBpZiBzbyAtIGFzc3VtZSBpdCdzIHRoZSBwcm90b2NvbC12ZXJzaW9uIGhlYWRlcgorICAgICAgICBpZiBmaXJzdF9ieXRlc1swXSA+PSA4IHsKKyAgICAgICAgICAgIC8vIGFwcGFyZW50bHkgd2UgZ290IGEgcHJvdG9jb2wtdmVyc2lvbiBoZWFkZXIgLSBjaGVjaworICAgICAgICAgICAgLy8gaXQsIGFuZCBpZiBpdCBtYXRjaGVzLCByZWFkIHRoZSByZXN0IG9mIHRoZSBmaWVsZHMKKyAgICAgICAgICAgIGlmIGZpcnN0X2J5dGVzWzAuLjJdICE9IFsweDgwLCAweDAxXSB7CisgICAgICAgICAgICAgICAgRXJyKDo6RXJyb3I6OlByb3RvY29sKFByb3RvY29sRXJyb3IgeworICAgICAgICAgICAgICAgICAgICBraW5kOiBQcm90b2NvbEVycm9yS2luZDo6QmFkVmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZm9ybWF0ISgicmVjZWl2ZWQgYmFkIHZlcnNpb246IHs6P30iLCAmZmlyc3RfYnl0ZXNbMC4uMl0pLAorICAgICAgICAgICAgICAgIH0pKQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBsZXQgbWVzc2FnZV90eXBlOiBUTWVzc2FnZVR5cGUgPSBUcnlGcm9tOjp0cnlfZnJvbShmaXJzdF9ieXRlc1szXSk/OworICAgICAgICAgICAgICAgIGxldCBuYW1lID0gc2VsZi5yZWFkX3N0cmluZygpPzsKKyAgICAgICAgICAgICAgICBsZXQgc2VxdWVuY2VfbnVtYmVyID0gc2VsZi5yZWFkX2kzMigpPzsKKyAgICAgICAgICAgICAgICBPayhUTWVzc2FnZUlkZW50aWZpZXI6Om5ldyhuYW1lLCBtZXNzYWdlX3R5cGUsIHNlcXVlbmNlX251bWJlcikpCisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBhcHBhcmVudGx5IHdlIGRpZG4ndCBnZXQgYSBwcm90b2NvbC12ZXJzaW9uIGhlYWRlciwKKyAgICAgICAgICAgIC8vIHdoaWNoIGhhcHBlbnMgaWYgdGhlIHNlbmRlciBpcyBub3QgdXNpbmcgdGhlIHN0cmljdCBwcm90b2NvbAorICAgICAgICAgICAgaWYgc2VsZi5zdHJpY3QgeworICAgICAgICAgICAgICAgIC8vIHdlJ3JlIGluIHN0cmljdCBtb2RlIGhvd2V2ZXIsIGFuZCB0aGF0IGFsd2F5cworICAgICAgICAgICAgICAgIC8vIHJlcXVpcmVzIHRoZSBwcm90b2NvbC12ZXJzaW9uIGhlYWRlciB0byBiZSB3cml0dGVuIGZpcnN0CisgICAgICAgICAgICAgICAgRXJyKDo6RXJyb3I6OlByb3RvY29sKFByb3RvY29sRXJyb3IgeworICAgICAgICAgICAgICAgICAgICBraW5kOiBQcm90b2NvbEVycm9yS2luZDo6QmFkVmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZm9ybWF0ISgicmVjZWl2ZWQgYmFkIHZlcnNpb246IHs6P30iLCAmZmlyc3RfYnl0ZXNbMC4uMl0pLAorICAgICAgICAgICAgICAgIH0pKQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBpbiB0aGUgbm9uLXN0cmljdCB2ZXJzaW9uIHRoZSBmaXJzdCBtZXNzYWdlIGZpZWxkCisgICAgICAgICAgICAgICAgLy8gaXMgdGhlIG1lc3NhZ2UgbmFtZS4gc3RyaW5ncyAoYnl0ZSBhcnJheXMpIGFyZSBsZW5ndGgtcHJlZml4ZWQsCisgICAgICAgICAgICAgICAgLy8gc28gd2UndmUganVzdCByZWFkIHRoZSBsZW5ndGggaW4gdGhlIGZpcnN0IDQgYnl0ZXMKKyAgICAgICAgICAgICAgICBsZXQgbmFtZV9zaXplID0gQmlnRW5kaWFuOjpyZWFkX2kzMigmZmlyc3RfYnl0ZXMpIGFzIHVzaXplOworICAgICAgICAgICAgICAgIGxldCBtdXQgbmFtZV9idWY6IFZlYzx1OD4gPSB2ZWMhWzA7IG5hbWVfc2l6ZV07CisgICAgICAgICAgICAgICAgc2VsZi50cmFuc3BvcnQucmVhZF9leGFjdCgmbXV0IG5hbWVfYnVmKT87CisgICAgICAgICAgICAgICAgbGV0IG5hbWUgPSBTdHJpbmc6OmZyb21fdXRmOChuYW1lX2J1Zik/OworCisgICAgICAgICAgICAgICAgLy8gcmVhZCB0aGUgcmVzdCBvZiB0aGUgZmllbGRzCisgICAgICAgICAgICAgICAgbGV0IG1lc3NhZ2VfdHlwZTogVE1lc3NhZ2VUeXBlID0gc2VsZi5yZWFkX2J5dGUoKS5hbmRfdGhlbihUcnlGcm9tOjp0cnlfZnJvbSk/OworICAgICAgICAgICAgICAgIGxldCBzZXF1ZW5jZV9udW1iZXIgPSBzZWxmLnJlYWRfaTMyKCk/OworICAgICAgICAgICAgICAgIE9rKFRNZXNzYWdlSWRlbnRpZmllcjo6bmV3KG5hbWUsIG1lc3NhZ2VfdHlwZSwgc2VxdWVuY2VfbnVtYmVyKSkKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGZuIHJlYWRfbWVzc2FnZV9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICBmbiByZWFkX3N0cnVjdF9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PE9wdGlvbjxUU3RydWN0SWRlbnRpZmllcj4+IHsKKyAgICAgICAgT2soTm9uZSkKKyAgICB9CisKKyAgICBmbiByZWFkX3N0cnVjdF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICBmbiByZWFkX2ZpZWxkX2JlZ2luKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8VEZpZWxkSWRlbnRpZmllcj4geworICAgICAgICBsZXQgZmllbGRfdHlwZV9ieXRlID0gc2VsZi5yZWFkX2J5dGUoKT87CisgICAgICAgIGxldCBmaWVsZF90eXBlID0gZmllbGRfdHlwZV9mcm9tX3U4KGZpZWxkX3R5cGVfYnl0ZSk/OworICAgICAgICBsZXQgaWQgPSBtYXRjaCBmaWVsZF90eXBlIHsKKyAgICAgICAgICAgIFRUeXBlOjpTdG9wID0+IE9rKDApLAorICAgICAgICAgICAgXyA9PiBzZWxmLnJlYWRfaTE2KCksCisgICAgICAgIH0/OworICAgICAgICBPayhURmllbGRJZGVudGlmaWVyOjpuZXc6OjxPcHRpb248U3RyaW5nPiwgU3RyaW5nLCBpMTY+KAorICAgICAgICAgICAgTm9uZSwgZmllbGRfdHlwZSwgaWQsCisgICAgICAgICkpCisgICAgfQorCisgICAgZm4gcmVhZF9maWVsZF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICBmbiByZWFkX2J5dGVzKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8VmVjPHU4Pj4geworICAgICAgICBsZXQgbnVtX2J5dGVzID0gc2VsZi50cmFuc3BvcnQucmVhZF9pMzI6OjxCaWdFbmRpYW4+KCk/IGFzIHVzaXplOworICAgICAgICBsZXQgbXV0IGJ1ZiA9IHZlYyFbMHU4OyBudW1fYnl0ZXNdOworICAgICAgICBzZWxmLnRyYW5zcG9ydAorICAgICAgICAgICAgLnJlYWRfZXhhY3QoJm11dCBidWYpCisgICAgICAgICAgICAubWFwKHxffCBidWYpCisgICAgICAgICAgICAubWFwX2VycihGcm9tOjpmcm9tKQorICAgIH0KKworICAgIGZuIHJlYWRfYm9vbCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PGJvb2w+IHsKKyAgICAgICAgbGV0IGIgPSBzZWxmLnJlYWRfaTgoKT87CisgICAgICAgIG1hdGNoIGIgeworICAgICAgICAgICAgMCA9PiBPayhmYWxzZSksCisgICAgICAgICAgICBfID0+IE9rKHRydWUpLAorICAgICAgICB9CisgICAgfQorCisgICAgZm4gcmVhZF9pOCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PGk4PiB7CisgICAgICAgIHNlbGYudHJhbnNwb3J0LnJlYWRfaTgoKS5tYXBfZXJyKEZyb206OmZyb20pCisgICAgfQorCisgICAgZm4gcmVhZF9pMTYoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxpMTY+IHsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQucmVhZF9pMTY6OjxCaWdFbmRpYW4+KCkubWFwX2VycihGcm9tOjpmcm9tKQorICAgIH0KKworICAgIGZuIHJlYWRfaTMyKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8aTMyPiB7CisgICAgICAgIHNlbGYudHJhbnNwb3J0LnJlYWRfaTMyOjo8QmlnRW5kaWFuPigpLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICB9CisKKyAgICBmbiByZWFkX2k2NCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PGk2ND4geworICAgICAgICBzZWxmLnRyYW5zcG9ydC5yZWFkX2k2NDo6PEJpZ0VuZGlhbj4oKS5tYXBfZXJyKEZyb206OmZyb20pCisgICAgfQorCisgICAgZm4gcmVhZF9kb3VibGUoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxmNjQ+IHsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQucmVhZF9mNjQ6OjxCaWdFbmRpYW4+KCkubWFwX2VycihGcm9tOjpmcm9tKQorICAgIH0KKworICAgIGZuIHJlYWRfc3RyaW5nKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8U3RyaW5nPiB7CisgICAgICAgIGxldCBieXRlcyA9IHNlbGYucmVhZF9ieXRlcygpPzsKKyAgICAgICAgU3RyaW5nOjpmcm9tX3V0ZjgoYnl0ZXMpLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICB9CisKKyAgICBmbiByZWFkX2xpc3RfYmVnaW4oJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxUTGlzdElkZW50aWZpZXI+IHsKKyAgICAgICAgbGV0IGVsZW1lbnRfdHlwZTogVFR5cGUgPSBzZWxmLnJlYWRfYnl0ZSgpLmFuZF90aGVuKGZpZWxkX3R5cGVfZnJvbV91OCk/OworICAgICAgICBsZXQgc2l6ZSA9IHNlbGYucmVhZF9pMzIoKT87CisgICAgICAgIE9rKFRMaXN0SWRlbnRpZmllcjo6bmV3KGVsZW1lbnRfdHlwZSwgc2l6ZSkpCisgICAgfQorCisgICAgZm4gcmVhZF9saXN0X2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIGZuIHJlYWRfc2V0X2JlZ2luKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8VFNldElkZW50aWZpZXI+IHsKKyAgICAgICAgbGV0IGVsZW1lbnRfdHlwZTogVFR5cGUgPSBzZWxmLnJlYWRfYnl0ZSgpLmFuZF90aGVuKGZpZWxkX3R5cGVfZnJvbV91OCk/OworICAgICAgICBsZXQgc2l6ZSA9IHNlbGYucmVhZF9pMzIoKT87CisgICAgICAgIE9rKFRTZXRJZGVudGlmaWVyOjpuZXcoZWxlbWVudF90eXBlLCBzaXplKSkKKyAgICB9CisKKyAgICBmbiByZWFkX3NldF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICBmbiByZWFkX21hcF9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFRNYXBJZGVudGlmaWVyPiB7CisgICAgICAgIGxldCBrZXlfdHlwZTogVFR5cGUgPSBzZWxmLnJlYWRfYnl0ZSgpLmFuZF90aGVuKGZpZWxkX3R5cGVfZnJvbV91OCk/OworICAgICAgICBsZXQgdmFsdWVfdHlwZTogVFR5cGUgPSBzZWxmLnJlYWRfYnl0ZSgpLmFuZF90aGVuKGZpZWxkX3R5cGVfZnJvbV91OCk/OworICAgICAgICBsZXQgc2l6ZSA9IHNlbGYucmVhZF9pMzIoKT87CisgICAgICAgIE9rKFRNYXBJZGVudGlmaWVyOjpuZXcoa2V5X3R5cGUsIHZhbHVlX3R5cGUsIHNpemUpKQorICAgIH0KKworICAgIGZuIHJlYWRfbWFwX2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIC8vIHV0aWxpdHkKKyAgICAvLworCisgICAgZm4gcmVhZF9ieXRlKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8dTg+IHsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQucmVhZF91OCgpLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICB9Cit9CisKKy8vLyBGYWN0b3J5IGZvciBjcmVhdGluZyBpbnN0YW5jZXMgb2YgYFRCaW5hcnlJbnB1dFByb3RvY29sYC4KKyNbZGVyaXZlKERlZmF1bHQpXQorcHViIHN0cnVjdCBUQmluYXJ5SW5wdXRQcm90b2NvbEZhY3Rvcnk7CisKK2ltcGwgVEJpbmFyeUlucHV0UHJvdG9jb2xGYWN0b3J5IHsKKyAgICAvLy8gQ3JlYXRlIGEgYFRCaW5hcnlJbnB1dFByb3RvY29sRmFjdG9yeWAuCisgICAgcHViIGZuIG5ldygpIC0+IFRCaW5hcnlJbnB1dFByb3RvY29sRmFjdG9yeSB7CisgICAgICAgIFRCaW5hcnlJbnB1dFByb3RvY29sRmFjdG9yeSB7fQorICAgIH0KK30KKworaW1wbCBUSW5wdXRQcm90b2NvbEZhY3RvcnkgZm9yIFRCaW5hcnlJbnB1dFByb3RvY29sRmFjdG9yeSB7CisgICAgZm4gY3JlYXRlKCZzZWxmLCB0cmFuc3BvcnQ6IEJveDxUUmVhZFRyYW5zcG9ydCArIFNlbmQ+KSAtPiBCb3g8VElucHV0UHJvdG9jb2wgKyBTZW5kPiB7CisgICAgICAgIEJveDo6bmV3KFRCaW5hcnlJbnB1dFByb3RvY29sOjpuZXcodHJhbnNwb3J0LCB0cnVlKSkKKyAgICB9Cit9CisKKy8vLyBXcml0ZSBtZXNzYWdlcyB1c2luZyB0aGUgVGhyaWZ0IHNpbXBsZSBiaW5hcnkgZW5jb2RpbmcuCisvLy8KKy8vLyBUaGVyZSBhcmUgdHdvIGF2YWlsYWJsZSBtb2RlczogYHN0cmljdGAgYW5kIGBub24tc3RyaWN0YCwgd2hlcmUgdGhlCisvLy8gYHN0cmljdGAgdmVyc2lvbiB3cml0ZXMgdGhlIHByb3RvY29sIHZlcnNpb24gbnVtYmVyIGluIHRoZSBvdXRnb2luZyBtZXNzYWdlCisvLy8gaGVhZGVyIGFuZCB0aGUgYG5vbi1zdHJpY3RgIHZlcnNpb24gZG9lcyBub3QuCisvLy8KKy8vLyAjIEV4YW1wbGVzCisvLy8KKy8vLyBDcmVhdGUgYW5kIHVzZSBhIGBUQmluYXJ5T3V0cHV0UHJvdG9jb2xgLgorLy8vCisvLy8gYGBgbm9fcnVuCisvLy8gdXNlIHRocmlmdDo6cHJvdG9jb2w6OntUQmluYXJ5T3V0cHV0UHJvdG9jb2wsIFRPdXRwdXRQcm90b2NvbH07CisvLy8gdXNlIHRocmlmdDo6dHJhbnNwb3J0OjpUVGNwQ2hhbm5lbDsKKy8vLworLy8vIGxldCBtdXQgY2hhbm5lbCA9IFRUY3BDaGFubmVsOjpuZXcoKTsKKy8vLyBjaGFubmVsLm9wZW4oImxvY2FsaG9zdDo5MDkwIikudW53cmFwKCk7CisvLy8KKy8vLyBsZXQgbXV0IHByb3RvY29sID0gVEJpbmFyeU91dHB1dFByb3RvY29sOjpuZXcoY2hhbm5lbCwgdHJ1ZSk7CisvLy8KKy8vLyBwcm90b2NvbC53cml0ZV9ib29sKHRydWUpLnVud3JhcCgpOworLy8vIHByb3RvY29sLndyaXRlX3N0cmluZygidGVzdF9zdHJpbmciKS51bndyYXAoKTsKKy8vLyBgYGAKKyNbZGVyaXZlKERlYnVnKV0KK3B1YiBzdHJ1Y3QgVEJpbmFyeU91dHB1dFByb3RvY29sPFQ+Cit3aGVyZQorICAgIFQ6IFRXcml0ZVRyYW5zcG9ydCwKK3sKKyAgICBzdHJpY3Q6IGJvb2wsCisgICAgcHViIHRyYW5zcG9ydDogVCwgLy8gRklYTUU6IGRvIG5vdCBtYWtlIHB1YmxpYzsgb25seSBwdWJsaWMgZm9yIHRlc3RpbmchCit9CisKK2ltcGw8VD4gVEJpbmFyeU91dHB1dFByb3RvY29sPFQ+Cit3aGVyZQorICAgIFQ6IFRXcml0ZVRyYW5zcG9ydCwKK3sKKyAgICAvLy8gQ3JlYXRlIGEgYFRCaW5hcnlPdXRwdXRQcm90b2NvbGAgdGhhdCB3cml0ZXMgYnl0ZXMgdG8gYHRyYW5zcG9ydGAuCisgICAgLy8vCisgICAgLy8vIFNldCBgc3RyaWN0YCB0byBgdHJ1ZWAgaWYgYWxsIG91dGdvaW5nIG1lc3NhZ2VzIHNob3VsZCBjb250YWluIHRoZQorICAgIC8vLyBwcm90b2NvbCB2ZXJzaW9uIG51bWJlciBpbiB0aGUgcHJvdG9jb2wgaGVhZGVyLgorICAgIHB1YiBmbiBuZXcodHJhbnNwb3J0OiBULCBzdHJpY3Q6IGJvb2wpIC0+IFRCaW5hcnlPdXRwdXRQcm90b2NvbDxUPiB7CisgICAgICAgIFRCaW5hcnlPdXRwdXRQcm90b2NvbCB7CisgICAgICAgICAgICBzdHJpY3Q6IHN0cmljdCwKKyAgICAgICAgICAgIHRyYW5zcG9ydDogdHJhbnNwb3J0LAorICAgICAgICB9CisgICAgfQorfQorCitpbXBsPFQ+IFRPdXRwdXRQcm90b2NvbCBmb3IgVEJpbmFyeU91dHB1dFByb3RvY29sPFQ+Cit3aGVyZQorICAgIFQ6IFRXcml0ZVRyYW5zcG9ydCwKK3sKKyAgICBmbiB3cml0ZV9tZXNzYWdlX2JlZ2luKCZtdXQgc2VsZiwgaWRlbnRpZmllcjogJlRNZXNzYWdlSWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgaWYgc2VsZi5zdHJpY3QgeworICAgICAgICAgICAgbGV0IG1lc3NhZ2VfdHlwZTogdTggPSBpZGVudGlmaWVyLm1lc3NhZ2VfdHlwZS5pbnRvKCk7CisgICAgICAgICAgICBsZXQgaGVhZGVyID0gQklOQVJZX1BST1RPQ09MX1ZFUlNJT05fMSB8IChtZXNzYWdlX3R5cGUgYXMgdTMyKTsKKyAgICAgICAgICAgIHNlbGYudHJhbnNwb3J0LndyaXRlX3UzMjo6PEJpZ0VuZGlhbj4oaGVhZGVyKT87CisgICAgICAgICAgICBzZWxmLndyaXRlX3N0cmluZygmaWRlbnRpZmllci5uYW1lKT87CisgICAgICAgICAgICBzZWxmLndyaXRlX2kzMihpZGVudGlmaWVyLnNlcXVlbmNlX251bWJlcikKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNlbGYud3JpdGVfc3RyaW5nKCZpZGVudGlmaWVyLm5hbWUpPzsKKyAgICAgICAgICAgIHNlbGYud3JpdGVfYnl0ZShpZGVudGlmaWVyLm1lc3NhZ2VfdHlwZS5pbnRvKCkpPzsKKyAgICAgICAgICAgIHNlbGYud3JpdGVfaTMyKGlkZW50aWZpZXIuc2VxdWVuY2VfbnVtYmVyKQorICAgICAgICB9CisgICAgfQorCisgICAgZm4gd3JpdGVfbWVzc2FnZV9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9zdHJ1Y3RfYmVnaW4oJm11dCBzZWxmLCBfOiAmVFN0cnVjdElkZW50aWZpZXIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIGZuIHdyaXRlX3N0cnVjdF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9maWVsZF9iZWdpbigmbXV0IHNlbGYsIGlkZW50aWZpZXI6ICZURmllbGRJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBpZiBpZGVudGlmaWVyLmlkLmlzX25vbmUoKSAmJiBpZGVudGlmaWVyLmZpZWxkX3R5cGUgIT0gVFR5cGU6OlN0b3AgeworICAgICAgICAgICAgcmV0dXJuIEVycig6OkVycm9yOjpQcm90b2NvbChQcm90b2NvbEVycm9yIHsKKyAgICAgICAgICAgICAgICBraW5kOiBQcm90b2NvbEVycm9yS2luZDo6VW5rbm93biwKKyAgICAgICAgICAgICAgICBtZXNzYWdlOiBmb3JtYXQhKAorICAgICAgICAgICAgICAgICAgICAiY2Fubm90IHdyaXRlIGlkZW50aWZpZXIgezo/fSB3aXRob3V0IHNlcXVlbmNlIG51bWJlciIsCisgICAgICAgICAgICAgICAgICAgICZpZGVudGlmaWVyCisgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgIH0pKTsKKyAgICAgICAgfQorCisgICAgICAgIHNlbGYud3JpdGVfYnl0ZShmaWVsZF90eXBlX3RvX3U4KGlkZW50aWZpZXIuZmllbGRfdHlwZSkpPzsKKyAgICAgICAgaWYgbGV0IFNvbWUoaWQpID0gaWRlbnRpZmllci5pZCB7CisgICAgICAgICAgICBzZWxmLndyaXRlX2kxNihpZCkKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIE9rKCgpKQorICAgICAgICB9CisgICAgfQorCisgICAgZm4gd3JpdGVfZmllbGRfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgZm4gd3JpdGVfZmllbGRfc3RvcCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYud3JpdGVfYnl0ZShmaWVsZF90eXBlX3RvX3U4KFRUeXBlOjpTdG9wKSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9ieXRlcygmbXV0IHNlbGYsIGI6ICZbdThdKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLndyaXRlX2kzMihiLmxlbigpIGFzIGkzMik/OworICAgICAgICBzZWxmLnRyYW5zcG9ydC53cml0ZV9hbGwoYikubWFwX2VycihGcm9tOjpmcm9tKQorICAgIH0KKworICAgIGZuIHdyaXRlX2Jvb2woJm11dCBzZWxmLCBiOiBib29sKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBpZiBiIHsKKyAgICAgICAgICAgIHNlbGYud3JpdGVfaTgoMSkKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNlbGYud3JpdGVfaTgoMCkKKyAgICAgICAgfQorICAgIH0KKworICAgIGZuIHdyaXRlX2k4KCZtdXQgc2VsZiwgaTogaTgpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYudHJhbnNwb3J0LndyaXRlX2k4KGkpLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9pMTYoJm11dCBzZWxmLCBpOiBpMTYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYudHJhbnNwb3J0LndyaXRlX2kxNjo6PEJpZ0VuZGlhbj4oaSkubWFwX2VycihGcm9tOjpmcm9tKQorICAgIH0KKworICAgIGZuIHdyaXRlX2kzMigmbXV0IHNlbGYsIGk6IGkzMikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQud3JpdGVfaTMyOjo8QmlnRW5kaWFuPihpKS5tYXBfZXJyKEZyb206OmZyb20pCisgICAgfQorCisgICAgZm4gd3JpdGVfaTY0KCZtdXQgc2VsZiwgaTogaTY0KSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLnRyYW5zcG9ydC53cml0ZV9pNjQ6OjxCaWdFbmRpYW4+KGkpLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9kb3VibGUoJm11dCBzZWxmLCBkOiBmNjQpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYudHJhbnNwb3J0LndyaXRlX2Y2NDo6PEJpZ0VuZGlhbj4oZCkubWFwX2VycihGcm9tOjpmcm9tKQorICAgIH0KKworICAgIGZuIHdyaXRlX3N0cmluZygmbXV0IHNlbGYsIHM6ICZzdHIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYud3JpdGVfYnl0ZXMocy5hc19ieXRlcygpKQorICAgIH0KKworICAgIGZuIHdyaXRlX2xpc3RfYmVnaW4oJm11dCBzZWxmLCBpZGVudGlmaWVyOiAmVExpc3RJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLndyaXRlX2J5dGUoZmllbGRfdHlwZV90b191OChpZGVudGlmaWVyLmVsZW1lbnRfdHlwZSkpPzsKKyAgICAgICAgc2VsZi53cml0ZV9pMzIoaWRlbnRpZmllci5zaXplKQorICAgIH0KKworICAgIGZuIHdyaXRlX2xpc3RfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgZm4gd3JpdGVfc2V0X2JlZ2luKCZtdXQgc2VsZiwgaWRlbnRpZmllcjogJlRTZXRJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLndyaXRlX2J5dGUoZmllbGRfdHlwZV90b191OChpZGVudGlmaWVyLmVsZW1lbnRfdHlwZSkpPzsKKyAgICAgICAgc2VsZi53cml0ZV9pMzIoaWRlbnRpZmllci5zaXplKQorICAgIH0KKworICAgIGZuIHdyaXRlX3NldF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9tYXBfYmVnaW4oJm11dCBzZWxmLCBpZGVudGlmaWVyOiAmVE1hcElkZW50aWZpZXIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIGxldCBrZXlfdHlwZSA9IGlkZW50aWZpZXIKKyAgICAgICAgICAgIC5rZXlfdHlwZQorICAgICAgICAgICAgLmV4cGVjdCgibWFwIGlkZW50aWZpZXIgdG8gd3JpdGUgc2hvdWxkIGNvbnRhaW4ga2V5IHR5cGUiKTsKKyAgICAgICAgc2VsZi53cml0ZV9ieXRlKGZpZWxkX3R5cGVfdG9fdTgoa2V5X3R5cGUpKT87CisgICAgICAgIGxldCB2YWxfdHlwZSA9IGlkZW50aWZpZXIKKyAgICAgICAgICAgIC52YWx1ZV90eXBlCisgICAgICAgICAgICAuZXhwZWN0KCJtYXAgaWRlbnRpZmllciB0byB3cml0ZSBzaG91bGQgY29udGFpbiB2YWx1ZSB0eXBlIik7CisgICAgICAgIHNlbGYud3JpdGVfYnl0ZShmaWVsZF90eXBlX3RvX3U4KHZhbF90eXBlKSk/OworICAgICAgICBzZWxmLndyaXRlX2kzMihpZGVudGlmaWVyLnNpemUpCisgICAgfQorCisgICAgZm4gd3JpdGVfbWFwX2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIGZuIGZsdXNoKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQuZmx1c2goKS5tYXBfZXJyKEZyb206OmZyb20pCisgICAgfQorCisgICAgLy8gdXRpbGl0eQorICAgIC8vCisKKyAgICBmbiB3cml0ZV9ieXRlKCZtdXQgc2VsZiwgYjogdTgpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYudHJhbnNwb3J0LndyaXRlX3U4KGIpLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICB9Cit9CisKKy8vLyBGYWN0b3J5IGZvciBjcmVhdGluZyBpbnN0YW5jZXMgb2YgYFRCaW5hcnlPdXRwdXRQcm90b2NvbGAuCisjW2Rlcml2ZShEZWZhdWx0KV0KK3B1YiBzdHJ1Y3QgVEJpbmFyeU91dHB1dFByb3RvY29sRmFjdG9yeTsKKworaW1wbCBUQmluYXJ5T3V0cHV0UHJvdG9jb2xGYWN0b3J5IHsKKyAgICAvLy8gQ3JlYXRlIGEgYFRCaW5hcnlPdXRwdXRQcm90b2NvbEZhY3RvcnlgLgorICAgIHB1YiBmbiBuZXcoKSAtPiBUQmluYXJ5T3V0cHV0UHJvdG9jb2xGYWN0b3J5IHsKKyAgICAgICAgVEJpbmFyeU91dHB1dFByb3RvY29sRmFjdG9yeSB7fQorICAgIH0KK30KKworaW1wbCBUT3V0cHV0UHJvdG9jb2xGYWN0b3J5IGZvciBUQmluYXJ5T3V0cHV0UHJvdG9jb2xGYWN0b3J5IHsKKyAgICBmbiBjcmVhdGUoJnNlbGYsIHRyYW5zcG9ydDogQm94PFRXcml0ZVRyYW5zcG9ydCArIFNlbmQ+KSAtPiBCb3g8VE91dHB1dFByb3RvY29sICsgU2VuZD4geworICAgICAgICBCb3g6Om5ldyhUQmluYXJ5T3V0cHV0UHJvdG9jb2w6Om5ldyh0cmFuc3BvcnQsIHRydWUpKQorICAgIH0KK30KKworZm4gZmllbGRfdHlwZV90b191OChmaWVsZF90eXBlOiBUVHlwZSkgLT4gdTggeworICAgIG1hdGNoIGZpZWxkX3R5cGUgeworICAgICAgICBUVHlwZTo6U3RvcCA9PiAweDAwLAorICAgICAgICBUVHlwZTo6Vm9pZCA9PiAweDAxLAorICAgICAgICBUVHlwZTo6Qm9vbCA9PiAweDAyLAorICAgICAgICBUVHlwZTo6STA4ID0+IDB4MDMsIC8vIGVxdWl2YWxlbnQgdG8gVFR5cGU6OkJ5dGUKKyAgICAgICAgVFR5cGU6OkRvdWJsZSA9PiAweDA0LAorICAgICAgICBUVHlwZTo6STE2ID0+IDB4MDYsCisgICAgICAgIFRUeXBlOjpJMzIgPT4gMHgwOCwKKyAgICAgICAgVFR5cGU6Okk2NCA9PiAweDBBLAorICAgICAgICBUVHlwZTo6U3RyaW5nIHwgVFR5cGU6OlV0ZjcgPT4gMHgwQiwKKyAgICAgICAgVFR5cGU6OlN0cnVjdCA9PiAweDBDLAorICAgICAgICBUVHlwZTo6TWFwID0+IDB4MEQsCisgICAgICAgIFRUeXBlOjpTZXQgPT4gMHgwRSwKKyAgICAgICAgVFR5cGU6Okxpc3QgPT4gMHgwRiwKKyAgICAgICAgVFR5cGU6OlV0ZjggPT4gMHgxMCwKKyAgICAgICAgVFR5cGU6OlV0ZjE2ID0+IDB4MTEsCisgICAgfQorfQorCitmbiBmaWVsZF90eXBlX2Zyb21fdTgoYjogdTgpIC0+IDo6UmVzdWx0PFRUeXBlPiB7CisgICAgbWF0Y2ggYiB7CisgICAgICAgIDB4MDAgPT4gT2soVFR5cGU6OlN0b3ApLAorICAgICAgICAweDAxID0+IE9rKFRUeXBlOjpWb2lkKSwKKyAgICAgICAgMHgwMiA9PiBPayhUVHlwZTo6Qm9vbCksCisgICAgICAgIDB4MDMgPT4gT2soVFR5cGU6OkkwOCksIC8vIEVxdWl2YWxlbnQgdG8gVFR5cGU6OkJ5dGUKKyAgICAgICAgMHgwNCA9PiBPayhUVHlwZTo6RG91YmxlKSwKKyAgICAgICAgMHgwNiA9PiBPayhUVHlwZTo6STE2KSwKKyAgICAgICAgMHgwOCA9PiBPayhUVHlwZTo6STMyKSwKKyAgICAgICAgMHgwQSA9PiBPayhUVHlwZTo6STY0KSwKKyAgICAgICAgMHgwQiA9PiBPayhUVHlwZTo6U3RyaW5nKSwgLy8gdGVjaG5pY2FsbHksIGFsc28gYSBVVEY3LCBidXQgd2UnbGwgdHJlYXQgaXQgYXMgc3RyaW5nCisgICAgICAgIDB4MEMgPT4gT2soVFR5cGU6OlN0cnVjdCksCisgICAgICAgIDB4MEQgPT4gT2soVFR5cGU6Ok1hcCksCisgICAgICAgIDB4MEUgPT4gT2soVFR5cGU6OlNldCksCisgICAgICAgIDB4MEYgPT4gT2soVFR5cGU6Okxpc3QpLAorICAgICAgICAweDEwID0+IE9rKFRUeXBlOjpVdGY4KSwKKyAgICAgICAgMHgxMSA9PiBPayhUVHlwZTo6VXRmMTYpLAorICAgICAgICB1bmtuID0+IEVycig6OkVycm9yOjpQcm90b2NvbChQcm90b2NvbEVycm9yIHsKKyAgICAgICAgICAgIGtpbmQ6IFByb3RvY29sRXJyb3JLaW5kOjpJbnZhbGlkRGF0YSwKKyAgICAgICAgICAgIG1lc3NhZ2U6IGZvcm1hdCEoImNhbm5vdCBjb252ZXJ0IHt9IHRvIFRUeXBlIiwgdW5rbiksCisgICAgICAgIH0pKSwKKyAgICB9Cit9CisKKyNbY2ZnKHRlc3QpXQorbW9kIHRlc3RzIHsKKworICAgIHVzZSBwcm90b2NvbDo6eworICAgICAgICBURmllbGRJZGVudGlmaWVyLCBUSW5wdXRQcm90b2NvbCwgVExpc3RJZGVudGlmaWVyLCBUTWFwSWRlbnRpZmllciwgVE1lc3NhZ2VJZGVudGlmaWVyLAorICAgICAgICBUTWVzc2FnZVR5cGUsIFRPdXRwdXRQcm90b2NvbCwgVFNldElkZW50aWZpZXIsIFRTdHJ1Y3RJZGVudGlmaWVyLCBUVHlwZSwKKyAgICB9OworICAgIHVzZSB0cmFuc3BvcnQ6OntSZWFkSGFsZiwgVEJ1ZmZlckNoYW5uZWwsIFRJb0NoYW5uZWwsIFdyaXRlSGFsZn07CisKKyAgICB1c2Ugc3VwZXI6Oio7CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9zdHJpY3RfbWVzc2FnZV9jYWxsX2JlZ2luKCkgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKHRydWUpOworCisgICAgICAgIGxldCBpZGVudCA9IFRNZXNzYWdlSWRlbnRpZmllcjo6bmV3KCJ0ZXN0IiwgVE1lc3NhZ2VUeXBlOjpDYWxsLCAxKTsKKyAgICAgICAgYXNzZXJ0IShvX3Byb3Qud3JpdGVfbWVzc2FnZV9iZWdpbigmaWRlbnQpLmlzX29rKCkpOworCisgICAgICAgICNbY2ZnX2F0dHIocnVzdGZtdCwgcnVzdGZtdDo6c2tpcCldCisgICAgICAgIGxldCBleHBlY3RlZDogW3U4OyAxNl0gPSBbCisgICAgICAgICAgICAweDgwLAorICAgICAgICAgICAgMHgwMSwKKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDAxLAorICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwNCwKKyAgICAgICAgICAgIDB4NzQsCisgICAgICAgICAgICAweDY1LAorICAgICAgICAgICAgMHg3MywKKyAgICAgICAgICAgIDB4NzQsCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDAxLAorICAgICAgICBdOworCisgICAgICAgIGFzc2VydF9lcV93cml0dGVuX2J5dGVzIShvX3Byb3QsIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9ub25fc3RyaWN0X21lc3NhZ2VfY2FsbF9iZWdpbigpIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cyhmYWxzZSk7CisKKyAgICAgICAgbGV0IGlkZW50ID0gVE1lc3NhZ2VJZGVudGlmaWVyOjpuZXcoInRlc3QiLCBUTWVzc2FnZVR5cGU6OkNhbGwsIDEpOworICAgICAgICBhc3NlcnQhKG9fcHJvdC53cml0ZV9tZXNzYWdlX2JlZ2luKCZpZGVudCkuaXNfb2soKSk7CisKKyAgICAgICAgI1tjZmdfYXR0cihydXN0Zm10LCBydXN0Zm10Ojpza2lwKV0KKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDEzXSA9IFsKKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDQsCisgICAgICAgICAgICAweDc0LAorICAgICAgICAgICAgMHg2NSwKKyAgICAgICAgICAgIDB4NzMsCisgICAgICAgICAgICAweDc0LAorICAgICAgICAgICAgMHgwMSwKKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDEsCisgICAgICAgIF07CisKKyAgICAgICAgYXNzZXJ0X2VxX3dyaXR0ZW5fYnl0ZXMhKG9fcHJvdCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX3N0cmljdF9tZXNzYWdlX3JlcGx5X2JlZ2luKCkgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKHRydWUpOworCisgICAgICAgIGxldCBpZGVudCA9IFRNZXNzYWdlSWRlbnRpZmllcjo6bmV3KCJ0ZXN0IiwgVE1lc3NhZ2VUeXBlOjpSZXBseSwgMTApOworICAgICAgICBhc3NlcnQhKG9fcHJvdC53cml0ZV9tZXNzYWdlX2JlZ2luKCZpZGVudCkuaXNfb2soKSk7CisKKyAgICAgICAgI1tjZmdfYXR0cihydXN0Zm10LCBydXN0Zm10Ojpza2lwKV0KKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDE2XSA9IFsKKyAgICAgICAgICAgIDB4ODAsCisgICAgICAgICAgICAweDAxLAorICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDIsCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDA0LAorICAgICAgICAgICAgMHg3NCwKKyAgICAgICAgICAgIDB4NjUsCisgICAgICAgICAgICAweDczLAorICAgICAgICAgICAgMHg3NCwKKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MEEsCisgICAgICAgIF07CisKKyAgICAgICAgYXNzZXJ0X2VxX3dyaXR0ZW5fYnl0ZXMhKG9fcHJvdCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX25vbl9zdHJpY3RfbWVzc2FnZV9yZXBseV9iZWdpbigpIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cyhmYWxzZSk7CisKKyAgICAgICAgbGV0IGlkZW50ID0gVE1lc3NhZ2VJZGVudGlmaWVyOjpuZXcoInRlc3QiLCBUTWVzc2FnZVR5cGU6OlJlcGx5LCAxMCk7CisgICAgICAgIGFzc2VydCEob19wcm90LndyaXRlX21lc3NhZ2VfYmVnaW4oJmlkZW50KS5pc19vaygpKTsKKworICAgICAgICAjW2NmZ19hdHRyKHJ1c3RmbXQsIHJ1c3RmbXQ6OnNraXApXQorICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgMTNdID0gWworICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwNCwKKyAgICAgICAgICAgIDB4NzQsCisgICAgICAgICAgICAweDY1LAorICAgICAgICAgICAgMHg3MywKKyAgICAgICAgICAgIDB4NzQsCisgICAgICAgICAgICAweDAyLAorICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwQSwKKyAgICAgICAgXTsKKworICAgICAgICBhc3NlcnRfZXFfd3JpdHRlbl9ieXRlcyEob19wcm90LCBleHBlY3RlZCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfcm91bmRfdHJpcF9zdHJpY3RfbWVzc2FnZV9iZWdpbigpIHsKKyAgICAgICAgbGV0IChtdXQgaV9wcm90LCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cyh0cnVlKTsKKworICAgICAgICBsZXQgc2VudF9pZGVudCA9IFRNZXNzYWdlSWRlbnRpZmllcjo6bmV3KCJ0ZXN0IiwgVE1lc3NhZ2VUeXBlOjpDYWxsLCAxKTsKKyAgICAgICAgYXNzZXJ0IShvX3Byb3Qud3JpdGVfbWVzc2FnZV9iZWdpbigmc2VudF9pZGVudCkuaXNfb2soKSk7CisKKyAgICAgICAgY29weV93cml0ZV9idWZmZXJfdG9fcmVhZF9idWZmZXIhKG9fcHJvdCk7CisKKyAgICAgICAgbGV0IHJlY2VpdmVkX2lkZW50ID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX21lc3NhZ2VfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoJnJlY2VpdmVkX2lkZW50LCAmc2VudF9pZGVudCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfcm91bmRfdHJpcF9ub25fc3RyaWN0X21lc3NhZ2VfYmVnaW4oKSB7CisgICAgICAgIGxldCAobXV0IGlfcHJvdCwgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoZmFsc2UpOworCisgICAgICAgIGxldCBzZW50X2lkZW50ID0gVE1lc3NhZ2VJZGVudGlmaWVyOjpuZXcoInRlc3QiLCBUTWVzc2FnZVR5cGU6OkNhbGwsIDEpOworICAgICAgICBhc3NlcnQhKG9fcHJvdC53cml0ZV9tZXNzYWdlX2JlZ2luKCZzZW50X2lkZW50KS5pc19vaygpKTsKKworICAgICAgICBjb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlciEob19wcm90KTsKKworICAgICAgICBsZXQgcmVjZWl2ZWRfaWRlbnQgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfbWVzc2FnZV9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmcmVjZWl2ZWRfaWRlbnQsICZzZW50X2lkZW50KTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9tZXNzYWdlX2VuZCgpIHsKKyAgICAgICAgYXNzZXJ0X25vX3dyaXRlKHxvfCBvLndyaXRlX21lc3NhZ2VfZW5kKCksIHRydWUpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX3N0cnVjdF9iZWdpbigpIHsKKyAgICAgICAgYXNzZXJ0X25vX3dyaXRlKAorICAgICAgICAgICAgfG98IG8ud3JpdGVfc3RydWN0X2JlZ2luKCZUU3RydWN0SWRlbnRpZmllcjo6bmV3KCJmb28iKSksCisgICAgICAgICAgICB0cnVlLAorICAgICAgICApOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX3N0cnVjdF9lbmQoKSB7CisgICAgICAgIGFzc2VydF9ub193cml0ZSh8b3wgby53cml0ZV9zdHJ1Y3RfZW5kKCksIHRydWUpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX2ZpZWxkX2JlZ2luKCkgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKHRydWUpOworCisgICAgICAgIGFzc2VydCEob19wcm90CisgICAgICAgICAgICAud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygic29tZV9maWVsZCIsIFRUeXBlOjpTdHJpbmcsIDIyKSkKKyAgICAgICAgICAgIC5pc19vaygpKTsKKworICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgM10gPSBbMHgwQiwgMHgwMCwgMHgxNl07CisgICAgICAgIGFzc2VydF9lcV93cml0dGVuX2J5dGVzIShvX3Byb3QsIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yb3VuZF90cmlwX2ZpZWxkX2JlZ2luKCkgeworICAgICAgICBsZXQgKG11dCBpX3Byb3QsIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKHRydWUpOworCisgICAgICAgIGxldCBzZW50X2ZpZWxkX2lkZW50ID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STY0LCAyMCk7CisgICAgICAgIGFzc2VydCEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZzZW50X2ZpZWxkX2lkZW50KS5pc19vaygpKTsKKworICAgICAgICBjb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlciEob19wcm90KTsKKworICAgICAgICBsZXQgZXhwZWN0ZWRfaWRlbnQgPSBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICBmaWVsZF90eXBlOiBUVHlwZTo6STY0LAorICAgICAgICAgICAgaWQ6IFNvbWUoMjApLAorICAgICAgICB9OyAvLyBubyBuYW1lCisgICAgICAgIGxldCByZWNlaXZlZF9pZGVudCA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmcmVjZWl2ZWRfaWRlbnQsICZleHBlY3RlZF9pZGVudCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfc3RvcF9maWVsZCgpIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cyh0cnVlKTsKKworICAgICAgICBhc3NlcnQhKG9fcHJvdC53cml0ZV9maWVsZF9zdG9wKCkuaXNfb2soKSk7CisKKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDFdID0gWzB4MDBdOworICAgICAgICBhc3NlcnRfZXFfd3JpdHRlbl9ieXRlcyEob19wcm90LCBleHBlY3RlZCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfcm91bmRfdHJpcF9maWVsZF9zdG9wKCkgeworICAgICAgICBsZXQgKG11dCBpX3Byb3QsIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKHRydWUpOworCisgICAgICAgIGFzc2VydCEob19wcm90LndyaXRlX2ZpZWxkX3N0b3AoKS5pc19vaygpKTsKKworICAgICAgICBjb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlciEob19wcm90KTsKKworICAgICAgICBsZXQgZXhwZWN0ZWRfaWRlbnQgPSBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICBmaWVsZF90eXBlOiBUVHlwZTo6U3RvcCwKKyAgICAgICAgICAgIGlkOiBTb21lKDApLAorICAgICAgICB9OyAvLyB3ZSBnZXQgaWQgMAorCisgICAgICAgIGxldCByZWNlaXZlZF9pZGVudCA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmcmVjZWl2ZWRfaWRlbnQsICZleHBlY3RlZF9pZGVudCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfZmllbGRfZW5kKCkgeworICAgICAgICBhc3NlcnRfbm9fd3JpdGUofG98IG8ud3JpdGVfZmllbGRfZW5kKCksIHRydWUpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX2xpc3RfYmVnaW4oKSB7CisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHModHJ1ZSk7CisKKyAgICAgICAgYXNzZXJ0IShvX3Byb3QKKyAgICAgICAgICAgIC53cml0ZV9saXN0X2JlZ2luKCZUTGlzdElkZW50aWZpZXI6Om5ldyhUVHlwZTo6Qm9vbCwgNSkpCisgICAgICAgICAgICAuaXNfb2soKSk7CisKKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDVdID0gWzB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDVdOworICAgICAgICBhc3NlcnRfZXFfd3JpdHRlbl9ieXRlcyEob19wcm90LCBleHBlY3RlZCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfcm91bmRfdHJpcF9saXN0X2JlZ2luKCkgeworICAgICAgICBsZXQgKG11dCBpX3Byb3QsIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKHRydWUpOworCisgICAgICAgIGxldCBpZGVudCA9IFRMaXN0SWRlbnRpZmllcjo6bmV3KFRUeXBlOjpMaXN0LCA5MDApOworICAgICAgICBhc3NlcnQhKG9fcHJvdC53cml0ZV9saXN0X2JlZ2luKCZpZGVudCkuaXNfb2soKSk7CisKKyAgICAgICAgY29weV93cml0ZV9idWZmZXJfdG9fcmVhZF9idWZmZXIhKG9fcHJvdCk7CisKKyAgICAgICAgbGV0IHJlY2VpdmVkX2lkZW50ID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2xpc3RfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoJnJlY2VpdmVkX2lkZW50LCAmaWRlbnQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX2xpc3RfZW5kKCkgeworICAgICAgICBhc3NlcnRfbm9fd3JpdGUofG98IG8ud3JpdGVfbGlzdF9lbmQoKSwgdHJ1ZSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfc2V0X2JlZ2luKCkgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKHRydWUpOworCisgICAgICAgIGFzc2VydCEob19wcm90CisgICAgICAgICAgICAud3JpdGVfc2V0X2JlZ2luKCZUU2V0SWRlbnRpZmllcjo6bmV3KFRUeXBlOjpJMTYsIDcpKQorICAgICAgICAgICAgLmlzX29rKCkpOworCisgICAgICAgIGxldCBleHBlY3RlZDogW3U4OyA1XSA9IFsweDA2LCAweDAwLCAweDAwLCAweDAwLCAweDA3XTsKKyAgICAgICAgYXNzZXJ0X2VxX3dyaXR0ZW5fYnl0ZXMhKG9fcHJvdCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JvdW5kX3RyaXBfc2V0X2JlZ2luKCkgeworICAgICAgICBsZXQgKG11dCBpX3Byb3QsIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKHRydWUpOworCisgICAgICAgIGxldCBpZGVudCA9IFRTZXRJZGVudGlmaWVyOjpuZXcoVFR5cGU6Okk2NCwgMjAwMCk7CisgICAgICAgIGFzc2VydCEob19wcm90LndyaXRlX3NldF9iZWdpbigmaWRlbnQpLmlzX29rKCkpOworCisgICAgICAgIGNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyIShvX3Byb3QpOworCisgICAgICAgIGxldCByZWNlaXZlZF9pZGVudF9yZXN1bHQgPSBpX3Byb3QucmVhZF9zZXRfYmVnaW4oKTsKKyAgICAgICAgYXNzZXJ0IShyZWNlaXZlZF9pZGVudF9yZXN1bHQuaXNfb2soKSk7CisgICAgICAgIGFzc2VydF9lcSEoJnJlY2VpdmVkX2lkZW50X3Jlc3VsdC51bndyYXAoKSwgJmlkZW50KTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9zZXRfZW5kKCkgeworICAgICAgICBhc3NlcnRfbm9fd3JpdGUofG98IG8ud3JpdGVfc2V0X2VuZCgpLCB0cnVlKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9tYXBfYmVnaW4oKSB7CisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHModHJ1ZSk7CisKKyAgICAgICAgYXNzZXJ0IShvX3Byb3QKKyAgICAgICAgICAgIC53cml0ZV9tYXBfYmVnaW4oJlRNYXBJZGVudGlmaWVyOjpuZXcoVFR5cGU6Okk2NCwgVFR5cGU6OlN0cnVjdCwgMzIpKQorICAgICAgICAgICAgLmlzX29rKCkpOworCisgICAgICAgIGxldCBleHBlY3RlZDogW3U4OyA2XSA9IFsweDBBLCAweDBDLCAweDAwLCAweDAwLCAweDAwLCAweDIwXTsKKyAgICAgICAgYXNzZXJ0X2VxX3dyaXR0ZW5fYnl0ZXMhKG9fcHJvdCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JvdW5kX3RyaXBfbWFwX2JlZ2luKCkgeworICAgICAgICBsZXQgKG11dCBpX3Byb3QsIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKHRydWUpOworCisgICAgICAgIGxldCBpZGVudCA9IFRNYXBJZGVudGlmaWVyOjpuZXcoVFR5cGU6Ok1hcCwgVFR5cGU6OlNldCwgMTAwKTsKKyAgICAgICAgYXNzZXJ0IShvX3Byb3Qud3JpdGVfbWFwX2JlZ2luKCZpZGVudCkuaXNfb2soKSk7CisKKyAgICAgICAgY29weV93cml0ZV9idWZmZXJfdG9fcmVhZF9idWZmZXIhKG9fcHJvdCk7CisKKyAgICAgICAgbGV0IHJlY2VpdmVkX2lkZW50ID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX21hcF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmcmVjZWl2ZWRfaWRlbnQsICZpZGVudCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfbWFwX2VuZCgpIHsKKyAgICAgICAgYXNzZXJ0X25vX3dyaXRlKHxvfCBvLndyaXRlX21hcF9lbmQoKSwgdHJ1ZSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfYm9vbF90cnVlKCkgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKHRydWUpOworCisgICAgICAgIGFzc2VydCEob19wcm90LndyaXRlX2Jvb2wodHJ1ZSkuaXNfb2soKSk7CisKKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDFdID0gWzB4MDFdOworICAgICAgICBhc3NlcnRfZXFfd3JpdHRlbl9ieXRlcyEob19wcm90LCBleHBlY3RlZCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfYm9vbF9mYWxzZSgpIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cyh0cnVlKTsKKworICAgICAgICBhc3NlcnQhKG9fcHJvdC53cml0ZV9ib29sKGZhbHNlKS5pc19vaygpKTsKKworICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgMV0gPSBbMHgwMF07CisgICAgICAgIGFzc2VydF9lcV93cml0dGVuX2J5dGVzIShvX3Byb3QsIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yZWFkX2Jvb2xfdHJ1ZSgpIHsKKyAgICAgICAgbGV0IChtdXQgaV9wcm90LCBfKSA9IHRlc3Rfb2JqZWN0cyh0cnVlKTsKKworICAgICAgICBzZXRfcmVhZGFibGVfYnl0ZXMhKGlfcHJvdCwgJlsweDAxXSk7CisKKyAgICAgICAgbGV0IHJlYWRfYm9vbCA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9ib29sKCkpOworICAgICAgICBhc3NlcnRfZXEhKHJlYWRfYm9vbCwgdHJ1ZSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfcmVhZF9ib29sX2ZhbHNlKCkgeworICAgICAgICBsZXQgKG11dCBpX3Byb3QsIF8pID0gdGVzdF9vYmplY3RzKHRydWUpOworCisgICAgICAgIHNldF9yZWFkYWJsZV9ieXRlcyEoaV9wcm90LCAmWzB4MDBdKTsKKworICAgICAgICBsZXQgcmVhZF9ib29sID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2Jvb2woKSk7CisgICAgICAgIGFzc2VydF9lcSEocmVhZF9ib29sLCBmYWxzZSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfYWxsb3dfYW55X25vbl96ZXJvX3ZhbHVlX3RvX2JlX2ludGVycHJldGVkX2FzX2Jvb2xfdHJ1ZSgpIHsKKyAgICAgICAgbGV0IChtdXQgaV9wcm90LCBfKSA9IHRlc3Rfb2JqZWN0cyh0cnVlKTsKKworICAgICAgICBzZXRfcmVhZGFibGVfYnl0ZXMhKGlfcHJvdCwgJlsweEFDXSk7CisKKyAgICAgICAgbGV0IHJlYWRfYm9vbCA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9ib29sKCkpOworICAgICAgICBhc3NlcnRfZXEhKHJlYWRfYm9vbCwgdHJ1ZSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfYnl0ZXMoKSB7CisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHModHJ1ZSk7CisKKyAgICAgICAgbGV0IGJ5dGVzOiBbdTg7IDEwXSA9IFsweDBBLCAweENDLCAweEQxLCAweDg0LCAweDk5LCAweDEyLCAweEFCLCAweEJCLCAweDQ1LCAweERGXTsKKworICAgICAgICBhc3NlcnQhKG9fcHJvdC53cml0ZV9ieXRlcygmYnl0ZXMpLmlzX29rKCkpOworCisgICAgICAgIGxldCBidWYgPSBvX3Byb3QudHJhbnNwb3J0LndyaXRlX2J5dGVzKCk7CisgICAgICAgIGFzc2VydF9lcSEoJmJ1ZlswLi40XSwgWzB4MDAsIDB4MDAsIDB4MDAsIDB4MEFdKTsgLy8gbGVuZ3RoCisgICAgICAgIGFzc2VydF9lcSEoJmJ1Zls0Li5dLCBieXRlcyk7IC8vIGFjdHVhbCBieXRlcworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JvdW5kX3RyaXBfYnl0ZXMoKSB7CisgICAgICAgIGxldCAobXV0IGlfcHJvdCwgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHModHJ1ZSk7CisKKyAgICAgICAgI1tjZmdfYXR0cihydXN0Zm10LCBydXN0Zm10Ojpza2lwKV0KKyAgICAgICAgbGV0IGJ5dGVzOiBbdTg7IDI1XSA9IFsKKyAgICAgICAgICAgIDB4MjAsCisgICAgICAgICAgICAweEZELAorICAgICAgICAgICAgMHgxOCwKKyAgICAgICAgICAgIDB4ODQsCisgICAgICAgICAgICAweDk5LAorICAgICAgICAgICAgMHgxMiwKKyAgICAgICAgICAgIDB4QUIsCisgICAgICAgICAgICAweEJCLAorICAgICAgICAgICAgMHg0NSwKKyAgICAgICAgICAgIDB4REYsCisgICAgICAgICAgICAweDM0LAorICAgICAgICAgICAgMHhEQywKKyAgICAgICAgICAgIDB4OTgsCisgICAgICAgICAgICAweEE0LAorICAgICAgICAgICAgMHg2RCwKKyAgICAgICAgICAgIDB4RjMsCisgICAgICAgICAgICAweDk5LAorICAgICAgICAgICAgMHhCNCwKKyAgICAgICAgICAgIDB4QjcsCisgICAgICAgICAgICAweEQ0LAorICAgICAgICAgICAgMHg5QywKKyAgICAgICAgICAgIDB4QTUsCisgICAgICAgICAgICAweEIzLAorICAgICAgICAgICAgMHhDOSwKKyAgICAgICAgICAgIDB4ODgsCisgICAgICAgIF07CisKKyAgICAgICAgYXNzZXJ0IShvX3Byb3Qud3JpdGVfYnl0ZXMoJmJ5dGVzKS5pc19vaygpKTsKKworICAgICAgICBjb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlciEob19wcm90KTsKKworICAgICAgICBsZXQgcmVjZWl2ZWRfYnl0ZXMgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfYnl0ZXMoKSk7CisgICAgICAgIGFzc2VydF9lcSEoJnJlY2VpdmVkX2J5dGVzLCAmYnl0ZXMpOworICAgIH0KKworICAgIGZuIHRlc3Rfb2JqZWN0cygKKyAgICAgICAgc3RyaWN0OiBib29sLAorICAgICkgLT4gKAorICAgICAgICBUQmluYXJ5SW5wdXRQcm90b2NvbDxSZWFkSGFsZjxUQnVmZmVyQ2hhbm5lbD4+LAorICAgICAgICBUQmluYXJ5T3V0cHV0UHJvdG9jb2w8V3JpdGVIYWxmPFRCdWZmZXJDaGFubmVsPj4sCisgICAgKSB7CisgICAgICAgIGxldCBtZW0gPSBUQnVmZmVyQ2hhbm5lbDo6d2l0aF9jYXBhY2l0eSg0MCwgNDApOworCisgICAgICAgIGxldCAocl9tZW0sIHdfbWVtKSA9IG1lbS5zcGxpdCgpLnVud3JhcCgpOworCisgICAgICAgIGxldCBpX3Byb3QgPSBUQmluYXJ5SW5wdXRQcm90b2NvbDo6bmV3KHJfbWVtLCBzdHJpY3QpOworICAgICAgICBsZXQgb19wcm90ID0gVEJpbmFyeU91dHB1dFByb3RvY29sOjpuZXcod19tZW0sIHN0cmljdCk7CisKKyAgICAgICAgKGlfcHJvdCwgb19wcm90KQorICAgIH0KKworICAgIGZuIGFzc2VydF9ub193cml0ZTxGPihtdXQgd3JpdGVfZm46IEYsIHN0cmljdDogYm9vbCkKKyAgICB3aGVyZQorICAgICAgICBGOiBGbk11dCgmbXV0IFRCaW5hcnlPdXRwdXRQcm90b2NvbDxXcml0ZUhhbGY8VEJ1ZmZlckNoYW5uZWw+PikgLT4gOjpSZXN1bHQ8KCk+LAorICAgIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cyhzdHJpY3QpOworICAgICAgICBhc3NlcnQhKHdyaXRlX2ZuKCZtdXQgb19wcm90KS5pc19vaygpKTsKKyAgICAgICAgYXNzZXJ0X2VxIShvX3Byb3QudHJhbnNwb3J0LndyaXRlX2J5dGVzKCkubGVuKCksIDApOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9ycy9zcmMvcHJvdG9jb2wvY29tcGFjdC5ycyBiL2xpYi9ycy9zcmMvcHJvdG9jb2wvY29tcGFjdC5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjVlZGFhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3JzL3NyYy9wcm90b2NvbC9jb21wYWN0LnJzCkBAIC0wLDAgKzEsMjM4NiBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2UgYnl0ZW9yZGVyOjp7QmlnRW5kaWFuLCBSZWFkQnl0ZXNFeHQsIFdyaXRlQnl0ZXNFeHR9OwordXNlIGludGVnZXJfZW5jb2Rpbmc6OntWYXJJbnRSZWFkZXIsIFZhckludFdyaXRlcn07Cit1c2Ugc3RkOjpjb252ZXJ0OjpGcm9tOwordXNlIHN0ZDo6aW87Cit1c2UgdHJ5X2Zyb206OlRyeUZyb207CisKK3VzZSBzdXBlcjo6eworICAgIFRGaWVsZElkZW50aWZpZXIsIFRJbnB1dFByb3RvY29sLCBUSW5wdXRQcm90b2NvbEZhY3RvcnksIFRMaXN0SWRlbnRpZmllciwgVE1hcElkZW50aWZpZXIsCisgICAgVE1lc3NhZ2VJZGVudGlmaWVyLCBUTWVzc2FnZVR5cGUsCit9OwordXNlIHN1cGVyOjp7VE91dHB1dFByb3RvY29sLCBUT3V0cHV0UHJvdG9jb2xGYWN0b3J5LCBUU2V0SWRlbnRpZmllciwgVFN0cnVjdElkZW50aWZpZXIsIFRUeXBlfTsKK3VzZSB0cmFuc3BvcnQ6OntUUmVhZFRyYW5zcG9ydCwgVFdyaXRlVHJhbnNwb3J0fTsKKworY29uc3QgQ09NUEFDVF9QUk9UT0NPTF9JRDogdTggPSAweDgyOworY29uc3QgQ09NUEFDVF9WRVJTSU9OOiB1OCA9IDB4MDE7Citjb25zdCBDT01QQUNUX1ZFUlNJT05fTUFTSzogdTggPSAweDFGOworCisvLy8gUmVhZCBtZXNzYWdlcyBlbmNvZGVkIGluIHRoZSBUaHJpZnQgY29tcGFjdCBwcm90b2NvbC4KKy8vLworLy8vICMgRXhhbXBsZXMKKy8vLworLy8vIENyZWF0ZSBhbmQgdXNlIGEgYFRDb21wYWN0SW5wdXRQcm90b2NvbGAuCisvLy8KKy8vLyBgYGBub19ydW4KKy8vLyB1c2UgdGhyaWZ0Ojpwcm90b2NvbDo6e1RDb21wYWN0SW5wdXRQcm90b2NvbCwgVElucHV0UHJvdG9jb2x9OworLy8vIHVzZSB0aHJpZnQ6OnRyYW5zcG9ydDo6VFRjcENoYW5uZWw7CisvLy8KKy8vLyBsZXQgbXV0IGNoYW5uZWwgPSBUVGNwQ2hhbm5lbDo6bmV3KCk7CisvLy8gY2hhbm5lbC5vcGVuKCJsb2NhbGhvc3Q6OTA5MCIpLnVud3JhcCgpOworLy8vCisvLy8gbGV0IG11dCBwcm90b2NvbCA9IFRDb21wYWN0SW5wdXRQcm90b2NvbDo6bmV3KGNoYW5uZWwpOworLy8vCisvLy8gbGV0IHJlY3ZkX2Jvb2wgPSBwcm90b2NvbC5yZWFkX2Jvb2woKS51bndyYXAoKTsKKy8vLyBsZXQgcmVjdmRfc3RyaW5nID0gcHJvdG9jb2wucmVhZF9zdHJpbmcoKS51bndyYXAoKTsKKy8vLyBgYGAKKyNbZGVyaXZlKERlYnVnKV0KK3B1YiBzdHJ1Y3QgVENvbXBhY3RJbnB1dFByb3RvY29sPFQ+Cit3aGVyZQorICAgIFQ6IFRSZWFkVHJhbnNwb3J0LAoreworICAgIC8vIElkZW50aWZpZXIgb2YgdGhlIGxhc3QgZmllbGQgZGVzZXJpYWxpemVkIGZvciBhIHN0cnVjdC4KKyAgICBsYXN0X3JlYWRfZmllbGRfaWQ6IGkxNiwKKyAgICAvLyBTdGFjayBvZiB0aGUgbGFzdCByZWFkIGZpZWxkIGlkcyAoYSBuZXcgZW50cnkgaXMgYWRkZWQgZWFjaCB0aW1lIGEgbmVzdGVkIHN0cnVjdCBpcyByZWFkKS4KKyAgICByZWFkX2ZpZWxkX2lkX3N0YWNrOiBWZWM8aTE2PiwKKyAgICAvLyBCb29sZWFuIHZhbHVlIGZvciBhIGZpZWxkLgorICAgIC8vIFNhdmVkIGJlY2F1c2UgYm9vbGVhbiBmaWVsZHMgYW5kIHRoZWlyIHZhbHVlIGFyZSBlbmNvZGVkIGluIGEgc2luZ2xlIGJ5dGUsCisgICAgLy8gYW5kIHJlYWRpbmcgdGhlIGZpZWxkIG9ubHkgb2NjdXJzIGFmdGVyIHRoZSBmaWVsZCBpZCBpcyByZWFkLgorICAgIHBlbmRpbmdfcmVhZF9ib29sX3ZhbHVlOiBPcHRpb248Ym9vbD4sCisgICAgLy8gVW5kZXJseWluZyB0cmFuc3BvcnQgdXNlZCBmb3IgYnl0ZS1sZXZlbCBvcGVyYXRpb25zLgorICAgIHRyYW5zcG9ydDogVCwKK30KKworaW1wbDxUPiBUQ29tcGFjdElucHV0UHJvdG9jb2w8VD4KK3doZXJlCisgICAgVDogVFJlYWRUcmFuc3BvcnQsCit7CisgICAgLy8vIENyZWF0ZSBhIGBUQ29tcGFjdElucHV0UHJvdG9jb2xgIHRoYXQgcmVhZHMgYnl0ZXMgZnJvbSBgdHJhbnNwb3J0YC4KKyAgICBwdWIgZm4gbmV3KHRyYW5zcG9ydDogVCkgLT4gVENvbXBhY3RJbnB1dFByb3RvY29sPFQ+IHsKKyAgICAgICAgVENvbXBhY3RJbnB1dFByb3RvY29sIHsKKyAgICAgICAgICAgIGxhc3RfcmVhZF9maWVsZF9pZDogMCwKKyAgICAgICAgICAgIHJlYWRfZmllbGRfaWRfc3RhY2s6IFZlYzo6bmV3KCksCisgICAgICAgICAgICBwZW5kaW5nX3JlYWRfYm9vbF92YWx1ZTogTm9uZSwKKyAgICAgICAgICAgIHRyYW5zcG9ydDogdHJhbnNwb3J0LAorICAgICAgICB9CisgICAgfQorCisgICAgZm4gcmVhZF9saXN0X3NldF9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PChUVHlwZSwgaTMyKT4geworICAgICAgICBsZXQgaGVhZGVyID0gc2VsZi5yZWFkX2J5dGUoKT87CisgICAgICAgIGxldCBlbGVtZW50X3R5cGUgPSBjb2xsZWN0aW9uX3U4X3RvX3R5cGUoaGVhZGVyICYgMHgwRik/OworCisgICAgICAgIGxldCBlbGVtZW50X2NvdW50OworICAgICAgICBsZXQgcG9zc2libGVfZWxlbWVudF9jb3VudCA9IChoZWFkZXIgJiAweEYwKSA+PiA0OworICAgICAgICBpZiBwb3NzaWJsZV9lbGVtZW50X2NvdW50ICE9IDE1IHsKKyAgICAgICAgICAgIC8vIGhpZ2ggYml0cyBzZXQgaGlnaCBpZiBjb3VudCBhbmQgdHlwZSBlbmNvZGVkIHNlcGFyYXRlbHkKKyAgICAgICAgICAgIGVsZW1lbnRfY291bnQgPSBwb3NzaWJsZV9lbGVtZW50X2NvdW50IGFzIGkzMjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGVsZW1lbnRfY291bnQgPSBzZWxmLnRyYW5zcG9ydC5yZWFkX3ZhcmludDo6PHUzMj4oKT8gYXMgaTMyOworICAgICAgICB9CisKKyAgICAgICAgT2soKGVsZW1lbnRfdHlwZSwgZWxlbWVudF9jb3VudCkpCisgICAgfQorfQorCitpbXBsPFQ+IFRJbnB1dFByb3RvY29sIGZvciBUQ29tcGFjdElucHV0UHJvdG9jb2w8VD4KK3doZXJlCisgICAgVDogVFJlYWRUcmFuc3BvcnQsCit7CisgICAgZm4gcmVhZF9tZXNzYWdlX2JlZ2luKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8VE1lc3NhZ2VJZGVudGlmaWVyPiB7CisgICAgICAgIGxldCBjb21wYWN0X2lkID0gc2VsZi5yZWFkX2J5dGUoKT87CisgICAgICAgIGlmIGNvbXBhY3RfaWQgIT0gQ09NUEFDVF9QUk9UT0NPTF9JRCB7CisgICAgICAgICAgICBFcnIoOjpFcnJvcjo6UHJvdG9jb2woOjpQcm90b2NvbEVycm9yIHsKKyAgICAgICAgICAgICAgICBraW5kOiA6OlByb3RvY29sRXJyb3JLaW5kOjpCYWRWZXJzaW9uLAorICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGZvcm1hdCEoImludmFsaWQgY29tcGFjdCBwcm90b2NvbCBoZWFkZXIgezo/fSIsIGNvbXBhY3RfaWQpLAorICAgICAgICAgICAgfSkpCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBPaygoKSkKKyAgICAgICAgfT87CisKKyAgICAgICAgbGV0IHR5cGVfYW5kX2J5dGUgPSBzZWxmLnJlYWRfYnl0ZSgpPzsKKyAgICAgICAgbGV0IHJlY2VpdmVkX3ZlcnNpb24gPSB0eXBlX2FuZF9ieXRlICYgQ09NUEFDVF9WRVJTSU9OX01BU0s7CisgICAgICAgIGlmIHJlY2VpdmVkX3ZlcnNpb24gIT0gQ09NUEFDVF9WRVJTSU9OIHsKKyAgICAgICAgICAgIEVycig6OkVycm9yOjpQcm90b2NvbCg6OlByb3RvY29sRXJyb3IgeworICAgICAgICAgICAgICAgIGtpbmQ6IDo6UHJvdG9jb2xFcnJvcktpbmQ6OkJhZFZlcnNpb24sCisgICAgICAgICAgICAgICAgbWVzc2FnZTogZm9ybWF0ISgKKyAgICAgICAgICAgICAgICAgICAgImNhbm5vdCBwcm9jZXNzIGNvbXBhY3QgcHJvdG9jb2wgdmVyc2lvbiB7Oj99IiwKKyAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZWRfdmVyc2lvbgorICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICB9KSkKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIE9rKCgpKQorICAgICAgICB9PzsKKworICAgICAgICAvLyBOT1RFOiB1bnNpZ25lZCByaWdodCBzaGlmdCB3aWxsIHBhZCB3aXRoIDBzCisgICAgICAgIGxldCBtZXNzYWdlX3R5cGU6IFRNZXNzYWdlVHlwZSA9IFRNZXNzYWdlVHlwZTo6dHJ5X2Zyb20odHlwZV9hbmRfYnl0ZSA+PiA1KT87CisgICAgICAgIGxldCBzZXF1ZW5jZV9udW1iZXIgPSBzZWxmLnJlYWRfaTMyKCk/OworICAgICAgICBsZXQgc2VydmljZV9jYWxsX25hbWUgPSBzZWxmLnJlYWRfc3RyaW5nKCk/OworCisgICAgICAgIHNlbGYubGFzdF9yZWFkX2ZpZWxkX2lkID0gMDsKKworICAgICAgICBPayhUTWVzc2FnZUlkZW50aWZpZXI6Om5ldygKKyAgICAgICAgICAgIHNlcnZpY2VfY2FsbF9uYW1lLAorICAgICAgICAgICAgbWVzc2FnZV90eXBlLAorICAgICAgICAgICAgc2VxdWVuY2VfbnVtYmVyLAorICAgICAgICApKQorICAgIH0KKworICAgIGZuIHJlYWRfbWVzc2FnZV9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICBmbiByZWFkX3N0cnVjdF9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PE9wdGlvbjxUU3RydWN0SWRlbnRpZmllcj4+IHsKKyAgICAgICAgc2VsZi5yZWFkX2ZpZWxkX2lkX3N0YWNrLnB1c2goc2VsZi5sYXN0X3JlYWRfZmllbGRfaWQpOworICAgICAgICBzZWxmLmxhc3RfcmVhZF9maWVsZF9pZCA9IDA7CisgICAgICAgIE9rKE5vbmUpCisgICAgfQorCisgICAgZm4gcmVhZF9zdHJ1Y3RfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5sYXN0X3JlYWRfZmllbGRfaWQgPSBzZWxmCisgICAgICAgICAgICAucmVhZF9maWVsZF9pZF9zdGFjaworICAgICAgICAgICAgLnBvcCgpCisgICAgICAgICAgICAuZXhwZWN0KCJzaG91bGQgaGF2ZSBwcmV2aW91cyBmaWVsZCBpZHMiKTsKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgZm4gcmVhZF9maWVsZF9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFRGaWVsZElkZW50aWZpZXI+IHsKKyAgICAgICAgLy8gd2UgY2FuIHJlYWQgYXQgbGVhc3Qgb25lIGJ5dGUsIHdoaWNoIGlzOgorICAgICAgICAvLyAtIHRoZSB0eXBlCisgICAgICAgIC8vIC0gdGhlIGZpZWxkIGRlbHRhIGFuZCB0aGUgdHlwZQorICAgICAgICBsZXQgZmllbGRfdHlwZSA9IHNlbGYucmVhZF9ieXRlKCk/OworICAgICAgICBsZXQgZmllbGRfZGVsdGEgPSAoZmllbGRfdHlwZSAmIDB4RjApID4+IDQ7CisgICAgICAgIGxldCBmaWVsZF90eXBlID0gbWF0Y2ggZmllbGRfdHlwZSAmIDB4MEYgeworICAgICAgICAgICAgMHgwMSA9PiB7CisgICAgICAgICAgICAgICAgc2VsZi5wZW5kaW5nX3JlYWRfYm9vbF92YWx1ZSA9IFNvbWUodHJ1ZSk7CisgICAgICAgICAgICAgICAgT2soVFR5cGU6OkJvb2wpCisgICAgICAgICAgICB9CisgICAgICAgICAgICAweDAyID0+IHsKKyAgICAgICAgICAgICAgICBzZWxmLnBlbmRpbmdfcmVhZF9ib29sX3ZhbHVlID0gU29tZShmYWxzZSk7CisgICAgICAgICAgICAgICAgT2soVFR5cGU6OkJvb2wpCisgICAgICAgICAgICB9CisgICAgICAgICAgICB0dHU4ID0+IHU4X3RvX3R5cGUodHR1OCksCisgICAgICAgIH0/OworCisgICAgICAgIG1hdGNoIGZpZWxkX3R5cGUgeworICAgICAgICAgICAgVFR5cGU6OlN0b3AgPT4gT2soCisgICAgICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllcjo6bmV3Ojo8T3B0aW9uPFN0cmluZz4sIFN0cmluZywgT3B0aW9uPGkxNj4+KAorICAgICAgICAgICAgICAgICAgICBOb25lLAorICAgICAgICAgICAgICAgICAgICBUVHlwZTo6U3RvcCwKKyAgICAgICAgICAgICAgICAgICAgTm9uZSwKKyAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgKSwKKyAgICAgICAgICAgIF8gPT4geworICAgICAgICAgICAgICAgIGlmIGZpZWxkX2RlbHRhICE9IDAgeworICAgICAgICAgICAgICAgICAgICBzZWxmLmxhc3RfcmVhZF9maWVsZF9pZCArPSBmaWVsZF9kZWx0YSBhcyBpMTY7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5sYXN0X3JlYWRfZmllbGRfaWQgPSBzZWxmLnJlYWRfaTE2KCk/OworICAgICAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgICAgICBPayhURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgZmllbGRfdHlwZTogZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgaWQ6IFNvbWUoc2VsZi5sYXN0X3JlYWRfZmllbGRfaWQpLAorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbiByZWFkX2ZpZWxkX2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIGZuIHJlYWRfYm9vbCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PGJvb2w+IHsKKyAgICAgICAgbWF0Y2ggc2VsZi5wZW5kaW5nX3JlYWRfYm9vbF92YWx1ZS50YWtlKCkgeworICAgICAgICAgICAgU29tZShiKSA9PiBPayhiKSwKKyAgICAgICAgICAgIE5vbmUgPT4geworICAgICAgICAgICAgICAgIGxldCBiID0gc2VsZi5yZWFkX2J5dGUoKT87CisgICAgICAgICAgICAgICAgbWF0Y2ggYiB7CisgICAgICAgICAgICAgICAgICAgIDB4MDEgPT4gT2sodHJ1ZSksCisgICAgICAgICAgICAgICAgICAgIDB4MDIgPT4gT2soZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICB1bmtuID0+IEVycig6OkVycm9yOjpQcm90b2NvbCg6OlByb3RvY29sRXJyb3IgeworICAgICAgICAgICAgICAgICAgICAgICAga2luZDogOjpQcm90b2NvbEVycm9yS2luZDo6SW52YWxpZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBmb3JtYXQhKCJjYW5ub3QgY29udmVydCB7fSBpbnRvIGJvb2wiLCB1bmtuKSwKKyAgICAgICAgICAgICAgICAgICAgfSkpLAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGZuIHJlYWRfYnl0ZXMoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxWZWM8dTg+PiB7CisgICAgICAgIGxldCBsZW4gPSBzZWxmLnRyYW5zcG9ydC5yZWFkX3ZhcmludDo6PHUzMj4oKT87CisgICAgICAgIGxldCBtdXQgYnVmID0gdmVjIVswdTg7IGxlbiBhcyB1c2l6ZV07CisgICAgICAgIHNlbGYudHJhbnNwb3J0CisgICAgICAgICAgICAucmVhZF9leGFjdCgmbXV0IGJ1ZikKKyAgICAgICAgICAgIC5tYXBfZXJyKEZyb206OmZyb20pCisgICAgICAgICAgICAubWFwKHxffCBidWYpCisgICAgfQorCisgICAgZm4gcmVhZF9pOCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PGk4PiB7CisgICAgICAgIHNlbGYucmVhZF9ieXRlKCkubWFwKHxpfCBpIGFzIGk4KQorICAgIH0KKworICAgIGZuIHJlYWRfaTE2KCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8aTE2PiB7CisgICAgICAgIHNlbGYudHJhbnNwb3J0LnJlYWRfdmFyaW50Ojo8aTE2PigpLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICB9CisKKyAgICBmbiByZWFkX2kzMigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PGkzMj4geworICAgICAgICBzZWxmLnRyYW5zcG9ydC5yZWFkX3ZhcmludDo6PGkzMj4oKS5tYXBfZXJyKEZyb206OmZyb20pCisgICAgfQorCisgICAgZm4gcmVhZF9pNjQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxpNjQ+IHsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQucmVhZF92YXJpbnQ6OjxpNjQ+KCkubWFwX2VycihGcm9tOjpmcm9tKQorICAgIH0KKworICAgIGZuIHJlYWRfZG91YmxlKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8ZjY0PiB7CisgICAgICAgIHNlbGYudHJhbnNwb3J0LnJlYWRfZjY0Ojo8QmlnRW5kaWFuPigpLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICB9CisKKyAgICBmbiByZWFkX3N0cmluZygmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFN0cmluZz4geworICAgICAgICBsZXQgYnl0ZXMgPSBzZWxmLnJlYWRfYnl0ZXMoKT87CisgICAgICAgIFN0cmluZzo6ZnJvbV91dGY4KGJ5dGVzKS5tYXBfZXJyKEZyb206OmZyb20pCisgICAgfQorCisgICAgZm4gcmVhZF9saXN0X2JlZ2luKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8VExpc3RJZGVudGlmaWVyPiB7CisgICAgICAgIGxldCAoZWxlbWVudF90eXBlLCBlbGVtZW50X2NvdW50KSA9IHNlbGYucmVhZF9saXN0X3NldF9iZWdpbigpPzsKKyAgICAgICAgT2soVExpc3RJZGVudGlmaWVyOjpuZXcoZWxlbWVudF90eXBlLCBlbGVtZW50X2NvdW50KSkKKyAgICB9CisKKyAgICBmbiByZWFkX2xpc3RfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgZm4gcmVhZF9zZXRfYmVnaW4oJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxUU2V0SWRlbnRpZmllcj4geworICAgICAgICBsZXQgKGVsZW1lbnRfdHlwZSwgZWxlbWVudF9jb3VudCkgPSBzZWxmLnJlYWRfbGlzdF9zZXRfYmVnaW4oKT87CisgICAgICAgIE9rKFRTZXRJZGVudGlmaWVyOjpuZXcoZWxlbWVudF90eXBlLCBlbGVtZW50X2NvdW50KSkKKyAgICB9CisKKyAgICBmbiByZWFkX3NldF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICBmbiByZWFkX21hcF9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFRNYXBJZGVudGlmaWVyPiB7CisgICAgICAgIGxldCBlbGVtZW50X2NvdW50ID0gc2VsZi50cmFuc3BvcnQucmVhZF92YXJpbnQ6Ojx1MzI+KCk/IGFzIGkzMjsKKyAgICAgICAgaWYgZWxlbWVudF9jb3VudCA9PSAwIHsKKyAgICAgICAgICAgIE9rKFRNYXBJZGVudGlmaWVyOjpuZXcoTm9uZSwgTm9uZSwgMCkpCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsZXQgdHlwZV9oZWFkZXIgPSBzZWxmLnJlYWRfYnl0ZSgpPzsKKyAgICAgICAgICAgIGxldCBrZXlfdHlwZSA9IGNvbGxlY3Rpb25fdThfdG9fdHlwZSgodHlwZV9oZWFkZXIgJiAweEYwKSA+PiA0KT87CisgICAgICAgICAgICBsZXQgdmFsX3R5cGUgPSBjb2xsZWN0aW9uX3U4X3RvX3R5cGUodHlwZV9oZWFkZXIgJiAweDBGKT87CisgICAgICAgICAgICBPayhUTWFwSWRlbnRpZmllcjo6bmV3KGtleV90eXBlLCB2YWxfdHlwZSwgZWxlbWVudF9jb3VudCkpCisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbiByZWFkX21hcF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICAvLyB1dGlsaXR5CisgICAgLy8KKworICAgIGZuIHJlYWRfYnl0ZSgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PHU4PiB7CisgICAgICAgIGxldCBtdXQgYnVmID0gWzB1ODsgMV07CisgICAgICAgIHNlbGYudHJhbnNwb3J0CisgICAgICAgICAgICAucmVhZF9leGFjdCgmbXV0IGJ1ZikKKyAgICAgICAgICAgIC5tYXBfZXJyKEZyb206OmZyb20pCisgICAgICAgICAgICAubWFwKHxffCBidWZbMF0pCisgICAgfQorfQorCitpbXBsPFQ+IGlvOjpTZWVrIGZvciBUQ29tcGFjdElucHV0UHJvdG9jb2w8VD4KK3doZXJlCisgICAgVDogaW86OlNlZWsgKyBUUmVhZFRyYW5zcG9ydCwKK3sKKyAgICBmbiBzZWVrKCZtdXQgc2VsZiwgcG9zOiBpbzo6U2Vla0Zyb20pIC0+IGlvOjpSZXN1bHQ8dTY0PiB7CisgICAgICAgIHNlbGYudHJhbnNwb3J0LnNlZWsocG9zKQorICAgIH0KK30KKworLy8vIEZhY3RvcnkgZm9yIGNyZWF0aW5nIGluc3RhbmNlcyBvZiBgVENvbXBhY3RJbnB1dFByb3RvY29sYC4KKyNbZGVyaXZlKERlZmF1bHQpXQorcHViIHN0cnVjdCBUQ29tcGFjdElucHV0UHJvdG9jb2xGYWN0b3J5OworCitpbXBsIFRDb21wYWN0SW5wdXRQcm90b2NvbEZhY3RvcnkgeworICAgIC8vLyBDcmVhdGUgYSBgVENvbXBhY3RJbnB1dFByb3RvY29sRmFjdG9yeWAuCisgICAgcHViIGZuIG5ldygpIC0+IFRDb21wYWN0SW5wdXRQcm90b2NvbEZhY3RvcnkgeworICAgICAgICBUQ29tcGFjdElucHV0UHJvdG9jb2xGYWN0b3J5IHt9CisgICAgfQorfQorCitpbXBsIFRJbnB1dFByb3RvY29sRmFjdG9yeSBmb3IgVENvbXBhY3RJbnB1dFByb3RvY29sRmFjdG9yeSB7CisgICAgZm4gY3JlYXRlKCZzZWxmLCB0cmFuc3BvcnQ6IEJveDxUUmVhZFRyYW5zcG9ydCArIFNlbmQ+KSAtPiBCb3g8VElucHV0UHJvdG9jb2wgKyBTZW5kPiB7CisgICAgICAgIEJveDo6bmV3KFRDb21wYWN0SW5wdXRQcm90b2NvbDo6bmV3KHRyYW5zcG9ydCkpCisgICAgfQorfQorCisvLy8gV3JpdGUgbWVzc2FnZXMgdXNpbmcgdGhlIFRocmlmdCBjb21wYWN0IHByb3RvY29sLgorLy8vCisvLy8gIyBFeGFtcGxlcworLy8vCisvLy8gQ3JlYXRlIGFuZCB1c2UgYSBgVENvbXBhY3RPdXRwdXRQcm90b2NvbGAuCisvLy8KKy8vLyBgYGBub19ydW4KKy8vLyB1c2UgdGhyaWZ0Ojpwcm90b2NvbDo6e1RDb21wYWN0T3V0cHV0UHJvdG9jb2wsIFRPdXRwdXRQcm90b2NvbH07CisvLy8gdXNlIHRocmlmdDo6dHJhbnNwb3J0OjpUVGNwQ2hhbm5lbDsKKy8vLworLy8vIGxldCBtdXQgY2hhbm5lbCA9IFRUY3BDaGFubmVsOjpuZXcoKTsKKy8vLyBjaGFubmVsLm9wZW4oImxvY2FsaG9zdDo5MDkwIikudW53cmFwKCk7CisvLy8KKy8vLyBsZXQgbXV0IHByb3RvY29sID0gVENvbXBhY3RPdXRwdXRQcm90b2NvbDo6bmV3KGNoYW5uZWwpOworLy8vCisvLy8gcHJvdG9jb2wud3JpdGVfYm9vbCh0cnVlKS51bndyYXAoKTsKKy8vLyBwcm90b2NvbC53cml0ZV9zdHJpbmcoInRlc3Rfc3RyaW5nIikudW53cmFwKCk7CisvLy8gYGBgCisjW2Rlcml2ZShEZWJ1ZyldCitwdWIgc3RydWN0IFRDb21wYWN0T3V0cHV0UHJvdG9jb2w8VD4KK3doZXJlCisgICAgVDogVFdyaXRlVHJhbnNwb3J0LAoreworICAgIC8vIElkZW50aWZpZXIgb2YgdGhlIGxhc3QgZmllbGQgc2VyaWFsaXplZCBmb3IgYSBzdHJ1Y3QuCisgICAgbGFzdF93cml0ZV9maWVsZF9pZDogaTE2LAorICAgIC8vIFN0YWNrIG9mIHRoZSBsYXN0IHdyaXR0ZW4gZmllbGQgaWRzIChuZXcgZW50cnkgYWRkZWQgZWFjaCB0aW1lIGEgbmVzdGVkIHN0cnVjdCBpcyB3cml0dGVuKS4KKyAgICB3cml0ZV9maWVsZF9pZF9zdGFjazogVmVjPGkxNj4sCisgICAgLy8gRmllbGQgaWRlbnRpZmllciBvZiB0aGUgYm9vbGVhbiBmaWVsZCB0byBiZSB3cml0dGVuLgorICAgIC8vIFNhdmVkIGJlY2F1c2UgYm9vbGVhbiBmaWVsZHMgYW5kIHRoZWlyIHZhbHVlIGFyZSBlbmNvZGVkIGluIGEgc2luZ2xlIGJ5dGUKKyAgICBwZW5kaW5nX3dyaXRlX2Jvb2xfZmllbGRfaWRlbnRpZmllcjogT3B0aW9uPFRGaWVsZElkZW50aWZpZXI+LAorICAgIC8vIFVuZGVybHlpbmcgdHJhbnNwb3J0IHVzZWQgZm9yIGJ5dGUtbGV2ZWwgb3BlcmF0aW9ucy4KKyAgICB0cmFuc3BvcnQ6IFQsCit9CisKK2ltcGw8VD4gVENvbXBhY3RPdXRwdXRQcm90b2NvbDxUPgord2hlcmUKKyAgICBUOiBUV3JpdGVUcmFuc3BvcnQsCit7CisgICAgLy8vIENyZWF0ZSBhIGBUQ29tcGFjdE91dHB1dFByb3RvY29sYCB0aGF0IHdyaXRlcyBieXRlcyB0byBgdHJhbnNwb3J0YC4KKyAgICBwdWIgZm4gbmV3KHRyYW5zcG9ydDogVCkgLT4gVENvbXBhY3RPdXRwdXRQcm90b2NvbDxUPiB7CisgICAgICAgIFRDb21wYWN0T3V0cHV0UHJvdG9jb2wgeworICAgICAgICAgICAgbGFzdF93cml0ZV9maWVsZF9pZDogMCwKKyAgICAgICAgICAgIHdyaXRlX2ZpZWxkX2lkX3N0YWNrOiBWZWM6Om5ldygpLAorICAgICAgICAgICAgcGVuZGluZ193cml0ZV9ib29sX2ZpZWxkX2lkZW50aWZpZXI6IE5vbmUsCisgICAgICAgICAgICB0cmFuc3BvcnQ6IHRyYW5zcG9ydCwKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEZJWE1FOiBmaWVsZF90eXBlIGFzIHVuY29uc3RyYWluZWQgdTggaXMgYmFkCisgICAgZm4gd3JpdGVfZmllbGRfaGVhZGVyKCZtdXQgc2VsZiwgZmllbGRfdHlwZTogdTgsIGZpZWxkX2lkOiBpMTYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIGxldCBmaWVsZF9kZWx0YSA9IGZpZWxkX2lkIC0gc2VsZi5sYXN0X3dyaXRlX2ZpZWxkX2lkOworICAgICAgICBpZiBmaWVsZF9kZWx0YSA+IDAgJiYgZmllbGRfZGVsdGEgPCAxNSB7CisgICAgICAgICAgICBzZWxmLndyaXRlX2J5dGUoKChmaWVsZF9kZWx0YSBhcyB1OCkgPDwgNCkgfCBmaWVsZF90eXBlKT87CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZWxmLndyaXRlX2J5dGUoZmllbGRfdHlwZSk/OworICAgICAgICAgICAgc2VsZi53cml0ZV9pMTYoZmllbGRfaWQpPzsKKyAgICAgICAgfQorICAgICAgICBzZWxmLmxhc3Rfd3JpdGVfZmllbGRfaWQgPSBmaWVsZF9pZDsKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgZm4gd3JpdGVfbGlzdF9zZXRfYmVnaW4oJm11dCBzZWxmLCBlbGVtZW50X3R5cGU6IFRUeXBlLCBlbGVtZW50X2NvdW50OiBpMzIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIGxldCBlbGVtX2lkZW50aWZpZXIgPSBjb2xsZWN0aW9uX3R5cGVfdG9fdTgoZWxlbWVudF90eXBlKTsKKyAgICAgICAgaWYgZWxlbWVudF9jb3VudCA8PSAxNCB7CisgICAgICAgICAgICBsZXQgaGVhZGVyID0gKGVsZW1lbnRfY291bnQgYXMgdTgpIDw8IDQgfCBlbGVtX2lkZW50aWZpZXI7CisgICAgICAgICAgICBzZWxmLndyaXRlX2J5dGUoaGVhZGVyKQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbGV0IGhlYWRlciA9IDB4RjAgfCBlbGVtX2lkZW50aWZpZXI7CisgICAgICAgICAgICBzZWxmLndyaXRlX2J5dGUoaGVhZGVyKT87CisgICAgICAgICAgICBzZWxmLnRyYW5zcG9ydAorICAgICAgICAgICAgICAgIC53cml0ZV92YXJpbnQoZWxlbWVudF9jb3VudCBhcyB1MzIpCisgICAgICAgICAgICAgICAgLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICAgICAgICAgICAgICAubWFwKHxffCAoKSkKKyAgICAgICAgfQorICAgIH0KKworICAgIGZuIGFzc2VydF9ub19wZW5kaW5nX2Jvb2xfd3JpdGUoJnNlbGYpIHsKKyAgICAgICAgaWYgbGV0IFNvbWUocmVmIGYpID0gc2VsZi5wZW5kaW5nX3dyaXRlX2Jvb2xfZmllbGRfaWRlbnRpZmllciB7CisgICAgICAgICAgICBwYW5pYyEoInBlbmRpbmcgYm9vbCBmaWVsZCB7Oj99IG5vdCB3cml0dGVuIiwgZikKKyAgICAgICAgfQorICAgIH0KK30KKworaW1wbDxUPiBUT3V0cHV0UHJvdG9jb2wgZm9yIFRDb21wYWN0T3V0cHV0UHJvdG9jb2w8VD4KK3doZXJlCisgICAgVDogVFdyaXRlVHJhbnNwb3J0LAoreworICAgIGZuIHdyaXRlX21lc3NhZ2VfYmVnaW4oJm11dCBzZWxmLCBpZGVudGlmaWVyOiAmVE1lc3NhZ2VJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLndyaXRlX2J5dGUoQ09NUEFDVF9QUk9UT0NPTF9JRCk/OworICAgICAgICBzZWxmLndyaXRlX2J5dGUoKHU4Ojpmcm9tKGlkZW50aWZpZXIubWVzc2FnZV90eXBlKSA8PCA1KSB8IENPTVBBQ1RfVkVSU0lPTik/OworICAgICAgICBzZWxmLndyaXRlX2kzMihpZGVudGlmaWVyLnNlcXVlbmNlX251bWJlcik/OworICAgICAgICBzZWxmLndyaXRlX3N0cmluZygmaWRlbnRpZmllci5uYW1lKT87CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIGZuIHdyaXRlX21lc3NhZ2VfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5hc3NlcnRfbm9fcGVuZGluZ19ib29sX3dyaXRlKCk7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIGZuIHdyaXRlX3N0cnVjdF9iZWdpbigmbXV0IHNlbGYsIF86ICZUU3RydWN0SWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi53cml0ZV9maWVsZF9pZF9zdGFjay5wdXNoKHNlbGYubGFzdF93cml0ZV9maWVsZF9pZCk7CisgICAgICAgIHNlbGYubGFzdF93cml0ZV9maWVsZF9pZCA9IDA7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIGZuIHdyaXRlX3N0cnVjdF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmFzc2VydF9ub19wZW5kaW5nX2Jvb2xfd3JpdGUoKTsKKyAgICAgICAgc2VsZi5sYXN0X3dyaXRlX2ZpZWxkX2lkID0gc2VsZgorICAgICAgICAgICAgLndyaXRlX2ZpZWxkX2lkX3N0YWNrCisgICAgICAgICAgICAucG9wKCkKKyAgICAgICAgICAgIC5leHBlY3QoInNob3VsZCBoYXZlIHByZXZpb3VzIGZpZWxkIGlkcyIpOworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9maWVsZF9iZWdpbigmbXV0IHNlbGYsIGlkZW50aWZpZXI6ICZURmllbGRJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBtYXRjaCBpZGVudGlmaWVyLmZpZWxkX3R5cGUgeworICAgICAgICAgICAgVFR5cGU6OkJvb2wgPT4geworICAgICAgICAgICAgICAgIGlmIHNlbGYucGVuZGluZ193cml0ZV9ib29sX2ZpZWxkX2lkZW50aWZpZXIuaXNfc29tZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgcGFuaWMhKAorICAgICAgICAgICAgICAgICAgICAgICAgInNob3VsZCBub3QgaGF2ZSBhIHBlbmRpbmcgYm9vbCB3aGlsZSB3cml0aW5nIGFub3RoZXIgYm9vbCB3aXRoIGlkOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgezo/fSIsCisgICAgICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVyCisgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2VsZi5wZW5kaW5nX3dyaXRlX2Jvb2xfZmllbGRfaWRlbnRpZmllciA9IFNvbWUoaWRlbnRpZmllci5jbG9uZSgpKTsKKyAgICAgICAgICAgICAgICBPaygoKSkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF8gPT4geworICAgICAgICAgICAgICAgIGxldCBmaWVsZF90eXBlID0gdHlwZV90b191OChpZGVudGlmaWVyLmZpZWxkX3R5cGUpOworICAgICAgICAgICAgICAgIGxldCBmaWVsZF9pZCA9IGlkZW50aWZpZXIuaWQuZXhwZWN0KCJub24tc3RvcCBmaWVsZCBzaG91bGQgaGF2ZSBmaWVsZCBpZCIpOworICAgICAgICAgICAgICAgIHNlbGYud3JpdGVfZmllbGRfaGVhZGVyKGZpZWxkX3R5cGUsIGZpZWxkX2lkKQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZm4gd3JpdGVfZmllbGRfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5hc3NlcnRfbm9fcGVuZGluZ19ib29sX3dyaXRlKCk7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIGZuIHdyaXRlX2ZpZWxkX3N0b3AoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmFzc2VydF9ub19wZW5kaW5nX2Jvb2xfd3JpdGUoKTsKKyAgICAgICAgc2VsZi53cml0ZV9ieXRlKHR5cGVfdG9fdTgoVFR5cGU6OlN0b3ApKQorICAgIH0KKworICAgIGZuIHdyaXRlX2Jvb2woJm11dCBzZWxmLCBiOiBib29sKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBtYXRjaCBzZWxmLnBlbmRpbmdfd3JpdGVfYm9vbF9maWVsZF9pZGVudGlmaWVyLnRha2UoKSB7CisgICAgICAgICAgICBTb21lKHBlbmRpbmcpID0+IHsKKyAgICAgICAgICAgICAgICBsZXQgZmllbGRfaWQgPSBwZW5kaW5nLmlkLmV4cGVjdCgiYm9vbCBmaWVsZCBzaG91bGQgaGF2ZSBhIGZpZWxkIGlkIik7CisgICAgICAgICAgICAgICAgbGV0IGZpZWxkX3R5cGVfYXNfdTggPSBpZiBiIHsgMHgwMSB9IGVsc2UgeyAweDAyIH07CisgICAgICAgICAgICAgICAgc2VsZi53cml0ZV9maWVsZF9oZWFkZXIoZmllbGRfdHlwZV9hc191OCwgZmllbGRfaWQpCisgICAgICAgICAgICB9CisgICAgICAgICAgICBOb25lID0+IHsKKyAgICAgICAgICAgICAgICBpZiBiIHsKKyAgICAgICAgICAgICAgICAgICAgc2VsZi53cml0ZV9ieXRlKDB4MDEpCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc2VsZi53cml0ZV9ieXRlKDB4MDIpCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZm4gd3JpdGVfYnl0ZXMoJm11dCBzZWxmLCBiOiAmW3U4XSkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQud3JpdGVfdmFyaW50KGIubGVuKCkgYXMgdTMyKT87CisgICAgICAgIHNlbGYudHJhbnNwb3J0LndyaXRlX2FsbChiKS5tYXBfZXJyKEZyb206OmZyb20pCisgICAgfQorCisgICAgZm4gd3JpdGVfaTgoJm11dCBzZWxmLCBpOiBpOCkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi53cml0ZV9ieXRlKGkgYXMgdTgpCisgICAgfQorCisgICAgZm4gd3JpdGVfaTE2KCZtdXQgc2VsZiwgaTogaTE2KSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLnRyYW5zcG9ydAorICAgICAgICAgICAgLndyaXRlX3ZhcmludChpKQorICAgICAgICAgICAgLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICAgICAgICAgIC5tYXAofF98ICgpKQorICAgIH0KKworICAgIGZuIHdyaXRlX2kzMigmbXV0IHNlbGYsIGk6IGkzMikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQKKyAgICAgICAgICAgIC53cml0ZV92YXJpbnQoaSkKKyAgICAgICAgICAgIC5tYXBfZXJyKEZyb206OmZyb20pCisgICAgICAgICAgICAubWFwKHxffCAoKSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9pNjQoJm11dCBzZWxmLCBpOiBpNjQpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYudHJhbnNwb3J0CisgICAgICAgICAgICAud3JpdGVfdmFyaW50KGkpCisgICAgICAgICAgICAubWFwX2VycihGcm9tOjpmcm9tKQorICAgICAgICAgICAgLm1hcCh8X3wgKCkpCisgICAgfQorCisgICAgZm4gd3JpdGVfZG91YmxlKCZtdXQgc2VsZiwgZDogZjY0KSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLnRyYW5zcG9ydC53cml0ZV9mNjQ6OjxCaWdFbmRpYW4+KGQpLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9zdHJpbmcoJm11dCBzZWxmLCBzOiAmc3RyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLndyaXRlX2J5dGVzKHMuYXNfYnl0ZXMoKSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9saXN0X2JlZ2luKCZtdXQgc2VsZiwgaWRlbnRpZmllcjogJlRMaXN0SWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi53cml0ZV9saXN0X3NldF9iZWdpbihpZGVudGlmaWVyLmVsZW1lbnRfdHlwZSwgaWRlbnRpZmllci5zaXplKQorICAgIH0KKworICAgIGZuIHdyaXRlX2xpc3RfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgZm4gd3JpdGVfc2V0X2JlZ2luKCZtdXQgc2VsZiwgaWRlbnRpZmllcjogJlRTZXRJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLndyaXRlX2xpc3Rfc2V0X2JlZ2luKGlkZW50aWZpZXIuZWxlbWVudF90eXBlLCBpZGVudGlmaWVyLnNpemUpCisgICAgfQorCisgICAgZm4gd3JpdGVfc2V0X2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIGZuIHdyaXRlX21hcF9iZWdpbigmbXV0IHNlbGYsIGlkZW50aWZpZXI6ICZUTWFwSWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgaWYgaWRlbnRpZmllci5zaXplID09IDAgeworICAgICAgICAgICAgc2VsZi53cml0ZV9ieXRlKDApCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZWxmLnRyYW5zcG9ydC53cml0ZV92YXJpbnQoaWRlbnRpZmllci5zaXplIGFzIHUzMik/OworCisgICAgICAgICAgICBsZXQga2V5X3R5cGUgPSBpZGVudGlmaWVyCisgICAgICAgICAgICAgICAgLmtleV90eXBlCisgICAgICAgICAgICAgICAgLmV4cGVjdCgibWFwIGlkZW50aWZpZXIgdG8gd3JpdGUgc2hvdWxkIGNvbnRhaW4ga2V5IHR5cGUiKTsKKyAgICAgICAgICAgIGxldCBrZXlfdHlwZV9ieXRlID0gY29sbGVjdGlvbl90eXBlX3RvX3U4KGtleV90eXBlKSA8PCA0OworCisgICAgICAgICAgICBsZXQgdmFsX3R5cGUgPSBpZGVudGlmaWVyCisgICAgICAgICAgICAgICAgLnZhbHVlX3R5cGUKKyAgICAgICAgICAgICAgICAuZXhwZWN0KCJtYXAgaWRlbnRpZmllciB0byB3cml0ZSBzaG91bGQgY29udGFpbiB2YWx1ZSB0eXBlIik7CisgICAgICAgICAgICBsZXQgdmFsX3R5cGVfYnl0ZSA9IGNvbGxlY3Rpb25fdHlwZV90b191OCh2YWxfdHlwZSk7CisKKyAgICAgICAgICAgIGxldCBtYXBfdHlwZV9oZWFkZXIgPSBrZXlfdHlwZV9ieXRlIHwgdmFsX3R5cGVfYnl0ZTsKKyAgICAgICAgICAgIHNlbGYud3JpdGVfYnl0ZShtYXBfdHlwZV9oZWFkZXIpCisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbiB3cml0ZV9tYXBfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgZm4gZmx1c2goJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLnRyYW5zcG9ydC5mbHVzaCgpLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICB9CisKKyAgICAvLyB1dGlsaXR5CisgICAgLy8KKworICAgIGZuIHdyaXRlX2J5dGUoJm11dCBzZWxmLCBiOiB1OCkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQud3JpdGUoJltiXSkubWFwX2VycihGcm9tOjpmcm9tKS5tYXAofF98ICgpKQorICAgIH0KK30KKworLy8vIEZhY3RvcnkgZm9yIGNyZWF0aW5nIGluc3RhbmNlcyBvZiBgVENvbXBhY3RPdXRwdXRQcm90b2NvbGAuCisjW2Rlcml2ZShEZWZhdWx0KV0KK3B1YiBzdHJ1Y3QgVENvbXBhY3RPdXRwdXRQcm90b2NvbEZhY3Rvcnk7CisKK2ltcGwgVENvbXBhY3RPdXRwdXRQcm90b2NvbEZhY3RvcnkgeworICAgIC8vLyBDcmVhdGUgYSBgVENvbXBhY3RPdXRwdXRQcm90b2NvbEZhY3RvcnlgLgorICAgIHB1YiBmbiBuZXcoKSAtPiBUQ29tcGFjdE91dHB1dFByb3RvY29sRmFjdG9yeSB7CisgICAgICAgIFRDb21wYWN0T3V0cHV0UHJvdG9jb2xGYWN0b3J5IHt9CisgICAgfQorfQorCitpbXBsIFRPdXRwdXRQcm90b2NvbEZhY3RvcnkgZm9yIFRDb21wYWN0T3V0cHV0UHJvdG9jb2xGYWN0b3J5IHsKKyAgICBmbiBjcmVhdGUoJnNlbGYsIHRyYW5zcG9ydDogQm94PFRXcml0ZVRyYW5zcG9ydCArIFNlbmQ+KSAtPiBCb3g8VE91dHB1dFByb3RvY29sICsgU2VuZD4geworICAgICAgICBCb3g6Om5ldyhUQ29tcGFjdE91dHB1dFByb3RvY29sOjpuZXcodHJhbnNwb3J0KSkKKyAgICB9Cit9CisKK2ZuIGNvbGxlY3Rpb25fdHlwZV90b191OChmaWVsZF90eXBlOiBUVHlwZSkgLT4gdTggeworICAgIG1hdGNoIGZpZWxkX3R5cGUgeworICAgICAgICBUVHlwZTo6Qm9vbCA9PiAweDAxLAorICAgICAgICBmID0+IHR5cGVfdG9fdTgoZiksCisgICAgfQorfQorCitmbiB0eXBlX3RvX3U4KGZpZWxkX3R5cGU6IFRUeXBlKSAtPiB1OCB7CisgICAgbWF0Y2ggZmllbGRfdHlwZSB7CisgICAgICAgIFRUeXBlOjpTdG9wID0+IDB4MDAsCisgICAgICAgIFRUeXBlOjpJMDggPT4gMHgwMywgLy8gZXF1aXZhbGVudCB0byBUVHlwZTo6Qnl0ZQorICAgICAgICBUVHlwZTo6STE2ID0+IDB4MDQsCisgICAgICAgIFRUeXBlOjpJMzIgPT4gMHgwNSwKKyAgICAgICAgVFR5cGU6Okk2NCA9PiAweDA2LAorICAgICAgICBUVHlwZTo6RG91YmxlID0+IDB4MDcsCisgICAgICAgIFRUeXBlOjpTdHJpbmcgPT4gMHgwOCwKKyAgICAgICAgVFR5cGU6Okxpc3QgPT4gMHgwOSwKKyAgICAgICAgVFR5cGU6OlNldCA9PiAweDBBLAorICAgICAgICBUVHlwZTo6TWFwID0+IDB4MEIsCisgICAgICAgIFRUeXBlOjpTdHJ1Y3QgPT4gMHgwQywKKyAgICAgICAgXyA9PiBwYW5pYyEoZm9ybWF0ISgKKyAgICAgICAgICAgICJzaG91bGQgbm90IGhhdmUgYXR0ZW1wdGVkIHRvIGNvbnZlcnQge30gdG8gdTgiLAorICAgICAgICAgICAgZmllbGRfdHlwZQorICAgICAgICApKSwKKyAgICB9Cit9CisKK2ZuIGNvbGxlY3Rpb25fdThfdG9fdHlwZShiOiB1OCkgLT4gOjpSZXN1bHQ8VFR5cGU+IHsKKyAgICBtYXRjaCBiIHsKKyAgICAgICAgMHgwMSA9PiBPayhUVHlwZTo6Qm9vbCksCisgICAgICAgIG8gPT4gdThfdG9fdHlwZShvKSwKKyAgICB9Cit9CisKK2ZuIHU4X3RvX3R5cGUoYjogdTgpIC0+IDo6UmVzdWx0PFRUeXBlPiB7CisgICAgbWF0Y2ggYiB7CisgICAgICAgIDB4MDAgPT4gT2soVFR5cGU6OlN0b3ApLAorICAgICAgICAweDAzID0+IE9rKFRUeXBlOjpJMDgpLCAvLyBlcXVpdmFsZW50IHRvIFRUeXBlOjpCeXRlCisgICAgICAgIDB4MDQgPT4gT2soVFR5cGU6OkkxNiksCisgICAgICAgIDB4MDUgPT4gT2soVFR5cGU6OkkzMiksCisgICAgICAgIDB4MDYgPT4gT2soVFR5cGU6Okk2NCksCisgICAgICAgIDB4MDcgPT4gT2soVFR5cGU6OkRvdWJsZSksCisgICAgICAgIDB4MDggPT4gT2soVFR5cGU6OlN0cmluZyksCisgICAgICAgIDB4MDkgPT4gT2soVFR5cGU6Okxpc3QpLAorICAgICAgICAweDBBID0+IE9rKFRUeXBlOjpTZXQpLAorICAgICAgICAweDBCID0+IE9rKFRUeXBlOjpNYXApLAorICAgICAgICAweDBDID0+IE9rKFRUeXBlOjpTdHJ1Y3QpLAorICAgICAgICB1bmtuID0+IEVycig6OkVycm9yOjpQcm90b2NvbCg6OlByb3RvY29sRXJyb3IgeworICAgICAgICAgICAga2luZDogOjpQcm90b2NvbEVycm9yS2luZDo6SW52YWxpZERhdGEsCisgICAgICAgICAgICBtZXNzYWdlOiBmb3JtYXQhKCJjYW5ub3QgY29udmVydCB7fSBpbnRvIFRUeXBlIiwgdW5rbiksCisgICAgICAgIH0pKSwKKyAgICB9Cit9CisKKyNbY2ZnKHRlc3QpXQorbW9kIHRlc3RzIHsKKworICAgIHVzZSBwcm90b2NvbDo6eworICAgICAgICBURmllbGRJZGVudGlmaWVyLCBUSW5wdXRQcm90b2NvbCwgVExpc3RJZGVudGlmaWVyLCBUTWFwSWRlbnRpZmllciwgVE1lc3NhZ2VJZGVudGlmaWVyLAorICAgICAgICBUTWVzc2FnZVR5cGUsIFRPdXRwdXRQcm90b2NvbCwgVFNldElkZW50aWZpZXIsIFRTdHJ1Y3RJZGVudGlmaWVyLCBUVHlwZSwKKyAgICB9OworICAgIHVzZSB0cmFuc3BvcnQ6OntSZWFkSGFsZiwgVEJ1ZmZlckNoYW5uZWwsIFRJb0NoYW5uZWwsIFdyaXRlSGFsZn07CisKKyAgICB1c2Ugc3VwZXI6Oio7CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9tZXNzYWdlX2JlZ2luXzAoKSB7CisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX21lc3NhZ2VfYmVnaW4oJlRNZXNzYWdlSWRlbnRpZmllcjo6bmV3KAorICAgICAgICAgICAgImZvbyIsCisgICAgICAgICAgICBUTWVzc2FnZVR5cGU6OkNhbGwsCisgICAgICAgICAgICA0MzEKKyAgICAgICAgKSkpOworCisgICAgICAgICNbY2ZnX2F0dHIocnVzdGZtdCwgcnVzdGZtdDo6c2tpcCldCisgICAgICAgIGxldCBleHBlY3RlZDogW3U4OyA4XSA9IFsKKyAgICAgICAgICAgIDB4ODIsIC8qIHByb3RvY29sIElEICovCisgICAgICAgICAgICAweDIxLCAvKiBtZXNzYWdlIHR5cGUgfCBwcm90b2NvbCB2ZXJzaW9uICovCisgICAgICAgICAgICAweERFLAorICAgICAgICAgICAgMHgwNiwgLyogemlnLXphZyB2YXJpbnQgc2VxdWVuY2UgbnVtYmVyICovCisgICAgICAgICAgICAweDAzLCAvKiBtZXNzYWdlLW5hbWUgbGVuZ3RoICovCisgICAgICAgICAgICAweDY2LAorICAgICAgICAgICAgMHg2RiwKKyAgICAgICAgICAgIDB4NkYgLyogImZvbyIgKi8sCisgICAgICAgIF07CisKKyAgICAgICAgYXNzZXJ0X2VxX3dyaXR0ZW5fYnl0ZXMhKG9fcHJvdCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX21lc3NhZ2VfYmVnaW5fMSgpIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfbWVzc2FnZV9iZWdpbigmVE1lc3NhZ2VJZGVudGlmaWVyOjpuZXcoCisgICAgICAgICAgICAiYmFyIiwKKyAgICAgICAgICAgIFRNZXNzYWdlVHlwZTo6UmVwbHksCisgICAgICAgICAgICA5OTE4MjgKKyAgICAgICAgKSkpOworCisgICAgICAgICNbY2ZnX2F0dHIocnVzdGZtdCwgcnVzdGZtdDo6c2tpcCldCisgICAgICAgIGxldCBleHBlY3RlZDogW3U4OyA5XSA9IFsKKyAgICAgICAgICAgIDB4ODIsIC8qIHByb3RvY29sIElEICovCisgICAgICAgICAgICAweDQxLCAvKiBtZXNzYWdlIHR5cGUgfCBwcm90b2NvbCB2ZXJzaW9uICovCisgICAgICAgICAgICAweEE4LAorICAgICAgICAgICAgMHg4OSwKKyAgICAgICAgICAgIDB4NzksIC8qIHppZy16YWcgdmFyaW50IHNlcXVlbmNlIG51bWJlciAqLworICAgICAgICAgICAgMHgwMywgLyogbWVzc2FnZS1uYW1lIGxlbmd0aCAqLworICAgICAgICAgICAgMHg2MiwKKyAgICAgICAgICAgIDB4NjEsCisgICAgICAgICAgICAweDcyIC8qICJiYXIiICovLAorICAgICAgICBdOworCisgICAgICAgIGFzc2VydF9lcV93cml0dGVuX2J5dGVzIShvX3Byb3QsIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yb3VuZF90cmlwX21lc3NhZ2VfYmVnaW4oKSB7CisgICAgICAgIGxldCAobXV0IGlfcHJvdCwgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICBsZXQgaWRlbnQgPSBUTWVzc2FnZUlkZW50aWZpZXI6Om5ldygic2VydmljZV9jYWxsIiwgVE1lc3NhZ2VUeXBlOjpDYWxsLCAxMjgzOTQ4KTsKKworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX21lc3NhZ2VfYmVnaW4oJmlkZW50KSk7CisKKyAgICAgICAgY29weV93cml0ZV9idWZmZXJfdG9fcmVhZF9idWZmZXIhKG9fcHJvdCk7CisKKyAgICAgICAgbGV0IHJlcyA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9tZXNzYWdlX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKCZyZXMsICZpZGVudCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfbWVzc2FnZV9lbmQoKSB7CisgICAgICAgIGFzc2VydF9ub193cml0ZSh8b3wgby53cml0ZV9tZXNzYWdlX2VuZCgpKTsKKyAgICB9CisKKyAgICAvLyBOT1RFOiBzdHJ1Y3RzIGFuZCBmaWVsZHMgYXJlIHRlc3RlZCB0b2dldGhlcgorICAgIC8vCisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9zdHJ1Y3Rfd2l0aF9kZWx0YV9maWVsZHMoKSB7CisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICAvLyBubyBieXRlcyBzaG91bGQgYmUgd3JpdHRlbiBob3dldmVyCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZUU3RydWN0SWRlbnRpZmllcjo6bmV3KCJmb28iKSkpOworCisgICAgICAgIC8vIHdyaXRlIHRocmVlIGZpZWxkcyB3aXRoIHRpbnkgZmllbGQgaWRzCisgICAgICAgIC8vIHNpbmNlIHRoZXkncmUgc21hbGwgdGhlIGZpZWxkIGlkcyB3aWxsIGJlIGVuY29kZWQgYXMgZGVsdGFzCisKKyAgICAgICAgLy8gc2luY2UgdGhpcyBpcyB0aGUgZmlyc3QgZmllbGQgKGFuZCBpdCdzIHplcm8pIGl0IGdldHMgdGhlIGZ1bGwgdmFyaW50IHdyaXRlCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkkwOCwgMCkpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDAgYW5kIDwgMTUgaXQgY2FuIGJlIGVuY29kZWQgYXMgYSBkZWx0YQorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJMTYsIDQpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgPiAwIGFuZCA8IDE1IGl0IGNhbiBiZSBlbmNvZGVkIGFzIGEgZGVsdGEKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6TGlzdCwgOSkpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gbm93LCBmaW5pc2ggdGhlIHN0cnVjdCBvZmYKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9zdG9wKCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9lbmQoKSk7CisKKyAgICAgICAgI1tjZmdfYXR0cihydXN0Zm10LCBydXN0Zm10Ojpza2lwKV0KKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDVdID0gWworICAgICAgICAgICAgMHgwMywgLyogZmllbGQgdHlwZSAqLworICAgICAgICAgICAgMHgwMCwgLyogZmlyc3QgZmllbGQgaWQgKi8KKyAgICAgICAgICAgIDB4NDQsIC8qIGZpZWxkIGRlbHRhICg0KSB8IGZpZWxkIHR5cGUgKi8KKyAgICAgICAgICAgIDB4NTksIC8qIGZpZWxkIGRlbHRhICg1KSB8IGZpZWxkIHR5cGUgKi8KKyAgICAgICAgICAgIDB4MDAgLyogZmllbGQgc3RvcCAqLywKKyAgICAgICAgXTsKKworICAgICAgICBhc3NlcnRfZXFfd3JpdHRlbl9ieXRlcyEob19wcm90LCBleHBlY3RlZCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfcm91bmRfdHJpcF9zdHJ1Y3Rfd2l0aF9kZWx0YV9maWVsZHMoKSB7CisgICAgICAgIGxldCAobXV0IGlfcHJvdCwgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICAvLyBubyBieXRlcyBzaG91bGQgYmUgd3JpdHRlbiBob3dldmVyCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZUU3RydWN0SWRlbnRpZmllcjo6bmV3KCJmb28iKSkpOworCisgICAgICAgIC8vIHdyaXRlIHRocmVlIGZpZWxkcyB3aXRoIHRpbnkgZmllbGQgaWRzCisgICAgICAgIC8vIHNpbmNlIHRoZXkncmUgc21hbGwgdGhlIGZpZWxkIGlkcyB3aWxsIGJlIGVuY29kZWQgYXMgZGVsdGFzCisKKyAgICAgICAgLy8gc2luY2UgdGhpcyBpcyB0aGUgZmlyc3QgZmllbGQgKGFuZCBpdCdzIHplcm8pIGl0IGdldHMgdGhlIGZ1bGwgdmFyaW50IHdyaXRlCisgICAgICAgIGxldCBmaWVsZF9pZGVudF8xID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STA4LCAwKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfMSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMCBhbmQgPCAxNSBpdCBjYW4gYmUgZW5jb2RlZCBhcyBhIGRlbHRhCisgICAgICAgIGxldCBmaWVsZF9pZGVudF8yID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STE2LCA0KTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfMikpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMCBhbmQgPCAxNSBpdCBjYW4gYmUgZW5jb2RlZCBhcyBhIGRlbHRhCisgICAgICAgIGxldCBmaWVsZF9pZGVudF8zID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6TGlzdCwgOSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzMpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gbm93LCBmaW5pc2ggdGhlIHN0cnVjdCBvZmYKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9zdG9wKCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9lbmQoKSk7CisKKyAgICAgICAgY29weV93cml0ZV9idWZmZXJfdG9fcmVhZF9idWZmZXIhKG9fcHJvdCk7CisKKyAgICAgICAgLy8gcmVhZCB0aGUgc3RydWN0IGJhY2sKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX3N0cnVjdF9iZWdpbigpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF8xID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF8xLAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzEKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF8yID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF8yLAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzIKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF8zID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF8zLAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzMKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF80ID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF80LAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICBmaWVsZF90eXBlOiBUVHlwZTo6U3RvcCwKKyAgICAgICAgICAgICAgICBpZDogTm9uZSwKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfc3RydWN0X2VuZCgpKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9zdHJ1Y3Rfd2l0aF9ub25femVyb19pbml0aWFsX2ZpZWxkX2FuZF9kZWx0YV9maWVsZHMoKSB7CisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICAvLyBubyBieXRlcyBzaG91bGQgYmUgd3JpdHRlbiBob3dldmVyCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZUU3RydWN0SWRlbnRpZmllcjo6bmV3KCJmb28iKSkpOworCisgICAgICAgIC8vIHdyaXRlIHRocmVlIGZpZWxkcyB3aXRoIHRpbnkgZmllbGQgaWRzCisgICAgICAgIC8vIHNpbmNlIHRoZXkncmUgc21hbGwgdGhlIGZpZWxkIGlkcyB3aWxsIGJlIGVuY29kZWQgYXMgZGVsdGFzCisKKyAgICAgICAgLy8gZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkkzMiwgMSkpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDAgYW5kIDwgMTUgaXQgY2FuIGJlIGVuY29kZWQgYXMgYSBkZWx0YQorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpTZXQsIDIpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgPiAwIGFuZCA8IDE1IGl0IGNhbiBiZSBlbmNvZGVkIGFzIGEgZGVsdGEKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6U3RyaW5nLCA2KSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBub3csIGZpbmlzaCB0aGUgc3RydWN0IG9mZgorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX3N0b3AoKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2VuZCgpKTsKKworICAgICAgICAjW2NmZ19hdHRyKHJ1c3RmbXQsIHJ1c3RmbXQ6OnNraXApXQorICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgNF0gPSBbCisgICAgICAgICAgICAweDE1LCAvKiBmaWVsZCBkZWx0YSAoMSkgfCBmaWVsZCB0eXBlICovCisgICAgICAgICAgICAweDFBLCAvKiBmaWVsZCBkZWx0YSAoMSkgfCBmaWVsZCB0eXBlICovCisgICAgICAgICAgICAweDQ4LCAvKiBmaWVsZCBkZWx0YSAoNCkgfCBmaWVsZCB0eXBlICovCisgICAgICAgICAgICAweDAwIC8qIGZpZWxkIHN0b3AgKi8sCisgICAgICAgIF07CisKKyAgICAgICAgYXNzZXJ0X2VxX3dyaXR0ZW5fYnl0ZXMhKG9fcHJvdCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JvdW5kX3RyaXBfc3RydWN0X3dpdGhfbm9uX3plcm9faW5pdGlhbF9maWVsZF9hbmRfZGVsdGFfZmllbGRzKCkgeworICAgICAgICBsZXQgKG11dCBpX3Byb3QsIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgLy8gbm8gYnl0ZXMgc2hvdWxkIGJlIHdyaXR0ZW4gaG93ZXZlcgorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9iZWdpbigmVFN0cnVjdElkZW50aWZpZXI6Om5ldygiZm9vIikpKTsKKworICAgICAgICAvLyB3cml0ZSB0aHJlZSBmaWVsZHMgd2l0aCB0aW55IGZpZWxkIGlkcworICAgICAgICAvLyBzaW5jZSB0aGV5J3JlIHNtYWxsIHRoZSBmaWVsZCBpZHMgd2lsbCBiZSBlbmNvZGVkIGFzIGRlbHRhcworCisgICAgICAgIC8vIGdldHMgYSBkZWx0YSB3cml0ZQorICAgICAgICBsZXQgZmllbGRfaWRlbnRfMSA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkkzMiwgMSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzEpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDAgYW5kIDwgMTUgaXQgY2FuIGJlIGVuY29kZWQgYXMgYSBkZWx0YQorICAgICAgICBsZXQgZmllbGRfaWRlbnRfMiA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OlNldCwgMik7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzIpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDAgYW5kIDwgMTUgaXQgY2FuIGJlIGVuY29kZWQgYXMgYSBkZWx0YQorICAgICAgICBsZXQgZmllbGRfaWRlbnRfMyA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OlN0cmluZywgNik7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzMpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gbm93LCBmaW5pc2ggdGhlIHN0cnVjdCBvZmYKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9zdG9wKCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9lbmQoKSk7CisKKyAgICAgICAgY29weV93cml0ZV9idWZmZXJfdG9fcmVhZF9idWZmZXIhKG9fcHJvdCk7CisKKyAgICAgICAgLy8gcmVhZCB0aGUgc3RydWN0IGJhY2sKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX3N0cnVjdF9iZWdpbigpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF8xID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF8xLAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzEKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF8yID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF8yLAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzIKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF8zID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF8zLAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzMKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF80ID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF80LAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICBmaWVsZF90eXBlOiBUVHlwZTo6U3RvcCwKKyAgICAgICAgICAgICAgICBpZDogTm9uZSwKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfc3RydWN0X2VuZCgpKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9zdHJ1Y3Rfd2l0aF9sb25nX2ZpZWxkcygpIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIC8vIG5vIGJ5dGVzIHNob3VsZCBiZSB3cml0dGVuIGhvd2V2ZXIKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oJlRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoImZvbyIpKSk7CisKKyAgICAgICAgLy8gd3JpdGUgdGhyZWUgZmllbGRzIHdpdGggZmllbGQgaWRzIHRoYXQgY2Fubm90IGJlIGVuY29kZWQgYXMgZGVsdGFzCisKKyAgICAgICAgLy8gc2luY2UgdGhpcyBpcyB0aGUgZmlyc3QgZmllbGQgKGFuZCBpdCdzIHplcm8pIGl0IGdldHMgdGhlIGZ1bGwgdmFyaW50IHdyaXRlCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkkzMiwgMCkpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSBpcyA+IDE1IGl0IGlzIGVuY29kZWQgYXMgYSB6aWctemFnIHZhcmludAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJNjQsIDE2KSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhIGlzID4gMTUgaXQgaXMgZW5jb2RlZCBhcyBhIHppZy16YWcgdmFyaW50CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OlNldCwgOTkpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIG5vdywgZmluaXNoIHRoZSBzdHJ1Y3Qgb2ZmCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfc3RvcCgpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfZW5kKCkpOworCisgICAgICAgICNbY2ZnX2F0dHIocnVzdGZtdCwgcnVzdGZtdDo6c2tpcCldCisgICAgICAgIGxldCBleHBlY3RlZDogW3U4OyA4XSA9IFsKKyAgICAgICAgICAgIDB4MDUsIC8qIGZpZWxkIHR5cGUgKi8KKyAgICAgICAgICAgIDB4MDAsIC8qIGZpcnN0IGZpZWxkIGlkICovCisgICAgICAgICAgICAweDA2LCAvKiBmaWVsZCB0eXBlICovCisgICAgICAgICAgICAweDIwLCAvKiB6aWctemFnIHZhcmludCBmaWVsZCBpZCAqLworICAgICAgICAgICAgMHgwQSwgLyogZmllbGQgdHlwZSAqLworICAgICAgICAgICAgMHhDNiwKKyAgICAgICAgICAgIDB4MDEsIC8qIHppZy16YWcgdmFyaW50IGZpZWxkIGlkICovCisgICAgICAgICAgICAweDAwIC8qIGZpZWxkIHN0b3AgKi8sCisgICAgICAgIF07CisKKyAgICAgICAgYXNzZXJ0X2VxX3dyaXR0ZW5fYnl0ZXMhKG9fcHJvdCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JvdW5kX3RyaXBfc3RydWN0X3dpdGhfbG9uZ19maWVsZHMoKSB7CisgICAgICAgIGxldCAobXV0IGlfcHJvdCwgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICAvLyBubyBieXRlcyBzaG91bGQgYmUgd3JpdHRlbiBob3dldmVyCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZUU3RydWN0SWRlbnRpZmllcjo6bmV3KCJmb28iKSkpOworCisgICAgICAgIC8vIHdyaXRlIHRocmVlIGZpZWxkcyB3aXRoIGZpZWxkIGlkcyB0aGF0IGNhbm5vdCBiZSBlbmNvZGVkIGFzIGRlbHRhcworCisgICAgICAgIC8vIHNpbmNlIHRoaXMgaXMgdGhlIGZpcnN0IGZpZWxkIChhbmQgaXQncyB6ZXJvKSBpdCBnZXRzIHRoZSBmdWxsIHZhcmludCB3cml0ZQorICAgICAgICBsZXQgZmllbGRfaWRlbnRfMSA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkkzMiwgMCk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzEpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSBpcyA+IDE1IGl0IGlzIGVuY29kZWQgYXMgYSB6aWctemFnIHZhcmludAorICAgICAgICBsZXQgZmllbGRfaWRlbnRfMiA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6Okk2NCwgMTYpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF8yKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgaXMgPiAxNSBpdCBpcyBlbmNvZGVkIGFzIGEgemlnLXphZyB2YXJpbnQKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzMgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpTZXQsIDk5KTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfMykpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBub3csIGZpbmlzaCB0aGUgc3RydWN0IG9mZgorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX3N0b3AoKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2VuZCgpKTsKKworICAgICAgICBjb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlciEob19wcm90KTsKKworICAgICAgICAvLyByZWFkIHRoZSBzdHJ1Y3QgYmFjaworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfc3RydWN0X2JlZ2luKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzEgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzEsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfMQorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzIgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzIsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfMgorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzMgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzMsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfMworICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzQgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzQsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIGZpZWxkX3R5cGU6IFRUeXBlOjpTdG9wLAorICAgICAgICAgICAgICAgIGlkOiBOb25lLAorICAgICAgICAgICAgfQorICAgICAgICApOworCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9zdHJ1Y3RfZW5kKCkpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX3N0cnVjdF93aXRoX21peF9vZl9sb25nX2FuZF9kZWx0YV9maWVsZHMoKSB7CisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICAvLyBubyBieXRlcyBzaG91bGQgYmUgd3JpdHRlbiBob3dldmVyCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZUU3RydWN0SWRlbnRpZmllcjo6bmV3KCJmb28iKSkpOworCisgICAgICAgIC8vIHdyaXRlIHRocmVlIGZpZWxkcyB3aXRoIGZpZWxkIGlkcyB0aGF0IGNhbm5vdCBiZSBlbmNvZGVkIGFzIGRlbHRhcworCisgICAgICAgIC8vIHNpbmNlIHRoZSBkZWx0YSBpcyA+IDAgYW5kIDwgMTUgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6Okk2NCwgMSkpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDAgYW5kIDwgMTUgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkkzMiwgOSkpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSBpcyA+IDE1IGl0IGlzIGVuY29kZWQgYXMgYSB6aWctemFnIHZhcmludAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpTZXQsIDEwMDApKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgaXMgPiAxNSBpdCBpcyBlbmNvZGVkIGFzIGEgemlnLXphZyB2YXJpbnQKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6U2V0LCAyMDAxKSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzaW5jZSB0aGlzIGlzIG9ubHkgMyB1cCBmcm9tIHRoZSBwcmV2aW91cyBpdCBpcyByZWNvcmRlZCBhcyBhIGRlbHRhCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OlNldCwgMjAwNCkpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gbm93LCBmaW5pc2ggdGhlIHN0cnVjdCBvZmYKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9zdG9wKCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9lbmQoKSk7CisKKyAgICAgICAgI1tjZmdfYXR0cihydXN0Zm10LCBydXN0Zm10Ojpza2lwKV0KKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDEwXSA9IFsKKyAgICAgICAgICAgIDB4MTYsIC8qIGZpZWxkIGRlbHRhICgxKSB8IGZpZWxkIHR5cGUgKi8KKyAgICAgICAgICAgIDB4ODUsIC8qIGZpZWxkIGRlbHRhICg4KSB8IGZpZWxkIHR5cGUgKi8KKyAgICAgICAgICAgIDB4MEEsIC8qIGZpZWxkIHR5cGUgKi8KKyAgICAgICAgICAgIDB4RDAsCisgICAgICAgICAgICAweDBGLCAvKiB6aWctemFnIHZhcmludCBmaWVsZCBpZCAqLworICAgICAgICAgICAgMHgwQSwgLyogZmllbGQgdHlwZSAqLworICAgICAgICAgICAgMHhBMiwKKyAgICAgICAgICAgIDB4MUYsIC8qIHppZy16YWcgdmFyaW50IGZpZWxkIGlkICovCisgICAgICAgICAgICAweDNBLCAvKiBmaWVsZCBkZWx0YSAoMykgfCBmaWVsZCB0eXBlICovCisgICAgICAgICAgICAweDAwIC8qIGZpZWxkIHN0b3AgKi8sCisgICAgICAgIF07CisKKyAgICAgICAgYXNzZXJ0X2VxX3dyaXR0ZW5fYnl0ZXMhKG9fcHJvdCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JvdW5kX3RyaXBfc3RydWN0X3dpdGhfbWl4X29mX2xvbmdfYW5kX2RlbHRhX2ZpZWxkcygpIHsKKyAgICAgICAgbGV0IChtdXQgaV9wcm90LCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIC8vIG5vIGJ5dGVzIHNob3VsZCBiZSB3cml0dGVuIGhvd2V2ZXIKKyAgICAgICAgbGV0IHN0cnVjdF9pZGVudCA9IFRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoImZvbyIpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9iZWdpbigmc3RydWN0X2lkZW50KSk7CisKKyAgICAgICAgLy8gd3JpdGUgdGhyZWUgZmllbGRzIHdpdGggZmllbGQgaWRzIHRoYXQgY2Fubm90IGJlIGVuY29kZWQgYXMgZGVsdGFzCisKKyAgICAgICAgLy8gc2luY2UgdGhlIGRlbHRhIGlzID4gMCBhbmQgPCAxNSBpdCBnZXRzIGEgZGVsdGEgd3JpdGUKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzEgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJNjQsIDEpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF8xKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgPiAwIGFuZCA8IDE1IGl0IGdldHMgYSBkZWx0YSB3cml0ZQorICAgICAgICBsZXQgZmllbGRfaWRlbnRfMiA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkkzMiwgOSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzIpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSBpcyA+IDE1IGl0IGlzIGVuY29kZWQgYXMgYSB6aWctemFnIHZhcmludAorICAgICAgICBsZXQgZmllbGRfaWRlbnRfMyA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OlNldCwgMTAwMCk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzMpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSBpcyA+IDE1IGl0IGlzIGVuY29kZWQgYXMgYSB6aWctemFnIHZhcmludAorICAgICAgICBsZXQgZmllbGRfaWRlbnRfNCA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OlNldCwgMjAwMSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzQpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc2luY2UgdGhpcyBpcyBvbmx5IDMgdXAgZnJvbSB0aGUgcHJldmlvdXMgaXQgaXMgcmVjb3JkZWQgYXMgYSBkZWx0YQorICAgICAgICBsZXQgZmllbGRfaWRlbnRfNSA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OlNldCwgMjAwNCk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzUpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gbm93LCBmaW5pc2ggdGhlIHN0cnVjdCBvZmYKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9zdG9wKCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9lbmQoKSk7CisKKyAgICAgICAgY29weV93cml0ZV9idWZmZXJfdG9fcmVhZF9idWZmZXIhKG9fcHJvdCk7CisKKyAgICAgICAgLy8gcmVhZCB0aGUgc3RydWN0IGJhY2sKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX3N0cnVjdF9iZWdpbigpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF8xID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF8xLAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzEKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF8yID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF8yLAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzIKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF8zID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF8zLAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzMKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF80ID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF80LAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzQKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF81ID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF81LAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzUKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF82ID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF82LAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICBmaWVsZF90eXBlOiBUVHlwZTo6U3RvcCwKKyAgICAgICAgICAgICAgICBpZDogTm9uZSwKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfc3RydWN0X2VuZCgpKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9uZXN0ZWRfc3RydWN0c18wKCkgeworICAgICAgICAvLyBsYXN0IGZpZWxkIG9mIHRoZSBjb250YWluaW5nIHN0cnVjdCBpcyBhIGRlbHRhCisgICAgICAgIC8vIGZpcnN0IGZpZWxkIG9mIHRoZSB0aGUgY29udGFpbmVkIHN0cnVjdCBpcyBhIGRlbHRhCisKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIC8vIHN0YXJ0IGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZUU3RydWN0SWRlbnRpZmllcjo6bmV3KCJmb28iKSkpOworCisgICAgICAgIC8vIGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoZSBkZWx0YSBpcyA+IDAgYW5kIDwgMTUgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6Okk2NCwgMSkpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDAgYW5kIDwgMTUgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkkzMiwgOSkpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc3RhcnQgY29udGFpbmVkIHN0cnVjdAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9iZWdpbigmVFN0cnVjdElkZW50aWZpZXI6Om5ldygiZm9vIikpKTsKKworICAgICAgICAvLyBjb250YWluZWQgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoZSBkZWx0YSBpcyA+IDAgYW5kIDwgMTUgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkkwOCwgNykpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gY29udGFpbmVkIHN0cnVjdAorICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMTUgaXQgZ2V0cyBhIGZ1bGwgd3JpdGUKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6RG91YmxlLCAyNCkpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gZW5kIGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9zdG9wKCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9lbmQoKSk7CisKKyAgICAgICAgLy8gZW5kIGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfc3RvcCgpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfZW5kKCkpOworCisgICAgICAgICNbY2ZnX2F0dHIocnVzdGZtdCwgcnVzdGZtdDo6c2tpcCldCisgICAgICAgIGxldCBleHBlY3RlZDogW3U4OyA3XSA9IFsKKyAgICAgICAgICAgIDB4MTYsIC8qIGZpZWxkIGRlbHRhICgxKSB8IGZpZWxkIHR5cGUgKi8KKyAgICAgICAgICAgIDB4ODUsIC8qIGZpZWxkIGRlbHRhICg4KSB8IGZpZWxkIHR5cGUgKi8KKyAgICAgICAgICAgIDB4NzMsIC8qIGZpZWxkIGRlbHRhICg3KSB8IGZpZWxkIHR5cGUgKi8KKyAgICAgICAgICAgIDB4MDcsIC8qIGZpZWxkIHR5cGUgKi8KKyAgICAgICAgICAgIDB4MzAsIC8qIHppZy16YWcgdmFyaW50IGZpZWxkIGlkICovCisgICAgICAgICAgICAweDAwLCAvKiBmaWVsZCBzdG9wIC0gY29udGFpbmVkICovCisgICAgICAgICAgICAweDAwIC8qIGZpZWxkIHN0b3AgLSBjb250YWluaW5nICovLAorICAgICAgICBdOworCisgICAgICAgIGFzc2VydF9lcV93cml0dGVuX2J5dGVzIShvX3Byb3QsIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yb3VuZF90cmlwX25lc3RlZF9zdHJ1Y3RzXzAoKSB7CisgICAgICAgIC8vIGxhc3QgZmllbGQgb2YgdGhlIGNvbnRhaW5pbmcgc3RydWN0IGlzIGEgZGVsdGEKKyAgICAgICAgLy8gZmlyc3QgZmllbGQgb2YgdGhlIHRoZSBjb250YWluZWQgc3RydWN0IGlzIGEgZGVsdGEKKworICAgICAgICBsZXQgKG11dCBpX3Byb3QsIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgLy8gc3RhcnQgY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oJlRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoImZvbyIpKSk7CisKKyAgICAgICAgLy8gY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgLy8gc2luY2UgdGhlIGRlbHRhIGlzID4gMCBhbmQgPCAxNSBpdCBnZXRzIGEgZGVsdGEgd3JpdGUKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzEgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJNjQsIDEpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF8xKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgPiAwIGFuZCA8IDE1IGl0IGdldHMgYSBkZWx0YSB3cml0ZQorICAgICAgICBsZXQgZmllbGRfaWRlbnRfMiA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkkzMiwgOSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzIpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc3RhcnQgY29udGFpbmVkIHN0cnVjdAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9iZWdpbigmVFN0cnVjdElkZW50aWZpZXI6Om5ldygiZm9vIikpKTsKKworICAgICAgICAvLyBjb250YWluZWQgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoZSBkZWx0YSBpcyA+IDAgYW5kIDwgMTUgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGxldCBmaWVsZF9pZGVudF8zID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STA4LCA3KTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfMykpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBjb250YWluZWQgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgPiAxNSBpdCBnZXRzIGEgZnVsbCB3cml0ZQorICAgICAgICBsZXQgZmllbGRfaWRlbnRfNCA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkRvdWJsZSwgMjQpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF80KSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIGVuZCBjb250YWluZWQgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfc3RvcCgpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfZW5kKCkpOworCisgICAgICAgIC8vIGVuZCBjb250YWluaW5nIHN0cnVjdAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX3N0b3AoKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2VuZCgpKTsKKworICAgICAgICBjb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlciEob19wcm90KTsKKworICAgICAgICAvLyByZWFkIGNvbnRhaW5pbmcgc3RydWN0IGJhY2sKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX3N0cnVjdF9iZWdpbigpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF8xID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF8xLAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzEKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF8yID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF8yLAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzIKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyByZWFkIGNvbnRhaW5lZCBzdHJ1Y3QgYmFjaworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfc3RydWN0X2JlZ2luKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzMgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzMsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfMworICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzQgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzQsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfNAorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIGVuZCBjb250YWluZWQgc3RydWN0CisgICAgICAgIGxldCByZWFkX2lkZW50XzYgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzYsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIGZpZWxkX3R5cGU6IFRUeXBlOjpTdG9wLAorICAgICAgICAgICAgICAgIGlkOiBOb25lLAorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfc3RydWN0X2VuZCgpKTsKKworICAgICAgICAvLyBlbmQgY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfNyA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfNywKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgZmllbGRfdHlwZTogVFR5cGU6OlN0b3AsCisgICAgICAgICAgICAgICAgaWQ6IE5vbmUsCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9zdHJ1Y3RfZW5kKCkpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX25lc3RlZF9zdHJ1Y3RzXzEoKSB7CisgICAgICAgIC8vIGxhc3QgZmllbGQgb2YgdGhlIGNvbnRhaW5pbmcgc3RydWN0IGlzIGEgZGVsdGEKKyAgICAgICAgLy8gZmlyc3QgZmllbGQgb2YgdGhlIHRoZSBjb250YWluZWQgc3RydWN0IGlzIGEgZnVsbCB3cml0ZQorCisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICAvLyBzdGFydCBjb250YWluaW5nIHN0cnVjdAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9iZWdpbigmVFN0cnVjdElkZW50aWZpZXI6Om5ldygiZm9vIikpKTsKKworICAgICAgICAvLyBjb250YWluaW5nIHN0cnVjdAorICAgICAgICAvLyBzaW5jZSB0aGUgZGVsdGEgaXMgPiAwIGFuZCA8IDE1IGl0IGdldHMgYSBkZWx0YSB3cml0ZQorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJNjQsIDEpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgPiAwIGFuZCA8IDE1IGl0IGdldHMgYSBkZWx0YSB3cml0ZQorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJMzIsIDkpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHN0YXJ0IGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oJlRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoImZvbyIpKSk7CisKKyAgICAgICAgLy8gY29udGFpbmVkIHN0cnVjdAorICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMTUgaXQgZ2V0cyBhIGZ1bGwgd3JpdGUKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6RG91YmxlLCAyNCkpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gY29udGFpbmVkIHN0cnVjdAorICAgICAgICAvLyBzaW5jZSB0aGUgZGVsdGEgaXMgPiAwIGFuZCA8IDE1IGl0IGdldHMgYSBkZWx0YSB3cml0ZQorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJMDgsIDI3KSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBlbmQgY29udGFpbmVkIHN0cnVjdAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX3N0b3AoKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2VuZCgpKTsKKworICAgICAgICAvLyBlbmQgY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9zdG9wKCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9lbmQoKSk7CisKKyAgICAgICAgI1tjZmdfYXR0cihydXN0Zm10LCBydXN0Zm10Ojpza2lwKV0KKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDddID0gWworICAgICAgICAgICAgMHgxNiwgLyogZmllbGQgZGVsdGEgKDEpIHwgZmllbGQgdHlwZSAqLworICAgICAgICAgICAgMHg4NSwgLyogZmllbGQgZGVsdGEgKDgpIHwgZmllbGQgdHlwZSAqLworICAgICAgICAgICAgMHgwNywgLyogZmllbGQgdHlwZSAqLworICAgICAgICAgICAgMHgzMCwgLyogemlnLXphZyB2YXJpbnQgZmllbGQgaWQgKi8KKyAgICAgICAgICAgIDB4MzMsIC8qIGZpZWxkIGRlbHRhICgzKSB8IGZpZWxkIHR5cGUgKi8KKyAgICAgICAgICAgIDB4MDAsIC8qIGZpZWxkIHN0b3AgLSBjb250YWluZWQgKi8KKyAgICAgICAgICAgIDB4MDAgLyogZmllbGQgc3RvcCAtIGNvbnRhaW5pbmcgKi8sCisgICAgICAgIF07CisKKyAgICAgICAgYXNzZXJ0X2VxX3dyaXR0ZW5fYnl0ZXMhKG9fcHJvdCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JvdW5kX3RyaXBfbmVzdGVkX3N0cnVjdHNfMSgpIHsKKyAgICAgICAgLy8gbGFzdCBmaWVsZCBvZiB0aGUgY29udGFpbmluZyBzdHJ1Y3QgaXMgYSBkZWx0YQorICAgICAgICAvLyBmaXJzdCBmaWVsZCBvZiB0aGUgdGhlIGNvbnRhaW5lZCBzdHJ1Y3QgaXMgYSBmdWxsIHdyaXRlCisKKyAgICAgICAgbGV0IChtdXQgaV9wcm90LCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIC8vIHN0YXJ0IGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZUU3RydWN0SWRlbnRpZmllcjo6bmV3KCJmb28iKSkpOworCisgICAgICAgIC8vIGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoZSBkZWx0YSBpcyA+IDAgYW5kIDwgMTUgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGxldCBmaWVsZF9pZGVudF8xID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STY0LCAxKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfMSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBjb250YWluaW5nIHN0cnVjdAorICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMCBhbmQgPCAxNSBpdCBnZXRzIGEgZGVsdGEgd3JpdGUKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzIgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJMzIsIDkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF8yKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHN0YXJ0IGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oJlRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoImZvbyIpKSk7CisKKyAgICAgICAgLy8gY29udGFpbmVkIHN0cnVjdAorICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMTUgaXQgZ2V0cyBhIGZ1bGwgd3JpdGUKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzMgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpEb3VibGUsIDI0KTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfMykpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBjb250YWluZWQgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoZSBkZWx0YSBpcyA+IDAgYW5kIDwgMTUgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGxldCBmaWVsZF9pZGVudF80ID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STA4LCAyNyk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzQpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gZW5kIGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9zdG9wKCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9lbmQoKSk7CisKKyAgICAgICAgLy8gZW5kIGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfc3RvcCgpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfZW5kKCkpOworCisgICAgICAgIGNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyIShvX3Byb3QpOworCisgICAgICAgIC8vIHJlYWQgY29udGFpbmluZyBzdHJ1Y3QgYmFjaworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfc3RydWN0X2JlZ2luKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzEgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzEsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfMQorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzIgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzIsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfMgorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHJlYWQgY29udGFpbmVkIHN0cnVjdCBiYWNrCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9zdHJ1Y3RfYmVnaW4oKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfMyA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfMywKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgLi5maWVsZF9pZGVudF8zCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfNCA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfNCwKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgLi5maWVsZF9pZGVudF80CisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gZW5kIGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfNiA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfNiwKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgZmllbGRfdHlwZTogVFR5cGU6OlN0b3AsCisgICAgICAgICAgICAgICAgaWQ6IE5vbmUsCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9zdHJ1Y3RfZW5kKCkpOworCisgICAgICAgIC8vIGVuZCBjb250YWluaW5nIHN0cnVjdAorICAgICAgICBsZXQgcmVhZF9pZGVudF83ID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF83LAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICBmaWVsZF90eXBlOiBUVHlwZTo6U3RvcCwKKyAgICAgICAgICAgICAgICBpZDogTm9uZSwKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX3N0cnVjdF9lbmQoKSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfbmVzdGVkX3N0cnVjdHNfMigpIHsKKyAgICAgICAgLy8gbGFzdCBmaWVsZCBvZiB0aGUgY29udGFpbmluZyBzdHJ1Y3QgaXMgYSBmdWxsIHdyaXRlCisgICAgICAgIC8vIGZpcnN0IGZpZWxkIG9mIHRoZSB0aGUgY29udGFpbmVkIHN0cnVjdCBpcyBhIGRlbHRhIHdyaXRlCisKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIC8vIHN0YXJ0IGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZUU3RydWN0SWRlbnRpZmllcjo6bmV3KCJmb28iKSkpOworCisgICAgICAgIC8vIGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoZSBkZWx0YSBpcyA+IDAgYW5kIDwgMTUgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6Okk2NCwgMSkpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDE1IGl0IGdldHMgYSBmdWxsIHdyaXRlCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OlN0cmluZywgMjEpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHN0YXJ0IGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oJlRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoImZvbyIpKSk7CisKKyAgICAgICAgLy8gY29udGFpbmVkIHN0cnVjdAorICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMCBhbmQgPCAxNSBpdCBnZXRzIGEgZGVsdGEgd3JpdGUKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6RG91YmxlLCA3KSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBjb250YWluZWQgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoZSBkZWx0YSBpcyA+IDAgYW5kIDwgMTUgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkkwOCwgMTApKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIGVuZCBjb250YWluZWQgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfc3RvcCgpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfZW5kKCkpOworCisgICAgICAgIC8vIGVuZCBjb250YWluaW5nIHN0cnVjdAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX3N0b3AoKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2VuZCgpKTsKKworICAgICAgICAjW2NmZ19hdHRyKHJ1c3RmbXQsIHJ1c3RmbXQ6OnNraXApXQorICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgN10gPSBbCisgICAgICAgICAgICAweDE2LCAvKiBmaWVsZCBkZWx0YSAoMSkgfCBmaWVsZCB0eXBlICovCisgICAgICAgICAgICAweDA4LCAvKiBmaWVsZCB0eXBlICovCisgICAgICAgICAgICAweDJBLCAvKiB6aWctemFnIHZhcmludCBmaWVsZCBpZCAqLworICAgICAgICAgICAgMHg3NywgLyogZmllbGQgZGVsdGEoNykgfCBmaWVsZCB0eXBlICovCisgICAgICAgICAgICAweDMzLCAvKiBmaWVsZCBkZWx0YSAoMykgfCBmaWVsZCB0eXBlICovCisgICAgICAgICAgICAweDAwLCAvKiBmaWVsZCBzdG9wIC0gY29udGFpbmVkICovCisgICAgICAgICAgICAweDAwIC8qIGZpZWxkIHN0b3AgLSBjb250YWluaW5nICovLAorICAgICAgICBdOworCisgICAgICAgIGFzc2VydF9lcV93cml0dGVuX2J5dGVzIShvX3Byb3QsIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yb3VuZF90cmlwX25lc3RlZF9zdHJ1Y3RzXzIoKSB7CisgICAgICAgIGxldCAobXV0IGlfcHJvdCwgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICAvLyBzdGFydCBjb250YWluaW5nIHN0cnVjdAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9iZWdpbigmVFN0cnVjdElkZW50aWZpZXI6Om5ldygiZm9vIikpKTsKKworICAgICAgICAvLyBjb250YWluaW5nIHN0cnVjdAorICAgICAgICAvLyBzaW5jZSB0aGUgZGVsdGEgaXMgPiAwIGFuZCA8IDE1IGl0IGdldHMgYSBkZWx0YSB3cml0ZQorICAgICAgICBsZXQgZmllbGRfaWRlbnRfMSA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6Okk2NCwgMSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzEpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDE1IGl0IGdldHMgYSBmdWxsIHdyaXRlCisgICAgICAgIGxldCBmaWVsZF9pZGVudF8yID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6U3RyaW5nLCAyMSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzIpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc3RhcnQgY29udGFpbmVkIHN0cnVjdAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9iZWdpbigmVFN0cnVjdElkZW50aWZpZXI6Om5ldygiZm9vIikpKTsKKworICAgICAgICAvLyBjb250YWluZWQgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgPiAwIGFuZCA8IDE1IGl0IGdldHMgYSBkZWx0YSB3cml0ZQorICAgICAgICBsZXQgZmllbGRfaWRlbnRfMyA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkRvdWJsZSwgNyk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzMpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gY29udGFpbmVkIHN0cnVjdAorICAgICAgICAvLyBzaW5jZSB0aGUgZGVsdGEgaXMgPiAwIGFuZCA8IDE1IGl0IGdldHMgYSBkZWx0YSB3cml0ZQorICAgICAgICBsZXQgZmllbGRfaWRlbnRfNCA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkkwOCwgMTApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF80KSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIGVuZCBjb250YWluZWQgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfc3RvcCgpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfZW5kKCkpOworCisgICAgICAgIC8vIGVuZCBjb250YWluaW5nIHN0cnVjdAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX3N0b3AoKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2VuZCgpKTsKKworICAgICAgICBjb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlciEob19wcm90KTsKKworICAgICAgICAvLyByZWFkIGNvbnRhaW5pbmcgc3RydWN0IGJhY2sKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX3N0cnVjdF9iZWdpbigpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF8xID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF8xLAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzEKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF8yID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF8yLAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzIKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyByZWFkIGNvbnRhaW5lZCBzdHJ1Y3QgYmFjaworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfc3RydWN0X2JlZ2luKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzMgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzMsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfMworICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzQgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzQsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfNAorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIGVuZCBjb250YWluZWQgc3RydWN0CisgICAgICAgIGxldCByZWFkX2lkZW50XzYgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzYsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIGZpZWxkX3R5cGU6IFRUeXBlOjpTdG9wLAorICAgICAgICAgICAgICAgIGlkOiBOb25lLAorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfc3RydWN0X2VuZCgpKTsKKworICAgICAgICAvLyBlbmQgY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfNyA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfNywKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgZmllbGRfdHlwZTogVFR5cGU6OlN0b3AsCisgICAgICAgICAgICAgICAgaWQ6IE5vbmUsCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9zdHJ1Y3RfZW5kKCkpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX25lc3RlZF9zdHJ1Y3RzXzMoKSB7CisgICAgICAgIC8vIGxhc3QgZmllbGQgb2YgdGhlIGNvbnRhaW5pbmcgc3RydWN0IGlzIGEgZnVsbCB3cml0ZQorICAgICAgICAvLyBmaXJzdCBmaWVsZCBvZiB0aGUgdGhlIGNvbnRhaW5lZCBzdHJ1Y3QgaXMgYSBmdWxsIHdyaXRlCisKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIC8vIHN0YXJ0IGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZUU3RydWN0SWRlbnRpZmllcjo6bmV3KCJmb28iKSkpOworCisgICAgICAgIC8vIGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoZSBkZWx0YSBpcyA+IDAgYW5kIDwgMTUgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6Okk2NCwgMSkpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDE1IGl0IGdldHMgYSBmdWxsIHdyaXRlCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OlN0cmluZywgMjEpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHN0YXJ0IGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oJlRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoImZvbyIpKSk7CisKKyAgICAgICAgLy8gY29udGFpbmVkIHN0cnVjdAorICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMTUgaXQgZ2V0cyBhIGZ1bGwgd3JpdGUKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6RG91YmxlLCAyMSkpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gY29udGFpbmVkIHN0cnVjdAorICAgICAgICAvLyBzaW5jZSB0aGUgZGVsdGEgaXMgPiAwIGFuZCA8IDE1IGl0IGdldHMgYSBkZWx0YSB3cml0ZQorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJMDgsIDI3KSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBlbmQgY29udGFpbmVkIHN0cnVjdAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX3N0b3AoKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2VuZCgpKTsKKworICAgICAgICAvLyBlbmQgY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9zdG9wKCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9lbmQoKSk7CisKKyAgICAgICAgI1tjZmdfYXR0cihydXN0Zm10LCBydXN0Zm10Ojpza2lwKV0KKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDhdID0gWworICAgICAgICAgICAgMHgxNiwgLyogZmllbGQgZGVsdGEgKDEpIHwgZmllbGQgdHlwZSAqLworICAgICAgICAgICAgMHgwOCwgLyogZmllbGQgdHlwZSAqLworICAgICAgICAgICAgMHgyQSwgLyogemlnLXphZyB2YXJpbnQgZmllbGQgaWQgKi8KKyAgICAgICAgICAgIDB4MDcsIC8qIGZpZWxkIHR5cGUgKi8KKyAgICAgICAgICAgIDB4MkEsIC8qIHppZy16YWcgdmFyaW50IGZpZWxkIGlkICovCisgICAgICAgICAgICAweDYzLCAvKiBmaWVsZCBkZWx0YSAoNikgfCBmaWVsZCB0eXBlICovCisgICAgICAgICAgICAweDAwLCAvKiBmaWVsZCBzdG9wIC0gY29udGFpbmVkICovCisgICAgICAgICAgICAweDAwIC8qIGZpZWxkIHN0b3AgLSBjb250YWluaW5nICovLAorICAgICAgICBdOworCisgICAgICAgIGFzc2VydF9lcV93cml0dGVuX2J5dGVzIShvX3Byb3QsIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yb3VuZF90cmlwX25lc3RlZF9zdHJ1Y3RzXzMoKSB7CisgICAgICAgIC8vIGxhc3QgZmllbGQgb2YgdGhlIGNvbnRhaW5pbmcgc3RydWN0IGlzIGEgZnVsbCB3cml0ZQorICAgICAgICAvLyBmaXJzdCBmaWVsZCBvZiB0aGUgdGhlIGNvbnRhaW5lZCBzdHJ1Y3QgaXMgYSBmdWxsIHdyaXRlCisKKyAgICAgICAgbGV0IChtdXQgaV9wcm90LCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIC8vIHN0YXJ0IGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZUU3RydWN0SWRlbnRpZmllcjo6bmV3KCJmb28iKSkpOworCisgICAgICAgIC8vIGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoZSBkZWx0YSBpcyA+IDAgYW5kIDwgMTUgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGxldCBmaWVsZF9pZGVudF8xID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STY0LCAxKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfMSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBjb250YWluaW5nIHN0cnVjdAorICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMTUgaXQgZ2V0cyBhIGZ1bGwgd3JpdGUKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzIgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpTdHJpbmcsIDIxKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfMikpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzdGFydCBjb250YWluZWQgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZUU3RydWN0SWRlbnRpZmllcjo6bmV3KCJmb28iKSkpOworCisgICAgICAgIC8vIGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDE1IGl0IGdldHMgYSBmdWxsIHdyaXRlCisgICAgICAgIGxldCBmaWVsZF9pZGVudF8zID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6RG91YmxlLCAyMSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzMpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gY29udGFpbmVkIHN0cnVjdAorICAgICAgICAvLyBzaW5jZSB0aGUgZGVsdGEgaXMgPiAwIGFuZCA8IDE1IGl0IGdldHMgYSBkZWx0YSB3cml0ZQorICAgICAgICBsZXQgZmllbGRfaWRlbnRfNCA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkkwOCwgMjcpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF80KSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIGVuZCBjb250YWluZWQgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfc3RvcCgpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfZW5kKCkpOworCisgICAgICAgIC8vIGVuZCBjb250YWluaW5nIHN0cnVjdAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX3N0b3AoKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2VuZCgpKTsKKworICAgICAgICBjb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlciEob19wcm90KTsKKworICAgICAgICAvLyByZWFkIGNvbnRhaW5pbmcgc3RydWN0IGJhY2sKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX3N0cnVjdF9iZWdpbigpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF8xID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF8xLAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzEKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF8yID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF8yLAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzIKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyByZWFkIGNvbnRhaW5lZCBzdHJ1Y3QgYmFjaworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfc3RydWN0X2JlZ2luKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzMgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzMsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfMworICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzQgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzQsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfNAorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIGVuZCBjb250YWluZWQgc3RydWN0CisgICAgICAgIGxldCByZWFkX2lkZW50XzYgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzYsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIGZpZWxkX3R5cGU6IFRUeXBlOjpTdG9wLAorICAgICAgICAgICAgICAgIGlkOiBOb25lLAorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfc3RydWN0X2VuZCgpKTsKKworICAgICAgICAvLyBlbmQgY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfNyA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfNywKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgZmllbGRfdHlwZTogVFR5cGU6OlN0b3AsCisgICAgICAgICAgICAgICAgaWQ6IE5vbmUsCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9zdHJ1Y3RfZW5kKCkpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX2Jvb2xfZmllbGQoKSB7CisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICAvLyBubyBieXRlcyBzaG91bGQgYmUgd3JpdHRlbiBob3dldmVyCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZUU3RydWN0SWRlbnRpZmllcjo6bmV3KCJmb28iKSkpOworCisgICAgICAgIC8vIHdyaXRlIHRocmVlIGZpZWxkcyB3aXRoIGZpZWxkIGlkcyB0aGF0IGNhbm5vdCBiZSBlbmNvZGVkIGFzIGRlbHRhcworCisgICAgICAgIC8vIHNpbmNlIHRoZSBkZWx0YSBpcyA+IDAgYW5kIDwgMTYgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkJvb2wsIDEpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfYm9vbCh0cnVlKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgPiAwIGFuZCA8IDE1IGl0IGdldHMgYSBkZWx0YSB3cml0ZQorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpCb29sLCA5KSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2Jvb2woZmFsc2UpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDE1IGl0IGdldHMgYSBmdWxsIHdyaXRlCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkJvb2wsIDI2KSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2Jvb2wodHJ1ZSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMTUgaXQgZ2V0cyBhIGZ1bGwgd3JpdGUKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6Qm9vbCwgNDUpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfYm9vbChmYWxzZSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBub3csIGZpbmlzaCB0aGUgc3RydWN0IG9mZgorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX3N0b3AoKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2VuZCgpKTsKKworICAgICAgICAjW2NmZ19hdHRyKHJ1c3RmbXQsIHJ1c3RmbXQ6OnNraXApXQorICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgN10gPSBbCisgICAgICAgICAgICAweDExLCAvKiBmaWVsZCBkZWx0YSAoMSkgfCB0cnVlICovCisgICAgICAgICAgICAweDgyLCAvKiBmaWVsZCBkZWx0YSAoOCkgfCBmYWxzZSAqLworICAgICAgICAgICAgMHgwMSwgLyogdHJ1ZSAqLworICAgICAgICAgICAgMHgzNCwgLyogZmllbGQgaWQgKi8KKyAgICAgICAgICAgIDB4MDIsIC8qIGZhbHNlICovCisgICAgICAgICAgICAweDVBLCAvKiBmaWVsZCBpZCAqLworICAgICAgICAgICAgMHgwMCAvKiBzdG9wIGZpZWxkICovLAorICAgICAgICBdOworCisgICAgICAgIGFzc2VydF9lcV93cml0dGVuX2J5dGVzIShvX3Byb3QsIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yb3VuZF90cmlwX2Jvb2xfZmllbGQoKSB7CisgICAgICAgIGxldCAobXV0IGlfcHJvdCwgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICAvLyBubyBieXRlcyBzaG91bGQgYmUgd3JpdHRlbiBob3dldmVyCisgICAgICAgIGxldCBzdHJ1Y3RfaWRlbnQgPSBUU3RydWN0SWRlbnRpZmllcjo6bmV3KCJmb28iKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oJnN0cnVjdF9pZGVudCkpOworCisgICAgICAgIC8vIHdyaXRlIHR3byBmaWVsZHMKKworICAgICAgICAvLyBzaW5jZSB0aGUgZGVsdGEgaXMgPiAwIGFuZCA8IDE2IGl0IGdldHMgYSBkZWx0YSB3cml0ZQorICAgICAgICBsZXQgZmllbGRfaWRlbnRfMSA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkJvb2wsIDEpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF8xKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfYm9vbCh0cnVlKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgPiAwIGFuZCA8IDE1IGl0IGdldHMgYSBkZWx0YSB3cml0ZQorICAgICAgICBsZXQgZmllbGRfaWRlbnRfMiA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkJvb2wsIDkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF8yKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfYm9vbChmYWxzZSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMTUgaXQgZ2V0cyBhIGZ1bGwgd3JpdGUKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzMgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpCb29sLCAyNik7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzMpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9ib29sKHRydWUpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDE1IGl0IGdldHMgYSBmdWxsIHdyaXRlCisgICAgICAgIGxldCBmaWVsZF9pZGVudF80ID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6Qm9vbCwgNDUpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF80KSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfYm9vbChmYWxzZSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBub3csIGZpbmlzaCB0aGUgc3RydWN0IG9mZgorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX3N0b3AoKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2VuZCgpKTsKKworICAgICAgICBjb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlciEob19wcm90KTsKKworICAgICAgICAvLyByZWFkIHRoZSBzdHJ1Y3QgYmFjaworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfc3RydWN0X2JlZ2luKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzEgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzEsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfMQorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBsZXQgcmVhZF92YWx1ZV8xID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2Jvb2woKSk7CisgICAgICAgIGFzc2VydF9lcSEocmVhZF92YWx1ZV8xLCB0cnVlKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF8yID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF8yLAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzIKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgbGV0IHJlYWRfdmFsdWVfMiA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9ib29sKCkpOworICAgICAgICBhc3NlcnRfZXEhKHJlYWRfdmFsdWVfMiwgZmFsc2UpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzMgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzMsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfMworICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBsZXQgcmVhZF92YWx1ZV8zID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2Jvb2woKSk7CisgICAgICAgIGFzc2VydF9lcSEocmVhZF92YWx1ZV8zLCB0cnVlKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF80ID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF80LAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzQKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgbGV0IHJlYWRfdmFsdWVfNCA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9ib29sKCkpOworICAgICAgICBhc3NlcnRfZXEhKHJlYWRfdmFsdWVfNCwgZmFsc2UpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzUgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzUsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIGZpZWxkX3R5cGU6IFRUeXBlOjpTdG9wLAorICAgICAgICAgICAgICAgIGlkOiBOb25lLAorICAgICAgICAgICAgfQorICAgICAgICApOworCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9zdHJ1Y3RfZW5kKCkpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICAjW3Nob3VsZF9wYW5pY10KKyAgICBmbiBtdXN0X2ZhaWxfaWZfd3JpdGVfZmllbGRfZW5kX3dpdGhvdXRfd3JpdGluZ19ib29sX3ZhbHVlKCkgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZUU3RydWN0SWRlbnRpZmllcjo6bmV3KCJmb28iKSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpCb29sLCAxKSkpOworICAgICAgICBvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkudW53cmFwKCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgICNbc2hvdWxkX3BhbmljXQorICAgIGZuIG11c3RfZmFpbF9pZl93cml0ZV9zdG9wX2ZpZWxkX3dpdGhvdXRfd3JpdGluZ19ib29sX3ZhbHVlKCkgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZUU3RydWN0SWRlbnRpZmllcjo6bmV3KCJmb28iKSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpCb29sLCAxKSkpOworICAgICAgICBvX3Byb3Qud3JpdGVfZmllbGRfc3RvcCgpLnVud3JhcCgpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICAjW3Nob3VsZF9wYW5pY10KKyAgICBmbiBtdXN0X2ZhaWxfaWZfd3JpdGVfc3RydWN0X2VuZF93aXRob3V0X3dyaXRpbmdfYm9vbF92YWx1ZSgpIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9iZWdpbigmVFN0cnVjdElkZW50aWZpZXI6Om5ldygiZm9vIikpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6Qm9vbCwgMSkpKTsKKyAgICAgICAgb19wcm90LndyaXRlX3N0cnVjdF9lbmQoKS51bndyYXAoKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgI1tzaG91bGRfcGFuaWNdCisgICAgZm4gbXVzdF9mYWlsX2lmX3dyaXRlX3N0cnVjdF9lbmRfd2l0aG91dF9hbnlfZmllbGRzKCkgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisgICAgICAgIG9fcHJvdC53cml0ZV9zdHJ1Y3RfZW5kKCkudW53cmFwKCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfZmllbGRfZW5kKCkgeworICAgICAgICBhc3NlcnRfbm9fd3JpdGUofG98IG8ud3JpdGVfZmllbGRfZW5kKCkpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX3NtYWxsX3NpemVkX2xpc3RfYmVnaW4oKSB7CisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2xpc3RfYmVnaW4oJlRMaXN0SWRlbnRpZmllcjo6bmV3KFRUeXBlOjpJNjQsIDQpKSk7CisKKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDFdID0gWzB4NDYgLyogc2l6ZSB8IGVsZW1fdHlwZSAqL107CisKKyAgICAgICAgYXNzZXJ0X2VxX3dyaXR0ZW5fYnl0ZXMhKG9fcHJvdCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JvdW5kX3RyaXBfc21hbGxfc2l6ZWRfbGlzdF9iZWdpbigpIHsKKyAgICAgICAgbGV0IChtdXQgaV9wcm90LCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIGxldCBpZGVudCA9IFRMaXN0SWRlbnRpZmllcjo6bmV3KFRUeXBlOjpJMDgsIDEwKTsKKworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2xpc3RfYmVnaW4oJmlkZW50KSk7CisKKyAgICAgICAgY29weV93cml0ZV9idWZmZXJfdG9fcmVhZF9idWZmZXIhKG9fcHJvdCk7CisKKyAgICAgICAgbGV0IHJlcyA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9saXN0X2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKCZyZXMsICZpZGVudCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfbGFyZ2Vfc2l6ZWRfbGlzdF9iZWdpbigpIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIGxldCByZXMgPSBvX3Byb3Qud3JpdGVfbGlzdF9iZWdpbigmVExpc3RJZGVudGlmaWVyOjpuZXcoVFR5cGU6Okxpc3QsIDk5OTkpKTsKKyAgICAgICAgYXNzZXJ0IShyZXMuaXNfb2soKSk7CisKKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDNdID0gWworICAgICAgICAgICAgMHhGOSwgLyogMHhGMCB8IGVsZW1fdHlwZSAqLworICAgICAgICAgICAgMHg4RiwgMHg0RSwgLyogc2l6ZSBhcyB2YXJpbnQgKi8KKyAgICAgICAgXTsKKworICAgICAgICBhc3NlcnRfZXFfd3JpdHRlbl9ieXRlcyEob19wcm90LCBleHBlY3RlZCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfcm91bmRfdHJpcF9sYXJnZV9zaXplZF9saXN0X2JlZ2luKCkgeworICAgICAgICBsZXQgKG11dCBpX3Byb3QsIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgbGV0IGlkZW50ID0gVExpc3RJZGVudGlmaWVyOjpuZXcoVFR5cGU6OlNldCwgNDczODEpOworCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfbGlzdF9iZWdpbigmaWRlbnQpKTsKKworICAgICAgICBjb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlciEob19wcm90KTsKKworICAgICAgICBsZXQgcmVzID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2xpc3RfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoJnJlcywgJmlkZW50KTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9saXN0X2VuZCgpIHsKKyAgICAgICAgYXNzZXJ0X25vX3dyaXRlKHxvfCBvLndyaXRlX2xpc3RfZW5kKCkpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX3NtYWxsX3NpemVkX3NldF9iZWdpbigpIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc2V0X2JlZ2luKCZUU2V0SWRlbnRpZmllcjo6bmV3KFRUeXBlOjpTdHJ1Y3QsIDIpKSk7CisKKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDFdID0gWzB4MkMgLyogc2l6ZSB8IGVsZW1fdHlwZSAqL107CisKKyAgICAgICAgYXNzZXJ0X2VxX3dyaXR0ZW5fYnl0ZXMhKG9fcHJvdCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JvdW5kX3RyaXBfc21hbGxfc2l6ZWRfc2V0X2JlZ2luKCkgeworICAgICAgICBsZXQgKG11dCBpX3Byb3QsIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgbGV0IGlkZW50ID0gVFNldElkZW50aWZpZXI6Om5ldyhUVHlwZTo6STE2LCA3KTsKKworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3NldF9iZWdpbigmaWRlbnQpKTsKKworICAgICAgICBjb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlciEob19wcm90KTsKKworICAgICAgICBsZXQgcmVzID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX3NldF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmcmVzLCAmaWRlbnQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX2xhcmdlX3NpemVkX3NldF9iZWdpbigpIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc2V0X2JlZ2luKCZUU2V0SWRlbnRpZmllcjo6bmV3KFRUeXBlOjpEb3VibGUsIDIzODkxKSkpOworCisgICAgICAgIGxldCBleHBlY3RlZDogW3U4OyA0XSA9IFsKKyAgICAgICAgICAgIDB4RjcsIC8qIDB4RjAgfCBlbGVtX3R5cGUgKi8KKyAgICAgICAgICAgIDB4RDMsIDB4QkEsIDB4MDEsIC8qIHNpemUgYXMgdmFyaW50ICovCisgICAgICAgIF07CisKKyAgICAgICAgYXNzZXJ0X2VxX3dyaXR0ZW5fYnl0ZXMhKG9fcHJvdCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JvdW5kX3RyaXBfbGFyZ2Vfc2l6ZWRfc2V0X2JlZ2luKCkgeworICAgICAgICBsZXQgKG11dCBpX3Byb3QsIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgbGV0IGlkZW50ID0gVFNldElkZW50aWZpZXI6Om5ldyhUVHlwZTo6TWFwLCAzOTI4NDI5KTsKKworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3NldF9iZWdpbigmaWRlbnQpKTsKKworICAgICAgICBjb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlciEob19wcm90KTsKKworICAgICAgICBsZXQgcmVzID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX3NldF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmcmVzLCAmaWRlbnQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX3NldF9lbmQoKSB7CisgICAgICAgIGFzc2VydF9ub193cml0ZSh8b3wgby53cml0ZV9zZXRfZW5kKCkpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX3plcm9fc2l6ZWRfbWFwX2JlZ2luKCkgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9tYXBfYmVnaW4oJlRNYXBJZGVudGlmaWVyOjpuZXcoVFR5cGU6OlN0cmluZywgVFR5cGU6OkkzMiwgMCkpKTsKKworICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgMV0gPSBbMHgwMF07IC8vIHNpbmNlIHNpemUgaXMgemVybyB3ZSBkb24ndCB3cml0ZSBhbnl0aGluZworCisgICAgICAgIGFzc2VydF9lcV93cml0dGVuX2J5dGVzIShvX3Byb3QsIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yZWFkX3plcm9fc2l6ZWRfbWFwX2JlZ2luKCkgeworICAgICAgICBsZXQgKG11dCBpX3Byb3QsIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9tYXBfYmVnaW4oJlRNYXBJZGVudGlmaWVyOjpuZXcoVFR5cGU6OkRvdWJsZSwgVFR5cGU6OkkzMiwgMCkpKTsKKworICAgICAgICBjb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlciEob19wcm90KTsKKworICAgICAgICBsZXQgcmVzID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX21hcF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgICZyZXMsCisgICAgICAgICAgICAmVE1hcElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIGtleV90eXBlOiBOb25lLAorICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU6IE5vbmUsCisgICAgICAgICAgICAgICAgc2l6ZTogMCwKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9tYXBfYmVnaW4oKSB7CisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX21hcF9iZWdpbigmVE1hcElkZW50aWZpZXI6Om5ldygKKyAgICAgICAgICAgIFRUeXBlOjpEb3VibGUsCisgICAgICAgICAgICBUVHlwZTo6U3RyaW5nLAorICAgICAgICAgICAgMjM4CisgICAgICAgICkpKTsKKworICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgM10gPSBbCisgICAgICAgICAgICAweEVFLCAweDAxLCAvKiBzaXplIGFzIHZhcmludCAqLworICAgICAgICAgICAgMHg3OCwgLyoga2V5IHR5cGUgfCB2YWwgdHlwZSAqLworICAgICAgICBdOworCisgICAgICAgIGFzc2VydF9lcV93cml0dGVuX2J5dGVzIShvX3Byb3QsIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yb3VuZF90cmlwX21hcF9iZWdpbigpIHsKKyAgICAgICAgbGV0IChtdXQgaV9wcm90LCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIGxldCBpZGVudCA9IFRNYXBJZGVudGlmaWVyOjpuZXcoVFR5cGU6Ok1hcCwgVFR5cGU6Okxpc3QsIDE5MjgzNDkpOworCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfbWFwX2JlZ2luKCZpZGVudCkpOworCisgICAgICAgIGNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyIShvX3Byb3QpOworCisgICAgICAgIGxldCByZXMgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfbWFwX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKCZyZXMsICZpZGVudCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfbWFwX2VuZCgpIHsKKyAgICAgICAgYXNzZXJ0X25vX3dyaXRlKHxvfCBvLndyaXRlX21hcF9lbmQoKSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfbWFwX3dpdGhfYm9vbF9rZXlfYW5kX3ZhbHVlKCkgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9tYXBfYmVnaW4oJlRNYXBJZGVudGlmaWVyOjpuZXcoVFR5cGU6OkJvb2wsIFRUeXBlOjpCb29sLCAxKSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2Jvb2wodHJ1ZSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2Jvb2woZmFsc2UpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9tYXBfZW5kKCkpOworCisgICAgICAgIGxldCBleHBlY3RlZDogW3U4OyA0XSA9IFsKKyAgICAgICAgICAgIDB4MDEsIC8qIHNpemUgYXMgdmFyaW50ICovCisgICAgICAgICAgICAweDExLCAvKiBrZXkgdHlwZSB8IHZhbCB0eXBlICovCisgICAgICAgICAgICAweDAxLCAvKiBrZXk6IHRydWUgKi8KKyAgICAgICAgICAgIDB4MDIsIC8qIHZhbDogZmFsc2UgKi8KKyAgICAgICAgXTsKKworICAgICAgICBhc3NlcnRfZXFfd3JpdHRlbl9ieXRlcyEob19wcm90LCBleHBlY3RlZCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfcm91bmRfdHJpcF9tYXBfd2l0aF9ib29sX3ZhbHVlKCkgeworICAgICAgICBsZXQgKG11dCBpX3Byb3QsIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgbGV0IG1hcF9pZGVudCA9IFRNYXBJZGVudGlmaWVyOjpuZXcoVFR5cGU6OkJvb2wsIFRUeXBlOjpCb29sLCAyKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9tYXBfYmVnaW4oJm1hcF9pZGVudCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2Jvb2wodHJ1ZSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2Jvb2woZmFsc2UpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9ib29sKGZhbHNlKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfYm9vbCh0cnVlKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfbWFwX2VuZCgpKTsKKworICAgICAgICBjb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlciEob19wcm90KTsKKworICAgICAgICAvLyBtYXAgaGVhZGVyCisgICAgICAgIGxldCByY3ZkX2lkZW50ID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX21hcF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmcmN2ZF9pZGVudCwgJm1hcF9pZGVudCk7CisgICAgICAgIC8vIGtleSAxCisgICAgICAgIGxldCBiID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2Jvb2woKSk7CisgICAgICAgIGFzc2VydF9lcSEoYiwgdHJ1ZSk7CisgICAgICAgIC8vIHZhbCAxCisgICAgICAgIGxldCBiID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2Jvb2woKSk7CisgICAgICAgIGFzc2VydF9lcSEoYiwgZmFsc2UpOworICAgICAgICAvLyBrZXkgMgorICAgICAgICBsZXQgYiA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9ib29sKCkpOworICAgICAgICBhc3NlcnRfZXEhKGIsIGZhbHNlKTsKKyAgICAgICAgLy8gdmFsIDIKKyAgICAgICAgbGV0IGIgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfYm9vbCgpKTsKKyAgICAgICAgYXNzZXJ0X2VxIShiLCB0cnVlKTsKKyAgICAgICAgLy8gbWFwIGVuZAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfbWFwX2VuZCgpKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yZWFkX21hcF9lbmQoKSB7CisgICAgICAgIGxldCAobXV0IGlfcHJvdCwgXykgPSB0ZXN0X29iamVjdHMoKTsKKyAgICAgICAgYXNzZXJ0IShpX3Byb3QucmVhZF9tYXBfZW5kKCkuaXNfb2soKSk7IC8vIHdpbGwgYmxvdyB1cCBpZiB3ZSB0cnkgdG8gcmVhZCBmcm9tIGVtcHR5IGJ1ZmZlcgorICAgIH0KKworICAgIGZuIHRlc3Rfb2JqZWN0cygpIC0+ICgKKyAgICAgICAgVENvbXBhY3RJbnB1dFByb3RvY29sPFJlYWRIYWxmPFRCdWZmZXJDaGFubmVsPj4sCisgICAgICAgIFRDb21wYWN0T3V0cHV0UHJvdG9jb2w8V3JpdGVIYWxmPFRCdWZmZXJDaGFubmVsPj4sCisgICAgKSB7CisgICAgICAgIGxldCBtZW0gPSBUQnVmZmVyQ2hhbm5lbDo6d2l0aF9jYXBhY2l0eSg4MCwgODApOworCisgICAgICAgIGxldCAocl9tZW0sIHdfbWVtKSA9IG1lbS5zcGxpdCgpLnVud3JhcCgpOworCisgICAgICAgIGxldCBpX3Byb3QgPSBUQ29tcGFjdElucHV0UHJvdG9jb2w6Om5ldyhyX21lbSk7CisgICAgICAgIGxldCBvX3Byb3QgPSBUQ29tcGFjdE91dHB1dFByb3RvY29sOjpuZXcod19tZW0pOworCisgICAgICAgIChpX3Byb3QsIG9fcHJvdCkKKyAgICB9CisKKyAgICBmbiBhc3NlcnRfbm9fd3JpdGU8Rj4obXV0IHdyaXRlX2ZuOiBGKQorICAgIHdoZXJlCisgICAgICAgIEY6IEZuTXV0KCZtdXQgVENvbXBhY3RPdXRwdXRQcm90b2NvbDxXcml0ZUhhbGY8VEJ1ZmZlckNoYW5uZWw+PikgLT4gOjpSZXN1bHQ8KCk+LAorICAgIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworICAgICAgICBhc3NlcnQhKHdyaXRlX2ZuKCZtdXQgb19wcm90KS5pc19vaygpKTsKKyAgICAgICAgYXNzZXJ0X2VxIShvX3Byb3QudHJhbnNwb3J0LndyaXRlX2J5dGVzKCkubGVuKCksIDApOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9ycy9zcmMvcHJvdG9jb2wvbW9kLnJzIGIvbGliL3JzL3NyYy9wcm90b2NvbC9tb2QucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFjMDI4OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ycy9zcmMvcHJvdG9jb2wvbW9kLnJzCkBAIC0wLDAgKzEsOTY5IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vISBUeXBlcyB1c2VkIHRvIHNlbmQgYW5kIHJlY2VpdmUgcHJpbWl0aXZlcyBiZXR3ZWVuIGEgVGhyaWZ0IGNsaWVudCBhbmQgc2VydmVyLgorLy8hCisvLyEgIyBFeGFtcGxlcworLy8hCisvLyEgQ3JlYXRlIGFuZCB1c2UgYSBgVElucHV0UHJvdG9jb2xgLgorLy8hCisvLyEgYGBgbm9fcnVuCisvLyEgdXNlIHRocmlmdDo6cHJvdG9jb2w6OntUQmluYXJ5SW5wdXRQcm90b2NvbCwgVElucHV0UHJvdG9jb2x9OworLy8hIHVzZSB0aHJpZnQ6OnRyYW5zcG9ydDo6VFRjcENoYW5uZWw7CisvLyEKKy8vISAvLyBjcmVhdGUgdGhlIEkvTyBjaGFubmVsCisvLyEgbGV0IG11dCBjaGFubmVsID0gVFRjcENoYW5uZWw6Om5ldygpOworLy8hIGNoYW5uZWwub3BlbigiMTI3LjAuMC4xOjkwOTAiKS51bndyYXAoKTsKKy8vIQorLy8hIC8vIGNyZWF0ZSB0aGUgcHJvdG9jb2wgdG8gZGVjb2RlIGJ5dGVzIGludG8gdHlwZXMKKy8vISBsZXQgbXV0IHByb3RvY29sID0gVEJpbmFyeUlucHV0UHJvdG9jb2w6Om5ldyhjaGFubmVsLCB0cnVlKTsKKy8vIQorLy8hIC8vIHJlYWQgdHlwZXMgZnJvbSB0aGUgd2lyZQorLy8hIGxldCBmaWVsZF9pZGVudGlmaWVyID0gcHJvdG9jb2wucmVhZF9maWVsZF9iZWdpbigpLnVud3JhcCgpOworLy8hIGxldCBmaWVsZF9jb250ZW50cyA9IHByb3RvY29sLnJlYWRfc3RyaW5nKCkudW53cmFwKCk7CisvLyEgbGV0IGZpZWxkX2VuZCA9IHByb3RvY29sLnJlYWRfZmllbGRfZW5kKCkudW53cmFwKCk7CisvLyEgYGBgCisvLyEKKy8vISBDcmVhdGUgYW5kIHVzZSBhIGBUT3V0cHV0UHJvdG9jb2xgLgorLy8hCisvLyEgYGBgbm9fcnVuCisvLyEgdXNlIHRocmlmdDo6cHJvdG9jb2w6OntUQmluYXJ5T3V0cHV0UHJvdG9jb2wsIFRGaWVsZElkZW50aWZpZXIsIFRPdXRwdXRQcm90b2NvbCwgVFR5cGV9OworLy8hIHVzZSB0aHJpZnQ6OnRyYW5zcG9ydDo6VFRjcENoYW5uZWw7CisvLyEKKy8vISAvLyBjcmVhdGUgdGhlIEkvTyBjaGFubmVsCisvLyEgbGV0IG11dCBjaGFubmVsID0gVFRjcENoYW5uZWw6Om5ldygpOworLy8hIGNoYW5uZWwub3BlbigiMTI3LjAuMC4xOjkwOTAiKS51bndyYXAoKTsKKy8vIQorLy8hIC8vIGNyZWF0ZSB0aGUgcHJvdG9jb2wgdG8gZW5jb2RlIHR5cGVzIGludG8gYnl0ZXMKKy8vISBsZXQgbXV0IHByb3RvY29sID0gVEJpbmFyeU91dHB1dFByb3RvY29sOjpuZXcoY2hhbm5lbCwgdHJ1ZSk7CisvLyEKKy8vISAvLyB3cml0ZSB0eXBlcworLy8hIHByb3RvY29sLndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoInN0cmluZ190aGluZyIsIFRUeXBlOjpTdHJpbmcsIDEpKS51bndyYXAoKTsKKy8vISBwcm90b2NvbC53cml0ZV9zdHJpbmcoImZvbyIpLnVud3JhcCgpOworLy8hIHByb3RvY29sLndyaXRlX2ZpZWxkX2VuZCgpLnVud3JhcCgpOworLy8hIGBgYAorCit1c2Ugc3RkOjpjb252ZXJ0OjpGcm9tOwordXNlIHN0ZDo6Zm10OwordXNlIHN0ZDo6Zm10Ojp7RGlzcGxheSwgRm9ybWF0dGVyfTsKK3VzZSB0cnlfZnJvbTo6VHJ5RnJvbTsKKwordXNlIHRyYW5zcG9ydDo6e1RSZWFkVHJhbnNwb3J0LCBUV3JpdGVUcmFuc3BvcnR9OwordXNlIHtQcm90b2NvbEVycm9yLCBQcm90b2NvbEVycm9yS2luZH07CisKKyNbY2ZnKHRlc3QpXQorbWFjcm9fcnVsZXMhIGFzc2VydF9lcV93cml0dGVuX2J5dGVzIHsKKyAgICAoJG9fcHJvdDppZGVudCwgJGV4cGVjdGVkX2J5dGVzOmlkZW50KSA9PiB7eworICAgICAgICBhc3NlcnRfZXEhKCRvX3Byb3QudHJhbnNwb3J0LndyaXRlX2J5dGVzKCksICYkZXhwZWN0ZWRfYnl0ZXMpOworICAgIH19OworfQorCisvLyBGSVhNRTogc2hvdWxkIHRha2UgYm90aCByZWFkIGFuZCB3cml0ZQorI1tjZmcodGVzdCldCittYWNyb19ydWxlcyEgY29weV93cml0ZV9idWZmZXJfdG9fcmVhZF9idWZmZXIgeworICAgICgkb19wcm90OmlkZW50KSA9PiB7eworICAgICAgICAkb19wcm90LnRyYW5zcG9ydC5jb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlcigpOworICAgIH19OworfQorCisjW2NmZyh0ZXN0KV0KK21hY3JvX3J1bGVzISBzZXRfcmVhZGFibGVfYnl0ZXMgeworICAgICgkaV9wcm90OmlkZW50LCAkYnl0ZXM6ZXhwcikgPT4geworICAgICAgICAkaV9wcm90LnRyYW5zcG9ydC5zZXRfcmVhZGFibGVfYnl0ZXMoJGJ5dGVzKTsKKyAgICB9OworfQorCittb2QgYmluYXJ5OworbW9kIGNvbXBhY3Q7Cittb2QgbXVsdGlwbGV4ZWQ7Cittb2Qgc3RvcmVkOworCitwdWIgdXNlIHNlbGY6OmJpbmFyeTo6eworICAgIFRCaW5hcnlJbnB1dFByb3RvY29sLCBUQmluYXJ5SW5wdXRQcm90b2NvbEZhY3RvcnksIFRCaW5hcnlPdXRwdXRQcm90b2NvbCwKKyAgICBUQmluYXJ5T3V0cHV0UHJvdG9jb2xGYWN0b3J5LAorfTsKK3B1YiB1c2Ugc2VsZjo6Y29tcGFjdDo6eworICAgIFRDb21wYWN0SW5wdXRQcm90b2NvbCwgVENvbXBhY3RJbnB1dFByb3RvY29sRmFjdG9yeSwgVENvbXBhY3RPdXRwdXRQcm90b2NvbCwKKyAgICBUQ29tcGFjdE91dHB1dFByb3RvY29sRmFjdG9yeSwKK307CitwdWIgdXNlIHNlbGY6Om11bHRpcGxleGVkOjpUTXVsdGlwbGV4ZWRPdXRwdXRQcm90b2NvbDsKK3B1YiB1c2Ugc2VsZjo6c3RvcmVkOjpUU3RvcmVkSW5wdXRQcm90b2NvbDsKKworLy8gRGVmYXVsdCBtYXhpbXVtIGRlcHRoIHRvIHdoaWNoIGBUSW5wdXRQcm90b2NvbDo6c2tpcGAgd2lsbCBza2lwIGEgVGhyaWZ0CisvLyBmaWVsZC4gQSBkZWZhdWx0IGlzIG5lY2Vzc2FyeSBiZWNhdXNlIFRocmlmdCBzdHJ1Y3RzIG9yIGNvbGxlY3Rpb25zIG1heQorLy8gY29udGFpbiBuZXN0ZWQgc3RydWN0cyBhbmQgY29sbGVjdGlvbnMsIHdoaWNoIGNvdWxkIHJlc3VsdCBpbiBpbmRlZmluaXRlCisvLyByZWN1cnNpb24uCitjb25zdCBNQVhJTVVNX1NLSVBfREVQVEg6IGk4ID0gNjQ7CisKKy8vLyBDb252ZXJ0cyBhIHN0cmVhbSBvZiBieXRlcyBpbnRvIFRocmlmdCBpZGVudGlmaWVycywgcHJpbWl0aXZlcywKKy8vLyBjb250YWluZXJzLCBvciBzdHJ1Y3RzLgorLy8vCisvLy8gVGhpcyB0cmFpdCBkb2VzIG5vdCBkZWFsIHdpdGggaGlnaGVyLWxldmVsIFRocmlmdCBjb25jZXB0cyBsaWtlIHN0cnVjdHMgb3IKKy8vLyBleGNlcHRpb25zIC0gb25seSB3aXRoIHByaW1pdGl2ZXMgYW5kIG1lc3NhZ2Ugb3IgY29udGFpbmVyIGJvdW5kYXJpZXMuIE9uY2UKKy8vLyBieXRlcyBhcmUgcmVhZCB0aGV5IGFyZSBkZXNlcmlhbGl6ZWQgYW5kIGFuIGlkZW50aWZpZXIgKGZvciBleGFtcGxlCisvLy8gYFRNZXNzYWdlSWRlbnRpZmllcmApIG9yIGEgcHJpbWl0aXZlIGlzIHJldHVybmVkLgorLy8vCisvLy8gQWxsIG1ldGhvZHMgcmV0dXJuIGEgYHRocmlmdDo6UmVzdWx0YC4gSWYgYW4gYEVycmAgaXMgcmV0dXJuZWQgdGhlIHByb3RvY29sCisvLy8gaW5zdGFuY2UgYW5kIGl0cyB1bmRlcmx5aW5nIHRyYW5zcG9ydCBzaG91bGQgYmUgdGVybWluYXRlZC4KKy8vLworLy8vICMgRXhhbXBsZXMKKy8vLworLy8vIENyZWF0ZSBhbmQgdXNlIGEgYFRJbnB1dFByb3RvY29sYAorLy8vCisvLy8gYGBgbm9fcnVuCisvLy8gdXNlIHRocmlmdDo6cHJvdG9jb2w6OntUQmluYXJ5SW5wdXRQcm90b2NvbCwgVElucHV0UHJvdG9jb2x9OworLy8vIHVzZSB0aHJpZnQ6OnRyYW5zcG9ydDo6VFRjcENoYW5uZWw7CisvLy8KKy8vLyBsZXQgbXV0IGNoYW5uZWwgPSBUVGNwQ2hhbm5lbDo6bmV3KCk7CisvLy8gY2hhbm5lbC5vcGVuKCIxMjcuMC4wLjE6OTA5MCIpLnVud3JhcCgpOworLy8vCisvLy8gbGV0IG11dCBwcm90b2NvbCA9IFRCaW5hcnlJbnB1dFByb3RvY29sOjpuZXcoY2hhbm5lbCwgdHJ1ZSk7CisvLy8KKy8vLyBsZXQgZmllbGRfaWRlbnRpZmllciA9IHByb3RvY29sLnJlYWRfZmllbGRfYmVnaW4oKS51bndyYXAoKTsKKy8vLyBsZXQgZmllbGRfY29udGVudHMgPSBwcm90b2NvbC5yZWFkX3N0cmluZygpLnVud3JhcCgpOworLy8vIGxldCBmaWVsZF9lbmQgPSBwcm90b2NvbC5yZWFkX2ZpZWxkX2VuZCgpLnVud3JhcCgpOworLy8vIGBgYAorcHViIHRyYWl0IFRJbnB1dFByb3RvY29sIHsKKyAgICAvLy8gUmVhZCB0aGUgYmVnaW5uaW5nIG9mIGEgVGhyaWZ0IG1lc3NhZ2UuCisgICAgZm4gcmVhZF9tZXNzYWdlX2JlZ2luKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8VE1lc3NhZ2VJZGVudGlmaWVyPjsKKyAgICAvLy8gUmVhZCB0aGUgZW5kIG9mIGEgVGhyaWZ0IG1lc3NhZ2UuCisgICAgZm4gcmVhZF9tZXNzYWdlX2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPjsKKyAgICAvLy8gUmVhZCB0aGUgYmVnaW5uaW5nIG9mIGEgVGhyaWZ0IHN0cnVjdC4KKyAgICBmbiByZWFkX3N0cnVjdF9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PE9wdGlvbjxUU3RydWN0SWRlbnRpZmllcj4+OworICAgIC8vLyBSZWFkIHRoZSBlbmQgb2YgYSBUaHJpZnQgc3RydWN0LgorICAgIGZuIHJlYWRfc3RydWN0X2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPjsKKyAgICAvLy8gUmVhZCB0aGUgYmVnaW5uaW5nIG9mIGEgVGhyaWZ0IHN0cnVjdCBmaWVsZC4KKyAgICBmbiByZWFkX2ZpZWxkX2JlZ2luKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8VEZpZWxkSWRlbnRpZmllcj47CisgICAgLy8vIFJlYWQgdGhlIGVuZCBvZiBhIFRocmlmdCBzdHJ1Y3QgZmllbGQuCisgICAgZm4gcmVhZF9maWVsZF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT47CisgICAgLy8vIFJlYWQgYSBib29sLgorICAgIGZuIHJlYWRfYm9vbCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PGJvb2w+OworICAgIC8vLyBSZWFkIGEgZml4ZWQtbGVuZ3RoIGJ5dGUgYXJyYXkuCisgICAgZm4gcmVhZF9ieXRlcygmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFZlYzx1OD4+OworICAgIC8vLyBSZWFkIGEgd29yZC4KKyAgICBmbiByZWFkX2k4KCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8aTg+OworICAgIC8vLyBSZWFkIGEgMTYtYml0IHNpZ25lZCBpbnRlZ2VyLgorICAgIGZuIHJlYWRfaTE2KCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8aTE2PjsKKyAgICAvLy8gUmVhZCBhIDMyLWJpdCBzaWduZWQgaW50ZWdlci4KKyAgICBmbiByZWFkX2kzMigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PGkzMj47CisgICAgLy8vIFJlYWQgYSA2NC1iaXQgc2lnbmVkIGludGVnZXIuCisgICAgZm4gcmVhZF9pNjQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxpNjQ+OworICAgIC8vLyBSZWFkIGEgNjQtYml0IGZsb2F0LgorICAgIGZuIHJlYWRfZG91YmxlKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8ZjY0PjsKKyAgICAvLy8gUmVhZCBhIGZpeGVkLWxlbmd0aCBzdHJpbmcgKG5vdCBudWxsIHRlcm1pbmF0ZWQpLgorICAgIGZuIHJlYWRfc3RyaW5nKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8U3RyaW5nPjsKKyAgICAvLy8gUmVhZCB0aGUgYmVnaW5uaW5nIG9mIGEgbGlzdC4KKyAgICBmbiByZWFkX2xpc3RfYmVnaW4oJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxUTGlzdElkZW50aWZpZXI+OworICAgIC8vLyBSZWFkIHRoZSBlbmQgb2YgYSBsaXN0LgorICAgIGZuIHJlYWRfbGlzdF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT47CisgICAgLy8vIFJlYWQgdGhlIGJlZ2lubmluZyBvZiBhIHNldC4KKyAgICBmbiByZWFkX3NldF9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFRTZXRJZGVudGlmaWVyPjsKKyAgICAvLy8gUmVhZCB0aGUgZW5kIG9mIGEgc2V0LgorICAgIGZuIHJlYWRfc2V0X2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPjsKKyAgICAvLy8gUmVhZCB0aGUgYmVnaW5uaW5nIG9mIGEgbWFwLgorICAgIGZuIHJlYWRfbWFwX2JlZ2luKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8VE1hcElkZW50aWZpZXI+OworICAgIC8vLyBSZWFkIHRoZSBlbmQgb2YgYSBtYXAuCisgICAgZm4gcmVhZF9tYXBfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+OworICAgIC8vLyBTa2lwIGEgZmllbGQgd2l0aCB0eXBlIGBmaWVsZF90eXBlYCByZWN1cnNpdmVseSB1bnRpbCB0aGUgZGVmYXVsdAorICAgIC8vLyBtYXhpbXVtIHNraXAgZGVwdGggaXMgcmVhY2hlZC4KKyAgICBmbiBza2lwKCZtdXQgc2VsZiwgZmllbGRfdHlwZTogVFR5cGUpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuc2tpcF90aWxsX2RlcHRoKGZpZWxkX3R5cGUsIE1BWElNVU1fU0tJUF9ERVBUSCkKKyAgICB9CisgICAgLy8vIFNraXAgYSBmaWVsZCB3aXRoIHR5cGUgYGZpZWxkX3R5cGVgIHJlY3Vyc2l2ZWx5IHVwIHRvIGBkZXB0aGAgbGV2ZWxzLgorICAgIGZuIHNraXBfdGlsbF9kZXB0aCgmbXV0IHNlbGYsIGZpZWxkX3R5cGU6IFRUeXBlLCBkZXB0aDogaTgpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIGlmIGRlcHRoID09IDAgeworICAgICAgICAgICAgcmV0dXJuIEVycig6OkVycm9yOjpQcm90b2NvbChQcm90b2NvbEVycm9yIHsKKyAgICAgICAgICAgICAgICBraW5kOiBQcm90b2NvbEVycm9yS2luZDo6RGVwdGhMaW1pdCwKKyAgICAgICAgICAgICAgICBtZXNzYWdlOiBmb3JtYXQhKCJjYW5ub3QgcGFyc2UgcGFzdCB7Oj99IiwgZmllbGRfdHlwZSksCisgICAgICAgICAgICB9KSk7CisgICAgICAgIH0KKworICAgICAgICBtYXRjaCBmaWVsZF90eXBlIHsKKyAgICAgICAgICAgIFRUeXBlOjpCb29sID0+IHNlbGYucmVhZF9ib29sKCkubWFwKHxffCAoKSksCisgICAgICAgICAgICBUVHlwZTo6STA4ID0+IHNlbGYucmVhZF9pOCgpLm1hcCh8X3wgKCkpLAorICAgICAgICAgICAgVFR5cGU6OkkxNiA9PiBzZWxmLnJlYWRfaTE2KCkubWFwKHxffCAoKSksCisgICAgICAgICAgICBUVHlwZTo6STMyID0+IHNlbGYucmVhZF9pMzIoKS5tYXAofF98ICgpKSwKKyAgICAgICAgICAgIFRUeXBlOjpJNjQgPT4gc2VsZi5yZWFkX2k2NCgpLm1hcCh8X3wgKCkpLAorICAgICAgICAgICAgVFR5cGU6OkRvdWJsZSA9PiBzZWxmLnJlYWRfZG91YmxlKCkubWFwKHxffCAoKSksCisgICAgICAgICAgICBUVHlwZTo6U3RyaW5nID0+IHNlbGYucmVhZF9zdHJpbmcoKS5tYXAofF98ICgpKSwKKyAgICAgICAgICAgIFRUeXBlOjpTdHJ1Y3QgPT4geworICAgICAgICAgICAgICAgIHNlbGYucmVhZF9zdHJ1Y3RfYmVnaW4oKT87CisgICAgICAgICAgICAgICAgbG9vcCB7CisgICAgICAgICAgICAgICAgICAgIGxldCBmaWVsZF9pZGVudCA9IHNlbGYucmVhZF9maWVsZF9iZWdpbigpPzsKKyAgICAgICAgICAgICAgICAgICAgaWYgZmllbGRfaWRlbnQuZmllbGRfdHlwZSA9PSBUVHlwZTo6U3RvcCB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzZWxmLnNraXBfdGlsbF9kZXB0aChmaWVsZF9pZGVudC5maWVsZF90eXBlLCBkZXB0aCAtIDEpPzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2VsZi5yZWFkX3N0cnVjdF9lbmQoKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgVFR5cGU6Okxpc3QgPT4geworICAgICAgICAgICAgICAgIGxldCBsaXN0X2lkZW50ID0gc2VsZi5yZWFkX2xpc3RfYmVnaW4oKT87CisgICAgICAgICAgICAgICAgZm9yIF8gaW4gMC4ubGlzdF9pZGVudC5zaXplIHsKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5za2lwX3RpbGxfZGVwdGgobGlzdF9pZGVudC5lbGVtZW50X3R5cGUsIGRlcHRoIC0gMSk/OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZWxmLnJlYWRfbGlzdF9lbmQoKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgVFR5cGU6OlNldCA9PiB7CisgICAgICAgICAgICAgICAgbGV0IHNldF9pZGVudCA9IHNlbGYucmVhZF9zZXRfYmVnaW4oKT87CisgICAgICAgICAgICAgICAgZm9yIF8gaW4gMC4uc2V0X2lkZW50LnNpemUgeworICAgICAgICAgICAgICAgICAgICBzZWxmLnNraXBfdGlsbF9kZXB0aChzZXRfaWRlbnQuZWxlbWVudF90eXBlLCBkZXB0aCAtIDEpPzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2VsZi5yZWFkX3NldF9lbmQoKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgVFR5cGU6Ok1hcCA9PiB7CisgICAgICAgICAgICAgICAgbGV0IG1hcF9pZGVudCA9IHNlbGYucmVhZF9tYXBfYmVnaW4oKT87CisgICAgICAgICAgICAgICAgZm9yIF8gaW4gMC4ubWFwX2lkZW50LnNpemUgeworICAgICAgICAgICAgICAgICAgICBsZXQga2V5X3R5cGUgPSBtYXBfaWRlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgIC5rZXlfdHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgLmV4cGVjdCgibm9uLXplcm8gc2l6ZWQgbWFwIHNob3VsZCBjb250YWluIGtleSB0eXBlIik7CisgICAgICAgICAgICAgICAgICAgIGxldCB2YWxfdHlwZSA9IG1hcF9pZGVudAorICAgICAgICAgICAgICAgICAgICAgICAgLnZhbHVlX3R5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgIC5leHBlY3QoIm5vbi16ZXJvIHNpemVkIG1hcCBzaG91bGQgY29udGFpbiB2YWx1ZSB0eXBlIik7CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc2tpcF90aWxsX2RlcHRoKGtleV90eXBlLCBkZXB0aCAtIDEpPzsKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5za2lwX3RpbGxfZGVwdGgodmFsX3R5cGUsIGRlcHRoIC0gMSk/OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZWxmLnJlYWRfbWFwX2VuZCgpCisgICAgICAgICAgICB9CisgICAgICAgICAgICB1ID0+IEVycig6OkVycm9yOjpQcm90b2NvbChQcm90b2NvbEVycm9yIHsKKyAgICAgICAgICAgICAgICBraW5kOiBQcm90b2NvbEVycm9yS2luZDo6VW5rbm93biwKKyAgICAgICAgICAgICAgICBtZXNzYWdlOiBmb3JtYXQhKCJjYW5ub3Qgc2tpcCBmaWVsZCB0eXBlIHs6P30iLCAmdSksCisgICAgICAgICAgICB9KSksCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyB1dGlsaXR5IChETyBOT1QgVVNFIElOIEdFTkVSQVRFRCBDT0RFISEhISkKKyAgICAvLworCisgICAgLy8vIFJlYWQgYW4gdW5zaWduZWQgYnl0ZS4KKyAgICAvLy8KKyAgICAvLy8gVGhpcyBtZXRob2Qgc2hvdWxkICoqbmV2ZXIqKiBiZSB1c2VkIGluIGdlbmVyYXRlZCBjb2RlLgorICAgIGZuIHJlYWRfYnl0ZSgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PHU4PjsKK30KKworLy8vIENvbnZlcnRzIFRocmlmdCBpZGVudGlmaWVycywgcHJpbWl0aXZlcywgY29udGFpbmVycyBvciBzdHJ1Y3RzIGludG8gYQorLy8vIHN0cmVhbSBvZiBieXRlcy4KKy8vLworLy8vIFRoaXMgdHJhaXQgZG9lcyBub3QgZGVhbCB3aXRoIGhpZ2hlci1sZXZlbCBUaHJpZnQgY29uY2VwdHMgbGlrZSBzdHJ1Y3RzIG9yCisvLy8gZXhjZXB0aW9ucyAtIG9ubHkgd2l0aCBwcmltaXRpdmVzIGFuZCBtZXNzYWdlIG9yIGNvbnRhaW5lciBib3VuZGFyaWVzLgorLy8vIFdyaXRlIG1ldGhvZHMgdGFrZSBhbiBpZGVudGlmaWVyIChmb3IgZXhhbXBsZSwgYFRNZXNzYWdlSWRlbnRpZmllcmApIG9yIGEKKy8vLyBwcmltaXRpdmUuIEFueSBvciBhbGwgb2YgdGhlIGZpZWxkcyBpbiBhbiBpZGVudGlmaWVyIG1heSBiZSBvbWl0dGVkIHdoZW4KKy8vLyB3cml0aW5nIHRvIHRoZSB0cmFuc3BvcnQuIFdyaXRlIG1ldGhvZHMgbWF5IGV2ZW4gYmUgbm9vcHMuIEFsbCBvZiB0aGlzIGlzCisvLy8gdHJhbnNwYXJlbnQgdG8gdGhlIGNhbGxlcjsgYXMgbG9uZyBhcyBhIG1hdGNoaW5nIGBUSW5wdXRQcm90b2NvbGAKKy8vLyBpbXBsZW1lbnRhdGlvbiBpcyB1c2VkLCByZWNlaXZlZCBtZXNzYWdlcyB3aWxsIGJlIGRlY29kZWQgY29ycmVjdGx5LgorLy8vCisvLy8gQWxsIG1ldGhvZHMgcmV0dXJuIGEgYHRocmlmdDo6UmVzdWx0YC4gSWYgYW4gYEVycmAgaXMgcmV0dXJuZWQgdGhlIHByb3RvY29sCisvLy8gaW5zdGFuY2UgYW5kIGl0cyB1bmRlcmx5aW5nIHRyYW5zcG9ydCBzaG91bGQgYmUgdGVybWluYXRlZC4KKy8vLworLy8vICMgRXhhbXBsZXMKKy8vLworLy8vIENyZWF0ZSBhbmQgdXNlIGEgYFRPdXRwdXRQcm90b2NvbGAKKy8vLworLy8vIGBgYG5vX3J1bgorLy8vIHVzZSB0aHJpZnQ6OnByb3RvY29sOjp7VEJpbmFyeU91dHB1dFByb3RvY29sLCBURmllbGRJZGVudGlmaWVyLCBUT3V0cHV0UHJvdG9jb2wsIFRUeXBlfTsKKy8vLyB1c2UgdGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUY3BDaGFubmVsOworLy8vCisvLy8gbGV0IG11dCBjaGFubmVsID0gVFRjcENoYW5uZWw6Om5ldygpOworLy8vIGNoYW5uZWwub3BlbigiMTI3LjAuMC4xOjkwOTAiKS51bndyYXAoKTsKKy8vLworLy8vIGxldCBtdXQgcHJvdG9jb2wgPSBUQmluYXJ5T3V0cHV0UHJvdG9jb2w6Om5ldyhjaGFubmVsLCB0cnVlKTsKKy8vLworLy8vIHByb3RvY29sLndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoInN0cmluZ190aGluZyIsIFRUeXBlOjpTdHJpbmcsIDEpKS51bndyYXAoKTsKKy8vLyBwcm90b2NvbC53cml0ZV9zdHJpbmcoImZvbyIpLnVud3JhcCgpOworLy8vIHByb3RvY29sLndyaXRlX2ZpZWxkX2VuZCgpLnVud3JhcCgpOworLy8vIGBgYAorcHViIHRyYWl0IFRPdXRwdXRQcm90b2NvbCB7CisgICAgLy8vIFdyaXRlIHRoZSBiZWdpbm5pbmcgb2YgYSBUaHJpZnQgbWVzc2FnZS4KKyAgICBmbiB3cml0ZV9tZXNzYWdlX2JlZ2luKCZtdXQgc2VsZiwgaWRlbnRpZmllcjogJlRNZXNzYWdlSWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8KCk+OworICAgIC8vLyBXcml0ZSB0aGUgZW5kIG9mIGEgVGhyaWZ0IG1lc3NhZ2UuCisgICAgZm4gd3JpdGVfbWVzc2FnZV9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT47CisgICAgLy8vIFdyaXRlIHRoZSBiZWdpbm5pbmcgb2YgYSBUaHJpZnQgc3RydWN0LgorICAgIGZuIHdyaXRlX3N0cnVjdF9iZWdpbigmbXV0IHNlbGYsIGlkZW50aWZpZXI6ICZUU3RydWN0SWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8KCk+OworICAgIC8vLyBXcml0ZSB0aGUgZW5kIG9mIGEgVGhyaWZ0IHN0cnVjdC4KKyAgICBmbiB3cml0ZV9zdHJ1Y3RfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+OworICAgIC8vLyBXcml0ZSB0aGUgYmVnaW5uaW5nIG9mIGEgVGhyaWZ0IGZpZWxkLgorICAgIGZuIHdyaXRlX2ZpZWxkX2JlZ2luKCZtdXQgc2VsZiwgaWRlbnRpZmllcjogJlRGaWVsZElkZW50aWZpZXIpIC0+IDo6UmVzdWx0PCgpPjsKKyAgICAvLy8gV3JpdGUgdGhlIGVuZCBvZiBhIFRocmlmdCBmaWVsZC4KKyAgICBmbiB3cml0ZV9maWVsZF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT47CisgICAgLy8vIFdyaXRlIGEgU1RPUCBmaWVsZCBpbmRpY2F0aW5nIHRoYXQgYWxsIHRoZSBmaWVsZHMgaW4gYSBzdHJ1Y3QgaGF2ZSBiZWVuCisgICAgLy8vIHdyaXR0ZW4uCisgICAgZm4gd3JpdGVfZmllbGRfc3RvcCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPjsKKyAgICAvLy8gV3JpdGUgYSBib29sLgorICAgIGZuIHdyaXRlX2Jvb2woJm11dCBzZWxmLCBiOiBib29sKSAtPiA6OlJlc3VsdDwoKT47CisgICAgLy8vIFdyaXRlIGEgZml4ZWQtbGVuZ3RoIGJ5dGUgYXJyYXkuCisgICAgZm4gd3JpdGVfYnl0ZXMoJm11dCBzZWxmLCBiOiAmW3U4XSkgLT4gOjpSZXN1bHQ8KCk+OworICAgIC8vLyBXcml0ZSBhbiA4LWJpdCBzaWduZWQgaW50ZWdlci4KKyAgICBmbiB3cml0ZV9pOCgmbXV0IHNlbGYsIGk6IGk4KSAtPiA6OlJlc3VsdDwoKT47CisgICAgLy8vIFdyaXRlIGEgMTYtYml0IHNpZ25lZCBpbnRlZ2VyLgorICAgIGZuIHdyaXRlX2kxNigmbXV0IHNlbGYsIGk6IGkxNikgLT4gOjpSZXN1bHQ8KCk+OworICAgIC8vLyBXcml0ZSBhIDMyLWJpdCBzaWduZWQgaW50ZWdlci4KKyAgICBmbiB3cml0ZV9pMzIoJm11dCBzZWxmLCBpOiBpMzIpIC0+IDo6UmVzdWx0PCgpPjsKKyAgICAvLy8gV3JpdGUgYSA2NC1iaXQgc2lnbmVkIGludGVnZXIuCisgICAgZm4gd3JpdGVfaTY0KCZtdXQgc2VsZiwgaTogaTY0KSAtPiA6OlJlc3VsdDwoKT47CisgICAgLy8vIFdyaXRlIGEgNjQtYml0IGZsb2F0LgorICAgIGZuIHdyaXRlX2RvdWJsZSgmbXV0IHNlbGYsIGQ6IGY2NCkgLT4gOjpSZXN1bHQ8KCk+OworICAgIC8vLyBXcml0ZSBhIGZpeGVkLWxlbmd0aCBzdHJpbmcuCisgICAgZm4gd3JpdGVfc3RyaW5nKCZtdXQgc2VsZiwgczogJnN0cikgLT4gOjpSZXN1bHQ8KCk+OworICAgIC8vLyBXcml0ZSB0aGUgYmVnaW5uaW5nIG9mIGEgbGlzdC4KKyAgICBmbiB3cml0ZV9saXN0X2JlZ2luKCZtdXQgc2VsZiwgaWRlbnRpZmllcjogJlRMaXN0SWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8KCk+OworICAgIC8vLyBXcml0ZSB0aGUgZW5kIG9mIGEgbGlzdC4KKyAgICBmbiB3cml0ZV9saXN0X2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPjsKKyAgICAvLy8gV3JpdGUgdGhlIGJlZ2lubmluZyBvZiBhIHNldC4KKyAgICBmbiB3cml0ZV9zZXRfYmVnaW4oJm11dCBzZWxmLCBpZGVudGlmaWVyOiAmVFNldElkZW50aWZpZXIpIC0+IDo6UmVzdWx0PCgpPjsKKyAgICAvLy8gV3JpdGUgdGhlIGVuZCBvZiBhIHNldC4KKyAgICBmbiB3cml0ZV9zZXRfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+OworICAgIC8vLyBXcml0ZSB0aGUgYmVnaW5uaW5nIG9mIGEgbWFwLgorICAgIGZuIHdyaXRlX21hcF9iZWdpbigmbXV0IHNlbGYsIGlkZW50aWZpZXI6ICZUTWFwSWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8KCk+OworICAgIC8vLyBXcml0ZSB0aGUgZW5kIG9mIGEgbWFwLgorICAgIGZuIHdyaXRlX21hcF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT47CisgICAgLy8vIEZsdXNoIGJ1ZmZlcmVkIGJ5dGVzIHRvIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydC4KKyAgICBmbiBmbHVzaCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPjsKKworICAgIC8vIHV0aWxpdHkgKERPIE5PVCBVU0UgSU4gR0VORVJBVEVEIENPREUhISEhKQorICAgIC8vCisKKyAgICAvLy8gV3JpdGUgYW4gdW5zaWduZWQgYnl0ZS4KKyAgICAvLy8KKyAgICAvLy8gVGhpcyBtZXRob2Qgc2hvdWxkICoqbmV2ZXIqKiBiZSB1c2VkIGluIGdlbmVyYXRlZCBjb2RlLgorICAgIGZuIHdyaXRlX2J5dGUoJm11dCBzZWxmLCBiOiB1OCkgLT4gOjpSZXN1bHQ8KCk+OyAvLyBGSVhNRTogUkVNT1ZFCit9CisKK2ltcGw8UD4gVElucHV0UHJvdG9jb2wgZm9yIEJveDxQPgord2hlcmUKKyAgICBQOiBUSW5wdXRQcm90b2NvbCArID9TaXplZCwKK3sKKyAgICBmbiByZWFkX21lc3NhZ2VfYmVnaW4oJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxUTWVzc2FnZUlkZW50aWZpZXI+IHsKKyAgICAgICAgKCoqc2VsZikucmVhZF9tZXNzYWdlX2JlZ2luKCkKKyAgICB9CisKKyAgICBmbiByZWFkX21lc3NhZ2VfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgKCoqc2VsZikucmVhZF9tZXNzYWdlX2VuZCgpCisgICAgfQorCisgICAgZm4gcmVhZF9zdHJ1Y3RfYmVnaW4oJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxPcHRpb248VFN0cnVjdElkZW50aWZpZXI+PiB7CisgICAgICAgICgqKnNlbGYpLnJlYWRfc3RydWN0X2JlZ2luKCkKKyAgICB9CisKKyAgICBmbiByZWFkX3N0cnVjdF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICAoKipzZWxmKS5yZWFkX3N0cnVjdF9lbmQoKQorICAgIH0KKworICAgIGZuIHJlYWRfZmllbGRfYmVnaW4oJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxURmllbGRJZGVudGlmaWVyPiB7CisgICAgICAgICgqKnNlbGYpLnJlYWRfZmllbGRfYmVnaW4oKQorICAgIH0KKworICAgIGZuIHJlYWRfZmllbGRfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgKCoqc2VsZikucmVhZF9maWVsZF9lbmQoKQorICAgIH0KKworICAgIGZuIHJlYWRfYm9vbCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PGJvb2w+IHsKKyAgICAgICAgKCoqc2VsZikucmVhZF9ib29sKCkKKyAgICB9CisKKyAgICBmbiByZWFkX2J5dGVzKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8VmVjPHU4Pj4geworICAgICAgICAoKipzZWxmKS5yZWFkX2J5dGVzKCkKKyAgICB9CisKKyAgICBmbiByZWFkX2k4KCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8aTg+IHsKKyAgICAgICAgKCoqc2VsZikucmVhZF9pOCgpCisgICAgfQorCisgICAgZm4gcmVhZF9pMTYoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxpMTY+IHsKKyAgICAgICAgKCoqc2VsZikucmVhZF9pMTYoKQorICAgIH0KKworICAgIGZuIHJlYWRfaTMyKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8aTMyPiB7CisgICAgICAgICgqKnNlbGYpLnJlYWRfaTMyKCkKKyAgICB9CisKKyAgICBmbiByZWFkX2k2NCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PGk2ND4geworICAgICAgICAoKipzZWxmKS5yZWFkX2k2NCgpCisgICAgfQorCisgICAgZm4gcmVhZF9kb3VibGUoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxmNjQ+IHsKKyAgICAgICAgKCoqc2VsZikucmVhZF9kb3VibGUoKQorICAgIH0KKworICAgIGZuIHJlYWRfc3RyaW5nKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8U3RyaW5nPiB7CisgICAgICAgICgqKnNlbGYpLnJlYWRfc3RyaW5nKCkKKyAgICB9CisKKyAgICBmbiByZWFkX2xpc3RfYmVnaW4oJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxUTGlzdElkZW50aWZpZXI+IHsKKyAgICAgICAgKCoqc2VsZikucmVhZF9saXN0X2JlZ2luKCkKKyAgICB9CisKKyAgICBmbiByZWFkX2xpc3RfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgKCoqc2VsZikucmVhZF9saXN0X2VuZCgpCisgICAgfQorCisgICAgZm4gcmVhZF9zZXRfYmVnaW4oJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxUU2V0SWRlbnRpZmllcj4geworICAgICAgICAoKipzZWxmKS5yZWFkX3NldF9iZWdpbigpCisgICAgfQorCisgICAgZm4gcmVhZF9zZXRfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgKCoqc2VsZikucmVhZF9zZXRfZW5kKCkKKyAgICB9CisKKyAgICBmbiByZWFkX21hcF9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFRNYXBJZGVudGlmaWVyPiB7CisgICAgICAgICgqKnNlbGYpLnJlYWRfbWFwX2JlZ2luKCkKKyAgICB9CisKKyAgICBmbiByZWFkX21hcF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICAoKipzZWxmKS5yZWFkX21hcF9lbmQoKQorICAgIH0KKworICAgIGZuIHJlYWRfYnl0ZSgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PHU4PiB7CisgICAgICAgICgqKnNlbGYpLnJlYWRfYnl0ZSgpCisgICAgfQorfQorCitpbXBsPFA+IFRPdXRwdXRQcm90b2NvbCBmb3IgQm94PFA+Cit3aGVyZQorICAgIFA6IFRPdXRwdXRQcm90b2NvbCArID9TaXplZCwKK3sKKyAgICBmbiB3cml0ZV9tZXNzYWdlX2JlZ2luKCZtdXQgc2VsZiwgaWRlbnRpZmllcjogJlRNZXNzYWdlSWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgKCoqc2VsZikud3JpdGVfbWVzc2FnZV9iZWdpbihpZGVudGlmaWVyKQorICAgIH0KKworICAgIGZuIHdyaXRlX21lc3NhZ2VfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgKCoqc2VsZikud3JpdGVfbWVzc2FnZV9lbmQoKQorICAgIH0KKworICAgIGZuIHdyaXRlX3N0cnVjdF9iZWdpbigmbXV0IHNlbGYsIGlkZW50aWZpZXI6ICZUU3RydWN0SWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgKCoqc2VsZikud3JpdGVfc3RydWN0X2JlZ2luKGlkZW50aWZpZXIpCisgICAgfQorCisgICAgZm4gd3JpdGVfc3RydWN0X2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgICgqKnNlbGYpLndyaXRlX3N0cnVjdF9lbmQoKQorICAgIH0KKworICAgIGZuIHdyaXRlX2ZpZWxkX2JlZ2luKCZtdXQgc2VsZiwgaWRlbnRpZmllcjogJlRGaWVsZElkZW50aWZpZXIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgICgqKnNlbGYpLndyaXRlX2ZpZWxkX2JlZ2luKGlkZW50aWZpZXIpCisgICAgfQorCisgICAgZm4gd3JpdGVfZmllbGRfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgKCoqc2VsZikud3JpdGVfZmllbGRfZW5kKCkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9maWVsZF9zdG9wKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgKCoqc2VsZikud3JpdGVfZmllbGRfc3RvcCgpCisgICAgfQorCisgICAgZm4gd3JpdGVfYm9vbCgmbXV0IHNlbGYsIGI6IGJvb2wpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgICgqKnNlbGYpLndyaXRlX2Jvb2woYikKKyAgICB9CisKKyAgICBmbiB3cml0ZV9ieXRlcygmbXV0IHNlbGYsIGI6ICZbdThdKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICAoKipzZWxmKS53cml0ZV9ieXRlcyhiKQorICAgIH0KKworICAgIGZuIHdyaXRlX2k4KCZtdXQgc2VsZiwgaTogaTgpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgICgqKnNlbGYpLndyaXRlX2k4KGkpCisgICAgfQorCisgICAgZm4gd3JpdGVfaTE2KCZtdXQgc2VsZiwgaTogaTE2KSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICAoKipzZWxmKS53cml0ZV9pMTYoaSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9pMzIoJm11dCBzZWxmLCBpOiBpMzIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgICgqKnNlbGYpLndyaXRlX2kzMihpKQorICAgIH0KKworICAgIGZuIHdyaXRlX2k2NCgmbXV0IHNlbGYsIGk6IGk2NCkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgKCoqc2VsZikud3JpdGVfaTY0KGkpCisgICAgfQorCisgICAgZm4gd3JpdGVfZG91YmxlKCZtdXQgc2VsZiwgZDogZjY0KSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICAoKipzZWxmKS53cml0ZV9kb3VibGUoZCkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9zdHJpbmcoJm11dCBzZWxmLCBzOiAmc3RyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICAoKipzZWxmKS53cml0ZV9zdHJpbmcocykKKyAgICB9CisKKyAgICBmbiB3cml0ZV9saXN0X2JlZ2luKCZtdXQgc2VsZiwgaWRlbnRpZmllcjogJlRMaXN0SWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgKCoqc2VsZikud3JpdGVfbGlzdF9iZWdpbihpZGVudGlmaWVyKQorICAgIH0KKworICAgIGZuIHdyaXRlX2xpc3RfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgKCoqc2VsZikud3JpdGVfbGlzdF9lbmQoKQorICAgIH0KKworICAgIGZuIHdyaXRlX3NldF9iZWdpbigmbXV0IHNlbGYsIGlkZW50aWZpZXI6ICZUU2V0SWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgKCoqc2VsZikud3JpdGVfc2V0X2JlZ2luKGlkZW50aWZpZXIpCisgICAgfQorCisgICAgZm4gd3JpdGVfc2V0X2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgICgqKnNlbGYpLndyaXRlX3NldF9lbmQoKQorICAgIH0KKworICAgIGZuIHdyaXRlX21hcF9iZWdpbigmbXV0IHNlbGYsIGlkZW50aWZpZXI6ICZUTWFwSWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgKCoqc2VsZikud3JpdGVfbWFwX2JlZ2luKGlkZW50aWZpZXIpCisgICAgfQorCisgICAgZm4gd3JpdGVfbWFwX2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgICgqKnNlbGYpLndyaXRlX21hcF9lbmQoKQorICAgIH0KKworICAgIGZuIGZsdXNoKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgKCoqc2VsZikuZmx1c2goKQorICAgIH0KKworICAgIGZuIHdyaXRlX2J5dGUoJm11dCBzZWxmLCBiOiB1OCkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgKCoqc2VsZikud3JpdGVfYnl0ZShiKQorICAgIH0KK30KKworLy8vIEhlbHBlciB0eXBlIHVzZWQgYnkgc2VydmVycyB0byBjcmVhdGUgYFRJbnB1dFByb3RvY29sYCBpbnN0YW5jZXMgZm9yCisvLy8gYWNjZXB0ZWQgY2xpZW50IGNvbm5lY3Rpb25zLgorLy8vCisvLy8gIyBFeGFtcGxlcworLy8vCisvLy8gQ3JlYXRlIGEgYFRJbnB1dFByb3RvY29sRmFjdG9yeWAgYW5kIHVzZSBpdCB0byBjcmVhdGUgYSBgVElucHV0UHJvdG9jb2xgLgorLy8vCisvLy8gYGBgbm9fcnVuCisvLy8gdXNlIHRocmlmdDo6cHJvdG9jb2w6OntUQmluYXJ5SW5wdXRQcm90b2NvbEZhY3RvcnksIFRJbnB1dFByb3RvY29sRmFjdG9yeX07CisvLy8gdXNlIHRocmlmdDo6dHJhbnNwb3J0OjpUVGNwQ2hhbm5lbDsKKy8vLworLy8vIGxldCBtdXQgY2hhbm5lbCA9IFRUY3BDaGFubmVsOjpuZXcoKTsKKy8vLyBjaGFubmVsLm9wZW4oIjEyNy4wLjAuMTo5MDkwIikudW53cmFwKCk7CisvLy8KKy8vLyBsZXQgZmFjdG9yeSA9IFRCaW5hcnlJbnB1dFByb3RvY29sRmFjdG9yeTo6bmV3KCk7CisvLy8gbGV0IHByb3RvY29sID0gZmFjdG9yeS5jcmVhdGUoQm94OjpuZXcoY2hhbm5lbCkpOworLy8vIGBgYAorcHViIHRyYWl0IFRJbnB1dFByb3RvY29sRmFjdG9yeSB7CisgICAgLy8gQ3JlYXRlIGEgYFRJbnB1dFByb3RvY29sYCB0aGF0IHJlYWRzIGJ5dGVzIGZyb20gYHRyYW5zcG9ydGAuCisgICAgZm4gY3JlYXRlKCZzZWxmLCB0cmFuc3BvcnQ6IEJveDxUUmVhZFRyYW5zcG9ydCArIFNlbmQ+KSAtPiBCb3g8VElucHV0UHJvdG9jb2wgKyBTZW5kPjsKK30KKworaW1wbDxUPiBUSW5wdXRQcm90b2NvbEZhY3RvcnkgZm9yIEJveDxUPgord2hlcmUKKyAgICBUOiBUSW5wdXRQcm90b2NvbEZhY3RvcnkgKyA/U2l6ZWQsCit7CisgICAgZm4gY3JlYXRlKCZzZWxmLCB0cmFuc3BvcnQ6IEJveDxUUmVhZFRyYW5zcG9ydCArIFNlbmQ+KSAtPiBCb3g8VElucHV0UHJvdG9jb2wgKyBTZW5kPiB7CisgICAgICAgICgqKnNlbGYpLmNyZWF0ZSh0cmFuc3BvcnQpCisgICAgfQorfQorCisvLy8gSGVscGVyIHR5cGUgdXNlZCBieSBzZXJ2ZXJzIHRvIGNyZWF0ZSBgVE91dHB1dFByb3RvY29sYCBpbnN0YW5jZXMgZm9yCisvLy8gYWNjZXB0ZWQgY2xpZW50IGNvbm5lY3Rpb25zLgorLy8vCisvLy8gIyBFeGFtcGxlcworLy8vCisvLy8gQ3JlYXRlIGEgYFRPdXRwdXRQcm90b2NvbEZhY3RvcnlgIGFuZCB1c2UgaXQgdG8gY3JlYXRlIGEgYFRPdXRwdXRQcm90b2NvbGAuCisvLy8KKy8vLyBgYGBub19ydW4KKy8vLyB1c2UgdGhyaWZ0Ojpwcm90b2NvbDo6e1RCaW5hcnlPdXRwdXRQcm90b2NvbEZhY3RvcnksIFRPdXRwdXRQcm90b2NvbEZhY3Rvcnl9OworLy8vIHVzZSB0aHJpZnQ6OnRyYW5zcG9ydDo6VFRjcENoYW5uZWw7CisvLy8KKy8vLyBsZXQgbXV0IGNoYW5uZWwgPSBUVGNwQ2hhbm5lbDo6bmV3KCk7CisvLy8gY2hhbm5lbC5vcGVuKCIxMjcuMC4wLjE6OTA5MCIpLnVud3JhcCgpOworLy8vCisvLy8gbGV0IGZhY3RvcnkgPSBUQmluYXJ5T3V0cHV0UHJvdG9jb2xGYWN0b3J5OjpuZXcoKTsKKy8vLyBsZXQgcHJvdG9jb2wgPSBmYWN0b3J5LmNyZWF0ZShCb3g6Om5ldyhjaGFubmVsKSk7CisvLy8gYGBgCitwdWIgdHJhaXQgVE91dHB1dFByb3RvY29sRmFjdG9yeSB7CisgICAgLy8vIENyZWF0ZSBhIGBUT3V0cHV0UHJvdG9jb2xgIHRoYXQgd3JpdGVzIGJ5dGVzIHRvIGB0cmFuc3BvcnRgLgorICAgIGZuIGNyZWF0ZSgmc2VsZiwgdHJhbnNwb3J0OiBCb3g8VFdyaXRlVHJhbnNwb3J0ICsgU2VuZD4pIC0+IEJveDxUT3V0cHV0UHJvdG9jb2wgKyBTZW5kPjsKK30KKworaW1wbDxUPiBUT3V0cHV0UHJvdG9jb2xGYWN0b3J5IGZvciBCb3g8VD4KK3doZXJlCisgICAgVDogVE91dHB1dFByb3RvY29sRmFjdG9yeSArID9TaXplZCwKK3sKKyAgICBmbiBjcmVhdGUoJnNlbGYsIHRyYW5zcG9ydDogQm94PFRXcml0ZVRyYW5zcG9ydCArIFNlbmQ+KSAtPiBCb3g8VE91dHB1dFByb3RvY29sICsgU2VuZD4geworICAgICAgICAoKipzZWxmKS5jcmVhdGUodHJhbnNwb3J0KQorICAgIH0KK30KKworLy8vIFRocmlmdCBtZXNzYWdlIGlkZW50aWZpZXIuCisjW2Rlcml2ZShDbG9uZSwgRGVidWcsIEVxLCBQYXJ0aWFsRXEpXQorcHViIHN0cnVjdCBUTWVzc2FnZUlkZW50aWZpZXIgeworICAgIC8vLyBTZXJ2aWNlIGNhbGwgdGhlIG1lc3NhZ2UgaXMgYXNzb2NpYXRlZCB3aXRoLgorICAgIHB1YiBuYW1lOiBTdHJpbmcsCisgICAgLy8vIE1lc3NhZ2UgdHlwZS4KKyAgICBwdWIgbWVzc2FnZV90eXBlOiBUTWVzc2FnZVR5cGUsCisgICAgLy8vIE9yZGVyZWQgc2VxdWVuY2UgbnVtYmVyIGlkZW50aWZ5aW5nIHRoZSBtZXNzYWdlLgorICAgIHB1YiBzZXF1ZW5jZV9udW1iZXI6IGkzMiwKK30KKworaW1wbCBUTWVzc2FnZUlkZW50aWZpZXIgeworICAgIC8vLyBDcmVhdGUgYSBgVE1lc3NhZ2VJZGVudGlmaWVyYCBmb3IgYSBUaHJpZnQgc2VydmljZS1jYWxsIG5hbWVkIGBuYW1lYAorICAgIC8vLyB3aXRoIG1lc3NhZ2UgdHlwZSBgbWVzc2FnZV90eXBlYCBhbmQgc2VxdWVuY2UgbnVtYmVyIGBzZXF1ZW5jZV9udW1iZXJgLgorICAgIHB1YiBmbiBuZXc8UzogSW50bzxTdHJpbmc+PigKKyAgICAgICAgbmFtZTogUywKKyAgICAgICAgbWVzc2FnZV90eXBlOiBUTWVzc2FnZVR5cGUsCisgICAgICAgIHNlcXVlbmNlX251bWJlcjogaTMyLAorICAgICkgLT4gVE1lc3NhZ2VJZGVudGlmaWVyIHsKKyAgICAgICAgVE1lc3NhZ2VJZGVudGlmaWVyIHsKKyAgICAgICAgICAgIG5hbWU6IG5hbWUuaW50bygpLAorICAgICAgICAgICAgbWVzc2FnZV90eXBlOiBtZXNzYWdlX3R5cGUsCisgICAgICAgICAgICBzZXF1ZW5jZV9udW1iZXI6IHNlcXVlbmNlX251bWJlciwKKyAgICAgICAgfQorICAgIH0KK30KKworLy8vIFRocmlmdCBzdHJ1Y3QgaWRlbnRpZmllci4KKyNbZGVyaXZlKENsb25lLCBEZWJ1ZywgRXEsIFBhcnRpYWxFcSldCitwdWIgc3RydWN0IFRTdHJ1Y3RJZGVudGlmaWVyIHsKKyAgICAvLy8gTmFtZSBvZiB0aGUgZW5jb2RlZCBUaHJpZnQgc3RydWN0LgorICAgIHB1YiBuYW1lOiBTdHJpbmcsCit9CisKK2ltcGwgVFN0cnVjdElkZW50aWZpZXIgeworICAgIC8vLyBDcmVhdGUgYSBgVFN0cnVjdElkZW50aWZpZXJgIGZvciBhIHN0cnVjdCBuYW1lZCBgbmFtZWAuCisgICAgcHViIGZuIG5ldzxTOiBJbnRvPFN0cmluZz4+KG5hbWU6IFMpIC0+IFRTdHJ1Y3RJZGVudGlmaWVyIHsKKyAgICAgICAgVFN0cnVjdElkZW50aWZpZXIgeyBuYW1lOiBuYW1lLmludG8oKSB9CisgICAgfQorfQorCisvLy8gVGhyaWZ0IGZpZWxkIGlkZW50aWZpZXIuCisjW2Rlcml2ZShDbG9uZSwgRGVidWcsIEVxLCBQYXJ0aWFsRXEpXQorcHViIHN0cnVjdCBURmllbGRJZGVudGlmaWVyIHsKKyAgICAvLy8gTmFtZSBvZiB0aGUgVGhyaWZ0IGZpZWxkLgorICAgIC8vLworICAgIC8vLyBgTm9uZWAgaWYgaXQncyBub3Qgc2VudCBvdmVyIHRoZSB3aXJlLgorICAgIHB1YiBuYW1lOiBPcHRpb248U3RyaW5nPiwKKyAgICAvLy8gRmllbGQgdHlwZS4KKyAgICAvLy8KKyAgICAvLy8gVGhpcyBtYXkgYmUgYSBwcmltaXRpdmUsIGNvbnRhaW5lciwgb3IgYSBzdHJ1Y3QuCisgICAgcHViIGZpZWxkX3R5cGU6IFRUeXBlLAorICAgIC8vLyBUaHJpZnQgZmllbGQgaWQuCisgICAgLy8vCisgICAgLy8vIGBOb25lYCBvbmx5IGlmIGBmaWVsZF90eXBlYCBpcyBgVFR5cGU6OlN0b3BgLgorICAgIHB1YiBpZDogT3B0aW9uPGkxNj4sCit9CisKK2ltcGwgVEZpZWxkSWRlbnRpZmllciB7CisgICAgLy8vIENyZWF0ZSBhIGBURmllbGRJZGVudGlmaWVyYCBmb3IgYSBmaWVsZCBuYW1lZCBgbmFtZWAgd2l0aCB0eXBlCisgICAgLy8vIGBmaWVsZF90eXBlYCBhbmQgZmllbGQgaWQgYGlkYC4KKyAgICAvLy8KKyAgICAvLy8gYGlkYCBzaG91bGQgYmUgYE5vbmVgIGlmIGBmaWVsZF90eXBlYCBpcyBgVFR5cGU6OlN0b3BgLgorICAgIHB1YiBmbiBuZXc8TiwgUywgST4obmFtZTogTiwgZmllbGRfdHlwZTogVFR5cGUsIGlkOiBJKSAtPiBURmllbGRJZGVudGlmaWVyCisgICAgd2hlcmUKKyAgICAgICAgTjogSW50bzxPcHRpb248Uz4+LAorICAgICAgICBTOiBJbnRvPFN0cmluZz4sCisgICAgICAgIEk6IEludG88T3B0aW9uPGkxNj4+LAorICAgIHsKKyAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICBuYW1lOiBuYW1lLmludG8oKS5tYXAofG58IG4uaW50bygpKSwKKyAgICAgICAgICAgIGZpZWxkX3R5cGU6IGZpZWxkX3R5cGUsCisgICAgICAgICAgICBpZDogaWQuaW50bygpLAorICAgICAgICB9CisgICAgfQorfQorCisvLy8gVGhyaWZ0IGxpc3QgaWRlbnRpZmllci4KKyNbZGVyaXZlKENsb25lLCBEZWJ1ZywgRXEsIFBhcnRpYWxFcSldCitwdWIgc3RydWN0IFRMaXN0SWRlbnRpZmllciB7CisgICAgLy8vIFR5cGUgb2YgdGhlIGVsZW1lbnRzIGluIHRoZSBsaXN0LgorICAgIHB1YiBlbGVtZW50X3R5cGU6IFRUeXBlLAorICAgIC8vLyBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QuCisgICAgcHViIHNpemU6IGkzMiwKK30KKworaW1wbCBUTGlzdElkZW50aWZpZXIgeworICAgIC8vLyBDcmVhdGUgYSBgVExpc3RJZGVudGlmaWVyYCBmb3IgYSBsaXN0IHdpdGggYHNpemVgIGVsZW1lbnRzIG9mIHR5cGUKKyAgICAvLy8gYGVsZW1lbnRfdHlwZWAuCisgICAgcHViIGZuIG5ldyhlbGVtZW50X3R5cGU6IFRUeXBlLCBzaXplOiBpMzIpIC0+IFRMaXN0SWRlbnRpZmllciB7CisgICAgICAgIFRMaXN0SWRlbnRpZmllciB7CisgICAgICAgICAgICBlbGVtZW50X3R5cGU6IGVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgIHNpemU6IHNpemUsCisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vLyBUaHJpZnQgc2V0IGlkZW50aWZpZXIuCisjW2Rlcml2ZShDbG9uZSwgRGVidWcsIEVxLCBQYXJ0aWFsRXEpXQorcHViIHN0cnVjdCBUU2V0SWRlbnRpZmllciB7CisgICAgLy8vIFR5cGUgb2YgdGhlIGVsZW1lbnRzIGluIHRoZSBzZXQuCisgICAgcHViIGVsZW1lbnRfdHlwZTogVFR5cGUsCisgICAgLy8vIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgc2V0LgorICAgIHB1YiBzaXplOiBpMzIsCit9CisKK2ltcGwgVFNldElkZW50aWZpZXIgeworICAgIC8vLyBDcmVhdGUgYSBgVFNldElkZW50aWZpZXJgIGZvciBhIHNldCB3aXRoIGBzaXplYCBlbGVtZW50cyBvZiB0eXBlCisgICAgLy8vIGBlbGVtZW50X3R5cGVgLgorICAgIHB1YiBmbiBuZXcoZWxlbWVudF90eXBlOiBUVHlwZSwgc2l6ZTogaTMyKSAtPiBUU2V0SWRlbnRpZmllciB7CisgICAgICAgIFRTZXRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgIGVsZW1lbnRfdHlwZTogZWxlbWVudF90eXBlLAorICAgICAgICAgICAgc2l6ZTogc2l6ZSwKKyAgICAgICAgfQorICAgIH0KK30KKworLy8vIFRocmlmdCBtYXAgaWRlbnRpZmllci4KKyNbZGVyaXZlKENsb25lLCBEZWJ1ZywgRXEsIFBhcnRpYWxFcSldCitwdWIgc3RydWN0IFRNYXBJZGVudGlmaWVyIHsKKyAgICAvLy8gTWFwIGtleSB0eXBlLgorICAgIHB1YiBrZXlfdHlwZTogT3B0aW9uPFRUeXBlPiwKKyAgICAvLy8gTWFwIHZhbHVlIHR5cGUuCisgICAgcHViIHZhbHVlX3R5cGU6IE9wdGlvbjxUVHlwZT4sCisgICAgLy8vIE51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBtYXAuCisgICAgcHViIHNpemU6IGkzMiwKK30KKworaW1wbCBUTWFwSWRlbnRpZmllciB7CisgICAgLy8vIENyZWF0ZSBhIGBUTWFwSWRlbnRpZmllcmAgZm9yIGEgbWFwIHdpdGggYHNpemVgIGVudHJpZXMgb2YgdHlwZQorICAgIC8vLyBga2V5X3R5cGUgLT4gdmFsdWVfdHlwZWAuCisgICAgcHViIGZuIG5ldzxLLCBWPihrZXlfdHlwZTogSywgdmFsdWVfdHlwZTogViwgc2l6ZTogaTMyKSAtPiBUTWFwSWRlbnRpZmllcgorICAgIHdoZXJlCisgICAgICAgIEs6IEludG88T3B0aW9uPFRUeXBlPj4sCisgICAgICAgIFY6IEludG88T3B0aW9uPFRUeXBlPj4sCisgICAgeworICAgICAgICBUTWFwSWRlbnRpZmllciB7CisgICAgICAgICAgICBrZXlfdHlwZToga2V5X3R5cGUuaW50bygpLAorICAgICAgICAgICAgdmFsdWVfdHlwZTogdmFsdWVfdHlwZS5pbnRvKCksCisgICAgICAgICAgICBzaXplOiBzaXplLAorICAgICAgICB9CisgICAgfQorfQorCisvLy8gVGhyaWZ0IG1lc3NhZ2UgdHlwZXMuCisjW2Rlcml2ZShDbG9uZSwgQ29weSwgRGVidWcsIEVxLCBQYXJ0aWFsRXEpXQorcHViIGVudW0gVE1lc3NhZ2VUeXBlIHsKKyAgICAvLy8gU2VydmljZS1jYWxsIHJlcXVlc3QuCisgICAgQ2FsbCwKKyAgICAvLy8gU2VydmljZS1jYWxsIHJlc3BvbnNlLgorICAgIFJlcGx5LAorICAgIC8vLyBVbmV4cGVjdGVkIGVycm9yIGluIHRoZSByZW1vdGUgc2VydmljZS4KKyAgICBFeGNlcHRpb24sCisgICAgLy8vIE9uZS13YXkgc2VydmljZS1jYWxsIHJlcXVlc3QgKG5vIHJlc3BvbnNlIGlzIGV4cGVjdGVkKS4KKyAgICBPbmVXYXksCit9CisKK2ltcGwgRGlzcGxheSBmb3IgVE1lc3NhZ2VUeXBlIHsKKyAgICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgRm9ybWF0dGVyKSAtPiBmbXQ6OlJlc3VsdCB7CisgICAgICAgIG1hdGNoICpzZWxmIHsKKyAgICAgICAgICAgIFRNZXNzYWdlVHlwZTo6Q2FsbCA9PiB3cml0ZSEoZiwgIkNhbGwiKSwKKyAgICAgICAgICAgIFRNZXNzYWdlVHlwZTo6UmVwbHkgPT4gd3JpdGUhKGYsICJSZXBseSIpLAorICAgICAgICAgICAgVE1lc3NhZ2VUeXBlOjpFeGNlcHRpb24gPT4gd3JpdGUhKGYsICJFeGNlcHRpb24iKSwKKyAgICAgICAgICAgIFRNZXNzYWdlVHlwZTo6T25lV2F5ID0+IHdyaXRlIShmLCAiT25lV2F5IiksCisgICAgICAgIH0KKyAgICB9Cit9CisKK2ltcGwgRnJvbTxUTWVzc2FnZVR5cGU+IGZvciB1OCB7CisgICAgZm4gZnJvbShtZXNzYWdlX3R5cGU6IFRNZXNzYWdlVHlwZSkgLT4gU2VsZiB7CisgICAgICAgIG1hdGNoIG1lc3NhZ2VfdHlwZSB7CisgICAgICAgICAgICBUTWVzc2FnZVR5cGU6OkNhbGwgPT4gMHgwMSwKKyAgICAgICAgICAgIFRNZXNzYWdlVHlwZTo6UmVwbHkgPT4gMHgwMiwKKyAgICAgICAgICAgIFRNZXNzYWdlVHlwZTo6RXhjZXB0aW9uID0+IDB4MDMsCisgICAgICAgICAgICBUTWVzc2FnZVR5cGU6Ok9uZVdheSA9PiAweDA0LAorICAgICAgICB9CisgICAgfQorfQorCitpbXBsIFRyeUZyb208dTg+IGZvciBUTWVzc2FnZVR5cGUgeworICAgIHR5cGUgRXJyID0gOjpFcnJvcjsKKyAgICBmbiB0cnlfZnJvbShiOiB1OCkgLT4gOjpSZXN1bHQ8U2VsZj4geworICAgICAgICBtYXRjaCBiIHsKKyAgICAgICAgICAgIDB4MDEgPT4gT2soVE1lc3NhZ2VUeXBlOjpDYWxsKSwKKyAgICAgICAgICAgIDB4MDIgPT4gT2soVE1lc3NhZ2VUeXBlOjpSZXBseSksCisgICAgICAgICAgICAweDAzID0+IE9rKFRNZXNzYWdlVHlwZTo6RXhjZXB0aW9uKSwKKyAgICAgICAgICAgIDB4MDQgPT4gT2soVE1lc3NhZ2VUeXBlOjpPbmVXYXkpLAorICAgICAgICAgICAgdW5rbiA9PiBFcnIoOjpFcnJvcjo6UHJvdG9jb2woUHJvdG9jb2xFcnJvciB7CisgICAgICAgICAgICAgICAga2luZDogUHJvdG9jb2xFcnJvcktpbmQ6OkludmFsaWREYXRhLAorICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGZvcm1hdCEoImNhbm5vdCBjb252ZXJ0IHt9IHRvIFRNZXNzYWdlVHlwZSIsIHVua24pLAorICAgICAgICAgICAgfSkpLAorICAgICAgICB9CisgICAgfQorfQorCisvLy8gVGhyaWZ0IHN0cnVjdC1maWVsZCB0eXBlcy4KKyNbZGVyaXZlKENsb25lLCBDb3B5LCBEZWJ1ZywgRXEsIFBhcnRpYWxFcSldCitwdWIgZW51bSBUVHlwZSB7CisgICAgLy8vIEluZGljYXRlcyB0aGF0IHRoZXJlIGFyZSBubyBtb3JlIHNlcmlhbGl6ZWQgZmllbGRzIGluIHRoaXMgVGhyaWZ0IHN0cnVjdC4KKyAgICBTdG9wLAorICAgIC8vLyBWb2lkIChgKClgKSBmaWVsZC4KKyAgICBWb2lkLAorICAgIC8vLyBCb29sZWFuLgorICAgIEJvb2wsCisgICAgLy8vIFNpZ25lZCA4LWJpdCBpbnQuCisgICAgSTA4LAorICAgIC8vLyBEb3VibGUtcHJlY2lzaW9uIG51bWJlci4KKyAgICBEb3VibGUsCisgICAgLy8vIFNpZ25lZCAxNi1iaXQgaW50LgorICAgIEkxNiwKKyAgICAvLy8gU2lnbmVkIDMyLWJpdCBpbnQuCisgICAgSTMyLAorICAgIC8vLyBTaWduZWQgNjQtYml0IGludC4KKyAgICBJNjQsCisgICAgLy8vIFVURi04IHN0cmluZy4KKyAgICBTdHJpbmcsCisgICAgLy8vIFVURi03IHN0cmluZy4gKlVuc3VwcG9ydGVkKi4KKyAgICBVdGY3LAorICAgIC8vLyBUaHJpZnQgc3RydWN0LgorICAgIFN0cnVjdCwKKyAgICAvLy8gTWFwLgorICAgIE1hcCwKKyAgICAvLy8gU2V0LgorICAgIFNldCwKKyAgICAvLy8gTGlzdC4KKyAgICBMaXN0LAorICAgIC8vLyBVVEYtOCBzdHJpbmcuCisgICAgVXRmOCwKKyAgICAvLy8gVVRGLTE2IHN0cmluZy4gKlVuc3VwcG9ydGVkKi4KKyAgICBVdGYxNiwKK30KKworaW1wbCBEaXNwbGF5IGZvciBUVHlwZSB7CisgICAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IEZvcm1hdHRlcikgLT4gZm10OjpSZXN1bHQgeworICAgICAgICBtYXRjaCAqc2VsZiB7CisgICAgICAgICAgICBUVHlwZTo6U3RvcCA9PiB3cml0ZSEoZiwgIlNUT1AiKSwKKyAgICAgICAgICAgIFRUeXBlOjpWb2lkID0+IHdyaXRlIShmLCAidm9pZCIpLAorICAgICAgICAgICAgVFR5cGU6OkJvb2wgPT4gd3JpdGUhKGYsICJib29sIiksCisgICAgICAgICAgICBUVHlwZTo6STA4ID0+IHdyaXRlIShmLCAiaTA4IiksCisgICAgICAgICAgICBUVHlwZTo6RG91YmxlID0+IHdyaXRlIShmLCAiZG91YmxlIiksCisgICAgICAgICAgICBUVHlwZTo6STE2ID0+IHdyaXRlIShmLCAiaTE2IiksCisgICAgICAgICAgICBUVHlwZTo6STMyID0+IHdyaXRlIShmLCAiaTMyIiksCisgICAgICAgICAgICBUVHlwZTo6STY0ID0+IHdyaXRlIShmLCAiaTY0IiksCisgICAgICAgICAgICBUVHlwZTo6U3RyaW5nID0+IHdyaXRlIShmLCAic3RyaW5nIiksCisgICAgICAgICAgICBUVHlwZTo6VXRmNyA9PiB3cml0ZSEoZiwgIlVURjciKSwKKyAgICAgICAgICAgIFRUeXBlOjpTdHJ1Y3QgPT4gd3JpdGUhKGYsICJzdHJ1Y3QiKSwKKyAgICAgICAgICAgIFRUeXBlOjpNYXAgPT4gd3JpdGUhKGYsICJtYXAiKSwKKyAgICAgICAgICAgIFRUeXBlOjpTZXQgPT4gd3JpdGUhKGYsICJzZXQiKSwKKyAgICAgICAgICAgIFRUeXBlOjpMaXN0ID0+IHdyaXRlIShmLCAibGlzdCIpLAorICAgICAgICAgICAgVFR5cGU6OlV0ZjggPT4gd3JpdGUhKGYsICJVVEY4IiksCisgICAgICAgICAgICBUVHlwZTo6VXRmMTYgPT4gd3JpdGUhKGYsICJVVEYxNiIpLAorICAgICAgICB9CisgICAgfQorfQorCisvLy8gQ29tcGFyZSB0aGUgZXhwZWN0ZWQgbWVzc2FnZSBzZXF1ZW5jZSBudW1iZXIgYGV4cGVjdGVkYCB3aXRoIHRoZSByZWNlaXZlZAorLy8vIG1lc3NhZ2Ugc2VxdWVuY2UgbnVtYmVyIGBhY3R1YWxgLgorLy8vCisvLy8gUmV0dXJuIGAoKWAgaWYgYGFjdHVhbCA9PSBleHBlY3RlZGAsIGBFcnJgIG90aGVyd2lzZS4KK3B1YiBmbiB2ZXJpZnlfZXhwZWN0ZWRfc2VxdWVuY2VfbnVtYmVyKGV4cGVjdGVkOiBpMzIsIGFjdHVhbDogaTMyKSAtPiA6OlJlc3VsdDwoKT4geworICAgIGlmIGV4cGVjdGVkID09IGFjdHVhbCB7CisgICAgICAgIE9rKCgpKQorICAgIH0gZWxzZSB7CisgICAgICAgIEVycig6OkVycm9yOjpBcHBsaWNhdGlvbig6OkFwcGxpY2F0aW9uRXJyb3IgeworICAgICAgICAgICAga2luZDogOjpBcHBsaWNhdGlvbkVycm9yS2luZDo6QmFkU2VxdWVuY2VJZCwKKyAgICAgICAgICAgIG1lc3NhZ2U6IGZvcm1hdCEoImV4cGVjdGVkIHt9IGdvdCB7fSIsIGV4cGVjdGVkLCBhY3R1YWwpLAorICAgICAgICB9KSkKKyAgICB9Cit9CisKKy8vLyBDb21wYXJlIHRoZSBleHBlY3RlZCBzZXJ2aWNlLWNhbGwgbmFtZSBgZXhwZWN0ZWRgIHdpdGggdGhlIHJlY2VpdmVkCisvLy8gc2VydmljZS1jYWxsIG5hbWUgYGFjdHVhbGAuCisvLy8KKy8vLyBSZXR1cm4gYCgpYCBpZiBgYWN0dWFsID09IGV4cGVjdGVkYCwgYEVycmAgb3RoZXJ3aXNlLgorcHViIGZuIHZlcmlmeV9leHBlY3RlZF9zZXJ2aWNlX2NhbGwoZXhwZWN0ZWQ6ICZzdHIsIGFjdHVhbDogJnN0cikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICBpZiBleHBlY3RlZCA9PSBhY3R1YWwgeworICAgICAgICBPaygoKSkKKyAgICB9IGVsc2UgeworICAgICAgICBFcnIoOjpFcnJvcjo6QXBwbGljYXRpb24oOjpBcHBsaWNhdGlvbkVycm9yIHsKKyAgICAgICAgICAgIGtpbmQ6IDo6QXBwbGljYXRpb25FcnJvcktpbmQ6Oldyb25nTWV0aG9kTmFtZSwKKyAgICAgICAgICAgIG1lc3NhZ2U6IGZvcm1hdCEoImV4cGVjdGVkIHt9IGdvdCB7fSIsIGV4cGVjdGVkLCBhY3R1YWwpLAorICAgICAgICB9KSkKKyAgICB9Cit9CisKKy8vLyBDb21wYXJlIHRoZSBleHBlY3RlZCBtZXNzYWdlIHR5cGUgYGV4cGVjdGVkYCB3aXRoIHRoZSByZWNlaXZlZCBtZXNzYWdlIHR5cGUKKy8vLyBgYWN0dWFsYC4KKy8vLworLy8vIFJldHVybiBgKClgIGlmIGBhY3R1YWwgPT0gZXhwZWN0ZWRgLCBgRXJyYCBvdGhlcndpc2UuCitwdWIgZm4gdmVyaWZ5X2V4cGVjdGVkX21lc3NhZ2VfdHlwZShleHBlY3RlZDogVE1lc3NhZ2VUeXBlLCBhY3R1YWw6IFRNZXNzYWdlVHlwZSkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICBpZiBleHBlY3RlZCA9PSBhY3R1YWwgeworICAgICAgICBPaygoKSkKKyAgICB9IGVsc2UgeworICAgICAgICBFcnIoOjpFcnJvcjo6QXBwbGljYXRpb24oOjpBcHBsaWNhdGlvbkVycm9yIHsKKyAgICAgICAgICAgIGtpbmQ6IDo6QXBwbGljYXRpb25FcnJvcktpbmQ6OkludmFsaWRNZXNzYWdlVHlwZSwKKyAgICAgICAgICAgIG1lc3NhZ2U6IGZvcm1hdCEoImV4cGVjdGVkIHt9IGdvdCB7fSIsIGV4cGVjdGVkLCBhY3R1YWwpLAorICAgICAgICB9KSkKKyAgICB9Cit9CisKKy8vLyBDaGVjayBpZiBhIHJlcXVpcmVkIFRocmlmdCBzdHJ1Y3QgZmllbGQgZXhpc3RzLgorLy8vCisvLy8gUmV0dXJuIGAoKWAgaWYgaXQgZG9lcywgYEVycmAgb3RoZXJ3aXNlLgorcHViIGZuIHZlcmlmeV9yZXF1aXJlZF9maWVsZF9leGlzdHM8VD4oZmllbGRfbmFtZTogJnN0ciwgZmllbGQ6ICZPcHRpb248VD4pIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgbWF0Y2ggKmZpZWxkIHsKKyAgICAgICAgU29tZShfKSA9PiBPaygoKSksCisgICAgICAgIE5vbmUgPT4gRXJyKDo6RXJyb3I6OlByb3RvY29sKDo6UHJvdG9jb2xFcnJvciB7CisgICAgICAgICAgICBraW5kOiA6OlByb3RvY29sRXJyb3JLaW5kOjpVbmtub3duLAorICAgICAgICAgICAgbWVzc2FnZTogZm9ybWF0ISgibWlzc2luZyByZXF1aXJlZCBmaWVsZCB7fSIsIGZpZWxkX25hbWUpLAorICAgICAgICB9KSksCisgICAgfQorfQorCisvLy8gRXh0cmFjdCB0aGUgZmllbGQgaWQgZnJvbSBhIFRocmlmdCBmaWVsZCBpZGVudGlmaWVyLgorLy8vCisvLy8gYGZpZWxkX2lkZW50YCBtdXN0ICpub3QqIGhhdmUgYFRGaWVsZElkZW50aWZpZXIuZmllbGRfdHlwZWAgb2YgdHlwZSBgVFR5cGU6OlN0b3BgLgorLy8vCisvLy8gUmV0dXJuIGBURmllbGRJZGVudGlmaWVyLmlkYCBpZiBhbiBpZCBleGlzdHMsIGBFcnJgIG90aGVyd2lzZS4KK3B1YiBmbiBmaWVsZF9pZChmaWVsZF9pZGVudDogJlRGaWVsZElkZW50aWZpZXIpIC0+IDo6UmVzdWx0PGkxNj4geworICAgIGZpZWxkX2lkZW50LmlkLm9rX29yX2Vsc2UofHwgeworICAgICAgICA6OkVycm9yOjpQcm90b2NvbCg6OlByb3RvY29sRXJyb3IgeworICAgICAgICAgICAga2luZDogOjpQcm90b2NvbEVycm9yS2luZDo6VW5rbm93biwKKyAgICAgICAgICAgIG1lc3NhZ2U6IGZvcm1hdCEoIm1pc3NpbmcgZmllbGQgaW4gaW4gezo/fSIsIGZpZWxkX2lkZW50KSwKKyAgICAgICAgfSkKKyAgICB9KQorfQorCisjW2NmZyh0ZXN0KV0KK21vZCB0ZXN0cyB7CisKKyAgICB1c2Ugc3RkOjppbzo6Q3Vyc29yOworCisgICAgdXNlIHN1cGVyOjoqOworICAgIHVzZSB0cmFuc3BvcnQ6OntUUmVhZFRyYW5zcG9ydCwgVFdyaXRlVHJhbnNwb3J0fTsKKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X2NyZWF0ZV91c2FibGVfaW5wdXRfcHJvdG9jb2xfZnJvbV9jb25jcmV0ZV9pbnB1dF9wcm90b2NvbCgpIHsKKyAgICAgICAgbGV0IHI6IEJveDxUUmVhZFRyYW5zcG9ydD4gPSBCb3g6Om5ldyhDdXJzb3I6Om5ldyhbMCwgMSwgMl0pKTsKKyAgICAgICAgbGV0IG11dCB0ID0gVENvbXBhY3RJbnB1dFByb3RvY29sOjpuZXcocik7CisgICAgICAgIHRha2VzX2lucHV0X3Byb3RvY29sKCZtdXQgdCkKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9jcmVhdGVfdXNhYmxlX2lucHV0X3Byb3RvY29sX2Zyb21fYm94ZWRfaW5wdXQoKSB7CisgICAgICAgIGxldCByOiBCb3g8VFJlYWRUcmFuc3BvcnQ+ID0gQm94OjpuZXcoQ3Vyc29yOjpuZXcoWzAsIDEsIDJdKSk7CisgICAgICAgIGxldCBtdXQgdDogQm94PFRJbnB1dFByb3RvY29sPiA9IEJveDo6bmV3KFRDb21wYWN0SW5wdXRQcm90b2NvbDo6bmV3KHIpKTsKKyAgICAgICAgdGFrZXNfaW5wdXRfcHJvdG9jb2woJm11dCB0KQorICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X2NyZWF0ZV91c2FibGVfb3V0cHV0X3Byb3RvY29sX2Zyb21fY29uY3JldGVfb3V0cHV0X3Byb3RvY29sKCkgeworICAgICAgICBsZXQgdzogQm94PFRXcml0ZVRyYW5zcG9ydD4gPSBCb3g6Om5ldyh2ZWMhWzB1ODsgMTBdKTsKKyAgICAgICAgbGV0IG11dCB0ID0gVENvbXBhY3RPdXRwdXRQcm90b2NvbDo6bmV3KHcpOworICAgICAgICB0YWtlc19vdXRwdXRfcHJvdG9jb2woJm11dCB0KQorICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X2NyZWF0ZV91c2FibGVfb3V0cHV0X3Byb3RvY29sX2Zyb21fYm94ZWRfb3V0cHV0KCkgeworICAgICAgICBsZXQgdzogQm94PFRXcml0ZVRyYW5zcG9ydD4gPSBCb3g6Om5ldyh2ZWMhWzB1ODsgMTBdKTsKKyAgICAgICAgbGV0IG11dCB0OiBCb3g8VE91dHB1dFByb3RvY29sPiA9IEJveDo6bmV3KFRDb21wYWN0T3V0cHV0UHJvdG9jb2w6Om5ldyh3KSk7CisgICAgICAgIHRha2VzX291dHB1dF9wcm90b2NvbCgmbXV0IHQpCisgICAgfQorCisgICAgZm4gdGFrZXNfaW5wdXRfcHJvdG9jb2w8Uj4odDogJm11dCBSKQorICAgIHdoZXJlCisgICAgICAgIFI6IFRJbnB1dFByb3RvY29sLAorICAgIHsKKyAgICAgICAgdC5yZWFkX2J5dGUoKS51bndyYXAoKTsKKyAgICB9CisKKyAgICBmbiB0YWtlc19vdXRwdXRfcHJvdG9jb2w8Vz4odDogJm11dCBXKQorICAgIHdoZXJlCisgICAgICAgIFc6IFRPdXRwdXRQcm90b2NvbCwKKyAgICB7CisgICAgICAgIHQuZmx1c2goKS51bndyYXAoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcnMvc3JjL3Byb3RvY29sL211bHRpcGxleGVkLnJzIGIvbGliL3JzL3NyYy9wcm90b2NvbC9tdWx0aXBsZXhlZC5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWVlNDRmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3JzL3NyYy9wcm90b2NvbC9tdWx0aXBsZXhlZC5ycwpAQCAtMCwwICsxLDIzOSBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2Ugc3VwZXI6OnsKKyAgICBURmllbGRJZGVudGlmaWVyLCBUTGlzdElkZW50aWZpZXIsIFRNYXBJZGVudGlmaWVyLCBUTWVzc2FnZUlkZW50aWZpZXIsIFRNZXNzYWdlVHlwZSwKKyAgICBUT3V0cHV0UHJvdG9jb2wsIFRTZXRJZGVudGlmaWVyLCBUU3RydWN0SWRlbnRpZmllciwKK307CisKKy8vLyBgVE91dHB1dFByb3RvY29sYCB0aGF0IHByZWZpeGVzIHRoZSBzZXJ2aWNlIG5hbWUgdG8gYWxsIG91dGdvaW5nIFRocmlmdAorLy8vIG1lc3NhZ2VzLgorLy8vCisvLy8gQSBgVE11bHRpcGxleGVkT3V0cHV0UHJvdG9jb2xgIHNob3VsZCBiZSB1c2VkIHdoZW4gbXVsdGlwbGUgVGhyaWZ0IHNlcnZpY2VzCisvLy8gc2VuZCBtZXNzYWdlcyBvdmVyIGEgc2luZ2xlIEkvTyBjaGFubmVsLiBCeSBwcmVmaXhpbmcgc2VydmljZSBpZGVudGlmaWVycworLy8vIHRvIG91dGdvaW5nIG1lc3NhZ2VzIHJlY2VpdmVycyBhcmUgYWJsZSB0byBkZW11eCB0aGVtIGFuZCByb3V0ZSB0aGVtIHRvIHRoZQorLy8vIGFwcHJvcHJpYXRlIHNlcnZpY2UgcHJvY2Vzc29yLiBSdXN0IHJlY2VpdmVycyBtdXN0IHVzZSBhIGBUTXVsdGlwbGV4ZWRQcm9jZXNzb3JgCisvLy8gdG8gcHJvY2VzcyBpbmNvbWluZyBtZXNzYWdlcywgd2hpbGUgb3RoZXIgbGFuZ3VhZ2VzIG11c3QgdXNlIHRoZWlyCisvLy8gY29ycmVzcG9uZGluZyBtdWx0aXBsZXhlZCBwcm9jZXNzb3IgaW1wbGVtZW50YXRpb25zLgorLy8vCisvLy8gRm9yIGV4YW1wbGUsIGdpdmVuIGEgc2VydmljZSBgVGVzdFNlcnZpY2VgIGFuZCBhIHNlcnZpY2UgY2FsbCBgdGVzdF9jYWxsYCwKKy8vLyB0aGlzIGltcGxlbWVudGF0aW9uIHdvdWxkIGlkZW50aWZ5IG1lc3NhZ2VzIGFzIG9yaWdpbmF0aW5nIGZyb20KKy8vLyBgVGVzdFNlcnZpY2U6dGVzdF9jYWxsYC4KKy8vLworLy8vICMgRXhhbXBsZXMKKy8vLworLy8vIENyZWF0ZSBhbmQgdXNlIGEgYFRNdWx0aXBsZXhlZE91dHB1dFByb3RvY29sYC4KKy8vLworLy8vIGBgYG5vX3J1bgorLy8vIHVzZSB0aHJpZnQ6OnByb3RvY29sOjp7VE1lc3NhZ2VJZGVudGlmaWVyLCBUTWVzc2FnZVR5cGUsIFRPdXRwdXRQcm90b2NvbH07CisvLy8gdXNlIHRocmlmdDo6cHJvdG9jb2w6OntUQmluYXJ5T3V0cHV0UHJvdG9jb2wsIFRNdWx0aXBsZXhlZE91dHB1dFByb3RvY29sfTsKKy8vLyB1c2UgdGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUY3BDaGFubmVsOworLy8vCisvLy8gbGV0IG11dCBjaGFubmVsID0gVFRjcENoYW5uZWw6Om5ldygpOworLy8vIGNoYW5uZWwub3BlbigibG9jYWxob3N0OjkwOTAiKS51bndyYXAoKTsKKy8vLworLy8vIGxldCBwcm90b2NvbCA9IFRCaW5hcnlPdXRwdXRQcm90b2NvbDo6bmV3KGNoYW5uZWwsIHRydWUpOworLy8vIGxldCBtdXQgcHJvdG9jb2wgPSBUTXVsdGlwbGV4ZWRPdXRwdXRQcm90b2NvbDo6bmV3KCJzZXJ2aWNlX25hbWUiLCBwcm90b2NvbCk7CisvLy8KKy8vLyBsZXQgaWRlbnQgPSBUTWVzc2FnZUlkZW50aWZpZXI6Om5ldygic3ZjX2NhbGwiLCBUTWVzc2FnZVR5cGU6OkNhbGwsIDEpOworLy8vIHByb3RvY29sLndyaXRlX21lc3NhZ2VfYmVnaW4oJmlkZW50KS51bndyYXAoKTsKKy8vLyBgYGAKKyNbZGVyaXZlKERlYnVnKV0KK3B1YiBzdHJ1Y3QgVE11bHRpcGxleGVkT3V0cHV0UHJvdG9jb2w8UD4KK3doZXJlCisgICAgUDogVE91dHB1dFByb3RvY29sLAoreworICAgIHNlcnZpY2VfbmFtZTogU3RyaW5nLAorICAgIGlubmVyOiBQLAorfQorCitpbXBsPFA+IFRNdWx0aXBsZXhlZE91dHB1dFByb3RvY29sPFA+Cit3aGVyZQorICAgIFA6IFRPdXRwdXRQcm90b2NvbCwKK3sKKyAgICAvLy8gQ3JlYXRlIGEgYFRNdWx0aXBsZXhlZE91dHB1dFByb3RvY29sYCB0aGF0IGlkZW50aWZpZXMgb3V0Z29pbmcgbWVzc2FnZXMKKyAgICAvLy8gYXMgb3JpZ2luYXRpbmcgZnJvbSBhIHNlcnZpY2UgbmFtZWQgYHNlcnZpY2VfbmFtZWAgYW5kIHNlbmRzIHRoZW0gb3ZlcgorICAgIC8vLyB0aGUgYHdyYXBwZWRgIGBUT3V0cHV0UHJvdG9jb2xgLiBPdXRnb2luZyBtZXNzYWdlcyBhcmUgZW5jb2RlZCBhbmQgc2VudAorICAgIC8vLyBieSBgd3JhcHBlZGAsIG5vdCBieSB0aGlzIGluc3RhbmNlLgorICAgIHB1YiBmbiBuZXcoc2VydmljZV9uYW1lOiAmc3RyLCB3cmFwcGVkOiBQKSAtPiBUTXVsdGlwbGV4ZWRPdXRwdXRQcm90b2NvbDxQPiB7CisgICAgICAgIFRNdWx0aXBsZXhlZE91dHB1dFByb3RvY29sIHsKKyAgICAgICAgICAgIHNlcnZpY2VfbmFtZTogc2VydmljZV9uYW1lLnRvX293bmVkKCksCisgICAgICAgICAgICBpbm5lcjogd3JhcHBlZCwKKyAgICAgICAgfQorICAgIH0KK30KKworLy8gRklYTUU6IGF2b2lkIHBhc3N0aHJvdWdoIG1ldGhvZHMKK2ltcGw8UD4gVE91dHB1dFByb3RvY29sIGZvciBUTXVsdGlwbGV4ZWRPdXRwdXRQcm90b2NvbDxQPgord2hlcmUKKyAgICBQOiBUT3V0cHV0UHJvdG9jb2wsCit7CisgICAgZm4gd3JpdGVfbWVzc2FnZV9iZWdpbigmbXV0IHNlbGYsIGlkZW50aWZpZXI6ICZUTWVzc2FnZUlkZW50aWZpZXIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIG1hdGNoIGlkZW50aWZpZXIubWVzc2FnZV90eXBlIHsKKyAgICAgICAgICAgIC8vIEZJWE1FOiBpcyB0aGVyZSBhIGJldHRlciB3YXkgdG8gb3ZlcnJpZGUgaWRlbnRpZmllciBoZXJlPworICAgICAgICAgICAgVE1lc3NhZ2VUeXBlOjpDYWxsIHwgVE1lc3NhZ2VUeXBlOjpPbmVXYXkgPT4geworICAgICAgICAgICAgICAgIGxldCBpZGVudGlmaWVyID0gVE1lc3NhZ2VJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICAgICAgbmFtZTogZm9ybWF0ISgie306e30iLCBzZWxmLnNlcnZpY2VfbmFtZSwgaWRlbnRpZmllci5uYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgLi4qaWRlbnRpZmllcgorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgc2VsZi5pbm5lci53cml0ZV9tZXNzYWdlX2JlZ2luKCZpZGVudGlmaWVyKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgXyA9PiBzZWxmLmlubmVyLndyaXRlX21lc3NhZ2VfYmVnaW4oaWRlbnRpZmllciksCisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbiB3cml0ZV9tZXNzYWdlX2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuaW5uZXIud3JpdGVfbWVzc2FnZV9lbmQoKQorICAgIH0KKworICAgIGZuIHdyaXRlX3N0cnVjdF9iZWdpbigmbXV0IHNlbGYsIGlkZW50aWZpZXI6ICZUU3RydWN0SWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5pbm5lci53cml0ZV9zdHJ1Y3RfYmVnaW4oaWRlbnRpZmllcikKKyAgICB9CisKKyAgICBmbiB3cml0ZV9zdHJ1Y3RfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5pbm5lci53cml0ZV9zdHJ1Y3RfZW5kKCkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9maWVsZF9iZWdpbigmbXV0IHNlbGYsIGlkZW50aWZpZXI6ICZURmllbGRJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmlubmVyLndyaXRlX2ZpZWxkX2JlZ2luKGlkZW50aWZpZXIpCisgICAgfQorCisgICAgZm4gd3JpdGVfZmllbGRfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5pbm5lci53cml0ZV9maWVsZF9lbmQoKQorICAgIH0KKworICAgIGZuIHdyaXRlX2ZpZWxkX3N0b3AoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmlubmVyLndyaXRlX2ZpZWxkX3N0b3AoKQorICAgIH0KKworICAgIGZuIHdyaXRlX2J5dGVzKCZtdXQgc2VsZiwgYjogJlt1OF0pIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuaW5uZXIud3JpdGVfYnl0ZXMoYikKKyAgICB9CisKKyAgICBmbiB3cml0ZV9ib29sKCZtdXQgc2VsZiwgYjogYm9vbCkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5pbm5lci53cml0ZV9ib29sKGIpCisgICAgfQorCisgICAgZm4gd3JpdGVfaTgoJm11dCBzZWxmLCBpOiBpOCkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5pbm5lci53cml0ZV9pOChpKQorICAgIH0KKworICAgIGZuIHdyaXRlX2kxNigmbXV0IHNlbGYsIGk6IGkxNikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5pbm5lci53cml0ZV9pMTYoaSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9pMzIoJm11dCBzZWxmLCBpOiBpMzIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuaW5uZXIud3JpdGVfaTMyKGkpCisgICAgfQorCisgICAgZm4gd3JpdGVfaTY0KCZtdXQgc2VsZiwgaTogaTY0KSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmlubmVyLndyaXRlX2k2NChpKQorICAgIH0KKworICAgIGZuIHdyaXRlX2RvdWJsZSgmbXV0IHNlbGYsIGQ6IGY2NCkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5pbm5lci53cml0ZV9kb3VibGUoZCkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9zdHJpbmcoJm11dCBzZWxmLCBzOiAmc3RyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmlubmVyLndyaXRlX3N0cmluZyhzKQorICAgIH0KKworICAgIGZuIHdyaXRlX2xpc3RfYmVnaW4oJm11dCBzZWxmLCBpZGVudGlmaWVyOiAmVExpc3RJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmlubmVyLndyaXRlX2xpc3RfYmVnaW4oaWRlbnRpZmllcikKKyAgICB9CisKKyAgICBmbiB3cml0ZV9saXN0X2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuaW5uZXIud3JpdGVfbGlzdF9lbmQoKQorICAgIH0KKworICAgIGZuIHdyaXRlX3NldF9iZWdpbigmbXV0IHNlbGYsIGlkZW50aWZpZXI6ICZUU2V0SWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5pbm5lci53cml0ZV9zZXRfYmVnaW4oaWRlbnRpZmllcikKKyAgICB9CisKKyAgICBmbiB3cml0ZV9zZXRfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5pbm5lci53cml0ZV9zZXRfZW5kKCkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9tYXBfYmVnaW4oJm11dCBzZWxmLCBpZGVudGlmaWVyOiAmVE1hcElkZW50aWZpZXIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuaW5uZXIud3JpdGVfbWFwX2JlZ2luKGlkZW50aWZpZXIpCisgICAgfQorCisgICAgZm4gd3JpdGVfbWFwX2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuaW5uZXIud3JpdGVfbWFwX2VuZCgpCisgICAgfQorCisgICAgZm4gZmx1c2goJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmlubmVyLmZsdXNoKCkKKyAgICB9CisKKyAgICAvLyB1dGlsaXR5CisgICAgLy8KKworICAgIGZuIHdyaXRlX2J5dGUoJm11dCBzZWxmLCBiOiB1OCkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5pbm5lci53cml0ZV9ieXRlKGIpCisgICAgfQorfQorCisjW2NmZyh0ZXN0KV0KK21vZCB0ZXN0cyB7CisKKyAgICB1c2UgcHJvdG9jb2w6OntUQmluYXJ5T3V0cHV0UHJvdG9jb2wsIFRNZXNzYWdlSWRlbnRpZmllciwgVE1lc3NhZ2VUeXBlLCBUT3V0cHV0UHJvdG9jb2x9OworICAgIHVzZSB0cmFuc3BvcnQ6OntUQnVmZmVyQ2hhbm5lbCwgVElvQ2hhbm5lbCwgV3JpdGVIYWxmfTsKKworICAgIHVzZSBzdXBlcjo6KjsKKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX21lc3NhZ2VfYmVnaW5fd2l0aF9wcmVmaXhlZF9zZXJ2aWNlX25hbWUoKSB7CisgICAgICAgIGxldCBtdXQgb19wcm90ID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgbGV0IGlkZW50ID0gVE1lc3NhZ2VJZGVudGlmaWVyOjpuZXcoImJhciIsIFRNZXNzYWdlVHlwZTo6Q2FsbCwgMik7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfbWVzc2FnZV9iZWdpbigmaWRlbnQpKTsKKworICAgICAgICAjW2NmZ19hdHRyKHJ1c3RmbXQsIHJ1c3RmbXQ6OnNraXApXQorICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgMTldID0gWworICAgICAgICAgICAgMHg4MCwKKyAgICAgICAgICAgIDB4MDEsIC8qIHByb3RvY29sIGlkZW50aWZpZXIgKi8KKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDAxLCAvKiBtZXNzYWdlIHR5cGUgKi8KKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDcsCisgICAgICAgICAgICAweDY2LAorICAgICAgICAgICAgMHg2RiwKKyAgICAgICAgICAgIDB4NkYsIC8qICJmb28iICovCisgICAgICAgICAgICAweDNBLCAvKiAiOiIgKi8KKyAgICAgICAgICAgIDB4NjIsCisgICAgICAgICAgICAweDYxLAorICAgICAgICAgICAgMHg3MiwgLyogImJhciIgKi8KKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDIgLyogc2VxdWVuY2UgbnVtYmVyICovLAorICAgICAgICBdOworCisgICAgICAgIGFzc2VydF9lcSEob19wcm90LmlubmVyLnRyYW5zcG9ydC53cml0ZV9ieXRlcygpLCBleHBlY3RlZCk7CisgICAgfQorCisgICAgZm4gdGVzdF9vYmplY3RzKCkgLT4gVE11bHRpcGxleGVkT3V0cHV0UHJvdG9jb2w8VEJpbmFyeU91dHB1dFByb3RvY29sPFdyaXRlSGFsZjxUQnVmZmVyQ2hhbm5lbD4+PgorICAgIHsKKyAgICAgICAgbGV0IGMgPSBUQnVmZmVyQ2hhbm5lbDo6d2l0aF9jYXBhY2l0eSg0MCwgNDApOworICAgICAgICBsZXQgKF8sIHdfY2hhbikgPSBjLnNwbGl0KCkudW53cmFwKCk7CisgICAgICAgIGxldCBwcm90ID0gVEJpbmFyeU91dHB1dFByb3RvY29sOjpuZXcod19jaGFuLCB0cnVlKTsKKyAgICAgICAgVE11bHRpcGxleGVkT3V0cHV0UHJvdG9jb2w6Om5ldygiZm9vIiwgcHJvdCkKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcnMvc3JjL3Byb3RvY29sL3N0b3JlZC5ycyBiL2xpYi9ycy9zcmMvcHJvdG9jb2wvc3RvcmVkLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjNTU5NzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcnMvc3JjL3Byb3RvY29sL3N0b3JlZC5ycwpAQCAtMCwwICsxLDE5NiBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2Ugc3RkOjpjb252ZXJ0OjpJbnRvOworCit1c2Ugc3VwZXI6OnsKKyAgICBURmllbGRJZGVudGlmaWVyLCBUSW5wdXRQcm90b2NvbCwgVExpc3RJZGVudGlmaWVyLCBUTWFwSWRlbnRpZmllciwgVE1lc3NhZ2VJZGVudGlmaWVyLAorICAgIFRTZXRJZGVudGlmaWVyLCBUU3RydWN0SWRlbnRpZmllciwKK307Cit1c2UgUHJvdG9jb2xFcnJvcktpbmQ7CisKKy8vLyBgVElucHV0UHJvdG9jb2xgIHJlcXVpcmVkIHRvIHVzZSBhIGBUTXVsdGlwbGV4ZWRQcm9jZXNzb3JgLgorLy8vCisvLy8gQSBgVE11bHRpcGxleGVkUHJvY2Vzc29yYCByZWFkcyBpbmNvbWluZyBtZXNzYWdlIGlkZW50aWZpZXJzIHRvIGRldGVybWluZSB0bworLy8vIHdoaWNoIGBUUHJvY2Vzc29yYCByZXF1ZXN0cyBzaG91bGQgYmUgZm9yd2FyZGVkLiBIb3dldmVyLCBvbmNlIHJlYWQsIHRob3NlCisvLy8gbWVzc2FnZSBpZGVudGlmaWVyIGJ5dGVzIGFyZSBubyBsb25nZXIgb24gdGhlIHdpcmUuIFNpbmNlIGRvd25zdHJlYW0KKy8vLyBwcm9jZXNzb3JzIGV4cGVjdCB0byByZWFkIG1lc3NhZ2UgaWRlbnRpZmllcnMgZnJvbSB0aGUgZ2l2ZW4gaW5wdXQgcHJvdG9jb2wKKy8vLyB3ZSBuZWVkIHNvbWUgd2F5IG9mIHN1cHBseWluZyBhIGBUTWVzc2FnZUlkZW50aWZpZXJgIHdpdGggdGhlIHNlcnZpY2UtbmFtZQorLy8vIHN0cmlwcGVkLiBUaGlzIGltcGxlbWVudGF0aW9uIHN0b3JlcyB0aGUgcmVjZWl2ZWQgYFRNZXNzYWdlSWRlbnRpZmllcmAKKy8vLyAod2l0aG91dCB0aGUgc2VydmljZSBuYW1lKSBhbmQgcGFzc2VzIGl0IHRvIHRoZSB3cmFwcGVkIGBUSW5wdXRQcm90b2NvbGAKKy8vLyB3aGVuIGBUSW5wdXRQcm90b2NvbDo6cmVhZF9tZXNzYWdlX2JlZ2luKC4uLilgIGlzIGNhbGxlZC4gSXQgZGVsZWdhdGVzIGFsbAorLy8vIG90aGVyIGNhbGxzIGRpcmVjdGx5IHRvIHRoZSB3cmFwcGVkIGBUSW5wdXRQcm90b2NvbGAuCisvLy8KKy8vLyBUaGlzIHR5cGUgKipzaG91bGQgbm90KiogYmUgdXNlZCBieSBhcHBsaWNhdGlvbiBjb2RlLgorLy8vCisvLy8gIyBFeGFtcGxlcworLy8vCisvLy8gQ3JlYXRlIGFuZCB1c2UgYSBgVFN0b3JlZElucHV0UHJvdG9jb2xgLgorLy8vCisvLy8gYGBgbm9fcnVuCisvLy8gdXNlIHRocmlmdDsKKy8vLyB1c2UgdGhyaWZ0Ojpwcm90b2NvbDo6e1RJbnB1dFByb3RvY29sLCBUTWVzc2FnZUlkZW50aWZpZXIsIFRNZXNzYWdlVHlwZSwgVE91dHB1dFByb3RvY29sfTsKKy8vLyB1c2UgdGhyaWZ0Ojpwcm90b2NvbDo6e1RCaW5hcnlJbnB1dFByb3RvY29sLCBUQmluYXJ5T3V0cHV0UHJvdG9jb2wsIFRTdG9yZWRJbnB1dFByb3RvY29sfTsKKy8vLyB1c2UgdGhyaWZ0OjpzZXJ2ZXI6OlRQcm9jZXNzb3I7CisvLy8gdXNlIHRocmlmdDo6dHJhbnNwb3J0Ojp7VElvQ2hhbm5lbCwgVFRjcENoYW5uZWx9OworLy8vCisvLy8gLy8gc2FtcGxlIHByb2Nlc3NvcgorLy8vIHN0cnVjdCBBY3R1YWxQcm9jZXNzb3I7CisvLy8gaW1wbCBUUHJvY2Vzc29yIGZvciBBY3R1YWxQcm9jZXNzb3IgeworLy8vICAgICBmbiBwcm9jZXNzKAorLy8vICAgICAgICAgJnNlbGYsCisvLy8gICAgICAgICBfOiAmbXV0IFRJbnB1dFByb3RvY29sLAorLy8vICAgICAgICAgXzogJm11dCBUT3V0cHV0UHJvdG9jb2wKKy8vLyAgICAgKSAtPiB0aHJpZnQ6OlJlc3VsdDwoKT4geworLy8vICAgICAgICAgdW5pbXBsZW1lbnRlZCEoKQorLy8vICAgICB9CisvLy8gfQorLy8vIGxldCBwcm9jZXNzb3IgPSBBY3R1YWxQcm9jZXNzb3Ige307CisvLy8KKy8vLyAvLyBjb25zdHJ1Y3QgdGhlIHNoYXJlZCB0cmFuc3BvcnQKKy8vLyBsZXQgbXV0IGNoYW5uZWwgPSBUVGNwQ2hhbm5lbDo6bmV3KCk7CisvLy8gY2hhbm5lbC5vcGVuKCJsb2NhbGhvc3Q6OTA5MCIpLnVud3JhcCgpOworLy8vCisvLy8gbGV0IChpX2NoYW4sIG9fY2hhbikgPSBjaGFubmVsLnNwbGl0KCkudW53cmFwKCk7CisvLy8KKy8vLyAvLyBjb25zdHJ1Y3QgdGhlIGFjdHVhbCBpbnB1dCBhbmQgb3V0cHV0IHByb3RvY29scworLy8vIGxldCBtdXQgaV9wcm90ID0gVEJpbmFyeUlucHV0UHJvdG9jb2w6Om5ldyhpX2NoYW4sIHRydWUpOworLy8vIGxldCBtdXQgb19wcm90ID0gVEJpbmFyeU91dHB1dFByb3RvY29sOjpuZXcob19jaGFuLCB0cnVlKTsKKy8vLworLy8vIC8vIG1lc3NhZ2UgaWRlbnRpZmllciByZWNlaXZlZCBmcm9tIHJlbW90ZSBhbmQgbW9kaWZpZWQgdG8gcmVtb3ZlIHRoZSBzZXJ2aWNlIG5hbWUKKy8vLyBsZXQgbmV3X21zZ19pZGVudCA9IFRNZXNzYWdlSWRlbnRpZmllcjo6bmV3KCJzZXJ2aWNlX2NhbGwiLCBUTWVzc2FnZVR5cGU6OkNhbGwsIDEpOworLy8vCisvLy8gLy8gY29uc3RydWN0IHRoZSBwcm94eSBpbnB1dCBwcm90b2NvbAorLy8vIGxldCBtdXQgcHJveHlfaV9wcm90ID0gVFN0b3JlZElucHV0UHJvdG9jb2w6Om5ldygmbXV0IGlfcHJvdCwgbmV3X21zZ19pZGVudCk7CisvLy8gbGV0IHJlcyA9IHByb2Nlc3Nvci5wcm9jZXNzKCZtdXQgcHJveHlfaV9wcm90LCAmbXV0IG9fcHJvdCk7CisvLy8gYGBgCisvLyBGSVhNRTogaW1wbGVtZW50IERlYnVnCitwdWIgc3RydWN0IFRTdG9yZWRJbnB1dFByb3RvY29sPCdhPiB7CisgICAgaW5uZXI6ICYnYSBtdXQgVElucHV0UHJvdG9jb2wsCisgICAgbWVzc2FnZV9pZGVudDogT3B0aW9uPFRNZXNzYWdlSWRlbnRpZmllcj4sCit9CisKK2ltcGw8J2E+IFRTdG9yZWRJbnB1dFByb3RvY29sPCdhPiB7CisgICAgLy8vIENyZWF0ZSBhIGBUU3RvcmVkSW5wdXRQcm90b2NvbGAgdGhhdCBkZWxlZ2F0ZXMgYWxsIGNhbGxzIG90aGVyIHRoYW4KKyAgICAvLy8gYFRJbnB1dFByb3RvY29sOjpyZWFkX21lc3NhZ2VfYmVnaW4oLi4uKWAgdG8gYSBgd3JhcHBlZGAKKyAgICAvLy8gYFRJbnB1dFByb3RvY29sYC4gYG1lc3NhZ2VfaWRlbnRgIGlzIHRoZSBtb2RpZmllZCBtZXNzYWdlIGlkZW50aWZpZXIgLQorICAgIC8vLyB3aXRoIHNlcnZpY2UgbmFtZSBzdHJpcHBlZCAtIHRoYXQgd2lsbCBiZSBwYXNzZWQgdG8KKyAgICAvLy8gYHdyYXBwZWQucmVhZF9tZXNzYWdlX2JlZ2luKC4uLilgLgorICAgIHB1YiBmbiBuZXcoCisgICAgICAgIHdyYXBwZWQ6ICZtdXQgVElucHV0UHJvdG9jb2wsCisgICAgICAgIG1lc3NhZ2VfaWRlbnQ6IFRNZXNzYWdlSWRlbnRpZmllciwKKyAgICApIC0+IFRTdG9yZWRJbnB1dFByb3RvY29sIHsKKyAgICAgICAgVFN0b3JlZElucHV0UHJvdG9jb2wgeworICAgICAgICAgICAgaW5uZXI6IHdyYXBwZWQsCisgICAgICAgICAgICBtZXNzYWdlX2lkZW50OiBtZXNzYWdlX2lkZW50LmludG8oKSwKKyAgICAgICAgfQorICAgIH0KK30KKworaW1wbDwnYT4gVElucHV0UHJvdG9jb2wgZm9yIFRTdG9yZWRJbnB1dFByb3RvY29sPCdhPiB7CisgICAgZm4gcmVhZF9tZXNzYWdlX2JlZ2luKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8VE1lc3NhZ2VJZGVudGlmaWVyPiB7CisgICAgICAgIHNlbGYubWVzc2FnZV9pZGVudC50YWtlKCkub2tfb3JfZWxzZSh8fCB7CisgICAgICAgICAgICA6OmVycm9yczo6bmV3X3Byb3RvY29sX2Vycm9yKAorICAgICAgICAgICAgICAgIFByb3RvY29sRXJyb3JLaW5kOjpVbmtub3duLAorICAgICAgICAgICAgICAgICJtZXNzYWdlIGlkZW50aWZpZXIgYWxyZWFkeSByZWFkIiwKKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKKyAgICB9CisKKyAgICBmbiByZWFkX21lc3NhZ2VfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5pbm5lci5yZWFkX21lc3NhZ2VfZW5kKCkKKyAgICB9CisKKyAgICBmbiByZWFkX3N0cnVjdF9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PE9wdGlvbjxUU3RydWN0SWRlbnRpZmllcj4+IHsKKyAgICAgICAgc2VsZi5pbm5lci5yZWFkX3N0cnVjdF9iZWdpbigpCisgICAgfQorCisgICAgZm4gcmVhZF9zdHJ1Y3RfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5pbm5lci5yZWFkX3N0cnVjdF9lbmQoKQorICAgIH0KKworICAgIGZuIHJlYWRfZmllbGRfYmVnaW4oJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxURmllbGRJZGVudGlmaWVyPiB7CisgICAgICAgIHNlbGYuaW5uZXIucmVhZF9maWVsZF9iZWdpbigpCisgICAgfQorCisgICAgZm4gcmVhZF9maWVsZF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmlubmVyLnJlYWRfZmllbGRfZW5kKCkKKyAgICB9CisKKyAgICBmbiByZWFkX2J5dGVzKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8VmVjPHU4Pj4geworICAgICAgICBzZWxmLmlubmVyLnJlYWRfYnl0ZXMoKQorICAgIH0KKworICAgIGZuIHJlYWRfYm9vbCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PGJvb2w+IHsKKyAgICAgICAgc2VsZi5pbm5lci5yZWFkX2Jvb2woKQorICAgIH0KKworICAgIGZuIHJlYWRfaTgoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxpOD4geworICAgICAgICBzZWxmLmlubmVyLnJlYWRfaTgoKQorICAgIH0KKworICAgIGZuIHJlYWRfaTE2KCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8aTE2PiB7CisgICAgICAgIHNlbGYuaW5uZXIucmVhZF9pMTYoKQorICAgIH0KKworICAgIGZuIHJlYWRfaTMyKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8aTMyPiB7CisgICAgICAgIHNlbGYuaW5uZXIucmVhZF9pMzIoKQorICAgIH0KKworICAgIGZuIHJlYWRfaTY0KCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8aTY0PiB7CisgICAgICAgIHNlbGYuaW5uZXIucmVhZF9pNjQoKQorICAgIH0KKworICAgIGZuIHJlYWRfZG91YmxlKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8ZjY0PiB7CisgICAgICAgIHNlbGYuaW5uZXIucmVhZF9kb3VibGUoKQorICAgIH0KKworICAgIGZuIHJlYWRfc3RyaW5nKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8U3RyaW5nPiB7CisgICAgICAgIHNlbGYuaW5uZXIucmVhZF9zdHJpbmcoKQorICAgIH0KKworICAgIGZuIHJlYWRfbGlzdF9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFRMaXN0SWRlbnRpZmllcj4geworICAgICAgICBzZWxmLmlubmVyLnJlYWRfbGlzdF9iZWdpbigpCisgICAgfQorCisgICAgZm4gcmVhZF9saXN0X2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuaW5uZXIucmVhZF9saXN0X2VuZCgpCisgICAgfQorCisgICAgZm4gcmVhZF9zZXRfYmVnaW4oJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxUU2V0SWRlbnRpZmllcj4geworICAgICAgICBzZWxmLmlubmVyLnJlYWRfc2V0X2JlZ2luKCkKKyAgICB9CisKKyAgICBmbiByZWFkX3NldF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmlubmVyLnJlYWRfc2V0X2VuZCgpCisgICAgfQorCisgICAgZm4gcmVhZF9tYXBfYmVnaW4oJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxUTWFwSWRlbnRpZmllcj4geworICAgICAgICBzZWxmLmlubmVyLnJlYWRfbWFwX2JlZ2luKCkKKyAgICB9CisKKyAgICBmbiByZWFkX21hcF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmlubmVyLnJlYWRfbWFwX2VuZCgpCisgICAgfQorCisgICAgLy8gdXRpbGl0eQorICAgIC8vCisKKyAgICBmbiByZWFkX2J5dGUoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDx1OD4geworICAgICAgICBzZWxmLmlubmVyLnJlYWRfYnl0ZSgpCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3JzL3NyYy9zZXJ2ZXIvbW9kLnJzIGIvbGliL3JzL3NyYy9zZXJ2ZXIvbW9kLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwYjM4MWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcnMvc3JjL3NlcnZlci9tb2QucnMKQEAgLTAsMCArMSwxMjQgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8hIFR5cGVzIHVzZWQgdG8gaW1wbGVtZW50IGEgVGhyaWZ0IHNlcnZlci4KKwordXNlIHByb3RvY29sOjp7VElucHV0UHJvdG9jb2wsIFRNZXNzYWdlSWRlbnRpZmllciwgVE1lc3NhZ2VUeXBlLCBUT3V0cHV0UHJvdG9jb2x9OwordXNlIHtBcHBsaWNhdGlvbkVycm9yLCBBcHBsaWNhdGlvbkVycm9yS2luZH07CisKK21vZCBtdWx0aXBsZXhlZDsKK21vZCB0aHJlYWRlZDsKKworcHViIHVzZSBzZWxmOjptdWx0aXBsZXhlZDo6VE11bHRpcGxleGVkUHJvY2Vzc29yOworcHViIHVzZSBzZWxmOjp0aHJlYWRlZDo6VFNlcnZlcjsKKworLy8vIEhhbmRsZXMgaW5jb21pbmcgVGhyaWZ0IG1lc3NhZ2VzIGFuZCBkaXNwYXRjaGVzIHRoZW0gdG8gdGhlIHVzZXItZGVmaW5lZAorLy8vIGhhbmRsZXIgZnVuY3Rpb25zLgorLy8vCisvLy8gQW4gaW1wbGVtZW50YXRpb24gaXMgYXV0by1nZW5lcmF0ZWQgZm9yIGVhY2ggVGhyaWZ0IHNlcnZpY2UuIFdoZW4gdXNlZCBieSBhCisvLy8gc2VydmVyIChmb3IgZXhhbXBsZSwgYSBgVFNpbXBsZVNlcnZlcmApLCBpdCB3aWxsIGRlbXV4IGluY29taW5nIHNlcnZpY2UKKy8vLyBjYWxscyBhbmQgaW52b2tlIHRoZSBjb3JyZXNwb25kaW5nIHVzZXItZGVmaW5lZCBoYW5kbGVyIGZ1bmN0aW9uLgorLy8vCisvLy8gIyBFeGFtcGxlcworLy8vCisvLy8gQ3JlYXRlIGFuZCBzdGFydCBhIHNlcnZlciB1c2luZyB0aGUgYXV0by1nZW5lcmF0ZWQgYFRQcm9jZXNzb3JgIGZvcgorLy8vIGEgVGhyaWZ0IHNlcnZpY2UgYFNpbXBsZVNlcnZpY2VgLgorLy8vCisvLy8gYGBgbm9fcnVuCisvLy8gdXNlIHRocmlmdDsKKy8vLyB1c2UgdGhyaWZ0Ojpwcm90b2NvbDo6e1RJbnB1dFByb3RvY29sLCBUT3V0cHV0UHJvdG9jb2x9OworLy8vIHVzZSB0aHJpZnQ6OnNlcnZlcjo6VFByb2Nlc3NvcjsKKy8vLworLy8vIC8vCisvLy8gLy8gYXV0by1nZW5lcmF0ZWQKKy8vLyAvLworLy8vCisvLy8gLy8gcHJvY2Vzc29yIGZvciBgU2ltcGxlU2VydmljZWAKKy8vLyBzdHJ1Y3QgU2ltcGxlU2VydmljZVN5bmNQcm9jZXNzb3I7CisvLy8gaW1wbCBTaW1wbGVTZXJ2aWNlU3luY1Byb2Nlc3NvciB7CisvLy8gICAgIGZuIG5ldzxIOiBTaW1wbGVTZXJ2aWNlU3luY0hhbmRsZXI+KHByb2Nlc3NvcjogSCkgLT4gU2ltcGxlU2VydmljZVN5bmNQcm9jZXNzb3IgeworLy8vICAgICAgICAgdW5pbXBsZW1lbnRlZCEoKTsKKy8vLyAgICAgfQorLy8vIH0KKy8vLworLy8vIC8vIGBUUHJvY2Vzc29yYCBpbXBsZW1lbnRhdGlvbiBmb3IgYFNpbXBsZVNlcnZpY2VgCisvLy8gaW1wbCBUUHJvY2Vzc29yIGZvciBTaW1wbGVTZXJ2aWNlU3luY1Byb2Nlc3NvciB7CisvLy8gICAgIGZuIHByb2Nlc3MoJnNlbGYsIGk6ICZtdXQgVElucHV0UHJvdG9jb2wsIG86ICZtdXQgVE91dHB1dFByb3RvY29sKSAtPiB0aHJpZnQ6OlJlc3VsdDwoKT4geworLy8vICAgICAgICAgdW5pbXBsZW1lbnRlZCEoKTsKKy8vLyAgICAgfQorLy8vIH0KKy8vLworLy8vIC8vIHNlcnZpY2UgZnVuY3Rpb25zIGZvciBTaW1wbGVTZXJ2aWNlCisvLy8gdHJhaXQgU2ltcGxlU2VydmljZVN5bmNIYW5kbGVyIHsKKy8vLyAgICAgZm4gc2VydmljZV9jYWxsKCZzZWxmKSAtPiB0aHJpZnQ6OlJlc3VsdDwoKT47CisvLy8gfQorLy8vCisvLy8gLy8KKy8vLyAvLyB1c2VyLWNvZGUgZm9sbG93cworLy8vIC8vCisvLy8KKy8vLyAvLyBkZWZpbmUgYSBoYW5kbGVyIHRoYXQgd2lsbCBiZSBpbnZva2VkIHdoZW4gYHNlcnZpY2VfY2FsbGAgaXMgcmVjZWl2ZWQKKy8vLyBzdHJ1Y3QgU2ltcGxlU2VydmljZUhhbmRsZXJJbXBsOworLy8vIGltcGwgU2ltcGxlU2VydmljZVN5bmNIYW5kbGVyIGZvciBTaW1wbGVTZXJ2aWNlSGFuZGxlckltcGwgeworLy8vICAgICBmbiBzZXJ2aWNlX2NhbGwoJnNlbGYpIC0+IHRocmlmdDo6UmVzdWx0PCgpPiB7CisvLy8gICAgICAgICB1bmltcGxlbWVudGVkISgpOworLy8vICAgICB9CisvLy8gfQorLy8vCisvLy8gLy8gaW5zdGFudGlhdGUgdGhlIHByb2Nlc3NvcgorLy8vIGxldCBwcm9jZXNzb3IgPSBTaW1wbGVTZXJ2aWNlU3luY1Byb2Nlc3Nvcjo6bmV3KFNpbXBsZVNlcnZpY2VIYW5kbGVySW1wbCB7fSk7CisvLy8KKy8vLyAvLyBhdCB0aGlzIHBvaW50IHlvdSBjYW4gcGFzcyB0aGUgcHJvY2Vzc29yIHRvIHRoZSBzZXJ2ZXIKKy8vLyAvLyBsZXQgc2VydmVyID0gVFNlcnZlcjo6bmV3KC4uLiwgcHJvY2Vzc29yKTsKKy8vLyBgYGAKK3B1YiB0cmFpdCBUUHJvY2Vzc29yIHsKKyAgICAvLy8gUHJvY2VzcyBhIFRocmlmdCBzZXJ2aWNlIGNhbGwuCisgICAgLy8vCisgICAgLy8vIFJlYWRzIGFyZ3VtZW50cyBmcm9tIGBpYCwgZXhlY3V0ZXMgdGhlIHVzZXIncyBoYW5kbGVyIGNvZGUsIGFuZCB3cml0ZXMKKyAgICAvLy8gdGhlIHJlc3BvbnNlIHRvIGBvYC4KKyAgICAvLy8KKyAgICAvLy8gUmV0dXJucyBgKClgIGlmIHRoZSBoYW5kbGVyIHdhcyBleGVjdXRlZDsgYEVycmAgb3RoZXJ3aXNlLgorICAgIGZuIHByb2Nlc3MoJnNlbGYsIGk6ICZtdXQgVElucHV0UHJvdG9jb2wsIG86ICZtdXQgVE91dHB1dFByb3RvY29sKSAtPiA6OlJlc3VsdDwoKT47Cit9CisKKy8vLyBDb252ZW5pZW5jZSBmdW5jdGlvbiB1c2VkIGluIGdlbmVyYXRlZCBgVFByb2Nlc3NvcmAgaW1wbGVtZW50YXRpb25zIHRvCisvLy8gcmV0dXJuIGFuIGBBcHBsaWNhdGlvbkVycm9yYCBpZiB0aHJpZnQgbWVzc2FnZSBwcm9jZXNzaW5nIGZhaWxlZC4KK3B1YiBmbiBoYW5kbGVfcHJvY2Vzc19yZXN1bHQoCisgICAgbXNnX2lkZW50OiAmVE1lc3NhZ2VJZGVudGlmaWVyLAorICAgIHJlczogOjpSZXN1bHQ8KCk+LAorICAgIG9fcHJvdDogJm11dCBUT3V0cHV0UHJvdG9jb2wsCispIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgaWYgbGV0IEVycihlKSA9IHJlcyB7CisgICAgICAgIGxldCBlID0gbWF0Y2ggZSB7CisgICAgICAgICAgICA6OkVycm9yOjpBcHBsaWNhdGlvbihhKSA9PiBhLAorICAgICAgICAgICAgXyA9PiBBcHBsaWNhdGlvbkVycm9yOjpuZXcoQXBwbGljYXRpb25FcnJvcktpbmQ6OlVua25vd24sIGZvcm1hdCEoIns6P30iLCBlKSksCisgICAgICAgIH07CisKKyAgICAgICAgbGV0IGlkZW50ID0gVE1lc3NhZ2VJZGVudGlmaWVyOjpuZXcoCisgICAgICAgICAgICBtc2dfaWRlbnQubmFtZS5jbG9uZSgpLAorICAgICAgICAgICAgVE1lc3NhZ2VUeXBlOjpFeGNlcHRpb24sCisgICAgICAgICAgICBtc2dfaWRlbnQuc2VxdWVuY2VfbnVtYmVyLAorICAgICAgICApOworCisgICAgICAgIG9fcHJvdC53cml0ZV9tZXNzYWdlX2JlZ2luKCZpZGVudCk/OworICAgICAgICA6OkVycm9yOjp3cml0ZV9hcHBsaWNhdGlvbl9lcnJvcl90b19vdXRfcHJvdG9jb2woJmUsIG9fcHJvdCk/OworICAgICAgICBvX3Byb3Qud3JpdGVfbWVzc2FnZV9lbmQoKT87CisgICAgICAgIG9fcHJvdC5mbHVzaCgpCisgICAgfSBlbHNlIHsKKyAgICAgICAgT2soKCkpCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3JzL3NyYy9zZXJ2ZXIvbXVsdGlwbGV4ZWQucnMgYi9saWIvcnMvc3JjL3NlcnZlci9tdWx0aXBsZXhlZC5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDMzNzk0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3JzL3NyYy9zZXJ2ZXIvbXVsdGlwbGV4ZWQucnMKQEAgLTAsMCArMSwzNTEgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNlIHN0ZDo6Y29sbGVjdGlvbnM6Okhhc2hNYXA7Cit1c2Ugc3RkOjpjb252ZXJ0OjpJbnRvOwordXNlIHN0ZDo6Zm10OwordXNlIHN0ZDo6Zm10Ojp7RGVidWcsIEZvcm1hdHRlcn07Cit1c2Ugc3RkOjpzeW5jOjp7QXJjLCBNdXRleH07CisKK3VzZSBwcm90b2NvbDo6e1RJbnB1dFByb3RvY29sLCBUTWVzc2FnZUlkZW50aWZpZXIsIFRPdXRwdXRQcm90b2NvbCwgVFN0b3JlZElucHV0UHJvdG9jb2x9OworCit1c2Ugc3VwZXI6OntoYW5kbGVfcHJvY2Vzc19yZXN1bHQsIFRQcm9jZXNzb3J9OworCitjb25zdCBNSVNTSU5HX1NFUEFSQVRPUl9BTkRfTk9fREVGQVVMVDogJidzdGF0aWMgc3RyID0KKyAgICAibWlzc2luZyBzZXJ2aWNlIHNlcGFyYXRvciBhbmQgbm8gZGVmYXVsdCBwcm9jZXNzb3Igc2V0IjsKK3R5cGUgVGhyZWFkU2FmZVByb2Nlc3NvciA9IEJveDxUUHJvY2Vzc29yICsgU2VuZCArIFN5bmM+OworCisvLy8gQSBgVFByb2Nlc3NvcmAgdGhhdCBjYW4gZGVtdXggc2VydmljZSBjYWxscyB0byBtdWx0aXBsZSB1bmRlcmx5aW5nCisvLy8gVGhyaWZ0IHNlcnZpY2VzLgorLy8vCisvLy8gVXNlcnMgcmVnaXN0ZXIgc2VydmljZS1zcGVjaWZpYyBgVFByb2Nlc3NvcmAgaW5zdGFuY2VzIHdpdGggYQorLy8vIGBUTXVsdGlwbGV4ZWRQcm9jZXNzb3JgLCBhbmQgdGhlbiByZWdpc3RlciB0aGF0IHByb2Nlc3NvciB3aXRoIGEgc2VydmVyCisvLy8gaW1wbGVtZW50YXRpb24uIEZvbGxvd2luZyB0aGF0LCBhbGwgaW5jb21pbmcgc2VydmljZSBjYWxscyBhcmUgYXV0b21hdGljYWxseQorLy8vIHJvdXRlZCB0byB0aGUgc2VydmljZS1zcGVjaWZpYyBgVFByb2Nlc3NvcmAuCisvLy8KKy8vLyBBIGBUTXVsdGlwbGV4ZWRQcm9jZXNzb3JgIGNhbiBvbmx5IGhhbmRsZSBtZXNzYWdlcyBzZW50IGJ5IGEKKy8vLyBgVE11bHRpcGxleGVkT3V0cHV0UHJvdG9jb2xgLgorI1tkZXJpdmUoRGVmYXVsdCldCitwdWIgc3RydWN0IFRNdWx0aXBsZXhlZFByb2Nlc3NvciB7CisgICAgc3RvcmVkOiBNdXRleDxTdG9yZWRQcm9jZXNzb3JzPiwKK30KKworI1tkZXJpdmUoRGVmYXVsdCldCitzdHJ1Y3QgU3RvcmVkUHJvY2Vzc29ycyB7CisgICAgcHJvY2Vzc29yczogSGFzaE1hcDxTdHJpbmcsIEFyYzxUaHJlYWRTYWZlUHJvY2Vzc29yPj4sCisgICAgZGVmYXVsdF9wcm9jZXNzb3I6IE9wdGlvbjxBcmM8VGhyZWFkU2FmZVByb2Nlc3Nvcj4+LAorfQorCitpbXBsIFRNdWx0aXBsZXhlZFByb2Nlc3NvciB7CisgICAgLy8vIENyZWF0ZSBhIG5ldyBgVE11bHRpcGxleGVkUHJvY2Vzc29yYCB3aXRoIG5vIHJlZ2lzdGVyZWQgc2VydmljZS1zcGVjaWZpYworICAgIC8vLyBwcm9jZXNzb3JzLgorICAgIHB1YiBmbiBuZXcoKSAtPiBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IgeworICAgICAgICBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IgeworICAgICAgICAgICAgc3RvcmVkOiBNdXRleDo6bmV3KFN0b3JlZFByb2Nlc3NvcnMgeworICAgICAgICAgICAgICAgIHByb2Nlc3NvcnM6IEhhc2hNYXA6Om5ldygpLAorICAgICAgICAgICAgICAgIGRlZmF1bHRfcHJvY2Vzc29yOiBOb25lLAorICAgICAgICAgICAgfSksCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLy8gUmVnaXN0ZXIgYSBzZXJ2aWNlLXNwZWNpZmljIGBwcm9jZXNzb3JgIGZvciB0aGUgc2VydmljZSBuYW1lZAorICAgIC8vLyBgc2VydmljZV9uYW1lYC4gVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBhbHNvIGJhY2t3YXJkcy1jb21wYXRpYmxlIHdpdGgKKyAgICAvLy8gbm9uLW11bHRpcGxleGVkIGNsaWVudHMuIFNldCBgYXNfZGVmYXVsdGAgdG8gYHRydWVgIHRvIGFsbG93CisgICAgLy8vIG5vbi1uYW1lc3BhY2VkIHJlcXVlc3RzIHRvIGJlIGRpc3BhdGNoZWQgdG8gYSBkZWZhdWx0IHByb2Nlc3Nvci4KKyAgICAvLy8KKyAgICAvLy8gUmV0dXJucyBzdWNjZXNzIGlmIGEgbmV3IGVudHJ5IHdhcyBpbnNlcnRlZC4gUmV0dXJucyBhbiBlcnJvciBpZjoKKyAgICAvLy8gKiBBIHByb2Nlc3NvciBleGlzdHMgZm9yIGBzZXJ2aWNlX25hbWVgCisgICAgLy8vICogWW91IGF0dGVtcHQgdG8gcmVnaXN0ZXIgYSBwcm9jZXNzb3IgYXMgZGVmYXVsdCwgYW5kIGFuIGV4aXN0aW5nIGRlZmF1bHQgZXhpc3RzCisgICAgI1tjZmdfYXR0cihmZWF0dXJlID0gImNhcmdvLWNsaXBweSIsIGFsbG93KG1hcF9lbnRyeSkpXQorICAgIHB1YiBmbiByZWdpc3RlcjxTOiBJbnRvPFN0cmluZz4+KAorICAgICAgICAmbXV0IHNlbGYsCisgICAgICAgIHNlcnZpY2VfbmFtZTogUywKKyAgICAgICAgcHJvY2Vzc29yOiBCb3g8VFByb2Nlc3NvciArIFNlbmQgKyBTeW5jPiwKKyAgICAgICAgYXNfZGVmYXVsdDogYm9vbCwKKyAgICApIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIGxldCBtdXQgc3RvcmVkID0gc2VsZi5zdG9yZWQubG9jaygpLnVud3JhcCgpOworCisgICAgICAgIGxldCBuYW1lID0gc2VydmljZV9uYW1lLmludG8oKTsKKyAgICAgICAgaWYgIXN0b3JlZC5wcm9jZXNzb3JzLmNvbnRhaW5zX2tleSgmbmFtZSkgeworICAgICAgICAgICAgbGV0IHByb2Nlc3NvciA9IEFyYzo6bmV3KHByb2Nlc3Nvcik7CisKKyAgICAgICAgICAgIGlmIGFzX2RlZmF1bHQgeworICAgICAgICAgICAgICAgIGlmIHN0b3JlZC5kZWZhdWx0X3Byb2Nlc3Nvci5pc19ub25lKCkgeworICAgICAgICAgICAgICAgICAgICBzdG9yZWQucHJvY2Vzc29ycy5pbnNlcnQobmFtZSwgcHJvY2Vzc29yLmNsb25lKCkpOworICAgICAgICAgICAgICAgICAgICBzdG9yZWQuZGVmYXVsdF9wcm9jZXNzb3IgPSBTb21lKHByb2Nlc3Nvci5jbG9uZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgT2soKCkpCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgRXJyKCJjYW5ub3QgcmVzZXQgZGVmYXVsdCBwcm9jZXNzb3IiLmludG8oKSkKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN0b3JlZC5wcm9jZXNzb3JzLmluc2VydChuYW1lLCBwcm9jZXNzb3IpOworICAgICAgICAgICAgICAgIE9rKCgpKQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgRXJyKGZvcm1hdCEoImNhbm5vdCBvdmVyd3JpdGUgZXhpc3RpbmcgcHJvY2Vzc29yIGZvciBzZXJ2aWNlIHt9IiwgbmFtZSkuaW50bygpKQorICAgICAgICB9CisgICAgfQorCisgICAgZm4gcHJvY2Vzc19tZXNzYWdlKAorICAgICAgICAmc2VsZiwKKyAgICAgICAgbXNnX2lkZW50OiAmVE1lc3NhZ2VJZGVudGlmaWVyLAorICAgICAgICBpX3Byb3Q6ICZtdXQgVElucHV0UHJvdG9jb2wsCisgICAgICAgIG9fcHJvdDogJm11dCBUT3V0cHV0UHJvdG9jb2wsCisgICAgKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBsZXQgKHN2Y19uYW1lLCBzdmNfY2FsbCkgPSBzcGxpdF9pZGVudF9uYW1lKCZtc2dfaWRlbnQubmFtZSk7CisgICAgICAgIGRlYnVnISgicm91dGluZyBzdmNfbmFtZSB7Oj99IHN2Y19jYWxsIHt9IiwgJnN2Y19uYW1lLCAmc3ZjX2NhbGwpOworCisgICAgICAgIGxldCBwcm9jZXNzb3I6IE9wdGlvbjxBcmM8VGhyZWFkU2FmZVByb2Nlc3Nvcj4+ID0geworICAgICAgICAgICAgbGV0IHN0b3JlZCA9IHNlbGYuc3RvcmVkLmxvY2soKS51bndyYXAoKTsKKyAgICAgICAgICAgIGlmIGxldCBTb21lKG5hbWUpID0gc3ZjX25hbWUgeworICAgICAgICAgICAgICAgIHN0b3JlZC5wcm9jZXNzb3JzLmdldChuYW1lKS5jbG9uZWQoKQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdG9yZWQuZGVmYXVsdF9wcm9jZXNzb3IuY2xvbmUoKQorICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIG1hdGNoIHByb2Nlc3NvciB7CisgICAgICAgICAgICBTb21lKGFyYykgPT4geworICAgICAgICAgICAgICAgIGxldCBuZXdfbXNnX2lkZW50ID0gVE1lc3NhZ2VJZGVudGlmaWVyOjpuZXcoCisgICAgICAgICAgICAgICAgICAgIHN2Y19jYWxsLAorICAgICAgICAgICAgICAgICAgICBtc2dfaWRlbnQubWVzc2FnZV90eXBlLAorICAgICAgICAgICAgICAgICAgICBtc2dfaWRlbnQuc2VxdWVuY2VfbnVtYmVyLAorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgbGV0IG11dCBwcm94eV9pX3Byb3QgPSBUU3RvcmVkSW5wdXRQcm90b2NvbDo6bmV3KGlfcHJvdCwgbmV3X21zZ19pZGVudCk7CisgICAgICAgICAgICAgICAgKCphcmMpLnByb2Nlc3MoJm11dCBwcm94eV9pX3Byb3QsIG9fcHJvdCkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE5vbmUgPT4gRXJyKG1pc3NpbmdfcHJvY2Vzc29yX21lc3NhZ2Uoc3ZjX25hbWUpLmludG8oKSksCisgICAgICAgIH0KKyAgICB9Cit9CisKK2ltcGwgVFByb2Nlc3NvciBmb3IgVE11bHRpcGxleGVkUHJvY2Vzc29yIHsKKyAgICBmbiBwcm9jZXNzKCZzZWxmLCBpX3Byb3Q6ICZtdXQgVElucHV0UHJvdG9jb2wsIG9fcHJvdDogJm11dCBUT3V0cHV0UHJvdG9jb2wpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIGxldCBtc2dfaWRlbnQgPSBpX3Byb3QucmVhZF9tZXNzYWdlX2JlZ2luKCk/OworCisgICAgICAgIGRlYnVnISgicHJvY2VzcyBpbmNvbWluZyBtc2cgaWQ6ezo/fSIsICZtc2dfaWRlbnQpOworICAgICAgICBsZXQgcmVzID0gc2VsZi5wcm9jZXNzX21lc3NhZ2UoJm1zZ19pZGVudCwgaV9wcm90LCBvX3Byb3QpOworCisgICAgICAgIGhhbmRsZV9wcm9jZXNzX3Jlc3VsdCgmbXNnX2lkZW50LCByZXMsIG9fcHJvdCkKKyAgICB9Cit9CisKK2ltcGwgRGVidWcgZm9yIFRNdWx0aXBsZXhlZFByb2Nlc3NvciB7CisgICAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IEZvcm1hdHRlcikgLT4gZm10OjpSZXN1bHQgeworICAgICAgICBsZXQgc3RvcmVkID0gc2VsZi5zdG9yZWQubG9jaygpLnVud3JhcCgpOworICAgICAgICB3cml0ZSEoCisgICAgICAgICAgICBmLAorICAgICAgICAgICAgIlRNdWx0aXBsZXhlZFByb2Nlc3Mge3sgcmVnaXN0ZXJlZF9jb3VudDogezo/fSBkZWZhdWx0OiB7Oj99IH19IiwKKyAgICAgICAgICAgIHN0b3JlZC5wcm9jZXNzb3JzLmtleXMoKS5sZW4oKSwKKyAgICAgICAgICAgIHN0b3JlZC5kZWZhdWx0X3Byb2Nlc3Nvci5pc19zb21lKCkKKyAgICAgICAgKQorICAgIH0KK30KKworZm4gc3BsaXRfaWRlbnRfbmFtZShpZGVudF9uYW1lOiAmc3RyKSAtPiAoT3B0aW9uPCZzdHI+LCAmc3RyKSB7CisgICAgaWRlbnRfbmFtZQorICAgICAgICAuZmluZCgnOicpCisgICAgICAgIC5tYXAofHBvc3wgeworICAgICAgICAgICAgbGV0IChzdmNfbmFtZSwgc3ZjX2NhbGwpID0gaWRlbnRfbmFtZS5zcGxpdF9hdChwb3MpOworICAgICAgICAgICAgbGV0IChfLCBzdmNfY2FsbCkgPSBzdmNfY2FsbC5zcGxpdF9hdCgxKTsgLy8gcmVtb3ZlIGNvbG9uIGZyb20gc2VydmljZSBjYWxsIG5hbWUKKyAgICAgICAgICAgIChTb21lKHN2Y19uYW1lKSwgc3ZjX2NhbGwpCisgICAgICAgIH0pCisgICAgICAgIC5vcl9lbHNlKHx8IFNvbWUoKE5vbmUsIGlkZW50X25hbWUpKSkKKyAgICAgICAgLnVud3JhcCgpCit9CisKK2ZuIG1pc3NpbmdfcHJvY2Vzc29yX21lc3NhZ2Uoc3ZjX25hbWU6IE9wdGlvbjwmc3RyPikgLT4gU3RyaW5nIHsKKyAgICBtYXRjaCBzdmNfbmFtZSB7CisgICAgICAgIFNvbWUobmFtZSkgPT4gZm9ybWF0ISgibm8gcHJvY2Vzc29yIGZvdW5kIGZvciBzZXJ2aWNlIHt9IiwgbmFtZSksCisgICAgICAgIE5vbmUgPT4gTUlTU0lOR19TRVBBUkFUT1JfQU5EX05PX0RFRkFVTFQudG9fb3duZWQoKSwKKyAgICB9Cit9CisKKyNbY2ZnKHRlc3QpXQorbW9kIHRlc3RzIHsKKyAgICB1c2Ugc3RkOjpjb252ZXJ0OjpJbnRvOworICAgIHVzZSBzdGQ6OnN5bmM6OmF0b21pYzo6e0F0b21pY0Jvb2wsIE9yZGVyaW5nfTsKKyAgICB1c2Ugc3RkOjpzeW5jOjpBcmM7CisKKyAgICB1c2UgcHJvdG9jb2w6OntUQmluYXJ5SW5wdXRQcm90b2NvbCwgVEJpbmFyeU91dHB1dFByb3RvY29sLCBUTWVzc2FnZUlkZW50aWZpZXIsIFRNZXNzYWdlVHlwZX07CisgICAgdXNlIHRyYW5zcG9ydDo6e1JlYWRIYWxmLCBUQnVmZmVyQ2hhbm5lbCwgVElvQ2hhbm5lbCwgV3JpdGVIYWxmfTsKKyAgICB1c2Uge0FwcGxpY2F0aW9uRXJyb3IsIEFwcGxpY2F0aW9uRXJyb3JLaW5kfTsKKworICAgIHVzZSBzdXBlcjo6KjsKKworICAgICNbdGVzdF0KKyAgICBmbiBzaG91bGRfc3BsaXRfbmFtZV9pbnRvX3Byb3Blcl9zZXBhcmF0b3JfYW5kX3NlcnZpY2VfY2FsbCgpIHsKKyAgICAgICAgbGV0IGlkZW50X25hbWUgPSAiZm9vOmJhcl9jYWxsIjsKKyAgICAgICAgbGV0IChzZXJ2LCBjYWxsKSA9IHNwbGl0X2lkZW50X25hbWUoJmlkZW50X25hbWUpOworICAgICAgICBhc3NlcnRfZXEhKHNlcnYsIFNvbWUoImZvbyIpKTsKKyAgICAgICAgYXNzZXJ0X2VxIShjYWxsLCAiYmFyX2NhbGwiKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gc2hvdWxkX3JldHVybl9mdWxsX2lkZW50X2lmX25vX3NlcGFyYXRvcl9leGlzdHMoKSB7CisgICAgICAgIGxldCBpZGVudF9uYW1lID0gImJhcl9jYWxsIjsKKyAgICAgICAgbGV0IChzZXJ2LCBjYWxsKSA9IHNwbGl0X2lkZW50X25hbWUoJmlkZW50X25hbWUpOworICAgICAgICBhc3NlcnRfZXEhKHNlcnYsIE5vbmUpOworICAgICAgICBhc3NlcnRfZXEhKGNhbGwsICJiYXJfY2FsbCIpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBzaG91bGRfd3JpdGVfZXJyb3JfaWZfbm9fc2VwYXJhdG9yX2ZvdW5kX2FuZF9ub19kZWZhdWx0X3Byb2Nlc3Nvcl9leGlzdHMoKSB7CisgICAgICAgIGxldCAobXV0IGksIG11dCBvKSA9IGJ1aWxkX29iamVjdHMoKTsKKworICAgICAgICBsZXQgc2VudF9pZGVudCA9IFRNZXNzYWdlSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUTWVzc2FnZVR5cGU6OkNhbGwsIDEwKTsKKyAgICAgICAgby53cml0ZV9tZXNzYWdlX2JlZ2luKCZzZW50X2lkZW50KS51bndyYXAoKTsKKyAgICAgICAgby5mbHVzaCgpLnVud3JhcCgpOworICAgICAgICBvLnRyYW5zcG9ydC5jb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlcigpOworICAgICAgICBvLnRyYW5zcG9ydC5lbXB0eV93cml0ZV9idWZmZXIoKTsKKworICAgICAgICBsZXQgcCA9IFRNdWx0aXBsZXhlZFByb2Nlc3Nvcjo6bmV3KCk7CisgICAgICAgIHAucHJvY2VzcygmbXV0IGksICZtdXQgbykudW53cmFwKCk7IC8vIGF0IHRoaXMgcG9pbnQgYW4gZXJyb3Igc2hvdWxkIGJlIHdyaXR0ZW4gb3V0CisKKyAgICAgICAgaS50cmFuc3BvcnQuc2V0X3JlYWRhYmxlX2J5dGVzKCZvLnRyYW5zcG9ydC53cml0ZV9ieXRlcygpKTsKKyAgICAgICAgbGV0IHJjdmRfaWRlbnQgPSBpLnJlYWRfbWVzc2FnZV9iZWdpbigpLnVud3JhcCgpOworICAgICAgICBsZXQgZXhwZWN0ZWRfaWRlbnQgPSBUTWVzc2FnZUlkZW50aWZpZXI6Om5ldygiZm9vIiwgVE1lc3NhZ2VUeXBlOjpFeGNlcHRpb24sIDEwKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyY3ZkX2lkZW50LCBleHBlY3RlZF9pZGVudCk7CisgICAgICAgIGxldCByY3ZkX2VyciA9IDo6RXJyb3I6OnJlYWRfYXBwbGljYXRpb25fZXJyb3JfZnJvbV9pbl9wcm90b2NvbCgmbXV0IGkpLnVud3JhcCgpOworICAgICAgICBsZXQgZXhwZWN0ZWRfZXJyID0gQXBwbGljYXRpb25FcnJvcjo6bmV3KAorICAgICAgICAgICAgQXBwbGljYXRpb25FcnJvcktpbmQ6OlVua25vd24sCisgICAgICAgICAgICBNSVNTSU5HX1NFUEFSQVRPUl9BTkRfTk9fREVGQVVMVCwKKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyY3ZkX2VyciwgZXhwZWN0ZWRfZXJyKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gc2hvdWxkX3dyaXRlX2Vycm9yX2lmX3NlcGFyYXRvcl9leGlzdHNfYW5kX25vX3Byb2Nlc3Nvcl9mb3VuZCgpIHsKKyAgICAgICAgbGV0IChtdXQgaSwgbXV0IG8pID0gYnVpbGRfb2JqZWN0cygpOworCisgICAgICAgIGxldCBzZW50X2lkZW50ID0gVE1lc3NhZ2VJZGVudGlmaWVyOjpuZXcoIm1pc3Npbmc6Y2FsbCIsIFRNZXNzYWdlVHlwZTo6Q2FsbCwgMTApOworICAgICAgICBvLndyaXRlX21lc3NhZ2VfYmVnaW4oJnNlbnRfaWRlbnQpLnVud3JhcCgpOworICAgICAgICBvLmZsdXNoKCkudW53cmFwKCk7CisgICAgICAgIG8udHJhbnNwb3J0LmNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyKCk7CisgICAgICAgIG8udHJhbnNwb3J0LmVtcHR5X3dyaXRlX2J1ZmZlcigpOworCisgICAgICAgIGxldCBwID0gVE11bHRpcGxleGVkUHJvY2Vzc29yOjpuZXcoKTsKKyAgICAgICAgcC5wcm9jZXNzKCZtdXQgaSwgJm11dCBvKS51bndyYXAoKTsgLy8gYXQgdGhpcyBwb2ludCBhbiBlcnJvciBzaG91bGQgYmUgd3JpdHRlbiBvdXQKKworICAgICAgICBpLnRyYW5zcG9ydC5zZXRfcmVhZGFibGVfYnl0ZXMoJm8udHJhbnNwb3J0LndyaXRlX2J5dGVzKCkpOworICAgICAgICBsZXQgcmN2ZF9pZGVudCA9IGkucmVhZF9tZXNzYWdlX2JlZ2luKCkudW53cmFwKCk7CisgICAgICAgIGxldCBleHBlY3RlZF9pZGVudCA9IFRNZXNzYWdlSWRlbnRpZmllcjo6bmV3KCJtaXNzaW5nOmNhbGwiLCBUTWVzc2FnZVR5cGU6OkV4Y2VwdGlvbiwgMTApOworICAgICAgICBhc3NlcnRfZXEhKHJjdmRfaWRlbnQsIGV4cGVjdGVkX2lkZW50KTsKKyAgICAgICAgbGV0IHJjdmRfZXJyID0gOjpFcnJvcjo6cmVhZF9hcHBsaWNhdGlvbl9lcnJvcl9mcm9tX2luX3Byb3RvY29sKCZtdXQgaSkudW53cmFwKCk7CisgICAgICAgIGxldCBleHBlY3RlZF9lcnIgPSBBcHBsaWNhdGlvbkVycm9yOjpuZXcoCisgICAgICAgICAgICBBcHBsaWNhdGlvbkVycm9yS2luZDo6VW5rbm93biwKKyAgICAgICAgICAgIG1pc3NpbmdfcHJvY2Vzc29yX21lc3NhZ2UoU29tZSgibWlzc2luZyIpKSwKKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyY3ZkX2VyciwgZXhwZWN0ZWRfZXJyKTsKKyAgICB9CisKKyAgICAjW2Rlcml2ZShEZWZhdWx0KV0KKyAgICBzdHJ1Y3QgU2VydmljZSB7CisgICAgICAgIHB1YiBpbnZva2VkOiBBcmM8QXRvbWljQm9vbD4sCisgICAgfQorCisgICAgaW1wbCBUUHJvY2Vzc29yIGZvciBTZXJ2aWNlIHsKKyAgICAgICAgZm4gcHJvY2Vzcygmc2VsZiwgXzogJm11dCBUSW5wdXRQcm90b2NvbCwgXzogJm11dCBUT3V0cHV0UHJvdG9jb2wpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgICAgICBsZXQgcmVzID0gc2VsZgorICAgICAgICAgICAgICAgIC5pbnZva2VkCisgICAgICAgICAgICAgICAgLmNvbXBhcmVfYW5kX3N3YXAoZmFsc2UsIHRydWUsIE9yZGVyaW5nOjpSZWxheGVkKTsKKyAgICAgICAgICAgIGlmIHJlcyB7CisgICAgICAgICAgICAgICAgT2soKCkpCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEVycigiZmFpbGVkIHN3YXAiLmludG8oKSkKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBzaG91bGRfcm91dGVfY2FsbF90b19jb3JyZWN0X3Byb2Nlc3NvcigpIHsKKyAgICAgICAgbGV0IChtdXQgaSwgbXV0IG8pID0gYnVpbGRfb2JqZWN0cygpOworCisgICAgICAgIC8vIGJ1aWxkIHRoZSBzZXJ2aWNlcworICAgICAgICBsZXQgc3ZjXzEgPSBTZXJ2aWNlIHsKKyAgICAgICAgICAgIGludm9rZWQ6IEFyYzo6bmV3KEF0b21pY0Jvb2w6Om5ldyhmYWxzZSkpLAorICAgICAgICB9OworICAgICAgICBsZXQgYXRtXzEgPSBzdmNfMS5pbnZva2VkLmNsb25lKCk7CisgICAgICAgIGxldCBzdmNfMiA9IFNlcnZpY2UgeworICAgICAgICAgICAgaW52b2tlZDogQXJjOjpuZXcoQXRvbWljQm9vbDo6bmV3KGZhbHNlKSksCisgICAgICAgIH07CisgICAgICAgIGxldCBhdG1fMiA9IHN2Y18yLmludm9rZWQuY2xvbmUoKTsKKworICAgICAgICAvLyByZWdpc3RlciB0aGVtCisgICAgICAgIGxldCBtdXQgcCA9IFRNdWx0aXBsZXhlZFByb2Nlc3Nvcjo6bmV3KCk7CisgICAgICAgIHAucmVnaXN0ZXIoInNlcnZpY2VfMSIsIEJveDo6bmV3KHN2Y18xKSwgZmFsc2UpLnVud3JhcCgpOworICAgICAgICBwLnJlZ2lzdGVyKCJzZXJ2aWNlXzIiLCBCb3g6Om5ldyhzdmNfMiksIGZhbHNlKS51bndyYXAoKTsKKworICAgICAgICAvLyBtYWtlIHRoZSBzZXJ2aWNlIGNhbGwKKyAgICAgICAgbGV0IHNlbnRfaWRlbnQgPSBUTWVzc2FnZUlkZW50aWZpZXI6Om5ldygic2VydmljZV8xOmNhbGwiLCBUTWVzc2FnZVR5cGU6OkNhbGwsIDEwKTsKKyAgICAgICAgby53cml0ZV9tZXNzYWdlX2JlZ2luKCZzZW50X2lkZW50KS51bndyYXAoKTsKKyAgICAgICAgby5mbHVzaCgpLnVud3JhcCgpOworICAgICAgICBvLnRyYW5zcG9ydC5jb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlcigpOworICAgICAgICBvLnRyYW5zcG9ydC5lbXB0eV93cml0ZV9idWZmZXIoKTsKKworICAgICAgICBwLnByb2Nlc3MoJm11dCBpLCAmbXV0IG8pLnVud3JhcCgpOworCisgICAgICAgIC8vIHNlcnZpY2UgMSBzaG91bGQgaGF2ZSBiZWVuIGludm9rZWQsIG5vdCBzZXJ2aWNlIDIKKyAgICAgICAgYXNzZXJ0X2VxIShhdG1fMS5sb2FkKE9yZGVyaW5nOjpSZWxheGVkKSwgdHJ1ZSk7CisgICAgICAgIGFzc2VydF9lcSEoYXRtXzIubG9hZChPcmRlcmluZzo6UmVsYXhlZCksIGZhbHNlKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gc2hvdWxkX3JvdXRlX2NhbGxfdG9fY29ycmVjdF9wcm9jZXNzb3JfaWZfbm9fc2VwYXJhdG9yX2V4aXN0c19hbmRfZGVmYXVsdF9wcm9jZXNzb3Jfc2V0KCkgeworICAgICAgICBsZXQgKG11dCBpLCBtdXQgbykgPSBidWlsZF9vYmplY3RzKCk7CisKKyAgICAgICAgLy8gYnVpbGQgdGhlIHNlcnZpY2VzCisgICAgICAgIGxldCBzdmNfMSA9IFNlcnZpY2UgeworICAgICAgICAgICAgaW52b2tlZDogQXJjOjpuZXcoQXRvbWljQm9vbDo6bmV3KGZhbHNlKSksCisgICAgICAgIH07CisgICAgICAgIGxldCBhdG1fMSA9IHN2Y18xLmludm9rZWQuY2xvbmUoKTsKKyAgICAgICAgbGV0IHN2Y18yID0gU2VydmljZSB7CisgICAgICAgICAgICBpbnZva2VkOiBBcmM6Om5ldyhBdG9taWNCb29sOjpuZXcoZmFsc2UpKSwKKyAgICAgICAgfTsKKyAgICAgICAgbGV0IGF0bV8yID0gc3ZjXzIuaW52b2tlZC5jbG9uZSgpOworCisgICAgICAgIC8vIHJlZ2lzdGVyIHRoZW0KKyAgICAgICAgbGV0IG11dCBwID0gVE11bHRpcGxleGVkUHJvY2Vzc29yOjpuZXcoKTsKKyAgICAgICAgcC5yZWdpc3Rlcigic2VydmljZV8xIiwgQm94OjpuZXcoc3ZjXzEpLCBmYWxzZSkudW53cmFwKCk7CisgICAgICAgIHAucmVnaXN0ZXIoInNlcnZpY2VfMiIsIEJveDo6bmV3KHN2Y18yKSwgdHJ1ZSkudW53cmFwKCk7IC8vIHNlY29uZCBwcm9jZXNzb3IgaXMgZGVmYXVsdAorCisgICAgICAgIC8vIG1ha2UgdGhlIHNlcnZpY2UgY2FsbCAoaXQncyBhbiBvbGQgY2xpZW50LCBzbyB3ZSBoYXZlIHRvIGJlIGJhY2t3YXJkcyBjb21wYXRpYmxlKQorICAgICAgICBsZXQgc2VudF9pZGVudCA9IFRNZXNzYWdlSWRlbnRpZmllcjo6bmV3KCJvbGRfY2FsbCIsIFRNZXNzYWdlVHlwZTo6Q2FsbCwgMTApOworICAgICAgICBvLndyaXRlX21lc3NhZ2VfYmVnaW4oJnNlbnRfaWRlbnQpLnVud3JhcCgpOworICAgICAgICBvLmZsdXNoKCkudW53cmFwKCk7CisgICAgICAgIG8udHJhbnNwb3J0LmNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyKCk7CisgICAgICAgIG8udHJhbnNwb3J0LmVtcHR5X3dyaXRlX2J1ZmZlcigpOworCisgICAgICAgIHAucHJvY2VzcygmbXV0IGksICZtdXQgbykudW53cmFwKCk7CisKKyAgICAgICAgLy8gc2VydmljZSAyIHNob3VsZCBoYXZlIGJlZW4gaW52b2tlZCwgbm90IHNlcnZpY2UgMQorICAgICAgICBhc3NlcnRfZXEhKGF0bV8xLmxvYWQoT3JkZXJpbmc6OlJlbGF4ZWQpLCBmYWxzZSk7CisgICAgICAgIGFzc2VydF9lcSEoYXRtXzIubG9hZChPcmRlcmluZzo6UmVsYXhlZCksIHRydWUpOworICAgIH0KKworICAgIGZuIGJ1aWxkX29iamVjdHMoKSAtPiAoCisgICAgICAgIFRCaW5hcnlJbnB1dFByb3RvY29sPFJlYWRIYWxmPFRCdWZmZXJDaGFubmVsPj4sCisgICAgICAgIFRCaW5hcnlPdXRwdXRQcm90b2NvbDxXcml0ZUhhbGY8VEJ1ZmZlckNoYW5uZWw+PiwKKyAgICApIHsKKyAgICAgICAgbGV0IGMgPSBUQnVmZmVyQ2hhbm5lbDo6d2l0aF9jYXBhY2l0eSgxMjgsIDEyOCk7CisgICAgICAgIGxldCAocl9jLCB3X2MpID0gYy5zcGxpdCgpLnVud3JhcCgpOworICAgICAgICAoCisgICAgICAgICAgICBUQmluYXJ5SW5wdXRQcm90b2NvbDo6bmV3KHJfYywgdHJ1ZSksCisgICAgICAgICAgICBUQmluYXJ5T3V0cHV0UHJvdG9jb2w6Om5ldyh3X2MsIHRydWUpLAorICAgICAgICApCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3JzL3NyYy9zZXJ2ZXIvdGhyZWFkZWQucnMgYi9saWIvcnMvc3JjL3NlcnZlci90aHJlYWRlZC5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTM5YTRlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3JzL3NyYy9zZXJ2ZXIvdGhyZWFkZWQucnMKQEAgLTAsMCArMSwyMzQgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNlIHN0ZDo6bmV0Ojp7VGNwTGlzdGVuZXIsIFRjcFN0cmVhbX07Cit1c2Ugc3RkOjpzeW5jOjpBcmM7Cit1c2UgdGhyZWFkcG9vbDo6VGhyZWFkUG9vbDsKKwordXNlIHByb3RvY29sOjp7VElucHV0UHJvdG9jb2wsIFRJbnB1dFByb3RvY29sRmFjdG9yeSwgVE91dHB1dFByb3RvY29sLCBUT3V0cHV0UHJvdG9jb2xGYWN0b3J5fTsKK3VzZSB0cmFuc3BvcnQ6OntUSW9DaGFubmVsLCBUUmVhZFRyYW5zcG9ydEZhY3RvcnksIFRUY3BDaGFubmVsLCBUV3JpdGVUcmFuc3BvcnRGYWN0b3J5fTsKK3VzZSB7QXBwbGljYXRpb25FcnJvciwgQXBwbGljYXRpb25FcnJvcktpbmR9OworCit1c2Ugc3VwZXI6OlRQcm9jZXNzb3I7CisKKy8vLyBGaXhlZC1zaXplIHRocmVhZC1wb29sIGJsb2NraW5nIFRocmlmdCBzZXJ2ZXIuCisvLy8KKy8vLyBBIGBUU2VydmVyYCBsaXN0ZW5zIG9uIGEgZ2l2ZW4gYWRkcmVzcyBhbmQgc3VibWl0cyBhY2NlcHRlZCBjb25uZWN0aW9ucworLy8vIHRvIGFuICoqdW5ib3VuZGVkKiogcXVldWUuIENvbm5lY3Rpb25zIGZyb20gdGhpcyBxdWV1ZSBhcmUgc2VydmljZWQgYnkKKy8vLyB0aGUgZmlyc3QgYXZhaWxhYmxlIHdvcmtlciB0aHJlYWQgZnJvbSBhICoqZml4ZWQtc2l6ZSoqIHRocmVhZCBwb29sLiBFYWNoCisvLy8gYWNjZXB0ZWQgY29ubmVjdGlvbiBpcyBoYW5kbGVkIGJ5IHRoYXQgd29ya2VyIHRocmVhZCwgYW5kIGNvbW11bmljYXRpb24KKy8vLyBvdmVyIHRoaXMgdGhyZWFkIG9jY3VycyBzZXF1ZW50aWFsbHkgYW5kIHN5bmNocm9ub3VzbHkgKGkuZS4gY2FsbHMgYmxvY2spLgorLy8vIEFjY2VwdGVkIGNvbm5lY3Rpb25zIGhhdmUgYW4gaW5wdXQgaGFsZiBhbmQgYW4gb3V0cHV0IGhhbGYsIGVhY2ggb2Ygd2hpY2gKKy8vLyB1c2VzIGEgYFRUcmFuc3BvcnRgIGFuZCBgVElucHV0UHJvdG9jb2xgL2BUT3V0cHV0UHJvdG9jb2xgIHRvIHRyYW5zbGF0ZQorLy8vIG1lc3NhZ2VzIHRvIGFuZCBmcm9tIGJ5ZXMuIEFueSBjb21iaW5hdGlvbiBvZiBgVElucHV0UHJvdG9jb2xgLCBgVE91dHB1dFByb3RvY29sYAorLy8vIGFuZCBgVFRyYW5zcG9ydGAgbWF5IGJlIHVzZWQuCisvLy8KKy8vLyAjIEV4YW1wbGVzCisvLy8KKy8vLyBDcmVhdGluZyBhbmQgcnVubmluZyBhIGBUU2VydmVyYCB1c2luZyBUaHJpZnQtY29tcGlsZXItZ2VuZXJhdGVkCisvLy8gc2VydmljZSBjb2RlLgorLy8vCisvLy8gYGBgbm9fcnVuCisvLy8gdXNlIHRocmlmdDsKKy8vLyB1c2UgdGhyaWZ0Ojpwcm90b2NvbDo6e1RJbnB1dFByb3RvY29sRmFjdG9yeSwgVE91dHB1dFByb3RvY29sRmFjdG9yeX07CisvLy8gdXNlIHRocmlmdDo6cHJvdG9jb2w6OntUQmluYXJ5SW5wdXRQcm90b2NvbEZhY3RvcnksIFRCaW5hcnlPdXRwdXRQcm90b2NvbEZhY3Rvcnl9OworLy8vIHVzZSB0aHJpZnQ6OnByb3RvY29sOjp7VElucHV0UHJvdG9jb2wsIFRPdXRwdXRQcm90b2NvbH07CisvLy8gdXNlIHRocmlmdDo6dHJhbnNwb3J0Ojp7VEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydEZhY3RvcnksIFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0RmFjdG9yeSwKKy8vLyAgICAgICAgICAgICAgICAgICAgICAgICBUUmVhZFRyYW5zcG9ydEZhY3RvcnksIFRXcml0ZVRyYW5zcG9ydEZhY3Rvcnl9OworLy8vIHVzZSB0aHJpZnQ6OnNlcnZlcjo6e1RQcm9jZXNzb3IsIFRTZXJ2ZXJ9OworLy8vCisvLy8gLy8KKy8vLyAvLyBhdXRvLWdlbmVyYXRlZAorLy8vIC8vCisvLy8KKy8vLyAvLyBwcm9jZXNzb3IgZm9yIGBTaW1wbGVTZXJ2aWNlYAorLy8vIHN0cnVjdCBTaW1wbGVTZXJ2aWNlU3luY1Byb2Nlc3NvcjsKKy8vLyBpbXBsIFNpbXBsZVNlcnZpY2VTeW5jUHJvY2Vzc29yIHsKKy8vLyAgICAgZm4gbmV3PEg6IFNpbXBsZVNlcnZpY2VTeW5jSGFuZGxlcj4ocHJvY2Vzc29yOiBIKSAtPiBTaW1wbGVTZXJ2aWNlU3luY1Byb2Nlc3NvciB7CisvLy8gICAgICAgICB1bmltcGxlbWVudGVkISgpOworLy8vICAgICB9CisvLy8gfQorLy8vCisvLy8gLy8gYFRQcm9jZXNzb3JgIGltcGxlbWVudGF0aW9uIGZvciBgU2ltcGxlU2VydmljZWAKKy8vLyBpbXBsIFRQcm9jZXNzb3IgZm9yIFNpbXBsZVNlcnZpY2VTeW5jUHJvY2Vzc29yIHsKKy8vLyAgICAgZm4gcHJvY2Vzcygmc2VsZiwgaTogJm11dCBUSW5wdXRQcm90b2NvbCwgbzogJm11dCBUT3V0cHV0UHJvdG9jb2wpIC0+IHRocmlmdDo6UmVzdWx0PCgpPiB7CisvLy8gICAgICAgICB1bmltcGxlbWVudGVkISgpOworLy8vICAgICB9CisvLy8gfQorLy8vCisvLy8gLy8gc2VydmljZSBmdW5jdGlvbnMgZm9yIFNpbXBsZVNlcnZpY2UKKy8vLyB0cmFpdCBTaW1wbGVTZXJ2aWNlU3luY0hhbmRsZXIgeworLy8vICAgICBmbiBzZXJ2aWNlX2NhbGwoJnNlbGYpIC0+IHRocmlmdDo6UmVzdWx0PCgpPjsKKy8vLyB9CisvLy8KKy8vLyAvLworLy8vIC8vIHVzZXItY29kZSBmb2xsb3dzCisvLy8gLy8KKy8vLworLy8vIC8vIGRlZmluZSBhIGhhbmRsZXIgdGhhdCB3aWxsIGJlIGludm9rZWQgd2hlbiBgc2VydmljZV9jYWxsYCBpcyByZWNlaXZlZAorLy8vIHN0cnVjdCBTaW1wbGVTZXJ2aWNlSGFuZGxlckltcGw7CisvLy8gaW1wbCBTaW1wbGVTZXJ2aWNlU3luY0hhbmRsZXIgZm9yIFNpbXBsZVNlcnZpY2VIYW5kbGVySW1wbCB7CisvLy8gICAgIGZuIHNlcnZpY2VfY2FsbCgmc2VsZikgLT4gdGhyaWZ0OjpSZXN1bHQ8KCk+IHsKKy8vLyAgICAgICAgIHVuaW1wbGVtZW50ZWQhKCk7CisvLy8gICAgIH0KKy8vLyB9CisvLy8KKy8vLyAvLyBpbnN0YW50aWF0ZSB0aGUgcHJvY2Vzc29yCisvLy8gbGV0IHByb2Nlc3NvciA9IFNpbXBsZVNlcnZpY2VTeW5jUHJvY2Vzc29yOjpuZXcoU2ltcGxlU2VydmljZUhhbmRsZXJJbXBsIHt9KTsKKy8vLworLy8vIC8vIGluc3RhbnRpYXRlIHRoZSBzZXJ2ZXIKKy8vLyBsZXQgaV90cl9mYWN0OiBCb3g8VFJlYWRUcmFuc3BvcnRGYWN0b3J5PiA9IEJveDo6bmV3KFRCdWZmZXJlZFJlYWRUcmFuc3BvcnRGYWN0b3J5OjpuZXcoKSk7CisvLy8gbGV0IGlfcHJfZmFjdDogQm94PFRJbnB1dFByb3RvY29sRmFjdG9yeT4gPSBCb3g6Om5ldyhUQmluYXJ5SW5wdXRQcm90b2NvbEZhY3Rvcnk6Om5ldygpKTsKKy8vLyBsZXQgb190cl9mYWN0OiBCb3g8VFdyaXRlVHJhbnNwb3J0RmFjdG9yeT4gPSBCb3g6Om5ldyhUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydEZhY3Rvcnk6Om5ldygpKTsKKy8vLyBsZXQgb19wcl9mYWN0OiBCb3g8VE91dHB1dFByb3RvY29sRmFjdG9yeT4gPSBCb3g6Om5ldyhUQmluYXJ5T3V0cHV0UHJvdG9jb2xGYWN0b3J5OjpuZXcoKSk7CisvLy8KKy8vLyBsZXQgbXV0IHNlcnZlciA9IFRTZXJ2ZXI6Om5ldygKKy8vLyAgICAgaV90cl9mYWN0LAorLy8vICAgICBpX3ByX2ZhY3QsCisvLy8gICAgIG9fdHJfZmFjdCwKKy8vLyAgICAgb19wcl9mYWN0LAorLy8vICAgICBwcm9jZXNzb3IsCisvLy8gICAgIDEwCisvLy8gKTsKKy8vLworLy8vIC8vIHN0YXJ0IGxpc3RlbmluZyBmb3IgaW5jb21pbmcgY29ubmVjdGlvbnMKKy8vLyBtYXRjaCBzZXJ2ZXIubGlzdGVuKCIxMjcuMC4wLjE6ODA4MCIpIHsKKy8vLyAgIE9rKF8pICA9PiBwcmludGxuISgibGlzdGVuIGNvbXBsZXRlZCIpLAorLy8vICAgRXJyKGUpID0+IHByaW50bG4hKCJsaXN0ZW4gZmFpbGVkIHdpdGggZXJyb3Igezo/fSIsIGUpLAorLy8vIH0KKy8vLyBgYGAKKyNbZGVyaXZlKERlYnVnKV0KK3B1YiBzdHJ1Y3QgVFNlcnZlcjxQUkMsIFJURiwgSVBGLCBXVEYsIE9QRj4KK3doZXJlCisgICAgUFJDOiBUUHJvY2Vzc29yICsgU2VuZCArIFN5bmMgKyAnc3RhdGljLAorICAgIFJURjogVFJlYWRUcmFuc3BvcnRGYWN0b3J5ICsgJ3N0YXRpYywKKyAgICBJUEY6IFRJbnB1dFByb3RvY29sRmFjdG9yeSArICdzdGF0aWMsCisgICAgV1RGOiBUV3JpdGVUcmFuc3BvcnRGYWN0b3J5ICsgJ3N0YXRpYywKKyAgICBPUEY6IFRPdXRwdXRQcm90b2NvbEZhY3RvcnkgKyAnc3RhdGljLAoreworICAgIHJfdHJhbnNfZmFjdG9yeTogUlRGLAorICAgIGlfcHJvdG9fZmFjdG9yeTogSVBGLAorICAgIHdfdHJhbnNfZmFjdG9yeTogV1RGLAorICAgIG9fcHJvdG9fZmFjdG9yeTogT1BGLAorICAgIHByb2Nlc3NvcjogQXJjPFBSQz4sCisgICAgd29ya2VyX3Bvb2w6IFRocmVhZFBvb2wsCit9CisKK2ltcGw8UFJDLCBSVEYsIElQRiwgV1RGLCBPUEY+IFRTZXJ2ZXI8UFJDLCBSVEYsIElQRiwgV1RGLCBPUEY+Cit3aGVyZQorICAgIFBSQzogVFByb2Nlc3NvciArIFNlbmQgKyBTeW5jICsgJ3N0YXRpYywKKyAgICBSVEY6IFRSZWFkVHJhbnNwb3J0RmFjdG9yeSArICdzdGF0aWMsCisgICAgSVBGOiBUSW5wdXRQcm90b2NvbEZhY3RvcnkgKyAnc3RhdGljLAorICAgIFdURjogVFdyaXRlVHJhbnNwb3J0RmFjdG9yeSArICdzdGF0aWMsCisgICAgT1BGOiBUT3V0cHV0UHJvdG9jb2xGYWN0b3J5ICsgJ3N0YXRpYywKK3sKKyAgICAvLy8gQ3JlYXRlIGEgYFRTZXJ2ZXJgLgorICAgIC8vLworICAgIC8vLyBFYWNoIGFjY2VwdGVkIGNvbm5lY3Rpb24gaGFzIGFuIGlucHV0IGFuZCBvdXRwdXQgaGFsZiwgZWFjaCBvZiB3aGljaAorICAgIC8vLyByZXF1aXJlcyBhIGBUVHJhbnNwb3J0YCBhbmQgYFRQcm90b2NvbGAuIGBUU2VydmVyYCB1c2VzCisgICAgLy8vIGByZWFkX3RyYW5zcG9ydF9mYWN0b3J5YCBhbmQgYGlucHV0X3Byb3RvY29sX2ZhY3RvcnlgIHRvIGNyZWF0ZQorICAgIC8vLyBpbXBsZW1lbnRhdGlvbnMgZm9yIHRoZSBpbnB1dCwgYW5kIGB3cml0ZV90cmFuc3BvcnRfZmFjdG9yeWAgYW5kCisgICAgLy8vIGBvdXRwdXRfcHJvdG9jb2xfZmFjdG9yeWAgdG8gY3JlYXRlIGltcGxlbWVudGF0aW9ucyBmb3IgdGhlIG91dHB1dC4KKyAgICBwdWIgZm4gbmV3KAorICAgICAgICByZWFkX3RyYW5zcG9ydF9mYWN0b3J5OiBSVEYsCisgICAgICAgIGlucHV0X3Byb3RvY29sX2ZhY3Rvcnk6IElQRiwKKyAgICAgICAgd3JpdGVfdHJhbnNwb3J0X2ZhY3Rvcnk6IFdURiwKKyAgICAgICAgb3V0cHV0X3Byb3RvY29sX2ZhY3Rvcnk6IE9QRiwKKyAgICAgICAgcHJvY2Vzc29yOiBQUkMsCisgICAgICAgIG51bV93b3JrZXJzOiB1c2l6ZSwKKyAgICApIC0+IFRTZXJ2ZXI8UFJDLCBSVEYsIElQRiwgV1RGLCBPUEY+IHsKKyAgICAgICAgVFNlcnZlciB7CisgICAgICAgICAgICByX3RyYW5zX2ZhY3Rvcnk6IHJlYWRfdHJhbnNwb3J0X2ZhY3RvcnksCisgICAgICAgICAgICBpX3Byb3RvX2ZhY3Rvcnk6IGlucHV0X3Byb3RvY29sX2ZhY3RvcnksCisgICAgICAgICAgICB3X3RyYW5zX2ZhY3Rvcnk6IHdyaXRlX3RyYW5zcG9ydF9mYWN0b3J5LAorICAgICAgICAgICAgb19wcm90b19mYWN0b3J5OiBvdXRwdXRfcHJvdG9jb2xfZmFjdG9yeSwKKyAgICAgICAgICAgIHByb2Nlc3NvcjogQXJjOjpuZXcocHJvY2Vzc29yKSwKKyAgICAgICAgICAgIHdvcmtlcl9wb29sOiBUaHJlYWRQb29sOjp3aXRoX25hbWUoIlRocmlmdCBzZXJ2aWNlIHByb2Nlc3NvciIudG9fb3duZWQoKSwgbnVtX3dvcmtlcnMpLAorICAgICAgICB9CisgICAgfQorCisgICAgLy8vIExpc3RlbiBmb3IgaW5jb21pbmcgY29ubmVjdGlvbnMgb24gYGxpc3Rlbl9hZGRyZXNzYC4KKyAgICAvLy8KKyAgICAvLy8gYGxpc3Rlbl9hZGRyZXNzYCBzaG91bGQgYmUgaW4gdGhlIGZvcm0gYGhvc3Q6cG9ydGAsCisgICAgLy8vIGZvciBleGFtcGxlOiBgMTI3LjAuMC4xOjgwODBgLgorICAgIC8vLworICAgIC8vLyBSZXR1cm4gYCgpYCBpZiBzdWNjZXNzZnVsLgorICAgIC8vLworICAgIC8vLyBSZXR1cm4gYEVycmAgd2hlbiB0aGUgc2VydmVyIGNhbm5vdCBiaW5kIHRvIGBsaXN0ZW5fYWRkcmVzc2Agb3IgdGhlcmUKKyAgICAvLy8gaXMgYW4gdW5yZWNvdmVyYWJsZSBlcnJvci4KKyAgICBwdWIgZm4gbGlzdGVuKCZtdXQgc2VsZiwgbGlzdGVuX2FkZHJlc3M6ICZzdHIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIGxldCBsaXN0ZW5lciA9IFRjcExpc3RlbmVyOjpiaW5kKGxpc3Rlbl9hZGRyZXNzKT87CisgICAgICAgIGZvciBzdHJlYW0gaW4gbGlzdGVuZXIuaW5jb21pbmcoKSB7CisgICAgICAgICAgICBtYXRjaCBzdHJlYW0geworICAgICAgICAgICAgICAgIE9rKHMpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgbGV0IChpX3Byb3QsIG9fcHJvdCkgPSBzZWxmLm5ld19wcm90b2NvbHNfZm9yX2Nvbm5lY3Rpb24ocyk/OworICAgICAgICAgICAgICAgICAgICBsZXQgcHJvY2Vzc29yID0gc2VsZi5wcm9jZXNzb3IuY2xvbmUoKTsKKyAgICAgICAgICAgICAgICAgICAgc2VsZi53b3JrZXJfcG9vbAorICAgICAgICAgICAgICAgICAgICAgICAgLmV4ZWN1dGUobW92ZSB8fCBoYW5kbGVfaW5jb21pbmdfY29ubmVjdGlvbihwcm9jZXNzb3IsIGlfcHJvdCwgb19wcm90KSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEVycihlKSA9PiB7CisgICAgICAgICAgICAgICAgICAgIHdhcm4hKCJmYWlsZWQgdG8gYWNjZXB0IHJlbW90ZSBjb25uZWN0aW9uIHdpdGggZXJyb3Igezo/fSIsIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEVycig6OkVycm9yOjpBcHBsaWNhdGlvbihBcHBsaWNhdGlvbkVycm9yIHsKKyAgICAgICAgICAgIGtpbmQ6IEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpVbmtub3duLAorICAgICAgICAgICAgbWVzc2FnZTogImFib3J0ZWQgbGlzdGVuIGxvb3AiLmludG8oKSwKKyAgICAgICAgfSkpCisgICAgfQorCisgICAgZm4gbmV3X3Byb3RvY29sc19mb3JfY29ubmVjdGlvbigKKyAgICAgICAgJm11dCBzZWxmLAorICAgICAgICBzdHJlYW06IFRjcFN0cmVhbSwKKyAgICApIC0+IDo6UmVzdWx0PChCb3g8VElucHV0UHJvdG9jb2wgKyBTZW5kPiwgQm94PFRPdXRwdXRQcm90b2NvbCArIFNlbmQ+KT4geworICAgICAgICAvLyBjcmVhdGUgdGhlIHNoYXJlZCB0Y3Agc3RyZWFtCisgICAgICAgIGxldCBjaGFubmVsID0gVFRjcENoYW5uZWw6OndpdGhfc3RyZWFtKHN0cmVhbSk7CisKKyAgICAgICAgLy8gc3BsaXQgaXQgaW50byB0d28gLSBvbmUgdG8gYmUgb3duZWQgYnkgdGhlCisgICAgICAgIC8vIGlucHV0IHRyYW4vcHJvdG8gYW5kIHRoZSBvdGhlciBieSB0aGUgb3V0cHV0CisgICAgICAgIGxldCAocl9jaGFuLCB3X2NoYW4pID0gY2hhbm5lbC5zcGxpdCgpPzsKKworICAgICAgICAvLyBpbnB1dCBwcm90b2NvbCBhbmQgdHJhbnNwb3J0CisgICAgICAgIGxldCByX3RyYW4gPSBzZWxmLnJfdHJhbnNfZmFjdG9yeS5jcmVhdGUoQm94OjpuZXcocl9jaGFuKSk7CisgICAgICAgIGxldCBpX3Byb3QgPSBzZWxmLmlfcHJvdG9fZmFjdG9yeS5jcmVhdGUocl90cmFuKTsKKworICAgICAgICAvLyBvdXRwdXQgcHJvdG9jb2wgYW5kIHRyYW5zcG9ydAorICAgICAgICBsZXQgd190cmFuID0gc2VsZi53X3RyYW5zX2ZhY3RvcnkuY3JlYXRlKEJveDo6bmV3KHdfY2hhbikpOworICAgICAgICBsZXQgb19wcm90ID0gc2VsZi5vX3Byb3RvX2ZhY3RvcnkuY3JlYXRlKHdfdHJhbik7CisKKyAgICAgICAgT2soKGlfcHJvdCwgb19wcm90KSkKKyAgICB9Cit9CisKK2ZuIGhhbmRsZV9pbmNvbWluZ19jb25uZWN0aW9uPFBSQz4oCisgICAgcHJvY2Vzc29yOiBBcmM8UFJDPiwKKyAgICBpX3Byb3Q6IEJveDxUSW5wdXRQcm90b2NvbD4sCisgICAgb19wcm90OiBCb3g8VE91dHB1dFByb3RvY29sPiwKKykgd2hlcmUKKyAgICBQUkM6IFRQcm9jZXNzb3IsCit7CisgICAgbGV0IG11dCBpX3Byb3QgPSBpX3Byb3Q7CisgICAgbGV0IG11dCBvX3Byb3QgPSBvX3Byb3Q7CisgICAgbG9vcCB7CisgICAgICAgIGxldCByID0gcHJvY2Vzc29yLnByb2Nlc3MoJm11dCAqaV9wcm90LCAmbXV0ICpvX3Byb3QpOworICAgICAgICBpZiBsZXQgRXJyKGUpID0gciB7CisgICAgICAgICAgICB3YXJuISgicHJvY2Vzc29yIGNvbXBsZXRlZCB3aXRoIGVycm9yOiB7Oj99IiwgZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9ycy9zcmMvdHJhbnNwb3J0L2J1ZmZlcmVkLnJzIGIvbGliL3JzL3NyYy90cmFuc3BvcnQvYnVmZmVyZWQucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdjZmVmZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ycy9zcmMvdHJhbnNwb3J0L2J1ZmZlcmVkLnJzCkBAIC0wLDAgKzEsNDgzIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzZSBzdGQ6OmNtcDsKK3VzZSBzdGQ6OmlvOwordXNlIHN0ZDo6aW86OntSZWFkLCBXcml0ZX07CisKK3VzZSBzdXBlcjo6e1RSZWFkVHJhbnNwb3J0LCBUUmVhZFRyYW5zcG9ydEZhY3RvcnksIFRXcml0ZVRyYW5zcG9ydCwgVFdyaXRlVHJhbnNwb3J0RmFjdG9yeX07CisKKy8vLyBEZWZhdWx0IGNhcGFjaXR5IG9mIHRoZSByZWFkIGJ1ZmZlciBpbiBieXRlcy4KK2NvbnN0IFJFQURfQ0FQQUNJVFk6IHVzaXplID0gNDA5NjsKKworLy8vIERlZmF1bHQgY2FwYWNpdHkgb2YgdGhlIHdyaXRlIGJ1ZmZlciBpbiBieXRlcy4uCitjb25zdCBXUklURV9DQVBBQ0lUWTogdXNpemUgPSA0MDk2OworCisvLy8gVHJhbnNwb3J0IHRoYXQgcmVhZHMgbWVzc2FnZXMgdmlhIGFuIGludGVybmFsIGJ1ZmZlci4KKy8vLworLy8vIEEgYFRCdWZmZXJlZFJlYWRUcmFuc3BvcnRgIG1haW50YWlucyBhIGZpeGVkLXNpemUgaW50ZXJuYWwgcmVhZCBidWZmZXIuCisvLy8gT24gYSBjYWxsIHRvIGBUQnVmZmVyZWRSZWFkVHJhbnNwb3J0OjpyZWFkKC4uLilgIG9uZSBmdWxsIG1lc3NhZ2UgLSBib3RoCisvLy8gZml4ZWQtbGVuZ3RoIGhlYWRlciBhbmQgYnl0ZXMgLSBpcyByZWFkIGZyb20gdGhlIHdyYXBwZWQgY2hhbm5lbCBhbmQgYnVmZmVyZWQuCisvLy8gU3Vic2VxdWVudCByZWFkIGNhbGxzIGFyZSBzZXJ2aWNlZCBmcm9tIHRoZSBpbnRlcm5hbCBidWZmZXIgdW50aWwgaXQgaXMKKy8vLyBleGhhdXN0ZWQsIGF0IHdoaWNoIHBvaW50IHRoZSBuZXh0IGZ1bGwgbWVzc2FnZSBpcyByZWFkIGZyb20gdGhlIHdyYXBwZWQKKy8vLyBjaGFubmVsLgorLy8vCisvLy8gIyBFeGFtcGxlcworLy8vCisvLy8gQ3JlYXRlIGFuZCB1c2UgYSBgVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydGAuCisvLy8KKy8vLyBgYGBub19ydW4KKy8vLyB1c2Ugc3RkOjppbzo6UmVhZDsKKy8vLyB1c2UgdGhyaWZ0Ojp0cmFuc3BvcnQ6OntUQnVmZmVyZWRSZWFkVHJhbnNwb3J0LCBUVGNwQ2hhbm5lbH07CisvLy8KKy8vLyBsZXQgbXV0IGMgPSBUVGNwQ2hhbm5lbDo6bmV3KCk7CisvLy8gYy5vcGVuKCJsb2NhbGhvc3Q6OTA5MCIpLnVud3JhcCgpOworLy8vCisvLy8gbGV0IG11dCB0ID0gVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydDo6bmV3KGMpOworLy8vCisvLy8gdC5yZWFkKCZtdXQgdmVjIVswdTg7IDFdKS51bndyYXAoKTsKKy8vLyBgYGAKKyNbZGVyaXZlKERlYnVnKV0KK3B1YiBzdHJ1Y3QgVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydDxDPgord2hlcmUKKyAgICBDOiBSZWFkLAoreworICAgIGJ1ZjogQm94PFt1OF0+LAorICAgIHBvczogdXNpemUsCisgICAgY2FwOiB1c2l6ZSwKKyAgICBjaGFuOiBDLAorfQorCitpbXBsPEM+IFRCdWZmZXJlZFJlYWRUcmFuc3BvcnQ8Qz4KK3doZXJlCisgICAgQzogUmVhZCwKK3sKKyAgICAvLy8gQ3JlYXRlIGEgYFRCdWZmZXJlZFRyYW5zcG9ydGAgd2l0aCBkZWZhdWx0LXNpemVkIGludGVybmFsIHJlYWQgYW5kCisgICAgLy8vIHdyaXRlIGJ1ZmZlcnMgdGhhdCB3cmFwcyB0aGUgZ2l2ZW4gYFRJb0NoYW5uZWxgLgorICAgIHB1YiBmbiBuZXcoY2hhbm5lbDogQykgLT4gVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydDxDPiB7CisgICAgICAgIFRCdWZmZXJlZFJlYWRUcmFuc3BvcnQ6OndpdGhfY2FwYWNpdHkoUkVBRF9DQVBBQ0lUWSwgY2hhbm5lbCkKKyAgICB9CisKKyAgICAvLy8gQ3JlYXRlIGEgYFRCdWZmZXJlZFRyYW5zcG9ydGAgd2l0aCBhbiBpbnRlcm5hbCByZWFkIGJ1ZmZlciBvZiBzaXplCisgICAgLy8vIGByZWFkX2NhcGFjaXR5YCBhbmQgYW4gaW50ZXJuYWwgd3JpdGUgYnVmZmVyIG9mIHNpemUKKyAgICAvLy8gYHdyaXRlX2NhcGFjaXR5YCB0aGF0IHdyYXBzIHRoZSBnaXZlbiBgVElvQ2hhbm5lbGAuCisgICAgcHViIGZuIHdpdGhfY2FwYWNpdHkocmVhZF9jYXBhY2l0eTogdXNpemUsIGNoYW5uZWw6IEMpIC0+IFRCdWZmZXJlZFJlYWRUcmFuc3BvcnQ8Qz4geworICAgICAgICBUQnVmZmVyZWRSZWFkVHJhbnNwb3J0IHsKKyAgICAgICAgICAgIGJ1ZjogdmVjIVswOyByZWFkX2NhcGFjaXR5XS5pbnRvX2JveGVkX3NsaWNlKCksCisgICAgICAgICAgICBwb3M6IDAsCisgICAgICAgICAgICBjYXA6IDAsCisgICAgICAgICAgICBjaGFuOiBjaGFubmVsLAorICAgICAgICB9CisgICAgfQorCisgICAgZm4gZ2V0X2J5dGVzKCZtdXQgc2VsZikgLT4gaW86OlJlc3VsdDwmW3U4XT4geworICAgICAgICBpZiBzZWxmLmNhcCAtIHNlbGYucG9zID09IDAgeworICAgICAgICAgICAgc2VsZi5wb3MgPSAwOworICAgICAgICAgICAgc2VsZi5jYXAgPSBzZWxmLmNoYW4ucmVhZCgmbXV0IHNlbGYuYnVmKT87CisgICAgICAgIH0KKworICAgICAgICBPaygmc2VsZi5idWZbc2VsZi5wb3MuLnNlbGYuY2FwXSkKKyAgICB9CisKKyAgICBmbiBjb25zdW1lKCZtdXQgc2VsZiwgY29uc3VtZWQ6IHVzaXplKSB7CisgICAgICAgIC8vIFRPRE86IHdhcyBhIGJ1ZyBoZXJlICs9IDwtLSB0ZXN0IHNvbWVob3cKKyAgICAgICAgc2VsZi5wb3MgPSBjbXA6Om1pbihzZWxmLmNhcCwgc2VsZi5wb3MgKyBjb25zdW1lZCk7CisgICAgfQorfQorCitpbXBsPEM+IFJlYWQgZm9yIFRCdWZmZXJlZFJlYWRUcmFuc3BvcnQ8Qz4KK3doZXJlCisgICAgQzogUmVhZCwKK3sKKyAgICBmbiByZWFkKCZtdXQgc2VsZiwgYnVmOiAmbXV0IFt1OF0pIC0+IGlvOjpSZXN1bHQ8dXNpemU+IHsKKyAgICAgICAgbGV0IG11dCBieXRlc19yZWFkID0gMDsKKworICAgICAgICBsb29wIHsKKyAgICAgICAgICAgIGxldCBucmVhZCA9IHsKKyAgICAgICAgICAgICAgICBsZXQgYXZhaWxfYnl0ZXMgPSBzZWxmLmdldF9ieXRlcygpPzsKKyAgICAgICAgICAgICAgICBsZXQgYXZhaWxfc3BhY2UgPSBidWYubGVuKCkgLSBieXRlc19yZWFkOworICAgICAgICAgICAgICAgIGxldCBucmVhZCA9IGNtcDo6bWluKGF2YWlsX3NwYWNlLCBhdmFpbF9ieXRlcy5sZW4oKSk7CisgICAgICAgICAgICAgICAgYnVmW2J5dGVzX3JlYWQuLihieXRlc19yZWFkICsgbnJlYWQpXS5jb3B5X2Zyb21fc2xpY2UoJmF2YWlsX2J5dGVzWy4ubnJlYWRdKTsKKyAgICAgICAgICAgICAgICBucmVhZAorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgc2VsZi5jb25zdW1lKG5yZWFkKTsKKyAgICAgICAgICAgIGJ5dGVzX3JlYWQgKz0gbnJlYWQ7CisKKyAgICAgICAgICAgIGlmIGJ5dGVzX3JlYWQgPT0gYnVmLmxlbigpIHx8IG5yZWFkID09IDAgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgT2soYnl0ZXNfcmVhZCkKKyAgICB9Cit9CisKKy8vLyBGYWN0b3J5IGZvciBjcmVhdGluZyBpbnN0YW5jZXMgb2YgYFRCdWZmZXJlZFJlYWRUcmFuc3BvcnRgLgorI1tkZXJpdmUoRGVmYXVsdCldCitwdWIgc3RydWN0IFRCdWZmZXJlZFJlYWRUcmFuc3BvcnRGYWN0b3J5OworCitpbXBsIFRCdWZmZXJlZFJlYWRUcmFuc3BvcnRGYWN0b3J5IHsKKyAgICBwdWIgZm4gbmV3KCkgLT4gVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydEZhY3RvcnkgeworICAgICAgICBUQnVmZmVyZWRSZWFkVHJhbnNwb3J0RmFjdG9yeSB7fQorICAgIH0KK30KKworaW1wbCBUUmVhZFRyYW5zcG9ydEZhY3RvcnkgZm9yIFRCdWZmZXJlZFJlYWRUcmFuc3BvcnRGYWN0b3J5IHsKKyAgICAvLy8gQ3JlYXRlIGEgYFRCdWZmZXJlZFJlYWRUcmFuc3BvcnRgLgorICAgIGZuIGNyZWF0ZSgmc2VsZiwgY2hhbm5lbDogQm94PFJlYWQgKyBTZW5kPikgLT4gQm94PFRSZWFkVHJhbnNwb3J0ICsgU2VuZD4geworICAgICAgICBCb3g6Om5ldyhUQnVmZmVyZWRSZWFkVHJhbnNwb3J0OjpuZXcoY2hhbm5lbCkpCisgICAgfQorfQorCisvLy8gVHJhbnNwb3J0IHRoYXQgd3JpdGVzIG1lc3NhZ2VzIHZpYSBhbiBpbnRlcm5hbCBidWZmZXIuCisvLy8KKy8vLyBBIGBUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydGAgbWFpbnRhaW5zIGEgZml4ZWQtc2l6ZSBpbnRlcm5hbCB3cml0ZSBidWZmZXIuCisvLy8gQWxsIHdyaXRlcyBhcmUgbWFkZSB0byB0aGlzIGJ1ZmZlciBhbmQgYXJlIHNlbnQgdG8gdGhlIHdyYXBwZWQgY2hhbm5lbCBvbmx5CisvLy8gd2hlbiBgVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnQ6OmZsdXNoKClgIGlzIGNhbGxlZC4gT24gYSBmbHVzaCBhIGZpeGVkLWxlbmd0aAorLy8vIGhlYWRlciB3aXRoIGEgY291bnQgb2YgdGhlIGJ1ZmZlcmVkIGJ5dGVzIGlzIHdyaXR0ZW4sIGZvbGxvd2VkIGJ5IHRoZSBieXRlcworLy8vIHRoZW1zZWx2ZXMuCisvLy8KKy8vLyAjIEV4YW1wbGVzCisvLy8KKy8vLyBDcmVhdGUgYW5kIHVzZSBhIGBUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydGAuCisvLy8KKy8vLyBgYGBub19ydW4KKy8vLyB1c2Ugc3RkOjppbzo6V3JpdGU7CisvLy8gdXNlIHRocmlmdDo6dHJhbnNwb3J0Ojp7VEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnQsIFRUY3BDaGFubmVsfTsKKy8vLworLy8vIGxldCBtdXQgYyA9IFRUY3BDaGFubmVsOjpuZXcoKTsKKy8vLyBjLm9wZW4oImxvY2FsaG9zdDo5MDkwIikudW53cmFwKCk7CisvLy8KKy8vLyBsZXQgbXV0IHQgPSBUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydDo6bmV3KGMpOworLy8vCisvLy8gdC53cml0ZSgmWzB4MDBdKS51bndyYXAoKTsKKy8vLyB0LmZsdXNoKCkudW53cmFwKCk7CisvLy8gYGBgCisjW2Rlcml2ZShEZWJ1ZyldCitwdWIgc3RydWN0IFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0PEM+Cit3aGVyZQorICAgIEM6IFdyaXRlLAoreworICAgIGJ1ZjogVmVjPHU4PiwKKyAgICBjYXA6IHVzaXplLAorICAgIGNoYW5uZWw6IEMsCit9CisKK2ltcGw8Qz4gVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnQ8Qz4KK3doZXJlCisgICAgQzogV3JpdGUsCit7CisgICAgLy8vIENyZWF0ZSBhIGBUQnVmZmVyZWRUcmFuc3BvcnRgIHdpdGggZGVmYXVsdC1zaXplZCBpbnRlcm5hbCByZWFkIGFuZAorICAgIC8vLyB3cml0ZSBidWZmZXJzIHRoYXQgd3JhcHMgdGhlIGdpdmVuIGBUSW9DaGFubmVsYC4KKyAgICBwdWIgZm4gbmV3KGNoYW5uZWw6IEMpIC0+IFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0PEM+IHsKKyAgICAgICAgVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnQ6OndpdGhfY2FwYWNpdHkoV1JJVEVfQ0FQQUNJVFksIGNoYW5uZWwpCisgICAgfQorCisgICAgLy8vIENyZWF0ZSBhIGBUQnVmZmVyZWRUcmFuc3BvcnRgIHdpdGggYW4gaW50ZXJuYWwgcmVhZCBidWZmZXIgb2Ygc2l6ZQorICAgIC8vLyBgcmVhZF9jYXBhY2l0eWAgYW5kIGFuIGludGVybmFsIHdyaXRlIGJ1ZmZlciBvZiBzaXplCisgICAgLy8vIGB3cml0ZV9jYXBhY2l0eWAgdGhhdCB3cmFwcyB0aGUgZ2l2ZW4gYFRJb0NoYW5uZWxgLgorICAgIHB1YiBmbiB3aXRoX2NhcGFjaXR5KHdyaXRlX2NhcGFjaXR5OiB1c2l6ZSwgY2hhbm5lbDogQykgLT4gVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnQ8Qz4geworICAgICAgICBhc3NlcnQhKAorICAgICAgICAgICAgd3JpdGVfY2FwYWNpdHkgPiAwLAorICAgICAgICAgICAgIndyaXRlIGJ1ZmZlciBzaXplIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIgorICAgICAgICApOworCisgICAgICAgIFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0IHsKKyAgICAgICAgICAgIGJ1ZjogVmVjOjp3aXRoX2NhcGFjaXR5KHdyaXRlX2NhcGFjaXR5KSwKKyAgICAgICAgICAgIGNhcDogd3JpdGVfY2FwYWNpdHksCisgICAgICAgICAgICBjaGFubmVsOiBjaGFubmVsLAorICAgICAgICB9CisgICAgfQorfQorCitpbXBsPEM+IFdyaXRlIGZvciBUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydDxDPgord2hlcmUKKyAgICBDOiBXcml0ZSwKK3sKKyAgICBmbiB3cml0ZSgmbXV0IHNlbGYsIGJ1ZjogJlt1OF0pIC0+IGlvOjpSZXN1bHQ8dXNpemU+IHsKKyAgICAgICAgaWYgIWJ1Zi5pc19lbXB0eSgpIHsKKyAgICAgICAgICAgIGxldCBtdXQgYXZhaWxfYnl0ZXM7CisKKyAgICAgICAgICAgIGxvb3AgeworICAgICAgICAgICAgICAgIGF2YWlsX2J5dGVzID0gY21wOjptaW4oYnVmLmxlbigpLCBzZWxmLmNhcCAtIHNlbGYuYnVmLmxlbigpKTsKKworICAgICAgICAgICAgICAgIGlmIGF2YWlsX2J5dGVzID09IDAgeworICAgICAgICAgICAgICAgICAgICBzZWxmLmZsdXNoKCk/OworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbGV0IGF2YWlsX2J5dGVzID0gYXZhaWxfYnl0ZXM7CisKKyAgICAgICAgICAgIHNlbGYuYnVmLmV4dGVuZF9mcm9tX3NsaWNlKCZidWZbLi5hdmFpbF9ieXRlc10pOworICAgICAgICAgICAgYXNzZXJ0IShzZWxmLmJ1Zi5sZW4oKSA8PSBzZWxmLmNhcCwgImNvcHkgb3ZlcmZsb3dlZCBidWZmZXIiKTsKKworICAgICAgICAgICAgT2soYXZhaWxfYnl0ZXMpCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBPaygwKQorICAgICAgICB9CisgICAgfQorCisgICAgZm4gZmx1c2goJm11dCBzZWxmKSAtPiBpbzo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuY2hhbm5lbC53cml0ZV9hbGwoJnNlbGYuYnVmKT87CisgICAgICAgIHNlbGYuY2hhbm5lbC5mbHVzaCgpPzsKKyAgICAgICAgc2VsZi5idWYuY2xlYXIoKTsKKyAgICAgICAgT2soKCkpCisgICAgfQorfQorCisvLy8gRmFjdG9yeSBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzIG9mIGBUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydGAuCisjW2Rlcml2ZShEZWZhdWx0KV0KK3B1YiBzdHJ1Y3QgVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnRGYWN0b3J5OworCitpbXBsIFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0RmFjdG9yeSB7CisgICAgcHViIGZuIG5ldygpIC0+IFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0RmFjdG9yeSB7CisgICAgICAgIFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0RmFjdG9yeSB7fQorICAgIH0KK30KKworaW1wbCBUV3JpdGVUcmFuc3BvcnRGYWN0b3J5IGZvciBUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydEZhY3RvcnkgeworICAgIC8vLyBDcmVhdGUgYSBgVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnRgLgorICAgIGZuIGNyZWF0ZSgmc2VsZiwgY2hhbm5lbDogQm94PFdyaXRlICsgU2VuZD4pIC0+IEJveDxUV3JpdGVUcmFuc3BvcnQgKyBTZW5kPiB7CisgICAgICAgIEJveDo6bmV3KFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0OjpuZXcoY2hhbm5lbCkpCisgICAgfQorfQorCisjW2NmZyh0ZXN0KV0KK21vZCB0ZXN0cyB7CisgICAgdXNlIHN0ZDo6aW86OntSZWFkLCBXcml0ZX07CisKKyAgICB1c2Ugc3VwZXI6Oio7CisgICAgdXNlIHRyYW5zcG9ydDo6VEJ1ZmZlckNoYW5uZWw7CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yZXR1cm5femVyb19pZl9yZWFkX2J1ZmZlcl9pc19lbXB0eSgpIHsKKyAgICAgICAgbGV0IG1lbSA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDEwLCAwKTsKKyAgICAgICAgbGV0IG11dCB0ID0gVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydDo6d2l0aF9jYXBhY2l0eSgxMCwgbWVtKTsKKworICAgICAgICBsZXQgbXV0IGIgPSB2ZWMhWzA7IDEwXTsKKyAgICAgICAgbGV0IHJlYWRfcmVzdWx0ID0gdC5yZWFkKCZtdXQgYik7CisKKyAgICAgICAgYXNzZXJ0X2VxIShyZWFkX3Jlc3VsdC51bndyYXAoKSwgMCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfcmV0dXJuX3plcm9faWZfY2FsbGVyX3JlYWRzX2ludG9femVyb19jYXBhY2l0eV9idWZmZXIoKSB7CisgICAgICAgIGxldCBtZW0gPSBUQnVmZmVyQ2hhbm5lbDo6d2l0aF9jYXBhY2l0eSgxMCwgMCk7CisgICAgICAgIGxldCBtdXQgdCA9IFRCdWZmZXJlZFJlYWRUcmFuc3BvcnQ6OndpdGhfY2FwYWNpdHkoMTAsIG1lbSk7CisKKyAgICAgICAgbGV0IHJlYWRfcmVzdWx0ID0gdC5yZWFkKCZtdXQgW10pOworCisgICAgICAgIGFzc2VydF9lcSEocmVhZF9yZXN1bHQudW53cmFwKCksIDApOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JldHVybl96ZXJvX2lmX25vdGhpbmdfbW9yZV9jYW5fYmVfcmVhZCgpIHsKKyAgICAgICAgbGV0IG1lbSA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDQsIDApOworICAgICAgICBsZXQgbXV0IHQgPSBUQnVmZmVyZWRSZWFkVHJhbnNwb3J0Ojp3aXRoX2NhcGFjaXR5KDQsIG1lbSk7CisKKyAgICAgICAgdC5jaGFuLnNldF9yZWFkYWJsZV9ieXRlcygmWzAsIDEsIDIsIDNdKTsKKworICAgICAgICAvLyByZWFkIGJ1ZmZlciBpcyBleGFjdGx5IHRoZSBzYW1lIHNpemUgYXMgYnl0ZXMgYXZhaWxhYmxlCisgICAgICAgIGxldCBtdXQgYnVmID0gdmVjIVswdTg7IDRdOworICAgICAgICBsZXQgcmVhZF9yZXN1bHQgPSB0LnJlYWQoJm11dCBidWYpOworCisgICAgICAgIC8vIHdlJ3ZlIHJlYWQgZXhhY3RseSA0IGJ5dGVzCisgICAgICAgIGFzc2VydF9lcSEocmVhZF9yZXN1bHQudW53cmFwKCksIDQpOworICAgICAgICBhc3NlcnRfZXEhKCZidWYsICZbMCwgMSwgMiwgM10pOworCisgICAgICAgIC8vIHRyeSByZWFkIGFnYWluCisgICAgICAgIGxldCBidWZfYWdhaW4gPSB2ZWMhWzB1ODsgNF07CisgICAgICAgIGxldCByZWFkX3Jlc3VsdCA9IHQucmVhZCgmbXV0IGJ1Zik7CisKKyAgICAgICAgLy8gdGhpcyB0aW1lLCAwIGJ5dGVzIGFuZCB3ZSBoYXZlbid0IGNoYW5nZWQgdGhlIGJ1ZmZlcgorICAgICAgICBhc3NlcnRfZXEhKHJlYWRfcmVzdWx0LnVud3JhcCgpLCAwKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmYnVmX2FnYWluLCAmWzAsIDAsIDAsIDBdKQorICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X2ZpbGxfdXNlcl9idWZmZXJfd2l0aF9vbmx5X2FzX21hbnlfYnl0ZXNfYXNfYXZhaWxhYmxlKCkgeworICAgICAgICBsZXQgbWVtID0gVEJ1ZmZlckNoYW5uZWw6OndpdGhfY2FwYWNpdHkoNCwgMCk7CisgICAgICAgIGxldCBtdXQgdCA9IFRCdWZmZXJlZFJlYWRUcmFuc3BvcnQ6OndpdGhfY2FwYWNpdHkoNCwgbWVtKTsKKworICAgICAgICB0LmNoYW4uc2V0X3JlYWRhYmxlX2J5dGVzKCZbMCwgMSwgMiwgM10pOworCisgICAgICAgIC8vIHJlYWQgYnVmZmVyIGlzIG11Y2ggbGFyZ2VyIHRoYW4gdGhlIGJ5dGVzIGF2YWlsYWJsZQorICAgICAgICBsZXQgbXV0IGJ1ZiA9IHZlYyFbMHU4OyA4XTsKKyAgICAgICAgbGV0IHJlYWRfcmVzdWx0ID0gdC5yZWFkKCZtdXQgYnVmKTsKKworICAgICAgICAvLyB3ZSd2ZSByZWFkIGV4YWN0bHkgNCBieXRlcworICAgICAgICBhc3NlcnRfZXEhKHJlYWRfcmVzdWx0LnVud3JhcCgpLCA0KTsKKyAgICAgICAgYXNzZXJ0X2VxISgmYnVmWy4uNF0sICZbMCwgMSwgMiwgM10pOworCisgICAgICAgIC8vIHRyeSByZWFkIGFnYWluCisgICAgICAgIGxldCByZWFkX3Jlc3VsdCA9IHQucmVhZCgmbXV0IGJ1Zls0Li5dKTsKKworICAgICAgICAvLyB0aGlzIHRpbWUsIDAgYnl0ZXMgYW5kIHdlIGhhdmVuJ3QgY2hhbmdlZCB0aGUgYnVmZmVyCisgICAgICAgIGFzc2VydF9lcSEocmVhZF9yZXN1bHQudW53cmFwKCksIDApOworICAgICAgICBhc3NlcnRfZXEhKCZidWYsICZbMCwgMSwgMiwgMywgMCwgMCwgMCwgMF0pCisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfcmVhZF9zdWNjZXNzZnVsbHkoKSB7CisgICAgICAgIC8vIHRoaXMgdGVzdCBpbnZvbHZlcyBhIGZldyBsb29wcyB3aXRoaW4gdGhlIGJ1ZmZlcmVkIHRyYW5zcG9ydAorICAgICAgICAvLyBpdHNlbGYgd2hlcmUgaXQgaGFzIHRvIGRyYWluIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCBpbiBvcmRlcgorICAgICAgICAvLyB0byBzZXJ2aWNlIGEgcmVhZAorCisgICAgICAgIC8vIHdlIGhhdmUgYSBtdWNoIHNtYWxsZXIgYnVmZmVyIHRoYW4gdGhlCisgICAgICAgIC8vIHVuZGVybHlpbmcgdHJhbnNwb3J0IGhhcyBieXRlcyBhdmFpbGFibGUKKyAgICAgICAgbGV0IG1lbSA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDEwLCAwKTsKKyAgICAgICAgbGV0IG11dCB0ID0gVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydDo6d2l0aF9jYXBhY2l0eSgyLCBtZW0pOworCisgICAgICAgIC8vIGZpbGwgdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0J3MgYnl0ZSBidWZmZXIKKyAgICAgICAgbGV0IG11dCByZWFkYWJsZV9ieXRlcyA9IFswdTg7IDEwXTsKKyAgICAgICAgZm9yIGkgaW4gMC4uMTAgeworICAgICAgICAgICAgcmVhZGFibGVfYnl0ZXNbaV0gPSBpIGFzIHU4OworICAgICAgICB9CisKKyAgICAgICAgdC5jaGFuLnNldF9yZWFkYWJsZV9ieXRlcygmcmVhZGFibGVfYnl0ZXMpOworCisgICAgICAgIC8vIHdlIGFzayB0byByZWFkIGludG8gYSBidWZmZXIgdGhhdCdzIG11Y2ggbGFyZ2VyCisgICAgICAgIC8vIHRoYW4gdGhlIG9uZSB0aGUgYnVmZmVyZWQgdHJhbnNwb3J0IGhhczsgYXMgYSByZXN1bHQKKyAgICAgICAgLy8gaXQncyBnb2luZyB0byBoYXZlIHRvIGtlZXAgYXNraW5nIHRoZSB1bmRlcmx5aW5nCisgICAgICAgIC8vIHRyYW5zcG9ydCBmb3IgbW9yZSBieXRlcworICAgICAgICBsZXQgbXV0IGJ1ZiA9IFswdTg7IDhdOworICAgICAgICBsZXQgcmVhZF9yZXN1bHQgPSB0LnJlYWQoJm11dCBidWYpOworCisgICAgICAgIC8vIHdlIHNob3VsZCBoYXZlIHJlYWQgOCBieXRlcworICAgICAgICBhc3NlcnRfZXEhKHJlYWRfcmVzdWx0LnVud3JhcCgpLCA4KTsKKyAgICAgICAgYXNzZXJ0X2VxISgmYnVmLCAmWzAsIDEsIDIsIDMsIDQsIDUsIDYsIDddKTsKKworICAgICAgICAvLyBsZXQncyBjbGVhciBvdXQgdGhlIGJ1ZmZlciBhbmQgdHJ5IHJlYWQgYWdhaW4KKyAgICAgICAgZm9yIGkgaW4gMC4uOCB7CisgICAgICAgICAgICBidWZbaV0gPSAwOworICAgICAgICB9CisgICAgICAgIGxldCByZWFkX3Jlc3VsdCA9IHQucmVhZCgmbXV0IGJ1Zik7CisKKyAgICAgICAgLy8gdGhpcyB0aW1lIHdlIHdlcmUgb25seSBhYmxlIHRvIHJlYWQgMiBieXRlcworICAgICAgICAvLyAoYWxsIHRoYXQncyByZW1haW5pbmcgZnJvbSB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQpCisgICAgICAgIC8vIGxldCdzIGFsc28gY2hlY2sgdGhhdCB0aGUgcmVtYWluaW5nIGJ5dGVzIGFyZSB1bnRvdWNoZWQKKyAgICAgICAgYXNzZXJ0X2VxIShyZWFkX3Jlc3VsdC51bndyYXAoKSwgMik7CisgICAgICAgIGFzc2VydF9lcSEoJmJ1ZlswLi4yXSwgJls4LCA5XSk7CisgICAgICAgIGFzc2VydF9lcSEoJmJ1ZlsyLi5dLCAmWzAsIDAsIDAsIDAsIDAsIDBdKTsKKworICAgICAgICAvLyB0cnkgcmVhZCBhZ2FpbiAod2Ugc2hvdWxkIGdldCAwKQorICAgICAgICAvLyBhbmQgYWxsIHRoZSBleGlzdGluZyBieXRlcyB3ZXJlIHVudG91Y2hlZAorICAgICAgICBsZXQgcmVhZF9yZXN1bHQgPSB0LnJlYWQoJm11dCBidWYpOworICAgICAgICBhc3NlcnRfZXEhKHJlYWRfcmVzdWx0LnVud3JhcCgpLCAwKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmYnVmWzAuLjJdLCAmWzgsIDldKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmYnVmWzIuLl0sICZbMCwgMCwgMCwgMCwgMCwgMF0pOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JldHVybl9lcnJvcl93aGVuX25vdGhpbmdfY2FuX2JlX3dyaXR0ZW5fdG9fdW5kZXJseWluZ19jaGFubmVsKCkgeworICAgICAgICBsZXQgbWVtID0gVEJ1ZmZlckNoYW5uZWw6OndpdGhfY2FwYWNpdHkoMCwgMCk7CisgICAgICAgIGxldCBtdXQgdCA9IFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0Ojp3aXRoX2NhcGFjaXR5KDEsIG1lbSk7CisKKyAgICAgICAgbGV0IGIgPSB2ZWMhWzA7IDEwXTsKKyAgICAgICAgbGV0IHIgPSB0LndyaXRlKCZiKTsKKworICAgICAgICAvLyBzaG91bGQgaGF2ZSB3cml0dGVuIDEgYnl0ZQorICAgICAgICBhc3NlcnRfZXEhKHIudW53cmFwKCksIDEpOworCisgICAgICAgIC8vIGxldCdzIHRyeSBhZ2Fpbi4uLgorICAgICAgICBsZXQgciA9IHQud3JpdGUoJmJbMS4uXSk7CisKKyAgICAgICAgLy8gdGhpcyB0aW1lIHdlJ2xsIGVycm9yIG91dCBiZWNhdXNlIHRoZSBhdXRvLWZsdXNoIGZhaWxlZAorICAgICAgICBhc3NlcnQhKHIuaXNfZXJyKCkpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JldHVybl96ZXJvX2lmX2NhbGxlcl9jYWxsc193cml0ZV93aXRoX2VtcHR5X2J1ZmZlcigpIHsKKyAgICAgICAgbGV0IG1lbSA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDAsIDEwKTsKKyAgICAgICAgbGV0IG11dCB0ID0gVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnQ6OndpdGhfY2FwYWNpdHkoMTAsIG1lbSk7CisKKyAgICAgICAgbGV0IHIgPSB0LndyaXRlKCZbXSk7CisgICAgICAgIGxldCBleHBlY3RlZDogW3U4OyAwXSA9IFtdOworCisgICAgICAgIGFzc2VydF9lcSEoci51bndyYXAoKSwgMCk7CisgICAgICAgIGFzc2VydF9lcV90cmFuc3BvcnRfd3JpdHRlbl9ieXRlcyEodCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X2F1dG9fZmx1c2hfaWZfd3JpdGVfYnVmZmVyX2Z1bGwoKSB7CisgICAgICAgIGxldCBtZW0gPSBUQnVmZmVyQ2hhbm5lbDo6d2l0aF9jYXBhY2l0eSgwLCA4KTsKKyAgICAgICAgbGV0IG11dCB0ID0gVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnQ6OndpdGhfY2FwYWNpdHkoNCwgbWVtKTsKKworICAgICAgICBsZXQgYjAgPSBbMHgwMCwgMHgwMSwgMHgwMiwgMHgwM107CisgICAgICAgIGxldCBiMSA9IFsweDA0LCAweDA1LCAweDA2LCAweDA3XTsKKworICAgICAgICAvLyB3cml0ZSB0aGUgZmlyc3QgNCBieXRlczsgd2UndmUgbm93IGZpbGxlZCB0aGUgdHJhbnNwb3J0J3Mgd3JpdGUgYnVmZmVyCisgICAgICAgIGxldCByID0gdC53cml0ZSgmYjApOworICAgICAgICBhc3NlcnRfZXEhKHIudW53cmFwKCksIDQpOworCisgICAgICAgIC8vIHRyeSB3cml0ZSB0aGUgbmV4dCA0IGJ5dGVzOyB0aGlzIGNhdXNlcyB0aGUgdHJhbnNwb3J0IHRvIGF1dG8tZmx1c2ggdGhlIGZpcnN0IDQgYnl0ZXMKKyAgICAgICAgbGV0IHIgPSB0LndyaXRlKCZiMSk7CisgICAgICAgIGFzc2VydF9lcSEoci51bndyYXAoKSwgNCk7CisKKyAgICAgICAgLy8gY2hlY2sgdGhhdCBpbiB3cml0aW5nIHRoZSBzZWNvbmQgNCBieXRlcyB3ZSBhdXRvLWZsdXNoZWQgdGhlIGZpcnN0IDQgYnl0ZXMKKyAgICAgICAgYXNzZXJ0X2VxX3RyYW5zcG9ydF9udW1fd3JpdHRlbl9ieXRlcyEodCwgNCk7CisgICAgICAgIGFzc2VydF9lcV90cmFuc3BvcnRfd3JpdHRlbl9ieXRlcyEodCwgYjApOworICAgICAgICB0LmNoYW5uZWwuZW1wdHlfd3JpdGVfYnVmZmVyKCk7CisKKyAgICAgICAgLy8gbm93IGZsdXNoIHRoZSB0cmFuc3BvcnQgdG8gcHVzaCB0aGUgc2Vjb25kIDQgYnl0ZXMgdG8gdGhlIHVuZGVybHlpbmcgY2hhbm5lbAorICAgICAgICBhc3NlcnQhKHQuZmx1c2goKS5pc19vaygpKTsKKworICAgICAgICAvLyBjaGVjayB0aGF0IHdlIHdyb3RlIG91dCB0aGUgc2Vjb25kIDQgYnl0ZXMKKyAgICAgICAgYXNzZXJ0X2VxX3RyYW5zcG9ydF93cml0dGVuX2J5dGVzISh0LCBiMSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfdG9faW5uZXJfdHJhbnNwb3J0X29uX2ZsdXNoKCkgeworICAgICAgICBsZXQgbWVtID0gVEJ1ZmZlckNoYW5uZWw6OndpdGhfY2FwYWNpdHkoMTAsIDEwKTsKKyAgICAgICAgbGV0IG11dCB0ID0gVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnQ6Om5ldyhtZW0pOworCisgICAgICAgIGxldCBiOiBbdTg7IDVdID0gWzAsIDEsIDIsIDMsIDRdOworICAgICAgICBhc3NlcnRfZXEhKHQud3JpdGUoJmIpLnVud3JhcCgpLCA1KTsKKyAgICAgICAgYXNzZXJ0X2VxX3RyYW5zcG9ydF9udW1fd3JpdHRlbl9ieXRlcyEodCwgMCk7CisKKyAgICAgICAgYXNzZXJ0ISh0LmZsdXNoKCkuaXNfb2soKSk7CisKKyAgICAgICAgYXNzZXJ0X2VxX3RyYW5zcG9ydF93cml0dGVuX2J5dGVzISh0LCBiKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9zdWNjZXNzZnVsbHlfYWZ0ZXJfZmx1c2goKSB7CisgICAgICAgIGxldCBtZW0gPSBUQnVmZmVyQ2hhbm5lbDo6d2l0aF9jYXBhY2l0eSgwLCA1KTsKKyAgICAgICAgbGV0IG11dCB0ID0gVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnQ6OndpdGhfY2FwYWNpdHkoNSwgbWVtKTsKKworICAgICAgICAvLyB3cml0ZSBhbmQgZmx1c2gKKyAgICAgICAgbGV0IGI6IFt1ODsgNV0gPSBbMCwgMSwgMiwgMywgNF07CisgICAgICAgIGFzc2VydF9lcSEodC53cml0ZSgmYikudW53cmFwKCksIDUpOworICAgICAgICBhc3NlcnQhKHQuZmx1c2goKS5pc19vaygpKTsKKworICAgICAgICAvLyBjaGVjayB0aGUgZmx1c2hlZCBieXRlcworICAgICAgICBhc3NlcnRfZXFfdHJhbnNwb3J0X3dyaXR0ZW5fYnl0ZXMhKHQsIGIpOworCisgICAgICAgIC8vIHJlc2V0IG91ciB1bmRlcmx5aW5nIHRyYW5zcG9ydAorICAgICAgICB0LmNoYW5uZWwuZW1wdHlfd3JpdGVfYnVmZmVyKCk7CisKKyAgICAgICAgLy8gd3JpdGUgYW5kIGZsdXNoIGFnYWluCisgICAgICAgIGFzc2VydF9lcSEodC53cml0ZSgmYikudW53cmFwKCksIDUpOworICAgICAgICBhc3NlcnQhKHQuZmx1c2goKS5pc19vaygpKTsKKworICAgICAgICAvLyBjaGVjayB0aGUgZmx1c2hlZCBieXRlcworICAgICAgICBhc3NlcnRfZXFfdHJhbnNwb3J0X3dyaXR0ZW5fYnl0ZXMhKHQsIGIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9ycy9zcmMvdHJhbnNwb3J0L2ZyYW1lZC5ycyBiL2xpYi9ycy9zcmMvdHJhbnNwb3J0L2ZyYW1lZC5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDA5MzA3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3JzL3NyYy90cmFuc3BvcnQvZnJhbWVkLnJzCkBAIC0wLDAgKzEsNDU5IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzZSBieXRlb3JkZXI6OntCaWdFbmRpYW4sIFJlYWRCeXRlc0V4dCwgV3JpdGVCeXRlc0V4dH07Cit1c2Ugc3RkOjpjbXA7Cit1c2Ugc3RkOjppbzsKK3VzZSBzdGQ6OmlvOjp7UmVhZCwgV3JpdGV9OworCit1c2Ugc3VwZXI6OntUUmVhZFRyYW5zcG9ydCwgVFJlYWRUcmFuc3BvcnRGYWN0b3J5LCBUV3JpdGVUcmFuc3BvcnQsIFRXcml0ZVRyYW5zcG9ydEZhY3Rvcnl9OworCisvLy8gRGVmYXVsdCBjYXBhY2l0eSBvZiB0aGUgcmVhZCBidWZmZXIgaW4gYnl0ZXMuCitjb25zdCBSRUFEX0NBUEFDSVRZOiB1c2l6ZSA9IDQwOTY7CisKKy8vLyBEZWZhdWx0IGNhcGFjaXR5IG9mIHRoZSB3cml0ZSBidWZmZXIgaW4gYnl0ZXMuCitjb25zdCBXUklURV9DQVBBQ0lUWTogdXNpemUgPSA0MDk2OworCisvLy8gVHJhbnNwb3J0IHRoYXQgcmVhZHMgZnJhbWVkIG1lc3NhZ2VzLgorLy8vCisvLy8gQSBgVEZyYW1lZFJlYWRUcmFuc3BvcnRgIG1haW50YWlucyBhIGZpeGVkLXNpemUgaW50ZXJuYWwgcmVhZCBidWZmZXIuCisvLy8gT24gYSBjYWxsIHRvIGBURnJhbWVkUmVhZFRyYW5zcG9ydDo6cmVhZCguLi4pYCBvbmUgZnVsbCBtZXNzYWdlIC0gYm90aAorLy8vIGZpeGVkLWxlbmd0aCBoZWFkZXIgYW5kIGJ5dGVzIC0gaXMgcmVhZCBmcm9tIHRoZSB3cmFwcGVkIGNoYW5uZWwgYW5kCisvLy8gYnVmZmVyZWQuIFN1YnNlcXVlbnQgcmVhZCBjYWxscyBhcmUgc2VydmljZWQgZnJvbSB0aGUgaW50ZXJuYWwgYnVmZmVyCisvLy8gdW50aWwgaXQgaXMgZXhoYXVzdGVkLCBhdCB3aGljaCBwb2ludCB0aGUgbmV4dCBmdWxsIG1lc3NhZ2UgaXMgcmVhZAorLy8vIGZyb20gdGhlIHdyYXBwZWQgY2hhbm5lbC4KKy8vLworLy8vICMgRXhhbXBsZXMKKy8vLworLy8vIENyZWF0ZSBhbmQgdXNlIGEgYFRGcmFtZWRSZWFkVHJhbnNwb3J0YC4KKy8vLworLy8vIGBgYG5vX3J1bgorLy8vIHVzZSBzdGQ6OmlvOjpSZWFkOworLy8vIHVzZSB0aHJpZnQ6OnRyYW5zcG9ydDo6e1RGcmFtZWRSZWFkVHJhbnNwb3J0LCBUVGNwQ2hhbm5lbH07CisvLy8KKy8vLyBsZXQgbXV0IGMgPSBUVGNwQ2hhbm5lbDo6bmV3KCk7CisvLy8gYy5vcGVuKCJsb2NhbGhvc3Q6OTA5MCIpLnVud3JhcCgpOworLy8vCisvLy8gbGV0IG11dCB0ID0gVEZyYW1lZFJlYWRUcmFuc3BvcnQ6Om5ldyhjKTsKKy8vLworLy8vIHQucmVhZCgmbXV0IHZlYyFbMHU4OyAxXSkudW53cmFwKCk7CisvLy8gYGBgCisjW2Rlcml2ZShEZWJ1ZyldCitwdWIgc3RydWN0IFRGcmFtZWRSZWFkVHJhbnNwb3J0PEM+Cit3aGVyZQorICAgIEM6IFJlYWQsCit7CisgICAgYnVmOiBWZWM8dTg+LAorICAgIHBvczogdXNpemUsCisgICAgY2FwOiB1c2l6ZSwKKyAgICBjaGFuOiBDLAorfQorCitpbXBsPEM+IFRGcmFtZWRSZWFkVHJhbnNwb3J0PEM+Cit3aGVyZQorICAgIEM6IFJlYWQsCit7CisgICAgLy8vIENyZWF0ZSBhIGBURnJhbWVkUmVhZFRyYW5zcG9ydGAgd2l0aCBhIGRlZmF1bHQtc2l6ZWQKKyAgICAvLy8gaW50ZXJuYWwgcmVhZCBidWZmZXIgdGhhdCB3cmFwcyB0aGUgZ2l2ZW4gYFRJb0NoYW5uZWxgLgorICAgIHB1YiBmbiBuZXcoY2hhbm5lbDogQykgLT4gVEZyYW1lZFJlYWRUcmFuc3BvcnQ8Qz4geworICAgICAgICBURnJhbWVkUmVhZFRyYW5zcG9ydDo6d2l0aF9jYXBhY2l0eShSRUFEX0NBUEFDSVRZLCBjaGFubmVsKQorICAgIH0KKworICAgIC8vLyBDcmVhdGUgYSBgVEZyYW1lZFRyYW5zcG9ydGAgd2l0aCBhbiBpbnRlcm5hbCByZWFkIGJ1ZmZlcgorICAgIC8vLyBvZiBzaXplIGByZWFkX2NhcGFjaXR5YCB0aGF0IHdyYXBzIHRoZSBnaXZlbiBgVElvQ2hhbm5lbGAuCisgICAgcHViIGZuIHdpdGhfY2FwYWNpdHkocmVhZF9jYXBhY2l0eTogdXNpemUsIGNoYW5uZWw6IEMpIC0+IFRGcmFtZWRSZWFkVHJhbnNwb3J0PEM+IHsKKyAgICAgICAgVEZyYW1lZFJlYWRUcmFuc3BvcnQgeworICAgICAgICAgICAgYnVmOiB2ZWMhWzA7IHJlYWRfY2FwYWNpdHldLCAvLyBGSVhNRTogZG8gSSBhY3R1YWxseSBoYXZlIHRvIGRvIHRoaXM/CisgICAgICAgICAgICBwb3M6IDAsCisgICAgICAgICAgICBjYXA6IDAsCisgICAgICAgICAgICBjaGFuOiBjaGFubmVsLAorICAgICAgICB9CisgICAgfQorfQorCitpbXBsPEM+IFJlYWQgZm9yIFRGcmFtZWRSZWFkVHJhbnNwb3J0PEM+Cit3aGVyZQorICAgIEM6IFJlYWQsCit7CisgICAgZm4gcmVhZCgmbXV0IHNlbGYsIGI6ICZtdXQgW3U4XSkgLT4gaW86OlJlc3VsdDx1c2l6ZT4geworICAgICAgICBpZiBzZWxmLmNhcCAtIHNlbGYucG9zID09IDAgeworICAgICAgICAgICAgbGV0IG1lc3NhZ2Vfc2l6ZSA9IHNlbGYuY2hhbi5yZWFkX2kzMjo6PEJpZ0VuZGlhbj4oKT8gYXMgdXNpemU7CisKKyAgICAgICAgICAgIGxldCBidWZfY2FwYWNpdHkgPSBjbXA6Om1heChtZXNzYWdlX3NpemUsIFJFQURfQ0FQQUNJVFkpOworICAgICAgICAgICAgc2VsZi5idWYucmVzaXplKGJ1Zl9jYXBhY2l0eSwgMCk7CisKKyAgICAgICAgICAgIHNlbGYuY2hhbi5yZWFkX2V4YWN0KCZtdXQgc2VsZi5idWZbLi5tZXNzYWdlX3NpemVdKT87CisgICAgICAgICAgICBzZWxmLmNhcCA9IG1lc3NhZ2Vfc2l6ZSBhcyB1c2l6ZTsKKyAgICAgICAgICAgIHNlbGYucG9zID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGxldCBucmVhZCA9IGNtcDo6bWluKGIubGVuKCksIHNlbGYuY2FwIC0gc2VsZi5wb3MpOworICAgICAgICBiWy4ubnJlYWRdLmNsb25lX2Zyb21fc2xpY2UoJnNlbGYuYnVmW3NlbGYucG9zLi5zZWxmLnBvcyArIG5yZWFkXSk7CisgICAgICAgIHNlbGYucG9zICs9IG5yZWFkOworCisgICAgICAgIE9rKG5yZWFkKQorICAgIH0KK30KKworLy8vIEZhY3RvcnkgZm9yIGNyZWF0aW5nIGluc3RhbmNlcyBvZiBgVEZyYW1lZFJlYWRUcmFuc3BvcnRgLgorI1tkZXJpdmUoRGVmYXVsdCldCitwdWIgc3RydWN0IFRGcmFtZWRSZWFkVHJhbnNwb3J0RmFjdG9yeTsKKworaW1wbCBURnJhbWVkUmVhZFRyYW5zcG9ydEZhY3RvcnkgeworICAgIHB1YiBmbiBuZXcoKSAtPiBURnJhbWVkUmVhZFRyYW5zcG9ydEZhY3RvcnkgeworICAgICAgICBURnJhbWVkUmVhZFRyYW5zcG9ydEZhY3Rvcnkge30KKyAgICB9Cit9CisKK2ltcGwgVFJlYWRUcmFuc3BvcnRGYWN0b3J5IGZvciBURnJhbWVkUmVhZFRyYW5zcG9ydEZhY3RvcnkgeworICAgIC8vLyBDcmVhdGUgYSBgVEZyYW1lZFJlYWRUcmFuc3BvcnRgLgorICAgIGZuIGNyZWF0ZSgmc2VsZiwgY2hhbm5lbDogQm94PFJlYWQgKyBTZW5kPikgLT4gQm94PFRSZWFkVHJhbnNwb3J0ICsgU2VuZD4geworICAgICAgICBCb3g6Om5ldyhURnJhbWVkUmVhZFRyYW5zcG9ydDo6bmV3KGNoYW5uZWwpKQorICAgIH0KK30KKworLy8vIFRyYW5zcG9ydCB0aGF0IHdyaXRlcyBmcmFtZWQgbWVzc2FnZXMuCisvLy8KKy8vLyBBIGBURnJhbWVkV3JpdGVUcmFuc3BvcnRgIG1haW50YWlucyBhIGZpeGVkLXNpemUgaW50ZXJuYWwgd3JpdGUgYnVmZmVyLiBBbGwKKy8vLyB3cml0ZXMgYXJlIG1hZGUgdG8gdGhpcyBidWZmZXIgYW5kIGFyZSBzZW50IHRvIHRoZSB3cmFwcGVkIGNoYW5uZWwgb25seQorLy8vIHdoZW4gYFRGcmFtZWRXcml0ZVRyYW5zcG9ydDo6Zmx1c2goKWAgaXMgY2FsbGVkLiBPbiBhIGZsdXNoIGEgZml4ZWQtbGVuZ3RoCisvLy8gaGVhZGVyIHdpdGggYSBjb3VudCBvZiB0aGUgYnVmZmVyZWQgYnl0ZXMgaXMgd3JpdHRlbiwgZm9sbG93ZWQgYnkgdGhlIGJ5dGVzCisvLy8gdGhlbXNlbHZlcy4KKy8vLworLy8vICMgRXhhbXBsZXMKKy8vLworLy8vIENyZWF0ZSBhbmQgdXNlIGEgYFRGcmFtZWRXcml0ZVRyYW5zcG9ydGAuCisvLy8KKy8vLyBgYGBub19ydW4KKy8vLyB1c2Ugc3RkOjppbzo6V3JpdGU7CisvLy8gdXNlIHRocmlmdDo6dHJhbnNwb3J0Ojp7VEZyYW1lZFdyaXRlVHJhbnNwb3J0LCBUVGNwQ2hhbm5lbH07CisvLy8KKy8vLyBsZXQgbXV0IGMgPSBUVGNwQ2hhbm5lbDo6bmV3KCk7CisvLy8gYy5vcGVuKCJsb2NhbGhvc3Q6OTA5MCIpLnVud3JhcCgpOworLy8vCisvLy8gbGV0IG11dCB0ID0gVEZyYW1lZFdyaXRlVHJhbnNwb3J0OjpuZXcoYyk7CisvLy8KKy8vLyB0LndyaXRlKCZbMHgwMF0pLnVud3JhcCgpOworLy8vIHQuZmx1c2goKS51bndyYXAoKTsKKy8vLyBgYGAKKyNbZGVyaXZlKERlYnVnKV0KK3B1YiBzdHJ1Y3QgVEZyYW1lZFdyaXRlVHJhbnNwb3J0PEM+Cit3aGVyZQorICAgIEM6IFdyaXRlLAoreworICAgIGJ1ZjogVmVjPHU4PiwKKyAgICBjaGFubmVsOiBDLAorfQorCitpbXBsPEM+IFRGcmFtZWRXcml0ZVRyYW5zcG9ydDxDPgord2hlcmUKKyAgICBDOiBXcml0ZSwKK3sKKyAgICAvLy8gQ3JlYXRlIGEgYFRGcmFtZWRXcml0ZVRyYW5zcG9ydGAgd2l0aCBkZWZhdWx0LXNpemVkIGludGVybmFsCisgICAgLy8vIHdyaXRlIGJ1ZmZlciB0aGF0IHdyYXBzIHRoZSBnaXZlbiBgVElvQ2hhbm5lbGAuCisgICAgcHViIGZuIG5ldyhjaGFubmVsOiBDKSAtPiBURnJhbWVkV3JpdGVUcmFuc3BvcnQ8Qz4geworICAgICAgICBURnJhbWVkV3JpdGVUcmFuc3BvcnQ6OndpdGhfY2FwYWNpdHkoV1JJVEVfQ0FQQUNJVFksIGNoYW5uZWwpCisgICAgfQorCisgICAgLy8vIENyZWF0ZSBhIGBURnJhbWVkV3JpdGVUcmFuc3BvcnRgIHdpdGggYW4gaW50ZXJuYWwgd3JpdGUgYnVmZmVyCisgICAgLy8vIG9mIHNpemUgYHdyaXRlX2NhcGFjaXR5YCB0aGF0IHdyYXBzIHRoZSBnaXZlbiBgVElvQ2hhbm5lbGAuCisgICAgcHViIGZuIHdpdGhfY2FwYWNpdHkod3JpdGVfY2FwYWNpdHk6IHVzaXplLCBjaGFubmVsOiBDKSAtPiBURnJhbWVkV3JpdGVUcmFuc3BvcnQ8Qz4geworICAgICAgICBURnJhbWVkV3JpdGVUcmFuc3BvcnQgeworICAgICAgICAgICAgYnVmOiBWZWM6OndpdGhfY2FwYWNpdHkod3JpdGVfY2FwYWNpdHkpLAorICAgICAgICAgICAgY2hhbm5lbCwKKyAgICAgICAgfQorICAgIH0KK30KKworaW1wbDxDPiBXcml0ZSBmb3IgVEZyYW1lZFdyaXRlVHJhbnNwb3J0PEM+Cit3aGVyZQorICAgIEM6IFdyaXRlLAoreworICAgIGZuIHdyaXRlKCZtdXQgc2VsZiwgYjogJlt1OF0pIC0+IGlvOjpSZXN1bHQ8dXNpemU+IHsKKyAgICAgICAgbGV0IGN1cnJlbnRfY2FwYWNpdHkgPSBzZWxmLmJ1Zi5jYXBhY2l0eSgpOworICAgICAgICBsZXQgYXZhaWxhYmxlX3NwYWNlID0gY3VycmVudF9jYXBhY2l0eSAtIHNlbGYuYnVmLmxlbigpOworICAgICAgICBpZiBiLmxlbigpID4gYXZhaWxhYmxlX3NwYWNlIHsKKyAgICAgICAgICAgIGxldCBhZGRpdGlvbmFsX3NwYWNlID0gY21wOjptYXgoYi5sZW4oKSAtIGF2YWlsYWJsZV9zcGFjZSwgY3VycmVudF9jYXBhY2l0eSk7CisgICAgICAgICAgICBzZWxmLmJ1Zi5yZXNlcnZlKGFkZGl0aW9uYWxfc3BhY2UpOworICAgICAgICB9CisKKyAgICAgICAgc2VsZi5idWYuZXh0ZW5kX2Zyb21fc2xpY2UoYik7CisgICAgICAgIE9rKGIubGVuKCkpCisgICAgfQorCisgICAgZm4gZmx1c2goJm11dCBzZWxmKSAtPiBpbzo6UmVzdWx0PCgpPiB7CisgICAgICAgIGxldCBtZXNzYWdlX3NpemUgPSBzZWxmLmJ1Zi5sZW4oKTsKKworICAgICAgICBpZiBsZXQgMCA9IG1lc3NhZ2Vfc2l6ZSB7CisgICAgICAgICAgICByZXR1cm4gT2soKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2VsZi5jaGFubmVsLndyaXRlX2kzMjo6PEJpZ0VuZGlhbj4obWVzc2FnZV9zaXplIGFzIGkzMik/OworICAgICAgICB9CisKKyAgICAgICAgLy8gd2lsbCBzcGluIGlmIHRoZSB1bmRlcmx5aW5nIGNoYW5uZWwgY2FuJ3QgYmUgd3JpdHRlbiB0bworICAgICAgICBsZXQgbXV0IGJ5dGVfaW5kZXggPSAwOworICAgICAgICB3aGlsZSBieXRlX2luZGV4IDwgbWVzc2FnZV9zaXplIHsKKyAgICAgICAgICAgIGxldCBud3JpdGUgPSBzZWxmLmNoYW5uZWwud3JpdGUoJnNlbGYuYnVmW2J5dGVfaW5kZXguLm1lc3NhZ2Vfc2l6ZV0pPzsKKyAgICAgICAgICAgIGJ5dGVfaW5kZXggPSBjbXA6Om1pbihieXRlX2luZGV4ICsgbndyaXRlLCBtZXNzYWdlX3NpemUpOworICAgICAgICB9CisKKyAgICAgICAgbGV0IGJ1Zl9jYXBhY2l0eSA9IGNtcDo6bWluKHNlbGYuYnVmLmNhcGFjaXR5KCksIFdSSVRFX0NBUEFDSVRZKTsKKyAgICAgICAgc2VsZi5idWYucmVzaXplKGJ1Zl9jYXBhY2l0eSwgMCk7CisgICAgICAgIHNlbGYuYnVmLmNsZWFyKCk7CisKKyAgICAgICAgc2VsZi5jaGFubmVsLmZsdXNoKCkKKyAgICB9Cit9CisKKy8vLyBGYWN0b3J5IGZvciBjcmVhdGluZyBpbnN0YW5jZXMgb2YgYFRGcmFtZWRXcml0ZVRyYW5zcG9ydGAuCisjW2Rlcml2ZShEZWZhdWx0KV0KK3B1YiBzdHJ1Y3QgVEZyYW1lZFdyaXRlVHJhbnNwb3J0RmFjdG9yeTsKKworaW1wbCBURnJhbWVkV3JpdGVUcmFuc3BvcnRGYWN0b3J5IHsKKyAgICBwdWIgZm4gbmV3KCkgLT4gVEZyYW1lZFdyaXRlVHJhbnNwb3J0RmFjdG9yeSB7CisgICAgICAgIFRGcmFtZWRXcml0ZVRyYW5zcG9ydEZhY3Rvcnkge30KKyAgICB9Cit9CisKK2ltcGwgVFdyaXRlVHJhbnNwb3J0RmFjdG9yeSBmb3IgVEZyYW1lZFdyaXRlVHJhbnNwb3J0RmFjdG9yeSB7CisgICAgLy8vIENyZWF0ZSBhIGBURnJhbWVkV3JpdGVUcmFuc3BvcnRgLgorICAgIGZuIGNyZWF0ZSgmc2VsZiwgY2hhbm5lbDogQm94PFdyaXRlICsgU2VuZD4pIC0+IEJveDxUV3JpdGVUcmFuc3BvcnQgKyBTZW5kPiB7CisgICAgICAgIEJveDo6bmV3KFRGcmFtZWRXcml0ZVRyYW5zcG9ydDo6bmV3KGNoYW5uZWwpKQorICAgIH0KK30KKworI1tjZmcodGVzdCldCittb2QgdGVzdHMgeworICAgIHVzZSBzdXBlcjo6KjsKKyAgICB1c2UgdHJhbnNwb3J0OjptZW06OlRCdWZmZXJDaGFubmVsOworCisgICAgLy8gRklYTUU6IHRlc3QgYSBmb3JjZWQgcmVzZXJ2ZQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfcmVhZF9tZXNzYWdlX3NtYWxsZXJfdGhhbl9pbml0aWFsX2J1ZmZlcl9zaXplKCkgeworICAgICAgICBsZXQgYyA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDEwLCAxMCk7CisgICAgICAgIGxldCBtdXQgdCA9IFRGcmFtZWRSZWFkVHJhbnNwb3J0Ojp3aXRoX2NhcGFjaXR5KDgsIGMpOworCisgICAgICAgIHQuY2hhbi5zZXRfcmVhZGFibGVfYnl0ZXMoJlsKKyAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDQsIC8qIG1lc3NhZ2Ugc2l6ZSAqLworICAgICAgICAgICAgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgLyogbWVzc2FnZSBib2R5ICovCisgICAgICAgIF0pOworCisgICAgICAgIGxldCBtdXQgYnVmID0gdmVjIVswOyA4XTsKKworICAgICAgICAvLyB3ZSd2ZSByZWFkIGV4YWN0bHkgNCBieXRlcworICAgICAgICBhc3NlcnRfZXEhKHQucmVhZCgmbXV0IGJ1ZikudW53cmFwKCksIDQpOworICAgICAgICBhc3NlcnRfZXEhKCZidWZbLi40XSwgJlsweDAwLCAweDAxLCAweDAyLCAweDAzXSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfcmVhZF9tZXNzYWdlX2dyZWF0ZXJfdGhhbl9pbml0aWFsX2J1ZmZlcl9zaXplKCkgeworICAgICAgICBsZXQgYyA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDEwLCAxMCk7CisgICAgICAgIGxldCBtdXQgdCA9IFRGcmFtZWRSZWFkVHJhbnNwb3J0Ojp3aXRoX2NhcGFjaXR5KDIsIGMpOworCisgICAgICAgIHQuY2hhbi5zZXRfcmVhZGFibGVfYnl0ZXMoJlsKKyAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDQsIC8qIG1lc3NhZ2Ugc2l6ZSAqLworICAgICAgICAgICAgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgLyogbWVzc2FnZSBib2R5ICovCisgICAgICAgIF0pOworCisgICAgICAgIGxldCBtdXQgYnVmID0gdmVjIVswOyA4XTsKKworICAgICAgICAvLyB3ZSd2ZSByZWFkIGV4YWN0bHkgNCBieXRlcworICAgICAgICBhc3NlcnRfZXEhKHQucmVhZCgmbXV0IGJ1ZikudW53cmFwKCksIDQpOworICAgICAgICBhc3NlcnRfZXEhKCZidWZbLi40XSwgJlsweDAwLCAweDAxLCAweDAyLCAweDAzXSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfcmVhZF9tdWx0aXBsZV9tZXNzYWdlc19pbl9zZXF1ZW5jZV9jb3JyZWN0bHkoKSB7CisgICAgICAgIGxldCBjID0gVEJ1ZmZlckNoYW5uZWw6OndpdGhfY2FwYWNpdHkoMTAsIDEwKTsKKyAgICAgICAgbGV0IG11dCB0ID0gVEZyYW1lZFJlYWRUcmFuc3BvcnQ6OndpdGhfY2FwYWNpdHkoMiwgYyk7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gMXN0IG1lc3NhZ2UKKyAgICAgICAgLy8KKworICAgICAgICB0LmNoYW4uc2V0X3JlYWRhYmxlX2J5dGVzKCZbCisgICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDA0LCAvKiBtZXNzYWdlIHNpemUgKi8KKyAgICAgICAgICAgIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIC8qIG1lc3NhZ2UgYm9keSAqLworICAgICAgICBdKTsKKworICAgICAgICBsZXQgbXV0IGJ1ZiA9IHZlYyFbMDsgOF07CisKKyAgICAgICAgLy8gd2UndmUgcmVhZCBleGFjdGx5IDQgYnl0ZXMKKyAgICAgICAgYXNzZXJ0X2VxISh0LnJlYWQoJm11dCBidWYpLnVud3JhcCgpLCA0KTsKKyAgICAgICAgYXNzZXJ0X2VxISgmYnVmLCAmWzB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdKTsKKworICAgICAgICAvLworICAgICAgICAvLyAybmQgbWVzc2FnZQorICAgICAgICAvLworCisgICAgICAgIHQuY2hhbi5zZXRfcmVhZGFibGVfYnl0ZXMoJlsKKyAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIC8qIG1lc3NhZ2Ugc2l6ZSAqLworICAgICAgICAgICAgMHgwNCwgLyogbWVzc2FnZSBib2R5ICovCisgICAgICAgIF0pOworCisgICAgICAgIGxldCBtdXQgYnVmID0gdmVjIVswOyA4XTsKKworICAgICAgICAvLyB3ZSd2ZSByZWFkIGV4YWN0bHkgMSBieXRlCisgICAgICAgIGFzc2VydF9lcSEodC5yZWFkKCZtdXQgYnVmKS51bndyYXAoKSwgMSk7CisgICAgICAgIGFzc2VydF9lcSEoJmJ1ZiwgJlsweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwXSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfbWVzc2FnZV9zbWFsbGVyX3RoYW5fYnVmZmVyX3NpemUoKSB7CisgICAgICAgIGxldCBtZW0gPSBUQnVmZmVyQ2hhbm5lbDo6d2l0aF9jYXBhY2l0eSgwLCAwKTsKKyAgICAgICAgbGV0IG11dCB0ID0gVEZyYW1lZFdyaXRlVHJhbnNwb3J0Ojp3aXRoX2NhcGFjaXR5KDIwLCBtZW0pOworCisgICAgICAgIGxldCBiID0gdmVjIVswOyAxMF07CisKKyAgICAgICAgLy8gc2hvdWxkIGhhdmUgd3JpdHRlbiAxMCBieXRlcworICAgICAgICBhc3NlcnRfZXEhKHQud3JpdGUoJmIpLnVud3JhcCgpLCAxMCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfcmV0dXJuX3plcm9faWZfY2FsbGVyX2NhbGxzX3dyaXRlX3dpdGhfZW1wdHlfYnVmZmVyKCkgeworICAgICAgICBsZXQgbWVtID0gVEJ1ZmZlckNoYW5uZWw6OndpdGhfY2FwYWNpdHkoMCwgMTApOworICAgICAgICBsZXQgbXV0IHQgPSBURnJhbWVkV3JpdGVUcmFuc3BvcnQ6OndpdGhfY2FwYWNpdHkoMTAsIG1lbSk7CisKKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDBdID0gW107CisKKyAgICAgICAgYXNzZXJ0X2VxISh0LndyaXRlKCZbXSkudW53cmFwKCksIDApOworICAgICAgICBhc3NlcnRfZXFfdHJhbnNwb3J0X3dyaXR0ZW5fYnl0ZXMhKHQsIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV90b19pbm5lcl90cmFuc3BvcnRfb25fZmx1c2goKSB7CisgICAgICAgIGxldCBtZW0gPSBUQnVmZmVyQ2hhbm5lbDo6d2l0aF9jYXBhY2l0eSgxMCwgMTApOworICAgICAgICBsZXQgbXV0IHQgPSBURnJhbWVkV3JpdGVUcmFuc3BvcnQ6Om5ldyhtZW0pOworCisgICAgICAgIGxldCBiOiBbdTg7IDVdID0gWzB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDRdOworICAgICAgICBhc3NlcnRfZXEhKHQud3JpdGUoJmIpLnVud3JhcCgpLCA1KTsKKyAgICAgICAgYXNzZXJ0X2VxX3RyYW5zcG9ydF9udW1fd3JpdHRlbl9ieXRlcyEodCwgMCk7CisKKyAgICAgICAgYXNzZXJ0ISh0LmZsdXNoKCkuaXNfb2soKSk7CisKKyAgICAgICAgbGV0IGV4cGVjdGVkX2J5dGVzID0gWworICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNSwgLyogbWVzc2FnZSBzaXplICovCisgICAgICAgICAgICAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAvKiBtZXNzYWdlIGJvZHkgKi8KKyAgICAgICAgXTsKKworICAgICAgICBhc3NlcnRfZXFfdHJhbnNwb3J0X3dyaXR0ZW5fYnl0ZXMhKHQsIGV4cGVjdGVkX2J5dGVzKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9tZXNzYWdlX2dyZWF0ZXJfdGhhbl9idWZmZXJfc2l6ZV8wMCgpIHsKKyAgICAgICAgbGV0IG1lbSA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDAsIDEwKTsKKworICAgICAgICAvLyBJTVBPUlRBTlQ6IERPICoqTk9UKiogQ0hBTkdFIFRIRSBXUklURV9DQVBBQ0lUWSBPUiBUSEUgTlVNQkVSIE9GIEJZVEVTIFRPIEJFIFdSSVRURU4hCisgICAgICAgIC8vIHRoZXNlIGxlbmd0aHMgd2VyZSBjaG9zZW4gdG8gYmUganVzdCBsb25nIGVub3VnaAorICAgICAgICAvLyB0aGF0IGRvdWJsaW5nIHRoZSBjYXBhY2l0eSBpcyBhICoqd29yc2UqKiBjaG9pY2UgdGhhbgorICAgICAgICAvLyBzaW1wbHkgcmVzaXppbmcgdGhlIGJ1ZmZlciB0byBiLmxlbigpCisKKyAgICAgICAgbGV0IG11dCB0ID0gVEZyYW1lZFdyaXRlVHJhbnNwb3J0Ojp3aXRoX2NhcGFjaXR5KDEsIG1lbSk7CisgICAgICAgIGxldCBiID0gWzB4MDAsIDB4MDEsIDB4MDJdOworCisgICAgICAgIC8vIHNob3VsZCBoYXZlIHdyaXR0ZW4gMyBieXRlcworICAgICAgICBhc3NlcnRfZXEhKHQud3JpdGUoJmIpLnVud3JhcCgpLCAzKTsKKyAgICAgICAgYXNzZXJ0X2VxX3RyYW5zcG9ydF9udW1fd3JpdHRlbl9ieXRlcyEodCwgMCk7CisKKyAgICAgICAgYXNzZXJ0ISh0LmZsdXNoKCkuaXNfb2soKSk7CisKKyAgICAgICAgbGV0IGV4cGVjdGVkX2J5dGVzID0gWworICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMywgLyogbWVzc2FnZSBzaXplICovCisgICAgICAgICAgICAweDAwLCAweDAxLCAweDAyLCAvKiBtZXNzYWdlIGJvZHkgKi8KKyAgICAgICAgXTsKKworICAgICAgICBhc3NlcnRfZXFfdHJhbnNwb3J0X3dyaXR0ZW5fYnl0ZXMhKHQsIGV4cGVjdGVkX2J5dGVzKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9tZXNzYWdlX2dyZWF0ZXJfdGhhbl9idWZmZXJfc2l6ZV8wMSgpIHsKKyAgICAgICAgbGV0IG1lbSA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDAsIDEwKTsKKworICAgICAgICAvLyBJTVBPUlRBTlQ6IERPICoqTk9UKiogQ0hBTkdFIFRIRSBXUklURV9DQVBBQ0lUWSBPUiBUSEUgTlVNQkVSIE9GIEJZVEVTIFRPIEJFIFdSSVRURU4hCisgICAgICAgIC8vIHRoZXNlIGxlbmd0aHMgd2VyZSBjaG9zZW4gdG8gYmUganVzdCBsb25nIGVub3VnaAorICAgICAgICAvLyB0aGF0IGRvdWJsaW5nIHRoZSBjYXBhY2l0eSBpcyBhICoqYmV0dGVyKiogY2hvaWNlIHRoYW4KKyAgICAgICAgLy8gc2ltcGx5IHJlc2l6aW5nIHRoZSBidWZmZXIgdG8gYi5sZW4oKQorCisgICAgICAgIGxldCBtdXQgdCA9IFRGcmFtZWRXcml0ZVRyYW5zcG9ydDo6d2l0aF9jYXBhY2l0eSgyLCBtZW0pOworICAgICAgICBsZXQgYiA9IFsweDAwLCAweDAxLCAweDAyXTsKKworICAgICAgICAvLyBzaG91bGQgaGF2ZSB3cml0dGVuIDMgYnl0ZXMKKyAgICAgICAgYXNzZXJ0X2VxISh0LndyaXRlKCZiKS51bndyYXAoKSwgMyk7CisgICAgICAgIGFzc2VydF9lcV90cmFuc3BvcnRfbnVtX3dyaXR0ZW5fYnl0ZXMhKHQsIDApOworCisgICAgICAgIGFzc2VydCEodC5mbHVzaCgpLmlzX29rKCkpOworCisgICAgICAgIGxldCBleHBlY3RlZF9ieXRlcyA9IFsKKyAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDMsIC8qIG1lc3NhZ2Ugc2l6ZSAqLworICAgICAgICAgICAgMHgwMCwgMHgwMSwgMHgwMiwgLyogbWVzc2FnZSBib2R5ICovCisgICAgICAgIF07CisKKyAgICAgICAgYXNzZXJ0X2VxX3RyYW5zcG9ydF93cml0dGVuX2J5dGVzISh0LCBleHBlY3RlZF9ieXRlcyk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfcmV0dXJuX2Vycm9yX2lmX25vdGhpbmdfY2FuX2JlX3dyaXR0ZW5fdG9faW5uZXJfdHJhbnNwb3J0X29uX2ZsdXNoKCkgeworICAgICAgICBsZXQgbWVtID0gVEJ1ZmZlckNoYW5uZWw6OndpdGhfY2FwYWNpdHkoMCwgMCk7CisgICAgICAgIGxldCBtdXQgdCA9IFRGcmFtZWRXcml0ZVRyYW5zcG9ydDo6d2l0aF9jYXBhY2l0eSgxLCBtZW0pOworCisgICAgICAgIGxldCBiID0gdmVjIVswOyAxMF07CisKKyAgICAgICAgLy8gc2hvdWxkIGhhdmUgd3JpdHRlbiAxMCBieXRlcworICAgICAgICBhc3NlcnRfZXEhKHQud3JpdGUoJmIpLnVud3JhcCgpLCAxMCk7CisKKyAgICAgICAgLy8gbGV0J3MgZmx1c2gKKyAgICAgICAgbGV0IHIgPSB0LmZsdXNoKCk7CisKKyAgICAgICAgLy8gdGhpcyB0aW1lIHdlJ2xsIGVycm9yIG91dCBiZWNhdXNlIHRoZSBmbHVzaCBjYW4ndCB3cml0ZSB0byB0aGUgdW5kZXJseWluZyBjaGFubmVsCisgICAgICAgIGFzc2VydCEoci5pc19lcnIoKSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfc3VjY2Vzc2Z1bGx5X2FmdGVyX2ZsdXNoKCkgeworICAgICAgICAvLyBJTVBPUlRBTlQ6IHdyaXRlIGNhcGFjaXR5ICpNVVNUKiBiZSBncmVhdGVyCisgICAgICAgIC8vIHRoYW4gbWVzc2FnZSBzaXplcyB1c2VkIGluIHRoaXMgdGVzdCArIDQtYnl0ZSBmcmFtZSBoZWFkZXIKKyAgICAgICAgbGV0IG1lbSA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDAsIDEwKTsKKyAgICAgICAgbGV0IG11dCB0ID0gVEZyYW1lZFdyaXRlVHJhbnNwb3J0Ojp3aXRoX2NhcGFjaXR5KDUsIG1lbSk7CisKKyAgICAgICAgLy8gd3JpdGUgYW5kIGZsdXNoCisgICAgICAgIGxldCBmaXJzdF9tZXNzYWdlOiBbdTg7IDVdID0gWzB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDRdOworICAgICAgICBhc3NlcnRfZXEhKHQud3JpdGUoJmZpcnN0X21lc3NhZ2UpLnVud3JhcCgpLCA1KTsKKyAgICAgICAgYXNzZXJ0ISh0LmZsdXNoKCkuaXNfb2soKSk7CisKKyAgICAgICAgbGV0IG11dCBleHBlY3RlZCA9IFZlYzo6bmV3KCk7CisgICAgICAgIGV4cGVjdGVkLndyaXRlX2FsbCgmWzB4MDAsIDB4MDAsIDB4MDAsIDB4MDVdKS51bndyYXAoKTsgLy8gbWVzc2FnZSBzaXplCisgICAgICAgIGV4cGVjdGVkLmV4dGVuZF9mcm9tX3NsaWNlKCZmaXJzdF9tZXNzYWdlKTsKKworICAgICAgICAvLyBjaGVjayB0aGUgZmx1c2hlZCBieXRlcworICAgICAgICBhc3NlcnRfZXEhKHQuY2hhbm5lbC53cml0ZV9ieXRlcygpLCBleHBlY3RlZCk7CisKKyAgICAgICAgLy8gcmVzZXQgb3VyIHVuZGVybHlpbmcgdHJhbnNwb3J0CisgICAgICAgIHQuY2hhbm5lbC5lbXB0eV93cml0ZV9idWZmZXIoKTsKKworICAgICAgICBsZXQgc2Vjb25kX21lc3NhZ2U6IFt1ODsgM10gPSBbMHgwNSwgMHgwNiwgMHgwN107CisgICAgICAgIGFzc2VydF9lcSEodC53cml0ZSgmc2Vjb25kX21lc3NhZ2UpLnVud3JhcCgpLCAzKTsKKyAgICAgICAgYXNzZXJ0ISh0LmZsdXNoKCkuaXNfb2soKSk7CisKKyAgICAgICAgZXhwZWN0ZWQuY2xlYXIoKTsKKyAgICAgICAgZXhwZWN0ZWQud3JpdGVfYWxsKCZbMHgwMCwgMHgwMCwgMHgwMCwgMHgwM10pLnVud3JhcCgpOyAvLyBtZXNzYWdlIHNpemUKKyAgICAgICAgZXhwZWN0ZWQuZXh0ZW5kX2Zyb21fc2xpY2UoJnNlY29uZF9tZXNzYWdlKTsKKworICAgICAgICAvLyBjaGVjayB0aGUgZmx1c2hlZCBieXRlcworICAgICAgICBhc3NlcnRfZXEhKHQuY2hhbm5lbC53cml0ZV9ieXRlcygpLCBleHBlY3RlZCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3JzL3NyYy90cmFuc3BvcnQvbWVtLnJzIGIvbGliL3JzL3NyYy90cmFuc3BvcnQvbWVtLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyYzRiNTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcnMvc3JjL3RyYW5zcG9ydC9tZW0ucnMKQEAgLTAsMCArMSwzODUgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNlIHN0ZDo6Y21wOwordXNlIHN0ZDo6aW87Cit1c2Ugc3RkOjpzeW5jOjp7QXJjLCBNdXRleH07CisKK3VzZSBzdXBlcjo6e1JlYWRIYWxmLCBUSW9DaGFubmVsLCBXcml0ZUhhbGZ9OworCisvLy8gSW4tbWVtb3J5IHJlYWQgYW5kIHdyaXRlIGNoYW5uZWwgd2l0aCBmaXhlZC1zaXplIHJlYWQgYW5kIHdyaXRlIGJ1ZmZlcnMuCisvLy8KKy8vLyBPbiBhIGB3cml0ZWAgYnl0ZXMgYXJlIHdyaXR0ZW4gdG8gdGhlIGludGVybmFsIHdyaXRlIGJ1ZmZlci4gV3JpdGVzIGFyZSBubworLy8vIGxvbmdlciBhY2NlcHRlZCBvbmNlIHRoaXMgYnVmZmVyIGlzIGZ1bGwuIENhbGxlcnMgbXVzdCBgZW1wdHlfd3JpdGVfYnVmZmVyKClgCisvLy8gYmVmb3JlIHN1YnNlcXVlbnQgd3JpdGVzIGFyZSBhY2NlcHRlZC4KKy8vLworLy8vIFlvdSBjYW4gc2V0IHJlYWRhYmxlIGJ5dGVzIGluIHRoZSBpbnRlcm5hbCByZWFkIGJ1ZmZlciBieSBmaWxsaW5nIGl0IHdpdGgKKy8vLyBgc2V0X3JlYWRhYmxlX2J5dGVzKC4uLilgLiBDYWxsZXJzIGNhbiB0aGVuIHJlYWQgdW50aWwgdGhlIGJ1ZmZlciBpcworLy8vIGRlcGxldGVkLiBObyBmdXJ0aGVyIHJlYWRzIGFyZSBhY2NlcHRlZCB1bnRpbCB0aGUgaW50ZXJuYWwgcmVhZCBidWZmZXIgaXMKKy8vLyByZXBsZW5pc2hlZCBhZ2Fpbi4KKyNbZGVyaXZlKERlYnVnKV0KK3B1YiBzdHJ1Y3QgVEJ1ZmZlckNoYW5uZWwgeworICAgIHJlYWQ6IEFyYzxNdXRleDxSZWFkRGF0YT4+LAorICAgIHdyaXRlOiBBcmM8TXV0ZXg8V3JpdGVEYXRhPj4sCit9CisKKyNbZGVyaXZlKERlYnVnKV0KK3N0cnVjdCBSZWFkRGF0YSB7CisgICAgYnVmOiBCb3g8W3U4XT4sCisgICAgcG9zOiB1c2l6ZSwKKyAgICBpZHg6IHVzaXplLAorICAgIGNhcDogdXNpemUsCit9CisKKyNbZGVyaXZlKERlYnVnKV0KK3N0cnVjdCBXcml0ZURhdGEgeworICAgIGJ1ZjogQm94PFt1OF0+LAorICAgIHBvczogdXNpemUsCisgICAgY2FwOiB1c2l6ZSwKK30KKworaW1wbCBUQnVmZmVyQ2hhbm5lbCB7CisgICAgLy8vIENvbnN0cnVjdHMgYSBuZXcsIGVtcHR5IGBUQnVmZmVyQ2hhbm5lbGAgd2l0aCB0aGUgZ2l2ZW4KKyAgICAvLy8gcmVhZCBidWZmZXIgY2FwYWNpdHkgYW5kIHdyaXRlIGJ1ZmZlciBjYXBhY2l0eS4KKyAgICBwdWIgZm4gd2l0aF9jYXBhY2l0eShyZWFkX2NhcGFjaXR5OiB1c2l6ZSwgd3JpdGVfY2FwYWNpdHk6IHVzaXplKSAtPiBUQnVmZmVyQ2hhbm5lbCB7CisgICAgICAgIFRCdWZmZXJDaGFubmVsIHsKKyAgICAgICAgICAgIHJlYWQ6IEFyYzo6bmV3KE11dGV4OjpuZXcoUmVhZERhdGEgeworICAgICAgICAgICAgICAgIGJ1ZjogdmVjIVswOyByZWFkX2NhcGFjaXR5XS5pbnRvX2JveGVkX3NsaWNlKCksCisgICAgICAgICAgICAgICAgaWR4OiAwLAorICAgICAgICAgICAgICAgIHBvczogMCwKKyAgICAgICAgICAgICAgICBjYXA6IHJlYWRfY2FwYWNpdHksCisgICAgICAgICAgICB9KSksCisgICAgICAgICAgICB3cml0ZTogQXJjOjpuZXcoTXV0ZXg6Om5ldyhXcml0ZURhdGEgeworICAgICAgICAgICAgICAgIGJ1ZjogdmVjIVswOyB3cml0ZV9jYXBhY2l0eV0uaW50b19ib3hlZF9zbGljZSgpLAorICAgICAgICAgICAgICAgIHBvczogMCwKKyAgICAgICAgICAgICAgICBjYXA6IHdyaXRlX2NhcGFjaXR5LAorICAgICAgICAgICAgfSkpLAorICAgICAgICB9CisgICAgfQorCisgICAgLy8vIFJldHVybiBhIGNvcHkgb2YgdGhlIGJ5dGVzIGhlbGQgYnkgdGhlIGludGVybmFsIHJlYWQgYnVmZmVyLgorICAgIC8vLyBSZXR1cm5zIGFuIGVtcHR5IHZlY3RvciBpZiBubyByZWFkYWJsZSBieXRlcyBhcmUgcHJlc2VudC4KKyAgICBwdWIgZm4gcmVhZF9ieXRlcygmc2VsZikgLT4gVmVjPHU4PiB7CisgICAgICAgIGxldCByZGF0YSA9IHNlbGYucmVhZC5hc19yZWYoKS5sb2NrKCkudW53cmFwKCk7CisgICAgICAgIGxldCBtdXQgYnVmID0gdmVjIVswdTg7IHJkYXRhLmlkeF07CisgICAgICAgIGJ1Zi5jb3B5X2Zyb21fc2xpY2UoJnJkYXRhLmJ1ZlsuLnJkYXRhLmlkeF0pOworICAgICAgICBidWYKKyAgICB9CisKKyAgICAvLyBGSVhNRTogZG8gSSByZWFsbHkgbmVlZCB0aGlzIEFQSSBjYWxsPworICAgIC8vIEZJWE1FOiBzaG91bGQgdGhpcyBzaW1wbHkgcmVzZXQgdG8gdGhlIGxhc3Qgc2V0IG9mIHJlYWRhYmxlIGJ5dGVzPworICAgIC8vLyBSZXNldCB0aGUgbnVtYmVyIG9mIHJlYWRhYmxlIGJ5dGVzIHRvIHplcm8uCisgICAgLy8vCisgICAgLy8vIFN1YnNlcXVlbnQgY2FsbHMgdG8gYHJlYWRgIHdpbGwgcmV0dXJuIG5vdGhpbmcuCisgICAgcHViIGZuIGVtcHR5X3JlYWRfYnVmZmVyKCZtdXQgc2VsZikgeworICAgICAgICBsZXQgbXV0IHJkYXRhID0gc2VsZi5yZWFkLmFzX3JlZigpLmxvY2soKS51bndyYXAoKTsKKyAgICAgICAgcmRhdGEucG9zID0gMDsKKyAgICAgICAgcmRhdGEuaWR4ID0gMDsKKyAgICB9CisKKyAgICAvLy8gQ29weSBieXRlcyBmcm9tIHRoZSBzb3VyY2UgYnVmZmVyIGBidWZgIGludG8gdGhlIGludGVybmFsIHJlYWQgYnVmZmVyLAorICAgIC8vLyBvdmVyd3JpdGluZyBhbnkgZXhpc3RpbmcgYnl0ZXMuIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBjb3BpZWQsCisgICAgLy8vIHdoaWNoIGlzIGBtaW4oYnVmLmxlbigpLCBpbnRlcm5hbF9yZWFkX2J1Zi5sZW4oKSlgLgorICAgIHB1YiBmbiBzZXRfcmVhZGFibGVfYnl0ZXMoJm11dCBzZWxmLCBidWY6ICZbdThdKSAtPiB1c2l6ZSB7CisgICAgICAgIHNlbGYuZW1wdHlfcmVhZF9idWZmZXIoKTsKKyAgICAgICAgbGV0IG11dCByZGF0YSA9IHNlbGYucmVhZC5hc19yZWYoKS5sb2NrKCkudW53cmFwKCk7CisgICAgICAgIGxldCBtYXhfYnl0ZXMgPSBjbXA6Om1pbihyZGF0YS5jYXAsIGJ1Zi5sZW4oKSk7CisgICAgICAgIHJkYXRhLmJ1ZlsuLm1heF9ieXRlc10uY2xvbmVfZnJvbV9zbGljZSgmYnVmWy4ubWF4X2J5dGVzXSk7CisgICAgICAgIHJkYXRhLmlkeCA9IG1heF9ieXRlczsKKyAgICAgICAgbWF4X2J5dGVzCisgICAgfQorCisgICAgLy8vIFJldHVybiBhIGNvcHkgb2YgdGhlIGJ5dGVzIGhlbGQgYnkgdGhlIGludGVybmFsIHdyaXRlIGJ1ZmZlci4KKyAgICAvLy8gUmV0dXJucyBhbiBlbXB0eSB2ZWN0b3IgaWYgbm8gYnl0ZXMgd2VyZSB3cml0dGVuLgorICAgIHB1YiBmbiB3cml0ZV9ieXRlcygmc2VsZikgLT4gVmVjPHU4PiB7CisgICAgICAgIGxldCB3ZGF0YSA9IHNlbGYud3JpdGUuYXNfcmVmKCkubG9jaygpLnVud3JhcCgpOworICAgICAgICBsZXQgbXV0IGJ1ZiA9IHZlYyFbMHU4OyB3ZGF0YS5wb3NdOworICAgICAgICBidWYuY29weV9mcm9tX3NsaWNlKCZ3ZGF0YS5idWZbLi53ZGF0YS5wb3NdKTsKKyAgICAgICAgYnVmCisgICAgfQorCisgICAgLy8vIFJlc2V0cyB0aGUgaW50ZXJuYWwgd3JpdGUgYnVmZmVyLCBtYWtpbmcgaXQgc2VlbSBsaWtlIG5vIGJ5dGVzIHdlcmUKKyAgICAvLy8gd3JpdHRlbi4gQ2FsbGluZyBgd3JpdGVfYnVmZmVyYCBhZnRlciB0aGlzIHJldHVybnMgYW4gZW1wdHkgdmVjdG9yLgorICAgIHB1YiBmbiBlbXB0eV93cml0ZV9idWZmZXIoJm11dCBzZWxmKSB7CisgICAgICAgIGxldCBtdXQgd2RhdGEgPSBzZWxmLndyaXRlLmFzX3JlZigpLmxvY2soKS51bndyYXAoKTsKKyAgICAgICAgd2RhdGEucG9zID0gMDsKKyAgICB9CisKKyAgICAvLy8gT3ZlcndyaXRlcyB0aGUgY29udGVudHMgb2YgdGhlIHJlYWQgYnVmZmVyIHdpdGggdGhlIGNvbnRlbnRzIG9mIHRoZQorICAgIC8vLyB3cml0ZSBidWZmZXIuIFRoZSB3cml0ZSBidWZmZXIgaXMgZW1wdGllZCBhZnRlciB0aGlzIG9wZXJhdGlvbi4KKyAgICBwdWIgZm4gY29weV93cml0ZV9idWZmZXJfdG9fcmVhZF9idWZmZXIoJm11dCBzZWxmKSB7CisgICAgICAgIC8vIEZJWE1FOiByZWRvIHRoaXMgZW50aXJlIG1ldGhvZAorICAgICAgICBsZXQgYnVmID0geworICAgICAgICAgICAgbGV0IHdkYXRhID0gc2VsZi53cml0ZS5hc19yZWYoKS5sb2NrKCkudW53cmFwKCk7CisgICAgICAgICAgICBsZXQgYiA9ICZ3ZGF0YS5idWZbLi53ZGF0YS5wb3NdOworICAgICAgICAgICAgbGV0IG11dCBiX3JldCA9IHZlYyFbMDsgYi5sZW4oKV07CisgICAgICAgICAgICBiX3JldC5jb3B5X2Zyb21fc2xpY2UoYik7CisgICAgICAgICAgICBiX3JldAorICAgICAgICB9OworCisgICAgICAgIGxldCBieXRlc19jb3BpZWQgPSBzZWxmLnNldF9yZWFkYWJsZV9ieXRlcygmYnVmKTsKKyAgICAgICAgYXNzZXJ0X2VxIShieXRlc19jb3BpZWQsIGJ1Zi5sZW4oKSk7CisKKyAgICAgICAgc2VsZi5lbXB0eV93cml0ZV9idWZmZXIoKTsKKyAgICB9Cit9CisKK2ltcGwgVElvQ2hhbm5lbCBmb3IgVEJ1ZmZlckNoYW5uZWwgeworICAgIGZuIHNwbGl0KHNlbGYpIC0+IDo6UmVzdWx0PChSZWFkSGFsZjxTZWxmPiwgV3JpdGVIYWxmPFNlbGY+KT4KKyAgICB3aGVyZQorICAgICAgICBTZWxmOiBTaXplZCwKKyAgICB7CisgICAgICAgIE9rKCgKKyAgICAgICAgICAgIFJlYWRIYWxmIHsKKyAgICAgICAgICAgICAgICBoYW5kbGU6IFRCdWZmZXJDaGFubmVsIHsKKyAgICAgICAgICAgICAgICAgICAgcmVhZDogc2VsZi5yZWFkLmNsb25lKCksCisgICAgICAgICAgICAgICAgICAgIHdyaXRlOiBzZWxmLndyaXRlLmNsb25lKCksCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBXcml0ZUhhbGYgeworICAgICAgICAgICAgICAgIGhhbmRsZTogVEJ1ZmZlckNoYW5uZWwgeworICAgICAgICAgICAgICAgICAgICByZWFkOiBzZWxmLnJlYWQuY2xvbmUoKSwKKyAgICAgICAgICAgICAgICAgICAgd3JpdGU6IHNlbGYud3JpdGUuY2xvbmUoKSwKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgfSwKKyAgICAgICAgKSkKKyAgICB9Cit9CisKK2ltcGwgaW86OlJlYWQgZm9yIFRCdWZmZXJDaGFubmVsIHsKKyAgICBmbiByZWFkKCZtdXQgc2VsZiwgYnVmOiAmbXV0IFt1OF0pIC0+IGlvOjpSZXN1bHQ8dXNpemU+IHsKKyAgICAgICAgbGV0IG11dCByZGF0YSA9IHNlbGYucmVhZC5hc19yZWYoKS5sb2NrKCkudW53cmFwKCk7CisgICAgICAgIGxldCBucmVhZCA9IGNtcDo6bWluKGJ1Zi5sZW4oKSwgcmRhdGEuaWR4IC0gcmRhdGEucG9zKTsKKyAgICAgICAgYnVmWy4ubnJlYWRdLmNsb25lX2Zyb21fc2xpY2UoJnJkYXRhLmJ1ZltyZGF0YS5wb3MuLnJkYXRhLnBvcyArIG5yZWFkXSk7CisgICAgICAgIHJkYXRhLnBvcyArPSBucmVhZDsKKyAgICAgICAgT2sobnJlYWQpCisgICAgfQorfQorCitpbXBsIGlvOjpXcml0ZSBmb3IgVEJ1ZmZlckNoYW5uZWwgeworICAgIGZuIHdyaXRlKCZtdXQgc2VsZiwgYnVmOiAmW3U4XSkgLT4gaW86OlJlc3VsdDx1c2l6ZT4geworICAgICAgICBsZXQgbXV0IHdkYXRhID0gc2VsZi53cml0ZS5hc19yZWYoKS5sb2NrKCkudW53cmFwKCk7CisgICAgICAgIGxldCBud3JpdGUgPSBjbXA6Om1pbihidWYubGVuKCksIHdkYXRhLmNhcCAtIHdkYXRhLnBvcyk7CisgICAgICAgIGxldCAoc3RhcnQsIGVuZCkgPSAod2RhdGEucG9zLCB3ZGF0YS5wb3MgKyBud3JpdGUpOworICAgICAgICB3ZGF0YS5idWZbc3RhcnQuLmVuZF0uY2xvbmVfZnJvbV9zbGljZSgmYnVmWy4ubndyaXRlXSk7CisgICAgICAgIHdkYXRhLnBvcyArPSBud3JpdGU7CisgICAgICAgIE9rKG53cml0ZSkKKyAgICB9CisKKyAgICBmbiBmbHVzaCgmbXV0IHNlbGYpIC0+IGlvOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgT2soKCkpIC8vIG5vdGhpbmcgdG8gZG8gb24gZmx1c2gKKyAgICB9Cit9CisKKyNbY2ZnKHRlc3QpXQorbW9kIHRlc3RzIHsKKyAgICB1c2Ugc3RkOjppbzo6e1JlYWQsIFdyaXRlfTsKKworICAgIHVzZSBzdXBlcjo6VEJ1ZmZlckNoYW5uZWw7CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9lbXB0eV93cml0ZV9idWZmZXIoKSB7CisgICAgICAgIGxldCBtdXQgdCA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDAsIDEpOworCisgICAgICAgIGxldCBieXRlc190b193cml0ZTogW3U4OyAxXSA9IFsweDAxXTsKKyAgICAgICAgbGV0IHJlc3VsdCA9IHQud3JpdGUoJmJ5dGVzX3RvX3dyaXRlKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyZXN1bHQudW53cmFwKCksIDEpOworICAgICAgICBhc3NlcnRfZXEhKCZ0LndyaXRlX2J5dGVzKCksICZieXRlc190b193cml0ZSk7CisKKyAgICAgICAgdC5lbXB0eV93cml0ZV9idWZmZXIoKTsKKyAgICAgICAgYXNzZXJ0X2VxISh0LndyaXRlX2J5dGVzKCkubGVuKCksIDApOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X2FjY2VwdF93cml0ZXNfYWZ0ZXJfYnVmZmVyX2VtcHRpZWQoKSB7CisgICAgICAgIGxldCBtdXQgdCA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDAsIDIpOworCisgICAgICAgIGxldCBieXRlc190b193cml0ZTogW3U4OyAyXSA9IFsweDAxLCAweDAyXTsKKworICAgICAgICAvLyBmaXJzdCB3cml0ZSAoYWxsIGJ5dGVzIHdyaXR0ZW4pCisgICAgICAgIGxldCByZXN1bHQgPSB0LndyaXRlKCZieXRlc190b193cml0ZSk7CisgICAgICAgIGFzc2VydF9lcSEocmVzdWx0LnVud3JhcCgpLCAyKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmdC53cml0ZV9ieXRlcygpLCAmYnl0ZXNfdG9fd3JpdGUpOworCisgICAgICAgIC8vIHRyeSB3cml0ZSBhZ2FpbiAobm90aGluZyBzaG91bGQgYmUgd3JpdHRlbikKKyAgICAgICAgbGV0IHJlc3VsdCA9IHQud3JpdGUoJmJ5dGVzX3RvX3dyaXRlKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyZXN1bHQudW53cmFwKCksIDApOworICAgICAgICBhc3NlcnRfZXEhKCZ0LndyaXRlX2J5dGVzKCksICZieXRlc190b193cml0ZSk7IC8vIHN0aWxsIHRoZSBzYW1lIGFzIGJlZm9yZQorCisgICAgICAgIC8vIG5vdyByZXNldCB0aGUgYnVmZmVyCisgICAgICAgIHQuZW1wdHlfd3JpdGVfYnVmZmVyKCk7CisgICAgICAgIGFzc2VydF9lcSEodC53cml0ZV9ieXRlcygpLmxlbigpLCAwKTsKKworICAgICAgICAvLyBub3cgdHJ5IHdyaXRlIGFnYWluIC0gdGhlIHdyaXRlIHNob3VsZCBzdWNjZWVkCisgICAgICAgIGxldCByZXN1bHQgPSB0LndyaXRlKCZieXRlc190b193cml0ZSk7CisgICAgICAgIGFzc2VydF9lcSEocmVzdWx0LnVud3JhcCgpLCAyKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmdC53cml0ZV9ieXRlcygpLCAmYnl0ZXNfdG9fd3JpdGUpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X2FjY2VwdF9tdWx0aXBsZV93cml0ZXNfdW50aWxfYnVmZmVyX2lzX2Z1bGwoKSB7CisgICAgICAgIGxldCBtdXQgdCA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDAsIDEwKTsKKworICAgICAgICAvLyBmaXJzdCB3cml0ZSAoYWxsIGJ5dGVzIHdyaXR0ZW4pCisgICAgICAgIGxldCBieXRlc190b193cml0ZV8wOiBbdTg7IDJdID0gWzB4MDEsIDB4NDFdOworICAgICAgICBsZXQgd3JpdGVfMF9yZXN1bHQgPSB0LndyaXRlKCZieXRlc190b193cml0ZV8wKTsKKyAgICAgICAgYXNzZXJ0X2VxISh3cml0ZV8wX3Jlc3VsdC51bndyYXAoKSwgMik7CisgICAgICAgIGFzc2VydF9lcSEodC53cml0ZV9ieXRlcygpLCAmYnl0ZXNfdG9fd3JpdGVfMCk7CisKKyAgICAgICAgLy8gc2Vjb25kIHdyaXRlIChhbGwgYnl0ZXMgd3JpdHRlbiwgc3RhcnRpbmcgYXQgaW5kZXggMikKKyAgICAgICAgbGV0IGJ5dGVzX3RvX3dyaXRlXzE6IFt1ODsgN10gPSBbMHgyNCwgMHg0MSwgMHgzMiwgMHgzMywgMHgxMSwgMHg5OCwgMHhBRl07CisgICAgICAgIGxldCB3cml0ZV8xX3Jlc3VsdCA9IHQud3JpdGUoJmJ5dGVzX3RvX3dyaXRlXzEpOworICAgICAgICBhc3NlcnRfZXEhKHdyaXRlXzFfcmVzdWx0LnVud3JhcCgpLCA3KTsKKyAgICAgICAgYXNzZXJ0X2VxISgmdC53cml0ZV9ieXRlcygpWzIuLl0sICZieXRlc190b193cml0ZV8xKTsKKworICAgICAgICAvLyB0aGlyZCB3cml0ZSAob25seSAxIGJ5dGUgd3JpdHRlbiAtIHRoYXQncyBhbGwgd2UgaGF2ZSBzcGFjZSBmb3IpCisgICAgICAgIGxldCBieXRlc190b193cml0ZV8yOiBbdTg7IDNdID0gWzB4QkYsIDB4REEsIDB4OThdOworICAgICAgICBsZXQgd3JpdGVfMl9yZXN1bHQgPSB0LndyaXRlKCZieXRlc190b193cml0ZV8yKTsKKyAgICAgICAgYXNzZXJ0X2VxISh3cml0ZV8yX3Jlc3VsdC51bndyYXAoKSwgMSk7CisgICAgICAgIGFzc2VydF9lcSEoJnQud3JpdGVfYnl0ZXMoKVs5Li5dLCAmYnl0ZXNfdG9fd3JpdGVfMlswLi4xXSk7IC8vIGhvdyBkb2VzIHRoaXMgc3ludGF4IHdvcms/IQorCisgICAgICAgIC8vIGZvdXJ0aCB3cml0ZSAobm8gd3JpdGVzIGFyZSBhY2NlcHRlZCkKKyAgICAgICAgbGV0IGJ5dGVzX3RvX3dyaXRlXzM6IFt1ODsgM10gPSBbMHhCRiwgMHhBQSwgMHhGRF07CisgICAgICAgIGxldCB3cml0ZV8zX3Jlc3VsdCA9IHQud3JpdGUoJmJ5dGVzX3RvX3dyaXRlXzMpOworICAgICAgICBhc3NlcnRfZXEhKHdyaXRlXzNfcmVzdWx0LnVud3JhcCgpLCAwKTsKKworICAgICAgICAvLyBjaGVjayB0aGUgZnVsbCB3cml0ZSBidWZmZXIKKyAgICAgICAgbGV0IG11dCBleHBlY3RlZDogVmVjPHU4PiA9IFZlYzo6d2l0aF9jYXBhY2l0eSgxMCk7CisgICAgICAgIGV4cGVjdGVkLmV4dGVuZF9mcm9tX3NsaWNlKCZieXRlc190b193cml0ZV8wKTsKKyAgICAgICAgZXhwZWN0ZWQuZXh0ZW5kX2Zyb21fc2xpY2UoJmJ5dGVzX3RvX3dyaXRlXzEpOworICAgICAgICBleHBlY3RlZC5leHRlbmRfZnJvbV9zbGljZSgmYnl0ZXNfdG9fd3JpdGVfMlswLi4xXSk7CisgICAgICAgIGFzc2VydF9lcSEodC53cml0ZV9ieXRlcygpLCAmZXhwZWN0ZWRbLi5dKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9lbXB0eV9yZWFkX2J1ZmZlcigpIHsKKyAgICAgICAgbGV0IG11dCB0ID0gVEJ1ZmZlckNoYW5uZWw6OndpdGhfY2FwYWNpdHkoMSwgMCk7CisKKyAgICAgICAgbGV0IGJ5dGVzX3RvX3JlYWQ6IFt1ODsgMV0gPSBbMHgwMV07CisgICAgICAgIGxldCByZXN1bHQgPSB0LnNldF9yZWFkYWJsZV9ieXRlcygmYnl0ZXNfdG9fcmVhZCk7CisgICAgICAgIGFzc2VydF9lcSEocmVzdWx0LCAxKTsKKyAgICAgICAgYXNzZXJ0X2VxISh0LnJlYWRfYnl0ZXMoKSwgJmJ5dGVzX3RvX3JlYWQpOworCisgICAgICAgIHQuZW1wdHlfcmVhZF9idWZmZXIoKTsKKyAgICAgICAgYXNzZXJ0X2VxISh0LnJlYWRfYnl0ZXMoKS5sZW4oKSwgMCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfYWxsb3dfcmVhZGFibGVfYnl0ZXNfdG9fYmVfc2V0X2FmdGVyX3JlYWRfYnVmZmVyX2VtcHRpZWQoKSB7CisgICAgICAgIGxldCBtdXQgdCA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDEsIDApOworCisgICAgICAgIGxldCBieXRlc190b19yZWFkXzA6IFt1ODsgMV0gPSBbMHgwMV07CisgICAgICAgIGxldCByZXN1bHQgPSB0LnNldF9yZWFkYWJsZV9ieXRlcygmYnl0ZXNfdG9fcmVhZF8wKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyZXN1bHQsIDEpOworICAgICAgICBhc3NlcnRfZXEhKHQucmVhZF9ieXRlcygpLCAmYnl0ZXNfdG9fcmVhZF8wKTsKKworICAgICAgICB0LmVtcHR5X3JlYWRfYnVmZmVyKCk7CisgICAgICAgIGFzc2VydF9lcSEodC5yZWFkX2J5dGVzKCkubGVuKCksIDApOworCisgICAgICAgIGxldCBieXRlc190b19yZWFkXzE6IFt1ODsgMV0gPSBbMHgwMl07CisgICAgICAgIGxldCByZXN1bHQgPSB0LnNldF9yZWFkYWJsZV9ieXRlcygmYnl0ZXNfdG9fcmVhZF8xKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyZXN1bHQsIDEpOworICAgICAgICBhc3NlcnRfZXEhKHQucmVhZF9ieXRlcygpLCAmYnl0ZXNfdG9fcmVhZF8xKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9hY2NlcHRfbXVsdGlwbGVfcmVhZHNfdW50aWxfYWxsX2J5dGVzX3JlYWQoKSB7CisgICAgICAgIGxldCBtdXQgdCA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDEwLCAwKTsKKworICAgICAgICBsZXQgcmVhZGFibGVfYnl0ZXM6IFt1ODsgMTBdID0gWzB4RkYsIDB4RUUsIDB4REQsIDB4Q0MsIDB4QkIsIDB4MDAsIDB4MUEsIDB4MkIsIDB4M0MsIDB4NERdOworCisgICAgICAgIC8vIGNoZWNrIHRoYXQgd2UncmUgYWJsZSB0byBzZXQgdGhlIGJ5dGVzIHRvIGJlIHJlYWQKKyAgICAgICAgbGV0IHJlc3VsdCA9IHQuc2V0X3JlYWRhYmxlX2J5dGVzKCZyZWFkYWJsZV9ieXRlcyk7CisgICAgICAgIGFzc2VydF9lcSEocmVzdWx0LCAxMCk7CisgICAgICAgIGFzc2VydF9lcSEodC5yZWFkX2J5dGVzKCksICZyZWFkYWJsZV9ieXRlcyk7CisKKyAgICAgICAgLy8gZmlyc3QgcmVhZAorICAgICAgICBsZXQgbXV0IHJlYWRfYnVmXzAgPSB2ZWMhWzA7IDVdOworICAgICAgICBsZXQgcmVhZF9yZXN1bHQgPSB0LnJlYWQoJm11dCByZWFkX2J1Zl8wKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyZWFkX3Jlc3VsdC51bndyYXAoKSwgNSk7CisgICAgICAgIGFzc2VydF9lcSEocmVhZF9idWZfMC5hc19zbGljZSgpLCAmKHJlYWRhYmxlX2J5dGVzWzAuLjVdKSk7CisKKyAgICAgICAgLy8gc2Vjb25kIHJlYWQKKyAgICAgICAgbGV0IG11dCByZWFkX2J1Zl8xID0gdmVjIVswOyA0XTsKKyAgICAgICAgbGV0IHJlYWRfcmVzdWx0ID0gdC5yZWFkKCZtdXQgcmVhZF9idWZfMSk7CisgICAgICAgIGFzc2VydF9lcSEocmVhZF9yZXN1bHQudW53cmFwKCksIDQpOworICAgICAgICBhc3NlcnRfZXEhKHJlYWRfYnVmXzEuYXNfc2xpY2UoKSwgJihyZWFkYWJsZV9ieXRlc1s1Li45XSkpOworCisgICAgICAgIC8vIHRoaXJkIHJlYWQgKG9ubHkgMSBieXRlIHJlbWFpbnMgdG8gYmUgcmVhZCkKKyAgICAgICAgbGV0IG11dCByZWFkX2J1Zl8yID0gdmVjIVswOyAzXTsKKyAgICAgICAgbGV0IHJlYWRfcmVzdWx0ID0gdC5yZWFkKCZtdXQgcmVhZF9idWZfMik7CisgICAgICAgIGFzc2VydF9lcSEocmVhZF9yZXN1bHQudW53cmFwKCksIDEpOworICAgICAgICByZWFkX2J1Zl8yLnRydW5jYXRlKDEpOyAvLyBGSVhNRTogZG9lcyB0aGUgY2FsbGVyIGhhdmUgdG8gZG8gdGhpcz8KKyAgICAgICAgYXNzZXJ0X2VxIShyZWFkX2J1Zl8yLmFzX3NsaWNlKCksICYocmVhZGFibGVfYnl0ZXNbOS4uXSkpOworCisgICAgICAgIC8vIGZvdXJ0aCByZWFkIChub3RoaW5nIHNob3VsZCBiZSByZWFkYWJsZSkKKyAgICAgICAgbGV0IG11dCByZWFkX2J1Zl8zID0gdmVjIVswOyAxMF07CisgICAgICAgIGxldCByZWFkX3Jlc3VsdCA9IHQucmVhZCgmbXV0IHJlYWRfYnVmXzMpOworICAgICAgICBhc3NlcnRfZXEhKHJlYWRfcmVzdWx0LnVud3JhcCgpLCAwKTsKKyAgICAgICAgcmVhZF9idWZfMy50cnVuY2F0ZSgwKTsKKworICAgICAgICAvLyBjaGVjayB0aGF0IGFsbCB0aGUgYnl0ZXMgd2UgcmVjZWl2ZWQgbWF0Y2ggdGhlIG9yaWdpbmFsIChhZ2FpbiEpCisgICAgICAgIGxldCBtdXQgYnl0ZXNfcmVhZCA9IFZlYzo6d2l0aF9jYXBhY2l0eSgxMCk7CisgICAgICAgIGJ5dGVzX3JlYWQuZXh0ZW5kX2Zyb21fc2xpY2UoJnJlYWRfYnVmXzApOworICAgICAgICBieXRlc19yZWFkLmV4dGVuZF9mcm9tX3NsaWNlKCZyZWFkX2J1Zl8xKTsKKyAgICAgICAgYnl0ZXNfcmVhZC5leHRlbmRfZnJvbV9zbGljZSgmcmVhZF9idWZfMik7CisgICAgICAgIGJ5dGVzX3JlYWQuZXh0ZW5kX2Zyb21fc2xpY2UoJnJlYWRfYnVmXzMpOworICAgICAgICBhc3NlcnRfZXEhKCZieXRlc19yZWFkLCAmcmVhZGFibGVfYnl0ZXMpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X2FsbG93X3JlYWRzX3RvX3N1Y2NlZWRfYWZ0ZXJfcmVhZF9idWZmZXJfcmVwbGVuaXNoZWQoKSB7CisgICAgICAgIGxldCBtdXQgdCA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDMsIDApOworCisgICAgICAgIGxldCByZWFkYWJsZV9ieXRlc18wOiBbdTg7IDNdID0gWzB4MDIsIDB4QUIsIDB4MzNdOworCisgICAgICAgIC8vIGNoZWNrIHRoYXQgd2UncmUgYWJsZSB0byBzZXQgdGhlIGJ5dGVzIHRvIGJlIHJlYWQKKyAgICAgICAgbGV0IHJlc3VsdCA9IHQuc2V0X3JlYWRhYmxlX2J5dGVzKCZyZWFkYWJsZV9ieXRlc18wKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyZXN1bHQsIDMpOworICAgICAgICBhc3NlcnRfZXEhKHQucmVhZF9ieXRlcygpLCAmcmVhZGFibGVfYnl0ZXNfMCk7CisKKyAgICAgICAgbGV0IG11dCByZWFkX2J1ZiA9IHZlYyFbMDsgNF07CisKKyAgICAgICAgLy8gZHJhaW4gdGhlIHJlYWQgYnVmZmVyCisgICAgICAgIGxldCByZWFkX3Jlc3VsdCA9IHQucmVhZCgmbXV0IHJlYWRfYnVmKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyZWFkX3Jlc3VsdC51bndyYXAoKSwgMyk7CisgICAgICAgIGFzc2VydF9lcSEodC5yZWFkX2J5dGVzKCksICZyZWFkX2J1ZlswLi4zXSk7CisKKyAgICAgICAgLy8gY2hlY2sgdGhhdCBhIHN1YnNlcXVlbnQgcmVhZCBmYWlscworICAgICAgICBsZXQgcmVhZF9yZXN1bHQgPSB0LnJlYWQoJm11dCByZWFkX2J1Zik7CisgICAgICAgIGFzc2VydF9lcSEocmVhZF9yZXN1bHQudW53cmFwKCksIDApOworCisgICAgICAgIC8vIHdlIGRvbid0IG1vZGlmeSB0aGUgcmVhZCBidWZmZXIgb24gZmFpbHVyZQorICAgICAgICBsZXQgbXV0IGV4cGVjdGVkX2J5dGVzID0gVmVjOjp3aXRoX2NhcGFjaXR5KDQpOworICAgICAgICBleHBlY3RlZF9ieXRlcy5leHRlbmRfZnJvbV9zbGljZSgmcmVhZGFibGVfYnl0ZXNfMCk7CisgICAgICAgIGV4cGVjdGVkX2J5dGVzLnB1c2goMHgwMCk7CisgICAgICAgIGFzc2VydF9lcSEoJnJlYWRfYnVmLCAmZXhwZWN0ZWRfYnl0ZXMpOworCisgICAgICAgIC8vIHJlcGxlbmlzaCB0aGUgcmVhZCBidWZmZXIgYWdhaW4KKyAgICAgICAgbGV0IHJlYWRhYmxlX2J5dGVzXzE6IFt1ODsgMl0gPSBbMHg5MSwgMHhBQV07CisKKyAgICAgICAgLy8gY2hlY2sgdGhhdCB3ZSdyZSBhYmxlIHRvIHNldCB0aGUgYnl0ZXMgdG8gYmUgcmVhZAorICAgICAgICBsZXQgcmVzdWx0ID0gdC5zZXRfcmVhZGFibGVfYnl0ZXMoJnJlYWRhYmxlX2J5dGVzXzEpOworICAgICAgICBhc3NlcnRfZXEhKHJlc3VsdCwgMik7CisgICAgICAgIGFzc2VydF9lcSEodC5yZWFkX2J5dGVzKCksICZyZWFkYWJsZV9ieXRlc18xKTsKKworICAgICAgICAvLyByZWFkIGFnYWluCisgICAgICAgIGxldCByZWFkX3Jlc3VsdCA9IHQucmVhZCgmbXV0IHJlYWRfYnVmKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyZWFkX3Jlc3VsdC51bndyYXAoKSwgMik7CisgICAgICAgIGFzc2VydF9lcSEodC5yZWFkX2J5dGVzKCksICZyZWFkX2J1ZlswLi4yXSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3JzL3NyYy90cmFuc3BvcnQvbW9kLnJzIGIvbGliL3JzL3NyYy90cmFuc3BvcnQvbW9kLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2MjMzNTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcnMvc3JjL3RyYW5zcG9ydC9tb2QucnMKQEAgLTAsMCArMSwyOTEgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8hIFR5cGVzIHVzZWQgdG8gc2VuZCBhbmQgcmVjZWl2ZSBieXRlcyBvdmVyIGFuIEkvTyBjaGFubmVsLgorLy8hCisvLyEgVGhlIGNvcmUgdHlwZXMgYXJlIHRoZSBgVFJlYWRUcmFuc3BvcnRgLCBgVFdyaXRlVHJhbnNwb3J0YCBhbmQgdGhlCisvLyEgYFRJb0NoYW5uZWxgIHRyYWl0cywgdGhyb3VnaCB3aGljaCBgVElucHV0UHJvdG9jb2xgIG9yCisvLyEgYFRPdXRwdXRQcm90b2NvbGAgY2FuIHJlY2VpdmUgYW5kIHNlbmQgcHJpbWl0aXZlcyBvdmVyIHRoZSB3aXJlLiBXaGlsZQorLy8hIGBUSW5wdXRQcm90b2NvbGAgYW5kIGBUT3V0cHV0UHJvdG9jb2xgIGluc3RhbmNlcyBkZWFsIHdpdGggbGFuZ3VhZ2UgcHJpbWl0aXZlcworLy8hIHRoZSB0eXBlcyBpbiB0aGlzIG1vZHVsZSB1bmRlcnN0YW5kIG9ubHkgYnl0ZXMuCisKK3VzZSBzdGQ6OmlvOwordXNlIHN0ZDo6aW86OntSZWFkLCBXcml0ZX07Cit1c2Ugc3RkOjpvcHM6OntEZXJlZiwgRGVyZWZNdXR9OworCisjW2NmZyh0ZXN0KV0KK21hY3JvX3J1bGVzISBhc3NlcnRfZXFfdHJhbnNwb3J0X251bV93cml0dGVuX2J5dGVzIHsKKyAgICAoJHRyYW5zcG9ydDppZGVudCwgJG51bV93cml0dGVuX2J5dGVzOmV4cHIpID0+IHt7CisgICAgICAgIGFzc2VydF9lcSEoJHRyYW5zcG9ydC5jaGFubmVsLndyaXRlX2J5dGVzKCkubGVuKCksICRudW1fd3JpdHRlbl9ieXRlcyk7CisgICAgfX07Cit9CisKKyNbY2ZnKHRlc3QpXQorbWFjcm9fcnVsZXMhIGFzc2VydF9lcV90cmFuc3BvcnRfd3JpdHRlbl9ieXRlcyB7CisgICAgKCR0cmFuc3BvcnQ6aWRlbnQsICRleHBlY3RlZF9ieXRlczppZGVudCkgPT4ge3sKKyAgICAgICAgYXNzZXJ0X2VxISgkdHJhbnNwb3J0LmNoYW5uZWwud3JpdGVfYnl0ZXMoKSwgJiRleHBlY3RlZF9ieXRlcyk7CisgICAgfX07Cit9CisKK21vZCBidWZmZXJlZDsKK21vZCBmcmFtZWQ7Cittb2QgbWVtOworbW9kIHNvY2tldDsKKworcHViIHVzZSBzZWxmOjpidWZmZXJlZDo6eworICAgIFRCdWZmZXJlZFJlYWRUcmFuc3BvcnQsIFRCdWZmZXJlZFJlYWRUcmFuc3BvcnRGYWN0b3J5LCBUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydCwKKyAgICBUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydEZhY3RvcnksCit9OworcHViIHVzZSBzZWxmOjpmcmFtZWQ6OnsKKyAgICBURnJhbWVkUmVhZFRyYW5zcG9ydCwgVEZyYW1lZFJlYWRUcmFuc3BvcnRGYWN0b3J5LCBURnJhbWVkV3JpdGVUcmFuc3BvcnQsCisgICAgVEZyYW1lZFdyaXRlVHJhbnNwb3J0RmFjdG9yeSwKK307CitwdWIgdXNlIHNlbGY6Om1lbTo6VEJ1ZmZlckNoYW5uZWw7CitwdWIgdXNlIHNlbGY6OnNvY2tldDo6VFRjcENoYW5uZWw7CisKKy8vLyBJZGVudGlmaWVzIGEgdHJhbnNwb3J0IHVzZWQgYnkgYSBgVElucHV0UHJvdG9jb2xgIHRvIHJlY2VpdmUgYnl0ZXMuCitwdWIgdHJhaXQgVFJlYWRUcmFuc3BvcnQ6IFJlYWQge30KKworLy8vIEhlbHBlciB0eXBlIHVzZWQgYnkgYSBzZXJ2ZXIgdG8gY3JlYXRlIGBUUmVhZFRyYW5zcG9ydGAgaW5zdGFuY2VzIGZvcgorLy8vIGFjY2VwdGVkIGNsaWVudCBjb25uZWN0aW9ucy4KK3B1YiB0cmFpdCBUUmVhZFRyYW5zcG9ydEZhY3RvcnkgeworICAgIC8vLyBDcmVhdGUgYSBgVFRyYW5zcG9ydGAgdGhhdCB3cmFwcyBhIGNoYW5uZWwgb3ZlciB3aGljaCBieXRlcyBhcmUgdG8gYmUgcmVhZC4KKyAgICBmbiBjcmVhdGUoJnNlbGYsIGNoYW5uZWw6IEJveDxSZWFkICsgU2VuZD4pIC0+IEJveDxUUmVhZFRyYW5zcG9ydCArIFNlbmQ+OworfQorCisvLy8gSWRlbnRpZmllcyBhIHRyYW5zcG9ydCB1c2VkIGJ5IGBUT3V0cHV0UHJvdG9jb2xgIHRvIHNlbmQgYnl0ZXMuCitwdWIgdHJhaXQgVFdyaXRlVHJhbnNwb3J0OiBXcml0ZSB7fQorCisvLy8gSGVscGVyIHR5cGUgdXNlZCBieSBhIHNlcnZlciB0byBjcmVhdGUgYFRXcml0ZVRyYW5zcG9ydGAgaW5zdGFuY2VzIGZvcgorLy8vIGFjY2VwdGVkIGNsaWVudCBjb25uZWN0aW9ucy4KK3B1YiB0cmFpdCBUV3JpdGVUcmFuc3BvcnRGYWN0b3J5IHsKKyAgICAvLy8gQ3JlYXRlIGEgYFRUcmFuc3BvcnRgIHRoYXQgd3JhcHMgYSBjaGFubmVsIG92ZXIgd2hpY2ggYnl0ZXMgYXJlIHRvIGJlIHNlbnQuCisgICAgZm4gY3JlYXRlKCZzZWxmLCBjaGFubmVsOiBCb3g8V3JpdGUgKyBTZW5kPikgLT4gQm94PFRXcml0ZVRyYW5zcG9ydCArIFNlbmQ+OworfQorCitpbXBsPFQ+IFRSZWFkVHJhbnNwb3J0IGZvciBUIHdoZXJlIFQ6IFJlYWQge30KKworaW1wbDxUPiBUV3JpdGVUcmFuc3BvcnQgZm9yIFQgd2hlcmUgVDogV3JpdGUge30KKworLy8gRklYTUU6IGltcGxlbWVudCB0aGUgRGVidWcgdHJhaXQgZm9yIGJveGVkIHRyYW5zcG9ydHMKKworaW1wbDxUPiBUUmVhZFRyYW5zcG9ydEZhY3RvcnkgZm9yIEJveDxUPgord2hlcmUKKyAgICBUOiBUUmVhZFRyYW5zcG9ydEZhY3RvcnkgKyA/U2l6ZWQsCit7CisgICAgZm4gY3JlYXRlKCZzZWxmLCBjaGFubmVsOiBCb3g8UmVhZCArIFNlbmQ+KSAtPiBCb3g8VFJlYWRUcmFuc3BvcnQgKyBTZW5kPiB7CisgICAgICAgICgqKnNlbGYpLmNyZWF0ZShjaGFubmVsKQorICAgIH0KK30KKworaW1wbDxUPiBUV3JpdGVUcmFuc3BvcnRGYWN0b3J5IGZvciBCb3g8VD4KK3doZXJlCisgICAgVDogVFdyaXRlVHJhbnNwb3J0RmFjdG9yeSArID9TaXplZCwKK3sKKyAgICBmbiBjcmVhdGUoJnNlbGYsIGNoYW5uZWw6IEJveDxXcml0ZSArIFNlbmQ+KSAtPiBCb3g8VFdyaXRlVHJhbnNwb3J0ICsgU2VuZD4geworICAgICAgICAoKipzZWxmKS5jcmVhdGUoY2hhbm5lbCkKKyAgICB9Cit9CisKKy8vLyBJZGVudGlmaWVzIGEgc3BsaXR0YWJsZSBiaWRpcmVjdGlvbmFsIEkvTyBjaGFubmVsIHVzZWQgdG8gc2VuZCBhbmQgcmVjZWl2ZSBieXRlcy4KK3B1YiB0cmFpdCBUSW9DaGFubmVsOiBSZWFkICsgV3JpdGUgeworICAgIC8vLyBTcGxpdCB0aGUgY2hhbm5lbCBpbnRvIGEgcmVhZGFibGUgaGFsZiBhbmQgYSB3cml0YWJsZSBoYWxmLCB3aGVyZSB0aGUKKyAgICAvLy8gcmVhZGFibGUgaGFsZiBpbXBsZW1lbnRzIGBpbzo6UmVhZGAgYW5kIHRoZSB3cml0YWJsZSBoYWxmIGltcGxlbWVudHMKKyAgICAvLy8gYGlvOjpXcml0ZWAuIFJldHVybnMgYE5vbmVgIGlmIHRoZSBjaGFubmVsIHdhcyBub3QgaW5pdGlhbGl6ZWQsIG9yIGlmIGl0CisgICAgLy8vIGNhbm5vdCBiZSBzcGxpdCBzYWZlbHkuCisgICAgLy8vCisgICAgLy8vIFJldHVybmVkIGhhbHZlcyBtYXkgc2hhcmUgdGhlIHVuZGVybHlpbmcgT1MgY2hhbm5lbCBvciBidWZmZXIgcmVzb3VyY2VzLgorICAgIC8vLyBJbXBsZW1lbnRhdGlvbnMgKipzaG91bGQgZW5zdXJlKiogdGhhdCB0aGVzZSB0d28gaGFsdmVzIGNhbiBiZSBzYWZlbHkKKyAgICAvLy8gdXNlZCBpbmRlcGVuZGVudGx5IGJ5IGNvbmN1cnJlbnQgdGhyZWFkcy4KKyAgICBmbiBzcGxpdChzZWxmKSAtPiA6OlJlc3VsdDwoOjp0cmFuc3BvcnQ6OlJlYWRIYWxmPFNlbGY+LCA6OnRyYW5zcG9ydDo6V3JpdGVIYWxmPFNlbGY+KT4KKyAgICB3aGVyZQorICAgICAgICBTZWxmOiBTaXplZDsKK30KKworLy8vIFRoZSByZWFkYWJsZSBoYWxmIG9mIGFuIG9iamVjdCByZXR1cm5lZCBmcm9tIGBUSW9DaGFubmVsOjpzcGxpdGAuCisjW2Rlcml2ZShEZWJ1ZyldCitwdWIgc3RydWN0IFJlYWRIYWxmPEM+Cit3aGVyZQorICAgIEM6IFJlYWQsCit7CisgICAgaGFuZGxlOiBDLAorfQorCisvLy8gVGhlIHdyaXRhYmxlIGhhbGYgb2YgYW4gb2JqZWN0IHJldHVybmVkIGZyb20gYFRJb0NoYW5uZWw6OnNwbGl0YC4KKyNbZGVyaXZlKERlYnVnKV0KK3B1YiBzdHJ1Y3QgV3JpdGVIYWxmPEM+Cit3aGVyZQorICAgIEM6IFdyaXRlLAoreworICAgIGhhbmRsZTogQywKK30KKworaW1wbDxDPiBSZWFkSGFsZjxDPgord2hlcmUKKyAgICBDOiBSZWFkLAoreworICAgIC8vLyBDcmVhdGUgYSBgUmVhZEhhbGZgIGFzc29jaWF0ZWQgd2l0aCByZWFkYWJsZSBgaGFuZGxlYAorICAgIHB1YiBmbiBuZXcoaGFuZGxlOiBDKSAtPiBSZWFkSGFsZjxDPiB7CisgICAgICAgIFJlYWRIYWxmIHsgaGFuZGxlIH0KKyAgICB9Cit9CisKK2ltcGw8Qz4gV3JpdGVIYWxmPEM+Cit3aGVyZQorICAgIEM6IFdyaXRlLAoreworICAgIC8vLyBDcmVhdGUgYSBgV3JpdGVIYWxmYCBhc3NvY2lhdGVkIHdpdGggd3JpdGFibGUgYGhhbmRsZWAKKyAgICBwdWIgZm4gbmV3KGhhbmRsZTogQykgLT4gV3JpdGVIYWxmPEM+IHsKKyAgICAgICAgV3JpdGVIYWxmIHsgaGFuZGxlIH0KKyAgICB9Cit9CisKK2ltcGw8Qz4gUmVhZCBmb3IgUmVhZEhhbGY8Qz4KK3doZXJlCisgICAgQzogUmVhZCwKK3sKKyAgICBmbiByZWFkKCZtdXQgc2VsZiwgYnVmOiAmbXV0IFt1OF0pIC0+IGlvOjpSZXN1bHQ8dXNpemU+IHsKKyAgICAgICAgc2VsZi5oYW5kbGUucmVhZChidWYpCisgICAgfQorfQorCitpbXBsPEM+IFdyaXRlIGZvciBXcml0ZUhhbGY8Qz4KK3doZXJlCisgICAgQzogV3JpdGUsCit7CisgICAgZm4gd3JpdGUoJm11dCBzZWxmLCBidWY6ICZbdThdKSAtPiBpbzo6UmVzdWx0PHVzaXplPiB7CisgICAgICAgIHNlbGYuaGFuZGxlLndyaXRlKGJ1ZikKKyAgICB9CisKKyAgICBmbiBmbHVzaCgmbXV0IHNlbGYpIC0+IGlvOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5oYW5kbGUuZmx1c2goKQorICAgIH0KK30KKworaW1wbDxDPiBEZXJlZiBmb3IgUmVhZEhhbGY8Qz4KK3doZXJlCisgICAgQzogUmVhZCwKK3sKKyAgICB0eXBlIFRhcmdldCA9IEM7CisKKyAgICBmbiBkZXJlZigmc2VsZikgLT4gJlNlbGY6OlRhcmdldCB7CisgICAgICAgICZzZWxmLmhhbmRsZQorICAgIH0KK30KKworaW1wbDxDPiBEZXJlZk11dCBmb3IgUmVhZEhhbGY8Qz4KK3doZXJlCisgICAgQzogUmVhZCwKK3sKKyAgICBmbiBkZXJlZl9tdXQoJm11dCBzZWxmKSAtPiAmbXV0IEMgeworICAgICAgICAmbXV0IHNlbGYuaGFuZGxlCisgICAgfQorfQorCitpbXBsPEM+IERlcmVmIGZvciBXcml0ZUhhbGY8Qz4KK3doZXJlCisgICAgQzogV3JpdGUsCit7CisgICAgdHlwZSBUYXJnZXQgPSBDOworCisgICAgZm4gZGVyZWYoJnNlbGYpIC0+ICZTZWxmOjpUYXJnZXQgeworICAgICAgICAmc2VsZi5oYW5kbGUKKyAgICB9Cit9CisKK2ltcGw8Qz4gRGVyZWZNdXQgZm9yIFdyaXRlSGFsZjxDPgord2hlcmUKKyAgICBDOiBXcml0ZSwKK3sKKyAgICBmbiBkZXJlZl9tdXQoJm11dCBzZWxmKSAtPiAmbXV0IEMgeworICAgICAgICAmbXV0IHNlbGYuaGFuZGxlCisgICAgfQorfQorCisjW2NmZyh0ZXN0KV0KK21vZCB0ZXN0cyB7CisKKyAgICB1c2Ugc3RkOjppbzo6Q3Vyc29yOworCisgICAgdXNlIHN1cGVyOjoqOworCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfY3JlYXRlX3VzYWJsZV9yZWFkX2NoYW5uZWxfZnJvbV9jb25jcmV0ZV9yZWFkX3R5cGUoKSB7CisgICAgICAgIGxldCByID0gQ3Vyc29yOjpuZXcoWzAsIDEsIDJdKTsKKyAgICAgICAgbGV0IF8gPSBUQnVmZmVyZWRSZWFkVHJhbnNwb3J0OjpuZXcocik7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfY3JlYXRlX3VzYWJsZV9yZWFkX2NoYW5uZWxfZnJvbV9ib3hlZF9yZWFkKCkgeworICAgICAgICBsZXQgcjogQm94PFJlYWQ+ID0gQm94OjpuZXcoQ3Vyc29yOjpuZXcoWzAsIDEsIDJdKSk7CisgICAgICAgIGxldCBfID0gVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydDo6bmV3KHIpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X2NyZWF0ZV91c2FibGVfd3JpdGVfY2hhbm5lbF9mcm9tX2NvbmNyZXRlX3dyaXRlX3R5cGUoKSB7CisgICAgICAgIGxldCB3ID0gdmVjIVswdTg7IDEwXTsKKyAgICAgICAgbGV0IF8gPSBUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydDo6bmV3KHcpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X2NyZWF0ZV91c2FibGVfd3JpdGVfY2hhbm5lbF9mcm9tX2JveGVkX3dyaXRlKCkgeworICAgICAgICBsZXQgdzogQm94PFdyaXRlPiA9IEJveDo6bmV3KHZlYyFbMHU4OyAxMF0pOworICAgICAgICBsZXQgXyA9IFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0OjpuZXcodyk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfY3JlYXRlX3VzYWJsZV9yZWFkX3RyYW5zcG9ydF9mcm9tX2NvbmNyZXRlX3JlYWRfdHJhbnNwb3J0KCkgeworICAgICAgICBsZXQgciA9IEN1cnNvcjo6bmV3KFswLCAxLCAyXSk7CisgICAgICAgIGxldCBtdXQgdCA9IFRCdWZmZXJlZFJlYWRUcmFuc3BvcnQ6Om5ldyhyKTsKKyAgICAgICAgdGFrZXNfcmVhZF90cmFuc3BvcnQoJm11dCB0KQorICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X2NyZWF0ZV91c2FibGVfcmVhZF90cmFuc3BvcnRfZnJvbV9ib3hlZF9yZWFkKCkgeworICAgICAgICBsZXQgciA9IEN1cnNvcjo6bmV3KFswLCAxLCAyXSk7CisgICAgICAgIGxldCBtdXQgdDogQm94PFRSZWFkVHJhbnNwb3J0PiA9IEJveDo6bmV3KFRCdWZmZXJlZFJlYWRUcmFuc3BvcnQ6Om5ldyhyKSk7CisgICAgICAgIHRha2VzX3JlYWRfdHJhbnNwb3J0KCZtdXQgdCkKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9jcmVhdGVfdXNhYmxlX3dyaXRlX3RyYW5zcG9ydF9mcm9tX2NvbmNyZXRlX3dyaXRlX3RyYW5zcG9ydCgpIHsKKyAgICAgICAgbGV0IHcgPSB2ZWMhWzB1ODsgMTBdOworICAgICAgICBsZXQgbXV0IHQgPSBUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydDo6bmV3KHcpOworICAgICAgICB0YWtlc193cml0ZV90cmFuc3BvcnQoJm11dCB0KQorICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X2NyZWF0ZV91c2FibGVfd3JpdGVfdHJhbnNwb3J0X2Zyb21fYm94ZWRfd3JpdGUoKSB7CisgICAgICAgIGxldCB3ID0gdmVjIVswdTg7IDEwXTsKKyAgICAgICAgbGV0IG11dCB0OiBCb3g8VFdyaXRlVHJhbnNwb3J0PiA9IEJveDo6bmV3KFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0OjpuZXcodykpOworICAgICAgICB0YWtlc193cml0ZV90cmFuc3BvcnQoJm11dCB0KQorICAgIH0KKworICAgIGZuIHRha2VzX3JlYWRfdHJhbnNwb3J0PFI+KHQ6ICZtdXQgUikKKyAgICB3aGVyZQorICAgICAgICBSOiBUUmVhZFRyYW5zcG9ydCwKKyAgICB7CisgICAgICAgIHQuYnl0ZXMoKTsKKyAgICB9CisKKyAgICBmbiB0YWtlc193cml0ZV90cmFuc3BvcnQ8Vz4odDogJm11dCBXKQorICAgIHdoZXJlCisgICAgICAgIFc6IFRXcml0ZVRyYW5zcG9ydCwKKyAgICB7CisgICAgICAgIHQuZmx1c2goKS51bndyYXAoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcnMvc3JjL3RyYW5zcG9ydC9zb2NrZXQucnMgYi9saWIvcnMvc3JjL3RyYW5zcG9ydC9zb2NrZXQucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJlZjY3YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ycy9zcmMvdHJhbnNwb3J0L3NvY2tldC5ycwpAQCAtMCwwICsxLDE2OCBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2Ugc3RkOjpjb252ZXJ0OjpGcm9tOwordXNlIHN0ZDo6aW87Cit1c2Ugc3RkOjppbzo6e0Vycm9yS2luZCwgUmVhZCwgV3JpdGV9OwordXNlIHN0ZDo6bmV0Ojp7U2h1dGRvd24sIFRjcFN0cmVhbX07CisKK3VzZSBzdXBlcjo6e1JlYWRIYWxmLCBUSW9DaGFubmVsLCBXcml0ZUhhbGZ9OwordXNlIHtuZXdfdHJhbnNwb3J0X2Vycm9yLCBUcmFuc3BvcnRFcnJvcktpbmR9OworCisvLy8gQmlkaXJlY3Rpb25hbCBUQ1AvSVAgY2hhbm5lbC4KKy8vLworLy8vICMgRXhhbXBsZXMKKy8vLworLy8vIENyZWF0ZSBhIGBUVGNwQ2hhbm5lbGAuCisvLy8KKy8vLyBgYGBub19ydW4KKy8vLyB1c2Ugc3RkOjppbzo6e1JlYWQsIFdyaXRlfTsKKy8vLyB1c2UgdGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUY3BDaGFubmVsOworLy8vCisvLy8gbGV0IG11dCBjID0gVFRjcENoYW5uZWw6Om5ldygpOworLy8vIGMub3BlbigibG9jYWxob3N0OjkwOTAiKS51bndyYXAoKTsKKy8vLworLy8vIGxldCBtdXQgYnVmID0gdmVjIVswdTg7IDRdOworLy8vIGMucmVhZCgmbXV0IGJ1ZikudW53cmFwKCk7CisvLy8gYy53cml0ZSgmdmVjIVswLCAxLCAyXSkudW53cmFwKCk7CisvLy8gYGBgCisvLy8KKy8vLyBDcmVhdGUgYSBgVFRjcENoYW5uZWxgIGJ5IHdyYXBwaW5nIGFuIGV4aXN0aW5nIGBUY3BTdHJlYW1gLgorLy8vCisvLy8gYGBgbm9fcnVuCisvLy8gdXNlIHN0ZDo6aW86OntSZWFkLCBXcml0ZX07CisvLy8gdXNlIHN0ZDo6bmV0OjpUY3BTdHJlYW07CisvLy8gdXNlIHRocmlmdDo6dHJhbnNwb3J0OjpUVGNwQ2hhbm5lbDsKKy8vLworLy8vIGxldCBzdHJlYW0gPSBUY3BTdHJlYW06OmNvbm5lY3QoIjEyNy4wLjAuMTo5MTg5IikudW53cmFwKCk7CisvLy8KKy8vLyAvLyBubyBuZWVkIHRvIGNhbGwgYy5vcGVuKCkgc2luY2Ugd2UndmUgYWxyZWFkeSBjb25uZWN0ZWQgYWJvdmUKKy8vLyBsZXQgbXV0IGMgPSBUVGNwQ2hhbm5lbDo6d2l0aF9zdHJlYW0oc3RyZWFtKTsKKy8vLworLy8vIGxldCBtdXQgYnVmID0gdmVjIVswdTg7IDRdOworLy8vIGMucmVhZCgmbXV0IGJ1ZikudW53cmFwKCk7CisvLy8gYy53cml0ZSgmdmVjIVswLCAxLCAyXSkudW53cmFwKCk7CisvLy8gYGBgCisjW2Rlcml2ZShEZWJ1ZywgRGVmYXVsdCldCitwdWIgc3RydWN0IFRUY3BDaGFubmVsIHsKKyAgICBzdHJlYW06IE9wdGlvbjxUY3BTdHJlYW0+LAorfQorCitpbXBsIFRUY3BDaGFubmVsIHsKKyAgICAvLy8gQ3JlYXRlIGFuIHVuaW5pdGlhbGl6ZWQgYFRUY3BDaGFubmVsYC4KKyAgICAvLy8KKyAgICAvLy8gVGhlIHJldHVybmVkIGluc3RhbmNlIG11c3QgYmUgb3BlbmVkIHVzaW5nIGBUVGNwQ2hhbm5lbDo6b3BlbiguLi4pYAorICAgIC8vLyBiZWZvcmUgaXQgY2FuIGJlIHVzZWQuCisgICAgcHViIGZuIG5ldygpIC0+IFRUY3BDaGFubmVsIHsKKyAgICAgICAgVFRjcENoYW5uZWwgeyBzdHJlYW06IE5vbmUgfQorICAgIH0KKworICAgIC8vLyBDcmVhdGUgYSBgVFRjcENoYW5uZWxgIHRoYXQgd3JhcHMgYW4gZXhpc3RpbmcgYFRjcFN0cmVhbWAuCisgICAgLy8vCisgICAgLy8vIFRoZSBwYXNzZWQtaW4gc3RyZWFtIGlzIGFzc3VtZWQgdG8gaGF2ZSBiZWVuIG9wZW5lZCBiZWZvcmUgYmVpbmcgd3JhcHBlZAorICAgIC8vLyBieSB0aGUgY3JlYXRlZCBgVFRjcENoYW5uZWxgIGluc3RhbmNlLgorICAgIHB1YiBmbiB3aXRoX3N0cmVhbShzdHJlYW06IFRjcFN0cmVhbSkgLT4gVFRjcENoYW5uZWwgeworICAgICAgICBUVGNwQ2hhbm5lbCB7CisgICAgICAgICAgICBzdHJlYW06IFNvbWUoc3RyZWFtKSwKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vLyBDb25uZWN0IHRvIGByZW1vdGVfYWRkcmVzc2AsIHdoaWNoIHNob3VsZCBoYXZlIHRoZSBmb3JtIGBob3N0OnBvcnRgLgorICAgIHB1YiBmbiBvcGVuKCZtdXQgc2VsZiwgcmVtb3RlX2FkZHJlc3M6ICZzdHIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIGlmIHNlbGYuc3RyZWFtLmlzX3NvbWUoKSB7CisgICAgICAgICAgICBFcnIobmV3X3RyYW5zcG9ydF9lcnJvcigKKyAgICAgICAgICAgICAgICBUcmFuc3BvcnRFcnJvcktpbmQ6OkFscmVhZHlPcGVuLAorICAgICAgICAgICAgICAgICJ0Y3AgY29ubmVjdGlvbiBwcmV2aW91c2x5IG9wZW5lZCIsCisgICAgICAgICAgICApKQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWF0Y2ggVGNwU3RyZWFtOjpjb25uZWN0KCZyZW1vdGVfYWRkcmVzcykgeworICAgICAgICAgICAgICAgIE9rKHMpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zdHJlYW0gPSBTb21lKHMpOworICAgICAgICAgICAgICAgICAgICBPaygoKSkKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRXJyKGUpID0+IEVycihGcm9tOjpmcm9tKGUpKSwKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vLyBTaHV0IGRvd24gdGhpcyBjaGFubmVsLgorICAgIC8vLworICAgIC8vLyBCb3RoIHNlbmQgYW5kIHJlY2VpdmUgaGFsdmVzIGFyZSBjbG9zZWQsIGFuZCB0aGlzIGluc3RhbmNlIGNhbiBubworICAgIC8vLyBsb25nZXIgYmUgdXNlZCB0byBjb21tdW5pY2F0ZSB3aXRoIGFub3RoZXIgZW5kcG9pbnQuCisgICAgcHViIGZuIGNsb3NlKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5pZl9zZXQofHN8IHMuc2h1dGRvd24oU2h1dGRvd246OkJvdGgpKQorICAgICAgICAgICAgLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICB9CisKKyAgICBmbiBpZl9zZXQ8RiwgVD4oJm11dCBzZWxmLCBtdXQgc3RyZWFtX29wZXJhdGlvbjogRikgLT4gaW86OlJlc3VsdDxUPgorICAgIHdoZXJlCisgICAgICAgIEY6IEZuTXV0KCZtdXQgVGNwU3RyZWFtKSAtPiBpbzo6UmVzdWx0PFQ+LAorICAgIHsKKyAgICAgICAgaWYgbGV0IFNvbWUocmVmIG11dCBzKSA9IHNlbGYuc3RyZWFtIHsKKyAgICAgICAgICAgIHN0cmVhbV9vcGVyYXRpb24ocykKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEVycihpbzo6RXJyb3I6Om5ldygKKyAgICAgICAgICAgICAgICBFcnJvcktpbmQ6Ok5vdENvbm5lY3RlZCwKKyAgICAgICAgICAgICAgICAidGNwIGVuZHBvaW50IG5vdCBjb25uZWN0ZWQiLAorICAgICAgICAgICAgKSkKKyAgICAgICAgfQorICAgIH0KK30KKworaW1wbCBUSW9DaGFubmVsIGZvciBUVGNwQ2hhbm5lbCB7CisgICAgZm4gc3BsaXQoc2VsZikgLT4gOjpSZXN1bHQ8KFJlYWRIYWxmPFNlbGY+LCBXcml0ZUhhbGY8U2VsZj4pPgorICAgIHdoZXJlCisgICAgICAgIFNlbGY6IFNpemVkLAorICAgIHsKKyAgICAgICAgbGV0IG11dCBzID0gc2VsZjsKKworICAgICAgICBzLnN0cmVhbQorICAgICAgICAgICAgLmFzX211dCgpCisgICAgICAgICAgICAuYW5kX3RoZW4ofHN8IHMudHJ5X2Nsb25lKCkub2soKSkKKyAgICAgICAgICAgIC5tYXAofGNsb25lZHwgeworICAgICAgICAgICAgICAgIGxldCByZWFkX2hhbGYgPSBSZWFkSGFsZjo6bmV3KFRUY3BDaGFubmVsIHsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtOiBzLnN0cmVhbS50YWtlKCksCisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgbGV0IHdyaXRlX2hhbGYgPSBXcml0ZUhhbGY6Om5ldyhUVGNwQ2hhbm5lbCB7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbTogU29tZShjbG9uZWQpLAorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIChyZWFkX2hhbGYsIHdyaXRlX2hhbGYpCisgICAgICAgICAgICB9KQorICAgICAgICAgICAgLm9rX29yX2Vsc2UofHwgeworICAgICAgICAgICAgICAgIG5ld190cmFuc3BvcnRfZXJyb3IoCisgICAgICAgICAgICAgICAgICAgIFRyYW5zcG9ydEVycm9yS2luZDo6VW5rbm93biwKKyAgICAgICAgICAgICAgICAgICAgImNhbm5vdCBjbG9uZSB1bmRlcmx5aW5nIHRjcCBzdHJlYW0iLAorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0pCisgICAgfQorfQorCitpbXBsIFJlYWQgZm9yIFRUY3BDaGFubmVsIHsKKyAgICBmbiByZWFkKCZtdXQgc2VsZiwgYjogJm11dCBbdThdKSAtPiBpbzo6UmVzdWx0PHVzaXplPiB7CisgICAgICAgIHNlbGYuaWZfc2V0KHxzfCBzLnJlYWQoYikpCisgICAgfQorfQorCitpbXBsIFdyaXRlIGZvciBUVGNwQ2hhbm5lbCB7CisgICAgZm4gd3JpdGUoJm11dCBzZWxmLCBiOiAmW3U4XSkgLT4gaW86OlJlc3VsdDx1c2l6ZT4geworICAgICAgICBzZWxmLmlmX3NldCh8c3wgcy53cml0ZShiKSkKKyAgICB9CisKKyAgICBmbiBmbHVzaCgmbXV0IHNlbGYpIC0+IGlvOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5pZl9zZXQofHN8IHMuZmx1c2goKSkKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcnMvdGVzdC9DYXJnby50b21sIGIvbGliL3JzL3Rlc3QvQ2FyZ28udG9tbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGRlYzE5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3JzL3Rlc3QvQ2FyZ28udG9tbApAQCAtMCwwICsxLDE1IEBACitbcGFja2FnZV0KK25hbWUgPSAia2l0Y2hlbi1zaW5rIgordmVyc2lvbiA9ICIwLjEuMCIKK2xpY2Vuc2UgPSAiQXBhY2hlLTIuMCIKK2F1dGhvcnMgPSBbIkFwYWNoZSBUaHJpZnQgRGV2ZWxvcGVycyA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPiJdCitwdWJsaXNoID0gZmFsc2UKKworW2RlcGVuZGVuY2llc10KK2NsYXAgPSAiPDIuMjguMCIKK29yZGVyZWQtZmxvYXQgPSAiMC4zLjAiCit0cnlfZnJvbSA9ICIwLjIuMCIKKworW2RlcGVuZGVuY2llcy50aHJpZnRdCitwYXRoID0gIi4uLyIKKwpkaWZmIC0tZ2l0IGEvbGliL3JzL3Rlc3QvTWFrZWZpbGUuYW0gYi9saWIvcnMvdGVzdC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWRkNzU2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3JzL3Rlc3QvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw1NCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK1RIUklGVCA9ICQodG9wX2J1aWxkZGlyKS9jb21waWxlci9jcHAvdGhyaWZ0CisKK3N0dWJzOiB0aHJpZnRzL0Jhc2VfT25lLnRocmlmdCB0aHJpZnRzL0Jhc2VfVHdvLnRocmlmdCB0aHJpZnRzL01pZGxheWVyLnRocmlmdCB0aHJpZnRzL1VsdGltYXRlLnRocmlmdCAkKHRvcF9idWlsZGRpcikvdGVzdC9SZWN1cnNpdmUudGhyaWZ0ICQoVEhSSUZUKQorCSQoVEhSSUZUKSAtSSAuL3RocmlmdHMgLW91dCBzcmMgLS1nZW4gcnMgdGhyaWZ0cy9CYXNlX09uZS50aHJpZnQKKwkkKFRIUklGVCkgLUkgLi90aHJpZnRzIC1vdXQgc3JjIC0tZ2VuIHJzIHRocmlmdHMvQmFzZV9Ud28udGhyaWZ0CisJJChUSFJJRlQpIC1JIC4vdGhyaWZ0cyAtb3V0IHNyYyAtLWdlbiBycyB0aHJpZnRzL01pZGxheWVyLnRocmlmdAorCSQoVEhSSUZUKSAtSSAuL3RocmlmdHMgLW91dCBzcmMgLS1nZW4gcnMgdGhyaWZ0cy9VbHRpbWF0ZS50aHJpZnQKKwkkKFRIUklGVCkgLW91dCBzcmMgLS1nZW4gcnMgJCh0b3BfYnVpbGRkaXIpL3Rlc3QvUmVjdXJzaXZlLnRocmlmdAorCitjaGVjazogc3R1YnMKKwkkKENBUkdPKSBidWlsZAorCSQoQ0FSR08pIHRlc3QKKwlbIC1kIGJpbiBdIHx8IG1rZGlyIGJpbgorCWNwIHRhcmdldC9kZWJ1Zy9raXRjaGVuX3Npbmtfc2VydmVyIGJpbi9raXRjaGVuX3Npbmtfc2VydmVyCisJY3AgdGFyZ2V0L2RlYnVnL2tpdGNoZW5fc2lua19jbGllbnQgYmluL2tpdGNoZW5fc2lua19jbGllbnQKKworY2xlYW4tbG9jYWw6CisJJChDQVJHTykgY2xlYW4KKwktJChSTSkgQ2FyZ28ubG9jaworCS0kKFJNKSBzcmMvYmFzZV9vbmUucnMKKwktJChSTSkgc3JjL2Jhc2VfdHdvLnJzCisJLSQoUk0pIHNyYy9taWRsYXllci5ycworCS0kKFJNKSBzcmMvdWx0aW1hdGUucnMKKwktJChSTSkgLXIgYmluCisKK0VYVFJBX0RJU1QgPSBcCisJQ2FyZ28udG9tbCBcCisJdGhyaWZ0cy9CYXNlX09uZS50aHJpZnQgXAorCXRocmlmdHMvQmFzZV9Ud28udGhyaWZ0IFwKKwl0aHJpZnRzL01pZGxheWVyLnRocmlmdCBcCisJdGhyaWZ0cy9VbHRpbWF0ZS50aHJpZnQgXAorCXNyYy9saWIucnMgXAorCXNyYy9iaW4va2l0Y2hlbl9zaW5rX3NlcnZlci5ycyBcCisJc3JjL2Jpbi9raXRjaGVuX3NpbmtfY2xpZW50LnJzCisKZGlmZiAtLWdpdCBhL2xpYi9ycy90ZXN0L3NyYy9iaW4va2l0Y2hlbl9zaW5rX2NsaWVudC5ycyBiL2xpYi9ycy90ZXN0L3NyYy9iaW4va2l0Y2hlbl9zaW5rX2NsaWVudC5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjk1Yzg4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3JzL3Rlc3Qvc3JjL2Jpbi9raXRjaGVuX3NpbmtfY2xpZW50LnJzCkBAIC0wLDAgKzEsMjM5IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNbbWFjcm9fdXNlXQorZXh0ZXJuIGNyYXRlIGNsYXA7CisKK2V4dGVybiBjcmF0ZSBraXRjaGVuX3Npbms7CitleHRlcm4gY3JhdGUgdGhyaWZ0OworCit1c2Ugc3RkOjpjb252ZXJ0OjpJbnRvOworCit1c2Uga2l0Y2hlbl9zaW5rOjpiYXNlX3R3bzo6e1ROYXBraW5TZXJ2aWNlU3luY0NsaWVudCwgVFJhbWVuU2VydmljZVN5bmNDbGllbnR9OwordXNlIGtpdGNoZW5fc2luazo6bWlkbGF5ZXI6OntNZWFsU2VydmljZVN5bmNDbGllbnQsIFRNZWFsU2VydmljZVN5bmNDbGllbnR9OwordXNlIGtpdGNoZW5fc2luazo6cmVjdXJzaXZlOwordXNlIGtpdGNoZW5fc2luazo6cmVjdXJzaXZlOjp7Q29SZWMsIENvUmVjMiwgUmVjTGlzdCwgUmVjVHJlZSwgVFRlc3RTZXJ2aWNlU3luY0NsaWVudH07Cit1c2Uga2l0Y2hlbl9zaW5rOjp1bHRpbWF0ZTo6e0Z1bGxNZWFsU2VydmljZVN5bmNDbGllbnQsIFRGdWxsTWVhbFNlcnZpY2VTeW5jQ2xpZW50fTsKK3VzZSB0aHJpZnQ6OnByb3RvY29sOjp7CisgICAgVEJpbmFyeUlucHV0UHJvdG9jb2wsIFRCaW5hcnlPdXRwdXRQcm90b2NvbCwgVENvbXBhY3RJbnB1dFByb3RvY29sLCBUQ29tcGFjdE91dHB1dFByb3RvY29sLAorICAgIFRJbnB1dFByb3RvY29sLCBUT3V0cHV0UHJvdG9jb2wsCit9OwordXNlIHRocmlmdDo6dHJhbnNwb3J0Ojp7CisgICAgUmVhZEhhbGYsIFRGcmFtZWRSZWFkVHJhbnNwb3J0LCBURnJhbWVkV3JpdGVUcmFuc3BvcnQsIFRJb0NoYW5uZWwsIFRUY3BDaGFubmVsLCBXcml0ZUhhbGYsCit9OworCitmbiBtYWluKCkgeworICAgIG1hdGNoIHJ1bigpIHsKKyAgICAgICAgT2soKCkpID0+IHByaW50bG4hKCJraXRjaGVuIHNpbmsgY2xpZW50IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkiKSwKKyAgICAgICAgRXJyKGUpID0+IHsKKyAgICAgICAgICAgIHByaW50bG4hKCJraXRjaGVuIHNpbmsgY2xpZW50IGZhaWxlZCB3aXRoIGVycm9yIHs6P30iLCBlKTsKKyAgICAgICAgICAgIHN0ZDo6cHJvY2Vzczo6ZXhpdCgxKTsKKyAgICAgICAgfQorICAgIH0KK30KKworZm4gcnVuKCkgLT4gdGhyaWZ0OjpSZXN1bHQ8KCk+IHsKKyAgICBsZXQgbWF0Y2hlcyA9IGNsYXBfYXBwIShydXN0X2tpdGNoZW5fc2lua19jbGllbnQgPT4KKyAgICAgICAgKHZlcnNpb246ICIwLjEuMCIpCisgICAgICAgIChhdXRob3I6ICJBcGFjaGUgVGhyaWZ0IERldmVsb3BlcnMgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4iKQorICAgICAgICAoYWJvdXQ6ICJUaHJpZnQgUnVzdCBraXRjaGVuIHNpbmsgY2xpZW50IikKKyAgICAgICAgKEBhcmcgaG9zdDogLS1ob3N0ICt0YWtlc192YWx1ZSAiSG9zdCBvbiB3aGljaCB0aGUgVGhyaWZ0IHRlc3Qgc2VydmVyIGlzIGxvY2F0ZWQiKQorICAgICAgICAoQGFyZyBwb3J0OiAtLXBvcnQgK3Rha2VzX3ZhbHVlICJQb3J0IG9uIHdoaWNoIHRoZSBUaHJpZnQgdGVzdCBzZXJ2ZXIgaXMgbGlzdGVuaW5nIikKKyAgICAgICAgKEBhcmcgcHJvdG9jb2w6IC0tcHJvdG9jb2wgK3Rha2VzX3ZhbHVlICJUaHJpZnQgcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gdG8gdXNlIChcImJpbmFyeVwiLCBcImNvbXBhY3RcIikiKQorICAgICAgICAoQGFyZyBzZXJ2aWNlOiAtLXNlcnZpY2UgK3Rha2VzX3ZhbHVlICJTZXJ2aWNlIHR5cGUgdG8gY29udGFjdCAoXCJwYXJ0XCIsIFwiZnVsbFwiLCBcInJlY3Vyc2l2ZVwiKSIpCisgICAgKQorICAgICAgICAgICAgLmdldF9tYXRjaGVzKCk7CisKKyAgICBsZXQgaG9zdCA9IG1hdGNoZXMudmFsdWVfb2YoImhvc3QiKS51bndyYXBfb3IoIjEyNy4wLjAuMSIpOworICAgIGxldCBwb3J0ID0gdmFsdWVfdCEobWF0Y2hlcywgInBvcnQiLCB1MTYpLnVud3JhcF9vcig5MDkwKTsKKyAgICBsZXQgcHJvdG9jb2wgPSBtYXRjaGVzLnZhbHVlX29mKCJwcm90b2NvbCIpLnVud3JhcF9vcigiY29tcGFjdCIpOworICAgIGxldCBzZXJ2aWNlID0gbWF0Y2hlcy52YWx1ZV9vZigic2VydmljZSIpLnVud3JhcF9vcigicGFydCIpOworCisgICAgbGV0IChpX2NoYW4sIG9fY2hhbikgPSB0Y3BfY2hhbm5lbChob3N0LCBwb3J0KT87CisgICAgbGV0IChpX3RyYW4sIG9fdHJhbikgPSAoCisgICAgICAgIFRGcmFtZWRSZWFkVHJhbnNwb3J0OjpuZXcoaV9jaGFuKSwKKyAgICAgICAgVEZyYW1lZFdyaXRlVHJhbnNwb3J0OjpuZXcob19jaGFuKSwKKyAgICApOworCisgICAgbGV0IChpX3Byb3QsIG9fcHJvdCk6IChCb3g8VElucHV0UHJvdG9jb2w+LCBCb3g8VE91dHB1dFByb3RvY29sPikgPSBtYXRjaCBwcm90b2NvbCB7CisgICAgICAgICJiaW5hcnkiID0+ICgKKyAgICAgICAgICAgIEJveDo6bmV3KFRCaW5hcnlJbnB1dFByb3RvY29sOjpuZXcoaV90cmFuLCB0cnVlKSksCisgICAgICAgICAgICBCb3g6Om5ldyhUQmluYXJ5T3V0cHV0UHJvdG9jb2w6Om5ldyhvX3RyYW4sIHRydWUpKSwKKyAgICAgICAgKSwKKyAgICAgICAgImNvbXBhY3QiID0+ICgKKyAgICAgICAgICAgIEJveDo6bmV3KFRDb21wYWN0SW5wdXRQcm90b2NvbDo6bmV3KGlfdHJhbikpLAorICAgICAgICAgICAgQm94OjpuZXcoVENvbXBhY3RPdXRwdXRQcm90b2NvbDo6bmV3KG9fdHJhbikpLAorICAgICAgICApLAorICAgICAgICB1bm1hdGNoZWQgPT4gcmV0dXJuIEVycihmb3JtYXQhKCJ1bnN1cHBvcnRlZCBwcm90b2NvbCB7fSIsIHVubWF0Y2hlZCkuaW50bygpKSwKKyAgICB9OworCisgICAgcnVuX2NsaWVudChzZXJ2aWNlLCBpX3Byb3QsIG9fcHJvdCkKK30KKworZm4gcnVuX2NsaWVudCgKKyAgICBzZXJ2aWNlOiAmc3RyLAorICAgIGlfcHJvdDogQm94PFRJbnB1dFByb3RvY29sPiwKKyAgICBvX3Byb3Q6IEJveDxUT3V0cHV0UHJvdG9jb2w+LAorKSAtPiB0aHJpZnQ6OlJlc3VsdDwoKT4geworICAgIG1hdGNoIHNlcnZpY2UgeworICAgICAgICAiZnVsbCIgPT4gZXhlY19mdWxsX21lYWxfY2xpZW50KGlfcHJvdCwgb19wcm90KSwKKyAgICAgICAgInBhcnQiID0+IGV4ZWNfbWVhbF9jbGllbnQoaV9wcm90LCBvX3Byb3QpLAorICAgICAgICAicmVjdXJzaXZlIiA9PiBleGVjX3JlY3Vyc2l2ZV9jbGllbnQoaV9wcm90LCBvX3Byb3QpLAorICAgICAgICBfID0+IEVycih0aHJpZnQ6OkVycm9yOjpmcm9tKGZvcm1hdCEoCisgICAgICAgICAgICAidW5rbm93biBzZXJ2aWNlIHR5cGUge30iLAorICAgICAgICAgICAgc2VydmljZQorICAgICAgICApKSksCisgICAgfQorfQorCitmbiB0Y3BfY2hhbm5lbCgKKyAgICBob3N0OiAmc3RyLAorICAgIHBvcnQ6IHUxNiwKKykgLT4gdGhyaWZ0OjpSZXN1bHQ8KFJlYWRIYWxmPFRUY3BDaGFubmVsPiwgV3JpdGVIYWxmPFRUY3BDaGFubmVsPik+IHsKKyAgICBsZXQgbXV0IGMgPSBUVGNwQ2hhbm5lbDo6bmV3KCk7CisgICAgYy5vcGVuKCZmb3JtYXQhKCJ7fTp7fSIsIGhvc3QsIHBvcnQpKT87CisgICAgYy5zcGxpdCgpCit9CisKK2ZuIGV4ZWNfbWVhbF9jbGllbnQoCisgICAgaV9wcm90OiBCb3g8VElucHV0UHJvdG9jb2w+LAorICAgIG9fcHJvdDogQm94PFRPdXRwdXRQcm90b2NvbD4sCispIC0+IHRocmlmdDo6UmVzdWx0PCgpPiB7CisgICAgbGV0IG11dCBjbGllbnQgPSBNZWFsU2VydmljZVN5bmNDbGllbnQ6Om5ldyhpX3Byb3QsIG9fcHJvdCk7CisKKyAgICAvLyBjbGllbnQuZnVsbF9tZWFsKCk7IC8vIDwtLSBJTVBPUlRBTlQ6IGlmIHlvdSB1bmNvbW1lbnQgdGhpcywgY29tcGlsYXRpb24gKnNob3VsZCogZmFpbAorICAgIC8vIHRoaXMgaXMgYmVjYXVzZSB0aGUgTWVhbFNlcnZpY2Ugc3RydWN0IGRvZXMgbm90IGNvbnRhaW4gdGhlIGFwcHJvcHJpYXRlIHNlcnZpY2UgbWFya2VyCisKKyAgICAvLyBvbmx5IHRoZSBmb2xsb3dpbmcgdGhyZWUgY2FsbHMgd29yaworICAgIGV4ZWN1dGVfY2FsbCgicGFydCIsICJyYW1lbiIsIHx8IGNsaWVudC5yYW1lbig1MCkpLm1hcCh8X3wgKCkpPzsKKyAgICBleGVjdXRlX2NhbGwoInBhcnQiLCAibWVhbCIsIHx8IGNsaWVudC5tZWFsKCkpLm1hcCh8X3wgKCkpPzsKKyAgICBleGVjdXRlX2NhbGwoInBhcnQiLCAibmFwa2luIiwgfHwgY2xpZW50Lm5hcGtpbigpKS5tYXAofF98ICgpKT87CisKKyAgICBPaygoKSkKK30KKworZm4gZXhlY19mdWxsX21lYWxfY2xpZW50KAorICAgIGlfcHJvdDogQm94PFRJbnB1dFByb3RvY29sPiwKKyAgICBvX3Byb3Q6IEJveDxUT3V0cHV0UHJvdG9jb2w+LAorKSAtPiB0aHJpZnQ6OlJlc3VsdDwoKT4geworICAgIGxldCBtdXQgY2xpZW50ID0gRnVsbE1lYWxTZXJ2aWNlU3luY0NsaWVudDo6bmV3KGlfcHJvdCwgb19wcm90KTsKKworICAgIGV4ZWN1dGVfY2FsbCgiZnVsbCIsICJyYW1lbiIsIHx8IGNsaWVudC5yYW1lbigxMDApKS5tYXAofF98ICgpKT87CisgICAgZXhlY3V0ZV9jYWxsKCJmdWxsIiwgIm1lYWwiLCB8fCBjbGllbnQubWVhbCgpKS5tYXAofF98ICgpKT87CisgICAgZXhlY3V0ZV9jYWxsKCJmdWxsIiwgIm5hcGtpbiIsIHx8IGNsaWVudC5uYXBraW4oKSkubWFwKHxffCAoKSk/OworICAgIGV4ZWN1dGVfY2FsbCgiZnVsbCIsICJmdWxsIG1lYWwiLCB8fCBjbGllbnQuZnVsbF9tZWFsKCkpLm1hcCh8X3wgKCkpPzsKKworICAgIE9rKCgpKQorfQorCitmbiBleGVjX3JlY3Vyc2l2ZV9jbGllbnQoCisgICAgaV9wcm90OiBCb3g8VElucHV0UHJvdG9jb2w+LAorICAgIG9fcHJvdDogQm94PFRPdXRwdXRQcm90b2NvbD4sCispIC0+IHRocmlmdDo6UmVzdWx0PCgpPiB7CisgICAgbGV0IG11dCBjbGllbnQgPSByZWN1cnNpdmU6OlRlc3RTZXJ2aWNlU3luY0NsaWVudDo6bmV3KGlfcHJvdCwgb19wcm90KTsKKworICAgIGxldCB0cmVlID0gUmVjVHJlZSB7CisgICAgICAgIGNoaWxkcmVuOiBTb21lKHZlYyFbQm94OjpuZXcoUmVjVHJlZSB7CisgICAgICAgICAgICBjaGlsZHJlbjogU29tZSh2ZWMhWworICAgICAgICAgICAgICAgIEJveDo6bmV3KFJlY1RyZWUgeworICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbjogTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgaXRlbTogU29tZSgzKSwKKyAgICAgICAgICAgICAgICB9KSwKKyAgICAgICAgICAgICAgICBCb3g6Om5ldyhSZWNUcmVlIHsKKyAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW46IE5vbmUsCisgICAgICAgICAgICAgICAgICAgIGl0ZW06IFNvbWUoNCksCisgICAgICAgICAgICAgICAgfSksCisgICAgICAgICAgICBdKSwKKyAgICAgICAgICAgIGl0ZW06IFNvbWUoMiksCisgICAgICAgIH0pXSksCisgICAgICAgIGl0ZW06IFNvbWUoMSksCisgICAgfTsKKworICAgIGxldCBleHBlY3RlZF90cmVlID0gUmVjVHJlZSB7CisgICAgICAgIGNoaWxkcmVuOiBTb21lKHZlYyFbQm94OjpuZXcoUmVjVHJlZSB7CisgICAgICAgICAgICBjaGlsZHJlbjogU29tZSh2ZWMhWworICAgICAgICAgICAgICAgIEJveDo6bmV3KFJlY1RyZWUgeworICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbjogU29tZShWZWM6Om5ldygpKSwgLy8gcmVtb3RlIHJldHVybnMgYW4gZW1wdHkgbGlzdAorICAgICAgICAgICAgICAgICAgICBpdGVtOiBTb21lKDMpLAorICAgICAgICAgICAgICAgIH0pLAorICAgICAgICAgICAgICAgIEJveDo6bmV3KFJlY1RyZWUgeworICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbjogU29tZShWZWM6Om5ldygpKSwgLy8gcmVtb3RlIHJldHVybnMgYW4gZW1wdHkgbGlzdAorICAgICAgICAgICAgICAgICAgICBpdGVtOiBTb21lKDQpLAorICAgICAgICAgICAgICAgIH0pLAorICAgICAgICAgICAgXSksCisgICAgICAgICAgICBpdGVtOiBTb21lKDIpLAorICAgICAgICB9KV0pLAorICAgICAgICBpdGVtOiBTb21lKDEpLAorICAgIH07CisKKyAgICBsZXQgcmV0dXJuZWRfdHJlZSA9IGV4ZWN1dGVfY2FsbCgicmVjdXJzaXZlIiwgImVjaG9fdHJlZSIsIHx8IGNsaWVudC5lY2hvX3RyZWUodHJlZS5jbG9uZSgpKSk/OworICAgIGlmIHJldHVybmVkX3RyZWUgIT0gZXhwZWN0ZWRfdHJlZSB7CisgICAgICAgIHJldHVybiBFcnIoZm9ybWF0ISgKKyAgICAgICAgICAgICJtaXNtYXRjaGVkIHJlY3Vyc2l2ZSB0cmVlIHs6P30gezo/fSIsCisgICAgICAgICAgICBleHBlY3RlZF90cmVlLCByZXR1cm5lZF90cmVlCisgICAgICAgICkKKyAgICAgICAgLmludG8oKSk7CisgICAgfQorCisgICAgbGV0IGxpc3QgPSBSZWNMaXN0IHsKKyAgICAgICAgbmV4dGl0ZW06IFNvbWUoQm94OjpuZXcoUmVjTGlzdCB7CisgICAgICAgICAgICBuZXh0aXRlbTogU29tZShCb3g6Om5ldyhSZWNMaXN0IHsKKyAgICAgICAgICAgICAgICBuZXh0aXRlbTogTm9uZSwKKyAgICAgICAgICAgICAgICBpdGVtOiBTb21lKDMpLAorICAgICAgICAgICAgfSkpLAorICAgICAgICAgICAgaXRlbTogU29tZSgyKSwKKyAgICAgICAgfSkpLAorICAgICAgICBpdGVtOiBTb21lKDEpLAorICAgIH07CisgICAgbGV0IHJldHVybmVkX2xpc3QgPSBleGVjdXRlX2NhbGwoInJlY3Vyc2l2ZSIsICJlY2hvX2xpc3QiLCB8fCBjbGllbnQuZWNob19saXN0KGxpc3QuY2xvbmUoKSkpPzsKKyAgICBpZiByZXR1cm5lZF9saXN0ICE9IGxpc3QgeworICAgICAgICByZXR1cm4gRXJyKGZvcm1hdCEoIm1pc21hdGNoZWQgcmVjdXJzaXZlIGxpc3Qgezo/fSB7Oj99IiwgbGlzdCwgcmV0dXJuZWRfbGlzdCkuaW50bygpKTsKKyAgICB9CisKKyAgICBsZXQgY29fcmVjID0gQ29SZWMgeworICAgICAgICBvdGhlcjogU29tZShCb3g6Om5ldyhDb1JlYzIgeworICAgICAgICAgICAgb3RoZXI6IFNvbWUoQ29SZWMgeworICAgICAgICAgICAgICAgIG90aGVyOiBTb21lKEJveDo6bmV3KENvUmVjMiB7IG90aGVyOiBOb25lIH0pKSwKKyAgICAgICAgICAgIH0pLAorICAgICAgICB9KSksCisgICAgfTsKKyAgICBsZXQgcmV0dXJuZWRfY29fcmVjID0gZXhlY3V0ZV9jYWxsKCJyZWN1cnNpdmUiLCAiZWNob19jb19yZWMiLCB8fCB7CisgICAgICAgIGNsaWVudC5lY2hvX2NvX3JlYyhjb19yZWMuY2xvbmUoKSkKKyAgICB9KT87CisgICAgaWYgcmV0dXJuZWRfY29fcmVjICE9IGNvX3JlYyB7CisgICAgICAgIHJldHVybiBFcnIoZm9ybWF0ISgibWlzbWF0Y2hlZCBjb19yZWMgezo/fSB7Oj99IiwgY29fcmVjLCByZXR1cm5lZF9jb19yZWMpLmludG8oKSk7CisgICAgfQorCisgICAgT2soKCkpCit9CisKK2ZuIGV4ZWN1dGVfY2FsbDxGLCBSPihzZXJ2aWNlX3R5cGU6ICZzdHIsIGNhbGxfbmFtZTogJnN0ciwgbXV0IGY6IEYpIC0+IHRocmlmdDo6UmVzdWx0PFI+Cit3aGVyZQorICAgIEY6IEZuTXV0KCkgLT4gdGhyaWZ0OjpSZXN1bHQ8Uj4sCit7CisgICAgbGV0IHJlcyA9IGYoKTsKKworICAgIG1hdGNoIHJlcyB7CisgICAgICAgIE9rKF8pID0+IHByaW50bG4hKCJ7fTogY29tcGxldGVkIHt9IGNhbGwiLCBzZXJ2aWNlX3R5cGUsIGNhbGxfbmFtZSksCisgICAgICAgIEVycihyZWYgZSkgPT4gcHJpbnRsbiEoCisgICAgICAgICAgICAie306IGZhaWxlZCB7fSBjYWxsIHdpdGggZXJyb3Igezo/fSIsCisgICAgICAgICAgICBzZXJ2aWNlX3R5cGUsIGNhbGxfbmFtZSwgZQorICAgICAgICApLAorICAgIH0KKworICAgIHJlcworfQpkaWZmIC0tZ2l0IGEvbGliL3JzL3Rlc3Qvc3JjL2Jpbi9raXRjaGVuX3Npbmtfc2VydmVyLnJzIGIvbGliL3JzL3Rlc3Qvc3JjL2Jpbi9raXRjaGVuX3Npbmtfc2VydmVyLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczODAxZWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcnMvdGVzdC9zcmMvYmluL2tpdGNoZW5fc2lua19zZXJ2ZXIucnMKQEAgLTAsMCArMSwzMTMgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworI1ttYWNyb191c2VdCitleHRlcm4gY3JhdGUgY2xhcDsKK2V4dGVybiBjcmF0ZSBraXRjaGVuX3Npbms7CitleHRlcm4gY3JhdGUgdGhyaWZ0OworCit1c2UgdGhyaWZ0Ojpwcm90b2NvbDo6eworICAgIFRCaW5hcnlJbnB1dFByb3RvY29sRmFjdG9yeSwgVEJpbmFyeU91dHB1dFByb3RvY29sRmFjdG9yeSwgVENvbXBhY3RJbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICBUQ29tcGFjdE91dHB1dFByb3RvY29sRmFjdG9yeSwgVElucHV0UHJvdG9jb2xGYWN0b3J5LCBUT3V0cHV0UHJvdG9jb2xGYWN0b3J5LAorfTsKK3VzZSB0aHJpZnQ6OnNlcnZlcjo6VFNlcnZlcjsKK3VzZSB0aHJpZnQ6OnRyYW5zcG9ydDo6eworICAgIFRGcmFtZWRSZWFkVHJhbnNwb3J0RmFjdG9yeSwgVEZyYW1lZFdyaXRlVHJhbnNwb3J0RmFjdG9yeSwgVFJlYWRUcmFuc3BvcnRGYWN0b3J5LAorICAgIFRXcml0ZVRyYW5zcG9ydEZhY3RvcnksCit9OworCit1c2Uga2l0Y2hlbl9zaW5rOjpiYXNlX29uZTo6Tm9vZGxlOwordXNlIGtpdGNoZW5fc2luazo6YmFzZV90d286OnsKKyAgICBCcm90aFR5cGUsIE5hcGtpbiwgTmFwa2luU2VydmljZVN5bmNIYW5kbGVyLCBSYW1lbiwgUmFtZW5TZXJ2aWNlU3luY0hhbmRsZXIsCit9OwordXNlIGtpdGNoZW5fc2luazo6bWlkbGF5ZXI6OnsKKyAgICBEZXNzZXJ0LCBNZWFsLCBNZWFsU2VydmljZVN5bmNIYW5kbGVyLCBNZWFsU2VydmljZVN5bmNQcm9jZXNzb3IsIFBpZSwKK307Cit1c2Uga2l0Y2hlbl9zaW5rOjpyZWN1cnNpdmU7Cit1c2Uga2l0Y2hlbl9zaW5rOjp1bHRpbWF0ZTo6RnVsbE1lYWxBbmREcmlua3NTZXJ2aWNlU3luY0hhbmRsZXI7Cit1c2Uga2l0Y2hlbl9zaW5rOjp1bHRpbWF0ZTo6eworICAgIERyaW5rLCBGdWxsTWVhbCwgRnVsbE1lYWxBbmREcmlua3MsIEZ1bGxNZWFsQW5kRHJpbmtzU2VydmljZVN5bmNQcm9jZXNzb3IsCisgICAgRnVsbE1lYWxTZXJ2aWNlU3luY0hhbmRsZXIsCit9OworCitmbiBtYWluKCkgeworICAgIG1hdGNoIHJ1bigpIHsKKyAgICAgICAgT2soKCkpID0+IHByaW50bG4hKCJraXRjaGVuIHNpbmsgc2VydmVyIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkiKSwKKyAgICAgICAgRXJyKGUpID0+IHsKKyAgICAgICAgICAgIHByaW50bG4hKCJraXRjaGVuIHNpbmsgc2VydmVyIGZhaWxlZCB3aXRoIGVycm9yIHs6P30iLCBlKTsKKyAgICAgICAgICAgIHN0ZDo6cHJvY2Vzczo6ZXhpdCgxKTsKKyAgICAgICAgfQorICAgIH0KK30KKworZm4gcnVuKCkgLT4gdGhyaWZ0OjpSZXN1bHQ8KCk+IHsKKyAgICBsZXQgbWF0Y2hlcyA9IGNsYXBfYXBwIShydXN0X2tpdGNoZW5fc2lua19zZXJ2ZXIgPT4KKyAgICAgICAgKHZlcnNpb246ICIwLjEuMCIpCisgICAgICAgIChhdXRob3I6ICJBcGFjaGUgVGhyaWZ0IERldmVsb3BlcnMgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4iKQorICAgICAgICAoYWJvdXQ6ICJUaHJpZnQgUnVzdCBraXRjaGVuIHNpbmsgdGVzdCBzZXJ2ZXIiKQorICAgICAgICAoQGFyZyBwb3J0OiAtLXBvcnQgK3Rha2VzX3ZhbHVlICJwb3J0IG9uIHdoaWNoIHRoZSB0ZXN0IHNlcnZlciBsaXN0ZW5zIikKKyAgICAgICAgKEBhcmcgcHJvdG9jb2w6IC0tcHJvdG9jb2wgK3Rha2VzX3ZhbHVlICJUaHJpZnQgcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gdG8gdXNlIChcImJpbmFyeVwiLCBcImNvbXBhY3RcIikiKQorICAgICAgICAoQGFyZyBzZXJ2aWNlOiAtLXNlcnZpY2UgK3Rha2VzX3ZhbHVlICJTZXJ2aWNlIHR5cGUgdG8gY29udGFjdCAoXCJwYXJ0XCIsIFwiZnVsbFwiLCBcInJlY3Vyc2l2ZVwiKSIpCisgICAgKQorICAgICAgICAgICAgLmdldF9tYXRjaGVzKCk7CisKKyAgICBsZXQgcG9ydCA9IHZhbHVlX3QhKG1hdGNoZXMsICJwb3J0IiwgdTE2KS51bndyYXBfb3IoOTA5MCk7CisgICAgbGV0IHByb3RvY29sID0gbWF0Y2hlcy52YWx1ZV9vZigicHJvdG9jb2wiKS51bndyYXBfb3IoImNvbXBhY3QiKTsKKyAgICBsZXQgc2VydmljZSA9IG1hdGNoZXMudmFsdWVfb2YoInNlcnZpY2UiKS51bndyYXBfb3IoInBhcnQiKTsKKyAgICBsZXQgbGlzdGVuX2FkZHJlc3MgPSBmb3JtYXQhKCIxMjcuMC4wLjE6e30iLCBwb3J0KTsKKworICAgIHByaW50bG4hKCJiaW5kaW5nIHRvIHt9IiwgbGlzdGVuX2FkZHJlc3MpOworCisgICAgbGV0IHJfdHJhbnNwb3J0X2ZhY3RvcnkgPSBURnJhbWVkUmVhZFRyYW5zcG9ydEZhY3Rvcnk6Om5ldygpOworICAgIGxldCB3X3RyYW5zcG9ydF9mYWN0b3J5ID0gVEZyYW1lZFdyaXRlVHJhbnNwb3J0RmFjdG9yeTo6bmV3KCk7CisKKyAgICBsZXQgKGlfcHJvdG9jb2xfZmFjdG9yeSwgb19wcm90b2NvbF9mYWN0b3J5KTogKAorICAgICAgICBCb3g8VElucHV0UHJvdG9jb2xGYWN0b3J5PiwKKyAgICAgICAgQm94PFRPdXRwdXRQcm90b2NvbEZhY3Rvcnk+LAorICAgICkgPSBtYXRjaCAmKnByb3RvY29sIHsKKyAgICAgICAgImJpbmFyeSIgPT4gKAorICAgICAgICAgICAgQm94OjpuZXcoVEJpbmFyeUlucHV0UHJvdG9jb2xGYWN0b3J5OjpuZXcoKSksCisgICAgICAgICAgICBCb3g6Om5ldyhUQmluYXJ5T3V0cHV0UHJvdG9jb2xGYWN0b3J5OjpuZXcoKSksCisgICAgICAgICksCisgICAgICAgICJjb21wYWN0IiA9PiAoCisgICAgICAgICAgICBCb3g6Om5ldyhUQ29tcGFjdElucHV0UHJvdG9jb2xGYWN0b3J5OjpuZXcoKSksCisgICAgICAgICAgICBCb3g6Om5ldyhUQ29tcGFjdE91dHB1dFByb3RvY29sRmFjdG9yeTo6bmV3KCkpLAorICAgICAgICApLAorICAgICAgICB1bmtub3duID0+IHsKKyAgICAgICAgICAgIHJldHVybiBFcnIoZm9ybWF0ISgidW5zdXBwb3J0ZWQgdHJhbnNwb3J0IHR5cGUge30iLCB1bmtub3duKS5pbnRvKCkpOworICAgICAgICB9CisgICAgfTsKKworICAgIC8vIEZJWE1FOiBzaG91bGQgcHJvY2Vzc29yIGJlIGJveGVkIGFzIHdlbGw/CisgICAgLy8KKyAgICAvLyBbc2lnaF0gSSBoYXRlIFJ1c3QgZ2VuZXJpY3MgaW1wbGVtZW50YXRpb24KKyAgICAvLworICAgIC8vIEkgd291bGQgaGF2ZSBwcmVmZXJyZWQgdG8gYnVpbGQgYSBzZXJ2ZXIgaGVyZSwgcmV0dXJuIGl0LCBhbmQgdGhlbiBkbworICAgIC8vIHRoZSBjb21tb24gbGlzdGVuLWFuZC1oYW5kbGUgc3R1ZmYsIGJ1dCBzaW5jZSB0aGUgc2VydmVyIGRvZXNuJ3QgaGF2ZSBhCisgICAgLy8gY29tbW9uIHR5cGUgKGJlY2F1c2UgZWFjaCBtYXRjaCBhcm0gaW5zdGFudGlhdGVzIGEgc2VydmVyIHdpdGggYQorICAgIC8vIGRpZmZlcmVudCBwcm9jZXNzb3IpIHRoaXMgaXNuJ3QgcG9zc2libGUuCisgICAgLy8KKyAgICAvLyBTaW5jZSB3aGF0IEknbSBkb2luZyBpcyB1bmNvbW1vbiBJJ20ganVzdCBnb2luZyB0byBkdXBsaWNhdGUgdGhlIGNvZGUKKyAgICBtYXRjaCAmKnNlcnZpY2UgeworICAgICAgICAicGFydCIgPT4gcnVuX21lYWxfc2VydmVyKAorICAgICAgICAgICAgJmxpc3Rlbl9hZGRyZXNzLAorICAgICAgICAgICAgcl90cmFuc3BvcnRfZmFjdG9yeSwKKyAgICAgICAgICAgIGlfcHJvdG9jb2xfZmFjdG9yeSwKKyAgICAgICAgICAgIHdfdHJhbnNwb3J0X2ZhY3RvcnksCisgICAgICAgICAgICBvX3Byb3RvY29sX2ZhY3RvcnksCisgICAgICAgICksCisgICAgICAgICJmdWxsIiA9PiBydW5fZnVsbF9tZWFsX3NlcnZlcigKKyAgICAgICAgICAgICZsaXN0ZW5fYWRkcmVzcywKKyAgICAgICAgICAgIHJfdHJhbnNwb3J0X2ZhY3RvcnksCisgICAgICAgICAgICBpX3Byb3RvY29sX2ZhY3RvcnksCisgICAgICAgICAgICB3X3RyYW5zcG9ydF9mYWN0b3J5LAorICAgICAgICAgICAgb19wcm90b2NvbF9mYWN0b3J5LAorICAgICAgICApLAorICAgICAgICAicmVjdXJzaXZlIiA9PiBydW5fcmVjdXJzaXZlX3NlcnZlcigKKyAgICAgICAgICAgICZsaXN0ZW5fYWRkcmVzcywKKyAgICAgICAgICAgIHJfdHJhbnNwb3J0X2ZhY3RvcnksCisgICAgICAgICAgICBpX3Byb3RvY29sX2ZhY3RvcnksCisgICAgICAgICAgICB3X3RyYW5zcG9ydF9mYWN0b3J5LAorICAgICAgICAgICAgb19wcm90b2NvbF9mYWN0b3J5LAorICAgICAgICApLAorICAgICAgICB1bmtub3duID0+IEVycihmb3JtYXQhKCJ1bnN1cHBvcnRlZCBzZXJ2aWNlIHR5cGUge30iLCB1bmtub3duKS5pbnRvKCkpLAorICAgIH0KK30KKworZm4gcnVuX21lYWxfc2VydmVyPFJURiwgSVBGLCBXVEYsIE9QRj4oCisgICAgbGlzdGVuX2FkZHJlc3M6ICZzdHIsCisgICAgcl90cmFuc3BvcnRfZmFjdG9yeTogUlRGLAorICAgIGlfcHJvdG9jb2xfZmFjdG9yeTogSVBGLAorICAgIHdfdHJhbnNwb3J0X2ZhY3Rvcnk6IFdURiwKKyAgICBvX3Byb3RvY29sX2ZhY3Rvcnk6IE9QRiwKKykgLT4gdGhyaWZ0OjpSZXN1bHQ8KCk+Cit3aGVyZQorICAgIFJURjogVFJlYWRUcmFuc3BvcnRGYWN0b3J5ICsgJ3N0YXRpYywKKyAgICBJUEY6IFRJbnB1dFByb3RvY29sRmFjdG9yeSArICdzdGF0aWMsCisgICAgV1RGOiBUV3JpdGVUcmFuc3BvcnRGYWN0b3J5ICsgJ3N0YXRpYywKKyAgICBPUEY6IFRPdXRwdXRQcm90b2NvbEZhY3RvcnkgKyAnc3RhdGljLAoreworICAgIGxldCBwcm9jZXNzb3IgPSBNZWFsU2VydmljZVN5bmNQcm9jZXNzb3I6Om5ldyhQYXJ0SGFuZGxlciB7fSk7CisgICAgbGV0IG11dCBzZXJ2ZXIgPSBUU2VydmVyOjpuZXcoCisgICAgICAgIHJfdHJhbnNwb3J0X2ZhY3RvcnksCisgICAgICAgIGlfcHJvdG9jb2xfZmFjdG9yeSwKKyAgICAgICAgd190cmFuc3BvcnRfZmFjdG9yeSwKKyAgICAgICAgb19wcm90b2NvbF9mYWN0b3J5LAorICAgICAgICBwcm9jZXNzb3IsCisgICAgICAgIDEsCisgICAgKTsKKworICAgIHNlcnZlci5saXN0ZW4obGlzdGVuX2FkZHJlc3MpCit9CisKK2ZuIHJ1bl9mdWxsX21lYWxfc2VydmVyPFJURiwgSVBGLCBXVEYsIE9QRj4oCisgICAgbGlzdGVuX2FkZHJlc3M6ICZzdHIsCisgICAgcl90cmFuc3BvcnRfZmFjdG9yeTogUlRGLAorICAgIGlfcHJvdG9jb2xfZmFjdG9yeTogSVBGLAorICAgIHdfdHJhbnNwb3J0X2ZhY3Rvcnk6IFdURiwKKyAgICBvX3Byb3RvY29sX2ZhY3Rvcnk6IE9QRiwKKykgLT4gdGhyaWZ0OjpSZXN1bHQ8KCk+Cit3aGVyZQorICAgIFJURjogVFJlYWRUcmFuc3BvcnRGYWN0b3J5ICsgJ3N0YXRpYywKKyAgICBJUEY6IFRJbnB1dFByb3RvY29sRmFjdG9yeSArICdzdGF0aWMsCisgICAgV1RGOiBUV3JpdGVUcmFuc3BvcnRGYWN0b3J5ICsgJ3N0YXRpYywKKyAgICBPUEY6IFRPdXRwdXRQcm90b2NvbEZhY3RvcnkgKyAnc3RhdGljLAoreworICAgIGxldCBwcm9jZXNzb3IgPSBGdWxsTWVhbEFuZERyaW5rc1NlcnZpY2VTeW5jUHJvY2Vzc29yOjpuZXcoRnVsbEhhbmRsZXIge30pOworICAgIGxldCBtdXQgc2VydmVyID0gVFNlcnZlcjo6bmV3KAorICAgICAgICByX3RyYW5zcG9ydF9mYWN0b3J5LAorICAgICAgICBpX3Byb3RvY29sX2ZhY3RvcnksCisgICAgICAgIHdfdHJhbnNwb3J0X2ZhY3RvcnksCisgICAgICAgIG9fcHJvdG9jb2xfZmFjdG9yeSwKKyAgICAgICAgcHJvY2Vzc29yLAorICAgICAgICAxLAorICAgICk7CisKKyAgICBzZXJ2ZXIubGlzdGVuKGxpc3Rlbl9hZGRyZXNzKQorfQorCitzdHJ1Y3QgUGFydEhhbmRsZXI7CisKK2ltcGwgTWVhbFNlcnZpY2VTeW5jSGFuZGxlciBmb3IgUGFydEhhbmRsZXIgeworICAgIGZuIGhhbmRsZV9tZWFsKCZzZWxmKSAtPiB0aHJpZnQ6OlJlc3VsdDxNZWFsPiB7CisgICAgICAgIHByaW50bG4hKCJwYXJ0OiBoYW5kbGluZyBtZWFsIGNhbGwiKTsKKyAgICAgICAgT2sobWVhbCgpKQorICAgIH0KK30KKworaW1wbCBSYW1lblNlcnZpY2VTeW5jSGFuZGxlciBmb3IgUGFydEhhbmRsZXIgeworICAgIGZuIGhhbmRsZV9yYW1lbigmc2VsZiwgXzogaTMyKSAtPiB0aHJpZnQ6OlJlc3VsdDxSYW1lbj4geworICAgICAgICBwcmludGxuISgicGFydDogaGFuZGxpbmcgcmFtZW4gY2FsbCIpOworICAgICAgICBPayhyYW1lbigpKQorICAgIH0KK30KKworaW1wbCBOYXBraW5TZXJ2aWNlU3luY0hhbmRsZXIgZm9yIFBhcnRIYW5kbGVyIHsKKyAgICBmbiBoYW5kbGVfbmFwa2luKCZzZWxmKSAtPiB0aHJpZnQ6OlJlc3VsdDxOYXBraW4+IHsKKyAgICAgICAgcHJpbnRsbiEoInBhcnQ6IGhhbmRsaW5nIG5hcGtpbiBjYWxsIik7CisgICAgICAgIE9rKG5hcGtpbigpKQorICAgIH0KK30KKworLy8gZnVsbCBzZXJ2aWNlCisvLworCitzdHJ1Y3QgRnVsbEhhbmRsZXI7CisKK2ltcGwgRnVsbE1lYWxBbmREcmlua3NTZXJ2aWNlU3luY0hhbmRsZXIgZm9yIEZ1bGxIYW5kbGVyIHsKKyAgICBmbiBoYW5kbGVfZnVsbF9tZWFsX2FuZF9kcmlua3MoJnNlbGYpIC0+IHRocmlmdDo6UmVzdWx0PEZ1bGxNZWFsQW5kRHJpbmtzPiB7CisgICAgICAgIHByaW50bG4hKCJmdWxsX21lYWxfYW5kX2RyaW5rczogaGFuZGxpbmcgZnVsbCBtZWFsIGFuZCBkcmlua3MgY2FsbCIpOworICAgICAgICBPayhGdWxsTWVhbEFuZERyaW5rczo6bmV3KGZ1bGxfbWVhbCgpLCBEcmluazo6Q2FuYWRpYW5XaGlza3kpKQorICAgIH0KKworICAgIGZuIGhhbmRsZV9iZXN0X3BpZSgmc2VsZikgLT4gdGhyaWZ0OjpSZXN1bHQ8UGllPiB7CisgICAgICAgIHByaW50bG4hKCJmdWxsX21lYWxfYW5kX2RyaW5rczogaGFuZGxpbmcgcGllIGNhbGwiKTsKKyAgICAgICAgT2soUGllOjpNaXNzaXNzaXBwaU11ZCkgLy8gSSBwcmVmZXIgUGllOjpQdW1wa2luLCBidXQgSSBoYXZlIHRvIGNoZWNrIHRoYXQgY2FzaW5nIHdvcmtzCisgICAgfQorfQorCitpbXBsIEZ1bGxNZWFsU2VydmljZVN5bmNIYW5kbGVyIGZvciBGdWxsSGFuZGxlciB7CisgICAgZm4gaGFuZGxlX2Z1bGxfbWVhbCgmc2VsZikgLT4gdGhyaWZ0OjpSZXN1bHQ8RnVsbE1lYWw+IHsKKyAgICAgICAgcHJpbnRsbiEoImZ1bGw6IGhhbmRsaW5nIGZ1bGwgbWVhbCBjYWxsIik7CisgICAgICAgIE9rKGZ1bGxfbWVhbCgpKQorICAgIH0KK30KKworaW1wbCBNZWFsU2VydmljZVN5bmNIYW5kbGVyIGZvciBGdWxsSGFuZGxlciB7CisgICAgZm4gaGFuZGxlX21lYWwoJnNlbGYpIC0+IHRocmlmdDo6UmVzdWx0PE1lYWw+IHsKKyAgICAgICAgcHJpbnRsbiEoImZ1bGw6IGhhbmRsaW5nIG1lYWwgY2FsbCIpOworICAgICAgICBPayhtZWFsKCkpCisgICAgfQorfQorCitpbXBsIFJhbWVuU2VydmljZVN5bmNIYW5kbGVyIGZvciBGdWxsSGFuZGxlciB7CisgICAgZm4gaGFuZGxlX3JhbWVuKCZzZWxmLCBfOiBpMzIpIC0+IHRocmlmdDo6UmVzdWx0PFJhbWVuPiB7CisgICAgICAgIHByaW50bG4hKCJmdWxsOiBoYW5kbGluZyByYW1lbiBjYWxsIik7CisgICAgICAgIE9rKHJhbWVuKCkpCisgICAgfQorfQorCitpbXBsIE5hcGtpblNlcnZpY2VTeW5jSGFuZGxlciBmb3IgRnVsbEhhbmRsZXIgeworICAgIGZuIGhhbmRsZV9uYXBraW4oJnNlbGYpIC0+IHRocmlmdDo6UmVzdWx0PE5hcGtpbj4geworICAgICAgICBwcmludGxuISgiZnVsbDogaGFuZGxpbmcgbmFwa2luIGNhbGwiKTsKKyAgICAgICAgT2sobmFwa2luKCkpCisgICAgfQorfQorCitmbiBmdWxsX21lYWwoKSAtPiBGdWxsTWVhbCB7CisgICAgRnVsbE1lYWw6Om5ldyhtZWFsKCksIERlc3NlcnQ6OlBvcnQoIkdyYWhhbSdzIFRhd255Ii50b19vd25lZCgpKSkKK30KKworZm4gbWVhbCgpIC0+IE1lYWwgeworICAgIE1lYWw6Om5ldyhub29kbGUoKSwgcmFtZW4oKSkKK30KKworZm4gbm9vZGxlKCkgLT4gTm9vZGxlIHsKKyAgICBOb29kbGU6Om5ldygic3BlbHQiLnRvX293bmVkKCksIDEwMCkKK30KKworZm4gcmFtZW4oKSAtPiBSYW1lbiB7CisgICAgUmFtZW46Om5ldygiTXIgUmFtZW4iLnRvX293bmVkKCksIDcyLCBCcm90aFR5cGU6Ok1pc28pCit9CisKK2ZuIG5hcGtpbigpIC0+IE5hcGtpbiB7CisgICAgTmFwa2luIHt9Cit9CisKK2ZuIHJ1bl9yZWN1cnNpdmVfc2VydmVyPFJURiwgSVBGLCBXVEYsIE9QRj4oCisgICAgbGlzdGVuX2FkZHJlc3M6ICZzdHIsCisgICAgcl90cmFuc3BvcnRfZmFjdG9yeTogUlRGLAorICAgIGlfcHJvdG9jb2xfZmFjdG9yeTogSVBGLAorICAgIHdfdHJhbnNwb3J0X2ZhY3Rvcnk6IFdURiwKKyAgICBvX3Byb3RvY29sX2ZhY3Rvcnk6IE9QRiwKKykgLT4gdGhyaWZ0OjpSZXN1bHQ8KCk+Cit3aGVyZQorICAgIFJURjogVFJlYWRUcmFuc3BvcnRGYWN0b3J5ICsgJ3N0YXRpYywKKyAgICBJUEY6IFRJbnB1dFByb3RvY29sRmFjdG9yeSArICdzdGF0aWMsCisgICAgV1RGOiBUV3JpdGVUcmFuc3BvcnRGYWN0b3J5ICsgJ3N0YXRpYywKKyAgICBPUEY6IFRPdXRwdXRQcm90b2NvbEZhY3RvcnkgKyAnc3RhdGljLAoreworICAgIGxldCBwcm9jZXNzb3IgPSByZWN1cnNpdmU6OlRlc3RTZXJ2aWNlU3luY1Byb2Nlc3Nvcjo6bmV3KFJlY3Vyc2l2ZVRlc3RTZXJ2ZXJIYW5kbGVyIHt9KTsKKyAgICBsZXQgbXV0IHNlcnZlciA9IFRTZXJ2ZXI6Om5ldygKKyAgICAgICAgcl90cmFuc3BvcnRfZmFjdG9yeSwKKyAgICAgICAgaV9wcm90b2NvbF9mYWN0b3J5LAorICAgICAgICB3X3RyYW5zcG9ydF9mYWN0b3J5LAorICAgICAgICBvX3Byb3RvY29sX2ZhY3RvcnksCisgICAgICAgIHByb2Nlc3NvciwKKyAgICAgICAgMSwKKyAgICApOworCisgICAgc2VydmVyLmxpc3RlbihsaXN0ZW5fYWRkcmVzcykKK30KKworc3RydWN0IFJlY3Vyc2l2ZVRlc3RTZXJ2ZXJIYW5kbGVyOworaW1wbCByZWN1cnNpdmU6OlRlc3RTZXJ2aWNlU3luY0hhbmRsZXIgZm9yIFJlY3Vyc2l2ZVRlc3RTZXJ2ZXJIYW5kbGVyIHsKKyAgICBmbiBoYW5kbGVfZWNob190cmVlKCZzZWxmLCB0cmVlOiByZWN1cnNpdmU6OlJlY1RyZWUpIC0+IHRocmlmdDo6UmVzdWx0PHJlY3Vyc2l2ZTo6UmVjVHJlZT4geworICAgICAgICBwcmludGxuISgiezo/fSIsIHRyZWUpOworICAgICAgICBPayh0cmVlKQorICAgIH0KKworICAgIGZuIGhhbmRsZV9lY2hvX2xpc3QoJnNlbGYsIGxzdDogcmVjdXJzaXZlOjpSZWNMaXN0KSAtPiB0aHJpZnQ6OlJlc3VsdDxyZWN1cnNpdmU6OlJlY0xpc3Q+IHsKKyAgICAgICAgcHJpbnRsbiEoIns6P30iLCBsc3QpOworICAgICAgICBPayhsc3QpCisgICAgfQorCisgICAgZm4gaGFuZGxlX2VjaG9fY29fcmVjKCZzZWxmLCBpdGVtOiByZWN1cnNpdmU6OkNvUmVjKSAtPiB0aHJpZnQ6OlJlc3VsdDxyZWN1cnNpdmU6OkNvUmVjPiB7CisgICAgICAgIHByaW50bG4hKCJ7Oj99IiwgaXRlbSk7CisgICAgICAgIE9rKGl0ZW0pCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3JzL3Rlc3Qvc3JjL2xpYi5ycyBiL2xpYi9ycy90ZXN0L3NyYy9saWIucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVlMTc2ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ycy90ZXN0L3NyYy9saWIucnMKQEAgLTAsMCArMSw1NyBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitleHRlcm4gY3JhdGUgb3JkZXJlZF9mbG9hdDsKK2V4dGVybiBjcmF0ZSB0aHJpZnQ7CitleHRlcm4gY3JhdGUgdHJ5X2Zyb207CisKK3B1YiBtb2QgYmFzZV9vbmU7CitwdWIgbW9kIGJhc2VfdHdvOworcHViIG1vZCBtaWRsYXllcjsKK3B1YiBtb2QgdWx0aW1hdGU7CitwdWIgbW9kIHJlY3Vyc2l2ZTsKKworI1tjZmcodGVzdCldCittb2QgdGVzdHMgeworCisgICAgdXNlIHN0ZDo6ZGVmYXVsdDo6RGVmYXVsdDsKKworICAgIHVzZSBzdXBlcjo6KjsKKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X2JlX2FibGVfdG9fdXNlX2NvbnN0cnVjdG9yKCkgeworICAgICAgICBsZXQgXyA9IG1pZGxheWVyOjpNZWFsOjpuZXcoU29tZShiYXNlX29uZTo6Tm9vZGxlOjpkZWZhdWx0KCkpLCBOb25lKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9iZV9hYmxlX3RvX3VzZV9jb25zdHJ1Y3Rvcl93aXRoX25vX2ZpZWxkcygpIHsKKyAgICAgICAgbGV0IF8gPSBtaWRsYXllcjo6TWVhbDo6bmV3KE5vbmUsIE5vbmUpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X2JlX2FibGVfdG9fdXNlX2NvbnN0cnVjdG9yX3dpdGhvdXRfb3B0aW9uX3dyYXAoKSB7CisgICAgICAgIGxldCBfID0gbWlkbGF5ZXI6Ok1lYWw6Om5ldyhiYXNlX29uZTo6Tm9vZGxlOjpkZWZhdWx0KCksIE5vbmUpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X2JlX2FibGVfdG9fdXNlX2RlZmF1bHRzKCkgeworICAgICAgICBsZXQgXyA9IG1pZGxheWVyOjpNZWFsIHsKKyAgICAgICAgICAgIG5vb2RsZTogU29tZShiYXNlX29uZTo6Tm9vZGxlOjpkZWZhdWx0KCkpLAorICAgICAgICAgICAgLi5EZWZhdWx0OjpkZWZhdWx0KCkKKyAgICAgICAgfTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcnMvdGVzdC90aHJpZnRzL0Jhc2VfT25lLnRocmlmdCBiL2xpYi9ycy90ZXN0L3RocmlmdHMvQmFzZV9PbmUudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1ZmE2YzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcnMvdGVzdC90aHJpZnRzL0Jhc2VfT25lLnRocmlmdApAQCAtMCwwICsxLDg0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCisgKiBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgorICogZGV0YWlscy4KKyAqLworCit0eXBlZGVmIGk2NCBUZW1wZXJhdHVyZQorCit0eXBlZGVmIGk4IFNpemUKKwordHlwZWRlZiBzdHJpbmcgTG9jYXRpb24KKworY29uc3QgaTMyIEJvaWxpbmdQb2ludCA9IDEwMAorCitjb25zdCBsaXN0PFRlbXBlcmF0dXJlPiBUZW1wZXJhdHVyZXMgPSBbMTAsIDExLCAyMiwgMzNdCisKKy8vIElNUE9SVEFOVDogdGVtcHMgc2hvdWxkIGVuZCB3aXRoICIuMCIgYmVjYXVzZSB0aGlzIHRlc3RzCisvLyB0aGF0IHdlIGRvbid0IGhhdmUgYSBwcm9ibGVtIHdpdGggY29uc3QgZmxvYXQgbGlzdCBnZW5lcmF0aW9uCitjb25zdCBsaXN0PGRvdWJsZT4gQ29tbW9uVGVtcGVyYXR1cmVzID0gWzMwMC4wLCA0NTAuMF0KKworY29uc3QgZG91YmxlIE1lYWxzUGVyRGF5ID0gMi41OworCitjb25zdCBzdHJpbmcgRGVmYXVsdFJlY2lwZU5hbWUgPSAiU291cC1yaXNlIG9mIHRoZSBEYXkiCitjb25zdCBiaW5hcnkgRGVmYXVsdFJlY2lwZUJpbmFyeSA9ICJTb3VwLXJpc2Ugb2YgdGhlIDAxMDEwMTAxIgorCitzdHJ1Y3QgTm9vZGxlIHsKKyAgMTogc3RyaW5nIGZsb3VyVHlwZQorICAyOiBUZW1wZXJhdHVyZSBjb29rVGVtcAorfQorCitzdHJ1Y3QgU3BhZ2hldHRpIHsKKyAgMTogb3B0aW9uYWwgbGlzdDxOb29kbGU+IG5vb2RsZXMKK30KKworY29uc3QgTm9vZGxlIFNwZWx0Tm9vZGxlID0geyAiZmxvdXJUeXBlIjogInNwZWx0IiwgImNvb2tUZW1wIjogMTEwIH0KKworc3RydWN0IE1lYXN1cmluZ1Nwb29uIHsKKyAgMTogU2l6ZSBzaXplCit9CisKK3N0cnVjdCBNZWFzdXJpbmdDdXAgeworICAxOiBkb3VibGUgbWlsbGlzCit9CisKK3VuaW9uIE1lYXN1cmluZ0FpZHMgeworICAxOiBNZWFzdXJpbmdTcG9vbiBzcG9vbgorICAyOiBNZWFzdXJpbmdDdXAgY3VwCit9CisKK3N0cnVjdCBDb29raW5nVGVtcGVyYXR1cmVzIHsKKyAgMTogc2V0PGRvdWJsZT4gY29tbW9uVGVtcGVyYXR1cmVzCisgIDI6IGxpc3Q8ZG91YmxlPiB1c2VkVGVtcGVyYXR1cmVzCisgIDM6IG1hcDxkb3VibGUsIGRvdWJsZT4gZmFocmVuaGVpdFRvQ2VudGlncmFkZUNvbnZlcnNpb25zCit9CisKK3N0cnVjdCBSZWNpcGUgeworICAxOiBzdHJpbmcgcmVjaXBlTmFtZQorICAyOiBzdHJpbmcgY3Vpc2luZQorICAzOiBpOCBwYWdlCit9CisKK3VuaW9uIENvb2tpbmdUb29scyB7CisgIDE6IHNldDxNZWFzdXJpbmdTcG9vbj4gbWVhc3VyaW5nU3Bvb25zCisgIDI6IG1hcDxTaXplLCBMb2NhdGlvbj4gbWVhc3VyaW5nQ3VwcywKKyAgMzogbGlzdDxSZWNpcGU+IHJlY2lwZXMKK30KKwpkaWZmIC0tZ2l0IGEvbGliL3JzL3Rlc3QvdGhyaWZ0cy9CYXNlX1R3by50aHJpZnQgYi9saWIvcnMvdGVzdC90aHJpZnRzL0Jhc2VfVHdvLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWE2YWNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3JzL3Rlc3QvdGhyaWZ0cy9CYXNlX1R3by50aHJpZnQKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgorICogUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKKyAqIGRldGFpbHMuCisgKi8KKworY29uc3QgaTMyIFdhdGVyV2VpZ2h0ID0gMjAwCisKK2VudW0gYnJvdGhUeXBlIHsKKyAgTWlzbywKKyAgc2hvdXl1LAorfQorCitzdHJ1Y3QgUmFtZW4geworICAxOiBvcHRpb25hbCBzdHJpbmcgcmFtZW5UeXBlCisgIDI6IHJlcXVpcmVkIGkzMiBub29kbGVDb3VudAorICAzOiBicm90aFR5cGUgYnJvdGgKK30KKworc3RydWN0IE5hcGtpbiB7CisgIC8vIGVtcHR5Cit9CisKK3NlcnZpY2UgTmFwa2luU2VydmljZSB7CisgIE5hcGtpbiBuYXBraW4oKQorfQorCitzZXJ2aWNlIFJhbWVuU2VydmljZSBleHRlbmRzIE5hcGtpblNlcnZpY2UgeworICBSYW1lbiByYW1lbigxOiBpMzIgcmVxdWVzdGVkTm9vZGxlQ291bnQpCit9CisKKy8qIGNvbnN0IHN0cnVjdCBDb29rZWRSYW1lbiA9IHsgImJhciI6IDEwIH0gKi8KKwpkaWZmIC0tZ2l0IGEvbGliL3JzL3Rlc3QvdGhyaWZ0cy9NaWRsYXllci50aHJpZnQgYi9saWIvcnMvdGVzdC90aHJpZnRzL01pZGxheWVyLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmZmNDliCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3JzL3Rlc3QvdGhyaWZ0cy9NaWRsYXllci50aHJpZnQKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgorICogUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKKyAqIGRldGFpbHMuCisgKi8KKworaW5jbHVkZSAiQmFzZV9PbmUudGhyaWZ0IgoraW5jbHVkZSAiQmFzZV9Ud28udGhyaWZ0IgorCitjb25zdCBpMzIgV2F0ZXJCb2lsaW5nUG9pbnQgPSBCYXNlX09uZS5Cb2lsaW5nUG9pbnQKKworY29uc3QgbWFwPHN0cmluZywgQmFzZV9PbmUuVGVtcGVyYXR1cmU+IFRlbXBlcmF0dXJlTmFtZXMgPSB7ICJmcmVlemluZyI6IDAsICJib2lsaW5nIjogMTAwIH0KKworY29uc3QgbWFwPHNldDxpMzI+LCBtYXA8bGlzdDxzdHJpbmc+LCBzdHJpbmc+PiBNeUNvbnN0TmVzdGVkTWFwID0geworICBbMCwgMSwgMiwgM106IHsgWyJmb28iXTogImJhciIgfSwKKyAgWzIwXTogeyBbIm51dCIsICJ0b24iXSA6ICJiYXIiIH0sCisgIFszMCwgNDBdOiB7IFsiYm91bmN5IiwgInRpbmtseSJdOiAiY2FzdGxlIiB9Cit9CisKK2NvbnN0IGxpc3Q8bGlzdDxpMzI+PiBNeUNvbnN0TmVzdGVkTGlzdCA9IFsKKyAgWzAsIDEsIDJdLAorICBbMywgNCwgNV0sCisgIFs2LCA3LCA4XQorXQorCitjb25zdCBzZXQ8c2V0PGkzMj4+IE15Q29uc3ROZXN0ZWRTZXQgPSBbCisgIFswLCAxLCAyXSwKKyAgWzMsIDQsIDVdLAorICBbNiwgNywgOF0KK10KKworZW51bSBQaWUgeworICBQVU1QS0lOLAorICBhcHBsZSwgLy8gaW50ZW50aW9uYWxseSBwb29ybHkgY2FzZWQKKyAgU1RSQVdCRVJSWV9SSFVCQVJCLAorICBLZXlfTGltZSwgLy8gaW50ZW50aW9uYWxseSBwb29ybHkgY2FzZWQKKyAgY29jb251dF9DcmVhbSwgLy8gaW50ZW50aW9uYWxseSBwb29ybHkgY2FzZWQKKyAgbWlzc2lzc2lwcGlfbXVkLCAvLyBpbnRlbnRpb25hbGx5IHBvb3JseSBjYXNlZAorfQorCitzdHJ1Y3QgTWVhbCB7CisgIDE6IEJhc2VfT25lLk5vb2RsZSBub29kbGUKKyAgMjogQmFzZV9Ud28uUmFtZW4gcmFtZW4KK30KKwordW5pb24gRGVzc2VydCAgeworICAxOiBzdHJpbmcgcG9ydAorICAyOiBzdHJpbmcgaWNlV2luZQorfQorCitzZXJ2aWNlIE1lYWxTZXJ2aWNlIGV4dGVuZHMgQmFzZV9Ud28uUmFtZW5TZXJ2aWNlIHsKKyAgTWVhbCBtZWFsKCkKK30KKwpkaWZmIC0tZ2l0IGEvbGliL3JzL3Rlc3QvdGhyaWZ0cy9VbHRpbWF0ZS50aHJpZnQgYi9saWIvcnMvdGVzdC90aHJpZnRzL1VsdGltYXRlLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmZhMTAwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3JzL3Rlc3QvdGhyaWZ0cy9VbHRpbWF0ZS50aHJpZnQKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgorICogUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKKyAqIGRldGFpbHMuCisgKi8KKworaW5jbHVkZSAiTWlkbGF5ZXIudGhyaWZ0IgorCitlbnVtIERyaW5rIHsKKyAgV0FURVIsCisgIFdISVNLRVksCisgIFdJTkUsCisgIHNjb3RjaCwgLy8gaW50ZW50aW9uYWxseSBwb29ybHkgY2FzZWQKKyAgTEFURV9IQVJWRVNUX1dJTkUsCisgIEluZGlhX1BhbGVfQWxlLCAvLyBpbnRlbnRpb25hbGx5IHBvb3JseSBjYXNlZAorICBhcHBsZV9jaWRlciwgLy8gaW50ZW50aWFsbHkgcG9vcmx5IGNhc2VkCisgIGJlbGdpYW5fQWxlLCAvLyBpbnRlbnRpb25hbGx5IHBvb3JseSBjYXNlZAorICBDYW5hZGlhbl93aGlza3ksIC8vIGludGVudGlvbmFsbHkgcG9vcmx5IGNhc2VkCit9CisKK2NvbnN0IG1hcDxpOCwgTWlkbGF5ZXIuUGllPiBSYW5rZWRQaWVzID0geworICAxOiBNaWRsYXllci5QaWUuUFVNUEtJTiwKKyAgMjogTWlkbGF5ZXIuUGllLlNUUkFXQkVSUllfUkhVQkFSQiwKKyAgMzogTWlkbGF5ZXIuUGllLmFwcGxlLAorICA0OiBNaWRsYXllci5QaWUubWlzc2lzc2lwcGlfbXVkLAorICA1OiBNaWRsYXllci5QaWUuY29jb251dF9DcmVhbSwKKyAgNjogTWlkbGF5ZXIuUGllLktleV9MaW1lLAorfQorCitzdHJ1Y3QgRnVsbE1lYWwgeworICAxOiByZXF1aXJlZCBNaWRsYXllci5NZWFsIG1lYWwKKyAgMjogcmVxdWlyZWQgTWlkbGF5ZXIuRGVzc2VydCBkZXNzZXJ0Cit9CisKK3N0cnVjdCBGdWxsTWVhbEFuZERyaW5rcyB7CisgIDE6IHJlcXVpcmVkIEZ1bGxNZWFsIGZ1bGxNZWFsCisgIDI6IG9wdGlvbmFsIERyaW5rIGRyaW5rCit9CisKK3NlcnZpY2UgRnVsbE1lYWxTZXJ2aWNlIGV4dGVuZHMgTWlkbGF5ZXIuTWVhbFNlcnZpY2UgeworICBGdWxsTWVhbCBmdWxsTWVhbCgpCit9CisKK3NlcnZpY2UgRnVsbE1lYWxBbmREcmlua3NTZXJ2aWNlIGV4dGVuZHMgRnVsbE1lYWxTZXJ2aWNlIHsKKyAgRnVsbE1lYWxBbmREcmlua3MgZnVsbE1lYWxBbmREcmlua3MoKQorCisgIE1pZGxheWVyLlBpZSBiZXN0UGllKCkKK30KKwpkaWZmIC0tZ2l0IGEvbGliL3N0L2NvZGluZ19zdGFuZGFyZHMubWQgYi9saWIvc3QvY29kaW5nX3N0YW5kYXJkcy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTAzOTBiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3N0L2NvZGluZ19zdGFuZGFyZHMubWQKQEAgLTAsMCArMSBAQAorUGxlYXNlIGZvbGxvdyBbR2VuZXJhbCBDb2RpbmcgU3RhbmRhcmRzXSgvZG9jL2NvZGluZ19zdGFuZGFyZHMubWQpCmRpZmYgLS1naXQgYS9saWIvc3QvcGFja2FnZS54bWwgYi9saWIvc3QvcGFja2FnZS54bWwKaW5kZXggYjJiNGIyZi4uZjgzOTM2YSAxMDA2NDQKLS0tIGEvbGliL3N0L3BhY2thZ2UueG1sCisrKyBiL2xpYi9zdC9wYWNrYWdlLnhtbApAQCAtMTcsNyArMTcsNyBAQAogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICB1bmRlciB0aGUgTGljZW5zZS4KICAtLT4KLTwhLS0gQXBhY2hlIFRocmlmdCBTbWFsbHRhbGsgbGlicmFyeSB2ZXJzaW9uIDAuOS4yIC0tPgorPCEtLSBBcGFjaGUgVGhyaWZ0IFNtYWxsdGFsayBsaWJyYXJ5IHZlcnNpb24gMS4wLjAgLS0+CiA8cGFja2FnZT4KICAgPG5hbWU+bGlidGhyaWZ0LXN0PC9uYW1lPgogICA8ZmlsZT50aHJpZnQuc3Q8L2ZpbGU+CmRpZmYgLS1naXQgYS9saWIvc3dpZnQvTWFrZWZpbGUuYW0gYi9saWIvc3dpZnQvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI4OGIwNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDQ2IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworU1VCRElSUyA9IC4KKworYWxsLWxvY2FsOgorCXN3aWZ0IGJ1aWxkIC0tY29uZmlndXJhdGlvbiByZWxlYXNlCisKK2luc3RhbGwtZXhlYy1ob29rOgorCXN3aWZ0IGluc3RhbGwKKworY2xlYW4tbG9jYWw6CisJc3dpZnQgcGFja2FnZSBjbGVhbgorCXJtIC1yZiAuYnVpbGQKKworcHJlY3Jvc3M6CisJc3dpZnQKKworY2hlY2stbG9jYWw6CisJc3dpZnQgdGVzdAorCitFWFRSQV9ESVNUID0gXAorCVBhY2thZ2Uuc3dpZnQgXAorCVNvdXJjZXMgXAorCVRlc3RzIFwKKwlSRUFETUUubWQKKworTUFJTlRBSU5FUkNMRUFORklMRVMgPSBcCisJTWFrZWZpbGUgXAorCU1ha2VmaWxlLmluCmRpZmYgLS1naXQgYS9saWIvc3dpZnQvUGFja2FnZS5zd2lmdCBiL2xpYi9zd2lmdC9QYWNrYWdlLnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MzNmNjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvUGFja2FnZS5zd2lmdApAQCAtMCwwICsxLDI0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ltcG9ydCBQYWNrYWdlRGVzY3JpcHRpb24KKworbGV0IHBhY2thZ2UgPSBQYWNrYWdlKAorCW5hbWU6ICJUaHJpZnQiCispCmRpZmYgLS1naXQgYS9saWIvc3dpZnQvUkVBRE1FLm1kIGIvbGliL3N3aWZ0L1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjEwOTYxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1JFQURNRS5tZApAQCAtMCwwICsxLDIxNSBAQAorVGhyaWZ0IFN3aWZ0IExpYnJhcnkKKz09PT09PT09PT09PT09PT09PT09PT09PT0KKworTGljZW5zZQorLS0tLS0tLQorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKK2Rpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCityZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK3RvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKK3dpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCitzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCitLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwordW5kZXIgdGhlIExpY2Vuc2UuCisKKworIyMgQnVpbGQKKyAgICBzd2lmdCBidWlsZAorCisjIyBUZXN0CisgICAgc3dpZnQgdGVzdAorCisjIyBJbnN0YWxsIExpYnJhcnkKKyMjIyMjIENvY29hcG9kcworQWRkIHRoZSBmb2xsb3dpbmcgdG8geW91ciBwb2RmaWxlCitgYGBydWJ5CisgICAgcG9kICdUaHJpZnQtc3dpZnQzJywgOmdpdCA9PiAnZ2l0QGdpdGh1Yi5jb206YXBhY2hlL3RocmlmdC5naXQnLCA6YnJhbmNoID0+ICdtYXN0ZXInCitgYGAKKworIyMjIyMgU1BNCitVbmZvcnR1bmF0ZWx5IGR1ZSB0byBzb21lIGxpbWl0YXRpb25zIGluIFNQTSwgdGhlIFBhY2thZ2UgbWFuaWZlc3QgYW5kIFNvdXJjZXMgZGlyZWN0b3J5IG11c3QgYmUgYXQgdGhlIHJvb3Qgb2YgdGhlIHByb2plY3QuCitUbyBnZXQgYXJvdW5kIHRoYXQgZm9yIHRoZSB0aW1lIGJlaW5nLCB5b3UgY2FuIHVzZSB0aGlzIG1pcnJvcmVkIHJlcG8uCitBZGQgdGhlIGZvbGxvd2luZyB0byB5b3VyIFBhY2thZ2Uuc3dpZnQKK2BgYHN3aWZ0CitkZXBlbmRlbmNpZXM6IFsKKyAgICAuUGFja2FnZSh1cmw6ICJodHRwczovL2dpdGh1Yi5jb20vYXBvY29saXBzZS9UaHJpZnQtU3dpZnQuZ2l0IiwgbWFqb3JWZXJzaW9uOiAxKQorXQorYGBgCisKKyMjIFRocmlmdCBDb21waWxlcgorCitZb3UgY2FuIGNvbXBpbGUgSURMIHNvdXJjZXMgZm9yIFN3aWZ0IDMgd2l0aCB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6CisKKyAgICB0aHJpZnQgLS1nZW4gc3dpZnQgdGhyaWZ0X2ZpbGUKKworIyMgQ2xpZW50IEV4YW1wbGUKK2BgYHN3aWZ0CitsZXQgdHJhbnNwb3J0ID0gVFNvY2tldFRyYW5zcG9ydChob3N0bmFtZTogImxvY2FsaG9zdCIsIHBvcnQ6IDkwOTApIQorCisvLyAgdmFyIHByb3RvID0gVENvbXBhY3RQcm90b2NvbCh0cmFuc3BvcnQ6IHRyYW5zcG9ydCkKK2xldCBwcm90byA9IFRCaW5hcnlQcm90b2NvbChvbjogdHJhbnNwb3J0KQorLy8gIHZhciBjbGllbnQgPSBIZXJtZXNDbGllbnQoaW5vdXRQcm90b2NvbDogcHJvdG8pCitsZXQgY2xpZW50ID0gVGhyaWZ0VGVzdENsaWVudChpbm91dFByb3RvY29sOiBwcm90bykKK2RvIHsKKyAgICB0cnkgY2xpZW50LnRlc3RWb2lkKCkKK30gY2F0Y2ggbGV0IGVycm9yIHsKKyAgICBwcmludCgiXChlcnJvcikiKQorfQorYGBgCisKKyMjIExpYnJhcnkgTm90ZXMKKy0gRWxpbWluYXRlZCBQcm90b2NvbCBGYWN0b3JpZXMsIFRoZXkgd2VyZSBvbmx5IHVzZWQgaW4gYXN5bmMgY2xpZW50cyBhbmQgc2VydmVyIGltcGxlbWVudGF0aW9ucywgd2hlcmUgR2VuZXJpY3MgcHJvdmlkZSBhIGJldHRlciBhbHRlcm5hdGl2ZS4KKy0gU3dpZnR5IEVycm9ycywgQWxsIGBURXJyb3JgIHR5cGVzIGhhdmUgYSBuZXN0ZWQgYEVycm9yQ29kZWAgRW51bSBhcyB3ZWxsIGFzIHNvbWUgZXh0cmEgZmxhdm9yIHdoZXJlIG5lZWRlZC4KKy0gVmFsdWUgdHlwZWQgZXZlcnl0aGluZy4gIGBUVHJhbnNwb3J0YCBvcGVyYXRlcyBvbiB2YWx1ZSB0eXBlZCBgRGF0YWAgcmF0aGVyIHRoYW4gcmVmZXJlbmNlIHR5cGVkIGBOU0RhdGFgIG9yIGBVbnNhZmVCdWZmZXJQb2ludGVyYHMKKy0gU3dpZnQgMyBOYW1lZCBwcm90b2NvbHMuICBTd2lmdCAzIG5hbWluZyBjb252ZW50aW9ucyBzdWdnZXN0IHRoZSBlbGltaW5hdGlvbiBvZiByZWR1bmRhbnQgd29yZHMgdGhhdCBjYW4gYmUgaW5mZXJyZWQgZnJvbSB2YXJpYWJsZS9mdW5jdGlvbiBzaWduYXR1cmVzLiAgVGhpcyByZW5hbWluZyBpcyBhcHBsaWVkIHRocm91Z2hvdXQgdGhlIFN3aWZ0IDMgbGlicmFyeSBjb252ZXJ0aW5nIG1vc3QgbmFtaW5nIGNvbnZlbnRpb25zIHVzZWQgaW4gdGhlIFN3aWZ0Mi9Db2NvYSBsaWJyYXJ5IHRvIFN3aWZ0IDMtZXNxdWUgbmFtaW5nIGNvbnZlbnRpb25zLiBlZy4KK2BgYHN3aWZ0CitmdW5jIHJlYWRTdHJpbmcoKSB0aHJvd3MgLT4gU3RyaW5nCitmdW5jIHdyaXRlU3RyaW5nKF8gdmFsOiBTdHJpbmcpIHRocm93cworYGBgCitoYXZlIGJlZW4gcmVuYW1lZCB0byBlbGltaW5hdGUgcmVkdW5kYW50IHdvcmRzOgorYGBgc3dpZnQKK2Z1bmMgcmVhZCgpIHRocm93cyAtPiBTdHJpbmcKK2Z1bmMgd3JpdGUoXyB2YWw6IFN0cmluZykgdGhyb3dzCitgYGAKKworLSBFbGltaW5hdGVkIGBUSFRUUFRyYW5zcG9ydGAgdGhhdCB1c2VzIGBOU1VSTENvbm5lY3Rpb25gIGR1ZSB0byBpdCBiZWluZyBkZXByZWNhdGVkIGFuZCBub3QgYXZhaWxhYmxlIGF0IGFsbCBpbiBTd2lmdCAzIGZvciBMaW51eC4gIGBUSFRUUFNlc3Npb25UcmFuc3BvcnRgIGZyb20gdGhlIFN3aWZ0Mi9Db2NvYSBsaWJyYXJ5IHRoYXQgdXNlcyBgTlNVUkxTZXNzaW9uYCBoYXMgYmVlbiByZW5hbWVkIHRvIGBUSFRUUFRyYW5zcG9ydGAgZm9yIHRoaXMgbGlicmFyeSBhbmQgbGV2ZXJhZ2VzIGBVUkxTZXNzaW9uYCwgcHJvdmlkaW5nIGJvdGggc3luY2hyb25vdXMgKHdpdGggc2VtYXBob3JlcykgYW5kIGFzeW5jaHJvbm91cyBiZWhhdmlvci4KKy0gUHJvYmFibHkgc29tZSBNb3JlIHRoaW5ncyBJJ3ZlIG1pc3NlZCBoZXJlLgorCisjIyBHZW5lcmF0b3IgTm90ZXMKKyMjIyMgR2VuZXJhdG9yIEZsYWdzCit8IEZsYWcgICAgICAgICAgfCBEZXNjcmlwdGlvbiAgICAgICAgICAgfAorfCAtLS0tLS0tLS0tLS0tIHw6LS0tLS0tLS0tLS0tLTp8Cit8IGFzeW5jX2NsaWVudHMgfCBHZW5lcmF0ZSBjbGllbnRzIHdoaWNoIGludm9rZSBhc3luY2hyb25vdXNseSB2aWEgYmxvY2sgc3ludGF4LiBBc3luY2hyb25vdXMgY2xhc3NlcyBhcmUgYXBwZW5kZWQgd2l0aCBgX0FzeW5jYCB8Cit8IG5vX3N0cmljdCogICAgfCBHZW5lcmF0ZXMgbm9uLXN0cmljdCBzdHJ1Y3RzICAgICAgfAorfCBkZWJ1Z19kZXNjcmlwdGlvbnMgfCBBbGxvdyB1c2Ugb2YgZGVidWdEZXNjcmlwdGlvbiBzbyB0aGUgYXBwIGNhbiBhZGQgZGVzY3JpcHRpb24gdmlhIGEgY2F0ZW9nb3J5L2V4dGVuc2lvbiAgICAgIHwKK3wgbG9nX3VuZXhwZWN0ZWQgfCBMb2cgZXZlcnkgdGltZSBhbiB1bmV4cGVjdGVkIGZpZWxkIElEIG9yIHR5cGUgaXMgZW5jb3VudGVyZWQuIHwKK3wgc2FmZV9lbnVtcyAgICAgfCBHZW5lcmF0ZSBlbnVtIHR5cGVzIHdpdGggYW4gdW5rbm93biBjYXNlIHRvIGhhbmRsZSB1bnNwZWNpZmllZCB2YWx1ZXMgcmF0aGVyIHRoYW4gdGhyb3cgYSBzZXJpYWxpemF0aW9uIGVycm9yICB8CisKKworCisqTW9zdCB0aHJpZnQgbGlicmFyaWVzIGFsbG93IGVtcHR5IGluaXRpYWxpemF0aW9uIG9mIFN0cnVjdHMsIGluaXRpYWxpemluZyBgcmVxdWlyZWRgIGZpZWxkcyB3aXRoIG5pbC9udWxsL05vbmUgKFB5dGhvbiBhbmQgTm9kZSBnZW5lcmF0b3JzKS4gIFN3aWZ0IG9uIHRoZSBvdGhlciBoYW5kIHJlcXVpcmVzIGluaXRpYWxpemVycyB0byBpbml0aWFsaXplIGFsbCBub24tT3B0aW9uYWwgZmllbGRzLCBhbmQgdGh1cyB0aGUgU3dpZnQgMyBnZW5lcmF0b3IgZG9lcyBub3QgcHJvdmlkZSBkZWZhdWx0IHZhbHVlcyAodW5saWtlIHRoZSBTd2lmdCAyL0NvY29hIGdlbmVyYXRvcikuICBJbiBvdGhlciBsYW5ndWFnZXMsIHRoaXMgYWxsb3dzIHRoZSBzZW5kaW5nIG9mIE5VTEwgdmFsdWVzIGluIGZpZWxkcyB0aGF0IGFyZSBtYXJrZWQgYHJlcXVpcmVkYCwgYW5kIHRodXMgd2lsbCB0aHJvdyBhbiBlcnJvciBpbiBTd2lmdCBjbGllbnRzIGF0dGVtcHRpbmcgdG8gdmFsaWRhdGUgZmllbGRzLiAgVGhlIGBub19zdHJpY3RgIG9wdGlvbiBoZXJlIHdpbGwgaWdub3JlIHRoZSB2YWxpZGF0aW9uIGNoZWNrLCBhcyB3ZWxsIGFzIGJlaGF2ZSBzaW1pbGFyIHRvIHRoZSBTd2lmdDIvQ29jb2EgZ2VuZXJhdG9yIGFuZCBpbml0aWFsaXplIHJlcXVpcmVkIGZpZWxkcyB3aXRoIGVtcHR5IGluaXRpYWxpemVycyAod2hlcmUgcG9zc2libGUpLgorCisKKyMjIFdoYXRzIGltcGxlbWVudGVkCisjIyMjIExpYnJhcnkKKyMjIyMjIFRyYW5zcG9ydHMKKy0gW3hdIFRTb2NrZXRUcmFuc3BvcnQgLSBDRlNvY2tldCBhbmQgUG9zaXhTb2NrZXQgdmFyaWFudHMgYXZhaWxhYmxlLiBDRlNvY2tldCB2YXJpYW50IG9ubHkgY3VycmVudGx5IGF2YWlsYWJsZSBmb3IgRGFyd2luIHBsYXRmb3JtcworLSBbeF0gVEhUVFBUcmFuc3BvcnQgLSBDdXJyZW50bHkgb25seSBhdmFpbGFibGUgZm9yIERhcndpbiBwbGF0Zm9ybXMsIFN3aWZ0IEZvdW5kYXRpb24gVVJMU2Vzc2lvbiBpbXBsZW1lbnRhdGlvbiBuZWVkcyBjb21wbGV0aW9uIG9uIGxpbnV4LgorLSBbeF0gVFNvY2tldFNlcnZlciAtIFVzZXMgQ0ZTb2NrZXRzIG9ubHkgZm9yIGJpbmRpbmcsIHNob3VsZCBiZSB3b3JraW5nIG9uIGxpbnV4CistIFt4XSBURnJhbWVkVHJhbnNwb3J0CistIFt4XSBUTWVtb3J5QnVmZmVyVHJhbnNwb3J0CistIFt4XSBURmlsZVRyYW5zcG9ydCAtIEEgZmV3IHZhcmlhbnRzIHVzaW5nIEZpbGUgaGFuZGxlcyBhbmQgZmlsZSBkZXNjcmlwdG9ycy4KKy0gW3hdIFRTdHJlYW1UcmFuc3BvcnQgLSBGdWxseSBmdW5jdGlvbmFsIGluIERhcndpbiwgRm91bmRhdGlvbiBiYWNraW5nIG5vdCB5ZXQgY29tcGxldGVkIGluIExpbnV4IChUaGlzIGxpbWl0cyBUQ0ZTb2NrZXRUcmFuc3BvcnQgdG8gRGFyd2luKQorLSBbIF0gSFRUUFNlcnZlciAtIEN1cnJlbnRseSB0aGVyZSBpcyBubyBsaWdodHdlaWdodCAgSFRUUFNlcnZlciBpbXBsZW1lbnRhdGlvbiB0aGUgU3dpZnQgU3RhbmRhcmQgTGlicmFyeSwgc28gb3RoZXIgM3JkIHBhcnR5IGFsdGVybmF0aXZlcyBhcmUgcmVxdWlyZWQgYW5kIG91dCBvZiBzY29wZSBmb3IgdGhlIFRocmlmdCBsaWJyYXJ5LiAgRXhhbXBsZXMgdXNpbmcgUGVyZmVjdCB3aWxsIGJlIHByb3ZpZGVkLgorLSBbIF0gT3RoZXIgKGd6LCBldGMpCisKKyMjIyMjIFByb3RvY29scworLSBbeF0gVEJpbmFyeVByb3RvY29sCistIFt4XSBUQ29tcGFjdFByb3RvY29sCistIFsgXSBUSlNPTlByb3RvY29sIC0gVGhpcyB3aWxsIG5lZWQgdG8gYmUgaW1wbGVtZW50ZWQKKworIyMjIyMgR2VuZXJhdG9yCistIFt4XSBDb2RlIENvbXBsZXRlIEdlbmVyYXRvcgorLSBbeF0gQXN5bmMgY2xpZW50cworLSBbeF0gRG9jdW1lbnRhdGlvbiBHZW5lcmF0aW9uIC0gR2VuZXJhdG9yIHdpbGwgdHJhbnNwbGFudCBJREwgZG9jcyB0byBTd2lmdCBjb2RlIGZvciBlYXN5IGxvb2t1cCBpbiBYY29kZQorLSBbIF0gRGVmYXVsdCBWYWx1ZXMgLSBUT0RPCistIFsgXSBub19zdHJpY3QgbW9kZSAtIFRPRE8KKy0gWyBdIE5hbWVzcGFjaW5nIC0gU3RpbGwgaGF2ZW4ndCBuYWlsZWQgZG93biBhIGdvb2QgcGFyYWRpZ20gZm9yIG5hbWVzcGFjaW5nLiAgSXQgd2lsbCBsaWtlbHkgaW52b2x2ZSBjcmVhdGluZyBzdWJkaXJlY3RvcmllcyBmb3IgZGlmZmVyZW50IG5hbWVzcGFjZXMgYW5kIGV4cGVjdGluZyB0aGUgZGV2ZWxvcGVyIHRvIGltcG9ydCBlYWNoIHN1YmRpcmVjdG9yeSBhcyBzZXBhcmF0ZSBtb2R1bGVzLiAgSXQgY291bGQgZXh0ZW5kIHRvIGNyZWF0aW5nIFNQTSBQYWNrYWdlIG1hbmlmZXN0cyB3aXRoIHN1Yi1tb2R1bGVzIHdpdGhpbiB0aGUgZ2VuZXJhdGVkIG1vZHVsZQorCisKKworIyMgRXhhbXBsZSBIVFRQIFNlcnZlciB3aXRoIFBlcmZlY3QKK2BgYHN3aWZ0CitpbXBvcnQgUGVyZmVjdExpYgoraW1wb3J0IFBlcmZlY3RIVFRQCitpbXBvcnQgUGVyZmVjdEhUVFBTZXJ2ZXIKK2ltcG9ydCBEaXNwYXRjaAorCitsZXQgbG9nUXVldWUgPSBEaXNwYXRjaFF1ZXVlKGxhYmVsOiAibG9nIiwgcW9zOiAuYmFja2dyb3VuZCwgYXR0cmlidXRlczogLmNvbmN1cnJlbnQpCitsZXQgcFF1ZXVlID0gRGlzcGF0Y2hRdWV1ZShsYWJlbDogImxvZyIsIHFvczogLnVzZXJJbml0aWF0ZWQsIGF0dHJpYnV0ZXM6IC5jb25jdXJyZW50KQorCisKK2NsYXNzIFRQZXJmZWN0U2VydmVyPEluUHJvdG9jb2w6IFRQcm90b2NvbCwgT3V0UHJvdG9jb2w6IFRQcm90b2NvbD4geworCisgcHJpdmF0ZSB2YXIgc2VydmVyID0gSFRUUFNlcnZlcigpCisgcHJpdmF0ZSB2YXIgcHJvY2Vzc29yOiBUUHJvY2Vzc29yCisKKyBpbml0KGFkZHJlc3M6IFN0cmluZz8gPSBuaWwsCisgICAgICBwYXRoOiBTdHJpbmc/ID0gbmlsLAorICAgICAgcG9ydDogSW50LAorICAgICAgcHJvY2Vzc29yOiBUUHJvY2Vzc29yLAorICAgICAgaW5Qcm90b2NvbDogSW5Qcm90b2NvbC5UeXBlLAorICAgICAgb3V0UHJvdG9jb2w6IE91dFByb3RvY29sLlR5cGUpIHRocm93cyB7CisKKyAgIHNlbGYucHJvY2Vzc29yID0gcHJvY2Vzc29yCisKKyAgIGlmIGxldCBhZGRyZXNzID0gYWRkcmVzcyB7CisgICAgIHNlcnZlci5zZXJ2ZXJBZGRyZXNzID0gYWRkcmVzcworICAgfQorICAgc2VydmVyLnNlcnZlclBvcnQgPSBVSW50MTYocG9ydCkKKworICAgdmFyIHJvdXRlcyA9IFJvdXRlcygpCisgICB2YXIgdXJpID0gIi8iCisgICBpZiBsZXQgcGF0aCA9IHBhdGggeworICAgICB1cmkgKz0gcGF0aAorICAgfQorICAgcm91dGVzLmFkZChtZXRob2Q6IC5wb3N0LCB1cmk6IHVyaSkgeyByZXF1ZXN0LCByZXNwb25zZSBpbgorICAgICBwUXVldWUuYXN5bmMgeworICAgICAgIHJlc3BvbnNlLnNldEhlYWRlciguY29udGVudFR5cGUsIHZhbHVlOiAiYXBwbGljYXRpb24veC10aHJpZnQiKQorCisgICAgICAgbGV0IGl0cmFucyA9IFRNZW1vcnlCdWZmZXJUcmFuc3BvcnQoKQorICAgICAgIGlmIGxldCBieXRlcyA9IHJlcXVlc3QucG9zdEJvZHlCeXRlcyB7CisgICAgICAgICBsZXQgZGF0YSA9IERhdGEoYnl0ZXM6IGJ5dGVzKQorICAgICAgICAgaXRyYW5zLnJlc2V0KHJlYWRCdWZmZXI6IGRhdGEpCisgICAgICAgfQorCisgICAgICAgbGV0IG90cmFucyA9IFRNZW1vcnlCdWZmZXJUcmFuc3BvcnQoZmx1c2hIYW5kbGVyOiB7IHRyYW5zLCBidWZmIGluCisgICAgICAgICBsZXQgYXJyYXkgPSBidWZmLndpdGhVbnNhZmVCeXRlcyB7CisgICAgICAgICAgIEFycmF5PFVJbnQ4PihVbnNhZmVCdWZmZXJQb2ludGVyKHN0YXJ0OiAkMCwgY291bnQ6IGJ1ZmYuY291bnQpKQorICAgICAgICAgfQorICAgICAgICAgcmVzcG9uc2Uuc3RhdHVzID0gLm9rCisgICAgICAgICByZXNwb25zZS5zZXRCb2R5KGJ5dGVzOiBhcnJheSkKKyAgICAgICAgIHJlc3BvbnNlLmNvbXBsZXRlZCgpCisgICAgICAgfSkKKworICAgICAgIGxldCBpbnByb3RvID0gSW5Qcm90b2NvbChvbjogaXRyYW5zKQorICAgICAgIGxldCBvdXRwcm90byA9IE91dFByb3RvY29sKG9uOiBvdHJhbnMpCisKKyAgICAgICBkbyB7CisgICAgICAgICB0cnkgcHJvY2Vzc29yLnByb2Nlc3Mob246IGlucHJvdG8sIG91dFByb3RvY29sOiBvdXRwcm90bykKKyAgICAgICAgIHRyeSBvdHJhbnMuZmx1c2goKQorICAgICAgIH0gY2F0Y2ggeworICAgICAgICAgcmVzcG9uc2Uuc3RhdHVzID0gLmJhZFJlcXVlc3QKKyAgICAgICAgIHJlc3BvbnNlLmNvbXBsZXRlZCgpCisgICAgICAgfQorICAgICB9CisgICB9CisgICBzZXJ2ZXIuYWRkUm91dGVzKHJvdXRlcykKKyB9CisKKyBmdW5jIHNlcnZlKCkgdGhyb3dzIHsKKyAgIHRyeSBzZXJ2ZXIuc3RhcnQoKQorIH0KK30KK2BgYAorCisjIyMjIEV4YW1wbGUgVXNhZ2UKK2BgYHN3aWZ0CitjbGFzcyBTZXJ2aWNlSGFuZGxlciA6IFNlcnZpY2UgeworICAgIC4uLgorfQorbGV0IHNlcnZlciA9IHRyeT8gVFBlcmZlY3RTZXJ2ZXIocG9ydDogOTA5MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc29yOiBTZXJ2aWNlUHJvY2Vzc29yKHNlcnZpY2U6IFNlcnZpY2VIYW5kbGVyKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblByb3RvY29sOiBUQmluYXJ5UHJvdG9jb2wuc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0UHJvdG9jb2w6IFRCaW5hcnlQcm90b2NvbC5zZWxmKQorCit0cnk/IHNlcnZlcj8uc2VydmUoKQorYGBgCmRpZmYgLS1naXQgYS9saWIvc3dpZnQvU291cmNlcy9MaW51eEhlbHBlci5zd2lmdCBiL2xpYi9zd2lmdC9Tb3VyY2VzL0xpbnV4SGVscGVyLnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2ZDkyYmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9MaW51eEhlbHBlci5zd2lmdApAQCAtMCwwICsxLDQ2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworaW1wb3J0IEZvdW5kYXRpb24KK2ltcG9ydCBDb3JlRm91bmRhdGlvbgorCisjaWYgb3MoTGludXgpCisvLy8gRXh0ZW5zaW9ucyBmb3IgTGludXggZm9yIGluY29tcGxldGUgRm91bmRhdGlvbiBBUEkncy4KKy8vLyBzd2lmdC1jb3JlbGlicy1mb3VuZGF0aW9uIGlzIG5vdCB5ZXQgMToxIHdpdGggT1NYL2lPUyBGb3VuZGF0aW9uCisKK2V4dGVuc2lvbiBDRlNvY2tldEVycm9yIHsKKyAgcHVibGljIHN0YXRpYyBsZXQgc3VjY2VzcyA9IGtDRlNvY2tldFN1Y2Nlc3MKK30KKyAgCitleHRlbnNpb24gVUludCB7CisgIHB1YmxpYyBzdGF0aWMgZnVuYyAmKGxoczogVUludCwgcmhzOiBJbnQpIC0+IFVJbnQgeworICAgIGxldCBjYXN0ID0gdW5zYWZlQml0Q2FzdChyaHMsIHRvOiBVSW50LnNlbGYpCisgICAgcmV0dXJuIGxocyAmIGNhc3QKKyAgfQorfQorCisjZWxzZQorZXh0ZW5zaW9uIENGU3RyZWFtUHJvcGVydHlLZXkgeworICBzdGF0aWMgbGV0IHNob3VsZENsb3NlTmF0aXZlU29ja2V0ICA9IENGU3RyZWFtUHJvcGVydHlLZXkoa0NGU3RyZWFtUHJvcGVydHlTaG91bGRDbG9zZU5hdGl2ZVNvY2tldCkKKyAgLy8gRXhpc3RzIGFzIFN0cmVhbS5Qcm9wZXJ0eUtleS5zb2NrZXRTZWN1cml0eWxldmVsS2V5IGJ1dCBkb2Vzbid0IHdvcmsgd2l0aCBDRlJlYWRTdHJlYW1TZXRQcm9wZXJ0eQorICBzdGF0aWMgbGV0IHNvY2tldFNlY3VyaXR5TGV2ZWwgICAgICA9IENGU3RyZWFtUHJvcGVydHlLZXkoa0NGU3RyZWFtUHJvcGVydHlTb2NrZXRTZWN1cml0eUxldmVsKQorICBzdGF0aWMgbGV0IFNTTFNldHRpbmdzICAgICAgICAgICAgICA9IENGU3RyZWFtUHJvcGVydHlLZXkoa0NGU3RyZWFtUHJvcGVydHlTU0xTZXR0aW5ncykKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1NvdXJjZXMvVEFwcGxpY2F0aW9uRXJyb3Iuc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9UQXBwbGljYXRpb25FcnJvci5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzM5Mzk2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1NvdXJjZXMvVEFwcGxpY2F0aW9uRXJyb3Iuc3dpZnQKQEAgLTAsMCArMSwxNTcgQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworKiB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKworcHVibGljIHN0cnVjdCBUQXBwbGljYXRpb25FcnJvciA6IFRFcnJvciB7CisgIHB1YmxpYyBlbnVtIENvZGUgOiBURXJyb3JDb2RlIHsKKyAgICBjYXNlIHVua25vd24KKyAgICBjYXNlIHVua25vd25NZXRob2QobWV0aG9kTmFtZTogU3RyaW5nPykKKyAgICBjYXNlIGludmFsaWRNZXNzYWdlVHlwZQorICAgIGNhc2Ugd3JvbmdNZXRob2ROYW1lKG1ldGhvZE5hbWU6IFN0cmluZz8pCisgICAgY2FzZSBiYWRTZXF1ZW5jZUlkCisgICAgY2FzZSBtaXNzaW5nUmVzdWx0KG1ldGhvZE5hbWU6IFN0cmluZz8pCisgICAgY2FzZSBpbnRlcm5hbEVycm9yCisgICAgY2FzZSBwcm90b2NvbEVycm9yCisgICAgY2FzZSBpbnZhbGlkVHJhbnNmb3JtCisgICAgY2FzZSBpbnZhbGlkUHJvdG9jb2wKKyAgICBjYXNlIHVuc3VwcG9ydGVkQ2xpZW50VHlwZQorICAgIAorICAgIAorICAgIC8vLyBJbml0aWFsaXplIGEgVEFwcGxpY2F0aW9uRXJyb3Igd2l0aCBhIFRocmlmdCBlcnJvciBjb2RlCisgICAgLy8vIE5vcm1hbGx5IHRoaXMgd291bGQgYmUgYWNoaWV2ZWQgd2l0aCBSYXdSZXByZXNlbnRhYmxlIGhvd2V2ZXIKKyAgICAvLy8gYnkgZG9pbmcgdGhpcyB3ZSBjYW4gYWxsb3cgZm9yIGFzc29jaWF0ZWQgcHJvcGVydGllcyBvbiBlbnVtIGNhc2VzIGZvcgorICAgIC8vLyBjYXNlIHNwZWNpZmljIGNvbnRleHQgZGF0YSBpbiBhIFN3aWZ0eSwgdHlwZS1zYWZlIG1hbm5lci4KKyAgICAvLy8KKyAgICAvLy8gLSBwYXJhbWV0ZXIgdGhyaWZ0RXJyb3JDb2RlOiBJbnRlZ2VyIFRBcHBsaWNhdGlvbkVycm9yKGV4Y2VwdGlvbikgZXJyb3IgY29kZS4gIAorICAgIC8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQgdG8gMCAoLnVua25vd24pCisgICAgcHVibGljIGluaXQodGhyaWZ0RXJyb3JDb2RlOiBJbnQpIHsKKyAgICAgIHN3aXRjaCB0aHJpZnRFcnJvckNvZGUgeworICAgICAgY2FzZSAxOiAgc2VsZiA9IC51bmtub3duTWV0aG9kKG1ldGhvZE5hbWU6IG5pbCkKKyAgICAgIGNhc2UgMjogIHNlbGYgPSAuaW52YWxpZE1lc3NhZ2VUeXBlCisgICAgICBjYXNlIDM6ICBzZWxmID0gLndyb25nTWV0aG9kTmFtZShtZXRob2ROYW1lOiBuaWwpCisgICAgICBjYXNlIDQ6ICBzZWxmID0gLmJhZFNlcXVlbmNlSWQKKyAgICAgIGNhc2UgNTogIHNlbGYgPSAubWlzc2luZ1Jlc3VsdChtZXRob2ROYW1lOiBuaWwpCisgICAgICBjYXNlIDY6ICBzZWxmID0gLmludGVybmFsRXJyb3IKKyAgICAgIGNhc2UgNzogIHNlbGYgPSAucHJvdG9jb2xFcnJvcgorICAgICAgY2FzZSA4OiAgc2VsZiA9IC5pbnZhbGlkUHJvdG9jb2wKKyAgICAgIGNhc2UgOTogIHNlbGYgPSAuaW52YWxpZFRyYW5zZm9ybQorICAgICAgY2FzZSAxMDogc2VsZiA9IC51bnN1cHBvcnRlZENsaWVudFR5cGUKKyAgICAgIGRlZmF1bHQ6IHNlbGYgPSAudW5rbm93bgorICAgICAgfQorICAgIH0KKyAgICBwdWJsaWMgdmFyIHRocmlmdEVycm9yQ29kZTogSW50IHsKKyAgICAgIHN3aXRjaCBzZWxmIHsKKyAgICAgIGNhc2UgLnVua25vd246ICAgICAgICAgICAgICAgIHJldHVybiAwCisgICAgICBjYXNlIC51bmtub3duTWV0aG9kOiAgICAgICAgICByZXR1cm4gMQorICAgICAgY2FzZSAuaW52YWxpZE1lc3NhZ2VUeXBlOiAgICAgcmV0dXJuIDIKKyAgICAgIGNhc2UgLndyb25nTWV0aG9kTmFtZTogICAgICAgIHJldHVybiAzCisgICAgICBjYXNlIC5iYWRTZXF1ZW5jZUlkOiAgICAgICAgICByZXR1cm4gNAorICAgICAgY2FzZSAubWlzc2luZ1Jlc3VsdDogICAgICAgICAgcmV0dXJuIDUKKyAgICAgIGNhc2UgLmludGVybmFsRXJyb3I6ICAgICAgICAgIHJldHVybiA2CisgICAgICBjYXNlIC5wcm90b2NvbEVycm9yOiAgICAgICAgICByZXR1cm4gNworICAgICAgY2FzZSAuaW52YWxpZFByb3RvY29sOiAgICAgICAgcmV0dXJuIDgKKyAgICAgIGNhc2UgLmludmFsaWRUcmFuc2Zvcm06ICAgICAgIHJldHVybiA5CisgICAgICBjYXNlIC51bnN1cHBvcnRlZENsaWVudFR5cGU6ICByZXR1cm4gMTAKKyAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIHZhciBkZXNjcmlwdGlvbjogU3RyaW5nIHsKKyAgICAgIC8vLyBPdXRwdXQgImZvciAjbWV0aG9kTmFtZSIgaWYgbWV0aG9kIGlzIG5vdCBuaWwgZWxzZSBlbXB0eQorICAgICAgbGV0IG1ldGhvZFVud3JhcDogKFN0cmluZz8pIC0+IFN0cmluZyA9ICB7IG1ldGhvZCBpbgorICAgICAgICByZXR1cm4gIlwobWV0aG9kID09IG5pbCA/ICIiIDogIiBmb3IgXChtZXRob2QgPz8gIiIpIikiCisgICAgICB9CisgICAgICBzd2l0Y2ggc2VsZiB7CisgICAgICBjYXNlIC51bmtub3duOiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIlVua25vd24gVEFwcGxpY2F0aW9uRXJyb3IiCisgICAgICBjYXNlIC51bmtub3duTWV0aG9kKGxldCBtZXRob2QpOiAgICByZXR1cm4gIlVua25vd24gTWV0aG9kXChtZXRob2RVbndyYXAobWV0aG9kKSkiCisgICAgICBjYXNlIC5pbnZhbGlkTWVzc2FnZVR5cGU6ICAgICAgICAgICByZXR1cm4gIkludmFsaWQgTWVzc2FnZSBUeXBlIgorICAgICAgY2FzZSAud3JvbmdNZXRob2ROYW1lKGxldCBtZXRob2QpOiAgcmV0dXJuICJXcm9uZyBNZXRob2QgTmFtZVwobWV0aG9kVW53cmFwKG1ldGhvZCkpIgorICAgICAgY2FzZSAuYmFkU2VxdWVuY2VJZDogICAgICAgICAgICAgICAgcmV0dXJuICJCYWQgU2VxdWVuY2UgSUQiCisgICAgICBjYXNlIC5taXNzaW5nUmVzdWx0KGxldCBtZXRob2QpOiAgICByZXR1cm4gIk1pc3NpbmcgUmVzdWx0XChtZXRob2RVbndyYXAobWV0aG9kKSkiCisgICAgICBjYXNlIC5pbnRlcm5hbEVycm9yOiAgICAgICAgICAgICAgICByZXR1cm4gIkludGVybmFsIEVycm9yIgorICAgICAgY2FzZSAucHJvdG9jb2xFcnJvcjogICAgICAgICAgICAgICAgcmV0dXJuICJQcm90b2NvbCBFcnJvciIKKyAgICAgIGNhc2UgLmludmFsaWRQcm90b2NvbDogICAgICAgICAgICAgIHJldHVybiAiSW52YWxpZCBQcm90b2NvbCIKKyAgICAgIGNhc2UgLmludmFsaWRUcmFuc2Zvcm06ICAgICAgICAgICAgIHJldHVybiAiSW52YWxpZCBUcmFuc2Zvcm0iCisgICAgICBjYXNlIC51bnN1cHBvcnRlZENsaWVudFR5cGU6ICAgICAgICByZXR1cm4gIlVuc3VwcG9ydGVkIENsaWVudCBUeXBlIgorICAgICAgfQorICAgIH0KKyAgfQorCisgIHB1YmxpYyBpbml0KCkgeyB9CisgIAorICBwdWJsaWMgaW5pdCh0aHJpZnRFcnJvckNvZGUgY29kZTogSW50LCBtZXNzYWdlOiBTdHJpbmc/ID0gbmlsKSB7CisgICAgc2VsZi5lcnJvciA9IENvZGUodGhyaWZ0RXJyb3JDb2RlOiBjb2RlKQorICAgIHNlbGYubWVzc2FnZSA9IG1lc3NhZ2UKKyAgfQorICAKKyAgcHVibGljIHZhciBlcnJvcjogQ29kZSA9IC51bmtub3duCisgIHB1YmxpYyB2YXIgbWVzc2FnZTogU3RyaW5nPyA9IG5pbAorICBwdWJsaWMgc3RhdGljIHZhciBkZWZhdWx0Q2FzZTogQ29kZSB7IHJldHVybiAudW5rbm93biB9Cit9CisKK2V4dGVuc2lvbiBUQXBwbGljYXRpb25FcnJvciA6IFRTZXJpYWxpemFibGUgeworICBwdWJsaWMgc3RhdGljIHZhciB0aHJpZnRUeXBlOiBUVHlwZSB7IHJldHVybiAuc3RydWN0IH0KKyAgCisgIHB1YmxpYyBzdGF0aWMgZnVuYyByZWFkKGZyb20gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIC0+IFRBcHBsaWNhdGlvbkVycm9yIHsKKyAgICB2YXIgZXJyb3JDb2RlOiBJbnQgPSAwCisgICAgdmFyIG1lc3NhZ2U6IFN0cmluZz8gPSBuaWwKKyAgICBfID0gdHJ5IHByb3RvLnJlYWRTdHJ1Y3RCZWdpbigpCisgICAgZmllbGRzOiB3aGlsZSB0cnVlIHsKKyAgICAgIGxldCAoXywgZmllbGRUeXBlLCBmaWVsZElEKSA9IHRyeSBwcm90by5yZWFkRmllbGRCZWdpbigpCisgICAgICAKKyAgICAgIHN3aXRjaCAoZmllbGRJRCwgZmllbGRUeXBlKSB7CisgICAgICBjYXNlIChfLCAuc3RvcCk6CisgICAgICAgIGJyZWFrIGZpZWxkcworICAgICAgY2FzZSAoMSwgLnN0cmluZyk6CisgICAgICAgIG1lc3NhZ2UgPSB0cnkgcHJvdG8ucmVhZCgpCisgICAgICBjYXNlICgyLCAuaTMyKToKKyAgICAgICAgZXJyb3JDb2RlID0gSW50KHRyeSBwcm90by5yZWFkKCkgYXMgSW50MzIpCisgICAgICAKKyAgICAgIGNhc2UgbGV0IChfLCB1bmtub3duVHlwZSk6CisgICAgICAgIHRyeSBwcm90by5za2lwKHR5cGU6IHVua25vd25UeXBlKQorICAgICAgfQorICAgICAgCisgICAgICB0cnkgcHJvdG8ucmVhZEZpZWxkRW5kKCkKKyAgICB9CisgICAgdHJ5IHByb3RvLnJlYWRTdHJ1Y3RFbmQoKQorICAgIHJldHVybiBUQXBwbGljYXRpb25FcnJvcih0aHJpZnRFcnJvckNvZGU6IGVycm9yQ29kZSwgbWVzc2FnZTogbWVzc2FnZSkKKyAgfQorCisgIHB1YmxpYyBmdW5jIHdyaXRlKHRvIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyB7CisgICAgdHJ5IHByb3RvLndyaXRlU3RydWN0QmVnaW4obmFtZTogIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpCisgICAgCisgICAgdHJ5IHByb3RvLndyaXRlRmllbGRCZWdpbihuYW1lOiAibWVzc2FnZSIsIHR5cGU6IC5zdHJpbmcsIGZpZWxkSUQ6IDEpCisgICAgdHJ5IHByb3RvLndyaXRlKG1lc3NhZ2UgPz8gIiIpCisgICAgdHJ5IHByb3RvLndyaXRlRmllbGRFbmQoKQorICAgIAorICAgIHRyeSBwcm90by53cml0ZUZpZWxkQmVnaW4obmFtZTogInR5cGUiLCB0eXBlOiAuaTMyLCBmaWVsZElEOiAyKQorICAgIGxldCB2YWwgPSBJbnQzMihlcnJvci50aHJpZnRFcnJvckNvZGUpCisgICAgdHJ5IHByb3RvLndyaXRlKHZhbCkKKyAgICB0cnkgcHJvdG8ud3JpdGVGaWVsZEVuZCgpCisgICAgdHJ5IHByb3RvLndyaXRlRmllbGRTdG9wKCkKKyAgICB0cnkgcHJvdG8ud3JpdGVTdHJ1Y3RFbmQoKQorICB9CisgIAorICBwdWJsaWMgdmFyIGhhc2hWYWx1ZTogSW50IHsKKyAgICByZXR1cm4gZXJyb3IudGhyaWZ0RXJyb3JDb2RlICYrIChtZXNzYWdlPy5oYXNoVmFsdWUgPz8gMCkKKyAgfQorfQorCitwdWJsaWMgZnVuYyA9PShsaHM6IFRBcHBsaWNhdGlvbkVycm9yLCByaHM6IFRBcHBsaWNhdGlvbkVycm9yKSAtPiBCb29sIHsKKyAgcmV0dXJuIGxocy5lcnJvci50aHJpZnRFcnJvckNvZGUgPT0gcmhzLmVycm9yLnRocmlmdEVycm9yQ29kZSAmJiBsaHMubWVzc2FnZSA9PSByaHMubWVzc2FnZQorfQpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1NvdXJjZXMvVEJpbmFyeS5zd2lmdCBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RCaW5hcnkuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJlNTY0NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RCaW5hcnkuc3dpZnQKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitpbXBvcnQgRm91bmRhdGlvbgorCitleHRlbnNpb24gRGF0YSA6IFRTZXJpYWxpemFibGUgeworICBwdWJsaWMgc3RhdGljIHZhciB0aHJpZnRUeXBlOiBUVHlwZSB7IHJldHVybiAuc3RyaW5nIH0KKyAgCisgIHB1YmxpYyBzdGF0aWMgZnVuYyByZWFkKGZyb20gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIC0+IERhdGEgeworICAgIHJldHVybiB0cnkgcHJvdG8ucmVhZCgpIGFzIERhdGEKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGUodG8gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIHsKKyAgICB0cnkgcHJvdG8ud3JpdGUoc2VsZikKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1NvdXJjZXMvVEJpbmFyeVByb3RvY29sLnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvVEJpbmFyeVByb3RvY29sLnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5NzI0OWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9UQmluYXJ5UHJvdG9jb2wuc3dpZnQKQEAgLTAsMCArMSwzODQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworaW1wb3J0IEZvdW5kYXRpb24KKworcHVibGljIHN0cnVjdCBUQmluYXJ5UHJvdG9jb2xWZXJzaW9uIHsKKyAgc3RhdGljIGxldCB2ZXJzaW9uMSAgICA9IEludDMyKGJpdFBhdHRlcm46IDB4ODAwMTAwMDApCisgIHN0YXRpYyBsZXQgdmVyc2lvbk1hc2sgPSBJbnQzMihiaXRQYXR0ZXJuOiAweGZmZmYwMDAwKQorfQorCitwdWJsaWMgY2xhc3MgVEJpbmFyeVByb3RvY29sOiBUUHJvdG9jb2wgeworICBwdWJsaWMgdmFyIG1lc3NhZ2VTaXplTGltaXQ6IFVJbnQzMiAgPSAwCisgIAorICBwdWJsaWMgdmFyIHRyYW5zcG9ydDogVFRyYW5zcG9ydAorICAKKyAgLy8gY2xhc3MgbGV2ZWwgcHJvcGVydGllcyBmb3Igc2V0dGluZyBnbG9iYWwgY29uZmlnICh1c2VmdWwgZm9yIHNlcnZlciBpbiBsaWV1IG9mIEZhY3RvcnkgZGVzaWduKQorICBwdWJsaWMgc3RhdGljIHZhciBzdHJpY3RSZWFkOiBCb29sID0gZmFsc2UKKyAgcHVibGljIHN0YXRpYyB2YXIgc3RyaWN0V3JpdGU6IEJvb2wgPSB0cnVlCisKKyAgcHJpdmF0ZSB2YXIgc3RyaWN0UmVhZDogQm9vbAorICBwcml2YXRlIHZhciBzdHJpY3RXcml0ZTogQm9vbAorICAKKyAgdmFyIGN1cnJlbnRNZXNzYWdlTmFtZTogU3RyaW5nPworICB2YXIgY3VycmVudEZpZWxkTmFtZTogU3RyaW5nPworICAKKyAgCisgIHB1YmxpYyBjb252ZW5pZW5jZSBpbml0KHRyYW5zcG9ydDogVFRyYW5zcG9ydCwgc3RyaWN0UmVhZDogQm9vbCwgc3RyaWN0V3JpdGU6IEJvb2wpIHsKKyAgICBzZWxmLmluaXQob246IHRyYW5zcG9ydCkKKyAgICBzZWxmLnN0cmljdFJlYWQgPSBzdHJpY3RSZWFkCisgICAgc2VsZi5zdHJpY3RXcml0ZSA9IHN0cmljdFdyaXRlCisgIH0KKyAgCisgIHB1YmxpYyByZXF1aXJlZCBpbml0KG9uIHRyYW5zcG9ydDogVFRyYW5zcG9ydCkgeworICAgIHNlbGYudHJhbnNwb3J0ID0gdHJhbnNwb3J0CisgICAgc2VsZi5zdHJpY3RXcml0ZSA9IFRCaW5hcnlQcm90b2NvbC5zdHJpY3RXcml0ZQorICAgIHNlbGYuc3RyaWN0UmVhZCA9IFRCaW5hcnlQcm90b2NvbC5zdHJpY3RSZWFkCisgIH0KKyAgCisgIGZ1bmMgcmVhZFN0cmluZ0JvZHkoXyBzaXplOiBJbnQpIHRocm93cyAtPiBTdHJpbmcgeworICAgIAorICAgIHZhciBkYXRhID0gRGF0YSgpCisgICAgdHJ5IFByb3RvY29sVHJhbnNwb3J0VHJ5KGVycm9yOiBUUHJvdG9jb2xFcnJvcihtZXNzYWdlOiAiVHJhbnNwb3J0IHJlYWQgZmFpbGVkIikpIHsKKyAgICAgIGRhdGEgPSB0cnkgc2VsZi50cmFuc3BvcnQucmVhZEFsbChzaXplOiBzaXplKQorICAgIH0KKyAgICAKKyAgICByZXR1cm4gU3RyaW5nKGRhdGE6IGRhdGEsIGVuY29kaW5nOiBTdHJpbmcuRW5jb2RpbmcudXRmOCkgPz8gIiIKKyAgfQorICAKKyAgLy8vIE1hcms6IC0gVFByb3RvY29sCisgIAorICBwdWJsaWMgZnVuYyByZWFkTWVzc2FnZUJlZ2luKCkgdGhyb3dzIC0+IChTdHJpbmcsIFRNZXNzYWdlVHlwZSwgSW50MzIpIHsKKyAgICBsZXQgc2l6ZTogSW50MzIgPSB0cnkgcmVhZCgpCisgICAgdmFyIG1lc3NhZ2VOYW1lID0gIiIKKyAgICB2YXIgdHlwZSA9IFRNZXNzYWdlVHlwZS5leGNlcHRpb24KKyAgICAKKyAgICBpZiBzaXplIDwgMCB7CisgICAgICBsZXQgdmVyc2lvbiA9IHNpemUgJiBUQmluYXJ5UHJvdG9jb2xWZXJzaW9uLnZlcnNpb25NYXNrCisgICAgICBpZiB2ZXJzaW9uICE9IFRCaW5hcnlQcm90b2NvbFZlcnNpb24udmVyc2lvbjEgeworICAgICAgICB0aHJvdyBUUHJvdG9jb2xFcnJvcihlcnJvcjogLmJhZFZlcnNpb24oZXhwZWN0ZWQ6ICJcKFRCaW5hcnlQcm90b2NvbFZlcnNpb24udmVyc2lvbjEpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdDogIlwodmVyc2lvbikiKSkKKyAgICAgIH0KKyAgICAgIHR5cGUgPSBUTWVzc2FnZVR5cGUocmF3VmFsdWU6IEludDMyKHNpemUpICYgMHgwMEZGKSA/PyB0eXBlCisgICAgICBtZXNzYWdlTmFtZSA9IHRyeSByZWFkKCkKKyAgICB9IGVsc2UgeworICAgICAgaWYgc3RyaWN0UmVhZCB7CisgICAgICAgIGxldCBlcnJvck1lc3NhZ2UgPSAiTWlzc2luZyBtZXNzYWdlIHZlcnNpb24sIG9sZCBjbGllbnQ/IE1lc3NhZ2UgTmFtZTogXChjdXJyZW50TWVzc2FnZU5hbWUgPz8gIiIpIgorICAgICAgICB0aHJvdyBUUHJvdG9jb2xFcnJvcihlcnJvcjogLmludmFsaWREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBlcnJvck1lc3NhZ2UpCisgICAgICB9CisgICAgICBpZiBtZXNzYWdlU2l6ZUxpbWl0ID4gMCAmJiBzaXplID4gSW50MzIobWVzc2FnZVNpemVMaW1pdCkgeworICAgICAgICB0aHJvdyBUUHJvdG9jb2xFcnJvcihlcnJvcjogLnNpemVMaW1pdChsaW1pdDogSW50KG1lc3NhZ2VTaXplTGltaXQpLCBnb3Q6IEludChzaXplKSkpCisgICAgICB9CisgICAgICAKKyAgICAgIG1lc3NhZ2VOYW1lID0gdHJ5IHJlYWRTdHJpbmdCb2R5KEludChzaXplKSkKKyAgICAgIHR5cGUgPSBUTWVzc2FnZVR5cGUocmF3VmFsdWU6IEludDMyKHRyeSByZWFkKCkgYXMgVUludDgpKSA/PyB0eXBlCisgICAgfQorICAgIAorICAgIGxldCBzZXFJRDogSW50MzIgPSB0cnkgcmVhZCgpCisgICAgcmV0dXJuIChtZXNzYWdlTmFtZSwgdHlwZSwgc2VxSUQpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRNZXNzYWdlRW5kKCkgdGhyb3dzIHsKKyAgICByZXR1cm4KKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZFN0cnVjdEJlZ2luKCkgdGhyb3dzIC0+IFN0cmluZyB7CisgICAgcmV0dXJuICIiCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRTdHJ1Y3RFbmQoKSB0aHJvd3MgeworICAgIHJldHVybgorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkRmllbGRCZWdpbigpIHRocm93cyAtPiAoU3RyaW5nLCBUVHlwZSwgSW50MzIpIHsKKyAgICAKKyAgICBsZXQgZmllbGRUeXBlID0gVFR5cGUocmF3VmFsdWU6IEludDMyKHRyeSByZWFkKCkgYXMgVUludDgpKSA/PyBUVHlwZS5zdG9wCisgICAgdmFyIGZpZWxkSUQ6IEludDMyID0gMAorICAgIAorICAgIGlmIGZpZWxkVHlwZSAhPSAuc3RvcCB7CisgICAgICBmaWVsZElEID0gSW50MzIodHJ5IHJlYWQoKSBhcyBJbnQxNikKKyAgICB9CisgICAgCisgICAgcmV0dXJuICgiIiwgZmllbGRUeXBlLCBmaWVsZElEKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkRmllbGRFbmQoKSB0aHJvd3MgeworICAgIHJldHVybgorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkTWFwQmVnaW4oKSB0aHJvd3MgLT4gKFRUeXBlLCBUVHlwZSwgSW50MzIpIHsKKyAgICB2YXIgcmF3ID0gSW50MzIodHJ5IHJlYWQoKSBhcyBVSW50OCkKKyAgICBndWFyZCBsZXQga2V5VHlwZSA9IFRUeXBlKHJhd1ZhbHVlOiByYXcpIGVsc2UgeworICAgICAgdGhyb3cgVFByb3RvY29sRXJyb3IobWVzc2FnZTogIlVua25vd24gdmFsdWUgZm9yIGtleVR5cGUgVFR5cGU6IFwocmF3KSIpCisgICAgfQorICAgIAorICAgIHJhdyA9IEludDMyKHRyeSByZWFkKCkgYXMgVUludDgpCisgICAgZ3VhcmQgbGV0IHZhbHVlVHlwZSA9IFRUeXBlKHJhd1ZhbHVlOiByYXcpIGVsc2UgeworICAgICAgdGhyb3cgVFByb3RvY29sRXJyb3IobWVzc2FnZTogIlVua25vd24gdmFsdWUgZm9yIHZhbHVlVHlwZSBUVHlwZTogXChyYXcpIikKKyAgICB9CisgICAgbGV0IHNpemU6IEludDMyID0gdHJ5IHJlYWQoKQorICAgIAorICAgIHJldHVybiAoa2V5VHlwZSwgdmFsdWVUeXBlLCBzaXplKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkTWFwRW5kKCkgdGhyb3dzIHsKKyAgICByZXR1cm4KKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZFNldEJlZ2luKCkgdGhyb3dzIC0+IChUVHlwZSwgSW50MzIpIHsKKyAgICBsZXQgcmF3ID0gSW50MzIodHJ5IHJlYWQoKSBhcyBVSW50OCkKKyAgICBndWFyZCBsZXQgZWxlbWVudFR5cGUgPSBUVHlwZShyYXdWYWx1ZTogcmF3KSBlbHNlIHsKKyAgICAgIHRocm93IFRQcm90b2NvbEVycm9yKG1lc3NhZ2U6ICJVbmtub3duIHZhbHVlIGZvciBlbGVtZW50VHlwZSBUVHlwZTogXChyYXcpIikKKyAgICB9CisgICAgCisgICAgbGV0IHNpemU6IEludDMyID0gdHJ5IHJlYWQoKQorICAgIAorICAgIHJldHVybiAoZWxlbWVudFR5cGUsIHNpemUpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRTZXRFbmQoKSB0aHJvd3MgeworICAgIHJldHVybgorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkTGlzdEJlZ2luKCkgdGhyb3dzIC0+IChUVHlwZSwgSW50MzIpIHsKKyAgICBsZXQgcmF3ID0gSW50MzIodHJ5IHJlYWQoKSBhcyBVSW50OCkKKyAgICBndWFyZCBsZXQgZWxlbWVudFR5cGUgPSBUVHlwZShyYXdWYWx1ZTogcmF3KSBlbHNlIHsKKyAgICAgIHRocm93IFRQcm90b2NvbEVycm9yKG1lc3NhZ2U6ICJVbmtub3duIHZhbHVlIGZvciBlbGVtZW50VHlwZSBUVHlwZTogXChyYXcpIikKKyAgICB9CisgICAgbGV0IHNpemU6IEludDMyID0gdHJ5IHJlYWQoKQorICAgIAorICAgIHJldHVybiAoZWxlbWVudFR5cGUsIHNpemUpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRMaXN0RW5kKCkgdGhyb3dzIHsKKyAgICByZXR1cm4KKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZCgpIHRocm93cyAtPiBTdHJpbmcgeworICAgIGxldCBkYXRhOiBEYXRhID0gdHJ5IHJlYWQoKQorICAgIGd1YXJkIGxldCBzdHIgPSBTdHJpbmcuaW5pdChkYXRhOiBkYXRhLCBlbmNvZGluZzogLnV0ZjgpIGVsc2UgeworICAgICAgdGhyb3cgVFByb3RvY29sRXJyb3IoZXJyb3I6IC5pbnZhbGlkRGF0YSwgbWVzc2FnZTogIkNvdWxkbid0IGVuY29kZSBVVEYtOCBmcm9tIGRhdGEgcmVhZCIpCisgICAgfQorICAgIHJldHVybiBzdHIKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZCgpIHRocm93cyAtPiBCb29sIHsKKyAgICByZXR1cm4gKHRyeSByZWFkKCkgYXMgVUludDgpID09IDEKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZCgpIHRocm93cyAtPiBVSW50OCB7CisgICAgdmFyIGJ1ZmYgPSBEYXRhKCkKKyAgICB0cnkgUHJvdG9jb2xUcmFuc3BvcnRUcnkoZXJyb3I6IFRQcm90b2NvbEVycm9yKG1lc3NhZ2U6ICJUcmFuc3BvcnQgUmVhZCBGYWlsZWQiKSkgeworICAgICAgYnVmZiA9IHRyeSBzZWxmLnRyYW5zcG9ydC5yZWFkQWxsKHNpemU6IDEpCisgICAgfQorICAgIHJldHVybiBidWZmWzBdCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gSW50MTYgeworICAgIHZhciBidWZmID0gRGF0YSgpCisgICAgdHJ5IFByb3RvY29sVHJhbnNwb3J0VHJ5KGVycm9yOiBUUHJvdG9jb2xFcnJvcihtZXNzYWdlOiAiVHJhbnNwb3J0IFJlYWQgRmFpbGVkIikpIHsKKyAgICAgIGJ1ZmYgPSB0cnkgc2VsZi50cmFuc3BvcnQucmVhZEFsbChzaXplOiAyKQorICAgIH0KKyAgICB2YXIgcmV0ID0gSW50MTYoYnVmZlswXSAmIDB4ZmYpIDw8IDgKKyAgICByZXQgfD0gICAgSW50MTYoYnVmZlsxXSAmIDB4ZmYpCisgICAgcmV0dXJuIHJldAorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkKCkgdGhyb3dzIC0+IEludDMyIHsKKyAgICB2YXIgYnVmZiA9IERhdGEoKQorICAgIHRyeSBQcm90b2NvbFRyYW5zcG9ydFRyeShlcnJvcjogVFByb3RvY29sRXJyb3IobWVzc2FnZTogIlRyYW5zcG9ydCBSZWFkIEZhaWxlZCIpKSB7CisgICAgICBidWZmID0gdHJ5IHNlbGYudHJhbnNwb3J0LnJlYWRBbGwoc2l6ZTogNCkKKyAgICB9CisgICAgdmFyIHJldCA9IEludDMyKGJ1ZmZbMF0gJiAweGZmKSA8PCAyNAorICAgIHJldCB8PSAgICBJbnQzMihidWZmWzFdICYgMHhmZikgPDwgMTYKKyAgICByZXQgfD0gICAgSW50MzIoYnVmZlsyXSAmIDB4ZmYpIDw8IDgKKyAgICByZXQgfD0gICAgSW50MzIoYnVmZlszXSAmIDB4ZmYpCisgICAgCisgICAgcmV0dXJuIHJldAorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkKCkgdGhyb3dzIC0+IEludDY0IHsKKyAgICB2YXIgYnVmZiA9IERhdGEoKQorICAgIHRyeSBQcm90b2NvbFRyYW5zcG9ydFRyeShlcnJvcjogVFByb3RvY29sRXJyb3IobWVzc2FnZTogIlRyYW5zcG9ydCBSZWFkIEZhaWxlZCIpKSB7CisgICAgICBidWZmID0gdHJ5IHNlbGYudHJhbnNwb3J0LnJlYWRBbGwoc2l6ZTogOCkKKyAgICB9CisgICAgdmFyIHJldCA9IEludDY0KGJ1ZmZbMF0gJiAweGZmKSA8PCA1NgorICAgIHJldCB8PSAgICBJbnQ2NChidWZmWzFdICYgMHhmZikgPDwgNDgKKyAgICByZXQgfD0gICAgSW50NjQoYnVmZlsyXSAmIDB4ZmYpIDw8IDQwCisgICAgcmV0IHw9ICAgIEludDY0KGJ1ZmZbM10gJiAweGZmKSA8PCAzMgorICAgIHJldCB8PSAgICBJbnQ2NChidWZmWzRdICYgMHhmZikgPDwgMjQKKyAgICByZXQgfD0gICAgSW50NjQoYnVmZls1XSAmIDB4ZmYpIDw8IDE2CisgICAgcmV0IHw9ICAgIEludDY0KGJ1ZmZbNl0gJiAweGZmKSA8PCA4CisgICAgcmV0IHw9ICAgIEludDY0KGJ1ZmZbN10gJiAweGZmKQorICAgIAorICAgIHJldHVybiByZXQKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZCgpIHRocm93cyAtPiBEb3VibGUgeworICAgIGxldCB2YWwgPSB0cnkgcmVhZCgpIGFzIEludDY0CisgICAgcmV0dXJuIERvdWJsZShiaXRQYXR0ZXJuOiBVSW50NjQoYml0UGF0dGVybjogdmFsKSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZCgpIHRocm93cyAtPiBEYXRhIHsKKyAgICBsZXQgc2l6ZSA9IEludCh0cnkgcmVhZCgpIGFzIEludDMyKQorICAgIHZhciBkYXRhID0gRGF0YSgpCisgICAgdHJ5IFByb3RvY29sVHJhbnNwb3J0VHJ5KGVycm9yOiBUUHJvdG9jb2xFcnJvcihtZXNzYWdlOiAiVHJhbnNwb3J0IFJlYWQgRmFpbGVkIikpIHsKKyAgICAgIGRhdGEgPSB0cnkgc2VsZi50cmFuc3BvcnQucmVhZEFsbChzaXplOiBzaXplKQorICAgIH0KKyAgICAKKyAgICByZXR1cm4gZGF0YQorICB9CisgIAorICAvLyBXcml0ZSBtZXRob2RzCisgIAorICBwdWJsaWMgZnVuYyB3cml0ZU1lc3NhZ2VCZWdpbihuYW1lOiBTdHJpbmcsIHR5cGUgbWVzc2FnZVR5cGU6IFRNZXNzYWdlVHlwZSwgc2VxdWVuY2VJRDogSW50MzIpIHRocm93cyB7CisgICAgaWYgc3RyaWN0V3JpdGUgeworICAgICAgbGV0IHZlcnNpb24gPSBUQmluYXJ5UHJvdG9jb2xWZXJzaW9uLnZlcnNpb24xIHwgSW50MzIobWVzc2FnZVR5cGUucmF3VmFsdWUpCisgICAgICB0cnkgd3JpdGUodmVyc2lvbikKKyAgICAgIHRyeSB3cml0ZShuYW1lKQorICAgICAgdHJ5IHdyaXRlKHNlcXVlbmNlSUQpCisgICAgfSBlbHNlIHsKKyAgICAgIHRyeSB3cml0ZShuYW1lKQorICAgICAgdHJ5IHdyaXRlKFVJbnQ4KG1lc3NhZ2VUeXBlLnJhd1ZhbHVlKSkKKyAgICAgIHRyeSB3cml0ZShzZXF1ZW5jZUlEKQorICAgIH0KKyAgICBjdXJyZW50TWVzc2FnZU5hbWUgPSBuYW1lCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlTWVzc2FnZUVuZCgpIHRocm93cyB7CisgICAgY3VycmVudE1lc3NhZ2VOYW1lID0gbmlsCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlU3RydWN0QmVnaW4obmFtZTogU3RyaW5nKSB0aHJvd3MgeworICAgIHJldHVybgorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZVN0cnVjdEVuZCgpIHRocm93cyB7CisgICAgcmV0dXJuCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlRmllbGRCZWdpbihuYW1lOiBTdHJpbmcsIHR5cGUgZmllbGRUeXBlOiBUVHlwZSwgZmllbGRJRDogSW50MzIpIHRocm93cyB7CisgICAgdHJ5IHdyaXRlKFVJbnQ4KGZpZWxkVHlwZS5yYXdWYWx1ZSkpCisgICAgdHJ5IHdyaXRlKEludDE2KGZpZWxkSUQpKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZUZpZWxkU3RvcCgpIHRocm93cyB7CisgICAgdHJ5IHdyaXRlKFVJbnQ4KFRUeXBlLnN0b3AucmF3VmFsdWUpKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZUZpZWxkRW5kKCkgdGhyb3dzIHsKKyAgICByZXR1cm4KKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVNYXBCZWdpbihrZXlUeXBlOiBUVHlwZSwgdmFsdWVUeXBlOiBUVHlwZSwgc2l6ZTogSW50MzIpIHRocm93cyB7CisgICAgdHJ5IHdyaXRlKFVJbnQ4KGtleVR5cGUucmF3VmFsdWUpKQorICAgIHRyeSB3cml0ZShVSW50OCh2YWx1ZVR5cGUucmF3VmFsdWUpKQorICAgIHRyeSB3cml0ZShzaXplKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZU1hcEVuZCgpIHRocm93cyB7CisgICAgcmV0dXJuCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlU2V0QmVnaW4oZWxlbWVudFR5cGU6IFRUeXBlLCBzaXplOiBJbnQzMikgdGhyb3dzIHsKKyAgICB0cnkgd3JpdGUoVUludDgoZWxlbWVudFR5cGUucmF3VmFsdWUpKQorICAgIHRyeSB3cml0ZShzaXplKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZVNldEVuZCgpIHRocm93cyB7CisgICAgcmV0dXJuCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlTGlzdEJlZ2luKGVsZW1lbnRUeXBlOiBUVHlwZSwgc2l6ZTogSW50MzIpIHRocm93cyB7CisgICAgdHJ5IHdyaXRlKFVJbnQ4KGVsZW1lbnRUeXBlLnJhd1ZhbHVlKSkKKyAgICB0cnkgd3JpdGUoc2l6ZSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVMaXN0RW5kKCkgdGhyb3dzIHsKKyAgICByZXR1cm4KKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGUoXyB2YWx1ZTogU3RyaW5nKSB0aHJvd3MgeworICAgIHRyeSB3cml0ZSh2YWx1ZS5kYXRhKHVzaW5nOiAudXRmOCkhKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZShfIHZhbHVlOiBCb29sKSB0aHJvd3MgeworICAgIGxldCBieXRlVmFsOiBVSW50OCA9IHZhbHVlID8gMSA6IDAKKyAgICB0cnkgd3JpdGUoYnl0ZVZhbCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGUoXyB2YWx1ZTogVUludDgpIHRocm93cyB7CisgICAgbGV0IGJ1ZmYgPSBEYXRhKGJ5dGVzOiBbdmFsdWVdKQorICAgIAorICAgIHRyeSBQcm90b2NvbFRyYW5zcG9ydFRyeShlcnJvcjogVFByb3RvY29sRXJyb3IobWVzc2FnZTogIlRyYW5zcG9ydCB3cml0ZSBmYWlsZWQiKSkgeworICAgICAgdHJ5IHNlbGYudHJhbnNwb3J0LndyaXRlKGRhdGE6IGJ1ZmYpCisgICAgfQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZShfIHZhbHVlOiBJbnQxNikgdGhyb3dzIHsKKyAgICB2YXIgYnVmZiA9IERhdGEoKQorICAgIGJ1ZmYuYXBwZW5kKERhdGEoYnl0ZXM6IFtVSW50OCgweGZmICYgKHZhbHVlID4+IDgpKV0pKQorICAgIGJ1ZmYuYXBwZW5kKERhdGEoYnl0ZXM6IFtVSW50OCgweGZmICYgKHZhbHVlKSldKSkKKyAgICB0cnkgUHJvdG9jb2xUcmFuc3BvcnRUcnkoZXJyb3I6IFRQcm90b2NvbEVycm9yKG1lc3NhZ2U6ICJUcmFuc3BvcnQgd3JpdGUgZmFpbGVkIikpIHsKKyAgICAgIHRyeSBzZWxmLnRyYW5zcG9ydC53cml0ZShkYXRhOiBidWZmKQorICAgIH0KKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGUoXyB2YWx1ZTogSW50MzIpIHRocm93cyB7CisgICAgdmFyIGJ1ZmYgPSBEYXRhKCkKKyAgICBidWZmLmFwcGVuZChEYXRhKGJ5dGVzOiBbVUludDgoMHhmZiAmICh2YWx1ZSA+PiAyNCkpXSkpCisgICAgYnVmZi5hcHBlbmQoRGF0YShieXRlczogW1VJbnQ4KDB4ZmYgJiAodmFsdWUgPj4gMTYpKV0pKQorICAgIGJ1ZmYuYXBwZW5kKERhdGEoYnl0ZXM6IFtVSW50OCgweGZmICYgKHZhbHVlID4+IDgpKV0pKQorICAgIGJ1ZmYuYXBwZW5kKERhdGEoYnl0ZXM6IFtVSW50OCgweGZmICYgKHZhbHVlKSldKSkKKyAgICAKKyAgICB0cnkgUHJvdG9jb2xUcmFuc3BvcnRUcnkoZXJyb3I6IFRQcm90b2NvbEVycm9yKG1lc3NhZ2U6ICJUcmFuc3BvcnQgd3JpdGUgZmFpbGVkIikpIHsKKyAgICAgIHRyeSBzZWxmLnRyYW5zcG9ydC53cml0ZShkYXRhOiBidWZmKQorICAgIH0KKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGUoXyB2YWx1ZTogSW50NjQpIHRocm93cyB7CisgICAgdmFyIGJ1ZmYgPSBEYXRhKCkKKyAgICBidWZmLmFwcGVuZChEYXRhKGJ5dGVzOiBbVUludDgoMHhmZiAmICh2YWx1ZSA+PiA1NikpXSkpCisgICAgYnVmZi5hcHBlbmQoRGF0YShieXRlczogW1VJbnQ4KDB4ZmYgJiAodmFsdWUgPj4gNDgpKV0pKQorICAgIGJ1ZmYuYXBwZW5kKERhdGEoYnl0ZXM6IFtVSW50OCgweGZmICYgKHZhbHVlID4+IDQwKSldKSkKKyAgICBidWZmLmFwcGVuZChEYXRhKGJ5dGVzOiBbVUludDgoMHhmZiAmICh2YWx1ZSA+PiAzMikpXSkpCisgICAgYnVmZi5hcHBlbmQoRGF0YShieXRlczogW1VJbnQ4KDB4ZmYgJiAodmFsdWUgPj4gMjQpKV0pKQorICAgIGJ1ZmYuYXBwZW5kKERhdGEoYnl0ZXM6IFtVSW50OCgweGZmICYgKHZhbHVlID4+IDE2KSldKSkKKyAgICBidWZmLmFwcGVuZChEYXRhKGJ5dGVzOiBbVUludDgoMHhmZiAmICh2YWx1ZSA+PiA4KSldKSkKKyAgICBidWZmLmFwcGVuZChEYXRhKGJ5dGVzOiBbVUludDgoMHhmZiAmICh2YWx1ZSkpXSkpCisgICAgCisgICAgdHJ5IFByb3RvY29sVHJhbnNwb3J0VHJ5KGVycm9yOiBUUHJvdG9jb2xFcnJvcihtZXNzYWdlOiAiVHJhbnNwb3J0IHdyaXRlIGZhaWxlZCIpKSB7CisgICAgICB0cnkgc2VsZi50cmFuc3BvcnQud3JpdGUoZGF0YTogYnVmZikKKyAgICB9CisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlKF8gdmFsdWU6IERvdWJsZSkgdGhyb3dzIHsKKyAgICAvLyBOb3RhYmx5IHVuc2FmZSwgc2luY2UgRG91YmxlIGFuZCBJbnQ2NCBhcmUgdGhlIHNhbWUgc2l6ZSwgdGhpcyBzaG91bGQgd29yayBmaW5lCisgICAgdHJ5IHNlbGYud3JpdGUoSW50NjQoYml0UGF0dGVybjogdmFsdWUuYml0UGF0dGVybikpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlKF8gZGF0YTogRGF0YSkgdGhyb3dzIHsKKyAgICB0cnkgd3JpdGUoSW50MzIoZGF0YS5jb3VudCkpCisgICAgCisgICAgdHJ5IFByb3RvY29sVHJhbnNwb3J0VHJ5KGVycm9yOiBUUHJvdG9jb2xFcnJvcihtZXNzYWdlOiAiVHJhbnNwb3J0IHdyaXRlIGZhaWxlZCIpKSB7CisgICAgICB0cnkgc2VsZi50cmFuc3BvcnQud3JpdGUoZGF0YTogZGF0YSkKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL1RDbGllbnQuc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9UQ2xpZW50LnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjMzI4OGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9UQ2xpZW50LnN3aWZ0CkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitvcGVuIGNsYXNzIFRDbGllbnQgeworICBwdWJsaWMgbGV0IGluUHJvdG9jb2w6IFRQcm90b2NvbAorICBwdWJsaWMgbGV0IG91dFByb3RvY29sOiBUUHJvdG9jb2wKKworICByZXF1aXJlZCBwdWJsaWMgaW5pdChpbm91dFByb3RvY29sOiBUUHJvdG9jb2wpIHsKKyAgICBzZWxmLmluUHJvdG9jb2wgPSBpbm91dFByb3RvY29sCisgICAgc2VsZi5vdXRQcm90b2NvbCA9IGlub3V0UHJvdG9jb2wKKyAgfQorCisgIHJlcXVpcmVkIHB1YmxpYyBpbml0KGluUHJvdG9jb2w6IFRQcm90b2NvbCwgb3V0UHJvdG9jb2w6IFRQcm90b2NvbCkgeworICAgIHNlbGYuaW5Qcm90b2NvbCA9IGluUHJvdG9jb2wKKyAgICBzZWxmLm91dFByb3RvY29sID0gb3V0UHJvdG9jb2wKKyAgfQorfQorCisKK29wZW4gY2xhc3MgVEFzeW5jQ2xpZW50PFByb3RvY29sOiBUUHJvdG9jb2wsIEZhY3Rvcnk6IFRBc3luY1RyYW5zcG9ydEZhY3Rvcnk+IHsKKyAgcHVibGljIHZhciBmYWN0b3J5OiBGYWN0b3J5CisgIHB1YmxpYyBpbml0KHdpdGggcHJvdG9jb2w6IFByb3RvY29sLlR5cGUsIGZhY3Rvcnk6IEZhY3RvcnkpIHsKKyAgICBzZWxmLmZhY3RvcnkgPSBmYWN0b3J5CisgIH0KK30KKworCitwdWJsaWMgZW51bSBUQXN5bmNSZXN1bHQ8VD4geworICBjYXNlIHN1Y2Nlc3MoVCkKKyAgY2FzZSBlcnJvcihTd2lmdC5FcnJvcikKKyAgCisgIHB1YmxpYyBmdW5jIHZhbHVlKCkgdGhyb3dzIC0+IFQgeworICAgIHN3aXRjaCBzZWxmIHsKKyAgICBjYXNlIC5zdWNjZXNzKGxldCB0KTogcmV0dXJuIHQKKyAgICBjYXNlIC5lcnJvcihsZXQgZSk6IHRocm93IGUKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL1RDb21wYWN0UHJvdG9jb2wuc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9UQ29tcGFjdFByb3RvY29sLnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5NzczYzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9UQ29tcGFjdFByb3RvY29sLnN3aWZ0CkBAIC0wLDAgKzEsNTc1IEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyogdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitpbXBvcnQgRm91bmRhdGlvbgoraW1wb3J0IENvcmVGb3VuZGF0aW9uCisKK3B1YmxpYyBlbnVtIFRDVHlwZTogVUludDggeworICBjYXNlIHN0b3AgICAgICAgICAgPSAweDAwCisgIGNhc2UgYm9vbGVhbl9UUlVFICA9IDB4MDEKKyAgY2FzZSBib29sZWFuX0ZBTFNFID0gMHgwMgorICBjYXNlIGk4ICAgICAgICAgICAgPSAweDAzCisgIGNhc2UgaTE2ICAgICAgICAgICA9IDB4MDQKKyAgY2FzZSBpMzIgICAgICAgICAgID0gMHgwNQorICBjYXNlIGk2NCAgICAgICAgICAgPSAweDA2CisgIGNhc2UgZG91YmxlICAgICAgICA9IDB4MDcKKyAgY2FzZSBiaW5hcnkgICAgICAgID0gMHgwOAorICBjYXNlIGxpc3QgICAgICAgICAgPSAweDA5CisgIGNhc2Ugc2V0ICAgICAgICAgICA9IDB4MEEKKyAgY2FzZSBtYXAgICAgICAgICAgID0gMHgwQgorICBjYXNlIGBzdHJ1Y3RgICAgICAgPSAweDBDCisgIAorICBwdWJsaWMgc3RhdGljIGxldCB0eXBlTWFzazogVUludDggPSAweEUwIC8vIDExMTAgMDAwMAorICBwdWJsaWMgc3RhdGljIGxldCB0eXBlQml0czogVUludDggPSAweDA3IC8vIDAwMDAgMDExMQorICBwdWJsaWMgc3RhdGljIGxldCB0eXBlU2hpZnRBbW91bnQgPSA1CisgCit9CisKKworcHVibGljIGNsYXNzIFRDb21wYWN0UHJvdG9jb2w6IFRQcm90b2NvbCB7CisgIHB1YmxpYyBzdGF0aWMgbGV0IHByb3RvY29sSUQ6IFVJbnQ4ICA9IDB4ODIKKyAgcHVibGljIHN0YXRpYyBsZXQgdmVyc2lvbjogVUludDggICAgID0gMQorICBwdWJsaWMgc3RhdGljIGxldCB2ZXJzaW9uTWFzazogVUludDggPSAweDFGIC8vIDAwMDEgMTExMQorICAKKyAgcHVibGljIHZhciB0cmFuc3BvcnQ6IFRUcmFuc3BvcnQKKyAgCisgIHZhciBsYXN0RmllbGQ6IFtVSW50OF0gPSBbXQorICB2YXIgbGFzdEZpZWxkSWQ6IFVJbnQ4ID0gMAorICAKKyAgdmFyIGJvb2xGaWVsZE5hbWU6IFN0cmluZz8KKyAgdmFyIGJvb2xGaWVsZFR5cGU6IFRUeXBlPworICB2YXIgYm9vbEZpZWxkSWQ6IEludDMyPworICB2YXIgYm9vbGVhblZhbHVlOiBCb29sPworICAKKyAgdmFyIGN1cnJlbnRNZXNzYWdlTmFtZTogU3RyaW5nPworCisgIHB1YmxpYyByZXF1aXJlZCBpbml0KG9uIHRyYW5zcG9ydDogVFRyYW5zcG9ydCkgeworICAgIHNlbGYudHJhbnNwb3J0ID0gdHJhbnNwb3J0CisgIH0KKworICAKKyAgLy8vIE1hcms6IC0gVENvbXBhY3RQcm90b2NvbCBoZWxwZXJzCisgIAorICBmdW5jIHdyaXRlYnl0ZURpcmVjdChfIGJ5dGU6IFVJbnQ4KSB0aHJvd3MgeworICAgIGxldCBieXRlID0gRGF0YShieXRlczogW2J5dGVdKQorICAgIHRyeSBQcm90b2NvbFRyYW5zcG9ydFRyeShlcnJvcjogVFByb3RvY29sRXJyb3IobWVzc2FnZTogIlRyYW5zcG9ydCBXcml0ZSBGYWlsZWQiKSkgeworICAgICAgdHJ5IHNlbGYudHJhbnNwb3J0LndyaXRlKGRhdGE6IGJ5dGUpCisgICAgfQorICB9CisgIAorICBmdW5jIHdyaXRlVmFyaW50MzIoXyB2YWw6IFVJbnQzMikgdGhyb3dzIHsKKyAgICB2YXIgdmFsID0gdmFsCisgICAgdmFyIGkzMmJ1ZiA9IFtVSW50OF0ocmVwZWF0aW5nOiAwLCBjb3VudDogNSkKKyAgICB2YXIgaWR4ID0gMAorICAgIHdoaWxlIHRydWUgeworICAgICAgaWYgKHZhbCAmIH4weDdGKSA9PSAwIHsKKyAgICAgICAgaTMyYnVmW2lkeF0gPSBVSW50OCh2YWwpCisgICAgICAgIGlkeCArPSAxCisgICAgICAgIGJyZWFrCisgICAgICB9IGVsc2UgeworICAgICAgICBpMzJidWZbaWR4XSA9IFVJbnQ4KCh2YWwgJiAweDdGKSB8IDB4ODApCisgICAgICAgIGlkeCArPSAxCisgICAgICAgIHZhbCA+Pj0gNworICAgICAgfQorICAgIH0KKyAgICAKKyAgICB0cnkgUHJvdG9jb2xUcmFuc3BvcnRUcnkoZXJyb3I6IFRQcm90b2NvbEVycm9yKG1lc3NhZ2U6ICJUcmFuc3BvcnQgV3JpdGUgRmFpbGVkIikpIHsKKyAgICAgIHRyeSBzZWxmLnRyYW5zcG9ydC53cml0ZShkYXRhOiBEYXRhKGJ5dGVzOiBpMzJidWZbMC4uPGlkeF0pKQorICAgIH0KKyAgfQorICAKKyAgZnVuYyB3cml0ZVZhcmludDY0KF8gdmFsOiBVSW50NjQpIHRocm93cyB7CisgICAgdmFyIHZhbCA9IHZhbAorICAgIHZhciB2YXJpbnQ2NG91dCA9IFtVSW50OF0ocmVwZWF0aW5nOiAwLCBjb3VudDogMTApCisgICAgdmFyIGlkeCA9IDAKKyAgICB3aGlsZSB0cnVlIHsKKyAgICAgIGlmICh2YWwgJiB+MHg3RikgPT0gMHsKKyAgICAgICAgdmFyaW50NjRvdXRbaWR4XSA9IFVJbnQ4KHZhbCkKKyAgICAgICAgaWR4ICs9IDEKKyAgICAgICAgYnJlYWsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHZhcmludDY0b3V0W2lkeF0gPSBVSW50OCh2YWwgJiAweDdGKSB8IDB4ODAKKyAgICAgICAgaWR4ICs9IDEKKyAgICAgICAgdmFsID4+PSA3CisgICAgICB9CisgICAgfQorICAgIAorICAgIHRyeSBQcm90b2NvbFRyYW5zcG9ydFRyeShlcnJvcjogVFByb3RvY29sRXJyb3IobWVzc2FnZTogIlRyYW5zcG9ydCBXcml0ZSBGYWlsZWQiKSkgeworICAgICAgdHJ5IHNlbGYudHJhbnNwb3J0LndyaXRlKGRhdGE6IERhdGEoYnl0ZXM6IHZhcmludDY0b3V0WzAuLjxpZHhdKSkKKyAgICB9CisgIAorICB9CisgIAorICBmdW5jIHdyaXRlQ29sbGVjdGlvbkJlZ2luKF8gZWxlbWVudFR5cGU6IFRUeXBlLCBzaXplOiBJbnQzMikgdGhyb3dzIHsKKyAgICBsZXQgY3R5cGUgPSBjb21wYWN0VHlwZShlbGVtZW50VHlwZSkucmF3VmFsdWUKKyAgICBpZiBzaXplIDw9IDE0IHsKKyAgICAgIHRyeSB3cml0ZWJ5dGVEaXJlY3QoVUludDgoc2l6ZSA8PCA0KSB8IGN0eXBlKQorICAgIH0gZWxzZSB7CisgICAgICB0cnkgd3JpdGVieXRlRGlyZWN0KDB4RjAgfCBjdHlwZSkKKyAgICAgIHRyeSB3cml0ZVZhcmludDMyKFVJbnQzMihzaXplKSkKKyAgICB9CisgIH0KKyAgCisgIGZ1bmMgcmVhZEJpbmFyeShfIHNpemU6IEludCkgdGhyb3dzIC0+IERhdGEgeworICAgIHZhciByZXN1bHQgPSBEYXRhKCkKKyAgICBpZiBzaXplICE9IDAgeworICAgICAgdHJ5IFByb3RvY29sVHJhbnNwb3J0VHJ5KGVycm9yOiBUUHJvdG9jb2xFcnJvcihtZXNzYWdlOiAiVHJhbnNwb3J0IFJlYWQgRmFpbGVkIikpIHsKKyAgICAgICAgcmVzdWx0ID0gdHJ5IHNlbGYudHJhbnNwb3J0LnJlYWRBbGwoc2l6ZTogc2l6ZSkKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdAorICB9CisgIAorICBmdW5jIHJlYWRWYXJpbnQzMigpIHRocm93cyAtPiBVSW50MzIgeworICAgIHZhciByZXN1bHQ6IFVJbnQzMiA9IDAKKyAgICB2YXIgc2hpZnQ6IFVJbnQzMiA9IDAKKyAgICB3aGlsZSB0cnVlIHsKKyAgICAgIGxldCBieXRlOiBVSW50OCA9IHRyeSByZWFkKCkKKyAgICAgIAorICAgICAgcmVzdWx0IHw9IFVJbnQzMihieXRlICYgMHg3RikgPDwgc2hpZnQKKyAgICAgIGlmIChieXRlICYgMHg4MCkgPT0gMCB7CisgICAgICAgIGJyZWFrCisgICAgICB9CisgICAgICAKKyAgICAgIHNoaWZ0ICs9IDcKKyAgICB9CisgICAgCisgICAgcmV0dXJuIHJlc3VsdAorICB9CisgIAorICBmdW5jIHJlYWRWYXJpbnQ2NCgpIHRocm93cyAtPiBVSW50NjQgeworICAgIHZhciByZXN1bHQ6IFVJbnQ2NCA9IDAKKyAgICB2YXIgc2hpZnQ6IFVJbnQ2NCA9IDAKKyAgICAKKyAgICB3aGlsZSB0cnVlIHsKKyAgICAgIGxldCBieXRlOiBVSW50OCA9IHRyeSByZWFkKCkKKyAgICAgIAorICAgICAgcmVzdWx0IHw9IFVJbnQ2NChieXRlICYgMHg3RikgPDwgc2hpZnQKKyAgICAgIGlmIChieXRlICYgMHg4MCkgPT0gMCB7CisgICAgICAgIGJyZWFrCisgICAgICB9CisgICAgICAKKyAgICAgIHNoaWZ0ICs9IDcKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdAorICB9CisgIAorCisgIGZ1bmMgdHR5cGUoXyBjb21wYWN0VHlwZVZhbDogVUludDgpIHRocm93cyAtPiBUVHlwZSB7CisgICAgZ3VhcmQgbGV0IGNvbXBhY3RUeXBlID0gVENUeXBlKHJhd1ZhbHVlOiBjb21wYWN0VHlwZVZhbCkgZWxzZSB7CisgICAgICB0aHJvdyBUUHJvdG9jb2xFcnJvcihtZXNzYWdlOiAiVW5rbm93biBUQ1R5cGUgdmFsdWU6IFwoY29tcGFjdFR5cGVWYWwpIikKKyAgICB9CisgICAgCisgICAgc3dpdGNoIGNvbXBhY3RUeXBlIHsKKyAgICBjYXNlIC5zdG9wOiByZXR1cm4gLnN0b3A7CisgICAgY2FzZSAuYm9vbGVhbl9GQUxTRSwgLmJvb2xlYW5fVFJVRTogcmV0dXJuIC5ib29sOworICAgIGNhc2UgLmk4OiByZXR1cm4gLmk4OworICAgIGNhc2UgLmkxNjogcmV0dXJuIC5pMTY7CisgICAgY2FzZSAuaTMyOiByZXR1cm4gLmkzMjsKKyAgICBjYXNlIC5pNjQ6IHJldHVybiAuaTY0OworICAgIGNhc2UgLmRvdWJsZTogcmV0dXJuIC5kb3VibGU7CisgICAgY2FzZSAuYmluYXJ5OiByZXR1cm4gLnN0cmluZzsKKyAgICBjYXNlIC5saXN0OiByZXR1cm4gLmxpc3Q7CisgICAgY2FzZSAuc2V0OiByZXR1cm4gLnNldDsKKyAgICBjYXNlIC5tYXA6IHJldHVybiAubWFwOworICAgIGNhc2UgLnN0cnVjdDogcmV0dXJuIC5zdHJ1Y3Q7CisgICAgfQorICB9CisgIAorICBmdW5jIGNvbXBhY3RUeXBlKF8gdHR5cGU6IFRUeXBlKSAtPiBUQ1R5cGUgeworICAgIHN3aXRjaCB0dHlwZSB7CisgICAgY2FzZSAuc3RvcDogICByZXR1cm4gLnN0b3AKKyAgICBjYXNlIC52b2lkOiAgIHJldHVybiAuaTgKKyAgICBjYXNlIC5ib29sOiAgIHJldHVybiAuYm9vbGVhbl9GQUxTRQorICAgIGNhc2UgLmk4OiAgIHJldHVybiAuaTgKKyAgICBjYXNlIC5kb3VibGU6IHJldHVybiAuZG91YmxlCisgICAgY2FzZSAuaTE2OiAgICByZXR1cm4gLmkxNgorICAgIGNhc2UgLmkzMjogICAgcmV0dXJuIC5pMzIKKyAgICBjYXNlIC5pNjQ6ICAgIHJldHVybiAuaTY0CisgICAgY2FzZSAuc3RyaW5nOiByZXR1cm4gLmJpbmFyeQorICAgIGNhc2UgLnN0cnVjdDogcmV0dXJuIC5zdHJ1Y3QKKyAgICBjYXNlIC5tYXA6ICAgIHJldHVybiAubWFwCisgICAgY2FzZSAuc2V0OiAgICByZXR1cm4gLnNldAorICAgIGNhc2UgLmxpc3Q6ICAgcmV0dXJuIC5saXN0CisgICAgY2FzZSAudXRmODogICByZXR1cm4gLmJpbmFyeQorICAgIGNhc2UgLnV0ZjE2OiAgcmV0dXJuIC5iaW5hcnkKKyAgICB9CisgIH0KKyAgCisgIC8vLyBaaWdaYWcgZW5jb2RpbmcgbWFwcyBzaWduZWQgaW50ZWdlcnMgdG8gdW5zaWduZWQgaW50ZWdlcnMgc28gdGhhdAorICAvLy8gbnVtYmVycyB3aXRoIGEgc21hbGwgYWJzb2x1dGUgdmFsdWUgKGZvciBpbnN0YW5jZSwgLTEpIGhhdmUKKyAgLy8vIGEgc21hbGwgdmFyaW50IGVuY29kZWQgdmFsdWUgdG9vLiBJdCBkb2VzIHRoaXMgaW4gYSB3YXkgdGhhdAorICAvLy8gInppZy16YWdzIiBiYWNrIGFuZCBmb3J0aCB0aHJvdWdoIHRoZSBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgaW50ZWdlcnMsCisgIC8vLyBzbyB0aGF0IC0xIGlzIGVuY29kZWQgYXMgMSwgMSBpcyBlbmNvZGVkIGFzIDIsIC0yIGlzIGVuY29kZWQgYXMgMywgYW5kIHNvCisgIC8vLworICAvLy8gLSBwYXJhbWV0ZXIgbjogbnVtYmVyIHRvIHppZ3phZworICAvLy8KKyAgLy8vIC0gcmV0dXJuczogemlnemFnZWQgVUludDMyCisgIGZ1bmMgaTMyVG9aaWdaYWcoXyBuIDogSW50MzIpIC0+IFVJbnQzMiB7CisgICAgcmV0dXJuIFVJbnQzMihiaXRQYXR0ZXJuOiBJbnQzMihuIDw8IDEpIF4gSW50MzIobiA+PiAzMSkpCisgIH0KKworICBmdW5jIGk2NFRvWmlnWmFnKF8gbiA6IEludDY0KSAtPiBVSW50NjQgeworICAgIHJldHVybiBVSW50NjQoYml0UGF0dGVybjogSW50NjQobiA8PCAxKSBeIEludDY0KG4gPj4gNjMpKQorICB9CisKKyAgZnVuYyB6aWdaYWdUb2kzMihfIG46IFVJbnQzMikgLT4gSW50MzIgeworICAgIHJldHVybiBJbnQzMihuID4+IDEpIF4gKC1JbnQzMihuICYgMSkpCisgIH0KKyAgCisgIGZ1bmMgemlnWmFnVG9pNjQoXyBuOiBVSW50NjQpIC0+IEludDY0IHsKKyAgICByZXR1cm4gSW50NjQobiA+PiAxKSBeICgtSW50NjQobiAmIDEpKQorICB9CisgIAorICAKKyAgCisgIC8vLyBNYXJrOiAtIFRQcm90b2NvbCAgCisgIAorICBwdWJsaWMgZnVuYyByZWFkTWVzc2FnZUJlZ2luKCkgdGhyb3dzIC0+IChTdHJpbmcsIFRNZXNzYWdlVHlwZSwgSW50MzIpIHsKKyAgICBsZXQgcHJvdG9jb2xJZDogVUludDggPSB0cnkgcmVhZCgpCisgICAgCisgICAgaWYgcHJvdG9jb2xJZCAhPSBUQ29tcGFjdFByb3RvY29sLnByb3RvY29sSUQgeworICAgICAgbGV0IGV4cGVjdGVkID0gU3RyaW5nKGZvcm1hdDoiJTJYIiwgVENvbXBhY3RQcm90b2NvbC5wcm90b2NvbElEKQorICAgICAgbGV0IGdvdCAgICAgID0gU3RyaW5nKGZvcm1hdDoiJTJYIiwgcHJvdG9jb2xJZCkKKyAgICAgIHRocm93IFRQcm90b2NvbEVycm9yKG1lc3NhZ2U6ICJXcm9uZyBQcm90b2NvbCBJRCBcKGdvdCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5kZWRFcnJvcjogLm1pc21hdGNoZWRQcm90b2NvbChleHBlY3RlZDogZXhwZWN0ZWQsIGdvdDogZ290KSkKKworICAgIH0KKworICAgIGxldCB2ZXJzaW9uQW5kVHlwZTogVUludDggPSB0cnkgcmVhZCgpCisgICAgbGV0IHZlcnNpb246IFVJbnQ4ID0gdmVyc2lvbkFuZFR5cGUgJiBUQ29tcGFjdFByb3RvY29sLnZlcnNpb25NYXNrCisgICAgaWYgdmVyc2lvbiAhPSBUQ29tcGFjdFByb3RvY29sLnZlcnNpb24geworICAgICAgdGhyb3cgVFByb3RvY29sRXJyb3IoZXJyb3I6IC5iYWRWZXJzaW9uKGV4cGVjdGVkOiAiXChUQ29tcGFjdFByb3RvY29sLnZlcnNpb24pIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3Q6IlwodmVyc2lvbikiKSkKKworICAgIH0KKyAgICAKKyAgICBsZXQgdHlwZSA9ICh2ZXJzaW9uQW5kVHlwZSA+PiBVSW50OChUQ1R5cGUudHlwZVNoaWZ0QW1vdW50KSkgJiBUQ1R5cGUudHlwZUJpdHMKKyAgICBndWFyZCBsZXQgbXR5cGUgPSBUTWVzc2FnZVR5cGUocmF3VmFsdWU6IEludDMyKHR5cGUpKSBlbHNlIHsKKyAgICAgIHRocm93IFRQcm90b2NvbEVycm9yKG1lc3NhZ2U6ICJVbmtub3duIFRNZXNzYWdlVHlwZSB2YWx1ZTogXCh0eXBlKSIpCisgICAgfQorICAgIGxldCBzZXF1ZW5jZUlkID0gdHJ5IHJlYWRWYXJpbnQzMigpCisgICAgbGV0IG5hbWU6IFN0cmluZyA9IHRyeSByZWFkKCkKKyAgICAKKyAgICByZXR1cm4gKG5hbWUsIG10eXBlLCBJbnQzMihzZXF1ZW5jZUlkKSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZE1lc3NhZ2VFbmQoKSB0aHJvd3MgeyB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkU3RydWN0QmVnaW4oKSB0aHJvd3MgLT4gU3RyaW5nIHsKKyAgICBsYXN0RmllbGQuYXBwZW5kKGxhc3RGaWVsZElkKQorICAgIGxhc3RGaWVsZElkID0gMAorICAgIHJldHVybiAiIgorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkU3RydWN0RW5kKCkgdGhyb3dzIHsKKyAgICBsYXN0RmllbGRJZCA9IGxhc3RGaWVsZC5sYXN0ID8/IDAKKyAgICBsYXN0RmllbGQucmVtb3ZlTGFzdCgpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRGaWVsZEJlZ2luKCkgdGhyb3dzIC0+IChTdHJpbmcsIFRUeXBlLCBJbnQzMikgeworICAgIGxldCBieXRlOiBVSW50OCA9IHRyeSByZWFkKCkKKyAgICBndWFyZCBsZXQgdHlwZSA9IFRDVHlwZShyYXdWYWx1ZTogYnl0ZSAmIDB4MEYpIGVsc2UgeworICAgICAgdGhyb3cgVFByb3RvY29sRXJyb3IobWVzc2FnZTogIlVua25vd24gVENUeXBlIFwoYnl0ZSAmIDB4MEYpIikKKyAgICB9CisgICAgCisgICAgLy8gaWYgaXQncyBhIHN0b3AsIHRoZW4gd2UgY2FuIHJldHVybiBpbW1lZGlhdGVseSwgYXMgdGhlIHN0cnVjdCBpcyBvdmVyCisgICAgaWYgdHlwZSA9PSAuc3RvcCB7CisgICAgICByZXR1cm4gKCIiLCAuc3RvcCwgMCkKKyAgICB9CisgICAgCisgICAgdmFyIGZpZWxkSWQ6IEludDE2ID0gMAorICAgIAorICAgIC8vIG1hc2sgb2ZmIHRoZSA0TVNCIG9mIHRoZSB0eXBlIGhlYWRlci4gIGl0IGNvdWxkIGNvbnRhaW4gYSBmaWVsZCBpZCBkZWx0YQorICAgIGxldCBtb2RpZmllciA9IChieXRlICYgMHhGMCkgPj4gNAorICAgIGlmIG1vZGlmaWVyID09IDAgeworICAgICAgLy8gbm90IGEgZGVsdGEuICBsb29rIGFoZWFkIGZvciB0aGUgemlnemFnIHZhcmludCBmaWVsZCBpZAorICAgICAgZmllbGRJZCA9IHRyeSByZWFkKCkKKyAgICB9IGVsc2UgeworICAgICAgLy8gaGFzIGEgZGVsdGEuICBhZGQgdGhlIGRlbHRhIHRvIHRoZSBsYXN0IFJlYWQgZmllbGQgaWQuCisgICAgICBmaWVsZElkID0gSW50MTYobGFzdEZpZWxkSWQgKyBtb2RpZmllcikKKyAgICB9CisgICAgCisgICAgbGV0IGZpZWxkVHlwZSA9IHRyeSB0dHlwZSh0eXBlLnJhd1ZhbHVlKQorICAgIAorICAgIC8vIGlmIHRoaXMgaGFwcGVucyB0byBiZSBhIGJvb2xlYW4gZmllbGQsIHRoZSB2YWx1ZSBpcyBlbmNvZGVkIGluIHRoZSB0eXBlCisgICAgaWYgdHlwZSA9PSAuYm9vbGVhbl9UUlVFIHx8IHR5cGUgPT0gLmJvb2xlYW5fRkFMU0UgeworICAgICAgLy8gc2F2ZSB0aGUgYm9vbGVhbiB2YWx1ZSBpbiBhIHNwZWNpYWwgaW5zdGFuY2UgdmFyaWFibGUKKyAgICAgIGJvb2xlYW5WYWx1ZSA9IHR5cGUgPT0gLmJvb2xlYW5fVFJVRQorICAgIH0KKyAgICAKKyAgICAvLyBwdXNoIHRoZSBuZXcgZmllbGQgb250byB0aGUgZmllbGQgc3RhY2sgc28gd2UgY2FuIGtlZXAgdGhlIGRlbHRhcyBnb2luZworICAgIGxhc3RGaWVsZElkID0gVUludDgoZmllbGRJZCkKKyAgICByZXR1cm4gKCIiLCBmaWVsZFR5cGUsIEludDMyKGZpZWxkSWQpKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkRmllbGRFbmQoKSB0aHJvd3MgeyB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkKCkgdGhyb3dzIC0+IFN0cmluZyB7CisgICAgbGV0IGxlbmd0aCA9IHRyeSByZWFkVmFyaW50MzIoKQorICAgIAorICAgIHZhciByZXN1bHQ6IFN0cmluZworICAgIAorICAgIGlmIGxlbmd0aCAhPSAwIHsKKyAgICAgIGxldCBkYXRhID0gdHJ5IHJlYWRCaW5hcnkoSW50KGxlbmd0aCkpCisgICAgICByZXN1bHQgPSBTdHJpbmcoZGF0YTogZGF0YSwgZW5jb2Rpbmc6IFN0cmluZy5FbmNvZGluZy51dGY4KSA/PyAiIgorICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgPSAiIgorICAgIH0KKyAgICAKKyAgICByZXR1cm4gcmVzdWx0CisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gQm9vbCB7CisgICAgaWYgbGV0IHZhbCA9IGJvb2xlYW5WYWx1ZSB7CisgICAgICBzZWxmLmJvb2xlYW5WYWx1ZSA9IG5pbAorICAgICAgcmV0dXJuIHZhbAorICAgIH0gZWxzZSB7CisgICAgICBsZXQgcmVzdWx0ID0gdHJ5IHJlYWQoKSBhcyBVSW50OAorICAgICAgcmV0dXJuIFRDVHlwZShyYXdWYWx1ZTogcmVzdWx0KSA9PSAuYm9vbGVhbl9UUlVFCisgICAgfQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkKCkgdGhyb3dzIC0+IFVJbnQ4IHsKKyAgICB2YXIgYnVmZjogVUludDggPSAwCisgICAgdHJ5IFByb3RvY29sVHJhbnNwb3J0VHJ5KGVycm9yOiBUUHJvdG9jb2xFcnJvcihtZXNzYWdlOiAiVHJhbnNwb3J0IFJlYWQgRmFpbGVkIikpIHsKKyAgICAgIGJ1ZmYgPSB0cnkgc2VsZi50cmFuc3BvcnQucmVhZEFsbChzaXplOiAxKVswXQorICAgIH0KKyAgICByZXR1cm4gYnVmZgorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkKCkgdGhyb3dzIC0+IEludDE2IHsKKyAgICBsZXQgdiA9IHRyeSByZWFkVmFyaW50MzIoKQorICAgIHJldHVybiBJbnQxNih6aWdaYWdUb2kzMih2KSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZCgpIHRocm93cyAtPiBJbnQzMiB7CisgICAgbGV0IHYgPSB0cnkgcmVhZFZhcmludDMyKCkKKyAgICByZXR1cm4gemlnWmFnVG9pMzIodikKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZCgpIHRocm93cyAtPiBJbnQ2NCB7CisgICAgbGV0IHYgPSB0cnkgcmVhZFZhcmludDY0KCkKKyAgICByZXR1cm4gemlnWmFnVG9pNjQodikKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZCgpIHRocm93cyAtPiBEb3VibGUgeworICAgIHZhciBidWZmID0gRGF0YSgpCisgICAgdHJ5IFByb3RvY29sVHJhbnNwb3J0VHJ5KGVycm9yOiBUUHJvdG9jb2xFcnJvcihtZXNzYWdlOiAiVHJhbnNwb3J0IFJlYWQgRmFpbGVkIikpIHsKKyAgICAgIGJ1ZmYgPSB0cnkgc2VsZi50cmFuc3BvcnQucmVhZEFsbChzaXplOiA4KQorICAgIH0KKyAgICAKKyAgICBsZXQgaTY0OiBVSW50NjQgPSBidWZmLndpdGhVbnNhZmVCeXRlcyB7IChwdHI6IFVuc2FmZVBvaW50ZXI8VUludDg+KSAtPiBVSW50NjQgaW4KKyAgICAgIHJldHVybiBVbnNhZmVQb2ludGVyPFVJbnQ2ND4oT3BhcXVlUG9pbnRlcihwdHIpKS5wb2ludGVlCisgICAgfQorICAgIGxldCBiaXRzID0gQ0ZTd2FwSW50NjRMaXR0bGVUb0hvc3QoaTY0KQorICAgIHJldHVybiBEb3VibGUoYml0UGF0dGVybjogYml0cykKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZCgpIHRocm93cyAtPiBEYXRhIHsKKyAgICBsZXQgbGVuZ3RoID0gdHJ5IHJlYWRWYXJpbnQzMigpCisgICAgcmV0dXJuIHRyeSByZWFkQmluYXJ5KEludChsZW5ndGgpKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkTWFwQmVnaW4oKSB0aHJvd3MgLT4gKFRUeXBlLCBUVHlwZSwgSW50MzIpIHsKKyAgICB2YXIga2V5QW5kVmFsdWVUeXBlOiBVSW50OCA9IDgKKyAgICBsZXQgc2l6ZSA9IHRyeSByZWFkVmFyaW50MzIoKQorICAgIGlmIHNpemUgIT0gMCB7CisgICAgICBrZXlBbmRWYWx1ZVR5cGUgPSB0cnkgcmVhZCgpCisgICAgfQorICAgIAorICAgIGxldCBrZXlUeXBlID0gdHJ5IHR0eXBlKGtleUFuZFZhbHVlVHlwZSA+PiA0KQorICAgIGxldCB2YWx1ZVR5cGUgPSB0cnkgdHR5cGUoa2V5QW5kVmFsdWVUeXBlICYgMHhGKQorICAgIAorICAgIHJldHVybiAoa2V5VHlwZSwgdmFsdWVUeXBlLCBJbnQzMihzaXplKSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZE1hcEVuZCgpIHRocm93cyB7IH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRTZXRCZWdpbigpIHRocm93cyAtPiAoVFR5cGUsIEludDMyKSB7CisgICAgcmV0dXJuIHRyeSByZWFkTGlzdEJlZ2luKCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZFNldEVuZCgpIHRocm93cyB7IH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRMaXN0QmVnaW4oKSB0aHJvd3MgLT4gKFRUeXBlLCBJbnQzMikgeworICAgIGxldCBzaXplQW5kVHlwZTogVUludDggPSB0cnkgcmVhZCgpCisgICAgdmFyIHNpemU6IFVJbnQzMiA9IFVJbnQzMihzaXplQW5kVHlwZSA+PiA0KSAmIDB4MGYKKyAgICBpZiBzaXplID09IDE1IHsKKyAgICAgIHNpemUgPSB0cnkgcmVhZFZhcmludDMyKCkKKyAgICB9CisgICAgbGV0IGVsZW1lbnRUeXBlID0gdHJ5IHR0eXBlKHNpemVBbmRUeXBlICYgMHgwRikKKyAgICAKKyAgICByZXR1cm4gKGVsZW1lbnRUeXBlLCBJbnQzMihzaXplKSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZExpc3RFbmQoKSB0aHJvd3MgeyB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZU1lc3NhZ2VCZWdpbihuYW1lOiBTdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgbWVzc2FnZVR5cGU6IFRNZXNzYWdlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VJRDogSW50MzIpIHRocm93cyB7CisgICAgdHJ5IHdyaXRlYnl0ZURpcmVjdChUQ29tcGFjdFByb3RvY29sLnByb3RvY29sSUQpCisgICAgbGV0IG5leHRCeXRlOiBVSW50OCA9IChUQ29tcGFjdFByb3RvY29sLnZlcnNpb24gJiBUQ29tcGFjdFByb3RvY29sLnZlcnNpb25NYXNrKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgIChVSW50OCgoVUludDMyKG1lc3NhZ2VUeXBlLnJhd1ZhbHVlKSA8PCBVSW50MzIoVENUeXBlLnR5cGVTaGlmdEFtb3VudCkpKSAmCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRDVHlwZS50eXBlTWFzaykKKyAgICB0cnkgd3JpdGVieXRlRGlyZWN0KG5leHRCeXRlKQorICAgIHRyeSB3cml0ZVZhcmludDMyKFVJbnQzMihzZXF1ZW5jZUlEKSkKKyAgICB0cnkgd3JpdGUobmFtZSkKKyAgICAKKyAgICBjdXJyZW50TWVzc2FnZU5hbWUgPSBuYW1lCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlTWVzc2FnZUVuZCgpIHRocm93cyB7CisgICAgY3VycmVudE1lc3NhZ2VOYW1lID0gbmlsCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlU3RydWN0QmVnaW4obmFtZTogU3RyaW5nKSB0aHJvd3MgeworICAgIGxhc3RGaWVsZC5hcHBlbmQobGFzdEZpZWxkSWQpCisgICAgbGFzdEZpZWxkSWQgPSAwCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlU3RydWN0RW5kKCkgdGhyb3dzIHsKKyAgICBsYXN0RmllbGRJZCA9IGxhc3RGaWVsZC5sYXN0ID8/IDAKKyAgICBsYXN0RmllbGQucmVtb3ZlTGFzdCgpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlRmllbGRCZWdpbihuYW1lOiBTdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlIGZpZWxkVHlwZTogVFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZElEOiBJbnQzMikgdGhyb3dzIHsKKyAgICBpZiBmaWVsZFR5cGUgPT0gLmJvb2wgeworICAgICAgYm9vbEZpZWxkTmFtZSA9IG5hbWUKKyAgICAgIGJvb2xGaWVsZFR5cGUgPSBmaWVsZFR5cGUKKyAgICAgIGJvb2xGaWVsZElkID0gZmllbGRJRAorICAgICAgcmV0dXJuCisgICAgfSBlbHNlIHsKKyAgICAgIHRyeSB3cml0ZUZpZWxkQmVnaW5JbnRlcm5hbChuYW1lOiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IGZpZWxkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZElEOiBmaWVsZElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVPdmVycmlkZTogMHhGRikKKyAgICB9CisgIH0KKyAgCisgIGZ1bmMgd3JpdGVGaWVsZEJlZ2luSW50ZXJuYWwobmFtZTogU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgZmllbGRUeXBlOiBUVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZElEOiBJbnQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlT3ZlcnJpZGU6IFVJbnQ4KSB0aHJvd3MgeworICAgIAorICAgIGxldCB0eXBlVG9Xcml0ZSA9IHR5cGVPdmVycmlkZSA9PSAweEZGID8gY29tcGFjdFR5cGUoZmllbGRUeXBlKS5yYXdWYWx1ZSA6IHR5cGVPdmVycmlkZQorICAgIAorICAgIC8vIGNoZWNrIGlmIHdlIGNhbiB1c2UgZGVsdGEgZW5jb2RpbmcgZm9yIHRoZSBmaWVsZCBpZAorICAgIGxldCBkaWZmID0gVUludDgoZmllbGRJRCkgLSBsYXN0RmllbGRJZAorICAgIGlmIChVSW50OChmaWVsZElEKSA+IGxhc3RGaWVsZElkKSAmJiAoZGlmZiA8PSAxNSkgeworICAgICAgLy8gV3JpdGUgdGhlbSB0b2dldGhlcgorICAgICAgdHJ5IHdyaXRlYnl0ZURpcmVjdCgoVUludDgoZmllbGRJRCkgLSBsYXN0RmllbGRJZCkgPDwgNCB8IHR5cGVUb1dyaXRlKQorICAgICAgCisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFdyaXRlIHRoZW0gc2VwYXJhdGUKKyAgICAgIHRyeSB3cml0ZWJ5dGVEaXJlY3QodHlwZVRvV3JpdGUpCisgICAgICB0cnkgd3JpdGUoSW50MTYoZmllbGRJRCkpCisgICAgfQorICAgIAorICAgIGxhc3RGaWVsZElkID0gVUludDgoZmllbGRJRCkKKyAgICAgIAorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZUZpZWxkU3RvcCgpIHRocm93cyB7CisgICAgdHJ5IHdyaXRlYnl0ZURpcmVjdChUQ1R5cGUuc3RvcC5yYXdWYWx1ZSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVGaWVsZEVuZCgpIHRocm93cyB7IH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlTWFwQmVnaW4oa2V5VHlwZTogVFR5cGUsIHZhbHVlVHlwZTogVFR5cGUsIHNpemU6IEludDMyKSB0aHJvd3MgeworICAgIGlmIHNpemUgPT0gMCB7CisgICAgICB0cnkgd3JpdGVieXRlRGlyZWN0KDApCisgICAgfSBlbHNlIHsKKyAgICAgIHRyeSB3cml0ZVZhcmludDMyKFVJbnQzMihzaXplKSkKKyAgICAgIAorICAgICAgbGV0IGNvbXBhY3RlZFR5cGVzID0gY29tcGFjdFR5cGUoa2V5VHlwZSkucmF3VmFsdWUgPDwgNCB8IGNvbXBhY3RUeXBlKHZhbHVlVHlwZSkucmF3VmFsdWUKKyAgICAgIHRyeSB3cml0ZWJ5dGVEaXJlY3QoY29tcGFjdGVkVHlwZXMpCisgICAgfQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZU1hcEVuZCgpIHRocm93cyB7IH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlU2V0QmVnaW4oZWxlbWVudFR5cGU6IFRUeXBlLCBzaXplOiBJbnQzMikgdGhyb3dzIHsKKyAgICB0cnkgd3JpdGVDb2xsZWN0aW9uQmVnaW4oZWxlbWVudFR5cGUsIHNpemU6IHNpemUpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlU2V0RW5kKCkgdGhyb3dzIHsgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVMaXN0QmVnaW4oZWxlbWVudFR5cGU6IFRUeXBlLCBzaXplOiBJbnQzMikgdGhyb3dzIHsKKyAgICB0cnkgd3JpdGVDb2xsZWN0aW9uQmVnaW4oZWxlbWVudFR5cGUsIHNpemU6IHNpemUpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlTGlzdEVuZCgpIHRocm93cyB7IH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlKF8gdmFsdWU6IFN0cmluZykgdGhyb3dzIHsKKyAgICB0cnkgd3JpdGUodmFsdWUuZGF0YSh1c2luZzogU3RyaW5nLkVuY29kaW5nLnV0ZjgpISkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGUoXyB2YWx1ZTogQm9vbCkgdGhyb3dzIHsKKyAgICBpZiBsZXQgYm9vbEZpZWxkSWQgPSBib29sRmllbGRJZCwgbGV0IGJvb2xGaWVsZFR5cGUgPSBib29sRmllbGRUeXBlLAorICAgICAgIGxldCBib29sRmllbGROYW1lID0gYm9vbEZpZWxkTmFtZSB7CisgICAgICAKKyAgICAgIC8vIHdlIGhhdmVuJ3Qgd3JpdHRlbiB0aGUgZmllbGQgaGVhZGVyIHlldAorICAgICAgbGV0IGNvbXBhY3RUeXBlOiBUQ1R5cGUgPSB2YWx1ZSA/IC5ib29sZWFuX1RSVUUgOiAuYm9vbGVhbl9GQUxTRQorICAgICAgdHJ5IHdyaXRlRmllbGRCZWdpbkludGVybmFsKG5hbWU6IGJvb2xGaWVsZE5hbWUsIHR5cGU6IGJvb2xGaWVsZFR5cGUsIGZpZWxkSUQ6IGJvb2xGaWVsZElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVPdmVycmlkZTogY29tcGFjdFR5cGUucmF3VmFsdWUpCisgICAgICBzZWxmLmJvb2xGaWVsZElkID0gbmlsCisgICAgICBzZWxmLmJvb2xGaWVsZFR5cGUgPSBuaWwKKyAgICAgIHNlbGYuYm9vbEZpZWxkTmFtZSA9IG5pbAorICAgIH0gZWxzZSB7CisgICAgICAvLyB3ZSdyZSBub3QgcGFydCBvZiBhIGZpZWxkLCBzbyBqdXN0IHdyaXRlIHRoZSB2YWx1ZS4KKyAgICAgIHRyeSB3cml0ZWJ5dGVEaXJlY3QodmFsdWUgPyBUQ1R5cGUuYm9vbGVhbl9UUlVFLnJhd1ZhbHVlIDogVENUeXBlLmJvb2xlYW5fRkFMU0UucmF3VmFsdWUpCisgICAgfQorICB9CisKKyAgcHVibGljIGZ1bmMgd3JpdGUoXyB2YWx1ZTogVUludDgpIHRocm93cyB7CisgICAgdHJ5IHdyaXRlYnl0ZURpcmVjdCh2YWx1ZSkKKyAgfQorCisgIHB1YmxpYyBmdW5jIHdyaXRlKF8gdmFsdWU6IEludDE2KSB0aHJvd3MgeworICAgIHRyeSB3cml0ZVZhcmludDMyKGkzMlRvWmlnWmFnKEludDMyKHZhbHVlKSkpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlKF8gdmFsdWU6IEludDMyKSB0aHJvd3MgeworICAgIHRyeSB3cml0ZVZhcmludDMyKGkzMlRvWmlnWmFnKHZhbHVlKSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGUoXyB2YWx1ZTogSW50NjQpIHRocm93cyB7CisgICAgdHJ5IHdyaXRlVmFyaW50NjQoaTY0VG9aaWdaYWcodmFsdWUpKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZShfIHZhbHVlOiBEb3VibGUpIHRocm93cyB7CisgICAgdmFyIGJpdHMgPSBDRlN3YXBJbnQ2NEhvc3RUb0xpdHRsZSh2YWx1ZS5iaXRQYXR0ZXJuKQorICAgIGxldCBkYXRhID0gd2l0aFVuc2FmZVBvaW50ZXIodG86ICZiaXRzKSB7CisgICAgICByZXR1cm4gRGF0YShieXRlczogVW5zYWZlUG9pbnRlcjxVSW50OD4oT3BhcXVlUG9pbnRlcigkMCkpLCBjb3VudDogTWVtb3J5TGF5b3V0PFVJbnQ2ND4uc2l6ZSkKKyAgICB9CisgICAgdHJ5IFByb3RvY29sVHJhbnNwb3J0VHJ5KGVycm9yOiBUUHJvdG9jb2xFcnJvcihtZXNzYWdlOiAiVHJhbnNwb3J0IFdyaXRlIEZhaWxlZCIpKSB7CisgICAgICB0cnkgc2VsZi50cmFuc3BvcnQud3JpdGUoZGF0YTogZGF0YSkKKyAgICB9CisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlKF8gZGF0YTogRGF0YSkgdGhyb3dzIHsKKyAgICB0cnkgd3JpdGVWYXJpbnQzMihVSW50MzIoZGF0YS5jb3VudCkpCisgICAgdHJ5IFByb3RvY29sVHJhbnNwb3J0VHJ5KGVycm9yOiBUUHJvdG9jb2xFcnJvcihtZXNzYWdlOiAiVHJhbnNwb3J0IFdyaXRlIEZhaWxlZCIpKSB7CisgICAgICB0cnkgc2VsZi50cmFuc3BvcnQud3JpdGUoZGF0YTogZGF0YSkKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL1RFbnVtLnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvVEVudW0uc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVkZmRiMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RFbnVtLnN3aWZ0CkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwdWJsaWMgcHJvdG9jb2wgVEVudW0gOiBUU2VyaWFsaXphYmxlLCBIYXNoYWJsZSB7CisgIHZhciByYXdWYWx1ZTogSW50MzIgeyBnZXQgfQorfQorCitleHRlbnNpb24gVEVudW0geworICBwdWJsaWMgc3RhdGljIHZhciB0aHJpZnRUeXBlOiBUVHlwZSB7IHJldHVybiAuaTMyIH0KKyAgcHVibGljIHZhciBoYXNoVmFsdWU6IEludCB7IHJldHVybiByYXdWYWx1ZS5oYXNoVmFsdWUgfQorCisgIHB1YmxpYyBmdW5jIHdyaXRlKHRvIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyB7CisgICAgdHJ5IHByb3RvLndyaXRlKHJhd1ZhbHVlKQorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvc3dpZnQvU291cmNlcy9URXJyb3Iuc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9URXJyb3Iuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzllZGJhNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RFcnJvci5zd2lmdApAQCAtMCwwICsxLDc3IEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyogdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisKKy8vLyBURXJyb3JDb2RlCisvLy8KKy8vLyBQcm90b2NvbCBmb3IgVEVycm9yIGNvbmZvcm1lcnMnIGVudW0ncyB0byBjb25mb3JtIHRvLgorLy8vIEdlbmVyaWMgSW50IFRocmlmdCBlcnJvciBjb2RlIHRvIGFsbG93IGVycm9yIGNhc2VzIHRvIGhhdmUKKy8vLyBhc3NvY2lhdGVkIHZhbHVlcy4KK3B1YmxpYyBwcm90b2NvbCBURXJyb3JDb2RlIDogQ3VzdG9tU3RyaW5nQ29udmVydGlibGUgeworICB2YXIgdGhyaWZ0RXJyb3JDb2RlOiBJbnQgeyBnZXQgfQorfQorCisvLy8gVEVycm9yCisvLy8KKy8vLyBCYXNlIHByb3RvY29sIGZvciBhbGwgVGhyaWZ0IEVycm9yKEV4Y2VwdGlvbikgdHlwZXMgdG8gY29uZm9ybSB0bworcHVibGljIHByb3RvY29sIFRFcnJvciA6IEVycm9yLCBDdXN0b21TdHJpbmdDb252ZXJ0aWJsZSB7CisKKyAgLy8vIEVudW0gZm9yIGVycm9yIGNhc2VzLiAgQ2FuIGJlIHR5cGVhbGlhc2VkIHRvIGFueSBjb25mb3JtaW5nIGVudW0KKyAgLy8vIG9yIGRlZmluZWQgbmVzdGVkLgorICBhc3NvY2lhdGVkdHlwZSBDb2RlOiBURXJyb3JDb2RlCisgIAorICAvLy8gRXJyb3IgQ2FzZSwgdmFsdWUgZnJvbSBpbnRlcm5hbCBlbnVtCisgIHZhciBlcnJvcjogQ29kZSB7IGdldCBzZXQgfQorICAKKyAgLy8vIE9wdGlvbmFsIGFkZGl0aW9uYWwgbWVzc2FnZQorICB2YXIgbWVzc2FnZTogU3RyaW5nPyB7IGdldCBzZXQgfQorICAKKyAgLy8vIERlZmF1bHQgZXJyb3IgY2FzZSBmb3IgdGhlIGVycm9yIHR5cGUsIHVzZWQgZm9yIGdlbmVyaWMgaW5pdCgpCisgIHN0YXRpYyB2YXIgZGVmYXVsdENhc2U6IENvZGUgeyBnZXQgfQorICAKKyAgaW5pdCgpCit9CisKK2V4dGVuc2lvbiBURXJyb3IgeworICAvLy8gSHVtYW4gcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgZXJyb3IuIERlZmF1bHQgcHJvdmlkZWQgZm9yIHlvdSBpbiB0aGUKKyAgLy8vIGZvcm1hdCBcKFNlbGYuc2VsZik6IFwoZXJyb3IuZXJyb3JEZXNjcmlwdGlvbikgXG4gbWVzc2FnZQorICAvLy8gZWc6CisgIC8vLworICAvLy8gICAgIFRBcHBsaWNhdGlvbkVycm9yICgxKTogSW52YWxpZCBNZXNzYWdlIFR5cGUKKyAgLy8vICAgICBBbiB1bmtub3duIEVycm9yIGhhcyBvY2N1cmVkLgorICBwdWJsaWMgdmFyIGRlc2NyaXB0aW9uOiBTdHJpbmcgeworICAgIHZhciBvdXQgPSAiXChTZWxmLnNlbGYpIChcKGVycm9yLnRocmlmdEVycm9yQ29kZSkpOiAiICsgZXJyb3IuZGVzY3JpcHRpb24gKyAiXG4iCisgICAgaWYgbGV0IG1lc3NhZ2UgPSBtZXNzYWdlIHsKKyAgICAgIG91dCArPSAiTWVzc2FnZTogXChtZXNzYWdlKSIKKyAgICB9CisgICAgcmV0dXJuIG91dAorICB9CisKKyAgLy8vIFNpbXBsZSBkZWZhdWx0IEluaXRpYWxpemVyIGZvciBURXJyb3IncworICAvLy8KKyAgLy8vIC0gcGFyYW1ldGVyIGVycm9yOiAgIEVycm9yQ29kZSB2YWx1ZS4gIERlZmF1bHQ6IGRlZmF1bHRDYXNlCisgIC8vLyAtIHBhcmFtZXRlciBtZXNzYWdlOiBDdXN0b20gbWVzc2FnZSB3aXRoIGVycm9yLiAgT3B0aW9uYWwKKyAgLy8vCisgIC8vLyAtIHJldHVybnM6IDwjcmV0dXJuIHZhbHVlIGRlc2NyaXB0aW9uIz4KKyAgcHVibGljIGluaXQoZXJyb3I6IENvZGUsIG1lc3NhZ2U6IFN0cmluZz8gPSBuaWwpIHsKKyAgICBzZWxmLmluaXQoKQorICAgIHNlbGYuZXJyb3IgPSBlcnJvcgorICAgIHNlbGYubWVzc2FnZSA9IG1lc3NhZ2UKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1NvdXJjZXMvVEZpbGVIYW5kbGVUcmFuc3BvcnQuc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9URmlsZUhhbmRsZVRyYW5zcG9ydC5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzE1ZmVmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1NvdXJjZXMvVEZpbGVIYW5kbGVUcmFuc3BvcnQuc3dpZnQKQEAgLTAsMCArMSw1NiBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisqIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworaW1wb3J0IEZvdW5kYXRpb24KKworcHVibGljIGNsYXNzIFRGaWxlSGFuZGxlVHJhbnNwb3J0OiBUVHJhbnNwb3J0IHsKKyAgdmFyIGlucHV0RmlsZUhhbmRsZTogRmlsZUhhbmRsZQorICB2YXIgb3V0cHV0RmlsZUhhbmRsZTogRmlsZUhhbmRsZQorICAKKyAgcHVibGljIGluaXQoaW5wdXRGaWxlSGFuZGxlOiBGaWxlSGFuZGxlLCBvdXRwdXRGaWxlSGFuZGxlOiBGaWxlSGFuZGxlKSB7CisgICAgc2VsZi5pbnB1dEZpbGVIYW5kbGUgPSBpbnB1dEZpbGVIYW5kbGUKKyAgICBzZWxmLm91dHB1dEZpbGVIYW5kbGUgPSBvdXRwdXRGaWxlSGFuZGxlCisgIH0KKyAgCisgIHB1YmxpYyBjb252ZW5pZW5jZSBpbml0KGZpbGVIYW5kbGU6IEZpbGVIYW5kbGUpIHsKKyAgICBzZWxmLmluaXQoaW5wdXRGaWxlSGFuZGxlOiBmaWxlSGFuZGxlLCBvdXRwdXRGaWxlSGFuZGxlOiBmaWxlSGFuZGxlKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkKHNpemU6IEludCkgdGhyb3dzIC0+IERhdGEgeworICAgIHZhciBkYXRhID0gRGF0YSgpCisgICAgd2hpbGUgZGF0YS5jb3VudCA8IHNpemUgeworICAgICAgbGV0IHJlYWQgPSBpbnB1dEZpbGVIYW5kbGUucmVhZERhdGEob2ZMZW5ndGg6IHNpemUgLSBkYXRhLmNvdW50KQorICAgICAgZGF0YS5hcHBlbmQocmVhZCkKKyAgICAgIGlmIHJlYWQuY291bnQgPT0gMCB7CisgICAgICAgIGJyZWFrCisgICAgICB9CisgICAgfQorICAgIHJldHVybiBkYXRhCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlKGRhdGE6IERhdGEpIHRocm93cyB7CisgICAgb3V0cHV0RmlsZUhhbmRsZS53cml0ZShkYXRhKQorICB9CisgIAorICBwdWJsaWMgZnVuYyBmbHVzaCgpIHRocm93cyB7CisgICAgcmV0dXJuCisgIH0KK30KKworCmRpZmYgLS1naXQgYS9saWIvc3dpZnQvU291cmNlcy9URmlsZVRyYW5zcG9ydC5zd2lmdCBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RGaWxlVHJhbnNwb3J0LnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlMjI1M2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9URmlsZVRyYW5zcG9ydC5zd2lmdApAQCAtMCwwICsxLDEwMSBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisqIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworaW1wb3J0IEZvdW5kYXRpb24KKworI2lmIG9zKE9TWCkgfHwgb3MoaU9TKSB8fCBvcyh3YXRjaE9TKSB8fCBvcyh0dk9TKQorICBpbXBvcnQgRGFyd2luCisjZWxzZWlmIG9zKExpbnV4KSB8fCBvcyhGcmVlQlNEKSB8fCBvcyhQUzQpIHx8IG9zKEFuZHJvaWQpCisgIGltcG9ydCBHbGliYworI2VuZGlmCisKKy8vLyBURmlsZVRyYW5zcG9ydAorLy8vIEZvdW5kYXRpb24tbGVzcyBTd2lmdCBGaWxlIHRyYW5zcG9ydC4KKy8vLyBVc2VzIEMgZm9wZW4vZnJlYWQvZndyaXRlLAorLy8vIHByb3ZpZGVkIGJ5IEdsaWJjIGluIGxpbnV4IGFuZCBEYXJ3aW4gb24gT1NYL2lPUworcHVibGljIGNsYXNzIFRGaWxlVHJhbnNwb3J0OiBUVHJhbnNwb3J0IHsKKyAgdmFyIGZpbGVIYW5kbGU6IFVuc2FmZU11dGFibGVQb2ludGVyPEZJTEU+PyA9IG5pbAorICAKKyAgcHVibGljIGluaXQgKGZpbGVIYW5kbGU6IFVuc2FmZU11dGFibGVQb2ludGVyPEZJTEU+KSB7CisgICAgc2VsZi5maWxlSGFuZGxlID0gZmlsZUhhbmRsZQorICB9CisKKyAgcHVibGljIGNvbnZlbmllbmNlIGluaXQoZmlsZW5hbWU6IFN0cmluZykgdGhyb3dzIHsKKyAgICB2YXIgZmlsZUhhbmRsZTogVW5zYWZlTXV0YWJsZVBvaW50ZXI8RklMRT4/CisgICAgZmlsZW5hbWUud2l0aENTdHJpbmcoeyBjRmlsZW5hbWUgaW4KKyAgICAgICJydyIud2l0aENTdHJpbmcoeyBjTW9kZSBpbgorICAgICAgICBmaWxlSGFuZGxlID0gZm9wZW4oY0ZpbGVuYW1lLCBjTW9kZSkKKyAgICAgIH0pCisgICAgfSkKKyAgICBpZiBsZXQgZmlsZUhhbmRsZSA9IGZpbGVIYW5kbGUgeworICAgICAgc2VsZi5pbml0KGZpbGVIYW5kbGU6IGZpbGVIYW5kbGUpCisgICAgfSBlbHNlIHsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFcnJvcihlcnJvcjogLm5vdE9wZW4pCisgICAgfQorICB9CisgIAorICBkZWluaXQgeworICAgIGZjbG9zZShzZWxmLmZpbGVIYW5kbGUpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRBbGwoc2l6ZTogSW50KSB0aHJvd3MgLT4gRGF0YSB7CisgICAgbGV0IHJlYWQgPSB0cnkgc2VsZi5yZWFkKHNpemU6IHNpemUpCisgICAgCisgICAgaWYgcmVhZC5jb3VudCAhPSBzaXplIHsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFcnJvcihlcnJvcjogLmVuZE9mRmlsZSkKKyAgICB9CisgICAgcmV0dXJuIHJlYWQKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZChzaXplOiBJbnQpIHRocm93cyAtPiBEYXRhIHsKKyAgICAvLyBzZXQgdXAgcmVhZCBidWZmZXIsIHBvc2l0aW9uIDAKKyAgICB2YXIgcmVhZCA9IERhdGEoY2FwYWNpdHk6IHNpemUpCisgICAgdmFyIHBvc2l0aW9uID0gMAorICAgIAorICAgIC8vIHJlYWQgY2hhcmFjdGVyIGJ1ZmZlcgorICAgIHZhciBuZXh0Q2hhcjogVUludDggPSAwCisgICAgCisgICAgLy8gY29udGludWUgdW50aWwgd2UndmUgcmVhZCBzaXplIGJ5dGVzCisgICAgd2hpbGUgcmVhZC5jb3VudCA8IHNpemUgeworICAgICAgaWYgZnJlYWQoJm5leHRDaGFyLCAxLCAxLCBzZWxmLmZpbGVIYW5kbGUpID09IDEgeworICAgICAgICByZWFkW3Bvc2l0aW9uXSA9IG5leHRDaGFyCisKKyAgICAgICAgLy8gSW5jcmVtZW50IG91dHB1dCBieXRlIHBvaW50ZXIKKyAgICAgICAgcG9zaXRpb24gKz0gMQorICAgICAgICAKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93IFRUcmFuc3BvcnRFcnJvcihlcnJvcjogLmVuZE9mRmlsZSkKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlYWQKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGUoZGF0YTogRGF0YSkgdGhyb3dzIHsKKyAgICBsZXQgYnl0ZXNXcml0dGVuID0gZGF0YS53aXRoVW5zYWZlQnl0ZXMgeworICAgICAgZndyaXRlKCQwLCAxLCBkYXRhLmNvdW50LCBzZWxmLmZpbGVIYW5kbGUpCisgICAgfQorICAgIGlmIGJ5dGVzV3JpdHRlbiAhPSBkYXRhLmNvdW50IHsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFcnJvcihlcnJvcjogLnVua25vd24pCisgICAgfQorICB9CisgIAorICBwdWJsaWMgZnVuYyBmbHVzaCgpIHRocm93cyB7CisgICAgcmV0dXJuCisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL1RGcmFtZWRUcmFuc3BvcnQuc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9URnJhbWVkVHJhbnNwb3J0LnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMzg1ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9URnJhbWVkVHJhbnNwb3J0LnN3aWZ0CkBAIC0wLDAgKzEsMTIzIEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyogdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitpbXBvcnQgRm91bmRhdGlvbgorCitwdWJsaWMgY2xhc3MgVEZyYW1lZFRyYW5zcG9ydDogVFRyYW5zcG9ydCB7CisgIHB1YmxpYyBzdGF0aWMgbGV0IGhlYWRlclNpemUgICAgPSA0CisgIHB1YmxpYyBzdGF0aWMgbGV0IGluaXRGcmFtZVNpemUgPSAxMDI0CisgIHByaXZhdGUgc3RhdGljIGxldCBkZWZhdWx0TWF4TGVuZ3RoID0gMTYzODQwMDAKKworICBwdWJsaWMgdmFyIHRyYW5zcG9ydDogVFRyYW5zcG9ydAorICBwcml2YXRlIHZhciB3cml0ZUJ1ZmZlciA9IERhdGEoKQorCisgIHByaXZhdGUgdmFyIG1heFNpemUgICAgID0gVEZyYW1lZFRyYW5zcG9ydC5kZWZhdWx0TWF4TGVuZ3RoCisgIHByaXZhdGUgdmFyIHJlbWFpbmluZ0J5dGVzID0gMAorCisKKyAgcHVibGljIGluaXQodHJhbnNwb3J0OiBUVHJhbnNwb3J0LCBtYXhTaXplOiBJbnQpIHsKKyAgICBzZWxmLnRyYW5zcG9ydCA9IHRyYW5zcG9ydAorICAgIHNlbGYubWF4U2l6ZSA9IG1heFNpemUKKyAgfQorCisgIHB1YmxpYyBjb252ZW5pZW5jZSBpbml0KHRyYW5zcG9ydDogVFRyYW5zcG9ydCkgeworICAgIHNlbGYuaW5pdCh0cmFuc3BvcnQ6IHRyYW5zcG9ydCwgbWF4U2l6ZTogVEZyYW1lZFRyYW5zcG9ydC5kZWZhdWx0TWF4TGVuZ3RoKQorICB9CisKKyAgZnVuYyByZWFkSGVhZGVyKCkgdGhyb3dzIHsKKyAgICBsZXQgcmVhZCA9IHRyeSB0cmFuc3BvcnQucmVhZEFsbChzaXplOiBURnJhbWVkVHJhbnNwb3J0LmhlYWRlclNpemUpCisgICAgcmVtYWluaW5nQnl0ZXMgPSBJbnQoZGVjb2RlRnJhbWVTaXplKGRhdGE6IHJlYWQpKQorICB9CisKKyAgLy8vIE1hcms6IC0gVFRyYW5zcG9ydAorCisgIHB1YmxpYyBmdW5jIHJlYWQoc2l6ZTogSW50KSB0aHJvd3MgLT4gRGF0YSB7CisgICAgd2hpbGUgKHJlbWFpbmluZ0J5dGVzIDw9IDApIHsKKyAgICAgICAgdHJ5IHJlYWRIZWFkZXIoKQorICAgIH0KKworICAgIGxldCB0b1JlYWQgPSBtaW4oc2l6ZSwgcmVtYWluaW5nQnl0ZXMpCisKKyAgICBpZiB0b1JlYWQgPCAwIHsKKyAgICAgICAgdHJ5IGNsb3NlKCkKKyAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEVycm9yKGVycm9yOiAubmVnYXRpdmVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogICJSZWFkIGEgbmVnYXRpdmUgZnJhbWUgc2l6ZSAoXCh0b1JlYWQpKSEiKQorICAgIH0KKworICAgIGlmIHRvUmVhZCA+IG1heFNpemUgeworICAgICAgICB0cnkgY2xvc2UoKQorICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXJyb3IoZXJyb3I6IC5zaXplTGltaXQobGltaXQ6IG1heFNpemUsIGdvdDogdG9SZWFkKSkKKyAgICB9CisKKyAgICByZXR1cm4gdHJ5IHRyYW5zcG9ydC5yZWFkQWxsKHNpemU6IHRvUmVhZCkKKyAgfQorCisgIHB1YmxpYyBmdW5jIGZsdXNoKCkgdGhyb3dzIHsKKyAgICAvLyBjb3B5IGJ1ZmZlciBhbmQgcmVzZXQKKyAgICBsZXQgYnVmZiA9IHdyaXRlQnVmZmVyCisgICAgd3JpdGVCdWZmZXIgPSBEYXRhKCkKKworICAgIGlmIGJ1ZmYuY291bnQgLSBURnJhbWVkVHJhbnNwb3J0LmhlYWRlclNpemUgPCAwIHsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFcnJvcihlcnJvcjogLnVua25vd24pCisgICAgfQorCisgICAgbGV0IGZyYW1lU2l6ZSA9IGVuY29kZUZyYW1lU2l6ZShzaXplOiBVSW50MzIoYnVmZi5jb3VudCkpCisKKyAgICB0cnkgdHJhbnNwb3J0LndyaXRlKGRhdGE6IGZyYW1lU2l6ZSkKKyAgICB0cnkgdHJhbnNwb3J0LndyaXRlKGRhdGE6IGJ1ZmYpCisgICAgdHJ5IHRyYW5zcG9ydC5mbHVzaCgpCisgIH0KKworICBwdWJsaWMgZnVuYyB3cml0ZShkYXRhOiBEYXRhKSB0aHJvd3MgeworICAgIHdyaXRlQnVmZmVyLmFwcGVuZChkYXRhKQorICB9CisKKworCisgIHByaXZhdGUgZnVuYyBlbmNvZGVGcmFtZVNpemUoc2l6ZTogVUludDMyKSAtPiBEYXRhIHsKKyAgICB2YXIgZGF0YSA9IERhdGEoKQorICAgIGRhdGEuYXBwZW5kKERhdGEoYnl0ZXM6IFtVSW50OCgweGZmICYgKHNpemUgPj4gMjQpKV0pKQorICAgIGRhdGEuYXBwZW5kKERhdGEoYnl0ZXM6IFtVSW50OCgweGZmICYgKHNpemUgPj4gMTYpKV0pKQorICAgIGRhdGEuYXBwZW5kKERhdGEoYnl0ZXM6IFtVSW50OCgweGZmICYgKHNpemUgPj4gOCkpXSkpCisgICAgZGF0YS5hcHBlbmQoRGF0YShieXRlczogW1VJbnQ4KDB4ZmYgJiAoc2l6ZSkpXSkpCisKKyAgICByZXR1cm4gZGF0YQorICB9CisKKyAgcHJpdmF0ZSBmdW5jIGRlY29kZUZyYW1lU2l6ZShkYXRhOiBEYXRhKSAtPiBVSW50MzIgeworICAgIHZhciBzaXplOiBVSW50MzIKKyAgICBzaXplICA9IChVSW50MzIoZGF0YVswXSAmIDB4ZmYpIDw8IDI0KQorICAgIHNpemUgfD0gKFVJbnQzMihkYXRhWzFdICYgMHhmZikgPDwgMTYpCisgICAgc2l6ZSB8PSAoVUludDMyKGRhdGFbMl0gJiAweGZmKSA8PCAgOCkKKyAgICBzaXplIHw9IChVSW50MzIoZGF0YVszXSAmIDB4ZmYpKQorICAgIHJldHVybiBzaXplCisgIH0KKworICBwdWJsaWMgZnVuYyBjbG9zZSgpIHRocm93cyB7CisgICAgdHJ5IHRyYW5zcG9ydC5jbG9zZSgpCisgIH0KKworICBwdWJsaWMgZnVuYyBvcGVuKCkgdGhyb3dzIHsKKyAgICB0cnkgdHJhbnNwb3J0Lm9wZW4oKQorICB9CisKKyAgcHVibGljIGZ1bmMgaXNPcGVuKCkgdGhyb3dzIC0+IEJvb2wgeworICAgIHJldHVybiB0cnkgdHJhbnNwb3J0LmlzT3BlbigpCisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL1RIVFRQU2Vzc2lvblRyYW5zcG9ydC5zd2lmdCBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RIVFRQU2Vzc2lvblRyYW5zcG9ydC5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzBhZjhlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1NvdXJjZXMvVEhUVFBTZXNzaW9uVHJhbnNwb3J0LnN3aWZ0CkBAIC0wLDAgKzEsMTg0IEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyogdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitpbXBvcnQgRm91bmRhdGlvbgoraW1wb3J0IERpc3BhdGNoCisKKworcHVibGljIGNsYXNzIFRIVFRQU2Vzc2lvblRyYW5zcG9ydDogVEFzeW5jVHJhbnNwb3J0IHsKKyAgcHVibGljIGNsYXNzIEZhY3RvcnkgOiBUQXN5bmNUcmFuc3BvcnRGYWN0b3J5IHsKKyAgICBwdWJsaWMgdmFyIHJlc3BvbnNlVmFsaWRhdGU6ICgoSFRUUFVSTFJlc3BvbnNlPywgRGF0YT8pIHRocm93cyAtPiBWb2lkKT8KKyAgICAKKyAgICB2YXIgc2Vzc2lvbjogVVJMU2Vzc2lvbgorICAgIHZhciB1cmw6IFVSTAorICAgIAorICAgIHB1YmxpYyBjbGFzcyBmdW5jIHNldHVwRGVmYXVsdHNGb3JTZXNzaW9uQ29uZmlndXJhdGlvbihfIGNvbmZpZzogVVJMU2Vzc2lvbkNvbmZpZ3VyYXRpb24sIHdpdGhQcm90b2NvbE5hbWUgcHJvdG9jb2xOYW1lOiBTdHJpbmc/KSB7CisgICAgICB2YXIgdGhyaWZ0Q29udGVudFR5cGUgPSAiYXBwbGljYXRpb24veC10aHJpZnQiCisgICAgICAKKyAgICAgIGlmIGxldCBwcm90b2NvbE5hbWUgPSBwcm90b2NvbE5hbWUgeworICAgICAgICB0aHJpZnRDb250ZW50VHlwZSArPSAiOyBwPVwocHJvdG9jb2xOYW1lKSIKKyAgICAgIH0KKyAgICAgIAorICAgICAgY29uZmlnLnJlcXVlc3RDYWNoZVBvbGljeSA9IC5yZWxvYWRJZ25vcmluZ0xvY2FsQ2FjaGVEYXRhCisgICAgICBjb25maWcudXJsQ2FjaGUgPSBuaWwKKyAgICAgIAorICAgICAgY29uZmlnLmh0dHBTaG91bGRVc2VQaXBlbGluaW5nICA9IHRydWUKKyAgICAgIGNvbmZpZy5odHRwU2hvdWxkU2V0Q29va2llcyAgICAgPSB0cnVlCisgICAgICBjb25maWcuaHR0cEFkZGl0aW9uYWxIZWFkZXJzICAgID0gWyJDb250ZW50LVR5cGUiOiB0aHJpZnRDb250ZW50VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFjY2VwdCI6IHRocmlmdENvbnRlbnRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVXNlci1BZ2VudCI6ICJUaHJpZnQvU3dpZnQgKFNlc3Npb24pIl0KKyAgICAgIAorICAgICAgCisgICAgfQorICAgIAorICAgIHB1YmxpYyBpbml0KHNlc3Npb246IFVSTFNlc3Npb24sIHVybDogVVJMKSB7CisgICAgICBzZWxmLnNlc3Npb24gPSBzZXNzaW9uCisgICAgICBzZWxmLnVybCA9IHVybAorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgZnVuYyBuZXdUcmFuc3BvcnQoKSAtPiBUSFRUUFNlc3Npb25UcmFuc3BvcnQgeworICAgICAgcmV0dXJuIFRIVFRQU2Vzc2lvblRyYW5zcG9ydChmYWN0b3J5OiBzZWxmKQorICAgIH0KKyAgICAKKyAgICBmdW5jIHZhbGlkYXRlUmVzcG9uc2UoXyByZXNwb25zZTogSFRUUFVSTFJlc3BvbnNlPywgZGF0YTogRGF0YT8pIHRocm93cyB7CisgICAgICB0cnkgcmVzcG9uc2VWYWxpZGF0ZT8ocmVzcG9uc2UsIGRhdGEpCisgICAgfQorICAgIAorICAgIGZ1bmMgdGFza1dpdGhSZXF1ZXN0KF8gcmVxdWVzdDogVVJMUmVxdWVzdCwgY29tcGxldGlvbkhhbmRsZXI6IEBlc2NhcGluZyAoRGF0YT8sIFVSTFJlc3BvbnNlPywgRXJyb3I/KSAtPiAoKSkgdGhyb3dzIC0+IFVSTFNlc3Npb25UYXNrIHsKKyAgICAgIAorICAgICAgbGV0IG5ld1Rhc2s6IFVSTFNlc3Npb25UYXNrPyA9IHNlc3Npb24uZGF0YVRhc2sod2l0aDogcmVxdWVzdCwgY29tcGxldGlvbkhhbmRsZXI6IGNvbXBsZXRpb25IYW5kbGVyKQorICAgICAgaWYgbGV0IG5ld1Rhc2sgPSBuZXdUYXNrIHsKKyAgICAgICAgcmV0dXJuIG5ld1Rhc2sKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93IFRUcmFuc3BvcnRFcnJvcihlcnJvcjogLnVua25vd24sIG1lc3NhZ2U6ICJGYWlsZWQgdG8gY3JlYXRlIHNlc3Npb24gZGF0YSB0YXNrIikKKyAgICAgIH0KKyAgICB9ICAgIAorICB9CisgIAorICB2YXIgZmFjdG9yeTogRmFjdG9yeQorICB2YXIgcmVxdWVzdERhdGEgPSBEYXRhKCkKKyAgdmFyIHJlc3BvbnNlRGF0YSA9IERhdGEoKQorICB2YXIgcmVzcG9uc2VEYXRhT2Zmc2V0OiBJbnQgPSAwCisgIAorICBpbml0KGZhY3Rvcnk6IEZhY3RvcnkpIHsKKyAgICBzZWxmLmZhY3RvcnkgPSBmYWN0b3J5CisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRBbGwoc2l6ZTogSW50KSB0aHJvd3MgLT4gRGF0YSB7CisgICAgbGV0IHJlYWQgPSB0cnkgc2VsZi5yZWFkKHNpemU6IHNpemUpCisgICAgaWYgcmVhZC5jb3VudCAhPSBzaXplIHsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFcnJvcihlcnJvcjogLmVuZE9mRmlsZSkKKyAgICB9CisgICAgcmV0dXJuIHJlYWQKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZChzaXplOiBJbnQpIHRocm93cyAtPiBEYXRhIHsKKyAgICBsZXQgYXZhaWwgPSByZXNwb25zZURhdGEuY291bnQgLSByZXNwb25zZURhdGFPZmZzZXQKKyAgICBsZXQgKHN0YXJ0LCBzdG9wKSA9IChyZXNwb25zZURhdGFPZmZzZXQsIHJlc3BvbnNlRGF0YU9mZnNldCArIG1pbihzaXplLCBhdmFpbCkpCisgICAgbGV0IHJlYWQgPSByZXNwb25zZURhdGEuc3ViZGF0YShpbjogc3RhcnQuLjxzdG9wKQorICAgIHJlc3BvbnNlRGF0YU9mZnNldCArPSByZWFkLmNvdW50CisgICAgcmV0dXJuIHJlYWQKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGUoZGF0YTogRGF0YSkgdGhyb3dzIHsKKyAgICByZXF1ZXN0RGF0YS5hcHBlbmQoZGF0YSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgZmx1c2goXyBjb21wbGV0ZWQ6IEBlc2NhcGluZyAoVEFzeW5jVHJhbnNwb3J0LCBFcnJvcj8pIC0+IFZvaWQpIHsKKyAgICB2YXIgZXJyb3I6IEVycm9yPworICAgIHZhciB0YXNrOiBVUkxTZXNzaW9uVGFzaz8KKyAgICAKKyAgICB2YXIgcmVxdWVzdCA9IFVSTFJlcXVlc3QodXJsOiBmYWN0b3J5LnVybCkKKyAgICByZXF1ZXN0Lmh0dHBNZXRob2QgPSAiUE9TVCIKKyAgICByZXF1ZXN0Lmh0dHBCb2R5ID0gIHJlcXVlc3REYXRhCisKKyAgICByZXF1ZXN0RGF0YSA9IERhdGEoKQorCisgICAgZG8geworICAgICAgdGFzayA9IHRyeSBmYWN0b3J5LnRhc2tXaXRoUmVxdWVzdChyZXF1ZXN0LCBjb21wbGV0aW9uSGFuZGxlcjogeyAoZGF0YSwgcmVzcG9uc2UsIHRhc2tFcnJvcikgaW4KKworICAgICAgICAvLyBDaGVjayBpZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2l0aCB0aGUgbmV0d29yaworICAgICAgICBpZiB0YXNrRXJyb3IgIT0gbmlsIHsKKyAgICAgICAgICAgIGVycm9yID0gVFRyYW5zcG9ydEVycm9yKGVycm9yOiAudGltZWRPdXQpCisgICAgICAgICAgICBjb21wbGV0ZWQoc2VsZiwgZXJyb3IpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgfQorCisgICAgICAgIC8vIENoZWNrIHJlc3BvbnNlIHR5cGUKKyAgICAgICAgaWYgdGFza0Vycm9yID09IG5pbCAmJiAhKHJlc3BvbnNlIGlzIEhUVFBVUkxSZXNwb25zZSkgeworICAgICAgICAgICAgZXJyb3IgPSBUSFRUUFRyYW5zcG9ydEVycm9yKGVycm9yOiAuaW52YWxpZFJlc3BvbnNlKQorICAgICAgICAgICAgY29tcGxldGVkKHNlbGYsIGVycm9yKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIENoZWNrIHN0YXR1cyBjb2RlCisgICAgICAgIGlmIGxldCBodHRwUmVzcG9uc2UgPSByZXNwb25zZSBhcz8gSFRUUFVSTFJlc3BvbnNlIHsKKyAgICAgICAgICBpZiB0YXNrRXJyb3IgPT0gbmlsICYmIGh0dHBSZXNwb25zZS5zdGF0dXNDb2RlICE9IDIwMCB7CisgICAgICAgICAgICBpZiBodHRwUmVzcG9uc2Uuc3RhdHVzQ29kZSA9PSA0MDEgeworICAgICAgICAgICAgICBlcnJvciA9IFRIVFRQVHJhbnNwb3J0RXJyb3IoZXJyb3I6IC5hdXRoZW50aWNhdGlvbikKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGVycm9yID0gVEhUVFBUcmFuc3BvcnRFcnJvcihlcnJvcjogLmludmFsaWRTdGF0dXMoc3RhdHVzQ29kZTogaHR0cFJlc3BvbnNlLnN0YXR1c0NvZGUpKQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgICAgICAvLyBBbGxvdyBmYWN0b3J5IHRvIGNoZWNrCisgICAgICAgICAgaWYgZXJyb3IgIT0gbmlsIHsKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgdHJ5IHNlbGYuZmFjdG9yeS52YWxpZGF0ZVJlc3BvbnNlKGh0dHBSZXNwb25zZSwgZGF0YTogZGF0YSkKKyAgICAgICAgICAgIH0gY2F0Y2ggbGV0IHZhbGlkYXRlRXJyb3IgeworICAgICAgICAgICAgICBlcnJvciA9IHZhbGlkYXRlRXJyb3IKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgCisgICAgICAgICAgc2VsZi5yZXNwb25zZURhdGFPZmZzZXQgPSAwCisgICAgICAgICAgaWYgZXJyb3IgIT0gbmlsIHsKKyAgICAgICAgICAgIHNlbGYucmVzcG9uc2VEYXRhID0gRGF0YSgpCisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNlbGYucmVzcG9uc2VEYXRhID0gZGF0YSA/PyBEYXRhKCkKKyAgICAgICAgICB9CisgICAgICAgICAgY29tcGxldGVkKHNlbGYsIGVycm9yKQorICAgICAgICB9CisgICAgICB9KQorICAgICAgCisgICAgfSBjYXRjaCBsZXQgdGFza0Vycm9yIHsKKyAgICAgIGVycm9yID0gdGFza0Vycm9yCisgICAgfQorICAgIAorICAgIGlmIGxldCBlcnJvciA9IGVycm9yLCB0YXNrID09IG5pbCB7CisgICAgICBjb21wbGV0ZWQoc2VsZiwgZXJyb3IpCisgICAgfQorICAgIHRhc2s/LnJlc3VtZSgpCisgIH0KKworICBwdWJsaWMgZnVuYyBmbHVzaCgpIHRocm93cyB7CisgICAgbGV0IGNvbXBsZXRlZCA9IERpc3BhdGNoU2VtYXBob3JlKHZhbHVlOiAwKQorICAgIHZhciBpbnRlcm5hbEVycm9yOiBFcnJvcj8KKyAgICAKKyAgICBmbHVzaCgpIHsgXywgZXJyb3IgaW4KKyAgICAgIGludGVybmFsRXJyb3IgPSBlcnJvcgorICAgICAgY29tcGxldGVkLnNpZ25hbCgpCisgICAgfQorICAgIAorICAgIF8gPSBjb21wbGV0ZWQud2FpdCh0aW1lb3V0OiBEaXNwYXRjaFRpbWUuZGlzdGFudEZ1dHVyZSkKKyAgICAKKyAgICBpZiBsZXQgZXJyb3IgPSBpbnRlcm5hbEVycm9yIHsKKyAgICAgIHRocm93IGVycm9yCisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvc3dpZnQvU291cmNlcy9UTGlzdC5zd2lmdCBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RMaXN0LnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyMzlkMTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9UTGlzdC5zd2lmdApAQCAtMCwwICsxLDEzOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwdWJsaWMgc3RydWN0IFRMaXN0PEVsZW1lbnQgOiBUU2VyaWFsaXphYmxlPiA6IFJhbmRvbUFjY2Vzc0NvbGxlY3Rpb24sIE11dGFibGVDb2xsZWN0aW9uLCBFeHByZXNzaWJsZUJ5QXJyYXlMaXRlcmFsLCBUU2VyaWFsaXphYmxlLCBIYXNoYWJsZSB7CisgIHB1YmxpYyB0eXBlYWxpYXMgU3RvcmFnZSA9IEFycmF5PEVsZW1lbnQ+CisgIHB1YmxpYyB0eXBlYWxpYXMgSW5kaWNlcyA9IFN0b3JhZ2UuSW5kaWNlcworCisgIGludGVybmFsIHZhciBzdG9yYWdlID0gU3RvcmFnZSgpCisgIHB1YmxpYyBpbml0KCkgeyB9CisgIHB1YmxpYyBpbml0KGFycmF5TGl0ZXJhbCBlbGVtZW50czogRWxlbWVudC4uLikgeworICAgIHNlbGYuc3RvcmFnZSA9IFN0b3JhZ2UoZWxlbWVudHMpCisgIH0KKyAgcHVibGljIGluaXQ8U291cmNlIDogU2VxdWVuY2U+KF8gc2VxdWVuY2U6IFNvdXJjZSkgd2hlcmUgU291cmNlLkl0ZXJhdG9yLkVsZW1lbnQgPT0gRWxlbWVudCB7CisgICAgc3RvcmFnZSA9IFN0b3JhZ2Uoc2VxdWVuY2UpCisgIH0KKworICAvLy8gTWFyazogSGFzaGFibGUKKyAgcHVibGljIHZhciBoYXNoVmFsdWUgOiBJbnQgeworICAgIGxldCBwcmltZSA9IDMxCisgICAgdmFyIHJlc3VsdCA9IDEKKyAgICBmb3IgZWxlbWVudCBpbiBzdG9yYWdlIHsKKyAgICAgIHJlc3VsdCA9IHByaW1lICYqIHJlc3VsdCAmKyBlbGVtZW50Lmhhc2hWYWx1ZQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0CisgIH0KKyAgCisgIC8vLyBNYXJrOiBUU2VyaWFsaXphYmxlCisgIHB1YmxpYyBzdGF0aWMgdmFyIHRocmlmdFR5cGUgOiBUVHlwZSB7IHJldHVybiAubGlzdCB9CisKKyAgcHVibGljIHN0YXRpYyBmdW5jIHJlYWQoZnJvbSBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gVExpc3QgeworICAgIGxldCAoZWxlbWVudFR5cGUsIHNpemUpID0gdHJ5IHByb3RvLnJlYWRMaXN0QmVnaW4oKQorICAgIGlmIGVsZW1lbnRUeXBlICE9IEVsZW1lbnQudGhyaWZ0VHlwZSB7CisgICAgICB0aHJvdyBUUHJvdG9jb2xFcnJvcihlcnJvcjogLmludmFsaWREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5kZWRFcnJvcjogLnVuZXhwZWN0ZWRUeXBlKHR5cGU6IGVsZW1lbnRUeXBlKSkKKyAgICB9CisgICAgdmFyIGxpc3QgPSBUTGlzdCgpCisgICAgZm9yIF8gaW4gMC4uPHNpemUgeworICAgICAgbGV0IGVsZW1lbnQgPSB0cnkgRWxlbWVudC5yZWFkKGZyb206IHByb3RvKQorICAgICAgbGlzdC5zdG9yYWdlLmFwcGVuZChlbGVtZW50KQorICAgIH0KKyAgICB0cnkgcHJvdG8ucmVhZExpc3RFbmQoKQorICAgIHJldHVybiBsaXN0CisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlKHRvIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyB7CisgICAgdHJ5IHByb3RvLndyaXRlTGlzdEJlZ2luKGVsZW1lbnRUeXBlOiBFbGVtZW50LnRocmlmdFR5cGUsIHNpemU6IEludDMyKHNlbGYuY291bnQpKQorICAgIGZvciBlbGVtZW50IGluIHNlbGYuc3RvcmFnZSB7CisgICAgICB0cnkgRWxlbWVudC53cml0ZShlbGVtZW50LCB0bzogcHJvdG8pCisgICAgfQorICAgIHRyeSBwcm90by53cml0ZUxpc3RFbmQoKQorICB9CisKKyAgLy8vIE1hcms6IE11dGFibGVDb2xsZWN0aW9uCisgIAorICBwdWJsaWMgdHlwZWFsaWFzIFN1YlNlcXVlbmNlID0gU3RvcmFnZS5TdWJTZXF1ZW5jZQorICBwdWJsaWMgdHlwZWFsaWFzIEluZGV4ID0gU3RvcmFnZS5JbmRleAorICAKKyAgcHVibGljIHN1YnNjcmlwdChwb3NpdGlvbjogU3RvcmFnZS5JbmRleCkgLT4gRWxlbWVudCB7CisgICAgZ2V0IHsKKyAgICAgIHJldHVybiBzdG9yYWdlW3Bvc2l0aW9uXQorICAgIH0KKyAgICBzZXQgeworICAgICAgc3RvcmFnZVtwb3NpdGlvbl0gPSBuZXdWYWx1ZQorICAgIH0KKyAgfQorICAKKyAgcHVibGljIHN1YnNjcmlwdChyYW5nZTogUmFuZ2U8SW5kZXg+KSAtPiBTdWJTZXF1ZW5jZSB7CisgICAgZ2V0IHsKKyAgICAgIHJldHVybiBzdG9yYWdlW3JhbmdlXQorICAgIH0KKyAgICBzZXQgeworICAgICAgc3RvcmFnZVtyYW5nZV0gPSBuZXdWYWx1ZQorICAgIH0KKyAgfQorICAKKyAgcHVibGljIHZhciBzdGFydEluZGV4OiBJbmRleCB7CisgICAgcmV0dXJuIHN0b3JhZ2Uuc3RhcnRJbmRleAorICB9CisgIHB1YmxpYyB2YXIgZW5kSW5kZXg6IEluZGV4IHsKKyAgICByZXR1cm4gc3RvcmFnZS5lbmRJbmRleAorICB9CisgIAorICBwdWJsaWMgZnVuYyBmb3JtSW5kZXgoYWZ0ZXIgaTogaW5vdXQgSW5kZXgpIHsKKyAgICBzdG9yYWdlLmZvcm1JbmRleChhZnRlcjogJmkpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIGZvcm1JbmRleChiZWZvcmUgaTogaW5vdXQgSW50KSB7CisgICAgc3RvcmFnZS5mb3JtSW5kZXgoYmVmb3JlOiAmaSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgaW5kZXgoYWZ0ZXIgaTogSW5kZXgpIC0+IEluZGV4IHsKKyAgICByZXR1cm4gc3RvcmFnZS5pbmRleChhZnRlcjogaSkKKyAgfQorCisgIHB1YmxpYyBmdW5jIGluZGV4KGJlZm9yZSBpOiBJbnQpIC0+IEludCB7CisgICAgcmV0dXJuIHN0b3JhZ2UuaW5kZXgoYmVmb3JlOiBpKQorICB9CisKK30KKworZXh0ZW5zaW9uIFRMaXN0IDogUmFuZ2VSZXBsYWNlYWJsZUNvbGxlY3Rpb24geworICBwdWJsaWMgbXV0YXRpbmcgZnVuYyByZXBsYWNlU3VicmFuZ2U8QzogQ29sbGVjdGlvbj4oXyBzdWJyYW5nZTogUmFuZ2U8SW5kZXg+LCB3aXRoIG5ld0VsZW1lbnRzOiBDKQorICAgIHdoZXJlIEMuSXRlcmF0b3IuRWxlbWVudCA9PSBFbGVtZW50IHsKKyAgICBzdG9yYWdlLnJlcGxhY2VTdWJyYW5nZShzdWJyYW5nZSwgd2l0aDogbmV3RWxlbWVudHMpCisgIH0KK30KKworZXh0ZW5zaW9uIFRMaXN0IDogQ3VzdG9tU3RyaW5nQ29udmVydGlibGUsIEN1c3RvbURlYnVnU3RyaW5nQ29udmVydGlibGUgeworICAKKyAgcHVibGljIHZhciBkZXNjcmlwdGlvbiA6IFN0cmluZyB7CisgICAgcmV0dXJuIHN0b3JhZ2UuZGVzY3JpcHRpb24KKyAgfQorICAKKyAgcHVibGljIHZhciBkZWJ1Z0Rlc2NyaXB0aW9uIDogU3RyaW5nIHsKKyAgICByZXR1cm4gc3RvcmFnZS5kZWJ1Z0Rlc2NyaXB0aW9uCisgIH0KKyAgCit9CisKK3B1YmxpYyBmdW5jID09PEVsZW1lbnQ+KGxoczogVExpc3Q8RWxlbWVudD4sIHJoczogVExpc3Q8RWxlbWVudD4pIC0+IEJvb2wgeworICByZXR1cm4gbGhzLnN0b3JhZ2UuZWxlbWVudHNFcXVhbChyaHMuc3RvcmFnZSkgeyAkMCA9PSAkMSB9Cit9CmRpZmYgLS1naXQgYS9saWIvc3dpZnQvU291cmNlcy9UTWFwLnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvVE1hcC5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTgwMzc3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1NvdXJjZXMvVE1hcC5zd2lmdApAQCAtMCwwICsxLDE5NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwdWJsaWMgc3RydWN0IFRNYXA8S2V5IDogVFNlcmlhbGl6YWJsZSAmIEhhc2hhYmxlLCBWYWx1ZSA6IFRTZXJpYWxpemFibGU+OiBDb2xsZWN0aW9uLCBFeHByZXNzaWJsZUJ5RGljdGlvbmFyeUxpdGVyYWwsIEhhc2hhYmxlLCBUU2VyaWFsaXphYmxlIHsKKyAgcHVibGljIHR5cGVhbGlhcyBTdG9yYWdlID0gRGljdGlvbmFyeTxLZXksIFZhbHVlPgorICBwdWJsaWMgdHlwZWFsaWFzIEVsZW1lbnQgPSBTdG9yYWdlLkVsZW1lbnQKKyAgcHVibGljIHR5cGVhbGlhcyBJbmRleCA9IFN0b3JhZ2UuSW5kZXgKKyAgcHVibGljIHR5cGVhbGlhcyBJbmRleERpc3RhbmNlID0gU3RvcmFnZS5JbmRleERpc3RhbmNlCisgIHB1YmxpYyB0eXBlYWxpYXMgSW5kaWNlcyA9IFN0b3JhZ2UuSW5kaWNlcworICBwdWJsaWMgdHlwZWFsaWFzIFN1YlNlcXVlbmNlID0gU3RvcmFnZS5TdWJTZXF1ZW5jZQorICBpbnRlcm5hbCB2YXIgc3RvcmFnZSA9IFN0b3JhZ2UoKQorICAKKyAgLy8vIE1hcms6IEJlIExpa2UgRGljdGlvbmFyeQorICAKKyAgcHVibGljIGZ1bmMgaW5kZXhGb3JLZXkoXyBrZXk6IEtleSkgLT4gSW5kZXg/IHsKKyAgICByZXR1cm4gc3RvcmFnZS5pbmRleChmb3JLZXk6IGtleSkKKyAgfQorICAKKyAgcHVibGljIG11dGF0aW5nIGZ1bmMgdXBkYXRlVmFsdWUoXyB2YWx1ZTogVmFsdWUsIGZvcktleSBrZXk6IEtleSkgLT4gVmFsdWU/IHsKKyAgICByZXR1cm4gdXBkYXRlVmFsdWUodmFsdWUsIGZvcktleToga2V5KQorICB9CisgIAorICBwdWJsaWMgbXV0YXRpbmcgZnVuYyByZW1vdmVBdEluZGV4KF8gaW5kZXg6IERpY3Rpb25hcnlJbmRleDxLZXksIFZhbHVlPikgLT4gKEtleSwgVmFsdWUpIHsKKyAgICByZXR1cm4gcmVtb3ZlQXRJbmRleChpbmRleCkKKyAgfQorICAKKyAgcHVibGljIG11dGF0aW5nIGZ1bmMgcmVtb3ZlVmFsdWVGb3JLZXkoXyBrZXk6IEtleSkgLT4gVmFsdWU/IHsKKyAgICByZXR1cm4gc3RvcmFnZS5yZW1vdmVWYWx1ZShmb3JLZXk6IGtleSkKKyAgfQorICAKKyAgcHVibGljIGluaXQobWluaW11bUNhcGFjaXR5OiBJbnQpIHsKKyAgICBzdG9yYWdlID0gU3RvcmFnZShtaW5pbXVtQ2FwYWNpdHk6IG1pbmltdW1DYXBhY2l0eSkKKyAgfQorICAKKyAgLy8vIGluaXQgZnJvbSBEaWN0aW9uYXJ5PEssVj4KKyAgcHVibGljIGluaXQoXyBkaWN0OiBbS2V5OiBWYWx1ZV0pIHsKKyAgICBzdG9yYWdlID0gZGljdAorICB9CisKKyAgLy8vIHJlYWQgb25seSBhY2Nlc3MgdG8gc3RvcmFnZSBpZiBuZWVkZWQgYXMgRGljdGlvbmFyeTxLLFY+CisgIHB1YmxpYyB2YXIgZGljdGlvbmFyeTogW0tleTogVmFsdWVdIHsKKyAgICByZXR1cm4gc3RvcmFnZQorICB9CisgIAorICBwdWJsaWMgc3Vic2NyaXB0IChrZXk6IEtleSkgLT4gVmFsdWU/IHsKKyAgICBnZXQgeworICAgICAgcmV0dXJuIHN0b3JhZ2Vba2V5XQorICAgIH0KKyAgICBzZXQgeworICAgICAgc3RvcmFnZVtrZXldID0gbmV3VmFsdWUKKyAgICB9CisgIH0KKyAgCisgIC8vLyBNYXJrOiBDb2xsZWN0aW9uCisgIAorICBwdWJsaWMgdmFyIGluZGljZXM6IEluZGljZXMgeworICAgIHJldHVybiBzdG9yYWdlLmluZGljZXMKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgZGlzdGFuY2UoZnJvbSBzdGFydDogSW5kZXgsIHRvIGVuZDogSW5kZXgpIC0+IEluZGV4RGlzdGFuY2UgeworICAgIHJldHVybiBzdG9yYWdlLmRpc3RhbmNlKGZyb206IHN0YXJ0LCB0bzogZW5kKQorICB9CisgIAorICBwdWJsaWMgZnVuYyBpbmRleChfIGk6IEluZGV4LCBvZmZzZXRCeSBuOiBJbmRleERpc3RhbmNlKSAtPiBJbmRleCB7CisgICAgcmV0dXJuIHN0b3JhZ2UuaW5kZXgoaSwgb2Zmc2V0Qnk6IG4pCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIGluZGV4KF8gaTogSW5kZXgsIG9mZnNldEJ5IG46IEluZGV4RGlzdGFuY2UsIGxpbWl0ZWRCeSBsaW1pdDogSW5kZXgpIC0+IEluZGV4PyB7CisgICAgcmV0dXJuIHN0b3JhZ2UuaW5kZXgoaSwgb2Zmc2V0Qnk6IG4sIGxpbWl0ZWRCeTogbGltaXQpCisgIH0KKyAgCisgIHB1YmxpYyBzdWJzY3JpcHQocG9zaXRpb246IEluZGV4KSAtPiBFbGVtZW50IHsKKyAgICByZXR1cm4gc3RvcmFnZVtwb3NpdGlvbl0KKyAgfQorICAKKyAgLy8vIE1hcms6IEluZGV4YWJsZUJhc2UKKyAgCisgIHB1YmxpYyB2YXIgc3RhcnRJbmRleDogSW5kZXggeyByZXR1cm4gc3RvcmFnZS5zdGFydEluZGV4IH0KKyAgcHVibGljIHZhciBlbmRJbmRleDogSW5kZXggeyByZXR1cm4gc3RvcmFnZS5lbmRJbmRleCB9CisgIHB1YmxpYyBmdW5jIGluZGV4KGFmdGVyIGk6IEluZGV4KSAtPiBJbmRleCB7CisgICAgcmV0dXJuIHN0b3JhZ2UuaW5kZXgoYWZ0ZXI6IGkpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIGZvcm1JbmRleChhZnRlciBpOiBpbm91dCBJbmRleCkgeworICAgIHN0b3JhZ2UuZm9ybUluZGV4KGFmdGVyOiAmaSkKKyAgfQorICAKKyAgcHVibGljIHN1YnNjcmlwdChib3VuZHM6IFJhbmdlPEluZGV4PikgLT4gU3ViU2VxdWVuY2UgeworICAgIHJldHVybiBzdG9yYWdlW2JvdW5kc10KKyAgfQorICAKKyAgLy8vIE1hcms6IERpY3Rpb25hcnlMaXRlcmFsQ29udmVydGlibGUKKyAgCisgIHB1YmxpYyBpbml0KGRpY3Rpb25hcnlMaXRlcmFsIGVsZW1lbnRzOiAoS2V5LCBWYWx1ZSkuLi4pIHsKKyAgICBzdG9yYWdlID0gU3RvcmFnZSgpCisgICAgZm9yIChrZXksIHZhbHVlKSBpbiBlbGVtZW50cyB7CisgICAgICBzdG9yYWdlW2tleV0gPSB2YWx1ZQorICAgIH0KKyAgfQorCisgIC8vLyBNYXJrOiBIYXNoYWJsZQorICAKKyAgcHVibGljIHZhciBoYXNoVmFsdWU6IEludCB7CisgICAgbGV0IHByaW1lID0gMzEKKyAgICB2YXIgcmVzdWx0ID0gMQorICAgIGZvciAoa2V5LCB2YWx1ZSkgaW4gc3RvcmFnZSB7CisgICAgICByZXN1bHQgPSBwcmltZSAmKiByZXN1bHQgJisga2V5Lmhhc2hWYWx1ZQorICAgICAgcmVzdWx0ID0gcHJpbWUgJiogcmVzdWx0ICYrIHZhbHVlLmhhc2hWYWx1ZQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0CisgIH0KKyAgCisgIC8vLyBNYXJrOiBUU2VyaWFsaXphYmxlCisgIAorICBwdWJsaWMgc3RhdGljIHZhciB0aHJpZnRUeXBlIDogVFR5cGUgeyByZXR1cm4gLm1hcCB9CisgIHB1YmxpYyBpbml0KCkgeworICAgIHN0b3JhZ2UgPSBTdG9yYWdlKCkKKyAgfQorICAgCisgIHB1YmxpYyBzdGF0aWMgZnVuYyByZWFkKGZyb20gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIC0+IFRNYXAgeworCisgICAgbGV0IChrZXlUeXBlLCB2YWx1ZVR5cGUsIHNpemUpID0gdHJ5IHByb3RvLnJlYWRNYXBCZWdpbigpCisgICAgaWYgc2l6ZSA+IDAgeworICAgICAgaWYga2V5VHlwZSAhPSBLZXkudGhyaWZ0VHlwZSB7CisgICAgICAgIHRocm93IFRQcm90b2NvbEVycm9yKGVycm9yOiAuaW52YWxpZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICJVbmV4cGVjdGVkIFRNYXAgS2V5IFR5cGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbmRlZEVycm9yOiAudW5leHBlY3RlZFR5cGUodHlwZToga2V5VHlwZSkpCisgICAgICB9CisgICAgICBpZiB2YWx1ZVR5cGUgIT0gVmFsdWUudGhyaWZ0VHlwZSB7CisgICAgICAgIHRocm93IFRQcm90b2NvbEVycm9yKGVycm9yOiAuaW52YWxpZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICJVbmV4cGVjdGVkIFRNYXAgVmFsdWUgVHlwZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuZGVkRXJyb3I6IC51bmV4cGVjdGVkVHlwZSh0eXBlOiB2YWx1ZVR5cGUpKQorICAgICAgfQorICAgIH0KKworICAgIHZhciBtYXAgPSBUTWFwKCkKKyAgICBmb3IgXyBpbiAwLi48c2l6ZSB7CisgICAgICBsZXQga2V5ID0gdHJ5IEtleS5yZWFkKGZyb206IHByb3RvKQorICAgICAgbGV0IHZhbHVlID0gdHJ5IFZhbHVlLnJlYWQoZnJvbTogcHJvdG8pCisgICAgICBtYXAuc3RvcmFnZVtrZXldID0gdmFsdWUKKyAgICB9CisgICAgdHJ5IHByb3RvLnJlYWRNYXBFbmQoKQorICAgIHJldHVybiBtYXAKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGUodG8gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIHsKKyAgICB0cnkgcHJvdG8ud3JpdGVNYXBCZWdpbihrZXlUeXBlOiBLZXkudGhyaWZ0VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVR5cGU6IFZhbHVlLnRocmlmdFR5cGUsIHNpemU6IEludDMyKHNlbGYuY291bnQpKQorICAgIGZvciAoa2V5LCB2YWx1ZSkgaW4gc2VsZi5zdG9yYWdlIHsKKyAgICAgIHRyeSBLZXkud3JpdGUoa2V5LCB0bzogcHJvdG8pCisgICAgICB0cnkgVmFsdWUud3JpdGUodmFsdWUsIHRvOiBwcm90bykKKyAgICB9CisgICAgdHJ5IHByb3RvLndyaXRlTWFwRW5kKCkKKyAgfQorfQorCisvLy8gTWFyazogQ3VzdG9tU3RyaW5nQ29udmVydGlibGUsIEN1c3RvbURlYnVnU3RyaW5nQ29udmVydGlibGUKKworZXh0ZW5zaW9uIFRNYXAgOiBDdXN0b21TdHJpbmdDb252ZXJ0aWJsZSwgQ3VzdG9tRGVidWdTdHJpbmdDb252ZXJ0aWJsZSB7CisgIAorICBwdWJsaWMgdmFyIGRlc2NyaXB0aW9uIDogU3RyaW5nIHsKKyAgICByZXR1cm4gc3RvcmFnZS5kZXNjcmlwdGlvbgorICB9CisgIAorICBwdWJsaWMgdmFyIGRlYnVnRGVzY3JpcHRpb24gOiBTdHJpbmcgeworICAgIHJldHVybiBzdG9yYWdlLmRlYnVnRGVzY3JpcHRpb24KKyAgfQorICAKK30KKworLy8vIE1hcms6IEVxdWF0YWJsZQorCitwdWJsaWMgZnVuYyA9PTxLZXksIFZhbHVlPihsaHM6IFRNYXA8S2V5LFZhbHVlPiwgcmhzOiBUTWFwPEtleSwgVmFsdWU+KSAtPiBCb29sIHsKKyAgaWYgbGhzLmNvdW50ICE9IHJocy5jb3VudCB7CisgICAgcmV0dXJuIGZhbHNlCisgIH0KKyAgcmV0dXJuIGxocy5zdG9yYWdlLmVsZW1lbnRzRXF1YWwocmhzLnN0b3JhZ2UpIHsgJDAua2V5ID09ICQxLmtleSAmJiAkMC52YWx1ZSA9PSAkMS52YWx1ZSB9Cit9CmRpZmYgLS1naXQgYS9saWIvc3dpZnQvU291cmNlcy9UTWVtb3J5QnVmZmVyVHJhbnNwb3J0LnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvVE1lbW9yeUJ1ZmZlclRyYW5zcG9ydC5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDU4YjZlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1NvdXJjZXMvVE1lbW9yeUJ1ZmZlclRyYW5zcG9ydC5zd2lmdApAQCAtMCwwICsxLDc0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ltcG9ydCBGb3VuZGF0aW9uCisKK3B1YmxpYyBjbGFzcyBUTWVtb3J5QnVmZmVyVHJhbnNwb3J0IDogVFRyYW5zcG9ydCB7CisgIHB1YmxpYyBwcml2YXRlKHNldCkgdmFyIHJlYWRCdWZmZXIgPSBEYXRhKCkKKyAgcHVibGljIHByaXZhdGUoc2V0KSB2YXIgd3JpdGVCdWZmZXIgPSBEYXRhKCkKKyAgCisgIHB1YmxpYyBwcml2YXRlKHNldCkgdmFyIHBvc2l0aW9uID0gMAorCisgIHB1YmxpYyB2YXIgYnl0ZXNSZW1haW5pbmdJbkJ1ZmZlcjogSW50IHsKKyAgICByZXR1cm4gcmVhZEJ1ZmZlci5jb3VudCAtIHBvc2l0aW9uCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIGNvbnN1bWVCdWZmZXIoc2l6ZTogSW50KSB7CisgICAgcG9zaXRpb24gKz0gc2l6ZQorICB9CisgIHB1YmxpYyBmdW5jIGNsZWFyKCkgeworICAgIHJlYWRCdWZmZXIgPSBEYXRhKCkKKyAgICB3cml0ZUJ1ZmZlciA9IERhdGEoKQorICB9CisgIAorICAKKyAgcHJpdmF0ZSB2YXIgZmx1c2hIYW5kbGVyOiAoKFRNZW1vcnlCdWZmZXJUcmFuc3BvcnQsIERhdGEpIC0+ICgpKT8KKyAgCisgIHB1YmxpYyBpbml0KGZsdXNoSGFuZGxlcjogKChUTWVtb3J5QnVmZmVyVHJhbnNwb3J0LCBEYXRhKSAtPiAoKSk/ID0gbmlsKSB7CisgICAgc2VsZi5mbHVzaEhhbmRsZXIgPSBmbHVzaEhhbmRsZXIKKyAgfQorICAKKyAgcHVibGljIGNvbnZlbmllbmNlIGluaXQocmVhZEJ1ZmZlcjogRGF0YSwgZmx1c2hIYW5kbGVyOiAoKFRNZW1vcnlCdWZmZXJUcmFuc3BvcnQsIERhdGEpIC0+ICgpKT8gPSBuaWwpIHsKKyAgICBzZWxmLmluaXQoKQorICAgIHNlbGYucmVhZEJ1ZmZlciA9IHJlYWRCdWZmZXIKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVzZXQocmVhZEJ1ZmZlcjogRGF0YSA9IERhdGEoKSwgd3JpdGVCdWZmZXI6IERhdGEgPSBEYXRhKCkpIHsKKyAgICBzZWxmLnJlYWRCdWZmZXIgPSByZWFkQnVmZmVyCisgICAgc2VsZi53cml0ZUJ1ZmZlciA9IHdyaXRlQnVmZmVyCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWQoc2l6ZTogSW50KSB0aHJvd3MgLT4gRGF0YSB7CisgICAgbGV0IGFtb3VudFRvUmVhZCA9IG1pbihieXRlc1JlbWFpbmluZ0luQnVmZmVyLCBzaXplKQorICAgIGlmIGFtb3VudFRvUmVhZCA+IDAgeworICAgICAgbGV0IHJldCA9IHJlYWRCdWZmZXIuc3ViZGF0YShpbjogUmFuZ2UodW5jaGVja2VkQm91bmRzOiAobG93ZXI6IHBvc2l0aW9uLCB1cHBlcjogcG9zaXRpb24gKyBhbW91bnRUb1JlYWQpKSkKKyAgICAgIHBvc2l0aW9uICs9IHJldC5jb3VudAorICAgICAgcmV0dXJuIHJldAorICAgIH0KKyAgICByZXR1cm4gRGF0YSgpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlKGRhdGE6IERhdGEpIHRocm93cyB7CisgICAgd3JpdGVCdWZmZXIuYXBwZW5kKGRhdGEpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIGZsdXNoKCkgdGhyb3dzIHsKKyAgICBmbHVzaEhhbmRsZXI/KHNlbGYsIHdyaXRlQnVmZmVyKQorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvc3dpZnQvU291cmNlcy9UTXVsdGlwbGV4ZWRQcm90b2NvbC5zd2lmdCBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RNdWx0aXBsZXhlZFByb3RvY29sLnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczYThkNTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9UTXVsdGlwbGV4ZWRQcm90b2NvbC5zd2lmdApAQCAtMCwwICsxLDQ3IEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyogdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitwdWJsaWMgY2xhc3MgVE11bHRpcGxleGVkUHJvdG9jb2w8UHJvdG9jb2w6IFRQcm90b2NvbD46IFRXcmFwcGVkUHJvdG9jb2w8UHJvdG9jb2w+IHsKKyAgcHVibGljIGxldCBzZXBhcmF0b3IgPSAiOiIKKworICBwdWJsaWMgdmFyIHNlcnZpY2VOYW1lID0gIiIKKyAgCisgIHB1YmxpYyBjb252ZW5pZW5jZSBpbml0KG9uIHRyYW5zcG9ydDogVFRyYW5zcG9ydCwgc2VydmljZU5hbWU6IFN0cmluZykgeworICAgIHNlbGYuaW5pdChvbjogdHJhbnNwb3J0KQorICAgIHNlbGYuc2VydmljZU5hbWUgPSBzZXJ2aWNlTmFtZSAgICAKKyAgfQorCisgIG92ZXJyaWRlIHB1YmxpYyBmdW5jIHdyaXRlTWVzc2FnZUJlZ2luKG5hbWU6IFN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSBtZXNzYWdlVHlwZTogVE1lc3NhZ2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZUlEOiBJbnQzMikgdGhyb3dzIHsKKyAgICBzd2l0Y2ggbWVzc2FnZVR5cGUgeworICAgIGNhc2UgLmNhbGwsIC5vbmV3YXk6CisgICAgICB2YXIgc2VydmljZUZ1bmN0aW9uID0gc2VydmljZU5hbWUKKyAgICAgIHNlcnZpY2VGdW5jdGlvbiArPSBzZXJ2aWNlTmFtZSA9PSAiIiA/ICIiIDogc2VwYXJhdG9yCisgICAgICBzZXJ2aWNlRnVuY3Rpb24gKz0gbmFtZQorICAgICAgcmV0dXJuIHRyeSBzdXBlci53cml0ZU1lc3NhZ2VCZWdpbihuYW1lOiBzZXJ2aWNlRnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IG1lc3NhZ2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZUlEOiBzZXF1ZW5jZUlEKQorICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gdHJ5IHN1cGVyLndyaXRlTWVzc2FnZUJlZ2luKG5hbWU6IG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IG1lc3NhZ2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZUlEOiBzZXF1ZW5jZUlEKQorICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1NvdXJjZXMvVFByb2Nlc3Nvci5zd2lmdCBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RQcm9jZXNzb3Iuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZmMjIyZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RQcm9jZXNzb3Iuc3dpZnQKQEAgLTAsMCArMSwyOSBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisqIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworCitwdWJsaWMgdHlwZWFsaWFzIFRQcm9jZXNzb3JNZXNzYWdlSGFuZGxlcjxUPiA9IChJbnQsIFRQcm90b2NvbCwgVFByb3RvY29sLCBUKSAtPiBWb2lkCisKK3B1YmxpYyBwcm90b2NvbCBUUHJvY2Vzc29yIHsKKyAgYXNzb2NpYXRlZHR5cGUgU2VydmljZQorICB2YXIgc2VydmljZTogU2VydmljZSB7IGdldCBzZXQgfQorICBmdW5jIHByb2Nlc3Mob24gaW5Qcm90b2NvbDogVFByb3RvY29sLCBvdXRQcm90b2NvbDogVFByb3RvY29sKSB0aHJvd3MKKyAgaW5pdChzZXJ2aWNlOiBTZXJ2aWNlKQorfQorCmRpZmYgLS1naXQgYS9saWIvc3dpZnQvU291cmNlcy9UUHJvdG9jb2wuc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9UUHJvdG9jb2wuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRlNGEyMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RQcm90b2NvbC5zd2lmdApAQCAtMCwwICsxLDE4MiBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisqIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworaW1wb3J0IEZvdW5kYXRpb24KKy8vCisKK3B1YmxpYyBlbnVtIFRNZXNzYWdlVHlwZTogSW50MzIgeworICBjYXNlIGNhbGwgPSAxCisgIGNhc2UgcmVwbHkgPSAyCisgIGNhc2UgZXhjZXB0aW9uID0gMworICBjYXNlIG9uZXdheSA9IDQKK30KKworcHVibGljIGVudW0gVFR5cGU6IEludDMyIHsKKyAgY2FzZSBzdG9wICAgICA9IDAKKyAgY2FzZSB2b2lkICAgICA9IDEKKyAgY2FzZSBib29sICAgICA9IDIKKyAgY2FzZSBpOCAgICAgICA9IDMKKyAgY2FzZSBkb3VibGUgICA9IDQKKyAgY2FzZSBpMTYgICAgICA9IDYKKyAgY2FzZSBpMzIgICAgICA9IDgKKyAgY2FzZSBpNjQgICAgICA9IDEwCisgIGNhc2Ugc3RyaW5nICAgPSAxMQorICBjYXNlIGBzdHJ1Y3RgID0gMTIKKyAgY2FzZSBtYXAgICAgICA9IDEzCisgIGNhc2Ugc2V0ICAgICAgPSAxNAorICBjYXNlIGxpc3QgICAgID0gMTUKKyAgY2FzZSB1dGY4ICAgICA9IDE2CisgIGNhc2UgdXRmMTYgICAgPSAxNworfQorCitwdWJsaWMgcHJvdG9jb2wgVFByb3RvY29sIHsKKyAgdmFyIHRyYW5zcG9ydDogVFRyYW5zcG9ydCB7IGdldCBzZXQgfQorICBpbml0KG9uIHRyYW5zcG9ydDogVFRyYW5zcG9ydCkKKyAgLy8gUmVhZGluZyBNZXRob2RzCisgIAorICBmdW5jIHJlYWRNZXNzYWdlQmVnaW4oKSB0aHJvd3MgLT4gKFN0cmluZywgVE1lc3NhZ2VUeXBlLCBJbnQzMikKKyAgZnVuYyByZWFkTWVzc2FnZUVuZCgpIHRocm93cworICBmdW5jIHJlYWRTdHJ1Y3RCZWdpbigpIHRocm93cyAtPiBTdHJpbmcKKyAgZnVuYyByZWFkU3RydWN0RW5kKCkgdGhyb3dzCisgIGZ1bmMgcmVhZEZpZWxkQmVnaW4oKSB0aHJvd3MgLT4gKFN0cmluZywgVFR5cGUsIEludDMyKQorICBmdW5jIHJlYWRGaWVsZEVuZCgpIHRocm93cworICBmdW5jIHJlYWRNYXBCZWdpbigpIHRocm93cyAtPiAoVFR5cGUsIFRUeXBlLCBJbnQzMikKKyAgZnVuYyByZWFkTWFwRW5kKCkgdGhyb3dzCisgIGZ1bmMgcmVhZFNldEJlZ2luKCkgdGhyb3dzIC0+IChUVHlwZSwgSW50MzIpCisgIGZ1bmMgcmVhZFNldEVuZCgpIHRocm93cworICBmdW5jIHJlYWRMaXN0QmVnaW4oKSB0aHJvd3MgLT4gKFRUeXBlLCBJbnQzMikKKyAgZnVuYyByZWFkTGlzdEVuZCgpIHRocm93cworICAKKyAgZnVuYyByZWFkKCkgdGhyb3dzIC0+IFN0cmluZworICBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gQm9vbAorICBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gVUludDgKKyAgZnVuYyByZWFkKCkgdGhyb3dzIC0+IEludDE2CisgIGZ1bmMgcmVhZCgpIHRocm93cyAtPiBJbnQzMgorICBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gSW50NjQKKyAgZnVuYyByZWFkKCkgdGhyb3dzIC0+IERvdWJsZQorICBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gRGF0YQorICAKKyAgLy8gV3JpdGluZyBtZXRob2RzCisgIAorICBmdW5jIHdyaXRlTWVzc2FnZUJlZ2luKG5hbWU6IFN0cmluZywgdHlwZSBtZXNzYWdlVHlwZTogVE1lc3NhZ2VUeXBlLCBzZXF1ZW5jZUlEOiBJbnQzMikgdGhyb3dzCisgIGZ1bmMgd3JpdGVNZXNzYWdlRW5kKCkgdGhyb3dzCisgIGZ1bmMgd3JpdGVTdHJ1Y3RCZWdpbihuYW1lOiBTdHJpbmcpIHRocm93cworICBmdW5jIHdyaXRlU3RydWN0RW5kKCkgdGhyb3dzCisgIGZ1bmMgd3JpdGVGaWVsZEJlZ2luKG5hbWU6IFN0cmluZywgdHlwZSBmaWVsZFR5cGU6IFRUeXBlLCBmaWVsZElEOiBJbnQzMikgdGhyb3dzCisgIGZ1bmMgd3JpdGVGaWVsZFN0b3AoKSB0aHJvd3MKKyAgZnVuYyB3cml0ZUZpZWxkRW5kKCkgdGhyb3dzCisgIGZ1bmMgd3JpdGVNYXBCZWdpbihrZXlUeXBlOiBUVHlwZSwgdmFsdWVUeXBlOiBUVHlwZSwgc2l6ZTogSW50MzIpIHRocm93cworICBmdW5jIHdyaXRlTWFwRW5kKCkgdGhyb3dzCisgIGZ1bmMgd3JpdGVTZXRCZWdpbihlbGVtZW50VHlwZTogVFR5cGUsIHNpemU6IEludDMyKSB0aHJvd3MKKyAgZnVuYyB3cml0ZVNldEVuZCgpIHRocm93cworICBmdW5jIHdyaXRlTGlzdEJlZ2luKGVsZW1lbnRUeXBlOiBUVHlwZSwgc2l6ZTogSW50MzIpIHRocm93cworICBmdW5jIHdyaXRlTGlzdEVuZCgpIHRocm93cworCisgIGZ1bmMgd3JpdGUoXyB2YWx1ZTogU3RyaW5nKSB0aHJvd3MKKyAgZnVuYyB3cml0ZShfIHZhbHVlOiBCb29sKSB0aHJvd3MKKyAgZnVuYyB3cml0ZShfIHZhbHVlOiBVSW50OCkgdGhyb3dzCisgIGZ1bmMgd3JpdGUoXyB2YWx1ZTogSW50MTYpIHRocm93cworICBmdW5jIHdyaXRlKF8gdmFsdWU6IEludDMyKSB0aHJvd3MKKyAgZnVuYyB3cml0ZShfIHZhbHVlOiBJbnQ2NCkgdGhyb3dzCisgIGZ1bmMgd3JpdGUoXyB2YWx1ZTogRG91YmxlKSB0aHJvd3MKKyAgZnVuYyB3cml0ZShfIHZhbHVlOiBEYXRhKSB0aHJvd3MKK30KKworcHVibGljIGV4dGVuc2lvbiBUUHJvdG9jb2wgeworICBwdWJsaWMgZnVuYyB3cml0ZUZpZWxkVmFsdWUoXyB2YWx1ZTogVFNlcmlhbGl6YWJsZSwgbmFtZTogU3RyaW5nLCB0eXBlOiBUVHlwZSwgaWQ6IEludDMyKSB0aHJvd3MgeworICAgIHRyeSB3cml0ZUZpZWxkQmVnaW4obmFtZTogbmFtZSwgdHlwZTogdHlwZSwgZmllbGRJRDogaWQpCisgICAgdHJ5IHZhbHVlLndyaXRlKHRvOiBzZWxmKQorICAgIHRyeSB3cml0ZUZpZWxkRW5kKCkKKyAgfQorCisgIHB1YmxpYyBmdW5jIHZhbGlkYXRlVmFsdWUoXyB2YWx1ZTogQW55PywgbmFtZWQgbmFtZTogU3RyaW5nKSB0aHJvd3MgeworICAgIGlmIHZhbHVlID09IG5pbCB7CisgICAgICB0aHJvdyBUUHJvdG9jb2xFcnJvcihlcnJvcjogLnVua25vd24sIG1lc3NhZ2U6ICJNaXNzaW5nIHJlcXVpcmVkIHZhbHVlIGZvciBmaWVsZDogXChuYW1lKSIpCisgICAgfQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkUmVzdWx0TWVzc2FnZUJlZ2luKCkgdGhyb3dzIHsKKyAgICBsZXQgKF8sIHR5cGUsIF8pID0gdHJ5IHJlYWRNZXNzYWdlQmVnaW4oKTsKKyAgICBpZiB0eXBlID09IC5leGNlcHRpb24geworICAgICAgbGV0IHggPSB0cnkgcmVhZEV4Y2VwdGlvbigpCisgICAgICB0aHJvdyB4CisgICAgfQorICAgIHJldHVybgorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkRXhjZXB0aW9uKCkgdGhyb3dzIC0+IFRBcHBsaWNhdGlvbkVycm9yIHsKKyAgICByZXR1cm4gdHJ5IFRBcHBsaWNhdGlvbkVycm9yLnJlYWQoZnJvbTogc2VsZikKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVFeGNlcHRpb24obWVzc2FnZU5hbWUgbmFtZTogU3RyaW5nLCBzZXF1ZW5jZUlEOiBJbnQzMiwgZXg6IFRBcHBsaWNhdGlvbkVycm9yKSB0aHJvd3MgeworICAgIHRyeSB3cml0ZU1lc3NhZ2VCZWdpbihuYW1lOiBuYW1lLCB0eXBlOiAuZXhjZXB0aW9uLCBzZXF1ZW5jZUlEOiBzZXF1ZW5jZUlEKQorICAgIHRyeSBleC53cml0ZSh0bzogc2VsZikKKyAgICB0cnkgd3JpdGVNZXNzYWdlRW5kKCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgc2tpcCh0eXBlOiBUVHlwZSkgdGhyb3dzIHsKKyAgICBzd2l0Y2ggdHlwZSB7CisgICAgY2FzZSAuYm9vbDogICBfID0gdHJ5IHJlYWQoKSBhcyBCb29sCisgICAgY2FzZSAuaTg6ICAgXyA9IHRyeSByZWFkKCkgYXMgVUludDgKKyAgICBjYXNlIC5pMTY6ICAgIF8gPSB0cnkgcmVhZCgpIGFzIEludDE2CisgICAgY2FzZSAuaTMyOiAgICBfID0gdHJ5IHJlYWQoKSBhcyBJbnQzMgorICAgIGNhc2UgLmk2NDogICAgXyA9IHRyeSByZWFkKCkgYXMgSW50NjQKKyAgICBjYXNlIC5kb3VibGU6IF8gPSB0cnkgcmVhZCgpIGFzIERvdWJsZQorICAgIGNhc2UgLnN0cmluZzogXyA9IHRyeSByZWFkKCkgYXMgU3RyaW5nCisgICAgICAKKyAgICBjYXNlIC5zdHJ1Y3Q6CisgICAgICBfID0gdHJ5IHJlYWRTdHJ1Y3RCZWdpbigpCisgICAgICB3aGlsZSB0cnVlIHsKKyAgICAgICAgbGV0IChfLCBmaWVsZFR5cGUsIF8pID0gdHJ5IHJlYWRGaWVsZEJlZ2luKCkKKyAgICAgICAgaWYgZmllbGRUeXBlID09IC5zdG9wIHsKKyAgICAgICAgICBicmVhaworICAgICAgICB9CisgICAgICAgIHRyeSBza2lwKHR5cGU6IGZpZWxkVHlwZSkKKyAgICAgICAgdHJ5IHJlYWRGaWVsZEVuZCgpCisgICAgICB9CisgICAgICB0cnkgcmVhZFN0cnVjdEVuZCgpCisgICAgICAKKyAgICAgIAorICAgIGNhc2UgLm1hcDoKKyAgICAgIGxldCAoa2V5VHlwZSwgdmFsdWVUeXBlLCBzaXplKSA9IHRyeSByZWFkTWFwQmVnaW4oKQorICAgICAgZm9yIF8gaW4gMC4uPHNpemUgeworICAgICAgICB0cnkgc2tpcCh0eXBlOiBrZXlUeXBlKQorICAgICAgICB0cnkgc2tpcCh0eXBlOiB2YWx1ZVR5cGUpCisgICAgICB9CisgICAgICB0cnkgcmVhZE1hcEVuZCgpCisgICAgICAKKyAgICAgIAorICAgIGNhc2UgLnNldDoKKyAgICAgIGxldCAoZWxlbVR5cGUsIHNpemUpID0gdHJ5IHJlYWRTZXRCZWdpbigpCisgICAgICBmb3IgXyBpbiAwLi48c2l6ZSB7CisgICAgICAgIHRyeSBza2lwKHR5cGU6IGVsZW1UeXBlKQorICAgICAgfQorICAgICAgdHJ5IHJlYWRTZXRFbmQoKQorICAgICAgCisgICAgY2FzZSAubGlzdDoKKyAgICAgIGxldCAoZWxlbVR5cGUsIHNpemUpID0gdHJ5IHJlYWRMaXN0QmVnaW4oKQorICAgICAgZm9yIF8gaW4gMC4uPHNpemUgeworICAgICAgICB0cnkgc2tpcCh0eXBlOiBlbGVtVHlwZSkKKyAgICAgIH0KKyAgICAgIHRyeSByZWFkTGlzdEVuZCgpCisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybgorICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1NvdXJjZXMvVFByb3RvY29sRXJyb3Iuc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9UUHJvdG9jb2xFcnJvci5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWQxNGY5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1NvdXJjZXMvVFByb3RvY29sRXJyb3Iuc3dpZnQKQEAgLTAsMCArMSwxNDYgQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworKiB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK2ltcG9ydCBGb3VuZGF0aW9uCisKK3B1YmxpYyBzdHJ1Y3QgVFByb3RvY29sRXJyb3IgOiBURXJyb3IgeworICBwdWJsaWMgaW5pdCgpIHsgfQorCisgIHB1YmxpYyBlbnVtIENvZGUgOiBURXJyb3JDb2RlIHsKKyAgICBjYXNlIHVua25vd24KKyAgICBjYXNlIGludmFsaWREYXRhCisgICAgY2FzZSBuZWdhdGl2ZVNpemUKKyAgICBjYXNlIHNpemVMaW1pdChsaW1pdDogSW50LCBnb3Q6IEludCkKKyAgICBjYXNlIGJhZFZlcnNpb24oZXhwZWN0ZWQ6IFN0cmluZywgZ290OiBTdHJpbmcpCisgICAgY2FzZSBub3RJbXBsZW1lbnRlZAorICAgIGNhc2UgZGVwdGhMaW1pdAorCisgICAgcHVibGljIHZhciB0aHJpZnRFcnJvckNvZGU6IEludCB7CisgICAgICBzd2l0Y2ggc2VsZiB7CisgICAgICBjYXNlIC51bmtub3duOiAgICAgICAgcmV0dXJuIDAKKyAgICAgIGNhc2UgLmludmFsaWREYXRhOiAgICByZXR1cm4gMQorICAgICAgY2FzZSAubmVnYXRpdmVTaXplOiAgIHJldHVybiAyCisgICAgICBjYXNlIC5zaXplTGltaXQ6ICAgICAgcmV0dXJuIDMKKyAgICAgIGNhc2UgLmJhZFZlcnNpb246ICAgICByZXR1cm4gNAorICAgICAgY2FzZSAubm90SW1wbGVtZW50ZWQ6IHJldHVybiA1CisgICAgICBjYXNlIC5kZXB0aExpbWl0OiAgICAgcmV0dXJuIDYKKyAgICAgIH0KKworICAgIH0KKyAgICBwdWJsaWMgdmFyIGRlc2NyaXB0aW9uOiBTdHJpbmcgeworICAgICAgc3dpdGNoIHNlbGYgeworICAgICAgY2FzZSAudW5rbm93bjogICAgICAgIHJldHVybiAiVW5rbm93biBUUHJvdG9jb2xFcnJvciIKKyAgICAgIGNhc2UgLmludmFsaWREYXRhOiAgICByZXR1cm4gIkludmFsaWQgRGF0YSIKKyAgICAgIGNhc2UgLm5lZ2F0aXZlU2l6ZTogICByZXR1cm4gIk5lZ2F0aXZlIFNpemUiCisgICAgICBjYXNlIC5zaXplTGltaXQobGV0IGxpbWl0LCBsZXQgZ290KToKKyAgICAgICAgcmV0dXJuICJNZXNzYWdlIGV4Y2VlZHMgc2l6ZSBsaW1pdCBvZiBcKGxpbWl0KSAocmVjZWl2ZWQ6IFwoZ290KSIKKyAgICAgIGNhc2UgLmJhZFZlcnNpb24obGV0IGV4cGVjdGVkLCBsZXQgZ290KToKKyAgICAgICAgcmV0dXJuICJCYWQgVmVyc2lvbi4gKEV4cGVjdGVkOiBcKGV4cGVjdGVkKSwgR290OiBcKGdvdCkiCisgICAgICBjYXNlIC5ub3RJbXBsZW1lbnRlZDogcmV0dXJuICJOb3QgSW1wbGVtZW50ZWQiCisgICAgICBjYXNlIC5kZXB0aExpbWl0OiAgICAgcmV0dXJuICJEZXB0aCBMaW1pdCIKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwdWJsaWMgZW51bSBFeHRlbmRlZEVycm9yQ29kZSA6IFRFcnJvckNvZGUgeworICAgIGNhc2UgdW5rbm93bgorICAgIGNhc2UgbWlzc2luZ1JlcXVpcmVkRmllbGQoZmllbGROYW1lOiBTdHJpbmcpCisgICAgY2FzZSB1bmV4cGVjdGVkVHlwZSh0eXBlOiBUVHlwZSkKKyAgICBjYXNlIG1pc21hdGNoZWRQcm90b2NvbChleHBlY3RlZDogU3RyaW5nLCBnb3Q6IFN0cmluZykKKyAgICBwdWJsaWMgdmFyIHRocmlmdEVycm9yQ29kZTogSW50IHsKKyAgICAgIHN3aXRjaCBzZWxmIHsKKyAgICAgIGNhc2UgLnVua25vd246ICAgICAgICAgICAgICByZXR1cm4gMTAwMAorICAgICAgY2FzZSAubWlzc2luZ1JlcXVpcmVkRmllbGQ6IHJldHVybiAxMDAxCisgICAgICBjYXNlIC51bmV4cGVjdGVkVHlwZTogICAgICAgcmV0dXJuIDEwMDIKKyAgICAgIGNhc2UgLm1pc21hdGNoZWRQcm90b2NvbDogICByZXR1cm4gMTAwMworICAgICAgfQorICAgIH0KKyAgICBwdWJsaWMgdmFyIGRlc2NyaXB0aW9uOiBTdHJpbmcgeworICAgICAgc3dpdGNoIHNlbGYgeworICAgICAgY2FzZSAudW5rbm93bjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIlVua25vd24gVFByb3RvY29sRXh0ZW5kZWRFcnJvciIKKyAgICAgIGNhc2UgLm1pc3NpbmdSZXF1aXJlZEZpZWxkKGxldCBmaWVsZE5hbWUpOiAgICAgICAgcmV0dXJuICJNaXNzaW5nIFJlcXVpcmVkIEZpZWxkOiBcKGZpZWxkTmFtZSkiCisgICAgICBjYXNlIC51bmV4cGVjdGVkVHlwZShsZXQgdHlwZSk6ICAgICAgICAgICAgICAgICAgIHJldHVybiAiVW5leHBlY3RlZCBUeXBlIFwodHlwZS5zZWxmKSIKKyAgICAgIGNhc2UgLm1pc21hdGNoZWRQcm90b2NvbChsZXQgZXhwZWN0ZWQsIGxldCBnb3QpOiAgcmV0dXJuICJNaXNtYXRjaGVkIFByb3RvY29sLiAgKEV4cGVjdGVkOiBcKGV4cGVjdGVkKSwgZ290IFwoZ290KSkiCisgICAgICB9CisgICAgfQorICB9CisKKyAgcHVibGljIHZhciBleHRlbmRlZEVycm9yOiBFeHRlbmRlZEVycm9yQ29kZT8gPSBuaWwKKworICBwdWJsaWMgaW5pdChlcnJvcjogQ29kZSA9IC51bmtub3duLAorICAgICAgICAgICAgICBtZXNzYWdlOiBTdHJpbmc/ID0gbmlsLAorICAgICAgICAgICAgICBleHRlbmRlZEVycm9yOiBFeHRlbmRlZEVycm9yQ29kZT8gPSBuaWwpIHsKKyAgICBzZWxmLmVycm9yID0gZXJyb3IKKyAgICBzZWxmLm1lc3NhZ2UgPSBtZXNzYWdlCisgICAgc2VsZi5leHRlbmRlZEVycm9yID0gZXh0ZW5kZWRFcnJvcgorICB9CisKKyAgLy8vIE1hcms6IFRFcnJvcgorICBwdWJsaWMgdmFyIGVycm9yOiBDb2RlID0gLnVua25vd24KKyAgcHVibGljIHZhciBtZXNzYWdlOiBTdHJpbmc/ID0gbmlsCisgIHB1YmxpYyBzdGF0aWMgdmFyIGRlZmF1bHRDYXNlOiBDb2RlIHsgcmV0dXJuIC51bmtub3duIH0KKworICBwdWJsaWMgdmFyIGRlc2NyaXB0aW9uOiBTdHJpbmcgeworICAgIHZhciBvdXQgPSAiXChUUHJvdG9jb2xFcnJvci5zZWxmKTogIChcKGVycm9yLnRocmlmdEVycm9yQ29kZSkgXChlcnJvci5kZXNjcmlwdGlvbilcbiIKKyAgICBpZiBsZXQgZXh0ZW5kZWRFcnJvciA9IGV4dGVuZGVkRXJyb3IgeworICAgICAgb3V0ICs9ICJUUHJvdG9jb2xFeHRlbmRlZEVycm9yIChcKGV4dGVuZGVkRXJyb3IudGhyaWZ0RXJyb3JDb2RlKSk6IFwoZXh0ZW5kZWRFcnJvci5kZXNjcmlwdGlvbikiCisgICAgfQorICAgIGlmIGxldCBtZXNzYWdlID0gbWVzc2FnZSB7CisgICAgICBvdXQgKz0gIk1lc3NhZ2U6IFwobWVzc2FnZSkiCisgICAgfQorICAgIHJldHVybiBvdXQKKyAgfQorfQorCisKKy8vLyBXcmFwcGVyIGZvciBUcmFuc3BvcnQgZXJyb3JzIGluIFByb3RvY29scy4gIEluc3BpcmVkIGJ5IFRocmlmdC1Db2NvYSBQUk9UT0NPTF9UUkFOU1BPUlRfRVJST1IKKy8vLyBtYWNyby4gIE1vZGlmaWVkIHRvIGJlIG1vcmUgU3dpZnQteS4gIENhdGNoZXMgYW55IFRFcnJvciB0aHJvd24gd2l0aGluIHRoZSBibG9jayBhbmQKKy8vLyByZXRocm93cyBhIGdpdmVuIFRQcm90b2NvbEVycm9yLCB0aGUgb3JpZ2luYWwgZXJyb3IncyBkZXNjcmlwdGlvbiBpcyBhcHBlbmRlZCB0byB0aGUgbmV3CisvLy8gVFByb3RvY29sRXJyb3IncyBtZXNzYWdlLiAgc291cmNlRmlsZSwgc291cmNlTGluZSwgc291cmNlTWV0aG9kIGFyZSBhdXRvLXBvcHVsYXRlZCBhbmQgc2hvdWxkCisvLy8gYmUgaWdub3JlZCB3aGVuIGNhbGxpbmcuCisvLy8KKy8vLyAtIHBhcmFtZXRlciBlcnJvcjogICAgICAgIFRQcm90b2NvbEVycm9yIHRvIHRocm93IGlmIHRoZSBibG9jayB0aHJvd3MKKy8vLyAtIHBhcmFtZXRlciBzb3VyY2VGaWxlOiAgIHRocm93aW5nIGZpbGUsIGF1dG9wb3B1bGF0ZWQKKy8vLyAtIHBhcmFtZXRlciBzb3VyY2VMaW5lOiAgIHRocm93aW5nIGxpbmUsIGF1dG9wb3B1bGF0ZWQKKy8vLyAtIHBhcmFtZXRlciBzb3VyY2VNZXRob2Q6IHRocm93aW5nIG1ldGhvZCwgYXV0b3BvcHVsYXRlZAorLy8vIC0gcGFyYW1ldGVyIGJsb2NrOiAgICAgICAgdGhyb3dpbmcgYmxvY2sKKy8vLworLy8vIC0gdGhyb3dzOiBUUHJvdG9jb2xFcnJvciAgRGVmYXVsdCBpcyBUUHJvdG9jb2xFcnJvci5FcnJvckNvZGUudW5rbm93bi4gIFVuZGVybHlpbmcKKy8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yJ3MgZGVzY3JpcHRpb24gYXBwZW5kZWQgdG8gVFByb3RvY29sRXJyb3IubWVzc2FnZQorZnVuYyBQcm90b2NvbFRyYW5zcG9ydFRyeShlcnJvcjogVFByb3RvY29sRXJyb3IgPSBUUHJvdG9jb2xFcnJvcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VGaWxlOiBTdHJpbmcgPSAjZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlTGluZTogSW50ID0gI2xpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZU1ldGhvZDogU3RyaW5nID0gI2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jazogKCkgdGhyb3dzIC0+ICgpKSB0aHJvd3MgeworICAvLyBOZWVkIG11dGFibGUgY29weQorICB2YXIgZXJyb3IgPSBlcnJvcgorICBkbyB7CisgICAgdHJ5IGJsb2NrKCkKKyAgfSBjYXRjaCBsZXQgZXJyIGFzIFRFcnJvciB7CisgICAgdmFyIG1lc3NhZ2UgPSBlcnJvci5tZXNzYWdlID8/ICIiCisgICAgbWVzc2FnZSArPSAiXG5GaWxlOiBcKHNvdXJjZUZpbGUpXG4iCisgICAgbWVzc2FnZSArPSAiTGluZTogXChzb3VyY2VMaW5lKVxuIgorICAgIG1lc3NhZ2UgKz0gIk1ldGhvZDogXChzb3VyY2VNZXRob2QpIgorICAgIG1lc3NhZ2UgKz0gIlxuT3JpZ2luYWwgRXJyb3I6XG4iICsgZXJyLmRlc2NyaXB0aW9uCisgICAgZXJyb3IubWVzc2FnZSA9IG1lc3NhZ2UKKyAgICB0aHJvdyBlcnJvcgorICB9Cit9CisKKwpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1NvdXJjZXMvVFNTTFNvY2tldFRyYW5zcG9ydC5zd2lmdCBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RTU0xTb2NrZXRUcmFuc3BvcnQuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJiNTkwMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RTU0xTb2NrZXRUcmFuc3BvcnQuc3dpZnQKQEAgLTAsMCArMSwyMjkgQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworKiB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK2ltcG9ydCBGb3VuZGF0aW9uCitpbXBvcnQgQ29yZUZvdW5kYXRpb24KKworI2lmIG9zKExpbnV4KQorcHVibGljIGNsYXNzIFRTU0xTb2NrZXRUcmFuc3BvcnQgeworICBpbml0KGhvc3RuYW1lOiBTdHJpbmcsIHBvcnQ6IFVJbnQxNikgeworICAgIC8vIEZJWE1FIQorICAgIGFzc2VydChmYWxzZSwgIlNlY3VyaXR5IG5vdCBhdmFpbGFibGUgaW4gTGludXgsIFRTU0xTb2NrZXRUcmFuc3BvcnQgVW5hdmlsYWJsZSBmb3Igbm93IikKKyAgfQorfQorI2Vsc2UKK2xldCBpc0xpdHRsZUVuZGlhbiA9IEludChPU0hvc3RCeXRlT3JkZXIoKSkgPT0gT1NMaXR0bGVFbmRpYW4KK2xldCBodG9ucyAgPSBpc0xpdHRsZUVuZGlhbiA/IF9PU1N3YXBJbnQxNiA6IHsgJDAgfQorbGV0IGh0b25sICA9IGlzTGl0dGxlRW5kaWFuID8gX09TU3dhcEludDMyIDogeyAkMCB9CisKK3B1YmxpYyBjbGFzcyBUU1NMU29ja2V0VHJhbnNwb3J0OiBUU3RyZWFtVHJhbnNwb3J0IHsKKyAgdmFyIHNzbEhvc3RuYW1lOiBTdHJpbmcKKyAgdmFyIHNkOiBJbnQzMiA9IDAKKyAgCisgIHB1YmxpYyBpbml0KGhvc3RuYW1lOiBTdHJpbmcsIHBvcnQ6IFVJbnQxNikgdGhyb3dzIHsKKyAgICBzc2xIb3N0bmFtZSA9IGhvc3RuYW1lCisgICAgdmFyIHJlYWRTdHJlYW06IFVubWFuYWdlZDxDRlJlYWRTdHJlYW0+PworICAgIHZhciB3cml0ZVN0cmVhbTogVW5tYW5hZ2VkPENGV3JpdGVTdHJlYW0+PworICAgIAorICAgIC8qIGNyZWF0ZSBhIHNvY2tldCBzdHJ1Y3R1cmUgKi8KKyAgICB2YXIgcGluOiBzb2NrYWRkcl9pbiA9IHNvY2thZGRyX2luKCkKKyAgICB2YXIgaHA6IFVuc2FmZU11dGFibGVQb2ludGVyPGhvc3RlbnQ+PyA9IG5pbAorICAgIGZvciBpIGluIDAuLjwxMCB7CisgICAgICAKKyAgICAgIGhwID0gZ2V0aG9zdGJ5bmFtZShob3N0bmFtZS5jU3RyaW5nKHVzaW5nOiBTdHJpbmcuRW5jb2RpbmcudXRmOCkhKQorICAgICAgaWYgaHAgPT0gbmlsIHsKKyAgICAgICAgcHJpbnQoImZhaWxlZCB0byByZXNvbHZlIGhvc3RuYW1lIFwoaG9zdG5hbWUpIikKKyAgICAgICAgaGVycm9yKCJyZXNvbHYiKQorICAgICAgICBpZiBpID09IDkgeworICAgICAgICAgIHN1cGVyLmluaXQoaW5wdXRTdHJlYW06IG5pbCwgb3V0cHV0U3RyZWFtOiBuaWwpIC8vIGhhdmUgdG8gaW5pdCBiZWZvcmUgdGhyb3dpbmcKKyAgICAgICAgICB0aHJvdyBUU1NMU29ja2V0VHJhbnNwb3J0RXJyb3IoZXJyb3I6IC5ob3N0YW5hbWVSZXNvbHV0aW9uKGhvc3RuYW1lOiBob3N0bmFtZSkpCisgICAgICAgIH0KKyAgICAgICAgVGhyZWFkLnNsZWVwKGZvclRpbWVJbnRlcnZhbDogMC4yKQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgYnJlYWsKKyAgICAgIH0KKyAgICB9CisgICAgcGluLnNpbl9mYW1pbHkgID0gVUludDgoQUZfSU5FVCkKKyAgICBwaW4uc2luX2FkZHIgICAgPSBpbl9hZGRyKHNfYWRkcjogVUludDMyKChocD8ucG9pbnRlZS5oX2FkZHJfbGlzdC5wb2ludGVlPy5wb2ludGVlKSEpKSAvLyBJcyB0aGVyZSBhIGJldHRlciB3YXkgdG8gZ2V0IHRoaXM/Pz8KKyAgICBwaW4uc2luX3BvcnQgICAgPSBodG9ucyhwb3J0KQorICAgIAorICAgIC8qIGNyZWF0ZSB0aGUgc29ja2V0ICovCisgICAgc2QgPSBzb2NrZXQoSW50MzIoQUZfSU5FVCksIEludDMyKFNPQ0tfU1RSRUFNKSwgSW50MzIoSVBQUk9UT19UQ1ApKQorICAgIGlmIHNkID09IC0xIHsKKyAgICAgIHN1cGVyLmluaXQoaW5wdXRTdHJlYW06IG5pbCwgb3V0cHV0U3RyZWFtOiBuaWwpIC8vIGhhdmUgdG8gaW5pdCBiZWZvcmUgdGhyb3dpbmcKKyAgICAgIHRocm93IFRTU0xTb2NrZXRUcmFuc3BvcnRFcnJvcihlcnJvcjogLnNvY2tldENyZWF0ZShwb3J0OiBJbnQocG9ydCkpKQorICAgIH0KKyAgICAKKyAgICAvKiBvcGVuIGEgY29ubmVjdGlvbiAqLworICAgIC8vIG5lZWQgYSBub24tc2VsZiByZWYgdG8gc2QsIG90aGVyd2lzZSB0aGUgaiBjb21wbGFpbnMKKyAgICBsZXQgc2RfbG9jYWwgPSBzZAorICAgIGxldCBjb25uZWN0UmVzdWx0ID0gd2l0aFVuc2FmZVBvaW50ZXIodG86ICZwaW4pIHsKKyAgICAgIGNvbm5lY3Qoc2RfbG9jYWwsIFVuc2FmZVBvaW50ZXI8c29ja2FkZHI+KE9wYXF1ZVBvaW50ZXIoJDApKSwgc29ja2xlbl90KE1lbW9yeUxheW91dDxzb2NrYWRkcl9pbj4uc2l6ZSkpCisgICAgfQorICAgIGlmIGNvbm5lY3RSZXN1bHQgPT0gLTEgeworICAgICAgc3VwZXIuaW5pdChpbnB1dFN0cmVhbTogbmlsLCBvdXRwdXRTdHJlYW06IG5pbCkgLy8gaGF2ZSB0byBpbml0IGJlZm9yZSB0aHJvd2luZworICAgICAgdGhyb3cgVFNTTFNvY2tldFRyYW5zcG9ydEVycm9yKGVycm9yOiAuY29ubmVjdCkKKyAgICB9CisgICAgCisgICAgQ0ZTdHJlYW1DcmVhdGVQYWlyV2l0aFNvY2tldChrQ0ZBbGxvY2F0b3JEZWZhdWx0LCBzZCwgJnJlYWRTdHJlYW0sICZ3cml0ZVN0cmVhbSkKKyAgICAKKyAgICBDRlJlYWRTdHJlYW1TZXRQcm9wZXJ0eShyZWFkU3RyZWFtPy50YWtlUmV0YWluZWRWYWx1ZSgpLCAuc29ja2V0TmF0aXZlSGFuZGxlLCBrQ0ZCb29sZWFuVHJ1ZSkKKyAgICBDRldyaXRlU3RyZWFtU2V0UHJvcGVydHkod3JpdGVTdHJlYW0/LnRha2VSZXRhaW5lZFZhbHVlKCksIC5zb2NrZXROYXRpdmVIYW5kbGUsIGtDRkJvb2xlYW5UcnVlKQorICAgIAorICAgIHZhciBpbnB1dFN0cmVhbTogSW5wdXRTdHJlYW0/ID0gbmlsCisgICAgdmFyIG91dHB1dFN0cmVhbTogT3V0cHV0U3RyZWFtPyA9IG5pbAorICAgIGlmIHJlYWRTdHJlYW0gIT0gbmlsICYmIHdyaXRlU3RyZWFtICE9IG5pbCB7CisgICAgICAKKyAgICAgIENGUmVhZFN0cmVhbVNldFByb3BlcnR5KHJlYWRTdHJlYW0/LnRha2VSZXRhaW5lZFZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc29ja2V0U2VjdXJpdHlMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtDRlN0cmVhbVNvY2tldFNlY3VyaXR5TGV2ZWxUTFN2MSkKKyAgICAgIAorICAgICAgbGV0IHNldHRpbmdzOiBbU3RyaW5nOiBCb29sXSA9IFtrQ0ZTdHJlYW1TU0xWYWxpZGF0ZXNDZXJ0aWZpY2F0ZUNoYWluIGFzIFN0cmluZzogdHJ1ZV0KKyAgICAgIAorICAgICAgQ0ZSZWFkU3RyZWFtU2V0UHJvcGVydHkocmVhZFN0cmVhbT8udGFrZVJldGFpbmVkVmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5TU0xTZXR0aW5ncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzIGFzIENGVHlwZVJlZiEpCisgICAgICAKKyAgICAgIENGV3JpdGVTdHJlYW1TZXRQcm9wZXJ0eSh3cml0ZVN0cmVhbT8udGFrZVJldGFpbmVkVmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5TU0xTZXR0aW5ncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzIGFzIENGVHlwZVJlZiEpCisgICAgICAKKyAgICAgIGlucHV0U3RyZWFtID0gcmVhZFN0cmVhbSEudGFrZVJldGFpbmVkVmFsdWUoKQorICAgICAgaW5wdXRTdHJlYW0/LnNjaGVkdWxlKGluOiAuY3VycmVudCwgZm9yTW9kZTogLmRlZmF1bHRSdW5Mb29wTW9kZSkKKyAgICAgIGlucHV0U3RyZWFtPy5vcGVuKCkKKyAgICAgIAorICAgICAgb3V0cHV0U3RyZWFtID0gd3JpdGVTdHJlYW0hLnRha2VSZXRhaW5lZFZhbHVlKCkKKyAgICAgIG91dHB1dFN0cmVhbT8uc2NoZWR1bGUoaW46IC5jdXJyZW50LCBmb3JNb2RlOiAuZGVmYXVsdFJ1bkxvb3BNb2RlKQorICAgICAgb3V0cHV0U3RyZWFtPy5vcGVuKCkKKyAgICAgIAorICAgICAgcmVhZFN0cmVhbT8ucmVsZWFzZSgpCisgICAgICB3cml0ZVN0cmVhbT8ucmVsZWFzZSgpCisgICAgfQorICAgIAorICAgIAorICAgIHN1cGVyLmluaXQoaW5wdXRTdHJlYW06IGlucHV0U3RyZWFtLCBvdXRwdXRTdHJlYW06IG91dHB1dFN0cmVhbSkKKyAgICBzZWxmLmlucHV0Py5kZWxlZ2F0ZSA9IHNlbGYKKyAgICBzZWxmLm91dHB1dD8uZGVsZWdhdGUgPSBzZWxmCisgIH0KKyAgCisgIGZ1bmMgcmVjb3ZlckZyb21UcnVzdEZhaWx1cmUoXyBteVRydXN0OiBTZWNUcnVzdCwgbGFzdFRydXN0UmVzdWx0OiBTZWNUcnVzdFJlc3VsdFR5cGUpIC0+IEJvb2wgeworICAgIGxldCB0cnVzdFRpbWUgPSBTZWNUcnVzdEdldFZlcmlmeVRpbWUobXlUcnVzdCkKKyAgICBsZXQgY3VycmVudFRpbWUgPSBDRkFic29sdXRlVGltZUdldEN1cnJlbnQoKQorICAgIAorICAgIGxldCB0aW1lSW5jcmVtZW50ID0gMzE1MzYwMDAgLy8gZnJvbSBUU1NMU29ja2V0VHJhbnNwb3J0Lm0KKyAgICBsZXQgbmV3VGltZSA9IGN1cnJlbnRUaW1lIC0gRG91YmxlKHRpbWVJbmNyZW1lbnQpCisgICAgCisgICAgaWYgdHJ1c3RUaW1lIC0gbmV3VGltZSAhPSAwIHsKKyAgICAgIGxldCBuZXdEYXRlID0gQ0ZEYXRlQ3JlYXRlKG5pbCwgbmV3VGltZSkKKyAgICAgIFNlY1RydXN0U2V0VmVyaWZ5RGF0ZShteVRydXN0LCBuZXdEYXRlISkKKyAgICAgIAorICAgICAgdmFyIHRyID0gbGFzdFRydXN0UmVzdWx0CisgICAgICBsZXQgc3VjY2VzcyA9IHdpdGhVbnNhZmVNdXRhYmxlUG9pbnRlcih0bzogJnRyKSB7IHRyUHRyIC0+IEJvb2wgaW4KKyAgICAgICAgaWYgU2VjVHJ1c3RFdmFsdWF0ZShteVRydXN0LCB0clB0cikgIT0gZXJyU2VjU3VjY2VzcyB7CisgICAgICAgICAgcmV0dXJuIGZhbHNlCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWUKKyAgICAgIH0KKyAgICAgIGlmICFzdWNjZXNzIHsgcmV0dXJuIGZhbHNlIH0KKyAgICB9CisgICAgaWYgbGFzdFRydXN0UmVzdWx0ID09IC5wcm9jZWVkIHx8IGxhc3RUcnVzdFJlc3VsdCA9PSAudW5zcGVjaWZpZWQgeworICAgICAgICByZXR1cm4gZmFsc2UKKyAgICB9CisKKyAgICBwcmludCgiVFNTTFNvY2tldFRyYW5zcG9ydDogVW5hYmxlIHRvIHJlY292ZXIgY2VydGlmaWNhdGUgdHJ1c3QgZmFpbHVyZSIpCisgICAgcmV0dXJuIHRydWUKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgaXNPcGVuKCkgLT4gQm9vbCB7CisgICAgcmV0dXJuIHNkID4gMAorICB9Cit9CisKK2V4dGVuc2lvbiBUU1NMU29ja2V0VHJhbnNwb3J0OiBTdHJlYW1EZWxlZ2F0ZSB7CisgIHB1YmxpYyBmdW5jIHN0cmVhbShfIGFTdHJlYW06IFN0cmVhbSwgaGFuZGxlIGV2ZW50Q29kZTogU3RyZWFtLkV2ZW50KSB7CisgICAgCisgICAgc3dpdGNoIGV2ZW50Q29kZSB7CisgICAgY2FzZSBTdHJlYW0uRXZlbnQoKTogYnJlYWsKKyAgICBjYXNlIFN0cmVhbS5FdmVudC5oYXNCeXRlc0F2YWlsYWJsZTogYnJlYWsKKyAgICBjYXNlIFN0cmVhbS5FdmVudC5vcGVuQ29tcGxldGVkOiBicmVhaworICAgIGNhc2UgU3RyZWFtLkV2ZW50Lmhhc1NwYWNlQXZhaWxhYmxlOgorICAgICAgdmFyIHByb2NlZWQgPSBmYWxzZQorICAgICAgdmFyIHRydXN0UmVzdWx0OiBTZWNUcnVzdFJlc3VsdFR5cGUgPSAuaW52YWxpZAorCisgICAgICB2YXIgbmV3UG9saWNpZXM6IENGTXV0YWJsZUFycmF5PworICAgICAgCisgICAgICByZXBlYXQgeworICAgICAgICBsZXQgdHJ1c3Q6IFNlY1RydXN0ID0gYVN0cmVhbS5wcm9wZXJ0eShmb3JLZXk6IC5TU0xQZWVyVHJ1c3QpIGFzISBTZWNUcnVzdAorICAgICAgICAKKyAgICAgICAgLy8gQWRkIG5ldyBwb2xpY3kgdG8gY3VycmVudCBsaXN0IG9mIHBvbGljaWVzCisgICAgICAgIGxldCBwb2xpY3kgPSBTZWNQb2xpY3lDcmVhdGVTU0woZmFsc2UsIHNzbEhvc3RuYW1lIGFzIENGU3RyaW5nPykKKyAgICAgICAgdmFyIHBwb2xpY3kgPSBwb2xpY3kgLy8gbXV0YWJsZSBmb3IgcG9pbnRlcgorICAgICAgICBsZXQgcG9saWNpZXM6IFVuc2FmZU11dGFibGVQb2ludGVyPENGQXJyYXk/Pj8gPSBuaWwKKyAgICAgICAgaWYgU2VjVHJ1c3RDb3B5UG9saWNpZXModHJ1c3QsIHBvbGljaWVzISkgIT0gZXJyU2VjU3VjY2VzcyB7CisgICAgICAgICAgYnJlYWsKKyAgICAgICAgfQorICAgICAgICB3aXRoVW5zYWZlTXV0YWJsZVBvaW50ZXIodG86ICZwcG9saWN5KSB7IHB0ciBpbgorICAgICAgICAgIG5ld1BvbGljaWVzID0gQ0ZBcnJheUNyZWF0ZU11dGFibGVDb3B5KG5pbCwgMCwgcG9saWNpZXM/LnBvaW50ZWUpCisgICAgICAgICAgQ0ZBcnJheUFwcGVuZFZhbHVlKG5ld1BvbGljaWVzLCBwdHIpCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIHVwZGF0ZSB0cnVzdCBwb2xpY2llcworICAgICAgICBpZiBTZWNUcnVzdFNldFBvbGljaWVzKHRydXN0LCBuZXdQb2xpY2llcyEpICE9IGVyclNlY1N1Y2Nlc3MgeworICAgICAgICAgIGJyZWFrCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIEV2YWx1YXRlIHRoZSB0cnVzdCBjaGFpbgorICAgICAgICBsZXQgc3VjY2VzcyA9IHdpdGhVbnNhZmVNdXRhYmxlUG9pbnRlcih0bzogJnRydXN0UmVzdWx0KSB7IHRydXN0UHRyIC0+IEJvb2wgaW4KKyAgICAgICAgICBpZiBTZWNUcnVzdEV2YWx1YXRlKHRydXN0LCB0cnVzdFB0cikgIT0gZXJyU2VjU3VjY2VzcyB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2UKKyAgICAgICAgICB9CisgICAgICAgICAgcmV0dXJuIHRydWUKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgIXN1Y2Nlc3MgeworICAgICAgICAgIGJyZWFrCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBzd2l0Y2ggdHJ1c3RSZXN1bHQgeworICAgICAgICBjYXNlIC5wcm9jZWVkOiAgICAgIHByb2NlZWQgPSB0cnVlCisgICAgICAgIGNhc2UgLnVuc3BlY2lmaWVkOiAgcHJvY2VlZCA9IHRydWUKKyAgICAgICAgY2FzZSAucmVjb3ZlcmFibGVUcnVzdEZhaWx1cmU6CisgICAgICAgICAgcHJvY2VlZCA9IHNlbGYucmVjb3ZlckZyb21UcnVzdEZhaWx1cmUodHJ1c3QsIGxhc3RUcnVzdFJlc3VsdDogdHJ1c3RSZXN1bHQpCisgICAgICAgICAgCisgICAgICAgIGNhc2UgLmRlbnk6ICAgICAgICAgYnJlYWsKKyAgICAgICAgY2FzZSAuZmF0YWxUcnVzdEZhaWx1cmU6IGJyZWFrCisgICAgICAgIGNhc2UgLm90aGVyRXJyb3I6ICAgYnJlYWsKKyAgICAgICAgY2FzZSAuaW52YWxpZDogICAgICBicmVhaworICAgICAgICBkZWZhdWx0OiBicmVhaworICAgICAgICB9CisgICAgICB9IHdoaWxlIGZhbHNlCisgIAorICAgICAgaWYgIXByb2NlZWQgeworICAgICAgICBwcmludCgiVFNTTFNvY2tldFRyYW5zcG9ydDogQ2Fubm90IHRydXN0IGNlcnRpZmljYXRlLiAgUmVzdWx0OiBcKHRydXN0UmVzdWx0KSIpCisgICAgICAgIGFTdHJlYW0uY2xvc2UoKQorICAgICAgfQorICAgICAgCisgICAgY2FzZSBTdHJlYW0uRXZlbnQuZXJyb3JPY2N1cnJlZDogYnJlYWsKKyAgICBjYXNlIFN0cmVhbS5FdmVudC5lbmRFbmNvdW50ZXJlZDogYnJlYWsKKyAgICBkZWZhdWx0OiBicmVhaworICAgIH0KKyAgfQorfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvc3dpZnQvU291cmNlcy9UU1NMU29ja2V0VHJhbnNwb3J0RXJyb3Iuc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9UU1NMU29ja2V0VHJhbnNwb3J0RXJyb3Iuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRhMTYyYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RTU0xTb2NrZXRUcmFuc3BvcnRFcnJvci5zd2lmdApAQCAtMCwwICsxLDQ4IEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyogdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitwdWJsaWMgc3RydWN0IFRTU0xTb2NrZXRUcmFuc3BvcnRFcnJvcjogVEVycm9yIHsKKyAgcHVibGljIGVudW0gRXJyb3JDb2RlOiBURXJyb3JDb2RlIHsKKyAgICBjYXNlIGhvc3RhbmFtZVJlc29sdXRpb24oaG9zdG5hbWU6IFN0cmluZykKKyAgICBjYXNlIHNvY2tldENyZWF0ZShwb3J0OiBJbnQpCisgICAgY2FzZSBjb25uZWN0CisgIAorICAgIHB1YmxpYyB2YXIgdGhyaWZ0RXJyb3JDb2RlOiBJbnQgeworICAgICAgc3dpdGNoIHNlbGYgeworICAgICAgY2FzZSAuaG9zdGFuYW1lUmVzb2x1dGlvbjogIHJldHVybiAtMTAwMDAKKyAgICAgIGNhc2UgLnNvY2tldENyZWF0ZTogICAgICAgICByZXR1cm4gLTEwMDAxCisgICAgICBjYXNlIC5jb25uZWN0OiAgICAgICAgICAgICAgcmV0dXJuIC0xMDAwMgorICAgICAgfQorICAgIH0KKyAgCisgICAgcHVibGljIHZhciBkZXNjcmlwdGlvbjogU3RyaW5nIHsKKyAgICAgIHN3aXRjaCBzZWxmIHsKKyAgICAgIGNhc2UgLmhvc3RhbmFtZVJlc29sdXRpb24obGV0IGhvc3RuYW1lKTogIHJldHVybiAiRmFpbGVkIHRvIHJlc29sdmUgaG9zdG5hbWU6IFwoaG9zdG5hbWUpIgorICAgICAgY2FzZSAuc29ja2V0Q3JlYXRlKGxldCBwb3J0KTogICAgICAgICAgICAgcmV0dXJuICJDb3VsZCBub3QgY3JlYXRlIHNvY2tldCBvbiBwb3J0OiBcKHBvcnQpIgorICAgICAgY2FzZSAuY29ubmVjdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJDb25uZWN0IGVycm9yIgorICAgICAgfQorICAgIH0KKyAgCisgIH0KKyAgcHVibGljIHZhciBlcnJvcjogRXJyb3JDb2RlID0gLmNvbm5lY3QKKyAgcHVibGljIHZhciBtZXNzYWdlOiBTdHJpbmc/CisgIHB1YmxpYyBzdGF0aWMgdmFyIGRlZmF1bHRDYXNlOiBFcnJvckNvZGUgeyByZXR1cm4gLmNvbm5lY3QgfQorICAKKyAgcHVibGljIGluaXQoKSB7IH0KK30KZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL1RTZXJpYWxpemFibGUuc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9UU2VyaWFsaXphYmxlLnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0NTA5NmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9UU2VyaWFsaXphYmxlLnN3aWZ0CkBAIC0wLDAgKzEsMTM2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ltcG9ydCBGb3VuZGF0aW9uCisKKworcHVibGljIHByb3RvY29sIFRTZXJpYWxpemFibGUgeworICB2YXIgaGFzaFZhbHVlOiBJbnQgeyBnZXQgfQorCisgIC8vLyBUVHlwZSBmb3IgaW5zdGFuY2UKKyAgc3RhdGljIHZhciB0aHJpZnRUeXBlOiBUVHlwZSB7IGdldCB9CisKKyAgLy8vIFJlYWQgVFNlcmlhbGl6YWJsZSBpbnN0YW5jZSBmcm9tIFByb3RvY29sCisgIHN0YXRpYyBmdW5jIHJlYWQoZnJvbSBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gU2VsZgorCisgIC8vLyBXcml0ZSBUU2VyaWFsaXphYmxlIGluc3RhbmNlIHRvIFByb3RvY29sCisgIGZ1bmMgd3JpdGUodG8gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzCisKK30KKworZXh0ZW5zaW9uIFRTZXJpYWxpemFibGUgeworICBwdWJsaWMgc3RhdGljIGZ1bmMgd3JpdGUoXyB2YWx1ZTogU2VsZiwgdG8gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIHsKKyAgICB0cnkgdmFsdWUud3JpdGUodG86IHByb3RvKQorICB9CisKKyAgLy8vIGNvbnZlbmllbmNlIGZvciBtZW1iZXIgYWNjZXNzCisgIHB1YmxpYyB2YXIgdGhyaWZ0VHlwZTogVFR5cGUgeyByZXR1cm4gU2VsZi50aHJpZnRUeXBlIH0KK30KKworcHVibGljIGZ1bmMgPT08VD4obGhzOiBULCByaHM6IFQpIC0+IEJvb2wgd2hlcmUgVCA6IFRTZXJpYWxpemFibGUgeworICByZXR1cm4gbGhzLmhhc2hWYWx1ZSA9PSByaHMuaGFzaFZhbHVlCit9CisKKy8vLyBEZWZhdWx0IHJlYWQvd3JpdGUgZm9yIHByaW1pdGF2ZSBUaHJpZnQgdHlwZXM6CisvLy8gQm9vbCwgSW50OCAoYnl0ZSksIEludDE2LCBJbnQzMiwgSW50NjQsIERvdWJsZSwgU3RyaW5nCisKK2V4dGVuc2lvbiBCb29sIDogVFNlcmlhbGl6YWJsZSB7CisgIHB1YmxpYyBzdGF0aWMgdmFyIHRocmlmdFR5cGU6IFRUeXBlIHsgcmV0dXJuIC5ib29sIH0KKworICBwdWJsaWMgc3RhdGljIGZ1bmMgcmVhZChmcm9tIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyAtPiBCb29sIHsKKyAgICByZXR1cm4gdHJ5IHByb3RvLnJlYWQoKQorICB9CisKKyAgcHVibGljIGZ1bmMgd3JpdGUodG8gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIHsKKyAgICB0cnkgcHJvdG8ud3JpdGUoc2VsZikKKyAgfQorfQorCitleHRlbnNpb24gSW50OCA6IFRTZXJpYWxpemFibGUgeworICBwdWJsaWMgc3RhdGljIHZhciB0aHJpZnRUeXBlOiBUVHlwZSB7IHJldHVybiAuaTggfQorCisgIHB1YmxpYyBzdGF0aWMgZnVuYyByZWFkKGZyb20gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIC0+IEludDggeworICAgIHJldHVybiBJbnQ4KHRyeSBwcm90by5yZWFkKCkgYXMgVUludDgpCisgIH0KKworICBwdWJsaWMgZnVuYyB3cml0ZSh0byBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgeworICAgIHRyeSBwcm90by53cml0ZShVSW50OChzZWxmKSkKKyAgfQorfQorCitleHRlbnNpb24gSW50MTYgOiBUU2VyaWFsaXphYmxlIHsKKyAgcHVibGljIHN0YXRpYyB2YXIgdGhyaWZ0VHlwZTogVFR5cGUgeyByZXR1cm4gLmkxNiB9CisKKyAgcHVibGljIHN0YXRpYyBmdW5jIHJlYWQoZnJvbSBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gSW50MTYgeworICAgIHJldHVybiB0cnkgcHJvdG8ucmVhZCgpCisgIH0KKworICBwdWJsaWMgZnVuYyB3cml0ZSh0byBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgeworICAgIHRyeSBwcm90by53cml0ZShzZWxmKQorICB9Cit9CisKK2V4dGVuc2lvbiBJbnQzMiA6IFRTZXJpYWxpemFibGUgeworICBwdWJsaWMgc3RhdGljIHZhciB0aHJpZnRUeXBlOiBUVHlwZSB7IHJldHVybiAuaTMyIH0KKworICBwdWJsaWMgc3RhdGljIGZ1bmMgcmVhZChmcm9tIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyAtPiBJbnQzMiB7CisgICAgcmV0dXJuIHRyeSBwcm90by5yZWFkKCkKKyAgfQorCisgIHB1YmxpYyBmdW5jIHdyaXRlKHRvIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyB7CisgICAgdHJ5IHByb3RvLndyaXRlKHNlbGYpCisgIH0KK30KKworCitleHRlbnNpb24gSW50NjQgOiBUU2VyaWFsaXphYmxlIHsKKyAgcHVibGljIHN0YXRpYyB2YXIgdGhyaWZ0VHlwZTogVFR5cGUgeyByZXR1cm4gLmk2NCB9CisKKyAgcHVibGljIHN0YXRpYyBmdW5jIHJlYWQoZnJvbSBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gSW50NjQgeworICAgIHJldHVybiB0cnkgcHJvdG8ucmVhZCgpCisgIH0KKworICBwdWJsaWMgZnVuYyB3cml0ZSh0byBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgeworICAgIHRyeSBwcm90by53cml0ZShzZWxmKQorICB9Cit9CisKK2V4dGVuc2lvbiBEb3VibGUgOiBUU2VyaWFsaXphYmxlIHsKKyAgcHVibGljIHN0YXRpYyB2YXIgdGhyaWZ0VHlwZTogVFR5cGUgeyByZXR1cm4gLmRvdWJsZSB9CisKKyAgcHVibGljIHN0YXRpYyBmdW5jIHJlYWQoZnJvbSBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gRG91YmxlIHsKKyAgICByZXR1cm4gdHJ5IHByb3RvLnJlYWQoKQorICB9CisKKyAgcHVibGljIGZ1bmMgd3JpdGUodG8gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIHsKKyAgICB0cnkgcHJvdG8ud3JpdGUoc2VsZikKKyAgfQorfQorCitleHRlbnNpb24gU3RyaW5nIDogVFNlcmlhbGl6YWJsZSB7CisgIHB1YmxpYyBzdGF0aWMgdmFyIHRocmlmdFR5cGU6IFRUeXBlIHsgcmV0dXJuIC5zdHJpbmcgfQorCisgIHB1YmxpYyBzdGF0aWMgZnVuYyByZWFkKGZyb20gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIC0+IFN0cmluZyB7CisgICAgcmV0dXJuIHRyeSBwcm90by5yZWFkKCkKKyAgfQorCisgIHB1YmxpYyBmdW5jIHdyaXRlKHRvIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyB7CisgICAgdHJ5IHByb3RvLndyaXRlKHNlbGYpCisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL1RTZXQuc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9UU2V0LnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlY2QxNzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9UU2V0LnN3aWZ0CkBAIC0wLDAgKzEsMTg5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ltcG9ydCBGb3VuZGF0aW9uCisKK3B1YmxpYyBzdHJ1Y3QgVFNldDxFbGVtZW50IDogVFNlcmlhbGl6YWJsZSAmIEhhc2hhYmxlPiA6IFNldEFsZ2VicmEsIEhhc2hhYmxlLCBDb2xsZWN0aW9uLCBFeHByZXNzaWJsZUJ5QXJyYXlMaXRlcmFsLCBUU2VyaWFsaXphYmxlIHsKKyAgLy8vIFR5cGVhbGlhcyBmb3IgU3RvcmFnZSB0eXBlCisgIHB1YmxpYyB0eXBlYWxpYXMgU3RvcmFnZSA9IFNldDxFbGVtZW50PgorICAKKyAgCisgIC8vLyBJbnRlcm5hbCBTdG9yYWdlIHVzZWQgZm9yIFRTZXQgKFNldFw8RWxlbWVudFw+KQorICBpbnRlcm5hbCB2YXIgc3RvcmFnZSA6IFN0b3JhZ2UKKyAgCisgIAorICAvLy8gTWFyazogQ29sbGVjdGlvbgorICAKKyAgcHVibGljIHR5cGVhbGlhcyBJbmRpY2VzID0gU3RvcmFnZS5JbmRpY2VzCisgIHB1YmxpYyB0eXBlYWxpYXMgSW5kZXggPSBTdG9yYWdlLkluZGV4CisgIHB1YmxpYyB0eXBlYWxpYXMgSW5kZXhEaXN0YW5jZSA9IFN0b3JhZ2UuSW5kZXhEaXN0YW5jZQorICBwdWJsaWMgdHlwZWFsaWFzIFN1YlNlcXVlbmNlID0gU3RvcmFnZS5TdWJTZXF1ZW5jZQorICAKKyAgCisgIHB1YmxpYyB2YXIgaW5kaWNlczogSW5kaWNlcyB7IHJldHVybiBzdG9yYWdlLmluZGljZXMgfQorICAKKyAgLy8gTXVzdCBpbXBsZW1lbnQgaXNFbXB0eSBldmVuIHRob3VnaCBib3RoIFNldEFsZ2VicmEgYW5kIENvbGxlY3Rpb24gcHJvdmlkZSBpdCBkdWUgdG8gdGhlaXIgY29uZmxjaXRpbmcgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbnMKKyAgcHVibGljIHZhciBpc0VtcHR5OiBCb29sIHsgcmV0dXJuIHN0b3JhZ2UuaXNFbXB0eSB9CisgIAorICBwdWJsaWMgZnVuYyBkaXN0YW5jZShmcm9tIHN0YXJ0OiBJbmRleCwgdG8gZW5kOiBJbmRleCkgLT4gSW5kZXhEaXN0YW5jZSB7CisgICAgcmV0dXJuIHN0b3JhZ2UuZGlzdGFuY2UoZnJvbTogc3RhcnQsIHRvOiBlbmQpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIGluZGV4KF8gaTogSW5kZXgsIG9mZnNldEJ5IG46IEluZGV4RGlzdGFuY2UpIC0+IEluZGV4IHsKKyAgICByZXR1cm4gc3RvcmFnZS5pbmRleChpLCBvZmZzZXRCeTogbikKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgaW5kZXgoXyBpOiBJbmRleCwgb2Zmc2V0QnkgbjogSW5kZXhEaXN0YW5jZSwgbGltaXRlZEJ5IGxpbWl0OiBJbmRleCkgLT4gSW5kZXg/IHsKKyAgICByZXR1cm4gc3RvcmFnZS5pbmRleChpLCBvZmZzZXRCeTogbiwgbGltaXRlZEJ5OiBsaW1pdCkKKyAgfQorICAKKyAgI2lmIHN3aWZ0KD49My4yKQorICBwdWJsaWMgc3Vic2NyaXB0IChwb3NpdGlvbjogU3RvcmFnZS5JbmRleCkgLT4gRWxlbWVudCB7CisgICAgICByZXR1cm4gc3RvcmFnZVtwb3NpdGlvbl0KKyAgICB9CisgICNlbHNlCisgIHB1YmxpYyBzdWJzY3JpcHQgKHBvc2l0aW9uOiBTdG9yYWdlLkluZGV4KSAtPiBFbGVtZW50PyB7CisgICAgcmV0dXJuIHN0b3JhZ2VbcG9zaXRpb25dCisgIH0KKyAgI2VuZGlmCisgIAorICAvLy8gTWFyazogU2V0QWxnZWJyYQorICBpbnRlcm5hbCBpbml0KHN0b3JhZ2U6IFNldDxFbGVtZW50PikgeworICAgIHNlbGYuc3RvcmFnZSA9IHN0b3JhZ2UKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgY29udGFpbnMoXyBtZW1iZXI6IEVsZW1lbnQpIC0+IEJvb2wgeworICAgIHJldHVybiBzdG9yYWdlLmNvbnRhaW5zKG1lbWJlcikKKyAgfQorICAKKyAgcHVibGljIG11dGF0aW5nIGZ1bmMgaW5zZXJ0KF8gbmV3TWVtYmVyOiBFbGVtZW50KSAtPiAoaW5zZXJ0ZWQ6IEJvb2wsIG1lbWJlckFmdGVySW5zZXJ0OiBFbGVtZW50KSB7CisgICAgcmV0dXJuIHN0b3JhZ2UuaW5zZXJ0KG5ld01lbWJlcikKKyAgfQorICAKKyAgcHVibGljIG11dGF0aW5nIGZ1bmMgcmVtb3ZlKF8gbWVtYmVyOiBFbGVtZW50KSAtPiBFbGVtZW50PyB7CisgICAgcmV0dXJuIHN0b3JhZ2UucmVtb3ZlKG1lbWJlcikKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgdW5pb24oXyBvdGhlcjogVFNldDxFbGVtZW50PikgLT4gVFNldCB7CisgICAgcmV0dXJuIFRTZXQoc3RvcmFnZTogc3RvcmFnZS51bmlvbihvdGhlci5zdG9yYWdlKSkKKyAgfQorICAKKyAgcHVibGljIG11dGF0aW5nIGZ1bmMgZm9ybUludGVyc2VjdGlvbihfIG90aGVyOiBUU2V0PEVsZW1lbnQ+KSB7CisgICAgcmV0dXJuIHN0b3JhZ2UuZm9ybUludGVyc2VjdGlvbihvdGhlci5zdG9yYWdlKQorICB9CisgIAorICBwdWJsaWMgbXV0YXRpbmcgZnVuYyBmb3JtU3ltbWV0cmljRGlmZmVyZW5jZShfIG90aGVyOiBUU2V0PEVsZW1lbnQ+KSB7CisgICAgcmV0dXJuIHN0b3JhZ2UuZm9ybVN5bW1ldHJpY0RpZmZlcmVuY2Uob3RoZXIuc3RvcmFnZSkKKyAgfQorICAKKyAgcHVibGljIG11dGF0aW5nIGZ1bmMgZm9ybVVuaW9uKF8gb3RoZXI6IFRTZXQ8RWxlbWVudD4pIHsKKyAgICByZXR1cm4gc3RvcmFnZS5mb3JtVW5pb24ob3RoZXIuc3RvcmFnZSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgaW50ZXJzZWN0aW9uKF8gb3RoZXI6IFRTZXQ8RWxlbWVudD4pIC0+IFRTZXQgeworICAgIHJldHVybiBUU2V0KHN0b3JhZ2U6IHN0b3JhZ2UuaW50ZXJzZWN0aW9uKG90aGVyLnN0b3JhZ2UpKQorICB9CisgIAorICBwdWJsaWMgZnVuYyBzeW1tZXRyaWNEaWZmZXJlbmNlKF8gb3RoZXI6IFRTZXQ8RWxlbWVudD4pIC0+IFRTZXQgeworICAgIHJldHVybiBUU2V0KHN0b3JhZ2U6IHN0b3JhZ2Uuc3ltbWV0cmljRGlmZmVyZW5jZShvdGhlci5zdG9yYWdlKSkKKyAgfQorICAKKyAgcHVibGljIG11dGF0aW5nIGZ1bmMgdXBkYXRlKHdpdGggbmV3TWVtYmVyOiBFbGVtZW50KSAtPiBFbGVtZW50PyB7CisgICAgcmV0dXJuIHN0b3JhZ2UudXBkYXRlKHdpdGg6IG5ld01lbWJlcikKKyAgfQorICAKKyAgLy8vIE1hcms6IEluZGV4YWJsZUJhc2UKKyAgCisgIHB1YmxpYyB2YXIgc3RhcnRJbmRleDogSW5kZXggeyByZXR1cm4gc3RvcmFnZS5zdGFydEluZGV4IH0KKyAgcHVibGljIHZhciBlbmRJbmRleDogSW5kZXggeyByZXR1cm4gc3RvcmFnZS5lbmRJbmRleCB9CisgIHB1YmxpYyBmdW5jIGluZGV4KGFmdGVyIGk6IEluZGV4KSAtPiBJbmRleCB7CisgICAgcmV0dXJuIHN0b3JhZ2UuaW5kZXgoYWZ0ZXI6IGkpCisgIH0KKworICBwdWJsaWMgZnVuYyBmb3JtSW5kZXgoYWZ0ZXIgaTogaW5vdXQgU3RvcmFnZS5JbmRleCkgeworICAgIHN0b3JhZ2UuZm9ybUluZGV4KGFmdGVyOiAmaSkKKyAgfQorICAKKyAgcHVibGljIHN1YnNjcmlwdChib3VuZHM6IFJhbmdlPEluZGV4PikgLT4gU3ViU2VxdWVuY2UgeworICAgIHJldHVybiBzdG9yYWdlW2JvdW5kc10KKyAgfQorCisgIAorICAvLy8gTWFyazogSGFzaGFibGUKKyAgcHVibGljIHZhciBoYXNoVmFsdWUgOiBJbnQgeworICAgIGxldCBwcmltZSA9IDMxCisgICAgdmFyIHJlc3VsdCA9IDEKKyAgICBmb3IgZWxlbWVudCBpbiBzdG9yYWdlIHsKKyAgICAgIHJlc3VsdCA9IHByaW1lICYqIHJlc3VsdCAmKyBlbGVtZW50Lmhhc2hWYWx1ZQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0CisgIH0KKyAgCisgIC8vLyBNYXJrOiBUU2VyaWFsaXphYmxlCisgIHB1YmxpYyBzdGF0aWMgdmFyIHRocmlmdFR5cGUgOiBUVHlwZSB7IHJldHVybiAuc2V0IH0KKyAgCisgIHB1YmxpYyBpbml0KCkgeworICAgIHN0b3JhZ2UgPSBTdG9yYWdlKCkKKyAgfQorICAKKyAgcHVibGljIGluaXQoYXJyYXlMaXRlcmFsIGVsZW1lbnRzOiBFbGVtZW50Li4uKSB7CisgICAgc2VsZi5zdG9yYWdlID0gU3RvcmFnZShlbGVtZW50cykKKyAgfQorICAKKyAgcHVibGljIGluaXQ8U291cmNlIDogU2VxdWVuY2U+KF8gc2VxdWVuY2U6IFNvdXJjZSkgd2hlcmUgU291cmNlLkl0ZXJhdG9yLkVsZW1lbnQgPT0gRWxlbWVudCB7CisgICAgc3RvcmFnZSA9IFN0b3JhZ2Uoc2VxdWVuY2UpCisgIH0KKyAgCisgIHB1YmxpYyBzdGF0aWMgZnVuYyByZWFkKGZyb20gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIC0+IFRTZXQgeworICAgIGxldCAoZWxlbWVudFR5cGUsIHNpemUpID0gdHJ5IHByb3RvLnJlYWRTZXRCZWdpbigpCisgICAgaWYgZWxlbWVudFR5cGUgIT0gRWxlbWVudC50aHJpZnRUeXBlIHsKKyAgICAgIHRocm93IFRQcm90b2NvbEVycm9yKGVycm9yOiAuaW52YWxpZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbmRlZEVycm9yOiAudW5leHBlY3RlZFR5cGUodHlwZTogZWxlbWVudFR5cGUpKQorICAgIH0KKyAgICB2YXIgc2V0ID0gVFNldCgpCisgICAgZm9yIF8gaW4gMC4uPHNpemUgeworICAgICAgbGV0IGVsZW1lbnQgPSB0cnkgRWxlbWVudC5yZWFkKGZyb206IHByb3RvKQorICAgICAgc2V0LnN0b3JhZ2UuaW5zZXJ0KGVsZW1lbnQpCisgICAgfQorICAgIHRyeSBwcm90by5yZWFkU2V0RW5kKCkKKyAgICByZXR1cm4gc2V0CisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlKHRvIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyB7CisgICAgdHJ5IHByb3RvLndyaXRlU2V0QmVnaW4oZWxlbWVudFR5cGU6IEVsZW1lbnQudGhyaWZ0VHlwZSwgc2l6ZTogSW50MzIoc2VsZi5jb3VudCkpCisgICAgZm9yIGVsZW1lbnQgaW4gc2VsZi5zdG9yYWdlIHsKKyAgICAgIHRyeSBFbGVtZW50LndyaXRlKGVsZW1lbnQsIHRvOiBwcm90bykKKyAgICB9CisgICAgdHJ5IHByb3RvLndyaXRlU2V0RW5kKCkKKyAgfQorfQorCitleHRlbnNpb24gVFNldDogQ3VzdG9tU3RyaW5nQ29udmVydGlibGUsIEN1c3RvbURlYnVnU3RyaW5nQ29udmVydGlibGUgeworICBwdWJsaWMgdmFyIGRlc2NyaXB0aW9uIDogU3RyaW5nIHsKKyAgICByZXR1cm4gc3RvcmFnZS5kZXNjcmlwdGlvbgorICB9CisgIHB1YmxpYyB2YXIgZGVidWdEZXNjcmlwdGlvbiA6IFN0cmluZyB7CisgICAgcmV0dXJuIHN0b3JhZ2UuZGVidWdEZXNjcmlwdGlvbgorICB9CisgIAorfQorCitwdWJsaWMgZnVuYyA9PTxFbGVtZW50PihsaHM6IFRTZXQ8RWxlbWVudD4sIHJoczogVFNldDxFbGVtZW50PikgLT4gQm9vbCB7CisgIHJldHVybiBsaHMuc3RvcmFnZSA9PSByaHMuc3RvcmFnZQorfQpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1NvdXJjZXMvVFNvY2tldFNlcnZlci5zd2lmdCBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RTb2NrZXRTZXJ2ZXIuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDIyNGU2NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RTb2NrZXRTZXJ2ZXIuc3dpZnQKQEAgLTAsMCArMSwxNDkgQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworKiB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyNpZiBvcyhPU1gpIHx8IG9zKGlPUykgfHwgb3Mod2F0Y2hPUykgfHwgb3ModHZPUykKKyAgaW1wb3J0IERhcndpbgorI2Vsc2VpZiBvcyhMaW51eCkgfHwgb3MoRnJlZUJTRCkgfHwgb3MoUFM0KSB8fCBvcyhBbmRyb2lkKQorICBpbXBvcnQgR2xpYmMKKyAgaW1wb3J0IERpc3BhdGNoCisjZW5kaWYKKworaW1wb3J0IEZvdW5kYXRpb24KK2ltcG9ydCBDb3JlRm91bmRhdGlvbgorCitwdWJsaWMgbGV0IFRTb2NrZXRTZXJ2ZXJDbGllbnRDb25uZWN0aW9uRmluaXNoZWQgPSAiVFNvY2tldFNlcnZlckNsaWVudENvbm5lY3Rpb25GaW5pc2hlZCIKK3B1YmxpYyBsZXQgVFNvY2tldFNlcnZlclByb2Nlc3NvcktleSA9ICJUU29ja2V0U2VydmVyUHJvY2Vzc29yIgorcHVibGljIGxldCBUU29ja2V0U2VydmVyVHJhbnNwb3J0S2V5ID0gIlRTb2NrZXRTZXJ2ZXJUcmFuc3BvcnQiCisKK2NsYXNzIFRTb2NrZXRTZXJ2ZXI8SW5Qcm90b2NvbDogVFByb3RvY29sLCBPdXRQcm90b2NvbDogVFByb3RvY29sLCBQcm9jZXNzb3I6IFRQcm9jZXNzb3IsIFNlcnZpY2U+IHdoZXJlIFByb2Nlc3Nvci5TZXJ2aWNlID09IFNlcnZpY2UgeworICB2YXIgc29ja2V0RmlsZUhhbmRsZTogRmlsZUhhbmRsZQorICB2YXIgcHJvY2Vzc2luZ1F1ZXVlID0gIERpc3BhdGNoUXVldWUobGFiZWw6ICJUU29ja2V0U2VydmVyLnByb2Nlc3NpbmciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcW9zOiAuYmFja2dyb3VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IC5jb25jdXJyZW50KQorICB2YXIgc2VydmljZUhhbmRsZXI6IFNlcnZpY2UKKworICBwdWJsaWMgaW5pdChwb3J0OiBJbnQsCisgICAgICAgICAgICAgIHNlcnZpY2U6IFNlcnZpY2UsCisgICAgICAgICAgICAgIGluUHJvdG9jb2w6IEluUHJvdG9jb2wuVHlwZSwKKyAgICAgICAgICAgICAgb3V0UHJvdG9jb2w6IE91dFByb3RvY29sLlR5cGUsCisgICAgICAgICAgICAgIHByb2Nlc3NvcjogUHJvY2Vzc29yLlR5cGUpIHRocm93cyB7CisgICAgLy8gc2V0IHNlcnZpY2UgaGFuZGxlcgorICAgIHNlbGYuc2VydmljZUhhbmRsZXIgPSBzZXJ2aWNlCisKKyAgICAvLyBjcmVhdGUgYSBzb2NrZXQKKyAgICB2YXIgZmQ6IEludDMyID0gLTEKKyAgICAjaWYgb3MoTGludXgpCisgICAgICBsZXQgc29jayA9IENGU29ja2V0Q3JlYXRlKGtDRkFsbG9jYXRvckRlZmF1bHQsIFBGX0lORVQsIEludDMyKFNPQ0tfU1RSRUFNLnJhd1ZhbHVlKSwgSW50MzIoSVBQUk9UT19UQ1ApLCAwLCBuaWwsIG5pbCkKKyAgICAjZWxzZQorICAgICAgbGV0IHNvY2sgPSBDRlNvY2tldENyZWF0ZShrQ0ZBbGxvY2F0b3JEZWZhdWx0LCBQRl9JTkVULCBTT0NLX1NUUkVBTSwgSVBQUk9UT19UQ1AsIDAsIG5pbCwgbmlsKQorICAgICNlbmRpZgorICAgIGlmIHNvY2sgIT0gbmlsIHsKKyAgICAgIENGU29ja2V0U2V0U29ja2V0RmxhZ3Moc29jaywgQ0ZTb2NrZXRHZXRTb2NrZXRGbGFncyhzb2NrKSAmIH5rQ0ZTb2NrZXRDbG9zZU9uSW52YWxpZGF0ZSkKKworICAgICAgZmQgPSBDRlNvY2tldEdldE5hdGl2ZShzb2NrKQorICAgICAgdmFyIHllcyA9IDEKKyAgICAgIHNldHNvY2tvcHQoZmQsIFNPTF9TT0NLRVQsIFNPX1JFVVNFQUREUiwgJnllcywgVUludDMyKE1lbW9yeUxheW91dDxJbnQ+LnNpemUpKQorCisgICAgICAjaWYgb3MoTGludXgpCisgICAgICAgIHZhciBhZGRyID0gc29ja2FkZHJfaW4oc2luX2ZhbWlseTogc2FfZmFtaWx5X3QoQUZfSU5FVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luX3BvcnQ6IGluX3BvcnRfdChwb3J0LmJpZ0VuZGlhbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luX2FkZHI6IGluX2FkZHIoc19hZGRyOiBpbl9hZGRyX3QoMCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbl96ZXJvOiAoMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCkpCisgICAgICAjZWxzZQorICAgICAgICB2YXIgYWRkciA9IHNvY2thZGRyX2luKHNpbl9sZW46IFVJbnQ4KE1lbW9yeUxheW91dDxzb2NrYWRkcl9pbj4uc2l6ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luX2ZhbWlseTogc2FfZmFtaWx5X3QoQUZfSU5FVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luX3BvcnQ6IGluX3BvcnRfdChwb3J0LmJpZ0VuZGlhbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luX2FkZHI6IGluX2FkZHIoc19hZGRyOiBpbl9hZGRyX3QoMCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbl96ZXJvOiAoMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCkpCisgICAgICAjZW5kaWYKKworICAgICAgbGV0IHB0ciA9IHdpdGhVbnNhZmVQb2ludGVyKHRvOiAmYWRkcikgeworICAgICAgICByZXR1cm4gVW5zYWZlUG9pbnRlcjxVSW50OD4oT3BhcXVlUG9pbnRlcigkMCkpCisgICAgICB9CisKKyAgICAgIGxldCBhZGRyZXNzID0gRGF0YShieXRlczogcHRyLCBjb3VudDogTWVtb3J5TGF5b3V0PHNvY2thZGRyX2luPi5zaXplKQorCisgICAgICBsZXQgY2ZhZGRyID0gYWRkcmVzcy53aXRoVW5zYWZlQnl0ZXMgeworICAgICAgICBDRkRhdGFDcmVhdGVXaXRoQnl0ZXNOb0NvcHkoa0NGQWxsb2NhdG9yRGVmYXVsdCwgJDAsIGFkZHJlc3MuY291bnQsIG5pbCkKKyAgICAgIH0KKyAgICAgIGlmIENGU29ja2V0U2V0QWRkcmVzcyhzb2NrLCBjZmFkZHIpICE9IENGU29ja2V0RXJyb3Iuc3VjY2VzcyB7IC8va0NGU29ja2V0U3VjY2VzcyB7CisgICAgICAgIENGU29ja2V0SW52YWxpZGF0ZShzb2NrKQorICAgICAgICBwcmludCgiVFNvY2tldFNlcnZlcjogQ291bGQgbm90IGJpbmQgdG8gYWRkcmVzcyIpCisgICAgICAgIHRocm93IFRUcmFuc3BvcnRFcnJvcihlcnJvcjogLm5vdE9wZW4sIG1lc3NhZ2U6ICJDb3VsZCBub3QgYmluZCB0byBhZGRyZXNzIikKKyAgICAgIH0KKworICAgIH0gZWxzZSB7CisgICAgICBwcmludCgiVFNvY2tldFNlcnZlcjogTm8gc2VydmVyIHNvY2tldCIpCisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXJyb3IoZXJyb3I6IC5ub3RPcGVuLCBtZXNzYWdlOiAiQ291bGQgbm90IGNyZWF0ZSBzb2NrZXQiKQorICAgIH0KKworICAgIC8vIHdyYXAgaXQgaW4gYSBmaWxlIGhhbmRsZSBzbyB3ZSBjYW4gZ2V0IG1lc3NhZ2VzIGZyb20gaXQKKyAgICBzb2NrZXRGaWxlSGFuZGxlID0gRmlsZUhhbmRsZShmaWxlRGVzY3JpcHRvcjogZmQsIGNsb3NlT25EZWFsbG9jOiB0cnVlKQorCisgICAgLy8gdGhyb3cgYXdheSBvdXIgc29ja2V0CisgICAgQ0ZTb2NrZXRJbnZhbGlkYXRlKHNvY2spCisKKyAgICAvLyByZWdpc3RlciBmb3Igbm90aWZpY2F0aW9ucyBvZiBhY2NlcHRlZCBpbmNvbWluZyBjb25uZWN0aW9ucworICAgIF8gPSBOb3RpZmljYXRpb25DZW50ZXIuZGVmYXVsdC5hZGRPYnNlcnZlcihmb3JOYW1lOiAuTlNGaWxlSGFuZGxlQ29ubmVjdGlvbkFjY2VwdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Q6IG5pbCwgcXVldWU6IG5pbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3dlYWsgc2VsZl0gbm90aWZpY2F0aW9uIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWFyZCBsZXQgc3Ryb25nU2VsZiA9IHNlbGYgZWxzZSB7IHJldHVybiB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJvbmdTZWxmLmNvbm5lY3Rpb25BY2NlcHRlZChzdHJvbmdTZWxmLnNvY2tldEZpbGVIYW5kbGUpCisKKyAgICB9CisKKyAgICAvLyB0ZWxsIHNvY2tldCB0byBsaXN0ZW4KKyAgICBzb2NrZXRGaWxlSGFuZGxlLmFjY2VwdENvbm5lY3Rpb25JbkJhY2tncm91bmRBbmROb3RpZnkoKQorCisgICAgcHJpbnQoIlRTb2NrZXRTZXJ2ZXI6IExpc3RlbmluZyBvbiBUQ1AgcG9ydCBcKHBvcnQpIikKKyAgfQorCisgIGRlaW5pdCB7CisgICAgTm90aWZpY2F0aW9uQ2VudGVyLmRlZmF1bHQucmVtb3ZlT2JzZXJ2ZXIoc2VsZikKKyAgfQorCisgIGZ1bmMgY29ubmVjdGlvbkFjY2VwdGVkKF8gc29ja2V0OiBGaWxlSGFuZGxlKSB7CisgICAgLy8gTm93IHRoYXQgd2UgaGF2ZSBhIGNsaWVudCBjb25uZWN0ZWQsIGhhbmRsZSB0aGUgcmVxdWVzdCBvbiBxdWV1ZQorICAgIHByb2Nlc3NpbmdRdWV1ZS5hc3luYyB7CisgICAgICBzZWxmLmhhbmRsZUNsaWVudENvbm5lY3Rpb24oc29ja2V0KQorICAgIH0KKyAgfQorCisgIGZ1bmMgaGFuZGxlQ2xpZW50Q29ubmVjdGlvbihfIGNsaWVudFNvY2tldDogRmlsZUhhbmRsZSkgeworCisgICAgbGV0IHRyYW5zcG9ydCA9IFRGaWxlSGFuZGxlVHJhbnNwb3J0KGZpbGVIYW5kbGU6IGNsaWVudFNvY2tldCkKKyAgICBsZXQgcHJvY2Vzc29yID0gUHJvY2Vzc29yKHNlcnZpY2U6IHNlcnZpY2VIYW5kbGVyKQorCisgICAgbGV0IGluUHJvdG9jb2wgPSBJblByb3RvY29sKG9uOiB0cmFuc3BvcnQpCisgICAgbGV0IG91dFByb3RvY29sID0gT3V0UHJvdG9jb2wob246IHRyYW5zcG9ydCkKKworICAgIGRvIHsKKyAgICAgIHRyeSBwcm9jZXNzb3IucHJvY2VzcyhvbjogaW5Qcm90b2NvbCwgb3V0UHJvdG9jb2w6IG91dFByb3RvY29sKQorICAgIH0gY2F0Y2ggbGV0IGVycm9yIHsKKyAgICAgIHByaW50KCJFcnJvciBwcm9jZXNzaWduIHJlcXVlc3Q6IFwoZXJyb3IpIikKKyAgICB9CisgICAgRGlzcGF0Y2hRdWV1ZS5tYWluLmFzeW5jIHsKKyAgICAgIE5vdGlmaWNhdGlvbkNlbnRlci5kZWZhdWx0CisgICAgICAgIC5wb3N0KG5hbWU6IE5vdGlmaWNhdGlvbi5OYW1lKHJhd1ZhbHVlOiBUU29ja2V0U2VydmVyQ2xpZW50Q29ubmVjdGlvbkZpbmlzaGVkKSwKKyAgICAgICAgICAgICAgb2JqZWN0OiBzZWxmLAorICAgICAgICAgICAgICB1c2VySW5mbzogW1RTb2NrZXRTZXJ2ZXJQcm9jZXNzb3JLZXk6IHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUU29ja2V0U2VydmVyVHJhbnNwb3J0S2V5OiB0cmFuc3BvcnRdKQorICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1NvdXJjZXMvVFNvY2tldFRyYW5zcG9ydC5zd2lmdCBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RTb2NrZXRUcmFuc3BvcnQuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDMxNmUzNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RTb2NrZXRUcmFuc3BvcnQuc3dpZnQKQEAgLTAsMCArMSwyMTAgQEAKKworLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKKyNpZiBvcyhPU1gpIHx8IG9zKGlPUykgfHwgb3Mod2F0Y2hPUykgfHwgb3ModHZPUykKKyAgaW1wb3J0IERhcndpbgorI2Vsc2VpZiBvcyhMaW51eCkgfHwgb3MoRnJlZUJTRCkgfHwgb3MoUFM0KSB8fCBvcyhBbmRyb2lkKQorICBpbXBvcnQgR2xpYmMKKyAgaW1wb3J0IERpc3BhdGNoCisjZW5kaWYKKworaW1wb3J0IEZvdW5kYXRpb24KK2ltcG9ydCBDb3JlRm91bmRhdGlvbgorCitwcml2YXRlIHN0cnVjdCBTeXMgeworICAjaWYgb3MoTGludXgpCisgIHN0YXRpYyBsZXQgcmVhZCA9IEdsaWJjLnJlYWQKKyAgc3RhdGljIGxldCB3cml0ZSA9IEdsaWJjLndyaXRlCisgIHN0YXRpYyBsZXQgY2xvc2UgPSBHbGliYy5jbG9zZQorICAjZWxzZQorICBzdGF0aWMgbGV0IHJlYWQgPSBEYXJ3aW4ucmVhZAorICBzdGF0aWMgbGV0IHdyaXRlID0gRGFyd2luLndyaXRlCisgIHN0YXRpYyBsZXQgY2xvc2UgPSBEYXJ3aW4uY2xvc2UKKyAgI2VuZGlmCit9CisKK2V4dGVuc2lvbiBpbl9hZGRyIHsKKyAgcHVibGljIGluaXQ/KGhvc3RlbnQ6IGhvc3RlbnQ/KSB7CisgICAgZ3VhcmQgbGV0IGhvc3QgPSBob3N0ZW50LCBob3N0LmhfYWRkcl9saXN0ICE9IG5pbCwgaG9zdC5oX2FkZHJfbGlzdC5wb2ludGVlICE9IG5pbCBlbHNlIHsKKyAgICAgIHJldHVybiBuaWwKKyAgICB9CisgICAgc2VsZi5pbml0KCkKKyAgICBtZW1jcHkoJnNlbGYsIGhvc3QuaF9hZGRyX2xpc3QucG9pbnRlZSEsIEludChob3N0LmhfbGVuZ3RoKSkKKyAgICAKKyAgfQorfQorCisKKyNpZiBvcyhMaW51eCkKKyAgLy8vIFRDRlNvY2tldFRyYW5zcG9ydCBjdXJyZW50bHkgdW5hdmFpbGFibGUKKyAgLy8vIHJlbW92ZSBjb21tZW50cyBhbmQgYnVpbGQgdG8gc2VlIHdoeS9maXgKKyAgLy8vIGN1cnJlbnRseSBDRltSZWFkfFdyaXRlXVN0cmVhbSdzIGNhbid0IGNhc3QgdG8gW0lucHV0fE91dHB1dF1TdHJlYW1zIHdoaWNoIGJyZWFrcyB0aGlnbnMKKyNlbHNlCitleHRlbnNpb24gU3RyZWFtLlByb3BlcnR5S2V5IHsKKyAgc3RhdGljIGxldCBTU0xQZWVyVHJ1c3QgPSBTdHJlYW0uUHJvcGVydHlLZXkoa0NGU3RyZWFtUHJvcGVydHlTU0xQZWVyVHJ1c3QgYXMgU3RyaW5nKQorfQorCisvLy8gVENGU29ja2V0VHJhbnNwb3J0LCB1c2VzIENGU29ja2V0cyBhbmQgKE5TKVN0cmVhbSdzCitwdWJsaWMgY2xhc3MgVENGU29ja2V0VHJhbnNwb3J0OiBUU3RyZWFtVHJhbnNwb3J0IHsKKyAgICBwdWJsaWMgaW5pdD8oaG9zdG5hbWU6IFN0cmluZywgcG9ydDogSW50LCBzZWN1cmU6IEJvb2wgPSBmYWxzZSkgeworICAgIAorICAgIHZhciBpbnB1dFN0cmVhbTogSW5wdXRTdHJlYW0KKyAgICB2YXIgb3V0cHV0U3RyZWFtOiBPdXRwdXRTdHJlYW0KKyAgICAKKyAgICB2YXIgcmVhZFN0cmVhbTogIFVubWFuYWdlZDxDRlJlYWRTdHJlYW0+PworICAgIHZhciB3cml0ZVN0cmVhbTogIFVubWFuYWdlZDxDRldyaXRlU3RyZWFtPj8KKyAgICBDRlN0cmVhbUNyZWF0ZVBhaXJXaXRoU29ja2V0VG9Ib3N0KGtDRkFsbG9jYXRvckRlZmF1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3N0bmFtZSBhcyBDRlN0cmluZyEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSW50MzIocG9ydCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVhZFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3cml0ZVN0cmVhbSkKKyAgICAKKyAgICBpZiBsZXQgcmVhZFN0cmVhbSA9IHJlYWRTdHJlYW0/LnRha2VSZXRhaW5lZFZhbHVlKCksCisgICAgICBsZXQgd3JpdGVTdHJlYW0gPSB3cml0ZVN0cmVhbT8udGFrZVJldGFpbmVkVmFsdWUoKSB7CisgICAgICAgIENGUmVhZFN0cmVhbVNldFByb3BlcnR5KHJlYWRTdHJlYW0sIC5zaG91bGRDbG9zZU5hdGl2ZVNvY2tldCwga0NGQm9vbGVhblRydWUpCisgICAgICAgIENGV3JpdGVTdHJlYW1TZXRQcm9wZXJ0eSh3cml0ZVN0cmVhbSwgLnNob3VsZENsb3NlTmF0aXZlU29ja2V0LCBrQ0ZCb29sZWFuVHJ1ZSkKKyAgICAgIAorICAgICAgICBpZiBzZWN1cmUgeworICAgICAgICAgICAgQ0ZSZWFkU3RyZWFtU2V0UHJvcGVydHkocmVhZFN0cmVhbSwgLnNvY2tldFNlY3VyaXR5TGV2ZWwsIFN0cmVhbVNvY2tldFNlY3VyaXR5TGV2ZWwubmVnb3RpYXRlZFNTTC5yYXdWYWx1ZSBhcyBDRlN0cmluZykKKyAgICAgICAgICAgIENGV3JpdGVTdHJlYW1TZXRQcm9wZXJ0eSh3cml0ZVN0cmVhbSwgLnNvY2tldFNlY3VyaXR5TGV2ZWwsIFN0cmVhbVNvY2tldFNlY3VyaXR5TGV2ZWwubmVnb3RpYXRlZFNTTC5yYXdWYWx1ZSBhcyBDRlN0cmluZykKKyAgICAgICAgfQorCisgICAgICBpbnB1dFN0cmVhbSA9IHJlYWRTdHJlYW0gYXMgSW5wdXRTdHJlYW0KKyAgICAgIGlucHV0U3RyZWFtLnNjaGVkdWxlKGluOiAuY3VycmVudCwgZm9yTW9kZTogLmRlZmF1bHRSdW5Mb29wTW9kZSkKKyAgICAgIGlucHV0U3RyZWFtLm9wZW4oKQorICAgICAgCisgICAgICBvdXRwdXRTdHJlYW0gPSB3cml0ZVN0cmVhbSBhcyBPdXRwdXRTdHJlYW0KKyAgICAgIG91dHB1dFN0cmVhbS5zY2hlZHVsZShpbjogLmN1cnJlbnQsIGZvck1vZGU6IC5kZWZhdWx0UnVuTG9vcE1vZGUpCisgICAgICBvdXRwdXRTdHJlYW0ub3BlbigpCisgICAgICAKKyAgICB9IGVsc2UgeworICAgICAgCisgICAgICBpZiByZWFkU3RyZWFtICE9IG5pbCB7CisgICAgICAgIHJlYWRTdHJlYW0/LnJlbGVhc2UoKQorICAgICAgfQorICAgICAgaWYgd3JpdGVTdHJlYW0gIT0gbmlsIHsKKyAgICAgICAgd3JpdGVTdHJlYW0/LnJlbGVhc2UoKQorICAgICAgfQorICAgICAgc3VwZXIuaW5pdChpbnB1dFN0cmVhbTogbmlsLCBvdXRwdXRTdHJlYW06IG5pbCkKKyAgICAgIHJldHVybiBuaWwKKyAgICB9CisgICAgCisgICAgc3VwZXIuaW5pdChpbnB1dFN0cmVhbTogaW5wdXRTdHJlYW0sIG91dHB1dFN0cmVhbTogb3V0cHV0U3RyZWFtKQorICAgIAorICAgIHNlbGYuaW5wdXQ/LmRlbGVnYXRlID0gc2VsZgorICAgIHNlbGYub3V0cHV0Py5kZWxlZ2F0ZSA9IHNlbGYKKyAgfQorfQorCitleHRlbnNpb24gVENGU29ja2V0VHJhbnNwb3J0OiBTdHJlYW1EZWxlZ2F0ZSB7IH0KKyNlbmRpZgorCisKKy8vLyBUU29ja2V0VHJhbnNwb3J0LCBwb3NpeCBzb2NrZXRzLiAgU3VwcG9ydHMgSVB2NCBvbmx5IGZvciBub3cKK3B1YmxpYyBjbGFzcyBUU29ja2V0VHJhbnNwb3J0IDogVFRyYW5zcG9ydCB7CisgIHB1YmxpYyB2YXIgc29ja2V0RGVzY3JpcHRvcjogSW50MzIKKyAgCisgIAorICAKKyAgLy8vIEluaXRpYWxpemUgZnJvbSBhbiBhbHJlYWR5IHNldCB1cCBzb2NrZXREZXNjcmlwdG9yLgorICAvLy8gRXhwZWN0cyBzb2NrZXQgdGhhdHMgYWxyZWFkeSBib3VuZC9jb25uZWN0ZWQgKGkuZS4gZnJvbSBsaXN0ZW5pbmcpCisgIC8vLworICAvLy8gLSBwYXJhbWV0ZXIgc29ja2V0RGVzY3JpcHRvcjogcG9zaXggc29ja2V0IGRlc2NyaXB0b3IgKEludDMyKQorICBwdWJsaWMgaW5pdChzb2NrZXREZXNjcmlwdG9yOiBJbnQzMikgeworICAgIHNlbGYuc29ja2V0RGVzY3JpcHRvciA9IHNvY2tldERlc2NyaXB0b3IKKyAgfQorICAKKyAgCisgIHB1YmxpYyBjb252ZW5pZW5jZSBpbml0KGhvc3RuYW1lOiBTdHJpbmcsIHBvcnQ6IEludCkgdGhyb3dzIHsKKyAgICBndWFyZCBsZXQgaHAgPSBnZXRob3N0YnluYW1lKGhvc3RuYW1lLmNTdHJpbmcodXNpbmc6IC51dGY4KSEpPy5wb2ludGVlLAorICAgICAgbGV0IGhvc3RBZGRyID0gaW5fYWRkcihob3N0ZW50OiBocCkgZWxzZSB7CisgICAgICAgIHRocm93IFRUcmFuc3BvcnRFcnJvcihlcnJvcjogLnVua25vd24sIG1lc3NhZ2U6ICJJbnZhbGlkIGFkZHJlc3M6IFwoaG9zdG5hbWUpIikKKyAgICB9CisgICAgCisgICAgCisgICAgCisgICAgI2lmIG9zKExpbnV4KQorICAgICAgbGV0IHNvY2sgPSBzb2NrZXQoQUZfSU5FVCwgSW50MzIoU09DS19TVFJFQU0ucmF3VmFsdWUpLCAwKQorICAgICAgdmFyIGFkZHIgPSBzb2NrYWRkcl9pbihzaW5fZmFtaWx5OiBzYV9mYW1pbHlfdChBRl9JTkVUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luX3BvcnQ6IGluX3BvcnRfdChodG9ucyhVSW50MTYocG9ydCkpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luX2FkZHI6IGhvc3RBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5femVybzogKDAsIDAsIDAsIDAsIDAsIDAsIDAsIDApKQorICAgICNlbHNlCisgICAgICBsZXQgc29jayA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCkKKyAgICAgIAorICAgICAgdmFyIGFkZHIgPSBzb2NrYWRkcl9pbihzaW5fbGVuOiBVSW50OChNZW1vcnlMYXlvdXQ8c29ja2FkZHJfaW4+LnNpemUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5fZmFtaWx5OiBzYV9mYW1pbHlfdChBRl9JTkVUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luX3BvcnQ6IGluX3BvcnRfdChodG9ucyhVSW50MTYocG9ydCkpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luX2FkZHI6IGluX2FkZHIoc19hZGRyOiBpbl9hZGRyX3QoMCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5femVybzogKDAsIDAsIDAsIDAsIDAsIDAsIDAsIDApKQorICAgICAgCisgICAgI2VuZGlmCisgICAgCisgICAgbGV0IGFkZHJQdHIgPSB3aXRoVW5zYWZlUG9pbnRlcih0bzogJmFkZHIpeyBVbnNhZmVQb2ludGVyPHNvY2thZGRyPihPcGFxdWVQb2ludGVyKCQwKSkgfQorICAgIAorICAgIGxldCBjb25uZWN0ZWQgPSBjb25uZWN0KHNvY2ssIGFkZHJQdHIsIFVJbnQzMihNZW1vcnlMYXlvdXQ8c29ja2FkZHJfaW4+LnNpemUpKQorICAgIGlmIGNvbm5lY3RlZCAhPSAwIHsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFcnJvcihlcnJvcjogLm5vdE9wZW4sIG1lc3NhZ2U6ICJFcnJvciBiaW5kaW5nIHRvIGhvc3Q6IFwoaG9zdG5hbWUpIFwocG9ydCkiKQorICAgIH0KKyAgICAKKyAgICBzZWxmLmluaXQoc29ja2V0RGVzY3JpcHRvcjogc29jaykKKyAgfQorICAKKyAgZGVpbml0IHsKKyAgICBjbG9zZSgpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRBbGwoc2l6ZTogSW50KSB0aHJvd3MgLT4gRGF0YSB7CisgICAgdmFyIG91dCA9IERhdGEoKQorICAgIHdoaWxlIG91dC5jb3VudCA8IHNpemUgeworICAgICAgb3V0LmFwcGVuZCh0cnkgc2VsZi5yZWFkKHNpemU6IHNpemUpKQorICAgIH0KKyAgICByZXR1cm4gb3V0CisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWQoc2l6ZTogSW50KSB0aHJvd3MgLT4gRGF0YSB7CisgICAgdmFyIGJ1ZmYgPSBBcnJheTxVSW50OD4uaW5pdChyZXBlYXRpbmc6IDAsIGNvdW50OiBzaXplKQorICAgIGxldCByZWFkQnl0ZXMgPSBTeXMucmVhZChzb2NrZXREZXNjcmlwdG9yLCAmYnVmZiwgc2l6ZSkKKyAgICAKKyAgICByZXR1cm4gRGF0YShieXRlczogYnVmZlswLi48cmVhZEJ5dGVzXSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGUoZGF0YTogRGF0YSkgeworICAgIHZhciBieXRlc1RvV3JpdGUgPSBkYXRhLmNvdW50CisgICAgdmFyIHdyaXRlQnVmZmVyID0gZGF0YQorICAgIHdoaWxlIGJ5dGVzVG9Xcml0ZSA+IDAgeworICAgICAgbGV0IHdyaXR0ZW4gPSB3cml0ZUJ1ZmZlci53aXRoVW5zYWZlQnl0ZXMgeworICAgICAgICBTeXMud3JpdGUoc29ja2V0RGVzY3JpcHRvciwgJDAsIHdyaXRlQnVmZmVyLmNvdW50KQorICAgICAgfQorICAgICAgd3JpdGVCdWZmZXIgPSB3cml0ZUJ1ZmZlci5zdWJkYXRhKGluOiB3cml0dGVuIC4uPCB3cml0ZUJ1ZmZlci5jb3VudCkKKyAgICAgIGJ5dGVzVG9Xcml0ZSAtPSB3cml0dGVuCisgICAgfQorICB9CisgIAorICBwdWJsaWMgZnVuYyBmbHVzaCgpIHRocm93cyB7CisgICAgLy8gbm90aGluZyB0byBkbworICB9CisgIAorICBwdWJsaWMgZnVuYyBjbG9zZSgpIHsKKyAgICBzaHV0ZG93bihzb2NrZXREZXNjcmlwdG9yLCBJbnQzMihTSFVUX1JEV1IpKQorICAgIF8gPSBTeXMuY2xvc2Uoc29ja2V0RGVzY3JpcHRvcikKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1NvdXJjZXMvVFN0cmVhbVRyYW5zcG9ydC5zd2lmdCBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RTdHJlYW1UcmFuc3BvcnQuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZiYzFiOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RTdHJlYW1UcmFuc3BvcnQuc3dpZnQKQEAgLTAsMCArMSwxNDMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworaW1wb3J0IEZvdW5kYXRpb24KK2ltcG9ydCBDb3JlRm91bmRhdGlvbgorCisjaWYgb3MoTGludXgpCisgIC8vLyBDdXJyZW50bHkgdW5hdmFpbGFibGUgaW4gTGludXgKKyAgLy8vIFJlbW92ZSBjb21tZW50cyBhbmQgYnVpbGQgdG8gZml4CisgIC8vLyBDdXJyZW50bHkga0NvbnN0YW50cyBmb3IgQ0ZTb2NrZXRzIGRvbid0IGV4aXN0IGluIGxpbnV4IGFuZCBub3QgYWxsIGhhdmUgYmVlbiBtb3ZlZAorICAvLy8gdG8gcHJvcGVydHkgc3RydWN0cyB5ZXQKKyNlbHNlCisgIC8vIE11c3QgaW5oZXJpdCBOU09iamVjdCBmb3IgTlNTdHJlYW1EZWxlZ2F0ZSBjb25mb3JtYW5jZQorICBwdWJsaWMgY2xhc3MgVFN0cmVhbVRyYW5zcG9ydCA6IE5TT2JqZWN0LCBUVHJhbnNwb3J0IHsKKyAgICBwdWJsaWMgdmFyIGlucHV0OiBJbnB1dFN0cmVhbT8gPSBuaWwKKyAgICBwdWJsaWMgdmFyIG91dHB1dDogT3V0cHV0U3RyZWFtPyA9IG5pbAorICAgIAorICAgIHB1YmxpYyBpbml0KGlucHV0U3RyZWFtOiBJbnB1dFN0cmVhbT8sIG91dHB1dFN0cmVhbTogT3V0cHV0U3RyZWFtPykgeworICAgICAgaW5wdXQgICA9IGlucHV0U3RyZWFtCisgICAgICBvdXRwdXQgID0gb3V0cHV0U3RyZWFtCisgICAgfQorICAgIAorICAgIHB1YmxpYyBjb252ZW5pZW5jZSBpbml0KGlucHV0U3RyZWFtOiBJbnB1dFN0cmVhbT8pIHsKKyAgICAgIHNlbGYuaW5pdChpbnB1dFN0cmVhbTogaW5wdXRTdHJlYW0sIG91dHB1dFN0cmVhbTogbmlsKQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgY29udmVuaWVuY2UgaW5pdChvdXRwdXRTdHJlYW06IE91dHB1dFN0cmVhbT8pIHsKKyAgICAgIHNlbGYuaW5pdChpbnB1dFN0cmVhbTogbmlsLCBvdXRwdXRTdHJlYW06IG91dHB1dFN0cmVhbSkKKyAgICB9CisgICAgCisgICAgZGVpbml0IHsKKyAgICAgIGNsb3NlKCkKKyAgICB9CisgICAgCisgICAgcHVibGljIGZ1bmMgcmVhZEFsbChzaXplOiBJbnQpIHRocm93cyAtPiBEYXRhIHsKKyAgICAgIGd1YXJkIGxldCBpbnB1dCA9IGlucHV0IGVsc2UgeworICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXJyb3IoZXJyb3I6IC51bmtub3duKQorICAgICAgfQorICAgICAgCisgICAgICB2YXIgcmVhZCA9IERhdGEoKQorICAgICAgd2hpbGUgcmVhZC5jb3VudCA8IHNpemUgeworICAgICAgICB2YXIgYnVmZmVyID0gQXJyYXk8VUludDg+KHJlcGVhdGluZzogMCwgY291bnQ6IHNpemUgLSByZWFkLmNvdW50KQorICAgICAgICAKKyAgICAgICAgbGV0IGJ5dGVzUmVhZCA9IGJ1ZmZlci53aXRoVW5zYWZlTXV0YWJsZUJ1ZmZlclBvaW50ZXIgeyBidWZmZXJQdHIgaW4KKyAgICAgICAgICByZXR1cm4gaW5wdXQucmVhZChidWZmZXJQdHIuYmFzZUFkZHJlc3MhLCBtYXhMZW5ndGg6IHNpemUgLSByZWFkLmNvdW50KQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiBieXRlc1JlYWQgPD0gMCB7CisgICAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEVycm9yKGVycm9yOiAubm90T3BlbikKKyAgICAgICAgfQorICAgICAgICByZWFkLmFwcGVuZChEYXRhKGJ5dGVzOiBidWZmZXIpKQorICAgICAgfQorICAgICAgcmV0dXJuIHJlYWQKKyAgICB9CisgICAgCisgICAgcHVibGljIGZ1bmMgcmVhZChzaXplOiBJbnQpIHRocm93cyAtPiBEYXRhIHsKKyAgICAgIGd1YXJkIGxldCBpbnB1dCA9IGlucHV0IGVsc2UgeworICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXJyb3IoZXJyb3I6IC51bmtub3duKQorICAgICAgfQorICAgICAgCisgICAgICB2YXIgcmVhZCA9IERhdGEoKQorICAgICAgd2hpbGUgcmVhZC5jb3VudCA8IHNpemUgeworICAgICAgICB2YXIgYnVmZmVyID0gQXJyYXk8VUludDg+KHJlcGVhdGluZzogMCwgY291bnQ6IHNpemUgLSByZWFkLmNvdW50KQorICAgICAgICBsZXQgYnl0ZXNSZWFkID0gYnVmZmVyLndpdGhVbnNhZmVNdXRhYmxlQnVmZmVyUG9pbnRlciB7CisgICAgICAgICAgaW5wdXQucmVhZCgkMC5iYXNlQWRkcmVzcyEsIG1heExlbmd0aDogc2l6ZSAtIHJlYWQuY291bnQpCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIGJ5dGVzUmVhZCA8PSAwIHsKKyAgICAgICAgICBicmVhaworICAgICAgICB9CisgICAgICAgIAorICAgICAgICByZWFkLmFwcGVuZChEYXRhKGJ5dGVzOiBidWZmZXIpKQorICAgICAgfQorICAgICAgcmV0dXJuIHJlYWQKKyAgICB9CisgICAgCisgICAgcHVibGljIGZ1bmMgd3JpdGUoZGF0YTogRGF0YSkgdGhyb3dzIHsKKyAgICAgIGd1YXJkIGxldCBvdXRwdXQgPSBvdXRwdXQgZWxzZSB7CisgICAgICAgIHRocm93IFRUcmFuc3BvcnRFcnJvcihlcnJvcjogLnVua25vd24pCisgICAgICB9CisgICAgICAKKyAgICAgIHZhciBieXRlc1dyaXR0ZW4gPSAwCisgICAgICB3aGlsZSBieXRlc1dyaXR0ZW4gPCBkYXRhLmNvdW50IHsKKyAgICAgICAgYnl0ZXNXcml0dGVuID0gZGF0YS53aXRoVW5zYWZlQnl0ZXMgeworICAgICAgICAgIHJldHVybiBvdXRwdXQud3JpdGUoJDAsIG1heExlbmd0aDogZGF0YS5jb3VudCkKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgYnl0ZXNXcml0dGVuID09IC0xIHsKKyAgICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXJyb3IoZXJyb3I6IC5ub3RPcGVuKQorICAgICAgICB9IGVsc2UgaWYgYnl0ZXNXcml0dGVuID09IDAgeworICAgICAgICAgIHRocm93IFRUcmFuc3BvcnRFcnJvcihlcnJvcjogLmVuZE9mRmlsZSkKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICAKKyAgICAKKyAgICBwdWJsaWMgZnVuYyBmbHVzaCgpIHRocm93cyB7CisgICAgICByZXR1cm4KKyAgICB9CisgICAgCisgICAgcHVibGljIGZ1bmMgY2xvc2UoKSB7CisgICAgICAKKyAgICAgIGlmIGlucHV0ICE9IG5pbCB7CisgICAgICAgIC8vIENsb3NlIGFuZCByZXNldCBpbnB1dHN0cmVhbQorICAgICAgICBpZiBsZXQgY2Y6IENGUmVhZFN0cmVhbSA9IGlucHV0IHsKKyAgICAgICAgICBDRlJlYWRTdHJlYW1TZXRQcm9wZXJ0eShjZiwgLnNob3VsZENsb3NlTmF0aXZlU29ja2V0LCBrQ0ZCb29sZWFuVHJ1ZSkKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaW5wdXQ/LmRlbGVnYXRlID0gbmlsCisgICAgICAgIGlucHV0Py5jbG9zZSgpCisgICAgICAgIGlucHV0Py5yZW1vdmUoZnJvbTogLmN1cnJlbnQsIGZvck1vZGU6IC5kZWZhdWx0UnVuTG9vcE1vZGUpCisgICAgICAgIGlucHV0ID0gbmlsCisgICAgICB9CisgICAgICAKKyAgICAgIGlmIG91dHB1dCAhPSBuaWwgeworICAgICAgICAvLyBDbG9zZSBhbmQgcmVzZXQgb3V0cHV0IHN0cmVhbQorICAgICAgICBpZiBsZXQgY2Y6IENGV3JpdGVTdHJlYW0gPSBvdXRwdXQgeworICAgICAgICAgIENGV3JpdGVTdHJlYW1TZXRQcm9wZXJ0eShjZiwgLnNob3VsZENsb3NlTmF0aXZlU29ja2V0LCBrQ0ZCb29sZWFuVHJ1ZSkKKyAgICAgICAgfQorICAgICAgICBvdXRwdXQ/LmRlbGVnYXRlID0gbmlsCisgICAgICAgIG91dHB1dD8uY2xvc2UoKQorICAgICAgICBvdXRwdXQ/LnJlbW92ZShmcm9tOiAuY3VycmVudCwgZm9yTW9kZTogLmRlZmF1bHRSdW5Mb29wTW9kZSkKKyAgICAgICAgb3V0cHV0ID0gbmlsCisgICAgICB9CisgICAgfQorICB9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL1RTdHJ1Y3Quc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9UU3RydWN0LnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxNzJhMzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9UU3RydWN0LnN3aWZ0CkBAIC0wLDAgKzEsMTAwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworLy8vIFByb3RvY29sIGZvciBHZW5lcmF0ZWQgU3RydWN0cyB0byBjb25mb3JtIHRvCisvLy8gRGljdGlvbmFyeSBtYXBzIGZpZWxkIG5hbWVzIHRvIGludGVybmFsIElEcyBhbmQgdXNlcyBSZWZsZWN0aW9uCisvLy8gdG8gaXRlcmF0ZSB0aHJvdWdoIGFsbCBmaWVsZHMuICAKKy8vLyBgd3JpdGVGaWVsZFZhbHVlKF86bmFtZTp0eXBlOmlkOilgIGNhbGxzIGBUU2VyaWFsaXphYmxlLndyaXRlKHRvOilgIGludGVybmFsbHkKKy8vLyBnaXZpbmcgYSBuaWNlIHJlY3Vyc2l2ZSBiZWhhdmlvciBmb3IgbmVzdGVkIFRTdHJ1Y3RzLCBUTGlzdHMsIFRNYXBzLCBhbmQgVFNldHMKK3B1YmxpYyBwcm90b2NvbCBUU3RydWN0IDogVFNlcmlhbGl6YWJsZSB7CisgIHN0YXRpYyB2YXIgZmllbGRJZHM6IFtTdHJpbmc6IEludDMyXSB7IGdldCB9CisgIHN0YXRpYyB2YXIgc3RydWN0TmFtZTogU3RyaW5nIHsgZ2V0IH0KK30KKworcHVibGljIGV4dGVuc2lvbiBUU3RydWN0IHsKKyAgcHVibGljIHN0YXRpYyB2YXIgZmllbGRJZHM6IFtTdHJpbmc6IChpZDogSW50MzIsIHR5cGU6IFRUeXBlKV0geyByZXR1cm4gWzpdIH0KKyAgcHVibGljIHN0YXRpYyB2YXIgdGhyaWZ0VHlwZTogVFR5cGUgeyByZXR1cm4gLnN0cnVjdCB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZSh0byBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgeworICAgIC8vIFdyaXRlIHN0cnVjdCBuYW1lIGZpcnN0CisgICAgdHJ5IHByb3RvLndyaXRlU3RydWN0QmVnaW4obmFtZTogU2VsZi5zdHJ1Y3ROYW1lKQorICAgIAorICAgIHRyeSBzZWxmLmZvckVhY2ggeyBuYW1lLCB2YWx1ZSwgaWQgaW4KKyAgICAgIC8vIFdyaXRlIHRvIHByb3RvY29sCisgICAgICB0cnkgcHJvdG8ud3JpdGVGaWVsZFZhbHVlKHZhbHVlLCBuYW1lOiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiB2YWx1ZS50aHJpZnRUeXBlLCBpZDogaWQpCisgICAgfQorICAgIHRyeSBwcm90by53cml0ZUZpZWxkU3RvcCgpCisgICAgdHJ5IHByb3RvLndyaXRlU3RydWN0RW5kKCkKKyAgfQorICAKKyAgcHVibGljIHZhciBoYXNoVmFsdWU6IEludCB7CisgICAgbGV0IHByaW1lID0gMzEKKyAgICB2YXIgcmVzdWx0ID0gMQorICAgIHNlbGYuZm9yRWFjaCB7IF8sIHZhbHVlLCBfIGluCisgICAgICByZXN1bHQgPSBwcmltZSAmKiByZXN1bHQgJisgKHZhbHVlLmhhc2hWYWx1ZSkKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdAorICB9CisgIAorICAvLy8gUHJvdmlkZXMgYSBibG9jayBmb3IgaGFuZGxpbmcgZWFjaCAoYXZhaWxhYmxlKSB0aHJpZnQgcHJvcGVydHkgdXNpbmcgcmVmbGVjdGlvbgorICAvLy8gQ2F2ZWF0OiBTa2lwcyBvdmVyIG9wdGlvbmFsIHZhbHVlcworICAKKyAgCisgIC8vLyBQcm92aWRlcyBhIGJsb2NrIGZvciBoYW5kbGluZyBlYWNoIChhdmFpbGFibGUpIHRocmlmdCBwcm9wZXJ0eSB1c2luZyByZWZsZWN0aW9uCisgIC8vLworICAvLy8gLSBwYXJhbWV0ZXIgYmxvY2s6IGJsb2NrIGZvciBoYW5kbGluZyBwcm9wZXJ0eQorICAvLy8KKyAgLy8vIC0gdGhyb3dzOiByZXRocm93cyBhbnkgRXJyb3IgdGhyb3duIGluIGJsb2NrCisgIHByaXZhdGUgZnVuYyBmb3JFYWNoKF8gYmxvY2s6IChfIG5hbWU6IFN0cmluZywgXyB2YWx1ZTogVFNlcmlhbGl6YWJsZSwgXyBpZDogSW50MzIpIHRocm93cyAtPiBWb2lkKSByZXRocm93cyB7CisgICAgLy8gTWlycm9yIHRoZSBvYmplY3QsIGdldHRpbmcgKG5hbWU6IFN0cmluZz8sIHZhbHVlOiBBbnkpIGZvciBldmVyeSBwcm9wZXJ0eQorICAgIGxldCBtaXJyb3IgPSBNaXJyb3IocmVmbGVjdGluZzogc2VsZikKKyAgICAKKyAgICAvLyBJdGVyYXRlIHRocm91Z2ggYWxsIGNoaWxkcmVuLCBpZ25vcmUgZW1wdHkgcHJvcGVydHkgbmFtZXMKKyAgICBmb3IgKHByb3BOYW1lLCBwcm9wVmFsdWUpIGluIG1pcnJvci5jaGlsZHJlbiB7CisgICAgICBndWFyZCBsZXQgcHJvcE5hbWUgPSBwcm9wTmFtZSBlbHNlIHsgY29udGludWUgfQorCisgICAgICBpZiBsZXQgdHZhbCA9IHVud3JhcChhbnk6IHByb3BWYWx1ZSkgYXM/IFRTZXJpYWxpemFibGUsIGxldCBpZCA9IFNlbGYuZmllbGRJZHNbcHJvcE5hbWVdIHsKKyAgICAgICAgdHJ5IGJsb2NrKHByb3BOYW1lLCB0dmFsLCBpZCkKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgCisgIAorICAvLy8gQW55IGNhbiBteXN0ZXJpb3VzbHkgYmUgYW4gT3B0aW9uYWw8QW55PiBhdCB0aGUgc2FtZSB0aW1lLAorICAvLy8gdGhpcyBjaGVja3MgYW5kIGFsd2F5cyByZXR1cm5zIE9wdGlvbmFsPEFueT4gd2l0aG91dCBkb3VibGUgd3JhcHBpbmcKKyAgLy8vIHdlIHRoZW4gdHJ5IHRvIGJpbmQgdmFsdWUgYXMgVFNlcmlhbGl6YWJsZSB0byBpZ25vcmUgYW55IGV4dGVuc2lvbiBwcm9wZXJ0aWVzCisgIC8vLyBhbmQgdGhlIGxpa2UgYW5kIHZlcmlmeSB0aGUgcHJvcGVydHkgZXhpc3RzIGFuZCBncmFiIHRoZSBUaHJpZnQKKyAgLy8vIHByb3BlcnR5IElEIGF0IHRoZSBzYW1lIHRpbWUKKyAgLy8vCisgIC8vLyAtIHBhcmFtZXRlciBhbnk6IEFueSBpbnN0YW5jZSB0byBhdHRlbXB0IHRvIHVud3JhcAorICAvLy8KKyAgLy8vIC0gcmV0dXJuczogVW53cmFwcGVkIEFueSBhcyBPcHRpb25hbDxBbnk+CisgIHByaXZhdGUgZnVuYyB1bndyYXAoYW55OiBBbnkpIC0+IEFueT8geworICAgIGxldCBtaSA9IE1pcnJvcihyZWZsZWN0aW5nOiBhbnkpCisgICAgCisgICAgaWYgbWkuZGlzcGxheVN0eWxlICE9IC5vcHRpb25hbCB7IHJldHVybiBhbnkgfQorICAgIGlmIG1pLmNoaWxkcmVuLmNvdW50ID09IDAgeyByZXR1cm4gbmlsIH0KKyAgICAKKyAgICBsZXQgKF8sIHNvbWUpID0gbWkuY2hpbGRyZW4uZmlyc3QhCisgICAgcmV0dXJuIHNvbWUKKyAgfQorfQorCmRpZmYgLS1naXQgYS9saWIvc3dpZnQvU291cmNlcy9UVHJhbnNwb3J0LnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvVFRyYW5zcG9ydC5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODJiYmUxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1NvdXJjZXMvVFRyYW5zcG9ydC5zd2lmdApAQCAtMCwwICsxLDY0IEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyogdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitpbXBvcnQgRm91bmRhdGlvbgorCitwdWJsaWMgcHJvdG9jb2wgVFRyYW5zcG9ydCB7CisgIAorICAvLyBSZXF1aXJlZAorICBmdW5jIHJlYWQoc2l6ZTogSW50KSB0aHJvd3MgLT4gRGF0YQorICBmdW5jIHdyaXRlKGRhdGE6IERhdGEpIHRocm93cworICBmdW5jIGZsdXNoKCkgdGhyb3dzCisKKyAgLy8gT3B0aW9uYWwgKGRlZmF1bHQgcHJvdmlkZWQpCisgIGZ1bmMgcmVhZEFsbChzaXplOiBJbnQpIHRocm93cyAtPiBEYXRhCisgIGZ1bmMgaXNPcGVuKCkgdGhyb3dzIC0+IEJvb2wKKyAgZnVuYyBvcGVuKCkgdGhyb3dzCisgIGZ1bmMgY2xvc2UoKSB0aHJvd3MKK30KKworcHVibGljIGV4dGVuc2lvbiBUVHJhbnNwb3J0IHsKKyAgZnVuYyBpc09wZW4oKSB0aHJvd3MgLT4gQm9vbCB7IHJldHVybiB0cnVlIH0KKyAgZnVuYyBvcGVuKCkgdGhyb3dzIHsgfQorICBmdW5jIGNsb3NlKCkgdGhyb3dzIHsgfQorICAKKyAgZnVuYyByZWFkQWxsKHNpemU6IEludCkgdGhyb3dzIC0+IERhdGEgeworICAgIHZhciBidWZmID0gRGF0YSgpCisgICAgdmFyIGhhdmUgPSAwCisgICAgd2hpbGUgaGF2ZSA8IHNpemUgeworICAgICAgbGV0IGNodW5rID0gdHJ5IHNlbGYucmVhZChzaXplOiBzaXplIC0gaGF2ZSkKKyAgICAgIGhhdmUgKz0gY2h1bmsuY291bnQKKyAgICAgIGJ1ZmYuYXBwZW5kKGNodW5rKQorICAgICAgaWYgY2h1bmsuY291bnQgPT0gMCB7CisgICAgICAgIHRocm93IFRUcmFuc3BvcnRFcnJvcihlcnJvcjogLmVuZE9mRmlsZSkKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGJ1ZmYKKyAgfQorfQorCitwdWJsaWMgcHJvdG9jb2wgVEFzeW5jVHJhbnNwb3J0IDogVFRyYW5zcG9ydCB7CisgIC8vIEZhY3RvcnkKKyAgZnVuYyBmbHVzaChfIGNvbXBsZXRpb246IEBlc2NhcGluZyAoVEFzeW5jVHJhbnNwb3J0LCBFcnJvcj8pIC0+KCkpCit9CisKK3B1YmxpYyBwcm90b2NvbCBUQXN5bmNUcmFuc3BvcnRGYWN0b3J5IHsKKyAgYXNzb2NpYXRlZHR5cGUgVHJhbnNwb3J0IDogVEFzeW5jVHJhbnNwb3J0CisgIGZ1bmMgbmV3VHJhbnNwb3J0KCkgLT4gVHJhbnNwb3J0Cit9CmRpZmYgLS1naXQgYS9saWIvc3dpZnQvU291cmNlcy9UVHJhbnNwb3J0RXJyb3Iuc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9UVHJhbnNwb3J0RXJyb3Iuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZkMDA1OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RUcmFuc3BvcnRFcnJvci5zd2lmdApAQCAtMCwwICsxLDg2IEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyogdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitwdWJsaWMgc3RydWN0IFRUcmFuc3BvcnRFcnJvcjogVEVycm9yIHsKKyAgcHVibGljIGVudW0gRXJyb3JDb2RlOiBURXJyb3JDb2RlIHsKKyAgICBjYXNlIHVua25vd24KKyAgICBjYXNlIG5vdE9wZW4KKyAgICBjYXNlIGFscmVhZHlPcGVuCisgICAgY2FzZSB0aW1lZE91dAorICAgIGNhc2UgZW5kT2ZGaWxlCisgICAgY2FzZSBuZWdhdGl2ZVNpemUKKyAgICBjYXNlIHNpemVMaW1pdChsaW1pdDogSW50LCBnb3Q6IEludCkKKyAgICAKKyAgICBwdWJsaWMgdmFyIHRocmlmdEVycm9yQ29kZTogSW50IHsKKyAgICAgIHN3aXRjaCBzZWxmIHsKKyAgICAgIGNhc2UgLnVua25vd246ICAgICAgcmV0dXJuIDAKKyAgICAgIGNhc2UgLm5vdE9wZW46ICAgICAgcmV0dXJuIDEKKyAgICAgIGNhc2UgLmFscmVhZHlPcGVuOiAgcmV0dXJuIDIKKyAgICAgIGNhc2UgLnRpbWVkT3V0OiAgICAgcmV0dXJuIDMKKyAgICAgIGNhc2UgLmVuZE9mRmlsZTogICAgcmV0dXJuIDQKKyAgICAgIGNhc2UgLm5lZ2F0aXZlU2l6ZTogcmV0dXJuIDUKKyAgICAgIGNhc2UgLnNpemVMaW1pdDogICAgcmV0dXJuIDYKKyAgICAgIH0KKyAgICB9CisgICAgcHVibGljIHZhciBkZXNjcmlwdGlvbjogU3RyaW5nIHsKKyAgICAgIHN3aXRjaCBzZWxmIHsKKyAgICAgIGNhc2UgLnVua25vd246ICAgICAgcmV0dXJuICJVbmtub3duIFRUcmFuc3BvcnRFcnJvciIKKyAgICAgIGNhc2UgLm5vdE9wZW46ICAgICAgcmV0dXJuICJOb3QgT3BlbiIKKyAgICAgIGNhc2UgLmFscmVhZHlPcGVuOiAgcmV0dXJuICJBbHJlYWR5IE9wZW4iCisgICAgICBjYXNlIC50aW1lZE91dDogICAgIHJldHVybiAiVGltZWQgT3V0IgorICAgICAgY2FzZSAuZW5kT2ZGaWxlOiAgICByZXR1cm4gIkVuZCBPZiBGaWxlIgorICAgICAgY2FzZSAubmVnYXRpdmVTaXplOiByZXR1cm4gIk5lZ2F0aXZlIFNpemUiCisgICAgICBjYXNlIC5zaXplTGltaXQobGV0IGxpbWl0LCBsZXQgZ290KToKKyAgICAgICAgcmV0dXJuICJNZXNzYWdlIGV4Y2VlZHMgc2l6ZSBsaW1pdCBvZiBcKGxpbWl0KSAocmVjZWl2ZWQ6IFwoZ290KSIKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcHVibGljIHZhciBlcnJvcjogRXJyb3JDb2RlID0gLnVua25vd24KKyAgcHVibGljIHZhciBtZXNzYWdlOiBTdHJpbmc/ID0gbmlsCisgIHB1YmxpYyBzdGF0aWMgdmFyIGRlZmF1bHRDYXNlOiBFcnJvckNvZGUgeyByZXR1cm4gLnVua25vd24gfQorICAKKyAgcHVibGljIGluaXQoKSB7IH0KKworfQorCisvLy8gVEhUVFBUcmFuc3BvcnRFcnJvcgorLy8vCisvLy8gRXJyb3IncyB0aHJvd24gb24gSFRUUCBUcmFuc3BvcnQKK3B1YmxpYyBzdHJ1Y3QgVEhUVFBUcmFuc3BvcnRFcnJvcjogVEVycm9yIHsKKyAgcHVibGljIGVudW0gRXJyb3JDb2RlOiBURXJyb3JDb2RlIHsKKyAgICBjYXNlIGludmFsaWRSZXNwb25zZQorICAgIGNhc2UgaW52YWxpZFN0YXR1cyhzdGF0dXNDb2RlOiBJbnQpCisgICAgY2FzZSBhdXRoZW50aWNhdGlvbgorICAgIAorICAgIHB1YmxpYyB2YXIgZGVzY3JpcHRpb246IFN0cmluZyB7CisgICAgICBzd2l0Y2ggc2VsZiB7CisgICAgICBjYXNlIC5pbnZhbGlkUmVzcG9uc2U6ICAgICAgICAgICAgICAgIHJldHVybiAiSW52YWxpZCBIVFRQIFJlc3BvbnNlIgorICAgICAgY2FzZSAuaW52YWxpZFN0YXR1cyhsZXQgc3RhdHVzQ29kZSk6ICByZXR1cm4gIkludmFsaWQgSFRUUCBTdGF0dXMgQ29kZSAoXChzdGF0dXNDb2RlKSkiCisgICAgICBjYXNlIC5hdXRoZW50aWNhdGlvbjogICAgICAgICAgICAgICAgIHJldHVybiAiQXV0aGVudGljYXRpb24gRXJyb3IiCisgICAgICB9CisgICAgfQorICAgIHB1YmxpYyB2YXIgdGhyaWZ0RXJyb3JDb2RlOiBJbnQgeyByZXR1cm4gMCB9CisgIH0KKyAgcHVibGljIHZhciBlcnJvcjogRXJyb3JDb2RlID0gLmludmFsaWRSZXNwb25zZQorICBwdWJsaWMgdmFyIG1lc3NhZ2U6IFN0cmluZz8gPSBuaWwKKyAgcHVibGljIHN0YXRpYyB2YXIgZGVmYXVsdENhc2U6IEVycm9yQ29kZSB7IHJldHVybiAuaW52YWxpZFJlc3BvbnNlIH0KKyAgCisgIHB1YmxpYyBpbml0KCkgeyB9Cit9CisKZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL1RXcmFwcGVkUHJvdG9jb2wuc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9UV3JhcHBlZFByb3RvY29sLnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlODU3N2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9UV3JhcHBlZFByb3RvY29sLnN3aWZ0CkBAIC0wLDAgKzEsMjA4IEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyogdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitpbXBvcnQgRm91bmRhdGlvbiAvLyBGb3IgKE5TKURhdGEKKworCisvLy8gR2VuZXJpYyBwcm90b2NvbCwgaW1wbGVtZW50ZXMgVFByb3RvY29sIGFuZCB3cmFwcyBhIGNvbmNyZXRlIHByb3RvY29sLgorLy8vIFVzZWZ1bCBmb3IgZ2VuZXJpY2FsbHkgc3ViY2xhc3NpbmcgcHJvdG9jb2xzIHRvIG92ZXJyaWRlIHNwZWNpZmljIG1ldGhvZHMgCisvLy8gKGkuZS4gVE11bHRpcGxleGVkUHJvdG9jb2wpCitvcGVuIGNsYXNzIFRXcmFwcGVkUHJvdG9jb2w8UHJvdG9jb2w6IFRQcm90b2NvbD4gOiBUUHJvdG9jb2wgeworICB2YXIgY29uY3JldGVQcm90b2NvbDogUHJvdG9jb2wKKyAgCisgIHB1YmxpYyB2YXIgdHJhbnNwb3J0OiBUVHJhbnNwb3J0IHsKKyAgICBnZXQgeworICAgICAgcmV0dXJuIGNvbmNyZXRlUHJvdG9jb2wudHJhbnNwb3J0CisgICAgfQorICAgIHNldCB7CisgICAgICBjb25jcmV0ZVByb3RvY29sLnRyYW5zcG9ydCA9IG5ld1ZhbHVlCisgICAgfQorICB9CisKKyAgcHVibGljIHJlcXVpcmVkIGluaXQob24gdHJhbnNwb3J0OiBUVHJhbnNwb3J0KSB7CisgICAgc2VsZi5jb25jcmV0ZVByb3RvY29sID0gUHJvdG9jb2wob246IHRyYW5zcG9ydCkKKyAgfQorICAKKyAgLy8gUmVhZCBtZXRob2RzCisgIAorICBwdWJsaWMgZnVuYyByZWFkTWVzc2FnZUJlZ2luKCkgdGhyb3dzIC0+IChTdHJpbmcsIFRNZXNzYWdlVHlwZSwgSW50MzIpIHsKKyAgICByZXR1cm4gdHJ5IGNvbmNyZXRlUHJvdG9jb2wucmVhZE1lc3NhZ2VCZWdpbigpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRNZXNzYWdlRW5kKCkgdGhyb3dzIHsKKyAgICB0cnkgY29uY3JldGVQcm90b2NvbC5yZWFkTWVzc2FnZUVuZCgpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRTdHJ1Y3RCZWdpbigpIHRocm93cyAtPiBTdHJpbmcgeworICAgIHJldHVybiB0cnkgY29uY3JldGVQcm90b2NvbC5yZWFkU3RydWN0QmVnaW4oKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkU3RydWN0RW5kKCkgdGhyb3dzIHsKKyAgICB0cnkgY29uY3JldGVQcm90b2NvbC5yZWFkU3RydWN0RW5kKCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZEZpZWxkQmVnaW4oKSB0aHJvd3MgLT4gKFN0cmluZywgVFR5cGUsIEludDMyKSB7CisgICAgcmV0dXJuIHRyeSBjb25jcmV0ZVByb3RvY29sLnJlYWRGaWVsZEJlZ2luKCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZEZpZWxkRW5kKCkgdGhyb3dzIHsKKyAgICB0cnkgY29uY3JldGVQcm90b2NvbC5yZWFkRmllbGRFbmQoKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkTWFwQmVnaW4oKSB0aHJvd3MgLT4gKFRUeXBlLCBUVHlwZSwgSW50MzIpIHsKKyAgICByZXR1cm4gdHJ5IGNvbmNyZXRlUHJvdG9jb2wucmVhZE1hcEJlZ2luKCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZE1hcEVuZCgpIHRocm93cyB7CisgICAgdHJ5IGNvbmNyZXRlUHJvdG9jb2wucmVhZE1hcEVuZCgpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRTZXRCZWdpbigpIHRocm93cyAtPiAoVFR5cGUsIEludDMyKSB7CisgICAgcmV0dXJuIHRyeSBjb25jcmV0ZVByb3RvY29sLnJlYWRTZXRCZWdpbigpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRTZXRFbmQoKSB0aHJvd3MgeworICAgIHRyeSBjb25jcmV0ZVByb3RvY29sLnJlYWRTZXRFbmQoKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkTGlzdEJlZ2luKCkgdGhyb3dzIC0+IChUVHlwZSwgSW50MzIpIHsKKyAgICByZXR1cm4gdHJ5IGNvbmNyZXRlUHJvdG9jb2wucmVhZExpc3RCZWdpbigpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRMaXN0RW5kKCkgdGhyb3dzIHsKKyAgICB0cnkgY29uY3JldGVQcm90b2NvbC5yZWFkTGlzdEVuZCgpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gU3RyaW5nIHsKKyAgICByZXR1cm4gdHJ5IGNvbmNyZXRlUHJvdG9jb2wucmVhZCgpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gQm9vbCB7CisgICAgcmV0dXJuIHRyeSBjb25jcmV0ZVByb3RvY29sLnJlYWQoKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkKCkgdGhyb3dzIC0+IFVJbnQ4IHsKKyAgICByZXR1cm4gdHJ5IGNvbmNyZXRlUHJvdG9jb2wucmVhZCgpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gSW50MTYgeworICAgIHJldHVybiB0cnkgY29uY3JldGVQcm90b2NvbC5yZWFkKCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZCgpIHRocm93cyAtPiBJbnQzMiB7CisgICAgcmV0dXJuIHRyeSBjb25jcmV0ZVByb3RvY29sLnJlYWQoKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkKCkgdGhyb3dzIC0+IEludDY0IHsKKyAgICByZXR1cm4gdHJ5IGNvbmNyZXRlUHJvdG9jb2wucmVhZCgpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gRG91YmxlIHsKKyAgICByZXR1cm4gdHJ5IGNvbmNyZXRlUHJvdG9jb2wucmVhZCgpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gRGF0YSB7CisgICAgcmV0dXJuIHRyeSBjb25jcmV0ZVByb3RvY29sLnJlYWQoKQorICB9CisgIAorICAvLyBXcml0ZSBtZXRob2RzCisgIAorICBwdWJsaWMgZnVuYyB3cml0ZU1lc3NhZ2VCZWdpbihuYW1lOiBTdHJpbmcsIHR5cGUgbWVzc2FnZVR5cGU6IFRNZXNzYWdlVHlwZSwgc2VxdWVuY2VJRDogSW50MzIpIHRocm93cyB7CisgICAgcmV0dXJuIHRyeSBjb25jcmV0ZVByb3RvY29sLndyaXRlTWVzc2FnZUJlZ2luKG5hbWU6IG5hbWUsIHR5cGU6IG1lc3NhZ2VUeXBlLCBzZXF1ZW5jZUlEOiBzZXF1ZW5jZUlEKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZU1lc3NhZ2VFbmQoKSB0aHJvd3MgeworICAgIHRyeSBjb25jcmV0ZVByb3RvY29sLndyaXRlTWVzc2FnZUVuZCgpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlU3RydWN0QmVnaW4obmFtZTogU3RyaW5nKSB0aHJvd3MgeworICAgIHRyeSBjb25jcmV0ZVByb3RvY29sLndyaXRlU3RydWN0QmVnaW4obmFtZTogbmFtZSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVTdHJ1Y3RFbmQoKSB0aHJvd3MgeworICAgIHRyeSBjb25jcmV0ZVByb3RvY29sLndyaXRlU3RydWN0RW5kKCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVGaWVsZEJlZ2luKG5hbWU6IFN0cmluZywgdHlwZSBmaWVsZFR5cGU6IFRUeXBlLCBmaWVsZElEOiBJbnQzMikgdGhyb3dzIHsKKyAgICB0cnkgY29uY3JldGVQcm90b2NvbC53cml0ZUZpZWxkQmVnaW4obmFtZTogbmFtZSwgdHlwZTogZmllbGRUeXBlLCBmaWVsZElEOiBmaWVsZElEKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZUZpZWxkU3RvcCgpIHRocm93cyB7CisgICAgdHJ5IGNvbmNyZXRlUHJvdG9jb2wud3JpdGVGaWVsZFN0b3AoKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZUZpZWxkRW5kKCkgdGhyb3dzIHsKKyAgICB0cnkgY29uY3JldGVQcm90b2NvbC53cml0ZUZpZWxkRW5kKCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVNYXBCZWdpbihrZXlUeXBlOiBUVHlwZSwgdmFsdWVUeXBlOiBUVHlwZSwgc2l6ZTogSW50MzIpIHRocm93cyB7CisgICAgdHJ5IGNvbmNyZXRlUHJvdG9jb2wud3JpdGVNYXBCZWdpbihrZXlUeXBlOiBrZXlUeXBlLCB2YWx1ZVR5cGU6IHZhbHVlVHlwZSwgc2l6ZTogc2l6ZSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVNYXBFbmQoKSB0aHJvd3MgeworICAgIHRyeSBjb25jcmV0ZVByb3RvY29sLndyaXRlTWFwRW5kKCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVTZXRCZWdpbihlbGVtZW50VHlwZTogVFR5cGUsIHNpemU6IEludDMyKSB0aHJvd3MgeworICAgIHRyeSBjb25jcmV0ZVByb3RvY29sLndyaXRlU2V0QmVnaW4oZWxlbWVudFR5cGU6IGVsZW1lbnRUeXBlLCBzaXplOiBzaXplKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZVNldEVuZCgpIHRocm93cyB7CisgICAgdHJ5IGNvbmNyZXRlUHJvdG9jb2wud3JpdGVTZXRFbmQoKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZUxpc3RCZWdpbihlbGVtZW50VHlwZTogVFR5cGUsIHNpemU6IEludDMyKSB0aHJvd3MgeworICAgIHRyeSBjb25jcmV0ZVByb3RvY29sLndyaXRlTGlzdEJlZ2luKGVsZW1lbnRUeXBlOiBlbGVtZW50VHlwZSwgc2l6ZTogc2l6ZSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVMaXN0RW5kKCkgdGhyb3dzIHsKKyAgICB0cnkgY29uY3JldGVQcm90b2NvbC53cml0ZUxpc3RFbmQoKQorICB9CisgIHB1YmxpYyBmdW5jIHdyaXRlKF8gdmFsdWU6IFN0cmluZykgdGhyb3dzIHsKKyAgICB0cnkgY29uY3JldGVQcm90b2NvbC53cml0ZSh2YWx1ZSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGUoXyB2YWx1ZTogQm9vbCkgdGhyb3dzIHsKKyAgICB0cnkgY29uY3JldGVQcm90b2NvbC53cml0ZSh2YWx1ZSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGUoXyB2YWx1ZTogVUludDgpIHRocm93cyB7CisgICAgdHJ5IGNvbmNyZXRlUHJvdG9jb2wud3JpdGUodmFsdWUpCisgIH0KKworICBwdWJsaWMgZnVuYyB3cml0ZShfIHZhbHVlOiBJbnQxNikgdGhyb3dzIHsKKyAgICB0cnkgY29uY3JldGVQcm90b2NvbC53cml0ZSh2YWx1ZSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGUoXyB2YWx1ZTogSW50MzIpIHRocm93cyB7CisgICAgdHJ5IGNvbmNyZXRlUHJvdG9jb2wud3JpdGUodmFsdWUpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlKF8gdmFsdWU6IEludDY0KSB0aHJvd3MgeworICAgIHRyeSBjb25jcmV0ZVByb3RvY29sLndyaXRlKHZhbHVlKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZShfIHZhbHVlOiBEb3VibGUpIHRocm93cyB7CisgICAgdHJ5IGNvbmNyZXRlUHJvdG9jb2wud3JpdGUodmFsdWUpCisgIH0KKworICBwdWJsaWMgZnVuYyB3cml0ZShfIGRhdGE6IERhdGEpIHRocm93cyB7CisgICAgdHJ5IGNvbmNyZXRlUHJvdG9jb2wud3JpdGUoZGF0YSkKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1NvdXJjZXMvVGhyaWZ0LnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvVGhyaWZ0LnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViZDE3NTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9UaHJpZnQuc3dpZnQKQEAgLTAsMCArMSwzIEBACitjbGFzcyBUaHJpZnQgeworCWxldCB2ZXJzaW9uID0gIjEuMS4wIgorfQpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1Rlc3RzL0xpbnV4TWFpbi5zd2lmdCBiL2xpYi9zd2lmdC9UZXN0cy9MaW51eE1haW4uc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg4ZmVjOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9UZXN0cy9MaW51eE1haW4uc3dpZnQKQEAgLTAsMCArMSw4IEBACitpbXBvcnQgWENUZXN0CitAdGVzdGFibGUgaW1wb3J0IFRocmlmdFRlc3RzCisKK1hDVE1haW4oWworICAgICB0ZXN0Q2FzZShUaHJpZnRUZXN0cy5hbGxUZXN0cyksCisgICAgIHRlc3RDYXNlKFRCaW5hcnlQcm90b2NvbFRlc3RzLmFsbFRlc3RzKSwKKyAgICAgdGVzdENhc2UoVENvbXBhY3RQcm90b2NvbFRlc3RzLmFsbFRlc3RzKSwKK10pCmRpZmYgLS1naXQgYS9saWIvc3dpZnQvVGVzdHMvVGhyaWZ0VGVzdHMvVEJpbmFyeVByb3RvY29sVGVzdHMuc3dpZnQgYi9saWIvc3dpZnQvVGVzdHMvVGhyaWZ0VGVzdHMvVEJpbmFyeVByb3RvY29sVGVzdHMuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZhNTU3MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9UZXN0cy9UaHJpZnRUZXN0cy9UQmluYXJ5UHJvdG9jb2xUZXN0cy5zd2lmdApAQCAtMCwwICsxLDE2OCBAQAorLy8KKy8vICBUQmluYXJ5UHJvdG9jb2xUZXN0cy5zd2lmdAorLy8gIFRocmlmdAorLy8KKy8vICBDcmVhdGVkIGJ5IENocmlzdG9waGVyIFNpbXBzb24gb24gOC8xOC8xNi4KKy8vCisvLworCitpbXBvcnQgWENUZXN0CitpbXBvcnQgRm91bmRhdGlvbgorQHRlc3RhYmxlIGltcG9ydCBUaHJpZnQKKworCisvLy8gVGVzdGluZyBCaW5hcnkgcHJvdG9jb2wgcmVhZC93cml0ZSBhZ2FpbnN0IGl0c2VsZgorLy8vIFVzZXMgc2VwYXJhdGUgcmVhZC93cml0ZSB0cmFuc3BvcnQvcHJvdG9jb2xzIAorY2xhc3MgVEJpbmFyeVByb3RvY29sVGVzdHM6IFhDVGVzdENhc2UgeworICB2YXIgdHJhbnNwb3J0OiBUTWVtb3J5QnVmZmVyVHJhbnNwb3J0ID0gVE1lbW9yeUJ1ZmZlclRyYW5zcG9ydChmbHVzaEhhbmRsZXI6IHsKKyAgICAkMC5yZXNldChyZWFkQnVmZmVyOiAkMSkKKyAgfSkKKyAgCisgIHZhciBwcm90bzogVEJpbmFyeVByb3RvY29sIQorICAKKyAgb3ZlcnJpZGUgZnVuYyBzZXRVcCgpIHsKKyAgICBzdXBlci5zZXRVcCgpCisgICAgcHJvdG8gPSBUQmluYXJ5UHJvdG9jb2wob246IHRyYW5zcG9ydCkKKyAgICB0cmFuc3BvcnQucmVzZXQoKQorICB9CisgIAorICBvdmVycmlkZSBmdW5jIHRlYXJEb3duKCkgeworICAgIHN1cGVyLnRlYXJEb3duKCkKKyAgICB0cmFuc3BvcnQucmVzZXQoKQorICB9CisgIAorICBmdW5jIHRlc3RJbnQ4V3JpdGVSZWFkKCkgeworICAgIGxldCB3cml0ZVZhbDogVUludDggPSAyNTAKKyAgICB0cnk/IHByb3RvLndyaXRlKHdyaXRlVmFsKQorICAgIHRyeT8gdHJhbnNwb3J0LmZsdXNoKCkKKworICAgIGxldCByZWFkVmFsOiBVSW50OCA9ICh0cnk/IHByb3RvLnJlYWQoKSkgPz8gMAorICAgIFhDVEFzc2VydEVxdWFsKHdyaXRlVmFsLCByZWFkVmFsLCAiRXJyb3Igd2l0aCBVSW50OCwgd3JvdGUgXCh3cml0ZVZhbCkgYnV0IHJlYWQgXChyZWFkVmFsKSIpCisgIH0KKyAgCisgIGZ1bmMgdGVzdEludDE2V3JpdGVSZWFkKCkgeworCisgICAgbGV0IHdyaXRlVmFsOiBJbnQxNiA9IDEyMzEyCisgICAgdHJ5PyBwcm90by53cml0ZSh3cml0ZVZhbCkKKyAgICB0cnk/IHRyYW5zcG9ydC5mbHVzaCgpCisgICAgbGV0IHJlYWRWYWw6IEludDE2ID0gKHRyeT8gcHJvdG8ucmVhZCgpKSA/PyAwCisgICAgWENUQXNzZXJ0RXF1YWwod3JpdGVWYWwsIHJlYWRWYWwsICJFcnJvciB3aXRoIEludDE2LCB3cm90ZSBcKHdyaXRlVmFsKSBidXQgcmVhZCBcKHJlYWRWYWwpIikKKyAgfQorICAKKyAgZnVuYyB0ZXN0SW50MzJXcml0ZVJlYWQoKSB7CisgICAgbGV0IHdyaXRlVmFsOiBJbnQzMiA9IDIwMjkyMzQKKyAgICB0cnk/IHByb3RvLndyaXRlKHdyaXRlVmFsKQorICAgIHRyeT8gdHJhbnNwb3J0LmZsdXNoKCkKKworICAgIGxldCByZWFkVmFsOiBJbnQzMiA9ICh0cnk/IHByb3RvLnJlYWQoKSkgPz8gMAorICAgIFhDVEFzc2VydEVxdWFsKHdyaXRlVmFsLCByZWFkVmFsLCAiRXJyb3Igd2l0aCBJbnQzMiwgd3JvdGUgXCh3cml0ZVZhbCkgYnV0IHJlYWQgXChyZWFkVmFsKSIpCisgIH0KKyAgCisgIGZ1bmMgdGVzdEludDY0V3JpdGVSZWFkKCkgeworICAgIGxldCB3cml0ZVZhbDogSW50NjQgPSAyMzQyMzQ5ODEzNzQxMzQKKyAgICB0cnk/IHByb3RvLndyaXRlKHdyaXRlVmFsKQorICAgIHRyeT8gdHJhbnNwb3J0LmZsdXNoKCkKKworICAgIGxldCByZWFkVmFsOiBJbnQ2NCA9ICh0cnk/IHByb3RvLnJlYWQoKSkgPz8gMAorICAgIFhDVEFzc2VydEVxdWFsKHdyaXRlVmFsLCByZWFkVmFsLCAiRXJyb3Igd2l0aCBJbnQ2NCwgd3JvdGUgXCh3cml0ZVZhbCkgYnV0IHJlYWQgXChyZWFkVmFsKSIpCisgIH0KKyAgCisgIGZ1bmMgdGVzdERvdWJsZVdyaXRlUmVhZCgpIHsKKyAgICBsZXQgd3JpdGVWYWw6IERvdWJsZSA9IDMuMTQxNTkyNgorICAgIHRyeT8gcHJvdG8ud3JpdGUod3JpdGVWYWwpCisgICAgdHJ5PyB0cmFuc3BvcnQuZmx1c2goKQorCisgICAgbGV0IHJlYWRWYWw6IERvdWJsZSA9ICh0cnk/IHByb3RvLnJlYWQoKSkgPz8gMC4wCisgICAgWENUQXNzZXJ0RXF1YWwod3JpdGVWYWwsIHJlYWRWYWwsICJFcnJvciB3aXRoIERvdWJsZSwgd3JvdGUgXCh3cml0ZVZhbCkgYnV0IHJlYWQgXChyZWFkVmFsKSIpCisgIH0KKyAgCisgIGZ1bmMgdGVzdEJvb2xXcml0ZVJlYWQoKSB7CisgICAgbGV0IHdyaXRlVmFsOiBCb29sID0gdHJ1ZQorICAgIHRyeT8gcHJvdG8ud3JpdGUod3JpdGVWYWwpCisgICAgdHJ5PyB0cmFuc3BvcnQuZmx1c2goKQorCisgICAgbGV0IHJlYWRWYWw6IEJvb2wgPSAodHJ5PyBwcm90by5yZWFkKCkpID8/IGZhbHNlCisgICAgWENUQXNzZXJ0RXF1YWwod3JpdGVWYWwsIHJlYWRWYWwsICJFcnJvciB3aXRoIEJvb2wsIHdyb3RlIFwod3JpdGVWYWwpIGJ1dCByZWFkIFwocmVhZFZhbCkiKQorICB9CisgIAorICBmdW5jIHRlc3RTdHJpbmdXcml0ZVJlYWQoKSB7CisgICAgbGV0IHdyaXRlVmFsOiBTdHJpbmcgPSAiSGVsbG8gV29ybGQiCisgICAgdHJ5PyBwcm90by53cml0ZSh3cml0ZVZhbCkKKyAgICB0cnk/IHRyYW5zcG9ydC5mbHVzaCgpCisKKyAgICBsZXQgcmVhZFZhbDogU3RyaW5nIQorICAgIGRvIHsKKyAgICAgIHJlYWRWYWwgPSB0cnkgcHJvdG8ucmVhZCgpCisgICAgfSBjYXRjaCBsZXQgZXJyb3IgeworICAgICAgWENUQXNzZXJ0RmFsc2UodHJ1ZSwgIkVycm9yIHJlYWRpbmcgXChlcnJvcikiKQorICAgICAgcmV0dXJuCisgICAgfQorICAgIAorICAgIFhDVEFzc2VydEVxdWFsKHdyaXRlVmFsLCByZWFkVmFsLCAiRXJyb3Igd2l0aCBTdHJpbmcsIHdyb3RlIFwod3JpdGVWYWwpIGJ1dCByZWFkIFwocmVhZFZhbCkiKQorICB9CisgIAorICBmdW5jIHRlc3REYXRhV3JpdGVSZWFkKCkgeworICAgIGxldCB3cml0ZVZhbDogRGF0YSA9ICJEYXRhIFdvcmxkIi5kYXRhKHVzaW5nOiAudXRmOCkhCisgICAgdHJ5PyBwcm90by53cml0ZSh3cml0ZVZhbCkKKyAgICB0cnk/IHRyYW5zcG9ydC5mbHVzaCgpCisKKyAgICBsZXQgcmVhZFZhbDogRGF0YSA9ICh0cnk/IHByb3RvLnJlYWQoKSkgPz8gIkdvb2RieWUgV29ybGQiLmRhdGEodXNpbmc6IC51dGY4KSEKKyAgICBYQ1RBc3NlcnRFcXVhbCh3cml0ZVZhbCwgcmVhZFZhbCwgIkVycm9yIHdpdGggRGF0YSwgd3JvdGUgXCh3cml0ZVZhbCkgYnV0IHJlYWQgXChyZWFkVmFsKSIpCisgIH0KKyAgCisgIGZ1bmMgdGVzdFN0cnVjdFdyaXRlUmVhZCgpIHsKKyAgICBsZXQgbXNnID0gIlRlc3QgUHJvdG9jb2wgRXJyb3IiCisgICAgbGV0IHdyaXRlVmFsID0gVEFwcGxpY2F0aW9uRXJyb3IoZXJyb3I6IC5wcm90b2NvbEVycm9yLCBtZXNzYWdlOiBtc2cpCisgICAgZG8geworICAgICAgdHJ5IHdyaXRlVmFsLndyaXRlKHRvOiBwcm90bykKKyAgICAgIHRyeT8gdHJhbnNwb3J0LmZsdXNoKCkKKworICAgIH0gY2F0Y2ggbGV0IGVycm9yIHsKKyAgICAgIFhDVEFzc2VydEZhbHNlKHRydWUsICJDYXVnaHQgRXJyb3IgYXR0ZW1wdGluZyB0byB3cml0ZSBcKGVycm9yKSIpCisgICAgfQorICAgIAorICAgIGRvIHsKKyAgICAgIGxldCByZWFkVmFsID0gdHJ5IFRBcHBsaWNhdGlvbkVycm9yLnJlYWQoZnJvbTogcHJvdG8pCisgICAgICBYQ1RBc3NlcnRFcXVhbChyZWFkVmFsLmVycm9yLnRocmlmdEVycm9yQ29kZSwgd3JpdGVWYWwuZXJyb3IudGhyaWZ0RXJyb3JDb2RlLCAiRXJyb3IgY2FzZSBtaXNtYXRjaCwgZXhwZWN0ZWQgXChyZWFkVmFsLmVycm9yKSBnb3QgXCh3cml0ZVZhbC5lcnJvcikiKQorICAgICAgWENUQXNzZXJ0RXF1YWwocmVhZFZhbC5tZXNzYWdlLCB3cml0ZVZhbC5tZXNzYWdlLCAiRXJyb3IgbWVzc2FnZSBtaXNtYXRjaCwgZXhwZWN0ZWQgXChyZWFkVmFsLm1lc3NhZ2UpIGdvdCBcKHdyaXRlVmFsLm1lc3NhZ2UpIikKKyAgICB9IGNhdGNoIGxldCBlcnJvciB7CisgICAgICBYQ1RBc3NlcnRGYWxzZSh0cnVlLCAiQ2F1Z2h0IEVycm9yIGF0dGVtcHRpbmcgdG8gcmVhZCBcKGVycm9yKSIpCisgICAgfQorICB9CisgIGZ1bmMgdGVzdFVuc2FmZUJpdGNhc3RVcGRhdGUoKSB7CisgICAgbGV0IHZhbHVlOiBEb3VibGUgPSAzLjE0MTU5CisgICAgbGV0IHZhbDogSW50NjQgPSAzMTQxNTkyNgorICAgIGxldCB1dmFsOiBVSW50NjQgPSAzMTQxNTkyNgorICAgIAorICAgIGxldCBpNjQgPSBJbnQ2NChiaXRQYXR0ZXJuOiB2YWx1ZS5iaXRQYXR0ZXJuKQorICAgIGxldCB1YmMgPSB1bnNhZmVCaXRDYXN0KHZhbHVlLCB0bzogSW50NjQuc2VsZikKKyAgICAKKyAgICBYQ1RBc3NlcnRFcXVhbChpNjQsIHViYywgIkJpdGNhc3QgRG91YmxlLT4gaTY0IFZhbHVlcyBkb24ndCBtYXRjaCIpCisgICAgCisgICAgbGV0IGRibCA9IERvdWJsZShiaXRQYXR0ZXJuOiBVSW50NjQodmFsKSkKKyAgICBsZXQgdWJkYiA9IHVuc2FmZUJpdENhc3QodmFsLCB0bzogRG91YmxlLnNlbGYpCisgICAgCisgICAgWENUQXNzZXJ0RXF1YWwoZGJsLCB1YmRiLCAiQml0Y2FzdCBpNjQgLT4gRG91YmxlIFZhbHVlcyBkb24ndCBtYXRjaCIpCisgICAgCisgICAgbGV0IGRiMiA9IERvdWJsZShiaXRQYXR0ZXJuOiB1dmFsKQorICAgIGxldCB1c2JjMiA9IHVuc2FmZUJpdENhc3QodXZhbCwgdG86IERvdWJsZS5zZWxmKQorICAgIAorICAgIFhDVEFzc2VydEVxdWFsKGRiMiwgdXNiYzIsICJCaXRjYXN0IHU2NCAtPiBEb3VibGUgVmFsdWVzIGRvbid0IG1hdGNoIikKKworICAgIAorICB9CisgIAorICBzdGF0aWMgdmFyIGFsbFRlc3RzIDogWyhTdHJpbmcsIChUQmluYXJ5UHJvdG9jb2xUZXN0cykgLT4gKCkgdGhyb3dzIC0+IFZvaWQpXSB7CisgICAgcmV0dXJuIFsKKyAgICAgICgidGVzdEludDhXcml0ZVJlYWQiLCB0ZXN0SW50OFdyaXRlUmVhZCksCisgICAgICAoInRlc3RJbnQxNldyaXRlUmVhZCIsIHRlc3RJbnQxNldyaXRlUmVhZCksCisgICAgICAoInRlc3RJbnQzMldyaXRlUmVhZCIsIHRlc3RJbnQzMldyaXRlUmVhZCksCisgICAgICAoInRlc3RJbnQ2NFdyaXRlUmVhZCIsIHRlc3RJbnQ2NFdyaXRlUmVhZCksCisgICAgICAoInRlc3REb3VibGVXcml0ZVJlYWQiLCB0ZXN0RG91YmxlV3JpdGVSZWFkKSwKKyAgICAgICgidGVzdEJvb2xXcml0ZVJlYWQiLCB0ZXN0Qm9vbFdyaXRlUmVhZCksCisgICAgICAoInRlc3RTdHJpbmdXcml0ZVJlYWQiLCB0ZXN0U3RyaW5nV3JpdGVSZWFkKSwKKyAgICAgICgidGVzdERhdGFXcml0ZVJlYWQiLCB0ZXN0RGF0YVdyaXRlUmVhZCksCisgICAgICAoInRlc3RTdHJ1Y3RXcml0ZVJlYWQiLCB0ZXN0U3RydWN0V3JpdGVSZWFkKQorICAgIF0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1Rlc3RzL1RocmlmdFRlc3RzL1RDb21wYWN0UHJvdG9jb2xUZXN0cy5zd2lmdCBiL2xpYi9zd2lmdC9UZXN0cy9UaHJpZnRUZXN0cy9UQ29tcGFjdFByb3RvY29sVGVzdHMuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgyYzI2MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9UZXN0cy9UaHJpZnRUZXN0cy9UQ29tcGFjdFByb3RvY29sVGVzdHMuc3dpZnQKQEAgLTAsMCArMSwyMTAgQEAKKy8vCisvLyAgVENvbXBhY3RQcm90b2NvbFRlc3RzLnN3aWZ0CisvLyAgVGhyaWZ0CisvLworLy8gIENyZWF0ZWQgYnkgQ2hyaXN0b3BoZXIgU2ltcHNvbiBvbiA4LzE5LzE2LgorLy8KKy8vCisKK2ltcG9ydCBYQ1Rlc3QKK2ltcG9ydCBGb3VuZGF0aW9uCitAdGVzdGFibGUgaW1wb3J0IFRocmlmdAorCisKKy8vLyBUZXN0aW5nIEJpbmFyeSBwcm90b2NvbCByZWFkL3dyaXRlIGFnYWluc3QgaXRzZWxmCisvLy8gVXNlcyBzZXBhcmF0ZSByZWFkL3dyaXRlIHRyYW5zcG9ydC9wcm90b2NvbHMKK2NsYXNzIFRDb21wYWN0UHJvdG9jb2xUZXN0czogWENUZXN0Q2FzZSB7CisgIHZhciB0cmFuc3BvcnQ6IFRNZW1vcnlCdWZmZXJUcmFuc3BvcnQgPSBUTWVtb3J5QnVmZmVyVHJhbnNwb3J0KGZsdXNoSGFuZGxlcjogeworICAgICQwLnJlc2V0KHJlYWRCdWZmZXI6ICQxKQorICB9KQorICB2YXIgcHJvdG86IFRDb21wYWN0UHJvdG9jb2whCisgIAorICBvdmVycmlkZSBmdW5jIHNldFVwKCkgeworICAgIHN1cGVyLnNldFVwKCkKKyAgICBwcm90byA9IFRDb21wYWN0UHJvdG9jb2wob246IHRyYW5zcG9ydCkKKyAgICB0cmFuc3BvcnQucmVzZXQoKQorICB9CisgIAorICBvdmVycmlkZSBmdW5jIHRlYXJEb3duKCkgeworICAgIHN1cGVyLnRlYXJEb3duKCkKKyAgICB0cmFuc3BvcnQucmVzZXQoKQorICB9CisgIAorICBmdW5jIHRlc3RJbnQ4V3JpdGVSZWFkKCkgeworICAgIGxldCB3cml0ZVZhbDogVUludDggPSAyNTAKKyAgICB0cnk/IHByb3RvLndyaXRlKHdyaXRlVmFsKQorICAgIHRyeT8gdHJhbnNwb3J0LmZsdXNoKCkKKyAgICBsZXQgcmVhZFZhbDogVUludDggPSAodHJ5PyBwcm90by5yZWFkKCkpID8/IDAKKyAgICBYQ1RBc3NlcnRFcXVhbCh3cml0ZVZhbCwgcmVhZFZhbCwgIkVycm9yIHdpdGggVUludDgsIHdyb3RlIFwod3JpdGVWYWwpIGJ1dCByZWFkIFwocmVhZFZhbCkiKQorICB9CisgIAorICBmdW5jIHRlc3RJbnQxNldyaXRlUmVhZCgpIHsKKyAgICBsZXQgd3JpdGVWYWw6IEludDE2ID0gMTIzMTIKKyAgICB0cnk/IHByb3RvLndyaXRlKHdyaXRlVmFsKQorICAgIHRyeT8gdHJhbnNwb3J0LmZsdXNoKCkKKworICAgIGxldCByZWFkVmFsOiBJbnQxNiA9ICh0cnk/IHByb3RvLnJlYWQoKSkgPz8gMAorICAgIFhDVEFzc2VydEVxdWFsKHdyaXRlVmFsLCByZWFkVmFsLCAiRXJyb3Igd2l0aCBJbnQxNiwgd3JvdGUgXCh3cml0ZVZhbCkgYnV0IHJlYWQgXChyZWFkVmFsKSIpCisgIH0KKyAgCisgIGZ1bmMgdGVzdEludDMyV3JpdGVSZWFkKCkgeworICAgIGxldCB3cml0ZVZhbDogSW50MzIgPSAyMDI5MjM0CisgICAgdHJ5PyBwcm90by53cml0ZSh3cml0ZVZhbCkKKyAgICB0cnk/IHRyYW5zcG9ydC5mbHVzaCgpCisKKyAgICBsZXQgcmVhZFZhbDogSW50MzIgPSAodHJ5PyBwcm90by5yZWFkKCkpID8/IDAKKyAgICBYQ1RBc3NlcnRFcXVhbCh3cml0ZVZhbCwgcmVhZFZhbCwgIkVycm9yIHdpdGggSW50MzIsIHdyb3RlIFwod3JpdGVWYWwpIGJ1dCByZWFkIFwocmVhZFZhbCkiKQorICB9CisgIAorICBmdW5jIHRlc3RJbnQ2NFdyaXRlUmVhZCgpIHsKKyAgICBsZXQgd3JpdGVWYWw6IEludDY0ID0gMjM0MjM0OTgxMzc0MTM0CisgICAgdHJ5PyBwcm90by53cml0ZSh3cml0ZVZhbCkKKyAgICB0cnk/IHRyYW5zcG9ydC5mbHVzaCgpCisKKyAgICBsZXQgcmVhZFZhbDogSW50NjQgPSAodHJ5PyBwcm90by5yZWFkKCkpID8/IDAKKyAgICBYQ1RBc3NlcnRFcXVhbCh3cml0ZVZhbCwgcmVhZFZhbCwgIkVycm9yIHdpdGggSW50NjQsIHdyb3RlIFwod3JpdGVWYWwpIGJ1dCByZWFkIFwocmVhZFZhbCkiKQorICB9CisgIAorICBmdW5jIHRlc3REb3VibGVXcml0ZVJlYWQoKSB7CisgICAgbGV0IHdyaXRlVmFsOiBEb3VibGUgPSAzLjE0MTU5MjYKKyAgICB0cnk/IHByb3RvLndyaXRlKHdyaXRlVmFsKQorICAgIHRyeT8gdHJhbnNwb3J0LmZsdXNoKCkKKworICAgIGxldCByZWFkVmFsOiBEb3VibGUgPSAodHJ5PyBwcm90by5yZWFkKCkpID8/IDAuMAorICAgIFhDVEFzc2VydEVxdWFsKHdyaXRlVmFsLCByZWFkVmFsLCAiRXJyb3Igd2l0aCBEb3VibGUsIHdyb3RlIFwod3JpdGVWYWwpIGJ1dCByZWFkIFwocmVhZFZhbCkiKQorICB9CisgIAorICBmdW5jIHRlc3RCb29sV3JpdGVSZWFkKCkgeworICAgIGxldCB3cml0ZVZhbDogQm9vbCA9IHRydWUKKyAgICB0cnk/IHByb3RvLndyaXRlKHdyaXRlVmFsKQorICAgIHRyeT8gdHJhbnNwb3J0LmZsdXNoKCkKKworICAgIGxldCByZWFkVmFsOiBCb29sID0gKHRyeT8gcHJvdG8ucmVhZCgpKSA/PyBmYWxzZQorICAgIFhDVEFzc2VydEVxdWFsKHdyaXRlVmFsLCByZWFkVmFsLCAiRXJyb3Igd2l0aCBCb29sLCB3cm90ZSBcKHdyaXRlVmFsKSBidXQgcmVhZCBcKHJlYWRWYWwpIikKKyAgfQorICAKKyAgZnVuYyB0ZXN0U3RyaW5nV3JpdGVSZWFkKCkgeworICAgIGxldCB3cml0ZVZhbDogU3RyaW5nID0gIkhlbGxvIFdvcmxkIgorICAgIHRyeT8gcHJvdG8ud3JpdGUod3JpdGVWYWwpCisgICAgdHJ5PyB0cmFuc3BvcnQuZmx1c2goKQorCisgICAgbGV0IHJlYWRWYWw6IFN0cmluZyEKKyAgICBkbyB7CisgICAgICByZWFkVmFsID0gdHJ5IHByb3RvLnJlYWQoKQorICAgIH0gY2F0Y2ggbGV0IGVycm9yIHsKKyAgICAgIFhDVEFzc2VydEZhbHNlKHRydWUsICJFcnJvciByZWFkaW5nIFwoZXJyb3IpIikKKyAgICAgIHJldHVybgorICAgIH0KKyAgICAKKyAgICBYQ1RBc3NlcnRFcXVhbCh3cml0ZVZhbCwgcmVhZFZhbCwgIkVycm9yIHdpdGggU3RyaW5nLCB3cm90ZSBcKHdyaXRlVmFsKSBidXQgcmVhZCBcKHJlYWRWYWwpIikKKyAgfQorICAKKyAgZnVuYyB0ZXN0RGF0YVdyaXRlUmVhZCgpIHsKKyAgICBsZXQgd3JpdGVWYWw6IERhdGEgPSAiRGF0YSBXb3JsZCIuZGF0YSh1c2luZzogLnV0ZjgpIQorICAgIHRyeT8gcHJvdG8ud3JpdGUod3JpdGVWYWwpCisgICAgdHJ5PyB0cmFuc3BvcnQuZmx1c2goKQorCisgICAgbGV0IHJlYWRWYWw6IERhdGEgPSAodHJ5PyBwcm90by5yZWFkKCkpID8/ICJHb29kYnllIFdvcmxkIi5kYXRhKHVzaW5nOiAudXRmOCkhCisgICAgWENUQXNzZXJ0RXF1YWwod3JpdGVWYWwsIHJlYWRWYWwsICJFcnJvciB3aXRoIERhdGEsIHdyb3RlIFwod3JpdGVWYWwpIGJ1dCByZWFkIFwocmVhZFZhbCkiKQorICB9CisgIAorICBmdW5jIHRlc3RTdHJ1Y3RXcml0ZVJlYWQoKSB7CisgICAgbGV0IG1zZyA9ICJUZXN0IFByb3RvY29sIEVycm9yIgorICAgIGxldCB3cml0ZVZhbCA9IFRBcHBsaWNhdGlvbkVycm9yKGVycm9yOiAucHJvdG9jb2xFcnJvciwgbWVzc2FnZTogbXNnKQorICAgIGRvIHsKKyAgICAgIHRyeSB3cml0ZVZhbC53cml0ZSh0bzogcHJvdG8pCisgICAgICB0cnkgdHJhbnNwb3J0LmZsdXNoKCkKKworICAgIH0gY2F0Y2ggbGV0IGVycm9yIHsKKyAgICAgIFhDVEFzc2VydEZhbHNlKHRydWUsICJDYXVnaHQgRXJyb3IgYXR0ZW1wdGluZyB0byB3cml0ZSBcKGVycm9yKSIpCisgICAgfQorICAgIAorICAgIGRvIHsKKyAgICAgIGxldCByZWFkVmFsID0gdHJ5IFRBcHBsaWNhdGlvbkVycm9yLnJlYWQoZnJvbTogcHJvdG8pCisgICAgICBYQ1RBc3NlcnRFcXVhbChyZWFkVmFsLmVycm9yLnRocmlmdEVycm9yQ29kZSwgd3JpdGVWYWwuZXJyb3IudGhyaWZ0RXJyb3JDb2RlLCAiRXJyb3IgY2FzZSBtaXNtYXRjaCwgZXhwZWN0ZWQgXChyZWFkVmFsLmVycm9yKSBnb3QgXCh3cml0ZVZhbC5lcnJvcikiKQorICAgICAgWENUQXNzZXJ0RXF1YWwocmVhZFZhbC5tZXNzYWdlLCB3cml0ZVZhbC5tZXNzYWdlLCAiRXJyb3IgbWVzc2FnZSBtaXNtYXRjaCwgZXhwZWN0ZWQgXChyZWFkVmFsLm1lc3NhZ2UpIGdvdCBcKHdyaXRlVmFsLm1lc3NhZ2UpIikKKyAgICB9IGNhdGNoIGxldCBlcnJvciB7CisgICAgICBYQ1RBc3NlcnRGYWxzZSh0cnVlLCAiQ2F1Z2h0IEVycm9yIGF0dGVtcHRpbmcgdG8gcmVhZCBcKGVycm9yKSIpCisgICAgfQorICB9CisgIAorICBmdW5jIHRlc3RJbnQzMlppZ1phZygpIHsKKyAgICBsZXQgemVybzogSW50MzIgPSAwCisgICAgbGV0IG9uZTogSW50MzIgPSAxCisgICAgbGV0IG5PbmU6IEludDMyID0gLTEKKyAgICBsZXQgdHdvOiBJbnQzMiA9IDIKKyAgICBsZXQgblR3bzogSW50MzIgPSAtMgorICAgIGxldCBtYXggPSBJbnQzMi5tYXgKKyAgICBsZXQgbWluID0gSW50MzIubWluCisKKyAgICBYQ1RBc3NlcnRFcXVhbChwcm90by5pMzJUb1ppZ1phZyh6ZXJvKSwgVUludDMyKDApLCAiRXJyb3IgMzJiaXQgemlnemFnIG9uIFwoemVybykiKQorICAgIFhDVEFzc2VydEVxdWFsKHByb3RvLnppZ1phZ1RvaTMyKDApLCB6ZXJvLCAiRXJyb3IgMzJiaXQgemlnemFnIG9uIFwoemVybykiKQorCisgICAgWENUQXNzZXJ0RXF1YWwocHJvdG8uaTMyVG9aaWdaYWcobk9uZSksIFVJbnQzMigxKSwgIkVycm9yIDMyYml0IHppZ3phZyBvbiBcKG5PbmUpIikKKyAgICBYQ1RBc3NlcnRFcXVhbChwcm90by56aWdaYWdUb2kzMigxKSwgbk9uZSwgIkVycm9yIDMyYml0IHppZ3phZyBvbiBcKG5PbmUpIikKKworICAgIFhDVEFzc2VydEVxdWFsKHByb3RvLmkzMlRvWmlnWmFnKG9uZSksIFVJbnQzMigyKSwgIkVycm9yIDMyYml0IHppZ3phZyBvbiBcKG9uZSkiKQorICAgIFhDVEFzc2VydEVxdWFsKHByb3RvLnppZ1phZ1RvaTMyKDIpLCBvbmUsICJFcnJvciAzMmJpdCB6aWd6YWcgb24gXChvbmUpIikKKworICAgIFhDVEFzc2VydEVxdWFsKHByb3RvLmkzMlRvWmlnWmFnKG5Ud28pLCBVSW50MzIoMyksICJFcnJvciAzMmJpdCB6aWd6YWcgb24gXChuVHdvKSIpCisgICAgWENUQXNzZXJ0RXF1YWwocHJvdG8uemlnWmFnVG9pMzIoMyksIG5Ud28sICJFcnJvciAzMmJpdCB6aWd6YWcgb24gXChuVHdvKSIpCisKKyAgICBYQ1RBc3NlcnRFcXVhbChwcm90by5pMzJUb1ppZ1phZyh0d28pLCBVSW50MzIoNCksICJFcnJvciAzMmJpdCB6aWd6YWcgb24gXCh0d28pIikKKyAgICBYQ1RBc3NlcnRFcXVhbChwcm90by56aWdaYWdUb2kzMig0KSwgdHdvLCAiRXJyb3IgMzJiaXQgemlnemFnIG9uIFwodHdvKSIpCisKKyAgICBsZXQgdU1heE1pbnVzT25lOiBVSW50MzIgPSBVSW50MzIubWF4IC0gMQorICAgIFhDVEFzc2VydEVxdWFsKHByb3RvLmkzMlRvWmlnWmFnKG1heCksIHVNYXhNaW51c09uZSwgIkVycm9yIDMyYml0IHppZ3phZyBvbiBcKG1heCkiKQorICAgIFhDVEFzc2VydEVxdWFsKHByb3RvLnppZ1phZ1RvaTMyKHVNYXhNaW51c09uZSksIG1heCwgIkVycm9yIDMyYml0IHppZ3phZyBvbiBcKG1heCkiKQorCisgICAgWENUQXNzZXJ0RXF1YWwocHJvdG8uaTMyVG9aaWdaYWcobWluKSwgVUludDMyLm1heCwgIkVycm9yIDMyYml0IHppZ3phZyBvbiBcKG1pbikiKQorICAgIFhDVEFzc2VydEVxdWFsKHByb3RvLnppZ1phZ1RvaTMyKFVJbnQzMi5tYXgpLCBtaW4sICJFcnJvciAzMmJpdCB6aWd6YWcgb24gXChtaW4pIikKKyAgfQorCisgIGZ1bmMgdGVzdEludDY0WmlnWmFnKCkgeworICAgIGxldCB6ZXJvOiBJbnQ2NCA9IDAKKyAgICBsZXQgb25lOiBJbnQ2NCA9IDEKKyAgICBsZXQgbk9uZTogSW50NjQgPSAtMQorICAgIGxldCB0d286IEludDY0ID0gMgorICAgIGxldCBuVHdvOiBJbnQ2NCA9IC0yCisgICAgbGV0IG1heCA9IEludDY0Lm1heAorICAgIGxldCBtaW4gPSBJbnQ2NC5taW4KKworICAgIFhDVEFzc2VydEVxdWFsKHByb3RvLmk2NFRvWmlnWmFnKHplcm8pLCBVSW50NjQoMCksICJFcnJvciA2NGJpdCB6aWd6YWcgb24gXCh6ZXJvKSIpCisgICAgWENUQXNzZXJ0RXF1YWwocHJvdG8uemlnWmFnVG9pNjQoMCksIHplcm8sICJFcnJvciA2NGJpdCB6aWd6YWcgb24gXCh6ZXJvKSIpCisKKyAgICBYQ1RBc3NlcnRFcXVhbChwcm90by5pNjRUb1ppZ1phZyhuT25lKSwgVUludDY0KDEpLCAiRXJyb3IgNjRiaXQgemlnemFnIG9uIFwobk9uZSkiKQorICAgIFhDVEFzc2VydEVxdWFsKHByb3RvLnppZ1phZ1RvaTY0KDEpLCBuT25lLCAiRXJyb3IgNjRiaXQgemlnemFnIG9uIFwobk9uZSkiKQorCisgICAgWENUQXNzZXJ0RXF1YWwocHJvdG8uaTY0VG9aaWdaYWcob25lKSwgVUludDY0KDIpLCAiRXJyb3IgNjRiaXQgemlnemFnIG9uIFwob25lKSIpCisgICAgWENUQXNzZXJ0RXF1YWwocHJvdG8uemlnWmFnVG9pNjQoMiksIG9uZSwgIkVycm9yIDY0Yml0IHppZ3phZyBvbiBcKG9uZSkiKQorCisgICAgWENUQXNzZXJ0RXF1YWwocHJvdG8uaTY0VG9aaWdaYWcoblR3byksIFVJbnQ2NCgzKSwgIkVycm9yIDY0Yml0IHppZ3phZyBvbiBcKG5Ud28pIikKKyAgICBYQ1RBc3NlcnRFcXVhbChwcm90by56aWdaYWdUb2k2NCgzKSwgblR3bywgIkVycm9yIDY0Yml0IHppZ3phZyBvbiBcKG5Ud28pIikKKworICAgIFhDVEFzc2VydEVxdWFsKHByb3RvLmk2NFRvWmlnWmFnKHR3byksIFVJbnQ2NCg0KSwgIkVycm9yIDY0Yml0IHppZ3phZyBvbiBcKHR3bykiKQorICAgIFhDVEFzc2VydEVxdWFsKHByb3RvLnppZ1phZ1RvaTY0KDQpLCB0d28sICJFcnJvciA2NGJpdCB6aWd6YWcgb24gXCh0d28pIikKKworICAgIGxldCB1TWF4TWludXNPbmU6IFVJbnQ2NCA9IFVJbnQ2NC5tYXggLSAxCisgICAgWENUQXNzZXJ0RXF1YWwocHJvdG8uaTY0VG9aaWdaYWcobWF4KSwgdU1heE1pbnVzT25lLCAiRXJyb3IgNjRiaXQgemlnemFnIG9uIFwobWF4KSIpCisgICAgWENUQXNzZXJ0RXF1YWwocHJvdG8uemlnWmFnVG9pNjQodU1heE1pbnVzT25lKSwgbWF4LCAiRXJyb3IgNjRiaXQgemlnemFnIG9uIFwobWF4KSIpCisKKyAgICBYQ1RBc3NlcnRFcXVhbChwcm90by5pNjRUb1ppZ1phZyhtaW4pLCBVSW50NjQubWF4LCAiRXJyb3IgNjRiaXQgemlnemFnIG9uIFwobWluKSIpCisgICAgWENUQXNzZXJ0RXF1YWwocHJvdG8uemlnWmFnVG9pNjQoVUludDY0Lm1heCksIG1pbiwgIkVycm9yIDY0Yml0IHppZ3phZyBvbiBcKG1pbikiKQorICB9CisgIAorICBzdGF0aWMgdmFyIGFsbFRlc3RzIDogWyhTdHJpbmcsIChUQ29tcGFjdFByb3RvY29sVGVzdHMpIC0+ICgpIHRocm93cyAtPiBWb2lkKV0geworICAgIHJldHVybiBbCisgICAgICAoInRlc3RJbnQ4V3JpdGVSZWFkIiwgdGVzdEludDhXcml0ZVJlYWQpLAorICAgICAgKCJ0ZXN0SW50MTZXcml0ZVJlYWQiLCB0ZXN0SW50MTZXcml0ZVJlYWQpLAorICAgICAgKCJ0ZXN0SW50MzJXcml0ZVJlYWQiLCB0ZXN0SW50MzJXcml0ZVJlYWQpLAorICAgICAgKCJ0ZXN0SW50NjRXcml0ZVJlYWQiLCB0ZXN0SW50NjRXcml0ZVJlYWQpLAorICAgICAgKCJ0ZXN0RG91YmxlV3JpdGVSZWFkIiwgdGVzdERvdWJsZVdyaXRlUmVhZCksCisgICAgICAoInRlc3RCb29sV3JpdGVSZWFkIiwgdGVzdEJvb2xXcml0ZVJlYWQpLAorICAgICAgKCJ0ZXN0U3RyaW5nV3JpdGVSZWFkIiwgdGVzdFN0cmluZ1dyaXRlUmVhZCksCisgICAgICAoInRlc3REYXRhV3JpdGVSZWFkIiwgdGVzdERhdGFXcml0ZVJlYWQpLAorICAgICAgKCJ0ZXN0U3RydWN0V3JpdGVSZWFkIiwgdGVzdFN0cnVjdFdyaXRlUmVhZCksCisgICAgICAoInRlc3RJbnQzMlppZ1phZyIsIHRlc3RJbnQzMlppZ1phZyksCisgICAgICAoInRlc3RJbnQ2NFppZ1phZyIsIHRlc3RJbnQ2NFppZ1phZykKKyAgICBdCisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9UZXN0cy9UaHJpZnRUZXN0cy9UaHJpZnRUZXN0cy5zd2lmdCBiL2xpYi9zd2lmdC9UZXN0cy9UaHJpZnRUZXN0cy9UaHJpZnRUZXN0cy5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzE2MTAwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1Rlc3RzL1RocmlmdFRlc3RzL1RocmlmdFRlc3RzLnN3aWZ0CkBAIC0wLDAgKzEsMTggQEAKK2ltcG9ydCBYQ1Rlc3QKK0B0ZXN0YWJsZSBpbXBvcnQgVGhyaWZ0CisKK2NsYXNzIFRocmlmdFRlc3RzOiBYQ1Rlc3RDYXNlIHsKKyAgZnVuYyB0ZXN0VmVyc2lvbigpIHsKKyAgICBYQ1RBc3NlcnRFcXVhbChUaHJpZnQoKS52ZXJzaW9uLCAiMS4xLjAiKQorICB9CisKKyAgZnVuYyB0ZXN0X2luX2FkZHJfZXh0ZW5zaW9uKCkgeworCisgIH0KKworICBzdGF0aWMgdmFyIGFsbFRlc3RzIDogWyhTdHJpbmcsIChUaHJpZnRUZXN0cykgLT4gKCkgdGhyb3dzIC0+IFZvaWQpXSB7CisgICAgcmV0dXJuIFsKKyAgICAgICgidGVzdFZlcnNpb24iLCB0ZXN0VmVyc2lvbiksCisgICAgXQorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvdHMvY29kaW5nX3N0YW5kYXJkcy5tZCBiL2xpYi90cy9jb2Rpbmdfc3RhbmRhcmRzLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMDM5MGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvdHMvY29kaW5nX3N0YW5kYXJkcy5tZApAQCAtMCwwICsxIEBACitQbGVhc2UgZm9sbG93IFtHZW5lcmFsIENvZGluZyBTdGFuZGFyZHNdKC9kb2MvY29kaW5nX3N0YW5kYXJkcy5tZCkKZGlmZiAtLWdpdCBhL2xpYi90cy90aHJpZnQuZC50cyBiL2xpYi90cy90aHJpZnQuZC50cwppbmRleCA0NzBhZGZlLi4wYmE0NmM5IDEwMDY0NAotLS0gYS9saWIvdHMvdGhyaWZ0LmQudHMKKysrIGIvbGliL3RzL3RocmlmdC5kLnRzCkBAIC04NCw3ICs4NCw3IEBACiAgICAqIEBwYXJhbSB7b2JqZWN0fSBvYmogLSBPYmplY3QgdG8gdGVzdC4KICAgICogQHJldHVybnMge251bWJlcn0gbnVtYmVyIG9mIG9iamVjdCdzIG93biBwcm9wZXJ0aWVzCiAgICAqLwotICBmdW5jdGlvbiBvYmplY3RMZW5ndGgob2JqOiBhbnkpOiBudW1iZXI7CisgIGZ1bmN0aW9uIG9iamVjdExlbmd0aChvYmo6IE9iamVjdCk6IG51bWJlcjsKIAogICAvKioKICAgICogVXRpbGl0eSBmdW5jdGlvbiB0byBlc3RhYmxpc2ggcHJvdG90eXBlIGluaGVyaXRhbmNlLgpAQCAtMTQ3LDYgKzE0Nyw3IEBACiAgICAqIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBpcyB0aGUgZXhjZXB0aW9uIGNsYXNzIHVzZWQgdG8gcHJvcGFnYXRlIGV4Y2VwdGlvbnMgZnJvbSBhbiBSUEMgc2VydmVyIGJhY2sgdG8gYSBjYWxsaW5nIGNsaWVudC4KICAgICovCiAgIGNsYXNzIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBleHRlbmRzIFRFeGNlcHRpb24geworICAgIG1lc3NhZ2U6IHN0cmluZzsKICAgICBjb2RlOiBudW1iZXI7CiAKICAgICAvKioKQEAgLTE2MCwxMyArMTYxLDEzIEBACiAgICAgICogUmVhZCBhIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBmcm9tIHRoZSBzdXBwbGllZCBwcm90b2NvbC4KICAgICAgKiBAcGFyYW0ge29iamVjdH0gaW5wdXQgLSBUaGUgaW5wdXQgcHJvdG9jb2wgdG8gcmVhZCBmcm9tLgogICAgICAqLwotICAgIHJlYWQoaW5wdXQ6IGFueSk6IHZvaWQ7CisgICAgcmVhZChpbnB1dDogT2JqZWN0KTogdm9pZDsKIAogICAgIC8qKgogICAgICAqIFdyaXRlIGEgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHRvIHRoZSBzdXBwbGllZCBwcm90b2NvbC4KICAgICAgKiBAcGFyYW0ge29iamVjdH0gb3V0cHV0IC0gVGhlIG91dHB1dCBwcm90b2NvbCB0byB3cml0ZSB0by4KICAgICAgKi8KLSAgICB3cml0ZShvdXRwdXQ6IGFueSk6IHZvaWQ7CisgICAgd3JpdGUob3V0cHV0OiBPYmplY3QpOiB2b2lkOwogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgYXBwbGljYXRpb24gZXhjZXB0aW9uIGNvZGUgc2V0IG9uIHRoZSBleGNlcHRpb24uCkBAIC0xOTQsMTUgKzE5NSwxNSBAQAogICAgICAqIHlvdXIgb3duLiBUaGlzIHR5cGUgY2FuIGFsc28gYmUgY29uc3RydWN0ZWQgdXNpbmcgdGhlIFRyYW5zcG9ydCBhbGlhcwogICAgICAqIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgogICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbdXJsXSAtIFRoZSBVUkwgdG8gY29ubmVjdCB0by4KLSAgICAgKiBAcGFyYW0ge2FueX0gW29wdGlvbnNdIC0gT3B0aW9ucy4KKyAgICAgKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdIC0gT3B0aW9ucy4KICAgICAgKi8KLSAgICBjb25zdHJ1Y3Rvcih1cmw/OiBzdHJpbmcsIG9wdGlvbnM/OiBhbnkpOworICAgIGNvbnN0cnVjdG9yKHVybD86IHN0cmluZywgb3B0aW9ucz86IE9iamVjdCk7CiAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBicm93c2VyIHNwZWNpZmljIFhtbEh0dHBSZXF1ZXN0IE9iamVjdC4KICAgICAgKiBAcmV0dXJucyB7b2JqZWN0fSB0aGUgYnJvd3NlciBYSFIgaW50ZXJmYWNlIG9iamVjdAogICAgICAqLwotICAgIGdldFhtbEh0dHBSZXF1ZXN0T2JqZWN0KCk6IGFueTsKKyAgICBnZXRYbWxIdHRwUmVxdWVzdE9iamVjdCgpOiBPYmplY3Q7CiAKICAgICAvKioKICAgICAgKiBTZW5kcyB0aGUgY3VycmVudCBYUkggcmVxdWVzdCBpZiB0aGUgdHJhbnNwb3J0IHdhcyBjcmVhdGVkIHdpdGggYSBVUkwgYW5kCkBAIC0yMTAsNyArMjExLDcgQEAKICAgICAgKiBvciB0aGUgYXN5bmMgcGFyYW1ldGVyIGlzIFRydWUgb3IgdGhlIFVSTCBpcyBhbiBlbXB0eSBzdHJpbmcsIHRoZSBjdXJyZW50IAogICAgICAqIHNlbmQgYnVmZmVyIGlzIHJldHVybmVkLgogICAgICAqIEBwYXJhbSB7b2JqZWN0fSBhc3luYyAtIElmIHRydWUgdGhlIGN1cnJlbnQgc2VuZCBidWZmZXIgaXMgcmV0dXJuZWQuCi0gICAgICogQHBhcmFtIHtvYmplY3R9IGNhbGxiYWNrIC0gT3B0aW9uYWwgYXN5bmMgY29tcGxldGlvbiBjYWxsYmFjay4KKyAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFjayAtIE9wdGlvbmFsIGFzeW5jIGNvbXBsZXRpb24gY2FsbGJhY2suCiAgICAgICogQHJldHVybnMge3VuZGVmaW5lZHxzdHJpbmd9IE5vdGhpbmcgb3IgdGhlIGN1cnJlbnQgc2VuZCBidWZmZXIuCiAgICAgICovCiAgICAgZmx1c2goYXN5bmM6IGFueSwgY2FsbGJhY2s/OiBGdW5jdGlvbik6IHN0cmluZzsKQEAgLTIxOSwxMSArMjIwLDExIEBACiAgICAgICogQ3JlYXRlcyBhIGpRdWVyeSBYSFIgb2JqZWN0IHRvIGJlIHVzZWQgZm9yIGEgVGhyaWZ0IHNlcnZlciBjYWxsLgogICAgICAqIEBwYXJhbSB7b2JqZWN0fSBjbGllbnQgLSBUaGUgVGhyaWZ0IFNlcnZpY2UgY2xpZW50IG9iamVjdCBnZW5lcmF0ZWQgYnkgdGhlIElETCBjb21waWxlci4KICAgICAgKiBAcGFyYW0ge29iamVjdH0gcG9zdERhdGEgLSBUaGUgbWVzc2FnZSB0byBzZW5kIHRvIHRoZSBzZXJ2ZXIuCi0gICAgICogQHBhcmFtIHtmdW5jdGlvbn0gYXJncyAtIFRoZSBmdW5jdGlvbiB0byBjYWxsIGlmIHRoZSByZXF1ZXN0IHN1Y2VlZHMuCisgICAgICogQHBhcmFtIHtmdW5jdGlvbn0gYXJncyAtIFRoZSBmdW5jdGlvbiB0byBjYWxsIGlmIHRoZSByZXF1ZXN0IHN1Y2NlZWRzLgogICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IHJlY3ZfbWV0aG9kIC0gVGhlIFRocmlmdCBTZXJ2aWNlIENsaWVudCByZWNlaXZlIG1ldGhvZCBmb3IgdGhlIGNhbGwuCiAgICAgICogQHJldHVybnMge29iamVjdH0gQSBuZXcgalF1ZXJ5IFhIUiBvYmplY3QuCiAgICAgICovCi0gICAganFSZXF1ZXN0KGNsaWVudDogYW55LCBwb3N0RGF0YTogYW55LCBhcmdzOiBGdW5jdGlvbiwgcmVjdl9tZXRob2Q6IEZ1bmN0aW9uKTogYW55OworICAgIGpxUmVxdWVzdChjbGllbnQ6IE9iamVjdCwgcG9zdERhdGE6IGFueSwgYXJnczogRnVuY3Rpb24sIHJlY3ZfbWV0aG9kOiBGdW5jdGlvbik6IE9iamVjdDsKIAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIGJ1ZmZlciB0byB1c2Ugd2hlbiByZWNlaXZpbmcgc2VydmVyIHJlc3BvbnNlcy4KQEAgLTI5MCw3ICsyOTEsNyBAQAogICBjbGFzcyBUV2ViU29ja2V0VHJhbnNwb3J0IHsKICAgICB1cmw6IHN0cmluZzsgICAgICAgICAgIC8vV2hlcmUgdG8gY29ubmVjdAogICAgIHNvY2tldDogYW55OyAgICAgICAgICAgLy9UaGUgd2ViIHNvY2tldAotICAgIGNhbGxiYWNrczogYW55W107ICAgICAgLy9QZW5kaW5nIGNhbGxiYWNrcworICAgIGNhbGxiYWNrczogRnVuY3Rpb25bXTsgLy9QZW5kaW5nIGNhbGxiYWNrcwogICAgIHNlbmRfcGVuZGluZzogYW55W107ICAgLy9CdWZmZXJzL0NhbGxiYWNrIHBhaXJzIHdhaXRpbmcgdG8gYmUgc2VudAogICAgIHNlbmRfYnVmOiBzdHJpbmc7ICAgICAgLy9PdXRib3VuZCBkYXRhLCBpbW11dGFibGUgdW50aWwgc2VudAogICAgIHJlY3ZfYnVmOiBzdHJpbmc7ICAgICAgLy9JbmJvdW5kIGRhdGEKQEAgLTMwMywxNyArMzA0LDE3IEBACiAgICAgICovCiAgICAgY29uc3RydWN0b3IodXJsOiBzdHJpbmcpOwogCi0gICAgX19yZXNldCh1cmwpOiB2b2lkOworICAgIF9fcmVzZXQodXJsOiBzdHJpbmcpOiB2b2lkOwogCiAgICAgLyoqCiAgICAgICogU2VuZHMgdGhlIGN1cnJlbnQgV1MgcmVxdWVzdCBhbmQgcmVnaXN0ZXJzIGNhbGxiYWNrLiBUaGUgYXN5bmMgCiAgICAgICogcGFyYW1ldGVyIGlzIGlnbm9yZWQgKFdTIGZsdXNoIGlzIGFsd2F5cyBhc3luYykgYW5kIHRoZSBjYWxsYmFjayAKICAgICAgKiBmdW5jdGlvbiBwYXJhbWV0ZXIgaXMgcmVxdWlyZWQuCiAgICAgICogQHBhcmFtIHtvYmplY3R9IGFzeW5jIC0gSWdub3JlZC4KLSAgICAgKiBAcGFyYW0ge29iamVjdH0gY2FsbGJhY2sgLSBUaGUgY2xpZW50IGNvbXBsZXRpb24gY2FsbGJhY2suCisgICAgICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBUaGUgY2xpZW50IGNvbXBsZXRpb24gY2FsbGJhY2suCiAgICAgICogQHJldHVybnMge3VuZGVmaW5lZHxzdHJpbmd9IE5vdGhpbmcgKHVuZGVmaW5lZCkgCiAgICAgICovCi0gICAgZmx1c2goYXN5bmM6IGFueSwgY2FsbGJhY2s6IGFueSk6IHN0cmluZzsKKyAgICBmbHVzaChhc3luYzogYW55LCBjYWxsYmFjazogRnVuY3Rpb24pOiBzdHJpbmc7CiAKICAgICBfX29uT3BlbigpOiB2b2lkOwogCkBAIC0zNzgsNyArMzc5LDcgQEAKICAgICogb2YgdGhlIEFwYWNoZSBUaHJpZnQgVEpTT05Qcm90b2NvbC4KICAgICovCiAgIGNsYXNzIFRKU09OUHJvdG9jb2wgewotICAgIHRyYW5zcG9ydDogVHJhbnNwb3J0OworICAgIHRyYW5zcG9ydDogT2JqZWN0OwogCiAgICAgLyoqCiAgICAgICogVGhyaWZ0IElETCB0eXBlIElkIHRvIHN0cmluZyBtYXBwaW5nLgpAQCAtNDIzLDEzICs0MjQsMTMgQEAKICAgICAgKiBJbml0aWFsaXplcyBhIFRocmlmdCBKU09OIHByb3RvY29sIGluc3RhbmNlLgogICAgICAqIEBwYXJhbSB7VGhyaWZ0LlRyYW5zcG9ydH0gdHJhbnNwb3J0IC0gVGhlIHRyYW5zcG9ydCB0byBzZXJpYWxpemUgdG8vZnJvbS4KICAgICAgKi8KLSAgICBjb25zdHJ1Y3Rvcih0cmFuc3BvcnQ6IFRyYW5zcG9ydCk7CisgICAgY29uc3RydWN0b3IodHJhbnNwb3J0OiBPYmplY3QpOwogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQuCiAgICAgICogQHJldHVybnMge1RocmlmdC5UcmFuc3BvcnR9IFRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydC4KICAgICAgKi8KLSAgICBnZXRUcmFuc3BvcnQoKTogVHJhbnNwb3J0OworICAgIGdldFRyYW5zcG9ydCgpOiBPYmplY3Q7CiAKICAgICAvKioKICAgICAgKiBTZXJpYWxpemVzIHRoZSBiZWdpbm5pbmcgb2YgYSBUaHJpZnQgUlBDIG1lc3NhZ2UuCkBAIC00NjEsNyArNDYyLDcgQEAKICAgICAgKiBAcGFyYW0ge1RocmlmdC5Qcm90b2NvbC5UeXBlfSBmaWVsZFR5cGUgLSBUaGUgZGF0YSB0eXBlIG9mIHRoZSBmaWVsZC4KICAgICAgKiBAcGFyYW0ge251bWJlcn0gZmllbGRJZCAtIFRoZSBmaWVsZCdzIHVuaXF1ZSBpZGVudGlmaWVyLgogICAgICAqLwotICAgIHdyaXRlRmllbGRCZWdpbihuYW1lOiBzdHJpbmcsIGZpZWxkVHlwZTogc3RyaW5nW10sIGZpZWxkSWQ6IG51bWJlcik6IHZvaWQ7CisgICAgd3JpdGVGaWVsZEJlZ2luKG5hbWU6IHN0cmluZywgZmllbGRUeXBlOiBudW1iZXIsIGZpZWxkSWQ6IG51bWJlcik6IHZvaWQ7CiAKICAgICAvKioKICAgICAgKiBTZXJpYWxpemVzIHRoZSBlbmQgb2YgYSBmaWVsZC4KQEAgLTU1NSw3ICs1NTYsNyBAQAogICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbbmFtZV0gLSBUaGUgbmFtZSBvZiB0aGUgc3RydWN0IChpZ25vcmVkKS4KICAgICAgKiBAcmV0dXJucyB7b2JqZWN0fSAtIEFuIG9iamVjdCB3aXRoIGFuIGVtcHR5IHN0cmluZyBmbmFtZSBwcm9wZXJ0eS4KICAgICAgKi8KLSAgICByZWFkU3RydWN0QmVnaW4obmFtZT86IHN0cmluZyk6IGFueTsKKyAgICByZWFkU3RydWN0QmVnaW4obmFtZT86IHN0cmluZyk6IHsgZm5hbWU6IHN0cmluZyB9OwogCiAgICAgLyoqIERlc2VyaWFsaXplcyB0aGUgZW5kIG9mIGEgc3RydWN0LiAqLwogICAgIHJlYWRTdHJ1Y3RFbmQoKTogdm9pZDsKQEAgLTY1NCw3ICs2NTUsNyBAQAogICAgIC8qKiAKICAgICAgKiBNZXRob2QgdG8gYXJiaXRyYXJpbHkgc2tpcCBvdmVyIGRhdGEgKG5vdCBpbXBsZW1lbnRlZCkuCiAgICAgICovCi0gICAgc2tpcCh0eXBlOiBhbnkpOiB2b2lkOworICAgIHNraXAodHlwZTogbnVtYmVyKTogdm9pZDsKICAgfQogCiAgIC8qKgpAQCAtNjYyLDcgKzY2Myw3IEBACiAgICAqLwogICBjbGFzcyBQcm90b2NvbCBleHRlbmRzIFRKU09OUHJvdG9jb2wgeyB9CiAKLSAgY2xhc3MgTXVsdGlwbGV4UHJvdG9jb2wgZXh0ZW5kcyBQcm90b2NvbCB7CisgIGNsYXNzIE11bHRpcGxleFByb3RvY29sIGV4dGVuZHMgVEpTT05Qcm90b2NvbCB7CiAgICAgc2VydmljZU5hbWU6IHN0cmluZzsKIAogICAgIC8qKgpAQCAtNjcyLDE3ICs2NzMsMjcgQEAKICAgICAgKiBAcGFyYW0ge2FueX0gW3N0cmljdFJlYWRdCiAgICAgICogQHBhcmFtIHthbnl9IFtzdHJpY3RXcml0ZV0KICAgICAgKi8KLSAgICBjb25zdHJ1Y3RvcihzcnZOYW1lOiBzdHJpbmcsIHRyYW5zOiBUcmFuc3BvcnQsIHN0cmljdFJlYWQ/OiBhbnksIHN0cmljdFdyaXRlPzogYW55KTsKKyAgICBjb25zdHJ1Y3RvcihzcnZOYW1lOiBzdHJpbmcsIHRyYW5zOiBPYmplY3QsIHN0cmljdFJlYWQ/OiBhbnksIHN0cmljdFdyaXRlPzogYW55KTsKKworICAgIC8qKgorICAgICAqIE92ZXJyaWRlIHdyaXRlTWVzc2FnZUJlZ2luIG1ldGhvZCBvZiBwcm90b3R5cGUKKyAgICAgKiBTZXJpYWxpemVzIHRoZSBiZWdpbm5pbmcgb2YgYSBUaHJpZnQgUlBDIG1lc3NhZ2UuCisgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgc2VydmljZSBtZXRob2QgdG8gY2FsbC4KKyAgICAgKiBAcGFyYW0ge1RocmlmdC5NZXNzYWdlVHlwZX0gbWVzc2FnZVR5cGUgLSBUaGUgdHlwZSBvZiBtZXRob2QgY2FsbC4KKyAgICAgKiBAcGFyYW0ge251bWJlcn0gc2VxaWQgLSBUaGUgc2VxdWVuY2UgbnVtYmVyIG9mIHRoaXMgY2FsbCAoYWx3YXlzIDAgaW4gQXBhY2hlIFRocmlmdCkuCisgICAgICovCisgICAgd3JpdGVNZXNzYWdlQmVnaW4obmFtZTogc3RyaW5nLCB0eXBlOiBudW1iZXIsIHNlcWlkOiBudW1iZXIpOiB2b2lkOwogICB9CiAKICAgY2xhc3MgTXVsdGlwbGV4ZXIgewogICAgIHNlcWlkOiBudW1iZXI7CiAKLSAgICAvKiogSW5zdGFudGlhdGVzIGEgbXVsdGlwbGV4ZWQgY2xpZW50IGZvciBhIHNwZWNpZmljIHNlcnZpY2UuCisgICAgLyoqCisgICAgICogSW5zdGFudGlhdGVzIGEgbXVsdGlwbGV4ZWQgY2xpZW50IGZvciBhIHNwZWNpZmljIHNlcnZpY2UuCiAgICAgICogQHBhcmFtIHtTdHJpbmd9IHNlcnZpY2VOYW1lIC0gVGhlIHRyYW5zcG9ydCB0byBzZXJpYWxpemUgdG8vZnJvbS4KICAgICAgKiBAcGFyYW0ge1RocmlmdC5TZXJ2aWNlQ2xpZW50fSBTQ2wgLSBUaGUgU2VydmljZSBDbGllbnQgQ2xhc3MuCiAgICAgICogQHBhcmFtIHtUaHJpZnQuVHJhbnNwb3J0fSB0cmFuc3BvcnQgLSBUaHJpZnQuVHJhbnNwb3J0IGluc3RhbmNlIHdoaWNoIHByb3ZpZGVzIHJlbW90ZSBob3N0OnBvcnQuCi0gICAgKi8KLSAgICBjcmVhdGVDbGllbnQoc2VydmljZU5hbWU6IHN0cmluZywgU0NsOiBhbnksIHRyYW5zcG9ydDogVHJhbnNwb3J0KTsKKyAgICAgKi8KKyAgICBjcmVhdGVDbGllbnQoc2VydmljZU5hbWU6IHN0cmluZywgU0NsOiBhbnksIHRyYW5zcG9ydDogT2JqZWN0KTogYW55OwogICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvbGliL3htbC9NYWtlZmlsZS5hbSBiL2xpYi94bWwvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNhZDZiZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi94bWwvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwyOSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK1NVQkRJUlMgPQorCitpZiBXSVRIX0pBVkEKKyMgU2NoZW1hIHZhbGlkYXRpb24gdGVzdCBkZXBlbmRzIG9uIGphdmEKK1NVQkRJUlMgKz0gdGVzdAorZW5kaWYKKworRVhUUkFfRElTVCA9IFwKKyAgdGhyaWZ0LWlkbC54c2QgXAorICB0ZXN0CmRpZmYgLS1naXQgYS9saWIveG1sL3Rlc3QvTWFrZWZpbGUuYW0gYi9saWIveG1sL3Rlc3QvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI4N2E1MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi94bWwvdGVzdC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDI2IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworY2hlY2s6CisJJChBTlQpICQoQU5UX0ZMQUdTKSB0ZXN0CisKKyMgTWFrZSBzdXJlIHRoaXMgZG9lc24ndCBmYWlsIGlmIGFudCBpcyBub3QgY29uZmlndXJlZC4KK2NsZWFuLWxvY2FsOgorCUFOVD0kKEFOVCkgOyBpZiB0ZXN0IC16ICIkJEFOVCIgOyB0aGVuIEFOVD06IDsgZmkgOyBcCisJJCRBTlQgJChBTlRfRkxBR1MpIGNsZWFuCmRpZmYgLS1naXQgYS9saWIveG1sL3Rlc3QvYnVpbGQueG1sIGIvbGliL3htbC90ZXN0L2J1aWxkLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGU5NWNmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3htbC90ZXN0L2J1aWxkLnhtbApAQCAtMCwwICsxLDExMiBAQAorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IG5hbWU9IlhNTCBTY2hlbWEgVGVzdCIgZGVmYXVsdD0idGVzdCIgYmFzZWRpcj0iLiI+CisKKyAgPGRlc2NyaXB0aW9uPlhNTCBTY2hlbWEgVmFsaWRhdGlvbiBUZXN0PC9kZXNjcmlwdGlvbj4KKworICA8cHJvcGVydHkgbmFtZT0ieG1sLmRpciIgbG9jYXRpb249IiR7YmFzZWRpcn0vLi4iIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJnZW4ueG1sLmRpciIgbG9jYXRpb249IiR7YmFzZWRpcn0vLi4vZ2VuLXhtbCIgLz4KKyAgPHByb3BlcnR5IG5hbWU9ImlkbC54bWwuc2NoZW1hIiBsb2NhdGlvbj0iJHt4bWwuZGlyfS90aHJpZnQtaWRsLnhzZCIgLz4KKworICA8cHJvcGVydHkgbmFtZT0idGhyaWZ0LmRpciIgbG9jYXRpb249Ii4uLy4uLy4uLyIgLz4KKyAgPHByb3BlcnR5IG5hbWU9InRocmlmdC50ZXN0LmRpciIgbG9jYXRpb249IiR7dGhyaWZ0LmRpcn0vdGVzdCIgLz4KKyAgPHByb3BlcnR5IG5hbWU9InRocmlmdC5jb21waWxlciIgbG9jYXRpb249IiR7dGhyaWZ0LmRpcn0vY29tcGlsZXIvY3BwL3RocmlmdCIgLz4KKworICA8cHJvcGVydHkgZmlsZT0iJHtiYXNlZGlyfS9idWlsZC5wcm9wZXJ0aWVzIiAvPgorCisgIDx0YXJnZXQgbmFtZT0iY29tcGlsZXIuY2hlY2siPgorICAgIDxmYWlsPgorICAgICAgPGNvbmRpdGlvbj4KKyAgICAgICAgPG5vdD4KKyAgICAgICAgICA8cmVzb3VyY2Vjb3VudCBjb3VudD0iMSI+CisgICAgICAgICAgICA8ZmlsZXNldCBpZD0iZnMiIGZpbGU9IiR7dGhyaWZ0LmNvbXBpbGVyfSIvPgorICAgICAgICAgIDwvcmVzb3VyY2Vjb3VudD4KKyAgICAgICAgPC9ub3Q+CisgICAgICA8L2NvbmRpdGlvbj4KKyAgICAgIFRocmlmdCBjb21waWxlciBpcyBtaXNzaW5nICEKKyAgICA8L2ZhaWw+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iaW5pdCIgZGVwZW5kcz0iY29tcGlsZXIuY2hlY2ssIG1rZGlycyI+CisgICAgPHRzdGFtcCAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9Im1rZGlycyI+CisgICAgPG1rZGlyIGRpcj0iJHtnZW4ueG1sLmRpcn0iLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJnZW5lcmF0ZSIgZGVwZW5kcz0iaW5pdCI+CisgICAgPGdlbmVyYXRlLXhtbCBmaWxlPSIke3RocmlmdC50ZXN0LmRpcn0vVGhyaWZ0VGVzdC50aHJpZnQiLz4KKyAgICA8Z2VuZXJhdGUteG1sIGZpbGU9IiR7dGhyaWZ0LnRlc3QuZGlyfS9JbmNsdWRlLnRocmlmdCIvPgorICAgIDxnZW5lcmF0ZS14bWwgZmlsZT0iJHt0aHJpZnQudGVzdC5kaXJ9L1JlY3Vyc2l2ZS50aHJpZnQiLz4KKyAgICA8Z2VuZXJhdGUteG1sIGZpbGU9IiR7dGhyaWZ0LnRlc3QuZGlyfS9NYW55T3B0aW9uYWxzLnRocmlmdCIvPgorICAgIDxnZW5lcmF0ZS14bWwgZmlsZT0iJHt0aHJpZnQudGVzdC5kaXJ9L09wdGlvbmFsUmVxdWlyZWRUZXN0LnRocmlmdCIvPgorICAgIDxnZW5lcmF0ZS14bWwgZmlsZT0iJHt0aHJpZnQudGVzdC5kaXJ9L0NvbnN0YW50c0RlbW8udGhyaWZ0Ii8+CisgICAgPGdlbmVyYXRlLXhtbCBmaWxlPSIke3RocmlmdC50ZXN0LmRpcn0vVHlwZWRlZlRlc3QudGhyaWZ0IiAvPgorICAgIDxnZW5lcmF0ZS14bWwgZmlsZT0iJHt0aHJpZnQudGVzdC5kaXJ9L0Fubm90YXRpb25UZXN0LnRocmlmdCIgLz4KKyAgICA8Z2VuZXJhdGUteG1sIGZpbGU9IiR7dGhyaWZ0LnRlc3QuZGlyfS9Eb2NUZXN0LnRocmlmdCIgLz4KKyAgICA8Z2VuZXJhdGUteG1sIGZpbGU9IiR7dGhyaWZ0LnRlc3QuZGlyfS9FbnVtVGVzdC50aHJpZnQiIC8+CisgICAgPGdlbmVyYXRlLXhtbCBmaWxlPSIke3RocmlmdC50ZXN0LmRpcn0vTWFueVR5cGVkZWZzLnRocmlmdCIgLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0IiBkZXNjcmlwdGlvbj0icnVuIHNjaGVtYSB2YWxpZGF0aW9uIgorICAgICAgICAgIGRlcGVuZHM9InZhbGlkYXRlLWdlbmVyYXRlZC14bWwiLz4KKyAgICAKKyAgPHRhcmdldCBuYW1lPSJ2YWxpZGF0ZS1nZW5lcmF0ZWQteG1sIiBkZXBlbmRzPSJpbml0LCBnZW5lcmF0ZSI+CisgICAgPHZhbGlkYXRlLXhtbCBmaWxlPSIke2dlbi54bWwuZGlyfS9UaHJpZnRUZXN0LnhtbCIvPgorICAgIDx2YWxpZGF0ZS14bWwgZmlsZT0iJHtnZW4ueG1sLmRpcn0vSW5jbHVkZS54bWwiLz4KKyAgICA8dmFsaWRhdGUteG1sIGZpbGU9IiR7Z2VuLnhtbC5kaXJ9L1JlY3Vyc2l2ZS54bWwiLz4KKyAgICA8dmFsaWRhdGUteG1sIGZpbGU9IiR7Z2VuLnhtbC5kaXJ9L01hbnlPcHRpb25hbHMueG1sIi8+CisgICAgPHZhbGlkYXRlLXhtbCBmaWxlPSIke2dlbi54bWwuZGlyfS9PcHRpb25hbFJlcXVpcmVkVGVzdC54bWwiLz4KKyAgICA8dmFsaWRhdGUteG1sIGZpbGU9IiR7Z2VuLnhtbC5kaXJ9L0NvbnN0YW50c0RlbW8ueG1sIi8+CisgICAgPHZhbGlkYXRlLXhtbCBmaWxlPSIke2dlbi54bWwuZGlyfS9UeXBlZGVmVGVzdC54bWwiLz4KKyAgICA8dmFsaWRhdGUteG1sIGZpbGU9IiR7Z2VuLnhtbC5kaXJ9L0Fubm90YXRpb25UZXN0LnhtbCIvPgorICAgIDx2YWxpZGF0ZS14bWwgZmlsZT0iJHtnZW4ueG1sLmRpcn0vRG9jVGVzdC54bWwiLz4KKyAgICA8dmFsaWRhdGUteG1sIGZpbGU9IiR7Z2VuLnhtbC5kaXJ9L0VudW1UZXN0LnhtbCIvPgorICAgIDx2YWxpZGF0ZS14bWwgZmlsZT0iJHtnZW4ueG1sLmRpcn0vTWFueVR5cGVkZWZzLnhtbCIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImNsZWFuIj4KKyAgICA8ZGVsZXRlIGRpcj0iJHtidWlsZC5kaXJ9IiAvPgorICAgIDxkZWxldGUgZGlyPSIke2dlbi54bWwuZGlyfSIgLz4KKyAgPC90YXJnZXQ+CisKKyAgPG1hY3JvZGVmIG5hbWU9ImdlbmVyYXRlLXhtbCI+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJmaWxlIiAvPgorICAgIDxzZXF1ZW50aWFsPgorICAgICAgPGV4ZWMgZXhlY3V0YWJsZT0iJHt0aHJpZnQuY29tcGlsZXJ9IiBmYWlsb25lcnJvcj0idHJ1ZSI+CisgICAgICAgIDxhcmcgbGluZT0iLWdlbiB4bWw6bWVyZ2UiLz4KKyAgICAgICAgPGFyZyBsaW5lPSItb3V0ICR7Z2VuLnhtbC5kaXJ9Ii8+CisgICAgICAgIDxhcmcgbGluZT0iQHtmaWxlfSIvPgorICAgICAgPC9leGVjPgorICAgIDwvc2VxdWVudGlhbD4KKyAgPC9tYWNyb2RlZj4KKworICA8bWFjcm9kZWYgbmFtZT0idmFsaWRhdGUteG1sIj4KKyAgICA8YXR0cmlidXRlIG5hbWU9ImZpbGUiIC8+CisgICAgPHNlcXVlbnRpYWw+CisgICAgICA8ZWNobyBtZXNzYWdlPSJ2YWxpZGF0aW5nIGdlbmVyYXRlZCBYTUw6IEB7ZmlsZX0iIC8+CisgICAgICA8c2NoZW1hdmFsaWRhdGUgZmlsZT0iQHtmaWxlfSI+CisgICAgICAgIDxzY2hlbWEgbmFtZXNwYWNlPSJodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcveG1sL2lkbCIgCisgICAgICAgICAgICAgICAgZmlsZT0iJHtpZGwueG1sLnNjaGVtYX0iIC8+CisgICAgICA8L3NjaGVtYXZhbGlkYXRlPgorICAgIDwvc2VxdWVudGlhbD4KKyAgPC9tYWNyb2RlZj4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbGliL3htbC90aHJpZnQtaWRsLnhzZCBiL2xpYi94bWwvdGhyaWZ0LWlkbC54c2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDlkZDY5NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi94bWwvdGhyaWZ0LWlkbC54c2QKQEAgLTAsMCArMSwyODMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8c2NoZW1hIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKKyAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcveG1sL2lkbCIgCisgICAgICAgIHhtbG5zOnRucz0iaHR0cDovL3RocmlmdC5hcGFjaGUub3JnL3htbC9pZGwiIAorICAgICAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+CisKKyAgPGVsZW1lbnQgbmFtZT0iaWRsIiB0eXBlPSJ0bnM6SURMIiAvPgorICA8ZWxlbWVudCBuYW1lPSJkb2N1bWVudCIgdHlwZT0idG5zOkRvY3VtZW50IiAvPgorCisgIDxjb21wbGV4VHlwZSBuYW1lPSJJREwiPgorICAgIDxzZXF1ZW5jZT4KKyAgICAgIDxlbGVtZW50IHJlZj0idG5zOmRvY3VtZW50IiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgPC9zZXF1ZW5jZT4KKyAgPC9jb21wbGV4VHlwZT4KKworICA8Y29tcGxleFR5cGUgbmFtZT0iRG9jdW1lbnQiPgorICAgIDxzZXF1ZW5jZT4KKyAgICAgIDxjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisgICAgICAgIDxlbGVtZW50IG5hbWU9ImluY2x1ZGUiIHR5cGU9InRuczpJbmNsdWRlIiAvPgorICAgICAgICA8ZWxlbWVudCBuYW1lPSJuYW1lc3BhY2UiIHR5cGU9InRuczpOYW1lc3BhY2UiIC8+CisgICAgICA8L2Nob2ljZT4KKyAgICAgIDxjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisgICAgICAgIDxlbGVtZW50IG5hbWU9ImV4Y2VwdGlvbiIgdHlwZT0idG5zOkV4Y2VwdGlvbiIgLz4KKyAgICAgICAgPGVsZW1lbnQgbmFtZT0idHlwZWRlZiIgdHlwZT0idG5zOlR5cGVkZWYiIC8+CisgICAgICAgIDxlbGVtZW50IG5hbWU9InNlcnZpY2UiIHR5cGU9InRuczpTZXJ2aWNlIiAvPgorICAgICAgICA8ZWxlbWVudCBuYW1lPSJzdHJ1Y3QiIHR5cGU9InRuczpTdHJ1Y3QiIC8+CisgICAgICAgIDxlbGVtZW50IG5hbWU9ImNvbnN0IiB0eXBlPSJ0bnM6Q29uc3QiIC8+CisgICAgICAgIDxlbGVtZW50IG5hbWU9InVuaW9uIiB0eXBlPSJ0bnM6VW5pb24iIC8+CisgICAgICAgIDxlbGVtZW50IG5hbWU9ImVudW0iIHR5cGU9InRuczpFbnVtIiAvPgorICAgICAgPC9jaG9pY2U+CisgICAgPC9zZXF1ZW5jZT4KKyAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCIgLz4KKyAgICA8YXR0cmlidXRlIG5hbWU9InRhcmdldE5hbWVzcGFjZSIgdHlwZT0iYW55VVJJIiB1c2U9Im9wdGlvbmFsIiAvPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0iZG9jIiB0eXBlPSJzdHJpbmciIHVzZT0ib3B0aW9uYWwiIC8+CisgIDwvY29tcGxleFR5cGU+CisKKyAgPGNvbXBsZXhUeXBlIG5hbWU9IkluY2x1ZGUiPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmlsZSIgdHlwZT0ic3RyaW5nIiB1c2U9Im9wdGlvbmFsIiAvPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIiAvPgorICA8L2NvbXBsZXhUeXBlPgorCisgIDxjb21wbGV4VHlwZSBuYW1lPSJOYW1lc3BhY2UiPgorICAgIDxzZXF1ZW5jZT4KKyAgICAgIDxlbGVtZW50IG5hbWU9ImFubm90YXRpb24iIHR5cGU9InRuczpBbm5vdGF0aW9uIiAKKyAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+CisgICAgPC9zZXF1ZW5jZT4KKyAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCIgLz4KKyAgICA8YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiIC8+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJkb2MiIHR5cGU9InN0cmluZyIgdXNlPSJvcHRpb25hbCIgLz4KKyAgPC9jb21wbGV4VHlwZT4KKworICA8Z3JvdXAgbmFtZT0iQWJzdHJhY3RTdHJ1Y3QiPgorICAgIDxzZXF1ZW5jZT4KKyAgICAgIDxlbGVtZW50IG5hbWU9ImZpZWxkIiB0eXBlPSJ0bnM6RmllbGQiIAorICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KKyAgICAgIDxlbGVtZW50IG5hbWU9ImFubm90YXRpb24iIHR5cGU9InRuczpBbm5vdGF0aW9uIiAKKyAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+CisgICAgPC9zZXF1ZW5jZT4KKyAgPC9ncm91cD4KKworICA8YXR0cmlidXRlR3JvdXAgbmFtZT0iU3RydWN0QXR0cmlidXRlcyI+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiIC8+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJkb2MiIHR5cGU9InN0cmluZyIgdXNlPSJvcHRpb25hbCIgLz4KKyAgPC9hdHRyaWJ1dGVHcm91cD4KKworICA8Y29tcGxleFR5cGUgbmFtZT0iRXhjZXB0aW9uIj4KKyAgICA8Z3JvdXAgcmVmPSJ0bnM6QWJzdHJhY3RTdHJ1Y3QiIC8+CisgICAgPGF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOlN0cnVjdEF0dHJpYnV0ZXMiIC8+CisgIDwvY29tcGxleFR5cGU+CisKKyAgPGNvbXBsZXhUeXBlIG5hbWU9IlNlcnZpY2UiPgorICAgIDxzZXF1ZW5jZT4KKyAgICAgIDxlbGVtZW50IG5hbWU9Im1ldGhvZCIgdHlwZT0idG5zOk1ldGhvZCIgCisgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgorICAgICAgPGVsZW1lbnQgbmFtZT0iYW5ub3RhdGlvbiIgdHlwZT0idG5zOkFubm90YXRpb24iIAorICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KKyAgICA8L3NlcXVlbmNlPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIiAvPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0idGFyZ2V0TmFtZXNwYWNlIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiIC8+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJwYXJlbnQtbW9kdWxlIiB0eXBlPSJzdHJpbmciIHVzZT0ib3B0aW9uYWwiIC8+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJwYXJlbnQtaWQiIHR5cGU9InN0cmluZyIgdXNlPSJvcHRpb25hbCIgLz4gCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJkb2MiIHR5cGU9InN0cmluZyIgdXNlPSJvcHRpb25hbCIgLz4KKyAgPC9jb21wbGV4VHlwZT4KKworICA8Y29tcGxleFR5cGUgbmFtZT0iTWV0aG9kIj4KKyAgICA8c2VxdWVuY2U+CisgICAgICA8ZWxlbWVudCBuYW1lPSJyZXR1cm5zIiB0eXBlPSJ0bnM6VGhyaWZ0VHlwZSIgLz4KKyAgICAgIDxlbGVtZW50IG5hbWU9ImFyZyIgdHlwZT0idG5zOkZpZWxkIiAKKyAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+CisgICAgICA8ZWxlbWVudCBuYW1lPSJ0aHJvd3MiIHR5cGU9InRuczpGaWVsZCIgCisgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgorICAgICAgPGVsZW1lbnQgbmFtZT0iYW5ub3RhdGlvbiIgdHlwZT0idG5zOkFubm90YXRpb24iIAorICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KKyAgICA8L3NlcXVlbmNlPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIiAvPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0ib25ld2F5IiB0eXBlPSJib29sZWFuIiB1c2U9Im9wdGlvbmFsIiAvPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0iZG9jIiB0eXBlPSJzdHJpbmciIHVzZT0ib3B0aW9uYWwiIC8+CisgIDwvY29tcGxleFR5cGU+CisKKyAgPGNvbXBsZXhUeXBlIG5hbWU9IlR5cGVkZWYiPgorICAgIDxjb21wbGV4Q29udGVudD4KKyAgICAgIDxleHRlbnNpb24gYmFzZT0idG5zOlRocmlmdFR5cGUiPgorICAgICAgICA8c2VxdWVuY2U+CisgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iYW5ub3RhdGlvbiIgdHlwZT0idG5zOkFubm90YXRpb24iIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+CisgICAgICAgIDwvc2VxdWVuY2U+CisgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIiAvPgorICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImRvYyIgdHlwZT0ic3RyaW5nIiB1c2U9Im9wdGlvbmFsIiAvPgorICAgICAgPC9leHRlbnNpb24+CisgICAgPC9jb21wbGV4Q29udGVudD4KKyAgPC9jb21wbGV4VHlwZT4KKworICA8Y29tcGxleFR5cGUgbmFtZT0iU3RydWN0Ij4KKyAgICA8Z3JvdXAgcmVmPSJ0bnM6QWJzdHJhY3RTdHJ1Y3QiIC8+CisgICAgPGF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOlN0cnVjdEF0dHJpYnV0ZXMiIC8+CisgIDwvY29tcGxleFR5cGU+CisKKyAgPGNvbXBsZXhUeXBlIG5hbWU9IlVuaW9uIj4KKyAgICA8Z3JvdXAgcmVmPSJ0bnM6QWJzdHJhY3RTdHJ1Y3QiIC8+CisgICAgPGF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOlN0cnVjdEF0dHJpYnV0ZXMiIC8+CisgIDwvY29tcGxleFR5cGU+CisKKyAgPGNvbXBsZXhUeXBlIG5hbWU9IkVudW0iPgorICAgIDxzZXF1ZW5jZT4KKyAgICAgIDxlbGVtZW50IG5hbWU9Im1lbWJlciIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisgICAgICAgIDxjb21wbGV4VHlwZT4KKyAgICAgICAgICA8c2VxdWVuY2U+CisgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJhbm5vdGF0aW9uIiB0eXBlPSJ0bnM6QW5ub3RhdGlvbiIgCisgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgorICAgICAgICAgIDwvc2VxdWVuY2U+CisgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiIC8+CisgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0iaW50IiAvPgorICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZXhwbGljaXQiIHR5cGU9ImJvb2xlYW4iIC8+CisgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkb2MiIHR5cGU9InN0cmluZyIgLz4KKyAgICAgICAgPC9jb21wbGV4VHlwZT4KKyAgICAgIDwvZWxlbWVudD4KKyAgICAgIDxlbGVtZW50IG5hbWU9ImFubm90YXRpb24iIHR5cGU9InRuczpBbm5vdGF0aW9uIiAKKyAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgorICAgIDwvc2VxdWVuY2U+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiIC8+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJkb2MiIHR5cGU9InN0cmluZyIgLz4KKyAgPC9jb21wbGV4VHlwZT4KKworICA8Y29tcGxleFR5cGUgbmFtZT0iRmllbGQiPgorICAgIDxjb21wbGV4Q29udGVudD4KKyAgICAgIDxleHRlbnNpb24gYmFzZT0idG5zOlRocmlmdFR5cGUiPgorICAgICAgICA8c2VxdWVuY2U+CisgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZGVmYXVsdCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiPgorICAgICAgICAgICAgPGNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICA8Z3JvdXAgcmVmPSJ0bnM6Q29uc3RWYWx1ZSIgLz4KKyAgICAgICAgICAgIDwvY29tcGxleFR5cGU+CisgICAgICAgICAgPC9lbGVtZW50PgorICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImFubm90YXRpb24iIHR5cGU9InRuczpBbm5vdGF0aW9uIiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgorICAgICAgICA8L3NlcXVlbmNlPgorICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImZpZWxkLWlkIiB0eXBlPSJsb25nIiAvPgorICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCIgLz4KKyAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJyZXF1aXJlZCIgdHlwZT0idG5zOlJlcXVpcmVkbmVzcyIgLz4KKyAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkb2MiIHR5cGU9InN0cmluZyIgLz4KKyAgICAgIDwvZXh0ZW5zaW9uPgorICAgIDwvY29tcGxleENvbnRlbnQ+CisgIDwvY29tcGxleFR5cGU+CisKKyAgPHNpbXBsZVR5cGUgbmFtZT0iUmVxdWlyZWRuZXNzIj4KKyAgICA8cmVzdHJpY3Rpb24gYmFzZT0ic3RyaW5nIj4KKyAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0icmVxdWlyZWQiIC8+CisgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9Im9wdGlvbmFsIiAvPgorICAgIDwvcmVzdHJpY3Rpb24+CisgIDwvc2ltcGxlVHlwZT4KKworICA8Y29tcGxleFR5cGUgbmFtZT0iQW5ub3RhdGlvbiI+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJrZXkiIHR5cGU9InN0cmluZyIgLz4KKyAgICA8YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJzdHJpbmciIC8+CisgIDwvY29tcGxleFR5cGU+CisKKyAgPGNvbXBsZXhUeXBlIG5hbWU9IkNvbnN0Ij4KKyAgICA8Y29tcGxleENvbnRlbnQ+CisgICAgICA8ZXh0ZW5zaW9uIGJhc2U9InRuczpUaHJpZnRUeXBlIj4KKyAgICAgICAgPHNlcXVlbmNlPgorICAgICAgICAgIDxncm91cCByZWY9InRuczpDb25zdFZhbHVlIiAvPgorICAgICAgICA8L3NlcXVlbmNlPgorICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCIgLz4KKyAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkb2MiIHR5cGU9InN0cmluZyIgLz4KKyAgICAgIDwvZXh0ZW5zaW9uPgorICAgIDwvY29tcGxleENvbnRlbnQ+CisgIDwvY29tcGxleFR5cGU+CisKKyAgPGNvbXBsZXhUeXBlIG5hbWU9IkNvbnN0TGlzdCI+CisgICAgPHNlcXVlbmNlPgorICAgICAgPGVsZW1lbnQgbmFtZT0iZW50cnkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorICAgICAgICA8Y29tcGxleFR5cGU+CisgICAgICAgICAgPGdyb3VwIHJlZj0idG5zOkNvbnN0VmFsdWUiIC8+CisgICAgICAgIDwvY29tcGxleFR5cGU+CisgICAgICA8L2VsZW1lbnQ+CisgICAgPC9zZXF1ZW5jZT4KKyAgPC9jb21wbGV4VHlwZT4KKworICA8Y29tcGxleFR5cGUgbmFtZT0iQ29uc3RNYXAiPgorICAgIDxzZXF1ZW5jZT4KKyAgICAgIDxlbGVtZW50IG5hbWU9ImVudHJ5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKyAgICAgICAgPGNvbXBsZXhUeXBlPgorICAgICAgICAgIDxzZXF1ZW5jZT4KKyAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImtleSI+CisgICAgICAgICAgICAgIDxjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICA8Z3JvdXAgcmVmPSJ0bnM6Q29uc3RWYWx1ZSIgLz4KKyAgICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDwvZWxlbWVudD4KKyAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InZhbHVlIj4KKyAgICAgICAgICAgICAgPGNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgIDxncm91cCByZWY9InRuczpDb25zdFZhbHVlIiAvPgorICAgICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgorICAgICAgICAgICAgPC9lbGVtZW50PgorICAgICAgICAgIDwvc2VxdWVuY2U+CisgICAgICAgIDwvY29tcGxleFR5cGU+CisgICAgICA8L2VsZW1lbnQ+CisgICAgPC9zZXF1ZW5jZT4KKyAgPC9jb21wbGV4VHlwZT4KKworICA8Z3JvdXAgbmFtZT0iQ29uc3RWYWx1ZSI+CisgICAgPGNob2ljZT4KKyAgICAgIDxlbGVtZW50IG5hbWU9InN0cmluZyIgdHlwZT0ic3RyaW5nIiAvPgorICAgICAgPGVsZW1lbnQgbmFtZT0iZG91YmxlIiB0eXBlPSJkb3VibGUiIC8+CisgICAgICA8ZWxlbWVudCBuYW1lPSJsaXN0IiB0eXBlPSJ0bnM6Q29uc3RMaXN0IiAvPgorICAgICAgPGVsZW1lbnQgbmFtZT0ibWFwIiB0eXBlPSJ0bnM6Q29uc3RNYXAiIC8+CisgICAgICA8ZWxlbWVudCBuYW1lPSJpbnQiIHR5cGU9ImxvbmciIC8+CisgICAgPC9jaG9pY2U+CisgIDwvZ3JvdXA+CisKKyAgPGNvbXBsZXhUeXBlIG5hbWU9IlRocmlmdFR5cGUiPgorICAgIDxzZXF1ZW5jZT4KKyAgICAgIDxjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiPgorICAgICAgICA8ZWxlbWVudCBuYW1lPSJlbGVtVHlwZSIgdHlwZT0idG5zOlRocmlmdFR5cGUiIC8+CisgICAgICAgIDxzZXF1ZW5jZT4KKyAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJrZXlUeXBlIiB0eXBlPSJ0bnM6VGhyaWZ0VHlwZSIgCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+CisgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idmFsdWVUeXBlIiB0eXBlPSJ0bnM6VGhyaWZ0VHlwZSIgCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+CisgICAgICAgIDwvc2VxdWVuY2U+CisgICAgICA8L2Nob2ljZT4KKyAgICA8L3NlcXVlbmNlPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0idG5zOlR5cGVJZGVudGlmaWVyIiB1c2U9InJlcXVpcmVkIiAvPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0idHlwZS1tb2R1bGUiIHR5cGU9InN0cmluZyIgLz4KKyAgICA8YXR0cmlidXRlIG5hbWU9InR5cGUtaWQiIHR5cGU9InN0cmluZyIgLz4KKyAgPC9jb21wbGV4VHlwZT4KKworICA8c2ltcGxlVHlwZSBuYW1lPSJUeXBlSWRlbnRpZmllciI+CisgICAgPHJlc3RyaWN0aW9uIGJhc2U9InN0cmluZyI+CisgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9InZvaWQiIC8+CisgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9ImJvb2wiIC8+CisgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9ImJ5dGUiIC8+CisgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9Imk4IiAvPgorICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJpMTYiIC8+CisgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9ImkzMiIgLz4KKyAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iaTY0IiAvPgorICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJkb3VibGUiIC8+CisgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9ImJpbmFyeSIgLz4KKyAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0ic3RyaW5nIiAvPgorICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJpZCIgLz4KKyAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0ibWFwIiAvPgorICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJzZXQiIC8+CisgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9Imxpc3QiIC8+CisgICAgPC9yZXN0cmljdGlvbj4KKyAgPC9zaW1wbGVUeXBlPgorCis8L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BhY2thZ2UtbG9jay5qc29uIGIvcGFja2FnZS1sb2NrLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI2NWFhNgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2UtbG9jay5qc29uCkBAIC0wLDAgKzEsMjE4MyBAQAoreworICAibmFtZSI6ICJ0aHJpZnQiLAorICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICJsb2NrZmlsZVZlcnNpb24iOiAxLAorICAicmVxdWlyZXMiOiB0cnVlLAorICAiZGVwZW5kZW5jaWVzIjogeworICAgICJAYmFiZWwvY29kZS1mcmFtZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjcuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9AYmFiZWwvY29kZS1mcmFtZS8tL2NvZGUtZnJhbWUtNy4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLU9mQzJ1ZW1ha25Ycjg3YmRMVWtXb2c3bll1bGlNOUlqNUhVY2Fqc1ZjTUNwUXJjTG10eFJiVkZUSXFtY1NrU2VZUkJGQlJ4czJGaVVxRkpETGRpZWJBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJAYmFiZWwvaGlnaGxpZ2h0IjogIl43LjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJAYmFiZWwvaGlnaGxpZ2h0IjogeworICAgICAgInZlcnNpb24iOiAiNy4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL0BiYWJlbC9oaWdobGlnaHQvLS9oaWdobGlnaHQtNy4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVVGTUM0WmVGQzQ4VHB2ajdDOFVnTHZ0a2FVdW92UVgrNXhOV3JzSW9NRzhvMnorWEZLakthTjlpVm1TODRkUHdWTjAwVzR3UG1xdllvWkYzRUdBc2Z3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJjaGFsayI6ICJeMi4wLjAiLAorICAgICAgICAiZXN1dGlscyI6ICJeMi4wLjIiLAorICAgICAgICAianMtdG9rZW5zIjogIl40LjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJAdHlwZXMvbm9kZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEwLjEyLjYiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL0B0eXBlcy9ub2RlLy0vbm9kZS0xMC4xMi42LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi0rWldCNUVjMWlraTk5eFFGekJsaXZsS3hTWlErZnVVS0JvdHQ4U3RCT25MTjRkV2JSSGxnZGcxWGtucFc2ZzB0d2VuaU41RGNPcUE2NENKeU9VUFNBdz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiQHR5cGVzL3EiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjUuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvQHR5cGVzL3EvLS9xLTEuNS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1lcXo4Yy8wa3dOaS9PRUhRZnZJdUpWTFRzdDNpbjBlN3VUS2V1WStXTC96ZktuMHhWdWpPVHA0MmJTL3ZVVW9raEs1UDJCcHBMZDlKWE1PTUhjZ2JqQT09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYWJicmV2IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjkiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2FiYnJldi8tL2FiYnJldi0xLjAuOS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWtiUjVKWWluYzR3bDgxM1c5amRTb3ZoM1lUVT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJhY29ybiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjYuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hY29ybi8tL2Fjb3JuLTYuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1HWG1LSXZick4zVFY3YVZxQXpWRmFNVzhGOHd6Vlg3dm9FQlJPM2JEQTY0K0VYMzdZU2F5Z2dSSlA1WGlnNkhZSEJrV0twRmc5VzVnZzZvcmtsdWJoZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYWNvcm4tanN4IjogeworICAgICAgInZlcnNpb24iOiAiNS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Fjb3JuLWpzeC8tL2Fjb3JuLWpzeC01LjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItWGtCNTBmbjBNVVJEeXd3OStVWUwzYzF5TGJPQnowWkZ2cmRZbEdCOGwrSWplMW9TQzc1cUFxcnpTUGpZUWJkblFVemhsVUdOS3Vlc3J5QXYwZ3haT2c9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImFqdiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjYuNS40IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hanYvLS9hanYtNi41LjQudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTRXeWp0OCt0NllzenFhWG5MRGZNbUcvOEFsTzVaYmNzeTNBVEhuY0N6alcvTm9QekFJZDhBSzY3NDlZYmptZHQra1VZMWdQNjBmQ3U0Nm9EeFB2L21nPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJmYXN0LWRlZXAtZXF1YWwiOiAiXjIuMC4xIiwKKyAgICAgICAgImZhc3QtanNvbi1zdGFibGUtc3RyaW5naWZ5IjogIl4yLjAuMCIsCisgICAgICAgICJqc29uLXNjaGVtYS10cmF2ZXJzZSI6ICJeMC40LjEiLAorICAgICAgICAidXJpLWpzIjogIl40LjIuMiIKKyAgICAgIH0KKyAgICB9LAorICAgICJhbWRlZmluZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hbWRlZmluZS8tL2FtZGVmaW5lLTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtU2xLQ3JCWkhLZWsyR2J6OU90RlIrQmZPa2ZVPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJhbnNpLWVzY2FwZXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYW5zaS1lc2NhcGVzLy0vYW5zaS1lc2NhcGVzLTMuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1VZ0FiOEg5RDQxQVFudS9QYldsQ29mUVZjblY0R3MyYkJKaTllWlB4ZlUvaGdnbEZoM1NNRE1FTlJJcWRyN0g2WEZuWGRva25jdEZCeVZzQ09vdFRWdz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYW5zaS1yZWdleCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hbnNpLXJlZ2V4Ly0vYW5zaS1yZWdleC0zLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTdRTVh3eUlHVDNsR2JBS1dhOTIyQmFzMzJaZz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJhbnNpLXN0eWxlcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMi4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hbnNpLXN0eWxlcy8tL2Fuc2ktc3R5bGVzLTMuMi4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1WVDBaSTZrWlJkVGg4WXlKdzNTTWJZbS91K05xZnNBeEVwV08wUGY5c3E4L2U5NFd4eE9wUEt4OUZSMUZseUN0T1ZETk9RKzhudGxxRnhpUmMrcjVxQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY29sb3ItY29udmVydCI6ICJeMS45LjAiCisgICAgICB9CisgICAgfSwKKyAgICAiYXByb2JhIjogeworICAgICAgInZlcnNpb24iOiAiMS4yLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Fwcm9iYS8tL2Fwcm9iYS0xLjIuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItWTlKNlpqWHRvWWg4Um5YVkNNT1UvdHREbWsxYUJqdW5xOXZPMHRhNXg4NVdEUWlRZlVGOXNJUEJJVGRiaWlJVmNCbzAzSGkzak14aWdCdHNkZGxYUnc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImFyZS13ZS10aGVyZS15ZXQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuNSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXJlLXdlLXRoZXJlLXlldC8tL2FyZS13ZS10aGVyZS15ZXQtMS4xLjUudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTVoWWRBa1psY0c4dE9MdWpWRFRnQ1QrdVBYMFZucEFIMjhnV3NMZnpwWFltN3dQNm1wNVEvZ1l5UjdZUTBjS1ZKY1hKbmwzajJrcEJhbjEzUHRRZjZ3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJkZWxlZ2F0ZXMiOiAiXjEuMC4wIiwKKyAgICAgICAgInJlYWRhYmxlLXN0cmVhbSI6ICJeMi4wLjYiCisgICAgICB9CisgICAgfSwKKyAgICAiYXJncGFyc2UiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMTAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2FyZ3BhcnNlLy0vYXJncGFyc2UtMS4wLjEwLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1vNVJveTZ0Tkc0U0wvRk9rQ0FONlJ6amlha1pTMjVSTFlGcmNNdHRKcWJkZDhCV3JuQStmR3o1N2lONVBiMDZwdkJHdmw1Z1EwQjQ4ZEpsc2xYdm9UZz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAic3ByaW50Zi1qcyI6ICJ+MS4wLjIiCisgICAgICB9CisgICAgfSwKKyAgICAiYXJyYXktdW5pb24iOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXJyYXktdW5pb24vLS9hcnJheS11bmlvbi0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLW1qUkJEazlPUGFJOTZqZGI1YjV3OGtkNDdEaz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhcnJheS11bmlxIjogIl4xLjAuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJhcnJheS11bmlxIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2FycmF5LXVuaXEvLS9hcnJheS11bmlxLTEuMC4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtcjJySWQ2SmN4L2RPQllpVWRUaFkzOXNrL2JZPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImFycmlmeSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hcnJpZnkvLS9hcnJpZnktMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1pWVVJMmlJbTg0RGZrRWNvUldoSndWQWFTdzA9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYXN5bmMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjUuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hc3luYy8tL2FzeW5jLTEuNS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtN0dwaHJsWklEQXc4c2tISlZoamlDSkw1WnlvPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImFzeW5jLWxpbWl0ZXIiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXN5bmMtbGltaXRlci8tL2FzeW5jLWxpbWl0ZXItMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWpwL3VGbm9vT2lPK0wyMTFlWk9vU3l6cE9JVE1YeDFyQklUYXVZeWtHM0JSWVB1OGgwVWN4c1BOQjA0UlI1dm80VHl6MytheTE3dFI2SlZmOXF6WVdnPT0iCisgICAgfSwKKyAgICAiYmFieWxvbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjcuMC4wLWJldGEuMTkiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2JhYnlsb24vLS9iYWJ5bG9uLTcuMC4wLWJldGEuMTkudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVZnMEM5cy9SRVg2L1dJWE4zN1VLcHY1WmhSaTZBNHBqSGxwa0UzNCs4L2E2YzJXMVE2OTJuM2htYytTWkc1bEtSbmFFeExVYnh0SjFTVlQrS2FDUS9BPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJiYWxhbmNlZC1tYXRjaCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9iYWxhbmNlZC1tYXRjaC8tL2JhbGFuY2VkLW1hdGNoLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtaWJUUm1hc3I3a25lRms2Z0s0bk9SaTF4dDJjPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImJpbmRpbmdzIjogeworICAgICAgInZlcnNpb24iOiAiMS4zLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2JpbmRpbmdzLy0vYmluZGluZ3MtMS4zLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLURwTGg1RXpNUjJrenZYMUtJbFZDMFZrQzNpWnRIS1RnZHRaMGEzcGdsQlpkYVFGanQ1UzlnOXhkMWxFK1l2WHlmZDZtdENlUm5yVWZPTFlpVE1sTlN3PT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJibCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMi4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL2JsLy0vYmwtMS4yLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWU4dFFZblpvZG1lYllEV0dIN0tNUnZ0ektYYUpIeDNCYmlscmdaQ2Z2eUxVWWRLcEsxdDVQU1BtcGtueS9TZ2lUU0NuamZMVzd2NXJsT05YVkZrUUVBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJyZWFkYWJsZS1zdHJlYW0iOiAiXjIuMy41IiwKKyAgICAgICAgInNhZmUtYnVmZmVyIjogIl41LjEuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJibHVlYmlyZCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuNS4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ibHVlYmlyZC8tL2JsdWViaXJkLTMuNS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1kaEhUV01JN2tNeDV3aE1RbnRsN1ZyOUM2QnZWMTBsRlhEQWFzbnFuck1ZaFhWQ3p6azZJTzlGbzJMNzVqWEhUMDdXck9uZ0wxV0RYT3AreVlTOTFZZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYnJhY2UtZXhwYW5zaW9uIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjExIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9icmFjZS1leHBhbnNpb24vLS9icmFjZS1leHBhbnNpb24tMS4xLjExLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1pQ3VQSERGZ3JIWDdIMnZFSS81eHB6MDd6U0hCMDBUcHVncWhtWXRWbU1PNjUxOG1DdVJNb09ZRmxkRUJsMGcxODd1Zm96ZGFIZ1dLY1lGYjYxcUdpQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYmFsYW5jZWQtbWF0Y2giOiAiXjEuMC4wIiwKKyAgICAgICAgImNvbmNhdC1tYXAiOiAiMC4wLjEiCisgICAgICB9CisgICAgfSwKKyAgICAiYnVmZmVyLWFsbG9jIjogeworICAgICAgInZlcnNpb24iOiAiMS4yLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2J1ZmZlci1hbGxvYy8tL2J1ZmZlci1hbGxvYy0xLjIuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItQ0ZzSFFnanRXMVVDaGRYZ2J5Skd0bm0rTy91TFFlWmR0YkRvOG1mVWdZWENIU00xd2dyVnhYbTZiU3lyVXVFckViKzRzWVZHQ3pBU0JSb3Q3enlyb3c9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImJ1ZmZlci1hbGxvYy11bnNhZmUiOiAiXjEuMS4wIiwKKyAgICAgICAgImJ1ZmZlci1maWxsIjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJidWZmZXItYWxsb2MtdW5zYWZlIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2J1ZmZlci1hbGxvYy11bnNhZmUvLS9idWZmZXItYWxsb2MtdW5zYWZlLTEuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1URU0yaU1JRVFkSjJ5alBKb1NJc2xkbmxlVmFBazFvVzNEQlZVeWt5T0xzRXNGbUVjOWtuK1NGRlB6K2dsNTRLUU54bERuQXdDWG9zT1M5T2t4MnhBZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYnVmZmVyLWVxdWFscyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC40IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL2J1ZmZlci1lcXVhbHMvLS9idWZmZXItZXF1YWxzLTEuMC40LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtQTFPMVQ5Qi8yVlpCY0djYTV2WnJuUEVOSi9VPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImJ1ZmZlci1maWxsIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2J1ZmZlci1maWxsLy0vYnVmZmVyLWZpbGwtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0rUGVMZG5pWWlPODU4Z1hOWTM5bzV3SVNLeXc9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiY2FsbGVyLXBhdGgiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY2FsbGVyLXBhdGgvLS9jYWxsZXItcGF0aC0wLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWxBaGU5aldCN05QYXFTUkVxUDZVNkNWM2RSOD0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJjYWxsc2l0ZXMiOiAiXjAuMi4wIgorICAgICAgfQorICAgIH0sCisgICAgImNhbGxzaXRlcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jYWxsc2l0ZXMvLS9jYWxsc2l0ZXMtMC4yLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1yNnVXSmlrUXAvTThHYVYzV0NYR256VGpVTW89IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiY2F0aGFyc2lzIjogeworICAgICAgInZlcnNpb24iOiAiMC44LjkiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NhdGhhcnNpcy8tL2NhdGhhcnNpcy0wLjguOS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLW1NeUpES1pTM1M3dzV3czNrbE1RLzU2US9Jcz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJ1bmRlcnNjb3JlLWNvbnRyaWIiOiAifjAuMy4wIgorICAgICAgfQorICAgIH0sCisgICAgImNoYWxrIjogeworICAgICAgInZlcnNpb24iOiAiMi40LjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NoYWxrLy0vY2hhbGstMi40LjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLU9iTjZoMXYyZlRKU21VWG9TM25NUTkyTGJESzliZTRUVis2RytvbVFsR0pGZGNVWDVoZUtpMUxaMVluUk1JZ3dUTEVqM0UyNGJUNnRZbmk1MHJsQ2ZRPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhbnNpLXN0eWxlcyI6ICJeMy4yLjEiLAorICAgICAgICAiZXNjYXBlLXN0cmluZy1yZWdleHAiOiAiXjEuMC41IiwKKyAgICAgICAgInN1cHBvcnRzLWNvbG9yIjogIl41LjMuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJjaGFyZGV0IjogeworICAgICAgInZlcnNpb24iOiAiMC43LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NoYXJkZXQvLS9jaGFyZGV0LTAuNy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1tVDhpRGNyaDAzcURHUlJtb0EyaG1CSm54cGxsTVIrMC8wcWx6anFaRVM2TmRpV0RjWmtDTkFrNHJQRlo5UTg1cjI3dW5raU5OZzhaT2l3WlhCSHdjQT09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiY2hvd25yIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Nob3duci8tL2Nob3duci0xLjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItajM4RXZPNStMSFg4NGpsbzZoNFV6bU93aTBVZ1c2MVdSeVB0Sno0cWFhZEs1ZVkzQlRTNVRZL1MxU3RjM1VrMmxJTTZUUGV2QWxVTGlFSndpZTg2MGc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImNpcmN1bGFyLWpzb24iOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjMuMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY2lyY3VsYXItanNvbi8tL2NpcmN1bGFyLWpzb24tMC4zLjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVVaSzNOQngyTWNhK2I1THNHN2JZMTgzcEhXdDVZMXh0czRQM1B6N0VOVHdHVm5KT1VXYlJiM29janZYN2h4OXRxL3lUQWRjbFhtOXNaMzhnTnVlbTRBPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJjbGktY3Vyc29yIjogeworICAgICAgInZlcnNpb24iOiAiMi4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NsaS1jdXJzb3IvLS9jbGktY3Vyc29yLTIuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtczEyc04yUjUrc3crbEhSOVFkRFE5U09QL0xVPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInJlc3RvcmUtY3Vyc29yIjogIl4yLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJjbGktd2lkdGgiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjIuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY2xpLXdpZHRoLy0vY2xpLXdpZHRoLTIuMi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtL3hudDZLbWw1WGt5UVVld3dSOFB2THErMWprPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImNvZGUtcG9pbnQtYXQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY29kZS1wb2ludC1hdC8tL2NvZGUtcG9pbnQtYXQtMS4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1EUWNMVFFRNlcrb3pvdkdrRGk3YlBacE16M2M9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiY29sb3ItY29udmVydCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuOS4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jb2xvci1jb252ZXJ0Ly0vY29sb3ItY29udmVydC0xLjkuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItUWZBVXRkK3ZGZEF0RlFjQzhDQ3lZdDFmWVd4U3FBaUsyY1NENnpEQjhOM2Nwc0VCQXZSeHA5ek9HZzZHL1NISEpZQVQ4OC9hei9JdURHQUxzTlZiR2c9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNvbG9yLW5hbWUiOiAiMS4xLjMiCisgICAgICB9CisgICAgfSwKKyAgICAiY29sb3ItbmFtZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jb2xvci1uYW1lLy0vY29sb3ItbmFtZS0xLjEuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXA5QlZpOWljUXZlVjNVSXlqM1FJTWNwVHZDVT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJjb21tYW5kZXIiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjE5LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NvbW1hbmRlci8tL2NvbW1hbmRlci0yLjE5LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTZ0dkFPTytENk9FTnZSQWg1MjREaDlqY2ZLVFlEUUFxdnFlemJDVzgyeGo1WDBwU3JjcHh0dlJLSExHMHlCWTZTRDdQU0RySmFqKzBBaU9jS1ZkMVhnPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJjb25jYXQtbWFwIjogeworICAgICAgInZlcnNpb24iOiAiMC4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NvbmNhdC1tYXAvLS9jb25jYXQtbWFwLTAuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtMktscjEzL1dqZmQ1T25NRGFqdWcxVUJkUjNzPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImNvbm5lY3QiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjYuNiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY29ubmVjdC8tL2Nvbm5lY3QtMy42LjYudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1DZS8yeFZyM0kyNFRjVFduSlhTRmkyZUc5U1E9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZGVidWciOiAiMi42LjkiLAorICAgICAgICAiZmluYWxoYW5kbGVyIjogIjEuMS4wIiwKKyAgICAgICAgInBhcnNldXJsIjogIn4xLjMuMiIsCisgICAgICAgICJ1dGlscy1tZXJnZSI6ICIxLjAuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJjb25zb2xlLWNvbnRyb2wtc3RyaW5ncyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jb25zb2xlLWNvbnRyb2wtc3RyaW5ncy8tL2NvbnNvbGUtY29udHJvbC1zdHJpbmdzLTEuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtUFh6MFJrMjJSRzZtUkw5TE9WQi9tRkVBam80PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImNvcmUtdXRpbC1pcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jb3JlLXV0aWwtaXMvLS9jb3JlLXV0aWwtaXMtMS4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS10ZjFVSWdxaXZGcTFlcXR4UU1sQWRVVUR3YWM9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiY3Jvc3Mtc3Bhd24iOiB7CisgICAgICAidmVyc2lvbiI6ICI2LjAuNSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY3Jvc3Mtc3Bhd24vLS9jcm9zcy1zcGF3bi02LjAuNS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItZVRWTHJCU3Q3ZmpiRHlnejgwNXBNbnN0SXMyVlRCTmtSbTBxeFpkK003QTVYRGR4VlJXTzVNeEdCWFpoalk0Y3FMWUxkdHJHcVJmOG1CUG16d1NwV1E9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgIm5pY2UtdHJ5IjogIl4xLjAuNCIsCisgICAgICAgICJwYXRoLWtleSI6ICJeMi4wLjEiLAorICAgICAgICAic2VtdmVyIjogIl41LjUuMCIsCisgICAgICAgICJzaGViYW5nLWNvbW1hbmQiOiAiXjEuMi4wIiwKKyAgICAgICAgIndoaWNoIjogIl4xLjIuOSIKKyAgICAgIH0KKyAgICB9LAorICAgICJkZWJ1ZyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuNi45IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZWJ1Zy8tL2RlYnVnLTIuNi45LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1iQzdFbHJkSmFKblBiQVArMUVvdFl2cVpzYjNlY2w1d2k2QmZpNkJKVFVjTm93cDZjdnNwZzBqWHpuUlRLRGptL0U3QWRnRkJWZUFQVk1OY0tHc0hNQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAibXMiOiAiMi4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiZGVjb21wcmVzcy1yZXNwb25zZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMy4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZWNvbXByZXNzLXJlc3BvbnNlLy0vZGVjb21wcmVzcy1yZXNwb25zZS0zLjMuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWdLVGRNamRJT0V2NkpJQ0RZaXJ0N0pncTMvTT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJtaW1pYy1yZXNwb25zZSI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiZGVlcC1lcXVhbCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZWVwLWVxdWFsLy0vZGVlcC1lcXVhbC0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTlkSmdLU3RtRGdoTy8wemJ5ZkNLMHlSMFNMVT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJkZWVwLWV4dGVuZCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuNi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZWVwLWV4dGVuZC8tL2RlZXAtZXh0ZW5kLTAuNi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1MT0h4SU9hUFlkSGxKUnRDUWZESVZadGZ3L3VmTTgrclZqNjQ5UklIemNtL3ZHd1FSWEZ0Nk9QcUlGV3NtMlhFTXJOSUV0V1I2NHNZMUxFS0QydkFPQT09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZGVlcC1pcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZWVwLWlzLy0vZGVlcC1pcy0wLjEuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXMyblcrMTI4RSs3UFVrK1JzSEQrN2NOWHp6UT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJkZWZpbmUtcHJvcGVydGllcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZWZpbmUtcHJvcGVydGllcy8tL2RlZmluZS1wcm9wZXJ0aWVzLTEuMS4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi0zTXFmWUtqMmxMemRNU2Y4WklaRS9WK1p1eStCZ0Q2ZjE2NGU4SzJ3N2RnbnBLQXJCRGVyR1lwTTQ2SVlZY2pua2RQTk1qUGs5QTZWRkI4KzNTS2xYUT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAib2JqZWN0LWtleXMiOiAiXjEuMC4xMiIKKyAgICAgIH0KKyAgICB9LAorICAgICJkZWZpbmVkIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RlZmluZWQvLS9kZWZpbmVkLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEteVkyYnp2ZFdkQmlPRVFscEZSR1o0NXNmcHBNPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImRlbCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMi4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZWwvLS9kZWwtMi4yLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS13U3lZSFFaNFJzaEx5dmhpei9rdzJRZi8wYWc9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZ2xvYmJ5IjogIl41LjAuMCIsCisgICAgICAgICJpcy1wYXRoLWN3ZCI6ICJeMS4wLjAiLAorICAgICAgICAiaXMtcGF0aC1pbi1jd2QiOiAiXjEuMC4wIiwKKyAgICAgICAgIm9iamVjdC1hc3NpZ24iOiAiXjQuMC4xIiwKKyAgICAgICAgInBpZnkiOiAiXjIuMC4wIiwKKyAgICAgICAgInBpbmtpZS1wcm9taXNlIjogIl4yLjAuMCIsCisgICAgICAgICJyaW1yYWYiOiAiXjIuMi44IgorICAgICAgfQorICAgIH0sCisgICAgImRlbGVnYXRlcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZWxlZ2F0ZXMvLS9kZWxlZ2F0ZXMtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1oTWJoV2JnWkJQM0tXYUR2Uk0ySERURWxENW89IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZGV0ZWN0LWxpYmMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGV0ZWN0LWxpYmMvLS9kZXRlY3QtbGliYy0xLjAuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLStoTjhTOWFZN2ZWYzFjMENyRldma2FURXVwcz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJkb2N0cmluZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kb2N0cmluZS8tL2RvY3RyaW5lLTIuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi0zNW1Ta3U0WlhLMHZmQ3VIRURBd3Q1NWRnMmpOYWpIWjFvZHZGKzhTU3I4MkVzWlk0UW1YZnVXc284b0VkOHpSaFZPYlNOMThhTTBDalNkb0JYN3pJdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZXN1dGlscyI6ICJeMi4wLjIiCisgICAgICB9CisgICAgfSwKKyAgICAiZWUtZmlyc3QiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZWUtZmlyc3QvLS9lZS1maXJzdC0xLjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVdReGhGV3NLNHZUd0pWY3lvVml5WnJ4V3NoMD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJlbmNvZGV1cmwiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZW5jb2RldXJsLy0vZW5jb2RldXJsLTEuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtclQvMHlHN0MwQ2t5TDFvQ3c2bW1Cc2xiUDFrPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImVuZC1vZi1zdHJlYW0iOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjQuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZW5kLW9mLXN0cmVhbS8tL2VuZC1vZi1zdHJlYW0tMS40LjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTFNa3JaTnZXVEtDYWlnYm4rVzE1ZWxxMkJCL0wyMm5xclNZNURLbG8zWDYrdmNsSm04QmI1ZGpYSkJtRVg2ZlMzK3pDaC9GNFZCSzVaMkt4SnQ0czJRPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJvbmNlIjogIl4xLjQuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJlcy1hYnN0cmFjdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMTIuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXMtYWJzdHJhY3QvLS9lcy1hYnN0cmFjdC0xLjEyLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUM4RngvMGpGbVY1SVBvTU9GUEE5UDlHNU50cVcrNGNPUGl0M01JdXZSMnQ3QWcySzE1RUpUcHhuSEFZVHpMK2FZUUpJRVNZZVhabURCZk9CRTFIY3BBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJlcy10by1wcmltaXRpdmUiOiAiXjEuMS4xIiwKKyAgICAgICAgImZ1bmN0aW9uLWJpbmQiOiAiXjEuMS4xIiwKKyAgICAgICAgImhhcyI6ICJeMS4wLjEiLAorICAgICAgICAiaXMtY2FsbGFibGUiOiAiXjEuMS4zIiwKKyAgICAgICAgImlzLXJlZ2V4IjogIl4xLjAuNCIKKyAgICAgIH0KKyAgICB9LAorICAgICJlcy10by1wcmltaXRpdmUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjIuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXMtdG8tcHJpbWl0aXZlLy0vZXMtdG8tcHJpbWl0aXZlLTEuMi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1xWnJ5Qk9KalYvL0xheExUVjZVQy8vV2V3bmVCM0xjWE9MOU5QKytvektWWHNJSUlwbS8yYzEzVURpRDlKcDJlVGhzZWN3OW0zalBxRHdUeW9iY2RiZz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaXMtY2FsbGFibGUiOiAiXjEuMS40IiwKKyAgICAgICAgImlzLWRhdGUtb2JqZWN0IjogIl4xLjAuMSIsCisgICAgICAgICJpcy1zeW1ib2wiOiAiXjEuMC4yIgorICAgICAgfQorICAgIH0sCisgICAgImVzY2FwZS1odG1sIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VzY2FwZS1odG1sLy0vZXNjYXBlLWh0bWwtMS4wLjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1BbGpxNU5QUXdKZE40Y0ZwR0k3d0JSMGRHWWc9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZXNjYXBlLXN0cmluZy1yZWdleHAiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuNSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXNjYXBlLXN0cmluZy1yZWdleHAvLS9lc2NhcGUtc3RyaW5nLXJlZ2V4cC0xLjAuNS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUcySEFWaUdRcU4vMnJqdXl6d0lBeWhNTGh0UT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJlc2NvZGVnZW4iOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjguMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXNjb2RlZ2VuLy0vZXNjb2RlZ2VuLTEuOC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtV2x0VHIwYVRFUXZyc0laNm8wTU4wN2NLRUJnPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImVzcHJpbWEiOiAiXjIuNy4xIiwKKyAgICAgICAgImVzdHJhdmVyc2UiOiAiXjEuOS4xIiwKKyAgICAgICAgImVzdXRpbHMiOiAiXjIuMC4yIiwKKyAgICAgICAgIm9wdGlvbmF0b3IiOiAiXjAuOC4xIiwKKyAgICAgICAgInNvdXJjZS1tYXAiOiAifjAuMi4wIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJlc3ByaW1hIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjIuNy4zIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXNwcmltYS8tL2VzcHJpbWEtMi43LjMudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbHVPM0RWZDU5cTFKelFNbWM5SERFblo3cFlFPSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfSwKKyAgICAgICAgImVzdHJhdmVyc2UiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS45LjMiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lc3RyYXZlcnNlLy0vZXN0cmF2ZXJzZS0xLjkuMy50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1yMmZ5M0pJbGdrRlpVSkpna2FRQVhTbkp1MFE9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiZXNsaW50IjogeworICAgICAgInZlcnNpb24iOiAiNS43LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VzbGludC8tL2VzbGludC01LjcuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItellDZUZRYWhzeGZmR2w4N1UyYUo3RFB5SDhDYldneEJDMjEzWTgrVENhbmhVVGYyZ0V2ZnEzRUtwSG1FY296VEx5UG1HZTlMWmRNQXdDL0NwSkJNNUE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgIkBiYWJlbC9jb2RlLWZyYW1lIjogIl43LjAuMCIsCisgICAgICAgICJhanYiOiAiXjYuNS4zIiwKKyAgICAgICAgImNoYWxrIjogIl4yLjEuMCIsCisgICAgICAgICJjcm9zcy1zcGF3biI6ICJeNi4wLjUiLAorICAgICAgICAiZGVidWciOiAiXjQuMC4xIiwKKyAgICAgICAgImRvY3RyaW5lIjogIl4yLjEuMCIsCisgICAgICAgICJlc2xpbnQtc2NvcGUiOiAiXjQuMC4wIiwKKyAgICAgICAgImVzbGludC11dGlscyI6ICJeMS4zLjEiLAorICAgICAgICAiZXNsaW50LXZpc2l0b3Ita2V5cyI6ICJeMS4wLjAiLAorICAgICAgICAiZXNwcmVlIjogIl40LjAuMCIsCisgICAgICAgICJlc3F1ZXJ5IjogIl4xLjAuMSIsCisgICAgICAgICJlc3V0aWxzIjogIl4yLjAuMiIsCisgICAgICAgICJmaWxlLWVudHJ5LWNhY2hlIjogIl4yLjAuMCIsCisgICAgICAgICJmdW5jdGlvbmFsLXJlZC1ibGFjay10cmVlIjogIl4xLjAuMSIsCisgICAgICAgICJnbG9iIjogIl43LjEuMiIsCisgICAgICAgICJnbG9iYWxzIjogIl4xMS43LjAiLAorICAgICAgICAiaWdub3JlIjogIl40LjAuNiIsCisgICAgICAgICJpbXVybXVyaGFzaCI6ICJeMC4xLjQiLAorICAgICAgICAiaW5xdWlyZXIiOiAiXjYuMS4wIiwKKyAgICAgICAgImlzLXJlc29sdmFibGUiOiAiXjEuMS4wIiwKKyAgICAgICAgImpzLXlhbWwiOiAiXjMuMTIuMCIsCisgICAgICAgICJqc29uLXN0YWJsZS1zdHJpbmdpZnktd2l0aG91dC1qc29uaWZ5IjogIl4xLjAuMSIsCisgICAgICAgICJsZXZuIjogIl4wLjMuMCIsCisgICAgICAgICJsb2Rhc2giOiAiXjQuMTcuNSIsCisgICAgICAgICJtaW5pbWF0Y2giOiAiXjMuMC40IiwKKyAgICAgICAgIm1rZGlycCI6ICJeMC41LjEiLAorICAgICAgICAibmF0dXJhbC1jb21wYXJlIjogIl4xLjQuMCIsCisgICAgICAgICJvcHRpb25hdG9yIjogIl4wLjguMiIsCisgICAgICAgICJwYXRoLWlzLWluc2lkZSI6ICJeMS4wLjIiLAorICAgICAgICAicGx1cmFsaXplIjogIl43LjAuMCIsCisgICAgICAgICJwcm9ncmVzcyI6ICJeMi4wLjAiLAorICAgICAgICAicmVnZXhwcCI6ICJeMi4wLjEiLAorICAgICAgICAicmVxdWlyZS11bmNhY2hlZCI6ICJeMS4wLjMiLAorICAgICAgICAic2VtdmVyIjogIl41LjUuMSIsCisgICAgICAgICJzdHJpcC1hbnNpIjogIl40LjAuMCIsCisgICAgICAgICJzdHJpcC1qc29uLWNvbW1lbnRzIjogIl4yLjAuMSIsCisgICAgICAgICJ0YWJsZSI6ICJeNS4wLjIiLAorICAgICAgICAidGV4dC10YWJsZSI6ICJeMC4yLjAiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImRlYnVnIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjQuMS4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGVidWcvLS9kZWJ1Zy00LjEuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWhlTlBKVUpJcUMreEI2YXlMQU1IYUlybU45SEthN2FRTzhNR3FLcHZDQSt1SllWY3ZSNmw1a2dkcmhSdXdQRkhVN1A1L0ExdzBCakJ5UEh3cGZUREtnPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJtcyI6ICJeMi4xLjEiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAibXMiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMi4xLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9tcy8tL21zLTIuMS4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItdGdwK2RsNWNHazI4dXRZa3RCc3JGcUE3SEtncmhnUHNnNlovRWZoV0k0Z2wxSHdxOEIvR21ZLzBvWFo2bkY4aERWZXNTL0ZwbllhRC9rT1doWVF2eWc9PSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImVzbGludC1jb25maWctcHJldHRpZXIiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXNsaW50LWNvbmZpZy1wcmV0dGllci8tL2VzbGludC1jb25maWctcHJldHRpZXItMy4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVFZR2ZtenVjNHE0SjZYSWhscDh2UktkSS9mSTB0UWZRUHkxZE1FM1VPTHByRSt2NHNzSC8zVzlMTTJRN2g1cUJjeTVtMGVoQ3JCRFUyWUY4cTZPWTh3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJnZXQtc3RkaW4iOiAiXjYuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImVzbGludC1wbHVnaW4tcHJldHRpZXIiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXNsaW50LXBsdWdpbi1wcmV0dGllci8tL2VzbGludC1wbHVnaW4tcHJldHRpZXItMy4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTRnMTFvcHpocXEvOCtBTW1vNVZjMkduN3o5YWxaNEpxcmJaK0Q0aThLbFN5eGVRaFpIbG1Jclk4VTlBa2Y1MTRNb0Vob2dQYTg3SmdrcTg3YVoyT2h3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJwcmV0dGllci1saW50ZXItaGVscGVycyI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiZXNsaW50LXNjb3BlIjogeworICAgICAgInZlcnNpb24iOiAiNC4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VzbGludC1zY29wZS8tL2VzbGludC1zY29wZS00LjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItMUc2VVREaTdKYzFFTEZ3blI1OEhWNGZLOU9RSzRTNk45ODVmMTY2eHFYeHBqVTZwbHhGSVNKYTJCYTlLQ1F1RmE4UkNuai9sU0ZKYkhvN1VGREJuVUE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImVzcmVjdXJzZSI6ICJeNC4xLjAiLAorICAgICAgICAiZXN0cmF2ZXJzZSI6ICJeNC4xLjEiCisgICAgICB9CisgICAgfSwKKyAgICAiZXNsaW50LXV0aWxzIjogeworICAgICAgInZlcnNpb24iOiAiMS4zLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VzbGludC11dGlscy8tL2VzbGludC11dGlscy0xLjMuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItWjdZam5JbGRYKzJYTWNqcjdaa2dFc09qL2JSRU9OVjYwcVllQi9iak1BcXFxWjR6eEt5V1grQk9Va2RtUm1BOXJpaUlQVnZvNXg4Nm01ZWx2aU9rMFE9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImVzbGludC12aXNpdG9yLWtleXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXNsaW50LXZpc2l0b3Ita2V5cy8tL2VzbGludC12aXNpdG9yLWtleXMtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXF6bS9YeElieG0vRkh5SDM0MVpyYm5NVXBlKzVCb2N0ZTl4a21GTXpQTWpSYVpNY1h3dytNcEJwdEZ2dFUrNzlMMzYybnFpTGhla0N4Q3hEUGFVTUJRPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJlc3ByZWUiOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXNwcmVlLy0vZXNwcmVlLTQuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1JNUJ5Y1pXNkZDVkl1YjkzVGVWWTFzN3ZqaFA5Q1k2Y1hDem5JUmZpaWc3blJ2aUtaWWRSbmovc0hFV0M2QTdXRTlSRFdPRnE5KzdPc1dTWXo4cXYydz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYWNvcm4iOiAiXjYuMC4yIiwKKyAgICAgICAgImFjb3JuLWpzeCI6ICJeNS4wLjAiLAorICAgICAgICAiZXNsaW50LXZpc2l0b3Ita2V5cyI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiZXNwcmltYSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjQuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lc3ByaW1hLy0vZXNwcmltYS00LjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItZUd1RkZ3N1VwZGErZzRwK1FIdm5XMFJ5VFgvU1ZlSkJETS9nQ3RNQVJPMGNMdVQySGNFS25UUHZoalY2YUdlcXJDQi9zYk5vcDBLc3ptMGpzYVdVNEE9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImVzcXVlcnkiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXNxdWVyeS8tL2VzcXVlcnktMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVNtaXlaNXpJV0g5Vk0rU1JVUmVMUzVROGE3R3h0UmR4RUJWWnBtOThySk03U2IrQTlEVkNuZFhma2VGVWQzYnlkZXJnK0ViRGtmbmV2ZkN3eW5XYU5BPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJlc3RyYXZlcnNlIjogIl40LjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJlc3JlY3Vyc2UiOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjIuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXNyZWN1cnNlLy0vZXNyZWN1cnNlLTQuMi4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi02NFJCQisrZklPQVhQdzNQOWN5ODlxZk1sdlpFWFprcXFKa2pxcVhJdnpQNWV6UlpqVytsUFdqdzM1VVgvM0VoVVBGWWJnNUVSNEpZZ0R3NDAwNy9EUT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZXN0cmF2ZXJzZSI6ICJeNC4xLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiZXN0cmF2ZXJzZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjQuMi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lc3RyYXZlcnNlLy0vZXN0cmF2ZXJzZS00LjIuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLURlNC83VEg4MUdsaGpPYzBJSm44R3ZvTDJ4TT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJlc3V0aWxzIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VzdXRpbHMvLS9lc3V0aWxzLTIuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtQ3I5UEhLcGJ5eDk2bllyTWJlcFBxcUJMckpzPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImV4cGFuZC10ZW1wbGF0ZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9leHBhbmQtdGVtcGxhdGUvLS9leHBhbmQtdGVtcGxhdGUtMS4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWNlYnFMdFY4S09aZncwVUk4VEVGV3h0Y3p4eEMxanZ5VXZ4Nkg0ZnlwMUsxRk43QTRRK3VnZ1ZVbE9zSTFLOEFHVTByd09HcVA4bkNhcGRydzhDWVFnPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJleHRlcm5hbC1lZGl0b3IiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjAuMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXh0ZXJuYWwtZWRpdG9yLy0vZXh0ZXJuYWwtZWRpdG9yLTMuMC4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1ibjcxSDkrcVdvT1FLeVpEbzI1bU9NVnBTbVhST0FzVEpWVlZZenJydG9sM2Q0eStBc0tqZjRJd2wyUStJdVQwa0ZTUTFxbzE2NlV1SXdxWXE3bUduQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY2hhcmRldCI6ICJeMC43LjAiLAorICAgICAgICAiaWNvbnYtbGl0ZSI6ICJeMC40LjI0IiwKKyAgICAgICAgInRtcCI6ICJeMC4wLjMzIgorICAgICAgfQorICAgIH0sCisgICAgImZhc3QtZGVlcC1lcXVhbCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9mYXN0LWRlZXAtZXF1YWwvLS9mYXN0LWRlZXAtZXF1YWwtMi4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1ld1VoamQrV1o3OS9Od3YzL2JMTEZmM1Fxa2s9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZmFzdC1kaWZmIjogeworICAgICAgInZlcnNpb24iOiAiMS4yLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Zhc3QtZGlmZi8tL2Zhc3QtZGlmZi0xLjIuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTIteEp1b1Q1K0w5OVhsWjh0d2VkYVJmNkF4MlRnUVZ4dmdaT1lvUEtxWnVmbUppYjB0TDJ0ZWdQQk9aYjFwVk5nSWhscURsQTBlTzBjM3dCdlFjbXp4NHc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImZhc3QtanNvbi1zdGFibGUtc3RyaW5naWZ5IjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Zhc3QtanNvbi1zdGFibGUtc3RyaW5naWZ5Ly0vZmFzdC1qc29uLXN0YWJsZS1zdHJpbmdpZnktMi4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0xUlFzREs3bXNSaWZoOU9uWVJFR1Q0Ykl1L0k9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZmFzdC1sZXZlbnNodGVpbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC42IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9mYXN0LWxldmVuc2h0ZWluLy0vZmFzdC1sZXZlbnNodGVpbi0yLjAuNi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVBZcGNab2c2RnFNTXFHUStoUjhadXFkNWVSYz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJmaWd1cmVzIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2ZpZ3VyZXMvLS9maWd1cmVzLTIuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtT3JHaTBxWXNpL3RER2d5VXkzbDZMODRueVdJPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImVzY2FwZS1zdHJpbmctcmVnZXhwIjogIl4xLjAuNSIKKyAgICAgIH0KKyAgICB9LAorICAgICJmaWxlLWVudHJ5LWNhY2hlIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2ZpbGUtZW50cnktY2FjaGUvLS9maWxlLWVudHJ5LWNhY2hlLTIuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdzVLWkRENW9SNFBZT0xqSVNrWFlvRWhGZzJFPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImZsYXQtY2FjaGUiOiAiXjEuMi4xIiwKKyAgICAgICAgIm9iamVjdC1hc3NpZ24iOiAiXjQuMC4xIgorICAgICAgfQorICAgIH0sCisgICAgImZpbmFsaGFuZGxlciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9maW5hbGhhbmRsZXIvLS9maW5hbGhhbmRsZXItMS4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS16Z3RvVmJSWVUrZVJzdnpHZ0FSdGlDVTkxL1U9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZGVidWciOiAiMi42LjkiLAorICAgICAgICAiZW5jb2RldXJsIjogIn4xLjAuMSIsCisgICAgICAgICJlc2NhcGUtaHRtbCI6ICJ+MS4wLjMiLAorICAgICAgICAib24tZmluaXNoZWQiOiAifjIuMy4wIiwKKyAgICAgICAgInBhcnNldXJsIjogIn4xLjMuMiIsCisgICAgICAgICJzdGF0dXNlcyI6ICJ+MS4zLjEiLAorICAgICAgICAidW5waXBlIjogIn4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJmbGF0LWNhY2hlIjogeworICAgICAgInZlcnNpb24iOiAiMS4zLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2ZsYXQtY2FjaGUvLS9mbGF0LWNhY2hlLTEuMy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtMHdNTE1yT0JWUFRqdCtuSENmU1E5KytYeElFPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNpcmN1bGFyLWpzb24iOiAiXjAuMy4xIiwKKyAgICAgICAgImRlbCI6ICJeMi4wLjIiLAorICAgICAgICAiZ3JhY2VmdWwtZnMiOiAiXjQuMS4yIiwKKyAgICAgICAgIndyaXRlIjogIl4wLjIuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJmb3ItZWFjaCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMy4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9mb3ItZWFjaC8tL2Zvci1lYWNoLTAuMy4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1qcVlmTHA3bW85dkl5UWY4eWtXMnY3QSsyTjRRamVDZUk1K0R6OVhyYWlPMWlnbjgxd2ppSDdGYjl2U09XdlFmTnRtU2E0SDJSb1FUcnJYaXZkVVptdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaXMtY2FsbGFibGUiOiAiXjEuMS4zIgorICAgICAgfQorICAgIH0sCisgICAgImZzLWNvbnN0YW50cyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9mcy1jb25zdGFudHMvLS9mcy1jb25zdGFudHMtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXk2T0F3b1NJZjdGeWpNSXY5NHUrYjVyZGhlWkVqelI2M0dUeVpKbTVxaDRCaSsyWWd3TENjSS9mUEZaa0w1UFNpeE90NlpOS20rdytIZnAvQmNpd293PT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJmcy5yZWFscGF0aCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9mcy5yZWFscGF0aC8tL2ZzLnJlYWxwYXRoLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtRlFTdEpTTVZqS3BBMjBvbmg4c0JRUm1VNms4PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImZ1bmN0aW9uLWJpbmQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZnVuY3Rpb24tYmluZC8tL2Z1bmN0aW9uLWJpbmQtMS4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXlJb3ZBek1YNDlzRjhZbDU4ZlNDV0o1c3ZTTHVhaWJQeFhRSkZMbUJPYlR1Q3IwTWYxS2lQb3BHTTlOaUZqaVlCQ2JmYWEyRmg2YnJlUTZBTlZUSTBBPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJmdW5jdGlvbmFsLXJlZC1ibGFjay10cmVlIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Z1bmN0aW9uYWwtcmVkLWJsYWNrLXRyZWUvLS9mdW5jdGlvbmFsLXJlZC1ibGFjay10cmVlLTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtR3dxenZWVTdLZzFqbWRLY0RqNmdzbElIZ3ljPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImdhdWdlIjogeworICAgICAgInZlcnNpb24iOiAiMi43LjQiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dhdWdlLy0vZ2F1Z2UtMi43LjQudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1MQU5BWEhVNHc1MStzM3N4Y0NMakpmc0JpL2M9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXByb2JhIjogIl4xLjAuMyIsCisgICAgICAgICJjb25zb2xlLWNvbnRyb2wtc3RyaW5ncyI6ICJeMS4wLjAiLAorICAgICAgICAiaGFzLXVuaWNvZGUiOiAiXjIuMC4wIiwKKyAgICAgICAgIm9iamVjdC1hc3NpZ24iOiAiXjQuMS4wIiwKKyAgICAgICAgInNpZ25hbC1leGl0IjogIl4zLjAuMCIsCisgICAgICAgICJzdHJpbmctd2lkdGgiOiAiXjEuMC4xIiwKKyAgICAgICAgInN0cmlwLWFuc2kiOiAiXjMuMC4xIiwKKyAgICAgICAgIndpZGUtYWxpZ24iOiAiXjEuMS4wIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJhbnNpLXJlZ2V4IjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjIuMS4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYW5zaS1yZWdleC8tL2Fuc2ktcmVnZXgtMi4xLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdzdNNnRlNDJEWWJnNWlqd1Jvcm43eWZXVk44PSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfSwKKyAgICAgICAgImlzLWZ1bGx3aWR0aC1jb2RlLXBvaW50IjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtZnVsbHdpZHRoLWNvZGUtcG9pbnQvLS9pcy1mdWxsd2lkdGgtY29kZS1wb2ludC0xLjAuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS03NTR4T0c4REduOE5aRHI0TDk1UXhGZnZBTXM9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAibnVtYmVyLWlzLW5hbiI6ICJeMS4wLjAiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAic3RyaW5nLXdpZHRoIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3RyaW5nLXdpZHRoLy0vc3RyaW5nLXdpZHRoLTEuMC4yLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLUVZdmZXNHpjVWFLbjV3MGhIZ2Zpc0xteEI5TT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJjb2RlLXBvaW50LWF0IjogIl4xLjAuMCIsCisgICAgICAgICAgICAiaXMtZnVsbHdpZHRoLWNvZGUtcG9pbnQiOiAiXjEuMC4wIiwKKyAgICAgICAgICAgICJzdHJpcC1hbnNpIjogIl4zLjAuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJzdHJpcC1hbnNpIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjMuMC4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zdHJpcC1hbnNpLy0vc3RyaXAtYW5zaS0zLjAuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1hamhmdUlVOWxTMWY4RjBPaXErVUo0M0dQYzg9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiYW5zaS1yZWdleCI6ICJeMi4wLjAiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiZ2V0LXN0ZGluIjogeworICAgICAgInZlcnNpb24iOiAiNi4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dldC1zdGRpbi8tL2dldC1zdGRpbi02LjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItanA0dEhhd3lWNytma2tTS3l2anVMWnN3YmxVdHorU1FLelNXbkJiaWkxNkJ1WmtzSmxVMXd1QllYWTc1citkdWgvbGxGMXVyNm9Od2krMlp6aktaN2c9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImdpdGh1Yi1mcm9tLXBhY2thZ2UiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ2l0aHViLWZyb20tcGFja2FnZS8tL2dpdGh1Yi1mcm9tLXBhY2thZ2UtMC4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1sL3RkbHIvZWlYTXhQeURvS0k3NW9XZjZaTTQ9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZ2xvYiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjcuMS4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9nbG9iLy0vZ2xvYi03LjEuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItdmNmdWlJeG9nTFY0RGxHQkhJVU93STBJYnJKOEhXUGM0TVU3SHp2aUdlTmhvL1VKRGZpNkI1cDNzSGVXSVEwS0dJVTBKcHhpNVpIeGVtUWZMa2tBd1E9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImZzLnJlYWxwYXRoIjogIl4xLjAuMCIsCisgICAgICAgICJpbmZsaWdodCI6ICJeMS4wLjQiLAorICAgICAgICAiaW5oZXJpdHMiOiAiMiIsCisgICAgICAgICJtaW5pbWF0Y2giOiAiXjMuMC40IiwKKyAgICAgICAgIm9uY2UiOiAiXjEuMy4wIiwKKyAgICAgICAgInBhdGgtaXMtYWJzb2x1dGUiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImdsb2JhbHMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxMS44LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dsb2JhbHMvLS9nbG9iYWxzLTExLjguMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItaW82TGt5UFZ1ekNIQlNRVjlmbU93eFprVWs2bklhR214aGVMRGdtdUZ2ODlqMGZtMmFxRGJJWEtBR2Z6Q01IcXozSExGMlpmOFdTRzZWcU1oMnFGbUE9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImdsb2JieSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjUuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9nbG9iYnkvLS9nbG9iYnktNS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS02OWhHWjhvTnV6TUxtYno4YU9yQ3ZGUTNEZzA9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXJyYXktdW5pb24iOiAiXjEuMC4xIiwKKyAgICAgICAgImFycmlmeSI6ICJeMS4wLjAiLAorICAgICAgICAiZ2xvYiI6ICJeNy4wLjMiLAorICAgICAgICAib2JqZWN0LWFzc2lnbiI6ICJeNC4wLjEiLAorICAgICAgICAicGlmeSI6ICJeMi4wLjAiLAorICAgICAgICAicGlua2llLXByb21pc2UiOiAiXjIuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImdyYWNlZnVsLWZzIjogeworICAgICAgInZlcnNpb24iOiAiNC4xLjExIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ncmFjZWZ1bC1mcy8tL2dyYWNlZnVsLWZzLTQuMS4xMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLURvdmY1TkhkdUlWTlpPQk9wOEFPS2dKdVZsZz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJoYW5kbGViYXJzIjogeworICAgICAgInZlcnNpb24iOiAiNC4wLjEyIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9oYW5kbGViYXJzLy0vaGFuZGxlYmFycy00LjAuMTIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVJobVRla1ArRlpMK1hOaHdTMVdmK2JUVFpwZExvdWd3dDVwY2dBMXR1ejZKY3gwZnBILzd6MHFkNzFSS25aSEJDeElSQkhmQk9uaW80Z1ZpUGVtTnpBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhc3luYyI6ICJeMi41LjAiLAorICAgICAgICAib3B0aW1pc3QiOiAiXjAuNi4xIiwKKyAgICAgICAgInNvdXJjZS1tYXAiOiAiXjAuNi4xIiwKKyAgICAgICAgInVnbGlmeS1qcyI6ICJeMy4xLjQiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImFzeW5jIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjIuNi4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXN5bmMvLS9hc3luYy0yLjYuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWZORWlMMitBWnQ2QWxBdy8yOUNyMFVEZTRzUkFIQ3BFSGg1NFdNeitCYjdRZk5jRnc0aDNsb29meUpwTGVRczRZeDd5dXF1LzJkTGdNNWhLT3M2SGxRPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJsb2Rhc2giOiAiXjQuMTcuMTAiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAic291cmNlLW1hcCI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIwLjYuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NvdXJjZS1tYXAvLS9zb3VyY2UtbWFwLTAuNi4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItVWpnYXB1bVdsYk1oa0JnelQ3WWtjNVlYVVQ0NkYwaUt1OFNHWHEwYmN3UDVkei9oMFBsajZlbkpxanoxWmJxMmw1V2FxWW5yVmJ3V09XTXlGM0Y0N2c9PSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImhhcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9oYXMvLS9oYXMtMS4wLjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWYyZHZPMFZVNk9lajdSa1dKR3JlaGpiek1BakZwNS9WS1BwNXRUcFdJVjRKSEhaSzEvQnhiRlJ0Zi9zaUEyU1dUZTA5Y2FEbVZ0WVl6V0VJYkJTNHp3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJmdW5jdGlvbi1iaW5kIjogIl4xLjEuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJoYXMtZmxhZyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9oYXMtZmxhZy8tL2hhcy1mbGFnLTMuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdGRSVTNDR1pyaUpXbWZOR2Zsb0g4N2xWdXYwPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImhhcy1zeW1ib2xzIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2hhcy1zeW1ib2xzLy0vaGFzLXN5bWJvbHMtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS11aHFQR3ZLZy9EbGxEMXlGQTJkd1FTSUdPMFE9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaGFzLXVuaWNvZGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaGFzLXVuaWNvZGUvLS9oYXMtdW5pY29kZS0yLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTRPYithaWpQVVJPSVZlQ0cwV2tlZHgzaXFMaz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJpY29udi1saXRlIjogeworICAgICAgInZlcnNpb24iOiAiMC40LjI0IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pY29udi1saXRlLy0vaWNvbnYtbGl0ZS0wLjQuMjQudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXYzTVhuWkFjdm55d2tUVUVab21JQWN0bGU3UlhYZWVkT1IzMXd3bDdWbHlvWE80UWk5YXJ2U2VuTlFXbmUxVGNSd2hDTDFId0xJMjFiRXFkcGo4L3JBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJzYWZlci1idWZmZXIiOiAiPj0gMi4xLjIgPCAzIgorICAgICAgfQorICAgIH0sCisgICAgImlnbm9yZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjQuMC42IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pZ25vcmUvLS9pZ25vcmUtNC4wLjYudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWN5RkRLcnFjL1lkY1dGbmlKaHpJNDIrQXpTK2dOd21Vek9TRmNSQ1FZd3lTdUJCQnkvS2p1eFdMWi9GSEVINk1vcTFOaXpNT0JXeVRjdjhPNE9aSU1nPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJpbXVybXVyaGFzaCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS40IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pbXVybXVyaGFzaC8tL2ltdXJtdXJoYXNoLTAuMS40LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEta2hpNXNya29vaml4UGNUN2EyMVhieU1VVStvPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImluZmxpZ2h0IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjYiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2luZmxpZ2h0Ly0vaW5mbGlnaHQtMS4wLjYudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1TYjFqTWRmUUxRd0p2SkVLRUhXNmdXVzFiZms9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAib25jZSI6ICJeMS4zLjAiLAorICAgICAgICAid3JhcHB5IjogIjEiCisgICAgICB9CisgICAgfSwKKyAgICAiaW5oZXJpdHMiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaW5oZXJpdHMvLS9pbmhlcml0cy0yLjAuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVl6d3NnK1BhUXFVQzlTUm1BaVNBOUNDQ1lkND0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJpbmkiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjMuNSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaW5pLy0vaW5pLTEuMy41LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1SWlk1aHVJS0NNUldEVXFabEVpNzJmL2xtWEtNdnVzemNNQmR1bGlRM25uV2J4OVgvWkJRTzdEaWpNRVlTOUVoSEJiMnFhY1JVTXRDN3N2THdlMGxjdz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaW5xdWlyZXIiOiB7CisgICAgICAidmVyc2lvbiI6ICI2LjIuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaW5xdWlyZXIvLS9pbnF1aXJlci02LjIuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItUUlFUUc0WXlRMlVZWkdEQzRzck1aN0JqSE9tTmsxbFIySlFqNVVrbkJhcGtsbTZXSEErVlZIN04rc1VkWDNBN05lQ2ZHRjhvNFgxUzNBbzduQWNJZWc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFuc2ktZXNjYXBlcyI6ICJeMy4wLjAiLAorICAgICAgICAiY2hhbGsiOiAiXjIuMC4wIiwKKyAgICAgICAgImNsaS1jdXJzb3IiOiAiXjIuMS4wIiwKKyAgICAgICAgImNsaS13aWR0aCI6ICJeMi4wLjAiLAorICAgICAgICAiZXh0ZXJuYWwtZWRpdG9yIjogIl4zLjAuMCIsCisgICAgICAgICJmaWd1cmVzIjogIl4yLjAuMCIsCisgICAgICAgICJsb2Rhc2giOiAiXjQuMTcuMTAiLAorICAgICAgICAibXV0ZS1zdHJlYW0iOiAiMC4wLjciLAorICAgICAgICAicnVuLWFzeW5jIjogIl4yLjIuMCIsCisgICAgICAgICJyeGpzIjogIl42LjEuMCIsCisgICAgICAgICJzdHJpbmctd2lkdGgiOiAiXjIuMS4wIiwKKyAgICAgICAgInN0cmlwLWFuc2kiOiAiXjQuMC4wIiwKKyAgICAgICAgInRocm91Z2giOiAiXjIuMy42IgorICAgICAgfQorICAgIH0sCisgICAgImlzLWNhbGxhYmxlIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjQiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWNhbGxhYmxlLy0vaXMtY2FsbGFibGUtMS4xLjQudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXI1cDlzeEpqWW5BckxqT2JwakE0eHU1RUtJM0N1S0hrSlhNaFQ3a3dicFV5SUZEMW41UE1Bc29QdldudnRaaU56N0xqa1lEUlpoZDdGbEkwZU1pakVBPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJpcy1kYXRlLW9iamVjdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1kYXRlLW9iamVjdC8tL2lzLWRhdGUtb2JqZWN0LTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbXFJT3RxN3J2L2QvdlRQblRLQWJNMWdkT2hZPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImlzLWZ1bGx3aWR0aC1jb2RlLXBvaW50IjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWZ1bGx3aWR0aC1jb2RlLXBvaW50Ly0vaXMtZnVsbHdpZHRoLWNvZGUtcG9pbnQtMi4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1vN01LWEU4WmtZTVdlcXE1Tys3NjQ5MzdaVTg9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaXMtcGF0aC1jd2QiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtcGF0aC1jd2QvLS9pcy1wYXRoLWN3ZC0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTBpWHNJeE11aWUzVGo5cDJkSExtTG1YeEVHMD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJpcy1wYXRoLWluLWN3ZCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1wYXRoLWluLWN3ZC8tL2lzLXBhdGgtaW4tY3dkLTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1GalYxUlRXNDhFN0NXTTdlRS9KMk5KdkFFRVZla3RlY0RCVkJFNUhoM25NMUpkMGt2aEh0WDY4UHIzeHNEZjg1N3h0M1k0QWt3VlVMSzFWa3U2MmFhUT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaXMtcGF0aC1pbnNpZGUiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImlzLXBhdGgtaW5zaWRlIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLXBhdGgtaW5zaWRlLy0vaXMtcGF0aC1pbnNpZGUtMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1qdlczM2xCRGVqL2NwclRvWmU5NnBWeTBnRFk9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAicGF0aC1pcy1pbnNpZGUiOiAiXjEuMC4xIgorICAgICAgfQorICAgIH0sCisgICAgImlzLXByb21pc2UiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtcHJvbWlzZS8tL2lzLXByb21pc2UtMi4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1lYUtwN09md2x1Z1BOdEt5ODd3V3dmOUw4L289IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaXMtcmVnZXgiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuNCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtcmVnZXgvLS9pcy1yZWdleC0xLjAuNC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVZSZEltMVJ3a2JDVERnbFdWTTdTWHVsK2xKRT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJoYXMiOiAiXjEuMC4xIgorICAgICAgfQorICAgIH0sCisgICAgImlzLXJlc29sdmFibGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtcmVzb2x2YWJsZS8tL2lzLXJlc29sdmFibGUtMS4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXFnRFlYRlNSNVd2RWZ1UzVkTWo2b1RNRWJyclNhTTBDckZrMllpcS9nWG5CdkQ5cE1hMmpHWHh5aEdMZnZoWnB1TVplMThDSnBGeEF0M0NSczQyTk1nPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJpcy1zeW1ib2wiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtc3ltYm9sLy0vaXMtc3ltYm9sLTEuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1IUzhiWjlveDYweUNKTEg5c25CcEl3djlwWVVBa2N1TGhTQTFvZXJvMVVCNXk5YWlRcFJBOHkyZXg5NDVBT3RDWkwxbEpEZUlrM0c1THRoc3dJNDZMdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaGFzLXN5bWJvbHMiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImlzYXJyYXkiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXNhcnJheS8tL2lzYXJyYXktMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS11NU5kU0Znc3VoYU1Cb05KVjZWS1BnY1NUeEU9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaXNleGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXNleGUvLS9pc2V4ZS0yLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTZQdnpkTnhWYi9pVWVoRGNzRmN0WXo4cytoQT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJpc3RhbmJ1bCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuNC41IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pc3RhbmJ1bC8tL2lzdGFuYnVsLTAuNC41LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtWmNmWFBVeE5xRTFQT3NNUXVSajdDNEF6Y3pzPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFiYnJldiI6ICIxLjAueCIsCisgICAgICAgICJhc3luYyI6ICIxLngiLAorICAgICAgICAiZXNjb2RlZ2VuIjogIjEuOC54IiwKKyAgICAgICAgImVzcHJpbWEiOiAiMi43LngiLAorICAgICAgICAiZ2xvYiI6ICJeNS4wLjE1IiwKKyAgICAgICAgImhhbmRsZWJhcnMiOiAiXjQuMC4xIiwKKyAgICAgICAgImpzLXlhbWwiOiAiMy54IiwKKyAgICAgICAgIm1rZGlycCI6ICIwLjUueCIsCisgICAgICAgICJub3B0IjogIjMueCIsCisgICAgICAgICJvbmNlIjogIjEueCIsCisgICAgICAgICJyZXNvbHZlIjogIjEuMS54IiwKKyAgICAgICAgInN1cHBvcnRzLWNvbG9yIjogIl4zLjEuMCIsCisgICAgICAgICJ3aGljaCI6ICJeMS4xLjEiLAorICAgICAgICAid29yZHdyYXAiOiAiXjEuMC4wIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJlc3ByaW1hIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjIuNy4zIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXNwcmltYS8tL2VzcHJpbWEtMi43LjMudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbHVPM0RWZDU5cTFKelFNbWM5SERFblo3cFlFPSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfSwKKyAgICAgICAgImdsb2IiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiNS4wLjE1IiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ2xvYi8tL2dsb2ItNS4wLjE1LnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLUc4azJ1ZUF2U21BL3pDSXV6M1l6MHd1TGs3RT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpbmZsaWdodCI6ICJeMS4wLjQiLAorICAgICAgICAgICAgImluaGVyaXRzIjogIjIiLAorICAgICAgICAgICAgIm1pbmltYXRjaCI6ICIyIHx8IDMiLAorICAgICAgICAgICAgIm9uY2UiOiAiXjEuMy4wIiwKKyAgICAgICAgICAgICJwYXRoLWlzLWFic29sdXRlIjogIl4xLjAuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJoYXMtZmxhZyI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2hhcy1mbGFnLy0vaGFzLWZsYWctMS4wLjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtblo1NU1XWE9BWG9BOEFRWXhEK1VLbnNkRWZvPSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfSwKKyAgICAgICAgInN1cHBvcnRzLWNvbG9yIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjMuMi4zIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3VwcG9ydHMtY29sb3IvLS9zdXBwb3J0cy1jb2xvci0zLjIuMy50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1aYXdGQkxPVlFYSFlwa2xHc3E0OHU0cGZWUFk9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaGFzLWZsYWciOiAiXjEuMC4wIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImpzLXRva2VucyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjQuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9qcy10b2tlbnMvLS9qcy10b2tlbnMtNC4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVJkSlVmbGNFM2NVektpTXFRZ3NDdTA2RlB1OVVkSUpPMGJlWWJQaEhONGs2YXBnSnRpZmNvQ3RUOWJjeE9wWUJ0cEQya0NNNlNiemc0Q2F1c1cvUEtRPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJqcy15YW1sIjogeworICAgICAgInZlcnNpb24iOiAiMy4xMi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9qcy15YW1sLy0vanMteWFtbC0zLjEyLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVBJdDJjbndtUGZMNGhLTndxZWl1ejRiS2ZuekhUQnY2SHlWZ2phaEE2bVBMd1BEempEV3JwbEpCTWpIVUZ4a3UvTjNGbG1yYnlQY2xhZCtJKzRtSjNBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhcmdwYXJzZSI6ICJeMS4wLjciLAorICAgICAgICAiZXNwcmltYSI6ICJeNC4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAianMyeG1scGFyc2VyIjogeworICAgICAgInZlcnNpb24iOiAiMy4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2pzMnhtbHBhcnNlci8tL2pzMnhtbHBhcnNlci0zLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVA3WU9xZ2ljVkVENU1aOVJkZ3pOQitKSmx6TT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJ4bWxjcmVhdGUiOiAiXjEuMC4xIgorICAgICAgfQorICAgIH0sCisgICAgImpzZG9jIjogeworICAgICAgInZlcnNpb24iOiAiMy41LjUiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2pzZG9jLy0vanNkb2MtMy41LjUudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTZQeEI2NVRBVTRXTzBXenlyLzQvWWhsR292WGwwRVZZZnBLYnBTcm9TajBxQnhUNC94b2QvbDQwT3BrbTM4ZFJIUmRRZ2RlWTgzNk0wdVZuSlFHN2tnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJiYWJ5bG9uIjogIjcuMC4wLWJldGEuMTkiLAorICAgICAgICAiYmx1ZWJpcmQiOiAifjMuNS4wIiwKKyAgICAgICAgImNhdGhhcnNpcyI6ICJ+MC44LjkiLAorICAgICAgICAiZXNjYXBlLXN0cmluZy1yZWdleHAiOiAifjEuMC41IiwKKyAgICAgICAgImpzMnhtbHBhcnNlciI6ICJ+My4wLjAiLAorICAgICAgICAia2xhdyI6ICJ+Mi4wLjAiLAorICAgICAgICAibWFya2VkIjogIn4wLjMuNiIsCisgICAgICAgICJta2RpcnAiOiAifjAuNS4xIiwKKyAgICAgICAgInJlcXVpenpsZSI6ICJ+MC4yLjEiLAorICAgICAgICAic3RyaXAtanNvbi1jb21tZW50cyI6ICJ+Mi4wLjEiLAorICAgICAgICAidGFmZnlkYiI6ICIyLjYuMiIsCisgICAgICAgICJ1bmRlcnNjb3JlIjogIn4xLjguMyIKKyAgICAgIH0KKyAgICB9LAorICAgICJqc29uLXNjaGVtYS10cmF2ZXJzZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuNC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9qc29uLXNjaGVtYS10cmF2ZXJzZS8tL2pzb24tc2NoZW1hLXRyYXZlcnNlLTAuNC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi14YmJDSDVkQ1lVNVQ4TGNFaGh1aDdISjg4SFh1VzNxc0kzWTB6T1pGS2ZaRUhjcFdpSFUvSnh6azYyOUJyc2FiL21NaUhRdGk5d01QKzg0NVJQZTNWZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAianNvbi1zdGFibGUtc3RyaW5naWZ5LXdpdGhvdXQtanNvbmlmeSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9qc29uLXN0YWJsZS1zdHJpbmdpZnktd2l0aG91dC1qc29uaWZ5Ly0vanNvbi1zdGFibGUtc3RyaW5naWZ5LXdpdGhvdXQtanNvbmlmeS0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLW5iZTFsSmF0UHp6Kzh3cDFGQzB0a3dyWEpsRT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJrbGF3IjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2tsYXcvLS9rbGF3LTIuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtV2NFbzROeGM1QkFnRVZFWlR1dWN2NFdHVVBZPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImdyYWNlZnVsLWZzIjogIl40LjEuOSIKKyAgICAgIH0KKyAgICB9LAorICAgICJsZXZuIjogeworICAgICAgInZlcnNpb24iOiAiMC4zLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2xldm4vLS9sZXZuLTAuMy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtT3dtU1R0K2ZDRHdFa1AzVXdMeEVJZUJIWk80PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInByZWx1ZGUtbHMiOiAifjEuMS4yIiwKKyAgICAgICAgInR5cGUtY2hlY2siOiAifjAuMy4yIgorICAgICAgfQorICAgIH0sCisgICAgImxvZGFzaCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjQuMTcuMTEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2xvZGFzaC8tL2xvZGFzaC00LjE3LjExLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1jUUtoOGlnbzVRVWhaN2xnMzhEWVdBeE12alNBS0cwQTh3R1NWaW1QMDdTSVVFSzJVTythclNSS2JSWld0ZWxNdE41VjBIa3doNXJ5T3RvL1NzaFlJZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAibWFya2VkIjogeworICAgICAgInZlcnNpb24iOiAiMC4zLjE5IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL21hcmtlZC8tL21hcmtlZC0wLjMuMTkudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWVhMmVHV09xTnhQY1h2OGR5RVJkU3IvNkZtenZXd3pqTXhwZkdCL3NiTWNjWG9jdCt4WStZdWtQRCtRVFVad3l2SzdCWndjcjRtMjFXQk9XNDFwQWtnPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJtaW1pYy1mbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9taW1pYy1mbi8tL21pbWljLWZuLTEuMi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1qZjg0dXh6d2l1aUlWS2lPTHBmWWs3TjQ2VFN5OHViVG9ubW5lWTl2cnBITkFucDBRQnQyQnhXVjlkTzMvaitCb1ZBYithNUc2WURQVzNNNUhPZE1XUT09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAibWltaWMtcmVzcG9uc2UiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbWltaWMtcmVzcG9uc2UvLS9taW1pYy1yZXNwb25zZS0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItajVFY3Rua0g3YW1mVi9xNUhnbW9hbDFnMlFIRkpScmFPdG14MEpwSXFreGhCaEkvbEpTbDFuTXBRNDVoVmFyd05FVE9vV0VpbW5kWjRRSzBSSHh1eFE9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIm1pbmltYXRjaCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMC40IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9taW5pbWF0Y2gvLS9taW5pbWF0Y2gtMy4wLjQudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXlKSFZRRWh5cVBMVVRndDlCODNQWHU2VzNyeDRNdnZIdlNVdlRvb2dwd29HRE9VUSt5RHJSMEhSb3QreU9DZENPN3U0aFgzcFdmdDZrV0JCY3FoMFVBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJicmFjZS1leHBhbnNpb24iOiAiXjEuMS43IgorICAgICAgfQorICAgIH0sCisgICAgIm1pbmltaXN0IjogeworICAgICAgInZlcnNpb24iOiAiMC4wLjgiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbWluaW1pc3QvLS9taW5pbWlzdC0wLjAuOC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWhYL0t2OE01ZlNZbHVDS0NZdWhxcDZBUnNGMD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJta2RpcnAiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjUuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ta2RpcnAvLS9ta2RpcnAtMC41LjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1NQVYwT09yR3ozK01SMmZ6aGtqV2FYMTF5UU09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAibWluaW1pc3QiOiAiMC4wLjgiCisgICAgICB9CisgICAgfSwKKyAgICAibXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbXMvLS9tcy0yLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVZnaXVyZndBdm13cEFkOWZtR0Y0amVEVmw4Zz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJtdXRlLXN0cmVhbSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMC43IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9tdXRlLXN0cmVhbS8tL211dGUtc3RyZWFtLTAuMC43LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTUhYT2s3d2h1UHEwUGh2RTJuNkJGZTBlZTZzPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIm5hbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMTAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9uYW4vLS9uYW4tMi4xMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1iQWRKdjdmQkxoV0MrL0JsczBPemErbXZUYU5RdFArMVJ5aGhodkQ5NXBnVUp6NlhNNUl6Z214T2tJdEo5dGtvQ2lwbHZBblhJMXRObW1VRC9lU2N5QT09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAibmF0dXJhbC1jb21wYXJlIjogeworICAgICAgInZlcnNpb24iOiAiMS40LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL25hdHVyYWwtY29tcGFyZS8tL25hdHVyYWwtY29tcGFyZS0xLjQuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVNyNi83dGRVSHl3bnJQc3B2YnZSWEkxYnBQYz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJuaWNlLXRyeSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC41IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9uaWNlLXRyeS8tL25pY2UtdHJ5LTEuMC41LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi0xbmg0NWRlZWI1b2xOWTdlWDgyQmtQTzdTU3hSNVNTWUppUFRyVGRGVVZZd0FsOENLTUE1TjlQalRZa0hpUmppc1ZjeGNRMUhYZExoeDJxeHhKekxOUT09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAibm9kZS1hYmkiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjQuNSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbm9kZS1hYmkvLS9ub2RlLWFiaS0yLjQuNS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItYWEvVUM2TnIzK3RxaEhHUnNBdXcvZWR6Ny9xOW5uZXRCcktXeGo2cnBUdG0rMFg5VDFxVTdsSUVITVMzeU45SndBYlJpS1ViUlJGeTFQTHoveTNhYUE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInNlbXZlciI6ICJeNS40LjEiCisgICAgICB9CisgICAgfSwKKyAgICAibm9kZS1pbnQ2NCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuNC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ub2RlLWludDY0Ly0vbm9kZS1pbnQ2NC0wLjQuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWg2a0dYTnMxWFRHQzJQbE00UkdJdUNYR2lqcz0iCisgICAgfSwKKyAgICAibm9vcC1sb2dnZXIiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbm9vcC1sb2dnZXIvLS9ub29wLWxvZ2dlci0wLjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWxLS3hZenhQRXhkVk1BZllsbS9RNkVHMnBNST0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJub3B0IjogeworICAgICAgInZlcnNpb24iOiAiMy4wLjYiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL25vcHQvLS9ub3B0LTMuMC42LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEteGtaZHZ3aXJ6VTJ6V1RGL2VheG9wa2F5ai9rPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFiYnJldiI6ICIxIgorICAgICAgfQorICAgIH0sCisgICAgIm5wbWxvZyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjQuMS4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ucG1sb2cvLS9ucG1sb2ctNC4xLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTJ1VXFhenVLbFRhU0kvZEM4QXppY1VjazcrSXJFYU9uTi9lMGpkM1h0dDFLY0dwd3gzMHY1MG1MN29QeXIvaDliTDNFNGFaY2NWd3B3UCs1VzlWamtnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhcmUtd2UtdGhlcmUteWV0IjogIn4xLjEuMiIsCisgICAgICAgICJjb25zb2xlLWNvbnRyb2wtc3RyaW5ncyI6ICJ+MS4xLjAiLAorICAgICAgICAiZ2F1Z2UiOiAifjIuNy4zIiwKKyAgICAgICAgInNldC1ibG9ja2luZyI6ICJ+Mi4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAibnVtYmVyLWlzLW5hbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9udW1iZXItaXMtbmFuLy0vbnVtYmVyLWlzLW5hbi0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUNYdGdLMU5DS2xJc0d2dUhrREdETnBRYUFSMD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJvYmplY3QtYXNzaWduIjogeworICAgICAgInZlcnNpb24iOiAiNC4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL29iamVjdC1hc3NpZ24vLS9vYmplY3QtYXNzaWduLTQuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtSVFtdHg1WlloOC9BWEx2VVFzckl2N3MyQ0dNPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIm9iamVjdC1pbnNwZWN0IjogeworICAgICAgInZlcnNpb24iOiAiMS42LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL29iamVjdC1pbnNwZWN0Ly0vb2JqZWN0LWluc3BlY3QtMS42LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUdKemZCWjZEZ0RBbW51YU0zMTA0alI0czFNeXhyM1kzemZJeU40ejNVZHFONjlvU1JhY05LOFVobm9iRGRDKzdKMkFIQ2pHd3hRdWJOSmZFNzBTWFhRPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJvYmplY3Qta2V5cyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvb2JqZWN0LWtleXMvLS9vYmplY3Qta2V5cy0xLjAuMTIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUZUTXlGVW0yd0JjR0huSDJlWG16N3RDNkl3bHFRWjZtVlorNmRtNnZaNElRSUhqczZGZE5zUUJ1S0dQdVVVVVk2TmZKdzJQc2hDMDhUbjZMekxET2FnPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJvbi1maW5pc2hlZCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMy4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9vbi1maW5pc2hlZC8tL29uLWZpbmlzaGVkLTIuMy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtSVBFelpJR3dnODExTTNtU29XbHhxaTJRYVVjPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImVlLWZpcnN0IjogIjEuMS4xIgorICAgICAgfQorICAgIH0sCisgICAgIm9uY2UiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjQuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvb25jZS8tL29uY2UtMS40LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1XRHNhcDNXV0hVc1JPc0Y5bkZDNjc1M1hhOUU9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAid3JhcHB5IjogIjEiCisgICAgICB9CisgICAgfSwKKyAgICAib25ldGltZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9vbmV0aW1lLy0vb25ldGltZS0yLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUJuUW9Jdy9XZEVPeWVVc2l1NlVvdG9aNVl0UT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJtaW1pYy1mbiI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAib3B0aW1pc3QiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjYuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvb3B0aW1pc3QvLS9vcHRpbWlzdC0wLjYuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTJqNm5Sb2I2SWFHYUVSd3licERyRmFBWlpvWT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJtaW5pbWlzdCI6ICJ+MC4wLjEiLAorICAgICAgICAid29yZHdyYXAiOiAifjAuMC4yIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJ3b3Jkd3JhcCI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIwLjAuMyIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3dvcmR3cmFwLy0vd29yZHdyYXAtMC4wLjMudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbzlYYWJOWEF2QUFJMDNJMHU2OGI3V01Ga1FjPSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgIm9wdGlvbmF0b3IiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjguMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvb3B0aW9uYXRvci8tL29wdGlvbmF0b3ItMC44LjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1Oa3hlUUowL1RXTUIxc0Mwd0Z1NlVCZ0s2MlE9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZGVlcC1pcyI6ICJ+MC4xLjMiLAorICAgICAgICAiZmFzdC1sZXZlbnNodGVpbiI6ICJ+Mi4wLjQiLAorICAgICAgICAibGV2biI6ICJ+MC4zLjAiLAorICAgICAgICAicHJlbHVkZS1scyI6ICJ+MS4xLjIiLAorICAgICAgICAidHlwZS1jaGVjayI6ICJ+MC4zLjIiLAorICAgICAgICAid29yZHdyYXAiOiAifjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgIm9zLWhvbWVkaXIiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvb3MtaG9tZWRpci8tL29zLWhvbWVkaXItMS4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0vN3hKaUROdURvTTk0TUZveCs4VklTR3FmN009IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAib3MtdG1wZGlyIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL29zLXRtcGRpci8tL29zLXRtcGRpci0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXUrWjBCc2VhcUZ4Yy9zZG0vbGMwVlYzNkVuUT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJwYXJzZXVybCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMy4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wYXJzZXVybC8tL3BhcnNldXJsLTEuMy4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtL0NpZFR0aVpNUmxHREJWaVV5WXMzSTNtVy9NPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInBhdGgtaXMtYWJzb2x1dGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGF0aC1pcy1hYnNvbHV0ZS8tL3BhdGgtaXMtYWJzb2x1dGUtMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1GMHVTYUhOVk5QKzhlczVyOVRwYW5odGNYMTg9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicGF0aC1pcy1pbnNpZGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGF0aC1pcy1pbnNpZGUvLS9wYXRoLWlzLWluc2lkZS0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLU5sUVgzdDVFUXcwY0VhOWhBbitzOEhTOS9GTT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJwYXRoLWtleSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wYXRoLWtleS8tL3BhdGgta2V5LTIuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtUVJ5dHRYVEZvVURUcExHUkRVRFlETW4wQzBBPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInBhdGgtcGFyc2UiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuNiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGF0aC1wYXJzZS8tL3BhdGgtcGFyc2UtMS4wLjYudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUdTbU9UMkViSHJJTkJmOVNSN0NERUx3bEo4QUVOazNRbjdPaWtLNG5GWUF1M090ZTIrSllOVnZrcEFFUW0zL1RMTkVKRkQveFpKanp5eGczS0JXT3p3PT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJwaWZ5IjogeworICAgICAgInZlcnNpb24iOiAiMi4zLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGlmeS8tL3BpZnktMi4zLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS03UlFhYXNCRHFFbnFXSVNZNTl5b3NWTXc2UXc9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicGlua2llIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjQiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3BpbmtpZS8tL3BpbmtpZS0yLjAuNC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWNsVnJnTStnMUlxWFRvRG5ja2pvRHRUMytIQT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJwaW5raWUtcHJvbWlzZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9waW5raWUtcHJvbWlzZS8tL3BpbmtpZS1wcm9taXNlLTIuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtSVRYVzM2ZWpXTUJwckpzWGgzWW9naWhGRC9vPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInBpbmtpZSI6ICJeMi4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAicGx1cmFsaXplIjogeworICAgICAgInZlcnNpb24iOiAiNy4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3BsdXJhbGl6ZS8tL3BsdXJhbGl6ZS03LjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItQVJoQk9kelMzZTQxRmJrVy9YV3JURXR1a3FxTG9LNStaLzRVZURhTHVTVyszOUpQZUZnczRnQ0dxc3JKSFZaWDBmVXJ4Ly80T0YwSzFDVUd3bElGb3c9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInByZWJ1aWxkLWluc3RhbGwiOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcHJlYnVpbGQtaW5zdGFsbC8tL3ByZWJ1aWxkLWluc3RhbGwtNC4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTd0YXl4ZVlib0pYMFJiVnpkbkt5R2wydmhRUldyNnFmQ2xFWERoT2tYanVhT0tDdzJxOGFpdUZoT05SWVZzRy9jemlhN0tocHlrSWxJMlMyVmFQdW5BPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJkZXRlY3QtbGliYyI6ICJeMS4wLjMiLAorICAgICAgICAiZXhwYW5kLXRlbXBsYXRlIjogIl4xLjAuMiIsCisgICAgICAgICJnaXRodWItZnJvbS1wYWNrYWdlIjogIjAuMC4wIiwKKyAgICAgICAgIm1pbmltaXN0IjogIl4xLjIuMCIsCisgICAgICAgICJta2RpcnAiOiAiXjAuNS4xIiwKKyAgICAgICAgIm5vZGUtYWJpIjogIl4yLjIuMCIsCisgICAgICAgICJub29wLWxvZ2dlciI6ICJeMC4xLjEiLAorICAgICAgICAibnBtbG9nIjogIl40LjAuMSIsCisgICAgICAgICJvcy1ob21lZGlyIjogIl4xLjAuMSIsCisgICAgICAgICJwdW1wIjogIl4yLjAuMSIsCisgICAgICAgICJyYyI6ICJeMS4xLjYiLAorICAgICAgICAic2ltcGxlLWdldCI6ICJeMi43LjAiLAorICAgICAgICAidGFyLWZzIjogIl4xLjEzLjAiLAorICAgICAgICAidHVubmVsLWFnZW50IjogIl4wLjYuMCIsCisgICAgICAgICJ3aGljaC1wbS1ydW5zIjogIl4xLjAuMCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAibWluaW1pc3QiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4yLjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL21pbmltaXN0Ly0vbWluaW1pc3QtMS4yLjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbzFBSXNnOUJPRDdzSDdrVTlNMWQ5NW9tUW9RPSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgInByZWx1ZGUtbHMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcHJlbHVkZS1scy8tL3ByZWx1ZGUtbHMtMS4xLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1JWk1xVko5ZVV2L1pxQ2YxY09CTDVpcVgybFE9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicHJldHRpZXIiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjE0LjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3ByZXR0aWVyLy0vcHJldHRpZXItMS4xNC4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1xWkRWbkNybnBzUkpKcTVuU3NpSENFM0JZTUVEMk90c0krY216SXpGMVFJZnFtNUFMZjh0RUpjTzI3elYxZ0tOS1JQZGhqTzBkTlducnpzc0RRMXRGZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicHJldHRpZXItbGludGVyLWhlbHBlcnMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcHJldHRpZXItbGludGVyLWhlbHBlcnMvLS9wcmV0dGllci1saW50ZXItaGVscGVycy0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItR2JLMmNQOW5yYVNTVUY5TjJYd1V3cWZ6bEFGbE1OWVlsK1NoRS9WK0g4YTl1Tmwvb1VxQjF3MkVMNTRKaDBPbHlSU2Q4UmZXWUozY29WUzRUUk9QMnc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImZhc3QtZGlmZiI6ICJeMS4xLjIiCisgICAgICB9CisgICAgfSwKKyAgICAicHJvY2Vzcy1uZXh0aWNrLWFyZ3MiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcHJvY2Vzcy1uZXh0aWNrLWFyZ3MvLS9wcm9jZXNzLW5leHRpY2stYXJncy0yLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItTXRFQzFUcU4wRVU1bmVwaGFKNHJBdFRoSHRDODZkTk45cUN1RWh0c2h2cFZCa0FXNVpPN0JBU045UkVuRjllb1hHY1J1YitwRnVLRXBPSEUrSGJFTXc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInByb2dyZXNzIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3Byb2dyZXNzLy0vcHJvZ3Jlc3MtMi4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLU9FK2E2dnpxYXpjK0s2THhKclg1VVB5S0Z2R25MNUNZbXEyakZHTklCV0hwYzRReUU0OS9ZT3VtY3JwUUZKcGZlam12UnRiSnpnTzF6UG1NQ3FsYkJnPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJwdW1wIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3B1bXAvLS9wdW1wLTIuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1ydVBNTlJrTjNNSFAxY1dKYzlPV3IrVC94RFAwamhYWUNMZkpjQnVYNTRoaGZJQm5hUW1BVU1mRGNHNERNNVVNV0J5QmJKWTY5UVNwaG0zanRES0lrQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZW5kLW9mLXN0cmVhbSI6ICJeMS4xLjAiLAorICAgICAgICAib25jZSI6ICJeMS4zLjEiCisgICAgICB9CisgICAgfSwKKyAgICAicHVueWNvZGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcHVueWNvZGUvLS9wdW55Y29kZS0yLjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItWFJzUmpkZitqNW1sK3kvNkdLSFBaYnJGLzhwMllnYTBKUHRkcVRJWTJYZTVvaEpQRDlzYURKSkxQdnA5K05TQnByVnZldmRYWnlibmoyY3Y4T0VkMEE9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInEiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjUuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcS8tL3EtMS41LjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1makwzVzBFNEVwSFFSaEh4dnhRUW1zQUdVZGM9IgorICAgIH0sCisgICAgInJjIjogeworICAgICAgInZlcnNpb24iOiAiMS4yLjgiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3JjLy0vcmMtMS4yLjgudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXkzYkdncUtqM1FCZHhMYkxrb21sb2hrdnNBOGdkQWlVUWxTQkpuQmhmbitCUHhnNGJjNjJkOFRjQlcxNXdhdkRmZ2V4Q2djY2NraGNadnl3eVFZUE93PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJkZWVwLWV4dGVuZCI6ICJeMC42LjAiLAorICAgICAgICAiaW5pIjogIn4xLjMuMCIsCisgICAgICAgICJtaW5pbWlzdCI6ICJeMS4yLjAiLAorICAgICAgICAic3RyaXAtanNvbi1jb21tZW50cyI6ICJ+Mi4wLjEiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgIm1pbmltaXN0IjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMi4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9taW5pbWlzdC8tL21pbmltaXN0LTEuMi4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLW8xQUlzZzlCT0Q3c0g3a1U5TTFkOTVvbVFvUT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJyZWFkYWJsZS1zdHJlYW0iOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjMuNiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yZWFkYWJsZS1zdHJlYW0vLS9yZWFkYWJsZS1zdHJlYW0tMi4zLjYudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXRRdEtBOVdJQWhCRjMrVkxBc2V5TXFaZUJqVzBBSEpveE90WXFTVVpOSnhhdUVybUxiVm0yRlcxeStKL1lBOWRVckFDMzlJVGVqbFpXaFZJd2F3a0t3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJjb3JlLXV0aWwtaXMiOiAifjEuMC4wIiwKKyAgICAgICAgImluaGVyaXRzIjogIn4yLjAuMyIsCisgICAgICAgICJpc2FycmF5IjogIn4xLjAuMCIsCisgICAgICAgICJwcm9jZXNzLW5leHRpY2stYXJncyI6ICJ+Mi4wLjAiLAorICAgICAgICAic2FmZS1idWZmZXIiOiAifjUuMS4xIiwKKyAgICAgICAgInN0cmluZ19kZWNvZGVyIjogIn4xLjEuMSIsCisgICAgICAgICJ1dGlsLWRlcHJlY2F0ZSI6ICJ+MS4wLjEiCisgICAgICB9CisgICAgfSwKKyAgICAicmVnZXhwcCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yZWdleHBwLy0vcmVnZXhwcC0yLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItbHYwTTYrVGtEVm5pQTNhRDFFZzBEVnBmVS9ib29TdTdFZXYzVERPL21aS0hCZlZqZ0NHVFY0dDRidXBwRVNFWUR0a0FyWUZPeFRKV3Y2UzVDK2lhTnc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInJlcXVpcmUtdW5jYWNoZWQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVxdWlyZS11bmNhY2hlZC8tL3JlcXVpcmUtdW5jYWNoZWQtMS4wLjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1UZzFXMXNsbUw5TWVRd0VjUzVXcVNaVlVJZE09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY2FsbGVyLXBhdGgiOiAiXjAuMS4wIiwKKyAgICAgICAgInJlc29sdmUtZnJvbSI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAicmVxdWl6emxlIjogeworICAgICAgInZlcnNpb24iOiAiMC4yLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3JlcXVpenpsZS8tL3JlcXVpenpsZS0wLjIuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWFVUERVd3hObW41RzhjM2RVY0ZZL0djTTI5ND0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJ1bmRlcnNjb3JlIjogIn4xLjYuMCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAidW5kZXJzY29yZSI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjYuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3VuZGVyc2NvcmUvLS91bmRlcnNjb3JlLTEuNi4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLWl6aXhES3plOWpNM3VMSk9UL2h0UmE2bEthZz0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJyZXNvbHZlIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjciLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3Jlc29sdmUvLS9yZXNvbHZlLTEuMS43LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtSURFVTJDclN4ZTJlamdRUnM1TW9kZWlKNlhzPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInJlc29sdmUtZnJvbSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yZXNvbHZlLWZyb20vLS9yZXNvbHZlLWZyb20tMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1Kc3YrazEwYTd1cTdLYncvNWE2d0hwUFVRaVk9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicmVzdG9yZS1jdXJzb3IiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVzdG9yZS1jdXJzb3IvLS9yZXN0b3JlLWN1cnNvci0yLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLW4zN2loL2d2MHliVS9SWXBJOVloS2U3ZzM2OD0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJvbmV0aW1lIjogIl4yLjAuMCIsCisgICAgICAgICJzaWduYWwtZXhpdCI6ICJeMy4wLjIiCisgICAgICB9CisgICAgfSwKKyAgICAicmVzdW1lciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yZXN1bWVyLy0vcmVzdW1lci0wLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLThlajBZZVFHUzZPZWdxODgzQ3FNaVQwSFoxaz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJ0aHJvdWdoIjogIn4yLjMuNCIKKyAgICAgIH0KKyAgICB9LAorICAgICJyaW1yYWYiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjYuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmltcmFmLy0vcmltcmFmLTIuNi4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1scmVld0xLL0JsZ2hteHRmSDM2WVlWZzFpOElBY2U0VEk3b2FvNzVJMWcyNDUrNkJjdHFUVlFpQlAzWVVKOUM2RFFPWEpta1lSOVg5ZkNMdENPSmM1dz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZ2xvYiI6ICJeNy4wLjUiCisgICAgICB9CisgICAgfSwKKyAgICAicnVuLWFzeW5jIjogeworICAgICAgInZlcnNpb24iOiAiMi4zLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3J1bi1hc3luYy8tL3J1bi1hc3luYy0yLjMuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUEzR3JTdUM5MXlEVUZtMTkvYVpQOTZSRnBzQT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJpcy1wcm9taXNlIjogIl4yLjEuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJyeGpzIjogeworICAgICAgInZlcnNpb24iOiAiNi4zLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3J4anMvLS9yeGpzLTYuMy4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1KVFdtb1k5dFdDczd6dklrL0N2UmpoakdhT2QrT1ZCTTk4N214Rm8rT1c2NmNHcGRLalpjcG1jNzRFUzFzQi8vN0tsL1BBZTgrd0Vha3VoRzRwY2dPdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAidHNsaWIiOiAiXjEuOS4wIgorICAgICAgfQorICAgIH0sCisgICAgInNhZmUtYnVmZmVyIjogeworICAgICAgInZlcnNpb24iOiAiNS4xLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NhZmUtYnVmZmVyLy0vc2FmZS1idWZmZXItNS4xLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUdkMlVaQkpEa1hsWTdHYkp4ZnNFOC9udktrVUVVMUczOGMxc2lONlFQNmE5UFQ5TW1IQjhHbnBzY1NtTUpTb0Y4TE9JcnQ4dWQvd1B0b2p5czRHNitnPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJzYWZlci1idWZmZXIiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjEuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc2FmZXItYnVmZmVyLy0vc2FmZXItYnVmZmVyLTIuMS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1ZWm8zSzgyU0Q3Uml5aTBFMUVRUG9qTHo3a3BlcG5TUUk5SXlQYkhIZzFYWFhldmI1ZEpJN3RweU4yQUR4R2NRYkhHN3ZjeVJIazBjYndxY1FyaVV0Zz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAic2VtdmVyIjogeworICAgICAgInZlcnNpb24iOiAiNS42LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NlbXZlci8tL3NlbXZlci01LjYuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItUlM5UjZSMzVOWWdRbisrZmtEV2FPbXFHb2o0RWs5Z0dzK0RQeE5VWkt1d0UxODN4akpyb0t2eW8xSXpWRmVYdlVydm1BTHk2RldENXhyZEpUMjVnTWc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInNldC1ibG9ja2luZyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zZXQtYmxvY2tpbmcvLS9zZXQtYmxvY2tpbmctMi4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1CRitYZ3RBUnJwcG9BOTNUZ3JKRGtyUFlrUGM9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAic2hlYmFuZy1jb21tYW5kIjogeworICAgICAgInZlcnNpb24iOiAiMS4yLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NoZWJhbmctY29tbWFuZC8tL3NoZWJhbmctY29tbWFuZC0xLjIuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVJLckdXMmxiQXptSmFNT2ZOai91WGVyOThlbz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJzaGViYW5nLXJlZ2V4IjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJzaGViYW5nLXJlZ2V4IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NoZWJhbmctcmVnZXgvLS9zaGViYW5nLXJlZ2V4LTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtMmtMMGwwREF0QzJ5eXBjb1Z4eXhrTW1PL3FNPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInNpZ25hbC1leGl0IjogeworICAgICAgInZlcnNpb24iOiAiMy4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NpZ25hbC1leGl0Ly0vc2lnbmFsLWV4aXQtMy4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS10ZjNBanhLSDZoRjRZbzVCWGlVVEszTmtiRzA9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAic2ltcGxlLWNvbmNhdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zaW1wbGUtY29uY2F0Ly0vc2ltcGxlLWNvbmNhdC0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWMwVEx1TGJpYjdKOVpyTDhodm4yMVpsMUljWT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJzaW1wbGUtZ2V0IjogeworICAgICAgInZlcnNpb24iOiAiMi44LjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NpbXBsZS1nZXQvLS9zaW1wbGUtZ2V0LTIuOC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1sU1NIUlN3M21RTlVHUEFZUnFvN3h5OWRoS214RlhJakxqcDRLSHBmOTlHRUgyVkg3QzNBTStRZng2ZHU2amhmVWk2Vm03WG5iRVZFZjdXYjZOOGpSdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZGVjb21wcmVzcy1yZXNwb25zZSI6ICJeMy4zLjAiLAorICAgICAgICAib25jZSI6ICJeMS4zLjEiLAorICAgICAgICAic2ltcGxlLWNvbmNhdCI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAic2xpY2UtYW5zaSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zbGljZS1hbnNpLy0vc2xpY2UtYW5zaS0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItUE9xeEJLNkxiM3E2czA0N0QvWHNEVk5QbkY5RGw4SlNhcWU5aDlsVVJsME9kTnF5L3VqRHJPaUlIdHNxWE1HYldXVElvbVJ6QU1hVHlhd0FVLy9SZWc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImlzLWZ1bGx3aWR0aC1jb2RlLXBvaW50IjogIl4yLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJzb3VyY2UtbWFwIjogeworICAgICAgInZlcnNpb24iOiAiMC4yLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NvdXJjZS1tYXAvLS9zb3VyY2UtbWFwLTAuMi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtMnJjL3ZQd3JxQm0wM2dPOWIyNnFTQlpMUDUwPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhbWRlZmluZSI6ICI+PTAuMC40IgorICAgICAgfQorICAgIH0sCisgICAgInNwcmludGYtanMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3ByaW50Zi1qcy8tL3NwcmludGYtanMtMS4wLjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1CT2FTYjJZb2xUVlBQZEFWSURZenVGY3BmaXc9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAic3RhdHVzZXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjMuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3RhdHVzZXMvLS9zdGF0dXNlcy0xLjMuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLSt2VWJucmRLcnZPenJQU3RYMkdyOGt5M3VUND0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJzdHJpbmctd2lkdGgiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3RyaW5nLXdpZHRoLy0vc3RyaW5nLXdpZHRoLTIuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1uT3FINTlkZUNxOVNSSGx4cTFBdzg1Sm50NHc2S3ZMS3FXVmlrNm9BOVprbFhMTklPbHFnNEYyeXJUMU1WYVRqQXF2VndkZmVaN3c3YUN2SkQ3dWdrdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaXMtZnVsbHdpZHRoLWNvZGUtcG9pbnQiOiAiXjIuMC4wIiwKKyAgICAgICAgInN0cmlwLWFuc2kiOiAiXjQuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInN0cmluZy5wcm90b3R5cGUudHJpbSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zdHJpbmcucHJvdG90eXBlLnRyaW0vLS9zdHJpbmcucHJvdG90eXBlLnRyaW0tMS4xLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0wRTNpeUo0VGYwMTlJRzhJYTE3Uyt1YStqT289IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZGVmaW5lLXByb3BlcnRpZXMiOiAiXjEuMS4yIiwKKyAgICAgICAgImVzLWFic3RyYWN0IjogIl4xLjUuMCIsCisgICAgICAgICJmdW5jdGlvbi1iaW5kIjogIl4xLjAuMiIKKyAgICAgIH0KKyAgICB9LAorICAgICJzdHJpbmdfZGVjb2RlciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zdHJpbmdfZGVjb2Rlci8tL3N0cmluZ19kZWNvZGVyLTEuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1uL1NobnZEaTZGSGJiVmZ2aXJvK1dvamlGenYrczhNUE1IQmN6VmVQZlVwREpMd29MVDBodDFsNFl3QkNiaThwSkF2ZUVFZG5rSHlQeVRQL216UmZ3Zz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAic2FmZS1idWZmZXIiOiAifjUuMS4wIgorICAgICAgfQorICAgIH0sCisgICAgInN0cmlwLWFuc2kiOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3RyaXAtYW5zaS8tL3N0cmlwLWFuc2ktNC4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1xRWVRSXVzYXcyaW9jVGliWTFKaXhRWHVObzg9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYW5zaS1yZWdleCI6ICJeMy4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAic3RyaXAtanNvbi1jb21tZW50cyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zdHJpcC1qc29uLWNvbW1lbnRzLy0vc3RyaXAtanNvbi1jb21tZW50cy0yLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVBGTVpRdWtJd21sOERzTkVoWXdvYkh5Z3Bnbz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJzdXBwb3J0cy1jb2xvciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjUuNS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zdXBwb3J0cy1jb2xvci8tL3N1cHBvcnRzLWNvbG9yLTUuNS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1RalZqd2RYSXQ0MDhNSWlBcUNYNG9VS3NnVTJFcUFHenMyUHBrbTRhUVliam0rWkVXRWNXNFNmRk5UcjR1TU5abWEwZXk0ZjVsZ0xya0IwYVgwUU1vdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaGFzLWZsYWciOiAiXjMuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInRhYmxlIjogeworICAgICAgInZlcnNpb24iOiAiNS4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3RhYmxlLy0vdGFibGUtNS4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWU1NDJpbjIyWkxoRC9mT0l1WHMvOHlEWjlXNjFsdEY4ZGFNODhya1JOdGdUSWN0K3ZJMmZUbkF5dS9EYjJUQ2ZFY0k4aTdtalp6Nm1lTHEwblc3VFlnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhanYiOiAiXjYuNS4zIiwKKyAgICAgICAgImxvZGFzaCI6ICJeNC4xNy4xMCIsCisgICAgICAgICJzbGljZS1hbnNpIjogIjEuMC4wIiwKKyAgICAgICAgInN0cmluZy13aWR0aCI6ICJeMi4xLjEiCisgICAgICB9CisgICAgfSwKKyAgICAidGFmZnlkYiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuNi4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90YWZmeWRiLy0vdGFmZnlkYi0yLjYuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWZMeTJTMW9VRzJvdS9DeGRMR2UwNFZDeW9tZz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ0YXBlIjogeworICAgICAgInZlcnNpb24iOiAiNC45LjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3RhcGUvLS90YXBlLTQuOS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi02ZktJWGtuTHBvZS9KcDRyekhLRlBwSlVIREhEcW44anVzOTlJZlBuSElqeXo3OEhZbGVmVEdEM2I1RWtiUXp1TGZhRXZtZlBLM0lvbExncTJ4VDNrdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZGVlcC1lcXVhbCI6ICJ+MS4wLjEiLAorICAgICAgICAiZGVmaW5lZCI6ICJ+MS4wLjAiLAorICAgICAgICAiZm9yLWVhY2giOiAifjAuMy4zIiwKKyAgICAgICAgImZ1bmN0aW9uLWJpbmQiOiAifjEuMS4xIiwKKyAgICAgICAgImdsb2IiOiAifjcuMS4yIiwKKyAgICAgICAgImhhcyI6ICJ+MS4wLjMiLAorICAgICAgICAiaW5oZXJpdHMiOiAifjIuMC4zIiwKKyAgICAgICAgIm1pbmltaXN0IjogIn4xLjIuMCIsCisgICAgICAgICJvYmplY3QtaW5zcGVjdCI6ICJ+MS42LjAiLAorICAgICAgICAicmVzb2x2ZSI6ICJ+MS43LjEiLAorICAgICAgICAicmVzdW1lciI6ICJ+MC4wLjAiLAorICAgICAgICAic3RyaW5nLnByb3RvdHlwZS50cmltIjogIn4xLjEuMiIsCisgICAgICAgICJ0aHJvdWdoIjogIn4yLjMuOCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAibWluaW1pc3QiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4yLjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL21pbmltaXN0Ly0vbWluaW1pc3QtMS4yLjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbzFBSXNnOUJPRDdzSDdrVTlNMWQ5NW9tUW9RPSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfSwKKyAgICAgICAgInJlc29sdmUiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS43LjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yZXNvbHZlLy0vcmVzb2x2ZS0xLjcuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWM3cndMb2ZwOGcxVStoMUtOeUhML2ppY3JLZzFFazRxK0xyMzNBTDY1dVpUaW5VWkhlMzBENUhseU41VjlOVzBKWDFENWRYUTRqcVc1bDdTeS9rR2Z3PT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJwYXRoLXBhcnNlIjogIl4xLjAuNSIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJ0YXItZnMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjE2LjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3Rhci1mcy8tL3Rhci1mcy0xLjE2LjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLU52Q2VYcFl4N09zbU9oOHpJT1AvZWJHNTV6Wm14TEUwZXRmV1JiV29rK3EyUW84eC92T1IvSUpUMXRhQURYUGUranNpdTlheERiM1g0QitpSWdObEt3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJjaG93bnIiOiAiXjEuMC4xIiwKKyAgICAgICAgIm1rZGlycCI6ICJeMC41LjEiLAorICAgICAgICAicHVtcCI6ICJeMS4wLjAiLAorICAgICAgICAidGFyLXN0cmVhbSI6ICJeMS4xLjIiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgInB1bXAiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4wLjMiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wdW1wLy0vcHVtcC0xLjAuMy50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLThrMEp1cFdtZTU1Kzl0Q1ZFK0ZTNVVMVDNLNkFiZ3FyR2E1OGxUVDQ5UnB5Znd3Y0dlZEhxYUM1TGxRTmRFQXVtbi93RnN1NmFQd2t1UE1pb3k4a3F3PT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJlbmQtb2Ytc3RyZWFtIjogIl4xLjEuMCIsCisgICAgICAgICAgICAib25jZSI6ICJeMS4zLjEiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAidGFyLXN0cmVhbSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuNi4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90YXItc3RyZWFtLy0vdGFyLXN0cmVhbS0xLjYuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItcnpTMGhlaU5mOFhuNy9tcGRTVlZTTUFXQW95OWJmYjFXT1RZQzc4WjBVUUtlS2EvQ1dTOEZPcTBsS0dOYThEV0tBbjlneGpDdk1MWWM1UEdYWWxLMkE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImJsIjogIl4xLjAuMCIsCisgICAgICAgICJidWZmZXItYWxsb2MiOiAiXjEuMi4wIiwKKyAgICAgICAgImVuZC1vZi1zdHJlYW0iOiAiXjEuMC4wIiwKKyAgICAgICAgImZzLWNvbnN0YW50cyI6ICJeMS4wLjAiLAorICAgICAgICAicmVhZGFibGUtc3RyZWFtIjogIl4yLjMuMCIsCisgICAgICAgICJ0by1idWZmZXIiOiAiXjEuMS4xIiwKKyAgICAgICAgInh0ZW5kIjogIl40LjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJ0ZXh0LXRhYmxlIjogeworICAgICAgInZlcnNpb24iOiAiMC4yLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3RleHQtdGFibGUvLS90ZXh0LXRhYmxlLTAuMi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtZjE3b0k2NkFVZ2ZBQ3ZMZlNvVHNQOCtsY0xRPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInRocm91Z2giOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjMuOCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90aHJvdWdoLy0vdGhyb3VnaC0yLjMuOC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLURkVEovNnE4TlhsZ3NiY2tFVjErRG9haTRmVT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ0bXAiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjAuMzMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3RtcC8tL3RtcC0wLjAuMzMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWpSQ0psb2pLblozYWRkdFRPamRJcW9SdVBFS0J2TlhjR1lxek82eldaWDhLZktFcG5HWTVqZmdnSlEzRWpLdXU4RDRiSlJyMHkrY1lKRm1ZYkltWEd3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJvcy10bXBkaXIiOiAifjEuMC4yIgorICAgICAgfQorICAgIH0sCisgICAgInRvLWJ1ZmZlciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90by1idWZmZXIvLS90by1idWZmZXItMS4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWx4OUI1aXY3bXN1RllFM2R5dFQrS0U1dGFwK3JOWXcrSzRqVmtiOVIvYXNBYitwYkJTTTE3anR1bkhwbGhCZTZSUkpkWngzUG4ySnBoMjRPMzJtT1ZnPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ0c2xpYiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuOS4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90c2xpYi8tL3RzbGliLTEuOS4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi00a3JGOHNjcGVqaGFPZ3F6QkVjR003eURJRWZpMC84Kzh6RFJaaE5aWjJram1ISjRodjN6Q2JRV3hvSkd6MWl3NVUwSmwwbm1hMTN4ekhYY25jTWF2UT09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAidHVubmVsLWFnZW50IjogeworICAgICAgInZlcnNpb24iOiAiMC42LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3R1bm5lbC1hZ2VudC8tL3R1bm5lbC1hZ2VudC0wLjYuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUo2WGVvR3Myc0VvS21XWjNTeWtJYVBEOFFQMD0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJzYWZlLWJ1ZmZlciI6ICJeNS4wLjEiCisgICAgICB9CisgICAgfSwKKyAgICAidHlwZS1jaGVjayI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMy4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90eXBlLWNoZWNrLy0vdHlwZS1jaGVjay0wLjMuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVdJVEt0UkxQSFRWZVA3ZUU4d2dFc3JVZzIzST0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJwcmVsdWRlLWxzIjogIn4xLjEuMiIKKyAgICAgIH0KKyAgICB9LAorICAgICJ0eXBlc2NyaXB0IjogeworICAgICAgInZlcnNpb24iOiAiMy4xLjYiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3R5cGVzY3JpcHQvLS90eXBlc2NyaXB0LTMuMS42LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi10RE1ZZlZ0dnBiOTZtc1MxbERYOU1FZEhyVzR5T3VaNEtkYzRIaW05b1U3OTZYbGRQWUYvdDIrdUtvWDBCQmEwaFhYd0RscVlRYlhZNVJ6anpjNWhCQT09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAidWdsaWZ5LWpzIjogeworICAgICAgInZlcnNpb24iOiAiMy40LjkiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3VnbGlmeS1qcy8tL3VnbGlmeS1qcy0zLjQuOS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItOENKc2JLT3RFYm5Kc1R5djZMRTZtNlpLbmlxTWlGV21tOXNSYm9wYmtHczNnTVBQZmQzRmg4aUlBNFlrdjVNZ2FUYnFIcjRCYW9HTEpMWk5oc3JXMVE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJjb21tYW5kZXIiOiAifjIuMTcuMSIsCisgICAgICAgICJzb3VyY2UtbWFwIjogIn4wLjYuMSIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiY29tbWFuZGVyIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjIuMTcuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NvbW1hbmRlci8tL2NvbW1hbmRlci0yLjE3LjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi13UE1VdDZGbkgyeXpHOTVTQTZtempRT0VLVVUzYUxhREVtenMxdGkrMUU5aCtDc3JaZ2hSbHFFTS9FSjRLc2NzUVZHOHVOTjR1VnJlVWVUOCtkcmxnZz09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAib3B0aW9uYWwiOiB0cnVlCisgICAgICAgIH0sCisgICAgICAgICJzb3VyY2UtbWFwIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjAuNi4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc291cmNlLW1hcC8tL3NvdXJjZS1tYXAtMC42LjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1VamdhcHVtV2xiTWhrQmd6VDdZa2M1WVhVVDQ2RjBpS3U4U0dYcTBiY3dQNWR6L2gwUGxqNmVuSnFqejFaYnEybDVXYXFZbnJWYndXT1dNeUYzRjQ3Zz09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAib3B0aW9uYWwiOiB0cnVlCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJ1bmRlcnNjb3JlIjogeworICAgICAgInZlcnNpb24iOiAiMS44LjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3VuZGVyc2NvcmUvLS91bmRlcnNjb3JlLTEuOC4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtVHorMU94QnVZSmY4K2N0QkNmS2w2YjM2VUNJPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInVuZGVyc2NvcmUtY29udHJpYiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMy4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy91bmRlcnNjb3JlLWNvbnRyaWIvLS91bmRlcnNjb3JlLWNvbnRyaWItMC4zLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1abHRtd2tlRCtQb3JHTW40eTdEaXg5U01Kc2M9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAidW5kZXJzY29yZSI6ICIxLjYuMCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAidW5kZXJzY29yZSI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjYuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3VuZGVyc2NvcmUvLS91bmRlcnNjb3JlLTEuNi4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLWl6aXhES3plOWpNM3VMSk9UL2h0UmE2bEthZz0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJ1bnBpcGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdW5waXBlLy0vdW5waXBlLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtc3I5TzZGRktybUZsdElGNEtkSWJMdlNaQk93PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInVyaS1qcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjQuMi4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy91cmktanMvLS91cmktanMtNC4yLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUtZOUZybWlycWw5MVgyUWdqcnkwV2Q0WStZVGRyZFpoZVM4VEZ3dmtiTFdmL0c1S05KRENoNnBLTDVPWmN0RVc0KzBCYWE1aWRLMlpRdUVMUndQem5RPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJwdW55Y29kZSI6ICJeMi4xLjAiCisgICAgICB9CisgICAgfSwKKyAgICAidXRmLTgtdmFsaWRhdGUiOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdXRmLTgtdmFsaWRhdGUvLS91dGYtOC12YWxpZGF0ZS00LjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItQ1M2M1NzcDZ6eW5CUTRJeFZ6Z2pQNUFiZG82THVKODdIRkljZ0lpVlVlWTk2K01USGtxS3RyVWhwaGJ3UTZqWDhhU0dadjh6WDZsMURDUHBmY0FueEE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImJpbmRpbmdzIjogIn4xLjMuMCIsCisgICAgICAgICJuYW4iOiAifjIuMTAuMCIsCisgICAgICAgICJwcmVidWlsZC1pbnN0YWxsIjogIn40LjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJ1dGlsLWRlcHJlY2F0ZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy91dGlsLWRlcHJlY2F0ZS8tL3V0aWwtZGVwcmVjYXRlLTEuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtUlExTnlmcHczbk1uWXZ2UzFLS0pnVUdhRE04PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInV0aWxzLW1lcmdlIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3V0aWxzLW1lcmdlLy0vdXRpbHMtbWVyZ2UtMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1uNVZ4RDFDaVo1UjdMTXdTUjBIQkFvUW41eE09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAid2hpY2giOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjMuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvd2hpY2gvLS93aGljaC0xLjMuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItSHhKZFlXcTFNVElRYkozbncwY3Fzc0hvVE5VMjY3S2xyRHVHWjFXWWx4RFN0VXRLVWhPYUptaDExMi9UWm1IeHhVZnVKcVBYU09tN3REeWFzME9TSVE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImlzZXhlIjogIl4yLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJ3aGljaC1wbS1ydW5zIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3doaWNoLXBtLXJ1bnMvLS93aGljaC1wbS1ydW5zLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtWndzNis4VlM0TFZkOXJkNERLZEdGZkk2MGNzPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIndpZGUtYWxpZ24iOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvd2lkZS1hbGlnbi8tL3dpZGUtYWxpZ24tMS4xLjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVFHa09RYzhYTDZCdDVQd25zRXhLQlB1TUtCeG5HeFdXVzNmVTU1WHQ0ZmVIb3pNVWhkVU1hQkNrMjkwcXBtL3dHNXUvUlNLendkQUM0aTUxWWlnaWhBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJzdHJpbmctd2lkdGgiOiAiXjEuMC4yIHx8IDIiCisgICAgICB9CisgICAgfSwKKyAgICAid29yZHdyYXAiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvd29yZHdyYXAvLS93b3Jkd3JhcC0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUoxaElFSWtVVnFRWEhJMENKa1FhM3BETHl1cz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ3cmFwcHkiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvd3JhcHB5Ly0vd3JhcHB5LTEuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdFNROWp6N0Jxalh4TmtZRnZBMFFOdU1LdHA4PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIndyaXRlIjogeworICAgICAgInZlcnNpb24iOiAiMC4yLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3dyaXRlLy0vd3JpdGUtMC4yLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1YOEE0S09Ka3pxUCtrVVZVZHZlanhXYkxCMWM9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAibWtkaXJwIjogIl4wLjUuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJ3cyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjUuMi4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy93cy8tL3dzLTUuMi4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1qYUhGRDZQRnY2VWdvSVZkYTZxWmxscHRRc01sREVKa1RRY3lienpYRFlNMVhPOVk4ZW02OTFGR01QbU00NldHeUxVNHo5S01nUU4rcXJ1eC9uaGxIQT09IiwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFzeW5jLWxpbWl0ZXIiOiAifjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInhtbGNyZWF0ZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy94bWxjcmVhdGUvLS94bWxjcmVhdGUtMS4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0rbXYzWXFZS1FUK3ozWTlMQThXeWFTT05NSTg9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAieHRlbmQiOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcveHRlbmQvLS94dGVuZC00LjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXBjYlZNcjVsYmlQYmdnNzdsRG9mQkptTlk2OD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL3BhY2thZ2UuanNvbiBiL3BhY2thZ2UuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTU1M2VlCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZS5qc29uCkBAIC0wLDAgKzEsNjYgQEAKK3sKKyAgIm5hbWUiOiAidGhyaWZ0IiwKKyAgImRlc2NyaXB0aW9uIjogIm5vZGUuanMgYmluZGluZ3MgZm9yIHRoZSBBcGFjaGUgVGhyaWZ0IFJQQyBzeXN0ZW0iLAorICAiaG9tZXBhZ2UiOiAiaHR0cDovL3RocmlmdC5hcGFjaGUub3JnLyIsCisgICJyZXBvc2l0b3J5IjogeworICAgICJ0eXBlIjogImdpdCIsCisgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC5naXQiCisgIH0sCisgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgImF1dGhvciI6IHsKKyAgICAibmFtZSI6ICJBcGFjaGUgVGhyaWZ0IERldmVsb3BlcnMiLAorICAgICJlbWFpbCI6ICJkZXZAdGhyaWZ0LmFwYWNoZS5vcmciLAorICAgICJ1cmwiOiAiaHR0cDovL3RocmlmdC5hcGFjaGUub3JnIgorICB9LAorICAibGljZW5zZSI6ICJBcGFjaGUtMi4wIiwKKyAgImxpY2Vuc2VzIjogWworICAgIHsKKyAgICAgICJ0eXBlIjogIkFwYWNoZS0yLjAiLAorICAgICAgInVybCI6ICJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiCisgICAgfQorICBdLAorICAiYnVncyI6IHsKKyAgICAibWFpbCI6ICJkZXZAdGhyaWZ0LmFwYWNoZS5vcmciLAorICAgICJ1cmwiOiAiaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQiCisgIH0sCisgICJmaWxlcyI6IFsKKyAgICAibGliL25vZGVqcy9saWIvdGhyaWZ0IiwKKyAgICAibGliL25vZGVqcy9SRUFETUUubWQiCisgIF0sCisgICJkaXJlY3RvcmllcyI6IHsKKyAgICAibGliIjogIi4vbGliL25vZGVqcy9saWIvdGhyaWZ0IgorICB9LAorICAibWFpbiI6ICIuL2xpYi9ub2RlanMvbGliL3RocmlmdCIsCisgICJlbmdpbmVzIjogeworICAgICJub2RlIjogIj49IDQuMS4wIgorICB9LAorICAiZGVwZW5kZW5jaWVzIjogeworICAgICJub2RlLWludDY0IjogIl4wLjQuMCIsCisgICAgInEiOiAiXjEuNS4wIiwKKyAgICAid3MiOiAiXjUuMC4wIgorICB9LAorICAiZGV2RGVwZW5kZW5jaWVzIjogeworICAgICJidWZmZXItZXF1YWxzIjogIl4xLjAuNCIsCisgICAgImNvbW1hbmRlciI6ICJeMi4xNC4xIiwKKyAgICAiY29ubmVjdCI6ICJeMy42LjYiLAorICAgICJlc2xpbnQiOiAiXjUuNy4wIiwKKyAgICAiZXNsaW50LWNvbmZpZy1wcmV0dGllciI6ICJeMy4xLjAiLAorICAgICJlc2xpbnQtcGx1Z2luLXByZXR0aWVyIjogIl4zLjAuMCIsCisgICAgImlzdGFuYnVsIjogIl4wLjQuNSIsCisgICAgImpzZG9jIjogIl4zLjUuNSIsCisgICAgInByZXR0aWVyIjogIl4xLjE0LjMiLAorICAgICJ0YXBlIjogIl40LjkuMCIsCisgICAgInV0Zi04LXZhbGlkYXRlIjogIl40LjAuMCIsCisgICAgInR5cGVzY3JpcHQiOiAiXjMuMS42IiwKKyAgICAiQHR5cGVzL25vZGUiOiAiXjEwLjEyLjYiLAorICAgICJAdHlwZXMvcSI6ICJeMS41LjEiCisgIH0sCisgICJzY3JpcHRzIjogeworICAgICJjb3ZlciI6ICJsaWIvbm9kZWpzL3Rlc3QvdGVzdEFsbC5zaCBDT1ZFUiIsCisgICAgInRlc3QiOiAibGliL25vZGVqcy90ZXN0L3Rlc3RBbGwuc2giLAorICAgICJ0ZXN0LXRzIjogImxpYi9ub2RldHMvdGVzdC90ZXN0QWxsLnNoIiwKKyAgICAicHJldHRpZXIiOiAicHJldHRpZXIgLS13cml0ZSAnKiovKi5qcyciLAorICAgICJsaW50IjogImVzbGludCBsaWIvbm9kZWpzLy4gLS1leHQgLmpzIiwKKyAgICAibGludC10ZXN0cyI6ICJlc2xpbnQgbGliL25vZGVqcy90ZXN0Ly4gLS1leHQgLmpzIgorICB9Cit9CmRpZmYgLS1naXQgYS9waHBjcy54bWwuZGlzdCBiL3BocGNzLnhtbC5kaXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4MDM4OGEKLS0tIC9kZXYvbnVsbAorKysgYi9waHBjcy54bWwuZGlzdApAQCAtMCwwICsxLDI1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzxydWxlc2V0IG5hbWU9IkFwYWNoZV9UaHJpZnQiPgorICAgIDxkZXNjcmlwdGlvbj5UaGUgY29kaW5nIHN0YW5kYXJkIGZvciB0aHJpZnQuPC9kZXNjcmlwdGlvbj4KKworICAgIDxmaWxlPmxpYi9waHAvbGliPC9maWxlPgorICAgIDxmaWxlPmxpYi9waHAvdGVzdDwvZmlsZT4KKyAgICA8ZXhjbHVkZS1wYXR0ZXJuPmxpYi9waHAvdGVzdC9wYWNrYWdlcy8qPC9leGNsdWRlLXBhdHRlcm4+CisKKyAgICA8YXJnIG5hbWU9ImJhc2VwYXRoIiB2YWx1ZT0iLiIvPgorICAgIDxhcmcgbmFtZT0iY29sb3JzIiAvPgorICAgIDxhcmcgbmFtZT0icGFyYWxsZWwiIHZhbHVlPSI0IiAvPgorCisgICAgPHJ1bGUgcmVmPSJQU1IyIj4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iUFNSMi5NZXRob2RzLk1ldGhvZERlY2xhcmF0aW9uLlVuZGVyc2NvcmUiLz4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iUFNSMi5DbGFzc2VzLlByb3BlcnR5RGVjbGFyYXRpb24uVW5kZXJzY29yZSIvPgorICAgIDwvcnVsZT4KKworICAgIDxydWxlIHJlZj0iUFNSMS5GaWxlcy5TaWRlRWZmZWN0cyI+CisgICAgICAgIDxleGNsdWRlLXBhdHRlcm4+bGliL3BocC90ZXN0Lyo8L2V4Y2x1ZGUtcGF0dGVybj4KKyAgICA8L3J1bGU+CisgICAgPHJ1bGUgcmVmPSJHZW5lcmljLkZpbGVzLkxpbmVMZW5ndGgiPgorICAgICAgICA8ZXhjbHVkZS1wYXR0ZXJuPmxpYi9waHAvdGVzdC8qPC9leGNsdWRlLXBhdHRlcm4+CisgICAgPC9ydWxlPgorCis8L3J1bGVzZXQ+CmRpZmYgLS1naXQgYS9wdWxsX3JlcXVlc3RfdGVtcGxhdGUubWQgYi9wdWxsX3JlcXVlc3RfdGVtcGxhdGUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI2OTY1YgotLS0gL2Rldi9udWxsCisrKyBiL3B1bGxfcmVxdWVzdF90ZW1wbGF0ZS5tZApAQCAtMCwwICsxLDE5IEBACitTb21lIGhlbHBmdWwgdGlwcyBmb3IgYSBzdWNjZXNzZnVsIEFwYWNoZSBUaHJpZnQgUFI6CisKKyogRGlkIHlvdSB0ZXN0IHlvdXIgY2hhbmdlcyBsb2NhbGx5IG9yIHVzaW5nIENJIGluIHlvdXIgZm9yaz8KKyogSXMgdGhlIEFwYWNoZSBKaXJhIFRIUklGVCB0aWNrZXQgaWRlbnRpZmllciBpbiB0aGUgUFIgdGl0bGU/CisqIElzIHRoZSBBcGFjaGUgSmlyYSBUSFJJRlQgdGlja2V0IGlkZW50aWZpZXIgaW4gdGhlIGNvbW1pdCBtZXNzYWdlPworKiBEaWQgeW91IHNxdWFzaCB5b3VyIGNoYW5nZXMgdG8gYSBzaW5nbGUgY29tbWl0PworKiBBcmUgdGhlc2UgY2hhbmdlcyBiYWNrd2FyZHMgY29tcGF0aWJsZT8gKHBsZWFzZSBzYXkgc28gaW4gUFIgZGVzY3JpcHRpb24pCisqIERvIHlvdSBuZWVkIHRvIHVwZGF0ZSB0aGUgbGFuZ3VhZ2Utc3BlY2lmaWMgUkVBRE1FPworCitFeGFtcGxlIGlkZWFsIHB1bGwgcmVxdWVzdCB0aXRsZToKKworICAgICAgICBUSFJJRlQtOTk5OTogYW4gZXhhbXBsZSBwdWxsIHJlcXVlc3QgdGl0bGUKKworRXhhbXBsZSBpZGVhbCBjb21taXQgbWVzc2FnZToKKworICAgICAgICBUSFJJRlQtOTk5OTogW3N1bW1hcnkgb2YgZml4LCBvbmUgbGluZSBpZiBwb3NzaWJsZV0KKyAgICAgICAgQ2xpZW50OiBbbGFuZ3VhZ2UocykgYWZmZWN0ZWQsIGNvbW1hIHNlcGFyYXRlZCwgdXNlIGxpYi8gZGlyZWN0b3J5IG5hbWVzIHBsZWFzZV0KKworRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgY29tbWl0dGluZywgc2VlIENPTlRSSUJVVElORy5tZApkaWZmIC0tZ2l0IGEvcmF0X2V4Y2x1ZGUgYi9yYXRfZXhjbHVkZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVhZmU4Yi4uMDAwMDAwMAotLS0gYS9yYXRfZXhjbHVkZQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS5naXRpZ25vcmUKLUNIQU5HRVMKLUNPTlRSSUJVVE9SUwotYXV0b3NjYW4ubG9nCi1jb25maWcuZ3Vlc3MKLWNvbmZpZy5sb2cKLWNvbmZpZy5zdGF0dXMKLWNvbmZpZy5zdWIKLWNvbmZpZ3VyZQotY29uZmlndXJlLnNjYW4KLWRlcGNvbXAKLWluc3RhbGwtc2gKLWxpYnRvb2wKLWx0bWFpbi5zaAotbWlzc2luZwotc3RhbXAtaDEKLXlsd3JhcAotKi5tNAotYXV0b200dGUuY2FjaGUKLXRocmlmdHkuaAotdGhyaWZ0eS5oaAotdmVyc2lvbi5oCi12ZXJzaW9uLmguaW4KLW1kNS5jCi1tZDUuaAotZG9jCi1saWIvZXJsL3Zzbi5tawotL2xpYi9lcmwvYnVpbGQvKiovKgotbGliL2VybC9zcmMvTWFrZWZpbGUKLXRocmlmdC5hcHB1cC5zcmMKLU9DYW1sTWFrZWZpbGUKLVJFQURNRS1PQ2FtbE1ha2VmaWxlCi1UT0RPCi1NYW5pZmVzdAotc2V0dXAucmIKZGlmZiAtLWdpdCBhL3NvbmFyLXByb2plY3QucHJvcGVydGllcyBiL3NvbmFyLXByb2plY3QucHJvcGVydGllcwppbmRleCA0M2JhYWVmLi5iZDVlY2MyIDEwMDc1NQotLS0gYS9zb25hci1wcm9qZWN0LnByb3BlcnRpZXMKKysrIGIvc29uYXItcHJvamVjdC5wcm9wZXJ0aWVzCkBAIC0xNiw3ICsxNiw3IEBACiBzZXJ2aWNlcyB0aGF0IHdvcmsgZWZmaWNpZW50bHkgYW5kIHNlYW1sZXNzbHkgYmV0d2VlbiBhbGwgbWFqb3IgbGFuZ3VhZ2VzLgogCiAjIEFwYWNoZSBUaHJpZnQgVmVyc2lvbgotc29uYXIucHJvamVjdFZlcnNpb249MC45LjIKK3NvbmFyLnByb2plY3RWZXJzaW9uPTEuMC4wCiAjIHVzZSB0aGlzIHRvIHNldCBhbm90aGVyIHZlcnNpb24gc3RyaW5nCiAjICQgc29uYXItcnVubmVyIC1EIHNvbmFyLnByb2plY3RWZXJzaW9uPWBnaXQgcmV2LXBhcnNlIEhFQURgCiAjIHNldCBwcm9qZWN0RGF0ZSBpbiBjb21iaW5hdGlvbiB3aXRoIHByb2plY3RWZXJzaW9uIGZvciBpbXBvcnRzIG9mIG9sZCByZWxlYXNlcwpAQCAtMzEsNyArMzEsNyBAQAogc29uYXIuc291cmNlRW5jb2Rpbmc9VVRGLTgKIAogIyBzY20KLXNvbmFyLnNjbS51cmw9c2NtOmdpdDpodHRwczovL2dpdC13aXAtdXMuYXBhY2hlLm9yZy9yZXBvcy9hc2YvdGhyaWZ0Citzb25hci5zY20udXJsPXNjbTpnaXQ6aHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQuZ2l0CiAKICMgY3BwY2hlY2sgLXEgLS1lcnJvci1leGl0Y29kZT0wIC0teG1sIC4gMj4gY3BwY2hlY2stcmVzdWx0LnhtbAogc29uYXIuY3h4LmNwcGNoZWNrLnJlcG9ydFBhdGg9Y3BwY2hlY2stcmVzdWx0LnhtbApAQCAtNTQsMTUgKzU0LDE1IEBACiBtb2R1bGUxLnNvbmFyLnByb2plY3RCYXNlRGlyPWxpYi9qYXZhCiBtb2R1bGUxLnNvbmFyLnNvdXJjZXM9c3JjCiBtb2R1bGUxLnNvbmFyLnRlc3RzPXRlc3QKLW1vZHVsZTEuc29uYXIuYmluYXJpZXM9YnVpbGQvbGlidGhyaWZ0LTAuOS4yLmphcgotbW9kdWxlMS5zb25hci5saWJyYXJpZXM9YnVpbGQvbGliLyouamFyCittb2R1bGUxLnNvbmFyLmJpbmFyaWVzPWJ1aWxkL2xpYnMvbGlidGhyaWZ0LTEuMC4wLmphcgorbW9kdWxlMS5zb25hci5saWJyYXJpZXM9YnVpbGQvZGVwcy8qLmphcgogbW9kdWxlMS5zb25hci5sYW5ndWFnZT1qYXZhCiAKIG1vZHVsZTIuc29uYXIucHJvamVjdE5hbWU9QXBhY2hlIFRocmlmdCAtIEphdmEgVHV0b3JpYWwKIG1vZHVsZTIuc29uYXIucHJvamVjdEJhc2VEaXI9LgogbW9kdWxlMi5zb25hci5zb3VyY2VzPXR1dG9yaWFsL2phdmEvc3JjLCB0dXRvcmlhbC9qYXZhL2dlbi1qYXZhCiBtb2R1bGUyLnNvbmFyLmJpbmFyaWVzPXR1dG9yaWFsL2phdmEvdHV0b3JpYWwuamFyCi1tb2R1bGUyLnNvbmFyLmxpYnJhcmllcz1saWIvamF2YS9idWlsZC9saWIvKi5qYXIsbGliL2phdmEvYnVpbGQvbGlidGhyaWZ0LTEuMC4wLmphcgorbW9kdWxlMi5zb25hci5saWJyYXJpZXM9bGliL2phdmEvYnVpbGQvZGVwcy8qLmphcixsaWIvamF2YS9idWlsZC9saWJzL2xpYnRocmlmdC0xLjAuMC5qYXIKIG1vZHVsZTIuc29uYXIubGFuZ3VhZ2U9amF2YQogCiBtb2R1bGUzLnNvbmFyLnByb2plY3ROYW1lPUFwYWNoZSBUaHJpZnQgLSBKYXZhU2NyaXB0IExpYnJhcnkKZGlmZiAtLWdpdCBhL3Rlc3QvQW5ub3RhdGlvblRlc3QudGhyaWZ0IGIvdGVzdC9Bbm5vdGF0aW9uVGVzdC50aHJpZnQKaW5kZXggMTkxOTk1YS4uN2UyNGUxYyAxMDA2NDQKLS0tIGEvdGVzdC9Bbm5vdGF0aW9uVGVzdC50aHJpZnQKKysrIGIvdGVzdC9Bbm5vdGF0aW9uVGVzdC50aHJpZnQKQEAgLTU3LDYgKzU3LDE1IEBACiAgICJXaW50ZXIiCiB9ICggZm9vID0gImJhciIgKQogCitzdHJ1Y3Qgb3N0cl9kZWZhdWx0IHsKKyAgMTogaTMyIGJhcjsKK30KKworc3RydWN0IG9zdHJfY3VzdG9tIHsKKyAgMTogaTMyIGJhcjsKK30gKGNwcC5jdXN0b21vc3RyZWFtKQorCisKIHNlcnZpY2UgZm9vX3NlcnZpY2UgewogICB2b2lkIGZvbygpICggZm9vID0gImJhciIgKQogfSAoYS5iPSJjIikKZGlmZiAtLWdpdCBhL3Rlc3QvQ29uc3RhbnRzRGVtby50aHJpZnQgYi90ZXN0L0NvbnN0YW50c0RlbW8udGhyaWZ0CmluZGV4IDdkOTcxZTYuLmE1NDUzNGQgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29uc3RhbnRzRGVtby50aHJpZnQKKysrIGIvdGVzdC9Db25zdGFudHNEZW1vLnRocmlmdApAQCAtMTgsNiArMTgsNyBAQAogICovCiAKIG5hbWVzcGFjZSBjcHAgeW96b25lCituYW1lc3BhY2UgZXJsIGNvbnN0c18KIAogc3RydWN0IHRoaW5nIHsKICAgMTogaTMyIGhlbGxvLApAQCAtNDAsMTIgKzQxLDE2IEBACiAvL2NvbnN0IG1hcDxlbnVtY29uc3RhbnRzLHN0cmluZz4gR0VOX0VOVU1fTkFNRVMgPSB7T05FIDogIkhPV0RZIiwgVFdPOiAiUEFSVE5FUiJ9CiAKIGNvbnN0IGkzMiBoZXhfY29uc3QgPSAweDAwMDFGCitjb25zdCBpMzIgbmVnYXRpdmVfaGV4X2NvbnN0YW50ID0gLTB4MDAwMUYKIAogY29uc3QgaTMyIEdFTl9NRSA9IC0zNTIzNTUzCiBjb25zdCBkb3VibGUgR0VuX0RVQiA9IDMyNS41MzIKIGNvbnN0IGRvdWJsZSBHRW5fRFUgPSAwODUuMjM1NQogY29uc3Qgc3RyaW5nIEdFTl9TVFJJTkcgPSAiYXNsZGtqYXNmZCIKIAorY29uc3QgZG91YmxlIGUxMCA9IDFlMTAgICAvLyBmYWlscyB3aXRoIDAuOS4zIGFuZCBlYXJsaWVyCitjb25zdCBkb3VibGUgZTExID0gLTFlMTAgIAorCiBjb25zdCBtYXA8aTMyLGkzMj4gR0VOX01BUCA9IHsgMzU1MzIgOiAyMzMsIDQzNTIzIDogODUzIH0KIGNvbnN0IGxpc3Q8aTMyPiBHRU5fTElTVCA9IFsgMjM1MjM1LCAyMzU5ODM1MiwgMzI1MzUyMyBdCiAKZGlmZiAtLWdpdCBhL3Rlc3QvRGVidWdQcm90b1Rlc3QudGhyaWZ0IGIvdGVzdC9EZWJ1Z1Byb3RvVGVzdC50aHJpZnQKaW5kZXggZmIxNjk4Mi4uYjZhNzY1OSAxMDA2NDQKLS0tIGEvdGVzdC9EZWJ1Z1Byb3RvVGVzdC50aHJpZnQKKysrIGIvdGVzdC9EZWJ1Z1Byb3RvVGVzdC50aHJpZnQKQEAgLTIwLDYgKzIwLDcgQEAKIG5hbWVzcGFjZSBjX2dsaWIgVFRlc3QKIG5hbWVzcGFjZSBjcHAgdGhyaWZ0LnRlc3QuZGVidWcKIG5hbWVzcGFjZSBqYXZhIHRocmlmdC50ZXN0CituYW1lc3BhY2UgcmIgdGhyaWZ0LnRlc3QKIAogc3RydWN0IERvdWJsZXMgewogIDE6IGRvdWJsZSBuYW4sCkBAIC0zNSw3ICszNiw3IEBACiBzdHJ1Y3QgT25lT2ZFYWNoIHsKICAgMTogYm9vbCBpbV90cnVlLAogICAyOiBib29sIGltX2ZhbHNlLAotICAzOiBieXRlIGFfYml0ZSA9IDB4N2YsCisgIDM6IGk4IGFfYml0ZSA9IDB4N2YsCiAgIDQ6IGkxNiBpbnRlZ2VyMTYgPSAweDdmZmYsCiAgIDU6IGkzMiBpbnRlZ2VyMzIsCiAgIDY6IGk2NCBpbnRlZ2VyNjQgPSAxMDAwMDAwMDAwMCwKQEAgLTQ0LDcgKzQ1LDcgQEAKICAgOTogc3RyaW5nIHpvbWdfdW5pY29kZSwKICAgMTA6IGJvb2wgd2hhdF93aG8sCiAgIDExOiBiaW5hcnkgYmFzZTY0LAotICAxMjogbGlzdDxieXRlPiBieXRlX2xpc3QgPSBbMSwgMiwgM10sCisgIDEyOiBsaXN0PGk4PiBieXRlX2xpc3QgPSBbMSwgMiwgM10sCiAgIDEzOiBsaXN0PGkxNj4gaTE2X2xpc3QgPSBbMSwyLDNdLAogICAxNDogbGlzdDxpNjQ+IGk2NF9saXN0ID0gWzEsMiwzXQogfQpAQCAtNjEsNyArNjIsNyBAQAogCiBzdHJ1Y3QgSG9seU1vbGV5IHsKICAgMTogbGlzdDxPbmVPZkVhY2g+IGJpZywKLSAgMjogc2V0PGxpc3Q8c3RyaW5nPj4gY29udGFpbiwKKyAgMjogc2V0PGxpc3Q8c3RyaW5nPiAocHl0aG9uLmltbXV0YWJsZSA9ICIiKT4gY29udGFpbiwKICAgMzogbWFwPHN0cmluZyxsaXN0PEJvbms+PiBib25rcywKIH0KIApAQCAtNzEsMTEgKzcyLDE1IEBACiB9CiAKIHN0cnVjdCBFbXB0eSB7Ci19Cit9ICgKKyAgcHl0aG9uLmltbXV0YWJsZSA9ICIiLAorKQogCiBzdHJ1Y3QgV3JhcHBlciB7CiAgIDE6IEVtcHR5IGZvbwotfQorfSAoCisgIHB5dGhvbi5pbW11dGFibGUgPSAiIiwKKykKIAogc3RydWN0IFJhbmRvbVN0dWZmIHsKICAgMTogaTMyIGEsCkBAIC0xMDAsNyArMTA1LDcgQEAKIAogc3RydWN0IENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QgewogICAvLyBwcmltaXRpdmUgZmllbGRzCi0gIDE6IGJ5dGUgICBhX2J5dGU7CisgIDE6IGk4ICAgICBhX2J5dGU7CiAgIDI6IGkxNiAgICBhX2kxNjsKICAgMzogaTMyICAgIGFfaTMyOwogICA0OiBpNjQgICAgYV9pNjQ7CkBAIC0xMTIsNyArMTE3LDcgQEAKICAgMTA6IEVtcHR5IGVtcHR5X3N0cnVjdF9maWVsZDsKIAogICAvLyBwcmltaXRpdmVzIGluIGxpc3RzCi0gIDExOiBsaXN0PGJ5dGU+ICAgIGJ5dGVfbGlzdDsKKyAgMTE6IGxpc3Q8aTg+ICAgICAgYnl0ZV9saXN0OwogICAxMjogbGlzdDxpMTY+ICAgICBpMTZfbGlzdDsKICAgMTM6IGxpc3Q8aTMyPiAgICAgaTMyX2xpc3Q7CiAgIDE0OiBsaXN0PGk2ND4gICAgIGk2NF9saXN0OwpAQCAtMTIzLDcgKzEyOCw3IEBACiAgIDE5OiBsaXN0PEVtcHR5PiAgIHN0cnVjdF9saXN0OwogCiAgIC8vIHByaW1pdGl2ZXMgaW4gc2V0cwotICAyMDogc2V0PGJ5dGU+ICAgICBieXRlX3NldDsKKyAgMjA6IHNldDxpOD4gICAgICAgYnl0ZV9zZXQ7CiAgIDIxOiBzZXQ8aTE2PiAgICAgIGkxNl9zZXQ7CiAgIDIyOiBzZXQ8aTMyPiAgICAgIGkzMl9zZXQ7CiAgIDIzOiBzZXQ8aTY0PiAgICAgIGk2NF9zZXQ7CkBAIC0xMzUsMzAgKzE0MCwzMCBAQAogCiAgIC8vIG1hcHMKICAgLy8gcHJpbWl0aXZlcyBhcyBrZXlzCi0gIDI5OiBtYXA8Ynl0ZSwgYnl0ZT4gICAgICAgICAgICAgYnl0ZV9ieXRlX21hcDsKLSAgMzA6IG1hcDxpMTYsIGJ5dGU+ICAgICAgICAgICAgICBpMTZfYnl0ZV9tYXA7Ci0gIDMxOiBtYXA8aTMyLCBieXRlPiAgICAgICAgICAgICAgaTMyX2J5dGVfbWFwOwotICAzMjogbWFwPGk2NCwgYnl0ZT4gICAgICAgICAgICAgIGk2NF9ieXRlX21hcDsKLSAgMzM6IG1hcDxkb3VibGUsIGJ5dGU+ICAgICAgICAgICBkb3VibGVfYnl0ZV9tYXA7Ci0gIDM0OiBtYXA8c3RyaW5nLCBieXRlPiAgICAgICAgICAgc3RyaW5nX2J5dGVfbWFwOwotICAzNTogbWFwPGJpbmFyeSwgYnl0ZT4gICAgICAgICAgIGJpbmFyeV9ieXRlX21hcDsKLSAgMzY6IG1hcDxib29sLCBieXRlPiAgICAgICAgICAgICBib29sZWFuX2J5dGVfbWFwOworICAyOTogbWFwPGk4LCBpOD4gICAgICAgICAgICAgICBieXRlX2J5dGVfbWFwOworICAzMDogbWFwPGkxNiwgaTg+ICAgICAgICAgICAgICBpMTZfYnl0ZV9tYXA7CisgIDMxOiBtYXA8aTMyLCBpOD4gICAgICAgICAgICAgIGkzMl9ieXRlX21hcDsKKyAgMzI6IG1hcDxpNjQsIGk4PiAgICAgICAgICAgICAgaTY0X2J5dGVfbWFwOworICAzMzogbWFwPGRvdWJsZSwgaTg+ICAgICAgICAgICBkb3VibGVfYnl0ZV9tYXA7CisgIDM0OiBtYXA8c3RyaW5nLCBpOD4gICAgICAgICAgIHN0cmluZ19ieXRlX21hcDsKKyAgMzU6IG1hcDxiaW5hcnksIGk4PiAgICAgICAgICAgYmluYXJ5X2J5dGVfbWFwOworICAzNjogbWFwPGJvb2wsIGk4PiAgICAgICAgICAgICBib29sZWFuX2J5dGVfbWFwOwogICAvLyBwcmltaXRpdmVzIGFzIHZhbHVlcwotICAzNzogbWFwPGJ5dGUsIGkxNj4gICAgICAgICAgICAgIGJ5dGVfaTE2X21hcDsKLSAgMzg6IG1hcDxieXRlLCBpMzI+ICAgICAgICAgICAgICBieXRlX2kzMl9tYXA7Ci0gIDM5OiBtYXA8Ynl0ZSwgaTY0PiAgICAgICAgICAgICAgYnl0ZV9pNjRfbWFwOwotICA0MDogbWFwPGJ5dGUsIGRvdWJsZT4gICAgICAgICAgIGJ5dGVfZG91YmxlX21hcDsKLSAgNDE6IG1hcDxieXRlLCBzdHJpbmc+ICAgICAgICAgICBieXRlX3N0cmluZ19tYXA7Ci0gIDQyOiBtYXA8Ynl0ZSwgYmluYXJ5PiAgICAgICAgICAgYnl0ZV9iaW5hcnlfbWFwOwotICA0MzogbWFwPGJ5dGUsIGJvb2w+ICAgICAgICAgICAgIGJ5dGVfYm9vbGVhbl9tYXA7CisgIDM3OiBtYXA8aTgsIGkxNj4gICAgICAgICAgICAgIGJ5dGVfaTE2X21hcDsKKyAgMzg6IG1hcDxpOCwgaTMyPiAgICAgICAgICAgICAgYnl0ZV9pMzJfbWFwOworICAzOTogbWFwPGk4LCBpNjQ+ICAgICAgICAgICAgICBieXRlX2k2NF9tYXA7CisgIDQwOiBtYXA8aTgsIGRvdWJsZT4gICAgICAgICAgIGJ5dGVfZG91YmxlX21hcDsKKyAgNDE6IG1hcDxpOCwgc3RyaW5nPiAgICAgICAgICAgYnl0ZV9zdHJpbmdfbWFwOworICA0MjogbWFwPGk4LCBiaW5hcnk+ICAgICAgICAgICBieXRlX2JpbmFyeV9tYXA7CisgIDQzOiBtYXA8aTgsIGJvb2w+ICAgICAgICAgICAgIGJ5dGVfYm9vbGVhbl9tYXA7CiAgIC8vIGNvbGxlY3Rpb25zIGFzIGtleXMKLSAgNDQ6IG1hcDxsaXN0PGJ5dGU+LCBieXRlPiAgICAgICBsaXN0X2J5dGVfbWFwOwotICA0NTogbWFwPHNldDxieXRlPiwgYnl0ZT4gICAgICAgIHNldF9ieXRlX21hcDsKLSAgNDY6IG1hcDxtYXA8Ynl0ZSxieXRlPiwgYnl0ZT4gICBtYXBfYnl0ZV9tYXA7CisgIDQ0OiBtYXA8bGlzdDxpOD4gKHB5dGhvbi5pbW11dGFibGUgPSAiIiksIGk4PiAgICAgICBsaXN0X2J5dGVfbWFwOworICA0NTogbWFwPHNldDxpOD4gKHB5dGhvbi5pbW11dGFibGUgPSAiIiksIGk4PiAgICAgICAgc2V0X2J5dGVfbWFwOworICA0NjogbWFwPG1hcDxpOCxpOD4gKHB5dGhvbi5pbW11dGFibGUgPSAiIiksIGk4PiAgICAgbWFwX2J5dGVfbWFwOwogICAvLyBjb2xsZWN0aW9ucyBhcyB2YWx1ZXMKLSAgNDc6IG1hcDxieXRlLCBtYXA8Ynl0ZSxieXRlPj4gICBieXRlX21hcF9tYXA7Ci0gIDQ4OiBtYXA8Ynl0ZSwgc2V0PGJ5dGU+PiAgICAgICAgYnl0ZV9zZXRfbWFwOwotICA0OTogbWFwPGJ5dGUsIGxpc3Q8Ynl0ZT4+ICAgICAgIGJ5dGVfbGlzdF9tYXA7CisgIDQ3OiBtYXA8aTgsIG1hcDxpOCxpOD4+ICAgICBieXRlX21hcF9tYXA7CisgIDQ4OiBtYXA8aTgsIHNldDxpOD4+ICAgICAgICBieXRlX3NldF9tYXA7CisgIDQ5OiBtYXA8aTgsIGxpc3Q8aTg+PiAgICAgICBieXRlX2xpc3RfbWFwOwogfQogCiAvLyBUbyBiZSB1c2VkIHRvIHRlc3QgdGhlIHNlcmlhbGl6YXRpb24gb2YgYW4gZW1wdHkgbWFwCkBAIC0yNDMsNiArMjQ4LDggQEAKICAgdm9pZCBtZXRob2RXaXRoRGVmYXVsdEFyZ3MoMTogaTMyIHNvbWV0aGluZyA9IE1ZQ09OU1QpOwogCiAgIG9uZXdheSB2b2lkIG9uZXdheU1ldGhvZCgpOworCisgIGJvb2wgZGVjbGFyZWRFeGNlcHRpb25NZXRob2QoMTogYm9vbCBzaG91bGRUaHJvdykgdGhyb3dzICgxOiBFeGNlcHRpb25XaXRoQU1hcCB4d2FtYXApOwogfQogCiBzZXJ2aWNlIEluaGVyaXRlZCBleHRlbmRzIFNydiB7CkBAIC0yNTQsMTAgKzI2MSwxMCBAQAogLy8gVGhlIG9ubHkgcHVycG9zZSBvZiB0aGlzIHRoaW5nIGlzIHRvIGluY3JlYXNlIHRoZSBzaXplIG9mIHRoZSBnZW5lcmF0ZWQgY29kZQogLy8gc28gdGhhdCBabGliVGVzdCBoYXMgbW9yZSBoaWdobHkgY29tcHJlc3NpYmxlIGRhdGEgdG8gcGxheSB3aXRoLgogc3RydWN0IEJsb3dVcCB7Ci0gIDE6IG1hcDxsaXN0PGkzMj4sc2V0PG1hcDxpMzIsc3RyaW5nPj4+IGIxOwotICAyOiBtYXA8bGlzdDxpMzI+LHNldDxtYXA8aTMyLHN0cmluZz4+PiBiMjsKLSAgMzogbWFwPGxpc3Q8aTMyPixzZXQ8bWFwPGkzMixzdHJpbmc+Pj4gYjM7Ci0gIDQ6IG1hcDxsaXN0PGkzMj4sc2V0PG1hcDxpMzIsc3RyaW5nPj4+IGI0OworICAxOiBtYXA8bGlzdDxpMzI+KHB5dGhvbi5pbW11dGFibGUgPSAiIiksc2V0PG1hcDxpMzIsc3RyaW5nPiAocHl0aG9uLmltbXV0YWJsZSA9ICIiKT4+IGIxOworICAyOiBtYXA8bGlzdDxpMzI+KHB5dGhvbi5pbW11dGFibGUgPSAiIiksc2V0PG1hcDxpMzIsc3RyaW5nPiAocHl0aG9uLmltbXV0YWJsZSA9ICIiKT4+IGIyOworICAzOiBtYXA8bGlzdDxpMzI+KHB5dGhvbi5pbW11dGFibGUgPSAiIiksc2V0PG1hcDxpMzIsc3RyaW5nPiAocHl0aG9uLmltbXV0YWJsZSA9ICIiKT4+IGIzOworICA0OiBtYXA8bGlzdDxpMzI+KHB5dGhvbi5pbW11dGFibGUgPSAiIiksc2V0PG1hcDxpMzIsc3RyaW5nPiAocHl0aG9uLmltbXV0YWJsZSA9ICIiKT4+IGI0OwogfQogCiAKQEAgLTM2NCw0ICszNzEsOCBAQAogICBvcHRpb25hbCBpMzIgZmllbGQxMDsKICAgb3B0aW9uYWwgaTMyIGZpZWxkMTE7CiAgIG9wdGlvbmFsIGkzMiBmaWVsZDEyOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KKworc3RydWN0IExpc3REb3VibGVQZXJmIHsKKyAgMTogbGlzdDxkb3VibGU+IGZpZWxkOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9Eb2NUZXN0LnRocmlmdCBiL3Rlc3QvRG9jVGVzdC50aHJpZnQKaW5kZXggYzkzYWMzYi4uZDcwMmIyYyAxMDA2NDQKLS0tIGEvdGVzdC9Eb2NUZXN0LnRocmlmdAorKysgYi90ZXN0L0RvY1Rlc3QudGhyaWZ0CkBAIC01OCw3ICs1OCw3IEBACiAgIDE6ICBzdHJpbmcgc3RyaW5nX3RoaW5nCiAKICAgLyoqIGRvY3QgdGV4dCBnb2VzIGJlZm9yZSBhIGNvbW1hICovCi0gIDQ6ICBieXRlICAgYnl0ZV90aGluZywKKyAgNDogIGk4ICAgICBieXRlX3RoaW5nLAogCiAgIDk6ICBpMzIgICAgaTMyX3RoaW5nLAogICAxMTogaTY0ICAgIGk2NF90aGluZwpAQCAtNzQsNyArNzQsNyBAQAogCiBzdHJ1Y3QgWHRydWN0MgogewotICAxOiBieXRlICAgYnl0ZV90aGluZywKKyAgMTogaTggICAgIGJ5dGVfdGhpbmcsCiAgIDI6IFh0cnVjdCBzdHJ1Y3RfdGhpbmcsCiAgIDM6IGkzMiAgICBpMzJfdGhpbmcKIH0KQEAgLTExNyw3ICsxMTcsNyBAQAogICAvKiogQW5kIHRoaXMgaXMgaG93IHlvdSB3b3VsZCBkb2N1bWVudCBmdW5jdGlvbnMgaW4gYSBzZXJ2aWNlICovCiAgIHZvaWQgICAgICAgICB0ZXN0Vm9pZCgpLAogICBzdHJpbmcgICAgICAgdGVzdFN0cmluZygxOiBzdHJpbmcgdGhpbmcpLAotICBieXRlICAgICAgICAgdGVzdEJ5dGUoMTogYnl0ZSB0aGluZyksCisgIGk4ICAgICAgICAgICB0ZXN0Qnl0ZSgxOiBieXRlIHRoaW5nKSwKICAgaTMyICAgICAgICAgIHRlc3RJMzIoMTogaTMyIHRoaW5nKSwKIAogICAvKiogTGlrZSB0aGlzIG9uZSAqLwpAQCAtMTU1LDcgKzE1NSw3IEBACiB0eXBlZGVmIGkzMiBUcml2aWFsTXVsdGlMaW5lCiAKIC8qKgotICogVGhpcyBpcyB0aGUgY2Fubm9uaWNhbCBleGFtcGxlCisgKiBUaGlzIGlzIHRoZSBjYW5vbmljYWwgZXhhbXBsZQogICogb2YgYSBtdWx0aWxpbmUgZG9jc3RyaW5nLgogICovCiB0eXBlZGVmIGkzMiBTdGFuZGFyZE11bHRpTGluZQpAQCAtMjQ2LDQgKzI0Niw0MiBAQAogCiAvKipubyByb29tIGZvciBuZXdsaW5lIGhlcmUqLwogCisvKiAqIC8gKi8KK3R5cGVkZWYgaTMyIFRlc3RGb3IzNTAxYQorCisvKioKKyAqIC8KKyAqLwordHlwZWRlZiBpMzIgVGVzdEZvcjM1MDFiCisKKworLyogQ29tbWVudC1lbmQgdG9rZW5zIGNhbiBvZiBjb3Vyc2UgaGF2ZSBtb3JlIHRoYW4gb25lIGFzdGVyaXNrICovCitzdHJ1Y3QgVGVzdEZvcjM3MDlfMDAgeyAvKiA/ICovIDE6IGkzMiBmb28gfQorLyogQ29tbWVudC1lbmQgdG9rZW5zIGNhbiBvZiBjb3Vyc2UgaGF2ZSBtb3JlIHRoYW4gb25lIGFzdGVyaXNrICoqLworc3RydWN0IFRlc3RGb3IzNzA5XzAxIHsgLyogPyAqLyAxOiBpMzIgZm9vIH0KKy8qIENvbW1lbnQtZW5kIHRva2VucyBjYW4gb2YgY291cnNlIGhhdmUgbW9yZSB0aGFuIG9uZSBhc3RlcmlzayAqKiovCitzdHJ1Y3QgVGVzdEZvcjM3MDlfMDIgeyAvKiA/ICovIDE6IGkzMiBmb28gfQorLyoqIENvbW1lbnQtZW5kIHRva2VucyBjYW4gb2YgY291cnNlIGhhdmUgbW9yZSB0aGFuIG9uZSBhc3RlcmlzayAqLworc3RydWN0IFRlc3RGb3IzNzA5XzAzIHsgLyogPyAqLyAxOiBpMzIgZm9vIH0KKy8qKiBDb21tZW50LWVuZCB0b2tlbnMgY2FuIG9mIGNvdXJzZSBoYXZlIG1vcmUgdGhhbiBvbmUgYXN0ZXJpc2sgKiovCitzdHJ1Y3QgVGVzdEZvcjM3MDlfMDQgeyAvKiA/ICovIDE6IGkzMiBmb28gfQorLyoqIENvbW1lbnQtZW5kIHRva2VucyBjYW4gb2YgY291cnNlIGhhdmUgbW9yZSB0aGFuIG9uZSBhc3RlcmlzayAqKiovCitzdHJ1Y3QgVGVzdEZvcjM3MDlfMDUgeyAvKiA/ICovIDE6IGkzMiBmb28gfQorLyoqKiBDb21tZW50LWVuZCB0b2tlbnMgY2FuIG9mIGNvdXJzZSBoYXZlIG1vcmUgdGhhbiBvbmUgYXN0ZXJpc2sgKi8KK3N0cnVjdCBUZXN0Rm9yMzcwOV8wNiB7IC8qID8gKi8gMTogaTMyIGZvbyB9CisvKioqIENvbW1lbnQtZW5kIHRva2VucyBjYW4gb2YgY291cnNlIGhhdmUgbW9yZSB0aGFuIG9uZSBhc3RlcmlzayAqKi8KK3N0cnVjdCBUZXN0Rm9yMzcwOV8wNyB7IC8qID8gKi8gMTogaTMyIGZvbyB9CisvKioqIENvbW1lbnQtZW5kIHRva2VucyBjYW4gb2YgY291cnNlIGhhdmUgbW9yZSB0aGFuIG9uZSBhc3RlcmlzayAqKiovCitzdHJ1Y3QgVGVzdEZvcjM3MDlfMDggeyAvKiA/ICovIDE6IGkzMiBmb28gfQorCitzdHJ1Y3QgVGVzdEZvcjM3MDkgeworICAvKiogVGhpcyBpcyBhIGNvbW1lbnQgKi8KKyAgMTogcmVxdWlyZWQgc3RyaW5nIGlkLAorICAvKiogVGhpcyBpcyBhbHNvIGEgY29tbWVudCAqKi8KKyAgMjogcmVxdWlyZWQgc3RyaW5nIHR5cGVJZCwKKyAgLyoqIFlldCBhbm90aGVyIGNvbW1lbnQhICovCisgIDM6IHJlcXVpcmVkIGkzMiBlbmRUaW1lc3RhbXAKK30KKworCiAvKiBUSEUgRU5EICovCmRpZmYgLS1naXQgYS90ZXN0L0RvdWJsZUNvbnN0YW50c1Rlc3QudGhyaWZ0IGIvdGVzdC9Eb3VibGVDb25zdGFudHNUZXN0LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTIxMmFiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9Eb3VibGVDb25zdGFudHNUZXN0LnRocmlmdApAQCAtMCwwICsxLDE3IEBACituYW1lc3BhY2UgamF2YSB0aHJpZnQudGVzdAorbmFtZXNwYWNlIGNwcCB0aHJpZnQudGVzdAorCisvLyBtb3JlIHRlc3RzIG9uIGRvdWJsZSBjb25zdGFudHMgKHByZWNpc2lvbiBhbmQgdHlwZSBjaGVja3MpCitjb25zdCBkb3VibGUgRE9VQkxFX0FTU0lHTkVEX1RPX0lOVF9DT05TVEFOVF9URVNUID0gMQorY29uc3QgZG91YmxlIERPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9JTlRfQ09OU1RBTlRfVEVTVCA9IC0xMDAKK2NvbnN0IGRvdWJsZSBET1VCTEVfQVNTSUdORURfVE9fTEFSR0VTVF9JTlRfQ09OU1RBTlRfVEVTVCA9IDkyMjMzNzIwMzY4NTQ3NzU4MDcKK2NvbnN0IGRvdWJsZSBET1VCTEVfQVNTSUdORURfVE9fU01BTExFU1RfSU5UX0NPTlNUQU5UX1RFU1QgPSAtOTIyMzM3MjAzNjg1NDc3NTgwNworY29uc3QgZG91YmxlIERPVUJMRV9BU1NJR05FRF9UT19ET1VCTEVfV0lUSF9NQU5ZX0RFQ0lNQUxTX1RFU1QgPSAzLjE0MTU5MjY1MzU5Citjb25zdCBkb3VibGUgRE9VQkxFX0FTU0lHTkVEX1RPX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QgPSAxMDAwMDAwLjEKK2NvbnN0IGRvdWJsZSBET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCA9IC0xMDAwMDAwLjEKK2NvbnN0IGRvdWJsZSBET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRE9VQkxFX1RFU1QgPSAxLjdlKzMwOAorY29uc3QgZG91YmxlIERPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNUID0gOTIyMzM3MjAzNjg1NDc3NTgxNi40MworY29uc3QgZG91YmxlIERPVUJMRV9BU1NJR05FRF9UT19TTUFMTF9ET1VCTEVfVEVTVCA9IC0xLjdlKzMwOAorY29uc3QgZG91YmxlIERPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9CVVRfTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCA9IC05MjIzMzcyMDM2ODU0Nzc1ODE2LjQzCisKK2NvbnN0IGxpc3Q8ZG91YmxlPiBET1VCTEVfTElTVF9URVNUID0gWzEsLTEwMCwxMDAsOTIyMzM3MjAzNjg1NDc3NTgwNywtOTIyMzM3MjAzNjg1NDc3NTgwNywzLjE0MTU5MjY1MzU5LDEwMDAwMDAuMSwtMTAwMDAwMC4xLDEuN2UrMzA4LC0xLjdlKzMwOCw5MjIzMzcyMDM2ODU0Nzc1ODE2LjQzLC05MjIzMzcyMDM2ODU0Nzc1ODE2LjQzXQpkaWZmIC0tZ2l0IGEvdGVzdC9FbnVtQ29udGFpbmVyc1Rlc3QudGhyaWZ0IGIvdGVzdC9FbnVtQ29udGFpbmVyc1Rlc3QudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiNjQwOGYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L0VudW1Db250YWluZXJzVGVzdC50aHJpZnQKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCituYW1lc3BhY2UgamF2YSB0aHJpZnQudGVzdC5lbnVtY29udGFpbmVycworCitlbnVtIEdyZWVrR29kR29kZGVzcyB7CisgICAgQVJFUywKKyAgICBBUEhST0RJVEUsCisgICAgWkVVUywKKyAgICBQT1NFSURPTiwKKyAgICBIRVJBLAorfQorCit0eXBlZGVmIEdyZWVrR29kR29kZGVzcyBHcmVla0dvZEdvZGRlc3NUeXBlCit0eXBlZGVmIGkzMiBQb3dlcgorCitzdHJ1Y3QgR29kQmVhbiB7CisgICAgMTogb3B0aW9uYWwgbWFwPEdyZWVrR29kR29kZGVzc1R5cGUsIFBvd2VyPiBwb3dlciwKKyAgICAyOiBvcHRpb25hbCBzZXQ8R3JlZWtHb2RHb2RkZXNzVHlwZT4gZ29kZGVzcywKKyAgICAzOiBvcHRpb25hbCBtYXA8c3RyaW5nLCBHcmVla0dvZEdvZGRlc3M+IGJ5QWxpYXMsCisgICAgNDogb3B0aW9uYWwgc2V0PHN0cmluZz4gaW1hZ2VzLAorfQorCitjb25zdCBtYXA8R3JlZWtHb2RHb2RkZXNzVHlwZSwgc3RyaW5nPiBBVFRSSUJVVEVTID0KK3sKKyAgICBHcmVla0dvZEdvZGRlc3MuWkVVUzogImxpZ2h0bmluZyBib2x0IiwKKyAgICBHcmVla0dvZEdvZGRlc3MuUE9TRUlET046ICJ0cmlkZW50IiwKK30KKworY29uc3Qgc2V0PEdyZWVrR29kR29kZGVzc1R5cGU+IEJFQVVUWSA9IFsgR3JlZWtHb2RHb2RkZXNzLkFQSFJPRElURSwgR3JlZWtHb2RHb2RkZXNzLkhFUkEgXQpkaWZmIC0tZ2l0IGEvdGVzdC9FbnVtVGVzdC50aHJpZnQgYi90ZXN0L0VudW1UZXN0LnRocmlmdAppbmRleCA2MjAxOTIzLi43OTYxZjM4IDEwMDY0NAotLS0gYS90ZXN0L0VudW1UZXN0LnRocmlmdAorKysgYi90ZXN0L0VudW1UZXN0LnRocmlmdApAQCAtMjEsNiArMjEsOCBAQAogICogZGV0YWlscy4KICAqLwogCituYW1lc3BhY2UgY19nbGliIFRUZXN0CisKIGVudW0gTXlFbnVtMSB7CiAgIE1FMV8wID0gMCwKICAgTUUxXzEgPSAxLApAQCAtNjQsOSArNjYsNTQgQEAKICAgLy8gcmVwcmVzZW50ZWQgd2l0aCBhbiBpMzIuCiB9CiAKK2VudW0gTXlFbnVtNSB7CisgIGUxICAgICAgICAvLyBmYWlscyB3aXRoIDAuOS4zIGFuZCBlYXJsaWVyCisgIGUyID0gNDIgICAvLyBmYWlscyB3aXRoIDAuOS4zIGFuZCBlYXJsaWVyCit9CisKK2VudW0gTXlFbnVtV2l0aEN1c3RvbU9zdHJlYW0geworICBjdXN0b20xID0gMSwKKyAgQ3VzdG9NMgorfSAoY3BwLmN1c3RvbW9zdHJlYW0pCisKIHN0cnVjdCBNeVN0cnVjdCB7CiAgIDE6IE15RW51bTIgbWUyXzIgPSBNeUVudW0xLk1FMl8yCiAgIDI6IE15RW51bTMgbWUzX24yID0gTXlFbnVtMy5NRTNfTjIKICAgMzogTXlFbnVtMyBtZTNfZDEgPSBNeUVudW0zLk1FM19EMQogfQogCitzdHJ1Y3QgRW51bVRlc3RTdHJ1Y3QgeworICAxOiBNeUVudW0zIGFfZW51bTsKKyAgMjogbGlzdDxNeUVudW0zPiBlbnVtX2xpc3Q7CisgIDM6IHNldDxNeUVudW0zPiBlbnVtX3NldDsKKyAgNDogbWFwPE15RW51bTMsIE15RW51bTM+IGVudW1fZW51bV9tYXA7CisgIC8vIGNvbGxlY3Rpb25zIGFzIGtleXMKKyAgNDQ6IG1hcDxsaXN0PE15RW51bTM+IChweXRob24uaW1tdXRhYmxlID0gIiIpLCBNeUVudW0zPiBsaXN0X2VudW1fbWFwOworICA0NTogbWFwPHNldDxNeUVudW0zPiAocHl0aG9uLmltbXV0YWJsZSA9ICIiKSwgTXlFbnVtMz4gc2V0X2VudW1fbWFwOworICA0NjogbWFwPG1hcDxNeUVudW0zLE15RW51bTM+IChweXRob24uaW1tdXRhYmxlID0gIiIpLCBNeUVudW0zPiBtYXBfZW51bV9tYXA7CisgIC8vIGNvbGxlY3Rpb25zIGFzIHZhbHVlcworICA0NzogbWFwPE15RW51bTMsIG1hcDxNeUVudW0zLCBNeUVudW0zPj4gZW51bV9tYXBfbWFwOworICA0ODogbWFwPE15RW51bTMsIHNldDxNeUVudW0zPj4gZW51bV9zZXRfbWFwOworICA0OTogbWFwPE15RW51bTMsIGxpc3Q8TXlFbnVtMz4+IGVudW1fbGlzdF9tYXA7Cit9CisKK2NvbnN0IEVudW1UZXN0U3RydWN0IEVOVU1fVEVTVCA9IHsKKyAgJ2FfZW51bSc6IE15RW51bTMuTUUzX0QxLAorICAnZW51bV9saXN0JzogW015RW51bTMuTUUzX0QxLCBNeUVudW0zLk1FM18wLCBNeUVudW0zLk1FM19OMl0sCisgICdlbnVtX3NldCc6IFtNeUVudW0zLk1FM19EMSwgTXlFbnVtMy5NRTNfTjFdLAorICAnZW51bV9lbnVtX21hcCc6IHtNeUVudW0zLk1FM19EMTogTXlFbnVtMy5NRTNfMCwgTXlFbnVtMy5NRTNfMDogTXlFbnVtMy5NRTNfRDF9LAorICAnbGlzdF9lbnVtX21hcCc6IHtbTXlFbnVtMy5NRTNfRDEsIE15RW51bTMuTUUzXzBdOiBNeUVudW0zLk1FM18wLCBbTXlFbnVtMy5NRTNfRDFdOiBNeUVudW0zLk1FM18wLCBbTXlFbnVtMy5NRTNfMF06IE15RW51bTMuTUUzX0QxfSwKKyAgJ3NldF9lbnVtX21hcCc6IHtbTXlFbnVtMy5NRTNfRDEsIE15RW51bTMuTUUzXzBdOiBNeUVudW0zLk1FM18wLCBbTXlFbnVtMy5NRTNfRDFdOiBNeUVudW0zLk1FM18wfSwKKyAgJ21hcF9lbnVtX21hcCc6IHt7TXlFbnVtMy5NRTNfTjE6IE15RW51bTMuTUUzXzEwfTogTXlFbnVtMy5NRTNfMX0sCisgICdlbnVtX21hcF9tYXAnOiB7TXlFbnVtMy5NRTNfTjE6IHtNeUVudW0zLk1FM19EMTogTXlFbnVtMy5NRTNfRDF9fSwKKyAgJ2VudW1fc2V0X21hcCc6IHtNeUVudW0zLk1FM19OMjogW015RW51bTMuTUUzX0QxLCBNeUVudW0zLk1FM19OMV0sIE15RW51bTMuTUUzXzEwOiBbTXlFbnVtMy5NRTNfRDEsIE15RW51bTMuTUUzX04xXX0sCisgICdlbnVtX2xpc3RfbWFwJzoge015RW51bTMuTUUzX0QxOiBbTXlFbnVtMy5NRTNfMTBdLCBNeUVudW0zLk1FM18wOiBbTXlFbnVtMy5NRTNfOSwgTXlFbnVtMy5NRTNfMTBdfSwKK30KKworc2VydmljZSBFbnVtVGVzdFNlcnZpY2UgeworICBNeUVudW0zIHRlc3RFbnVtKDE6IE15RW51bTMgZW51bTEpLAorICBsaXN0PE15RW51bTM+IHRlc3RFbnVtTGlzdCgxOiBsaXN0PE15RW51bTM+IGVudW0xKSwKKyAgc2V0PE15RW51bTM+IHRlc3RFbnVtU2V0KDE6IHNldDxNeUVudW0zPiBlbnVtMSksCisgIG1hcDxNeUVudW0zLCBNeUVudW0zPiB0ZXN0RW51bU1hcCgxOiBtYXA8TXlFbnVtMywgTXlFbnVtMz4gZW51bTEpLAorICBFbnVtVGVzdFN0cnVjdCB0ZXN0RW51bVN0cnVjdCgxOiBFbnVtVGVzdFN0cnVjdCBlbnVtMSksCit9CmRpZmYgLS1naXQgYS90ZXN0L0Zhc3RiaW5hcnlUZXN0LnB5IGIvdGVzdC9GYXN0YmluYXJ5VGVzdC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2Y2ZWZhZS4uMDAwMDAwMAotLS0gYS90ZXN0L0Zhc3RiaW5hcnlUZXN0LnB5CisrKyAvZGV2L251bGwKQEAgLTEsMjIyICswLDAgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbgotCi0jCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotciIiIgotdGhyaWZ0IC0tZ2VuIHB5IERlYnVnUHJvdG9UZXN0LnRocmlmdAotLi9GYXN0YmluYXJ5VGVzdC5weQotIiIiCi0KLSMgVE9ETyhkcmVpc3MpOiBUZXN0IGVycm9yIGNhc2VzLiAgQ2hlY2sgZm9yIG1lbW9yeSBsZWFrcy4KLQotaW1wb3J0IHN5cwotc3lzLnBhdGguYXBwZW5kKCcuL2dlbi1weScpCi0KLWltcG9ydCBtYXRoCi1mcm9tIERlYnVnUHJvdG9UZXN0IGltcG9ydCBTcnYKLWZyb20gRGVidWdQcm90b1Rlc3QudHR5cGVzIGltcG9ydCAqCi1mcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQKLWZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wKLQotaW1wb3J0IHRpbWVpdAotZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCi1mcm9tIGNvcHkgaW1wb3J0IGRlZXBjb3B5Ci1mcm9tIHBwcmludCBpbXBvcnQgcHByaW50Ci0KLWNsYXNzIFREZXZOdWxsVHJhbnNwb3J0KFRUcmFuc3BvcnQuVFRyYW5zcG9ydEJhc2UpOgotICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgcGFzcwotICBkZWYgaXNPcGVuKHNlbGYpOgotICAgIHJldHVybiBUcnVlCi0KLW9vZTEgPSBPbmVPZkVhY2goKQotb29lMS5pbV90cnVlICAgPSBUcnVlOwotb29lMS5pbV9mYWxzZSAgPSBGYWxzZTsKLW9vZTEuYV9iaXRlICAgID0gMHhkNjsKLW9vZTEuaW50ZWdlcjE2ID0gMjcwMDA7Ci1vb2UxLmludGVnZXIzMiA9IDE8PDI0Owotb29lMS5pbnRlZ2VyNjQgPSA2MDAwICogMTAwMCAqIDEwMDA7Ci1vb2UxLmRvdWJsZV9wcmVjaXNpb24gPSBtYXRoLnBpOwotb29lMS5zb21lX2NoYXJhY3RlcnMgID0gIkRlYnVnIFRISVMhIjsKLW9vZTEuem9tZ191bmljb2RlICAgICA9ICJceGQ3XG5cYVx0IjsKLQotb29lMiA9IE9uZU9mRWFjaCgpOwotb29lMi5pbnRlZ2VyMTYgPSAxNjsKLW9vZTIuaW50ZWdlcjMyID0gMzI7Ci1vb2UyLmludGVnZXI2NCA9IDY0Owotb29lMi5kb3VibGVfcHJlY2lzaW9uID0gKG1hdGguc3FydCg1KSsxKS8yOwotb29lMi5zb21lX2NoYXJhY3RlcnMgID0gIjpSIChtZSBnb2luZyBcInJycnJcIikiOwotb29lMi56b21nX3VuaWNvZGUgICAgID0gIlx4ZDNceDgwXHhlMlx4ODVceGFlXHhjZVx4OWRceDIwIlwKLSAgICAgICAgICAgICAgICAgICAgICAgICJceGQwXHg5ZFx4Y2VceGJmXHhlMlx4ODVceGJmXHhkMFx4YmUiXAotICAgICAgICAgICAgICAgICAgICAgICAgIlx4YzlceGExXHhkMFx4YjNceGQwXHhiMFx4Y2ZceDgxXHhlMlx4ODRceDhlIlwKLSAgICAgICAgICAgICAgICAgICAgICAgICJceDIwXHhjZVx4OTFceDc0XHg3NFx4Y2VceGIxXHhlMlx4ODVceGJkXHhjZVx4YmEiXAotICAgICAgICAgICAgICAgICAgICAgICAgIlx4YzdceDgzXHhlMlx4ODBceGJjIjsKLQotaG0gPSBIb2x5TW9sZXkoeyJiaWciOltdLCAiY29udGFpbiI6c2V0KCksICJib25rcyI6e319KQotaG0uYmlnLmFwcGVuZChvb2UxKQotaG0uYmlnLmFwcGVuZChvb2UyKQotaG0uYmlnWzBdLmFfYml0ZSA9IDB4MjI7Ci1obS5iaWdbMV0uYV9iaXRlID0gMHgyMjsKLQotaG0uY29udGFpbi5hZGQoKCJhbmQgYSBvbmUiLCAiYW5kIGEgdHdvIikpCi1obS5jb250YWluLmFkZCgoInRoZW4gYSBvbmUsIHR3byIsICJ0aHJlZSEiLCAiRk9VUiEiKSkKLWhtLmNvbnRhaW4uYWRkKCgpKQotCi1obS5ib25rc1sibm90aGluZyJdID0gW107Ci1obS5ib25rc1sic29tZXRoaW5nIl0gPSBbCi0gIEJvbmsoeyJ0eXBlIjoxLCAibWVzc2FnZSI6IldhaXQuIn0pLAotICBCb25rKHsidHlwZSI6MiwgIm1lc3NhZ2UiOiJXaGF0PyJ9KSwKLV0KLWhtLmJvbmtzWyJwb2UiXSA9IFsKLSAgQm9uayh7InR5cGUiOjMsICJtZXNzYWdlIjoicXVvdGgifSksCi0gIEJvbmsoeyJ0eXBlIjo0LCAibWVzc2FnZSI6InRoZSByYXZlbiJ9KSwKLSAgQm9uayh7InR5cGUiOjUsICJtZXNzYWdlIjoibmV2ZXJtb3JlIn0pLAotXQotCi1ycyA9IFJhbmRvbVN0dWZmKCkKLXJzLmEgPSAxCi1ycy5iID0gMgotcnMuYyA9IDMKLXJzLm15aW50bGlzdCA9IHJhbmdlKDIwKQotcnMubWFwcyA9IHsxOldyYXBwZXIoeyJmb28iOkVtcHR5KCl9KSwyOldyYXBwZXIoeyJmb28iOkVtcHR5KCl9KX0KLXJzLmJpZ2ludCA9IDEyNDUyMzQ1MjQzNUwKLXJzLnRyaXBsZSA9IDMuMTQKLQotIyBtYWtlIHN1cmUgdGhpcyBzcGxpdHMgdHdvIGJ1ZmZlcnMgaW4gYSBidWZmZXJlZCBwcm90b2NvbAotcnNodWdlID0gUmFuZG9tU3R1ZmYoKQotcnNodWdlLm15aW50bGlzdD1yYW5nZSgxMDAwMCkKLQotbXlfemVybyA9IFNydi5KYW5reV9yZXN1bHQoeyJhcmciOjV9KQotCi1kZWYgY2hlY2tXcml0ZShvKToKLSAgdHJhbnNfZmFzdCA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcigpCi0gIHRyYW5zX3Nsb3cgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoKQotICBwcm90X2Zhc3QgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQodHJhbnNfZmFzdCkKLSAgcHJvdF9zbG93ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbCh0cmFuc19zbG93KQotCi0gIG8ud3JpdGUocHJvdF9mYXN0KQotICBvLndyaXRlKHByb3Rfc2xvdykKLSAgT1JJRyA9IHRyYW5zX3Nsb3cuZ2V0dmFsdWUoKQotICBNSU5FID0gdHJhbnNfZmFzdC5nZXR2YWx1ZSgpCi0gIGlmIE9SSUcgIT0gTUlORToKLSAgICBwcmludCAibWluZTogJXNcbm9yaWc6ICVzIiAlIChyZXByKE1JTkUpLCByZXByKE9SSUcpKQotCi1kZWYgY2hlY2tSZWFkKG8pOgotICBwcm90ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbChUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoKSkKLSAgby53cml0ZShwcm90KQotCi0gIHNsb3dfdmVyc2lvbl9iaW5hcnkgPSBwcm90LnRyYW5zLmdldHZhbHVlKCkKLQotICBwcm90ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkKAotICAgICAgICAgICBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoc2xvd192ZXJzaW9uX2JpbmFyeSkpCi0gIGMgPSBvLl9fY2xhc3NfXygpCi0gIGMucmVhZChwcm90KQotICBpZiBjICE9IG86Ci0gICAgcHJpbnQgImNvcHk6ICIKLSAgICBwcHJpbnQoZXZhbChyZXByKGMpKSkKLSAgICBwcmludCAib3JpZzogIgotICAgIHBwcmludChldmFsKHJlcHIobykpKQotCi0gIHByb3QgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQoCi0gICAgICAgICAgIFRUcmFuc3BvcnQuVEJ1ZmZlcmVkVHJhbnNwb3J0KAotICAgICAgICAgICAgIFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcihzbG93X3ZlcnNpb25fYmluYXJ5KSkpCi0gIGMgPSBvLl9fY2xhc3NfXygpCi0gIGMucmVhZChwcm90KQotICBpZiBjICE9IG86Ci0gICAgcHJpbnQgImNvcHk6ICIKLSAgICBwcHJpbnQoZXZhbChyZXByKGMpKSkKLSAgICBwcmludCAib3JpZzogIgotICAgIHBwcmludChldmFsKHJlcHIobykpKQotCi0KLWRlZiBkb1Rlc3QoKToKLSAgY2hlY2tXcml0ZShobSkKLSAgbm9fc2V0ID0gZGVlcGNvcHkoaG0pCi0gIG5vX3NldC5jb250YWluID0gc2V0KCkKLSAgY2hlY2tSZWFkKG5vX3NldCkKLSAgY2hlY2tXcml0ZShycykKLSAgY2hlY2tSZWFkKHJzKQotICBjaGVja1dyaXRlKHJzaHVnZSkKLSAgY2hlY2tSZWFkKHJzaHVnZSkKLSAgY2hlY2tXcml0ZShteV96ZXJvKQotICBjaGVja1JlYWQobXlfemVybykKLSAgY2hlY2tSZWFkKEJhY2t3YXJkcyh7ImZpcnN0X3RhZzIiOjQsICJzZWNvbmRfdGFnMSI6Mn0pKQotCi0gICMgT25lIGNhc2Ugd2hlcmUgdGhlIHNlcmlhbGl6ZWQgZm9ybSBjaGFuZ2VzLCBidXQgb25seSBzdXBlcmZpY2lhbGx5LgotICBvID0gQmFja3dhcmRzKHsiZmlyc3RfdGFnMiI6NCwgInNlY29uZF90YWcxIjoyfSkKLSAgdHJhbnNfZmFzdCA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcigpCi0gIHRyYW5zX3Nsb3cgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoKQotICBwcm90X2Zhc3QgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQodHJhbnNfZmFzdCkKLSAgcHJvdF9zbG93ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbCh0cmFuc19zbG93KQotCi0gIG8ud3JpdGUocHJvdF9mYXN0KQotICBvLndyaXRlKHByb3Rfc2xvdykKLSAgT1JJRyA9IHRyYW5zX3Nsb3cuZ2V0dmFsdWUoKQotICBNSU5FID0gdHJhbnNfZmFzdC5nZXR2YWx1ZSgpCi0gIGlmIE9SSUcgPT0gTUlORToKLSAgICBwcmludCAiVGhhdCBzaG91bGRuJ3QgaGFwcGVuLiIKLQotCi0gIHByb3QgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQoVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKCkpCi0gIG8ud3JpdGUocHJvdCkKLSAgcHJvdCA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2woCi0gICAgICAgICAgIFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcigKLSAgICAgICAgICAgICBwcm90LnRyYW5zLmdldHZhbHVlKCkpKQotICBjID0gby5fX2NsYXNzX18oKQotICBjLnJlYWQocHJvdCkKLSAgaWYgYyAhPSBvOgotICAgIHByaW50ICJjb3B5OiAiCi0gICAgcHByaW50KGV2YWwocmVwcihjKSkpCi0gICAgcHJpbnQgIm9yaWc6ICIKLSAgICBwcHJpbnQoZXZhbChyZXByKG8pKSkKLQotCi0KLWRlZiBkb0JlbmNobWFyaygpOgotCi0gIGl0ZXJzID0gMjUwMDAKLQotICBzZXR1cCA9ICIiIgotZnJvbSBfX21haW5fXyBpbXBvcnQgaG0sIHJzLCBURGV2TnVsbFRyYW5zcG9ydAotZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbAotdHJhbnMgPSBURGV2TnVsbFRyYW5zcG9ydCgpCi1wcm90ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbCVzKHRyYW5zKQotIiIiCi0KLSAgc2V0dXBfZmFzdCA9IHNldHVwICUgIkFjY2VsZXJhdGVkIgotICBzZXR1cF9zbG93ID0gc2V0dXAgJSAiIgotCi0gIHByaW50ICJTdGFydGluZyBCZW5jaG1hcmtzIgotCi0gIHByaW50ICJIb2x5TW9sZXkgU3RhbmRhcmQgPSAlZiIgJSBcCi0gICAgICB0aW1laXQuVGltZXIoJ2htLndyaXRlKHByb3QpJywgc2V0dXBfc2xvdykudGltZWl0KG51bWJlcj1pdGVycykKLSAgcHJpbnQgIkhvbHlNb2xleSBBY2NlbGVyLiA9ICVmIiAlIFwKLSAgICAgIHRpbWVpdC5UaW1lcignaG0ud3JpdGUocHJvdCknLCBzZXR1cF9mYXN0KS50aW1laXQobnVtYmVyPWl0ZXJzKQotCi0gIHByaW50ICJGYXN0U3RydWN0IFN0YW5kYXJkID0gJWYiICUgXAotICAgICAgdGltZWl0LlRpbWVyKCdycy53cml0ZShwcm90KScsIHNldHVwX3Nsb3cpLnRpbWVpdChudW1iZXI9aXRlcnMpCi0gIHByaW50ICJGYXN0U3RydWN0IEFjY2VsZXIuID0gJWYiICUgXAotICAgICAgdGltZWl0LlRpbWVyKCdycy53cml0ZShwcm90KScsIHNldHVwX2Zhc3QpLnRpbWVpdChudW1iZXI9aXRlcnMpCi0KLQotCi1kb1Rlc3QoKQotZG9CZW5jaG1hcmsoKQotCmRpZmYgLS1naXQgYS90ZXN0L0Z1bGxDYW1lbFRlc3QudGhyaWZ0IGIvdGVzdC9GdWxsQ2FtZWxUZXN0LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWU0ZGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9GdWxsQ2FtZWxUZXN0LnRocmlmdApAQCAtMCwwICsxLDM4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK25hbWVzcGFjZSBqYXZhIHRocmlmdC50ZXN0LmZ1bGxjYW1lbAorCitzdHJ1Y3QgT25lT2ZFYWNoWlogeworICAxOiBib29sIGltX3RydWUsCisgIDI6IGJvb2wgaW1fZmFsc2UsCisgIDM6IGJ5dGUgYV9iaXRlLAorICA0OiBpMTYgaW50ZWdlcjE2LAorICA1OiBpMzIgaW50ZWdlcjMyLAorICA2OiBpNjQgaW50ZWdlcjY0LAorICA3OiBkb3VibGUgZG91YmxlX3ByZWNpc2lvbiwKKyAgODogc3RyaW5nIHNvbWVfY2hhcmFjdGVycywKKyAgOTogc3RyaW5nIHpvbWdfdW5pY29kZSwKKyAgMTA6IGJvb2wgd2hhdF93aG8sCit9CisKK3NlcnZpY2UgVW5kZXJzY29yZVNydiB7CisgIGk2NCBzb21lX3JwY19jYWxsKDE6IHN0cmluZyBtZXNzYWdlKQorfQorCmRpZmYgLS1naXQgYS90ZXN0L0phdmFEZWVwQ29weVRlc3QudGhyaWZ0IGIvdGVzdC9KYXZhRGVlcENvcHlUZXN0LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzk3NGFlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9KYXZhRGVlcENvcHlUZXN0LnRocmlmdApAQCAtMCwwICsxLDE5IEBACitpbmNsdWRlICJKYXZhVHlwZXMudGhyaWZ0IgorCituYW1lc3BhY2UgamF2YSB0aHJpZnQudGVzdAorCitzdHJ1Y3QgRGVlcENvcHlGb28geworICAxOiBvcHRpb25hbCBsaXN0PERlZXBDb3B5QmFyPiBsLAorICAyOiBvcHRpb25hbCBzZXQ8RGVlcENvcHlCYXI+IHMsCisgIDM6IG9wdGlvbmFsIG1hcDxzdHJpbmcsIERlZXBDb3B5QmFyPiBtLAorICA0OiBvcHRpb25hbCBsaXN0PEphdmFUeXBlcy5PYmplY3Q+IGxpLAorICA1OiBvcHRpb25hbCBzZXQ8SmF2YVR5cGVzLk9iamVjdD4gc2ksCisgIDY6IG9wdGlvbmFsIG1hcDxzdHJpbmcsIEphdmFUeXBlcy5PYmplY3Q+IG1pLAorICA3OiBvcHRpb25hbCBEZWVwQ29weUJhciBiYXIsCit9CisKK3N0cnVjdCBEZWVwQ29weUJhciB7CisgIDE6IG9wdGlvbmFsIHN0cmluZyBhLAorICAyOiBvcHRpb25hbCBpMzIgYiwKKyAgMzogb3B0aW9uYWwgYm9vbCBjLAorfQpkaWZmIC0tZ2l0IGEvdGVzdC9KYXZhVHlwZXMudGhyaWZ0IGIvdGVzdC9KYXZhVHlwZXMudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjNzMzYWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L0phdmFUeXBlcy50aHJpZnQKQEAgLTAsMCArMSwxMDMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworbmFtZXNwYWNlIGphdmEgdGhyaWZ0LnRlc3QKKworc3RydWN0IEludGVnZXIgeworICAxOiBpMzIgdmFsCit9CisKK3N0cnVjdCBTdHJpbmcgeworICAxOiBzdHJpbmcgdmFsCit9CisKK3N0cnVjdCBCb29sZWFuIHsKKyAgMTogYm9vbCB2YWwKK30KKworc3RydWN0IERvdWJsZSB7CisgIDE6IGRvdWJsZSB2YWwKK30KKworc3RydWN0IExvbmcgeworICAxOiBpNjQgdmFsCit9CisKK3N0cnVjdCBCeXRlIHsKKyAgMTogYnl0ZSB2YWwKK30KKworc3RydWN0IEZsb2F0IHsKKyAgMTogZG91YmxlIHZhbAorfQorCitzdHJ1Y3QgTGlzdCB7CisgIDE6IGxpc3Q8c3RyaW5nPiB2YWxzCit9CisKK3N0cnVjdCBBcnJheUxpc3QgeworICAxOiBsaXN0PHN0cmluZz4gdmFscworfQorCitzdHJ1Y3QgU29ydGVkTWFwIHsKKyAgMTogbWFwPHN0cmluZywgc3RyaW5nPiB2YWxzCit9CisKK3N0cnVjdCBUcmVlTWFwIHsKKyAgMTogbWFwPHN0cmluZywgc3RyaW5nPiB2YWxzCit9CisKK3N0cnVjdCBIYXNoTWFwIHsKKyAgMTogbWFwPHN0cmluZywgU3RyaW5nPiB2YWxzCit9CisKK3N0cnVjdCBNYXAgeworICAxOiBtYXA8ZG91YmxlLCBEb3VibGU+IHZhbHMKK30KKworc3RydWN0IE9iamVjdCB7CisgIDE6IEludGVnZXIgaW50ZWdlciwKKyAgMjogU3RyaW5nIHN0ciwKKyAgMzogQm9vbGVhbiBib29sZWFuX2ZpZWxkLAorICA0OiBEb3VibGUgZGJsLAorICA1OiBCeXRlIGJpdGUsCisgIDY6IG1hcDxpMzIsIEludGVnZXI+IGludG1hcCwKKyAgNzogTWFwIHNvbWVtYXAsCit9CisKK2V4Y2VwdGlvbiBFeGNlcHRpb24geworICAxOiBzdHJpbmcgbXNnCit9CisKK3NlcnZpY2UgQXN5bmNOb25ibG9ja2luZ1NlcnZpY2UgeworICBPYmplY3QgbXltZXRob2QoCisgICAgMTogSW50ZWdlciBpbnRlZ2VyLAorICAgIDI6IFN0cmluZyBzdHIsCisgICAgMzogQm9vbGVhbiBib29sZWFuX2ZpZWxkLAorICAgIDQ6IERvdWJsZSBkYmwsCisgICAgNTogQnl0ZSBiaXRlLAorICAgIDY6IG1hcDxpMzIsIEludGVnZXI+IGludG1hcCwKKyAgICA3OiBNYXAgc29tZW1hcCwKKyAgKSB0aHJvd3MgKDE6RXhjZXB0aW9uIGV4KTsKK30KKworc3RydWN0IFNhZmVCeXRlcyB7CisgIDE6IGJpbmFyeSBieXRlczsKK30KKwpkaWZmIC0tZ2l0IGEvdGVzdC9Kc0RlZXBDb25zdHJ1Y3RvclRlc3QudGhyaWZ0IGIvdGVzdC9Kc0RlZXBDb25zdHJ1Y3RvclRlc3QudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmNTEyNmYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L0pzRGVlcENvbnN0cnVjdG9yVGVzdC50aHJpZnQKQEAgLTAsMCArMSwxOCBAQAorc3RydWN0IFNpbXBsZSB7CisgIDE6IHN0cmluZyB2YWx1ZQorfQorCitzdHJ1Y3QgQ29tcGxleCB7CisgIDE6IFNpbXBsZSBzdHJ1Y3RfZmllbGQKKyAgMjogbGlzdDxTaW1wbGU+IHN0cnVjdF9saXN0X2ZpZWxkCisgIDM6IHNldDxTaW1wbGU+IHN0cnVjdF9zZXRfZmllbGQKKyAgNDogbWFwPHN0cmluZyxTaW1wbGU+IHN0cnVjdF9tYXBfZmllbGQKKyAgNTogbGlzdDxzZXQ8bWFwPHN0cmluZyxsaXN0PFNpbXBsZT4+Pj4gc3RydWN0X25lc3RlZF9jb250YWluZXJzX2ZpZWxkCisgIDY6IG1hcDxzdHJpbmcsIGxpc3Q8bWFwPHN0cmluZyxTaW1wbGU+PiA+IHN0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19maWVsZDIKKyAgNzogbGlzdDxsaXN0PHN0cmluZz4+IGxpc3Rfb2ZfbGlzdF9maWVsZAorICA4OiBsaXN0PGxpc3Q8bGlzdDxzdHJpbmc+Pj4gbGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGQKK30KKworc3RydWN0IENvbXBsZXhMaXN0IHsKKyAgMTogbGlzdDxDb21wbGV4PiBzdHJ1Y3RfbGlzdF9maWVsZDsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvTWFrZWZpbGUuYW0gYi90ZXN0L01ha2VmaWxlLmFtCmluZGV4IDEzODQ4NGMuLjY4ZjE5ODYgMTAwNzU1Ci0tLSBhL3Rlc3QvTWFrZWZpbGUuYW0KKysrIGIvdGVzdC9NYWtlZmlsZS5hbQpAQCAtMTcsNDQgKzE3LDg4IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1TVUJESVJTID0KK1NVQkRJUlMgPSBmZWF0dXJlcworUFJFQ1JPU1NfVEFSR0VUID0KIAogaWYgV0lUSF9DX0dMSUIKIFNVQkRJUlMgKz0gY19nbGliCitQUkVDUk9TU19UQVJHRVQgKz0gcHJlY3Jvc3MtY19nbGliCitlbmRpZgorCitpZiBXSVRIX0NMCitTVUJESVJTICs9IGNsCitQUkVDUk9TU19UQVJHRVQgKz0gcHJlY3Jvc3MtY2wKK2VuZGlmCisKK2lmIFdJVEhfTU9OTworU1VCRElSUyArPSBjc2hhcnAKK1BSRUNST1NTX1RBUkdFVCArPSBwcmVjcm9zcy1jc2hhcnAKIGVuZGlmCiAKIGlmIFdJVEhfQ1BQCiBTVUJESVJTICs9IGNwcAorUFJFQ1JPU1NfVEFSR0VUICs9IHByZWNyb3NzLWNwcAogZW5kaWYKIAogaWYgV0lUSF9QRVJMCiBTVUJESVJTICs9IHBlcmwKK1BSRUNST1NTX1RBUkdFVCArPSBwcmVjcm9zcy1wZXJsCiBlbmRpZgogCiBpZiBXSVRIX1BIUAogU1VCRElSUyArPSBwaHAKK1BSRUNST1NTX1RBUkdFVCArPSBwcmVjcm9zcy1waHAKK2VuZGlmCisKK2lmIFdJVEhfREFSVAorU1VCRElSUyArPSBkYXJ0CitQUkVDUk9TU19UQVJHRVQgKz0gcHJlY3Jvc3MtZGFydAogZW5kaWYKIAogaWYgV0lUSF9QWVRIT04KIFNVQkRJUlMgKz0gcHkKLVNVQkRJUlMgKz0gcHkudHdpc3RlZAorUFJFQ1JPU1NfVEFSR0VUICs9IHByZWNyb3NzLXB5CiBTVUJESVJTICs9IHB5LnRvcm5hZG8KK2lmIFdJVEhfVFdJU1RFRF9URVNUCitTVUJESVJTICs9IHB5LnR3aXN0ZWQKK2VuZGlmCiBlbmRpZgogCiBpZiBXSVRIX1JVQlkKIFNVQkRJUlMgKz0gcmIKK1BSRUNST1NTX1RBUkdFVCArPSBwcmVjcm9zcy1yYgogZW5kaWYKIAogaWYgV0lUSF9IQVNLRUxMCiBTVUJESVJTICs9IGhzCiBlbmRpZgogCitpZiBXSVRIX0hBWEUKK1NVQkRJUlMgKz0gaGF4ZQorZW5kaWYKKworaWYgV0lUSF9ET1RORVRDT1JFCitTVUJESVJTICs9IG5ldGNvcmUKK2VuZGlmCisKIGlmIFdJVEhfR08KIFNVQkRJUlMgKz0gZ28KK1BSRUNST1NTX1RBUkdFVCArPSBwcmVjcm9zcy1nbwogZW5kaWYKIAogaWYgV0lUSF9FUkxBTkcKIFNVQkRJUlMgKz0gZXJsCitQUkVDUk9TU19UQVJHRVQgKz0gcHJlY3Jvc3MtZXJsCitlbmRpZgorCitpZiBXSVRIX0xVQQorU1VCRElSUyArPSBsdWEKK1BSRUNST1NTX1RBUkdFVCArPSBwcmVjcm9zcy1sdWEKK2VuZGlmCisKK2lmIFdJVEhfUlMKK1NVQkRJUlMgKz0gcnMKK1BSRUNST1NTX1RBUkdFVCArPSBwcmVjcm9zcy1ycwogZW5kaWYKIAogIwpAQCAtNjMsMTMgKzEwNywxNyBAQAogY2hlY2stbG9jYWw6CiAJJCh0b3BfYnVpbGRkaXIpL2NvbXBpbGVyL2NwcC90aHJpZnQgLS1nZW4gaHRtbCAtciAkKHRvcF9zcmNkaXIpL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKIAorY2xlYW4tbG9jYWw6CisJcm0gLXJmICQodG9wX3NyY2RpcikvdGVzdC9nZW4taHRtbAorCiBFWFRSQV9ESVNUID0gXAorCWF1ZGl0IFwKKwljcm9zc3J1bm5lciBcCiAJa2V5cyBcCi0JdGVzdC5zaCBcCi0JdGVzdC5weSBcCi0JdGVzdHMuanNvbiBcCiAJY19nbGliIFwKKwljbCBcCiAJY3BwIFwKKwlkYXJ0IFwKIAllcmwgXAogCWhzIFwKIAlsdWEgXApAQCAtODAsMjYgKzEyOCw0MyBAQAogCXB5LnR3aXN0ZWQgXAogCXB5LnRvcm5hZG8gXAogCXJiIFwKKwlycyBcCiAJdGhyZWFkcyBcCiAJQW5ub3RhdGlvblRlc3QudGhyaWZ0IFwKIAlCcm9rZW5Db25zdGFudHMudGhyaWZ0IFwKIAlDb25zdGFudHNEZW1vLnRocmlmdCBcCiAJRGVidWdQcm90b1Rlc3QudGhyaWZ0IFwKKwlEb3VibGVDb25zdGFudHNUZXN0LnRocmlmdCBcCiAJRGVuc2VMaW5raW5nVGVzdC50aHJpZnQgXAogCURvY1Rlc3QudGhyaWZ0IFwKIAlFbnVtVGVzdC50aHJpZnQgXAorCUZ1bGxDYW1lbFRlc3QudGhyaWZ0IFwKIAlJbmNsdWRlLnRocmlmdCBcCiAJSmF2YUJlYW5zVGVzdC50aHJpZnQgXAorCUphdmFEZWVwQ29weVRlc3QudGhyaWZ0IFwKKwlKYXZhVHlwZXMudGhyaWZ0IFwKKwlKc0RlZXBDb25zdHJ1Y3RvclRlc3QudGhyaWZ0IFwKIAlNYW55T3B0aW9uYWxzLnRocmlmdCBcCiAJTWFueVR5cGVkZWZzLnRocmlmdCBcCiAJTmFtZUNvbmZsaWN0VGVzdC50aHJpZnQgXAogCU9wdGlvbmFsUmVxdWlyZWRUZXN0LnRocmlmdCBcCiAJUmVjdXJzaXZlLnRocmlmdCBcCiAJUmV1c2VPYmplY3RzLnRocmlmdCBcCisJRW51bUNvbnRhaW5lcnNUZXN0LnRocmlmdCBcCiAJU21hbGxUZXN0LnRocmlmdCBcCiAJU3RyZXNzVGVzdC50aHJpZnQgXAogCVRocmlmdFRlc3QudGhyaWZ0IFwKIAlUeXBlZGVmVGVzdC50aHJpZnQgXAotCUZhc3RiaW5hcnlUZXN0LnB5IFwKLQlyZXN1bHQuaHRtbCBcCi0JUkVBRE1FLm1kCisJVW5zYWZlVHlwZXMudGhyaWZ0IFwKKwlrbm93bl9mYWlsdXJlc19MaW51eC5qc29uIFwKKwl0ZXN0LnB5IFwKKwl0ZXN0cy5qc29uIFwKKwlyZWJ1aWxkX2tub3duX2ZhaWx1cmVzLnNoIFwKKwlyZXN1bHQuanMgXAorCWluZGV4Lmh0bWwgXAorCVJFQURNRS5tZCBcCisJdmFsZ3JpbmQuc3VwcHJlc3MKKworcHJlY3Jvc3MtJToKKwkkKE1BS0UpIC1DICQqIHByZWNyb3NzCitwcmVjcm9zczogJChQUkVDUk9TU19UQVJHRVQpCmRpZmYgLS1naXQgYS90ZXN0L05hbWVDb25mbGljdFRlc3QudGhyaWZ0IGIvdGVzdC9OYW1lQ29uZmxpY3RUZXN0LnRocmlmdAppbmRleCBlNTE0MGRkLi5kM2VmYjQ3IDEwMDY0NAotLS0gYS90ZXN0L05hbWVDb25mbGljdFRlc3QudGhyaWZ0CisrKyBiL3Rlc3QvTmFtZUNvbmZsaWN0VGVzdC50aHJpZnQKQEAgLTE5LDYgKzE5LDggQEAKIAogc3RydWN0IHBhcnRpYWwgewogICAgIDE6IHVzaW5nIHVzaW5nCisgICAgMjogYm9vbCByZWFkCisgICAgMzogYm9vbCB3cml0ZQogfQogCiBlbnVtIE1heWJlIHsKZGlmZiAtLWdpdCBhL3Rlc3QvT3B0aW9uYWxSZXF1aXJlZFRlc3QudGhyaWZ0IGIvdGVzdC9PcHRpb25hbFJlcXVpcmVkVGVzdC50aHJpZnQKaW5kZXggZGNkZDBmMi4uYTYwODg5OCAxMDA2NDQKLS0tIGEvdGVzdC9PcHRpb25hbFJlcXVpcmVkVGVzdC50aHJpZnQKKysrIGIvdGVzdC9PcHRpb25hbFJlcXVpcmVkVGVzdC50aHJpZnQKQEAgLTgwLDMgKzgwLDkgQEAKICAgNTogcmVxdWlyZWQgYmluYXJ5IHJlcV9iaW47CiAgIDY6IG9wdGlvbmFsIGJpbmFyeSBvcHRfYmluOwogfQorCitzdHJ1Y3QgQmluYXJpZXMgeworICA0OiBiaW5hcnkgYmluOworICA1OiByZXF1aXJlZCBiaW5hcnkgcmVxX2JpbjsKKyAgNjogb3B0aW9uYWwgYmluYXJ5IG9wdF9iaW47Cit9CmRpZmYgLS1naXQgYS90ZXN0L1JFQURNRS5tZCBiL3Rlc3QvUkVBRE1FLm1kCmluZGV4IDVlM2U1ZDUuLjA2ODJmNWQgMTAwNzU1Ci0tLSBhL3Rlc3QvUkVBRE1FLm1kCisrKyBiL3Rlc3QvUkVBRE1FLm1kCkBAIC0xLDE3ICsxLDEyNSBAQAogIyBBcGFjaGUgVGhyaWZ0IC0gaW50ZWdyYXRpb24gdGVzdCBzdWl0ZQogCiBUaGlzIGlzIHRoZSBjcm9zcyBldmVyeXRoaW5nIGludGVncmF0aW9uIHRlc3Qgc3VpdGUgZm9yIEFwYWNoZSBUaHJpZnQuCi1leGVjdXRlZCBieQorCisjIyBSdW4KKworIyMjIEEuIFVzaW5nIE1ha2UKKworVGhlIHRlc3QgY2FuIGJlIGV4ZWN1dGVkIGJ5OgogCiAgICAgbWFrZSBjcm9zcwogCi1hdCB0aGUgbW9tZW50LCB0aGlzIHN0YXJ0cyB0aGUgdGVzdC5zaCBzY3JpcHQgd2hpY2ggZG9lcyB0aGUgcmVhbCBjcm9zcyB0ZXN0Ci13aXRoIGRpZmZlcmVudCB0cmFuc3BvcnRzLCBwcm90b2NvbHMgYW5kIGxhbmd1YWdlcy4KK1RoaXMgc3RhcnRzIHRoZSBbdGVzdC5weV0odGVzdC5weSkgc2NyaXB0IHdoaWNoIGRvZXMgdGhlIHJlYWwgY3Jvc3MgdGVzdCB3aXRoCitkaWZmZXJlbnQgdHJhbnNwb3J0cywgcHJvdG9jb2xzIGFuZCBsYW5ndWFnZXMuCiAKLVVuaXQgdGVzdHMgZm9yIGxhbmd1YWdlcyBhciB1c3VhbGx5IGxvY2F0ZWQgdW5kZXIgbGliLzxsYW5nPi90ZXN0LwotY3Jvc3MgbGFuZ3VhZ2UgdGVzdHMgYWNvcmRpbmcgdG8gW1RocmlmdFRlc3QudGhyaWZ0XShUaHJpZnRUZXN0LnRocmlmdCkgc2hhbGwgYmUKK05vdGUgdGhhdCB0aGlzIHNraXBzIGFueSBsYW5ndWFnZSB0aGF0IGlzIG5vdCBidWlsdCBsb2NhbGx5LiBJdCBhbHNvIHNraXBzCit0ZXN0cyB0aGF0IGFyZSBrbm93biB0byBiZSBmYWlsaW5nLiBJZiB5b3UgbmVlZCBtb3JlIGNvbnRyb2wgb3ZlciB3aGljaCB0ZXN0cwordG8gcnVuLCByZWFkIGZvbGxvd2luZyBzZWN0aW9uLgorCisjIyMgQi4gVXNpbmcgdGVzdCBzY3JpcHQgZGlyZWN0bHkKKworQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBpbnZva2UgW3Rlc3QucHldKHRlc3QucHkpIGRpcmVjdGx5LiBZb3UgbmVlZCB0byBydW5gbWFrZQorcHJlY3Jvc3NgIG9uY2UgYmVmb3JlIGV4ZWN1dGluZyBpdCBmb3IgdGhlIGZpcnN0IHRpbWUuCisKK0ZvciBleGFtcGxlLCBpZiB5b3UgY2hhbmdlZCBzb21ldGhpbmcgaW4gYG5vZGVqc2AgbGlicmFyeSBhbmQgbmVlZCB0byB2ZXJpZnkKK3RoZSBwYXRjaCwgeW91IGNhbiBza2lwIGV2ZXJ5dGhpbmcgZXhjZXB0IGBub2RlanNgIGl0c2VsZiBhbmQgc29tZSByZWZlcmVuY2UKK2ltcGxlbWVudGF0aW9uIChjdXJyZW50bHkgYGNwcGAgYW5kIGBqYXZhYCBhcmUgcmVjb21tZW5kZWQpIGxpa2UgdGhpczoKKworICAgIC4vY29uZmlndXJlIC0td2l0aG91dC1jX2dsaWIgLXdpdGhvdXQtY3NoYXJwIC0td2l0aG91dC1lcmxhbmcgLS13aXRob3V0LWx1YSAuLi4KKyAgICBtYWtlIHByZWNyb3NzIC1qOAorICAgIHRlc3QvdGVzdC5weSAtLXNlcnZlciBjcHAsamF2YSAtLWNsaWVudCBub2RlanMKKyAgICB0ZXN0L3Rlc3QucHkgLS1zZXJ2ZXIgbm9kZWpzIC0tY2xpZW50IGNwcCxqYXZhCisKK0Fub3RoZXIgdXNlZnVsIGZsYWcgaXMgLS1yZWdleC4gRm9yIGV4YW1wbGUsIHRvIHJ1biBhbGwgdGVzdHMgdGhhdCBpbnZvbHZlCitKYXZhIFRCaW5hcnlQcm90b2NvbDoKKworICAgIHRlc3QvdGVzdC5weSAtLXJlZ2V4ICJqYXZhLipiaW5hcnkiCisKKyMjIFRlc3QgY2FzZSBkZWZpbml0aW9uIGZpbGUKKworVGhlIGNyb3NzIHRlc3QgY2FzZXMgYXJlIGRlZmluZWQgaW4gW3Rlc3RzLmpzb25dKHRlc3RzLmpzb24pLgorVGhlIHJvb3QgZWxlbWVudCBpcyBjb2xsZWN0aW9uIG9mIHRlc3QgdGFyZ2V0IGRlZmluaXRpb25zLgorRWFjaCB0ZXN0IHRhcmdldCBkZWZpbml0aW9uIGxvb2tzIGxpa2UgdGhpczoKKworICAgIHsKKyAgICAgICJuYW1lIjogInNvbWVsaWIiLAorCisgICAgICAiY2xpZW50IjogeworICAgICAgICAiY29tbWFuZCI6IFsic29tZWxpYl9jbGllbnRfZXhlY3V0YWJsZSJdLAorICAgICAgICAid29ya2RpciI6ICJzb21lbGliL2JpbiIsCisgICAgICAgICJwcm90b2NvbHMiOiBbImJpbmFyeSJdLAorICAgICAgICAidHJhbnNwb3J0cyI6IFsiYnVmZmVyZWQiXSwKKyAgICAgICAgInNvY2tldHMiOiBbImlwIl0sCisgICAgICB9LAorICAgICAgInNlcnZlciI6IHsKKyAgICAgICAgImNvbW1hbmQiOiBbInNvbWVsaWJfc2VydmVyX2V4ZWN1dGFibGUiXSwKKyAgICAgICAgIndvcmtkaXIiOiAic29tZWxpYi9iaW4iLAorICAgICAgICAicHJvdG9jb2xzIjogWyJiaW5hcnkiXSwKKyAgICAgICAgInRyYW5zcG9ydHMiOiBbImJ1ZmZlcmVkIl0sCisgICAgICAgICJzb2NrZXRzIjogWyJpcCIsICJpcC1zc2wiXSwKKyAgICAgIH0KKyAgICB9CisKK0VpdGhlciBjbGllbnQgb3Igc2VydmVyIGRlZmluaXRpb24gb3IgYm90aCBzaG91bGQgYmUgcHJlc2VudC4KKworUGFyYW1ldGVycyB0aGF0IGFyZSBjb21tb24gdG8gYm90aCBgY2xpZW50YCBhbmQgYHNlcnZlcmAgY2FuIGJlIHB1dCB0byB0YXJnZXQKK2RlZmluaXRpb24gcm9vdDoKKworICAgIHsKKyAgICAgICJuYW1lIjogInNvbWVsaWIiLAorCisgICAgICAid29ya2RpciI6ICJzb21lbGliL2JpbiIsCisgICAgICAicHJvdG9jb2xzIjogWyJiaW5hcnkiXSwKKyAgICAgICJ0cmFuc3BvcnRzIjogWyJidWZmZXJlZCJdLAorICAgICAgInNvY2tldHMiOiBbImlwIl0sCisKKyAgICAgICJjbGllbnQiOiB7ICJjb21tYW5kIjogWyJzb21lbGliX2NsaWVudF9leGVjdXRhYmxlIl0gfSwKKyAgICAgICJzZXJ2ZXIiOiB7CisgICAgICAgICJjb21tYW5kIjogWyJzb21lbGliX3NlcnZlcl9leGVjdXRhYmxlIl0sCisgICAgICAgICJzb2NrZXRzIjogWyJpcC1zc2wiXQorICAgICAgfQorICAgIH0KKworRm9yIHRoZSBjb21wbGV0ZSBsaXN0IG9mIHN1cHBvcnRlZCBrZXlzIGFuZCB0aGVpciBlZmZlY3QsIHNlZSBzb3VyY2UgY29kZQorY29tbWVudCBhdCB0aGUgb3B0IG9mIFtjcm9zc3J1bm5lci9jb2xsZWN0LnB5XShjcm9zc3J1bm5lci9jb2xsZWN0LnB5KS4KKworCisjIyBMaXN0IG9mIGtub3duIGZhaWx1cmVzCisKK1NpbmNlIG1hbnkgY3Jvc3MgdGVzdHMgY3VycmVudGx5IGZhaWwgKG1haW5seSBkdWUgdG8gcGFydGlhbCBpbmNvbXBhdGliaWxpdHkKK2Fyb3VuZCBleGNlcHRpb24gaGFuZGxpbmcpLCB0aGUgdGVzdCBzY3JpcHQgc3BlY2lmaWNhbGx5IHJlcG9ydCBmb3IgIm5vdCBrbm93bgorYmVmb3JlIiBmYWlsdXJlcy4KKworRm9yIHRoaXMgcHVycG9zZSwgdGVzdCBjYXNlcyBrbm93biB0byAob2NjYXNpb25hbGx5KSBmYWlsIGFyZSBsaXN0ZWQgaW4KK2Brbm93bl9mYWlsdXJlc188cGxhdGZvcm0+Lmpzb25gIHdoZXJlIGA8cGxhdGZvcm0+YCBtYXRjaGVzIHdpdGggcHl0aG9uCitgcGxhdGZvcm0uc3lzdGVtKClgIHN0cmluZy4KKworQ3VycmVudGx5LCBvbmx5IExpbnV4IHZlcnNpb24gaXMgaW5jbHVkZWQuCisKK0ZZSSwgdGhlIGZpbGUgaXMgaW5pdGlhbGx5IGdlbmVyYXRlZCBieQorCisgICAgdGVzdC90ZXN0LnB5IC0tdXBkYXRlLWV4cGVjdGVkLWZhaWx1cmVzPW92ZXJ3cml0ZQorCithZnRlciBhIGZ1bGwgdGVzdCBydW4sIHRoZW4gcmVwZWF0ZWRseQorCisgICAgdGVzdC90ZXN0LnB5IC0tc2tpcC1rbm93bi1mYWlsdXJlcworICAgIHRlc3QvdGVzdC5weSAtLXVwZGF0ZS1leHBlY3RlZC1mYWlsdXJlcz1tZXJnZQorCit0byB1cGRhdGUgdGhlIGtub3duIGZhaWx1cmVzLCBydW4KKworICAgIG1ha2UgZmFpbAorCisjIyBUZXN0IGV4ZWN1dGFibGUgc3BlY2lmaWNhdGlvbgorCisjIyMgQ29tbWFuZCBsaW5lIHBhcmFtZXRlcnMKKworVW5pdCB0ZXN0cyBmb3IgbGFuZ3VhZ2VzIGFyZSB1c3VhbGx5IGxvY2F0ZWQgdW5kZXIgbGliLzxsYW5nPi90ZXN0LworY3Jvc3MgbGFuZ3VhZ2UgdGVzdHMgYWNjb3JkaW5nIHRvIFtUaHJpZnRUZXN0LnRocmlmdF0oVGhyaWZ0VGVzdC50aHJpZnQpIHNoYWxsIGJlCiBwcm92aWRlZCBmb3IgZXZlcnkgbGFuZ3VhZ2UgaW5jbHVkaW5nIGV4ZWN1dGFibGVzIHdpdGggdGhlIGZvbGxvd2luZyBjb21tYW5kCi1saW5lIGludGVyZmFjZSBmb3Igc2VydmVyczoKK2xpbmUgaW50ZXJmYWNlOgorCisqKlNlcnZlciBjb21tYW5kIGxpbmUgaW50ZXJmYWNlOioqCiAKICAgICAkIC4vY3BwL1Rlc3RTZXJ2ZXIgLWgKICAgICBBbGxvd2VkIG9wdGlvbnM6CkBAIC0xOSwyMyArMTI3LDIzIEBACiAgICAgICAtLXBvcnQgYXJnICg9OTA5MCkgICAgICAgICAgUG9ydCBudW1iZXIgdG8gbGlzdGVuCiAgICAgICAtLWRvbWFpbi1zb2NrZXQgYXJnICAgICAgICAgVW5peCBEb21haW4gU29ja2V0IChlLmcuIC90bXAvVGhyaWZ0VGVzdC50aHJpZnQpCiAgICAgICAtLW5hbWVkLXBpcGUgYXJnICAgICAgICAgICAgV2luZG93cyBOYW1lZCBQaXBlIChlLmcuIE15VGhyaWZ0UGlwZSkKLSAgICAgIC0tc2VydmVyLXR5cGUgYXJnICg9c2ltcGxlKSB0eXBlIG9mIHNlcnZlciwgInNpbXBsZSIsICJ0aHJlYWQtcG9vbCIsIAorICAgICAgLS1zZXJ2ZXItdHlwZSBhcmcgKD1zaW1wbGUpIHR5cGUgb2Ygc2VydmVyLCAic2ltcGxlIiwgInRocmVhZC1wb29sIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhyZWFkZWQiLCBvciAibm9uYmxvY2tpbmciCiAgICAgICAtLXRyYW5zcG9ydCBhcmcgKD1idWZmZXJlZCkgdHJhbnNwb3J0OiBidWZmZXJlZCwgZnJhbWVkLCBodHRwLCBhbm9ucGlwZQogICAgICAgLS1wcm90b2NvbCBhcmcgKD1iaW5hcnkpICAgIHByb3RvY29sOiBiaW5hcnksIGNvbXBhY3QsIGpzb24KICAgICAgIC0tc3NsICAgICAgICAgICAgICAgICAgICAgICBFbmNyeXB0ZWQgVHJhbnNwb3J0IHVzaW5nIFNTTAogICAgICAgLS1wcm9jZXNzb3ItZXZlbnRzICAgICAgICAgIHByb2Nlc3Nvci1ldmVudHMKLSAgICAgIC1uIFsgLS13b3JrZXJzIF0gYXJnICg9NCkgICBOdW1iZXIgb2YgdGhyZWFkIHBvb2xzIHdvcmtlcnMuIE9ubHkgdmFsaWQgZm9yIAorICAgICAgLW4gWyAtLXdvcmtlcnMgXSBhcmcgKD00KSAgIE51bWJlciBvZiB0aHJlYWQgcG9vbHMgd29ya2Vycy4gT25seSB2YWxpZCBmb3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZC1wb29sIHNlcnZlciB0eXBlCiAKLWFuZCB0aGlzIGZvciBjbGllbnRzOgorKipDbGllbnQgY29tbWFuZCBsaW5lIGludGVyZmFjZToqKgogCiAgICAgJCAuL2NwcC9UZXN0Q2xpZW50IC1oCiAgICAgQWxsb3dlZCBvcHRpb25zOgogICAgICAgLWggWyAtLWhlbHAgXSAgICAgICAgICAgICAgIHByb2R1Y2UgaGVscCBtZXNzYWdlCiAgICAgICAtLWhvc3QgYXJnICg9bG9jYWxob3N0KSAgICAgSG9zdCB0byBjb25uZWN0CiAgICAgICAtLXBvcnQgYXJnICg9OTA5MCkgICAgICAgICAgUG9ydCBudW1iZXIgdG8gY29ubmVjdAotICAgICAgLS1kb21haW4tc29ja2V0IGFyZyAgICAgICAgIERvbWFpbiBTb2NrZXQgKGUuZy4gL3RtcC9UaHJpZnRUZXN0LnRocmlmdCksIAorICAgICAgLS1kb21haW4tc29ja2V0IGFyZyAgICAgICAgIERvbWFpbiBTb2NrZXQgKGUuZy4gL3RtcC9UaHJpZnRUZXN0LnRocmlmdCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGVhZCBvZiBob3N0IGFuZCBwb3J0CiAgICAgICAtLW5hbWVkLXBpcGUgYXJnICAgICAgICAgICAgV2luZG93cyBOYW1lZCBQaXBlIChlLmcuIE15VGhyaWZ0UGlwZSkKICAgICAgIC0tYW5vbi1waXBlcyBoUmVhZCBoV3JpdGUgICBXaW5kb3dzIEFub255bW91cyBQaXBlcyBwYWlyIChoYW5kbGVzKQpAQCAtNDMsMzIgKzE1MSwzNSBAQAogICAgICAgLS1wcm90b2NvbCBhcmcgKD1iaW5hcnkpICAgIFByb3RvY29sOiBiaW5hcnksIGNvbXBhY3QsIGpzb24KICAgICAgIC0tc3NsICAgICAgICAgICAgICAgICAgICAgICBFbmNyeXB0ZWQgVHJhbnNwb3J0IHVzaW5nIFNTTAogICAgICAgLW4gWyAtLXRlc3Rsb29wcyBdIGFyZyAoPTEpIE51bWJlciBvZiBUZXN0cwotICAgICAgLXQgWyAtLXRocmVhZHMgXSBhcmcgKD0xKSAgIE51bWJlciBvZiBUZXN0IHRocmVhZHMgCisgICAgICAtdCBbIC0tdGhyZWFkcyBdIGFyZyAoPTEpICAgTnVtYmVyIG9mIFRlc3QgdGhyZWFkcwogCiBJZiB5b3UgaGF2ZSBleGVjdXRlZCB0aGUgKiptYWtlIGNoZWNrKiogb3IgKiptYWtlIGNyb3NzKiogdGhlbiB5b3Ugd2lsbCBiZSBhYmxlIHRvIGJyb3dzZQogW2dlbi1odG1sL1RocmlmdFRlc3QuaHRtbF0oZ2VuLWh0bWwvVGhyaWZ0VGVzdC5odG1sKSB3aXRoIHRoZSB0ZXN0IGRvY3VtZW50YXRpb24uCiAKLVRoZSByZXR1cm4gY29kZSAoZXhpdCBjb2RlKSBzaGFsbCBiZSAwIG9uIHN1Y2Nlc3MsIG9yIGFuIGludGVnZXIgaW4gdGhlIHJhbmdlIDEgLSAyNTUgb24gZXJyb3JzLiAKLUluIG9yZGVyIHRvIHNpZ25hbCBmYWlsZWQgdGVzdHMsIHRoZSByZXR1cm4gY29kZSBzaGFsbCBiZSBjb21wb3NlZCBmcm9tIHRoZXNlIGJpdHMgdG8gaW5kaWNhdGUgCisjIyMgUmV0dXJuIGNvZGUKKworVGhlIHJldHVybiBjb2RlIChleGl0IGNvZGUpIHNoYWxsIGJlIDAgb24gc3VjY2Vzcywgb3IgYW4gaW50ZWdlciBpbiB0aGUgcmFuZ2UgMSAtIDI1NSBvbiBlcnJvcnMuCitJbiBvcmRlciB0byBzaWduYWwgZmFpbGVkIHRlc3RzLCB0aGUgcmV0dXJuIGNvZGUgc2hhbGwgYmUgY29tcG9zZWQgZnJvbSB0aGVzZSBiaXRzIHRvIGluZGljYXRlCiBmYWlsaW5nIHRlc3RzOgogCiAgICAgICAjZGVmaW5lIFRFU1RfQkFTRVRZUEVTICAgICAxICAvLyAwMDAwIDAwMDEKICAgICAgICNkZWZpbmUgVEVTVF9TVFJVQ1RTICAgICAgIDIgIC8vIDAwMDAgMDAxMAogICAgICAgI2RlZmluZSBURVNUX0NPTlRBSU5FUlMgICAgNCAgLy8gMDAwMCAwMTAwCiAgICAgICAjZGVmaW5lIFRFU1RfRVhDRVBUSU9OUyAgICA4ICAvLyAwMDAwIDEwMDAKLSAgICAgICNkZWZpbmUgVEVTVF9OT1RVU0VEICAgICAyNDAgIC8vIDExMTEgMDAwMCAocmVzZXJ2ZWQgYml0cykKKyAgICAgICNkZWZpbmUgVEVTVF9VTktOT1dOICAgICAgNjQgIC8vIDAxMDAgMDAwMCAoRmFpbGVkIHRvIHByZXBhcmUgZW52aXJvbmVtdCBldGMuKQorICAgICAgI2RlZmluZSBURVNUX1RJTUVPVVQgICAgIDEyOCAgLy8gMTAwMCAwMDAwCisgICAgICAjZGVmaW5lIFRFU1RfTk9UVVNFRCAgICAgIDQ4ICAvLyAwMDExIDAwMDAgKHJlc2VydmVkIGJpdHMpCiAKIFRlc3RzIHRoYXQgaGF2ZSBub3QgYmVlbiBleGVjdXRlZCBhdCBhbGwgY291bnQgYXMgZXJyb3JzLgotCSAgCi0jIyMgRXhhbXBsZTogCiAKLUR1cmluZyB0ZXN0cywgdGhlIHRlc3QgY2xpZW50IG5vdGljZXMgdGhhdCBzb21lIG9mIHRoZSBTdHJ1Y3QgdGVzdHMgZmFpbC4gCi1GdXJ0aGVybW9yZSwgZHVlIHRvIHNvbWUgb3RoZXIgcHJvYmxlbSBub25lIG9mIHRoZSBFeGNlcHRpb24gdGVzdHMgaXMgZXhlY3V0ZWQuIAotVGhlcmVmb3JlLCB0aGUgdGVzdCBjbGllbnQgcmV0dXJucyB0aGUgY29kZSBgMTAgPSAyIHwgOGAsIGluZGljYXRpbmcgdGhlIGZhaWx1cmUgCi1vZiBib3RoIHRlc3QgMiAoVEVTVF9TVFJVQ1RTKSBhbmQgdGVzdCA4IChURVNUX0VYQ0VQVElPTlMpLiAKKyoqRXhhbXBsZToqKgorCitEdXJpbmcgdGVzdHMsIHRoZSB0ZXN0IGNsaWVudCBub3RpY2VzIHRoYXQgc29tZSBvZiB0aGUgU3RydWN0IHRlc3RzIGZhaWwuCitGdXJ0aGVybW9yZSwgZHVlIHRvIHNvbWUgb3RoZXIgcHJvYmxlbSBub25lIG9mIHRoZSBFeGNlcHRpb24gdGVzdHMgaXMgZXhlY3V0ZWQuCitUaGVyZWZvcmUsIHRoZSB0ZXN0IGNsaWVudCByZXR1cm5zIHRoZSBjb2RlIGAxMCA9IDIgfCA4YCwgaW5kaWNhdGluZyB0aGUgZmFpbHVyZQorb2YgYm90aCB0ZXN0IDIgKFRFU1RfU1RSVUNUUykgYW5kIHRlc3QgOCAoVEVTVF9FWENFUFRJT05TKS4KIAogCiAjIyBTU0wKIFRlc3QgS2V5cyBhbmQgQ2VydGlmaWNhdGVzIGFyZSBwcm92aWRlZCBpbiBtdWx0aXBsZSBmb3JtYXRzIHVuZGVyIHRoZSBmb2xsb3dpbmcKIGRpcmVjdG9yeSBbdGVzdC9rZXlzXShrZXlzKQotCmRpZmYgLS1naXQgYS90ZXN0L1N0cmVzc1Rlc3QudGhyaWZ0IGIvdGVzdC9TdHJlc3NUZXN0LnRocmlmdAppbmRleCBjY2YyMmFmLi40MzE4MTFiIDEwMDY0NAotLS0gYS90ZXN0L1N0cmVzc1Rlc3QudGhyaWZ0CisrKyBiL3Rlc3QvU3RyZXNzVGVzdC50aHJpZnQKQEAgLTI0LDEyICsyNCwxMiBAQAogc2VydmljZSBTZXJ2aWNlIHsKIAogICB2b2lkIGVjaG9Wb2lkKCksCi0gIGJ5dGUgZWNob0J5dGUoMTogYnl0ZSBhcmcpLAorICBpOCBlY2hvQnl0ZSgxOiBpOCBhcmcpLAogICBpMzIgZWNob0kzMigxOiBpMzIgYXJnKSwKICAgaTY0IGVjaG9JNjQoMTogaTY0IGFyZyksCiAgIHN0cmluZyBlY2hvU3RyaW5nKDE6IHN0cmluZyBhcmcpLAotICBsaXN0PGJ5dGU+ICBlY2hvTGlzdCgxOiBsaXN0PGJ5dGU+IGFyZyksCi0gIHNldDxieXRlPiAgZWNob1NldCgxOiBzZXQ8Ynl0ZT4gYXJnKSwKLSAgbWFwPGJ5dGUsIGJ5dGU+ICBlY2hvTWFwKDE6IG1hcDxieXRlLCBieXRlPiBhcmcpLAorICBsaXN0PGk4PiAgZWNob0xpc3QoMTogbGlzdDxpOD4gYXJnKSwKKyAgc2V0PGk4PiAgZWNob1NldCgxOiBzZXQ8aTg+IGFyZyksCisgIG1hcDxpOCwgaTg+ICBlY2hvTWFwKDE6IG1hcDxpOCwgaTg+IGFyZyksCiB9CiAKZGlmZiAtLWdpdCBhL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQgYi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CmluZGV4IDA2MWE1NzAuLjM0OTlhYjUgMTAwNjQ0Ci0tLSBhL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKKysrIGIvdGVzdC9UaHJpZnRUZXN0LnRocmlmdApAQCAtMzYsNiArMzYsOCBAQAogbmFtZXNwYWNlIGRlbHBoaSBUaHJpZnQuVGVzdAogbmFtZXNwYWNlIGNvY29hIFRocmlmdFRlc3QKIG5hbWVzcGFjZSBsdWEgVGhyaWZ0VGVzdAorbmFtZXNwYWNlIHhzZCB0ZXN0ICh1cmkgPSAnaHR0cDovL3RocmlmdC5hcGFjaGUub3JnL25zL1RocmlmdFRlc3QnKQorbmFtZXNwYWNlIG5ldGNvcmUgVGhyaWZ0VGVzdAogCiAvLyBQcmVzZW5jZSBvZiBuYW1lc3BhY2VzIGFuZCBzdWItbmFtZXNwYWNlcyBmb3Igd2hpY2ggdGhlcmUgaXMKIC8vIG5vIGdlbmVyYXRvciBzaG91bGQgY29tcGlsZSB3aXRoIHdhcm5pbmdzIG9ubHkKQEAgLTc5LDE0ICs4MSwxNCBAQAogc3RydWN0IFh0cnVjdAogewogICAxOiAgc3RyaW5nIHN0cmluZ190aGluZywKLSAgNDogIGJ5dGUgICBieXRlX3RoaW5nLAorICA0OiAgaTggICAgIGJ5dGVfdGhpbmcsCiAgIDk6ICBpMzIgICAgaTMyX3RoaW5nLAogICAxMTogaTY0ICAgIGk2NF90aGluZwogfQogCiBzdHJ1Y3QgWHRydWN0MgogewotICAxOiBieXRlICAgYnl0ZV90aGluZywKKyAgMTogaTggICAgIGJ5dGVfdGhpbmcsICAvLyB1c2VkIHRvIGJlIGJ5dGUsIGhlbmNlIHRoZSBuYW1lCiAgIDI6IFh0cnVjdCBzdHJ1Y3RfdGhpbmcsCiAgIDM6IGkzMiAgICBpMzJfdGhpbmcKIH0KQEAgLTEwNCwxNSArMTA2LDI0IEBACiB7CiAgIDE6IG1hcDxOdW1iZXJ6LCBVc2VySWQ+IHVzZXJNYXAsCiAgIDI6IGxpc3Q8WHRydWN0PiB4dHJ1Y3RzCi19Cit9IChweXRob24uaW1tdXRhYmxlPSAiIikKIAogc3RydWN0IENyYXp5TmVzdGluZyB7CiAgIDE6IHN0cmluZyBzdHJpbmdfZmllbGQsCiAgIDI6IG9wdGlvbmFsIHNldDxJbnNhbml0eT4gc2V0X2ZpZWxkLAotICAzOiByZXF1aXJlZCBsaXN0PCBtYXA8c2V0PGkzMj4sbWFwPGkzMixzZXQ8bGlzdDxtYXA8SW5zYW5pdHksc3RyaW5nPj4+Pj4+IGxpc3RfZmllbGQsCisgIC8vIERvIG5vdCBpbnNlcnQgbGluZSBicmVhayBhcyB0ZXN0L2dvL01ha2VmaWxlLmFtIGlzIHJlbW92aW5nIHRoaXMgbGluZSB3aXRoIHBhdHRlcm4gbWF0Y2gKKyAgMzogcmVxdWlyZWQgbGlzdDxtYXA8c2V0PGkzMj4gKHB5dGhvbi5pbW11dGFibGUgPSAiIiksIG1hcDxpMzIsc2V0PGxpc3Q8bWFwPEluc2FuaXR5LHN0cmluZz4ocHl0aG9uLmltbXV0YWJsZSA9ICIiKT4gKHB5dGhvbi5pbW11dGFibGUgPSAiIik+Pj4+IGxpc3RfZmllbGQsCiAgIDQ6IGJpbmFyeSBiaW5hcnlfZmllbGQKIH0KIAordW5pb24gU29tZVVuaW9uIHsKKyAgMTogbWFwPE51bWJlcnosIFVzZXJJZD4gbWFwX3RoaW5nLAorICAyOiBzdHJpbmcgc3RyaW5nX3RoaW5nLAorICAzOiBpMzIgaTMyX3RoaW5nLAorICA0OiBYdHJ1Y3QzIHh0cnVjdF90aGluZywKKyAgNTogSW5zYW5pdHkgaW5zYW5pdHlfdGhpbmcKK30KKwogZXhjZXB0aW9uIFhjZXB0aW9uIHsKICAgMTogaTMyIGVycm9yQ29kZSwKICAgMjogc3RyaW5nIG1lc3NhZ2UKQEAgLTE0NCwxMSArMTU1LDE5IEBACiAgIHN0cmluZyAgICAgICB0ZXN0U3RyaW5nKDE6IHN0cmluZyB0aGluZyksCiAKICAgLyoqCi0gICAqIFByaW50cyAndGVzdEJ5dGUoIiVkIiknIHdpdGggdGhpbmcgYXMgJyVkJwotICAgKiBAcGFyYW0gYnl0ZSB0aGluZyAtIHRoZSBieXRlIHRvIHByaW50Ci0gICAqIEByZXR1cm4gYnl0ZSAtIHJldHVybnMgdGhlIGJ5dGUgJ3RoaW5nJworICAgKiBQcmludHMgJ3Rlc3RCb29sKCIlcyIpJyB3aGVyZSAnJXMnIHdpdGggdGhpbmcgYXMgJ3RydWUnIG9yICdmYWxzZScKKyAgICogQHBhcmFtIGJvb2wgIHRoaW5nIC0gdGhlIGJvb2wgZGF0YSB0byBwcmludAorICAgKiBAcmV0dXJuIGJvb2wgIC0gcmV0dXJucyB0aGUgYm9vbCAndGhpbmcnCiAgICAqLwotICBieXRlICAgICAgICAgdGVzdEJ5dGUoMTogYnl0ZSB0aGluZyksCisgIGJvb2wgICAgICAgICB0ZXN0Qm9vbCgxOiBib29sIHRoaW5nKSwKKworICAvKioKKyAgICogUHJpbnRzICd0ZXN0Qnl0ZSgiJWQiKScgd2l0aCB0aGluZyBhcyAnJWQnCisgICAqIFRoZSB0eXBlcyBpOCBhbmQgYnl0ZSBhcmUgc3lub255bXMsIHVzZSBvZiBpOCBpcyBlbmNvdXJhZ2VkLCBieXRlIHN0aWxsIGV4aXN0cyBmb3IgdGhlIHNha2Ugb2YgY29tcGF0aWJpbGl0eS4KKyAgICogQHBhcmFtIGJ5dGUgdGhpbmcgLSB0aGUgaTgvYnl0ZSB0byBwcmludAorICAgKiBAcmV0dXJuIGk4IC0gcmV0dXJucyB0aGUgaTgvYnl0ZSAndGhpbmcnCisgICAqLworICBpOCAgICAgICAgICAgdGVzdEJ5dGUoMTogaTggdGhpbmcpLAogCiAgIC8qKgogICAgKiBQcmludHMgJ3Rlc3RJMzIoIiVkIiknIHdpdGggdGhpbmcgYXMgJyVkJwpAQCAtMTcyLDcgKzE5MSwxNCBAQAogICBkb3VibGUgICAgICAgdGVzdERvdWJsZSgxOiBkb3VibGUgdGhpbmcpLAogCiAgIC8qKgotICAgKiBQcmludHMgJ3Rlc3RTdHJ1Y3QoInslc30iKScgd2hlcmUgdGhpbmcgaGFzIGJlZW4gZm9ybWF0dGVkIGludG8gYSBzdHJpbmcgb2YgY29tbWEgc2VwZXJhdGVkIHZhbHVlcworICAgKiBQcmludHMgJ3Rlc3RCaW5hcnkoIiVzIiknIHdoZXJlICclcycgaXMgYSBoZXgtZm9ybWF0dGVkIHN0cmluZyBvZiB0aGluZydzIGRhdGEKKyAgICogQHBhcmFtIGJpbmFyeSAgdGhpbmcgLSB0aGUgYmluYXJ5IGRhdGEgdG8gcHJpbnQKKyAgICogQHJldHVybiBiaW5hcnkgIC0gcmV0dXJucyB0aGUgYmluYXJ5ICd0aGluZycKKyAgICovCisgIGJpbmFyeSAgICAgICB0ZXN0QmluYXJ5KDE6IGJpbmFyeSB0aGluZyksCisKKyAgLyoqCisgICAqIFByaW50cyAndGVzdFN0cnVjdCgieyVzfSIpJyB3aGVyZSB0aGluZyBoYXMgYmVlbiBmb3JtYXR0ZWQgaW50byBhIHN0cmluZyBvZiBjb21tYSBzZXBhcmF0ZWQgdmFsdWVzCiAgICAqIEBwYXJhbSBYdHJ1Y3QgdGhpbmcgLSB0aGUgWHRydWN0IHRvIHByaW50CiAgICAqIEByZXR1cm4gWHRydWN0IC0gcmV0dXJucyB0aGUgWHRydWN0ICd0aGluZycKICAgICovCkBAIC0xODcsNyArMjEzLDcgQEAKIAogICAvKioKICAgICogUHJpbnRzICd0ZXN0TWFwKCJ7JXMiKScgd2hlcmUgdGhpbmcgaGFzIGJlZW4gZm9ybWF0dGVkIGludG8gYSBzdHJpbmcgb2YgICdrZXkgPT4gdmFsdWUnIHBhaXJzCi0gICAqICBzZXBlcmF0ZWQgYnkgY29tbWFzIGFuZCBuZXcgbGluZXMKKyAgICogIHNlcGFyYXRlZCBieSBjb21tYXMgYW5kIG5ldyBsaW5lcwogICAgKiBAcGFyYW0gbWFwPGkzMixpMzI+IHRoaW5nIC0gdGhlIG1hcDxpMzIsaTMyPiB0byBwcmludAogICAgKiBAcmV0dXJuIG1hcDxpMzIsaTMyPiAtIHJldHVybnMgdGhlIG1hcDxpMzIsaTMyPiAndGhpbmcnCiAgICAqLwpAQCAtMTk1LDcgKzIyMSw3IEBACiAKICAgLyoqCiAgICAqIFByaW50cyAndGVzdFN0cmluZ01hcCgieyVzfSIpJyB3aGVyZSB0aGluZyBoYXMgYmVlbiBmb3JtYXR0ZWQgaW50byBhIHN0cmluZyBvZiAgJ2tleSA9PiB2YWx1ZScgcGFpcnMKLSAgICogIHNlcGVyYXRlZCBieSBjb21tYXMgYW5kIG5ldyBsaW5lcworICAgKiAgc2VwYXJhdGVkIGJ5IGNvbW1hcyBhbmQgbmV3IGxpbmVzCiAgICAqIEBwYXJhbSBtYXA8c3RyaW5nLHN0cmluZz4gdGhpbmcgLSB0aGUgbWFwPHN0cmluZyxzdHJpbmc+IHRvIHByaW50CiAgICAqIEByZXR1cm4gbWFwPHN0cmluZyxzdHJpbmc+IC0gcmV0dXJucyB0aGUgbWFwPHN0cmluZyxzdHJpbmc+ICd0aGluZycKICAgICovCkBAIC0yMDMsNyArMjI5LDcgQEAKIAogICAvKioKICAgICogUHJpbnRzICd0ZXN0U2V0KCJ7JXN9IiknIHdoZXJlIHRoaW5nIGhhcyBiZWVuIGZvcm1hdHRlZCBpbnRvIGEgc3RyaW5nIG9mICB2YWx1ZXMKLSAgICogIHNlcGVyYXRlZCBieSBjb21tYXMgYW5kIG5ldyBsaW5lcworICAgKiAgc2VwYXJhdGVkIGJ5IGNvbW1hcyBhbmQgbmV3IGxpbmVzCiAgICAqIEBwYXJhbSBzZXQ8aTMyPiB0aGluZyAtIHRoZSBzZXQ8aTMyPiB0byBwcmludAogICAgKiBAcmV0dXJuIHNldDxpMzI+IC0gcmV0dXJucyB0aGUgc2V0PGkzMj4gJ3RoaW5nJwogICAgKi8KQEAgLTIxMSw3ICsyMzcsNyBAQAogCiAgIC8qKgogICAgKiBQcmludHMgJ3Rlc3RMaXN0KCJ7JXN9IiknIHdoZXJlIHRoaW5nIGhhcyBiZWVuIGZvcm1hdHRlZCBpbnRvIGEgc3RyaW5nIG9mICB2YWx1ZXMKLSAgICogIHNlcGVyYXRlZCBieSBjb21tYXMgYW5kIG5ldyBsaW5lcworICAgKiAgc2VwYXJhdGVkIGJ5IGNvbW1hcyBhbmQgbmV3IGxpbmVzCiAgICAqIEBwYXJhbSBsaXN0PGkzMj4gdGhpbmcgLSB0aGUgbGlzdDxpMzI+IHRvIHByaW50CiAgICAqIEByZXR1cm4gbGlzdDxpMzI+IC0gcmV0dXJucyB0aGUgbGlzdDxpMzI+ICd0aGluZycKICAgICovCkBAIC0yNTQsNyArMjgwLDcgQEAKIAogICAvKioKICAgICogUHJpbnRzICd0ZXN0TXVsdGkoKScKLSAgICogQHBhcmFtIGJ5dGUgYXJnMCAtCisgICAqIEBwYXJhbSBpOCBhcmcwIC0KICAgICogQHBhcmFtIGkzMiBhcmcxIC0KICAgICogQHBhcmFtIGk2NCBhcmcyIC0KICAgICogQHBhcmFtIG1hcDxpMTYsIHN0cmluZz4gYXJnMyAtCkBAIC0yNjMsNyArMjg5LDcgQEAKICAgICogQHJldHVybiBYdHJ1Y3QgLSByZXR1cm5zIGFuIFh0cnVjdCB3aXRoIHN0cmluZ190aGluZyA9ICJIZWxsbzIsIGJ5dGVfdGhpbmcgPSBhcmcwLCBpMzJfdGhpbmcgPSBhcmcxCiAgICAqICAgIGFuZCBpNjRfdGhpbmcgPSBhcmcyCiAgICAqLwotICBYdHJ1Y3QgdGVzdE11bHRpKDE6IGJ5dGUgYXJnMCwgMjogaTMyIGFyZzEsIDM6IGk2NCBhcmcyLCA0OiBtYXA8aTE2LCBzdHJpbmc+IGFyZzMsIDU6IE51bWJlcnogYXJnNCwgNjogVXNlcklkIGFyZzUpLAorICBYdHJ1Y3QgdGVzdE11bHRpKDE6IGk4IGFyZzAsIDI6IGkzMiBhcmcxLCAzOiBpNjQgYXJnMiwgNDogbWFwPGkxNiwgc3RyaW5nPiBhcmczLCA1OiBOdW1iZXJ6IGFyZzQsIDY6IFVzZXJJZCBhcmc1KSwKIAogICAvKioKICAgICogUHJpbnQgJ3Rlc3RFeGNlcHRpb24oJXMpJyB3aXRoIGFyZyBhcyAnJXMnCkBAIC0yNzgsNyArMzA0LDcgQEAKICAgICogUHJpbnQgJ3Rlc3RNdWx0aUV4Y2VwdGlvbiglcywgJXMpJyB3aXRoIGFyZzAgYXMgJyVzJyBhbmQgYXJnMSBhcyAnJXMnCiAgICAqIEBwYXJhbSBzdHJpbmcgYXJnIC0gYSBzdHJpbmcgaW5kaWNhdGlvbiB3aGF0IHR5cGUgb2YgZXhjZXB0aW9uIHRvIHRocm93CiAgICAqIGlmIGFyZzAgPT0gIlhjZXB0aW9uIiB0aHJvdyBYY2VwdGlvbiB3aXRoIGVycm9yQ29kZSA9IDEwMDEgYW5kIG1lc3NhZ2UgPSAiVGhpcyBpcyBhbiBYY2VwdGlvbiIKLSAgICogZWxzZW4gaWYgYXJnMCA9PSAiWGNlcHRpb24yIiB0aHJvdyBYY2VwdGlvbjIgd2l0aCBlcnJvckNvZGUgPSAyMDAyIGFuZCBtZXNzYWdlID0gIlRoaXMgaXMgYW4gWGNlcHRpb24yIgorICAgKiBlbHNlbiBpZiBhcmcwID09ICJYY2VwdGlvbjIiIHRocm93IFhjZXB0aW9uMiB3aXRoIGVycm9yQ29kZSA9IDIwMDIgYW5kIHN0cnVjdF90aGluZy5zdHJpbmdfdGhpbmcgPSAiVGhpcyBpcyBhbiBYY2VwdGlvbjIiCiAgICAqIGVsc2UgZG8gbm90IHRocm93IGFueXRoaW5nCiAgICAqIEByZXR1cm4gWHRydWN0IC0gYW4gWHRydWN0IHdpdGggc3RyaW5nX3RoaW5nID0gYXJnMQogICAgKi8KQEAgLTI5NSwxMyArMzIxLDEyIEBACiAKIHNlcnZpY2UgU2Vjb25kU2VydmljZQogewotICB2b2lkIGJsYWhCbGFoKCkKICAgLyoqCiAgICAqIFByaW50cyAndGVzdFN0cmluZygiJXMiKScgd2l0aCB0aGluZyBhcyAnJXMnCiAgICAqIEBwYXJhbSBzdHJpbmcgdGhpbmcgLSB0aGUgc3RyaW5nIHRvIHByaW50CiAgICAqIEByZXR1cm4gc3RyaW5nIC0gcmV0dXJucyB0aGUgc3RyaW5nICd0aGluZycKICAgICovCi0gIHN0cmluZyAgICAgICBzZWNvbmR0ZXN0U3RyaW5nKDE6IHN0cmluZyB0aGluZyksCisgIHN0cmluZyBzZWNvbmR0ZXN0U3RyaW5nKDE6IHN0cmluZyB0aGluZykKIH0KIAogc3RydWN0IFZlcnNpb25pbmdUZXN0VjEgewpAQCAtMzE0LDcgKzMzOSw3IEBACiAgICAgICAgMTogaTMyIGJlZ2luX2luX2JvdGgsCiAKICAgICAgICAyOiBpMzIgbmV3aW50LAotICAgICAgIDM6IGJ5dGUgbmV3Ynl0ZSwKKyAgICAgICAzOiBpOCBuZXdieXRlLAogICAgICAgIDQ6IGkxNiBuZXdzaG9ydCwKICAgICAgICA1OiBpNjQgbmV3bG9uZywKICAgICAgICA2OiBkb3VibGUgbmV3ZG91YmxlCmRpZmYgLS1naXQgYS90ZXN0L1Vuc2FmZVR5cGVzLnRocmlmdCBiL3Rlc3QvVW5zYWZlVHlwZXMudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzOGM5MDUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L1Vuc2FmZVR5cGVzLnRocmlmdApAQCAtMCwwICsxLDI0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK25hbWVzcGFjZSBqYXZhIHRocmlmdC50ZXN0CisKK3N0cnVjdCBVbnNhZmVCeXRlcyB7CisgIDE6IGJpbmFyeSBieXRlczsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvYXVkaXQvUkVBRE1FLm1kIGIvdGVzdC9hdWRpdC9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDEyZjhkNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYXVkaXQvUkVBRE1FLm1kCkBAIC0wLDAgKzEsNDAgQEAKK1R5cGljYWwgdXNhZ2UKKz09PT09PT09PT09PT0KK2BgYAordGhyaWZ0LmV4ZSAtLWF1ZGl0IDxvbGRGaWxlPiA8bmV3RmlsZT4KK2BgYAorRXhhbXBsZSBydW4KKz09PT09PT09PT09CitgYGAKKz4gdGhyaWZ0LmV4ZSAtLWF1ZGl0IHRlc3QudGhyaWZ0IGJyZWFrMS50aHJpZnQKK1tUaHJpZnQgQXVkaXQgRmFpbHVyZTpicmVhazEudGhyaWZ0XSBOZXcgVGhyaWZ0IEZpbGUgaGFzIG1pc3NpbmcgZnVuY3Rpb24gYmFzZV9mdW5jdGlvbjMKK1tUaHJpZnQgQXVkaXQgV2FybmluZzpicmVhazEudGhyaWZ0XSBDb25zdGFudCBjb25zdDMgaGFzIGRpZmZlcmVudCB2YWx1ZQorYGBgCisKK1Byb2JsZW1zIHRoYXQgdGhlIGF1ZGl0IHRvb2wgY2FuIGNhdGNoCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorRXJyb3JzCisqIFJlbW92aW5nIGFuIGVudW0gdmFsdWUKKyogQ2hhbmdpbmcgdGhlIHR5cGUgb2YgYSBzdHJ1Y3QgZmllbGQKKyogQ2hhbmdpbmcgdGhlIHJlcXVpcmVkLW5lc3Mgb2YgYSBzdHJ1Y3QgZmllbGQKKyogUmVtb3ZpbmcgYSBzdHJ1Y3QgZmllbGQKKyogQWRkaW5nIGEgcmVxdWlyZWQgc3RydWN0IGZpZWxkCisqIEFkZGluZyBhIHN0cnVjdCBmaWVsZCAnaW4gdGhlIG1pZGRsZScuICBUaGlzIHVzdWFsbHkgaW5kaWNhdGVzIGFuIG9sZCBJRCBoYXMgYmVlbiByZWN5Y2xlZAorKiBTdHJ1Y3QgcmVtb3ZlZAorKiBPbmV3YXktbmVzcyBjaGFuZ2UKKyogUmV0dXJuIHR5cGUgY2hhbmdlCisqIE1pc3NpbmcgZnVuY3Rpb24KKyogTWlzc2luZyBzZXJ2aWNlCisqIENoYW5nZSBpbiBzZXJ2aWNlIGluaGVyaXRhbmNlCisKK1dhcm5pbmdzCisqIFJlbW92aW5nIGEgbGFuZ3VhZ2UgbmFtZXNwYWNlIGRlY2xhcmF0aW9uCisqIENoYW5naW5nIGEgbmFtZXNwYWNlCisqIENoYW5naW5nIGFuIGVudW0gdmFsdWUncyBuYW1lCisqIFJlbW92aW5nIGFuIGVudW0gY2xhc3MKKyogRGVmYXVsdCB2YWx1ZSBjaGFuZ2VkCisqIFN0cnVjdCBmaWVsZCBuYW1lIGNoYW5nZQorKiBSZW1vdmVkIGNvbnN0YW50CisqIFR5cGUgb2YgY29uc3RhbnQgY2hhbmdlZAorKiBWYWx1ZSBvZiBjb25zdGFudCBjaGFuZ2VkCisgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9hdWRpdC9icmVhazEudGhyaWZ0IGIvdGVzdC9hdWRpdC9icmVhazEudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3N2Y2NzIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2F1ZGl0L2JyZWFrMS50aHJpZnQKQEAgLTAsMCArMSwxODggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy9UaHJpZnQgTWV0aG9kIHJlbW92ZWQgZnJvbSBzZXJ2aWNlIGJhc2UuCisKK25hbWVzcGFjZSBjcHAgdGVzdAorCisvL2NvbnN0YW50cworY29uc3QgaTMyIGNvbnN0MSA9IDEyMzsKK2NvbnN0IGRvdWJsZSBjb25zdDIgPSAyMy4zOworY29uc3QgbWFwPHN0cmluZyxzdHJpbmc+IGNvbnN0MyA9IHsiaGVsbG8iOiJ3b3JsZCIsICJ0aHJpZnQiOiJhdWRpdCJ9OworCisvL0V4Y2VwdGlvbgorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMSB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CitleGNlcHRpb24gdGVzdF9leGNlcHRpb24yIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KKworLy9FbnVtcworCitlbnVtIHRlc3RfZW51bTEgeworICAgIGVudW0xX3ZhbHVlMCA9IDAsCisgICAgZW51bTFfdmFsdWUxID0gMSwKKyAgICBlbnVtMV92YWx1ZTIgPSAyLAorICAgIGVudW0xX3ZhbHVlNSA9IDUsCisgICAgZW51bTFfdmFsdWU3ID0gNywKKyAgICBlbnVtMV92YWx1ZTggPSA4Cit9CisKK2VudW0gdGVzdF9lbnVtMiB7CisgICAgZW51bTJfdmFsdWUwID0gMCwKKyAgICBlbnVtMl92YWx1ZTEgPSAxLAorICAgIGVudW0yX3ZhbHVlMiA9IDIsCisgICAgZW51bTJfdmFsdWUzID0gMworfQorCitlbnVtIHRlc3RfZW51bTMgeworICAgIGVudW0zX3ZhbHVlMSA9IDAsCisgICAgZW51bTNfdmFsdWUyID0gMQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QxIHsKKyAgICAxOiBpMTYgc3RydWN0MV9tZW1iZXIxLAorICAgIDI6IGkzMiBzdHJ1Y3QxX21lbWJlcjIsCisgICAgMzogaTY0IHN0cnVjdDFfbWVtYmVyMywKKyAgICA0OiBkb3VibGUgc3RydWN0MV9tZW1iZXI0ID0gMi41LAorICAgIDU6IHN0cmluZyBzdHJ1Y3QxX21lbWJlcjUgPSAiQXVkaXQgdGVzdCIsCisgICAgNjogYm9vbCBzdHJ1Y3QxX21lbWJlcjYsCisgICAgNzogYnl0ZSBzdHJ1Y3QxX21lbWJlcjcsCisgICAgODogYmluYXJ5IHN0cnVjdDFfbWVtYmVyOCwKKyAgICA5OiB0ZXN0X2VudW0xIHN0cnVjdDFfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QyIHsKKyAgICAxOiBsaXN0PGkxNj4gc3RydWN0Ml9tZW1iZXIxLAorICAgIDI6IGxpc3Q8aTMyPiBzdHJ1Y3QyX21lbWJlcjIsCisgICAgMzogbGlzdDxpNjQ+IHN0cnVjdDJfbWVtYmVyMz0gWzIzLCAzMl0sCisgICAgNDogbGlzdDxkb3VibGU+IHN0cnVjdDJfbWVtYmVyNCwKKyAgICA1OiBsaXN0PHN0cmluZz4gc3RydWN0Ml9tZW1iZXI1LAorICAgIDY6IGxpc3Q8Ym9vbD4gc3RydWN0Ml9tZW1iZXI2LAorICAgIDc6IGxpc3Q8Ynl0ZT4gc3RydWN0Ml9tZW1iZXI3LAorICAgIDg6IGxpc3Q8YmluYXJ5PiBzdHJ1Y3QyX21lbWJlcjgsCisgICAgOTogbGlzdDx0ZXN0X2VudW0xPiBzdHJ1Y3QyX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MyB7CisgICAgMTogbWFwPGkxNiwgaTMyPiBzdHJ1Y3QzX21lbWJlcjEgPSB7MToyLCAzOjR9LAorICAgIDI6IG1hcDxpNjQsIGRvdWJsZT4gc3RydWN0M19tZW1iZXIyID0gezEwOjEuMSwgMjA6Mi4xfSwKKyAgICAzOiBtYXA8c3RyaW5nLCBib29sPiBzdHJ1Y3QzX21lbWJlcjMsCisgICAgNDogbWFwPGJ5dGUsIHRlc3RfZW51bTE+IHN0cnVjdDNfbWVtYmVyNCwKKyAgICA1OiBtYXA8dGVzdF9lbnVtMiwgdGVzdF9lbnVtMyA+IHN0cnVjdDNfbWVtYmVyNSwKKyAgICA3OiBtYXA8ZG91YmxlLCBzdHJpbmc+IHN0cnVjdDNfbWVtYmVyNworfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q0IHsKKyAgICAxOiBpMzIgc3RydWN0NF9tZW1iZXIxLAorICAgIDI6IG9wdGlvbmFsIGkzMiBzdHJ1Y3Q0X21lbWJlcjIKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NXsKKyAgICAxOiBkb3VibGUgc3RydWN0NV9tZW1iZXIxLAorICAgIDI6IHN0cmluZyBzdHJ1Y3Q1X21lbWJlcjIgPSAiVGhyaWZ0IEF1ZGl0IFRlc3QiCit9CitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q2IHsKKyAgICAxOiBpMzIgc3RydWN0Nl9tZW1iZXIxLAorICAgIDI6IHJlcXVpcmVkIGkzMiBzdHJ1Y3Q2X21lbWJlcjIKK30KKworc2VydmljZSBiYXNlIHsKKyAgICBvbmV3YXkgdm9pZCBiYXNlX29uZXdheSgKKyAgICAgICAgMTogaTMyIGFyZzEpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTE2IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBpMzIgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IGk2NCBmdW5jdGlvbjFfYXJnMywKKyAgICAgICAgNDogZG91YmxlIGZ1bmN0aW9uMV9hcmc0LAorICAgICAgICA1OiBzdHJpbmcgZnVuY3Rpb24xX2FyZzUsCisgICAgICAgIDY6IGJvb2wgZnVuY3Rpb24xX2FyZzYsCisgICAgICAgIDc6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzcsCisgICAgICAgIDg6IHRlc3Rfc3RydWN0MSBmdW5jdGlvbjFfYXJnOCksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGkxNj4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8aTMyPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnNSwKKyAgICAgICAgNjogbGlzdDxib29sPiBmdW5jdGlvbjJfYXJnNiwKKyAgICAgICAgNzogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNywKKyAgICAgICAgODogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnOCwKKyAgICAgICAgOTogbGlzdDx0ZXN0X3N0cnVjdDE+IGZ1bmN0aW9uMl9hcmc5KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCit9CisKK3NlcnZpY2UgZGVyaXZlZDEgZXh0ZW5kcyBiYXNlIHsKKyAgICAKKyAgICB0ZXN0X2VudW0xIGRlcml2ZWQxX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTY0IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBkb3VibGUgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBpNjQgZGVyaXZlZDFfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc1KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgZG91YmxlIGRlcml2ZWQxX2Z1bmN0aW9uMygKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uM19hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uM19hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgc3RyaW5nIGRlcml2ZWQxX2Z1bmN0aW9uNCgKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uNF9hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uNF9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisKKyAgICBib29sIGRlcml2ZWQxX2Z1bmN0aW9uNSgKKyAgICAgICAgMTogbWFwPGk2NCwgZG91YmxlPiBmdW5jdGlvbjVfYXJnMSwKKyAgICAgICAgMjogbWFwPHN0cmluZywgYm9vbD4gZnVuY3Rpb241X2FyZzIsCisgICAgICAgIDM6IG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBmdW5jdGlvbjVfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHRlc3Rfc3RydWN0MSBkZXJpdmVkMV9mdW5jdGlvbjYoCisgICAgICAgIDE6IGRvdWJsZSBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKK30KKworc2VydmljZSBkZXJpdmVkMiBleHRlbmRzIGJhc2UgeworCisgICAgbGlzdDxpMzI+IGRlcml2ZWQyX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTMyIGZ1bmN0aW9uMV9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorICAgIGxpc3Q8dGVzdF9lbnVtMT4gZGVyaXZlZDJfZnVuY3Rpb24yKAorICAgICAgICAxOmk2NCBmdW5jdGlvbjJfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGxpc3Q8dGVzdF9zdHJ1Y3QxPiBkZXJpdmVkMl9mdW5jdGlvbjMoCisgICAgICAgIDE6ZG91YmxlIGZ1bmN0aW9uM19hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8ZG91YmxlLCBzdHJpbmc+IGRlcml2ZWQyX2Z1bmN0aW9uNCgKKyAgICAgICAgMTpzdHJpbmcgZnVuY3Rpb240X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBkZXJpdmVkMl9mdW5jdGlvbjUoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjVfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3Rfc3RydWN0MSwgdGVzdF9zdHJ1Y3QyPiBkZXJpdmVkMl9mdW5jdGlvbjYoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorfQpkaWZmIC0tZ2l0IGEvdGVzdC9hdWRpdC9icmVhazEwLnRocmlmdCBiL3Rlc3QvYXVkaXQvYnJlYWsxMC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA2OTBhYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYXVkaXQvYnJlYWsxMC50aHJpZnQKQEAgLTAsMCArMSwxOTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy9icmVhazEwIC0gU3RydWN0IGZpZWxkIHJlbW92ZWQgZnJvbSBzdHJ1Y3QyIGlkID0xCisKK25hbWVzcGFjZSBjcHAgdGVzdAorCisvL0NvbnN0YW50cworY29uc3QgaTMyIGNvbnN0MSA9IDEyMzsKK2NvbnN0IGRvdWJsZSBjb25zdDIgPSAyMy4zOworY29uc3QgbWFwPHN0cmluZyxzdHJpbmc+IGNvbnN0MyA9IHsiaGVsbG8iOiJ3b3JsZCIsICJ0aHJpZnQiOiJhdWRpdCJ9OworCisKKy8vRXhjZXB0aW9uCitleGNlcHRpb24gdGVzdF9leGNlcHRpb24xIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjIgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorCisvL0VudW1zCisKK2VudW0gdGVzdF9lbnVtMSB7CisgICAgZW51bTFfdmFsdWUwID0gMCwKKyAgICBlbnVtMV92YWx1ZTEgPSAxLAorICAgIGVudW0xX3ZhbHVlMiA9IDIsCisgICAgZW51bTFfdmFsdWU1ID0gNSwKKyAgICBlbnVtMV92YWx1ZTcgPSA3LAorICAgIGVudW0xX3ZhbHVlOCA9IDgKK30KKworZW51bSB0ZXN0X2VudW0yIHsKKyAgICBlbnVtMl92YWx1ZTAgPSAwLAorICAgIGVudW0yX3ZhbHVlMSA9IDEsCisgICAgZW51bTJfdmFsdWUyID0gMiwKKyAgICBlbnVtMl92YWx1ZTMgPSAzCit9CisKK2VudW0gdGVzdF9lbnVtMyB7CisgICAgZW51bTNfdmFsdWUxID0gMCwKKyAgICBlbnVtM192YWx1ZTIgPSAxCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDEgeworICAgIDE6IGkxNiBzdHJ1Y3QxX21lbWJlcjEsCisgICAgMjogaTMyIHN0cnVjdDFfbWVtYmVyMiwKKyAgICAzOiBpNjQgc3RydWN0MV9tZW1iZXIzLAorICAgIDQ6IGRvdWJsZSBzdHJ1Y3QxX21lbWJlcjQgPSAyLjUsCisgICAgNTogc3RyaW5nIHN0cnVjdDFfbWVtYmVyNSA9ICJBdWRpdCB0ZXN0IiwKKyAgICA2OiBib29sIHN0cnVjdDFfbWVtYmVyNiwKKyAgICA3OiBieXRlIHN0cnVjdDFfbWVtYmVyNywKKyAgICA4OiBiaW5hcnkgc3RydWN0MV9tZW1iZXI4LAorICAgIDk6IHRlc3RfZW51bTEgc3RydWN0MV9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDIgeworICAgIDI6IGxpc3Q8aTMyPiBzdHJ1Y3QyX21lbWJlcjIsCisgICAgMzogbGlzdDxpNjQ+IHN0cnVjdDJfbWVtYmVyMyA9IFsyMywgMzJdLAorICAgIDQ6IGxpc3Q8ZG91YmxlPiBzdHJ1Y3QyX21lbWJlcjQsCisgICAgNTogbGlzdDxzdHJpbmc+IHN0cnVjdDJfbWVtYmVyNSwKKyAgICA2OiBsaXN0PGJvb2w+IHN0cnVjdDJfbWVtYmVyNiwKKyAgICA3OiBsaXN0PGJ5dGU+IHN0cnVjdDJfbWVtYmVyNywKKyAgICA4OiBsaXN0PGJpbmFyeT4gc3RydWN0Ml9tZW1iZXI4LAorICAgIDk6IGxpc3Q8dGVzdF9lbnVtMT4gc3RydWN0Ml9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDMgeworICAgIDE6IG1hcDxpMTYsIGkzMj4gc3RydWN0M19tZW1iZXIxID0gezE6MiwgMzo0fSwKKyAgICAyOiBtYXA8aTY0LCBkb3VibGU+IHN0cnVjdDNfbWVtYmVyMiA9IHsxMDoxLjEsIDIwOjIuMX0sCisgICAgMzogbWFwPHN0cmluZywgYm9vbD4gc3RydWN0M19tZW1iZXIzLAorICAgIDQ6IG1hcDxieXRlLCB0ZXN0X2VudW0xPiBzdHJ1Y3QzX21lbWJlcjQsCisgICAgNTogbWFwPHRlc3RfZW51bTIsIHRlc3RfZW51bTMgPiBzdHJ1Y3QzX21lbWJlcjUsCisgICAgNzogbWFwPGRvdWJsZSwgc3RyaW5nPiBzdHJ1Y3QzX21lbWJlcjcKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NCB7CisgICAgMTogaTMyIHN0cnVjdDRfbWVtYmVyMSwKKyAgICAyOiBvcHRpb25hbCBpMzIgc3RydWN0NF9tZW1iZXIyCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDV7CisgICAgMTogZG91YmxlIHN0cnVjdDVfbWVtYmVyMSwKKyAgICAyOiBzdHJpbmcgc3RydWN0NV9tZW1iZXIyID0gIlRocmlmdCBBdWRpdCBUZXN0IgorfQorc3RydWN0IHRlc3Rfc3RydWN0NiB7CisgICAgMTogaTMyIHN0cnVjdDZfbWVtYmVyMSwKKyAgICAyOiByZXF1aXJlZCBpMzIgc3RydWN0Nl9tZW1iZXIyCit9CisKK3NlcnZpY2UgYmFzZSB7CisgICAgb25ld2F5IHZvaWQgYmFzZV9vbmV3YXkoCisgICAgICAgIDE6IGkzMiBhcmcxKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkxNiBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogaTMyIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiBpNjQgZnVuY3Rpb24xX2FyZzMsCisgICAgICAgIDQ6IGRvdWJsZSBmdW5jdGlvbjFfYXJnNCwKKyAgICAgICAgNTogc3RyaW5nIGZ1bmN0aW9uMV9hcmc1LAorICAgICAgICA2OiBib29sIGZ1bmN0aW9uMV9hcmc2LAorICAgICAgICA3OiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmc3LAorICAgICAgICA4OiB0ZXN0X3N0cnVjdDEgZnVuY3Rpb24xX2FyZzgpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpMTY+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGkzMj4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzUsCisgICAgICAgIDY6IGxpc3Q8Ym9vbD4gZnVuY3Rpb24yX2FyZzYsCisgICAgICAgIDc6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzcsCisgICAgICAgIDg6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzgsCisgICAgICAgIDk6IGxpc3Q8dGVzdF9zdHJ1Y3QxPiBmdW5jdGlvbjJfYXJnOSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjMoKSwKKworfQorCitzZXJ2aWNlIGRlcml2ZWQxIGV4dGVuZHMgYmFzZSB7CisgICAgCisgICAgdGVzdF9lbnVtMSBkZXJpdmVkMV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGk2NCBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogZG91YmxlIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgaTY0IGRlcml2ZWQxX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnNSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGRvdWJsZSBkZXJpdmVkMV9mdW5jdGlvbjMoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjNfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjNfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHN0cmluZyBkZXJpdmVkMV9mdW5jdGlvbjQoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjRfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjRfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworCisgICAgYm9vbCBkZXJpdmVkMV9mdW5jdGlvbjUoCisgICAgICAgIDE6IG1hcDxpNjQsIGRvdWJsZT4gZnVuY3Rpb241X2FyZzEsCisgICAgICAgIDI6IG1hcDxzdHJpbmcsIGJvb2w+IGZ1bmN0aW9uNV9hcmcyLAorICAgICAgICAzOiBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZnVuY3Rpb241X2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB0ZXN0X3N0cnVjdDEgZGVyaXZlZDFfZnVuY3Rpb242KAorICAgICAgICAxOiBkb3VibGUgZnVuY3Rpb242X2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCit9CisKK3NlcnZpY2UgZGVyaXZlZDIgZXh0ZW5kcyBiYXNlIHsKKworICAgIGxpc3Q8aTMyPiBkZXJpdmVkMl9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkzMiBmdW5jdGlvbjFfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKKyAgICBsaXN0PHRlc3RfZW51bTE+IGRlcml2ZWQyX2Z1bmN0aW9uMigKKyAgICAgICAgMTppNjQgZnVuY3Rpb24yX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBsaXN0PHRlc3Rfc3RydWN0MT4gZGVyaXZlZDJfZnVuY3Rpb24zKAorICAgICAgICAxOmRvdWJsZSBmdW5jdGlvbjNfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPGRvdWJsZSwgc3RyaW5nPiBkZXJpdmVkMl9mdW5jdGlvbjQoCisgICAgICAgIDE6c3RyaW5nIGZ1bmN0aW9uNF9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZGVyaXZlZDJfZnVuY3Rpb241KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb241X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X3N0cnVjdDEsIHRlc3Rfc3RydWN0Mj4gZGVyaXZlZDJfZnVuY3Rpb242KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb242X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKK30KZGlmZiAtLWdpdCBhL3Rlc3QvYXVkaXQvYnJlYWsxMS50aHJpZnQgYi90ZXN0L2F1ZGl0L2JyZWFrMTEudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0ZTBhN2QKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2F1ZGl0L2JyZWFrMTEudGhyaWZ0CkBAIC0wLDAgKzEsMTkwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vYnJlYWsxMSAtIFN0cnVjdCBmaWVsZCByZW1vdmVkIGZyb20gc3RydWN0MyBpZCA9NworCituYW1lc3BhY2UgY3BwIHRlc3QKKworLy9Db25zdGFudHMKK2NvbnN0IGkzMiBjb25zdDEgPSAxMjM7Citjb25zdCBkb3VibGUgY29uc3QyID0gMjMuMzsKK2NvbnN0IG1hcDxzdHJpbmcsc3RyaW5nPiBjb25zdDMgPSB7ImhlbGxvIjoid29ybGQiLCAidGhyaWZ0IjoiYXVkaXQifTsKKworCisvL0V4Y2VwdGlvbgorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMSB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CitleGNlcHRpb24gdGVzdF9leGNlcHRpb24yIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KKworLy9FbnVtcworCitlbnVtIHRlc3RfZW51bTEgeworICAgIGVudW0xX3ZhbHVlMCA9IDAsCisgICAgZW51bTFfdmFsdWUxID0gMSwKKyAgICBlbnVtMV92YWx1ZTIgPSAyLAorICAgIGVudW0xX3ZhbHVlNSA9IDUsCisgICAgZW51bTFfdmFsdWU3ID0gNywKKyAgICBlbnVtMV92YWx1ZTggPSA4Cit9CisKK2VudW0gdGVzdF9lbnVtMiB7CisgICAgZW51bTJfdmFsdWUwID0gMCwKKyAgICBlbnVtMl92YWx1ZTEgPSAxLAorICAgIGVudW0yX3ZhbHVlMiA9IDIsCisgICAgZW51bTJfdmFsdWUzID0gMworfQorCitlbnVtIHRlc3RfZW51bTMgeworICAgIGVudW0zX3ZhbHVlMSA9IDAsCisgICAgZW51bTNfdmFsdWUyID0gMQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QxIHsKKyAgICAxOiBpMTYgc3RydWN0MV9tZW1iZXIxLAorICAgIDI6IGkzMiBzdHJ1Y3QxX21lbWJlcjIsCisgICAgMzogaTY0IHN0cnVjdDFfbWVtYmVyMywKKyAgICA0OiBkb3VibGUgc3RydWN0MV9tZW1iZXI0ID0gMi41LAorICAgIDU6IHN0cmluZyBzdHJ1Y3QxX21lbWJlcjUgPSAiQXVkaXQgdGVzdCIsCisgICAgNjogYm9vbCBzdHJ1Y3QxX21lbWJlcjYsCisgICAgNzogYnl0ZSBzdHJ1Y3QxX21lbWJlcjcsCisgICAgODogYmluYXJ5IHN0cnVjdDFfbWVtYmVyOCwKKyAgICA5OiB0ZXN0X2VudW0xIHN0cnVjdDFfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QyIHsKKyAgICAxOiBsaXN0PGkxNj4gc3RydWN0Ml9tZW1iZXIxLAorICAgIDI6IGxpc3Q8aTMyPiBzdHJ1Y3QyX21lbWJlcjIsCisgICAgMzogbGlzdDxpNjQ+IHN0cnVjdDJfbWVtYmVyMyA9IFsyMywgMzIgXSwKKyAgICA0OiBsaXN0PGRvdWJsZT4gc3RydWN0Ml9tZW1iZXI0LAorICAgIDU6IGxpc3Q8c3RyaW5nPiBzdHJ1Y3QyX21lbWJlcjUsCisgICAgNjogbGlzdDxib29sPiBzdHJ1Y3QyX21lbWJlcjYsCisgICAgNzogbGlzdDxieXRlPiBzdHJ1Y3QyX21lbWJlcjcsCisgICAgODogbGlzdDxiaW5hcnk+IHN0cnVjdDJfbWVtYmVyOCwKKyAgICA5OiBsaXN0PHRlc3RfZW51bTE+IHN0cnVjdDJfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QzIHsKKyAgICAxOiBtYXA8aTE2LCBpMzI+IHN0cnVjdDNfbWVtYmVyMSA9IHsxOjIsIDM6NH0sCisgICAgMjogbWFwPGk2NCwgZG91YmxlPiBzdHJ1Y3QzX21lbWJlcjIgPSB7MTA6MS4xLCAyMDoyLjF9LAorICAgIDM6IG1hcDxzdHJpbmcsIGJvb2w+IHN0cnVjdDNfbWVtYmVyMywKKyAgICA0OiBtYXA8Ynl0ZSwgdGVzdF9lbnVtMT4gc3RydWN0M19tZW1iZXI0LAorICAgIDU6IG1hcDx0ZXN0X2VudW0yLCB0ZXN0X2VudW0zID4gc3RydWN0M19tZW1iZXI1LAorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q0IHsKKyAgICAxOiBpMzIgc3RydWN0NF9tZW1iZXIxLAorICAgIDI6IG9wdGlvbmFsIGkzMiBzdHJ1Y3Q0X21lbWJlcjIKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NXsKKyAgICAxOiBkb3VibGUgc3RydWN0NV9tZW1iZXIxLAorICAgIDI6IHN0cmluZyBzdHJ1Y3Q1X21lbWJlcjIgPSAiVGhyaWZ0IEF1ZGl0IFRlc3QiCit9CitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q2IHsKKyAgICAxOiBpMzIgc3RydWN0Nl9tZW1iZXIxLAorICAgIDI6IHJlcXVpcmVkIGkzMiBzdHJ1Y3Q2X21lbWJlcjIKK30KKworc2VydmljZSBiYXNlIHsKKyAgICBvbmV3YXkgdm9pZCBiYXNlX29uZXdheSgKKyAgICAgICAgMTogaTMyIGFyZzEpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTE2IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBpMzIgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IGk2NCBmdW5jdGlvbjFfYXJnMywKKyAgICAgICAgNDogZG91YmxlIGZ1bmN0aW9uMV9hcmc0LAorICAgICAgICA1OiBzdHJpbmcgZnVuY3Rpb24xX2FyZzUsCisgICAgICAgIDY6IGJvb2wgZnVuY3Rpb24xX2FyZzYsCisgICAgICAgIDc6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzcsCisgICAgICAgIDg6IHRlc3Rfc3RydWN0MSBmdW5jdGlvbjFfYXJnOCksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGkxNj4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8aTMyPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnNSwKKyAgICAgICAgNjogbGlzdDxib29sPiBmdW5jdGlvbjJfYXJnNiwKKyAgICAgICAgNzogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNywKKyAgICAgICAgODogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnOCwKKyAgICAgICAgOTogbGlzdDx0ZXN0X3N0cnVjdDE+IGZ1bmN0aW9uMl9hcmc5KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMygpLAorCit9CisKK3NlcnZpY2UgZGVyaXZlZDEgZXh0ZW5kcyBiYXNlIHsKKyAgICAKKyAgICB0ZXN0X2VudW0xIGRlcml2ZWQxX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTY0IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBkb3VibGUgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBpNjQgZGVyaXZlZDFfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc1KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgZG91YmxlIGRlcml2ZWQxX2Z1bmN0aW9uMygKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uM19hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uM19hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgc3RyaW5nIGRlcml2ZWQxX2Z1bmN0aW9uNCgKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uNF9hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uNF9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisKKyAgICBib29sIGRlcml2ZWQxX2Z1bmN0aW9uNSgKKyAgICAgICAgMTogbWFwPGk2NCwgZG91YmxlPiBmdW5jdGlvbjVfYXJnMSwKKyAgICAgICAgMjogbWFwPHN0cmluZywgYm9vbD4gZnVuY3Rpb241X2FyZzIsCisgICAgICAgIDM6IG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBmdW5jdGlvbjVfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHRlc3Rfc3RydWN0MSBkZXJpdmVkMV9mdW5jdGlvbjYoCisgICAgICAgIDE6IGRvdWJsZSBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKK30KKworc2VydmljZSBkZXJpdmVkMiBleHRlbmRzIGJhc2UgeworCisgICAgbGlzdDxpMzI+IGRlcml2ZWQyX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTMyIGZ1bmN0aW9uMV9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorICAgIGxpc3Q8dGVzdF9lbnVtMT4gZGVyaXZlZDJfZnVuY3Rpb24yKAorICAgICAgICAxOmk2NCBmdW5jdGlvbjJfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGxpc3Q8dGVzdF9zdHJ1Y3QxPiBkZXJpdmVkMl9mdW5jdGlvbjMoCisgICAgICAgIDE6ZG91YmxlIGZ1bmN0aW9uM19hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8ZG91YmxlLCBzdHJpbmc+IGRlcml2ZWQyX2Z1bmN0aW9uNCgKKyAgICAgICAgMTpzdHJpbmcgZnVuY3Rpb240X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBkZXJpdmVkMl9mdW5jdGlvbjUoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjVfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3Rfc3RydWN0MSwgdGVzdF9zdHJ1Y3QyPiBkZXJpdmVkMl9mdW5jdGlvbjYoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorfQpkaWZmIC0tZ2l0IGEvdGVzdC9hdWRpdC9icmVhazEyLnRocmlmdCBiL3Rlc3QvYXVkaXQvYnJlYWsxMi50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU1MjJlZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYXVkaXQvYnJlYWsxMi50aHJpZnQKQEAgLTAsMCArMSwxOTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gZGVyaXZlZDFfZnVuY3Rpb24xIHJldHVybiB0eXBlIGNoYW5nZWQgZnJvbSBlbnVtMSB0byBlbnVtMgorCituYW1lc3BhY2UgY3BwIHRlc3QKKworLy9Db25zdGFudHMKK2NvbnN0IGkzMiBjb25zdDEgPSAxMjM7Citjb25zdCBkb3VibGUgY29uc3QyID0gMjMuMzsKK2NvbnN0IG1hcDxzdHJpbmcsc3RyaW5nPiBjb25zdDMgPSB7ImhlbGxvIjoid29ybGQiLCAidGhyaWZ0IjoiYXVkaXQifTsKKworCisvL0V4Y2VwdGlvbgorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMSB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CitleGNlcHRpb24gdGVzdF9leGNlcHRpb24yIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KKworLy9FbnVtcworCitlbnVtIHRlc3RfZW51bTEgeworICAgIGVudW0xX3ZhbHVlMCA9IDAsCisgICAgZW51bTFfdmFsdWUxID0gMSwKKyAgICBlbnVtMV92YWx1ZTIgPSAyLAorICAgIGVudW0xX3ZhbHVlNSA9IDUsCisgICAgZW51bTFfdmFsdWU3ID0gNywKKyAgICBlbnVtMV92YWx1ZTggPSA4Cit9CisKK2VudW0gdGVzdF9lbnVtMiB7CisgICAgZW51bTJfdmFsdWUwID0gMCwKKyAgICBlbnVtMl92YWx1ZTEgPSAxLAorICAgIGVudW0yX3ZhbHVlMiA9IDIsCisgICAgZW51bTJfdmFsdWUzID0gMworfQorCitlbnVtIHRlc3RfZW51bTMgeworICAgIGVudW0zX3ZhbHVlMSA9IDAsCisgICAgZW51bTNfdmFsdWUyID0gMQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QxIHsKKyAgICAxOiBpMTYgc3RydWN0MV9tZW1iZXIxLAorICAgIDI6IGkzMiBzdHJ1Y3QxX21lbWJlcjIsCisgICAgMzogaTY0IHN0cnVjdDFfbWVtYmVyMywKKyAgICA0OiBkb3VibGUgc3RydWN0MV9tZW1iZXI0ID0gMi41LAorICAgIDU6IHN0cmluZyBzdHJ1Y3QxX21lbWJlcjUgPSAiQXVkaXQgdGVzdCIsCisgICAgNjogYm9vbCBzdHJ1Y3QxX21lbWJlcjYsCisgICAgNzogYnl0ZSBzdHJ1Y3QxX21lbWJlcjcsCisgICAgODogYmluYXJ5IHN0cnVjdDFfbWVtYmVyOCwKKyAgICA5OiB0ZXN0X2VudW0xIHN0cnVjdDFfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QyIHsKKyAgICAxOiBsaXN0PGkxNj4gc3RydWN0Ml9tZW1iZXIxLAorICAgIDI6IGxpc3Q8aTMyPiBzdHJ1Y3QyX21lbWJlcjIsCisgICAgMzogbGlzdDxpNjQ+IHN0cnVjdDJfbWVtYmVyMyA9IFsyMywgMzIgXSwKKyAgICA0OiBsaXN0PGRvdWJsZT4gc3RydWN0Ml9tZW1iZXI0LAorICAgIDU6IGxpc3Q8c3RyaW5nPiBzdHJ1Y3QyX21lbWJlcjUsCisgICAgNjogbGlzdDxib29sPiBzdHJ1Y3QyX21lbWJlcjYsCisgICAgNzogbGlzdDxieXRlPiBzdHJ1Y3QyX21lbWJlcjcsCisgICAgODogbGlzdDxiaW5hcnk+IHN0cnVjdDJfbWVtYmVyOCwKKyAgICA5OiBsaXN0PHRlc3RfZW51bTE+IHN0cnVjdDJfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QzIHsKKyAgICAxOiBtYXA8aTE2LCBpMzI+IHN0cnVjdDNfbWVtYmVyMSA9IHsxOjIsIDM6NH0sCisgICAgMjogbWFwPGk2NCwgZG91YmxlPiBzdHJ1Y3QzX21lbWJlcjIgPSB7MTA6MS4xLCAyMDoyLjF9LAorICAgIDM6IG1hcDxzdHJpbmcsIGJvb2w+IHN0cnVjdDNfbWVtYmVyMywKKyAgICA0OiBtYXA8Ynl0ZSwgdGVzdF9lbnVtMT4gc3RydWN0M19tZW1iZXI0LAorICAgIDU6IG1hcDx0ZXN0X2VudW0yLCB0ZXN0X2VudW0zID4gc3RydWN0M19tZW1iZXI1LAorICAgIDc6IG1hcDxkb3VibGUsIHN0cmluZz4gc3RydWN0M19tZW1iZXI3Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDQgeworICAgIDE6IGkzMiBzdHJ1Y3Q0X21lbWJlcjEsCisgICAgMjogb3B0aW9uYWwgaTMyIHN0cnVjdDRfbWVtYmVyMgorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q1eworICAgIDE6IGRvdWJsZSBzdHJ1Y3Q1X21lbWJlcjEsCisgICAgMjogc3RyaW5nIHN0cnVjdDVfbWVtYmVyMiA9ICJUaHJpZnQgQXVkaXQgVGVzdCIKK30KK3N0cnVjdCB0ZXN0X3N0cnVjdDYgeworICAgIDE6IGkzMiBzdHJ1Y3Q2X21lbWJlcjEsCisgICAgMjogcmVxdWlyZWQgaTMyIHN0cnVjdDZfbWVtYmVyMgorfQorCitzZXJ2aWNlIGJhc2UgeworICAgIG9uZXdheSB2b2lkIGJhc2Vfb25ld2F5KAorICAgICAgICAxOiBpMzIgYXJnMSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMTYgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGkzMiBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogaTY0IGZ1bmN0aW9uMV9hcmczLAorICAgICAgICA0OiBkb3VibGUgZnVuY3Rpb24xX2FyZzQsCisgICAgICAgIDU6IHN0cmluZyBmdW5jdGlvbjFfYXJnNSwKKyAgICAgICAgNjogYm9vbCBmdW5jdGlvbjFfYXJnNiwKKyAgICAgICAgNzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnNywKKyAgICAgICAgODogdGVzdF9zdHJ1Y3QxIGZ1bmN0aW9uMV9hcmc4KSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTE2PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxpMzI+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmc1LAorICAgICAgICA2OiBsaXN0PGJvb2w+IGZ1bmN0aW9uMl9hcmc2LAorICAgICAgICA3OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc3LAorICAgICAgICA4OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc4LAorICAgICAgICA5OiBsaXN0PHRlc3Rfc3RydWN0MT4gZnVuY3Rpb24yX2FyZzkpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24zKCksCisKK30KKworc2VydmljZSBkZXJpdmVkMSBleHRlbmRzIGJhc2UgeworICAgIAorICAgIHRlc3RfZW51bTIgZGVyaXZlZDFfZnVuY3Rpb24xKAorICAgICAgICAxOiBpNjQgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGRvdWJsZSBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGk2NCBkZXJpdmVkMV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzUpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBkb3VibGUgZGVyaXZlZDFfZnVuY3Rpb24zKAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb24zX2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb24zX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBzdHJpbmcgZGVyaXZlZDFfZnVuY3Rpb240KAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb240X2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb240X2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKworICAgIGJvb2wgZGVyaXZlZDFfZnVuY3Rpb241KAorICAgICAgICAxOiBtYXA8aTY0LCBkb3VibGU+IGZ1bmN0aW9uNV9hcmcxLAorICAgICAgICAyOiBtYXA8c3RyaW5nLCBib29sPiBmdW5jdGlvbjVfYXJnMiwKKyAgICAgICAgMzogbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGZ1bmN0aW9uNV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdGVzdF9zdHJ1Y3QxIGRlcml2ZWQxX2Z1bmN0aW9uNigKKyAgICAgICAgMTogZG91YmxlIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorfQorCitzZXJ2aWNlIGRlcml2ZWQyIGV4dGVuZHMgYmFzZSB7CisKKyAgICBsaXN0PGkzMj4gZGVyaXZlZDJfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMzIgZnVuY3Rpb24xX2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCisgICAgbGlzdDx0ZXN0X2VudW0xPiBkZXJpdmVkMl9mdW5jdGlvbjIoCisgICAgICAgIDE6aTY0IGZ1bmN0aW9uMl9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbGlzdDx0ZXN0X3N0cnVjdDE+IGRlcml2ZWQyX2Z1bmN0aW9uMygKKyAgICAgICAgMTpkb3VibGUgZnVuY3Rpb24zX2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDxkb3VibGUsIHN0cmluZz4gZGVyaXZlZDJfZnVuY3Rpb240KAorICAgICAgICAxOnN0cmluZyBmdW5jdGlvbjRfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGRlcml2ZWQyX2Z1bmN0aW9uNSgKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNV9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9zdHJ1Y3QxLCB0ZXN0X3N0cnVjdDI+IGRlcml2ZWQyX2Z1bmN0aW9uNigKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCit9CmRpZmYgLS1naXQgYS90ZXN0L2F1ZGl0L2JyZWFrMTMudGhyaWZ0IGIvdGVzdC9hdWRpdC9icmVhazEzLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Njk3NWNkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9hdWRpdC9icmVhazEzLnRocmlmdApAQCAtMCwwICsxLDE5MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBkZXJpdmVkMV9mdW5jdGlvbjYgcmV0dXJuIHR5cGUgY2hhbmdlZCBmcm9tIHN0cnVjdDEgdG8gc3RydWN0MgorCituYW1lc3BhY2UgY3BwIHRlc3QKKworLy9Db25zdGFudHMKK2NvbnN0IGkzMiBjb25zdDEgPSAxMjM7Citjb25zdCBkb3VibGUgY29uc3QyID0gMjMuMzsKK2NvbnN0IG1hcDxzdHJpbmcsc3RyaW5nPiBjb25zdDMgPSB7ImhlbGxvIjoid29ybGQiLCAidGhyaWZ0IjoiYXVkaXQifTsKKworCisvL0V4Y2VwdGlvbgorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMSB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CitleGNlcHRpb24gdGVzdF9leGNlcHRpb24yIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KKworLy9FbnVtcworCitlbnVtIHRlc3RfZW51bTEgeworICAgIGVudW0xX3ZhbHVlMCA9IDAsCisgICAgZW51bTFfdmFsdWUxID0gMSwKKyAgICBlbnVtMV92YWx1ZTIgPSAyLAorICAgIGVudW0xX3ZhbHVlNSA9IDUsCisgICAgZW51bTFfdmFsdWU3ID0gNywKKyAgICBlbnVtMV92YWx1ZTggPSA4Cit9CisKK2VudW0gdGVzdF9lbnVtMiB7CisgICAgZW51bTJfdmFsdWUwID0gMCwKKyAgICBlbnVtMl92YWx1ZTEgPSAxLAorICAgIGVudW0yX3ZhbHVlMiA9IDIsCisgICAgZW51bTJfdmFsdWUzID0gMworfQorCitlbnVtIHRlc3RfZW51bTMgeworICAgIGVudW0zX3ZhbHVlMSA9IDAsCisgICAgZW51bTNfdmFsdWUyID0gMQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QxIHsKKyAgICAxOiBpMTYgc3RydWN0MV9tZW1iZXIxLAorICAgIDI6IGkzMiBzdHJ1Y3QxX21lbWJlcjIsCisgICAgMzogaTY0IHN0cnVjdDFfbWVtYmVyMywKKyAgICA0OiBkb3VibGUgc3RydWN0MV9tZW1iZXI0ID0gMi41LAorICAgIDU6IHN0cmluZyBzdHJ1Y3QxX21lbWJlcjUgPSAiQXVkaXQgdGVzdCIsCisgICAgNjogYm9vbCBzdHJ1Y3QxX21lbWJlcjYsCisgICAgNzogYnl0ZSBzdHJ1Y3QxX21lbWJlcjcsCisgICAgODogYmluYXJ5IHN0cnVjdDFfbWVtYmVyOCwKKyAgICA5OiB0ZXN0X2VudW0xIHN0cnVjdDFfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QyIHsKKyAgICAxOiBsaXN0PGkxNj4gc3RydWN0Ml9tZW1iZXIxLAorICAgIDI6IGxpc3Q8aTMyPiBzdHJ1Y3QyX21lbWJlcjIsCisgICAgMzogbGlzdDxpNjQ+IHN0cnVjdDJfbWVtYmVyMyA9IFsyMywgMzIgXSwKKyAgICA0OiBsaXN0PGRvdWJsZT4gc3RydWN0Ml9tZW1iZXI0LAorICAgIDU6IGxpc3Q8c3RyaW5nPiBzdHJ1Y3QyX21lbWJlcjUsCisgICAgNjogbGlzdDxib29sPiBzdHJ1Y3QyX21lbWJlcjYsCisgICAgNzogbGlzdDxieXRlPiBzdHJ1Y3QyX21lbWJlcjcsCisgICAgODogbGlzdDxiaW5hcnk+IHN0cnVjdDJfbWVtYmVyOCwKKyAgICA5OiBsaXN0PHRlc3RfZW51bTE+IHN0cnVjdDJfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QzIHsKKyAgICAxOiBtYXA8aTE2LCBpMzI+IHN0cnVjdDNfbWVtYmVyMSA9IHsxOjIsIDM6NH0sCisgICAgMjogbWFwPGk2NCwgZG91YmxlPiBzdHJ1Y3QzX21lbWJlcjIgPSB7MTA6MS4xLCAyMDoyLjF9LAorICAgIDM6IG1hcDxzdHJpbmcsIGJvb2w+IHN0cnVjdDNfbWVtYmVyMywKKyAgICA0OiBtYXA8Ynl0ZSwgdGVzdF9lbnVtMT4gc3RydWN0M19tZW1iZXI0LAorICAgIDU6IG1hcDx0ZXN0X2VudW0yLCB0ZXN0X2VudW0zID4gc3RydWN0M19tZW1iZXI1LAorICAgIDc6IG1hcDxkb3VibGUsIHN0cmluZz4gc3RydWN0M19tZW1iZXI3Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDQgeworICAgIDE6IGkzMiBzdHJ1Y3Q0X21lbWJlcjEsCisgICAgMjogb3B0aW9uYWwgaTMyIHN0cnVjdDRfbWVtYmVyMgorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q1eworICAgIDE6IGRvdWJsZSBzdHJ1Y3Q1X21lbWJlcjEsCisgICAgMjogc3RyaW5nIHN0cnVjdDVfbWVtYmVyMiA9ICJUaHJpZnQgQXVkaXQgVGVzdCIKK30KK3N0cnVjdCB0ZXN0X3N0cnVjdDYgeworICAgIDE6IGkzMiBzdHJ1Y3Q2X21lbWJlcjEsCisgICAgMjogcmVxdWlyZWQgaTMyIHN0cnVjdDZfbWVtYmVyMgorfQorCitzZXJ2aWNlIGJhc2UgeworICAgIG9uZXdheSB2b2lkIGJhc2Vfb25ld2F5KAorICAgICAgICAxOiBpMzIgYXJnMSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMTYgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGkzMiBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogaTY0IGZ1bmN0aW9uMV9hcmczLAorICAgICAgICA0OiBkb3VibGUgZnVuY3Rpb24xX2FyZzQsCisgICAgICAgIDU6IHN0cmluZyBmdW5jdGlvbjFfYXJnNSwKKyAgICAgICAgNjogYm9vbCBmdW5jdGlvbjFfYXJnNiwKKyAgICAgICAgNzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnNywKKyAgICAgICAgODogdGVzdF9zdHJ1Y3QxIGZ1bmN0aW9uMV9hcmc4KSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTE2PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxpMzI+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmc1LAorICAgICAgICA2OiBsaXN0PGJvb2w+IGZ1bmN0aW9uMl9hcmc2LAorICAgICAgICA3OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc3LAorICAgICAgICA4OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc4LAorICAgICAgICA5OiBsaXN0PHRlc3Rfc3RydWN0MT4gZnVuY3Rpb24yX2FyZzkpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24zKCksCisKK30KKworc2VydmljZSBkZXJpdmVkMSBleHRlbmRzIGJhc2UgeworICAgIAorICAgIHRlc3RfZW51bTEgZGVyaXZlZDFfZnVuY3Rpb24xKAorICAgICAgICAxOiBpNjQgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGRvdWJsZSBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGk2NCBkZXJpdmVkMV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzUpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBkb3VibGUgZGVyaXZlZDFfZnVuY3Rpb24zKAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb24zX2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb24zX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBzdHJpbmcgZGVyaXZlZDFfZnVuY3Rpb240KAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb240X2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb240X2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKworICAgIGJvb2wgZGVyaXZlZDFfZnVuY3Rpb241KAorICAgICAgICAxOiBtYXA8aTY0LCBkb3VibGU+IGZ1bmN0aW9uNV9hcmcxLAorICAgICAgICAyOiBtYXA8c3RyaW5nLCBib29sPiBmdW5jdGlvbjVfYXJnMiwKKyAgICAgICAgMzogbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGZ1bmN0aW9uNV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdGVzdF9zdHJ1Y3QyIGRlcml2ZWQxX2Z1bmN0aW9uNigKKyAgICAgICAgMTogZG91YmxlIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorfQorCitzZXJ2aWNlIGRlcml2ZWQyIGV4dGVuZHMgYmFzZSB7CisKKyAgICBsaXN0PGkzMj4gZGVyaXZlZDJfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMzIgZnVuY3Rpb24xX2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCisgICAgbGlzdDx0ZXN0X2VudW0xPiBkZXJpdmVkMl9mdW5jdGlvbjIoCisgICAgICAgIDE6aTY0IGZ1bmN0aW9uMl9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbGlzdDx0ZXN0X3N0cnVjdDE+IGRlcml2ZWQyX2Z1bmN0aW9uMygKKyAgICAgICAgMTpkb3VibGUgZnVuY3Rpb24zX2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDxkb3VibGUsIHN0cmluZz4gZGVyaXZlZDJfZnVuY3Rpb240KAorICAgICAgICAxOnN0cmluZyBmdW5jdGlvbjRfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGRlcml2ZWQyX2Z1bmN0aW9uNSgKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNV9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9zdHJ1Y3QxLCB0ZXN0X3N0cnVjdDI+IGRlcml2ZWQyX2Z1bmN0aW9uNigKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCit9CmRpZmYgLS1naXQgYS90ZXN0L2F1ZGl0L2JyZWFrMTQudGhyaWZ0IGIvdGVzdC9hdWRpdC9icmVhazE0LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2NkNTAzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9hdWRpdC9icmVhazE0LnRocmlmdApAQCAtMCwwICsxLDE5MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBkZXJpdmVkMV9mdW5jdGlvbjYgcmV0dXJuIHR5cGUgY2hhbmdlZCBmcm9tIHN0cmluZyB0byBkb3VibGUgCisKK25hbWVzcGFjZSBjcHAgdGVzdAorLy9Db25zdGFudHMKK2NvbnN0IGkzMiBjb25zdDEgPSAxMjM7Citjb25zdCBkb3VibGUgY29uc3QyID0gMjMuMzsKK2NvbnN0IG1hcDxzdHJpbmcsc3RyaW5nPiBjb25zdDMgPSB7ImhlbGxvIjoid29ybGQiLCAidGhyaWZ0IjoiYXVkaXQifTsKKworCisvL0V4Y2VwdGlvbgorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMSB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CitleGNlcHRpb24gdGVzdF9leGNlcHRpb24yIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KKworLy9FbnVtcworCitlbnVtIHRlc3RfZW51bTEgeworICAgIGVudW0xX3ZhbHVlMCA9IDAsCisgICAgZW51bTFfdmFsdWUxID0gMSwKKyAgICBlbnVtMV92YWx1ZTIgPSAyLAorICAgIGVudW0xX3ZhbHVlNSA9IDUsCisgICAgZW51bTFfdmFsdWU3ID0gNywKKyAgICBlbnVtMV92YWx1ZTggPSA4Cit9CisKK2VudW0gdGVzdF9lbnVtMiB7CisgICAgZW51bTJfdmFsdWUwID0gMCwKKyAgICBlbnVtMl92YWx1ZTEgPSAxLAorICAgIGVudW0yX3ZhbHVlMiA9IDIsCisgICAgZW51bTJfdmFsdWUzID0gMworfQorCitlbnVtIHRlc3RfZW51bTMgeworICAgIGVudW0zX3ZhbHVlMSA9IDAsCisgICAgZW51bTNfdmFsdWUyID0gMQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QxIHsKKyAgICAxOiBpMTYgc3RydWN0MV9tZW1iZXIxLAorICAgIDI6IGkzMiBzdHJ1Y3QxX21lbWJlcjIsCisgICAgMzogaTY0IHN0cnVjdDFfbWVtYmVyMywKKyAgICA0OiBkb3VibGUgc3RydWN0MV9tZW1iZXI0ID0gMi41LAorICAgIDU6IHN0cmluZyBzdHJ1Y3QxX21lbWJlcjUgPSAiQXVkaXQgdGVzdCIsCisgICAgNjogYm9vbCBzdHJ1Y3QxX21lbWJlcjYsCisgICAgNzogYnl0ZSBzdHJ1Y3QxX21lbWJlcjcsCisgICAgODogYmluYXJ5IHN0cnVjdDFfbWVtYmVyOCwKKyAgICA5OiB0ZXN0X2VudW0xIHN0cnVjdDFfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QyIHsKKyAgICAxOiBsaXN0PGkxNj4gc3RydWN0Ml9tZW1iZXIxLAorICAgIDI6IGxpc3Q8aTMyPiBzdHJ1Y3QyX21lbWJlcjIsCisgICAgMzogbGlzdDxpNjQ+IHN0cnVjdDJfbWVtYmVyMyA9IFsyMywgMzIgXSwKKyAgICA0OiBsaXN0PGRvdWJsZT4gc3RydWN0Ml9tZW1iZXI0LAorICAgIDU6IGxpc3Q8c3RyaW5nPiBzdHJ1Y3QyX21lbWJlcjUsCisgICAgNjogbGlzdDxib29sPiBzdHJ1Y3QyX21lbWJlcjYsCisgICAgNzogbGlzdDxieXRlPiBzdHJ1Y3QyX21lbWJlcjcsCisgICAgODogbGlzdDxiaW5hcnk+IHN0cnVjdDJfbWVtYmVyOCwKKyAgICA5OiBsaXN0PHRlc3RfZW51bTE+IHN0cnVjdDJfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QzIHsKKyAgICAxOiBtYXA8aTE2LCBpMzI+IHN0cnVjdDNfbWVtYmVyMSA9IHsxOjIsIDM6NH0sCisgICAgMjogbWFwPGk2NCwgZG91YmxlPiBzdHJ1Y3QzX21lbWJlcjIgPSB7MTA6MS4xLCAyMDoyLjF9LAorICAgIDM6IG1hcDxzdHJpbmcsIGJvb2w+IHN0cnVjdDNfbWVtYmVyMywKKyAgICA0OiBtYXA8Ynl0ZSwgdGVzdF9lbnVtMT4gc3RydWN0M19tZW1iZXI0LAorICAgIDU6IG1hcDx0ZXN0X2VudW0yLCB0ZXN0X2VudW0zID4gc3RydWN0M19tZW1iZXI1LAorICAgIDc6IG1hcDxkb3VibGUsIHN0cmluZz4gc3RydWN0M19tZW1iZXI3Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDQgeworICAgIDE6IGkzMiBzdHJ1Y3Q0X21lbWJlcjEsCisgICAgMjogb3B0aW9uYWwgaTMyIHN0cnVjdDRfbWVtYmVyMgorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q1eworICAgIDE6IGRvdWJsZSBzdHJ1Y3Q1X21lbWJlcjEsCisgICAgMjogc3RyaW5nIHN0cnVjdDVfbWVtYmVyMiA9ICJUaHJpZnQgQXVkaXQgVGVzdCIKK30KK3N0cnVjdCB0ZXN0X3N0cnVjdDYgeworICAgIDE6IGkzMiBzdHJ1Y3Q2X21lbWJlcjEsCisgICAgMjogcmVxdWlyZWQgaTMyIHN0cnVjdDZfbWVtYmVyMgorfQorCitzZXJ2aWNlIGJhc2UgeworICAgIG9uZXdheSB2b2lkIGJhc2Vfb25ld2F5KAorICAgICAgICAxOiBpMzIgYXJnMSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMTYgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGkzMiBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogaTY0IGZ1bmN0aW9uMV9hcmczLAorICAgICAgICA0OiBkb3VibGUgZnVuY3Rpb24xX2FyZzQsCisgICAgICAgIDU6IHN0cmluZyBmdW5jdGlvbjFfYXJnNSwKKyAgICAgICAgNjogYm9vbCBmdW5jdGlvbjFfYXJnNiwKKyAgICAgICAgNzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnNywKKyAgICAgICAgODogdGVzdF9zdHJ1Y3QxIGZ1bmN0aW9uMV9hcmc4KSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTE2PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxpMzI+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmc1LAorICAgICAgICA2OiBsaXN0PGJvb2w+IGZ1bmN0aW9uMl9hcmc2LAorICAgICAgICA3OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc3LAorICAgICAgICA4OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc4LAorICAgICAgICA5OiBsaXN0PHRlc3Rfc3RydWN0MT4gZnVuY3Rpb24yX2FyZzkpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24zKCksCisKK30KKworc2VydmljZSBkZXJpdmVkMSBleHRlbmRzIGJhc2UgeworICAgIAorICAgIHRlc3RfZW51bTEgZGVyaXZlZDFfZnVuY3Rpb24xKAorICAgICAgICAxOiBpNjQgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGRvdWJsZSBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGk2NCBkZXJpdmVkMV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzUpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBkb3VibGUgZGVyaXZlZDFfZnVuY3Rpb24zKAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb24zX2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb24zX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBkb3VibGUgZGVyaXZlZDFfZnVuY3Rpb240KAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb240X2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb240X2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKworICAgIGJvb2wgZGVyaXZlZDFfZnVuY3Rpb241KAorICAgICAgICAxOiBtYXA8aTY0LCBkb3VibGU+IGZ1bmN0aW9uNV9hcmcxLAorICAgICAgICAyOiBtYXA8c3RyaW5nLCBib29sPiBmdW5jdGlvbjVfYXJnMiwKKyAgICAgICAgMzogbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGZ1bmN0aW9uNV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdGVzdF9zdHJ1Y3QxIGRlcml2ZWQxX2Z1bmN0aW9uNigKKyAgICAgICAgMTogZG91YmxlIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorfQorCitzZXJ2aWNlIGRlcml2ZWQyIGV4dGVuZHMgYmFzZSB7CisKKyAgICBsaXN0PGkzMj4gZGVyaXZlZDJfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMzIgZnVuY3Rpb24xX2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCisgICAgbGlzdDx0ZXN0X2VudW0xPiBkZXJpdmVkMl9mdW5jdGlvbjIoCisgICAgICAgIDE6aTY0IGZ1bmN0aW9uMl9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbGlzdDx0ZXN0X3N0cnVjdDE+IGRlcml2ZWQyX2Z1bmN0aW9uMygKKyAgICAgICAgMTpkb3VibGUgZnVuY3Rpb24zX2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDxkb3VibGUsIHN0cmluZz4gZGVyaXZlZDJfZnVuY3Rpb240KAorICAgICAgICAxOnN0cmluZyBmdW5jdGlvbjRfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGRlcml2ZWQyX2Z1bmN0aW9uNSgKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNV9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9zdHJ1Y3QxLCB0ZXN0X3N0cnVjdDI+IGRlcml2ZWQyX2Z1bmN0aW9uNigKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCit9CmRpZmYgLS1naXQgYS90ZXN0L2F1ZGl0L2JyZWFrMTUudGhyaWZ0IGIvdGVzdC9hdWRpdC9icmVhazE1LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWY2OWU2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9hdWRpdC9icmVhazE1LnRocmlmdApAQCAtMCwwICsxLDE5MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBicmVhazE1IC0gZGVyaXZlZDJfZnVuY3Rpb24xIHJldHVybiB0eXBlIGNoYW5nZWQgZnJvbSBsaXN0PGkzMj4gdG8gbGlzdDxpMTY+CituYW1lc3BhY2UgY3BwIHRlc3QKKworLy9Db25zdGFudHMKK2NvbnN0IGkzMiBjb25zdDEgPSAxMjM7Citjb25zdCBkb3VibGUgY29uc3QyID0gMjMuMzsKK2NvbnN0IG1hcDxzdHJpbmcsc3RyaW5nPiBjb25zdDMgPSB7ImhlbGxvIjoid29ybGQiLCAidGhyaWZ0IjoiYXVkaXQifTsKKworCisvL0V4Y2VwdGlvbgorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMSB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CitleGNlcHRpb24gdGVzdF9leGNlcHRpb24yIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KKworLy9FbnVtcworCitlbnVtIHRlc3RfZW51bTEgeworICAgIGVudW0xX3ZhbHVlMCA9IDAsCisgICAgZW51bTFfdmFsdWUxID0gMSwKKyAgICBlbnVtMV92YWx1ZTIgPSAyLAorICAgIGVudW0xX3ZhbHVlNSA9IDUsCisgICAgZW51bTFfdmFsdWU3ID0gNywKKyAgICBlbnVtMV92YWx1ZTggPSA4Cit9CisKK2VudW0gdGVzdF9lbnVtMiB7CisgICAgZW51bTJfdmFsdWUwID0gMCwKKyAgICBlbnVtMl92YWx1ZTEgPSAxLAorICAgIGVudW0yX3ZhbHVlMiA9IDIsCisgICAgZW51bTJfdmFsdWUzID0gMworfQorCitlbnVtIHRlc3RfZW51bTMgeworICAgIGVudW0zX3ZhbHVlMSA9IDAsCisgICAgZW51bTNfdmFsdWUyID0gMQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QxIHsKKyAgICAxOiBpMTYgc3RydWN0MV9tZW1iZXIxLAorICAgIDI6IGkzMiBzdHJ1Y3QxX21lbWJlcjIsCisgICAgMzogaTY0IHN0cnVjdDFfbWVtYmVyMywKKyAgICA0OiBkb3VibGUgc3RydWN0MV9tZW1iZXI0ID0gMi41LAorICAgIDU6IHN0cmluZyBzdHJ1Y3QxX21lbWJlcjUgPSAiQXVkaXQgdGVzdCIsCisgICAgNjogYm9vbCBzdHJ1Y3QxX21lbWJlcjYsCisgICAgNzogYnl0ZSBzdHJ1Y3QxX21lbWJlcjcsCisgICAgODogYmluYXJ5IHN0cnVjdDFfbWVtYmVyOCwKKyAgICA5OiB0ZXN0X2VudW0xIHN0cnVjdDFfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QyIHsKKyAgICAxOiBsaXN0PGkxNj4gc3RydWN0Ml9tZW1iZXIxLAorICAgIDI6IGxpc3Q8aTMyPiBzdHJ1Y3QyX21lbWJlcjIsCisgICAgMzogbGlzdDxpNjQ+IHN0cnVjdDJfbWVtYmVyMyA9IFsyMywgMzIgXSwKKyAgICA0OiBsaXN0PGRvdWJsZT4gc3RydWN0Ml9tZW1iZXI0LAorICAgIDU6IGxpc3Q8c3RyaW5nPiBzdHJ1Y3QyX21lbWJlcjUsCisgICAgNjogbGlzdDxib29sPiBzdHJ1Y3QyX21lbWJlcjYsCisgICAgNzogbGlzdDxieXRlPiBzdHJ1Y3QyX21lbWJlcjcsCisgICAgODogbGlzdDxiaW5hcnk+IHN0cnVjdDJfbWVtYmVyOCwKKyAgICA5OiBsaXN0PHRlc3RfZW51bTE+IHN0cnVjdDJfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QzIHsKKyAgICAxOiBtYXA8aTE2LCBpMzI+IHN0cnVjdDNfbWVtYmVyMSA9IHsxOjIsIDM6NH0sCisgICAgMjogbWFwPGk2NCwgZG91YmxlPiBzdHJ1Y3QzX21lbWJlcjIgPSB7MTA6MS4xLCAyMDoyLjF9LAorICAgIDM6IG1hcDxzdHJpbmcsIGJvb2w+IHN0cnVjdDNfbWVtYmVyMywKKyAgICA0OiBtYXA8Ynl0ZSwgdGVzdF9lbnVtMT4gc3RydWN0M19tZW1iZXI0LAorICAgIDU6IG1hcDx0ZXN0X2VudW0yLCB0ZXN0X2VudW0zID4gc3RydWN0M19tZW1iZXI1LAorICAgIDc6IG1hcDxkb3VibGUsIHN0cmluZz4gc3RydWN0M19tZW1iZXI3Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDQgeworICAgIDE6IGkzMiBzdHJ1Y3Q0X21lbWJlcjEsCisgICAgMjogb3B0aW9uYWwgaTMyIHN0cnVjdDRfbWVtYmVyMgorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q1eworICAgIDE6IGRvdWJsZSBzdHJ1Y3Q1X21lbWJlcjEsCisgICAgMjogc3RyaW5nIHN0cnVjdDVfbWVtYmVyMiA9ICJUaHJpZnQgQXVkaXQgVGVzdCIKK30KK3N0cnVjdCB0ZXN0X3N0cnVjdDYgeworICAgIDE6IGkzMiBzdHJ1Y3Q2X21lbWJlcjEsCisgICAgMjogcmVxdWlyZWQgaTMyIHN0cnVjdDZfbWVtYmVyMgorfQorCitzZXJ2aWNlIGJhc2UgeworICAgIG9uZXdheSB2b2lkIGJhc2Vfb25ld2F5KAorICAgICAgICAxOiBpMzIgYXJnMSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMTYgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGkzMiBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogaTY0IGZ1bmN0aW9uMV9hcmczLAorICAgICAgICA0OiBkb3VibGUgZnVuY3Rpb24xX2FyZzQsCisgICAgICAgIDU6IHN0cmluZyBmdW5jdGlvbjFfYXJnNSwKKyAgICAgICAgNjogYm9vbCBmdW5jdGlvbjFfYXJnNiwKKyAgICAgICAgNzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnNywKKyAgICAgICAgODogdGVzdF9zdHJ1Y3QxIGZ1bmN0aW9uMV9hcmc4KSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTE2PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxpMzI+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmc1LAorICAgICAgICA2OiBsaXN0PGJvb2w+IGZ1bmN0aW9uMl9hcmc2LAorICAgICAgICA3OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc3LAorICAgICAgICA4OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc4LAorICAgICAgICA5OiBsaXN0PHRlc3Rfc3RydWN0MT4gZnVuY3Rpb24yX2FyZzkpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24zKCksCisKK30KKworc2VydmljZSBkZXJpdmVkMSBleHRlbmRzIGJhc2UgeworICAgIAorICAgIHRlc3RfZW51bTEgZGVyaXZlZDFfZnVuY3Rpb24xKAorICAgICAgICAxOiBpNjQgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGRvdWJsZSBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGk2NCBkZXJpdmVkMV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzUpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBkb3VibGUgZGVyaXZlZDFfZnVuY3Rpb24zKAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb24zX2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb24zX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBzdHJpbmcgZGVyaXZlZDFfZnVuY3Rpb240KAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb240X2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb240X2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKworICAgIGJvb2wgZGVyaXZlZDFfZnVuY3Rpb241KAorICAgICAgICAxOiBtYXA8aTY0LCBkb3VibGU+IGZ1bmN0aW9uNV9hcmcxLAorICAgICAgICAyOiBtYXA8c3RyaW5nLCBib29sPiBmdW5jdGlvbjVfYXJnMiwKKyAgICAgICAgMzogbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGZ1bmN0aW9uNV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdGVzdF9zdHJ1Y3QxIGRlcml2ZWQxX2Z1bmN0aW9uNigKKyAgICAgICAgMTogZG91YmxlIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorfQorCitzZXJ2aWNlIGRlcml2ZWQyIGV4dGVuZHMgYmFzZSB7CisKKyAgICBsaXN0PGkxNj4gZGVyaXZlZDJfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMzIgZnVuY3Rpb24xX2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCisgICAgbGlzdDx0ZXN0X2VudW0xPiBkZXJpdmVkMl9mdW5jdGlvbjIoCisgICAgICAgIDE6aTY0IGZ1bmN0aW9uMl9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbGlzdDx0ZXN0X3N0cnVjdDE+IGRlcml2ZWQyX2Z1bmN0aW9uMygKKyAgICAgICAgMTpkb3VibGUgZnVuY3Rpb24zX2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDxkb3VibGUsIHN0cmluZz4gZGVyaXZlZDJfZnVuY3Rpb240KAorICAgICAgICAxOnN0cmluZyBmdW5jdGlvbjRfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGRlcml2ZWQyX2Z1bmN0aW9uNSgKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNV9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9zdHJ1Y3QxLCB0ZXN0X3N0cnVjdDI+IGRlcml2ZWQyX2Z1bmN0aW9uNigKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCit9CmRpZmYgLS1naXQgYS90ZXN0L2F1ZGl0L2JyZWFrMTYudGhyaWZ0IGIvdGVzdC9hdWRpdC9icmVhazE2LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGNmZjdkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9hdWRpdC9icmVhazE2LnRocmlmdApAQCAtMCwwICsxLDE5MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBicmVhayAxNiAtIGRlcml2ZWQyX2Z1bmN0aW9uNSByZXR1cm4gdHlwZSBjaGFuZ2VkIGZyb20gbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IHRvIG1hcDx0ZXN0X2VudW0zLCB0ZXN0X2VudW0yPgorCituYW1lc3BhY2UgY3BwIHRlc3QKKworLy9Db25zdGFudHMKK2NvbnN0IGkzMiBjb25zdDEgPSAxMjM7Citjb25zdCBkb3VibGUgY29uc3QyID0gMjMuMzsKK2NvbnN0IG1hcDxzdHJpbmcsc3RyaW5nPiBjb25zdDMgPSB7ImhlbGxvIjoid29ybGQiLCAidGhyaWZ0IjoiYXVkaXQifTsKKworCisvL0V4Y2VwdGlvbgorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMSB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CitleGNlcHRpb24gdGVzdF9leGNlcHRpb24yIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KKworLy9FbnVtcworCitlbnVtIHRlc3RfZW51bTEgeworICAgIGVudW0xX3ZhbHVlMCA9IDAsCisgICAgZW51bTFfdmFsdWUxID0gMSwKKyAgICBlbnVtMV92YWx1ZTIgPSAyLAorICAgIGVudW0xX3ZhbHVlNSA9IDUsCisgICAgZW51bTFfdmFsdWU3ID0gNywKKyAgICBlbnVtMV92YWx1ZTggPSA4Cit9CisKK2VudW0gdGVzdF9lbnVtMiB7CisgICAgZW51bTJfdmFsdWUwID0gMCwKKyAgICBlbnVtMl92YWx1ZTEgPSAxLAorICAgIGVudW0yX3ZhbHVlMiA9IDIsCisgICAgZW51bTJfdmFsdWUzID0gMworfQorCitlbnVtIHRlc3RfZW51bTMgeworICAgIGVudW0zX3ZhbHVlMSA9IDAsCisgICAgZW51bTNfdmFsdWUyID0gMQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QxIHsKKyAgICAxOiBpMTYgc3RydWN0MV9tZW1iZXIxLAorICAgIDI6IGkzMiBzdHJ1Y3QxX21lbWJlcjIsCisgICAgMzogaTY0IHN0cnVjdDFfbWVtYmVyMywKKyAgICA0OiBkb3VibGUgc3RydWN0MV9tZW1iZXI0ID0gMi41LAorICAgIDU6IHN0cmluZyBzdHJ1Y3QxX21lbWJlcjUgPSAiQXVkaXQgdGVzdCIsCisgICAgNjogYm9vbCBzdHJ1Y3QxX21lbWJlcjYsCisgICAgNzogYnl0ZSBzdHJ1Y3QxX21lbWJlcjcsCisgICAgODogYmluYXJ5IHN0cnVjdDFfbWVtYmVyOCwKKyAgICA5OiB0ZXN0X2VudW0xIHN0cnVjdDFfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QyIHsKKyAgICAxOiBsaXN0PGkxNj4gc3RydWN0Ml9tZW1iZXIxLAorICAgIDI6IGxpc3Q8aTMyPiBzdHJ1Y3QyX21lbWJlcjIsCisgICAgMzogbGlzdDxpNjQ+IHN0cnVjdDJfbWVtYmVyMyA9IFsyMywgMzIgXSwKKyAgICA0OiBsaXN0PGRvdWJsZT4gc3RydWN0Ml9tZW1iZXI0LAorICAgIDU6IGxpc3Q8c3RyaW5nPiBzdHJ1Y3QyX21lbWJlcjUsCisgICAgNjogbGlzdDxib29sPiBzdHJ1Y3QyX21lbWJlcjYsCisgICAgNzogbGlzdDxieXRlPiBzdHJ1Y3QyX21lbWJlcjcsCisgICAgODogbGlzdDxiaW5hcnk+IHN0cnVjdDJfbWVtYmVyOCwKKyAgICA5OiBsaXN0PHRlc3RfZW51bTE+IHN0cnVjdDJfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QzIHsKKyAgICAxOiBtYXA8aTE2LCBpMzI+IHN0cnVjdDNfbWVtYmVyMSA9IHsxOjIsIDM6NH0sCisgICAgMjogbWFwPGk2NCwgZG91YmxlPiBzdHJ1Y3QzX21lbWJlcjIgPSB7MTA6MS4xLCAyMDoyLjF9LAorICAgIDM6IG1hcDxzdHJpbmcsIGJvb2w+IHN0cnVjdDNfbWVtYmVyMywKKyAgICA0OiBtYXA8Ynl0ZSwgdGVzdF9lbnVtMT4gc3RydWN0M19tZW1iZXI0LAorICAgIDU6IG1hcDx0ZXN0X2VudW0yLCB0ZXN0X2VudW0zID4gc3RydWN0M19tZW1iZXI1LAorICAgIDc6IG1hcDxkb3VibGUsIHN0cmluZz4gc3RydWN0M19tZW1iZXI3Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDQgeworICAgIDE6IGkzMiBzdHJ1Y3Q0X21lbWJlcjEsCisgICAgMjogb3B0aW9uYWwgaTMyIHN0cnVjdDRfbWVtYmVyMgorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q1eworICAgIDE6IGRvdWJsZSBzdHJ1Y3Q1X21lbWJlcjEsCisgICAgMjogc3RyaW5nIHN0cnVjdDVfbWVtYmVyMiA9ICJUaHJpZnQgQXVkaXQgVGVzdCIKK30KK3N0cnVjdCB0ZXN0X3N0cnVjdDYgeworICAgIDE6IGkzMiBzdHJ1Y3Q2X21lbWJlcjEsCisgICAgMjogcmVxdWlyZWQgaTMyIHN0cnVjdDZfbWVtYmVyMgorfQorCitzZXJ2aWNlIGJhc2UgeworICAgIG9uZXdheSB2b2lkIGJhc2Vfb25ld2F5KAorICAgICAgICAxOiBpMzIgYXJnMSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMTYgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGkzMiBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogaTY0IGZ1bmN0aW9uMV9hcmczLAorICAgICAgICA0OiBkb3VibGUgZnVuY3Rpb24xX2FyZzQsCisgICAgICAgIDU6IHN0cmluZyBmdW5jdGlvbjFfYXJnNSwKKyAgICAgICAgNjogYm9vbCBmdW5jdGlvbjFfYXJnNiwKKyAgICAgICAgNzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnNywKKyAgICAgICAgODogdGVzdF9zdHJ1Y3QxIGZ1bmN0aW9uMV9hcmc4KSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTE2PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxpMzI+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmc1LAorICAgICAgICA2OiBsaXN0PGJvb2w+IGZ1bmN0aW9uMl9hcmc2LAorICAgICAgICA3OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc3LAorICAgICAgICA4OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc4LAorICAgICAgICA5OiBsaXN0PHRlc3Rfc3RydWN0MT4gZnVuY3Rpb24yX2FyZzkpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24zKCksCisKK30KKworc2VydmljZSBkZXJpdmVkMSBleHRlbmRzIGJhc2UgeworICAgIAorICAgIHRlc3RfZW51bTEgZGVyaXZlZDFfZnVuY3Rpb24xKAorICAgICAgICAxOiBpNjQgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGRvdWJsZSBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGk2NCBkZXJpdmVkMV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzUpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBkb3VibGUgZGVyaXZlZDFfZnVuY3Rpb24zKAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb24zX2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb24zX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBzdHJpbmcgZGVyaXZlZDFfZnVuY3Rpb240KAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb240X2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb240X2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKworICAgIGJvb2wgZGVyaXZlZDFfZnVuY3Rpb241KAorICAgICAgICAxOiBtYXA8aTY0LCBkb3VibGU+IGZ1bmN0aW9uNV9hcmcxLAorICAgICAgICAyOiBtYXA8c3RyaW5nLCBib29sPiBmdW5jdGlvbjVfYXJnMiwKKyAgICAgICAgMzogbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGZ1bmN0aW9uNV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdGVzdF9zdHJ1Y3QxIGRlcml2ZWQxX2Z1bmN0aW9uNigKKyAgICAgICAgMTogZG91YmxlIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorfQorCitzZXJ2aWNlIGRlcml2ZWQyIGV4dGVuZHMgYmFzZSB7CisKKyAgICBsaXN0PGkzMj4gZGVyaXZlZDJfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMzIgZnVuY3Rpb24xX2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCisgICAgbGlzdDx0ZXN0X2VudW0xPiBkZXJpdmVkMl9mdW5jdGlvbjIoCisgICAgICAgIDE6aTY0IGZ1bmN0aW9uMl9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbGlzdDx0ZXN0X3N0cnVjdDE+IGRlcml2ZWQyX2Z1bmN0aW9uMygKKyAgICAgICAgMTpkb3VibGUgZnVuY3Rpb24zX2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDxkb3VibGUsIHN0cmluZz4gZGVyaXZlZDJfZnVuY3Rpb240KAorICAgICAgICAxOnN0cmluZyBmdW5jdGlvbjRfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3RfZW51bTMsIHRlc3RfZW51bTI+IGRlcml2ZWQyX2Z1bmN0aW9uNSgKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNV9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9zdHJ1Y3QxLCB0ZXN0X3N0cnVjdDI+IGRlcml2ZWQyX2Z1bmN0aW9uNigKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCit9CmRpZmYgLS1naXQgYS90ZXN0L2F1ZGl0L2JyZWFrMTcudGhyaWZ0IGIvdGVzdC9hdWRpdC9icmVhazE3LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTNiMTQyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9hdWRpdC9icmVhazE3LnRocmlmdApAQCAtMCwwICsxLDE5MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvL2JyZWFrMTcgLSBkZXJpdmVkMl9mdW5jdGlvbjYgcmV0dXJuIHR5cGUgY2hhbmdlZCBmcm9tIG1hcDxzdHJ1Y3QxLHN0cnVjdDI+IHRvIG1hcDxzdHJ1Y3QxLCBzdHJ1Y3QzPgorCituYW1lc3BhY2UgY3BwIHRlc3QKKworLy9Db25zdGFudHMKK2NvbnN0IGkzMiBjb25zdDEgPSAxMjM7Citjb25zdCBkb3VibGUgY29uc3QyID0gMjMuMzsKK2NvbnN0IG1hcDxzdHJpbmcsc3RyaW5nPiBjb25zdDMgPSB7ImhlbGxvIjoid29ybGQiLCAidGhyaWZ0IjoiYXVkaXQifTsKKworCisvL0V4Y2VwdGlvbgorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMSB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CitleGNlcHRpb24gdGVzdF9leGNlcHRpb24yIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KKworLy9FbnVtcworCitlbnVtIHRlc3RfZW51bTEgeworICAgIGVudW0xX3ZhbHVlMCA9IDAsCisgICAgZW51bTFfdmFsdWUxID0gMSwKKyAgICBlbnVtMV92YWx1ZTIgPSAyLAorICAgIGVudW0xX3ZhbHVlNSA9IDUsCisgICAgZW51bTFfdmFsdWU3ID0gNywKKyAgICBlbnVtMV92YWx1ZTggPSA4Cit9CisKK2VudW0gdGVzdF9lbnVtMiB7CisgICAgZW51bTJfdmFsdWUwID0gMCwKKyAgICBlbnVtMl92YWx1ZTEgPSAxLAorICAgIGVudW0yX3ZhbHVlMiA9IDIsCisgICAgZW51bTJfdmFsdWUzID0gMworfQorCitlbnVtIHRlc3RfZW51bTMgeworICAgIGVudW0zX3ZhbHVlMSA9IDAsCisgICAgZW51bTNfdmFsdWUyID0gMQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QxIHsKKyAgICAxOiBpMTYgc3RydWN0MV9tZW1iZXIxLAorICAgIDI6IGkzMiBzdHJ1Y3QxX21lbWJlcjIsCisgICAgMzogaTY0IHN0cnVjdDFfbWVtYmVyMywKKyAgICA0OiBkb3VibGUgc3RydWN0MV9tZW1iZXI0ID0gMi41LAorICAgIDU6IHN0cmluZyBzdHJ1Y3QxX21lbWJlcjUgPSAiQXVkaXQgdGVzdCIsCisgICAgNjogYm9vbCBzdHJ1Y3QxX21lbWJlcjYsCisgICAgNzogYnl0ZSBzdHJ1Y3QxX21lbWJlcjcsCisgICAgODogYmluYXJ5IHN0cnVjdDFfbWVtYmVyOCwKKyAgICA5OiB0ZXN0X2VudW0xIHN0cnVjdDFfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QyIHsKKyAgICAxOiBsaXN0PGkxNj4gc3RydWN0Ml9tZW1iZXIxLAorICAgIDI6IGxpc3Q8aTMyPiBzdHJ1Y3QyX21lbWJlcjIsCisgICAgMzogbGlzdDxpNjQ+IHN0cnVjdDJfbWVtYmVyMyA9IFsyMywgMzIgXSwKKyAgICA0OiBsaXN0PGRvdWJsZT4gc3RydWN0Ml9tZW1iZXI0LAorICAgIDU6IGxpc3Q8c3RyaW5nPiBzdHJ1Y3QyX21lbWJlcjUsCisgICAgNjogbGlzdDxib29sPiBzdHJ1Y3QyX21lbWJlcjYsCisgICAgNzogbGlzdDxieXRlPiBzdHJ1Y3QyX21lbWJlcjcsCisgICAgODogbGlzdDxiaW5hcnk+IHN0cnVjdDJfbWVtYmVyOCwKKyAgICA5OiBsaXN0PHRlc3RfZW51bTE+IHN0cnVjdDJfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QzIHsKKyAgICAxOiBtYXA8aTE2LCBpMzI+IHN0cnVjdDNfbWVtYmVyMSA9IHsxOjIsIDM6NH0sCisgICAgMjogbWFwPGk2NCwgZG91YmxlPiBzdHJ1Y3QzX21lbWJlcjIgPSB7MTA6MS4xLCAyMDoyLjF9LAorICAgIDM6IG1hcDxzdHJpbmcsIGJvb2w+IHN0cnVjdDNfbWVtYmVyMywKKyAgICA0OiBtYXA8Ynl0ZSwgdGVzdF9lbnVtMT4gc3RydWN0M19tZW1iZXI0LAorICAgIDU6IG1hcDx0ZXN0X2VudW0yLCB0ZXN0X2VudW0zID4gc3RydWN0M19tZW1iZXI1LAorICAgIDc6IG1hcDxkb3VibGUsIHN0cmluZz4gc3RydWN0M19tZW1iZXI3Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDQgeworICAgIDE6IGkzMiBzdHJ1Y3Q0X21lbWJlcjEsCisgICAgMjogb3B0aW9uYWwgaTMyIHN0cnVjdDRfbWVtYmVyMgorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q1eworICAgIDE6IGRvdWJsZSBzdHJ1Y3Q1X21lbWJlcjEsCisgICAgMjogc3RyaW5nIHN0cnVjdDVfbWVtYmVyMiA9ICJUaHJpZnQgQXVkaXQgVGVzdCIKK30KK3N0cnVjdCB0ZXN0X3N0cnVjdDYgeworICAgIDE6IGkzMiBzdHJ1Y3Q2X21lbWJlcjEsCisgICAgMjogcmVxdWlyZWQgaTMyIHN0cnVjdDZfbWVtYmVyMgorfQorCitzZXJ2aWNlIGJhc2UgeworICAgIG9uZXdheSB2b2lkIGJhc2Vfb25ld2F5KAorICAgICAgICAxOiBpMzIgYXJnMSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMTYgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGkzMiBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogaTY0IGZ1bmN0aW9uMV9hcmczLAorICAgICAgICA0OiBkb3VibGUgZnVuY3Rpb24xX2FyZzQsCisgICAgICAgIDU6IHN0cmluZyBmdW5jdGlvbjFfYXJnNSwKKyAgICAgICAgNjogYm9vbCBmdW5jdGlvbjFfYXJnNiwKKyAgICAgICAgNzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnNywKKyAgICAgICAgODogdGVzdF9zdHJ1Y3QxIGZ1bmN0aW9uMV9hcmc4KSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTE2PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxpMzI+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmc1LAorICAgICAgICA2OiBsaXN0PGJvb2w+IGZ1bmN0aW9uMl9hcmc2LAorICAgICAgICA3OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc3LAorICAgICAgICA4OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc4LAorICAgICAgICA5OiBsaXN0PHRlc3Rfc3RydWN0MT4gZnVuY3Rpb24yX2FyZzkpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24zKCksCisKK30KKworc2VydmljZSBkZXJpdmVkMSBleHRlbmRzIGJhc2UgeworICAgIAorICAgIHRlc3RfZW51bTEgZGVyaXZlZDFfZnVuY3Rpb24xKAorICAgICAgICAxOiBpNjQgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGRvdWJsZSBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGk2NCBkZXJpdmVkMV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzUpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBkb3VibGUgZGVyaXZlZDFfZnVuY3Rpb24zKAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb24zX2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb24zX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBzdHJpbmcgZGVyaXZlZDFfZnVuY3Rpb240KAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb240X2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb240X2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKworICAgIGJvb2wgZGVyaXZlZDFfZnVuY3Rpb241KAorICAgICAgICAxOiBtYXA8aTY0LCBkb3VibGU+IGZ1bmN0aW9uNV9hcmcxLAorICAgICAgICAyOiBtYXA8c3RyaW5nLCBib29sPiBmdW5jdGlvbjVfYXJnMiwKKyAgICAgICAgMzogbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGZ1bmN0aW9uNV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdGVzdF9zdHJ1Y3QxIGRlcml2ZWQxX2Z1bmN0aW9uNigKKyAgICAgICAgMTogZG91YmxlIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorfQorCitzZXJ2aWNlIGRlcml2ZWQyIGV4dGVuZHMgYmFzZSB7CisKKyAgICBsaXN0PGkzMj4gZGVyaXZlZDJfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMzIgZnVuY3Rpb24xX2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCisgICAgbGlzdDx0ZXN0X2VudW0xPiBkZXJpdmVkMl9mdW5jdGlvbjIoCisgICAgICAgIDE6aTY0IGZ1bmN0aW9uMl9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbGlzdDx0ZXN0X3N0cnVjdDE+IGRlcml2ZWQyX2Z1bmN0aW9uMygKKyAgICAgICAgMTpkb3VibGUgZnVuY3Rpb24zX2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDxkb3VibGUsIHN0cmluZz4gZGVyaXZlZDJfZnVuY3Rpb240KAorICAgICAgICAxOnN0cmluZyBmdW5jdGlvbjRfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGRlcml2ZWQyX2Z1bmN0aW9uNSgKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNV9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9zdHJ1Y3QxLCB0ZXN0X3N0cnVjdDM+IGRlcml2ZWQyX2Z1bmN0aW9uNigKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCit9CmRpZmYgLS1naXQgYS90ZXN0L2F1ZGl0L2JyZWFrMTgudGhyaWZ0IGIvdGVzdC9hdWRpdC9icmVhazE4LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzc4YjZhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9hdWRpdC9icmVhazE4LnRocmlmdApAQCAtMCwwICsxLDE5MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvL2JyZWFrMTgtIG9uZXdheSByZW1vdmVkIGZyb20gYmFzZV9vbmV3YXkKKworbmFtZXNwYWNlIGNwcCB0ZXN0CisKKy8vQ29uc3RhbnRzCitjb25zdCBpMzIgY29uc3QxID0gMTIzOworY29uc3QgZG91YmxlIGNvbnN0MiA9IDIzLjM7Citjb25zdCBtYXA8c3RyaW5nLHN0cmluZz4gY29uc3QzID0geyJoZWxsbyI6IndvcmxkIiwgInRocmlmdCI6ImF1ZGl0In07CisKKworLy9FeGNlcHRpb24KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjEgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMiB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CisKKy8vRW51bXMKKworZW51bSB0ZXN0X2VudW0xIHsKKyAgICBlbnVtMV92YWx1ZTAgPSAwLAorICAgIGVudW0xX3ZhbHVlMSA9IDEsCisgICAgZW51bTFfdmFsdWUyID0gMiwKKyAgICBlbnVtMV92YWx1ZTUgPSA1LAorICAgIGVudW0xX3ZhbHVlNyA9IDcsCisgICAgZW51bTFfdmFsdWU4ID0gOAorfQorCitlbnVtIHRlc3RfZW51bTIgeworICAgIGVudW0yX3ZhbHVlMCA9IDAsCisgICAgZW51bTJfdmFsdWUxID0gMSwKKyAgICBlbnVtMl92YWx1ZTIgPSAyLAorICAgIGVudW0yX3ZhbHVlMyA9IDMKK30KKworZW51bSB0ZXN0X2VudW0zIHsKKyAgICBlbnVtM192YWx1ZTEgPSAwLAorICAgIGVudW0zX3ZhbHVlMiA9IDEKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MSB7CisgICAgMTogaTE2IHN0cnVjdDFfbWVtYmVyMSwKKyAgICAyOiBpMzIgc3RydWN0MV9tZW1iZXIyLAorICAgIDM6IGk2NCBzdHJ1Y3QxX21lbWJlcjMsCisgICAgNDogZG91YmxlIHN0cnVjdDFfbWVtYmVyNCA9IDIuNSwKKyAgICA1OiBzdHJpbmcgc3RydWN0MV9tZW1iZXI1ID0gIkF1ZGl0IHRlc3QiLAorICAgIDY6IGJvb2wgc3RydWN0MV9tZW1iZXI2LAorICAgIDc6IGJ5dGUgc3RydWN0MV9tZW1iZXI3LAorICAgIDg6IGJpbmFyeSBzdHJ1Y3QxX21lbWJlcjgsCisgICAgOTogdGVzdF9lbnVtMSBzdHJ1Y3QxX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MiB7CisgICAgMTogbGlzdDxpMTY+IHN0cnVjdDJfbWVtYmVyMSwKKyAgICAyOiBsaXN0PGkzMj4gc3RydWN0Ml9tZW1iZXIyLAorICAgIDM6IGxpc3Q8aTY0PiBzdHJ1Y3QyX21lbWJlcjMgPSBbMjMsIDMyIF0sCisgICAgNDogbGlzdDxkb3VibGU+IHN0cnVjdDJfbWVtYmVyNCwKKyAgICA1OiBsaXN0PHN0cmluZz4gc3RydWN0Ml9tZW1iZXI1LAorICAgIDY6IGxpc3Q8Ym9vbD4gc3RydWN0Ml9tZW1iZXI2LAorICAgIDc6IGxpc3Q8Ynl0ZT4gc3RydWN0Ml9tZW1iZXI3LAorICAgIDg6IGxpc3Q8YmluYXJ5PiBzdHJ1Y3QyX21lbWJlcjgsCisgICAgOTogbGlzdDx0ZXN0X2VudW0xPiBzdHJ1Y3QyX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MyB7CisgICAgMTogbWFwPGkxNiwgaTMyPiBzdHJ1Y3QzX21lbWJlcjEgPSB7MToyLCAzOjR9LAorICAgIDI6IG1hcDxpNjQsIGRvdWJsZT4gc3RydWN0M19tZW1iZXIyID0gezEwOjEuMSwgMjA6Mi4xfSwKKyAgICAzOiBtYXA8c3RyaW5nLCBib29sPiBzdHJ1Y3QzX21lbWJlcjMsCisgICAgNDogbWFwPGJ5dGUsIHRlc3RfZW51bTE+IHN0cnVjdDNfbWVtYmVyNCwKKyAgICA1OiBtYXA8dGVzdF9lbnVtMiwgdGVzdF9lbnVtMyA+IHN0cnVjdDNfbWVtYmVyNSwKKyAgICA3OiBtYXA8ZG91YmxlLCBzdHJpbmc+IHN0cnVjdDNfbWVtYmVyNworfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q0IHsKKyAgICAxOiBpMzIgc3RydWN0NF9tZW1iZXIxLAorICAgIDI6IG9wdGlvbmFsIGkzMiBzdHJ1Y3Q0X21lbWJlcjIKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NXsKKyAgICAxOiBkb3VibGUgc3RydWN0NV9tZW1iZXIxLAorICAgIDI6IHN0cmluZyBzdHJ1Y3Q1X21lbWJlcjIgPSAiVGhyaWZ0IEF1ZGl0IFRlc3QiCit9CitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q2IHsKKyAgICAxOiBpMzIgc3RydWN0Nl9tZW1iZXIxLAorICAgIDI6IHJlcXVpcmVkIGkzMiBzdHJ1Y3Q2X21lbWJlcjIKK30KKworc2VydmljZSBiYXNlIHsKKyAgICB2b2lkIGJhc2Vfb25ld2F5KAorICAgICAgICAxOiBpMzIgYXJnMSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMTYgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGkzMiBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogaTY0IGZ1bmN0aW9uMV9hcmczLAorICAgICAgICA0OiBkb3VibGUgZnVuY3Rpb24xX2FyZzQsCisgICAgICAgIDU6IHN0cmluZyBmdW5jdGlvbjFfYXJnNSwKKyAgICAgICAgNjogYm9vbCBmdW5jdGlvbjFfYXJnNiwKKyAgICAgICAgNzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnNywKKyAgICAgICAgODogdGVzdF9zdHJ1Y3QxIGZ1bmN0aW9uMV9hcmc4KSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTE2PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxpMzI+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmc1LAorICAgICAgICA2OiBsaXN0PGJvb2w+IGZ1bmN0aW9uMl9hcmc2LAorICAgICAgICA3OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc3LAorICAgICAgICA4OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc4LAorICAgICAgICA5OiBsaXN0PHRlc3Rfc3RydWN0MT4gZnVuY3Rpb24yX2FyZzkpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24zKCksCisKK30KKworc2VydmljZSBkZXJpdmVkMSBleHRlbmRzIGJhc2UgeworICAgIAorICAgIHRlc3RfZW51bTEgZGVyaXZlZDFfZnVuY3Rpb24xKAorICAgICAgICAxOiBpNjQgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGRvdWJsZSBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGk2NCBkZXJpdmVkMV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzUpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBkb3VibGUgZGVyaXZlZDFfZnVuY3Rpb24zKAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb24zX2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb24zX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBzdHJpbmcgZGVyaXZlZDFfZnVuY3Rpb240KAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb240X2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb240X2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKworICAgIGJvb2wgZGVyaXZlZDFfZnVuY3Rpb241KAorICAgICAgICAxOiBtYXA8aTY0LCBkb3VibGU+IGZ1bmN0aW9uNV9hcmcxLAorICAgICAgICAyOiBtYXA8c3RyaW5nLCBib29sPiBmdW5jdGlvbjVfYXJnMiwKKyAgICAgICAgMzogbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGZ1bmN0aW9uNV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdGVzdF9zdHJ1Y3QxIGRlcml2ZWQxX2Z1bmN0aW9uNigKKyAgICAgICAgMTogZG91YmxlIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorfQorCitzZXJ2aWNlIGRlcml2ZWQyIGV4dGVuZHMgYmFzZSB7CisKKyAgICBsaXN0PGkzMj4gZGVyaXZlZDJfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMzIgZnVuY3Rpb24xX2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCisgICAgbGlzdDx0ZXN0X2VudW0xPiBkZXJpdmVkMl9mdW5jdGlvbjIoCisgICAgICAgIDE6aTY0IGZ1bmN0aW9uMl9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbGlzdDx0ZXN0X3N0cnVjdDE+IGRlcml2ZWQyX2Z1bmN0aW9uMygKKyAgICAgICAgMTpkb3VibGUgZnVuY3Rpb24zX2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDxkb3VibGUsIHN0cmluZz4gZGVyaXZlZDJfZnVuY3Rpb240KAorICAgICAgICAxOnN0cmluZyBmdW5jdGlvbjRfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGRlcml2ZWQyX2Z1bmN0aW9uNSgKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNV9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9zdHJ1Y3QxLCB0ZXN0X3N0cnVjdDI+IGRlcml2ZWQyX2Z1bmN0aW9uNigKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCit9CmRpZmYgLS1naXQgYS90ZXN0L2F1ZGl0L2JyZWFrMTkudGhyaWZ0IGIvdGVzdC9hdWRpdC9icmVhazE5LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTBiMjI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9hdWRpdC9icmVhazE5LnRocmlmdApAQCAtMCwwICsxLDE5MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvL2JyZWFrMTkgLSBvbmV3YXkgYWRkZWQgdG8gYmFzZV9mdW5jdGlvbjEKKworbmFtZXNwYWNlIGNwcCB0ZXN0CisKKy8vQ29uc3RhbnRzCitjb25zdCBpMzIgY29uc3QxID0gMTIzOworY29uc3QgZG91YmxlIGNvbnN0MiA9IDIzLjM7Citjb25zdCBtYXA8c3RyaW5nLHN0cmluZz4gY29uc3QzID0geyJoZWxsbyI6IndvcmxkIiwgInRocmlmdCI6ImF1ZGl0In07CisKKworLy9FeGNlcHRpb24KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjEgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMiB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CisKKy8vRW51bXMKKworZW51bSB0ZXN0X2VudW0xIHsKKyAgICBlbnVtMV92YWx1ZTAgPSAwLAorICAgIGVudW0xX3ZhbHVlMSA9IDEsCisgICAgZW51bTFfdmFsdWUyID0gMiwKKyAgICBlbnVtMV92YWx1ZTUgPSA1LAorICAgIGVudW0xX3ZhbHVlNyA9IDcsCisgICAgZW51bTFfdmFsdWU4ID0gOAorfQorCitlbnVtIHRlc3RfZW51bTIgeworICAgIGVudW0yX3ZhbHVlMCA9IDAsCisgICAgZW51bTJfdmFsdWUxID0gMSwKKyAgICBlbnVtMl92YWx1ZTIgPSAyLAorICAgIGVudW0yX3ZhbHVlMyA9IDMKK30KKworZW51bSB0ZXN0X2VudW0zIHsKKyAgICBlbnVtM192YWx1ZTEgPSAwLAorICAgIGVudW0zX3ZhbHVlMiA9IDEKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MSB7CisgICAgMTogaTE2IHN0cnVjdDFfbWVtYmVyMSwKKyAgICAyOiBpMzIgc3RydWN0MV9tZW1iZXIyLAorICAgIDM6IGk2NCBzdHJ1Y3QxX21lbWJlcjMsCisgICAgNDogZG91YmxlIHN0cnVjdDFfbWVtYmVyNCA9IDIuNSwKKyAgICA1OiBzdHJpbmcgc3RydWN0MV9tZW1iZXI1ID0gIkF1ZGl0IHRlc3QiLAorICAgIDY6IGJvb2wgc3RydWN0MV9tZW1iZXI2LAorICAgIDc6IGJ5dGUgc3RydWN0MV9tZW1iZXI3LAorICAgIDg6IGJpbmFyeSBzdHJ1Y3QxX21lbWJlcjgsCisgICAgOTogdGVzdF9lbnVtMSBzdHJ1Y3QxX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MiB7CisgICAgMTogbGlzdDxpMTY+IHN0cnVjdDJfbWVtYmVyMSwKKyAgICAyOiBsaXN0PGkzMj4gc3RydWN0Ml9tZW1iZXIyLAorICAgIDM6IGxpc3Q8aTY0PiBzdHJ1Y3QyX21lbWJlcjMgPSBbMjMsIDMyIF0sCisgICAgNDogbGlzdDxkb3VibGU+IHN0cnVjdDJfbWVtYmVyNCwKKyAgICA1OiBsaXN0PHN0cmluZz4gc3RydWN0Ml9tZW1iZXI1LAorICAgIDY6IGxpc3Q8Ym9vbD4gc3RydWN0Ml9tZW1iZXI2LAorICAgIDc6IGxpc3Q8Ynl0ZT4gc3RydWN0Ml9tZW1iZXI3LAorICAgIDg6IGxpc3Q8YmluYXJ5PiBzdHJ1Y3QyX21lbWJlcjgsCisgICAgOTogbGlzdDx0ZXN0X2VudW0xPiBzdHJ1Y3QyX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MyB7CisgICAgMTogbWFwPGkxNiwgaTMyPiBzdHJ1Y3QzX21lbWJlcjEgPSB7MToyLCAzOjR9LAorICAgIDI6IG1hcDxpNjQsIGRvdWJsZT4gc3RydWN0M19tZW1iZXIyID0gezEwOjEuMSwgMjA6Mi4xfSwKKyAgICAzOiBtYXA8c3RyaW5nLCBib29sPiBzdHJ1Y3QzX21lbWJlcjMsCisgICAgNDogbWFwPGJ5dGUsIHRlc3RfZW51bTE+IHN0cnVjdDNfbWVtYmVyNCwKKyAgICA1OiBtYXA8dGVzdF9lbnVtMiwgdGVzdF9lbnVtMyA+IHN0cnVjdDNfbWVtYmVyNSwKKyAgICA3OiBtYXA8ZG91YmxlLCBzdHJpbmc+IHN0cnVjdDNfbWVtYmVyNworfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q0IHsKKyAgICAxOiBpMzIgc3RydWN0NF9tZW1iZXIxLAorICAgIDI6IG9wdGlvbmFsIGkzMiBzdHJ1Y3Q0X21lbWJlcjIKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NXsKKyAgICAxOiBkb3VibGUgc3RydWN0NV9tZW1iZXIxLAorICAgIDI6IHN0cmluZyBzdHJ1Y3Q1X21lbWJlcjIgPSAiVGhyaWZ0IEF1ZGl0IFRlc3QiCit9CitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q2IHsKKyAgICAxOiBpMzIgc3RydWN0Nl9tZW1iZXIxLAorICAgIDI6IHJlcXVpcmVkIGkzMiBzdHJ1Y3Q2X21lbWJlcjIKK30KKworc2VydmljZSBiYXNlIHsKKyAgICBvbmV3YXkgdm9pZCBiYXNlX29uZXdheSgKKyAgICAgICAgMTogaTMyIGFyZzEpLAorCisgICAgb25ld2F5IHZvaWQgYmFzZV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkxNiBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogaTMyIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiBpNjQgZnVuY3Rpb24xX2FyZzMsCisgICAgICAgIDQ6IGRvdWJsZSBmdW5jdGlvbjFfYXJnNCwKKyAgICAgICAgNTogc3RyaW5nIGZ1bmN0aW9uMV9hcmc1LAorICAgICAgICA2OiBib29sIGZ1bmN0aW9uMV9hcmc2LAorICAgICAgICA3OiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmc3LAorICAgICAgICA4OiB0ZXN0X3N0cnVjdDEgZnVuY3Rpb24xX2FyZzgpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpMTY+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGkzMj4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzUsCisgICAgICAgIDY6IGxpc3Q8Ym9vbD4gZnVuY3Rpb24yX2FyZzYsCisgICAgICAgIDc6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzcsCisgICAgICAgIDg6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzgsCisgICAgICAgIDk6IGxpc3Q8dGVzdF9zdHJ1Y3QxPiBmdW5jdGlvbjJfYXJnOSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjMoKSwKKworfQorCitzZXJ2aWNlIGRlcml2ZWQxIGV4dGVuZHMgYmFzZSB7CisgICAgCisgICAgdGVzdF9lbnVtMSBkZXJpdmVkMV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGk2NCBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogZG91YmxlIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgaTY0IGRlcml2ZWQxX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnNSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGRvdWJsZSBkZXJpdmVkMV9mdW5jdGlvbjMoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjNfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjNfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHN0cmluZyBkZXJpdmVkMV9mdW5jdGlvbjQoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjRfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjRfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworCisgICAgYm9vbCBkZXJpdmVkMV9mdW5jdGlvbjUoCisgICAgICAgIDE6IG1hcDxpNjQsIGRvdWJsZT4gZnVuY3Rpb241X2FyZzEsCisgICAgICAgIDI6IG1hcDxzdHJpbmcsIGJvb2w+IGZ1bmN0aW9uNV9hcmcyLAorICAgICAgICAzOiBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZnVuY3Rpb241X2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB0ZXN0X3N0cnVjdDEgZGVyaXZlZDFfZnVuY3Rpb242KAorICAgICAgICAxOiBkb3VibGUgZnVuY3Rpb242X2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCit9CisKK3NlcnZpY2UgZGVyaXZlZDIgZXh0ZW5kcyBiYXNlIHsKKworICAgIGxpc3Q8aTMyPiBkZXJpdmVkMl9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkzMiBmdW5jdGlvbjFfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKKyAgICBsaXN0PHRlc3RfZW51bTE+IGRlcml2ZWQyX2Z1bmN0aW9uMigKKyAgICAgICAgMTppNjQgZnVuY3Rpb24yX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBsaXN0PHRlc3Rfc3RydWN0MT4gZGVyaXZlZDJfZnVuY3Rpb24zKAorICAgICAgICAxOmRvdWJsZSBmdW5jdGlvbjNfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPGRvdWJsZSwgc3RyaW5nPiBkZXJpdmVkMl9mdW5jdGlvbjQoCisgICAgICAgIDE6c3RyaW5nIGZ1bmN0aW9uNF9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZGVyaXZlZDJfZnVuY3Rpb241KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb241X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X3N0cnVjdDEsIHRlc3Rfc3RydWN0Mj4gZGVyaXZlZDJfZnVuY3Rpb242KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb242X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKK30KZGlmZiAtLWdpdCBhL3Rlc3QvYXVkaXQvYnJlYWsyLnRocmlmdCBiL3Rlc3QvYXVkaXQvYnJlYWsyLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjRmZTJkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9hdWRpdC9icmVhazIudGhyaWZ0CkBAIC0wLDAgKzEsMTkwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vU3RydWN0IGZpZWxkIGNoYW5nZWQgaW4gdGVzdF9zdHJ1Y3QxCisKK25hbWVzcGFjZSBjcHAgdGVzdAorCisvL0NvbnN0YW50cworY29uc3QgaTMyIGNvbnN0MSA9IDEyMzsKK2NvbnN0IGRvdWJsZSBjb25zdDIgPSAyMy4zOworY29uc3QgbWFwPHN0cmluZyxzdHJpbmc+IGNvbnN0MyA9IHsiaGVsbG8iOiJ3b3JsZCIsICJ0aHJpZnQiOiJhdWRpdCJ9OworCisvL0V4Y2VwdGlvbgorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMSB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CitleGNlcHRpb24gdGVzdF9leGNlcHRpb24yIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KKworLy9FbnVtcworCitlbnVtIHRlc3RfZW51bTEgeworICAgIGVudW0xX3ZhbHVlMCA9IDAsCisgICAgZW51bTFfdmFsdWUxID0gMSwKKyAgICBlbnVtMV92YWx1ZTIgPSAyLAorICAgIGVudW0xX3ZhbHVlNSA9IDUsCisgICAgZW51bTFfdmFsdWU3ID0gNywKKyAgICBlbnVtMV92YWx1ZTggPSA4Cit9CisKK2VudW0gdGVzdF9lbnVtMiB7CisgICAgZW51bTJfdmFsdWUwID0gMCwKKyAgICBlbnVtMl92YWx1ZTEgPSAxLAorICAgIGVudW0yX3ZhbHVlMiA9IDIsCisgICAgZW51bTJfdmFsdWUzID0gMworfQorCitlbnVtIHRlc3RfZW51bTMgeworICAgIGVudW0zX3ZhbHVlMSA9IDAsCisgICAgZW51bTNfdmFsdWUyID0gMQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QxIHsKKyAgICAxOiBpMzIgc3RydWN0MV9tZW1iZXIxLAorICAgIDI6IGkzMiBzdHJ1Y3QxX21lbWJlcjIsCisgICAgMzogaTY0IHN0cnVjdDFfbWVtYmVyMywKKyAgICA0OiBkb3VibGUgc3RydWN0MV9tZW1iZXI0ID0gMi41LAorICAgIDU6IHN0cmluZyBzdHJ1Y3QxX21lbWJlcjUgPSAiQXVkaXQgdGVzdCIsCisgICAgNjogYm9vbCBzdHJ1Y3QxX21lbWJlcjYsCisgICAgNzogYnl0ZSBzdHJ1Y3QxX21lbWJlcjcsCisgICAgODogYmluYXJ5IHN0cnVjdDFfbWVtYmVyOCwKKyAgICA5OiB0ZXN0X2VudW0xIHN0cnVjdDFfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QyIHsKKyAgICAxOiBsaXN0PGkxNj4gc3RydWN0Ml9tZW1iZXIxLAorICAgIDI6IGxpc3Q8aTMyPiBzdHJ1Y3QyX21lbWJlcjIsCisgICAgMzogbGlzdDxpNjQ+IHN0cnVjdDJfbWVtYmVyMyA9IFsyMywgMzJdLAorICAgIDQ6IGxpc3Q8ZG91YmxlPiBzdHJ1Y3QyX21lbWJlcjQsCisgICAgNTogbGlzdDxzdHJpbmc+IHN0cnVjdDJfbWVtYmVyNSwKKyAgICA2OiBsaXN0PGJvb2w+IHN0cnVjdDJfbWVtYmVyNiwKKyAgICA3OiBsaXN0PGJ5dGU+IHN0cnVjdDJfbWVtYmVyNywKKyAgICA4OiBsaXN0PGJpbmFyeT4gc3RydWN0Ml9tZW1iZXI4LAorICAgIDk6IGxpc3Q8dGVzdF9lbnVtMT4gc3RydWN0Ml9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDMgeworICAgIDE6IG1hcDxpMTYsIGkzMj4gc3RydWN0M19tZW1iZXIxID0gezE6MiwgMzo0fSwKKyAgICAyOiBtYXA8aTY0LCBkb3VibGU+IHN0cnVjdDNfbWVtYmVyMiA9IHsxMDoxLjEsIDIwOjIuMX0sCisgICAgMzogbWFwPHN0cmluZywgYm9vbD4gc3RydWN0M19tZW1iZXIzLAorICAgIDQ6IG1hcDxieXRlLCB0ZXN0X2VudW0xPiBzdHJ1Y3QzX21lbWJlcjQsCisgICAgNTogbWFwPHRlc3RfZW51bTIsIHRlc3RfZW51bTMgPiBzdHJ1Y3QzX21lbWJlcjUsCisgICAgNzogbWFwPGRvdWJsZSwgc3RyaW5nPiBzdHJ1Y3QzX21lbWJlcjcKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NCB7CisgICAgMTogaTMyIHN0cnVjdDRfbWVtYmVyMSwKKyAgICAyOiBvcHRpb25hbCBpMzIgc3RydWN0NF9tZW1iZXIyCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDV7CisgICAgMTogZG91YmxlIHN0cnVjdDVfbWVtYmVyMSwKKyAgICAyOiBzdHJpbmcgc3RydWN0NV9tZW1iZXIyID0gIlRocmlmdCBBdWRpdCBUZXN0IgorfQorc3RydWN0IHRlc3Rfc3RydWN0NiB7CisgICAgMTogaTMyIHN0cnVjdDZfbWVtYmVyMSwKKyAgICAyOiByZXF1aXJlZCBpMzIgc3RydWN0Nl9tZW1iZXIyCit9CisKK3NlcnZpY2UgYmFzZSB7CisgICAgb25ld2F5IHZvaWQgYmFzZV9vbmV3YXkoCisgICAgICAgIDE6IGkzMiBhcmcxKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkxNiBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogaTMyIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiBpNjQgZnVuY3Rpb24xX2FyZzMsCisgICAgICAgIDQ6IGRvdWJsZSBmdW5jdGlvbjFfYXJnNCwKKyAgICAgICAgNTogc3RyaW5nIGZ1bmN0aW9uMV9hcmc1LAorICAgICAgICA2OiBib29sIGZ1bmN0aW9uMV9hcmc2LAorICAgICAgICA3OiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmc3LAorICAgICAgICA4OiB0ZXN0X3N0cnVjdDEgZnVuY3Rpb24xX2FyZzgpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpMTY+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGkzMj4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzUsCisgICAgICAgIDY6IGxpc3Q8Ym9vbD4gZnVuY3Rpb24yX2FyZzYsCisgICAgICAgIDc6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzcsCisgICAgICAgIDg6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzgsCisgICAgICAgIDk6IGxpc3Q8dGVzdF9zdHJ1Y3QxPiBmdW5jdGlvbjJfYXJnOSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjMoKSwKKworfQorCitzZXJ2aWNlIGRlcml2ZWQxIGV4dGVuZHMgYmFzZSB7CisgICAgCisgICAgdGVzdF9lbnVtMSBkZXJpdmVkMV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGk2NCBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogZG91YmxlIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgaTY0IGRlcml2ZWQxX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnNSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGRvdWJsZSBkZXJpdmVkMV9mdW5jdGlvbjMoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjNfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjNfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHN0cmluZyBkZXJpdmVkMV9mdW5jdGlvbjQoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjRfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjRfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworCisgICAgYm9vbCBkZXJpdmVkMV9mdW5jdGlvbjUoCisgICAgICAgIDE6IG1hcDxpNjQsIGRvdWJsZT4gZnVuY3Rpb241X2FyZzEsCisgICAgICAgIDI6IG1hcDxzdHJpbmcsIGJvb2w+IGZ1bmN0aW9uNV9hcmcyLAorICAgICAgICAzOiBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZnVuY3Rpb241X2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB0ZXN0X3N0cnVjdDEgZGVyaXZlZDFfZnVuY3Rpb242KAorICAgICAgICAxOiBkb3VibGUgZnVuY3Rpb242X2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCit9CisKK3NlcnZpY2UgZGVyaXZlZDIgZXh0ZW5kcyBiYXNlIHsKKworICAgIGxpc3Q8aTMyPiBkZXJpdmVkMl9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkzMiBmdW5jdGlvbjFfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKKyAgICBsaXN0PHRlc3RfZW51bTE+IGRlcml2ZWQyX2Z1bmN0aW9uMigKKyAgICAgICAgMTppNjQgZnVuY3Rpb24yX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBsaXN0PHRlc3Rfc3RydWN0MT4gZGVyaXZlZDJfZnVuY3Rpb24zKAorICAgICAgICAxOmRvdWJsZSBmdW5jdGlvbjNfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPGRvdWJsZSwgc3RyaW5nPiBkZXJpdmVkMl9mdW5jdGlvbjQoCisgICAgICAgIDE6c3RyaW5nIGZ1bmN0aW9uNF9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZGVyaXZlZDJfZnVuY3Rpb241KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb241X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X3N0cnVjdDEsIHRlc3Rfc3RydWN0Mj4gZGVyaXZlZDJfZnVuY3Rpb242KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb242X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKK30KZGlmZiAtLWdpdCBhL3Rlc3QvYXVkaXQvYnJlYWsyMC50aHJpZnQgYi90ZXN0L2F1ZGl0L2JyZWFrMjAudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhZTVmMDAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2F1ZGl0L2JyZWFrMjAudGhyaWZ0CkBAIC0wLDAgKzEsMTkwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIGJyZWFrIDIwIC0gZmlyc3QgZW51bSB2YWx1ZSByZW1vdmVkIGZyb20gZW51bTEKKworbmFtZXNwYWNlIGNwcCB0ZXN0CisKKy8vQ29uc3RhbnRzCitjb25zdCBpMzIgY29uc3QxID0gMTIzOworY29uc3QgZG91YmxlIGNvbnN0MiA9IDIzLjM7Citjb25zdCBtYXA8c3RyaW5nLHN0cmluZz4gY29uc3QzID0geyJoZWxsbyI6IndvcmxkIiwgInRocmlmdCI6ImF1ZGl0In07CisKKworLy9FeGNlcHRpb24KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjEgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMiB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CisKKy8vRW51bXMKKworZW51bSB0ZXN0X2VudW0xIHsKKyAgICBlbnVtMV92YWx1ZTEgPSAxLAorICAgIGVudW0xX3ZhbHVlMiA9IDIsCisgICAgZW51bTFfdmFsdWU1ID0gNSwKKyAgICBlbnVtMV92YWx1ZTcgPSA3LAorICAgIGVudW0xX3ZhbHVlOCA9IDgKK30KKworZW51bSB0ZXN0X2VudW0yIHsKKyAgICBlbnVtMl92YWx1ZTAgPSAwLAorICAgIGVudW0yX3ZhbHVlMSA9IDEsCisgICAgZW51bTJfdmFsdWUyID0gMiwKKyAgICBlbnVtMl92YWx1ZTMgPSAzCit9CisKK2VudW0gdGVzdF9lbnVtMyB7CisgICAgZW51bTNfdmFsdWUxID0gMCwKKyAgICBlbnVtM192YWx1ZTIgPSAxCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDEgeworICAgIDE6IGkxNiBzdHJ1Y3QxX21lbWJlcjEsCisgICAgMjogaTMyIHN0cnVjdDFfbWVtYmVyMiwKKyAgICAzOiBpNjQgc3RydWN0MV9tZW1iZXIzLAorICAgIDQ6IGRvdWJsZSBzdHJ1Y3QxX21lbWJlcjQgPSAyLjUsCisgICAgNTogc3RyaW5nIHN0cnVjdDFfbWVtYmVyNSA9ICJBdWRpdCB0ZXN0IiwKKyAgICA2OiBib29sIHN0cnVjdDFfbWVtYmVyNiwKKyAgICA3OiBieXRlIHN0cnVjdDFfbWVtYmVyNywKKyAgICA4OiBiaW5hcnkgc3RydWN0MV9tZW1iZXI4LAorICAgIDk6IHRlc3RfZW51bTEgc3RydWN0MV9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDIgeworICAgIDE6IGxpc3Q8aTE2PiBzdHJ1Y3QyX21lbWJlcjEsCisgICAgMjogbGlzdDxpMzI+IHN0cnVjdDJfbWVtYmVyMiwKKyAgICAzOiBsaXN0PGk2ND4gc3RydWN0Ml9tZW1iZXIzID0gWzIzLCAzMiBdLAorICAgIDQ6IGxpc3Q8ZG91YmxlPiBzdHJ1Y3QyX21lbWJlcjQsCisgICAgNTogbGlzdDxzdHJpbmc+IHN0cnVjdDJfbWVtYmVyNSwKKyAgICA2OiBsaXN0PGJvb2w+IHN0cnVjdDJfbWVtYmVyNiwKKyAgICA3OiBsaXN0PGJ5dGU+IHN0cnVjdDJfbWVtYmVyNywKKyAgICA4OiBsaXN0PGJpbmFyeT4gc3RydWN0Ml9tZW1iZXI4LAorICAgIDk6IGxpc3Q8dGVzdF9lbnVtMT4gc3RydWN0Ml9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDMgeworICAgIDE6IG1hcDxpMTYsIGkzMj4gc3RydWN0M19tZW1iZXIxID0gezE6MiwgMzo0fSwKKyAgICAyOiBtYXA8aTY0LCBkb3VibGU+IHN0cnVjdDNfbWVtYmVyMiA9IHsxMDoxLjEsIDIwOjIuMX0sCisgICAgMzogbWFwPHN0cmluZywgYm9vbD4gc3RydWN0M19tZW1iZXIzLAorICAgIDQ6IG1hcDxieXRlLCB0ZXN0X2VudW0xPiBzdHJ1Y3QzX21lbWJlcjQsCisgICAgNTogbWFwPHRlc3RfZW51bTIsIHRlc3RfZW51bTMgPiBzdHJ1Y3QzX21lbWJlcjUsCisgICAgNzogbWFwPGRvdWJsZSwgc3RyaW5nPiBzdHJ1Y3QzX21lbWJlcjcKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NCB7CisgICAgMTogaTMyIHN0cnVjdDRfbWVtYmVyMSwKKyAgICAyOiBvcHRpb25hbCBpMzIgc3RydWN0NF9tZW1iZXIyCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDV7CisgICAgMTogZG91YmxlIHN0cnVjdDVfbWVtYmVyMSwKKyAgICAyOiBzdHJpbmcgc3RydWN0NV9tZW1iZXIyID0gIlRocmlmdCBBdWRpdCBUZXN0IgorfQorc3RydWN0IHRlc3Rfc3RydWN0NiB7CisgICAgMTogaTMyIHN0cnVjdDZfbWVtYmVyMSwKKyAgICAyOiByZXF1aXJlZCBpMzIgc3RydWN0Nl9tZW1iZXIyCit9CisKK3NlcnZpY2UgYmFzZSB7CisgICAgb25ld2F5IHZvaWQgYmFzZV9vbmV3YXkoCisgICAgICAgIDE6IGkzMiBhcmcxKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkxNiBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogaTMyIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiBpNjQgZnVuY3Rpb24xX2FyZzMsCisgICAgICAgIDQ6IGRvdWJsZSBmdW5jdGlvbjFfYXJnNCwKKyAgICAgICAgNTogc3RyaW5nIGZ1bmN0aW9uMV9hcmc1LAorICAgICAgICA2OiBib29sIGZ1bmN0aW9uMV9hcmc2LAorICAgICAgICA3OiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmc3LAorICAgICAgICA4OiB0ZXN0X3N0cnVjdDEgZnVuY3Rpb24xX2FyZzgpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpMTY+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGkzMj4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzUsCisgICAgICAgIDY6IGxpc3Q8Ym9vbD4gZnVuY3Rpb24yX2FyZzYsCisgICAgICAgIDc6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzcsCisgICAgICAgIDg6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzgsCisgICAgICAgIDk6IGxpc3Q8dGVzdF9zdHJ1Y3QxPiBmdW5jdGlvbjJfYXJnOSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjMoKSwKKworfQorCitzZXJ2aWNlIGRlcml2ZWQxIGV4dGVuZHMgYmFzZSB7CisgICAgCisgICAgdGVzdF9lbnVtMSBkZXJpdmVkMV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGk2NCBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogZG91YmxlIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgaTY0IGRlcml2ZWQxX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnNSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGRvdWJsZSBkZXJpdmVkMV9mdW5jdGlvbjMoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjNfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjNfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHN0cmluZyBkZXJpdmVkMV9mdW5jdGlvbjQoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjRfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjRfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworCisgICAgYm9vbCBkZXJpdmVkMV9mdW5jdGlvbjUoCisgICAgICAgIDE6IG1hcDxpNjQsIGRvdWJsZT4gZnVuY3Rpb241X2FyZzEsCisgICAgICAgIDI6IG1hcDxzdHJpbmcsIGJvb2w+IGZ1bmN0aW9uNV9hcmcyLAorICAgICAgICAzOiBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZnVuY3Rpb241X2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB0ZXN0X3N0cnVjdDEgZGVyaXZlZDFfZnVuY3Rpb242KAorICAgICAgICAxOiBkb3VibGUgZnVuY3Rpb242X2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCit9CisKK3NlcnZpY2UgZGVyaXZlZDIgZXh0ZW5kcyBiYXNlIHsKKworICAgIGxpc3Q8aTMyPiBkZXJpdmVkMl9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkzMiBmdW5jdGlvbjFfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKKyAgICBsaXN0PHRlc3RfZW51bTE+IGRlcml2ZWQyX2Z1bmN0aW9uMigKKyAgICAgICAgMTppNjQgZnVuY3Rpb24yX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBsaXN0PHRlc3Rfc3RydWN0MT4gZGVyaXZlZDJfZnVuY3Rpb24zKAorICAgICAgICAxOmRvdWJsZSBmdW5jdGlvbjNfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPGRvdWJsZSwgc3RyaW5nPiBkZXJpdmVkMl9mdW5jdGlvbjQoCisgICAgICAgIDE6c3RyaW5nIGZ1bmN0aW9uNF9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZGVyaXZlZDJfZnVuY3Rpb241KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb241X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X3N0cnVjdDEsIHRlc3Rfc3RydWN0Mj4gZGVyaXZlZDJfZnVuY3Rpb242KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb242X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKK30KZGlmZiAtLWdpdCBhL3Rlc3QvYXVkaXQvYnJlYWsyMS50aHJpZnQgYi90ZXN0L2F1ZGl0L2JyZWFrMjEudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3ZGE0MDAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2F1ZGl0L2JyZWFrMjEudGhyaWZ0CkBAIC0wLDAgKzEsMTkwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vYnJlYWsyMS0gbGFzdCBlbnVtIHZhbHVlIHJlbW92ZWQgZnJvbSBlbnVtMgorCituYW1lc3BhY2UgY3BwIHRlc3QKKworLy9Db25zdGFudHMKK2NvbnN0IGkzMiBjb25zdDEgPSAxMjM7Citjb25zdCBkb3VibGUgY29uc3QyID0gMjMuMzsKK2NvbnN0IG1hcDxzdHJpbmcsc3RyaW5nPiBjb25zdDMgPSB7ImhlbGxvIjoid29ybGQiLCAidGhyaWZ0IjoiYXVkaXQifTsKKworCisvL0V4Y2VwdGlvbgorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMSB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CitleGNlcHRpb24gdGVzdF9leGNlcHRpb24yIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KKworLy9FbnVtcworCitlbnVtIHRlc3RfZW51bTEgeworICAgIGVudW0xX3ZhbHVlMCA9IDAsCisgICAgZW51bTFfdmFsdWUxID0gMSwKKyAgICBlbnVtMV92YWx1ZTIgPSAyLAorICAgIGVudW0xX3ZhbHVlNSA9IDUsCisgICAgZW51bTFfdmFsdWU3ID0gNywKKyAgICBlbnVtMV92YWx1ZTggPSA4Cit9CisKK2VudW0gdGVzdF9lbnVtMiB7CisgICAgZW51bTJfdmFsdWUwID0gMCwKKyAgICBlbnVtMl92YWx1ZTEgPSAxLAorICAgIGVudW0yX3ZhbHVlMiA9IDIsCit9CisKK2VudW0gdGVzdF9lbnVtMyB7CisgICAgZW51bTNfdmFsdWUxID0gMCwKKyAgICBlbnVtM192YWx1ZTIgPSAxCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDEgeworICAgIDE6IGkxNiBzdHJ1Y3QxX21lbWJlcjEsCisgICAgMjogaTMyIHN0cnVjdDFfbWVtYmVyMiwKKyAgICAzOiBpNjQgc3RydWN0MV9tZW1iZXIzLAorICAgIDQ6IGRvdWJsZSBzdHJ1Y3QxX21lbWJlcjQgPSAyLjUsCisgICAgNTogc3RyaW5nIHN0cnVjdDFfbWVtYmVyNSA9ICJBdWRpdCB0ZXN0IiwKKyAgICA2OiBib29sIHN0cnVjdDFfbWVtYmVyNiwKKyAgICA3OiBieXRlIHN0cnVjdDFfbWVtYmVyNywKKyAgICA4OiBiaW5hcnkgc3RydWN0MV9tZW1iZXI4LAorICAgIDk6IHRlc3RfZW51bTEgc3RydWN0MV9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDIgeworICAgIDE6IGxpc3Q8aTE2PiBzdHJ1Y3QyX21lbWJlcjEsCisgICAgMjogbGlzdDxpMzI+IHN0cnVjdDJfbWVtYmVyMiwKKyAgICAzOiBsaXN0PGk2ND4gc3RydWN0Ml9tZW1iZXIzID0gWzIzLCAzMiBdLAorICAgIDQ6IGxpc3Q8ZG91YmxlPiBzdHJ1Y3QyX21lbWJlcjQsCisgICAgNTogbGlzdDxzdHJpbmc+IHN0cnVjdDJfbWVtYmVyNSwKKyAgICA2OiBsaXN0PGJvb2w+IHN0cnVjdDJfbWVtYmVyNiwKKyAgICA3OiBsaXN0PGJ5dGU+IHN0cnVjdDJfbWVtYmVyNywKKyAgICA4OiBsaXN0PGJpbmFyeT4gc3RydWN0Ml9tZW1iZXI4LAorICAgIDk6IGxpc3Q8dGVzdF9lbnVtMT4gc3RydWN0Ml9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDMgeworICAgIDE6IG1hcDxpMTYsIGkzMj4gc3RydWN0M19tZW1iZXIxID0gezE6MiwgMzo0fSwKKyAgICAyOiBtYXA8aTY0LCBkb3VibGU+IHN0cnVjdDNfbWVtYmVyMiA9IHsxMDoxLjEsIDIwOjIuMX0sCisgICAgMzogbWFwPHN0cmluZywgYm9vbD4gc3RydWN0M19tZW1iZXIzLAorICAgIDQ6IG1hcDxieXRlLCB0ZXN0X2VudW0xPiBzdHJ1Y3QzX21lbWJlcjQsCisgICAgNTogbWFwPHRlc3RfZW51bTIsIHRlc3RfZW51bTMgPiBzdHJ1Y3QzX21lbWJlcjUsCisgICAgNzogbWFwPGRvdWJsZSwgc3RyaW5nPiBzdHJ1Y3QzX21lbWJlcjcKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NCB7CisgICAgMTogaTMyIHN0cnVjdDRfbWVtYmVyMSwKKyAgICAyOiBvcHRpb25hbCBpMzIgc3RydWN0NF9tZW1iZXIyCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDV7CisgICAgMTogZG91YmxlIHN0cnVjdDVfbWVtYmVyMSwKKyAgICAyOiBzdHJpbmcgc3RydWN0NV9tZW1iZXIyID0gIlRocmlmdCBBdWRpdCBUZXN0IgorfQorc3RydWN0IHRlc3Rfc3RydWN0NiB7CisgICAgMTogaTMyIHN0cnVjdDZfbWVtYmVyMSwKKyAgICAyOiByZXF1aXJlZCBpMzIgc3RydWN0Nl9tZW1iZXIyCit9CisKK3NlcnZpY2UgYmFzZSB7CisgICAgb25ld2F5IHZvaWQgYmFzZV9vbmV3YXkoCisgICAgICAgIDE6IGkzMiBhcmcxKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkxNiBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogaTMyIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiBpNjQgZnVuY3Rpb24xX2FyZzMsCisgICAgICAgIDQ6IGRvdWJsZSBmdW5jdGlvbjFfYXJnNCwKKyAgICAgICAgNTogc3RyaW5nIGZ1bmN0aW9uMV9hcmc1LAorICAgICAgICA2OiBib29sIGZ1bmN0aW9uMV9hcmc2LAorICAgICAgICA3OiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmc3LAorICAgICAgICA4OiB0ZXN0X3N0cnVjdDEgZnVuY3Rpb24xX2FyZzgpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpMTY+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGkzMj4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzUsCisgICAgICAgIDY6IGxpc3Q8Ym9vbD4gZnVuY3Rpb24yX2FyZzYsCisgICAgICAgIDc6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzcsCisgICAgICAgIDg6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzgsCisgICAgICAgIDk6IGxpc3Q8dGVzdF9zdHJ1Y3QxPiBmdW5jdGlvbjJfYXJnOSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjMoKSwKKworfQorCitzZXJ2aWNlIGRlcml2ZWQxIGV4dGVuZHMgYmFzZSB7CisgICAgCisgICAgdGVzdF9lbnVtMSBkZXJpdmVkMV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGk2NCBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogZG91YmxlIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgaTY0IGRlcml2ZWQxX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnNSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGRvdWJsZSBkZXJpdmVkMV9mdW5jdGlvbjMoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjNfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjNfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHN0cmluZyBkZXJpdmVkMV9mdW5jdGlvbjQoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjRfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjRfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworCisgICAgYm9vbCBkZXJpdmVkMV9mdW5jdGlvbjUoCisgICAgICAgIDE6IG1hcDxpNjQsIGRvdWJsZT4gZnVuY3Rpb241X2FyZzEsCisgICAgICAgIDI6IG1hcDxzdHJpbmcsIGJvb2w+IGZ1bmN0aW9uNV9hcmcyLAorICAgICAgICAzOiBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZnVuY3Rpb241X2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB0ZXN0X3N0cnVjdDEgZGVyaXZlZDFfZnVuY3Rpb242KAorICAgICAgICAxOiBkb3VibGUgZnVuY3Rpb242X2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCit9CisKK3NlcnZpY2UgZGVyaXZlZDIgZXh0ZW5kcyBiYXNlIHsKKworICAgIGxpc3Q8aTMyPiBkZXJpdmVkMl9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkzMiBmdW5jdGlvbjFfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKKyAgICBsaXN0PHRlc3RfZW51bTE+IGRlcml2ZWQyX2Z1bmN0aW9uMigKKyAgICAgICAgMTppNjQgZnVuY3Rpb24yX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBsaXN0PHRlc3Rfc3RydWN0MT4gZGVyaXZlZDJfZnVuY3Rpb24zKAorICAgICAgICAxOmRvdWJsZSBmdW5jdGlvbjNfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPGRvdWJsZSwgc3RyaW5nPiBkZXJpdmVkMl9mdW5jdGlvbjQoCisgICAgICAgIDE6c3RyaW5nIGZ1bmN0aW9uNF9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZGVyaXZlZDJfZnVuY3Rpb241KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb241X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X3N0cnVjdDEsIHRlc3Rfc3RydWN0Mj4gZGVyaXZlZDJfZnVuY3Rpb242KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb242X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKK30KZGlmZiAtLWdpdCBhL3Rlc3QvYXVkaXQvYnJlYWsyMi50aHJpZnQgYi90ZXN0L2F1ZGl0L2JyZWFrMjIudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4MDgzNDkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2F1ZGl0L2JyZWFrMjIudGhyaWZ0CkBAIC0wLDAgKzEsMTkwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vYnJlYWsyMiAtIGluLWJldHdlZW4gZW51bSB2YWx1ZSByZW1vdmVkIGZyb20gZW51bTEKKworbmFtZXNwYWNlIGNwcCB0ZXN0CisKKy8vQ29uc3RhbnRzCitjb25zdCBpMzIgY29uc3QxID0gMTIzOworY29uc3QgZG91YmxlIGNvbnN0MiA9IDIzLjM7Citjb25zdCBtYXA8c3RyaW5nLHN0cmluZz4gY29uc3QzID0geyJoZWxsbyI6IndvcmxkIiwgInRocmlmdCI6ImF1ZGl0In07CisKKworLy9FeGNlcHRpb24KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjEgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMiB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CisKKy8vRW51bXMKKworZW51bSB0ZXN0X2VudW0xIHsKKyAgICBlbnVtMV92YWx1ZTAgPSAwLAorICAgIGVudW0xX3ZhbHVlMSA9IDEsCisgICAgZW51bTFfdmFsdWU1ID0gNSwKKyAgICBlbnVtMV92YWx1ZTcgPSA3LAorICAgIGVudW0xX3ZhbHVlOCA9IDgKK30KKworZW51bSB0ZXN0X2VudW0yIHsKKyAgICBlbnVtMl92YWx1ZTAgPSAwLAorICAgIGVudW0yX3ZhbHVlMSA9IDEsCisgICAgZW51bTJfdmFsdWUyID0gMiwKKyAgICBlbnVtMl92YWx1ZTMgPSAzCit9CisKK2VudW0gdGVzdF9lbnVtMyB7CisgICAgZW51bTNfdmFsdWUxID0gMCwKKyAgICBlbnVtM192YWx1ZTIgPSAxCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDEgeworICAgIDE6IGkxNiBzdHJ1Y3QxX21lbWJlcjEsCisgICAgMjogaTMyIHN0cnVjdDFfbWVtYmVyMiwKKyAgICAzOiBpNjQgc3RydWN0MV9tZW1iZXIzLAorICAgIDQ6IGRvdWJsZSBzdHJ1Y3QxX21lbWJlcjQgPSAyLjUsCisgICAgNTogc3RyaW5nIHN0cnVjdDFfbWVtYmVyNSA9ICJBdWRpdCB0ZXN0IiwKKyAgICA2OiBib29sIHN0cnVjdDFfbWVtYmVyNiwKKyAgICA3OiBieXRlIHN0cnVjdDFfbWVtYmVyNywKKyAgICA4OiBiaW5hcnkgc3RydWN0MV9tZW1iZXI4LAorICAgIDk6IHRlc3RfZW51bTEgc3RydWN0MV9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDIgeworICAgIDE6IGxpc3Q8aTE2PiBzdHJ1Y3QyX21lbWJlcjEsCisgICAgMjogbGlzdDxpMzI+IHN0cnVjdDJfbWVtYmVyMiwKKyAgICAzOiBsaXN0PGk2ND4gc3RydWN0Ml9tZW1iZXIzID0gWzIzLCAzMiBdLAorICAgIDQ6IGxpc3Q8ZG91YmxlPiBzdHJ1Y3QyX21lbWJlcjQsCisgICAgNTogbGlzdDxzdHJpbmc+IHN0cnVjdDJfbWVtYmVyNSwKKyAgICA2OiBsaXN0PGJvb2w+IHN0cnVjdDJfbWVtYmVyNiwKKyAgICA3OiBsaXN0PGJ5dGU+IHN0cnVjdDJfbWVtYmVyNywKKyAgICA4OiBsaXN0PGJpbmFyeT4gc3RydWN0Ml9tZW1iZXI4LAorICAgIDk6IGxpc3Q8dGVzdF9lbnVtMT4gc3RydWN0Ml9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDMgeworICAgIDE6IG1hcDxpMTYsIGkzMj4gc3RydWN0M19tZW1iZXIxID0gezE6MiwgMzo0fSwKKyAgICAyOiBtYXA8aTY0LCBkb3VibGU+IHN0cnVjdDNfbWVtYmVyMiA9IHsxMDoxLjEsIDIwOjIuMX0sCisgICAgMzogbWFwPHN0cmluZywgYm9vbD4gc3RydWN0M19tZW1iZXIzLAorICAgIDQ6IG1hcDxieXRlLCB0ZXN0X2VudW0xPiBzdHJ1Y3QzX21lbWJlcjQsCisgICAgNTogbWFwPHRlc3RfZW51bTIsIHRlc3RfZW51bTMgPiBzdHJ1Y3QzX21lbWJlcjUsCisgICAgNzogbWFwPGRvdWJsZSwgc3RyaW5nPiBzdHJ1Y3QzX21lbWJlcjcKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NCB7CisgICAgMTogaTMyIHN0cnVjdDRfbWVtYmVyMSwKKyAgICAyOiBvcHRpb25hbCBpMzIgc3RydWN0NF9tZW1iZXIyCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDV7CisgICAgMTogZG91YmxlIHN0cnVjdDVfbWVtYmVyMSwKKyAgICAyOiBzdHJpbmcgc3RydWN0NV9tZW1iZXIyID0gIlRocmlmdCBBdWRpdCBUZXN0IgorfQorc3RydWN0IHRlc3Rfc3RydWN0NiB7CisgICAgMTogaTMyIHN0cnVjdDZfbWVtYmVyMSwKKyAgICAyOiByZXF1aXJlZCBpMzIgc3RydWN0Nl9tZW1iZXIyCit9CisKK3NlcnZpY2UgYmFzZSB7CisgICAgb25ld2F5IHZvaWQgYmFzZV9vbmV3YXkoCisgICAgICAgIDE6IGkzMiBhcmcxKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkxNiBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogaTMyIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiBpNjQgZnVuY3Rpb24xX2FyZzMsCisgICAgICAgIDQ6IGRvdWJsZSBmdW5jdGlvbjFfYXJnNCwKKyAgICAgICAgNTogc3RyaW5nIGZ1bmN0aW9uMV9hcmc1LAorICAgICAgICA2OiBib29sIGZ1bmN0aW9uMV9hcmc2LAorICAgICAgICA3OiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmc3LAorICAgICAgICA4OiB0ZXN0X3N0cnVjdDEgZnVuY3Rpb24xX2FyZzgpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpMTY+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGkzMj4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzUsCisgICAgICAgIDY6IGxpc3Q8Ym9vbD4gZnVuY3Rpb24yX2FyZzYsCisgICAgICAgIDc6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzcsCisgICAgICAgIDg6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzgsCisgICAgICAgIDk6IGxpc3Q8dGVzdF9zdHJ1Y3QxPiBmdW5jdGlvbjJfYXJnOSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjMoKSwKKworfQorCitzZXJ2aWNlIGRlcml2ZWQxIGV4dGVuZHMgYmFzZSB7CisgICAgCisgICAgdGVzdF9lbnVtMSBkZXJpdmVkMV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGk2NCBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogZG91YmxlIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgaTY0IGRlcml2ZWQxX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnNSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGRvdWJsZSBkZXJpdmVkMV9mdW5jdGlvbjMoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjNfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjNfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHN0cmluZyBkZXJpdmVkMV9mdW5jdGlvbjQoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjRfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjRfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworCisgICAgYm9vbCBkZXJpdmVkMV9mdW5jdGlvbjUoCisgICAgICAgIDE6IG1hcDxpNjQsIGRvdWJsZT4gZnVuY3Rpb241X2FyZzEsCisgICAgICAgIDI6IG1hcDxzdHJpbmcsIGJvb2w+IGZ1bmN0aW9uNV9hcmcyLAorICAgICAgICAzOiBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZnVuY3Rpb241X2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB0ZXN0X3N0cnVjdDEgZGVyaXZlZDFfZnVuY3Rpb242KAorICAgICAgICAxOiBkb3VibGUgZnVuY3Rpb242X2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCit9CisKK3NlcnZpY2UgZGVyaXZlZDIgZXh0ZW5kcyBiYXNlIHsKKworICAgIGxpc3Q8aTMyPiBkZXJpdmVkMl9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkzMiBmdW5jdGlvbjFfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKKyAgICBsaXN0PHRlc3RfZW51bTE+IGRlcml2ZWQyX2Z1bmN0aW9uMigKKyAgICAgICAgMTppNjQgZnVuY3Rpb24yX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBsaXN0PHRlc3Rfc3RydWN0MT4gZGVyaXZlZDJfZnVuY3Rpb24zKAorICAgICAgICAxOmRvdWJsZSBmdW5jdGlvbjNfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPGRvdWJsZSwgc3RyaW5nPiBkZXJpdmVkMl9mdW5jdGlvbjQoCisgICAgICAgIDE6c3RyaW5nIGZ1bmN0aW9uNF9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZGVyaXZlZDJfZnVuY3Rpb241KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb241X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X3N0cnVjdDEsIHRlc3Rfc3RydWN0Mj4gZGVyaXZlZDJfZnVuY3Rpb242KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb242X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKK30KZGlmZiAtLWdpdCBhL3Rlc3QvYXVkaXQvYnJlYWsyMy50aHJpZnQgYi90ZXN0L2F1ZGl0L2JyZWFrMjMudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmOTVhNDIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2F1ZGl0L2JyZWFrMjMudGhyaWZ0CkBAIC0wLDAgKzEsMTkyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vYnJlYWsyMyAtIHJlcXVpcmVkIHN0cnVjdCBmaWVsZCBhZGRlZCB0byBzdHJ1Y3Q0CisKK25hbWVzcGFjZSBjcHAgdGVzdAorCisvL0NvbnN0YW50cworY29uc3QgaTMyIGNvbnN0MSA9IDEyMzsKK2NvbnN0IGRvdWJsZSBjb25zdDIgPSAyMy4zOworY29uc3QgbWFwPHN0cmluZyxzdHJpbmc+IGNvbnN0MyA9IHsiaGVsbG8iOiJ3b3JsZCIsICJ0aHJpZnQiOiJhdWRpdCJ9OworCisKKy8vRXhjZXB0aW9uCitleGNlcHRpb24gdGVzdF9leGNlcHRpb24xIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjIgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorCisvL0VudW1zCisKK2VudW0gdGVzdF9lbnVtMSB7CisgICAgZW51bTFfdmFsdWUwID0gMCwKKyAgICBlbnVtMV92YWx1ZTEgPSAxLAorICAgIGVudW0xX3ZhbHVlMiA9IDIsCisgICAgZW51bTFfdmFsdWU1ID0gNSwKKyAgICBlbnVtMV92YWx1ZTcgPSA3LAorICAgIGVudW0xX3ZhbHVlOCA9IDgKK30KKworZW51bSB0ZXN0X2VudW0yIHsKKyAgICBlbnVtMl92YWx1ZTAgPSAwLAorICAgIGVudW0yX3ZhbHVlMSA9IDEsCisgICAgZW51bTJfdmFsdWUyID0gMiwKKyAgICBlbnVtMl92YWx1ZTMgPSAzCit9CisKK2VudW0gdGVzdF9lbnVtMyB7CisgICAgZW51bTNfdmFsdWUxID0gMCwKKyAgICBlbnVtM192YWx1ZTIgPSAxCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDEgeworICAgIDE6IGkxNiBzdHJ1Y3QxX21lbWJlcjEsCisgICAgMjogaTMyIHN0cnVjdDFfbWVtYmVyMiwKKyAgICAzOiBpNjQgc3RydWN0MV9tZW1iZXIzLAorICAgIDQ6IGRvdWJsZSBzdHJ1Y3QxX21lbWJlcjQgPSAyLjUsCisgICAgNTogc3RyaW5nIHN0cnVjdDFfbWVtYmVyNSA9ICJBdWRpdCB0ZXN0IiwKKyAgICA2OiBib29sIHN0cnVjdDFfbWVtYmVyNiwKKyAgICA3OiBieXRlIHN0cnVjdDFfbWVtYmVyNywKKyAgICA4OiBiaW5hcnkgc3RydWN0MV9tZW1iZXI4LAorICAgIDk6IHRlc3RfZW51bTEgc3RydWN0MV9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDIgeworICAgIDE6IGxpc3Q8aTE2PiBzdHJ1Y3QyX21lbWJlcjEsCisgICAgMjogbGlzdDxpMzI+IHN0cnVjdDJfbWVtYmVyMiwKKyAgICAzOiBsaXN0PGk2ND4gc3RydWN0Ml9tZW1iZXIzID0gWzIzLCAzMiBdLAorICAgIDQ6IGxpc3Q8ZG91YmxlPiBzdHJ1Y3QyX21lbWJlcjQsCisgICAgNTogbGlzdDxzdHJpbmc+IHN0cnVjdDJfbWVtYmVyNSwKKyAgICA2OiBsaXN0PGJvb2w+IHN0cnVjdDJfbWVtYmVyNiwKKyAgICA3OiBsaXN0PGJ5dGU+IHN0cnVjdDJfbWVtYmVyNywKKyAgICA4OiBsaXN0PGJpbmFyeT4gc3RydWN0Ml9tZW1iZXI4LAorICAgIDk6IGxpc3Q8dGVzdF9lbnVtMT4gc3RydWN0Ml9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDMgeworICAgIDE6IG1hcDxpMTYsIGkzMj4gc3RydWN0M19tZW1iZXIxID0gezE6MiwgMzo0fSwKKyAgICAyOiBtYXA8aTY0LCBkb3VibGU+IHN0cnVjdDNfbWVtYmVyMiA9IHsxMDoxLjEsIDIwOjIuMX0sCisgICAgMzogbWFwPHN0cmluZywgYm9vbD4gc3RydWN0M19tZW1iZXIzLAorICAgIDQ6IG1hcDxieXRlLCB0ZXN0X2VudW0xPiBzdHJ1Y3QzX21lbWJlcjQsCisgICAgNTogbWFwPHRlc3RfZW51bTIsIHRlc3RfZW51bTMgPiBzdHJ1Y3QzX21lbWJlcjUsCisgICAgNzogbWFwPGRvdWJsZSwgc3RyaW5nPiBzdHJ1Y3QzX21lbWJlcjcKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NCB7CisgICAgMTogaTMyIHN0cnVjdDRfbWVtYmVyMSwKKyAgICAyOiBvcHRpb25hbCBpMzIgc3RydWN0NF9tZW1iZXIyLAorICAgIDM6IHJlcXVpcmVkIGk2NCBzdHJ1Y3Q0X21lbWJlcjMKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NXsKKyAgICAxOiBkb3VibGUgc3RydWN0NV9tZW1iZXIxLAorICAgIDI6IHN0cmluZyBzdHJ1Y3Q1X21lbWJlcjIgPSAiVGhyaWZ0IEF1ZGl0IFRlc3QiCit9CitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q2IHsKKyAgICAxOiBpMzIgc3RydWN0Nl9tZW1iZXIxLAorICAgIDI6IHJlcXVpcmVkIGkzMiBzdHJ1Y3Q2X21lbWJlcjIKK30KKworc2VydmljZSBiYXNlIHsKKyAgICBvbmV3YXkgdm9pZCBiYXNlX29uZXdheSgKKyAgICAgICAgMTogaTMyIGFyZzEpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTE2IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBpMzIgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IGk2NCBmdW5jdGlvbjFfYXJnMywKKyAgICAgICAgNDogZG91YmxlIGZ1bmN0aW9uMV9hcmc0LAorICAgICAgICA1OiBzdHJpbmcgZnVuY3Rpb24xX2FyZzUsCisgICAgICAgIDY6IGJvb2wgZnVuY3Rpb24xX2FyZzYsCisgICAgICAgIDc6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzcsCisgICAgICAgIDg6IHRlc3Rfc3RydWN0MSBmdW5jdGlvbjFfYXJnOCksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGkxNj4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8aTMyPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnNSwKKyAgICAgICAgNjogbGlzdDxib29sPiBmdW5jdGlvbjJfYXJnNiwKKyAgICAgICAgNzogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNywKKyAgICAgICAgODogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnOCwKKyAgICAgICAgOTogbGlzdDx0ZXN0X3N0cnVjdDE+IGZ1bmN0aW9uMl9hcmc5KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMygpLAorCit9CisKK3NlcnZpY2UgZGVyaXZlZDEgZXh0ZW5kcyBiYXNlIHsKKyAgICAKKyAgICB0ZXN0X2VudW0xIGRlcml2ZWQxX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTY0IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBkb3VibGUgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBpNjQgZGVyaXZlZDFfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc1KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgZG91YmxlIGRlcml2ZWQxX2Z1bmN0aW9uMygKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uM19hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uM19hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgc3RyaW5nIGRlcml2ZWQxX2Z1bmN0aW9uNCgKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uNF9hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uNF9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisKKyAgICBib29sIGRlcml2ZWQxX2Z1bmN0aW9uNSgKKyAgICAgICAgMTogbWFwPGk2NCwgZG91YmxlPiBmdW5jdGlvbjVfYXJnMSwKKyAgICAgICAgMjogbWFwPHN0cmluZywgYm9vbD4gZnVuY3Rpb241X2FyZzIsCisgICAgICAgIDM6IG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBmdW5jdGlvbjVfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHRlc3Rfc3RydWN0MSBkZXJpdmVkMV9mdW5jdGlvbjYoCisgICAgICAgIDE6IGRvdWJsZSBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKK30KKworc2VydmljZSBkZXJpdmVkMiBleHRlbmRzIGJhc2UgeworCisgICAgbGlzdDxpMzI+IGRlcml2ZWQyX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTMyIGZ1bmN0aW9uMV9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorICAgIGxpc3Q8dGVzdF9lbnVtMT4gZGVyaXZlZDJfZnVuY3Rpb24yKAorICAgICAgICAxOmk2NCBmdW5jdGlvbjJfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGxpc3Q8dGVzdF9zdHJ1Y3QxPiBkZXJpdmVkMl9mdW5jdGlvbjMoCisgICAgICAgIDE6ZG91YmxlIGZ1bmN0aW9uM19hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8ZG91YmxlLCBzdHJpbmc+IGRlcml2ZWQyX2Z1bmN0aW9uNCgKKyAgICAgICAgMTpzdHJpbmcgZnVuY3Rpb240X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBkZXJpdmVkMl9mdW5jdGlvbjUoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjVfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3Rfc3RydWN0MSwgdGVzdF9zdHJ1Y3QyPiBkZXJpdmVkMl9mdW5jdGlvbjYoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorfQpkaWZmIC0tZ2l0IGEvdGVzdC9hdWRpdC9icmVhazI0LnRocmlmdCBiL3Rlc3QvYXVkaXQvYnJlYWsyNC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI0ZDViOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYXVkaXQvYnJlYWsyNC50aHJpZnQKQEAgLTAsMCArMSwxOTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy9icmVhazI0IC0gcmVtb3ZlZCBpbmhlcml0YW5jZSBmcm9tIGRlcml2ZWQxLgorCituYW1lc3BhY2UgY3BwIHRlc3QKKworLy9Db25zdGFudHMKK2NvbnN0IGkzMiBjb25zdDEgPSAxMjM7Citjb25zdCBkb3VibGUgY29uc3QyID0gMjMuMzsKK2NvbnN0IG1hcDxzdHJpbmcsc3RyaW5nPiBjb25zdDMgPSB7ImhlbGxvIjoid29ybGQiLCAidGhyaWZ0IjoiYXVkaXQifTsKKworCisvL0V4Y2VwdGlvbgorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMSB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CitleGNlcHRpb24gdGVzdF9leGNlcHRpb24yIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KKworLy9FbnVtcworCitlbnVtIHRlc3RfZW51bTEgeworICAgIGVudW0xX3ZhbHVlMCA9IDAsCisgICAgZW51bTFfdmFsdWUxID0gMSwKKyAgICBlbnVtMV92YWx1ZTIgPSAyLAorICAgIGVudW0xX3ZhbHVlNSA9IDUsCisgICAgZW51bTFfdmFsdWU3ID0gNywKKyAgICBlbnVtMV92YWx1ZTggPSA4Cit9CisKK2VudW0gdGVzdF9lbnVtMiB7CisgICAgZW51bTJfdmFsdWUwID0gMCwKKyAgICBlbnVtMl92YWx1ZTEgPSAxLAorICAgIGVudW0yX3ZhbHVlMiA9IDIsCisgICAgZW51bTJfdmFsdWUzID0gMworfQorCitlbnVtIHRlc3RfZW51bTMgeworICAgIGVudW0zX3ZhbHVlMSA9IDAsCisgICAgZW51bTNfdmFsdWUyID0gMQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QxIHsKKyAgICAxOiBpMTYgc3RydWN0MV9tZW1iZXIxLAorICAgIDI6IGkzMiBzdHJ1Y3QxX21lbWJlcjIsCisgICAgMzogaTY0IHN0cnVjdDFfbWVtYmVyMywKKyAgICA0OiBkb3VibGUgc3RydWN0MV9tZW1iZXI0ID0gMi41LAorICAgIDU6IHN0cmluZyBzdHJ1Y3QxX21lbWJlcjUgPSAiQXVkaXQgdGVzdCIsCisgICAgNjogYm9vbCBzdHJ1Y3QxX21lbWJlcjYsCisgICAgNzogYnl0ZSBzdHJ1Y3QxX21lbWJlcjcsCisgICAgODogYmluYXJ5IHN0cnVjdDFfbWVtYmVyOCwKKyAgICA5OiB0ZXN0X2VudW0xIHN0cnVjdDFfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QyIHsKKyAgICAxOiBsaXN0PGkxNj4gc3RydWN0Ml9tZW1iZXIxLAorICAgIDI6IGxpc3Q8aTMyPiBzdHJ1Y3QyX21lbWJlcjIsCisgICAgMzogbGlzdDxpNjQ+IHN0cnVjdDJfbWVtYmVyMyA9IFsyMywgMzIgXSwKKyAgICA0OiBsaXN0PGRvdWJsZT4gc3RydWN0Ml9tZW1iZXI0LAorICAgIDU6IGxpc3Q8c3RyaW5nPiBzdHJ1Y3QyX21lbWJlcjUsCisgICAgNjogbGlzdDxib29sPiBzdHJ1Y3QyX21lbWJlcjYsCisgICAgNzogbGlzdDxieXRlPiBzdHJ1Y3QyX21lbWJlcjcsCisgICAgODogbGlzdDxiaW5hcnk+IHN0cnVjdDJfbWVtYmVyOCwKKyAgICA5OiBsaXN0PHRlc3RfZW51bTE+IHN0cnVjdDJfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QzIHsKKyAgICAxOiBtYXA8aTE2LCBpMzI+IHN0cnVjdDNfbWVtYmVyMSA9IHsxOjIsIDM6NH0sCisgICAgMjogbWFwPGk2NCwgZG91YmxlPiBzdHJ1Y3QzX21lbWJlcjIgPSB7MTA6MS4xLCAyMDoyLjF9LAorICAgIDM6IG1hcDxzdHJpbmcsIGJvb2w+IHN0cnVjdDNfbWVtYmVyMywKKyAgICA0OiBtYXA8Ynl0ZSwgdGVzdF9lbnVtMT4gc3RydWN0M19tZW1iZXI0LAorICAgIDU6IG1hcDx0ZXN0X2VudW0yLCB0ZXN0X2VudW0zID4gc3RydWN0M19tZW1iZXI1LAorICAgIDc6IG1hcDxkb3VibGUsIHN0cmluZz4gc3RydWN0M19tZW1iZXI3Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDQgeworICAgIDE6IGkzMiBzdHJ1Y3Q0X21lbWJlcjEsCisgICAgMjogb3B0aW9uYWwgaTMyIHN0cnVjdDRfbWVtYmVyMgorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q1eworICAgIDE6IGRvdWJsZSBzdHJ1Y3Q1X21lbWJlcjEsCisgICAgMjogc3RyaW5nIHN0cnVjdDVfbWVtYmVyMiA9ICJUaHJpZnQgQXVkaXQgVGVzdCIKK30KK3N0cnVjdCB0ZXN0X3N0cnVjdDYgeworICAgIDE6IGkzMiBzdHJ1Y3Q2X21lbWJlcjEsCisgICAgMjogcmVxdWlyZWQgaTMyIHN0cnVjdDZfbWVtYmVyMgorfQorCitzZXJ2aWNlIGJhc2UgeworICAgIG9uZXdheSB2b2lkIGJhc2Vfb25ld2F5KAorICAgICAgICAxOiBpMzIgYXJnMSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMTYgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGkzMiBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogaTY0IGZ1bmN0aW9uMV9hcmczLAorICAgICAgICA0OiBkb3VibGUgZnVuY3Rpb24xX2FyZzQsCisgICAgICAgIDU6IHN0cmluZyBmdW5jdGlvbjFfYXJnNSwKKyAgICAgICAgNjogYm9vbCBmdW5jdGlvbjFfYXJnNiwKKyAgICAgICAgNzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnNywKKyAgICAgICAgODogdGVzdF9zdHJ1Y3QxIGZ1bmN0aW9uMV9hcmc4KSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTE2PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxpMzI+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmc1LAorICAgICAgICA2OiBsaXN0PGJvb2w+IGZ1bmN0aW9uMl9hcmc2LAorICAgICAgICA3OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc3LAorICAgICAgICA4OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc4LAorICAgICAgICA5OiBsaXN0PHRlc3Rfc3RydWN0MT4gZnVuY3Rpb24yX2FyZzkpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24zKCksCisKK30KKworc2VydmljZSBkZXJpdmVkMSB7CisgICAgCisgICAgdGVzdF9lbnVtMSBkZXJpdmVkMV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGk2NCBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogZG91YmxlIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgaTY0IGRlcml2ZWQxX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnNSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGRvdWJsZSBkZXJpdmVkMV9mdW5jdGlvbjMoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjNfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjNfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHN0cmluZyBkZXJpdmVkMV9mdW5jdGlvbjQoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjRfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjRfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworCisgICAgYm9vbCBkZXJpdmVkMV9mdW5jdGlvbjUoCisgICAgICAgIDE6IG1hcDxpNjQsIGRvdWJsZT4gZnVuY3Rpb241X2FyZzEsCisgICAgICAgIDI6IG1hcDxzdHJpbmcsIGJvb2w+IGZ1bmN0aW9uNV9hcmcyLAorICAgICAgICAzOiBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZnVuY3Rpb241X2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB0ZXN0X3N0cnVjdDEgZGVyaXZlZDFfZnVuY3Rpb242KAorICAgICAgICAxOiBkb3VibGUgZnVuY3Rpb242X2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCit9CisKK3NlcnZpY2UgZGVyaXZlZDIgZXh0ZW5kcyBiYXNlIHsKKworICAgIGxpc3Q8aTMyPiBkZXJpdmVkMl9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkzMiBmdW5jdGlvbjFfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKKyAgICBsaXN0PHRlc3RfZW51bTE+IGRlcml2ZWQyX2Z1bmN0aW9uMigKKyAgICAgICAgMTppNjQgZnVuY3Rpb24yX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBsaXN0PHRlc3Rfc3RydWN0MT4gZGVyaXZlZDJfZnVuY3Rpb24zKAorICAgICAgICAxOmRvdWJsZSBmdW5jdGlvbjNfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPGRvdWJsZSwgc3RyaW5nPiBkZXJpdmVkMl9mdW5jdGlvbjQoCisgICAgICAgIDE6c3RyaW5nIGZ1bmN0aW9uNF9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZGVyaXZlZDJfZnVuY3Rpb241KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb241X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X3N0cnVjdDEsIHRlc3Rfc3RydWN0Mj4gZGVyaXZlZDJfZnVuY3Rpb242KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb242X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKK30KZGlmZiAtLWdpdCBhL3Rlc3QvYXVkaXQvYnJlYWsyNS50aHJpZnQgYi90ZXN0L2F1ZGl0L2JyZWFrMjUudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlZmU5N2UKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2F1ZGl0L2JyZWFrMjUudGhyaWZ0CkBAIC0wLDAgKzEsMTkxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vQ2hhbmdlZCBpbmhlcml0YW5jZSBvZiBkZXJpdmVkMgorCituYW1lc3BhY2UgY3BwIHRlc3QKKworLy9Db25zdGFudHMKK2NvbnN0IGkzMiBjb25zdDEgPSAxMjM7Citjb25zdCBkb3VibGUgY29uc3QyID0gMjMuMzsKK2NvbnN0IG1hcDxzdHJpbmcsc3RyaW5nPiBjb25zdDMgPSB7ImhlbGxvIjoid29ybGQiLCAidGhyaWZ0IjoiYXVkaXQifTsKKworCisvL0V4Y2VwdGlvbgorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMSB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CitleGNlcHRpb24gdGVzdF9leGNlcHRpb24yIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KKworLy9FbnVtcworCitlbnVtIHRlc3RfZW51bTEgeworICAgIGVudW0xX3ZhbHVlMCA9IDAsCisgICAgZW51bTFfdmFsdWUxID0gMSwKKyAgICBlbnVtMV92YWx1ZTIgPSAyLAorICAgIGVudW0xX3ZhbHVlNSA9IDUsCisgICAgZW51bTFfdmFsdWU3ID0gNywKKyAgICBlbnVtMV92YWx1ZTggPSA4Cit9CisKK2VudW0gdGVzdF9lbnVtMiB7CisgICAgZW51bTJfdmFsdWUwID0gMCwKKyAgICBlbnVtMl92YWx1ZTEgPSAxLAorICAgIGVudW0yX3ZhbHVlMiA9IDIsCisgICAgZW51bTJfdmFsdWUzID0gMworfQorCitlbnVtIHRlc3RfZW51bTMgeworICAgIGVudW0zX3ZhbHVlMSA9IDAsCisgICAgZW51bTNfdmFsdWUyID0gMQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QxIHsKKyAgICAxOiBpMTYgc3RydWN0MV9tZW1iZXIxLAorICAgIDI6IGkzMiBzdHJ1Y3QxX21lbWJlcjIsCisgICAgMzogaTY0IHN0cnVjdDFfbWVtYmVyMywKKyAgICA0OiBkb3VibGUgc3RydWN0MV9tZW1iZXI0ID0gMi41LAorICAgIDU6IHN0cmluZyBzdHJ1Y3QxX21lbWJlcjUgPSAiQXVkaXQgdGVzdCIsCisgICAgNjogYm9vbCBzdHJ1Y3QxX21lbWJlcjYsCisgICAgNzogYnl0ZSBzdHJ1Y3QxX21lbWJlcjcsCisgICAgODogYmluYXJ5IHN0cnVjdDFfbWVtYmVyOCwKKyAgICA5OiB0ZXN0X2VudW0xIHN0cnVjdDFfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QyIHsKKyAgICAxOiBsaXN0PGkxNj4gc3RydWN0Ml9tZW1iZXIxLAorICAgIDI6IGxpc3Q8aTMyPiBzdHJ1Y3QyX21lbWJlcjIsCisgICAgMzogbGlzdDxpNjQ+IHN0cnVjdDJfbWVtYmVyMyA9IFsyMywgMzIgXSwKKyAgICA0OiBsaXN0PGRvdWJsZT4gc3RydWN0Ml9tZW1iZXI0LAorICAgIDU6IGxpc3Q8c3RyaW5nPiBzdHJ1Y3QyX21lbWJlcjUsCisgICAgNjogbGlzdDxib29sPiBzdHJ1Y3QyX21lbWJlcjYsCisgICAgNzogbGlzdDxieXRlPiBzdHJ1Y3QyX21lbWJlcjcsCisgICAgODogbGlzdDxiaW5hcnk+IHN0cnVjdDJfbWVtYmVyOCwKKyAgICA5OiBsaXN0PHRlc3RfZW51bTE+IHN0cnVjdDJfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QzIHsKKyAgICAxOiBtYXA8aTE2LCBpMzI+IHN0cnVjdDNfbWVtYmVyMSA9IHsxOjIsIDM6NH0sCisgICAgMjogbWFwPGk2NCwgZG91YmxlPiBzdHJ1Y3QzX21lbWJlcjIgPSB7MTA6MS4xLCAyMDoyLjF9LAorICAgIDM6IG1hcDxzdHJpbmcsIGJvb2w+IHN0cnVjdDNfbWVtYmVyMywKKyAgICA0OiBtYXA8Ynl0ZSwgdGVzdF9lbnVtMT4gc3RydWN0M19tZW1iZXI0LAorICAgIDU6IG1hcDx0ZXN0X2VudW0yLCB0ZXN0X2VudW0zID4gc3RydWN0M19tZW1iZXI1LAorICAgIDc6IG1hcDxkb3VibGUsIHN0cmluZz4gc3RydWN0M19tZW1iZXI3Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDQgeworICAgIDE6IGkzMiBzdHJ1Y3Q0X21lbWJlcjEsCisgICAgMjogb3B0aW9uYWwgaTMyIHN0cnVjdDRfbWVtYmVyMgorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q1eworICAgIDE6IGRvdWJsZSBzdHJ1Y3Q1X21lbWJlcjEsCisgICAgMjogc3RyaW5nIHN0cnVjdDVfbWVtYmVyMiA9ICJUaHJpZnQgQXVkaXQgVGVzdCIKK30KK3N0cnVjdCB0ZXN0X3N0cnVjdDYgeworICAgIDE6IGkzMiBzdHJ1Y3Q2X21lbWJlcjEsCisgICAgMjogcmVxdWlyZWQgaTMyIHN0cnVjdDZfbWVtYmVyMgorfQorCitzZXJ2aWNlIGJhc2UgeworICAgIG9uZXdheSB2b2lkIGJhc2Vfb25ld2F5KAorICAgICAgICAxOiBpMzIgYXJnMSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMTYgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGkzMiBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogaTY0IGZ1bmN0aW9uMV9hcmczLAorICAgICAgICA0OiBkb3VibGUgZnVuY3Rpb24xX2FyZzQsCisgICAgICAgIDU6IHN0cmluZyBmdW5jdGlvbjFfYXJnNSwKKyAgICAgICAgNjogYm9vbCBmdW5jdGlvbjFfYXJnNiwKKyAgICAgICAgNzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnNywKKyAgICAgICAgODogdGVzdF9zdHJ1Y3QxIGZ1bmN0aW9uMV9hcmc4KSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTE2PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxpMzI+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmc1LAorICAgICAgICA2OiBsaXN0PGJvb2w+IGZ1bmN0aW9uMl9hcmc2LAorICAgICAgICA3OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc3LAorICAgICAgICA4OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc4LAorICAgICAgICA5OiBsaXN0PHRlc3Rfc3RydWN0MT4gZnVuY3Rpb24yX2FyZzkpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24zKCksCisKK30KKworc2VydmljZSBkZXJpdmVkMSBleHRlbmRzIGJhc2UgeworICAgIAorICAgIHRlc3RfZW51bTEgZGVyaXZlZDFfZnVuY3Rpb24xKAorICAgICAgICAxOiBpNjQgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGRvdWJsZSBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGk2NCBkZXJpdmVkMV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzUpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBkb3VibGUgZGVyaXZlZDFfZnVuY3Rpb24zKAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb24zX2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb24zX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBzdHJpbmcgZGVyaXZlZDFfZnVuY3Rpb240KAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb240X2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb240X2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKworICAgIGJvb2wgZGVyaXZlZDFfZnVuY3Rpb241KAorICAgICAgICAxOiBtYXA8aTY0LCBkb3VibGU+IGZ1bmN0aW9uNV9hcmcxLAorICAgICAgICAyOiBtYXA8c3RyaW5nLCBib29sPiBmdW5jdGlvbjVfYXJnMiwKKyAgICAgICAgMzogbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGZ1bmN0aW9uNV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdGVzdF9zdHJ1Y3QxIGRlcml2ZWQxX2Z1bmN0aW9uNigKKyAgICAgICAgMTogZG91YmxlIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorfQorCitzZXJ2aWNlIGRlcml2ZWQyIGV4dGVuZHMgZGVyaXZlZDEgeworCisgICAgbGlzdDxpMzI+IGRlcml2ZWQyX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTMyIGZ1bmN0aW9uMV9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorICAgIGxpc3Q8dGVzdF9lbnVtMT4gZGVyaXZlZDJfZnVuY3Rpb24yKAorICAgICAgICAxOmk2NCBmdW5jdGlvbjJfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGxpc3Q8dGVzdF9zdHJ1Y3QxPiBkZXJpdmVkMl9mdW5jdGlvbjMoCisgICAgICAgIDE6ZG91YmxlIGZ1bmN0aW9uM19hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8ZG91YmxlLCBzdHJpbmc+IGRlcml2ZWQyX2Z1bmN0aW9uNCgKKyAgICAgICAgMTpzdHJpbmcgZnVuY3Rpb240X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBkZXJpdmVkMl9mdW5jdGlvbjUoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjVfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3Rfc3RydWN0MSwgdGVzdF9zdHJ1Y3QyPiBkZXJpdmVkMl9mdW5jdGlvbjYoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorfQpkaWZmIC0tZ2l0IGEvdGVzdC9hdWRpdC9icmVhazI2LnRocmlmdCBiL3Rlc3QvYXVkaXQvYnJlYWsyNi50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU3NmQ5YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYXVkaXQvYnJlYWsyNi50aHJpZnQKQEAgLTAsMCArMSwxOTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy9icmVhazI2IC0gRmllbGQgdHlwZSBjaGFuZ2VkIGluIGJhc2VfZnVuY3Rpb24xIGFyZ3VtZW50IGlkPTMKK25hbWVzcGFjZSBjcHAgdGVzdAorCisvL0NvbnN0YW50cworY29uc3QgaTMyIGNvbnN0MSA9IDEyMzsKK2NvbnN0IGRvdWJsZSBjb25zdDIgPSAyMy4zOworY29uc3QgbWFwPHN0cmluZyxzdHJpbmc+IGNvbnN0MyA9IHsiaGVsbG8iOiJ3b3JsZCIsICJ0aHJpZnQiOiJhdWRpdCJ9OworCisKKy8vRXhjZXB0aW9uCitleGNlcHRpb24gdGVzdF9leGNlcHRpb24xIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjIgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorCisvL0VudW1zCisKK2VudW0gdGVzdF9lbnVtMSB7CisgICAgZW51bTFfdmFsdWUwID0gMCwKKyAgICBlbnVtMV92YWx1ZTEgPSAxLAorICAgIGVudW0xX3ZhbHVlMiA9IDIsCisgICAgZW51bTFfdmFsdWU1ID0gNSwKKyAgICBlbnVtMV92YWx1ZTcgPSA3LAorICAgIGVudW0xX3ZhbHVlOCA9IDgKK30KKworZW51bSB0ZXN0X2VudW0yIHsKKyAgICBlbnVtMl92YWx1ZTAgPSAwLAorICAgIGVudW0yX3ZhbHVlMSA9IDEsCisgICAgZW51bTJfdmFsdWUyID0gMiwKKyAgICBlbnVtMl92YWx1ZTMgPSAzCit9CisKK2VudW0gdGVzdF9lbnVtMyB7CisgICAgZW51bTNfdmFsdWUxID0gMCwKKyAgICBlbnVtM192YWx1ZTIgPSAxCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDEgeworICAgIDE6IGkxNiBzdHJ1Y3QxX21lbWJlcjEsCisgICAgMjogaTMyIHN0cnVjdDFfbWVtYmVyMiwKKyAgICAzOiBpNjQgc3RydWN0MV9tZW1iZXIzLAorICAgIDQ6IGRvdWJsZSBzdHJ1Y3QxX21lbWJlcjQgPSAyLjUsCisgICAgNTogc3RyaW5nIHN0cnVjdDFfbWVtYmVyNSA9ICJBdWRpdCB0ZXN0IiwKKyAgICA2OiBib29sIHN0cnVjdDFfbWVtYmVyNiwKKyAgICA3OiBieXRlIHN0cnVjdDFfbWVtYmVyNywKKyAgICA4OiBiaW5hcnkgc3RydWN0MV9tZW1iZXI4LAorICAgIDk6IHRlc3RfZW51bTEgc3RydWN0MV9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDIgeworICAgIDE6IGxpc3Q8aTE2PiBzdHJ1Y3QyX21lbWJlcjEsCisgICAgMjogbGlzdDxpMzI+IHN0cnVjdDJfbWVtYmVyMiwKKyAgICAzOiBsaXN0PGk2ND4gc3RydWN0Ml9tZW1iZXIzID0gWzIzLCAzMiBdLAorICAgIDQ6IGxpc3Q8ZG91YmxlPiBzdHJ1Y3QyX21lbWJlcjQsCisgICAgNTogbGlzdDxzdHJpbmc+IHN0cnVjdDJfbWVtYmVyNSwKKyAgICA2OiBsaXN0PGJvb2w+IHN0cnVjdDJfbWVtYmVyNiwKKyAgICA3OiBsaXN0PGJ5dGU+IHN0cnVjdDJfbWVtYmVyNywKKyAgICA4OiBsaXN0PGJpbmFyeT4gc3RydWN0Ml9tZW1iZXI4LAorICAgIDk6IGxpc3Q8dGVzdF9lbnVtMT4gc3RydWN0Ml9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDMgeworICAgIDE6IG1hcDxpMTYsIGkzMj4gc3RydWN0M19tZW1iZXIxID0gezE6MiwgMzo0fSwKKyAgICAyOiBtYXA8aTY0LCBkb3VibGU+IHN0cnVjdDNfbWVtYmVyMiA9IHsxMDoxLjEsIDIwOjIuMX0sCisgICAgMzogbWFwPHN0cmluZywgYm9vbD4gc3RydWN0M19tZW1iZXIzLAorICAgIDQ6IG1hcDxieXRlLCB0ZXN0X2VudW0xPiBzdHJ1Y3QzX21lbWJlcjQsCisgICAgNTogbWFwPHRlc3RfZW51bTIsIHRlc3RfZW51bTMgPiBzdHJ1Y3QzX21lbWJlcjUsCisgICAgNzogbWFwPGRvdWJsZSwgc3RyaW5nPiBzdHJ1Y3QzX21lbWJlcjcKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NCB7CisgICAgMTogaTMyIHN0cnVjdDRfbWVtYmVyMSwKKyAgICAyOiBvcHRpb25hbCBpMzIgc3RydWN0NF9tZW1iZXIyCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDV7CisgICAgMTogZG91YmxlIHN0cnVjdDVfbWVtYmVyMSwKKyAgICAyOiBzdHJpbmcgc3RydWN0NV9tZW1iZXIyID0gIlRocmlmdCBBdWRpdCBUZXN0IgorfQorc3RydWN0IHRlc3Rfc3RydWN0NiB7CisgICAgMTogaTMyIHN0cnVjdDZfbWVtYmVyMSwKKyAgICAyOiByZXF1aXJlZCBpMzIgc3RydWN0Nl9tZW1iZXIyCit9CisKK3NlcnZpY2UgYmFzZSB7CisgICAgb25ld2F5IHZvaWQgYmFzZV9vbmV3YXkoCisgICAgICAgIDE6IGkzMiBhcmcxKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkxNiBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogaTMyIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiBkb3VibGUgZnVuY3Rpb24xX2FyZzMsCisgICAgICAgIDQ6IGRvdWJsZSBmdW5jdGlvbjFfYXJnNCwKKyAgICAgICAgNTogc3RyaW5nIGZ1bmN0aW9uMV9hcmc1LAorICAgICAgICA2OiBib29sIGZ1bmN0aW9uMV9hcmc2LAorICAgICAgICA3OiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmc3LAorICAgICAgICA4OiB0ZXN0X3N0cnVjdDEgZnVuY3Rpb24xX2FyZzgpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpMTY+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGkzMj4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzUsCisgICAgICAgIDY6IGxpc3Q8Ym9vbD4gZnVuY3Rpb24yX2FyZzYsCisgICAgICAgIDc6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzcsCisgICAgICAgIDg6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzgsCisgICAgICAgIDk6IGxpc3Q8dGVzdF9zdHJ1Y3QxPiBmdW5jdGlvbjJfYXJnOSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjMoKSwKKworfQorCitzZXJ2aWNlIGRlcml2ZWQxIGV4dGVuZHMgYmFzZSB7CisgICAgCisgICAgdGVzdF9lbnVtMSBkZXJpdmVkMV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGk2NCBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogZG91YmxlIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgaTY0IGRlcml2ZWQxX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnNSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGRvdWJsZSBkZXJpdmVkMV9mdW5jdGlvbjMoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjNfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjNfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHN0cmluZyBkZXJpdmVkMV9mdW5jdGlvbjQoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjRfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjRfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworCisgICAgYm9vbCBkZXJpdmVkMV9mdW5jdGlvbjUoCisgICAgICAgIDE6IG1hcDxpNjQsIGRvdWJsZT4gZnVuY3Rpb241X2FyZzEsCisgICAgICAgIDI6IG1hcDxzdHJpbmcsIGJvb2w+IGZ1bmN0aW9uNV9hcmcyLAorICAgICAgICAzOiBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZnVuY3Rpb241X2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB0ZXN0X3N0cnVjdDEgZGVyaXZlZDFfZnVuY3Rpb242KAorICAgICAgICAxOiBkb3VibGUgZnVuY3Rpb242X2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCit9CisKK3NlcnZpY2UgZGVyaXZlZDIgZXh0ZW5kcyBiYXNlIHsKKworICAgIGxpc3Q8aTMyPiBkZXJpdmVkMl9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkzMiBmdW5jdGlvbjFfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKKyAgICBsaXN0PHRlc3RfZW51bTE+IGRlcml2ZWQyX2Z1bmN0aW9uMigKKyAgICAgICAgMTppNjQgZnVuY3Rpb24yX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBsaXN0PHRlc3Rfc3RydWN0MT4gZGVyaXZlZDJfZnVuY3Rpb24zKAorICAgICAgICAxOmRvdWJsZSBmdW5jdGlvbjNfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPGRvdWJsZSwgc3RyaW5nPiBkZXJpdmVkMl9mdW5jdGlvbjQoCisgICAgICAgIDE6c3RyaW5nIGZ1bmN0aW9uNF9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZGVyaXZlZDJfZnVuY3Rpb241KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb241X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X3N0cnVjdDEsIHRlc3Rfc3RydWN0Mj4gZGVyaXZlZDJfZnVuY3Rpb242KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb242X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKK30KKwpkaWZmIC0tZ2l0IGEvdGVzdC9hdWRpdC9icmVhazI3LnRocmlmdCBiL3Rlc3QvYXVkaXQvYnJlYWsyNy50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU1NjcwNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYXVkaXQvYnJlYWsyNy50aHJpZnQKQEAgLTAsMCArMSwxOTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gYnJlYWsyNyAtIGFyZ3VtZW50IGNoYW5nZWQgYmFzZV9mdW5jdGlvbjIgbGlzdDxlbnVtMT4gdG8gbGlzdDxlbnVtMz4gaWQgPTgKK25hbWVzcGFjZSBjcHAgdGVzdAorCisvL0NvbnN0YW50cworY29uc3QgaTMyIGNvbnN0MSA9IDEyMzsKK2NvbnN0IGRvdWJsZSBjb25zdDIgPSAyMy4zOworY29uc3QgbWFwPHN0cmluZyxzdHJpbmc+IGNvbnN0MyA9IHsiaGVsbG8iOiJ3b3JsZCIsICJ0aHJpZnQiOiJhdWRpdCJ9OworCisKKy8vRXhjZXB0aW9uCitleGNlcHRpb24gdGVzdF9leGNlcHRpb24xIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjIgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorCisvL0VudW1zCisKK2VudW0gdGVzdF9lbnVtMSB7CisgICAgZW51bTFfdmFsdWUwID0gMCwKKyAgICBlbnVtMV92YWx1ZTEgPSAxLAorICAgIGVudW0xX3ZhbHVlMiA9IDIsCisgICAgZW51bTFfdmFsdWU1ID0gNSwKKyAgICBlbnVtMV92YWx1ZTcgPSA3LAorICAgIGVudW0xX3ZhbHVlOCA9IDgKK30KKworZW51bSB0ZXN0X2VudW0yIHsKKyAgICBlbnVtMl92YWx1ZTAgPSAwLAorICAgIGVudW0yX3ZhbHVlMSA9IDEsCisgICAgZW51bTJfdmFsdWUyID0gMiwKKyAgICBlbnVtMl92YWx1ZTMgPSAzCit9CisKK2VudW0gdGVzdF9lbnVtMyB7CisgICAgZW51bTNfdmFsdWUxID0gMCwKKyAgICBlbnVtM192YWx1ZTIgPSAxCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDEgeworICAgIDE6IGkxNiBzdHJ1Y3QxX21lbWJlcjEsCisgICAgMjogaTMyIHN0cnVjdDFfbWVtYmVyMiwKKyAgICAzOiBpNjQgc3RydWN0MV9tZW1iZXIzLAorICAgIDQ6IGRvdWJsZSBzdHJ1Y3QxX21lbWJlcjQgPSAyLjUsCisgICAgNTogc3RyaW5nIHN0cnVjdDFfbWVtYmVyNSA9ICJBdWRpdCB0ZXN0IiwKKyAgICA2OiBib29sIHN0cnVjdDFfbWVtYmVyNiwKKyAgICA3OiBieXRlIHN0cnVjdDFfbWVtYmVyNywKKyAgICA4OiBiaW5hcnkgc3RydWN0MV9tZW1iZXI4LAorICAgIDk6IHRlc3RfZW51bTEgc3RydWN0MV9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDIgeworICAgIDE6IGxpc3Q8aTE2PiBzdHJ1Y3QyX21lbWJlcjEsCisgICAgMjogbGlzdDxpMzI+IHN0cnVjdDJfbWVtYmVyMiwKKyAgICAzOiBsaXN0PGk2ND4gc3RydWN0Ml9tZW1iZXIzID0gWzIzLCAzMiBdLAorICAgIDQ6IGxpc3Q8ZG91YmxlPiBzdHJ1Y3QyX21lbWJlcjQsCisgICAgNTogbGlzdDxzdHJpbmc+IHN0cnVjdDJfbWVtYmVyNSwKKyAgICA2OiBsaXN0PGJvb2w+IHN0cnVjdDJfbWVtYmVyNiwKKyAgICA3OiBsaXN0PGJ5dGU+IHN0cnVjdDJfbWVtYmVyNywKKyAgICA4OiBsaXN0PGJpbmFyeT4gc3RydWN0Ml9tZW1iZXI4LAorICAgIDk6IGxpc3Q8dGVzdF9lbnVtMT4gc3RydWN0Ml9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDMgeworICAgIDE6IG1hcDxpMTYsIGkzMj4gc3RydWN0M19tZW1iZXIxID0gezE6MiwgMzo0fSwKKyAgICAyOiBtYXA8aTY0LCBkb3VibGU+IHN0cnVjdDNfbWVtYmVyMiA9IHsxMDoxLjEsIDIwOjIuMX0sCisgICAgMzogbWFwPHN0cmluZywgYm9vbD4gc3RydWN0M19tZW1iZXIzLAorICAgIDQ6IG1hcDxieXRlLCB0ZXN0X2VudW0xPiBzdHJ1Y3QzX21lbWJlcjQsCisgICAgNTogbWFwPHRlc3RfZW51bTIsIHRlc3RfZW51bTMgPiBzdHJ1Y3QzX21lbWJlcjUsCisgICAgNzogbWFwPGRvdWJsZSwgc3RyaW5nPiBzdHJ1Y3QzX21lbWJlcjcKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NCB7CisgICAgMTogaTMyIHN0cnVjdDRfbWVtYmVyMSwKKyAgICAyOiBvcHRpb25hbCBpMzIgc3RydWN0NF9tZW1iZXIyCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDV7CisgICAgMTogZG91YmxlIHN0cnVjdDVfbWVtYmVyMSwKKyAgICAyOiBzdHJpbmcgc3RydWN0NV9tZW1iZXIyID0gIlRocmlmdCBBdWRpdCBUZXN0IgorfQorc3RydWN0IHRlc3Rfc3RydWN0NiB7CisgICAgMTogaTMyIHN0cnVjdDZfbWVtYmVyMSwKKyAgICAyOiByZXF1aXJlZCBpMzIgc3RydWN0Nl9tZW1iZXIyCit9CisKK3NlcnZpY2UgYmFzZSB7CisgICAgb25ld2F5IHZvaWQgYmFzZV9vbmV3YXkoCisgICAgICAgIDE6IGkzMiBhcmcxKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkxNiBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogaTMyIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiBpNjQgZnVuY3Rpb24xX2FyZzMsCisgICAgICAgIDQ6IGRvdWJsZSBmdW5jdGlvbjFfYXJnNCwKKyAgICAgICAgNTogc3RyaW5nIGZ1bmN0aW9uMV9hcmc1LAorICAgICAgICA2OiBib29sIGZ1bmN0aW9uMV9hcmc2LAorICAgICAgICA3OiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmc3LAorICAgICAgICA4OiB0ZXN0X3N0cnVjdDEgZnVuY3Rpb24xX2FyZzgpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpMTY+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGkzMj4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzUsCisgICAgICAgIDY6IGxpc3Q8Ym9vbD4gZnVuY3Rpb24yX2FyZzYsCisgICAgICAgIDc6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzcsCisgICAgICAgIDg6IGxpc3Q8dGVzdF9lbnVtMz4gZnVuY3Rpb24yX2FyZzgsCisgICAgICAgIDk6IGxpc3Q8dGVzdF9zdHJ1Y3QxPiBmdW5jdGlvbjJfYXJnOSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjMoKSwKKworfQorCitzZXJ2aWNlIGRlcml2ZWQxIGV4dGVuZHMgYmFzZSB7CisgICAgCisgICAgdGVzdF9lbnVtMSBkZXJpdmVkMV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGk2NCBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogZG91YmxlIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgaTY0IGRlcml2ZWQxX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnNSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGRvdWJsZSBkZXJpdmVkMV9mdW5jdGlvbjMoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjNfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjNfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHN0cmluZyBkZXJpdmVkMV9mdW5jdGlvbjQoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjRfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjRfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworCisgICAgYm9vbCBkZXJpdmVkMV9mdW5jdGlvbjUoCisgICAgICAgIDE6IG1hcDxpNjQsIGRvdWJsZT4gZnVuY3Rpb241X2FyZzEsCisgICAgICAgIDI6IG1hcDxzdHJpbmcsIGJvb2w+IGZ1bmN0aW9uNV9hcmcyLAorICAgICAgICAzOiBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZnVuY3Rpb241X2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB0ZXN0X3N0cnVjdDEgZGVyaXZlZDFfZnVuY3Rpb242KAorICAgICAgICAxOiBkb3VibGUgZnVuY3Rpb242X2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCit9CisKK3NlcnZpY2UgZGVyaXZlZDIgZXh0ZW5kcyBiYXNlIHsKKworICAgIGxpc3Q8aTMyPiBkZXJpdmVkMl9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkzMiBmdW5jdGlvbjFfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKKyAgICBsaXN0PHRlc3RfZW51bTE+IGRlcml2ZWQyX2Z1bmN0aW9uMigKKyAgICAgICAgMTppNjQgZnVuY3Rpb24yX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBsaXN0PHRlc3Rfc3RydWN0MT4gZGVyaXZlZDJfZnVuY3Rpb24zKAorICAgICAgICAxOmRvdWJsZSBmdW5jdGlvbjNfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPGRvdWJsZSwgc3RyaW5nPiBkZXJpdmVkMl9mdW5jdGlvbjQoCisgICAgICAgIDE6c3RyaW5nIGZ1bmN0aW9uNF9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZGVyaXZlZDJfZnVuY3Rpb241KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb241X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X3N0cnVjdDEsIHRlc3Rfc3RydWN0Mj4gZGVyaXZlZDJfZnVuY3Rpb242KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb242X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKK30KZGlmZiAtLWdpdCBhL3Rlc3QvYXVkaXQvYnJlYWsyOC50aHJpZnQgYi90ZXN0L2F1ZGl0L2JyZWFrMjgudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2NGU1NTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2F1ZGl0L2JyZWFrMjgudGhyaWZ0CkBAIC0wLDAgKzEsMTkwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vYnJlYWsyOC0gZGVyaXZlZDFfZnVuY3Rpb241IGFyZ3VlbWVudCB0eXBlIGNoYW5nZWQgbWFwPGk2NCwgZG91YmxlPiB0byBsaXN0PGk2ND4KK25hbWVzcGFjZSBjcHAgdGVzdAorCisvL0NvbnN0YW50cworY29uc3QgaTMyIGNvbnN0MSA9IDEyMzsKK2NvbnN0IGRvdWJsZSBjb25zdDIgPSAyMy4zOworY29uc3QgbWFwPHN0cmluZyxzdHJpbmc+IGNvbnN0MyA9IHsiaGVsbG8iOiJ3b3JsZCIsICJ0aHJpZnQiOiJhdWRpdCJ9OworCisKKy8vRXhjZXB0aW9uCitleGNlcHRpb24gdGVzdF9leGNlcHRpb24xIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjIgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorCisvL0VudW1zCisKK2VudW0gdGVzdF9lbnVtMSB7CisgICAgZW51bTFfdmFsdWUwID0gMCwKKyAgICBlbnVtMV92YWx1ZTEgPSAxLAorICAgIGVudW0xX3ZhbHVlMiA9IDIsCisgICAgZW51bTFfdmFsdWU1ID0gNSwKKyAgICBlbnVtMV92YWx1ZTcgPSA3LAorICAgIGVudW0xX3ZhbHVlOCA9IDgKK30KKworZW51bSB0ZXN0X2VudW0yIHsKKyAgICBlbnVtMl92YWx1ZTAgPSAwLAorICAgIGVudW0yX3ZhbHVlMSA9IDEsCisgICAgZW51bTJfdmFsdWUyID0gMiwKKyAgICBlbnVtMl92YWx1ZTMgPSAzCit9CisKK2VudW0gdGVzdF9lbnVtMyB7CisgICAgZW51bTNfdmFsdWUxID0gMCwKKyAgICBlbnVtM192YWx1ZTIgPSAxCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDEgeworICAgIDE6IGkxNiBzdHJ1Y3QxX21lbWJlcjEsCisgICAgMjogaTMyIHN0cnVjdDFfbWVtYmVyMiwKKyAgICAzOiBpNjQgc3RydWN0MV9tZW1iZXIzLAorICAgIDQ6IGRvdWJsZSBzdHJ1Y3QxX21lbWJlcjQgPSAyLjUsCisgICAgNTogc3RyaW5nIHN0cnVjdDFfbWVtYmVyNSA9ICJBdWRpdCB0ZXN0IiwKKyAgICA2OiBib29sIHN0cnVjdDFfbWVtYmVyNiwKKyAgICA3OiBieXRlIHN0cnVjdDFfbWVtYmVyNywKKyAgICA4OiBiaW5hcnkgc3RydWN0MV9tZW1iZXI4LAorICAgIDk6IHRlc3RfZW51bTEgc3RydWN0MV9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDIgeworICAgIDE6IGxpc3Q8aTE2PiBzdHJ1Y3QyX21lbWJlcjEsCisgICAgMjogbGlzdDxpMzI+IHN0cnVjdDJfbWVtYmVyMiwKKyAgICAzOiBsaXN0PGk2ND4gc3RydWN0Ml9tZW1iZXIzID0gWzIzLCAzMiBdLAorICAgIDQ6IGxpc3Q8ZG91YmxlPiBzdHJ1Y3QyX21lbWJlcjQsCisgICAgNTogbGlzdDxzdHJpbmc+IHN0cnVjdDJfbWVtYmVyNSwKKyAgICA2OiBsaXN0PGJvb2w+IHN0cnVjdDJfbWVtYmVyNiwKKyAgICA3OiBsaXN0PGJ5dGU+IHN0cnVjdDJfbWVtYmVyNywKKyAgICA4OiBsaXN0PGJpbmFyeT4gc3RydWN0Ml9tZW1iZXI4LAorICAgIDk6IGxpc3Q8dGVzdF9lbnVtMT4gc3RydWN0Ml9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDMgeworICAgIDE6IG1hcDxpMTYsIGkzMj4gc3RydWN0M19tZW1iZXIxID0gezE6MiwgMzo0fSwKKyAgICAyOiBtYXA8aTY0LCBkb3VibGU+IHN0cnVjdDNfbWVtYmVyMiA9IHsxMDoxLjEsIDIwOjIuMX0sCisgICAgMzogbWFwPHN0cmluZywgYm9vbD4gc3RydWN0M19tZW1iZXIzLAorICAgIDQ6IG1hcDxieXRlLCB0ZXN0X2VudW0xPiBzdHJ1Y3QzX21lbWJlcjQsCisgICAgNTogbWFwPHRlc3RfZW51bTIsIHRlc3RfZW51bTMgPiBzdHJ1Y3QzX21lbWJlcjUsCisgICAgNzogbWFwPGRvdWJsZSwgc3RyaW5nPiBzdHJ1Y3QzX21lbWJlcjcKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NCB7CisgICAgMTogaTMyIHN0cnVjdDRfbWVtYmVyMSwKKyAgICAyOiBvcHRpb25hbCBpMzIgc3RydWN0NF9tZW1iZXIyCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDV7CisgICAgMTogZG91YmxlIHN0cnVjdDVfbWVtYmVyMSwKKyAgICAyOiBzdHJpbmcgc3RydWN0NV9tZW1iZXIyID0gIlRocmlmdCBBdWRpdCBUZXN0IgorfQorc3RydWN0IHRlc3Rfc3RydWN0NiB7CisgICAgMTogaTMyIHN0cnVjdDZfbWVtYmVyMSwKKyAgICAyOiByZXF1aXJlZCBpMzIgc3RydWN0Nl9tZW1iZXIyCit9CisKK3NlcnZpY2UgYmFzZSB7CisgICAgb25ld2F5IHZvaWQgYmFzZV9vbmV3YXkoCisgICAgICAgIDE6IGkzMiBhcmcxKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkxNiBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogaTMyIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiBpNjQgZnVuY3Rpb24xX2FyZzMsCisgICAgICAgIDQ6IGRvdWJsZSBmdW5jdGlvbjFfYXJnNCwKKyAgICAgICAgNTogc3RyaW5nIGZ1bmN0aW9uMV9hcmc1LAorICAgICAgICA2OiBib29sIGZ1bmN0aW9uMV9hcmc2LAorICAgICAgICA3OiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmc3LAorICAgICAgICA4OiB0ZXN0X3N0cnVjdDEgZnVuY3Rpb24xX2FyZzgpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpMTY+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGkzMj4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzUsCisgICAgICAgIDY6IGxpc3Q8Ym9vbD4gZnVuY3Rpb24yX2FyZzYsCisgICAgICAgIDc6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzcsCisgICAgICAgIDg6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzgsCisgICAgICAgIDk6IGxpc3Q8dGVzdF9zdHJ1Y3QxPiBmdW5jdGlvbjJfYXJnOSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjMoKSwKKworfQorCitzZXJ2aWNlIGRlcml2ZWQxIGV4dGVuZHMgYmFzZSB7CisgICAgCisgICAgdGVzdF9lbnVtMSBkZXJpdmVkMV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGk2NCBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogZG91YmxlIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgaTY0IGRlcml2ZWQxX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnNSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGRvdWJsZSBkZXJpdmVkMV9mdW5jdGlvbjMoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjNfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjNfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHN0cmluZyBkZXJpdmVkMV9mdW5jdGlvbjQoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjRfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjRfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworCisgICAgYm9vbCBkZXJpdmVkMV9mdW5jdGlvbjUoCisgICAgICAgIDE6IGxpc3Q8aTY0PiBmdW5jdGlvbjVfYXJnMSwKKyAgICAgICAgMjogbWFwPHN0cmluZywgYm9vbD4gZnVuY3Rpb241X2FyZzIsCisgICAgICAgIDM6IG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBmdW5jdGlvbjVfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHRlc3Rfc3RydWN0MSBkZXJpdmVkMV9mdW5jdGlvbjYoCisgICAgICAgIDE6IGRvdWJsZSBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKK30KKworc2VydmljZSBkZXJpdmVkMiBleHRlbmRzIGJhc2UgeworCisgICAgbGlzdDxpMzI+IGRlcml2ZWQyX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTMyIGZ1bmN0aW9uMV9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorICAgIGxpc3Q8dGVzdF9lbnVtMT4gZGVyaXZlZDJfZnVuY3Rpb24yKAorICAgICAgICAxOmk2NCBmdW5jdGlvbjJfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGxpc3Q8dGVzdF9zdHJ1Y3QxPiBkZXJpdmVkMl9mdW5jdGlvbjMoCisgICAgICAgIDE6ZG91YmxlIGZ1bmN0aW9uM19hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8ZG91YmxlLCBzdHJpbmc+IGRlcml2ZWQyX2Z1bmN0aW9uNCgKKyAgICAgICAgMTpzdHJpbmcgZnVuY3Rpb240X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBkZXJpdmVkMl9mdW5jdGlvbjUoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjVfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3Rfc3RydWN0MSwgdGVzdF9zdHJ1Y3QyPiBkZXJpdmVkMl9mdW5jdGlvbjYoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorfQpkaWZmIC0tZ2l0IGEvdGVzdC9hdWRpdC9icmVhazI5LnRocmlmdCBiL3Rlc3QvYXVkaXQvYnJlYWsyOS50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJmMzA4MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYXVkaXQvYnJlYWsyOS50aHJpZnQKQEAgLTAsMCArMSwxOTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy9icmVhazI5IC0gYmFzZV9mdW5jdGlvbjIgYXJndWVtbnQgdHlwZSBjaGFuZ2VkIGxpc3Q8c3RyaW5nPiB0byBzdHJpbmcKKworbmFtZXNwYWNlIGNwcCB0ZXN0CisKKy8vQ29uc3RhbnRzCitjb25zdCBpMzIgY29uc3QxID0gMTIzOworY29uc3QgZG91YmxlIGNvbnN0MiA9IDIzLjM7Citjb25zdCBtYXA8c3RyaW5nLHN0cmluZz4gY29uc3QzID0geyJoZWxsbyI6IndvcmxkIiwgInRocmlmdCI6ImF1ZGl0In07CisKKworLy9FeGNlcHRpb24KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjEgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMiB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CisKKy8vRW51bXMKKworZW51bSB0ZXN0X2VudW0xIHsKKyAgICBlbnVtMV92YWx1ZTAgPSAwLAorICAgIGVudW0xX3ZhbHVlMSA9IDEsCisgICAgZW51bTFfdmFsdWUyID0gMiwKKyAgICBlbnVtMV92YWx1ZTUgPSA1LAorICAgIGVudW0xX3ZhbHVlNyA9IDcsCisgICAgZW51bTFfdmFsdWU4ID0gOAorfQorCitlbnVtIHRlc3RfZW51bTIgeworICAgIGVudW0yX3ZhbHVlMCA9IDAsCisgICAgZW51bTJfdmFsdWUxID0gMSwKKyAgICBlbnVtMl92YWx1ZTIgPSAyLAorICAgIGVudW0yX3ZhbHVlMyA9IDMKK30KKworZW51bSB0ZXN0X2VudW0zIHsKKyAgICBlbnVtM192YWx1ZTEgPSAwLAorICAgIGVudW0zX3ZhbHVlMiA9IDEKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MSB7CisgICAgMTogaTE2IHN0cnVjdDFfbWVtYmVyMSwKKyAgICAyOiBpMzIgc3RydWN0MV9tZW1iZXIyLAorICAgIDM6IGk2NCBzdHJ1Y3QxX21lbWJlcjMsCisgICAgNDogZG91YmxlIHN0cnVjdDFfbWVtYmVyNCA9IDIuNSwKKyAgICA1OiBzdHJpbmcgc3RydWN0MV9tZW1iZXI1ID0gIkF1ZGl0IHRlc3QiLAorICAgIDY6IGJvb2wgc3RydWN0MV9tZW1iZXI2LAorICAgIDc6IGJ5dGUgc3RydWN0MV9tZW1iZXI3LAorICAgIDg6IGJpbmFyeSBzdHJ1Y3QxX21lbWJlcjgsCisgICAgOTogdGVzdF9lbnVtMSBzdHJ1Y3QxX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MiB7CisgICAgMTogbGlzdDxpMTY+IHN0cnVjdDJfbWVtYmVyMSwKKyAgICAyOiBsaXN0PGkzMj4gc3RydWN0Ml9tZW1iZXIyLAorICAgIDM6IGxpc3Q8aTY0PiBzdHJ1Y3QyX21lbWJlcjMgPSBbMjMsIDMyIF0sCisgICAgNDogbGlzdDxkb3VibGU+IHN0cnVjdDJfbWVtYmVyNCwKKyAgICA1OiBsaXN0PHN0cmluZz4gc3RydWN0Ml9tZW1iZXI1LAorICAgIDY6IGxpc3Q8Ym9vbD4gc3RydWN0Ml9tZW1iZXI2LAorICAgIDc6IGxpc3Q8Ynl0ZT4gc3RydWN0Ml9tZW1iZXI3LAorICAgIDg6IGxpc3Q8YmluYXJ5PiBzdHJ1Y3QyX21lbWJlcjgsCisgICAgOTogbGlzdDx0ZXN0X2VudW0xPiBzdHJ1Y3QyX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MyB7CisgICAgMTogbWFwPGkxNiwgaTMyPiBzdHJ1Y3QzX21lbWJlcjEgPSB7MToyLCAzOjR9LAorICAgIDI6IG1hcDxpNjQsIGRvdWJsZT4gc3RydWN0M19tZW1iZXIyID0gezEwOjEuMSwgMjA6Mi4xfSwKKyAgICAzOiBtYXA8c3RyaW5nLCBib29sPiBzdHJ1Y3QzX21lbWJlcjMsCisgICAgNDogbWFwPGJ5dGUsIHRlc3RfZW51bTE+IHN0cnVjdDNfbWVtYmVyNCwKKyAgICA1OiBtYXA8dGVzdF9lbnVtMiwgdGVzdF9lbnVtMyA+IHN0cnVjdDNfbWVtYmVyNSwKKyAgICA3OiBtYXA8ZG91YmxlLCBzdHJpbmc+IHN0cnVjdDNfbWVtYmVyNworfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q0IHsKKyAgICAxOiBpMzIgc3RydWN0NF9tZW1iZXIxLAorICAgIDI6IG9wdGlvbmFsIGkzMiBzdHJ1Y3Q0X21lbWJlcjIKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NXsKKyAgICAxOiBkb3VibGUgc3RydWN0NV9tZW1iZXIxLAorICAgIDI6IHN0cmluZyBzdHJ1Y3Q1X21lbWJlcjIgPSAiVGhyaWZ0IEF1ZGl0IFRlc3QiCit9CitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q2IHsKKyAgICAxOiBpMzIgc3RydWN0Nl9tZW1iZXIxLAorICAgIDI6IHJlcXVpcmVkIGkzMiBzdHJ1Y3Q2X21lbWJlcjIKK30KKworc2VydmljZSBiYXNlIHsKKyAgICBvbmV3YXkgdm9pZCBiYXNlX29uZXdheSgKKyAgICAgICAgMTogaTMyIGFyZzEpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTE2IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBpMzIgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IGk2NCBmdW5jdGlvbjFfYXJnMywKKyAgICAgICAgNDogZG91YmxlIGZ1bmN0aW9uMV9hcmc0LAorICAgICAgICA1OiBzdHJpbmcgZnVuY3Rpb24xX2FyZzUsCisgICAgICAgIDY6IGJvb2wgZnVuY3Rpb24xX2FyZzYsCisgICAgICAgIDc6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzcsCisgICAgICAgIDg6IHRlc3Rfc3RydWN0MSBmdW5jdGlvbjFfYXJnOCksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGkxNj4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8aTMyPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IHN0cmluZyBmdW5jdGlvbjJfYXJnNSwKKyAgICAgICAgNjogbGlzdDxib29sPiBmdW5jdGlvbjJfYXJnNiwKKyAgICAgICAgNzogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNywKKyAgICAgICAgODogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnOCwKKyAgICAgICAgOTogbGlzdDx0ZXN0X3N0cnVjdDE+IGZ1bmN0aW9uMl9hcmc5KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMygpLAorCit9CisKK3NlcnZpY2UgZGVyaXZlZDEgZXh0ZW5kcyBiYXNlIHsKKyAgICAKKyAgICB0ZXN0X2VudW0xIGRlcml2ZWQxX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTY0IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBkb3VibGUgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBpNjQgZGVyaXZlZDFfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc1KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgZG91YmxlIGRlcml2ZWQxX2Z1bmN0aW9uMygKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uM19hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uM19hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgc3RyaW5nIGRlcml2ZWQxX2Z1bmN0aW9uNCgKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uNF9hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uNF9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisKKyAgICBib29sIGRlcml2ZWQxX2Z1bmN0aW9uNSgKKyAgICAgICAgMTogbWFwPGk2NCwgZG91YmxlPiBmdW5jdGlvbjVfYXJnMSwKKyAgICAgICAgMjogbWFwPHN0cmluZywgYm9vbD4gZnVuY3Rpb241X2FyZzIsCisgICAgICAgIDM6IG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBmdW5jdGlvbjVfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHRlc3Rfc3RydWN0MSBkZXJpdmVkMV9mdW5jdGlvbjYoCisgICAgICAgIDE6IGRvdWJsZSBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKK30KKworc2VydmljZSBkZXJpdmVkMiBleHRlbmRzIGJhc2UgeworCisgICAgbGlzdDxpMzI+IGRlcml2ZWQyX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTMyIGZ1bmN0aW9uMV9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorICAgIGxpc3Q8dGVzdF9lbnVtMT4gZGVyaXZlZDJfZnVuY3Rpb24yKAorICAgICAgICAxOmk2NCBmdW5jdGlvbjJfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGxpc3Q8dGVzdF9zdHJ1Y3QxPiBkZXJpdmVkMl9mdW5jdGlvbjMoCisgICAgICAgIDE6ZG91YmxlIGZ1bmN0aW9uM19hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8ZG91YmxlLCBzdHJpbmc+IGRlcml2ZWQyX2Z1bmN0aW9uNCgKKyAgICAgICAgMTpzdHJpbmcgZnVuY3Rpb240X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBkZXJpdmVkMl9mdW5jdGlvbjUoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjVfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3Rfc3RydWN0MSwgdGVzdF9zdHJ1Y3QyPiBkZXJpdmVkMl9mdW5jdGlvbjYoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorfQpkaWZmIC0tZ2l0IGEvdGVzdC9hdWRpdC9icmVhazMudGhyaWZ0IGIvdGVzdC9hdWRpdC9icmVhazMudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlZDk5NzIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2F1ZGl0L2JyZWFrMy50aHJpZnQKQEAgLTAsMCArMSwxOTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy9icmVhazMgLSBTdHJ1Y3QgZmllbGQgY2hhbmdlZCBpbiB0ZXN0X3N0cnVjdDEoZW51bTEgdG8gZW51bTIpCisKK25hbWVzcGFjZSBjcHAgdGVzdAorCisvL0NvbnN0YW50cworY29uc3QgaTMyIGNvbnN0MSA9IDEyMzsKK2NvbnN0IGRvdWJsZSBjb25zdDIgPSAyMy4zOworY29uc3QgbWFwPHN0cmluZyxzdHJpbmc+IGNvbnN0MyA9IHsiaGVsbG8iOiJ3b3JsZCIsICJ0aHJpZnQiOiJhdWRpdCJ9OworCisKKy8vRXhjZXB0aW9uCitleGNlcHRpb24gdGVzdF9leGNlcHRpb24xIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjIgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorCisvL0VudW1zCisKK2VudW0gdGVzdF9lbnVtMSB7CisgICAgZW51bTFfdmFsdWUwID0gMCwKKyAgICBlbnVtMV92YWx1ZTEgPSAxLAorICAgIGVudW0xX3ZhbHVlMiA9IDIsCisgICAgZW51bTFfdmFsdWU1ID0gNSwKKyAgICBlbnVtMV92YWx1ZTcgPSA3LAorICAgIGVudW0xX3ZhbHVlOCA9IDgKK30KKworZW51bSB0ZXN0X2VudW0yIHsKKyAgICBlbnVtMl92YWx1ZTAgPSAwLAorICAgIGVudW0yX3ZhbHVlMSA9IDEsCisgICAgZW51bTJfdmFsdWUyID0gMiwKKyAgICBlbnVtMl92YWx1ZTMgPSAzCit9CisKK2VudW0gdGVzdF9lbnVtMyB7CisgICAgZW51bTNfdmFsdWUxID0gMCwKKyAgICBlbnVtM192YWx1ZTIgPSAxCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDEgeworICAgIDE6IGkxNiBzdHJ1Y3QxX21lbWJlcjEsCisgICAgMjogaTMyIHN0cnVjdDFfbWVtYmVyMiwKKyAgICAzOiBpNjQgc3RydWN0MV9tZW1iZXIzLAorICAgIDQ6IGRvdWJsZSBzdHJ1Y3QxX21lbWJlcjQgPSAyLjUsCisgICAgNTogc3RyaW5nIHN0cnVjdDFfbWVtYmVyNSA9ICJBdWRpdCB0ZXN0IiwKKyAgICA2OiBib29sIHN0cnVjdDFfbWVtYmVyNiwKKyAgICA3OiBieXRlIHN0cnVjdDFfbWVtYmVyNywKKyAgICA4OiBiaW5hcnkgc3RydWN0MV9tZW1iZXI4LAorICAgIDk6IHRlc3RfZW51bTIgc3RydWN0MV9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDIgeworICAgIDE6IGxpc3Q8aTE2PiBzdHJ1Y3QyX21lbWJlcjEsCisgICAgMjogbGlzdDxpMzI+IHN0cnVjdDJfbWVtYmVyMiwKKyAgICAzOiBsaXN0PGk2ND4gc3RydWN0Ml9tZW1iZXIzID0gWzIzLCAzMl0sCisgICAgNDogbGlzdDxkb3VibGU+IHN0cnVjdDJfbWVtYmVyNCwKKyAgICA1OiBsaXN0PHN0cmluZz4gc3RydWN0Ml9tZW1iZXI1LAorICAgIDY6IGxpc3Q8Ym9vbD4gc3RydWN0Ml9tZW1iZXI2LAorICAgIDc6IGxpc3Q8Ynl0ZT4gc3RydWN0Ml9tZW1iZXI3LAorICAgIDg6IGxpc3Q8YmluYXJ5PiBzdHJ1Y3QyX21lbWJlcjgsCisgICAgOTogbGlzdDx0ZXN0X2VudW0xPiBzdHJ1Y3QyX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MyB7CisgICAgMTogbWFwPGkxNiwgaTMyPiBzdHJ1Y3QzX21lbWJlcjEgPSB7MToyLCAzOjR9LAorICAgIDI6IG1hcDxpNjQsIGRvdWJsZT4gc3RydWN0M19tZW1iZXIyID0gezEwOjEuMSwgMjA6Mi4xfSwKKyAgICAzOiBtYXA8c3RyaW5nLCBib29sPiBzdHJ1Y3QzX21lbWJlcjMsCisgICAgNDogbWFwPGJ5dGUsIHRlc3RfZW51bTE+IHN0cnVjdDNfbWVtYmVyNCwKKyAgICA1OiBtYXA8dGVzdF9lbnVtMiwgdGVzdF9lbnVtMyA+IHN0cnVjdDNfbWVtYmVyNSwKKyAgICA3OiBtYXA8ZG91YmxlLCBzdHJpbmc+IHN0cnVjdDNfbWVtYmVyNworfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q0IHsKKyAgICAxOiBpMzIgc3RydWN0NF9tZW1iZXIxLAorICAgIDI6IG9wdGlvbmFsIGkzMiBzdHJ1Y3Q0X21lbWJlcjIKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NXsKKyAgICAxOiBkb3VibGUgc3RydWN0NV9tZW1iZXIxLAorICAgIDI6IHN0cmluZyBzdHJ1Y3Q1X21lbWJlcjIgPSAiVGhyaWZ0IEF1ZGl0IFRlc3QiCit9CitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q2IHsKKyAgICAxOiBpMzIgc3RydWN0Nl9tZW1iZXIxLAorICAgIDI6IHJlcXVpcmVkIGkzMiBzdHJ1Y3Q2X21lbWJlcjIKK30KKworc2VydmljZSBiYXNlIHsKKyAgICBvbmV3YXkgdm9pZCBiYXNlX29uZXdheSgKKyAgICAgICAgMTogaTMyIGFyZzEpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTE2IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBpMzIgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IGk2NCBmdW5jdGlvbjFfYXJnMywKKyAgICAgICAgNDogZG91YmxlIGZ1bmN0aW9uMV9hcmc0LAorICAgICAgICA1OiBzdHJpbmcgZnVuY3Rpb24xX2FyZzUsCisgICAgICAgIDY6IGJvb2wgZnVuY3Rpb24xX2FyZzYsCisgICAgICAgIDc6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzcsCisgICAgICAgIDg6IHRlc3Rfc3RydWN0MSBmdW5jdGlvbjFfYXJnOCksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGkxNj4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8aTMyPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnNSwKKyAgICAgICAgNjogbGlzdDxib29sPiBmdW5jdGlvbjJfYXJnNiwKKyAgICAgICAgNzogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNywKKyAgICAgICAgODogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnOCwKKyAgICAgICAgOTogbGlzdDx0ZXN0X3N0cnVjdDE+IGZ1bmN0aW9uMl9hcmc5KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMygpLAorCit9CisKK3NlcnZpY2UgZGVyaXZlZDEgZXh0ZW5kcyBiYXNlIHsKKyAgICAKKyAgICB0ZXN0X2VudW0xIGRlcml2ZWQxX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTY0IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBkb3VibGUgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBpNjQgZGVyaXZlZDFfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc1KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgZG91YmxlIGRlcml2ZWQxX2Z1bmN0aW9uMygKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uM19hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uM19hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgc3RyaW5nIGRlcml2ZWQxX2Z1bmN0aW9uNCgKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uNF9hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uNF9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisKKyAgICBib29sIGRlcml2ZWQxX2Z1bmN0aW9uNSgKKyAgICAgICAgMTogbWFwPGk2NCwgZG91YmxlPiBmdW5jdGlvbjVfYXJnMSwKKyAgICAgICAgMjogbWFwPHN0cmluZywgYm9vbD4gZnVuY3Rpb241X2FyZzIsCisgICAgICAgIDM6IG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBmdW5jdGlvbjVfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHRlc3Rfc3RydWN0MSBkZXJpdmVkMV9mdW5jdGlvbjYoCisgICAgICAgIDE6IGRvdWJsZSBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKK30KKworc2VydmljZSBkZXJpdmVkMiBleHRlbmRzIGJhc2UgeworCisgICAgbGlzdDxpMzI+IGRlcml2ZWQyX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTMyIGZ1bmN0aW9uMV9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorICAgIGxpc3Q8dGVzdF9lbnVtMT4gZGVyaXZlZDJfZnVuY3Rpb24yKAorICAgICAgICAxOmk2NCBmdW5jdGlvbjJfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGxpc3Q8dGVzdF9zdHJ1Y3QxPiBkZXJpdmVkMl9mdW5jdGlvbjMoCisgICAgICAgIDE6ZG91YmxlIGZ1bmN0aW9uM19hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8ZG91YmxlLCBzdHJpbmc+IGRlcml2ZWQyX2Z1bmN0aW9uNCgKKyAgICAgICAgMTpzdHJpbmcgZnVuY3Rpb240X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBkZXJpdmVkMl9mdW5jdGlvbjUoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjVfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3Rfc3RydWN0MSwgdGVzdF9zdHJ1Y3QyPiBkZXJpdmVkMl9mdW5jdGlvbjYoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorfQpkaWZmIC0tZ2l0IGEvdGVzdC9hdWRpdC9icmVhazMwLnRocmlmdCBiL3Rlc3QvYXVkaXQvYnJlYWszMC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE4ZGQ2ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYXVkaXQvYnJlYWszMC50aHJpZnQKQEAgLTAsMCArMSwxOTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gYnJlYWszMC0gZGVyaXZlZDFfZnVuY3Rpb242IGFyZ3VtZW50IGNoYW5nZWQgc3RydWN0MSB0byBtYXA8c3RydWN0MSxzdHJ1Y3QxPgorbmFtZXNwYWNlIGNwcCB0ZXN0CisKKy8vQ29uc3RhbnRzCitjb25zdCBpMzIgY29uc3QxID0gMTIzOworY29uc3QgZG91YmxlIGNvbnN0MiA9IDIzLjM7Citjb25zdCBtYXA8c3RyaW5nLHN0cmluZz4gY29uc3QzID0geyJoZWxsbyI6IndvcmxkIiwgInRocmlmdCI6ImF1ZGl0In07CisKKworLy9FeGNlcHRpb24KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjEgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMiB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CisKKy8vRW51bXMKKworZW51bSB0ZXN0X2VudW0xIHsKKyAgICBlbnVtMV92YWx1ZTAgPSAwLAorICAgIGVudW0xX3ZhbHVlMSA9IDEsCisgICAgZW51bTFfdmFsdWUyID0gMiwKKyAgICBlbnVtMV92YWx1ZTUgPSA1LAorICAgIGVudW0xX3ZhbHVlNyA9IDcsCisgICAgZW51bTFfdmFsdWU4ID0gOAorfQorCitlbnVtIHRlc3RfZW51bTIgeworICAgIGVudW0yX3ZhbHVlMCA9IDAsCisgICAgZW51bTJfdmFsdWUxID0gMSwKKyAgICBlbnVtMl92YWx1ZTIgPSAyLAorICAgIGVudW0yX3ZhbHVlMyA9IDMKK30KKworZW51bSB0ZXN0X2VudW0zIHsKKyAgICBlbnVtM192YWx1ZTEgPSAwLAorICAgIGVudW0zX3ZhbHVlMiA9IDEKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MSB7CisgICAgMTogaTE2IHN0cnVjdDFfbWVtYmVyMSwKKyAgICAyOiBpMzIgc3RydWN0MV9tZW1iZXIyLAorICAgIDM6IGk2NCBzdHJ1Y3QxX21lbWJlcjMsCisgICAgNDogZG91YmxlIHN0cnVjdDFfbWVtYmVyNCA9IDIuNSwKKyAgICA1OiBzdHJpbmcgc3RydWN0MV9tZW1iZXI1ID0gIkF1ZGl0IHRlc3QiLAorICAgIDY6IGJvb2wgc3RydWN0MV9tZW1iZXI2LAorICAgIDc6IGJ5dGUgc3RydWN0MV9tZW1iZXI3LAorICAgIDg6IGJpbmFyeSBzdHJ1Y3QxX21lbWJlcjgsCisgICAgOTogdGVzdF9lbnVtMSBzdHJ1Y3QxX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MiB7CisgICAgMTogbGlzdDxpMTY+IHN0cnVjdDJfbWVtYmVyMSwKKyAgICAyOiBsaXN0PGkzMj4gc3RydWN0Ml9tZW1iZXIyLAorICAgIDM6IGxpc3Q8aTY0PiBzdHJ1Y3QyX21lbWJlcjMgPSBbMjMsIDMyIF0sCisgICAgNDogbGlzdDxkb3VibGU+IHN0cnVjdDJfbWVtYmVyNCwKKyAgICA1OiBsaXN0PHN0cmluZz4gc3RydWN0Ml9tZW1iZXI1LAorICAgIDY6IGxpc3Q8Ym9vbD4gc3RydWN0Ml9tZW1iZXI2LAorICAgIDc6IGxpc3Q8Ynl0ZT4gc3RydWN0Ml9tZW1iZXI3LAorICAgIDg6IGxpc3Q8YmluYXJ5PiBzdHJ1Y3QyX21lbWJlcjgsCisgICAgOTogbGlzdDx0ZXN0X2VudW0xPiBzdHJ1Y3QyX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MyB7CisgICAgMTogbWFwPGkxNiwgaTMyPiBzdHJ1Y3QzX21lbWJlcjEgPSB7MToyLCAzOjR9LAorICAgIDI6IG1hcDxpNjQsIGRvdWJsZT4gc3RydWN0M19tZW1iZXIyID0gezEwOjEuMSwgMjA6Mi4xfSwKKyAgICAzOiBtYXA8c3RyaW5nLCBib29sPiBzdHJ1Y3QzX21lbWJlcjMsCisgICAgNDogbWFwPGJ5dGUsIHRlc3RfZW51bTE+IHN0cnVjdDNfbWVtYmVyNCwKKyAgICA1OiBtYXA8dGVzdF9lbnVtMiwgdGVzdF9lbnVtMyA+IHN0cnVjdDNfbWVtYmVyNSwKKyAgICA3OiBtYXA8ZG91YmxlLCBzdHJpbmc+IHN0cnVjdDNfbWVtYmVyNworfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q0IHsKKyAgICAxOiBpMzIgc3RydWN0NF9tZW1iZXIxLAorICAgIDI6IG9wdGlvbmFsIGkzMiBzdHJ1Y3Q0X21lbWJlcjIKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NXsKKyAgICAxOiBkb3VibGUgc3RydWN0NV9tZW1iZXIxLAorICAgIDI6IHN0cmluZyBzdHJ1Y3Q1X21lbWJlcjIgPSAiVGhyaWZ0IEF1ZGl0IFRlc3QiCit9CitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q2IHsKKyAgICAxOiBpMzIgc3RydWN0Nl9tZW1iZXIxLAorICAgIDI6IHJlcXVpcmVkIGkzMiBzdHJ1Y3Q2X21lbWJlcjIKK30KKworc2VydmljZSBiYXNlIHsKKyAgICBvbmV3YXkgdm9pZCBiYXNlX29uZXdheSgKKyAgICAgICAgMTogaTMyIGFyZzEpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTE2IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBpMzIgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IGk2NCBmdW5jdGlvbjFfYXJnMywKKyAgICAgICAgNDogZG91YmxlIGZ1bmN0aW9uMV9hcmc0LAorICAgICAgICA1OiBzdHJpbmcgZnVuY3Rpb24xX2FyZzUsCisgICAgICAgIDY6IGJvb2wgZnVuY3Rpb24xX2FyZzYsCisgICAgICAgIDc6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzcsCisgICAgICAgIDg6IHRlc3Rfc3RydWN0MSBmdW5jdGlvbjFfYXJnOCksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGkxNj4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8aTMyPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnNSwKKyAgICAgICAgNjogbGlzdDxib29sPiBmdW5jdGlvbjJfYXJnNiwKKyAgICAgICAgNzogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNywKKyAgICAgICAgODogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnOCwKKyAgICAgICAgOTogbGlzdDx0ZXN0X3N0cnVjdDE+IGZ1bmN0aW9uMl9hcmc5KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMygpLAorCit9CisKK3NlcnZpY2UgZGVyaXZlZDEgZXh0ZW5kcyBiYXNlIHsKKyAgICAKKyAgICB0ZXN0X2VudW0xIGRlcml2ZWQxX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTY0IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBkb3VibGUgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBpNjQgZGVyaXZlZDFfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc1KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgZG91YmxlIGRlcml2ZWQxX2Z1bmN0aW9uMygKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uM19hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uM19hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgc3RyaW5nIGRlcml2ZWQxX2Z1bmN0aW9uNCgKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uNF9hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uNF9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisKKyAgICBib29sIGRlcml2ZWQxX2Z1bmN0aW9uNSgKKyAgICAgICAgMTogbWFwPGk2NCwgZG91YmxlPiBmdW5jdGlvbjVfYXJnMSwKKyAgICAgICAgMjogbWFwPHN0cmluZywgYm9vbD4gZnVuY3Rpb241X2FyZzIsCisgICAgICAgIDM6IG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBmdW5jdGlvbjVfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X3N0cnVjdDEsdGVzdF9zdHJ1Y3QxPiBkZXJpdmVkMV9mdW5jdGlvbjYoCisgICAgICAgIDE6IGRvdWJsZSBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKK30KKworc2VydmljZSBkZXJpdmVkMiBleHRlbmRzIGJhc2UgeworCisgICAgbGlzdDxpMzI+IGRlcml2ZWQyX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTMyIGZ1bmN0aW9uMV9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorICAgIGxpc3Q8dGVzdF9lbnVtMT4gZGVyaXZlZDJfZnVuY3Rpb24yKAorICAgICAgICAxOmk2NCBmdW5jdGlvbjJfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGxpc3Q8dGVzdF9zdHJ1Y3QxPiBkZXJpdmVkMl9mdW5jdGlvbjMoCisgICAgICAgIDE6ZG91YmxlIGZ1bmN0aW9uM19hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8ZG91YmxlLCBzdHJpbmc+IGRlcml2ZWQyX2Z1bmN0aW9uNCgKKyAgICAgICAgMTpzdHJpbmcgZnVuY3Rpb240X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBkZXJpdmVkMl9mdW5jdGlvbjUoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjVfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3Rfc3RydWN0MSwgdGVzdF9zdHJ1Y3QyPiBkZXJpdmVkMl9mdW5jdGlvbjYoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorfQpkaWZmIC0tZ2l0IGEvdGVzdC9hdWRpdC9icmVhazMxLnRocmlmdCBiL3Rlc3QvYXVkaXQvYnJlYWszMS50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NhMzgwNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYXVkaXQvYnJlYWszMS50aHJpZnQKQEAgLTAsMCArMSwxOTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy9icmVhazMxIC0gRXhjZXB0aW9uIHJlbW92ZWQgdG8gYmFzZV9mdW5jdGlvbjIKKworbmFtZXNwYWNlIGNwcCB0ZXN0CisKKy8vQ29uc3RhbnRzCitjb25zdCBpMzIgY29uc3QxID0gMTIzOworY29uc3QgZG91YmxlIGNvbnN0MiA9IDIzLjM7Citjb25zdCBtYXA8c3RyaW5nLHN0cmluZz4gY29uc3QzID0geyJoZWxsbyI6IndvcmxkIiwgInRocmlmdCI6ImF1ZGl0In07CisKKworLy9FeGNlcHRpb24KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjEgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMiB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CisKKy8vRW51bXMKKworZW51bSB0ZXN0X2VudW0xIHsKKyAgICBlbnVtMV92YWx1ZTAgPSAwLAorICAgIGVudW0xX3ZhbHVlMSA9IDEsCisgICAgZW51bTFfdmFsdWUyID0gMiwKKyAgICBlbnVtMV92YWx1ZTUgPSA1LAorICAgIGVudW0xX3ZhbHVlNyA9IDcsCisgICAgZW51bTFfdmFsdWU4ID0gOAorfQorCitlbnVtIHRlc3RfZW51bTIgeworICAgIGVudW0yX3ZhbHVlMCA9IDAsCisgICAgZW51bTJfdmFsdWUxID0gMSwKKyAgICBlbnVtMl92YWx1ZTIgPSAyLAorICAgIGVudW0yX3ZhbHVlMyA9IDMKK30KKworZW51bSB0ZXN0X2VudW0zIHsKKyAgICBlbnVtM192YWx1ZTEgPSAwLAorICAgIGVudW0zX3ZhbHVlMiA9IDEKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MSB7CisgICAgMTogaTE2IHN0cnVjdDFfbWVtYmVyMSwKKyAgICAyOiBpMzIgc3RydWN0MV9tZW1iZXIyLAorICAgIDM6IGk2NCBzdHJ1Y3QxX21lbWJlcjMsCisgICAgNDogZG91YmxlIHN0cnVjdDFfbWVtYmVyNCA9IDIuNSwKKyAgICA1OiBzdHJpbmcgc3RydWN0MV9tZW1iZXI1ID0gIkF1ZGl0IHRlc3QiLAorICAgIDY6IGJvb2wgc3RydWN0MV9tZW1iZXI2LAorICAgIDc6IGJ5dGUgc3RydWN0MV9tZW1iZXI3LAorICAgIDg6IGJpbmFyeSBzdHJ1Y3QxX21lbWJlcjgsCisgICAgOTogdGVzdF9lbnVtMSBzdHJ1Y3QxX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MiB7CisgICAgMTogbGlzdDxpMTY+IHN0cnVjdDJfbWVtYmVyMSwKKyAgICAyOiBsaXN0PGkzMj4gc3RydWN0Ml9tZW1iZXIyLAorICAgIDM6IGxpc3Q8aTY0PiBzdHJ1Y3QyX21lbWJlcjMgPSBbMjMsIDMyIF0sCisgICAgNDogbGlzdDxkb3VibGU+IHN0cnVjdDJfbWVtYmVyNCwKKyAgICA1OiBsaXN0PHN0cmluZz4gc3RydWN0Ml9tZW1iZXI1LAorICAgIDY6IGxpc3Q8Ym9vbD4gc3RydWN0Ml9tZW1iZXI2LAorICAgIDc6IGxpc3Q8Ynl0ZT4gc3RydWN0Ml9tZW1iZXI3LAorICAgIDg6IGxpc3Q8YmluYXJ5PiBzdHJ1Y3QyX21lbWJlcjgsCisgICAgOTogbGlzdDx0ZXN0X2VudW0xPiBzdHJ1Y3QyX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MyB7CisgICAgMTogbWFwPGkxNiwgaTMyPiBzdHJ1Y3QzX21lbWJlcjEgPSB7MToyLCAzOjR9LAorICAgIDI6IG1hcDxpNjQsIGRvdWJsZT4gc3RydWN0M19tZW1iZXIyID0gezEwOjEuMSwgMjA6Mi4xfSwKKyAgICAzOiBtYXA8c3RyaW5nLCBib29sPiBzdHJ1Y3QzX21lbWJlcjMsCisgICAgNDogbWFwPGJ5dGUsIHRlc3RfZW51bTE+IHN0cnVjdDNfbWVtYmVyNCwKKyAgICA1OiBtYXA8dGVzdF9lbnVtMiwgdGVzdF9lbnVtMyA+IHN0cnVjdDNfbWVtYmVyNSwKKyAgICA3OiBtYXA8ZG91YmxlLCBzdHJpbmc+IHN0cnVjdDNfbWVtYmVyNworfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q0IHsKKyAgICAxOiBpMzIgc3RydWN0NF9tZW1iZXIxLAorICAgIDI6IG9wdGlvbmFsIGkzMiBzdHJ1Y3Q0X21lbWJlcjIKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NXsKKyAgICAxOiBkb3VibGUgc3RydWN0NV9tZW1iZXIxLAorICAgIDI6IHN0cmluZyBzdHJ1Y3Q1X21lbWJlcjIgPSAiVGhyaWZ0IEF1ZGl0IFRlc3QiCit9CitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q2IHsKKyAgICAxOiBpMzIgc3RydWN0Nl9tZW1iZXIxLAorICAgIDI6IHJlcXVpcmVkIGkzMiBzdHJ1Y3Q2X21lbWJlcjIKK30KKworc2VydmljZSBiYXNlIHsKKyAgICBvbmV3YXkgdm9pZCBiYXNlX29uZXdheSgKKyAgICAgICAgMTogaTMyIGFyZzEpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTE2IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBpMzIgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IGk2NCBmdW5jdGlvbjFfYXJnMywKKyAgICAgICAgNDogZG91YmxlIGZ1bmN0aW9uMV9hcmc0LAorICAgICAgICA1OiBzdHJpbmcgZnVuY3Rpb24xX2FyZzUsCisgICAgICAgIDY6IGJvb2wgZnVuY3Rpb24xX2FyZzYsCisgICAgICAgIDc6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzcsCisgICAgICAgIDg6IHRlc3Rfc3RydWN0MSBmdW5jdGlvbjFfYXJnOCksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGkxNj4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8aTMyPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnNSwKKyAgICAgICAgNjogbGlzdDxib29sPiBmdW5jdGlvbjJfYXJnNiwKKyAgICAgICAgNzogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNywKKyAgICAgICAgODogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnOCwKKyAgICAgICAgOTogbGlzdDx0ZXN0X3N0cnVjdDE+IGZ1bmN0aW9uMl9hcmc5KSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjMoKSwKKworfQorCitzZXJ2aWNlIGRlcml2ZWQxIGV4dGVuZHMgYmFzZSB7CisgICAgCisgICAgdGVzdF9lbnVtMSBkZXJpdmVkMV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGk2NCBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogZG91YmxlIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgaTY0IGRlcml2ZWQxX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnNSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGRvdWJsZSBkZXJpdmVkMV9mdW5jdGlvbjMoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjNfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjNfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHN0cmluZyBkZXJpdmVkMV9mdW5jdGlvbjQoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjRfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjRfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworCisgICAgYm9vbCBkZXJpdmVkMV9mdW5jdGlvbjUoCisgICAgICAgIDE6IG1hcDxpNjQsIGRvdWJsZT4gZnVuY3Rpb241X2FyZzEsCisgICAgICAgIDI6IG1hcDxzdHJpbmcsIGJvb2w+IGZ1bmN0aW9uNV9hcmcyLAorICAgICAgICAzOiBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZnVuY3Rpb241X2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB0ZXN0X3N0cnVjdDEgZGVyaXZlZDFfZnVuY3Rpb242KAorICAgICAgICAxOiBkb3VibGUgZnVuY3Rpb242X2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCit9CisKK3NlcnZpY2UgZGVyaXZlZDIgZXh0ZW5kcyBiYXNlIHsKKworICAgIGxpc3Q8aTMyPiBkZXJpdmVkMl9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkzMiBmdW5jdGlvbjFfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKKyAgICBsaXN0PHRlc3RfZW51bTE+IGRlcml2ZWQyX2Z1bmN0aW9uMigKKyAgICAgICAgMTppNjQgZnVuY3Rpb24yX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBsaXN0PHRlc3Rfc3RydWN0MT4gZGVyaXZlZDJfZnVuY3Rpb24zKAorICAgICAgICAxOmRvdWJsZSBmdW5jdGlvbjNfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPGRvdWJsZSwgc3RyaW5nPiBkZXJpdmVkMl9mdW5jdGlvbjQoCisgICAgICAgIDE6c3RyaW5nIGZ1bmN0aW9uNF9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZGVyaXZlZDJfZnVuY3Rpb241KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb241X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X3N0cnVjdDEsIHRlc3Rfc3RydWN0Mj4gZGVyaXZlZDJfZnVuY3Rpb242KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb242X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKK30KZGlmZiAtLWdpdCBhL3Rlc3QvYXVkaXQvYnJlYWszMi50aHJpZnQgYi90ZXN0L2F1ZGl0L2JyZWFrMzIudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhM2Y4YTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2F1ZGl0L2JyZWFrMzIudGhyaWZ0CkBAIC0wLDAgKzEsMTkxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vYnJlYWszMi0gRXhjZXB0aW9uMSBmaWVsZCB0eXBlIGNoYW5nZWQgZm9yIGlkID0xCisKK25hbWVzcGFjZSBjcHAgdGVzdAorCisvL0NvbnN0YW50cworY29uc3QgaTMyIGNvbnN0MSA9IDEyMzsKK2NvbnN0IGRvdWJsZSBjb25zdDIgPSAyMy4zOworY29uc3QgbWFwPHN0cmluZyxzdHJpbmc+IGNvbnN0MyA9IHsiaGVsbG8iOiJ3b3JsZCIsICJ0aHJpZnQiOiJhdWRpdCJ9OworCisKKy8vRXhjZXB0aW9uCitleGNlcHRpb24gdGVzdF9leGNlcHRpb24xIHsKKyAgICAxOiBpNjQgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjIgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorCisvL0VudW1zCisKK2VudW0gdGVzdF9lbnVtMSB7CisgICAgZW51bTFfdmFsdWUwID0gMCwKKyAgICBlbnVtMV92YWx1ZTEgPSAxLAorICAgIGVudW0xX3ZhbHVlMiA9IDIsCisgICAgZW51bTFfdmFsdWU1ID0gNSwKKyAgICBlbnVtMV92YWx1ZTcgPSA3LAorICAgIGVudW0xX3ZhbHVlOCA9IDgKK30KKworZW51bSB0ZXN0X2VudW0yIHsKKyAgICBlbnVtMl92YWx1ZTAgPSAwLAorICAgIGVudW0yX3ZhbHVlMSA9IDEsCisgICAgZW51bTJfdmFsdWUyID0gMiwKKyAgICBlbnVtMl92YWx1ZTMgPSAzCit9CisKK2VudW0gdGVzdF9lbnVtMyB7CisgICAgZW51bTNfdmFsdWUxID0gMCwKKyAgICBlbnVtM192YWx1ZTIgPSAxCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDEgeworICAgIDE6IGkxNiBzdHJ1Y3QxX21lbWJlcjEsCisgICAgMjogaTMyIHN0cnVjdDFfbWVtYmVyMiwKKyAgICAzOiBpNjQgc3RydWN0MV9tZW1iZXIzLAorICAgIDQ6IGRvdWJsZSBzdHJ1Y3QxX21lbWJlcjQgPSAyLjUsCisgICAgNTogc3RyaW5nIHN0cnVjdDFfbWVtYmVyNSA9ICJBdWRpdCB0ZXN0IiwKKyAgICA2OiBib29sIHN0cnVjdDFfbWVtYmVyNiwKKyAgICA3OiBieXRlIHN0cnVjdDFfbWVtYmVyNywKKyAgICA4OiBiaW5hcnkgc3RydWN0MV9tZW1iZXI4LAorICAgIDk6IHRlc3RfZW51bTEgc3RydWN0MV9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDIgeworICAgIDE6IGxpc3Q8aTE2PiBzdHJ1Y3QyX21lbWJlcjEsCisgICAgMjogbGlzdDxpMzI+IHN0cnVjdDJfbWVtYmVyMiwKKyAgICAzOiBsaXN0PGk2ND4gc3RydWN0Ml9tZW1iZXIzID0gWzIzLCAzMiBdLAorICAgIDQ6IGxpc3Q8ZG91YmxlPiBzdHJ1Y3QyX21lbWJlcjQsCisgICAgNTogbGlzdDxzdHJpbmc+IHN0cnVjdDJfbWVtYmVyNSwKKyAgICA2OiBsaXN0PGJvb2w+IHN0cnVjdDJfbWVtYmVyNiwKKyAgICA3OiBsaXN0PGJ5dGU+IHN0cnVjdDJfbWVtYmVyNywKKyAgICA4OiBsaXN0PGJpbmFyeT4gc3RydWN0Ml9tZW1iZXI4LAorICAgIDk6IGxpc3Q8dGVzdF9lbnVtMT4gc3RydWN0Ml9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDMgeworICAgIDE6IG1hcDxpMTYsIGkzMj4gc3RydWN0M19tZW1iZXIxID0gezE6MiwgMzo0fSwKKyAgICAyOiBtYXA8aTY0LCBkb3VibGU+IHN0cnVjdDNfbWVtYmVyMiA9IHsxMDoxLjEsIDIwOjIuMX0sCisgICAgMzogbWFwPHN0cmluZywgYm9vbD4gc3RydWN0M19tZW1iZXIzLAorICAgIDQ6IG1hcDxieXRlLCB0ZXN0X2VudW0xPiBzdHJ1Y3QzX21lbWJlcjQsCisgICAgNTogbWFwPHRlc3RfZW51bTIsIHRlc3RfZW51bTMgPiBzdHJ1Y3QzX21lbWJlcjUsCisgICAgNzogbWFwPGRvdWJsZSwgc3RyaW5nPiBzdHJ1Y3QzX21lbWJlcjcKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NCB7CisgICAgMTogaTMyIHN0cnVjdDRfbWVtYmVyMSwKKyAgICAyOiBvcHRpb25hbCBpMzIgc3RydWN0NF9tZW1iZXIyCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDV7CisgICAgMTogZG91YmxlIHN0cnVjdDVfbWVtYmVyMSwKKyAgICAyOiBzdHJpbmcgc3RydWN0NV9tZW1iZXIyID0gIlRocmlmdCBBdWRpdCBUZXN0IgorfQorc3RydWN0IHRlc3Rfc3RydWN0NiB7CisgICAgMTogaTMyIHN0cnVjdDZfbWVtYmVyMSwKKyAgICAyOiByZXF1aXJlZCBpMzIgc3RydWN0Nl9tZW1iZXIyCit9CisKK3NlcnZpY2UgYmFzZSB7CisgICAgb25ld2F5IHZvaWQgYmFzZV9vbmV3YXkoCisgICAgICAgIDE6IGkzMiBhcmcxKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkxNiBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogaTMyIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiBpNjQgZnVuY3Rpb24xX2FyZzMsCisgICAgICAgIDQ6IGRvdWJsZSBmdW5jdGlvbjFfYXJnNCwKKyAgICAgICAgNTogc3RyaW5nIGZ1bmN0aW9uMV9hcmc1LAorICAgICAgICA2OiBib29sIGZ1bmN0aW9uMV9hcmc2LAorICAgICAgICA3OiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmc3LAorICAgICAgICA4OiB0ZXN0X3N0cnVjdDEgZnVuY3Rpb24xX2FyZzgpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpMTY+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGkzMj4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzUsCisgICAgICAgIDY6IGxpc3Q8Ym9vbD4gZnVuY3Rpb24yX2FyZzYsCisgICAgICAgIDc6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzcsCisgICAgICAgIDg6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzgsCisgICAgICAgIDk6IGxpc3Q8dGVzdF9zdHJ1Y3QxPiBmdW5jdGlvbjJfYXJnOSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjMoKSwKKworfQorCitzZXJ2aWNlIGRlcml2ZWQxIGV4dGVuZHMgYmFzZSB7CisgICAgCisgICAgdGVzdF9lbnVtMSBkZXJpdmVkMV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGk2NCBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogZG91YmxlIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgaTY0IGRlcml2ZWQxX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnNSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGRvdWJsZSBkZXJpdmVkMV9mdW5jdGlvbjMoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjNfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjNfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHN0cmluZyBkZXJpdmVkMV9mdW5jdGlvbjQoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjRfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjRfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworCisgICAgYm9vbCBkZXJpdmVkMV9mdW5jdGlvbjUoCisgICAgICAgIDE6IG1hcDxpNjQsIGRvdWJsZT4gZnVuY3Rpb241X2FyZzEsCisgICAgICAgIDI6IG1hcDxzdHJpbmcsIGJvb2w+IGZ1bmN0aW9uNV9hcmcyLAorICAgICAgICAzOiBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZnVuY3Rpb241X2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB0ZXN0X3N0cnVjdDEgZGVyaXZlZDFfZnVuY3Rpb242KAorICAgICAgICAxOiBkb3VibGUgZnVuY3Rpb242X2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCit9CisKK3NlcnZpY2UgZGVyaXZlZDIgZXh0ZW5kcyBiYXNlIHsKKworICAgIGxpc3Q8aTMyPiBkZXJpdmVkMl9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkzMiBmdW5jdGlvbjFfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKKyAgICBsaXN0PHRlc3RfZW51bTE+IGRlcml2ZWQyX2Z1bmN0aW9uMigKKyAgICAgICAgMTppNjQgZnVuY3Rpb24yX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBsaXN0PHRlc3Rfc3RydWN0MT4gZGVyaXZlZDJfZnVuY3Rpb24zKAorICAgICAgICAxOmRvdWJsZSBmdW5jdGlvbjNfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPGRvdWJsZSwgc3RyaW5nPiBkZXJpdmVkMl9mdW5jdGlvbjQoCisgICAgICAgIDE6c3RyaW5nIGZ1bmN0aW9uNF9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZGVyaXZlZDJfZnVuY3Rpb241KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb241X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X3N0cnVjdDEsIHRlc3Rfc3RydWN0Mj4gZGVyaXZlZDJfZnVuY3Rpb242KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb242X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKK30KZGlmZiAtLWdpdCBhL3Rlc3QvYXVkaXQvYnJlYWszMy50aHJpZnQgYi90ZXN0L2F1ZGl0L2JyZWFrMzMudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyZGJiODIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2F1ZGl0L2JyZWFrMzMudGhyaWZ0CkBAIC0wLDAgKzEsMTkxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vYnJlYWszMyAtIGRlcml2ZWQxX2Z1bmN0aW9uMSBleGNlcHRpb24gdHlwZSBjaGFuZ2VkLgorCituYW1lc3BhY2UgY3BwIHRlc3QKKworLy9Db25zdGFudHMKK2NvbnN0IGkzMiBjb25zdDEgPSAxMjM7Citjb25zdCBkb3VibGUgY29uc3QyID0gMjMuMzsKK2NvbnN0IG1hcDxzdHJpbmcsc3RyaW5nPiBjb25zdDMgPSB7ImhlbGxvIjoid29ybGQiLCAidGhyaWZ0IjoiYXVkaXQifTsKKworCisvL0V4Y2VwdGlvbgorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMSB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CitleGNlcHRpb24gdGVzdF9leGNlcHRpb24yIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KKworLy9FbnVtcworCitlbnVtIHRlc3RfZW51bTEgeworICAgIGVudW0xX3ZhbHVlMCA9IDAsCisgICAgZW51bTFfdmFsdWUxID0gMSwKKyAgICBlbnVtMV92YWx1ZTIgPSAyLAorICAgIGVudW0xX3ZhbHVlNSA9IDUsCisgICAgZW51bTFfdmFsdWU3ID0gNywKKyAgICBlbnVtMV92YWx1ZTggPSA4Cit9CisKK2VudW0gdGVzdF9lbnVtMiB7CisgICAgZW51bTJfdmFsdWUwID0gMCwKKyAgICBlbnVtMl92YWx1ZTEgPSAxLAorICAgIGVudW0yX3ZhbHVlMiA9IDIsCisgICAgZW51bTJfdmFsdWUzID0gMworfQorCitlbnVtIHRlc3RfZW51bTMgeworICAgIGVudW0zX3ZhbHVlMSA9IDAsCisgICAgZW51bTNfdmFsdWUyID0gMQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QxIHsKKyAgICAxOiBpMTYgc3RydWN0MV9tZW1iZXIxLAorICAgIDI6IGkzMiBzdHJ1Y3QxX21lbWJlcjIsCisgICAgMzogaTY0IHN0cnVjdDFfbWVtYmVyMywKKyAgICA0OiBkb3VibGUgc3RydWN0MV9tZW1iZXI0ID0gMi41LAorICAgIDU6IHN0cmluZyBzdHJ1Y3QxX21lbWJlcjUgPSAiQXVkaXQgdGVzdCIsCisgICAgNjogYm9vbCBzdHJ1Y3QxX21lbWJlcjYsCisgICAgNzogYnl0ZSBzdHJ1Y3QxX21lbWJlcjcsCisgICAgODogYmluYXJ5IHN0cnVjdDFfbWVtYmVyOCwKKyAgICA5OiB0ZXN0X2VudW0xIHN0cnVjdDFfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QyIHsKKyAgICAxOiBsaXN0PGkxNj4gc3RydWN0Ml9tZW1iZXIxLAorICAgIDI6IGxpc3Q8aTMyPiBzdHJ1Y3QyX21lbWJlcjIsCisgICAgMzogbGlzdDxpNjQ+IHN0cnVjdDJfbWVtYmVyMyA9IFsyMywgMzIgXSwKKyAgICA0OiBsaXN0PGRvdWJsZT4gc3RydWN0Ml9tZW1iZXI0LAorICAgIDU6IGxpc3Q8c3RyaW5nPiBzdHJ1Y3QyX21lbWJlcjUsCisgICAgNjogbGlzdDxib29sPiBzdHJ1Y3QyX21lbWJlcjYsCisgICAgNzogbGlzdDxieXRlPiBzdHJ1Y3QyX21lbWJlcjcsCisgICAgODogbGlzdDxiaW5hcnk+IHN0cnVjdDJfbWVtYmVyOCwKKyAgICA5OiBsaXN0PHRlc3RfZW51bTE+IHN0cnVjdDJfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QzIHsKKyAgICAxOiBtYXA8aTE2LCBpMzI+IHN0cnVjdDNfbWVtYmVyMSA9IHsxOjIsIDM6NH0sCisgICAgMjogbWFwPGk2NCwgZG91YmxlPiBzdHJ1Y3QzX21lbWJlcjIgPSB7MTA6MS4xLCAyMDoyLjF9LAorICAgIDM6IG1hcDxzdHJpbmcsIGJvb2w+IHN0cnVjdDNfbWVtYmVyMywKKyAgICA0OiBtYXA8Ynl0ZSwgdGVzdF9lbnVtMT4gc3RydWN0M19tZW1iZXI0LAorICAgIDU6IG1hcDx0ZXN0X2VudW0yLCB0ZXN0X2VudW0zID4gc3RydWN0M19tZW1iZXI1LAorICAgIDc6IG1hcDxkb3VibGUsIHN0cmluZz4gc3RydWN0M19tZW1iZXI3Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDQgeworICAgIDE6IGkzMiBzdHJ1Y3Q0X21lbWJlcjEsCisgICAgMjogb3B0aW9uYWwgaTMyIHN0cnVjdDRfbWVtYmVyMgorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q1eworICAgIDE6IGRvdWJsZSBzdHJ1Y3Q1X21lbWJlcjEsCisgICAgMjogc3RyaW5nIHN0cnVjdDVfbWVtYmVyMiA9ICJUaHJpZnQgQXVkaXQgVGVzdCIKK30KK3N0cnVjdCB0ZXN0X3N0cnVjdDYgeworICAgIDE6IGkzMiBzdHJ1Y3Q2X21lbWJlcjEsCisgICAgMjogcmVxdWlyZWQgaTMyIHN0cnVjdDZfbWVtYmVyMgorfQorCitzZXJ2aWNlIGJhc2UgeworICAgIG9uZXdheSB2b2lkIGJhc2Vfb25ld2F5KAorICAgICAgICAxOiBpMzIgYXJnMSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMTYgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGkzMiBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogaTY0IGZ1bmN0aW9uMV9hcmczLAorICAgICAgICA0OiBkb3VibGUgZnVuY3Rpb24xX2FyZzQsCisgICAgICAgIDU6IHN0cmluZyBmdW5jdGlvbjFfYXJnNSwKKyAgICAgICAgNjogYm9vbCBmdW5jdGlvbjFfYXJnNiwKKyAgICAgICAgNzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnNywKKyAgICAgICAgODogdGVzdF9zdHJ1Y3QxIGZ1bmN0aW9uMV9hcmc4KSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTE2PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxpMzI+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmc1LAorICAgICAgICA2OiBsaXN0PGJvb2w+IGZ1bmN0aW9uMl9hcmc2LAorICAgICAgICA3OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc3LAorICAgICAgICA4OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc4LAorICAgICAgICA5OiBsaXN0PHRlc3Rfc3RydWN0MT4gZnVuY3Rpb24yX2FyZzkpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24zKCksCisKK30KKworc2VydmljZSBkZXJpdmVkMSBleHRlbmRzIGJhc2UgeworICAgIAorICAgIHRlc3RfZW51bTEgZGVyaXZlZDFfZnVuY3Rpb24xKAorICAgICAgICAxOiBpNjQgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGRvdWJsZSBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMSBlKSwKKworICAgIGk2NCBkZXJpdmVkMV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzUpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBkb3VibGUgZGVyaXZlZDFfZnVuY3Rpb24zKAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb24zX2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb24zX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBzdHJpbmcgZGVyaXZlZDFfZnVuY3Rpb240KAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb240X2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb240X2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKworICAgIGJvb2wgZGVyaXZlZDFfZnVuY3Rpb241KAorICAgICAgICAxOiBtYXA8aTY0LCBkb3VibGU+IGZ1bmN0aW9uNV9hcmcxLAorICAgICAgICAyOiBtYXA8c3RyaW5nLCBib29sPiBmdW5jdGlvbjVfYXJnMiwKKyAgICAgICAgMzogbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGZ1bmN0aW9uNV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdGVzdF9zdHJ1Y3QxIGRlcml2ZWQxX2Z1bmN0aW9uNigKKyAgICAgICAgMTogZG91YmxlIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorfQorCitzZXJ2aWNlIGRlcml2ZWQyIGV4dGVuZHMgYmFzZSB7CisKKyAgICBsaXN0PGkzMj4gZGVyaXZlZDJfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMzIgZnVuY3Rpb24xX2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCisgICAgbGlzdDx0ZXN0X2VudW0xPiBkZXJpdmVkMl9mdW5jdGlvbjIoCisgICAgICAgIDE6aTY0IGZ1bmN0aW9uMl9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbGlzdDx0ZXN0X3N0cnVjdDE+IGRlcml2ZWQyX2Z1bmN0aW9uMygKKyAgICAgICAgMTpkb3VibGUgZnVuY3Rpb24zX2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDxkb3VibGUsIHN0cmluZz4gZGVyaXZlZDJfZnVuY3Rpb240KAorICAgICAgICAxOnN0cmluZyBmdW5jdGlvbjRfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGRlcml2ZWQyX2Z1bmN0aW9uNSgKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNV9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9zdHJ1Y3QxLCB0ZXN0X3N0cnVjdDI+IGRlcml2ZWQyX2Z1bmN0aW9uNigKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCit9CmRpZmYgLS1naXQgYS90ZXN0L2F1ZGl0L2JyZWFrMzQudGhyaWZ0IGIvdGVzdC9hdWRpdC9icmVhazM0LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjkzZTY1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9hdWRpdC9icmVhazM0LnRocmlmdApAQCAtMCwwICsxLDE5MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvL2JyZWFrMzQgLSBGaWVsZCBhZGRlZCB0byBzdHJ1Y3Qgd2l0aCBGaWVsZCBJRCBiZWluZyBpbiBiZXR3ZWVuIHR3byBleGlzdGluZyBmaWVsZCBJRHMKKworbmFtZXNwYWNlIGNwcCB0ZXN0CisKKy8vQ29uc3RhbnRzCitjb25zdCBpMzIgY29uc3QxID0gMTIzOworY29uc3QgZG91YmxlIGNvbnN0MiA9IDIzLjM7Citjb25zdCBtYXA8c3RyaW5nLHN0cmluZz4gY29uc3QzID0geyJoZWxsbyI6IndvcmxkIiwgInRocmlmdCI6ImF1ZGl0In07CisKKworLy9FeGNlcHRpb24KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjEgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMiB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CisKKy8vRW51bXMKKworZW51bSB0ZXN0X2VudW0xIHsKKyAgICBlbnVtMV92YWx1ZTAgPSAwLAorICAgIGVudW0xX3ZhbHVlMSA9IDEsCisgICAgZW51bTFfdmFsdWUyID0gMiwKKyAgICBlbnVtMV92YWx1ZTUgPSA1LAorICAgIGVudW0xX3ZhbHVlNyA9IDcsCisgICAgZW51bTFfdmFsdWU4ID0gOAorfQorCitlbnVtIHRlc3RfZW51bTIgeworICAgIGVudW0yX3ZhbHVlMCA9IDAsCisgICAgZW51bTJfdmFsdWUxID0gMSwKKyAgICBlbnVtMl92YWx1ZTIgPSAyLAorICAgIGVudW0yX3ZhbHVlMyA9IDMKK30KKworZW51bSB0ZXN0X2VudW0zIHsKKyAgICBlbnVtM192YWx1ZTEgPSAwLAorICAgIGVudW0zX3ZhbHVlMiA9IDEKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MSB7CisgICAgMTogaTE2IHN0cnVjdDFfbWVtYmVyMSwKKyAgICAyOiBpMzIgc3RydWN0MV9tZW1iZXIyLAorICAgIDM6IGk2NCBzdHJ1Y3QxX21lbWJlcjMsCisgICAgNDogZG91YmxlIHN0cnVjdDFfbWVtYmVyNCA9IDIuNSwKKyAgICA1OiBzdHJpbmcgc3RydWN0MV9tZW1iZXI1ID0gIkF1ZGl0IHRlc3QiLAorICAgIDY6IGJvb2wgc3RydWN0MV9tZW1iZXI2LAorICAgIDc6IGJ5dGUgc3RydWN0MV9tZW1iZXI3LAorICAgIDg6IGJpbmFyeSBzdHJ1Y3QxX21lbWJlcjgsCisgICAgOTogdGVzdF9lbnVtMSBzdHJ1Y3QxX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MiB7CisgICAgMTogbGlzdDxpMTY+IHN0cnVjdDJfbWVtYmVyMSwKKyAgICAyOiBsaXN0PGkzMj4gc3RydWN0Ml9tZW1iZXIyLAorICAgIDM6IGxpc3Q8aTY0PiBzdHJ1Y3QyX21lbWJlcjMgPSBbMjMsIDMyIF0sCisgICAgNDogbGlzdDxkb3VibGU+IHN0cnVjdDJfbWVtYmVyNCwKKyAgICA1OiBsaXN0PHN0cmluZz4gc3RydWN0Ml9tZW1iZXI1LAorICAgIDY6IGxpc3Q8Ym9vbD4gc3RydWN0Ml9tZW1iZXI2LAorICAgIDc6IGxpc3Q8Ynl0ZT4gc3RydWN0Ml9tZW1iZXI3LAorICAgIDg6IGxpc3Q8YmluYXJ5PiBzdHJ1Y3QyX21lbWJlcjgsCisgICAgOTogbGlzdDx0ZXN0X2VudW0xPiBzdHJ1Y3QyX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MyB7CisgICAgMTogbWFwPGkxNiwgaTMyPiBzdHJ1Y3QzX21lbWJlcjEgPSB7MToyLCAzOjR9LAorICAgIDI6IG1hcDxpNjQsIGRvdWJsZT4gc3RydWN0M19tZW1iZXIyID0gezEwOjEuMSwgMjA6Mi4xfSwKKyAgICAzOiBtYXA8c3RyaW5nLCBib29sPiBzdHJ1Y3QzX21lbWJlcjMsCisgICAgNDogbWFwPGJ5dGUsIHRlc3RfZW51bTE+IHN0cnVjdDNfbWVtYmVyNCwKKyAgICA1OiBtYXA8dGVzdF9lbnVtMiwgdGVzdF9lbnVtMyA+IHN0cnVjdDNfbWVtYmVyNSwKKyAgICA2OiBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gc3RydWN0M19tZW1iZXI2LAorICAgIDc6IG1hcDxkb3VibGUsIHN0cmluZz4gc3RydWN0M19tZW1iZXI3Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDQgeworICAgIDE6IGkzMiBzdHJ1Y3Q0X21lbWJlcjEsCisgICAgMjogb3B0aW9uYWwgaTMyIHN0cnVjdDRfbWVtYmVyMgorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q1eworICAgIDE6IGRvdWJsZSBzdHJ1Y3Q1X21lbWJlcjEsCisgICAgMjogc3RyaW5nIHN0cnVjdDVfbWVtYmVyMiA9ICJUaHJpZnQgQXVkaXQgVGVzdCIKK30KK3N0cnVjdCB0ZXN0X3N0cnVjdDYgeworICAgIDE6IGkzMiBzdHJ1Y3Q2X21lbWJlcjEsCisgICAgMjogcmVxdWlyZWQgaTMyIHN0cnVjdDZfbWVtYmVyMgorfQorCitzZXJ2aWNlIGJhc2UgeworICAgIG9uZXdheSB2b2lkIGJhc2Vfb25ld2F5KAorICAgICAgICAxOiBpMzIgYXJnMSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMTYgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGkzMiBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogaTY0IGZ1bmN0aW9uMV9hcmczLAorICAgICAgICA0OiBkb3VibGUgZnVuY3Rpb24xX2FyZzQsCisgICAgICAgIDU6IHN0cmluZyBmdW5jdGlvbjFfYXJnNSwKKyAgICAgICAgNjogYm9vbCBmdW5jdGlvbjFfYXJnNiwKKyAgICAgICAgNzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnNywKKyAgICAgICAgODogdGVzdF9zdHJ1Y3QxIGZ1bmN0aW9uMV9hcmc4KSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTE2PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxpMzI+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmc1LAorICAgICAgICA2OiBsaXN0PGJvb2w+IGZ1bmN0aW9uMl9hcmc2LAorICAgICAgICA3OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc3LAorICAgICAgICA4OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc4LAorICAgICAgICA5OiBsaXN0PHRlc3Rfc3RydWN0MT4gZnVuY3Rpb24yX2FyZzkpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24zKCksCisKK30KKworc2VydmljZSBkZXJpdmVkMSBleHRlbmRzIGJhc2UgeworICAgIAorICAgIHRlc3RfZW51bTEgZGVyaXZlZDFfZnVuY3Rpb24xKAorICAgICAgICAxOiBpNjQgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGRvdWJsZSBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGk2NCBkZXJpdmVkMV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzUpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBkb3VibGUgZGVyaXZlZDFfZnVuY3Rpb24zKAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb24zX2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb24zX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBzdHJpbmcgZGVyaXZlZDFfZnVuY3Rpb240KAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb240X2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb240X2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKworICAgIGJvb2wgZGVyaXZlZDFfZnVuY3Rpb241KAorICAgICAgICAxOiBtYXA8aTY0LCBkb3VibGU+IGZ1bmN0aW9uNV9hcmcxLAorICAgICAgICAyOiBtYXA8c3RyaW5nLCBib29sPiBmdW5jdGlvbjVfYXJnMiwKKyAgICAgICAgMzogbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGZ1bmN0aW9uNV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdGVzdF9zdHJ1Y3QxIGRlcml2ZWQxX2Z1bmN0aW9uNigKKyAgICAgICAgMTogZG91YmxlIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorfQorCitzZXJ2aWNlIGRlcml2ZWQyIGV4dGVuZHMgYmFzZSB7CisKKyAgICBsaXN0PGkzMj4gZGVyaXZlZDJfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMzIgZnVuY3Rpb24xX2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCisgICAgbGlzdDx0ZXN0X2VudW0xPiBkZXJpdmVkMl9mdW5jdGlvbjIoCisgICAgICAgIDE6aTY0IGZ1bmN0aW9uMl9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbGlzdDx0ZXN0X3N0cnVjdDE+IGRlcml2ZWQyX2Z1bmN0aW9uMygKKyAgICAgICAgMTpkb3VibGUgZnVuY3Rpb24zX2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDxkb3VibGUsIHN0cmluZz4gZGVyaXZlZDJfZnVuY3Rpb240KAorICAgICAgICAxOnN0cmluZyBmdW5jdGlvbjRfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGRlcml2ZWQyX2Z1bmN0aW9uNSgKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNV9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9zdHJ1Y3QxLCB0ZXN0X3N0cnVjdDI+IGRlcml2ZWQyX2Z1bmN0aW9uNigKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCit9CmRpZmYgLS1naXQgYS90ZXN0L2F1ZGl0L2JyZWFrNC50aHJpZnQgYi90ZXN0L2F1ZGl0L2JyZWFrNC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmEyOGVjMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYXVkaXQvYnJlYWs0LnRocmlmdApAQCAtMCwwICsxLDE5MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvL0ZpZWxkIHR5cGUgY2hhbmdlZCBpbiB0ZXN0X3N0cnVjdDEoYm9vbCB0byBzdHJpbmcpCituYW1lc3BhY2UgY3BwIHRlc3QKKworLy9Db25zdGFudHMKK2NvbnN0IGkzMiBjb25zdDEgPSAxMjM7Citjb25zdCBkb3VibGUgY29uc3QyID0gMjMuMzsKK2NvbnN0IG1hcDxzdHJpbmcsc3RyaW5nPiBjb25zdDMgPSB7ImhlbGxvIjoid29ybGQiLCAidGhyaWZ0IjoiYXVkaXQifTsKKworCisvL0V4Y2VwdGlvbgorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMSB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CitleGNlcHRpb24gdGVzdF9leGNlcHRpb24yIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KKworLy9FbnVtcworCitlbnVtIHRlc3RfZW51bTEgeworICAgIGVudW0xX3ZhbHVlMCA9IDAsCisgICAgZW51bTFfdmFsdWUxID0gMSwKKyAgICBlbnVtMV92YWx1ZTIgPSAyLAorICAgIGVudW0xX3ZhbHVlNSA9IDUsCisgICAgZW51bTFfdmFsdWU3ID0gNywKKyAgICBlbnVtMV92YWx1ZTggPSA4Cit9CisKK2VudW0gdGVzdF9lbnVtMiB7CisgICAgZW51bTJfdmFsdWUwID0gMCwKKyAgICBlbnVtMl92YWx1ZTEgPSAxLAorICAgIGVudW0yX3ZhbHVlMiA9IDIsCisgICAgZW51bTJfdmFsdWUzID0gMworfQorCitlbnVtIHRlc3RfZW51bTMgeworICAgIGVudW0zX3ZhbHVlMSA9IDAsCisgICAgZW51bTNfdmFsdWUyID0gMQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QxIHsKKyAgICAxOiBpMTYgc3RydWN0MV9tZW1iZXIxLAorICAgIDI6IGkzMiBzdHJ1Y3QxX21lbWJlcjIsCisgICAgMzogaTY0IHN0cnVjdDFfbWVtYmVyMywKKyAgICA0OiBkb3VibGUgc3RydWN0MV9tZW1iZXI0ID0gMi41LAorICAgIDU6IHN0cmluZyBzdHJ1Y3QxX21lbWJlcjUgPSAiQXVkaXQgdGVzdCIsCisgICAgNjogc3RyaW5nIHN0cnVjdDFfbWVtYmVyNiwKKyAgICA3OiBieXRlIHN0cnVjdDFfbWVtYmVyNywKKyAgICA4OiBiaW5hcnkgc3RydWN0MV9tZW1iZXI4LAorICAgIDk6IHRlc3RfZW51bTEgc3RydWN0MV9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDIgeworICAgIDE6IGxpc3Q8aTE2PiBzdHJ1Y3QyX21lbWJlcjEsCisgICAgMjogbGlzdDxpMzI+IHN0cnVjdDJfbWVtYmVyMiwKKyAgICAzOiBsaXN0PGk2ND4gc3RydWN0Ml9tZW1iZXIzID1bMjMsIDMyXSwKKyAgICA0OiBsaXN0PGRvdWJsZT4gc3RydWN0Ml9tZW1iZXI0LAorICAgIDU6IGxpc3Q8c3RyaW5nPiBzdHJ1Y3QyX21lbWJlcjUsCisgICAgNjogbGlzdDxib29sPiBzdHJ1Y3QyX21lbWJlcjYsCisgICAgNzogbGlzdDxieXRlPiBzdHJ1Y3QyX21lbWJlcjcsCisgICAgODogbGlzdDxiaW5hcnk+IHN0cnVjdDJfbWVtYmVyOCwKKyAgICA5OiBsaXN0PHRlc3RfZW51bTE+IHN0cnVjdDJfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QzIHsKKyAgICAxOiBtYXA8aTE2LCBpMzI+IHN0cnVjdDNfbWVtYmVyMSA9IHsxOjIsIDM6NH0sCisgICAgMjogbWFwPGk2NCwgZG91YmxlPiBzdHJ1Y3QzX21lbWJlcjIgPSB7MTA6MS4xLCAyMDoyLjF9LAorICAgIDM6IG1hcDxzdHJpbmcsIGJvb2w+IHN0cnVjdDNfbWVtYmVyMywKKyAgICA0OiBtYXA8Ynl0ZSwgdGVzdF9lbnVtMT4gc3RydWN0M19tZW1iZXI0LAorICAgIDU6IG1hcDx0ZXN0X2VudW0yLCB0ZXN0X2VudW0zID4gc3RydWN0M19tZW1iZXI1LAorICAgIDc6IG1hcDxkb3VibGUsIHN0cmluZz4gc3RydWN0M19tZW1iZXI3Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDQgeworICAgIDE6IGkzMiBzdHJ1Y3Q0X21lbWJlcjEsCisgICAgMjogb3B0aW9uYWwgaTMyIHN0cnVjdDRfbWVtYmVyMgorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q1eworICAgIDE6IGRvdWJsZSBzdHJ1Y3Q1X21lbWJlcjEsCisgICAgMjogc3RyaW5nIHN0cnVjdDVfbWVtYmVyMiA9ICJUaHJpZnQgQXVkaXQgVGVzdCIKK30KK3N0cnVjdCB0ZXN0X3N0cnVjdDYgeworICAgIDE6IGkzMiBzdHJ1Y3Q2X21lbWJlcjEsCisgICAgMjogcmVxdWlyZWQgaTMyIHN0cnVjdDZfbWVtYmVyMgorfQorCitzZXJ2aWNlIGJhc2UgeworICAgIG9uZXdheSB2b2lkIGJhc2Vfb25ld2F5KAorICAgICAgICAxOiBpMzIgYXJnMSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMTYgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGkzMiBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogaTY0IGZ1bmN0aW9uMV9hcmczLAorICAgICAgICA0OiBkb3VibGUgZnVuY3Rpb24xX2FyZzQsCisgICAgICAgIDU6IHN0cmluZyBmdW5jdGlvbjFfYXJnNSwKKyAgICAgICAgNjogYm9vbCBmdW5jdGlvbjFfYXJnNiwKKyAgICAgICAgNzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnNywKKyAgICAgICAgODogdGVzdF9zdHJ1Y3QxIGZ1bmN0aW9uMV9hcmc4KSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTE2PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxpMzI+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmc1LAorICAgICAgICA2OiBsaXN0PGJvb2w+IGZ1bmN0aW9uMl9hcmc2LAorICAgICAgICA3OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc3LAorICAgICAgICA4OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc4LAorICAgICAgICA5OiBsaXN0PHRlc3Rfc3RydWN0MT4gZnVuY3Rpb24yX2FyZzkpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24zKCksCisKK30KKworc2VydmljZSBkZXJpdmVkMSBleHRlbmRzIGJhc2UgeworICAgIAorICAgIHRlc3RfZW51bTEgZGVyaXZlZDFfZnVuY3Rpb24xKAorICAgICAgICAxOiBpNjQgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGRvdWJsZSBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGk2NCBkZXJpdmVkMV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzUpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBkb3VibGUgZGVyaXZlZDFfZnVuY3Rpb24zKAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb24zX2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb24zX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBzdHJpbmcgZGVyaXZlZDFfZnVuY3Rpb240KAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb240X2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb240X2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKworICAgIGJvb2wgZGVyaXZlZDFfZnVuY3Rpb241KAorICAgICAgICAxOiBtYXA8aTY0LCBkb3VibGU+IGZ1bmN0aW9uNV9hcmcxLAorICAgICAgICAyOiBtYXA8c3RyaW5nLCBib29sPiBmdW5jdGlvbjVfYXJnMiwKKyAgICAgICAgMzogbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGZ1bmN0aW9uNV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdGVzdF9zdHJ1Y3QxIGRlcml2ZWQxX2Z1bmN0aW9uNigKKyAgICAgICAgMTogZG91YmxlIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorfQorCitzZXJ2aWNlIGRlcml2ZWQyIGV4dGVuZHMgYmFzZSB7CisKKyAgICBsaXN0PGkzMj4gZGVyaXZlZDJfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMzIgZnVuY3Rpb24xX2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCisgICAgbGlzdDx0ZXN0X2VudW0xPiBkZXJpdmVkMl9mdW5jdGlvbjIoCisgICAgICAgIDE6aTY0IGZ1bmN0aW9uMl9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbGlzdDx0ZXN0X3N0cnVjdDE+IGRlcml2ZWQyX2Z1bmN0aW9uMygKKyAgICAgICAgMTpkb3VibGUgZnVuY3Rpb24zX2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDxkb3VibGUsIHN0cmluZz4gZGVyaXZlZDJfZnVuY3Rpb240KAorICAgICAgICAxOnN0cmluZyBmdW5jdGlvbjRfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGRlcml2ZWQyX2Z1bmN0aW9uNSgKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNV9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9zdHJ1Y3QxLCB0ZXN0X3N0cnVjdDI+IGRlcml2ZWQyX2Z1bmN0aW9uNigKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCit9CmRpZmYgLS1naXQgYS90ZXN0L2F1ZGl0L2JyZWFrNS50aHJpZnQgYi90ZXN0L2F1ZGl0L2JyZWFrNS50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThjMjJkMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYXVkaXQvYnJlYWs1LnRocmlmdApAQCAtMCwwICsxLDE5MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBtZW1iZXIgZmllbGQgdHlwZSBjaGFuZ2VkIGluIHRlc3Rfc3RydWN0MShib29sIHRvIGxpc3Q8Ym9vbD4pCisKK25hbWVzcGFjZSBjcHAgdGVzdAorCisvL0NvbnN0YW50cworY29uc3QgaTMyIGNvbnN0MSA9IDEyMzsKK2NvbnN0IGRvdWJsZSBjb25zdDIgPSAyMy4zOworY29uc3QgbWFwPHN0cmluZyxzdHJpbmc+IGNvbnN0MyA9IHsiaGVsbG8iOiJ3b3JsZCIsICJ0aHJpZnQiOiJhdWRpdCJ9OworCisvL0V4Y2VwdGlvbgorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMSB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CitleGNlcHRpb24gdGVzdF9leGNlcHRpb24yIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KKworLy9FbnVtcworCitlbnVtIHRlc3RfZW51bTEgeworICAgIGVudW0xX3ZhbHVlMCA9IDAsCisgICAgZW51bTFfdmFsdWUxID0gMSwKKyAgICBlbnVtMV92YWx1ZTIgPSAyLAorICAgIGVudW0xX3ZhbHVlNSA9IDUsCisgICAgZW51bTFfdmFsdWU3ID0gNywKKyAgICBlbnVtMV92YWx1ZTggPSA4Cit9CisKK2VudW0gdGVzdF9lbnVtMiB7CisgICAgZW51bTJfdmFsdWUwID0gMCwKKyAgICBlbnVtMl92YWx1ZTEgPSAxLAorICAgIGVudW0yX3ZhbHVlMiA9IDIsCisgICAgZW51bTJfdmFsdWUzID0gMworfQorCitlbnVtIHRlc3RfZW51bTMgeworICAgIGVudW0zX3ZhbHVlMSA9IDAsCisgICAgZW51bTNfdmFsdWUyID0gMQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QxIHsKKyAgICAxOiBpMTYgc3RydWN0MV9tZW1iZXIxLAorICAgIDI6IGkzMiBzdHJ1Y3QxX21lbWJlcjIsCisgICAgMzogaTY0IHN0cnVjdDFfbWVtYmVyMywKKyAgICA0OiBkb3VibGUgc3RydWN0MV9tZW1iZXI0ID0gMi41LAorICAgIDU6IHN0cmluZyBzdHJ1Y3QxX21lbWJlcjUgPSAiQXVkaXQgdGVzdCIsCisgICAgNjogbGlzdDxib29sPiBzdHJ1Y3QxX21lbWJlcjYsCisgICAgNzogYnl0ZSBzdHJ1Y3QxX21lbWJlcjcsCisgICAgODogYmluYXJ5IHN0cnVjdDFfbWVtYmVyOCwKKyAgICA5OiB0ZXN0X2VudW0xIHN0cnVjdDFfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QyIHsKKyAgICAxOiBsaXN0PGkxNj4gc3RydWN0Ml9tZW1iZXIxLAorICAgIDI6IGxpc3Q8aTMyPiBzdHJ1Y3QyX21lbWJlcjIsCisgICAgMzogbGlzdDxpNjQ+IHN0cnVjdDJfbWVtYmVyMyA9IFsyMywgMzIgXSwKKyAgICA0OiBsaXN0PGRvdWJsZT4gc3RydWN0Ml9tZW1iZXI0LAorICAgIDU6IGxpc3Q8c3RyaW5nPiBzdHJ1Y3QyX21lbWJlcjUsCisgICAgNjogbGlzdDxib29sPiBzdHJ1Y3QyX21lbWJlcjYsCisgICAgNzogbGlzdDxieXRlPiBzdHJ1Y3QyX21lbWJlcjcsCisgICAgODogbGlzdDxiaW5hcnk+IHN0cnVjdDJfbWVtYmVyOCwKKyAgICA5OiBsaXN0PHRlc3RfZW51bTE+IHN0cnVjdDJfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QzIHsKKyAgICAxOiBtYXA8aTE2LCBpMzI+IHN0cnVjdDNfbWVtYmVyMSA9IHsxOjIsIDM6NH0sCisgICAgMjogbWFwPGk2NCwgZG91YmxlPiBzdHJ1Y3QzX21lbWJlcjIgPSB7MTA6MS4xLCAyMDoyLjF9LAorICAgIDM6IG1hcDxzdHJpbmcsIGJvb2w+IHN0cnVjdDNfbWVtYmVyMywKKyAgICA0OiBtYXA8Ynl0ZSwgdGVzdF9lbnVtMT4gc3RydWN0M19tZW1iZXI0LAorICAgIDU6IG1hcDx0ZXN0X2VudW0yLCB0ZXN0X2VudW0zID4gc3RydWN0M19tZW1iZXI1LAorICAgIDc6IG1hcDxkb3VibGUsIHN0cmluZz4gc3RydWN0M19tZW1iZXI3Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDQgeworICAgIDE6IGkzMiBzdHJ1Y3Q0X21lbWJlcjEsCisgICAgMjogb3B0aW9uYWwgaTMyIHN0cnVjdDRfbWVtYmVyMgorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q1eworICAgIDE6IGRvdWJsZSBzdHJ1Y3Q1X21lbWJlcjEsCisgICAgMjogc3RyaW5nIHN0cnVjdDVfbWVtYmVyMiA9ICJUaHJpZnQgQXVkaXQgVGVzdCIKK30KK3N0cnVjdCB0ZXN0X3N0cnVjdDYgeworICAgIDE6IGkzMiBzdHJ1Y3Q2X21lbWJlcjEsCisgICAgMjogcmVxdWlyZWQgaTMyIHN0cnVjdDZfbWVtYmVyMgorfQorCitzZXJ2aWNlIGJhc2UgeworICAgIG9uZXdheSB2b2lkIGJhc2Vfb25ld2F5KAorICAgICAgICAxOiBpMzIgYXJnMSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMTYgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGkzMiBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogaTY0IGZ1bmN0aW9uMV9hcmczLAorICAgICAgICA0OiBkb3VibGUgZnVuY3Rpb24xX2FyZzQsCisgICAgICAgIDU6IHN0cmluZyBmdW5jdGlvbjFfYXJnNSwKKyAgICAgICAgNjogYm9vbCBmdW5jdGlvbjFfYXJnNiwKKyAgICAgICAgNzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnNywKKyAgICAgICAgODogdGVzdF9zdHJ1Y3QxIGZ1bmN0aW9uMV9hcmc4KSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTE2PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxpMzI+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmc1LAorICAgICAgICA2OiBsaXN0PGJvb2w+IGZ1bmN0aW9uMl9hcmc2LAorICAgICAgICA3OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc3LAorICAgICAgICA4OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc4LAorICAgICAgICA5OiBsaXN0PHRlc3Rfc3RydWN0MT4gZnVuY3Rpb24yX2FyZzkpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24zKCksCisKK30KKworc2VydmljZSBkZXJpdmVkMSBleHRlbmRzIGJhc2UgeworICAgIAorICAgIHRlc3RfZW51bTEgZGVyaXZlZDFfZnVuY3Rpb24xKAorICAgICAgICAxOiBpNjQgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGRvdWJsZSBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGk2NCBkZXJpdmVkMV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzUpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBkb3VibGUgZGVyaXZlZDFfZnVuY3Rpb24zKAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb24zX2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb24zX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBzdHJpbmcgZGVyaXZlZDFfZnVuY3Rpb240KAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb240X2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb240X2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKworICAgIGJvb2wgZGVyaXZlZDFfZnVuY3Rpb241KAorICAgICAgICAxOiBtYXA8aTY0LCBkb3VibGU+IGZ1bmN0aW9uNV9hcmcxLAorICAgICAgICAyOiBtYXA8c3RyaW5nLCBib29sPiBmdW5jdGlvbjVfYXJnMiwKKyAgICAgICAgMzogbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGZ1bmN0aW9uNV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdGVzdF9zdHJ1Y3QxIGRlcml2ZWQxX2Z1bmN0aW9uNigKKyAgICAgICAgMTogZG91YmxlIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorfQorCitzZXJ2aWNlIGRlcml2ZWQyIGV4dGVuZHMgYmFzZSB7CisKKyAgICBsaXN0PGkzMj4gZGVyaXZlZDJfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMzIgZnVuY3Rpb24xX2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCisgICAgbGlzdDx0ZXN0X2VudW0xPiBkZXJpdmVkMl9mdW5jdGlvbjIoCisgICAgICAgIDE6aTY0IGZ1bmN0aW9uMl9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbGlzdDx0ZXN0X3N0cnVjdDE+IGRlcml2ZWQyX2Z1bmN0aW9uMygKKyAgICAgICAgMTpkb3VibGUgZnVuY3Rpb24zX2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDxkb3VibGUsIHN0cmluZz4gZGVyaXZlZDJfZnVuY3Rpb240KAorICAgICAgICAxOnN0cmluZyBmdW5jdGlvbjRfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGRlcml2ZWQyX2Z1bmN0aW9uNSgKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNV9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9zdHJ1Y3QxLCB0ZXN0X3N0cnVjdDI+IGRlcml2ZWQyX2Z1bmN0aW9uNigKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCit9CmRpZmYgLS1naXQgYS90ZXN0L2F1ZGl0L2JyZWFrNi50aHJpZnQgYi90ZXN0L2F1ZGl0L2JyZWFrNi50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI3YTMwMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYXVkaXQvYnJlYWs2LnRocmlmdApAQCAtMCwwICsxLDE5MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBGaWVsZCB0eXBlIGNoYW5nZWQgaW4gdGVzdF9zdHJ1Y3QyIChsaXN0PGRvdWJsZT4gdG8gbGlzdDxpMTY+KQorCituYW1lc3BhY2UgY3BwIHRlc3QKKworLy9Db25zdGFudHMKK2NvbnN0IGkzMiBjb25zdDEgPSAxMjM7Citjb25zdCBkb3VibGUgY29uc3QyID0gMjMuMzsKK2NvbnN0IG1hcDxzdHJpbmcsc3RyaW5nPiBjb25zdDMgPSB7ImhlbGxvIjoid29ybGQiLCAidGhyaWZ0IjoiYXVkaXQifTsKKworCisvL0V4Y2VwdGlvbgorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMSB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CitleGNlcHRpb24gdGVzdF9leGNlcHRpb24yIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KKworLy9FbnVtcworCitlbnVtIHRlc3RfZW51bTEgeworICAgIGVudW0xX3ZhbHVlMCA9IDAsCisgICAgZW51bTFfdmFsdWUxID0gMSwKKyAgICBlbnVtMV92YWx1ZTIgPSAyLAorICAgIGVudW0xX3ZhbHVlNSA9IDUsCisgICAgZW51bTFfdmFsdWU3ID0gNywKKyAgICBlbnVtMV92YWx1ZTggPSA4Cit9CisKK2VudW0gdGVzdF9lbnVtMiB7CisgICAgZW51bTJfdmFsdWUwID0gMCwKKyAgICBlbnVtMl92YWx1ZTEgPSAxLAorICAgIGVudW0yX3ZhbHVlMiA9IDIsCisgICAgZW51bTJfdmFsdWUzID0gMworfQorCitlbnVtIHRlc3RfZW51bTMgeworICAgIGVudW0zX3ZhbHVlMSA9IDAsCisgICAgZW51bTNfdmFsdWUyID0gMQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QxIHsKKyAgICAxOiBpMTYgc3RydWN0MV9tZW1iZXIxLAorICAgIDI6IGkzMiBzdHJ1Y3QxX21lbWJlcjIsCisgICAgMzogaTY0IHN0cnVjdDFfbWVtYmVyMywKKyAgICA0OiBkb3VibGUgc3RydWN0MV9tZW1iZXI0ID0gMi41LAorICAgIDU6IHN0cmluZyBzdHJ1Y3QxX21lbWJlcjUgPSAiQXVkaXQgdGVzdCIsCisgICAgNjogYm9vbCBzdHJ1Y3QxX21lbWJlcjYsCisgICAgNzogYnl0ZSBzdHJ1Y3QxX21lbWJlcjcsCisgICAgODogYmluYXJ5IHN0cnVjdDFfbWVtYmVyOCwKKyAgICA5OiB0ZXN0X2VudW0xIHN0cnVjdDFfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QyIHsKKyAgICAxOiBsaXN0PGkxNj4gc3RydWN0Ml9tZW1iZXIxLAorICAgIDI6IGxpc3Q8aTMyPiBzdHJ1Y3QyX21lbWJlcjIsCisgICAgMzogbGlzdDxpNjQ+IHN0cnVjdDJfbWVtYmVyMyA9IFsyMywgMzIgXSwKKyAgICA0OiBsaXN0PGkxNj4gc3RydWN0Ml9tZW1iZXI0LAorICAgIDU6IGxpc3Q8c3RyaW5nPiBzdHJ1Y3QyX21lbWJlcjUsCisgICAgNjogbGlzdDxib29sPiBzdHJ1Y3QyX21lbWJlcjYsCisgICAgNzogbGlzdDxieXRlPiBzdHJ1Y3QyX21lbWJlcjcsCisgICAgODogbGlzdDxiaW5hcnk+IHN0cnVjdDJfbWVtYmVyOCwKKyAgICA5OiBsaXN0PHRlc3RfZW51bTE+IHN0cnVjdDJfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QzIHsKKyAgICAxOiBtYXA8aTE2LCBpMzI+IHN0cnVjdDNfbWVtYmVyMSA9IHsxOjIsIDM6NH0sCisgICAgMjogbWFwPGk2NCwgZG91YmxlPiBzdHJ1Y3QzX21lbWJlcjIgPSB7MTA6MS4xLCAyMDoyLjF9LAorICAgIDM6IG1hcDxzdHJpbmcsIGJvb2w+IHN0cnVjdDNfbWVtYmVyMywKKyAgICA0OiBtYXA8Ynl0ZSwgdGVzdF9lbnVtMT4gc3RydWN0M19tZW1iZXI0LAorICAgIDU6IG1hcDx0ZXN0X2VudW0yLCB0ZXN0X2VudW0zID4gc3RydWN0M19tZW1iZXI1LAorICAgIDc6IG1hcDxkb3VibGUsIHN0cmluZz4gc3RydWN0M19tZW1iZXI3Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDQgeworICAgIDE6IGkzMiBzdHJ1Y3Q0X21lbWJlcjEsCisgICAgMjogb3B0aW9uYWwgaTMyIHN0cnVjdDRfbWVtYmVyMgorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q1eworICAgIDE6IGRvdWJsZSBzdHJ1Y3Q1X21lbWJlcjEsCisgICAgMjogc3RyaW5nIHN0cnVjdDVfbWVtYmVyMiA9ICJUaHJpZnQgQXVkaXQgVGVzdCIKK30KK3N0cnVjdCB0ZXN0X3N0cnVjdDYgeworICAgIDE6IGkzMiBzdHJ1Y3Q2X21lbWJlcjEsCisgICAgMjogcmVxdWlyZWQgaTMyIHN0cnVjdDZfbWVtYmVyMgorfQorCitzZXJ2aWNlIGJhc2UgeworICAgIG9uZXdheSB2b2lkIGJhc2Vfb25ld2F5KAorICAgICAgICAxOiBpMzIgYXJnMSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMTYgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGkzMiBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogaTY0IGZ1bmN0aW9uMV9hcmczLAorICAgICAgICA0OiBkb3VibGUgZnVuY3Rpb24xX2FyZzQsCisgICAgICAgIDU6IHN0cmluZyBmdW5jdGlvbjFfYXJnNSwKKyAgICAgICAgNjogYm9vbCBmdW5jdGlvbjFfYXJnNiwKKyAgICAgICAgNzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnNywKKyAgICAgICAgODogdGVzdF9zdHJ1Y3QxIGZ1bmN0aW9uMV9hcmc4KSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTE2PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxpMzI+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmc1LAorICAgICAgICA2OiBsaXN0PGJvb2w+IGZ1bmN0aW9uMl9hcmc2LAorICAgICAgICA3OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc3LAorICAgICAgICA4OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc4LAorICAgICAgICA5OiBsaXN0PHRlc3Rfc3RydWN0MT4gZnVuY3Rpb24yX2FyZzkpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24zKCksCisKK30KKworc2VydmljZSBkZXJpdmVkMSBleHRlbmRzIGJhc2UgeworICAgIAorICAgIHRlc3RfZW51bTEgZGVyaXZlZDFfZnVuY3Rpb24xKAorICAgICAgICAxOiBpNjQgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGRvdWJsZSBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGk2NCBkZXJpdmVkMV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzUpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBkb3VibGUgZGVyaXZlZDFfZnVuY3Rpb24zKAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb24zX2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb24zX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBzdHJpbmcgZGVyaXZlZDFfZnVuY3Rpb240KAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb240X2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb240X2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKworICAgIGJvb2wgZGVyaXZlZDFfZnVuY3Rpb241KAorICAgICAgICAxOiBtYXA8aTY0LCBkb3VibGU+IGZ1bmN0aW9uNV9hcmcxLAorICAgICAgICAyOiBtYXA8c3RyaW5nLCBib29sPiBmdW5jdGlvbjVfYXJnMiwKKyAgICAgICAgMzogbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGZ1bmN0aW9uNV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdGVzdF9zdHJ1Y3QxIGRlcml2ZWQxX2Z1bmN0aW9uNigKKyAgICAgICAgMTogZG91YmxlIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorfQorCitzZXJ2aWNlIGRlcml2ZWQyIGV4dGVuZHMgYmFzZSB7CisKKyAgICBsaXN0PGkzMj4gZGVyaXZlZDJfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMzIgZnVuY3Rpb24xX2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCisgICAgbGlzdDx0ZXN0X2VudW0xPiBkZXJpdmVkMl9mdW5jdGlvbjIoCisgICAgICAgIDE6aTY0IGZ1bmN0aW9uMl9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbGlzdDx0ZXN0X3N0cnVjdDE+IGRlcml2ZWQyX2Z1bmN0aW9uMygKKyAgICAgICAgMTpkb3VibGUgZnVuY3Rpb24zX2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDxkb3VibGUsIHN0cmluZz4gZGVyaXZlZDJfZnVuY3Rpb240KAorICAgICAgICAxOnN0cmluZyBmdW5jdGlvbjRfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGRlcml2ZWQyX2Z1bmN0aW9uNSgKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNV9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9zdHJ1Y3QxLCB0ZXN0X3N0cnVjdDI+IGRlcml2ZWQyX2Z1bmN0aW9uNigKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCit9CmRpZmYgLS1naXQgYS90ZXN0L2F1ZGl0L2JyZWFrNy50aHJpZnQgYi90ZXN0L2F1ZGl0L2JyZWFrNy50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMxYzJkZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYXVkaXQvYnJlYWs3LnRocmlmdApAQCAtMCwwICsxLDE5MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvL2JyZWFrNyAtIHJlcXVpcmVkbmVzcyByZW1vdmVkIGluIHN0cnVjdDYKKworbmFtZXNwYWNlIGNwcCB0ZXN0CisvL0NvbnN0YW50cworY29uc3QgaTMyIGNvbnN0MSA9IDEyMzsKK2NvbnN0IGRvdWJsZSBjb25zdDIgPSAyMy4zOworY29uc3QgbWFwPHN0cmluZyxzdHJpbmc+IGNvbnN0MyA9IHsiaGVsbG8iOiJ3b3JsZCIsICJ0aHJpZnQiOiJhdWRpdCJ9OworCisKKy8vRXhjZXB0aW9uCitleGNlcHRpb24gdGVzdF9leGNlcHRpb24xIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjIgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorCisvL0VudW1zCisKK2VudW0gdGVzdF9lbnVtMSB7CisgICAgZW51bTFfdmFsdWUwID0gMCwKKyAgICBlbnVtMV92YWx1ZTEgPSAxLAorICAgIGVudW0xX3ZhbHVlMiA9IDIsCisgICAgZW51bTFfdmFsdWU1ID0gNSwKKyAgICBlbnVtMV92YWx1ZTcgPSA3LAorICAgIGVudW0xX3ZhbHVlOCA9IDgKK30KKworZW51bSB0ZXN0X2VudW0yIHsKKyAgICBlbnVtMl92YWx1ZTAgPSAwLAorICAgIGVudW0yX3ZhbHVlMSA9IDEsCisgICAgZW51bTJfdmFsdWUyID0gMiwKKyAgICBlbnVtMl92YWx1ZTMgPSAzCit9CisKK2VudW0gdGVzdF9lbnVtMyB7CisgICAgZW51bTNfdmFsdWUxID0gMCwKKyAgICBlbnVtM192YWx1ZTIgPSAxCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDEgeworICAgIDE6IGkxNiBzdHJ1Y3QxX21lbWJlcjEsCisgICAgMjogaTMyIHN0cnVjdDFfbWVtYmVyMiwKKyAgICAzOiBpNjQgc3RydWN0MV9tZW1iZXIzLAorICAgIDQ6IGRvdWJsZSBzdHJ1Y3QxX21lbWJlcjQgPSAyLjUsCisgICAgNTogc3RyaW5nIHN0cnVjdDFfbWVtYmVyNSA9ICJBdWRpdCB0ZXN0IiwKKyAgICA2OiBib29sIHN0cnVjdDFfbWVtYmVyNiwKKyAgICA3OiBieXRlIHN0cnVjdDFfbWVtYmVyNywKKyAgICA4OiBiaW5hcnkgc3RydWN0MV9tZW1iZXI4LAorICAgIDk6IHRlc3RfZW51bTEgc3RydWN0MV9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDIgeworICAgIDE6IGxpc3Q8aTE2PiBzdHJ1Y3QyX21lbWJlcjEsCisgICAgMjogbGlzdDxpMzI+IHN0cnVjdDJfbWVtYmVyMiwKKyAgICAzOiBsaXN0PGk2ND4gc3RydWN0Ml9tZW1iZXIzID0gWzIzLCAzMiBdLAorICAgIDQ6IGxpc3Q8ZG91YmxlPiBzdHJ1Y3QyX21lbWJlcjQsCisgICAgNTogbGlzdDxzdHJpbmc+IHN0cnVjdDJfbWVtYmVyNSwKKyAgICA2OiBsaXN0PGJvb2w+IHN0cnVjdDJfbWVtYmVyNiwKKyAgICA3OiBsaXN0PGJ5dGU+IHN0cnVjdDJfbWVtYmVyNywKKyAgICA4OiBsaXN0PGJpbmFyeT4gc3RydWN0Ml9tZW1iZXI4LAorICAgIDk6IGxpc3Q8dGVzdF9lbnVtMT4gc3RydWN0Ml9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDMgeworICAgIDE6IG1hcDxpMTYsIGkzMj4gc3RydWN0M19tZW1iZXIxID0gezE6MiwgMzo0fSwKKyAgICAyOiBtYXA8aTY0LCBkb3VibGU+IHN0cnVjdDNfbWVtYmVyMiA9IHsxMDoxLjEsIDIwOjIuMX0sCisgICAgMzogbWFwPHN0cmluZywgYm9vbD4gc3RydWN0M19tZW1iZXIzLAorICAgIDQ6IG1hcDxieXRlLCB0ZXN0X2VudW0xPiBzdHJ1Y3QzX21lbWJlcjQsCisgICAgNTogbWFwPHRlc3RfZW51bTIsIHRlc3RfZW51bTMgPiBzdHJ1Y3QzX21lbWJlcjUsCisgICAgNzogbWFwPGRvdWJsZSwgc3RyaW5nPiBzdHJ1Y3QzX21lbWJlcjcKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NCB7CisgICAgMTogaTMyIHN0cnVjdDRfbWVtYmVyMSwKKyAgICAyOiBvcHRpb25hbCBpMzIgc3RydWN0NF9tZW1iZXIyCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDV7CisgICAgMTogZG91YmxlIHN0cnVjdDVfbWVtYmVyMSwKKyAgICAyOiBzdHJpbmcgc3RydWN0NV9tZW1iZXIyID0gIlRocmlmdCBBdWRpdCBUZXN0IgorfQorc3RydWN0IHRlc3Rfc3RydWN0NiB7CisgICAgMTogaTMyIHN0cnVjdDZfbWVtYmVyMSwKKyAgICAyOiBpMzIgc3RydWN0Nl9tZW1iZXIyCit9CisKK3NlcnZpY2UgYmFzZSB7CisgICAgb25ld2F5IHZvaWQgYmFzZV9vbmV3YXkoCisgICAgICAgIDE6IGkzMiBhcmcxKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkxNiBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogaTMyIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiBpNjQgZnVuY3Rpb24xX2FyZzMsCisgICAgICAgIDQ6IGRvdWJsZSBmdW5jdGlvbjFfYXJnNCwKKyAgICAgICAgNTogc3RyaW5nIGZ1bmN0aW9uMV9hcmc1LAorICAgICAgICA2OiBib29sIGZ1bmN0aW9uMV9hcmc2LAorICAgICAgICA3OiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmc3LAorICAgICAgICA4OiB0ZXN0X3N0cnVjdDEgZnVuY3Rpb24xX2FyZzgpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpMTY+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGkzMj4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzUsCisgICAgICAgIDY6IGxpc3Q8Ym9vbD4gZnVuY3Rpb24yX2FyZzYsCisgICAgICAgIDc6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzcsCisgICAgICAgIDg6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzgsCisgICAgICAgIDk6IGxpc3Q8dGVzdF9zdHJ1Y3QxPiBmdW5jdGlvbjJfYXJnOSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjMoKSwKKworfQorCitzZXJ2aWNlIGRlcml2ZWQxIGV4dGVuZHMgYmFzZSB7CisgICAgCisgICAgdGVzdF9lbnVtMSBkZXJpdmVkMV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGk2NCBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogZG91YmxlIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgaTY0IGRlcml2ZWQxX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnNSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGRvdWJsZSBkZXJpdmVkMV9mdW5jdGlvbjMoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjNfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjNfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHN0cmluZyBkZXJpdmVkMV9mdW5jdGlvbjQoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjRfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjRfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworCisgICAgYm9vbCBkZXJpdmVkMV9mdW5jdGlvbjUoCisgICAgICAgIDE6IG1hcDxpNjQsIGRvdWJsZT4gZnVuY3Rpb241X2FyZzEsCisgICAgICAgIDI6IG1hcDxzdHJpbmcsIGJvb2w+IGZ1bmN0aW9uNV9hcmcyLAorICAgICAgICAzOiBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZnVuY3Rpb241X2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB0ZXN0X3N0cnVjdDEgZGVyaXZlZDFfZnVuY3Rpb242KAorICAgICAgICAxOiBkb3VibGUgZnVuY3Rpb242X2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCit9CisKK3NlcnZpY2UgZGVyaXZlZDIgZXh0ZW5kcyBiYXNlIHsKKworICAgIGxpc3Q8aTMyPiBkZXJpdmVkMl9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkzMiBmdW5jdGlvbjFfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKKyAgICBsaXN0PHRlc3RfZW51bTE+IGRlcml2ZWQyX2Z1bmN0aW9uMigKKyAgICAgICAgMTppNjQgZnVuY3Rpb24yX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBsaXN0PHRlc3Rfc3RydWN0MT4gZGVyaXZlZDJfZnVuY3Rpb24zKAorICAgICAgICAxOmRvdWJsZSBmdW5jdGlvbjNfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPGRvdWJsZSwgc3RyaW5nPiBkZXJpdmVkMl9mdW5jdGlvbjQoCisgICAgICAgIDE6c3RyaW5nIGZ1bmN0aW9uNF9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZGVyaXZlZDJfZnVuY3Rpb241KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb241X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X3N0cnVjdDEsIHRlc3Rfc3RydWN0Mj4gZGVyaXZlZDJfZnVuY3Rpb242KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb242X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKK30KZGlmZiAtLWdpdCBhL3Rlc3QvYXVkaXQvYnJlYWs4LnRocmlmdCBiL3Rlc3QvYXVkaXQvYnJlYWs4LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWNhYzA5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9hdWRpdC9icmVhazgudGhyaWZ0CkBAIC0wLDAgKzEsMTkxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vYnJlYWs4IC0gcmVxdWlyZWRuZXNzIGFkZGVkZCBpbiBzdHJ1Y3Q1CisKK25hbWVzcGFjZSBjcHAgdGVzdAorCisvL0NvbnN0YW50cworY29uc3QgaTMyIGNvbnN0MSA9IDEyMzsKK2NvbnN0IGRvdWJsZSBjb25zdDIgPSAyMy4zOworY29uc3QgbWFwPHN0cmluZyxzdHJpbmc+IGNvbnN0MyA9IHsiaGVsbG8iOiJ3b3JsZCIsICJ0aHJpZnQiOiJhdWRpdCJ9OworCisKKy8vRXhjZXB0aW9uCitleGNlcHRpb24gdGVzdF9leGNlcHRpb24xIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjIgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorCisvL0VudW1zCisKK2VudW0gdGVzdF9lbnVtMSB7CisgICAgZW51bTFfdmFsdWUwID0gMCwKKyAgICBlbnVtMV92YWx1ZTEgPSAxLAorICAgIGVudW0xX3ZhbHVlMiA9IDIsCisgICAgZW51bTFfdmFsdWU1ID0gNSwKKyAgICBlbnVtMV92YWx1ZTcgPSA3LAorICAgIGVudW0xX3ZhbHVlOCA9IDgKK30KKworZW51bSB0ZXN0X2VudW0yIHsKKyAgICBlbnVtMl92YWx1ZTAgPSAwLAorICAgIGVudW0yX3ZhbHVlMSA9IDEsCisgICAgZW51bTJfdmFsdWUyID0gMiwKKyAgICBlbnVtMl92YWx1ZTMgPSAzCit9CisKK2VudW0gdGVzdF9lbnVtMyB7CisgICAgZW51bTNfdmFsdWUxID0gMCwKKyAgICBlbnVtM192YWx1ZTIgPSAxCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDEgeworICAgIDE6IGkxNiBzdHJ1Y3QxX21lbWJlcjEsCisgICAgMjogaTMyIHN0cnVjdDFfbWVtYmVyMiwKKyAgICAzOiBpNjQgc3RydWN0MV9tZW1iZXIzLAorICAgIDQ6IGRvdWJsZSBzdHJ1Y3QxX21lbWJlcjQgPSAyLjUsCisgICAgNTogc3RyaW5nIHN0cnVjdDFfbWVtYmVyNSA9ICJBdWRpdCB0ZXN0IiwKKyAgICA2OiBib29sIHN0cnVjdDFfbWVtYmVyNiwKKyAgICA3OiBieXRlIHN0cnVjdDFfbWVtYmVyNywKKyAgICA4OiBiaW5hcnkgc3RydWN0MV9tZW1iZXI4LAorICAgIDk6IHRlc3RfZW51bTEgc3RydWN0MV9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDIgeworICAgIDE6IGxpc3Q8aTE2PiBzdHJ1Y3QyX21lbWJlcjEsCisgICAgMjogbGlzdDxpMzI+IHN0cnVjdDJfbWVtYmVyMiwKKyAgICAzOiBsaXN0PGk2ND4gc3RydWN0Ml9tZW1iZXIzID0gWzIzLCAzMiBdLAorICAgIDQ6IGxpc3Q8ZG91YmxlPiBzdHJ1Y3QyX21lbWJlcjQsCisgICAgNTogbGlzdDxzdHJpbmc+IHN0cnVjdDJfbWVtYmVyNSwKKyAgICA2OiBsaXN0PGJvb2w+IHN0cnVjdDJfbWVtYmVyNiwKKyAgICA3OiBsaXN0PGJ5dGU+IHN0cnVjdDJfbWVtYmVyNywKKyAgICA4OiBsaXN0PGJpbmFyeT4gc3RydWN0Ml9tZW1iZXI4LAorICAgIDk6IGxpc3Q8dGVzdF9lbnVtMT4gc3RydWN0Ml9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDMgeworICAgIDE6IG1hcDxpMTYsIGkzMj4gc3RydWN0M19tZW1iZXIxID0gezE6MiwgMzo0fSwKKyAgICAyOiBtYXA8aTY0LCBkb3VibGU+IHN0cnVjdDNfbWVtYmVyMiA9IHsxMDoxLjEsIDIwOjIuMX0sCisgICAgMzogbWFwPHN0cmluZywgYm9vbD4gc3RydWN0M19tZW1iZXIzLAorICAgIDQ6IG1hcDxieXRlLCB0ZXN0X2VudW0xPiBzdHJ1Y3QzX21lbWJlcjQsCisgICAgNTogbWFwPHRlc3RfZW51bTIsIHRlc3RfZW51bTMgPiBzdHJ1Y3QzX21lbWJlcjUsCisgICAgNzogbWFwPGRvdWJsZSwgc3RyaW5nPiBzdHJ1Y3QzX21lbWJlcjcKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NCB7CisgICAgMTogaTMyIHN0cnVjdDRfbWVtYmVyMSwKKyAgICAyOiBvcHRpb25hbCBpMzIgc3RydWN0NF9tZW1iZXIyCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDV7CisgICAgMTogZG91YmxlIHN0cnVjdDVfbWVtYmVyMSwKKyAgICAyOiByZXF1aXJlZCBzdHJpbmcgc3RydWN0NV9tZW1iZXIyID0gIlRocmlmdCBBdWRpdCBUZXN0IgorfQorc3RydWN0IHRlc3Rfc3RydWN0NiB7CisgICAgMTogaTMyIHN0cnVjdDZfbWVtYmVyMSwKKyAgICAyOiByZXF1aXJlZCBpMzIgc3RydWN0Nl9tZW1iZXIyCit9CisKK3NlcnZpY2UgYmFzZSB7CisgICAgb25ld2F5IHZvaWQgYmFzZV9vbmV3YXkoCisgICAgICAgIDE6IGkzMiBhcmcxKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkxNiBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogaTMyIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiBpNjQgZnVuY3Rpb24xX2FyZzMsCisgICAgICAgIDQ6IGRvdWJsZSBmdW5jdGlvbjFfYXJnNCwKKyAgICAgICAgNTogc3RyaW5nIGZ1bmN0aW9uMV9hcmc1LAorICAgICAgICA2OiBib29sIGZ1bmN0aW9uMV9hcmc2LAorICAgICAgICA3OiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmc3LAorICAgICAgICA4OiB0ZXN0X3N0cnVjdDEgZnVuY3Rpb24xX2FyZzgpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpMTY+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGkzMj4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzUsCisgICAgICAgIDY6IGxpc3Q8Ym9vbD4gZnVuY3Rpb24yX2FyZzYsCisgICAgICAgIDc6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzcsCisgICAgICAgIDg6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzgsCisgICAgICAgIDk6IGxpc3Q8dGVzdF9zdHJ1Y3QxPiBmdW5jdGlvbjJfYXJnOSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjMoKSwKKworfQorCitzZXJ2aWNlIGRlcml2ZWQxIGV4dGVuZHMgYmFzZSB7CisgICAgCisgICAgdGVzdF9lbnVtMSBkZXJpdmVkMV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGk2NCBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogZG91YmxlIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgaTY0IGRlcml2ZWQxX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnNSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGRvdWJsZSBkZXJpdmVkMV9mdW5jdGlvbjMoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjNfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjNfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHN0cmluZyBkZXJpdmVkMV9mdW5jdGlvbjQoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjRfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjRfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworCisgICAgYm9vbCBkZXJpdmVkMV9mdW5jdGlvbjUoCisgICAgICAgIDE6IG1hcDxpNjQsIGRvdWJsZT4gZnVuY3Rpb241X2FyZzEsCisgICAgICAgIDI6IG1hcDxzdHJpbmcsIGJvb2w+IGZ1bmN0aW9uNV9hcmcyLAorICAgICAgICAzOiBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZnVuY3Rpb241X2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB0ZXN0X3N0cnVjdDEgZGVyaXZlZDFfZnVuY3Rpb242KAorICAgICAgICAxOiBkb3VibGUgZnVuY3Rpb242X2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCit9CisKK3NlcnZpY2UgZGVyaXZlZDIgZXh0ZW5kcyBiYXNlIHsKKworICAgIGxpc3Q8aTMyPiBkZXJpdmVkMl9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkzMiBmdW5jdGlvbjFfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKKyAgICBsaXN0PHRlc3RfZW51bTE+IGRlcml2ZWQyX2Z1bmN0aW9uMigKKyAgICAgICAgMTppNjQgZnVuY3Rpb24yX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBsaXN0PHRlc3Rfc3RydWN0MT4gZGVyaXZlZDJfZnVuY3Rpb24zKAorICAgICAgICAxOmRvdWJsZSBmdW5jdGlvbjNfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPGRvdWJsZSwgc3RyaW5nPiBkZXJpdmVkMl9mdW5jdGlvbjQoCisgICAgICAgIDE6c3RyaW5nIGZ1bmN0aW9uNF9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZGVyaXZlZDJfZnVuY3Rpb241KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb241X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X3N0cnVjdDEsIHRlc3Rfc3RydWN0Mj4gZGVyaXZlZDJfZnVuY3Rpb242KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb242X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKK30KZGlmZiAtLWdpdCBhL3Rlc3QvYXVkaXQvYnJlYWs5LnRocmlmdCBiL3Rlc3QvYXVkaXQvYnJlYWs5LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmIzMTlkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9hdWRpdC9icmVhazkudGhyaWZ0CkBAIC0wLDAgKzEsMTkwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vYnJlYWs5IC0gU3RydWN0IGZpZWxkIHJlbW92ZWQgZnJvbSBzdHJ1Y3QxCisKKworbmFtZXNwYWNlIGNwcCB0ZXN0CisvL0NvbnN0YW50cworCitjb25zdCBpMzIgY29uc3QxID0gMTIzOworY29uc3QgZG91YmxlIGNvbnN0MiA9IDIzLjM7Citjb25zdCBtYXA8c3RyaW5nLHN0cmluZz4gY29uc3QzID0geyJoZWxsbyI6IndvcmxkIiwgInRocmlmdCI6ImF1ZGl0In07CisKKy8vRXhjZXB0aW9uCitleGNlcHRpb24gdGVzdF9leGNlcHRpb24xIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjIgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorCisvL0VudW1zCisKK2VudW0gdGVzdF9lbnVtMSB7CisgICAgZW51bTFfdmFsdWUwID0gMCwKKyAgICBlbnVtMV92YWx1ZTEgPSAxLAorICAgIGVudW0xX3ZhbHVlMiA9IDIsCisgICAgZW51bTFfdmFsdWU1ID0gNSwKKyAgICBlbnVtMV92YWx1ZTcgPSA3LAorICAgIGVudW0xX3ZhbHVlOCA9IDgKK30KKworZW51bSB0ZXN0X2VudW0yIHsKKyAgICBlbnVtMl92YWx1ZTAgPSAwLAorICAgIGVudW0yX3ZhbHVlMSA9IDEsCisgICAgZW51bTJfdmFsdWUyID0gMiwKKyAgICBlbnVtMl92YWx1ZTMgPSAzCit9CisKK2VudW0gdGVzdF9lbnVtMyB7CisgICAgZW51bTNfdmFsdWUxID0gMCwKKyAgICBlbnVtM192YWx1ZTIgPSAxCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDEgeworICAgIDE6IGkxNiBzdHJ1Y3QxX21lbWJlcjEsCisgICAgMjogaTMyIHN0cnVjdDFfbWVtYmVyMiwKKyAgICAzOiBpNjQgc3RydWN0MV9tZW1iZXIzLAorICAgIDQ6IGRvdWJsZSBzdHJ1Y3QxX21lbWJlcjQgPSAyLjUsCisgICAgNTogc3RyaW5nIHN0cnVjdDFfbWVtYmVyNSA9ICJBdWRpdCB0ZXN0IiwKKyAgICA2OiBib29sIHN0cnVjdDFfbWVtYmVyNiwKKyAgICA4OiBiaW5hcnkgc3RydWN0MV9tZW1iZXI4LAorICAgIDk6IHRlc3RfZW51bTEgc3RydWN0MV9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDIgeworICAgIDE6IGxpc3Q8aTE2PiBzdHJ1Y3QyX21lbWJlcjEsCisgICAgMjogbGlzdDxpMzI+IHN0cnVjdDJfbWVtYmVyMiwKKyAgICAzOiBsaXN0PGk2ND4gc3RydWN0Ml9tZW1iZXIzID0gWzIzLCAzMiBdLAorICAgIDQ6IGxpc3Q8ZG91YmxlPiBzdHJ1Y3QyX21lbWJlcjQsCisgICAgNTogbGlzdDxzdHJpbmc+IHN0cnVjdDJfbWVtYmVyNSwKKyAgICA2OiBsaXN0PGJvb2w+IHN0cnVjdDJfbWVtYmVyNiwKKyAgICA3OiBsaXN0PGJ5dGU+IHN0cnVjdDJfbWVtYmVyNywKKyAgICA4OiBsaXN0PGJpbmFyeT4gc3RydWN0Ml9tZW1iZXI4LAorICAgIDk6IGxpc3Q8dGVzdF9lbnVtMT4gc3RydWN0Ml9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDMgeworICAgIDE6IG1hcDxpMTYsIGkzMj4gc3RydWN0M19tZW1iZXIxID0gezE6MiwgMzo0fSwKKyAgICAyOiBtYXA8aTY0LCBkb3VibGU+IHN0cnVjdDNfbWVtYmVyMiA9IHsxMDoxLjEsIDIwOjIuMX0sCisgICAgMzogbWFwPHN0cmluZywgYm9vbD4gc3RydWN0M19tZW1iZXIzLAorICAgIDQ6IG1hcDxieXRlLCB0ZXN0X2VudW0xPiBzdHJ1Y3QzX21lbWJlcjQsCisgICAgNTogbWFwPHRlc3RfZW51bTIsIHRlc3RfZW51bTMgPiBzdHJ1Y3QzX21lbWJlcjUsCisgICAgNzogbWFwPGRvdWJsZSwgc3RyaW5nPiBzdHJ1Y3QzX21lbWJlcjcKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NCB7CisgICAgMTogaTMyIHN0cnVjdDRfbWVtYmVyMSwKKyAgICAyOiBvcHRpb25hbCBpMzIgc3RydWN0NF9tZW1iZXIyCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDV7CisgICAgMTogZG91YmxlIHN0cnVjdDVfbWVtYmVyMSwKKyAgICAyOiBzdHJpbmcgc3RydWN0NV9tZW1iZXIyID0gIlRocmlmdCBBdWRpdCBUZXN0IgorfQorc3RydWN0IHRlc3Rfc3RydWN0NiB7CisgICAgMTogaTMyIHN0cnVjdDZfbWVtYmVyMSwKKyAgICAyOiByZXF1aXJlZCBpMzIgc3RydWN0Nl9tZW1iZXIyCit9CisKK3NlcnZpY2UgYmFzZSB7CisgICAgb25ld2F5IHZvaWQgYmFzZV9vbmV3YXkoCisgICAgICAgIDE6IGkzMiBhcmcxKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkxNiBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogaTMyIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiBpNjQgZnVuY3Rpb24xX2FyZzMsCisgICAgICAgIDQ6IGRvdWJsZSBmdW5jdGlvbjFfYXJnNCwKKyAgICAgICAgNTogc3RyaW5nIGZ1bmN0aW9uMV9hcmc1LAorICAgICAgICA2OiBib29sIGZ1bmN0aW9uMV9hcmc2LAorICAgICAgICA3OiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmc3LAorICAgICAgICA4OiB0ZXN0X3N0cnVjdDEgZnVuY3Rpb24xX2FyZzgpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpMTY+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGkzMj4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzUsCisgICAgICAgIDY6IGxpc3Q8Ym9vbD4gZnVuY3Rpb24yX2FyZzYsCisgICAgICAgIDc6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzcsCisgICAgICAgIDg6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzgsCisgICAgICAgIDk6IGxpc3Q8dGVzdF9zdHJ1Y3QxPiBmdW5jdGlvbjJfYXJnOSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjMoKSwKKworfQorCitzZXJ2aWNlIGRlcml2ZWQxIGV4dGVuZHMgYmFzZSB7CisgICAgCisgICAgdGVzdF9lbnVtMSBkZXJpdmVkMV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGk2NCBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogZG91YmxlIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgaTY0IGRlcml2ZWQxX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnNSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGRvdWJsZSBkZXJpdmVkMV9mdW5jdGlvbjMoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjNfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjNfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHN0cmluZyBkZXJpdmVkMV9mdW5jdGlvbjQoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjRfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjRfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworCisgICAgYm9vbCBkZXJpdmVkMV9mdW5jdGlvbjUoCisgICAgICAgIDE6IG1hcDxpNjQsIGRvdWJsZT4gZnVuY3Rpb241X2FyZzEsCisgICAgICAgIDI6IG1hcDxzdHJpbmcsIGJvb2w+IGZ1bmN0aW9uNV9hcmcyLAorICAgICAgICAzOiBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZnVuY3Rpb241X2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB0ZXN0X3N0cnVjdDEgZGVyaXZlZDFfZnVuY3Rpb242KAorICAgICAgICAxOiBkb3VibGUgZnVuY3Rpb242X2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCit9CisKK3NlcnZpY2UgZGVyaXZlZDIgZXh0ZW5kcyBiYXNlIHsKKworICAgIGxpc3Q8aTMyPiBkZXJpdmVkMl9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkzMiBmdW5jdGlvbjFfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKKyAgICBsaXN0PHRlc3RfZW51bTE+IGRlcml2ZWQyX2Z1bmN0aW9uMigKKyAgICAgICAgMTppNjQgZnVuY3Rpb24yX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBsaXN0PHRlc3Rfc3RydWN0MT4gZGVyaXZlZDJfZnVuY3Rpb24zKAorICAgICAgICAxOmRvdWJsZSBmdW5jdGlvbjNfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPGRvdWJsZSwgc3RyaW5nPiBkZXJpdmVkMl9mdW5jdGlvbjQoCisgICAgICAgIDE6c3RyaW5nIGZ1bmN0aW9uNF9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZGVyaXZlZDJfZnVuY3Rpb241KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb241X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X3N0cnVjdDEsIHRlc3Rfc3RydWN0Mj4gZGVyaXZlZDJfZnVuY3Rpb242KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb242X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKK30KZGlmZiAtLWdpdCBhL3Rlc3QvYXVkaXQvdGVzdC50aHJpZnQgYi90ZXN0L2F1ZGl0L3Rlc3QudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5ODM0YjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2F1ZGl0L3Rlc3QudGhyaWZ0CkBAIC0wLDAgKzEsMTg5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK25hbWVzcGFjZSBjcHAgdGVzdAorCisvL0NvbnN0YW50cworY29uc3QgaTMyIGNvbnN0MSA9IDEyMzsKK2NvbnN0IGRvdWJsZSBjb25zdDIgPSAyMy4zOworY29uc3QgbWFwPHN0cmluZyxzdHJpbmc+IGNvbnN0MyA9IHsiaGVsbG8iOiJ3b3JsZCIsICJ0aHJpZnQiOiJhdWRpdCJ9OworCisKKy8vRXhjZXB0aW9uCitleGNlcHRpb24gdGVzdF9leGNlcHRpb24xIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjIgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorCisvL0VudW1zCisKK2VudW0gdGVzdF9lbnVtMSB7CisgICAgZW51bTFfdmFsdWUwID0gMCwKKyAgICBlbnVtMV92YWx1ZTEgPSAxLAorICAgIGVudW0xX3ZhbHVlMiA9IDIsCisgICAgZW51bTFfdmFsdWU1ID0gNSwKKyAgICBlbnVtMV92YWx1ZTcgPSA3LAorICAgIGVudW0xX3ZhbHVlOCA9IDgKK30KKworZW51bSB0ZXN0X2VudW0yIHsKKyAgICBlbnVtMl92YWx1ZTAgPSAwLAorICAgIGVudW0yX3ZhbHVlMSA9IDEsCisgICAgZW51bTJfdmFsdWUyID0gMiwKKyAgICBlbnVtMl92YWx1ZTMgPSAzCit9CisKK2VudW0gdGVzdF9lbnVtMyB7CisgICAgZW51bTNfdmFsdWUxID0gMCwKKyAgICBlbnVtM192YWx1ZTIgPSAxCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDEgeworICAgIDE6IGkxNiBzdHJ1Y3QxX21lbWJlcjEsCisgICAgMjogaTMyIHN0cnVjdDFfbWVtYmVyMiwKKyAgICAzOiBpNjQgc3RydWN0MV9tZW1iZXIzLAorICAgIDQ6IGRvdWJsZSBzdHJ1Y3QxX21lbWJlcjQgPSAyLjUsCisgICAgNTogc3RyaW5nIHN0cnVjdDFfbWVtYmVyNSA9ICJBdWRpdCB0ZXN0IiwKKyAgICA2OiBib29sIHN0cnVjdDFfbWVtYmVyNiwKKyAgICA3OiBieXRlIHN0cnVjdDFfbWVtYmVyNywKKyAgICA4OiBiaW5hcnkgc3RydWN0MV9tZW1iZXI4LAorICAgIDk6IHRlc3RfZW51bTEgc3RydWN0MV9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDIgeworICAgIDE6IGxpc3Q8aTE2PiBzdHJ1Y3QyX21lbWJlcjEsCisgICAgMjogbGlzdDxpMzI+IHN0cnVjdDJfbWVtYmVyMiwKKyAgICAzOiBsaXN0PGk2ND4gc3RydWN0Ml9tZW1iZXIzID0gWzIzLCAzMiBdLAorICAgIDQ6IGxpc3Q8ZG91YmxlPiBzdHJ1Y3QyX21lbWJlcjQsCisgICAgNTogbGlzdDxzdHJpbmc+IHN0cnVjdDJfbWVtYmVyNSwKKyAgICA2OiBsaXN0PGJvb2w+IHN0cnVjdDJfbWVtYmVyNiwKKyAgICA3OiBsaXN0PGJ5dGU+IHN0cnVjdDJfbWVtYmVyNywKKyAgICA4OiBsaXN0PGJpbmFyeT4gc3RydWN0Ml9tZW1iZXI4LAorICAgIDk6IGxpc3Q8dGVzdF9lbnVtMT4gc3RydWN0Ml9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDMgeworICAgIDE6IG1hcDxpMTYsIGkzMj4gc3RydWN0M19tZW1iZXIxID0gezE6MiwgMzo0fSwKKyAgICAyOiBtYXA8aTY0LCBkb3VibGU+IHN0cnVjdDNfbWVtYmVyMiA9IHsxMDoxLjEsIDIwOjIuMX0sCisgICAgMzogbWFwPHN0cmluZywgYm9vbD4gc3RydWN0M19tZW1iZXIzLAorICAgIDQ6IG1hcDxieXRlLCB0ZXN0X2VudW0xPiBzdHJ1Y3QzX21lbWJlcjQsCisgICAgNTogbWFwPHRlc3RfZW51bTIsIHRlc3RfZW51bTMgPiBzdHJ1Y3QzX21lbWJlcjUsCisgICAgNzogbWFwPGRvdWJsZSwgc3RyaW5nPiBzdHJ1Y3QzX21lbWJlcjcKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NCB7CisgICAgMTogaTMyIHN0cnVjdDRfbWVtYmVyMSwKKyAgICAyOiBvcHRpb25hbCBpMzIgc3RydWN0NF9tZW1iZXIyCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDV7CisgICAgMTogZG91YmxlIHN0cnVjdDVfbWVtYmVyMSwKKyAgICAyOiBzdHJpbmcgc3RydWN0NV9tZW1iZXIyID0gIlRocmlmdCBBdWRpdCBUZXN0IgorfQorc3RydWN0IHRlc3Rfc3RydWN0NiB7CisgICAgMTogaTMyIHN0cnVjdDZfbWVtYmVyMSwKKyAgICAyOiByZXF1aXJlZCBpMzIgc3RydWN0Nl9tZW1iZXIyCit9CisKK3NlcnZpY2UgYmFzZSB7CisgICAgb25ld2F5IHZvaWQgYmFzZV9vbmV3YXkoCisgICAgICAgIDE6IGkzMiBhcmcxKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkxNiBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogaTMyIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiBpNjQgZnVuY3Rpb24xX2FyZzMsCisgICAgICAgIDQ6IGRvdWJsZSBmdW5jdGlvbjFfYXJnNCwKKyAgICAgICAgNTogc3RyaW5nIGZ1bmN0aW9uMV9hcmc1LAorICAgICAgICA2OiBib29sIGZ1bmN0aW9uMV9hcmc2LAorICAgICAgICA3OiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmc3LAorICAgICAgICA4OiB0ZXN0X3N0cnVjdDEgZnVuY3Rpb24xX2FyZzgpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpMTY+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGkzMj4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzUsCisgICAgICAgIDY6IGxpc3Q8Ym9vbD4gZnVuY3Rpb24yX2FyZzYsCisgICAgICAgIDc6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzcsCisgICAgICAgIDg6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzgsCisgICAgICAgIDk6IGxpc3Q8dGVzdF9zdHJ1Y3QxPiBmdW5jdGlvbjJfYXJnOSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjMoKSwKKworfQorCitzZXJ2aWNlIGRlcml2ZWQxIGV4dGVuZHMgYmFzZSB7CisgICAgCisgICAgdGVzdF9lbnVtMSBkZXJpdmVkMV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGk2NCBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogZG91YmxlIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgaTY0IGRlcml2ZWQxX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnNSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGRvdWJsZSBkZXJpdmVkMV9mdW5jdGlvbjMoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjNfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjNfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHN0cmluZyBkZXJpdmVkMV9mdW5jdGlvbjQoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjRfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjRfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworCisgICAgYm9vbCBkZXJpdmVkMV9mdW5jdGlvbjUoCisgICAgICAgIDE6IG1hcDxpNjQsIGRvdWJsZT4gZnVuY3Rpb241X2FyZzEsCisgICAgICAgIDI6IG1hcDxzdHJpbmcsIGJvb2w+IGZ1bmN0aW9uNV9hcmcyLAorICAgICAgICAzOiBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZnVuY3Rpb241X2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB0ZXN0X3N0cnVjdDEgZGVyaXZlZDFfZnVuY3Rpb242KAorICAgICAgICAxOiBkb3VibGUgZnVuY3Rpb242X2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCit9CisKK3NlcnZpY2UgZGVyaXZlZDIgZXh0ZW5kcyBiYXNlIHsKKworICAgIGxpc3Q8aTMyPiBkZXJpdmVkMl9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkzMiBmdW5jdGlvbjFfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKKyAgICBsaXN0PHRlc3RfZW51bTE+IGRlcml2ZWQyX2Z1bmN0aW9uMigKKyAgICAgICAgMTppNjQgZnVuY3Rpb24yX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBsaXN0PHRlc3Rfc3RydWN0MT4gZGVyaXZlZDJfZnVuY3Rpb24zKAorICAgICAgICAxOmRvdWJsZSBmdW5jdGlvbjNfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPGRvdWJsZSwgc3RyaW5nPiBkZXJpdmVkMl9mdW5jdGlvbjQoCisgICAgICAgIDE6c3RyaW5nIGZ1bmN0aW9uNF9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZGVyaXZlZDJfZnVuY3Rpb241KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb241X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X3N0cnVjdDEsIHRlc3Rfc3RydWN0Mj4gZGVyaXZlZDJfZnVuY3Rpb242KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb242X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKK30KZGlmZiAtLWdpdCBhL3Rlc3QvYXVkaXQvdGhyaWZ0X2F1ZGl0X3Rlc3QucGwgYi90ZXN0L2F1ZGl0L3RocmlmdF9hdWRpdF90ZXN0LnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5ZWQ0ZGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2F1ZGl0L3RocmlmdF9hdWRpdF90ZXN0LnBsCkBAIC0wLDAgKzEsMjYxIEBACisjIS91c3IvYmluL3BlcmwgLXcKKworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKworI2JyZWFrMSAtIFRocmlmdCBtZXRob2QgcmVtb3ZlZCBmcm9tIHNlcnZpY2UgYmFzZQorI2JyZWFrMiAtIFN0cnVjdCBmaWVsZCBjaGFuZ2VkIGluIHRlc3Rfc3RydWN0MShpMTYgdG8gaTMyKQorI2JyZWFrMyAtIFN0cnVjdCBmaWVsZCBjaGFuZ2VkIGluIHRlc3Rfc3RydWN0MShlbnVtMSB0byBlbnVtMikKKyNicmVhazQgLSBGaWVsZCB0eXBlIGNoYW5nZWQgaW4gdGVzdF9zdHJ1Y3QxKGJvb2wgdG8gc3RyaW5nKQorI2JyZWFrNS0gbWVtYmVyIGZpZWxkIHR5cGUgY2hhbmdlZCBpbiB0ZXN0X3N0cnVjdDEoYm9vbCB0byBsaXN0PGJvb2w+KQorI2JyZWFrNi0gIEZpZWxkIHR5cGUgY2hhbmdlZCBpbiB0ZXN0X3N0cnVjdDIgKGxpc3Q8ZG91YmxlPiB0byBsaXN0PGkxNj4pCisjYnJlYWs3IC0gcmVxdWlyZWRuZXNzIHJlbW92ZWQgaW4gc3RydWN0NgorI2JyZWFrOCAtIHJlcXVpcmVkbmVzcyBhZGRlZGQgaW4gc3RydWN0NQorI2JyZWFrOSAtIFN0cnVjdCBmaWVsZCByZW1vdmVkIGZyb20gc3RydWN0MQorI2JyZWFrMTAgLSBTdHJ1Y3QgZmllbGQgcmVtb3ZlZCBmcm9tIHN0cnVjdDIgaWQgPSAxCisjYnJlYWsxMSAtIFN0cnVjdCBmaWVsZCByZW1vdmVkIGZyb20gc3RydWN0MyBsYXN0IGlkCisjYnJlYWsxMiAtICBkZXJpdmVkMV9mdW5jdGlvbjEgcmV0dXJuIHR5cGUgY2hhbmdlZCBmcm9tIGVudW0xIHRvIGVudW0yCisjYnJlYWsxMyAtIGRlcml2ZWQxX2Z1bmN0aW9uNiByZXR1cm4gdHlwZSBjaGFuZ2VkIGZyb20gc3RydWN0MSB0byBzdHJ1Y3QyCisjYnJlYWsxNCAtICBkZXJpdmVkMV9mdW5jdGlvbjQgcmV0dXJuIHR5cGUgY2hhbmdlZCBmcm9tIHN0cmluZyB0byBkb3VibGUgCisjYnJlYWsxNSAtIGRlcml2ZWQyX2Z1bmN0aW9uMSByZXR1cm4gdHlwZSBjaGFuZ2VkIGZyb20gbGlzdDxpMzI+IHRvIGxpc3Q8aTE2PgorI2JyZWFrMTYgLSBkZXJpdmVkMl9mdW5jdGlvbjUgcmV0dXJuIHR5cGUgY2hhbmdlZCBmcm9tIG1hcDx0ZXN0X2VudW0xLHRlc3RfZW51bTI+IHRvIG1hcDx0ZXN0X2VudW0zLCB0ZXN0X2VudW0yPgorI2JyZWFrMTcgLSBkZXJpdmVkMl9mdW5jdGlvbjYgcmV0dXJuIHR5cGUgY2hhbmdlZCBmcm9tIG1hcDxzdHJ1Y3QxLHN0cnVjdDI+IHRvIG1hcDxzdHJ1Y3QxLCBzdHJ1Y3QzPgorI2JyZWFrMTgtIG9uZXdheSByZW1vdmVkIGZyb20gYmFzZV9vbmV3YXkKKyNicmVhazE5IC0gb25ld2F5IGFkZGVkIHRvIGJhc2VfZnVuY3Rpb24xCisjYnJlYWsyMCAtIGZpcnN0IGVudW0gdmFsdWUgcmVtb3ZlZCBmcm9tIGVudW0xCisjYnJlYWsyMS0gbGFzdCBlbnVtIHZhbHVlIHJlbW92ZWQgZnJvbSBlbnVtMgorI2JyZWFrMjIgLSBpbi1iZXR3ZWVuIGVudW0gdmFsdWUgcmVtb3ZlZCBmcm9tIGVudW0xCisjYnJlYWsyMyAtIHJlcXVpcmVkIHN0cnVjdCBmaWVsZCBhZGRlZCB0byBzdHJ1Y3Q0CisjYnJlYWsyNCAtIHJlbW92ZWQgaW5oZXJpdGFuY2Ugb2YgZGVyaXZlZDEuCisjYnJlYWsyNSAtIGNoYW5nZWQgaW5oZXJpdGFuY2Ugb2YgZGVyaXZlZDIuCisjYnJlYWsyNiAtIEZpZWxkIHR5cGUgY2hhbmdlZCBpbiBiYXNlX2Z1bmN0aW9uMSBhcmd1bWVudCBpZD0zCisjYnJlYWsyNyAtIGFyZ3VtZW50IGNoYW5nZWQgYmFzZV9mdW5jdGlvbjIgbGlzdDxlbnVtMT4gdG8gbGlzdDxlbnVtMz4gaWQgPTgKKyNicmVhazI4LSBkZXJpdmVkMV9mdW5jdGlvbjUgYXJndWVtZW50IHR5cGUgY2hhbmdlZCBtYXA8aTY0LCBkb3VibGU+IHRvIGxpc3Q8aTY0PgorI2JyZWFrMjkgLSBiYXNlX2Z1bmN0aW9uMiBhcmd1ZW1udCB0eXBlIGNoYW5nZWQgbGlzdDxzdHJpbmc+IHRvIHN0cmluZworI2JyZWFrMzAtIGRlcml2ZWQxX2Z1bmN0aW9uNiBhcmd1bWVudCBjaGFuZ2VkIHN0cnVjdDEgdG8gbWFwPHN0cnVjdDEsc3RydWN0MT4KKyNicmVhazMxIC0gRXhjZXB0aW9uIHJlbW92ZWQgdG8gYmFzZV9mdW5jdGlvbjIKKyNicmVhazMyLSBFeGNlcHRpb24xIGZpZWxkIHR5cGUgY2hhbmdlZCBmb3IgaWQgPTEKKyNicmVhazMzIC0gZGVyaXZlZDFfZnVuY3Rpb24xIGV4Y2VwdGlvbiB0eXBlIGNoYW5nZWQuCisjYnJlYWszNCAtIEZpZWxkIGFkZGVkIHRvIHN0cnVjdCB3aXRoIEZpZWxkIElEIGJlaW5nIGluIGJldHdlZW4gdHdvIGV4aXN0aW5nIGZpZWxkIElEcworCisjd2FybmluZy50aHJpZnQKKyNDaGFuZ2luZyBkZWZhdWx0cworI0lkPTEgc3RydWN0NQorI2lkPTIgc3RydWN0NSAKKyNpZD00IHN0cnVjdDIobGlzdDxkb3VibGU+KQorI2lkPTMgc3RydWN0MihsaXN0PGk2ND4gIGRlZmF1bHQgdmFsdWVzIHJlbW92ZWQpCisjaWQgNCBzdHJ1Y3QxIGNoYW5nZSBpbiBkb3VibGUgdmFsdWUKKyNpZCA1IHN0cnVjdDEgKGRlZmF1bHQgc3RyaW5nIHZhbHVlIHJlbW92ZWQpCisjaWQ9MSBzdHJ1Y3QzIChjaGFuZ2UgaW4gbWFwIHZhbHVlcykKKyNpZDIgc3RydWN0MyAoY2hhbmdlIGluIG1hcCBrZXlzKQorCisjY2hhbmdlIGluIGluaGVyaXRhbmNlIGZvciBkZXJpdmVkMSBhbmQgZGVyaXZlZDIKKworI2NoYW5nZSBpbiBzdHJ1Y3QgZmllbGQgbmFtZXMKKyNpZDkgc3RydWN0MQorI2lkMiBzdHJ1Y3QyCisKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7Cit1c2UgR2V0b3B0OjpTdGQ7CisKKyMgZ2xvYmFscworbXkgJGdBcmd1bWVudHMgPSAiIjsgICAgICAgICAgICAgICAgIyBhcmd1bWVudHMgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byBBdWRpdFRvb2wKK215ICRnQXVkaXRUb29sUGF0aCA9ICIiOworbXkgJGdQcmV2aW91c1RocmlmdFBhdGg7ICAgICAgICAgICAgIyBwcmV2aW91cyB0aHJpZnQgcGF0aAorbXkgJGdDdXJyZW50VGhyaWZ0UGF0aDsgICAgICAgICAgICAgIyBjdXJyZW50IHRocmlmdCBwYXRoCitteSAkZ1RocmlmdEZpbGVGb2xkZXI7CitteSAkZ0JyZWFraW5nRmlsZXNDb3VudCA9MzQ7IAorCitteSAkZ1ZlcmJvc2UgPSAwOworI2Z1bmN0aW9ucworc3ViIGF1ZGl0QnJlYWtpbmdDaGFuZ2VzOworc3ViIGF1ZGl0Tm9uQnJlYWtpbmdDaGFuZ2VzOworCittYWluKCk7CisKK3N1YiBtYWluCit7CisgICAgcGFyc2VPcHRpb25zKCk7CisgICAgYXVkaXRCcmVha2luZ0NoYW5nZXMoKTsKKyAgICBhdWRpdE5vbkJyZWFraW5nQ2hhbmdlcygpOworfQorCitzdWIgcGFyc2VPcHRpb25zCit7CisgICAgbXkgJW9wdGlvbnMgPSAoKTsKKyAgICBpZiAoIGdldG9wdHMgKCd2ZjpvOnQ6JyxcJW9wdGlvbnMpICkKKyAgICB7CisgICAgICAgICMgY3VycmVudCAobmV3KSB0aHJpZnQgZm9sZGVyCisgICAgICAgIGlmICgkb3B0aW9uc3snZid9KQorICAgICAgICB7CisgICAgICAgICAgICAkZ1RocmlmdEZpbGVGb2xkZXIgPSAkb3B0aW9uc3snZid9OworICAgICAgICAgICAgJGdQcmV2aW91c1RocmlmdFBhdGggPSAkZ1RocmlmdEZpbGVGb2xkZXIuIi90ZXN0LnRocmlmdCI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBkaWUgIk1pc3NpbmcgRm9sZGVyIGNvbnRhaW5pbmcgdGhyaWZ0IGZpbGVzXG4iOworICAgICAgICB9CisKKyAgICAgICAgaWYoJG9wdGlvbnN7J3QnfSkKKyAgICAgICAgeworICAgICAgICAgICAgJGdBdWRpdFRvb2xQYXRoID0gJG9wdGlvbnN7J3QnfTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGRpZSAiQXVkaXQgVG9vbCBQYXRoIHJlcXVpcmVkIFxuIjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgkb3B0aW9uc3sndid9KQorICAgICAgICB7CisgICAgICAgICAgICAkZ1ZlcmJvc2UgPSAxOworICAgICAgICB9CisKKyAgICB9Cit9CisKK3N1YiBhdWRpdEJyZWFraW5nQ2hhbmdlcworeworICAgIG15ICRicmVha2luZ0ZpbGVCYXNlTmFtZSA9ICRnVGhyaWZ0RmlsZUZvbGRlci4iL2JyZWFrIjsKKyAgICBteSAkbmV3VGhyaWZ0RmlsZTsKKyAgICBmb3IobXkgJGk9MTsgJGkgPD0gJGdCcmVha2luZ0ZpbGVzQ291bnQ7ICRpKyspCisgICAgeworICAgICAgICAkbmV3VGhyaWZ0RmlsZSA9ICRicmVha2luZ0ZpbGVCYXNlTmFtZS4iJGkudGhyaWZ0IjsKKyAgICAgICAgbXkgJGFyZ3VtZW50cyA9ICAkZ1ByZXZpb3VzVGhyaWZ0UGF0aC4iICIuJG5ld1RocmlmdEZpbGU7CisgICAgICAgIG15ICgkZXhpdENvZGUsICRvdXRwdXQpID0gY2FsbFRocmlmdEF1ZGl0VG9vbCgkYXJndW1lbnRzKTsKKyAgICAgICAgcHJpbnQgJG91dHB1dCBpZiAkZ1ZlcmJvc2UgZXEgMTsKKworICAgICAgICBpZigkZXhpdENvZGUgPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgIyB0aHJpZnRfYXVkaXQgcmV0dXJucyAxIHdoZW4gaXQgaXMgbm90IGFibGUgdG8gZmluZCBmaWxlcyBvciBvdGhlciBub24tYXVkaXQgZmFpbHVyZXMKKyAgICAgICAgICAgIHByaW50ICJleGl0aW5nIHdpdGggZXhpdCBjb2RlID0xIGkgPSAiLiRpLiJcbiI7CisgICAgICAgICAgICBwcmludCAkb3V0cHV0OworICAgICAgICAgICAgZXhpdCAkZXhpdENvZGU7CisgICAgICAgIH0KKyAgICAgICAgaWYoJGV4aXRDb2RlICE9IDIpCisgICAgICAgIHsKKyAgICAgICAgICAgICMgdGhyaWZ0LWF1ZGl0IHJldHVybiAyIGZvciBhdWRpdCBmYWlsdXJlcy4gU28gZm9yIEJyZWFraW5nIGNoYW5nZXMgd2Ugc2hvdWxkIGdldCAyIGFzIHJldHVybiB2YWx1ZS4KKyAgICAgICAgICAgIHByaW50ICRvdXRwdXQ7CisgICAgICAgICAgICBkaWUgIlxuVEVTVCBGQUlMVVJFOiBCcmVha2luZyBDaGFuZ2Ugbm90IGRldGVjdGVkIGZvciB0aHJpZnQgZmlsZSAkbmV3VGhyaWZ0RmlsZSwgY29kZT0kZXhpdENvZGUgXG4iOworICAgICAgICB9CisgICAgICAgIGlmKGluZGV4KCRvdXRwdXQsZ2V0TWVzc2FnZVN1YlN0cmluZygiYnJlYWskaSIpKSA9PSAtMSkKKyAgICAgICAgeworICAgICAgICAgICAgI0F1ZGl0IHRvb2wgZGV0ZWN0ZWQgZmFpbHVyZSwgYnV0IG5vdCB0aGUgZXhwZWN0ZWQgb25lLiBUaGUgY2hhbmdlIGluIGJyZWFraW5nIHRocmlmdCBmaWxlIGRvZXMgbm90IG1hdGNoIGdldE1lc3NhZ2VTdWJTdHJpbmcoKQorICAgICAgICAgICAgcHJpbnQgJG91dHB1dDsKKyAgICAgICAgICAgIGRpZSAiXG5UZXN0IEZBSUxVUkU6IEF1ZGl0IHRvb2wgZGV0ZWN0ZWQgZmFpbHVyZSwgYnV0IG5vdCB0aGUgZXhwZWN0ZWQgb25lIVxuIjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgICNUaHJpZnQgYXVkaXQgdG9vbCBoYXMgZGV0ZWN0ZWQgYXVkaXQgZmFpbHVyZSBhbmQgaGFzIHJldHVybmVkIGV4aXRlZCB0byBzdGF0dXMgY29kZSAyCisgICAgICAgICAgICBwcmludCAiVGVzdCBQYXNzOiBBdWRpdCBGYWlsdXJlIGRldGVjdGVkIGZvciB0aHJpZnQgZmlsZSBicmVhayRpLnRocmlmdCBcbiI7CisgICAgICAgIH0KKyAgICB9CisKK30KKworc3ViIGF1ZGl0Tm9uQnJlYWtpbmdDaGFuZ2VzCit7CisgICAgbXkgJGJyZWFraW5nRmlsZUJhc2VOYW1lID0gJGdUaHJpZnRGaWxlRm9sZGVyLiIvd2FybmluZyI7CisgICAgbXkgJG5ld1RocmlmdEZpbGU7CisgICAgJG5ld1RocmlmdEZpbGUgPSAkYnJlYWtpbmdGaWxlQmFzZU5hbWUuIi50aHJpZnQiOworICAgIG15ICRhcmd1bWVudHMgPSAgJGdQcmV2aW91c1RocmlmdFBhdGguIiAiLiRuZXdUaHJpZnRGaWxlOworICAgIG15ICgkZXhpdENvZGUsICRvdXRwdXQpID0gY2FsbFRocmlmdEF1ZGl0VG9vbCgkYXJndW1lbnRzKTsKKyAgICBwcmludCAkb3V0cHV0IGlmICRnVmVyYm9zZSBlcSAxOworCisgICAgaWYoJGV4aXRDb2RlID09IDEpCisgICAgeworICAgICAgICAjIHRocmlmdF9hdWRpdCByZXR1cm5zIDEgd2hlbiBpdCBpcyBub3QgYWJsZSB0byBmaW5kIGZpbGVzIG9yIG90aGVyIG5vbi1hdWRpdCBmYWlsdXJlcworICAgICAgICBwcmludCAiZXhpdGluZyB3aXRoIGV4aXQgY29kZSA9IDEgIGZvciBmaWxlIHdhcm5pbmcudGhyaWZ0XG4iOworICAgICAgICBleGl0ICRleGl0Q29kZTsKKyAgICB9CisgICAgZWxzaWYoJGV4aXRDb2RlICE9IDApCisgICAgeworICAgICAgICAjIHRocmlmdC1hdWRpdCByZXR1cm4gMCBpZiB0aGVyZSBhcmUgbm8gYXVkaXQgZmFpbHVyZXMuCisgICAgICAgIGRpZSAiXG5URVNUIEZBSUxVUkU6IE5vbiBCcmVha2luZyBjaGFuZ2VzIHJldHVybmVkIGZhaWx1cmUgZm9yIHRocmlmdCBmaWxlICRuZXdUaHJpZnRGaWxlIFxuIjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgI1RocmlmdCBhdWRpdCB0b29sIGhhcyBleGl0ZWQgd2l0aCBzdGF0dXMgMC4gCisgICAgICAgIHByaW50ICJUZXN0IFBhc3M6IEF1ZGl0IHRvb2wgZXhpdHMgd2l0aCBzdWNjZXNzIGZvciB3YXJuaW5ncyBcbiI7CisgICAgfQorCisKK30KKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjYWxsIHRocmlmdEF1ZGl0VG9vbCBzY3JpcHQKK3N1YiBjYWxsVGhyaWZ0QXVkaXRUb29sICggJCApCit7CisgICAgbXkgJGFyZ3MgPSBzaGlmdDsKKworICAgIG15ICRjb21tYW5kID0gIiRnQXVkaXRUb29sUGF0aCAtLWF1ZGl0ICRhcmdzIjsKKyAgICBteSAkb3V0cHV0ID0gYCRjb21tYW5kIDI+JjFgOworICAgIG15ICRleGl0Q29kZSA9ICQ/ID4+IDg7CisKKyAgICByZXR1cm4gKCRleGl0Q29kZSwkb3V0cHV0KTsKK30KKworc3ViIGdldE1lc3NhZ2VTdWJTdHJpbmcoICQgKQoreworICAgIG15ICRmaWxlTmFtZSA9IHNoaWZ0OworICAgIG15ICVsb29rdXBUYWJsZSA9ICgKKyAgICAgICAgImJyZWFrMSIgID0+ICJiYXNlX2Z1bmN0aW9uMyIsCisgICAgICAgICJicmVhazIiICA9PiAidGVzdF9zdHJ1Y3QxIiwKKyAgICAgICAgImJyZWFrMyIgID0+ICJ0ZXN0X3N0cnVjdDEiLAorICAgICAgICAiYnJlYWs0IiAgPT4gInRlc3Rfc3RydWN0MSIsCisgICAgICAgICJicmVhazUiICA9PiAidGVzdF9zdHJ1Y3QxIiwKKyAgICAgICAgImJyZWFrNiIgID0+ICJ0ZXN0X3N0cnVjdDIiLAorICAgICAgICAiYnJlYWs3IiAgPT4gInRlc3Rfc3RydWN0NiIsCisgICAgICAgICJicmVhazgiICA9PiAidGVzdF9zdHJ1Y3Q1IiwKKyAgICAgICAgImJyZWFrOSIgID0+ICJ0ZXN0X3N0cnVjdDEiLAorICAgICAgICAiYnJlYWsxMCIgPT4gInRlc3Rfc3RydWN0MiIsCisgICAgICAgICJicmVhazExIiA9PiAidGVzdF9zdHJ1Y3QzIiwKKyAgICAgICAgImJyZWFrMTIiID0+ICJkZXJpdmVkMV9mdW5jdGlvbjEiLAorICAgICAgICAiYnJlYWsxMyIgPT4gImRlcml2ZWQxX2Z1bmN0aW9uNiIsCisgICAgICAgICJicmVhazE0IiA9PiAiZGVyaXZlZDFfZnVuY3Rpb240IiwKKyAgICAgICAgImJyZWFrMTUiID0+ICJkZXJpdmVkMl9mdW5jdGlvbjEiLAorICAgICAgICAiYnJlYWsxNiIgPT4gImRlcml2ZWQyX2Z1bmN0aW9uNSIsCisgICAgICAgICJicmVhazE3IiA9PiAiZGVyaXZlZDJfZnVuY3Rpb242IiwKKyAgICAgICAgImJyZWFrMTgiID0+ICJiYXNlX29uZXdheSIsCisgICAgICAgICJicmVhazE5IiA9PiAiYmFzZV9mdW5jdGlvbjEiLAorICAgICAgICAiYnJlYWsyMCIgPT4gInRlc3RfZW51bTEiLAorICAgICAgICAiYnJlYWsyMSIgPT4gInRlc3RfZW51bTIiLAorICAgICAgICAiYnJlYWsyMiIgPT4gInRlc3RfZW51bTEiLAorICAgICAgICAiYnJlYWsyMyIgPT4gInRlc3Rfc3RydWN0NCIsCisgICAgICAgICJicmVhazI0IiA9PiAiZGVyaXZlZDEiLAorICAgICAgICAiYnJlYWsyNSIgPT4gImRlcml2ZWQyIiwKKyAgICAgICAgImJyZWFrMjYiID0+ICJiYXNlX2Z1bmN0aW9uMSIsCisgICAgICAgICJicmVhazI3IiA9PiAiYmFzZV9mdW5jdGlvbjJfYXJncyIsCisgICAgICAgICJicmVhazI4IiA9PiAiZGVyaXZlZDFfZnVuY3Rpb241X2FyZ3MiLAorICAgICAgICAiYnJlYWsyOSIgPT4gImJhc2VfZnVuY3Rpb24yX2FyZ3MiLAorICAgICAgICAiYnJlYWszMCIgPT4gImRlcml2ZWQxX2Z1bmN0aW9uNiIsCisgICAgICAgICJicmVhazMxIiA9PiAiYmFzZV9mdW5jdGlvbjJfZXhjZXB0aW9uIiwKKyAgICAgICAgImJyZWFrMzIiID0+ICJ0ZXN0X2V4Y2VwdGlvbjEiLAorICAgICAgICAiYnJlYWszMyIgPT4gImRlcml2ZWQxX2Z1bmN0aW9uMV9leGNlcHRpb24iLAorICAgICAgICAiYnJlYWszNCIgPT4gInRlc3Rfc3RydWN0MyIsCisgICAgKTsKKyAgICBpZiAobm90IGV4aXN0cyAkbG9va3VwVGFibGV7ICRmaWxlTmFtZSB9KQorICAgIHsKKyAgICAgICAgcHJpbnQgImluIHRoZSBudWxsIGNhc2VcbiI7CisgICAgICAgIHJldHVybiAiTlVMTCI7CisgICAgfQorICAgIAorICAgIG15ICRyZXR2YWwgPSAkbG9va3VwVGFibGV7ICRmaWxlTmFtZSB9OworICAgIHByaW50ICIkZmlsZU5hbWUgPT4gJHJldHZhbFxuIjsKKyAgICByZXR1cm4gJGxvb2t1cFRhYmxleyAkZmlsZU5hbWUgfTsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvYXVkaXQvd2FybmluZy50aHJpZnQgYi90ZXN0L2F1ZGl0L3dhcm5pbmcudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzOTJkNWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2F1ZGl0L3dhcm5pbmcudGhyaWZ0CkBAIC0wLDAgKzEsMTkwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworbmFtZXNwYWNlIGNwcCB0ZXN0CisKKy8vQ29uc3RhbnRzCisKK2NvbnN0IGkzMiBjb25zdDEgPSAxMjM7Citjb25zdCBkb3VibGUgY29uc3QyID0gMjMuMjsKK2NvbnN0IG1hcDxzdHJpbmcsc3RyaW5nPiBjb25zdDMgPSB7ImhlbGxvIjoiY2xhc3MiLCAidGhyaWZ0IjoiYXVkaXQifTsKKworLy9FeGNlcHRpb24KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjEgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMiB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CisKKy8vRW51bXMKKworZW51bSB0ZXN0X2VudW0xIHsKKyAgICBlbnVtMV92YWx1ZTAgPSAwLAorICAgIGVudW0xX3ZhbHVlMSA9IDEsCisgICAgZW51bTFfdmFsdWUyID0gMiwKKyAgICBlbnVtMV92YWx1ZTUgPSA1LAorICAgIGVudW0xX3ZhbHVlNyA9IDcsCisgICAgZW51bTFfdmFsdWU4ID0gOAorfQorCitlbnVtIHRlc3RfZW51bTIgeworICAgIGVudW0yX3ZhbHVlMCA9IDAsCisgICAgZW51bTJfdmFsdWUxID0gMSwKKyAgICBlbnVtMl92YWx1ZTIgPSAyLAorICAgIGVudW0yX3ZhbHVlMyA9IDMKK30KKworZW51bSB0ZXN0X2VudW0zIHsKKyAgICBlbnVtM192YWx1ZTEgPSAwLAorICAgIGVudW0zX3ZhbHVlMiA9IDEKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MSB7CisgICAgMTogaTE2IHN0cnVjdDFfbWVtYmVyMSwKKyAgICAyOiBpMzIgc3RydWN0MV9tZW1iZXIyLAorICAgIDM6IGk2NCBzdHJ1Y3QxX21lbWJlcjMsCisgICAgNDogZG91YmxlIHN0cnVjdDFfbWVtYmVyNCA9IDIuNCwKKyAgICA1OiBzdHJpbmcgc3RydWN0MV9tZW1iZXI1LAorICAgIDY6IGJvb2wgc3RydWN0MV9tZW1iZXI2LAorICAgIDc6IGJ5dGUgc3RydWN0MV9tZW1iZXI3LAorICAgIDg6IGJpbmFyeSBzdHJ1Y3QxX21lbWJlcjgsCisgICAgOTogdGVzdF9lbnVtMSBjaGFuZ2VkMTkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MiB7CisgICAgMTogbGlzdDxpMTY+IHN0cnVjdDJfbWVtYmVyMSwKKyAgICAyOiBsaXN0PGkzMj4gY2hhbmdlZDIyLAorICAgIDM6IGxpc3Q8aTY0PiBzdHJ1Y3QyX21lbWJlcjMsCisgICAgNDogbGlzdDxkb3VibGU+IHN0cnVjdDJfbWVtYmVyNCA9WzEuMCwgMi4xXSwKKyAgICA1OiBsaXN0PHN0cmluZz4gc3RydWN0Ml9tZW1iZXI1LAorICAgIDY6IGxpc3Q8Ym9vbD4gc3RydWN0Ml9tZW1iZXI2LAorICAgIDc6IGxpc3Q8Ynl0ZT4gc3RydWN0Ml9tZW1iZXI3LAorICAgIDg6IGxpc3Q8YmluYXJ5PiBzdHJ1Y3QyX21lbWJlcjgsCisgICAgOTogbGlzdDx0ZXN0X2VudW0xPiBzdHJ1Y3QyX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MyB7CisgICAgMTogbWFwPGkxNiwgaTMyPiBzdHJ1Y3QzX21lbWJlcjEgPSB7MToxMCwgMjoyMH0sCisgICAgMjogbWFwPGk2NCwgZG91YmxlPiBzdHJ1Y3QzX21lbWJlcjIgPSB7MToxLjEsIDI6Mi4xfSwKKyAgICAzOiBtYXA8c3RyaW5nLCBib29sPiBzdHJ1Y3QzX21lbWJlcjMsCisgICAgNDogbWFwPGJ5dGUsIHRlc3RfZW51bTE+IHN0cnVjdDNfbWVtYmVyNCwKKyAgICA1OiBtYXA8dGVzdF9lbnVtMiwgdGVzdF9lbnVtMyA+IHN0cnVjdDNfbWVtYmVyNSwKKyAgICA3OiBtYXA8ZG91YmxlLCBzdHJpbmc+IHN0cnVjdDNfbWVtYmVyNworfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q0IHsKKyAgICAxOiBpMzIgc3RydWN0NF9tZW1iZXIxLAorICAgIDI6IG9wdGlvbmFsIGkzMiBzdHJ1Y3Q0X21lbWJlcjIKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NXsKKyAgICAxOiBkb3VibGUgc3RydWN0NV9tZW1iZXIxID0gMS4xLAorICAgIDI6IHN0cmluZyBzdHJ1Y3Q1X21lbWJlcjIgPSAiVGhyaWZ0IEF1ZGl0IFRlc3MiCit9CitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q2IHsKKyAgICAxOiBpMzIgc3RydWN0Nl9tZW1iZXIxLAorICAgIDI6IHJlcXVpcmVkIGkzMiBzdHJ1Y3Q2X21lbWJlcjIKK30KKworc2VydmljZSBiYXNlIHsKKyAgICBvbmV3YXkgdm9pZCBiYXNlX29uZXdheSgKKyAgICAgICAgMTogaTMyIGFyZzEpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTE2IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBpMzIgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IGk2NCBmdW5jdGlvbjFfYXJnMywKKyAgICAgICAgNDogZG91YmxlIGZ1bmN0aW9uMV9hcmc0LAorICAgICAgICA1OiBzdHJpbmcgZnVuY3Rpb24xX2FyZzUsCisgICAgICAgIDY6IGJvb2wgZnVuY3Rpb24xX2FyZzYsCisgICAgICAgIDc6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzcsCisgICAgICAgIDg6IHRlc3Rfc3RydWN0MSBmdW5jdGlvbjFfYXJnOCksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGkxNj4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8aTMyPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnNSwKKyAgICAgICAgNjogbGlzdDxib29sPiBmdW5jdGlvbjJfYXJnNiwKKyAgICAgICAgNzogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNywKKyAgICAgICAgODogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnOCwKKyAgICAgICAgOTogbGlzdDx0ZXN0X3N0cnVjdDE+IGZ1bmN0aW9uMl9hcmc5KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMygpLAorCit9CisKK3NlcnZpY2UgZGVyaXZlZDEgZXh0ZW5kcyBiYXNleworICAgIAorICAgIHRlc3RfZW51bTEgZGVyaXZlZDFfZnVuY3Rpb24xKAorICAgICAgICAxOiBpNjQgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGRvdWJsZSBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGk2NCBkZXJpdmVkMV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzUpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBkb3VibGUgZGVyaXZlZDFfZnVuY3Rpb24zKAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb24zX2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb24zX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBzdHJpbmcgZGVyaXZlZDFfZnVuY3Rpb240KAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb240X2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb240X2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKworICAgIGJvb2wgZGVyaXZlZDFfZnVuY3Rpb241KAorICAgICAgICAxOiBtYXA8aTY0LCBkb3VibGU+IGZ1bmN0aW9uNV9hcmcxLAorICAgICAgICAyOiBtYXA8c3RyaW5nLCBib29sPiBmdW5jdGlvbjVfYXJnMiwKKyAgICAgICAgMzogbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGZ1bmN0aW9uNV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdGVzdF9zdHJ1Y3QxIGRlcml2ZWQxX2Z1bmN0aW9uNigKKyAgICAgICAgMTogZG91YmxlIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorfQorCitzZXJ2aWNlIGRlcml2ZWQyIGV4dGVuZHMgYmFzZSB7CisKKyAgICBsaXN0PGkzMj4gZGVyaXZlZDJfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMzIgZnVuY3Rpb24xX2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCisgICAgbGlzdDx0ZXN0X2VudW0xPiBkZXJpdmVkMl9mdW5jdGlvbjIoCisgICAgICAgIDE6aTY0IGZ1bmN0aW9uMl9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbGlzdDx0ZXN0X3N0cnVjdDE+IGRlcml2ZWQyX2Z1bmN0aW9uMygKKyAgICAgICAgMTpkb3VibGUgZnVuY3Rpb24zX2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDxkb3VibGUsIHN0cmluZz4gZGVyaXZlZDJfZnVuY3Rpb240KAorICAgICAgICAxOnN0cmluZyBmdW5jdGlvbjRfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGRlcml2ZWQyX2Z1bmN0aW9uNSgKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNV9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9zdHJ1Y3QxLCB0ZXN0X3N0cnVjdDI+IGRlcml2ZWQyX2Z1bmN0aW9uNigKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCit9CmRpZmYgLS1naXQgYS90ZXN0L2NfZ2xpYi9NYWtlZmlsZS5hbSBiL3Rlc3QvY19nbGliL01ha2VmaWxlLmFtCmluZGV4IDI1MmVkYjkuLjRhMDNkMjkgMTAwNzU1Ci0tLSBhL3Rlc3QvY19nbGliL01ha2VmaWxlLmFtCisrKyBiL3Rlc3QvY19nbGliL01ha2VmaWxlLmFtCkBAIC0yOSw2ICsyOSw4IEBACiAKIGxpYnRlc3RjZ2xpYl9sYV9MSUJBREQgPSAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9saWJ0aHJpZnRfY19nbGliLmxhCiAKK3ByZWNyb3NzOiBsaWJ0ZXN0Y2dsaWIubGEgdGVzdF9jbGllbnQgdGVzdF9zZXJ2ZXIKKwogY2hlY2tfUFJPR1JBTVMgPSBcCiAJdGVzdF9jbGllbnQgXAogCXRlc3Rfc2VydmVyCkBAIC00Myw2ICs0NSw4IEBACiB0ZXN0X3NlcnZlcl9TT1VSQ0VTID0gXAogCXNyYy90aHJpZnRfdGVzdF9oYW5kbGVyLmMgXAogCXNyYy90aHJpZnRfdGVzdF9oYW5kbGVyLmggXAorCXNyYy90aHJpZnRfc2Vjb25kX3NlcnZpY2VfaGFuZGxlci5jIFwKKwlzcmMvdGhyaWZ0X3NlY29uZF9zZXJ2aWNlX2hhbmRsZXIuaCBcCiAJc3JjL3Rlc3Rfc2VydmVyLmMKIAogdGVzdF9zZXJ2ZXJfTERBREQgPSBcCkBAIC01Miw5ICs1Niw3IEBACiAjCiAjIENvbW1vbiB0aHJpZnQgY29kZSBnZW5lcmF0aW9uIHJ1bGVzCiAjCi1USFJJRlQgPSAkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL3RocmlmdAotCi1nZW4tY19nbGliL3RfdGVzdF9zZWNvbmRfc2VydmljZS5jICBnZW4tY19nbGliL3RfdGVzdF9zZWNvbmRfc2VydmljZS5oICBnZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdC5jICBnZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdC5oICBnZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdF90eXBlcy5jICBnZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdF90eXBlcy5oOiAkKHRvcF9zcmNkaXIpL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKK2dlbi1jX2dsaWIvdF90ZXN0X3NlY29uZF9zZXJ2aWNlLmMgIGdlbi1jX2dsaWIvdF90ZXN0X3NlY29uZF9zZXJ2aWNlLmggIGdlbi1jX2dsaWIvdF90ZXN0X3RocmlmdF90ZXN0LmMgIGdlbi1jX2dsaWIvdF90ZXN0X3RocmlmdF90ZXN0LmggIGdlbi1jX2dsaWIvdF90ZXN0X3RocmlmdF90ZXN0X3R5cGVzLmMgIGdlbi1jX2dsaWIvdF90ZXN0X3RocmlmdF90ZXN0X3R5cGVzLmg6ICQodG9wX3NyY2RpcikvdGVzdC9UaHJpZnRUZXN0LnRocmlmdCAkKFRIUklGVCkKIAkkKFRIUklGVCkgLS1nZW4gY19nbGliIC1yICQ8CiAKIEFNX0NGTEFHUyA9IC1nIC1XYWxsIC1XZXh0cmEgJChHTElCX0NGTEFHUykgJChHT0JKRUNUX0NGTEFHUykKQEAgLTYzLDcgKzY1LDcgQEAKIEFNX0xERkxBR1MgPSAkKEdMSUJfTElCUykgJChHT0JKRUNUX0xJQlMpIEBHQ09WX0xERkxBR1NACiAKIGNsZWFuLWxvY2FsOgotCSQoUk0pIC1yIGdlbi1jX2dsaWIKKwkkKFJNKSBnZW4tY19nbGliLyoKIAogRVhUUkFfRElTVCA9IFwKIAlzcmMvdGVzdF9jbGllbnQuYyBcCmRpZmYgLS1naXQgYS90ZXN0L2NfZ2xpYi9zcmMvdGVzdF9jbGllbnQuYyBiL3Rlc3QvY19nbGliL3NyYy90ZXN0X2NsaWVudC5jCmluZGV4IDU5ZjQxNTcuLmVmMjRhYjcgMTAwNjQ0Ci0tLSBhL3Rlc3QvY19nbGliL3NyYy90ZXN0X2NsaWVudC5jCisrKyBiL3Rlc3QvY19nbGliL3NyYy90ZXN0X2NsaWVudC5jCkBAIC0yNywxMSArMjcsMTUgQEAKIAogI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfY29tcGFjdF9wcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydC5oPgogI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NzbF9zb2NrZXQuaD4KICNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc29ja2V0Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oPgogCisjaW5jbHVkZSAiLi4vZ2VuLWNfZ2xpYi90X3Rlc3Rfc2Vjb25kX3NlcnZpY2UuaCIKICNpbmNsdWRlICIuLi9nZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdC5oIgogCiAvKiBIYW5kbGUgU0lHUElQRSBzaWduYWxzIChpbmRpY2F0aW5nIHRoZSBzZXJ2ZXIgaGFzIGNsb3NlZCB0aGUKQEAgLTcxLDQyICs3NSw4MiBAQAogICByZXR1cm4gcmVzdWx0OwogfQogCisvKioKKyAqIEl0IGdldHMgYSBtdWx0aXBsZXhlZCBwcm90b2NvbCB3aGljaCB1c2VzIGEgY29uY3JldGUgcHJvdG9jb2wgdW5kZXJuZWF0aAorICogQHBhcmFtICBwcm90b2NvbF9uYW1lICB0aGUgZnVsbHkgcXVhbGlmaWVkIHByb3RvY29sIHBhdGggKGUuZy4gImJpbmFyeTptdWx0aSIpCisgKiBAcGFyYW0gIHRyYW5zcG9ydCAgICAgIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydAorICogQHBhcmFtICBzZXJ2aWNlX25hbWUgICB0aGUgc2luZ2xlIHN1cHBvcnRlZCBzZXJ2aWNlIG5hbWUKKyAqIEB0b2RvICAgICAgICAgICAgICAgICAgbmVlZCB0byBhbGxvdyBtdWx0aXBsZSBzZXJ2aWNlcyB0byBmdWxseSB0ZXN0IG11bHRpcGxleGVkCisgKiBAcmV0dXJuICAgICAgICAgICAgICAgIGEgbXVsdGlwbGV4ZWQgcHJvdG9jb2wgd3JhcHBpbmcgdGhlIGNvcnJlY3QgdW5kZXJseWluZyBwcm90b2NvbAorICovCitUaHJpZnRQcm90b2NvbCAqCitnZXRfbXVsdGlwbGV4ZWRfcHJvdG9jb2woZ2NoYXIgKnByb3RvY29sX25hbWUsIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBnY2hhciAqc2VydmljZV9uYW1lKQoreworICBUaHJpZnRQcm90b2NvbCAqIG11bHRpcGxleGVkX3Byb3RvY29sID0gTlVMTDsKKworICBpZiAoIHN0cm5jbXAocHJvdG9jb2xfbmFtZSwgImJpbmFyeToiLCA3KSA9PSAwKSB7CisgICAgbXVsdGlwbGV4ZWRfcHJvdG9jb2wgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTCwKKyAgICAgICAgICAgICAgICAgInRyYW5zcG9ydCIsIHRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgTlVMTCk7CisgIH0gZWxzZSBpZiAoIHN0cm5jbXAocHJvdG9jb2xfbmFtZSwgImNvbXBhY3Q6IiwgOCkgPT0gMCkgeworICAgIG11bHRpcGxleGVkX3Byb3RvY29sID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9DT01QQUNUX1BST1RPQ09MLAorICAgICAgICAgICAgICAgICAidHJhbnNwb3J0IiwgdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgfSBlbHNlIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlVua25vd24gbXVsdGlwbGV4IHByb3RvY29sIG5hbWU6ICVzXG4iLCBwcm90b2NvbF9uYW1lKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIHJldHVybiBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX01VTFRJUExFWEVEX1BST1RPQ09MLAorICAgICAgICAgICJ0cmFuc3BvcnQiLCAgICAgIHRyYW5zcG9ydCwKKyAgICAgICAgICAicHJvdG9jb2wiLCAgICAgICBtdWx0aXBsZXhlZF9wcm90b2NvbCwKKyAgICAgICAgICAic2VydmljZS1uYW1lIiwgICBzZXJ2aWNlX25hbWUsCisgICAgICAgICAgTlVMTCk7Cit9CisKIGludAogbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogewotICBzdGF0aWMgZ2NoYXIgKmhvc3QgPSBOVUxMOwotICBzdGF0aWMgZ2ludCAgIHBvcnQgPSA5MDkwOwotICBzdGF0aWMgZ2NoYXIgKnRyYW5zcG9ydF9vcHRpb24gPSBOVUxMOwotICBzdGF0aWMgZ2NoYXIgKnByb3RvY29sX29wdGlvbiA9IE5VTEw7Ci0gIHN0YXRpYyBnaW50ICAgbnVtX3Rlc3RzID0gMTsKKyAgc3RhdGljIGdjaGFyICogIGhvc3QgPSBOVUxMOworICBzdGF0aWMgZ2ludCAgICAgcG9ydCA9IDkwOTA7CisgIHN0YXRpYyBnYm9vbGVhbiBzc2wgID0gRkFMU0U7CisgIHN0YXRpYyBnY2hhciAqICB0cmFuc3BvcnRfb3B0aW9uID0gTlVMTDsKKyAgc3RhdGljIGdjaGFyICogIHByb3RvY29sX29wdGlvbiA9IE5VTEw7CisgIHN0YXRpYyBnaW50ICAgICBudW1fdGVzdHMgPSAxOwogCiAgIHN0YXRpYwogICAgIEdPcHRpb25FbnRyeSBvcHRpb25fZW50cmllc1tdID17Ci0gICAgeyAiaG9zdCIsICAgICAgICAgICAgMCwgMCwgR19PUFRJT05fQVJHX1NUUklORywgICAmaG9zdCwKKyAgICB7ICJob3N0IiwgICAgICAgICAgICAnaCcsIDAsIEdfT1BUSU9OX0FSR19TVFJJTkcsICAgJmhvc3QsCiAgICAgICAiSG9zdCB0byBjb25uZWN0ICg9bG9jYWxob3N0KSIsIE5VTEwgfSwKLSAgICB7ICJwb3J0IiwgICAgICAgICAgICAwLCAwLCBHX09QVElPTl9BUkdfSU5ULCAgICAgICZwb3J0LAorICAgIHsgInBvcnQiLCAgICAgICAgICAgICdwJywgMCwgR19PUFRJT05fQVJHX0lOVCwgICAgICAmcG9ydCwKICAgICAgICJQb3J0IG51bWJlciB0byBjb25uZWN0ICg9OTA5MCkiLCBOVUxMIH0sCi0gICAgeyAidHJhbnNwb3J0IiwgICAgICAgMCwgMCwgR19PUFRJT05fQVJHX1NUUklORywgICAmdHJhbnNwb3J0X29wdGlvbiwKKyAgICB7ICJzc2wiLCAgICAgICAgICAgICAncycsIDAsIEdfT1BUSU9OX0FSR19OT05FLCAgICAgJnNzbCwKKyAgICAgICJFbmFibGUgU1NMIiwgTlVMTCB9LAorICAgIHsgInRyYW5zcG9ydCIsICAgICAgICd0JywgMCwgR19PUFRJT05fQVJHX1NUUklORywgICAmdHJhbnNwb3J0X29wdGlvbiwKICAgICAgICJUcmFuc3BvcnQ6IGJ1ZmZlcmVkLCBmcmFtZWQgKD1idWZmZXJlZCkiLCBOVUxMIH0sCi0gICAgeyAicHJvdG9jb2wiLCAgICAgICAgMCwgMCwgR19PUFRJT05fQVJHX1NUUklORywgICAmcHJvdG9jb2xfb3B0aW9uLAotICAgICAgIlByb3RvY29sOiBiaW5hcnkgKD1iaW5hcnkpIiwgTlVMTCB9LAotICAgIHsgInRlc3Rsb29wcyIsICAgICAnbicsIDAsIEdfT1BUSU9OX0FSR19JTlQsICAgICAgJm51bV90ZXN0cywKKyAgICB7ICJwcm90b2NvbCIsICAgICAgICAncicsIDAsIEdfT1BUSU9OX0FSR19TVFJJTkcsICAgJnByb3RvY29sX29wdGlvbiwKKyAgICAgICJQcm90b2NvbDogYmluYXJ5LCBjb21wYWN0LCBtdWx0aSwgbXVsdGljICg9YmluYXJ5KSIsIE5VTEwgfSwKKyAgICB7ICJ0ZXN0bG9vcHMiLCAgICAgICAnbicsIDAsIEdfT1BUSU9OX0FSR19JTlQsICAgICAgJm51bV90ZXN0cywKICAgICAgICJOdW1iZXIgb2YgdGVzdHMgKD0xKSIsIE5VTEwgfSwKICAgICB7IE5VTEwgfQogICB9OwogCiAgIHN0cnVjdCBzaWdhY3Rpb24gc2lncGlwZV9hY3Rpb247CiAKKyAgR1R5cGUgIHNvY2tldF90eXBlICAgID0gVEhSSUZUX1RZUEVfU09DS0VUOworICBnY2hhciAqc29ja2V0X25hbWUgICAgPSAiaXAiOwogICBHVHlwZSAgdHJhbnNwb3J0X3R5cGUgPSBUSFJJRlRfVFlQRV9CVUZGRVJFRF9UUkFOU1BPUlQ7CiAgIGdjaGFyICp0cmFuc3BvcnRfbmFtZSA9ICJidWZmZXJlZCI7CiAgIEdUeXBlICBwcm90b2NvbF90eXBlICA9IFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTDsKICAgZ2NoYXIgKnByb3RvY29sX25hbWUgID0gImJpbmFyeSI7CiAKLSAgVGhyaWZ0U29ja2V0ICAgICpzb2NrZXQ7Ci0gIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0OwotICBUaHJpZnRQcm90b2NvbCAgKnByb3RvY29sOworICBUaHJpZnRTb2NrZXQgICAgKnNvY2tldCA9IE5VTEw7CisgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKKyAgVGhyaWZ0UHJvdG9jb2wgICpwcm90b2NvbCA9IE5VTEw7CisgIFRocmlmdFByb3RvY29sICAqcHJvdG9jb2wyID0gTlVMTDsgICAgICAgICAgICAvLyBmb3IgbXVsdGlwbGV4ZWQgdGVzdHMKIAotICBUVGVzdFRocmlmdFRlc3RJZiAqdGVzdF9jbGllbnQ7CisgIFRUZXN0VGhyaWZ0VGVzdElmICp0ZXN0X2NsaWVudCA9IE5VTEw7CisgIFRUZXN0U2Vjb25kU2VydmljZUlmICpzZWNvbmRfc2VydmljZSA9IE5VTEw7ICAvLyBmb3IgbXVsdGlwbGV4ZWQgdGVzdHMKIAogICBzdHJ1Y3QgdGltZXZhbCB0aW1lX3N0YXJ0LCB0aW1lX3N0b3AsIHRpbWVfZWxhcHNlZDsKICAgZ3VpbnQ2NCB0aW1lX2VsYXBzZWRfdXNlYywgdGltZV90b3RhbF91c2VjID0gMDsKQEAgLTE0MSwxMCArMTg1LDI2IEBACiAgICAgaG9zdCA9IGdfc3RyZHVwICgibG9jYWxob3N0Iik7CiAKICAgLyogVmFsaWRhdGUgdGhlIHBhcnNlZCBvcHRpb25zICovCi0gIGlmIChwcm90b2NvbF9vcHRpb24gIT0gTlVMTCAmJgotICAgICAgc3RybmNtcCAocHJvdG9jb2xfb3B0aW9uLCAiYmluYXJ5IiwgNykgIT0gMCkgewotICAgIGZwcmludGYgKHN0ZGVyciwgIlVua25vd24gcHJvdG9jb2wgdHlwZSAlc1xuIiwgcHJvdG9jb2xfb3B0aW9uKTsKLSAgICBvcHRpb25zX3ZhbGlkID0gRkFMU0U7CisgIGlmIChwcm90b2NvbF9vcHRpb24gIT0gTlVMTCkgeworICAgIGlmIChzdHJuY21wIChwcm90b2NvbF9vcHRpb24sICJjb21wYWN0IiwgOCkgPT0gMCkgeworICAgICAgcHJvdG9jb2xfdHlwZSA9IFRIUklGVF9UWVBFX0NPTVBBQ1RfUFJPVE9DT0w7CisgICAgICBwcm90b2NvbF9uYW1lID0gImNvbXBhY3QiOworICAgIH0KKyAgICBlbHNlIGlmIChzdHJuY21wIChwcm90b2NvbF9vcHRpb24sICJtdWx0aSIsIDYpID09IDApIHsKKyAgICAgIHByb3RvY29sX3R5cGUgPSBUSFJJRlRfVFlQRV9NVUxUSVBMRVhFRF9QUk9UT0NPTDsKKyAgICAgIHByb3RvY29sX25hbWUgPSAiYmluYXJ5Om11bHRpIjsKKyAgICB9CisgICAgZWxzZSBpZiAoc3RybmNtcCAocHJvdG9jb2xfb3B0aW9uLCAibXVsdGljIiwgNykgPT0gMCkgeworICAgICAgcHJvdG9jb2xfdHlwZSA9IFRIUklGVF9UWVBFX01VTFRJUExFWEVEX1BST1RPQ09MOworICAgICAgcHJvdG9jb2xfbmFtZSA9ICJjb21wYWN0Om11bHRpYyI7CisgICAgfQorICAgIGVsc2UgaWYgKHN0cm5jbXAgKHByb3RvY29sX29wdGlvbiwgImJpbmFyeSIsIDcpID09IDApIHsKKyAgICAgIHByaW50ZigiV2UgYXJlIGdvaW5nIHdpdGggZGVmYXVsdCBwcm90b2NvbFxuIik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiVW5rbm93biBwcm90b2NvbCB0eXBlICVzXG4iLCBwcm90b2NvbF9vcHRpb24pOworICAgICAgb3B0aW9uc192YWxpZCA9IEZBTFNFOworICAgIH0KICAgfQogCiAgIGlmICh0cmFuc3BvcnRfb3B0aW9uICE9IE5VTEwpIHsKQEAgLTE1OCwxMiArMjE4LDE5IEBACiAgICAgfQogICB9CiAKKyAgaWYgKHNzbCkgeworICAgIHNvY2tldF90eXBlID0gVEhSSUZUX1RZUEVfU1NMX1NPQ0tFVDsKKyAgICBzb2NrZXRfbmFtZSA9ICJpcC1zc2wiOworICAgIHByaW50ZigiVHlwZSBuYW1lICVzXG4iLCBnX3R5cGVfbmFtZSAoc29ja2V0X3R5cGUpKTsKKyAgfQorCiAgIGlmICghb3B0aW9uc192YWxpZCkKICAgICByZXR1cm4gMjU0OwogCi0gIHByaW50ZiAoIkNvbm5lY3RpbmcgKCVzLyVzKSB0bzogJXM6JWRcbiIsCisgIHByaW50ZiAoIkNvbm5lY3RpbmcgKCVzLyVzKSB0bzogJXMvJXM6JWRcbiIsCiAgICAgICAgICAgdHJhbnNwb3J0X25hbWUsCiAgICAgICAgICAgcHJvdG9jb2xfbmFtZSwKKyAgICAgICAgICBzb2NrZXRfbmFtZSwKICAgICAgICAgICBob3N0LAogICAgICAgICAgIHBvcnQpOwogCkBAIC0xNzUsMTcgKzI0Miw1MCBAQAogICBzaWdwaXBlX2FjdGlvbi5zYV9mbGFncyA9IFNBX1JFU0VUSEFORDsKICAgc2lnYWN0aW9uIChTSUdQSVBFLCAmc2lncGlwZV9hY3Rpb24sIE5VTEwpOwogCisgIGlmIChzc2wpIHsKKyAgICB0aHJpZnRfc3NsX3NvY2tldF9pbml0aWFsaXplX29wZW5zc2woKTsKKyAgfQorCiAgIC8qIEVzdGFibGlzaCBhbGwgb3VyIGNvbm5lY3Rpb24gb2JqZWN0cyAqLwotICBzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwKKyAgc29ja2V0ID0gZ19vYmplY3RfbmV3IChzb2NrZXRfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAiaG9zdG5hbWUiLCBob3N0LAogICAgICAgICAgICAgICAgICAgICAgICAgICJwb3J0IiwgICAgIHBvcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgaWYgKHNzbCAmJiAhdGhyaWZ0X3NzbF9sb2FkX2NlcnRfZnJvbV9maWxlKFRIUklGVF9TU0xfU09DS0VUKHNvY2tldCksICIuLi9rZXlzL0NBLnBlbSIpKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gbG9hZCB2YWxpZGF0aW9uIGNlcnRpZmljYXRlIC4uL2tleXMvQ0EucGVtIC0gZGlkIHlvdSBydW4gaW4gdGhlIHRlc3QvY19nbGliIGRpcmVjdG9yeT9cbiIpOworICAgIGdfY2xlYXJfb2JqZWN0ICgmc29ja2V0KTsKKyAgICByZXR1cm4gMjUzOworICB9CisKICAgdHJhbnNwb3J0ID0gZ19vYmplY3RfbmV3ICh0cmFuc3BvcnRfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJhbnNwb3J0Iiwgc29ja2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwotICBwcm90b2NvbCA9IGdfb2JqZWN0X25ldyAocHJvdG9jb2xfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cmFuc3BvcnQiLCB0cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICBpZihwcm90b2NvbF90eXBlPT1USFJJRlRfVFlQRV9NVUxUSVBMRVhFRF9QUk9UT0NPTCkgeworICAgIC8vIFRPRE86IEEgbXVsdGlwbGV4ZWQgdGVzdCBzaG91bGQgYWxzbyB0ZXN0ICJTZWNvbmQiIChzZWUgSmF2YSBUZXN0U2VydmVyKQorICAgIC8vIFRoZSBjb250ZXh0IGNvbWVzIGZyb20gdGhlIG5hbWUgb2YgdGhlIHRocmlmdCBmaWxlLiBJZiBtdWx0aXBsZSB0aHJpZnQKKyAgICAvLyBzY2hlbWFzIGFyZSB1c2VkIHdlIGhhdmUgdG8gcmVkbyB0aGUgd2F5IHRoaXMgaXMgZG9uZS4KKyAgICBwcm90b2NvbCA9IGdldF9tdWx0aXBsZXhlZF9wcm90b2NvbChwcm90b2NvbF9uYW1lLCB0cmFuc3BvcnQsICJUaHJpZnRUZXN0Iik7CisgICAgaWYgKE5VTEwgPT0gcHJvdG9jb2wpIHsKKyAgICAgIGdfY2xlYXJfb2JqZWN0ICgmdHJhbnNwb3J0KTsKKyAgICAgIGdfY2xlYXJfb2JqZWN0ICgmc29ja2V0KTsKKyAgICAgIHJldHVybiAyNTI7CisgICAgfQorCisgICAgLy8gTWFrZSBhIHNlY29uZCBwcm90b2NvbCBhbmQgY2xpZW50IHJ1bm5pbmcgb24gdGhlIHNhbWUgbXVsdGlwbGV4ZWQgdHJhbnNwb3J0CisgICAgcHJvdG9jb2wyID0gZ2V0X211bHRpcGxleGVkX3Byb3RvY29sKHByb3RvY29sX25hbWUsIHRyYW5zcG9ydCwgIlNlY29uZFNlcnZpY2UiKTsKKyAgICBzZWNvbmRfc2VydmljZSA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfU0VDT05EX1NFUlZJQ0VfQ0xJRU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5wdXRfcHJvdG9jb2wiLCAgcHJvdG9jb2wyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3V0cHV0X3Byb3RvY29sIiwgcHJvdG9jb2wyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICB9ZWxzZXsKKyAgICBwcm90b2NvbCA9IGdfb2JqZWN0X25ldyAocHJvdG9jb2xfdHlwZSwKKyAgICAgICAgICAgInRyYW5zcG9ydCIsIHRyYW5zcG9ydCwKKyAgICAgICAgICAgTlVMTCk7CisgIH0KKwogICB0ZXN0X2NsaWVudCA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfVEhSSUZUX1RFU1RfQ0xJRU5ULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlucHV0X3Byb3RvY29sIiwgIHByb3RvY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm91dHB1dF9wcm90b2NvbCIsIHByb3RvY29sLApAQCAtMTk0LDE2ICsyOTQsMTcgQEAKICAgLyogRXhlY3V0ZSB0aGUgYWN0dWFsIHRlc3RzICovCiAgIGZvciAodGVzdF9udW0gPSAwOyB0ZXN0X251bSA8IG51bV90ZXN0czsgKyt0ZXN0X251bSkgewogICAgIGlmICh0aHJpZnRfdHJhbnNwb3J0X29wZW4gKHRyYW5zcG9ydCwgJmVycm9yKSkgewotICAgICAgZ2NoYXIgICpzdHJpbmcgPSBOVUxMOwotICAgICAgZ2ludDggICBieXRlICAgPSAwOwotICAgICAgZ2ludDMyICBpbnQzMiAgPSAwOwotICAgICAgZ2ludDY0ICBpbnQ2NCAgPSAwOwotICAgICAgZ2RvdWJsZSBkdWIgICAgPSAwOworICAgICAgZ2NoYXIgICAqc3RyaW5nICA9IE5VTEw7CisgICAgICBnYm9vbGVhbiBib29sZWFuID0gMDsKKyAgICAgIGdpbnQ4ICAgIGJ5dGUgICAgPSAwOworICAgICAgZ2ludDMyICAgaW50MzIgICA9IDA7CisgICAgICBnaW50NjQgICBpbnQ2NCAgID0gMDsKKyAgICAgIGdkb3VibGUgIGR1YiAgICAgPSAwOwogCiAgICAgICBnaW50IGJ5dGVfdGhpbmcsIGkzMl90aGluZywgaW5uZXJfYnl0ZV90aGluZywgaW5uZXJfaTMyX3RoaW5nOwogICAgICAgZ2ludDY0IGk2NF90aGluZywgaW5uZXJfaTY0X3RoaW5nOwogCi0gICAgICBUVGVzdFh0cnVjdCAgKnh0cnVjdF9vdXQsICAqeHRydWN0X2luLCAgKmlubmVyX3h0cnVjdF9pbjsKKyAgICAgIFRUZXN0WHRydWN0ICAqeHRydWN0X291dCwgICp4dHJ1Y3Rfb3V0MiwgKnh0cnVjdF9pbiwgICppbm5lcl94dHJ1Y3RfaW47CiAgICAgICBUVGVzdFh0cnVjdDIgKnh0cnVjdDJfb3V0LCAqeHRydWN0Ml9pbjsKIAogICAgICAgR0hhc2hUYWJsZSAqbWFwX291dCwgKm1hcF9pbiwgKmlubmVyX21hcF9pbjsKQEAgLTIxNiw4ICszMTcsOSBAQAogICAgICAgR0FycmF5ICpsaXN0X291dCwgKmxpc3RfaW47CiAKICAgICAgIFRUZXN0TnVtYmVyeiBudW1iZXJ6OworICAgICAgVFRlc3ROdW1iZXJ6IG51bWJlcnoyOwogCi0gICAgICBUVGVzdFVzZXJJZCB1c2VyX2lkLCAqdXNlcl9pZF9wdHI7CisgICAgICBUVGVzdFVzZXJJZCB1c2VyX2lkLCAqdXNlcl9pZF9wdHIsICp1c2VyX2lkX3B0cjI7CiAKICAgICAgIFRUZXN0SW5zYW5pdHkgKmluc2FuaXR5X291dCwgKmluc2FuaXR5X2luOwogICAgICAgR0hhc2hUYWJsZSAqdXNlcl9tYXA7CkBAIC0yNjksMTAgKzM3MSwxMSBAQAogICAgICAgICBwcmludGYgKCIgPSB2b2lkXG4iKTsKICAgICAgIH0KICAgICAgIGVsc2UgewotICAgICAgICBwcmludGYgKCIlc1xuIiwgZXJyb3ItPm1lc3NhZ2UpOwotICAgICAgICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKLSAgICAgICAgZXJyb3IgPSBOVUxMOwotCisgICAgICAgIGlmKGVycm9yIT1OVUxMKXsKKyAgICAgICAgICBwcmludGYgKCIlc1xuIiwgZXJyb3ItPm1lc3NhZ2UpOworICAgICAgICAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOworICAgICAgICAgIGVycm9yID0gTlVMTDsKKyAgICAgICAgfQogICAgICAgICBmYWlsX2NvdW50Kys7CiAgICAgICB9CiAKQEAgLTMwMCw2ICs0MDMsNjcgQEAKICAgICAgIH0KIAogICAgICAgLyoqCisgICAgICAgKiBNdWx0aXBsZXhlZCBUZXN0IC0gZG8gdGhpcyByaWdodCBpbiB0aGUgbWlkZGxlIG9mIHRoZSBub3JtYWwgVGVzdCBDbGllbnQgcnVuCisgICAgICAgKi8KKyAgICAgIGlmIChzZWNvbmRfc2VydmljZSkgeworICAgICAgICBwcmludGYgKCJ0ZXN0U2Vjb25kU2VydmljZU11bHRpcGxleFNlY29uZFRlc3RTdHJpbmcoXCIybmRcIikiKTsKKyAgICAgICAgaWYgKHRfdGVzdF9zZWNvbmRfc2VydmljZV9pZl9zZWNvbmR0ZXN0X3N0cmluZyAoc2Vjb25kX3NlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIybmQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpKSB7CisgICAgICAgICAgcHJpbnRmICgiID0gXCIlc1wiXG4iLCBzdHJpbmcpOworICAgICAgICAgIGlmIChzdHJjbXAgKHN0cmluZywgInRlc3RTdHJpbmcoXCIybmRcIikiKSAhPSAwKSB7CisgICAgICAgICAgICArK2ZhaWxfY291bnQ7CisgICAgICAgICAgfQorCisgICAgICAgICAgZ19mcmVlIChzdHJpbmcpOworICAgICAgICAgIHN0cmluZyA9IE5VTEw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcHJpbnRmICgiJXNcbiIsIGVycm9yLT5tZXNzYWdlKTsKKyAgICAgICAgICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKKyAgICAgICAgICBlcnJvciA9IE5VTEw7CisKKyAgICAgICAgICArK2ZhaWxfY291bnQ7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiBCT09MIFRFU1QKKyAgICAgICAqLworICAgICAgcHJpbnRmICgidGVzdEJ5dGUodHJ1ZSkiKTsKKyAgICAgIGlmICh0X3Rlc3RfdGhyaWZ0X3Rlc3RfaWZfdGVzdF9ib29sICh0ZXN0X2NsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm9vbGVhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcikpIHsKKyAgICAgICAgcHJpbnRmICgiID0gJXNcbiIsIGJvb2xlYW4gPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgICAgICAgaWYgKGJvb2xlYW4gIT0gMSkKKyAgICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgcHJpbnRmICgiJXNcbiIsIGVycm9yLT5tZXNzYWdlKTsKKyAgICAgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CisgICAgICAgIGVycm9yID0gTlVMTDsKKworICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICB9CisgICAgICBwcmludGYgKCJ0ZXN0Qnl0ZShmYWxzZSkiKTsKKyAgICAgIGlmICh0X3Rlc3RfdGhyaWZ0X3Rlc3RfaWZfdGVzdF9ib29sICh0ZXN0X2NsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm9vbGVhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcikpIHsKKyAgICAgICAgcHJpbnRmICgiID0gJXNcbiIsIGJvb2xlYW4gPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgICAgICAgaWYgKGJvb2xlYW4gIT0gMCkKKyAgICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgcHJpbnRmICgiJXNcbiIsIGVycm9yLT5tZXNzYWdlKTsKKyAgICAgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CisgICAgICAgIGVycm9yID0gTlVMTDsKKworICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICB9CisKKyAgICAgIC8qKgogICAgICAgICogQllURSBURVNUCiAgICAgICAgKi8KICAgICAgIHByaW50ZiAoInRlc3RCeXRlKDEpIik7CkBAIC0zMTgsNiArNDgyLDIyIEBACiAKICAgICAgICAgZmFpbF9jb3VudCsrOwogICAgICAgfQorICAgICAgcHJpbnRmICgidGVzdEJ5dGUoLTEpIik7CisgICAgICBpZiAodF90ZXN0X3RocmlmdF90ZXN0X2lmX3Rlc3RfYnl0ZSAodGVzdF9jbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ5dGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKSkgeworICAgICAgICBwcmludGYgKCIgPSAlZFxuIiwgYnl0ZSk7CisgICAgICAgIGlmIChieXRlICE9IC0xKQorICAgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBwcmludGYgKCIlc1xuIiwgZXJyb3ItPm1lc3NhZ2UpOworICAgICAgICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKKyAgICAgICAgZXJyb3IgPSBOVUxMOworCisgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgIH0KIAogICAgICAgLyoqCiAgICAgICAgKiBJMzIgVEVTVApAQCAtMzgwLDYgKzU2MCwxMDUgQEAKICAgICAgIH0KIAogICAgICAgLyoqCisgICAgICAgKiBCSU5BUlkgVEVTVAorICAgICAgICovCisgICAgICBwcmludGYgKCJ0ZXN0QmluYXJ5KGVtcHR5KSIpOworICAgICAgR0J5dGVBcnJheSAqZW1wdHlBcnJheSA9IGdfYnl0ZV9hcnJheV9uZXcoKTsKKyAgICAgIEdCeXRlQXJyYXkgKnJlc3VsdCA9IE5VTEw7CisgICAgICBpZiAodF90ZXN0X3RocmlmdF90ZXN0X2lmX3Rlc3RfYmluYXJ5ICh0ZXN0X2NsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXB0eUFycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKSkgeworICAgICAgICBHQnl0ZXMgKnJlc3BvbnNlID0gZ19ieXRlX2FycmF5X2ZyZWVfdG9fYnl0ZXMocmVzdWx0KTsgIC8vIGZyZWVzIHJlc3VsdAorICAgICAgICByZXN1bHQgPSBOVUxMOworICAgICAgICBnc2l6ZSBzaXogPSBnX2J5dGVzX2dldF9zaXplKHJlc3BvbnNlKTsKKyAgICAgICAgaWYgKHNpeiA9PSAwKSB7CisgICAgICAgICAgcHJpbnRmKCIgPSBlbXB0eVxuIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcHJpbnRmKCIgPSBub3QgZW1wdHkgKCVsZCBieXRlcylcbiIsIChsb25nKXNpeik7CisgICAgICAgICAgKytmYWlsX2NvdW50OworICAgICAgICB9CisgICAgICAgIGdfYnl0ZXNfdW5yZWYocmVzcG9uc2UpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmICgiJXNcbiIsIGVycm9yLT5tZXNzYWdlKTsKKyAgICAgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CisgICAgICAgIGVycm9yID0gTlVMTDsKKworICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICB9CisgICAgICBnX2J5dGVfYXJyYXlfdW5yZWYoZW1wdHlBcnJheSk7CisgICAgICBlbXB0eUFycmF5ID0gTlVMTDsKKworICAgICAgLy8gVE9ETzogYWRkIHRlc3RCaW5hcnkoKSB3aXRoIGRhdGEKKyAgICAgIHByaW50ZiAoInRlc3RCaW5hcnkoWy0xMjguLjEyN10pID0geyIpOworICAgICAgY29uc3Qgc2lnbmVkIGNoYXIgYmluX2RhdGFbMjU2XQorICAgICAgICA9IHstMTI4LCAtMTI3LCAtMTI2LCAtMTI1LCAtMTI0LCAtMTIzLCAtMTIyLCAtMTIxLCAtMTIwLCAtMTE5LCAtMTE4LCAtMTE3LCAtMTE2LCAtMTE1LCAtMTE0LAorICAgICAgICAgICAtMTEzLCAtMTEyLCAtMTExLCAtMTEwLCAtMTA5LCAtMTA4LCAtMTA3LCAtMTA2LCAtMTA1LCAtMTA0LCAtMTAzLCAtMTAyLCAtMTAxLCAtMTAwLCAtOTksCisgICAgICAgICAgIC05OCwgIC05NywgIC05NiwgIC05NSwgIC05NCwgIC05MywgIC05MiwgIC05MSwgIC05MCwgIC04OSwgIC04OCwgIC04NywgIC04NiwgIC04NSwgIC04NCwKKyAgICAgICAgICAgLTgzLCAgLTgyLCAgLTgxLCAgLTgwLCAgLTc5LCAgLTc4LCAgLTc3LCAgLTc2LCAgLTc1LCAgLTc0LCAgLTczLCAgLTcyLCAgLTcxLCAgLTcwLCAgLTY5LAorICAgICAgICAgICAtNjgsICAtNjcsICAtNjYsICAtNjUsICAtNjQsICAtNjMsICAtNjIsICAtNjEsICAtNjAsICAtNTksICAtNTgsICAtNTcsICAtNTYsICAtNTUsICAtNTQsCisgICAgICAgICAgIC01MywgIC01MiwgIC01MSwgIC01MCwgIC00OSwgIC00OCwgIC00NywgIC00NiwgIC00NSwgIC00NCwgIC00MywgIC00MiwgIC00MSwgIC00MCwgIC0zOSwKKyAgICAgICAgICAgLTM4LCAgLTM3LCAgLTM2LCAgLTM1LCAgLTM0LCAgLTMzLCAgLTMyLCAgLTMxLCAgLTMwLCAgLTI5LCAgLTI4LCAgLTI3LCAgLTI2LCAgLTI1LCAgLTI0LAorICAgICAgICAgICAtMjMsICAtMjIsICAtMjEsICAtMjAsICAtMTksICAtMTgsICAtMTcsICAtMTYsICAtMTUsICAtMTQsICAtMTMsICAtMTIsICAtMTEsICAtMTAsICAtOSwKKyAgICAgICAgICAgLTgsICAgLTcsICAgLTYsICAgLTUsICAgLTQsICAgLTMsICAgLTIsICAgLTEsICAgMCwgICAgMSwgICAgMiwgICAgMywgICAgNCwgICAgNSwgICAgNiwKKyAgICAgICAgICAgNywgICAgOCwgICAgOSwgICAgMTAsICAgMTEsICAgMTIsICAgMTMsICAgMTQsICAgMTUsICAgMTYsICAgMTcsICAgMTgsICAgMTksICAgMjAsICAgMjEsCisgICAgICAgICAgIDIyLCAgIDIzLCAgIDI0LCAgIDI1LCAgIDI2LCAgIDI3LCAgIDI4LCAgIDI5LCAgIDMwLCAgIDMxLCAgIDMyLCAgIDMzLCAgIDM0LCAgIDM1LCAgIDM2LAorICAgICAgICAgICAzNywgICAzOCwgICAzOSwgICA0MCwgICA0MSwgICA0MiwgICA0MywgICA0NCwgICA0NSwgICA0NiwgICA0NywgICA0OCwgICA0OSwgICA1MCwgICA1MSwKKyAgICAgICAgICAgNTIsICAgNTMsICAgNTQsICAgNTUsICAgNTYsICAgNTcsICAgNTgsICAgNTksICAgNjAsICAgNjEsICAgNjIsICAgNjMsICAgNjQsICAgNjUsICAgNjYsCisgICAgICAgICAgIDY3LCAgIDY4LCAgIDY5LCAgIDcwLCAgIDcxLCAgIDcyLCAgIDczLCAgIDc0LCAgIDc1LCAgIDc2LCAgIDc3LCAgIDc4LCAgIDc5LCAgIDgwLCAgIDgxLAorICAgICAgICAgICA4MiwgICA4MywgICA4NCwgICA4NSwgICA4NiwgICA4NywgICA4OCwgICA4OSwgICA5MCwgICA5MSwgICA5MiwgICA5MywgICA5NCwgICA5NSwgICA5NiwKKyAgICAgICAgICAgOTcsICAgOTgsICAgOTksICAgMTAwLCAgMTAxLCAgMTAyLCAgMTAzLCAgMTA0LCAgMTA1LCAgMTA2LCAgMTA3LCAgMTA4LCAgMTA5LCAgMTEwLCAgMTExLAorICAgICAgICAgICAxMTIsICAxMTMsICAxMTQsICAxMTUsICAxMTYsICAxMTcsICAxMTgsICAxMTksICAxMjAsICAxMjEsICAxMjIsICAxMjMsICAxMjQsICAxMjUsICAxMjYsCisgICAgICAgICAgIDEyN307CisgICAgICBHQnl0ZUFycmF5ICpmdWxsQXJyYXkgPSBnX2J5dGVfYXJyYXlfbmV3KCk7CisgICAgICBnX2J5dGVfYXJyYXlfYXBwZW5kKGZ1bGxBcnJheSwgKGd1aW50OCAqKSgmYmluX2RhdGFbMF0pLCAyNTYpOworICAgICAgaWYgKHRfdGVzdF90aHJpZnRfdGVzdF9pZl90ZXN0X2JpbmFyeSAodGVzdF9jbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVsbEFycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKSkgeworICAgICAgICBHQnl0ZXMgKnJlc3BvbnNlID0gZ19ieXRlX2FycmF5X2ZyZWVfdG9fYnl0ZXMocmVzdWx0KTsgIC8vIGZyZWVzIHJlc3VsdAorICAgICAgICByZXN1bHQgPSBOVUxMOworICAgICAgICBnc2l6ZSBzaXogPSBnX2J5dGVzX2dldF9zaXplKHJlc3BvbnNlKTsKKyAgICAgICAgZ2NvbnN0cG9pbnRlciBwdHIgPSBnX2J5dGVzX2dldF9kYXRhKHJlc3BvbnNlLCAmc2l6KTsKKyAgICAgICAgaWYgKHNpeiA9PSAyNTYpIHsKKyAgICAgICAgICBnYm9vbGVhbiBmaXJzdCA9IDE7CisgICAgICAgICAgZ2Jvb2xlYW4gZmFpbGVkID0gMDsKKyAgICAgICAgICBpbnQgaTsKKworICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7ICsraSkgeworICAgICAgICAgICAgaWYgKCFmaXJzdCkKKyAgICAgICAgICAgICAgcHJpbnRmKCIsIik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIGZpcnN0ID0gMDsKKyAgICAgICAgICAgIGludCB2YWwgPSAoKHNpZ25lZCBjaGFyICopcHRyKVtpXTsKKyAgICAgICAgICAgIHByaW50ZigiJWQiLCB2YWwpOworICAgICAgICAgICAgaWYgKCFmYWlsZWQgJiYgdmFsICE9IGkgLSAxMjgpIHsKKyAgICAgICAgICAgICAgZmFpbGVkID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgcHJpbnRmKCJ9ICIpOworICAgICAgICAgIGlmIChmYWlsZWQpIHsKKyAgICAgICAgICAgIHByaW50ZigiRkFJTCAoYmFkIGNvbnRlbnQpIHNpemUgJWxkIE9LXG4iLCAobG9uZylzaXopOworICAgICAgICAgICAgKytmYWlsX2NvdW50OworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmludGYoIk9LIHNpemUgJWxkIE9LXG4iLCAobG9uZylzaXopOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBwcmludGYoIiA9IGJhZCBzaXplICVsZFxuIiwgKGxvbmcpc2l6KTsKKyAgICAgICAgICArK2ZhaWxfY291bnQ7CisgICAgICAgIH0KKyAgICAgICAgZ19ieXRlc191bnJlZihyZXNwb25zZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBwcmludGYgKCIlc1xuIiwgZXJyb3ItPm1lc3NhZ2UpOworICAgICAgICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKKyAgICAgICAgZXJyb3IgPSBOVUxMOworCisgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgIH0KKyAgICAgIGdfYnl0ZV9hcnJheV91bnJlZihmdWxsQXJyYXkpOworICAgICAgZnVsbEFycmF5ID0gTlVMTDsKKworICAgICAgLyoqCiAgICAgICAgKiBTVFJVQ1QgVEVTVAogICAgICAgICovCiAgICAgICBwcmludGYgKCJ0ZXN0U3RydWN0KHtcIlplcm9cIiwgMSwgLTMsIC01fSkiKTsKQEAgLTQxMiw2ICs2OTEsMTEgQEAKICAgICAgICAgICAgIGkzMl90aGluZyAhPSAtMyB8fAogICAgICAgICAgICAgaTY0X3RoaW5nICE9IChnaW50NjQpLTUpCiAgICAgICAgICAgZmFpbF9jb3VudCsrOworCisgICAgICAgIGlmIChzdHJpbmcpIHsKKyAgICAgICAgICBnX2ZyZWUgKHN0cmluZyk7CisgICAgICAgICAgc3RyaW5nID0gTlVMTDsKKyAgICAgICAgfQogICAgICAgfQogICAgICAgZWxzZSB7CiAgICAgICAgIHByaW50ZiAoIiVzXG4iLCBlcnJvci0+bWVzc2FnZSk7CkBAIC00MjAsNyArNzA0LDggQEAKIAogICAgICAgICBmYWlsX2NvdW50Kys7CiAgICAgICB9Ci0gICAgICBnX29iamVjdF91bnJlZiAoeHRydWN0X2luKTsKKyAgICAgIC8vIGdfY2xlYXJfb2JqZWN0KCZ4dHJ1Y3Rfb3V0KTsgdXNlZCBiZWxvdworICAgICAgZ19jbGVhcl9vYmplY3QoJnh0cnVjdF9pbik7CiAKICAgICAgIC8qKgogICAgICAgICogTkVTVEVEIFNUUlVDVCBURVNUCkBAIC00NjMsNiArNzQ4LDExIEBACiAgICAgICAgICAgICBpbm5lcl9pNjRfdGhpbmcgIT0gKGdpbnQ2NCktNSB8fAogICAgICAgICAgICAgaTMyX3RoaW5nICE9IDUpCiAgICAgICAgICAgZmFpbF9jb3VudCsrOworCisgICAgICAgIGlmIChzdHJpbmcpIHsKKyAgICAgICAgICBnX2ZyZWUoc3RyaW5nKTsKKyAgICAgICAgICBzdHJpbmcgPSBOVUxMOworICAgICAgICB9CiAgICAgICB9CiAgICAgICBlbHNlIHsKICAgICAgICAgcHJpbnRmICgiJXNcbiIsIGVycm9yLT5tZXNzYWdlKTsKQEAgLTQ3MiwxMCArNzYyLDEwIEBACiAgICAgICAgIGZhaWxfY291bnQrKzsKICAgICAgIH0KIAotICAgICAgZ19vYmplY3RfdW5yZWYgKHh0cnVjdF9pbik7Ci0gICAgICBnX29iamVjdF91bnJlZiAoeHRydWN0Ml9pbik7Ci0gICAgICBnX29iamVjdF91bnJlZiAoeHRydWN0Ml9vdXQpOwotICAgICAgZ19vYmplY3RfdW5yZWYgKHh0cnVjdF9vdXQpOworICAgICAgZ19jbGVhcl9vYmplY3QoJnh0cnVjdF9pbik7CisgICAgICBnX2NsZWFyX29iamVjdCgmeHRydWN0Ml9pbik7CisgICAgICBnX2NsZWFyX29iamVjdCgmeHRydWN0Ml9vdXQpOworICAgICAgZ19jbGVhcl9vYmplY3QoJnh0cnVjdF9vdXQpOwogCiAgICAgICAvKioKICAgICAgICAqIE1BUCBURVNUCkBAIC05ODIsMTcgKzEyNzIsMjggQEAKICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CiAKICAgICAgIG51bWJlcnogPSBUX1RFU1RfTlVNQkVSWl9GSVZFOworICAgICAgbnVtYmVyejIgPSBUX1RFU1RfTlVNQkVSWl9FSUdIVDsKICAgICAgIHVzZXJfaWRfcHRyID0gZ19tYWxsb2MgKHNpemVvZiAqdXNlcl9pZF9wdHIpOwotICAgICAgKnVzZXJfaWRfcHRyID0gNTAwMDsKKyAgICAgICp1c2VyX2lkX3B0ciA9IDU7CisgICAgICB1c2VyX2lkX3B0cjIgPSBnX21hbGxvYyAoc2l6ZW9mICp1c2VyX2lkX3B0cik7CisgICAgICAqdXNlcl9pZF9wdHIyID0gODsKICAgICAgIGdfaGFzaF90YWJsZV9pbnNlcnQgKHVzZXJfbWFwLCAoZ3BvaW50ZXIpbnVtYmVyeiwgdXNlcl9pZF9wdHIpOworICAgICAgZ19oYXNoX3RhYmxlX2luc2VydCAodXNlcl9tYXAsIChncG9pbnRlciludW1iZXJ6MiwgdXNlcl9pZF9wdHIyKTsKICAgICAgIGdfaGFzaF90YWJsZV91bnJlZiAodXNlcl9tYXApOwogCiAgICAgICB4dHJ1Y3Rfb3V0ID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9YVFJVQ1QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RyaW5nX3RoaW5nIiwgIlRydWNrIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJieXRlX3RoaW5nIiwgICA4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImkzMl90aGluZyIsICAgIDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaTY0X3RoaW5nIiwgICAgOExMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN0cmluZ190aGluZyIsICJIZWxsbzIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ5dGVfdGhpbmciLCAgIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaTMyX3RoaW5nIiwgICAgMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpNjRfdGhpbmciLCAgICAyTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgIHh0cnVjdF9vdXQyID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9YVFJVQ1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RyaW5nX3RoaW5nIiwgIkdvb2RieWU0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJieXRlX3RoaW5nIiwgICA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImkzMl90aGluZyIsICAgIDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaTY0X3RoaW5nIiwgICAgNExMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICBnX3B0cl9hcnJheV9hZGQgKHh0cnVjdHMsIHh0cnVjdF9vdXQyKTsKICAgICAgIGdfcHRyX2FycmF5X2FkZCAoeHRydWN0cywgeHRydWN0X291dCk7CiAgICAgICBnX3B0cl9hcnJheV91bnJlZiAoeHRydWN0cyk7CiAKQEAgLTEyMDcsNyArMTUwOCw3IEBACiAgICAgICB9CiAKICAgICAgIGdfaGFzaF90YWJsZV91bnJlZiAobWFwX2luKTsKLSAgICAgIGdfb2JqZWN0X3VucmVmIChpbnNhbml0eV9vdXQpOworICAgICAgZ19jbGVhcl9vYmplY3QgKCZpbnNhbml0eV9vdXQpOwogCiAgICAgICAvKiB0ZXN0IGV4Y2VwdGlvbiAqLwogICAgICAgcHJpbnRmICgidGVzdENsaWVudC50ZXN0RXhjZXB0aW9uKFwiWGNlcHRpb25cIikgPT4iKTsKQEAgLTEyMjMsOCArMTUyNCw3IEBACiAgICAgICAgIHByaW50ZiAoIiAgeyV1LCBcIiVzXCJ9XG4iLCBpbnQzMiwgc3RyaW5nKTsKICAgICAgICAgZ19mcmVlIChzdHJpbmcpOwogCi0gICAgICAgIGdfb2JqZWN0X3VucmVmICh4Y2VwdGlvbik7Ci0gICAgICAgIHhjZXB0aW9uID0gTlVMTDsKKyAgICAgICAgZ19jbGVhcl9vYmplY3QgKCZ4Y2VwdGlvbik7CiAKICAgICAgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CiAgICAgICAgIGVycm9yID0gTlVMTDsKQEAgLTEyNjAsMTAgKzE1NjAsNyBAQAogICAgICAgICBwcmludGYgKCIgIHZvaWRcbkZBSUxVUkVcbiIpOwogICAgICAgICBmYWlsX2NvdW50Kys7CiAKLSAgICAgICAgaWYgKHhjZXB0aW9uICE9IE5VTEwpIHsKLSAgICAgICAgICBnX29iamVjdF91bnJlZiAoeGNlcHRpb24pOwotICAgICAgICAgIHhjZXB0aW9uID0gTlVMTDsKLSAgICAgICAgfQorICAgICAgICBnX2NsZWFyX29iamVjdCAoJnhjZXB0aW9uKTsKIAogICAgICAgICBpZiAoZXJyb3IgIT0gTlVMTCkgewogICAgICAgICAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOwpAQCAtMTI4MSwxMCArMTU3OCw3IEBACiAgICAgICAgIHByaW50ZiAoIiAgdm9pZFxuRkFJTFVSRVxuIik7CiAgICAgICAgIGZhaWxfY291bnQrKzsKIAotICAgICAgICBpZiAoeGNlcHRpb24gIT0gTlVMTCkgewotICAgICAgICAgIGdfb2JqZWN0X3VucmVmICh4Y2VwdGlvbik7Ci0gICAgICAgICAgeGNlcHRpb24gPSBOVUxMOwotICAgICAgICB9CisgICAgICAgIGdfY2xlYXJfb2JqZWN0ICgmeGNlcHRpb24pOwogCiAgICAgICAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOwogICAgICAgICBlcnJvciA9IE5VTEw7CkBAIC0xMzIxLDE1ICsxNjE1LDggQEAKICAgICAgICAgcHJpbnRmICgiICByZXN1bHRcbkZBSUxVUkVcbiIpOwogICAgICAgICBmYWlsX2NvdW50Kys7CiAKLSAgICAgICAgaWYgKHhjZXB0aW9uICE9IE5VTEwpIHsKLSAgICAgICAgICBnX29iamVjdF91bnJlZiAoeGNlcHRpb24pOwotICAgICAgICAgIHhjZXB0aW9uID0gTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh4Y2VwdGlvbjIgIT0gTlVMTCkgewotICAgICAgICAgIGdfb2JqZWN0X3VucmVmICh4Y2VwdGlvbjIpOwotICAgICAgICAgIHhjZXB0aW9uID0gTlVMTDsKLSAgICAgICAgfQorICAgICAgICBnX2NsZWFyX29iamVjdCAoJnhjZXB0aW9uKTsKKyAgICAgICAgZ19jbGVhcl9vYmplY3QgKCZ4Y2VwdGlvbjIpOwogCiAgICAgICAgIGlmIChlcnJvciAhPSBOVUxMKSB7CiAgICAgICAgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CkBAIC0xMzU5LDExICsxNjQ2LDggQEAKICAgICAgICAgcHJpbnRmICgiICB7JXUsIHtcIiVzXCJ9fVxuIiwgaW50MzIsIHN0cmluZyk7CiAgICAgICAgIGdfZnJlZSAoc3RyaW5nKTsKIAotICAgICAgICBnX29iamVjdF91bnJlZiAoaW5uZXJfeHRydWN0X2luKTsKLSAgICAgICAgaW5uZXJfeHRydWN0X2luID0gTlVMTDsKLQotICAgICAgICBnX29iamVjdF91bnJlZiAoeGNlcHRpb24yKTsKLSAgICAgICAgeGNlcHRpb24yID0gTlVMTDsKKyAgICAgICAgZ19jbGVhcl9vYmplY3QgKCZpbm5lcl94dHJ1Y3RfaW4pOworICAgICAgICBnX2NsZWFyX29iamVjdCAoJnhjZXB0aW9uMik7CiAKICAgICAgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CiAgICAgICAgIGVycm9yID0gTlVMTDsKQEAgLTEzNzIsMjIgKzE2NTYsMTUgQEAKICAgICAgICAgcHJpbnRmICgiICByZXN1bHRcbkZBSUxVUkVcbiIpOwogICAgICAgICBmYWlsX2NvdW50Kys7CiAKLSAgICAgICAgaWYgKHhjZXB0aW9uICE9IE5VTEwpIHsKLSAgICAgICAgICBnX29iamVjdF91bnJlZiAoeGNlcHRpb24pOwotICAgICAgICAgIHhjZXB0aW9uID0gTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh4Y2VwdGlvbjIgIT0gTlVMTCkgewotICAgICAgICAgIGdfb2JqZWN0X3VucmVmICh4Y2VwdGlvbjIpOwotICAgICAgICAgIHhjZXB0aW9uID0gTlVMTDsKLSAgICAgICAgfQorICAgICAgICBnX2NsZWFyX29iamVjdCAoJnhjZXB0aW9uKTsKKyAgICAgICAgZ19jbGVhcl9vYmplY3QgKCZ4Y2VwdGlvbjIpOwogCiAgICAgICAgIGlmIChlcnJvciAhPSBOVUxMKSB7CiAgICAgICAgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CiAgICAgICAgICAgZXJyb3IgPSBOVUxMOwogICAgICAgICB9CiAgICAgICB9Ci0gICAgICBnX29iamVjdF91bnJlZiAoeHRydWN0X2luKTsKKyAgICAgIGdfY2xlYXJfb2JqZWN0ICgmeHRydWN0X2luKTsKIAogICAgICAgcHJpbnRmICgidGVzdENsaWVudC50ZXN0TXVsdGlFeGNlcHRpb24oXCJzdWNjZXNzXCIsIFwidGVzdCAzXCIpID0+Iik7CiAgICAgICB4dHJ1Y3RfaW4gPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX1hUUlVDVCwgTlVMTCk7CkBAIC0xNDEwLDIyICsxNjg3LDE1IEBACiAgICAgICAgIHByaW50ZiAoIiAgcmVzdWx0XG5GQUlMVVJFXG4iKTsKICAgICAgICAgZmFpbF9jb3VudCsrOwogCi0gICAgICAgIGlmICh4Y2VwdGlvbiAhPSBOVUxMKSB7Ci0gICAgICAgICAgZ19vYmplY3RfdW5yZWYgKHhjZXB0aW9uKTsKLSAgICAgICAgICB4Y2VwdGlvbiA9IE5VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoeGNlcHRpb24yICE9IE5VTEwpIHsKLSAgICAgICAgICBnX29iamVjdF91bnJlZiAoeGNlcHRpb24yKTsKLSAgICAgICAgICB4Y2VwdGlvbiA9IE5VTEw7Ci0gICAgICAgIH0KKyAgICAgICAgZ19jbGVhcl9vYmplY3QgKCZ4Y2VwdGlvbik7CisgICAgICAgIGdfY2xlYXJfb2JqZWN0ICgmeGNlcHRpb24yKTsKIAogICAgICAgICBpZiAoZXJyb3IgIT0gTlVMTCkgewogICAgICAgICAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOwogICAgICAgICAgIGVycm9yID0gTlVMTDsKICAgICAgICAgfQogICAgICAgfQotICAgICAgZ19vYmplY3RfdW5yZWYgKHh0cnVjdF9pbik7CisgICAgICBnX2NsZWFyX29iamVjdCAoJnh0cnVjdF9pbik7CiAKICAgICAgIC8qIHRlc3Qgb25ld2F5IHZvaWQgKi8KICAgICAgIHByaW50ZiAoInRlc3RDbGllbnQudGVzdE9uZXdheSgxKSA9PiIpOwpAQCAtMTUxMSw2ICsxNzgxLDcgQEAKIAogICAvKiBBbGwgZG9uZS0tLW91dHB1dCBzdGF0aXN0aWNzICovCiAgIHB1dHMgKCJcbkFsbCB0ZXN0cyBkb25lLiIpOworICBwcmludGYoIk51bWJlciBvZiBmYWlsdXJlczogJWRcbiIsIGZhaWxfY291bnQpOwogCiAgIHRpbWVfYXZnX3VzZWMgPSB0aW1lX3RvdGFsX3VzZWMgLyBudW1fdGVzdHM7CiAKQEAgLTE1MTgsMTAgKzE3ODksMTYgQEAKICAgcHJpbnRmICgiTWF4IHRpbWU6ICUiIFBSSXU2NCAiIHVzXG4iLCB0aW1lX21heF91c2VjKTsKICAgcHJpbnRmICgiQXZnIHRpbWU6ICUiIFBSSXU2NCAiIHVzXG4iLCB0aW1lX2F2Z191c2VjKTsKIAotICBnX29iamVjdF91bnJlZiAodGVzdF9jbGllbnQpOwotICBnX29iamVjdF91bnJlZiAocHJvdG9jb2wpOwotICBnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsKLSAgZ19mcmVlIChob3N0KTsKKyAgZ19jbGVhcl9vYmplY3QoJnNlY29uZF9zZXJ2aWNlKTsKKyAgZ19jbGVhcl9vYmplY3QoJnByb3RvY29sMik7CisgIGdfY2xlYXJfb2JqZWN0KCZ0ZXN0X2NsaWVudCk7CisgIGdfY2xlYXJfb2JqZWN0KCZwcm90b2NvbCk7CisgIGdfY2xlYXJfb2JqZWN0KCZ0cmFuc3BvcnQpOworICBnX2NsZWFyX29iamVjdCgmc29ja2V0KTsKKworICBpZiAoc3NsKSB7CisgICAgdGhyaWZ0X3NzbF9zb2NrZXRfZmluYWxpemVfb3BlbnNzbCgpOworICB9CiAKICAgcmV0dXJuIGZhaWxfY291bnQ7CiB9CmRpZmYgLS1naXQgYS90ZXN0L2NfZ2xpYi9zcmMvdGVzdF9zZXJ2ZXIuYyBiL3Rlc3QvY19nbGliL3NyYy90ZXN0X3NlcnZlci5jCmluZGV4IDEzZWVjMjcuLjJkNzE2ZWMgMTAwNjQ0Ci0tLSBhL3Rlc3QvY19nbGliL3NyYy90ZXN0X3NlcnZlci5jCisrKyBiL3Rlc3QvY19nbGliL3NyYy90ZXN0X3NlcnZlci5jCkBAIC0yMyw3ICsyMyw5IEBACiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAKICNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfZmFjdG9yeS5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZmFjdG9yeS5oPgogI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvc2VydmVyL3RocmlmdF9zZXJ2ZXIuaD4KICNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3NlcnZlci90aHJpZnRfc2ltcGxlX3NlcnZlci5oPgogI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnQuaD4KQEAgLTM2LDggKzM4LDEwIEBACiAjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydF9mYWN0b3J5Lmg+CiAKICNpbmNsdWRlICIuLi9nZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdC5oIgorI2luY2x1ZGUgIi4uL2dlbi1jX2dsaWIvdF90ZXN0X3NlY29uZF9zZXJ2aWNlLmgiCiAKICNpbmNsdWRlICJ0aHJpZnRfdGVzdF9oYW5kbGVyLmgiCisjaW5jbHVkZSAidGhyaWZ0X3NlY29uZF9zZXJ2aWNlX2hhbmRsZXIuaCIKIAogLyogT3VyIHNlcnZlciBvYmplY3QsIGRlY2xhcmVkIGdsb2JhbGx5IHNvIGl0IGlzIGFjY2Vzc2libGUgd2l0aGluIHRoZSBTSUdJTlQKICAgIHNpZ25hbCBoYW5kbGVyICovCkBAIC02OCw2ICs3Miw4IEBACiAgIHN0YXRpYyBnY2hhciAqc2VydmVyX3R5cGVfb3B0aW9uID0gTlVMTDsKICAgc3RhdGljIGdjaGFyICp0cmFuc3BvcnRfb3B0aW9uID0gTlVMTDsKICAgc3RhdGljIGdjaGFyICpwcm90b2NvbF9vcHRpb24gPSBOVUxMOworICBzdGF0aWMgZ2ludCAgIHN0cmluZ19saW1pdCA9IDA7CisgIHN0YXRpYyBnaW50ICAgY29udGFpbmVyX2xpbWl0ID0gMDsKIAogICBzdGF0aWMKICAgICBHT3B0aW9uRW50cnkgb3B0aW9uX2VudHJpZXNbXSA9IHsKQEAgLTc4LDcgKzg0LDExIEBACiAgICAgeyAidHJhbnNwb3J0IiwgICAgICAgMCwgMCwgR19PUFRJT05fQVJHX1NUUklORywgICAmdHJhbnNwb3J0X29wdGlvbiwKICAgICAgICJUcmFuc3BvcnQ6IGJ1ZmZlcmVkLCBmcmFtZWQgKD1idWZmZXJlZCkiLCBOVUxMIH0sCiAgICAgeyAicHJvdG9jb2wiLCAgICAgICAgMCwgMCwgR19PUFRJT05fQVJHX1NUUklORywgICAmcHJvdG9jb2xfb3B0aW9uLAotICAgICAgIlByb3RvY29sOiBiaW5hcnkgKD1iaW5hcnkpIiwgTlVMTCB9LAorICAgICAgIlByb3RvY29sOiBiaW5hcnksIGNvbXBhY3QgKD1iaW5hcnkpIiwgTlVMTCB9LAorICAgIHsgInN0cmluZy1saW1pdCIsICAgIDAsIDAsIEdfT1BUSU9OX0FSR19JTlQsICAgICAgJnN0cmluZ19saW1pdCwKKyAgICAgICJNYXggc3RyaW5nIGxlbmd0aCAoPW5vbmUpIiwgTlVMTCB9LAorICAgIHsgImNvbnRhaW5lci1saW1pdCIsIDAsIDAsIEdfT1BUSU9OX0FSR19JTlQsICAgICAgJmNvbnRhaW5lcl9saW1pdCwKKyAgICAgICJNYXggY29udGFpbmVyIGxlbmd0aCAoPW5vbmUpIiwgTlVMTCB9LAogICAgIHsgTlVMTCB9CiAgIH07CiAKQEAgLTg5LDcgKzk5LDEwIEBACiAgIEdUeXBlICBwcm90b2NvbF9mYWN0b3J5X3R5cGUgID0gVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MX0ZBQ1RPUlk7CiAKICAgVFRlc3RUaHJpZnRUZXN0SGFuZGxlciAqaGFuZGxlcjsKKyAgVFRlc3RUaHJpZnRUZXN0SGFuZGxlciAqaGFuZGxlcl9zZWNvbmRfc2VydmljZSA9IE5VTEw7CiAgIFRocmlmdFByb2Nlc3NvciAgICAgICAgKnByb2Nlc3NvcjsKKyAgVGhyaWZ0UHJvY2Vzc29yICAgICAgICAqcHJvY2Vzc29yX3Rlc3QgPSBOVUxMOworICBUaHJpZnRQcm9jZXNzb3IgICAgICAgICpwcm9jZXNzb3Jfc2Vjb25kX3NlcnZpY2UgPSBOVUxMOwogICBUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgICpzZXJ2ZXJfdHJhbnNwb3J0OwogICBUaHJpZnRUcmFuc3BvcnRGYWN0b3J5ICp0cmFuc3BvcnRfZmFjdG9yeTsKICAgVGhyaWZ0UHJvdG9jb2xGYWN0b3J5ICAqcHJvdG9jb2xfZmFjdG9yeTsKQEAgLTEyNiwxMCArMTM5LDIyIEBACiAgICAgb3B0aW9uc192YWxpZCA9IEZBTFNFOwogICB9CiAKLSAgaWYgKHByb3RvY29sX29wdGlvbiAhPSBOVUxMICYmCi0gICAgICBzdHJuY21wIChwcm90b2NvbF9vcHRpb24sICJiaW5hcnkiLCA3KSAhPSAwKSB7Ci0gICAgZnByaW50ZiAoc3RkZXJyLCAiVW5rbm93biBwcm90b2NvbCB0eXBlICVzXG4iLCBwcm90b2NvbF9vcHRpb24pOwotICAgIG9wdGlvbnNfdmFsaWQgPSBGQUxTRTsKKyAgaWYgKHByb3RvY29sX29wdGlvbiAhPSBOVUxMKSB7CisgICAgaWYgKHN0cm5jbXAgKHByb3RvY29sX29wdGlvbiwgImNvbXBhY3QiLCA4KSA9PSAwKSB7CisgICAgICBwcm90b2NvbF9mYWN0b3J5X3R5cGUgPSBUSFJJRlRfVFlQRV9DT01QQUNUX1BST1RPQ09MX0ZBQ1RPUlk7CisgICAgICBwcm90b2NvbF9uYW1lID0gImNvbXBhY3QiOworICAgIH0KKyAgICBlbHNlIGlmIChzdHJuY21wIChwcm90b2NvbF9vcHRpb24sICJtdWx0aSIsIDYpID09IDApIHsKKwlwcm90b2NvbF9uYW1lID0gImJpbmFyeTptdWx0aSI7CisgICAgfQorICAgIGVsc2UgaWYgKHN0cm5jbXAgKHByb3RvY29sX29wdGlvbiwgIm11bHRpYyIsIDcpID09IDApIHsKKwlwcm90b2NvbF9mYWN0b3J5X3R5cGUgPSBUSFJJRlRfVFlQRV9DT01QQUNUX1BST1RPQ09MX0ZBQ1RPUlk7CisJcHJvdG9jb2xfbmFtZSA9ICJjb21wYWN0Om11bHRpYyI7CisgICAgfQorICAgIGVsc2UgaWYgKHN0cm5jbXAgKHByb3RvY29sX29wdGlvbiwgImJpbmFyeSIsIDcpICE9IDApIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIlVua25vd24gcHJvdG9jb2wgdHlwZSAlc1xuIiwgcHJvdG9jb2xfb3B0aW9uKTsKKyAgICAgIG9wdGlvbnNfdmFsaWQgPSBGQUxTRTsKKyAgICB9CiAgIH0KIAogICBpZiAodHJhbnNwb3J0X29wdGlvbiAhPSBOVUxMKSB7CkBAIC0xNDksMTYgKzE3NCw2NSBAQAogICAvKiBFc3RhYmxpc2ggYWxsIG91ciBjb25uZWN0aW9uIG9iamVjdHMgKi8KICAgaGFuZGxlciAgICAgICAgICAgPSBnX29iamVjdF9uZXcgKFRZUEVfVEhSSUZUX1RFU1RfSEFORExFUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwotICBwcm9jZXNzb3IgICAgICAgICA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfVEhSSUZUX1RFU1RfUFJPQ0VTU09SLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImhhbmRsZXIiLCBoYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKworCisgIGlmKHN0cnN0cihwcm90b2NvbF9uYW1lLCAiOm11bHRpIikpeworICAgICAgLyogV2hlbiBhIG11bHRpcGxleGVkIHByb2Nlc3NvciBpcyBpbnZvbHZlZCB0aGUgaGFuZGxlciBpcyBub3QKKyAgICAgICAgIHJlZ2lzdGVyZWQgYXMgdXN1YWwuIFdlIGNyZWF0ZSB0aGUgcHJvY2Vzc29yIGFuZCB0aGUgcmVhbAorICAgICAgICAgcHJvY2Vzc29yIGlzIHJlZ2lzdGVyZWQuIE11bHRpcGxlIHByb2Nlc3NvcnMgY2FuIGJlIHJlZ2lzdGVyZWQKKyAgICAgICAgIGF0IG9uY2UuIFRoaXMgaXMgd2h5IHdlIGRvbid0IGhhdmUgYSBjb25zdHJ1Y3RvciBwcm9wZXJ0eSAqLworICAgICAgcHJvY2Vzc29yID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9NVUxUSVBMRVhFRF9QUk9DRVNTT1IsCisJCQkJCSBOVUxMKTsKKworICAgICAgaGFuZGxlcl9zZWNvbmRfc2VydmljZSA9IGdfb2JqZWN0X25ldyAoVFlQRV9TRUNPTkRfU0VSVklDRV9IQU5ETEVSLAorICAgICAJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgICAgIHByb2Nlc3Nvcl90ZXN0ID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9USFJJRlRfVEVTVF9QUk9DRVNTT1IsCisJCQkJICAgICJoYW5kbGVyIiwgaGFuZGxlciwKKwkJCQkgICAgTlVMTCk7CisgICAgICBwcm9jZXNzb3Jfc2Vjb25kX3NlcnZpY2UgPSAgIGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfU0VDT05EX1NFUlZJQ0VfUFJPQ0VTU09SLAorCQkJCSAgICAiaGFuZGxlciIsIGhhbmRsZXJfc2Vjb25kX3NlcnZpY2UsCisJCQkJICAgIE5VTEwpOworCisgICAgICAvKiBXZSByZWdpc3RlciBhIHRlc3QgcHJvY2Vzc29yIHdpdGggTXVsdGlwbGV4ZWQgbmFtZSBUaHJpZnRUZXN0ICovCisgICAgICBpZighdGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvcl9yZWdpc3Rlcl9wcm9jZXNzb3IocHJvY2Vzc29yLAorCQkJCQkJICAgICAgIlRocmlmdFRlc3QiLCBwcm9jZXNzb3JfdGVzdCwKKwkJCQkJCSAgICAgICZlcnJvcikpeworCSAgICBnX21lc3NhZ2UgKCJ0aHJpZnRfc2VydmVyX3NlcnZlOiAlcyIsCisJICAgICAgICAgICAgICAgZXJyb3IgIT0gTlVMTCA/IGVycm9yLT5tZXNzYWdlIDogIihudWxsKSIpOworCSAgICBnX2NsZWFyX2Vycm9yICgmZXJyb3IpOworICAgICAgfQorICAgICAgLyogV2UgcmVnaXN0ZXIgYSBzZWNvbmQgdGVzdCBwcm9jZXNzb3Igd2l0aCBNdWx0aXBsZXhlZCBuYW1lIFNlY29uZFNlcnZpY2UKKyAgICAgICAqIHdlIGFyZSByZXNwb25zaWJsZSBvZiBmcmVlaW5nIHRoZSBwcm9jZXNzb3Igd2hlbiBpdCdzIG5vdCB1c2VkIGFueW1vcmUgKi8KKyAgICAgIGlmKCF0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX3JlZ2lzdGVyX3Byb2Nlc3Nvcihwcm9jZXNzb3IsCisJCQkJCQkgICAgICAiU2Vjb25kU2VydmljZSIsIHByb2Nlc3Nvcl9zZWNvbmRfc2VydmljZSwKKwkJCQkJCSAgICAgICZlcnJvcikpeworCSAgICBnX21lc3NhZ2UgKCJ0aHJpZnRfc2VydmVyX3NlcnZlOiAlcyIsCisJICAgICAgICAgICAgICAgZXJyb3IgIT0gTlVMTCA/IGVycm9yLT5tZXNzYWdlIDogIihudWxsKSIpOworCSAgICBnX2NsZWFyX2Vycm9yICgmZXJyb3IpOworICAgICAgfQorCisgIH1lbHNleworICAgICAgcHJvY2Vzc29yID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9USFJJRlRfVEVTVF9QUk9DRVNTT1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImhhbmRsZXIiLCBoYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICB9CiAgIHNlcnZlcl90cmFuc3BvcnQgID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TRVJWRVJfU09DS0VULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQiLCBwb3J0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CiAgIHRyYW5zcG9ydF9mYWN0b3J5ID0gZ19vYmplY3RfbmV3ICh0cmFuc3BvcnRfZmFjdG9yeV90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0gIHByb3RvY29sX2ZhY3RvcnkgID0gZ19vYmplY3RfbmV3IChwcm90b2NvbF9mYWN0b3J5X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICBpZiAoc3Ryc3RyIChwcm90b2NvbF9uYW1lLCAiY29tcGFjdCIpICE9IE5VTEwpIHsKKyAgICBwcm90b2NvbF9mYWN0b3J5ICA9IGdfb2JqZWN0X25ldyAocHJvdG9jb2xfZmFjdG9yeV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RyaW5nX2xpbWl0Iiwgc3RyaW5nX2xpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udGFpbmVyX2xpbWl0IiwgY29udGFpbmVyX2xpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgfSBlbHNlIHsKKyAgICBwcm90b2NvbF9mYWN0b3J5ICA9IGdfb2JqZWN0X25ldyAocHJvdG9jb2xfZmFjdG9yeV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgfQogCiAgIHNlcnZlciA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU0lNUExFX1NFUlZFUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvY2Vzc29yIiwgICAgICAgICAgICAgICAgcHJvY2Vzc29yLApAQCAtMjAyLDYgKzI3NiwxNSBAQAogICBnX29iamVjdF91bnJlZiAoc2VydmVyX3RyYW5zcG9ydCk7CiAgIGdfb2JqZWN0X3VucmVmIChwcm9jZXNzb3IpOwogICBnX29iamVjdF91bnJlZiAoaGFuZGxlcik7CisgIGlmKGhhbmRsZXJfc2Vjb25kX3NlcnZpY2UpeworICAgICAgZ19vYmplY3RfdW5yZWYgKGhhbmRsZXJfc2Vjb25kX3NlcnZpY2UpOworICB9CisgIGlmKHByb2Nlc3Nvcl90ZXN0KXsKKyAgICAgIGdfb2JqZWN0X3VucmVmIChwcm9jZXNzb3JfdGVzdCk7CisgIH0KKyAgaWYocHJvY2Vzc29yX3NlY29uZF9zZXJ2aWNlKXsKKyAgICAgIGdfb2JqZWN0X3VucmVmIChwcm9jZXNzb3Jfc2Vjb25kX3NlcnZpY2UpOworICB9CiAKICAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS90ZXN0L2NfZ2xpYi9zcmMvdGhyaWZ0X3NlY29uZF9zZXJ2aWNlX2hhbmRsZXIuYyBiL3Rlc3QvY19nbGliL3NyYy90aHJpZnRfc2Vjb25kX3NlcnZpY2VfaGFuZGxlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2YWM3YmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NfZ2xpYi9zcmMvdGhyaWZ0X3NlY29uZF9zZXJ2aWNlX2hhbmRsZXIuYwpAQCAtMCwwICsxLDY5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb24uaD4KKworI2luY2x1ZGUgInRocmlmdF9zZWNvbmRfc2VydmljZV9oYW5kbGVyLmgiCisKKy8qIEEgaGFuZGxlciB0aGF0IGltcGxlbWVudHMgdGhlIFRUZXN0U2Vjb25kU2VydmljZUlmIGludGVyZmFjZSAqLworCitHX0RFRklORV9UWVBFIChTZWNvbmRTZXJ2aWNlSGFuZGxlciwKKyAgICAgICAgICAgICAgIHNlY29uZF9zZXJ2aWNlX2hhbmRsZXIsCisJICAgICAgIFRfVEVTVF9UWVBFX1NFQ09ORF9TRVJWSUNFX0hBTkRMRVIpOworCisKK2dib29sZWFuCitzZWNvbmRfc2VydmljZV9oYW5kbGVyX3NlY29uZHRlc3Rfc3RyaW5nIChUVGVzdFNlY29uZFNlcnZpY2VJZiAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NoYXIgICAgICAgICAgICAgKipfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgICAgICAgICp0aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAgICAgICoqZXJyb3IpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChpZmFjZSk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIGdjaGFyIGJ1ZmZlclsyNTZdOworCisgIHByaW50ZiAoInRlc3RTZWNvbmRTZXJ2aWNlTXVsdGlwbGV4U2Vjb25kVGVzdFN0cmluZyhcIiVzXCIpXG4iLCB0aGluZyk7CisgIHNucHJpbnRmKGJ1ZmZlciwgMjU1LCAidGVzdFN0cmluZyhcIiVzXCIpIiwgdGhpbmcpOworICAqX3JldHVybiA9IGdfc3RyZHVwIChidWZmZXIpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorc2Vjb25kX3NlcnZpY2VfaGFuZGxlcl9pbml0IChTZWNvbmRTZXJ2aWNlSGFuZGxlciAqc2VsZikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHNlbGYpOworfQorCitzdGF0aWMgdm9pZAorc2Vjb25kX3NlcnZpY2VfaGFuZGxlcl9jbGFzc19pbml0IChTZWNvbmRTZXJ2aWNlSGFuZGxlckNsYXNzICprbGFzcykKK3sKKyAgVFRlc3RTZWNvbmRTZXJ2aWNlSGFuZGxlckNsYXNzICpiYXNlX2NsYXNzID0KKyAgICAgIFRfVEVTVF9TRUNPTkRfU0VSVklDRV9IQU5ETEVSX0NMQVNTIChrbGFzcyk7CisKKworICBiYXNlX2NsYXNzLT5zZWNvbmR0ZXN0X3N0cmluZyA9CisgICAgICBzZWNvbmRfc2VydmljZV9oYW5kbGVyX3NlY29uZHRlc3Rfc3RyaW5nOworCit9CmRpZmYgLS1naXQgYS90ZXN0L2NfZ2xpYi9zcmMvdGhyaWZ0X3NlY29uZF9zZXJ2aWNlX2hhbmRsZXIuaCBiL3Rlc3QvY19nbGliL3NyYy90aHJpZnRfc2Vjb25kX3NlcnZpY2VfaGFuZGxlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiZTA0OGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NfZ2xpYi9zcmMvdGhyaWZ0X3NlY29uZF9zZXJ2aWNlX2hhbmRsZXIuaApAQCAtMCwwICsxLDczIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1NFQ09ORF9TRVJWSUNFX0hBTkRMRVJfSAorI2RlZmluZSBfU0VDT05EX1NFUlZJQ0VfSEFORExFUl9ICisKKyNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICIuLi9nZW4tY19nbGliL3RfdGVzdF9zZWNvbmRfc2VydmljZS5oIgorCitHX0JFR0lOX0RFQ0xTCisKKy8qIEEgaGFuZGxlciB0aGF0IGltcGxlbWVudHMgdGhlIFRUZXN0U2Vjb25kU2VydmljZUlmIGludGVyZmFjZSAqLworCisjZGVmaW5lIFRZUEVfU0VDT05EX1NFUlZJQ0VfSEFORExFUiAoc2Vjb25kX3NlcnZpY2VfaGFuZGxlcl9nZXRfdHlwZSAoKSkKKworI2RlZmluZSBTRUNPTkRfU0VSVklDRV9IQU5ETEVSKG9iaikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFlQRV9TRUNPTkRfU0VSVklDRV9IQU5ETEVSLCAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlY29uZFNlcnZpY2VIYW5kbGVyKSkKKyNkZWZpbmUgSVNfU0VDT05EX1NFUlZJQ0VfSEFORExFUihvYmopICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRZUEVfU0VDT05EX1NFUlZJQ0VfSEFORExFUikpCisjZGVmaW5lIFNFQ09ORF9TRVJWSUNFX0hBTkRMRVJfQ0xBU1MoYykgICAgICAgICAgICAgICAgICAgIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRZUEVfU0VDT05EX1NFUlZJQ0VfSEFORExFUiwgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2Vjb25kU2VydmljZUhhbmRsZXJDbGFzcykpCisjZGVmaW5lIElTX1NFQ09ORF9TRVJWSUNFX0hBTkRMRVJfQ0xBU1MoYykgICAgICAgICAgICAgICAgIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRZUEVfU0VDT05EX1NFUlZJQ0VfSEFORExFUikpCisjZGVmaW5lIFNFQ09ORF9TRVJWSUNFX0hBTkRMRVJfR0VUX0NMQVNTKG9iaikgICAgICAgICAgICAgIFwKKyAgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFlQRV9TRUNPTkRfU0VSVklDRV9IQU5ETEVSLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWNvbmRTZXJ2aWNlSGFuZGxlckNsYXNzKSkKKwordHlwZWRlZiBzdHJ1Y3QgX1NlY29uZFNlcnZpY2VIYW5kbGVyIFNlY29uZFNlcnZpY2VIYW5kbGVyOwordHlwZWRlZiBzdHJ1Y3QgX1NlY29uZFNlcnZpY2VIYW5kbGVyQ2xhc3MgU2Vjb25kU2VydmljZUhhbmRsZXJDbGFzczsKKworc3RydWN0IF9TZWNvbmRTZXJ2aWNlSGFuZGxlciB7CisgIFRUZXN0U2Vjb25kU2VydmljZUhhbmRsZXIgcGFyZW50OworfTsKKworc3RydWN0IF9TZWNvbmRTZXJ2aWNlSGFuZGxlckNsYXNzIHsKKyAgVFRlc3RTZWNvbmRTZXJ2aWNlSGFuZGxlckNsYXNzIHBhcmVudDsKKworfTsKKworLyogVXNlZCBieSBTRUNPTkRfU0VSVklDRV9IQU5ETEVSX0dFVF9UWVBFICovCitHVHlwZSBzZWNvbmRfc2VydmljZV9oYW5kbGVyX2dldF90eXBlICh2b2lkKTsKKworZ2Jvb2xlYW4gc2Vjb25kX3NlcnZpY2VfaGFuZGxlcl9ibGFoX2JsYWggKFRUZXN0U2Vjb25kU2VydmljZUlmICppZmFjZSwgR0Vycm9yICoqZXJyb3IpOworZ2Jvb2xlYW4gc2Vjb25kX3NlcnZpY2VfaGFuZGxlcl9zZWNvbmR0ZXN0X3N0cmluZyAgICAgICAgICAoVFRlc3RTZWNvbmRTZXJ2aWNlSWYgKmlmYWNlLCBnY2hhciAqKiBfcmV0dXJuLCBjb25zdCBnY2hhciAqIHRoaW5nLCBHRXJyb3IgKiplcnJvcik7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfU0VDT05EX1NFUlZJQ0VfSEFORExFUl9IICovCmRpZmYgLS1naXQgYS90ZXN0L2NfZ2xpYi9zcmMvdGhyaWZ0X3Rlc3RfaGFuZGxlci5jIGIvdGVzdC9jX2dsaWIvc3JjL3RocmlmdF90ZXN0X2hhbmRsZXIuYwppbmRleCA1OTZlNjE1Li4xZDhiY2IyIDEwMDY0NAotLS0gYS90ZXN0L2NfZ2xpYi9zcmMvdGhyaWZ0X3Rlc3RfaGFuZGxlci5jCisrKyBiL3Rlc3QvY19nbGliL3NyYy90aHJpZnRfdGVzdF9oYW5kbGVyLmMKQEAgLTYwLDYgKzYwLDIxIEBACiB9CiAKIGdib29sZWFuCit0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3RfYm9vbCAoVFRlc3RUaHJpZnRUZXN0SWYgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnYm9vbGVhbiAgICAgICAgICAgKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2Jvb2xlYW4gICAgICB0aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAqKmVycm9yKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAoaWZhY2UpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworCisgIHByaW50ZiAoInRlc3RCb29sKCVzKVxuIiwgdGhpbmcgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgKl9yZXR1cm4gPSB0aGluZzsKKworICByZXR1cm4gVFJVRTsKK30KKworZ2Jvb2xlYW4KIHRocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF9ieXRlIChUVGVzdFRocmlmdFRlc3RJZiAgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbnQ4ICAgICAgICAgICAgICAqX3JldHVybiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnaW50OCAgICAgICAgIHRoaW5nLApAQCAtMTE5LDYgKzEzNCwyMiBAQAogICByZXR1cm4gVFJVRTsKIH0KIAorZ2Jvb2xlYW4gCit0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3RfYmluYXJ5IChUVGVzdFRocmlmdFRlc3RJZiAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQnl0ZUFycmF5ICoqIF9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHQnl0ZUFycmF5ICogdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGlmYWNlKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKworICBwcmludGYgKCJ0ZXN0QmluYXJ5KClcbiIpOyAgLy8gVE9ETzogaGV4IG91dHB1dAorICBnX2J5dGVfYXJyYXlfcmVmKChHQnl0ZUFycmF5ICopdGhpbmcpOworICAqX3JldHVybiA9IChHQnl0ZUFycmF5ICopdGhpbmc7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKIGdib29sZWFuCiB0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3Rfc3RydWN0IChUVGVzdFRocmlmdFRlc3RJZiAgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRlc3RYdHJ1Y3QgICAgICAgKipfcmV0dXJuLApAQCAtNDQyLDggKzQ3Myw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUZXN0SW5zYW5pdHkgICphcmd1bWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgICAqKmVycm9yKQogewotICBUVGVzdFh0cnVjdCAqaGVsbG87Ci0gIFRUZXN0WHRydWN0ICpnb29kYnllOwogICBUVGVzdFh0cnVjdCAqeHRydWN0X2luOwogCiAgIGdjaGFyICpzdHJpbmdfdGhpbmcgPSBOVUxMOwpAQCAtNDUzLDcgKzQ4Miw2IEBACiAKICAgR1B0ckFycmF5ICp4dHJ1Y3RzOwogCi0gIFRUZXN0SW5zYW5pdHkgKmNyYXp5OwogICBUVGVzdEluc2FuaXR5ICpsb29uZXk7CiAKICAgR0hhc2hUYWJsZSAqdXNlcl9tYXA7CkBAIC00NzIsNTAgKzUwMCwxMCBAQAogICBndWludCBpOwogCiAgIFRIUklGVF9VTlVTRURfVkFSIChpZmFjZSk7Ci0gIFRIUklGVF9VTlVTRURfVkFSIChhcmd1bWVudCk7CiAgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CiAKICAgcHJpbnRmICgidGVzdEluc2FuaXR5KClcbiIpOwogCi0gIGhlbGxvID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9YVFJVQ1QsCi0gICAgICAgICAgICAgICAgICAgICAgICAic3RyaW5nX3RoaW5nIiwgIkhlbGxvMiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiYnl0ZV90aGluZyIsICAgMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJpMzJfdGhpbmciLCAgICAyLAotICAgICAgICAgICAgICAgICAgICAgICAgImk2NF90aGluZyIsICAgIDIsCi0gICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKLQotICBnb29kYnllID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9YVFJVQ1QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJzdHJpbmdfdGhpbmciLCAiR29vZGJ5ZTQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiYnl0ZV90aGluZyIsICAgNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgImkzMl90aGluZyIsICAgIDQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJpNjRfdGhpbmciLCAgICA0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKLQotICBjcmF6eSA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfSU5TQU5JVFksIE5VTEwpOwotICBnX29iamVjdF9nZXQgKGNyYXp5LAotICAgICAgICAgICAgICAgICJ1c2VyTWFwIiwgJnVzZXJfbWFwLAotICAgICAgICAgICAgICAgICJ4dHJ1Y3RzIiwgJnh0cnVjdHMsCi0gICAgICAgICAgICAgICAgTlVMTCk7Ci0KLSAgdXNlcl9pZCA9IGdfbWFsbG9jKHNpemVvZiAqdXNlcl9pZCk7Ci0gICp1c2VyX2lkID0gODsKLSAgZ19oYXNoX3RhYmxlX2luc2VydCAodXNlcl9tYXAsCi0gICAgICAgICAgICAgICAgICAgICAgIEdJTlRfVE9fUE9JTlRFUiAoVF9URVNUX05VTUJFUlpfRUlHSFQpLAotICAgICAgICAgICAgICAgICAgICAgICB1c2VyX2lkKTsKLQotICBnX3B0cl9hcnJheV9hZGQgKHh0cnVjdHMsIGdvb2RieWUpOwotCi0gIHVzZXJfaWQgPSBnX21hbGxvYyhzaXplb2YgKnVzZXJfaWQpOwotICAqdXNlcl9pZCA9IDU7Ci0gIGdfaGFzaF90YWJsZV9pbnNlcnQgKHVzZXJfbWFwLAotICAgICAgICAgICAgICAgICAgICAgICBHSU5UX1RPX1BPSU5URVIgKFRfVEVTVF9OVU1CRVJaX0ZJVkUpLAotICAgICAgICAgICAgICAgICAgICAgICB1c2VyX2lkKTsKLQotICBnX3B0cl9hcnJheV9hZGQgKHh0cnVjdHMsIGhlbGxvKTsKLQotICBnX2hhc2hfdGFibGVfdW5yZWYgKHVzZXJfbWFwKTsKLSAgZ19wdHJfYXJyYXlfdW5yZWYgKHh0cnVjdHMpOwotCiAgIGZpcnN0X21hcCA9IGdfaGFzaF90YWJsZV9uZXdfZnVsbCAoZ19kaXJlY3RfaGFzaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnX2RpcmVjdF9lcXVhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLApAQCAtNTI3LDE3ICs1MTUsMjEgQEAKIAogICBnX2hhc2hfdGFibGVfaW5zZXJ0IChmaXJzdF9tYXAsCiAgICAgICAgICAgICAgICAgICAgICAgIEdJTlRfVE9fUE9JTlRFUiAoVF9URVNUX05VTUJFUlpfVFdPKSwKLSAgICAgICAgICAgICAgICAgICAgICAgY3JhenkpOworICAgICAgICAgICAgICAgICAgICAgICAoZ3BvaW50ZXIpYXJndW1lbnQpOwogICBnX2hhc2hfdGFibGVfaW5zZXJ0IChmaXJzdF9tYXAsCiAgICAgICAgICAgICAgICAgICAgICAgIEdJTlRfVE9fUE9JTlRFUiAoVF9URVNUX05VTUJFUlpfVEhSRUUpLAotICAgICAgICAgICAgICAgICAgICAgICBjcmF6eSk7CisgICAgICAgICAgICAgICAgICAgICAgIChncG9pbnRlcilhcmd1bWVudCk7CiAKLSAgLyogSW5jcmVtZW50IGNyYXp5J3MgcmVmIGNvdW50IHNpbmNlIGZpcnN0X21hcCBub3cgaG9sZHMgdHdvCi0gICAgIHJlZmVyZW5jZXMgdG8gaXQgYW5kIHdvdWxkIG90aGVyd2lzZSBhdHRlbXB0IHRvIGRlYWxsb2NhdGUgaXQKLSAgICAgdHdpY2UgZHVyaW5nIGRlc3RydWN0aW9uLiBXZSBkbyB0aGlzIGluc3RlYWQgb2YgY3JlYXRpbmcgYSBjb3B5Ci0gICAgIG9mIGNyYXp5IGluIG9yZGVyIHRvIG1pbWljIHRoZSBDKysgaW1wbGVtZW50YXRpb24gKGFuZCBzaW5jZSwKLSAgICAgZnJhbmtseSwgdGhlIHdvcmxkIG5lZWRzIGxlc3MgY3JhenksIG5vdCBtb3JlKS4gKi8KLSAgZ19vYmplY3RfcmVmIChjcmF6eSk7CisgIC8qIEluY3JlbWVudCBhcmd1bWVudCdzIHJlZiBjb3VudCBieSB0d28gYmVjYXVzZSBmaXJzdF9tYXAgbm93IGhvbGRzCisgICAgIHR3byByZWZlcmVuY2VzIHRvIGl0IGFuZCB0aGUgY2FsbGVyIGlzIG5vdCBhd2FyZSB3ZSBoYXZlIG1hZGUgYW55CisgICAgIGFkZGl0aW9uYWwgcmVmZXJlbmNlcyB0byBhcmd1bWVudC4gIChUaGF0IGlzLCBjYWxsZXIgb3ducyBhcmd1bWVudAorICAgICBhbmQgd2lsbCB1bnJlZiBpdCBleHBsaWNpdGx5IGluIGFkZGl0aW9uIHRvIHVucmVmLWluZyAqX3JldHVybi4pCisKKyAgICAgV2UgZG8gdGhpcyBpbnN0ZWFkIG9mIGNyZWF0aW5nIGEgY29weSBvZiBhcmd1bWVudCBpbiBvcmRlciB0byBtaW1pYworICAgICB0aGUgQysrIGltcGxlbWVudGF0aW9uIChhbmQgc2luY2UsIGZyYW5rbHksIHRoZSB3b3JsZCBuZWVkcyBsZXNzCisgICAgIGFyZ3VtZW50LCBub3QgbW9yZSkuICovCisgIGdfb2JqZWN0X3JlZiAoKGdwb2ludGVyKWFyZ3VtZW50KTsKKyAgZ19vYmplY3RfcmVmICgoZ3BvaW50ZXIpYXJndW1lbnQpOwogCiAgIGxvb25leSA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfSU5TQU5JVFksIE5VTEwpOwogICBnX2hhc2hfdGFibGVfaW5zZXJ0IChzZWNvbmRfbWFwLApAQCAtNzE0LDE2ICs3MDYsMTcgQEAKICAgZ19hc3NlcnQgKCplcnIxID09IE5VTEwpOwogICBnX2Fzc2VydCAoKmVycjIgPT0gTlVMTCk7CiAKLSAgaWYgKHN0cm5jbXAgKGFyZzAsICJYY2VwdGlvbiIsIDkpID09IDApIHsKKyAgaWYgKHN0cm5jbXAgKGFyZzAsICJYY2VwdGlvbiIsIDgpID09IDAgJiYgc3RybGVuKGFyZzApID09IDgpIHsKICAgICAqZXJyMSA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfWENFUFRJT04sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJlcnJvckNvZGUiLCAxMDAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSIsICAgZ19zdHJkdXAgKCJUaGlzIGlzIGFuIFhjZXB0aW9uIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwogICAgIHJlc3VsdCA9IEZBTFNFOwogICB9Ci0gIGVsc2UgaWYgKHN0cm5jbXAgKGFyZzAsICJYY2VwdGlvbjIiLCAxMCkgPT0gMCkgeworICBlbHNlIGlmIChzdHJuY21wIChhcmcwLCAiWGNlcHRpb24yIiwgOSkgPT0gMCkgewogICAgICplcnIyID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9YQ0VQVElPTjIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJlcnJvckNvZGUiLCAyMDAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImVycm9yQ29kZSIsIDIwMDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwogCiAgICAgZ19vYmplY3RfZ2V0ICgqZXJyMiwKICAgICAgICAgICAgICAgICAgICJzdHJ1Y3RfdGhpbmciLCAmc3RydWN0X3RoaW5nLApAQCAtNzgxLDYgKzc3NCw5IEBACiAgIGJhc2VfY2xhc3MtPnRlc3Rfc3RyaW5nID0KICAgICBrbGFzcy0+dGVzdF9zdHJpbmcgPQogICAgIHRocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF9zdHJpbmc7CisgIGJhc2VfY2xhc3MtPnRlc3RfYm9vbCA9CisgICAga2xhc3MtPnRlc3RfYm9vbCA9CisgICAgdGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X2Jvb2w7CiAgIGJhc2VfY2xhc3MtPnRlc3RfYnl0ZSA9CiAgICAga2xhc3MtPnRlc3RfYnl0ZSA9CiAgICAgdGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X2J5dGU7CkBAIC03OTMsNiArNzg5LDkgQEAKICAgYmFzZV9jbGFzcy0+dGVzdF9kb3VibGUgPQogICAgIGtsYXNzLT50ZXN0X2RvdWJsZSA9CiAgICAgdGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X2RvdWJsZTsKKyAgYmFzZV9jbGFzcy0+dGVzdF9iaW5hcnkgPQorICAgIGtsYXNzLT50ZXN0X2JpbmFyeSA9CisgICAgdGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X2JpbmFyeTsKICAgYmFzZV9jbGFzcy0+dGVzdF9zdHJ1Y3QgPQogICAgIGtsYXNzLT50ZXN0X3N0cnVjdCA9CiAgICAgdGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X3N0cnVjdDsKZGlmZiAtLWdpdCBhL3Rlc3QvY19nbGliL3NyYy90aHJpZnRfdGVzdF9oYW5kbGVyLmggYi90ZXN0L2NfZ2xpYi9zcmMvdGhyaWZ0X3Rlc3RfaGFuZGxlci5oCmluZGV4IGEzNGY5MGEuLmI2NGNiMTYgMTAwNjQ0Ci0tLSBhL3Rlc3QvY19nbGliL3NyYy90aHJpZnRfdGVzdF9oYW5kbGVyLmgKKysrIGIvdGVzdC9jX2dsaWIvc3JjL3RocmlmdF90ZXN0X2hhbmRsZXIuaApAQCAtNjYsNiArNjYsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjaGFyICAgICAgICAgICAgICAgKipfcmV0dXJuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgICAgICAgICAgKnRoaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgICAqKmVycm9yKTsKKyAgZ2Jvb2xlYW4gKCp0ZXN0X2Jvb2wpICAgICAgICAgICAgKFRUZXN0VGhyaWZ0VGVzdElmICAgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdib29sZWFuKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnYm9vbGVhbiAgICAgICAgdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAgICoqZXJyb3IpOwogICBnYm9vbGVhbiAoKnRlc3RfYnl0ZSkgICAgICAgICAgICAoVFRlc3RUaHJpZnRUZXN0SWYgICAgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludDgqX3JldHVybiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdpbnQ4ICAgICAgICAgICB0aGluZywKQEAgLTgyLDYgKzg2LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZG91YmxlKl9yZXR1cm4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnZG91YmxlICAgICAgICAgdGhpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAgICoqZXJyb3IpOworICBnYm9vbGVhbiAoKnRlc3RfYmluYXJ5KSAgICAgICAgICAoVFRlc3RUaHJpZnRUZXN0SWYgICAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0J5dGVBcnJheSAgICAgICAgKipfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0J5dGVBcnJheSAgICAgKnRoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgICAqKmVycm9yKTsKICAgZ2Jvb2xlYW4gKCp0ZXN0X3N0cnVjdCkgICAgICAgICAgKFRUZXN0VGhyaWZ0VGVzdElmICAgICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUZXN0WHRydWN0ICAgICAgICAgKipfcmV0dXJuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFRlc3RYdHJ1Y3QgICAgKnRoaW5nLApkaWZmIC0tZ2l0IGEvdGVzdC9jbC9NYWtlZmlsZS5hbSBiL3Rlc3QvY2wvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjVlNzJiYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY2wvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw0MiBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK1RIUklGVCA9ICQodG9wX2J1aWxkZGlyKS9jb21waWxlci9jcHAvdGhyaWZ0CisKK3N0dWJzOiAuLi9UaHJpZnRUZXN0LnRocmlmdAorCSQoVEhSSUZUKSAtLWdlbiBjbCAuLi9UaHJpZnRUZXN0LnRocmlmdAorCitUZXN0U2VydmVyOiBtYWtlLXRlc3Qtc2VydmVyLmxpc3AKKwkkKFNCQ0wpIC0tc2NyaXB0IG1ha2UtdGVzdC1zZXJ2ZXIubGlzcAorCitUZXN0Q2xpZW50OiBtYWtlLXRlc3QtY2xpZW50Lmxpc3AKKwkkKFNCQ0wpIC0tc2NyaXB0IG1ha2UtdGVzdC1jbGllbnQubGlzcAorCitwcmVjcm9zczogc3R1YnMgVGVzdFNlcnZlciBUZXN0Q2xpZW50CisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIC1yIGdlbi1jbAorCSQoUk0pIFRlc3RTZXJ2ZXIKKwkkKFJNKSBUZXN0Q2xpZW50CisKK0VYVFJBX0RJU1QgPSBcCisJaW1wbGVtZW50YXRpb24ubGlzcCBcCisJbWFrZS10ZXN0LWNsaWVudC5saXNwIFwKKwltYWtlLXRlc3Qtc2VydmVyLmxpc3AgXAorCXRlc3RzLmxpc3AKZGlmZiAtLWdpdCBhL3Rlc3QvY2wvaW1wbGVtZW50YXRpb24ubGlzcCBiL3Rlc3QvY2wvaW1wbGVtZW50YXRpb24ubGlzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2FmN2JlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jbC9pbXBsZW1lbnRhdGlvbi5saXNwCkBAIC0wLDAgKzEsMTM2IEBACisoaW4tcGFja2FnZSAjOnRocmlmdC50ZXN0LWltcGxlbWVudGF0aW9uKQorCis7Ozs7IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOzs7OyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis7Ozs7IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOzs7OworOzs7OyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis7Ozs7Cis7Ozs7IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzs7OzsgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzs7OzsgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis7Ozs7IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzs7OzsgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyhkZWZ1biB0aHJpZnQudGVzdC50aHJpZnQtdGVzdC1pbXBsZW1lbnRhdGlvbjp0ZXN0LXZvaWQgKCkKKyAgKGZvcm1hdCB0ICJ0ZXN0Vm9pZCgpfiUiKSkKKworKGRlZnVuIHRocmlmdC50ZXN0LnRocmlmdC10ZXN0LWltcGxlbWVudGF0aW9uOnRlc3Qtc3RyaW5nICh0aGluZykKKyAgKGZvcm1hdCB0ICJ0ZXN0U3RyaW5nKH5hKX4lIiB0aGluZykKKyAgdGhpbmcpCisKKyhkZWZ1biB0aHJpZnQudGVzdC50aHJpZnQtdGVzdC1pbXBsZW1lbnRhdGlvbjp0ZXN0LWJvb2wgKHRoaW5nKQorICAoZm9ybWF0IHQgInRlc3RCb29sKH5hKX4lIiAoaWYgdGhpbmcgInRydWUiICJmYWxzZSIpKQorICB0aGluZykKKworKGRlZnVuIHRocmlmdC50ZXN0LnRocmlmdC10ZXN0LWltcGxlbWVudGF0aW9uOnRlc3QtYnl0ZSAodGhpbmcpCisgIChmb3JtYXQgdCAidGVzdEJ5dGUofmEpfiUiIHRoaW5nKQorICB0aGluZykKKworKGRlZnVuIHRocmlmdC50ZXN0LnRocmlmdC10ZXN0LWltcGxlbWVudGF0aW9uOnRlc3QtaTMyICh0aGluZykKKyAgKGZvcm1hdCB0ICJ0ZXN0STMyKH5hKX4lIiB0aGluZykKKyAgdGhpbmcpCisKKyhkZWZ1biB0aHJpZnQudGVzdC50aHJpZnQtdGVzdC1pbXBsZW1lbnRhdGlvbjp0ZXN0LWk2NCAodGhpbmcpCisgIChmb3JtYXQgdCAidGVzdEk2NCh+YSl+JSIgdGhpbmcpCisgIHRoaW5nKQorCisoZGVmdW4gdGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3QtaW1wbGVtZW50YXRpb246dGVzdC1kb3VibGUgKHRoaW5nKQorICAoZm9ybWF0IHQgInRlc3REb3VibGUofmEpfiUiIHRoaW5nKQorICB0aGluZykKKworKGRlZnVuIHRocmlmdC50ZXN0LnRocmlmdC10ZXN0LWltcGxlbWVudGF0aW9uOnRlc3QtYmluYXJ5ICh0aGluZykKKyAgKGZvcm1hdCB0ICJ0ZXN0QmluYXJ5KH5hKX4lIiB0aGluZykKKyAgdGhpbmcpCisKKyhkZWZ1biB0aHJpZnQudGVzdC50aHJpZnQtdGVzdC1pbXBsZW1lbnRhdGlvbjp0ZXN0LXN0cnVjdCAodGhpbmcpCisgIChmb3JtYXQgdCAidGVzdFN0cnVjdCh+YSl+JSIgdGhpbmcpCisgIHRoaW5nKQorCisoZGVmdW4gdGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3QtaW1wbGVtZW50YXRpb246dGVzdC1uZXN0ICh0aGluZykKKyAgKGZvcm1hdCB0ICJ0ZXN0TmVzdCh+YSl+JSIgdGhpbmcpCisgIHRoaW5nKQorCisoZGVmdW4gdGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3QtaW1wbGVtZW50YXRpb246dGVzdC1tYXAgKHRoaW5nKQorICAoZm9ybWF0IHQgInRlc3RNYXAofmEpfiUiIHRoaW5nKQorICB0aGluZykKKworKGRlZnVuIHRocmlmdC50ZXN0LnRocmlmdC10ZXN0LWltcGxlbWVudGF0aW9uOnRlc3Qtc3RyaW5nLW1hcCAodGhpbmcpCisgIChmb3JtYXQgdCAidGVzdFN0cmluZ01hcCh+YSl+JSIgdGhpbmcpCisgIHRoaW5nKQorCisoZGVmdW4gdGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3QtaW1wbGVtZW50YXRpb246dGVzdC1zZXQgKHRoaW5nKQorICAoZm9ybWF0IHQgInRlc3RTZXQofmEpfiUiIHRoaW5nKQorICB0aGluZykKKworKGRlZnVuIHRocmlmdC50ZXN0LnRocmlmdC10ZXN0LWltcGxlbWVudGF0aW9uOnRlc3QtbGlzdCAodGhpbmcpCisgIChmb3JtYXQgdCAidGVzdExpc3QofmEpfiUiIHRoaW5nKQorICB0aGluZykKKworKGRlZnVuIHRocmlmdC50ZXN0LnRocmlmdC10ZXN0LWltcGxlbWVudGF0aW9uOnRlc3QtZW51bSAodGhpbmcpCisgIChmb3JtYXQgdCAidGVzdEVudW0ofmEpfiUiIHRoaW5nKQorICB0aGluZykKKworKGRlZnVuIHRocmlmdC50ZXN0LnRocmlmdC10ZXN0LWltcGxlbWVudGF0aW9uOnRlc3QtdHlwZWRlZiAodGhpbmcpCisgIChmb3JtYXQgdCAidGVzdFR5cGVkZWYofmEpfiUiIHRoaW5nKQorICB0aGluZykKKworKGRlZnVuIHRocmlmdC50ZXN0LnRocmlmdC10ZXN0LWltcGxlbWVudGF0aW9uOnRlc3QtbWFwLW1hcCAoaGVsbG8pCisgIChmb3JtYXQgdCAidGVzdE1hcE1hcCh+YSl+JSIgaGVsbG8pCisgICcoKC00IC4gKCgtNCAuIC00KSAoLTMgLiAtMykgKC0yIC4gLTIpICgtMSAuIC0xKSkpICg0IC4gKCgxIC4gMSkgKDIgLiAyKSAoMyAuIDMpICg0IC4gNCkpKSkpCisKKyhkZWZ1biB0aHJpZnQudGVzdC50aHJpZnQtdGVzdC1pbXBsZW1lbnRhdGlvbjp0ZXN0LWluc2FuaXR5IChhcmd1bWVudCkKKyAgKGxldCAoKHJlc3VsdCBgKCgxIC4gKCgyIC4gLGFyZ3VtZW50KSAoMyAuICxhcmd1bWVudCkpKQorICAgICAgICAgICAgICAgICAgKDIgLiAoKDYgLiAsKHRocmlmdC50ZXN0OjptYWtlLWluc2FuaXR5IDp1c2VyLW1hcCBuaWwgOnh0cnVjdHMgbmlsKSkpKSkpKQorICAgIChmb3JtYXQgdCAifmF+JSIgcmVzdWx0KQorICAgIHJlc3VsdCkpCisKKyhkZWZ1biB0aHJpZnQudGVzdC50aHJpZnQtdGVzdC1pbXBsZW1lbnRhdGlvbjp0ZXN0LW11bHRpIChhcmcwIGFyZzEgYXJnMiBhcmczIGFyZzQgYXJnNSkKKyAgKGRlY2xhcmUgKGlnbm9yYWJsZSBhcmczIGFyZzQgYXJnNSkpCisgIChmb3JtYXQgdCAidGVzdE11bHRpKCl+JSIpCisgICh0aHJpZnQudGVzdDptYWtlLXh0cnVjdCA6c3RyaW5nLXRoaW5nICJIZWxsbzIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6Ynl0ZS10aGluZyBhcmcwCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6aTMyLXRoaW5nIGFyZzEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDppNjQtdGhpbmcgYXJnMikpCisKKyhkZWZ1biB0aHJpZnQudGVzdC50aHJpZnQtdGVzdC1pbXBsZW1lbnRhdGlvbjp0ZXN0LWV4Y2VwdGlvbiAoYXJnKQorICAoZm9ybWF0IHQgInRlc3RFeGNlcHRpb24ofmEpfiUiIGFyZykKKyAgKGNvbmQKKyAgICAoKHN0cmluZz0gYXJnICJYY2VwdGlvbiIpIChlcnJvciAndGhyaWZ0LnRlc3Q6eGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ZXJyb3ItY29kZSAxMDAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOm1lc3NhZ2UgYXJnKSkKKyAgICAoKHN0cmluZz0gYXJnICJURXhjZXB0aW9uIikgKGVycm9yICd0aHJpZnQudGVzdDp4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmVycm9yLWNvZGUgMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOm1lc3NhZ2UgIlN0dWZmISIpKSkpCisKKyhkZWZ1biB0aHJpZnQudGVzdC50aHJpZnQtdGVzdC1pbXBsZW1lbnRhdGlvbjp0ZXN0LW11bHRpLWV4Y2VwdGlvbiAoYXJnMCBhcmcxKQorICAoZm9ybWF0IHQgInRlc3RNdWx0aUV4Y2VwdGlvbih+YSwgfmEpfiUiIGFyZzAgYXJnMSkKKyAgKGNvbmQKKyAgICAoKHN0cmluZz0gYXJnMCAiWGNlcHRpb24iKSAoZXJyb3IgJ3RocmlmdC50ZXN0OnhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmVycm9yLWNvZGUgMTAwMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDptZXNzYWdlICJUaGlzIGlzIGFuIFhjZXB0aW9uIikpCisgICAgKChzdHJpbmc9IGFyZzAgIlhjZXB0aW9uMiIpIChlcnJvciAndGhyaWZ0LnRlc3Q6eGNlcHRpb24yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmVycm9yLWNvZGUgMjAwMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpzdHJ1Y3QtdGhpbmcgKHRocmlmdC50ZXN0Om1ha2UteHRydWN0IDpzdHJpbmctdGhpbmcgIlRoaXMgaXMgYW4gWGNlcHRpb24yIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpieXRlLXRoaW5nIDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6aTMyLXRoaW5nIDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6aTY0LXRoaW5nIDApKSkpCisgICh0aHJpZnQudGVzdDptYWtlLXh0cnVjdCA6c3RyaW5nLXRoaW5nIGFyZzEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDpieXRlLXRoaW5nIDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDppMzItdGhpbmcgMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgOmk2NC10aGluZyAwKSkKKworKGRlZnVuIHRocmlmdC50ZXN0LnRocmlmdC10ZXN0LWltcGxlbWVudGF0aW9uOnRlc3Qtb25ld2F5IChzZWNvbmRzKQorICAoZm9ybWF0IHQgInRlc3RPbmV3YXkofmEpOiBTbGVlcGluZy4uLn4lIiBzZWNvbmRzKQorICAoc2xlZXAgc2Vjb25kcykKKyAgKGZvcm1hdCB0ICJ0ZXN0T25ld2F5KH5hKTogZG9uZSBzbGVlcGluZyF+JSIgc2Vjb25kcykpCisKKzs7OyBSZW1vdmVkIGZyb20gdGhlIElETCBkZWZpbml0aW9uLgorIysob3IpCisoZGVmdW4gdGhyaWZ0LnRlc3Quc2Vjb25kLXNlcnZpY2UtaW1wbGVtZW50YXRpb246YmxhaC1ibGFoICgpCisgIChmb3JtYXQgdCAiYmxhaEJsYWgoKX4lIikpCisKKyhkZWZ1biB0aHJpZnQudGVzdC5zZWNvbmQtc2VydmljZS1pbXBsZW1lbnRhdGlvbjpzZWNvbmR0ZXN0LXN0cmluZyAodGhpbmcpCisgIChmb3JtYXQgdCAic2Vjb25kdGVzdFN0cmluZyh+YSl+JSIgdGhpbmcpCisgIChjb25jYXRlbmF0ZSAnc3RyaW5nICJ0ZXN0U3RyaW5nKFwiIiB0aGluZyAiXCIpIikpCisKZGlmZiAtLWdpdCBhL3Rlc3QvY2wvbWFrZS10ZXN0LWNsaWVudC5saXNwIGIvdGVzdC9jbC9tYWtlLXRlc3QtY2xpZW50Lmxpc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA5NjY5ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY2wvbWFrZS10ZXN0LWNsaWVudC5saXNwCkBAIC0wLDAgKzEsOTMgQEAKKyhpbi1wYWNrYWdlICM6Y2wtdXNlcikKKworOzs7OyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzs7OzsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOzs7OyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzs7OzsKKzs7OzsgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOzs7OworOzs7OyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis7Ozs7IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis7Ozs7IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOzs7OyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis7Ozs7IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjKyhvcikgKHdoZW4gKG5vdCAoYm91bmRwICdzYi1pbXBsOjpkZWZhdWx0LWV4dGVybmFsLWZvcm1hdCkKKyAgICAgICAgICAgICAgICAgKHNldGYgc2ItaW1wbDo6ZGVmYXVsdC1leHRlcm5hbC1mb3JtYXQgOlVURi04KSkpCisKKyhyZXF1aXJlICJhc2RmIikKKyhsb2FkIChtZXJnZS1wYXRobmFtZXMgIi4uLy4uL2xpYi9jbC9sb2FkLWxvY2FsbHkubGlzcCIgKmxvYWQtdHJ1ZW5hbWUqKSkKKyhhc2RmOmxvYWQtc3lzdGVtIDpuZXQuZGlkaWVydmVybmEuY2xvbikKKyhhc2RmOmxvYWQtc3lzdGVtIDpmaWFzY28pCisoYXNkZjpsb2FkLWFzZCAobWVyZ2UtcGF0aG5hbWVzICJnZW4tY2wvVGhyaWZ0VGVzdC90aHJpZnQtZ2VuLVRocmlmdFRlc3QuYXNkIiAqbG9hZC10cnVlbmFtZSopKQorKGFzZGY6bG9hZC1zeXN0ZW0gOnRocmlmdC1nZW4tdGhyaWZ0dGVzdCkKKworKG5ldC5kaWRpZXJ2ZXJuYS5jbG9uOm5pY2tuYW1lLXBhY2thZ2UpCisKKyhkZWZwYWNrYWdlICM6dGhyaWZ0LWNyb3NzCisgICg6dXNlICM6Y29tbW9uLWxpc3AgIzpmaWFzY28pCisgICg6ZXhwb3J0ICM6Y3Jvc3MtdGVzdCkpCisKKyhpbi1wYWNrYWdlICM6dGhyaWZ0LWNyb3NzKQorCisoZGVmcGFyYW1ldGVyICpwcm90KiBuaWwpCisKKyhsb2FkIChtZXJnZS1wYXRobmFtZXMgInRlc3RzLmxpc3AiICpsb2FkLXRydWVuYW1lKikgOmV4dGVybmFsLWZvcm1hdCA6VVRGLTgpCisKKyhjbG9uOmRlZnN5bm9wc2lzICgpCisgICh0ZXh0IDpjb250ZW50cyAiVGhlIENvbW1vbiBMaXNwIGNsaWVudCBmb3IgVGhyaWZ0J3MgY3Jvc3MtbGFuZ3VhZ2UgdGVzdCBzdWl0ZS4iKQorICAoZ3JvdXAgKDpoZWFkZXIgIkFsbG93ZWQgb3B0aW9uczoiKQorICAgIChmbGFnIDpzaG9ydC1uYW1lICJoIiA6bG9uZy1uYW1lICJoZWxwIgorICAgICAgICAgIDpkZXNjcmlwdGlvbiAiUHJpbnQgdGhpcyBoZWxwIGFuZCBleGl0LiIpCisgICAgKHN0cm9wdCA6bG9uZy1uYW1lICJob3N0IgorICAgICAgICAgICAgOmRlc2NyaXB0aW9uICJUaGUgaG9zdCB0byBjb25uZWN0IHRvLiIKKyAgICAgICAgICAgIDpkZWZhdWx0LXZhbHVlICJsb2NhbGhvc3QiCisgICAgICAgICAgICA6YXJndW1lbnQtbmFtZSAiQVJHIikKKyAgICAoc3Ryb3B0IDpsb25nLW5hbWUgInBvcnQiCisgICAgICAgICAgICA6ZGVzY3JpcHRpb24gIk51bWJlciBvZiB0aGUgcG9ydCB0byBsaXN0ZW4gZm9yIGNvbm5lY3Rpb25zIG9uLiIKKyAgICAgICAgICAgIDpkZWZhdWx0LXZhbHVlICI5MDkwIgorICAgICAgICAgICAgOmFyZ3VtZW50LW5hbWUgIkFSRyIKKyAgICAgICAgICAgIDphcmd1bWVudC10eXBlIDpvcHRpb25hbCkKKyAgICAoc3Ryb3B0IDpsb25nLW5hbWUgInRyYW5zcG9ydCIKKyAgICAgICAgICAgIDpkZXNjcmlwdGlvbiAiVHJhbnNwb3J0OiB0cmFuc3BvcnQgdG8gdXNlIChcImJ1ZmZlcmVkXCIsIFwiZnJhbWVkXCIpIgorICAgICAgICAgICAgOmRlZmF1bHQtdmFsdWUgImJ1ZmZlcmVkIgorICAgICAgICAgICAgOmFyZ3VtZW50LW5hbWUgIkFSRyIpCisgICAgKHN0cm9wdCA6bG9uZy1uYW1lICJwcm90b2NvbCIKKyAgICAgICAgICAgIDpkZXNjcmlwdGlvbiAiUHJvdG9jb2w6IHByb3RvY29sIHRvIHVzZSAoXCJiaW5hcnlcIiwgXCJtdWx0aVwiKSIKKyAgICAgICAgICAgIDpkZWZhdWx0LXZhbHVlICJiaW5hcnkiCisgICAgICAgICAgICA6YXJndW1lbnQtbmFtZSAiQVJHIikpKQorCisoZGVmdW4gbWFpbiAoKQorICAiRW50cnkgcG9pbnQgZm9yIG91ciBzdGFuZGFsb25lIGFwcGxpY2F0aW9uLiIKKyAgKGNsb246bWFrZS1jb250ZXh0KQorICAod2hlbiAoY2xvbjpnZXRvcHQgOnNob3J0LW5hbWUgImgiKQorICAgIChjbG9uOmhlbHApCisgICAgKGNsb246ZXhpdCkpCisgIChsZXQgKChwb3J0ICI5MDkwIikKKyAgICAgICAgKGhvc3QgImxvY2FsaG9zdCIpCisgICAgICAgIChmcmFtZWQgbmlsKQorICAgICAgICAobXVsdGlwbGV4ZWQgbmlsKSkKKyAgICAoY2xvbjpkby1jbWRsaW5lLW9wdGlvbnMgKG9wdGlvbiBuYW1lIHZhbHVlIHNvdXJjZSkKKyAgICAgIChwcmludCAobGlzdCBvcHRpb24gbmFtZSB2YWx1ZSBzb3VyY2UpKQorICAgICAgKGlmIChzdHJpbmc9IG5hbWUgImhvc3QiKQorICAgICAgICAgIChzZXRmIGhvc3QgdmFsdWUpKQorICAgICAgKGlmIChzdHJpbmc9IG5hbWUgInBvcnQiKQorICAgICAgICAgIChzZXRmIHBvcnQgdmFsdWUpKQorICAgICAgKGlmIChzdHJpbmc9IG5hbWUgInRyYW5zcG9ydCIpCisgICAgICAgICAgKGNvbmQgKChzdHJpbmc9IHZhbHVlICJidWZmZXJlZCIpIChzZXRmIGZyYW1lZCBuaWwpKQorICAgICAgICAgICAgICAgICgoc3RyaW5nPSB2YWx1ZSAiZnJhbWVkIikgKHNldGYgZnJhbWVkIHQpKQorICAgICAgICAgICAgICAgICh0IChlcnJvciAiVW5zdXBwb3J0ZWQgdHJhbnNwb3J0LiIpKSkpCisgICAgICAoaWYgKHN0cmluZz0gbmFtZSAicHJvdG9jb2wiKQorICAgICAgICAgIChjb25kICgoc3RyaW5nPSB2YWx1ZSAiYmluYXJ5IikgKHNldGYgbXVsdGlwbGV4ZWQgbmlsKSkKKyAgICAgICAgICAgICAgICAoKHN0cmluZz0gdmFsdWUgIm11bHRpIikgKHNldGYgbXVsdGlwbGV4ZWQgdCkpCisgICAgICAgICAgICAgICAgKHQgKGVycm9yICJVbnN1cHBvcnRlZCBwcm90b2NvbC4iKSkpKSkKKyAgICAodGVycHJpKQorICAgIChzZXRmICpwcm90KiAodGhyaWZ0LmltcGxlbWVudGF0aW9uOjpjbGllbnQgKHB1cmk6cGFyc2UtdXJpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbmNhdGVuYXRlICdzdHJpbmcgInRocmlmdDovLyIgaG9zdCAiOiIgcG9ydCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ZnJhbWVkIGZyYW1lZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOm11bHRpcGxleGVkIG11bHRpcGxleGVkKSkKKyAgICAobGV0ICgocmVzdWx0IChjcm9zcy10ZXN0IDptdWx0aXBsZXhlZCBtdWx0aXBsZXhlZCkpKQorICAgICAgKHRocmlmdC5pbXBsZW1lbnRhdGlvbjo6Y2xvc2UgKnByb3QqKQorICAgICAgKGNsb246ZXhpdCByZXN1bHQpKSkpCisKKyhjbG9uOmR1bXAgIlRlc3RDbGllbnQiIG1haW4pCmRpZmYgLS1naXQgYS90ZXN0L2NsL21ha2UtdGVzdC1zZXJ2ZXIubGlzcCBiL3Rlc3QvY2wvbWFrZS10ZXN0LXNlcnZlci5saXNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5M2M4NzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NsL21ha2UtdGVzdC1zZXJ2ZXIubGlzcApAQCAtMCwwICsxLDgwIEBACisoaW4tcGFja2FnZSAjOmNsLXVzZXIpCisKKzs7OzsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis7Ozs7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzs7OzsgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis7Ozs7Cis7Ozs7ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzs7OzsKKzs7OzsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOzs7OyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOzs7OyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzs7OzsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOzs7OyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworKHJlcXVpcmUgImFzZGYiKQorKGxvYWQgKG1lcmdlLXBhdGhuYW1lcyAiLi4vLi4vbGliL2NsL2xvYWQtbG9jYWxseS5saXNwIiAqbG9hZC10cnVlbmFtZSopKQorKGFzZGY6bG9hZC1zeXN0ZW0gOm5ldC5kaWRpZXJ2ZXJuYS5jbG9uKQorKGFzZGY6bG9hZC1hc2QgKG1lcmdlLXBhdGhuYW1lcyAiZ2VuLWNsL1RocmlmdFRlc3QvdGhyaWZ0LWdlbi1UaHJpZnRUZXN0LmFzZCIgKmxvYWQtdHJ1ZW5hbWUqKSkKKyhhc2RmOmxvYWQtc3lzdGVtIDp0aHJpZnQtZ2VuLXRocmlmdHRlc3QpCisobG9hZCAobWVyZ2UtcGF0aG5hbWVzICJpbXBsZW1lbnRhdGlvbi5saXNwIiAqbG9hZC10cnVlbmFtZSopKQorCisobmV0LmRpZGllcnZlcm5hLmNsb246bmlja25hbWUtcGFja2FnZSkKKworKGNsb246ZGVmc3lub3BzaXMgKCkKKyAgKHRleHQgOmNvbnRlbnRzICJUaGUgQ29tbW9uIExpc3Agc2VydmVyIGZvciBUaHJpZnQncyBjcm9zcy1sYW5ndWFnZSB0ZXN0IHN1aXRlLiIpCisgIChncm91cCAoOmhlYWRlciAiQWxsb3dlZCBvcHRpb25zOiIpCisgICAgKGZsYWcgOnNob3J0LW5hbWUgImgiIDpsb25nLW5hbWUgImhlbHAiCisgICAgICAgICAgOmRlc2NyaXB0aW9uICJQcmludCB0aGlzIGhlbHAgYW5kIGV4aXQuIikKKyAgICAoc3Ryb3B0IDpsb25nLW5hbWUgInBvcnQiCisgICAgICAgICAgICA6ZGVzY3JpcHRpb24gIk51bWJlciBvZiB0aGUgcG9ydCB0byBsaXN0ZW4gZm9yIGNvbm5lY3Rpb25zIG9uLiIKKyAgICAgICAgICAgIDpkZWZhdWx0LXZhbHVlICI5MDkwIgorICAgICAgICAgICAgOmFyZ3VtZW50LW5hbWUgIkFSRyIKKyAgICAgICAgICAgIDphcmd1bWVudC10eXBlIDpvcHRpb25hbCkKKyAgICAoc3Ryb3B0IDpsb25nLW5hbWUgInNlcnZlci10eXBlIgorICAgICAgICAgICAgOmRlc2NyaXB0aW9uICJUaGUgdHlwZSBvZiBzZXJ2ZXIsIGN1cnJlbnRseSBvbmx5IFwic2ltcGxlXCIgaXMgYXZhaWxhYmxlLiIKKyAgICAgICAgICAgIDpkZWZhdWx0LXZhbHVlICJzaW1wbGUiCisgICAgICAgICAgICA6YXJndW1lbnQtbmFtZSAiQVJHIikKKyAgICAoc3Ryb3B0IDpsb25nLW5hbWUgInRyYW5zcG9ydCIKKyAgICAgICAgICAgIDpkZXNjcmlwdGlvbiAiVHJhbnNwb3J0OiB0cmFuc3BvcnQgdG8gdXNlIChcImJ1ZmZlcmVkXCIgb3IgXCJmcmFtZWRcIikiCisgICAgICAgICAgICA6ZGVmYXVsdC12YWx1ZSAiYnVmZmVyZWQiCisgICAgICAgICAgICA6YXJndW1lbnQtbmFtZSAiQVJHIikKKyAgICAoc3Ryb3B0IDpsb25nLW5hbWUgInByb3RvY29sIgorICAgICAgICAgICAgOmRlc2NyaXB0aW9uICJQcm90b2NvbDogcHJvdG9jb2wgdG8gdXNlIChcImJpbmFyeVwiIG9yIFwibXVsdGlcIikiCisgICAgICAgICAgICA6ZGVmYXVsdC12YWx1ZSAiYmluYXJ5IgorICAgICAgICAgICAgOmFyZ3VtZW50LW5hbWUgIkFSRyIpKSkKKworKGRlZnVuIG1haW4gKCkKKyAgIkVudHJ5IHBvaW50IGZvciBvdXIgc3RhbmRhbG9uZSBhcHBsaWNhdGlvbi4iCisgIChjbG9uOm1ha2UtY29udGV4dCkKKyAgKHdoZW4gKGNsb246Z2V0b3B0IDpzaG9ydC1uYW1lICJoIikKKyAgICAoY2xvbjpoZWxwKQorICAgIChjbG9uOmV4aXQpKQorICAobGV0ICgocG9ydCAiOTA5MCIpCisgICAgICAgIChmcmFtZWQgbmlsKQorICAgICAgICAobXVsdGlwbGV4ZWQgbmlsKSkKKyAgICAoY2xvbjpkby1jbWRsaW5lLW9wdGlvbnMgKG9wdGlvbiBuYW1lIHZhbHVlIHNvdXJjZSkKKyAgICAgIChwcmludCAobGlzdCBvcHRpb24gbmFtZSB2YWx1ZSBzb3VyY2UpKQorICAgICAgKGlmIChzdHJpbmc9IG5hbWUgInBvcnQiKQorICAgICAgICAgIChzZXRmIHBvcnQgdmFsdWUpKQorICAgICAgKGlmIChzdHJpbmc9IG5hbWUgInRyYW5zcG9ydCIpCisgICAgICAgICAgKGNvbmQgKChzdHJpbmc9IHZhbHVlICJidWZmZXJlZCIpIChzZXRmIGZyYW1lZCBuaWwpKQorICAgICAgICAgICAgICAgICgoc3RyaW5nPSB2YWx1ZSAiZnJhbWVkIikgKHNldGYgZnJhbWVkIHQpKQorICAgICAgICAgICAgICAgICh0IChlcnJvciAiVW5zdXBwb3J0ZWQgdHJhbnNwb3J0LiIpKSkpCisgICAgICAoaWYgKHN0cmluZz0gbmFtZSAicHJvdG9jb2wiKQorICAgICAgICAgIChjb25kICgoc3RyaW5nPSB2YWx1ZSAiYmluYXJ5IikgKHNldGYgbXVsdGlwbGV4ZWQgbmlsKSkKKyAgICAgICAgICAgICAgICAoKHN0cmluZz0gdmFsdWUgIm11bHRpIikgKHNldGYgbXVsdGlwbGV4ZWQgdCkpCisgICAgICAgICAgICAgICAgKHQgKGVycm9yICJVbnN1cHBvcnRlZCBwcm90b2NvbC4iKSkpKSkKKyAgICAodGVycHJpKQorICAgIChsZXQgKChzZXJ2aWNlcyAoaWYgbXVsdGlwbGV4ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIChsaXN0IHRocmlmdC50ZXN0OnRocmlmdC10ZXN0IHRocmlmdC50ZXN0OnNlY29uZC1zZXJ2aWNlKQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyaWZ0LnRlc3Q6dGhyaWZ0LXRlc3QpKSkKKyAgICAgICh0aHJpZnQ6c2VydmUgKHB1cmk6cGFyc2UtdXJpIChjb25jYXRlbmF0ZSAnc3RyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRocmlmdDovLzEyNy4wLjAuMToiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydCkpCisgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VzCisgICAgICAgICAgICAgICAgICAgIDpmcmFtZWQgZnJhbWVkCisgICAgICAgICAgICAgICAgICAgIDptdWx0aXBsZXhlZCBtdWx0aXBsZXhlZCkpKQorICAoY2xvbjpleGl0KSkKKworKGNsb246ZHVtcCAiVGVzdFNlcnZlciIgbWFpbikKZGlmZiAtLWdpdCBhL3Rlc3QvY2wvdGVzdHMubGlzcCBiL3Rlc3QvY2wvdGVzdHMubGlzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTAzNWZkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jbC90ZXN0cy5saXNwCkBAIC0wLDAgKzEsMjQwIEBACisoaW4tcGFja2FnZSAjOnRocmlmdC1jcm9zcykKKworOzs7OyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzs7OzsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOzs7OyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzs7OzsKKzs7OzsgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOzs7OworOzs7OyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis7Ozs7IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis7Ozs7IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOzs7OyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis7Ozs7IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCis7Ozs7IFRoZSB0ZXN0cyBoZXJlIG9ubHkgbWFrZSBzZW5zZSBpbiB0aGUgY29udGV4dCBvZiBhIFRlc3RTZXJ2ZXIKKzs7OzsgcnVubmluZyBhbmQgdGhlIGR5bmFtaWMgdmFyaWFibGUgdGhyaWZ0LWNyb3NzOjoqcHJvdCoKKzs7OzsgYmVpbmcgc2V0IHdpdGggYSBjbGllbnQgY29ubmVjdGlvbiB0byB0aGUgVGVzdFNlcnZlci4gTm9ybWFsbHksCis7Ozs7IHRoaXMgaXMgaGFuZGxlZCBpbiBtYWtlLXRlc3QtY2xpZW50Lmxpc3AuCisKKworOzs7IFN0YW5kYXJkIFRocmlmdCBjcm9zcy10ZXN0IGVycm9yIGNvZGVzCisoZGVmcGFyYW1ldGVyICp0ZXN0X2Jhc2V0eXBlcyogMSkKKyhkZWZwYXJhbWV0ZXIgKnRlc3Rfc3RydWN0cyogMikKKyhkZWZwYXJhbWV0ZXIgKnRlc3RfY29udGFpbmVycyogNCkKKyhkZWZwYXJhbWV0ZXIgKnRlc3RfZXhjZXB0aW9ucyogOCkKKyhkZWZwYXJhbWV0ZXIgKnRlc3RfdW5rbm93biogNjQpCisoZGVmcGFyYW1ldGVyICp0ZXN0X3RpbWVvdXQqIDEyOCkKKworKGRlZnVuIGNyb3NzLXRlc3QgKCZrZXkgKG11bHRpcGxleGVkIG5pbCkpCisgICJUaGUgbWFpbiBjcm9zcy10ZXN0IHJ1bm5lci4iCisgIChsZXQgKChyZXN1bHQgbmlsKSkKKyAgICAoaGFuZGxlci1jYXNlCisgICAgICAgIChwcm9nbgorICAgICAgICAgICh1bmxlc3MgKHJ1bi1wYWNrYWdlLXRlc3RzIDpwYWNrYWdlIDpiYXNlLXR5cGVzKQorICAgICAgICAgICAgKHB1c2huZXcgKnRlc3RfYmFzZXR5cGVzKiByZXN1bHQpKQorICAgICAgICAgICh1bmxlc3MgKHJ1bi1wYWNrYWdlLXRlc3RzIDpwYWNrYWdlIDpzdHJ1Y3RzKQorICAgICAgICAgICAgKHB1c2huZXcgKnRlc3Rfc3RydWN0cyogcmVzdWx0KSkKKyAgICAgICAgICAodW5sZXNzIChydW4tcGFja2FnZS10ZXN0cyA6cGFja2FnZSA6Y29udGFpbmVycykKKyAgICAgICAgICAgIChwdXNobmV3ICp0ZXN0X2NvbnRhaW5lcnMqIHJlc3VsdCkpCisgICAgICAgICAgKHVubGVzcyAocnVuLXBhY2thZ2UtdGVzdHMgOnBhY2thZ2UgOmV4Y2VwdGlvbnMpCisgICAgICAgICAgICAocHVzaG5ldyAqdGVzdF9leGNlcHRpb25zKiByZXN1bHQpKQorICAgICAgICAgICh1bmxlc3MgKHJ1bi1wYWNrYWdlLXRlc3RzIDpwYWNrYWdlIDptaXNjKQorICAgICAgICAgICAgKHB1c2huZXcgKnRlc3RfdW5rbm93biogcmVzdWx0KSkKKworICAgICAgICAgIDs7IEl0IGRvZXNuJ3Qgc2VlbSBsaWtlIGFueW9uZSBhY3R1YWxseSB1c2VzCisgICAgICAgICAgOzsgdGhlIHNlY29uZCB0ZXN0IHNlcnZpY2Ugd2hlbiB0ZXN0aW5nIG11bHRpcGxleGluZywKKyAgICAgICAgICA7OyBzbyB0aGlzIHdvdWxkIGZhaWwgYWdhaW5zdCBzZXJ2ZXJzIGluIG90aGVyCisgICAgICAgICAgOzsgbGFuZ3VhZ2VzLiBGb3Igbm93LCBhbnl3YXkuCisgICAgICAgICAgIysob3IpCisgICAgICAgICAgKHdoZW4gbXVsdGlwbGV4ZWQKKyAgICAgICAgICAgICh1bmxlc3MgKHJ1bi1wYWNrYWdlLXRlc3RzIDpwYWNrYWdlIDptdWx0aXBsZXgpCisgICAgICAgICAgICAgIChwdXNobmV3ICp0ZXN0X3Vua25vd24qIHJlc3VsdCkpKSkKKyAgICAgIChlcnJvciAoZSkgKHB1c2huZXcgKnRlc3RfdW5rbm93biogcmVzdWx0KSkpCisgICAgKGFwcGx5ICMnKyByZXN1bHQpKSkKKworKGZpYXNjbzpkZWZpbmUtdGVzdC1wYWNrYWdlICM6YmFzZS10eXBlcykKKworKGluLXBhY2thZ2UgIzpiYXNlLXR5cGVzKQorCisoZGVmY29uc3RhbnQgKmxhbmctc3RyaW5nKiAiQWZyaWthYW5zLCBBbGVtYW5uaXNjaCwgQXJhZ29uw6lzLCDYp9mE2LnYsdio2YrYqSwg2YXYtdix2YksIEFzdHVyaWFudSwgQXltYXIgYXJ1LCBBesmZcmJheWNhbiwg0JHQsNGI0qHQvtGA0YIsIEJvYXJpc2NoLCDFvWVtYWl0xJfFoWthLCDQkdC10LvQsNGA0YPRgdC60LDRjywg0JHQtdC70LDRgNGD0YHQutCw0Y8gKNGC0LDRgNCw0YjQutC10LLRltGG0LApLCDQkdGK0LvQs9Cw0YDRgdC60LgsIEJhbWFuYW5rYW4sIOCmrOCmvuCmguCmsuCmviwgQnJlemhvbmVnLCBCb3NhbnNraSwgQ2F0YWzDoCwgTcOsbmctZMSVzKRuZy1uZ+G5s8yELCDQndC+0YXRh9C40LnQvSwgQ2VidWFubywg4Y+j4Y6z4Y6pLCDEjGVza3ksINCh0LvQvtCy0aPMgdC90YzRgdC60YogLyDisJTisI7isJHisILisKHisJDisKDisJTisI3isJ8sINCn05HQstCw0YjQu9CwLCBDeW1yYWVnLCBEYW5zaywgWmF6YWtpLCDei96o3ojerN6A3qjehN6m3pDesCwgzpXOu867zrfOvc65zrrOrCwgRW1pbGnDoG4gZSBydW1hZ27DsmwsIEVuZ2xpc2gsIEVzcGVyYW50bywgRXNwYcOxb2wsIEVlc3RpLCBFdXNrYXJhLCDZgdin2LHYs9uMLCBTdW9taSwgVsO1cm8sIEbDuHJveXNrdCwgRnJhbsOnYWlzLCBBcnBldGFuLCBGdXJsYW4sIEZyeXNrLCBHYWVpbGdlLCDotJvoqp4sIEfDoGlkaGxpZywgR2FsZWdvLCBBdmHDsWUn4bq9LCDgqpfgq4HgqpzgqrDgqr7gqqTgq4AsIEdhZWxnLCDXoteR16jXmdeqLCDgpLngpL/gpKjgpY3gpKbgpYAsIEZpamkgSGluZGksIEhydmF0c2tpLCBLcmV5w7JsIGF5aXN5ZW4sIE1hZ3lhciwg1YDVodW11aXWgNWl1bYsIEludGVybGluZ3VhLCBCYWhhc2EgSW5kb25lc2lhLCBJbG9rYW5vLCBJZG8sIMONc2xlbnNrYSwgSXRhbGlhbm8sIOaXpeacrOiqniwgTG9qYmFuLCBCYXNhIEphd2EsIOGDpeGDkOGDoOGDl+GDo+GDmuGDmCwgS29uZ28sIEthbGFhbGxpc3V0LCDgspXgsqjgs43gsqjgsqEsIO2VnOq1reyWtCwg0JrRitCw0YDQsNGH0LDQuS3QnNCw0LvQutGK0LDRgCwgUmlwb2FyaXNjaCwgS3VyZMOuLCDQmtC+0LzQuCwgS2VybmV3ZWssINCa0YvRgNCz0YvQt9GH0LAsIExhdGluYSwgTGFkaW5vLCBMw6t0emVidWVyZ2VzY2gsIExpbWJ1cmdzLCBMaW5nw6FsYSwg4Lql4Lqy4LqnLCBMaWV0dXZpxbMsIExhdHZpZcWhdSwgQmFzYSBCYW55dW1hc2FuLCBNYWxhZ2FzeSwg0JzQsNC60LXQtNC+0L3RgdC60LgsIOC0ruC0suC0r+C0vuC0s+C0giwg4KSu4KSw4KS+4KSg4KWALCDZhdin2LLZkNix2YjZhtuMLCBCYWhhc2EgTWVsYXl1LCBObmFwdWxpdGFubywgTmVkZXJzYWtzaXNjaCwg4KSo4KWH4KSq4KS+4KSyIOCkreCkvuCkt+CkviwgTmVkZXJsYW5kcywg4oCqTm9yc2sgKG55bm9yc2sp4oCsLCDigKpOb3JzayAoYm9rbcOlbCnigKwsIE5vdW9ybWFuZCwgRGluw6kgYml6YWFkLCBPY2NpdGFuLCDQmNGA0L7QvdCw0YMsIFBhcGlhbWVudHUsIERlaXRzY2gsIFBvbHNraSwg2b7Zhtis2KfYqNuMLCDZvtqa2KrZiCwgTm9yZnVrIC8gUGl0a2VybiwgUG9ydHVndcOqcywgUnVuYSBTaW1pLCBSdW1hbnRzY2gsIFJvbWFuaSwgUm9tw6JuxIMsINCg0YPRgdGB0LrQuNC5LCDQodCw0YXQsCDRgtGL0LvQsCwgU2FyZHUsIFNpY2lsaWFudSwgU2NvdHMsIFPDoW1lZ2llbGxhLCBTaW1wbGUgRW5nbGlzaCwgU2xvdmVuxI1pbmEsIFNsb3ZlbsWhxI1pbmEsINCh0YDQv9GB0LrQuCAvIFNycHNraSwgU2VlbHRlcnNrLCBTdmVuc2thLCBLaXN3YWhpbGksIOCupOCuruCuv+CutOCvjSwg4LCk4LGG4LCy4LGB4LCX4LGBLCDQotC+0rfQuNC606MsIOC5hOC4l+C4oiwgVMO8cmttZW7Dp2UsIFRhZ2Fsb2csIFTDvHJrw6dlLCDQotCw0YLQsNGA0YfQsC9UYXRhcsOnYSwg0KPQutGA0LDRl9C90YHRjNC60LAsINin2LHYr9mILCBUaeG6v25nIFZp4buHdCwgVm9sYXDDvGssIFdhbG9uLCBXaW5hcmF5LCDlkLTor60sIGlzaVhob3NhLCDXmdeZ1rTXk9eZ16ksIFlvcsO5YsOhLCBaZcOqdXdzLCDkuK3mlocsIELDom4tbMOibS1nw7osIOeyteiqniIpCisKKyhkZWZwYXJhbWV0ZXIgKnRyaWNrLXN0cmluZyogKGZvcm1hdCBuaWwgInF1b3RlOiBcIiBiYWNrc2xhc2g6IFxcIG5ld2xpbmU6IH4lIGJhY2tzcGFjZTogfkMgfgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFiOiB+VCBqdW5rOiAhQCMkJSYoKSgmJSQje317fTw+PD48IiAjXGJhY2tzcGFjZSkpCisKKyhkZWZjb25zdGFudCAqYmluYXJ5LXNlcXVlbmNlKiAjKDEyOCAxMjkgMTMwIDEzMSAxMzIgMTMzIDEzNCAxMzUgMTM2IDEzNyAxMzggMTM5IDE0MCAxNDEgMTQyIDE0MyAxNDQgMTQ1IDE0NiAxNDcgMTQ4IDE0OSAxNTAgMTUxIDE1MiAxNTMgMTU0IDE1NSAxNTYgMTU3IDE1OCAxNTkgMTYwIDE2MSAxNjIgMTYzIDE2NCAxNjUgMTY2IDE2NyAxNjggMTY5IDE3MCAxNzEgMTcyIDE3MyAxNzQgMTc1IDE3NiAxNzcgMTc4IDE3OSAxODAgMTgxIDE4MiAxODMgMTg0IDE4NSAxODYgMTg3IDE4OCAxODkgMTkwIDE5MSAxOTIgMTkzIDE5NCAxOTUgMTk2IDE5NyAxOTggMTk5IDIwMCAyMDEgMjAyIDIwMyAyMDQgMjA1IDIwNiAyMDcgMjA4IDIwOSAyMTAgMjExIDIxMiAyMTMgMjE0IDIxNSAyMTYgMjE3IDIxOCAyMTkgMjIwIDIyMSAyMjIgMjIzIDIyNCAyMjUgMjI2IDIyNyAyMjggMjI5IDIzMCAyMzEgMjMyIDIzMyAyMzQgMjM1IDIzNiAyMzcgMjM4IDIzOSAyNDAgMjQxIDI0MiAyNDMgMjQ0IDI0NSAyNDYgMjQ3IDI0OCAyNDkgMjUwIDI1MSAyNTIgMjUzIDI1NCAyNTUgMCAxIDIgMyA0IDUgNiA3IDggOSAxMCAxMSAxMiAxMyAxNCAxNSAxNiAxNyAxOCAxOSAyMCAyMSAyMiAyMyAyNCAyNSAyNiAyNyAyOCAyOSAzMCAzMSAzMiAzMyAzNCAzNSAzNiAzNyAzOCAzOSA0MCA0MSA0MiA0MyA0NCA0NSA0NiA0NyA0OCA0OSA1MCA1MSA1MiA1MyA1NCA1NSA1NiA1NyA1OCA1OSA2MCA2MSA2MiA2MyA2NCA2NSA2NiA2NyA2OCA2OSA3MCA3MSA3MiA3MyA3NCA3NSA3NiA3NyA3OCA3OSA4MCA4MSA4MiA4MyA4NCA4NSA4NiA4NyA4OCA4OSA5MCA5MSA5MiA5MyA5NCA5NSA5NiA5NyA5OCA5OSAxMDAgMTAxIDEwMiAxMDMgMTA0IDEwNSAxMDYgMTA3IDEwOCAxMDkgMTEwIDExMSAxMTIgMTEzIDExNCAxMTUgMTE2IDExNyAxMTggMTE5IDEyMCAxMjEgMTIyIDEyMyAxMjQgMTI1IDEyNiAxMjcpKQorCisoZGVmdGVzdCB2b2lkLXRlc3QgKCkKKyAgKGlzIChudWxsICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LXZvaWQgdGhyaWZ0LWNyb3NzOjoqcHJvdCopKSkpCisKKyhkZWZ0ZXN0IGJvb2xlYW4tdGVzdCAoKQorICAoaXMgKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtYm9vbCB0aHJpZnQtY3Jvc3M6Oipwcm90KiB0KSkKKyAgKGlzIChub3QgKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtYm9vbCB0aHJpZnQtY3Jvc3M6Oipwcm90KiBuaWwpKSkpCisKKyhkZWZ0ZXN0IGludGVnZXItdGVzdCAoKQorICAoaXMgKD0gKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtYnl0ZSB0aHJpZnQtY3Jvc3M6Oipwcm90KiAxMjcpIDEyNykpCisgIChpcyAoPSAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1ieXRlIHRocmlmdC1jcm9zczo6KnByb3QqIC0xMjgpIC0xMjgpKQorICAoaXMgKD0gKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtYnl0ZSB0aHJpZnQtY3Jvc3M6Oipwcm90KiA0MikgNDIpKQorICAoaXMgKD0gKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtYnl0ZSB0aHJpZnQtY3Jvc3M6Oipwcm90KiAwKSAwKSkKKyAgKGlzICg9ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LWkzMiB0aHJpZnQtY3Jvc3M6Oipwcm90KiAwKSAwKSkKKyAgKGlzICg9ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LWkzMiB0aHJpZnQtY3Jvc3M6Oipwcm90KiAyMTQ3NDgzNjQ3KSAyMTQ3NDgzNjQ3KSkKKyAgKGlzICg9ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LWkzMiB0aHJpZnQtY3Jvc3M6Oipwcm90KiAtMjE0NzQ4MzY0OCkgLTIxNDc0ODM2NDgpKQorICAoaXMgKD0gKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtaTY0IHRocmlmdC1jcm9zczo6KnByb3QqIDApIDApKQorICAoaXMgKD0gKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtaTY0IHRocmlmdC1jcm9zczo6KnByb3QqIDkyMjMzNzIwMzY4NTQ3NzU4MDcpIDkyMjMzNzIwMzY4NTQ3NzU4MDcpKQorICAoaXMgKD0gKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtaTY0IHRocmlmdC1jcm9zczo6KnByb3QqIC05MjIzMzcyMDM2ODU0Nzc1ODA4KSAtOTIyMzM3MjAzNjg1NDc3NTgwOCkpKQorCisoZGVmdGVzdCBkb3VibGUtdGVzdCAoKQorICAoaXMgKD0gKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtZG91YmxlIHRocmlmdC1jcm9zczo6KnByb3QqIDAuMCkgMCkpCisgIChpcyAoPSAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1kb3VibGUgdGhyaWZ0LWNyb3NzOjoqcHJvdCogNDIuMCkgNDIpKQorICAoaXMgKD0gKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtZG91YmxlIHRocmlmdC1jcm9zczo6KnByb3QqIC01NTUuMCkgLTU1NSkpCisgIChpcyAoPSAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1kb3VibGUgdGhyaWZ0LWNyb3NzOjoqcHJvdCogLTUyLjM2NzgpIC01Mi4zNjc4KSkpCisKKyhkZWZ0ZXN0IHN0cmluZy10ZXN0ICgpCisgIChpcyAoc3RyaW5nPSAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1zdHJpbmcgdGhyaWZ0LWNyb3NzOjoqcHJvdCogIiIpICIiKSkKKyAgKGlzIChzdHJpbmc9ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LXN0cmluZyB0aHJpZnQtY3Jvc3M6Oipwcm90KiAiKGRlZnVuIGJvdHNidWlsZGJvdHMgKCkgKGJvdHNidWlsc2JvdHMpKSIpCisgICAgICAgICAgICAgICAiKGRlZnVuIGJvdHNidWlsZGJvdHMgKCkgKGJvdHNidWlsc2JvdHMpKSIpKQorICAoaXMgKHN0cmluZz0gKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3Qtc3RyaW5nIHRocmlmdC1jcm9zczo6KnByb3QqICpsYW5nLXN0cmluZyopICpsYW5nLXN0cmluZyopKQorICAoaXMgKHN0cmluZz0gKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3Qtc3RyaW5nIHRocmlmdC1jcm9zczo6KnByb3QqICp0cmljay1zdHJpbmcqKSAqdHJpY2stc3RyaW5nKikpKQorCisoZGVmdGVzdCBiaW5hcnktdGVzdCAoKQorICAoaXMgKGVxdWFscCAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1iaW5hcnkgdGhyaWZ0LWNyb3NzOjoqcHJvdCogIygpKSAjKCkpKQorICAoaXMgKGVxdWFscCAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1iaW5hcnkgdGhyaWZ0LWNyb3NzOjoqcHJvdCogKmJpbmFyeS1zZXF1ZW5jZSopICpiaW5hcnktc2VxdWVuY2UqKSkpCisKKyhkZWZ0ZXN0IGVudW0tdGVzdCAoKQorICAoaXMgKD0gKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtZW51bSB0aHJpZnQtY3Jvc3M6Oipwcm90KiB0aHJpZnQudGVzdDpudW1iZXJ6LmZpdmUpIHRocmlmdC50ZXN0Om51bWJlcnouZml2ZSkpCisgIChpcyAoPSAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1lbnVtIHRocmlmdC1jcm9zczo6KnByb3QqIHRocmlmdC50ZXN0Om51bWJlcnouZWlnaHQpIHRocmlmdC50ZXN0Om51bWJlcnouZWlnaHQpKQorICAoaXMgKD0gKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtZW51bSB0aHJpZnQtY3Jvc3M6Oipwcm90KiB0aHJpZnQudGVzdDpudW1iZXJ6Lm9uZSkgdGhyaWZ0LnRlc3Q6bnVtYmVyei5vbmUpKSkKKworKGRlZnRlc3QgdHlwZWRlZi10ZXN0ICgpCisgIChpcyAoPSAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC10eXBlZGVmIHRocmlmdC1jcm9zczo6KnByb3QqIDMwOTg1ODIzNTA4MjUyMykgMzA5ODU4MjM1MDgyNTIzKSkpCisKKyhmaWFzY286ZGVmaW5lLXRlc3QtcGFja2FnZSAjOnN0cnVjdHMpCisKKyhpbi1wYWNrYWdlICM6c3RydWN0cykKKworKGRlZnBhcmFtZXRlciAqdGVzdC1zdHJ1Y3QqICh0aHJpZnQudGVzdDptYWtlLXh0cnVjdCA6c3RyaW5nLXRoaW5nICJIZWxsIGlzIGVtcHR5LiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmJ5dGUtdGhpbmcgLTIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmkzMi10aGluZyA0MgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6aTY0LXRoaW5nIDQyNDI0MjQyKSkKKworKGRlZnBhcmFtZXRlciAqdGVzdC1uZXN0KiAodGhyaWZ0LnRlc3Q6bWFrZS14dHJ1Y3QyIDpieXRlLXRoaW5nIDQyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOnN0cnVjdC10aGluZyAqdGVzdC1zdHJ1Y3QqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmkzMi10aGluZyAtNDIpKQorCisoZGVmdGVzdCBzdHJ1Y3QtdGVzdCAoKQorICAobGV0ICgocmVjLXN0cnVjdCAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1zdHJ1Y3QgdGhyaWZ0LWNyb3NzOjoqcHJvdCogKnRlc3Qtc3RydWN0KikpKQorICAgIChpcyAoc3RyaW5nPSAodGhyaWZ0LnRlc3Q6eHRydWN0LXN0cmluZy10aGluZyAqdGVzdC1zdHJ1Y3QqKQorICAgICAgICAgICAgICAgICAodGhyaWZ0LnRlc3Q6eHRydWN0LXN0cmluZy10aGluZyByZWMtc3RydWN0KSkpCisgICAgKGlzICg9ICh0aHJpZnQudGVzdDp4dHJ1Y3QtYnl0ZS10aGluZyAqdGVzdC1zdHJ1Y3QqKQorICAgICAgICAgICAodGhyaWZ0LnRlc3Q6eHRydWN0LWJ5dGUtdGhpbmcgcmVjLXN0cnVjdCkpKQorICAgIChpcyAoPSAodGhyaWZ0LnRlc3Q6eHRydWN0LWkzMi10aGluZyAqdGVzdC1zdHJ1Y3QqKQorICAgICAgICAgICAodGhyaWZ0LnRlc3Q6eHRydWN0LWkzMi10aGluZyByZWMtc3RydWN0KSkpCisgICAgKGlzICg9ICh0aHJpZnQudGVzdDp4dHJ1Y3QtaTY0LXRoaW5nICp0ZXN0LXN0cnVjdCopCisgICAgICAgICAgICh0aHJpZnQudGVzdDp4dHJ1Y3QtaTY0LXRoaW5nIHJlYy1zdHJ1Y3QpKSkpKQorCisoZGVmdGVzdCBuZXN0LXRlc3QgKCkKKyAgKGxldCogKChyZWMtbmVzdCAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1uZXN0IHRocmlmdC1jcm9zczo6KnByb3QqICp0ZXN0LW5lc3QqKSkKKyAgICAgICAgIChyZWMtc3RydWN0ICh0aHJpZnQudGVzdDp4dHJ1Y3QyLXN0cnVjdC10aGluZyByZWMtbmVzdCkpKQorICAgIChpcyAoc3RyaW5nPSAodGhyaWZ0LnRlc3Q6eHRydWN0LXN0cmluZy10aGluZyAqdGVzdC1zdHJ1Y3QqKQorICAgICAgICAgICAgICAgICAodGhyaWZ0LnRlc3Q6eHRydWN0LXN0cmluZy10aGluZyByZWMtc3RydWN0KSkpCisgICAgKGlzICg9ICh0aHJpZnQudGVzdDp4dHJ1Y3QtYnl0ZS10aGluZyAqdGVzdC1zdHJ1Y3QqKQorICAgICAgICAgICAodGhyaWZ0LnRlc3Q6eHRydWN0LWJ5dGUtdGhpbmcgcmVjLXN0cnVjdCkpKQorICAgIChpcyAoPSAodGhyaWZ0LnRlc3Q6eHRydWN0LWkzMi10aGluZyAqdGVzdC1zdHJ1Y3QqKQorICAgICAgICAgICAodGhyaWZ0LnRlc3Q6eHRydWN0LWkzMi10aGluZyByZWMtc3RydWN0KSkpCisgICAgKGlzICg9ICh0aHJpZnQudGVzdDp4dHJ1Y3QtaTY0LXRoaW5nICp0ZXN0LXN0cnVjdCopCisgICAgICAgICAgICh0aHJpZnQudGVzdDp4dHJ1Y3QtaTY0LXRoaW5nIHJlYy1zdHJ1Y3QpKSkKKyAgICAoaXMgKD0gKHRocmlmdC50ZXN0Onh0cnVjdDItYnl0ZS10aGluZyAqdGVzdC1uZXN0KikKKyAgICAgICAgICAgKHRocmlmdC50ZXN0Onh0cnVjdDItYnl0ZS10aGluZyByZWMtbmVzdCkpKQorICAgIChpcyAoPSAodGhyaWZ0LnRlc3Q6eHRydWN0Mi1pMzItdGhpbmcgKnRlc3QtbmVzdCopCisgICAgICAgICAgICh0aHJpZnQudGVzdDp4dHJ1Y3QyLWkzMi10aGluZyByZWMtbmVzdCkpKSkpCisKKyhmaWFzY286ZGVmaW5lLXRlc3QtcGFja2FnZSAjOmNvbnRhaW5lcnMpCisKKyhpbi1wYWNrYWdlICM6Y29udGFpbmVycykKKworKGRlZnRlc3QgbGlzdC10ZXN0ICgpCisgIChpcyAobnVsbCAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1saXN0IHRocmlmdC1jcm9zczo6KnByb3QqIG5pbCkpKQorICAoaXMgKGVxdWFsICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LWxpc3QgdGhyaWZ0LWNyb3NzOjoqcHJvdCogJyg0MiAtNDIgMCA1KSkgJyg0MiAtNDIgMCA1KSkpKQorCisoZGVmdGVzdCBzZXQtdGVzdCAoKQorICAoaXMgKG51bGwgKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3Qtc2V0IHRocmlmdC1jcm9zczo6KnByb3QqIG5pbCkpKQorICAoaXMgKGVxdWFsIChzb3J0ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LXNldCB0aHJpZnQtY3Jvc3M6Oipwcm90KiAobGlzdCA0MiAtNDIgMCA1KSkgIyc8KQorICAgICAgICAgICAgICcoLTQyIDAgNSA0MikpKSkKKworKGRlZnVuIG1hcD0gKG1hcDEgbWFwMiAma2V5IChjYXItcHJlZGljYXRlICMnZXF1YWwpIChjZHItcHJlZGljYXRlICMnZXF1YWwpKQorICAiQ29tcGFyZSB0d28gYXNzb2MgbWFwcyBhY2NvcmRpbmcgdG8gdGhlIHByZWRpY2F0ZXMgZ2l2ZW4uIgorICAobm90IChzZXQtZXhjbHVzaXZlLW9yIG1hcDEgbWFwMiA6dGVzdCAobGFtYmRhIChlbDEgZWwyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhbmQgKGZ1bmNhbGwgY2FyLXByZWRpY2F0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNhciBlbDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2FyIGVsMikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZnVuY2FsbCBjZHItcHJlZGljYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2RyIGVsMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjZHIgZWwyKSkpKSkpKQorCisoZGVmdGVzdCBtYXAtdGVzdCAoKQorICAoaXMgKG51bGwgKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtbWFwIHRocmlmdC1jcm9zczo6KnByb3QqIG5pbCkpKQorICAoaXMgKG1hcD0gKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtbWFwIHRocmlmdC1jcm9zczo6KnByb3QqICcoKDAgLiAxKSAoNDIgLiAtNDIpICg1IC4gNSkpKQorICAgICAgICAgICAgJygoMCAuIDEpICg0MiAuIC00MikgKDUgLiA1KSkpKQorICAoaXMgKG1hcD0gKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtbWFwLW1hcCB0aHJpZnQtY3Jvc3M6Oipwcm90KiA0MikKKyAgICAgICAgICAgICcoKC00IC4gKCgtNCAuIC00KSAoLTMgLiAtMykgKC0yIC4gLTIpICgtMSAuIC0xKSkpCisgICAgICAgICAgICAgICg0IC4gKCgxIC4gMSkgKDIgLiAyKSAoMyAuIDMpICg0IC4gNCkpKSkKKyAgICAgICAgICAgIDpjZHItcHJlZGljYXRlICMnbWFwPSkpKQorCisoZmlhc2NvOmRlZmluZS10ZXN0LXBhY2thZ2UgIzpleGNlcHRpb25zKQorCisoaW4tcGFja2FnZSAjOmV4Y2VwdGlvbnMpCisKKyhkZWZ1biB0ZXN0LXhjZXB0aW9uIChleHBlY3RlZC1jb2RlIGV4cGVjdGVkLW1lc3NhZ2UgZnVuY3Rpb24gJnJlc3QgYXJncykKKyAgIkEgaGVscGVyIGZ1bmN0aW9uIHRvIHRlc3Qgd2hldGhlciB4Y2VwdGlvbiBpcyBzaWduYWxsZWQsIGFuZCB3aGV0aGVyIGl0cyBmaWVsZHMgaGF2ZSB0aGUgZXhwZWN0ZWQgdmFsdWVzLiIKKyAgKGhhbmRsZXItY2FzZSAocHJvZ24gKGFwcGx5IGZ1bmN0aW9uIGFyZ3MpCisgICAgICAgICAgICAgICAgICAgICAgIG5pbCkKKyAgICAodGhyaWZ0LnRlc3Q6eGNlcHRpb24gKGV4KSAoYW5kICg9ICh0aHJpZnQudGVzdDo6eGNlcHRpb24tZXJyb3ItY29kZSBleCkgZXhwZWN0ZWQtY29kZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJpbmc9ICh0aHJpZnQudGVzdDo6eGNlcHRpb24tbWVzc2FnZSBleCkgZXhwZWN0ZWQtbWVzc2FnZSkpKSkpCisKKyhkZWZ1biB0ZXN0LXhjZXB0aW9uMiAoZXhwZWN0ZWQtY29kZSBleHBlY3RlZC1tZXNzYWdlIGZ1bmN0aW9uICZyZXN0IGFyZ3MpCisgICJBIGhlbHBlciBmdW5jdGlvbiB0byB0ZXN0IHdoZXRoZXIgeGNlcHRpb24yIGlzIHNpZ25hbGxlZCwgYW5kIHdoZXRoZXIgaXRzIGZpZWxkcyBoYXZlIHRoZSBleHBlY3RlZCB2YWx1ZXMuIgorICAoaGFuZGxlci1jYXNlIChwcm9nbiAoYXBwbHkgZnVuY3Rpb24gYXJncykKKyAgICAgICAgICAgICAgICAgICAgICAgbmlsKQorICAgICh0aHJpZnQudGVzdDp4Y2VwdGlvbjIgKGV4KSAoYW5kICg9ICh0aHJpZnQudGVzdDo6eGNlcHRpb24yLWVycm9yLWNvZGUgZXgpIGV4cGVjdGVkLWNvZGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cmluZz0gKHRocmlmdC50ZXN0Ojp4dHJ1Y3Qtc3RyaW5nLXRoaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0aHJpZnQudGVzdDo6eGNlcHRpb24yLXN0cnVjdC10aGluZyBleCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQtbWVzc2FnZSkpKSkpCisKKyhkZWZ0ZXN0IGV4Y2VwdGlvbi10ZXN0ICgpCisgIChpcyAodGVzdC14Y2VwdGlvbiAxMDAxICJYY2VwdGlvbiIgIyd0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LWV4Y2VwdGlvbiB0aHJpZnQtY3Jvc3M6Oipwcm90KiAiWGNlcHRpb24iKSkKKyAgKHNpZ25hbHMgdGhyaWZ0OmFwcGxpY2F0aW9uLWVycm9yICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LWV4Y2VwdGlvbiB0aHJpZnQtY3Jvc3M6Oipwcm90KiAiVEV4Y2VwdGlvbiIpKQorICAoZmluaXNoZXMgKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtZXhjZXB0aW9uIHRocmlmdC1jcm9zczo6KnByb3QqICJzdWNjZXNzIikpKQorCisoZGVmdGVzdCBtdWx0aS1leGNlcHRpb24tdGVzdCAoKQorICAoaXMgKHRlc3QteGNlcHRpb24gMTAwMQorICAgICAgICAgICAgICAgICAgICAgIlRoaXMgaXMgYW4gWGNlcHRpb24iCisgICAgICAgICAgICAgICAgICAgICAjJ3RocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtbXVsdGktZXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgICB0aHJpZnQtY3Jvc3M6Oipwcm90KgorICAgICAgICAgICAgICAgICAgICAgIlhjZXB0aW9uIgorICAgICAgICAgICAgICAgICAgICAgIm1lYW5pbmdsZXNzIikpCisgIChpcyAodGVzdC14Y2VwdGlvbjIgMjAwMgorICAgICAgICAgICAgICAgICAgICAgICJUaGlzIGlzIGFuIFhjZXB0aW9uMiIKKyAgICAgICAgICAgICAgICAgICAgICAjJ3RocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtbXVsdGktZXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgICAgdGhyaWZ0LWNyb3NzOjoqcHJvdCoKKyAgICAgICAgICAgICAgICAgICAgICAiWGNlcHRpb24yIgorICAgICAgICAgICAgICAgICAgICAgICJtZWFuaW5nbGVzcyB0b28hIikpCisgIChpcyAoc3RyaW5nPSAiZm9vYmFyIiAodGhyaWZ0LnRlc3Q6eHRydWN0LXN0cmluZy10aGluZworICAgICAgICAgICAgICAgICAgICAgICAgICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LW11bHRpLWV4Y2VwdGlvbiB0aHJpZnQtY3Jvc3M6Oipwcm90KgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3VjY2VzcyEiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmb29iYXIiKSkpKSkKKworKGZpYXNjbzpkZWZpbmUtdGVzdC1wYWNrYWdlICM6bWlzYykKKworKGluLXBhY2thZ2UgIzptaXNjKQorCisoZGVmdGVzdCBvbmV3YXktdGVzdCAoKQorICAoaXMgKG51bGwgKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3Qtb25ld2F5IHRocmlmdC1jcm9zczo6KnByb3QqIDEpKSkpCisKKyhmaWFzY286ZGVmaW5lLXRlc3QtcGFja2FnZSAjOm11bHRpcGxleCkKKworKGluLXBhY2thZ2UgIzptdWx0aXBsZXgpCisKKyhkZWZ0ZXN0IG11bHRpcGxleC10ZXN0ICgpCisgIDs7IFJlbW92ZWQgZnJvbSB0aGUgSURMIGRlZmluaXRpb24uCisgIDs7IChmaW5pc2hlcyAodGhyaWZ0LnRlc3Quc2Vjb25kLXNlcnZpY2U6YmxhaC1ibGFoIHRocmlmdC1jcm9zczo6KnByb3QqKSkKKyAgKGlzIChzdHJpbmc9ICJhc2QiICh0aHJpZnQudGVzdC5zZWNvbmQtc2VydmljZTpzZWNvbmR0ZXN0LXN0cmluZyB0aHJpZnQtY3Jvc3M6Oipwcm90KiAiYXNkIikpKSkKZGlmZiAtLWdpdCBhL3Rlc3QvY3BwL0NNYWtlTGlzdHMudHh0IGIvdGVzdC9jcHAvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTVkMjk5MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY3BwL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsOTIgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjIENvbnRhaW5zIHRoZSB0aHJpZnQgc3BlY2lmaWMgTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZCitpbmNsdWRlKFRocmlmdE1hY3JvcykKKworaW5jbHVkZV9kaXJlY3RvcmllcyhTWVNURU0gIiR7Qm9vc3RfSU5DTFVERV9ESVJTfSIpCisKK2ZpbmRfcGFja2FnZShPcGVuU1NMIFJFUVVJUkVEKQoraW5jbHVkZV9kaXJlY3RvcmllcyhTWVNURU0gIiR7T1BFTlNTTF9JTkNMVURFX0RJUn0iKQorCitmaW5kX3BhY2thZ2UoTGliZXZlbnQgUkVRVUlSRUQpICAjIExpYmV2ZW50IGNvbWVzIHdpdGggQ01ha2Ugc3VwcG9ydCBmcm9tIHVwc3RyZWFtCitpbmNsdWRlX2RpcmVjdG9yaWVzKFNZU1RFTSAke0xJQkVWRU5UX0lOQ0xVREVfRElSU30pCisKK2ZpbmRfcGFja2FnZShaTElCIFJFUVVJUkVEKQoraW5jbHVkZV9kaXJlY3RvcmllcyhTWVNURU0gJHtaTElCX0lOQ0xVREVfRElSU30pCisKKyNNYWtlIHN1cmUgZ2VuLWNwcCBmaWxlcyBjYW4gYmUgaW5jbHVkZWQKK2luY2x1ZGVfZGlyZWN0b3JpZXMoIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfSIpCitpbmNsdWRlX2RpcmVjdG9yaWVzKCIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWNwcCIpCitpbmNsdWRlX2RpcmVjdG9yaWVzKCIke1BST0pFQ1RfU09VUkNFX0RJUn0vbGliL2NwcC9zcmMiKQorCitzZXQoY3Jvc3N0ZXN0Z2VuY3BwX1NPVVJDRVMKKyAgICBnZW4tY3BwL1NlY29uZFNlcnZpY2UuY3BwCisgICAgZ2VuLWNwcC9UaHJpZnRUZXN0LmNwcAorICAgIGdlbi1jcHAvVGhyaWZ0VGVzdF90eXBlcy5jcHAKKyAgICBnZW4tY3BwL1RocmlmdFRlc3RfY29uc3RhbnRzLmNwcAorICAgIHNyYy9UaHJpZnRUZXN0X2V4dHJhcy5jcHAKKykKK2FkZF9saWJyYXJ5KGNyb3NzdGVzdGdlbmNwcCBTVEFUSUMgJHtjcm9zc3Rlc3RnZW5jcHBfU09VUkNFU30pCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoY3Jvc3N0ZXN0Z2VuY3BwIHRocmlmdCkKKworc2V0KGNyb3Nzc3RyZXNzZ2VuY3BwX1NPVVJDRVMKKyAgICBnZW4tY3BwL1NlcnZpY2UuY3BwCisgICAgZ2VuLWNwcC9TdHJlc3NUZXN0X3R5cGVzLmNwcAorICAgIGdlbi1jcHAvU3RyZXNzVGVzdF9jb25zdGFudHMuY3BwCispCithZGRfbGlicmFyeShjcm9zc3N0cmVzc2dlbmNwcCBTVEFUSUMgJHtjcm9zc3N0cmVzc2dlbmNwcF9TT1VSQ0VTfSkKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShjcm9zc3N0cmVzc2dlbmNwcCB0aHJpZnQpCisKK2FkZF9leGVjdXRhYmxlKFRlc3RTZXJ2ZXIgc3JjL1Rlc3RTZXJ2ZXIuY3BwKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKFRlc3RTZXJ2ZXIgY3Jvc3N0ZXN0Z2VuY3BwICR7Qm9vc3RfTElCUkFSSUVTfSAke0xJQkVWRU5UX0xJQn0pCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoVGVzdFNlcnZlciB0aHJpZnQpCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoVGVzdFNlcnZlciB0aHJpZnRuYikKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShUZXN0U2VydmVyIHRocmlmdHopCisKK2FkZF9leGVjdXRhYmxlKFRlc3RDbGllbnQgc3JjL1Rlc3RDbGllbnQuY3BwKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKFRlc3RDbGllbnQgY3Jvc3N0ZXN0Z2VuY3BwICR7Qm9vc3RfTElCUkFSSUVTfSAke0xJQkVWRU5UX0xJQn0pCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoVGVzdENsaWVudCB0aHJpZnQpCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoVGVzdENsaWVudCB0aHJpZnRuYikKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShUZXN0Q2xpZW50IHRocmlmdHopCisKK2FkZF9leGVjdXRhYmxlKFN0cmVzc1Rlc3Qgc3JjL1N0cmVzc1Rlc3QuY3BwKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKFN0cmVzc1Rlc3QgY3Jvc3NzdHJlc3NnZW5jcHAgJHtCb29zdF9MSUJSQVJJRVN9ICR7TElCRVZFTlRfTElCfSkKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShTdHJlc3NUZXN0IHRocmlmdCkKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShTdHJlc3NUZXN0IHRocmlmdG5iKQorYWRkX3Rlc3QoTkFNRSBTdHJlc3NUZXN0IENPTU1BTkQgU3RyZXNzVGVzdCkKKworYWRkX2V4ZWN1dGFibGUoU3RyZXNzVGVzdE5vbkJsb2NraW5nIHNyYy9TdHJlc3NUZXN0Tm9uQmxvY2tpbmcuY3BwKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKFN0cmVzc1Rlc3ROb25CbG9ja2luZyBjcm9zc3N0cmVzc2dlbmNwcCAke0Jvb3N0X0xJQlJBUklFU30gJHtMSUJFVkVOVF9MSUJ9KQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKFN0cmVzc1Rlc3ROb25CbG9ja2luZyB0aHJpZnQpCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoU3RyZXNzVGVzdE5vbkJsb2NraW5nIHRocmlmdG5iKQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKFN0cmVzc1Rlc3ROb25CbG9ja2luZyB0aHJpZnR6KQorYWRkX3Rlc3QoTkFNRSBTdHJlc3NUZXN0Tm9uQmxvY2tpbmcgQ09NTUFORCBTdHJlc3NUZXN0Tm9uQmxvY2tpbmcpCisKKyMKKyMgQ29tbW9uIHRocmlmdCBjb2RlIGdlbmVyYXRpb24gcnVsZXMKKyMKKworYWRkX2N1c3RvbV9jb21tYW5kKE9VVFBVVCBnZW4tY3BwL1NlY29uZFNlcnZpY2UuY3BwIGdlbi1jcHAvU2Vjb25kU2VydmljZS5oIGdlbi1jcHAvVGhyaWZ0VGVzdC5jcHAgZ2VuLWNwcC9UaHJpZnRUZXN0LmggZ2VuLWNwcC9UaHJpZnRUZXN0X3R5cGVzLmNwcCBnZW4tY3BwL1RocmlmdFRlc3RfY29uc3RhbnRzLmNwcAorICAgIENPTU1BTkQgJHtUSFJJRlRfQ09NUElMRVJ9IC0tZ2VuIGNwcDp0ZW1wbGF0ZXMsY29iX3N0eWxlIC1yICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CispCisKK2FkZF9jdXN0b21fY29tbWFuZChPVVRQVVQgZ2VuLWNwcC9TdHJlc3NUZXN0X3R5cGVzLmNwcCBnZW4tY3BwL1N0cmVzc1Rlc3RfY29uc3RhbnRzLmNwcCBnZW4tY3BwL1NlcnZpY2UuY3BwCisgICAgQ09NTUFORCAke1RIUklGVF9DT01QSUxFUn0gLS1nZW4gY3BwICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L1N0cmVzc1Rlc3QudGhyaWZ0CispCmRpZmYgLS1naXQgYS90ZXN0L2NwcC9NYWtlZmlsZS5hbSBiL3Rlc3QvY3BwL01ha2VmaWxlLmFtCmluZGV4IDMzZTcxYTMuLmU4YmU4MGEgMTAwNzU1Ci0tLSBhL3Rlc3QvY3BwL01ha2VmaWxlLmFtCisrKyBiL3Rlc3QvY3BwL01ha2VmaWxlLmFtCkBAIC0xOCw4ICsxOCwxOSBAQAogIwogQVVUT01BS0VfT1BUSU9OUyA9IHN1YmRpci1vYmplY3RzIHNlcmlhbC10ZXN0cwogCitCVUlMVF9TT1VSQ0VTID0gZ2VuLWNwcC9UaHJpZnRUZXN0LmNwcCBcCisgICAgICAgICAgICAgICAgZ2VuLWNwcC9UaHJpZnRUZXN0X3R5cGVzLmNwcCBcCisgICAgICAgICAgICAgICAgZ2VuLWNwcC9UaHJpZnRUZXN0X2NvbnN0YW50cy5jcHAgXAorICAgICAgICAgICAgICAgIGdlbi1jcHAvU2Vjb25kU2VydmljZS5jcHAgXAorICAgICAgICAgICAgICAgIGdlbi1jcHAvU3RyZXNzVGVzdF90eXBlcy5jcHAgXAorICAgICAgICAgICAgICAgIGdlbi1jcHAvU3RyZXNzVGVzdF9jb25zdGFudHMuY3BwIFwKKyAgICAgICAgICAgICAgICBnZW4tY3BwL1NlcnZpY2UuY3BwCisKIG5vaW5zdF9MVExJQlJBUklFUyA9IGxpYnRlc3RnZW5jcHAubGEgbGlic3RyZXNzdGVzdGdlbmNwcC5sYQogbm9kaXN0X2xpYnRlc3RnZW5jcHBfbGFfU09VUkNFUyA9IFwKKwlnZW4tY3BwL1NlY29uZFNlcnZpY2UuY3BwIFwKKwlnZW4tY3BwL1NlY29uZFNlcnZpY2UuaCBcCisJZ2VuLWNwcC9TZWNvbmRTZXJ2aWNlLnRjYyBcCiAJZ2VuLWNwcC9UaHJpZnRUZXN0X2NvbnN0YW50cy5jcHAgXAogCWdlbi1jcHAvVGhyaWZ0VGVzdF9jb25zdGFudHMuaCBcCiAJZ2VuLWNwcC9UaHJpZnRUZXN0X3R5cGVzLmNwcCBcCkBAIC00Miw2ICs1Myw4IEBACiAKIGxpYnN0cmVzc3Rlc3RnZW5jcHBfbGFfTElCQUREID0gJCh0b3BfYnVpbGRkaXIpL2xpYi9jcHAvbGlidGhyaWZ0LmxhCiAKK3ByZWNyb3NzOiBUZXN0U2VydmVyIFRlc3RDbGllbnQKKwogY2hlY2tfUFJPR1JBTVMgPSBcCiAJVGVzdFNlcnZlciBcCiAJVGVzdENsaWVudCBcCkBAIC02MCw3ICs3Myw3IEBACiAJJCh0b3BfYnVpbGRkaXIpL2xpYi9jcHAvbGlidGhyaWZ0LmxhIFwKIAkkKHRvcF9idWlsZGRpcikvbGliL2NwcC9saWJ0aHJpZnR6LmxhIFwKIAkkKHRvcF9idWlsZGRpcikvbGliL2NwcC9saWJ0aHJpZnRuYi5sYSBcCi0JLWxldmVudCAtbGJvb3N0X3Byb2dyYW1fb3B0aW9ucyAtbGJvb3N0X3N5c3RlbSAtbGJvb3N0X2ZpbGVzeXN0ZW0KKwktbGV2ZW50IC1sYm9vc3RfcHJvZ3JhbV9vcHRpb25zIC1sYm9vc3Rfc3lzdGVtIC1sYm9vc3RfZmlsZXN5c3RlbSAkKFpMSUJfTElCUykKIAogVGVzdENsaWVudF9TT1VSQ0VTID0gXAogCXNyYy9UZXN0Q2xpZW50LmNwcApAQCAtNzAsNyArODMsNyBAQAogCSQodG9wX2J1aWxkZGlyKS9saWIvY3BwL2xpYnRocmlmdC5sYSBcCiAJJCh0b3BfYnVpbGRkaXIpL2xpYi9jcHAvbGlidGhyaWZ0ei5sYSBcCiAJJCh0b3BfYnVpbGRkaXIpL2xpYi9jcHAvbGlidGhyaWZ0bmIubGEgXAotCS1sZXZlbnQgLWxib29zdF9wcm9ncmFtX29wdGlvbnMgLWxib29zdF9zeXN0ZW0gLWxib29zdF9maWxlc3lzdGVtCisJLWxldmVudCAtbGJvb3N0X3Byb2dyYW1fb3B0aW9ucyAtbGJvb3N0X3N5c3RlbSAtbGJvb3N0X2ZpbGVzeXN0ZW0gJChaTElCX0xJQlMpCiAKIFN0cmVzc1Rlc3RfU09VUkNFUyA9IFwKIAlzcmMvU3RyZXNzVGVzdC5jcHAKQEAgLTg5LDI1ICsxMDIsMjQgQEAKICMKICMgQ29tbW9uIHRocmlmdCBjb2RlIGdlbmVyYXRpb24gcnVsZXMKICMKLVRIUklGVCA9ICQodG9wX2J1aWxkZGlyKS9jb21waWxlci9jcHAvdGhyaWZ0Ci0KLWdlbi1jcHAvVGhyaWZ0VGVzdC5jcHAgZ2VuLWNwcC9UaHJpZnRUZXN0X3R5cGVzLmNwcCBnZW4tY3BwL1RocmlmdFRlc3RfY29uc3RhbnRzLmNwcDogJCh0b3Bfc3JjZGlyKS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CitnZW4tY3BwL1RocmlmdFRlc3QuY3BwIGdlbi1jcHAvVGhyaWZ0VGVzdF90eXBlcy5jcHAgZ2VuLWNwcC9UaHJpZnRUZXN0X2NvbnN0YW50cy5jcHAgZ2VuLWNwcC9TZWNvbmRTZXJ2aWNlLmNwcCBnZW4tY3BwL1NlY29uZFNlcnZpY2UuaCBnZW4tY3BwL1NlY29uZFNlcnZpY2UudGNjOiAkKHRvcF9zcmNkaXIpL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQgJChUSFJJRlQpCiAJJChUSFJJRlQpIC0tZ2VuIGNwcDp0ZW1wbGF0ZXMsY29iX3N0eWxlIC1yICQ8CiAKLWdlbi1jcHAvU3RyZXNzVGVzdF90eXBlcy5jcHAgZ2VuLWNwcC9TdHJlc3NUZXN0X2NvbnN0YW50cy5jcHAgZ2VuLWNwcC9TZXJ2aWNlLmNwcDogJCh0b3Bfc3JjZGlyKS90ZXN0L1N0cmVzc1Rlc3QudGhyaWZ0CitnZW4tY3BwL1N0cmVzc1Rlc3RfdHlwZXMuY3BwIGdlbi1jcHAvU3RyZXNzVGVzdF9jb25zdGFudHMuY3BwIGdlbi1jcHAvU2VydmljZS5jcHA6ICQodG9wX3NyY2RpcikvdGVzdC9TdHJlc3NUZXN0LnRocmlmdCAkKFRIUklGVCkKIAkkKFRIUklGVCkgLS1nZW4gY3BwICQ8CiAKIEFNX0NQUEZMQUdTID0gJChCT09TVF9DUFBGTEFHUykgJChMSUJFVkVOVF9DUFBGTEFHUykgLUkkKHRvcF9zcmNkaXIpL2xpYi9jcHAvc3JjIC1JZ2VuLWNwcAotQU1fQ1hYRkxBR1MgPSAtV2FsbCAtV2V4dHJhIC1wZWRhbnRpYwotQU1fTERGTEFHUyA9ICQoQk9PU1RfTERGTEFHUykgJChMSUJFVkVOVF9MREZMQUdTKQorQU1fQ1hYRkxBR1MgPSAtV2FsbCAtV2V4dHJhIC1wZWRhbnRpYyAtRF9fU1REQ19GT1JNQVRfTUFDUk9TIC1EX19TVERDX0xJTUlUX01BQ1JPUworQU1fTERGTEFHUyA9ICQoQk9PU1RfTERGTEFHUykgJChMSUJFVkVOVF9MREZMQUdTKSAkKFpMSUJfTElCUykKIAogY2xlYW4tbG9jYWw6Ci0JJChSTSkgLXIgZ2VuLWNwcAorCSQoUk0pIGdlbi1jcHAvKgorCitzdHlsZS1sb2NhbDoKKwkkKENQUFNUWUxFX0NNRCkKIAogRVhUUkFfRElTVCA9IFwKIAlzcmMvVGVzdENsaWVudC5jcHAgXAogCXNyYy9UZXN0U2VydmVyLmNwcCBcCiAJc3JjL1N0cmVzc1Rlc3QuY3BwIFwKLQlzcmMvU3RyZXNzVGVzdE5vbkJsb2NraW5nLmNwcCBcCi0JcmVhbGxvYy9yZWFsbG9jX3Rlc3QuYyBcCi0JcmVhbGxvYy9NYWtlZmlsZQorCXNyYy9TdHJlc3NUZXN0Tm9uQmxvY2tpbmcuY3BwCmRpZmYgLS1naXQgYS90ZXN0L2NwcC9yZWFsbG9jL01ha2VmaWxlIGIvdGVzdC9jcHAvcmVhbGxvYy9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg5YmJiMy4uMDAwMDAwMAotLS0gYS90ZXN0L2NwcC9yZWFsbG9jL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLSMgVGhpcyBwcm9iYWJseSBzaG91bGQgbm90IGdvIGludG8gIm1ha2UgY2hlY2siLCBiZWNhdXNlIGl0IGlzIGFuIGV4cGVyaW1lbnQsCi0jIG5vdCBhIHRlc3QuICBTcGVjaWZpY2FsbHksIGl0IGlzIG1lYW50IHRvIGRldGVybWluZSBob3cgbGlrZWx5IHJlYWxsb2MgaXMKLSMgdG8gYXZvaWQgYSBjb3B5LiAgVGhpcyBpcyBwb29ybHkgZG9jdW1lbnRlZC4KLQotcnVuOiByZWFsbG9jX3Rlc3QKLQlmb3IgaXQgaW4gMSA0IDY0IDsgZG8gXAotCQlmb3IgbmIgaW4gMSA4IDY0IDUxMiA7IGRvIFwKLQkJCWZvciBtaW5zIGluIDY0IDUxMiA7IGRvIFwKLQkJCQlmb3IgbWF4cyBpbiAyMDQ4IDI2MjE0NCA7IGRvIFwKLQkJCQkJZm9yIGRiIGluIDggNjQgOyBkbyBcCi0JCQkJCQkuL3JlYWxsb2NfdGVzdCAkJG5iICQkbWlucyAkJG1heHMgJCRkYiAkJGl0IFwKLQkJCQkJOyBkb25lIFwKLQkJCQk7IGRvbmUgXAotCQkJOyBkb25lIFwKLQkJOyBkb25lIFwKLQk7IGRvbmUgXAotCT4gcmF3X3N0YXRzCi0KLUNGTEFHUyA9IC1XYWxsIC1nIC1zdGQ9Yzk5Ci1MRExJQlMgPSAtbGRsCi1yZWFsbG9jX3Rlc3Q6IHJlYWxsb2NfdGVzdC5jCmRpZmYgLS1naXQgYS90ZXN0L2NwcC9yZWFsbG9jL3JlYWxsb2NfdGVzdC5jIGIvdGVzdC9jcHAvcmVhbGxvYy9yZWFsbG9jX3Rlc3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk3NjNhZC4uMDAwMDAwMAotLS0gYS90ZXN0L2NwcC9yZWFsbG9jL3JlYWxsb2NfdGVzdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBfR05VX1NPVVJDRQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotI2luY2x1ZGUgPGRsZmNuLmg+Ci0KLWludCBjb3BpZXM7Ci1pbnQgbm9uX2NvcGllczsKLQotdm9pZCAqcmVhbGxvYyh2b2lkICpwdHIsIHNpemVfdCBzaXplKSB7Ci0gIHN0YXRpYyB2b2lkICooKnJlYWxfcmVhbGxvYykodm9pZCosIHNpemVfdCkgPSBOVUxMOwotICBpZiAocmVhbF9yZWFsbG9jID09IE5VTEwpIHsKLSAgICByZWFsX3JlYWxsb2MgPSAodm9pZCogKCopICh2b2lkKiwgc2l6ZV90KSkgZGxzeW0oUlRMRF9ORVhULCAicmVhbGxvYyIpOwotICB9Ci0KLSAgdm9pZCAqcmV0X3B0ciA9ICgqcmVhbF9yZWFsbG9jKShwdHIsIHNpemUpOwotCi0gIGlmIChyZXRfcHRyID09IHB0cikgewotICAgIG5vbl9jb3BpZXMrKzsKLSAgfSBlbHNlIHsKLSAgICBjb3BpZXMrKzsKLSAgfQotCi0gIHJldHVybiByZXRfcHRyOwotfQotCi0KLXN0cnVjdCBUTWVtb3J5QnVmZmVyIHsKLSAgdm9pZCogcHRyOwotICBpbnQgc2l6ZTsKLX07Ci0KLWludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pIHsKLSAgaW50IG51bV9idWZmZXJzOwotICBpbnQgaW5pdF9zaXplOwotICBpbnQgbWF4X3NpemU7Ci0gIGludCBkb3VibGluZ3M7Ci0gIGludCBpdGVyYXRpb25zOwotCi0gIGlmIChhcmdjIDwgNiB8fAotICAgICAgYXJnYyA+IDcgfHwKLSAgICAgIChudW1fYnVmZmVycyA9IGF0b2koYXJndlsxXSkpID09IDAgfHwKLSAgICAgIChpbml0X3NpemUgPSBhdG9pKGFyZ3ZbMl0pKSA9PSAwIHx8Ci0gICAgICAobWF4X3NpemUgPSBhdG9pKGFyZ3ZbM10pKSA9PSAwIHx8Ci0gICAgICBpbml0X3NpemUgPiBtYXhfc2l6ZSB8fAotICAgICAgKGl0ZXJhdGlvbnMgPSBhdG9pKGFyZ3ZbNF0pKSA9PSAwIHx8Ci0gICAgICAoZG91YmxpbmdzID0gYXRvaShhcmd2WzVdKSkgPT0gMCB8fAotICAgICAgKGFyZ2MgPT0gNyAmJiBhdG9pKGFyZ3ZbNl0pID09IDApKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJ1c2FnZTogcmVhbGxvY190ZXN0IDxudW1fYnVmZmVycz4gPGluaXRfc2l6ZT4gPG1heF9zaXplPiA8ZG91YmxpbmdzPiA8aXRlcmF0aW9ucz4gW3NlZWRdXG4iKTsKLSAgICBleGl0KEVYSVRfRkFJTFVSRSk7Ci0gIH0KLQotICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgYXJnYyA7IGkrKyApIHsKLSAgICBwcmludGYoIiVzICIsIGFyZ3ZbaV0pOwotICB9Ci0gIHByaW50ZigiXG4iKTsKLQotICBpZiAoYXJnYyA9PSA3KSB7Ci0gICAgc3JhbmQoYXRvaShhcmd2WzZdKSk7Ci0gIH0gZWxzZSB7Ci0gICAgc3JhbmQodGltZShOVUxMKSk7Ci0gIH0KLQotICBzdHJ1Y3QgVE1lbW9yeUJ1ZmZlciogYnVmZmVycyA9IGNhbGxvYyhudW1fYnVmZmVycywgc2l6ZW9mKCpidWZmZXJzKSk7Ci0gIGlmIChidWZmZXJzID09IE5VTEwpIGFib3J0KCk7Ci0KLSAgZm9yICggaW50IGkgPSAwIDsgaSA8IG51bV9idWZmZXJzIDsgaSsrICkgewotICAgIGJ1ZmZlcnNbaV0uc2l6ZSA9IG1heF9zaXplOwotICB9Ci0KLSAgd2hpbGUgKGl0ZXJhdGlvbnMgLS0+IDApIHsKLSAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgZG91YmxpbmdzICogbnVtX2J1ZmZlcnMgOyBpKysgKSB7Ci0gICAgICBzdHJ1Y3QgVE1lbW9yeUJ1ZmZlciogYnVmID0gJmJ1ZmZlcnNbcmFuZCgpICUgbnVtX2J1ZmZlcnNdOwotICAgICAgYnVmLT5zaXplICo9IDI7Ci0gICAgICBpZiAoYnVmLT5zaXplIDw9IG1heF9zaXplKSB7Ci0gICAgICAgIGJ1Zi0+cHRyID0gcmVhbGxvYyhidWYtPnB0ciwgYnVmLT5zaXplKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZyZWUoYnVmLT5wdHIpOwotICAgICAgICBidWYtPnNpemUgPSBpbml0X3NpemU7Ci0gICAgICAgIGJ1Zi0+cHRyID0gbWFsbG9jKGJ1Zi0+c2l6ZSk7Ci0gICAgICB9Ci0gICAgICBpZiAoYnVmLT5wdHIgPT0gTlVMTCkgYWJvcnQoKTsKLSAgICB9Ci0gIH0KLQotICBwcmludGYoIk5vbi1jb3BpZWQgJWQvJWQgKCUuMmYlJSlcbiIsIG5vbl9jb3BpZXMsIGNvcGllcyArIG5vbl9jb3BpZXMsIDEwMC4wICogbm9uX2NvcGllcyAvIChjb3BpZXMgKyBub25fY29waWVzKSk7Ci0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvdGVzdC9jcHAvc3JjL1N0cmVzc1Rlc3QuY3BwIGIvdGVzdC9jcHAvc3JjL1N0cmVzc1Rlc3QuY3BwCmluZGV4IGRmZTgzNTAuLjU4NWY4OWEgMTAwNjQ0Ci0tLSBhL3Rlc3QvY3BwL3NyYy9TdHJlc3NUZXN0LmNwcAorKysgYi90ZXN0L2NwcC9zcmMvU3RyZXNzVGVzdC5jcHAKQEAgLTMzLDE0ICszMywxMyBAQAogI2luY2x1ZGUgPHRocmlmdC9UTG9nZ2luZy5oPgogCiAjaW5jbHVkZSAiU2VydmljZS5oIgotCiAjaW5jbHVkZSA8aW9zdHJlYW0+CiAjaW5jbHVkZSA8c2V0PgogI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KICNpbmNsdWRlIDxzc3RyZWFtPgogI2luY2x1ZGUgPG1hcD4KICNpZiBfV0lOMzIKLSAgICNpbmNsdWRlIDx0aHJpZnQvd2luZG93cy9UV2luc29ja1NpbmdsZXRvbi5oPgorI2luY2x1ZGUgPHRocmlmdC93aW5kb3dzL1RXaW5zb2NrU2luZ2xldG9uLmg+CiAjZW5kaWYKIAogdXNpbmcgbmFtZXNwYWNlIHN0ZDsKQEAgLTU0LDIzICs1MywxOCBAQAogdXNpbmcgbmFtZXNwYWNlIHRlc3Q6OnN0cmVzczsKIAogc3RydWN0IGVxc3RyIHsKLSAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IGNoYXIqIHMxLCBjb25zdCBjaGFyKiBzMikgY29uc3QgewotICAgIHJldHVybiBzdHJjbXAoczEsIHMyKSA9PSAwOwotICB9CisgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBjaGFyKiBzMSwgY29uc3QgY2hhciogczIpIGNvbnN0IHsgcmV0dXJuIHN0cmNtcChzMSwgczIpID09IDA7IH0KIH07CiAKIHN0cnVjdCBsdHN0ciB7Ci0gIGJvb2wgb3BlcmF0b3IoKShjb25zdCBjaGFyKiBzMSwgY29uc3QgY2hhciogczIpIGNvbnN0IHsKLSAgICByZXR1cm4gc3RyY21wKHMxLCBzMikgPCAwOwotICB9CisgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBjaGFyKiBzMSwgY29uc3QgY2hhciogczIpIGNvbnN0IHsgcmV0dXJuIHN0cmNtcChzMSwgczIpIDwgMDsgfQogfTsKIAotCiAvLyB0eXBlZGVmIGhhc2hfbWFwPGNvbnN0IGNoYXIqLCBpbnQsIGhhc2g8Y29uc3QgY2hhcio+LCBlcXN0cj4gY291bnRfbWFwOwogdHlwZWRlZiBtYXA8Y29uc3QgY2hhciosIGludCwgbHRzdHI+IGNvdW50X21hcDsKIAogY2xhc3MgU2VydmVyIDogcHVibGljIFNlcnZpY2VJZiB7Ci0gcHVibGljOgorcHVibGljOgogICBTZXJ2ZXIoKSB7fQogCiAgIHZvaWQgY291bnQoY29uc3QgY2hhciogbWV0aG9kKSB7CkBAIC04OSw2NyArODMsOTIgQEAKICAgICByZXR1cm4gY291bnRzXzsKICAgfQogCi0gIGludDhfdCBlY2hvQnl0ZShjb25zdCBpbnQ4X3QgYXJnKSB7cmV0dXJuIGFyZzt9Ci0gIGludDMyX3QgZWNob0kzMihjb25zdCBpbnQzMl90IGFyZykge3JldHVybiBhcmc7fQotICBpbnQ2NF90IGVjaG9JNjQoY29uc3QgaW50NjRfdCBhcmcpIHtyZXR1cm4gYXJnO30KLSAgdm9pZCBlY2hvU3RyaW5nKHN0cmluZyYgb3V0LCBjb25zdCBzdHJpbmcgJmFyZykgeworICBpbnQ4X3QgZWNob0J5dGUoY29uc3QgaW50OF90IGFyZykgeyByZXR1cm4gYXJnOyB9CisgIGludDMyX3QgZWNob0kzMihjb25zdCBpbnQzMl90IGFyZykgeyByZXR1cm4gYXJnOyB9CisgIGludDY0X3QgZWNob0k2NChjb25zdCBpbnQ2NF90IGFyZykgeyByZXR1cm4gYXJnOyB9CisgIHZvaWQgZWNob1N0cmluZyhzdHJpbmcmIG91dCwgY29uc3Qgc3RyaW5nJiBhcmcpIHsKICAgICBpZiAoYXJnICE9ICJoZWxsbyIpIHsKICAgICAgIFRfRVJST1JfQUJPUlQoIldST05HIFNUUklORyAoJXMpISEhISIsIGFyZy5jX3N0cigpKTsKICAgICB9CiAgICAgb3V0ID0gYXJnOwogICB9Ci0gIHZvaWQgZWNob0xpc3QodmVjdG9yPGludDhfdD4gJm91dCwgY29uc3QgdmVjdG9yPGludDhfdD4gJmFyZykgeyBvdXQgPSBhcmc7IH0KLSAgdm9pZCBlY2hvU2V0KHNldDxpbnQ4X3Q+ICZvdXQsIGNvbnN0IHNldDxpbnQ4X3Q+ICZhcmcpIHsgb3V0ID0gYXJnOyB9Ci0gIHZvaWQgZWNob01hcChtYXA8aW50OF90LCBpbnQ4X3Q+ICZvdXQsIGNvbnN0IG1hcDxpbnQ4X3QsIGludDhfdD4gJmFyZykgeyBvdXQgPSBhcmc7IH0KKyAgdm9pZCBlY2hvTGlzdCh2ZWN0b3I8aW50OF90PiYgb3V0LCBjb25zdCB2ZWN0b3I8aW50OF90PiYgYXJnKSB7IG91dCA9IGFyZzsgfQorICB2b2lkIGVjaG9TZXQoc2V0PGludDhfdD4mIG91dCwgY29uc3Qgc2V0PGludDhfdD4mIGFyZykgeyBvdXQgPSBhcmc7IH0KKyAgdm9pZCBlY2hvTWFwKG1hcDxpbnQ4X3QsIGludDhfdD4mIG91dCwgY29uc3QgbWFwPGludDhfdCwgaW50OF90PiYgYXJnKSB7IG91dCA9IGFyZzsgfQogCiBwcml2YXRlOgogICBjb3VudF9tYXAgY291bnRzXzsKICAgTXV0ZXggbG9ja187Ci0KIH07CiAKLWNsYXNzIENsaWVudFRocmVhZDogcHVibGljIFJ1bm5hYmxlIHsKK2VudW0gVHJhbnNwb3J0T3BlbkNsb3NlQmVoYXZpb3IgeworICBPcGVuQW5kQ2xvc2VUcmFuc3BvcnRJblRocmVhZCwKKyAgRG9udE9wZW5BbmRDbG9zZVRyYW5zcG9ydEluVGhyZWFkCit9OworY2xhc3MgQ2xpZW50VGhyZWFkIDogcHVibGljIFJ1bm5hYmxlIHsKIHB1YmxpYzoKLQotICBDbGllbnRUaHJlYWQoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD50cmFuc3BvcnQsIGJvb3N0OjpzaGFyZWRfcHRyPFNlcnZpY2VDbGllbnQ+IGNsaWVudCwgTW9uaXRvciYgbW9uaXRvciwgc2l6ZV90JiB3b3JrZXJDb3VudCwgc2l6ZV90IGxvb3BDb3VudCwgVFR5cGUgbG9vcFR5cGUpIDoKLSAgICBfdHJhbnNwb3J0KHRyYW5zcG9ydCksCi0gICAgX2NsaWVudChjbGllbnQpLAotICAgIF9tb25pdG9yKG1vbml0b3IpLAotICAgIF93b3JrZXJDb3VudCh3b3JrZXJDb3VudCksCi0gICAgX2xvb3BDb3VudChsb29wQ291bnQpLAotICAgIF9sb29wVHlwZShsb29wVHlwZSkKLSAge30KKyAgQ2xpZW50VGhyZWFkKHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQsCisgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8U2VydmljZUlmPiBjbGllbnQsCisgICAgICAgICAgICAgICBNb25pdG9yJiBtb25pdG9yLAorICAgICAgICAgICAgICAgc2l6ZV90JiB3b3JrZXJDb3VudCwKKyAgICAgICAgICAgICAgIHNpemVfdCBsb29wQ291bnQsCisgICAgICAgICAgICAgICBUVHlwZSBsb29wVHlwZSwKKyAgICAgICAgICAgICAgIFRyYW5zcG9ydE9wZW5DbG9zZUJlaGF2aW9yIGJlaGF2aW9yKQorICAgIDogX3RyYW5zcG9ydCh0cmFuc3BvcnQpLAorICAgICAgX2NsaWVudChjbGllbnQpLAorICAgICAgX21vbml0b3IobW9uaXRvciksCisgICAgICBfd29ya2VyQ291bnQod29ya2VyQ291bnQpLAorICAgICAgX2xvb3BDb3VudChsb29wQ291bnQpLAorICAgICAgX2xvb3BUeXBlKGxvb3BUeXBlKSwKKyAgICAgIF9iZWhhdmlvcihiZWhhdmlvcikge30KIAogICB2b2lkIHJ1bigpIHsKIAogICAgIC8vIFdhaXQgZm9yIGFsbCB3b3JrZXIgdGhyZWFkcyB0byBzdGFydAogCi0gICAge1N5bmNocm9uaXplZCBzKF9tb25pdG9yKTsKLSAgICAgIHdoaWxlKF93b3JrZXJDb3VudCA9PSAwKSB7CisgICAgeworICAgICAgU3luY2hyb25pemVkIHMoX21vbml0b3IpOworICAgICAgd2hpbGUgKF93b3JrZXJDb3VudCA9PSAwKSB7CiAgICAgICAgIF9tb25pdG9yLndhaXQoKTsKICAgICAgIH0KICAgICB9CiAKICAgICBfc3RhcnRUaW1lID0gVXRpbDo6Y3VycmVudFRpbWUoKTsKKyAgICBpZihfYmVoYXZpb3IgPT0gT3BlbkFuZENsb3NlVHJhbnNwb3J0SW5UaHJlYWQpIHsKKyAgICAgIF90cmFuc3BvcnQtPm9wZW4oKTsKKyAgICB9CiAKLSAgICBfdHJhbnNwb3J0LT5vcGVuKCk7Ci0KLSAgICBzd2l0Y2goX2xvb3BUeXBlKSB7Ci0gICAgY2FzZSBUX1ZPSUQ6IGxvb3BFY2hvVm9pZCgpOyBicmVhazsKLSAgICBjYXNlIFRfQllURTogbG9vcEVjaG9CeXRlKCk7IGJyZWFrOwotICAgIGNhc2UgVF9JMzI6IGxvb3BFY2hvSTMyKCk7IGJyZWFrOwotICAgIGNhc2UgVF9JNjQ6IGxvb3BFY2hvSTY0KCk7IGJyZWFrOwotICAgIGNhc2UgVF9TVFJJTkc6IGxvb3BFY2hvU3RyaW5nKCk7IGJyZWFrOwotICAgIGRlZmF1bHQ6IGNlcnIgPDwgIlVuZXhwZWN0ZWQgbG9vcCB0eXBlIiA8PCBfbG9vcFR5cGUgPDwgZW5kbDsgYnJlYWs7CisgICAgc3dpdGNoIChfbG9vcFR5cGUpIHsKKyAgICBjYXNlIFRfVk9JRDoKKyAgICAgIGxvb3BFY2hvVm9pZCgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUX0JZVEU6CisgICAgICBsb29wRWNob0J5dGUoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVF9JMzI6CisgICAgICBsb29wRWNob0kzMigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUX0k2NDoKKyAgICAgIGxvb3BFY2hvSTY0KCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRfU1RSSU5HOgorICAgICAgbG9vcEVjaG9TdHJpbmcoKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBjZXJyIDw8ICJVbmV4cGVjdGVkIGxvb3AgdHlwZSIgPDwgX2xvb3BUeXBlIDw8IGVuZGw7CisgICAgICBicmVhazsKICAgICB9CiAKICAgICBfZW5kVGltZSA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7CiAKLSAgICBfdHJhbnNwb3J0LT5jbG9zZSgpOworICAgIGlmKF9iZWhhdmlvciA9PSBPcGVuQW5kQ2xvc2VUcmFuc3BvcnRJblRocmVhZCkgeworICAgICAgX3RyYW5zcG9ydC0+Y2xvc2UoKTsKKyAgICB9CiAKICAgICBfZG9uZSA9IHRydWU7CiAKLSAgICB7U3luY2hyb25pemVkIHMoX21vbml0b3IpOworICAgIHsKKyAgICAgIFN5bmNocm9uaXplZCBzKF9tb25pdG9yKTsKIAogICAgICAgX3dvcmtlckNvdW50LS07CiAKQEAgLTE3MCw3ICsxODksNyBAQAogICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCBfbG9vcENvdW50OyBpeCsrKSB7CiAgICAgICBpbnQ4X3QgYXJnID0gMTsKICAgICAgIGludDhfdCByZXN1bHQ7Ci0gICAgICByZXN1bHQgPV9jbGllbnQtPmVjaG9CeXRlKGFyZyk7CisgICAgICByZXN1bHQgPSBfY2xpZW50LT5lY2hvQnl0ZShhcmcpOwogICAgICAgKHZvaWQpcmVzdWx0OwogICAgICAgYXNzZXJ0KHJlc3VsdCA9PSBhcmcpOwogICAgIH0KQEAgLTE4MCw3ICsxOTksNyBAQAogICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCBfbG9vcENvdW50OyBpeCsrKSB7CiAgICAgICBpbnQzMl90IGFyZyA9IDE7CiAgICAgICBpbnQzMl90IHJlc3VsdDsKLSAgICAgIHJlc3VsdCA9X2NsaWVudC0+ZWNob0kzMihhcmcpOworICAgICAgcmVzdWx0ID0gX2NsaWVudC0+ZWNob0kzMihhcmcpOwogICAgICAgKHZvaWQpcmVzdWx0OwogICAgICAgYXNzZXJ0KHJlc3VsdCA9PSBhcmcpOwogICAgIH0KQEAgLTE5MCw3ICsyMDksNyBAQAogICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCBfbG9vcENvdW50OyBpeCsrKSB7CiAgICAgICBpbnQ2NF90IGFyZyA9IDE7CiAgICAgICBpbnQ2NF90IHJlc3VsdDsKLSAgICAgIHJlc3VsdCA9X2NsaWVudC0+ZWNob0k2NChhcmcpOworICAgICAgcmVzdWx0ID0gX2NsaWVudC0+ZWNob0k2NChhcmcpOwogICAgICAgKHZvaWQpcmVzdWx0OwogICAgICAgYXNzZXJ0KHJlc3VsdCA9PSBhcmcpOwogICAgIH0KQEAgLTIwNSw4ICsyMjQsOCBAQAogICAgIH0KICAgfQogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IF90cmFuc3BvcnQ7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFNlcnZpY2VDbGllbnQ+IF9jbGllbnQ7CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBfdHJhbnNwb3J0OworICBzdGQ6OnNoYXJlZF9wdHI8U2VydmljZUlmPiBfY2xpZW50OwogICBNb25pdG9yJiBfbW9uaXRvcjsKICAgc2l6ZV90JiBfd29ya2VyQ291bnQ7CiAgIHNpemVfdCBfbG9vcENvdW50OwpAQCAtMjE1LDQxICsyMzQsNDEgQEAKICAgaW50NjRfdCBfZW5kVGltZTsKICAgYm9vbCBfZG9uZTsKICAgTW9uaXRvciBfc2xlZXA7CisgIFRyYW5zcG9ydE9wZW5DbG9zZUJlaGF2aW9yIF9iZWhhdmlvcjsKIH07CiAKLWNsYXNzIFRTdGFydE9ic2VydmVyIDogcHVibGljIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXI6OlRTZXJ2ZXJFdmVudEhhbmRsZXIKLXsKK2NsYXNzIFRTdGFydE9ic2VydmVyIDogcHVibGljIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXI6OlRTZXJ2ZXJFdmVudEhhbmRsZXIgewogcHVibGljOgotICAgVFN0YXJ0T2JzZXJ2ZXIoKSA6IGF3YWtlXyhmYWxzZSkge30KLSAgIHZpcnR1YWwgdm9pZCBwcmVTZXJ2ZSgpCi0gICB7Ci0gICAgICBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlN5bmNocm9uaXplZCBzKG1fKTsKLSAgICAgIGF3YWtlXyA9IHRydWU7Ci0gICAgICBtXy5ub3RpZnlBbGwoKTsKLSAgIH0KLSAgIHZvaWQgd2FpdEZvclNlcnZpY2UoKQotICAgewotICAgICAgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpTeW5jaHJvbml6ZWQgcyhtXyk7Ci0gICAgICB3aGlsZSghYXdha2VfKQotICAgICAgICAgbV8ud2FpdEZvcmV2ZXIoKTsKLSAgIH0KLSBwcml2YXRlOgotICAgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpNb25pdG9yIG1fOwotICAgYm9vbCBhd2FrZV87CisgIFRTdGFydE9ic2VydmVyKCkgOiBhd2FrZV8oZmFsc2UpIHt9CisgIHZpcnR1YWwgdm9pZCBwcmVTZXJ2ZSgpIHsKKyAgICBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlN5bmNocm9uaXplZCBzKG1fKTsKKyAgICBhd2FrZV8gPSB0cnVlOworICAgIG1fLm5vdGlmeUFsbCgpOworICB9CisgIHZvaWQgd2FpdEZvclNlcnZpY2UoKSB7CisgICAgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpTeW5jaHJvbml6ZWQgcyhtXyk7CisgICAgd2hpbGUgKCFhd2FrZV8pCisgICAgICBtXy53YWl0Rm9yZXZlcigpOworICB9CisKK3ByaXZhdGU6CisgIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6TW9uaXRvciBtXzsKKyAgYm9vbCBhd2FrZV87CiB9OwogCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgewogI2lmIF9XSU4zMgogICB0cmFuc3BvcnQ6OlRXaW5zb2NrU2luZ2xldG9uOjpjcmVhdGUoKTsKICNlbmRpZgogCiAgIGludCBwb3J0ID0gOTA5MTsKKyAgc3RyaW5nIGNsaWVudFR5cGUgPSAicmVndWxhciI7CiAgIHN0cmluZyBzZXJ2ZXJUeXBlID0gInRocmVhZC1wb29sIjsKICAgc3RyaW5nIHByb3RvY29sVHlwZSA9ICJiaW5hcnkiOwogICBzaXplX3Qgd29ya2VyQ291bnQgPSA0OwogICBzaXplX3QgY2xpZW50Q291bnQgPSAyMDsKICAgc2l6ZV90IGxvb3BDb3VudCA9IDUwMDAwOwotICBUVHlwZSBsb29wVHlwZSAgPSBUX1ZPSUQ7CisgIFRUeXBlIGxvb3BUeXBlID0gVF9WT0lEOwogICBzdHJpbmcgY2FsbE5hbWUgPSAiZWNob1ZvaWQiOwogICBib29sIHJ1blNlcnZlciA9IHRydWU7CiAgIGJvb2wgbG9nUmVxdWVzdHMgPSBmYWxzZTsKQEAgLTI1OCwyOCArMjc3LDM0IEBACiAKICAgb3N0cmluZ3N0cmVhbSB1c2FnZTsKIAotICB1c2FnZSA8PAotICAgIGFyZ3ZbMF0gPDwgIiBbLS1wb3J0PTxwb3J0IG51bWJlcj5dIFstLXNlcnZlcl0gWy0tc2VydmVyLXR5cGU9PHNlcnZlci10eXBlPl0gWy0tcHJvdG9jb2wtdHlwZT08cHJvdG9jb2wtdHlwZT5dIFstLXdvcmtlcnM9PHdvcmtlci1jb3VudD5dIFstLWNsaWVudHM9PGNsaWVudC1jb3VudD5dIFstLWxvb3A9PGxvb3AtY291bnQ+XSIgPDwgZW5kbCA8PAotICAgICJcdGNsaWVudHMgICAgICAgIE51bWJlciBvZiBjbGllbnQgdGhyZWFkcyB0byBjcmVhdGUgLSAwIGltcGxpZXMgbm8gY2xpZW50cywgaS5lLiBzZXJ2ZXIgb25seS4gIERlZmF1bHQgaXMgIiA8PCBjbGllbnRDb3VudCA8PCBlbmRsIDw8Ci0gICAgIlx0aGVscCAgICAgICAgICAgUHJpbnRzIHRoaXMgaGVscCB0ZXh0LiIgPDwgZW5kbCA8PAotICAgICJcdGNhbGwgICAgICAgICAgIFNlcnZpY2UgbWV0aG9kIHRvIGNhbGwuICBEZWZhdWx0IGlzICIgPDwgY2FsbE5hbWUgPDwgZW5kbCA8PAotICAgICJcdGxvb3AgICAgICAgICAgIFRoZSBudW1iZXIgb2YgcmVtb3RlIHRocmlmdCBjYWxscyBlYWNoIGNsaWVudCBtYWtlcy4gIERlZmF1bHQgaXMgIiA8PCBsb29wQ291bnQgPDwgZW5kbCA8PAotICAgICJcdHBvcnQgICAgICAgICAgIFRoZSBwb3J0IHRoZSBzZXJ2ZXIgYW5kIGNsaWVudHMgc2hvdWxkIGJpbmQgdG8gZm9yIHRocmlmdCBuZXR3b3JrIGNvbm5lY3Rpb25zLiAgRGVmYXVsdCBpcyAiIDw8IHBvcnQgPDwgZW5kbCA8PAotICAgICJcdHNlcnZlciAgICAgICAgIFJ1biB0aGUgVGhyaWZ0IHNlcnZlciBpbiB0aGlzIHByb2Nlc3MuICBEZWZhdWx0IGlzICIgPDwgcnVuU2VydmVyIDw8IGVuZGwgPDwKLSAgICAiXHRzZXJ2ZXItdHlwZSAgICBUeXBlIG9mIHNlcnZlciwgXCJzaW1wbGVcIiBvciBcInRocmVhZC1wb29sXCIuICBEZWZhdWx0IGlzICIgPDwgc2VydmVyVHlwZSA8PCBlbmRsIDw8Ci0gICAgIlx0cHJvdG9jb2wtdHlwZSAgVHlwZSBvZiBwcm90b2NvbCwgXCJiaW5hcnlcIiwgXCJhc2NpaVwiLCBvciBcInhtbFwiLiAgRGVmYXVsdCBpcyAiIDw8IHByb3RvY29sVHlwZSA8PCBlbmRsIDw8Ci0gICAgIlx0bG9nLXJlcXVlc3QgICAgTG9nIGFsbCByZXF1ZXN0IHRvIC4vcmVxdWVzdGxvZy50bG9nLiBEZWZhdWx0IGlzICIgPDwgbG9nUmVxdWVzdHMgPDwgZW5kbCA8PAotICAgICJcdHJlcGxheS1yZXF1ZXN0IFJlcGxheSByZXF1ZXN0cyBmcm9tIGxvZyBmaWxlICguL3JlcXVlc3Rsb2cudGxvZykgRGVmYXVsdCBpcyAiIDw8IHJlcGxheVJlcXVlc3RzIDw8IGVuZGwgPDwKLSAgICAiXHR3b3JrZXJzICAgICAgICBOdW1iZXIgb2YgdGhyZWFkIHBvb2xzIHdvcmtlcnMuICBPbmx5IHZhbGlkIGZvciB0aHJlYWQtcG9vbCBzZXJ2ZXIgdHlwZS4gIERlZmF1bHQgaXMgIiA8PCB3b3JrZXJDb3VudCA8PCBlbmRsOworICB1c2FnZSA8PCBhcmd2WzBdIDw8ICIgWy0tcG9ydD08cG9ydCBudW1iZXI+XSBbLS1zZXJ2ZXJdIFstLXNlcnZlci10eXBlPTxzZXJ2ZXItdHlwZT5dICIKKyAgICAgICAgICAgICAgICAgICAgICAiWy0tcHJvdG9jb2wtdHlwZT08cHJvdG9jb2wtdHlwZT5dIFstLXdvcmtlcnM9PHdvcmtlci1jb3VudD5dICIKKyAgICAgICAgICAgICAgICAgICAgICAiWy0tY2xpZW50cz08Y2xpZW50LWNvdW50Pl0gWy0tbG9vcD08bG9vcC1jb3VudD5dICIKKyAgICAgICAgICAgICAgICAgICAgICAiWy0tY2xpZW50LXR5cGU9PGNsaWVudC10eXBlPl0iIDw8IGVuZGwKKyAgICAgICAgPDwgIlx0Y2xpZW50cyAgICAgICAgTnVtYmVyIG9mIGNsaWVudCB0aHJlYWRzIHRvIGNyZWF0ZSAtIDAgaW1wbGllcyBubyBjbGllbnRzLCBpLmUuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2VydmVyIG9ubHkuICBEZWZhdWx0IGlzICIgPDwgY2xpZW50Q291bnQgPDwgZW5kbAorICAgICAgICA8PCAiXHRoZWxwICAgICAgICAgICBQcmludHMgdGhpcyBoZWxwIHRleHQuIiA8PCBlbmRsCisgICAgICAgIDw8ICJcdGNhbGwgICAgICAgICAgIFNlcnZpY2UgbWV0aG9kIHRvIGNhbGwuICBEZWZhdWx0IGlzICIgPDwgY2FsbE5hbWUgPDwgZW5kbAorICAgICAgICA8PCAiXHRsb29wICAgICAgICAgICBUaGUgbnVtYmVyIG9mIHJlbW90ZSB0aHJpZnQgY2FsbHMgZWFjaCBjbGllbnQgbWFrZXMuICBEZWZhdWx0IGlzICIgPDwgbG9vcENvdW50IDw8IGVuZGwKKyAgICAgICAgPDwgIlx0cG9ydCAgICAgICAgICAgVGhlIHBvcnQgdGhlIHNlcnZlciBhbmQgY2xpZW50cyBzaG91bGQgYmluZCB0byAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvciB0aHJpZnQgbmV0d29yayBjb25uZWN0aW9ucy4gIERlZmF1bHQgaXMgIiA8PCBwb3J0IDw8IGVuZGwKKyAgICAgICAgPDwgIlx0c2VydmVyICAgICAgICAgUnVuIHRoZSBUaHJpZnQgc2VydmVyIGluIHRoaXMgcHJvY2Vzcy4gIERlZmF1bHQgaXMgIiA8PCBydW5TZXJ2ZXIgPDwgZW5kbAorICAgICAgICA8PCAiXHRzZXJ2ZXItdHlwZSAgICBUeXBlIG9mIHNlcnZlciwgXCJzaW1wbGVcIiBvciBcInRocmVhZC1wb29sXCIuICBEZWZhdWx0IGlzICIgPDwgc2VydmVyVHlwZSA8PCBlbmRsCisgICAgICAgIDw8ICJcdHByb3RvY29sLXR5cGUgIFR5cGUgb2YgcHJvdG9jb2wsIFwiYmluYXJ5XCIsIFwiYXNjaWlcIiwgb3IgXCJ4bWxcIi4gIERlZmF1bHQgaXMgIiA8PCBwcm90b2NvbFR5cGUgPDwgZW5kbAorICAgICAgICA8PCAiXHRsb2ctcmVxdWVzdCAgICBMb2cgYWxsIHJlcXVlc3QgdG8gLi9yZXF1ZXN0bG9nLnRsb2cuIERlZmF1bHQgaXMgIiA8PCBsb2dSZXF1ZXN0cyA8PCBlbmRsCisgICAgICAgIDw8ICJcdHJlcGxheS1yZXF1ZXN0IFJlcGxheSByZXF1ZXN0cyBmcm9tIGxvZyBmaWxlICguL3JlcXVlc3Rsb2cudGxvZykgRGVmYXVsdCBpcyAiIDw8IHJlcGxheVJlcXVlc3RzIDw8IGVuZGwKKyAgICAgICAgPDwgIlx0d29ya2VycyAgICAgICAgTnVtYmVyIG9mIHRocmVhZCBwb29scyB3b3JrZXJzLiAgT25seSB2YWxpZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvciB0aHJlYWQtcG9vbCBzZXJ2ZXIgdHlwZS4gIERlZmF1bHQgaXMgIiA8PCB3b3JrZXJDb3VudCA8PCBlbmRsCisgICAgICAgIDw8ICJcdGNsaWVudC10eXBlICAgIFR5cGUgb2YgY2xpZW50LCBcInJlZ3VsYXJcIiBvciBcImNvbmN1cnJlbnRcIi4gIERlZmF1bHQgaXMgIiA8PCBjbGllbnRUeXBlIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbDsKIAotCi0gIG1hcDxzdHJpbmcsIHN0cmluZz4gIGFyZ3M7CisgIG1hcDxzdHJpbmcsIHN0cmluZz4gYXJnczsKIAogICBmb3IgKGludCBpeCA9IDE7IGl4IDwgYXJnYzsgaXgrKykgewogCiAgICAgc3RyaW5nIGFyZyhhcmd2W2l4XSk7CiAKLSAgICBpZiAoYXJnLmNvbXBhcmUoMCwyLCAiLS0iKSA9PSAwKSB7CisgICAgaWYgKGFyZy5jb21wYXJlKDAsIDIsICItLSIpID09IDApIHsKIAogICAgICAgc2l6ZV90IGVuZCA9IGFyZy5maW5kX2ZpcnN0X29mKCI9IiwgMik7CiAKQEAgLTI5MSw3ICszMTYsNyBAQAogICAgICAgICBhcmdzW2tleV0gPSAidHJ1ZSI7CiAgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgIHRocm93IGludmFsaWRfYXJndW1lbnQoIlVuZXhjZXB0ZWQgY29tbWFuZCBsaW5lIHRva2VuOiAiK2FyZyk7CisgICAgICB0aHJvdyBpbnZhbGlkX2FyZ3VtZW50KCJVbmV4Y2VwdGVkIGNvbW1hbmQgbGluZSB0b2tlbjogIiArIGFyZyk7CiAgICAgfQogICB9CiAKQEAgLTM0MSw5MSArMzY2LDEwNyBAQAogCiAgICAgICB9IGVsc2UgewogCi0gICAgICAgIHRocm93IGludmFsaWRfYXJndW1lbnQoIlVua25vd24gc2VydmVyIHR5cGUgIitzZXJ2ZXJUeXBlKTsKKyAgICAgICAgdGhyb3cgaW52YWxpZF9hcmd1bWVudCgiVW5rbm93biBzZXJ2ZXIgdHlwZSAiICsgc2VydmVyVHlwZSk7CiAgICAgICB9CiAgICAgfQorICAgIGlmICghYXJnc1siY2xpZW50LXR5cGUiXS5lbXB0eSgpKSB7CisgICAgICBjbGllbnRUeXBlID0gYXJnc1siY2xpZW50LXR5cGUiXTsKIAorICAgICAgaWYgKGNsaWVudFR5cGUgPT0gInJlZ3VsYXIiKSB7CisKKyAgICAgIH0gZWxzZSBpZiAoY2xpZW50VHlwZSA9PSAiY29uY3VycmVudCIpIHsKKworICAgICAgfSBlbHNlIHsKKworICAgICAgICB0aHJvdyBpbnZhbGlkX2FyZ3VtZW50KCJVbmtub3duIGNsaWVudCB0eXBlICIgKyBjbGllbnRUeXBlKTsKKyAgICAgIH0KKyAgICB9CiAgICAgaWYgKCFhcmdzWyJ3b3JrZXJzIl0uZW1wdHkoKSkgewogICAgICAgd29ya2VyQ291bnQgPSBhdG9pKGFyZ3NbIndvcmtlcnMiXS5jX3N0cigpKTsKICAgICB9CiAKLSAgfSBjYXRjaChzdGQ6OmV4Y2VwdGlvbiYgZSkgeworICB9IGNhdGNoIChzdGQ6OmV4Y2VwdGlvbiYgZSkgewogICAgIGNlcnIgPDwgZS53aGF0KCkgPDwgZW5kbDsKICAgICBjZXJyIDw8IHVzYWdlLnN0cigpOwogICB9CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8UGxhdGZvcm1UaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5ID0gYm9vc3Q6OnNoYXJlZF9wdHI8UGxhdGZvcm1UaHJlYWRGYWN0b3J5PihuZXcgUGxhdGZvcm1UaHJlYWRGYWN0b3J5KCkpOworICBzdGQ6OnNoYXJlZF9wdHI8UGxhdGZvcm1UaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5CisgICAgICA9IHN0ZDo6c2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+KG5ldyBQbGF0Zm9ybVRocmVhZEZhY3RvcnkoKSk7CiAKICAgLy8gRGlzcGF0Y2hlcgotICBib29zdDo6c2hhcmVkX3B0cjxTZXJ2ZXI+IHNlcnZpY2VIYW5kbGVyKG5ldyBTZXJ2ZXIoKSk7CisgIHN0ZDo6c2hhcmVkX3B0cjxTZXJ2ZXI+IHNlcnZpY2VIYW5kbGVyKG5ldyBTZXJ2ZXIoKSk7CiAKICAgaWYgKHJlcGxheVJlcXVlc3RzKSB7Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8U2VydmVyPiBzZXJ2aWNlSGFuZGxlcihuZXcgU2VydmVyKCkpOwotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFNlcnZpY2VQcm9jZXNzb3I+IHNlcnZpY2VQcm9jZXNzb3IobmV3IFNlcnZpY2VQcm9jZXNzb3Ioc2VydmljZUhhbmRsZXIpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8U2VydmVyPiBzZXJ2aWNlSGFuZGxlcihuZXcgU2VydmVyKCkpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxTZXJ2aWNlUHJvY2Vzc29yPiBzZXJ2aWNlUHJvY2Vzc29yKG5ldyBTZXJ2aWNlUHJvY2Vzc29yKHNlcnZpY2VIYW5kbGVyKSk7CiAKICAgICAvLyBUcmFuc3BvcnRzCi0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VEZpbGVUcmFuc3BvcnQ+IGZpbGVUcmFuc3BvcnQobmV3IFRGaWxlVHJhbnNwb3J0KHJlcXVlc3RMb2dQYXRoKSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRGaWxlVHJhbnNwb3J0PiBmaWxlVHJhbnNwb3J0KG5ldyBURmlsZVRyYW5zcG9ydChyZXF1ZXN0TG9nUGF0aCkpOwogICAgIGZpbGVUcmFuc3BvcnQtPnNldENodW5rU2l6ZSgyICogMTAyNCAqIDEwMjQpOwogICAgIGZpbGVUcmFuc3BvcnQtPnNldE1heEV2ZW50U2l6ZSgxMDI0ICogMTYpOwogICAgIGZpbGVUcmFuc3BvcnQtPnNlZWtUb0VuZCgpOwogCiAgICAgLy8gUHJvdG9jb2wgRmFjdG9yeQotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeShuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpOwogCi0gICAgVEZpbGVQcm9jZXNzb3IgZmlsZVByb2Nlc3NvcihzZXJ2aWNlUHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVRyYW5zcG9ydCk7CisgICAgVEZpbGVQcm9jZXNzb3IgZmlsZVByb2Nlc3NvcihzZXJ2aWNlUHJvY2Vzc29yLCBwcm90b2NvbEZhY3RvcnksIGZpbGVUcmFuc3BvcnQpOwogCiAgICAgZmlsZVByb2Nlc3Nvci5wcm9jZXNzKDAsIHRydWUpOwogICAgIGV4aXQoMCk7CiAgIH0KIAotCiAgIGlmIChydW5TZXJ2ZXIpIHsKIAotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFNlcnZpY2VQcm9jZXNzb3I+IHNlcnZpY2VQcm9jZXNzb3IobmV3IFNlcnZpY2VQcm9jZXNzb3Ioc2VydmljZUhhbmRsZXIpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8U2VydmljZVByb2Nlc3Nvcj4gc2VydmljZVByb2Nlc3NvcihuZXcgU2VydmljZVByb2Nlc3NvcihzZXJ2aWNlSGFuZGxlcikpOwogCiAgICAgLy8gVHJhbnNwb3J0Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlclNvY2tldD4gc2VydmVyU29ja2V0KG5ldyBUU2VydmVyU29ja2V0KHBvcnQpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlclNvY2tldD4gc2VydmVyU29ja2V0KG5ldyBUU2VydmVyU29ja2V0KHBvcnQpKTsKIAogICAgIC8vIFRyYW5zcG9ydCBGYWN0b3J5Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IHRyYW5zcG9ydEZhY3RvcnkobmV3IFRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkoKSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiB0cmFuc3BvcnRGYWN0b3J5KG5ldyBUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KCkpOwogCiAgICAgLy8gUHJvdG9jb2wgRmFjdG9yeQotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeShuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpOwogCiAgICAgaWYgKGxvZ1JlcXVlc3RzKSB7CiAgICAgICAvLyBpbml0aWFsaXplIHRoZSBsb2cgZmlsZQotICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VEZpbGVUcmFuc3BvcnQ+IGZpbGVUcmFuc3BvcnQobmV3IFRGaWxlVHJhbnNwb3J0KHJlcXVlc3RMb2dQYXRoKSk7CisgICAgICBzdGQ6OnNoYXJlZF9wdHI8VEZpbGVUcmFuc3BvcnQ+IGZpbGVUcmFuc3BvcnQobmV3IFRGaWxlVHJhbnNwb3J0KHJlcXVlc3RMb2dQYXRoKSk7CiAgICAgICBmaWxlVHJhbnNwb3J0LT5zZXRDaHVua1NpemUoMiAqIDEwMjQgKiAxMDI0KTsKICAgICAgIGZpbGVUcmFuc3BvcnQtPnNldE1heEV2ZW50U2l6ZSgxMDI0ICogMTYpOwogCi0gICAgICB0cmFuc3BvcnRGYWN0b3J5ID0KLSAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+KG5ldyBUUGlwZWRUcmFuc3BvcnRGYWN0b3J5KGZpbGVUcmFuc3BvcnQpKTsKKyAgICAgIHRyYW5zcG9ydEZhY3RvcnkKKyAgICAgICAgICA9IHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4obmV3IFRQaXBlZFRyYW5zcG9ydEZhY3RvcnkoZmlsZVRyYW5zcG9ydCkpOwogICAgIH0KIAotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXI+IHNlcnZlcjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlcj4gc2VydmVyOwogCiAgICAgaWYgKHNlcnZlclR5cGUgPT0gInNpbXBsZSIpIHsKIAotICAgICAgc2VydmVyLnJlc2V0KG5ldyBUU2ltcGxlU2VydmVyKHNlcnZpY2VQcm9jZXNzb3IsIHNlcnZlclNvY2tldCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KSk7CisgICAgICBzZXJ2ZXIucmVzZXQoCisgICAgICAgICAgbmV3IFRTaW1wbGVTZXJ2ZXIoc2VydmljZVByb2Nlc3Nvciwgc2VydmVyU29ja2V0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpKTsKIAogICAgIH0gZWxzZSBpZiAoc2VydmVyVHlwZSA9PSAidGhyZWFkZWQiKSB7CiAKLSAgICAgIHNlcnZlci5yZXNldChuZXcgVFRocmVhZGVkU2VydmVyKHNlcnZpY2VQcm9jZXNzb3IsIHNlcnZlclNvY2tldCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KSk7CisgICAgICBzZXJ2ZXIucmVzZXQoCisgICAgICAgICAgbmV3IFRUaHJlYWRlZFNlcnZlcihzZXJ2aWNlUHJvY2Vzc29yLCBzZXJ2ZXJTb2NrZXQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSkpOwogCiAgICAgfSBlbHNlIGlmIChzZXJ2ZXJUeXBlID09ICJ0aHJlYWQtcG9vbCIpIHsKIAotICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlciA9IFRocmVhZE1hbmFnZXI6Om5ld1NpbXBsZVRocmVhZE1hbmFnZXIod29ya2VyQ291bnQpOworICAgICAgc3RkOjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IHRocmVhZE1hbmFnZXIKKyAgICAgICAgICA9IFRocmVhZE1hbmFnZXI6Om5ld1NpbXBsZVRocmVhZE1hbmFnZXIod29ya2VyQ291bnQpOwogCiAgICAgICB0aHJlYWRNYW5hZ2VyLT50aHJlYWRGYWN0b3J5KHRocmVhZEZhY3RvcnkpOwogICAgICAgdGhyZWFkTWFuYWdlci0+c3RhcnQoKTsKLSAgICAgIHNlcnZlci5yZXNldChuZXcgVFRocmVhZFBvb2xTZXJ2ZXIoc2VydmljZVByb2Nlc3Nvciwgc2VydmVyU29ja2V0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnksIHRocmVhZE1hbmFnZXIpKTsKKyAgICAgIHNlcnZlci5yZXNldChuZXcgVFRocmVhZFBvb2xTZXJ2ZXIoc2VydmljZVByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyU29ja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZE1hbmFnZXIpKTsKICAgICB9CiAKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUU3RhcnRPYnNlcnZlcj4gb2JzZXJ2ZXIobmV3IFRTdGFydE9ic2VydmVyKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFN0YXJ0T2JzZXJ2ZXI+IG9ic2VydmVyKG5ldyBUU3RhcnRPYnNlcnZlcik7CiAgICAgc2VydmVyLT5zZXRTZXJ2ZXJFdmVudEhhbmRsZXIob2JzZXJ2ZXIpOwotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZD4gc2VydmVyVGhyZWFkID0gdGhyZWFkRmFjdG9yeS0+bmV3VGhyZWFkKHNlcnZlcik7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRocmVhZD4gc2VydmVyVGhyZWFkID0gdGhyZWFkRmFjdG9yeS0+bmV3VGhyZWFkKHNlcnZlcik7CiAKICAgICBjZXJyIDw8ICJTdGFydGluZyB0aGUgc2VydmVyIG9uIHBvcnQgIiA8PCBwb3J0IDw8IGVuZGw7CiAKQEAgLTQzOCw1MiArNDc5LDc2IEBACiAgICAgfQogICB9CiAKLSAgaWYgKGNsaWVudENvdW50ID4gMCkgeworICBpZiAoY2xpZW50Q291bnQgPiAwKSB7IC8vRklYTUU6IHN0YXJ0IGhlcmUgZm9yIGNsaWVudCB0eXBlPwogCiAgICAgTW9uaXRvciBtb25pdG9yOwogCiAgICAgc2l6ZV90IHRocmVhZENvdW50ID0gMDsKIAotICAgIHNldDxib29zdDo6c2hhcmVkX3B0cjxUaHJlYWQ+ID4gY2xpZW50VGhyZWFkczsKKyAgICBzZXQ8c3RkOjpzaGFyZWRfcHRyPFRocmVhZD4gPiBjbGllbnRUaHJlYWRzOwogCi0gICAgaWYgKGNhbGxOYW1lID09ICJlY2hvVm9pZCIpIHsgbG9vcFR5cGUgPSBUX1ZPSUQ7fQotICAgIGVsc2UgaWYgKGNhbGxOYW1lID09ICJlY2hvQnl0ZSIpIHsgbG9vcFR5cGUgPSBUX0JZVEU7fQotICAgIGVsc2UgaWYgKGNhbGxOYW1lID09ICJlY2hvSTMyIikgeyBsb29wVHlwZSA9IFRfSTMyO30KLSAgICBlbHNlIGlmIChjYWxsTmFtZSA9PSAiZWNob0k2NCIpIHsgbG9vcFR5cGUgPSBUX0k2NDt9Ci0gICAgZWxzZSBpZiAoY2FsbE5hbWUgPT0gImVjaG9TdHJpbmciKSB7IGxvb3BUeXBlID0gVF9TVFJJTkc7fQotICAgIGVsc2Uge3Rocm93IGludmFsaWRfYXJndW1lbnQoIlVua25vd24gc2VydmljZSBjYWxsICIrY2FsbE5hbWUpO30KLQotICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCBjbGllbnRDb3VudDsgaXgrKykgewotCi0gICAgICBib29zdDo6c2hhcmVkX3B0cjxUU29ja2V0PiBzb2NrZXQobmV3IFRTb2NrZXQoIjEyNy4wLjAuMSIsIHBvcnQpKTsKLSAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRCdWZmZXJlZFRyYW5zcG9ydD4gYnVmZmVyZWRTb2NrZXQobmV3IFRCdWZmZXJlZFRyYW5zcG9ydChzb2NrZXQsIDIwNDgpKTsKLSAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG9jb2wobmV3IFRCaW5hcnlQcm90b2NvbChidWZmZXJlZFNvY2tldCkpOwotICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8U2VydmljZUNsaWVudD4gc2VydmljZUNsaWVudChuZXcgU2VydmljZUNsaWVudChwcm90b2NvbCkpOwotCi0gICAgICBjbGllbnRUaHJlYWRzLmluc2VydCh0aHJlYWRGYWN0b3J5LT5uZXdUaHJlYWQoYm9vc3Q6OnNoYXJlZF9wdHI8Q2xpZW50VGhyZWFkPihuZXcgQ2xpZW50VGhyZWFkKHNvY2tldCwgc2VydmljZUNsaWVudCwgbW9uaXRvciwgdGhyZWFkQ291bnQsIGxvb3BDb3VudCwgbG9vcFR5cGUpKSkpOworICAgIGlmIChjYWxsTmFtZSA9PSAiZWNob1ZvaWQiKSB7CisgICAgICBsb29wVHlwZSA9IFRfVk9JRDsKKyAgICB9IGVsc2UgaWYgKGNhbGxOYW1lID09ICJlY2hvQnl0ZSIpIHsKKyAgICAgIGxvb3BUeXBlID0gVF9CWVRFOworICAgIH0gZWxzZSBpZiAoY2FsbE5hbWUgPT0gImVjaG9JMzIiKSB7CisgICAgICBsb29wVHlwZSA9IFRfSTMyOworICAgIH0gZWxzZSBpZiAoY2FsbE5hbWUgPT0gImVjaG9JNjQiKSB7CisgICAgICBsb29wVHlwZSA9IFRfSTY0OworICAgIH0gZWxzZSBpZiAoY2FsbE5hbWUgPT0gImVjaG9TdHJpbmciKSB7CisgICAgICBsb29wVHlwZSA9IFRfU1RSSU5HOworICAgIH0gZWxzZSB7CisgICAgICB0aHJvdyBpbnZhbGlkX2FyZ3VtZW50KCJVbmtub3duIHNlcnZpY2UgY2FsbCAiICsgY2FsbE5hbWUpOwogICAgIH0KIAotICAgIGZvciAoc3RkOjpzZXQ8Ym9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkPiA+Ojpjb25zdF9pdGVyYXRvciB0aHJlYWQgPSBjbGllbnRUaHJlYWRzLmJlZ2luKCk7IHRocmVhZCAhPSBjbGllbnRUaHJlYWRzLmVuZCgpOyB0aHJlYWQrKykgeworICAgIGlmKGNsaWVudFR5cGUgPT0gInJlZ3VsYXIiKSB7CisgICAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgY2xpZW50Q291bnQ7IGl4KyspIHsKKworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gc29ja2V0KG5ldyBUU29ja2V0KCIxMjcuMC4wLjEiLCBwb3J0KSk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUQnVmZmVyZWRUcmFuc3BvcnQ+IGJ1ZmZlcmVkU29ja2V0KG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQoc29ja2V0LCAyMDQ4KSk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvY29sKG5ldyBUQmluYXJ5UHJvdG9jb2woYnVmZmVyZWRTb2NrZXQpKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFNlcnZpY2VDbGllbnQ+IHNlcnZpY2VDbGllbnQobmV3IFNlcnZpY2VDbGllbnQocHJvdG9jb2wpKTsKKworICAgICAgICBjbGllbnRUaHJlYWRzLmluc2VydCh0aHJlYWRGYWN0b3J5LT5uZXdUaHJlYWQoc3RkOjpzaGFyZWRfcHRyPENsaWVudFRocmVhZD4oCisgICAgICAgICAgICBuZXcgQ2xpZW50VGhyZWFkKHNvY2tldCwgc2VydmljZUNsaWVudCwgbW9uaXRvciwgdGhyZWFkQ291bnQsIGxvb3BDb3VudCwgbG9vcFR5cGUsIE9wZW5BbmRDbG9zZVRyYW5zcG9ydEluVGhyZWFkKSkpKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYoY2xpZW50VHlwZSA9PSAiY29uY3VycmVudCIpIHsKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0PiBzb2NrZXQobmV3IFRTb2NrZXQoIjEyNy4wLjAuMSIsIHBvcnQpKTsKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUQnVmZmVyZWRUcmFuc3BvcnQ+IGJ1ZmZlcmVkU29ja2V0KG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQoc29ja2V0LCAyMDQ4KSk7CisgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90b2NvbChuZXcgVEJpbmFyeVByb3RvY29sKGJ1ZmZlcmVkU29ja2V0KSk7CisgICAgICAvL3N0ZDo6c2hhcmVkX3B0cjxTZXJ2aWNlQ2xpZW50PiBzZXJ2aWNlQ2xpZW50KG5ldyBTZXJ2aWNlQ2xpZW50KHByb3RvY29sKSk7CisgICAgICBzdGQ6OnNoYXJlZF9wdHI8U2VydmljZUNvbmN1cnJlbnRDbGllbnQ+IHNlcnZpY2VDbGllbnQobmV3IFNlcnZpY2VDb25jdXJyZW50Q2xpZW50KHByb3RvY29sKSk7CisgICAgICBzb2NrZXQtPm9wZW4oKTsKKyAgICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCBjbGllbnRDb3VudDsgaXgrKykgeworICAgICAgICBjbGllbnRUaHJlYWRzLmluc2VydCh0aHJlYWRGYWN0b3J5LT5uZXdUaHJlYWQoc3RkOjpzaGFyZWRfcHRyPENsaWVudFRocmVhZD4oCisgICAgICAgICAgICBuZXcgQ2xpZW50VGhyZWFkKHNvY2tldCwgc2VydmljZUNsaWVudCwgbW9uaXRvciwgdGhyZWFkQ291bnQsIGxvb3BDb3VudCwgbG9vcFR5cGUsIERvbnRPcGVuQW5kQ2xvc2VUcmFuc3BvcnRJblRocmVhZCkpKSk7CisgICAgICB9CisgICAgfQorCisgICAgZm9yIChzdGQ6OnNldDxzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkPiA+Ojpjb25zdF9pdGVyYXRvciB0aHJlYWQgPSBjbGllbnRUaHJlYWRzLmJlZ2luKCk7CisgICAgICAgICB0aHJlYWQgIT0gY2xpZW50VGhyZWFkcy5lbmQoKTsKKyAgICAgICAgIHRocmVhZCsrKSB7CiAgICAgICAoKnRocmVhZCktPnN0YXJ0KCk7CiAgICAgfQogCiAgICAgaW50NjRfdCB0aW1lMDA7CiAgICAgaW50NjRfdCB0aW1lMDE7CiAKLSAgICB7U3luY2hyb25pemVkIHMobW9uaXRvcik7CisgICAgeworICAgICAgU3luY2hyb25pemVkIHMobW9uaXRvcik7CiAgICAgICB0aHJlYWRDb3VudCA9IGNsaWVudENvdW50OwogCi0gICAgICBjZXJyIDw8ICJMYXVuY2ggIjw8IGNsaWVudENvdW50IDw8ICIgY2xpZW50IHRocmVhZHMiIDw8IGVuZGw7CisgICAgICBjZXJyIDw8ICJMYXVuY2ggIiA8PCBjbGllbnRDb3VudCA8PCAiICIgPDwgY2xpZW50VHlwZSA8PCAiIGNsaWVudCB0aHJlYWRzIiA8PCBlbmRsOwogCi0gICAgICB0aW1lMDAgPSAgVXRpbDo6Y3VycmVudFRpbWUoKTsKKyAgICAgIHRpbWUwMCA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7CiAKICAgICAgIG1vbml0b3Iubm90aWZ5QWxsKCk7CiAKLSAgICAgIHdoaWxlKHRocmVhZENvdW50ID4gMCkgeworICAgICAgd2hpbGUgKHRocmVhZENvdW50ID4gMCkgewogICAgICAgICBtb25pdG9yLndhaXQoKTsKICAgICAgIH0KIAotICAgICAgdGltZTAxID0gIFV0aWw6OmN1cnJlbnRUaW1lKCk7CisgICAgICB0aW1lMDEgPSBVdGlsOjpjdXJyZW50VGltZSgpOwogICAgIH0KIAogICAgIGludDY0X3QgZmlyc3RUaW1lID0gOTIyMzM3MjAzNjg1NDc3NTgwN0xMOwpAQCAtNDkzLDkgKzU1OCwxMiBAQAogICAgIGludDY0X3QgbWluVGltZSA9IDkyMjMzNzIwMzY4NTQ3NzU4MDdMTDsKICAgICBpbnQ2NF90IG1heFRpbWUgPSAwOwogCi0gICAgZm9yIChzZXQ8Ym9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkPiA+OjppdGVyYXRvciBpeCA9IGNsaWVudFRocmVhZHMuYmVnaW4oKTsgaXggIT0gY2xpZW50VGhyZWFkcy5lbmQoKTsgaXgrKykgeworICAgIGZvciAoc2V0PHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWQ+ID46Oml0ZXJhdG9yIGl4ID0gY2xpZW50VGhyZWFkcy5iZWdpbigpOworICAgICAgICAgaXggIT0gY2xpZW50VGhyZWFkcy5lbmQoKTsKKyAgICAgICAgIGl4KyspIHsKIAotICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8Q2xpZW50VGhyZWFkPiBjbGllbnQgPSBib29zdDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8Q2xpZW50VGhyZWFkPigoKml4KS0+cnVubmFibGUoKSk7CisgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q2xpZW50VGhyZWFkPiBjbGllbnQKKyAgICAgICAgICA9IHN0ZDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8Q2xpZW50VGhyZWFkPigoKml4KS0+cnVubmFibGUoKSk7CiAKICAgICAgIGludDY0X3QgZGVsdGEgPSBjbGllbnQtPl9lbmRUaW1lIC0gY2xpZW50LT5fc3RhcnRUaW1lOwogCkBAIC01MTcsMTMgKzU4NSwxMyBAQAogICAgICAgICBtYXhUaW1lID0gZGVsdGE7CiAgICAgICB9CiAKLSAgICAgIGF2ZXJhZ2VUaW1lKz0gZGVsdGE7CisgICAgICBhdmVyYWdlVGltZSArPSBkZWx0YTsKICAgICB9CiAKICAgICBhdmVyYWdlVGltZSAvPSBjbGllbnRDb3VudDsKIAotCi0gICAgY291dCA8PCAgIndvcmtlcnMgOiIgPDwgd29ya2VyQ291bnQgPDwgIiwgY2xpZW50IDogIiA8PCBjbGllbnRDb3VudCA8PCAiLCBsb29wcyA6ICIgPDwgbG9vcENvdW50IDw8ICIsIHJhdGUgOiAiIDw8IChjbGllbnRDb3VudCAqIGxvb3BDb3VudCAqIDEwMDApIC8gKChkb3VibGUpKHRpbWUwMSAtIHRpbWUwMCkpIDw8IGVuZGw7CisgICAgY291dCA8PCAid29ya2VycyA6IiA8PCB3b3JrZXJDb3VudCA8PCAiLCBjbGllbnQgOiAiIDw8IGNsaWVudENvdW50IDw8ICIsIGxvb3BzIDogIiA8PCBsb29wQ291bnQKKyAgICAgICAgIDw8ICIsIHJhdGUgOiAiIDw8IChjbGllbnRDb3VudCAqIGxvb3BDb3VudCAqIDEwMDApIC8gKChkb3VibGUpKHRpbWUwMSAtIHRpbWUwMCkpIDw8IGVuZGw7CiAKICAgICBjb3VudF9tYXAgY291bnQgPSBzZXJ2aWNlSGFuZGxlci0+Z2V0Q291bnQoKTsKICAgICBjb3VudF9tYXA6Oml0ZXJhdG9yIGl0ZXI7CmRpZmYgLS1naXQgYS90ZXN0L2NwcC9zcmMvU3RyZXNzVGVzdE5vbkJsb2NraW5nLmNwcCBiL3Rlc3QvY3BwL3NyYy9TdHJlc3NUZXN0Tm9uQmxvY2tpbmcuY3BwCmluZGV4IDIwMzIwYzcuLjFkM2VkNzMgMTAwNjQ0Ci0tLSBhL3Rlc3QvY3BwL3NyYy9TdHJlc3NUZXN0Tm9uQmxvY2tpbmcuY3BwCisrKyBiL3Rlc3QvY3BwL3NyYy9TdHJlc3NUZXN0Tm9uQmxvY2tpbmcuY3BwCkBAIC0yOSwyMSArMjksMjAgQEAKICNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5oPgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oPgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU2VydmVyU29ja2V0Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0VXRpbHMuaD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RGaWxlVHJhbnNwb3J0Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L1RMb2dnaW5nLmg+CiAKICNpbmNsdWRlICJTZXJ2aWNlLmgiCiAKLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KLQogI2luY2x1ZGUgPGlvc3RyZWFtPgogI2luY2x1ZGUgPHNldD4KICNpbmNsdWRlIDxzdGRleGNlcHQ+CiAjaW5jbHVkZSA8c3N0cmVhbT4KICNpbmNsdWRlIDxtYXA+CiAjaWYgX1dJTjMyCi0gICAjaW5jbHVkZSA8dGhyaWZ0L3dpbmRvd3MvVFdpbnNvY2tTaW5nbGV0b24uaD4KKyNpbmNsdWRlIDx0aHJpZnQvd2luZG93cy9UV2luc29ja1NpbmdsZXRvbi5oPgogI2VuZGlmCiAKIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CkBAIC01NywyMyArNTYsMTggQEAKIHVzaW5nIG5hbWVzcGFjZSB0ZXN0OjpzdHJlc3M7CiAKIHN0cnVjdCBlcXN0ciB7Ci0gIGJvb2wgb3BlcmF0b3IoKShjb25zdCBjaGFyKiBzMSwgY29uc3QgY2hhciogczIpIGNvbnN0IHsKLSAgICByZXR1cm4gc3RyY21wKHMxLCBzMikgPT0gMDsKLSAgfQorICBib29sIG9wZXJhdG9yKCkoY29uc3QgY2hhciogczEsIGNvbnN0IGNoYXIqIHMyKSBjb25zdCB7IHJldHVybiBzdHJjbXAoczEsIHMyKSA9PSAwOyB9CiB9OwogCiBzdHJ1Y3QgbHRzdHIgewotICBib29sIG9wZXJhdG9yKCkoY29uc3QgY2hhciogczEsIGNvbnN0IGNoYXIqIHMyKSBjb25zdCB7Ci0gICAgcmV0dXJuIHN0cmNtcChzMSwgczIpIDwgMDsKLSAgfQorICBib29sIG9wZXJhdG9yKCkoY29uc3QgY2hhciogczEsIGNvbnN0IGNoYXIqIHMyKSBjb25zdCB7IHJldHVybiBzdHJjbXAoczEsIHMyKSA8IDA7IH0KIH07CiAKLQogLy8gdHlwZWRlZiBoYXNoX21hcDxjb25zdCBjaGFyKiwgaW50LCBoYXNoPGNvbnN0IGNoYXIqPiwgZXFzdHI+IGNvdW50X21hcDsKIHR5cGVkZWYgbWFwPGNvbnN0IGNoYXIqLCBpbnQsIGx0c3RyPiBjb3VudF9tYXA7CiAKIGNsYXNzIFNlcnZlciA6IHB1YmxpYyBTZXJ2aWNlSWYgewotIHB1YmxpYzoKK3B1YmxpYzoKICAgU2VydmVyKCkge30KIAogICB2b2lkIGNvdW50KGNvbnN0IGNoYXIqIG1ldGhvZCkgewpAQCAtOTQsNTggKzg4LDczIEBACiAgICAgcmV0dXJuIGNvdW50c187CiAgIH0KIAotICBpbnQ4X3QgZWNob0J5dGUoY29uc3QgaW50OF90IGFyZykge3JldHVybiBhcmc7fQotICBpbnQzMl90IGVjaG9JMzIoY29uc3QgaW50MzJfdCBhcmcpIHtyZXR1cm4gYXJnO30KLSAgaW50NjRfdCBlY2hvSTY0KGNvbnN0IGludDY0X3QgYXJnKSB7cmV0dXJuIGFyZzt9Ci0gIHZvaWQgZWNob1N0cmluZyhzdHJpbmcmIG91dCwgY29uc3Qgc3RyaW5nICZhcmcpIHsKKyAgaW50OF90IGVjaG9CeXRlKGNvbnN0IGludDhfdCBhcmcpIHsgcmV0dXJuIGFyZzsgfQorICBpbnQzMl90IGVjaG9JMzIoY29uc3QgaW50MzJfdCBhcmcpIHsgcmV0dXJuIGFyZzsgfQorICBpbnQ2NF90IGVjaG9JNjQoY29uc3QgaW50NjRfdCBhcmcpIHsgcmV0dXJuIGFyZzsgfQorICB2b2lkIGVjaG9TdHJpbmcoc3RyaW5nJiBvdXQsIGNvbnN0IHN0cmluZyYgYXJnKSB7CiAgICAgaWYgKGFyZyAhPSAiaGVsbG8iKSB7CiAgICAgICBUX0VSUk9SX0FCT1JUKCJXUk9ORyBTVFJJTkcgKCVzKSEhISEiLCBhcmcuY19zdHIoKSk7CiAgICAgfQogICAgIG91dCA9IGFyZzsKICAgfQotICB2b2lkIGVjaG9MaXN0KHZlY3RvcjxpbnQ4X3Q+ICZvdXQsIGNvbnN0IHZlY3RvcjxpbnQ4X3Q+ICZhcmcpIHsgb3V0ID0gYXJnOyB9Ci0gIHZvaWQgZWNob1NldChzZXQ8aW50OF90PiAmb3V0LCBjb25zdCBzZXQ8aW50OF90PiAmYXJnKSB7IG91dCA9IGFyZzsgfQotICB2b2lkIGVjaG9NYXAobWFwPGludDhfdCwgaW50OF90PiAmb3V0LCBjb25zdCBtYXA8aW50OF90LCBpbnQ4X3Q+ICZhcmcpIHsgb3V0ID0gYXJnOyB9CisgIHZvaWQgZWNob0xpc3QodmVjdG9yPGludDhfdD4mIG91dCwgY29uc3QgdmVjdG9yPGludDhfdD4mIGFyZykgeyBvdXQgPSBhcmc7IH0KKyAgdm9pZCBlY2hvU2V0KHNldDxpbnQ4X3Q+JiBvdXQsIGNvbnN0IHNldDxpbnQ4X3Q+JiBhcmcpIHsgb3V0ID0gYXJnOyB9CisgIHZvaWQgZWNob01hcChtYXA8aW50OF90LCBpbnQ4X3Q+JiBvdXQsIGNvbnN0IG1hcDxpbnQ4X3QsIGludDhfdD4mIGFyZykgeyBvdXQgPSBhcmc7IH0KIAogcHJpdmF0ZToKICAgY291bnRfbWFwIGNvdW50c187CiAgIE11dGV4IGxvY2tfOwotCiB9OwogCi1jbGFzcyBDbGllbnRUaHJlYWQ6IHB1YmxpYyBSdW5uYWJsZSB7CitjbGFzcyBDbGllbnRUaHJlYWQgOiBwdWJsaWMgUnVubmFibGUgewogcHVibGljOgotCi0gIENsaWVudFRocmVhZChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PnRyYW5zcG9ydCwgYm9vc3Q6OnNoYXJlZF9wdHI8U2VydmljZUNsaWVudD4gY2xpZW50LCBNb25pdG9yJiBtb25pdG9yLCBzaXplX3QmIHdvcmtlckNvdW50LCBzaXplX3QgbG9vcENvdW50LCBUVHlwZSBsb29wVHlwZSkgOgotICAgIF90cmFuc3BvcnQodHJhbnNwb3J0KSwKLSAgICBfY2xpZW50KGNsaWVudCksCi0gICAgX21vbml0b3IobW9uaXRvciksCi0gICAgX3dvcmtlckNvdW50KHdvcmtlckNvdW50KSwKLSAgICBfbG9vcENvdW50KGxvb3BDb3VudCksCi0gICAgX2xvb3BUeXBlKGxvb3BUeXBlKQotICB7fQorICBDbGllbnRUaHJlYWQoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxTZXJ2aWNlQ2xpZW50PiBjbGllbnQsCisgICAgICAgICAgICAgICBNb25pdG9yJiBtb25pdG9yLAorICAgICAgICAgICAgICAgc2l6ZV90JiB3b3JrZXJDb3VudCwKKyAgICAgICAgICAgICAgIHNpemVfdCBsb29wQ291bnQsCisgICAgICAgICAgICAgICBUVHlwZSBsb29wVHlwZSkKKyAgICA6IF90cmFuc3BvcnQodHJhbnNwb3J0KSwKKyAgICAgIF9jbGllbnQoY2xpZW50KSwKKyAgICAgIF9tb25pdG9yKG1vbml0b3IpLAorICAgICAgX3dvcmtlckNvdW50KHdvcmtlckNvdW50KSwKKyAgICAgIF9sb29wQ291bnQobG9vcENvdW50KSwKKyAgICAgIF9sb29wVHlwZShsb29wVHlwZSkge30KIAogICB2b2lkIHJ1bigpIHsKIAogICAgIC8vIFdhaXQgZm9yIGFsbCB3b3JrZXIgdGhyZWFkcyB0byBzdGFydAogCi0gICAge1N5bmNocm9uaXplZCBzKF9tb25pdG9yKTsKLSAgICAgICAgd2hpbGUoX3dvcmtlckNvdW50ID09IDApIHsKLSAgICAgICAgICBfbW9uaXRvci53YWl0KCk7Ci0gICAgICAgIH0KKyAgICB7CisgICAgICBTeW5jaHJvbml6ZWQgcyhfbW9uaXRvcik7CisgICAgICB3aGlsZSAoX3dvcmtlckNvdW50ID09IDApIHsKKyAgICAgICAgX21vbml0b3Iud2FpdCgpOworICAgICAgfQogICAgIH0KIAogICAgIF9zdGFydFRpbWUgPSBVdGlsOjpjdXJyZW50VGltZSgpOwogCiAgICAgX3RyYW5zcG9ydC0+b3BlbigpOwogCi0gICAgc3dpdGNoKF9sb29wVHlwZSkgewotICAgIGNhc2UgVF9WT0lEOiBsb29wRWNob1ZvaWQoKTsgYnJlYWs7Ci0gICAgY2FzZSBUX0JZVEU6IGxvb3BFY2hvQnl0ZSgpOyBicmVhazsKLSAgICBjYXNlIFRfSTMyOiBsb29wRWNob0kzMigpOyBicmVhazsKLSAgICBjYXNlIFRfSTY0OiBsb29wRWNob0k2NCgpOyBicmVhazsKLSAgICBjYXNlIFRfU1RSSU5HOiBsb29wRWNob1N0cmluZygpOyBicmVhazsKLSAgICBkZWZhdWx0OiBjZXJyIDw8ICJVbmV4cGVjdGVkIGxvb3AgdHlwZSIgPDwgX2xvb3BUeXBlIDw8IGVuZGw7IGJyZWFrOworICAgIHN3aXRjaCAoX2xvb3BUeXBlKSB7CisgICAgY2FzZSBUX1ZPSUQ6CisgICAgICBsb29wRWNob1ZvaWQoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVF9CWVRFOgorICAgICAgbG9vcEVjaG9CeXRlKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRfSTMyOgorICAgICAgbG9vcEVjaG9JMzIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVF9JNjQ6CisgICAgICBsb29wRWNob0k2NCgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUX1NUUklORzoKKyAgICAgIGxvb3BFY2hvU3RyaW5nKCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgY2VyciA8PCAiVW5leHBlY3RlZCBsb29wIHR5cGUiIDw8IF9sb29wVHlwZSA8PCBlbmRsOworICAgICAgYnJlYWs7CiAgICAgfQogCiAgICAgX2VuZFRpbWUgPSBVdGlsOjpjdXJyZW50VGltZSgpOwpAQCAtMTU0LDcgKzE2Myw4IEBACiAKICAgICBfZG9uZSA9IHRydWU7CiAKLSAgICB7U3luY2hyb25pemVkIHMoX21vbml0b3IpOworICAgIHsKKyAgICAgIFN5bmNocm9uaXplZCBzKF9tb25pdG9yKTsKIAogICAgICAgX3dvcmtlckNvdW50LS07CiAKQEAgLTE3NSw3ICsxODUsNyBAQAogICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCBfbG9vcENvdW50OyBpeCsrKSB7CiAgICAgICBpbnQ4X3QgYXJnID0gMTsKICAgICAgIGludDhfdCByZXN1bHQ7Ci0gICAgICByZXN1bHQgPV9jbGllbnQtPmVjaG9CeXRlKGFyZyk7CisgICAgICByZXN1bHQgPSBfY2xpZW50LT5lY2hvQnl0ZShhcmcpOwogICAgICAgKHZvaWQpcmVzdWx0OwogICAgICAgYXNzZXJ0KHJlc3VsdCA9PSBhcmcpOwogICAgIH0KQEAgLTE4NSw3ICsxOTUsNyBAQAogICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCBfbG9vcENvdW50OyBpeCsrKSB7CiAgICAgICBpbnQzMl90IGFyZyA9IDE7CiAgICAgICBpbnQzMl90IHJlc3VsdDsKLSAgICAgIHJlc3VsdCA9X2NsaWVudC0+ZWNob0kzMihhcmcpOworICAgICAgcmVzdWx0ID0gX2NsaWVudC0+ZWNob0kzMihhcmcpOwogICAgICAgKHZvaWQpcmVzdWx0OwogICAgICAgYXNzZXJ0KHJlc3VsdCA9PSBhcmcpOwogICAgIH0KQEAgLTE5NSw3ICsyMDUsNyBAQAogICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCBfbG9vcENvdW50OyBpeCsrKSB7CiAgICAgICBpbnQ2NF90IGFyZyA9IDE7CiAgICAgICBpbnQ2NF90IHJlc3VsdDsKLSAgICAgIHJlc3VsdCA9X2NsaWVudC0+ZWNob0k2NChhcmcpOworICAgICAgcmVzdWx0ID0gX2NsaWVudC0+ZWNob0k2NChhcmcpOwogICAgICAgKHZvaWQpcmVzdWx0OwogICAgICAgYXNzZXJ0KHJlc3VsdCA9PSBhcmcpOwogICAgIH0KQEAgLTIxMCw4ICsyMjAsOCBAQAogICAgIH0KICAgfQogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IF90cmFuc3BvcnQ7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFNlcnZpY2VDbGllbnQ+IF9jbGllbnQ7CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBfdHJhbnNwb3J0OworICBzdGQ6OnNoYXJlZF9wdHI8U2VydmljZUNsaWVudD4gX2NsaWVudDsKICAgTW9uaXRvciYgX21vbml0b3I7CiAgIHNpemVfdCYgX3dvcmtlckNvdW50OwogICBzaXplX3QgX2xvb3BDb3VudDsKQEAgLTIyMiw4ICsyMzIsNyBAQAogICBNb25pdG9yIF9zbGVlcDsKIH07CiAKLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKICNpZiBfV0lOMzIKICAgdHJhbnNwb3J0OjpUV2luc29ja1NpbmdsZXRvbjo6Y3JlYXRlKCk7CiAjZW5kaWYKQEAgLTIzNCw3ICsyNDMsNyBAQAogICB1aW50MzJfdCB3b3JrZXJDb3VudCA9IDQ7CiAgIHVpbnQzMl90IGNsaWVudENvdW50ID0gMjA7CiAgIHVpbnQzMl90IGxvb3BDb3VudCA9IDEwMDA7Ci0gIFRUeXBlIGxvb3BUeXBlICA9IFRfVk9JRDsKKyAgVFR5cGUgbG9vcFR5cGUgPSBUX1ZPSUQ7CiAgIHN0cmluZyBjYWxsTmFtZSA9ICJlY2hvVm9pZCI7CiAgIGJvb2wgcnVuU2VydmVyID0gdHJ1ZTsKICAgYm9vbCBsb2dSZXF1ZXN0cyA9IGZhbHNlOwpAQCAtMjQzLDI4ICsyNTIsMzQgQEAKIAogICBvc3RyaW5nc3RyZWFtIHVzYWdlOwogCi0gIHVzYWdlIDw8Ci0gICAgYXJndlswXSA8PCAiIFstLXBvcnQ9PHBvcnQgbnVtYmVyPl0gWy0tc2VydmVyXSBbLS1zZXJ2ZXItdHlwZT08c2VydmVyLXR5cGU+XSBbLS1wcm90b2NvbC10eXBlPTxwcm90b2NvbC10eXBlPl0gWy0td29ya2Vycz08d29ya2VyLWNvdW50Pl0gWy0tY2xpZW50cz08Y2xpZW50LWNvdW50Pl0gWy0tbG9vcD08bG9vcC1jb3VudD5dIiA8PCBlbmRsIDw8Ci0gICAgIlx0Y2xpZW50cyAgICAgICAgTnVtYmVyIG9mIGNsaWVudCB0aHJlYWRzIHRvIGNyZWF0ZSAtIDAgaW1wbGllcyBubyBjbGllbnRzLCBpLmUuIHNlcnZlciBvbmx5LiAgRGVmYXVsdCBpcyAiIDw8IGNsaWVudENvdW50IDw8IGVuZGwgPDwKLSAgICAiXHRoZWxwICAgICAgICAgICBQcmludHMgdGhpcyBoZWxwIHRleHQuIiA8PCBlbmRsIDw8Ci0gICAgIlx0Y2FsbCAgICAgICAgICAgU2VydmljZSBtZXRob2QgdG8gY2FsbC4gIERlZmF1bHQgaXMgIiA8PCBjYWxsTmFtZSA8PCBlbmRsIDw8Ci0gICAgIlx0bG9vcCAgICAgICAgICAgVGhlIG51bWJlciBvZiByZW1vdGUgdGhyaWZ0IGNhbGxzIGVhY2ggY2xpZW50IG1ha2VzLiAgRGVmYXVsdCBpcyAiIDw8IGxvb3BDb3VudCA8PCBlbmRsIDw8Ci0gICAgIlx0cG9ydCAgICAgICAgICAgVGhlIHBvcnQgdGhlIHNlcnZlciBhbmQgY2xpZW50cyBzaG91bGQgYmluZCB0byBmb3IgdGhyaWZ0IG5ldHdvcmsgY29ubmVjdGlvbnMuICBEZWZhdWx0IGlzICIgPDwgcG9ydCA8PCBlbmRsIDw8Ci0gICAgIlx0c2VydmVyICAgICAgICAgUnVuIHRoZSBUaHJpZnQgc2VydmVyIGluIHRoaXMgcHJvY2Vzcy4gIERlZmF1bHQgaXMgIiA8PCBydW5TZXJ2ZXIgPDwgZW5kbCA8PAotICAgICJcdHNlcnZlci10eXBlICAgIFR5cGUgb2Ygc2VydmVyLCBcInNpbXBsZVwiIG9yIFwidGhyZWFkLXBvb2xcIi4gIERlZmF1bHQgaXMgIiA8PCBzZXJ2ZXJUeXBlIDw8IGVuZGwgPDwKLSAgICAiXHRwcm90b2NvbC10eXBlICBUeXBlIG9mIHByb3RvY29sLCBcImJpbmFyeVwiLCBcImFzY2lpXCIsIG9yIFwieG1sXCIuICBEZWZhdWx0IGlzICIgPDwgcHJvdG9jb2xUeXBlIDw8IGVuZGwgPDwKLSAgICAiXHRsb2ctcmVxdWVzdCAgICBMb2cgYWxsIHJlcXVlc3QgdG8gLi9yZXF1ZXN0bG9nLnRsb2cuIERlZmF1bHQgaXMgIiA8PCBsb2dSZXF1ZXN0cyA8PCBlbmRsIDw8Ci0gICAgIlx0cmVwbGF5LXJlcXVlc3QgUmVwbGF5IHJlcXVlc3RzIGZyb20gbG9nIGZpbGUgKC4vcmVxdWVzdGxvZy50bG9nKSBEZWZhdWx0IGlzICIgPDwgcmVwbGF5UmVxdWVzdHMgPDwgZW5kbCA8PAotICAgICJcdHdvcmtlcnMgICAgICAgIE51bWJlciBvZiB0aHJlYWQgcG9vbHMgd29ya2Vycy4gIE9ubHkgdmFsaWQgZm9yIHRocmVhZC1wb29sIHNlcnZlciB0eXBlLiAgRGVmYXVsdCBpcyAiIDw8IHdvcmtlckNvdW50IDw8IGVuZGw7CisgIHVzYWdlIDw8IGFyZ3ZbMF0gPDwgIiBbLS1wb3J0PTxwb3J0IG51bWJlcj5dIFstLXNlcnZlcl0gWy0tc2VydmVyLXR5cGU9PHNlcnZlci10eXBlPl0gIgorICAgICAgICAgICAgICAgICAgICAgICJbLS1wcm90b2NvbC10eXBlPTxwcm90b2NvbC10eXBlPl0gWy0td29ya2Vycz08d29ya2VyLWNvdW50Pl0gIgorICAgICAgICAgICAgICAgICAgICAgICJbLS1jbGllbnRzPTxjbGllbnQtY291bnQ+XSBbLS1sb29wPTxsb29wLWNvdW50Pl0iIDw8IGVuZGwKKyAgICAgICAgPDwgIlx0Y2xpZW50cyAgICAgICAgTnVtYmVyIG9mIGNsaWVudCB0aHJlYWRzIHRvIGNyZWF0ZSAtIDAgaW1wbGllcyBubyBjbGllbnRzLCBpLmUuICIKKyAgICAgICAgICAgInNlcnZlciBvbmx5LiAgRGVmYXVsdCBpcyAiIDw8IGNsaWVudENvdW50IDw8IGVuZGwKKyAgICAgICAgPDwgIlx0aGVscCAgICAgICAgICAgUHJpbnRzIHRoaXMgaGVscCB0ZXh0LiIgPDwgZW5kbAorICAgICAgICA8PCAiXHRjYWxsICAgICAgICAgICBTZXJ2aWNlIG1ldGhvZCB0byBjYWxsLiAgRGVmYXVsdCBpcyAiIDw8IGNhbGxOYW1lIDw8IGVuZGwKKyAgICAgICAgPDwgIlx0bG9vcCAgICAgICAgICAgVGhlIG51bWJlciBvZiByZW1vdGUgdGhyaWZ0IGNhbGxzIGVhY2ggY2xpZW50IG1ha2VzLiAgRGVmYXVsdCBpcyAiCisgICAgICAgIDw8IGxvb3BDb3VudCA8PCBlbmRsIDw8ICJcdHBvcnQgICAgICAgICAgIFRoZSBwb3J0IHRoZSBzZXJ2ZXIgYW5kIGNsaWVudHMgc2hvdWxkIGJpbmQgdG8gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9yIHRocmlmdCBuZXR3b3JrIGNvbm5lY3Rpb25zLiAgRGVmYXVsdCBpcyAiIDw8IHBvcnQgPDwgZW5kbAorICAgICAgICA8PCAiXHRzZXJ2ZXIgICAgICAgICBSdW4gdGhlIFRocmlmdCBzZXJ2ZXIgaW4gdGhpcyBwcm9jZXNzLiAgRGVmYXVsdCBpcyAiIDw8IHJ1blNlcnZlcgorICAgICAgICA8PCBlbmRsIDw8ICJcdHNlcnZlci10eXBlICAgIFR5cGUgb2Ygc2VydmVyLCBcInNpbXBsZVwiIG9yIFwidGhyZWFkLXBvb2xcIi4gIERlZmF1bHQgaXMgIgorICAgICAgICA8PCBzZXJ2ZXJUeXBlIDw8IGVuZGwKKyAgICAgICAgPDwgIlx0cHJvdG9jb2wtdHlwZSAgVHlwZSBvZiBwcm90b2NvbCwgXCJiaW5hcnlcIiwgXCJhc2NpaVwiLCBvciBcInhtbFwiLiAgRGVmYXVsdCBpcyAiCisgICAgICAgIDw8IHByb3RvY29sVHlwZSA8PCBlbmRsCisgICAgICAgIDw8ICJcdGxvZy1yZXF1ZXN0ICAgIExvZyBhbGwgcmVxdWVzdCB0byAuL3JlcXVlc3Rsb2cudGxvZy4gRGVmYXVsdCBpcyAiIDw8IGxvZ1JlcXVlc3RzCisgICAgICAgIDw8IGVuZGwgPDwgIlx0cmVwbGF5LXJlcXVlc3QgUmVwbGF5IHJlcXVlc3RzIGZyb20gbG9nIGZpbGUgKC4vcmVxdWVzdGxvZy50bG9nKSBEZWZhdWx0IGlzICIKKyAgICAgICAgPDwgcmVwbGF5UmVxdWVzdHMgPDwgZW5kbCA8PCAiXHR3b3JrZXJzICAgICAgICBOdW1iZXIgb2YgdGhyZWFkIHBvb2xzIHdvcmtlcnMuICBPbmx5IHZhbGlkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9yIHRocmVhZC1wb29sIHNlcnZlciB0eXBlLiAgRGVmYXVsdCBpcyAiIDw8IHdvcmtlckNvdW50CisgICAgICAgIDw8IGVuZGw7CiAKLQotICBtYXA8c3RyaW5nLCBzdHJpbmc+ICBhcmdzOworICBtYXA8c3RyaW5nLCBzdHJpbmc+IGFyZ3M7CiAKICAgZm9yIChpbnQgaXggPSAxOyBpeCA8IGFyZ2M7IGl4KyspIHsKIAogICAgIHN0cmluZyBhcmcoYXJndltpeF0pOwogCi0gICAgaWYgKGFyZy5jb21wYXJlKDAsMiwgIi0tIikgPT0gMCkgeworICAgIGlmIChhcmcuY29tcGFyZSgwLCAyLCAiLS0iKSA9PSAwKSB7CiAKICAgICAgIHNpemVfdCBlbmQgPSBhcmcuZmluZF9maXJzdF9vZigiPSIsIDIpOwogCkBAIC0yNzYsNyArMjkxLDcgQEAKICAgICAgICAgYXJnc1trZXldID0gInRydWUiOwogICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICB0aHJvdyBpbnZhbGlkX2FyZ3VtZW50KCJVbmV4Y2VwdGVkIGNvbW1hbmQgbGluZSB0b2tlbjogIithcmcpOworICAgICAgdGhyb3cgaW52YWxpZF9hcmd1bWVudCgiVW5leGNlcHRlZCBjb21tYW5kIGxpbmUgdG9rZW46ICIgKyBhcmcpOwogICAgIH0KICAgfQogCkBAIC0zMjMsNzQgKzMzOCw4MyBAQAogICAgICAgd29ya2VyQ291bnQgPSBhdG9pKGFyZ3NbIndvcmtlcnMiXS5jX3N0cigpKTsKICAgICB9CiAKLSAgfSBjYXRjaChzdGQ6OmV4Y2VwdGlvbiYgZSkgeworICB9IGNhdGNoIChzdGQ6OmV4Y2VwdGlvbiYgZSkgewogICAgIGNlcnIgPDwgZS53aGF0KCkgPDwgZW5kbDsKICAgICBjZXJyIDw8IHVzYWdlLnN0cigpOwogICB9CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8UGxhdGZvcm1UaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5ID0gYm9vc3Q6OnNoYXJlZF9wdHI8UGxhdGZvcm1UaHJlYWRGYWN0b3J5PihuZXcgUGxhdGZvcm1UaHJlYWRGYWN0b3J5KCkpOworICBzdGQ6OnNoYXJlZF9wdHI8UGxhdGZvcm1UaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5CisgICAgICA9IHN0ZDo6c2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+KG5ldyBQbGF0Zm9ybVRocmVhZEZhY3RvcnkoKSk7CiAKICAgLy8gRGlzcGF0Y2hlcgotICBib29zdDo6c2hhcmVkX3B0cjxTZXJ2ZXI+IHNlcnZpY2VIYW5kbGVyKG5ldyBTZXJ2ZXIoKSk7CisgIHN0ZDo6c2hhcmVkX3B0cjxTZXJ2ZXI+IHNlcnZpY2VIYW5kbGVyKG5ldyBTZXJ2ZXIoKSk7CiAKICAgaWYgKHJlcGxheVJlcXVlc3RzKSB7Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8U2VydmVyPiBzZXJ2aWNlSGFuZGxlcihuZXcgU2VydmVyKCkpOwotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFNlcnZpY2VQcm9jZXNzb3I+IHNlcnZpY2VQcm9jZXNzb3IobmV3IFNlcnZpY2VQcm9jZXNzb3Ioc2VydmljZUhhbmRsZXIpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8U2VydmVyPiBzZXJ2aWNlSGFuZGxlcihuZXcgU2VydmVyKCkpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxTZXJ2aWNlUHJvY2Vzc29yPiBzZXJ2aWNlUHJvY2Vzc29yKG5ldyBTZXJ2aWNlUHJvY2Vzc29yKHNlcnZpY2VIYW5kbGVyKSk7CiAKICAgICAvLyBUcmFuc3BvcnRzCi0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VEZpbGVUcmFuc3BvcnQ+IGZpbGVUcmFuc3BvcnQobmV3IFRGaWxlVHJhbnNwb3J0KHJlcXVlc3RMb2dQYXRoKSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRGaWxlVHJhbnNwb3J0PiBmaWxlVHJhbnNwb3J0KG5ldyBURmlsZVRyYW5zcG9ydChyZXF1ZXN0TG9nUGF0aCkpOwogICAgIGZpbGVUcmFuc3BvcnQtPnNldENodW5rU2l6ZSgyICogMTAyNCAqIDEwMjQpOwogICAgIGZpbGVUcmFuc3BvcnQtPnNldE1heEV2ZW50U2l6ZSgxMDI0ICogMTYpOwogICAgIGZpbGVUcmFuc3BvcnQtPnNlZWtUb0VuZCgpOwogCiAgICAgLy8gUHJvdG9jb2wgRmFjdG9yeQotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeShuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpOwogCi0gICAgVEZpbGVQcm9jZXNzb3IgZmlsZVByb2Nlc3NvcihzZXJ2aWNlUHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVRyYW5zcG9ydCk7CisgICAgVEZpbGVQcm9jZXNzb3IgZmlsZVByb2Nlc3NvcihzZXJ2aWNlUHJvY2Vzc29yLCBwcm90b2NvbEZhY3RvcnksIGZpbGVUcmFuc3BvcnQpOwogCiAgICAgZmlsZVByb2Nlc3Nvci5wcm9jZXNzKDAsIHRydWUpOwogICAgIGV4aXQoMCk7CiAgIH0KIAotCiAgIGlmIChydW5TZXJ2ZXIpIHsKIAotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFNlcnZpY2VQcm9jZXNzb3I+IHNlcnZpY2VQcm9jZXNzb3IobmV3IFNlcnZpY2VQcm9jZXNzb3Ioc2VydmljZUhhbmRsZXIpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8U2VydmljZVByb2Nlc3Nvcj4gc2VydmljZVByb2Nlc3NvcihuZXcgU2VydmljZVByb2Nlc3NvcihzZXJ2aWNlSGFuZGxlcikpOwogCiAgICAgLy8gUHJvdG9jb2wgRmFjdG9yeQotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeShuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpOwogCiAgICAgLy8gVHJhbnNwb3J0IEZhY3RvcnkKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gICAgICB0cmFuc3BvcnRGYWN0b3J5OworICAgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gdHJhbnNwb3J0RmFjdG9yeTsKIAogICAgIGlmIChsb2dSZXF1ZXN0cykgewogICAgICAgLy8gaW5pdGlhbGl6ZSB0aGUgbG9nIGZpbGUKLSAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRGaWxlVHJhbnNwb3J0PiBmaWxlVHJhbnNwb3J0KG5ldyBURmlsZVRyYW5zcG9ydChyZXF1ZXN0TG9nUGF0aCkpOworICAgICAgc3RkOjpzaGFyZWRfcHRyPFRGaWxlVHJhbnNwb3J0PiBmaWxlVHJhbnNwb3J0KG5ldyBURmlsZVRyYW5zcG9ydChyZXF1ZXN0TG9nUGF0aCkpOwogICAgICAgZmlsZVRyYW5zcG9ydC0+c2V0Q2h1bmtTaXplKDIgKiAxMDI0ICogMTAyNCk7CiAgICAgICBmaWxlVHJhbnNwb3J0LT5zZXRNYXhFdmVudFNpemUoMTAyNCAqIDE2KTsKIAotICAgICAgdHJhbnNwb3J0RmFjdG9yeSA9Ci0gICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PihuZXcgVFBpcGVkVHJhbnNwb3J0RmFjdG9yeShmaWxlVHJhbnNwb3J0KSk7CisgICAgICB0cmFuc3BvcnRGYWN0b3J5CisgICAgICAgICAgPSBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+KG5ldyBUUGlwZWRUcmFuc3BvcnRGYWN0b3J5KGZpbGVUcmFuc3BvcnQpKTsKICAgICB9CiAKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWQ+IHNlcnZlclRocmVhZDsKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWQ+IHNlcnZlclRocmVhZDI7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRocmVhZD4gc2VydmVyVGhyZWFkOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWQ+IHNlcnZlclRocmVhZDI7CisgICAgc3RkOjpzaGFyZWRfcHRyPHRyYW5zcG9ydDo6VE5vbmJsb2NraW5nU2VydmVyU29ja2V0PiBuYlNvY2tldDE7CisgICAgc3RkOjpzaGFyZWRfcHRyPHRyYW5zcG9ydDo6VE5vbmJsb2NraW5nU2VydmVyU29ja2V0PiBuYlNvY2tldDI7CiAKICAgICBpZiAoc2VydmVyVHlwZSA9PSAic2ltcGxlIikgewogCi0gICAgICBzZXJ2ZXJUaHJlYWQgPSB0aHJlYWRGYWN0b3J5LT5uZXdUaHJlYWQoYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlcj4obmV3IFROb25ibG9ja2luZ1NlcnZlcihzZXJ2aWNlUHJvY2Vzc29yLCBwcm90b2NvbEZhY3RvcnksIHBvcnQpKSk7Ci0gICAgICBzZXJ2ZXJUaHJlYWQyID0gdGhyZWFkRmFjdG9yeS0+bmV3VGhyZWFkKGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXI+KG5ldyBUTm9uYmxvY2tpbmdTZXJ2ZXIoc2VydmljZVByb2Nlc3NvciwgcHJvdG9jb2xGYWN0b3J5LCBwb3J0KzEpKSk7CisgICAgICBuYlNvY2tldDEucmVzZXQobmV3IHRyYW5zcG9ydDo6VE5vbmJsb2NraW5nU2VydmVyU29ja2V0KHBvcnQpKTsKKyAgICAgIHNlcnZlclRocmVhZCA9IHRocmVhZEZhY3RvcnktPm5ld1RocmVhZChzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlcj4oCisgICAgICAgICAgbmV3IFROb25ibG9ja2luZ1NlcnZlcihzZXJ2aWNlUHJvY2Vzc29yLCBwcm90b2NvbEZhY3RvcnksIG5iU29ja2V0MSkpKTsKKyAgICAgIG5iU29ja2V0Mi5yZXNldChuZXcgdHJhbnNwb3J0OjpUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQocG9ydCArIDEpKTsKKyAgICAgIHNlcnZlclRocmVhZDIgPSB0aHJlYWRGYWN0b3J5LT5uZXdUaHJlYWQoc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXI+KAorICAgICAgICAgIG5ldyBUTm9uYmxvY2tpbmdTZXJ2ZXIoc2VydmljZVByb2Nlc3NvciwgcHJvdG9jb2xGYWN0b3J5LCBuYlNvY2tldDIpKSk7CiAKICAgICB9IGVsc2UgaWYgKHNlcnZlclR5cGUgPT0gInRocmVhZC1wb29sIikgewogCi0gICAgICBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyID0gVGhyZWFkTWFuYWdlcjo6bmV3U2ltcGxlVGhyZWFkTWFuYWdlcih3b3JrZXJDb3VudCk7CisgICAgICBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlcgorICAgICAgICAgID0gVGhyZWFkTWFuYWdlcjo6bmV3U2ltcGxlVGhyZWFkTWFuYWdlcih3b3JrZXJDb3VudCk7CiAKICAgICAgIHRocmVhZE1hbmFnZXItPnRocmVhZEZhY3RvcnkodGhyZWFkRmFjdG9yeSk7CiAgICAgICB0aHJlYWRNYW5hZ2VyLT5zdGFydCgpOwotICAgICAgc2VydmVyVGhyZWFkID0gdGhyZWFkRmFjdG9yeS0+bmV3VGhyZWFkKGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXI+KG5ldyBUTm9uYmxvY2tpbmdTZXJ2ZXIoc2VydmljZVByb2Nlc3NvciwgcHJvdG9jb2xGYWN0b3J5LCBwb3J0LCB0aHJlYWRNYW5hZ2VyKSkpOwotICAgICAgc2VydmVyVGhyZWFkMiA9IHRocmVhZEZhY3RvcnktPm5ld1RocmVhZChib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyPihuZXcgVE5vbmJsb2NraW5nU2VydmVyKHNlcnZpY2VQcm9jZXNzb3IsIHByb3RvY29sRmFjdG9yeSwgcG9ydCsxLCB0aHJlYWRNYW5hZ2VyKSkpOworICAgICAgbmJTb2NrZXQxLnJlc2V0KG5ldyB0cmFuc3BvcnQ6OlROb25ibG9ja2luZ1NlcnZlclNvY2tldChwb3J0KSk7CisgICAgICBzZXJ2ZXJUaHJlYWQgPSB0aHJlYWRGYWN0b3J5LT5uZXdUaHJlYWQoc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXI+KAorICAgICAgICAgIG5ldyBUTm9uYmxvY2tpbmdTZXJ2ZXIoc2VydmljZVByb2Nlc3NvciwgcHJvdG9jb2xGYWN0b3J5LCBuYlNvY2tldDEsIHRocmVhZE1hbmFnZXIpKSk7CisgICAgICBuYlNvY2tldDIucmVzZXQobmV3IHRyYW5zcG9ydDo6VE5vbmJsb2NraW5nU2VydmVyU29ja2V0KHBvcnQgKyAxKSk7CisgICAgICBzZXJ2ZXJUaHJlYWQyID0gdGhyZWFkRmFjdG9yeS0+bmV3VGhyZWFkKHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyPigKKyAgICAgICAgICBuZXcgVE5vbmJsb2NraW5nU2VydmVyKHNlcnZpY2VQcm9jZXNzb3IsIHByb3RvY29sRmFjdG9yeSwgbmJTb2NrZXQyLCB0aHJlYWRNYW5hZ2VyKSkpOwogICAgIH0KIAogICAgIGNlcnIgPDwgIlN0YXJ0aW5nIHRoZSBzZXJ2ZXIgb24gcG9ydCAiIDw8IHBvcnQgPDwgIiBhbmQgIiA8PCAocG9ydCArIDEpIDw8IGVuZGw7CkBAIC00MTIsNDYgKzQzNiw1NyBAQAogCiAgICAgc2l6ZV90IHRocmVhZENvdW50ID0gMDsKIAotICAgIHNldDxib29zdDo6c2hhcmVkX3B0cjxUaHJlYWQ+ID4gY2xpZW50VGhyZWFkczsKKyAgICBzZXQ8c3RkOjpzaGFyZWRfcHRyPFRocmVhZD4gPiBjbGllbnRUaHJlYWRzOwogCi0gICAgaWYgKGNhbGxOYW1lID09ICJlY2hvVm9pZCIpIHsgbG9vcFR5cGUgPSBUX1ZPSUQ7fQotICAgIGVsc2UgaWYgKGNhbGxOYW1lID09ICJlY2hvQnl0ZSIpIHsgbG9vcFR5cGUgPSBUX0JZVEU7fQotICAgIGVsc2UgaWYgKGNhbGxOYW1lID09ICJlY2hvSTMyIikgeyBsb29wVHlwZSA9IFRfSTMyO30KLSAgICBlbHNlIGlmIChjYWxsTmFtZSA9PSAiZWNob0k2NCIpIHsgbG9vcFR5cGUgPSBUX0k2NDt9Ci0gICAgZWxzZSBpZiAoY2FsbE5hbWUgPT0gImVjaG9TdHJpbmciKSB7IGxvb3BUeXBlID0gVF9TVFJJTkc7fQotICAgIGVsc2Uge3Rocm93IGludmFsaWRfYXJndW1lbnQoIlVua25vd24gc2VydmljZSBjYWxsICIrY2FsbE5hbWUpO30KKyAgICBpZiAoY2FsbE5hbWUgPT0gImVjaG9Wb2lkIikgeworICAgICAgbG9vcFR5cGUgPSBUX1ZPSUQ7CisgICAgfSBlbHNlIGlmIChjYWxsTmFtZSA9PSAiZWNob0J5dGUiKSB7CisgICAgICBsb29wVHlwZSA9IFRfQllURTsKKyAgICB9IGVsc2UgaWYgKGNhbGxOYW1lID09ICJlY2hvSTMyIikgeworICAgICAgbG9vcFR5cGUgPSBUX0kzMjsKKyAgICB9IGVsc2UgaWYgKGNhbGxOYW1lID09ICJlY2hvSTY0IikgeworICAgICAgbG9vcFR5cGUgPSBUX0k2NDsKKyAgICB9IGVsc2UgaWYgKGNhbGxOYW1lID09ICJlY2hvU3RyaW5nIikgeworICAgICAgbG9vcFR5cGUgPSBUX1NUUklORzsKKyAgICB9IGVsc2UgeworICAgICAgdGhyb3cgaW52YWxpZF9hcmd1bWVudCgiVW5rbm93biBzZXJ2aWNlIGNhbGwgIiArIGNhbGxOYW1lKTsKKyAgICB9CiAKICAgICBmb3IgKHVpbnQzMl90IGl4ID0gMDsgaXggPCBjbGllbnRDb3VudDsgaXgrKykgewogCi0gICAgICBib29zdDo6c2hhcmVkX3B0cjxUU29ja2V0PiBzb2NrZXQobmV3IFRTb2NrZXQoIjEyNy4wLjAuMSIsIHBvcnQgKyAoaXggJSAyKSkpOwotICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VEZyYW1lZFRyYW5zcG9ydD4gZnJhbWVkU29ja2V0KG5ldyBURnJhbWVkVHJhbnNwb3J0KHNvY2tldCkpOwotICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90b2NvbChuZXcgVEJpbmFyeVByb3RvY29sKGZyYW1lZFNvY2tldCkpOwotICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8U2VydmljZUNsaWVudD4gc2VydmljZUNsaWVudChuZXcgU2VydmljZUNsaWVudChwcm90b2NvbCkpOworICAgICAgc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+IHNvY2tldChuZXcgVFNvY2tldCgiMTI3LjAuMC4xIiwgcG9ydCArIChpeCAlIDIpKSk7CisgICAgICBzdGQ6OnNoYXJlZF9wdHI8VEZyYW1lZFRyYW5zcG9ydD4gZnJhbWVkU29ja2V0KG5ldyBURnJhbWVkVHJhbnNwb3J0KHNvY2tldCkpOworICAgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG9jb2wobmV3IFRCaW5hcnlQcm90b2NvbChmcmFtZWRTb2NrZXQpKTsKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxTZXJ2aWNlQ2xpZW50PiBzZXJ2aWNlQ2xpZW50KG5ldyBTZXJ2aWNlQ2xpZW50KHByb3RvY29sKSk7CiAKLSAgICAgIGNsaWVudFRocmVhZHMuaW5zZXJ0KHRocmVhZEZhY3RvcnktPm5ld1RocmVhZChib29zdDo6c2hhcmVkX3B0cjxDbGllbnRUaHJlYWQ+KG5ldyBDbGllbnRUaHJlYWQoc29ja2V0LCBzZXJ2aWNlQ2xpZW50LCBtb25pdG9yLCB0aHJlYWRDb3VudCwgbG9vcENvdW50LCBsb29wVHlwZSkpKSk7CisgICAgICBjbGllbnRUaHJlYWRzLmluc2VydCh0aHJlYWRGYWN0b3J5LT5uZXdUaHJlYWQoc3RkOjpzaGFyZWRfcHRyPENsaWVudFRocmVhZD4oCisgICAgICAgICAgbmV3IENsaWVudFRocmVhZChzb2NrZXQsIHNlcnZpY2VDbGllbnQsIG1vbml0b3IsIHRocmVhZENvdW50LCBsb29wQ291bnQsIGxvb3BUeXBlKSkpKTsKICAgICB9CiAKLSAgICBmb3IgKHN0ZDo6c2V0PGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZD4gPjo6Y29uc3RfaXRlcmF0b3IgdGhyZWFkID0gY2xpZW50VGhyZWFkcy5iZWdpbigpOyB0aHJlYWQgIT0gY2xpZW50VGhyZWFkcy5lbmQoKTsgdGhyZWFkKyspIHsKKyAgICBmb3IgKHN0ZDo6c2V0PHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWQ+ID46OmNvbnN0X2l0ZXJhdG9yIHRocmVhZCA9IGNsaWVudFRocmVhZHMuYmVnaW4oKTsKKyAgICAgICAgIHRocmVhZCAhPSBjbGllbnRUaHJlYWRzLmVuZCgpOworICAgICAgICAgdGhyZWFkKyspIHsKICAgICAgICgqdGhyZWFkKS0+c3RhcnQoKTsKICAgICB9CiAKICAgICBpbnQ2NF90IHRpbWUwMDsKICAgICBpbnQ2NF90IHRpbWUwMTsKIAotICAgIHtTeW5jaHJvbml6ZWQgcyhtb25pdG9yKTsKKyAgICB7CisgICAgICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yKTsKICAgICAgIHRocmVhZENvdW50ID0gY2xpZW50Q291bnQ7CiAKLSAgICAgIGNlcnIgPDwgIkxhdW5jaCAiPDwgY2xpZW50Q291bnQgPDwgIiBjbGllbnQgdGhyZWFkcyIgPDwgZW5kbDsKKyAgICAgIGNlcnIgPDwgIkxhdW5jaCAiIDw8IGNsaWVudENvdW50IDw8ICIgY2xpZW50IHRocmVhZHMiIDw8IGVuZGw7CiAKLSAgICAgIHRpbWUwMCA9ICBVdGlsOjpjdXJyZW50VGltZSgpOworICAgICAgdGltZTAwID0gVXRpbDo6Y3VycmVudFRpbWUoKTsKIAogICAgICAgbW9uaXRvci5ub3RpZnlBbGwoKTsKIAotICAgICAgd2hpbGUodGhyZWFkQ291bnQgPiAwKSB7CisgICAgICB3aGlsZSAodGhyZWFkQ291bnQgPiAwKSB7CiAgICAgICAgIG1vbml0b3Iud2FpdCgpOwogICAgICAgfQogCi0gICAgICB0aW1lMDEgPSAgVXRpbDo6Y3VycmVudFRpbWUoKTsKKyAgICAgIHRpbWUwMSA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7CiAgICAgfQogCiAgICAgaW50NjRfdCBmaXJzdFRpbWUgPSA5MjIzMzcyMDM2ODU0Nzc1ODA3TEw7CkBAIC00NjEsOSArNDk2LDEyIEBACiAgICAgaW50NjRfdCBtaW5UaW1lID0gOTIyMzM3MjAzNjg1NDc3NTgwN0xMOwogICAgIGludDY0X3QgbWF4VGltZSA9IDA7CiAKLSAgICBmb3IgKHNldDxib29zdDo6c2hhcmVkX3B0cjxUaHJlYWQ+ID46Oml0ZXJhdG9yIGl4ID0gY2xpZW50VGhyZWFkcy5iZWdpbigpOyBpeCAhPSBjbGllbnRUaHJlYWRzLmVuZCgpOyBpeCsrKSB7CisgICAgZm9yIChzZXQ8c3RkOjpzaGFyZWRfcHRyPFRocmVhZD4gPjo6aXRlcmF0b3IgaXggPSBjbGllbnRUaHJlYWRzLmJlZ2luKCk7CisgICAgICAgICBpeCAhPSBjbGllbnRUaHJlYWRzLmVuZCgpOworICAgICAgICAgaXgrKykgewogCi0gICAgICBib29zdDo6c2hhcmVkX3B0cjxDbGllbnRUaHJlYWQ+IGNsaWVudCA9IGJvb3N0OjpkeW5hbWljX3BvaW50ZXJfY2FzdDxDbGllbnRUaHJlYWQ+KCgqaXgpLT5ydW5uYWJsZSgpKTsKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDbGllbnRUaHJlYWQ+IGNsaWVudAorICAgICAgICAgID0gc3RkOjpkeW5hbWljX3BvaW50ZXJfY2FzdDxDbGllbnRUaHJlYWQ+KCgqaXgpLT5ydW5uYWJsZSgpKTsKIAogICAgICAgaW50NjRfdCBkZWx0YSA9IGNsaWVudC0+X2VuZFRpbWUgLSBjbGllbnQtPl9zdGFydFRpbWU7CiAKQEAgLTQ4NSwxMyArNTIzLDEzIEBACiAgICAgICAgIG1heFRpbWUgPSBkZWx0YTsKICAgICAgIH0KIAotICAgICAgYXZlcmFnZVRpbWUrPSBkZWx0YTsKKyAgICAgIGF2ZXJhZ2VUaW1lICs9IGRlbHRhOwogICAgIH0KIAogICAgIGF2ZXJhZ2VUaW1lIC89IGNsaWVudENvdW50OwogCi0KLSAgICBjb3V0IDw8ICAid29ya2VycyA6IiA8PCB3b3JrZXJDb3VudCA8PCAiLCBjbGllbnQgOiAiIDw8IGNsaWVudENvdW50IDw8ICIsIGxvb3BzIDogIiA8PCBsb29wQ291bnQgPDwgIiwgcmF0ZSA6ICIgPDwgKGNsaWVudENvdW50ICogbG9vcENvdW50ICogMTAwMCkgLyAoKGRvdWJsZSkodGltZTAxIC0gdGltZTAwKSkgPDwgZW5kbDsKKyAgICBjb3V0IDw8ICJ3b3JrZXJzIDoiIDw8IHdvcmtlckNvdW50IDw8ICIsIGNsaWVudCA6ICIgPDwgY2xpZW50Q291bnQgPDwgIiwgbG9vcHMgOiAiIDw8IGxvb3BDb3VudAorICAgICAgICAgPDwgIiwgcmF0ZSA6ICIgPDwgKGNsaWVudENvdW50ICogbG9vcENvdW50ICogMTAwMCkgLyAoKGRvdWJsZSkodGltZTAxIC0gdGltZTAwKSkgPDwgZW5kbDsKIAogICAgIGNvdW50X21hcCBjb3VudCA9IHNlcnZpY2VIYW5kbGVyLT5nZXRDb3VudCgpOwogICAgIGNvdW50X21hcDo6aXRlcmF0b3IgaXRlcjsKZGlmZiAtLWdpdCBhL3Rlc3QvY3BwL3NyYy9UZXN0Q2xpZW50LmNwcCBiL3Rlc3QvY3BwL3NyYy9UZXN0Q2xpZW50LmNwcApvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IDhjOTdkYzAuLjg5ZjNmZDEKLS0tIGEvdGVzdC9jcHAvc3JjL1Rlc3RDbGllbnQuY3BwCisrKyBiL3Rlc3QvY3BwL3NyYy9UZXN0Q2xpZW50LmNwcApAQCAtMSw0ICsxLDQgQEAKLS8qCivvu78vKgogICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQogICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKICAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCkBAIC0xNyw4NyArMTcsMTM2IEBACiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jZGVmaW5lIF9fU1REQ19GT1JNQVRfTUFDUk9TCi0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLQorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxsb2NhbGU+CisjaW5jbHVkZSA8aW9zPgogI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHNzdHJlYW0+CiAjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPgogI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RIZWFkZXJQcm90b2NvbC5oPgogI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9USlNPTlByb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9USHR0cENsaWVudC5oPgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU1NMU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UWmxpYlRyYW5zcG9ydC5oPgogI2luY2x1ZGUgPHRocmlmdC9hc3luYy9URXZodHRwQ2xpZW50Q2hhbm5lbC5oPgogI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVE5vbmJsb2NraW5nU2VydmVyLmg+IC8vIDxldmVudC5oPgogCi0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+Ci0jaW5jbHVkZSA8Ym9vc3QvcHJvZ3JhbV9vcHRpb25zLmhwcD4KLSNpbmNsdWRlIDxib29zdC9maWxlc3lzdGVtLmhwcD4KLSNpbmNsdWRlIDx0aHJpZnQvY3h4ZnVuY3Rpb25hbC5oPgotI2lmIF9XSU4zMgotICAgI2luY2x1ZGUgPHRocmlmdC93aW5kb3dzL1RXaW5zb2NrU2luZ2xldG9uLmg+CisjaWZkZWYgSEFWRV9TVERJTlRfSAorI2luY2x1ZGUgPHN0ZGludC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9JTlRUWVBFU19ICisjaW5jbHVkZSA8aW50dHlwZXMuaD4KICNlbmRpZgogCisjaW5jbHVkZSA8Ym9vc3QvYWxnb3JpdGhtL3N0cmluZy5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvZmlsZXN5c3RlbS5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvcHJvZ3JhbV9vcHRpb25zLmhwcD4KKyNpbmNsdWRlIDxib29zdC9yYW5kb20vcmFuZG9tX2RldmljZS5ocHA+CisjaWYgX1dJTjMyCisjaW5jbHVkZSA8dGhyaWZ0L3dpbmRvd3MvVFdpbnNvY2tTaW5nbGV0b24uaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiU2Vjb25kU2VydmljZS5oIgogI2luY2x1ZGUgIlRocmlmdFRlc3QuaCIKIAogdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDsKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6YXN5bmM7CiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOwogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7CiB1c2luZyBuYW1lc3BhY2UgdGhyaWZ0Ojp0ZXN0OwotdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojphc3luYzsKLQotLy8gTGVuZ3RoIG9mIGFyZ3ZbMF0gLSBMZW5ndGggb2Ygc2NyaXB0IGRpcgotI2RlZmluZSBFWEVDVVRBQkxFX0ZJTEVfTkFNRV9MRU5HVEggMTkKLQotLy9leHRlcm4gdWludDMyX3QgZ19zb2NrZXRfc3lzY2FsbHM7CiAKIC8vIEN1cnJlbnQgdGltZSwgbWljcm9zZWNvbmRzIHNpbmNlIHRoZSBlcG9jaAotdWludDY0X3Qgbm93KCkKLXsKK3VpbnQ2NF90IG5vdygpIHsKICAgaW50NjRfdCByZXQ7CiAgIHN0cnVjdCB0aW1ldmFsIHR2OwogCiAgIFRIUklGVF9HRVRUSU1FT0ZEQVkoJnR2LCBOVUxMKTsKICAgcmV0ID0gdHYudHZfc2VjOwotICByZXQgPSByZXQqMTAwMCoxMDAwICsgdHYudHZfdXNlYzsKKyAgcmV0ID0gcmV0ICogMTAwMCAqIDEwMDAgKyB0di50dl91c2VjOwogICByZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCB0ZXN0U3RyaW5nX2NsaWVudFJldHVybihjb25zdCBjaGFyKiBob3N0LCBpbnQgcG9ydCwgZXZlbnRfYmFzZSAqYmFzZSwgVFByb3RvY29sRmFjdG9yeSogcHJvdG9jb2xGYWN0b3J5LCBUaHJpZnRUZXN0Q29iQ2xpZW50KiBjbGllbnQpIHsKLSAgKHZvaWQpIGhvc3Q7Ci0gICh2b2lkKSBwb3J0OwotICAodm9pZCkgcHJvdG9jb2xGYWN0b3J5Oworc3RhdGljIHZvaWQgdGVzdFN0cmluZ19jbGllbnRSZXR1cm4oZXZlbnRfYmFzZSogYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0ZXN0TnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUZXN0Q29iQ2xpZW50KiBjbGllbnQpIHsKICAgdHJ5IHsKICAgICBzdHJpbmcgczsKICAgICBjbGllbnQtPnJlY3ZfdGVzdFN0cmluZyhzKTsKLSAgICBjb3V0IDw8ICJ0ZXN0U3RyaW5nOiAiIDw8IHMgPDwgZW5kbDsKKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3M7CisgICAgb3MgPDwgInRlc3QiIDw8IHRlc3ROcjsKKyAgICBjb25zdCBib29sIG9rID0gKHMgPT0gb3Muc3RyKCkpOworICAgIGNvdXQgPDwgInRlc3RTdHJpbmc6ICIgPDwgcyA8PCAiICIgPDwgKChvaykgPyAib2siIDogImZhaWxlZCIpIDw8IGVuZGw7CiAgIH0gY2F0Y2ggKFRFeGNlcHRpb24mIGV4bikgewogICAgIGNvdXQgPDwgIkVycm9yOiAiIDw8IGV4bi53aGF0KCkgPDwgZW5kbDsKICAgfQogCi0gIGV2ZW50X2Jhc2VfbG9vcGJyZWFrKGJhc2UpOyAvLyBlbmQgdGVzdAorICBpZiAodGVzdE5yID09IDkpCisgICAgZXZlbnRfYmFzZV9sb29wYnJlYWsoYmFzZSk7IC8vIGVuZCB0ZXN0CiB9CiAKLXN0YXRpYyB2b2lkIHRlc3RWb2lkX2NsaWVudFJldHVybihjb25zdCBjaGFyKiBob3N0LCBpbnQgcG9ydCwgZXZlbnRfYmFzZSAqYmFzZSwgVFByb3RvY29sRmFjdG9yeSogcHJvdG9jb2xGYWN0b3J5LCBUaHJpZnRUZXN0Q29iQ2xpZW50KiBjbGllbnQpIHsKK3N0YXRpYyB2b2lkIHRlc3RWb2lkX2NsaWVudFJldHVybihldmVudF9iYXNlKiBiYXNlLCBUaHJpZnRUZXN0Q29iQ2xpZW50KiBjbGllbnQpIHsKICAgdHJ5IHsKICAgICBjbGllbnQtPnJlY3ZfdGVzdFZvaWQoKTsKICAgICBjb3V0IDw8ICJ0ZXN0Vm9pZCIgPDwgZW5kbDsKIAotICAgIC8vIG5leHQgdGVzdAotICAgIGRlbGV0ZSBjbGllbnQ7Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VEFzeW5jQ2hhbm5lbD4gY2hhbm5lbChuZXcgVEV2aHR0cENsaWVudENoYW5uZWwoaG9zdCwgIi8iLCBob3N0LCBwb3J0LCBiYXNlKSk7Ci0gICAgY2xpZW50ID0gbmV3IFRocmlmdFRlc3RDb2JDbGllbnQoY2hhbm5lbCwgcHJvdG9jb2xGYWN0b3J5KTsKLSAgICBjbGllbnQtPnRlc3RTdHJpbmcodGN4eDo6YmluZCh0ZXN0U3RyaW5nX2NsaWVudFJldHVybiwgaG9zdCwgcG9ydCwgYmFzZSwgcHJvdG9jb2xGYWN0b3J5LCB0Y3h4OjpwbGFjZWhvbGRlcnM6Ol8xKSwgIlRlc3QiKTsKKyAgICBmb3IgKGludCB0ZXN0TnIgPSAwOyB0ZXN0TnIgPCAxMDsgKyt0ZXN0TnIpIHsKKyAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvczsKKyAgICAgIG9zIDw8ICJ0ZXN0IiA8PCB0ZXN0TnI7CisgICAgICBjbGllbnQtPnRlc3RTdHJpbmcoc3RkOjpiaW5kKHRlc3RTdHJpbmdfY2xpZW50UmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3ROciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6cGxhY2Vob2xkZXJzOjpfMSksCisgICAgICAgICAgICAgICAgICAgICAgIG9zLnN0cigpKTsKKyAgICB9CiAgIH0gY2F0Y2ggKFRFeGNlcHRpb24mIGV4bikgewogICAgIGNvdXQgPDwgIkVycm9yOiAiIDw8IGV4bi53aGF0KCkgPDwgZW5kbDsKICAgfQogfQogCisvLyBXb3JrYXJvdW5kIGZvciBhYnNlbnNlIG9mIEMrKzExICJhdXRvIiBrZXl3b3JkLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Citib29sIHByaW50X2VxKFQgZXhwZWN0ZWQsIFQgYWN0dWFsKSB7CisgIGNvdXQgPDwgIigiIDw8IGFjdHVhbCA8PCAiKSIgPDwgZW5kbDsKKyAgaWYgKGV4cGVjdGVkICE9IGFjdHVhbCkgeworICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsIDw8ICJFeHBlY3RlZDogIiA8PCBleHBlY3RlZCA8PCAiIGJ1dCBnb3Q6ICIgPDwgYWN0dWFsIDw8IGVuZGw7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCisjZGVmaW5lIEJBU0VUWVBFX0lERU5USVRZX1RFU1QoZnVuYywgdmFsdWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvdXQgPDwgI2Z1bmMgIigiIDw8IHZhbHVlIDw8ICIpID0gIjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRyeSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCFwcmludF9lcSh2YWx1ZSwgdGVzdENsaWVudC5mdW5jKHZhbHVlKSkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICByZXR1cm5fY29kZSB8PSBFUlJfQkFTRVRZUEVTOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGhyb3c7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gY2F0Y2ggKGV4Y2VwdGlvbiAmIGV4KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGwgPDwgZXgud2hhdCgpIDw8IGVuZGw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuX2NvZGUgfD0gRVJSX0JBU0VUWVBFUzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworaW50IGJpbmFyeV90ZXN0KFRocmlmdFRlc3RDbGllbnQmIHRlc3RDbGllbnQsIHN0cmluZzo6c2l6ZV90eXBlIHNpeik7CisKK0JPT1NUX0NPTlNURVhQUl9PUl9DT05TVCBpbnQgRVJSX0JBU0VUWVBFUyA9IDE7CitCT09TVF9DT05TVEVYUFJfT1JfQ09OU1QgaW50IEVSUl9TVFJVQ1RTID0gMjsKK0JPT1NUX0NPTlNURVhQUl9PUl9DT05TVCBpbnQgRVJSX0NPTlRBSU5FUlMgPSA0OworQk9PU1RfQ09OU1RFWFBSX09SX0NPTlNUIGludCBFUlJfRVhDRVBUSU9OUyA9IDg7CitCT09TVF9DT05TVEVYUFJfT1JfQ09OU1QgaW50IEVSUl9VTktOT1dOID0gNjQ7CisKIGludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgewotICBzdHJpbmcgZmlsZV9wYXRoID0gYm9vc3Q6OmZpbGVzeXN0ZW06OnN5c3RlbV9jb21wbGV0ZShhcmd2WzBdKS5zdHJpbmcoKTsKLSAgc3RyaW5nIGRpcl9wYXRoID0gZmlsZV9wYXRoLnN1YnN0cigwLCBmaWxlX3BhdGguc2l6ZSgpLUVYRUNVVEFCTEVfRklMRV9OQU1FX0xFTkdUSCk7CisgIGNvdXQucHJlY2lzaW9uKDE5KTsKKworICBzdHJpbmcgdGVzdERpciAgPSBib29zdDo6ZmlsZXN5c3RlbTo6c3lzdGVtX2NvbXBsZXRlKGFyZ3ZbMF0pLnBhcmVudF9wYXRoKCkucGFyZW50X3BhdGgoKS5wYXJlbnRfcGF0aCgpLnN0cmluZygpOworICBzdHJpbmcgY2FQYXRoICAgPSB0ZXN0RGlyICsgIi9rZXlzL0NBLnBlbSI7CisgIHN0cmluZyBjZXJ0UGF0aCA9IHRlc3REaXIgKyAiL2tleXMvY2xpZW50LmNydCI7CisgIHN0cmluZyBrZXlQYXRoICA9IHRlc3REaXIgKyAiL2tleXMvY2xpZW50LmtleSI7CisKICNpZiBfV0lOMzIKICAgdHJhbnNwb3J0OjpUV2luc29ja1NpbmdsZXRvbjo6Y3JlYXRlKCk7CiAjZW5kaWYKQEAgLTEwNSwxNTggKzE1NCwyMTggQEAKICAgaW50IHBvcnQgPSA5MDkwOwogICBpbnQgbnVtVGVzdHMgPSAxOwogICBib29sIHNzbCA9IGZhbHNlOworICBib29sIHpsaWIgPSBmYWxzZTsKICAgc3RyaW5nIHRyYW5zcG9ydF90eXBlID0gImJ1ZmZlcmVkIjsKICAgc3RyaW5nIHByb3RvY29sX3R5cGUgPSAiYmluYXJ5IjsKICAgc3RyaW5nIGRvbWFpbl9zb2NrZXQgPSAiIjsKKyAgYm9vbCBhYnN0cmFjdF9uYW1lc3BhY2UgPSBmYWxzZTsKICAgYm9vbCBub2luc2FuZSA9IGZhbHNlOwogCisgIGludCByZXR1cm5fY29kZSA9IDA7CisKICAgYm9vc3Q6OnByb2dyYW1fb3B0aW9uczo6b3B0aW9uc19kZXNjcmlwdGlvbiBkZXNjKCJBbGxvd2VkIG9wdGlvbnMiKTsKICAgZGVzYy5hZGRfb3B0aW9ucygpCiAgICAgICAoImhlbHAsaCIsICJwcm9kdWNlIGhlbHAgbWVzc2FnZSIpCi0gICAgICAoImhvc3QiLCBib29zdDo6cHJvZ3JhbV9vcHRpb25zOjp2YWx1ZTxzdHJpbmc+KCZob3N0KS0+ZGVmYXVsdF92YWx1ZShob3N0KSwgIkhvc3QgdG8gY29ubmVjdCIpCi0gICAgICAoInBvcnQiLCBib29zdDo6cHJvZ3JhbV9vcHRpb25zOjp2YWx1ZTxpbnQ+KCZwb3J0KS0+ZGVmYXVsdF92YWx1ZShwb3J0KSwgIlBvcnQgbnVtYmVyIHRvIGNvbm5lY3QiKQotCSAgKCJkb21haW4tc29ja2V0IiwgYm9vc3Q6OnByb2dyYW1fb3B0aW9uczo6dmFsdWU8c3RyaW5nPigmZG9tYWluX3NvY2tldCktPmRlZmF1bHRfdmFsdWUoZG9tYWluX3NvY2tldCksICJEb21haW4gU29ja2V0IChlLmcuIC90bXAvVGhyaWZ0VGVzdC50aHJpZnQpLCBpbnN0ZWFkIG9mIGhvc3QgYW5kIHBvcnQiKQotICAgICAgKCJ0cmFuc3BvcnQiLCBib29zdDo6cHJvZ3JhbV9vcHRpb25zOjp2YWx1ZTxzdHJpbmc+KCZ0cmFuc3BvcnRfdHlwZSktPmRlZmF1bHRfdmFsdWUodHJhbnNwb3J0X3R5cGUpLCAiVHJhbnNwb3J0OiBidWZmZXJlZCwgZnJhbWVkLCBodHRwLCBldmh0dHAiKQotICAgICAgKCJwcm90b2NvbCIsIGJvb3N0Ojpwcm9ncmFtX29wdGlvbnM6OnZhbHVlPHN0cmluZz4oJnByb3RvY29sX3R5cGUpLT5kZWZhdWx0X3ZhbHVlKHByb3RvY29sX3R5cGUpLCAiUHJvdG9jb2w6IGJpbmFyeSwgY29tcGFjdCwganNvbiIpCi0JICAoInNzbCIsICJFbmNyeXB0ZWQgVHJhbnNwb3J0IHVzaW5nIFNTTCIpCi0gICAgICAoInRlc3Rsb29wcyxuIiwgYm9vc3Q6OnByb2dyYW1fb3B0aW9uczo6dmFsdWU8aW50PigmbnVtVGVzdHMpLT5kZWZhdWx0X3ZhbHVlKG51bVRlc3RzKSwgIk51bWJlciBvZiBUZXN0cyIpCi0gICAgICAoIm5vaW5zYW5lIiwgIkRvIG5vdCBydW4gaW5zYW5pdHkgdGVzdCIpCi0gIDsKKyAgICAgICgiaG9zdCIsCisgICAgICAgICAgYm9vc3Q6OnByb2dyYW1fb3B0aW9uczo6dmFsdWU8c3RyaW5nPigmaG9zdCktPmRlZmF1bHRfdmFsdWUoaG9zdCksCisgICAgICAgICAgIkhvc3QgdG8gY29ubmVjdCIpCisgICAgICAoInBvcnQiLAorICAgICAgICAgIGJvb3N0Ojpwcm9ncmFtX29wdGlvbnM6OnZhbHVlPGludD4oJnBvcnQpLT5kZWZhdWx0X3ZhbHVlKHBvcnQpLAorICAgICAgICAgICJQb3J0IG51bWJlciB0byBjb25uZWN0IikKKyAgICAgICgiZG9tYWluLXNvY2tldCIsCisgICAgICAgICAgYm9vc3Q6OnByb2dyYW1fb3B0aW9uczo6dmFsdWU8c3RyaW5nPigmZG9tYWluX3NvY2tldCktPmRlZmF1bHRfdmFsdWUoZG9tYWluX3NvY2tldCksCisgICAgICAgICAgIkRvbWFpbiBTb2NrZXQgKGUuZy4gL3RtcC9UaHJpZnRUZXN0LnRocmlmdCksIGluc3RlYWQgb2YgaG9zdCBhbmQgcG9ydCIpCisgICAgICAoImFic3RyYWN0LW5hbWVzcGFjZSIsCisgICAgICAgICAgIkxvb2sgZm9yIHRoZSBkb21haW4gc29ja2V0IGluIHRoZSBBYnN0cmFjdCBOYW1lc3BhY2UiCisgICAgICAgICAgIiAobm8gY29ubmVjdGlvbiB3aXRoIGZpbGVzeXN0ZW0gcGF0aG5hbWVzKSIpCisgICAgICAoInRyYW5zcG9ydCIsCisgICAgICAgICAgYm9vc3Q6OnByb2dyYW1fb3B0aW9uczo6dmFsdWU8c3RyaW5nPigmdHJhbnNwb3J0X3R5cGUpLT5kZWZhdWx0X3ZhbHVlKHRyYW5zcG9ydF90eXBlKSwKKyAgICAgICAgICAiVHJhbnNwb3J0OiBidWZmZXJlZCwgZnJhbWVkLCBodHRwLCBldmh0dHAsIHpsaWIiKQorICAgICAgKCJwcm90b2NvbCIsCisgICAgICAgICAgYm9vc3Q6OnByb2dyYW1fb3B0aW9uczo6dmFsdWU8c3RyaW5nPigmcHJvdG9jb2xfdHlwZSktPmRlZmF1bHRfdmFsdWUocHJvdG9jb2xfdHlwZSksCisgICAgICAgICAgIlByb3RvY29sOiBiaW5hcnksIGNvbXBhY3QsIGhlYWRlciwganNvbiwgbXVsdGksIG11bHRpYywgbXVsdGloLCBtdWx0aWoiKQorICAgICAgKCJzc2wiLAorICAgICAgICAgICJFbmNyeXB0ZWQgVHJhbnNwb3J0IHVzaW5nIFNTTCIpCisgICAgICAoInpsaWIiLAorICAgICAgICAgICJXcmFwIFRyYW5zcG9ydCB3aXRoIFpsaWIiKQorICAgICAgKCJ0ZXN0bG9vcHMsbiIsCisgICAgICAgICAgYm9vc3Q6OnByb2dyYW1fb3B0aW9uczo6dmFsdWU8aW50PigmbnVtVGVzdHMpLT5kZWZhdWx0X3ZhbHVlKG51bVRlc3RzKSwKKyAgICAgICAgICAiTnVtYmVyIG9mIFRlc3RzIikKKyAgICAgICgibm9pbnNhbmUiLAorICAgICAgICAgICJEbyBub3QgcnVuIGluc2FuaXR5IHRlc3QiKTsKIAogICBib29zdDo6cHJvZ3JhbV9vcHRpb25zOjp2YXJpYWJsZXNfbWFwIHZtOwogICBib29zdDo6cHJvZ3JhbV9vcHRpb25zOjpzdG9yZShib29zdDo6cHJvZ3JhbV9vcHRpb25zOjpwYXJzZV9jb21tYW5kX2xpbmUoYXJnYywgYXJndiwgZGVzYyksIHZtKTsKICAgYm9vc3Q6OnByb2dyYW1fb3B0aW9uczo6bm90aWZ5KHZtKTsKIAogICBpZiAodm0uY291bnQoImhlbHAiKSkgewotICAgIGNvdXQgPDwgZGVzYyA8PCAiXG4iOwotICAgIHJldHVybiAxOworICAgIGNvdXQgPDwgZGVzYyA8PCBlbmRsOworICAgIHJldHVybiBFUlJfVU5LTk9XTjsKICAgfQogCiAgIHRyeSB7CiAgICAgaWYgKCFwcm90b2NvbF90eXBlLmVtcHR5KCkpIHsKICAgICAgIGlmIChwcm90b2NvbF90eXBlID09ICJiaW5hcnkiKSB7CiAgICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUgPT0gImNvbXBhY3QiKSB7CisgICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUgPT0gImhlYWRlciIpIHsKICAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZSA9PSAianNvbiIpIHsKKyAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZSA9PSAibXVsdGkiKSB7CisgICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUgPT0gIm11bHRpYyIpIHsKKyAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZSA9PSAibXVsdGloIikgeworICAgICAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlID09ICJtdWx0aWoiKSB7CiAgICAgICB9IGVsc2UgewotICAgICAgICAgIHRocm93IGludmFsaWRfYXJndW1lbnQoIlVua25vd24gcHJvdG9jb2wgdHlwZSAiK3Byb3RvY29sX3R5cGUpOworICAgICAgICB0aHJvdyBpbnZhbGlkX2FyZ3VtZW50KCJVbmtub3duIHByb3RvY29sIHR5cGUgIiArIHByb3RvY29sX3R5cGUpOwogICAgICAgfQogICAgIH0KIAotCWlmICghdHJhbnNwb3J0X3R5cGUuZW1wdHkoKSkgeworICAgIGlmICghdHJhbnNwb3J0X3R5cGUuZW1wdHkoKSkgewogICAgICAgaWYgKHRyYW5zcG9ydF90eXBlID09ICJidWZmZXJlZCIpIHsKICAgICAgIH0gZWxzZSBpZiAodHJhbnNwb3J0X3R5cGUgPT0gImZyYW1lZCIpIHsKICAgICAgIH0gZWxzZSBpZiAodHJhbnNwb3J0X3R5cGUgPT0gImh0dHAiKSB7CiAgICAgICB9IGVsc2UgaWYgKHRyYW5zcG9ydF90eXBlID09ICJldmh0dHAiKSB7CisgICAgICB9IGVsc2UgaWYgKHRyYW5zcG9ydF90eXBlID09ICJ6bGliIikgeworICAgICAgICAvLyBjcm9zc3Rlc3Qgd2lsbCBwYXNzIHpsaWIgYXMgYSB0cmFuc3BvcnQgYW5kIGFzIGEgZmxhZyByaWdodCBub3cuLgogICAgICAgfSBlbHNlIHsKLSAgICAgICAgICB0aHJvdyBpbnZhbGlkX2FyZ3VtZW50KCJVbmtub3duIHRyYW5zcG9ydCB0eXBlICIrdHJhbnNwb3J0X3R5cGUpOworICAgICAgICB0aHJvdyBpbnZhbGlkX2FyZ3VtZW50KCJVbmtub3duIHRyYW5zcG9ydCB0eXBlICIgKyB0cmFuc3BvcnRfdHlwZSk7CiAgICAgICB9CiAgICAgfQogCi0gIH0gY2F0Y2ggKHN0ZDo6ZXhjZXB0aW9uJiBlKSB7CisgIH0gY2F0Y2ggKGV4Y2VwdGlvbiYgZSkgewogICAgIGNlcnIgPDwgZS53aGF0KCkgPDwgZW5kbDsKLSAgICBjb3V0IDw8IGRlc2MgPDwgIlxuIjsKLSAgICByZXR1cm4gMTsKKyAgICBjb3V0IDw8IGRlc2MgPDwgZW5kbDsKKyAgICByZXR1cm4gRVJSX1VOS05PV047CiAgIH0KIAogICBpZiAodm0uY291bnQoInNzbCIpKSB7CiAgICAgc3NsID0gdHJ1ZTsKICAgfQogCisgIGlmICh2bS5jb3VudCgiemxpYiIpKSB7CisgICAgemxpYiA9IHRydWU7CisgIH0KKworICBpZiAodm0uY291bnQoImFic3RyYWN0LW5hbWVzcGFjZSIpKSB7CisgICAgYWJzdHJhY3RfbmFtZXNwYWNlID0gdHJ1ZTsKKyAgfQorCiAgIGlmICh2bS5jb3VudCgibm9pbnNhbmUiKSkgewogICAgIG5vaW5zYW5lID0gdHJ1ZTsKICAgfQogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydDsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90b2NvbDsKLQotICBib29zdDo6c2hhcmVkX3B0cjxUU29ja2V0PiBzb2NrZXQ7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBmYWN0b3J5OworICAvLyBUSFJJRlQtNDE2NDogVGhlIGZhY3RvcnkgTVVTVCBvdXRsaXZlIGFueSBzb2NrZXRzIGl0IGNyZWF0ZXMgZm9yIGNvcnJlY3QgYmVoYXZpb3IhCisgIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gZmFjdG9yeTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+IHNvY2tldDsKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydDsKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG9jb2w7CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvY29sMjsgIC8vIFNlY29uZFNlcnZpY2UgZm9yIG11bHRpcGxleGVkCiAKICAgaWYgKHNzbCkgewotICAgIGZhY3RvcnkgPSBib29zdDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4obmV3IFRTU0xTb2NrZXRGYWN0b3J5KCkpOworICAgIGNvdXQgPDwgIkNsaWVudCBDZXJ0aWZpY2F0ZSBGaWxlOiAiIDw8IGNlcnRQYXRoIDw8IGVuZGw7CisgICAgY291dCA8PCAiQ2xpZW50IEtleSAgICAgICAgIEZpbGU6ICIgPDwga2V5UGF0aCA8PCBlbmRsOworICAgIGNvdXQgPDwgIkNBICAgICAgICAgICAgICAgICBGaWxlOiAiIDw8IGNhUGF0aCA8PCBlbmRsOworCisgICAgZmFjdG9yeSA9IHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4obmV3IFRTU0xTb2NrZXRGYWN0b3J5KCkpOwogICAgIGZhY3RvcnktPmNpcGhlcnMoIkFMTDohQURIOiFMT1c6IUVYUDohTUQ1OkBTVFJFTkdUSCIpOwotICAgIGZhY3RvcnktPmxvYWRUcnVzdGVkQ2VydGlmaWNhdGVzKChkaXJfcGF0aCArICIuLi9rZXlzL0NBLnBlbSIpLmNfc3RyKCkpOworICAgIGZhY3RvcnktPmxvYWRUcnVzdGVkQ2VydGlmaWNhdGVzKGNhUGF0aC5jX3N0cigpKTsKKyAgICBmYWN0b3J5LT5sb2FkQ2VydGlmaWNhdGUoY2VydFBhdGguY19zdHIoKSk7CisgICAgZmFjdG9yeS0+bG9hZFByaXZhdGVLZXkoa2V5UGF0aC5jX3N0cigpKTsKICAgICBmYWN0b3J5LT5hdXRoZW50aWNhdGUodHJ1ZSk7CiAgICAgc29ja2V0ID0gZmFjdG9yeS0+Y3JlYXRlU29ja2V0KGhvc3QsIHBvcnQpOwogICB9IGVsc2UgewogICAgIGlmIChkb21haW5fc29ja2V0ICE9ICIiKSB7Ci0gICAgICBzb2NrZXQgPSBib29zdDo6c2hhcmVkX3B0cjxUU29ja2V0PihuZXcgVFNvY2tldChkb21haW5fc29ja2V0KSk7CisgICAgICBpZiAoYWJzdHJhY3RfbmFtZXNwYWNlKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIGFic3RyYWN0X3NvY2tldCgiXDAiLCAxKTsKKyAgICAgICAgYWJzdHJhY3Rfc29ja2V0ICs9IGRvbWFpbl9zb2NrZXQ7CisgICAgICAgIHNvY2tldCA9IHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0PihuZXcgVFNvY2tldChhYnN0cmFjdF9zb2NrZXQpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNvY2tldCA9IHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0PihuZXcgVFNvY2tldChkb21haW5fc29ja2V0KSk7CisgICAgICB9CiAgICAgICBwb3J0ID0gMDsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBzb2NrZXQgPSBib29zdDo6c2hhcmVkX3B0cjxUU29ja2V0PihuZXcgVFNvY2tldChob3N0LCBwb3J0KSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHNvY2tldCA9IHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0PihuZXcgVFNvY2tldChob3N0LCBwb3J0KSk7CiAgICAgfQogICB9CiAKICAgaWYgKHRyYW5zcG9ydF90eXBlLmNvbXBhcmUoImh0dHAiKSA9PSAwKSB7Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gaHR0cFNvY2tldChuZXcgVEh0dHBDbGllbnQoc29ja2V0LCBob3N0LCAiL3NlcnZpY2UiKSk7Ci0gICAgdHJhbnNwb3J0ID0gaHR0cFNvY2tldDsKLSAgfSBlbHNlIGlmICh0cmFuc3BvcnRfdHlwZS5jb21wYXJlKCJmcmFtZWQiKSA9PSAwKXsKLSAgICBib29zdDo6c2hhcmVkX3B0cjxURnJhbWVkVHJhbnNwb3J0PiBmcmFtZWRTb2NrZXQobmV3IFRGcmFtZWRUcmFuc3BvcnQoc29ja2V0KSk7Ci0gICAgdHJhbnNwb3J0ID0gZnJhbWVkU29ja2V0OwotICB9IGVsc2V7Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VEJ1ZmZlcmVkVHJhbnNwb3J0PiBidWZmZXJlZFNvY2tldChuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KHNvY2tldCkpOwotICAgIHRyYW5zcG9ydCA9IGJ1ZmZlcmVkU29ja2V0OworICAgIHRyYW5zcG9ydCA9IHN0ZDo6bWFrZV9zaGFyZWQ8VEh0dHBDbGllbnQ+KHNvY2tldCwgaG9zdCwgIi9zZXJ2aWNlIik7CisgIH0gZWxzZSBpZiAodHJhbnNwb3J0X3R5cGUuY29tcGFyZSgiZnJhbWVkIikgPT0gMCkgeworICAgIHRyYW5zcG9ydCA9IHN0ZDo6bWFrZV9zaGFyZWQ8VEZyYW1lZFRyYW5zcG9ydD4oc29ja2V0KTsKKyAgfSBlbHNlIHsKKyAgICB0cmFuc3BvcnQgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRCdWZmZXJlZFRyYW5zcG9ydD4oc29ja2V0KTsKICAgfQogCi0gIGlmIChwcm90b2NvbF90eXBlLmNvbXBhcmUoImpzb24iKSA9PSAwKSB7Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBqc29uUHJvdG9jb2wobmV3IFRKU09OUHJvdG9jb2wodHJhbnNwb3J0KSk7Ci0gICAgcHJvdG9jb2wgPSBqc29uUHJvdG9jb2w7Ci0gIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZS5jb21wYXJlKCJjb21wYWN0IikgPT0gMCkgewotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gY29tcGFjdFByb3RvY29sKG5ldyBUQ29tcGFjdFByb3RvY29sKHRyYW5zcG9ydCkpOwotICAgIHByb3RvY29sID0gY29tcGFjdFByb3RvY29sOwotICB9IGVsc2V7Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VEJpbmFyeVByb3RvY29sPiBiaW5hcnlQcm90b2NvbChuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCkpOwotICAgIHByb3RvY29sID0gYmluYXJ5UHJvdG9jb2w7CisgIGlmICh6bGliKSB7CisgICAgdHJhbnNwb3J0ID0gc3RkOjptYWtlX3NoYXJlZDxUWmxpYlRyYW5zcG9ydD4odHJhbnNwb3J0KTsKKyAgfQorCisgIGlmIChwcm90b2NvbF90eXBlID09ICJqc29uIiB8fCBwcm90b2NvbF90eXBlID09ICJtdWx0aWoiKSB7CisgICAgcHJvdG9jb2wgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRKU09OUHJvdG9jb2w+KHRyYW5zcG9ydCk7CisgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZSA9PSAiY29tcGFjdCIgfHwgcHJvdG9jb2xfdHlwZSA9PSAibXVsdGljIikgeworICAgIHByb3RvY29sID0gc3RkOjptYWtlX3NoYXJlZDxUQ29tcGFjdFByb3RvY29sPih0cmFuc3BvcnQpOworICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUgPT0gImhlYWRlciIgfHwgcHJvdG9jb2xfdHlwZSA9PSAibXVsdGloIikgeworICAgIHByb3RvY29sID0gc3RkOjptYWtlX3NoYXJlZDxUSGVhZGVyUHJvdG9jb2w+KHRyYW5zcG9ydCk7CisgIH0gZWxzZSB7CisgICAgcHJvdG9jb2wgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRCaW5hcnlQcm90b2NvbD4odHJhbnNwb3J0KTsKKyAgfQorCisgIGlmIChib29zdDo6c3RhcnRzX3dpdGgocHJvdG9jb2xfdHlwZSwgIm11bHRpIikpIHsKKyAgcHJvdG9jb2wyID0gc3RkOjptYWtlX3NoYXJlZDxUTXVsdGlwbGV4ZWRQcm90b2NvbD4ocHJvdG9jb2wsICJTZWNvbmRTZXJ2aWNlIik7CisgIC8vIHdlIGRvbid0IG5lZWQgYWNjZXNzIHRvIHRoZSBvcmlnaW5hbCBwcm90b2NvbCBhbnkgbW9yZSwgc28uLi4KKyAgcHJvdG9jb2wgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRNdWx0aXBsZXhlZFByb3RvY29sPihwcm90b2NvbCwgIlRocmlmdFRlc3QiKTsKICAgfQogCiAgIC8vIENvbm5lY3Rpb24gaW5mbwotICBjb3V0IDw8ICJDb25uZWN0aW5nICgiIDw8IHRyYW5zcG9ydF90eXBlIDw8ICIvIiA8PCBwcm90b2NvbF90eXBlIDw8ICIpIHRvOiAiIDw8IGRvbWFpbl9zb2NrZXQ7CisgIGNvdXQgPDwgIkNvbm5lY3RpbmcgKCIgPDwgdHJhbnNwb3J0X3R5cGUgPDwgIi8iIDw8IHByb3RvY29sX3R5cGUgPDwgIikgdG86ICI7CisgIGlmIChhYnN0cmFjdF9uYW1lc3BhY2UpIHsKKyAgICBjb3V0IDw8ICdAJzsKKyAgfQorICBjb3V0IDw8IGRvbWFpbl9zb2NrZXQ7CiAgIGlmIChwb3J0ICE9IDApIHsKICAgICBjb3V0IDw8IGhvc3QgPDwgIjoiIDw8IHBvcnQ7CiAgIH0KICAgY291dCA8PCBlbmRsOwogCiAgIGlmICh0cmFuc3BvcnRfdHlwZS5jb21wYXJlKCJldmh0dHAiKSA9PSAwKSB7Ci0gICAgZXZlbnRfYmFzZSAqYmFzZSA9IGV2ZW50X2Jhc2VfbmV3KCk7CisgICAgZXZlbnRfYmFzZSogYmFzZSA9IGV2ZW50X2Jhc2VfbmV3KCk7CiAgICAgY291dCA8PCAiTGliZXZlbnQgVmVyc2lvbjogIiA8PCBldmVudF9nZXRfdmVyc2lvbigpIDw8IGVuZGw7CiAgICAgY291dCA8PCAiTGliZXZlbnQgTWV0aG9kOiAiIDw8IGV2ZW50X2Jhc2VfZ2V0X21ldGhvZChiYXNlKSA8PCBlbmRsOwogI2lmIExJQkVWRU5UX1ZFUlNJT05fTlVNQkVSID49IDB4MDIwMDAwMDAKICAgICBjb3V0IDw8ICJMaWJldmVudCBGZWF0dXJlczogMHgiIDw8IGhleCA8PCBldmVudF9iYXNlX2dldF9mZWF0dXJlcyhiYXNlKSA8PCBlbmRsOwogI2VuZGlmCiAKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnkobmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeShuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKTsKIAotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRBc3luY0NoYW5uZWw+IGNoYW5uZWwobmV3IFRFdmh0dHBDbGllbnRDaGFubmVsKGhvc3QuY19zdHIoKSwgIi8iLCBob3N0LmNfc3RyKCksIHBvcnQsIGJhc2UpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VEFzeW5jQ2hhbm5lbD4gY2hhbm5lbCgKKyAgICAgICAgbmV3IFRFdmh0dHBDbGllbnRDaGFubmVsKGhvc3QuY19zdHIoKSwgIi8iLCBob3N0LmNfc3RyKCksIHBvcnQsIGJhc2UpKTsKICAgICBUaHJpZnRUZXN0Q29iQ2xpZW50KiBjbGllbnQgPSBuZXcgVGhyaWZ0VGVzdENvYkNsaWVudChjaGFubmVsLCBwcm90b2NvbEZhY3RvcnkuZ2V0KCkpOwotICAgIGNsaWVudC0+dGVzdFZvaWQodGN4eDo6YmluZCh0ZXN0Vm9pZF9jbGllbnRSZXR1cm4sIGhvc3QuY19zdHIoKSwgcG9ydCwgYmFzZSwgcHJvdG9jb2xGYWN0b3J5LmdldCgpLCB0Y3h4OjpwbGFjZWhvbGRlcnM6Ol8xKSk7CisgICAgY2xpZW50LT50ZXN0Vm9pZChzdGQ6OmJpbmQodGVzdFZvaWRfY2xpZW50UmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnBsYWNlaG9sZGVyczo6XzEpKTsKIAogICAgIGV2ZW50X2Jhc2VfbG9vcChiYXNlLCAwKTsKICAgICByZXR1cm4gMDsKICAgfQogCi0KICAgVGhyaWZ0VGVzdENsaWVudCB0ZXN0Q2xpZW50KHByb3RvY29sKTsKIAogICB1aW50NjRfdCB0aW1lX21pbiA9IDA7CiAgIHVpbnQ2NF90IHRpbWVfbWF4ID0gMDsKICAgdWludDY0X3QgdGltZV90b3QgPSAwOwogCi0gIGludCBmYWlsQ291bnQgPSAwOwogICBpbnQgdGVzdCA9IDA7CiAgIGZvciAodGVzdCA9IDA7IHRlc3QgPCBudW1UZXN0czsgKyt0ZXN0KSB7CiAKICAgICB0cnkgewogICAgICAgdHJhbnNwb3J0LT5vcGVuKCk7Ci0gICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYgdHR4KSB7Ci0gICAgICBwcmludGYoIkNvbm5lY3QgZmFpbGVkOiAlc1xuIiwgdHR4LndoYXQoKSk7Ci0gICAgICByZXR1cm4gMTsKKyAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJiBleCkgeworICAgICAgY291dCA8PCAiQ29ubmVjdCBmYWlsZWQ6ICIgPDwgZXgud2hhdCgpIDw8IGVuZGw7CisgICAgICByZXR1cm4gRVJSX1VOS05PV047CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogQ09OTkVDVCBURVNUCiAgICAgICovCi0gICAgcHJpbnRmKCJUZXN0ICMlZCwgY29ubmVjdCAlczolZFxuIiwgdGVzdCsxLCBob3N0LmNfc3RyKCksIHBvcnQpOworICAgIHByaW50ZigiVGVzdCAjJWQsIGNvbm5lY3QgJXM6JWRcbiIsIHRlc3QgKyAxLCBob3N0LmNfc3RyKCksIHBvcnQpOwogCiAgICAgdWludDY0X3Qgc3RhcnQgPSBub3coKTsKIApAQCAtMjY0LDYzICszNzMsMjI1IEBACiAgICAgICogVk9JRCBURVNUCiAgICAgICovCiAgICAgdHJ5IHsKLSAgICAgIHByaW50ZigidGVzdFZvaWQoKSIpOworICAgICAgY291dCA8PCAidGVzdFZvaWQoKSIgPDwgZmx1c2g7CiAgICAgICB0ZXN0Q2xpZW50LnRlc3RWb2lkKCk7Ci0gICAgICBwcmludGYoIiA9IHZvaWRcbiIpOwotICAgIH0gY2F0Y2ggKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiYgdGF4KSB7Ci0gICAgICBwcmludGYoIiVzXG4iLCB0YXgud2hhdCgpKTsKLSAgICAgIGZhaWxDb3VudCsrOworICAgICAgY291dCA8PCAiID0gdm9pZCIgPDwgZW5kbDsKKyAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJikgeworICAgICAgLy8gU3RvcCBoZXJlIGlmIHRyYW5zcG9ydCBnb3QgYnJva2VuCisgICAgICB0aHJvdzsKKyAgICB9IGNhdGNoIChleGNlcHRpb24mIGV4KSB7CisgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbCA8PCBleC53aGF0KCkgPDwgZW5kbDsKKyAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9CQVNFVFlQRVM7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogU1RSSU5HIFRFU1QKICAgICAgKi8KLSAgICBwcmludGYoInRlc3RTdHJpbmcoXCJUZXN0XCIpIik7CisgICAgY291dCA8PCAidGVzdFN0cmluZyhcIlRlc3RcIikiIDw8IGZsdXNoOwogICAgIHN0cmluZyBzOwogICAgIHRlc3RDbGllbnQudGVzdFN0cmluZyhzLCAiVGVzdCIpOwotICAgIHByaW50ZigiID0gXCIlc1wiXG4iLCBzLmNfc3RyKCkpOwotICAgIGlmIChzICE9ICJUZXN0IikKLSAgICAgICAgZmFpbENvdW50Kys7CisgICAgY291dCA8PCAiID0gIiA8PCBzIDw8IGVuZGw7CisgICAgaWYgKHMgIT0gIlRlc3QiKSB7CisgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbDsKKyAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9CQVNFVFlQRVM7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBNdWx0aXBsZXhlZCBwcm90b2NvbCAtIGNhbGwgYW5vdGhlciBzZXJ2aWNlIG1ldGhvZAorICAgIC8vIGluIHRoZSBtaWRkbGUgb2YgdGhlIFRocmlmdFRlc3QKKyAgICAvLworICAgIGlmIChib29zdDo6c3RhcnRzX3dpdGgocHJvdG9jb2xfdHlwZSwgIm11bHRpIikpIHsKKyAgICBTZWNvbmRTZXJ2aWNlQ2xpZW50IHNzYyhwcm90b2NvbDIpOworICAgIC8vIHRyYW5zcG9ydCBpcyBhbHJlYWR5IG9wZW4uLi4KKworICAgICAgICB0cnkgeworICAgICAgICAgIGNvdXQgPDwgInNlY29uZFNlcnZpY2Uuc2Vjb25kVGVzdFN0cmluZyhcImZvb1wiKSA9PiAiIDw8IGZsdXNoOworICAgICAgICBzdGQ6OnN0cmluZyByZXN1bHQ7CisgICAgICBzc2Muc2Vjb25kdGVzdFN0cmluZyhyZXN1bHQsICJmb28iKTsKKyAgICAgIGNvdXQgPDwgInsiIDw8IHJlc3VsdCA8PCAifSIgPDwgZW5kbDsKKyAgICAgIH0gY2F0Y2ggKHN0ZDo6ZXhjZXB0aW9uJiBlKSB7CisgICAgICBjb3V0IDw8ICIgICoqKiBGQUlMRUQgKioqICIgPDwgZS53aGF0KCkgPDwgZW5kbDsKKyAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9FWENFUFRJT05TOworICAgIH0KKyAgICB9CisKKyAgICB0cnkgeworI2lmZGVmIF9NU0NfVkVSCisjcHJhZ21hIHdhcm5pbmcoIHB1c2ggKQorI3ByYWdtYSB3YXJuaW5nKCBkaXNhYmxlIDogNDU2NiApCisjZW5kaWYKKyAgICAgIHN0cmluZyBzdHIoCisgICAgICAgICAgIn17QWZyaWthYW5zLCBBbGVtYW5uaXNjaCwgQXJhZ29uw6lzLCDYp9mE2LnYsdio2YrYqSwg2YXYtdix2YksICIKKyAgICAgICAgICAiQXN0dXJpYW51LCBBeW1hciBhcnUsIEF6yZlyYmF5Y2FuLCDQkdCw0YjSodC+0YDRgiwgQm9hcmlzY2gsIMW9ZW1haXTEl8Wha2EsICIKKyAgICAgICAgICAi0JHQtdC70LDRgNGD0YHQutCw0Y8sINCR0LXQu9Cw0YDRg9GB0LrQsNGPICjRgtCw0YDQsNGI0LrQtdCy0ZbRhtCwKSwg0JHRitC70LPQsNGA0YHQutC4LCBCYW1hbmFua2FuLCAiCisgICAgICAgICAgIuCmrOCmvuCmguCmsuCmviwgQnJlemhvbmVnLCBCb3NhbnNraSwgQ2F0YWzDoCwgTcOsbmctZMSVzKRuZy1uZ+G5s8yELCDQndC+0YXRh9C40LnQvSwgIgorICAgICAgICAgICJDZWJ1YW5vLCDhj6PhjrPhjqksIMSMZXNreSwg0KHQu9C+0LLRo8yB0L3RjNGB0LrRiiAvIOKwlOKwjuKwkeKwguKwoeKwkOKwoOKwlOKwjeKwnywg0KfTkdCy0LDRiNC70LAsIEN5bXJhZWcsICIKKyAgICAgICAgICAiRGFuc2ssIFphemFraSwg3oveqN6I3qzegN6o3oTept6Q3rAsIM6VzrvOu863zr3Ouc66zqwsIEVtaWxpw6BuIGUgcnVtYWduw7JsLCBFbmdsaXNoLCAiCisgICAgICAgICAgIkVzcGVyYW50bywgRXNwYcOxb2wsIEVlc3RpLCBFdXNrYXJhLCDZgdin2LHYs9uMLCBTdW9taSwgVsO1cm8sIEbDuHJveXNrdCwgIgorICAgICAgICAgICJGcmFuw6dhaXMsIEFycGV0YW4sIEZ1cmxhbiwgRnJ5c2ssIEdhZWlsZ2UsIOi0m+iqniwgR8OgaWRobGlnLCBHYWxlZ28sICIKKyAgICAgICAgICAiQXZhw7FlJ+G6vSwg4KqX4KuB4Kqc4Kqw4Kq+4Kqk4KuALCBHYWVsZywg16LXkdeo15nXqiwg4KS54KS/4KSo4KWN4KSm4KWALCBGaWppIEhpbmRpLCBIcnZhdHNraSwgIgorICAgICAgICAgICJLcmV5w7JsIGF5aXN5ZW4sIE1hZ3lhciwg1YDVodW11aXWgNWl1bYsIEludGVybGluZ3VhLCBCYWhhc2EgSW5kb25lc2lhLCAiCisgICAgICAgICAgIklsb2thbm8sIElkbywgw41zbGVuc2thLCBJdGFsaWFubywg5pel5pys6KqeLCBMb2piYW4sIEJhc2EgSmF3YSwgIgorICAgICAgICAgICLhg6Xhg5Dhg6Dhg5fhg6Phg5rhg5gsIEtvbmdvLCBLYWxhYWxsaXN1dCwg4LKV4LKo4LON4LKo4LKhLCDtlZzqta3slrQsINCa0YrQsNGA0LDRh9Cw0Lkt0JzQsNC70LrRitCw0YAsICIKKyAgICAgICAgICAiUmlwb2FyaXNjaCwgS3VyZMOuLCDQmtC+0LzQuCwgS2VybmV3ZWssINCa0YvRgNCz0YvQt9GH0LAsIExhdGluYSwgTGFkaW5vLCAiCisgICAgICAgICAgIkzDq3R6ZWJ1ZXJnZXNjaCwgTGltYnVyZ3MsIExpbmfDoWxhLCDguqXgurLguqcsIExpZXR1dmnFsywgTGF0dmllxaF1LCBCYXNhICIKKyAgICAgICAgICAiQmFueXVtYXNhbiwgTWFsYWdhc3ksINCc0LDQutC10LTQvtC90YHQutC4LCDgtK7gtLLgtK/gtL7gtLPgtIIsIOCkruCksOCkvuCkoOClgCwg2YXYp9iy2ZDYsdmI2YbbjCwgQmFoYXNhICIKKyAgICAgICAgICAiTWVsYXl1LCBObmFwdWxpdGFubywgTmVkZXJzYWtzaXNjaCwg4KSo4KWH4KSq4KS+4KSyIOCkreCkvuCkt+CkviwgTmVkZXJsYW5kcywg4oCqIgorICAgICAgICAgICJOb3JzayAobnlub3JzaynigKwsIOKAqk5vcnNrIChib2ttw6VsKeKArCwgTm91b3JtYW5kLCBEaW7DqSBiaXphYWQsICIKKyAgICAgICAgICAiT2NjaXRhbiwg0JjRgNC+0L3QsNGDLCBQYXBpYW1lbnR1LCBEZWl0c2NoLCBQb2xza2ksINm+2YbYrNin2KjbjCwg2b7amtiq2YgsICIKKyAgICAgICAgICAiTm9yZnVrIC8gUGl0a2VybiwgUG9ydHVndcOqcywgUnVuYSBTaW1pLCBSdW1hbnRzY2gsIFJvbWFuaSwgUm9tw6JuxIMsICIKKyAgICAgICAgICAi0KDRg9GB0YHQutC40LksINCh0LDRhdCwINGC0YvQu9CwLCBTYXJkdSwgU2ljaWxpYW51LCBTY290cywgU8OhbWVnaWVsbGEsIFNpbXBsZSAiCisgICAgICAgICAgIkVuZ2xpc2gsIFNsb3ZlbsSNaW5hLCBTbG92ZW7FocSNaW5hLCDQodGA0L/RgdC60LggLyBTcnBza2ksIFNlZWx0ZXJzaywgIgorICAgICAgICAgICJTdmVuc2thLCBLaXN3YWhpbGksIOCupOCuruCuv+CutOCvjSwg4LCk4LGG4LCy4LGB4LCX4LGBLCDQotC+0rfQuNC606MsIOC5hOC4l+C4oiwgVMO8cmttZW7Dp2UsIFRhZ2Fsb2csICIKKyAgICAgICAgICAiVMO8cmvDp2UsINCi0LDRgtCw0YDRh9CwL1RhdGFyw6dhLCDQo9C60YDQsNGX0L3RgdGM0LrQsCwg2KfYsdiv2YgsIFRp4bq/bmcgVmnhu4d0LCBWb2xhcMO8aywgIgorICAgICAgICAgICJXYWxvbiwgV2luYXJheSwg5ZC06K+tLCBpc2lYaG9zYSwg15nXmda015PXmdepLCBZb3LDuWLDoSwgWmXDqnV3cywg5Lit5paHLCAiCisgICAgICAgICAgIkLDom4tbMOibS1nw7osIOeyteiqniIpOworI2lmZGVmIF9NU0NfVkVSCisjcHJhZ21hIHdhcm5pbmcoIHBvcCApCisjZW5kaWYKKyAgICAgIGNvdXQgPDwgInRlc3RTdHJpbmcoIiA8PCBzdHIgPDwgIikgPSAiIDw8IGZsdXNoOworICAgICAgdGVzdENsaWVudC50ZXN0U3RyaW5nKHMsIHN0cik7CisgICAgICBjb3V0IDw8IHMgPDwgZW5kbDsKKyAgICAgIGlmIChzICE9IHN0cikgeworICAgICAgICBjb3V0LmltYnVlKGxvY2FsZSgiZW5fVVMuVVRGOCIpKTsKKyAgICAgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGwgPDwgIkV4cGVjdGVkIHN0cmluZzogIiA8PCBzdHIgPDwgIiBidXQgZ290OiAiIDw8IHMgPDwgZW5kbCA8PCAiQ0xFQVIiOworICAgICAgICByZXR1cm5fY29kZSB8PSBFUlJfQkFTRVRZUEVTOworICAgICAgfQorICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mKSB7CisgICAgICB0aHJvdzsKKyAgICB9IGNhdGNoIChleGNlcHRpb24mIGV4KSB7CisgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbCA8PCBleC53aGF0KCkgPDwgZW5kbDsKKyAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9CQVNFVFlQRVM7CisgICAgICByZXR1cm4gcmV0dXJuX2NvZGU7CisgICAgfQorICAgIHRyeSB7CisgICAgICBzdHJpbmcgc3RyKAorICAgICAgICAgICJxdW90ZTogXCIgYmFja3NsYXNoOiIKKyAgICAgICAgICAiIGZvcndhcmRzbGFzaC1lc2NhcGVkOiBcXC8gIgorICAgICAgICAgICIgYmFja3NwYWNlOiBcYiBmb3JtZmVlZDogXGYgbmV3bGluZTogXG4gcmV0dXJuOiBcciB0YWI6ICIKKyAgICAgICAgICAiIG5vdy1hbGwtb2YtdGhlbS10b2dldGhlcjogXCJcXFxcL1xiXG5cclx0IgorICAgICAgICAgICIgbm93LWEtYnVuY2gtb2YtanVuazogIUAjJCUmKCkoJiUkI3t9e308Pjw+PCIKKyAgICAgICAgICAiIGNoYXItdG8tdGVzdC1qc29uLXBhcnNpbmc6IF1dIFwiXV0gXFxcIiB9fX17IFtbWyAiKTsKKyAgICAgIGNvdXQgPDwgInRlc3RTdHJpbmcoIiA8PCBzdHIgPDwgIikgPSAiIDw8IGZsdXNoOworICAgICAgdGVzdENsaWVudC50ZXN0U3RyaW5nKHMsIHN0cik7CisgICAgICBjb3V0IDw8IHMgPDwgZW5kbDsKKyAgICAgIGlmIChzICE9IHN0cikgeworICAgICAgICBjb3V0LmltYnVlKGxvY2FsZSgiZW5fVVMuVVRGOCIpKTsKKyAgICAgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAiRXhwZWN0ZWQgc3RyaW5nOiAiIDw8IHN0ciA8PCAiIGJ1dCBnb3Q6ICIgPDwgcyA8PCBlbmRsCisgICAgICAgICAgICAgPDwgIkNMRUFSIjsKKyAgICAgICAgOworICAgICAgICByZXR1cm5fY29kZSB8PSBFUlJfQkFTRVRZUEVTOworICAgICAgfQorICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mKSB7CisgICAgICB0aHJvdzsKKyAgICB9IGNhdGNoIChleGNlcHRpb24mIGV4KSB7CisgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbCA8PCBleC53aGF0KCkgPDwgZW5kbDsKKyAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9CQVNFVFlQRVM7CisgICAgICByZXR1cm4gcmV0dXJuX2NvZGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQk9PTCBURVNUCisgICAgICovCisgICAgY291dCA8PCBib29sYWxwaGE7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0Qm9vbCwgdHJ1ZSk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0Qm9vbCwgZmFsc2UpOwogCiAgICAgLyoqCiAgICAgICogQllURSBURVNUCiAgICAgICovCi0gICAgcHJpbnRmKCJ0ZXN0Qnl0ZSgxKSIpOwotICAgIHVpbnQ4X3QgdTggPSB0ZXN0Q2xpZW50LnRlc3RCeXRlKDEpOwotICAgIHByaW50ZigiID0gJWRcbiIsIChpbnQpdTgpOwotICAgIGlmICh1OCAhPSAxKQotICAgICAgICBmYWlsQ291bnQrKzsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3RCeXRlLCAoaW50OF90KTApOworICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdEJ5dGUsIChpbnQ4X3QpLTEpOworICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdEJ5dGUsIChpbnQ4X3QpNDIpOworICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdEJ5dGUsIChpbnQ4X3QpLTQyKTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3RCeXRlLCAoaW50OF90KTEyNyk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0Qnl0ZSwgKGludDhfdCktMTI4KTsKIAogICAgIC8qKgogICAgICAqIEkzMiBURVNUCiAgICAgICovCi0gICAgcHJpbnRmKCJ0ZXN0STMyKC0xKSIpOwotICAgIGludDMyX3QgaTMyID0gdGVzdENsaWVudC50ZXN0STMyKC0xKTsKLSAgICBwcmludGYoIiA9ICVkXG4iLCBpMzIpOwotICAgIGlmIChpMzIgIT0gLTEpCi0gICAgICAgIGZhaWxDb3VudCsrOworICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdEkzMiwgMCk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0STMyLCAtMSk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0STMyLCAxOTAwMDAwMTMpOworICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdEkzMiwgLTE5MDAwMDAxMyk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0STMyLCAobnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1heCkoKSk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0STMyLCAobnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1pbikoKSk7CiAKICAgICAvKioKICAgICAgKiBJNjQgVEVTVAogICAgICAqLwotICAgIHByaW50ZigidGVzdEk2NCgtMzQzNTk3MzgzNjgpIik7Ci0gICAgaW50NjRfdCBpNjQgPSB0ZXN0Q2xpZW50LnRlc3RJNjQoLTM0MzU5NzM4MzY4TEwpOwotICAgIHByaW50ZigiID0gJSIgUFJJZDY0ICJcbiIsIGk2NCk7Ci0gICAgaWYgKGk2NCAhPSAtMzQzNTk3MzgzNjhMTCkKLSAgICAgICAgZmFpbENvdW50Kys7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0STY0LCAoaW50NjRfdCkwKTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3RJNjQsIChpbnQ2NF90KS0xKTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3RJNjQsIChpbnQ2NF90KTcwMDAwMDAwMDAwMDAwMDAxMjNMTCk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0STY0LCAoaW50NjRfdCktNzAwMDAwMDAwMDAwMDAwMDEyM0xMKTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3RJNjQsIChpbnQ2NF90KXBvdyhzdGF0aWNfY2FzdDxkb3VibGU+KDJMTCksIDMyKSk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0STY0LCAoaW50NjRfdCktcG93KHN0YXRpY19jYXN0PGRvdWJsZT4oMkxMKSwgMzIpKTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3RJNjQsIChpbnQ2NF90KXBvdyhzdGF0aWNfY2FzdDxkb3VibGU+KDJMTCksIDMyKSArIDEpOworICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdEk2NCwgKGludDY0X3QpLXBvdyhzdGF0aWNfY2FzdDxkb3VibGU+KDJMTCksIDMyKSAtIDEpOworICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdEk2NCwgKG51bWVyaWNfbGltaXRzPGludDY0X3Q+OjptYXgpKCkpOworICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdEk2NCwgKG51bWVyaWNfbGltaXRzPGludDY0X3Q+OjptaW4pKCkpOworCiAgICAgLyoqCiAgICAgICogRE9VQkxFIFRFU1QKICAgICAgKi8KLSAgICBwcmludGYoInRlc3REb3VibGUoLTUuMjA5ODUyMykiKTsKLSAgICBkb3VibGUgZHViID0gdGVzdENsaWVudC50ZXN0RG91YmxlKC01LjIwOTg1MjMpOwotICAgIHByaW50ZigiID0gJWZcbiIsIGR1Yik7Ci0gICAgaWYgKChkdWIgLSAoLTUuMjA5ODUyMykpID4gMC4wMDEpCi0gICAgICAgIGZhaWxDb3VudCsrOworICAgIC8vIENvbXBhcmluZyBkb3VibGUgdmFsdWVzIHdpdGggcGxhaW4gZXF1YWxpdHkgYmVjYXVzZSBUaHJpZnQgaGFuZGxlcyBmdWxsIHByZWNpc2lvbiBvZiBkb3VibGUKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3REb3VibGUsIDAuMCk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0RG91YmxlLCAtMS4wKTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3REb3VibGUsIC01LjIwOTg1MjMpOworICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdERvdWJsZSwgLTAuMDAwMzQxMDEyNDM5NjM4NTk4Mjc5KTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3REb3VibGUsIHBvdyhzdGF0aWNfY2FzdDxkb3VibGU+KDIpLCAzMikpOworICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdERvdWJsZSwgcG93KHN0YXRpY19jYXN0PGRvdWJsZT4oMiksIDMyKSArIDEpOworICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdERvdWJsZSwgcG93KHN0YXRpY19jYXN0PGRvdWJsZT4oMiksIDUzKSAtIDEpOworICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdERvdWJsZSwgLXBvdyhzdGF0aWNfY2FzdDxkb3VibGU+KDIpLCAzMikpOworICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdERvdWJsZSwgLXBvdyhzdGF0aWNfY2FzdDxkb3VibGU+KDIpLCAzMikgLSAxKTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3REb3VibGUsIC1wb3coc3RhdGljX2Nhc3Q8ZG91YmxlPigyKSwgNTMpICsgMSk7CisKKyAgICB0cnkgeworICAgICAgZG91YmxlIGV4cGVjdGVkID0gcG93KHN0YXRpY19jYXN0PGRvdWJsZT4oMTApLCAzMDcpOworICAgICAgY291dCA8PCAidGVzdERvdWJsZSgiIDw8IGV4cGVjdGVkIDw8ICIpID0gIiA8PCBmbHVzaDsKKyAgICAgIGRvdWJsZSBhY3R1YWwgPSB0ZXN0Q2xpZW50LnRlc3REb3VibGUoZXhwZWN0ZWQpOworICAgICAgY291dCA8PCAiKCIgPDwgYWN0dWFsIDw8ICIpIiA8PCBlbmRsOworICAgICAgaWYgKGV4cGVjdGVkIC0gYWN0dWFsID4gcG93KHN0YXRpY19jYXN0PGRvdWJsZT4oMTApLCAyOTIpKSB7CisgICAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgIkV4cGVjdGVkOiAiIDw8IGV4cGVjdGVkIDw8ICIgYnV0IGdvdDogIiA8PCBhY3R1YWwgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJikgeworICAgICAgdGhyb3c7CisgICAgfSBjYXRjaCAoZXhjZXB0aW9uJiBleCkgeworICAgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGwgPDwgZXgud2hhdCgpIDw8IGVuZGw7CisgICAgICByZXR1cm5fY29kZSB8PSBFUlJfQkFTRVRZUEVTOworICAgIH0KKworICAgIHRyeSB7CisgICAgICBkb3VibGUgZXhwZWN0ZWQgPSBwb3coc3RhdGljX2Nhc3Q8ZG91YmxlPigxMCksIC0yOTIpOworICAgICAgY291dCA8PCAidGVzdERvdWJsZSgiIDw8IGV4cGVjdGVkIDw8ICIpID0gIiA8PCBmbHVzaDsKKyAgICAgIGRvdWJsZSBhY3R1YWwgPSB0ZXN0Q2xpZW50LnRlc3REb3VibGUoZXhwZWN0ZWQpOworICAgICAgY291dCA8PCAiKCIgPDwgYWN0dWFsIDw8ICIpIiA8PCBlbmRsOworICAgICAgaWYgKGV4cGVjdGVkIC0gYWN0dWFsID4gcG93KHN0YXRpY19jYXN0PGRvdWJsZT4oMTApLCAtMzA3KSkgeworICAgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICJFeHBlY3RlZDogIiA8PCBleHBlY3RlZCA8PCAiIGJ1dCBnb3Q6ICIgPDwgYWN0dWFsIDw8IGVuZGw7CisgICAgICB9CisgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYpIHsKKyAgICAgIHRocm93OworICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbiYgZXgpIHsKKyAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsIDw8IGV4LndoYXQoKSA8PCBlbmRsOworICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX0JBU0VUWVBFUzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCSU5BUlkgVEVTVAorICAgICAqLworICAgIGZvciAoc3RyaW5nOjpzaXplX3R5cGUgaSA9IDA7IGkgPCAxMzEwNzMgJiYgIXJldHVybl9jb2RlOyApIHsKKyAgICAgIHJldHVybl9jb2RlIHw9IGJpbmFyeV90ZXN0KHRlc3RDbGllbnQsIGkpOworICAgICAgaWYgKGkgPiAwKSB7IGkgKj0gMjsgfSBlbHNlIHsgKytpOyB9CisgICAgfQorCiAKICAgICAvKioKICAgICAgKiBTVFJVQ1QgVEVTVAogICAgICAqLwotICAgIHByaW50ZigidGVzdFN0cnVjdCh7XCJaZXJvXCIsIDEsIC0zLCAtNX0pIik7CisgICAgY291dCA8PCAidGVzdFN0cnVjdCh7XCJaZXJvXCIsIDEsIC0zLCAtNX0pIiA8PCBmbHVzaDsKICAgICBYdHJ1Y3Qgb3V0OwogICAgIG91dC5zdHJpbmdfdGhpbmcgPSAiWmVybyI7CiAgICAgb3V0LmJ5dGVfdGhpbmcgPSAxOwpAQCAtMzMzLDEzICs2MDQsMTUgQEAKICAgICAgICAgICAgKGludClpbi5ieXRlX3RoaW5nLAogICAgICAgICAgICBpbi5pMzJfdGhpbmcsCiAgICAgICAgICAgIGluLmk2NF90aGluZyk7Ci0gICAgaWYgKGluICE9IG91dCkKLSAgICAJZmFpbENvdW50Kys7CisgICAgaWYgKGluICE9IG91dCkgeworICAgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGw7CisgICAgICByZXR1cm5fY29kZSB8PSBFUlJfU1RSVUNUUzsKKyAgICB9CiAKICAgICAvKioKICAgICAgKiBORVNURUQgU1RSVUNUIFRFU1QKICAgICAgKi8KLSAgICBwcmludGYoInRlc3ROZXN0KHsxLCB7XCJaZXJvXCIsIDEsIC0zLCAtNX0pLCA1fSIpOworICAgIGNvdXQgPDwgInRlc3ROZXN0KHsxLCB7XCJaZXJvXCIsIDEsIC0zLCAtNX0pLCA1fSIgPDwgZmx1c2g7CiAgICAgWHRydWN0MiBvdXQyOwogICAgIG91dDIuYnl0ZV90aGluZyA9IDE7CiAgICAgb3V0Mi5zdHJ1Y3RfdGhpbmcgPSBvdXQ7CkBAIC0zNTQsNDggKzYyNyw3OCBAQAogICAgICAgICAgICBpbi5pMzJfdGhpbmcsCiAgICAgICAgICAgIGluLmk2NF90aGluZywKICAgICAgICAgICAgaW4yLmkzMl90aGluZyk7Ci0gICAgaWYgKGluMiAhPSBvdXQyKQotICAgIAlmYWlsQ291bnQrKzsKKyAgICBpZiAoaW4yICE9IG91dDIpIHsKKyAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsOworICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX1NUUlVDVFM7CisgICAgfQogCiAgICAgLyoqCiAgICAgICogTUFQIFRFU1QKICAgICAgKi8KLSAgICBtYXA8aW50MzJfdCxpbnQzMl90PiBtYXBvdXQ7CisgICAgbWFwPGludDMyX3QsIGludDMyX3Q+IG1hcG91dDsKICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCA1OyArK2kpIHsKLSAgICAgIG1hcG91dC5pbnNlcnQobWFrZV9wYWlyKGksIGktMTApKTsKKyAgICAgIG1hcG91dC5pbnNlcnQobWFrZV9wYWlyKGksIGkgLSAxMCkpOwogICAgIH0KLSAgICBwcmludGYoInRlc3RNYXAoeyIpOworICAgIGNvdXQgPDwgInRlc3RNYXAoeyIgPDwgZmx1c2g7CiAgICAgbWFwPGludDMyX3QsIGludDMyX3Q+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CiAgICAgYm9vbCBmaXJzdCA9IHRydWU7CiAgICAgZm9yIChtX2l0ZXIgPSBtYXBvdXQuYmVnaW4oKTsgbV9pdGVyICE9IG1hcG91dC5lbmQoKTsgKyttX2l0ZXIpIHsKICAgICAgIGlmIChmaXJzdCkgewogICAgICAgICBmaXJzdCA9IGZhbHNlOwogICAgICAgfSBlbHNlIHsKLSAgICAgICAgcHJpbnRmKCIsICIpOworICAgICAgICBjb3V0IDw8ICIsIjsKICAgICAgIH0KLSAgICAgIHByaW50ZigiJWQgPT4gJWQiLCBtX2l0ZXItPmZpcnN0LCBtX2l0ZXItPnNlY29uZCk7CisgICAgICBjb3V0IDw8IG1faXRlci0+Zmlyc3QgPDwgIiA9PiAiIDw8IG1faXRlci0+c2Vjb25kOwogICAgIH0KLSAgICBwcmludGYoIn0pIik7Ci0gICAgbWFwPGludDMyX3QsaW50MzJfdD4gbWFwaW47CisgICAgY291dCA8PCAifSkiOworICAgIG1hcDxpbnQzMl90LCBpbnQzMl90PiBtYXBpbjsKICAgICB0ZXN0Q2xpZW50LnRlc3RNYXAobWFwaW4sIG1hcG91dCk7Ci0gICAgcHJpbnRmKCIgPSB7Iik7CisgICAgY291dCA8PCAiID0geyI7CiAgICAgZmlyc3QgPSB0cnVlOwogICAgIGZvciAobV9pdGVyID0gbWFwaW4uYmVnaW4oKTsgbV9pdGVyICE9IG1hcGluLmVuZCgpOyArK21faXRlcikgewogICAgICAgaWYgKGZpcnN0KSB7CiAgICAgICAgIGZpcnN0ID0gZmFsc2U7CiAgICAgICB9IGVsc2UgewotICAgICAgICBwcmludGYoIiwgIik7CisgICAgICAgIGNvdXQgPDwgIiwiOwogICAgICAgfQotICAgICAgcHJpbnRmKCIlZCA9PiAlZCIsIG1faXRlci0+Zmlyc3QsIG1faXRlci0+c2Vjb25kKTsKKyAgICAgIGNvdXQgPDwgbV9pdGVyLT5maXJzdCA8PCAiID0+ICIgPDwgbV9pdGVyLT5zZWNvbmQ7CiAgICAgfQotICAgIHByaW50ZigifVxuIik7Ci0gICAgaWYgKG1hcGluICE9IG1hcG91dCkKLSAgICAJZmFpbENvdW50Kys7CisgICAgY291dCA8PCAifSIgPDwgZW5kbDsKKyAgICBpZiAobWFwaW4gIT0gbWFwb3V0KSB7CisgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbDsKKyAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9DT05UQUlORVJTOworICAgIH0KIAogICAgIC8qKgogICAgICAqIFNUUklORyBNQVAgVEVTVAotICAgICAqICBtaXNzaW5nCiAgICAgICovCisgICAgY291dCA8PCAidGVzdFN0cmluZ01hcCh7YSA9PiAyLCBiID0+IGJsYWgsIHNvbWUgPT4gdGhpbmd9KSA9IHsiIDw8IGZsdXNoOworICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gc21hcGluOworICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gc21hcG91dDsKKyAgICBzbWFwaW5bImEiXSA9ICIyIjsKKyAgICBzbWFwaW5bImIiXSA9ICJibGFoIjsKKyAgICBzbWFwaW5bInNvbWUiXSA9ICJ0aGluZyI7CisgICAgdHJ5IHsKKyAgICAgIHRlc3RDbGllbnQudGVzdFN0cmluZ01hcChzbWFwb3V0LCBzbWFwaW4pOworICAgICAgZmlyc3QgPSB0cnVlOworICAgICAgZm9yIChtYXA8c3RyaW5nLCBzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdCA9IHNtYXBvdXQuYmVnaW4oKTsgaXQgIT0gc21hcG91dC5lbmQoKTsgKytpdCkgeworICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgY291dCA8PCAiLCI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICBjb3V0IDw8IGl0LT5maXJzdCA8PCAiID0+ICIgPDwgaXQtPnNlY29uZDsKKyAgICAgIH0KKyAgICAgIGNvdXQgPDwgIn0iIDw8IGVuZGw7CisgICAgICBpZiAoc21hcGluICE9IHNtYXBvdXQpIHsKKyAgICAgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGw7CisgICAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9DT05UQUlORVJTOworICAgICAgfQorICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mKSB7CisgICAgICB0aHJvdzsKKyAgICB9IGNhdGNoIChleGNlcHRpb24mIGV4KSB7CisgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbCA8PCBleC53aGF0KCkgPDwgZW5kbDsKKyAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9DT05UQUlORVJTOworICAgIH0KIAogICAgIC8qKgogICAgICAqIFNFVCBURVNUCkBAIC00MDQsMTY0ICs3MDcsMjE5IEBACiAgICAgZm9yIChpbnQzMl90IGkgPSAtMjsgaSA8IDM7ICsraSkgewogICAgICAgc2V0b3V0Lmluc2VydChpKTsKICAgICB9Ci0gICAgcHJpbnRmKCJ0ZXN0U2V0KHsiKTsKKyAgICBjb3V0IDw8ICJ0ZXN0U2V0KHsiIDw8IGZsdXNoOwogICAgIHNldDxpbnQzMl90Pjo6Y29uc3RfaXRlcmF0b3Igc19pdGVyOwogICAgIGZpcnN0ID0gdHJ1ZTsKICAgICBmb3IgKHNfaXRlciA9IHNldG91dC5iZWdpbigpOyBzX2l0ZXIgIT0gc2V0b3V0LmVuZCgpOyArK3NfaXRlcikgewogICAgICAgaWYgKGZpcnN0KSB7CiAgICAgICAgIGZpcnN0ID0gZmFsc2U7CiAgICAgICB9IGVsc2UgewotICAgICAgICBwcmludGYoIiwgIik7CisgICAgICAgIGNvdXQgPDwgIiwiOwogICAgICAgfQotICAgICAgcHJpbnRmKCIlZCIsICpzX2l0ZXIpOworICAgICAgY291dCA8PCAqc19pdGVyOwogICAgIH0KLSAgICBwcmludGYoIn0pIik7CisgICAgY291dCA8PCAifSkiOwogICAgIHNldDxpbnQzMl90PiBzZXRpbjsKICAgICB0ZXN0Q2xpZW50LnRlc3RTZXQoc2V0aW4sIHNldG91dCk7Ci0gICAgcHJpbnRmKCIgPSB7Iik7CisgICAgY291dCA8PCAiID0geyI7CiAgICAgZmlyc3QgPSB0cnVlOwogICAgIGZvciAoc19pdGVyID0gc2V0aW4uYmVnaW4oKTsgc19pdGVyICE9IHNldGluLmVuZCgpOyArK3NfaXRlcikgewogICAgICAgaWYgKGZpcnN0KSB7CiAgICAgICAgIGZpcnN0ID0gZmFsc2U7CiAgICAgICB9IGVsc2UgewotICAgICAgICBwcmludGYoIiwgIik7CisgICAgICAgIGNvdXQgPDwgIiwiOwogICAgICAgfQotICAgICAgcHJpbnRmKCIlZCIsICpzX2l0ZXIpOworICAgICAgY291dCA8PCAqc19pdGVyOwogICAgIH0KLSAgICBwcmludGYoIn1cbiIpOwotICAgIGlmIChzZXRpbiAhPSBzZXRvdXQpCi0gICAgCWZhaWxDb3VudCsrOworICAgIGNvdXQgPDwgIn0iIDw8IGVuZGw7CisgICAgaWYgKHNldGluICE9IHNldG91dCkgeworICAgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGw7CisgICAgICByZXR1cm5fY29kZSB8PSBFUlJfQ09OVEFJTkVSUzsKKyAgICB9CiAKICAgICAvKioKICAgICAgKiBMSVNUIFRFU1QKICAgICAgKi8KLSAgICB2ZWN0b3I8aW50MzJfdD4gbGlzdG91dDsKLSAgICBmb3IgKGludDMyX3QgaSA9IC0yOyBpIDwgMzsgKytpKSB7Ci0gICAgICBsaXN0b3V0LnB1c2hfYmFjayhpKTsKLSAgICB9Ci0gICAgcHJpbnRmKCJ0ZXN0TGlzdCh7Iik7Ci0gICAgdmVjdG9yPGludDMyX3Q+Ojpjb25zdF9pdGVyYXRvciBsX2l0ZXI7Ci0gICAgZmlyc3QgPSB0cnVlOwotICAgIGZvciAobF9pdGVyID0gbGlzdG91dC5iZWdpbigpOyBsX2l0ZXIgIT0gbGlzdG91dC5lbmQoKTsgKytsX2l0ZXIpIHsKLSAgICAgIGlmIChmaXJzdCkgewotICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcHJpbnRmKCIsICIpOworICAgIGNvdXQgPDwgInRlc3RMaXN0KGVtcHR5KSIgPDwgZmx1c2g7CisgICAgdHJ5IHsKKyAgICAgIHZlY3RvcjxpbnQzMl90PiBsaXN0b3V0OworICAgICAgdGVzdENsaWVudC50ZXN0TGlzdChsaXN0b3V0LCB2ZWN0b3I8aW50MzJfdD4oKSk7CisgICAgICBpZiAoIWxpc3RvdXQuZW1wdHkoKSkgeworICAgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbDsKKyAgICAgICAgY291dCA8PCAiaW52YWxpZCBsZW5ndGg6ICIgPDwgbGlzdG91dC5zaXplKCkgPDwgZW5kbDsKKyAgICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX0NPTlRBSU5FUlM7CiAgICAgICB9Ci0gICAgICBwcmludGYoIiVkIiwgKmxfaXRlcik7CisgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYpIHsKKyAgICAgIHRocm93OworICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbiYgZXgpIHsKKyAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsIDw8IGV4LndoYXQoKSA8PCBlbmRsOworICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX0NPTlRBSU5FUlM7CiAgICAgfQotICAgIHByaW50ZigifSkiKTsKLSAgICB2ZWN0b3I8aW50MzJfdD4gbGlzdGluOwotICAgIHRlc3RDbGllbnQudGVzdExpc3QobGlzdGluLCBsaXN0b3V0KTsKLSAgICBwcmludGYoIiA9IHsiKTsKLSAgICBmaXJzdCA9IHRydWU7Ci0gICAgZm9yIChsX2l0ZXIgPSBsaXN0aW4uYmVnaW4oKTsgbF9pdGVyICE9IGxpc3Rpbi5lbmQoKTsgKytsX2l0ZXIpIHsKLSAgICAgIGlmIChmaXJzdCkgewotICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcHJpbnRmKCIsICIpOworICAgIHRyeSB7CisgICAgICB2ZWN0b3I8aW50MzJfdD4gbGlzdG91dDsKKyAgICAgIGZvciAoaW50MzJfdCBpID0gLTI7IGkgPCAzOyArK2kpIHsKKyAgICAgICAgbGlzdG91dC5wdXNoX2JhY2soaSk7CiAgICAgICB9Ci0gICAgICBwcmludGYoIiVkIiwgKmxfaXRlcik7CisgICAgICBjb3V0IDw8ICJ0ZXN0TGlzdCh7IiA8PCBmbHVzaDsKKyAgICAgIHZlY3RvcjxpbnQzMl90Pjo6Y29uc3RfaXRlcmF0b3IgbF9pdGVyOworICAgICAgZmlyc3QgPSB0cnVlOworICAgICAgZm9yIChsX2l0ZXIgPSBsaXN0b3V0LmJlZ2luKCk7IGxfaXRlciAhPSBsaXN0b3V0LmVuZCgpOyArK2xfaXRlcikgeworICAgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGNvdXQgPDwgIiwiOworICAgICAgICB9CisgICAgICAgIGNvdXQgPDwgKmxfaXRlcjsKKyAgICAgIH0KKyAgICAgIGNvdXQgPDwgIn0pIjsKKyAgICAgIHZlY3RvcjxpbnQzMl90PiBsaXN0aW47CisgICAgICB0ZXN0Q2xpZW50LnRlc3RMaXN0KGxpc3RpbiwgbGlzdG91dCk7CisgICAgICBjb3V0IDw8ICIgPSB7IjsKKyAgICAgIGZpcnN0ID0gdHJ1ZTsKKyAgICAgIGZvciAobF9pdGVyID0gbGlzdGluLmJlZ2luKCk7IGxfaXRlciAhPSBsaXN0aW4uZW5kKCk7ICsrbF9pdGVyKSB7CisgICAgICAgIGlmIChmaXJzdCkgeworICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgY291dCA8PCAiLCI7CisgICAgICAgIH0KKyAgICAgICAgY291dCA8PCAqbF9pdGVyOworICAgICAgfQorICAgICAgY291dCA8PCAifSIgPDwgZW5kbDsKKyAgICAgIGlmIChsaXN0aW4gIT0gbGlzdG91dCkgeworICAgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbDsKKyAgICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX0NPTlRBSU5FUlM7CisgICAgICB9CisgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYpIHsKKyAgICAgIHRocm93OworICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbiYgZXgpIHsKKyAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsIDw8IGV4LndoYXQoKSA8PCBlbmRsOworICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX0NPTlRBSU5FUlM7CiAgICAgfQotICAgIHByaW50ZigifVxuIik7Ci0gICAgaWYgKGxpc3RpbiAhPSBsaXN0b3V0KQotICAgIAlmYWlsQ291bnQrKzsKIAogICAgIC8qKgogICAgICAqIEVOVU0gVEVTVAogICAgICAqLwotICAgIHByaW50ZigidGVzdEVudW0oT05FKSIpOworICAgIGNvdXQgPDwgInRlc3RFbnVtKE9ORSkiIDw8IGZsdXNoOwogICAgIE51bWJlcno6OnR5cGUgcmV0ID0gdGVzdENsaWVudC50ZXN0RW51bShOdW1iZXJ6OjpPTkUpOwotICAgIHByaW50ZigiID0gJWRcbiIsIHJldCk7Ci0gICAgaWYgKHJldCAhPSBOdW1iZXJ6OjpPTkUpCi0gICAgCWZhaWxDb3VudCsrOworICAgIGNvdXQgPDwgIiA9ICIgPDwgcmV0IDw8IGVuZGw7CisgICAgaWYgKHJldCAhPSBOdW1iZXJ6OjpPTkUpIHsKKyAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsOworICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX1NUUlVDVFM7CisgICAgfQogCi0gICAgcHJpbnRmKCJ0ZXN0RW51bShUV08pIik7CisgICAgY291dCA8PCAidGVzdEVudW0oVFdPKSIgPDwgZmx1c2g7CiAgICAgcmV0ID0gdGVzdENsaWVudC50ZXN0RW51bShOdW1iZXJ6OjpUV08pOwotICAgIHByaW50ZigiID0gJWRcbiIsIHJldCk7Ci0gICAgaWYgKHJldCAhPSBOdW1iZXJ6OjpUV08pCi0gICAgCWZhaWxDb3VudCsrOworICAgIGNvdXQgPDwgIiA9ICIgPDwgcmV0IDw8IGVuZGw7CisgICAgaWYgKHJldCAhPSBOdW1iZXJ6OjpUV08pIHsKKyAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsOworICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX1NUUlVDVFM7CisgICAgfQogCi0gICAgcHJpbnRmKCJ0ZXN0RW51bShUSFJFRSkiKTsKKyAgICBjb3V0IDw8ICJ0ZXN0RW51bShUSFJFRSkiIDw8IGZsdXNoOwogICAgIHJldCA9IHRlc3RDbGllbnQudGVzdEVudW0oTnVtYmVyejo6VEhSRUUpOwotICAgIHByaW50ZigiID0gJWRcbiIsIHJldCk7Ci0gICAgaWYgKHJldCAhPSBOdW1iZXJ6OjpUSFJFRSkKLSAgICAJZmFpbENvdW50Kys7CisgICAgY291dCA8PCAiID0gIiA8PCByZXQgPDwgZW5kbDsKKyAgICBpZiAocmV0ICE9IE51bWJlcno6OlRIUkVFKSB7CisgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbDsKKyAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9TVFJVQ1RTOworICAgIH0KIAotICAgIHByaW50ZigidGVzdEVudW0oRklWRSkiKTsKKyAgICBjb3V0IDw8ICJ0ZXN0RW51bShGSVZFKSIgPDwgZmx1c2g7CiAgICAgcmV0ID0gdGVzdENsaWVudC50ZXN0RW51bShOdW1iZXJ6OjpGSVZFKTsKLSAgICBwcmludGYoIiA9ICVkXG4iLCByZXQpOwotICAgIGlmIChyZXQgIT0gTnVtYmVyejo6RklWRSkKLSAgICAJZmFpbENvdW50Kys7CisgICAgY291dCA8PCAiID0gIiA8PCByZXQgPDwgZW5kbDsKKyAgICBpZiAocmV0ICE9IE51bWJlcno6OkZJVkUpIHsKKyAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsOworICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX1NUUlVDVFM7CisgICAgfQogCi0gICAgcHJpbnRmKCJ0ZXN0RW51bShFSUdIVCkiKTsKKyAgICBjb3V0IDw8ICJ0ZXN0RW51bShFSUdIVCkiIDw8IGZsdXNoOwogICAgIHJldCA9IHRlc3RDbGllbnQudGVzdEVudW0oTnVtYmVyejo6RUlHSFQpOwotICAgIHByaW50ZigiID0gJWRcbiIsIHJldCk7Ci0gICAgaWYgKHJldCAhPSBOdW1iZXJ6OjpFSUdIVCkKLSAgICAJZmFpbENvdW50Kys7CisgICAgY291dCA8PCAiID0gIiA8PCByZXQgPDwgZW5kbDsKKyAgICBpZiAocmV0ICE9IE51bWJlcno6OkVJR0hUKSB7CisgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbDsKKyAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9TVFJVQ1RTOworICAgIH0KIAogICAgIC8qKgogICAgICAqIFRZUEVERUYgVEVTVAogICAgICAqLwotICAgIHByaW50ZigidGVzdFR5cGVkZWYoMzA5ODU4MjM1MDgyNTIzKSIpOworICAgIGNvdXQgPDwgInRlc3RUeXBlZGVmKDMwOTg1ODIzNTA4MjUyMykiIDw8IGZsdXNoOwogICAgIFVzZXJJZCB1aWQgPSB0ZXN0Q2xpZW50LnRlc3RUeXBlZGVmKDMwOTg1ODIzNTA4MjUyM0xMKTsKLSAgICBwcmludGYoIiA9ICUiIFBSSWQ2NCAiXG4iLCB1aWQpOwotICAgIGlmICh1aWQgIT0gMzA5ODU4MjM1MDgyNTIzTEwpCi0gICAgCWZhaWxDb3VudCsrOworICAgIGNvdXQgPDwgIiA9ICIgPDwgdWlkIDw8IGVuZGw7CisgICAgaWYgKHVpZCAhPSAzMDk4NTgyMzUwODI1MjNMTCkgeworICAgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGw7CisgICAgICByZXR1cm5fY29kZSB8PSBFUlJfU1RSVUNUUzsKKyAgICB9CiAKICAgICAvKioKICAgICAgKiBORVNURUQgTUFQIFRFU1QKICAgICAgKi8KLSAgICBwcmludGYoInRlc3RNYXBNYXAoMSkiKTsKKyAgICBjb3V0IDw8ICJ0ZXN0TWFwTWFwKDEpIiA8PCBmbHVzaDsKICAgICBtYXA8aW50MzJfdCwgbWFwPGludDMyX3QsIGludDMyX3Q+ID4gbW07CiAgICAgdGVzdENsaWVudC50ZXN0TWFwTWFwKG1tLCAxKTsKLSAgICBwcmludGYoIiA9IHsiKTsKKyAgICBjb3V0IDw8ICIgPSB7IjsKICAgICBtYXA8aW50MzJfdCwgbWFwPGludDMyX3QsIGludDMyX3Q+ID46OmNvbnN0X2l0ZXJhdG9yIG1pOwogICAgIGZvciAobWkgPSBtbS5iZWdpbigpOyBtaSAhPSBtbS5lbmQoKTsgKyttaSkgewogICAgICAgcHJpbnRmKCIlZCA9PiB7IiwgbWktPmZpcnN0KTsKICAgICAgIG1hcDxpbnQzMl90LCBpbnQzMl90Pjo6Y29uc3RfaXRlcmF0b3IgbWkyOwogICAgICAgZm9yIChtaTIgPSBtaS0+c2Vjb25kLmJlZ2luKCk7IG1pMiAhPSBtaS0+c2Vjb25kLmVuZCgpOyArK21pMikgewotICAgICAgICBwcmludGYoIiVkID0+ICVkLCAiLCBtaTItPmZpcnN0LCBtaTItPnNlY29uZCk7CisgICAgICAgIGNvdXQgPDwgbWkyLT5maXJzdCA8PCAiID0+ICIgPDwgbWkyLT5zZWNvbmQ7CiAgICAgICB9Ci0gICAgICBwcmludGYoIn0sICIpOworICAgICAgY291dCA8PCAifSwgIjsKICAgICB9Ci0gICAgcHJpbnRmKCJ9XG4iKTsKKyAgICBjb3V0IDw8ICJ9IiA8PCBlbmRsOworICAgIGlmIChtbS5zaXplKCkgIT0gMiB8fAorICAgICAgICBtbVstNF1bLTRdICE9IC00IHx8CisgICAgICAgIG1tWy00XVstM10gIT0gLTMgfHwKKyAgICAgICAgbW1bLTRdWy0yXSAhPSAtMiB8fAorICAgICAgICBtbVstNF1bLTFdICE9IC0xIHx8CisgICAgICAgIG1tWzRdWzRdICE9IDQgfHwKKyAgICAgICAgbW1bNF1bM10gIT0gMyB8fAorICAgICAgICBtbVs0XVsyXSAhPSAyIHx8CisgICAgICAgIG1tWzRdWzFdICE9IDEpIHsKKyAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsOworICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX0NPTlRBSU5FUlM7CisgICAgfQogCiAgICAgLyoqCiAgICAgICogSU5TQU5JVFkgVEVTVAogICAgICAqLwogICAgIGlmICghbm9pbnNhbmUpIHsKICAgICAgIEluc2FuaXR5IGluc2FuZTsKLSAgICAgIGluc2FuZS51c2VyTWFwLmluc2VydChtYWtlX3BhaXIoTnVtYmVyejo6RklWRSwgNTAwMCkpOworICAgICAgaW5zYW5lLnVzZXJNYXAuaW5zZXJ0KG1ha2VfcGFpcihOdW1iZXJ6OjpGSVZFLCA1KSk7CisgICAgICBpbnNhbmUudXNlck1hcC5pbnNlcnQobWFrZV9wYWlyKE51bWJlcno6OkVJR0hULCA4KSk7CiAgICAgICBYdHJ1Y3QgdHJ1Y2s7Ci0gICAgICB0cnVjay5zdHJpbmdfdGhpbmcgPSAiVHJ1Y2siOwotICAgICAgdHJ1Y2suYnl0ZV90aGluZyA9IDg7Ci0gICAgICB0cnVjay5pMzJfdGhpbmcgPSA4OwotICAgICAgdHJ1Y2suaTY0X3RoaW5nID0gODsKKyAgICAgIHRydWNrLnN0cmluZ190aGluZyA9ICJHb29kYnllNCI7CisgICAgICB0cnVjay5ieXRlX3RoaW5nID0gNDsKKyAgICAgIHRydWNrLmkzMl90aGluZyA9IDQ7CisgICAgICB0cnVjay5pNjRfdGhpbmcgPSA0OworICAgICAgWHRydWN0IHRydWNrMjsKKyAgICAgIHRydWNrMi5zdHJpbmdfdGhpbmcgPSAiSGVsbG8yIjsKKyAgICAgIHRydWNrMi5ieXRlX3RoaW5nID0gMjsKKyAgICAgIHRydWNrMi5pMzJfdGhpbmcgPSAyOworICAgICAgdHJ1Y2syLmk2NF90aGluZyA9IDI7CiAgICAgICBpbnNhbmUueHRydWN0cy5wdXNoX2JhY2sodHJ1Y2spOwotICAgICAgcHJpbnRmKCJ0ZXN0SW5zYW5pdHkoKSIpOwotICAgICAgbWFwPFVzZXJJZCwgbWFwPE51bWJlcno6OnR5cGUsSW5zYW5pdHk+ID4gd2hvYTsKKyAgICAgIGluc2FuZS54dHJ1Y3RzLnB1c2hfYmFjayh0cnVjazIpOworICAgICAgY291dCA8PCAidGVzdEluc2FuaXR5KCkiIDw8IGZsdXNoOworICAgICAgbWFwPFVzZXJJZCwgbWFwPE51bWJlcno6OnR5cGUsIEluc2FuaXR5PiA+IHdob2E7CiAgICAgICB0ZXN0Q2xpZW50LnRlc3RJbnNhbml0eSh3aG9hLCBpbnNhbmUpOwotICAgICAgcHJpbnRmKCIgPSB7Iik7Ci0gICAgICBtYXA8VXNlcklkLCBtYXA8TnVtYmVyejo6dHlwZSxJbnNhbml0eT4gPjo6Y29uc3RfaXRlcmF0b3IgaV9pdGVyOworICAgICAgY291dCA8PCAiID0geyI7CisgICAgICBtYXA8VXNlcklkLCBtYXA8TnVtYmVyejo6dHlwZSwgSW5zYW5pdHk+ID46OmNvbnN0X2l0ZXJhdG9yIGlfaXRlcjsKICAgICAgIGZvciAoaV9pdGVyID0gd2hvYS5iZWdpbigpOyBpX2l0ZXIgIT0gd2hvYS5lbmQoKTsgKytpX2l0ZXIpIHsKICAgICAgICAgcHJpbnRmKCIlIiBQUklkNjQgIiA9PiB7IiwgaV9pdGVyLT5maXJzdCk7Ci0gICAgICAgIG1hcDxOdW1iZXJ6Ojp0eXBlLEluc2FuaXR5Pjo6Y29uc3RfaXRlcmF0b3IgaTJfaXRlcjsKLSAgICAgICAgZm9yIChpMl9pdGVyID0gaV9pdGVyLT5zZWNvbmQuYmVnaW4oKTsKLSAgICAgICAgICAgICBpMl9pdGVyICE9IGlfaXRlci0+c2Vjb25kLmVuZCgpOwotICAgICAgICAgICAgICsraTJfaXRlcikgeworICAgICAgICBtYXA8TnVtYmVyejo6dHlwZSwgSW5zYW5pdHk+Ojpjb25zdF9pdGVyYXRvciBpMl9pdGVyOworICAgICAgICBmb3IgKGkyX2l0ZXIgPSBpX2l0ZXItPnNlY29uZC5iZWdpbigpOyBpMl9pdGVyICE9IGlfaXRlci0+c2Vjb25kLmVuZCgpOyArK2kyX2l0ZXIpIHsKICAgICAgICAgICBwcmludGYoIiVkID0+IHsiLCBpMl9pdGVyLT5maXJzdCk7CiAgICAgICAgICAgbWFwPE51bWJlcno6OnR5cGUsIFVzZXJJZD4gdXNlck1hcCA9IGkyX2l0ZXItPnNlY29uZC51c2VyTWFwOwogICAgICAgICAgIG1hcDxOdW1iZXJ6Ojp0eXBlLCBVc2VySWQ+Ojpjb25zdF9pdGVyYXRvciB1bTsKLSAgICAgICAgICBwcmludGYoInsiKTsKKyAgICAgICAgICBjb3V0IDw8ICJ7IjsKICAgICAgICAgICBmb3IgKHVtID0gdXNlck1hcC5iZWdpbigpOyB1bSAhPSB1c2VyTWFwLmVuZCgpOyArK3VtKSB7Ci0gICAgICAgICAgICBwcmludGYoIiVkID0+ICUiIFBSSWQ2NCAiLCAiLCB1bS0+Zmlyc3QsIHVtLT5zZWNvbmQpOworICAgICAgICAgICAgY291dCA8PCB1bS0+Zmlyc3QgPDwgIiA9PiAiIDw8IHVtLT5zZWNvbmQ7CiAgICAgICAgICAgfQotICAgICAgICAgIHByaW50ZigifSwgIik7CisgICAgICAgICAgY291dCA8PCAifSwgIjsKIAogICAgICAgICAgIHZlY3RvcjxYdHJ1Y3Q+IHh0cnVjdHMgPSBpMl9pdGVyLT5zZWNvbmQueHRydWN0czsKICAgICAgICAgICB2ZWN0b3I8WHRydWN0Pjo6Y29uc3RfaXRlcmF0b3IgeDsKLSAgICAgICAgICBwcmludGYoInsiKTsKKyAgICAgICAgICBjb3V0IDw8ICJ7IjsKICAgICAgICAgICBmb3IgKHggPSB4dHJ1Y3RzLmJlZ2luKCk7IHggIT0geHRydWN0cy5lbmQoKTsgKyt4KSB7CiAgICAgICAgICAgICBwcmludGYoIntcIiVzXCIsICVkLCAlZCwgJSIgUFJJZDY0ICJ9LCAiLAogICAgICAgICAgICAgICAgICAgIHgtPnN0cmluZ190aGluZy5jX3N0cigpLApAQCAtNTY5LDkwICs5MjcsMTQ3IEBACiAgICAgICAgICAgICAgICAgICAgeC0+aTMyX3RoaW5nLAogICAgICAgICAgICAgICAgICAgIHgtPmk2NF90aGluZyk7CiAgICAgICAgICAgfQotICAgICAgICAgIHByaW50ZigifSIpOworICAgICAgICAgIGNvdXQgPDwgIn0iOwogCi0gICAgICAgICAgcHJpbnRmKCJ9LCAiKTsKKyAgICAgICAgICBjb3V0IDw8ICJ9LCAiOwogICAgICAgICB9Ci0gICAgICAgIHByaW50ZigifSwgIik7CisgICAgICAgIGNvdXQgPDwgIn0sICI7CiAgICAgICB9Ci0gICAgICBwcmludGYoIn1cbiIpOworICAgICAgY291dCA8PCAifSIgPDwgZW5kbDsKKyAgICAgIGJvb2wgZmFpbGVkID0gZmFsc2U7CisgICAgICBtYXA8VXNlcklkLCBtYXA8TnVtYmVyejo6dHlwZSwgSW5zYW5pdHk+ID46OmNvbnN0X2l0ZXJhdG9yIGl0MSA9IHdob2EuZmluZChVc2VySWQoMSkpOworICAgICAgaWYgKHdob2Euc2l6ZSgpICE9IDIpIHsKKyAgICAgICAgZmFpbGVkID0gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIGlmIChpdDEgPT0gd2hvYS5lbmQoKSkgeworICAgICAgICBmYWlsZWQgPSB0cnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbWFwPE51bWJlcno6OnR5cGUsIEluc2FuaXR5Pjo6Y29uc3RfaXRlcmF0b3IgaXQxMiA9IGl0MS0+c2Vjb25kLmZpbmQoTnVtYmVyejo6VFdPKTsKKyAgICAgICAgaWYgKGl0MTIgPT0gaXQxLT5zZWNvbmQuZW5kKCkgfHwgaXQxMi0+c2Vjb25kICE9IGluc2FuZSkgeworICAgICAgICAgIGZhaWxlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgbWFwPE51bWJlcno6OnR5cGUsIEluc2FuaXR5Pjo6Y29uc3RfaXRlcmF0b3IgaXQxMyA9IGl0MS0+c2Vjb25kLmZpbmQoTnVtYmVyejo6VEhSRUUpOworICAgICAgICBpZiAoaXQxMyA9PSBpdDEtPnNlY29uZC5lbmQoKSB8fCBpdDEzLT5zZWNvbmQgIT0gaW5zYW5lKSB7CisgICAgICAgICAgZmFpbGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgbWFwPFVzZXJJZCwgbWFwPE51bWJlcno6OnR5cGUsIEluc2FuaXR5PiA+Ojpjb25zdF9pdGVyYXRvciBpdDIgPSB3aG9hLmZpbmQoVXNlcklkKDIpKTsKKyAgICAgIGlmIChpdDIgPT0gd2hvYS5lbmQoKSkgeworICAgICAgICBmYWlsZWQgPSB0cnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbWFwPE51bWJlcno6OnR5cGUsIEluc2FuaXR5Pjo6Y29uc3RfaXRlcmF0b3IgaXQyNiA9IGl0Mi0+c2Vjb25kLmZpbmQoTnVtYmVyejo6U0lYKTsKKyAgICAgICAgaWYgKGl0MjYgPT0gaXQyLT5zZWNvbmQuZW5kKCkgfHwgaXQyNi0+c2Vjb25kICE9IEluc2FuaXR5KCkpIHsKKyAgICAgICAgICBmYWlsZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoZmFpbGVkKSB7CisgICAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsOworICAgICAgICByZXR1cm5fY29kZSB8PSBFUlJfU1RSVUNUUzsKKyAgICAgIH0KICAgICB9CisKKyAgICAvKioKKyAgICAgKiBNVUxUSSBURVNUCisgICAgICovCisgICAgY291dCA8PCAidGVzdE11bHRpKCkiIDw8IGVuZGw7CisgICAgdHJ5IHsKKyAgICAgIG1hcDxpbnQxNl90LCBzdHJpbmc+IG11bF9tYXA7CisgICAgICBYdHJ1Y3QgbXVsX3Jlc3VsdDsKKyAgICAgIG11bF9tYXBbMV0gPSAiYmxhaCI7CisgICAgICBtdWxfbWFwWzJdID0gInRoaW5nIjsKKyAgICAgIHRlc3RDbGllbnQudGVzdE11bHRpKG11bF9yZXN1bHQsIDQyLCA0MjQyLCA0MjQyNDIsIG11bF9tYXAsIE51bWJlcno6OkVJR0hULCBVc2VySWQoMjQpKTsKKyAgICAgIFh0cnVjdCB4eHM7CisgICAgICB4eHMuc3RyaW5nX3RoaW5nID0gIkhlbGxvMiI7CisgICAgICB4eHMuYnl0ZV90aGluZyA9IDQyOworICAgICAgeHhzLmkzMl90aGluZyA9IDQyNDI7CisgICAgICB4eHMuaTY0X3RoaW5nID0gNDI0MjQyOworICAgICAgaWYgKG11bF9yZXN1bHQgIT0geHhzKSB7CisgICAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsOworICAgICAgICByZXR1cm5fY29kZSB8PSBFUlJfU1RSVUNUUzsKKyAgICAgIH0KKyAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJikgeworICAgICAgdGhyb3c7CisgICAgfSBjYXRjaCAoZXhjZXB0aW9uJiBleCkgeworICAgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGwgPDwgZXgud2hhdCgpIDw8IGVuZGw7CisgICAgICByZXR1cm5fY29kZSB8PSBFUlJfU1RSVUNUUzsKKyAgICB9CisKICAgICAvKiB0ZXN0IGV4Y2VwdGlvbiAqLwogCiAgICAgdHJ5IHsKLSAgICAgIHByaW50ZigidGVzdENsaWVudC50ZXN0RXhjZXB0aW9uKFwiWGNlcHRpb25cIikgPT4iKTsKKyAgICAgIGNvdXQgPDwgInRlc3RDbGllbnQudGVzdEV4Y2VwdGlvbihcIlhjZXB0aW9uXCIpID0+IiA8PCBmbHVzaDsKICAgICAgIHRlc3RDbGllbnQudGVzdEV4Y2VwdGlvbigiWGNlcHRpb24iKTsKLSAgICAgIHByaW50ZigiICB2b2lkXG5GQUlMVVJFXG4iKTsKLSAgICAgIGZhaWxDb3VudCsrOworICAgICAgY291dCA8PCAiICB2b2lkXG4qKiogRkFJTEVEICoqKiIgPDwgZW5kbDsKKyAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9FWENFUFRJT05TOwogCi0gICAgfSBjYXRjaChYY2VwdGlvbiYgZSkgeworICAgIH0gY2F0Y2ggKFhjZXB0aW9uJiBlKSB7CiAgICAgICBwcmludGYoIiAgeyV1LCBcIiVzXCJ9XG4iLCBlLmVycm9yQ29kZSwgZS5tZXNzYWdlLmNfc3RyKCkpOwogICAgIH0KIAogICAgIHRyeSB7Ci0gICAgICAgIHByaW50ZigidGVzdENsaWVudC50ZXN0RXhjZXB0aW9uKFwiVEV4Y2VwdGlvblwiKSA9PiIpOwotICAgICAgICB0ZXN0Q2xpZW50LnRlc3RFeGNlcHRpb24oIlRFeGNlcHRpb24iKTsKLSAgICAgICAgcHJpbnRmKCIgIHZvaWRcbkZBSUxVUkVcbiIpOwotICAgICAgICBmYWlsQ291bnQrKzsKKyAgICAgIGNvdXQgPDwgInRlc3RDbGllbnQudGVzdEV4Y2VwdGlvbihcIlRFeGNlcHRpb25cIikgPT4iIDw8IGZsdXNoOworICAgICAgdGVzdENsaWVudC50ZXN0RXhjZXB0aW9uKCJURXhjZXB0aW9uIik7CisgICAgICBjb3V0IDw8ICIgIHZvaWRcbioqKiBGQUlMRUQgKioqIiA8PCBlbmRsOworICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX0VYQ0VQVElPTlM7CiAKLSAgICAgIH0gY2F0Y2goY29uc3QgVEV4Y2VwdGlvbiYpIHsKLSAgICAgICAgcHJpbnRmKCIgIENhdWdodCBURXhjZXB0aW9uXG4iKTsKLSAgICAgIH0KKyAgICB9IGNhdGNoIChjb25zdCBURXhjZXB0aW9uJikgeworICAgICAgY291dCA8PCAiICBDYXVnaHQgVEV4Y2VwdGlvbiIgPDwgZW5kbDsKKyAgICB9CiAKICAgICB0cnkgewotICAgICAgcHJpbnRmKCJ0ZXN0Q2xpZW50LnRlc3RFeGNlcHRpb24oXCJzdWNjZXNzXCIpID0+Iik7CisgICAgICBjb3V0IDw8ICJ0ZXN0Q2xpZW50LnRlc3RFeGNlcHRpb24oXCJzdWNjZXNzXCIpID0+IiA8PCBmbHVzaDsKICAgICAgIHRlc3RDbGllbnQudGVzdEV4Y2VwdGlvbigic3VjY2VzcyIpOwotICAgICAgcHJpbnRmKCIgIHZvaWRcbiIpOwotICAgIH0gY2F0Y2goLi4uKSB7Ci0gICAgICBwcmludGYoIiAgZXhjZXB0aW9uXG5GQUlMVVJFXG4iKTsKLSAgICAgIGZhaWxDb3VudCsrOworICAgICAgY291dCA8PCAiICB2b2lkIiA8PCBlbmRsOworICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbiAmIGV4KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbCA8PCBleC53aGF0KCkgPDwgZW5kbDsKKyAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9FWENFUFRJT05TOwogICAgIH0KIAogICAgIC8qIHRlc3QgbXVsdGkgZXhjZXB0aW9uICovCiAKICAgICB0cnkgewotICAgICAgcHJpbnRmKCJ0ZXN0Q2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbihcIlhjZXB0aW9uXCIsIFwidGVzdCAxXCIpID0+Iik7CisgICAgICBjb3V0IDw8ICJ0ZXN0Q2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbihcIlhjZXB0aW9uXCIsIFwidGVzdCAxXCIpID0+IiA8PCBmbHVzaDsKICAgICAgIFh0cnVjdCByZXN1bHQ7CiAgICAgICB0ZXN0Q2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbihyZXN1bHQsICJYY2VwdGlvbiIsICJ0ZXN0IDEiKTsKLSAgICAgIHByaW50ZigiICByZXN1bHRcbkZBSUxVUkVcbiIpOwotICAgICAgZmFpbENvdW50Kys7Ci0gICAgfSBjYXRjaChYY2VwdGlvbiYgZSkgeworICAgICAgY291dCA8PCAiICByZXN1bHRcbioqKiBGQUlMRUQgKioqIiA8PCBlbmRsOworICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX0VYQ0VQVElPTlM7CisgICAgfSBjYXRjaCAoWGNlcHRpb24mIGUpIHsKICAgICAgIHByaW50ZigiICB7JXUsIFwiJXNcIn1cbiIsIGUuZXJyb3JDb2RlLCBlLm1lc3NhZ2UuY19zdHIoKSk7CiAgICAgfQogCiAgICAgdHJ5IHsKLSAgICAgIHByaW50ZigidGVzdENsaWVudC50ZXN0TXVsdGlFeGNlcHRpb24oXCJYY2VwdGlvbjJcIiwgXCJ0ZXN0IDJcIikgPT4iKTsKKyAgICAgIGNvdXQgPDwgInRlc3RDbGllbnQudGVzdE11bHRpRXhjZXB0aW9uKFwiWGNlcHRpb24yXCIsIFwidGVzdCAyXCIpID0+IiA8PCBmbHVzaDsKICAgICAgIFh0cnVjdCByZXN1bHQ7CiAgICAgICB0ZXN0Q2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbihyZXN1bHQsICJYY2VwdGlvbjIiLCAidGVzdCAyIik7Ci0gICAgICBwcmludGYoIiAgcmVzdWx0XG5GQUlMVVJFXG4iKTsKLSAgICAgIGZhaWxDb3VudCsrOworICAgICAgY291dCA8PCAiICByZXN1bHRcbioqKiBGQUlMRUQgKioqIiA8PCBlbmRsOworICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX0VYQ0VQVElPTlM7CiAKLSAgICB9IGNhdGNoKFhjZXB0aW9uMiYgZSkgeworICAgIH0gY2F0Y2ggKFhjZXB0aW9uMiYgZSkgewogICAgICAgcHJpbnRmKCIgIHsldSwge1wiJXNcIn19XG4iLCBlLmVycm9yQ29kZSwgZS5zdHJ1Y3RfdGhpbmcuc3RyaW5nX3RoaW5nLmNfc3RyKCkpOwogICAgIH0KIAogICAgIHRyeSB7Ci0gICAgICBwcmludGYoInRlc3RDbGllbnQudGVzdE11bHRpRXhjZXB0aW9uKFwic3VjY2Vzc1wiLCBcInRlc3QgM1wiKSA9PiIpOworICAgICAgY291dCA8PCAidGVzdENsaWVudC50ZXN0TXVsdGlFeGNlcHRpb24oXCJzdWNjZXNzXCIsIFwidGVzdCAzXCIpID0+IiA8PCBmbHVzaDsKICAgICAgIFh0cnVjdCByZXN1bHQ7CiAgICAgICB0ZXN0Q2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbihyZXN1bHQsICJzdWNjZXNzIiwgInRlc3QgMyIpOwogICAgICAgcHJpbnRmKCIgIHt7XCIlc1wifX1cbiIsIHJlc3VsdC5zdHJpbmdfdGhpbmcuY19zdHIoKSk7Ci0gICAgfSBjYXRjaCguLi4pIHsKLSAgICAgIHByaW50ZigiICBleGNlcHRpb25cbkZBSUxVUkVcbiIpOwotICAgICAgZmFpbENvdW50Kys7CisgICAgfSBjYXRjaCAoZXhjZXB0aW9uICYgZXgpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsIDw8IGV4LndoYXQoKSA8PCBlbmRsOworICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX0VYQ0VQVElPTlM7CiAgICAgfQogCiAgICAgLyogdGVzdCBvbmV3YXkgdm9pZCAqLwogICAgIHsKLSAgICAgICAgcHJpbnRmKCJ0ZXN0Q2xpZW50LnRlc3RPbmV3YXkoMSkgPT4iKTsKLSAgICAgICAgdWludDY0X3Qgc3RhcnRPbmV3YXkgPSBub3coKTsKLSAgICAgICAgdGVzdENsaWVudC50ZXN0T25ld2F5KDEpOwotICAgICAgICB1aW50NjRfdCBlbGFwc2VkID0gbm93KCkgLSBzdGFydE9uZXdheTsKLSAgICAgICAgaWYgKGVsYXBzZWQgPiAyMDAgKiAxMDAwKSB7IC8vIDAuMiBzZWNvbmRzCi0gICAgICAgICAgICBwcmludGYoIiAgRkFJTFVSRSAtIHRvb2sgJS4yZiBtc1xuIiwgKGRvdWJsZSllbGFwc2VkLzEwMDAuMCk7Ci0gICAgICAgICAgICBmYWlsQ291bnQrKzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHByaW50ZigiICBzdWNjZXNzIC0gdG9vayAlLjJmIG1zXG4iLCAoZG91YmxlKWVsYXBzZWQvMTAwMC4wKTsKLSAgICAgICAgfQorICAgICAgY291dCA8PCAidGVzdENsaWVudC50ZXN0T25ld2F5KDEpID0+IiA8PCBmbHVzaDsKKyAgICAgIHVpbnQ2NF90IHN0YXJ0T25ld2F5ID0gbm93KCk7CisgICAgICB0ZXN0Q2xpZW50LnRlc3RPbmV3YXkoMSk7CisgICAgICB1aW50NjRfdCBlbGFwc2VkID0gbm93KCkgLSBzdGFydE9uZXdheTsKKyAgICAgIGlmIChlbGFwc2VkID4gMjAwICogMTAwMCkgeyAvLyAwLjIgc2Vjb25kcworICAgICAgICBwcmludGYoIioqKiBGQUlMRUQgKioqIC0gdG9vayAlLjJmIG1zXG4iLCAoZG91YmxlKWVsYXBzZWQgLyAxMDAwLjApOworICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX0JBU0VUWVBFUzsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigiICBzdWNjZXNzIC0gdG9vayAlLjJmIG1zXG4iLCAoZG91YmxlKWVsYXBzZWQgLyAxMDAwLjApOworICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtNjY2LDE3ICsxMDgxLDE4IEBACiAgICAgLyoqCiAgICAgICogSTMyIFRFU1QKICAgICAgKi8KLSAgICBwcmludGYoInJlLXRlc3QgdGVzdEkzMigtMSkiKTsKLSAgICBpMzIgPSB0ZXN0Q2xpZW50LnRlc3RJMzIoLTEpOwotICAgIHByaW50ZigiID0gJWRcbiIsIGkzMik7CisgICAgY291dCA8PCAicmUtdGVzdCB0ZXN0STMyKC0xKSIgPDwgZmx1c2g7CisgICAgaW50IGkzMiA9IHRlc3RDbGllbnQudGVzdEkzMigtMSk7CisgICAgY291dCA8PCAiID0gIiA8PCBpMzIgPDwgZW5kbDsKICAgICBpZiAoaTMyICE9IC0xKQotICAgICAgICBmYWlsQ291bnQrKzsKKyAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9CQVNFVFlQRVM7CiAKKyAgICBjb3V0IDw8IGVuZGwgPDwgIkFsbCB0ZXN0cyBkb25lLiIgPDwgZW5kbCA8PCBmbHVzaDsKIAogICAgIHVpbnQ2NF90IHN0b3AgPSBub3coKTsKLSAgICB1aW50NjRfdCB0b3QgPSBzdG9wLXN0YXJ0OworICAgIHVpbnQ2NF90IHRvdCA9IHN0b3AgLSBzdGFydDsKIAotICAgIHByaW50ZigiVG90YWwgdGltZTogJSIgUFJJdTY0ICIgdXNcbiIsIHN0b3Atc3RhcnQpOworICAgIGNvdXQgPDwgIlRvdGFsIHRpbWU6ICIgPDwgc3RvcCAtIHN0YXJ0IDw8ICIgdXMiIDw8IGVuZGw7CiAKICAgICB0aW1lX3RvdCArPSB0b3Q7CiAgICAgaWYgKHRpbWVfbWluID09IDAgfHwgdG90IDwgdGltZV9taW4pIHsKQEAgLTY4NiwxNyArMTEwMiw3OSBAQAogICAgICAgdGltZV9tYXggPSB0b3Q7CiAgICAgfQogCisgICAgY291dCA8PCBmbHVzaDsKICAgICB0cmFuc3BvcnQtPmNsb3NlKCk7CiAgIH0KIAotICAvLyAgcHJpbnRmKCJcblNvY2tldCBzeXNjYWxsczogJXUiLCBnX3NvY2tldF9zeXNjYWxscyk7Ci0gIHByaW50ZigiXG5BbGwgdGVzdHMgZG9uZS5cbiIpOwogCiAgIHVpbnQ2NF90IHRpbWVfYXZnID0gdGltZV90b3QgLyBudW1UZXN0czsKIAotICBwcmludGYoIk1pbiB0aW1lOiAlIiBQUkl1NjQgIiB1c1xuIiwgdGltZV9taW4pOwotICBwcmludGYoIk1heCB0aW1lOiAlIiBQUkl1NjQgIiB1c1xuIiwgdGltZV9tYXgpOwotICBwcmludGYoIkF2ZyB0aW1lOiAlIiBQUkl1NjQgIiB1c1xuIiwgdGltZV9hdmcpOworICBjb3V0IDw8ICJNaW4gdGltZTogIiA8PCB0aW1lX21pbiA8PCAiIHVzIiA8PCBlbmRsOworICBjb3V0IDw8ICJNYXggdGltZTogIiA8PCB0aW1lX21heCA8PCAiIHVzIiA8PCBlbmRsOworICBjb3V0IDw8ICJBdmcgdGltZTogIiA8PCB0aW1lX2F2ZyA8PCAiIHVzIiA8PCBlbmRsOwogCi0gIHJldHVybiBmYWlsQ291bnQ7CisgIHJldHVybiByZXR1cm5fY29kZTsKK30KKwordm9pZCBiaW5hcnlfZmlsbChzdGQ6OnN0cmluZyYgc3RyLCBzdHJpbmc6OnNpemVfdHlwZSBzaXopCit7CisgICAgc3RhdGljIGNvbnN0IHNpZ25lZCBjaGFyIGJpbl9kYXRhWzI1Nl0KKyAgICAgICAgPSB7LTEyOCwgLTEyNywgLTEyNiwgLTEyNSwgLTEyNCwgLTEyMywgLTEyMiwgLTEyMSwgLTEyMCwgLTExOSwgLTExOCwgLTExNywgLTExNiwgLTExNSwgLTExNCwKKyAgICAgICAgICAgLTExMywgLTExMiwgLTExMSwgLTExMCwgLTEwOSwgLTEwOCwgLTEwNywgLTEwNiwgLTEwNSwgLTEwNCwgLTEwMywgLTEwMiwgLTEwMSwgLTEwMCwgLTk5LAorICAgICAgICAgICAtOTgsICAtOTcsICAtOTYsICAtOTUsICAtOTQsICAtOTMsICAtOTIsICAtOTEsICAtOTAsICAtODksICAtODgsICAtODcsICAtODYsICAtODUsICAtODQsCisgICAgICAgICAgIC04MywgIC04MiwgIC04MSwgIC04MCwgIC03OSwgIC03OCwgIC03NywgIC03NiwgIC03NSwgIC03NCwgIC03MywgIC03MiwgIC03MSwgIC03MCwgIC02OSwKKyAgICAgICAgICAgLTY4LCAgLTY3LCAgLTY2LCAgLTY1LCAgLTY0LCAgLTYzLCAgLTYyLCAgLTYxLCAgLTYwLCAgLTU5LCAgLTU4LCAgLTU3LCAgLTU2LCAgLTU1LCAgLTU0LAorICAgICAgICAgICAtNTMsICAtNTIsICAtNTEsICAtNTAsICAtNDksICAtNDgsICAtNDcsICAtNDYsICAtNDUsICAtNDQsICAtNDMsICAtNDIsICAtNDEsICAtNDAsICAtMzksCisgICAgICAgICAgIC0zOCwgIC0zNywgIC0zNiwgIC0zNSwgIC0zNCwgIC0zMywgIC0zMiwgIC0zMSwgIC0zMCwgIC0yOSwgIC0yOCwgIC0yNywgIC0yNiwgIC0yNSwgIC0yNCwKKyAgICAgICAgICAgLTIzLCAgLTIyLCAgLTIxLCAgLTIwLCAgLTE5LCAgLTE4LCAgLTE3LCAgLTE2LCAgLTE1LCAgLTE0LCAgLTEzLCAgLTEyLCAgLTExLCAgLTEwLCAgLTksCisgICAgICAgICAgIC04LCAgIC03LCAgIC02LCAgIC01LCAgIC00LCAgIC0zLCAgIC0yLCAgIC0xLCAgIDAsICAgIDEsICAgIDIsICAgIDMsICAgIDQsICAgIDUsICAgIDYsCisgICAgICAgICAgIDcsICAgIDgsICAgIDksICAgIDEwLCAgIDExLCAgIDEyLCAgIDEzLCAgIDE0LCAgIDE1LCAgIDE2LCAgIDE3LCAgIDE4LCAgIDE5LCAgIDIwLCAgIDIxLAorICAgICAgICAgICAyMiwgICAyMywgICAyNCwgICAyNSwgICAyNiwgICAyNywgICAyOCwgICAyOSwgICAzMCwgICAzMSwgICAzMiwgICAzMywgICAzNCwgICAzNSwgICAzNiwKKyAgICAgICAgICAgMzcsICAgMzgsICAgMzksICAgNDAsICAgNDEsICAgNDIsICAgNDMsICAgNDQsICAgNDUsICAgNDYsICAgNDcsICAgNDgsICAgNDksICAgNTAsICAgNTEsCisgICAgICAgICAgIDUyLCAgIDUzLCAgIDU0LCAgIDU1LCAgIDU2LCAgIDU3LCAgIDU4LCAgIDU5LCAgIDYwLCAgIDYxLCAgIDYyLCAgIDYzLCAgIDY0LCAgIDY1LCAgIDY2LAorICAgICAgICAgICA2NywgICA2OCwgICA2OSwgICA3MCwgICA3MSwgICA3MiwgICA3MywgICA3NCwgICA3NSwgICA3NiwgICA3NywgICA3OCwgICA3OSwgICA4MCwgICA4MSwKKyAgICAgICAgICAgODIsICAgODMsICAgODQsICAgODUsICAgODYsICAgODcsICAgODgsICAgODksICAgOTAsICAgOTEsICAgOTIsICAgOTMsICAgOTQsICAgOTUsICAgOTYsCisgICAgICAgICAgIDk3LCAgIDk4LCAgIDk5LCAgIDEwMCwgIDEwMSwgIDEwMiwgIDEwMywgIDEwNCwgIDEwNSwgIDEwNiwgIDEwNywgIDEwOCwgIDEwOSwgIDExMCwgIDExMSwKKyAgICAgICAgICAgMTEyLCAgMTEzLCAgMTE0LCAgMTE1LCAgMTE2LCAgMTE3LCAgMTE4LCAgMTE5LCAgMTIwLCAgMTIxLCAgMTIyLCAgMTIzLCAgMTI0LCAgMTI1LCAgMTI2LAorICAgICAgICAgICAxMjd9OworCisgICAgc3RyLnJlc2l6ZShzaXopOworICAgIGNoYXIgKnB0ciA9ICZzdHJbMF07CisgICAgc3RyaW5nOjpzaXplX3R5cGUgcG9zID0gMDsKKyAgICBmb3IgKHN0cmluZzo6c2l6ZV90eXBlIGkgPSAwOyBpIDwgc2l6OyArK2kpCisgICAgeworICAgICAgICBpZiAocG9zID09IDI1NSkgeyBwb3MgPSAwOyB9IGVsc2UgeyArK3BvczsgfQorICAgICAgICAqcHRyKysgPSBiaW5fZGF0YVtwb3NdOworICAgIH0KK30KKworaW50IGJpbmFyeV90ZXN0KFRocmlmdFRlc3RDbGllbnQmIHRlc3RDbGllbnQsIHN0cmluZzo6c2l6ZV90eXBlIHNpeikKK3sKKyAgICBzdHJpbmcgYmluX3JlcXVlc3Q7CisgICAgc3RyaW5nIGJpbl9yZXN1bHQ7CisKKyAgICBjb3V0IDw8ICJ0ZXN0QmluYXJ5KHNpeiA9ICIgPDwgc2l6IDw8ICIpIiA8PCBlbmRsOworICAgIGJpbmFyeV9maWxsKGJpbl9yZXF1ZXN0LCBzaXopOworICAgIHRyeSB7CisgICAgICAgIHRlc3RDbGllbnQudGVzdEJpbmFyeShiaW5fcmVzdWx0LCBiaW5fcmVxdWVzdCk7CisKKyAgICAgICAgaWYgKGJpbl9yZXF1ZXN0LnNpemUoKSAhPSBiaW5fcmVzdWx0LnNpemUoKSkgeworICAgICAgICAgICAgY291dCA8PCAiKioqIEZBSUxFRDogcmVxdWVzdCBzaXplICIgPDwgYmluX3JlcXVlc3Quc2l6ZSgpIDw8ICI7IHJlc3VsdCBzaXplICIgPDwgYmluX3Jlc3VsdC5zaXplKCkgPDwgZW5kbDsKKyAgICAgICAgICAgIHJldHVybiBFUlJfQkFTRVRZUEVTOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChzdHJpbmc6OnNpemVfdHlwZSBpID0gMDsgaSA8IHNpejsgKytpKSB7CisgICAgICAgICAgICBpZiAoYmluX3JlcXVlc3QuYXQoaSkgIT0gYmluX3Jlc3VsdC5hdChpKSkgeworICAgICAgICAgICAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQ6IGF0IHBvc2l0aW9uICIgPDwgaSA8PCAiIHJlcXVlc3RbaV0gaXMgaCIgPDwgaGV4IDw8IGJpbl9yZXF1ZXN0LmF0KGkpIDw8ICIgcmVzdWx0W2ldIGlzIGgiIDw8IGhleCA8PCBiaW5fcmVzdWx0LmF0KGkpIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUl9CQVNFVFlQRVM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJikgeworICAgICAgICB0aHJvdzsKKyAgICB9IGNhdGNoIChleGNlcHRpb24mIGV4KSB7CisgICAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsIDw8IGV4LndoYXQoKSA8PCBlbmRsOworICAgICAgICByZXR1cm4gRVJSX0JBU0VUWVBFUzsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL3Rlc3QvY3BwL3NyYy9UZXN0U2VydmVyLmNwcCBiL3Rlc3QvY3BwL3NyYy9UZXN0U2VydmVyLmNwcApvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IGEzNDMyMjEuLjYyMjIwMTcKLS0tIGEvdGVzdC9jcHAvc3JjL1Rlc3RTZXJ2ZXIuY3BwCisrKyBiL3Rlc3QvY3BwL3NyYy9UZXN0U2VydmVyLmNwcApAQCAtMTcsNjkgKzE3LDkzIEBACiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jZGVmaW5lIF9fU1REQ19GT1JNQVRfTUFDUk9TCi0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLQotI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyLmg+Ci0jaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1BsYXRmb3JtVGhyZWFkRmFjdG9yeS5oPgotI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KLSNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5oPgotI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9USlNPTlByb3RvY29sLmg+Ci0jaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UU2ltcGxlU2VydmVyLmg+Ci0jaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UVGhyZWFkZWRTZXJ2ZXIuaD4KLSNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmg+Ci0jaW5jbHVkZSA8dGhyaWZ0L2FzeW5jL1RFdmh0dHBTZXJ2ZXIuaD4KICNpbmNsdWRlIDx0aHJpZnQvYXN5bmMvVEFzeW5jQnVmZmVyUHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L2FzeW5jL1RBc3luY1Byb3RvY29sUHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2FzeW5jL1RFdmh0dHBTZXJ2ZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvUGxhdGZvcm1UaHJlYWRGYWN0b3J5Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvY2Vzc29yL1RNdWx0aXBsZXhlZFByb2Nlc3Nvci5oPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9USGVhZGVyUHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5oPgogI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVE5vbmJsb2NraW5nU2VydmVyLmg+Ci0jaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0Lmg+Ci0jaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU1NMU2VydmVyU29ja2V0Lmg+Ci0jaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU1NMU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UU2ltcGxlU2VydmVyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5oPgorI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFRocmVhZGVkU2VydmVyLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9USHR0cFNlcnZlci5oPgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEh0dHBUcmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NTTFNlcnZlclNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU2VydmVyU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU1NMU2VydmVyU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU1NMU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0VXRpbHMuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RabGliVHJhbnNwb3J0Lmg+CisKKyNpbmNsdWRlICJTZWNvbmRTZXJ2aWNlLmgiCiAjaW5jbHVkZSAiVGhyaWZ0VGVzdC5oIgogCisjaWZkZWYgSEFWRV9TVERJTlRfSAorI2luY2x1ZGUgPHN0ZGludC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9JTlRUWVBFU19ICisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfU0lHTkFMX0gKKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNlbmRpZgorCiAjaW5jbHVkZSA8aW9zdHJlYW0+CiAjaW5jbHVkZSA8c3RkZXhjZXB0PgogI2luY2x1ZGUgPHNzdHJlYW0+CiAKKyNpbmNsdWRlIDxib29zdC9hbGdvcml0aG0vc3RyaW5nLmhwcD4KICNpbmNsdWRlIDxib29zdC9wcm9ncmFtX29wdGlvbnMuaHBwPgogI2luY2x1ZGUgPGJvb3N0L2ZpbGVzeXN0ZW0uaHBwPgotI2luY2x1ZGUgPHRocmlmdC9jeHhmdW5jdGlvbmFsLmg+CiAKLSNpbmNsdWRlIDxzaWduYWwuaD4KICNpZiBfV0lOMzIKLSAgICNpbmNsdWRlIDx0aHJpZnQvd2luZG93cy9UV2luc29ja1NpbmdsZXRvbi5oPgorI2luY2x1ZGUgPHRocmlmdC93aW5kb3dzL1RXaW5zb2NrU2luZ2xldG9uLmg+CiAjZW5kaWYKIAogdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIAogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojphc3luYzsKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k7CiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOwogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7CiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcjsKLXVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6YXN5bmM7CiAKIHVzaW5nIG5hbWVzcGFjZSB0aHJpZnQ6OnRlc3Q7CiAKLS8vIExlbmd0aCBvZiBhcmd2WzBdIC0gTGVuZ3RoIG9mIHNjcmlwdCBkaXIKLSNkZWZpbmUgRVhFQ1VUQUJMRV9GSUxFX05BTUVfTEVOR1RIIDE5CisvLyB0byBoYW5kbGUgYSBjb250cm9sbGVkIHNodXRkb3duLCBzaWduYWwgaGFuZGxpbmcgaXMgbWFuZGF0b3J5CisjaWZkZWYgSEFWRV9TSUdOQUxfSAorYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpNb25pdG9yIGdNb25pdG9yOwordm9pZCBzaWduYWxfaGFuZGxlcihpbnQgc2lnbnVtKQoreworICBpZiAoc2lnbnVtID09IFNJR0lOVCkgeworICAgIGdNb25pdG9yLm5vdGlmeUFsbCgpOworICB9Cit9CisjZW5kaWYKIAogY2xhc3MgVGVzdEhhbmRsZXIgOiBwdWJsaWMgVGhyaWZ0VGVzdElmIHsKLSBwdWJsaWM6CitwdWJsaWM6CiAgIFRlc3RIYW5kbGVyKCkge30KIAotICB2b2lkIHRlc3RWb2lkKCkgewotICAgIHByaW50ZigidGVzdFZvaWQoKVxuIik7Ci0gIH0KKyAgdm9pZCB0ZXN0Vm9pZCgpIHsgcHJpbnRmKCJ0ZXN0Vm9pZCgpXG4iKTsgfQogCi0gIHZvaWQgdGVzdFN0cmluZyhzdHJpbmcmIG91dCwgY29uc3Qgc3RyaW5nICZ0aGluZykgeworICB2b2lkIHRlc3RTdHJpbmcoc3RyaW5nJiBvdXQsIGNvbnN0IHN0cmluZyYgdGhpbmcpIHsKICAgICBwcmludGYoInRlc3RTdHJpbmcoXCIlc1wiKVxuIiwgdGhpbmcuY19zdHIoKSk7CiAgICAgb3V0ID0gdGhpbmc7CiAgIH0KIAorICBib29sIHRlc3RCb29sKGNvbnN0IGJvb2wgdGhpbmcpIHsKKyAgICBwcmludGYoInRlc3RCb29sKCVzKVxuIiwgdGhpbmcgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgICByZXR1cm4gdGhpbmc7CisgIH0KKwogICBpbnQ4X3QgdGVzdEJ5dGUoY29uc3QgaW50OF90IHRoaW5nKSB7CiAgICAgcHJpbnRmKCJ0ZXN0Qnl0ZSglZClcbiIsIChpbnQpdGhpbmcpOwogICAgIHJldHVybiB0aGluZzsKQEAgLTEwMCwxOCArMTI0LDM1IEBACiAgICAgcmV0dXJuIHRoaW5nOwogICB9CiAKLSAgdm9pZCB0ZXN0U3RydWN0KFh0cnVjdCYgb3V0LCBjb25zdCBYdHJ1Y3QgJnRoaW5nKSB7Ci0gICAgcHJpbnRmKCJ0ZXN0U3RydWN0KHtcIiVzXCIsICVkLCAlZCwgJSIgUFJJZDY0ICJ9KVxuIiwgdGhpbmcuc3RyaW5nX3RoaW5nLmNfc3RyKCksIChpbnQpdGhpbmcuYnl0ZV90aGluZywgdGhpbmcuaTMyX3RoaW5nLCB0aGluZy5pNjRfdGhpbmcpOworICB2b2lkIHRlc3RCaW5hcnkoc3RkOjpzdHJpbmcmIF9yZXR1cm4sIGNvbnN0IHN0ZDo6c3RyaW5nJiB0aGluZykgeworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBoZXhzdHI7CisgICAgaGV4c3RyIDw8IHN0ZDo6aGV4IDw8IHRoaW5nOworICAgIHByaW50ZigidGVzdEJpbmFyeSglbHU6ICVzKVxuIiwgc2FmZV9udW1lcmljX2Nhc3Q8dW5zaWduZWQgbG9uZz4odGhpbmcuc2l6ZSgpKSwgaGV4c3RyLnN0cigpLmNfc3RyKCkpOworICAgIF9yZXR1cm4gPSB0aGluZzsKKyAgfQorCisgIHZvaWQgdGVzdFN0cnVjdChYdHJ1Y3QmIG91dCwgY29uc3QgWHRydWN0JiB0aGluZykgeworICAgIHByaW50ZigidGVzdFN0cnVjdCh7XCIlc1wiLCAlZCwgJWQsICUiIFBSSWQ2NCAifSlcbiIsCisgICAgICAgICAgIHRoaW5nLnN0cmluZ190aGluZy5jX3N0cigpLAorICAgICAgICAgICAoaW50KXRoaW5nLmJ5dGVfdGhpbmcsCisgICAgICAgICAgIHRoaW5nLmkzMl90aGluZywKKyAgICAgICAgICAgdGhpbmcuaTY0X3RoaW5nKTsKICAgICBvdXQgPSB0aGluZzsKICAgfQogCiAgIHZvaWQgdGVzdE5lc3QoWHRydWN0MiYgb3V0LCBjb25zdCBYdHJ1Y3QyJiBuZXN0KSB7Ci0gICAgY29uc3QgWHRydWN0ICZ0aGluZyA9IG5lc3Quc3RydWN0X3RoaW5nOwotICAgIHByaW50ZigidGVzdE5lc3QoeyVkLCB7XCIlc1wiLCAlZCwgJWQsICUiIFBSSWQ2NCAifSwgJWR9KVxuIiwgKGludCluZXN0LmJ5dGVfdGhpbmcsIHRoaW5nLnN0cmluZ190aGluZy5jX3N0cigpLCAoaW50KXRoaW5nLmJ5dGVfdGhpbmcsIHRoaW5nLmkzMl90aGluZywgdGhpbmcuaTY0X3RoaW5nLCBuZXN0LmkzMl90aGluZyk7CisgICAgY29uc3QgWHRydWN0JiB0aGluZyA9IG5lc3Quc3RydWN0X3RoaW5nOworICAgIHByaW50ZigidGVzdE5lc3QoeyVkLCB7XCIlc1wiLCAlZCwgJWQsICUiIFBSSWQ2NCAifSwgJWR9KVxuIiwKKyAgICAgICAgICAgKGludCluZXN0LmJ5dGVfdGhpbmcsCisgICAgICAgICAgIHRoaW5nLnN0cmluZ190aGluZy5jX3N0cigpLAorICAgICAgICAgICAoaW50KXRoaW5nLmJ5dGVfdGhpbmcsCisgICAgICAgICAgIHRoaW5nLmkzMl90aGluZywKKyAgICAgICAgICAgdGhpbmcuaTY0X3RoaW5nLAorICAgICAgICAgICBuZXN0LmkzMl90aGluZyk7CiAgICAgb3V0ID0gbmVzdDsKICAgfQogCi0gIHZvaWQgdGVzdE1hcChtYXA8aW50MzJfdCwgaW50MzJfdD4gJm91dCwgY29uc3QgbWFwPGludDMyX3QsIGludDMyX3Q+ICZ0aGluZykgeworICB2b2lkIHRlc3RNYXAobWFwPGludDMyX3QsIGludDMyX3Q+JiBvdXQsIGNvbnN0IG1hcDxpbnQzMl90LCBpbnQzMl90PiYgdGhpbmcpIHsKICAgICBwcmludGYoInRlc3RNYXAoeyIpOwogICAgIG1hcDxpbnQzMl90LCBpbnQzMl90Pjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwogICAgIGJvb2wgZmlyc3QgPSB0cnVlOwpAQCAtMTI3LDcgKzE2OCw4IEBACiAgICAgb3V0ID0gdGhpbmc7CiAgIH0KIAotICB2b2lkIHRlc3RTdHJpbmdNYXAobWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gJm91dCwgY29uc3QgbWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gJnRoaW5nKSB7CisgIHZvaWQgdGVzdFN0cmluZ01hcChtYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHRoaW5nKSB7CiAgICAgcHJpbnRmKCJ0ZXN0TWFwKHsiKTsKICAgICBtYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwogICAgIGJvb2wgZmlyc3QgPSB0cnVlOwpAQCAtMTQzLDcgKzE4NSw3IEBACiAgICAgb3V0ID0gdGhpbmc7CiAgIH0KIAotICB2b2lkIHRlc3RTZXQoc2V0PGludDMyX3Q+ICZvdXQsIGNvbnN0IHNldDxpbnQzMl90PiAmdGhpbmcpIHsKKyAgdm9pZCB0ZXN0U2V0KHNldDxpbnQzMl90PiYgb3V0LCBjb25zdCBzZXQ8aW50MzJfdD4mIHRoaW5nKSB7CiAgICAgcHJpbnRmKCJ0ZXN0U2V0KHsiKTsKICAgICBzZXQ8aW50MzJfdD46OmNvbnN0X2l0ZXJhdG9yIHNfaXRlcjsKICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKQEAgLTE1OSw3ICsyMDEsNyBAQAogICAgIG91dCA9IHRoaW5nOwogICB9CiAKLSAgdm9pZCB0ZXN0TGlzdCh2ZWN0b3I8aW50MzJfdD4gJm91dCwgY29uc3QgdmVjdG9yPGludDMyX3Q+ICZ0aGluZykgeworICB2b2lkIHRlc3RMaXN0KHZlY3RvcjxpbnQzMl90PiYgb3V0LCBjb25zdCB2ZWN0b3I8aW50MzJfdD4mIHRoaW5nKSB7CiAgICAgcHJpbnRmKCJ0ZXN0TGlzdCh7Iik7CiAgICAgdmVjdG9yPGludDMyX3Q+Ojpjb25zdF9pdGVyYXRvciBsX2l0ZXI7CiAgICAgYm9vbCBmaXJzdCA9IHRydWU7CkBAIC0xODUsNTAgKzIyNywyOSBAQAogICAgIHJldHVybiB0aGluZzsKICAgfQogCi0gIHZvaWQgdGVzdE1hcE1hcChtYXA8aW50MzJfdCwgbWFwPGludDMyX3QsaW50MzJfdD4gPiAmbWFwbWFwLCBjb25zdCBpbnQzMl90IGhlbGxvKSB7CisgIHZvaWQgdGVzdE1hcE1hcChtYXA8aW50MzJfdCwgbWFwPGludDMyX3QsIGludDMyX3Q+ID4mIG1hcG1hcCwgY29uc3QgaW50MzJfdCBoZWxsbykgewogICAgIHByaW50ZigidGVzdE1hcE1hcCglZClcbiIsIGhlbGxvKTsKIAotICAgIG1hcDxpbnQzMl90LGludDMyX3Q+IHBvczsKLSAgICBtYXA8aW50MzJfdCxpbnQzMl90PiBuZWc7CisgICAgbWFwPGludDMyX3QsIGludDMyX3Q+IHBvczsKKyAgICBtYXA8aW50MzJfdCwgaW50MzJfdD4gbmVnOwogICAgIGZvciAoaW50IGkgPSAxOyBpIDwgNTsgaSsrKSB7Ci0gICAgICBwb3MuaW5zZXJ0KG1ha2VfcGFpcihpLGkpKTsKLSAgICAgIG5lZy5pbnNlcnQobWFrZV9wYWlyKC1pLC1pKSk7CisgICAgICBwb3MuaW5zZXJ0KG1ha2VfcGFpcihpLCBpKSk7CisgICAgICBuZWcuaW5zZXJ0KG1ha2VfcGFpcigtaSwgLWkpKTsKICAgICB9CiAKICAgICBtYXBtYXAuaW5zZXJ0KG1ha2VfcGFpcig0LCBwb3MpKTsKICAgICBtYXBtYXAuaW5zZXJ0KG1ha2VfcGFpcigtNCwgbmVnKSk7Ci0KICAgfQogCi0gIHZvaWQgdGVzdEluc2FuaXR5KG1hcDxVc2VySWQsIG1hcDxOdW1iZXJ6Ojp0eXBlLEluc2FuaXR5PiA+ICZpbnNhbmUsIGNvbnN0IEluc2FuaXR5ICZhcmd1bWVudCkgewotICAgICh2b2lkKSBhcmd1bWVudDsKKyAgdm9pZCB0ZXN0SW5zYW5pdHkobWFwPFVzZXJJZCwgbWFwPE51bWJlcno6OnR5cGUsIEluc2FuaXR5PiA+JiBpbnNhbmUsIGNvbnN0IEluc2FuaXR5JiBhcmd1bWVudCkgewogICAgIHByaW50ZigidGVzdEluc2FuaXR5KClcbiIpOwogCi0gICAgWHRydWN0IGhlbGxvOwotICAgIGhlbGxvLnN0cmluZ190aGluZyA9ICJIZWxsbzIiOwotICAgIGhlbGxvLmJ5dGVfdGhpbmcgPSAyOwotICAgIGhlbGxvLmkzMl90aGluZyA9IDI7Ci0gICAgaGVsbG8uaTY0X3RoaW5nID0gMjsKLQotICAgIFh0cnVjdCBnb29kYnllOwotICAgIGdvb2RieWUuc3RyaW5nX3RoaW5nID0gIkdvb2RieWU0IjsKLSAgICBnb29kYnllLmJ5dGVfdGhpbmcgPSA0OwotICAgIGdvb2RieWUuaTMyX3RoaW5nID0gNDsKLSAgICBnb29kYnllLmk2NF90aGluZyA9IDQ7Ci0KLSAgICBJbnNhbml0eSBjcmF6eTsKLSAgICBjcmF6eS51c2VyTWFwLmluc2VydChtYWtlX3BhaXIoTnVtYmVyejo6RUlHSFQsIDgpKTsKLSAgICBjcmF6eS54dHJ1Y3RzLnB1c2hfYmFjayhnb29kYnllKTsKLQogICAgIEluc2FuaXR5IGxvb25leTsKLSAgICBjcmF6eS51c2VyTWFwLmluc2VydChtYWtlX3BhaXIoTnVtYmVyejo6RklWRSwgNSkpOwotICAgIGNyYXp5Lnh0cnVjdHMucHVzaF9iYWNrKGhlbGxvKTsKLQogICAgIG1hcDxOdW1iZXJ6Ojp0eXBlLCBJbnNhbml0eT4gZmlyc3RfbWFwOwogICAgIG1hcDxOdW1iZXJ6Ojp0eXBlLCBJbnNhbml0eT4gc2Vjb25kX21hcDsKIAotICAgIGZpcnN0X21hcC5pbnNlcnQobWFrZV9wYWlyKE51bWJlcno6OlRXTywgY3JhenkpKTsKLSAgICBmaXJzdF9tYXAuaW5zZXJ0KG1ha2VfcGFpcihOdW1iZXJ6OjpUSFJFRSwgY3JhenkpKTsKKyAgICBmaXJzdF9tYXAuaW5zZXJ0KG1ha2VfcGFpcihOdW1iZXJ6OjpUV08sIGFyZ3VtZW50KSk7CisgICAgZmlyc3RfbWFwLmluc2VydChtYWtlX3BhaXIoTnVtYmVyejo6VEhSRUUsIGFyZ3VtZW50KSk7CiAKICAgICBzZWNvbmRfbWFwLmluc2VydChtYWtlX3BhaXIoTnVtYmVyejo6U0lYLCBsb29uZXkpKTsKIApAQCAtMjM3LDEzICsyNTgsMTEgQEAKIAogICAgIHByaW50ZigicmV0dXJuIik7CiAgICAgcHJpbnRmKCIgPSB7Iik7Ci0gICAgbWFwPFVzZXJJZCwgbWFwPE51bWJlcno6OnR5cGUsSW5zYW5pdHk+ID46OmNvbnN0X2l0ZXJhdG9yIGlfaXRlcjsKKyAgICBtYXA8VXNlcklkLCBtYXA8TnVtYmVyejo6dHlwZSwgSW5zYW5pdHk+ID46OmNvbnN0X2l0ZXJhdG9yIGlfaXRlcjsKICAgICBmb3IgKGlfaXRlciA9IGluc2FuZS5iZWdpbigpOyBpX2l0ZXIgIT0gaW5zYW5lLmVuZCgpOyArK2lfaXRlcikgewogICAgICAgcHJpbnRmKCIlIiBQUklkNjQgIiA9PiB7IiwgaV9pdGVyLT5maXJzdCk7Ci0gICAgICBtYXA8TnVtYmVyejo6dHlwZSxJbnNhbml0eT46OmNvbnN0X2l0ZXJhdG9yIGkyX2l0ZXI7Ci0gICAgICBmb3IgKGkyX2l0ZXIgPSBpX2l0ZXItPnNlY29uZC5iZWdpbigpOwotICAgICAgICAgICBpMl9pdGVyICE9IGlfaXRlci0+c2Vjb25kLmVuZCgpOwotICAgICAgICAgICArK2kyX2l0ZXIpIHsKKyAgICAgIG1hcDxOdW1iZXJ6Ojp0eXBlLCBJbnNhbml0eT46OmNvbnN0X2l0ZXJhdG9yIGkyX2l0ZXI7CisgICAgICBmb3IgKGkyX2l0ZXIgPSBpX2l0ZXItPnNlY29uZC5iZWdpbigpOyBpMl9pdGVyICE9IGlfaXRlci0+c2Vjb25kLmVuZCgpOyArK2kyX2l0ZXIpIHsKICAgICAgICAgcHJpbnRmKCIlZCA9PiB7IiwgaTJfaXRlci0+Zmlyc3QpOwogICAgICAgICBtYXA8TnVtYmVyejo6dHlwZSwgVXNlcklkPiB1c2VyTWFwID0gaTJfaXRlci0+c2Vjb25kLnVzZXJNYXA7CiAgICAgICAgIG1hcDxOdW1iZXJ6Ojp0eXBlLCBVc2VySWQ+Ojpjb25zdF9pdGVyYXRvciB1bTsKQEAgLTI1Nyw3ICsyNzYsMTEgQEAKICAgICAgICAgdmVjdG9yPFh0cnVjdD46OmNvbnN0X2l0ZXJhdG9yIHg7CiAgICAgICAgIHByaW50ZigieyIpOwogICAgICAgICBmb3IgKHggPSB4dHJ1Y3RzLmJlZ2luKCk7IHggIT0geHRydWN0cy5lbmQoKTsgKyt4KSB7Ci0gICAgICAgICAgcHJpbnRmKCJ7XCIlc1wiLCAlZCwgJWQsICUiIFBSSWQ2NCAifSwgIiwgeC0+c3RyaW5nX3RoaW5nLmNfc3RyKCksIChpbnQpeC0+Ynl0ZV90aGluZywgeC0+aTMyX3RoaW5nLCB4LT5pNjRfdGhpbmcpOworICAgICAgICAgIHByaW50Zigie1wiJXNcIiwgJWQsICVkLCAlIiBQUklkNjQgIn0sICIsCisgICAgICAgICAgICAgICAgIHgtPnN0cmluZ190aGluZy5jX3N0cigpLAorICAgICAgICAgICAgICAgICAoaW50KXgtPmJ5dGVfdGhpbmcsCisgICAgICAgICAgICAgICAgIHgtPmkzMl90aGluZywKKyAgICAgICAgICAgICAgICAgeC0+aTY0X3RoaW5nKTsKICAgICAgICAgfQogICAgICAgICBwcmludGYoIn0iKTsKIApAQCAtMjY2LDE0ICsyODksMTggQEAKICAgICAgIHByaW50ZigifSwgIik7CiAgICAgfQogICAgIHByaW50ZigifVxuIik7Ci0KLQogICB9CiAKLSAgdm9pZCB0ZXN0TXVsdGkoWHRydWN0ICZoZWxsbywgY29uc3QgaW50OF90IGFyZzAsIGNvbnN0IGludDMyX3QgYXJnMSwgY29uc3QgaW50NjRfdCBhcmcyLCBjb25zdCBzdGQ6Om1hcDxpbnQxNl90LCBzdGQ6OnN0cmluZz4gICZhcmczLCBjb25zdCBOdW1iZXJ6Ojp0eXBlIGFyZzQsIGNvbnN0IFVzZXJJZCBhcmc1KSB7Ci0gICAgKHZvaWQpIGFyZzM7Ci0gICAgKHZvaWQpIGFyZzQ7Ci0gICAgKHZvaWQpIGFyZzU7CisgIHZvaWQgdGVzdE11bHRpKFh0cnVjdCYgaGVsbG8sCisgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCBhcmcwLAorICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IGFyZzEsCisgICAgICAgICAgICAgICAgIGNvbnN0IGludDY0X3QgYXJnMiwKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8aW50MTZfdCwgc3RkOjpzdHJpbmc+JiBhcmczLAorICAgICAgICAgICAgICAgICBjb25zdCBOdW1iZXJ6Ojp0eXBlIGFyZzQsCisgICAgICAgICAgICAgICAgIGNvbnN0IFVzZXJJZCBhcmc1KSB7CisgICAgKHZvaWQpYXJnMzsKKyAgICAodm9pZClhcmc0OworICAgICh2b2lkKWFyZzU7CiAKICAgICBwcmludGYoInRlc3RNdWx0aSgpXG4iKTsKIApAQCAtMjgzLDkgKzMxMCw3IEBACiAgICAgaGVsbG8uaTY0X3RoaW5nID0gKGludDY0X3QpYXJnMjsKICAgfQogCi0gIHZvaWQgdGVzdEV4Y2VwdGlvbihjb25zdCBzdGQ6OnN0cmluZyAmYXJnKQotICAgIHRocm93KFhjZXB0aW9uLCBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbikKLSAgeworICB2b2lkIHRlc3RFeGNlcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIGFyZykgewogICAgIHByaW50ZigidGVzdEV4Y2VwdGlvbiglcylcbiIsIGFyZy5jX3N0cigpKTsKICAgICBpZiAoYXJnLmNvbXBhcmUoIlhjZXB0aW9uIikgPT0gMCkgewogICAgICAgWGNlcHRpb24gZTsKQEAgLTMwMiw3ICszMjcsOSBAQAogICAgIH0KICAgfQogCi0gIHZvaWQgdGVzdE11bHRpRXhjZXB0aW9uKFh0cnVjdCAmcmVzdWx0LCBjb25zdCBzdGQ6OnN0cmluZyAmYXJnMCwgY29uc3Qgc3RkOjpzdHJpbmcgJmFyZzEpIHRocm93KFhjZXB0aW9uLCBYY2VwdGlvbjIpIHsKKyAgdm9pZCB0ZXN0TXVsdGlFeGNlcHRpb24oWHRydWN0JiByZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBhcmcwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgYXJnMSkgewogCiAgICAgcHJpbnRmKCJ0ZXN0TXVsdGlFeGNlcHRpb24oJXMsICVzKVxuIiwgYXJnMC5jX3N0cigpLCBhcmcxLmNfc3RyKCkpOwogCkBAIC0zMjIsMzUgKzM0OSwzNSBAQAogICAgIH0KICAgfQogCi0gIHZvaWQgdGVzdE9uZXdheShjb25zdCBpbnQzMl90IHNsZWVwRm9yKSB7Ci0gICAgcHJpbnRmKCJ0ZXN0T25ld2F5KCVkKTogU2xlZXBpbmcuLi5cbiIsIHNsZWVwRm9yKTsKLSAgICBUSFJJRlRfU0xFRVBfU0VDKHNsZWVwRm9yKTsKLSAgICBwcmludGYoInRlc3RPbmV3YXkoJWQpOiBkb25lIHNsZWVwaW5nIVxuIiwgc2xlZXBGb3IpOworICB2b2lkIHRlc3RPbmV3YXkoY29uc3QgaW50MzJfdCBhTnVtKSB7CisgICAgcHJpbnRmKCJ0ZXN0T25ld2F5KCVkKTogY2FsbCByZWNlaXZlZFxuIiwgYU51bSk7CiAgIH0KIH07CiAKK2NsYXNzIFNlY29uZEhhbmRsZXIgOiBwdWJsaWMgU2Vjb25kU2VydmljZUlmCit7CisgIHB1YmxpYzoKKyAgICB2b2lkIHNlY29uZHRlc3RTdHJpbmcoc3RkOjpzdHJpbmcmIHJlc3VsdCwgY29uc3Qgc3RkOjpzdHJpbmcmIHRoaW5nKQorICAgIHsgcmVzdWx0ID0gInRlc3RTdHJpbmcoXCIiICsgdGhpbmcgKyAiXCIpIjsgfQorfTsKIAogY2xhc3MgVGVzdFByb2Nlc3NvckV2ZW50SGFuZGxlciA6IHB1YmxpYyBUUHJvY2Vzc29yRXZlbnRIYW5kbGVyIHsKICAgdmlydHVhbCB2b2lkKiBnZXRDb250ZXh0KGNvbnN0IGNoYXIqIGZuX25hbWUsIHZvaWQqIHNlcnZlckNvbnRleHQpIHsKLSAgICAodm9pZCkgc2VydmVyQ29udGV4dDsKKyAgICAodm9pZClzZXJ2ZXJDb250ZXh0OwogICAgIHJldHVybiBuZXcgc3RkOjpzdHJpbmcoZm5fbmFtZSk7CiAgIH0KICAgdmlydHVhbCB2b2lkIGZyZWVDb250ZXh0KHZvaWQqIGN0eCwgY29uc3QgY2hhciogZm5fbmFtZSkgewotICAgICh2b2lkKSBmbl9uYW1lOworICAgICh2b2lkKWZuX25hbWU7CiAgICAgZGVsZXRlIHN0YXRpY19jYXN0PHN0ZDo6c3RyaW5nKj4oY3R4KTsKICAgfQotICB2aXJ0dWFsIHZvaWQgcHJlUmVhZCh2b2lkKiBjdHgsIGNvbnN0IGNoYXIqIGZuX25hbWUpIHsKLSAgICBjb21tdW5pY2F0ZSgicHJlUmVhZCIsIGN0eCwgZm5fbmFtZSk7Ci0gIH0KKyAgdmlydHVhbCB2b2lkIHByZVJlYWQodm9pZCogY3R4LCBjb25zdCBjaGFyKiBmbl9uYW1lKSB7IGNvbW11bmljYXRlKCJwcmVSZWFkIiwgY3R4LCBmbl9uYW1lKTsgfQogICB2aXJ0dWFsIHZvaWQgcG9zdFJlYWQodm9pZCogY3R4LCBjb25zdCBjaGFyKiBmbl9uYW1lLCB1aW50MzJfdCBieXRlcykgewotICAgICh2b2lkKSBieXRlczsKKyAgICAodm9pZClieXRlczsKICAgICBjb21tdW5pY2F0ZSgicG9zdFJlYWQiLCBjdHgsIGZuX25hbWUpOwogICB9Ci0gIHZpcnR1YWwgdm9pZCBwcmVXcml0ZSh2b2lkKiBjdHgsIGNvbnN0IGNoYXIqIGZuX25hbWUpIHsKLSAgICBjb21tdW5pY2F0ZSgicHJlV3JpdGUiLCBjdHgsIGZuX25hbWUpOwotICB9CisgIHZpcnR1YWwgdm9pZCBwcmVXcml0ZSh2b2lkKiBjdHgsIGNvbnN0IGNoYXIqIGZuX25hbWUpIHsgY29tbXVuaWNhdGUoInByZVdyaXRlIiwgY3R4LCBmbl9uYW1lKTsgfQogICB2aXJ0dWFsIHZvaWQgcG9zdFdyaXRlKHZvaWQqIGN0eCwgY29uc3QgY2hhciogZm5fbmFtZSwgdWludDMyX3QgYnl0ZXMpIHsKLSAgICAodm9pZCkgYnl0ZXM7CisgICAgKHZvaWQpYnl0ZXM7CiAgICAgY29tbXVuaWNhdGUoInBvc3RXcml0ZSIsIGN0eCwgZm5fbmFtZSk7CiAgIH0KICAgdmlydHVhbCB2b2lkIGFzeW5jQ29tcGxldGUodm9pZCogY3R4LCBjb25zdCBjaGFyKiBmbl9uYW1lKSB7CkBAIC0zNjUsMTgwICszOTIsMjE4IEBACiAgIH0KIH07CiAKLQogY2xhc3MgVGVzdEhhbmRsZXJBc3luYyA6IHB1YmxpYyBUaHJpZnRUZXN0Q29iU3ZJZiB7CiBwdWJsaWM6Ci0gIFRlc3RIYW5kbGVyQXN5bmMoYm9vc3Q6OnNoYXJlZF9wdHI8VGVzdEhhbmRsZXI+JiBoYW5kbGVyKSA6IF9kZWxlZ2F0ZShoYW5kbGVyKSB7fQorICBUZXN0SGFuZGxlckFzeW5jKHN0ZDo6c2hhcmVkX3B0cjxUZXN0SGFuZGxlcj4mIGhhbmRsZXIpIDogX2RlbGVnYXRlKGhhbmRsZXIpIHt9CiAgIHZpcnR1YWwgflRlc3RIYW5kbGVyQXN5bmMoKSB7fQogCi0gIHZpcnR1YWwgdm9pZCB0ZXN0Vm9pZCh0Y3h4OjpmdW5jdGlvbjx2b2lkKCk+IGNvYikgeworICB2aXJ0dWFsIHZvaWQgdGVzdFZvaWQoc3RkOjpmdW5jdGlvbjx2b2lkKCk+IGNvYikgewogICAgIF9kZWxlZ2F0ZS0+dGVzdFZvaWQoKTsKICAgICBjb2IoKTsKICAgfQogCi0gIHZpcnR1YWwgdm9pZCB0ZXN0U3RyaW5nKHRjeHg6OmZ1bmN0aW9uPHZvaWQoc3RkOjpzdHJpbmcgY29uc3QmIF9yZXR1cm4pPiBjb2IsIGNvbnN0IHN0ZDo6c3RyaW5nJiB0aGluZykgeworICB2aXJ0dWFsIHZvaWQgdGVzdFN0cmluZyhzdGQ6OmZ1bmN0aW9uPHZvaWQoc3RkOjpzdHJpbmcgY29uc3QmIF9yZXR1cm4pPiBjb2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB0aGluZykgewogICAgIHN0ZDo6c3RyaW5nIHJlczsKICAgICBfZGVsZWdhdGUtPnRlc3RTdHJpbmcocmVzLCB0aGluZyk7CiAgICAgY29iKHJlcyk7CiAgIH0KIAotICB2aXJ0dWFsIHZvaWQgdGVzdEJ5dGUodGN4eDo6ZnVuY3Rpb248dm9pZChpbnQ4X3QgY29uc3QmIF9yZXR1cm4pPiBjb2IsIGNvbnN0IGludDhfdCB0aGluZykgeworICB2aXJ0dWFsIHZvaWQgdGVzdEJvb2woc3RkOjpmdW5jdGlvbjx2b2lkKGJvb2wgY29uc3QmIF9yZXR1cm4pPiBjb2IsIGNvbnN0IGJvb2wgdGhpbmcpIHsKKyAgICBib29sIHJlcyA9IF9kZWxlZ2F0ZS0+dGVzdEJvb2wodGhpbmcpOworICAgIGNvYihyZXMpOworICB9CisKKyAgdmlydHVhbCB2b2lkIHRlc3RCeXRlKHN0ZDo6ZnVuY3Rpb248dm9pZChpbnQ4X3QgY29uc3QmIF9yZXR1cm4pPiBjb2IsIGNvbnN0IGludDhfdCB0aGluZykgewogICAgIGludDhfdCByZXMgPSBfZGVsZWdhdGUtPnRlc3RCeXRlKHRoaW5nKTsKICAgICBjb2IocmVzKTsKICAgfQogCi0gIHZpcnR1YWwgdm9pZCB0ZXN0STMyKHRjeHg6OmZ1bmN0aW9uPHZvaWQoaW50MzJfdCBjb25zdCYgX3JldHVybik+IGNvYiwgY29uc3QgaW50MzJfdCB0aGluZykgeworICB2aXJ0dWFsIHZvaWQgdGVzdEkzMihzdGQ6OmZ1bmN0aW9uPHZvaWQoaW50MzJfdCBjb25zdCYgX3JldHVybik+IGNvYiwgY29uc3QgaW50MzJfdCB0aGluZykgewogICAgIGludDMyX3QgcmVzID0gX2RlbGVnYXRlLT50ZXN0STMyKHRoaW5nKTsKICAgICBjb2IocmVzKTsKICAgfQogCi0gIHZpcnR1YWwgdm9pZCB0ZXN0STY0KHRjeHg6OmZ1bmN0aW9uPHZvaWQoaW50NjRfdCBjb25zdCYgX3JldHVybik+IGNvYiwgY29uc3QgaW50NjRfdCB0aGluZykgeworICB2aXJ0dWFsIHZvaWQgdGVzdEk2NChzdGQ6OmZ1bmN0aW9uPHZvaWQoaW50NjRfdCBjb25zdCYgX3JldHVybik+IGNvYiwgY29uc3QgaW50NjRfdCB0aGluZykgewogICAgIGludDY0X3QgcmVzID0gX2RlbGVnYXRlLT50ZXN0STY0KHRoaW5nKTsKICAgICBjb2IocmVzKTsKICAgfQogCi0gIHZpcnR1YWwgdm9pZCB0ZXN0RG91YmxlKHRjeHg6OmZ1bmN0aW9uPHZvaWQoZG91YmxlIGNvbnN0JiBfcmV0dXJuKT4gY29iLCBjb25zdCBkb3VibGUgdGhpbmcpIHsKKyAgdmlydHVhbCB2b2lkIHRlc3REb3VibGUoc3RkOjpmdW5jdGlvbjx2b2lkKGRvdWJsZSBjb25zdCYgX3JldHVybik+IGNvYiwgY29uc3QgZG91YmxlIHRoaW5nKSB7CiAgICAgZG91YmxlIHJlcyA9IF9kZWxlZ2F0ZS0+dGVzdERvdWJsZSh0aGluZyk7CiAgICAgY29iKHJlcyk7CiAgIH0KIAotICB2aXJ0dWFsIHZvaWQgdGVzdFN0cnVjdCh0Y3h4OjpmdW5jdGlvbjx2b2lkKFh0cnVjdCBjb25zdCYgX3JldHVybik+IGNvYiwgY29uc3QgWHRydWN0JiB0aGluZykgeworICB2aXJ0dWFsIHZvaWQgdGVzdEJpbmFyeShzdGQ6OmZ1bmN0aW9uPHZvaWQoc3RkOjpzdHJpbmcgY29uc3QmIF9yZXR1cm4pPiBjb2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB0aGluZykgeworICAgIHN0ZDo6c3RyaW5nIHJlczsKKyAgICBfZGVsZWdhdGUtPnRlc3RCaW5hcnkocmVzLCB0aGluZyk7CisgICAgY29iKHJlcyk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgdGVzdFN0cnVjdChzdGQ6OmZ1bmN0aW9uPHZvaWQoWHRydWN0IGNvbnN0JiBfcmV0dXJuKT4gY29iLCBjb25zdCBYdHJ1Y3QmIHRoaW5nKSB7CiAgICAgWHRydWN0IHJlczsKICAgICBfZGVsZWdhdGUtPnRlc3RTdHJ1Y3QocmVzLCB0aGluZyk7CiAgICAgY29iKHJlcyk7CiAgIH0KIAotICB2aXJ0dWFsIHZvaWQgdGVzdE5lc3QodGN4eDo6ZnVuY3Rpb248dm9pZChYdHJ1Y3QyIGNvbnN0JiBfcmV0dXJuKT4gY29iLCBjb25zdCBYdHJ1Y3QyJiB0aGluZykgeworICB2aXJ0dWFsIHZvaWQgdGVzdE5lc3Qoc3RkOjpmdW5jdGlvbjx2b2lkKFh0cnVjdDIgY29uc3QmIF9yZXR1cm4pPiBjb2IsIGNvbnN0IFh0cnVjdDImIHRoaW5nKSB7CiAgICAgWHRydWN0MiByZXM7CiAgICAgX2RlbGVnYXRlLT50ZXN0TmVzdChyZXMsIHRoaW5nKTsKICAgICBjb2IocmVzKTsKICAgfQogCi0gIHZpcnR1YWwgdm9pZCB0ZXN0TWFwKHRjeHg6OmZ1bmN0aW9uPHZvaWQoc3RkOjptYXA8aW50MzJfdCwgaW50MzJfdD4gIGNvbnN0JiBfcmV0dXJuKT4gY29iLCBjb25zdCBzdGQ6Om1hcDxpbnQzMl90LCBpbnQzMl90PiAmIHRoaW5nKSB7CisgIHZpcnR1YWwgdm9pZCB0ZXN0TWFwKHN0ZDo6ZnVuY3Rpb248dm9pZChzdGQ6Om1hcDxpbnQzMl90LCBpbnQzMl90PiBjb25zdCYgX3JldHVybik+IGNvYiwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8aW50MzJfdCwgaW50MzJfdD4mIHRoaW5nKSB7CiAgICAgc3RkOjptYXA8aW50MzJfdCwgaW50MzJfdD4gcmVzOwogICAgIF9kZWxlZ2F0ZS0+dGVzdE1hcChyZXMsIHRoaW5nKTsKICAgICBjb2IocmVzKTsKICAgfQogCi0gIHZpcnR1YWwgdm9pZCB0ZXN0U3RyaW5nTWFwKHRjeHg6OmZ1bmN0aW9uPHZvaWQoc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiAgY29uc3QmIF9yZXR1cm4pPiBjb2IsIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gJiB0aGluZykgeworICB2aXJ0dWFsIHZvaWQgdGVzdFN0cmluZ01hcCgKKyAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IGNvbnN0JiBfcmV0dXJuKT4gY29iLAorICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgdGhpbmcpIHsKICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IHJlczsKICAgICBfZGVsZWdhdGUtPnRlc3RTdHJpbmdNYXAocmVzLCB0aGluZyk7CiAgICAgY29iKHJlcyk7CiAgIH0KIAotICB2aXJ0dWFsIHZvaWQgdGVzdFNldCh0Y3h4OjpmdW5jdGlvbjx2b2lkKHN0ZDo6c2V0PGludDMyX3Q+ICBjb25zdCYgX3JldHVybik+IGNvYiwgY29uc3Qgc3RkOjpzZXQ8aW50MzJfdD4gJiB0aGluZykgeworICB2aXJ0dWFsIHZvaWQgdGVzdFNldChzdGQ6OmZ1bmN0aW9uPHZvaWQoc3RkOjpzZXQ8aW50MzJfdD4gY29uc3QmIF9yZXR1cm4pPiBjb2IsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2V0PGludDMyX3Q+JiB0aGluZykgewogICAgIHN0ZDo6c2V0PGludDMyX3Q+IHJlczsKICAgICBfZGVsZWdhdGUtPnRlc3RTZXQocmVzLCB0aGluZyk7CiAgICAgY29iKHJlcyk7CiAgIH0KIAotICB2aXJ0dWFsIHZvaWQgdGVzdExpc3QodGN4eDo6ZnVuY3Rpb248dm9pZChzdGQ6OnZlY3RvcjxpbnQzMl90PiAgY29uc3QmIF9yZXR1cm4pPiBjb2IsIGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+ICYgdGhpbmcpIHsKKyAgdmlydHVhbCB2b2lkIHRlc3RMaXN0KHN0ZDo6ZnVuY3Rpb248dm9pZChzdGQ6OnZlY3RvcjxpbnQzMl90PiBjb25zdCYgX3JldHVybik+IGNvYiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+JiB0aGluZykgewogICAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IHJlczsKICAgICBfZGVsZWdhdGUtPnRlc3RMaXN0KHJlcywgdGhpbmcpOwogICAgIGNvYihyZXMpOwogICB9CiAKLSAgdmlydHVhbCB2b2lkIHRlc3RFbnVtKHRjeHg6OmZ1bmN0aW9uPHZvaWQoTnVtYmVyejo6dHlwZSBjb25zdCYgX3JldHVybik+IGNvYiwgY29uc3QgTnVtYmVyejo6dHlwZSB0aGluZykgeworICB2aXJ0dWFsIHZvaWQgdGVzdEVudW0oc3RkOjpmdW5jdGlvbjx2b2lkKE51bWJlcno6OnR5cGUgY29uc3QmIF9yZXR1cm4pPiBjb2IsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBOdW1iZXJ6Ojp0eXBlIHRoaW5nKSB7CiAgICAgTnVtYmVyejo6dHlwZSByZXMgPSBfZGVsZWdhdGUtPnRlc3RFbnVtKHRoaW5nKTsKICAgICBjb2IocmVzKTsKICAgfQogCi0gIHZpcnR1YWwgdm9pZCB0ZXN0VHlwZWRlZih0Y3h4OjpmdW5jdGlvbjx2b2lkKFVzZXJJZCBjb25zdCYgX3JldHVybik+IGNvYiwgY29uc3QgVXNlcklkIHRoaW5nKSB7CisgIHZpcnR1YWwgdm9pZCB0ZXN0VHlwZWRlZihzdGQ6OmZ1bmN0aW9uPHZvaWQoVXNlcklkIGNvbnN0JiBfcmV0dXJuKT4gY29iLCBjb25zdCBVc2VySWQgdGhpbmcpIHsKICAgICBVc2VySWQgcmVzID0gX2RlbGVnYXRlLT50ZXN0VHlwZWRlZih0aGluZyk7CiAgICAgY29iKHJlcyk7CiAgIH0KIAotICB2aXJ0dWFsIHZvaWQgdGVzdE1hcE1hcCh0Y3h4OjpmdW5jdGlvbjx2b2lkKHN0ZDo6bWFwPGludDMyX3QsIHN0ZDo6bWFwPGludDMyX3QsIGludDMyX3Q+ID4gIGNvbnN0JiBfcmV0dXJuKT4gY29iLCBjb25zdCBpbnQzMl90IGhlbGxvKSB7CisgIHZpcnR1YWwgdm9pZCB0ZXN0TWFwTWFwKAorICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKHN0ZDo6bWFwPGludDMyX3QsIHN0ZDo6bWFwPGludDMyX3QsIGludDMyX3Q+ID4gY29uc3QmIF9yZXR1cm4pPiBjb2IsCisgICAgICBjb25zdCBpbnQzMl90IGhlbGxvKSB7CiAgICAgc3RkOjptYXA8aW50MzJfdCwgc3RkOjptYXA8aW50MzJfdCwgaW50MzJfdD4gPiByZXM7CiAgICAgX2RlbGVnYXRlLT50ZXN0TWFwTWFwKHJlcywgaGVsbG8pOwogICAgIGNvYihyZXMpOwogICB9CiAKLSAgdmlydHVhbCB2b2lkIHRlc3RJbnNhbml0eSh0Y3h4OjpmdW5jdGlvbjx2b2lkKHN0ZDo6bWFwPFVzZXJJZCwgc3RkOjptYXA8TnVtYmVyejo6dHlwZSwgSW5zYW5pdHk+ID4gIGNvbnN0JiBfcmV0dXJuKT4gY29iLCBjb25zdCBJbnNhbml0eSYgYXJndW1lbnQpIHsKKyAgdmlydHVhbCB2b2lkIHRlc3RJbnNhbml0eSgKKyAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChzdGQ6Om1hcDxVc2VySWQsIHN0ZDo6bWFwPE51bWJlcno6OnR5cGUsIEluc2FuaXR5PiA+IGNvbnN0JiBfcmV0dXJuKT4gY29iLAorICAgICAgY29uc3QgSW5zYW5pdHkmIGFyZ3VtZW50KSB7CiAgICAgc3RkOjptYXA8VXNlcklkLCBzdGQ6Om1hcDxOdW1iZXJ6Ojp0eXBlLCBJbnNhbml0eT4gPiByZXM7CiAgICAgX2RlbGVnYXRlLT50ZXN0SW5zYW5pdHkocmVzLCBhcmd1bWVudCk7CiAgICAgY29iKHJlcyk7Ci0gfQorICB9CiAKLSAgdmlydHVhbCB2b2lkIHRlc3RNdWx0aSh0Y3h4OjpmdW5jdGlvbjx2b2lkKFh0cnVjdCBjb25zdCYgX3JldHVybik+IGNvYiwgY29uc3QgaW50OF90IGFyZzAsIGNvbnN0IGludDMyX3QgYXJnMSwgY29uc3QgaW50NjRfdCBhcmcyLCBjb25zdCBzdGQ6Om1hcDxpbnQxNl90LCBzdGQ6OnN0cmluZz4gJiBhcmczLCBjb25zdCBOdW1iZXJ6Ojp0eXBlIGFyZzQsIGNvbnN0IFVzZXJJZCBhcmc1KSB7CisgIHZpcnR1YWwgdm9pZCB0ZXN0TXVsdGkoc3RkOjpmdW5jdGlvbjx2b2lkKFh0cnVjdCBjb25zdCYgX3JldHVybik+IGNvYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ4X3QgYXJnMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IGFyZzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50NjRfdCBhcmcyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPGludDE2X3QsIHN0ZDo6c3RyaW5nPiYgYXJnMywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBOdW1iZXJ6Ojp0eXBlIGFyZzQsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVXNlcklkIGFyZzUpIHsKICAgICBYdHJ1Y3QgcmVzOwogICAgIF9kZWxlZ2F0ZS0+dGVzdE11bHRpKHJlcywgYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSk7CiAgICAgY29iKHJlcyk7CiAgIH0KIAotICB2aXJ0dWFsIHZvaWQgdGVzdEV4Y2VwdGlvbih0Y3h4OjpmdW5jdGlvbjx2b2lkKCk+IGNvYiwgdGN4eDo6ZnVuY3Rpb248dm9pZCg6OmFwYWNoZTo6dGhyaWZ0OjpURGVsYXllZEV4Y2VwdGlvbiogX3Rocm93KT4gZXhuX2NvYiwgY29uc3Qgc3RkOjpzdHJpbmcmIGFyZykgeworICB2aXJ0dWFsIHZvaWQgdGVzdEV4Y2VwdGlvbigKKyAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiBjb2IsCisgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoOjphcGFjaGU6OnRocmlmdDo6VERlbGF5ZWRFeGNlcHRpb24qIF90aHJvdyk+IGV4bl9jb2IsCisgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgYXJnKSB7CiAgICAgdHJ5IHsKICAgICAgIF9kZWxlZ2F0ZS0+dGVzdEV4Y2VwdGlvbihhcmcpOwotICAgIH0gY2F0Y2goY29uc3QgYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24mIGUpIHsKKyAgICB9IGNhdGNoIChjb25zdCBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbiYgZSkgewogICAgICAgZXhuX2NvYihhcGFjaGU6OnRocmlmdDo6VERlbGF5ZWRFeGNlcHRpb246OmRlbGF5RXhjZXB0aW9uKGUpKTsKICAgICAgIHJldHVybjsKICAgICB9CiAgICAgY29iKCk7CiAgIH0KIAotICB2aXJ0dWFsIHZvaWQgdGVzdE11bHRpRXhjZXB0aW9uKHRjeHg6OmZ1bmN0aW9uPHZvaWQoWHRydWN0IGNvbnN0JiBfcmV0dXJuKT4gY29iLCB0Y3h4OjpmdW5jdGlvbjx2b2lkKDo6YXBhY2hlOjp0aHJpZnQ6OlREZWxheWVkRXhjZXB0aW9uKiBfdGhyb3cpPiBleG5fY29iLCBjb25zdCBzdGQ6OnN0cmluZyYgYXJnMCwgY29uc3Qgc3RkOjpzdHJpbmcmIGFyZzEpIHsKKyAgdmlydHVhbCB2b2lkIHRlc3RNdWx0aUV4Y2VwdGlvbigKKyAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChYdHJ1Y3QgY29uc3QmIF9yZXR1cm4pPiBjb2IsCisgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoOjphcGFjaGU6OnRocmlmdDo6VERlbGF5ZWRFeGNlcHRpb24qIF90aHJvdyk+IGV4bl9jb2IsCisgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgYXJnMCwKKyAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBhcmcxKSB7CiAgICAgWHRydWN0IHJlczsKICAgICB0cnkgewogICAgICAgX2RlbGVnYXRlLT50ZXN0TXVsdGlFeGNlcHRpb24ocmVzLCBhcmcwLCBhcmcxKTsKLSAgICB9IGNhdGNoKGNvbnN0IGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uJiBlKSB7CisgICAgfSBjYXRjaCAoY29uc3QgYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24mIGUpIHsKICAgICAgIGV4bl9jb2IoYXBhY2hlOjp0aHJpZnQ6OlREZWxheWVkRXhjZXB0aW9uOjpkZWxheUV4Y2VwdGlvbihlKSk7CiAgICAgICByZXR1cm47CiAgICAgfQogICAgIGNvYihyZXMpOwogICB9CiAKLSAgdmlydHVhbCB2b2lkIHRlc3RPbmV3YXkodGN4eDo6ZnVuY3Rpb248dm9pZCgpPiBjb2IsIGNvbnN0IGludDMyX3Qgc2Vjb25kc1RvU2xlZXApIHsKKyAgdmlydHVhbCB2b2lkIHRlc3RPbmV3YXkoc3RkOjpmdW5jdGlvbjx2b2lkKCk+IGNvYiwgY29uc3QgaW50MzJfdCBzZWNvbmRzVG9TbGVlcCkgewogICAgIF9kZWxlZ2F0ZS0+dGVzdE9uZXdheShzZWNvbmRzVG9TbGVlcCk7CiAgICAgY29iKCk7CiAgIH0KIAogcHJvdGVjdGVkOgotICBib29zdDo6c2hhcmVkX3B0cjxUZXN0SGFuZGxlcj4gX2RlbGVnYXRlOworICBzdGQ6OnNoYXJlZF9wdHI8VGVzdEhhbmRsZXI+IF9kZWxlZ2F0ZTsKIH07CiAKK25hbWVzcGFjZSBwbyA9IGJvb3N0Ojpwcm9ncmFtX29wdGlvbnM7CiAKLWludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CiAKLSAgc3RyaW5nIGZpbGVfcGF0aCA9IGJvb3N0OjpmaWxlc3lzdGVtOjpzeXN0ZW1fY29tcGxldGUoYXJndlswXSkuc3RyaW5nKCk7Ci0gIHN0cmluZyBkaXJfcGF0aCA9IGZpbGVfcGF0aC5zdWJzdHIoMCwgZmlsZV9wYXRoLnNpemUoKS1FWEVDVVRBQkxFX0ZJTEVfTkFNRV9MRU5HVEgpOworICBzdHJpbmcgdGVzdERpciA9IGJvb3N0OjpmaWxlc3lzdGVtOjpzeXN0ZW1fY29tcGxldGUoYXJndlswXSkucGFyZW50X3BhdGgoKS5wYXJlbnRfcGF0aCgpLnBhcmVudF9wYXRoKCkuc3RyaW5nKCk7CisgIHN0cmluZyBjZXJ0UGF0aCA9IHRlc3REaXIgKyAiL2tleXMvc2VydmVyLmNydCI7CisgIHN0cmluZyBrZXlQYXRoID0gdGVzdERpciArICIva2V5cy9zZXJ2ZXIua2V5IjsKIAotICAjaWYgX1dJTjMyCisjaWYgX1dJTjMyCiAgIHRyYW5zcG9ydDo6VFdpbnNvY2tTaW5nbGV0b246OmNyZWF0ZSgpOwogI2VuZGlmCiAgIGludCBwb3J0ID0gOTA5MDsKICAgYm9vbCBzc2wgPSBmYWxzZTsKKyAgYm9vbCB6bGliID0gZmFsc2U7CiAgIHN0cmluZyB0cmFuc3BvcnRfdHlwZSA9ICJidWZmZXJlZCI7CiAgIHN0cmluZyBwcm90b2NvbF90eXBlID0gImJpbmFyeSI7CiAgIHN0cmluZyBzZXJ2ZXJfdHlwZSA9ICJzaW1wbGUiOwogICBzdHJpbmcgZG9tYWluX3NvY2tldCA9ICIiOworICBib29sIGFic3RyYWN0X25hbWVzcGFjZSA9IGZhbHNlOwogICBzaXplX3Qgd29ya2VycyA9IDQ7CisgIGludCBzdHJpbmdfbGltaXQgPSAwOworICBpbnQgY29udGFpbmVyX2xpbWl0ID0gMDsKIAotCi0gIGJvb3N0Ojpwcm9ncmFtX29wdGlvbnM6Om9wdGlvbnNfZGVzY3JpcHRpb24gZGVzYygiQWxsb3dlZCBvcHRpb25zIik7CisgIHBvOjpvcHRpb25zX2Rlc2NyaXB0aW9uIGRlc2MoIkFsbG93ZWQgb3B0aW9ucyIpOwogICBkZXNjLmFkZF9vcHRpb25zKCkKLSAgICAgICgiaGVscCxoIiwgInByb2R1Y2UgaGVscCBtZXNzYWdlIikKLSAgICAgICgicG9ydCIsIGJvb3N0Ojpwcm9ncmFtX29wdGlvbnM6OnZhbHVlPGludD4oJnBvcnQpLT5kZWZhdWx0X3ZhbHVlKHBvcnQpLCAiUG9ydCBudW1iZXIgdG8gbGlzdGVuIikKLQkgICgiZG9tYWluLXNvY2tldCIsIGJvb3N0Ojpwcm9ncmFtX29wdGlvbnM6OnZhbHVlPHN0cmluZz4oJmRvbWFpbl9zb2NrZXQpLT5kZWZhdWx0X3ZhbHVlKGRvbWFpbl9zb2NrZXQpLAotCSAgICAiVW5peCBEb21haW4gU29ja2V0IChlLmcuIC90bXAvVGhyaWZ0VGVzdC50aHJpZnQpIikKLSAgICAgICgic2VydmVyLXR5cGUiLCBib29zdDo6cHJvZ3JhbV9vcHRpb25zOjp2YWx1ZTxzdHJpbmc+KCZzZXJ2ZXJfdHlwZSktPmRlZmF1bHRfdmFsdWUoc2VydmVyX3R5cGUpLAotICAgICAgICAidHlwZSBvZiBzZXJ2ZXIsIFwic2ltcGxlXCIsIFwidGhyZWFkLXBvb2xcIiwgXCJ0aHJlYWRlZFwiLCBvciBcIm5vbmJsb2NraW5nXCIiKQotICAgICAgKCJ0cmFuc3BvcnQiLCBib29zdDo6cHJvZ3JhbV9vcHRpb25zOjp2YWx1ZTxzdHJpbmc+KCZ0cmFuc3BvcnRfdHlwZSktPmRlZmF1bHRfdmFsdWUodHJhbnNwb3J0X3R5cGUpLAotICAgICAgICAidHJhbnNwb3J0OiBidWZmZXJlZCwgZnJhbWVkLCBodHRwIikKLSAgICAgICgicHJvdG9jb2wiLCBib29zdDo6cHJvZ3JhbV9vcHRpb25zOjp2YWx1ZTxzdHJpbmc+KCZwcm90b2NvbF90eXBlKS0+ZGVmYXVsdF92YWx1ZShwcm90b2NvbF90eXBlKSwKLSAgICAgICAgInByb3RvY29sOiBiaW5hcnksIGNvbXBhY3QsIGpzb24iKQotCSAgKCJzc2wiLCAiRW5jcnlwdGVkIFRyYW5zcG9ydCB1c2luZyBTU0wiKQotCSAgKCJwcm9jZXNzb3ItZXZlbnRzIiwgInByb2Nlc3Nvci1ldmVudHMiKQotICAgICAgKCJ3b3JrZXJzLG4iLCBib29zdDo6cHJvZ3JhbV9vcHRpb25zOjp2YWx1ZTxzaXplX3Q+KCZ3b3JrZXJzKS0+ZGVmYXVsdF92YWx1ZSh3b3JrZXJzKSwKLSAgICAgICAgIk51bWJlciBvZiB0aHJlYWQgcG9vbHMgd29ya2Vycy4gT25seSB2YWxpZCBmb3IgdGhyZWFkLXBvb2wgc2VydmVyIHR5cGUiKQotICA7CisgICAgKCJoZWxwLGgiLCAicHJvZHVjZSBoZWxwIG1lc3NhZ2UiKQorICAgICgicG9ydCIsIHBvOjp2YWx1ZTxpbnQ+KCZwb3J0KS0+ZGVmYXVsdF92YWx1ZShwb3J0KSwgIlBvcnQgbnVtYmVyIHRvIGxpc3RlbiIpCisgICAgKCJkb21haW4tc29ja2V0IiwgcG86OnZhbHVlPHN0cmluZz4oJmRvbWFpbl9zb2NrZXQpIC0+ZGVmYXVsdF92YWx1ZShkb21haW5fc29ja2V0KSwgIlVuaXggRG9tYWluIFNvY2tldCAoZS5nLiAvdG1wL1RocmlmdFRlc3QudGhyaWZ0KSIpCisgICAgKCJhYnN0cmFjdC1uYW1lc3BhY2UiLCAiQ3JlYXRlIHRoZSBkb21haW4gc29ja2V0IGluIHRoZSBBYnN0cmFjdCBOYW1lc3BhY2UgKG5vIGNvbm5lY3Rpb24gd2l0aCBmaWxlc3lzdGVtIHBhdGhuYW1lcykiKQorICAgICgic2VydmVyLXR5cGUiLCBwbzo6dmFsdWU8c3RyaW5nPigmc2VydmVyX3R5cGUpLT5kZWZhdWx0X3ZhbHVlKHNlcnZlcl90eXBlKSwgInR5cGUgb2Ygc2VydmVyLCBcInNpbXBsZVwiLCBcInRocmVhZC1wb29sXCIsIFwidGhyZWFkZWRcIiwgb3IgXCJub25ibG9ja2luZ1wiIikKKyAgICAoInRyYW5zcG9ydCIsIHBvOjp2YWx1ZTxzdHJpbmc+KCZ0cmFuc3BvcnRfdHlwZSktPmRlZmF1bHRfdmFsdWUodHJhbnNwb3J0X3R5cGUpLCAidHJhbnNwb3J0OiBidWZmZXJlZCwgZnJhbWVkLCBodHRwLCB6bGliIikKKyAgICAoInByb3RvY29sIiwgcG86OnZhbHVlPHN0cmluZz4oJnByb3RvY29sX3R5cGUpLT5kZWZhdWx0X3ZhbHVlKHByb3RvY29sX3R5cGUpLCAicHJvdG9jb2w6IGJpbmFyeSwgY29tcGFjdCwgaGVhZGVyLCBqc29uLCBtdWx0aSwgbXVsdGljLCBtdWx0aWgsIG11bHRpaiIpCisgICAgKCJzc2wiLCAiRW5jcnlwdGVkIFRyYW5zcG9ydCB1c2luZyBTU0wiKQorICAgICgiemxpYiIsICJXcmFwcGVkIFRyYW5zcG9ydCB1c2luZyBabGliIikKKyAgICAoInByb2Nlc3Nvci1ldmVudHMiLCAicHJvY2Vzc29yLWV2ZW50cyIpCisgICAgKCJ3b3JrZXJzLG4iLCBwbzo6dmFsdWU8c2l6ZV90Pigmd29ya2VycyktPmRlZmF1bHRfdmFsdWUod29ya2VycyksICJOdW1iZXIgb2YgdGhyZWFkIHBvb2xzIHdvcmtlcnMuIE9ubHkgdmFsaWQgZm9yIHRocmVhZC1wb29sIHNlcnZlciB0eXBlIikKKyAgICAoInN0cmluZy1saW1pdCIsIHBvOjp2YWx1ZTxpbnQ+KCZzdHJpbmdfbGltaXQpKQorICAgICgiY29udGFpbmVyLWxpbWl0IiwgcG86OnZhbHVlPGludD4oJmNvbnRhaW5lcl9saW1pdCkpOwogCi0gIGJvb3N0Ojpwcm9ncmFtX29wdGlvbnM6OnZhcmlhYmxlc19tYXAgdm07Ci0gIGJvb3N0Ojpwcm9ncmFtX29wdGlvbnM6OnN0b3JlKGJvb3N0Ojpwcm9ncmFtX29wdGlvbnM6OnBhcnNlX2NvbW1hbmRfbGluZShhcmdjLCBhcmd2LCBkZXNjKSwgdm0pOwotICBib29zdDo6cHJvZ3JhbV9vcHRpb25zOjpub3RpZnkodm0pOworICBwbzo6dmFyaWFibGVzX21hcCB2bTsKKyAgcG86OnN0b3JlKHBvOjpwYXJzZV9jb21tYW5kX2xpbmUoYXJnYywgYXJndiwgZGVzYyksIHZtKTsKKyAgcG86Om5vdGlmeSh2bSk7CiAKICAgaWYgKHZtLmNvdW50KCJoZWxwIikpIHsKLSAgICAgIGNvdXQgPDwgZGVzYyA8PCAiXG4iOwotICAgICAgcmV0dXJuIDE7CisgICAgY291dCA8PCBkZXNjIDw8ICJcbiI7CisgICAgcmV0dXJuIDE7CiAgIH0KIAogICB0cnkgewpAQCAtNTQ4LDcgKzYxMyw3IEBACiAgICAgICB9IGVsc2UgaWYgKHNlcnZlcl90eXBlID09ICJ0aHJlYWRlZCIpIHsKICAgICAgIH0gZWxzZSBpZiAoc2VydmVyX3R5cGUgPT0gIm5vbmJsb2NraW5nIikgewogICAgICAgfSBlbHNlIHsKLSAgICAgICAgICB0aHJvdyBpbnZhbGlkX2FyZ3VtZW50KCJVbmtub3duIHNlcnZlciB0eXBlICIrc2VydmVyX3R5cGUpOworICAgICAgICB0aHJvdyBpbnZhbGlkX2FyZ3VtZW50KCJVbmtub3duIHNlcnZlciB0eXBlICIgKyBzZXJ2ZXJfdHlwZSk7CiAgICAgICB9CiAgICAgfQogCkBAIC01NTYsOCArNjIxLDEzIEBACiAgICAgICBpZiAocHJvdG9jb2xfdHlwZSA9PSAiYmluYXJ5IikgewogICAgICAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlID09ICJjb21wYWN0IikgewogICAgICAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlID09ICJqc29uIikgeworICAgICAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlID09ICJoZWFkZXIiKSB7CisgICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUgPT0gIm11bHRpIikgeyAgLy8gbXVsdGlwbGV4ZWQgYmluYXJ5CisgICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUgPT0gIm11bHRpYyIpIHsgLy8gbXVsdGlwbGV4ZWQgY29tcGFjdAorICAgICAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlID09ICJtdWx0aWgiKSB7IC8vIG11bHRpcGxleGVkIGhlYWRlcgorICAgICAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlID09ICJtdWx0aWoiKSB7IC8vIG11bHRpcGxleGVkIGpzb24KICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgdGhyb3cgaW52YWxpZF9hcmd1bWVudCgiVW5rbm93biBwcm90b2NvbCB0eXBlICIrcHJvdG9jb2xfdHlwZSk7CisgICAgICAgIHRocm93IGludmFsaWRfYXJndW1lbnQoIlVua25vd24gcHJvdG9jb2wgdHlwZSAiICsgcHJvdG9jb2xfdHlwZSk7CiAgICAgICB9CiAgICAgfQogCkBAIC01NjUsOCArNjM1LDEwIEBACiAgICAgICBpZiAodHJhbnNwb3J0X3R5cGUgPT0gImJ1ZmZlcmVkIikgewogICAgICAgfSBlbHNlIGlmICh0cmFuc3BvcnRfdHlwZSA9PSAiZnJhbWVkIikgewogICAgICAgfSBlbHNlIGlmICh0cmFuc3BvcnRfdHlwZSA9PSAiaHR0cCIpIHsKKyAgICAgIH0gZWxzZSBpZiAodHJhbnNwb3J0X3R5cGUgPT0gInpsaWIiKSB7CisgICAgICAgIC8vIGNyb3NzdGVzdGVyIHdpbGwgcGFzcyB6bGliIGFzIGEgZmxhZyBhbmQgYSB0cmFuc3BvcnQgcmlnaHQgbm93Li4uCiAgICAgICB9IGVsc2UgewotICAgICAgICAgIHRocm93IGludmFsaWRfYXJndW1lbnQoIlVua25vd24gdHJhbnNwb3J0IHR5cGUgIit0cmFuc3BvcnRfdHlwZSk7CisgICAgICAgIHRocm93IGludmFsaWRfYXJndW1lbnQoIlVua25vd24gdHJhbnNwb3J0IHR5cGUgIiArIHRyYW5zcG9ydF90eXBlKTsKICAgICAgIH0KICAgICB9CiAKQEAgLTU4MCw4OCArNjUyLDEyOSBAQAogICAgIHNzbCA9IHRydWU7CiAgIH0KIAotICAvLyBEaXNwYXRjaGVyCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeTsKLSAgaWYgKHByb3RvY29sX3R5cGUgPT0gImpzb24iKSB7Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4ganNvblByb3RvY29sRmFjdG9yeShuZXcgVEpTT05Qcm90b2NvbEZhY3RvcnkoKSk7Ci0gICAgcHJvdG9jb2xGYWN0b3J5ID0ganNvblByb3RvY29sRmFjdG9yeTsKLSAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlID09ICJjb21wYWN0IikgewotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IGNvbXBhY3RQcm90b2NvbEZhY3RvcnkobmV3IFRDb21wYWN0UHJvdG9jb2xGYWN0b3J5KCkpOwotICAgIHByb3RvY29sRmFjdG9yeSA9IGNvbXBhY3RQcm90b2NvbEZhY3Rvcnk7Ci0gIH0gZWxzZSB7Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gYmluYXJ5UHJvdG9jb2xGYWN0b3J5KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5VDxUQnVmZmVyQmFzZT4oKSk7Ci0gICAgcHJvdG9jb2xGYWN0b3J5ID0gYmluYXJ5UHJvdG9jb2xGYWN0b3J5OworICBpZiAodm0uY291bnQoInpsaWIiKSkgeworICAgIHpsaWIgPSB0cnVlOwogICB9CiAKLSAgLy8gUHJvY2Vzc29yCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRlc3RIYW5kbGVyPiB0ZXN0SGFuZGxlcihuZXcgVGVzdEhhbmRsZXIoKSk7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRocmlmdFRlc3RQcm9jZXNzb3I+IHRlc3RQcm9jZXNzb3IobmV3IFRocmlmdFRlc3RQcm9jZXNzb3IodGVzdEhhbmRsZXIpKTsKKyNpZiBkZWZpbmVkKEhBVkVfU0lHTkFMX0gpICYmIGRlZmluZWQoU0lHUElQRSkKKyAgaWYgKHNzbCkgeworICAgIHNpZ25hbChTSUdQSVBFLCBTSUdfSUdOKTsgLy8gZm9yIE9wZW5TU0wsIG90aGVyd2lzZSB3ZSBlbmQgYWJydXB0bHkKKyAgfQorI2VuZGlmCisKKyAgaWYgKHZtLmNvdW50KCJhYnN0cmFjdC1uYW1lc3BhY2UiKSkgeworICAgIGFic3RyYWN0X25hbWVzcGFjZSA9IHRydWU7CisgIH0KKworICAvLyBEaXNwYXRjaGVyCisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3Rvcnk7CisgIGlmIChwcm90b2NvbF90eXBlID09ICJqc29uIiB8fCBwcm90b2NvbF90eXBlID09ICJtdWx0aWoiKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IGpzb25Qcm90b2NvbEZhY3RvcnkobmV3IFRKU09OUHJvdG9jb2xGYWN0b3J5KCkpOworICAgIHByb3RvY29sRmFjdG9yeSA9IGpzb25Qcm90b2NvbEZhY3Rvcnk7CisgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZSA9PSAiY29tcGFjdCIgfHwgcHJvdG9jb2xfdHlwZSA9PSAibXVsdGljIikgeworICAgIFRDb21wYWN0UHJvdG9jb2xGYWN0b3J5VDxUQnVmZmVyQmFzZT4gKmNvbXBhY3RQcm90b2NvbEZhY3RvcnkgPSBuZXcgVENvbXBhY3RQcm90b2NvbEZhY3RvcnlUPFRCdWZmZXJCYXNlPigpOworICAgIGNvbXBhY3RQcm90b2NvbEZhY3RvcnktPnNldENvbnRhaW5lclNpemVMaW1pdChjb250YWluZXJfbGltaXQpOworICAgIGNvbXBhY3RQcm90b2NvbEZhY3RvcnktPnNldFN0cmluZ1NpemVMaW1pdChzdHJpbmdfbGltaXQpOworICAgIHByb3RvY29sRmFjdG9yeS5yZXNldChjb21wYWN0UHJvdG9jb2xGYWN0b3J5KTsKKyAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlID09ICJoZWFkZXIiIHx8IHByb3RvY29sX3R5cGUgPT0gIm11bHRpaCIpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gaGVhZGVyUHJvdG9jb2xGYWN0b3J5KG5ldyBUSGVhZGVyUHJvdG9jb2xGYWN0b3J5KCkpOworICAgIHByb3RvY29sRmFjdG9yeSA9IGhlYWRlclByb3RvY29sRmFjdG9yeTsKKyAgfSBlbHNlIHsKKyAgICBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5VDxUQnVmZmVyQmFzZT4qIGJpbmFyeVByb3RvY29sRmFjdG9yeSA9IG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5VDxUQnVmZmVyQmFzZT4oKTsKKyAgICBiaW5hcnlQcm90b2NvbEZhY3RvcnktPnNldENvbnRhaW5lclNpemVMaW1pdChjb250YWluZXJfbGltaXQpOworICAgIGJpbmFyeVByb3RvY29sRmFjdG9yeS0+c2V0U3RyaW5nU2l6ZUxpbWl0KHN0cmluZ19saW1pdCk7CisgICAgcHJvdG9jb2xGYWN0b3J5LnJlc2V0KGJpbmFyeVByb3RvY29sRmFjdG9yeSk7CisgIH0KKworICAvLyBQcm9jZXNzb3JzCisgIHN0ZDo6c2hhcmVkX3B0cjxUZXN0SGFuZGxlcj4gdGVzdEhhbmRsZXIobmV3IFRlc3RIYW5kbGVyKCkpOworICBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gdGVzdFByb2Nlc3NvcihuZXcgVGhyaWZ0VGVzdFByb2Nlc3Nvcih0ZXN0SGFuZGxlcikpOwogCiAgIGlmICh2bS5jb3VudCgicHJvY2Vzc29yLWV2ZW50cyIpKSB7Ci0gICAgdGVzdFByb2Nlc3Nvci0+c2V0RXZlbnRIYW5kbGVyKGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3JFdmVudEhhbmRsZXI+KAotICAgICAgICAgIG5ldyBUZXN0UHJvY2Vzc29yRXZlbnRIYW5kbGVyKCkpKTsKKyAgICB0ZXN0UHJvY2Vzc29yLT5zZXRFdmVudEhhbmRsZXIoCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yRXZlbnRIYW5kbGVyPihuZXcgVGVzdFByb2Nlc3NvckV2ZW50SGFuZGxlcigpKSk7CiAgIH0KIAogICAvLyBUcmFuc3BvcnQKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IHNzbFNvY2tldEZhY3Rvcnk7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJTb2NrZXQ+IHNlcnZlclNvY2tldDsKKyAgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBzc2xTb2NrZXRGYWN0b3J5OworICBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlclNvY2tldD4gc2VydmVyU29ja2V0OwogCiAgIGlmIChzc2wpIHsKLSAgICBzc2xTb2NrZXRGYWN0b3J5ID0gYm9vc3Q6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+KG5ldyBUU1NMU29ja2V0RmFjdG9yeSgpKTsKLSAgICBzc2xTb2NrZXRGYWN0b3J5LT5sb2FkQ2VydGlmaWNhdGUoKGRpcl9wYXRoICsgIi4uL2tleXMvc2VydmVyLmNydCIpLmNfc3RyKCkpOwotICAgIHNzbFNvY2tldEZhY3RvcnktPmxvYWRQcml2YXRlS2V5KChkaXJfcGF0aCArICIuLi9rZXlzL3NlcnZlci5rZXkiKS5jX3N0cigpKTsKKyAgICBzc2xTb2NrZXRGYWN0b3J5ID0gc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PihuZXcgVFNTTFNvY2tldEZhY3RvcnkoKSk7CisgICAgc3NsU29ja2V0RmFjdG9yeS0+bG9hZENlcnRpZmljYXRlKGNlcnRQYXRoLmNfc3RyKCkpOworICAgIHNzbFNvY2tldEZhY3RvcnktPmxvYWRQcml2YXRlS2V5KGtleVBhdGguY19zdHIoKSk7CiAgICAgc3NsU29ja2V0RmFjdG9yeS0+Y2lwaGVycygiQUxMOiFBREg6IUxPVzohRVhQOiFNRDU6QFNUUkVOR1RIIik7Ci0gICAgc2VydmVyU29ja2V0ID0gYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlclNvY2tldD4obmV3IFRTU0xTZXJ2ZXJTb2NrZXQocG9ydCwgc3NsU29ja2V0RmFjdG9yeSkpOworICAgIGlmIChzZXJ2ZXJfdHlwZSAhPSAibm9uYmxvY2tpbmciKSB7CisgICAgICBzZXJ2ZXJTb2NrZXQgPSBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlclNvY2tldD4obmV3IFRTU0xTZXJ2ZXJTb2NrZXQocG9ydCwgc3NsU29ja2V0RmFjdG9yeSkpOworICAgIH0KICAgfSBlbHNlIHsKICAgICBpZiAoZG9tYWluX3NvY2tldCAhPSAiIikgewotICAgICAgdW5saW5rKGRvbWFpbl9zb2NrZXQuY19zdHIoKSk7Ci0gICAgICBzZXJ2ZXJTb2NrZXQgPSBib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyU29ja2V0PihuZXcgVFNlcnZlclNvY2tldChkb21haW5fc29ja2V0KSk7CisgICAgICBpZiAoYWJzdHJhY3RfbmFtZXNwYWNlKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIGFic3RyYWN0X3NvY2tldCgiXDAiLCAxKTsKKyAgICAgICAgYWJzdHJhY3Rfc29ja2V0ICs9IGRvbWFpbl9zb2NrZXQ7CisgICAgICAgIHNlcnZlclNvY2tldCA9IHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyU29ja2V0PihuZXcgVFNlcnZlclNvY2tldChhYnN0cmFjdF9zb2NrZXQpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHVubGluayhkb21haW5fc29ja2V0LmNfc3RyKCkpOworICAgICAgICBzZXJ2ZXJTb2NrZXQgPSBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlclNvY2tldD4obmV3IFRTZXJ2ZXJTb2NrZXQoZG9tYWluX3NvY2tldCkpOworICAgICAgfQogICAgICAgcG9ydCA9IDA7CiAgICAgfSBlbHNlIHsKLSAgICAgIHNlcnZlclNvY2tldCA9IGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJTb2NrZXQ+KG5ldyBUU2VydmVyU29ja2V0KHBvcnQpKTsKKyAgICAgIHNlcnZlclNvY2tldCA9IHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyU29ja2V0PihuZXcgVFNlcnZlclNvY2tldChwb3J0KSk7CiAgICAgfQogICB9CiAKICAgLy8gRmFjdG9yeQotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gdHJhbnNwb3J0RmFjdG9yeTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiB0cmFuc3BvcnRGYWN0b3J5OwogCiAgIGlmICh0cmFuc3BvcnRfdHlwZSA9PSAiaHR0cCIgJiYgc2VydmVyX3R5cGUgIT0gIm5vbmJsb2NraW5nIikgewotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiBodHRwVHJhbnNwb3J0RmFjdG9yeShuZXcgVEh0dHBTZXJ2ZXJUcmFuc3BvcnRGYWN0b3J5KCkpOwotICAgIHRyYW5zcG9ydEZhY3RvcnkgPSBodHRwVHJhbnNwb3J0RmFjdG9yeTsKKyAgICB0cmFuc3BvcnRGYWN0b3J5ID0gc3RkOjptYWtlX3NoYXJlZDxUSHR0cFNlcnZlclRyYW5zcG9ydEZhY3Rvcnk+KCk7CiAgIH0gZWxzZSBpZiAodHJhbnNwb3J0X3R5cGUgPT0gImZyYW1lZCIpIHsKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gZnJhbWVkVHJhbnNwb3J0RmFjdG9yeShuZXcgVEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkoKSk7Ci0gICAgdHJhbnNwb3J0RmFjdG9yeSA9IGZyYW1lZFRyYW5zcG9ydEZhY3Rvcnk7CisgICAgdHJhbnNwb3J0RmFjdG9yeSA9IHN0ZDo6bWFrZV9zaGFyZWQ8VEZyYW1lZFRyYW5zcG9ydEZhY3Rvcnk+KCk7CiAgIH0gZWxzZSB7Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IGJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeShuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSgpKTsKLSAgICB0cmFuc3BvcnRGYWN0b3J5ID0gYnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5OworICAgIHRyYW5zcG9ydEZhY3RvcnkgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRCdWZmZXJlZFRyYW5zcG9ydEZhY3Rvcnk+KCk7CisgIH0KKworICBpZiAoemxpYikgeworICAgIC8vIGhtbS4uIGRvZXNuJ3Qgc2VlbSB0byBiZSBhIHdheSB0byBtYWtlIGl0IHdyYXAgdGhlIG90aGVycy4uLgorICAgIHRyYW5zcG9ydEZhY3RvcnkgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRabGliVHJhbnNwb3J0RmFjdG9yeT4oKTsKICAgfQogCiAgIC8vIFNlcnZlciBJbmZvCi0gIGNvdXQgPDwgIlN0YXJ0aW5nIFwiIiA8PCBzZXJ2ZXJfdHlwZSA8PCAiXCIgc2VydmVyICgiCi0gICAgPDwgdHJhbnNwb3J0X3R5cGUgPDwgIi8iIDw8IHByb3RvY29sX3R5cGUgPDwgIikgbGlzdGVuIG9uOiAiIDw8IGRvbWFpbl9zb2NrZXQ7CisgIGNvdXQgPDwgIlN0YXJ0aW5nIFwiIiA8PCBzZXJ2ZXJfdHlwZSA8PCAiXCIgc2VydmVyICgiIDw8IHRyYW5zcG9ydF90eXBlIDw8ICIvIiA8PCBwcm90b2NvbF90eXBlCisgICAgICAgPDwgIikgbGlzdGVuIG9uOiAiOworICBpZiAoYWJzdHJhY3RfbmFtZXNwYWNlKSB7CisgICAgY291dCA8PCAnQCc7CisgIH0KKyAgY291dCA8PCBkb21haW5fc29ja2V0OwogICBpZiAocG9ydCAhPSAwKSB7CiAgICAgY291dCA8PCBwb3J0OwogICB9CiAgIGNvdXQgPDwgZW5kbDsKIAorICAvLyBNdWx0aXBsZXhlZCBQcm9jZXNzb3IgaWYgbmVlZGVkCisgIGlmIChib29zdDo6c3RhcnRzX3dpdGgocHJvdG9jb2xfdHlwZSwgIm11bHRpIikpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8U2Vjb25kSGFuZGxlcj4gc2Vjb25kSGFuZGxlcihuZXcgU2Vjb25kSGFuZGxlcigpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8U2Vjb25kU2VydmljZVByb2Nlc3Nvcj4gc2Vjb25kUHJvY2Vzc29yKG5ldyBTZWNvbmRTZXJ2aWNlUHJvY2Vzc29yKHNlY29uZEhhbmRsZXIpKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxUTXVsdGlwbGV4ZWRQcm9jZXNzb3I+IG11bHRpcGxleGVkUHJvY2Vzc29yKG5ldyBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IoKSk7CisgICAgbXVsdGlwbGV4ZWRQcm9jZXNzb3ItPnJlZ2lzdGVyRGVmYXVsdCh0ZXN0UHJvY2Vzc29yKTsgLy8gbm9uLW11bHRpIGNsaWVudHMgZ28gdG8gdGhlIGRlZmF1bHQgcHJvY2Vzc29yIChtdWx0aTpiaW5hcnksIG11bHRpYzpjb21wYWN0LCAuLi4pCisgICAgbXVsdGlwbGV4ZWRQcm9jZXNzb3ItPnJlZ2lzdGVyUHJvY2Vzc29yKCJUaHJpZnRUZXN0IiwgdGVzdFByb2Nlc3Nvcik7CisgICAgbXVsdGlwbGV4ZWRQcm9jZXNzb3ItPnJlZ2lzdGVyUHJvY2Vzc29yKCJTZWNvbmRTZXJ2aWNlIiwgc2Vjb25kUHJvY2Vzc29yKTsKKyAgICB0ZXN0UHJvY2Vzc29yID0gc3RkOjpkeW5hbWljX3BvaW50ZXJfY2FzdDxUUHJvY2Vzc29yPihtdWx0aXBsZXhlZFByb2Nlc3Nvcik7CisgIH0KKwogICAvLyBTZXJ2ZXIKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnNlcnZlcjo6VFNlcnZlcj4gc2VydmVyOworICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnNlcnZlcjo6VFNlcnZlcj4gc2VydmVyOwogCiAgIGlmIChzZXJ2ZXJfdHlwZSA9PSAic2ltcGxlIikgewotICAgIHNlcnZlci5yZXNldChuZXcgVFNpbXBsZVNlcnZlcih0ZXN0UHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlclNvY2tldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sRmFjdG9yeSkpOworICAgIHNlcnZlci5yZXNldChuZXcgVFNpbXBsZVNlcnZlcih0ZXN0UHJvY2Vzc29yLCBzZXJ2ZXJTb2NrZXQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSkpOwogICB9IGVsc2UgaWYgKHNlcnZlcl90eXBlID09ICJ0aHJlYWQtcG9vbCIpIHsKIAotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IHRocmVhZE1hbmFnZXIgPQotICAgICAgVGhyZWFkTWFuYWdlcjo6bmV3U2ltcGxlVGhyZWFkTWFuYWdlcih3b3JrZXJzKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8UGxhdGZvcm1UaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5CisgICAgICAgID0gc3RkOjpzaGFyZWRfcHRyPFBsYXRmb3JtVGhyZWFkRmFjdG9yeT4obmV3IFBsYXRmb3JtVGhyZWFkRmFjdG9yeSgpKTsKIAotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFBsYXRmb3JtVGhyZWFkRmFjdG9yeT4gdGhyZWFkRmFjdG9yeSA9Ci0gICAgICBib29zdDo6c2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+KG5ldyBQbGF0Zm9ybVRocmVhZEZhY3RvcnkoKSk7Ci0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlciA9IFRocmVhZE1hbmFnZXI6Om5ld1NpbXBsZVRocmVhZE1hbmFnZXIod29ya2Vycyk7CiAgICAgdGhyZWFkTWFuYWdlci0+dGhyZWFkRmFjdG9yeSh0aHJlYWRGYWN0b3J5KTsKLQogICAgIHRocmVhZE1hbmFnZXItPnN0YXJ0KCk7CiAKICAgICBzZXJ2ZXIucmVzZXQobmV3IFRUaHJlYWRQb29sU2VydmVyKHRlc3RQcm9jZXNzb3IsCkBAIC02NzAsNDEgKzc4Myw1NiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2xGYWN0b3J5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkTWFuYWdlcikpOwogICB9IGVsc2UgaWYgKHNlcnZlcl90eXBlID09ICJ0aHJlYWRlZCIpIHsKLQotICAgIHNlcnZlci5yZXNldChuZXcgVFRocmVhZGVkU2VydmVyKHRlc3RQcm9jZXNzb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlclNvY2tldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2xGYWN0b3J5KSk7CisgICAgc2VydmVyLnJlc2V0KAorICAgICAgICBuZXcgVFRocmVhZGVkU2VydmVyKHRlc3RQcm9jZXNzb3IsIHNlcnZlclNvY2tldCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KSk7CiAgIH0gZWxzZSBpZiAoc2VydmVyX3R5cGUgPT0gIm5vbmJsb2NraW5nIikgewotICAgIGlmKHRyYW5zcG9ydF90eXBlID09ICJodHRwIikgewotICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VGVzdEhhbmRsZXJBc3luYz4gdGVzdEhhbmRsZXJBc3luYyhuZXcgVGVzdEhhbmRsZXJBc3luYyh0ZXN0SGFuZGxlcikpOwotICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VEFzeW5jUHJvY2Vzc29yPiB0ZXN0UHJvY2Vzc29yQXN5bmMobmV3IFRocmlmdFRlc3RBc3luY1Byb2Nlc3Nvcih0ZXN0SGFuZGxlckFzeW5jKSk7Ci0gICAgICBib29zdDo6c2hhcmVkX3B0cjxUQXN5bmNCdWZmZXJQcm9jZXNzb3I+IHRlc3RCdWZmZXJQcm9jZXNzb3IobmV3IFRBc3luY1Byb3RvY29sUHJvY2Vzc29yKHRlc3RQcm9jZXNzb3JBc3luYywgcHJvdG9jb2xGYWN0b3J5KSk7CisgICAgaWYgKHRyYW5zcG9ydF90eXBlID09ICJodHRwIikgeworICAgICAgc3RkOjpzaGFyZWRfcHRyPFRlc3RIYW5kbGVyQXN5bmM+IHRlc3RIYW5kbGVyQXN5bmMobmV3IFRlc3RIYW5kbGVyQXN5bmModGVzdEhhbmRsZXIpKTsKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUQXN5bmNQcm9jZXNzb3I+IHRlc3RQcm9jZXNzb3JBc3luYygKKyAgICAgICAgICBuZXcgVGhyaWZ0VGVzdEFzeW5jUHJvY2Vzc29yKHRlc3RIYW5kbGVyQXN5bmMpKTsKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUQXN5bmNCdWZmZXJQcm9jZXNzb3I+IHRlc3RCdWZmZXJQcm9jZXNzb3IoCisgICAgICAgICAgbmV3IFRBc3luY1Byb3RvY29sUHJvY2Vzc29yKHRlc3RQcm9jZXNzb3JBc3luYywgcHJvdG9jb2xGYWN0b3J5KSk7CiAKICAgICAgIC8vIG5vdCBsb2FkaW5nIG5vbmJsb2NraW5nU2VydmVyIGludG8gInNlcnZlciIgYmVjYXVzZQogICAgICAgLy8gVEV2aHR0cFNlcnZlciBkb2Vzbid0IGluaGVyaXQgZnJvbSBUU2VydmVyLCBhbmQgZG9lc24ndAogICAgICAgLy8gcHJvdmlkZSBhIHN0b3AgbWV0aG9kLgogICAgICAgVEV2aHR0cFNlcnZlciBub25ibG9ja2luZ1NlcnZlcih0ZXN0QnVmZmVyUHJvY2Vzc29yLCBwb3J0KTsKICAgICAgIG5vbmJsb2NraW5nU2VydmVyLnNlcnZlKCk7CisgICAgfSBlbHNlIGlmICh0cmFuc3BvcnRfdHlwZSA9PSAiZnJhbWVkIikgeworICAgICAgc3RkOjpzaGFyZWRfcHRyPHRyYW5zcG9ydDo6VE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0PiBuYlNvY2tldDsKKyAgICAgIG5iU29ja2V0LnJlc2V0KAorICAgICAgICAgIHNzbCA/IG5ldyB0cmFuc3BvcnQ6OlROb25ibG9ja2luZ1NTTFNlcnZlclNvY2tldChwb3J0LCBzc2xTb2NrZXRGYWN0b3J5KQorICAgICAgICAgICAgICA6IG5ldyB0cmFuc3BvcnQ6OlROb25ibG9ja2luZ1NlcnZlclNvY2tldChwb3J0KSk7CisgICAgICBzZXJ2ZXIucmVzZXQobmV3IFROb25ibG9ja2luZ1NlcnZlcih0ZXN0UHJvY2Vzc29yLCBwcm90b2NvbEZhY3RvcnksIG5iU29ja2V0KSk7CiAgICAgfSBlbHNlIHsKLSAgICAgIHNlcnZlci5yZXNldChuZXcgVE5vbmJsb2NraW5nU2VydmVyKHRlc3RQcm9jZXNzb3IsIHBvcnQpKTsKKyAgICAgIGNlcnIgPDwgInNlcnZlci10eXBlIG5vbmJsb2NraW5nIHJlcXVpcmVzIHRyYW5zcG9ydCBvZiBodHRwIG9yIGZyYW1lZCIgPDwgZW5kbDsKKyAgICAgIGV4aXQoMSk7CiAgICAgfQogICB9CiAKLSAgaWYoc2VydmVyLmdldCgpICE9IE5VTEwpCi0gIHsKKyAgaWYgKHNlcnZlci5nZXQoKSAhPSBOVUxMKSB7CisgICAgaWYgKHByb3RvY29sX3R5cGUgPT0gImhlYWRlciIpIHsKKyAgICAgIC8vIFRlbGwgdGhlIHNlcnZlciB0byB1c2UgdGhlIHNhbWUgcHJvdG9jb2wgZm9yIGlucHV0IC8gb3V0cHV0CisgICAgICAvLyBpZiB1c2luZyBoZWFkZXIKKyAgICAgIHNlcnZlci0+c2V0T3V0cHV0UHJvdG9jb2xGYWN0b3J5KHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PigpKTsKKyAgICB9CisgICAgCiAgICAgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpQbGF0Zm9ybVRocmVhZEZhY3RvcnkgZmFjdG9yeTsKICAgICBmYWN0b3J5LnNldERldGFjaGVkKGZhbHNlKTsKLSAgICBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlJ1bm5hYmxlPiBzZXJ2ZXJUaHJlYWRSdW5uZXIoc2VydmVyKTsKLSAgICBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZD4gdGhyZWFkID0gZmFjdG9yeS5uZXdUaHJlYWQoc2VydmVyVGhyZWFkUnVubmVyKTsKLSAgICB0aHJlYWQtPnN0YXJ0KCk7CisgICAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6UnVubmFibGU+IHNlcnZlclRocmVhZFJ1bm5lcihzZXJ2ZXIpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZD4gdGhyZWFkCisgICAgICAgID0gZmFjdG9yeS5uZXdUaHJlYWQoc2VydmVyVGhyZWFkUnVubmVyKTsKIAotICAgIC8vIEhBQ0s6IGNyb3NzIGxhbmd1YWdlIHRlc3Qgc3VpdGUgaXMgdW5hYmxlIHRvIGhhbmRsZSBjaW4gcHJvcGVybHkKLSAgICAvLyAgICAgICB0aGF0J3Mgd2h5IHdlIHN0YXkgaW4gYSBlbmRsZXNzIGxvb3AgaGVyZQotICAgIHdoaWxlKDEpe30KLSAgICAvLyBGSVhNRTogZmluZCBhbm90aGVyIHdheSB0byBzdG9wIHRoZSBzZXJ2ZXIgKGUuZy4gYSBzaWduYWwpCi0gICAgLy8gY291dDw8IlByZXNzIGVudGVyIHRvIHN0b3AgdGhlIHNlcnZlci4iPDxlbmRsOwotICAgIC8vIGNpbi5pZ25vcmUoKTsgLy93YWl0IHVudGlsIGEga2V5IGlzIHByZXNzZWQKKyNpZmRlZiBIQVZFX1NJR05BTF9ICisgICAgc2lnbmFsKFNJR0lOVCwgc2lnbmFsX2hhbmRsZXIpOworI2VuZGlmCisKKyAgICB0aHJlYWQtPnN0YXJ0KCk7CisgICAgZ01vbml0b3Iud2FpdEZvcmV2ZXIoKTsgICAgICAgICAvLyB3YWl0IGZvciBhIHNodXRkb3duIHNpZ25hbAorICAgIAorI2lmZGVmIEhBVkVfU0lHTkFMX0gKKyAgICBzaWduYWwoU0lHSU5ULCBTSUdfREZMKTsKKyNlbmRpZgogCiAgICAgc2VydmVyLT5zdG9wKCk7CiAgICAgdGhyZWFkLT5qb2luKCk7CkBAIC03MTQsMyArODQyLDQgQEAKICAgY291dCA8PCAiZG9uZS4iIDw8IGVuZGw7CiAgIHJldHVybiAwOwogfQorCmRpZmYgLS1naXQgYS90ZXN0L2NwcC9zcmMvVGhyaWZ0VGVzdF9leHRyYXMuY3BwIGIvdGVzdC9jcHAvc3JjL1RocmlmdFRlc3RfZXh0cmFzLmNwcAppbmRleCAzM2Y2ODFmLi5hZjU2MDZlIDEwMDY0NAotLS0gYS90ZXN0L2NwcC9zcmMvVGhyaWZ0VGVzdF9leHRyYXMuY3BwCisrKyBiL3Rlc3QvY3BwL3NyYy9UaHJpZnRUZXN0X2V4dHJhcy5jcHAKQEAgLTIyLDEyICsyMiwxMiBAQAogI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9URGVidWdQcm90b2NvbC5oPgogI2luY2x1ZGUgImdlbi1jcHAvVGhyaWZ0VGVzdF90eXBlcy5oIgogCi0KLW5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdGVzdCB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0ZXN0IHsKIAogYm9vbCBJbnNhbml0eTo6b3BlcmF0b3I8KHRocmlmdDo6dGVzdDo6SW5zYW5pdHkgY29uc3QmIG90aGVyKSBjb25zdCB7CiAgIHVzaW5nIGFwYWNoZTo6dGhyaWZ0OjpUaHJpZnREZWJ1Z1N0cmluZzsKICAgcmV0dXJuIFRocmlmdERlYnVnU3RyaW5nKCp0aGlzKSA8IFRocmlmdERlYnVnU3RyaW5nKG90aGVyKTsKIH0KLQotfX0KK30KK30KZGlmZiAtLWdpdCBhL3Rlc3QvY3Jvc3NydW5uZXIvX19pbml0X18ucHkgYi90ZXN0L2Nyb3NzcnVubmVyL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkMGI4M2EKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2Nyb3NzcnVubmVyL19faW5pdF9fLnB5CkBAIC0wLDAgKzEsMjMgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitmcm9tIC50ZXN0IGltcG9ydCB0ZXN0X25hbWUgICMgbm9xYQorZnJvbSAuY29sbGVjdCBpbXBvcnQgY29sbGVjdF9jcm9zc190ZXN0cywgY29sbGVjdF9mZWF0dXJlX3Rlc3RzICAjIG5vcWEKK2Zyb20gLnJ1biBpbXBvcnQgVGVzdERpc3BhdGNoZXIgICMgbm9xYQorZnJvbSAucmVwb3J0IGltcG9ydCBnZW5lcmF0ZV9rbm93bl9mYWlsdXJlcywgbG9hZF9rbm93bl9mYWlsdXJlcyAgIyBub3FhCmRpZmYgLS1naXQgYS90ZXN0L2Nyb3NzcnVubmVyL2NvbGxlY3QucHkgYi90ZXN0L2Nyb3NzcnVubmVyL2NvbGxlY3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJkODk3OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY3Jvc3NydW5uZXIvY29sbGVjdC5weQpAQCAtMCwwICsxLDE2NCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2ltcG9ydCBwbGF0Zm9ybQoraW1wb3J0IHJlCitmcm9tIGl0ZXJ0b29scyBpbXBvcnQgcHJvZHVjdAorCitmcm9tIC51dGlsIGltcG9ydCBtZXJnZV9kaWN0Citmcm9tIC50ZXN0IGltcG9ydCBUZXN0RW50cnkKKworIyBUaG9zZSBrZXlzIGFyZSBwYXNzZWQgdG8gZXhlY3V0aW9uIGFzIGlzLgorIyBOb3RlIHRoYXQgdGhlcmUgYXJlIGtleXMgb3RoZXIgdGhhbiB0aGVzZSwgbmFtZWx5OgorIyBkZWxheTogQWZ0ZXIgc2VydmVyIGlzIHN0YXJ0ZWQsIGNsaWVudCBzdGFydCBpcyBkZWxheWVkIGZvciB0aGUgdmFsdWUKKyMgKHNlY29uZHMpLgorIyB0aW1lb3V0OiBUZXN0IHRpbWVvdXQgYWZ0ZXIgY2xpZW50IGlzIHN0YXJ0ZWQgKHNlY29uZHMpLgorIyBwbGF0Zm9ybXM6IFN1cHBvcnRlZCBwbGF0Zm9ybXMuIFNob3VsZCBtYXRjaCBwbGF0Zm9ybS5zeXN0ZW0oKSB2YWx1ZS4KKyMgcHJvdG9jb2xzOiBsaXN0IG9mIHN1cHBvcnRlZCBwcm90b2NvbHMKKyMgdHJhbnNwb3J0czogbGlzdCBvZiBzdXBwb3J0ZWQgdHJhbnNwb3J0cworIyBzb2NrZXRzOiBsaXN0IG9mIHN1cHBvcnRlZCBzb2NrZXRzCisjCisjIHByb3RvY29scyBhbmQgdHJhbnNwb3J0cyBlbnRyaWVzIGNhbiBiZSBjb2xvbiBzZXBhcmF0ZWQgInNwZWM6aW1wbCIgcGFpcgorIyAoZS5nLiBiaW5hcnk6YWNjZWwpIHdoZXJlIHRlc3QgaXMgcnVuIGZvciBhbnkgbWF0Y2hpbmcgInNwZWMiIHdoaWxlIGFjdHVhbAorIyBhcmd1bWVudCBwYXNzZWQgdG8gdGVzdCBleGVjdXRhYmxlIGlzICJpbXBsIi4KKyMgT3RoZXJ3aXNlICJzcGVjIiBpcyBlcXVpdmFsZW50IHRvICJzcGVjOnNwZWMiIHBhaXIuCisjIChlLmcuICJiaW5hcnkiIGlzIGVxdWl2YWxlbnQgdG8gImJpbmFyeTpiaW5hcnkiIGluIHRlc3RzLmpzb24pCisjCitWQUxJRF9KU09OX0tFWVMgPSBbCisgICAgJ25hbWUnLCAgIyBuYW1lIG9mIHRoZSBsaWJyYXJ5LCB0eXBpY2FsbHkgYSBsYW5ndWFnZSBuYW1lCisgICAgJ3dvcmtkaXInLCAgIyB3b3JrIGRpcmVjdG9yeSB3aGVyZSBjb21tYW5kIGlzIGV4ZWN1dGVkCisgICAgJ2NvbW1hbmQnLCAgIyB0ZXN0IGNvbW1hbmQKKyAgICAnZXh0cmFfYXJncycsICAjIGFyZ3MgYXBwZW5kZWQgdG8gY29tbWFuZCBhZnRlciBvdGhlciBhcmdzIGFyZSBhcHBlbmRlZAorICAgICdyZW1vdGVfYXJncycsICAjIGFyZ3MgYWRkZWQgdG8gdGhlIG90aGVyIHNpZGUgb2YgdGhlIHByb2dyYW0KKyAgICAnam9pbl9hcmdzJywgICMgd2hldGhlciBhcmdzIHNob3VsZCBiZSBwYXNzZWQgYXMgc2luZ2xlIGNvbmNhdGVuYXRlZCBzdHJpbmcKKyAgICAnZW52JywgICMgYWRkaXRpb25hbCBlbnZpcm9ubWVudGFsIHZhcmlhYmxlCitdCisKK0RFRkFVTFRfTUFYX0RFTEFZID0gNQorREVGQVVMVF9TSUdOQUwgPSAxCitERUZBVUxUX1RJTUVPVVQgPSA1CisKKworZGVmIF9jb2xsZWN0X3Rlc3RsaWJzKGNvbmZpZywgc2VydmVyX21hdGNoLCBjbGllbnRfbWF0Y2g9W05vbmVdKToKKyAgICAiIiJDb2xsZWN0cyBzZXJ2ZXIvY2xpZW50IGNvbmZpZ3VyYXRpb25zIGZyb20gbGlicmFyeSBjb25maWd1cmF0aW9ucyIiIgorICAgIGRlZiBleHBhbmRfbGlicyhjb25maWcpOgorICAgICAgICBmb3IgbGliIGluIGNvbmZpZzoKKyAgICAgICAgICAgIHN2ID0gbGliLnBvcCgnc2VydmVyJywgTm9uZSkKKyAgICAgICAgICAgIGNsID0gbGliLnBvcCgnY2xpZW50JywgTm9uZSkKKyAgICAgICAgICAgIHlpZWxkIGxpYiwgc3YsIGNsCisKKyAgICBkZWYgeWllbGRfdGVzdGxpYnMoYmFzZV9jb25maWdzLCBjb25maWdzLCBtYXRjaCk6CisgICAgICAgIGZvciBiYXNlLCBjb25mIGluIHppcChiYXNlX2NvbmZpZ3MsIGNvbmZpZ3MpOgorICAgICAgICAgICAgaWYgY29uZjoKKyAgICAgICAgICAgICAgICBpZiBub3QgbWF0Y2ggb3IgYmFzZVsnbmFtZSddIGluIG1hdGNoOgorICAgICAgICAgICAgICAgICAgICBwbGF0Zm9ybXMgPSBjb25mLmdldCgncGxhdGZvcm1zJykgb3IgYmFzZS5nZXQoJ3BsYXRmb3JtcycpCisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBwbGF0Zm9ybXMgb3IgcGxhdGZvcm0uc3lzdGVtKCkgaW4gcGxhdGZvcm1zOgorICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgbWVyZ2VfZGljdChiYXNlLCBjb25mKQorCisgICAgbGlicywgc3ZzLCBjbHMgPSB6aXAoKmV4cGFuZF9saWJzKGNvbmZpZykpCisgICAgc2VydmVycyA9IGxpc3QoeWllbGRfdGVzdGxpYnMobGlicywgc3ZzLCBzZXJ2ZXJfbWF0Y2gpKQorICAgIGNsaWVudHMgPSBsaXN0KHlpZWxkX3Rlc3RsaWJzKGxpYnMsIGNscywgY2xpZW50X21hdGNoKSkKKyAgICByZXR1cm4gc2VydmVycywgY2xpZW50cworCisKK2RlZiBjb2xsZWN0X2ZlYXR1cmVzKGNvbmZpZywgbWF0Y2gpOgorICAgIHJlcyA9IGxpc3QobWFwKHJlLmNvbXBpbGUsIG1hdGNoKSkKKyAgICByZXR1cm4gbGlzdChmaWx0ZXIobGFtYmRhIGM6IGFueShtYXAobGFtYmRhIHI6IHIuc2VhcmNoKGNbJ25hbWUnXSksIHJlcykpLCBjb25maWcpKQorCisKK2RlZiBfZG9fY29sbGVjdF90ZXN0cyhzZXJ2ZXJzLCBjbGllbnRzKToKKyAgICBkZWYgaW50ZXJzZWN0aW9uKGtleSwgbzEsIG8yKToKKyAgICAgICAgIiIiaW50ZXJzZWN0aW9uIG9mIHR3byBjb2xsZWN0aW9ucy4KKyAgICAgICAgY29sbGVjdGlvbnMgYXJlIHJlcGxhY2VkIHdpdGggc2V0cyB0aGUgZmlyc3QgdGltZSIiIgorICAgICAgICBkZWYgY2FjaGVkX3NldChvLCBrZXkpOgorICAgICAgICAgICAgdiA9IG9ba2V5XQorICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uodiwgc2V0KToKKyAgICAgICAgICAgICAgICB2ID0gc2V0KHYpCisgICAgICAgICAgICAgICAgb1trZXldID0gdgorICAgICAgICAgICAgcmV0dXJuIHYKKyAgICAgICAgcmV0dXJuIGNhY2hlZF9zZXQobzEsIGtleSkgJiBjYWNoZWRfc2V0KG8yLCBrZXkpCisKKyAgICBkZWYgaW50ZXJzZWN0X3dpdGhfc3BlYyhrZXksIG8xLCBvMik6CisgICAgICAgICMgc3RvcmUgYXMgc2V0IG9mIChzcGVjLCBpbXBsKSB0dXBsZQorICAgICAgICBkZWYgY2FjaGVkX3NldChvKToKKyAgICAgICAgICAgIGRlZiB0b19zcGVjX2ltcGxfdHVwbGVzKHZhbHVlcyk6CisgICAgICAgICAgICAgICAgZm9yIHYgaW4gdmFsdWVzOgorICAgICAgICAgICAgICAgICAgICBzcGVjLCBfLCBpbXBsID0gdi5wYXJ0aXRpb24oJzonKQorICAgICAgICAgICAgICAgICAgICB5aWVsZCBzcGVjLCBpbXBsIG9yIHNwZWMKKyAgICAgICAgICAgIHYgPSBvW2tleV0KKyAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHYsIHNldCk6CisgICAgICAgICAgICAgICAgdiA9IHNldCh0b19zcGVjX2ltcGxfdHVwbGVzKHNldCh2KSkpCisgICAgICAgICAgICAgICAgb1trZXldID0gdgorICAgICAgICAgICAgcmV0dXJuIHYKKyAgICAgICAgZm9yIHNwZWMxLCBpbXBsMSBpbiBjYWNoZWRfc2V0KG8xKToKKyAgICAgICAgICAgIGZvciBzcGVjMiwgaW1wbDIgaW4gY2FjaGVkX3NldChvMik6CisgICAgICAgICAgICAgICAgaWYgc3BlYzEgPT0gc3BlYzI6CisgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBpbXBsMSBpZiBpbXBsMSA9PSBpbXBsMiBlbHNlICclcy0lcycgJSAoaW1wbDEsIGltcGwyKQorICAgICAgICAgICAgICAgICAgICB5aWVsZCBuYW1lLCBpbXBsMSwgaW1wbDIKKworICAgIGRlZiBtYXliZV9tYXgoa2V5LCBvMSwgbzIsIGRlZmF1bHQpOgorICAgICAgICAiIiJtYXhpbXVtIG9mIHR3byBpZiBwcmVzZW50LCBvdGhlcndpc2UgZGVmYXVsdCB2YWx1ZSIiIgorICAgICAgICB2MSA9IG8xLmdldChrZXkpCisgICAgICAgIHYyID0gbzIuZ2V0KGtleSkKKyAgICAgICAgcmV0dXJuIG1heCh2MSwgdjIpIGlmIHYxIGFuZCB2MiBlbHNlIHYxIG9yIHYyIG9yIGRlZmF1bHQKKworICAgIGRlZiBmaWx0ZXJfd2l0aF92YWxpZGtleXMobyk6CisgICAgICAgIHJldCA9IHt9CisgICAgICAgIGZvciBrZXkgaW4gVkFMSURfSlNPTl9LRVlTOgorICAgICAgICAgICAgaWYga2V5IGluIG86CisgICAgICAgICAgICAgICAgcmV0W2tleV0gPSBvW2tleV0KKyAgICAgICAgcmV0dXJuIHJldAorCisgICAgZGVmIG1lcmdlX21ldGFkYXRhKG8sICoqcmV0KToKKyAgICAgICAgZm9yIGtleSBpbiBWQUxJRF9KU09OX0tFWVM6CisgICAgICAgICAgICBpZiBrZXkgaW4gbzoKKyAgICAgICAgICAgICAgICByZXRba2V5XSA9IG9ba2V5XQorICAgICAgICByZXR1cm4gcmV0CisKKyAgICBmb3Igc3YsIGNsIGluIHByb2R1Y3Qoc2VydmVycywgY2xpZW50cyk6CisgICAgICAgIGZvciBwcm90bywgcHJvdG8xLCBwcm90bzIgaW4gaW50ZXJzZWN0X3dpdGhfc3BlYygncHJvdG9jb2xzJywgc3YsIGNsKToKKyAgICAgICAgICAgIGZvciB0cmFucywgdHJhbnMxLCB0cmFuczIgaW4gaW50ZXJzZWN0X3dpdGhfc3BlYygndHJhbnNwb3J0cycsIHN2LCBjbCk6CisgICAgICAgICAgICAgICAgZm9yIHNvY2sgaW4gaW50ZXJzZWN0aW9uKCdzb2NrZXRzJywgc3YsIGNsKToKKyAgICAgICAgICAgICAgICAgICAgeWllbGQgeworICAgICAgICAgICAgICAgICAgICAgICAgJ3NlcnZlcic6IG1lcmdlX21ldGFkYXRhKHN2LCAqKnsncHJvdG9jb2wnOiBwcm90bzEsICd0cmFuc3BvcnQnOiB0cmFuczF9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICdjbGllbnQnOiBtZXJnZV9tZXRhZGF0YShjbCwgKip7J3Byb3RvY29sJzogcHJvdG8yLCAndHJhbnNwb3J0JzogdHJhbnMyfSksCisgICAgICAgICAgICAgICAgICAgICAgICAnZGVsYXknOiBtYXliZV9tYXgoJ2RlbGF5Jywgc3YsIGNsLCBERUZBVUxUX01BWF9ERUxBWSksCisgICAgICAgICAgICAgICAgICAgICAgICAnc3RvcF9zaWduYWwnOiBtYXliZV9tYXgoJ3N0b3Bfc2lnbmFsJywgc3YsIGNsLCBERUZBVUxUX1NJR05BTCksCisgICAgICAgICAgICAgICAgICAgICAgICAndGltZW91dCc6IG1heWJlX21heCgndGltZW91dCcsIHN2LCBjbCwgREVGQVVMVF9USU1FT1VUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICdwcm90b2NvbCc6IHByb3RvLAorICAgICAgICAgICAgICAgICAgICAgICAgJ3RyYW5zcG9ydCc6IHRyYW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgJ3NvY2tldCc6IHNvY2sKKyAgICAgICAgICAgICAgICAgICAgfQorCisKK2RlZiBfZmlsdGVyX2VudHJpZXModGVzdHMsIHJlZ2V4KToKKyAgICBpZiByZWdleDoKKyAgICAgICAgcmV0dXJuIGZpbHRlcihsYW1iZGEgdDogcmUuc2VhcmNoKHJlZ2V4LCBUZXN0RW50cnkuZ2V0X25hbWUoKip0KSksIHRlc3RzKQorICAgIHJldHVybiB0ZXN0cworCisKK2RlZiBjb2xsZWN0X2Nyb3NzX3Rlc3RzKHRlc3RzX2RpY3QsIHNlcnZlcl9tYXRjaCwgY2xpZW50X21hdGNoLCByZWdleCk6CisgICAgc3YsIGNsID0gX2NvbGxlY3RfdGVzdGxpYnModGVzdHNfZGljdCwgc2VydmVyX21hdGNoLCBjbGllbnRfbWF0Y2gpCisgICAgcmV0dXJuIGxpc3QoX2ZpbHRlcl9lbnRyaWVzKF9kb19jb2xsZWN0X3Rlc3RzKHN2LCBjbCksIHJlZ2V4KSkKKworCitkZWYgY29sbGVjdF9mZWF0dXJlX3Rlc3RzKHRlc3RzX2RpY3QsIGZlYXR1cmVzX2RpY3QsIHNlcnZlcl9tYXRjaCwgZmVhdHVyZV9tYXRjaCwgcmVnZXgpOgorICAgIHN2LCBfID0gX2NvbGxlY3RfdGVzdGxpYnModGVzdHNfZGljdCwgc2VydmVyX21hdGNoKQorICAgIGZ0ID0gY29sbGVjdF9mZWF0dXJlcyhmZWF0dXJlc19kaWN0LCBmZWF0dXJlX21hdGNoKQorICAgIHJldHVybiBsaXN0KF9maWx0ZXJfZW50cmllcyhfZG9fY29sbGVjdF90ZXN0cyhzdiwgZnQpLCByZWdleCkpCmRpZmYgLS1naXQgYS90ZXN0L2Nyb3NzcnVubmVyL2NvbXBhdC5weSBiL3Rlc3QvY3Jvc3NydW5uZXIvY29tcGF0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxY2E5MWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2Nyb3NzcnVubmVyL2NvbXBhdC5weQpAQCAtMCwwICsxLDI0IEBACitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKKworaWYgc3lzLnZlcnNpb25faW5mb1swXSA9PSAyOgorICAgIF9FTkNPREUgPSBzeXMuZ2V0ZmlsZXN5c3RlbWVuY29kaW5nKCkKKworICAgIGRlZiBwYXRoX2pvaW4oKmFyZ3MpOgorICAgICAgICBiaW5fYXJncyA9IG1hcChsYW1iZGEgYTogYS5kZWNvZGUoX0VOQ09ERSksIGFyZ3MpCisgICAgICAgIHJldHVybiBvcy5wYXRoLmpvaW4oKmJpbl9hcmdzKS5lbmNvZGUoX0VOQ09ERSkKKworICAgIGRlZiBzdHJfam9pbihzLCBsKToKKyAgICAgICAgYmluX2FyZ3MgPSBtYXAobGFtYmRhIGE6IGEuZGVjb2RlKF9FTkNPREUpLCBsKQorICAgICAgICBiID0gcy5kZWNvZGUoX0VOQ09ERSkKKyAgICAgICAgcmV0dXJuIGIuam9pbihiaW5fYXJncykuZW5jb2RlKF9FTkNPREUpCisKKyAgICBsb2dmaWxlX29wZW4gPSBvcGVuCisKK2Vsc2U6CisKKyAgICBwYXRoX2pvaW4gPSBvcy5wYXRoLmpvaW4KKyAgICBzdHJfam9pbiA9IHN0ci5qb2luCisKKyAgICBkZWYgbG9nZmlsZV9vcGVuKCphcmdzKToKKyAgICAgICAgcmV0dXJuIG9wZW4oKmFyZ3MsIGVycm9ycz0ncmVwbGFjZScpCmRpZmYgLS1naXQgYS90ZXN0L2Nyb3NzcnVubmVyL3JlcG9ydC5weSBiL3Rlc3QvY3Jvc3NydW5uZXIvcmVwb3J0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViYWYxNjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2Nyb3NzcnVubmVyL3JlcG9ydC5weQpAQCAtMCwwICsxLDQ0MSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24KK2ltcG9ydCBkYXRldGltZQoraW1wb3J0IGpzb24KK2ltcG9ydCBtdWx0aXByb2Nlc3NpbmcKK2ltcG9ydCBvcworaW1wb3J0IHBsYXRmb3JtCitpbXBvcnQgcmUKK2ltcG9ydCBzdWJwcm9jZXNzCitpbXBvcnQgc3lzCitpbXBvcnQgdGltZQoraW1wb3J0IHRyYWNlYmFjaworCitmcm9tIC5jb21wYXQgaW1wb3J0IGxvZ2ZpbGVfb3BlbiwgcGF0aF9qb2luLCBzdHJfam9pbgorZnJvbSAudGVzdCBpbXBvcnQgVGVzdEVudHJ5CisKK0xPR19ESVIgPSAnbG9nJworUkVTVUxUX0hUTUwgPSAnaW5kZXguaHRtbCcKK1JFU1VMVF9KU09OID0gJ3Jlc3VsdHMuanNvbicKK0ZBSUxfSlNPTiA9ICdrbm93bl9mYWlsdXJlc18lcy5qc29uJworCisKK2RlZiBnZW5lcmF0ZV9rbm93bl9mYWlsdXJlcyh0ZXN0ZGlyLCBvdmVyd3JpdGUsIHNhdmUsIG91dCk6CisgICAgZGVmIGNvbGxlY3RfZmFpbHVyZXMocmVzdWx0cyk6CisgICAgICAgIHN1Y2Nlc3NfaW5kZXggPSA1CisgICAgICAgIGZvciByIGluIHJlc3VsdHM6CisgICAgICAgICAgICBpZiBub3QgcltzdWNjZXNzX2luZGV4XToKKyAgICAgICAgICAgICAgICB5aWVsZCBUZXN0RW50cnkuZ2V0X25hbWUoKnIpCisgICAgdHJ5OgorICAgICAgICB3aXRoIGxvZ2ZpbGVfb3BlbihwYXRoX2pvaW4odGVzdGRpciwgUkVTVUxUX0pTT04pLCAncicpIGFzIGZwOgorICAgICAgICAgICAgcmVzdWx0cyA9IGpzb24ubG9hZChmcCkKKyAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgnVW5hYmxlIHRvIGxvYWQgbGFzdCByZXN1bHQuIERpZCB5b3UgcnVuIHRlc3RzID9cbicpCisgICAgICAgIHJldHVybiBGYWxzZQorICAgIGZhaWxzID0gY29sbGVjdF9mYWlsdXJlcyhyZXN1bHRzWydyZXN1bHRzJ10pCisgICAgaWYgbm90IG92ZXJ3cml0ZToKKyAgICAgICAga25vd24gPSBsb2FkX2tub3duX2ZhaWx1cmVzKHRlc3RkaXIpCisgICAgICAgIGtub3duLmV4dGVuZChmYWlscykKKyAgICAgICAgZmFpbHMgPSBrbm93bgorICAgIGZhaWxzX2pzb24gPSBqc29uLmR1bXBzKHNvcnRlZChzZXQoZmFpbHMpKSwgaW5kZW50PTIsIHNlcGFyYXRvcnM9KCcsJywgJzogJykpCisgICAgaWYgc2F2ZToKKyAgICAgICAgd2l0aCBsb2dmaWxlX29wZW4ob3MucGF0aC5qb2luKHRlc3RkaXIsIEZBSUxfSlNPTiAlIHBsYXRmb3JtLnN5c3RlbSgpKSwgJ3crJykgYXMgZnA6CisgICAgICAgICAgICBmcC53cml0ZShmYWlsc19qc29uKQorICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCdTdWNjZXNzZnVsbHkgdXBkYXRlZCBrbm93biBmYWlsdXJlcy5cbicpCisgICAgaWYgb3V0OgorICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKGZhaWxzX2pzb24pCisgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoJ1xuJykKKyAgICByZXR1cm4gVHJ1ZQorCisKK2RlZiBsb2FkX2tub3duX2ZhaWx1cmVzKHRlc3RkaXIpOgorICAgIHRyeToKKyAgICAgICAgd2l0aCBsb2dmaWxlX29wZW4ocGF0aF9qb2luKHRlc3RkaXIsIEZBSUxfSlNPTiAlIHBsYXRmb3JtLnN5c3RlbSgpKSwgJ3InKSBhcyBmcDoKKyAgICAgICAgICAgIHJldHVybiBqc29uLmxvYWQoZnApCisgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgIHJldHVybiBbXQorCisKK2NsYXNzIFRlc3RSZXBvcnRlcihvYmplY3QpOgorICAgICMgVW5mb3J0dW5hdGVseSwgc3RhbmRhcmQgbGlicmFyeSBkb2Vzbid0IGhhbmRsZSB0aW1lem9uZSB3ZWxsCisgICAgIyBEQVRFVElNRV9GT1JNQVQgPSAnJWEgJWIgJWQgJUg6JU06JVMgJVogJVknCisgICAgREFURVRJTUVfRk9STUFUID0gJyVhICViICVkICVIOiVNOiVTICVZJworCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLl9sb2cgPSBtdWx0aXByb2Nlc3NpbmcuZ2V0X2xvZ2dlcigpCisgICAgICAgIHNlbGYuX2xvY2sgPSBtdWx0aXByb2Nlc3NpbmcuTG9jaygpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgdGVzdF9sb2dmaWxlKGNscywgdGVzdF9uYW1lLCBwcm9nX2tpbmQsIGRpcj1Ob25lKToKKyAgICAgICAgcmVscGF0aCA9IHBhdGhfam9pbignbG9nJywgJyVzXyVzLmxvZycgJSAodGVzdF9uYW1lLCBwcm9nX2tpbmQpKQorICAgICAgICByZXR1cm4gcmVscGF0aCBpZiBub3QgZGlyIGVsc2Ugb3MucGF0aC5yZWFscGF0aChwYXRoX2pvaW4oZGlyLCByZWxwYXRoKSkKKworICAgIGRlZiBfc3RhcnQoc2VsZik6CisgICAgICAgIHNlbGYuX3N0YXJ0X3RpbWUgPSB0aW1lLnRpbWUoKQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIF9lbGFwc2VkKHNlbGYpOgorICAgICAgICByZXR1cm4gdGltZS50aW1lKCkgLSBzZWxmLl9zdGFydF90aW1lCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgX2Zvcm1hdF9kYXRlKGNscyk6CisgICAgICAgIHJldHVybiAnJXMnICUgZGF0ZXRpbWUuZGF0ZXRpbWUubm93KCkuc3RyZnRpbWUoY2xzLkRBVEVUSU1FX0ZPUk1BVCkKKworICAgIGRlZiBfcHJpbnRfZGF0ZShzZWxmKToKKyAgICAgICAgcHJpbnQoc2VsZi5fZm9ybWF0X2RhdGUoKSwgZmlsZT1zZWxmLm91dCkKKworICAgIGRlZiBfcHJpbnRfYmFyKHNlbGYsIG91dD1Ob25lKToKKyAgICAgICAgcHJpbnQoCisgICAgICAgICAgICAnPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PScsCisgICAgICAgICAgICBmaWxlPShvdXQgb3Igc2VsZi5vdXQpKQorCisgICAgZGVmIF9wcmludF9leGVjX3RpbWUoc2VsZik6CisgICAgICAgIHByaW50KCdUZXN0IGV4ZWN1dGlvbiB0b29rIHs6LjFmfSBzZWNvbmRzLicuZm9ybWF0KHNlbGYuX2VsYXBzZWQpLCBmaWxlPXNlbGYub3V0KQorCisKK2NsYXNzIEV4ZWNSZXBvcnRlcihUZXN0UmVwb3J0ZXIpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0ZXN0ZGlyLCB0ZXN0LCBwcm9nKToKKyAgICAgICAgc3VwZXIoRXhlY1JlcG9ydGVyLCBzZWxmKS5fX2luaXRfXygpCisgICAgICAgIHNlbGYuX3Rlc3QgPSB0ZXN0CisgICAgICAgIHNlbGYuX3Byb2cgPSBwcm9nCisgICAgICAgIHNlbGYubG9ncGF0aCA9IHNlbGYudGVzdF9sb2dmaWxlKHRlc3QubmFtZSwgcHJvZy5raW5kLCB0ZXN0ZGlyKQorICAgICAgICBzZWxmLm91dCA9IE5vbmUKKworICAgIGRlZiBiZWdpbihzZWxmKToKKyAgICAgICAgc2VsZi5fc3RhcnQoKQorICAgICAgICBzZWxmLl9vcGVuKCkKKyAgICAgICAgaWYgc2VsZi5vdXQgYW5kIG5vdCBzZWxmLm91dC5jbG9zZWQ6CisgICAgICAgICAgICBzZWxmLl9wcmludF9oZWFkZXIoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fbG9nLmRlYnVnKCdPdXRwdXQgc3RyZWFtIGlzIG5vdCBhdmFpbGFibGUuJykKKworICAgIGRlZiBlbmQoc2VsZiwgcmV0dXJuY29kZSk6CisgICAgICAgIHNlbGYuX2xvY2suYWNxdWlyZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIHNlbGYub3V0IGFuZCBub3Qgc2VsZi5vdXQuY2xvc2VkOgorICAgICAgICAgICAgICAgIHNlbGYuX3ByaW50X2Zvb3RlcihyZXR1cm5jb2RlKQorICAgICAgICAgICAgICAgIHNlbGYuX2Nsb3NlKCkKKyAgICAgICAgICAgICAgICBzZWxmLm91dCA9IE5vbmUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5fbG9nLmRlYnVnKCdPdXRwdXQgc3RyZWFtIGlzIG5vdCBhdmFpbGFibGUuJykKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuX2xvY2sucmVsZWFzZSgpCisKKyAgICBkZWYga2lsbGVkKHNlbGYpOgorICAgICAgICBwcmludChmaWxlPXNlbGYub3V0KQorICAgICAgICBwcmludCgnU2VydmVyIHByb2Nlc3MgaXMgc3VjY2Vzc2Z1bGx5IGtpbGxlZC4nLCBmaWxlPXNlbGYub3V0KQorICAgICAgICBzZWxmLmVuZChOb25lKQorCisgICAgZGVmIGRpZWQoc2VsZik6CisgICAgICAgIHByaW50KGZpbGU9c2VsZi5vdXQpCisgICAgICAgIHByaW50KCcqKiogU2VydmVyIHByb2Nlc3MgaGFzIGRpZWQgdW5leHBlY3RlZGx5ICoqKicsIGZpbGU9c2VsZi5vdXQpCisgICAgICAgIHNlbGYuZW5kKE5vbmUpCisKKyAgICBfaW5pdF9mYWlsdXJlX2V4cHJzID0geworICAgICAgICAnc2VydmVyJzogbGlzdChtYXAocmUuY29tcGlsZSwgWworICAgICAgICAgICAgJ1tBYV1kZHJlc3MgYWxyZWFkeSBpbiB1c2UnLAorICAgICAgICAgICAgJ0NvdWxkIG5vdCBiaW5kJywKKyAgICAgICAgICAgICdFQUREUklOVVNFJywKKyAgICAgICAgXSkpLAorICAgICAgICAnY2xpZW50JzogbGlzdChtYXAocmUuY29tcGlsZSwgWworICAgICAgICAgICAgJ1tDY11vbm5lY3Rpb24gcmVmdXNlZCcsCisgICAgICAgICAgICAnQ291bGQgbm90IGNvbm5lY3QgdG8nLAorICAgICAgICAgICAgJ0NvdWxkIG5vdCBvcGVuIFVOSVggJywgICAgICAgIyBkb21haW4gc29ja2V0IChyYikKKyAgICAgICAgICAgICdFQ09OTlJFRlVTRUQnLAorICAgICAgICAgICAgJ2Vjb25ucmVmdXNlZCcsICAgICAgICAgICAgICAgIyBlcmwKKyAgICAgICAgICAgICdDT05ORUNUSU9OLVJFRlVTRUQtRVJST1InLCAgICMgY2wKKyAgICAgICAgICAgICdjb25uZWN0IEVOT0VOVCcsICAgICAgICAgICAgICMgbm9kZWpzIGRvbWFpbiBzb2NrZXQKKyAgICAgICAgICAgICdObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5JywgICMgZG9tYWluIHNvY2tldAorICAgICAgICAgICAgJ1NvY2tldHMuVGNwQ2xpZW50LkNvbm5lY3QnLCAgIyBjc2hhcnAKKyAgICAgICAgXSkpLAorICAgIH0KKworICAgIGRlZiBtYXliZV9mYWxzZV9wb3NpdGl2ZShzZWxmKToKKyAgICAgICAgIiIiU2VhcmNoZXMgdGhyb3VnaCBsb2cgZmlsZSBmb3Igc29ja2V0IGJpbmQgZXJyb3IuCisgICAgICAgIFJldHVybnMgVHJ1ZSBpZiBzdXNwaWNpb3VzIGV4cHJlc3Npb24gaXMgZm91bmQsIG90aGVyd2lzZSBGYWxzZSIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBzZWxmLm91dCBhbmQgbm90IHNlbGYub3V0LmNsb3NlZDoKKyAgICAgICAgICAgICAgICBzZWxmLm91dC5mbHVzaCgpCisgICAgICAgICAgICBleHBycyA9IHNlbGYuX2luaXRfZmFpbHVyZV9leHByc1tzZWxmLl9wcm9nLmtpbmRdCisKKyAgICAgICAgICAgIGRlZiBtYXRjaChsaW5lKToKKyAgICAgICAgICAgICAgICBmb3IgZXhwciBpbiBleHByczoKKyAgICAgICAgICAgICAgICAgICAgaWYgZXhwci5zZWFyY2gobGluZSk6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9sb2cuaW5mbygibWF5YmUgZmFsc2UgcG9zaXRpdmU6ICVzIiAlIGxpbmUpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgICAgICAgICB3aXRoIGxvZ2ZpbGVfb3BlbihzZWxmLmxvZ3BhdGgsICdyJykgYXMgZnA6CisgICAgICAgICAgICAgICAgaWYgYW55KG1hcChtYXRjaCwgZnApKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgZXhjZXB0IChLZXlib2FyZEludGVycnVwdCwgU3lzdGVtRXhpdCk6CisgICAgICAgICAgICByYWlzZQorICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGV4OgorICAgICAgICAgICAgc2VsZi5fbG9nLndhcm4oJ1slc106IEVycm9yIHdoaWxlIGRldGVjdGluZyBmYWxzZSBwb3NpdGl2ZTogJXMnICUgKHNlbGYuX3Rlc3QubmFtZSwgc3RyKGV4KSkpCisgICAgICAgICAgICBzZWxmLl9sb2cuaW5mbyh0cmFjZWJhY2sucHJpbnRfZXhjKCkpCisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZGVmIF9vcGVuKHNlbGYpOgorICAgICAgICBzZWxmLm91dCA9IGxvZ2ZpbGVfb3BlbihzZWxmLmxvZ3BhdGgsICd3KycpCisKKyAgICBkZWYgX2Nsb3NlKHNlbGYpOgorICAgICAgICBzZWxmLm91dC5jbG9zZSgpCisKKyAgICBkZWYgX3ByaW50X2hlYWRlcihzZWxmKToKKyAgICAgICAgc2VsZi5fcHJpbnRfZGF0ZSgpCisgICAgICAgIHByaW50KCdFeGVjdXRpbmc6ICVzJyAlIHN0cl9qb2luKCcgJywgc2VsZi5fcHJvZy5jb21tYW5kKSwgZmlsZT1zZWxmLm91dCkKKyAgICAgICAgcHJpbnQoJ0RpcmVjdG9yeTogJXMnICUgc2VsZi5fcHJvZy53b3JrZGlyLCBmaWxlPXNlbGYub3V0KQorICAgICAgICBwcmludCgnY29uZmlnOmRlbGF5OiAlcycgJSBzZWxmLl90ZXN0LmRlbGF5LCBmaWxlPXNlbGYub3V0KQorICAgICAgICBwcmludCgnY29uZmlnOnRpbWVvdXQ6ICVzJyAlIHNlbGYuX3Rlc3QudGltZW91dCwgZmlsZT1zZWxmLm91dCkKKyAgICAgICAgc2VsZi5fcHJpbnRfYmFyKCkKKyAgICAgICAgc2VsZi5vdXQuZmx1c2goKQorCisgICAgZGVmIF9wcmludF9mb290ZXIoc2VsZiwgcmV0dXJuY29kZT1Ob25lKToKKyAgICAgICAgc2VsZi5fcHJpbnRfYmFyKCkKKyAgICAgICAgaWYgcmV0dXJuY29kZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHByaW50KCdSZXR1cm4gY29kZTogJWQgKG5lZ2F0aXZlIHZhbHVlcyBpbmRpY2F0ZSBraWxsIGJ5IHNpZ25hbCknICUgcmV0dXJuY29kZSwgZmlsZT1zZWxmLm91dCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByaW50KCdQcm9jZXNzIGlzIGtpbGxlZC4nLCBmaWxlPXNlbGYub3V0KQorICAgICAgICBzZWxmLl9wcmludF9leGVjX3RpbWUoKQorICAgICAgICBzZWxmLl9wcmludF9kYXRlKCkKKworCitjbGFzcyBTdW1tYXJ5UmVwb3J0ZXIoVGVzdFJlcG9ydGVyKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgYmFzZWRpciwgdGVzdGRpcl9yZWxhdGl2ZSwgY29uY3VycmVudD1UcnVlKToKKyAgICAgICAgc3VwZXIoU3VtbWFyeVJlcG9ydGVyLCBzZWxmKS5fX2luaXRfXygpCisgICAgICAgIHNlbGYuX2Jhc2VkaXIgPSBiYXNlZGlyCisgICAgICAgIHNlbGYuX3Rlc3RkaXJfcmVsID0gdGVzdGRpcl9yZWxhdGl2ZQorICAgICAgICBzZWxmLmxvZ2RpciA9IHBhdGhfam9pbihzZWxmLnRlc3RkaXIsIExPR19ESVIpCisgICAgICAgIHNlbGYub3V0X3BhdGggPSBwYXRoX2pvaW4oc2VsZi50ZXN0ZGlyLCBSRVNVTFRfSlNPTikKKyAgICAgICAgc2VsZi5jb25jdXJyZW50ID0gY29uY3VycmVudAorICAgICAgICBzZWxmLm91dCA9IHN5cy5zdGRvdXQKKyAgICAgICAgc2VsZi5fcGxhdGZvcm0gPSBwbGF0Zm9ybS5zeXN0ZW0oKQorICAgICAgICBzZWxmLl9yZXZpc2lvbiA9IHNlbGYuX2dldF9yZXZpc2lvbigpCisgICAgICAgIHNlbGYuX3Rlc3RzID0gW10KKyAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHNlbGYubG9nZGlyKToKKyAgICAgICAgICAgIG9zLm1rZGlyKHNlbGYubG9nZGlyKQorICAgICAgICBzZWxmLl9rbm93bl9mYWlsdXJlcyA9IGxvYWRfa25vd25fZmFpbHVyZXMoc2VsZi50ZXN0ZGlyKQorICAgICAgICBzZWxmLl91bmV4cGVjdGVkX3N1Y2Nlc3MgPSBbXQorICAgICAgICBzZWxmLl9mbGFreV9zdWNjZXNzID0gW10KKyAgICAgICAgc2VsZi5fdW5leHBlY3RlZF9mYWlsdXJlID0gW10KKyAgICAgICAgc2VsZi5fZXhwZWN0ZWRfZmFpbHVyZSA9IFtdCisgICAgICAgIHNlbGYuX3ByaW50X2hlYWRlcigpCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgdGVzdGRpcihzZWxmKToKKyAgICAgICAgcmV0dXJuIHBhdGhfam9pbihzZWxmLl9iYXNlZGlyLCBzZWxmLl90ZXN0ZGlyX3JlbCkKKworICAgIGRlZiBfcmVzdWx0X3N0cmluZyhzZWxmLCB0ZXN0KToKKyAgICAgICAgaWYgdGVzdC5zdWNjZXNzOgorICAgICAgICAgICAgaWYgdGVzdC5yZXRyeV9jb3VudCA9PSAwOgorICAgICAgICAgICAgICAgIHJldHVybiAnc3VjY2VzcycKKyAgICAgICAgICAgIGVsaWYgdGVzdC5yZXRyeV9jb3VudCA9PSAxOgorICAgICAgICAgICAgICAgIHJldHVybiAnZmxha3koMSByZXRyeSknCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiAnZmxha3koJWQgcmV0cmllcyknICUgdGVzdC5yZXRyeV9jb3VudAorICAgICAgICBlbGlmIHRlc3QuZXhwaXJlZDoKKyAgICAgICAgICAgIHJldHVybiAnZmFpbHVyZSh0aW1lb3V0KScKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiAnZmFpbHVyZSglZCknICUgdGVzdC5yZXR1cm5jb2RlCisKKyAgICBkZWYgX2dldF9yZXZpc2lvbihzZWxmKToKKyAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oWydnaXQnLCAncmV2LXBhcnNlJywgJy0tc2hvcnQnLCAnSEVBRCddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjd2Q9c2VsZi50ZXN0ZGlyLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFKQorICAgICAgICBvdXQsIF8gPSBwLmNvbW11bmljYXRlKCkKKyAgICAgICAgcmV0dXJuIG91dC5zdHJpcCgpCisKKyAgICBkZWYgX2Zvcm1hdF90ZXN0KHNlbGYsIHRlc3QsIHdpdGhfcmVzdWx0PVRydWUpOgorICAgICAgICBuYW1lID0gJyVzLSVzJyAlICh0ZXN0LnNlcnZlci5uYW1lLCB0ZXN0LmNsaWVudC5uYW1lKQorICAgICAgICB0cmFucyA9ICclcy0lcycgJSAodGVzdC50cmFuc3BvcnQsIHRlc3Quc29ja2V0KQorICAgICAgICBpZiBub3Qgd2l0aF9yZXN1bHQ6CisgICAgICAgICAgICByZXR1cm4gJ3s6MjRzfXs6MThzfXs6MjVzfScuZm9ybWF0KG5hbWVbOjIzXSwgdGVzdC5wcm90b2NvbFs6MTddLCB0cmFuc1s6MjRdKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuICd7OjI0c317OjE4c317OjI1c317OnN9XG4nLmZvcm1hdChuYW1lWzoyM10sIHRlc3QucHJvdG9jb2xbOjE3XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNbOjI0XSwgc2VsZi5fcmVzdWx0X3N0cmluZyh0ZXN0KSkKKworICAgIGRlZiBfcHJpbnRfdGVzdF9oZWFkZXIoc2VsZik6CisgICAgICAgIHNlbGYuX3ByaW50X2JhcigpCisgICAgICAgIHByaW50KAorICAgICAgICAgICAgJ3s6MjRzfXs6MThzfXs6MjVzfXs6c30nLmZvcm1hdCgnc2VydmVyLWNsaWVudDonLCAncHJvdG9jb2w6JywgJ3RyYW5zcG9ydDonLCAncmVzdWx0OicpLAorICAgICAgICAgICAgZmlsZT1zZWxmLm91dCkKKworICAgIGRlZiBfcHJpbnRfaGVhZGVyKHNlbGYpOgorICAgICAgICBzZWxmLl9zdGFydCgpCisgICAgICAgIHByaW50KCdBcGFjaGUgVGhyaWZ0IC0gSW50ZWdyYXRpb24gVGVzdCBTdWl0ZScsIGZpbGU9c2VsZi5vdXQpCisgICAgICAgIHNlbGYuX3ByaW50X2RhdGUoKQorICAgICAgICBzZWxmLl9wcmludF90ZXN0X2hlYWRlcigpCisKKyAgICBkZWYgX3ByaW50X3VuZXhwZWN0ZWRfZmFpbHVyZShzZWxmKToKKyAgICAgICAgaWYgbGVuKHNlbGYuX3VuZXhwZWN0ZWRfZmFpbHVyZSkgPiAwOgorICAgICAgICAgICAgc2VsZi5vdXQud3JpdGVsaW5lcyhbCisgICAgICAgICAgICAgICAgJyoqKiBGb2xsb3dpbmcgJWQgZmFpbHVyZXMgd2VyZSB1bmV4cGVjdGVkICoqKjpcbicgJSBsZW4oc2VsZi5fdW5leHBlY3RlZF9mYWlsdXJlKSwKKyAgICAgICAgICAgICAgICAnSWYgaXQgaXMgaW50cm9kdWNlZCBieSB5b3UsIHBsZWFzZSBmaXggaXQgYmVmb3JlIHN1Ym1pdHRpbmcgdGhlIGNvZGUuXG4nLAorICAgICAgICAgICAgICAgICMgJ0lmIG5vdCwgcGxlYXNlIHJlcG9ydCBhdCBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVFxuJywKKyAgICAgICAgICAgIF0pCisgICAgICAgICAgICBzZWxmLl9wcmludF90ZXN0X2hlYWRlcigpCisgICAgICAgICAgICBmb3IgaSBpbiBzZWxmLl91bmV4cGVjdGVkX2ZhaWx1cmU6CisgICAgICAgICAgICAgICAgc2VsZi5vdXQud3JpdGUoc2VsZi5fZm9ybWF0X3Rlc3Qoc2VsZi5fdGVzdHNbaV0pKQorICAgICAgICAgICAgc2VsZi5fcHJpbnRfYmFyKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByaW50KCdObyB1bmV4cGVjdGVkIGZhaWx1cmVzLicsIGZpbGU9c2VsZi5vdXQpCisKKyAgICBkZWYgX3ByaW50X2ZsYWt5X3N1Y2Nlc3Moc2VsZik6CisgICAgICAgIGlmIGxlbihzZWxmLl9mbGFreV9zdWNjZXNzKSA+IDA6CisgICAgICAgICAgICBwcmludCgKKyAgICAgICAgICAgICAgICAnRm9sbG93aW5nICVkIHRlc3RzIHdlcmUgZXhwZWN0ZWQgdG8gY2xlYW5seSBzdWNjZWVkIGJ1dCBuZWVkZWQgcmV0cnk6JyAlIGxlbihzZWxmLl9mbGFreV9zdWNjZXNzKSwKKyAgICAgICAgICAgICAgICBmaWxlPXNlbGYub3V0KQorICAgICAgICAgICAgc2VsZi5fcHJpbnRfdGVzdF9oZWFkZXIoKQorICAgICAgICAgICAgZm9yIGkgaW4gc2VsZi5fZmxha3lfc3VjY2VzczoKKyAgICAgICAgICAgICAgICBzZWxmLm91dC53cml0ZShzZWxmLl9mb3JtYXRfdGVzdChzZWxmLl90ZXN0c1tpXSkpCisgICAgICAgICAgICBzZWxmLl9wcmludF9iYXIoKQorCisgICAgZGVmIF9wcmludF91bmV4cGVjdGVkX3N1Y2Nlc3Moc2VsZik6CisgICAgICAgIGlmIGxlbihzZWxmLl91bmV4cGVjdGVkX3N1Y2Nlc3MpID4gMDoKKyAgICAgICAgICAgIHByaW50KAorICAgICAgICAgICAgICAgICdGb2xsb3dpbmcgJWQgdGVzdHMgd2VyZSBrbm93biB0byBmYWlsIGJ1dCBzdWNjZWVkZWQgKG1heWJlIGZsYWt5KTonICUgbGVuKHNlbGYuX3VuZXhwZWN0ZWRfc3VjY2VzcyksCisgICAgICAgICAgICAgICAgZmlsZT1zZWxmLm91dCkKKyAgICAgICAgICAgIHNlbGYuX3ByaW50X3Rlc3RfaGVhZGVyKCkKKyAgICAgICAgICAgIGZvciBpIGluIHNlbGYuX3VuZXhwZWN0ZWRfc3VjY2VzczoKKyAgICAgICAgICAgICAgICBzZWxmLm91dC53cml0ZShzZWxmLl9mb3JtYXRfdGVzdChzZWxmLl90ZXN0c1tpXSkpCisgICAgICAgICAgICBzZWxmLl9wcmludF9iYXIoKQorCisgICAgZGVmIF9odHRwX3NlcnZlcl9jb21tYW5kKHNlbGYsIHBvcnQpOgorICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzBdIDwgMzoKKyAgICAgICAgICAgIHJldHVybiAncHl0aG9uIC1tIFNpbXBsZUhUVFBTZXJ2ZXIgJWQnICUgcG9ydAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuICdweXRob24gLW0gaHR0cC5zZXJ2ZXIgJWQnICUgcG9ydAorCisgICAgZGVmIF9wcmludF9mb290ZXIoc2VsZik6CisgICAgICAgIGZhaWxfY291bnQgPSBsZW4oc2VsZi5fZXhwZWN0ZWRfZmFpbHVyZSkgKyBsZW4oc2VsZi5fdW5leHBlY3RlZF9mYWlsdXJlKQorICAgICAgICBzZWxmLl9wcmludF9iYXIoKQorICAgICAgICBzZWxmLl9wcmludF91bmV4cGVjdGVkX3N1Y2Nlc3MoKQorICAgICAgICBzZWxmLl9wcmludF9mbGFreV9zdWNjZXNzKCkKKyAgICAgICAgc2VsZi5fcHJpbnRfdW5leHBlY3RlZF9mYWlsdXJlKCkKKyAgICAgICAgc2VsZi5fd3JpdGVfaHRtbF9kYXRhKCkKKyAgICAgICAgc2VsZi5fYXNzZW1ibGVfbG9nKCd1bmV4cGVjdGVkIGZhaWx1cmVzJywgc2VsZi5fdW5leHBlY3RlZF9mYWlsdXJlKQorICAgICAgICBzZWxmLl9hc3NlbWJsZV9sb2coJ2tub3duIGZhaWx1cmVzJywgc2VsZi5fZXhwZWN0ZWRfZmFpbHVyZSkKKyAgICAgICAgc2VsZi5vdXQud3JpdGVsaW5lcyhbCisgICAgICAgICAgICAnWW91IGNhbiBicm93c2UgcmVzdWx0cyBhdDpcbicsCisgICAgICAgICAgICAnXHRmaWxlOi8vJXMvJXNcbicgJSAoc2VsZi50ZXN0ZGlyLCBSRVNVTFRfSFRNTCksCisgICAgICAgICAgICAnIyBJZiB5b3UgdXNlIENocm9tZSwgcnVuOlxuJywKKyAgICAgICAgICAgICcjIFx0Y2QgJXNcbiNcdCVzXG4nICUgKHNlbGYuX2Jhc2VkaXIsIHNlbGYuX2h0dHBfc2VydmVyX2NvbW1hbmQoODAwMSkpLAorICAgICAgICAgICAgJyMgdGhlbiBicm93c2U6XG4nLAorICAgICAgICAgICAgJyMgXHRodHRwOi8vbG9jYWxob3N0OiVkLyVzL1xuJyAlICg4MDAxLCBzZWxmLl90ZXN0ZGlyX3JlbCksCisgICAgICAgICAgICAnRnVsbCBsb2cgZm9yIGVhY2ggdGVzdCBpcyBoZXJlOlxuJywKKyAgICAgICAgICAgICdcdHRlc3QvbG9nL3NlcnZlcl9jbGllbnRfcHJvdG9jb2xfdHJhbnNwb3J0X2NsaWVudC5sb2dcbicsCisgICAgICAgICAgICAnXHR0ZXN0L2xvZy9zZXJ2ZXJfY2xpZW50X3Byb3RvY29sX3RyYW5zcG9ydF9zZXJ2ZXIubG9nXG4nLAorICAgICAgICAgICAgJyVkIGZhaWxlZCBvZiAlZCB0ZXN0cyBpbiB0b3RhbC5cbicgJSAoZmFpbF9jb3VudCwgbGVuKHNlbGYuX3Rlc3RzKSksCisgICAgICAgIF0pCisgICAgICAgIHNlbGYuX3ByaW50X2V4ZWNfdGltZSgpCisgICAgICAgIHNlbGYuX3ByaW50X2RhdGUoKQorCisgICAgZGVmIF9yZW5kZXJfcmVzdWx0KHNlbGYsIHRlc3QpOgorICAgICAgICByZXR1cm4gWworICAgICAgICAgICAgdGVzdC5zZXJ2ZXIubmFtZSwKKyAgICAgICAgICAgIHRlc3QuY2xpZW50Lm5hbWUsCisgICAgICAgICAgICB0ZXN0LnByb3RvY29sLAorICAgICAgICAgICAgdGVzdC50cmFuc3BvcnQsCisgICAgICAgICAgICB0ZXN0LnNvY2tldCwKKyAgICAgICAgICAgIHRlc3Quc3VjY2VzcywKKyAgICAgICAgICAgIHRlc3QuYXNfZXhwZWN0ZWQsCisgICAgICAgICAgICB0ZXN0LnJldHVybmNvZGUsCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgJ3NlcnZlcic6IHNlbGYudGVzdF9sb2dmaWxlKHRlc3QubmFtZSwgdGVzdC5zZXJ2ZXIua2luZCksCisgICAgICAgICAgICAgICAgJ2NsaWVudCc6IHNlbGYudGVzdF9sb2dmaWxlKHRlc3QubmFtZSwgdGVzdC5jbGllbnQua2luZCksCisgICAgICAgICAgICB9LAorICAgICAgICBdCisKKyAgICBkZWYgX3dyaXRlX2h0bWxfZGF0YShzZWxmKToKKyAgICAgICAgIiIiV3JpdGVzIEpTT04gZGF0YSB0byBiZSByZWFkIGJ5IHJlc3VsdCBodG1sIiIiCisgICAgICAgIHJlc3VsdHMgPSBbc2VsZi5fcmVuZGVyX3Jlc3VsdChyKSBmb3IgciBpbiBzZWxmLl90ZXN0c10KKyAgICAgICAgd2l0aCBsb2dmaWxlX29wZW4oc2VsZi5vdXRfcGF0aCwgJ3crJykgYXMgZnA6CisgICAgICAgICAgICBmcC53cml0ZShqc29uLmR1bXBzKHsKKyAgICAgICAgICAgICAgICAnZGF0ZSc6IHNlbGYuX2Zvcm1hdF9kYXRlKCksCisgICAgICAgICAgICAgICAgJ3JldmlzaW9uJzogc3RyKHNlbGYuX3JldmlzaW9uKSwKKyAgICAgICAgICAgICAgICAncGxhdGZvcm0nOiBzZWxmLl9wbGF0Zm9ybSwKKyAgICAgICAgICAgICAgICAnZHVyYXRpb24nOiAnezouMWZ9Jy5mb3JtYXQoc2VsZi5fZWxhcHNlZCksCisgICAgICAgICAgICAgICAgJ3Jlc3VsdHMnOiByZXN1bHRzLAorICAgICAgICAgICAgfSwgaW5kZW50PTIpKQorCisgICAgZGVmIF9hc3NlbWJsZV9sb2coc2VsZiwgdGl0bGUsIGluZGV4ZXMpOgorICAgICAgICBpZiBsZW4oaW5kZXhlcykgPiAwOgorICAgICAgICAgICAgZGVmIGFkZF9wcm9nX2xvZyhmcCwgdGVzdCwgcHJvZ19raW5kKToKKyAgICAgICAgICAgICAgICBwcmludCgnKioqKioqKioqKioqKioqKioqKioqKioqKioqICVzIG1lc3NhZ2UgKioqKioqKioqKioqKioqKioqKioqKioqKioqJyAlIHByb2dfa2luZCwKKyAgICAgICAgICAgICAgICAgICAgICBmaWxlPWZwKQorICAgICAgICAgICAgICAgIHBhdGggPSBzZWxmLnRlc3RfbG9nZmlsZSh0ZXN0Lm5hbWUsIHByb2dfa2luZCwgc2VsZi50ZXN0ZGlyKQorICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHBhdGgpOgorICAgICAgICAgICAgICAgICAgICB3aXRoIGxvZ2ZpbGVfb3BlbihwYXRoLCAncicpIGFzIHByb2dfZnA6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludChwcm9nX2ZwLnJlYWQoKSwgZmlsZT1mcCkKKyAgICAgICAgICAgIGZpbGVuYW1lID0gdGl0bGUucmVwbGFjZSgnICcsICdfJykgKyAnLmxvZycKKyAgICAgICAgICAgIHdpdGggbG9nZmlsZV9vcGVuKG9zLnBhdGguam9pbihzZWxmLmxvZ2RpciwgZmlsZW5hbWUpLCAndysnKSBhcyBmcDoKKyAgICAgICAgICAgICAgICBmb3IgdGVzdCBpbiBtYXAoc2VsZi5fdGVzdHMuX19nZXRpdGVtX18sIGluZGV4ZXMpOgorICAgICAgICAgICAgICAgICAgICBmcC53cml0ZSgnVEVTVDogWyVzXVxuJyAlIHRlc3QubmFtZSkKKyAgICAgICAgICAgICAgICAgICAgYWRkX3Byb2dfbG9nKGZwLCB0ZXN0LCB0ZXN0LnNlcnZlci5raW5kKQorICAgICAgICAgICAgICAgICAgICBhZGRfcHJvZ19sb2coZnAsIHRlc3QsIHRlc3QuY2xpZW50LmtpbmQpCisgICAgICAgICAgICAgICAgICAgIGZwLndyaXRlKCcqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cbicpCisgICAgICAgICAgICBwcmludCgnJXMgYXJlIGxvZ2dlZCB0byAlcy8lcy8lcycgJSAodGl0bGUuY2FwaXRhbGl6ZSgpLCBzZWxmLl90ZXN0ZGlyX3JlbCwgTE9HX0RJUiwgZmlsZW5hbWUpKQorCisgICAgZGVmIGVuZChzZWxmKToKKyAgICAgICAgc2VsZi5fcHJpbnRfZm9vdGVyKCkKKyAgICAgICAgcmV0dXJuIGxlbihzZWxmLl91bmV4cGVjdGVkX2ZhaWx1cmUpID09IDAKKworICAgIGRlZiBhZGRfdGVzdChzZWxmLCB0ZXN0X2RpY3QpOgorICAgICAgICB0ZXN0ID0gVGVzdEVudHJ5KHNlbGYudGVzdGRpciwgKip0ZXN0X2RpY3QpCisgICAgICAgIHNlbGYuX2xvY2suYWNxdWlyZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLmNvbmN1cnJlbnQ6CisgICAgICAgICAgICAgICAgc2VsZi5vdXQud3JpdGUoc2VsZi5fZm9ybWF0X3Rlc3QodGVzdCwgRmFsc2UpKQorICAgICAgICAgICAgICAgIHNlbGYub3V0LmZsdXNoKCkKKyAgICAgICAgICAgIHNlbGYuX3Rlc3RzLmFwcGVuZCh0ZXN0KQorICAgICAgICAgICAgcmV0dXJuIGxlbihzZWxmLl90ZXN0cykgLSAxCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLl9sb2NrLnJlbGVhc2UoKQorCisgICAgZGVmIGFkZF9yZXN1bHQoc2VsZiwgaW5kZXgsIHJldHVybmNvZGUsIGV4cGlyZWQsIHJldHJ5X2NvdW50KToKKyAgICAgICAgc2VsZi5fbG9jay5hY3F1aXJlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZmFpbGVkID0gcmV0dXJuY29kZSBpcyBOb25lIG9yIHJldHVybmNvZGUgIT0gMAorICAgICAgICAgICAgZmxha3kgPSBub3QgZmFpbGVkIGFuZCByZXRyeV9jb3VudCAhPSAwCisgICAgICAgICAgICB0ZXN0ID0gc2VsZi5fdGVzdHNbaW5kZXhdCisgICAgICAgICAgICBrbm93biA9IHRlc3QubmFtZSBpbiBzZWxmLl9rbm93bl9mYWlsdXJlcworICAgICAgICAgICAgaWYgZmFpbGVkOgorICAgICAgICAgICAgICAgIGlmIGtub3duOgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9sb2cuZGVidWcoJyVzIGZhaWxlZCBhcyBleHBlY3RlZCcgJSB0ZXN0Lm5hbWUpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2V4cGVjdGVkX2ZhaWx1cmUuYXBwZW5kKGluZGV4KQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2xvZy5pbmZvKCd1bmV4cGVjdGVkIGZhaWx1cmU6ICVzJyAlIHRlc3QubmFtZSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fdW5leHBlY3RlZF9mYWlsdXJlLmFwcGVuZChpbmRleCkKKyAgICAgICAgICAgIGVsaWYgZmxha3kgYW5kIG5vdCBrbm93bjoKKyAgICAgICAgICAgICAgICBzZWxmLl9sb2cuaW5mbygndW5leHBlY3RlZCBmbGFreSBzdWNjZXNzOiAlcycgJSB0ZXN0Lm5hbWUpCisgICAgICAgICAgICAgICAgc2VsZi5fZmxha3lfc3VjY2Vzcy5hcHBlbmQoaW5kZXgpCisgICAgICAgICAgICBlbGlmIG5vdCBmbGFreSBhbmQga25vd246CisgICAgICAgICAgICAgICAgc2VsZi5fbG9nLmluZm8oJ3VuZXhwZWN0ZWQgc3VjY2VzczogJXMnICUgdGVzdC5uYW1lKQorICAgICAgICAgICAgICAgIHNlbGYuX3VuZXhwZWN0ZWRfc3VjY2Vzcy5hcHBlbmQoaW5kZXgpCisgICAgICAgICAgICB0ZXN0LnN1Y2Nlc3MgPSBub3QgZmFpbGVkCisgICAgICAgICAgICB0ZXN0LnJldHVybmNvZGUgPSByZXR1cm5jb2RlCisgICAgICAgICAgICB0ZXN0LnJldHJ5X2NvdW50ID0gcmV0cnlfY291bnQKKyAgICAgICAgICAgIHRlc3QuZXhwaXJlZCA9IGV4cGlyZWQKKyAgICAgICAgICAgIHRlc3QuYXNfZXhwZWN0ZWQgPSBrbm93biA9PSBmYWlsZWQKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLmNvbmN1cnJlbnQ6CisgICAgICAgICAgICAgICAgc2VsZi5vdXQud3JpdGUoc2VsZi5fcmVzdWx0X3N0cmluZyh0ZXN0KSArICdcbicpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYub3V0LndyaXRlKHNlbGYuX2Zvcm1hdF90ZXN0KHRlc3QpKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5fbG9jay5yZWxlYXNlKCkKZGlmZiAtLWdpdCBhL3Rlc3QvY3Jvc3NydW5uZXIvcnVuLnB5IGIvdGVzdC9jcm9zc3J1bm5lci9ydW4ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY4ZmI2MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY3Jvc3NydW5uZXIvcnVuLnB5CkBAIC0wLDAgKzEsNDI1IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworaW1wb3J0IGNvbnRleHRsaWIKK2ltcG9ydCBtdWx0aXByb2Nlc3NpbmcKK2ltcG9ydCBtdWx0aXByb2Nlc3NpbmcubWFuYWdlcnMKK2ltcG9ydCBvcworaW1wb3J0IHBsYXRmb3JtCitpbXBvcnQgcmFuZG9tCitpbXBvcnQgc29ja2V0CitpbXBvcnQgc3VicHJvY2VzcworaW1wb3J0IHN5cworaW1wb3J0IHRpbWUKKworZnJvbSAuY29tcGF0IGltcG9ydCBzdHJfam9pbgorZnJvbSAucmVwb3J0IGltcG9ydCBFeGVjUmVwb3J0ZXIsIFN1bW1hcnlSZXBvcnRlcgorZnJvbSAudGVzdCBpbXBvcnQgVGVzdEVudHJ5Citmcm9tIC51dGlsIGltcG9ydCBkb21haW5fc29ja2V0X3BhdGgKKworUkVTVUxUX0VSUk9SID0gNjQKK1JFU1VMVF9USU1FT1VUID0gMTI4CitTSUdOT05FID0gMAorU0lHS0lMTCA9IDE1CisKKyMgZ2xvYmFscworcG9ydHMgPSBOb25lCitzdG9wID0gTm9uZQorCisKK2NsYXNzIEV4ZWN1dGlvbkNvbnRleHQob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY21kLCBjd2QsIGVudiwgc3RvcF9zaWduYWwsIGlzX3NlcnZlciwgcmVwb3J0KToKKyAgICAgICAgc2VsZi5fbG9nID0gbXVsdGlwcm9jZXNzaW5nLmdldF9sb2dnZXIoKQorICAgICAgICBzZWxmLmNtZCA9IGNtZAorICAgICAgICBzZWxmLmN3ZCA9IGN3ZAorICAgICAgICBzZWxmLmVudiA9IGVudgorICAgICAgICBzZWxmLnN0b3Bfc2lnbmFsID0gc3RvcF9zaWduYWwKKyAgICAgICAgc2VsZi5pc19zZXJ2ZXIgPSBpc19zZXJ2ZXIKKyAgICAgICAgc2VsZi5yZXBvcnQgPSByZXBvcnQKKyAgICAgICAgc2VsZi5leHBpcmVkID0gRmFsc2UKKyAgICAgICAgc2VsZi5raWxsZWQgPSBGYWxzZQorICAgICAgICBzZWxmLnByb2MgPSBOb25lCisKKyAgICBkZWYgX3BvcGVuX2FyZ3Moc2VsZik6CisgICAgICAgIGFyZ3MgPSB7CisgICAgICAgICAgICAnY3dkJzogc2VsZi5jd2QsCisgICAgICAgICAgICAnZW52Jzogc2VsZi5lbnYsCisgICAgICAgICAgICAnc3Rkb3V0Jzogc2VsZi5yZXBvcnQub3V0LAorICAgICAgICAgICAgJ3N0ZGVycic6IHN1YnByb2Nlc3MuU1RET1VULAorICAgICAgICB9CisgICAgICAgICMgbWFrZSBzdXJlIGNoaWxkIHByb2Nlc3NlcyBkb2Vzbid0IHJlbWFpbiBhZnRlciBraWxsaW5nCisgICAgICAgIGlmIHBsYXRmb3JtLnN5c3RlbSgpID09ICdXaW5kb3dzJzoKKyAgICAgICAgICAgIERFVEFDSEVEX1BST0NFU1MgPSAweDAwMDAwMDA4CisgICAgICAgICAgICBhcmdzLnVwZGF0ZShjcmVhdGlvbmZsYWdzPURFVEFDSEVEX1BST0NFU1MgfCBzdWJwcm9jZXNzLkNSRUFURV9ORVdfUFJPQ0VTU19HUk9VUCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGFyZ3MudXBkYXRlKHByZWV4ZWNfZm49b3Muc2V0c2lkKQorICAgICAgICByZXR1cm4gYXJncworCisgICAgZGVmIHN0YXJ0KHNlbGYpOgorICAgICAgICBqb2luZWQgPSBzdHJfam9pbignICcsIHNlbGYuY21kKQorICAgICAgICBzZWxmLl9sb2cuZGVidWcoJ0NPTU1BTkQ6ICVzJywgam9pbmVkKQorICAgICAgICBzZWxmLl9sb2cuZGVidWcoJ1dPUktESVI6ICVzJywgc2VsZi5jd2QpCisgICAgICAgIHNlbGYuX2xvZy5kZWJ1ZygnTE9HRklMRTogJXMnLCBzZWxmLnJlcG9ydC5sb2dwYXRoKQorICAgICAgICBzZWxmLnJlcG9ydC5iZWdpbigpCisgICAgICAgIHNlbGYucHJvYyA9IHN1YnByb2Nlc3MuUG9wZW4oc2VsZi5jbWQsICoqc2VsZi5fcG9wZW5fYXJncygpKQorICAgICAgICBzZWxmLl9sb2cuZGVidWcoJyAgICBQSUQ6ICVkJywgc2VsZi5wcm9jLnBpZCkKKyAgICAgICAgc2VsZi5fbG9nLmRlYnVnKCcgICBQR0lEOiAlZCcsIG9zLmdldHBnaWQoc2VsZi5wcm9jLnBpZCkpCisgICAgICAgIHJldHVybiBzZWxmLl9zY29wZWQoKQorCisgICAgQGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKKyAgICBkZWYgX3Njb3BlZChzZWxmKToKKyAgICAgICAgeWllbGQgc2VsZgorICAgICAgICBpZiBzZWxmLmlzX3NlcnZlcjoKKyAgICAgICAgICAgICMgdGhlIHNlcnZlciBpcyBzdXBwb3NlZCB0byBydW4gdW50aWwgd2Ugc3RvcCBpdAorICAgICAgICAgICAgaWYgc2VsZi5yZXR1cm5jb2RlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHNlbGYucmVwb3J0LmRpZWQoKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLnN0b3Bfc2lnbmFsICE9IFNJR05PTkU6CisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuc2lnd2FpdChzZWxmLnN0b3Bfc2lnbmFsKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVwb3J0LmVuZChzZWxmLnJldHVybmNvZGUpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlcG9ydC5raWxsZWQoKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc2lnd2FpdChTSUdLSUxMKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyB0aGUgY2xpZW50IGlzIHN1cHBvc2VkIHRvIGV4aXQgbm9ybWFsbHkKKyAgICAgICAgICAgIGlmIHNlbGYucmV0dXJuY29kZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBzZWxmLnJlcG9ydC5lbmQoc2VsZi5yZXR1cm5jb2RlKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLnNpZ3dhaXQoU0lHS0lMTCkKKyAgICAgICAgICAgICAgICBzZWxmLnJlcG9ydC5raWxsZWQoKQorICAgICAgICBzZWxmLl9sb2cuZGVidWcoJ1t7MH1dIGV4aXRlZCB3aXRoIHJldHVybiBjb2RlIHsxfScuZm9ybWF0KHNlbGYucHJvYy5waWQsIHNlbGYucmV0dXJuY29kZSkpCisKKyAgICAjIFNlbmQgYSBzaWduYWwgdG8gdGhlIHByb2Nlc3MgYW5kIHRoZW4gd2FpdCBmb3IgaXQgdG8gZW5kCisgICAgIyBJZiB0aGUgc2lnbmFsIHJlcXVlc3RlZCBpcyBTSUdOT05FLCBubyBzaWduYWwgaXMgc2VudCwgYW5kCisgICAgIyBpbnN0ZWFkIHdlIGp1c3Qgd2FpdCBmb3IgdGhlIHByb2Nlc3MgdG8gZW5kOyBmdXJ0aGVyIGlmIGl0CisgICAgIyBkb2VzIG5vdCBlbmQgbm9ybWFsbHkgd2l0aCBTSUdOT05FLCB3ZSBtYXJrIGl0IGFzIGV4cGlyZWQuCisgICAgIyBJZiB0aGUgcHJvY2VzcyBmYWlscyB0byBlbmQgYW5kIHRoZSBzaWduYWwgaXMgbm90IFNJR0tJTEwsCisgICAgIyBpdCByZS1ydW5zIHdpdGggU0lHS0lMTCBzbyB0aGF0IGEgcmVhbCBwcm9jZXNzIGtpbGwgb2NjdXJzCisgICAgIyByZXR1cm5zIFRydWUgaWYgdGhlIHByb2Nlc3MgZW5kZWQsIEZhbHNlIGlmIGl0IG1heSBub3QgaGF2ZQorICAgIGRlZiBzaWd3YWl0KHNlbGYsIHNpZz1TSUdLSUxMLCB0aW1lb3V0PTIpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBzaWcgIT0gU0lHTk9ORToKKyAgICAgICAgICAgICAgICBzZWxmLl9sb2cuZGVidWcoJ1t7MH1dIHNlbmQgc2lnbmFsIHsxfScuZm9ybWF0KHNlbGYucHJvYy5waWQsIHNpZykpCisgICAgICAgICAgICAgICAgaWYgc2lnID09IFNJR0tJTEw6CisgICAgICAgICAgICAgICAgICAgIHNlbGYua2lsbGVkID0gVHJ1ZQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgaWYgcGxhdGZvcm0uc3lzdGVtKCkgIT0gJ1dpbmRvd3MnOgorICAgICAgICAgICAgICAgICAgICAgICAgb3Mua2lsbHBnKG9zLmdldHBnaWQoc2VsZi5wcm9jLnBpZCksIHNpZykKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucHJvYy5zZW5kX3NpZ25hbChzaWcpCisgICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fbG9nLmluZm8oJ1t7MH1dIEZhaWxlZCB0byBraWxsIHByb2Nlc3MnLmZvcm1hdChzZWxmLnByb2MucGlkKSwgZXhjX2luZm89c3lzLmV4Y19pbmZvKCkpCisgICAgICAgICAgICBzZWxmLl9sb2cuZGVidWcoJ1t7MH1dIHdhaXQgYmVnaW4sIHRpbWVvdXQgezF9IHNlYyhzKScuZm9ybWF0KHNlbGYucHJvYy5waWQsIHRpbWVvdXQpKQorICAgICAgICAgICAgc2VsZi5wcm9jLmNvbW11bmljYXRlKHRpbWVvdXQ9dGltZW91dCkKKyAgICAgICAgICAgIHNlbGYuX2xvZy5kZWJ1ZygnW3swfV0gcHJvY2VzcyBlbmRlZCB3aXRoIHJldHVybiBjb2RlIHsxfScuZm9ybWF0KHNlbGYucHJvYy5waWQsIHNlbGYucmV0dXJuY29kZSkpCisgICAgICAgICAgICBzZWxmLnJlcG9ydC5lbmQoc2VsZi5yZXR1cm5jb2RlKQorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgZXhjZXB0IHN1YnByb2Nlc3MuVGltZW91dEV4cGlyZWQ6CisgICAgICAgICAgICBzZWxmLl9sb2cuaW5mbygnW3swfV0gdGltZW91dCB3YWl0aW5nIGZvciBwcm9jZXNzIHRvIGVuZCcuZm9ybWF0KHNlbGYucHJvYy5waWQpKQorICAgICAgICAgICAgaWYgc2lnID09IFNJR05PTkU6CisgICAgICAgICAgICAgICAgc2VsZi5leHBpcmVkID0gVHJ1ZQorICAgICAgICAgICAgcmV0dXJuIEZhbHNlIGlmIHNpZyA9PSBTSUdLSUxMIGVsc2Ugc2VsZi5zaWd3YWl0KFNJR0tJTEwsIDEpCisKKyAgICAjIGNhbGxlZCBvbiB0aGUgY2xpZW50IHByb2Nlc3MgdG8gd2FpdCBmb3IgaXQgdG8gZW5kIG5hdHVyYWxseQorICAgIGRlZiB3YWl0KHNlbGYsIHRpbWVvdXQpOgorICAgICAgICBzZWxmLnNpZ3dhaXQoU0lHTk9ORSwgdGltZW91dCkKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiByZXR1cm5jb2RlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5wcm9jLnJldHVybmNvZGUgaWYgc2VsZi5wcm9jIGVsc2UgTm9uZQorCisKK2RlZiBleGVjX2NvbnRleHQocG9ydCwgbG9nZGlyLCB0ZXN0LCBwcm9nLCBpc19zZXJ2ZXIpOgorICAgIHJlcG9ydCA9IEV4ZWNSZXBvcnRlcihsb2dkaXIsIHRlc3QsIHByb2cpCisgICAgcHJvZy5idWlsZF9jb21tYW5kKHBvcnQpCisgICAgcmV0dXJuIEV4ZWN1dGlvbkNvbnRleHQocHJvZy5jb21tYW5kLCBwcm9nLndvcmtkaXIsIHByb2cuZW52LCBwcm9nLnN0b3Bfc2lnbmFsLCBpc19zZXJ2ZXIsIHJlcG9ydCkKKworCitkZWYgcnVuX3Rlc3QodGVzdGRpciwgbG9nZGlyLCB0ZXN0X2RpY3QsIG1heF9yZXRyeSwgYXN5bmNfbW9kZT1UcnVlKToKKyAgICBsb2dnZXIgPSBtdWx0aXByb2Nlc3NpbmcuZ2V0X2xvZ2dlcigpCisKKyAgICBkZWYgZW5zdXJlX3NvY2tldF9vcGVuKHN2LCBwb3J0LCB0ZXN0KToKKyAgICAgICAgc2xlcHQgPSAwLjEKKyAgICAgICAgdGltZS5zbGVlcChzbGVwdCkKKyAgICAgICAgc2xlZXBfc3RlcCA9IDAuMQorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgaWYgc2xlcHQgPiB0ZXN0LmRlbGF5OgorICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCdbezB9XSBzbGVwdCBmb3IgezF9IHNlY29uZHMgYnV0IHNlcnZlciBpcyBub3Qgb3BlbicuZm9ybWF0KHN2LnByb2MucGlkLCBzbGVwdCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgICAgICBpZiB0ZXN0LnNvY2tldCA9PSAnZG9tYWluJzoKKyAgICAgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoZG9tYWluX3NvY2tldF9wYXRoKHBvcnQpKToKKyAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdbezB9XSBkb21haW4odW5peCkgc29ja2V0IG5vdCBhdmFpbGFibGUgeWV0LiBzbGVwdCBmb3IgezF9IHNlY29uZHMgc28gZmFyJy5mb3JtYXQoc3YucHJvYy5waWQsIHNsZXB0KSkKKyAgICAgICAgICAgICAgICAgICAgdGltZS5zbGVlcChzbGVlcF9zdGVwKQorICAgICAgICAgICAgICAgICAgICBzbGVwdCArPSBzbGVlcF9zdGVwCisgICAgICAgICAgICBlbGlmIHRlc3Quc29ja2V0ID09ICdhYnN0cmFjdCc6CisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBDcmVhdGUgc29ja2V0cyBldmVyeSBpdGVyYXRpb24gYmVjYXVzZSByZWZ1c2VkIHNvY2tldHMgY2Fubm90IGJlCisgICAgICAgICAgICAgICAgIyByZXVzZWQgb24gc29tZSBzeXN0ZW1zLgorICAgICAgICAgICAgICAgIHNvY2s0ID0gc29ja2V0LnNvY2tldCgpCisgICAgICAgICAgICAgICAgc29jazYgPSBzb2NrZXQuc29ja2V0KGZhbWlseT1zb2NrZXQuQUZfSU5FVDYpCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBpZiBzb2NrNC5jb25uZWN0X2V4KCgnMTI3LjAuMC4xJywgcG9ydCkpID09IDAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIHNvY2s2LmNvbm5lY3RfZXgoKCc6OjEnLCBwb3J0KSkgPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgICAgICAgICAgICAgIGlmIHN2LnByb2MucG9sbCgpIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oJ1t7MH1dIHNlcnZlciBwcm9jZXNzIGlzIGV4aXRlZCcuZm9ybWF0KHN2LnByb2MucGlkKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1t7MH1dIHNvY2tldCBub3QgYXZhaWxhYmxlIHlldC4gc2xlcHQgZm9yIHsxfSBzZWNvbmRzIHNvIGZhcicuZm9ybWF0KHN2LnByb2MucGlkLCBzbGVwdCkpCisgICAgICAgICAgICAgICAgICAgIHRpbWUuc2xlZXAoc2xlZXBfc3RlcCkKKyAgICAgICAgICAgICAgICAgICAgc2xlcHQgKz0gc2xlZXBfc3RlcAorICAgICAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgICAgIHNvY2s0LmNsb3NlKCkKKyAgICAgICAgICAgICAgICAgICAgc29jazYuY2xvc2UoKQorICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdbezB9XSBzZXJ2ZXIgcmVhZHkgLSB3YWl0ZWQgZm9yIHsxfSBzZWNvbmRzJy5mb3JtYXQoc3YucHJvYy5waWQsIHNsZXB0KSkKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisKKyAgICB0cnk6CisgICAgICAgIG1heF9iaW5kX3JldHJ5ID0gMworICAgICAgICByZXRyeV9jb3VudCA9IDAKKyAgICAgICAgYmluZF9yZXRyeV9jb3VudCA9IDAKKyAgICAgICAgdGVzdCA9IFRlc3RFbnRyeSh0ZXN0ZGlyLCAqKnRlc3RfZGljdCkKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIGlmIHN0b3AuaXNfc2V0KCk6CisgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdTa2lwcGluZyBiZWNhdXNlIHNodXR0aW5nIGRvd24nKQorICAgICAgICAgICAgICAgIHJldHVybiAocmV0cnlfY291bnQsIE5vbmUpCisgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1N0YXJ0JykKKyAgICAgICAgICAgIHdpdGggUG9ydEFsbG9jYXRvci5hbGxvY19wb3J0X3Njb3BlZChwb3J0cywgdGVzdC5zb2NrZXQpIGFzIHBvcnQ6CisgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdTdGFydCB3aXRoIHBvcnQgJWQnICUgcG9ydCkKKyAgICAgICAgICAgICAgICBzdiA9IGV4ZWNfY29udGV4dChwb3J0LCBsb2dkaXIsIHRlc3QsIHRlc3Quc2VydmVyLCBUcnVlKQorICAgICAgICAgICAgICAgIGNsID0gZXhlY19jb250ZXh0KHBvcnQsIGxvZ2RpciwgdGVzdCwgdGVzdC5jbGllbnQsIEZhbHNlKQorCisgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdTdGFydGluZyBzZXJ2ZXInKQorICAgICAgICAgICAgICAgIHdpdGggc3Yuc3RhcnQoKToKKyAgICAgICAgICAgICAgICAgICAgcG9ydF9vayA9IGVuc3VyZV9zb2NrZXRfb3BlbihzdiwgcG9ydCwgdGVzdCkKKyAgICAgICAgICAgICAgICAgICAgaWYgcG9ydF9vazoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RfcmV0cnlfY291bnQgPSAwCisgICAgICAgICAgICAgICAgICAgICAgICBtYXhfY29ubmVjdF9yZXRyeSA9IDEyCisgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0X3JldHJ5X3dhaXQgPSAwLjI1CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHN2LnByb2MucG9sbCgpIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygnbm90IHN0YXJ0aW5nIGNsaWVudCBiZWNhdXNlIHNlcnZlciBwcm9jZXNzIGlzIGFic2VudCcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdTdGFydGluZyBjbGllbnQnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsLnN0YXJ0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1dhaXRpbmcgY2xpZW50ICh1cCB0byAlZCBzZWNzKScgJSB0ZXN0LnRpbWVvdXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2wud2FpdCh0ZXN0LnRpbWVvdXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IGNsLnJlcG9ydC5tYXliZV9mYWxzZV9wb3NpdGl2ZSgpIG9yIGNvbm5lY3RfcmV0cnlfY291bnQgPj0gbWF4X2Nvbm5lY3RfcmV0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGNvbm5lY3RfcmV0cnlfY291bnQgPiAwIGFuZCBjb25uZWN0X3JldHJ5X2NvdW50IDwgbWF4X2Nvbm5lY3RfcmV0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygnWyVzXTogQ29ubmVjdGVkIGFmdGVyICVkIHJldHJ5ICglLjJmIHNlYyBlYWNoKScgJSAodGVzdC5zZXJ2ZXIubmFtZSwgY29ubmVjdF9yZXRyeV9jb3VudCwgY29ubmVjdF9yZXRyeV93YWl0KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBXYWl0IGZvciA1MG1zIHRvIHNlZSBpZiBzZXJ2ZXIgZG9lcyBub3QgZGllIGF0IHRoZSBlbmQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUuc2xlZXAoMC4wNSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1NlcnZlciBtYXkgbm90IGJlIHJlYWR5LCB3YWl0aW5nICUuMmYgc2Vjb25kLi4uJyAlIGNvbm5lY3RfcmV0cnlfd2FpdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lLnNsZWVwKGNvbm5lY3RfcmV0cnlfd2FpdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0X3JldHJ5X2NvdW50ICs9IDEKKworICAgICAgICAgICAgaWYgc3YucmVwb3J0Lm1heWJlX2ZhbHNlX3Bvc2l0aXZlKCkgYW5kIGJpbmRfcmV0cnlfY291bnQgPCBtYXhfYmluZF9yZXRyeToKKyAgICAgICAgICAgICAgICBsb2dnZXIud2FybignWyVzXTogRGV0ZWN0ZWQgc29ja2V0IGJpbmQgZmFpbHVyZSwgcmV0cnlpbmcuLi4nLCB0ZXN0LnNlcnZlci5uYW1lKQorICAgICAgICAgICAgICAgIGJpbmRfcmV0cnlfY291bnQgKz0gMQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBSRVNVTFRfVElNRU9VVCBpZiBjbC5leHBpcmVkIGVsc2UgY2wucmV0dXJuY29kZSBpZiAoY2wucHJvYyBhbmQgY2wucHJvYy5wb2xsKCkpIGlzIG5vdCBOb25lIGVsc2UgUkVTVUxUX0VSUk9SCisKKyAgICAgICAgICAgICAgICAjIEZvciBzZXJ2ZXJzIHRoYXQgaGFuZGxlIGEgY29udHJvbGxlZCBzaHV0ZG93biBieSBzaWduYWwKKyAgICAgICAgICAgICAgICAjIGlmIHRoZXkgYXJlIGtpbGxlZCwgb3IgcmV0dXJuIGFuIGVycm9yIGNvZGUsIHRoYXQgaXMgYQorICAgICAgICAgICAgICAgICMgcHJvYmxlbS4gIEZvciBzZXJ2ZXJzIHRoYXQgYXJlIG5vdCBzaWduYWwtYXdhcmUsIHdlIHNpbXBseQorICAgICAgICAgICAgICAgICMga2lsbCB0aGVtIG9mZjsgaWYgd2UgZGlkbid0IGtpbGwgdGhlbSBvZmYsIHNvbWV0aGluZyBlbHNlCisgICAgICAgICAgICAgICAgIyBoYXBwZW5lZCAoY3Jhc2hlZD8pCisgICAgICAgICAgICAgICAgaWYgdGVzdC5zZXJ2ZXIuc3RvcF9zaWduYWwgIT0gMDoKKyAgICAgICAgICAgICAgICAgICAgaWYgc3Yua2lsbGVkIG9yIHN2LnJldHVybmNvZGUgPiAwOgorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0IHw9IFJFU1VMVF9FUlJPUgorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBzdi5raWxsZWQ6CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgfD0gUkVTVUxUX0VSUk9SCisKKyAgICAgICAgICAgICAgICBpZiByZXN1bHQgPT0gMCBvciByZXRyeV9jb3VudCA+PSBtYXhfcmV0cnk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAocmV0cnlfY291bnQsIHJlc3VsdCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygnWyVzLSVzXTogdGVzdCBmYWlsZWQsIHJldHJ5aW5nLi4uJywgdGVzdC5zZXJ2ZXIubmFtZSwgdGVzdC5jbGllbnQubmFtZSkKKyAgICAgICAgICAgICAgICAgICAgcmV0cnlfY291bnQgKz0gMQorICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgIGlmIG5vdCBhc3luY19tb2RlOgorICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgbG9nZ2VyLndhcm4oJ0Vycm9yIGV4ZWN1dGluZyBbJXNdJywgdGVzdC5uYW1lLCBleGNfaW5mbz1UcnVlKQorICAgICAgICByZXR1cm4gKHJldHJ5X2NvdW50LCBSRVNVTFRfRVJST1IpCisgICAgZXhjZXB0OgorICAgICAgICBsb2dnZXIuaW5mbygnSW50ZXJydXB0ZWQgZXhlY3V0aW9uJywgZXhjX2luZm89VHJ1ZSkKKyAgICAgICAgaWYgbm90IGFzeW5jX21vZGU6CisgICAgICAgICAgICByYWlzZQorICAgICAgICBzdG9wLnNldCgpCisgICAgICAgIHJldHVybiAocmV0cnlfY291bnQsIFJFU1VMVF9FUlJPUikKKworCitjbGFzcyBQb3J0QWxsb2NhdG9yKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLl9sb2cgPSBtdWx0aXByb2Nlc3NpbmcuZ2V0X2xvZ2dlcigpCisgICAgICAgIHNlbGYuX2xvY2sgPSBtdWx0aXByb2Nlc3NpbmcuTG9jaygpCisgICAgICAgIHNlbGYuX3BvcnRzID0gc2V0KCkKKyAgICAgICAgc2VsZi5fZG9tX3BvcnRzID0gc2V0KCkKKyAgICAgICAgc2VsZi5fbGFzdF9hbGxvYyA9IDAKKworICAgIGRlZiBfZ2V0X3RjcF9wb3J0KHNlbGYpOgorICAgICAgICBzb2NrID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfU1RSRUFNKQorICAgICAgICBzb2NrLnNldHNvY2tvcHQoc29ja2V0LlNPTF9TT0NLRVQsIHNvY2tldC5TT19SRVVTRUFERFIsIDEpCisgICAgICAgIHNvY2suYmluZCgoJycsIDApKQorICAgICAgICBwb3J0ID0gc29jay5nZXRzb2NrbmFtZSgpWzFdCisgICAgICAgIHNlbGYuX2xvY2suYWNxdWlyZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9rID0gcG9ydCBub3QgaW4gc2VsZi5fcG9ydHMKKyAgICAgICAgICAgIGlmIG9rOgorICAgICAgICAgICAgICAgIHNlbGYuX3BvcnRzLmFkZChwb3J0KQorICAgICAgICAgICAgICAgIHNlbGYuX2xhc3RfYWxsb2MgPSB0aW1lLnRpbWUoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5fbG9jay5yZWxlYXNlKCkKKyAgICAgICAgICAgIHNvY2suY2xvc2UoKQorICAgICAgICByZXR1cm4gcG9ydCBpZiBvayBlbHNlIHNlbGYuX2dldF90Y3BfcG9ydCgpCisKKyAgICBkZWYgX2dldF9kb21haW5fcG9ydChzZWxmKToKKyAgICAgICAgcG9ydCA9IHJhbmRvbS5yYW5kaW50KDEwMjQsIDY1NTM2KQorICAgICAgICBzZWxmLl9sb2NrLmFjcXVpcmUoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBvayA9IHBvcnQgbm90IGluIHNlbGYuX2RvbV9wb3J0cworICAgICAgICAgICAgaWYgb2s6CisgICAgICAgICAgICAgICAgc2VsZi5fZG9tX3BvcnRzLmFkZChwb3J0KQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5fbG9jay5yZWxlYXNlKCkKKyAgICAgICAgcmV0dXJuIHBvcnQgaWYgb2sgZWxzZSBzZWxmLl9nZXRfZG9tYWluX3BvcnQoKQorCisgICAgZGVmIGFsbG9jX3BvcnQoc2VsZiwgc29ja2V0X3R5cGUpOgorICAgICAgICBpZiBzb2NrZXRfdHlwZSBpbiAoJ2RvbWFpbicsICdhYnN0cmFjdCcpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2dldF9kb21haW5fcG9ydCgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fZ2V0X3RjcF9wb3J0KCkKKworICAgICMgc3RhdGljIG1ldGhvZCBmb3IgaW50ZXItcHJvY2VzcyBpbnZva2F0aW9uCisgICAgQHN0YXRpY21ldGhvZAorICAgIEBjb250ZXh0bGliLmNvbnRleHRtYW5hZ2VyCisgICAgZGVmIGFsbG9jX3BvcnRfc2NvcGVkKGFsbG9jYXRvciwgc29ja2V0X3R5cGUpOgorICAgICAgICBwb3J0ID0gYWxsb2NhdG9yLmFsbG9jX3BvcnQoc29ja2V0X3R5cGUpCisgICAgICAgIHlpZWxkIHBvcnQKKyAgICAgICAgYWxsb2NhdG9yLmZyZWVfcG9ydChzb2NrZXRfdHlwZSwgcG9ydCkKKworICAgIGRlZiBmcmVlX3BvcnQoc2VsZiwgc29ja2V0X3R5cGUsIHBvcnQpOgorICAgICAgICBzZWxmLl9sb2cuZGVidWcoJ2ZyZWVfcG9ydCcpCisgICAgICAgIHNlbGYuX2xvY2suYWNxdWlyZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIHNvY2tldF90eXBlID09ICdkb21haW4nOgorICAgICAgICAgICAgICAgIHNlbGYuX2RvbV9wb3J0cy5yZW1vdmUocG9ydCkKKyAgICAgICAgICAgICAgICBwYXRoID0gZG9tYWluX3NvY2tldF9wYXRoKHBvcnQpCisgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMocGF0aCk6CisgICAgICAgICAgICAgICAgICAgIG9zLnJlbW92ZShwYXRoKQorICAgICAgICAgICAgZWxpZiBzb2NrZXRfdHlwZSA9PSAnYWJzdHJhY3QnOgorICAgICAgICAgICAgICAgIHNlbGYuX2RvbV9wb3J0cy5yZW1vdmUocG9ydCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5fcG9ydHMucmVtb3ZlKHBvcnQpCisgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICAgICAgc2VsZi5fbG9nLmluZm8oJ0Vycm9yIHdoaWxlIGZyZWVpbmcgcG9ydCcsIGV4Y19pbmZvPXN5cy5leGNfaW5mbygpKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5fbG9jay5yZWxlYXNlKCkKKworCitjbGFzcyBOb25Bc3luY1Jlc3VsdChvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2YWx1ZSk6CisgICAgICAgIHNlbGYuX3ZhbHVlID0gdmFsdWUKKworICAgIGRlZiBnZXQoc2VsZiwgdGltZW91dD1Ob25lKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3ZhbHVlCisKKyAgICBkZWYgd2FpdChzZWxmLCB0aW1lb3V0PU5vbmUpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgcmVhZHkoc2VsZik6CisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgc3VjY2Vzc2Z1bChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3ZhbHVlID09IDAKKworCitjbGFzcyBUZXN0RGlzcGF0Y2hlcihvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0ZXN0ZGlyLCBiYXNlZGlyLCBsb2dkaXJfcmVsLCBjb25jdXJyZW5jeSk6CisgICAgICAgIHNlbGYuX2xvZyA9IG11bHRpcHJvY2Vzc2luZy5nZXRfbG9nZ2VyKCkKKyAgICAgICAgc2VsZi50ZXN0ZGlyID0gdGVzdGRpcgorICAgICAgICBzZWxmLl9yZXBvcnQgPSBTdW1tYXJ5UmVwb3J0ZXIoYmFzZWRpciwgbG9nZGlyX3JlbCwgY29uY3VycmVuY3kgPiAxKQorICAgICAgICBzZWxmLmxvZ2RpciA9IHNlbGYuX3JlcG9ydC50ZXN0ZGlyCisgICAgICAgICMgc2VlbXMgbmVlZGVkIGZvciBweXRob24gMi54IHRvIGhhbmRsZSBrZXlib2FyZCBpbnRlcnJ1cHQKKyAgICAgICAgc2VsZi5fc3RvcCA9IG11bHRpcHJvY2Vzc2luZy5FdmVudCgpCisgICAgICAgIHNlbGYuX2FzeW5jID0gY29uY3VycmVuY3kgPiAxCisgICAgICAgIGlmIG5vdCBzZWxmLl9hc3luYzoKKyAgICAgICAgICAgIHNlbGYuX3Bvb2wgPSBOb25lCisgICAgICAgICAgICBnbG9iYWwgc3RvcAorICAgICAgICAgICAgZ2xvYmFsIHBvcnRzCisgICAgICAgICAgICBzdG9wID0gc2VsZi5fc3RvcAorICAgICAgICAgICAgcG9ydHMgPSBQb3J0QWxsb2NhdG9yKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX20gPSBtdWx0aXByb2Nlc3NpbmcubWFuYWdlcnMuQmFzZU1hbmFnZXIoKQorICAgICAgICAgICAgc2VsZi5fbS5yZWdpc3RlcigncG9ydHMnLCBQb3J0QWxsb2NhdG9yKQorICAgICAgICAgICAgc2VsZi5fbS5zdGFydCgpCisgICAgICAgICAgICBzZWxmLl9wb29sID0gbXVsdGlwcm9jZXNzaW5nLlBvb2woY29uY3VycmVuY3ksIHNlbGYuX3Bvb2xfaW5pdCwgKHNlbGYuX20uYWRkcmVzcywpKQorICAgICAgICBzZWxmLl9sb2cuZGVidWcoCisgICAgICAgICAgICAnVGVzdERpc3BhdGNoZXIgc3RhcnRlZCB3aXRoICVkIGNvbmN1cnJlbnQgam9icycgJSBjb25jdXJyZW5jeSkKKworICAgIGRlZiBfcG9vbF9pbml0KHNlbGYsIGFkZHJlc3MpOgorICAgICAgICBnbG9iYWwgc3RvcAorICAgICAgICBnbG9iYWwgbQorICAgICAgICBnbG9iYWwgcG9ydHMKKyAgICAgICAgc3RvcCA9IHNlbGYuX3N0b3AKKyAgICAgICAgbSA9IG11bHRpcHJvY2Vzc2luZy5tYW5hZ2Vycy5CYXNlTWFuYWdlcihhZGRyZXNzKQorICAgICAgICBtLmNvbm5lY3QoKQorICAgICAgICBwb3J0cyA9IG0ucG9ydHMoKQorCisgICAgZGVmIF9kaXNwYXRjaF9zeW5jKHNlbGYsIHRlc3QsIGNvbnQsIG1heF9yZXRyeSk6CisgICAgICAgIHIgPSBydW5fdGVzdChzZWxmLnRlc3RkaXIsIHNlbGYubG9nZGlyLCB0ZXN0LCBtYXhfcmV0cnksIGFzeW5jX21vZGU9RmFsc2UpCisgICAgICAgIGNvbnQocikKKyAgICAgICAgcmV0dXJuIE5vbkFzeW5jUmVzdWx0KHIpCisKKyAgICBkZWYgX2Rpc3BhdGNoX2FzeW5jKHNlbGYsIHRlc3QsIGNvbnQsIG1heF9yZXRyeSk6CisgICAgICAgIHNlbGYuX2xvZy5kZWJ1ZygnX2Rpc3BhdGNoX2FzeW5jJykKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Bvb2wuYXBwbHlfYXN5bmMoZnVuYz1ydW5fdGVzdCwgYXJncz0oc2VsZi50ZXN0ZGlyLCBzZWxmLmxvZ2RpciwgdGVzdCwgbWF4X3JldHJ5KSwgY2FsbGJhY2s9Y29udCkKKworICAgIGRlZiBkaXNwYXRjaChzZWxmLCB0ZXN0LCBtYXhfcmV0cnkpOgorICAgICAgICBpbmRleCA9IHNlbGYuX3JlcG9ydC5hZGRfdGVzdCh0ZXN0KQorCisgICAgICAgIGRlZiBjb250KHJlc3VsdCk6CisgICAgICAgICAgICBpZiBub3Qgc2VsZi5fc3RvcC5pc19zZXQoKToKKyAgICAgICAgICAgICAgICBpZiByZXN1bHQgYW5kIGxlbihyZXN1bHQpID09IDI6CisgICAgICAgICAgICAgICAgICAgIHJldHJ5X2NvdW50LCByZXR1cm5jb2RlID0gcmVzdWx0CisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmV0cnlfY291bnQgPSAwCisgICAgICAgICAgICAgICAgICAgIHJldHVybmNvZGUgPSBSRVNVTFRfRVJST1IKKyAgICAgICAgICAgICAgICBzZWxmLl9sb2cuZGVidWcoJ2ZyZWVpbmcgcG9ydCcpCisgICAgICAgICAgICAgICAgc2VsZi5fbG9nLmRlYnVnKCdhZGRpbmcgcmVzdWx0JykKKyAgICAgICAgICAgICAgICBzZWxmLl9yZXBvcnQuYWRkX3Jlc3VsdChpbmRleCwgcmV0dXJuY29kZSwgcmV0dXJuY29kZSA9PSBSRVNVTFRfVElNRU9VVCwgcmV0cnlfY291bnQpCisgICAgICAgICAgICAgICAgc2VsZi5fbG9nLmRlYnVnKCdmaW5pc2ggY29udGludWF0aW9uJykKKyAgICAgICAgZm4gPSBzZWxmLl9kaXNwYXRjaF9hc3luYyBpZiBzZWxmLl9hc3luYyBlbHNlIHNlbGYuX2Rpc3BhdGNoX3N5bmMKKyAgICAgICAgcmV0dXJuIGZuKHRlc3QsIGNvbnQsIG1heF9yZXRyeSkKKworICAgIGRlZiB3YWl0KHNlbGYpOgorICAgICAgICBpZiBzZWxmLl9hc3luYzoKKyAgICAgICAgICAgIHNlbGYuX3Bvb2wuY2xvc2UoKQorICAgICAgICAgICAgc2VsZi5fcG9vbC5qb2luKCkKKyAgICAgICAgICAgIHNlbGYuX20uc2h1dGRvd24oKQorICAgICAgICByZXR1cm4gc2VsZi5fcmVwb3J0LmVuZCgpCisKKyAgICBkZWYgdGVybWluYXRlKHNlbGYpOgorICAgICAgICBzZWxmLl9zdG9wLnNldCgpCisgICAgICAgIGlmIHNlbGYuX2FzeW5jOgorICAgICAgICAgICAgc2VsZi5fcG9vbC50ZXJtaW5hdGUoKQorICAgICAgICAgICAgc2VsZi5fcG9vbC5qb2luKCkKKyAgICAgICAgICAgIHNlbGYuX20uc2h1dGRvd24oKQpkaWZmIC0tZ2l0IGEvdGVzdC9jcm9zc3J1bm5lci9zZXR1cC5jZmcgYi90ZXN0L2Nyb3NzcnVubmVyL3NldHVwLmNmZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGExZjk2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jcm9zc3J1bm5lci9zZXR1cC5jZmcKQEAgLTAsMCArMSwyIEBACitbZmxha2U4XQorbWF4LWxpbmUtbGVuZ3RoID0gMTAwCmRpZmYgLS1naXQgYS90ZXN0L2Nyb3NzcnVubmVyL3Rlc3QucHkgYi90ZXN0L2Nyb3NzcnVubmVyL3Rlc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU5MTI4NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY3Jvc3NydW5uZXIvdGVzdC5weQpAQCAtMCwwICsxLDE0OSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2ltcG9ydCBjb3B5CitpbXBvcnQgbXVsdGlwcm9jZXNzaW5nCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2Zyb20gLmNvbXBhdCBpbXBvcnQgcGF0aF9qb2luCitmcm9tIC51dGlsIGltcG9ydCBtZXJnZV9kaWN0LCBkb21haW5fc29ja2V0X3BhdGgKKworCitjbGFzcyBUZXN0UHJvZ3JhbShvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBraW5kLCBuYW1lLCBwcm90b2NvbCwgdHJhbnNwb3J0LCBzb2NrZXQsIHdvcmtkaXIsIHN0b3Bfc2lnbmFsLCBjb21tYW5kLCBlbnY9Tm9uZSwKKyAgICAgICAgICAgICAgICAgZXh0cmFfYXJncz1bXSwgZXh0cmFfYXJnczI9W10sIGpvaW5fYXJncz1GYWxzZSwgKiprd2FyZ3MpOgorCisgICAgICAgIHNlbGYua2luZCA9IGtpbmQKKyAgICAgICAgc2VsZi5uYW1lID0gbmFtZQorICAgICAgICBzZWxmLnByb3RvY29sID0gcHJvdG9jb2wKKyAgICAgICAgc2VsZi50cmFuc3BvcnQgPSB0cmFuc3BvcnQKKyAgICAgICAgc2VsZi5zb2NrZXQgPSBzb2NrZXQKKyAgICAgICAgc2VsZi53b3JrZGlyID0gd29ya2RpcgorICAgICAgICBzZWxmLnN0b3Bfc2lnbmFsID0gc3RvcF9zaWduYWwKKyAgICAgICAgc2VsZi5jb21tYW5kID0gTm9uZQorICAgICAgICBzZWxmLl9iYXNlX2NvbW1hbmQgPSBzZWxmLl9maXhfY21kX3BhdGgoY29tbWFuZCkKKyAgICAgICAgaWYgZW52OgorICAgICAgICAgICAgc2VsZi5lbnYgPSBjb3B5LmNvcHkob3MuZW52aXJvbikKKyAgICAgICAgICAgIHNlbGYuZW52LnVwZGF0ZShlbnYpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmVudiA9IG9zLmVudmlyb24KKyAgICAgICAgc2VsZi5fZXh0cmFfYXJncyA9IGV4dHJhX2FyZ3MKKyAgICAgICAgc2VsZi5fZXh0cmFfYXJnczIgPSBleHRyYV9hcmdzMgorICAgICAgICBzZWxmLl9qb2luX2FyZ3MgPSBqb2luX2FyZ3MKKworICAgIGRlZiBfZml4X2NtZF9wYXRoKHNlbGYsIGNtZCk6CisgICAgICAgICMgaWYgdGhlIGFyZyBpcyBhIGZpbGUgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LCBtYWtlIGl0IHBhdGgKKyAgICAgICAgZGVmIGFic19pZl9leGlzdHMoYXJnKToKKyAgICAgICAgICAgIHAgPSBwYXRoX2pvaW4oc2VsZi53b3JrZGlyLCBhcmcpCisgICAgICAgICAgICByZXR1cm4gcCBpZiBvcy5wYXRoLmV4aXN0cyhwKSBlbHNlIGFyZworCisgICAgICAgIGlmIGNtZFswXSA9PSAncHl0aG9uJzoKKyAgICAgICAgICAgIGNtZFswXSA9IHN5cy5leGVjdXRhYmxlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjbWRbMF0gPSBhYnNfaWZfZXhpc3RzKGNtZFswXSkKKyAgICAgICAgcmV0dXJuIGNtZAorCisgICAgZGVmIF9zb2NrZXRfYXJncyhzZWxmLCBzb2NrZXQsIHBvcnQpOgorICAgICAgICByZXR1cm4geworICAgICAgICAgICAgJ2lwLXNzbCc6IFsnLS1zc2wnXSwKKyAgICAgICAgICAgICdkb21haW4nOiBbJy0tZG9tYWluLXNvY2tldD0lcycgJSBkb21haW5fc29ja2V0X3BhdGgocG9ydCldLAorICAgICAgICAgICAgJ2Fic3RyYWN0JzogWyctLWFic3RyYWN0LW5hbWVzcGFjZScsICctLWRvbWFpbi1zb2NrZXQ9JXMnICUgZG9tYWluX3NvY2tldF9wYXRoKHBvcnQpXSwKKyAgICAgICAgfS5nZXQoc29ja2V0LCBOb25lKQorCisgICAgZGVmIF90cmFuc3BvcnRfYXJncyhzZWxmLCB0cmFuc3BvcnQpOgorICAgICAgICByZXR1cm4geworICAgICAgICAgICAgJ3psaWInOiBbJy0temxpYiddLAorICAgICAgICB9LmdldCh0cmFuc3BvcnQsIE5vbmUpCisKKyAgICBkZWYgYnVpbGRfY29tbWFuZChzZWxmLCBwb3J0KToKKyAgICAgICAgY21kID0gY29weS5jb3B5KHNlbGYuX2Jhc2VfY29tbWFuZCkKKyAgICAgICAgYXJncyA9IGNvcHkuY29weShzZWxmLl9leHRyYV9hcmdzMikKKyAgICAgICAgYXJncy5hcHBlbmQoJy0tcHJvdG9jb2w9JyArIHNlbGYucHJvdG9jb2wpCisgICAgICAgIGFyZ3MuYXBwZW5kKCctLXRyYW5zcG9ydD0nICsgc2VsZi50cmFuc3BvcnQpCisgICAgICAgIHRyYW5zcG9ydF9hcmdzID0gc2VsZi5fdHJhbnNwb3J0X2FyZ3Moc2VsZi50cmFuc3BvcnQpCisgICAgICAgIGlmIHRyYW5zcG9ydF9hcmdzOgorICAgICAgICAgICAgYXJncyArPSB0cmFuc3BvcnRfYXJncworICAgICAgICBzb2NrZXRfYXJncyA9IHNlbGYuX3NvY2tldF9hcmdzKHNlbGYuc29ja2V0LCBwb3J0KQorICAgICAgICBpZiBzb2NrZXRfYXJnczoKKyAgICAgICAgICAgIGFyZ3MgKz0gc29ja2V0X2FyZ3MKKyAgICAgICAgYXJncy5hcHBlbmQoJy0tcG9ydD0lZCcgJSBwb3J0KQorICAgICAgICBpZiBzZWxmLl9qb2luX2FyZ3M6CisgICAgICAgICAgICBjbWQuYXBwZW5kKCclcycgJSAiICIuam9pbihhcmdzKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGNtZC5leHRlbmQoYXJncykKKyAgICAgICAgaWYgc2VsZi5fZXh0cmFfYXJnczoKKyAgICAgICAgICAgIGNtZC5leHRlbmQoc2VsZi5fZXh0cmFfYXJncykKKyAgICAgICAgc2VsZi5jb21tYW5kID0gY21kCisgICAgICAgIHJldHVybiBzZWxmLmNvbW1hbmQKKworCitjbGFzcyBUZXN0RW50cnkob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdGVzdGRpciwgc2VydmVyLCBjbGllbnQsIGRlbGF5LCB0aW1lb3V0LCAqKmt3YXJncyk6CisgICAgICAgIHNlbGYudGVzdGRpciA9IHRlc3RkaXIKKyAgICAgICAgc2VsZi5fbG9nID0gbXVsdGlwcm9jZXNzaW5nLmdldF9sb2dnZXIoKQorICAgICAgICBzZWxmLl9jb25maWcgPSBrd2FyZ3MKKyAgICAgICAgc2VsZi5wcm90b2NvbCA9IGt3YXJnc1sncHJvdG9jb2wnXQorICAgICAgICBzZWxmLnRyYW5zcG9ydCA9IGt3YXJnc1sndHJhbnNwb3J0J10KKyAgICAgICAgc2VsZi5zb2NrZXQgPSBrd2FyZ3NbJ3NvY2tldCddCisgICAgICAgIHNydl9kaWN0ID0gc2VsZi5fZml4X3dvcmtkaXIobWVyZ2VfZGljdChzZWxmLl9jb25maWcsIHNlcnZlcikpCisgICAgICAgIGNsaV9kaWN0ID0gc2VsZi5fZml4X3dvcmtkaXIobWVyZ2VfZGljdChzZWxmLl9jb25maWcsIGNsaWVudCkpCisgICAgICAgIGNsaV9kaWN0WydleHRyYV9hcmdzMiddID0gc3J2X2RpY3QucG9wKCdyZW1vdGVfYXJncycsIFtdKQorICAgICAgICBzcnZfZGljdFsnZXh0cmFfYXJnczInXSA9IGNsaV9kaWN0LnBvcCgncmVtb3RlX2FyZ3MnLCBbXSkKKyAgICAgICAgc2VsZi5zZXJ2ZXIgPSBUZXN0UHJvZ3JhbSgnc2VydmVyJywgKipzcnZfZGljdCkKKyAgICAgICAgc2VsZi5jbGllbnQgPSBUZXN0UHJvZ3JhbSgnY2xpZW50JywgKipjbGlfZGljdCkKKyAgICAgICAgc2VsZi5kZWxheSA9IGRlbGF5CisgICAgICAgIHNlbGYudGltZW91dCA9IHRpbWVvdXQKKyAgICAgICAgc2VsZi5fbmFtZSA9IE5vbmUKKyAgICAgICAgIyByZXN1bHRzCisgICAgICAgIHNlbGYuc3VjY2VzcyA9IE5vbmUKKyAgICAgICAgc2VsZi5hc19leHBlY3RlZCA9IE5vbmUKKyAgICAgICAgc2VsZi5yZXR1cm5jb2RlID0gTm9uZQorICAgICAgICBzZWxmLmV4cGlyZWQgPSBGYWxzZQorICAgICAgICBzZWxmLnJldHJ5X2NvdW50ID0gMAorCisgICAgZGVmIF9maXhfd29ya2RpcihzZWxmLCBjb25maWcpOgorICAgICAgICBrZXkgPSAnd29ya2RpcicKKyAgICAgICAgcGF0aCA9IGNvbmZpZy5nZXQoa2V5LCBOb25lKQorICAgICAgICBpZiBub3QgcGF0aDoKKyAgICAgICAgICAgIHBhdGggPSBzZWxmLnRlc3RkaXIKKyAgICAgICAgaWYgb3MucGF0aC5pc2FicyhwYXRoKToKKyAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLnJlYWxwYXRoKHBhdGgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwYXRoID0gb3MucGF0aC5yZWFscGF0aChwYXRoX2pvaW4oc2VsZi50ZXN0ZGlyLCBwYXRoKSkKKyAgICAgICAgY29uZmlnLnVwZGF0ZSh7a2V5OiBwYXRofSkKKyAgICAgICAgcmV0dXJuIGNvbmZpZworCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGdldF9uYW1lKGNscywgc2VydmVyLCBjbGllbnQsIHByb3RvY29sLCB0cmFuc3BvcnQsIHNvY2tldCwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuICclcy0lc18lc18lcy0lcycgJSAoc2VydmVyLCBjbGllbnQsIHByb3RvY29sLCB0cmFuc3BvcnQsIHNvY2tldCkKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBuYW1lKHNlbGYpOgorICAgICAgICBpZiBub3Qgc2VsZi5fbmFtZToKKyAgICAgICAgICAgIHNlbGYuX25hbWUgPSBzZWxmLmdldF9uYW1lKAorICAgICAgICAgICAgICAgIHNlbGYuc2VydmVyLm5hbWUsIHNlbGYuY2xpZW50Lm5hbWUsIHNlbGYucHJvdG9jb2wsIHNlbGYudHJhbnNwb3J0LCBzZWxmLnNvY2tldCkKKyAgICAgICAgcmV0dXJuIHNlbGYuX25hbWUKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiB0cmFuc3BvcnRfbmFtZShzZWxmKToKKyAgICAgICAgcmV0dXJuICclcy0lcycgJSAoc2VsZi50cmFuc3BvcnQsIHNlbGYuc29ja2V0KQorCisKK2RlZiB0ZXN0X25hbWUoc2VydmVyLCBjbGllbnQsIHByb3RvY29sLCB0cmFuc3BvcnQsIHNvY2tldCwgKiprd2FyZ3MpOgorICAgIHJldHVybiBUZXN0RW50cnkuZ2V0X25hbWUoc2VydmVyWyduYW1lJ10sIGNsaWVudFsnbmFtZSddLCBwcm90b2NvbCwgdHJhbnNwb3J0LCBzb2NrZXQpCmRpZmYgLS1naXQgYS90ZXN0L2Nyb3NzcnVubmVyL3V0aWwucHkgYi90ZXN0L2Nyb3NzcnVubmVyL3V0aWwucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzIxNGRmOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY3Jvc3NydW5uZXIvdXRpbC5weQpAQCAtMCwwICsxLDM1IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworaW1wb3J0IGNvcHkKKworCitkZWYgZG9tYWluX3NvY2tldF9wYXRoKHBvcnQpOgorICAgIHJldHVybiAnL3RtcC9UaHJpZnRUZXN0LnRocmlmdC4lZCcgJSBwb3J0CisKKworZGVmIG1lcmdlX2RpY3QoYmFzZSwgdXBkYXRlKToKKyAgICAiIiJVcGRhdGUgZGljdCBjb25jYXRlbmF0aW5nIGxpc3QgdmFsdWVzIiIiCisgICAgcmVzID0gY29weS5kZWVwY29weShiYXNlKQorICAgIGZvciBrLCB2IGluIGxpc3QodXBkYXRlLml0ZW1zKCkpOgorICAgICAgICBpZiBrIGluIGxpc3QocmVzLmtleXMoKSkgYW5kIGlzaW5zdGFuY2UodiwgbGlzdCk6CisgICAgICAgICAgICByZXNba10uZXh0ZW5kKHYpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXNba10gPSB2CisgICAgcmV0dXJuIHJlcwpkaWZmIC0tZ2l0IGEvdGVzdC9jc2hhcnAvTWFrZWZpbGUuYW0gYi90ZXN0L2NzaGFycC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDE2NmUzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jc2hhcnAvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw5NSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK0dFTkVSQVRFRCA9IFwKKwlnZW4tY3NoYXJwL1RocmlmdC9UZXN0L0JvbmsuY3MgXAorCWdlbi1jc2hhcnAvVGhyaWZ0L1Rlc3QvQm9vbHMuY3MgXAorCWdlbi1jc2hhcnAvVGhyaWZ0L1Rlc3QvQm9vbFRlc3QuY3MgXAorCWdlbi1jc2hhcnAvVGhyaWZ0L1Rlc3QvQ3JhenlOZXN0aW5nLmNzIFwKKwlnZW4tY3NoYXJwL1RocmlmdC9UZXN0L0VtcHR5U3RydWN0LmNzIFwKKwlnZW4tY3NoYXJwL1RocmlmdC9UZXN0L0d1ZXNzUHJvdG9jb2xTdHJ1Y3QuY3MgXAorCWdlbi1jc2hhcnAvVGhyaWZ0L1Rlc3QvSW5zYW5pdHkuY3MgXAorCWdlbi1jc2hhcnAvVGhyaWZ0L1Rlc3QvTGFyZ2VEZWx0YXMuY3MgXAorCWdlbi1jc2hhcnAvVGhyaWZ0L1Rlc3QvTGlzdEJvbmtzLmNzIFwKKwlnZW4tY3NoYXJwL1RocmlmdC9UZXN0L0xpc3RUeXBlVmVyc2lvbmluZ1YxLmNzIFwKKwlnZW4tY3NoYXJwL1RocmlmdC9UZXN0L0xpc3RUeXBlVmVyc2lvbmluZ1YyLmNzIFwKKwlnZW4tY3NoYXJwL1RocmlmdC9UZXN0L05lc3RlZExpc3RzQm9uay5jcyBcCisJZ2VuLWNzaGFycC9UaHJpZnQvVGVzdC9OZXN0ZWRMaXN0c0kzMngyLmNzIFwKKwlnZW4tY3NoYXJwL1RocmlmdC9UZXN0L05lc3RlZExpc3RzSTMyeDMuY3MgXAorCWdlbi1jc2hhcnAvVGhyaWZ0L1Rlc3QvTmVzdGVkTWl4ZWR4Mi5jcyBcCisJZ2VuLWNzaGFycC9UaHJpZnQvVGVzdC9OdW1iZXJ6LmNzIFwKKwlnZW4tY3NoYXJwL1RocmlmdC9UZXN0L09uZUZpZWxkLmNzIFwKKwlnZW4tY3NoYXJwL1RocmlmdC9UZXN0L1NlY29uZFNlcnZpY2UuY3MgXAorCWdlbi1jc2hhcnAvVGhyaWZ0L1Rlc3QvU3RydWN0QS5jcyBcCisJZ2VuLWNzaGFycC9UaHJpZnQvVGVzdC9TdHJ1Y3RCLmNzIFwKKwlnZW4tY3NoYXJwL1RocmlmdC9UZXN0L1RocmlmdFRlc3QuQ29uc3RhbnRzLmNzIFwKKwlnZW4tY3NoYXJwL1RocmlmdC9UZXN0L1RocmlmdFRlc3QuY3MgXAorCWdlbi1jc2hhcnAvVGhyaWZ0L1Rlc3QvVmVyc2lvbmluZ1Rlc3RWMS5jcyBcCisJZ2VuLWNzaGFycC9UaHJpZnQvVGVzdC9WZXJzaW9uaW5nVGVzdFYyLmNzIFwKKwlnZW4tY3NoYXJwL1RocmlmdC9UZXN0L1hjZXB0aW9uLmNzIFwKKwlnZW4tY3NoYXJwL1RocmlmdC9UZXN0L1hjZXB0aW9uMi5jcyBcCisJZ2VuLWNzaGFycC9UaHJpZnQvVGVzdC9YdHJ1Y3QuY3MgXAorCWdlbi1jc2hhcnAvVGhyaWZ0L1Rlc3QvWHRydWN0Mi5jcyBcCisJZ2VuLWNzaGFycC9UaHJpZnQvVGVzdC9YdHJ1Y3QzLmNzCisKK0JVSUxUX1NPVVJDRVMgPSAkKEdFTkVSQVRFRCkKKworaWYgTU9OT19NQ1MKK0NTQyA9IG1jcworZWxzZQorQ1NDID0gZ21jcworZW5kaWYKKworaWYgTkVUXzJfMAorQ1NDX0RFRklORVMgPSAtZDpORVRfMl8wCitlbmRpZgorCitMSUJESVIgPSAkKHRvcF9idWlsZGRpcikvbGliL2NzaGFycAorCitUSFJJRlQgPSAkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL3RocmlmdAorCiskKEdFTkVSQVRFRCk6ICQodG9wX3NyY2RpcikvdGVzdC9UaHJpZnRUZXN0LnRocmlmdCAkKFRIUklGVCkKKwkkKFRIUklGVCkgLS1nZW4gY3NoYXJwIC1vIC4gJDwKKworcHJlY3Jvc3M6IFRlc3RDbGllbnRTZXJ2ZXIuZXhlCisKK1RocmlmdEltcGwuZGxsOiAkKEdFTkVSQVRFRCkgJChMSUJESVIpL1RocmlmdC5kbGwKKwkkKENTQykgJChDU0NfREVGSU5FUykgLXQ6bGlicmFyeSAtb3V0OiRAIC1yZWZlcmVuY2U6JChMSUJESVIpL1RocmlmdC5kbGwgJChHRU5FUkFURUQpCisKK1NSQ1MgPSBUZXN0Q2xpZW50LmNzIFRlc3RTZXJ2ZXIuY3MgUHJvZ3JhbS5jcworCitUZXN0Q2xpZW50U2VydmVyLmV4ZTogJChTUkNTKSBUaHJpZnRJbXBsLmRsbAorCSQoQ1NDKSAkKENTQ19ERUZJTkVTKSAtb3V0OiRAIC1yZWZlcmVuY2U6JChMSUJESVIpL1RocmlmdC5kbGwgLXJlZmVyZW5jZTpUaHJpZnRJbXBsLmRsbCAkKFNSQ1MpCisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIC1yZiBnZW4tY3NoYXJwICouZXhlICouZGxsCisKK1RFU1RQT1JUID0gOTUwMAorY2hlY2stbG9jYWw6IFRlc3RDbGllbnRTZXJ2ZXIuZXhlCisJTU9OT19QQVRIPSQoTElCRElSKSB0aW1lb3V0IDEwIG1vbm8gVGVzdENsaWVudFNlcnZlci5leGUgc2VydmVyIC0tcG9ydD0kKFRFU1RQT1JUKSAmCisJc2xlZXAgMQorCU1PTk9fUEFUSD0kKExJQkRJUikgbW9ubyBUZXN0Q2xpZW50U2VydmVyLmV4ZSBjbGllbnQgLS1wb3J0PSQoVEVTVFBPUlQpCisKK0VYVFJBX0RJU1QgPSBcCisJUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MgXAorCVRocmlmdFRlc3QuY3Nwcm9qIFwKKwlUaHJpZnRUZXN0LnNsbiBcCisJUHJvZ3JhbS5jcyBcCisJVGVzdFNlcnZlci5jcyBcCisJVGVzdENsaWVudC5jcwpkaWZmIC0tZ2l0IGEvdGVzdC9jc2hhcnAvUHJvZ3JhbS5jcyBiL3Rlc3QvY3NoYXJwL1Byb2dyYW0uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVjMDBlMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY3NoYXJwL1Byb2dyYW0uY3MKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UKKy8vCisvLyBTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRSBvciB2aXNpdCB0aGUgVGhyaWZ0IHNpdGUgYXQ6CisvLyBodHRwOi8vZGV2ZWxvcGVycy5mYWNlYm9vay5jb20vdGhyaWZ0LworCit1c2luZyBTeXN0ZW07Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0OwordXNpbmcgVGhyaWZ0LlByb3RvY29sOwordXNpbmcgVGhyaWZ0LlRlc3Q7IC8vZ2VuZXJhdGVkIGNvZGUKKworbmFtZXNwYWNlIFRlc3QKK3sKKyAgICBjbGFzcyBQcm9ncmFtCisgICAgeworICAgICAgICBzdGF0aWMgaW50IE1haW4oc3RyaW5nW10gYXJncykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGFyZ3MuTGVuZ3RoID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIm11c3QgcHJvdmlkZSAnc2VydmVyJyBvciAnY2xpZW50JyBhcmciKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuU2V0QnVmZmVyU2l6ZShDb25zb2xlLkJ1ZmZlcldpZHRoLCA0MDk2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkZhaWxlZCB0byBncm93IHNjcm9sbC1iYWNrIGJ1ZmZlciIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdHJpbmdbXSBzdWJBcmdzID0gbmV3IHN0cmluZ1thcmdzLkxlbmd0aCAtIDFdOworICAgICAgICAgICAgZm9yKGludCBpID0gMTsgaSA8IGFyZ3MuTGVuZ3RoOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3ViQXJnc1tpLTFdID0gYXJnc1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhcmdzWzBdID09ICJjbGllbnQiKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBUZXN0Q2xpZW50LkV4ZWN1dGUoc3ViQXJncyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChhcmdzWzBdID09ICJzZXJ2ZXIiKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBUZXN0U2VydmVyLkV4ZWN1dGUoc3ViQXJncykgPyAwIDogMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiZmlyc3QgYXJndW1lbnQgbXVzdCBiZSAnc2VydmVyJyBvciAnY2xpZW50JyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L2NzaGFycC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcyBiL3Rlc3QvY3NoYXJwL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMTAxYTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NzaGFycC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpAQCAtMCwwICsxLDU1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuQ29tcGlsZXJTZXJ2aWNlczsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsKKworLy8gR2VuZXJhbCBJbmZvcm1hdGlvbiBhYm91dCBhbiBhc3NlbWJseSBpcyBjb250cm9sbGVkIHRocm91Z2ggdGhlIGZvbGxvd2luZworLy8gc2V0IG9mIGF0dHJpYnV0ZXMuIENoYW5nZSB0aGVzZSBhdHRyaWJ1dGUgdmFsdWVzIHRvIG1vZGlmeSB0aGUgaW5mb3JtYXRpb24KKy8vIGFzc29jaWF0ZWQgd2l0aCBhbiBhc3NlbWJseS4KK1thc3NlbWJseTogQXNzZW1ibHlUaXRsZSgiVGhyaWZ0VGVzdCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseURlc2NyaXB0aW9uKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb25maWd1cmF0aW9uKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb21wYW55KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlQcm9kdWN0KCJUaHJpZnQiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb3B5cmlnaHQoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVRyYWRlbWFyaygiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q3VsdHVyZSgiIildCisKKy8vIFNldHRpbmcgQ29tVmlzaWJsZSB0byBmYWxzZSBtYWtlcyB0aGUgdHlwZXMgaW4gdGhpcyBhc3NlbWJseSBub3QgdmlzaWJsZQorLy8gdG8gQ09NIGNvbXBvbmVudHMuICBJZiB5b3UgbmVlZCB0byBhY2Nlc3MgYSB0eXBlIGluIHRoaXMgYXNzZW1ibHkgZnJvbQorLy8gQ09NLCBzZXQgdGhlIENvbVZpc2libGUgYXR0cmlidXRlIHRvIHRydWUgb24gdGhhdCB0eXBlLgorW2Fzc2VtYmx5OiBDb21WaXNpYmxlKGZhbHNlKV0KKworLy8gVGhlIGZvbGxvd2luZyBHVUlEIGlzIGZvciB0aGUgSUQgb2YgdGhlIHR5cGVsaWIgaWYgdGhpcyBwcm9qZWN0IGlzIGV4cG9zZWQgdG8gQ09NCitbYXNzZW1ibHk6IEd1aWQoImY0MWIxOTNiLWYxYWItNDhlZS04ODQzLWY4OGU0MzA4NGUyNiIpXQorCisvLyBWZXJzaW9uIGluZm9ybWF0aW9uIGZvciBhbiBhc3NlbWJseSBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nIGZvdXIgdmFsdWVzOgorLy8KKy8vICAgICAgTWFqb3IgVmVyc2lvbgorLy8gICAgICBNaW5vciBWZXJzaW9uCisvLyAgICAgIEJ1aWxkIE51bWJlcgorLy8gICAgICBSZXZpc2lvbgorLy8KKy8vIFlvdSBjYW4gc3BlY2lmeSBhbGwgdGhlIHZhbHVlcyBvciB5b3UgY2FuIGRlZmF1bHQgdGhlIEJ1aWxkIGFuZCBSZXZpc2lvbiBOdW1iZXJzCisvLyBieSB1c2luZyB0aGUgJyonIGFzIHNob3duIGJlbG93OgorLy8gW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjEuMC4qIildCitbYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiMS4wLjAuMCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUZpbGVWZXJzaW9uKCIxLjAuMC4wIildCmRpZmYgLS1naXQgYS90ZXN0L2NzaGFycC9UZXN0Q2xpZW50LmNzIGIvdGVzdC9jc2hhcnAvVGVzdENsaWVudC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDljMDZlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jc2hhcnAvVGVzdENsaWVudC5jcwpAQCAtMCwwICsxLDg3MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5EaWFnbm9zdGljczsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5TZWN1cml0eS5DcnlwdG9ncmFwaHkuWDUwOUNlcnRpZmljYXRlczsKK3VzaW5nIFRocmlmdC5Db2xsZWN0aW9uczsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbDsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnQ7Cit1c2luZyBUaHJpZnQuVGVzdDsKK3VzaW5nIFN5c3RlbS5TZWN1cml0eS5BdXRoZW50aWNhdGlvbjsKKworbmFtZXNwYWNlIFRlc3QKK3sKKyAgICBwdWJsaWMgY2xhc3MgVGVzdENsaWVudAorICAgIHsKKyAgICAgICAgcHVibGljIGNsYXNzIFRlc3RQYXJhbXMKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIGludCBudW1JdGVyYXRpb25zID0gMTsKKyAgICAgICAgICAgIHB1YmxpYyBzdHJpbmcgaG9zdCA9ICJsb2NhbGhvc3QiOworICAgICAgICAgICAgcHVibGljIGludCBwb3J0ID0gOTA5MDsKKyAgICAgICAgICAgIHB1YmxpYyBzdHJpbmcgdXJsOworICAgICAgICAgICAgcHVibGljIHN0cmluZyBwaXBlOworICAgICAgICAgICAgcHVibGljIGJvb2wgYnVmZmVyZWQ7CisgICAgICAgICAgICBwdWJsaWMgYm9vbCBmcmFtZWQ7CisgICAgICAgICAgICBwdWJsaWMgc3RyaW5nIHByb3RvY29sOworICAgICAgICAgICAgcHVibGljIGJvb2wgZW5jcnlwdGVkID0gZmFsc2U7CisgICAgICAgICAgICBwdWJsaWMgYm9vbCBtdWx0aXBsZXhlZCA9IGZhbHNlOworICAgICAgICAgICAgcHJvdGVjdGVkIGJvb2wgX2lzRmlyc3RUcmFuc3BvcnQgPSB0cnVlOworCisKKyAgICAgICAgICAgIHB1YmxpYyBUVHJhbnNwb3J0IENyZWF0ZVRyYW5zcG9ydCgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHVybCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZW5kcG9pbnQgdHJhbnNwb3J0CisgICAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnQgdHJhbnMgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBpZiAocGlwZSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSBuZXcgVE5hbWVkUGlwZUNsaWVudFRyYW5zcG9ydChwaXBlKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW5jcnlwdGVkKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjZXJ0UGF0aCA9ICIuLi9rZXlzL2NsaWVudC5wMTIiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg1MDlDZXJ0aWZpY2F0ZSBjZXJ0ID0gbmV3IFg1MDlDZXJ0aWZpY2F0ZTIoY2VydFBhdGgsICJ0aHJpZnQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFucyA9IG5ldyBUVExTU29ja2V0KGhvc3QsIHBvcnQsIDAsIGNlcnQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobywgYywgY2hhaW4sIGVycm9ycykgPT4gdHJ1ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIFNzbFByb3RvY29scy5UbHMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zID0gbmV3IFRTb2NrZXQoaG9zdCwgcG9ydCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBsYXllcmVkIHRyYW5zcG9ydAorICAgICAgICAgICAgICAgICAgICBpZiAoYnVmZmVyZWQpCisgICAgICAgICAgICAgICAgICAgICAgICB0cmFucyA9IG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQodHJhbnMpOworICAgICAgICAgICAgICAgICAgICBpZiAoZnJhbWVkKQorICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSBuZXcgVEZyYW1lZFRyYW5zcG9ydCh0cmFucyk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKF9pc0ZpcnN0VHJhbnNwb3J0KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL2Vuc3VyZSBwcm9wZXIgb3Blbi9jbG9zZSBvZiB0cmFuc3BvcnQKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zLk9wZW4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zLkNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBfaXNGaXJzdFRyYW5zcG9ydCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cmFuczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUSHR0cENsaWVudChuZXcgVXJpKHVybCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFRQcm90b2NvbCBDcmVhdGVQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zcG9ydCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocHJvdG9jb2wgPT0gImNvbXBhY3QiKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRDb21wYWN0UHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChwcm90b2NvbCA9PSAianNvbiIpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVEpTT05Qcm90b2NvbCh0cmFuc3BvcnQpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUQmluYXJ5UHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIGNvbnN0IGludCBFcnJvckJhc2VUeXBlcyA9IDE7CisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IEVycm9yU3RydWN0cyA9IDI7CisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IEVycm9yQ29udGFpbmVycyA9IDQ7CisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IEVycm9yRXhjZXB0aW9ucyA9IDg7CisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IEVycm9yUHJvdG9jb2wgPSAxNjsKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBpbnQgRXJyb3JVbmtub3duID0gNjQ7CisKKyAgICAgICAgcHJpdmF0ZSBjbGFzcyBDbGllbnRUZXN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgVGVzdFBhcmFtcyBwYXJhbTsKKyAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgVFRyYW5zcG9ydCB0cmFuc3BvcnQ7CisgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFNlY29uZFNlcnZpY2UuQ2xpZW50IHNlY29uZDsKKyAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgVGhyaWZ0VGVzdC5DbGllbnQgY2xpZW50OworICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBpbnQgbnVtSXRlcmF0aW9uczsKKyAgICAgICAgICAgIHByaXZhdGUgYm9vbCBkb25lOworCisgICAgICAgICAgICBwdWJsaWMgaW50IFJldHVybkNvZGUgeyBnZXQ7IHNldDsgfQorCisgICAgICAgICAgICBwdWJsaWMgQ2xpZW50VGVzdChUZXN0UGFyYW1zIHBhcmFtaW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGFyYW0gPSBwYXJhbWluOworICAgICAgICAgICAgICAgIHRyYW5zcG9ydCA9IHBhcmFtLkNyZWF0ZVRyYW5zcG9ydCgpOworICAgICAgICAgICAgICAgIFRQcm90b2NvbCBwcm90b2NvbCA9IHBhcmFtLkNyZWF0ZVByb3RvY29sKHRyYW5zcG9ydCk7CisgICAgICAgICAgICAgICAgaWYgKHBhcmFtLm11bHRpcGxleGVkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc2Vjb25kID0gbmV3IFNlY29uZFNlcnZpY2UuQ2xpZW50KG5ldyBUTXVsdGlwbGV4ZWRQcm90b2NvbChwcm90b2NvbCwgIlNlY29uZFNlcnZpY2UiKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNsaWVudCA9IG5ldyBUaHJpZnRUZXN0LkNsaWVudChwcm90b2NvbCk7CisgICAgICAgICAgICAgICAgbnVtSXRlcmF0aW9ucyA9IHBhcmFtLm51bUl0ZXJhdGlvbnM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBFeGVjdXRlKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZG9uZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJFeGVjdXRlIGNhbGxlZCBtb3JlIHRoYW4gb25jZSIpOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtSXRlcmF0aW9uczsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdHJhbnNwb3J0LklzT3BlbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQuT3BlbigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJDb25uZWN0IGZhaWxlZDogIiArIGV4Lk1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuQ29kZSB8PSBFcnJvclVua25vd247CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShleC5NZXNzYWdlICsgIiBTVDogIiArIGV4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuQ29kZSB8PSBFeGVjdXRlQ2xpZW50VGVzdChjbGllbnQsIHNlY29uZCwgcGFyYW0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZXguTWVzc2FnZSArICIgU1Q6ICIgKyBleC5TdGFja1RyYWNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFJldHVybkNvZGUgfD0gRXJyb3JVbmtub3duOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0LkNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJFcnJvciB3aGlsZSBjbG9zaW5nIHRyYW5zcG9ydCIpOworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShleC5NZXNzYWdlICsgIiBTVDogIiArIGV4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkb25lID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IEV4ZWN1dGUoc3RyaW5nW10gYXJncykKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVGVzdFBhcmFtcyBwYXJhbSA9IG5ldyBUZXN0UGFyYW1zKCk7CisgICAgICAgICAgICAgICAgaW50IG51bVRocmVhZHMgPSAxOworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLkxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJnc1tpXSA9PSAiLXUiKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLnVybCA9IGFyZ3NbKytpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi1uIikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbS5udW1JdGVyYXRpb25zID0gQ29udmVydC5Ub0ludDMyKGFyZ3NbKytpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItcGlwZSIpICAvLyAtcGlwZSA8bmFtZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbS5waXBlID0gYXJnc1srK2ldOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJVc2luZyBuYW1lZCBwaXBlcyB0cmFuc3BvcnQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0uQ29udGFpbnMoIi0taG9zdD0iKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbS5ob3N0ID0gYXJnc1tpXS5TdWJzdHJpbmcoYXJnc1tpXS5JbmRleE9mKCI9IikgKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0uQ29udGFpbnMoIi0tcG9ydD0iKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbS5wb3J0ID0gaW50LlBhcnNlKGFyZ3NbaV0uU3Vic3RyaW5nKGFyZ3NbaV0uSW5kZXhPZigiPSIpKzEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi1iIiB8fCBhcmdzW2ldID09ICItLWJ1ZmZlcmVkIiB8fCBhcmdzW2ldID09ICItLXRyYW5zcG9ydD1idWZmZXJlZCIpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0uYnVmZmVyZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJVc2luZyBidWZmZXJlZCBzb2NrZXRzIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItZiIgfHwgYXJnc1tpXSA9PSAiLS1mcmFtZWQiICB8fCBhcmdzW2ldID09ICItLXRyYW5zcG9ydD1mcmFtZWQiKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLmZyYW1lZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlVzaW5nIGZyYW1lZCB0cmFuc3BvcnQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi10IikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1UaHJlYWRzID0gQ29udmVydC5Ub0ludDMyKGFyZ3NbKytpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItLWNvbXBhY3QiIHx8IGFyZ3NbaV0gPT0gIi0tcHJvdG9jb2w9Y29tcGFjdCIgfHwgYXJnc1tpXSA9PSAiLS1wcm90b2NvbD1tdWx0aWMiKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLnByb3RvY29sID0gImNvbXBhY3QiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJVc2luZyBjb21wYWN0IHByb3RvY29sIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItLWpzb24iIHx8IGFyZ3NbaV0gPT0gIi0tcHJvdG9jb2w9anNvbiIgfHwgYXJnc1tpXSA9PSAiLS1wcm90b2NvbD1tdWx0aWoiKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLnByb3RvY29sID0gImpzb24iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJVc2luZyBKU09OIHByb3RvY29sIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItLXNzbCIpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0uZW5jcnlwdGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiVXNpbmcgZW5jcnlwdGVkIHRyYW5zcG9ydCIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJnc1tpXS5TdGFydHNXaXRoKCItLXByb3RvY29sPW11bHRpIikpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0ubXVsdGlwbGV4ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkVycm9yIHdoaWxlICBwYXJzaW5nIGFyZ3VtZW50cyIpOworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShleC5NZXNzYWdlICsgIiBTVDogIiArIGV4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRXJyb3JVbmtub3duOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHZhciB0ZXN0cyA9IEVudW1lcmFibGUuUmFuZ2UoMCwgbnVtVGhyZWFkcykuU2VsZWN0KF8gPT4gbmV3IENsaWVudFRlc3QocGFyYW0pKS5Ub0FycmF5KCk7CisgICAgICAgICAgICAgICAgLy9pc3N1ZSB0ZXN0cyBvbiBzZXBhcmF0ZSB0aHJlYWRzIHNpbXVsdGFuZW91c2x5CisgICAgICAgICAgICAgICAgdmFyIHRocmVhZHMgPSB0ZXN0cy5TZWxlY3QodGVzdCA9PiBuZXcgVGhyZWFkKHRlc3QuRXhlY3V0ZSkpLlRvQXJyYXkoKTsKKyAgICAgICAgICAgICAgICBEYXRlVGltZSBzdGFydCA9IERhdGVUaW1lLk5vdzsKKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgdCBpbiB0aHJlYWRzKQorICAgICAgICAgICAgICAgICAgICB0LlN0YXJ0KCk7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIHQgaW4gdGhyZWFkcykKKyAgICAgICAgICAgICAgICAgICAgdC5Kb2luKCk7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlRvdGFsIHRpbWU6ICIgKyAoRGF0ZVRpbWUuTm93IC0gc3RhcnQpKTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgpOworICAgICAgICAgICAgICAgIHJldHVybiB0ZXN0cy5TZWxlY3QodCA9PiB0LlJldHVybkNvZGUpLkFnZ3JlZ2F0ZSgocjEsIHIyKSA9PiByMSB8IHIyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gb3V0ZXJFeCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiVW5leHBlY3RlZCBlcnJvciIpOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKG91dGVyRXguTWVzc2FnZSArICIgU1Q6ICIgKyBvdXRlckV4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgICAgIHJldHVybiBFcnJvclVua25vd247CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIHN0cmluZyBCeXRlc1RvSGV4KGJ5dGVbXSBkYXRhKSB7CisgICAgICAgICAgICByZXR1cm4gQml0Q29udmVydGVyLlRvU3RyaW5nKGRhdGEpLlJlcGxhY2UoIi0iLCBzdHJpbmcuRW1wdHkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBieXRlW10gUHJlcGFyZVRlc3REYXRhKGJvb2wgcmFuZG9tRGlzdCwgYm9vbCBodWdlKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBodWdlID0gdHJ1ZSB0ZXN0cyBmb3IgVEhSSUZULTQzNzIKKyAgICAgICAgICAgIGJ5dGVbXSByZXR2YWwgPSBuZXcgYnl0ZVtodWdlID8gMHgxMjM0NSA6IDB4MTAwXTsKKyAgICAgICAgICAgIGludCBpbml0TGVuID0gcmV0dmFsLkxlbmd0aDsKKworICAgICAgICAgICAgLy8gbGluZWFyIGRpc3RyaWJ1dGlvbiwgdW5sZXNzIHJhbmRvbSBpcyByZXF1ZXN0ZWQKKyAgICAgICAgICAgIGlmICghcmFuZG9tRGlzdCkgeworICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW5pdExlbjsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHZhbFtpXSA9IChieXRlKWk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHJhbmRvbSBkaXN0cmlidXRpb24KKyAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW5pdExlbjsgKytpKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsW2ldID0gKGJ5dGUpMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhciBybmQgPSBuZXcgUmFuZG9tKCk7CisgICAgICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGluaXRMZW47ICsraSkgeworICAgICAgICAgICAgICAgIHdoaWxlKCB0cnVlKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBuZXh0UG9zID0gcm5kLk5leHQoKSAlIGluaXRMZW47CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXR2YWxbbmV4dFBvc10gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsW25leHRQb3NdID0gKGJ5dGUpaTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IEV4ZWN1dGVDbGllbnRUZXN0KFRocmlmdFRlc3QuQ2xpZW50IGNsaWVudCwgU2Vjb25kU2VydmljZS5DbGllbnQgc2Vjb25kLCBUZXN0UGFyYW1zIHBhcmFtKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgcmV0dXJuQ29kZSA9IDA7CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RWb2lkKCkiKTsKKyAgICAgICAgICAgIGNsaWVudC50ZXN0Vm9pZCgpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9IHZvaWQiKTsKKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdFN0cmluZyhcIlRlc3RcIikiKTsKKyAgICAgICAgICAgIHN0cmluZyBzID0gY2xpZW50LnRlc3RTdHJpbmcoIlRlc3QiKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSBcIiIgKyBzICsgIlwiIik7CisgICAgICAgICAgICBpZiAoIlRlc3QiICE9IHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckJhc2VUeXBlczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHBhcmFtLm11bHRpcGxleGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJzZWNvbmRUZXN0U3RyaW5nKFwiVGVzdDJcIikiKTsKKyAgICAgICAgICAgICAgICBzID0gc2Vjb25kLnNlY29uZHRlc3RTdHJpbmcoIlRlc3QyIik7CisgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSBcIiIgKyBzICsgIlwiIik7CisgICAgICAgICAgICAgIGlmICgidGVzdFN0cmluZyhcIlRlc3QyXCIpIiAhPSBzKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JQcm90b2NvbDsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0Qm9vbCh0cnVlKSIpOworICAgICAgICAgICAgYm9vbCB0ID0gY2xpZW50LnRlc3RCb29sKChib29sKXRydWUpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyB0KTsKKyAgICAgICAgICAgIGlmICghdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yQmFzZVR5cGVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEJvb2woZmFsc2UpIik7CisgICAgICAgICAgICBib29sIGYgPSBjbGllbnQudGVzdEJvb2woKGJvb2wpZmFsc2UpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyBmKTsKKyAgICAgICAgICAgIGlmIChmKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JCYXNlVHlwZXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RCeXRlKDEpIik7CisgICAgICAgICAgICBzYnl0ZSBpOCA9IGNsaWVudC50ZXN0Qnl0ZSgoc2J5dGUpMSk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gIiArIGk4KTsKKyAgICAgICAgICAgIGlmICgxICE9IGk4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JCYXNlVHlwZXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RJMzIoLTEpIik7CisgICAgICAgICAgICBpbnQgaTMyID0gY2xpZW50LnRlc3RJMzIoLTEpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyBpMzIpOworICAgICAgICAgICAgaWYgKC0xICE9IGkzMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yQmFzZVR5cGVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0STY0KC0zNDM1OTczODM2OCkiKTsKKyAgICAgICAgICAgIGxvbmcgaTY0ID0gY2xpZW50LnRlc3RJNjQoLTM0MzU5NzM4MzY4KTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgaTY0KTsKKyAgICAgICAgICAgIGlmICgtMzQzNTk3MzgzNjggIT0gaTY0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JCYXNlVHlwZXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFRPRE86IFZhbGlkYXRlIHJlY2VpdmVkIG1lc3NhZ2UKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3REb3VibGUoNS4zMjUwOTgyMzUpIik7CisgICAgICAgICAgICBkb3VibGUgZHViID0gY2xpZW50LnRlc3REb3VibGUoNS4zMjUwOTgyMzUpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyBkdWIpOworICAgICAgICAgICAgaWYgKDUuMzI1MDk4MjM1ICE9IGR1YikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yQmFzZVR5cGVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdERvdWJsZSgtMC4wMDAzNDEwMTI0Mzk2Mzg1OTgyNzkpIik7CisgICAgICAgICAgICBkdWIgPSBjbGllbnQudGVzdERvdWJsZSgtMC4wMDAzNDEwMTI0Mzk2Mzg1OTgyNzkpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyBkdWIpOworICAgICAgICAgICAgaWYgKC0wLjAwMDM0MTAxMjQzOTYzODU5ODI3OSAhPSBkdWIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckJhc2VUeXBlczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChpMzIgPSAwOyBpMzIgPCAyOyArK2kzMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgaHVnZSA9IChpMzIgPiAwKTsKKyAgICAgICAgICAgICAgICBieXRlW10gYmluT3V0ID0gUHJlcGFyZVRlc3REYXRhKGZhbHNlLGh1Z2UpOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RCaW5hcnkoIiArIEJ5dGVzVG9IZXgoYmluT3V0KSArICIpIik7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBieXRlW10gYmluSW4gPSBjbGllbnQudGVzdEJpbmFyeShiaW5PdXQpOworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gIiArIEJ5dGVzVG9IZXgoYmluSW4pKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJpbkluLkxlbmd0aCAhPSBiaW5PdXQuTGVuZ3RoKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JCYXNlVHlwZXM7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgb2ZzID0gMDsgb2ZzIDwgTWF0aC5NaW4oYmluSW4uTGVuZ3RoLCBiaW5PdXQuTGVuZ3RoKTsgKytvZnMpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmluSW5bb2ZzXSAhPSBiaW5PdXRbb2ZzXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yQmFzZVR5cGVzOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoVGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yQmFzZVR5cGVzOworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShleC5NZXNzYWdlICsgIiBTVDogIiArIGV4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gYmluYXJ5IGVxdWFscz8gb25seSB3aXRoIGhhc2hjb2RlIG9wdGlvbiBlbmFibGVkIC4uLgorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlRlc3QgQ3JhenlOZXN0aW5nIik7CisgICAgICAgICAgICBpZiggdHlwZW9mKENyYXp5TmVzdGluZykuR2V0TWV0aG9kKCJFcXVhbHMiKS5EZWNsYXJpbmdUeXBlID09IHR5cGVvZihDcmF6eU5lc3RpbmcpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENyYXp5TmVzdGluZyBvbmUgPSBuZXcgQ3JhenlOZXN0aW5nKCk7CisgICAgICAgICAgICAgICAgQ3JhenlOZXN0aW5nIHR3byA9IG5ldyBDcmF6eU5lc3RpbmcoKTsKKyAgICAgICAgICAgICAgICBvbmUuU3RyaW5nX2ZpZWxkID0gImNyYXp5IjsKKyAgICAgICAgICAgICAgICB0d28uU3RyaW5nX2ZpZWxkID0gImNyYXp5IjsKKyAgICAgICAgICAgICAgICBvbmUuQmluYXJ5X2ZpZWxkID0gbmV3IGJ5dGVbMTBdIHsgMHgwMCwgMHgwMSwgMHgwMiwgMHgwNCwgMHgwOCwgMHgxMCwgMHgyMCwgMHg0MCwgMHg4MCwgMHhGRiB9OworICAgICAgICAgICAgICAgIHR3by5CaW5hcnlfZmllbGQgPSBuZXcgYnl0ZVsxMF0geyAweDAwLCAweDAxLCAweDAyLCAweDA0LCAweDA4LCAweDEwLCAweDIwLCAweDQwLCAweDgwLCAweEZGIH07CisgICAgICAgICAgICAgICAgaWYgKCFvbmUuRXF1YWxzKHR3bykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckNvbnRhaW5lcnM7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIkNyYXp5TmVzdGluZy5FcXVhbHMgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBUT0RPOiBWYWxpZGF0ZSByZWNlaXZlZCBtZXNzYWdlCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0U3RydWN0KHtcIlplcm9cIiwgMSwgLTMsIC01fSkiKTsKKyAgICAgICAgICAgIFh0cnVjdCBvID0gbmV3IFh0cnVjdCgpOworICAgICAgICAgICAgby5TdHJpbmdfdGhpbmcgPSAiWmVybyI7CisgICAgICAgICAgICBvLkJ5dGVfdGhpbmcgPSAoc2J5dGUpMTsKKyAgICAgICAgICAgIG8uSTMyX3RoaW5nID0gLTM7CisgICAgICAgICAgICBvLkk2NF90aGluZyA9IC01OworICAgICAgICAgICAgWHRydWN0IGkgPSBjbGllbnQudGVzdFN0cnVjdChvKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSB7XCIiICsgaS5TdHJpbmdfdGhpbmcgKyAiXCIsICIgKyBpLkJ5dGVfdGhpbmcgKyAiLCAiICsgaS5JMzJfdGhpbmcgKyAiLCAiICsgaS5JNjRfdGhpbmcgKyAifSIpOworCisgICAgICAgICAgICAvLyBUT0RPOiBWYWxpZGF0ZSByZWNlaXZlZCBtZXNzYWdlCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0TmVzdCh7MSwge1wiWmVyb1wiLCAxLCAtMywgLTV9LCA1fSkiKTsKKyAgICAgICAgICAgIFh0cnVjdDIgbzIgPSBuZXcgWHRydWN0MigpOworICAgICAgICAgICAgbzIuQnl0ZV90aGluZyA9IChzYnl0ZSkxOworICAgICAgICAgICAgbzIuU3RydWN0X3RoaW5nID0gbzsKKyAgICAgICAgICAgIG8yLkkzMl90aGluZyA9IDU7CisgICAgICAgICAgICBYdHJ1Y3QyIGkyID0gY2xpZW50LnRlc3ROZXN0KG8yKTsKKyAgICAgICAgICAgIGkgPSBpMi5TdHJ1Y3RfdGhpbmc7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0geyIgKyBpMi5CeXRlX3RoaW5nICsgIiwge1wiIiArIGkuU3RyaW5nX3RoaW5nICsgIlwiLCAiICsgaS5CeXRlX3RoaW5nICsgIiwgIiArIGkuSTMyX3RoaW5nICsgIiwgIiArIGkuSTY0X3RoaW5nICsgIn0sICIgKyBpMi5JMzJfdGhpbmcgKyAifSIpOworCisgICAgICAgICAgICBEaWN0aW9uYXJ5PGludCwgaW50PiBtYXBvdXQgPSBuZXcgRGljdGlvbmFyeTxpbnQsIGludD4oKTsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgNTsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1hcG91dFtqXSA9IGogLSAxMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RNYXAoeyIpOworICAgICAgICAgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgICAgICAgICBmb3JlYWNoIChpbnQga2V5IGluIG1hcG91dC5LZXlzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIiwgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoa2V5ICsgIiA9PiAiICsgbWFwb3V0W2tleV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgifSkiKTsKKworICAgICAgICAgICAgRGljdGlvbmFyeTxpbnQsIGludD4gbWFwaW4gPSBjbGllbnQudGVzdE1hcChtYXBvdXQpOworCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCIgPSB7Iik7CisgICAgICAgICAgICBmaXJzdCA9IHRydWU7CisgICAgICAgICAgICBmb3JlYWNoIChpbnQga2V5IGluIG1hcGluLktleXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiLCAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZShrZXkgKyAiID0+ICIgKyBtYXBpbltrZXldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ9Iik7CisKKyAgICAgICAgICAgIC8vIFRPRE86IFZhbGlkYXRlIHJlY2VpdmVkIG1lc3NhZ2UKKyAgICAgICAgICAgIExpc3Q8aW50PiBsaXN0b3V0ID0gbmV3IExpc3Q8aW50PigpOworICAgICAgICAgICAgZm9yIChpbnQgaiA9IC0yOyBqIDwgMzsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxpc3RvdXQuQWRkKGopOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdExpc3QoeyIpOworICAgICAgICAgICAgZmlyc3QgPSB0cnVlOworICAgICAgICAgICAgZm9yZWFjaCAoaW50IGogaW4gbGlzdG91dCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCIsICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKGopOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgifSkiKTsKKworICAgICAgICAgICAgTGlzdDxpbnQ+IGxpc3RpbiA9IGNsaWVudC50ZXN0TGlzdChsaXN0b3V0KTsKKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiID0geyIpOworICAgICAgICAgICAgZmlyc3QgPSB0cnVlOworICAgICAgICAgICAgZm9yZWFjaCAoaW50IGogaW4gbGlzdGluKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIiwgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoaik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgifSIpOworCisgICAgICAgICAgICAvL3NldAorICAgICAgICAgICAgLy8gVE9ETzogVmFsaWRhdGUgcmVjZWl2ZWQgbWVzc2FnZQorICAgICAgICAgICAgVEhhc2hTZXQ8aW50PiBzZXRvdXQgPSBuZXcgVEhhc2hTZXQ8aW50PigpOworICAgICAgICAgICAgZm9yIChpbnQgaiA9IC0yOyBqIDwgMzsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNldG91dC5BZGQoaik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0U2V0KHsiKTsKKyAgICAgICAgICAgIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgICAgIGZvcmVhY2ggKGludCBqIGluIHNldG91dCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCIsICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKGopOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgifSkiKTsKKworICAgICAgICAgICAgVEhhc2hTZXQ8aW50PiBzZXRpbiA9IGNsaWVudC50ZXN0U2V0KHNldG91dCk7CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIiA9IHsiKTsKKyAgICAgICAgICAgIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgICAgIGZvcmVhY2ggKGludCBqIGluIHNldGluKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIiwgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoaik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgifSIpOworCisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RFbnVtKE9ORSkiKTsKKyAgICAgICAgICAgIE51bWJlcnogcmV0ID0gY2xpZW50LnRlc3RFbnVtKE51bWJlcnouT05FKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgcmV0KTsKKyAgICAgICAgICAgIGlmIChOdW1iZXJ6Lk9ORSAhPSByZXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvclN0cnVjdHM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RFbnVtKFRXTykiKTsKKyAgICAgICAgICAgIHJldCA9IGNsaWVudC50ZXN0RW51bShOdW1iZXJ6LlRXTyk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gIiArIHJldCk7CisgICAgICAgICAgICBpZiAoTnVtYmVyei5UV08gIT0gcmV0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JTdHJ1Y3RzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0RW51bShUSFJFRSkiKTsKKyAgICAgICAgICAgIHJldCA9IGNsaWVudC50ZXN0RW51bShOdW1iZXJ6LlRIUkVFKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgcmV0KTsKKyAgICAgICAgICAgIGlmIChOdW1iZXJ6LlRIUkVFICE9IHJldCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yU3RydWN0czsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEVudW0oRklWRSkiKTsKKyAgICAgICAgICAgIHJldCA9IGNsaWVudC50ZXN0RW51bShOdW1iZXJ6LkZJVkUpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyByZXQpOworICAgICAgICAgICAgaWYgKE51bWJlcnouRklWRSAhPSByZXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvclN0cnVjdHM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RFbnVtKEVJR0hUKSIpOworICAgICAgICAgICAgcmV0ID0gY2xpZW50LnRlc3RFbnVtKE51bWJlcnouRUlHSFQpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyByZXQpOworICAgICAgICAgICAgaWYgKE51bWJlcnouRUlHSFQgIT0gcmV0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JTdHJ1Y3RzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0VHlwZWRlZigzMDk4NTgyMzUwODI1MjMpIik7CisgICAgICAgICAgICBsb25nIHVpZCA9IGNsaWVudC50ZXN0VHlwZWRlZigzMDk4NTgyMzUwODI1MjNMKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgdWlkKTsKKyAgICAgICAgICAgIGlmICgzMDk4NTgyMzUwODI1MjNMICE9IHVpZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yU3RydWN0czsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVE9ETzogVmFsaWRhdGUgcmVjZWl2ZWQgbWVzc2FnZQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdE1hcE1hcCgxKSIpOworICAgICAgICAgICAgRGljdGlvbmFyeTxpbnQsIERpY3Rpb25hcnk8aW50LCBpbnQ+PiBtbSA9IGNsaWVudC50ZXN0TWFwTWFwKDEpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiID0geyIpOworICAgICAgICAgICAgZm9yZWFjaCAoaW50IGtleSBpbiBtbS5LZXlzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoa2V5ICsgIiA9PiB7Iik7CisgICAgICAgICAgICAgICAgRGljdGlvbmFyeTxpbnQsIGludD4gbTIgPSBtbVtrZXldOworICAgICAgICAgICAgICAgIGZvcmVhY2ggKGludCBrMiBpbiBtMi5LZXlzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZShrMiArICIgPT4gIiArIG0yW2syXSArICIsICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ9LCAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ9Iik7CisKKyAgICAgICAgICAgIC8vIFRPRE86IFZhbGlkYXRlIHJlY2VpdmVkIG1lc3NhZ2UKKyAgICAgICAgICAgIEluc2FuaXR5IGluc2FuZSA9IG5ldyBJbnNhbml0eSgpOworICAgICAgICAgICAgaW5zYW5lLlVzZXJNYXAgPSBuZXcgRGljdGlvbmFyeTxOdW1iZXJ6LCBsb25nPigpOworICAgICAgICAgICAgaW5zYW5lLlVzZXJNYXBbTnVtYmVyei5GSVZFXSA9IDUwMDBMOworICAgICAgICAgICAgWHRydWN0IHRydWNrID0gbmV3IFh0cnVjdCgpOworICAgICAgICAgICAgdHJ1Y2suU3RyaW5nX3RoaW5nID0gIlRydWNrIjsKKyAgICAgICAgICAgIHRydWNrLkJ5dGVfdGhpbmcgPSAoc2J5dGUpODsKKyAgICAgICAgICAgIHRydWNrLkkzMl90aGluZyA9IDg7CisgICAgICAgICAgICB0cnVjay5JNjRfdGhpbmcgPSA4OworICAgICAgICAgICAgaW5zYW5lLlh0cnVjdHMgPSBuZXcgTGlzdDxYdHJ1Y3Q+KCk7CisgICAgICAgICAgICBpbnNhbmUuWHRydWN0cy5BZGQodHJ1Y2spOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEluc2FuaXR5KCkiKTsKKyAgICAgICAgICAgIERpY3Rpb25hcnk8bG9uZywgRGljdGlvbmFyeTxOdW1iZXJ6LCBJbnNhbml0eT4+IHdob2EgPSBjbGllbnQudGVzdEluc2FuaXR5KGluc2FuZSk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCIgPSB7Iik7CisgICAgICAgICAgICBmb3JlYWNoIChsb25nIGtleSBpbiB3aG9hLktleXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRGljdGlvbmFyeTxOdW1iZXJ6LCBJbnNhbml0eT4gdmFsID0gd2hvYVtrZXldOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoa2V5ICsgIiA9PiB7Iik7CisKKyAgICAgICAgICAgICAgICBmb3JlYWNoIChOdW1iZXJ6IGsyIGluIHZhbC5LZXlzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgSW5zYW5pdHkgdjIgPSB2YWxbazJdOworCisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoazIgKyAiID0+IHsiKTsKKyAgICAgICAgICAgICAgICAgICAgRGljdGlvbmFyeTxOdW1iZXJ6LCBsb25nPiB1c2VyTWFwID0gdjIuVXNlck1hcDsKKworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ7Iik7CisgICAgICAgICAgICAgICAgICAgIGlmICh1c2VyTWFwICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKE51bWJlcnogazMgaW4gdXNlck1hcC5LZXlzKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoazMgKyAiID0+ICIgKyB1c2VyTWFwW2szXSArICIsICIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgibnVsbCIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIn0sICIpOworCisgICAgICAgICAgICAgICAgICAgIExpc3Q8WHRydWN0PiB4dHJ1Y3RzID0gdjIuWHRydWN0czsKKworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ7Iik7CisgICAgICAgICAgICAgICAgICAgIGlmICh4dHJ1Y3RzICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKFh0cnVjdCB4IGluIHh0cnVjdHMpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgie1wiIiArIHguU3RyaW5nX3RoaW5nICsgIlwiLCAiICsgeC5CeXRlX3RoaW5nICsgIiwgIiArIHguSTMyX3RoaW5nICsgIiwgIiArIHguSTMyX3RoaW5nICsgIn0sICIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgibnVsbCIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIn0iKTsKKworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ9LCAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgifSwgIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgifSIpOworCisgICAgICAgICAgICBzYnl0ZSBhcmcwID0gMTsKKyAgICAgICAgICAgIGludCBhcmcxID0gMjsKKyAgICAgICAgICAgIGxvbmcgYXJnMiA9IGxvbmcuTWF4VmFsdWU7CisgICAgICAgICAgICBEaWN0aW9uYXJ5PHNob3J0LCBzdHJpbmc+IG11bHRpRGljdCA9IG5ldyBEaWN0aW9uYXJ5PHNob3J0LCBzdHJpbmc+KCk7CisgICAgICAgICAgICBtdWx0aURpY3RbMV0gPSAib25lIjsKKyAgICAgICAgICAgIE51bWJlcnogYXJnNCA9IE51bWJlcnouRklWRTsKKyAgICAgICAgICAgIGxvbmcgYXJnNSA9IDUwMDAwMDA7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJUZXN0IE11bHRpKCIgKyBhcmcwICsgIiwiICsgYXJnMSArICIsIiArIGFyZzIgKyAiLCIgKyBtdWx0aURpY3QgKyAiLCIgKyBhcmc0ICsgIiwiICsgYXJnNSArICIpIik7CisgICAgICAgICAgICBYdHJ1Y3QgbXVsdGlSZXNwb25zZSA9IGNsaWVudC50ZXN0TXVsdGkoYXJnMCwgYXJnMSwgYXJnMiwgbXVsdGlEaWN0LCBhcmc0LCBhcmc1KTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIiA9IFh0cnVjdChieXRlX3RoaW5nOiIgKyBtdWx0aVJlc3BvbnNlLkJ5dGVfdGhpbmcgKyAiLFN0cmluZ190aGluZzoiICsgbXVsdGlSZXNwb25zZS5TdHJpbmdfdGhpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIixpMzJfdGhpbmc6IiArIG11bHRpUmVzcG9uc2UuSTMyX3RoaW5nICsgIixpNjRfdGhpbmc6IiArIG11bHRpUmVzcG9uc2UuSTY0X3RoaW5nICsgIilcbiIpOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgidGVzdEV4Y2VwdGlvbihcIlhjZXB0aW9uXCIpIik7CisgICAgICAgICAgICAgICAgY2xpZW50LnRlc3RFeGNlcHRpb24oIlhjZXB0aW9uIik7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckV4Y2VwdGlvbnM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoWGNlcHRpb24gZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGV4LkVycm9yQ29kZSAhPSAxMDAxIHx8IGV4Lk1lc3NhZ2UgIT0gIlhjZXB0aW9uIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yRXhjZXB0aW9uczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JFeGNlcHRpb25zOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGV4Lk1lc3NhZ2UgKyAiIFNUOiAiICsgZXguU3RhY2tUcmFjZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgidGVzdEV4Y2VwdGlvbihcIlRFeGNlcHRpb25cIikiKTsKKyAgICAgICAgICAgICAgICBjbGllbnQudGVzdEV4Y2VwdGlvbigiVEV4Y2VwdGlvbiIpOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JFeGNlcHRpb25zOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFRocmlmdC5URXhjZXB0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIE9LCisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JFeGNlcHRpb25zOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGV4Lk1lc3NhZ2UgKyAiIFNUOiAiICsgZXguU3RhY2tUcmFjZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgidGVzdEV4Y2VwdGlvbihcIm9rXCIpIik7CisgICAgICAgICAgICAgICAgY2xpZW50LnRlc3RFeGNlcHRpb24oIm9rIik7CisgICAgICAgICAgICAgICAgLy8gT0sKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckV4Y2VwdGlvbnM7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZXguTWVzc2FnZSArICIgU1Q6ICIgKyBleC5TdGFja1RyYWNlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInRlc3RNdWx0aUV4Y2VwdGlvbihcIlhjZXB0aW9uXCIsIC4uLikiKTsKKyAgICAgICAgICAgICAgICBjbGllbnQudGVzdE11bHRpRXhjZXB0aW9uKCJYY2VwdGlvbiIsICJpZ25vcmUiKTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yRXhjZXB0aW9uczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChYY2VwdGlvbiBleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZXguRXJyb3JDb2RlICE9IDEwMDEgfHwgZXguTWVzc2FnZSAhPSAiVGhpcyBpcyBhbiBYY2VwdGlvbiIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckV4Y2VwdGlvbnM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yRXhjZXB0aW9uczsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShleC5NZXNzYWdlICsgIiBTVDogIiArIGV4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInRlc3RNdWx0aUV4Y2VwdGlvbihcIlhjZXB0aW9uMlwiLCAuLi4pIik7CisgICAgICAgICAgICAgICAgY2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbigiWGNlcHRpb24yIiwgImlnbm9yZSIpOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JFeGNlcHRpb25zOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFhjZXB0aW9uMiBleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZXguRXJyb3JDb2RlICE9IDIwMDIgfHwgZXguU3RydWN0X3RoaW5nLlN0cmluZ190aGluZyAhPSAiVGhpcyBpcyBhbiBYY2VwdGlvbjIiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JFeGNlcHRpb25zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckV4Y2VwdGlvbnM7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZXguTWVzc2FnZSArICIgU1Q6ICIgKyBleC5TdGFja1RyYWNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ0ZXN0TXVsdGlFeGNlcHRpb24oXCJzdWNjZXNzXCIsIFwiT0tcIikiKTsKKyAgICAgICAgICAgICAgICBpZiAoIk9LIiAhPSBjbGllbnQudGVzdE11bHRpRXhjZXB0aW9uKCJzdWNjZXNzIiwgIk9LIikuU3RyaW5nX3RoaW5nKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JFeGNlcHRpb25zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckV4Y2VwdGlvbnM7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZXguTWVzc2FnZSArICIgU1Q6ICIgKyBleC5TdGFja1RyYWNlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RvcHdhdGNoIHN3ID0gbmV3IFN0b3B3YXRjaCgpOworICAgICAgICAgICAgc3cuU3RhcnQoKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJUZXN0IE9uZXdheSgxKSIpOworICAgICAgICAgICAgY2xpZW50LnRlc3RPbmV3YXkoMSk7CisgICAgICAgICAgICBzdy5TdG9wKCk7CisgICAgICAgICAgICBpZiAoc3cuRWxhcHNlZE1pbGxpc2Vjb25kcyA+IDEwMDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckJhc2VUeXBlczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiVGVzdCBDYWxsdGltZSgpIik7CisgICAgICAgICAgICB2YXIgdGltZXMgPSA1MDsKKyAgICAgICAgICAgIHN3LlJlc2V0KCk7CisgICAgICAgICAgICBzdy5TdGFydCgpOworICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCB0aW1lczsgKytrKQorICAgICAgICAgICAgICAgIGNsaWVudC50ZXN0Vm9pZCgpOworICAgICAgICAgICAgc3cuU3RvcCgpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9IHswfSBtcyBhIHRlc3RWb2lkKCkgY2FsbCIsIHN3LkVsYXBzZWRNaWxsaXNlY29uZHMgLyB0aW1lcyk7CisgICAgICAgICAgICByZXR1cm4gcmV0dXJuQ29kZTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvY3NoYXJwL1Rlc3RTZXJ2ZXIuY3MgYi90ZXN0L2NzaGFycC9UZXN0U2VydmVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmNjQ1YzIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NzaGFycC9UZXN0U2VydmVyLmNzCkBAIC0wLDAgKzEsNTM1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZQorLy8KKy8vIFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFIG9yIHZpc2l0IHRoZSBUaHJpZnQgc2l0ZSBhdDoKKy8vIGh0dHA6Ly9kZXZlbG9wZXJzLmZhY2Vib29rLmNvbS90aHJpZnQvCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5TZWN1cml0eS5DcnlwdG9ncmFwaHkuWDUwOUNlcnRpZmljYXRlczsKK3VzaW5nIFRocmlmdC5Db2xsZWN0aW9uczsKK3VzaW5nIFRocmlmdC5UZXN0OyAvL2dlbmVyYXRlZCBjb2RlCit1c2luZyBUaHJpZnQuVHJhbnNwb3J0OwordXNpbmcgVGhyaWZ0LlByb3RvY29sOwordXNpbmcgVGhyaWZ0LlNlcnZlcjsKK3VzaW5nIFRocmlmdDsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5TZWN1cml0eS5BdXRoZW50aWNhdGlvbjsKKworbmFtZXNwYWNlIFRlc3QKK3sKKyAgICBwdWJsaWMgY2xhc3MgVGVzdFNlcnZlcgorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgX2NsaWVudElEID0gLTE7CisgICAgICAgIHB1YmxpYyBkZWxlZ2F0ZSB2b2lkIFRlc3RMb2dEZWxlZ2F0ZShzdHJpbmcgbXNnLCBwYXJhbXMgb2JqZWN0W10gdmFsdWVzKTsKKworICAgICAgICBwdWJsaWMgY2xhc3MgVHJhZGVTZXJ2ZXJFdmVudEhhbmRsZXIgOiBUU2VydmVyRXZlbnRIYW5kbGVyCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgY2FsbENvdW50ID0gMDsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHByZVNlcnZlKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYWxsQ291bnQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgY3JlYXRlQ29udGV4dChUaHJpZnQuUHJvdG9jb2wuVFByb3RvY29sIGlucHV0LCBUaHJpZnQuUHJvdG9jb2wuVFByb3RvY29sIG91dHB1dCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYWxsQ291bnQrKzsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGRlbGV0ZUNvbnRleHQoT2JqZWN0IHNlcnZlckNvbnRleHQsIFRocmlmdC5Qcm90b2NvbC5UUHJvdG9jb2wgaW5wdXQsIFRocmlmdC5Qcm90b2NvbC5UUHJvdG9jb2wgb3V0cHV0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhbGxDb3VudCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVibGljIHZvaWQgcHJvY2Vzc0NvbnRleHQoT2JqZWN0IHNlcnZlckNvbnRleHQsIFRocmlmdC5UcmFuc3BvcnQuVFRyYW5zcG9ydCB0cmFuc3BvcnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FsbENvdW50Kys7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKworICAgICAgICBwdWJsaWMgY2xhc3MgVGVzdEhhbmRsZXIgOiBUaHJpZnRUZXN0LklmYWNlLCBUaHJpZnQuVENvbnRyb2xsaW5nSGFuZGxlcgorICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgVFNlcnZlciBzZXJ2ZXIgeyBnZXQ7IHNldDsgfQorICAgICAgICAgICAgcHJpdmF0ZSBpbnQgaGFuZGxlcklEOworICAgICAgICAgICAgcHJpdmF0ZSBTdHJpbmdCdWlsZGVyIHJldXNhYmxlU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICBwcml2YXRlIFRlc3RMb2dEZWxlZ2F0ZSB0ZXN0TG9nRGVsZWdhdGU7CisKKyAgICAgICAgICAgIHB1YmxpYyBUZXN0SGFuZGxlcigpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaGFuZGxlcklEID0gSW50ZXJsb2NrZWQuSW5jcmVtZW50KHJlZiBfY2xpZW50SUQpOworICAgICAgICAgICAgICAgIHRlc3RMb2dEZWxlZ2F0ZSArPSB0ZXN0Q29uc29sZUxvZ2dlcjsKKyAgICAgICAgICAgICAgICB0ZXN0TG9nRGVsZWdhdGUuSW52b2tlKCJOZXcgVGVzdEhhbmRsZXIgaW5zdGFuY2UgY3JlYXRlZCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc29sZUxvZ2dlcihzdHJpbmcgbXNnLCBwYXJhbXMgb2JqZWN0W10gdmFsdWVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldXNhYmxlU3RyaW5nQnVpbGRlci5DbGVhcigpOworICAgICAgICAgICAgICAgIHJldXNhYmxlU3RyaW5nQnVpbGRlci5BcHBlbmRGb3JtYXQoImhhbmRsZXJ7MDpEM306IixoYW5kbGVySUQpOworICAgICAgICAgICAgICAgIHJldXNhYmxlU3RyaW5nQnVpbGRlci5BcHBlbmRGb3JtYXQobXNnLCB2YWx1ZXMpOworICAgICAgICAgICAgICAgIHJldXNhYmxlU3RyaW5nQnVpbGRlci5BcHBlbmRMaW5lKCk7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSggcmV1c2FibGVTdHJpbmdCdWlsZGVyLlRvU3RyaW5nKCkgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgdGVzdFZvaWQoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlc3RMb2dEZWxlZ2F0ZS5JbnZva2UoInRlc3RWb2lkKCkiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHN0cmluZyB0ZXN0U3RyaW5nKHN0cmluZyB0aGluZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ZXN0TG9nRGVsZWdhdGUuSW52b2tlKCJ0ZXN0U3RyaW5nKHswfSkiLCB0aGluZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaW5nOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgYm9vbCB0ZXN0Qm9vbChib29sIHRoaW5nKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlc3RMb2dEZWxlZ2F0ZS5JbnZva2UoInRlc3RCb29sKHswfSkiLCB0aGluZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaW5nOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgc2J5dGUgdGVzdEJ5dGUoc2J5dGUgdGhpbmcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGVzdExvZ0RlbGVnYXRlLkludm9rZSgidGVzdEJ5dGUoezB9KSIsIHRoaW5nKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpbmc7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgdGVzdEkzMihpbnQgdGhpbmcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGVzdExvZ0RlbGVnYXRlLkludm9rZSgidGVzdEkzMih7MH0pIiwgdGhpbmcpOworICAgICAgICAgICAgICAgIHJldHVybiB0aGluZzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGxvbmcgdGVzdEk2NChsb25nIHRoaW5nKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlc3RMb2dEZWxlZ2F0ZS5JbnZva2UoInRlc3RJNjQoezB9KSIsIHRoaW5nKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpbmc7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBkb3VibGUgdGVzdERvdWJsZShkb3VibGUgdGhpbmcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGVzdExvZ0RlbGVnYXRlLkludm9rZSgidGVzdERvdWJsZSh7MH0pIiwgdGhpbmcpOworICAgICAgICAgICAgICAgIHJldHVybiB0aGluZzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGJ5dGVbXSB0ZXN0QmluYXJ5KGJ5dGVbXSB0aGluZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdHJpbmcgaGV4ID0gQml0Q29udmVydGVyLlRvU3RyaW5nKHRoaW5nKS5SZXBsYWNlKCItIiwgc3RyaW5nLkVtcHR5KTsKKyAgICAgICAgICAgICAgICB0ZXN0TG9nRGVsZWdhdGUuSW52b2tlKCJ0ZXN0QmluYXJ5KHswOlh9KSIsIGhleCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaW5nOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgWHRydWN0IHRlc3RTdHJ1Y3QoWHRydWN0IHRoaW5nKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlc3RMb2dEZWxlZ2F0ZS5JbnZva2UoInRlc3RTdHJ1Y3Qoe3tcInswfVwiLCB7MX0sIHsyfSwgezN9fX0pIiwgdGhpbmcuU3RyaW5nX3RoaW5nLCB0aGluZy5CeXRlX3RoaW5nLCB0aGluZy5JMzJfdGhpbmcsIHRoaW5nLkk2NF90aGluZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaW5nOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgWHRydWN0MiB0ZXN0TmVzdChYdHJ1Y3QyIG5lc3QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgWHRydWN0IHRoaW5nID0gbmVzdC5TdHJ1Y3RfdGhpbmc7CisgICAgICAgICAgICAgICAgdGVzdExvZ0RlbGVnYXRlLkludm9rZSgidGVzdE5lc3Qoe3t7MH0sIHt7XCJ7MX1cIiwgezJ9LCB7M30sIHs0fSwgezV9fX19fSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVzdC5CeXRlX3RoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpbmcuU3RyaW5nX3RoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpbmcuQnl0ZV90aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaW5nLkkzMl90aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaW5nLkk2NF90aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lc3QuSTMyX3RoaW5nKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmVzdDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIERpY3Rpb25hcnk8aW50LCBpbnQ+IHRlc3RNYXAoRGljdGlvbmFyeTxpbnQsIGludD4gdGhpbmcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV1c2FibGVTdHJpbmdCdWlsZGVyLkNsZWFyKCk7CisgICAgICAgICAgICAgICAgcmV1c2FibGVTdHJpbmdCdWlsZGVyLkFwcGVuZCgidGVzdE1hcCh7eyIpOworICAgICAgICAgICAgICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgICAgICAgICAgICAgIGZvcmVhY2ggKGludCBrZXkgaW4gdGhpbmcuS2V5cykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldXNhYmxlU3RyaW5nQnVpbGRlci5BcHBlbmQoIiwgIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV1c2FibGVTdHJpbmdCdWlsZGVyLkFwcGVuZEZvcm1hdCgiezB9ID0+IHsxfSIsIGtleSwgdGhpbmdba2V5XSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldXNhYmxlU3RyaW5nQnVpbGRlci5BcHBlbmQoIn19KSIpOworICAgICAgICAgICAgICAgIHRlc3RMb2dEZWxlZ2F0ZS5JbnZva2UocmV1c2FibGVTdHJpbmdCdWlsZGVyLlRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHJldHVybiB0aGluZzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIERpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc+IHRlc3RTdHJpbmdNYXAoRGljdGlvbmFyeTxzdHJpbmcsIHN0cmluZz4gdGhpbmcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV1c2FibGVTdHJpbmdCdWlsZGVyLkNsZWFyKCk7CisgICAgICAgICAgICAgICAgcmV1c2FibGVTdHJpbmdCdWlsZGVyLkFwcGVuZCgidGVzdFN0cmluZ01hcCh7eyIpOworICAgICAgICAgICAgICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgICAgICAgICAgICAgIGZvcmVhY2ggKHN0cmluZyBrZXkgaW4gdGhpbmcuS2V5cykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldXNhYmxlU3RyaW5nQnVpbGRlci5BcHBlbmQoIiwgIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV1c2FibGVTdHJpbmdCdWlsZGVyLkFwcGVuZEZvcm1hdCgiezB9ID0+IHsxfSIsIGtleSwgdGhpbmdba2V5XSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldXNhYmxlU3RyaW5nQnVpbGRlci5BcHBlbmQoIn19KSIpOworICAgICAgICAgICAgICAgIHRlc3RMb2dEZWxlZ2F0ZS5JbnZva2UocmV1c2FibGVTdHJpbmdCdWlsZGVyLlRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHJldHVybiB0aGluZzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFRIYXNoU2V0PGludD4gdGVzdFNldChUSGFzaFNldDxpbnQ+IHRoaW5nKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldXNhYmxlU3RyaW5nQnVpbGRlci5DbGVhcigpOworICAgICAgICAgICAgICAgIHJldXNhYmxlU3RyaW5nQnVpbGRlci5BcHBlbmQoInRlc3RTZXQoe3siKTsKKyAgICAgICAgICAgICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBmb3JlYWNoIChpbnQgZWxlbSBpbiB0aGluZykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldXNhYmxlU3RyaW5nQnVpbGRlci5BcHBlbmQoIiwgIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV1c2FibGVTdHJpbmdCdWlsZGVyLkFwcGVuZEZvcm1hdCgiezB9IiwgZWxlbSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldXNhYmxlU3RyaW5nQnVpbGRlci5BcHBlbmQoIn19KSIpOworICAgICAgICAgICAgICAgIHRlc3RMb2dEZWxlZ2F0ZS5JbnZva2UocmV1c2FibGVTdHJpbmdCdWlsZGVyLlRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHJldHVybiB0aGluZzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIExpc3Q8aW50PiB0ZXN0TGlzdChMaXN0PGludD4gdGhpbmcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV1c2FibGVTdHJpbmdCdWlsZGVyLkNsZWFyKCk7CisgICAgICAgICAgICAgICAgcmV1c2FibGVTdHJpbmdCdWlsZGVyLkFwcGVuZCgidGVzdExpc3Qoe3siKTsKKyAgICAgICAgICAgICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBmb3JlYWNoIChpbnQgZWxlbSBpbiB0aGluZykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldXNhYmxlU3RyaW5nQnVpbGRlci5BcHBlbmQoIiwgIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV1c2FibGVTdHJpbmdCdWlsZGVyLkFwcGVuZEZvcm1hdCgiezB9IiwgZWxlbSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldXNhYmxlU3RyaW5nQnVpbGRlci5BcHBlbmQoIn19KSIpOworICAgICAgICAgICAgICAgIHRlc3RMb2dEZWxlZ2F0ZS5JbnZva2UocmV1c2FibGVTdHJpbmdCdWlsZGVyLlRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHJldHVybiB0aGluZzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIE51bWJlcnogdGVzdEVudW0oTnVtYmVyeiB0aGluZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ZXN0TG9nRGVsZWdhdGUuSW52b2tlKCJ0ZXN0RW51bSh7MH0pIiwgdGhpbmcpOworICAgICAgICAgICAgICAgIHJldHVybiB0aGluZzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGxvbmcgdGVzdFR5cGVkZWYobG9uZyB0aGluZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ZXN0TG9nRGVsZWdhdGUuSW52b2tlKCJ0ZXN0VHlwZWRlZih7MH0pIiwgdGhpbmcpOworICAgICAgICAgICAgICAgIHJldHVybiB0aGluZzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIERpY3Rpb25hcnk8aW50LCBEaWN0aW9uYXJ5PGludCwgaW50Pj4gdGVzdE1hcE1hcChpbnQgaGVsbG8pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGVzdExvZ0RlbGVnYXRlLkludm9rZSgidGVzdE1hcE1hcCh7MH0pIiwgaGVsbG8pOworICAgICAgICAgICAgICAgIERpY3Rpb25hcnk8aW50LCBEaWN0aW9uYXJ5PGludCwgaW50Pj4gbWFwbWFwID0KKyAgICAgICAgICAgICAgICAgIG5ldyBEaWN0aW9uYXJ5PGludCwgRGljdGlvbmFyeTxpbnQsIGludD4+KCk7CisKKyAgICAgICAgICAgICAgICBEaWN0aW9uYXJ5PGludCwgaW50PiBwb3MgPSBuZXcgRGljdGlvbmFyeTxpbnQsIGludD4oKTsKKyAgICAgICAgICAgICAgICBEaWN0aW9uYXJ5PGludCwgaW50PiBuZWcgPSBuZXcgRGljdGlvbmFyeTxpbnQsIGludD4oKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IDU7IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBvc1tpXSA9IGk7CisgICAgICAgICAgICAgICAgICAgIG5lZ1staV0gPSAtaTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBtYXBtYXBbNF0gPSBwb3M7CisgICAgICAgICAgICAgICAgbWFwbWFwWy00XSA9IG5lZzsKKworICAgICAgICAgICAgICAgIHJldHVybiBtYXBtYXA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEluc2FuaXR5CisgICAgICAgICAgICAvLyByZXR1cm5zOgorICAgICAgICAgICAgLy8geyAxID0+IHsgMiA9PiBhcmd1bWVudCwKKyAgICAgICAgICAgIC8vICAgICAgICAgIDMgPT4gYXJndW1lbnQsCisgICAgICAgICAgICAvLyAgICAgICAgfSwKKyAgICAgICAgICAgIC8vICAgMiA9PiB7IDYgPT4gPGVtcHR5IEluc2FuaXR5IHN0cnVjdD4sIH0sCisgICAgICAgICAgICAvLyB9CisgICAgICAgICAgICBwdWJsaWMgRGljdGlvbmFyeTxsb25nLCBEaWN0aW9uYXJ5PE51bWJlcnosIEluc2FuaXR5Pj4gdGVzdEluc2FuaXR5KEluc2FuaXR5IGFyZ3VtZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlc3RMb2dEZWxlZ2F0ZS5JbnZva2UoInRlc3RJbnNhbml0eSgpIik7CisKKyAgICAgICAgICAgICAgICBEaWN0aW9uYXJ5PE51bWJlcnosIEluc2FuaXR5PiBmaXJzdF9tYXAgPSBuZXcgRGljdGlvbmFyeTxOdW1iZXJ6LCBJbnNhbml0eT4oKTsKKyAgICAgICAgICAgICAgICBEaWN0aW9uYXJ5PE51bWJlcnosIEluc2FuaXR5PiBzZWNvbmRfbWFwID0gbmV3IERpY3Rpb25hcnk8TnVtYmVyeiwgSW5zYW5pdHk+KCk7IDsKKworICAgICAgICAgICAgICAgIGZpcnN0X21hcFtOdW1iZXJ6LlRXT10gPSBhcmd1bWVudDsKKyAgICAgICAgICAgICAgICBmaXJzdF9tYXBbTnVtYmVyei5USFJFRV0gPSBhcmd1bWVudDsKKworICAgICAgICAgICAgICAgIHNlY29uZF9tYXBbTnVtYmVyei5TSVhdID0gbmV3IEluc2FuaXR5KCk7CisKKyAgICAgICAgICAgICAgICBEaWN0aW9uYXJ5PGxvbmcsIERpY3Rpb25hcnk8TnVtYmVyeiwgSW5zYW5pdHk+PiBpbnNhbmUgPQorICAgICAgICAgICAgICAgICAgbmV3IERpY3Rpb25hcnk8bG9uZywgRGljdGlvbmFyeTxOdW1iZXJ6LCBJbnNhbml0eT4+KCk7CisgICAgICAgICAgICAgICAgaW5zYW5lWyhsb25nKTFdID0gZmlyc3RfbWFwOworICAgICAgICAgICAgICAgIGluc2FuZVsobG9uZykyXSA9IHNlY29uZF9tYXA7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gaW5zYW5lOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgWHRydWN0IHRlc3RNdWx0aShzYnl0ZSBhcmcwLCBpbnQgYXJnMSwgbG9uZyBhcmcyLCBEaWN0aW9uYXJ5PHNob3J0LCBzdHJpbmc+IGFyZzMsIE51bWJlcnogYXJnNCwgbG9uZyBhcmc1KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlc3RMb2dEZWxlZ2F0ZS5JbnZva2UoInRlc3RNdWx0aSgpIik7CisKKyAgICAgICAgICAgICAgICBYdHJ1Y3QgaGVsbG8gPSBuZXcgWHRydWN0KCk7IDsKKyAgICAgICAgICAgICAgICBoZWxsby5TdHJpbmdfdGhpbmcgPSAiSGVsbG8yIjsKKyAgICAgICAgICAgICAgICBoZWxsby5CeXRlX3RoaW5nID0gYXJnMDsKKyAgICAgICAgICAgICAgICBoZWxsby5JMzJfdGhpbmcgPSBhcmcxOworICAgICAgICAgICAgICAgIGhlbGxvLkk2NF90aGluZyA9IGFyZzI7CisgICAgICAgICAgICAgICAgcmV0dXJuIGhlbGxvOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIFByaW50ICd0ZXN0RXhjZXB0aW9uKCVzKScgd2l0aCBhcmcgYXMgJyVzJworICAgICAgICAgICAgICogQHBhcmFtIHN0cmluZyBhcmcgLSBhIHN0cmluZyBpbmRpY2F0aW9uIHdoYXQgdHlwZSBvZiBleGNlcHRpb24gdG8gdGhyb3cKKyAgICAgICAgICAgICAqIGlmIGFyZyA9PSAiWGNlcHRpb24iIHRocm93IFhjZXB0aW9uIHdpdGggZXJyb3JDb2RlID0gMTAwMSBhbmQgbWVzc2FnZSA9IGFyZworICAgICAgICAgICAgICogZWxzZW4gaWYgYXJnID09ICJURXhjZXB0aW9uIiB0aHJvdyBURXhjZXB0aW9uCisgICAgICAgICAgICAgKiBlbHNlIGRvIG5vdCB0aHJvdyBhbnl0aGluZworICAgICAgICAgICAgICovCisgICAgICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0RXhjZXB0aW9uKHN0cmluZyBhcmcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGVzdExvZ0RlbGVnYXRlLkludm9rZSgidGVzdEV4Y2VwdGlvbih7MH0pIiwgYXJnKTsKKyAgICAgICAgICAgICAgICBpZiAoYXJnID09ICJYY2VwdGlvbiIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBYY2VwdGlvbiB4ID0gbmV3IFhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIHguRXJyb3JDb2RlID0gMTAwMTsKKyAgICAgICAgICAgICAgICAgICAgeC5NZXNzYWdlID0gYXJnOworICAgICAgICAgICAgICAgICAgICB0aHJvdyB4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoYXJnID09ICJURXhjZXB0aW9uIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUaHJpZnQuVEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBYdHJ1Y3QgdGVzdE11bHRpRXhjZXB0aW9uKHN0cmluZyBhcmcwLCBzdHJpbmcgYXJnMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ZXN0TG9nRGVsZWdhdGUuSW52b2tlKCJ0ZXN0TXVsdGlFeGNlcHRpb24oezB9LCB7MX0pIiwgYXJnMCxhcmcxKTsKKyAgICAgICAgICAgICAgICBpZiAoYXJnMCA9PSAiWGNlcHRpb24iKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgWGNlcHRpb24geCA9IG5ldyBYY2VwdGlvbigpOworICAgICAgICAgICAgICAgICAgICB4LkVycm9yQ29kZSA9IDEwMDE7CisgICAgICAgICAgICAgICAgICAgIHguTWVzc2FnZSA9ICJUaGlzIGlzIGFuIFhjZXB0aW9uIjsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgeDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnMCA9PSAiWGNlcHRpb24yIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFhjZXB0aW9uMiB4ID0gbmV3IFhjZXB0aW9uMigpOworICAgICAgICAgICAgICAgICAgICB4LkVycm9yQ29kZSA9IDIwMDI7CisgICAgICAgICAgICAgICAgICAgIHguU3RydWN0X3RoaW5nID0gbmV3IFh0cnVjdCgpOworICAgICAgICAgICAgICAgICAgICB4LlN0cnVjdF90aGluZy5TdHJpbmdfdGhpbmcgPSAiVGhpcyBpcyBhbiBYY2VwdGlvbjIiOworICAgICAgICAgICAgICAgICAgICB0aHJvdyB4OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIFh0cnVjdCByZXN1bHQgPSBuZXcgWHRydWN0KCk7CisgICAgICAgICAgICAgICAgcmVzdWx0LlN0cmluZ190aGluZyA9IGFyZzE7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgdGVzdFN0b3AoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChzZXJ2ZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNlcnZlci5TdG9wKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0T25ld2F5KGludCBhcmcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGVzdExvZ0RlbGVnYXRlLkludm9rZSgidGVzdE9uZXdheSh7MH0pLCBzbGVlcGluZy4uLiIsIGFyZyk7CisgICAgICAgICAgICAgICAgU3lzdGVtLlRocmVhZGluZy5UaHJlYWQuU2xlZXAoYXJnICogMTAwMCk7CisgICAgICAgICAgICAgICAgdGVzdExvZ0RlbGVnYXRlLkludm9rZSgidGVzdE9uZXdheSBmaW5pc2hlZCIpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0gLy8gY2xhc3MgVGVzdEhhbmRsZXIKKworICAgICAgICBwcml2YXRlIGVudW0gU2VydmVyVHlwZQorICAgICAgICB7CisgICAgICAgICAgICBUU2ltcGxlU2VydmVyLAorICAgICAgICAgICAgVFRocmVhZGVkU2VydmVyLAorICAgICAgICAgICAgVFRocmVhZFBvb2xTZXJ2ZXIsCisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGVudW0gUHJvY2Vzc29yRmFjdG9yeVR5cGUKKyAgICAgICAgeworICAgICAgICAgICAgVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnksCisgICAgICAgICAgICBUUHJvdG90eXBlUHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbCBFeGVjdXRlKHN0cmluZ1tdIGFyZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJvb2wgdXNlQnVmZmVyZWRTb2NrZXRzID0gZmFsc2UsIHVzZUZyYW1lZCA9IGZhbHNlLCB1c2VFbmNyeXB0aW9uID0gZmFsc2UsIGNvbXBhY3QgPSBmYWxzZSwganNvbiA9IGZhbHNlOworICAgICAgICAgICAgICAgIFNlcnZlclR5cGUgc2VydmVyVHlwZSA9IFNlcnZlclR5cGUuVFNpbXBsZVNlcnZlcjsKKyAgICAgICAgICAgICAgICBQcm9jZXNzb3JGYWN0b3J5VHlwZSBwcm9jZXNzb3JGYWN0b3J5VHlwZSA9IFByb2Nlc3NvckZhY3RvcnlUeXBlLlRTaW5nbGV0b25Qcm9jZXNzb3JGYWN0b3J5OworICAgICAgICAgICAgICAgIGludCBwb3J0ID0gOTA5MDsKKyAgICAgICAgICAgICAgICBzdHJpbmcgcGlwZSA9IG51bGw7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLkxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ3NbaV0gPT0gIi1waXBlIikgIC8vIC1waXBlIG5hbWUKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcGlwZSA9IGFyZ3NbKytpXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldLkNvbnRhaW5zKCItLXBvcnQ9IikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQgPSBpbnQuUGFyc2UoYXJnc1tpXS5TdWJzdHJpbmcoYXJnc1tpXS5JbmRleE9mKCI9IikgKyAxKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLWIiIHx8IGFyZ3NbaV0gPT0gIi0tYnVmZmVyZWQiIHx8IGFyZ3NbaV0gPT0gIi0tdHJhbnNwb3J0PWJ1ZmZlcmVkIikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdXNlQnVmZmVyZWRTb2NrZXRzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItZiIgfHwgYXJnc1tpXSA9PSAiLS1mcmFtZWQiIHx8IGFyZ3NbaV0gPT0gIi0tdHJhbnNwb3J0PWZyYW1lZCIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzZUZyYW1lZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLS1jb21wYWN0IiB8fCBhcmdzW2ldID09ICItLXByb3RvY29sPWNvbXBhY3QiKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb21wYWN0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItLWpzb24iIHx8IGFyZ3NbaV0gPT0gIi0tcHJvdG9jb2w9anNvbiIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGpzb24gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi0tdGhyZWFkZWQiIHx8IGFyZ3NbaV0gPT0gIi0tc2VydmVyLXR5cGU9dGhyZWFkZWQiKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJUeXBlID0gU2VydmVyVHlwZS5UVGhyZWFkZWRTZXJ2ZXI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLS10aHJlYWRwb29sIiB8fCBhcmdzW2ldID09ICItLXNlcnZlci10eXBlPXRocmVhZHBvb2wiKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJUeXBlID0gU2VydmVyVHlwZS5UVGhyZWFkUG9vbFNlcnZlcjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItLXByb3RvdHlwZSIgfHwgYXJnc1tpXSA9PSAiLS1wcm9jZXNzb3I9cHJvdG90eXBlIikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc29yRmFjdG9yeVR5cGUgPSBQcm9jZXNzb3JGYWN0b3J5VHlwZS5UUHJvdG90eXBlUHJvY2Vzc29yRmFjdG9yeTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItLXNzbCIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzZUVuY3J5cHRpb24gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gVHJhbnNwb3J0CisgICAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCB0cmFuczsKKyAgICAgICAgICAgICAgICBpZiAocGlwZSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSBuZXcgVE5hbWVkUGlwZVNlcnZlclRyYW5zcG9ydChwaXBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHVzZUVuY3J5cHRpb24pCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjZXJ0UGF0aCA9ICIuLi9rZXlzL3NlcnZlci5wMTIiOworICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSBuZXcgVFRMU1NlcnZlclNvY2tldChwb3J0LCAwLCB1c2VCdWZmZXJlZFNvY2tldHMsIG5ldyBYNTA5Q2VydGlmaWNhdGUyKGNlcnRQYXRoLCAidGhyaWZ0IiksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgU3NsUHJvdG9jb2xzLlRscyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cmFucyA9IG5ldyBUU2VydmVyU29ja2V0KHBvcnQsIDAsIHVzZUJ1ZmZlcmVkU29ja2V0cyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IHByb3RvOworICAgICAgICAgICAgICAgIGlmIChjb21wYWN0KQorICAgICAgICAgICAgICAgICAgICBwcm90byA9IG5ldyBUQ29tcGFjdFByb3RvY29sLkZhY3RvcnkoKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChqc29uKQorICAgICAgICAgICAgICAgICAgICBwcm90byA9IG5ldyBUSlNPTlByb3RvY29sLkZhY3RvcnkoKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHByb3RvID0gbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCk7CisKKyAgICAgICAgICAgICAgICBUUHJvY2Vzc29yRmFjdG9yeSBwcm9jZXNzb3JGYWN0b3J5OworICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzb3JGYWN0b3J5VHlwZSA9PSBQcm9jZXNzb3JGYWN0b3J5VHlwZS5UUHJvdG90eXBlUHJvY2Vzc29yRmFjdG9yeSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NvckZhY3RvcnkgPSBuZXcgVFByb3RvdHlwZVByb2Nlc3NvckZhY3Rvcnk8VGhyaWZ0VGVzdC5Qcm9jZXNzb3IsIFRlc3RIYW5kbGVyPigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBQcm9jZXNzb3IKKyAgICAgICAgICAgICAgICAgICAgVGVzdEhhbmRsZXIgdGVzdEhhbmRsZXIgPSBuZXcgVGVzdEhhbmRsZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VGVzdC5Qcm9jZXNzb3IgdGVzdFByb2Nlc3NvciA9IG5ldyBUaHJpZnRUZXN0LlByb2Nlc3Nvcih0ZXN0SGFuZGxlcik7CisgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NvckZhY3RvcnkgPSBuZXcgVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkodGVzdFByb2Nlc3Nvcik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgdHJhbnNGYWN0b3J5OworICAgICAgICAgICAgICAgIGlmICh1c2VGcmFtZWQpCisgICAgICAgICAgICAgICAgICAgIHRyYW5zRmFjdG9yeSA9IG5ldyBURnJhbWVkVHJhbnNwb3J0LkZhY3RvcnkoKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHRyYW5zRmFjdG9yeSA9IG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpOworCisgICAgICAgICAgICAgICAgVFNlcnZlciBzZXJ2ZXJFbmdpbmU7CisgICAgICAgICAgICAgICAgc3dpdGNoIChzZXJ2ZXJUeXBlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTZXJ2ZXJUeXBlLlRUaHJlYWRQb29sU2VydmVyOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyRW5naW5lID0gbmV3IFRUaHJlYWRQb29sU2VydmVyKHByb2Nlc3NvckZhY3RvcnksIHRyYW5zLCB0cmFuc0ZhY3RvcnksIHByb3RvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFNlcnZlclR5cGUuVFRocmVhZGVkU2VydmVyOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyRW5naW5lID0gbmV3IFRUaHJlYWRlZFNlcnZlcihwcm9jZXNzb3JGYWN0b3J5LCB0cmFucywgdHJhbnNGYWN0b3J5LCBwcm90byk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlckVuZ2luZSA9IG5ldyBUU2ltcGxlU2VydmVyKHByb2Nlc3NvckZhY3RvcnksIHRyYW5zLCB0cmFuc0ZhY3RvcnksIHByb3RvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vU2VydmVyIGV2ZW50IGhhbmRsZXIKKyAgICAgICAgICAgICAgICBUcmFkZVNlcnZlckV2ZW50SGFuZGxlciBzZXJ2ZXJFdmVudHMgPSBuZXcgVHJhZGVTZXJ2ZXJFdmVudEhhbmRsZXIoKTsKKyAgICAgICAgICAgICAgICBzZXJ2ZXJFbmdpbmUuc2V0RXZlbnRIYW5kbGVyKHNlcnZlckV2ZW50cyk7CisKKyAgICAgICAgICAgICAgICAvLyBSdW4gaXQKKyAgICAgICAgICAgICAgICBzdHJpbmcgd2hlcmUgPSAocGlwZSAhPSBudWxsID8gIm9uIHBpcGUgIiArIHBpcGUgOiAib24gcG9ydCAiICsgcG9ydCk7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlN0YXJ0aW5nIHRoZSAiICsgc2VydmVyVHlwZS5Ub1N0cmluZygpICsgIiAiICsgd2hlcmUgKworICAgICAgICAgICAgICAgICAgICAocHJvY2Vzc29yRmFjdG9yeVR5cGUgPT0gUHJvY2Vzc29yRmFjdG9yeVR5cGUuVFByb3RvdHlwZVByb2Nlc3NvckZhY3RvcnkgPyAiIHdpdGggcHJvY2Vzc29yIHByb3RvdHlwZSBmYWN0b3J5ICIgOiAiIikgKworICAgICAgICAgICAgICAgICAgICAodXNlQnVmZmVyZWRTb2NrZXRzID8gIiB3aXRoIGJ1ZmZlcmVkIHNvY2tldCIgOiAiIikgKworICAgICAgICAgICAgICAgICAgICAodXNlRnJhbWVkID8gIiB3aXRoIGZyYW1lZCB0cmFuc3BvcnQiIDogIiIpICsKKyAgICAgICAgICAgICAgICAgICAgKHVzZUVuY3J5cHRpb24gPyAiIHdpdGggZW5jcnlwdGlvbiIgOiAiIikgKworICAgICAgICAgICAgICAgICAgICAoY29tcGFjdCA/ICIgd2l0aCBjb21wYWN0IHByb3RvY29sIiA6ICIiKSArCisgICAgICAgICAgICAgICAgICAgIChqc29uID8gIiB3aXRoIGpzb24gcHJvdG9jb2wiIDogIiIpICsKKyAgICAgICAgICAgICAgICAgICAgIi4uLiIpOworICAgICAgICAgICAgICAgIHNlcnZlckVuZ2luZS5TZXJ2ZSgpOworCisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIHgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5FcnJvci5Xcml0ZSh4KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiZG9uZS4iKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9jc2hhcnAvVGhyaWZ0VGVzdC5jc3Byb2ogYi90ZXN0L2NzaGFycC9UaHJpZnRUZXN0LmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzYyOWViCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jc2hhcnAvVGhyaWZ0VGVzdC5jc3Byb2oKQEAgLTAsMCArMSwxNDEgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iNC4wIiBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgorICA8UHJvcGVydHlHcm91cD4KKyAgICA8Q29uZmlndXJhdGlvbiBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKScgPT0gJycgIj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4KKyAgICA8UGxhdGZvcm0gQ29uZGl0aW9uPSIgJyQoUGxhdGZvcm0pJyA9PSAnJyAiPkFueUNQVTwvUGxhdGZvcm0+CisgICAgPFByb2R1Y3RWZXJzaW9uPjkuMC4yMTAyMjwvUHJvZHVjdFZlcnNpb24+CisgICAgPFNjaGVtYVZlcnNpb24+Mi4wPC9TY2hlbWFWZXJzaW9uPgorICAgIDxQcm9qZWN0R3VpZD57NDhERDc1N0YtQ0E5NS00REQ3LUJEQTQtNThEQjZGMTA4QzJDfTwvUHJvamVjdEd1aWQ+CisgICAgPE91dHB1dFR5cGU+RXhlPC9PdXRwdXRUeXBlPgorICAgIDxBcHBEZXNpZ25lckZvbGRlcj5Qcm9wZXJ0aWVzPC9BcHBEZXNpZ25lckZvbGRlcj4KKyAgICA8Um9vdE5hbWVzcGFjZT5UaHJpZnRUZXN0PC9Sb290TmFtZXNwYWNlPgorICAgIDxBc3NlbWJseU5hbWU+VGhyaWZ0VGVzdDwvQXNzZW1ibHlOYW1lPgorICAgIDxUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPnYzLjU8L1RhcmdldEZyYW1ld29ya1ZlcnNpb24+CisgICAgPEZpbGVBbGlnbm1lbnQ+NTEyPC9GaWxlQWxpZ25tZW50PgorICAgIDxJc1dlYkJvb3RzdHJhcHBlcj5mYWxzZTwvSXNXZWJCb290c3RyYXBwZXI+CisgICAgPEZpbGVVcGdyYWRlRmxhZ3M+CisgICAgPC9GaWxlVXBncmFkZUZsYWdzPgorICAgIDxPbGRUb29sc1ZlcnNpb24+My41PC9PbGRUb29sc1ZlcnNpb24+CisgICAgPFVwZ3JhZGVCYWNrdXBMb2NhdGlvbiAvPgorICAgIDxQdWJsaXNoVXJsPnB1Ymxpc2hcPC9QdWJsaXNoVXJsPgorICAgIDxJbnN0YWxsPnRydWU8L0luc3RhbGw+CisgICAgPEluc3RhbGxGcm9tPkRpc2s8L0luc3RhbGxGcm9tPgorICAgIDxVcGRhdGVFbmFibGVkPmZhbHNlPC9VcGRhdGVFbmFibGVkPgorICAgIDxVcGRhdGVNb2RlPkZvcmVncm91bmQ8L1VwZGF0ZU1vZGU+CisgICAgPFVwZGF0ZUludGVydmFsPjc8L1VwZGF0ZUludGVydmFsPgorICAgIDxVcGRhdGVJbnRlcnZhbFVuaXRzPkRheXM8L1VwZGF0ZUludGVydmFsVW5pdHM+CisgICAgPFVwZGF0ZVBlcmlvZGljYWxseT5mYWxzZTwvVXBkYXRlUGVyaW9kaWNhbGx5PgorICAgIDxVcGRhdGVSZXF1aXJlZD5mYWxzZTwvVXBkYXRlUmVxdWlyZWQ+CisgICAgPE1hcEZpbGVFeHRlbnNpb25zPnRydWU8L01hcEZpbGVFeHRlbnNpb25zPgorICAgIDxBcHBsaWNhdGlvblJldmlzaW9uPjA8L0FwcGxpY2F0aW9uUmV2aXNpb24+CisgICAgPEFwcGxpY2F0aW9uVmVyc2lvbj4xLjAuMC4wPC9BcHBsaWNhdGlvblZlcnNpb24+CisgICAgPFVzZUFwcGxpY2F0aW9uVHJ1c3Q+ZmFsc2U8L1VzZUFwcGxpY2F0aW9uVHJ1c3Q+CisgICAgPEJvb3RzdHJhcHBlckVuYWJsZWQ+dHJ1ZTwvQm9vdHN0cmFwcGVyRW5hYmxlZD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfEFueUNQVScgIj4KKyAgICA8RGVidWdTeW1ib2xzPnRydWU8L0RlYnVnU3ltYm9scz4KKyAgICA8RGVidWdUeXBlPmZ1bGw8L0RlYnVnVHlwZT4KKyAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPgorICAgIDxPdXRwdXRQYXRoPmJpblxEZWJ1Z1w8L091dHB1dFBhdGg+CisgICAgPERlZmluZUNvbnN0YW50cz5ERUJVRztUUkFDRTwvRGVmaW5lQ29uc3RhbnRzPgorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgorICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0PkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdSZWxlYXNlfEFueUNQVScgIj4KKyAgICA8RGVidWdUeXBlPnBkYm9ubHk8L0RlYnVnVHlwZT4KKyAgICA8T3B0aW1pemU+dHJ1ZTwvT3B0aW1pemU+CisgICAgPE91dHB1dFBhdGg+YmluXFJlbGVhc2VcPC9PdXRwdXRQYXRoPgorICAgIDxEZWZpbmVDb25zdGFudHM+VFJBQ0U8L0RlZmluZUNvbnN0YW50cz4KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4KKyAgICA8Q29kZUFuYWx5c2lzUnVsZVNldD5BbGxSdWxlcy5ydWxlc2V0PC9Db2RlQW5hbHlzaXNSdWxlU2V0PgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0iIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJUaHJpZnRJbXBsLCBWZXJzaW9uPTAuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgcHJvY2Vzc29yQXJjaGl0ZWN0dXJlPU1TSUwiPgorICAgICAgPFNwZWNpZmljVmVyc2lvbj5GYWxzZTwvU3BlY2lmaWNWZXJzaW9uPgorICAgICAgPEhpbnRQYXRoPi5cVGhyaWZ0SW1wbC5kbGw8L0hpbnRQYXRoPgorICAgIDwvUmVmZXJlbmNlPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm9ncmFtLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3BlcnRpZXNcQXNzZW1ibHlJbmZvLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RDbGllbnQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFNlcnZlci5jcyIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0Lk5ldC5DbGllbnQuMy41Ij4KKyAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPgorICAgICAgPFByb2R1Y3ROYW1lPi5ORVQgRnJhbWV3b3JrIDMuNSBTUDEgQ2xpZW50IFByb2ZpbGU8L1Byb2R1Y3ROYW1lPgorICAgICAgPEluc3RhbGw+ZmFsc2U8L0luc3RhbGw+CisgICAgPC9Cb290c3RyYXBwZXJQYWNrYWdlPgorICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5OZXQuRnJhbWV3b3JrLjIuMCI+CisgICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4KKyAgICAgIDxQcm9kdWN0TmFtZT4uTkVUIEZyYW1ld29yayAyLjAgJTI4eDg2JTI5PC9Qcm9kdWN0TmFtZT4KKyAgICAgIDxJbnN0YWxsPmZhbHNlPC9JbnN0YWxsPgorICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4KKyAgICA8Qm9vdHN0cmFwcGVyUGFja2FnZSBJbmNsdWRlPSJNaWNyb3NvZnQuTmV0LkZyYW1ld29yay4zLjAiPgorICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+CisgICAgICA8UHJvZHVjdE5hbWU+Lk5FVCBGcmFtZXdvcmsgMy4wICUyOHg4NiUyOTwvUHJvZHVjdE5hbWU+CisgICAgICA8SW5zdGFsbD5mYWxzZTwvSW5zdGFsbD4KKyAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+CisgICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0Lk5ldC5GcmFtZXdvcmsuMy41Ij4KKyAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPgorICAgICAgPFByb2R1Y3ROYW1lPi5ORVQgRnJhbWV3b3JrIDMuNTwvUHJvZHVjdE5hbWU+CisgICAgICA8SW5zdGFsbD50cnVlPC9JbnN0YWxsPgorICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4KKyAgICA8Qm9vdHN0cmFwcGVyUGFja2FnZSBJbmNsdWRlPSJNaWNyb3NvZnQuTmV0LkZyYW1ld29yay4zLjUuU1AxIj4KKyAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPgorICAgICAgPFByb2R1Y3ROYW1lPi5ORVQgRnJhbWV3b3JrIDMuNSBTUDE8L1Byb2R1Y3ROYW1lPgorICAgICAgPEluc3RhbGw+ZmFsc2U8L0luc3RhbGw+CisgICAgPC9Cb290c3RyYXBwZXJQYWNrYWdlPgorICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5XaW5kb3dzLkluc3RhbGxlci4zLjEiPgorICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+CisgICAgICA8UHJvZHVjdE5hbWU+V2luZG93cyBJbnN0YWxsZXIgMy4xPC9Qcm9kdWN0TmFtZT4KKyAgICAgIDxJbnN0YWxsPnRydWU8L0luc3RhbGw+CisgICAgPC9Cb290c3RyYXBwZXJQYWNrYWdlPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlxsaWJcY3NoYXJwXFRocmlmdC5jc3Byb2oiPgorICAgICAgPFByb2plY3Q+ezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH08L1Byb2plY3Q+CisgICAgICA8TmFtZT5UaHJpZnQ8L05hbWU+CisgICAgPC9Qcm9qZWN0UmVmZXJlbmNlPgorICA8L0l0ZW1Hcm91cD4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRUb29sc1BhdGgpXE1pY3Jvc29mdC5DU2hhcnAudGFyZ2V0cyIgLz4KKyAgPCEtLSBUbyBtb2RpZnkgeW91ciBidWlsZCBwcm9jZXNzLCBhZGQgeW91ciB0YXNrIGluc2lkZSBvbmUgb2YgdGhlIHRhcmdldHMgYmVsb3cgYW5kIHVuY29tbWVudCBpdC4KKyAgICAgICBPdGhlciBzaW1pbGFyIGV4dGVuc2lvbiBwb2ludHMgZXhpc3QsIHNlZSBNaWNyb3NvZnQuQ29tbW9uLnRhcmdldHMuCisgIDxUYXJnZXQgTmFtZT0iQmVmb3JlQnVpbGQiPgorICA8L1RhcmdldD4KKyAgPFRhcmdldCBOYW1lPSJBZnRlckJ1aWxkIj4KKyAgPC9UYXJnZXQ+CisgIC0tPgorICA8UHJvcGVydHlHcm91cD4KKyAgICA8UHJlQnVpbGRFdmVudD5ybWRpciAvcyAvcSAiJChQcm9qZWN0RGlyKWdlbi1jc2hhcnAiCitkZWwgL2YgL3EgIiQoUHJvamVjdERpcilUaHJpZnRJbXBsLmRsbCIKK1NFVCBPVVRQVVRfRElSPSQoUHJvamVjdERpcikKK1NFVCBUSFJJRlRfRklMRT0kKFByb2plY3REaXIpXC4uXFRocmlmdFRlc3QudGhyaWZ0Citmb3IgJTI1JTI1SSBpbiAoIiUyNU9VVFBVVF9ESVIlMjUiKSBkbyBzZXQgU0hPUlRfRElSPSUyNSUyNX5mc0kKK2ZvciAlMjUlMjVJIGluICgiJTI1VEhSSUZUX0ZJTEUlMjUiKSBkbyBzZXQgVEhSSUZUX1NIT1JUPSUyNSUyNX5mc0kKKyIkKFByb2plY3REaXIpXC4uXC4uXGNvbXBpbGVyXGNwcFx0aHJpZnQuZXhlIiAtLWdlbiBjc2hhcnAgLW8gJTI1U0hPUlRfRElSJTI1ICUyNVRIUklGVF9TSE9SVCUyNQorJChNU0J1aWxkVG9vbHNQYXRoKVxDc2MuZXhlIC90OmxpYnJhcnkgL291dDoiJChQcm9qZWN0RGlyKVRocmlmdEltcGwuZGxsIiAvcmVjdXJzZToiJChQcm9qZWN0RGlyKWdlbi1jc2hhcnAiXCogL3JlZmVyZW5jZToiJChQcm9qZWN0RGlyKS4uXC4uXGxpYlxjc2hhcnBcYmluXERlYnVnXFRocmlmdC5kbGwiPC9QcmVCdWlsZEV2ZW50PgorICA8L1Byb3BlcnR5R3JvdXA+Cis8L1Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0L2NzaGFycC9UaHJpZnRUZXN0LnNsbiBiL3Rlc3QvY3NoYXJwL1RocmlmdFRlc3Quc2xuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3NjVhMDMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NzaGFycC9UaHJpZnRUZXN0LnNsbgpAQCAtMCwwICsxLDE3IEBACivvu78KK01pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIFNvbHV0aW9uIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDExLjAwCisjIFZpc3VhbCBTdHVkaW8gMjAxMAorUHJvamVjdCgie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iKSA9ICJUaHJpZnRUZXN0IiwgIlRocmlmdFRlc3QuY3Nwcm9qIiwgIns0OERENzU3Ri1DQTk1LTRERDctQkRBNC01OERCNkYxMDhDMkN9IgorRW5kUHJvamVjdAorR2xvYmFsCisJR2xvYmFsU2VjdGlvbihTb2x1dGlvbkNvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcHJlU29sdXRpb24KKwkJRGVidWd8QW55IENQVSA9IERlYnVnfEFueSBDUFUKKwkJUmVsZWFzZXxBbnkgQ1BVID0gUmVsZWFzZXxBbnkgQ1BVCisJRW5kR2xvYmFsU2VjdGlvbgorCUdsb2JhbFNlY3Rpb24oUHJvamVjdENvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcG9zdFNvbHV0aW9uCisJCXs0OERENzU3Ri1DQTk1LTRERDctQkRBNC01OERCNkYxMDhDMkN9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7NDhERDc1N0YtQ0E5NS00REQ3LUJEQTQtNThEQjZGMTA4QzJDfS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXs0OERENzU3Ri1DQTk1LTRERDctQkRBNC01OERCNkYxMDhDMkN9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJezQ4REQ3NTdGLUNBOTUtNERENy1CREE0LTU4REI2RjEwOEMyQ30uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwlFbmRHbG9iYWxTZWN0aW9uCitFbmRHbG9iYWwKZGlmZiAtLWdpdCBhL3Rlc3QvZGFydC9NYWtlZmlsZS5hbSBiL3Rlc3QvZGFydC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzUwZWMyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXJ0L01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNDIgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitnZW4tZGFydC90aHJpZnRfdGVzdC9saWIvdGhyaWZ0X3Rlc3QuZGFydDogLi4vVGhyaWZ0VGVzdC50aHJpZnQKKwkkKFRIUklGVCkgLS1nZW4gZGFydCAuLi9UaHJpZnRUZXN0LnRocmlmdAorCitwdWItZ2V0LWdlbjogZ2VuLWRhcnQvdGhyaWZ0X3Rlc3QvbGliL3RocmlmdF90ZXN0LmRhcnQKKwljZCBnZW4tZGFydC90aHJpZnRfdGVzdDsgJHtEQVJUUFVCfSBnZXQKKworcHViLWdldDogcHViLWdldC1nZW4KKwljZCB0ZXN0X2NsaWVudDsgJHtEQVJUUFVCfSBnZXQKKworc3R1YnM6IGdlbi1kYXJ0L3RocmlmdF90ZXN0L2xpYi90aHJpZnRfdGVzdC5kYXJ0IHB1Yi1nZXQKKworcHJlY3Jvc3M6IHN0dWJzCisKK2NoZWNrOiBzdHVicworCitjbGVhbi1sb2NhbDoKKwkkKFJNKSAtciBnZW4tZGFydCB0ZXN0X2NsaWVudC8ucHViCisJZmluZCAuIC10eXBlIGQgLW5hbWUgInBhY2thZ2VzIiB8IHhhcmdzICQoUk0pIC1yCisJZmluZCAuIC10eXBlIGYgLW5hbWUgIi5wYWNrYWdlcyIgfCB4YXJncyAkKFJNKQorCWZpbmQgLiAtdHlwZSBmIC1uYW1lICJwdWJzcGVjLmxvY2siIHwgeGFyZ3MgJChSTSkKKworY2xpZW50OiBzdHVicworCSR7REFSVH0gdGVzdF9jbGllbnQvYmluL21haW4uZGFydApkaWZmIC0tZ2l0IGEvdGVzdC9kYXJ0L3Rlc3RfY2xpZW50Ly5hbmFseXNpc19vcHRpb25zIGIvdGVzdC9kYXJ0L3Rlc3RfY2xpZW50Ly5hbmFseXNpc19vcHRpb25zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExMGQ0YzUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhcnQvdGVzdF9jbGllbnQvLmFuYWx5c2lzX29wdGlvbnMKQEAgLTAsMCArMSwyIEBACithbmFseXplcjoKKyAgc3Ryb25nLW1vZGU6IHRydWUKZGlmZiAtLWdpdCBhL3Rlc3QvZGFydC90ZXN0X2NsaWVudC9iaW4vbWFpbi5kYXJ0IGIvdGVzdC9kYXJ0L3Rlc3RfY2xpZW50L2Jpbi9tYWluLmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk2ODQ0YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGFydC90ZXN0X2NsaWVudC9iaW4vbWFpbi5kYXJ0CkBAIC0wLDAgKzEsMzM3IEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gJ0xpY2Vuc2UnKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAnQVMgSVMnIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworaW1wb3J0ICdkYXJ0OmFzeW5jJzsKK2ltcG9ydCAnZGFydDpjb252ZXJ0JzsKK2ltcG9ydCAnZGFydDppbyc7CisKK2ltcG9ydCAncGFja2FnZTphcmdzL2FyZ3MuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6Y29sbGVjdGlvbi9jb2xsZWN0aW9uLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmh0dHAvaHR0cC5kYXJ0JyBhcyBodHRwOworaW1wb3J0ICdwYWNrYWdlOnRocmlmdC90aHJpZnQuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6dGhyaWZ0L3RocmlmdF9jb25zb2xlLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOnRocmlmdF90ZXN0L3RocmlmdF90ZXN0LmRhcnQnOworCitjb25zdCBURVNUX0JBU0VUWVBFUyA9IDE7IC8vIDAwMDAgMDAwMQorY29uc3QgVEVTVF9TVFJVQ1RTID0gMjsgLy8gMDAwMCAwMDEwCitjb25zdCBURVNUX0NPTlRBSU5FUlMgPSA0OyAvLyAwMDAwIDAxMDAKK2NvbnN0IFRFU1RfRVhDRVBUSU9OUyA9IDg7IC8vIDAwMDAgMTAwMAorY29uc3QgVEVTVF9VTktOT1dOID0gNjQ7IC8vIDAxMDAgMDAwMCAoRmFpbGVkIHRvIHByZXBhcmUgZW52aXJvbmVtdCBldGMuKQorY29uc3QgVEVTVF9USU1FT1VUID0gMTI4OyAvLyAxMDAwIDAwMDAKK2NvbnN0IFRFU1RfTk9UVVNFRCA9IDQ4OyAvLyAwMDExIDAwMDAgKHJlc2VydmVkIGJpdHMpCisKK3R5cGVkZWYgRnV0dXJlIEZ1dHVyZUZ1bmN0aW9uKCk7CisKK2NsYXNzIFRUZXN0IHsKKyAgZmluYWwgaW50IGVycm9yQ29kZTsKKyAgZmluYWwgU3RyaW5nIG5hbWU7CisgIGZpbmFsIEZ1dHVyZUZ1bmN0aW9uIGZ1bmM7CisKKyAgVFRlc3QodGhpcy5lcnJvckNvZGUsIHRoaXMubmFtZSwgdGhpcy5mdW5jKTsKK30KKworY2xhc3MgVFRlc3RFcnJvciBleHRlbmRzIEVycm9yIHsKKyAgZmluYWwgYWN0dWFsOworICBmaW5hbCBleHBlY3RlZDsKKworICBUVGVzdEVycm9yKHRoaXMuYWN0dWFsLCB0aGlzLmV4cGVjdGVkKTsKKworICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnJGFjdHVhbCAhPSAkZXhwZWN0ZWQnOworfQorCitMaXN0PFRUZXN0PiBfdGVzdHM7CitUaHJpZnRUZXN0Q2xpZW50IGNsaWVudDsKK2Jvb2wgdmVyYm9zZTsKKworLy8vIEFkYXB0ZWQgZnJvbSBUZXN0Q2xpZW50LnBocAorbWFpbihMaXN0PFN0cmluZz4gYXJncykgYXN5bmMgeworICBBcmdSZXN1bHRzIHJlc3VsdHMgPSBfcGFyc2VBcmdzKGFyZ3MpOworCisgIGlmIChyZXN1bHRzID09IG51bGwpIHsKKyAgICBleGl0KFRFU1RfVU5LTk9XTik7CisgIH0KKworICB2ZXJib3NlID0gcmVzdWx0c1sndmVyYm9zZSddID09IHRydWU7CisKKyAgYXdhaXQgX2luaXRUZXN0Q2xpZW50KAorICAgICAgaG9zdDogcmVzdWx0c1snaG9zdCddLAorICAgICAgcG9ydDogaW50LnBhcnNlKHJlc3VsdHNbJ3BvcnQnXSksCisgICAgICB0cmFuc3BvcnRUeXBlOiByZXN1bHRzWyd0cmFuc3BvcnQnXSwKKyAgICAgIHByb3RvY29sVHlwZTogcmVzdWx0c1sncHJvdG9jb2wnXSkuY2F0Y2hFcnJvcigoZSkgeworICAgIHN0ZG91dC53cml0ZWxuKCdFcnJvcjonKTsKKyAgICBzdGRvdXQud3JpdGVsbignJGUnKTsKKyAgICBpZiAoZSBpcyBFcnJvcikgeworICAgICAgc3Rkb3V0LndyaXRlbG4oJyR7ZS5zdGFja1RyYWNlfScpOworICAgIH0KKyAgICBleGl0KFRFU1RfVU5LTk9XTik7CisgIH0pOworCisgIC8vIHJ1biB0ZXN0cworICBfdGVzdHMgPSBfY3JlYXRlVGVzdHMoKTsKKworICBpbnQgcmVzdWx0ID0gMDsKKworICBmb3IgKFRUZXN0IHRlc3QgaW4gX3Rlc3RzKSB7CisgICAgaWYgKHZlcmJvc2UpIHN0ZG91dC53cml0ZSgnJHt0ZXN0Lm5hbWV9Li4uICcpOworICAgIHRyeSB7CisgICAgICBhd2FpdCB0ZXN0LmZ1bmMoKTsKKyAgICAgIGlmICh2ZXJib3NlKSBzdGRvdXQud3JpdGVsbignc3VjY2VzcyEnKTsKKyAgICB9IGNhdGNoIChlKSB7CisgICAgICBpZiAodmVyYm9zZSkgc3Rkb3V0LndyaXRlbG4oJyRlJyk7CisgICAgICByZXN1bHQgPSByZXN1bHQgfCB0ZXN0LmVycm9yQ29kZTsKKyAgICB9CisgIH0KKworICBleGl0KHJlc3VsdCk7Cit9CisKK0FyZ1Jlc3VsdHMgX3BhcnNlQXJncyhMaXN0PFN0cmluZz4gYXJncykgeworICB2YXIgcGFyc2VyID0gbmV3IEFyZ1BhcnNlcigpOworICBwYXJzZXIuYWRkT3B0aW9uKCdob3N0JywgZGVmYXVsdHNUbzogJ2xvY2FsaG9zdCcsIGhlbHA6ICdUaGUgc2VydmVyIGhvc3QnKTsKKyAgcGFyc2VyLmFkZE9wdGlvbigncG9ydCcsIGRlZmF1bHRzVG86ICc5MDkwJywgaGVscDogJ1RoZSBwb3J0IHRvIGNvbm5lY3QgdG8nKTsKKyAgcGFyc2VyLmFkZE9wdGlvbigndHJhbnNwb3J0JywKKyAgICAgIGRlZmF1bHRzVG86ICdidWZmZXJlZCcsCisgICAgICBhbGxvd2VkOiBbJ2J1ZmZlcmVkJywgJ2ZyYW1lZCcsICdodHRwJ10sCisgICAgICBoZWxwOiAnVGhlIHRyYW5zcG9ydCBuYW1lJywKKyAgICAgIGFsbG93ZWRIZWxwOiB7CisgICAgICAgICdidWZmZXJlZCc6ICdUQnVmZmVyZWRUcmFuc3BvcnQnLAorICAgICAgICAnZnJhbWVkJzogJ1RGcmFtZWRUcmFuc3BvcnQnCisgICAgICB9KTsKKyAgcGFyc2VyLmFkZE9wdGlvbigncHJvdG9jb2wnLAorICAgICAgZGVmYXVsdHNUbzogJ2JpbmFyeScsCisgICAgICBhbGxvd2VkOiBbJ2JpbmFyeScsICdjb21wYWN0JywgJ2pzb24nXSwKKyAgICAgIGhlbHA6ICdUaGUgcHJvdG9jb2wgbmFtZScsCisgICAgICBhbGxvd2VkSGVscDogeworICAgICAgICAnYmluYXJ5JzogJ1RCaW5hcnlQcm90b2NvbCcsCisgICAgICAgICdjb21wYWN0JzogJ1RDb21wYWN0UHJvdG9jb2wnLAorICAgICAgICAnanNvbic6ICdUSnNvblByb3RvY29sJworICAgICAgfSk7CisgIHBhcnNlci5hZGRGbGFnKCd2ZXJib3NlJywgZGVmYXVsdHNUbzogZmFsc2UpOworCisgIEFyZ1Jlc3VsdHMgcmVzdWx0czsKKyAgdHJ5IHsKKyAgICByZXN1bHRzID0gcGFyc2VyLnBhcnNlKGFyZ3MpOworICB9IGNhdGNoIChlKSB7CisgICAgc3Rkb3V0LndyaXRlbG4oJyRlXG4nKTsKKyAgfQorCisgIGlmIChyZXN1bHRzID09IG51bGwpIHN0ZG91dC53cml0ZShwYXJzZXIudXNhZ2UpOworCisgIHJldHVybiByZXN1bHRzOworfQorCitUUHJvdG9jb2xGYWN0b3J5IGdldFByb3RvY29sRmFjdG9yeShTdHJpbmcgcHJvdG9jb2xUeXBlKSB7CisgIGlmIChwcm90b2NvbFR5cGUgPT0gJ2JpbmFyeScpIHsKKyAgICByZXR1cm4gbmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKTsKKyAgfSBlbHNlIGlmIChwcm90b2NvbFR5cGUgPT0gJ2NvbXBhY3QnKSB7CisgICAgcmV0dXJuIG5ldyBUQ29tcGFjdFByb3RvY29sRmFjdG9yeSgpOworICB9IGVsc2UgaWYgKHByb3RvY29sVHlwZSA9PSAnanNvbicpIHsKKyAgICByZXR1cm4gbmV3IFRKc29uUHJvdG9jb2xGYWN0b3J5KCk7CisgIH0KKworICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvci52YWx1ZShwcm90b2NvbFR5cGUpOworfQorCitGdXR1cmUgX2luaXRUZXN0Q2xpZW50KAorICAgIHtTdHJpbmcgaG9zdCwgaW50IHBvcnQsIFN0cmluZyB0cmFuc3BvcnRUeXBlLCBTdHJpbmcgcHJvdG9jb2xUeXBlfSkgYXN5bmMgeworICBUVHJhbnNwb3J0IHRyYW5zcG9ydDsKKyAgdmFyIHByb3RvY29sRmFjdG9yeSA9IGdldFByb3RvY29sRmFjdG9yeShwcm90b2NvbFR5cGUpOworCisgIGlmICh0cmFuc3BvcnRUeXBlID09ICdodHRwJykgeworICAgIHZhciBodHRwQ2xpZW50ID0gbmV3IGh0dHAuSU9DbGllbnQoKTsKKyAgICB2YXIgdXJpID0gVXJpLnBhcnNlKCdodHRwOi8vJGhvc3Q6JHBvcnQnKTsKKyAgICB2YXIgY29uZmlnID0gbmV3IFRIdHRwQ29uZmlnKHVyaSwge30pOworICAgIHRyYW5zcG9ydCA9IG5ldyBUSHR0cENsaWVudFRyYW5zcG9ydChodHRwQ2xpZW50LCBjb25maWcpOworICB9IGVsc2UgeworICAgIHZhciBzb2NrZXQgPSBhd2FpdCBTb2NrZXQuY29ubmVjdChob3N0LCBwb3J0KTsKKyAgICB0cmFuc3BvcnQgPSBuZXcgVENsaWVudFNvY2tldFRyYW5zcG9ydChuZXcgVFRjcFNvY2tldChzb2NrZXQpKTsKKyAgICBpZiAodHJhbnNwb3J0VHlwZSA9PSAnZnJhbWVkJykgeworICAgICAgdHJhbnNwb3J0ID0gbmV3IFRGcmFtZWRUcmFuc3BvcnQodHJhbnNwb3J0KTsKKyAgICB9CisgIH0KKworICB2YXIgcHJvdG9jb2wgPSBwcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgY2xpZW50ID0gbmV3IFRocmlmdFRlc3RDbGllbnQocHJvdG9jb2wpOworCisgIGF3YWl0IHRyYW5zcG9ydC5vcGVuKCk7Cit9CisKK0xpc3Q8VFRlc3Q+IF9jcmVhdGVUZXN0cygpIHsKKyAgTGlzdDxUVGVzdD4gdGVzdHMgPSBbXTsKKworICB2YXIgeHRydWN0ID0gbmV3IFh0cnVjdCgpCisgICAgLi5zdHJpbmdfdGhpbmcgPSAnWmVybycKKyAgICAuLmJ5dGVfdGhpbmcgPSAxCisgICAgLi5pMzJfdGhpbmcgPSAtMworICAgIC4uaTY0X3RoaW5nID0gLTU7CisKKyAgdGVzdHMuYWRkKG5ldyBUVGVzdChURVNUX0JBU0VUWVBFUywgJ3Rlc3RWb2lkJywgKCkgYXN5bmMgeworICAgIGF3YWl0IGNsaWVudC50ZXN0Vm9pZCgpOworICB9KSk7CisKKyAgdGVzdHMuYWRkKG5ldyBUVGVzdChURVNUX0JBU0VUWVBFUywgJ3Rlc3RTdHJpbmcnLCAoKSBhc3luYyB7CisgICAgdmFyIGlucHV0ID0gJ1Rlc3QnOworICAgIHZhciByZXN1bHQgPSBhd2FpdCBjbGllbnQudGVzdFN0cmluZyhpbnB1dCk7CisgICAgaWYgKHJlc3VsdCAhPSBpbnB1dCkgdGhyb3cgbmV3IFRUZXN0RXJyb3IocmVzdWx0LCBpbnB1dCk7CisgIH0pKTsKKworICB0ZXN0cy5hZGQobmV3IFRUZXN0KFRFU1RfQkFTRVRZUEVTLCAndGVzdEJvb2wnLCAoKSBhc3luYyB7CisgICAgdmFyIGlucHV0ID0gdHJ1ZTsKKyAgICB2YXIgcmVzdWx0ID0gYXdhaXQgY2xpZW50LnRlc3RCb29sKGlucHV0KTsKKyAgICBpZiAocmVzdWx0ICE9IGlucHV0KSB0aHJvdyBuZXcgVFRlc3RFcnJvcihyZXN1bHQsIGlucHV0KTsKKyAgfSkpOworCisgIHRlc3RzLmFkZChuZXcgVFRlc3QoVEVTVF9CQVNFVFlQRVMsICd0ZXN0Qnl0ZScsICgpIGFzeW5jIHsKKyAgICB2YXIgaW5wdXQgPSA2NDsKKyAgICB2YXIgcmVzdWx0ID0gYXdhaXQgY2xpZW50LnRlc3RCeXRlKGlucHV0KTsKKyAgICBpZiAocmVzdWx0ICE9IGlucHV0KSB0aHJvdyBuZXcgVFRlc3RFcnJvcihyZXN1bHQsIGlucHV0KTsKKyAgfSkpOworCisgIHRlc3RzLmFkZChuZXcgVFRlc3QoVEVTVF9CQVNFVFlQRVMsICd0ZXN0STMyJywgKCkgYXN5bmMgeworICAgIHZhciBpbnB1dCA9IDIxNDc0ODM2NDc7CisgICAgdmFyIHJlc3VsdCA9IGF3YWl0IGNsaWVudC50ZXN0STMyKGlucHV0KTsKKyAgICBpZiAocmVzdWx0ICE9IGlucHV0KSB0aHJvdyBuZXcgVFRlc3RFcnJvcihyZXN1bHQsIGlucHV0KTsKKyAgfSkpOworCisgIHRlc3RzLmFkZChuZXcgVFRlc3QoVEVTVF9CQVNFVFlQRVMsICd0ZXN0STY0JywgKCkgYXN5bmMgeworICAgIHZhciBpbnB1dCA9IDkyMjMzNzIwMzY4NTQ3NzU4MDc7CisgICAgdmFyIHJlc3VsdCA9IGF3YWl0IGNsaWVudC50ZXN0STY0KGlucHV0KTsKKyAgICBpZiAocmVzdWx0ICE9IGlucHV0KSB0aHJvdyBuZXcgVFRlc3RFcnJvcihyZXN1bHQsIGlucHV0KTsKKyAgfSkpOworCisgIHRlc3RzLmFkZChuZXcgVFRlc3QoVEVTVF9CQVNFVFlQRVMsICd0ZXN0RG91YmxlJywgKCkgYXN5bmMgeworICAgIHZhciBpbnB1dCA9IDMuMTQxNTkyNjsKKyAgICB2YXIgcmVzdWx0ID0gYXdhaXQgY2xpZW50LnRlc3REb3VibGUoaW5wdXQpOworICAgIGlmIChyZXN1bHQgIT0gaW5wdXQpIHRocm93IG5ldyBUVGVzdEVycm9yKHJlc3VsdCwgaW5wdXQpOworICB9KSk7CisKKyAgdGVzdHMuYWRkKG5ldyBUVGVzdChURVNUX0JBU0VUWVBFUywgJ3Rlc3RCaW5hcnknLCAoKSBhc3luYyB7CisgICAgdmFyIHV0ZjhDb2RlYyA9IGNvbnN0IFV0ZjhDb2RlYygpOworICAgIHZhciBpbnB1dCA9IHV0ZjhDb2RlYy5lbmNvZGUoJ2ZvbycpOworICAgIHZhciByZXN1bHQgPSBhd2FpdCBjbGllbnQudGVzdEJpbmFyeShpbnB1dCk7CisgICAgdmFyIGVxdWFsaXR5ID0gY29uc3QgTGlzdEVxdWFsaXR5KCk7CisgICAgaWYgKCFlcXVhbGl0eS5lcXVhbHMocmVzdWx0LCBpbnB1dCkpIHRocm93IG5ldyBUVGVzdEVycm9yKHJlc3VsdCwgaW5wdXQpOworICB9KSk7CisKKyAgdGVzdHMuYWRkKG5ldyBUVGVzdChURVNUX0NPTlRBSU5FUlMsICd0ZXN0U3RydWN0JywgKCkgYXN5bmMgeworICAgIHZhciByZXN1bHQgPSBhd2FpdCBjbGllbnQudGVzdFN0cnVjdCh4dHJ1Y3QpOworICAgIGlmICgnJHJlc3VsdCcgIT0gJyR4dHJ1Y3QnKSB0aHJvdyBuZXcgVFRlc3RFcnJvcihyZXN1bHQsIHh0cnVjdCk7CisgIH0pKTsKKworICB0ZXN0cy5hZGQobmV3IFRUZXN0KFRFU1RfQ09OVEFJTkVSUywgJ3Rlc3ROZXN0JywgKCkgYXN5bmMgeworICAgIHZhciBpbnB1dCA9IG5ldyBYdHJ1Y3QyKCkKKyAgICAgIC4uYnl0ZV90aGluZyA9IDEKKyAgICAgIC4uc3RydWN0X3RoaW5nID0geHRydWN0CisgICAgICAuLmkzMl90aGluZyA9IC0zOworCisgICAgdmFyIHJlc3VsdCA9IGF3YWl0IGNsaWVudC50ZXN0TmVzdChpbnB1dCk7CisgICAgaWYgKCckcmVzdWx0JyAhPSAnJGlucHV0JykgdGhyb3cgbmV3IFRUZXN0RXJyb3IocmVzdWx0LCBpbnB1dCk7CisgIH0pKTsKKworICB0ZXN0cy5hZGQobmV3IFRUZXN0KFRFU1RfQ09OVEFJTkVSUywgJ3Rlc3RNYXAnLCAoKSBhc3luYyB7CisgICAgTWFwPGludCwgaW50PiBpbnB1dCA9IHsxOiAtMTAsIDI6IC05LCAzOiAtOCwgNDogLTcsIDU6IC02fTsKKworICAgIHZhciByZXN1bHQgPSBhd2FpdCBjbGllbnQudGVzdE1hcChpbnB1dCk7CisgICAgdmFyIGVxdWFsaXR5ID0gY29uc3QgTWFwRXF1YWxpdHkoKTsKKyAgICBpZiAoIWVxdWFsaXR5LmVxdWFscyhyZXN1bHQsIGlucHV0KSkgdGhyb3cgbmV3IFRUZXN0RXJyb3IocmVzdWx0LCBpbnB1dCk7CisgIH0pKTsKKworICB0ZXN0cy5hZGQobmV3IFRUZXN0KFRFU1RfQ09OVEFJTkVSUywgJ3Rlc3RTZXQnLCAoKSBhc3luYyB7CisgICAgdmFyIGlucHV0ID0gbmV3IFNldDxpbnQ+LmZyb20oWy0yLCAtMSwgMCwgMSwgMl0pOworICAgIHZhciByZXN1bHQgPSBhd2FpdCBjbGllbnQudGVzdFNldChpbnB1dCk7CisgICAgdmFyIGVxdWFsaXR5ID0gY29uc3QgU2V0RXF1YWxpdHkoKTsKKyAgICBpZiAoIWVxdWFsaXR5LmVxdWFscyhyZXN1bHQsIGlucHV0KSkgdGhyb3cgbmV3IFRUZXN0RXJyb3IocmVzdWx0LCBpbnB1dCk7CisgIH0pKTsKKworICB0ZXN0cy5hZGQobmV3IFRUZXN0KFRFU1RfQ09OVEFJTkVSUywgJ3Rlc3RMaXN0JywgKCkgYXN5bmMgeworICAgIHZhciBpbnB1dCA9IFstMiwgLTEsIDAsIDEsIDJdOworICAgIHZhciByZXN1bHQgPSBhd2FpdCBjbGllbnQudGVzdExpc3QoaW5wdXQpOworICAgIHZhciBlcXVhbGl0eSA9IGNvbnN0IExpc3RFcXVhbGl0eSgpOworICAgIGlmICghZXF1YWxpdHkuZXF1YWxzKHJlc3VsdCwgaW5wdXQpKSB0aHJvdyBuZXcgVFRlc3RFcnJvcihyZXN1bHQsIGlucHV0KTsKKyAgfSkpOworCisgIHRlc3RzLmFkZChuZXcgVFRlc3QoVEVTVF9DT05UQUlORVJTLCAndGVzdEVudW0nLCAoKSBhc3luYyB7CisgICAgYXdhaXQgX3Rlc3RFbnVtKE51bWJlcnouT05FKTsKKyAgICBhd2FpdCBfdGVzdEVudW0oTnVtYmVyei5UV08pOworICAgIGF3YWl0IF90ZXN0RW51bShOdW1iZXJ6LlRIUkVFKTsKKyAgICBhd2FpdCBfdGVzdEVudW0oTnVtYmVyei5GSVZFKTsKKyAgICBhd2FpdCBfdGVzdEVudW0oTnVtYmVyei5FSUdIVCk7CisgIH0pKTsKKworICB0ZXN0cy5hZGQobmV3IFRUZXN0KFRFU1RfQkFTRVRZUEVTLCAndGVzdFR5cGVkZWYnLCAoKSBhc3luYyB7CisgICAgdmFyIGlucHV0ID0gMzA5ODU4MjM1MDgyNTIzOworICAgIHZhciByZXN1bHQgPSBhd2FpdCBjbGllbnQudGVzdFR5cGVkZWYoaW5wdXQpOworICAgIGlmIChyZXN1bHQgIT0gaW5wdXQpIHRocm93IG5ldyBUVGVzdEVycm9yKHJlc3VsdCwgaW5wdXQpOworICB9KSk7CisKKyAgdGVzdHMuYWRkKG5ldyBUVGVzdChURVNUX0NPTlRBSU5FUlMsICd0ZXN0TWFwTWFwJywgKCkgYXN5bmMgeworICAgIE1hcDxpbnQsIE1hcDxpbnQsIGludD4+IHJlc3VsdCA9IGF3YWl0IGNsaWVudC50ZXN0TWFwTWFwKDEpOworICAgIGlmIChyZXN1bHQuaXNFbXB0eSB8fCByZXN1bHRbcmVzdWx0LmtleXMuZmlyc3RdLmlzRW1wdHkpIHsKKyAgICAgIHRocm93IG5ldyBUVGVzdEVycm9yKHJlc3VsdCwgJ01hcDxpbnQsIE1hcDxpbnQsIGludD4+Jyk7CisgICAgfQorICB9KSk7CisKKyAgdGVzdHMuYWRkKG5ldyBUVGVzdChURVNUX0NPTlRBSU5FUlMsICd0ZXN0SW5zYW5pdHknLCAoKSBhc3luYyB7CisgICAgdmFyIGlucHV0ID0gbmV3IEluc2FuaXR5KCk7CisgICAgaW5wdXQudXNlck1hcCA9IHtOdW1iZXJ6LkZJVkU6IDUwMDB9OworICAgIGlucHV0Lnh0cnVjdHMgPSBbeHRydWN0XTsKKworICAgIE1hcDxpbnQsIE1hcDxpbnQsIEluc2FuaXR5Pj4gcmVzdWx0ID0gYXdhaXQgY2xpZW50LnRlc3RJbnNhbml0eShpbnB1dCk7CisgICAgaWYgKHJlc3VsdC5pc0VtcHR5IHx8IHJlc3VsdFtyZXN1bHQua2V5cy5maXJzdF0uaXNFbXB0eSkgeworICAgICAgdGhyb3cgbmV3IFRUZXN0RXJyb3IocmVzdWx0LCAnTWFwPGludCwgTWFwPGludCwgSW5zYW5pdHk+PicpOworICAgIH0KKyAgfSkpOworCisgIHRlc3RzLmFkZChuZXcgVFRlc3QoVEVTVF9DT05UQUlORVJTLCAndGVzdE11bHRpJywgKCkgYXN5bmMgeworICAgIHZhciBpbnB1dCA9IG5ldyBYdHJ1Y3QoKQorICAgICAgLi5zdHJpbmdfdGhpbmcgPSAnSGVsbG8yJworICAgICAgLi5ieXRlX3RoaW5nID0gMTIzCisgICAgICAuLmkzMl90aGluZyA9IDQ1NgorICAgICAgLi5pNjRfdGhpbmcgPSA3ODk7CisKKyAgICB2YXIgcmVzdWx0ID0gYXdhaXQgY2xpZW50LnRlc3RNdWx0aShpbnB1dC5ieXRlX3RoaW5nLCBpbnB1dC5pMzJfdGhpbmcsCisgICAgICAgIGlucHV0Lmk2NF90aGluZywgezE6ICdvbmUnfSwgTnVtYmVyei5FSUdIVCwgNTY3OCk7CisgICAgaWYgKCckcmVzdWx0JyAhPSAnJGlucHV0JykgdGhyb3cgbmV3IFRUZXN0RXJyb3IocmVzdWx0LCBpbnB1dCk7CisgIH0pKTsKKworICB0ZXN0cy5hZGQobmV3IFRUZXN0KFRFU1RfRVhDRVBUSU9OUywgJ3Rlc3RFeGNlcHRpb24nLCAoKSBhc3luYyB7CisgICAgdHJ5IHsKKyAgICAgIGF3YWl0IGNsaWVudC50ZXN0RXhjZXB0aW9uKCdYY2VwdGlvbicpOworICAgIH0gb24gWGNlcHRpb24gY2F0Y2ggKF8pIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB0aHJvdyBuZXcgVFRlc3RFcnJvcihudWxsLCAnWGNlcHRpb24nKTsKKyAgfSkpOworCisgIHRlc3RzLmFkZChuZXcgVFRlc3QoVEVTVF9FWENFUFRJT05TLCAndGVzdE11bHRpRXhjZXB0aW9uJywgKCkgYXN5bmMgeworICAgIHRyeSB7CisgICAgICBhd2FpdCBjbGllbnQudGVzdE11bHRpRXhjZXB0aW9uKCdYY2VwdGlvbjInLCAnZm9vJyk7CisgICAgfSBvbiBYY2VwdGlvbjIgY2F0Y2ggKF8pIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB0aHJvdyBuZXcgVFRlc3RFcnJvcihudWxsLCAnWGNlcHRpb24yJyk7CisgIH0pKTsKKworICByZXR1cm4gdGVzdHM7Cit9CisKK0Z1dHVyZSBfdGVzdEVudW0oaW50IGlucHV0KSBhc3luYyB7CisgIHZhciByZXN1bHQgPSBhd2FpdCBjbGllbnQudGVzdEVudW0oaW5wdXQpOworICBpZiAocmVzdWx0ICE9IGlucHV0KSB0aHJvdyBuZXcgVFRlc3RFcnJvcihyZXN1bHQsIGlucHV0KTsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvZGFydC90ZXN0X2NsaWVudC9wdWJzcGVjLnlhbWwgYi90ZXN0L2RhcnQvdGVzdF9jbGllbnQvcHVic3BlYy55YW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxNjQyZjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhcnQvdGVzdF9jbGllbnQvcHVic3BlYy55YW1sCkBAIC0wLDAgKzEsMzYgQEAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAnTGljZW5zZScpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAnQVMgSVMnIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKworbmFtZTogdGhyaWZ0X3Rlc3RfY2xpZW50Cit2ZXJzaW9uOiAxLjAuMAorZGVzY3JpcHRpb246IEEgY2xpZW50IGludGVncmF0aW9uIHRlc3QgZm9yIHRoZSBEYXJ0IFRocmlmdCBsaWJyYXJ5CithdXRob3I6IEFwYWNoZSBUaHJpZnQgRGV2ZWxvcGVycyA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPgoraG9tZXBhZ2U6IGh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZworCitlbnZpcm9ubWVudDoKKyAgc2RrOiAiPj0xLjEzLjAgPDIuMC4wIgorCitkZXBlbmRlbmNpZXM6CisgIGFyZ3M6IF4wLjEzLjAKKyAgaHR0cDogXjAuMTEuMAorICB0aHJpZnQ6CisgICAgcGF0aDogLi4vLi4vLi4vbGliL2RhcnQKKyAgdGhyaWZ0X3Rlc3Q6CisgICAgcGF0aDogLi4vZ2VuLWRhcnQvdGhyaWZ0X3Rlc3QKKworZGV2X2RlcGVuZGVuY2llczoKKyAgdGVzdDogIl4wLjEyLjAiCmRpZmYgLS1naXQgYS90ZXN0L2VybC9NYWtlZmlsZS5hbSBiL3Rlc3QvZXJsL01ha2VmaWxlLmFtCmluZGV4IDMwOWQwN2UuLmZmMjVlODkgMTAwNjQ0Ci0tLSBhL3Rlc3QvZXJsL01ha2VmaWxlLmFtCisrKyBiL3Rlc3QvZXJsL01ha2VmaWxlLmFtCkBAIC0xNywyMiArMTcsMjUgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLVRIUklGVCA9ICQodG9wX3NyY2RpcikvY29tcGlsZXIvY3BwL3RocmlmdAotUkVCQVIgPSAkKHRvcF9zcmNkaXIpL2xpYi9lcmwvcmViYXIKLQogVEhSSUZUX0ZJTEVTID0gJCh3aWxkY2FyZCAuLi8qLnRocmlmdCkKIAoraWYgRVJMQU5HX09UUDE2CitFUkxfRkxBRyA9IGVybDpvdHAxNgorZWxzZQorRVJMX0ZMQUcgPSBlcmwKK2VuZGlmCisjIG1ha2Ugc3VyZSBUaHJpZnRUZXN0LnRocmlmdCBpcyBnZW5lcmF0ZWQgbGFzdCB0byBwcmV2ZW50IGNvbmZsaWN0cyB3aXRoIG90aGVyICoudGhyaWZ0IGZpbGVzCiAuZ2VuZXJhdGVkOiAkKFRIUklGVF9GSUxFUykKIAlmb3IgZiBpbiAkKFRIUklGVF9GSUxFUykgOyBkbyBcCi0JICAkKFRIUklGVCkgLS1nZW4gZXJsICQkZiA7IFwKKwkgICQoVEhSSUZUKSAtLWdlbiAkKEVSTF9GTEFHKSAtbyBzcmMgJCRmIDsgXAogCWRvbmUgOyBcCi0JJChUSFJJRlQpIC0tZ2VuIGVybDpsZWdhY3luYW1lcyBMZWdhY3lOYW1lcy50aHJpZnQKKwkkKFRIUklGVCkgLS1nZW4gJChFUkxfRkxBRykgLW8gc3JjIC4uL1RocmlmdFRlc3QudGhyaWZ0CiAJdG91Y2ggLmdlbmVyYXRlZAogCi1jaGVjazogLmdlbmVyYXRlZAotCSQoUkVCQVIpIGV1bml0CitwcmVjcm9zczogLmdlbmVyYXRlZAorCSQoUkVCQVIpIGNvbXBpbGUKIAogY2xlYW46CiAJcm0gLWYgLmdlbmVyYXRlZAotCXJtIC1yZiBnZW4tZXJsCisJcm0gLXJmIHNyYy9nZW4tZXJsCiAJJChSRUJBUikgY2xlYW4KZGlmZiAtLWdpdCBhL3Rlc3QvZXJsL3JlYmFyLmNvbmZpZyBiL3Rlc3QvZXJsL3JlYmFyLmNvbmZpZwppbmRleCA2MDM1ODQ5Li41OWEwNzg4IDEwMDY0NAotLS0gYS90ZXN0L2VybC9yZWJhci5jb25maWcKKysrIGIvdGVzdC9lcmwvcmViYXIuY29uZmlnCkBAIC0xLDUgKzEsNiBAQAore3N1Yl9kaXJzLCBbIi4uLy4uL2xpYi9lcmwiXX0uCisKIHtlcmxfb3B0cywgWwogICBkZWJ1Z19pbmZvLAotICB7aSwgWyJnZW4tZXJsIl19LAotICB7c3JjX2RpcnMsIFsiZ2VuLWVybCJdfQorICB7aSwgIi4uLy4uL2xpYi9lcmwvaW5jbHVkZSJ9CiBdfS4KZGlmZiAtLWdpdCBhL3Rlc3QvZXJsL3NyYy9sZWdhY3lfbmFtZXNfdGVzdC5lcmwgYi90ZXN0L2VybC9zcmMvbGVnYWN5X25hbWVzX3Rlc3QuZXJsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWNlN2QwLi4wMDAwMDAwCi0tLSBhL3Rlc3QvZXJsL3NyYy9sZWdhY3lfbmFtZXNfdGVzdC5lcmwKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0lJQotJSUgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotJSUgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSUlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0lJSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSUlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSUlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSUlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotJSUKLSUlICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0lJQotJSUgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotJSUgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSUlICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotJSUgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSUlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSUlIHVuZGVyIHRoZSBMaWNlbnNlLgotJSUKLQotLW1vZHVsZShsZWdhY3lfbmFtZXNfdGVzdCkuCi0tY29tcGlsZShleHBvcnRfYWxsKS4KLQotLWluY2x1ZGVfbGliKCJldW5pdC9pbmNsdWRlL2V1bml0LmhybCIpLgotCi0taW5jbHVkZSgibGVnYWN5TmFtZXNfY29uc3RhbnRzLmhybCIpLgotCi1yZWNvcmRfZ2VuZXJhdGlvbl90ZXN0XygpIC0+Ci0gIFsKLSAgICB7ImNhcGl0YWxpemVkU3RydWN0IHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCi0gICAgICB7Y2FwaXRhbGl6ZWRTdHJ1Y3QsIF8sIF99LAotICAgICAgI2NhcGl0YWxpemVkU3RydWN0e2lkPW51bGwsbWVzc2FnZT1udWxsfQotICAgICl9Ci0gIF0uCi0KLXN0cnVjdF9pbmZvX3Rlc3RfKCkgLT4KLSAgWwotICAgIHsiY2FwaXRhbGl6ZWRTdHJ1Y3QgZXh0ZW5kZWQgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbCi0gICAgICAgIHsxLCB1bmRlZmluZWQsIGkzMiwgJ2lkJywgdW5kZWZpbmVkfSwKLSAgICAgICAgezIsIHVuZGVmaW5lZCwgc3RyaW5nLCAnbWVzc2FnZScsIHVuZGVmaW5lZH0KLSAgICAgIF19LAotICAgICAgbGVnYWN5TmFtZXNfdHlwZXM6c3RydWN0X2luZm9fZXh0KGNhcGl0YWxpemVkU3RydWN0KQotICAgICl9LAotICAgIHsibGlzdENhcGl0YWxpemVkU3RydWN0cyBleHRlbmRlZCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFsKLSAgICAgICAgezEsIHVuZGVmaW5lZCwge2xpc3QsIHtzdHJ1Y3QsIHsnbGVnYWN5TmFtZXNfdHlwZXMnLCAnY2FwaXRhbGl6ZWRTdHJ1Y3QnfX19LCAnc3RydWN0cycsIFtdfQotICAgICAgXX0sCi0gICAgICBsZWdhY3lOYW1lc190eXBlczpzdHJ1Y3RfaW5mb19leHQobGlzdENhcGl0YWxpemVkU3RydWN0cykKLSAgICApfQotICBdLgotCi1zZXJ2aWNlX2luZm9fdGVzdF8oKSAtPgotICBbCi0gICAgeyJuYW1lcyBwYXJhbXMiLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgWwotICAgICAgICB7MSwge3N0cnVjdCwgeydsZWdhY3lOYW1lc190eXBlcycsICdjYXBpdGFsaXplZFN0cnVjdCd9fX0sCi0gICAgICAgIHsyLCB7c3RydWN0LCB7J2xlZ2FjeU5hbWVzX3R5cGVzJywgJ2NhcGl0YWxpemVkU3RydWN0J319fQotICAgICAgXX0sCi0gICAgICBsZWdhY3lOYW1lc190aHJpZnQ6ZnVuY3Rpb25faW5mbyhuYW1lcywgcGFyYW1zX3R5cGUpCi0gICAgKX0sCi0gICAgeyJuYW1lcyByZXBseSIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCB7J2xlZ2FjeU5hbWVzX3R5cGVzJywgJ2xpc3RDYXBpdGFsaXplZFN0cnVjdHMnfX0sCi0gICAgICBsZWdhY3lOYW1lc190aHJpZnQ6ZnVuY3Rpb25faW5mbyhuYW1lcywgcmVwbHlfdHlwZSkKLSAgICApfSwKLSAgICB7Im5hbWVzIGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgW3sxLCB7c3RydWN0LCB7J2xlZ2FjeU5hbWVzX3R5cGVzJywgJ3hjZXB0aW9uJ319fV19LAotICAgICAgbGVnYWN5TmFtZXNfdGhyaWZ0OmZ1bmN0aW9uX2luZm8obmFtZXMsIGV4Y2VwdGlvbnMpCi0gICAgKX0KLSAgXS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2VybC9zcmMvbmFtZV9jb25mbGljdF90ZXN0LmVybCBiL3Rlc3QvZXJsL3NyYy9uYW1lX2NvbmZsaWN0X3Rlc3QuZXJsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzhlZmYwLi4wMDAwMDAwCi0tLSBhL3Rlc3QvZXJsL3NyYy9uYW1lX2NvbmZsaWN0X3Rlc3QuZXJsCisrKyAvZGV2L251bGwKQEAgLTEsMjkzICswLDAgQEAKLSUlCi0lJSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0lJSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotJSUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSUlIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotJSUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotJSUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotJSUgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0lJQotJSUgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSUlCi0lJSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0lJSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotJSUgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0lJSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotJSUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotJSUgdW5kZXIgdGhlIExpY2Vuc2UuCi0lJQotCi0tbW9kdWxlKG5hbWVfY29uZmxpY3RfdGVzdCkuCi0tY29tcGlsZShleHBvcnRfYWxsKS4KLQotLWluY2x1ZGVfbGliKCJldW5pdC9pbmNsdWRlL2V1bml0LmhybCIpLgotCi0taW5jbHVkZSgibmFtZV9jb25mbGljdF90ZXN0X2NvbnN0YW50cy5ocmwiKS4KLQotcmVjb3JkX2dlbmVyYXRpb25fdGVzdF8oKSAtPgotICBbCi0gICAgeyJ1c2luZyByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAotICAgICAge3VzaW5nLCBfLCBffSwKLSAgICAgICN1c2luZ3tzaW5nbGU9bnVsbCxpbnRlZ2VyPW51bGx9Ci0gICAgKX0sCi0gICAgeyJkZWxlZ2F0ZSByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAotICAgICAge2RlbGVnYXRlLCBfLCBffSwKLSAgICAgICNkZWxlZ2F0ZXtwYXJ0aWFsPW51bGwsZGVsZWdhdGU9bnVsbH0KLSAgICApfSwKLSAgICB7ImdldCByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAotICAgICAge2dldCwgX30sCi0gICAgICAjZ2V0e3NieXRlPW51bGx9Ci0gICAgKX0sCi0gICAgeyJwYXJ0aWFsIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCi0gICAgICB7cGFydGlhbCwgX30sCi0gICAgICAjcGFydGlhbHt1c2luZz1udWxsfQotICAgICl9LAotICAgIHsiQ2xhc3NBbmRQcm9wIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCi0gICAgICB7J0NsYXNzQW5kUHJvcCcsIF8sIF8sIF8sIF99LAotICAgICAgIydDbGFzc0FuZFByb3AnewotICAgICAgICAnQ2xhc3NBbmRQcm9wJz1udWxsLAotICAgICAgICAnQ2xhc3NBbmRQcm9wXyc9bnVsbCwKLSAgICAgICAgJ0NsYXNzQW5kUHJvcF9fJz1udWxsLAotICAgICAgICAnQ2xhc3NBbmRQcm9wZXInPW51bGwKLSAgICAgIH0KLSAgICApfSwKLSAgICB7InNlY29uZF9jaGFuY2UgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKLSAgICAgIHtzZWNvbmRfY2hhbmNlLCBfLCBfLCBfLCBffSwKLSAgICAgICNzZWNvbmRfY2hhbmNlewotICAgICAgICAnU0VDT05EX0NIQU5DRSc9bnVsbCwKLSAgICAgICAgJ1NFQ09ORF9DSEFOQ0VfJz1udWxsLAotICAgICAgICAnU0VDT05EX0NIQU5DRV9fJz1udWxsLAotICAgICAgICAnU0VDT05EX0NIQU5DRVMnPW51bGwKLSAgICAgIH0KLSAgICApfSwKLSAgICB7Ik5PV19FQVRfVEhJUyByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAotICAgICAgeydOT1dfRUFUX1RISVMnLCBfLCBfLCBfLCBffSwKLSAgICAgICMnTk9XX0VBVF9USElTJ3sKLSAgICAgICAgbm93X2VhdF90aGlzPW51bGwsCi0gICAgICAgIG5vd19lYXRfdGhpc189bnVsbCwKLSAgICAgICAgbm93X2VhdF90aGlzX189bnVsbCwKLSAgICAgICAgbm93X2VhdF90aGlzX2FuZF90aGlzPW51bGwKLSAgICAgIH0KLSAgICApfSwKLSAgICB7IlRoZUVkZ2VDYXNlIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCi0gICAgICB7J1RoZUVkZ2VDYXNlJywgXywgXywgXywgXywgXywgX30sCi0gICAgICAjJ1RoZUVkZ2VDYXNlJ3sKLSAgICAgICAgdGhlRWRnZUNhc2U9bnVsbCwKLSAgICAgICAgdGhlRWRnZUNhc2VfPW51bGwsCi0gICAgICAgIHRoZUVkZ2VDYXNlX189bnVsbCwKLSAgICAgICAgJ1RoZUVkZ2VDYXNlJz1udWxsLAotICAgICAgICAnVGhlRWRnZUNhc2VfJz1udWxsLAotICAgICAgICAnVGhlRWRnZUNhc2VfXyc9bnVsbAotICAgICAgfQotICAgICl9LAotICAgIHsiVHJpY2t5XyByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAotICAgICAgeydUcmlja3lfJywgXywgX30sCi0gICAgICAjJ1RyaWNreV8ne3RyaWNreT1udWxsLCdUcmlja3knPW51bGx9Ci0gICAgKX0sCi0gICAgeyJOZXN0ZWQgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKLSAgICAgIHsnTmVzdGVkJywgXywgXywgXywgXywgXywgX30sCi0gICAgICAjJ05lc3RlZCd7Ci0gICAgICAgICdDbGFzc0FuZFByb3AnPW51bGwsCi0gICAgICAgIHNlY29uZF9jaGFuY2U9bnVsbCwKLSAgICAgICAgJ05PV19FQVRfVEhJUyc9bnVsbCwKLSAgICAgICAgJ1RoZUVkZ2VDYXNlJz1udWxsLAotICAgICAgICAnVHJpY2t5Xyc9bnVsbCwKLSAgICAgICAgJ05lc3RlZCc9bnVsbAotICAgICAgfQotICAgICl9LAotICAgIHsiUHJvYmxlbV8gcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKLSAgICAgIHsnUHJvYmxlbV8nLCBfLCBffSwKLSAgICAgICMnUHJvYmxlbV8ne3Byb2JsZW09bnVsbCwnUHJvYmxlbSc9bnVsbH0KLSAgICApfQotICBdLgotCi1zdHJ1Y3RfaW5mb190ZXN0XygpIC0+Ci0gIFsKLSAgICB7InVzaW5nIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgW3sxLCBkb3VibGV9LHsyLCBkb3VibGV9XX0sCi0gICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm8odXNpbmcpCi0gICAgKX0sCi0gICAgeyJkZWxlZ2F0ZSBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFsKLSAgICAgICAgezEsIHN0cmluZ30sCi0gICAgICAgIHsyLCB7c3RydWN0LCB7bmFtZV9jb25mbGljdF90ZXN0X3R5cGVzLCBkZWxlZ2F0ZX19fQotICAgICAgXX0sCi0gICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm8oZGVsZWdhdGUpCi0gICAgKX0sCi0gICAgeyJnZXQgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbezEsIGJvb2x9XX0sCi0gICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm8oZ2V0KQotICAgICl9LAotICAgIHsicGFydGlhbCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFt7MSwge3N0cnVjdCwge25hbWVfY29uZmxpY3RfdGVzdF90eXBlcywgdXNpbmd9fX1dfSwKLSAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlczpzdHJ1Y3RfaW5mbyhwYXJ0aWFsKQotICAgICl9LAotICAgIHsiQ2xhc3NBbmRQcm9wIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgW3sxLCBib29sfSx7MiwgYm9vbH0sezMsIGJvb2x9LHs0LCBib29sfV19LAotICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvKCdDbGFzc0FuZFByb3AnKQotICAgICl9LAotICAgIHsic2Vjb25kX2NoYW5jZSBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFt7MSwgYm9vbH0sezIsIGJvb2x9LHszLCBib29sfSx7NCwgYm9vbH1dfSwKLSAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlczpzdHJ1Y3RfaW5mbyhzZWNvbmRfY2hhbmNlKQotICAgICl9LAotICAgIHsiTk9XX0VBVF9USElTIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgW3sxLCBib29sfSx7MiwgYm9vbH0sezMsIGJvb2x9LHs0LCBib29sfV19LAotICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvKCdOT1dfRUFUX1RISVMnKQotICAgICl9LAotICAgIHsiVGhlRWRnZUNhc2UgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbezEsIGJvb2x9LHsyLCBib29sfSx7MywgYm9vbH0sezQsIGJvb2x9LHs1LCBib29sfSx7NiwgYm9vbH1dfSwKLSAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlczpzdHJ1Y3RfaW5mbygnVGhlRWRnZUNhc2UnKQotICAgICl9LAotICAgIHsiVHJpY2t5XyBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFt7MSwgYm9vbH0sezIsIGJvb2x9XX0sCi0gICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm8oJ1RyaWNreV8nKQotICAgICl9LAotICAgIHsiTmVzdGVkIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgWwotICAgICAgICB7MSwge3N0cnVjdCwge25hbWVfY29uZmxpY3RfdGVzdF90eXBlcywgJ0NsYXNzQW5kUHJvcCd9fX0sCi0gICAgICAgIHsyLCB7c3RydWN0LCB7bmFtZV9jb25mbGljdF90ZXN0X3R5cGVzLCBzZWNvbmRfY2hhbmNlfX19LAotICAgICAgICB7Mywge3N0cnVjdCwge25hbWVfY29uZmxpY3RfdGVzdF90eXBlcywgJ05PV19FQVRfVEhJUyd9fX0sCi0gICAgICAgIHs0LCB7c3RydWN0LCB7bmFtZV9jb25mbGljdF90ZXN0X3R5cGVzLCAnVGhlRWRnZUNhc2UnfX19LAotICAgICAgICB7NSwge3N0cnVjdCwge25hbWVfY29uZmxpY3RfdGVzdF90eXBlcywgJ1RyaWNreV8nfX19LAotICAgICAgICB7Niwge3N0cnVjdCwge25hbWVfY29uZmxpY3RfdGVzdF90eXBlcywgJ05lc3RlZCd9fX0KLSAgICAgIF19LAotICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvKCdOZXN0ZWQnKQotICAgICl9LAotICAgIHsiUHJvYmxlbV8gZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbezEsIGJvb2x9LHsyLCBib29sfV19LAotICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvKCdQcm9ibGVtXycpCi0gICAgKX0sCi0gICAgeyJ1c2luZyBleHRlbmRlZCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFsKLSAgICAgICAgezEsIHVuZGVmaW5lZCwgZG91YmxlLCBzaW5nbGUsIHVuZGVmaW5lZH0sCi0gICAgICAgIHsyLCB1bmRlZmluZWQsIGRvdWJsZSwgaW50ZWdlciwgdW5kZWZpbmVkfQotICAgICAgXX0sCi0gICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KHVzaW5nKQotICAgICl9LAotICAgIHsiZGVsZWdhdGUgZXh0ZW5kZWQgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbCi0gICAgICAgIHsxLCB1bmRlZmluZWQsIHN0cmluZywgcGFydGlhbCwgdW5kZWZpbmVkfSwKLSAgICAgICAgezIsIHVuZGVmaW5lZCwge3N0cnVjdCwge25hbWVfY29uZmxpY3RfdGVzdF90eXBlcywgZGVsZWdhdGV9fSwgZGVsZWdhdGUsIHVuZGVmaW5lZH0KLSAgICAgIF19LAotICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dChkZWxlZ2F0ZSkKLSAgICApfSwKLSAgICB7ImdldCBleHRlbmRlZCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFt7MSwgdW5kZWZpbmVkLCBib29sLCBzYnl0ZSwgdW5kZWZpbmVkfV19LAotICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dChnZXQpCi0gICAgKX0sCi0gICAgeyJwYXJ0aWFsIGV4dGVuZGVkIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgWwotICAgICAgICB7MSwgdW5kZWZpbmVkLCB7c3RydWN0LCB7bmFtZV9jb25mbGljdF90ZXN0X3R5cGVzLCB1c2luZ319LCB1c2luZywgI3VzaW5ne319Ci0gICAgICBdfSwKLSAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQocGFydGlhbCkKLSAgICApfSwKLSAgICB7IkNsYXNzQW5kUHJvcCBleHRlbmRlZCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFsKLSAgICAgICAgezEsIHVuZGVmaW5lZCwgYm9vbCwgJ0NsYXNzQW5kUHJvcCcsIHVuZGVmaW5lZH0sCi0gICAgICAgIHsyLCB1bmRlZmluZWQsIGJvb2wsICdDbGFzc0FuZFByb3BfJywgdW5kZWZpbmVkfSwKLSAgICAgICAgezMsIHVuZGVmaW5lZCwgYm9vbCwgJ0NsYXNzQW5kUHJvcF9fJywgdW5kZWZpbmVkfSwKLSAgICAgICAgezQsIHVuZGVmaW5lZCwgYm9vbCwgJ0NsYXNzQW5kUHJvcGVyJywgdW5kZWZpbmVkfQotICAgICAgXX0sCi0gICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCdDbGFzc0FuZFByb3AnKQotICAgICl9LAotICAgIHsic2Vjb25kX2NoYW5jZSBleHRlbmRlZCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFsKLSAgICAgICAgezEsIHVuZGVmaW5lZCwgYm9vbCwgJ1NFQ09ORF9DSEFOQ0UnLCB1bmRlZmluZWR9LAotICAgICAgICB7MiwgdW5kZWZpbmVkLCBib29sLCAnU0VDT05EX0NIQU5DRV8nLCB1bmRlZmluZWR9LAotICAgICAgICB7MywgdW5kZWZpbmVkLCBib29sLCAnU0VDT05EX0NIQU5DRV9fJywgdW5kZWZpbmVkfSwKLSAgICAgICAgezQsIHVuZGVmaW5lZCwgYm9vbCwgJ1NFQ09ORF9DSEFOQ0VTJywgdW5kZWZpbmVkfQotICAgICAgXX0sCi0gICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KHNlY29uZF9jaGFuY2UpCi0gICAgKX0sCi0gICAgeyJOT1dfRUFUX1RISVMgZXh0ZW5kZWQgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbCi0gICAgICAgIHsxLCB1bmRlZmluZWQsIGJvb2wsIG5vd19lYXRfdGhpcywgdW5kZWZpbmVkfSwKLSAgICAgICAgezIsIHVuZGVmaW5lZCwgYm9vbCwgbm93X2VhdF90aGlzXywgdW5kZWZpbmVkfSwKLSAgICAgICAgezMsIHVuZGVmaW5lZCwgYm9vbCwgbm93X2VhdF90aGlzX18sIHVuZGVmaW5lZH0sCi0gICAgICAgIHs0LCB1bmRlZmluZWQsIGJvb2wsIG5vd19lYXRfdGhpc19hbmRfdGhpcywgdW5kZWZpbmVkfQotICAgICAgXX0sCi0gICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCdOT1dfRUFUX1RISVMnKQotICAgICl9LAotICAgIHsiVGhlRWRnZUNhc2UgZXh0ZW5kZWQgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbCi0gICAgICAgIHsxLCB1bmRlZmluZWQsIGJvb2wsIHRoZUVkZ2VDYXNlLCB1bmRlZmluZWR9LAotICAgICAgICB7MiwgdW5kZWZpbmVkLCBib29sLCB0aGVFZGdlQ2FzZV8sIHVuZGVmaW5lZH0sCi0gICAgICAgIHszLCB1bmRlZmluZWQsIGJvb2wsIHRoZUVkZ2VDYXNlX18sIHVuZGVmaW5lZH0sCi0gICAgICAgIHs0LCB1bmRlZmluZWQsIGJvb2wsICdUaGVFZGdlQ2FzZScsIHVuZGVmaW5lZH0sCi0gICAgICAgIHs1LCB1bmRlZmluZWQsIGJvb2wsICdUaGVFZGdlQ2FzZV8nLCB1bmRlZmluZWR9LAotICAgICAgICB7NiwgdW5kZWZpbmVkLCBib29sLCAnVGhlRWRnZUNhc2VfXycsIHVuZGVmaW5lZH0KLSAgICAgIF19LAotICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgnVGhlRWRnZUNhc2UnKQotICAgICl9LAotICAgIHsiVHJpY2t5XyBleHRlbmRlZCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFsKLSAgICAgICAgezEsIHVuZGVmaW5lZCwgYm9vbCwgdHJpY2t5LCB1bmRlZmluZWR9LAotICAgICAgICB7MiwgdW5kZWZpbmVkLCBib29sLCAnVHJpY2t5JywgdW5kZWZpbmVkfQotICAgICAgXX0sCi0gICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCdUcmlja3lfJykKLSAgICApfSwKLSAgICB7Ik5lc3RlZCBleHRlbmRlZCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFsKLSAgICAgICAgezEsIHVuZGVmaW5lZCwge3N0cnVjdCwgewotICAgICAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlcywKLSAgICAgICAgICAnQ2xhc3NBbmRQcm9wJwotICAgICAgICB9fSwgJ0NsYXNzQW5kUHJvcCcsICMnQ2xhc3NBbmRQcm9wJ3t9fSwKLSAgICAgICAgezIsIHVuZGVmaW5lZCwge3N0cnVjdCwgewotICAgICAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlcywKLSAgICAgICAgICBzZWNvbmRfY2hhbmNlCi0gICAgICAgIH19LCBzZWNvbmRfY2hhbmNlLCAjc2Vjb25kX2NoYW5jZXt9fSwKLSAgICAgICAgezMsIHVuZGVmaW5lZCwge3N0cnVjdCwgewotICAgICAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlcywKLSAgICAgICAgICAnTk9XX0VBVF9USElTJwotICAgICAgICB9fSwgJ05PV19FQVRfVEhJUycsICMnTk9XX0VBVF9USElTJ3t9fSwKLSAgICAgICAgezQsIHVuZGVmaW5lZCwge3N0cnVjdCwgewotICAgICAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlcywKLSAgICAgICAgICAnVGhlRWRnZUNhc2UnCi0gICAgICAgIH19LCAnVGhlRWRnZUNhc2UnLCAjJ1RoZUVkZ2VDYXNlJ3t9fSwKLSAgICAgICAgezUsIHVuZGVmaW5lZCwge3N0cnVjdCwgewotICAgICAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlcywKLSAgICAgICAgICAnVHJpY2t5XycKLSAgICAgICAgfX0sICdUcmlja3lfJywgIydUcmlja3lfJ3t9fSwKLSAgICAgICAgezYsIHVuZGVmaW5lZCwge3N0cnVjdCwgewotICAgICAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlcywKLSAgICAgICAgICAnTmVzdGVkJwotICAgICAgICB9fSwgJ05lc3RlZCcsIHVuZGVmaW5lZH0KLSAgICAgIF19LAotICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgnTmVzdGVkJykKLSAgICApfSwKLSAgICB7IlByb2JsZW1fIGV4dGVuZGVkIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgWwotICAgICAgICB7MSwgdW5kZWZpbmVkLCBib29sLCBwcm9ibGVtLCB1bmRlZmluZWR9LAotICAgICAgICB7MiwgdW5kZWZpbmVkLCBib29sLCAnUHJvYmxlbScsIHVuZGVmaW5lZH0KLSAgICAgIF19LAotICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgnUHJvYmxlbV8nKQotICAgICl9Ci0gIF0uCi0KLXNlcnZpY2VfaW5mb190ZXN0XygpIC0+Ci0gIFsKLSAgICB7ImV2ZW50IHBhcmFtcyIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbezEsIHtzdHJ1Y3QsIHtuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXMsIHBhcnRpYWx9fX1dfSwKLSAgICAgIGV4dGVybl90aHJpZnQ6ZnVuY3Rpb25faW5mbyhldmVudCwgcGFyYW1zX3R5cGUpCi0gICAgKX0sCi0gICAgeyJldmVudCByZXBseSIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCB7bmFtZV9jb25mbGljdF90ZXN0X3R5cGVzLCBkZWxlZ2F0ZX19LAotICAgICAgZXh0ZXJuX3RocmlmdDpmdW5jdGlvbl9pbmZvKGV2ZW50LCByZXBseV90eXBlKQotICAgICl9LAotICAgIHsiZXZlbnQgZXhjZXB0aW9ucyIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbXX0sCi0gICAgICBleHRlcm5fdGhyaWZ0OmZ1bmN0aW9uX2luZm8oZXZlbnQsIGV4Y2VwdGlvbnMpCi0gICAgKX0sCi0gICAgeyJGb28gcGFyYW1zIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFt7MSwge3N0cnVjdCwge25hbWVfY29uZmxpY3RfdGVzdF90eXBlcywgJ05lc3RlZCd9fX1dfSwKLSAgICAgIGV4dGVybl90aHJpZnQ6ZnVuY3Rpb25faW5mbygnRm9vJywgcGFyYW1zX3R5cGUpCi0gICAgKX0sCi0gICAgeyJGb28gcmVwbHkiLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgW119LAotICAgICAgZXh0ZXJuX3RocmlmdDpmdW5jdGlvbl9pbmZvKCdGb28nLCByZXBseV90eXBlKQotICAgICl9LAotICAgIHsiRm9vIGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgW3sxLCB7c3RydWN0LCB7bmFtZV9jb25mbGljdF90ZXN0X3R5cGVzLCAnUHJvYmxlbV8nfX19XX0sCi0gICAgICBleHRlcm5fdGhyaWZ0OmZ1bmN0aW9uX2luZm8oJ0ZvbycsIGV4Y2VwdGlvbnMpCi0gICAgKX0KLSAgXS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2VybC9zcmMvdGVzdF9jbGllbnQuZXJsIGIvdGVzdC9lcmwvc3JjL3Rlc3RfY2xpZW50LmVybApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmFkNTkyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9lcmwvc3JjL3Rlc3RfY2xpZW50LmVybApAQCAtMCwwICsxLDE3NCBAQAorJSUKKyUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCislJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCislJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCislJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCislJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyUlCislJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorJSUKKyUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCislJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCislJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCislJSB1bmRlciB0aGUgTGljZW5zZS4KKyUlCisKKy1tb2R1bGUodGVzdF9jbGllbnQpLgorCistZXhwb3J0KFtzdGFydC8wLCBzdGFydC8xXSkuCisKKy1pbmNsdWRlKCJnZW4tZXJsL3RocmlmdF90ZXN0X3R5cGVzLmhybCIpLgorCistcmVjb3JkKG9wdGlvbnMsIHtwb3J0ID0gOTA5MCwKKyAgICAgICAgICAgICAgICAgIGNsaWVudF9vcHRzID0gW119KS4KKworcGFyc2VfYXJncyhBcmdzKSAtPiBwYXJzZV9hcmdzKEFyZ3MsICNvcHRpb25ze30pLgorcGFyc2VfYXJncyhbXSwgT3B0cykgLT4KKyAgT3B0czsKK3BhcnNlX2FyZ3MoW0hlYWQgfCBSZXN0XSwgT3B0cykgLT4KKyAgICBOZXdPcHRzID0KKyAgICAgICAgY2FzZSBIZWFkIG9mCisgICAgICAgICAgICAiLS1wb3J0PSIgKysgUG9ydCAtPgorICAgICAgICAgICAgICAgIGNhc2Ugc3RyaW5nOnRvX2ludGVnZXIoUG9ydCkgb2YKKyAgICAgICAgICAgICAgICAgIHtJbnRQb3J0LF99IHdoZW4gaXNfaW50ZWdlcihJbnRQb3J0KSAtPgorICAgICAgICAgICAgICAgICAgICBPcHRzI29wdGlvbnN7cG9ydCA9IEludFBvcnR9OworICAgICAgICAgICAgICAgICAgX0Vsc2UgLT4KKyAgICAgICAgICAgICAgICAgICAgZXJsYW5nOmVycm9yKHtiYWRfYXJnLCBIZWFkfSkKKyAgICAgICAgICAgICAgICBlbmQ7CisgICAgICAgICAgICAiLS10cmFuc3BvcnQ9IiArKyBUcmFucyAtPgorICAgICAgICAgICAgICAgICUgVE9ETzogRW5hYmxlIEJ1ZmZlcmVkIGFuZCBIVFRQIHRyYW5zcG9ydAorICAgICAgICAgICAgICAgIGNhc2UgVHJhbnMgb2YKKyAgICAgICAgICAgICAgICAgICAgImZyYW1lZCIgLT4KKyAgICAgICAgICAgICAgICAgICAgICAgIE9wdHMjb3B0aW9uc3tjbGllbnRfb3B0cyA9IFt7ZnJhbWVkLCB0cnVlfSB8IE9wdHMjb3B0aW9ucy5jbGllbnRfb3B0c119OworICAgICAgICAgICAgICAgICAgICBfRWxzZSAtPgorICAgICAgICAgICAgICAgICAgICAgICAgT3B0cworICAgICAgICAgICAgICAgIGVuZDsKKyAgICAgICAgICAgICItLXNzbCIgLT4KKyAgICAgICAgICAgICAgICBzc2w6c3RhcnQoKSwKKyAgICAgICAgICAgICAgICBTc2xPcHRpb25zID0KKyAgICAgICAgICAgICAgICAgICAge3NzbG9wdGlvbnMsIFsKKyAgICAgICAgICAgICAgICAgICAgICAgIHtjYWNlcnRmaWxlLCAiLi4va2V5cy9DQS5wZW0ifSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHtjZXJ0ZmlsZSwgIi4uL2tleXMvY2xpZW50LnBlbSJ9LAorICAgICAgICAgICAgICAgICAgICAgICAge2tleWZpbGUsICIuLi9rZXlzL2NsaWVudC5rZXkifQorICAgICAgICAgICAgICAgICAgICBdfSwKKyAgICAgICAgICAgICAgICBPcHRzI29wdGlvbnN7Y2xpZW50X29wdHMgPSBbe3NzbHRyYW5zcG9ydCwgdHJ1ZX0gfCBbU3NsT3B0aW9ucyB8IE9wdHMjb3B0aW9ucy5jbGllbnRfb3B0c11dfTsKKyAgICAgICAgICAgICItLXByb3RvY29sPSIgKysgUHJvdG8gLT4KKyAgICAgICAgICAgICAgICBPcHRzI29wdGlvbnN7Y2xpZW50X29wdHMgPSBbe3Byb3RvY29sLCBsaXN0X3RvX2F0b20oUHJvdG8pfV19OworICAgICAgICAgICAgX0Vsc2UgLT4KKyAgICAgICAgICAgICAgICBlcmxhbmc6ZXJyb3Ioe2JhZF9hcmcsIEhlYWR9KQorICAgICAgICBlbmQsCisgICAgcGFyc2VfYXJncyhSZXN0LCBOZXdPcHRzKS4KKworc3RhcnQoKSAtPiBzdGFydChpbml0OmdldF9wbGFpbl9hcmd1bWVudHMoKSkuCitzdGFydChBcmdzKSAtPgorICAjb3B0aW9uc3twb3J0ID0gUG9ydCwgY2xpZW50X29wdHMgPSBDbGllbnRPcHRzfSA9IHBhcnNlX2FyZ3MoQXJncyksCisgIHtvaywgQ2xpZW50MH0gPSB0aHJpZnRfY2xpZW50X3V0aWw6bmV3KAorICAgICIxMjcuMC4wLjEiLCBQb3J0LCB0aHJpZnRfdGVzdF90aHJpZnQsIENsaWVudE9wdHMpLAorCisgIERlbW9YdHJ1Y3QgPSAjJ3RocmlmdC50ZXN0Llh0cnVjdCd7CisgICAgICAgICAgICAgICAgICBzdHJpbmdfdGhpbmcgPSA8PCJaZXJvIj4+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+CisgICAgICAgICAgICB0aHJvdygjJ3RocmlmdC50ZXN0LlhjZXB0aW9uMid7ZXJyb3JDb2RlID0gMjAwMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdF90aGluZyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjJ3RocmlmdC50ZXN0Llh0cnVjdCd7c3RyaW5nX3RoaW5nID0gPDwiVGhpcyBpcyBhbiBYY2VwdGlvbjIiPj59fSk7CisgICAgICAgIF8gLT4KKyAgICAgICAgICAgIHtyZXBseSwgIyd0aHJpZnQudGVzdC5YdHJ1Y3Qne3N0cmluZ190aGluZyA9IEFyZzF9fQorICAgIGVuZDsKKworaGFuZGxlX2Z1bmN0aW9uKHRlc3RPbmV3YXksIHtTZWNvbmRzfSkgLT4KKyAgICBpbzpmb3JtYXQoInRlc3RPbmV3YXk6IH5wfm4iLCBbU2Vjb25kc10pLAorICAgIHRpbWVyOnNsZWVwKDEwMDAgKiBTZWNvbmRzKSwKKyAgICBvay4KZGlmZiAtLWdpdCBhL3Rlc3QvZXJsL3NyYy90aHJpZnRfdGVzdC5hcHAuc3JjIGIvdGVzdC9lcmwvc3JjL3RocmlmdF90ZXN0LmFwcC5zcmMKaW5kZXggNjllMmUyOC4uODBlZjk5NiAxMDA2NDQKLS0tIGEvdGVzdC9lcmwvc3JjL3RocmlmdF90ZXN0LmFwcC5zcmMKKysrIGIvdGVzdC9lcmwvc3JjL3RocmlmdF90ZXN0LmFwcC5zcmMKQEAgLTE5LDEzICsxOSwxNiBAQAogJSUlIC0qLSBtb2RlOmVybGFuZyAtKi0KIHthcHBsaWNhdGlvbiwgdGhyaWZ0X3Rlc3QsIFsKICAgJSBBIHF1aWNrIGRlc2NyaXB0aW9uIG9mIHRoZSBhcHBsaWNhdGlvbi4KLSAge2Rlc2NyaXB0aW9uLCAidGVzdHMgZm9yIHRocmlmdCBlcmxhbmcgY29tcGlsZXIgYmFja2VuZCJ9LAorICB7ZGVzY3JpcHRpb24sICJUaHJpZnQgY3Jvc3MgbGFuZ3VhZ2UgdGVzdCJ9LAogCiAgICUgVGhlIHZlcnNpb24gb2YgdGhlIGFwcGxpY2F0b24KLSAge3ZzbiwgIjAuOS4yIn0sCisgIHt2c24sICIxLjAuMCJ9LAogCiAgICUgQWxsIG1vZHVsZXMgdXNlZCBieSB0aGUgYXBwbGljYXRpb24uCi0gIHttb2R1bGVzLCBbbGVnYWN5X25hbWVzX3Rlc3QsIG5hbWVfY29uZmxpY3RfdGVzdCwgdGhyaWZ0X3Rlc3RfdGVzdF19LAorICB7bW9kdWxlcywgWworICAgIHRlc3RfY2xpZW50LAorICAgIHRlc3RfdGhyaWZ0X3NlcnZlcgorICBdfSwKIAogICAlIEFsbCBvZiB0aGUgcmVnaXN0ZXJlZCBuYW1lcyB0aGUgYXBwbGljYXRpb24gdXNlcy4gVGhpcyBjYW4gYmUgaWdub3JlZC4KICAge3JlZ2lzdGVyZWQsIFtdfSwKZGlmZiAtLWdpdCBhL3Rlc3QvZXJsL3NyYy90aHJpZnRfdGVzdF90ZXN0LmVybCBiL3Rlc3QvZXJsL3NyYy90aHJpZnRfdGVzdF90ZXN0LmVybApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdkZmUxYy4uMDAwMDAwMAotLS0gYS90ZXN0L2VybC9zcmMvdGhyaWZ0X3Rlc3RfdGVzdC5lcmwKKysrIC9kZXYvbnVsbApAQCAtMSw2NTUgKzAsMCBAQAotJSUKLSUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0lJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0lJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0lJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0lJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSUlCi0lJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotJSUKLSUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0lJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0lJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0lJSB1bmRlciB0aGUgTGljZW5zZS4KLSUlCi0KLSUgZG9uJ3QgcmVuYW1lIHRoaXMgdGhyaWZ0X3Rlc3QsIGl0IGNsb2JiZXJzIGdlbmVyYXRlZCBmaWxlcwotLW1vZHVsZSh0aHJpZnRfdGVzdF90ZXN0KS4KLS1jb21waWxlKGV4cG9ydF9hbGwpLgotCi0taW5jbHVkZV9saWIoImV1bml0L2luY2x1ZGUvZXVuaXQuaHJsIikuCi0KLS1pbmNsdWRlKCJ0aHJpZnRfdGVzdF9jb25zdGFudHMuaHJsIikuCi0KLWNvbnN0YW50X3Rlc3RfKCkgLT4KLSAgWwotICAgIHsibXlOdW1iZXJ6IGVxdWFscyAxIiwgP19hc3NlcnRFcXVhbCgxLCA/VEhSSUZUX1RFU1RfTVlOVU1CRVJaKX0KLSAgXS4KLQotcmVjb3JkX2dlbmVyYXRpb25fdGVzdF8oKSAtPgotICBbCi0gICAgeyJCb25rIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCi0gICAgICB7J0JvbmsnLCBfLCBffSwKLSAgICAgICMnQm9uayd7bWVzc2FnZT1udWxsLHR5cGU9bnVsbH0KLSAgICApfSwKLSAgICB7IkJvb2xzIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCi0gICAgICB7J0Jvb2xzJywgXywgX30sCi0gICAgICAjJ0Jvb2xzJ3tpbV90cnVlPW51bGwsaW1fZmFsc2U9bnVsbH0KLSAgICApfSwKLSAgICB7Ilh0cnVjdCByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAotICAgICAgeydYdHJ1Y3QnLCBfLCBfLCBfLCBffSwKLSAgICAgICMnWHRydWN0J3tzdHJpbmdfdGhpbmc9bnVsbCxieXRlX3RoaW5nPW51bGwsaTMyX3RoaW5nPW51bGwsaTY0X3RoaW5nPW51bGx9Ci0gICAgKX0sCi0gICAgeyJYdHJ1Y3QyIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCi0gICAgICB7J1h0cnVjdDInLCBfLCBfLCBffSwKLSAgICAgICMnWHRydWN0Mid7Ynl0ZV90aGluZz1udWxsLHN0cnVjdF90aGluZz1udWxsLGkzMl90aGluZz1udWxsfQotICAgICl9LAotICAgIHsiWHRydWN0MyByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAotICAgICAgeydYdHJ1Y3QzJywgXywgXywgXywgX30sCi0gICAgICAjJ1h0cnVjdDMne3N0cmluZ190aGluZz1udWxsLGNoYW5nZWQ9bnVsbCxpMzJfdGhpbmc9bnVsbCxpNjRfdGhpbmc9bnVsbH0KLSAgICApfSwKLSAgICB7Ikluc2FuaXR5IHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCi0gICAgICB7J0luc2FuaXR5JywgXywgX30sCi0gICAgICAjJ0luc2FuaXR5J3t1c2VyTWFwPW51bGwseHRydWN0cz1udWxsfQotICAgICl9LAotICAgIHsiQ3JhenlOZXN0aW5nIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCi0gICAgICB7J0NyYXp5TmVzdGluZycsIF8sIF8sIF8sIF99LAotICAgICAgIydDcmF6eU5lc3RpbmcnewotICAgICAgICBzdHJpbmdfZmllbGQ9bnVsbCwKLSAgICAgICAgc2V0X2ZpZWxkPW51bGwsCi0gICAgICAgIGxpc3RfZmllbGQ9bnVsbCwKLSAgICAgICAgYmluYXJ5X2ZpZWxkPW51bGwKLSAgICAgIH0KLSAgICApfSwKLSAgICB7IlhjZXB0aW9uIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCi0gICAgICB7J1hjZXB0aW9uJywgXywgX30sCi0gICAgICAjJ1hjZXB0aW9uJ3tlcnJvckNvZGU9bnVsbCxtZXNzYWdlPW51bGx9Ci0gICAgKX0sCi0gICAgeyJYY2VwdGlvbjIgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKLSAgICAgIHsnWGNlcHRpb24yJywgXywgX30sCi0gICAgICAjJ1hjZXB0aW9uMid7ZXJyb3JDb2RlPW51bGwsc3RydWN0X3RoaW5nPW51bGx9Ci0gICAgKX0sCi0gICAgeyJFbXB0eVN0cnVjdCByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKHsnRW1wdHlTdHJ1Y3QnfSwgIydFbXB0eVN0cnVjdCd7fSl9LAotICAgIHsiT25lRmllbGQgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCh7J09uZUZpZWxkJywgX30sICMnT25lRmllbGQne2ZpZWxkPW51bGx9KX0sCi0gICAgeyJWZXJzaW9uaW5nVGVzdFYxIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCi0gICAgICB7J1ZlcnNpb25pbmdUZXN0VjEnLCBfLCBfLCBffSwKLSAgICAgICMnVmVyc2lvbmluZ1Rlc3RWMSd7YmVnaW5faW5fYm90aD1udWxsLG9sZF9zdHJpbmc9bnVsbCxlbmRfaW5fYm90aD1udWxsfQotICAgICl9LAotICAgIHsiVmVyc2lvbmluZ1Rlc3RWMiByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAotICAgICAgeydWZXJzaW9uaW5nVGVzdFYyJywgXywgXywgXywgXywgXywgXywgXywgXywgXywgXywgXywgX30sCi0gICAgICAjJ1ZlcnNpb25pbmdUZXN0VjInewotICAgICAgICBiZWdpbl9pbl9ib3RoPW51bGwsCi0gICAgICAgIG5ld2ludD1udWxsLAotICAgICAgICBuZXdieXRlPW51bGwsCi0gICAgICAgIG5ld3Nob3J0PW51bGwsCi0gICAgICAgIG5ld2xvbmc9bnVsbCwKLSAgICAgICAgbmV3ZG91YmxlPW51bGwsCi0gICAgICAgIG5ld3N0cnVjdD1udWxsLAotICAgICAgICBuZXdsaXN0PW51bGwsCi0gICAgICAgIG5ld3NldD1udWxsLAotICAgICAgICBuZXdtYXA9bnVsbCwKLSAgICAgICAgbmV3c3RyaW5nPW51bGwsCi0gICAgICAgIGVuZF9pbl9ib3RoPW51bGwKLSAgICAgIH0KLSAgICApfSwKLSAgICB7Ikxpc3RUeXBlVmVyc2lvbmluZ1YxIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCi0gICAgICB7J0xpc3RUeXBlVmVyc2lvbmluZ1YxJywgXywgX30sCi0gICAgICAjJ0xpc3RUeXBlVmVyc2lvbmluZ1YxJ3tteWludHM9bnVsbCxoZWxsbz1udWxsfQotICAgICl9LAotICAgIHsiTGlzdFR5cGVWZXJzaW9uaW5nVjIgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKLSAgICAgIHsnTGlzdFR5cGVWZXJzaW9uaW5nVjInLCBfLCBffSwKLSAgICAgICMnTGlzdFR5cGVWZXJzaW9uaW5nVjIne3N0cmluZ3M9bnVsbCxoZWxsbz1udWxsfQotICAgICl9LAotICAgIHsiR3Vlc3NQcm90b2NvbFN0cnVjdCByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAotICAgICAgeydHdWVzc1Byb3RvY29sU3RydWN0JywgX30sCi0gICAgICAjJ0d1ZXNzUHJvdG9jb2xTdHJ1Y3Qne21hcF9maWVsZD1udWxsfQotICAgICl9LAotICAgIHsiTGFyZ2VEZWx0YXMgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKLSAgICAgIHsnTGFyZ2VEZWx0YXMnLCBfLCBfLCBfLCBfLCBfLCBfLCBfLCBfLCBfLCBffSwKLSAgICAgICMnTGFyZ2VEZWx0YXMnewotICAgICAgICBiMT1udWxsLAotICAgICAgICBiMTA9bnVsbCwKLSAgICAgICAgYjEwMD1udWxsLAotICAgICAgICBjaGVja190cnVlPW51bGwsCi0gICAgICAgIGIxMDAwPW51bGwsCi0gICAgICAgIGNoZWNrX2ZhbHNlPW51bGwsCi0gICAgICAgIHZlcnR3bzIwMDA9bnVsbCwKLSAgICAgICAgYV9zZXQyNTAwPW51bGwsCi0gICAgICAgIHZlcnR3bzMwMDA9bnVsbCwKLSAgICAgICAgYmlnX251bWJlcnM9bnVsbAotICAgICAgfQotICAgICl9LAotICAgIHsiTmVzdGVkTGlzdHNJMzJ4MiByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAotICAgICAgeydOZXN0ZWRMaXN0c0kzMngyJywgX30sCi0gICAgICAjJ05lc3RlZExpc3RzSTMyeDIne2ludGVnZXJsaXN0PW51bGx9Ci0gICAgKX0sCi0gICAgeyJOZXN0ZWRMaXN0c0kzMngzIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCi0gICAgICB7J05lc3RlZExpc3RzSTMyeDMnLCBffSwKLSAgICAgICMnTmVzdGVkTGlzdHNJMzJ4Myd7aW50ZWdlcmxpc3Q9bnVsbH0KLSAgICApfSwKLSAgICB7Ik5lc3RlZE1peGVkeDIgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKLSAgICAgIHsnTmVzdGVkTWl4ZWR4MicsIF8sIF8sIF99LAotICAgICAgIydOZXN0ZWRNaXhlZHgyJ3sKLSAgICAgICAgaW50X3NldF9saXN0PW51bGwsCi0gICAgICAgIG1hcF9pbnRfc3Ryc2V0PW51bGwsCi0gICAgICAgIG1hcF9pbnRfc3Ryc2V0X2xpc3Q9bnVsbAotICAgICAgfQotICAgICl9LAotICAgIHsiTGlzdEJvbmtzIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goeydMaXN0Qm9ua3MnLCBffSwgIydMaXN0Qm9ua3Mne2Jvbms9bnVsbH0pfSwKLSAgICB7Ik5lc3RlZExpc3RzQm9uayByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAotICAgICAgeydOZXN0ZWRMaXN0c0JvbmsnLCBffSwKLSAgICAgICMnTmVzdGVkTGlzdHNCb25rJ3tib25rPW51bGx9Ci0gICAgKX0sCi0gICAgeyJCb29sVGVzdCByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAotICAgICAgeydCb29sVGVzdCcsIF8sIF99LAotICAgICAgIydCb29sVGVzdCd7Yj1udWxsLHM9bnVsbH0KLSAgICApfSwKLSAgICB7IlN0cnVjdEEgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCh7J1N0cnVjdEEnLCBffSwgIydTdHJ1Y3RBJ3tzPW51bGx9KX0sCi0gICAgeyJTdHJ1Y3RCIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCi0gICAgICB7J1N0cnVjdEInLCBfLCBffSwKLSAgICAgICMnU3RydWN0Qid7YWE9bnVsbCxhYj1udWxsfQotICAgICl9Ci0gIF0uCi0KLXN0cnVjdF9pbmZvX3Rlc3RfKCkgLT4KLSAgWwotICAgIHsiQm9uayBkZWZpbml0aW9uIChzaG9ydCB2ZXJzaW9uKSIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbezEsIHN0cmluZ30sIHsyLCBpMzJ9XX0sCi0gICAgICB0aHJpZnRfdGVzdF90eXBlczpzdHJ1Y3RfaW5mbygnQm9uaycpCi0gICAgKX0sCi0gICAgeyJCb25rIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgWwotICAgICAgICB7MSwgdW5kZWZpbmVkLCBzdHJpbmcsIG1lc3NhZ2UsIHVuZGVmaW5lZH0sCi0gICAgICAgIHsyLCB1bmRlZmluZWQsIGkzMiwgdHlwZSwgdW5kZWZpbmVkfQotICAgICAgXX0sCi0gICAgICB0aHJpZnRfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ0JvbmsnKQotICAgICl9LAotICAgIHsiQm9vbHMgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbCi0gICAgICAgIHsxLCB1bmRlZmluZWQsIGJvb2wsIGltX3RydWUsIHVuZGVmaW5lZH0sCi0gICAgICAgIHsyLCB1bmRlZmluZWQsIGJvb2wsIGltX2ZhbHNlLCB1bmRlZmluZWR9Ci0gICAgICBdfSwKLSAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgnQm9vbHMnKQotICAgICl9LAotICAgIHsiWHRydWN0IGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgWwotICAgICAgICB7MSwgdW5kZWZpbmVkLCBzdHJpbmcsIHN0cmluZ190aGluZywgdW5kZWZpbmVkfSwKLSAgICAgICAgezQsIHVuZGVmaW5lZCwgYnl0ZSwgYnl0ZV90aGluZywgdW5kZWZpbmVkfSwKLSAgICAgICAgezksIHVuZGVmaW5lZCwgaTMyLCBpMzJfdGhpbmcsIHVuZGVmaW5lZH0sCi0gICAgICAgIHsxMSwgdW5kZWZpbmVkLCBpNjQsIGk2NF90aGluZywgdW5kZWZpbmVkfQotICAgICAgXX0sCi0gICAgICB0aHJpZnRfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ1h0cnVjdCcpCi0gICAgKX0sCi0gICAgeyJYdHJ1Y3QyIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgWwotICAgICAgICB7MSwgdW5kZWZpbmVkLCBieXRlLCBieXRlX3RoaW5nLCB1bmRlZmluZWR9LAotICAgICAgICB7MiwgdW5kZWZpbmVkLCB7c3RydWN0LCB7J3RocmlmdF90ZXN0X3R5cGVzJywgJ1h0cnVjdCd9fSwgc3RydWN0X3RoaW5nLCAjJ1h0cnVjdCd7fX0sCi0gICAgICAgIHszLCB1bmRlZmluZWQsIGkzMiwgaTMyX3RoaW5nLCB1bmRlZmluZWR9Ci0gICAgICBdfSwKLSAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgnWHRydWN0MicpCi0gICAgKX0sCi0gICAgeyJYdHJ1Y3QzIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgWwotICAgICAgICB7MSwgdW5kZWZpbmVkLCBzdHJpbmcsIHN0cmluZ190aGluZywgdW5kZWZpbmVkfSwKLSAgICAgICAgezQsIHVuZGVmaW5lZCwgaTMyLCBjaGFuZ2VkLCB1bmRlZmluZWR9LAotICAgICAgICB7OSwgdW5kZWZpbmVkLCBpMzIsIGkzMl90aGluZywgdW5kZWZpbmVkfSwKLSAgICAgICAgezExLCB1bmRlZmluZWQsIGk2NCwgaTY0X3RoaW5nLCB1bmRlZmluZWR9Ci0gICAgICBdfSwKLSAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgnWHRydWN0MycpCi0gICAgKX0sCi0gICAgeyJJbnNhbml0eSBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFsKLSAgICAgICAgezEsIHVuZGVmaW5lZCwge21hcCwgaTMyLCBpNjR9LCB1c2VyTWFwLCBkaWN0Om5ldygpfSwKLSAgICAgICAgezIsIHVuZGVmaW5lZCwge2xpc3QsIHtzdHJ1Y3QsIHsndGhyaWZ0X3Rlc3RfdHlwZXMnLCAnWHRydWN0J319fSwgeHRydWN0cywgW119Ci0gICAgICBdfSwKLSAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgnSW5zYW5pdHknKQotICAgICl9LAotICAgIHsiQ3JhenlOZXN0aW5nIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgWwotICAgICAgICB7MSwgdW5kZWZpbmVkLCBzdHJpbmcsIHN0cmluZ19maWVsZCwgdW5kZWZpbmVkfSwKLSAgICAgICAgezIsIG9wdGlvbmFsLCB7c2V0LCB7c3RydWN0LCB7J3RocmlmdF90ZXN0X3R5cGVzJywgJ0luc2FuaXR5J319fSwgc2V0X2ZpZWxkLCBzZXRzOm5ldygpfSwKLSAgICAgICAgezMsIHJlcXVpcmVkLCB7bGlzdCwge21hcCwgCi0gICAgICAgICAge3NldCwgaTMyfSwKLSAgICAgICAgICB7bWFwLCBpMzIsIHtzZXQsIHtsaXN0LCB7bWFwLCB7c3RydWN0LCB7J3RocmlmdF90ZXN0X3R5cGVzJywgJ0luc2FuaXR5J319LCBzdHJpbmd9fX19Ci0gICAgICAgIH19LCBsaXN0X2ZpZWxkLCBbXX0sCi0gICAgICAgIHs0LCB1bmRlZmluZWQsIHN0cmluZywgYmluYXJ5X2ZpZWxkLCB1bmRlZmluZWR9Ci0gICAgICBdfSwKLSAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgnQ3JhenlOZXN0aW5nJykKLSAgICApfSwKLSAgICB7IlhjZXB0aW9uIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgWwotICAgICAgICB7MSwgdW5kZWZpbmVkLCBpMzIsIGVycm9yQ29kZSwgdW5kZWZpbmVkfSwKLSAgICAgICAgezIsIHVuZGVmaW5lZCwgc3RyaW5nLCBtZXNzYWdlLCB1bmRlZmluZWR9Ci0gICAgICBdfSwKLSAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgnWGNlcHRpb24nKQotICAgICl9LAotICAgIHsiWGNlcHRpb24yIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgWwotICAgICAgICB7MSwgdW5kZWZpbmVkLCBpMzIsIGVycm9yQ29kZSwgdW5kZWZpbmVkfSwKLSAgICAgICAgezIsIHVuZGVmaW5lZCwge3N0cnVjdCwgeyd0aHJpZnRfdGVzdF90eXBlcycsICdYdHJ1Y3QnfX0sIHN0cnVjdF90aGluZywgIydYdHJ1Y3Qne319Ci0gICAgICBdfSwKLSAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgnWGNlcHRpb24yJykKLSAgICApfSwKLSAgICB7IkVtcHR5U3RydWN0IGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgW119LAotICAgICAgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCdFbXB0eVN0cnVjdCcpCi0gICAgKX0sCi0gICAgeyJPbmVGaWVsZCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFsKLSAgICAgICAgezEsIHVuZGVmaW5lZCwge3N0cnVjdCwgeyd0aHJpZnRfdGVzdF90eXBlcycsICdFbXB0eVN0cnVjdCd9fSwgZmllbGQsICMnRW1wdHlTdHJ1Y3Qne319Ci0gICAgICBdfSwKLSAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgnT25lRmllbGQnKQotICAgICl9LAotICAgIHsiVmVyc2lvbmluZ1Rlc3RWMSBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFsKLSAgICAgICAgezEsIHVuZGVmaW5lZCwgaTMyLCBiZWdpbl9pbl9ib3RoLCB1bmRlZmluZWR9LAotICAgICAgICB7MywgdW5kZWZpbmVkLCBzdHJpbmcsIG9sZF9zdHJpbmcsIHVuZGVmaW5lZH0sCi0gICAgICAgIHsxMiwgdW5kZWZpbmVkLCBpMzIsIGVuZF9pbl9ib3RoLCB1bmRlZmluZWR9Ci0gICAgICBdfSwKLSAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgnVmVyc2lvbmluZ1Rlc3RWMScpCi0gICAgKX0sCi0gICAgeyJWZXJzaW9uaW5nVGVzdFYyIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgWwotICAgICAgICB7MSwgdW5kZWZpbmVkLCBpMzIsIGJlZ2luX2luX2JvdGgsIHVuZGVmaW5lZH0sCi0gICAgICAgIHsyLCB1bmRlZmluZWQsIGkzMiwgbmV3aW50LCB1bmRlZmluZWR9LAotICAgICAgICB7MywgdW5kZWZpbmVkLCBieXRlLCBuZXdieXRlLCB1bmRlZmluZWR9LAotICAgICAgICB7NCwgdW5kZWZpbmVkLCBpMTYsIG5ld3Nob3J0LCB1bmRlZmluZWR9LAotICAgICAgICB7NSwgdW5kZWZpbmVkLCBpNjQsIG5ld2xvbmcsIHVuZGVmaW5lZH0sCi0gICAgICAgIHs2LCB1bmRlZmluZWQsIGRvdWJsZSwgbmV3ZG91YmxlLCB1bmRlZmluZWR9LAotICAgICAgICB7NywgdW5kZWZpbmVkLCB7c3RydWN0LCB7dGhyaWZ0X3Rlc3RfdHlwZXMsICdCb25rJ319LCBuZXdzdHJ1Y3QsICMnQm9uayd7fX0sCi0gICAgICAgIHs4LCB1bmRlZmluZWQsIHtsaXN0LCBpMzJ9LCBuZXdsaXN0LCBbXX0sCi0gICAgICAgIHs5LCB1bmRlZmluZWQsIHtzZXQsIGkzMn0sIG5ld3NldCwgc2V0czpuZXcoKX0sCi0gICAgICAgIHsxMCwgdW5kZWZpbmVkLCB7bWFwLCBpMzIsIGkzMn0sIG5ld21hcCwgZGljdDpuZXcoKX0sCi0gICAgICAgIHsxMSwgdW5kZWZpbmVkLCBzdHJpbmcsIG5ld3N0cmluZywgdW5kZWZpbmVkfSwKLSAgICAgICAgezEyLCB1bmRlZmluZWQsIGkzMiwgZW5kX2luX2JvdGgsIHVuZGVmaW5lZH0KLSAgICAgIF19LAotICAgICAgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCdWZXJzaW9uaW5nVGVzdFYyJykKLSAgICApfSwKLSAgICB7Ikxpc3RUeXBlVmVyc2lvbmluZ1YxIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgWwotICAgICAgICB7MSwgdW5kZWZpbmVkLCB7bGlzdCwgaTMyfSwgbXlpbnRzLCBbXX0sCi0gICAgICAgIHsyLCB1bmRlZmluZWQsIHN0cmluZywgaGVsbG8sIHVuZGVmaW5lZH0KLSAgICAgIF19LAotICAgICAgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCdMaXN0VHlwZVZlcnNpb25pbmdWMScpCi0gICAgKX0sCi0gICAgeyJMaXN0VHlwZVZlcnNpb25pbmdWMiBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFsKLSAgICAgICAgezEsIHVuZGVmaW5lZCwge2xpc3QsIHN0cmluZ30sIHN0cmluZ3MsIFtdfSwKLSAgICAgICAgezIsIHVuZGVmaW5lZCwgc3RyaW5nLCBoZWxsbywgdW5kZWZpbmVkfQotICAgICAgXX0sCi0gICAgICB0aHJpZnRfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ0xpc3RUeXBlVmVyc2lvbmluZ1YyJykKLSAgICApfSwKLSAgICB7Ikd1ZXNzUHJvdG9jb2xTdHJ1Y3QgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbCi0gICAgICAgIHs3LCB1bmRlZmluZWQsIHttYXAsIHN0cmluZywgc3RyaW5nfSwgbWFwX2ZpZWxkLCBkaWN0Om5ldygpfQotICAgICAgXX0sCi0gICAgICB0aHJpZnRfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ0d1ZXNzUHJvdG9jb2xTdHJ1Y3QnKQotICAgICl9LAotICAgIHsiTGFyZ2VEZWx0YXMgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbCi0gICAgICAgIHsxLCB1bmRlZmluZWQsIHtzdHJ1Y3QsIHt0aHJpZnRfdGVzdF90eXBlcywgJ0Jvb2xzJ319LCBiMSwgIydCb29scyd7fX0sCi0gICAgICAgIHsxMCwgdW5kZWZpbmVkLCB7c3RydWN0LCB7dGhyaWZ0X3Rlc3RfdHlwZXMsICdCb29scyd9fSwgYjEwLCAjJ0Jvb2xzJ3t9fSwKLSAgICAgICAgezEwMCwgdW5kZWZpbmVkLCB7c3RydWN0LCB7dGhyaWZ0X3Rlc3RfdHlwZXMsICdCb29scyd9fSwgYjEwMCwgIydCb29scyd7fX0sCi0gICAgICAgIHs1MDAsIHVuZGVmaW5lZCwgYm9vbCwgY2hlY2tfdHJ1ZSwgdW5kZWZpbmVkfSwKLSAgICAgICAgezEwMDAsIHVuZGVmaW5lZCwge3N0cnVjdCwge3RocmlmdF90ZXN0X3R5cGVzLCAnQm9vbHMnfX0sIGIxMDAwLCAjJ0Jvb2xzJ3t9fSwKLSAgICAgICAgezE1MDAsIHVuZGVmaW5lZCwgYm9vbCwgY2hlY2tfZmFsc2UsIHVuZGVmaW5lZH0sCi0gICAgICAgIHsyMDAwLCB1bmRlZmluZWQsIHtzdHJ1Y3QsIHt0aHJpZnRfdGVzdF90eXBlcywgJ1ZlcnNpb25pbmdUZXN0VjInfX0sIHZlcnR3bzIwMDAsICMnVmVyc2lvbmluZ1Rlc3RWMid7fX0sCi0gICAgICAgIHsyNTAwLCB1bmRlZmluZWQsIHtzZXQsIHN0cmluZ30sIGFfc2V0MjUwMCwgc2V0czpuZXcoKX0sCi0gICAgICAgIHszMDAwLCB1bmRlZmluZWQsIHtzdHJ1Y3QsIHt0aHJpZnRfdGVzdF90eXBlcywgJ1ZlcnNpb25pbmdUZXN0VjInfX0sIHZlcnR3bzMwMDAsICMnVmVyc2lvbmluZ1Rlc3RWMid7fX0sCi0gICAgICAgIHs0MDAwLCB1bmRlZmluZWQsIHtsaXN0LCBpMzJ9LCBiaWdfbnVtYmVycywgW119Ci0gICAgICBdfSwKLSAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgnTGFyZ2VEZWx0YXMnKQotICAgICl9LAotICAgIHsiTmVzdGVkTGlzdHNJMzJ4MiBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFsKLSAgICAgICAgezEsIHVuZGVmaW5lZCwge2xpc3QsIHtsaXN0LCBpMzJ9fSwgaW50ZWdlcmxpc3QsIFtdfQotICAgICAgXX0sCi0gICAgICB0aHJpZnRfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ05lc3RlZExpc3RzSTMyeDInKQotICAgICl9LAotICAgIHsiTmVzdGVkTGlzdHNJMzJ4MyBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFsKLSAgICAgICAgezEsIHVuZGVmaW5lZCwge2xpc3QsIHtsaXN0LCB7bGlzdCwgaTMyfX19LCBpbnRlZ2VybGlzdCwgW119Ci0gICAgICBdfSwKLSAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgnTmVzdGVkTGlzdHNJMzJ4MycpCi0gICAgKX0sCi0gICAgeyJOZXN0ZWRNaXhlZHgyIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgWwotICAgICAgICB7MSwgdW5kZWZpbmVkLCB7bGlzdCwge3NldCwgaTMyfX0sIGludF9zZXRfbGlzdCwgW119LAotICAgICAgICB7MiwgdW5kZWZpbmVkLCB7bWFwLCBpMzIsIHtzZXQsIHN0cmluZ319LCBtYXBfaW50X3N0cnNldCwgZGljdDpuZXcoKX0sCi0gICAgICAgIHszLCB1bmRlZmluZWQsIHtsaXN0LCB7bWFwLCBpMzIsIHtzZXQsIHN0cmluZ319fSwgbWFwX2ludF9zdHJzZXRfbGlzdCwgW119Ci0gICAgICBdfSwKLSAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgnTmVzdGVkTWl4ZWR4MicpCi0gICAgKX0sCi0gICAgeyJMaXN0Qm9ua3MgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbCi0gICAgICAgIHsxLCB1bmRlZmluZWQsIHtsaXN0LCB7c3RydWN0LCB7dGhyaWZ0X3Rlc3RfdHlwZXMsICdCb25rJ319fSwgYm9uaywgW119Ci0gICAgICBdfSwKLSAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgnTGlzdEJvbmtzJykKLSAgICApfSwKLSAgICB7Ik5lc3RlZExpc3RzQm9uayBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFsKLSAgICAgICAgezEsIHVuZGVmaW5lZCwge2xpc3QsIHtsaXN0LCB7bGlzdCwge3N0cnVjdCwge3RocmlmdF90ZXN0X3R5cGVzLCAnQm9uayd9fX19fSwgYm9uaywgW119Ci0gICAgICBdfSwKLSAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgnTmVzdGVkTGlzdHNCb25rJykKLSAgICApfSwKLSAgICB7IkJvb2xUZXN0IGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgWwotICAgICAgICB7MSwgb3B0aW9uYWwsIGJvb2wsIGIsIHRydWV9LAotICAgICAgICB7Miwgb3B0aW9uYWwsIHN0cmluZywgcywgInRydWUifQotICAgICAgXX0sCi0gICAgICB0aHJpZnRfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ0Jvb2xUZXN0JykKLSAgICApfSwKLSAgICB7IlN0cnVjdEEgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbezEsIHJlcXVpcmVkLCBzdHJpbmcsIHMsIHVuZGVmaW5lZH1dfSwKLSAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgnU3RydWN0QScpCi0gICAgKX0sCi0gICAgeyJTdHJ1Y3RCIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgWwotICAgICAgICB7MSwgb3B0aW9uYWwsIHtzdHJ1Y3QsIHt0aHJpZnRfdGVzdF90eXBlcywgJ1N0cnVjdEEnfX0sIGFhLCAjJ1N0cnVjdEEne319LAotICAgICAgICB7MiwgcmVxdWlyZWQsIHtzdHJ1Y3QsIHt0aHJpZnRfdGVzdF90eXBlcywgJ1N0cnVjdEEnfX0sIGFiLCAjJ1N0cnVjdEEne319Ci0gICAgICBdfSwKLSAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgnU3RydWN0QicpCi0gICAgKX0KLSAgXS4KLQotc2VydmljZV9pbmZvX3Rlc3RfKCkgLT4KLSAgWwotICAgIHsidGVzdFZvaWQgcGFyYW1zIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFtdfSwKLSAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RWb2lkLCBwYXJhbXNfdHlwZSkKLSAgICApfSwKLSAgICB7InRlc3RWb2lkIHJlcGx5IiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFtdfSwKLSAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RWb2lkLCByZXBseV90eXBlKQotICAgICl9LAotICAgIHsidGVzdFZvaWQgZXhjZXB0aW9ucyIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbXX0sCi0gICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0Vm9pZCwgZXhjZXB0aW9ucykKLSAgICApfSwKLSAgICB7InRlc3RTdHJpbmcgcGFyYW1zIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFt7MSwgc3RyaW5nfV19LAotICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdFN0cmluZywgcGFyYW1zX3R5cGUpCi0gICAgKX0sCi0gICAgeyJ0ZXN0U3RyaW5nIHJlcGx5IiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHN0cmluZywKLSAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RTdHJpbmcsIHJlcGx5X3R5cGUpCi0gICAgKX0sCi0gICAgeyJ0ZXN0U3RyaW5nIGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgW119LAotICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdFN0cmluZywgZXhjZXB0aW9ucykKLSAgICApfSwKLSAgICB7InRlc3RCeXRlIHBhcmFtcyIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbezEsIGJ5dGV9XX0sCi0gICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0Qnl0ZSwgcGFyYW1zX3R5cGUpCi0gICAgKX0sCi0gICAgeyJ0ZXN0Qnl0ZSByZXBseSIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICBieXRlLAotICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdEJ5dGUsIHJlcGx5X3R5cGUpCi0gICAgKX0sCi0gICAgeyJ0ZXN0Qnl0ZSBleGNlcHRpb25zIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFtdfSwKLSAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RCeXRlLCBleGNlcHRpb25zKQotICAgICl9LAotICAgIHsidGVzdEkzMiBwYXJhbXMiLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgW3sxLCBpMzJ9XX0sCi0gICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0STMyLCBwYXJhbXNfdHlwZSkKLSAgICApfSwKLSAgICB7InRlc3RJMzIgcmVwbHkiLCA/X2Fzc2VydEVxdWFsKAotICAgICAgaTMyLAotICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdEkzMiwgcmVwbHlfdHlwZSkKLSAgICApfSwKLSAgICB7InRlc3RJMzIgZXhjZXB0aW9ucyIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbXX0sCi0gICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0STMyLCBleGNlcHRpb25zKQotICAgICl9LAotICAgIHsidGVzdEk2NCBwYXJhbXMiLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgW3sxLCBpNjR9XX0sCi0gICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0STY0LCBwYXJhbXNfdHlwZSkKLSAgICApfSwKLSAgICB7InRlc3RJNjQgcmVwbHkiLCA/X2Fzc2VydEVxdWFsKAotICAgICAgaTY0LAotICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdEk2NCwgcmVwbHlfdHlwZSkKLSAgICApfSwKLSAgICB7InRlc3RJNjQgZXhjZXB0aW9ucyIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbXX0sCi0gICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0STY0LCBleGNlcHRpb25zKQotICAgICl9LAotICAgIHsidGVzdERvdWJsZSBwYXJhbXMiLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgW3sxLCBkb3VibGV9XX0sCi0gICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0RG91YmxlLCBwYXJhbXNfdHlwZSkKLSAgICApfSwKLSAgICB7InRlc3REb3VibGUgcmVwbHkiLCA/X2Fzc2VydEVxdWFsKAotICAgICAgZG91YmxlLAotICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdERvdWJsZSwgcmVwbHlfdHlwZSkKLSAgICApfSwKLSAgICB7InRlc3REb3VibGUgZXhjZXB0aW9ucyIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbXX0sCi0gICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0RG91YmxlLCBleGNlcHRpb25zKQotICAgICl9LAotICAgIHsidGVzdFN0cnVjdCBwYXJhbXMiLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgWwotICAgICAgICB7MSwge3N0cnVjdCwge3RocmlmdF90ZXN0X3R5cGVzLCAnWHRydWN0J319fQotICAgICAgXX0sCi0gICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0U3RydWN0LCBwYXJhbXNfdHlwZSkKLSAgICApfSwKLSAgICB7InRlc3RTdHJ1Y3QgcmVwbHkiLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwge3RocmlmdF90ZXN0X3R5cGVzLCAnWHRydWN0J319LAotICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdFN0cnVjdCwgcmVwbHlfdHlwZSkKLSAgICApfSwKLSAgICB7InRlc3RTdHJ1Y3QgZXhjZXB0aW9ucyIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbXX0sCi0gICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0U3RydWN0LCBleGNlcHRpb25zKQotICAgICl9LAotICAgIHsidGVzdE5lc3QgcGFyYW1zIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFsKLSAgICAgICAgezEsIHtzdHJ1Y3QsIHt0aHJpZnRfdGVzdF90eXBlcywgJ1h0cnVjdDInfX19Ci0gICAgICBdfSwKLSAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3ROZXN0LCBwYXJhbXNfdHlwZSkKLSAgICApfSwKLSAgICB7InRlc3ROZXN0IHJlcGx5IiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIHt0aHJpZnRfdGVzdF90eXBlcywgJ1h0cnVjdDInfX0sCi0gICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0TmVzdCwgcmVwbHlfdHlwZSkKLSAgICApfSwKLSAgICB7InRlc3ROZXN0IGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgW119LAotICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdE5lc3QsIGV4Y2VwdGlvbnMpCi0gICAgKX0sCi0gICAgeyJ0ZXN0TWFwIHBhcmFtcyIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbCi0gICAgICAgIHsxLCB7bWFwLCBpMzIsIGkzMn19Ci0gICAgICBdfSwKLSAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RNYXAsIHBhcmFtc190eXBlKQotICAgICl9LAotICAgIHsidGVzdE1hcCByZXBseSIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7bWFwLCBpMzIsIGkzMn0sCi0gICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0TWFwLCByZXBseV90eXBlKQotICAgICl9LAotICAgIHsidGVzdE1hcCBleGNlcHRpb25zIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFtdfSwKLSAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RNYXAsIGV4Y2VwdGlvbnMpCi0gICAgKX0sCi0gICAgeyJ0ZXN0U3RyaW5nTWFwIHBhcmFtcyIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbCi0gICAgICAgIHsxLCB7bWFwLCBzdHJpbmcsIHN0cmluZ319Ci0gICAgICBdfSwKLSAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RTdHJpbmdNYXAsIHBhcmFtc190eXBlKQotICAgICl9LAotICAgIHsidGVzdFN0cmluZ01hcCByZXBseSIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7bWFwLCBzdHJpbmcsIHN0cmluZ30sCi0gICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0U3RyaW5nTWFwLCByZXBseV90eXBlKQotICAgICl9LAotICAgIHsidGVzdFN0cmluZ01hcCBleGNlcHRpb25zIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFtdfSwKLSAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RTdHJpbmdNYXAsIGV4Y2VwdGlvbnMpCi0gICAgKX0sCi0gICAgeyJ0ZXN0U2V0IHBhcmFtcyIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbCi0gICAgICAgIHsxLCB7c2V0LCBpMzJ9fQotICAgICAgXX0sCi0gICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0U2V0LCBwYXJhbXNfdHlwZSkKLSAgICApfSwKLSAgICB7InRlc3RTZXQgcmVwbHkiLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3NldCwgaTMyfSwKLSAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RTZXQsIHJlcGx5X3R5cGUpCi0gICAgKX0sCi0gICAgeyJ0ZXN0U2V0IGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgW119LAotICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdFNldCwgZXhjZXB0aW9ucykKLSAgICApfSwKLSAgICB7InRlc3RMaXN0IHBhcmFtcyIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbCi0gICAgICAgIHsxLCB7bGlzdCwgaTMyfX0KLSAgICAgIF19LAotICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdExpc3QsIHBhcmFtc190eXBlKQotICAgICl9LAotICAgIHsidGVzdExpc3QgcmVwbHkiLCA/X2Fzc2VydEVxdWFsKAotICAgICAge2xpc3QsIGkzMn0sCi0gICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0TGlzdCwgcmVwbHlfdHlwZSkKLSAgICApfSwKLSAgICB7InRlc3RMaXN0IGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgW119LAotICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdExpc3QsIGV4Y2VwdGlvbnMpCi0gICAgKX0sCi0gICAgeyJ0ZXN0RW51bSBwYXJhbXMiLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgWwotICAgICAgICB7MSwgaTMyfQotICAgICAgXX0sCi0gICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0RW51bSwgcGFyYW1zX3R5cGUpCi0gICAgKX0sCi0gICAgeyJ0ZXN0RW51bSByZXBseSIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICBpMzIsCi0gICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0RW51bSwgcmVwbHlfdHlwZSkKLSAgICApfSwKLSAgICB7InRlc3RFbnVtIGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgW119LAotICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdEVudW0sIGV4Y2VwdGlvbnMpCi0gICAgKX0sCi0gICAgeyJ0ZXN0VHlwZWRlZiBwYXJhbXMiLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgW3sxLCBpNjR9XX0sCi0gICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0VHlwZWRlZiwgcGFyYW1zX3R5cGUpCi0gICAgKX0sCi0gICAgeyJ0ZXN0VHlwZWRlZiByZXBseSIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICBpNjQsCi0gICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0VHlwZWRlZiwgcmVwbHlfdHlwZSkKLSAgICApfSwKLSAgICB7InRlc3RUeXBlZGVmIGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgW119LAotICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdFR5cGVkZWYsIGV4Y2VwdGlvbnMpCi0gICAgKX0sCi0gICAgeyJ0ZXN0TWFwTWFwIHBhcmFtcyIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbCi0gICAgICAgIHsxLCBpMzJ9Ci0gICAgICBdfSwKLSAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RNYXBNYXAsIHBhcmFtc190eXBlKQotICAgICl9LAotICAgIHsidGVzdE1hcE1hcCByZXBseSIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7bWFwLCBpMzIsIHttYXAsIGkzMixpMzJ9fSwKLSAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RNYXBNYXAsIHJlcGx5X3R5cGUpCi0gICAgKX0sCi0gICAgeyJ0ZXN0TWFwTWFwIGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgW119LAotICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdE1hcE1hcCwgZXhjZXB0aW9ucykKLSAgICApfSwKLSAgICB7InRlc3RJbnNhbml0eSBwYXJhbXMiLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgWwotICAgICAgICB7MSwge3N0cnVjdCwge3RocmlmdF90ZXN0X3R5cGVzLCAnSW5zYW5pdHknfX19Ci0gICAgICBdfSwKLSAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RJbnNhbml0eSwgcGFyYW1zX3R5cGUpCi0gICAgKX0sCi0gICAgeyJ0ZXN0SW5zYW5pdHkgcmVwbHkiLCA/X2Fzc2VydEVxdWFsKAotICAgICAge21hcCwgaTY0LCB7bWFwLCBpMzIsIHtzdHJ1Y3QsIHsndGhyaWZ0X3Rlc3RfdHlwZXMnLCAnSW5zYW5pdHknfX19fSwKLSAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RJbnNhbml0eSwgcmVwbHlfdHlwZSkKLSAgICApfSwKLSAgICB7InRlc3RJbnNhbml0eSBleGNlcHRpb25zIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFtdfSwKLSAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RJbnNhbml0eSwgZXhjZXB0aW9ucykKLSAgICApfSwKLSAgICB7InRlc3RNdWx0aSBwYXJhbXMiLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgWwotICAgICAgICB7MSwgYnl0ZX0sCi0gICAgICAgIHsyLCBpMzJ9LAotICAgICAgICB7MywgaTY0fSwKLSAgICAgICAgezQsIHttYXAsIGkxNiwgc3RyaW5nfX0sCi0gICAgICAgIHs1LCBpMzJ9LAotICAgICAgICB7NiwgaTY0fQotICAgICAgXX0sCi0gICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0TXVsdGksIHBhcmFtc190eXBlKQotICAgICl9LAotICAgIHsidGVzdE11bHRpIHJlcGx5IiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIHt0aHJpZnRfdGVzdF90eXBlcywgJ1h0cnVjdCd9fSwKLSAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RNdWx0aSwgcmVwbHlfdHlwZSkKLSAgICApfSwKLSAgICB7InRlc3RNdWx0aSBleGNlcHRpb25zIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFtdfSwKLSAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RNdWx0aSwgZXhjZXB0aW9ucykKLSAgICApfSwKLSAgICB7InRlc3RFeGNlcHRpb24gcGFyYW1zIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFt7MSwgc3RyaW5nfV19LAotICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdEV4Y2VwdGlvbiwgcGFyYW1zX3R5cGUpCi0gICAgKX0sCi0gICAgeyJ0ZXN0RXhjZXB0aW9uIHJlcGx5IiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFtdfSwKLSAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RFeGNlcHRpb24sIHJlcGx5X3R5cGUpCi0gICAgKX0sCi0gICAgeyJ0ZXN0RXhjZXB0aW9uIGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgWwotICAgICAgICB7MSwge3N0cnVjdCwge3RocmlmdF90ZXN0X3R5cGVzLCAnWGNlcHRpb24nfX19Ci0gICAgICBdfSwKLSAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RFeGNlcHRpb24sIGV4Y2VwdGlvbnMpCi0gICAgKX0sCi0gICAgeyJ0ZXN0TXVsdGlFeGNlcHRpb24gcGFyYW1zIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFt7MSwgc3RyaW5nfSwgezIsIHN0cmluZ31dfSwKLSAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RNdWx0aUV4Y2VwdGlvbiwgcGFyYW1zX3R5cGUpCi0gICAgKX0sCi0gICAgeyJ0ZXN0TXVsdGlFeGNlcHRpb24gcmVwbHkiLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwge3RocmlmdF90ZXN0X3R5cGVzLCAnWHRydWN0J319LAotICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdE11bHRpRXhjZXB0aW9uLCByZXBseV90eXBlKQotICAgICl9LAotICAgIHsidGVzdE11bHRpRXhjZXB0aW9uIGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgWwotICAgICAgICB7MSwge3N0cnVjdCwge3RocmlmdF90ZXN0X3R5cGVzLCAnWGNlcHRpb24nfX19LAotICAgICAgICB7Miwge3N0cnVjdCwge3RocmlmdF90ZXN0X3R5cGVzLCAnWGNlcHRpb24yJ319fQotICAgICAgXX0sCi0gICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0TXVsdGlFeGNlcHRpb24sIGV4Y2VwdGlvbnMpCi0gICAgKX0sCi0gICAgeyJ0ZXN0T25ld2F5IHBhcmFtcyIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbezEsIGkzMn1dfSwKLSAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RPbmV3YXksIHBhcmFtc190eXBlKQotICAgICl9LAotICAgIHsidGVzdE9uZXdheSByZXBseSIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICBvbmV3YXlfdm9pZCwKLSAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RPbmV3YXksIHJlcGx5X3R5cGUpCi0gICAgKX0sCi0gICAgeyJ0ZXN0T25ld2F5IGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgW119LAotICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdE9uZXdheSwgZXhjZXB0aW9ucykKLSAgICApfSwKLSAgICB7ImJsYWhCbGFoIHBhcmFtcyIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbXX0sCi0gICAgICBzZWNvbmRfc2VydmljZV90aHJpZnQ6ZnVuY3Rpb25faW5mbyhibGFoQmxhaCwgcGFyYW1zX3R5cGUpCi0gICAgKX0sCi0gICAgeyJibGFoQmxhaCByZXBseSIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbXX0sCi0gICAgICBzZWNvbmRfc2VydmljZV90aHJpZnQ6ZnVuY3Rpb25faW5mbyhibGFoQmxhaCwgcmVwbHlfdHlwZSkKLSAgICApfSwKLSAgICB7ImJsYWhCbGFoIGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgW119LAotICAgICAgc2Vjb25kX3NlcnZpY2VfdGhyaWZ0OmZ1bmN0aW9uX2luZm8oYmxhaEJsYWgsIGV4Y2VwdGlvbnMpCi0gICAgKX0sCi0gICAgeyJzZWNvbmR0ZXN0U3RyaW5nIHBhcmFtcyIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbezEsIHN0cmluZ31dfSwKLSAgICAgIHNlY29uZF9zZXJ2aWNlX3RocmlmdDpmdW5jdGlvbl9pbmZvKHNlY29uZHRlc3RTdHJpbmcsIHBhcmFtc190eXBlKQotICAgICl9LAotICAgIHsic2Vjb25kdGVzdFN0cmluZyByZXBseSIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICBzdHJpbmcsCi0gICAgICBzZWNvbmRfc2VydmljZV90aHJpZnQ6ZnVuY3Rpb25faW5mbyhzZWNvbmR0ZXN0U3RyaW5nLCByZXBseV90eXBlKQotICAgICl9LAotICAgIHsic2Vjb25kdGVzdFN0cmluZyBleGNlcHRpb25zIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFtdfSwKLSAgICAgIHNlY29uZF9zZXJ2aWNlX3RocmlmdDpmdW5jdGlvbl9pbmZvKHNlY29uZHRlc3RTdHJpbmcsIGV4Y2VwdGlvbnMpCi0gICAgKX0KLSAgXS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2ZlYXR1cmVzL01ha2VmaWxlLmFtIGIvdGVzdC9mZWF0dXJlcy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzdkNzg5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9mZWF0dXJlcy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDMwIEBACisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK0VYVFJBX0RJU1QgPSBcCisJbG9jYWxfdGhyaWZ0IFwKKwlpbmRleC5odG1sIFwKKwljb250YWluZXJfbGltaXQucHkgXAorCWluZGV4Lmh0bWwgXAorCWtub3duX2ZhaWx1cmVzX0xpbnV4Lmpzb24gXAorCU1ha2VmaWxlLmFtIFwKKyAgICAgICAgbm9zc2x2My5zaCBcCisJc3RyaW5nX2xpbWl0LnB5IFwKKwl0ZXN0cy5qc29uIFwKKwl0aGVhZGVyX2JpbmFyeS5weSBcCisJc2V0dXAuY2ZnIFwKKyAgICAgICAgdGxzLnNoIFwKKwl1dGlsLnB5CmRpZmYgLS1naXQgYS90ZXN0L2ZlYXR1cmVzL2NvbnRhaW5lcl9saW1pdC5weSBiL3Rlc3QvZmVhdHVyZXMvY29udGFpbmVyX2xpbWl0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4Zjg0ODcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2ZlYXR1cmVzL2NvbnRhaW5lcl9saW1pdC5weQpAQCAtMCwwICsxLDcyIEBACisjIS91c3IvYmluL2VudiBweXRob24KKworaW1wb3J0IGFyZ3BhcnNlCitpbXBvcnQgc3lzCisKK2Zyb20gdXRpbCBpbXBvcnQgYWRkX2NvbW1vbl9hcmdzLCBpbml0X3Byb3RvY29sCitmcm9tIGxvY2FsX3RocmlmdCBpbXBvcnQgdGhyaWZ0ICAjIG5vcWEKK2Zyb20gdGhyaWZ0LlRocmlmdCBpbXBvcnQgVE1lc3NhZ2VUeXBlLCBUVHlwZQorCisKKyMgVE9ETzogZ2VuZXJhdGUgZnJvbSBUaHJpZnRUZXN0LnRocmlmdAorZGVmIHRlc3RfbGlzdChwcm90bywgdmFsdWUpOgorICAgIG1ldGhvZF9uYW1lID0gJ3Rlc3RMaXN0JworICAgIHR0eXBlID0gVFR5cGUuTElTVAorICAgIGV0eXBlID0gVFR5cGUuSTMyCisgICAgcHJvdG8ud3JpdGVNZXNzYWdlQmVnaW4obWV0aG9kX25hbWUsIFRNZXNzYWdlVHlwZS5DQUxMLCAzKQorICAgIHByb3RvLndyaXRlU3RydWN0QmVnaW4obWV0aG9kX25hbWUgKyAnX2FyZ3MnKQorICAgIHByb3RvLndyaXRlRmllbGRCZWdpbigndGhpbmcnLCB0dHlwZSwgMSkKKyAgICBwcm90by53cml0ZUxpc3RCZWdpbihldHlwZSwgbGVuKHZhbHVlKSkKKyAgICBmb3IgZSBpbiB2YWx1ZToKKyAgICAgICAgcHJvdG8ud3JpdGVJMzIoZSkKKyAgICBwcm90by53cml0ZUxpc3RFbmQoKQorICAgIHByb3RvLndyaXRlRmllbGRFbmQoKQorICAgIHByb3RvLndyaXRlRmllbGRTdG9wKCkKKyAgICBwcm90by53cml0ZVN0cnVjdEVuZCgpCisgICAgcHJvdG8ud3JpdGVNZXNzYWdlRW5kKCkKKyAgICBwcm90by50cmFucy5mbHVzaCgpCisKKyAgICBfLCBtdHlwZSwgXyA9IHByb3RvLnJlYWRNZXNzYWdlQmVnaW4oKQorICAgIGFzc2VydCBtdHlwZSA9PSBUTWVzc2FnZVR5cGUuUkVQTFkKKyAgICBwcm90by5yZWFkU3RydWN0QmVnaW4oKQorICAgIF8sIGZ0eXBlLCBmaWQgPSBwcm90by5yZWFkRmllbGRCZWdpbigpCisgICAgYXNzZXJ0IGZpZCA9PSAwCisgICAgYXNzZXJ0IGZ0eXBlID09IHR0eXBlCisgICAgZXR5cGUyLCBsZW4yID0gcHJvdG8ucmVhZExpc3RCZWdpbigpCisgICAgYXNzZXJ0IGV0eXBlID09IGV0eXBlMgorICAgIGFzc2VydCBsZW4yID09IGxlbih2YWx1ZSkKKyAgICBmb3IgaSBpbiByYW5nZShsZW4yKToKKyAgICAgICAgdiA9IHByb3RvLnJlYWRJMzIoKQorICAgICAgICBhc3NlcnQgdiA9PSB2YWx1ZVtpXQorICAgIHByb3RvLnJlYWRMaXN0RW5kKCkKKyAgICBwcm90by5yZWFkRmllbGRFbmQoKQorICAgIF8sIGZ0eXBlLCBfID0gcHJvdG8ucmVhZEZpZWxkQmVnaW4oKQorICAgIGFzc2VydCBmdHlwZSA9PSBUVHlwZS5TVE9QCisgICAgcHJvdG8ucmVhZFN0cnVjdEVuZCgpCisgICAgcHJvdG8ucmVhZE1lc3NhZ2VFbmQoKQorCisKK2RlZiBtYWluKGFyZ3YpOgorICAgIHAgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigpCisgICAgYWRkX2NvbW1vbl9hcmdzKHApCisgICAgcC5hZGRfYXJndW1lbnQoJy0tbGltaXQnLCB0eXBlPWludCkKKyAgICBhcmdzID0gcC5wYXJzZV9hcmdzKCkKKyAgICBwcm90byA9IGluaXRfcHJvdG9jb2woYXJncykKKyAgICAjIFRPRE86IHRlc3Qgc2V0IGFuZCBtYXAKKyAgICB0ZXN0X2xpc3QocHJvdG8sIGxpc3QocmFuZ2UoYXJncy5saW1pdCAtIDEpKSkKKyAgICB0ZXN0X2xpc3QocHJvdG8sIGxpc3QocmFuZ2UoYXJncy5saW1pdCAtIDEpKSkKKyAgICBwcmludCgnW09LXTogbGltaXQgLSAxJykKKyAgICB0ZXN0X2xpc3QocHJvdG8sIGxpc3QocmFuZ2UoYXJncy5saW1pdCkpKQorICAgIHRlc3RfbGlzdChwcm90bywgbGlzdChyYW5nZShhcmdzLmxpbWl0KSkpCisgICAgcHJpbnQoJ1tPS106IGp1c3QgbGltaXQnKQorICAgIHRyeToKKyAgICAgICAgdGVzdF9saXN0KHByb3RvLCBsaXN0KHJhbmdlKGFyZ3MubGltaXQgKyAxKSkpCisgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgcHJpbnQoJ1tPS106IGxpbWl0ICsgMScpCisgICAgZWxzZToKKyAgICAgICAgcHJpbnQoJ1tFUlJPUl06IGxpbWl0ICsgMScpCisgICAgICAgIGFzc2VydCBGYWxzZQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgc3lzLmV4aXQobWFpbihzeXMuYXJndlsxOl0pKQpkaWZmIC0tZ2l0IGEvdGVzdC9mZWF0dXJlcy9pbmRleC5odG1sIGIvdGVzdC9mZWF0dXJlcy9pbmRleC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0YTAwMTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2ZlYXR1cmVzL2luZGV4Lmh0bWwKQEAgLTAsMCArMSw1MSBAQAorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyB1bmRlciB0aGUgTGljZW5zZS4KKworLS0+Cis8IURPQ1RZUEUgSFRNTD4KKzxodG1sPgorPGhlYWQ+Cis8bWV0YSBjaGFyc2V0PSJ1dGYtOCI+Cis8dGl0bGU+QXBhY2hlIFRocmlmdCAtIGludGVncmF0aW9uIHRlc3Qgc3VpdGU8L3RpdGxlPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iaHR0cDovL2Nkbi5kYXRhdGFibGVzLm5ldC8xLjEwLjQvY3NzL2pxdWVyeS5kYXRhVGFibGVzLmNzcyI+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiIHNyYz0iaHR0cDovL2NvZGUuanF1ZXJ5LmNvbS9qcXVlcnktMi4xLjMubWluLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCIgc3JjPSJodHRwOi8vY2RuLmRhdGF0YWJsZXMubmV0LzEuMTAuNC9qcy9qcXVlcnkuZGF0YVRhYmxlcy5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0iLi4vcmVzdWx0LmpzIj4KKzwvc2NyaXB0PgorPC9oZWFkPgorPGJvZHk+Cis8aDI+QXBhY2hlIFRocmlmdCAtIGludGVncmF0aW9uIHRlc3Qgc3VpdGU6IFJlc3VsdHM8L2gyPgorPHRhYmxlIGlkPSJ0ZXN0X3Jlc3VsdHMiIGNsYXNzPSJkaXNwbGF5Ij4KKyAgICA8dGhlYWQ+CisgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5TZXJ2ZXI8L3RoPgorICAgICAgICAgICAgPHRoPkNsaWVudDwvdGg+CisgICAgICAgICAgICA8dGg+UHJvdG9jb2w8L3RoPgorICAgICAgICAgICAgPHRoPlRyYW5zcG9ydDwvdGg+CisgICAgICAgICAgICA8dGg+UmVzdWx0IChsb2cpPC90aD4KKyAgICAgICAgICAgIDx0aD5FeHBlY3RlZDwvdGg+CisgICAgICAgIDwvdHI+CisgICAgPC90aGVhZD4KKzwvdGFibGU+Cis8aDI+VGVzdCBJbmZvcm1hdGlvbjwvaDI+Cis8cHJlIGlkPSJ0ZXN0X2luZm8iPjwvcHJlPgorCis8YSBocmVmPSJsb2ciPmJyb3dzZSByYXcgbG9nIGZpbGVzPC9hPgorCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS90ZXN0L2ZlYXR1cmVzL2tub3duX2ZhaWx1cmVzX0xpbnV4Lmpzb24gYi90ZXN0L2ZlYXR1cmVzL2tub3duX2ZhaWx1cmVzX0xpbnV4Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM3Njk2OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZmVhdHVyZXMva25vd25fZmFpbHVyZXNfTGludXguanNvbgpAQCAtMCwwICsxLDUwIEBACitbCisgICAgImNfZ2xpYi1saW1pdF9jb250YWluZXJfbGVuZ3RoX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICAgImNfZ2xpYi1saW1pdF9zdHJpbmdfbGVuZ3RoX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICAgImNsLWxpbWl0X3N0cmluZ19sZW5ndGhfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgICAiY2wtbGltaXRfY29udGFpbmVyX2xlbmd0aF9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAgICJjcHAtdGhlYWRlcl9mcmFtZWRfYmluYXJ5X211bHRpaC1oZWFkZXJfYnVmZmVyZWQtaXAiLAorICAgICJjcHAtdGhlYWRlcl9mcmFtZWRfY29tcGFjdF9tdWx0aWgtaGVhZGVyX2J1ZmZlcmVkLWlwIiwKKyAgICAiY3BwLXRoZWFkZXJfdW5mcmFtZWRfYmluYXJ5X211bHRpaC1oZWFkZXJfYnVmZmVyZWQtaXAiLAorICAgICJjcHAtdGhlYWRlcl91bmZyYW1lZF9jb21wYWN0X211bHRpaC1oZWFkZXJfYnVmZmVyZWQtaXAiLAorICAgICJjc2hhcnAtbGltaXRfY29udGFpbmVyX2xlbmd0aF9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAgICJjc2hhcnAtbGltaXRfY29udGFpbmVyX2xlbmd0aF9jb21wYWN0X2J1ZmZlcmVkLWlwIiwKKyAgICAiY3NoYXJwLWxpbWl0X3N0cmluZ19sZW5ndGhfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgICAiY3NoYXJwLWxpbWl0X3N0cmluZ19sZW5ndGhfY29tcGFjdF9idWZmZXJlZC1pcCIsCisgICAgImQtbGltaXRfY29udGFpbmVyX2xlbmd0aF9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAgICJkLWxpbWl0X2NvbnRhaW5lcl9sZW5ndGhfY29tcGFjdF9idWZmZXJlZC1pcCIsCisgICAgImQtbGltaXRfc3RyaW5nX2xlbmd0aF9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAgICJkLWxpbWl0X3N0cmluZ19sZW5ndGhfY29tcGFjdF9idWZmZXJlZC1pcCIsCisgICAgImVybC1saW1pdF9jb250YWluZXJfbGVuZ3RoX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICAgImVybC1saW1pdF9jb250YWluZXJfbGVuZ3RoX2NvbXBhY3RfYnVmZmVyZWQtaXAiLAorICAgICJlcmwtbGltaXRfc3RyaW5nX2xlbmd0aF9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAgICJlcmwtbGltaXRfc3RyaW5nX2xlbmd0aF9jb21wYWN0X2J1ZmZlcmVkLWlwIiwKKyAgICAiZ28tbGltaXRfY29udGFpbmVyX2xlbmd0aF9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAgICJnby1saW1pdF9jb250YWluZXJfbGVuZ3RoX2NvbXBhY3RfYnVmZmVyZWQtaXAiLAorICAgICJnby1saW1pdF9zdHJpbmdfbGVuZ3RoX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICAgImdvLWxpbWl0X3N0cmluZ19sZW5ndGhfY29tcGFjdF9idWZmZXJlZC1pcCIsCisgICAgImhzLWxpbWl0X2NvbnRhaW5lcl9sZW5ndGhfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgICAiaHMtbGltaXRfY29udGFpbmVyX2xlbmd0aF9jb21wYWN0X2J1ZmZlcmVkLWlwIiwKKyAgICAiaHMtbGltaXRfc3RyaW5nX2xlbmd0aF9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAgICJocy1saW1pdF9zdHJpbmdfbGVuZ3RoX2NvbXBhY3RfYnVmZmVyZWQtaXAiLAorICAgICJub2RlanMtbGltaXRfY29udGFpbmVyX2xlbmd0aF9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAgICJub2RlanMtbGltaXRfY29udGFpbmVyX2xlbmd0aF9jb21wYWN0X2J1ZmZlcmVkLWlwIiwKKyAgICAibm9kZWpzLWxpbWl0X3N0cmluZ19sZW5ndGhfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgICAibm9kZWpzLWxpbWl0X3N0cmluZ19sZW5ndGhfY29tcGFjdF9idWZmZXJlZC1pcCIsCisgICAgInBlcmwtbGltaXRfY29udGFpbmVyX2xlbmd0aF9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAgICJwZXJsLWxpbWl0X3N0cmluZ19sZW5ndGhfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgICAicmItbGltaXRfY29udGFpbmVyX2xlbmd0aF9hY2NlbC1iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAgICJyYi1saW1pdF9jb250YWluZXJfbGVuZ3RoX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICAgInJiLWxpbWl0X2NvbnRhaW5lcl9sZW5ndGhfY29tcGFjdF9idWZmZXJlZC1pcCIsCisgICAgInJiLWxpbWl0X3N0cmluZ19sZW5ndGhfYWNjZWwtYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgICAicmItbGltaXRfc3RyaW5nX2xlbmd0aF9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAgICJyYi1saW1pdF9zdHJpbmdfbGVuZ3RoX2NvbXBhY3RfYnVmZmVyZWQtaXAiLAorICAgICJycy1saW1pdF9jb250YWluZXJfbGVuZ3RoX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICAgInJzLWxpbWl0X2NvbnRhaW5lcl9sZW5ndGhfY29tcGFjdF9idWZmZXJlZC1pcCIsCisgICAgInJzLWxpbWl0X2NvbnRhaW5lcl9sZW5ndGhfbXVsdGljLWNvbXBhY3RfYnVmZmVyZWQtaXAiLAorICAgICJycy1saW1pdF9zdHJpbmdfbGVuZ3RoX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICAgInJzLWxpbWl0X3N0cmluZ19sZW5ndGhfY29tcGFjdF9idWZmZXJlZC1pcCIsCisgICAgInJzLWxpbWl0X3N0cmluZ19sZW5ndGhfbXVsdGljLWNvbXBhY3RfYnVmZmVyZWQtaXAiLAorICAgICJuZXRjb3JlLWxpbWl0X3N0cmluZ19sZW5ndGhfY29tcGFjdF9idWZmZXJlZC1pcCIsCisgICAgIm5ldGNvcmUtbGltaXRfY29udGFpbmVyX2xlbmd0aF9jb21wYWN0X2J1ZmZlcmVkLWlwIgorXQpkaWZmIC0tZ2l0IGEvdGVzdC9mZWF0dXJlcy9sb2NhbF90aHJpZnQvX19pbml0X18ucHkgYi90ZXN0L2ZlYXR1cmVzL2xvY2FsX3RocmlmdC9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODVjZWJlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9mZWF0dXJlcy9sb2NhbF90aHJpZnQvX19pbml0X18ucHkKQEAgLTAsMCArMSwzMiBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2ltcG9ydCBnbG9iCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKKworX1NDUklQVF9ESVIgPSBvcy5wYXRoLnJlYWxwYXRoKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykpCitfUk9PVF9ESVIgPSBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5kaXJuYW1lKG9zLnBhdGguZGlybmFtZShfU0NSSVBUX0RJUikpKQorX0xJQkRJUiA9IG9zLnBhdGguam9pbihfUk9PVF9ESVIsICdsaWInLCAncHknLCAnYnVpbGQnLCAnbGliLionKQorCitmb3IgbGlicGF0aCBpbiBnbG9iLmdsb2IoX0xJQkRJUik6CisgICAgaWYgbGlicGF0aC5lbmRzd2l0aCgnLSVkLiVkJyAlIChzeXMudmVyc2lvbl9pbmZvWzBdLCBzeXMudmVyc2lvbl9pbmZvWzFdKSk6CisgICAgICAgIHN5cy5wYXRoLmluc2VydCgwLCBsaWJwYXRoKQorICAgICAgICB0aHJpZnQgPSBfX2ltcG9ydF9fKCd0aHJpZnQnKQorICAgICAgICBicmVhawpkaWZmIC0tZ2l0IGEvdGVzdC9mZWF0dXJlcy9ub3NzbHYzLnNoIGIvdGVzdC9mZWF0dXJlcy9ub3NzbHYzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjM4Y2NhMDcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2ZlYXR1cmVzL25vc3NsdjMuc2gKQEAgLTAsMCArMSw1OSBAQAorIyEvYmluL2Jhc2gKKworIworIyBDaGVja3MgdG8gbWFrZSBzdXJlIFNTTHYzIGlzIG5vdCBhbGxvd2VkIGJ5IGEgc2VydmVyLgorIworCitUSFJJRlRIT1NUPWxvY2FsaG9zdAorVEhSSUZUUE9SVD05MDkwCisKK3doaWxlIFtbICQjIC1nZSAxIF1dOyBkbworICBhcmc9IiQxIgorICBhcmdJTj0oJHthcmcvLz0vIH0pCisKKyAgY2FzZSAke2FyZ0lOWzBdfSBpbgorICAgIC1ofC0taG9zdCkKKyAgICBUSFJJRlRIT1NUPSR7YXJnSU5bMV19CisgICAgc2hpZnQgIyBwYXN0IGFyZ3VtZW50CisgICAgOzsKKyAgICAtcHwtLXBvcnQpCisgICAgVEhSSUZUUE9SVD0ke2FyZ0lOWzFdfQorICAgIHNoaWZ0ICMgcGFzdCBhcmd1bWVudAorICAgIDs7CisgICAgKikKKyAgICAgICAgICAjIHVua25vd24gb3B0aW9uIGlnbm9yZWQKKyAgICA7OworICBlc2FjCisKKyAgc2hpZnQgICAjIHBhc3QgYXJndW1lbnQgb3IgdmFsdWUKK2RvbmUKKworZnVuY3Rpb24gbm9zc2x2MworeworICBsb2NhbCBuZWdvCisgIGxvY2FsIG5lZ29kZW5pZWQKKyAgbG9jYWwgb3BlbnNzbHYKKworICBvcGVuc3Nsdj0kKG9wZW5zc2wgdmVyc2lvbiB8IGN1dCAtZCcgJyAtZjIpCisgIGlmIFtbICRvcGVuc3NsdiA+ICIxLjAiIF1dOyB0aGVuCisgICAgZWNobyAiW3Bhc3NdIE9wZW5TU0wgMS4xIG9yIGxhdGVyIC0gbm8gbmVlZCB0byBjaGVjayBzc2wzIgorICAgIHJldHVybiAwCisgIGZpCisKKyAgIyBlY2hvICJvcGVuc3NsIHNfY2xpZW50IC1jb25uZWN0ICRUSFJJRlRIT1NUOiRUSFJJRlRQT1JUIC1DQWZpbGUgLi4va2V5cy9DQS5wZW0gLXNzbDMgMj4mMSA8IC9kZXYvbnVsbCIKKyAgbmVnbz0kKG9wZW5zc2wgc19jbGllbnQgLWNvbm5lY3QgJFRIUklGVEhPU1Q6JFRIUklGVFBPUlQgLUNBZmlsZSAuLi9rZXlzL0NBLnBlbSAtc3NsMyAyPiYxIDwgL2Rldi9udWxsKQorICBuZWdvZGVuaWVkPSQ/CisKKyAgaWYgW1sgJG5lZ29kZW5pZWQgLW5lIDAgXV07IHRoZW4KKyAgICBlY2hvICJbcGFzc10gU1NMdjMgbmVnb3RpYXRpb24gZGlzYWJsZWQiCisgICAgZWNobyAkbmVnbworICAgIHJldHVybiAwCisgIGZpCisKKyAgZWNobyAiW2ZhaWxdIFNTTHYzIG5lZ290aWF0aW9uIGVuYWJsZWQhICBzdGRvdXQ6IgorICBlY2hvICRuZWdvCisgIHJldHVybiAxCit9CisKK25vc3NsdjMKK2V4aXQgJD8KZGlmZiAtLWdpdCBhL3Rlc3QvZmVhdHVyZXMvc2V0dXAuY2ZnIGIvdGVzdC9mZWF0dXJlcy9zZXR1cC5jZmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RhMWY5NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZmVhdHVyZXMvc2V0dXAuY2ZnCkBAIC0wLDAgKzEsMiBAQAorW2ZsYWtlOF0KK21heC1saW5lLWxlbmd0aCA9IDEwMApkaWZmIC0tZ2l0IGEvdGVzdC9mZWF0dXJlcy9zdHJpbmdfbGltaXQucHkgYi90ZXN0L2ZlYXR1cmVzL3N0cmluZ19saW1pdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODk5MWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9mZWF0dXJlcy9zdHJpbmdfbGltaXQucHkKQEAgLTAsMCArMSw2MiBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisKK2ltcG9ydCBhcmdwYXJzZQoraW1wb3J0IHN5cworCitmcm9tIHV0aWwgaW1wb3J0IGFkZF9jb21tb25fYXJncywgaW5pdF9wcm90b2NvbAorZnJvbSBsb2NhbF90aHJpZnQgaW1wb3J0IHRocmlmdCAgIyBub3FhCitmcm9tIHRocmlmdC5UaHJpZnQgaW1wb3J0IFRNZXNzYWdlVHlwZSwgVFR5cGUKKworCisjIFRPRE86IGdlbmVyYXRlIGZyb20gVGhyaWZ0VGVzdC50aHJpZnQKK2RlZiB0ZXN0X3N0cmluZyhwcm90bywgdmFsdWUpOgorICAgIG1ldGhvZF9uYW1lID0gJ3Rlc3RTdHJpbmcnCisgICAgdHR5cGUgPSBUVHlwZS5TVFJJTkcKKyAgICBwcm90by53cml0ZU1lc3NhZ2VCZWdpbihtZXRob2RfbmFtZSwgVE1lc3NhZ2VUeXBlLkNBTEwsIDMpCisgICAgcHJvdG8ud3JpdGVTdHJ1Y3RCZWdpbihtZXRob2RfbmFtZSArICdfYXJncycpCisgICAgcHJvdG8ud3JpdGVGaWVsZEJlZ2luKCd0aGluZycsIHR0eXBlLCAxKQorICAgIHByb3RvLndyaXRlU3RyaW5nKHZhbHVlKQorICAgIHByb3RvLndyaXRlRmllbGRFbmQoKQorICAgIHByb3RvLndyaXRlRmllbGRTdG9wKCkKKyAgICBwcm90by53cml0ZVN0cnVjdEVuZCgpCisgICAgcHJvdG8ud3JpdGVNZXNzYWdlRW5kKCkKKyAgICBwcm90by50cmFucy5mbHVzaCgpCisKKyAgICBfLCBtdHlwZSwgXyA9IHByb3RvLnJlYWRNZXNzYWdlQmVnaW4oKQorICAgIGFzc2VydCBtdHlwZSA9PSBUTWVzc2FnZVR5cGUuUkVQTFkKKyAgICBwcm90by5yZWFkU3RydWN0QmVnaW4oKQorICAgIF8sIGZ0eXBlLCBmaWQgPSBwcm90by5yZWFkRmllbGRCZWdpbigpCisgICAgYXNzZXJ0IGZpZCA9PSAwCisgICAgYXNzZXJ0IGZ0eXBlID09IHR0eXBlCisgICAgcmVzdWx0ID0gcHJvdG8ucmVhZFN0cmluZygpCisgICAgcHJvdG8ucmVhZEZpZWxkRW5kKCkKKyAgICBfLCBmdHlwZSwgXyA9IHByb3RvLnJlYWRGaWVsZEJlZ2luKCkKKyAgICBhc3NlcnQgZnR5cGUgPT0gVFR5cGUuU1RPUAorICAgIHByb3RvLnJlYWRTdHJ1Y3RFbmQoKQorICAgIHByb3RvLnJlYWRNZXNzYWdlRW5kKCkKKyAgICBhc3NlcnQgdmFsdWUgPT0gcmVzdWx0CisKKworZGVmIG1haW4oYXJndik6CisgICAgcCA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKCkKKyAgICBhZGRfY29tbW9uX2FyZ3MocCkKKyAgICBwLmFkZF9hcmd1bWVudCgnLS1saW1pdCcsIHR5cGU9aW50KQorICAgIGFyZ3MgPSBwLnBhcnNlX2FyZ3MoKQorICAgIHByb3RvID0gaW5pdF9wcm90b2NvbChhcmdzKQorICAgIHRlc3Rfc3RyaW5nKHByb3RvLCAnYScgKiAoYXJncy5saW1pdCAtIDEpKQorICAgIHRlc3Rfc3RyaW5nKHByb3RvLCAnYScgKiAoYXJncy5saW1pdCAtIDEpKQorICAgIHByaW50KCdbT0tdOiBsaW1pdCAtIDEnKQorICAgIHRlc3Rfc3RyaW5nKHByb3RvLCAnYScgKiBhcmdzLmxpbWl0KQorICAgIHRlc3Rfc3RyaW5nKHByb3RvLCAnYScgKiBhcmdzLmxpbWl0KQorICAgIHByaW50KCdbT0tdOiBqdXN0IGxpbWl0JykKKyAgICB0cnk6CisgICAgICAgIHRlc3Rfc3RyaW5nKHByb3RvLCAnYScgKiAoYXJncy5saW1pdCArIDEpKQorICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgIHByaW50KCdbT0tdOiBsaW1pdCArIDEnKQorICAgIGVsc2U6CisgICAgICAgIHByaW50KCdbRVJST1JdOiBsaW1pdCArIDEnKQorICAgICAgICBhc3NlcnQgRmFsc2UKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIG1haW4oc3lzLmFyZ3ZbMTpdKQpkaWZmIC0tZ2l0IGEvdGVzdC9mZWF0dXJlcy90ZXN0cy5qc29uIGIvdGVzdC9mZWF0dXJlcy90ZXN0cy5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxZTA3ZDcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2ZlYXR1cmVzL3Rlc3RzLmpzb24KQEAgLTAsMCArMSwxMTQgQEAKK1sKKyAgeworICAgICJkZXNjcmlwdGlvbiI6ICJUSGVhZGVyIGRldGVjdHMgdW5mcmFtZWQgYmluYXJ5IHdpcmUgZm9ybWF0IiwKKyAgICAibmFtZSI6ICJ0aGVhZGVyX3VuZnJhbWVkX2JpbmFyeSIsCisgICAgImNvbW1hbmQiOiBbCisgICAgICAicHl0aG9uIiwKKyAgICAgICJ0aGVhZGVyX2JpbmFyeS5weSIsCisgICAgICAiLS1vdmVycmlkZS1wcm90b2NvbD1iaW5hcnkiLAorICAgICAgIi0tb3ZlcnJpZGUtdHJhbnNwb3J0PWJ1ZmZlcmVkIgorICAgIF0sCisgICAgInByb3RvY29scyI6IFsiaGVhZGVyIl0sCisgICAgInRyYW5zcG9ydHMiOiBbImJ1ZmZlcmVkIl0sCisgICAgInNvY2tldHMiOiBbImlwIl0sCisgICAgIndvcmtkaXIiOiAiZmVhdHVyZXMiCisgIH0sCisgIHsKKyAgICAiZGVzY3JpcHRpb24iOiAiVEhlYWRlciBkZXRlY3RzIGZyYW1lZCBiaW5hcnkgd2lyZSBmb3JtYXQiLAorICAgICJuYW1lIjogInRoZWFkZXJfZnJhbWVkX2JpbmFyeSIsCisgICAgImNvbW1hbmQiOiBbCisgICAgICAicHl0aG9uIiwKKyAgICAgICJ0aGVhZGVyX2JpbmFyeS5weSIsCisgICAgICAiLS1vdmVycmlkZS1wcm90b2NvbD1iaW5hcnkiLAorICAgICAgIi0tb3ZlcnJpZGUtdHJhbnNwb3J0PWZyYW1lZCIKKyAgICBdLAorICAgICJwcm90b2NvbHMiOiBbImhlYWRlciJdLAorICAgICJ0cmFuc3BvcnRzIjogWyJidWZmZXJlZCJdLAorICAgICJzb2NrZXRzIjogWyJpcCJdLAorICAgICJ3b3JrZGlyIjogImZlYXR1cmVzIgorICB9LAorICB7CisgICAgImRlc2NyaXB0aW9uIjogIlRIZWFkZXIgZGV0ZWN0cyB1bmZyYW1lZCBjb21wYWN0IHdpcmUgZm9ybWF0IiwKKyAgICAibmFtZSI6ICJ0aGVhZGVyX3VuZnJhbWVkX2NvbXBhY3QiLAorICAgICJjb21tYW5kIjogWworICAgICAgInB5dGhvbiIsCisgICAgICAidGhlYWRlcl9iaW5hcnkucHkiLAorICAgICAgIi0tb3ZlcnJpZGUtcHJvdG9jb2w9Y29tcGFjdCIsCisgICAgICAiLS1vdmVycmlkZS10cmFuc3BvcnQ9YnVmZmVyZWQiCisgICAgXSwKKyAgICAicHJvdG9jb2xzIjogWyJoZWFkZXIiXSwKKyAgICAidHJhbnNwb3J0cyI6IFsiYnVmZmVyZWQiXSwKKyAgICAic29ja2V0cyI6IFsiaXAiXSwKKyAgICAid29ya2RpciI6ICJmZWF0dXJlcyIKKyAgfSwKKyAgeworICAgICJkZXNjcmlwdGlvbiI6ICJUSGVhZGVyIGRldGVjdHMgZnJhbWVkIGNvbXBhY3Qgd2lyZSBmb3JtYXQiLAorICAgICJuYW1lIjogInRoZWFkZXJfZnJhbWVkX2NvbXBhY3QiLAorICAgICJjb21tYW5kIjogWworICAgICAgInB5dGhvbiIsCisgICAgICAidGhlYWRlcl9iaW5hcnkucHkiLAorICAgICAgIi0tb3ZlcnJpZGUtcHJvdG9jb2w9Y29tcGFjdCIsCisgICAgICAiLS1vdmVycmlkZS10cmFuc3BvcnQ9ZnJhbWVkIgorICAgIF0sCisgICAgInByb3RvY29scyI6IFsiaGVhZGVyIl0sCisgICAgInRyYW5zcG9ydHMiOiBbImJ1ZmZlcmVkIl0sCisgICAgInNvY2tldHMiOiBbImlwIl0sCisgICAgIndvcmtkaXIiOiAiZmVhdHVyZXMiCisgIH0sCisgIHsKKyAgICAibmFtZSI6ICJsaW1pdF9zdHJpbmdfbGVuZ3RoIiwKKyAgICAiY29tbWFuZCI6IFsKKyAgICAgICJweXRob24iLAorICAgICAgInN0cmluZ19saW1pdC5weSIsCisgICAgICAiLS1saW1pdD01MCIKKyAgICBdLAorICAgICJyZW1vdGVfYXJncyI6IFsKKyAgICAgICItLXN0cmluZy1saW1pdD01MCIKKyAgICBdLAorICAgICJwcm90b2NvbHMiOiBbCisgICAgICAiY29tcGFjdCIKKyAgICBdLAorICAgICJ0cmFuc3BvcnRzIjogWyJidWZmZXJlZCJdLAorICAgICJzb2NrZXRzIjogWyJpcCJdLAorICAgICJ3b3JrZGlyIjogImZlYXR1cmVzIgorICB9LAorICB7CisgICAgIm5hbWUiOiAibGltaXRfY29udGFpbmVyX2xlbmd0aCIsCisgICAgImNvbW1hbmQiOiBbCisgICAgICAicHl0aG9uIiwKKyAgICAgICJjb250YWluZXJfbGltaXQucHkiLAorICAgICAgIi0tbGltaXQ9NTAiCisgICAgXSwKKyAgICAicmVtb3RlX2FyZ3MiOiBbCisgICAgICAiLS1jb250YWluZXItbGltaXQ9NTAiCisgICAgXSwKKyAgICAicHJvdG9jb2xzIjogWworICAgICAgImNvbXBhY3QiCisgICAgXSwKKyAgICAidHJhbnNwb3J0cyI6IFsiYnVmZmVyZWQiXSwKKyAgICAic29ja2V0cyI6IFsiaXAiXSwKKyAgICAid29ya2RpciI6ICJmZWF0dXJlcyIKKyAgfSwKKyAgeworICAgICJuYW1lIjogIm5vc3NsdjMiLAorICAgICJjb21tZW50IjogImNoZWNrIHRvIG1ha2Ugc3VyZSBTU0x2MyBpcyBub3Qgc3VwcG9ydGVkIiwKKyAgICAiY29tbWFuZCI6IFsKKyAgICAgICJub3NzbHYzLnNoIgorICAgIF0sCisgICAgInByb3RvY29scyI6IFsiYmluYXJ5Il0sCisgICAgInRyYW5zcG9ydHMiOiBbImJ1ZmZlcmVkIl0sCisgICAgInNvY2tldHMiOiBbImlwLXNzbCJdLAorICAgICJ3b3JrZGlyIjogImZlYXR1cmVzIgorICB9LAorICB7CisgICAgIm5hbWUiOiAidGxzIiwKKyAgICAiY29tbWVudCI6ICJjaGVjayB0byBtYWtlIHN1cmUgVExTdjEuMCBvciBsYXRlciBpcyBzdXBwb3J0ZWQiLAorICAgICJjb21tYW5kIjogWworICAgICAgInRscy5zaCIKKyAgICBdLAorICAgICJwcm90b2NvbHMiOiBbImJpbmFyeSJdLAorICAgICJ0cmFuc3BvcnRzIjogWyJidWZmZXJlZCJdLAorICAgICJzb2NrZXRzIjogWyJpcC1zc2wiXSwKKyAgICAid29ya2RpciI6ICJmZWF0dXJlcyIKKyAgfQorXQpkaWZmIC0tZ2l0IGEvdGVzdC9mZWF0dXJlcy90aGVhZGVyX2JpbmFyeS5weSBiL3Rlc3QvZmVhdHVyZXMvdGhlYWRlcl9iaW5hcnkucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDUxMzk5YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZmVhdHVyZXMvdGhlYWRlcl9iaW5hcnkucHkKQEAgLTAsMCArMSw3MCBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisKK2ltcG9ydCBhcmdwYXJzZQoraW1wb3J0IHNvY2tldAoraW1wb3J0IHN5cworCitmcm9tIHV0aWwgaW1wb3J0IGFkZF9jb21tb25fYXJncworZnJvbSBsb2NhbF90aHJpZnQgaW1wb3J0IHRocmlmdCAgIyBub3FhCitmcm9tIHRocmlmdC5UaHJpZnQgaW1wb3J0IFRNZXNzYWdlVHlwZSwgVFR5cGUKK2Zyb20gdGhyaWZ0LnRyYW5zcG9ydC5UU29ja2V0IGltcG9ydCBUU29ja2V0Citmcm9tIHRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydCBpbXBvcnQgVEJ1ZmZlcmVkVHJhbnNwb3J0LCBURnJhbWVkVHJhbnNwb3J0Citmcm9tIHRocmlmdC5wcm90b2NvbC5UQmluYXJ5UHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbAorZnJvbSB0aHJpZnQucHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbCBpbXBvcnQgVENvbXBhY3RQcm90b2NvbAorCisKK2RlZiB0ZXN0X3ZvaWQocHJvdG8pOgorICAgIHByb3RvLndyaXRlTWVzc2FnZUJlZ2luKCd0ZXN0Vm9pZCcsIFRNZXNzYWdlVHlwZS5DQUxMLCAzKQorICAgIHByb3RvLndyaXRlU3RydWN0QmVnaW4oJ3Rlc3RWb2lkX2FyZ3MnKQorICAgIHByb3RvLndyaXRlRmllbGRTdG9wKCkKKyAgICBwcm90by53cml0ZVN0cnVjdEVuZCgpCisgICAgcHJvdG8ud3JpdGVNZXNzYWdlRW5kKCkKKyAgICBwcm90by50cmFucy5mbHVzaCgpCisKKyAgICBfLCBtdHlwZSwgXyA9IHByb3RvLnJlYWRNZXNzYWdlQmVnaW4oKQorICAgIGFzc2VydCBtdHlwZSA9PSBUTWVzc2FnZVR5cGUuUkVQTFkKKyAgICBwcm90by5yZWFkU3RydWN0QmVnaW4oKQorICAgIF8sIGZ0eXBlLCBfID0gcHJvdG8ucmVhZEZpZWxkQmVnaW4oKQorICAgIGFzc2VydCBmdHlwZSA9PSBUVHlwZS5TVE9QCisgICAgcHJvdG8ucmVhZFN0cnVjdEVuZCgpCisgICAgcHJvdG8ucmVhZE1lc3NhZ2VFbmQoKQorCisKKyMgVEhlYWRlciBzdGFjayBzaG91bGQgYWNjZXB0IGJpbmFyeSBwcm90b2NvbCB3aXRoIG9wdGlvbmFsbHkgZnJhbWVkIHRyYW5zcG9ydAorZGVmIG1haW4oYXJndik6CisgICAgcCA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKCkKKyAgICBhZGRfY29tbW9uX2FyZ3MocCkKKyAgICAjIFNpbmNlIFRIZWFkZXJUcmFuc3BvcnQgYWN0cyBhcyBmcmFtZWQgdHJhbnNwb3J0IHdoZW4gZGV0ZWN0ZWQgZnJhbWUsIHdlCisgICAgIyBjYW5ub3QgdXNlIC0tdHJhbnNwb3J0PWZyYW1lZCBhcyBpdCB3b3VsZCByZXN1bHQgaW4gMiBsYXllcmVkIGZyYW1lcy4KKyAgICBwLmFkZF9hcmd1bWVudCgnLS1vdmVycmlkZS10cmFuc3BvcnQnKQorICAgIHAuYWRkX2FyZ3VtZW50KCctLW92ZXJyaWRlLXByb3RvY29sJykKKyAgICBhcmdzID0gcC5wYXJzZV9hcmdzKCkKKyAgICBhc3NlcnQgYXJncy5wcm90b2NvbCA9PSAnaGVhZGVyJworICAgIGFzc2VydCBhcmdzLnRyYW5zcG9ydCA9PSAnYnVmZmVyZWQnCisgICAgYXNzZXJ0IG5vdCBhcmdzLnNzbAorCisgICAgc29jayA9IFRTb2NrZXQoYXJncy5ob3N0LCBhcmdzLnBvcnQsIHNvY2tldF9mYW1pbHk9c29ja2V0LkFGX0lORVQpCisgICAgaWYgbm90IGFyZ3Mub3ZlcnJpZGVfdHJhbnNwb3J0IG9yIGFyZ3Mub3ZlcnJpZGVfdHJhbnNwb3J0ID09ICdidWZmZXJlZCc6CisgICAgICAgIHRyYW5zID0gVEJ1ZmZlcmVkVHJhbnNwb3J0KHNvY2spCisgICAgZWxpZiBhcmdzLm92ZXJyaWRlX3RyYW5zcG9ydCA9PSAnZnJhbWVkJzoKKyAgICAgICAgcHJpbnQoJ1RGUkFNRUQnKQorICAgICAgICB0cmFucyA9IFRGcmFtZWRUcmFuc3BvcnQoc29jaykKKyAgICBlbHNlOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdpbnZhbGlkIHRyYW5zcG9ydCcpCisgICAgdHJhbnMub3BlbigpCisKKyAgICBpZiBub3QgYXJncy5vdmVycmlkZV9wcm90b2NvbCBvciBhcmdzLm92ZXJyaWRlX3Byb3RvY29sID09ICdiaW5hcnknOgorICAgICAgICBwcm90byA9IFRCaW5hcnlQcm90b2NvbCh0cmFucykKKyAgICBlbGlmIGFyZ3Mub3ZlcnJpZGVfcHJvdG9jb2wgPT0gJ2NvbXBhY3QnOgorICAgICAgICBwcm90byA9IFRDb21wYWN0UHJvdG9jb2wodHJhbnMpCisgICAgZWxzZToKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignaW52YWxpZCB0cmFuc3BvcnQnKQorCisgICAgdGVzdF92b2lkKHByb3RvKQorICAgIHRlc3Rfdm9pZChwcm90bykKKworICAgIHRyYW5zLmNsb3NlKCkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHN5cy5leGl0KG1haW4oc3lzLmFyZ3ZbMTpdKSkKZGlmZiAtLWdpdCBhL3Rlc3QvZmVhdHVyZXMvdGxzLnNoIGIvdGVzdC9mZWF0dXJlcy90bHMuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZGFkYTZhYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZmVhdHVyZXMvdGxzLnNoCkBAIC0wLDAgKzEsNzEgQEAKKyMhL2Jpbi9iYXNoCisKKyMKKyMgQ2hlY2tzIHRvIG1ha2Ugc3VyZSBUTFN2MS4wIG9yIGxhdGVyIGlzIGFsbG93ZWQgYnkgYSBzZXJ2ZXIuCisjCisKK1RIUklGVEhPU1Q9bG9jYWxob3N0CitUSFJJRlRQT1JUPTkwOTAKKword2hpbGUgW1sgJCMgLWdlIDEgXV07IGRvCisgIGFyZz0iJDEiCisgIGFyZ0lOPSgke2FyZy8vPS8gfSkKKworICBjYXNlICR7YXJnSU5bMF19IGluCisgICAgLWh8LS1ob3N0KQorICAgIFRIUklGVEhPU1Q9JHthcmdJTlsxXX0KKyAgICBzaGlmdCAjIHBhc3QgYXJndW1lbnQKKyAgICA7OworICAgIC1wfC0tcG9ydCkKKyAgICBUSFJJRlRQT1JUPSR7YXJnSU5bMV19CisgICAgc2hpZnQgIyBwYXN0IGFyZ3VtZW50CisgICAgOzsKKyAgICAqKQorICAgICAgICAgICMgdW5rbm93biBvcHRpb24gaWdub3JlZAorICAgIDs7CisgIGVzYWMKKworICBzaGlmdCAgICMgcGFzdCBhcmd1bWVudCBvciB2YWx1ZQorZG9uZQorCitkZWNsYXJlIC1BIEVYUEVDVF9ORUdPVElBVEUKK0VYUEVDVF9ORUdPVElBVEVbdGxzMV09MQorRVhQRUNUX05FR09USUFURVt0bHMxXzFdPTEKK0VYUEVDVF9ORUdPVElBVEVbdGxzMV8yXT0xCisKK2ZhaWx1cmVzPTAKKworZnVuY3Rpb24gdGxzCit7CisgIGZvciBQUk9UTyBpbiAiJHshRVhQRUNUX05FR09USUFURVtAXX0iOyBkbworCisgICAgbG9jYWwgbmVnbworICAgIGxvY2FsIG5lZ29kZW5pZWQKKyAgICBsb2NhbCByZXMKKworICAgIGVjaG8gIm9wZW5zc2wgc19jbGllbnQgLWNvbm5lY3QgJFRIUklGVEhPU1Q6JFRIUklGVFBPUlQgLUNBZmlsZSAuLi9rZXlzL0NBLnBlbSAtJFBST1RPIDI+JjEgPCAvZGV2L251bGwiCisgICAgbmVnbz0kKG9wZW5zc2wgc19jbGllbnQgLWNvbm5lY3QgJFRIUklGVEhPU1Q6JFRIUklGVFBPUlQgLUNBZmlsZSAuLi9rZXlzL0NBLnBlbSAtJFBST1RPIDI+JjEgPCAvZGV2L251bGwpCisgICAgbmVnb2RlbmllZD0kPworICAgIGVjaG8gInJlc3VsdCBvZiBjb21tYW5kOiAkbmVnb2RlbmllZCIKKworICAgIHJlcz0iZW5hYmxlZCI7IGlmIFtbICR7RVhQRUNUX05FR09USUFURVskUFJPVE9dfSAtZXEgMCBdXTsgdGhlbiByZXM9ImRpc2FibGVkIjsgZmkKKworICAgIGlmIFtbICRuZWdvZGVuaWVkIC1uZSAke0VYUEVDVF9ORUdPVElBVEVbJFBST1RPXX0gXV07IHRoZW4KKyAgICAgIGVjaG8gIiRQUk9UTyBuZWdvdGlhdGlvbiBhbGxvd2VkIgorICAgIGVsc2UKKyAgICAgIGVjaG8gIlt3YXJuXSAkUFJPVE8gbmVnb3RpYXRpb24gZGlkIG5vdCB3b3JrIgorICAgICAgZWNobyAkbmVnbworICAgICAgKChmYWlsdXJlcysrKSkKKyAgICBmaQorICBkb25lCit9CisKK3RscworCitpZiBbWyAkZmFpbHVyZXMgLWVxIDMgXV07IHRoZW4KKyAgZWNobyAiW2ZhaWxdIEF0IGxlYXN0IG9uZSBvZiBUTFN2MS4wLCBUTFN2MS4xLCBvciBUTFN2MS4yIG5lZWRzIHRvIHdvcmssIGJ1dCBkb2VzIG5vdCIKKyAgZXhpdCAkZmFpbHVyZXMKK2ZpCisKK2VjaG8gIltwYXNzXSBBdCBsZWFzdCBvbmUgb2YgVExTdjEuMCwgVExTdjEuMSwgb3IgVExTdjEuMiB3b3JrZWQiCitleGl0IDAKZGlmZiAtLWdpdCBhL3Rlc3QvZmVhdHVyZXMvdXRpbC5weSBiL3Rlc3QvZmVhdHVyZXMvdXRpbC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWJiYmJkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9mZWF0dXJlcy91dGlsLnB5CkBAIC0wLDAgKzEsNDAgQEAKK2ltcG9ydCBhcmdwYXJzZQoraW1wb3J0IHNvY2tldAorCitmcm9tIGxvY2FsX3RocmlmdCBpbXBvcnQgdGhyaWZ0ICAjIG5vcWEKK2Zyb20gdGhyaWZ0LnRyYW5zcG9ydC5UU29ja2V0IGltcG9ydCBUU29ja2V0Citmcm9tIHRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydCBpbXBvcnQgVEJ1ZmZlcmVkVHJhbnNwb3J0LCBURnJhbWVkVHJhbnNwb3J0Citmcm9tIHRocmlmdC50cmFuc3BvcnQuVEh0dHBDbGllbnQgaW1wb3J0IFRIdHRwQ2xpZW50Citmcm9tIHRocmlmdC5wcm90b2NvbC5UQmluYXJ5UHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbAorZnJvbSB0aHJpZnQucHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbCBpbXBvcnQgVENvbXBhY3RQcm90b2NvbAorZnJvbSB0aHJpZnQucHJvdG9jb2wuVEpTT05Qcm90b2NvbCBpbXBvcnQgVEpTT05Qcm90b2NvbAorCisKK2RlZiBhZGRfY29tbW9uX2FyZ3MocCk6CisgICAgcC5hZGRfYXJndW1lbnQoJy0taG9zdCcsIGRlZmF1bHQ9J2xvY2FsaG9zdCcpCisgICAgcC5hZGRfYXJndW1lbnQoJy0tcG9ydCcsIHR5cGU9aW50LCBkZWZhdWx0PTkwOTApCisgICAgcC5hZGRfYXJndW1lbnQoJy0tcHJvdG9jb2wnLCBkZWZhdWx0PSdiaW5hcnknKQorICAgIHAuYWRkX2FyZ3VtZW50KCctLXRyYW5zcG9ydCcsIGRlZmF1bHQ9J2J1ZmZlcmVkJykKKyAgICBwLmFkZF9hcmd1bWVudCgnLS1zc2wnLCBhY3Rpb249J3N0b3JlX3RydWUnKQorCisKK2RlZiBwYXJzZV9jb21tb25fYXJncyhhcmd2KToKKyAgICBwID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoKQorICAgIGFkZF9jb21tb25fYXJncyhwKQorICAgIHJldHVybiBwLnBhcnNlX2FyZ3MoYXJndikKKworCitkZWYgaW5pdF9wcm90b2NvbChhcmdzKToKKyAgICBzb2NrID0gVFNvY2tldChhcmdzLmhvc3QsIGFyZ3MucG9ydCwgc29ja2V0X2ZhbWlseT1zb2NrZXQuQUZfSU5FVCkKKyAgICBzb2NrLnNldFRpbWVvdXQoNTAwKQorICAgIHRyYW5zID0geworICAgICAgICAnYnVmZmVyZWQnOiBUQnVmZmVyZWRUcmFuc3BvcnQsCisgICAgICAgICdmcmFtZWQnOiBURnJhbWVkVHJhbnNwb3J0LAorICAgICAgICAnaHR0cCc6IFRIdHRwQ2xpZW50LAorICAgIH1bYXJncy50cmFuc3BvcnRdKHNvY2spCisgICAgdHJhbnMub3BlbigpCisgICAgcmV0dXJuIHsKKyAgICAgICAgJ2JpbmFyeSc6IFRCaW5hcnlQcm90b2NvbCwKKyAgICAgICAgJ2NvbXBhY3QnOiBUQ29tcGFjdFByb3RvY29sLAorICAgICAgICAnanNvbic6IFRKU09OUHJvdG9jb2wsCisgICAgfVthcmdzLnByb3RvY29sXSh0cmFucykKZGlmZiAtLWdpdCBhL3Rlc3QvZ28vTWFrZWZpbGUuYW0gYi90ZXN0L2dvL01ha2VmaWxlLmFtCmluZGV4IDY2ZjgxYWQuLjZkYTgzMzkgMTAwNjQ0Ci0tLSBhL3Rlc3QvZ28vTWFrZWZpbGUuYW0KKysrIGIvdGVzdC9nby9NYWtlZmlsZS5hbQpAQCAtMTcsMjIgKzE3LDI3IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1USFJJRlQgPSAkKHRvcF9zcmNkaXIpL2NvbXBpbGVyL2NwcC90aHJpZnQKLVRIUklGVENNRCA9ICQoVEhSSUZUKSAtb3V0IHNyYy9nZW4gLS1nZW4gZ286dGhyaWZ0X2ltcG9ydD10aHJpZnQKK0JVSUxUX1NPVVJDRVMgPSBnb3BhdGgKKworVEhSSUZUQ01EID0gJChUSFJJRlQpIC1vdXQgc3JjL2dlbiAtLWdlbiBnbzp0aHJpZnRfaW1wb3J0PXRocmlmdCQoQ09NUElMRVJfRVhUUkFGTEFHKQogVEhSSUZUVEVTVCA9ICQodG9wX3NyY2RpcikvdGVzdC9UaHJpZnRUZXN0LnRocmlmdAogCi1hbGw6IGJpbi90ZXN0Y2xpZW50IGJpbi90ZXN0c2VydmVyIGJpbi9zdHJlc3MKK3ByZWNyb3NzOiBiaW4vdGVzdGNsaWVudCBiaW4vdGVzdHNlcnZlcgogCiBUaHJpZnRUZXN0LnRocmlmdDogJChUSFJJRlRURVNUKQogCWdyZXAgLXYgbGlzdC4qbWFwLipsaXN0LiptYXAgJChUSFJJRlRURVNUKSA+IFRocmlmdFRlc3QudGhyaWZ0CiAKKy5QSE9OWTogZ29wYXRoCisKICMgVGhyaWZ0IGZvciBHTyBoYXMgcHJvYmxlbXMgd2l0aCBjb21wbGV4IG1hcCBrZXlzOiBUSFJJRlQtMjA2MwogZ29wYXRoOiAkKFRIUklGVCkgVGhyaWZ0VGVzdC50aHJpZnQKIAlta2RpciAtcCBzcmMvZ2VuCiAJJChUSFJJRlRDTUQpIFRocmlmdFRlc3QudGhyaWZ0CiAJJChUSFJJRlRDTUQpIC4uL1N0cmVzc1Rlc3QudGhyaWZ0CisJR09QQVRIPWBwd2RgICQoR08pIGdldCBnaXRodWIuY29tL2dvbGFuZy9tb2NrL2dvbW9jayB8fCB0cnVlCisJc2VkIC1pICdzL1wiY29udGV4dFwiL1wiZ29sYW5nLm9yZ1wveFwvbmV0XC9jb250ZXh0XCIvZycgc3JjL2dpdGh1Yi5jb20vZ29sYW5nL21vY2svZ29tb2NrL2NvbnRyb2xsZXIuZ28gfHwgdHJ1ZQorCUdPUEFUSD1gcHdkYCAkKEdPKSBnZXQgZ2l0aHViLmNvbS9nb2xhbmcvbW9jay9nb21vY2sKIAlsbiAtbmZzIC4uLy4uLy4uL2xpYi9nby90aHJpZnQgc3JjL3RocmlmdAotCUdPUEFUSD1gcHdkYCAkKEdPKSBnZXQgY29kZS5nb29nbGUuY29tL3AvZ29tb2NrL2dvbW9jawogCXRvdWNoIGdvcGF0aAogCiBiaW4vdGVzdGNsaWVudDogZ29wYXRoCkBAIC00NSwxMyArNTAsMTUgQEAKIAlHT1BBVEg9YHB3ZGAgJChHTykgaW5zdGFsbCBiaW4vc3RyZXNzCiAKIGNsZWFuLWxvY2FsOgotCSQoUk0pIC1yIHNyYy9nZW4gc3JjL2NvZGUuZ29vZ2xlLmNvbSBzcmMvdGhyaWZ0IGJpbiBwa2cgZ29wYXRoIFRocmlmdFRlc3QudGhyaWZ0CisJJChSTSkgLXIgc3JjL2dlbiBzcmMvZ2l0aHViLmNvbS9nb2xhbmcgc3JjL3RocmlmdCBiaW4gcGtnIGdvcGF0aCBUaHJpZnRUZXN0LnRocmlmdAogCi1jaGVjazogZ29wYXRoCitjaGVja19QUk9HUkFNUzogYmluL3Rlc3RjbGllbnQgYmluL3Rlc3RzZXJ2ZXIgYmluL3N0cmVzcworCitjaGVjazogZ29wYXRoIGdlbm1vY2sKIAlHT1BBVEg9YHB3ZGAgJChHTykgdGVzdCAtdiBjb21tb24vLi4uCiAKIGdlbm1vY2s6IGdvcGF0aAotCUdPUEFUSD1gcHdkYCAkKEdPKSBpbnN0YWxsIGNvZGUuZ29vZ2xlLmNvbS9wL2dvbW9jay9tb2NrZ2VuCisJR09QQVRIPWBwd2RgICQoR08pIGluc3RhbGwgZ2l0aHViLmNvbS9nb2xhbmcvbW9jay9tb2NrZ2VuCiAJR09QQVRIPWBwd2RgIGJpbi9tb2NrZ2VuIC1kZXN0aW5hdGlvbj1zcmMvY29tbW9uL21vY2tfaGFuZGxlci5nbyAtcGFja2FnZT1jb21tb24gZ2VuL3RocmlmdHRlc3QgVGhyaWZ0VGVzdAogCiBFWFRSQV9ESVNUID0gXApkaWZmIC0tZ2l0IGEvdGVzdC9nby9zcmMvYmluL3N0cmVzcy9tYWluLmdvIGIvdGVzdC9nby9zcmMvYmluL3N0cmVzcy9tYWluLmdvCmluZGV4IDRmYzg4ZTAuLmYyZTBmMjAgMTAwNjQ0Ci0tLSBhL3Rlc3QvZ28vc3JjL2Jpbi9zdHJlc3MvbWFpbi5nbworKysgYi90ZXN0L2dvL3NyYy9iaW4vc3RyZXNzL21haW4uZ28KQEAgLTIwLDYgKzIwLDcgQEAKIHBhY2thZ2UgbWFpbgogCiBpbXBvcnQgKAorCSJjb250ZXh0IgogCSJmbGFnIgogCSJmbXQiCiAJImdlbi9zdHJlc3MiCkBAIC0yMDEsMTQgKzIwMiwxMyBAQAogCQkJYXRvbWljLkFkZEludDY0KCZjbGljb3VudGVyLCAxKQogCQl9CiAJY2FzZSBlY2hvU2V0OgotCQlzIDo9IG1hcFtpbnQ4XWJvb2x7LTEwOiB0cnVlLCAtOTogdHJ1ZSwgLTg6IHRydWUsIC03OiB0cnVlLCAtNjogdHJ1ZSwgLTU6IHRydWUsIC00OiB0cnVlLCAtMzogdHJ1ZSwgLTI6IHRydWUsIC0xOiB0cnVlLCAwOiB0cnVlLCAxOiB0cnVlLCAyOiB0cnVlLCAzOiB0cnVlLCA0OiB0cnVlLCA1OiB0cnVlLCA2OiB0cnVlLCA3OiB0cnVlLCA4OiB0cnVlfQorCQlzIDo9IG1hcFtpbnQ4XXN0cnVjdHt9ey0xMDoge30sIC05OiB7fSwgLTg6IHt9LCAtNzoge30sIC02OiB7fSwgLTU6IHt9LCAtNDoge30sIC0zOiB7fSwgLTI6IHt9LCAtMToge30sIDA6IHt9LCAxOiB7fSwgMjoge30sIDM6IHt9LCA0OiB7fSwgNToge30sIDY6IHt9LCA3OiB7fSwgODoge319CiAJCWZvciBpIDo9IDA7IGkgPCAqbG9vcDsgaSsrIHsKIAkJCWNsaWVudC5FY2hvU2V0KHMpCiAJCQlhdG9taWMuQWRkSW50NjQoJmNsaWNvdW50ZXIsIDEpCiAJCX0KIAljYXNlIGVjaG9NYXA6Ci0JCW0gOj0gbWFwW2ludDhdaW50OHsKLQkJCS0xMDogMTAsIC05OiA5LCAtODogOCwgLTc6IDcsIC02OiA2LCAtNTogNSwgLTQ6IDQsIC0zOiAzLCAtMjogMiwgLTE6IDEsIDA6IDAsIDE6IDEsIDI6IDIsIDM6IDMsIDQ6IDQsIDU6IDUsIDY6IDYsIDc6IDcsIDg6IDh9CisJCW0gOj0gbWFwW2ludDhdaW50OHstMTA6IDEwLCAtOTogOSwgLTg6IDgsIC03OiA3LCAtNjogNiwgLTU6IDUsIC00OiA0LCAtMzogMywgLTI6IDIsIC0xOiAxLCAwOiAwLCAxOiAxLCAyOiAyLCAzOiAzLCA0OiA0LCA1OiA1LCA2OiA2LCA3OiA3LCA4OiA4fQogCQlmb3IgaSA6PSAwOyBpIDwgKmxvb3A7IGkrKyB7CiAJCQljbGllbnQuRWNob01hcChtKQogCQkJYXRvbWljLkFkZEludDY0KCZjbGljb3VudGVyLCAxKQpAQCAtMjIwLDM1ICsyMjAsMzUgQEAKIAogdHlwZSBoYW5kbGVyIHN0cnVjdHt9CiAKLWZ1bmMgKGggKmhhbmRsZXIpIEVjaG9Wb2lkKCkgKGVyciBlcnJvcikgeworZnVuYyAoaCAqaGFuZGxlcikgRWNob1ZvaWQoY3R4IGNvbnRleHQuQ29udGV4dCkgKGVyciBlcnJvcikgewogCWF0b21pYy5BZGRJbnQ2NCgmY291bnRlciwgMSkKIAlyZXR1cm4gbmlsCiB9Ci1mdW5jIChoICpoYW5kbGVyKSBFY2hvQnl0ZShhcmcgaW50OCkgKHIgaW50OCwgZXJyIGVycm9yKSB7CitmdW5jIChoICpoYW5kbGVyKSBFY2hvQnl0ZShjdHggY29udGV4dC5Db250ZXh0LCBhcmcgaW50OCkgKHIgaW50OCwgZXJyIGVycm9yKSB7CiAJYXRvbWljLkFkZEludDY0KCZjb3VudGVyLCAxKQogCXJldHVybiBhcmcsIG5pbAogfQotZnVuYyAoaCAqaGFuZGxlcikgRWNob0kzMihhcmcgaW50MzIpIChyIGludDMyLCBlcnIgZXJyb3IpIHsKK2Z1bmMgKGggKmhhbmRsZXIpIEVjaG9JMzIoY3R4IGNvbnRleHQuQ29udGV4dCwgYXJnIGludDMyKSAociBpbnQzMiwgZXJyIGVycm9yKSB7CiAJYXRvbWljLkFkZEludDY0KCZjb3VudGVyLCAxKQogCXJldHVybiBhcmcsIG5pbAogfQotZnVuYyAoaCAqaGFuZGxlcikgRWNob0k2NChhcmcgaW50NjQpIChyIGludDY0LCBlcnIgZXJyb3IpIHsKK2Z1bmMgKGggKmhhbmRsZXIpIEVjaG9JNjQoY3R4IGNvbnRleHQuQ29udGV4dCwgYXJnIGludDY0KSAociBpbnQ2NCwgZXJyIGVycm9yKSB7CiAJYXRvbWljLkFkZEludDY0KCZjb3VudGVyLCAxKQogCXJldHVybiBhcmcsIG5pbAogfQotZnVuYyAoaCAqaGFuZGxlcikgRWNob1N0cmluZyhhcmcgc3RyaW5nKSAociBzdHJpbmcsIGVyciBlcnJvcikgeworZnVuYyAoaCAqaGFuZGxlcikgRWNob1N0cmluZyhjdHggY29udGV4dC5Db250ZXh0LCBhcmcgc3RyaW5nKSAociBzdHJpbmcsIGVyciBlcnJvcikgewogCWF0b21pYy5BZGRJbnQ2NCgmY291bnRlciwgMSkKIAlyZXR1cm4gYXJnLCBuaWwKIH0KLWZ1bmMgKGggKmhhbmRsZXIpIEVjaG9MaXN0KGFyZyBbXWludDgpIChyIFtdaW50OCwgZXJyIGVycm9yKSB7CitmdW5jIChoICpoYW5kbGVyKSBFY2hvTGlzdChjdHggY29udGV4dC5Db250ZXh0LCBhcmcgW11pbnQ4KSAociBbXWludDgsIGVyciBlcnJvcikgewogCWF0b21pYy5BZGRJbnQ2NCgmY291bnRlciwgMSkKIAlyZXR1cm4gYXJnLCBuaWwKIH0KLWZ1bmMgKGggKmhhbmRsZXIpIEVjaG9TZXQoYXJnIG1hcFtpbnQ4XWJvb2wpIChyIG1hcFtpbnQ4XWJvb2wsIGVyciBlcnJvcikgeworZnVuYyAoaCAqaGFuZGxlcikgRWNob1NldChjdHggY29udGV4dC5Db250ZXh0LCBhcmcgbWFwW2ludDhdc3RydWN0e30pIChyIG1hcFtpbnQ4XXN0cnVjdHt9LCBlcnIgZXJyb3IpIHsKIAlhdG9taWMuQWRkSW50NjQoJmNvdW50ZXIsIDEpCiAJcmV0dXJuIGFyZywgbmlsCiB9Ci1mdW5jIChoICpoYW5kbGVyKSBFY2hvTWFwKGFyZyBtYXBbaW50OF1pbnQ4KSAociBtYXBbaW50OF1pbnQ4LCBlcnIgZXJyb3IpIHsKK2Z1bmMgKGggKmhhbmRsZXIpIEVjaG9NYXAoY3R4IGNvbnRleHQuQ29udGV4dCwgYXJnIG1hcFtpbnQ4XWludDgpIChyIG1hcFtpbnQ4XWludDgsIGVyciBlcnJvcikgewogCWF0b21pYy5BZGRJbnQ2NCgmY291bnRlciwgMSkKIAlyZXR1cm4gYXJnLCBuaWwKIH0KZGlmZiAtLWdpdCBhL3Rlc3QvZ28vc3JjL2Jpbi90ZXN0Y2xpZW50L21haW4uZ28gYi90ZXN0L2dvL3NyYy9iaW4vdGVzdGNsaWVudC9tYWluLmdvCmluZGV4IDJhY2Y2Y2YuLjQzNTdlZTggMTAwNjQ0Ci0tLSBhL3Rlc3QvZ28vc3JjL2Jpbi90ZXN0Y2xpZW50L21haW4uZ28KKysrIGIvdGVzdC9nby9zcmMvYmluL3Rlc3RjbGllbnQvbWFpbi5nbwpAQCAtMjEsNiArMjEsNyBAQAogCiBpbXBvcnQgKAogCSJjb21tb24iCisJImNvbnRleHQiCiAJImZsYWciCiAJImdlbi90aHJpZnR0ZXN0IgogCXQgImxvZyIKQEAgLTMxLDE0ICszMiwxNSBAQAogdmFyIGhvc3QgPSBmbGFnLlN0cmluZygiaG9zdCIsICJsb2NhbGhvc3QiLCAiSG9zdCB0byBjb25uZWN0IikKIHZhciBwb3J0ID0gZmxhZy5JbnQ2NCgicG9ydCIsIDkwOTAsICJQb3J0IG51bWJlciB0byBjb25uZWN0IikKIHZhciBkb21haW5fc29ja2V0ID0gZmxhZy5TdHJpbmcoImRvbWFpbi1zb2NrZXQiLCAiIiwgIkRvbWFpbiBTb2NrZXQgKGUuZy4gL3RtcC90aHJpZnR0ZXN0LnRocmlmdCksIGluc3RlYWQgb2YgaG9zdCBhbmQgcG9ydCIpCi12YXIgdHJhbnNwb3J0ID0gZmxhZy5TdHJpbmcoInRyYW5zcG9ydCIsICJidWZmZXJlZCIsICJUcmFuc3BvcnQ6IGJ1ZmZlcmVkLCBmcmFtZWQsIGh0dHAiKQordmFyIHRyYW5zcG9ydCA9IGZsYWcuU3RyaW5nKCJ0cmFuc3BvcnQiLCAiYnVmZmVyZWQiLCAiVHJhbnNwb3J0OiBidWZmZXJlZCwgZnJhbWVkLCBodHRwLCB6bGliIikKIHZhciBwcm90b2NvbCA9IGZsYWcuU3RyaW5nKCJwcm90b2NvbCIsICJiaW5hcnkiLCAiUHJvdG9jb2w6IGJpbmFyeSwgY29tcGFjdCwganNvbiIpCiB2YXIgc3NsID0gZmxhZy5Cb29sKCJzc2wiLCBmYWxzZSwgIkVuY3J5cHRlZCBUcmFuc3BvcnQgdXNpbmcgU1NMIikKK3ZhciB6bGliID0gZmxhZy5Cb29sKCJ6bGliIiwgZmFsc2UsICJXcmFwcGVkIFRyYW5zcG9ydCB1c2luZyBabGliIikKIHZhciB0ZXN0bG9vcHMgPSBmbGFnLkludCgidGVzdGxvb3BzIiwgMSwgIk51bWJlciBvZiBUZXN0cyIpCiAKIGZ1bmMgbWFpbigpIHsKIAlmbGFnLlBhcnNlKCkKLQljbGllbnQsIGVyciA6PSBjb21tb24uU3RhcnRDbGllbnQoKmhvc3QsICpwb3J0LCAqZG9tYWluX3NvY2tldCwgKnRyYW5zcG9ydCwgKnByb3RvY29sLCAqc3NsKQorCWNsaWVudCwgXywgZXJyIDo9IGNvbW1vbi5TdGFydENsaWVudCgqaG9zdCwgKnBvcnQsICpkb21haW5fc29ja2V0LCAqdHJhbnNwb3J0LCAqcHJvdG9jb2wsICpzc2wpCiAJaWYgZXJyICE9IG5pbCB7CiAJCXQuRmF0YWxmKCJVbmFibGUgdG8gc3RhcnQgY2xpZW50OiAiLCBlcnIpCiAJfQpAQCAtNjAsMTQgKzYyLDE1IEBACiB9CiAKIHZhciB4Y2VwdCA9ICZ0aHJpZnR0ZXN0LlhjZXB0aW9ue0Vycm9yQ29kZTogMTAwMSwgTWVzc2FnZTogIlhjZXB0aW9uIn0KK3ZhciBkZWZhdWx0Q3R4ID0gY29udGV4dC5CYWNrZ3JvdW5kKCkKIAogZnVuYyBjYWxsRXZlcnl0aGluZyhjbGllbnQgKnRocmlmdHRlc3QuVGhyaWZ0VGVzdENsaWVudCkgewogCXZhciBlcnIgZXJyb3IKLQlpZiBlcnIgPSBjbGllbnQuVGVzdFZvaWQoKTsgZXJyICE9IG5pbCB7CisJaWYgZXJyID0gY2xpZW50LlRlc3RWb2lkKGRlZmF1bHRDdHgpOyBlcnIgIT0gbmlsIHsKIAkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdFZvaWQoKSBjYWxsOiAiLCBlcnIpCiAJfQogCi0JdGhpbmcsIGVyciA6PSBjbGllbnQuVGVzdFN0cmluZygidGhpbmciKQorCXRoaW5nLCBlcnIgOj0gY2xpZW50LlRlc3RTdHJpbmcoZGVmYXVsdEN0eCwgInRoaW5nIikKIAlpZiBlcnIgIT0gbmlsIHsKIAkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdFN0cmluZygpIGNhbGw6ICIsIGVycikKIAl9CkBAIC03NSw3ICs3OCwyMiBAQAogCQl0LkZhdGFsZigiVW5leHBlY3RlZCBUZXN0U3RyaW5nKCkgcmVzdWx0LCBleHBlY3RlZCAndGhpbmcnIGdvdCAnJXMnICIsIHRoaW5nKQogCX0KIAotCWIsIGVyciA6PSBjbGllbnQuVGVzdEJ5dGUoNDIpCisJYmwsIGVyciA6PSBjbGllbnQuVGVzdEJvb2woZGVmYXVsdEN0eCwgdHJ1ZSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdEJvb2woKSBjYWxsOiAiLCBlcnIpCisJfQorCWlmICFibCB7CisJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIFRlc3RCb29sKCkgcmVzdWx0IGV4cGVjdGVkIHRydWUsIGdvdCAlZiAiLCBibCkKKwl9CisJYmwsIGVyciA9IGNsaWVudC5UZXN0Qm9vbChkZWZhdWx0Q3R4LCBmYWxzZSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdEJvb2woKSBjYWxsOiAiLCBlcnIpCisJfQorCWlmIGJsIHsKKwkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgVGVzdEJvb2woKSByZXN1bHQgZXhwZWN0ZWQgZmFsc2UsIGdvdCAlZiAiLCBibCkKKwl9CisKKwliLCBlcnIgOj0gY2xpZW50LlRlc3RCeXRlKGRlZmF1bHRDdHgsIDQyKQogCWlmIGVyciAhPSBuaWwgewogCQl0LkZhdGFsZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0Qnl0ZSgpIGNhbGw6ICIsIGVycikKIAl9CkBAIC04Myw3ICsxMDEsNyBAQAogCQl0LkZhdGFsZigiVW5leHBlY3RlZCBUZXN0Qnl0ZSgpIHJlc3VsdCBleHBlY3RlZCA0MiwgZ290ICVkICIsIGIpCiAJfQogCi0JaTMyLCBlcnIgOj0gY2xpZW50LlRlc3RJMzIoNDI0MikKKwlpMzIsIGVyciA6PSBjbGllbnQuVGVzdEkzMihkZWZhdWx0Q3R4LCA0MjQyKQogCWlmIGVyciAhPSBuaWwgewogCQl0LkZhdGFsZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0STMyKCkgY2FsbDogIiwgZXJyKQogCX0KQEAgLTkxLDcgKzEwOSw3IEBACiAJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIFRlc3RJMzIoKSByZXN1bHQgZXhwZWN0ZWQgNDI0MiwgZ290ICVkICIsIGkzMikKIAl9CiAKLQlpNjQsIGVyciA6PSBjbGllbnQuVGVzdEk2NCg0MjQyNDIpCisJaTY0LCBlcnIgOj0gY2xpZW50LlRlc3RJNjQoZGVmYXVsdEN0eCwgNDI0MjQyKQogCWlmIGVyciAhPSBuaWwgewogCQl0LkZhdGFsZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0STY0KCkgY2FsbDogIiwgZXJyKQogCX0KQEAgLTk5LDcgKzExNyw3IEBACiAJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIFRlc3RJNjQoKSByZXN1bHQgZXhwZWN0ZWQgNDI0MjQyLCBnb3QgJWQgIiwgaTY0KQogCX0KIAotCWQsIGVyciA6PSBjbGllbnQuVGVzdERvdWJsZSg0Mi40MikKKwlkLCBlcnIgOj0gY2xpZW50LlRlc3REb3VibGUoZGVmYXVsdEN0eCwgNDIuNDIpCiAJaWYgZXJyICE9IG5pbCB7CiAJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3REb3VibGUoKSBjYWxsOiAiLCBlcnIpCiAJfQpAQCAtMTA3LDEyICsxMjUsMjMgQEAKIAkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgVGVzdERvdWJsZSgpIHJlc3VsdCBleHBlY3RlZCA0Mi40MiwgZ290ICVmICIsIGQpCiAJfQogCisJYmlub3V0IDo9IG1ha2UoW11ieXRlLCAyNTYpCisJZm9yIGkgOj0gMDsgaSA8IDI1NjsgaSsrIHsKKwkJYmlub3V0W2ldID0gYnl0ZShpKQorCX0KKwliaW4sIGVyciA6PSBjbGllbnQuVGVzdEJpbmFyeShkZWZhdWx0Q3R4LCBiaW5vdXQpCisJZm9yIGkgOj0gMDsgaSA8IDI1NjsgaSsrIHsKKwkJaWYgYmlub3V0W2ldICE9IGJpbltpXSB7CisJCQl0LkZhdGFsZigiVW5leHBlY3RlZCBUZXN0QmluYXJ5KCkgcmVzdWx0IGV4cGVjdGVkICVkLCBnb3QgJWQgIiwgYmlub3V0W2ldLCBiaW5baV0pCisJCX0KKwl9CisKIAl4cyA6PSB0aHJpZnR0ZXN0Lk5ld1h0cnVjdCgpCiAJeHMuU3RyaW5nVGhpbmcgPSAidGhpbmciCiAJeHMuQnl0ZVRoaW5nID0gNDIKIAl4cy5JMzJUaGluZyA9IDQyNDIKIAl4cy5JNjRUaGluZyA9IDQyNDI0MgotCXhzcmV0LCBlcnIgOj0gY2xpZW50LlRlc3RTdHJ1Y3QoeHMpCisJeHNyZXQsIGVyciA6PSBjbGllbnQuVGVzdFN0cnVjdChkZWZhdWx0Q3R4LCB4cykKIAlpZiBlcnIgIT0gbmlsIHsKIAkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdFN0cnVjdCgpIGNhbGw6ICIsIGVycikKIAl9CkBAIC0xMjIsNyArMTUxLDcgQEAKIAogCXgyIDo9IHRocmlmdHRlc3QuTmV3WHRydWN0MigpCiAJeDIuU3RydWN0VGhpbmcgPSB4cwotCXgycmV0LCBlcnIgOj0gY2xpZW50LlRlc3ROZXN0KHgyKQorCXgycmV0LCBlcnIgOj0gY2xpZW50LlRlc3ROZXN0KGRlZmF1bHRDdHgsIHgyKQogCWlmIGVyciAhPSBuaWwgewogCQl0LkZhdGFsZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0TmVzdCgpIGNhbGw6ICIsIGVycikKIAl9CkBAIC0xMzEsNyArMTYwLDcgQEAKIAl9CiAKIAltIDo9IG1hcFtpbnQzMl1pbnQzMnsxOiAyLCAzOiA0LCA1OiA0Mn0KLQltcmV0LCBlcnIgOj0gY2xpZW50LlRlc3RNYXAobSkKKwltcmV0LCBlcnIgOj0gY2xpZW50LlRlc3RNYXAoZGVmYXVsdEN0eCwgbSkKIAlpZiBlcnIgIT0gbmlsIHsKIAkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdE1hcCgpIGNhbGw6ICIsIGVycikKIAl9CkBAIC0xNDAsNyArMTY5LDcgQEAKIAl9CiAKIAlzbSA6PSBtYXBbc3RyaW5nXXN0cmluZ3siYSI6ICIyIiwgImIiOiAiYmxhaCIsICJzb21lIjogInRoaW5nIn0KLQlzbXJldCwgZXJyIDo9IGNsaWVudC5UZXN0U3RyaW5nTWFwKHNtKQorCXNtcmV0LCBlcnIgOj0gY2xpZW50LlRlc3RTdHJpbmdNYXAoZGVmYXVsdEN0eCwgc20pCiAJaWYgZXJyICE9IG5pbCB7CiAJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RTdHJpbmdNYXAoKSBjYWxsOiAiLCBlcnIpCiAJfQpAQCAtMTQ4LDI1ICsxNzcsMzIgQEAKIAkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgVGVzdFN0cmluZ01hcCgpIHJlc3VsdCBleHBlY3RlZCAlI3YsIGdvdCAlI3YgIiwgc20sIHNtcmV0KQogCX0KIAotCXMgOj0gbWFwW2ludDMyXWJvb2x7MTogdHJ1ZSwgMjogdHJ1ZSwgNDI6IHRydWV9Ci0Jc3JldCwgZXJyIDo9IGNsaWVudC5UZXN0U2V0KHMpCisJcyA6PSBbXWludDMyezEsIDIsIDQyfQorCXNyZXQsIGVyciA6PSBjbGllbnQuVGVzdFNldChkZWZhdWx0Q3R4LCBzKQogCWlmIGVyciAhPSBuaWwgewogCQl0LkZhdGFsZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0U2V0KCkgY2FsbDogIiwgZXJyKQogCX0KLQlpZiAhcmVmbGVjdC5EZWVwRXF1YWwocywgc3JldCkgewotCQl0LkZhdGFsZigiVW5leHBlY3RlZCBUZXN0U2V0KCkgcmVzdWx0IGV4cGVjdGVkICUjdiwgZ290ICUjdiAiLCBzLCBzcmV0KQorCS8vIFNldHMgY2FuIGJlIGluIGFueSBvcmRlciwgYnV0IEdvIHNsaWNlcyBhcmUgb3JkZXJlZCwgc28gcmVmbGVjdC5EZWVwRXF1YWwgd29uJ3Qgd29yay4KKwlzdGVtcCA6PSBtYXBbaW50MzJdc3RydWN0e317fQorCWZvciBfLCB2YWwgOj0gcmFuZ2UgcyB7CisJCXN0ZW1wW3ZhbF0gPSBzdHJ1Y3R7fXt9CisJfQorCWZvciBfLCB2YWwgOj0gcmFuZ2Ugc3JldCB7CisJCWlmIF8sIG9rIDo9IHN0ZW1wW3ZhbF07ICFvayB7CisJCQl0LkZhdGFsZigiVW5leHBlY3RlZCBUZXN0U2V0KCkgcmVzdWx0IGV4cGVjdGVkICUjdiwgZ290ICUjdiAiLCBzLCBzcmV0KQorCQl9CiAJfQogCiAJbCA6PSBbXWludDMyezEsIDIsIDQyfQotCWxyZXQsIGVyciA6PSBjbGllbnQuVGVzdExpc3QobCkKKwlscmV0LCBlcnIgOj0gY2xpZW50LlRlc3RMaXN0KGRlZmF1bHRDdHgsIGwpCiAJaWYgZXJyICE9IG5pbCB7CiAJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RMaXN0KCkgY2FsbDogIiwgZXJyKQogCX0KIAlpZiAhcmVmbGVjdC5EZWVwRXF1YWwobCwgbHJldCkgewotCQl0LkZhdGFsZigiVW5leHBlY3RlZCBUZXN0U2V0KCkgcmVzdWx0IGV4cGVjdGVkICUjdiwgZ290ICUjdiAiLCBsLCBscmV0KQorCQl0LkZhdGFsZigiVW5leHBlY3RlZCBUZXN0TGlzdCgpIHJlc3VsdCBleHBlY3RlZCAlI3YsIGdvdCAlI3YgIiwgbCwgbHJldCkKIAl9CiAKLQllcmV0LCBlcnIgOj0gY2xpZW50LlRlc3RFbnVtKHRocmlmdHRlc3QuTnVtYmVyel9UV08pCisJZXJldCwgZXJyIDo9IGNsaWVudC5UZXN0RW51bShkZWZhdWx0Q3R4LCB0aHJpZnR0ZXN0Lk51bWJlcnpfVFdPKQogCWlmIGVyciAhPSBuaWwgewogCQl0LkZhdGFsZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0RW51bSgpIGNhbGw6ICIsIGVycikKIAl9CkBAIC0xNzQsNyArMjEwLDcgQEAKIAkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgVGVzdEVudW0oKSByZXN1bHQgZXhwZWN0ZWQgJSN2LCBnb3QgJSN2ICIsIHRocmlmdHRlc3QuTnVtYmVyel9UV08sIGVyZXQpCiAJfQogCi0JdHJldCwgZXJyIDo9IGNsaWVudC5UZXN0VHlwZWRlZih0aHJpZnR0ZXN0LlVzZXJJZCg0MikpCisJdHJldCwgZXJyIDo9IGNsaWVudC5UZXN0VHlwZWRlZihkZWZhdWx0Q3R4LCB0aHJpZnR0ZXN0LlVzZXJJZCg0MikpCiAJaWYgZXJyICE9IG5pbCB7CiAJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RUeXBlZGVmKCkgY2FsbDogIiwgZXJyKQogCX0KQEAgLTE4MiwxNSArMjE4LDUzIEBACiAJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIFRlc3RUeXBlZGVmKCkgcmVzdWx0IGV4cGVjdGVkICUjdiwgZ290ICUjdiAiLCB0aHJpZnR0ZXN0LlVzZXJJZCg0MiksIHRyZXQpCiAJfQogCi0JbWFwbWFwLCBlcnIgOj0gY2xpZW50LlRlc3RNYXBNYXAoNDIpCisJbWFwbWFwLCBlcnIgOj0gY2xpZW50LlRlc3RNYXBNYXAoZGVmYXVsdEN0eCwgNDIpCiAJaWYgZXJyICE9IG5pbCB7Ci0JCXQuRmF0YWxmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RNYXBtYXAoKSBjYWxsOiAiLCBlcnIpCisJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RNYXBNYXAoKSBjYWxsOiAiLCBlcnIpCiAJfQogCWlmICFyZWZsZWN0LkRlZXBFcXVhbChtYXBtYXAsIHJtYXBtYXApIHsKLQkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgVGVzdE1hcG1hcCgpIHJlc3VsdCBleHBlY3RlZCAlI3YsIGdvdCAlI3YgIiwgcm1hcG1hcCwgbWFwbWFwKQorCQl0LkZhdGFsZigiVW5leHBlY3RlZCBUZXN0TWFwTWFwKCkgcmVzdWx0IGV4cGVjdGVkICUjdiwgZ290ICUjdiAiLCBybWFwbWFwLCBtYXBtYXApCiAJfQogCi0JeHhzcmV0LCBlcnIgOj0gY2xpZW50LlRlc3RNdWx0aSg0MiwgNDI0MiwgNDI0MjQyLCBtYXBbaW50MTZdc3RyaW5nezE6ICJibGFoIiwgMjogInRoaW5nIn0sIHRocmlmdHRlc3QuTnVtYmVyel9FSUdIVCwgdGhyaWZ0dGVzdC5Vc2VySWQoMjQpKQorCWNyYXp5IDo9IHRocmlmdHRlc3QuTmV3SW5zYW5pdHkoKQorCWNyYXp5LlVzZXJNYXAgPSBtYXBbdGhyaWZ0dGVzdC5OdW1iZXJ6XXRocmlmdHRlc3QuVXNlcklkeworCQl0aHJpZnR0ZXN0Lk51bWJlcnpfRklWRTogIDUsCisJCXRocmlmdHRlc3QuTnVtYmVyel9FSUdIVDogOCwKKwl9CisJdHJ1Y2sxIDo9IHRocmlmdHRlc3QuTmV3WHRydWN0KCkKKwl0cnVjazEuU3RyaW5nVGhpbmcgPSAiR29vZGJ5ZTQiCisJdHJ1Y2sxLkJ5dGVUaGluZyA9IDQKKwl0cnVjazEuSTMyVGhpbmcgPSA0CisJdHJ1Y2sxLkk2NFRoaW5nID0gNAorCXRydWNrMiA6PSB0aHJpZnR0ZXN0Lk5ld1h0cnVjdCgpCisJdHJ1Y2syLlN0cmluZ1RoaW5nID0gIkhlbGxvMiIKKwl0cnVjazIuQnl0ZVRoaW5nID0gMgorCXRydWNrMi5JMzJUaGluZyA9IDIKKwl0cnVjazIuSTY0VGhpbmcgPSAyCisJY3JhenkuWHRydWN0cyA9IFtdKnRocmlmdHRlc3QuWHRydWN0eworCQl0cnVjazEsCisJCXRydWNrMiwKKwl9CisJaW5zYW5pdHksIGVyciA6PSBjbGllbnQuVGVzdEluc2FuaXR5KGRlZmF1bHRDdHgsIGNyYXp5KQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0SW5zYW5pdHkoKSBjYWxsOiAiLCBlcnIpCisJfQorCWlmICFyZWZsZWN0LkRlZXBFcXVhbChjcmF6eSwgaW5zYW5pdHlbMV1bMl0pIHsKKwkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgVGVzdEluc2FuaXR5KCkgZmlyc3QgcmVzdWx0IGV4cGVjdGVkICUjdiwgZ290ICUjdiAiLAorCQkJY3JhenksCisJCQlpbnNhbml0eVsxXVsyXSkKKwl9CisJaWYgIXJlZmxlY3QuRGVlcEVxdWFsKGNyYXp5LCBpbnNhbml0eVsxXVszXSkgeworCQl0LkZhdGFsZigiVW5leHBlY3RlZCBUZXN0SW5zYW5pdHkoKSBzZWNvbmQgcmVzdWx0IGV4cGVjdGVkICUjdiwgZ290ICUjdiAiLAorCQkJY3JhenksCisJCQlpbnNhbml0eVsxXVszXSkKKwl9CisJaWYgbGVuKGluc2FuaXR5WzJdWzZdLlVzZXJNYXApID4gMCB8fCBsZW4oaW5zYW5pdHlbMl1bNl0uWHRydWN0cykgPiAwIHsKKwkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgVGVzdEluc2FuaXR5KCkgbm9uLWVtcHR5IHJlc3VsdCBnb3QgJSN2ICIsCisJCQlpbnNhbml0eVsyXVs2XSkKKwl9CisKKwl4eHNyZXQsIGVyciA6PSBjbGllbnQuVGVzdE11bHRpKGRlZmF1bHRDdHgsIDQyLCA0MjQyLCA0MjQyNDIsIG1hcFtpbnQxNl1zdHJpbmd7MTogImJsYWgiLCAyOiAidGhpbmcifSwgdGhyaWZ0dGVzdC5OdW1iZXJ6X0VJR0hULCB0aHJpZnR0ZXN0LlVzZXJJZCgyNCkpCiAJaWYgZXJyICE9IG5pbCB7CiAJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RNdWx0aSgpIGNhbGw6ICIsIGVycikKIAl9CkBAIC0xOTgsNyArMjcyLDcgQEAKIAkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgVGVzdE11bHRpKCkgcmVzdWx0IGV4cGVjdGVkICUjdiwgZ290ICUjdiAiLCB4eHMsIHh4c3JldCkKIAl9CiAKLQllcnIgPSBjbGllbnQuVGVzdEV4Y2VwdGlvbigiWGNlcHRpb24iKQorCWVyciA9IGNsaWVudC5UZXN0RXhjZXB0aW9uKGRlZmF1bHRDdHgsICJYY2VwdGlvbiIpCiAJaWYgZXJyID09IG5pbCB7CiAJCXQuRmF0YWxmKCJFeHBlY3RpbmcgZXhjZXB0aW9uIGluIFRlc3RFeGNlcHRpb24oKSBjYWxsIikKIAl9CkBAIC0yMDYsMTQgKzI4MCwxMyBAQAogCQl0LkZhdGFsZigiVW5leHBlY3RlZCBUZXN0RXhjZXB0aW9uKCkgcmVzdWx0IGV4cGVjdGVkICUjdiwgZ290ICUjdiAiLCB4Y2VwdCwgZXJyKQogCX0KIAotCS8vIFRPRE86IGNvbm5lY3Rpb24gaXMgYmVpbmcgY2xvc2VkIG9uIHRoaXMKLQllcnIgPSBjbGllbnQuVGVzdEV4Y2VwdGlvbigiVEV4Y2VwdGlvbiIpCi0JdGV4LCBvayA6PSBlcnIuKHRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24pCi0JaWYgZXJyID09IG5pbCB8fCAhb2sgfHwgdGV4LlR5cGVJZCgpICE9IHRocmlmdC5JTlRFUk5BTF9FUlJPUiB7CisJZXJyID0gY2xpZW50LlRlc3RFeGNlcHRpb24oZGVmYXVsdEN0eCwgIlRFeGNlcHRpb24iKQorCV8sIG9rIDo9IGVyci4odGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbikKKwlpZiBlcnIgPT0gbmlsIHx8ICFvayB7CiAJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIFRlc3RFeGNlcHRpb24oKSByZXN1bHQgZXhwZWN0ZWQgQXBwbGljYXRpb25FcnJvciwgZ290ICUjdiAiLCBlcnIpCiAJfQogCi0JaWduLCBlcnIgOj0gY2xpZW50LlRlc3RNdWx0aUV4Y2VwdGlvbigiWGNlcHRpb24iLCAiaWdub3JlbWUiKQorCWlnbiwgZXJyIDo9IGNsaWVudC5UZXN0TXVsdGlFeGNlcHRpb24oZGVmYXVsdEN0eCwgIlhjZXB0aW9uIiwgImlnbm9yZW1lIikKIAlpZiBpZ24gIT0gbmlsIHx8IGVyciA9PSBuaWwgewogCQl0LkZhdGFsZigiRXhwZWN0aW5nIGV4Y2VwdGlvbiBpbiBUZXN0TXVsdGlFeGNlcHRpb24oKSBjYWxsIikKIAl9CkBAIC0yMjEsNyArMjk0LDcgQEAKIAkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgVGVzdE11bHRpRXhjZXB0aW9uKCkgJSN2ICIsIGVycikKIAl9CiAKLQlpZ24sIGVyciA9IGNsaWVudC5UZXN0TXVsdGlFeGNlcHRpb24oIlhjZXB0aW9uMiIsICJpZ25vcmVtZSIpCisJaWduLCBlcnIgPSBjbGllbnQuVGVzdE11bHRpRXhjZXB0aW9uKGRlZmF1bHRDdHgsICJYY2VwdGlvbjIiLCAiaWdub3JlbWUiKQogCWlmIGlnbiAhPSBuaWwgfHwgZXJyID09IG5pbCB7CiAJCXQuRmF0YWxmKCJFeHBlY3RpbmcgZXhjZXB0aW9uIGluIFRlc3RNdWx0aUV4Y2VwdGlvbigpIGNhbGwiKQogCX0KQEAgLTIzMSwxMyArMzA0LDEzIEBACiAJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIFRlc3RNdWx0aUV4Y2VwdGlvbigpICUjdiAiLCBlcnIpCiAJfQogCi0JZXJyID0gY2xpZW50LlRlc3RPbmV3YXkoMikKKwllcnIgPSBjbGllbnQuVGVzdE9uZXdheShkZWZhdWx0Q3R4LCAyKQogCWlmIGVyciAhPSBuaWwgewogCQl0LkZhdGFsZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0T25ld2F5KCkgY2FsbDogIiwgZXJyKQogCX0KIAogCS8vTWFrZSBzdXJlIHRoZSBjb25uZWN0aW9uIHN0aWxsIGFsaXZlCi0JaWYgZXJyID0gY2xpZW50LlRlc3RWb2lkKCk7IGVyciAhPSBuaWwgeworCWlmIGVyciA9IGNsaWVudC5UZXN0Vm9pZChkZWZhdWx0Q3R4KTsgZXJyICE9IG5pbCB7CiAJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RWb2lkKCkgY2FsbDogIiwgZXJyKQogCX0KIH0KZGlmZiAtLWdpdCBhL3Rlc3QvZ28vc3JjL2Jpbi90ZXN0c2VydmVyL21haW4uZ28gYi90ZXN0L2dvL3NyYy9iaW4vdGVzdHNlcnZlci9tYWluLmdvCmluZGV4IGNkMzJmOTIuLmNhMmQ5NjcgMTAwNjQ0Ci0tLSBhL3Rlc3QvZ28vc3JjL2Jpbi90ZXN0c2VydmVyL21haW4uZ28KKysrIGIvdGVzdC9nby9zcmMvYmluL3Rlc3RzZXJ2ZXIvbWFpbi5nbwpAQCAtMjIsMjEgKzIyLDUwIEBACiBpbXBvcnQgKAogCSJjb21tb24iCiAJImZsYWciCisJImZtdCIKIAkibG9nIgorCSJuZXQvaHR0cCIKKwkidGhyaWZ0IgogKQogCiB2YXIgaG9zdCA9IGZsYWcuU3RyaW5nKCJob3N0IiwgImxvY2FsaG9zdCIsICJIb3N0IHRvIGNvbm5lY3QiKQogdmFyIHBvcnQgPSBmbGFnLkludDY0KCJwb3J0IiwgOTA5MCwgIlBvcnQgbnVtYmVyIHRvIGNvbm5lY3QiKQogdmFyIGRvbWFpbl9zb2NrZXQgPSBmbGFnLlN0cmluZygiZG9tYWluLXNvY2tldCIsICIiLCAiRG9tYWluIFNvY2tldCAoZS5nLiAvdG1wL1RocmlmdFRlc3QudGhyaWZ0KSwgaW5zdGVhZCBvZiBob3N0IGFuZCBwb3J0IikKLXZhciB0cmFuc3BvcnQgPSBmbGFnLlN0cmluZygidHJhbnNwb3J0IiwgImJ1ZmZlcmVkIiwgIlRyYW5zcG9ydDogYnVmZmVyZWQsIGZyYW1lZCwgaHR0cCIpCit2YXIgdHJhbnNwb3J0ID0gZmxhZy5TdHJpbmcoInRyYW5zcG9ydCIsICJidWZmZXJlZCIsICJUcmFuc3BvcnQ6IGJ1ZmZlcmVkLCBmcmFtZWQsIGh0dHAsIHpsaWIiKQogdmFyIHByb3RvY29sID0gZmxhZy5TdHJpbmcoInByb3RvY29sIiwgImJpbmFyeSIsICJQcm90b2NvbDogYmluYXJ5LCBjb21wYWN0LCBqc29uIikKIHZhciBzc2wgPSBmbGFnLkJvb2woInNzbCIsIGZhbHNlLCAiRW5jcnlwdGVkIFRyYW5zcG9ydCB1c2luZyBTU0wiKQordmFyIHpsaWIgPSBmbGFnLkJvb2woInpsaWIiLCBmYWxzZSwgIldyYXBwZWQgVHJhbnNwb3J0IHVzaW5nIFpsaWIiKQordmFyIGNlcnRQYXRoID0gZmxhZy5TdHJpbmcoImNlcnRQYXRoIiwgImtleXMiLCAiRGlyZWN0b3J5IHRoYXQgY29udGFpbnMgU1NMIGNlcnRpZmljYXRlcyIpCiAKIGZ1bmMgbWFpbigpIHsKIAlmbGFnLlBhcnNlKCkKLQlzZXJ2ZXIsIGVyciA6PSBjb21tb24uU3RhcnRTZXJ2ZXIoKmhvc3QsICpwb3J0LCAqZG9tYWluX3NvY2tldCwgKnRyYW5zcG9ydCwgKnByb3RvY29sLCAqc3NsLCBjb21tb24uUHJpbnRpbmdIYW5kbGVyKQorCisJcHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSwgZXJyIDo9IGNvbW1vbi5HZXRTZXJ2ZXJQYXJhbXMoKmhvc3QsICpwb3J0LCAqZG9tYWluX3NvY2tldCwgKnRyYW5zcG9ydCwgKnByb3RvY29sLCAqc3NsLCAqY2VydFBhdGgsIGNvbW1vbi5QcmludGluZ0hhbmRsZXIpCisKIAlpZiBlcnIgIT0gbmlsIHsKLQkJbG9nLkZhdGFsZigiVW5hYmxlIHRvIHN0YXJ0IHNlcnZlcjogIiwgZXJyKQorCQlsb2cuRmF0YWxmKCJVbmFibGUgdG8gcHJvY2VzcyBzZXJ2ZXIgcGFyYW1zOiAiLCBlcnIpCiAJfQotCXNlcnZlci5TZXJ2ZSgpCisKKwlpZiAqdHJhbnNwb3J0ID09ICJodHRwIiB7CisJCWh0dHAuSGFuZGxlRnVuYygiLyIsIHRocmlmdC5OZXdUaHJpZnRIYW5kbGVyRnVuYyhwcm9jZXNzb3IsIHByb3RvY29sRmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KSkKKworCQlpZiAqc3NsIHsKKwkJCWVyciA6PSBodHRwLkxpc3RlbkFuZFNlcnZlVExTKGZtdC5TcHJpbnRmKCI6JWQiLCAqcG9ydCksCisJCQkJKmNlcnRQYXRoKyIvc2VydmVyLnBlbSIsICpjZXJ0UGF0aCsiL3NlcnZlci5rZXkiLCBuaWwpCisKKwkJCWlmIGVyciAhPSBuaWwgeworCQkJCWZtdC5QcmludGxuKGVycikKKwkJCQlyZXR1cm4KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWh0dHAuTGlzdGVuQW5kU2VydmUoZm10LlNwcmludGYoIjolZCIsICpwb3J0KSwgbmlsKQorCQl9CisJfSBlbHNlIHsKKwkJc2VydmVyIDo9IHRocmlmdC5OZXdUU2ltcGxlU2VydmVyNChwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KQorCQlpZiBlcnIgPSBzZXJ2ZXIuTGlzdGVuKCk7IGVyciAhPSBuaWwgeworCQkJcmV0dXJuCisJCX0KKwkJZ28gc2VydmVyLkFjY2VwdExvb3AoKQorCQlzZXJ2ZXIuU2VydmUoKQorCX0KIH0KZGlmZiAtLWdpdCBhL3Rlc3QvZ28vc3JjL2NvbW1vbi9jbGllbnQuZ28gYi90ZXN0L2dvL3NyYy9jb21tb24vY2xpZW50LmdvCmluZGV4IDI2NzI3M2UuLjIzNmNlNDMgMTAwNjQ0Ci0tLSBhL3Rlc3QvZ28vc3JjL2NvbW1vbi9jbGllbnQuZ28KKysrIGIvdGVzdC9nby9zcmMvY29tbW9uL2NsaWVudC5nbwpAQCAtMjAsMTAgKzIwLDEyIEBACiBwYWNrYWdlIGNvbW1vbgogCiBpbXBvcnQgKAorCSJjb21wcmVzcy96bGliIgogCSJjcnlwdG8vdGxzIgogCSJmbGFnIgogCSJmbXQiCiAJImdlbi90aHJpZnR0ZXN0IgorCSJuZXQvaHR0cCIKIAkidGhyaWZ0IgogKQogCkBAIC0zOSw3ICs0MSw3IEBACiAJZG9tYWluX3NvY2tldCBzdHJpbmcsCiAJdHJhbnNwb3J0IHN0cmluZywKIAlwcm90b2NvbCBzdHJpbmcsCi0Jc3NsIGJvb2wpIChjbGllbnQgKnRocmlmdHRlc3QuVGhyaWZ0VGVzdENsaWVudCwgZXJyIGVycm9yKSB7CisJc3NsIGJvb2wpIChjbGllbnQgKnRocmlmdHRlc3QuVGhyaWZ0VGVzdENsaWVudCwgdHJhbnMgdGhyaWZ0LlRUcmFuc3BvcnQsIGVyciBlcnJvcikgewogCiAJaG9zdFBvcnQgOj0gZm10LlNwcmludGYoIiVzOiVkIiwgaG9zdCwgcG9ydCkKIApAQCAtNTQsMTIgKzU2LDExIEBACiAJY2FzZSAiYmluYXJ5IjoKIAkJcHJvdG9jb2xGYWN0b3J5ID0gdGhyaWZ0Lk5ld1RCaW5hcnlQcm90b2NvbEZhY3RvcnlEZWZhdWx0KCkKIAlkZWZhdWx0OgotCQlyZXR1cm4gbmlsLCBmbXQuRXJyb3JmKCJJbnZhbGlkIHByb3RvY29sIHNwZWNpZmllZCAlcyIsIHByb3RvY29sKQorCQlyZXR1cm4gbmlsLCBuaWwsIGZtdC5FcnJvcmYoIkludmFsaWQgcHJvdG9jb2wgc3BlY2lmaWVkICVzIiwgcHJvdG9jb2wpCiAJfQogCWlmIGRlYnVnQ2xpZW50UHJvdG9jb2wgewogCQlwcm90b2NvbEZhY3RvcnkgPSB0aHJpZnQuTmV3VERlYnVnUHJvdG9jb2xGYWN0b3J5KHByb3RvY29sRmFjdG9yeSwgImNsaWVudDoiKQogCX0KLQl2YXIgdHJhbnMgdGhyaWZ0LlRUcmFuc3BvcnQKIAlpZiBzc2wgewogCQl0cmFucywgZXJyID0gdGhyaWZ0Lk5ld1RTU0xTb2NrZXQoaG9zdFBvcnQsICZ0bHMuQ29uZmlne0luc2VjdXJlU2tpcFZlcmlmeTogdHJ1ZX0pCiAJfSBlbHNlIHsKQEAgLTcwLDI3ICs3MSwzOSBAQAogCQl9CiAJfQogCWlmIGVyciAhPSBuaWwgewotCQlyZXR1cm4gbmlsLCBlcnIKKwkJcmV0dXJuIG5pbCwgbmlsLCBlcnIKIAl9CiAJc3dpdGNoIHRyYW5zcG9ydCB7CiAJY2FzZSAiaHR0cCI6Ci0JCXRyYW5zLCBlcnIgPSB0aHJpZnQuTmV3VEh0dHBDbGllbnQoZm10LlNwcmludGYoImh0dHA6Ly8lcy9zZXJ2aWNlIiwgaG9zdFBvcnQpKQotCQlpZiBlcnIgIT0gbmlsIHsKLQkJCXJldHVybiBuaWwsIGVycgorCQlpZiBzc2wgeworCQkJdHIgOj0gJmh0dHAuVHJhbnNwb3J0eworCQkJCVRMU0NsaWVudENvbmZpZzogJnRscy5Db25maWd7SW5zZWN1cmVTa2lwVmVyaWZ5OiB0cnVlfSwKKwkJCX0KKwkJCWNsaWVudCA6PSAmaHR0cC5DbGllbnR7VHJhbnNwb3J0OiB0cn0KKwkJCXRyYW5zLCBlcnIgPSB0aHJpZnQuTmV3VEh0dHBQb3N0Q2xpZW50V2l0aE9wdGlvbnMoZm10LlNwcmludGYoImh0dHBzOi8vJXMvIiwgaG9zdFBvcnQpLCB0aHJpZnQuVEh0dHBDbGllbnRPcHRpb25ze0NsaWVudDogY2xpZW50fSkKKwkJCWZtdC5QcmludGxuKGhvc3RQb3J0KQorCQl9IGVsc2UgeworCQkJdHJhbnMsIGVyciA9IHRocmlmdC5OZXdUSHR0cFBvc3RDbGllbnQoZm10LlNwcmludGYoImh0dHA6Ly8lcy8iLCBob3N0UG9ydCkpCiAJCX0KIAljYXNlICJmcmFtZWQiOgogCQl0cmFucyA9IHRocmlmdC5OZXdURnJhbWVkVHJhbnNwb3J0KHRyYW5zKQogCWNhc2UgImJ1ZmZlcmVkIjoKIAkJdHJhbnMgPSB0aHJpZnQuTmV3VEJ1ZmZlcmVkVHJhbnNwb3J0KHRyYW5zLCA4MTkyKQorCWNhc2UgInpsaWIiOgorCQl0cmFucywgZXJyID0gdGhyaWZ0Lk5ld1RabGliVHJhbnNwb3J0KHRyYW5zLCB6bGliLkJlc3RDb21wcmVzc2lvbikKIAljYXNlICIiOgogCQl0cmFucyA9IHRyYW5zCiAJZGVmYXVsdDoKLQkJcmV0dXJuIG5pbCwgZm10LkVycm9yZigiSW52YWxpZCB0cmFuc3BvcnQgc3BlY2lmaWVkICVzIiwgdHJhbnNwb3J0KQorCQlyZXR1cm4gbmlsLCBuaWwsIGZtdC5FcnJvcmYoIkludmFsaWQgdHJhbnNwb3J0IHNwZWNpZmllZCAlcyIsIHRyYW5zcG9ydCkKIAl9Ci0KKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIG5pbCwgbmlsLCBlcnIKKwl9CiAJaWYgZXJyID0gdHJhbnMuT3BlbigpOyBlcnIgIT0gbmlsIHsKLQkJcmV0dXJuIG5pbCwgZXJyCisJCXJldHVybiBuaWwsIG5pbCwgZXJyCiAJfQotCWNsaWVudCA9IHRocmlmdHRlc3QuTmV3VGhyaWZ0VGVzdENsaWVudEZhY3RvcnkodHJhbnMsIHByb3RvY29sRmFjdG9yeSkKKwlpcHJvdCA6PSBwcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wodHJhbnMpCisJb3Byb3QgOj0gcHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHRyYW5zKQorCWNsaWVudCA9IHRocmlmdHRlc3QuTmV3VGhyaWZ0VGVzdENsaWVudCh0aHJpZnQuTmV3VFN0YW5kYXJkQ2xpZW50KGlwcm90LCBvcHJvdCkpCiAJcmV0dXJuCiB9CmRpZmYgLS1naXQgYS90ZXN0L2dvL3NyYy9jb21tb24vY2xpZW50c2VydmVyX3Rlc3QuZ28gYi90ZXN0L2dvL3NyYy9jb21tb24vY2xpZW50c2VydmVyX3Rlc3QuZ28KaW5kZXggOGFkZDA0MS4uOWY5M2M0YyAxMDA2NDQKLS0tIGEvdGVzdC9nby9zcmMvY29tbW9uL2NsaWVudHNlcnZlcl90ZXN0LmdvCisrKyBiL3Rlc3QvZ28vc3JjL2NvbW1vbi9jbGllbnRzZXJ2ZXJfdGVzdC5nbwpAQCAtMjAsMTIgKzIwLDE1IEBACiBwYWNrYWdlIGNvbW1vbgogCiBpbXBvcnQgKAotCSJjb2RlLmdvb2dsZS5jb20vcC9nb21vY2svZ29tb2NrIgorCSJjb250ZXh0IgogCSJlcnJvcnMiCiAJImdlbi90aHJpZnR0ZXN0IgogCSJyZWZsZWN0IgorCSJzeW5jIgogCSJ0ZXN0aW5nIgogCSJ0aHJpZnQiCisKKwkiZ2l0aHViLmNvbS9nb2xhbmcvbW9jay9nb21vY2siCiApCiAKIHR5cGUgdGVzdF91bml0IHN0cnVjdCB7CkBAIC0zOCw3ICs0MSw3IEBACiB9CiAKIHZhciB1bml0cyA9IFtddGVzdF91bml0ewotCXsiMTI3LjAuMC4xIiwgOTA5MCwgIiIsICIiLCAiYmluYXJ5IiwgZmFsc2V9LAorCXsiMTI3LjAuMC4xIiwgOTA5NSwgIiIsICIiLCAiYmluYXJ5IiwgZmFsc2V9LAogCXsiMTI3LjAuMC4xIiwgOTA5MSwgIiIsICIiLCAiY29tcGFjdCIsIGZhbHNlfSwKIAl7IjEyNy4wLjAuMSIsIDkwOTIsICIiLCAiIiwgImJpbmFyeSIsIHRydWV9LAogCXsiMTI3LjAuMC4xIiwgOTA5MywgIiIsICIiLCAiY29tcGFjdCIsIHRydWV9LApAQCAtNDYsMjggKzQ5LDM3IEBACiAKIGZ1bmMgVGVzdEFsbENvbm5lY3Rpb24odCAqdGVzdGluZy5UKSB7CiAJY2VydFBhdGggPSAiLi4vLi4vLi4va2V5cyIKKwl3ZyA6PSAmc3luYy5XYWl0R3JvdXB7fQorCXdnLkFkZChsZW4odW5pdHMpKQogCWZvciBfLCB1bml0IDo9IHJhbmdlIHVuaXRzIHsKLQkJdC5Mb2dmKCIlI3YiLCB1bml0KQotCQlkb1VuaXQodCwgJnVuaXQpCisJCWdvIGZ1bmModSB0ZXN0X3VuaXQpIHsKKwkJCWRlZmVyIHdnLkRvbmUoKQorCQkJZG9Vbml0KHQsICZ1KQorCQl9KHVuaXQpCiAJfQorCXdnLldhaXQoKQogfQogCiBmdW5jIGRvVW5pdCh0ICp0ZXN0aW5nLlQsIHVuaXQgKnRlc3RfdW5pdCkgewogCWN0cmwgOj0gZ29tb2NrLk5ld0NvbnRyb2xsZXIodCkKIAlkZWZlciBjdHJsLkZpbmlzaCgpCiAJaGFuZGxlciA6PSBOZXdNb2NrVGhyaWZ0VGVzdChjdHJsKQotCXNlcnZlciwgZXJyIDo9IFN0YXJ0U2VydmVyKHVuaXQuaG9zdCwgdW5pdC5wb3J0LCB1bml0LmRvbWFpbl9zb2NrZXQsIHVuaXQudHJhbnNwb3J0LCB1bml0LnByb3RvY29sLCB1bml0LnNzbCwgaGFuZGxlcikKLQlpZiBlcnIgIT0gbmlsIHsKLQkJdC5FcnJvcmYoIlVuYWJsZSB0byBzdGFydCBzZXJ2ZXIiLCBlcnIpCi0JCXQuRmFpbE5vdygpCisKKwlwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5LCBlcnIgOj0gR2V0U2VydmVyUGFyYW1zKHVuaXQuaG9zdCwgdW5pdC5wb3J0LCB1bml0LmRvbWFpbl9zb2NrZXQsIHVuaXQudHJhbnNwb3J0LCB1bml0LnByb3RvY29sLCB1bml0LnNzbCwgIi4uLy4uLy4uL2tleXMiLCBoYW5kbGVyKQorCisJc2VydmVyIDo9IHRocmlmdC5OZXdUU2ltcGxlU2VydmVyNChwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KQorCWlmIGVyciA9IHNlcnZlci5MaXN0ZW4oKTsgZXJyICE9IG5pbCB7CisJCXQuRXJyb3JmKCJVbmFibGUgdG8gc3RhcnQgc2VydmVyOiAldiIsIGVycikKKwkJcmV0dXJuCiAJfQorCWdvIHNlcnZlci5BY2NlcHRMb29wKCkKIAlkZWZlciBzZXJ2ZXIuU3RvcCgpCi0JY2xpZW50LCBlcnIgOj0gU3RhcnRDbGllbnQodW5pdC5ob3N0LCB1bml0LnBvcnQsIHVuaXQuZG9tYWluX3NvY2tldCwgdW5pdC50cmFuc3BvcnQsIHVuaXQucHJvdG9jb2wsIHVuaXQuc3NsKQorCWNsaWVudCwgdHJhbnMsIGVyciA6PSBTdGFydENsaWVudCh1bml0Lmhvc3QsIHVuaXQucG9ydCwgdW5pdC5kb21haW5fc29ja2V0LCB1bml0LnRyYW5zcG9ydCwgdW5pdC5wcm90b2NvbCwgdW5pdC5zc2wpCiAJaWYgZXJyICE9IG5pbCB7Ci0JCXQuRXJyb3JmKCJVbmFibGUgdG8gc3RhcnQgY2xpZW50IiwgZXJyKQotCQl0LkZhaWxOb3coKQorCQl0LkVycm9yZigiVW5hYmxlIHRvIHN0YXJ0IGNsaWVudDogJXYiLCBlcnIpCisJCXJldHVybgogCX0KLQlkZWZlciBjbGllbnQuVHJhbnNwb3J0LkNsb3NlKCkKKwlkZWZlciB0cmFucy5DbG9zZSgpCiAJY2FsbEV2ZXJ5dGhpbmdXaXRoTW9jayh0LCBjbGllbnQsIGhhbmRsZXIpCiB9CiAKQEAgLTg0LDg2ICs5NiwxMDcgQEAKIH0KIAogdmFyIHhjZXB0ID0gJnRocmlmdHRlc3QuWGNlcHRpb257RXJyb3JDb2RlOiAxMDAxLCBNZXNzYWdlOiAic29tZSJ9Cit2YXIgZGVmYXVsdEN0eCA9IGNvbnRleHQuQmFja2dyb3VuZCgpCiAKIGZ1bmMgY2FsbEV2ZXJ5dGhpbmdXaXRoTW9jayh0ICp0ZXN0aW5nLlQsIGNsaWVudCAqdGhyaWZ0dGVzdC5UaHJpZnRUZXN0Q2xpZW50LCBoYW5kbGVyICpNb2NrVGhyaWZ0VGVzdCkgewogCWdvbW9jay5Jbk9yZGVyKAotCQloYW5kbGVyLkVYUEVDVCgpLlRlc3RWb2lkKCksCi0JCWhhbmRsZXIuRVhQRUNUKCkuVGVzdFN0cmluZygidGhpbmciKS5SZXR1cm4oInRoaW5nIiwgbmlsKSwKLQkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0Qnl0ZShpbnQ4KDQyKSkuUmV0dXJuKGludDgoNDIpLCBuaWwpLAotCQloYW5kbGVyLkVYUEVDVCgpLlRlc3RJMzIoaW50MzIoNDI0MikpLlJldHVybihpbnQzMig0MjQyKSwgbmlsKSwKLQkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0STY0KGludDY0KDQyNDI0MikpLlJldHVybihpbnQ2NCg0MjQyNDIpLCBuaWwpLAotCQloYW5kbGVyLkVYUEVDVCgpLlRlc3REb3VibGUoZmxvYXQ2NCg0Mi40MikpLlJldHVybihmbG9hdDY0KDQyLjQyKSwgbmlsKSwKLQkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0U3RydWN0KCZ0aHJpZnR0ZXN0Llh0cnVjdHtTdHJpbmdUaGluZzogInRoaW5nIiwgQnl0ZVRoaW5nOiA0MiwgSTMyVGhpbmc6IDQyNDIsIEk2NFRoaW5nOiA0MjQyNDJ9KS5SZXR1cm4oJnRocmlmdHRlc3QuWHRydWN0e1N0cmluZ1RoaW5nOiAidGhpbmciLCBCeXRlVGhpbmc6IDQyLCBJMzJUaGluZzogNDI0MiwgSTY0VGhpbmc6IDQyNDI0Mn0sIG5pbCksCi0JCWhhbmRsZXIuRVhQRUNUKCkuVGVzdE5lc3QoJnRocmlmdHRlc3QuWHRydWN0MntTdHJ1Y3RUaGluZzogJnRocmlmdHRlc3QuWHRydWN0e1N0cmluZ1RoaW5nOiAidGhpbmciLCBCeXRlVGhpbmc6IDQyLCBJMzJUaGluZzogNDI0MiwgSTY0VGhpbmc6IDQyNDI0Mn19KS5SZXR1cm4oJnRocmlmdHRlc3QuWHRydWN0MntTdHJ1Y3RUaGluZzogJnRocmlmdHRlc3QuWHRydWN0e1N0cmluZ1RoaW5nOiAidGhpbmciLCBCeXRlVGhpbmc6IDQyLCBJMzJUaGluZzogNDI0MiwgSTY0VGhpbmc6IDQyNDI0Mn19LCBuaWwpLAotCQloYW5kbGVyLkVYUEVDVCgpLlRlc3RNYXAobWFwW2ludDMyXWludDMyezE6IDIsIDM6IDQsIDU6IDQyfSkuUmV0dXJuKG1hcFtpbnQzMl1pbnQzMnsxOiAyLCAzOiA0LCA1OiA0Mn0sIG5pbCksCi0JCWhhbmRsZXIuRVhQRUNUKCkuVGVzdFN0cmluZ01hcChtYXBbc3RyaW5nXXN0cmluZ3siYSI6ICIyIiwgImIiOiAiYmxhaCIsICJzb21lIjogInRoaW5nIn0pLlJldHVybihtYXBbc3RyaW5nXXN0cmluZ3siYSI6ICIyIiwgImIiOiAiYmxhaCIsICJzb21lIjogInRoaW5nIn0sIG5pbCksCi0JCWhhbmRsZXIuRVhQRUNUKCkuVGVzdFNldChtYXBbaW50MzJdYm9vbHsxOiB0cnVlLCAyOiB0cnVlLCA0MjogdHJ1ZX0pLlJldHVybihtYXBbaW50MzJdYm9vbHsxOiB0cnVlLCAyOiB0cnVlLCA0MjogdHJ1ZX0sIG5pbCksCi0JCWhhbmRsZXIuRVhQRUNUKCkuVGVzdExpc3QoW11pbnQzMnsxLCAyLCA0Mn0pLlJldHVybihbXWludDMyezEsIDIsIDQyfSwgbmlsKSwKLQkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0RW51bSh0aHJpZnR0ZXN0Lk51bWJlcnpfVFdPKS5SZXR1cm4odGhyaWZ0dGVzdC5OdW1iZXJ6X1RXTywgbmlsKSwKLQkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0VHlwZWRlZih0aHJpZnR0ZXN0LlVzZXJJZCg0MikpLlJldHVybih0aHJpZnR0ZXN0LlVzZXJJZCg0MiksIG5pbCksCi0JCWhhbmRsZXIuRVhQRUNUKCkuVGVzdE1hcE1hcChpbnQzMig0MikpLlJldHVybihybWFwbWFwLCBuaWwpLAotCQkvL25vdCB0ZXN0aW5nIGluc2FuaXR5Ci0JCWhhbmRsZXIuRVhQRUNUKCkuVGVzdE11bHRpKGludDgoNDIpLCBpbnQzMig0MjQyKSwgaW50NjQoNDI0MjQyKSwgbWFwW2ludDE2XXN0cmluZ3sxOiAiYmxhaCIsIDI6ICJ0aGluZyJ9LCB0aHJpZnR0ZXN0Lk51bWJlcnpfRUlHSFQsIHRocmlmdHRlc3QuVXNlcklkKDI0KSkuUmV0dXJuKHh4cywgbmlsKSwKLQkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0RXhjZXB0aW9uKCJzb21lIikuUmV0dXJuKHhjZXB0KSwKLQkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0RXhjZXB0aW9uKCJURXhjZXB0aW9uIikuUmV0dXJuKGVycm9ycy5OZXcoIkp1c3QgcmFuZG9tIGV4Y2VwdGlvbiIpKSwKLQkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0TXVsdGlFeGNlcHRpb24oIlhjZXB0aW9uIiwgImlnbm9yZW1lIikuUmV0dXJuKG5pbCwgJnRocmlmdHRlc3QuWGNlcHRpb257RXJyb3JDb2RlOiAxMDAxLCBNZXNzYWdlOiAiVGhpcyBpcyBhbiBYY2VwdGlvbiJ9KSwKLQkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0TXVsdGlFeGNlcHRpb24oIlhjZXB0aW9uMiIsICJpZ25vcmVtZSIpLlJldHVybihuaWwsICZ0aHJpZnR0ZXN0LlhjZXB0aW9uMntFcnJvckNvZGU6IDIwMDIsIFN0cnVjdFRoaW5nOiAmdGhyaWZ0dGVzdC5YdHJ1Y3R7U3RyaW5nVGhpbmc6ICJUaGlzIGlzIGFuIFhjZXB0aW9uMiJ9fSksCi0JCWhhbmRsZXIuRVhQRUNUKCkuVGVzdE9uZXdheShpbnQzMigyKSkuUmV0dXJuKG5pbCksCi0JCWhhbmRsZXIuRVhQRUNUKCkuVGVzdFZvaWQoKSwKKwkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0Vm9pZChnb21vY2suQW55KCkpLAorCQloYW5kbGVyLkVYUEVDVCgpLlRlc3RTdHJpbmcoZ29tb2NrLkFueSgpLCAidGhpbmciKS5SZXR1cm4oInRoaW5nIiwgbmlsKSwKKwkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0Qm9vbChnb21vY2suQW55KCksIHRydWUpLlJldHVybih0cnVlLCBuaWwpLAorCQloYW5kbGVyLkVYUEVDVCgpLlRlc3RCb29sKGdvbW9jay5BbnkoKSwgZmFsc2UpLlJldHVybihmYWxzZSwgbmlsKSwKKwkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0Qnl0ZShnb21vY2suQW55KCksIGludDgoNDIpKS5SZXR1cm4oaW50OCg0MiksIG5pbCksCisJCWhhbmRsZXIuRVhQRUNUKCkuVGVzdEkzMihnb21vY2suQW55KCksIGludDMyKDQyNDIpKS5SZXR1cm4oaW50MzIoNDI0MiksIG5pbCksCisJCWhhbmRsZXIuRVhQRUNUKCkuVGVzdEk2NChnb21vY2suQW55KCksIGludDY0KDQyNDI0MikpLlJldHVybihpbnQ2NCg0MjQyNDIpLCBuaWwpLAorCQkvLyBUT0RPOiBhZGQgVGVzdEJpbmFyeSgpCisJCWhhbmRsZXIuRVhQRUNUKCkuVGVzdERvdWJsZShnb21vY2suQW55KCksIGZsb2F0NjQoNDIuNDIpKS5SZXR1cm4oZmxvYXQ2NCg0Mi40MiksIG5pbCksCisJCWhhbmRsZXIuRVhQRUNUKCkuVGVzdFN0cnVjdChnb21vY2suQW55KCksICZ0aHJpZnR0ZXN0Llh0cnVjdHtTdHJpbmdUaGluZzogInRoaW5nIiwgQnl0ZVRoaW5nOiA0MiwgSTMyVGhpbmc6IDQyNDIsIEk2NFRoaW5nOiA0MjQyNDJ9KS5SZXR1cm4oJnRocmlmdHRlc3QuWHRydWN0e1N0cmluZ1RoaW5nOiAidGhpbmciLCBCeXRlVGhpbmc6IDQyLCBJMzJUaGluZzogNDI0MiwgSTY0VGhpbmc6IDQyNDI0Mn0sIG5pbCksCisJCWhhbmRsZXIuRVhQRUNUKCkuVGVzdE5lc3QoZ29tb2NrLkFueSgpLCAmdGhyaWZ0dGVzdC5YdHJ1Y3Qye1N0cnVjdFRoaW5nOiAmdGhyaWZ0dGVzdC5YdHJ1Y3R7U3RyaW5nVGhpbmc6ICJ0aGluZyIsIEJ5dGVUaGluZzogNDIsIEkzMlRoaW5nOiA0MjQyLCBJNjRUaGluZzogNDI0MjQyfX0pLlJldHVybigmdGhyaWZ0dGVzdC5YdHJ1Y3Qye1N0cnVjdFRoaW5nOiAmdGhyaWZ0dGVzdC5YdHJ1Y3R7U3RyaW5nVGhpbmc6ICJ0aGluZyIsIEJ5dGVUaGluZzogNDIsIEkzMlRoaW5nOiA0MjQyLCBJNjRUaGluZzogNDI0MjQyfX0sIG5pbCksCisJCWhhbmRsZXIuRVhQRUNUKCkuVGVzdE1hcChnb21vY2suQW55KCksIG1hcFtpbnQzMl1pbnQzMnsxOiAyLCAzOiA0LCA1OiA0Mn0pLlJldHVybihtYXBbaW50MzJdaW50MzJ7MTogMiwgMzogNCwgNTogNDJ9LCBuaWwpLAorCQloYW5kbGVyLkVYUEVDVCgpLlRlc3RTdHJpbmdNYXAoZ29tb2NrLkFueSgpLCBtYXBbc3RyaW5nXXN0cmluZ3siYSI6ICIyIiwgImIiOiAiYmxhaCIsICJzb21lIjogInRoaW5nIn0pLlJldHVybihtYXBbc3RyaW5nXXN0cmluZ3siYSI6ICIyIiwgImIiOiAiYmxhaCIsICJzb21lIjogInRoaW5nIn0sIG5pbCksCisJCWhhbmRsZXIuRVhQRUNUKCkuVGVzdFNldChnb21vY2suQW55KCksIFtdaW50MzJ7MSwgMiwgNDJ9KS5SZXR1cm4oW11pbnQzMnsxLCAyLCA0Mn0sIG5pbCksCisJCWhhbmRsZXIuRVhQRUNUKCkuVGVzdExpc3QoZ29tb2NrLkFueSgpLCBbXWludDMyezEsIDIsIDQyfSkuUmV0dXJuKFtdaW50MzJ7MSwgMiwgNDJ9LCBuaWwpLAorCQloYW5kbGVyLkVYUEVDVCgpLlRlc3RFbnVtKGdvbW9jay5BbnkoKSwgdGhyaWZ0dGVzdC5OdW1iZXJ6X1RXTykuUmV0dXJuKHRocmlmdHRlc3QuTnVtYmVyel9UV08sIG5pbCksCisJCWhhbmRsZXIuRVhQRUNUKCkuVGVzdFR5cGVkZWYoZ29tb2NrLkFueSgpLCB0aHJpZnR0ZXN0LlVzZXJJZCg0MikpLlJldHVybih0aHJpZnR0ZXN0LlVzZXJJZCg0MiksIG5pbCksCisJCWhhbmRsZXIuRVhQRUNUKCkuVGVzdE1hcE1hcChnb21vY2suQW55KCksIGludDMyKDQyKSkuUmV0dXJuKHJtYXBtYXAsIG5pbCksCisJCS8vIFRPRE86IG5vdCB0ZXN0aW5nIGluc2FuaXR5CisJCWhhbmRsZXIuRVhQRUNUKCkuVGVzdE11bHRpKGdvbW9jay5BbnkoKSwgaW50OCg0MiksIGludDMyKDQyNDIpLCBpbnQ2NCg0MjQyNDIpLCBtYXBbaW50MTZdc3RyaW5nezE6ICJibGFoIiwgMjogInRoaW5nIn0sIHRocmlmdHRlc3QuTnVtYmVyel9FSUdIVCwgdGhyaWZ0dGVzdC5Vc2VySWQoMjQpKS5SZXR1cm4oeHhzLCBuaWwpLAorCQloYW5kbGVyLkVYUEVDVCgpLlRlc3RFeGNlcHRpb24oZ29tb2NrLkFueSgpLCAic29tZSIpLlJldHVybih4Y2VwdCksCisJCWhhbmRsZXIuRVhQRUNUKCkuVGVzdEV4Y2VwdGlvbihnb21vY2suQW55KCksICJURXhjZXB0aW9uIikuUmV0dXJuKGVycm9ycy5OZXcoIkp1c3QgcmFuZG9tIGV4Y2VwdGlvbiIpKSwKKwkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0TXVsdGlFeGNlcHRpb24oZ29tb2NrLkFueSgpLCAiWGNlcHRpb24iLCAiaWdub3JlbWUiKS5SZXR1cm4obmlsLCAmdGhyaWZ0dGVzdC5YY2VwdGlvbntFcnJvckNvZGU6IDEwMDEsIE1lc3NhZ2U6ICJUaGlzIGlzIGFuIFhjZXB0aW9uIn0pLAorCQloYW5kbGVyLkVYUEVDVCgpLlRlc3RNdWx0aUV4Y2VwdGlvbihnb21vY2suQW55KCksICJYY2VwdGlvbjIiLCAiaWdub3JlbWUiKS5SZXR1cm4obmlsLCAmdGhyaWZ0dGVzdC5YY2VwdGlvbjJ7RXJyb3JDb2RlOiAyMDAyLCBTdHJ1Y3RUaGluZzogJnRocmlmdHRlc3QuWHRydWN0e1N0cmluZ1RoaW5nOiAiVGhpcyBpcyBhbiBYY2VwdGlvbjIifX0pLAorCQloYW5kbGVyLkVYUEVDVCgpLlRlc3RPbmV3YXkoZ29tb2NrLkFueSgpLCBpbnQzMigyKSkuUmV0dXJuKG5pbCksCisJCWhhbmRsZXIuRVhQRUNUKCkuVGVzdFZvaWQoZ29tb2NrLkFueSgpKSwKIAkpCiAJdmFyIGVyciBlcnJvcgotCWlmIGVyciA9IGNsaWVudC5UZXN0Vm9pZCgpOyBlcnIgIT0gbmlsIHsKLQkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdFZvaWQoKSBjYWxsOiAiLCBlcnIpCisJaWYgZXJyID0gY2xpZW50LlRlc3RWb2lkKGRlZmF1bHRDdHgpOyBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdFZvaWQoKSBjYWxsOiAlcyIsIGVycikKIAl9CiAKLQl0aGluZywgZXJyIDo9IGNsaWVudC5UZXN0U3RyaW5nKCJ0aGluZyIpCisJdGhpbmcsIGVyciA6PSBjbGllbnQuVGVzdFN0cmluZyhkZWZhdWx0Q3R4LCAidGhpbmciKQogCWlmIGVyciAhPSBuaWwgewotCQl0LkVycm9yZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0U3RyaW5nKCkgY2FsbDogIiwgZXJyKQorCQl0LkVycm9yZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0U3RyaW5nKCkgY2FsbDogJXMiLCBlcnIpCiAJfQogCWlmIHRoaW5nICE9ICJ0aGluZyIgewogCQl0LkVycm9yZigiVW5leHBlY3RlZCBUZXN0U3RyaW5nKCkgcmVzdWx0LCBleHBlY3RlZCAndGhpbmcnIGdvdCAnJXMnICIsIHRoaW5nKQogCX0KIAotCWIsIGVyciA6PSBjbGllbnQuVGVzdEJ5dGUoNDIpCisJYmwsIGVyciA6PSBjbGllbnQuVGVzdEJvb2woZGVmYXVsdEN0eCwgdHJ1ZSkKIAlpZiBlcnIgIT0gbmlsIHsKLQkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdEJ5dGUoKSBjYWxsOiAiLCBlcnIpCisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RCb29sKCkgY2FsbDogJXMiLCBlcnIpCisJfQorCWlmICFibCB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIFRlc3RCb29sKCkgcmVzdWx0IGV4cGVjdGVkIHRydWUsIGdvdCAldiAiLCBibCkKKwl9CisJYmwsIGVyciA9IGNsaWVudC5UZXN0Qm9vbChkZWZhdWx0Q3R4LCBmYWxzZSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdEJvb2woKSBjYWxsOiAlcyIsIGVycikKKwl9CisJaWYgYmwgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBUZXN0Qm9vbCgpIHJlc3VsdCBleHBlY3RlZCBmYWxzZSwgZ290ICV2ICIsIGJsKQorCX0KKworCWIsIGVyciA6PSBjbGllbnQuVGVzdEJ5dGUoZGVmYXVsdEN0eCwgNDIpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RCeXRlKCkgY2FsbDogJXMiLCBlcnIpCiAJfQogCWlmIGIgIT0gNDIgewogCQl0LkVycm9yZigiVW5leHBlY3RlZCBUZXN0Qnl0ZSgpIHJlc3VsdCBleHBlY3RlZCA0MiwgZ290ICVkICIsIGIpCiAJfQogCi0JaTMyLCBlcnIgOj0gY2xpZW50LlRlc3RJMzIoNDI0MikKKwlpMzIsIGVyciA6PSBjbGllbnQuVGVzdEkzMihkZWZhdWx0Q3R4LCA0MjQyKQogCWlmIGVyciAhPSBuaWwgewotCQl0LkVycm9yZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0STMyKCkgY2FsbDogIiwgZXJyKQorCQl0LkVycm9yZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0STMyKCkgY2FsbDogJXMiLCBlcnIpCiAJfQogCWlmIGkzMiAhPSA0MjQyIHsKIAkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgVGVzdEkzMigpIHJlc3VsdCBleHBlY3RlZCA0MjQyLCBnb3QgJWQgIiwgaTMyKQogCX0KIAotCWk2NCwgZXJyIDo9IGNsaWVudC5UZXN0STY0KDQyNDI0MikKKwlpNjQsIGVyciA6PSBjbGllbnQuVGVzdEk2NChkZWZhdWx0Q3R4LCA0MjQyNDIpCiAJaWYgZXJyICE9IG5pbCB7Ci0JCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RJNjQoKSBjYWxsOiAiLCBlcnIpCisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RJNjQoKSBjYWxsOiAlcyIsIGVycikKIAl9CiAJaWYgaTY0ICE9IDQyNDI0MiB7CiAJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIFRlc3RJNjQoKSByZXN1bHQgZXhwZWN0ZWQgNDI0MjQyLCBnb3QgJWQgIiwgaTY0KQogCX0KIAotCWQsIGVyciA6PSBjbGllbnQuVGVzdERvdWJsZSg0Mi40MikKKwlkLCBlcnIgOj0gY2xpZW50LlRlc3REb3VibGUoZGVmYXVsdEN0eCwgNDIuNDIpCiAJaWYgZXJyICE9IG5pbCB7Ci0JCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3REb3VibGUoKSBjYWxsOiAiLCBlcnIpCisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3REb3VibGUoKSBjYWxsOiAlcyIsIGVycikKIAl9CiAJaWYgZCAhPSA0Mi40MiB7CiAJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIFRlc3REb3VibGUoKSByZXN1bHQgZXhwZWN0ZWQgNDIuNDIsIGdvdCAlZiAiLCBkKQogCX0KIAorCS8vIFRPRE86IGFkZCBUZXN0QmluYXJ5KCkgY2FsbAorCiAJeHMgOj0gdGhyaWZ0dGVzdC5OZXdYdHJ1Y3QoKQogCXhzLlN0cmluZ1RoaW5nID0gInRoaW5nIgogCXhzLkJ5dGVUaGluZyA9IDQyCiAJeHMuSTMyVGhpbmcgPSA0MjQyCiAJeHMuSTY0VGhpbmcgPSA0MjQyNDIKLQl4c3JldCwgZXJyIDo9IGNsaWVudC5UZXN0U3RydWN0KHhzKQorCXhzcmV0LCBlcnIgOj0gY2xpZW50LlRlc3RTdHJ1Y3QoZGVmYXVsdEN0eCwgeHMpCiAJaWYgZXJyICE9IG5pbCB7Ci0JCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RTdHJ1Y3QoKSBjYWxsOiAiLCBlcnIpCisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RTdHJ1Y3QoKSBjYWxsOiAlcyIsIGVycikKIAl9CiAJaWYgKnhzICE9ICp4c3JldCB7CiAJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIFRlc3RTdHJ1Y3QoKSByZXN1bHQgZXhwZWN0ZWQgJSN2LCBnb3QgJSN2ICIsIHhzLCB4c3JldCkKQEAgLTE3MSw4MyArMjA0LDkwIEBACiAKIAl4MiA6PSB0aHJpZnR0ZXN0Lk5ld1h0cnVjdDIoKQogCXgyLlN0cnVjdFRoaW5nID0geHMKLQl4MnJldCwgZXJyIDo9IGNsaWVudC5UZXN0TmVzdCh4MikKKwl4MnJldCwgZXJyIDo9IGNsaWVudC5UZXN0TmVzdChkZWZhdWx0Q3R4LCB4MikKIAlpZiBlcnIgIT0gbmlsIHsKLQkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdE5lc3QoKSBjYWxsOiAiLCBlcnIpCisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3ROZXN0KCkgY2FsbDogJXMiLCBlcnIpCiAJfQogCWlmICFyZWZsZWN0LkRlZXBFcXVhbCh4MiwgeDJyZXQpIHsKIAkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgVGVzdE5lc3QoKSByZXN1bHQgZXhwZWN0ZWQgJSN2LCBnb3QgJSN2ICIsIHgyLCB4MnJldCkKIAl9CiAKIAltIDo9IG1hcFtpbnQzMl1pbnQzMnsxOiAyLCAzOiA0LCA1OiA0Mn0KLQltcmV0LCBlcnIgOj0gY2xpZW50LlRlc3RNYXAobSkKKwltcmV0LCBlcnIgOj0gY2xpZW50LlRlc3RNYXAoZGVmYXVsdEN0eCwgbSkKIAlpZiBlcnIgIT0gbmlsIHsKLQkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdE1hcCgpIGNhbGw6ICIsIGVycikKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdE1hcCgpIGNhbGw6ICVzIiwgZXJyKQogCX0KIAlpZiAhcmVmbGVjdC5EZWVwRXF1YWwobSwgbXJldCkgewogCQl0LkVycm9yZigiVW5leHBlY3RlZCBUZXN0TWFwKCkgcmVzdWx0IGV4cGVjdGVkICUjdiwgZ290ICUjdiAiLCBtLCBtcmV0KQogCX0KIAogCXNtIDo9IG1hcFtzdHJpbmddc3RyaW5neyJhIjogIjIiLCAiYiI6ICJibGFoIiwgInNvbWUiOiAidGhpbmcifQotCXNtcmV0LCBlcnIgOj0gY2xpZW50LlRlc3RTdHJpbmdNYXAoc20pCisJc21yZXQsIGVyciA6PSBjbGllbnQuVGVzdFN0cmluZ01hcChkZWZhdWx0Q3R4LCBzbSkKIAlpZiBlcnIgIT0gbmlsIHsKLQkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdFN0cmluZ01hcCgpIGNhbGw6ICIsIGVycikKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdFN0cmluZ01hcCgpIGNhbGw6ICVzIiwgZXJyKQogCX0KIAlpZiAhcmVmbGVjdC5EZWVwRXF1YWwoc20sIHNtcmV0KSB7CiAJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIFRlc3RTdHJpbmdNYXAoKSByZXN1bHQgZXhwZWN0ZWQgJSN2LCBnb3QgJSN2ICIsIHNtLCBzbXJldCkKIAl9CiAKLQlzIDo9IG1hcFtpbnQzMl1ib29sezE6IHRydWUsIDI6IHRydWUsIDQyOiB0cnVlfQotCXNyZXQsIGVyciA6PSBjbGllbnQuVGVzdFNldChzKQorCXMgOj0gW11pbnQzMnsxLCAyLCA0Mn0KKwlzcmV0LCBlcnIgOj0gY2xpZW50LlRlc3RTZXQoZGVmYXVsdEN0eCwgcykKIAlpZiBlcnIgIT0gbmlsIHsKLQkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdFNldCgpIGNhbGw6ICIsIGVycikKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdFNldCgpIGNhbGw6ICVzIiwgZXJyKQogCX0KLQlpZiAhcmVmbGVjdC5EZWVwRXF1YWwocywgc3JldCkgewotCQl0LkVycm9yZigiVW5leHBlY3RlZCBUZXN0U2V0KCkgcmVzdWx0IGV4cGVjdGVkICUjdiwgZ290ICUjdiAiLCBzLCBzcmV0KQorCS8vIFNldHMgY2FuIGJlIGluIGFueSBvcmRlciwgYnV0IEdvIHNsaWNlcyBhcmUgb3JkZXJlZCwgc28gcmVmbGVjdC5EZWVwRXF1YWwgd29uJ3Qgd29yay4KKwlzdGVtcCA6PSBtYXBbaW50MzJdc3RydWN0e317fQorCWZvciBfLCB2YWwgOj0gcmFuZ2UgcyB7CisJCXN0ZW1wW3ZhbF0gPSBzdHJ1Y3R7fXt9CisJfQorCWZvciBfLCB2YWwgOj0gcmFuZ2Ugc3JldCB7CisJCWlmIF8sIG9rIDo9IHN0ZW1wW3ZhbF07ICFvayB7CisJCQl0LkZhdGFsZigiVW5leHBlY3RlZCBUZXN0U2V0KCkgcmVzdWx0IGV4cGVjdGVkICUjdiwgZ290ICUjdiAiLCBzLCBzcmV0KQorCQl9CiAJfQogCiAJbCA6PSBbXWludDMyezEsIDIsIDQyfQotCWxyZXQsIGVyciA6PSBjbGllbnQuVGVzdExpc3QobCkKKwlscmV0LCBlcnIgOj0gY2xpZW50LlRlc3RMaXN0KGRlZmF1bHRDdHgsIGwpCiAJaWYgZXJyICE9IG5pbCB7Ci0JCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RMaXN0KCkgY2FsbDogIiwgZXJyKQorCQl0LkVycm9yZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0TGlzdCgpIGNhbGw6ICVzIiwgZXJyKQogCX0KIAlpZiAhcmVmbGVjdC5EZWVwRXF1YWwobCwgbHJldCkgewotCQl0LkVycm9yZigiVW5leHBlY3RlZCBUZXN0U2V0KCkgcmVzdWx0IGV4cGVjdGVkICUjdiwgZ290ICUjdiAiLCBsLCBscmV0KQorCQl0LkVycm9yZigiVW5leHBlY3RlZCBUZXN0TGlzdCgpIHJlc3VsdCBleHBlY3RlZCAlI3YsIGdvdCAlI3YgIiwgbCwgbHJldCkKIAl9CiAKLQllcmV0LCBlcnIgOj0gY2xpZW50LlRlc3RFbnVtKHRocmlmdHRlc3QuTnVtYmVyel9UV08pCisJZXJldCwgZXJyIDo9IGNsaWVudC5UZXN0RW51bShkZWZhdWx0Q3R4LCB0aHJpZnR0ZXN0Lk51bWJlcnpfVFdPKQogCWlmIGVyciAhPSBuaWwgewotCQl0LkVycm9yZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0RW51bSgpIGNhbGw6ICIsIGVycikKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdEVudW0oKSBjYWxsOiAlcyIsIGVycikKIAl9CiAJaWYgZXJldCAhPSB0aHJpZnR0ZXN0Lk51bWJlcnpfVFdPIHsKIAkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgVGVzdEVudW0oKSByZXN1bHQgZXhwZWN0ZWQgJSN2LCBnb3QgJSN2ICIsIHRocmlmdHRlc3QuTnVtYmVyel9UV08sIGVyZXQpCiAJfQogCi0JdHJldCwgZXJyIDo9IGNsaWVudC5UZXN0VHlwZWRlZih0aHJpZnR0ZXN0LlVzZXJJZCg0MikpCisJdHJldCwgZXJyIDo9IGNsaWVudC5UZXN0VHlwZWRlZihkZWZhdWx0Q3R4LCB0aHJpZnR0ZXN0LlVzZXJJZCg0MikpCiAJaWYgZXJyICE9IG5pbCB7Ci0JCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RUeXBlZGVmKCkgY2FsbDogIiwgZXJyKQorCQl0LkVycm9yZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0VHlwZWRlZigpIGNhbGw6ICVzIiwgZXJyKQogCX0KIAlpZiB0cmV0ICE9IHRocmlmdHRlc3QuVXNlcklkKDQyKSB7CiAJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIFRlc3RUeXBlZGVmKCkgcmVzdWx0IGV4cGVjdGVkICUjdiwgZ290ICUjdiAiLCB0aHJpZnR0ZXN0LlVzZXJJZCg0MiksIHRyZXQpCiAJfQogCi0JbWFwbWFwLCBlcnIgOj0gY2xpZW50LlRlc3RNYXBNYXAoNDIpCisJbWFwbWFwLCBlcnIgOj0gY2xpZW50LlRlc3RNYXBNYXAoZGVmYXVsdEN0eCwgNDIpCiAJaWYgZXJyICE9IG5pbCB7Ci0JCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RNYXBtYXAoKSBjYWxsOiAiLCBlcnIpCisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RNYXBtYXAoKSBjYWxsOiAlcyIsIGVycikKIAl9CiAJaWYgIXJlZmxlY3QuRGVlcEVxdWFsKG1hcG1hcCwgcm1hcG1hcCkgewogCQl0LkVycm9yZigiVW5leHBlY3RlZCBUZXN0TWFwbWFwKCkgcmVzdWx0IGV4cGVjdGVkICUjdiwgZ290ICUjdiAiLCBybWFwbWFwLCBtYXBtYXApCiAJfQogCi0JeHhzcmV0LCBlcnIgOj0gY2xpZW50LlRlc3RNdWx0aSg0MiwgNDI0MiwgNDI0MjQyLCBtYXBbaW50MTZdc3RyaW5nezE6ICJibGFoIiwgMjogInRoaW5nIn0sIHRocmlmdHRlc3QuTnVtYmVyel9FSUdIVCwgdGhyaWZ0dGVzdC5Vc2VySWQoMjQpKQorCXh4c3JldCwgZXJyIDo9IGNsaWVudC5UZXN0TXVsdGkoZGVmYXVsdEN0eCwgNDIsIDQyNDIsIDQyNDI0MiwgbWFwW2ludDE2XXN0cmluZ3sxOiAiYmxhaCIsIDI6ICJ0aGluZyJ9LCB0aHJpZnR0ZXN0Lk51bWJlcnpfRUlHSFQsIHRocmlmdHRlc3QuVXNlcklkKDI0KSkKIAlpZiBlcnIgIT0gbmlsIHsKLQkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdE11bHRpKCkgY2FsbDogIiwgZXJyKQorCQl0LkVycm9yZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0TXVsdGkoKSBjYWxsOiAlcyIsIGVycikKIAl9CiAJaWYgIXJlZmxlY3QuRGVlcEVxdWFsKHh4cywgeHhzcmV0KSB7CiAJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIFRlc3RNdWx0aSgpIHJlc3VsdCBleHBlY3RlZCAlI3YsIGdvdCAlI3YgIiwgeHhzLCB4eHNyZXQpCiAJfQogCi0JZXJyID0gY2xpZW50LlRlc3RFeGNlcHRpb24oInNvbWUiKQorCWVyciA9IGNsaWVudC5UZXN0RXhjZXB0aW9uKGRlZmF1bHRDdHgsICJzb21lIikKIAlpZiBlcnIgPT0gbmlsIHsKIAkJdC5FcnJvcmYoIkV4cGVjdGluZyBleGNlcHRpb24gaW4gVGVzdEV4Y2VwdGlvbigpIGNhbGwiKQogCX0KQEAgLTI1NiwxMyArMjk2LDE2IEBACiAJfQogCiAJLy8gVE9ETzogY29ubmVjdGlvbiBpcyBiZWluZyBjbG9zZWQgb24gdGhpcwotCWVyciA9IGNsaWVudC5UZXN0RXhjZXB0aW9uKCJURXhjZXB0aW9uIikKLQl0ZXgsIG9rIDo9IGVyci4odGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbikKLQlpZiBlcnIgPT0gbmlsIHx8ICFvayB8fCB0ZXguVHlwZUlkKCkgIT0gdGhyaWZ0LklOVEVSTkFMX0VSUk9SIHsKLQkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgVGVzdEV4Y2VwdGlvbigpIHJlc3VsdCBleHBlY3RlZCBBcHBsaWNhdGlvbkVycm9yLCBnb3QgJSN2ICIsIGVycikKKwllcnIgPSBjbGllbnQuVGVzdEV4Y2VwdGlvbihkZWZhdWx0Q3R4LCAiVEV4Y2VwdGlvbiIpCisJaWYgZXJyID09IG5pbCB7CisJCXQuRXJyb3IoImV4cGVjdGVkIGV4Y2VwdGlvbiBnb3QgbmlsIikKKwl9IGVsc2UgaWYgdGV4LCBvayA6PSBlcnIuKHRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24pOyAhb2sgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBUZXN0RXhjZXB0aW9uKCkgcmVzdWx0IGV4cGVjdGVkIEFwcGxpY2F0aW9uRXJyb3IsIGdvdCAlVCAiLCBlcnIpCisJfSBlbHNlIGlmIHRleC5UeXBlSWQoKSAhPSB0aHJpZnQuSU5URVJOQUxfRVJST1IgeworCQl0LkVycm9yZigiZXhwZWN0ZWQgaW50ZXJuYWxfZXJyb3IgZ290ICV2IiwgdGV4LlR5cGVJZCgpKQogCX0KIAotCWlnbiwgZXJyIDo9IGNsaWVudC5UZXN0TXVsdGlFeGNlcHRpb24oIlhjZXB0aW9uIiwgImlnbm9yZW1lIikKKwlpZ24sIGVyciA6PSBjbGllbnQuVGVzdE11bHRpRXhjZXB0aW9uKGRlZmF1bHRDdHgsICJYY2VwdGlvbiIsICJpZ25vcmVtZSIpCiAJaWYgaWduICE9IG5pbCB8fCBlcnIgPT0gbmlsIHsKIAkJdC5FcnJvcmYoIkV4cGVjdGluZyBleGNlcHRpb24gaW4gVGVzdE11bHRpRXhjZXB0aW9uKCkgY2FsbCIpCiAJfQpAQCAtMjcwLDcgKzMxMyw3IEBACiAJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIFRlc3RNdWx0aUV4Y2VwdGlvbigpICUjdiAiLCBlcnIpCiAJfQogCi0JaWduLCBlcnIgPSBjbGllbnQuVGVzdE11bHRpRXhjZXB0aW9uKCJYY2VwdGlvbjIiLCAiaWdub3JlbWUiKQorCWlnbiwgZXJyID0gY2xpZW50LlRlc3RNdWx0aUV4Y2VwdGlvbihkZWZhdWx0Q3R4LCAiWGNlcHRpb24yIiwgImlnbm9yZW1lIikKIAlpZiBpZ24gIT0gbmlsIHx8IGVyciA9PSBuaWwgewogCQl0LkVycm9yZigiRXhwZWN0aW5nIGV4Y2VwdGlvbiBpbiBUZXN0TXVsdGlFeGNlcHRpb24oKSBjYWxsIikKIAl9CkBAIC0yODAsMTMgKzMyMywxMyBAQAogCQl0LkVycm9yZigiVW5leHBlY3RlZCBUZXN0TXVsdGlFeGNlcHRpb24oKSAlI3YgIiwgZXJyKQogCX0KIAotCWVyciA9IGNsaWVudC5UZXN0T25ld2F5KDIpCisJZXJyID0gY2xpZW50LlRlc3RPbmV3YXkoZGVmYXVsdEN0eCwgMikKIAlpZiBlcnIgIT0gbmlsIHsKLQkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdE9uZXdheSgpIGNhbGw6ICIsIGVycikKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdE9uZXdheSgpIGNhbGw6ICVzIiwgZXJyKQogCX0KIAogCS8vTWFrZSBzdXJlIHRoZSBjb25uZWN0aW9uIHN0aWxsIGFsaXZlCi0JaWYgZXJyID0gY2xpZW50LlRlc3RWb2lkKCk7IGVyciAhPSBuaWwgewotCQl0LkVycm9yZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0Vm9pZCgpIGNhbGw6ICIsIGVycikKKwlpZiBlcnIgPSBjbGllbnQuVGVzdFZvaWQoZGVmYXVsdEN0eCk7IGVyciAhPSBuaWwgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0Vm9pZCgpIGNhbGw6ICVzIiwgZXJyKQogCX0KIH0KZGlmZiAtLWdpdCBhL3Rlc3QvZ28vc3JjL2NvbW1vbi9jb250ZXh0X3Rlc3QuZ28gYi90ZXN0L2dvL3NyYy9jb21tb24vY29udGV4dF90ZXN0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2NGRiYjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2dvL3NyYy9jb21tb24vY29udGV4dF90ZXN0LmdvCkBAIC0wLDAgKzEsOTggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb21tb24KKworaW1wb3J0ICgKKwkiY29udGV4dCIKKwkiZm10IgorCSJuZXQiCisJIm5ldC9odHRwIgorCSJuZXQvdXJsIgorCSJvcyIKKwkic3lzY2FsbCIKKwkidGVzdGluZyIKKwkidGhyaWZ0IgorCSJ0aW1lIgorKQorCit0eXBlIHNsb3dIdHRwSGFuZGxlciBzdHJ1Y3R7fQorCitmdW5jIChzbG93SHR0cEhhbmRsZXIpIFNlcnZlSFRUUCh3IGh0dHAuUmVzcG9uc2VXcml0ZXIsIHIgKmh0dHAuUmVxdWVzdCkgeworCXRpbWUuU2xlZXAoMSAqIHRpbWUuU2Vjb25kKQorfQorCitmdW5jIFRlc3RIdHRwQ29udGV4dFRpbWVvdXQodCAqdGVzdGluZy5UKSB7CisJY2VydFBhdGggPSAiLi4vLi4vLi4va2V5cyIKKworCXVuaXQgOj0gdGVzdF91bml0eyIxMjcuMC4wLjEiLCA5MDk2LCAiIiwgImh0dHAiLCAiYmluYXJ5IiwgZmFsc2V9CisKKwlzZXJ2ZXIgOj0gJmh0dHAuU2VydmVye0FkZHI6IHVuaXQuaG9zdCArIGZtdC5TcHJpbnRmKCI6JWQiLCB1bml0LnBvcnQpLCBIYW5kbGVyOiBzbG93SHR0cEhhbmRsZXJ7fX0KKwlnbyBzZXJ2ZXIuTGlzdGVuQW5kU2VydmUoKQorCisJY2xpZW50LCB0cmFucywgZXJyIDo9IFN0YXJ0Q2xpZW50KHVuaXQuaG9zdCwgdW5pdC5wb3J0LCB1bml0LmRvbWFpbl9zb2NrZXQsIHVuaXQudHJhbnNwb3J0LCB1bml0LnByb3RvY29sLCB1bml0LnNzbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIlVuYWJsZSB0byBzdGFydCBjbGllbnQ6ICV2IiwgZXJyKQorCQlyZXR1cm4KKwl9CisJZGVmZXIgdHJhbnMuQ2xvc2UoKQorCisJdW53cmFwRXJyIDo9IGZ1bmMoZXJyIGVycm9yKSBlcnJvciB7CisJCWZvciB7CisJCQlzd2l0Y2ggZXJyLih0eXBlKSB7CisJCQljYXNlIHRocmlmdC5UVHJhbnNwb3J0RXhjZXB0aW9uOgorCQkJCWVyciA9IGVyci4odGhyaWZ0LlRUcmFuc3BvcnRFeGNlcHRpb24pLkVycigpCisJCQljYXNlICp1cmwuRXJyb3I6CisJCQkJZXJyID0gZXJyLigqdXJsLkVycm9yKS5FcnIKKwkJCWNhc2UgKm5ldC5PcEVycm9yOgorCQkJCWVyciA9IGVyci4oKm5ldC5PcEVycm9yKS5FcnIKKwkJCWNhc2UgKm9zLlN5c2NhbGxFcnJvcjoKKwkJCQllcnIgPSBlcnIuKCpvcy5TeXNjYWxsRXJyb3IpLkVycgorCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm4gZXJyCisJCQl9CisJCX0KKwl9CisKKwlzZXJ2ZXJTdGFydHVwRGVhZGxpbmUgOj0gdGltZS5Ob3coKS5BZGQoNSAqIHRpbWUuU2Vjb25kKQorCWZvciB7CisJCWN0eCwgXyA6PSBjb250ZXh0LldpdGhUaW1lb3V0KGNvbnRleHQuQmFja2dyb3VuZCgpLCA1MCp0aW1lLk1pbGxpc2Vjb25kKQorCQllcnIgPSBjbGllbnQuVGVzdFZvaWQoY3R4KQorCQllcnIgPSB1bndyYXBFcnIoZXJyKQorCQlpZiBlcnIgIT0gc3lzY2FsbC5FQ09OTlJFRlVTRUQgfHwgdGltZS5Ob3coKS5BZnRlcihzZXJ2ZXJTdGFydHVwRGVhZGxpbmUpIHsKKwkJCWJyZWFrCisJCX0KKwkJdGltZS5TbGVlcCh0aW1lLk1pbGxpc2Vjb25kKQorCX0KKworCWlmIGVyciA9PSBuaWwgeworCQl0LkVycm9yZigiUmVxdWVzdCBjb21wbGV0ZWQgKHNob3VsZCBoYXZlIHRpbWVkIG91dCkiKQorCQlyZXR1cm4KKwl9CisKKwkvLyBXZSd2ZSBnb3QgdG8gc3dpdGNoIG9uIGBlcnIuRXJyb3IoKWAgaGVyZSBzaW5jZSBnbzEuNyBkb2Vzbid0IHByb3Blcmx5IHJldHVybgorCS8vIGBjb250ZXh0LkRlYWRsaW5lRXhjZWVkZWRgIGVycm9yIGFuZCBgaHR0cC5lcnJSZXF1ZXN0Q2FuY2VsZWRgIGlzIG5vdCBleHBvcnRlZC4KKwkvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2dvbGFuZy9nby9pc3N1ZXMvMTc3MTEKKwlzd2l0Y2ggZXJyLkVycm9yKCkgeworCWNhc2UgY29udGV4dC5EZWFkbGluZUV4Y2VlZGVkLkVycm9yKCksICJuZXQvaHR0cDogcmVxdWVzdCBjYW5jZWxlZCI6CisJCS8vIEV4cGVjdGVkIGVycm9yCisJZGVmYXVsdDoKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3I6ICVzIiwgZXJyKQorCX0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvZ28vc3JjL2NvbW1vbi9tb2NrX2hhbmRsZXIuZ28gYi90ZXN0L2dvL3NyYy9jb21tb24vbW9ja19oYW5kbGVyLmdvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzM2ZWQ5Li4wMDAwMDAwCi0tLSBhL3Rlc3QvZ28vc3JjL2NvbW1vbi9tb2NrX2hhbmRsZXIuZ28KKysrIC9kZXYvbnVsbApAQCAtMSwyNjYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSBNb2NrR2VuLiBETyBOT1QgRURJVCEKLS8vIFNvdXJjZTogZ2VuL3RocmlmdHRlc3QgKGludGVyZmFjZXM6IFRocmlmdFRlc3QpCi0KLXBhY2thZ2UgY29tbW9uCi0KLWltcG9ydCAoCi0JZ29tb2NrICJjb2RlLmdvb2dsZS5jb20vcC9nb21vY2svZ29tb2NrIgotCXRocmlmdHRlc3QgImdlbi90aHJpZnR0ZXN0IgotKQotCi0vLyBNb2NrIG9mIFRocmlmdFRlc3QgaW50ZXJmYWNlCi10eXBlIE1vY2tUaHJpZnRUZXN0IHN0cnVjdCB7Ci0JY3RybCAgICAgKmdvbW9jay5Db250cm9sbGVyCi0JcmVjb3JkZXIgKl9Nb2NrVGhyaWZ0VGVzdFJlY29yZGVyCi19Ci0KLS8vIFJlY29yZGVyIGZvciBNb2NrVGhyaWZ0VGVzdCAobm90IGV4cG9ydGVkKQotdHlwZSBfTW9ja1RocmlmdFRlc3RSZWNvcmRlciBzdHJ1Y3QgewotCW1vY2sgKk1vY2tUaHJpZnRUZXN0Ci19Ci0KLWZ1bmMgTmV3TW9ja1RocmlmdFRlc3QoY3RybCAqZ29tb2NrLkNvbnRyb2xsZXIpICpNb2NrVGhyaWZ0VGVzdCB7Ci0JbW9jayA6PSAmTW9ja1RocmlmdFRlc3R7Y3RybDogY3RybH0KLQltb2NrLnJlY29yZGVyID0gJl9Nb2NrVGhyaWZ0VGVzdFJlY29yZGVye21vY2t9Ci0JcmV0dXJuIG1vY2sKLX0KLQotZnVuYyAoX20gKk1vY2tUaHJpZnRUZXN0KSBFWFBFQ1QoKSAqX01vY2tUaHJpZnRUZXN0UmVjb3JkZXIgewotCXJldHVybiBfbS5yZWNvcmRlcgotfQotCi1mdW5jIChfbSAqTW9ja1RocmlmdFRlc3QpIFRlc3RCeXRlKF9wYXJhbTAgaW50OCkgKGludDgsIGVycm9yKSB7Ci0JcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIlRlc3RCeXRlIiwgX3BhcmFtMCkKLQlyZXQwLCBfIDo9IHJldFswXS4oaW50OCkKLQlyZXQxLCBfIDo9IHJldFsxXS4oZXJyb3IpCi0JcmV0dXJuIHJldDAsIHJldDEKLX0KLQotZnVuYyAoX21yICpfTW9ja1RocmlmdFRlc3RSZWNvcmRlcikgVGVzdEJ5dGUoYXJnMCBpbnRlcmZhY2V7fSkgKmdvbW9jay5DYWxsIHsKLQlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiVGVzdEJ5dGUiLCBhcmcwKQotfQotCi1mdW5jIChfbSAqTW9ja1RocmlmdFRlc3QpIFRlc3REb3VibGUoX3BhcmFtMCBmbG9hdDY0KSAoZmxvYXQ2NCwgZXJyb3IpIHsKLQlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiVGVzdERvdWJsZSIsIF9wYXJhbTApCi0JcmV0MCwgXyA6PSByZXRbMF0uKGZsb2F0NjQpCi0JcmV0MSwgXyA6PSByZXRbMV0uKGVycm9yKQotCXJldHVybiByZXQwLCByZXQxCi19Ci0KLWZ1bmMgKF9tciAqX01vY2tUaHJpZnRUZXN0UmVjb3JkZXIpIFRlc3REb3VibGUoYXJnMCBpbnRlcmZhY2V7fSkgKmdvbW9jay5DYWxsIHsKLQlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiVGVzdERvdWJsZSIsIGFyZzApCi19Ci0KLWZ1bmMgKF9tICpNb2NrVGhyaWZ0VGVzdCkgVGVzdEVudW0oX3BhcmFtMCB0aHJpZnR0ZXN0Lk51bWJlcnopICh0aHJpZnR0ZXN0Lk51bWJlcnosIGVycm9yKSB7Ci0JcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIlRlc3RFbnVtIiwgX3BhcmFtMCkKLQlyZXQwLCBfIDo9IHJldFswXS4odGhyaWZ0dGVzdC5OdW1iZXJ6KQotCXJldDEsIF8gOj0gcmV0WzFdLihlcnJvcikKLQlyZXR1cm4gcmV0MCwgcmV0MQotfQotCi1mdW5jIChfbXIgKl9Nb2NrVGhyaWZ0VGVzdFJlY29yZGVyKSBUZXN0RW51bShhcmcwIGludGVyZmFjZXt9KSAqZ29tb2NrLkNhbGwgewotCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJUZXN0RW51bSIsIGFyZzApCi19Ci0KLWZ1bmMgKF9tICpNb2NrVGhyaWZ0VGVzdCkgVGVzdEV4Y2VwdGlvbihfcGFyYW0wIHN0cmluZykgZXJyb3IgewotCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJUZXN0RXhjZXB0aW9uIiwgX3BhcmFtMCkKLQlyZXQwLCBfIDo9IHJldFswXS4oZXJyb3IpCi0JcmV0dXJuIHJldDAKLX0KLQotZnVuYyAoX21yICpfTW9ja1RocmlmdFRlc3RSZWNvcmRlcikgVGVzdEV4Y2VwdGlvbihhcmcwIGludGVyZmFjZXt9KSAqZ29tb2NrLkNhbGwgewotCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJUZXN0RXhjZXB0aW9uIiwgYXJnMCkKLX0KLQotZnVuYyAoX20gKk1vY2tUaHJpZnRUZXN0KSBUZXN0STMyKF9wYXJhbTAgaW50MzIpIChpbnQzMiwgZXJyb3IpIHsKLQlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiVGVzdEkzMiIsIF9wYXJhbTApCi0JcmV0MCwgXyA6PSByZXRbMF0uKGludDMyKQotCXJldDEsIF8gOj0gcmV0WzFdLihlcnJvcikKLQlyZXR1cm4gcmV0MCwgcmV0MQotfQotCi1mdW5jIChfbXIgKl9Nb2NrVGhyaWZ0VGVzdFJlY29yZGVyKSBUZXN0STMyKGFyZzAgaW50ZXJmYWNle30pICpnb21vY2suQ2FsbCB7Ci0JcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIlRlc3RJMzIiLCBhcmcwKQotfQotCi1mdW5jIChfbSAqTW9ja1RocmlmdFRlc3QpIFRlc3RJNjQoX3BhcmFtMCBpbnQ2NCkgKGludDY0LCBlcnJvcikgewotCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJUZXN0STY0IiwgX3BhcmFtMCkKLQlyZXQwLCBfIDo9IHJldFswXS4oaW50NjQpCi0JcmV0MSwgXyA6PSByZXRbMV0uKGVycm9yKQotCXJldHVybiByZXQwLCByZXQxCi19Ci0KLWZ1bmMgKF9tciAqX01vY2tUaHJpZnRUZXN0UmVjb3JkZXIpIFRlc3RJNjQoYXJnMCBpbnRlcmZhY2V7fSkgKmdvbW9jay5DYWxsIHsKLQlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiVGVzdEk2NCIsIGFyZzApCi19Ci0KLWZ1bmMgKF9tICpNb2NrVGhyaWZ0VGVzdCkgVGVzdEluc2FuaXR5KF9wYXJhbTAgKnRocmlmdHRlc3QuSW5zYW5pdHkpIChtYXBbdGhyaWZ0dGVzdC5Vc2VySWRdbWFwW3RocmlmdHRlc3QuTnVtYmVyel0qdGhyaWZ0dGVzdC5JbnNhbml0eSwgZXJyb3IpIHsKLQlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiVGVzdEluc2FuaXR5IiwgX3BhcmFtMCkKLQlyZXQwLCBfIDo9IHJldFswXS4obWFwW3RocmlmdHRlc3QuVXNlcklkXW1hcFt0aHJpZnR0ZXN0Lk51bWJlcnpdKnRocmlmdHRlc3QuSW5zYW5pdHkpCi0JcmV0MSwgXyA6PSByZXRbMV0uKGVycm9yKQotCXJldHVybiByZXQwLCByZXQxCi19Ci0KLWZ1bmMgKF9tciAqX01vY2tUaHJpZnRUZXN0UmVjb3JkZXIpIFRlc3RJbnNhbml0eShhcmcwIGludGVyZmFjZXt9KSAqZ29tb2NrLkNhbGwgewotCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJUZXN0SW5zYW5pdHkiLCBhcmcwKQotfQotCi1mdW5jIChfbSAqTW9ja1RocmlmdFRlc3QpIFRlc3RMaXN0KF9wYXJhbTAgW11pbnQzMikgKFtdaW50MzIsIGVycm9yKSB7Ci0JcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIlRlc3RMaXN0IiwgX3BhcmFtMCkKLQlyZXQwLCBfIDo9IHJldFswXS4oW11pbnQzMikKLQlyZXQxLCBfIDo9IHJldFsxXS4oZXJyb3IpCi0JcmV0dXJuIHJldDAsIHJldDEKLX0KLQotZnVuYyAoX21yICpfTW9ja1RocmlmdFRlc3RSZWNvcmRlcikgVGVzdExpc3QoYXJnMCBpbnRlcmZhY2V7fSkgKmdvbW9jay5DYWxsIHsKLQlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiVGVzdExpc3QiLCBhcmcwKQotfQotCi1mdW5jIChfbSAqTW9ja1RocmlmdFRlc3QpIFRlc3RNYXAoX3BhcmFtMCBtYXBbaW50MzJdaW50MzIpIChtYXBbaW50MzJdaW50MzIsIGVycm9yKSB7Ci0JcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIlRlc3RNYXAiLCBfcGFyYW0wKQotCXJldDAsIF8gOj0gcmV0WzBdLihtYXBbaW50MzJdaW50MzIpCi0JcmV0MSwgXyA6PSByZXRbMV0uKGVycm9yKQotCXJldHVybiByZXQwLCByZXQxCi19Ci0KLWZ1bmMgKF9tciAqX01vY2tUaHJpZnRUZXN0UmVjb3JkZXIpIFRlc3RNYXAoYXJnMCBpbnRlcmZhY2V7fSkgKmdvbW9jay5DYWxsIHsKLQlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiVGVzdE1hcCIsIGFyZzApCi19Ci0KLWZ1bmMgKF9tICpNb2NrVGhyaWZ0VGVzdCkgVGVzdE1hcE1hcChfcGFyYW0wIGludDMyKSAobWFwW2ludDMyXW1hcFtpbnQzMl1pbnQzMiwgZXJyb3IpIHsKLQlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiVGVzdE1hcE1hcCIsIF9wYXJhbTApCi0JcmV0MCwgXyA6PSByZXRbMF0uKG1hcFtpbnQzMl1tYXBbaW50MzJdaW50MzIpCi0JcmV0MSwgXyA6PSByZXRbMV0uKGVycm9yKQotCXJldHVybiByZXQwLCByZXQxCi19Ci0KLWZ1bmMgKF9tciAqX01vY2tUaHJpZnRUZXN0UmVjb3JkZXIpIFRlc3RNYXBNYXAoYXJnMCBpbnRlcmZhY2V7fSkgKmdvbW9jay5DYWxsIHsKLQlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiVGVzdE1hcE1hcCIsIGFyZzApCi19Ci0KLWZ1bmMgKF9tICpNb2NrVGhyaWZ0VGVzdCkgVGVzdE11bHRpKF9wYXJhbTAgaW50OCwgX3BhcmFtMSBpbnQzMiwgX3BhcmFtMiBpbnQ2NCwgX3BhcmFtMyBtYXBbaW50MTZdc3RyaW5nLCBfcGFyYW00IHRocmlmdHRlc3QuTnVtYmVyeiwgX3BhcmFtNSB0aHJpZnR0ZXN0LlVzZXJJZCkgKCp0aHJpZnR0ZXN0Llh0cnVjdCwgZXJyb3IpIHsKLQlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiVGVzdE11bHRpIiwgX3BhcmFtMCwgX3BhcmFtMSwgX3BhcmFtMiwgX3BhcmFtMywgX3BhcmFtNCwgX3BhcmFtNSkKLQlyZXQwLCBfIDo9IHJldFswXS4oKnRocmlmdHRlc3QuWHRydWN0KQotCXJldDEsIF8gOj0gcmV0WzFdLihlcnJvcikKLQlyZXR1cm4gcmV0MCwgcmV0MQotfQotCi1mdW5jIChfbXIgKl9Nb2NrVGhyaWZ0VGVzdFJlY29yZGVyKSBUZXN0TXVsdGkoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSBpbnRlcmZhY2V7fSkgKmdvbW9jay5DYWxsIHsKLQlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiVGVzdE11bHRpIiwgYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSkKLX0KLQotZnVuYyAoX20gKk1vY2tUaHJpZnRUZXN0KSBUZXN0TXVsdGlFeGNlcHRpb24oX3BhcmFtMCBzdHJpbmcsIF9wYXJhbTEgc3RyaW5nKSAoKnRocmlmdHRlc3QuWHRydWN0LCBlcnJvcikgewotCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJUZXN0TXVsdGlFeGNlcHRpb24iLCBfcGFyYW0wLCBfcGFyYW0xKQotCXJldDAsIF8gOj0gcmV0WzBdLigqdGhyaWZ0dGVzdC5YdHJ1Y3QpCi0JcmV0MSwgXyA6PSByZXRbMV0uKGVycm9yKQotCXJldHVybiByZXQwLCByZXQxCi19Ci0KLWZ1bmMgKF9tciAqX01vY2tUaHJpZnRUZXN0UmVjb3JkZXIpIFRlc3RNdWx0aUV4Y2VwdGlvbihhcmcwLCBhcmcxIGludGVyZmFjZXt9KSAqZ29tb2NrLkNhbGwgewotCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJUZXN0TXVsdGlFeGNlcHRpb24iLCBhcmcwLCBhcmcxKQotfQotCi1mdW5jIChfbSAqTW9ja1RocmlmdFRlc3QpIFRlc3ROZXN0KF9wYXJhbTAgKnRocmlmdHRlc3QuWHRydWN0MikgKCp0aHJpZnR0ZXN0Llh0cnVjdDIsIGVycm9yKSB7Ci0JcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIlRlc3ROZXN0IiwgX3BhcmFtMCkKLQlyZXQwLCBfIDo9IHJldFswXS4oKnRocmlmdHRlc3QuWHRydWN0MikKLQlyZXQxLCBfIDo9IHJldFsxXS4oZXJyb3IpCi0JcmV0dXJuIHJldDAsIHJldDEKLX0KLQotZnVuYyAoX21yICpfTW9ja1RocmlmdFRlc3RSZWNvcmRlcikgVGVzdE5lc3QoYXJnMCBpbnRlcmZhY2V7fSkgKmdvbW9jay5DYWxsIHsKLQlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiVGVzdE5lc3QiLCBhcmcwKQotfQotCi1mdW5jIChfbSAqTW9ja1RocmlmdFRlc3QpIFRlc3RPbmV3YXkoX3BhcmFtMCBpbnQzMikgZXJyb3IgewotCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJUZXN0T25ld2F5IiwgX3BhcmFtMCkKLQlyZXQwLCBfIDo9IHJldFswXS4oZXJyb3IpCi0JcmV0dXJuIHJldDAKLX0KLQotZnVuYyAoX21yICpfTW9ja1RocmlmdFRlc3RSZWNvcmRlcikgVGVzdE9uZXdheShhcmcwIGludGVyZmFjZXt9KSAqZ29tb2NrLkNhbGwgewotCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJUZXN0T25ld2F5IiwgYXJnMCkKLX0KLQotZnVuYyAoX20gKk1vY2tUaHJpZnRUZXN0KSBUZXN0U2V0KF9wYXJhbTAgbWFwW2ludDMyXWJvb2wpIChtYXBbaW50MzJdYm9vbCwgZXJyb3IpIHsKLQlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiVGVzdFNldCIsIF9wYXJhbTApCi0JcmV0MCwgXyA6PSByZXRbMF0uKG1hcFtpbnQzMl1ib29sKQotCXJldDEsIF8gOj0gcmV0WzFdLihlcnJvcikKLQlyZXR1cm4gcmV0MCwgcmV0MQotfQotCi1mdW5jIChfbXIgKl9Nb2NrVGhyaWZ0VGVzdFJlY29yZGVyKSBUZXN0U2V0KGFyZzAgaW50ZXJmYWNle30pICpnb21vY2suQ2FsbCB7Ci0JcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIlRlc3RTZXQiLCBhcmcwKQotfQotCi1mdW5jIChfbSAqTW9ja1RocmlmdFRlc3QpIFRlc3RTdHJpbmcoX3BhcmFtMCBzdHJpbmcpIChzdHJpbmcsIGVycm9yKSB7Ci0JcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIlRlc3RTdHJpbmciLCBfcGFyYW0wKQotCXJldDAsIF8gOj0gcmV0WzBdLihzdHJpbmcpCi0JcmV0MSwgXyA6PSByZXRbMV0uKGVycm9yKQotCXJldHVybiByZXQwLCByZXQxCi19Ci0KLWZ1bmMgKF9tciAqX01vY2tUaHJpZnRUZXN0UmVjb3JkZXIpIFRlc3RTdHJpbmcoYXJnMCBpbnRlcmZhY2V7fSkgKmdvbW9jay5DYWxsIHsKLQlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiVGVzdFN0cmluZyIsIGFyZzApCi19Ci0KLWZ1bmMgKF9tICpNb2NrVGhyaWZ0VGVzdCkgVGVzdFN0cmluZ01hcChfcGFyYW0wIG1hcFtzdHJpbmddc3RyaW5nKSAobWFwW3N0cmluZ11zdHJpbmcsIGVycm9yKSB7Ci0JcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIlRlc3RTdHJpbmdNYXAiLCBfcGFyYW0wKQotCXJldDAsIF8gOj0gcmV0WzBdLihtYXBbc3RyaW5nXXN0cmluZykKLQlyZXQxLCBfIDo9IHJldFsxXS4oZXJyb3IpCi0JcmV0dXJuIHJldDAsIHJldDEKLX0KLQotZnVuYyAoX21yICpfTW9ja1RocmlmdFRlc3RSZWNvcmRlcikgVGVzdFN0cmluZ01hcChhcmcwIGludGVyZmFjZXt9KSAqZ29tb2NrLkNhbGwgewotCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJUZXN0U3RyaW5nTWFwIiwgYXJnMCkKLX0KLQotZnVuYyAoX20gKk1vY2tUaHJpZnRUZXN0KSBUZXN0U3RydWN0KF9wYXJhbTAgKnRocmlmdHRlc3QuWHRydWN0KSAoKnRocmlmdHRlc3QuWHRydWN0LCBlcnJvcikgewotCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJUZXN0U3RydWN0IiwgX3BhcmFtMCkKLQlyZXQwLCBfIDo9IHJldFswXS4oKnRocmlmdHRlc3QuWHRydWN0KQotCXJldDEsIF8gOj0gcmV0WzFdLihlcnJvcikKLQlyZXR1cm4gcmV0MCwgcmV0MQotfQotCi1mdW5jIChfbXIgKl9Nb2NrVGhyaWZ0VGVzdFJlY29yZGVyKSBUZXN0U3RydWN0KGFyZzAgaW50ZXJmYWNle30pICpnb21vY2suQ2FsbCB7Ci0JcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIlRlc3RTdHJ1Y3QiLCBhcmcwKQotfQotCi1mdW5jIChfbSAqTW9ja1RocmlmdFRlc3QpIFRlc3RUeXBlZGVmKF9wYXJhbTAgdGhyaWZ0dGVzdC5Vc2VySWQpICh0aHJpZnR0ZXN0LlVzZXJJZCwgZXJyb3IpIHsKLQlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiVGVzdFR5cGVkZWYiLCBfcGFyYW0wKQotCXJldDAsIF8gOj0gcmV0WzBdLih0aHJpZnR0ZXN0LlVzZXJJZCkKLQlyZXQxLCBfIDo9IHJldFsxXS4oZXJyb3IpCi0JcmV0dXJuIHJldDAsIHJldDEKLX0KLQotZnVuYyAoX21yICpfTW9ja1RocmlmdFRlc3RSZWNvcmRlcikgVGVzdFR5cGVkZWYoYXJnMCBpbnRlcmZhY2V7fSkgKmdvbW9jay5DYWxsIHsKLQlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiVGVzdFR5cGVkZWYiLCBhcmcwKQotfQotCi1mdW5jIChfbSAqTW9ja1RocmlmdFRlc3QpIFRlc3RWb2lkKCkgZXJyb3IgewotCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJUZXN0Vm9pZCIpCi0JcmV0MCwgXyA6PSByZXRbMF0uKGVycm9yKQotCXJldHVybiByZXQwCi19Ci0KLWZ1bmMgKF9tciAqX01vY2tUaHJpZnRUZXN0UmVjb3JkZXIpIFRlc3RWb2lkKCkgKmdvbW9jay5DYWxsIHsKLQlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiVGVzdFZvaWQiKQotfQpkaWZmIC0tZ2l0IGEvdGVzdC9nby9zcmMvY29tbW9uL3ByaW50aW5nX2hhbmRsZXIuZ28gYi90ZXN0L2dvL3NyYy9jb21tb24vcHJpbnRpbmdfaGFuZGxlci5nbwppbmRleCBlOTM2MjFmLi4yYjIyZDBjIDEwMDY0NAotLS0gYS90ZXN0L2dvL3NyYy9jb21tb24vcHJpbnRpbmdfaGFuZGxlci5nbworKysgYi90ZXN0L2dvL3NyYy9jb21tb24vcHJpbnRpbmdfaGFuZGxlci5nbwpAQCAtMjAsNiArMjAsOCBAQAogcGFja2FnZSBjb21tb24KIAogaW1wb3J0ICgKKwkiY29udGV4dCIKKwkiZW5jb2RpbmcvaGV4IgogCSJlcnJvcnMiCiAJImZtdCIKIAkuICJnZW4vdGhyaWZ0dGVzdCIKQEAgLTMxLDcgKzMzLDcgQEAKIHR5cGUgcHJpbnRpbmdIYW5kbGVyIHN0cnVjdHt9CiAKIC8vIFByaW50cyAidGVzdFZvaWQoKSIgYW5kIHJldHVybnMgbm90aGluZy4KLWZ1bmMgKHAgKnByaW50aW5nSGFuZGxlcikgVGVzdFZvaWQoKSAoZXJyIGVycm9yKSB7CitmdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RWb2lkKGN0eCBjb250ZXh0LkNvbnRleHQpIChlcnIgZXJyb3IpIHsKIAlmbXQuUHJpbnRsbigidGVzdFZvaWQoKSIpCiAJcmV0dXJuIG5pbAogfQpAQCAtNDIsMTggKzQ0LDI5IEBACiAvLwogLy8gUGFyYW1ldGVyczoKIC8vICAtIFRoaW5nCi1mdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RTdHJpbmcodGhpbmcgc3RyaW5nKSAociBzdHJpbmcsIGVyciBlcnJvcikgeworZnVuYyAocCAqcHJpbnRpbmdIYW5kbGVyKSBUZXN0U3RyaW5nKGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nIHN0cmluZykgKHIgc3RyaW5nLCBlcnIgZXJyb3IpIHsKIAlmbXQuUHJpbnRmKCJ0ZXN0U3RyaW5nKFwiJXNcIilcbiIsIHRoaW5nKQogCXJldHVybiB0aGluZywgbmlsCiB9CiAKKy8vIFByaW50cyAndGVzdEJvb2woIiV0IiknIHdpdGggdGhpbmcgYXMgJ3RydWUnIG9yICdmYWxzZScKKy8vIEBwYXJhbSBib29sIHRoaW5nIC0gdGhlIGJvb2wgdG8gcHJpbnQKKy8vIEByZXR1cm4gYm9vbCAtIHJldHVybnMgdGhlIGJvb2wgJ3RoaW5nJworLy8KKy8vIFBhcmFtZXRlcnM6CisvLyAgLSBUaGluZworZnVuYyAocCAqcHJpbnRpbmdIYW5kbGVyKSBUZXN0Qm9vbChjdHggY29udGV4dC5Db250ZXh0LCB0aGluZyBib29sKSAociBib29sLCBlcnIgZXJyb3IpIHsKKwlmbXQuUHJpbnRmKCJ0ZXN0Qm9vbCgldClcbiIsIHRoaW5nKQorCXJldHVybiB0aGluZywgbmlsCit9CisKIC8vIFByaW50cyAndGVzdEJ5dGUoIiVkIiknIHdpdGggdGhpbmcgYXMgJyVkJwogLy8gQHBhcmFtIGJ5dGUgdGhpbmcgLSB0aGUgYnl0ZSB0byBwcmludAogLy8gQHJldHVybiBieXRlIC0gcmV0dXJucyB0aGUgYnl0ZSAndGhpbmcnCiAvLwogLy8gUGFyYW1ldGVyczoKIC8vICAtIFRoaW5nCi1mdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RCeXRlKHRoaW5nIGludDgpIChyIGludDgsIGVyciBlcnJvcikgeworZnVuYyAocCAqcHJpbnRpbmdIYW5kbGVyKSBUZXN0Qnl0ZShjdHggY29udGV4dC5Db250ZXh0LCB0aGluZyBpbnQ4KSAociBpbnQ4LCBlcnIgZXJyb3IpIHsKIAlmbXQuUHJpbnRmKCJ0ZXN0Qnl0ZSglZClcbiIsIHRoaW5nKQogCXJldHVybiB0aGluZywgbmlsCiB9CkBAIC02NCw3ICs3Nyw3IEBACiAvLwogLy8gUGFyYW1ldGVyczoKIC8vICAtIFRoaW5nCi1mdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RJMzIodGhpbmcgaW50MzIpIChyIGludDMyLCBlcnIgZXJyb3IpIHsKK2Z1bmMgKHAgKnByaW50aW5nSGFuZGxlcikgVGVzdEkzMihjdHggY29udGV4dC5Db250ZXh0LCB0aGluZyBpbnQzMikgKHIgaW50MzIsIGVyciBlcnJvcikgewogCWZtdC5QcmludGYoInRlc3RJMzIoJWQpXG4iLCB0aGluZykKIAlyZXR1cm4gdGhpbmcsIG5pbAogfQpAQCAtNzUsNyArODgsNyBAQAogLy8KIC8vIFBhcmFtZXRlcnM6CiAvLyAgLSBUaGluZwotZnVuYyAocCAqcHJpbnRpbmdIYW5kbGVyKSBUZXN0STY0KHRoaW5nIGludDY0KSAociBpbnQ2NCwgZXJyIGVycm9yKSB7CitmdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RJNjQoY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgaW50NjQpIChyIGludDY0LCBlcnIgZXJyb3IpIHsKIAlmbXQuUHJpbnRmKCJ0ZXN0STY0KCVkKVxuIiwgdGhpbmcpCiAJcmV0dXJuIHRoaW5nLCBuaWwKIH0KQEAgLTg2LDE4ICs5OSwyOSBAQAogLy8KIC8vIFBhcmFtZXRlcnM6CiAvLyAgLSBUaGluZwotZnVuYyAocCAqcHJpbnRpbmdIYW5kbGVyKSBUZXN0RG91YmxlKHRoaW5nIGZsb2F0NjQpIChyIGZsb2F0NjQsIGVyciBlcnJvcikgeworZnVuYyAocCAqcHJpbnRpbmdIYW5kbGVyKSBUZXN0RG91YmxlKGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nIGZsb2F0NjQpIChyIGZsb2F0NjQsIGVyciBlcnJvcikgewogCWZtdC5QcmludGYoInRlc3REb3VibGUoJWYpXG4iLCB0aGluZykKIAlyZXR1cm4gdGhpbmcsIG5pbAogfQogCi0vLyBQcmludHMgJ3Rlc3RTdHJ1Y3QoInslc30iKScgd2hlcmUgdGhpbmcgaGFzIGJlZW4gZm9ybWF0dGVkIGludG8gYSBzdHJpbmcgb2YgY29tbWEgc2VwZXJhdGVkIHZhbHVlcworLy8gUHJpbnRzICd0ZXN0QmluYXJ5KCIlcyIpJyB3aGVyZSAnJXMnIGlzIGEgaGV4LWZvcm1hdHRlZCBzdHJpbmcgb2YgdGhpbmcncyBkYXRhCisvLyBAcGFyYW0gW11ieXRlIHRoaW5nIC0gdGhlIGJpbmFyeSB0byBwcmludAorLy8gQHJldHVybiBbXWJ5dGUgLSByZXR1cm5zIHRoZSBiaW5hcnkgJ3RoaW5nJworLy8KKy8vIFBhcmFtZXRlcnM6CisvLyAgLSBUaGluZworZnVuYyAocCAqcHJpbnRpbmdIYW5kbGVyKSBUZXN0QmluYXJ5KGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nIFtdYnl0ZSkgKHIgW11ieXRlLCBlcnIgZXJyb3IpIHsKKwlmbXQuUHJpbnRmKCJ0ZXN0QmluYXJ5KCVzKVxuIiwgaGV4LkVuY29kZVRvU3RyaW5nKHRoaW5nKSkKKwlyZXR1cm4gdGhpbmcsIG5pbAorfQorCisvLyBQcmludHMgJ3Rlc3RTdHJ1Y3QoInslc30iKScgd2hlcmUgdGhpbmcgaGFzIGJlZW4gZm9ybWF0dGVkIGludG8gYSBzdHJpbmcgb2YgY29tbWEgc2VwYXJhdGVkIHZhbHVlcwogLy8gQHBhcmFtIFh0cnVjdCB0aGluZyAtIHRoZSBYdHJ1Y3QgdG8gcHJpbnQKIC8vIEByZXR1cm4gWHRydWN0IC0gcmV0dXJucyB0aGUgWHRydWN0ICd0aGluZycKIC8vCiAvLyBQYXJhbWV0ZXJzOgogLy8gIC0gVGhpbmcKLWZ1bmMgKHAgKnByaW50aW5nSGFuZGxlcikgVGVzdFN0cnVjdCh0aGluZyAqWHRydWN0KSAociAqWHRydWN0LCBlcnIgZXJyb3IpIHsKK2Z1bmMgKHAgKnByaW50aW5nSGFuZGxlcikgVGVzdFN0cnVjdChjdHggY29udGV4dC5Db250ZXh0LCB0aGluZyAqWHRydWN0KSAociAqWHRydWN0LCBlcnIgZXJyb3IpIHsKIAlmbXQuUHJpbnRmKCJ0ZXN0U3RydWN0KHtcIiVzXCIsICVkLCAlZCwgJWR9KVxuIiwgdGhpbmcuU3RyaW5nVGhpbmcsIHRoaW5nLkJ5dGVUaGluZywgdGhpbmcuSTMyVGhpbmcsIHRoaW5nLkk2NFRoaW5nKQogCXJldHVybiB0aGluZywgZXJyCiB9CkBAIC0xMDgsMjAgKzEzMiwyMCBAQAogLy8KIC8vIFBhcmFtZXRlcnM6CiAvLyAgLSBUaGluZwotZnVuYyAocCAqcHJpbnRpbmdIYW5kbGVyKSBUZXN0TmVzdChuZXN0ICpYdHJ1Y3QyKSAociAqWHRydWN0MiwgZXJyIGVycm9yKSB7CitmdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3ROZXN0KGN0eCBjb250ZXh0LkNvbnRleHQsIG5lc3QgKlh0cnVjdDIpIChyICpYdHJ1Y3QyLCBlcnIgZXJyb3IpIHsKIAl0aGluZyA6PSBuZXN0LlN0cnVjdFRoaW5nCiAJZm10LlByaW50ZigidGVzdE5lc3QoeyVkLCB7XCIlc1wiLCAlZCwgJWQsICVkfSwgJWR9KVxuIiwgbmVzdC5CeXRlVGhpbmcsIHRoaW5nLlN0cmluZ1RoaW5nLCB0aGluZy5CeXRlVGhpbmcsIHRoaW5nLkkzMlRoaW5nLCB0aGluZy5JNjRUaGluZywgbmVzdC5JMzJUaGluZykKIAlyZXR1cm4gbmVzdCwgbmlsCiB9CiAKIC8vIFByaW50cyAndGVzdE1hcCgieyVzIiknIHdoZXJlIHRoaW5nIGhhcyBiZWVuIGZvcm1hdHRlZCBpbnRvIGEgc3RyaW5nIG9mICAna2V5ID0+IHZhbHVlJyBwYWlycwotLy8gIHNlcGVyYXRlZCBieSBjb21tYXMgYW5kIG5ldyBsaW5lcworLy8gIHNlcGFyYXRlZCBieSBjb21tYXMgYW5kIG5ldyBsaW5lcwogLy8gQHBhcmFtIG1hcDxpMzIsaTMyPiB0aGluZyAtIHRoZSBtYXA8aTMyLGkzMj4gdG8gcHJpbnQKIC8vIEByZXR1cm4gbWFwPGkzMixpMzI+IC0gcmV0dXJucyB0aGUgbWFwPGkzMixpMzI+ICd0aGluZycKIC8vCiAvLyBQYXJhbWV0ZXJzOgogLy8gIC0gVGhpbmcKLWZ1bmMgKHAgKnByaW50aW5nSGFuZGxlcikgVGVzdE1hcCh0aGluZyBtYXBbaW50MzJdaW50MzIpIChyIG1hcFtpbnQzMl1pbnQzMiwgZXJyIGVycm9yKSB7CitmdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RNYXAoY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgbWFwW2ludDMyXWludDMyKSAociBtYXBbaW50MzJdaW50MzIsIGVyciBlcnJvcikgewogCWZtdC5QcmludGYoInRlc3RNYXAoeyIpCiAJZmlyc3QgOj0gdHJ1ZQogCWZvciBrLCB2IDo9IHJhbmdlIHRoaW5nIHsKQEAgLTEzNywxMyArMTYxLDEzIEBACiB9CiAKIC8vIFByaW50cyAndGVzdFN0cmluZ01hcCgieyVzfSIpJyB3aGVyZSB0aGluZyBoYXMgYmVlbiBmb3JtYXR0ZWQgaW50byBhIHN0cmluZyBvZiAgJ2tleSA9PiB2YWx1ZScgcGFpcnMKLS8vICBzZXBlcmF0ZWQgYnkgY29tbWFzIGFuZCBuZXcgbGluZXMKKy8vICBzZXBhcmF0ZWQgYnkgY29tbWFzIGFuZCBuZXcgbGluZXMKIC8vIEBwYXJhbSBtYXA8c3RyaW5nLHN0cmluZz4gdGhpbmcgLSB0aGUgbWFwPHN0cmluZyxzdHJpbmc+IHRvIHByaW50CiAvLyBAcmV0dXJuIG1hcDxzdHJpbmcsc3RyaW5nPiAtIHJldHVybnMgdGhlIG1hcDxzdHJpbmcsc3RyaW5nPiAndGhpbmcnCiAvLwogLy8gUGFyYW1ldGVyczoKIC8vICAtIFRoaW5nCi1mdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RTdHJpbmdNYXAodGhpbmcgbWFwW3N0cmluZ11zdHJpbmcpIChyIG1hcFtzdHJpbmddc3RyaW5nLCBlcnIgZXJyb3IpIHsKK2Z1bmMgKHAgKnByaW50aW5nSGFuZGxlcikgVGVzdFN0cmluZ01hcChjdHggY29udGV4dC5Db250ZXh0LCB0aGluZyBtYXBbc3RyaW5nXXN0cmluZykgKHIgbWFwW3N0cmluZ11zdHJpbmcsIGVyciBlcnJvcikgewogCWZtdC5QcmludGYoInRlc3RTdHJpbmdNYXAoeyIpCiAJZmlyc3QgOj0gdHJ1ZQogCWZvciBrLCB2IDo9IHJhbmdlIHRoaW5nIHsKQEAgLTE1OSwxMyArMTgzLDEzIEBACiB9CiAKIC8vIFByaW50cyAndGVzdFNldCgieyVzfSIpJyB3aGVyZSB0aGluZyBoYXMgYmVlbiBmb3JtYXR0ZWQgaW50byBhIHN0cmluZyBvZiAgdmFsdWVzCi0vLyAgc2VwZXJhdGVkIGJ5IGNvbW1hcyBhbmQgbmV3IGxpbmVzCisvLyAgc2VwYXJhdGVkIGJ5IGNvbW1hcyBhbmQgbmV3IGxpbmVzCiAvLyBAcGFyYW0gc2V0PGkzMj4gdGhpbmcgLSB0aGUgc2V0PGkzMj4gdG8gcHJpbnQKIC8vIEByZXR1cm4gc2V0PGkzMj4gLSByZXR1cm5zIHRoZSBzZXQ8aTMyPiAndGhpbmcnCiAvLwogLy8gUGFyYW1ldGVyczoKIC8vICAtIFRoaW5nCi1mdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RTZXQodGhpbmcgbWFwW2ludDMyXWJvb2wpIChyIG1hcFtpbnQzMl1ib29sLCBlcnIgZXJyb3IpIHsKK2Z1bmMgKHAgKnByaW50aW5nSGFuZGxlcikgVGVzdFNldChjdHggY29udGV4dC5Db250ZXh0LCB0aGluZyBbXWludDMyKSAociBbXWludDMyLCBlcnIgZXJyb3IpIHsKIAlmbXQuUHJpbnRmKCJ0ZXN0U2V0KHsiKQogCWZpcnN0IDo9IHRydWUKIAlmb3IgaywgXyA6PSByYW5nZSB0aGluZyB7CkBAIC0xODEsMTMgKzIwNSwxMyBAQAogfQogCiAvLyBQcmludHMgJ3Rlc3RMaXN0KCJ7JXN9IiknIHdoZXJlIHRoaW5nIGhhcyBiZWVuIGZvcm1hdHRlZCBpbnRvIGEgc3RyaW5nIG9mICB2YWx1ZXMKLS8vICBzZXBlcmF0ZWQgYnkgY29tbWFzIGFuZCBuZXcgbGluZXMKKy8vICBzZXBhcmF0ZWQgYnkgY29tbWFzIGFuZCBuZXcgbGluZXMKIC8vIEBwYXJhbSBsaXN0PGkzMj4gdGhpbmcgLSB0aGUgbGlzdDxpMzI+IHRvIHByaW50CiAvLyBAcmV0dXJuIGxpc3Q8aTMyPiAtIHJldHVybnMgdGhlIGxpc3Q8aTMyPiAndGhpbmcnCiAvLwogLy8gUGFyYW1ldGVyczoKIC8vICAtIFRoaW5nCi1mdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RMaXN0KHRoaW5nIFtdaW50MzIpIChyIFtdaW50MzIsIGVyciBlcnJvcikgeworZnVuYyAocCAqcHJpbnRpbmdIYW5kbGVyKSBUZXN0TGlzdChjdHggY29udGV4dC5Db250ZXh0LCB0aGluZyBbXWludDMyKSAociBbXWludDMyLCBlcnIgZXJyb3IpIHsKIAlmbXQuUHJpbnRmKCJ0ZXN0TGlzdCh7IikKIAlmb3IgaSwgdiA6PSByYW5nZSB0aGluZyB7CiAJCWlmIGkgIT0gMCB7CkBAIC0yMDUsNyArMjI5LDcgQEAKIC8vCiAvLyBQYXJhbWV0ZXJzOgogLy8gIC0gVGhpbmcKLWZ1bmMgKHAgKnByaW50aW5nSGFuZGxlcikgVGVzdEVudW0odGhpbmcgTnVtYmVyeikgKHIgTnVtYmVyeiwgZXJyIGVycm9yKSB7CitmdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RFbnVtKGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nIE51bWJlcnopIChyIE51bWJlcnosIGVyciBlcnJvcikgewogCWZtdC5QcmludGYoInRlc3RFbnVtKCVkKVxuIiwgdGhpbmcpCiAJcmV0dXJuIHRoaW5nLCBuaWwKIH0KQEAgLTIxNiw3ICsyNDAsNyBAQAogLy8KIC8vIFBhcmFtZXRlcnM6CiAvLyAgLSBUaGluZwotZnVuYyAocCAqcHJpbnRpbmdIYW5kbGVyKSBUZXN0VHlwZWRlZih0aGluZyBVc2VySWQpIChyIFVzZXJJZCwgZXJyIGVycm9yKSB7CitmdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RUeXBlZGVmKGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nIFVzZXJJZCkgKHIgVXNlcklkLCBlcnIgZXJyb3IpIHsKIAlmbXQuUHJpbnRmKCJ0ZXN0VHlwZWRlZiglZClcbiIsIHRoaW5nKQogCXJldHVybiB0aGluZywgbmlsCiB9CkBAIC0yMjgsNyArMjUyLDcgQEAKIC8vCiAvLyBQYXJhbWV0ZXJzOgogLy8gIC0gSGVsbG8KLWZ1bmMgKHAgKnByaW50aW5nSGFuZGxlcikgVGVzdE1hcE1hcChoZWxsbyBpbnQzMikgKHIgbWFwW2ludDMyXW1hcFtpbnQzMl1pbnQzMiwgZXJyIGVycm9yKSB7CitmdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RNYXBNYXAoY3R4IGNvbnRleHQuQ29udGV4dCwgaGVsbG8gaW50MzIpIChyIG1hcFtpbnQzMl1tYXBbaW50MzJdaW50MzIsIGVyciBlcnJvcikgewogCWZtdC5QcmludGYoInRlc3RNYXBNYXAoJWQpXG4iLCBoZWxsbykKIAogCXIgPSBtYXBbaW50MzJdbWFwW2ludDMyXWludDMyewpAQCAtMjUwLDggKzI3NCwxNyBAQAogLy8KIC8vIFBhcmFtZXRlcnM6CiAvLyAgLSBBcmd1bWVudAotZnVuYyAocCAqcHJpbnRpbmdIYW5kbGVyKSBUZXN0SW5zYW5pdHkoYXJndW1lbnQgKkluc2FuaXR5KSAociBtYXBbVXNlcklkXW1hcFtOdW1iZXJ6XSpJbnNhbml0eSwgZXJyIGVycm9yKSB7Ci0JcmV0dXJuIG5pbCwgZXJyb3JzLk5ldygiTm8gSW5zYW5pdHkiKQorZnVuYyAocCAqcHJpbnRpbmdIYW5kbGVyKSBUZXN0SW5zYW5pdHkoY3R4IGNvbnRleHQuQ29udGV4dCwgYXJndW1lbnQgKkluc2FuaXR5KSAociBtYXBbVXNlcklkXW1hcFtOdW1iZXJ6XSpJbnNhbml0eSwgZXJyIGVycm9yKSB7CisJZm10LlByaW50ZigidGVzdEluc2FuaXR5KClcbiIpCisJciA9IG1ha2UobWFwW1VzZXJJZF1tYXBbTnVtYmVyel0qSW5zYW5pdHkpCisJclsxXSA9IG1hcFtOdW1iZXJ6XSpJbnNhbml0eXsKKwkJMjogYXJndW1lbnQsCisJCTM6IGFyZ3VtZW50LAorCX0KKwlyWzJdID0gbWFwW051bWJlcnpdKkluc2FuaXR5eworCQk2OiBOZXdJbnNhbml0eSgpLAorCX0KKwlyZXR1cm4KIH0KIAogLy8gUHJpbnRzICd0ZXN0TXVsdGkoKScKQEAgLTI3MSw3ICszMDQsNyBAQAogLy8gIC0gQXJnMwogLy8gIC0gQXJnNAogLy8gIC0gQXJnNQotZnVuYyAocCAqcHJpbnRpbmdIYW5kbGVyKSBUZXN0TXVsdGkoYXJnMCBpbnQ4LCBhcmcxIGludDMyLCBhcmcyIGludDY0LCBhcmczIG1hcFtpbnQxNl1zdHJpbmcsIGFyZzQgTnVtYmVyeiwgYXJnNSBVc2VySWQpIChyICpYdHJ1Y3QsIGVyciBlcnJvcikgeworZnVuYyAocCAqcHJpbnRpbmdIYW5kbGVyKSBUZXN0TXVsdGkoY3R4IGNvbnRleHQuQ29udGV4dCwgYXJnMCBpbnQ4LCBhcmcxIGludDMyLCBhcmcyIGludDY0LCBhcmczIG1hcFtpbnQxNl1zdHJpbmcsIGFyZzQgTnVtYmVyeiwgYXJnNSBVc2VySWQpIChyICpYdHJ1Y3QsIGVyciBlcnJvcikgewogCWZtdC5QcmludGYoInRlc3RNdWx0aSgpXG4iKQogCXIgPSBOZXdYdHJ1Y3QoKQogCkBAIC0yOTAsNyArMzIzLDcgQEAKIC8vCiAvLyBQYXJhbWV0ZXJzOgogLy8gIC0gQXJnCi1mdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RFeGNlcHRpb24oYXJnIHN0cmluZykgKGVyciBlcnJvcikgeworZnVuYyAocCAqcHJpbnRpbmdIYW5kbGVyKSBUZXN0RXhjZXB0aW9uKGN0eCBjb250ZXh0LkNvbnRleHQsIGFyZyBzdHJpbmcpIChlcnIgZXJyb3IpIHsKIAlmbXQuUHJpbnRmKCJ0ZXN0RXhjZXB0aW9uKCVzKVxuIiwgYXJnKQogCXN3aXRjaCBhcmcgewogCWNhc2UgIlhjZXB0aW9uIjoKQEAgLTMxNCw3ICszNDcsNyBAQAogLy8gUGFyYW1ldGVyczoKIC8vICAtIEFyZzAKIC8vICAtIEFyZzEKLWZ1bmMgKHAgKnByaW50aW5nSGFuZGxlcikgVGVzdE11bHRpRXhjZXB0aW9uKGFyZzAgc3RyaW5nLCBhcmcxIHN0cmluZykgKHIgKlh0cnVjdCwgZXJyIGVycm9yKSB7CitmdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RNdWx0aUV4Y2VwdGlvbihjdHggY29udGV4dC5Db250ZXh0LCBhcmcwIHN0cmluZywgYXJnMSBzdHJpbmcpIChyICpYdHJ1Y3QsIGVyciBlcnJvcikgewogCWZtdC5QcmludGYoInRlc3RNdWx0aUV4Y2VwdGlvbiglcywgJXMpXG4iLCBhcmcwLCBhcmcxKQogCXN3aXRjaCBhcmcwIHsKIApAQCAtMzQzLDcgKzM3Niw3IEBACiAvLwogLy8gUGFyYW1ldGVyczoKIC8vICAtIFNlY29uZHNUb1NsZWVwCi1mdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RPbmV3YXkoc2Vjb25kc1RvU2xlZXAgaW50MzIpIChlcnIgZXJyb3IpIHsKK2Z1bmMgKHAgKnByaW50aW5nSGFuZGxlcikgVGVzdE9uZXdheShjdHggY29udGV4dC5Db250ZXh0LCBzZWNvbmRzVG9TbGVlcCBpbnQzMikgKGVyciBlcnJvcikgewogCWZtdC5QcmludGYoInRlc3RPbmV3YXkoJWQpOiBTbGVlcGluZy4uLlxuIiwgc2Vjb25kc1RvU2xlZXApCiAJdGltZS5TbGVlcCh0aW1lLlNlY29uZCAqIHRpbWUuRHVyYXRpb24oc2Vjb25kc1RvU2xlZXApKQogCWZtdC5QcmludGYoInRlc3RPbmV3YXkoJWQpOiBkb25lIHNsZWVwaW5nIVxuIiwgc2Vjb25kc1RvU2xlZXApCmRpZmYgLS1naXQgYS90ZXN0L2dvL3NyYy9jb21tb24vc2VydmVyLmdvIGIvdGVzdC9nby9zcmMvY29tbW9uL3NlcnZlci5nbwppbmRleCBlNzdjZDM3Li41YWM0NDAwIDEwMDY0NAotLS0gYS90ZXN0L2dvL3NyYy9jb21tb24vc2VydmVyLmdvCisrKyBiL3Rlc3QvZ28vc3JjL2NvbW1vbi9zZXJ2ZXIuZ28KQEAgLTIwLDYgKzIwLDcgQEAKIHBhY2thZ2UgY29tbW9uCiAKIGltcG9ydCAoCisJImNvbXByZXNzL3psaWIiCiAJImNyeXB0by90bHMiCiAJImZsYWciCiAJImZtdCIKQEAgLTM2LDE1ICszNywxNyBAQAogCWZsYWcuQm9vbFZhcigmZGVidWdTZXJ2ZXJQcm90b2NvbCwgImRlYnVnX3NlcnZlcl9wcm90b2NvbCIsIGZhbHNlLCAidHVybiBzZXJ2ZXIgcHJvdG9jb2wgdHJhY2Ugb24iKQogfQogCi1mdW5jIFN0YXJ0U2VydmVyKAorZnVuYyBHZXRTZXJ2ZXJQYXJhbXMoCiAJaG9zdCBzdHJpbmcsCiAJcG9ydCBpbnQ2NCwKIAlkb21haW5fc29ja2V0IHN0cmluZywKIAl0cmFuc3BvcnQgc3RyaW5nLAogCXByb3RvY29sIHN0cmluZywKIAlzc2wgYm9vbCwKLQloYW5kbGVyIHRocmlmdHRlc3QuVGhyaWZ0VGVzdCkgKHNydiAqdGhyaWZ0LlRTaW1wbGVTZXJ2ZXIsIGVyciBlcnJvcikgeworCWNlcnRQYXRoIHN0cmluZywKKwloYW5kbGVyIHRocmlmdHRlc3QuVGhyaWZ0VGVzdCkgKHRocmlmdC5UUHJvY2Vzc29yLCB0aHJpZnQuVFNlcnZlclRyYW5zcG9ydCwgdGhyaWZ0LlRUcmFuc3BvcnRGYWN0b3J5LCB0aHJpZnQuVFByb3RvY29sRmFjdG9yeSwgZXJyb3IpIHsKIAorCXZhciBlcnIgZXJyb3IKIAlob3N0UG9ydCA6PSBmbXQuU3ByaW50ZigiJXM6JWQiLCBob3N0LCBwb3J0KQogCiAJdmFyIHByb3RvY29sRmFjdG9yeSB0aHJpZnQuVFByb3RvY29sRmFjdG9yeQpAQCAtNTgsNyArNjEsNyBAQAogCWNhc2UgImJpbmFyeSI6CiAJCXByb3RvY29sRmFjdG9yeSA9IHRocmlmdC5OZXdUQmluYXJ5UHJvdG9jb2xGYWN0b3J5RGVmYXVsdCgpCiAJZGVmYXVsdDoKLQkJcmV0dXJuIG5pbCwgZm10LkVycm9yZigiSW52YWxpZCBwcm90b2NvbCBzcGVjaWZpZWQgJXMiLCBwcm90b2NvbCkKKwkJcmV0dXJuIG5pbCwgbmlsLCBuaWwsIG5pbCwgZm10LkVycm9yZigiSW52YWxpZCBwcm90b2NvbCBzcGVjaWZpZWQgJXMiLCBwcm90b2NvbCkKIAl9CiAJaWYgZGVidWdTZXJ2ZXJQcm90b2NvbCB7CiAJCXByb3RvY29sRmFjdG9yeSA9IHRocmlmdC5OZXdURGVidWdQcm90b2NvbEZhY3RvcnkocHJvdG9jb2xGYWN0b3J5LCAic2VydmVyOiIpCkBAIC02OCw3ICs3MSw3IEBACiAJaWYgc3NsIHsKIAkJY2ZnIDo9IG5ldyh0bHMuQ29uZmlnKQogCQlpZiBjZXJ0LCBlcnIgOj0gdGxzLkxvYWRYNTA5S2V5UGFpcihjZXJ0UGF0aCsiL3NlcnZlci5jcnQiLCBjZXJ0UGF0aCsiL3NlcnZlci5rZXkiKTsgZXJyICE9IG5pbCB7Ci0JCQlyZXR1cm4gbmlsLCBlcnIKKwkJCXJldHVybiBuaWwsIG5pbCwgbmlsLCBuaWwsIGVycgogCQl9IGVsc2UgewogCQkJY2ZnLkNlcnRpZmljYXRlcyA9IGFwcGVuZChjZmcuQ2VydGlmaWNhdGVzLCBjZXJ0KQogCQl9CkBAIC04MSwzMyArODQsMjggQEAKIAkJfQogCX0KIAlpZiBlcnIgIT0gbmlsIHsKLQkJcmV0dXJuIG5pbCwgZXJyCisJCXJldHVybiBuaWwsIG5pbCwgbmlsLCBuaWwsIGVycgogCX0KIAogCXZhciB0cmFuc3BvcnRGYWN0b3J5IHRocmlmdC5UVHJhbnNwb3J0RmFjdG9yeQogCiAJc3dpdGNoIHRyYW5zcG9ydCB7CiAJY2FzZSAiaHR0cCI6Ci0JCXJldHVybiBuaWwsIGZtdC5FcnJvcmYoIkh0dHAgc2VydmVyIHRyYW5zcG9ydCBpcyBub3Qgc3VwcG9ydGVkIikKLQkJLy8gdHJhbnMsIGVyciA9IHRocmlmdC5OZXdUSHR0cENsaWVudChmbXQuU3ByaW50ZigiaHR0cDovLyVzL3NlcnZpY2UiLCBob3N0UG9ydCkpCi0JCS8vIGlmIGVyciAhPSBuaWwgewotCQkvLyAJcmV0dXJuIG5pbCwgZXJyCi0JCS8vIH0KKwkJLy8gdGhlcmUgaXMgbm8gc3VjaCBmYWN0b3J5LCBhbmQgd2UgZG9uJ3QgbmVlZCBhbnkKKwkJdHJhbnNwb3J0RmFjdG9yeSA9IG5pbAogCWNhc2UgImZyYW1lZCI6CiAJCXRyYW5zcG9ydEZhY3RvcnkgPSB0aHJpZnQuTmV3VFRyYW5zcG9ydEZhY3RvcnkoKQogCQl0cmFuc3BvcnRGYWN0b3J5ID0gdGhyaWZ0Lk5ld1RGcmFtZWRUcmFuc3BvcnRGYWN0b3J5KHRyYW5zcG9ydEZhY3RvcnkpCiAJY2FzZSAiYnVmZmVyZWQiOgogCQl0cmFuc3BvcnRGYWN0b3J5ID0gdGhyaWZ0Lk5ld1RCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkoODE5MikKKwljYXNlICJ6bGliIjoKKwkJdHJhbnNwb3J0RmFjdG9yeSA9IHRocmlmdC5OZXdUWmxpYlRyYW5zcG9ydEZhY3RvcnkoemxpYi5CZXN0Q29tcHJlc3Npb24pCiAJY2FzZSAiIjoKIAkJdHJhbnNwb3J0RmFjdG9yeSA9IHRocmlmdC5OZXdUVHJhbnNwb3J0RmFjdG9yeSgpCiAJZGVmYXVsdDoKLQkJcmV0dXJuIG5pbCwgZm10LkVycm9yZigiSW52YWxpZCB0cmFuc3BvcnQgc3BlY2lmaWVkICVzIiwgdHJhbnNwb3J0KQorCQlyZXR1cm4gbmlsLCBuaWwsIG5pbCwgbmlsLCBmbXQuRXJyb3JmKCJJbnZhbGlkIHRyYW5zcG9ydCBzcGVjaWZpZWQgJXMiLCB0cmFuc3BvcnQpCiAJfQogCXByb2Nlc3NvciA6PSB0aHJpZnR0ZXN0Lk5ld1RocmlmdFRlc3RQcm9jZXNzb3IoaGFuZGxlcikKLQlzZXJ2ZXIgOj0gdGhyaWZ0Lk5ld1RTaW1wbGVTZXJ2ZXI0KHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpCi0JaWYgZXJyID0gc2VydmVyLkxpc3RlbigpOyBlcnIgIT0gbmlsIHsKLQkJcmV0dXJuCi0JfQotCWdvIHNlcnZlci5BY2NlcHRMb29wKCkKLQlyZXR1cm4gc2VydmVyLCBuaWwKKworCXJldHVybiBwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5LCBuaWwKIH0KZGlmZiAtLWdpdCBhL3Rlc3QvZ28vc3JjL2NvbW1vbi9zaW1wbGVfaGFuZGxlci5nbyBiL3Rlc3QvZ28vc3JjL2NvbW1vbi9zaW1wbGVfaGFuZGxlci5nbwppbmRleCA0MzM2MTZkLi4wYzk0NjNkIDEwMDY0NAotLS0gYS90ZXN0L2dvL3NyYy9jb21tb24vc2ltcGxlX2hhbmRsZXIuZ28KKysrIGIvdGVzdC9nby9zcmMvY29tbW9uL3NpbXBsZV9oYW5kbGVyLmdvCkBAIC0zNyw2ICszNywxMCBAQAogCXJldHVybiB0aGluZywgbmlsCiB9CiAKK2Z1bmMgKHAgKnNpbXBsZUhhbmRsZXIpIFRlc3RCb29sKHRoaW5nIFtdYnl0ZSkgKHIgW11ieXRlLCBlcnIgZXJyb3IpIHsKKwlyZXR1cm4gdGhpbmcsIG5pbAorfQorCiBmdW5jIChwICpzaW1wbGVIYW5kbGVyKSBUZXN0Qnl0ZSh0aGluZyBpbnQ4KSAociBpbnQ4LCBlcnIgZXJyb3IpIHsKIAlyZXR1cm4gdGhpbmcsIG5pbAogfQpAQCAtNTMsNiArNTcsMTAgQEAKIAlyZXR1cm4gdGhpbmcsIG5pbAogfQogCitmdW5jIChwICpzaW1wbGVIYW5kbGVyKSBUZXN0QmluYXJ5KHRoaW5nIFtdYnl0ZSkgKHIgW11ieXRlLCBlcnIgZXJyb3IpIHsKKwlyZXR1cm4gdGhpbmcsIG5pbAorfQorCiBmdW5jIChwICpzaW1wbGVIYW5kbGVyKSBUZXN0U3RydWN0KHRoaW5nICpYdHJ1Y3QpIChyICpYdHJ1Y3QsIGVyciBlcnJvcikgewogCXJldHVybiByLCBlcnIKIH0KQEAgLTY5LDcgKzc3LDcgQEAKIAlyZXR1cm4gdGhpbmcsIG5pbAogfQogCi1mdW5jIChwICpzaW1wbGVIYW5kbGVyKSBUZXN0U2V0KHRoaW5nIG1hcFtpbnQzMl1ib29sKSAociBtYXBbaW50MzJdYm9vbCwgZXJyIGVycm9yKSB7CitmdW5jIChwICpzaW1wbGVIYW5kbGVyKSBUZXN0U2V0KHRoaW5nIFtdaW50MzIpIChyIFtdaW50MzIsIGVyciBlcnJvcikgewogCXJldHVybiB0aGluZywgbmlsCiB9CiAKZGlmZiAtLWdpdCBhL3Rlc3QvaGF4ZS9NYWtlZmlsZS5hbSBiL3Rlc3QvaGF4ZS9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzA0ODNlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9oYXhlL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMTA0IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworVEhSSUZUQ01EID0gJChUSFJJRlQpIC0tZ2VuIGhheGUgLXIKK1RIUklGVFRFU1QgPSAkKHRvcF9zcmNkaXIpL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKKworQklOX0NQUCA9IGJpbi9NYWluLWRlYnVnCitCSU5fUEhQID0gYmluL3BocC9NYWluLWRlYnVnLnBocAorQklOX1BIUF9XRUIgPSBiaW4vcGhwLXdlYi1zZXJ2ZXIvTWFpbi1kZWJ1Zy5waHAKKworZ2VuLWhheGUvdGhyaWZ0L3Rlc3QvVGhyaWZ0VGVzdC5oeDogJChUSFJJRlRURVNUKQorCSQoVEhSSUZUQ01EKSAkKFRIUklGVFRFU1QpCisKK2FsbC1sb2NhbDogJChCSU5fQ1BQKSAkKEJJTl9QSFApICQoQklOX1BIUF9XRUIpCisKKyQoQklOX0NQUCk6IFwKKwkJc3JjLyouaHggXAorCQkuLi8uLi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvKiovKi5oeCBcCisJCWdlbi1oYXhlL3RocmlmdC90ZXN0L1RocmlmdFRlc3QuaHgKKwkkKEhBWEUpIC0tY3dkIC4gIGNwcC5oeG1sCisKKyQoQklOX1BIUCk6IFwKKwkJc3JjLyouaHggXAorCQkuLi8uLi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvKiovKi5oeCBcCisJCWdlbi1oYXhlL3RocmlmdC90ZXN0L1RocmlmdFRlc3QuaHgKKwkkKEhBWEUpIC0tY3dkIC4gIHBocC5oeG1sCisKKyQoQklOX1BIUF9XRUIpOiBcCisJCXNyYy8qLmh4IFwKKwkJLi4vLi4vbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0LyoqLyouaHggXAorCQlnZW4taGF4ZS90aHJpZnQvdGVzdC9UaHJpZnRUZXN0Lmh4CisJJChIQVhFKSAtLWN3ZCAuICBwaHAtd2ViLXNlcnZlci5oeG1sCisKKworCisjVE9ETzogb3RoZXIgaGF4ZSB0YXJnZXRzCisjICAgICQoSEFYRSkgIC0tY3dkIC4gIGNzaGFycAorIyAgICAkKEhBWEUpICAtLWN3ZCAuICBmbGFzaAorIyAgICAkKEhBWEUpICAtLWN3ZCAuICBqYXZhCisjICAgICQoSEFYRSkgIC0tY3dkIC4gIGphdmFzY3JpcHQKKyMgICAgJChIQVhFKSAgLS1jd2QgLiAgbmVrbworIyAgICAkKEhBWEUpICAtLWN3ZCAuICBweXRob24gICMgbmVlZHMgSGF4ZSAzLjIuMAorCisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIC1yIGdlbi1oYXhlIGJpbgorCisuTk9UUEFSQUxMRUw6CisKK2NoZWNrOiBjaGVja19jcHAgXAorCWNoZWNrX3BocCBcCisJY2hlY2tfcGhwX3dlYiAKKworY2hlY2tfY3BwOiAkKEJJTl9DUFApIAorCXRpbWVvdXQgMjAgJChCSU5fQ1BQKSBzZXJ2ZXIgJgorCXNsZWVwIDEKKwkkKEJJTl9DUFApIGNsaWVudAorCXNsZWVwIDEwCisKK2NoZWNrX3BocDogJChCSU5fUEhQKSAKKwl0aW1lb3V0IDIwIHBocCAtZiAkKEJJTl9QSFApIHNlcnZlciAmCisJc2xlZXAgMQorCXBocCAtZiAkKEJJTl9QSFApIGNsaWVudAorCXNsZWVwIDEwCisKK2NoZWNrX3BocF93ZWI6ICQoQklOX1BIUF9XRUIpICQoQklOX0NQUCkKKwl0aW1lb3V0IDIwIHBocCAtUyAxMjcuMC4wLjE6OTA5MCByb3V0ZXIucGhwICYKKwlzbGVlcCAxCisJJChCSU5fQ1BQKSBjbGllbnQgLS10cmFuc3BvcnQgaHR0cAorCXNsZWVwIDEwCisKKworRVhUUkFfRElTVCA9IFwKKwlzcmMgXAorCWNwcC5oeG1sIFwKKwljc2hhcnAuaHhtbCBcCisJZmxhc2guaHhtbCBcCisJamF2YS5oeG1sIFwKKwlqYXZhc2NyaXB0Lmh4bWwgXAorCW5la28uaHhtbCBcCisJcGhwLmh4bWwgXAorCXB5dGhvbi5oeG1sIFwKKwlyb3V0ZXIucGhwIFwKKwlwcm9qZWN0LmhpZGUgXAorCXBocC13ZWItc2VydmVyLmh4bWwgXAorCVRlc3RDbGllbnRTZXJ2ZXIuaHhwcm9qIFwKKwltYWtlX2FsbC5iYXQgXAorCW1ha2VfYWxsLnNoCmRpZmYgLS1naXQgYS90ZXN0L2hheGUvVGVzdENsaWVudFNlcnZlci5oeHByb2ogYi90ZXN0L2hheGUvVGVzdENsaWVudFNlcnZlci5oeHByb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY5NmQ4MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvaGF4ZS9UZXN0Q2xpZW50U2VydmVyLmh4cHJvagpAQCAtMCwwICsxLDY3IEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/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+IGFyZzMgLQorICAgICogQHBhcmFtIE51bWJlcnogYXJnNCAtCisgICAgKiBAcGFyYW0gVXNlcklkIGFyZzUgLQorICAgICogQHJldHVybiBYdHJ1Y3QgLSByZXR1cm5zIGFuIFh0cnVjdAorICAgICogICAgd2l0aCBzdHJpbmdfdGhpbmcgPSAiSGVsbG8yLCBieXRlX3RoaW5nID0gYXJnMCwgaTMyX3RoaW5nID0gYXJnMQorICAgICogICAgYW5kIGk2NF90aGluZyA9IGFyZzIKKyAgICAqCisgICAgKiBAcGFyYW0gYXJnMAorICAgICogQHBhcmFtIGFyZzEKKyAgICAqIEBwYXJhbSBhcmcyCisgICAgKiBAcGFyYW0gYXJnMworICAgICogQHBhcmFtIGFyZzQKKyAgICAqIEBwYXJhbSBhcmc1CisgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdE11bHRpKGFyZzA6aGF4ZS5JbnQzMiwgYXJnMTpoYXhlLkludDMyLCBhcmcyOmhheGUuSW50NjQsCisgICAgICAgIGFyZzM6SW50TWFwPFN0cmluZz4sIGFyZzQ6SW50LCBhcmc1OmhheGUuSW50NjQpOlh0cnVjdAorICAgIHsKKyAgICAgICAgdHJhY2UoInRlc3RNdWx0aSgpIik7CisgICAgICAgIHZhciBoZWxsbyA9IG5ldyBYdHJ1Y3QoKTsKKyAgICAgICAgaGVsbG8uc3RyaW5nX3RoaW5nID0gIkhlbGxvMiI7CisgICAgICAgIGhlbGxvLmJ5dGVfdGhpbmcgPSBhcmcwOworICAgICAgICBoZWxsby5pMzJfdGhpbmcgPSBhcmcxOworICAgICAgICBoZWxsby5pNjRfdGhpbmcgPSBhcmcyOworICAgICAgICByZXR1cm4gaGVsbG87CisgICAgfQorCisgICAgLyoqCisgICAgKiBQcmludCAndGVzdEV4Y2VwdGlvbiglcyknIHdpdGggYXJnIGFzICclcycKKyAgICAqIEBwYXJhbSBzdHJpbmcgYXJnIC0gYSBzdHJpbmcgaW5kaWNhdGlvbiB3aGF0IHR5cGUgb2YgZXhjZXB0aW9uIHRvIHRocm93CisgICAgKiBpZiBhcmcgPT0gIlhjZXB0aW9uIiB0aHJvdyBYY2VwdGlvbiB3aXRoIGVycm9yQ29kZSA9IDEwMDEgYW5kIG1lc3NhZ2UgPSBhcmcKKyAgICAqIGVsc2VuIGlmIGFyZyA9PSAiVEV4Y2VwdGlvbiIgdGhyb3cgVEV4Y2VwdGlvbgorICAgICogZWxzZSBkbyBub3QgdGhyb3cgYW55dGhpbmcKKyAgICAqCisgICAgKiBAcGFyYW0gYXJnCisgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdEV4Y2VwdGlvbihhcmc6U3RyaW5nKTpWb2lkCisgICAgeworICAgICAgICB0cmFjZSgidGVzdEV4Y2VwdGlvbigiICsgYXJnICsgIikiKTsKKyAgICAgICAgaWYgKGFyZyA9PSAiWGNlcHRpb24iKSB7CisgICAgICAgICAgICB2YXIgeCA9IG5ldyBYY2VwdGlvbigpOworICAgICAgICAgICAgeC5lcnJvckNvZGUgPSAxMDAxOworICAgICAgICAgICAgeC5tZXNzYWdlID0gYXJnOworICAgICAgICAgICAgdGhyb3cgeDsKKyAgICAgICAgfTsKKyAgICAgICAgaWYgKGFyZyA9PSAiVEV4Y2VwdGlvbiIpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCk7CisgICAgICAgIH07CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKioKKyAgICAqIFByaW50ICd0ZXN0TXVsdGlFeGNlcHRpb24oJXMsICVzKScgd2l0aCBhcmcwIGFzICclcycgYW5kIGFyZzEgYXMgJyVzJworICAgICogQHBhcmFtIHN0cmluZyBhcmcgLSBhIHN0cmluZyBpbmRpY2F0aW9uIHdoYXQgdHlwZSBvZiBleGNlcHRpb24gdG8gdGhyb3cKKyAgICAqIGlmIGFyZzAgPT0gIlhjZXB0aW9uIgorICAgICogdGhyb3cgWGNlcHRpb24gd2l0aCBlcnJvckNvZGUgPSAxMDAxIGFuZCBtZXNzYWdlID0gIlRoaXMgaXMgYW4gWGNlcHRpb24iCisgICAgKiBlbHNlIGlmIGFyZzAgPT0gIlhjZXB0aW9uMiIKKyAgICAqIHRocm93IFhjZXB0aW9uMiB3aXRoIGVycm9yQ29kZSA9IDIwMDIgYW5kIG1lc3NhZ2UgPSAiVGhpcyBpcyBhbiBYY2VwdGlvbjIiCisgICAgKiBlbHNlIGRvIG5vdCB0aHJvdyBhbnl0aGluZworICAgICogQHJldHVybiBYdHJ1Y3QgLSBhbiBYdHJ1Y3Qgd2l0aCBzdHJpbmdfdGhpbmcgPSBhcmcxCisgICAgKgorICAgICogQHBhcmFtIGFyZzAKKyAgICAqIEBwYXJhbSBhcmcxCisgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdE11bHRpRXhjZXB0aW9uKGFyZzA6U3RyaW5nLCBhcmcxOlN0cmluZyk6WHRydWN0CisgICAgeworICAgICAgICB0cmFjZSgidGVzdE11bHRpRXhjZXB0aW9uKCIgKyBhcmcwICsgIiwgIiArIGFyZzEgKyAiKSIpOworICAgICAgICBpZiAoYXJnMCA9PSAiWGNlcHRpb24iKSB7CisgICAgICAgICAgICB2YXIgeCA9IG5ldyBYY2VwdGlvbigpOworICAgICAgICAgICAgeC5lcnJvckNvZGUgPSAxMDAxOworICAgICAgICAgICAgeC5tZXNzYWdlID0gIlRoaXMgaXMgYW4gWGNlcHRpb24iOworICAgICAgICAgICAgdGhyb3cgeDsKKyAgICAgICAgfSBlbHNlIGlmIChhcmcwID09ICJYY2VwdGlvbjIiKSB7CisgICAgICAgICAgICB2YXIgeCA9IG5ldyBYY2VwdGlvbjIoKTsKKyAgICAgICAgICAgIHguZXJyb3JDb2RlID0gMjAwMjsKKyAgICAgICAgICAgIHguc3RydWN0X3RoaW5nID0gbmV3IFh0cnVjdCgpOworICAgICAgICAgICAgeC5zdHJ1Y3RfdGhpbmcuc3RyaW5nX3RoaW5nID0gIlRoaXMgaXMgYW4gWGNlcHRpb24yIjsKKyAgICAgICAgICAgIHRocm93IHg7CisgICAgICAgIH07CisgICAgICAgIHZhciByZXN1bHQgPSBuZXcgWHRydWN0KCk7CisgICAgICAgIHJlc3VsdC5zdHJpbmdfdGhpbmcgPSBhcmcxOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICogUHJpbnQgJ3Rlc3RPbmV3YXkoJWQpOiBTbGVlcGluZy4uLicgd2l0aCBzZWNvbmRzVG9TbGVlcCBhcyAnJWQnCisgICAgKiBzbGVlcCAnc2Vjb25kc1RvU2xlZXAnCisgICAgKiBQcmludCAndGVzdE9uZXdheSglZCk6IGRvbmUgc2xlZXBpbmchJyB3aXRoIHNlY29uZHNUb1NsZWVwIGFzICclZCcKKyAgICAqIEBwYXJhbSBpMzIgc2Vjb25kc1RvU2xlZXAgLSB0aGUgbnVtYmVyIG9mIHNlY29uZHMgdG8gc2xlZXAKKyAgICAqCisgICAgKiBAcGFyYW0gc2Vjb25kc1RvU2xlZXAKKyAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0T25ld2F5KHNlY29uZHNUb1NsZWVwOmhheGUuSW50MzIpOlZvaWQKKyAgICB7CisgICAgICAgIHRyYWNlKCJ0ZXN0T25ld2F5KCIgKyBzZWNvbmRzVG9TbGVlcCArICIpLCBzbGVlcGluZy4uLiIpOworICAgICAgICBTeXMuc2xlZXAoc2Vjb25kc1RvU2xlZXApOworICAgICAgICB0cmFjZSgidGVzdE9uZXdheSBmaW5pc2hlZCIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U3RvcCgpOlZvaWQKKyAgICB7CisgICAgICAgIGlmIChzZXJ2ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgc2VydmVyLlN0b3AoKTsKKyAgICAgICAgfTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L2hzL0NNYWtlTGlzdHMudHh0IGIvdGVzdC9ocy9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWNhM2ZhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9ocy9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDExNCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3NldChoc190ZXN0X2dlbgorICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMvQ29uc3RhbnRzRGVtb19Db25zdHMuaHMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzL0NvbnN0YW50c0RlbW9fVHlwZXMuaHMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzL0RlYnVnUHJvdG9UZXN0X0NvbnN0cy5ocworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMvRGVidWdQcm90b1Rlc3RfVHlwZXMuaHMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzL0VtcHR5U2VydmljZV9DbGllbnQuaHMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzL0VtcHR5U2VydmljZS5ocworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMvRW1wdHlTZXJ2aWNlX0lmYWNlLmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9JbmNsdWRlX0NvbnN0cy5ocworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMvSW5jbHVkZV9UeXBlcy5ocworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMvSW5oZXJpdGVkX0NsaWVudC5ocworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMvSW5oZXJpdGVkLmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9Jbmhlcml0ZWRfSWZhY2UuaHMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzL1JldmVyc2VPcmRlclNlcnZpY2VfQ2xpZW50LmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9SZXZlcnNlT3JkZXJTZXJ2aWNlLmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9SZXZlcnNlT3JkZXJTZXJ2aWNlX0lmYWNlLmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9TZWNvbmRTZXJ2aWNlX0NsaWVudC5ocworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMvU2Vjb25kU2VydmljZS5ocworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMvU2Vjb25kU2VydmljZV9JZmFjZS5ocworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMvU2VydmljZUZvckV4Y2VwdGlvbldpdGhBTWFwX0NsaWVudC5ocworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMvU2VydmljZUZvckV4Y2VwdGlvbldpdGhBTWFwLmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9TZXJ2aWNlRm9yRXhjZXB0aW9uV2l0aEFNYXBfSWZhY2UuaHMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzL1Nydl9DbGllbnQuaHMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzL1Nydi5ocworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMvU3J2X0lmYWNlLmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9UaHJpZnRUZXN0X0NsaWVudC5ocworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMvVGhyaWZ0VGVzdF9Db25zdHMuaHMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzL1RocmlmdFRlc3QuaHMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzL1RocmlmdFRlc3RfSWZhY2UuaHMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzL1RocmlmdFRlc3RfVHlwZXMuaHMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzL1lvd3phX0NsaWVudC5ocworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMvWW93emEuaHMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzL1lvd3phX0lmYWNlLmhzCispCisKK3NldChoc19jcm9zc3Rlc3RfYXBwcworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9UZXN0U2VydmVyCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L1Rlc3RDbGllbnQKKykKK3NldChoc19jcm9zc3Rlc3RfYXJncworICAgIC1pZ2VuLWhzCisgICAgLW9kaXI9JHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9CisgICAgLWhpZGlyPSR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfQorKQorCitpZiAoQ01BS0VfQlVJTERfVFlQRSBTVFJFUVVBTCAiRGVidWciKQorICBzZXQoaHNfb3B0aW1pemUgLU8wKQorZWxzZSgpCisgIHNldChoc19vcHRpbWl6ZSAtTzEpCitlbmRpZigpCisKK2FkZF9jdXN0b21fY29tbWFuZCgKKyAgICBPVVRQVVQgJHtoc19jcm9zc3Rlc3RfYXBwc30KKyAgICBDT01NQU5EICR7R0hDfSAke2hzX29wdGltaXplfSAke2hzX2Nyb3NzdGVzdF9hcmdzfSAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vVGVzdFNlcnZlci5ocyAtbyBUZXN0U2VydmVyCisgICAgQ09NTUFORCAke0dIQ30gJHtoc19vcHRpbWl6ZX0gJHtoc19jcm9zc3Rlc3RfYXJnc30gJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L1Rlc3RDbGllbnQuaHMgLW8gVGVzdENsaWVudAorICAgIERFUEVORFMgJHtoc190ZXN0X2dlbn0gaGFza2VsbF9saWJyYXJ5IFRlc3RTZXJ2ZXIuaHMgVGVzdENsaWVudC5ocworKQorYWRkX2N1c3RvbV90YXJnZXQoaGFza2VsbF9jcm9zc3Rlc3QgQUxMCisgICAgQ09NTUVOVCAiQnVpbGRpbmcgSGFza2VsbCBjcm9zcyB0ZXN0IGV4ZWN1dGFibGVzIgorICAgIERFUEVORFMgJHtoc19jcm9zc3Rlc3RfYXBwc30KKykKKworc2V0KGhzX3Rlc3Rfc291cmNlcworICAgIENvbnN0YW50c0RlbW9fTWFpbi5ocworICAgIERlYnVnUHJvdG9UZXN0X01haW4uaHMKKyAgICBJbmNsdWRlX01haW4uaHMKKyAgICBUaHJpZnRUZXN0X01haW4uaHMKKykKK3NldChoc190ZXN0X2FyZ3MKKyAgICAtV2FsbAorICAgIC1YU2NvcGVkVHlwZVZhcmlhYmxlcworICAgIC1pJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L2xpYi9ocy9zcmMKKyAgICAtaSR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMKKykKK2FkZF9jdXN0b21fdGFyZ2V0KGhhc2tlbGxfdGVzdHMgQUxMIERFUEVORFMgJHtoc190ZXN0X2dlbn0pCitmb3JlYWNoKFNSQyAke2hzX3Rlc3Rfc291cmNlc30pCisgICAgZ2V0X2ZpbGVuYW1lX2NvbXBvbmVudChCQVNFICR7U1JDfSBOQU1FX1dFKQorICAgIGFkZF90ZXN0KE5BTUUgSGFza2VsbFRlc3RzLSR7QkFTRX0KKyAgICAgICAgQ09NTUFORCAke1JVTl9IQVNLRUxMfSAke2hzX3Rlc3RfYXJnc30gJHtTUkN9CisgICAgICAgIFdPUktJTkdfRElSRUNUT1JZICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfSkKK2VuZGZvcmVhY2goKQorCitzZXQoaHNfdGVzdF9nZW5fc291cmNlcworICAgICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L0NvbnN0YW50c0RlbW8udGhyaWZ0CisgICAgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvRGVidWdQcm90b1Rlc3QudGhyaWZ0CisgICAgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKKyAgICAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9JbmNsdWRlLnRocmlmdAorKQorYWRkX2N1c3RvbV9jb21tYW5kKE9VVFBVVCAke2hzX3Rlc3RfZ2VufQorICAgIENPTU1BTkQgJHtUSFJJRlRfQ09NUElMRVJ9IC0tZ2VuIGhzICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L0NvbnN0YW50c0RlbW8udGhyaWZ0CisgICAgQ09NTUFORCAke1RIUklGVF9DT01QSUxFUn0gLS1nZW4gaHMgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvRGVidWdQcm90b1Rlc3QudGhyaWZ0CisgICAgQ09NTUFORCAke1RIUklGVF9DT01QSUxFUn0gLS1nZW4gaHMgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKKyAgICBDT01NQU5EICR7VEhSSUZUX0NPTVBJTEVSfSAtLWdlbiBocyAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9JbmNsdWRlLnRocmlmdAorICAgIERFUEVORFMgJHtoc190ZXN0X2dlbl9zb3VyY2VzfQorKQpkaWZmIC0tZ2l0IGEvdGVzdC9ocy9EZWJ1Z1Byb3RvVGVzdF9NYWluLmhzIGIvdGVzdC9ocy9EZWJ1Z1Byb3RvVGVzdF9NYWluLmhzCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL3Rlc3QvaHMvTWFrZWZpbGUuYW0gYi90ZXN0L2hzL01ha2VmaWxlLmFtCmluZGV4IGI5NzRlZDguLjE3NDg5MDYgMTAwNjQ0Ci0tLSBhL3Rlc3QvaHMvTWFrZWZpbGUuYW0KKysrIGIvdGVzdC9ocy9NYWtlZmlsZS5hbQpAQCAtMTcsOSArMTcsNyBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotVEhSSUZUID0gJCh0b3Bfc3JjZGlyKS9jb21waWxlci9jcHAvdGhyaWZ0Ci0KLXN0dWJzOiAuLi9Db25zdGFudHNEZW1vLnRocmlmdCAuLi9EZWJ1Z1Byb3RvVGVzdC50aHJpZnQgLi4vVGhyaWZ0VGVzdC50aHJpZnQgLi4vSW5jbHVkZS50aHJpZnQKK3N0dWJzOiAkKFRIUklGVCkgLi4vQ29uc3RhbnRzRGVtby50aHJpZnQgLi4vRGVidWdQcm90b1Rlc3QudGhyaWZ0IC4uL1RocmlmdFRlc3QudGhyaWZ0IC4uL0luY2x1ZGUudGhyaWZ0CiAJJChUSFJJRlQpIC0tZ2VuIGhzIC4uL0NvbnN0YW50c0RlbW8udGhyaWZ0CiAJJChUSFJJRlQpIC0tZ2VuIGhzIC4uL0RlYnVnUHJvdG9UZXN0LnRocmlmdAogCSQoVEhSSUZUKSAtLWdlbiBocyAuLi9UaHJpZnRUZXN0LnRocmlmdApAQCAtMzYsNiArMzQsOCBAQAogCSQoUk0pICouaGkKIAkkKFJNKSAqLm8KIAotYWxsOiBjaGVjaworYWxsLWxvY2FsOiBzdHVicwogCWdoYyAtaWdlbi1ocyBUZXN0U2VydmVyLmhzCiAJZ2hjIC1pZ2VuLWhzIFRlc3RDbGllbnQuaHMKKworcHJlY3Jvc3M6IGFsbC1sb2NhbApkaWZmIC0tZ2l0IGEvdGVzdC9ocy9UZXN0Q2xpZW50LmhzIGIvdGVzdC9ocy9UZXN0Q2xpZW50LmhzCmluZGV4IDAzMzE0ZWQuLjkzZmI1OTEgMTAwNjQ0Ci0tLSBhL3Rlc3QvaHMvVGVzdENsaWVudC5ocworKysgYi90ZXN0L2hzL1Rlc3RDbGllbnQuaHMKQEAgLTI2LDIyICsyNiwyNyBAQAogaW1wb3J0IERhdGEuTGlzdC5TcGxpdAogaW1wb3J0IERhdGEuU3RyaW5nCiBpbXBvcnQgTmV0d29yaworaW1wb3J0IE5ldHdvcmsuVVJJCiBpbXBvcnQgU3lzdGVtLkVudmlyb25tZW50CiBpbXBvcnQgU3lzdGVtLkV4aXQKLWltcG9ydCBTeXN0ZW0uUG9zaXguVW5pc3RkCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuQnl0ZVN0cmluZy5MYXp5IGFzIExCUwogaW1wb3J0IHF1YWxpZmllZCBEYXRhLkhhc2hNYXAuU3RyaWN0IGFzIE1hcAogaW1wb3J0IHF1YWxpZmllZCBEYXRhLkhhc2hTZXQgYXMgU2V0CiBpbXBvcnQgcXVhbGlmaWVkIERhdGEuVmVjdG9yIGFzIFZlY3RvcgoraW1wb3J0IHF1YWxpZmllZCBTeXN0ZW0uSU8gYXMgSU8KIAogaW1wb3J0IFRocmlmdFRlc3RfSWZhY2UKIGltcG9ydCBUaHJpZnRUZXN0X1R5cGVzCiBpbXBvcnQgcXVhbGlmaWVkIFRocmlmdFRlc3RfQ2xpZW50IGFzIENsaWVudAogCiBpbXBvcnQgVGhyaWZ0LlRyYW5zcG9ydAoraW1wb3J0IFRocmlmdC5UcmFuc3BvcnQuRnJhbWVkCiBpbXBvcnQgVGhyaWZ0LlRyYW5zcG9ydC5IYW5kbGUKK2ltcG9ydCBUaHJpZnQuVHJhbnNwb3J0Lkh0dHBDbGllbnQKIGltcG9ydCBUaHJpZnQuUHJvdG9jb2wKIGltcG9ydCBUaHJpZnQuUHJvdG9jb2wuQmluYXJ5CiBpbXBvcnQgVGhyaWZ0LlByb3RvY29sLkNvbXBhY3QKK2ltcG9ydCBUaHJpZnQuUHJvdG9jb2wuSGVhZGVyCiBpbXBvcnQgVGhyaWZ0LlByb3RvY29sLkpTT04KIAogZGF0YSBPcHRpb25zID0gT3B0aW9ucwpAQCAtNTAsMjAgKzU1LDQ1IEBACiAgICwgZG9tYWluU29ja2V0IDo6IFN0cmluZwogICAsIHRyYW5zcG9ydCAgICA6OiBTdHJpbmcKICAgLCBwcm90b2NvbCAgICAgOjogUHJvdG9jb2xUeXBlCisgIC0tIFRPRE86IEhhc2tlbGwgbGliIGRvZXMgbm90IGhhdmUgU1NMIHN1cHBvcnQKICAgLCBzc2wgICAgICAgICAgOjogQm9vbAogICAsIHRlc3RMb29wcyAgICA6OiBJbnQKICAgfQogICBkZXJpdmluZyAoU2hvdywgRXEpCiAKK2RhdGEgVHJhbnNwb3J0VHlwZSA9IEJ1ZmZlcmVkIElPLkhhbmRsZQorICAgICAgICAgICAgICAgICAgIHwgRnJhbWVkIChGcmFtZWRUcmFuc3BvcnQgSU8uSGFuZGxlKQorICAgICAgICAgICAgICAgICAgIHwgSHR0cCBIdHRwQ2xpZW50CisgICAgICAgICAgICAgICAgICAgfCBOb1RyYW5zcG9ydCBTdHJpbmcKKworZ2V0VHJhbnNwb3J0IDo6IFN0cmluZyAtPiBTdHJpbmcgLT4gSW50IC0+IChJTyBUcmFuc3BvcnRUeXBlKQorZ2V0VHJhbnNwb3J0ICJidWZmZXJlZCIgaG9zdCBwb3J0ID0gZG8KKyAgaCA8LSBoT3BlbiAoaG9zdCwgUG9ydE51bWJlciAkIGZyb21JbnRlZ3JhbCBwb3J0KQorICBJTy5oU2V0QnVmZmVyaW5nIGggJCBJTy5CbG9ja0J1ZmZlcmluZyBOb3RoaW5nCisgIHJldHVybiAkIEJ1ZmZlcmVkIGgKK2dldFRyYW5zcG9ydCAiZnJhbWVkIiBob3N0IHBvcnQgPSBkbworICBoIDwtIGhPcGVuIChob3N0LCBQb3J0TnVtYmVyICQgZnJvbUludGVncmFsIHBvcnQpCisgIHQgPC0gb3BlbkZyYW1lZFRyYW5zcG9ydCBoCisgIHJldHVybiAkIEZyYW1lZCB0CitnZXRUcmFuc3BvcnQgImh0dHAiIGhvc3QgcG9ydCA9IGxldCB1cmlTdHIgPSAiaHR0cDovLyIgKysgaG9zdCArKyAiOiIgKysgc2hvdyBwb3J0IGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgcGFyc2VVUkkgdXJpU3RyIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90aGluZyAtPiBkbyByZXR1cm4gKE5vVHJhbnNwb3J0ICQgIkZhaWxlZCB0byBwYXJzZSBVUkk6ICIgKysgdXJpU3RyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEp1c3QodXJpKSAtPiBkbworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA8LSBvcGVuSHR0cENsaWVudCB1cmkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkIEh0dHAgdAorZ2V0VHJhbnNwb3J0IHQgaG9zdCBwb3J0ID0gZG8gcmV0dXJuIChOb1RyYW5zcG9ydCAkICJVbnN1cHBvcnRlZCB0cmFuc3BvcnQ6ICIgKysgdCkKKwogZGF0YSBQcm90b2NvbFR5cGUgPSBCaW5hcnkKICAgICAgICAgICAgICAgICAgIHwgQ29tcGFjdAogICAgICAgICAgICAgICAgICAgfCBKU09OCisgICAgICAgICAgICAgICAgICB8IEhlYWRlcgogICAgICAgICAgICAgICAgICAgZGVyaXZpbmcgKFNob3csIEVxKQogCiBnZXRQcm90b2NvbCA6OiBTdHJpbmcgLT4gUHJvdG9jb2xUeXBlCiBnZXRQcm90b2NvbCAiYmluYXJ5IiAgPSBCaW5hcnkKIGdldFByb3RvY29sICJjb21wYWN0IiA9IENvbXBhY3QKIGdldFByb3RvY29sICJqc29uIiAgICA9IEpTT04KK2dldFByb3RvY29sICJoZWFkZXIiID0gSGVhZGVyCiBnZXRQcm90b2NvbCBwID0gZXJyb3IgJCAiVW5zdXBwb3J0ZWQgUHJvdG9jb2w6ICIgKysgcAogCiBkZWZhdWx0T3B0aW9ucyA6OiBPcHRpb25zCkBAIC03MSw0NiArMTAxLDY2IEBACiAgIHsgcG9ydCAgICAgICAgID0gOTA5MAogICAsIGRvbWFpblNvY2tldCA9ICIiCiAgICwgaG9zdCAgICAgICAgID0gImxvY2FsaG9zdCIKLSAgLCB0cmFuc3BvcnQgICAgPSAiZnJhbWVkIgorICAsIHRyYW5zcG9ydCAgICA9ICJidWZmZXJlZCIKICAgLCBwcm90b2NvbCAgICAgPSBCaW5hcnkKICAgLCBzc2wgICAgICAgICAgPSBGYWxzZQogICAsIHRlc3RMb29wcyAgICA9IDEKICAgfQogCi1ydW5DbGllbnQgOjogKFByb3RvY29sIHAsIFRyYW5zcG9ydCB0KSA9PiBwIHQgLT4gSU8gKCkKK3J1bkNsaWVudCA6OiBQcm90b2NvbCBwID0+IHAgLT4gSU8gKCkKIHJ1bkNsaWVudCBwID0gZG8KICAgbGV0IHByb3QgPSAocCxwKQogICBwdXRTdHJMbiAiU3RhcnRpbmcgVGVzdHMiCiAKICAgLS0gVk9JRCBUZXN0CisgIHB1dFN0ckxuICJ0ZXN0Vm9pZCIKICAgQ2xpZW50LnRlc3RWb2lkIHByb3QKIAogICAtLSBTdHJpbmcgVGVzdAorICBwdXRTdHJMbiAidGVzdFN0cmluZyIKICAgcyA8LSBDbGllbnQudGVzdFN0cmluZyBwcm90ICJUZXN0IgogICB3aGVuIChzIC89ICJUZXN0IikgZXhpdEZhaWx1cmUKIAorICAtLSBCb29sIFRlc3QKKyAgcHV0U3RyTG4gInRlc3RCb29sIgorICBib29sIDwtIENsaWVudC50ZXN0Qm9vbCBwcm90IFRydWUKKyAgd2hlbiAobm90IGJvb2wpIGV4aXRGYWlsdXJlCisgIHB1dFN0ckxuICJ0ZXN0Qm9vbCIKKyAgYm9vbCA8LSBDbGllbnQudGVzdEJvb2wgcHJvdCBGYWxzZQorICB3aGVuIChib29sKSBleGl0RmFpbHVyZQorCiAgIC0tIEJ5dGUgVGVzdAorICBwdXRTdHJMbiAidGVzdEJ5dGUiCiAgIGJ5dGUgPC0gQ2xpZW50LnRlc3RCeXRlIHByb3QgMQogICB3aGVuIChieXRlIC89IDEpIGV4aXRGYWlsdXJlCiAKICAgLS0gSTMyIFRlc3QKKyAgcHV0U3RyTG4gInRlc3RJMzIiCiAgIGkzMiA8LSBDbGllbnQudGVzdEkzMiBwcm90ICgtMSkKICAgd2hlbiAoaTMyIC89IC0xKSBleGl0RmFpbHVyZQogCiAgIC0tIEk2NCBUZXN0CisgIHB1dFN0ckxuICJ0ZXN0STY0IgogICBpNjQgPC0gQ2xpZW50LnRlc3RJNjQgcHJvdCAoLTM0MzU5NzM4MzY4KQogICB3aGVuIChpNjQgLz0gLTM0MzU5NzM4MzY4KSBleGl0RmFpbHVyZQogCiAgIC0tIERvdWJsZSBUZXN0CisgIHB1dFN0ckxuICJ0ZXN0RG91YmxlIgogICBkdWIgPC0gQ2xpZW50LnRlc3REb3VibGUgcHJvdCAoLTUuMjA5ODUyMykKICAgd2hlbiAoYWJzIChkdWIgKyA1LjIwOTg1MjMpID4gMC4wMDEpIGV4aXRGYWlsdXJlCiAKKyAgLS0gQmluYXJ5IFRlc3QKKyAgcHV0U3RyTG4gInRlc3RCaW5hcnkiCisgIGJpbiA8LSBDbGllbnQudGVzdEJpbmFyeSBwcm90IChMQlMucGFjayAuIHJldmVyc2UgJCBbLTEyOC4uMTI3XSkKKyAgd2hlbiAoKHJldmVyc2UgWy0xMjguLjEyN10pIC89IExCUy51bnBhY2sgYmluKSBleGl0RmFpbHVyZQorICAKICAgLS0gU3RydWN0IFRlc3QKICAgbGV0IHN0cnVjdEluID0gWHRydWN0eyB4dHJ1Y3Rfc3RyaW5nX3RoaW5nID0gIlplcm8iCiAgICAgICAgICAgICAgICAgICAgICAgICwgeHRydWN0X2J5dGVfdGhpbmcgICA9IDEKICAgICAgICAgICAgICAgICAgICAgICAgLCB4dHJ1Y3RfaTMyX3RoaW5nICAgID0gLTMKICAgICAgICAgICAgICAgICAgICAgICAgLCB4dHJ1Y3RfaTY0X3RoaW5nICAgID0gLTUKICAgICAgICAgICAgICAgICAgICAgICAgfQorICBwdXRTdHJMbiAidGVzdFN0cnVjdCIKICAgc3RydWN0T3V0IDwtIENsaWVudC50ZXN0U3RydWN0IHByb3Qgc3RydWN0SW4KICAgd2hlbiAoc3RydWN0SW4gLz0gc3RydWN0T3V0KSBleGl0RmFpbHVyZQogCkBAIC0xMTksNjggKzE2OSw4MyBAQAogICAgICAgICAgICAgICAgICAgICAgICwgeHRydWN0Ml9zdHJ1Y3RfdGhpbmcgPSBzdHJ1Y3RJbgogICAgICAgICAgICAgICAgICAgICAgICwgeHRydWN0Ml9pMzJfdGhpbmcgICAgPSA1CiAgICAgICAgICAgICAgICAgICAgICAgfQorICBwdXRTdHJMbiAidGVzdE5lc3QiCiAgIG5lc3RPdXQgPC0gQ2xpZW50LnRlc3ROZXN0IHByb3QgbmVzdEluCi0gIHdoZW4gKG5lc3RJbiAvPSBuZXN0T3V0KSBleGl0U3VjY2VzcworICB3aGVuIChuZXN0SW4gLz0gbmVzdE91dCkgZXhpdEZhaWx1cmUKIAogICAtLSBNYXAgVGVzdAogICBsZXQgbWFwSW4gPSBNYXAuZnJvbUxpc3QgJCBtYXAgKFxpIC0+IChpLCBpLTEwKSkgWzEuLjVdCisgIHB1dFN0ckxuICJ0ZXN0TWFwIgogICBtYXBPdXQgPC0gQ2xpZW50LnRlc3RNYXAgcHJvdCBtYXBJbgotICB3aGVuIChtYXBJbiAvPSBtYXBPdXQpIGV4aXRTdWNjZXNzCisgIHdoZW4gKG1hcEluIC89IG1hcE91dCkgZXhpdEZhaWx1cmUKIAogICAtLSBTZXQgVGVzdAogICBsZXQgc2V0SW4gPSBTZXQuZnJvbUxpc3QgWy0yLi4zXQorICBwdXRTdHJMbiAidGVzdFNldCIKICAgc2V0T3V0IDwtIENsaWVudC50ZXN0U2V0IHByb3Qgc2V0SW4KICAgd2hlbiAoc2V0SW4gLz0gc2V0T3V0KSBleGl0RmFpbHVyZQogCiAgIC0tIExpc3QgVGVzdAogICBsZXQgbGlzdEluID0gVmVjdG9yLmZyb21MaXN0IFstMi4uM10KKyAgcHV0U3RyTG4gInRlc3RMaXN0IgogICBsaXN0T3V0IDwtIENsaWVudC50ZXN0TGlzdCBwcm90IGxpc3RJbgogICB3aGVuIChsaXN0SW4gLz0gbGlzdE91dCkgZXhpdEZhaWx1cmUKIAogICAtLSBFbnVtIFRlc3QKKyAgcHV0U3RyTG4gInRlc3RFbnVtIgogICBudW16MSA8LSBDbGllbnQudGVzdEVudW0gcHJvdCBPTkUKICAgd2hlbiAobnVtejEgLz0gT05FKSBleGl0RmFpbHVyZQogCisgIHB1dFN0ckxuICJ0ZXN0RW51bSIKICAgbnVtejIgPC0gQ2xpZW50LnRlc3RFbnVtIHByb3QgVFdPCiAgIHdoZW4gKG51bXoyIC89IFRXTykgZXhpdEZhaWx1cmUKIAorICBwdXRTdHJMbiAidGVzdEVudW0iCiAgIG51bXo1IDwtIENsaWVudC50ZXN0RW51bSBwcm90IEZJVkUKICAgd2hlbiAobnVtejUgLz0gRklWRSkgZXhpdEZhaWx1cmUKIAogICAtLSBUeXBlZGVmIFRlc3QKKyAgcHV0U3RyTG4gInRlc3RUeXBlZGVmIgogICB1aWQgPC0gQ2xpZW50LnRlc3RUeXBlZGVmIHByb3QgMzA5ODU4MjM1MDgyNTIzCiAgIHdoZW4gKHVpZCAvPSAzMDk4NTgyMzUwODI1MjMpIGV4aXRGYWlsdXJlCiAKICAgLS0gTmVzdGVkIE1hcCBUZXN0CisgIHB1dFN0ckxuICJ0ZXN0TWFwTWFwIgogICBfIDwtIENsaWVudC50ZXN0TWFwTWFwIHByb3QgMQogCiAgIC0tIEV4Y2VwdGlvbiBUZXN0CisgIHB1dFN0ckxuICJ0ZXN0RXhjZXB0aW9uIgogICBleG4xIDwtIHRyeSAkIENsaWVudC50ZXN0RXhjZXB0aW9uIHByb3QgIlhjZXB0aW9uIgogICBjYXNlIGV4bjEgb2YKICAgICBMZWZ0IChYY2VwdGlvbiBfIF8pIC0+IHJldHVybiAoKQogICAgIF8gLT4gcHV0U3RyTG4gKHNob3cgZXhuMSkgPj4gZXhpdEZhaWx1cmUKIAorICBwdXRTdHJMbiAidGVzdEV4Y2VwdGlvbiIKICAgZXhuMiA8LSB0cnkgJCBDbGllbnQudGVzdEV4Y2VwdGlvbiBwcm90ICJURXhjZXB0aW9uIgogICBjYXNlIGV4bjIgb2YKICAgICBMZWZ0IChfIDo6IFNvbWVFeGNlcHRpb24pIC0+IHJldHVybiAoKQogICAgIFJpZ2h0IF8gLT4gZXhpdEZhaWx1cmUKIAorICBwdXRTdHJMbiAidGVzdEV4Y2VwdGlvbiIKICAgZXhuMyA8LSB0cnkgJCBDbGllbnQudGVzdEV4Y2VwdGlvbiBwcm90ICJzdWNjZXNzIgogICBjYXNlIGV4bjMgb2YKICAgICBMZWZ0IChfIDo6IFNvbWVFeGNlcHRpb24pIC0+IGV4aXRGYWlsdXJlCiAgICAgUmlnaHQgXyAtPiByZXR1cm4gKCkKIAogICAtLSBNdWx0aSBFeGNlcHRpb24gVGVzdAorICBwdXRTdHJMbiAidGVzdE11bHRpRXhjZXB0aW9uIgogICBtdWx0aTEgPC0gdHJ5ICQgQ2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbiBwcm90ICJYY2VwdGlvbiIgInRlc3QgMSIKICAgY2FzZSBtdWx0aTEgb2YKICAgICBMZWZ0IChYY2VwdGlvbiBfIF8pIC0+IHJldHVybiAoKQogICAgIF8gLT4gZXhpdEZhaWx1cmUKIAorICBwdXRTdHJMbiAidGVzdE11bHRpRXhjZXB0aW9uIgogICBtdWx0aTIgPC0gdHJ5ICQgQ2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbiBwcm90ICJYY2VwdGlvbjIiICJ0ZXN0IDIiCiAgIGNhc2UgbXVsdGkyIG9mCiAgICAgTGVmdCAoWGNlcHRpb24yIF8gXykgLT4gcmV0dXJuICgpCiAgICAgXyAtPiBleGl0RmFpbHVyZQogCisgIHB1dFN0ckxuICJ0ZXN0TXVsdGlFeGNlcHRpb24iCiAgIG11bHRpMyA8LSB0cnkgJCBDbGllbnQudGVzdE11bHRpRXhjZXB0aW9uIHByb3QgInN1Y2Nlc3MiICJ0ZXN0IDMiCiAgIGNhc2UgbXVsdGkzIG9mCiAgICAgTGVmdCAoXyA6OiBTb21lRXhjZXB0aW9uKSAtPiBleGl0RmFpbHVyZQpAQCAtMTkzLDEyICsyNTgsMjEgQEAKICAgY2FzZSBvcHRpb25zIG9mCiAgICAgTm90aGluZyAtPiBzaG93SGVscAogICAgIEp1c3QgT3B0aW9uc3suLn0gLT4gZG8KLSAgICAgIGhhbmRsZSA8LSBoT3BlbiAoaG9zdCwgUG9ydE51bWJlciAkIGZyb21JbnRlZ3JhbCBwb3J0KQotICAgICAgbGV0IGNsaWVudCA9IGNhc2UgcHJvdG9jb2wgb2YKLSAgICAgICAgICAgIEJpbmFyeSAgLT4gcnVuQ2xpZW50ICQgQmluYXJ5UHJvdG9jb2wgaGFuZGxlCi0gICAgICAgICAgICBDb21wYWN0IC0+IHJ1bkNsaWVudCAkIENvbXBhY3RQcm90b2NvbCBoYW5kbGUKLSAgICAgICAgICAgIEpTT04gICAgLT4gcnVuQ2xpZW50ICQgSlNPTlByb3RvY29sIGhhbmRsZQotICAgICAgcmVwbGljYXRlTV8gdGVzdExvb3BzIGNsaWVudAorICAgICAgdHJhbnMgPC0gTWFpbi5nZXRUcmFuc3BvcnQgdHJhbnNwb3J0IGhvc3QgcG9ydAorICAgICAgY2FzZSB0cmFucyBvZgorICAgICAgICBCdWZmZXJlZCB0IC0+IHJ1blRlc3QgdGVzdExvb3BzIHByb3RvY29sIHQKKyAgICAgICAgRnJhbWVkIHQgICAtPiBydW5UZXN0IHRlc3RMb29wcyBwcm90b2NvbCB0CisgICAgICAgIEh0dHAgdCAgICAgLT4gcnVuVGVzdCB0ZXN0TG9vcHMgcHJvdG9jb2wgdAorICAgICAgICBOb1RyYW5zcG9ydCBlcnIgLT4gcHV0U3RyTG4gZXJyCisgIHdoZXJlCisgICAgbWFrZUNsaWVudCBwIHQgPSBjYXNlIHAgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgQmluYXJ5ICAtPiBydW5DbGllbnQgJCBCaW5hcnlQcm90b2NvbCB0CisgICAgICAgICAgICAgICAgICAgICAgIENvbXBhY3QgLT4gcnVuQ2xpZW50ICQgQ29tcGFjdFByb3RvY29sIHQKKyAgICAgICAgICAgICAgICAgICAgICAgSlNPTiAgICAtPiBydW5DbGllbnQgJCBKU09OUHJvdG9jb2wgdAorICAgICAgICAgICAgICAgICAgICAgICBIZWFkZXIgIC0+IGNyZWF0ZUhlYWRlclByb3RvY29sIHQgdCA+Pj0gcnVuQ2xpZW50CisgICAgcnVuVGVzdCBsb29wcyBwIHQgPSBkbworICAgICAgbGV0IGNsaWVudCA9IG1ha2VDbGllbnQgcCB0CisgICAgICByZXBsaWNhdGVNXyBsb29wcyBjbGllbnQKICAgICAgIHB1dFN0ckxuICJDT01QTEVURUQgU1VDQ0VTU0ZVTExZIgogCiBwYXJzZUZsYWdzIDo6IFtTdHJpbmddIC0+IE9wdGlvbnMgLT4gTWF5YmUgT3B0aW9ucwpAQCAtMjI2LDcgKzMwMCw3IEBACiAgIFwgIC0tcG9ydCBhcmcgKD05MDkwKSAgICAgICAgICBQb3J0IG51bWJlciB0byBjb25uZWN0XG5cCiAgIFwgIC0tZG9tYWluLXNvY2tldCBhcmcgICAgICAgICBEb21haW4gU29ja2V0IChlLmcuIC90bXAvVGhyaWZ0VGVzdC50aHJpZnQpLFxuXAogICBcICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGVhZCBvZiBob3N0IGFuZCBwb3J0XG5cCi0gIFwgIC0tdHJhbnNwb3J0IGFyZyAoPWJ1ZmZlcmVkKSBUcmFuc3BvcnQ6IGJ1ZmZlcmVkLCBmcmFtZWQsIGh0dHAsIGV2aHR0cFxuXAorICBcICAtLXRyYW5zcG9ydCBhcmcgKD1idWZmZXJlZCkgVHJhbnNwb3J0OiBidWZmZXJlZCwgZnJhbWVkLCBodHRwXG5cCiAgIFwgIC0tcHJvdG9jb2wgYXJnICg9YmluYXJ5KSAgICBQcm90b2NvbDogYmluYXJ5LCBjb21wYWN0LCBqc29uXG5cCiAgIFwgIC0tc3NsICAgICAgICAgICAgICAgICAgICAgICBFbmNyeXB0ZWQgVHJhbnNwb3J0IHVzaW5nIFNTTFxuXAotICBcICAtbiBbIC0tdGVzdGxvb3BzIF0gYXJnICg9MSkgTnVtYmVyIG9mIFRlc3RzIgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKyAgXCAgLW4gWyAtLXRlc3Rsb29wcyBdIGFyZyAoPTEpIE51bWJlciBvZiBUZXN0cyIKZGlmZiAtLWdpdCBhL3Rlc3QvaHMvVGVzdFNlcnZlci5ocyBiL3Rlc3QvaHMvVGVzdFNlcnZlci5ocwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IGVjMzg5MWMuLmI3NzMxYWIKLS0tIGEvdGVzdC9ocy9UZXN0U2VydmVyLmhzCisrKyBiL3Rlc3QvaHMvVGVzdFNlcnZlci5ocwpAQCAtMzEsNyArMzEsOCBAQAogaW1wb3J0IFN5c3RlbS5FbnZpcm9ubWVudAogaW1wb3J0IFN5c3RlbS5FeGl0CiBpbXBvcnQgU3lzdGVtLklPCi1pbXBvcnQgU3lzdGVtLlBvc2l4LlVuaXN0ZAoraW1wb3J0IENvbnRyb2wuQ29uY3VycmVudCAodGhyZWFkRGVsYXkpCitpbXBvcnQgcXVhbGlmaWVkIFN5c3RlbS5JTyBhcyBJTwogaW1wb3J0IHF1YWxpZmllZCBEYXRhLkhhc2hNYXAuU3RyaWN0IGFzIE1hcAogaW1wb3J0IHF1YWxpZmllZCBEYXRhLkhhc2hTZXQgYXMgU2V0CiBpbXBvcnQgcXVhbGlmaWVkIERhdGEuVGV4dC5MYXp5IGFzIFRleHQKQEAgLTQ3LDYgKzQ4LDcgQEAKIGltcG9ydCBUaHJpZnQuVHJhbnNwb3J0LkhhbmRsZQogaW1wb3J0IFRocmlmdC5Qcm90b2NvbC5CaW5hcnkKIGltcG9ydCBUaHJpZnQuUHJvdG9jb2wuQ29tcGFjdAoraW1wb3J0IFRocmlmdC5Qcm90b2NvbC5IZWFkZXIKIGltcG9ydCBUaHJpZnQuUHJvdG9jb2wuSlNPTgogCiBkYXRhIE9wdGlvbnMgPSBPcHRpb25zCkBAIC03MiwxNCArNzQsMzAgQEAKICAgZnJvbVN0cmluZyAibm9uYmxvY2tpbmciID0gTm9uQmxvY2tpbmcKICAgZnJvbVN0cmluZyBfID0gZXJyb3IgIm5vdCBhIHZhbGlkIHNlcnZlciB0eXBlIgogCitkYXRhIFRyYW5zcG9ydFR5cGUgPSBCdWZmZXJlZCAoU29ja2V0IC0+IChJTyBJTy5IYW5kbGUpKQorICAgICAgICAgICAgICAgICAgIHwgRnJhbWVkIChTb2NrZXQgLT4gKElPIChGcmFtZWRUcmFuc3BvcnQgSU8uSGFuZGxlKSkpCisgICAgICAgICAgICAgICAgICAgfCBOb1RyYW5zcG9ydCBTdHJpbmcKKworZ2V0VHJhbnNwb3J0IDo6IFN0cmluZyAtPiBUcmFuc3BvcnRUeXBlCitnZXRUcmFuc3BvcnQgImJ1ZmZlcmVkIiA9IEJ1ZmZlcmVkICQgXHMgLT4gZG8KKyAgKGgsIF8sIF8pIDwtIChhY2NlcHQgcykKKyAgSU8uaFNldEJ1ZmZlcmluZyBoICQgSU8uQmxvY2tCdWZmZXJpbmcgTm90aGluZworICByZXR1cm4gaAorZ2V0VHJhbnNwb3J0ICJmcmFtZWQiID0gRnJhbWVkICQgXHMgLT4gZG8KKyAgKGgsIF8sIF8pIDwtIChhY2NlcHQgcykKKyAgb3BlbkZyYW1lZFRyYW5zcG9ydCBoCitnZXRUcmFuc3BvcnQgdCA9IE5vVHJhbnNwb3J0ICQgIlVuc3VwcG9ydGVkIHRyYW5zcG9ydDogIiArKyB0CisKIGRhdGEgUHJvdG9jb2xUeXBlID0gQmluYXJ5CiAgICAgICAgICAgICAgICAgICB8IENvbXBhY3QKICAgICAgICAgICAgICAgICAgIHwgSlNPTgorICAgICAgICAgICAgICAgICAgfCBIZWFkZXIKIAogZ2V0UHJvdG9jb2wgOjogU3RyaW5nIC0+IFByb3RvY29sVHlwZQogZ2V0UHJvdG9jb2wgImJpbmFyeSIgID0gQmluYXJ5CiBnZXRQcm90b2NvbCAiY29tcGFjdCIgPSBDb21wYWN0CiBnZXRQcm90b2NvbCAianNvbiIgICAgPSBKU09OCitnZXRQcm90b2NvbCAiaGVhZGVyIiAgPSBIZWFkZXIKIGdldFByb3RvY29sIHAgPSBlcnJvciAkIlVuc3VwcG9ydGVkIFByb3RvY29sOiAiICsrIHAKIAogZGVmYXVsdE9wdGlvbnMgOjogT3B0aW9ucwpAQCAtODcsOCArMTA1LDkgQEAKICAgeyBwb3J0ICAgICAgICAgPSA5MDkwCiAgICwgZG9tYWluU29ja2V0ID0gIiIKICAgLCBzZXJ2ZXJUeXBlICAgPSBUaHJlYWRlZAotICAsIHRyYW5zcG9ydCAgICA9ICJmcmFtZWQiCisgICwgdHJhbnNwb3J0ICAgID0gImJ1ZmZlcmVkIgogICAsIHByb3RvY29sICAgICA9IEJpbmFyeQorICAtLSBUT0RPOiBIYXNrZWxsIGxpYiBkb2VzIG5vdCBoYXZlIFNTTCBzdXBwb3J0CiAgICwgc3NsICAgICAgICAgID0gRmFsc2UKICAgLCB3b3JrZXJzICAgICAgPSA0CiAgIH0KQEAgLTExMSw2ICsxMzAsMTAgQEAKICAgICBTeXN0ZW0uSU8ucHV0U3RyTG4gJCAidGVzdFN0cmluZygiICsrIHNob3cgcyArKyAiKSIKICAgICByZXR1cm4gcwogCisgIHRlc3RCb29sIF8geCA9IGRvCisgICAgU3lzdGVtLklPLnB1dFN0ckxuICQgInRlc3RCb29sKCIgKysgc2hvdyB4ICsrICIpIgorICAgIHJldHVybiB4CisKICAgdGVzdEJ5dGUgXyB4ID0gZG8KICAgICBTeXN0ZW0uSU8ucHV0U3RyTG4gJCAidGVzdEJ5dGUoIiArKyBzaG93IHggKysgIikiCiAgICAgcmV0dXJuIHgKQEAgLTEyNyw2ICsxNTAsMTAgQEAKICAgICBTeXN0ZW0uSU8ucHV0U3RyTG4gJCAidGVzdERvdWJsZSgiICsrIHNob3cgeCArKyAiKSIKICAgICByZXR1cm4geAogCisgIHRlc3RCaW5hcnkgXyB4ID0gZG8KKyAgICBTeXN0ZW0uSU8ucHV0U3RyTG4gJCAidGVzdEJpbmFyeSgiICsrIHNob3cgeCArKyAiKSIKKyAgICByZXR1cm4geAorCiAgIHRlc3RTdHJ1Y3QgXyBzdHJ1Y3RAWHRydWN0ey4ufSA9IGRvCiAgICAgU3lzdGVtLklPLnB1dFN0ckxuICQgInRlc3RTdHJ1Y3QoeyIgKysgc2hvdyB4dHJ1Y3Rfc3RyaW5nX3RoaW5nCiAgICAgICAgICAgICAgICAgICAgICAgKysgIiwgIiArKyBzaG93IHh0cnVjdF9ieXRlX3RoaW5nCkBAIC0yMTEsMTMgKzIzOCwxMyBAQAogICAgIFN5c3RlbS5JTy5wdXRTdHJMbiAkICJ0ZXN0TXVsdGlFeGNlcHRpb24oIiArKyBzaG93IHMxICsrICIsICIgKysgc2hvdyBzMiArKyAgIikiCiAgICAgY2FzZSBzMSBvZgogICAgICAgIlhjZXB0aW9uIiAgIC0+IHRocm93ICQgWGNlcHRpb24gMTAwMSAiVGhpcyBpcyBhbiBYY2VwdGlvbiIKLSAgICAgICJYY2VwdGlvbjIiICAtPiB0aHJvdyAkIFhjZXB0aW9uMiAyMDAyIGRlZmF1bHRfWHRydWN0CisgICAgICAiWGNlcHRpb24yIiAgLT4gdGhyb3cgJCBYY2VwdGlvbjIgMjAwMiAkIFh0cnVjdCAiVGhpcyBpcyBhbiBYY2VwdGlvbjIiIDAgMCAwCiAgICAgICAiVEV4Y2VwdGlvbiIgLT4gdGhyb3cgVGhyaWZ0RXhjZXB0aW9uCiAgICAgICBfIC0+IHJldHVybiBkZWZhdWx0X1h0cnVjdHsgeHRydWN0X3N0cmluZ190aGluZyA9IHMyIH0KIAogICB0ZXN0T25ld2F5IF8gaSA9IGRvCiAgICAgU3lzdGVtLklPLnB1dFN0ckxuICQgInRlc3RPbmV3YXkoIiArKyBzaG93IGkgKysgIik6IFNsZWVwaW5nLi4uIgotICAgIHNsZWVwIChmcm9tSW50ZWdyYWwgaSkKKyAgICB0aHJlYWREZWxheSAkIChmcm9tSW50ZWdyYWwgaSkgKiAxMDAwMDAwCiAgICAgU3lzdGVtLklPLnB1dFN0ckxuICQgInRlc3RPbmV3YXkoIiArKyBzaG93IGkgKysgIik6IGRvbmUgc2xlZXBpbmchIgogCiBtYWluIDo6IElPICgpCkBAIC0yMjYsMTcgKzI1MywzMCBAQAogICBjYXNlIG9wdGlvbnMgb2YKICAgICBOb3RoaW5nIC0+IHNob3dIZWxwCiAgICAgSnVzdCBPcHRpb25zey4ufSAtPiBkbworICAgICAgY2FzZSBNYWluLmdldFRyYW5zcG9ydCB0cmFuc3BvcnQgb2YKKyAgICAgICAgQnVmZmVyZWQgZiAtPiBydW5TZXJ2ZXIgcHJvdG9jb2wgZiBwb3J0CisgICAgICAgIEZyYW1lZCAgIGYgLT4gcnVuU2VydmVyIHByb3RvY29sIGYgcG9ydAorICAgICAgICBOb1RyYW5zcG9ydCBlcnIgLT4gcHV0U3RyTG4gZXJyCiAgICAgICBTeXN0ZW0uSU8ucHV0U3RyTG4gJCAiU3RhcnRpbmcgXCIiICsrIHNob3cgc2VydmVyVHlwZSArKyAiXCIgc2VydmVyICgiICsrCiAgICAgICAgIHNob3cgdHJhbnNwb3J0ICsrICIpIGxpc3RlbiBvbjogIiArKyBkb21haW5Tb2NrZXQgKysgc2hvdyBwb3J0Ci0gICAgICBjYXNlIHByb3RvY29sIG9mCi0gICAgICAgIEJpbmFyeSAgLT4gcnVuU2VydmVyIEJpbmFyeVByb3RvY29sIHBvcnQKLSAgICAgICAgQ29tcGFjdCAtPiBydW5TZXJ2ZXIgQ29tcGFjdFByb3RvY29sIHBvcnQKLSAgICAgICAgSlNPTiAgICAtPiBydW5TZXJ2ZXIgSlNPTlByb3RvY29sIHBvcnQKICAgICAgIHdoZXJlCi0gICAgICAgIHJ1blNlcnZlciBwID0gcnVuVGhyZWFkZWRTZXJ2ZXIgKGFjY2VwdGVyIHApIFRlc3RIYW5kbGVyIFRocmlmdFRlc3QucHJvY2VzcyAuIFBvcnROdW1iZXIgLiBmcm9tSW50ZWdyYWwKLSAgICAgICAgYWNjZXB0ZXIgcCBzID0gZG8KLSAgICAgICAgICAoaCwgXywgXykgPC0gYWNjZXB0IHMKLSAgICAgICAgICByZXR1cm4gKHAgaCwgcCBoKQorICAgICAgICBhY2NlcHRvciBwIGYgc29ja2V0ID0gZG8KKyAgICAgICAgICB0IDwtIGYgc29ja2V0CisgICAgICAgICAgcmV0dXJuIChwIHQsIHAgdCkKKworICAgICAgICBoZWFkZXJBY2NlcHRvciBmIHNvY2tldCA9IGRvCisgICAgICAgICAgdCA8LSBmIHNvY2tldAorICAgICAgICAgIHAgPC0gY3JlYXRlSGVhZGVyUHJvdG9jb2wxIHQKKyAgICAgICAgICByZXR1cm4gKHAsIHApCisKKyAgICAgICAgZG9SdW5TZXJ2ZXIgcCBmID0gZG8KKyAgICAgICAgICBydW5UaHJlYWRlZFNlcnZlciAoYWNjZXB0b3IgcCBmKSBUZXN0SGFuZGxlciBUaHJpZnRUZXN0LnByb2Nlc3MgLiBQb3J0TnVtYmVyIC4gZnJvbUludGVncmFsCisKKyAgICAgICAgcnVuU2VydmVyIHAgZiBwb3J0ID0gY2FzZSBwIG9mCisgICAgICAgICAgQmluYXJ5ICAtPiBkb1J1blNlcnZlciBCaW5hcnlQcm90b2NvbCBmIHBvcnQKKyAgICAgICAgICBDb21wYWN0IC0+IGRvUnVuU2VydmVyIENvbXBhY3RQcm90b2NvbCBmIHBvcnQKKyAgICAgICAgICBKU09OICAgIC0+IGRvUnVuU2VydmVyIEpTT05Qcm90b2NvbCBmIHBvcnQKKyAgICAgICAgICBIZWFkZXIgIC0+IHJ1blRocmVhZGVkU2VydmVyIChoZWFkZXJBY2NlcHRvciBmKSBUZXN0SGFuZGxlciBUaHJpZnRUZXN0LnByb2Nlc3MgKFBvcnROdW1iZXIgJCBmcm9tSW50ZWdyYWwgcG9ydCkKIAogcGFyc2VGbGFncyA6OiBbU3RyaW5nXSAtPiBPcHRpb25zIC0+IE1heWJlIE9wdGlvbnMKIHBhcnNlRmxhZ3MgKGZsYWcgOiBmbGFncykgb3B0cyA9IGRvCkBAIC0yNjQsOSArMzA0LDkgQEAKICAgXCAgLS1kb21haW4tc29ja2V0IGFyZyAgICAgICAgIFVuaXggRG9tYWluIFNvY2tldCAoZS5nLiAvdG1wL1RocmlmdFRlc3QudGhyaWZ0KVxuXAogICBcICAtLXNlcnZlci10eXBlIGFyZyAoPXNpbXBsZSkgdHlwZSBvZiBzZXJ2ZXIsIFwic2ltcGxlXCIsIFwidGhyZWFkLXBvb2xcIixcblwKICAgXCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidGhyZWFkZWRcIiwgb3IgXCJub25ibG9ja2luZ1wiXG5cCi0gIFwgIC0tdHJhbnNwb3J0IGFyZyAoPWJ1ZmZlcmVkKSB0cmFuc3BvcnQ6IGJ1ZmZlcmVkLCBmcmFtZWQsIGh0dHBcblwKKyAgXCAgLS10cmFuc3BvcnQgYXJnICg9YnVmZmVyZWQpIHRyYW5zcG9ydDogYnVmZmVyZWQsIGZyYW1lZFxuXAogICBcICAtLXByb3RvY29sIGFyZyAoPWJpbmFyeSkgICAgcHJvdG9jb2w6IGJpbmFyeSwgY29tcGFjdCwganNvblxuXAogICBcICAtLXNzbCAgICAgICAgICAgICAgICAgICAgICAgRW5jcnlwdGVkIFRyYW5zcG9ydCB1c2luZyBTU0xcblwKICAgXCAgLS1wcm9jZXNzb3ItZXZlbnRzICAgICAgICAgIHByb2Nlc3Nvci1ldmVudHNcblwKICAgXCAgLW4gWyAtLXdvcmtlcnMgXSBhcmcgKD00KSAgIE51bWJlciBvZiB0aHJlYWQgcG9vbHMgd29ya2Vycy4gT25seSB2YWxpZCBmb3JcblwKLSAgXCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZC1wb29sIHNlcnZlciB0eXBlIgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKyAgXCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZC1wb29sIHNlcnZlciB0eXBlIgpkaWZmIC0tZ2l0IGEvdGVzdC9ocy9UaHJpZnRUZXN0X01haW4uaHMgYi90ZXN0L2hzL1RocmlmdFRlc3RfTWFpbi5ocwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IDExMzk1MDYuLjY3MDAyM2UKLS0tIGEvdGVzdC9ocy9UaHJpZnRUZXN0X01haW4uaHMKKysrIGIvdGVzdC9ocy9UaHJpZnRUZXN0X01haW4uaHMKQEAgLTY3LDYgKzY3LDEwIEBACiAgICAgICAgIFRocmlmdFRlc3RVdGlscy5zZXJ2ZXJMb2cgJCBzaG93IHgKICAgICAgICAgcmV0dXJuIHgKIAorICAgIHRlc3RCaW5hcnkgXyB4ID0gZG8KKyAgICAgICAgVGhyaWZ0VGVzdFV0aWxzLnNlcnZlckxvZyAkIHNob3cgeAorICAgICAgICByZXR1cm4geAorCiAgICAgdGVzdFN0cnVjdCBfIHggPSBkbwogICAgICAgICBUaHJpZnRUZXN0VXRpbHMuc2VydmVyTG9nICQgc2hvdyB4CiAgICAgICAgIHJldHVybiB4CkBAIC0xNTAsNiArMTU0LDggQEAKICAgICB2OSA8LSBDbGllbnQudGVzdERvdWJsZSBwcyAoLTMuMTQpCiAgICAgVGhyaWZ0VGVzdFV0aWxzLmNsaWVudExvZyAkIHNob3cgdjkKIAorICAgIC0tIFRPRE86IENsaWVudC50ZXN0QmluYXJ5IC4uLgorCQogICAgIHYxMCA8LSBDbGllbnQudGVzdE1hcCBwcyAoTWFwLmZyb21MaXN0IFsoMSwxKSwoMiwyKSwoMywzKV0pCiAgICAgVGhyaWZ0VGVzdFV0aWxzLmNsaWVudExvZyAkIHNob3cgdjEwCiAKZGlmZiAtLWdpdCBhL3Rlc3QvaW5kZXguaHRtbCBiL3Rlc3QvaW5kZXguaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjExYTkyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9pbmRleC5odG1sCkBAIC0wLDAgKzEsNTEgQEAKKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy0tPgorPCFET0NUWVBFIEhUTUw+Cis8aHRtbD4KKzxoZWFkPgorPG1ldGEgY2hhcnNldD0idXRmLTgiPgorPHRpdGxlPkFwYWNoZSBUaHJpZnQgLSBpbnRlZ3JhdGlvbiB0ZXN0IHN1aXRlPC90aXRsZT4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Imh0dHA6Ly9jZG4uZGF0YXRhYmxlcy5uZXQvMS4xMC40L2Nzcy9qcXVlcnkuZGF0YVRhYmxlcy5jc3MiPgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04IiBzcmM9Imh0dHA6Ly9jb2RlLmpxdWVyeS5jb20vanF1ZXJ5LTIuMS4zLm1pbi5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiIHNyYz0iaHR0cDovL2Nkbi5kYXRhdGFibGVzLm5ldC8xLjEwLjQvanMvanF1ZXJ5LmRhdGFUYWJsZXMuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InJlc3VsdC5qcyI+Cis8L3NjcmlwdD4KKzwvaGVhZD4KKzxib2R5PgorPGgyPkFwYWNoZSBUaHJpZnQgLSBpbnRlZ3JhdGlvbiB0ZXN0IHN1aXRlOiBSZXN1bHRzPC9oMj4KKzx0YWJsZSBpZD0idGVzdF9yZXN1bHRzIiBjbGFzcz0iZGlzcGxheSI+CisgICAgPHRoZWFkPgorICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+U2VydmVyPC90aD4KKyAgICAgICAgICAgIDx0aD5DbGllbnQ8L3RoPgorICAgICAgICAgICAgPHRoPlByb3RvY29sPC90aD4KKyAgICAgICAgICAgIDx0aD5UcmFuc3BvcnQ8L3RoPgorICAgICAgICAgICAgPHRoPlJlc3VsdCAobG9nKTwvdGg+CisgICAgICAgICAgICA8dGg+RXhwZWN0ZWQ8L3RoPgorICAgICAgICA8L3RyPgorICAgIDwvdGhlYWQ+Cis8L3RhYmxlPgorPGgyPlRlc3QgSW5mb3JtYXRpb248L2gyPgorPHByZSBpZD0idGVzdF9pbmZvIj48L3ByZT4KKworPGEgaHJlZj0ibG9nIj5icm93c2UgcmF3IGxvZzwvYT4KKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvdGVzdC9rZXlzL1JFQURNRS5tZCBiL3Rlc3Qva2V5cy9SRUFETUUubWQKaW5kZXggNTNmZTBjYy4uMDEwODM1ZCAxMDA3NTUKLS0tIGEvdGVzdC9rZXlzL1JFQURNRS5tZAorKysgYi90ZXN0L2tleXMvUkVBRE1FLm1kCkBAIC0yNiw3ICsyNiw3IEBACiAgICAgb3BlbnNzbCB4NTA5IC1pbiBzZXJ2ZXIuY3J0IC10ZXh0ID4gQ0EucGVtCiAgICAgY2F0IHNlcnZlci5jcnQgc2VydmVyLmtleSA+IHNlcnZlci5wZW0KIAotRXhwb3J0IHBhc3N3b3JkIGlzICoqdGhyaWZ0KioKK0V4cG9ydCBwYXNzd29yZCBpcyAidGhyaWZ0IiB3aXRob3V0IHRoZSBxdW90ZXMKIAogICAgIG9wZW5zc2wgcGtjczEyIC1leHBvcnQgLWNsY2VydHMgLWluIHNlcnZlci5jcnQgLWlua2V5IHNlcnZlci5rZXkgLW91dCBzZXJ2ZXIucDEyCiAKQEAgLTQwLDkgKzQwLDkgQEAKIAogc2lnbiB0aGUgY2xpZW50IGNlcnRpZmljYXRlIHdpdGggdGhlIHNlcnZlci5rZXkKIAotICAgIG9wZW5zc2wgeDUwOSAtcmVxIC1kYXlzIDM2NSAtaW4gY2xpZW50LmNzciAtQ0EgQ0EucGVtIC1DQWtleSBzZXJ2ZXIua2V5IC1zZXRfc2VyaWFsIDAxIC1vdXQgY2xpZW50LmNydAorICAgIG9wZW5zc2wgeDUwOSAtcmVxIC1kYXlzIDMwMDAgLWluIGNsaWVudC5jc3IgLUNBIENBLnBlbSAtQ0FrZXkgc2VydmVyLmtleSAtc2V0X3NlcmlhbCAwMSAtb3V0IGNsaWVudC5jcnQKIAotZXhwb3J0IGNlcnRpZmljYXRlIGluIFBLQ1MxMiBmb3JtYXQgKEV4cG9ydCBwYXNzd29yZCBpcyAqKnRocmlmdCoqKQorZXhwb3J0IGNlcnRpZmljYXRlIGluIFBLQ1MxMiBmb3JtYXQgKEV4cG9ydCBwYXNzd29yZCBpcyAidGhyaWZ0IiB3aXRob3V0IHRoZSBxdW90ZXMpCiAKICAgICBvcGVuc3NsIHBrY3MxMiAtZXhwb3J0IC1jbGNlcnRzIC1pbiBjbGllbnQuY3J0IC1pbmtleSBjbGllbnQua2V5IC1vdXQgY2xpZW50LnAxMgogCkBAIC01MCw5ICs1MCwyOCBAQAogCiAgICAgb3BlbnNzbCBwa2NzMTIgLWluIGNsaWVudC5wMTIgLW91dCBjbGllbnQucGVtIC1jbGNlcnRzCiAKKyMjIyBjcmVhdGUgY2xpZW50IGtleSBhbmQgY2VydGlmaWNhdGUgd2l0aCBhbHRuYW1lcworCitjb3B5IG9wZW5zc2wuY25mIGZyb20geW91ciBzeXN0ZW0gZS5nLiAvZXRjL3NzbC9vcGVuc3NsLmNuZiBhbmQgYXBwZW5kIGZvbGxvd2luZyB0byB0aGUgZW5kIG9mIFsgdjNfcmVxIF0KKworICAgIHN1YmplY3RBbHROYW1lPUBhbHRlcm5hdGVfbmFtZXMKKworICAgIFsgYWx0ZXJuYXRlX25hbWVzIF0KKyAgICBJUC4xPTEyNy4wLjAuMQorICAgIElQLjI9OjoxCisgICAgSVAuMz06OmZmZmY6MTI3LjAuMC4xCisKK2NyZWF0ZSBhIHNpZ25pbmcgcmVxdWVzdDoKKworICAgIG9wZW5zc2wgcmVxIC1uZXcgLWtleSBjbGllbnRfdjMua2V5IC1vdXQgY2xpZW50X3YzLmNzciAtY29uZmlnIG9wZW5zc2wuY25mIFwKKyAgICAgICAgLXN1YmogIi9DPVVTL1NUPU1hcnlsYW5kL0w9Rm9yZXN0IEhpbGwvTz1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24vT1U9QXBhY2hlIFRocmlmdC9DTj1sb2NhbGhvc3QiIC1leHRlbnNpb25zIHYzX3JlcQorCitzaWduIHRoZSBjbGllbnQgY2VydGlmaWNhdGUgd2l0aCB0aGUgc2VydmVyLmtleQorCisgICAgb3BlbnNzbCB4NTA5IC1yZXEgLWRheXMgMzAwMCAtaW4gY2xpZW50X3YzLmNzciAtQ0EgQ0EucGVtIC1DQWtleSBzZXJ2ZXIua2V5IC1zZXRfc2VyaWFsIDAxIC1vdXQgY2xpZW50X3YzLmNydCAtZXh0ZW5zaW9ucyB2M19yZXEgLWV4dGZpbGUgb3BlbnNzbC5jbmYKIAogIyMgSmF2YSBrZXkgYW5kIGNlcnRpZmljYXRlIGltcG9ydAotSmF2YSBUZXN0IEVudmlyb25tZW50IHVzZXMga2V5IGFuZCB0cnVzdCBzdG9yZSBwYXNzd29yZCAqKnRocmlmdCoqCitKYXZhIFRlc3QgRW52aXJvbm1lbnQgdXNlcyBrZXkgYW5kIHRydXN0IHN0b3JlIHBhc3N3b3JkICJ0aHJpZnQiIHdpdGhvdXQgdGhlIHF1b3RlcwogCiBsaXN0IGtleXN0b3JlIGVudHJpZXMKIApAQCAtNjUsNyArODQsNyBAQAogCiBkZWxldGUgYW4gZW50cnkKIAotICAgIGtleXRvb2wgLWRlbGV0ZSAtc3RvcmVwYXNzIHRocmlmdCAta2V5c3RvcmUgLi4vLi4vbGliL2phdmEvdGVzdC8udHJ1c3RzdG9yZSAtYWxpYXMgc3NsdGVzdCAKKyAgICBrZXl0b29sIC1kZWxldGUgLXN0b3JlcGFzcyB0aHJpZnQgLWtleXN0b3JlIC4uLy4uL2xpYi9qYXZhL3Rlc3QvLnRydXN0c3RvcmUgLWFsaWFzIHNzbHRlc3QKIAogCiBpbXBvcnQgY2VydGlmaWNhdGUgaW50byB0cnVzdHN0b3JlCmRpZmYgLS1naXQgYS90ZXN0L2tleXMvY2xpZW50LmNydCBiL3Rlc3Qva2V5cy9jbGllbnQuY3J0CmluZGV4IDY0NTI2ZjYuLjgwYTlhZDAgMTAwNjQ0Ci0tLSBhL3Rlc3Qva2V5cy9jbGllbnQuY3J0CisrKyBiL3Rlc3Qva2V5cy9jbGllbnQuY3J0CkBAIC0xLDIwICsxLDIzIEBACiAtLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KLU1JSURWRENDQWp3Q0FRRXdEUVlKS29aSWh2Y05BUUVGQlFBd2diRXhDekFKQmdOVkJBWVRBbFZUTVJFd0R3WUQKK01JSUQyRENDQXNBQ0FRRXdEUVlKS29aSWh2Y05BUUVMQlFBd2diRXhDekFKQmdOVkJBWVRBbFZUTVJFd0R3WUQKIFZRUUlEQWhOWVhKNWJHRnVaREVVTUJJR0ExVUVCd3dMUm05eVpYTjBJRWhwYkd3eEp6QWxCZ05WQkFvTUhsUm8KIFpTQkJjR0ZqYUdVZ1UyOW1kSGRoY21VZ1JtOTFibVJoZEdsdmJqRVdNQlFHQTFVRUN3d05RWEJoWTJobElGUm8KIGNtbG1kREVTTUJBR0ExVUVBd3dKYkc5allXeG9iM04wTVNRd0lnWUpLb1pJaHZjTkFRa0JGaFZrWlhaQWRHaHkKLWFXWjBMbUZ3WVdOb1pTNXZjbWN3SGhjTk1UUXdOREEzTVRrd01ETXpXaGNOTVRVd05EQTNNVGt3TURNeldqQ0IKK2FXWjBMbUZ3WVdOb1pTNXZjbWN3SGhjTk1UVXhNakl6TURjd056VXdXaGNOTWpRd016RXdNRGN3TnpVd1dqQ0IKIHNURUxNQWtHQTFVRUJoTUNWVk14RVRBUEJnTlZCQWdNQ0UxaGNubHNZVzVrTVJRd0VnWURWUVFIREF0R2IzSmwKIGMzUWdTR2xzYkRFbk1DVUdBMVVFQ2d3ZVZHaGxJRUZ3WVdOb1pTQlRiMlowZDJGeVpTQkdiM1Z1WkdGMGFXOXUKIE1SWXdGQVlEVlFRTERBMUJjR0ZqYUdVZ1ZHaHlhV1owTVJJd0VBWURWUVFEREFsc2IyTmhiR2h2YzNReEpEQWkKLUJna3Foa2lHOXcwQkNRRVdGV1JsZGtCMGFISnBablF1WVhCaFkyaGxMbTl5WnpDQm56QU5CZ2txaGtpRzl3MEIKLUFRRUZBQU9CalFBd2dZa0NnWUVBcnJNMkhpVGY1TFQxUWgxSkFBTFdVbEp4VkpOYzF1QzgvL3daSVc4RWtrNnoKLUgyWGtyQU9XOENzN3JWZno2USt4MDBxN3hTSDgyNXY5Ukw2cHY0bDdzUERTR0s1bHZjK1drVHhEcGlSMkVqSW0KLXVXU3RVekNScTdFWGhWNTBwVW5vNk1GQUJWdHFwUlA4N1RpRTFsN1liOFMzM3YrZ0FWZHNycEpld1lJRHdXY0MKLUF3RUFBVEFOQmdrcWhraUc5dzBCQVFVRkFBT0NBUUVBYkdqSExhbURtMUZRcGdhdFlpWi9pYzdaOERGQitDSm8KLUZjWkg0aHd3MjdCRC9XcFFMc2o2VDE1NDBCMzVoc21aNzN5ZXY0eGdMeWJjL1NFSWR1Y1Q5Qkh5YzFEckRadGYKLUNGZVNxNk9PSnUvMXBKWjltL2QwaStzQkphV2c1dzF5VDgrYUVLSmFXWWZGK0M5alo2KzMrSTlhZ0lENU9wbEUKLVd3d3pnM3hYbGx6M2pmbXRObGMwZitoRTEvWExXRkUyblkrNWNCaGx4UmVXSDNIQWhVL3FaTDluL1dkeENqSGQKLU55ZVd4bERsbXpjMit1T2VWRjVzSUd6Rk9qL3FqR3hjK1V5VVhhYUV1U3ZoN2ozcnZZbFp0bmh2aEordE1rb1IKLUtieGwxVlVZeHgranpmaEJ5K2JLdTV1R1pCM0YxcXR5WTlmSTVEUXV0NzVuTmJ1ZVFQRytxdz09CitCZ2txaGtpRzl3MEJDUUVXRldSbGRrQjBhSEpwWm5RdVlYQmhZMmhsTG05eVp6Q0NBU0l3RFFZSktvWklodmNOCitBUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTGwvYkpoZzE3UHUxdDc4NUpJdXdsaDdlMkU1MWVvV0Z2dXhNV2ZICitkc1VBVnFEYU96OTlPNXN2OHBnV0tYcmtQQnR0RTk4VCtNeC9Qd3o1SkhzNFFjcmUzQTVhZG02Y2RhYjBBS3VnCitlVkcxUHZIcld6VjRhaGVnNEtVZlZTaU16OEJHMkszUTFWR3Zaa2dNUmEvUTQwOUZLalU2WjREOXZCRzRQYXMzCitQTjVGeG5BTDZQNzB5V0NFcjJWdS90V0psQ04rcXJSRGZTYUUyaHFtVDFpcnhhb1BhNjFHdnVSVnNHUTNUZW9FCittR2ZFTnR2RnFDNnFRV3VTQ2JHNWFJNDdSdjY2cHFvV1d4cWtyY29sTmM3K3ZoeDZyVyt3ZEZPM0lscUlUOElHCitzZFFWcCtZNGlyL2RHcDJlanpxR1pDcmVtUEoxdUVLakxNcEl1a2RnMjV5bUhDMENBd0VBQVRBTkJna3Foa2lHCis5dzBCQVFzRkFBT0NBUUVBQmNSZHdjOW1kWTl6T3ZUaXh0VGhIcmNpVnZxd3A2UmFpUXFNRVZvbW96WWlsWkRSCitKOTBNM0g2S25sQURKYkN2MEZYdWpzYUFwQjUzYXdxNUk3c09iQVlXRmhESlo5TEtsdzBsREY3S2NoTFhpQWxrCitYVnl2TDJuSmp1SmN4UENGUFdrdHdydzViVGd1UkNCekcxMkh6aWtuK3hzNnVQdXI3VlFZTTMzamJYRWRhNVBTCitVRXF2QVZXYU9OSkNYOE1EWU9zY1ZvSkYwRVN5SStmTjkyaXBGYVhSN2ZHYWpvZC9yYzBBZmVOMkdWTVpFVHZlCisyMXBrVXlEd3dDR0E0NHV2TlVDZDFlMzJOeEUzYWg5VUFwQ1JuNXNHSjY0UjZ1cnBGVFhUM0lBTEYza2FPTzdVCitWc01oRnJVaVo3K0J3NW5JZWlLMFFPRjZFaXBqK2JKdnJMWnBTZz09CiAtLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCmRpZmYgLS1naXQgYS90ZXN0L2tleXMvY2xpZW50LmtleSBiL3Rlc3Qva2V5cy9jbGllbnQua2V5CmluZGV4IDcwM2UwNDUuLjI1ZGNmZDcgMTAwNjQ0Ci0tLSBhL3Rlc3Qva2V5cy9jbGllbnQua2V5CisrKyBiL3Rlc3Qva2V5cy9jbGllbnQua2V5CkBAIC0xLDE1ICsxLDI3IEBACiAtLS0tLUJFR0lOIFJTQSBQUklWQVRFIEtFWS0tLS0tCi1NSUlDWEFJQkFBS0JnUUN1c3pZZUpOL2t0UFZDSFVrQUF0WlNVbkZVazF6VzRMei8vQmtoYndTU1RyTWZaZVNzCi1BNWJ3S3p1dFYvUHBEN0hUU3J2RklmemJtLzFFdnFtL2lYdXc4TklZcm1XOXo1YVJQRU9tSkhZU01pYTVaSzFUCi1NSkdyc1JlRlhuU2xTZWpvd1VBRlcycWxFL3p0T0lUV1h0aHZ4TGZlLzZBQlYyeXVrbDdCZ2dQQlp3SURBUUFCCi1Bb0dBWDFVV1hCNjlPdjN3dEhKc3FwL2h1cXlZZ1pHazRQRmswY0FOS3F4OWJ5V1pJN0lqdGlhRFVHNFhNOEhDCi1MVlZPTWNJZmN6VFgyak5tWXdRMGQzd2J6WXg1eEk0cDFLcGR4WjJaS2RpbHhkVVBTQ3VzS0tDTzRXUkUvNWpDCi04aVcyY3p4TWVqY0tnZDI5dG5FSlkvWmcyalhiZSt5cTdMU0VlK3BMdnpOR1poa0NRUURnS3dQb0QxVmwwYnl1Ci00Nm1xSUR3N3JqcURVdTE0dlkxUzdFWTlOU3J1d281U2RvbnF0WG5yYkZPdTV1bU5zQ0oyeVNvK2FGTHdlTlBFCi0zbVRpRExFckFrRUF4NEh0LzhQcWNPeUpnb0trcTB6a1I4dHFQSHQxaG9hejRYK1FmZnFoZE8vSlVNMmhXbzRRCi1WYk5XWGRFZEZpK0ZPZ1U2T2VSaXBvbXVQb29mUWRSNnRRSkFDb3E3VWt4MlRhV0JaQkFjeUgxZmw4Ym54WWsrCi0xYkRFVnFQNTRhTUFjOTMrWjI1ZnFnUUN5Y2w4WGZ0Si9Ibk9CUndNdW9hWmIrbWV1K0ZoaVNmanBRSkJBSU9SCi1NTFhScW9LcnlvY3h4b3hkR2RJcTJEVm9xWGw4elpWdy9ZWEd5Y0VHL0xqMzBtZVlkamMrSEQra1RzMDVxMTgyCi00VTRhU2VCUHZZUHFySEJLUWwwQ1FHQ0gya1k2RVN4c01Tb1hjZjhVaDJXS1YvaWdIU1RFWXR4N3JlNFJYaHNLCi0wZkRPdVBUeS9oVkEwREVUUGRkZkk1d0ZwT2tLU0pXYmhrY0srVEZkcnpzPQorTUlJRW93SUJBQUtDQVFFQXVYOXNtR0RYcys3VzN2emtraTdDV0h0N1lUblY2aFlXKzdFeFo4ZDJ4UUJXb05vNworUDMwN215L3ltQllwZXVROEcyMFQzeFA0ekg4L0RQa2tlemhCeXQ3Y0RscDJicHgxcHZRQXE2QjVVYlUrOGV0YgorTlhocUY2RGdwUjlWS0l6UHdFYllyZERWVWE5bVNBeEZyOURqVDBVcU5UcG5nUDI4RWJnOXF6Yzgza1hHY0F2bworL3ZUSllJU3ZaVzcrMVltVUkzNnF0RU45Sm9UYUdxWlBXS3ZGcWc5cnJVYSs1Rld3WkRkTjZnU1laOFEyMjhXbworTHFwQmE1SUpzYmxvamp0Ry9ycW1xaFpiR3FTdHlpVTF6djYrSEhxdGI3QjBVN2NpV29oUHdnYXgxQlduNWppSwordjkwYW5aNlBPb1prS3Q2WThuVzRRcU1zeWtpNlIyRGJuS1ljTFFJREFRQUJBb0lCQUZvdGJDbVh5c1VhY3pMcworVm1JS2dVaHFuMHhneFhHTFU1a0FSemhnYTRqUjVVdEZURkJOSFZFUU9pdGRlc1RYZDdFTmtmOTh3aE1JT1NxaAorWSs3VEpvanRWcVZUclFlUTRGRk5oWlhwNlpDalAvcHpwRitXTGwxV1JGK0JuL0NhbzlTaG5HekRmVEM4eUVoMgorVHRwdC9sTm5HR0hRQnNsYWtMYzhqaDVTT0RFRmZidWdYOFNkVEN3WllzZXNLTnJYbTFwUy81SUV1blBxYVJpMAorSUkwRWNucUhFc2dxU28rQ2xqcFc3dU54U3J5QTJ2U0FWZGxQZWo2KzlGWmpkSUhMUDVBRUtZdms3ZTlEMkNNVgorMStnck5lL1FrUXBwU2hpelBpcmJiOTN0SG04NnY1YmtERkNNOXlXcmhjTWNqdklMTVhFVHhJcHBNR1BtYWNSdQoranF0WWNBRUNnWUVBOFZEenlsVHo0a1MzK0QzbjNoVGdiNDFYVllhN2ZlVXNoOTlHV1JPMXdYSUZwSGpDSVJqQQorOXIvQlhXOStSeDNwdVZQaFM4aHdMUTRCTGRBN2xGcFYxQzhhZzBlMyt2bjZ6VmlybnoxanRJK3VITXZTdHpoTworZDZpMG5mK3c0SFlYbzdtTjZvOVpkSEVmQzhTRk5ieW1oQ29WS2gyRElMRHdiNEVYOVJYTnB5MENnWUVBeE1qNAorK3Zya2xKL2lsSCtSeTF6c3Q0elFZSXdtbTNRV2phckRyeXBHdWNIZ2Q0amc1djlBL0NKSUtVaTh4ME1qcmN1Tgord1ZiN1I4WEp5WXpGUVJYSVVYUjZHbkxlZVNuZnB4enQ0WWxpZkN2WHhuT2k4dzRmdjdLZUdCVjVucDFFZ3BvOAorbldOeVpGeGR2UUR1Q29wcjNTVW9TOUpJOEpQd1ZnQTdUKzdEYVFFQ2dZQUdvYXZoYm80NU5KdzlwUzNmQzRIVAorYnZYc2NzUnFSRWNDQU4vRkNPYWd4MHBpWjdNbUI3RWQxczB3alNUU1BYOHp5WnRTWXRLNldqMHNEaUhsQk1xQgorQno1YVJ6bEdHMktLREJyRFNJT1o3YXppTzdPeHQwbG92bWtnUW11UTc0M2N3UGVtYjRRTTBDTURSc1pHWU1YTworc2YxYzUreTNsRVUzT3p2MlQwQVVqUUtCZ0JsbnpPVXlNUUtUSmNDQU84VmlpTmtsbjkxbkdyRGxLdWc5VEtnMworc0F2WllPNXR5SU5xSHV5dVRGeXdIRmNwYnRqSU45UG5NK2ZQUEQ3K0lwVkZoNmdrZm9NZG8yVkhKNjIraVdPZAoreGc0NzVzNmpMVDF0N0dGbVlRekE4UU91VUNNQVlLVDlLczZVTWpIdGhjM3Nrd0pwQXF2UFNVVnVCQkJHVldINworZEZVQkFvR0JBTDY3QVJMdWppQUVWTkh0NXJhaml4QjZuY2w3L1IrWjJ1YXdJMUpmbWRuQ1pvbkFLVlpZSHVYVQorLzRqMitvNFFoSklQTHRXSW9heEFrTWlnUXRBa2VzcWlybjNLay9jN2taUklvTjU0OUhUSnV3WnFZcU5wN0NCLwora1ZpNVIzMzUrTTl6NDlpNnFBMFJac0pHU29TQms3UHVmRzRSbUxpbWNSYkd3clk5M3NQRAogLS0tLS1FTkQgUlNBIFBSSVZBVEUgS0VZLS0tLS0KZGlmZiAtLWdpdCBhL3Rlc3Qva2V5cy9jbGllbnQucDEyIGIvdGVzdC9rZXlzL2NsaWVudC5wMTIKaW5kZXggYTdkOTVkZi4uNWQyNjY5YyAxMDA2NDQKLS0tIGEvdGVzdC9rZXlzL2NsaWVudC5wMTIKKysrIGIvdGVzdC9rZXlzL2NsaWVudC5wMTIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9rZXlzL2NsaWVudC5wZW0gYi90ZXN0L2tleXMvY2xpZW50LnBlbQppbmRleCBlZTViYzYxLi42NmVmNjI2IDEwMDY0NAotLS0gYS90ZXN0L2tleXMvY2xpZW50LnBlbQorKysgYi90ZXN0L2tleXMvY2xpZW50LnBlbQpAQCAtMSw0NCArMSw2MCBAQAogQmFnIEF0dHJpYnV0ZXMKLSAgICBsb2NhbEtleUlEOiAwNSAzQyA2QSA5RCA2RCBFQyBBMCBGQSAyRiBBRSA0MSAzMiAwRCAyNCAzQSAyMSAzNCBGNiAwOCAxNSAKKyAgICBsb2NhbEtleUlEOiAzOSBFQyAzRCA1QiAyOCAxNyBEQSBERCAwOSA3QSA2MiA2OCBENSA0NCAxRiBDNyBFMiBGOCBFMCBDRCAKIHN1YmplY3Q9L0M9VVMvU1Q9TWFyeWxhbmQvTD1Gb3Jlc3QgSGlsbC9PPVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi9PVT1BcGFjaGUgVGhyaWZ0L0NOPWxvY2FsaG9zdC9lbWFpbEFkZHJlc3M9ZGV2QHRocmlmdC5hcGFjaGUub3JnCiBpc3N1ZXI9L0M9VVMvU1Q9TWFyeWxhbmQvTD1Gb3Jlc3QgSGlsbC9PPVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi9PVT1BcGFjaGUgVGhyaWZ0L0NOPWxvY2FsaG9zdC9lbWFpbEFkZHJlc3M9ZGV2QHRocmlmdC5hcGFjaGUub3JnCiAtLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KLU1JSURWRENDQWp3Q0FRRXdEUVlKS29aSWh2Y05BUUVGQlFBd2diRXhDekFKQmdOVkJBWVRBbFZUTVJFd0R3WUQKK01JSUQyRENDQXNBQ0FRRXdEUVlKS29aSWh2Y05BUUVMQlFBd2diRXhDekFKQmdOVkJBWVRBbFZUTVJFd0R3WUQKIFZRUUlEQWhOWVhKNWJHRnVaREVVTUJJR0ExVUVCd3dMUm05eVpYTjBJRWhwYkd3eEp6QWxCZ05WQkFvTUhsUm8KIFpTQkJjR0ZqYUdVZ1UyOW1kSGRoY21VZ1JtOTFibVJoZEdsdmJqRVdNQlFHQTFVRUN3d05RWEJoWTJobElGUm8KIGNtbG1kREVTTUJBR0ExVUVBd3dKYkc5allXeG9iM04wTVNRd0lnWUpLb1pJaHZjTkFRa0JGaFZrWlhaQWRHaHkKLWFXWjBMbUZ3WVdOb1pTNXZjbWN3SGhjTk1UUXdOREEzTVRrd01ETXpXaGNOTVRVd05EQTNNVGt3TURNeldqQ0IKK2FXWjBMbUZ3WVdOb1pTNXZjbWN3SGhjTk1UVXhNakl6TURjd056VXdXaGNOTWpRd016RXdNRGN3TnpVd1dqQ0IKIHNURUxNQWtHQTFVRUJoTUNWVk14RVRBUEJnTlZCQWdNQ0UxaGNubHNZVzVrTVJRd0VnWURWUVFIREF0R2IzSmwKIGMzUWdTR2xzYkRFbk1DVUdBMVVFQ2d3ZVZHaGxJRUZ3WVdOb1pTQlRiMlowZDJGeVpTQkdiM1Z1WkdGMGFXOXUKIE1SWXdGQVlEVlFRTERBMUJjR0ZqYUdVZ1ZHaHlhV1owTVJJd0VBWURWUVFEREFsc2IyTmhiR2h2YzNReEpEQWkKLUJna3Foa2lHOXcwQkNRRVdGV1JsZGtCMGFISnBablF1WVhCaFkyaGxMbTl5WnpDQm56QU5CZ2txaGtpRzl3MEIKLUFRRUZBQU9CalFBd2dZa0NnWUVBcnJNMkhpVGY1TFQxUWgxSkFBTFdVbEp4VkpOYzF1QzgvL3daSVc4RWtrNnoKLUgyWGtyQU9XOENzN3JWZno2USt4MDBxN3hTSDgyNXY5Ukw2cHY0bDdzUERTR0s1bHZjK1drVHhEcGlSMkVqSW0KLXVXU3RVekNScTdFWGhWNTBwVW5vNk1GQUJWdHFwUlA4N1RpRTFsN1liOFMzM3YrZ0FWZHNycEpld1lJRHdXY0MKLUF3RUFBVEFOQmdrcWhraUc5dzBCQVFVRkFBT0NBUUVBYkdqSExhbURtMUZRcGdhdFlpWi9pYzdaOERGQitDSm8KLUZjWkg0aHd3MjdCRC9XcFFMc2o2VDE1NDBCMzVoc21aNzN5ZXY0eGdMeWJjL1NFSWR1Y1Q5Qkh5YzFEckRadGYKLUNGZVNxNk9PSnUvMXBKWjltL2QwaStzQkphV2c1dzF5VDgrYUVLSmFXWWZGK0M5alo2KzMrSTlhZ0lENU9wbEUKLVd3d3pnM3hYbGx6M2pmbXRObGMwZitoRTEvWExXRkUyblkrNWNCaGx4UmVXSDNIQWhVL3FaTDluL1dkeENqSGQKLU55ZVd4bERsbXpjMit1T2VWRjVzSUd6Rk9qL3FqR3hjK1V5VVhhYUV1U3ZoN2ozcnZZbFp0bmh2aEordE1rb1IKLUtieGwxVlVZeHgranpmaEJ5K2JLdTV1R1pCM0YxcXR5WTlmSTVEUXV0NzVuTmJ1ZVFQRytxdz09CitCZ2txaGtpRzl3MEJDUUVXRldSbGRrQjBhSEpwWm5RdVlYQmhZMmhsTG05eVp6Q0NBU0l3RFFZSktvWklodmNOCitBUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTGwvYkpoZzE3UHUxdDc4NUpJdXdsaDdlMkU1MWVvV0Z2dXhNV2ZICitkc1VBVnFEYU96OTlPNXN2OHBnV0tYcmtQQnR0RTk4VCtNeC9Qd3o1SkhzNFFjcmUzQTVhZG02Y2RhYjBBS3VnCitlVkcxUHZIcld6VjRhaGVnNEtVZlZTaU16OEJHMkszUTFWR3Zaa2dNUmEvUTQwOUZLalU2WjREOXZCRzRQYXMzCitQTjVGeG5BTDZQNzB5V0NFcjJWdS90V0psQ04rcXJSRGZTYUUyaHFtVDFpcnhhb1BhNjFHdnVSVnNHUTNUZW9FCittR2ZFTnR2RnFDNnFRV3VTQ2JHNWFJNDdSdjY2cHFvV1d4cWtyY29sTmM3K3ZoeDZyVyt3ZEZPM0lscUlUOElHCitzZFFWcCtZNGlyL2RHcDJlanpxR1pDcmVtUEoxdUVLakxNcEl1a2RnMjV5bUhDMENBd0VBQVRBTkJna3Foa2lHCis5dzBCQVFzRkFBT0NBUUVBQmNSZHdjOW1kWTl6T3ZUaXh0VGhIcmNpVnZxd3A2UmFpUXFNRVZvbW96WWlsWkRSCitKOTBNM0g2S25sQURKYkN2MEZYdWpzYUFwQjUzYXdxNUk3c09iQVlXRmhESlo5TEtsdzBsREY3S2NoTFhpQWxrCitYVnl2TDJuSmp1SmN4UENGUFdrdHdydzViVGd1UkNCekcxMkh6aWtuK3hzNnVQdXI3VlFZTTMzamJYRWRhNVBTCitVRXF2QVZXYU9OSkNYOE1EWU9zY1ZvSkYwRVN5SStmTjkyaXBGYVhSN2ZHYWpvZC9yYzBBZmVOMkdWTVpFVHZlCisyMXBrVXlEd3dDR0E0NHV2TlVDZDFlMzJOeEUzYWg5VUFwQ1JuNXNHSjY0UjZ1cnBGVFhUM0lBTEYza2FPTzdVCitWc01oRnJVaVo3K0J3NW5JZWlLMFFPRjZFaXBqK2JKdnJMWnBTZz09CiAtLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCiBCYWcgQXR0cmlidXRlcwotICAgIGxvY2FsS2V5SUQ6IDA1IDNDIDZBIDlEIDZEIEVDIEEwIEZBIDJGIEFFIDQxIDMyIDBEIDI0IDNBIDIxIDM0IEY2IDA4IDE1IAorICAgIGxvY2FsS2V5SUQ6IDM5IEVDIDNEIDVCIDI4IDE3IERBIEREIDA5IDdBIDYyIDY4IEQ1IDQ0IDFGIEM3IEUyIEY4IEUwIENEIAogS2V5IEF0dHJpYnV0ZXM6IDxObyBBdHRyaWJ1dGVzPgogLS0tLS1CRUdJTiBFTkNSWVBURUQgUFJJVkFURSBLRVktLS0tLQotTUlJQ3hqQkFCZ2txaGtpRzl3MEJCUTB3TXpBYkJna3Foa2lHOXcwQkJRd3dEZ1FJV3llWUFHUkJXdndDQWdnQQotTUJRR0NDcUdTSWIzRFFNSEJBalhIbEJHK05tV0R3U0NBb0JSZ0liMk5pOHFHaHJ1WVc3QmlLTWxWS1BuRGRucgotc01nU1RnemVsd0FMVWF6ZDU5QjdwQTFtZENWYXpUWjJicVBaWUowdlJvbW51NHVvc24yNHNYU053ZFlnN3BKZAotQ1JudHRFMkJHbHhDNFBxRnJWTTFKN29PNVRmbm8xcnJYVnNSaTBKNFFyNkd0ajV4d1pSWmlHbkxHdG5ROUcvWAotVHNSdE5IL3BOUm5jbXUrMjB4bVRDMkY4RXM4cS8vNHNjbzVZZUVjbGNtY0JyN2dvTytUdXNJSDNnaGxmMGpiZAotTTlvVHZFRzdXWTNsU2FyaFpwNFFZbFdXa0dmR2ZrZDdyUDN5eGhMQ2hpamRWRU9MTDZnZnRET3MwQUxCbnRBUgotTlllU3hGb3lURUJDejhGK1dqVnQ3UVF6QXlSTlNLTkRJOHFNeE1tL0tES2FFOTJoUzc2SzhQY0JsYmR5MTE4cwotTGZITmIzdi92NFdGZGptUkpxUGRXeDV4M2NUd0dXd09GNE1xWmQ5K1huKy9pc3U4U2ZRZDJXbVNtMnFhd2JRUAotQnJqb1FTdVVRclp5TDVBUW1GS2tkUTg3NWZMZk53M0kyY2tocGdNaStXQ1d4MTEvOGsyZFlab1A5VlRaMS95VAotbDMyRk00dW50N3dhZlUwdlVVMnRQY3NFcTRTVGR3V1I1UTRGQlBGM0pSaU1pTnk4S3p2RmVVdG5TWDA4bS9zQgotQjNVaXcxakt3d29CeDFnZlBwcTMvVUJ2bUJsdkdtd0J4KzdWK2hNZlhCQWlJb0ZaRkFNcnVXVmdvNEdjTzhadgotc2U5Y3JPT2JpcGNSOHIvcTlWT0Y0T2x3Q3loa2wyeUR3RWpRbFJCUGtRMWNwTzRGV2tlN1ZBb1JSdGFDb3Y4Swotb1FZRXhSd2MxNDFqamhsWnZrWElhMFRzdFpwSEdaWm1CeUZxYnJwY0FoeVJ3REpZK3dxQzNVRmsrTUFMVDZHdwotVGNiUU8zeUlJQXpmZWFNWWt3NmlzaUFhOTRkT2pyWUhxT0tBYlhydzBidHQzdktFVFY1WHgwam9nbnVPY0NDOAotaTFSNVMwY0xzWm0yajRrV1Y4bVh1Q3ZYa3Z1cS9XZ1BDMTYyKy9HUnJoRXAxd0NzU284RHdHMkkKK01JSUZEakJBQmdrcWhraUc5dzBCQlEwd016QWJCZ2txaGtpRzl3MEJCUXd3RGdRSVJLb2w0MmJBUzNBQ0FnZ0EKK01CUUdDQ3FHU0liM0RRTUhCQWpPdWxjeUhNYVdzUVNDQk1nYmVYUThwSVlURU5LbTA4VVBlcXhrQ1Iybkx4U08KK2d0Um1CeERZanFZdjM1eTRLOEtoeWJCdlNCbElQZ0U1akVXeFVDY2MxUXZ5NXlkVVEvWDlwbWtVOGRubUFtREMKK28wendkM2x0MmVOUHkrNFdsaXFGRFZtSHJMZllRRk9vSXJIanV6QzBsSTRDMmlQT2p4aGZhMXpGdW1lZGd3R1MKK0d4MTBYNXVFVkg1TjY0Zlc2QjNCdnpRTTBybjJxcjBPTnVTUm10ZVJ0SThOc3puZmtnZUo5YTRDSUFGN0U1WjIKK0pUR0kxMmVkTnp6VUoxSmhYNDdaVzRtaVF3Q1U1TGN5MDFVWnFURnVVcG1LN0ZVUWVndEx5M2U1ZURLcStiSWcKK1pZcTZIeDdsdThoalQ1a1daR0t5NzFhWW1IS0VqSTBmNzI3Y0FicURURzV1WkJIQmp3Sy8zcC96blFWUVh4QmIKKzErRTlDaUtlRmRYajJFbHB0c25EeW9UdnJTd0ovSnF1MXdrWEJjSDVFbWJnN2FKTW9kMUlPczZPUUIxclBEdmQKK0ZGYTg0emJxUk5XSFN4eHhZWnhjQjhZWmluTDYvZFFKbmlzS3U5TE1RZDNCQkdzR1dxSDhaejV0RXZYalM1S3YKKzNnOUpSYTdRRGtTRjAwNXg2VStxLzY3OEcyTUcrVytOV3FqZTNOWng5UHNoL1B0bStoK3E5bjJHU3ZuaWJpSzUKK21FajlGSXdHcXVHcGJaVVRLNWFYSGNLTjY1N2RLaUlDc0VKZU5hcjFpWnpuUm16ck1iWkorRHhxSm5UdytHQXYKKzdZYjYzL0NOQXRxU3hpeU5IR1o2Tk0yWkE5dkFLWTFIWG4wUlZDMHkxKzlGbU5wU1J3djN1Lyt5ZFNDbkpvblIKK0dFS2p6T3FNOURuN3F4ZCtoNFVubkE3aFhXeElUYWdlQjZHNkttZmlYUnhoaVd5cXRPSUNkQ25lQ3dwcThVWjQKK2UwZm0wNU5SVzZNMm1xR1FIc01OU3ZUV2Rkd3o1Yjh3Z3c0ZVZzYit4UXl0eFZkajlscEJ1QjlLeWpRanhVZ1UKKzNvWng0S3lXTG9FV2prenRQQWlLM3V2NUdmb3ROSU1kem5SZk9OMSt4bTFNNXN3dG4zeTNSdTFmNlNUWkM3U3AKK3F2Ykc3alBtcEI1Z0xFVXJpK2NodythS1VZYkowYjgyME9kNEZMUVlud0xXcjQ2VmVsWW1WNDR4dVIwNndncVAKKzFIY2hNU3NIdFMrWmxJaVFRVTlqaGR5VHJsODZFUUhIMzNkaCtTdWE4QWhmZXdQUnkyVkZwM1prMzRBVXNXY1gKK0VmSVlHZW1ocVVEM2RyRzBTTVZiRkZOT2FGR3A5ZTB0UW91WU9DNi9xRkJ2L1NOZ1F6M21BRWtjaUpZYlV1VVoKK1Y0WVFQdnRkdlNySVNWMGU3YmpGZ2RTRWpHN1A3RjZDRnJXVHJqVWxIWnVXajYvckozKy8xUEhlSlZpeWhzckoKK1pZRmUxNFcvNDhQRHhCUmw0SUVBbXhjTjFFYjJFejllQ3F2MEhXNzdIdmlHNnpJZ25rUHJoV0hqRkdVcHhLazQKK2pMZnVCMlRmcTlGN296djRMMlFBbitGL3lLdDFSbTJIaDVKNjFlVUp0QVQ2MHBhamcrZ0p0am1wdTVQcjRIRG4KK2I2cDN4bVl3YUw1TGV0MXpDQWJiTWZkbERLMTRZamRPZE0vQkVLcFhiOXk0RUl1Ylg1QU1ZNGxqWGVHOWd4K1QKK0IxVHVRVmRKMFA1d0lLL0QxMFRRekFXREthbTBrdjNSWGlkbHpSeHBaM3NuUm5OL0wzRVZkNThSbnRqMU9jMHkKK0ZpSWlTS1JzekRiUHpLRHhRRTJzTmdRY2RPMjRKTkxTYS9zWll0cTJnUmdzcGwvWXFJRG80WllxaTl4OEY1T1MKK3JkUFU1RC9IOExXUjR2cEpMTDhEWXJIaDVxRkczQlgyT0pJaFBSUys0OHBEWXRyUmpwN1MvMVpVNjRPSkF5dGsKKzk5aERxU3JuMWoyYTZ5RkU4TDJQdHorNFVDRjJPUVhFYzlScXFlYjhRRVV1TVNrTkg0b1ErQTJGNnV6THBaaTAKK1hINjRSMm5pTkM1Nkx4VjJpKzNUNUtSRUZMYWh5azhlcExabHY4WWR4WVI0U2I3Si81eWlvb0szZzlobVlWS08KK3pMYz0KIC0tLS0tRU5EIEVOQ1JZUFRFRCBQUklWQVRFIEtFWS0tLS0tCmRpZmYgLS1naXQgYS90ZXN0L2tleXMvY2xpZW50X3YzLmNydCBiL3Rlc3Qva2V5cy9jbGllbnRfdjMuY3J0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0N2YxNTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2tleXMvY2xpZW50X3YzLmNydApAQCAtMCwwICsxLDI0IEBACistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUVDRENDQXZDZ0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRc0ZBRENCc1RFTE1Ba0dBMVVFQmhNQ1ZWTXgKK0VUQVBCZ05WQkFnTUNFMWhjbmxzWVc1a01SUXdFZ1lEVlFRSERBdEdiM0psYzNRZ1NHbHNiREVuTUNVR0ExVUUKK0Nnd2VWR2hsSUVGd1lXTm9aU0JUYjJaMGQyRnlaU0JHYjNWdVpHRjBhVzl1TVJZd0ZBWURWUVFMREExQmNHRmoKK2FHVWdWR2h5YVdaME1SSXdFQVlEVlFRRERBbHNiMk5oYkdodmMzUXhKREFpQmdrcWhraUc5dzBCQ1FFV0ZXUmwKK2RrQjBhSEpwWm5RdVlYQmhZMmhsTG05eVp6QWVGdzB4TmpBeU1qSXhNVFU0TkRGYUZ3MHlOREExTVRBeE1UVTQKK05ERmFNSUdMTVFzd0NRWURWUVFHRXdKVlV6RVJNQThHQTFVRUNBd0lUV0Z5ZVd4aGJtUXhGREFTQmdOVkJBY00KK0MwWnZjbVZ6ZENCSWFXeHNNU2N3SlFZRFZRUUtEQjVVYUdVZ1FYQmhZMmhsSUZOdlpuUjNZWEpsSUVadmRXNWsKK1lYUnBiMjR4RmpBVUJnTlZCQXNNRFVGd1lXTm9aU0JVYUhKcFpuUXhFakFRQmdOVkJBTU1DV3h2WTJGc2FHOXoKK2REQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQUxaMHdpUW5YZzVRTVpaV3VnZC8KK08zd29hdHlIdWN6SnVGU21ZaVJHV0xyM1B1Z0IreHR2ankwclRjRTJNTngvYmRzVnhyYXBDS0ErdE1GT1JiRWwKK3NGNmprMEgrQjdCekdvSXdIcjZOOEdQMVZPb0EyZXNyaHNORXoyMmFKSTAwVmFGVEZFOEcvcWdGY2loeWFWV0gKK1pzTGEzTWFrT3pGVW1PQmFWMnRMQmpDamF6bnFYdzNlbzNYd1VJMEJrZ1M5Yjl2cVhqU2NtZldYRHc1KzFpczQKK2JDZ3VtRzJ6ajlFcEx5cGM5cUNHTktGQk8yWUlnMFhzSUlKOFJwcmxpYW5qTDZQNE1mQzZHUE95VzROYlphTGQKK0VTdi9idW1wVnl1Vi9DL3hxa1BhaHZPd0J1UEUxbG94WlpQeDZRdjM2OHFuN1NWTlZaT0x5WDcyMnNwb29BNUcKKzZjc0NBd0VBQWFOUE1FMHdDUVlEVlIwVEJBSXdBREFMQmdOVkhROEVCQU1DQmVBd013WURWUjBSQkN3d0tvY0UKK2Z3QUFBWWNRQUFBQUFBQUFBQUFBQUFBQUFBQUFBWWNRQUFBQUFBQUFBQUFBQVAvL2Z3QUFBVEFOQmdrcWhraUcKKzl3MEJBUXNGQUFPQ0FRRUFCVUVtZVFrRy9QUzkzNWpNSERyZy81em00WDJ4cm5GdG1Ud2IwamR4ZmF1NnovN2gKK0FieEQ1aW95WTdGVVROQ3pJNlN5TW85dkpKdFlDVEN1RUdyODRKalQyUjcyMzJ6NjBrNGMxei9hdjAxVzNPcnYKK0V4SGZBWjhsbGhrZnUwMjA5VDVUYUlZQ0I3aERGajVLRGJ0YThjNmZFY3d0bWxIUVdqM00zMWxTTnNyNFp0V1cKK3dPYmhLM3NxVHNPbHVIYmhLTndsTkVhdDQ4bGJPUVVDMTlJMVdpM2RBUzZuOGxyMGxFaGZHS3ZxeHUwVmlBU1MKK04xbkxmZGtSRUdwMzliWXBLZzBuNkVGdzViWXlWNHFFM2NuSWVkRkpwN05JT00vNnhuZEpNaC9jNWw2TjJ1eVoKK3VwQXJSUXB3LzNqK0hrTDF4OWJzKzkwMFFLMEdJNkF4Z2pib3BBPT0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KZGlmZiAtLWdpdCBhL3Rlc3Qva2V5cy9jbGllbnRfdjMua2V5IGIvdGVzdC9rZXlzL2NsaWVudF92My5rZXkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk4OWY3MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qva2V5cy9jbGllbnRfdjMua2V5CkBAIC0wLDAgKzEsMjcgQEAKKy0tLS0tQkVHSU4gUlNBIFBSSVZBVEUgS0VZLS0tLS0KK01JSUVwQUlCQUFLQ0FRRUF0blRDSkNkZURsQXhsbGE2QjM4N2ZDaHEzSWU1ek1tNFZLWmlKRVpZdXZjKzZBSDcKK0cyK1BMU3ROd1RZdzNIOXQyeFhHdHFrSW9ENjB3VTVGc1NXd1hxT1RRZjRIc0hNYWdqQWV2bzN3WS9WVTZnRFoKKzZ5dUd3MFRQYlpva2pUUlZvVk1VVHdiK3FBVnlLSEpwVllkbXd0cmN4cVE3TVZTWTRGcFhhMHNHTUtOck9lcGYKK0RkNmpkZkJRalFHU0JMMXYyK3BlTkp5WjlaY1BEbjdXS3poc0tDNlliYk9QMFNrdktsejJvSVkwb1VFN1pnaUQKK1Jld2dnbnhHbXVXSnFlTXZvL2d4OExvWTg3SmJnMXRsb3QwUksvOXU2YWxYSzVYOEwvR3FROXFHODdBRzQ4VFcKK1dqRmxrL0hwQy9mcnlxZnRKVTFWazR2SmZ2YmF5bWlnRGticHl3SURBUUFCQW9JQkFRQ0pweVVoYWFJSVluQkcKKzREK1JrR2dzajhHdmg2YWgzajUzZnQva1JqNkRNQzRCbEIwQzRmTy9QRUI1V0kwY2pmY3Zwd280bk9hcEh5WDQKK0FUbUxJTWdqWG4ybStDU005d28wMW1FYm1yS1dkMjBNN245NmNXaEd3ZzlNdlZKK1JkR2sySzBsd2owMlBvV1cKK0JsdDU3NkdUdU5OLytqKytRL2ppcXNYeGFMVE8wL1dqKzRiMmdRaDNuOEkwdTZia29sRExvRVJLSWRyTEdISCsKK0ZVM3NrOGJwVWhIbWVpVVRmd3djaStqdWh0T1k5ZTMwQUVzdDZ4YWtDSGJxMWxSUnlFWVB0V0w3b0xkczZ5djAKK1VBS1A3d1M5WWw2ZGNla1hTRjFSWnBCK2ZvdlRXK3FQWW44YUV1a3NhTXowd0s5NkZDT2pWTkdZeE1wK1hudmwKK3NLeDYzVVpCQW9HQkFPQ2JDYkp0TzBIc2dJYXV2Q3ZHWjUwYVoxdkR2UVJlQ3dyaTRpb3V0RWc0SkNBWEhFc1gKKytheHoySjVqM1VFUWhHS3IwRVg5Qkc2WWJ4R1cwTW1qZjNReGVSQiswV0xwTU1ZMlNGdDkzb0MyUjFBWDlsMEkKK2g1ME82dFl2NVNYbTk2cEt4d1J6MDFkODRtQ0pnd24vRytjWi9FSmo0cmZac05iUXN0NkpRRnZ6QW9HQkFNLzEKK2dMVlF0NWwrSUsrNnM2OEVuQURJNjZpN2NLZTZzajNyRlJUYWhaSnhMMnZZMjhKOUVCMm1GL1hFZ0FSU05KUVYKK1gvSDl6RHJ3S205TVg4Ny9lQ0gybkViYys1cVNHcERQUW00ODJDOURxc01pdHhDS0Q4YmJsZTFCbHBqRmI4aHIKK1IwUTN2NXE4dTV1b21MQmRzNWVVQmVSS010dTl0T01BOUtSU0RHakpBb0dBRjQ0SzJVeDlUMitYRndqU01TRVEKK2tyaEhLS2VCZGlqS3JheVhuV2JpZjBSci9YV1BBUTBWb1JGUklXTkZ1K0lZa0NTR3BpQmZ5NTF1NElCWml4djcKK2JOc1hZRFI4and2M2tvSDAycXQ3bnpIK2pwYkV2b0w3ZmV3bmtxalpOajFmc2RzL3ZlYkx2andablpndVJ1a2IKK0t3UmRvVFRLZlE5MmJVRGIwVnpCaENNQ2dZQjdIKzNPYkRYb0NRY3RSQ3N5aWxZYkdOcCtFa3hHNG9DNXJEL1YKK0V2UldtZkRydDMrVmpScEhrNWxJQjhtTHhXZ2Y3Ty9iaE5xd1lwV2RRK2pOMCsrNm5CbzIwb3VkSHJmZjJQYUoKKzhqaEU4NWxjNDJiandmcEpVS1ZaemFWdVdpY3UwR1ZuZkdKVEtUOGlrQlduQmpOWW9XbERtcksxNjRIM2pROUwKK1l0QzZFUUtCZ1FDYWJGWFhIeDVjSUoyWE9tNEsvblRPRzdDbHZEODB4YXBxeUdyb1FkOUUvY0pVSEhQcC93UTQKK2MxZE1PNUVWaU03SlJzS2Z4a2w5dk01bzlJTTdzd2xZaDRFTUZTTEpOanpnT1k5WFZrdlFoMHVHYmlKT0JPNGYKK2luVXVXbjFZV1VqL0hGdHJUKzBObytjWXZaVmNNS3JGQXkzSy9Bd3BUYmZLQ2s2cm91bGxOQT09CistLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQpkaWZmIC0tZ2l0IGEvdGVzdC9rbm93bl9mYWlsdXJlc19MaW51eC5qc29uIGIvdGVzdC9rbm93bl9mYWlsdXJlc19MaW51eC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhYjJhZjUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2tub3duX2ZhaWx1cmVzX0xpbnV4Lmpzb24KQEAgLTAsMCArMSw0OTQgQEAKK1sKKyAgImNfZ2xpYi1yc19tdWx0aV9idWZmZXJlZC1pcCIsCisgICJjX2dsaWItcnNfbXVsdGlfZnJhbWVkLWlwIiwKKyAgImNfZ2xpYi1yc19tdWx0aWNfYnVmZmVyZWQtaXAiLAorICAiY19nbGliLXJzX211bHRpY19mcmFtZWQtaXAiLAorICAiY2wtY19nbGliX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICJjbC1jX2dsaWJfYmluYXJ5X2ZyYW1lZC1pcCIsCisgICJjbC1jX2dsaWJfbXVsdGktYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgImNsLWNfZ2xpYl9tdWx0aS1iaW5hcnlfZnJhbWVkLWlwIiwKKyAgImNsLWNfZ2xpYl9tdWx0aV9idWZmZXJlZC1pcCIsCisgICJjbC1jX2dsaWJfbXVsdGlfZnJhbWVkLWlwIiwKKyAgImNsLWdvX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICJjbC1nb19iaW5hcnlfZnJhbWVkLWlwIiwKKyAgImNsLXJiX2JpbmFyeS1hY2NlbF9idWZmZXJlZC1pcCIsCisgICJjbC1yYl9iaW5hcnktYWNjZWxfZnJhbWVkLWlwIiwKKyAgImNsLXJiX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICJjbC1yYl9iaW5hcnlfZnJhbWVkLWlwIiwKKyAgImNsLXJzX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICJjbC1yc19iaW5hcnlfZnJhbWVkLWlwIiwKKyAgImNsLXJzX211bHRpLWJpbmFyeV9idWZmZXJlZC1pcCIsCisgICJjbC1yc19tdWx0aS1iaW5hcnlfZnJhbWVkLWlwIiwKKyAgImNsLXJzX211bHRpX2J1ZmZlcmVkLWlwIiwKKyAgImNsLXJzX211bHRpX2ZyYW1lZC1pcCIsCisgICJjcHAtZGFydF9iaW5hcnlfaHR0cC1pcCIsCisgICJjcHAtZGFydF9jb21wYWN0X2h0dHAtaXAiLAorICAiY3BwLWRhcnRfanNvbl9odHRwLWlwIiwKKyAgImNwcC1kYXJ0X211bHRpLWJpbmFyeV9odHRwLWlwIiwKKyAgImNwcC1kYXJ0X211bHRpYy1jb21wYWN0X2h0dHAtaXAiLAorICAiY3BwLWRhcnRfbXVsdGlqLWpzb25faHR0cC1pcCIsCisgICJjcHAtZ29fYmluYXJ5X2h0dHAtaXAiLAorICAiY3BwLWdvX2JpbmFyeV9odHRwLWlwLXNzbCIsCisgICJjcHAtZ29fY29tcGFjdF9odHRwLWlwIiwKKyAgImNwcC1nb19jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgImNwcC1nb19qc29uX2h0dHAtaXAiLAorICAiY3BwLWdvX2pzb25faHR0cC1pcC1zc2wiLAorICAiY3BwLWdvX211bHRpLWJpbmFyeV9odHRwLWlwIiwKKyAgImNwcC1nb19tdWx0aS1iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAiY3BwLWdvX211bHRpYy1jb21wYWN0X2h0dHAtaXAiLAorICAiY3BwLWdvX211bHRpYy1jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgImNwcC1nb19tdWx0aWotanNvbl9odHRwLWlwIiwKKyAgImNwcC1nb19tdWx0aWotanNvbl9odHRwLWlwLXNzbCIsCisgICJjcHAtamF2YV9iaW5hcnlfaHR0cC1pcCIsCisgICJjcHAtamF2YV9iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAiY3BwLWphdmFfY29tcGFjdF9odHRwLWlwIiwKKyAgImNwcC1qYXZhX2NvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAiY3BwLWphdmFfanNvbl9odHRwLWlwIiwKKyAgImNwcC1qYXZhX2pzb25faHR0cC1pcC1zc2wiLAorICAiY3BwLWphdmFfbXVsdGktYmluYXJ5X2h0dHAtaXAiLAorICAiY3BwLWphdmFfbXVsdGktYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgImNwcC1qYXZhX211bHRpX2h0dHAtaXAiLAorICAiY3BwLWphdmFfbXVsdGlfaHR0cC1pcC1zc2wiLAorICAiY3BwLWphdmFfbXVsdGljLWNvbXBhY3RfaHR0cC1pcCIsCisgICJjcHAtamF2YV9tdWx0aWMtY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJjcHAtamF2YV9tdWx0aWNfaHR0cC1pcCIsCisgICJjcHAtamF2YV9tdWx0aWNfaHR0cC1pcC1zc2wiLAorICAiY3BwLWphdmFfbXVsdGlqLWpzb25faHR0cC1pcCIsCisgICJjcHAtamF2YV9tdWx0aWotanNvbl9odHRwLWlwLXNzbCIsCisgICJjcHAtamF2YV9tdWx0aWpfaHR0cC1pcCIsCisgICJjcHAtamF2YV9tdWx0aWpfaHR0cC1pcC1zc2wiLAorICAiY3BwLW5vZGVqc19iaW5hcnlfaHR0cC1kb21haW4iLAorICAiY3BwLW5vZGVqc19iaW5hcnlfaHR0cC1pcCIsCisgICJjcHAtbm9kZWpzX2JpbmFyeV9odHRwLWlwLXNzbCIsCisgICJjcHAtbm9kZWpzX2NvbXBhY3RfaHR0cC1kb21haW4iLAorICAiY3BwLW5vZGVqc19jb21wYWN0X2h0dHAtaXAiLAorICAiY3BwLW5vZGVqc19jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgImNwcC1ub2RlanNfanNvbl9odHRwLWRvbWFpbiIsCisgICJjcHAtbm9kZWpzX2pzb25faHR0cC1pcCIsCisgICJjcHAtbm9kZWpzX2pzb25faHR0cC1pcC1zc2wiLAorICAiY3BwLW5vZGVqc19tdWx0aS1iaW5hcnlfaHR0cC1kb21haW4iLAorICAiY3BwLW5vZGVqc19tdWx0aS1iaW5hcnlfaHR0cC1pcCIsCisgICJjcHAtbm9kZWpzX211bHRpLWJpbmFyeV9odHRwLWlwLXNzbCIsCisgICJjcHAtbm9kZWpzX211bHRpYy1jb21wYWN0X2h0dHAtZG9tYWluIiwKKyAgImNwcC1ub2RlanNfbXVsdGljLWNvbXBhY3RfaHR0cC1pcCIsCisgICJjcHAtbm9kZWpzX211bHRpYy1jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgImNwcC1ub2RlanNfbXVsdGlqLWpzb25faHR0cC1kb21haW4iLAorICAiY3BwLW5vZGVqc19tdWx0aWotanNvbl9odHRwLWlwIiwKKyAgImNwcC1ub2RlanNfbXVsdGlqLWpzb25faHR0cC1pcC1zc2wiLAorICAiY3BwLXB5M19iaW5hcnktYWNjZWxfaHR0cC1pcCIsCisgICJjcHAtcHkzX2JpbmFyeS1hY2NlbF9odHRwLWlwLXNzbCIsCisgICJjcHAtcHkzX2JpbmFyeV9odHRwLWlwIiwKKyAgImNwcC1weTNfYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weTNfY29tcGFjdC1hY2NlbGNfaHR0cC1pcCIsCisgICJjcHAtcHkzX2NvbXBhY3QtYWNjZWxjX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weTNfY29tcGFjdF9odHRwLWlwIiwKKyAgImNwcC1weTNfY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJjcHAtcHkzX2hlYWRlcl9odHRwLWlwIiwKKyAgImNwcC1weTNfaGVhZGVyX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weTNfanNvbl9odHRwLWlwIiwKKyAgImNwcC1weTNfanNvbl9odHRwLWlwLXNzbCIsCisgICJjcHAtcHkzX211bHRpLWFjY2VsX2h0dHAtaXAiLAorICAiY3BwLXB5M19tdWx0aS1hY2NlbF9odHRwLWlwLXNzbCIsCisgICJjcHAtcHkzX211bHRpLWJpbmFyeV9odHRwLWlwIiwKKyAgImNwcC1weTNfbXVsdGktYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weTNfbXVsdGktbXVsdGlhX2h0dHAtaXAiLAorICAiY3BwLXB5M19tdWx0aS1tdWx0aWFfaHR0cC1pcC1zc2wiLAorICAiY3BwLXB5M19tdWx0aV9odHRwLWlwIiwKKyAgImNwcC1weTNfbXVsdGlfaHR0cC1pcC1zc2wiLAorICAiY3BwLXB5M19tdWx0aWMtYWNjZWxjX2h0dHAtaXAiLAorICAiY3BwLXB5M19tdWx0aWMtYWNjZWxjX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weTNfbXVsdGljLWNvbXBhY3RfaHR0cC1pcCIsCisgICJjcHAtcHkzX211bHRpYy1jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weTNfbXVsdGljLW11bHRpYWNfaHR0cC1pcCIsCisgICJjcHAtcHkzX211bHRpYy1tdWx0aWFjX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weTNfbXVsdGljX2h0dHAtaXAiLAorICAiY3BwLXB5M19tdWx0aWNfaHR0cC1pcC1zc2wiLAorICAiY3BwLXB5M19tdWx0aWgtaGVhZGVyX2h0dHAtaXAiLAorICAiY3BwLXB5M19tdWx0aWgtaGVhZGVyX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weTNfbXVsdGlqLWpzb25faHR0cC1pcCIsCisgICJjcHAtcHkzX211bHRpai1qc29uX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weTNfbXVsdGlqX2h0dHAtaXAiLAorICAiY3BwLXB5M19tdWx0aWpfaHR0cC1pcC1zc2wiLAorICAiY3BwLXB5X2JpbmFyeS1hY2NlbF9odHRwLWlwIiwKKyAgImNwcC1weV9iaW5hcnktYWNjZWxfaHR0cC1pcC1zc2wiLAorICAiY3BwLXB5X2JpbmFyeV9odHRwLWlwIiwKKyAgImNwcC1weV9iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAiY3BwLXB5X2NvbXBhY3QtYWNjZWxjX2h0dHAtaXAiLAorICAiY3BwLXB5X2NvbXBhY3QtYWNjZWxjX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weV9jb21wYWN0X2h0dHAtaXAiLAorICAiY3BwLXB5X2NvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAiY3BwLXB5X2hlYWRlcl9odHRwLWlwIiwKKyAgImNwcC1weV9oZWFkZXJfaHR0cC1pcC1zc2wiLAorICAiY3BwLXB5X2pzb25faHR0cC1pcCIsCisgICJjcHAtcHlfanNvbl9odHRwLWlwLXNzbCIsCisgICJjcHAtcHlfbXVsdGktYWNjZWxfaHR0cC1pcCIsCisgICJjcHAtcHlfbXVsdGktYWNjZWxfaHR0cC1pcC1zc2wiLAorICAiY3BwLXB5X211bHRpLWJpbmFyeV9odHRwLWlwIiwKKyAgImNwcC1weV9tdWx0aS1iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAiY3BwLXB5X211bHRpLW11bHRpYV9odHRwLWlwIiwKKyAgImNwcC1weV9tdWx0aS1tdWx0aWFfaHR0cC1pcC1zc2wiLAorICAiY3BwLXB5X211bHRpX2h0dHAtaXAiLAorICAiY3BwLXB5X211bHRpX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weV9tdWx0aWMtYWNjZWxjX2h0dHAtaXAiLAorICAiY3BwLXB5X211bHRpYy1hY2NlbGNfaHR0cC1pcC1zc2wiLAorICAiY3BwLXB5X211bHRpYy1jb21wYWN0X2h0dHAtaXAiLAorICAiY3BwLXB5X211bHRpYy1jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weV9tdWx0aWMtbXVsdGlhY19odHRwLWlwIiwKKyAgImNwcC1weV9tdWx0aWMtbXVsdGlhY19odHRwLWlwLXNzbCIsCisgICJjcHAtcHlfbXVsdGljX2h0dHAtaXAiLAorICAiY3BwLXB5X211bHRpY19odHRwLWlwLXNzbCIsCisgICJjcHAtcHlfbXVsdGloLWhlYWRlcl9odHRwLWlwIiwKKyAgImNwcC1weV9tdWx0aWgtaGVhZGVyX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weV9tdWx0aWotanNvbl9odHRwLWlwIiwKKyAgImNwcC1weV9tdWx0aWotanNvbl9odHRwLWlwLXNzbCIsCisgICJjcHAtcHlfbXVsdGlqX2h0dHAtaXAiLAorICAiY3BwLXB5X211bHRpal9odHRwLWlwLXNzbCIsCisgICJjcHAtcnNfbXVsdGlfYnVmZmVyZWQtaXAiLAorICAiY3BwLXJzX211bHRpX2ZyYW1lZC1pcCIsCisgICJjcHAtcnNfbXVsdGljX2J1ZmZlcmVkLWlwIiwKKyAgImNwcC1yc19tdWx0aWNfZnJhbWVkLWlwIiwKKyAgImNzaGFycC1yYl9iaW5hcnktYWNjZWxfYnVmZmVyZWQtaXAtc3NsIiwKKyAgImNzaGFycC1yYl9iaW5hcnktYWNjZWxfZnJhbWVkLWlwLXNzbCIsCisgICJjc2hhcnAtcmJfYmluYXJ5X2J1ZmZlcmVkLWlwLXNzbCIsCisgICJjc2hhcnAtcmJfYmluYXJ5X2ZyYW1lZC1pcC1zc2wiLAorICAiY3NoYXJwLXJiX2NvbXBhY3RfYnVmZmVyZWQtaXAtc3NsIiwKKyAgImNzaGFycC1yYl9jb21wYWN0X2ZyYW1lZC1pcC1zc2wiLAorICAiY3NoYXJwLXJiX2pzb25fYnVmZmVyZWQtaXAtc3NsIiwKKyAgImNzaGFycC1yYl9qc29uX2ZyYW1lZC1pcC1zc2wiLAorICAiZC1jbF9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAiZC1jbF9iaW5hcnlfZnJhbWVkLWlwIiwKKyAgImQtY3BwX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICJkLWNwcF9iaW5hcnlfYnVmZmVyZWQtaXAtc3NsIiwKKyAgImQtY3BwX2JpbmFyeV9mcmFtZWQtaXAiLAorICAiZC1jcHBfYmluYXJ5X2ZyYW1lZC1pcC1zc2wiLAorICAiZC1jcHBfYmluYXJ5X2h0dHAtaXAiLAorICAiZC1jcHBfYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgImQtY3BwX2NvbXBhY3RfYnVmZmVyZWQtaXAiLAorICAiZC1jcHBfY29tcGFjdF9idWZmZXJlZC1pcC1zc2wiLAorICAiZC1jcHBfY29tcGFjdF9mcmFtZWQtaXAiLAorICAiZC1jcHBfY29tcGFjdF9mcmFtZWQtaXAtc3NsIiwKKyAgImQtY3BwX2NvbXBhY3RfaHR0cC1pcCIsCisgICJkLWNwcF9jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgImQtY3BwX2pzb25fYnVmZmVyZWQtaXAiLAorICAiZC1jcHBfanNvbl9idWZmZXJlZC1pcC1zc2wiLAorICAiZC1jcHBfanNvbl9mcmFtZWQtaXAiLAorICAiZC1jcHBfanNvbl9mcmFtZWQtaXAtc3NsIiwKKyAgImQtY3BwX2pzb25faHR0cC1pcCIsCisgICJkLWNwcF9qc29uX2h0dHAtaXAtc3NsIiwKKyAgImQtZF9iaW5hcnlfaHR0cC1pcCIsCisgICJkLWRfY29tcGFjdF9odHRwLWlwIiwKKyAgImQtZF9qc29uX2h0dHAtaXAiLAorICAiZC1kYXJ0X2JpbmFyeV9odHRwLWlwIiwKKyAgImQtZGFydF9jb21wYWN0X2h0dHAtaXAiLAorICAiZC1kYXJ0X2pzb25faHR0cC1pcCIsCisgICJkLWdvX2JpbmFyeV9odHRwLWlwIiwKKyAgImQtZ29fYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgImQtZ29fY29tcGFjdF9odHRwLWlwIiwKKyAgImQtZ29fY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJkLWdvX2pzb25faHR0cC1pcCIsCisgICJkLWdvX2pzb25faHR0cC1pcC1zc2wiLAorICAiZC1qYXZhX2JpbmFyeV9odHRwLWlwIiwKKyAgImQtamF2YV9iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAiZC1qYXZhX2NvbXBhY3RfaHR0cC1pcCIsCisgICJkLWphdmFfY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJkLWphdmFfanNvbl9odHRwLWlwIiwKKyAgImQtamF2YV9qc29uX2h0dHAtaXAtc3NsIiwKKyAgImQtanNfanNvbl9odHRwLWlwIiwKKyAgImQtbm9kZWpzX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICJkLW5vZGVqc19iaW5hcnlfYnVmZmVyZWQtaXAtc3NsIiwKKyAgImQtbm9kZWpzX2JpbmFyeV9mcmFtZWQtaXAiLAorICAiZC1ub2RlanNfYmluYXJ5X2ZyYW1lZC1pcC1zc2wiLAorICAiZC1ub2RlanNfYmluYXJ5X2h0dHAtaXAiLAorICAiZC1ub2RlanNfYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgImQtbm9kZWpzX2NvbXBhY3RfYnVmZmVyZWQtaXAiLAorICAiZC1ub2RlanNfY29tcGFjdF9idWZmZXJlZC1pcC1zc2wiLAorICAiZC1ub2RlanNfY29tcGFjdF9mcmFtZWQtaXAiLAorICAiZC1ub2RlanNfY29tcGFjdF9mcmFtZWQtaXAtc3NsIiwKKyAgImQtbm9kZWpzX2NvbXBhY3RfaHR0cC1pcCIsCisgICJkLW5vZGVqc19jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgImQtbm9kZWpzX2pzb25fYnVmZmVyZWQtaXAiLAorICAiZC1ub2RlanNfanNvbl9idWZmZXJlZC1pcC1zc2wiLAorICAiZC1ub2RlanNfanNvbl9mcmFtZWQtaXAiLAorICAiZC1ub2RlanNfanNvbl9mcmFtZWQtaXAtc3NsIiwKKyAgImQtbm9kZWpzX2pzb25faHR0cC1pcCIsCisgICJkLW5vZGVqc19qc29uX2h0dHAtaXAtc3NsIiwKKyAgImQtbm9kZXRzX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICJkLXB5M19iaW5hcnktYWNjZWxfYnVmZmVyZWQtaXAiLAorICAiZC1weTNfYmluYXJ5LWFjY2VsX2J1ZmZlcmVkLWlwLXNzbCIsCisgICJkLXB5M19iaW5hcnktYWNjZWxfZnJhbWVkLWlwIiwKKyAgImQtcHkzX2JpbmFyeS1hY2NlbF9mcmFtZWQtaXAtc3NsIiwKKyAgImQtcHkzX2JpbmFyeS1hY2NlbF9odHRwLWlwIiwKKyAgImQtcHkzX2JpbmFyeS1hY2NlbF9odHRwLWlwLXNzbCIsCisgICJkLXB5M19iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAiZC1weTNfYmluYXJ5X2J1ZmZlcmVkLWlwLXNzbCIsCisgICJkLXB5M19iaW5hcnlfZnJhbWVkLWlwIiwKKyAgImQtcHkzX2JpbmFyeV9mcmFtZWQtaXAtc3NsIiwKKyAgImQtcHkzX2JpbmFyeV9odHRwLWlwIiwKKyAgImQtcHkzX2JpbmFyeV9odHRwLWlwLXNzbCIsCisgICJkLXB5M19jb21wYWN0LWFjY2VsY19idWZmZXJlZC1pcCIsCisgICJkLXB5M19jb21wYWN0LWFjY2VsY19idWZmZXJlZC1pcC1zc2wiLAorICAiZC1weTNfY29tcGFjdC1hY2NlbGNfZnJhbWVkLWlwIiwKKyAgImQtcHkzX2NvbXBhY3QtYWNjZWxjX2ZyYW1lZC1pcC1zc2wiLAorICAiZC1weTNfY29tcGFjdC1hY2NlbGNfaHR0cC1pcCIsCisgICJkLXB5M19jb21wYWN0LWFjY2VsY19odHRwLWlwLXNzbCIsCisgICJkLXB5M19jb21wYWN0X2J1ZmZlcmVkLWlwIiwKKyAgImQtcHkzX2NvbXBhY3RfYnVmZmVyZWQtaXAtc3NsIiwKKyAgImQtcHkzX2NvbXBhY3RfZnJhbWVkLWlwIiwKKyAgImQtcHkzX2NvbXBhY3RfZnJhbWVkLWlwLXNzbCIsCisgICJkLXB5M19jb21wYWN0X2h0dHAtaXAiLAorICAiZC1weTNfY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJkLXB5M19qc29uX2J1ZmZlcmVkLWlwIiwKKyAgImQtcHkzX2pzb25fYnVmZmVyZWQtaXAtc3NsIiwKKyAgImQtcHkzX2pzb25fZnJhbWVkLWlwIiwKKyAgImQtcHkzX2pzb25fZnJhbWVkLWlwLXNzbCIsCisgICJkLXB5M19qc29uX2h0dHAtaXAiLAorICAiZC1weTNfanNvbl9odHRwLWlwLXNzbCIsCisgICJkLXB5X2JpbmFyeS1hY2NlbF9idWZmZXJlZC1pcCIsCisgICJkLXB5X2JpbmFyeS1hY2NlbF9idWZmZXJlZC1pcC1zc2wiLAorICAiZC1weV9iaW5hcnktYWNjZWxfZnJhbWVkLWlwIiwKKyAgImQtcHlfYmluYXJ5LWFjY2VsX2ZyYW1lZC1pcC1zc2wiLAorICAiZC1weV9iaW5hcnktYWNjZWxfaHR0cC1pcCIsCisgICJkLXB5X2JpbmFyeS1hY2NlbF9odHRwLWlwLXNzbCIsCisgICJkLXB5X2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICJkLXB5X2JpbmFyeV9idWZmZXJlZC1pcC1zc2wiLAorICAiZC1weV9iaW5hcnlfZnJhbWVkLWlwIiwKKyAgImQtcHlfYmluYXJ5X2ZyYW1lZC1pcC1zc2wiLAorICAiZC1weV9iaW5hcnlfaHR0cC1pcCIsCisgICJkLXB5X2JpbmFyeV9odHRwLWlwLXNzbCIsCisgICJkLXB5X2NvbXBhY3QtYWNjZWxjX2J1ZmZlcmVkLWlwIiwKKyAgImQtcHlfY29tcGFjdC1hY2NlbGNfYnVmZmVyZWQtaXAtc3NsIiwKKyAgImQtcHlfY29tcGFjdC1hY2NlbGNfZnJhbWVkLWlwIiwKKyAgImQtcHlfY29tcGFjdC1hY2NlbGNfZnJhbWVkLWlwLXNzbCIsCisgICJkLXB5X2NvbXBhY3QtYWNjZWxjX2h0dHAtaXAiLAorICAiZC1weV9jb21wYWN0LWFjY2VsY19odHRwLWlwLXNzbCIsCisgICJkLXB5X2NvbXBhY3RfYnVmZmVyZWQtaXAiLAorICAiZC1weV9jb21wYWN0X2J1ZmZlcmVkLWlwLXNzbCIsCisgICJkLXB5X2NvbXBhY3RfZnJhbWVkLWlwIiwKKyAgImQtcHlfY29tcGFjdF9mcmFtZWQtaXAtc3NsIiwKKyAgImQtcHlfY29tcGFjdF9odHRwLWlwIiwKKyAgImQtcHlfY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJkLXB5X2pzb25fYnVmZmVyZWQtaXAiLAorICAiZC1weV9qc29uX2J1ZmZlcmVkLWlwLXNzbCIsCisgICJkLXB5X2pzb25fZnJhbWVkLWlwIiwKKyAgImQtcHlfanNvbl9mcmFtZWQtaXAtc3NsIiwKKyAgImQtcHlfanNvbl9odHRwLWlwIiwKKyAgImQtcHlfanNvbl9odHRwLWlwLXNzbCIsCisgICJlcmwtY3BwX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICJlcmwtY3BwX2NvbXBhY3RfYnVmZmVyZWQtaXAiLAorICAiZXJsLWNzaGFycF9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAiZXJsLWNzaGFycF9jb21wYWN0X2J1ZmZlcmVkLWlwIiwKKyAgImVybC1ub2RlanNfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgImVybC1ub2RlanNfY29tcGFjdF9idWZmZXJlZC1pcCIsCisgICJlcmwtbm9kZXRzX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICJlcmwtcmJfYmluYXJ5LWFjY2VsX2J1ZmZlcmVkLWlwIiwKKyAgImVybC1yYl9iaW5hcnktYWNjZWxfYnVmZmVyZWQtaXAtc3NsIiwKKyAgImVybC1yYl9iaW5hcnktYWNjZWxfZnJhbWVkLWlwIiwKKyAgImVybC1yYl9iaW5hcnktYWNjZWxfZnJhbWVkLWlwLXNzbCIsCisgICJlcmwtcmJfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgImVybC1yYl9iaW5hcnlfYnVmZmVyZWQtaXAtc3NsIiwKKyAgImVybC1yYl9iaW5hcnlfZnJhbWVkLWlwIiwKKyAgImVybC1yYl9iaW5hcnlfZnJhbWVkLWlwLXNzbCIsCisgICJlcmwtcmJfY29tcGFjdF9idWZmZXJlZC1pcCIsCisgICJlcmwtcmJfY29tcGFjdF9idWZmZXJlZC1pcC1zc2wiLAorICAiZXJsLXJiX2NvbXBhY3RfZnJhbWVkLWlwIiwKKyAgImVybC1yYl9jb21wYWN0X2ZyYW1lZC1pcC1zc2wiLAorICAiZ28tY3BwX2JpbmFyeV9odHRwLWlwIiwKKyAgImdvLWNwcF9iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAiZ28tY3BwX2NvbXBhY3RfaHR0cC1pcCIsCisgICJnby1jcHBfY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJnby1jcHBfanNvbl9odHRwLWlwIiwKKyAgImdvLWNwcF9qc29uX2h0dHAtaXAtc3NsIiwKKyAgImdvLWRfYmluYXJ5X2h0dHAtaXAiLAorICAiZ28tZF9iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAiZ28tZF9jb21wYWN0X2h0dHAtaXAiLAorICAiZ28tZF9jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgImdvLWRfanNvbl9odHRwLWlwIiwKKyAgImdvLWRfanNvbl9odHRwLWlwLXNzbCIsCisgICJnby1kYXJ0X2JpbmFyeV9odHRwLWlwIiwKKyAgImdvLWRhcnRfY29tcGFjdF9odHRwLWlwIiwKKyAgImdvLWRhcnRfanNvbl9odHRwLWlwIiwKKyAgImdvLWphdmFfYmluYXJ5X2h0dHAtaXAiLAorICAiZ28tamF2YV9iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAiZ28tamF2YV9jb21wYWN0X2h0dHAtaXAiLAorICAiZ28tamF2YV9jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgImdvLWphdmFfanNvbl9odHRwLWlwIiwKKyAgImdvLWphdmFfanNvbl9odHRwLWlwLXNzbCIsCisgICJnby1weTNfYmluYXJ5LWFjY2VsX3psaWItaXAtc3NsIiwKKyAgImdvLXB5M19jb21wYWN0LWFjY2VsY196bGliLWlwLXNzbCIsCisgICJnby1weV9iaW5hcnktYWNjZWxfemxpYi1pcC1zc2wiLAorICAiZ28tcHlfY29tcGFjdC1hY2NlbGNfemxpYi1pcC1zc2wiLAorICAiaHMtY3NoYXJwX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICJocy1jc2hhcnBfYmluYXJ5X2ZyYW1lZC1pcCIsCisgICJocy1jc2hhcnBfY29tcGFjdF9idWZmZXJlZC1pcCIsCisgICJocy1jc2hhcnBfY29tcGFjdF9mcmFtZWQtaXAiLAorICAibm9kZWpzLWNwcF9iaW5hcnlfaHR0cC1kb21haW4iLAorICAibm9kZWpzLWNwcF9iaW5hcnlfaHR0cC1pcCIsCisgICJub2RlanMtY3BwX2JpbmFyeV9odHRwLWlwLXNzbCIsCisgICJub2RlanMtY3BwX2NvbXBhY3RfaHR0cC1kb21haW4iLAorICAibm9kZWpzLWNwcF9jb21wYWN0X2h0dHAtaXAiLAorICAibm9kZWpzLWNwcF9jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgIm5vZGVqcy1jcHBfanNvbl9idWZmZXJlZC1pcC1zc2wiLAorICAibm9kZWpzLWNwcF9qc29uX2h0dHAtZG9tYWluIiwKKyAgIm5vZGVqcy1jcHBfanNvbl9odHRwLWlwIiwKKyAgIm5vZGVqcy1jcHBfanNvbl9odHRwLWlwLXNzbCIsCisgICJub2RlanMtZF9iaW5hcnlfaHR0cC1pcCIsCisgICJub2RlanMtZF9iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAibm9kZWpzLWRfY29tcGFjdF9odHRwLWlwIiwKKyAgIm5vZGVqcy1kX2NvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAibm9kZWpzLWRfanNvbl9odHRwLWlwIiwKKyAgIm5vZGVqcy1kX2pzb25faHR0cC1pcC1zc2wiLAorICAibm9kZWpzLWRhcnRfYmluYXJ5X2h0dHAtaXAiLAorICAibm9kZWpzLWRhcnRfY29tcGFjdF9odHRwLWlwIiwKKyAgIm5vZGVqcy1kYXJ0X2pzb25faHR0cC1pcCIsCisgICJub2RlanMtZ29fYmluYXJ5X2h0dHAtaXAiLAorICAibm9kZWpzLWdvX2JpbmFyeV9odHRwLWlwLXNzbCIsCisgICJub2RlanMtZ29fY29tcGFjdF9odHRwLWlwIiwKKyAgIm5vZGVqcy1nb19jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgIm5vZGVqcy1nb19qc29uX2h0dHAtaXAiLAorICAibm9kZWpzLWdvX2pzb25faHR0cC1pcC1zc2wiLAorICAibm9kZWpzLWhzX2JpbmFyeV9odHRwLWlwIiwKKyAgIm5vZGVqcy1oc19jb21wYWN0X2h0dHAtaXAiLAorICAibm9kZWpzLWhzX2pzb25faHR0cC1pcCIsCisgICJub2RlanMtamF2YV9iaW5hcnlfaHR0cC1pcCIsCisgICJub2RlanMtamF2YV9iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAibm9kZWpzLWphdmFfY29tcGFjdF9odHRwLWlwIiwKKyAgIm5vZGVqcy1qYXZhX2NvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAibm9kZWpzLWphdmFfanNvbl9odHRwLWlwIiwKKyAgIm5vZGVqcy1qYXZhX2pzb25faHR0cC1pcC1zc2wiLAorICAibm9kZWpzLWpzX2pzb25faHR0cC1pcCIsCisgICJub2RlanMtbHVhX2JpbmFyeV9odHRwLWlwIiwKKyAgIm5vZGVqcy1sdWFfY29tcGFjdF9odHRwLWlwIiwKKyAgIm5vZGVqcy1sdWFfanNvbl9odHRwLWlwIiwKKyAgIm5vZGVqcy1weTNfYmluYXJ5LWFjY2VsX2h0dHAtaXAiLAorICAibm9kZWpzLXB5M19iaW5hcnktYWNjZWxfaHR0cC1pcC1zc2wiLAorICAibm9kZWpzLXB5M19iaW5hcnlfaHR0cC1pcCIsCisgICJub2RlanMtcHkzX2JpbmFyeV9odHRwLWlwLXNzbCIsCisgICJub2RlanMtcHkzX2NvbXBhY3QtYWNjZWxjX2h0dHAtaXAiLAorICAibm9kZWpzLXB5M19jb21wYWN0LWFjY2VsY19odHRwLWlwLXNzbCIsCisgICJub2RlanMtcHkzX2NvbXBhY3RfaHR0cC1pcCIsCisgICJub2RlanMtcHkzX2NvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAibm9kZWpzLXB5M19qc29uX2h0dHAtaXAiLAorICAibm9kZWpzLXB5M19qc29uX2h0dHAtaXAtc3NsIiwKKyAgIm5vZGVqcy1weV9iaW5hcnktYWNjZWxfaHR0cC1pcCIsCisgICJub2RlanMtcHlfYmluYXJ5LWFjY2VsX2h0dHAtaXAtc3NsIiwKKyAgIm5vZGVqcy1weV9iaW5hcnlfaHR0cC1pcCIsCisgICJub2RlanMtcHlfYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgIm5vZGVqcy1weV9jb21wYWN0LWFjY2VsY19odHRwLWlwIiwKKyAgIm5vZGVqcy1weV9jb21wYWN0LWFjY2VsY19odHRwLWlwLXNzbCIsCisgICJub2RlanMtcHlfY29tcGFjdF9odHRwLWlwIiwKKyAgIm5vZGVqcy1weV9jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgIm5vZGVqcy1weV9qc29uX2h0dHAtaXAiLAorICAibm9kZWpzLXB5X2pzb25faHR0cC1pcC1zc2wiLAorICAicGVybC1yc19tdWx0aV9idWZmZXJlZC1pcCIsCisgICJwZXJsLXJzX211bHRpX2ZyYW1lZC1pcCIsCisgICJweS1jcHBfYWNjZWwtYmluYXJ5X2h0dHAtaXAiLAorICAicHktY3BwX2FjY2VsLWJpbmFyeV9odHRwLWlwLXNzbCIsCisgICJweS1jcHBfYWNjZWwtYmluYXJ5X3psaWItaXAiLAorICAicHktY3BwX2FjY2VsLWJpbmFyeV96bGliLWlwLXNzbCIsCisgICJweS1jcHBfYWNjZWxjLWNvbXBhY3RfaHR0cC1pcCIsCisgICJweS1jcHBfYWNjZWxjLWNvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAicHktY3BwX2FjY2VsYy1jb21wYWN0X3psaWItaXAiLAorICAicHktY3BwX2FjY2VsYy1jb21wYWN0X3psaWItaXAtc3NsIiwKKyAgInB5LWNwcF9iaW5hcnlfaHR0cC1pcCIsCisgICJweS1jcHBfYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgInB5LWNwcF9jb21wYWN0X2h0dHAtaXAiLAorICAicHktY3BwX2NvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAicHktY3BwX2hlYWRlcl9odHRwLWlwIiwKKyAgInB5LWNwcF9oZWFkZXJfaHR0cC1pcC1zc2wiLAorICAicHktY3BwX2pzb25faHR0cC1pcCIsCisgICJweS1jcHBfanNvbl9odHRwLWlwLXNzbCIsCisgICJweS1kX2FjY2VsLWJpbmFyeV9odHRwLWlwIiwKKyAgInB5LWRfYWNjZWwtYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgInB5LWRfYWNjZWxjLWNvbXBhY3RfaHR0cC1pcCIsCisgICJweS1kX2FjY2VsYy1jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgInB5LWRfYmluYXJ5X2h0dHAtaXAiLAorICAicHktZF9iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAicHktZF9jb21wYWN0X2h0dHAtaXAiLAorICAicHktZF9jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgInB5LWRfanNvbl9odHRwLWlwIiwKKyAgInB5LWRfanNvbl9odHRwLWlwLXNzbCIsCisgICJweS1kYXJ0X2FjY2VsLWJpbmFyeV9odHRwLWlwIiwKKyAgInB5LWRhcnRfYWNjZWxjLWNvbXBhY3RfaHR0cC1pcCIsCisgICJweS1kYXJ0X2JpbmFyeV9odHRwLWlwIiwKKyAgInB5LWRhcnRfY29tcGFjdF9odHRwLWlwIiwKKyAgInB5LWRhcnRfanNvbl9odHRwLWlwIiwKKyAgInB5LWhzX2FjY2VsLWJpbmFyeV9odHRwLWlwIiwKKyAgInB5LWhzX2FjY2VsYy1jb21wYWN0X2h0dHAtaXAiLAorICAicHktaHNfYmluYXJ5X2h0dHAtaXAiLAorICAicHktaHNfY29tcGFjdF9odHRwLWlwIiwKKyAgInB5LWhzX2hlYWRlcl9odHRwLWlwIiwKKyAgInB5LWhzX2pzb25faHR0cC1pcCIsCisgICJweS1qYXZhX2FjY2VsLWJpbmFyeV9odHRwLWlwIiwKKyAgInB5LWphdmFfYWNjZWwtYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgInB5LWphdmFfYWNjZWxjLWNvbXBhY3RfaHR0cC1pcCIsCisgICJweS1qYXZhX2FjY2VsYy1jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgInB5LWphdmFfYmluYXJ5X2h0dHAtaXAiLAorICAicHktamF2YV9iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAicHktamF2YV9jb21wYWN0X2h0dHAtaXAiLAorICAicHktamF2YV9jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgInB5LWphdmFfanNvbl9odHRwLWlwIiwKKyAgInB5LWphdmFfanNvbl9odHRwLWlwLXNzbCIsCisgICJweS1sdWFfYWNjZWwtYmluYXJ5X2h0dHAtaXAiLAorICAicHktbHVhX2FjY2VsYy1jb21wYWN0X2h0dHAtaXAiLAorICAicHktbHVhX2JpbmFyeV9odHRwLWlwIiwKKyAgInB5LWx1YV9jb21wYWN0X2h0dHAtaXAiLAorICAicHktbHVhX2pzb25faHR0cC1pcCIsCisgICJweTMtY3BwX2FjY2VsLWJpbmFyeV9odHRwLWlwIiwKKyAgInB5My1jcHBfYWNjZWwtYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgInB5My1jcHBfYWNjZWwtYmluYXJ5X3psaWItaXAiLAorICAicHkzLWNwcF9hY2NlbC1iaW5hcnlfemxpYi1pcC1zc2wiLAorICAicHkzLWNwcF9hY2NlbGMtY29tcGFjdF9odHRwLWlwIiwKKyAgInB5My1jcHBfYWNjZWxjLWNvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAicHkzLWNwcF9hY2NlbGMtY29tcGFjdF96bGliLWlwIiwKKyAgInB5My1jcHBfYWNjZWxjLWNvbXBhY3RfemxpYi1pcC1zc2wiLAorICAicHkzLWNwcF9iaW5hcnlfaHR0cC1pcCIsCisgICJweTMtY3BwX2JpbmFyeV9odHRwLWlwLXNzbCIsCisgICJweTMtY3BwX2NvbXBhY3RfaHR0cC1pcCIsCisgICJweTMtY3BwX2NvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAicHkzLWNwcF9oZWFkZXJfaHR0cC1pcCIsCisgICJweTMtY3BwX2hlYWRlcl9odHRwLWlwLXNzbCIsCisgICJweTMtY3BwX2pzb25faHR0cC1pcCIsCisgICJweTMtY3BwX2pzb25faHR0cC1pcC1zc2wiLAorICAicHkzLWRfYWNjZWwtYmluYXJ5X2h0dHAtaXAiLAorICAicHkzLWRfYWNjZWwtYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgInB5My1kX2FjY2VsYy1jb21wYWN0X2h0dHAtaXAiLAorICAicHkzLWRfYWNjZWxjLWNvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAicHkzLWRfYmluYXJ5X2h0dHAtaXAiLAorICAicHkzLWRfYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgInB5My1kX2NvbXBhY3RfaHR0cC1pcCIsCisgICJweTMtZF9jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgInB5My1kX2pzb25faHR0cC1pcCIsCisgICJweTMtZF9qc29uX2h0dHAtaXAtc3NsIiwKKyAgInB5My1kYXJ0X2FjY2VsLWJpbmFyeV9odHRwLWlwIiwKKyAgInB5My1kYXJ0X2FjY2VsYy1jb21wYWN0X2h0dHAtaXAiLAorICAicHkzLWRhcnRfYmluYXJ5X2h0dHAtaXAiLAorICAicHkzLWRhcnRfY29tcGFjdF9odHRwLWlwIiwKKyAgInB5My1kYXJ0X2pzb25faHR0cC1pcCIsCisgICJweTMtaHNfYWNjZWwtYmluYXJ5X2h0dHAtaXAiLAorICAicHkzLWhzX2FjY2VsYy1jb21wYWN0X2h0dHAtaXAiLAorICAicHkzLWhzX2JpbmFyeV9odHRwLWlwIiwKKyAgInB5My1oc19jb21wYWN0X2h0dHAtaXAiLAorICAicHkzLWhzX2hlYWRlcl9odHRwLWlwIiwKKyAgInB5My1oc19qc29uX2h0dHAtaXAiLAorICAicHkzLWphdmFfYWNjZWwtYmluYXJ5X2h0dHAtaXAiLAorICAicHkzLWphdmFfYWNjZWwtYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgInB5My1qYXZhX2FjY2VsYy1jb21wYWN0X2h0dHAtaXAiLAorICAicHkzLWphdmFfYWNjZWxjLWNvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAicHkzLWphdmFfYmluYXJ5X2h0dHAtaXAiLAorICAicHkzLWphdmFfYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgInB5My1qYXZhX2NvbXBhY3RfaHR0cC1pcCIsCisgICJweTMtamF2YV9jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgInB5My1qYXZhX2pzb25faHR0cC1pcCIsCisgICJweTMtamF2YV9qc29uX2h0dHAtaXAtc3NsIiwKKyAgInB5My1sdWFfYWNjZWwtYmluYXJ5X2h0dHAtaXAiLAorICAicHkzLWx1YV9hY2NlbGMtY29tcGFjdF9odHRwLWlwIiwKKyAgInB5My1sdWFfYmluYXJ5X2h0dHAtaXAiLAorICAicHkzLWx1YV9jb21wYWN0X2h0dHAtaXAiLAorICAicHkzLWx1YV9qc29uX2h0dHAtaXAiLAorICAicmItY3BwX2pzb25fYnVmZmVyZWQtZG9tYWluIiwKKyAgInJiLWNwcF9qc29uX2J1ZmZlcmVkLWlwIiwKKyAgInJiLWNwcF9qc29uX2J1ZmZlcmVkLWlwLXNzbCIsCisgICJyYi1jcHBfanNvbl9mcmFtZWQtZG9tYWluIiwKKyAgInJiLWNwcF9qc29uX2ZyYW1lZC1pcCIsCisgICJyYi1jcHBfanNvbl9mcmFtZWQtaXAtc3NsIgorXQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvbHVhL01ha2VmaWxlLmFtIGIvdGVzdC9sdWEvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ4YzVhZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbHVhL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMzEgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitUSFJJRlQgPSAkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL3RocmlmdAorCisjIFJlbW92ZSAiTWFwVHlwZSA9IiBsaW5lIHRvIGlnbm9yZSBzb21lIG1hcCBidWcgZm9yIG5vdworc3R1YnM6IC4uL1RocmlmdFRlc3QudGhyaWZ0ICQoVEhSSUZUKQorCSQoVEhSSUZUKSAtLWdlbiBsdWEgJDwKKwkkKFNFRCkgLWkuYmFrICdzL01hcFR5cGUgPS8vZycgZ2VuLWx1YS9UaHJpZnRUZXN0X3R0eXBlcy5sdWEKKwkkKFJNKSBnZW4tbHVhL1RocmlmdFRlc3RfdHR5cGVzLmx1YS5iYWsKKworcHJlY3Jvc3M6IHN0dWJzCisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIC1yIGdlbi1sdWEKZGlmZiAtLWdpdCBhL3Rlc3QvbHVhL3Rlc3RfYmFzaWNfY2xpZW50Lmx1YSBiL3Rlc3QvbHVhL3Rlc3RfYmFzaWNfY2xpZW50Lmx1YQppbmRleCBlMmUwZDQ4Li43N2Q4ZDA3IDEwMDY0NAotLS0gYS90ZXN0L2x1YS90ZXN0X2Jhc2ljX2NsaWVudC5sdWEKKysrIGIvdGVzdC9sdWEvdGVzdF9iYXNpY19jbGllbnQubHVhCkBAIC0xLDIyICsxLDI3IEBACi0tLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotLS0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLS0tIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0tLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotLS0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLS0tICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0tLSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLS0tICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotLS0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLS0tIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0tLSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotLS0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLS0tIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0tLSB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLS0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy0tIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCistLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy0tIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy0tICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy0tIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCistLSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCistLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCistLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLS0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCistLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLS0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLS0gdW5kZXIgdGhlIExpY2Vuc2UuCiAKIAogcmVxdWlyZSgnVFNvY2tldCcpCityZXF1aXJlKCdUQnVmZmVyZWRUcmFuc3BvcnQnKQorcmVxdWlyZSgnVEZyYW1lZFRyYW5zcG9ydCcpCityZXF1aXJlKCdUSHR0cFRyYW5zcG9ydCcpCityZXF1aXJlKCdUQ29tcGFjdFByb3RvY29sJykKK3JlcXVpcmUoJ1RKc29uUHJvdG9jb2wnKQogcmVxdWlyZSgnVEJpbmFyeVByb3RvY29sJykKIHJlcXVpcmUoJ1RocmlmdFRlc3RfVGhyaWZ0VGVzdCcpCiByZXF1aXJlKCdsaWJsdWFsb25nbnVtYmVyJykKQEAgLTI1LDI3ICszMCw1OCBAQAogCiBmdW5jdGlvbiB0ZWFyZG93bigpCiAgIGlmIGNsaWVudCB0aGVuCi0gICAgLS0gU2h1dHMgZG93biB0aGUgc2VydmVyCi0gICAgY2xpZW50OnRlc3RWb2lkKCkKLQogICAgIC0tIGNsb3NlIHRoZSBjb25uZWN0aW9uCiAgICAgY2xpZW50OmNsb3NlKCkKICAgZW5kCiBlbmQKIAorZnVuY3Rpb24gcGFyc2VBcmdzKHJhd0FyZ3MpCisgIGxvY2FsIG9wdCA9IHsKKyAgICBwcm90b2NvbD0nYmluYXJ5JywKKyAgICB0cmFuc3BvcnQ9J2J1ZmZlcmVkJywKKyAgICBwb3J0PSc5MDkwJywKKyAgfQorICBmb3IgaSwgc3RyIGluIHBhaXJzKHJhd0FyZ3MpIGRvCisgICAgaWYgaSA+IDAgdGhlbgorICAgICAgaywgdiA9IHN0cmluZy5tYXRjaChzdHIsICctLSgldyspPSgldyspJykKKyAgICAgIGFzc2VydChvcHRba10gfj0gbmlsLCAnVW5rbm93biBhcmd1bWVudCcpCisgICAgICBvcHRba10gPSB2CisgICAgZW5kCisgIGVuZAorICByZXR1cm4gb3B0CitlbmQKKwogZnVuY3Rpb24gYXNzZXJ0RXF1YWwodmFsMSwgdmFsMiwgbXNnKQogICBhc3NlcnQodmFsMSA9PSB2YWwyLCBtc2cpCiBlbmQKIAotZnVuY3Rpb24gdGVzdEJhc2ljQ2xpZW50KCkKK2Z1bmN0aW9uIHRlc3RCYXNpY0NsaWVudChyYXdBcmdzKQorICBsb2NhbCBvcHQgPSBwYXJzZUFyZ3MocmF3QXJncykKICAgbG9jYWwgc29ja2V0ID0gVFNvY2tldDpuZXd7Ci0gICAgcG9ydCA9IDkwOTAKKyAgICBwb3J0ID0gdG9udW1iZXIob3B0LnBvcnQpCiAgIH0KICAgYXNzZXJ0KHNvY2tldCwgJ0ZhaWxlZCB0byBjcmVhdGUgY2xpZW50IHNvY2tldCcpCiAgIHNvY2tldDpzZXRUaW1lb3V0KDUwMDApCiAKLSAgbG9jYWwgcHJvdG9jb2wgPSBUQmluYXJ5UHJvdG9jb2w6bmV3ewotICAgIHRyYW5zID0gc29ja2V0CisgIGxvY2FsIHRyYW5zcG9ydHMgPSB7CisgICAgYnVmZmVyZWQgPSBUQnVmZmVyZWRUcmFuc3BvcnQsCisgICAgZnJhbWVkID0gVEZyYW1lZFRyYW5zcG9ydCwKKyAgICBodHRwID0gVEh0dHBUcmFuc3BvcnQsCisgIH0KKyAgYXNzZXJ0KHRyYW5zcG9ydHNbb3B0LnRyYW5zcG9ydF0gfj0gbmlsKQorICBsb2NhbCB0cmFuc3BvcnQgPSB0cmFuc3BvcnRzW29wdC50cmFuc3BvcnRdOm5ld3sKKyAgICB0cmFucyA9IHNvY2tldCwKKyAgICBpc1NlcnZlciA9IGZhbHNlCisgIH0KKworICBsb2NhbCBwcm90b2NvbHMgPSB7CisgICAgYmluYXJ5ID0gVEJpbmFyeVByb3RvY29sLAorICAgIGNvbXBhY3QgPSBUQ29tcGFjdFByb3RvY29sLAorICAgIGpzb24gPSBUSlNPTlByb3RvY29sLAorICB9CisgIGFzc2VydChwcm90b2NvbHNbb3B0LnByb3RvY29sXSB+PSBuaWwpCisgIGxvY2FsIHByb3RvY29sID0gcHJvdG9jb2xzW29wdC5wcm90b2NvbF06bmV3eworICAgIHRyYW5zID0gdHJhbnNwb3J0CiAgIH0KICAgYXNzZXJ0KHByb3RvY29sLCAnRmFpbGVkIHRvIGNyZWF0ZSBiaW5hcnkgcHJvdG9jb2wnKQogCkBAIC01NCwxNCArOTAsMTggQEAKICAgfQogICBhc3NlcnQoY2xpZW50LCAnRmFpbGVkIHRvIGNyZWF0ZSBjbGllbnQnKQogCi0gIC0tIE9wZW4gdGhlIHNvY2tldAotICBsb2NhbCBzdGF0dXMsIF8gPSBwY2FsbChzb2NrZXQub3Blbiwgc29ja2V0KQorICAtLSBPcGVuIHRoZSB0cmFuc3BvcnQKKyAgbG9jYWwgc3RhdHVzLCBfID0gcGNhbGwodHJhbnNwb3J0Lm9wZW4sIHRyYW5zcG9ydCkKICAgYXNzZXJ0KHN0YXR1cywgJ0ZhaWxlZCB0byBjb25uZWN0IHRvIHNlcnZlcicpCiAKICAgLS0gU3RyaW5nCiAgIGFzc2VydEVxdWFsKGNsaWVudDp0ZXN0U3RyaW5nKCdsYWxhJyksICAnbGFsYScsICAnRmFpbGVkIHRlc3RTdHJpbmcnKQogICBhc3NlcnRFcXVhbChjbGllbnQ6dGVzdFN0cmluZygnd2Fob28nKSwgJ3dhaG9vJywgJ0ZhaWxlZCB0ZXN0U3RyaW5nJykKIAorICAtLSBCb29sCisgIGFzc2VydEVxdWFsKGNsaWVudDp0ZXN0Qm9vbCh0cnVlKSwgdHJ1ZSwgJ0ZhaWxlZCB0ZXN0Qm9vbCB0cnVlJykKKyAgYXNzZXJ0RXF1YWwoY2xpZW50OnRlc3RCb29sKGZhbHNlKSwgZmFsc2UsICdGYWlsZWQgdGVzdEJvb2wgZmFsc2UnKQorCiAgIC0tIEJ5dGUKICAgYXNzZXJ0RXF1YWwoY2xpZW50OnRlc3RCeXRlKDB4MDEpLCAxLCAgICAnRmFpbGVkIHRlc3RCeXRlIDEnKQogICBhc3NlcnRFcXVhbChjbGllbnQ6dGVzdEJ5dGUoMHg0MCksIDY0LCAgICdGYWlsZWQgdGVzdEJ5dGUgMicpCkBAIC0xMTIsMjUgKzE1MiwyOCBAQAogICBhc3NlcnRFcXVhbCgKICAgICAgIGNsaWVudDp0ZXN0RG91YmxlKDAuMTIzNDU2Nzg5KSwgMC4xMjM0NTY3ODksICdGYWlsZWQgdGVzdERvdWJsZSAzJykKIAorICAtLSBUT0RPIHRlc3RCaW5hcnkoKSAuLi4KKwkgIAogICAtLSBBY2N1cmFjeSBvZiAxNiBkZWNpbWFsIGRpZ2l0cyAocm91bmRzKQogICBsb2NhbCBhLCBiID0gMS4xMjM0NTY3ODkwNjY2NjY2MywgMS4xMjM0NTY3ODkwNjY2NjY2MQogICBhc3NlcnRFcXVhbChhLCBiKQogICBhc3NlcnRFcXVhbChjbGllbnQ6dGVzdERvdWJsZShhKSwgYiwgJ0ZhaWxlZCB0ZXN0RG91YmxlIDUnKQogCiAgIC0tIFN0cnVjdAotICBsb2NhbCBhID0geworICBsb2NhbCBvID0gWHRydWN0Om5ld3sKICAgICBzdHJpbmdfdGhpbmcgPSAnWmVybycsCiAgICAgYnl0ZV90aGluZyA9IDEsCiAgICAgaTMyX3RoaW5nID0gLTMsCiAgICAgaTY0X3RoaW5nID0gbG9uZygtNSkKICAgfQorICBsb2NhbCByID0gY2xpZW50OnRlc3RTdHJ1Y3QobykKKyAgYXNzZXJ0RXF1YWwoby5zdHJpbmdfdGhpbmcsIHIuc3RyaW5nX3RoaW5nLCAnRmFpbGVkIHRlc3RTdHJ1Y3QgMScpCisgIGFzc2VydEVxdWFsKG8uYnl0ZV90aGluZywgci5ieXRlX3RoaW5nLCAnRmFpbGVkIHRlc3RTdHJ1Y3QgMicpCisgIGFzc2VydEVxdWFsKG8uaTMyX3RoaW5nLCByLmkzMl90aGluZywgJ0ZhaWxlZCB0ZXN0U3RydWN0IDMnKQorICBhc3NlcnRFcXVhbChvLmk2NF90aGluZywgci5pNjRfdGhpbmcsICdGYWlsZWQgdGVzdFN0cnVjdCA0JykKIAotICAtLSBUT0RPIGZpeCBjbGllbnQgc3RydWN0IGVxdWFsaXR5Ci0gIC0tYXNzZXJ0RXF1YWwoY2xpZW50OnRlc3RTdHJ1Y3QoYSksIGEsICdGYWlsZWQgdGVzdFN0cnVjdCcpCi0KLSAgLS0gQ2FsbCB0aGUgdm9pZCBmdW5jdGlvbiBhbmQgZW5kIHRoZSB0ZXN0IChoYW5kbGVyIHN0b3BzIHNlcnZlcikKLSAgY2xpZW50OnRlc3RWb2lkKCkKKyAgLS0gVE9ETyBhZGQgbGlzdCBtYXAgc2V0IGV4Y2VwdGlvbiBldGMgZXRjCiBlbmQKIAotdGVzdEJhc2ljQ2xpZW50KCkKLXRlYXJkb3duKCkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit0ZXN0QmFzaWNDbGllbnQoYXJnKQordGVhcmRvd24oKQpkaWZmIC0tZ2l0IGEvdGVzdC9sdWEvdGVzdF9iYXNpY19zZXJ2ZXIubHVhIGIvdGVzdC9sdWEvdGVzdF9iYXNpY19zZXJ2ZXIubHVhCmluZGV4IDdjMTc1ZGEuLmFjZDJkNzkgMTAwNjQ0Ci0tLSBhL3Rlc3QvbHVhL3Rlc3RfYmFzaWNfc2VydmVyLmx1YQorKysgYi90ZXN0L2x1YS90ZXN0X2Jhc2ljX3NlcnZlci5sdWEKQEAgLTEsMjMgKzEsMjcgQEAKLS0tIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0tLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotLS0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLS0tIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0tLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotLS0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLS0tIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotLS0gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0tLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotLS0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLS0tICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0tLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotLS0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLS0tIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCistLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLS0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy0tIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLS0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLS0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLS0gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKy0tICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKy0tIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy0tIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCistLSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy0tIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCistLSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCistLSB1bmRlciB0aGUgTGljZW5zZS4KIAogcmVxdWlyZSgnVGhyaWZ0VGVzdF9UaHJpZnRUZXN0JykKIHJlcXVpcmUoJ1RTb2NrZXQnKQorcmVxdWlyZSgnVEJ1ZmZlcmVkVHJhbnNwb3J0JykKIHJlcXVpcmUoJ1RGcmFtZWRUcmFuc3BvcnQnKQorcmVxdWlyZSgnVEh0dHBUcmFuc3BvcnQnKQorcmVxdWlyZSgnVENvbXBhY3RQcm90b2NvbCcpCityZXF1aXJlKCdUSnNvblByb3RvY29sJykKIHJlcXVpcmUoJ1RCaW5hcnlQcm90b2NvbCcpCiByZXF1aXJlKCdUU2VydmVyJykKIHJlcXVpcmUoJ2xpYmx1YWxvbmdudW1iZXInKQpAQCAtMjgsMTMgKzMyLDE2IEBACiAKIC0tIFN0b3BzIHRoZSBzZXJ2ZXIKIGZ1bmN0aW9uIFRlc3RIYW5kbGVyOnRlc3RWb2lkKCkKLSAgc2VsZi5fX3NlcnZlcjpzdG9wKCkKIGVuZAogCiBmdW5jdGlvbiBUZXN0SGFuZGxlcjp0ZXN0U3RyaW5nKHN0cikKICAgcmV0dXJuIHN0cgogZW5kCiAKK2Z1bmN0aW9uIFRlc3RIYW5kbGVyOnRlc3RCb29sKGJvb2wpCisgIHJldHVybiBib29sCitlbmQKKwogZnVuY3Rpb24gVGVzdEhhbmRsZXI6dGVzdEJ5dGUoYnl0ZSkKICAgcmV0dXJuIGJ5dGUKIGVuZApAQCAtNTEsNiArNTgsMTAgQEAKICAgcmV0dXJuIGQKIGVuZAogCitmdW5jdGlvbiBUZXN0SGFuZGxlcjp0ZXN0QmluYXJ5KGJ5KQorICByZXR1cm4gYnkKK2VuZAorCiBmdW5jdGlvbiBUZXN0SGFuZGxlcjp0ZXN0U3RydWN0KHRoaW5nKQogICByZXR1cm4gdGhpbmcKIGVuZApAQCAtNjUsNyArNzYsMjQgQEAKICAgZW5kCiBlbmQKIAotZnVuY3Rpb24gdGVzdEJhc2ljU2VydmVyKCkKK2Z1bmN0aW9uIHBhcnNlQXJncyhyYXdBcmdzKQorICBsb2NhbCBvcHQgPSB7CisgICAgcHJvdG9jb2w9J2JpbmFyeScsCisgICAgdHJhbnNwb3J0PSdidWZmZXJlZCcsCisgICAgcG9ydD0nOTA5MCcsCisgIH0KKyAgZm9yIGksIHN0ciBpbiBwYWlycyhyYXdBcmdzKSBkbworICAgIGlmIGkgPiAwIHRoZW4KKyAgICAgIGssIHYgPSBzdHJpbmcubWF0Y2goc3RyLCAnLS0oJXcrKT0oJXcrKScpCisgICAgICBhc3NlcnQob3B0W2tdIH49IG5pbCwgJ1Vua25vd24gYXJndW1lbnQnKQorICAgICAgb3B0W2tdID0gdgorICAgIGVuZAorICBlbmQKKyAgcmV0dXJuIG9wdAorZW5kCisKK2Z1bmN0aW9uIHRlc3RCYXNpY1NlcnZlcihyYXdBcmdzKQorICBsb2NhbCBvcHQgPSBwYXJzZUFyZ3MocmF3QXJncykKICAgLS0gSGFuZGxlciAmIFByb2Nlc3NvcgogICBsb2NhbCBoYW5kbGVyID0gVGVzdEhhbmRsZXI6bmV3e30KICAgYXNzZXJ0KGhhbmRsZXIsICdGYWlsZWQgdG8gY3JlYXRlIGhhbmRsZXInKQpAQCAtNzYsMTQgKzEwNCwyNCBAQAogCiAgIC0tIFNlcnZlciBTb2NrZXQKICAgbG9jYWwgc29ja2V0ID0gVFNlcnZlclNvY2tldDpuZXd7Ci0gICAgcG9ydCA9IDkwOTAKKyAgICBwb3J0ID0gb3B0LnBvcnQKICAgfQogICBhc3NlcnQoc29ja2V0LCAnRmFpbGVkIHRvIGNyZWF0ZSBzZXJ2ZXIgc29ja2V0JykKIAogICAtLSBUcmFuc3BvcnQgJiBGYWN0b3J5Ci0gIGxvY2FsIHRyYW5zX2ZhY3RvcnkgPSBURnJhbWVkVHJhbnNwb3J0RmFjdG9yeTpuZXd7fQotICBhc3NlcnQodHJhbnNfZmFjdG9yeSwgJ0ZhaWxlZCB0byBjcmVhdGUgZnJhbWVkIHRyYW5zcG9ydCBmYWN0b3J5JykKLSAgbG9jYWwgcHJvdF9mYWN0b3J5ID0gVEJpbmFyeVByb3RvY29sRmFjdG9yeTpuZXd7fQorICBsb2NhbCB0cmFuc3BvcnRzID0geworICAgIGJ1ZmZlcmVkID0gVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSwKKyAgICBmcmFtZWQgPSBURnJhbWVkVHJhbnNwb3J0RmFjdG9yeSwKKyAgICBodHRwID0gVEh0dHBUcmFuc3BvcnRGYWN0b3J5LAorICB9CisgIGFzc2VydCh0cmFuc3BvcnRzW29wdC50cmFuc3BvcnRdLCAnRmFpbGVkIHRvIGNyZWF0ZSBmcmFtZWQgdHJhbnNwb3J0IGZhY3RvcnknKQorICBsb2NhbCB0cmFuc19mYWN0b3J5ID0gdHJhbnNwb3J0c1tvcHQudHJhbnNwb3J0XTpuZXd7fQorICBsb2NhbCBwcm90b2NvbHMgPSB7CisgICAgYmluYXJ5ID0gVEJpbmFyeVByb3RvY29sRmFjdG9yeSwKKyAgICBjb21wYWN0ID0gVENvbXBhY3RQcm90b2NvbEZhY3RvcnksCisgICAganNvbiA9IFRKU09OUHJvdG9jb2xGYWN0b3J5LAorICB9CisgIGxvY2FsIHByb3RfZmFjdG9yeSA9IHByb3RvY29sc1tvcHQucHJvdG9jb2xdOm5ld3t9CiAgIGFzc2VydChwcm90X2ZhY3RvcnksICdGYWlsZWQgdG8gY3JlYXRlIGJpbmFyeSBwcm90b2NvbCBmYWN0b3J5JykKIAogICAtLSBTaW1wbGUgU2VydmVyCkBAIC0xMDAsNSArMTM4LDUgQEAKICAgc2VydmVyID0gbmlsCiBlbmQKIAotdGVzdEJhc2ljU2VydmVyKCkKLXRlYXJkb3duKCkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit0ZXN0QmFzaWNTZXJ2ZXIoYXJnKQordGVhcmRvd24oKQpkaWZmIC0tZ2l0IGEvdGVzdC9uZXRjb3JlL0NsaWVudC8uZ2l0aWdub3JlIGIvdGVzdC9uZXRjb3JlL0NsaWVudC8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3ZDU1MTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L25ldGNvcmUvQ2xpZW50Ly5naXRpZ25vcmUKQEAgLTAsMCArMSwyIEBACisjIGlnbm9yZSBmb3IgYXV0b2dlbmVyYXRlZCBmaWxlcworL1RocmlmdFRlc3QKZGlmZiAtLWdpdCBhL3Rlc3QvbmV0Y29yZS9DbGllbnQvQ2xpZW50LmNzcHJvaiBiL3Rlc3QvbmV0Y29yZS9DbGllbnQvQ2xpZW50LmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTZhZjM5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9uZXRjb3JlL0NsaWVudC9DbGllbnQuY3Nwcm9qCkBAIC0wLDAgKzEsMzEgQEAKKzxQcm9qZWN0IFNkaz0iTWljcm9zb2Z0Lk5FVC5TZGsiPgorICA8UHJvcGVydHlHcm91cD4KKyAgICA8VGFyZ2V0RnJhbWV3b3JrPm5ldGNvcmVhcHAyLjA8L1RhcmdldEZyYW1ld29yaz4KKyAgICA8QXNzZW1ibHlOYW1lPkNsaWVudDwvQXNzZW1ibHlOYW1lPgorICAgIDxQYWNrYWdlSWQ+Q2xpZW50PC9QYWNrYWdlSWQ+CisgICAgPE91dHB1dFR5cGU+RXhlPC9PdXRwdXRUeXBlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5VGl0bGVBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlUaXRsZUF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseURlc2NyaXB0aW9uQXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5RGVzY3JpcHRpb25BdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlDb25maWd1cmF0aW9uQXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5Q29uZmlndXJhdGlvbkF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseUNvbXBhbnlBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlDb21wYW55QXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5UHJvZHVjdEF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseVByb2R1Y3RBdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlDb3B5cmlnaHRBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlDb3B5cmlnaHRBdHRyaWJ1dGU+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uTmV0Lkh0dHAuV2luSHR0cEhhbmRsZXIiIFZlcnNpb249Ils0LjQsKSIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLlByaW1pdGl2ZXMiIFZlcnNpb249Ils0LjMsKSIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uU2VydmljZU1vZGVsLlByaW1pdGl2ZXMiIFZlcnNpb249Ils0LjQsKSIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uVGhyZWFkaW5nIiBWZXJzaW9uPSJbNC4zLCkiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXC4uXGxpYlxuZXRjb3JlXFRocmlmdFxUaHJpZnQuY3Nwcm9qIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPFRhcmdldCBOYW1lPSJQcmVCdWlsZCIgQmVmb3JlVGFyZ2V0cz0iX0dlbmVyYXRlUmVzdG9yZVByb2plY3RTcGVjO1Jlc3RvcmU7Q29tcGlsZSI+CisgICAgPEV4ZWMgQ29uZGl0aW9uPSInJChPUyknID09ICdXaW5kb3dzX05UJyIgQ29tbWFuZD0id2hlcmUgdGhyaWZ0IiBDb25zb2xlVG9NU0J1aWxkPSJ0cnVlIj4KKyAgICAgIDxPdXRwdXQgVGFza1BhcmFtZXRlcj0iQ29uc29sZU91dHB1dCIgUHJvcGVydHlOYW1lPSJQYXRoVG9UaHJpZnQiIC8+CisgICAgPC9FeGVjPgorICAgIDxFeGVjIENvbmRpdGlvbj0iRXhpc3RzKCckKFBhdGhUb1RocmlmdCknKSIgQ29tbWFuZD0iJnF1b3Q7JChQYXRoVG9UaHJpZnQpJnF1b3Q7IC1vdXQgJChQcm9qZWN0RGlyKSAtZ2VuIG5ldGNvcmU6d2NmLHVuaW9uLHNlcmlhbCxoYXNoY29kZSAtciAuLy4uLy4uL1RocmlmdFRlc3QudGhyaWZ0IiAvPgorICAgIDxFeGVjIENvbmRpdGlvbj0iRXhpc3RzKCd0aHJpZnQnKSIgQ29tbWFuZD0idGhyaWZ0IC1vdXQgJChQcm9qZWN0RGlyKSAtZ2VuIG5ldGNvcmU6d2NmLHVuaW9uLHNlcmlhbCxoYXNoY29kZSAtciAuLy4uLy4uL1RocmlmdFRlc3QudGhyaWZ0IiAvPgorICAgIDxFeGVjIENvbmRpdGlvbj0iRXhpc3RzKCckKFByb2plY3REaXIpLy4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQnKSIgQ29tbWFuZD0iJChQcm9qZWN0RGlyKS8uLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1vdXQgJChQcm9qZWN0RGlyKSAtZ2VuIG5ldGNvcmU6d2NmLHVuaW9uLHNlcmlhbCxoYXNoY29kZSAtciAuLy4uLy4uL1RocmlmdFRlc3QudGhyaWZ0IiAvPgorICA8L1RhcmdldD4KKzwvUHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3QvbmV0Y29yZS9DbGllbnQvUHJvZ3JhbS5jcyBiL3Rlc3QvbmV0Y29yZS9DbGllbnQvUHJvZ3JhbS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjEzOWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9uZXRjb3JlL0NsaWVudC9Qcm9ncmFtLmNzCkBAIC0wLDAgKzEsNzIgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFRocmlmdFRlc3Q7CisKK25hbWVzcGFjZSBDbGllbnQKK3sKKyAgICBwdWJsaWMgY2xhc3MgUHJvZ3JhbQorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgTWFpbihzdHJpbmdbXSBhcmdzKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLlNldEJ1ZmZlclNpemUoQ29uc29sZS5CdWZmZXJXaWR0aCwgNDA5Nik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJGYWlsZWQgdG8gZ3JvdyBzY3JvbGwtYmFjayBidWZmZXIiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gc3BsaXQgbW9kZSBhbmQgb3B0aW9ucworICAgICAgICAgICAgdmFyIHN1YkFyZ3MgPSBuZXcgTGlzdDxzdHJpbmc+KGFyZ3MpOworICAgICAgICAgICAgdmFyIGZpcnN0QXJnID0gc3RyaW5nLkVtcHR5OworICAgICAgICAgICAgaWYgKHN1YkFyZ3MuQ291bnQgPiAwKQorICAgICAgICAgICAgeyAKKyAgICAgICAgICAgICAgICBmaXJzdEFyZyA9IHN1YkFyZ3NbMF07CisgICAgICAgICAgICAgICAgc3ViQXJncy5SZW1vdmVBdCgwKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gcnVuIHdoYXRldmVyIG1vZGUgaXMgY2hvb3NlbgorICAgICAgICAgICAgc3dpdGNoKGZpcnN0QXJnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgImNsaWVudCI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUZXN0Q2xpZW50LkV4ZWN1dGUoc3ViQXJncyk7CisgICAgICAgICAgICAgICAgY2FzZSAiLS1oZWxwIjoKKyAgICAgICAgICAgICAgICAgICAgUHJpbnRIZWxwKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIFByaW50SGVscCgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIFByaW50SGVscCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJVc2FnZToiKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgIENsaWVudCAgY2xpZW50ICBbb3B0aW9uc10nIik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiICBDbGllbnQgIC0taGVscCIpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiIpOworCisgICAgICAgICAgICBUZXN0Q2xpZW50LlByaW50T3B0aW9uc0hlbHAoKTsKKyAgICAgICAgfQorICAgIH0KK30KKworCmRpZmYgLS1naXQgYS90ZXN0L25ldGNvcmUvQ2xpZW50L1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzIGIvdGVzdC9uZXRjb3JlL0NsaWVudC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTcxNTJiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9uZXRjb3JlL0NsaWVudC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpAQCAtMCwwICsxLDQzIEBACivvu78vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KK3VzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuQ29tcGlsZXJTZXJ2aWNlczsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsKKworLy8gR2VuZXJhbCBJbmZvcm1hdGlvbiBhYm91dCBhbiBhc3NlbWJseSBpcyBjb250cm9sbGVkIHRocm91Z2ggdGhlIGZvbGxvd2luZworLy8gc2V0IG9mIGF0dHJpYnV0ZXMuIENoYW5nZSB0aGVzZSBhdHRyaWJ1dGUgdmFsdWVzIHRvIG1vZGlmeSB0aGUgaW5mb3JtYXRpb24KKy8vIGFzc29jaWF0ZWQgd2l0aCBhbiBhc3NlbWJseS4KKworW2Fzc2VtYmx5OiBBc3NlbWJseVRpdGxlKCJDbGllbnQiKV0KK1thc3NlbWJseTogQXNzZW1ibHlEZXNjcmlwdGlvbigiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29uZmlndXJhdGlvbigiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29tcGFueSgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCitbYXNzZW1ibHk6IEFzc2VtYmx5UHJvZHVjdCgiVGhyaWZ0IildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29weXJpZ2h0KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlUcmFkZW1hcmsoIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUN1bHR1cmUoIiIpXQorCisvLyBTZXR0aW5nIENvbVZpc2libGUgdG8gZmFsc2UgbWFrZXMgdGhlIHR5cGVzIGluIHRoaXMgYXNzZW1ibHkgbm90IHZpc2libGUKKy8vIHRvIENPTSBjb21wb25lbnRzLiAgSWYgeW91IG5lZWQgdG8gYWNjZXNzIGEgdHlwZSBpbiB0aGlzIGFzc2VtYmx5IGZyb20KKy8vIENPTSwgc2V0IHRoZSBDb21WaXNpYmxlIGF0dHJpYnV0ZSB0byB0cnVlIG9uIHRoYXQgdHlwZS4KKworW2Fzc2VtYmx5OiBDb21WaXNpYmxlKGZhbHNlKV0KKworLy8gVGhlIGZvbGxvd2luZyBHVUlEIGlzIGZvciB0aGUgSUQgb2YgdGhlIHR5cGVsaWIgaWYgdGhpcyBwcm9qZWN0IGlzIGV4cG9zZWQgdG8gQ09NCisKK1thc3NlbWJseTogR3VpZCgiQjBDMTNEQTAtMzExNy00ODQ0LThBRTgtQjE3NzVFNDYyMjNEIildCisKZGlmZiAtLWdpdCBhL3Rlc3QvbmV0Y29yZS9DbGllbnQvVGVzdENsaWVudC5jcyBiL3Rlc3QvbmV0Y29yZS9DbGllbnQvVGVzdENsaWVudC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmUxOThjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9uZXRjb3JlL0NsaWVudC9UZXN0Q2xpZW50LmNzCkBAIC0wLDAgKzEsOTQzIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uRGlhZ25vc3RpY3M7Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5OZXQ7Cit1c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsKK3VzaW5nIFN5c3RlbS5TZWN1cml0eS5BdXRoZW50aWNhdGlvbjsKK3VzaW5nIFN5c3RlbS5TZWN1cml0eS5DcnlwdG9ncmFwaHkuWDUwOUNlcnRpZmljYXRlczsKK3VzaW5nIFN5c3RlbS5TZXJ2aWNlTW9kZWw7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwordXNpbmcgVGhyaWZ0LkNvbGxlY3Rpb25zOwordXNpbmcgVGhyaWZ0LlByb3RvY29sczsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnRzOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydHMuQ2xpZW50OworCituYW1lc3BhY2UgVGhyaWZ0VGVzdAoreworICAgIHB1YmxpYyBjbGFzcyBUZXN0Q2xpZW50CisgICAgeworICAgICAgICBwcml2YXRlIGNsYXNzIFRlc3RQYXJhbXMKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIGludCBudW1JdGVyYXRpb25zID0gMTsKKyAgICAgICAgICAgIHB1YmxpYyBJUEFkZHJlc3MgaG9zdCA9IElQQWRkcmVzcy5Bbnk7CisgICAgICAgICAgICBwdWJsaWMgaW50IHBvcnQgPSA5MDkwOworICAgICAgICAgICAgcHVibGljIGludCBudW1UaHJlYWRzID0gMTsKKyAgICAgICAgICAgIHB1YmxpYyBzdHJpbmcgdXJsOworICAgICAgICAgICAgcHVibGljIHN0cmluZyBwaXBlOworICAgICAgICAgICAgcHVibGljIGJvb2wgYnVmZmVyZWQ7CisgICAgICAgICAgICBwdWJsaWMgYm9vbCBmcmFtZWQ7CisgICAgICAgICAgICBwdWJsaWMgc3RyaW5nIHByb3RvY29sOworICAgICAgICAgICAgcHVibGljIGJvb2wgZW5jcnlwdGVkID0gZmFsc2U7CisKKyAgICAgICAgICAgIGludGVybmFsIHZvaWQgUGFyc2UoIExpc3Q8c3RyaW5nPiBhcmdzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJncy5Db3VudDsgKytpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ3NbaV0gPT0gIi11IikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdXJsID0gYXJnc1srK2ldOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi1uIikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbnVtSXRlcmF0aW9ucyA9IENvbnZlcnQuVG9JbnQzMihhcmdzWysraV0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0uU3RhcnRzV2l0aCgiLS1waXBlPSIpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwaXBlID0gYXJnc1tpXS5TdWJzdHJpbmcoYXJnc1tpXS5JbmRleE9mKCI9IikgKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJVc2luZyBuYW1lZCBwaXBlcyB0cmFuc3BvcnQiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldLlN0YXJ0c1dpdGgoIi0taG9zdD0iKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgdGhlcmUgZm9yIGlwYWRkcmVzcworICAgICAgICAgICAgICAgICAgICAgICAgaG9zdCA9IG5ldyBJUEFkZHJlc3MoRW5jb2RpbmcuVW5pY29kZS5HZXRCeXRlcyhhcmdzW2ldLlN1YnN0cmluZyhhcmdzW2ldLkluZGV4T2YoIj0iKSArIDEpKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXS5TdGFydHNXaXRoKCItLXBvcnQ9IikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQgPSBpbnQuUGFyc2UoYXJnc1tpXS5TdWJzdHJpbmcoYXJnc1tpXS5JbmRleE9mKCI9IikgKyAxKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLWIiIHx8IGFyZ3NbaV0gPT0gIi0tYnVmZmVyZWQiIHx8IGFyZ3NbaV0gPT0gIi0tdHJhbnNwb3J0PWJ1ZmZlcmVkIikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlVzaW5nIGJ1ZmZlcmVkIHNvY2tldHMiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItZiIgfHwgYXJnc1tpXSA9PSAiLS1mcmFtZWQiIHx8IGFyZ3NbaV0gPT0gIi0tdHJhbnNwb3J0PWZyYW1lZCIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiVXNpbmcgZnJhbWVkIHRyYW5zcG9ydCIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi10IikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbnVtVGhyZWFkcyA9IENvbnZlcnQuVG9JbnQzMihhcmdzWysraV0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi0tYmluYXJ5IiB8fCBhcmdzW2ldID09ICItLXByb3RvY29sPWJpbmFyeSIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sID0gImJpbmFyeSI7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiVXNpbmcgYmluYXJ5IHByb3RvY29sIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLS1jb21wYWN0IiB8fCBhcmdzW2ldID09ICItLXByb3RvY29sPWNvbXBhY3QiKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbCA9ICJjb21wYWN0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJVc2luZyBjb21wYWN0IHByb3RvY29sIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLS1qc29uIiB8fCBhcmdzW2ldID09ICItLXByb3RvY29sPWpzb24iKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbCA9ICJqc29uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJVc2luZyBKU09OIHByb3RvY29sIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLS1zc2wiKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBlbmNyeXB0ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlVzaW5nIGVuY3J5cHRlZCB0cmFuc3BvcnQiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKGFyZ3NbaV0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBYNTA5Q2VydGlmaWNhdGUyIEdldENsaWVudENlcnQoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBjbGllbnRDZXJ0TmFtZSA9ICJjbGllbnQucDEyIjsKKyAgICAgICAgICAgICAgICB2YXIgcG9zc2libGVQYXRocyA9IG5ldyBMaXN0PHN0cmluZz4KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICIuLi8uLi8uLi9rZXlzLyIsCisgICAgICAgICAgICAgICAgICAgICIuLi8uLi9rZXlzLyIsCisgICAgICAgICAgICAgICAgICAgICIuLi9rZXlzLyIsCisgICAgICAgICAgICAgICAgICAgICJrZXlzLyIsCisgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgIHN0cmluZyBleGlzdGluZ1BhdGggPSBudWxsOworICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBwb3NzaWJsZVBhdGggaW4gcG9zc2libGVQYXRocykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBwYXRoID0gUGF0aC5HZXRGdWxsUGF0aChwb3NzaWJsZVBhdGggKyBjbGllbnRDZXJ0TmFtZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChGaWxlLkV4aXN0cyhwYXRoKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdQYXRoID0gcGF0aDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KGV4aXN0aW5nUGF0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCQiQ2Fubm90IGZpbmQgZmlsZToge2NsaWVudENlcnROYW1lfSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHZhciBjZXJ0ID0gbmV3IFg1MDlDZXJ0aWZpY2F0ZTIoZXhpc3RpbmdQYXRoLCAidGhyaWZ0Iik7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gY2VydDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgcHVibGljIFRDbGllbnRUcmFuc3BvcnQgQ3JlYXRlVHJhbnNwb3J0KCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodXJsID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBlbmRwb2ludCB0cmFuc3BvcnQKKyAgICAgICAgICAgICAgICAgICAgVENsaWVudFRyYW5zcG9ydCB0cmFucyA9IG51bGw7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBpcGUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSBuZXcgVE5hbWVkUGlwZUNsaWVudFRyYW5zcG9ydChwaXBlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbmNyeXB0ZWQpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2VydCA9IEdldENsaWVudENlcnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjZXJ0ID09IG51bGwgfHwgIWNlcnQuSGFzUHJpdmF0ZUtleSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJDZXJ0aWZpY2F0ZSBkb2Vzbid0IGNvbnRhaW4gcHJpdmF0ZSBrZXkiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSBuZXcgVFRsc1NvY2tldENsaWVudFRyYW5zcG9ydChob3N0LCBwb3J0LCAwLCBjZXJ0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbmRlciwgY2VydGlmaWNhdGUsIGNoYWluLCBlcnJvcnMpID0+IHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIFNzbFByb3RvY29scy5UbHMgfCBTc2xQcm90b2NvbHMuVGxzMTEgfCBTc2xQcm90b2NvbHMuVGxzMTIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zID0gbmV3IFRTb2NrZXRDbGllbnRUcmFuc3BvcnQoaG9zdCwgcG9ydCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBsYXllcmVkIHRyYW5zcG9ydAorICAgICAgICAgICAgICAgICAgICBpZiAoYnVmZmVyZWQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zID0gbmV3IFRCdWZmZXJlZENsaWVudFRyYW5zcG9ydCh0cmFucyk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoZnJhbWVkKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cmFucyA9IG5ldyBURnJhbWVkQ2xpZW50VHJhbnNwb3J0KHRyYW5zKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cmFuczsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRIdHRwQ2xpZW50VHJhbnNwb3J0KG5ldyBVcmkodXJsKSwgbnVsbCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBUUHJvdG9jb2wgQ3JlYXRlUHJvdG9jb2woVENsaWVudFRyYW5zcG9ydCB0cmFuc3BvcnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHByb3RvY29sID09ICJjb21wYWN0IikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVENvbXBhY3RQcm90b2NvbCh0cmFuc3BvcnQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChwcm90b2NvbCA9PSAianNvbiIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRKc29uUHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgICAgICBwcml2YXRlIGNvbnN0IGludCBFcnJvckJhc2VUeXBlcyA9IDE7CisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IEVycm9yU3RydWN0cyA9IDI7CisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IEVycm9yQ29udGFpbmVycyA9IDQ7CisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IEVycm9yRXhjZXB0aW9ucyA9IDg7CisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IEVycm9yVW5rbm93biA9IDY0OworCisgICAgICAgIHByaXZhdGUgY2xhc3MgQ2xpZW50VGVzdAorICAgICAgICB7CisgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFRDbGllbnRUcmFuc3BvcnQgdHJhbnNwb3J0OworICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBUaHJpZnRUZXN0LkNsaWVudCBjbGllbnQ7CisgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGludCBudW1JdGVyYXRpb25zOworICAgICAgICAgICAgcHJpdmF0ZSBib29sIGRvbmU7CisKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgUmV0dXJuQ29kZSB7IGdldDsgc2V0OyB9CisKKyAgICAgICAgICAgIHB1YmxpYyBDbGllbnRUZXN0KFRlc3RQYXJhbXMgcGFyYW0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJhbnNwb3J0ID0gcGFyYW0uQ3JlYXRlVHJhbnNwb3J0KCk7CisgICAgICAgICAgICAgICAgY2xpZW50ID0gbmV3IFRocmlmdFRlc3QuQ2xpZW50KHBhcmFtLkNyZWF0ZVByb3RvY29sKHRyYW5zcG9ydCkpOworICAgICAgICAgICAgICAgIG51bUl0ZXJhdGlvbnMgPSBwYXJhbS5udW1JdGVyYXRpb25zOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBFeGVjdXRlKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgdG9rZW4gPSBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lOworCisgICAgICAgICAgICAgICAgaWYgKGRvbmUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiRXhlY3V0ZSBjYWxsZWQgbW9yZSB0aGFuIG9uY2UiKTsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bUl0ZXJhdGlvbnM7IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRyYW5zcG9ydC5Jc09wZW4pCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0Lk9wZW5Bc3luYyh0b2tlbikuR2V0QXdhaXRlcigpLkdldFJlc3VsdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJDb25uZWN0IGZhaWxlZDogIiArIGV4Lk1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuQ29kZSB8PSBFcnJvclVua25vd247CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShleC5NZXNzYWdlICsgIiBTVDogIiArIGV4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiQ29ubmVjdCBmYWlsZWQ6ICIgKyBleC5NZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFJldHVybkNvZGUgfD0gRXJyb3JVbmtub3duOworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZXguTWVzc2FnZSArICIgU1Q6ICIgKyBleC5TdGFja1RyYWNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFJldHVybkNvZGUgfD0gRXhlY3V0ZUNsaWVudFRlc3RBc3luYyhjbGllbnQpLkdldEF3YWl0ZXIoKS5HZXRSZXN1bHQoKTsgOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZXguTWVzc2FnZSArICIgU1Q6ICIgKyBleC5TdGFja1RyYWNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFJldHVybkNvZGUgfD0gRXJyb3JVbmtub3duOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0LkNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiRXJyb3Igd2hpbGUgY2xvc2luZyB0cmFuc3BvcnQiKTsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZXguTWVzc2FnZSArICIgU1Q6ICIgKyBleC5TdGFja1RyYWNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZG9uZSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpbnRlcm5hbCBzdGF0aWMgdm9pZCBQcmludE9wdGlvbnNIZWxwKCkKKyAgICAgICAgeworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkNsaWVudCBvcHRpb25zOiIpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiAgLXUgPFVSTD4iKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgIC10IDwjIG9mIHRocmVhZHMgdG8gcnVuPiAgICAgICAgZGVmYXVsdCA9IDEiKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgIC1uIDwjIG9mIGl0ZXJhdGlvbnM+ICAgICAgICAgICAgcGVyIHRocmVhZCIpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiAgLS1waXBlPTxwaXBlIG5hbWU+Iik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiICAtLWhvc3Q9PElQIGFkZHJlc3M+Iik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiICAtLXBvcnQ9PHBvcnQgbnVtYmVyPiIpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiAgLS10cmFuc3BvcnQ9PHRyYW5zcG9ydCBuYW1lPiAgICBvbmUgb2YgYnVmZmVyZWQsZnJhbWVkICAoZGVmYXVsdHMgdG8gbm9uZSkiKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgIC0tcHJvdG9jb2w9PHByb3RvY29sIG5hbWU+ICAgICAgb25lIG9mIGNvbXBhY3QsanNvbiAgKGRlZmF1bHRzIHRvIGJpbmFyeSkiKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgIC0tc3NsIik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgRXhlY3V0ZShMaXN0PHN0cmluZz4gYXJncykKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHBhcmFtID0gbmV3IFRlc3RQYXJhbXMoKTsKKworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW0uUGFyc2UoYXJncyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkVycm9yIHdoaWxlICBwYXJzaW5nIGFyZ3VtZW50cyIpOworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShleC5NZXNzYWdlICsgIiBTVDogIiArIGV4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRXJyb3JVbmtub3duOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHZhciB0ZXN0cyA9IEVudW1lcmFibGUuUmFuZ2UoMCwgcGFyYW0ubnVtVGhyZWFkcykuU2VsZWN0KF8gPT4gbmV3IENsaWVudFRlc3QocGFyYW0pKS5Ub0FycmF5KCk7CisKKyAgICAgICAgICAgICAgICAvL2lzc3VlIHRlc3RzIG9uIHNlcGFyYXRlIHRocmVhZHMgc2ltdWx0YW5lb3VzbHkKKyAgICAgICAgICAgICAgICB2YXIgdGhyZWFkcyA9IHRlc3RzLlNlbGVjdCh0ZXN0ID0+IG5ldyBUYXNrKHRlc3QuRXhlY3V0ZSkpLlRvQXJyYXkoKTsKKyAgICAgICAgICAgICAgICB2YXIgc3RhcnQgPSBEYXRlVGltZS5Ob3c7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIHQgaW4gdGhyZWFkcykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHQuU3RhcnQoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBUYXNrLldhaXRBbGwodGhyZWFkcyk7CisKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiVG90YWwgdGltZTogIiArIChEYXRlVGltZS5Ob3cgLSBzdGFydCkpOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRlc3RzLlNlbGVjdCh0ID0+IHQuUmV0dXJuQ29kZSkuQWdncmVnYXRlKChyMSwgcjIpID0+IHIxIHwgcjIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBvdXRlckV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJVbmV4cGVjdGVkIGVycm9yIik7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUob3V0ZXJFeC5NZXNzYWdlICsgIiBTVDogIiArIG91dGVyRXguU3RhY2tUcmFjZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVycm9yVW5rbm93bjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIEJ5dGVzVG9IZXgoYnl0ZVtdIGRhdGEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCaXRDb252ZXJ0ZXIuVG9TdHJpbmcoZGF0YSkuUmVwbGFjZSgiLSIsIHN0cmluZy5FbXB0eSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBQcmVwYXJlVGVzdERhdGEoYm9vbCByYW5kb21EaXN0KQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmV0dmFsID0gbmV3IGJ5dGVbMHgxMDBdOworICAgICAgICAgICAgdmFyIGluaXRMZW4gPSBNYXRoLk1pbigweDEwMCwgcmV0dmFsLkxlbmd0aCk7CisKKyAgICAgICAgICAgIC8vIGxpbmVhciBkaXN0cmlidXRpb24sIHVubGVzcyByYW5kb20gaXMgcmVxdWVzdGVkCisgICAgICAgICAgICBpZiAoIXJhbmRvbURpc3QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbml0TGVuOyArK2kpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR2YWxbaV0gPSAoYnl0ZSlpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyByYW5kb20gZGlzdHJpYnV0aW9uCisgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGluaXRMZW47ICsraSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR2YWxbaV0gPSAoYnl0ZSkwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFyIHJuZCA9IG5ldyBSYW5kb20oKTsKKyAgICAgICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgaW5pdExlbjsgKytpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIG5leHRQb3MgPSBybmQuTmV4dCgpICUgaW5pdExlbjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJldHZhbFtuZXh0UG9zXSA9PSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR2YWxbbmV4dFBvc10gPSAoYnl0ZSlpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmV0dmFsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBhc3luYyBUYXNrPGludD4gRXhlY3V0ZUNsaWVudFRlc3RBc3luYyhUaHJpZnRUZXN0LkNsaWVudCBjbGllbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB0b2tlbiA9IENhbmNlbGxhdGlvblRva2VuLk5vbmU7CisgICAgICAgICAgICB2YXIgcmV0dXJuQ29kZSA9IDA7CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RWb2lkKCkiKTsKKyAgICAgICAgICAgIGF3YWl0IGNsaWVudC50ZXN0Vm9pZEFzeW5jKHRva2VuKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSB2b2lkIik7CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RTdHJpbmcoXCJUZXN0XCIpIik7CisgICAgICAgICAgICB2YXIgcyA9IGF3YWl0IGNsaWVudC50ZXN0U3RyaW5nQXN5bmMoIlRlc3QiLCB0b2tlbik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gXCIiICsgcyArICJcIiIpOworICAgICAgICAgICAgaWYgKCJUZXN0IiAhPSBzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JCYXNlVHlwZXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RCb29sKHRydWUpIik7CisgICAgICAgICAgICB2YXIgdCA9IGF3YWl0IGNsaWVudC50ZXN0Qm9vbEFzeW5jKChib29sKXRydWUsIHRva2VuKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgdCk7CisgICAgICAgICAgICBpZiAoIXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckJhc2VUeXBlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RCb29sKGZhbHNlKSIpOworICAgICAgICAgICAgdmFyIGYgPSBhd2FpdCBjbGllbnQudGVzdEJvb2xBc3luYygoYm9vbClmYWxzZSwgdG9rZW4pOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyBmKTsKKyAgICAgICAgICAgIGlmIChmKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JCYXNlVHlwZXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RCeXRlKDEpIik7CisgICAgICAgICAgICB2YXIgaTggPSBhd2FpdCBjbGllbnQudGVzdEJ5dGVBc3luYygoc2J5dGUpMSwgdG9rZW4pOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyBpOCk7CisgICAgICAgICAgICBpZiAoMSAhPSBpOCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yQmFzZVR5cGVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0STMyKC0xKSIpOworICAgICAgICAgICAgdmFyIGkzMiA9IGF3YWl0IGNsaWVudC50ZXN0STMyQXN5bmMoLTEsIHRva2VuKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgaTMyKTsKKyAgICAgICAgICAgIGlmICgtMSAhPSBpMzIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckJhc2VUeXBlczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEk2NCgtMzQzNTk3MzgzNjgpIik7CisgICAgICAgICAgICB2YXIgaTY0ID0gYXdhaXQgY2xpZW50LnRlc3RJNjRBc3luYygtMzQzNTk3MzgzNjgsIHRva2VuKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgaTY0KTsKKyAgICAgICAgICAgIGlmICgtMzQzNTk3MzgzNjggIT0gaTY0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JCYXNlVHlwZXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFRPRE86IFZhbGlkYXRlIHJlY2VpdmVkIG1lc3NhZ2UKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3REb3VibGUoNS4zMjUwOTgyMzUpIik7CisgICAgICAgICAgICB2YXIgZHViID0gYXdhaXQgY2xpZW50LnRlc3REb3VibGVBc3luYyg1LjMyNTA5ODIzNSwgdG9rZW4pOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyBkdWIpOworICAgICAgICAgICAgaWYgKDUuMzI1MDk4MjM1ICE9IGR1YikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yQmFzZVR5cGVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdERvdWJsZSgtMC4wMDAzNDEwMTI0Mzk2Mzg1OTgyNzkpIik7CisgICAgICAgICAgICBkdWIgPSBhd2FpdCBjbGllbnQudGVzdERvdWJsZUFzeW5jKC0wLjAwMDM0MTAxMjQzOTYzODU5ODI3OSwgdG9rZW4pOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyBkdWIpOworICAgICAgICAgICAgaWYgKC0wLjAwMDM0MTAxMjQzOTYzODU5ODI3OSAhPSBkdWIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckJhc2VUeXBlczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGJpbk91dCA9IFByZXBhcmVUZXN0RGF0YSh0cnVlKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RCaW5hcnkoIiArIEJ5dGVzVG9IZXgoYmluT3V0KSArICIpIik7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgYmluSW4gPSBhd2FpdCBjbGllbnQudGVzdEJpbmFyeUFzeW5jKGJpbk91dCwgdG9rZW4pOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgQnl0ZXNUb0hleChiaW5JbikpOworICAgICAgICAgICAgICAgIGlmIChiaW5Jbi5MZW5ndGggIT0gYmluT3V0Lkxlbmd0aCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yQmFzZVR5cGVzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKHZhciBvZnMgPSAwOyBvZnMgPCBNYXRoLk1pbihiaW5Jbi5MZW5ndGgsIGJpbk91dC5MZW5ndGgpOyArK29mcykKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJpbkluW29mc10gIT0gYmluT3V0W29mc10pCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckJhc2VUeXBlczsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24gZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckJhc2VUeXBlczsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShleC5NZXNzYWdlICsgIiBTVDogIiArIGV4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBiaW5hcnkgZXF1YWxzPyBvbmx5IHdpdGggaGFzaGNvZGUgb3B0aW9uIGVuYWJsZWQgLi4uCisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiVGVzdCBDcmF6eU5lc3RpbmciKTsKKyAgICAgICAgICAgIHZhciBvbmUgPSBuZXcgQ3JhenlOZXN0aW5nKCk7CisgICAgICAgICAgICB2YXIgdHdvID0gbmV3IENyYXp5TmVzdGluZygpOworICAgICAgICAgICAgb25lLlN0cmluZ19maWVsZCA9ICJjcmF6eSI7CisgICAgICAgICAgICB0d28uU3RyaW5nX2ZpZWxkID0gImNyYXp5IjsKKyAgICAgICAgICAgIG9uZS5CaW5hcnlfZmllbGQgPSBuZXcgYnl0ZVtdIHsgMHgwMCwgMHgwMSwgMHgwMiwgMHgwNCwgMHgwOCwgMHgxMCwgMHgyMCwgMHg0MCwgMHg4MCwgMHhGRiB9OworICAgICAgICAgICAgdHdvLkJpbmFyeV9maWVsZCA9IG5ldyBieXRlWzEwXSB7IDB4MDAsIDB4MDEsIDB4MDIsIDB4MDQsIDB4MDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODAsIDB4RkYgfTsKKyAgICAgICAgICAgIGlmICh0eXBlb2YoQ3JhenlOZXN0aW5nKS5HZXRNZXRob2QoIkVxdWFscyIpPy5EZWNsYXJpbmdUeXBlID09IHR5cGVvZihDcmF6eU5lc3RpbmcpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghb25lLkVxdWFscyh0d28pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JDb250YWluZXJzOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJDcmF6eU5lc3RpbmcuRXF1YWxzIGZhaWxlZCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVE9ETzogVmFsaWRhdGUgcmVjZWl2ZWQgbWVzc2FnZQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdFN0cnVjdCh7XCJaZXJvXCIsIDEsIC0zLCAtNX0pIik7CisgICAgICAgICAgICB2YXIgbyA9IG5ldyBYdHJ1Y3QoKTsKKyAgICAgICAgICAgIG8uU3RyaW5nX3RoaW5nID0gIlplcm8iOworICAgICAgICAgICAgby5CeXRlX3RoaW5nID0gKHNieXRlKTE7CisgICAgICAgICAgICBvLkkzMl90aGluZyA9IC0zOworICAgICAgICAgICAgby5JNjRfdGhpbmcgPSAtNTsKKyAgICAgICAgICAgIHZhciBpID0gYXdhaXQgY2xpZW50LnRlc3RTdHJ1Y3RBc3luYyhvLCB0b2tlbik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0ge1wiIiArIGkuU3RyaW5nX3RoaW5nICsgIlwiLCAiICsgaS5CeXRlX3RoaW5nICsgIiwgIiArIGkuSTMyX3RoaW5nICsgIiwgIiArIGkuSTY0X3RoaW5nICsgIn0iKTsKKworICAgICAgICAgICAgLy8gVE9ETzogVmFsaWRhdGUgcmVjZWl2ZWQgbWVzc2FnZQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdE5lc3QoezEsIHtcIlplcm9cIiwgMSwgLTMsIC01fSwgNX0pIik7CisgICAgICAgICAgICB2YXIgbzIgPSBuZXcgWHRydWN0MigpOworICAgICAgICAgICAgbzIuQnl0ZV90aGluZyA9IChzYnl0ZSkxOworICAgICAgICAgICAgbzIuU3RydWN0X3RoaW5nID0gbzsKKyAgICAgICAgICAgIG8yLkkzMl90aGluZyA9IDU7CisgICAgICAgICAgICB2YXIgaTIgPSBhd2FpdCBjbGllbnQudGVzdE5lc3RBc3luYyhvMiwgdG9rZW4pOworICAgICAgICAgICAgaSA9IGkyLlN0cnVjdF90aGluZzsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSB7IiArIGkyLkJ5dGVfdGhpbmcgKyAiLCB7XCIiICsgaS5TdHJpbmdfdGhpbmcgKyAiXCIsICIgKyBpLkJ5dGVfdGhpbmcgKyAiLCAiICsgaS5JMzJfdGhpbmcgKyAiLCAiICsgaS5JNjRfdGhpbmcgKyAifSwgIiArIGkyLkkzMl90aGluZyArICJ9Iik7CisKKyAgICAgICAgICAgIHZhciBtYXBvdXQgPSBuZXcgRGljdGlvbmFyeTxpbnQsIGludD4oKTsKKyAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgNTsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1hcG91dFtqXSA9IGogLSAxMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RNYXAoeyIpOworICAgICAgICAgICAgdmFyIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBrZXkgaW4gbWFwb3V0LktleXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiLCAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZShrZXkgKyAiID0+ICIgKyBtYXBvdXRba2V5XSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ9KSIpOworCisgICAgICAgICAgICB2YXIgbWFwaW4gPSBhd2FpdCBjbGllbnQudGVzdE1hcEFzeW5jKG1hcG91dCwgdG9rZW4pOworCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCIgPSB7Iik7CisgICAgICAgICAgICBmaXJzdCA9IHRydWU7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIga2V5IGluIG1hcGluLktleXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiLCAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZShrZXkgKyAiID0+ICIgKyBtYXBpbltrZXldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ9Iik7CisKKyAgICAgICAgICAgIC8vIFRPRE86IFZhbGlkYXRlIHJlY2VpdmVkIG1lc3NhZ2UKKyAgICAgICAgICAgIHZhciBsaXN0b3V0ID0gbmV3IExpc3Q8aW50PigpOworICAgICAgICAgICAgZm9yICh2YXIgaiA9IC0yOyBqIDwgMzsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxpc3RvdXQuQWRkKGopOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdExpc3QoeyIpOworICAgICAgICAgICAgZmlyc3QgPSB0cnVlOworICAgICAgICAgICAgZm9yZWFjaCAodmFyIGogaW4gbGlzdG91dCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCIsICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKGopOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgifSkiKTsKKworICAgICAgICAgICAgdmFyIGxpc3RpbiA9IGF3YWl0IGNsaWVudC50ZXN0TGlzdEFzeW5jKGxpc3RvdXQsIHRva2VuKTsKKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiID0geyIpOworICAgICAgICAgICAgZmlyc3QgPSB0cnVlOworICAgICAgICAgICAgZm9yZWFjaCAodmFyIGogaW4gbGlzdGluKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIiwgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoaik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgifSIpOworCisgICAgICAgICAgICAvL3NldAorICAgICAgICAgICAgLy8gVE9ETzogVmFsaWRhdGUgcmVjZWl2ZWQgbWVzc2FnZQorICAgICAgICAgICAgdmFyIHNldG91dCA9IG5ldyBUSGFzaFNldDxpbnQ+KCk7CisgICAgICAgICAgICBmb3IgKHZhciBqID0gLTI7IGogPCAzOyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2V0b3V0LkFkZChqKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RTZXQoeyIpOworICAgICAgICAgICAgZmlyc3QgPSB0cnVlOworICAgICAgICAgICAgZm9yZWFjaCAoaW50IGogaW4gc2V0b3V0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIiwgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoaik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ9KSIpOworCisgICAgICAgICAgICB2YXIgc2V0aW4gPSBhd2FpdCBjbGllbnQudGVzdFNldEFzeW5jKHNldG91dCwgdG9rZW4pOworCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCIgPSB7Iik7CisgICAgICAgICAgICBmaXJzdCA9IHRydWU7CisgICAgICAgICAgICBmb3JlYWNoIChpbnQgaiBpbiBzZXRpbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCIsICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKGopOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIn0iKTsKKworCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0RW51bShPTkUpIik7CisgICAgICAgICAgICB2YXIgcmV0ID0gYXdhaXQgY2xpZW50LnRlc3RFbnVtQXN5bmMoTnVtYmVyei5PTkUsIHRva2VuKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgcmV0KTsKKyAgICAgICAgICAgIGlmIChOdW1iZXJ6Lk9ORSAhPSByZXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvclN0cnVjdHM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RFbnVtKFRXTykiKTsKKyAgICAgICAgICAgIHJldCA9IGF3YWl0IGNsaWVudC50ZXN0RW51bUFzeW5jKE51bWJlcnouVFdPLCB0b2tlbik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gIiArIHJldCk7CisgICAgICAgICAgICBpZiAoTnVtYmVyei5UV08gIT0gcmV0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JTdHJ1Y3RzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0RW51bShUSFJFRSkiKTsKKyAgICAgICAgICAgIHJldCA9IGF3YWl0IGNsaWVudC50ZXN0RW51bUFzeW5jKE51bWJlcnouVEhSRUUsIHRva2VuKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgcmV0KTsKKyAgICAgICAgICAgIGlmIChOdW1iZXJ6LlRIUkVFICE9IHJldCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yU3RydWN0czsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEVudW0oRklWRSkiKTsKKyAgICAgICAgICAgIHJldCA9IGF3YWl0IGNsaWVudC50ZXN0RW51bUFzeW5jKE51bWJlcnouRklWRSwgdG9rZW4pOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyByZXQpOworICAgICAgICAgICAgaWYgKE51bWJlcnouRklWRSAhPSByZXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvclN0cnVjdHM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RFbnVtKEVJR0hUKSIpOworICAgICAgICAgICAgcmV0ID0gYXdhaXQgY2xpZW50LnRlc3RFbnVtQXN5bmMoTnVtYmVyei5FSUdIVCwgdG9rZW4pOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyByZXQpOworICAgICAgICAgICAgaWYgKE51bWJlcnouRUlHSFQgIT0gcmV0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JTdHJ1Y3RzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0VHlwZWRlZigzMDk4NTgyMzUwODI1MjMpIik7CisgICAgICAgICAgICB2YXIgdWlkID0gYXdhaXQgY2xpZW50LnRlc3RUeXBlZGVmQXN5bmMoMzA5ODU4MjM1MDgyNTIzTCwgdG9rZW4pOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyB1aWQpOworICAgICAgICAgICAgaWYgKDMwOTg1ODIzNTA4MjUyM0wgIT0gdWlkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JTdHJ1Y3RzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBUT0RPOiBWYWxpZGF0ZSByZWNlaXZlZCBtZXNzYWdlCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0TWFwTWFwKDEpIik7CisgICAgICAgICAgICB2YXIgbW0gPSBhd2FpdCBjbGllbnQudGVzdE1hcE1hcEFzeW5jKDEsIHRva2VuKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIiA9IHsiKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBrZXkgaW4gbW0uS2V5cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKGtleSArICIgPT4geyIpOworICAgICAgICAgICAgICAgIHZhciBtMiA9IG1tW2tleV07CisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGsyIGluIG0yLktleXMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKGsyICsgIiA9PiAiICsgbTJbazJdICsgIiwgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIn0sICIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIn0iKTsKKworICAgICAgICAgICAgLy8gVE9ETzogVmFsaWRhdGUgcmVjZWl2ZWQgbWVzc2FnZQorICAgICAgICAgICAgdmFyIGluc2FuZSA9IG5ldyBJbnNhbml0eSgpOworICAgICAgICAgICAgaW5zYW5lLlVzZXJNYXAgPSBuZXcgRGljdGlvbmFyeTxOdW1iZXJ6LCBsb25nPigpOworICAgICAgICAgICAgaW5zYW5lLlVzZXJNYXBbTnVtYmVyei5GSVZFXSA9IDUwMDBMOworICAgICAgICAgICAgdmFyIHRydWNrID0gbmV3IFh0cnVjdCgpOworICAgICAgICAgICAgdHJ1Y2suU3RyaW5nX3RoaW5nID0gIlRydWNrIjsKKyAgICAgICAgICAgIHRydWNrLkJ5dGVfdGhpbmcgPSAoc2J5dGUpODsKKyAgICAgICAgICAgIHRydWNrLkkzMl90aGluZyA9IDg7CisgICAgICAgICAgICB0cnVjay5JNjRfdGhpbmcgPSA4OworICAgICAgICAgICAgaW5zYW5lLlh0cnVjdHMgPSBuZXcgTGlzdDxYdHJ1Y3Q+KCk7CisgICAgICAgICAgICBpbnNhbmUuWHRydWN0cy5BZGQodHJ1Y2spOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEluc2FuaXR5KCkiKTsKKyAgICAgICAgICAgIHZhciB3aG9hID0gYXdhaXQgY2xpZW50LnRlc3RJbnNhbml0eUFzeW5jKGluc2FuZSwgdG9rZW4pOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiID0geyIpOworICAgICAgICAgICAgZm9yZWFjaCAodmFyIGtleSBpbiB3aG9hLktleXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHZhbCA9IHdob2Fba2V5XTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKGtleSArICIgPT4geyIpOworCisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGsyIGluIHZhbC5LZXlzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHYyID0gdmFsW2syXTsKKworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKGsyICsgIiA9PiB7Iik7CisgICAgICAgICAgICAgICAgICAgIHZhciB1c2VyTWFwID0gdjIuVXNlck1hcDsKKworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ7Iik7CisgICAgICAgICAgICAgICAgICAgIGlmICh1c2VyTWFwICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBrMyBpbiB1c2VyTWFwLktleXMpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZShrMyArICIgPT4gIiArIHVzZXJNYXBbazNdICsgIiwgIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJudWxsIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgifSwgIik7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIHh0cnVjdHMgPSB2Mi5YdHJ1Y3RzOworCisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInsiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHh0cnVjdHMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIHggaW4geHRydWN0cykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ7XCIiICsgeC5TdHJpbmdfdGhpbmcgKyAiXCIsICIgKyB4LkJ5dGVfdGhpbmcgKyAiLCAiICsgeC5JMzJfdGhpbmcgKyAiLCAiICsgeC5JMzJfdGhpbmcgKyAifSwgIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJudWxsIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgifSIpOworCisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIn0sICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ9LCAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ9Iik7CisKKyAgICAgICAgICAgIHNieXRlIGFyZzAgPSAxOworICAgICAgICAgICAgdmFyIGFyZzEgPSAyOworICAgICAgICAgICAgdmFyIGFyZzIgPSBsb25nLk1heFZhbHVlOworICAgICAgICAgICAgdmFyIG11bHRpRGljdCA9IG5ldyBEaWN0aW9uYXJ5PHNob3J0LCBzdHJpbmc+KCk7CisgICAgICAgICAgICBtdWx0aURpY3RbMV0gPSAib25lIjsKKworICAgICAgICAgICAgdmFyIHRtcE11bHRpRGljdCA9IG5ldyBMaXN0PHN0cmluZz4oKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBwYWlyIGluIG11bHRpRGljdCkKKyAgICAgICAgICAgICAgICB0bXBNdWx0aURpY3QuQWRkKHBhaXIuS2V5ICsiID0+ICIrIHBhaXIuVmFsdWUpOworCisgICAgICAgICAgICB2YXIgYXJnNCA9IE51bWJlcnouRklWRTsKKyAgICAgICAgICAgIGxvbmcgYXJnNSA9IDUwMDAwMDA7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJUZXN0IE11bHRpKCIgKyBhcmcwICsgIiwiICsgYXJnMSArICIsIiArIGFyZzIgKyAiLHsiICsgc3RyaW5nLkpvaW4oIiwiLCB0bXBNdWx0aURpY3QpICsgIn0sIiArIGFyZzQgKyAiLCIgKyBhcmc1ICsgIikiKTsKKyAgICAgICAgICAgIHZhciBtdWx0aVJlc3BvbnNlID0gYXdhaXQgY2xpZW50LnRlc3RNdWx0aUFzeW5jKGFyZzAsIGFyZzEsIGFyZzIsIG11bHRpRGljdCwgYXJnNCwgYXJnNSwgdG9rZW4pOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiID0gWHRydWN0KGJ5dGVfdGhpbmc6IiArIG11bHRpUmVzcG9uc2UuQnl0ZV90aGluZyArICIsU3RyaW5nX3RoaW5nOiIgKyBtdWx0aVJlc3BvbnNlLlN0cmluZ190aGluZworICAgICAgICAgICAgICAgICAgICAgICAgICArICIsaTMyX3RoaW5nOiIgKyBtdWx0aVJlc3BvbnNlLkkzMl90aGluZyArICIsaTY0X3RoaW5nOiIgKyBtdWx0aVJlc3BvbnNlLkk2NF90aGluZyArICIpXG4iKTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInRlc3RFeGNlcHRpb24oXCJYY2VwdGlvblwiKSIpOworICAgICAgICAgICAgICAgIGF3YWl0IGNsaWVudC50ZXN0RXhjZXB0aW9uQXN5bmMoIlhjZXB0aW9uIiwgdG9rZW4pOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JFeGNlcHRpb25zOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChleC5FcnJvckNvZGUgIT0gMTAwMSB8fCBleC5NZXNzYWdlICE9ICJYY2VwdGlvbiIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckV4Y2VwdGlvbnM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yRXhjZXB0aW9uczsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShleC5NZXNzYWdlICsgIiBTVDogIiArIGV4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInRlc3RFeGNlcHRpb24oXCJURXhjZXB0aW9uXCIpIik7CisgICAgICAgICAgICAgICAgYXdhaXQgY2xpZW50LnRlc3RFeGNlcHRpb25Bc3luYygiVEV4Y2VwdGlvbiIsIHRva2VuKTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yRXhjZXB0aW9uczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChUaHJpZnQuVEV4Y2VwdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBPSworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yRXhjZXB0aW9uczsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShleC5NZXNzYWdlICsgIiBTVDogIiArIGV4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInRlc3RFeGNlcHRpb24oXCJva1wiKSIpOworICAgICAgICAgICAgICAgIGF3YWl0IGNsaWVudC50ZXN0RXhjZXB0aW9uQXN5bmMoIm9rIiwgdG9rZW4pOworICAgICAgICAgICAgICAgIC8vIE9LCisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JFeGNlcHRpb25zOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGV4Lk1lc3NhZ2UgKyAiIFNUOiAiICsgZXguU3RhY2tUcmFjZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ0ZXN0TXVsdGlFeGNlcHRpb24oXCJYY2VwdGlvblwiLCAuLi4pIik7CisgICAgICAgICAgICAgICAgYXdhaXQgY2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbkFzeW5jKCJYY2VwdGlvbiIsICJpZ25vcmUiLCB0b2tlbik7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckV4Y2VwdGlvbnM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoWGNlcHRpb24gZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGV4LkVycm9yQ29kZSAhPSAxMDAxIHx8IGV4Lk1lc3NhZ2UgIT0gIlRoaXMgaXMgYW4gWGNlcHRpb24iKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JFeGNlcHRpb25zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckV4Y2VwdGlvbnM7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZXguTWVzc2FnZSArICIgU1Q6ICIgKyBleC5TdGFja1RyYWNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ0ZXN0TXVsdGlFeGNlcHRpb24oXCJYY2VwdGlvbjJcIiwgLi4uKSIpOworICAgICAgICAgICAgICAgIGF3YWl0IGNsaWVudC50ZXN0TXVsdGlFeGNlcHRpb25Bc3luYygiWGNlcHRpb24yIiwgImlnbm9yZSIsIHRva2VuKTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yRXhjZXB0aW9uczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChYY2VwdGlvbjIgZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGV4LkVycm9yQ29kZSAhPSAyMDAyIHx8IGV4LlN0cnVjdF90aGluZy5TdHJpbmdfdGhpbmcgIT0gIlRoaXMgaXMgYW4gWGNlcHRpb24yIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yRXhjZXB0aW9uczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JFeGNlcHRpb25zOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGV4Lk1lc3NhZ2UgKyAiIFNUOiAiICsgZXguU3RhY2tUcmFjZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgidGVzdE11bHRpRXhjZXB0aW9uKFwic3VjY2Vzc1wiLCBcIk9LXCIpIik7CisgICAgICAgICAgICAgICAgaWYgKCJPSyIgIT0gKGF3YWl0IGNsaWVudC50ZXN0TXVsdGlFeGNlcHRpb25Bc3luYygic3VjY2VzcyIsICJPSyIsIHRva2VuKSkuU3RyaW5nX3RoaW5nKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JFeGNlcHRpb25zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckV4Y2VwdGlvbnM7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZXguTWVzc2FnZSArICIgU1Q6ICIgKyBleC5TdGFja1RyYWNlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIHN3ID0gbmV3IFN0b3B3YXRjaCgpOworICAgICAgICAgICAgc3cuU3RhcnQoKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJUZXN0IE9uZXdheSgxKSIpOworICAgICAgICAgICAgYXdhaXQgY2xpZW50LnRlc3RPbmV3YXlBc3luYygxLCB0b2tlbik7CisgICAgICAgICAgICBzdy5TdG9wKCk7CisgICAgICAgICAgICBpZiAoc3cuRWxhcHNlZE1pbGxpc2Vjb25kcyA+IDEwMDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckJhc2VUeXBlczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiVGVzdCBDYWxsdGltZSgpIik7CisgICAgICAgICAgICB2YXIgdGltZXMgPSA1MDsKKyAgICAgICAgICAgIHN3LlJlc2V0KCk7CisgICAgICAgICAgICBzdy5TdGFydCgpOworICAgICAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCB0aW1lczsgKytrKQorICAgICAgICAgICAgICAgIGF3YWl0IGNsaWVudC50ZXN0Vm9pZEFzeW5jKHRva2VuKTsKKyAgICAgICAgICAgIHN3LlN0b3AoKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSB7MH0gbXMgYSB0ZXN0Vm9pZCgpIGNhbGwiLCBzdy5FbGFwc2VkTWlsbGlzZWNvbmRzIC8gdGltZXMpOworICAgICAgICAgICAgcmV0dXJuIHJldHVybkNvZGU7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L25ldGNvcmUvTWFrZWZpbGUuYW0gYi90ZXN0L25ldGNvcmUvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc2ZmZiNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbmV0Y29yZS9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDQxIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworU1VCRElSUyA9IC4gCisKK2FsbC1sb2NhbDoKKwkkKERPVE5FVENPUkUpIGJ1aWxkCisKK3ByZWNyb3NzOgorCSQoRE9UTkVUQ09SRSkgYnVpbGQKKworY2xlYW4tbG9jYWw6CisJJChSTSkgLXIgQ2xpZW50L2JpbgorCSQoUk0pIC1yIFNlcnZlci9iaW4KKwkkKFJNKSAtciBDbGllbnQvb2JqCisJJChSTSkgLXIgU2VydmVyL29iagorCSQoUk0pIC1yIFRocmlmdFRlc3QvVGhyaWZ0VGVzdAorCitFWFRSQV9ESVNUID0gXAorCUNsaWVudCBcCisJUkVBRE1FLm1kIFwKKwlTZXJ2ZXIgXAorCVRocmlmdFRlc3Quc2xuIFwKKwlidWlsZC5jbWQgXAorCWJ1aWxkLnNoCmRpZmYgLS1naXQgYS90ZXN0L25ldGNvcmUvUkVBRE1FLm1kIGIvdGVzdC9uZXRjb3JlL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDcyOGQxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9uZXRjb3JlL1JFQURNRS5tZApAQCAtMCwwICsxLDIwIEBACisjIEFwYWNoZSBUaHJpZnQgbmV0LWNvcmUtbGliIHRlc3RzCisKK1Rlc3RzIGZvciBUaHJpZnQgY2xpZW50IGxpYnJhcnkgcG9ydGVkIHRvIE1pY3Jvc29mdCAuTmV0IENvcmUgCisKKyMgQ29udGVudAorLSBUaHJpZnRUZXN0IC0gdGVzdHMgZm9yIFRocmlmdCBsaWJyYXJ5IAorCisjIFJldXNlZCBjb21wb25lbnRzIAorLSBORVQgQ29yZSBTdGFuZGFyZCAxLjYgKFNESyAyLjAuMCkKKworIyBIb3cgdG8gYnVpbGQgb24gV2luZG93cworLSBHZXQgVGhyaWZ0IElETCBjb21waWxlciBleGVjdXRhYmxlLCBhZGQgdG8gc29tZSBmb2xkZXIgYW5kIGFkZCBwYXRoIHRvIHRoaXMgZm9sZGVyIGludG8gUEFUSCB2YXJpYWJsZQorLSBPcGVuIFRocmlmdFRlc3Quc2xuIGluIFZpc3VhbCBTdHVkaW8gYW5kIGJ1aWxkCitvciAKKy0gQnVpbGQgd2l0aCBzY3JpcHRzCisKKyMgSG93IHRvIGJ1aWxkIG9uIFVuaXgKKy0gRW5zdXJlIHlvdSBoYXZlIC5ORVQgQ29yZSAyLjAuMCBTREsgaW5zdGFsbGVkIG9yIHVzZSB0aGUgVWJ1bnR1IFhlbmlhbCBkb2NrZXIgaW1hZ2UKKy0gRm9sbG93IGNvbW1vbiBidWlsZCBwcmFjdGljZSBmb3IgVGhyaWZ0OiBib290c3RyYXAsIGNvbmZpZ3VyZSwgYW5kIG1ha2UgcHJlY3Jvc3MKKwpkaWZmIC0tZ2l0IGEvdGVzdC9uZXRjb3JlL1NlcnZlci8uZ2l0aWdub3JlIGIvdGVzdC9uZXRjb3JlL1NlcnZlci8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3ZDU1MTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L25ldGNvcmUvU2VydmVyLy5naXRpZ25vcmUKQEAgLTAsMCArMSwyIEBACisjIGlnbm9yZSBmb3IgYXV0b2dlbmVyYXRlZCBmaWxlcworL1RocmlmdFRlc3QKZGlmZiAtLWdpdCBhL3Rlc3QvbmV0Y29yZS9TZXJ2ZXIvUHJvZ3JhbS5jcyBiL3Rlc3QvbmV0Y29yZS9TZXJ2ZXIvUHJvZ3JhbS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjQ3ZTViCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9uZXRjb3JlL1NlcnZlci9Qcm9ncmFtLmNzCkBAIC0wLDAgKzEsNzIgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFRocmlmdFRlc3Q7CisKK25hbWVzcGFjZSBTZXJ2ZXIKK3sKKyAgICBwdWJsaWMgY2xhc3MgUHJvZ3JhbQorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgTWFpbihzdHJpbmdbXSBhcmdzKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLlNldEJ1ZmZlclNpemUoQ29uc29sZS5CdWZmZXJXaWR0aCwgNDA5Nik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJGYWlsZWQgdG8gZ3JvdyBzY3JvbGwtYmFjayBidWZmZXIiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gc3BsaXQgbW9kZSBhbmQgb3B0aW9ucworICAgICAgICAgICAgdmFyIHN1YkFyZ3MgPSBuZXcgTGlzdDxzdHJpbmc+KGFyZ3MpOworICAgICAgICAgICAgdmFyIGZpcnN0QXJnID0gc3RyaW5nLkVtcHR5OworICAgICAgICAgICAgaWYgKHN1YkFyZ3MuQ291bnQgPiAwKQorICAgICAgICAgICAgeyAKKyAgICAgICAgICAgICAgICBmaXJzdEFyZyA9IHN1YkFyZ3NbMF07CisgICAgICAgICAgICAgICAgc3ViQXJncy5SZW1vdmVBdCgwKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gcnVuIHdoYXRldmVyIG1vZGUgaXMgY2hvb3NlbgorICAgICAgICAgICAgc3dpdGNoKGZpcnN0QXJnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgInNlcnZlciI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUZXN0U2VydmVyLkV4ZWN1dGUoc3ViQXJncyk7CisgICAgICAgICAgICAgICAgY2FzZSAiLS1oZWxwIjoKKyAgICAgICAgICAgICAgICAgICAgUHJpbnRIZWxwKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIFByaW50SGVscCgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIFByaW50SGVscCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJVc2FnZToiKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgIFNlcnZlciAgc2VydmVyICBbb3B0aW9uc10nIik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiICBTZXJ2ZXIgIC0taGVscCIpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiIpOworCisgICAgICAgICAgICBUZXN0U2VydmVyLlByaW50T3B0aW9uc0hlbHAoKTsKKyAgICAgICAgfQorICAgIH0KK30KKworCmRpZmYgLS1naXQgYS90ZXN0L25ldGNvcmUvU2VydmVyL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzIGIvdGVzdC9uZXRjb3JlL1NlcnZlci9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjU0OTVjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9uZXRjb3JlL1NlcnZlci9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpAQCAtMCwwICsxLDQzIEBACivvu78vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KK3VzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuQ29tcGlsZXJTZXJ2aWNlczsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsKKworLy8gR2VuZXJhbCBJbmZvcm1hdGlvbiBhYm91dCBhbiBhc3NlbWJseSBpcyBjb250cm9sbGVkIHRocm91Z2ggdGhlIGZvbGxvd2luZworLy8gc2V0IG9mIGF0dHJpYnV0ZXMuIENoYW5nZSB0aGVzZSBhdHRyaWJ1dGUgdmFsdWVzIHRvIG1vZGlmeSB0aGUgaW5mb3JtYXRpb24KKy8vIGFzc29jaWF0ZWQgd2l0aCBhbiBhc3NlbWJseS4KKworW2Fzc2VtYmx5OiBBc3NlbWJseVRpdGxlKCJTZXJ2ZXIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlEZXNjcmlwdGlvbigiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29uZmlndXJhdGlvbigiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29tcGFueSgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCitbYXNzZW1ibHk6IEFzc2VtYmx5UHJvZHVjdCgiVGhyaWZ0IildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29weXJpZ2h0KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlUcmFkZW1hcmsoIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUN1bHR1cmUoIiIpXQorCisvLyBTZXR0aW5nIENvbVZpc2libGUgdG8gZmFsc2UgbWFrZXMgdGhlIHR5cGVzIGluIHRoaXMgYXNzZW1ibHkgbm90IHZpc2libGUKKy8vIHRvIENPTSBjb21wb25lbnRzLiAgSWYgeW91IG5lZWQgdG8gYWNjZXNzIGEgdHlwZSBpbiB0aGlzIGFzc2VtYmx5IGZyb20KKy8vIENPTSwgc2V0IHRoZSBDb21WaXNpYmxlIGF0dHJpYnV0ZSB0byB0cnVlIG9uIHRoYXQgdHlwZS4KKworW2Fzc2VtYmx5OiBDb21WaXNpYmxlKGZhbHNlKV0KKworLy8gVGhlIGZvbGxvd2luZyBHVUlEIGlzIGZvciB0aGUgSUQgb2YgdGhlIHR5cGVsaWIgaWYgdGhpcyBwcm9qZWN0IGlzIGV4cG9zZWQgdG8gQ09NCisKK1thc3NlbWJseTogR3VpZCgiQjBDMTNEQTAtMzExNy00ODQ0LThBRTgtQjE3NzVFNDYyMjNEIildCisKZGlmZiAtLWdpdCBhL3Rlc3QvbmV0Y29yZS9TZXJ2ZXIvU2VydmVyLmNzcHJvaiBiL3Rlc3QvbmV0Y29yZS9TZXJ2ZXIvU2VydmVyLmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjliNGIxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9uZXRjb3JlL1NlcnZlci9TZXJ2ZXIuY3Nwcm9qCkBAIC0wLDAgKzEsMzEgQEAKK++7vzxQcm9qZWN0IFNkaz0iTWljcm9zb2Z0Lk5FVC5TZGsiPgorICA8UHJvcGVydHlHcm91cD4KKyAgICA8VGFyZ2V0RnJhbWV3b3JrPm5ldGNvcmVhcHAyLjA8L1RhcmdldEZyYW1ld29yaz4KKyAgICA8QXNzZW1ibHlOYW1lPlNlcnZlcjwvQXNzZW1ibHlOYW1lPgorICAgIDxQYWNrYWdlSWQ+U2VydmVyPC9QYWNrYWdlSWQ+CisgICAgPE91dHB1dFR5cGU+RXhlPC9PdXRwdXRUeXBlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5VGl0bGVBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlUaXRsZUF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseURlc2NyaXB0aW9uQXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5RGVzY3JpcHRpb25BdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlDb25maWd1cmF0aW9uQXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5Q29uZmlndXJhdGlvbkF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseUNvbXBhbnlBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlDb21wYW55QXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5UHJvZHVjdEF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseVByb2R1Y3RBdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlDb3B5cmlnaHRBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlDb3B5cmlnaHRBdHRyaWJ1dGU+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uTmV0Lkh0dHAuV2luSHR0cEhhbmRsZXIiIFZlcnNpb249Ils0LjQsKSIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLlByaW1pdGl2ZXMiIFZlcnNpb249Ils0LjMsKSIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uU2VydmljZU1vZGVsLlByaW1pdGl2ZXMiIFZlcnNpb249Ils0LjQsKSIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uVGhyZWFkaW5nIiBWZXJzaW9uPSJbNC4zLCkiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXC4uXGxpYlxuZXRjb3JlXFRocmlmdFxUaHJpZnQuY3Nwcm9qIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPFRhcmdldCBOYW1lPSJQcmVCdWlsZCIgQmVmb3JlVGFyZ2V0cz0iX0dlbmVyYXRlUmVzdG9yZVByb2plY3RTcGVjO1Jlc3RvcmU7Q29tcGlsZSI+CisgICAgPEV4ZWMgQ29uZGl0aW9uPSInJChPUyknID09ICdXaW5kb3dzX05UJyIgQ29tbWFuZD0id2hlcmUgdGhyaWZ0IiBDb25zb2xlVG9NU0J1aWxkPSJ0cnVlIj4KKyAgICAgIDxPdXRwdXQgVGFza1BhcmFtZXRlcj0iQ29uc29sZU91dHB1dCIgUHJvcGVydHlOYW1lPSJQYXRoVG9UaHJpZnQiIC8+CisgICAgPC9FeGVjPgorICAgIDxFeGVjIENvbmRpdGlvbj0iRXhpc3RzKCckKFBhdGhUb1RocmlmdCknKSIgQ29tbWFuZD0iJnF1b3Q7JChQYXRoVG9UaHJpZnQpJnF1b3Q7IC1vdXQgJChQcm9qZWN0RGlyKSAtZ2VuIG5ldGNvcmU6d2NmLHVuaW9uLHNlcmlhbCxoYXNoY29kZSAtciAuLy4uLy4uL1RocmlmdFRlc3QudGhyaWZ0IiAvPgorICAgIDxFeGVjIENvbmRpdGlvbj0iRXhpc3RzKCd0aHJpZnQnKSIgQ29tbWFuZD0idGhyaWZ0IC1vdXQgJChQcm9qZWN0RGlyKSAtZ2VuIG5ldGNvcmU6d2NmLHVuaW9uLHNlcmlhbCxoYXNoY29kZSAtciAuLy4uLy4uL1RocmlmdFRlc3QudGhyaWZ0IiAvPgorICAgIDxFeGVjIENvbmRpdGlvbj0iRXhpc3RzKCckKFByb2plY3REaXIpLy4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQnKSIgQ29tbWFuZD0iJChQcm9qZWN0RGlyKS8uLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1vdXQgJChQcm9qZWN0RGlyKSAtZ2VuIG5ldGNvcmU6d2NmLHVuaW9uLHNlcmlhbCxoYXNoY29kZSAtciAuLy4uLy4uL1RocmlmdFRlc3QudGhyaWZ0IiAvPgorICA8L1RhcmdldD4KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L25ldGNvcmUvU2VydmVyL1Rlc3RTZXJ2ZXIuY3MgYi90ZXN0L25ldGNvcmUvU2VydmVyL1Rlc3RTZXJ2ZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZkMzMzNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbmV0Y29yZS9TZXJ2ZXIvVGVzdFNlcnZlci5jcwpAQCAtMCwwICsxLDU5NCBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uU2VjdXJpdHkuQXV0aGVudGljYXRpb247Cit1c2luZyBTeXN0ZW0uU2VjdXJpdHkuQ3J5cHRvZ3JhcGh5Llg1MDlDZXJ0aWZpY2F0ZXM7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwordXNpbmcgTWljcm9zb2Z0LkV4dGVuc2lvbnMuTG9nZ2luZzsKK3VzaW5nIFRocmlmdDsKK3VzaW5nIFRocmlmdC5Db2xsZWN0aW9uczsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbHM7Cit1c2luZyBUaHJpZnQuU2VydmVyOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydHM7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0cy5TZXJ2ZXI7CisKK25hbWVzcGFjZSBUaHJpZnRUZXN0Cit7CisgICAgaW50ZXJuYWwgY2xhc3MgU2VydmVyUGFyYW0KKyAgICB7CisgICAgICAgIGludGVybmFsIGJvb2wgdXNlQnVmZmVyZWRTb2NrZXRzID0gZmFsc2U7CisgICAgICAgIGludGVybmFsIGJvb2wgdXNlRnJhbWVkID0gZmFsc2U7CisgICAgICAgIGludGVybmFsIGJvb2wgdXNlRW5jcnlwdGlvbiA9IGZhbHNlOworICAgICAgICBpbnRlcm5hbCBib29sIGNvbXBhY3QgPSBmYWxzZTsKKyAgICAgICAgaW50ZXJuYWwgYm9vbCBqc29uID0gZmFsc2U7CisgICAgICAgIGludGVybmFsIGludCBwb3J0ID0gOTA5MDsKKyAgICAgICAgaW50ZXJuYWwgc3RyaW5nIHBpcGUgPSBudWxsOworCisgICAgICAgIGludGVybmFsIHZvaWQgUGFyc2UoTGlzdDxzdHJpbmc+IGFyZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJncy5Db3VudDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChhcmdzW2ldLlN0YXJ0c1dpdGgoIi0tcGlwZT0iKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBpcGUgPSBhcmdzW2ldLlN1YnN0cmluZyhhcmdzW2ldLkluZGV4T2YoIj0iKSArIDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldLlN0YXJ0c1dpdGgoIi0tcG9ydD0iKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBvcnQgPSBpbnQuUGFyc2UoYXJnc1tpXS5TdWJzdHJpbmcoYXJnc1tpXS5JbmRleE9mKCI9IikgKyAxKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi1iIiB8fCBhcmdzW2ldID09ICItLWJ1ZmZlcmVkIiB8fCBhcmdzW2ldID09ICItLXRyYW5zcG9ydD1idWZmZXJlZCIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1c2VCdWZmZXJlZFNvY2tldHMgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItZiIgfHwgYXJnc1tpXSA9PSAiLS1mcmFtZWQiIHx8IGFyZ3NbaV0gPT0gIi0tdHJhbnNwb3J0PWZyYW1lZCIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1c2VGcmFtZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItLWJpbmFyeSIgfHwgYXJnc1tpXSA9PSAiLS1wcm90b2NvbD1iaW5hcnkiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gbm90aGluZyBuZWVkZWQKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLS1jb21wYWN0IiB8fCBhcmdzW2ldID09ICItLXByb3RvY29sPWNvbXBhY3QiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY29tcGFjdCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi0tanNvbiIgfHwgYXJnc1tpXSA9PSAiLS1wcm90b2NvbD1qc29uIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGpzb24gPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItLXRocmVhZGVkIiB8fCBhcmdzW2ldID09ICItLXNlcnZlci10eXBlPXRocmVhZGVkIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbihhcmdzW2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLS10aHJlYWRwb29sIiB8fCBhcmdzW2ldID09ICItLXNlcnZlci10eXBlPXRocmVhZHBvb2wiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKGFyZ3NbaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItLXByb3RvdHlwZSIgfHwgYXJnc1tpXSA9PSAiLS1wcm9jZXNzb3I9cHJvdG90eXBlIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbihhcmdzW2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLS1zc2wiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdXNlRW5jcnlwdGlvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKGFyZ3NbaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGNsYXNzIFRlc3RTZXJ2ZXIKKyAgICB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IF9jbGllbnRJRCA9IC0xOworICAgICAgICBwdWJsaWMgZGVsZWdhdGUgdm9pZCBUZXN0TG9nRGVsZWdhdGUoc3RyaW5nIG1zZywgcGFyYW1zIG9iamVjdFtdIHZhbHVlcyk7CisKKyAgICAgICAgcHVibGljIGNsYXNzIE15U2VydmVyRXZlbnRIYW5kbGVyIDogVFNlcnZlckV2ZW50SGFuZGxlcgorICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgaW50IGNhbGxDb3VudCA9IDA7CisKKyAgICAgICAgICAgIHB1YmxpYyBUYXNrIFByZVNlcnZlQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FsbENvdW50Kys7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRhc2suQ29tcGxldGVkVGFzazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFRhc2s8b2JqZWN0PiBDcmVhdGVDb250ZXh0QXN5bmMoVFByb3RvY29sIGlucHV0LCBUUHJvdG9jb2wgb3V0cHV0LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYWxsQ291bnQrKzsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0PG9iamVjdD4obnVsbCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBUYXNrIERlbGV0ZUNvbnRleHRBc3luYyhvYmplY3Qgc2VydmVyQ29udGV4dCwgVFByb3RvY29sIGlucHV0LCBUUHJvdG9jb2wgb3V0cHV0LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYWxsQ291bnQrKzsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGFzay5Db21wbGV0ZWRUYXNrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgVGFzayBQcm9jZXNzQ29udGV4dEFzeW5jKG9iamVjdCBzZXJ2ZXJDb250ZXh0LCBUQ2xpZW50VHJhbnNwb3J0IHRyYW5zcG9ydCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FsbENvdW50Kys7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRhc2suQ29tcGxldGVkVGFzazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBjbGFzcyBUZXN0SGFuZGxlckFzeW5jIDogVGhyaWZ0VGVzdC5JQXN5bmMKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIFRCYXNlU2VydmVyIHNlcnZlciB7IGdldDsgc2V0OyB9CisgICAgICAgICAgICBwcml2YXRlIGludCBoYW5kbGVySUQ7CisgICAgICAgICAgICBwcml2YXRlIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgcHJpdmF0ZSBUZXN0TG9nRGVsZWdhdGUgbG9nZ2VyOworCisgICAgICAgICAgICBwdWJsaWMgVGVzdEhhbmRsZXJBc3luYygpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaGFuZGxlcklEID0gSW50ZXJsb2NrZWQuSW5jcmVtZW50KHJlZiBfY2xpZW50SUQpOworICAgICAgICAgICAgICAgIGxvZ2dlciArPSB0ZXN0Q29uc29sZUxvZ2dlcjsKKyAgICAgICAgICAgICAgICBsb2dnZXIuSW52b2tlKCJOZXcgVGVzdEhhbmRsZXIgaW5zdGFuY2UgY3JlYXRlZCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc29sZUxvZ2dlcihzdHJpbmcgbXNnLCBwYXJhbXMgb2JqZWN0W10gdmFsdWVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNiLkNsZWFyKCk7CisgICAgICAgICAgICAgICAgc2IuQXBwZW5kRm9ybWF0KCJoYW5kbGVyezA6RDN9OiIsIGhhbmRsZXJJRCk7CisgICAgICAgICAgICAgICAgc2IuQXBwZW5kRm9ybWF0KG1zZywgdmFsdWVzKTsKKyAgICAgICAgICAgICAgICBzYi5BcHBlbmRMaW5lKCk7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZShzYi5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFRhc2sgdGVzdFZvaWRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2dnZXIuSW52b2tlKCJ0ZXN0Vm9pZCgpIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRhc2suQ29tcGxldGVkVGFzazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFRhc2s8c3RyaW5nPiB0ZXN0U3RyaW5nQXN5bmMoc3RyaW5nIHRoaW5nLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2dnZXIuSW52b2tlKCJ0ZXN0U3RyaW5nKHswfSkiLCB0aGluZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdCh0aGluZyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBUYXNrPGJvb2w+IHRlc3RCb29sQXN5bmMoYm9vbCB0aGluZywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9nZ2VyLkludm9rZSgidGVzdEJvb2woezB9KSIsIHRoaW5nKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KHRoaW5nKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFRhc2s8c2J5dGU+IHRlc3RCeXRlQXN5bmMoc2J5dGUgdGhpbmcsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvZ2dlci5JbnZva2UoInRlc3RCeXRlKHswfSkiLCB0aGluZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdCh0aGluZyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBUYXNrPGludD4gdGVzdEkzMkFzeW5jKGludCB0aGluZywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9nZ2VyLkludm9rZSgidGVzdEkzMih7MH0pIiwgdGhpbmcpOworICAgICAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQodGhpbmcpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgVGFzazxsb25nPiB0ZXN0STY0QXN5bmMobG9uZyB0aGluZywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9nZ2VyLkludm9rZSgidGVzdEk2NCh7MH0pIiwgdGhpbmcpOworICAgICAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQodGhpbmcpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgVGFzazxkb3VibGU+IHRlc3REb3VibGVBc3luYyhkb3VibGUgdGhpbmcsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvZ2dlci5JbnZva2UoInRlc3REb3VibGUoezB9KSIsIHRoaW5nKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KHRoaW5nKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFRhc2s8Ynl0ZVtdPiB0ZXN0QmluYXJ5QXN5bmMoYnl0ZVtdIHRoaW5nLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgaGV4ID0gQml0Q29udmVydGVyLlRvU3RyaW5nKHRoaW5nKS5SZXBsYWNlKCItIiwgc3RyaW5nLkVtcHR5KTsKKyAgICAgICAgICAgICAgICBsb2dnZXIuSW52b2tlKCJ0ZXN0QmluYXJ5KHswOlh9KSIsIGhleCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdCh0aGluZyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBUYXNrPFh0cnVjdD4gdGVzdFN0cnVjdEFzeW5jKFh0cnVjdCB0aGluZywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9nZ2VyLkludm9rZSgidGVzdFN0cnVjdCh7e1wiezB9XCIsIHsxfSwgezJ9LCB7M319fSkiLCB0aGluZy5TdHJpbmdfdGhpbmcsIHRoaW5nLkJ5dGVfdGhpbmcsIHRoaW5nLkkzMl90aGluZywgdGhpbmcuSTY0X3RoaW5nKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KHRoaW5nKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFRhc2s8WHRydWN0Mj4gdGVzdE5lc3RBc3luYyhYdHJ1Y3QyIG5lc3QsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB0aGluZyA9IG5lc3QuU3RydWN0X3RoaW5nOworICAgICAgICAgICAgICAgIGxvZ2dlci5JbnZva2UoInRlc3ROZXN0KHt7ezB9LCB7e1wiezF9XCIsIHsyfSwgezN9LCB7NH0sIHs1fX19fX0pIiwKKyAgICAgICAgICAgICAgICAgICAgbmVzdC5CeXRlX3RoaW5nLAorICAgICAgICAgICAgICAgICAgICB0aGluZy5TdHJpbmdfdGhpbmcsCisgICAgICAgICAgICAgICAgICAgIHRoaW5nLkJ5dGVfdGhpbmcsCisgICAgICAgICAgICAgICAgICAgIHRoaW5nLkkzMl90aGluZywKKyAgICAgICAgICAgICAgICAgICAgdGhpbmcuSTY0X3RoaW5nLAorICAgICAgICAgICAgICAgICAgICBuZXN0LkkzMl90aGluZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdChuZXN0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFRhc2s8RGljdGlvbmFyeTxpbnQsIGludD4+IHRlc3RNYXBBc3luYyhEaWN0aW9uYXJ5PGludCwgaW50PiB0aGluZywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2IuQ2xlYXIoKTsKKyAgICAgICAgICAgICAgICBzYi5BcHBlbmQoInRlc3RNYXAoe3siKTsKKyAgICAgICAgICAgICAgICB2YXIgZmlyc3QgPSB0cnVlOworICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBrZXkgaW4gdGhpbmcuS2V5cykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZCgiLCAiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmRGb3JtYXQoInswfSA9PiB7MX0iLCBrZXksIHRoaW5nW2tleV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzYi5BcHBlbmQoIn19KSIpOworICAgICAgICAgICAgICAgIGxvZ2dlci5JbnZva2Uoc2IuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdCh0aGluZyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBUYXNrPERpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc+PiB0ZXN0U3RyaW5nTWFwQXN5bmMoRGljdGlvbmFyeTxzdHJpbmcsIHN0cmluZz4gdGhpbmcsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNiLkNsZWFyKCk7CisgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCJ0ZXN0U3RyaW5nTWFwKHt7Iik7CisgICAgICAgICAgICAgICAgdmFyIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIga2V5IGluIHRoaW5nLktleXMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmQoIiwgIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kRm9ybWF0KCJ7MH0gPT4gezF9Iiwga2V5LCB0aGluZ1trZXldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCJ9fSkiKTsKKyAgICAgICAgICAgICAgICBsb2dnZXIuSW52b2tlKHNiLlRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQodGhpbmcpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgVGFzazxUSGFzaFNldDxpbnQ+PiB0ZXN0U2V0QXN5bmMoVEhhc2hTZXQ8aW50PiB0aGluZywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2IuQ2xlYXIoKTsKKyAgICAgICAgICAgICAgICBzYi5BcHBlbmQoInRlc3RTZXQoe3siKTsKKyAgICAgICAgICAgICAgICB2YXIgZmlyc3QgPSB0cnVlOworICAgICAgICAgICAgICAgIGZvcmVhY2ggKGludCBlbGVtIGluIHRoaW5nKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCIsICIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZEZvcm1hdCgiezB9IiwgZWxlbSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNiLkFwcGVuZCgifX0pIik7CisgICAgICAgICAgICAgICAgbG9nZ2VyLkludm9rZShzYi5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KHRoaW5nKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFRhc2s8TGlzdDxpbnQ+PiB0ZXN0TGlzdEFzeW5jKExpc3Q8aW50PiB0aGluZywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2IuQ2xlYXIoKTsKKyAgICAgICAgICAgICAgICBzYi5BcHBlbmQoInRlc3RMaXN0KHt7Iik7CisgICAgICAgICAgICAgICAgdmFyIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgZWxlbSBpbiB0aGluZykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZCgiLCAiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmRGb3JtYXQoInswfSIsIGVsZW0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzYi5BcHBlbmQoIn19KSIpOworICAgICAgICAgICAgICAgIGxvZ2dlci5JbnZva2Uoc2IuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdCh0aGluZyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBUYXNrPE51bWJlcno+IHRlc3RFbnVtQXN5bmMoTnVtYmVyeiB0aGluZywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9nZ2VyLkludm9rZSgidGVzdEVudW0oezB9KSIsIHRoaW5nKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KHRoaW5nKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFRhc2s8bG9uZz4gdGVzdFR5cGVkZWZBc3luYyhsb25nIHRoaW5nLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2dnZXIuSW52b2tlKCJ0ZXN0VHlwZWRlZih7MH0pIiwgdGhpbmcpOworICAgICAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQodGhpbmcpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgVGFzazxEaWN0aW9uYXJ5PGludCwgRGljdGlvbmFyeTxpbnQsIGludD4+PiB0ZXN0TWFwTWFwQXN5bmMoaW50IGhlbGxvLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2dnZXIuSW52b2tlKCJ0ZXN0TWFwTWFwKHswfSkiLCBoZWxsbyk7CisgICAgICAgICAgICAgICAgdmFyIG1hcG1hcCA9IG5ldyBEaWN0aW9uYXJ5PGludCwgRGljdGlvbmFyeTxpbnQsIGludD4+KCk7CisKKyAgICAgICAgICAgICAgICB2YXIgcG9zID0gbmV3IERpY3Rpb25hcnk8aW50LCBpbnQ+KCk7CisgICAgICAgICAgICAgICAgdmFyIG5lZyA9IG5ldyBEaWN0aW9uYXJ5PGludCwgaW50PigpOworICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgNTsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcG9zW2ldID0gaTsKKyAgICAgICAgICAgICAgICAgICAgbmVnWy1pXSA9IC1pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG1hcG1hcFs0XSA9IHBvczsKKyAgICAgICAgICAgICAgICBtYXBtYXBbLTRdID0gbmVnOworCisgICAgICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdChtYXBtYXApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgVGFzazxEaWN0aW9uYXJ5PGxvbmcsIERpY3Rpb25hcnk8TnVtYmVyeiwgSW5zYW5pdHk+Pj4gdGVzdEluc2FuaXR5QXN5bmMoSW5zYW5pdHkgYXJndW1lbnQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvZ2dlci5JbnZva2UoInRlc3RJbnNhbml0eSgpIik7CisKKyAgICAgICAgICAgICAgICAvKiogZnJvbSBUaHJpZnRUZXN0LnRocmlmdDoKKyAgICAgICAgICAgICAgICAgKiBTbyB5b3UgdGhpbmsgeW91J3ZlIGdvdCB0aGlzIGFsbCB3b3JrZWQsIG91dCBlaD8KKyAgICAgICAgICAgICAgICAgKgorICAgICAgICAgICAgICAgICAqIENyZWF0ZXMgYSB0aGUgcmV0dXJuZWQgbWFwIHdpdGggdGhlc2UgdmFsdWVzIGFuZCBwcmludHMgaXQgb3V0OgorICAgICAgICAgICAgICAgICAqICAgeyAxID0+IHsgMiA9PiBhcmd1bWVudCwKKyAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgIDMgPT4gYXJndW1lbnQsCisgICAgICAgICAgICAgICAgICogICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgKiAgICAgMiA9PiB7IDYgPT4gPGVtcHR5IEluc2FuaXR5IHN0cnVjdD4sIH0sCisgICAgICAgICAgICAgICAgICogICB9CisgICAgICAgICAgICAgICAgICogQHJldHVybiBtYXA8VXNlcklkLCBtYXA8TnVtYmVyeixJbnNhbml0eT4+IC0gYSBtYXAgd2l0aCB0aGUgYWJvdmUgdmFsdWVzCisgICAgICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgICAgICB2YXIgZmlyc3RfbWFwID0gbmV3IERpY3Rpb25hcnk8TnVtYmVyeiwgSW5zYW5pdHk+KCk7CisgICAgICAgICAgICAgICAgdmFyIHNlY29uZF9tYXAgPSBuZXcgRGljdGlvbmFyeTxOdW1iZXJ6LCBJbnNhbml0eT4oKTsgOworCisgICAgICAgICAgICAgICAgZmlyc3RfbWFwW051bWJlcnouVFdPXSA9IGFyZ3VtZW50OworICAgICAgICAgICAgICAgIGZpcnN0X21hcFtOdW1iZXJ6LlRIUkVFXSA9IGFyZ3VtZW50OworCisgICAgICAgICAgICAgICAgc2Vjb25kX21hcFtOdW1iZXJ6LlNJWF0gPSBuZXcgSW5zYW5pdHkoKTsKKworICAgICAgICAgICAgICAgIHZhciBpbnNhbmUgPSBuZXcgRGljdGlvbmFyeTxsb25nLCBEaWN0aW9uYXJ5PE51bWJlcnosIEluc2FuaXR5Pj4KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFsxXSA9IGZpcnN0X21hcCwKKyAgICAgICAgICAgICAgICAgICAgWzJdID0gc2Vjb25kX21hcAorICAgICAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KGluc2FuZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBUYXNrPFh0cnVjdD4gdGVzdE11bHRpQXN5bmMoc2J5dGUgYXJnMCwgaW50IGFyZzEsIGxvbmcgYXJnMiwgRGljdGlvbmFyeTxzaG9ydCwgc3RyaW5nPiBhcmczLCBOdW1iZXJ6IGFyZzQsIGxvbmcgYXJnNSwKKyAgICAgICAgICAgICAgICBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2dnZXIuSW52b2tlKCJ0ZXN0TXVsdGkoKSIpOworCisgICAgICAgICAgICAgICAgdmFyIGhlbGxvID0gbmV3IFh0cnVjdCgpOyA7CisgICAgICAgICAgICAgICAgaGVsbG8uU3RyaW5nX3RoaW5nID0gIkhlbGxvMiI7CisgICAgICAgICAgICAgICAgaGVsbG8uQnl0ZV90aGluZyA9IGFyZzA7CisgICAgICAgICAgICAgICAgaGVsbG8uSTMyX3RoaW5nID0gYXJnMTsKKyAgICAgICAgICAgICAgICBoZWxsby5JNjRfdGhpbmcgPSBhcmcyOworICAgICAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQoaGVsbG8pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgVGFzayB0ZXN0RXhjZXB0aW9uQXN5bmMoc3RyaW5nIGFyZywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9nZ2VyLkludm9rZSgidGVzdEV4Y2VwdGlvbih7MH0pIiwgYXJnKTsKKyAgICAgICAgICAgICAgICBpZiAoYXJnID09ICJYY2VwdGlvbiIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgeCA9IG5ldyBYY2VwdGlvbgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBFcnJvckNvZGUgPSAxMDAxLAorICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9IGFyZworICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgICB0aHJvdyB4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoYXJnID09ICJURXhjZXB0aW9uIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBUYXNrLkNvbXBsZXRlZFRhc2s7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBUYXNrPFh0cnVjdD4gdGVzdE11bHRpRXhjZXB0aW9uQXN5bmMoc3RyaW5nIGFyZzAsIHN0cmluZyBhcmcxLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2dnZXIuSW52b2tlKCJ0ZXN0TXVsdGlFeGNlcHRpb24oezB9LCB7MX0pIiwgYXJnMCwgYXJnMSk7CisgICAgICAgICAgICAgICAgaWYgKGFyZzAgPT0gIlhjZXB0aW9uIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciB4ID0gbmV3IFhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yQ29kZSA9IDEwMDEsCisgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0gIlRoaXMgaXMgYW4gWGNlcHRpb24iCisgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgIHRocm93IHg7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGFyZzAgPT0gIlhjZXB0aW9uMiIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgeCA9IG5ldyBYY2VwdGlvbjIKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlID0gMjAwMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cnVjdF90aGluZyA9IG5ldyBYdHJ1Y3QgeyBTdHJpbmdfdGhpbmcgPSAiVGhpcyBpcyBhbiBYY2VwdGlvbjIiIH0KKyAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgeDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gbmV3IFh0cnVjdCB7IFN0cmluZ190aGluZyA9IGFyZzEgfTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KHJlc3VsdCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBUYXNrIHRlc3RPbmV3YXlBc3luYyhpbnQgc2Vjb25kc1RvU2xlZXAsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvZ2dlci5JbnZva2UoInRlc3RPbmV3YXkoezB9KSwgc2xlZXBpbmcuLi4iLCBzZWNvbmRzVG9TbGVlcCk7CisgICAgICAgICAgICAgICAgVGFzay5EZWxheShzZWNvbmRzVG9TbGVlcCAqIDEwMDAsIGNhbmNlbGxhdGlvblRva2VuKS5HZXRBd2FpdGVyKCkuR2V0UmVzdWx0KCk7CisgICAgICAgICAgICAgICAgbG9nZ2VyLkludm9rZSgidGVzdE9uZXdheSBmaW5pc2hlZCIpOworCisgICAgICAgICAgICAgICAgcmV0dXJuIFRhc2suQ29tcGxldGVkVGFzazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGludGVybmFsIHN0YXRpYyB2b2lkIFByaW50T3B0aW9uc0hlbHAoKQorICAgICAgICB7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiU2VydmVyIG9wdGlvbnM6Iik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiICAtLXBpcGU9PHBpcGUgbmFtZT4iKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgIC0tcG9ydD08cG9ydCBudW1iZXI+Iik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiICAtLXRyYW5zcG9ydD08dHJhbnNwb3J0IG5hbWU+ICAgIG9uZSBvZiBidWZmZXJlZCxmcmFtZWQgIChkZWZhdWx0cyB0byBub25lKSIpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiAgLS1wcm90b2NvbD08cHJvdG9jb2wgbmFtZT4gICAgICBvbmUgb2YgY29tcGFjdCxqc29uICAoZGVmYXVsdHMgdG8gYmluYXJ5KSIpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiAgLS1zZXJ2ZXItdHlwZT08dHlwZT4gICAgICAgICAgICBvbmUgb2YgdGhyZWFkZWQsdGhyZWFkcG9vbCAgKGRlZmF1bHRzIHRvIHNpbXBsZSkiKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgIC0tcHJvY2Vzc29yPTxwcm90b3R5cGU+Iik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiICAtLXNzbCIpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIFg1MDlDZXJ0aWZpY2F0ZTIgR2V0U2VydmVyQ2VydCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBzZXJ2ZXJDZXJ0TmFtZSA9ICJzZXJ2ZXIucDEyIjsKKyAgICAgICAgICAgIHZhciBwb3NzaWJsZVBhdGhzID0gbmV3IExpc3Q8c3RyaW5nPgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICIuLi8uLi8uLi9rZXlzLyIsCisgICAgICAgICAgICAgICAgIi4uLy4uL2tleXMvIiwKKyAgICAgICAgICAgICAgICAiLi4va2V5cy8iLAorICAgICAgICAgICAgICAgICJrZXlzLyIsCisgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBzdHJpbmcgZXhpc3RpbmdQYXRoID0gbnVsbDsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBwb3NzaWJsZVBhdGggaW4gcG9zc2libGVQYXRocykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgcGF0aCA9IFBhdGguR2V0RnVsbFBhdGgocG9zc2libGVQYXRoICsgc2VydmVyQ2VydE5hbWUpOworICAgICAgICAgICAgICAgIGlmIChGaWxlLkV4aXN0cyhwYXRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nUGF0aCA9IHBhdGg7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KGV4aXN0aW5nUGF0aCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbigkIkNhbm5vdCBmaW5kIGZpbGU6IHtzZXJ2ZXJDZXJ0TmFtZX0iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgdmFyIGNlcnQgPSBuZXcgWDUwOUNlcnRpZmljYXRlMihleGlzdGluZ1BhdGgsICJ0aHJpZnQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgcmV0dXJuIGNlcnQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIGludCBFeGVjdXRlKExpc3Q8c3RyaW5nPiBhcmdzKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgbG9nZ2VyRmFjdG9yeSA9IG5ldyBMb2dnZXJGYWN0b3J5KCk7Ly8uQWRkQ29uc29sZSgpLkFkZERlYnVnKCk7CisgICAgICAgICAgICB2YXIgbG9nZ2VyID0gbmV3IExvZ2dlckZhY3RvcnkoKS5DcmVhdGVMb2dnZXIoIlRlc3QiKTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHBhcmFtID0gbmV3IFNlcnZlclBhcmFtKCk7CisKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBhcmFtLlBhcnNlKGFyZ3MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJFcnJvciB3aGlsZSAgcGFyc2luZyBhcmd1bWVudHMiKTsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZXguTWVzc2FnZSArICIgU1Q6ICIgKyBleC5TdGFja1RyYWNlKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAvLyBUcmFuc3BvcnQKKyAgICAgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHRyYW5zOworICAgICAgICAgICAgICAgIGlmIChwYXJhbS5waXBlICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0cmFucyA9IG5ldyBUTmFtZWRQaXBlU2VydmVyVHJhbnNwb3J0KHBhcmFtLnBpcGUpOworICAgICAgICAgICAgICAgIH0KKy8vICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtLnVzZUZyYW1lZCkKKy8vICAgICAgICAgICAgICAgIHsKKy8vICAgICAgICAgICAgICAgICAgICB0cmFucyA9IG5ldyBUU2VydmVyRnJhbWVkVHJhbnNwb3J0KHBhcmFtLnBvcnQpOworLy8gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbS51c2VFbmNyeXB0aW9uKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2VydCA9IEdldFNlcnZlckNlcnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNlcnQgPT0gbnVsbCB8fCAhY2VydC5IYXNQcml2YXRlS2V5KQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJDZXJ0aWZpY2F0ZSBkb2Vzbid0IGNvbnRhaW4gcHJpdmF0ZSBrZXkiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSBuZXcgVFRsc1NlcnZlclNvY2tldFRyYW5zcG9ydChwYXJhbS5wb3J0LCBwYXJhbS51c2VCdWZmZXJlZFNvY2tldHMsIHBhcmFtLnVzZUZyYW1lZCwgY2VydCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbmRlciwgY2VydGlmaWNhdGUsIGNoYWluLCBlcnJvcnMpID0+IHRydWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIFNzbFByb3RvY29scy5UbHMgfCBTc2xQcm90b2NvbHMuVGxzMTEgfCBTc2xQcm90b2NvbHMuVGxzMTIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSBuZXcgVFNlcnZlclNvY2tldFRyYW5zcG9ydChwYXJhbS5wb3J0LCAwLCBwYXJhbS51c2VCdWZmZXJlZFNvY2tldHMsIHBhcmFtLnVzZUZyYW1lZCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBJVFByb3RvY29sRmFjdG9yeSBwcm90bzsKKyAgICAgICAgICAgICAgICBpZiAocGFyYW0uY29tcGFjdCkKKyAgICAgICAgICAgICAgICAgICAgcHJvdG8gPSBuZXcgVENvbXBhY3RQcm90b2NvbC5GYWN0b3J5KCk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAocGFyYW0uanNvbikKKyAgICAgICAgICAgICAgICAgICAgcHJvdG8gPSBuZXcgVEpzb25Qcm90b2NvbC5GYWN0b3J5KCk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBwcm90byA9IG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpOworCisgICAgICAgICAgICAgICAgSVRQcm9jZXNzb3JGYWN0b3J5IHByb2Nlc3NvckZhY3Rvcnk7CisKKyAgICAgICAgICAgICAgICAvLyBQcm9jZXNzb3IKKyAgICAgICAgICAgICAgICB2YXIgdGVzdEhhbmRsZXIgPSBuZXcgVGVzdEhhbmRsZXJBc3luYygpOworICAgICAgICAgICAgICAgIHZhciB0ZXN0UHJvY2Vzc29yID0gbmV3IFRocmlmdFRlc3QuQXN5bmNQcm9jZXNzb3IodGVzdEhhbmRsZXIpOworICAgICAgICAgICAgICAgIHByb2Nlc3NvckZhY3RvcnkgPSBuZXcgU2luZ2xldG9uVFByb2Nlc3NvckZhY3RvcnkodGVzdFByb2Nlc3Nvcik7CisKKyAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSB0cmFuc0ZhY3RvcnkgPSBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKTsgCisKKyAgICAgICAgICAgICAgICBUQmFzZVNlcnZlciBzZXJ2ZXJFbmdpbmUgPSBuZXcgQXN5bmNCYXNlU2VydmVyKHByb2Nlc3NvckZhY3RvcnksIHRyYW5zLCB0cmFuc0ZhY3RvcnksIHRyYW5zRmFjdG9yeSwgcHJvdG8sIHByb3RvLCBsb2dnZXIpOworCisgICAgICAgICAgICAgICAgLy9TZXJ2ZXIgZXZlbnQgaGFuZGxlcgorICAgICAgICAgICAgICAgIHZhciBzZXJ2ZXJFdmVudHMgPSBuZXcgTXlTZXJ2ZXJFdmVudEhhbmRsZXIoKTsKKyAgICAgICAgICAgICAgICBzZXJ2ZXJFbmdpbmUuU2V0RXZlbnRIYW5kbGVyKHNlcnZlckV2ZW50cyk7CisKKyAgICAgICAgICAgICAgICAvLyBSdW4gaXQKKyAgICAgICAgICAgICAgICB2YXIgd2hlcmUgPSAoISBzdHJpbmcuSXNOdWxsT3JFbXB0eShwYXJhbS5waXBlKSkgPyAib24gcGlwZSAiICsgcGFyYW0ucGlwZSA6ICJvbiBwb3J0ICIgKyBwYXJhbS5wb3J0OworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJTdGFydGluZyB0aGUgQXN5bmNCYXNlU2VydmVyICIgKyB3aGVyZSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiB3aXRoIHByb2Nlc3NvciBUUHJvdG90eXBlUHJvY2Vzc29yRmFjdG9yeSBwcm90b3R5cGUgZmFjdG9yeSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGFyYW0udXNlQnVmZmVyZWRTb2NrZXRzID8gIiB3aXRoIGJ1ZmZlcmVkIHNvY2tldCIgOiAiIikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYXJhbS51c2VGcmFtZWQgPyAiIHdpdGggZnJhbWVkIHRyYW5zcG9ydCIgOiAiIikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYXJhbS51c2VFbmNyeXB0aW9uID8gIiB3aXRoIGVuY3J5cHRpb24iIDogIiIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGFyYW0uY29tcGFjdCA/ICIgd2l0aCBjb21wYWN0IHByb3RvY29sIiA6ICIiKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhcmFtLmpzb24gPyAiIHdpdGgganNvbiBwcm90b2NvbCIgOiAiIikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuLi4iKTsKKyAgICAgICAgICAgICAgICBzZXJ2ZXJFbmdpbmUuU2VydmVBc3luYyhDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKS5HZXRBd2FpdGVyKCkuR2V0UmVzdWx0KCk7CisgICAgICAgICAgICAgICAgQ29uc29sZS5SZWFkTGluZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiB4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuRXJyb3IuV3JpdGUoeCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiZG9uZS4iKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0L25ldGNvcmUvVGhyaWZ0VGVzdC5zbG4gYi90ZXN0L25ldGNvcmUvVGhyaWZ0VGVzdC5zbG4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFiMjQxYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbmV0Y29yZS9UaHJpZnRUZXN0LnNsbgpAQCAtMCwwICsxLDY0IEBACivvu79NaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBTb2x1dGlvbiBGaWxlLCBGb3JtYXQgVmVyc2lvbiAxMi4wMAorIyBWaXN1YWwgU3R1ZGlvIDE1CitWaXN1YWxTdHVkaW9WZXJzaW9uID0gMTUuMC4yNjczMC4xMgorTWluaW11bVZpc3VhbFN0dWRpb1ZlcnNpb24gPSAxMC4wLjQwMjE5LjEKK1Byb2plY3QoIns5QTE5MTAzRi0xNkY3LTQ2NjgtQkU1NC05QTFFN0E0Rjc1NTZ9IikgPSAiVGhyaWZ0IiwgIi4uXC4uXGxpYlxuZXRjb3JlXFRocmlmdFxUaHJpZnQuY3Nwcm9qIiwgIntDMjBFQTJBOS03NjYwLTQ3REUtOUE0OS1EMUVGMTJGQjI4OTV9IgorRW5kUHJvamVjdAorUHJvamVjdCgie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iKSA9ICJDbGllbnQiLCAiQ2xpZW50XENsaWVudC5jc3Byb2oiLCAiezIxMDM5RjI1LTZFRDctNEU4MC1BNTQ1LUVCQzkzNDcyRUJEMX0iCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSIpID0gIlNlcnZlciIsICJTZXJ2ZXJcU2VydmVyLmNzcHJvaiIsICJ7MEM2RTg2ODUtRjE5MS00NDc5LTk4NDItODgyQTM4OTYxMTI3fSIKK0VuZFByb2plY3QKK0dsb2JhbAorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Db25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHByZVNvbHV0aW9uCisJCURlYnVnfEFueSBDUFUgPSBEZWJ1Z3xBbnkgQ1BVCisJCURlYnVnfHg2NCA9IERlYnVnfHg2NAorCQlEZWJ1Z3x4ODYgPSBEZWJ1Z3x4ODYKKwkJUmVsZWFzZXxBbnkgQ1BVID0gUmVsZWFzZXxBbnkgQ1BVCisJCVJlbGVhc2V8eDY0ID0gUmVsZWFzZXx4NjQKKwkJUmVsZWFzZXx4ODYgPSBSZWxlYXNlfHg4NgorCUVuZEdsb2JhbFNlY3Rpb24KKwlHbG9iYWxTZWN0aW9uKFByb2plY3RDb25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHBvc3RTb2x1dGlvbgorCQl7QzIwRUEyQTktNzY2MC00N0RFLTlBNDktRDFFRjEyRkIyODk1fS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7QzIwRUEyQTktNzY2MC00N0RFLTlBNDktRDFFRjEyRkIyODk1fS5EZWJ1Z3x4NjQuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7QzIwRUEyQTktNzY2MC00N0RFLTlBNDktRDFFRjEyRkIyODk1fS5EZWJ1Z3x4NjQuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uRGVidWd8eDg2LkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uRGVidWd8eDg2LkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtDMjBFQTJBOS03NjYwLTQ3REUtOUE0OS1EMUVGMTJGQjI4OTV9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uUmVsZWFzZXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtDMjBFQTJBOS03NjYwLTQ3REUtOUE0OS1EMUVGMTJGQjI4OTV9LlJlbGVhc2V8eDY0LkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uUmVsZWFzZXx4ODYuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtDMjBFQTJBOS03NjYwLTQ3REUtOUE0OS1EMUVGMTJGQjI4OTV9LlJlbGVhc2V8eDg2LkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJezIxMDM5RjI1LTZFRDctNEU4MC1BNTQ1LUVCQzkzNDcyRUJEMX0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXsyMTAzOUYyNS02RUQ3LTRFODAtQTU0NS1FQkM5MzQ3MkVCRDF9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJezIxMDM5RjI1LTZFRDctNEU4MC1BNTQ1LUVCQzkzNDcyRUJEMX0uRGVidWd8eDY0LkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJezIxMDM5RjI1LTZFRDctNEU4MC1BNTQ1LUVCQzkzNDcyRUJEMX0uRGVidWd8eDY0LkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXsyMTAzOUYyNS02RUQ3LTRFODAtQTU0NS1FQkM5MzQ3MkVCRDF9LkRlYnVnfHg4Ni5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXsyMTAzOUYyNS02RUQ3LTRFODAtQTU0NS1FQkM5MzQ3MkVCRDF9LkRlYnVnfHg4Ni5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7MjEwMzlGMjUtNkVENy00RTgwLUE1NDUtRUJDOTM0NzJFQkQxfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXsyMTAzOUYyNS02RUQ3LTRFODAtQTU0NS1FQkM5MzQ3MkVCRDF9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXsyMTAzOUYyNS02RUQ3LTRFODAtQTU0NS1FQkM5MzQ3MkVCRDF9LlJlbGVhc2V8eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7MjEwMzlGMjUtNkVENy00RTgwLUE1NDUtRUJDOTM0NzJFQkQxfS5SZWxlYXNlfHg2NC5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXsyMTAzOUYyNS02RUQ3LTRFODAtQTU0NS1FQkM5MzQ3MkVCRDF9LlJlbGVhc2V8eDg2LkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7MjEwMzlGMjUtNkVENy00RTgwLUE1NDUtRUJDOTM0NzJFQkQxfS5SZWxlYXNlfHg4Ni5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXswQzZFODY4NS1GMTkxLTQ0NzktOTg0Mi04ODJBMzg5NjExMjd9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7MEM2RTg2ODUtRjE5MS00NDc5LTk4NDItODgyQTM4OTYxMTI3fS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXswQzZFODY4NS1GMTkxLTQ0NzktOTg0Mi04ODJBMzg5NjExMjd9LkRlYnVnfHg2NC5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXswQzZFODY4NS1GMTkxLTQ0NzktOTg0Mi04ODJBMzg5NjExMjd9LkRlYnVnfHg2NC5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7MEM2RTg2ODUtRjE5MS00NDc5LTk4NDItODgyQTM4OTYxMTI3fS5EZWJ1Z3x4ODYuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7MEM2RTg2ODUtRjE5MS00NDc5LTk4NDItODgyQTM4OTYxMTI3fS5EZWJ1Z3x4ODYuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJezBDNkU4Njg1LUYxOTEtNDQ3OS05ODQyLTg4MkEzODk2MTEyN30uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7MEM2RTg2ODUtRjE5MS00NDc5LTk4NDItODgyQTM4OTYxMTI3fS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7MEM2RTg2ODUtRjE5MS00NDc5LTk4NDItODgyQTM4OTYxMTI3fS5SZWxlYXNlfHg2NC5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJezBDNkU4Njg1LUYxOTEtNDQ3OS05ODQyLTg4MkEzODk2MTEyN30uUmVsZWFzZXx4NjQuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7MEM2RTg2ODUtRjE5MS00NDc5LTk4NDItODgyQTM4OTYxMTI3fS5SZWxlYXNlfHg4Ni5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJezBDNkU4Njg1LUYxOTEtNDQ3OS05ODQyLTg4MkEzODk2MTEyN30uUmVsZWFzZXx4ODYuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCUVuZEdsb2JhbFNlY3Rpb24KKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uUHJvcGVydGllcykgPSBwcmVTb2x1dGlvbgorCQlIaWRlU29sdXRpb25Ob2RlID0gRkFMU0UKKwlFbmRHbG9iYWxTZWN0aW9uCisJR2xvYmFsU2VjdGlvbihFeHRlbnNpYmlsaXR5R2xvYmFscykgPSBwb3N0U29sdXRpb24KKwkJU29sdXRpb25HdWlkID0gezUyQ0U5QTEyLUY2Q0ItNEYwQy1CQjQyLTAxMDU2MTJGNUZGNH0KKwlFbmRHbG9iYWxTZWN0aW9uCitFbmRHbG9iYWwKZGlmZiAtLWdpdCBhL3Rlc3QvbmV0Y29yZS9idWlsZC5jbWQgYi90ZXN0L25ldGNvcmUvYnVpbGQuY21kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliODRlZjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L25ldGNvcmUvYnVpbGQuY21kCkBAIC0wLDAgKzEsMjUgQEAKK0BlY2hvIG9mZgorcmVtIC8qCityZW0gICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorcmVtICAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCityZW0gICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlbSAgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK3JlbSAgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCityZW0gICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorcmVtICAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorcmVtICAqCityZW0gICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKK3JlbSAgKgorcmVtICAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3JlbSAgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorcmVtICAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorcmVtICAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCityZW0gICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworcmVtICAqIHVuZGVyIHRoZSBMaWNlbnNlLgorcmVtICAqLworc2V0bG9jYWwKKworZG90bmV0IC0taW5mbworZG90bmV0IGJ1aWxkCisKKzplb2YKZGlmZiAtLWdpdCBhL3Rlc3QvbmV0Y29yZS9idWlsZC5zaCBiL3Rlc3QvbmV0Y29yZS9idWlsZC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jOTdlMzEwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9uZXRjb3JlL2J1aWxkLnNoCkBAIC0wLDAgKzEsMjYgQEAKKyMhL3Vzci9iaW4vZW52IGJhc2gKKworIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyNleGl0IGlmIGFueSBjb21tYW5kIGZhaWxzCitzZXQgLWUKKworZG90bmV0IC0taW5mbworZG90bmV0IGJ1aWxkCmRpZmYgLS1naXQgYS90ZXN0L29jYW1sL3NlcnZlci9UZXN0U2VydmVyLm1sIGIvdGVzdC9vY2FtbC9zZXJ2ZXIvVGVzdFNlcnZlci5tbAppbmRleCAzZjVjOWVlLi5lZmUwZjRiIDEwMDY0NAotLS0gYS90ZXN0L29jYW1sL3NlcnZlci9UZXN0U2VydmVyLm1sCisrKyBiL3Rlc3Qvb2NhbWwvc2VydmVyL1Rlc3RTZXJ2ZXIubWwKQEAgLTM2LDYgKzM2LDcgQEAKICAgbWV0aG9kIHRlc3RJMzIgeCA9IHAgInRlc3RJMzIoJWQpXG4iIChzb2QgeCk7IChzb2QgeCkKICAgbWV0aG9kIHRlc3RJNjQgeCA9IHAgInRlc3RJNjQoJXMpXG4iIChJbnQ2NC50b19zdHJpbmcgKHNvZCB4KSk7IChzb2QgeCkKICAgbWV0aG9kIHRlc3REb3VibGUgeCA9IHAgInRlc3REb3VibGUoJWYpXG4iIChzb2QgeCk7IChzb2QgeCkKKyAgbWV0aG9kIHRlc3RCaW5hcnkgeCA9IHAgInRlc3RCaW5hcnkoJXMpXG4iIChzb2QgeCk7IChzb2QgeCkKICAgbWV0aG9kIHRlc3RTdHJ1Y3QgeCA9IHAgInRlc3RTdHJ1Y3QoLS0tKVxuIjsgKHNvZCB4KQogICBtZXRob2QgdGVzdE5lc3QgeCA9IHAgInRlc3ROZXN0KC0tLSlcbiI7IChzb2QgeCkKICAgbWV0aG9kIHRlc3RNYXAgeCA9IHAgInRlc3RNYXAoLS0tKVxuIjsgKHNvZCB4KQpkaWZmIC0tZ2l0IGEvdGVzdC9wZXJsL01ha2VmaWxlLmFtIGIvdGVzdC9wZXJsL01ha2VmaWxlLmFtCmluZGV4IDI5MTEwNmIuLjE2NWI5YTcgMTAwNjQ0Ci0tLSBhL3Rlc3QvcGVybC9NYWtlZmlsZS5hbQorKysgYi90ZXN0L3BlcmwvTWFrZWZpbGUuYW0KQEAgLTE3LDExICsxNywxMSBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotVEhSSUZUID0gJCh0b3Bfc3JjZGlyKS9jb21waWxlci9jcHAvdGhyaWZ0Ci0KIHN0dWJzOiAuLi9UaHJpZnRUZXN0LnRocmlmdAogCSQoVEhSSUZUKSAtLWdlbiBwZXJsIC4uL1RocmlmdFRlc3QudGhyaWZ0CiAKK3ByZWNyb3NzOiBzdHVicworCiBjaGVjazogc3R1YnMKIAogY2xlYW4tbG9jYWw6CmRpZmYgLS1naXQgYS90ZXN0L3BlcmwvVGVzdENsaWVudC5wbCBiL3Rlc3QvcGVybC9UZXN0Q2xpZW50LnBsCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggYWY4MGQ0Ni4uOTZlM2JlYwotLS0gYS90ZXN0L3BlcmwvVGVzdENsaWVudC5wbAorKysgYi90ZXN0L3BlcmwvVGVzdENsaWVudC5wbApAQCAtMTksMTAgKzE5LDExIEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1yZXF1aXJlIDUuNi4wOwordXNlIDUuMTAuMDsKIHVzZSBzdHJpY3Q7CiB1c2Ugd2FybmluZ3M7CiB1c2UgRGF0YTo6RHVtcGVyOwordXNlIEdldG9wdDo6TG9uZyBxdyhHZXRPcHRpb25zKTsKIHVzZSBUaW1lOjpIaVJlcyBxdyhnZXR0aW1lb2ZkYXkpOwogCiB1c2UgbGliICcuLi8uLi9saWIvcGVybC9saWInOwpAQCAtMzAsMTA0ICszMSwyMjcgQEAKIAogdXNlIFRocmlmdDsKIHVzZSBUaHJpZnQ6OkJpbmFyeVByb3RvY29sOwotdXNlIFRocmlmdDo6U29ja2V0OwogdXNlIFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnQ7Cit1c2UgVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnQ7Cit1c2UgVGhyaWZ0OjpNdWx0aXBsZXhlZFByb3RvY29sOwordXNlIFRocmlmdDo6U1NMU29ja2V0OwordXNlIFRocmlmdDo6U29ja2V0OwordXNlIFRocmlmdDo6VW5peFNvY2tldDsKIAordXNlIFRocmlmdFRlc3Q6OlNlY29uZFNlcnZpY2U7CiB1c2UgVGhyaWZ0VGVzdDo6VGhyaWZ0VGVzdDsKIHVzZSBUaHJpZnRUZXN0OjpUeXBlczsKIAogJHwrKzsKIAotbXkgJGhvc3QgPSAnbG9jYWxob3N0JzsKLW15ICRwb3J0ID0gOTA5MDsKK3N1YiB1c2FnZSB7CisgICAgcHJpbnQgPDwiRU9GIjsKK1VzYWdlOiAkMCBbT1BUSU9OU10KIAorT3B0aW9uczogICAgICAgICAgICAgICAgICAgICAgICAgIChkZWZhdWx0KQorICAtLWNhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQSB0byB2YWxpZGF0ZSBzZXJ2ZXIgd2l0aC4KKyAgLS1jZXJ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2VydGlmaWNhdGUgdG8gdXNlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXF1aXJlZCBpZiB1c2luZyAtLXNzbC4KKyAgLS1jaXBoZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWNjZXB0YWJsZSBjaXBoZXIgbGlzdC4KKyAgLS1kb21haW4tc29ja2V0IDxmaWxlPiAgICAgICAgICAgICAgICAgICAgICAgVXNlIGEgdW5peCBkb21haW4gc29ja2V0LgorICAtLWhlbHAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaG93IHVzYWdlLgorICAtLWtleSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDZXJ0aWZpY2F0ZSBrZXkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVpcmVkIGlmIHVzaW5nIC0tc3NsLgorICAtLXBvcnQgPHBvcnRudW0+ICAgICAgICAgICAgICAgIDkwOTAgICAgICAgICBQb3J0IHRvIHVzZS4KKyAgLS1wcm90b2NvbCB7YmluYXJ5fSAgICAgICAgICAgICBiaW5hcnkgICAgICAgUHJvdG9jb2wgdG8gdXNlLgorICAtLXNzbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBwcmVzZW50LCB1c2UgU1NMLgorICAtLXRyYW5zcG9ydCB7YnVmZmVyZWR8ZnJhbWVkfSAgIGJ1ZmZlcmVkICAgICBUcmFuc3BvcnQgdG8gdXNlLgogCi1teSAkc29ja2V0ID0gbmV3IFRocmlmdDo6U29ja2V0KCRob3N0LCAkcG9ydCk7CitFT0YKK30KIAotbXkgJGJ1ZmZlcmVkU29ja2V0ID0gbmV3IFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnQoJHNvY2tldCwgMTAyNCwgMTAyNCk7Ci1teSAkdHJhbnNwb3J0ID0gJGJ1ZmZlcmVkU29ja2V0OwotbXkgJHByb3RvY29sID0gbmV3IFRocmlmdDo6QmluYXJ5UHJvdG9jb2woJHRyYW5zcG9ydCk7Ci1teSAkdGVzdENsaWVudCA9IG5ldyBUaHJpZnRUZXN0OjpUaHJpZnRUZXN0Q2xpZW50KCRwcm90b2NvbCk7CitteSAlb3B0cyA9ICgKKyAgICAncG9ydCcgPT4gOTA5MCwKKyAgICAncHJvdG9jb2wnID0+ICdiaW5hcnknLAorICAgICd0cmFuc3BvcnQnID0+ICdidWZmZXJlZCcKKyk7CiAKLWV2YWx7Ci0kdHJhbnNwb3J0LT5vcGVuKCk7Ci19OyBpZigkQCl7CitHZXRPcHRpb25zKFwlb3B0cywgcXcgKAorICAgIGNhPXMKKyAgICBjZXJ0PXMKKyAgICBjaXBoZXJzPXMKKyAgICBrZXk9cworICAgIGRvbWFpbi1zb2NrZXQ9cworICAgIGhlbHAKKyAgICBob3N0PXMKKyAgICBwb3J0PWkKKyAgICBwcm90b2NvbD1zCisgICAgc3NsCisgICAgdHJhbnNwb3J0PXMKKykpIHx8IGV4aXQgMTsKKworaWYgKCRvcHRze2hlbHB9KSB7CisgICAgdXNhZ2UoKTsKKyAgICBleGl0IDA7Cit9CisKK215ICRzb2NrZXQgPSB1bmRlZjsKK2lmICgkb3B0c3snZG9tYWluLXNvY2tldCd9KSB7CisgICAgJHNvY2tldCA9IFRocmlmdDo6VW5peFNvY2tldC0+bmV3KCRvcHRzeydkb21haW4tc29ja2V0J30pOworfQorZWxzaWYgKCRvcHRze3NzbH0pIHsKKyAgJHNvY2tldCA9IFRocmlmdDo6U1NMU29ja2V0LT5uZXcoXCVvcHRzKTsKK30KK2Vsc2UgeworICAkc29ja2V0ID0gVGhyaWZ0OjpTb2NrZXQtPm5ldygkb3B0c3tob3N0fSwgJG9wdHN7cG9ydH0pOworfQorCitteSAkdHJhbnNwb3J0OworaWYgKCRvcHRze3RyYW5zcG9ydH0gZXEgJ2J1ZmZlcmVkJykgeworICAgICR0cmFuc3BvcnQgPSBUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0LT5uZXcoJHNvY2tldCwgMTAyNCwgMTAyNCk7Cit9CitlbHNpZiAoJG9wdHN7dHJhbnNwb3J0fSBlcSAnZnJhbWVkJykgeworICAgICR0cmFuc3BvcnQgPSBUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydC0+bmV3KCRzb2NrZXQpOworfQorZWxzZSB7CisgICAgdXNhZ2UoKTsKKyAgICBleGl0IDE7Cit9CisKK215ICRwcm90b2NvbDsKK215ICRwcm90b2NvbDI7CitpZiAoJG9wdHN7cHJvdG9jb2x9IGVxICdiaW5hcnknIHx8ICRvcHRze3Byb3RvY29sfSBlcSAnbXVsdGknKSB7CisgICAgJHByb3RvY29sID0gVGhyaWZ0OjpCaW5hcnlQcm90b2NvbC0+bmV3KCR0cmFuc3BvcnQpOworfQorZWxzZSB7CisgICAgdXNhZ2UoKTsKKyAgICBleGl0IDE7Cit9CisKK215ICRzZWNvbmRTZXJ2aWNlID0gdW5kZWY7CitpZiAoaW5kZXgoJG9wdHN7cHJvdG9jb2x9LCAnbXVsdGknKSA9PSAwKSB7CisgICRwcm90b2NvbDIgICAgID0gVGhyaWZ0OjpNdWx0aXBsZXhlZFByb3RvY29sLT5uZXcoJHByb3RvY29sLCAnU2Vjb25kU2VydmljZScpOworICAkcHJvdG9jb2wgICAgICA9IFRocmlmdDo6TXVsdGlwbGV4ZWRQcm90b2NvbC0+bmV3KCRwcm90b2NvbCwgJ1RocmlmdFRlc3QnKTsKKyAgJHNlY29uZFNlcnZpY2UgPSBUaHJpZnRUZXN0OjpTZWNvbmRTZXJ2aWNlQ2xpZW50LT5uZXcoJHByb3RvY29sMik7Cit9CisKK215ICR0ZXN0Q2xpZW50ID0gVGhyaWZ0VGVzdDo6VGhyaWZ0VGVzdENsaWVudC0+bmV3KCRwcm90b2NvbCk7CisKK2V2YWwgeworICAkdHJhbnNwb3J0LT5vcGVuKCk7Cit9OworaWYoJEApewogICAgIGRpZShEdW1wZXIoJEApKTsKIH0KKwordXNlIGNvbnN0YW50IEVSUl9CQVNFVFlQRVMgPT4gMTsKK3VzZSBjb25zdGFudCBFUlJfU1RSVUNUUyA9PiAyOwordXNlIGNvbnN0YW50IEVSUl9DT05UQUlORVJTID0+IDQ7Cit1c2UgY29uc3RhbnQgRVJSX0VYQ0VQVElPTlMgPT4gODsKK3VzZSBjb25zdGFudCBFUlJfUFJPVE9DT0wgPT4gMTY7Cit1c2UgY29uc3RhbnQgRVJSX1VOS05PV04gPT4gNjQ7CisKIG15ICRzdGFydCA9IGdldHRpbWVvZmRheSgpOwogCiAjCiAjIFZPSUQgVEVTVAogIwotcHJpbnQoInRlc3RWb2lkKCkiKTsKK3ByaW50KCd0ZXN0Vm9pZCgpJyk7CiAkdGVzdENsaWVudC0+dGVzdFZvaWQoKTsKIHByaW50KCIgPSB2b2lkXG4iKTsKIAogIwogIyBTVFJJTkcgVEVTVAogIwotcHJpbnQoInRlc3RTdHJpbmcoXCJUZXN0XCIpIik7Ci1teSAkcyA9ICR0ZXN0Q2xpZW50LT50ZXN0U3RyaW5nKCJUZXN0Iik7Ci1wcmludCgiID0gXCIkc1wiXG4iKTsKK3ByaW50KCd0ZXN0U3RyaW5nKCJUZXN0IiknKTsKK215ICRzID0gJHRlc3RDbGllbnQtPnRlc3RTdHJpbmcoJ1Rlc3QnKTsKK3ByaW50KHFxfCA9ICIkcyJcbnwpOworZXhpdChFUlJfQkFTRVRZUEVTKSBpZiAoJHMgbmUgJ1Rlc3QnKTsKKworIworIyBNVUxUSVBMRVhFRCBURVNUCisjCitpZiAoaW5kZXgoJG9wdHN7cHJvdG9jb2x9LCAnbXVsdGknKSA9PSAwKSB7CisgICAgcHJpbnQoJ3NlY29uZHRlc3RTdHJpbmcoIlRlc3QyIiknKTsKKyAgICAkcyA9ICRzZWNvbmRTZXJ2aWNlLT5zZWNvbmR0ZXN0U3RyaW5nKCdUZXN0MicpOworICAgIHByaW50KHFxfCA9ICIkcyJcbnwpOworICAgIGV4aXQoRVJSX1BST1RPQ09MKSBpZiAoJHMgbmUgJ3Rlc3RTdHJpbmcoIlRlc3QyIiknKTsKK30KKworIworIyBCT09MIFRFU1QKKyMKK3ByaW50KCd0ZXN0Qm9vbCgxKScpOworbXkgJHQgPSAkdGVzdENsaWVudC0+dGVzdEJvb2woMSk7CitwcmludCgiID0gJHRcbiIpOworZXhpdChFUlJfQkFTRVRZUEVTKSBpZiAoJHQgbmUgMSk7CitwcmludCgndGVzdEJvb2woMCknKTsKK215ICRmID0gJHRlc3RDbGllbnQtPnRlc3RCb29sKDApOworcHJpbnQoIiA9ICRmXG4iKTsKK2V4aXQoRVJSX0JBU0VUWVBFUykgaWYgKCRmIG5lIHF8fCk7CisKIAogIwogIyBCWVRFIFRFU1QKICMKLXByaW50KCJ0ZXN0Qnl0ZSgxKSIpOworcHJpbnQoJ3Rlc3RCeXRlKDEpJyk7CiBteSAkdTggPSAkdGVzdENsaWVudC0+dGVzdEJ5dGUoMSk7CiBwcmludCgiID0gJHU4XG4iKTsKIAogIwogIyBJMzIgVEVTVAogIwotcHJpbnQoInRlc3RJMzIoLTEpIik7CitwcmludCgndGVzdEkzMigtMSknKTsKIG15ICRpMzIgPSAkdGVzdENsaWVudC0+dGVzdEkzMigtMSk7CiBwcmludCgiID0gJGkzMlxuIik7CitleGl0KEVSUl9CQVNFVFlQRVMpIGlmICgkaTMyIG5lIC0xKTsKIAogIwotI0k2NCBURVNUCisjIEk2NCBURVNUCiAjCi1wcmludCgidGVzdEk2NCgtMzQzNTk3MzgzNjgpIik7CitwcmludCgndGVzdEk2NCgtMzQzNTk3MzgzNjgpJyk7CiBteSAkaTY0ID0gJHRlc3RDbGllbnQtPnRlc3RJNjQoLTM0MzU5NzM4MzY4KTsKIHByaW50KCIgPSAkaTY0XG4iKTsKK2V4aXQoRVJSX0JBU0VUWVBFUykgaWYgKCRpNjQgbmUgLTM0MzU5NzM4MzY4KTsKIAogIwogIyBET1VCTEUgVEVTVAogIwotcHJpbnQoInRlc3REb3VibGUoLTg1Mi4yMzQyMzQyMzQpIik7CitwcmludCgndGVzdERvdWJsZSgtODUyLjIzNDIzNDIzNCknKTsKIG15ICRkdWIgPSAkdGVzdENsaWVudC0+dGVzdERvdWJsZSgtODUyLjIzNDIzNDIzNCk7CiBwcmludCgiID0gJGR1YlxuIik7CitleGl0KEVSUl9CQVNFVFlQRVMpIGlmICgkZHViIG5lIC04NTIuMjM0MjM0MjM0KTsKKworIworIyBCSU5BUlkgVEVTVCAgIC0tLSAgVE9ETworIworCiAKICMKICMgU1RSVUNUIFRFU1QKICMKLXByaW50KCJ0ZXN0U3RydWN0KHtcIlplcm9cIiwgMSwgLTMsIC01fSkiKTsKLW15ICRvdXQgPSBuZXcgVGhyaWZ0VGVzdDo6WHRydWN0KCk7Ci0kb3V0LT5zdHJpbmdfdGhpbmcoIlplcm8iKTsKK3ByaW50KCd0ZXN0U3RydWN0KHsiWmVybyIsIDEsIC0zLCAtNX0pJyk7CitteSAkb3V0ID0gVGhyaWZ0VGVzdDo6WHRydWN0LT5uZXcoKTsKKyRvdXQtPnN0cmluZ190aGluZygnWmVybycpOwogJG91dC0+Ynl0ZV90aGluZygxKTsKICRvdXQtPmkzMl90aGluZygtMyk7CiAkb3V0LT5pNjRfdGhpbmcoLTUpOwogbXkgJGluID0gJHRlc3RDbGllbnQtPnRlc3RTdHJ1Y3QoJG91dCk7Ci1wcmludCgiID0ge1wiIi4kaW4tPnN0cmluZ190aGluZy4iXCIsICIuCi0gICAgICAgICRpbi0+Ynl0ZV90aGluZy4iLCAiLgotICAgICAgICAkaW4tPmkzMl90aGluZy4iLCAiLgorcHJpbnQoJyA9IHsiJy4kaW4tPnN0cmluZ190aGluZy4nIiwgJy4KKyAgICAgICAgJGluLT5ieXRlX3RoaW5nLicsICcuCisgICAgICAgICRpbi0+aTMyX3RoaW5nLicsICcuCiAgICAgICAgICRpbi0+aTY0X3RoaW5nLiJ9XG4iKTsKIAogIwogIyBORVNURUQgU1RSVUNUIFRFU1QKICMKLXByaW50KCJ0ZXN0TmVzdCh7MSwge1wiWmVyb1wiLCAxLCAtMywgLTV9LCA1fSIpOwotbXkgJG91dDIgPSBuZXcgVGhyaWZ0VGVzdDo6WHRydWN0MigpOworcHJpbnQoJ3Rlc3ROZXN0KHsxLCB7Ilplcm8iLCAxLCAtMywgLTV9LCA1fScpOworbXkgJG91dDIgPSBUaHJpZnRUZXN0OjpYdHJ1Y3QyLT5uZXcoKTsKICRvdXQyLT5ieXRlX3RoaW5nKDEpOwogJG91dDItPnN0cnVjdF90aGluZygkb3V0KTsKICRvdXQyLT5pMzJfdGhpbmcoNSk7CiBteSAkaW4yID0gJHRlc3RDbGllbnQtPnRlc3ROZXN0KCRvdXQyKTsKICRpbiA9ICRpbjItPnN0cnVjdF90aGluZzsKLXByaW50KCIgPSB7Ii4kaW4yLT5ieXRlX3RoaW5nLiIsIHtcIiIuCi0gICAgICAkaW4tPnN0cmluZ190aGluZy4iXCIsICIuCi0gICAgICAkaW4tPmJ5dGVfdGhpbmcuIiwgIi4KLSAgICAgICRpbi0+aTMyX3RoaW5nLiIsICIuCi0gICAgICAkaW4tPmk2NF90aGluZy4ifSwgIi4KK3ByaW50KCcgPSB7Jy4kaW4yLT5ieXRlX3RoaW5nLicsIHsiJy4KKyAgICAgICRpbi0+c3RyaW5nX3RoaW5nLiciLCAnLgorICAgICAgJGluLT5ieXRlX3RoaW5nLicsICcuCisgICAgICAkaW4tPmkzMl90aGluZy4nLCAnLgorICAgICAgJGluLT5pNjRfdGhpbmcuJ30sICcuCiAgICAgICAkaW4yLT5pMzJfdGhpbmcuIn1cbiIpOwogCiAjCkBAIC0xMzcsMjggKzI2MSwzMCBAQAogZm9yIChteSAkaSA9IDA7ICRpIDwgNTsgKyskaSkgewogICAkbWFwb3V0LT57JGl9ID0gJGktMTA7CiB9Ci1wcmludCgidGVzdE1hcCh7Iik7CitwcmludCgndGVzdE1hcCh7Jyk7CiBteSAkZmlyc3QgPSAxOwogd2hpbGUoIG15KCRrZXksJHZhbCkgPSBlYWNoICUkbWFwb3V0KSB7CiAgICAgaWYgKCRmaXJzdCkgewogICAgICAgICAkZmlyc3QgPSAwOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHByaW50KCIsICIpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcHJpbnQoJywgJyk7CiAgICAgfQogICAgIHByaW50KCIka2V5ID0+ICR2YWwiKTsKIH0KLXByaW50KCJ9KSIpOworcHJpbnQoJ30pJyk7CiAKIAogbXkgJG1hcGluID0gJHRlc3RDbGllbnQtPnRlc3RNYXAoJG1hcG91dCk7Ci1wcmludCgiID0geyIpOworcHJpbnQoJyA9IHsnKTsKIAogJGZpcnN0ID0gMTsKIHdoaWxlKCBteSgka2V5LCR2YWwpID0gZWFjaCAlJG1hcGluKXsKICAgICBpZiAoJGZpcnN0KSB7CiAgICAgICAgICRmaXJzdCA9IDA7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcHJpbnQoIiwgIik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBwcmludCgnLCAnKTsKICAgICB9CiAgICAgcHJpbnQoIiRrZXkgPT4gJHZhbCIpOwogfQpAQCAtMTcyLDExICsyOTgsMTEgQEAKICAgICBwdXNoKEAkc2V0b3V0LCAkaSk7CiB9CiAKLXByaW50KCJ0ZXN0U2V0KHsiLmpvaW4oIiwiLEAkc2V0b3V0KS4ifSkiKTsKK3ByaW50KCd0ZXN0U2V0KHsnLmpvaW4oJywnLEAkc2V0b3V0KS4nfSknKTsKIAogbXkgJHNldGluID0gJHRlc3RDbGllbnQtPnRlc3RTZXQoJHNldG91dCk7CiAKLXByaW50KCIgPSB7Ii5qb2luKCIsIixAJHNldG91dCkuIn1cbiIpOworcHJpbnQoJyA9IHsnLmpvaW4oJywnLEAkc2V0b3V0KS4ifVxuIik7CiAKICMKICMgTElTVCBURVNUCkBAIC0xODYsMTA1ICszMTIsMTExIEBACiAgICAgcHVzaChAJGxpc3RvdXQsICRpKTsKIH0KIAotcHJpbnQoInRlc3RMaXN0KHsiLmpvaW4oIiwiLEAkbGlzdG91dCkuIn0pIik7CitwcmludCgndGVzdExpc3Qoeycuam9pbignLCcsQCRsaXN0b3V0KS4nfSknKTsKIAogbXkgJGxpc3RpbiA9ICR0ZXN0Q2xpZW50LT50ZXN0TGlzdCgkbGlzdG91dCk7CiAKLXByaW50KCIgPSB7Ii5qb2luKCIsIixAJGxpc3RpbikuIn1cbiIpOworcHJpbnQoJyA9IHsnLmpvaW4oJywnLEAkbGlzdGluKS4ifVxuIik7CiAKICMKICMgRU5VTSBURVNUCiAjCi1wcmludCgidGVzdEVudW0oT05FKSIpOworcHJpbnQoJ3Rlc3RFbnVtKE9ORSknKTsKIG15ICRyZXQgPSAkdGVzdENsaWVudC0+dGVzdEVudW0oVGhyaWZ0VGVzdDo6TnVtYmVyejo6T05FKTsKIHByaW50KCIgPSAkcmV0XG4iKTsKIAotcHJpbnQoInRlc3RFbnVtKFRXTykiKTsKK3ByaW50KCd0ZXN0RW51bShUV08pJyk7CiAkcmV0ID0gJHRlc3RDbGllbnQtPnRlc3RFbnVtKFRocmlmdFRlc3Q6Ok51bWJlcno6OlRXTyk7CiBwcmludCgiID0gJHJldFxuIik7CiAKLXByaW50KCJ0ZXN0RW51bShUSFJFRSkiKTsKK3ByaW50KCd0ZXN0RW51bShUSFJFRSknKTsKICRyZXQgPSAkdGVzdENsaWVudC0+dGVzdEVudW0oVGhyaWZ0VGVzdDo6TnVtYmVyejo6VEhSRUUpOwogcHJpbnQoIiA9ICRyZXRcbiIpOwogCi1wcmludCgidGVzdEVudW0oRklWRSkiKTsKK3ByaW50KCd0ZXN0RW51bShGSVZFKScpOwogJHJldCA9ICR0ZXN0Q2xpZW50LT50ZXN0RW51bShUaHJpZnRUZXN0OjpOdW1iZXJ6OjpGSVZFKTsKIHByaW50KCIgPSAkcmV0XG4iKTsKIAotcHJpbnQoInRlc3RFbnVtKEVJR0hUKSIpOworcHJpbnQoJ3Rlc3RFbnVtKEVJR0hUKScpOwogJHJldCA9ICR0ZXN0Q2xpZW50LT50ZXN0RW51bShUaHJpZnRUZXN0OjpOdW1iZXJ6OjpFSUdIVCk7CiBwcmludCgiID0gJHJldFxuIik7CiAKICMKICMgVFlQRURFRiBURVNUCiAjCi1wcmludCgidGVzdFR5cGVkZWYoMzA5ODU4MjM1MDgyNTIzKSIpOworcHJpbnQoJ3Rlc3RUeXBlZGVmKDMwOTg1ODIzNTA4MjUyMyknKTsKIG15ICR1aWQgPSAkdGVzdENsaWVudC0+dGVzdFR5cGVkZWYoMzA5ODU4MjM1MDgyNTIzKTsKIHByaW50KCIgPSAkdWlkXG4iKTsKIAogIwogIyBORVNURUQgTUFQIFRFU1QKICMKLXByaW50KCJ0ZXN0TWFwTWFwKDEpIik7CitwcmludCgndGVzdE1hcE1hcCgxKScpOwogbXkgJG1tID0gJHRlc3RDbGllbnQtPnRlc3RNYXBNYXAoMSk7Ci1wcmludCgiID0geyIpOworcHJpbnQoJyA9IHsnKTsKIHdoaWxlKCBteSAoJGtleSwkdmFsKSA9IGVhY2ggJSRtbSkgewogICAgIHByaW50KCIka2V5ID0+IHsiKTsKICAgICB3aGlsZSggbXkoJGsyLCR2MikgPSBlYWNoICUkdmFsKSB7CiAgICAgICAgIHByaW50KCIkazIgPT4gJHYyLCAiKTsKICAgICB9Ci0gICAgcHJpbnQoIn0sICIpOworICAgIHByaW50KCd9LCAnKTsKIH0KIHByaW50KCJ9XG4iKTsKIAogIwogIyBJTlNBTklUWSBURVNUCiAjCi1teSAkaW5zYW5lID0gbmV3IFRocmlmdFRlc3Q6Okluc2FuaXR5KCk7CitteSAkaW5zYW5lID0gVGhyaWZ0VGVzdDo6SW5zYW5pdHktPm5ldygpOwogJGluc2FuZS0+e3VzZXJNYXB9LT57VGhyaWZ0VGVzdDo6TnVtYmVyejo6RklWRX0gPSA1MDAwOwotbXkgJHRydWNrID0gbmV3IFRocmlmdFRlc3Q6Olh0cnVjdCgpOwotJHRydWNrLT5zdHJpbmdfdGhpbmcoIlRydWNrIik7Ci0kdHJ1Y2stPmJ5dGVfdGhpbmcoOCk7Ci0kdHJ1Y2stPmkzMl90aGluZyg4KTsKLSR0cnVjay0+aTY0X3RoaW5nKDgpOworbXkgJHRydWNrID0gVGhyaWZ0VGVzdDo6WHRydWN0LT5uZXcoKTsKKyR0cnVjay0+c3RyaW5nX3RoaW5nKCdIZWxsbzInKTsKKyR0cnVjay0+Ynl0ZV90aGluZygyKTsKKyR0cnVjay0+aTMyX3RoaW5nKDIpOworJHRydWNrLT5pNjRfdGhpbmcoMik7CitteSAkdHJ1Y2syID0gVGhyaWZ0VGVzdDo6WHRydWN0LT5uZXcoKTsKKyR0cnVjazItPnN0cmluZ190aGluZygnR29vZGJ5ZTQnKTsKKyR0cnVjazItPmJ5dGVfdGhpbmcoNCk7CiskdHJ1Y2syLT5pMzJfdGhpbmcoNCk7CiskdHJ1Y2syLT5pNjRfdGhpbmcoNCk7CiBwdXNoKEB7JGluc2FuZS0+e3h0cnVjdHN9fSwgJHRydWNrKTsKK3B1c2goQHskaW5zYW5lLT57eHRydWN0c319LCAkdHJ1Y2syKTsKIAotcHJpbnQoInRlc3RJbnNhbml0eSgpIik7CitwcmludCgndGVzdEluc2FuaXR5KCknKTsKIG15ICR3aG9hID0gJHRlc3RDbGllbnQtPnRlc3RJbnNhbml0eSgkaW5zYW5lKTsKLXByaW50KCIgPSB7Iik7CitwcmludCgnID0geycpOwogd2hpbGUoIG15ICgka2V5LCR2YWwpID0gZWFjaCAlJHdob2EpIHsKICAgICBwcmludCgiJGtleSA9PiB7Iik7CiAgICAgd2hpbGUoIG15KCRrMiwkdjIpID0gZWFjaCAlJHZhbCkgewogICAgICAgICBwcmludCgiJGsyID0+IHsiKTsKICAgICAgICAgbXkgJHVzZXJNYXAgPSAkdjItPnt1c2VyTWFwfTsKLSAgICAgICAgcHJpbnQoInsiKTsKLSAgICAgICAgaWYgKHJlZigkdXNlck1hcCkgZXEgIkhBU0giKSB7CisgICAgICAgIHByaW50KCd7Jyk7CisgICAgICAgIGlmIChyZWYoJHVzZXJNYXApIGVxICdIQVNIJykgewogICAgICAgICAgICAgd2hpbGUoIG15KCRrMywkdjMpID0gZWFjaCAlJHVzZXJNYXApIHsKICAgICAgICAgICAgICAgICBwcmludCgiJGszID0+ICR2MywgIik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgcHJpbnQoIn0sICIpOworICAgICAgICBwcmludCgnfSwgJyk7CiAKICAgICAgICAgbXkgJHh0cnVjdHMgPSAkdjItPnt4dHJ1Y3RzfTsKLSAgICAgICAgcHJpbnQoInsiKTsKLSAgICAgICAgaWYgKHJlZigkeHRydWN0cykgZXEgIkFSUkFZIikgeworICAgICAgICBwcmludCgneycpOworICAgICAgICBpZiAocmVmKCR4dHJ1Y3RzKSBlcSAnQVJSQVknKSB7CiAgICAgICAgICAgICBmb3JlYWNoIG15ICR4IChAJHh0cnVjdHMpIHsKLSAgICAgICAgICAgICAgICBwcmludCgie1wiIi4keC0+e3N0cmluZ190aGluZ30uIlwiLCAiLgotICAgICAgICAgICAgICAgICAgICAgICR4LT57Ynl0ZV90aGluZ30uIiwgIi4keC0+e2kzMl90aGluZ30uIiwgIi4keC0+e2k2NF90aGluZ30uIn0sICIpOworICAgICAgICAgICAgICAgIHByaW50KCd7IicuJHgtPntzdHJpbmdfdGhpbmd9LiciLCAnLgorICAgICAgICAgICAgICAgICAgICAgICR4LT57Ynl0ZV90aGluZ30uJywgJy4keC0+e2kzMl90aGluZ30uJywgJy4keC0+e2k2NF90aGluZ30uJ30sICcpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIHByaW50KCJ9Iik7CisgICAgICAgIHByaW50KCd9Jyk7CiAKLSAgICAgICAgcHJpbnQoIn0sICIpOworICAgICAgICBwcmludCgnfSwgJyk7CiAgICAgfQotICAgIHByaW50KCJ9LCAiKTsKKyAgICBwcmludCgnfSwgJyk7CiB9CiBwcmludCgifVxuIik7CiAKICMKICMgRVhDRVBUSU9OIFRFU1QKICMKLXByaW50KCJ0ZXN0RXhjZXB0aW9uKCdYY2VwdGlvbicpIik7CitwcmludChxfHRlc3RFeGNlcHRpb24oJ1hjZXB0aW9uJyl8KTsKIGV2YWwgewogICAgICR0ZXN0Q2xpZW50LT50ZXN0RXhjZXB0aW9uKCdYY2VwdGlvbicpOwogICAgIHByaW50KCIgIHZvaWRcbkZBSUxVUkVcbiIpOwpAQCAtMjk3LDcgKzQyOSw3IEBACiAjIE5vcm1hbCB0ZXN0cyBkb25lLgogIwogbXkgJHN0b3AgPSBnZXR0aW1lb2ZkYXkoKTsKLW15ICRlbHAgID0gc3ByaW50ZigiJWQiLDEwMDAqKCRzdG9wIC0gJHN0YXJ0KSwgMCk7CitteSAkZWxwICA9IHNwcmludGYoJyVkJywxMDAwKigkc3RvcCAtICRzdGFydCksIDApOwogcHJpbnQoIlRvdGFsIHRpbWU6ICRlbHAgbXNcbiIpOwogCiAjCmRpZmYgLS1naXQgYS90ZXN0L3BlcmwvVGVzdFNlcnZlci5wbCBiL3Rlc3QvcGVybC9UZXN0U2VydmVyLnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyYjlhMzgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3BlcmwvVGVzdFNlcnZlci5wbApAQCAtMCwwICsxLDQxMSBAQAorIyEvdXNyL2Jpbi9lbnYgcGVybAorCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKwordXNlIDUuMTAuMDsKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7Cit1c2UgRGF0YTo6RHVtcGVyOwordXNlIEdldG9wdDo6TG9uZyBxdyhHZXRPcHRpb25zKTsKK3VzZSBUaW1lOjpIaVJlcyBxdyhnZXR0aW1lb2ZkYXkpOworCiskU0lHe0lOVH0gPSBcJnNpZ2ludF9oYW5kbGVyOworCit1c2UgbGliICcuLi8uLi9saWIvcGVybC9saWInOwordXNlIGxpYiAnZ2VuLXBlcmwnOworCit1c2UgVGhyaWZ0OwordXNlIFRocmlmdDo6QmluYXJ5UHJvdG9jb2w7Cit1c2UgVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydDsKK3VzZSBUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydDsKK3VzZSBUaHJpZnQ6Ok11bHRpcGxleGVkUHJvY2Vzc29yOwordXNlIFRocmlmdDo6U1NMU2VydmVyU29ja2V0OwordXNlIFRocmlmdDo6U2VydmVyU29ja2V0OwordXNlIFRocmlmdDo6U2VydmVyOwordXNlIFRocmlmdDo6VW5peFNlcnZlclNvY2tldDsKKwordXNlIFRocmlmdFRlc3Q6OlNlY29uZFNlcnZpY2U7Cit1c2UgVGhyaWZ0VGVzdDo6VGhyaWZ0VGVzdDsKK3VzZSBUaHJpZnRUZXN0OjpUeXBlczsKKworJHwrKzsKKworc3ViIHVzYWdlIHsKKyAgICBwcmludCA8PCJFT0YiOworVXNhZ2U6ICQwIFtPUFRJT05TXQorCitPcHRpb25zOiAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQpCisgIC0tY2EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENlcnRpZmljYXRlIGF1dGhvcml0eSBmaWxlIChvcHRpb25hbCkuCisgIC0tY2VydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENlcnRpZmljYXRlIGZpbGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVpcmVkIGlmIHVzaW5nIC0tc3NsLgorICAtLWNpcGhlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY2NlcHRhYmxlIGNpcGhlciBsaXN0LgorICAtLWRvbWFpbi1zb2NrZXQgPGZpbGU+ICAgICAgICAgICAgICAgICAgICAgICBVc2UgYSB1bml4IGRvbWFpbiBzb2NrZXQuCisgIC0taGVscCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNob3cgdXNhZ2UuCisgIC0ta2V5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaXZhdGUga2V5IGZpbGUgZm9yIGNlcnRpZmljYXRlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXF1aXJlZCBpZiB1c2luZyAtLXNzbCBhbmQgcHJpdmF0ZSBrZXkgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IGluIHRoZSBjZXJ0aWZpY2F0ZSBmaWxlLgorICAtLXBvcnQgPHBvcnRudW0+ICAgICAgICAgICAgICAgIDkwOTAgICAgICAgICBQb3J0IHRvIHVzZS4KKyAgLS1wcm90b2NvbCB7YmluYXJ5fSAgICAgICAgICAgICBiaW5hcnkgICAgICAgUHJvdG9jb2wgdG8gdXNlLgorICAtLXNzbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBwcmVzZW50LCB1c2UgU1NML1RMUy4KKyAgLS10cmFuc3BvcnQge2J1ZmZlcmVkfGZyYW1lZH0gICBidWZmZXJlZCAgICAgVHJhbnNwb3J0IHRvIHVzZS4KKworRU9GCit9CisKK215ICVvcHRzID0gKAorICAgICdwb3J0JyA9PiA5MDkwLAorICAgICdwcm90b2NvbCcgPT4gJ2JpbmFyeScsCisgICAgJ3RyYW5zcG9ydCcgPT4gJ2J1ZmZlcmVkJworKTsKKworR2V0T3B0aW9ucyhcJW9wdHMsIHF3ICgKKyAgICBjYT1zCisgICAgY2VydD1zCisgICAgY2lwaGVycz1zCisgICAgZG9tYWluLXNvY2tldD1zCisgICAgaGVscAorICAgIGhvc3Q9cworICAgIGtleT1zCisgICAgcG9ydD1pCisgICAgcHJvdG9jb2w9cworICAgIHNzbAorICAgIHRyYW5zcG9ydD1zCispKSB8fCBleGl0IDE7CisKK2lmICgkb3B0c3toZWxwfSkgeworICAgIHVzYWdlKCk7CisgICAgZXhpdCAwOworfQorCitpZiAoJG9wdHN7c3NsfSBhbmQgbm90IGRlZmluZWQgJG9wdHN7Y2VydH0pIHsKKyAgICB1c2FnZSgpOworICAgIGV4aXQgMTsKK30KKworbXkgJGhhbmRsZXIgICAgPSBUaHJpZnRUZXN0SGFuZGxlci0+bmV3KCk7CitteSAkaGFuZGxlcjIgICA9IFNlY29uZFNlcnZpY2VIYW5kbGVyLT5uZXcoKTsKK215ICRwcm9jZXNzb3IgID0gVGhyaWZ0VGVzdDo6VGhyaWZ0VGVzdFByb2Nlc3Nvci0+bmV3KCRoYW5kbGVyKTsKK215ICRwcm9jZXNzb3IyID0gVGhyaWZ0VGVzdDo6U2Vjb25kU2VydmljZVByb2Nlc3Nvci0+bmV3KCRoYW5kbGVyMik7CisKK215ICRzZXJ2ZXJzb2NrZXQ7CitpZiAoJG9wdHN7J2RvbWFpbi1zb2NrZXQnfSkgeworICAgIHVubGluaygkb3B0c3snZG9tYWluLXNvY2tldCd9KTsKKyAgICAkc2VydmVyc29ja2V0ID0gVGhyaWZ0OjpVbml4U2VydmVyU29ja2V0LT5uZXcoJG9wdHN7J2RvbWFpbi1zb2NrZXQnfSk7Cit9CitlbHNpZiAoJG9wdHN7c3NsfSkgeworICAgICRzZXJ2ZXJzb2NrZXQgPSBUaHJpZnQ6OlNTTFNlcnZlclNvY2tldC0+bmV3KFwlb3B0cyk7Cit9CitlbHNlIHsKKyAgICAkc2VydmVyc29ja2V0ID0gVGhyaWZ0OjpTZXJ2ZXJTb2NrZXQtPm5ldyhcJW9wdHMpOworfQorbXkgJHRyYW5zcG9ydDsKK2lmICgkb3B0c3t0cmFuc3BvcnR9IGVxICdidWZmZXJlZCcpIHsKKyAgICAkdHJhbnNwb3J0ID0gVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnktPm5ldygpOworfQorZWxzaWYgKCRvcHRze3RyYW5zcG9ydH0gZXEgJ2ZyYW1lZCcpIHsKKyAgICAkdHJhbnNwb3J0ID0gVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnRGYWN0b3J5LT5uZXcoKTsKK30KK2Vsc2UgeworICAgIHVzYWdlKCk7CisgICAgZXhpdCAxOworfQorbXkgJHByb3RvY29sOworaWYgKCRvcHRze3Byb3RvY29sfSBlcSAnYmluYXJ5JyB8fCAkb3B0c3twcm90b2NvbH0gZXEgJ211bHRpJykgeworICAgICRwcm90b2NvbCA9IFRocmlmdDo6QmluYXJ5UHJvdG9jb2xGYWN0b3J5LT5uZXcoKTsKK30KK2Vsc2UgeworICAgIHVzYWdlKCk7CisgICAgZXhpdCAxOworfQorCitpZiAoaW5kZXgoJG9wdHN7cHJvdG9jb2x9LCAnbXVsdGknKSA9PSAwKSB7CisgIG15ICRuZXdQcm9jZXNzb3IgPSBUaHJpZnQ6Ok11bHRpcGxleGVkUHJvY2Vzc29yLT5uZXcoJHByb3RvY29sKTsKKyAgJG5ld1Byb2Nlc3Nvci0+ZGVmYXVsdFByb2Nlc3NvcigkcHJvY2Vzc29yKTsKKyAgJG5ld1Byb2Nlc3Nvci0+cmVnaXN0ZXJQcm9jZXNzb3IoJ1RocmlmdFRlc3QnLCAkcHJvY2Vzc29yKTsKKyAgJG5ld1Byb2Nlc3Nvci0+cmVnaXN0ZXJQcm9jZXNzb3IoJ1NlY29uZFNlcnZpY2UnLCAkcHJvY2Vzc29yMik7CisgICRwcm9jZXNzb3IgPSAkbmV3UHJvY2Vzc29yOworfQorCitteSAkc3NsdGFnID0gJyc7CitpZiAoJG9wdHN7c3NsfSkgeworICAgICRzc2x0YWcgPSAnKFNTTCknOworfQorbXkgJGxpc3RlbmluZ19vbiA9ICIkb3B0c3twb3J0fSAkc3NsdGFnIjsKK2lmICgkb3B0c3snZG9tYWluLXNvY2tldCd9KSB7CisgICAgJGxpc3RlbmluZ19vbiA9ICRvcHRzeydkb21haW4tc29ja2V0J307Cit9CitteSAkc2VydmVyID0gVGhyaWZ0OjpTaW1wbGVTZXJ2ZXItPm5ldygkcHJvY2Vzc29yLCAkc2VydmVyc29ja2V0LCAkdHJhbnNwb3J0LCAkcHJvdG9jb2wpOworcHJpbnQgcXF8U3RhcnRpbmcgInNpbXBsZSIgc2VydmVyICgkb3B0c3t0cmFuc3BvcnR9LyRvcHRze3Byb3RvY29sfSkgbGlzdGVuIG9uOiAkbGlzdGVuaW5nX29uXG58OworJHNlcnZlci0+c2VydmUoKTsKK3ByaW50ICJkb25lLlxuIjsKKworc3ViIHNpZ2ludF9oYW5kbGVyIHsKKyAgcHJpbnQgInJlY2VpdmVkIFNJR0lOVCwgc3RvcHBpbmcuLi5cbiI7CisgICRzZXJ2ZXItPnN0b3AoKTsKK30KKworIyMjCisjIyMgVGVzdCBzZXJ2ZXIgaW1wbGVtZW50YXRpb24KKyMjIworCitwYWNrYWdlIFRocmlmdFRlc3RIYW5kbGVyOworCit1c2UgYmFzZSBxdyggVGhyaWZ0VGVzdDo6VGhyaWZ0VGVzdElmICk7CisKK3N1YiBuZXcgeworICAgIG15ICRjbGFzc25hbWUgPSBzaGlmdDsKKyAgICBteSAkc2VsZiA9IHt9OworICAgIHJldHVybiBibGVzcygkc2VsZiwgJGNsYXNzbmFtZSk7Cit9CisKK3N1YiB0ZXN0Vm9pZCB7CisgIHByaW50KCJ0ZXN0Vm9pZCgpXG4iKTsKK30KKworc3ViIHRlc3RTdHJpbmcgeworICBteSAkc2VsZiA9IHNoaWZ0OworICBteSAkdGhpbmcgPSBzaGlmdDsKKyAgcHJpbnQoInRlc3RTdHJpbmcoJHRoaW5nKVxuIik7CisgIHJldHVybiAkdGhpbmc7Cit9CisKK3N1YiB0ZXN0Qm9vbCB7CisgIG15ICRzZWxmID0gc2hpZnQ7CisgIG15ICR0aGluZyA9IHNoaWZ0OworICBteSAkc3RyID0gJHRoaW5nID8gJ3RydWUnIDogJ2ZhbHNlJzsKKyAgcHJpbnQoInRlc3RCb29sKCRzdHIpXG4iKTsKKyAgcmV0dXJuICR0aGluZzsKK30KKworc3ViIHRlc3RCeXRlIHsKKyAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgbXkgJHRoaW5nID0gc2hpZnQ7CisgIHByaW50KCJ0ZXN0Qnl0ZSgkdGhpbmcpXG4iKTsKKyAgcmV0dXJuICR0aGluZzsKK30KKworc3ViIHRlc3RJMzIgeworICBteSAkc2VsZiA9IHNoaWZ0OworICBteSAkdGhpbmcgPSBzaGlmdDsKKyAgcHJpbnQoInRlc3RJMzIoJHRoaW5nKVxuIik7CisgIHJldHVybiAkdGhpbmc7Cit9CisKK3N1YiB0ZXN0STY0IHsKKyAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgbXkgJHRoaW5nID0gc2hpZnQ7CisgIHByaW50KCJ0ZXN0STY0KCR0aGluZylcbiIpOworICByZXR1cm4gJHRoaW5nOworfQorCitzdWIgdGVzdERvdWJsZSB7CisgIG15ICRzZWxmID0gc2hpZnQ7CisgIG15ICR0aGluZyA9IHNoaWZ0OworICBwcmludCgidGVzdERvdWJsZSgkdGhpbmcpXG4iKTsKKyAgcmV0dXJuICR0aGluZzsKK30KKworc3ViIHRlc3RCaW5hcnkgeworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJHRoaW5nID0gc2hpZnQ7CisgICAgbXkgQGJ5dGVzID0gc3BsaXQgLy8sICR0aGluZzsKKyAgICBwcmludCAndGVzdEJpbmFyeSgnOworICAgIHByaW50ZiggJyUwMmx4Jywgb3JkICRfICkgZm9yZWFjaCAoQGJ5dGVzKTsKKyAgICBwcmludCAiKVxuIjsKKyAgICByZXR1cm4gJHRoaW5nOworfQorCitzdWIgdGVzdFN0cnVjdCB7CisgIG15ICRzZWxmID0gc2hpZnQ7CisgIG15ICR0aGluZyA9IHNoaWZ0OworICBwcmludGYocXF8dGVzdFN0cnVjdCh7IiVzIiwgJWQsICVkLCAlbGxkfSlcbnwsCisgICAgICAgICAgICR0aGluZy0+e3N0cmluZ190aGluZ30sCisgICAgICAgICAgICR0aGluZy0+e2J5dGVfdGhpbmd9LAorICAgICAgICAgICAkdGhpbmctPntpMzJfdGhpbmd9LAorICAgICAgICAgICAkdGhpbmctPntpNjRfdGhpbmd9KTsKKyAgcmV0dXJuICR0aGluZzsKK30KKworc3ViIHRlc3ROZXN0IHsKKyAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgbXkgJG5lc3QgPSBzaGlmdDsKKyAgbXkgJHRoaW5nID0gJG5lc3QtPntzdHJ1Y3RfdGhpbmd9OworICBwcmludGYocXF8dGVzdE5lc3QoeyVkLCB7IiVzIiwgJWQsICVkLCAlbGxkfSwgJWR9KVxufCwKKyAgICAgICAgICAgJG5lc3QtPntieXRlX3RoaW5nfSwKKyAgICAgICAgICAgJHRoaW5nLT57c3RyaW5nX3RoaW5nfSwKKyAgICAgICAgICAgJHRoaW5nLT57Ynl0ZV90aGluZ30sCisgICAgICAgICAgICR0aGluZy0+e2kzMl90aGluZ30sCisgICAgICAgICAgICR0aGluZy0+e2k2NF90aGluZ30sCisgICAgICAgICAgICRuZXN0LT57aTMyX3RoaW5nfSk7CisgIHJldHVybiAkbmVzdDsKK30KKworc3ViIHRlc3RNYXAgeworICBteSAkc2VsZiA9IHNoaWZ0OworICBteSAkdGhpbmcgPSBzaGlmdDsKKyAgcHJpbnRmICJ0ZXN0TWFwKHslc30pXG4iLAorICAgIGpvaW4oICcsICcsCisgICAgICAgICAgbWFwIHsgJF8gLiAnID0+ICcgLiAkdGhpbmctPnskX30gfQorICAgICAgICAgIHNvcnQga2V5cyAlJHRoaW5nCisgICAgKTsKKyAgcmV0dXJuICR0aGluZzsKK30KKworc3ViIHRlc3RTdHJpbmdNYXAgeworICBteSAkc2VsZiA9IHNoaWZ0OworICBteSAkdGhpbmcgPSBzaGlmdDsKKyAgcHJpbnRmICJ0ZXN0U3RyaW5nTWFwKHslc30pXG4iLAorICAgIGpvaW4oICcsICcsCisgICAgICAgICAgbWFwIHsgJF8gLiAnID0+ICcgLiAkdGhpbmctPnskX30gfQorICAgICAgICAgIHNvcnQga2V5cyAlJHRoaW5nCisgICAgKTsKKyAgcmV0dXJuICR0aGluZzsKK30KKworc3ViIHRlc3RTZXQgeworICBteSAkc2VsZiA9IHNoaWZ0OworICBteSAkdGhpbmcgPSBzaGlmdDsKKyAgbXkgQHJlc3VsdCA9IHNvcnQga2V5cyAlJHRoaW5nOworICBwcmludGYgInRlc3RTZXQoeyVzfSlcbiIsIGpvaW4oJywgJywgQHJlc3VsdCApOworICByZXR1cm4gXEByZXN1bHQ7Cit9CisKK3N1YiB0ZXN0TGlzdCB7CisgIG15ICRzZWxmID0gc2hpZnQ7CisgIG15ICR0aGluZyA9IHNoaWZ0OworICBwcmludCAidGVzdExpc3QoeyVzfSlcbiIsIGpvaW4oJywgJywgQCR0aGluZyk7CisgIHJldHVybiAkdGhpbmc7Cit9CisKK3N1YiB0ZXN0RW51bSB7CisgIG15ICRzZWxmID0gc2hpZnQ7CisgIG15ICR0aGluZyA9IHNoaWZ0OworICBwcmludCAidGVzdEVudW0oJHRoaW5nKVxuIjsKKyAgcmV0dXJuICR0aGluZzsKK30KKworc3ViIHRlc3RUeXBlZGVmIHsKKyAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgbXkgJHRoaW5nID0gc2hpZnQ7CisgIHByaW50KCJ0ZXN0VHlwZWRlZigkdGhpbmcpXG4iKTsKKyAgcmV0dXJuICR0aGluZzsKK30KKworc3ViIHRlc3RNYXBNYXAgeworICBteSAkc2VsZiA9IHNoaWZ0OworICBteSAkaGVsbG8gPSBzaGlmdDsKKworICBwcmludGYoInRlc3RNYXBNYXAoJWQpXG4iLCAkaGVsbG8pOworICBteSAkcmVzdWx0ID0geyA0ID0+IHsgMSA9PiAxLCAyID0+IDIsIDMgPT4gMywgNCA9PiA0IH0sIC00ID0+IHsgLTEgPT4gLTEsIC0yID0+IC0yLCAtMyA9PiAtMywgLTQgPT4gLTQgfSB9OworICByZXR1cm4gJHJlc3VsdDsKK30KKworc3ViIHRlc3RJbnNhbml0eSB7CisgIG15ICRzZWxmID0gc2hpZnQ7CisgIG15ICRhcmd1bWVudCA9IHNoaWZ0OworICBwcmludCgidGVzdEluc2FuaXR5KClcbiIpOworCisgIG15ICRoZWxsbyA9IFRocmlmdFRlc3Q6Olh0cnVjdC0+bmV3KHtzdHJpbmdfdGhpbmcgPT4gJ0hlbGxvMicsIGJ5dGVfdGhpbmcgPT4gMiwgaTMyX3RoaW5nID0+IDIsIGk2NF90aGluZyA9PiAyfSk7CisgIG15IEBoZWxsb3M7CisgIHB1c2goQGhlbGxvcywgJGhlbGxvKTsKKyAgbXkgJGdvb2RieWUgPSBUaHJpZnRUZXN0OjpYdHJ1Y3QtPm5ldyh7c3RyaW5nX3RoaW5nID0+ICdHb29kYnllNCcsIGJ5dGVfdGhpbmcgPT4gNCwgaTMyX3RoaW5nID0+IDQsIGk2NF90aGluZyA9PiA0fSk7CisgIG15IEBnb29kYnllczsKKyAgcHVzaChAZ29vZGJ5ZXMsICRnb29kYnllKTsKKyAgbXkgJGNyYXp5ID0gVGhyaWZ0VGVzdDo6SW5zYW5pdHktPm5ldyh7dXNlck1hcCA9PiB7IFRocmlmdFRlc3Q6Ok51bWJlcno6OkVJR0hUID0+IDggfSwgeHRydWN0cyA9PiBcQGdvb2RieWVzfSk7CisgIG15ICRsb29ueSA9IFRocmlmdFRlc3Q6Okluc2FuaXR5LT5uZXcoKTsKKyAgbXkgJHJlc3VsdCA9IHsgMSA9PiB7IFRocmlmdFRlc3Q6Ok51bWJlcno6OlRXTyA9PiAkYXJndW1lbnQsIFRocmlmdFRlc3Q6Ok51bWJlcno6OlRIUkVFID0+ICRhcmd1bWVudCB9LAorICAgICAgICAgICAgICAgICAyID0+IHsgVGhyaWZ0VGVzdDo6TnVtYmVyejo6U0lYID0+ICRsb29ueSB9IH07CisgIHJldHVybiAkcmVzdWx0OworfQorCitzdWIgdGVzdE11bHRpIHsKKyAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgbXkgJGFyZzAgPSBzaGlmdDsKKyAgbXkgJGFyZzEgPSBzaGlmdDsKKyAgbXkgJGFyZzIgPSBzaGlmdDsKKyAgbXkgJGFyZzMgPSBzaGlmdDsKKyAgbXkgJGFyZzQgPSBzaGlmdDsKKyAgbXkgJGFyZzUgPSBzaGlmdDsKKworICBwcmludCgidGVzdE11bHRpKClcbiIpOworICByZXR1cm4gVGhyaWZ0VGVzdDo6WHRydWN0LT5uZXcoe3N0cmluZ190aGluZyA9PiAnSGVsbG8yJywgYnl0ZV90aGluZyA9PiAkYXJnMCwgaTMyX3RoaW5nID0+ICRhcmcxLCBpNjRfdGhpbmcgPT4gJGFyZzJ9KTsKK30KKworc3ViIHRlc3RFeGNlcHRpb24geworICBteSAkc2VsZiA9IHNoaWZ0OworICBteSAkYXJnID0gc2hpZnQ7CisgIHByaW50KCJ0ZXN0RXhjZXB0aW9uKCRhcmcpXG4iKTsKKyAgaWYgKCRhcmcgZXEgJ1hjZXB0aW9uJykgeworICAgICAgZGllIFRocmlmdFRlc3Q6OlhjZXB0aW9uLT5uZXcoe2Vycm9yQ29kZSA9PiAxMDAxLCBtZXNzYWdlID0+ICRhcmd9KTsKKyAgfQorICBlbHNpZiAoJGFyZyBlcSAnVEV4Y2VwdGlvbicpIHsKKyAgICAgIGRpZSAnYXN0cmluZyc7ICMgYWxsIHVuaGFuZGxlZCBleGNlcHRpb25zIGJlY29tZSBURXhjZXB0aW9ucworICB9CisgIGVsc2UgeworICAgICAgcmV0dXJuIFRocmlmdFRlc3Q6Olh0cnVjdC0+bmV3KHtzdHJpbmdfdGhpbmcgPT4gJGFyZ30pOworICB9Cit9CisKK3N1YiB0ZXN0TXVsdGlFeGNlcHRpb24geworICBteSAkc2VsZiA9IHNoaWZ0OworICBteSAkYXJnMCA9IHNoaWZ0OworICBteSAkYXJnMSA9IHNoaWZ0OworCisgIHByaW50ZigidGVzdE11bHRpRXhjZXB0aW9uKCVzLCAlcylcbiIsICRhcmcwLCAkYXJnMSk7CisgIGlmICgkYXJnMCBlcSAnWGNlcHRpb24nKSB7CisgICAgZGllIFRocmlmdFRlc3Q6OlhjZXB0aW9uLT5uZXcoe2Vycm9yQ29kZSA9PiAxMDAxLCBtZXNzYWdlID0+ICdUaGlzIGlzIGFuIFhjZXB0aW9uJ30pOworICB9CisgIGVsc2lmICgkYXJnMCBlcSAnWGNlcHRpb24yJykgeworICAgIG15ICRzdHJ1Y3RfdGhpbmcgPSBUaHJpZnRUZXN0OjpYdHJ1Y3QtPm5ldyh7c3RyaW5nX3RoaW5nID0+ICdUaGlzIGlzIGFuIFhjZXB0aW9uMid9KTsKKyAgICBkaWUgVGhyaWZ0VGVzdDo6WGNlcHRpb24yLT5uZXcoe2Vycm9yQ29kZSA9PiAyMDAyLCBzdHJ1Y3RfdGhpbmcgPT4gJHN0cnVjdF90aGluZ30pOworICB9CisgIGVsc2UgeworICAgIHJldHVybiBUaHJpZnRUZXN0OjpYdHJ1Y3QtPm5ldyh7c3RyaW5nX3RoaW5nID0+ICRhcmcxfSk7CisgIH0KK30KKworc3ViIHRlc3RPbmV3YXkgeworICBteSAkc2VsZiA9IHNoaWZ0OworICBteSAkbnVtID0gc2hpZnQ7CisgIHByaW50KCJ0ZXN0T25ld2F5KCRudW0pOiByZWNlaXZlZFxuIik7Cit9CisKKyMjIworIyMjIFRlc3Qgc2VydmVyIGltcGxlbWVudGF0aW9uCisjIyMKKworcGFja2FnZSBTZWNvbmRTZXJ2aWNlSGFuZGxlcjsKKwordXNlIGJhc2UgcXcoIFRocmlmdFRlc3Q6OlNlY29uZFNlcnZpY2VJZiApOworCitzdWIgbmV3IHsKKyAgICBteSAkY2xhc3NuYW1lID0gc2hpZnQ7CisgICAgbXkgJHNlbGYgPSB7fTsKKyAgICByZXR1cm4gYmxlc3MoJHNlbGYsICRjbGFzc25hbWUpOworfQorCitzdWIgc2Vjb25kdGVzdFN0cmluZyB7CisgIG15ICRzZWxmID0gc2hpZnQ7CisgIG15ICR0aGluZyA9IHNoaWZ0OworICBwcmludCgidGVzdFN0cmluZygkdGhpbmcpXG4iKTsKKyAgcmV0dXJuIHFxfHRlc3RTdHJpbmcoIiR0aGluZyIpfDsKK30KKworMTsKZGlmZiAtLWdpdCBhL3Rlc3QvcGhwL01ha2VmaWxlLmFtIGIvdGVzdC9waHAvTWFrZWZpbGUuYW0KaW5kZXggMTYyNTkwMy4uNzJmN2ZjNSAxMDA3NTUKLS0tIGEvdGVzdC9waHAvTWFrZWZpbGUuYW0KKysrIGIvdGVzdC9waHAvTWFrZWZpbGUuYW0KQEAgLTE3LDE2ICsxNywyMyBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotVEhSSUZUID0gJCh0b3Bfc3JjZGlyKS9jb21waWxlci9jcHAvdGhyaWZ0Ci0KIHN0dWJzOiAuLi9UaHJpZnRUZXN0LnRocmlmdAogCSQoVEhSSUZUKSAtLWdlbiBwaHAgLi4vVGhyaWZ0VGVzdC50aHJpZnQKIAkkKFRIUklGVCkgLS1nZW4gcGhwOmlubGluZWQgLi4vVGhyaWZ0VGVzdC50aHJpZnQKKwkkKE1LRElSX1ApIGdlbi1waHAtY2xhc3NtYXAKKwkkKFRIUklGVCkgLW91dCBnZW4tcGhwLWNsYXNzbWFwIC0tZ2VuIHBocCAuLi9UaHJpZnRUZXN0LnRocmlmdAogCi1jaGVjazogc3R1YnMKK3BocF9leHRfZGlyOgorCW1rZGlyIC1wIHBocF9leHRfZGlyCisJbG4gLXMgLi4vLi4vLi4vbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9tb2R1bGVzL3RocmlmdF9wcm90b2NvbC5zbyBwaHBfZXh0X2Rpci8KKwlsbiAtcyAiJCQocGhwLWNvbmZpZyAtLWV4dGVuc2lvbi1kaXIpL3NvY2tldHMuc28iIHBocF9leHRfZGlyLworCitwcmVjcm9zczogc3R1YnMgcGhwX2V4dF9kaXIKKworY2hlY2s6IHN0dWJzIHBocF9leHRfZGlyCiAKIGNsZWFuLWxvY2FsOgotCSQoUk0pIC1yIGdlbi1waHAgZ2VuLXBocGkKKwkkKFJNKSAtciBnZW4tcGhwIGdlbi1waHBpIGdlbi1waHAtY2xhc3NtYXAgcGhwX2V4dF9kaXIKIAotY2xpZW50OiBzdHVicworY2xpZW50OiBzdHVicyBwaHBfZXh0X2RpcgogCXBocCBUZXN0Q2xpZW50LnBocApkaWZmIC0tZ2l0IGEvdGVzdC9waHAvVGVzdENsYXNzbWFwLnBocCBiL3Rlc3QvcGhwL1Rlc3RDbGFzc21hcC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZkMTU5NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvcGhwL1Rlc3RDbGFzc21hcC5waHAKQEAgLTAsMCArMSwyMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCis8P3BocAorJEdFTl9ESVIgPSAnZ2VuLXBocC1jbGFzc21hcCc7CitpbmNsdWRlX29uY2UoJ1Rlc3RDbGllbnQucGhwJyk7Cis/PgpkaWZmIC0tZ2l0IGEvdGVzdC9waHAvVGVzdENsaWVudC5waHAgYi90ZXN0L3BocC9UZXN0Q2xpZW50LnBocAppbmRleCBjMzM0YWVlLi5hY2Q5MDFkIDEwMDc1NQotLS0gYS90ZXN0L3BocC9UZXN0Q2xpZW50LnBocAorKysgYi90ZXN0L3BocC9UZXN0Q2xpZW50LnBocApAQCAtMiw3ICsyLDggQEAKIAogbmFtZXNwYWNlIHRlc3RccGhwOwogCi1yZXF1aXJlX29uY2UgX19ESVJfXy4nLy4uLy4uL2xpYi9waHAvbGliL1RocmlmdC9DbGFzc0xvYWRlci9UaHJpZnRDbGFzc0xvYWRlci5waHAnOworLyoqIEB2YXIgXENvbXBvc2VyXEF1dG9sb2FkXENsYXNzTG9hZGVyICRsb2FkZXIgKi8KKyRsb2FkZXIgPSByZXF1aXJlIF9fRElSX18gLiAnLy4uLy4uL3ZlbmRvci9hdXRvbG9hZC5waHAnOwogCiB1c2UgVGhyaWZ0XENsYXNzTG9hZGVyXFRocmlmdENsYXNzTG9hZGVyOwogCkBAIC0xMywxMCArMTQsMTQgQEAKICAgJE1PREUgPSAnbm9ybWFsJzsKIH0KIAotJGxvYWRlciA9IG5ldyBUaHJpZnRDbGFzc0xvYWRlcigpOwotJGxvYWRlci0+cmVnaXN0ZXJOYW1lc3BhY2UoJ1RocmlmdCcsIF9fRElSX18gLiAnLy4uLy4uL2xpYi9waHAvbGliJyk7Ci0kbG9hZGVyLT5yZWdpc3RlckRlZmluaXRpb24oJ1RocmlmdFRlc3QnLCAkR0VOX0RJUik7Ci0kbG9hZGVyLT5yZWdpc3RlcigpOworCitpZiAoJEdFTl9ESVIgPT0gJ2dlbi1waHAnKSB7CisgICRsb2FkZXItPmFkZFBzcjQoJycsICRHRU5fRElSKTsKK30gZWxzZSB7CisgICRsb2FkZXIgPSBuZXcgVGhyaWZ0Q2xhc3NMb2FkZXIoKTsKKyAgJGxvYWRlci0+cmVnaXN0ZXJEZWZpbml0aW9uKCdUaHJpZnRUZXN0JywgJEdFTl9ESVIpOworICAkbG9hZGVyLT5yZWdpc3RlcigpOworfQogCiAvKgogICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQpAQCAtMzgsOCArNDMsMTEgQEAKICAqLwogCiAvKiogSW5jbHVkZSB0aGUgVGhyaWZ0IGJhc2UgKi8KLS8qKiBJbmNsdWRlIHRoZSBiaW5hcnkgcHJvdG9jb2wgKi8KKy8qKiBJbmNsdWRlIHRoZSBwcm90b2NvbHMgKi8KIHVzZSBUaHJpZnRcUHJvdG9jb2xcVEJpbmFyeVByb3RvY29sOwordXNlIFRocmlmdFxQcm90b2NvbFxUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZDsKK3VzZSBUaHJpZnRcUHJvdG9jb2xcVENvbXBhY3RQcm90b2NvbDsKK3VzZSBUaHJpZnRcUHJvdG9jb2xcVEpTT05Qcm90b2NvbDsKIAogLyoqIEluY2x1ZGUgdGhlIHNvY2tldCBsYXllciAqLwogdXNlIFRocmlmdFxUcmFuc3BvcnRcVFNvY2tldDsKQEAgLTQ5LDYgKzU3LDI2IEBACiB1c2UgVGhyaWZ0XFRyYW5zcG9ydFxURnJhbWVkVHJhbnNwb3J0OwogdXNlIFRocmlmdFxUcmFuc3BvcnRcVEJ1ZmZlcmVkVHJhbnNwb3J0OwogCitmdW5jdGlvbiBtYWtlUHJvdG9jb2woJHRyYW5zcG9ydCwgJFBST1RPKQoreworICBpZiAoJFBST1RPID09ICdiaW5hcnknKSB7CisgICAgcmV0dXJuIG5ldyBUQmluYXJ5UHJvdG9jb2woJHRyYW5zcG9ydCk7CisgIH0gZWxzZSBpZiAoJFBST1RPID09ICdjb21wYWN0JykgeworICAgIHJldHVybiBuZXcgVENvbXBhY3RQcm90b2NvbCgkdHJhbnNwb3J0KTsKKyAgfSBlbHNlIGlmICgkUFJPVE8gPT0gJ2pzb24nKSB7CisgICAgcmV0dXJuIG5ldyBUSlNPTlByb3RvY29sKCR0cmFuc3BvcnQpOworICB9IGVsc2UgaWYgKCRQUk9UTyA9PSAnYWNjZWwnKSB7CisgICAgaWYgKCFmdW5jdGlvbl9leGlzdHMoJ3RocmlmdF9wcm90b2NvbF93cml0ZV9iaW5hcnknKSkgeworICAgICAgZWNobyAiQWNjZWxlcmF0aW9uIGV4dGVuc2lvbiBpcyBub3QgbG9hZGVkXG4iOworICAgICAgZXhpdCgxKTsKKyAgICB9CisgICAgcmV0dXJuIG5ldyBUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCgkdHJhbnNwb3J0KTsKKyAgfQorCisgIGVjaG8gIi0tcHJvdG9jb2wgbXVzdCBiZSBvbmUgb2Yge2JpbmFyeXxjb21wYWN0fGpzb258YWNjZWx9XG4iOworICBleGl0KDEpOworfQorCiAkaG9zdCA9ICdsb2NhbGhvc3QnOwogJHBvcnQgPSA5MDkwOwogCkBAIC02MCw2ICs4OCwxNiBAQAogICAkaG9zdCA9ICRhcmd2WzFdOwogfQogCitmb3JlYWNoICgkYXJndiBhcyAkYXJnKSB7CisgIGlmIChzdWJzdHIoJGFyZywgMCwgNykgPT0gJy0tcG9ydD0nKSB7CisgICAgJHBvcnQgPSBzdWJzdHIoJGFyZywgNyk7CisgIH0gZWxzZSBpZiAoc3Vic3RyKCRhcmcsIDAsIDEyKSA9PSAnLS10cmFuc3BvcnQ9JykgeworICAgICRNT0RFID0gc3Vic3RyKCRhcmcsIDEyKTsKKyAgfSBlbHNlIGlmIChzdWJzdHIoJGFyZywgMCwgMTEpID09ICctLXByb3RvY29sPScpIHsKKyAgICAkUFJPVE8gPSBzdWJzdHIoJGFyZywgMTEpOworICB9Cit9CisKICRob3N0cyA9IGFycmF5KCdsb2NhbGhvc3QnKTsKIAogJHNvY2tldCA9IG5ldyBUU29ja2V0KCRob3N0LCAkcG9ydCk7CkBAIC03MiwxMiArMTEwLDEyIEBACiB9IGVsc2UgaWYgKCRNT0RFID09ICdmcmFtZWQnKSB7CiAgICRmcmFtZWRTb2NrZXQgPSBuZXcgVEZyYW1lZFRyYW5zcG9ydCgkc29ja2V0KTsKICAgJHRyYW5zcG9ydCA9ICRmcmFtZWRTb2NrZXQ7Ci0gICRwcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2woJHRyYW5zcG9ydCk7CisgICRwcm90b2NvbCA9IG1ha2VQcm90b2NvbCgkdHJhbnNwb3J0LCAkUFJPVE8pOwogICAkdGVzdENsaWVudCA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0Q2xpZW50KCRwcm90b2NvbCk7CiB9IGVsc2UgewogICAkYnVmZmVyZWRTb2NrZXQgPSBuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KCRzb2NrZXQsIDEwMjQsIDEwMjQpOwogICAkdHJhbnNwb3J0ID0gJGJ1ZmZlcmVkU29ja2V0OwotICAkcHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKCR0cmFuc3BvcnQpOworICAkcHJvdG9jb2wgPSBtYWtlUHJvdG9jb2woJHRyYW5zcG9ydCwgJFBST1RPKTsKICAgJHRlc3RDbGllbnQgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdENsaWVudCgkcHJvdG9jb2wpOwogfQogCkBAIC04NSw2ICsxMjMsMTIgQEAKIAogJHN0YXJ0ID0gbWljcm90aW1lKHRydWUpOwogCitkZWZpbmUoJ0VSUl9CQVNFVFlQRVMnLCAxKTsKK2RlZmluZSgnRVJSX1NUUlVDVFMnLCAyKTsKK2RlZmluZSgnRVJSX0NPTlRBSU5FUlMnLCA0KTsKK2RlZmluZSgnRVJSX0VYQ0VQVElPTlMnLCA4KTsKK2RlZmluZSgnRVJSX1VOS05PV04nLCA2NCk7CiskZXhpdGNvZGUgPSAwOwogLyoqCiAgKiBWT0lEIFRFU1QKICAqLwpAQCAtOTIsNDAgKzEzNiw1NyBAQAogJHRlc3RDbGllbnQtPnRlc3RWb2lkKCk7CiBwcmludF9yKCIgPSB2b2lkXG4iKTsKIAorZnVuY3Rpb24gcm91bmR0cmlwKCR0ZXN0Q2xpZW50LCAkbWV0aG9kLCAkdmFsdWUpIHsKKyAgZ2xvYmFsICRleGl0Y29kZTsKKyAgcHJpbnRfcigiJG1ldGhvZCgkdmFsdWUpIik7CisgICRyZXQgPSAkdGVzdENsaWVudC0+JG1ldGhvZCgkdmFsdWUpOworICBwcmludF9yKCIgPSBcIiRyZXRcIlxuIik7CisgIGlmICgkdmFsdWUgIT09ICRyZXQpIHsKKyAgICBwcmludF9yKCIqKiogRkFJTEVEICoqKlxuIik7CisgICAgJGV4aXRjb2RlIHw9IEVSUl9CQVNFVFlQRVM7CisgIH0KK30KKwogLyoqCiAgKiBTVFJJTkcgVEVTVAogICovCi1wcmludF9yKCJ0ZXN0U3RyaW5nKFwiVGVzdFwiKSIpOwotJHMgPSAkdGVzdENsaWVudC0+dGVzdFN0cmluZygiVGVzdCIpOwotcHJpbnRfcigiID0gXCIkc1wiXG4iKTsKK3JvdW5kdHJpcCgkdGVzdENsaWVudCwgJ3Rlc3RTdHJpbmcnLCAiVGVzdCIpOworCisvKioKKyAqIEJPT0wgVEVTVAorICovCityb3VuZHRyaXAoJHRlc3RDbGllbnQsICd0ZXN0Qm9vbCcsIHRydWUpOworcm91bmR0cmlwKCR0ZXN0Q2xpZW50LCAndGVzdEJvb2wnLCBmYWxzZSk7CiAKIC8qKgogICogQllURSBURVNUCiAgKi8KLXByaW50X3IoInRlc3RCeXRlKDEpIik7Ci0kdTggPSAkdGVzdENsaWVudC0+dGVzdEJ5dGUoMSk7Ci1wcmludF9yKCIgPSAkdThcbiIpOworcm91bmR0cmlwKCR0ZXN0Q2xpZW50LCAndGVzdEJ5dGUnLCAxKTsKK3JvdW5kdHJpcCgkdGVzdENsaWVudCwgJ3Rlc3RCeXRlJywgLTEpOworcm91bmR0cmlwKCR0ZXN0Q2xpZW50LCAndGVzdEJ5dGUnLCAxMjcpOworcm91bmR0cmlwKCR0ZXN0Q2xpZW50LCAndGVzdEJ5dGUnLCAtMTI4KTsKIAogLyoqCiAgKiBJMzIgVEVTVAogICovCi1wcmludF9yKCJ0ZXN0STMyKC0xKSIpOwotJGkzMiA9ICR0ZXN0Q2xpZW50LT50ZXN0STMyKC0xKTsKLXByaW50X3IoIiA9ICRpMzJcbiIpOworcm91bmR0cmlwKCR0ZXN0Q2xpZW50LCAndGVzdEkzMicsIC0xKTsKIAogLyoqCiAgKiBJNjQgVEVTVAogICovCi1wcmludF9yKCJ0ZXN0STY0KC0zNDM1OTczODM2OCkiKTsKLSRpNjQgPSAkdGVzdENsaWVudC0+dGVzdEk2NCgtMzQzNTk3MzgzNjgpOwotcHJpbnRfcigiID0gJGk2NFxuIik7Cityb3VuZHRyaXAoJHRlc3RDbGllbnQsICd0ZXN0STY0JywgMCk7Cityb3VuZHRyaXAoJHRlc3RDbGllbnQsICd0ZXN0STY0JywgMSk7Cityb3VuZHRyaXAoJHRlc3RDbGllbnQsICd0ZXN0STY0JywgLTEpOworcm91bmR0cmlwKCR0ZXN0Q2xpZW50LCAndGVzdEk2NCcsIC0zNDM1OTczODM2OCk7CiAKIC8qKgogICogRE9VQkxFIFRFU1QKICAqLwotcHJpbnRfcigidGVzdERvdWJsZSgtODUyLjIzNDIzNDIzNCkiKTsKLSRkdWIgPSAkdGVzdENsaWVudC0+dGVzdERvdWJsZSgtODUyLjIzNDIzNDIzNCk7Ci1wcmludF9yKCIgPSAkZHViXG4iKTsKK3JvdW5kdHJpcCgkdGVzdENsaWVudCwgJ3Rlc3REb3VibGUnLCAtODUyLjIzNDIzNDIzNCk7CisKKy8qKgorICogQklOQVJZIFRFU1QgIC0tICBUT0RPCisgKi8KIAogLyoqCiAgKiBTVFJVQ1QgVEVTVApAQCAtMTQyLDYgKzIwMywxMSBAQAogICAgICAgICAkaW4tPmkzMl90aGluZy4iLCAiLgogICAgICAgICAkaW4tPmk2NF90aGluZy4ifVxuIik7CiAKK2lmICgkaW4gIT0gJG91dCkgeworICAgIGVjaG8gIioqRkFJTEVEKipcbiI7CisgICAgJGV4aXRjb2RlIHw9IEVSUl9TVFJVQ1RTOworfQorCiAvKioKICAqIE5FU1RFRCBTVFJVQ1QgVEVTVAogICovCkBAIC0xNTksNiArMjI1LDExIEBACiAgICAgICAgICRpbi0+aTY0X3RoaW5nLiJ9LCAiLgogICAgICAgICAkaW4yLT5pMzJfdGhpbmcuIn1cbiIpOwogCitpZiAoJGluMiAhPSAkb3V0MikgeworICAgIGVjaG8gIioqRkFJTEVEKipcbiI7CisgICAgJGV4aXRjb2RlIHw9IEVSUl9TVFJVQ1RTOworfQorCiAvKioKICAqIE1BUCBURVNUCiAgKi8KQEAgLTE5MSwzNiArMjYyLDY5IEBACiB9CiBwcmludF9yKCJ9XG4iKTsKIAoraWYgKCRtYXBpbiAhPSAkbWFwb3V0KSB7CisgICAgZWNobyAiKipGQUlMRUQqKlxuIjsKKyAgICAkZXhpdGNvZGUgfD0gRVJSX0NPTlRBSU5FUlM7Cit9CisKKyRtYXBvdXQgPSBhcnJheSgpOworZm9yICgkaSA9IDA7ICRpIDwgMTA7ICRpKyspIHsKKyAgICAkbWFwb3V0WyJrZXkkaSJdID0gInZhbCRpIjsKK30KK3ByaW50X3IoJ3Rlc3RTdHJpbmdNYXAoeycpOworJGZpcnN0ID0gdHJ1ZTsKK2ZvcmVhY2ggKCRtYXBvdXQgYXMgJGtleSA9PiAkdmFsKSB7CisgIGlmICgkZmlyc3QpIHsKKyAgICAkZmlyc3QgPSBmYWxzZTsKKyAgfSBlbHNlIHsKKyAgICBwcmludF9yKCIsICIpOworICB9CisgIHByaW50X3IoIlwiJGtleVwiID0+IFwiJHZhbFwiIik7Cit9CitwcmludF9yKCJ9KSIpOworJG1hcGluID0gJHRlc3RDbGllbnQtPnRlc3RTdHJpbmdNYXAoJG1hcG91dCk7CitwcmludF9yKCIgPSB7Iik7CiskZmlyc3QgPSB0cnVlOworZm9yZWFjaCAoJG1hcGluIGFzICRrZXkgPT4gJHZhbCkgeworICBpZiAoJGZpcnN0KSB7CisgICAgJGZpcnN0ID0gZmFsc2U7CisgIH0gZWxzZSB7CisgICAgcHJpbnRfcigiLCAiKTsKKyAgfQorICBwcmludF9yKCJcIiRrZXlcIiA9PiBcIiR2YWxcIiIpOworfQorcHJpbnRfcigifVxuIik7Citrc29ydCgkbWFwaW4pOworaWYgKCRtYXBpbiAhPSAkbWFwb3V0KSB7CisgICAgZWNobyAiKipGQUlMRUQqKlxuIjsKKyAgICAkZXhpdGNvZGUgfD0gRVJSX0NPTlRBSU5FUlM7Cit9CisKIC8qKgogICogU0VUIFRFU1QKICAqLwogJHNldG91dCA9IGFycmF5KCk7OwogZm9yICgkaSA9IC0yOyAkaSA8IDM7ICsrJGkpIHsKLSAgJHNldG91dCBbXT0gJGk7CisgICRzZXRvdXRbJGldPSB0cnVlOwogfQogcHJpbnRfcigidGVzdFNldCh7Iik7Ci0kZmlyc3QgPSB0cnVlOwotZm9yZWFjaCAoJHNldG91dCBhcyAkdmFsKSB7Ci0gIGlmICgkZmlyc3QpIHsKLSAgICAkZmlyc3QgPSBmYWxzZTsKLSAgfSBlbHNlIHsKLSAgICBwcmludF9yKCIsICIpOwotICB9Ci0gIHByaW50X3IoJHZhbCk7Ci19CitlY2hvIGltcGxvZGUoJywnLCBhcnJheV9rZXlzKCRzZXRvdXQpKTsKIHByaW50X3IoIn0pIik7CiAkc2V0aW4gPSAkdGVzdENsaWVudC0+dGVzdFNldCgkc2V0b3V0KTsKIHByaW50X3IoIiA9IHsiKTsKLSRmaXJzdCA9IHRydWU7Ci1mb3JlYWNoICgkc2V0aW4gYXMgJHZhbCkgewotICBpZiAoJGZpcnN0KSB7Ci0gICAgJGZpcnN0ID0gZmFsc2U7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRfcigiLCAiKTsKLSAgfQotICBwcmludF9yKCR2YWwpOwotfQorZWNobyBpbXBsb2RlKCcsICcsIGFycmF5X2tleXMoJHNldGluKSk7CiBwcmludF9yKCJ9XG4iKTsKKy8vIE9yZGVyIG9mIGtleXMgaW4gc2V0IGRvZXMgbm90IG1hdHRlcgora3NvcnQoJHNldGluKTsKK2lmICgkc2V0b3V0ICE9PSAkc2V0aW4pIHsKKyAgICBlY2hvICIqKkZBSUxFRCoqXG4iOworICAgICRleGl0Y29kZSB8PSBFUlJfQ09OVEFJTkVSUzsKK30KKy8vIFJlZ3Jlc3Npb24gdGVzdCBmb3IgY29ycnVwdGVkIGFycmF5CitpZiAoJHNldGluWzJdICE9PSAkc2V0b3V0WzJdIHx8IGlzX2ludCgkc2V0aW5bMl0pKSB7CisgICAgZWNobyAiKipGQUlMRUQqKlxuIjsKKyAgICAkZXhpdGNvZGUgfD0gRVJSX0NPTlRBSU5FUlM7Cit9CiAKIC8qKgogICogTElTVCBURVNUCkBAIC0yNTIsNiArMzU2LDEwIEBACiAgIHByaW50X3IoJHZhbCk7CiB9CiBwcmludF9yKCJ9XG4iKTsKK2lmICgkbGlzdGluICE9PSAkbGlzdG91dCkgeworICAgIGVjaG8gIioqRkFJTEVEKipcbiI7CisgICAgJGV4aXRjb2RlIHw9IEVSUl9DT05UQUlORVJTOworfQogCiAvKioKICAqIEVOVU0gVEVTVApAQCAtMjU5LDIyICszNjcsNDIgQEAKIHByaW50X3IoInRlc3RFbnVtKE9ORSkiKTsKICRyZXQgPSAkdGVzdENsaWVudC0+dGVzdEVudW0oXFRocmlmdFRlc3RcTnVtYmVyejo6T05FKTsKIHByaW50X3IoIiA9ICRyZXRcbiIpOworaWYgKCRyZXQgIT0gXFRocmlmdFRlc3RcTnVtYmVyejo6T05FKSB7CisgICAgZWNobyAiKipGQUlMRUQqKlxuIjsKKyAgICAkZXhpdGNvZGUgfD0gRVJSX1NUUlVDVFM7Cit9CiAKIHByaW50X3IoInRlc3RFbnVtKFRXTykiKTsKICRyZXQgPSAkdGVzdENsaWVudC0+dGVzdEVudW0oXFRocmlmdFRlc3RcTnVtYmVyejo6VFdPKTsKIHByaW50X3IoIiA9ICRyZXRcbiIpOworaWYgKCRyZXQgIT0gXFRocmlmdFRlc3RcTnVtYmVyejo6VFdPKSB7CisgICAgZWNobyAiKipGQUlMRUQqKlxuIjsKKyAgICAkZXhpdGNvZGUgfD0gRVJSX1NUUlVDVFM7Cit9CiAKIHByaW50X3IoInRlc3RFbnVtKFRIUkVFKSIpOwogJHJldCA9ICR0ZXN0Q2xpZW50LT50ZXN0RW51bShcVGhyaWZ0VGVzdFxOdW1iZXJ6OjpUSFJFRSk7CiBwcmludF9yKCIgPSAkcmV0XG4iKTsKK2lmICgkcmV0ICE9IFxUaHJpZnRUZXN0XE51bWJlcno6OlRIUkVFKSB7CisgICAgZWNobyAiKipGQUlMRUQqKlxuIjsKKyAgICAkZXhpdGNvZGUgfD0gRVJSX1NUUlVDVFM7Cit9CiAKIHByaW50X3IoInRlc3RFbnVtKEZJVkUpIik7CiAkcmV0ID0gJHRlc3RDbGllbnQtPnRlc3RFbnVtKFxUaHJpZnRUZXN0XE51bWJlcno6OkZJVkUpOwogcHJpbnRfcigiID0gJHJldFxuIik7CitpZiAoJHJldCAhPSBcVGhyaWZ0VGVzdFxOdW1iZXJ6OjpGSVZFKSB7CisgICAgZWNobyAiKipGQUlMRUQqKlxuIjsKKyAgICAkZXhpdGNvZGUgfD0gRVJSX1NUUlVDVFM7Cit9CiAKIHByaW50X3IoInRlc3RFbnVtKEVJR0hUKSIpOwogJHJldCA9ICR0ZXN0Q2xpZW50LT50ZXN0RW51bShcVGhyaWZ0VGVzdFxOdW1iZXJ6OjpFSUdIVCk7CiBwcmludF9yKCIgPSAkcmV0XG4iKTsKK2lmICgkcmV0ICE9IFxUaHJpZnRUZXN0XE51bWJlcno6OkVJR0hUKSB7CisgICAgZWNobyAiKipGQUlMRUQqKlxuIjsKKyAgICAkZXhpdGNvZGUgfD0gRVJSX1NUUlVDVFM7Cit9CiAKIC8qKgogICogVFlQRURFRiBURVNUCkBAIC0yODIsNiArNDEwLDEwIEBACiBwcmludF9yKCJ0ZXN0VHlwZWRlZigzMDk4NTgyMzUwODI1MjMpIik7CiAkdWlkID0gJHRlc3RDbGllbnQtPnRlc3RUeXBlZGVmKDMwOTg1ODIzNTA4MjUyMyk7CiBwcmludF9yKCIgPSAkdWlkXG4iKTsKK2lmICgkdWlkICE9PSAzMDk4NTgyMzUwODI1MjMpIHsKKyAgICBlY2hvICIqKkZBSUxFRCoqXG4iOworICAgICRleGl0Y29kZSB8PSBFUlJfU1RSVUNUUzsKK30KIAogLyoqCiAgKiBORVNURUQgTUFQIFRFU1QKQEAgLTI5Nyw2ICs0MjksMTQgQEAKICAgcHJpbnRfcigifSwgIik7CiB9CiBwcmludF9yKCJ9XG4iKTsKKyRleHBlY3RlZF9tbSA9IFsKKyAgLTQgPT4gWy00ID0+IC00LCAtMyA9PiAtMywgLTIgPT4gLTIsIC0xID0+IC0xXSwKKyAgNCA9PiBbNCA9PiA0LCAzID0+IDMsIDIgPT4gMiwgMSA9PiAxXSwKK107CitpZiAoJG1tICE9ICRleHBlY3RlZF9tbSkgeworICAgIGVjaG8gIioqRkFJTEVEKipcbiI7CisgICAgJGV4aXRjb2RlIHw9IEVSUl9DT05UQUlORVJTOworfQogCiAvKioKICAqIElOU0FOSVRZIFRFU1QKQEAgLTM0OCwxMCArNDg4LDI5IEBACiB0cnkgewogICAkdGVzdENsaWVudC0+dGVzdEV4Y2VwdGlvbignWGNlcHRpb24nKTsKICAgcHJpbnRfcigiICB2b2lkXG5GQUlMVVJFXG4iKTsKKyAgJGV4aXRjb2RlIHw9IEVSUl9FWENFUFRJT05TOwogfSBjYXRjaCAoXFRocmlmdFRlc3RcWGNlcHRpb24gJHgpIHsKICAgcHJpbnRfcignIGNhdWdodCB4Y2VwdGlvbiAnLiR4LT5lcnJvckNvZGUuJzogJy4keC0+bWVzc2FnZS4iXG4iKTsKIH0KIAorLy8gUmVncmVzc2lvbiB0ZXN0IGZvciBUSFJJRlQtNDI2MworcHJpbnRfcigidGVzdEJpbmFyeVNlcmlhbGl6ZXJfRGVzZXJpYWxpemUoJ2ZvbycpIik7Cit0cnkgeworICBcVGhyaWZ0XFNlcmlhbGl6ZXJcVEJpbmFyeVNlcmlhbGl6ZXI6OmRlc2VyaWFsaXplKGJhc2U2NF9kZWNvZGUoJ2ZvbycpLCBcVGhyaWZ0VGVzdFxYdHJ1Y3QyOjpjbGFzcyk7CisgIGVjaG8gIioqRkFJTEVEKipcbiI7CisgICRleGl0Y29kZSB8PSBFUlJfU1RSVUNUUzsKK30gY2F0Y2ggKFxUaHJpZnRcRXhjZXB0aW9uXFRUcmFuc3BvcnRFeGNlcHRpb24gJGhhcHB5X2V4Y2VwdGlvbikgeworICAvLyBXZSBleHBlY3RlZCB0aGlzIGR1ZSB0byBiaW5hcnkgZGF0YSBvZiBiYXNlNjRfZGVjb2RlKCdmb28nKSBpcyBsZXNzIHRoZW4gNAorICAvLyBieXRlcyBhbmQgaXQgdHJpZXMgdG8gZmluZCB0aHJpZnQgdmVyc2lvbiBudW1iZXIgaW4gdGhlIHRyYW5zcG9ydCBieQorICAvLyByZWFkaW5nIGkzMigpIGF0IHRoZSBiZWdpbm5pbmcuICBDYXN0aW5nIHRvIHN0cmluZyB2YWxpZGF0ZXMgdGhhdAorICAvLyBleGNlcHRpb24gaXMgc3RpbGwgYWNjZXNzaWJsZSBpbiBtZW1vcnkgYW5kIG5vdCBjb3JydXB0ZWQuICBXaXRob3V0IHBhdGNoLAorICAvLyBQSFAgd2lsbCBlcnJvciBsb2cgdGhhdCB0aGUgZXhjZXB0aW9uIGRvZXNuJ3QgaGF2ZSBhbnkgdG9zdHJpbmcgbWV0aG9kLAorICAvLyB3aGljaCBpcyBhIGxpZSBkdWUgdG8gY29ycnVwdGVkIG1lbW9yeS4KKyAgZm9yKCRpPTk5OyAkaSA+IDA7ICRpLS0pIHsKKyAgICAoc3RyaW5nKSRoYXBweV9leGNlcHRpb247CisgIH0KKyAgcHJpbnRfcigiICBTVUNDRVNTXG4iKTsKK30KIAogLyoqCiAgKiBOb3JtYWwgdGVzdHMgZG9uZS4KQEAgLTM2NSwzNCArNTI0LDM0IEBACiAgKiBFeHRyYW5lb3VzICJJIGRvbid0IHRydXN0IFBIUCB0byBwYWNrL3VucGFjayBpbnRlZ2VyIiB0ZXN0cwogICovCiAKK2lmICgkcHJvdG9jb2wgaW5zdGFuY2VvZiBUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCkgeworICAgIC8vIFJlZ3Jlc3Npb24gY2hlY2s6IGNoZWNrIHRoYXQgbWV0aG9kIG5hbWUgaXMgbm90IGRvdWJsZS1mcmVlZAorICAgIC8vIE1ldGhvZCBuYW1lIHNob3VsZCBub3QgYmUgYW4gaW50ZXJuZWQgc3RyaW5nLgorICAgICRtZXRob2RfbmFtZSA9ICJWb2lkIjsKKyAgICAkbWV0aG9kX25hbWUgPSAidGVzdCRtZXRob2RfbmFtZSI7CisKKyAgICAkc2VxaWQgPSAwOworICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFZvaWRfYXJncygpOworICAgIHRocmlmdF9wcm90b2NvbF93cml0ZV9iaW5hcnkoJHByb3RvY29sLCAkbWV0aG9kX25hbWUsIFxUaHJpZnRcVHlwZVxUTWVzc2FnZVR5cGU6OkNBTEwsICRhcmdzLCAkc2VxaWQsICRwcm90b2NvbC0+aXNTdHJpY3RXcml0ZSgpKTsKKyAgICAkdGVzdENsaWVudC0+cmVjdl90ZXN0Vm9pZCgpOworCit9CisKIC8vIE1heCBJMzIKICRudW0gPSBwb3coMiwgMzApICsgKHBvdygyLCAzMCkgLSAxKTsKLSRudW0yID0gJHRlc3RDbGllbnQtPnRlc3RJMzIoJG51bSk7Ci1pZiAoJG51bSAhPSAkbnVtMikgewotICBwcmludCAiTWlzc2VkICRudW0gPSAkbnVtMlxuIjsKLX0KK3JvdW5kdHJpcCgkdGVzdENsaWVudCwgJ3Rlc3RJMzInLCAkbnVtKTsKIAogLy8gTWluIEkzMgogJG51bSA9IDAgLSBwb3coMiwgMzEpOwotJG51bTIgPSAkdGVzdENsaWVudC0+dGVzdEkzMigkbnVtKTsKLWlmICgkbnVtICE9ICRudW0yKSB7Ci0gIHByaW50ICJNaXNzZWQgJG51bSA9ICRudW0yXG4iOwotfQorcm91bmR0cmlwKCR0ZXN0Q2xpZW50LCAndGVzdEkzMicsICRudW0pOwogCiAvLyBNYXggSTY0CiAkbnVtID0gcG93KDIsIDYyKSArIChwb3coMiwgNjIpIC0gMSk7Ci0kbnVtMiA9ICR0ZXN0Q2xpZW50LT50ZXN0STY0KCRudW0pOwotaWYgKCRudW0gIT0gJG51bTIpIHsKLSAgcHJpbnQgIk1pc3NlZCAkbnVtID0gJG51bTJcbiI7Ci19Cityb3VuZHRyaXAoJHRlc3RDbGllbnQsICd0ZXN0STY0JywgJG51bSk7CiAKIC8vIE1pbiBJNjQKLSRudW0gPSAwIC0gcG93KDIsIDYzKTsKLSRudW0yID0gJHRlc3RDbGllbnQtPnRlc3RJNjQoJG51bSk7Ci1pZiAoJG51bSAhPSAkbnVtMikgewotICBwcmludCAiTWlzc2VkICRudW0gPSAkbnVtMlxuIjsKLX0KKyRudW0gPSAwIC0gcG93KDIsIDYyKSAtIHBvdygyLCA2Mik7Cityb3VuZHRyaXAoJHRlc3RDbGllbnQsICd0ZXN0STY0JywgJG51bSk7CiAKICR0cmFuc3BvcnQtPmNsb3NlKCk7Ci1yZXR1cm47Ci0KK2V4aXQoJGV4aXRjb2RlKTsKZGlmZiAtLWdpdCBhL3Rlc3QvcGhwL3Rlc3RfcGhwLmluaSBiL3Rlc3QvcGhwL3Rlc3RfcGhwLmluaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjliYjIxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9waHAvdGVzdF9waHAuaW5pCkBAIC0wLDAgKzEsMiBAQAorZXh0ZW5zaW9uPXRocmlmdF9wcm90b2NvbC5zbworZXh0ZW5zaW9uPXNvY2tldHMuc28KZGlmZiAtLWdpdCBhL3Rlc3QvcHkudG9ybmFkby9zZXR1cC5jZmcgYi90ZXN0L3B5LnRvcm5hZG8vc2V0dXAuY2ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlNTg3YzQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3B5LnRvcm5hZG8vc2V0dXAuY2ZnCkBAIC0wLDAgKzEsMyBAQAorW2ZsYWtlOF0KK2lnbm9yZSA9IEU0MDIKK21heC1saW5lLWxlbmd0aCA9IDEwMApkaWZmIC0tZ2l0IGEvdGVzdC9weS50b3JuYWRvL3Rlc3Rfc3VpdGUucHkgYi90ZXN0L3B5LnRvcm5hZG8vdGVzdF9zdWl0ZS5weQppbmRleCBjNzgzOTYyLi40NDdmZGU2IDEwMDc1NQotLS0gYS90ZXN0L3B5LnRvcm5hZG8vdGVzdF9zdWl0ZS5weQorKysgYi90ZXN0L3B5LnRvcm5hZG8vdGVzdF9zdWl0ZS5weQpAQCAtMjEsMzAgKzIxLDMwIEBACiAKIGltcG9ydCBkYXRldGltZQogaW1wb3J0IGdsb2IKLWltcG9ydCBzeXMKIGltcG9ydCBvcworaW1wb3J0IHN5cwogaW1wb3J0IHRpbWUKIGltcG9ydCB1bml0dGVzdAogCiBiYXNlcGF0aCA9IG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pKQotc3lzLnBhdGguaW5zZXJ0KDAsIGJhc2VwYXRoKycvZ2VuLXB5LnRvcm5hZG8nKQotc3lzLnBhdGguaW5zZXJ0KDAsIGdsb2IuZ2xvYihvcy5wYXRoLmpvaW4oYmFzZXBhdGgsICcuLi8uLi9saWIvcHkvYnVpbGQvbGliLionKSlbMF0pCitzeXMucGF0aC5pbnNlcnQoMCwgYmFzZXBhdGggKyAnL2dlbi1weS50b3JuYWRvJykKK3N5cy5wYXRoLmluc2VydCgwLCBnbG9iLmdsb2Iob3MucGF0aC5qb2luKGJhc2VwYXRoLCAnLi4vLi4vbGliL3B5L2J1aWxkL2xpYionKSlbMF0pCiAKIHRyeToKICAgICBfX2ltcG9ydF9fKCd0b3JuYWRvJykKIGV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICBwcmludCAibW9kdWxlIGB0b3JuYWRvYCBub3QgZm91bmQsIHNraXBwaW5nIHRlc3QiCisgICAgcHJpbnQoIm1vZHVsZSBgdG9ybmFkb2Agbm90IGZvdW5kLCBza2lwcGluZyB0ZXN0IikKICAgICBzeXMuZXhpdCgwKQogCiBmcm9tIHRvcm5hZG8gaW1wb3J0IGdlbgogZnJvbSB0b3JuYWRvLnRlc3RpbmcgaW1wb3J0IEFzeW5jVGVzdENhc2UsIGdldF91bnVzZWRfcG9ydCwgZ2VuX3Rlc3QKIAogZnJvbSB0aHJpZnQgaW1wb3J0IFRUb3JuYWRvCitmcm9tIHRocmlmdC5UaHJpZnQgaW1wb3J0IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbgogZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbAotZnJvbSB0aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnRFeGNlcHRpb24KIAogZnJvbSBUaHJpZnRUZXN0IGltcG9ydCBUaHJpZnRUZXN0Ci1mcm9tIFRocmlmdFRlc3QudHR5cGVzIGltcG9ydCAqCitmcm9tIFRocmlmdFRlc3QudHR5cGVzIGltcG9ydCBYY2VwdGlvbiwgWHRydWN0CiAKIAogY2xhc3MgVGVzdEhhbmRsZXIob2JqZWN0KToKQEAgLTU1LDYgKzU1LDggQEAKICAgICAgICAgcGFzcwogCiAgICAgZGVmIHRlc3RTdHJpbmcoc2VsZiwgcyk6CisgICAgICAgIGlmIHMgPT0gJ3VuZXhwZWN0ZWRfZXJyb3InOgorICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKHMpCiAgICAgICAgIHJldHVybiBzCiAKICAgICBkZWYgdGVzdEJ5dGUoc2VsZiwgYik6CkBAIC03Miw2ICs3NCw5IEBACiAgICAgZGVmIHRlc3REb3VibGUoc2VsZiwgZHViKToKICAgICAgICAgcmV0dXJuIGR1YgogCisgICAgZGVmIHRlc3RCaW5hcnkoc2VsZiwgdGhpbmcpOgorICAgICAgICByZXR1cm4gdGhpbmcKKwogICAgIGRlZiB0ZXN0U3RydWN0KHNlbGYsIHRoaW5nKToKICAgICAgICAgcmV0dXJuIHRoaW5nCiAKQEAgLTgyLDcgKzg3LDcgQEAKICAgICAgICAgICAgIHgubWVzc2FnZSA9IHMKICAgICAgICAgICAgIHJhaXNlIHgKICAgICAgICAgZWxpZiBzID09ICd0aHJvd191bmRlY2xhcmVkJzoKLSAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImZvbyIpCisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCd0ZXN0aW5nIHVuZGVjbGFyZWQgZXhjZXB0aW9uJykKIAogICAgIGRlZiB0ZXN0T25ld2F5KHNlbGYsIHNlY29uZHMpOgogICAgICAgICBzdGFydCA9IHRpbWUudGltZSgpCkBAIC05NCw2ICs5OSw3IEBACiAgICAgICAgIHNlbGYudGVzdF9pbnN0YW5jZS5pb19sb29wLmFkZF90aW1lb3V0KAogICAgICAgICAgICAgZGF0ZXRpbWUudGltZWRlbHRhKHNlY29uZHM9c2Vjb25kcyksCiAgICAgICAgICAgICBmaXJlX29uZXdheSkKKyAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCd0ZXN0aW5nIGV4Y2VwdGlvbiBpbiBvbmV3YXkgbWV0aG9kJykKIAogICAgIGRlZiB0ZXN0TmVzdChzZWxmLCB0aGluZyk6CiAgICAgICAgIHJldHVybiB0aGluZwpAQCAtMTg0LDEwICsxOTAsMTEgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5LmkzMl90aGluZywgLTMpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeS5pNjRfdGhpbmcsIC01KQogCisgICAgQGdlbl90ZXN0CiAgICAgZGVmIHRlc3Rfb25ld2F5KHNlbGYpOgotICAgICAgICBzZWxmLmNsaWVudC50ZXN0T25ld2F5KDAuNSkKLSAgICAgICAgc3RhcnQsIGVuZCwgc2Vjb25kcyA9IHNlbGYud2FpdCh0aW1lb3V0PTEpCi0gICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWxzKHNlY29uZHMsIChlbmQgLSBzdGFydCksIHBsYWNlcz0zKQorICAgICAgICBzZWxmLmNsaWVudC50ZXN0T25ld2F5KDEpCisgICAgICAgIHYgPSB5aWVsZCBzZWxmLmNsaWVudC50ZXN0STMyKC0xKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHYsIC0xKQogCiAgICAgQGdlbl90ZXN0CiAgICAgZGVmIHRlc3RfbWFwKHNlbGYpOgpAQCAtMjAwLDggKzIwNyw2IEBACiAKICAgICBAZ2VuX3Rlc3QKICAgICBkZWYgdGVzdF9leGNlcHRpb24oc2VsZik6Ci0gICAgICAgIHlpZWxkIHNlbGYuY2xpZW50LnRlc3RFeGNlcHRpb24oJ1NhZmUnKQotCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHlpZWxkIHNlbGYuY2xpZW50LnRlc3RFeGNlcHRpb24oJ1hjZXB0aW9uJykKICAgICAgICAgZXhjZXB0IFhjZXB0aW9uIGFzIGV4OgpAQCAtMjExLDExICsyMTYsMTMgQEAKICAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgZ290dGVuIGV4Y2VwdGlvbiIpCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHlpZWxkIHNlbGYuY2xpZW50LnRlc3RFeGNlcHRpb24oJ3Rocm93X3VuZGVjbGFyZWQnKQotICAgICAgICBleGNlcHQgVFRyYW5zcG9ydEV4Y2VwdGlvbiBhcyBleDoKKyAgICAgICAgZXhjZXB0IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjoKICAgICAgICAgICAgIHBhc3MKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgZ290dGVuIGV4Y2VwdGlvbiIpCiAKKyAgICAgICAgeWllbGQgc2VsZi5jbGllbnQudGVzdEV4Y2VwdGlvbignU2FmZScpCisKIAogZGVmIHN1aXRlKCk6CiAgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQpkaWZmIC0tZ2l0IGEvdGVzdC9weS50d2lzdGVkL01ha2VmaWxlLmFtIGIvdGVzdC9weS50d2lzdGVkL01ha2VmaWxlLmFtCmluZGV4IDQ3MjNiN2QuLmQxMTkwOGMgMTAwNjQ0Ci0tLSBhL3Rlc3QvcHkudHdpc3RlZC9NYWtlZmlsZS5hbQorKysgYi90ZXN0L3B5LnR3aXN0ZWQvTWFrZWZpbGUuYW0KQEAgLTE3LDE0ICsxNywxNCBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotVEhSSUZUID0gJCh0b3Bfc3JjZGlyKS9jb21waWxlci9jcHAvdGhyaWZ0CitUUklBTCA/PSB0cmlhbAogCiBzdHViczogLi4vVGhyaWZ0VGVzdC50aHJpZnQgLi4vU21hbGxUZXN0LnRocmlmdAogCSQoVEhSSUZUKSAtLWdlbiBweTp0d2lzdGVkIC4uL1RocmlmdFRlc3QudGhyaWZ0CiAJJChUSFJJRlQpIC0tZ2VuIHB5OnR3aXN0ZWQgLi4vU21hbGxUZXN0LnRocmlmdAogCiBjaGVjazogc3R1YnMKLQkkKFRSSUFMKSB0ZXN0X3N1aXRlLnB5CisJJChUUklBTCkgLi90ZXN0X3N1aXRlLnB5CiAKIGNsZWFuLWxvY2FsOgogCSQoUk0pIC1yIGdlbi1weS50d2lzdGVkCmRpZmYgLS1naXQgYS90ZXN0L3B5LnR3aXN0ZWQvc2V0dXAuY2ZnIGIvdGVzdC9weS50d2lzdGVkL3NldHVwLmNmZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTU4N2M0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9weS50d2lzdGVkL3NldHVwLmNmZwpAQCAtMCwwICsxLDMgQEAKK1tmbGFrZThdCitpZ25vcmUgPSBFNDAyCittYXgtbGluZS1sZW5ndGggPSAxMDAKZGlmZiAtLWdpdCBhL3Rlc3QvcHkudHdpc3RlZC90ZXN0X3N1aXRlLnB5IGIvdGVzdC9weS50d2lzdGVkL3Rlc3Rfc3VpdGUucHkKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCA2ZTFmZWUyLi4wMmViN2YxCi0tLSBhL3Rlc3QvcHkudHdpc3RlZC90ZXN0X3N1aXRlLnB5CisrKyBiL3Rlc3QvcHkudHdpc3RlZC90ZXN0X3N1aXRlLnB5CkBAIC0xLDMgKzEsNSBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisKICMKICMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQogIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQpAQCAtMTcsOSArMTksMTYgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLWltcG9ydCBzeXMsIGdsb2IsIHRpbWUKLXN5cy5wYXRoLmluc2VydCgwLCAnLi9nZW4tcHkudHdpc3RlZCcpCi1zeXMucGF0aC5pbnNlcnQoMCwgZ2xvYi5nbG9iKCcuLi8uLi9saWIvcHkvYnVpbGQvbGliLionKVswXSkKK2ltcG9ydCBnbG9iCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2ltcG9ydCB0aW1lCisKK2Jhc2VwYXRoID0gb3MucGF0aC5hYnNwYXRoKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykpCitzeXMucGF0aC5pbnNlcnQoMCwgb3MucGF0aC5qb2luKGJhc2VwYXRoLCAnZ2VuLXB5LnR3aXN0ZWQnKSkKK3N5cy5wYXRoLmluc2VydCgwLCBnbG9iLmdsb2Iob3MucGF0aC5qb2luKGJhc2VwYXRoLCAnLi4vLi4vbGliL3B5L2J1aWxkL2xpYi4qJykpWzBdKQorCitmcm9tIHRocmlmdC5UaHJpZnQgaW1wb3J0IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbgogCiBmcm9tIFRocmlmdFRlc3QgaW1wb3J0IFRocmlmdFRlc3QKIGZyb20gVGhyaWZ0VGVzdC50dHlwZXMgaW1wb3J0IFhjZXB0aW9uLCBYdHJ1Y3QKQEAgLTMwLDExICszOSwxMSBAQAogZnJvbSB0d2lzdGVkLmludGVybmV0IGltcG9ydCBkZWZlciwgcmVhY3RvcgogZnJvbSB0d2lzdGVkLmludGVybmV0LnByb3RvY29sIGltcG9ydCBDbGllbnRDcmVhdG9yCiAKLWZyb20gem9wZS5pbnRlcmZhY2UgaW1wb3J0IGltcGxlbWVudHMKK2Zyb20gem9wZS5pbnRlcmZhY2UgaW1wb3J0IGltcGxlbWVudGVyCiAKKworQGltcGxlbWVudGVyKFRocmlmdFRlc3QuSWZhY2UpCiBjbGFzcyBUZXN0SGFuZGxlcjoKLSAgICBpbXBsZW1lbnRzKFRocmlmdFRlc3QuSWZhY2UpCi0KICAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgIHNlbGYub25ld2F5c1F1ZXVlID0gZGVmZXIuRGVmZXJyZWRRdWV1ZSgpCiAKQEAgLTU5LDYgKzY4LDkgQEAKICAgICBkZWYgdGVzdERvdWJsZShzZWxmLCBkdWIpOgogICAgICAgICByZXR1cm4gZHViCiAKKyAgICBkZWYgdGVzdEJpbmFyeShzZWxmLCB0aGluZyk6CisgICAgICAgIHJldHVybiB0aGluZworCiAgICAgZGVmIHRlc3RTdHJ1Y3Qoc2VsZiwgdGhpbmcpOgogICAgICAgICByZXR1cm4gdGhpbmcKIApAQCAtNzUsNiArODcsNyBAQAogICAgICAgICBkZWYgZmlyZU9uZXdheSh0KToKICAgICAgICAgICAgIHNlbGYub25ld2F5c1F1ZXVlLnB1dCgodCwgdGltZS50aW1lKCksIHNlY29uZHMpKQogICAgICAgICByZWFjdG9yLmNhbGxMYXRlcihzZWNvbmRzLCBmaXJlT25ld2F5LCB0aW1lLnRpbWUoKSkKKyAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCcnKQogCiAgICAgZGVmIHRlc3ROZXN0KHNlbGYsIHRoaW5nKToKICAgICAgICAgcmV0dXJuIHRoaW5nCkBAIC05NCw2ICsxMDcsNyBAQAogICAgIGRlZiB0ZXN0VHlwZWRlZihzZWxmLCB0aGluZyk6CiAgICAgICAgIHJldHVybiB0aGluZwogCisKIGNsYXNzIFRocmlmdFRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKIAogICAgIEBkZWZlci5pbmxpbmVDYWxsYmFja3MKQEAgLTEwMiwxNiArMTE2LDE1IEBACiAgICAgICAgIHNlbGYucHJvY2Vzc29yID0gVGhyaWZ0VGVzdC5Qcm9jZXNzb3Ioc2VsZi5oYW5kbGVyKQogICAgICAgICBzZWxmLnBmYWN0b3J5ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKQogCi0gICAgICAgIHNlbGYuc2VydmVyID0gcmVhY3Rvci5saXN0ZW5UQ1AoMCwKLSAgICAgICAgICAgIFRUd2lzdGVkLlRocmlmdFNlcnZlckZhY3Rvcnkoc2VsZi5wcm9jZXNzb3IsCi0gICAgICAgICAgICBzZWxmLnBmYWN0b3J5KSwgaW50ZXJmYWNlPSIxMjcuMC4wLjEiKQorICAgICAgICBzZWxmLnNlcnZlciA9IHJlYWN0b3IubGlzdGVuVENQKAorICAgICAgICAgICAgMCwgVFR3aXN0ZWQuVGhyaWZ0U2VydmVyRmFjdG9yeShzZWxmLnByb2Nlc3Nvciwgc2VsZi5wZmFjdG9yeSksIGludGVyZmFjZT0iMTI3LjAuMC4xIikKIAogICAgICAgICBzZWxmLnBvcnRObyA9IHNlbGYuc2VydmVyLmdldEhvc3QoKS5wb3J0CiAKICAgICAgICAgc2VsZi50eGNsaWVudCA9IHlpZWxkIENsaWVudENyZWF0b3IocmVhY3RvciwKLSAgICAgICAgICAgIFRUd2lzdGVkLlRocmlmdENsaWVudFByb3RvY29sLAotICAgICAgICAgICAgVGhyaWZ0VGVzdC5DbGllbnQsCi0gICAgICAgICAgICBzZWxmLnBmYWN0b3J5KS5jb25uZWN0VENQKCIxMjcuMC4wLjEiLCBzZWxmLnBvcnRObykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFR3aXN0ZWQuVGhyaWZ0Q2xpZW50UHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFRlc3QuQ2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBmYWN0b3J5KS5jb25uZWN0VENQKCIxMjcuMC4wLjEiLCBzZWxmLnBvcnRObykKICAgICAgICAgc2VsZi5jbGllbnQgPSBzZWxmLnR4Y2xpZW50LmNsaWVudAogCiAgICAgQGRlZmVyLmlubGluZUNhbGxiYWNrcwpAQCAtMTQ0LDYgKzE1Nyw4IEBACiAgICAgZGVmIHRlc3REb3VibGUoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCh5aWVsZCBzZWxmLmNsaWVudC50ZXN0RG91YmxlKC01LjIzNTA5ODIzNSkpLCAtNS4yMzUwOTgyMzUpCiAKKyAgICAjIFRPRE86IGRlZiB0ZXN0QmluYXJ5KHNlbGYpIC4uLgorCiAgICAgQGRlZmVyLmlubGluZUNhbGxiYWNrcwogICAgIGRlZiB0ZXN0U3RydWN0KHNlbGYpOgogICAgICAgICB4ID0gWHRydWN0KCkKQEAgLTE2MCwyMiArMTc1LDI0IEBACiAKICAgICBAZGVmZXIuaW5saW5lQ2FsbGJhY2tzCiAgICAgZGVmIHRlc3RFeGNlcHRpb24oc2VsZik6Ci0gICAgICAgIHlpZWxkIHNlbGYuY2xpZW50LnRlc3RFeGNlcHRpb24oJ1NhZmUnKQogICAgICAgICB0cnk6CiAgICAgICAgICAgICB5aWVsZCBzZWxmLmNsaWVudC50ZXN0RXhjZXB0aW9uKCdYY2VwdGlvbicpCiAgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIGdvdHRlbiBleGNlcHRpb24iKQotICAgICAgICBleGNlcHQgWGNlcHRpb24sIHg6CisgICAgICAgIGV4Y2VwdCBYY2VwdGlvbiBhcyB4OgogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoeC5lcnJvckNvZGUsIDEwMDEpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh4Lm1lc3NhZ2UsICdYY2VwdGlvbicpCiAKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgeWllbGQgc2VsZi5jbGllbnQudGVzdEV4Y2VwdGlvbigidGhyb3dfdW5kZWNsYXJlZCIpCi0gICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHRocm93biBleGNlcHRpb24iKQotICAgICAgICBleGNlcHQgRXhjZXB0aW9uOiAjIHR5cGUgaXMgdW5kZWZpbmVkCisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIGdvdHRlbiBleGNlcHRpb24iKQorICAgICAgICBleGNlcHQgVEFwcGxpY2F0aW9uRXhjZXB0aW9uOgogICAgICAgICAgICAgcGFzcwogCisgICAgICAgIHlpZWxkIHNlbGYuY2xpZW50LnRlc3RFeGNlcHRpb24oJ1NhZmUnKQorCiAgICAgQGRlZmVyLmlubGluZUNhbGxiYWNrcwogICAgIGRlZiB0ZXN0T25ld2F5KHNlbGYpOgogICAgICAgICB5aWVsZCBzZWxmLmNsaWVudC50ZXN0T25ld2F5KDEpCiAgICAgICAgIHN0YXJ0LCBlbmQsIHNlY29uZHMgPSB5aWVsZCBzZWxmLmhhbmRsZXIub25ld2F5c1F1ZXVlLmdldCgpCiAgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWxzKHNlY29uZHMsIChlbmQgLSBzdGFydCksIHBsYWNlcz0xKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygoeWllbGQgc2VsZi5jbGllbnQudGVzdEkzMigtMSkpLCAtMSkKZGlmZiAtLWdpdCBhL3Rlc3QvcHkvQ01ha2VMaXN0cy50eHQgYi90ZXN0L3B5L0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiYzIyMTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3B5L0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMzQgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCithZGRfdGVzdChOQU1FIHB5dGhvbl90ZXN0X2dlbmVyYXRlCisgICAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9CisgICAgICAgICAgICAtRFRIUklGVENPTVBJTEVSPSQ8VEFSR0VUX0ZJTEU6dGhyaWZ0LWNvbXBpbGVyPgorICAgICAgICAgICAgLURNWV9QUk9KRUNUX0RJUj0ke1BST0pFQ1RfU09VUkNFX0RJUn0KKyAgICAgICAgICAgIC1ETVlfQ1VSUkVOVF9TT1VSQ0VfRElSPSR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfQorICAgICAgICAgICAgLURNWV9DVVJSRU5UX0JJTkFSWV9ESVI9JHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9CisgICAgLVAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2dlbmVyYXRlLmNtYWtlCispCisKK2FkZF90ZXN0KE5BTUUgcHl0aG9uX3Rlc3QKKyAgICBDT01NQU5EICR7UFlUSE9OX0VYRUNVVEFCTEV9ICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9SdW5DbGllbnRTZXJ2ZXIucHkgLS1nZW4tYmFzZT0ke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0KKyAgICBERVBFTkRTIHB5dGhvbl90ZXN0X2dlbmVyYXRlCisgICAgV09SS0lOR19ESVJFQ1RPUlkgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9CispCisKZGlmZiAtLWdpdCBhL3Rlc3QvcHkvRmFzdGJpbmFyeVRlc3QucHkgYi90ZXN0L3B5L0Zhc3RiaW5hcnlUZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA1YzBiYjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3B5L0Zhc3RiaW5hcnlUZXN0LnB5CkBAIC0wLDAgKzEsMjU2IEBACisjIS91c3IvYmluL2VudiBweXRob24KKworIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3IiIiIKK1BZVEhPTlBBVEg9Li9nZW4tcHk6Li4vLi4vbGliL3B5L2J1aWxkL2xpYi4uLiAuL0Zhc3RiaW5hcnlUZXN0LnB5CisiIiIKKworIyBUT0RPKGRyZWlzcyk6IFRlc3QgZXJyb3IgY2FzZXMuICBDaGVjayBmb3IgbWVtb3J5IGxlYWtzLgorCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCisKK2ltcG9ydCBtYXRoCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2ltcG9ydCB0aW1laXQKKworZnJvbSBjb3B5IGltcG9ydCBkZWVwY29weQorZnJvbSBwcHJpbnQgaW1wb3J0IHBwcmludAorCitmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQKK2Zyb20gdGhyaWZ0LnByb3RvY29sLlRCaW5hcnlQcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sLCBUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZAorZnJvbSB0aHJpZnQucHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbCBpbXBvcnQgVENvbXBhY3RQcm90b2NvbCwgVENvbXBhY3RQcm90b2NvbEFjY2VsZXJhdGVkCisKK2Zyb20gRGVidWdQcm90b1Rlc3QgaW1wb3J0IFNydgorZnJvbSBEZWJ1Z1Byb3RvVGVzdC50dHlwZXMgaW1wb3J0IEJhY2t3YXJkcywgQm9uaywgRW1wdHksIEhvbHlNb2xleSwgT25lT2ZFYWNoLCBSYW5kb21TdHVmZiwgV3JhcHBlcgorCisKK2NsYXNzIFREZXZOdWxsVHJhbnNwb3J0KFRUcmFuc3BvcnQuVFRyYW5zcG9ydEJhc2UpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIGlzT3BlbihzZWxmKToKKyAgICAgICAgcmV0dXJuIFRydWUKKworCitvb2UxID0gT25lT2ZFYWNoKCkKK29vZTEuaW1fdHJ1ZSA9IFRydWUKK29vZTEuaW1fZmFsc2UgPSBGYWxzZQorb29lMS5hX2JpdGUgPSAweGQ2Citvb2UxLmludGVnZXIxNiA9IDI3MDAwCitvb2UxLmludGVnZXIzMiA9IDEgPDwgMjQKK29vZTEuaW50ZWdlcjY0ID0gNjAwMCAqIDEwMDAgKiAxMDAwCitvb2UxLmRvdWJsZV9wcmVjaXNpb24gPSBtYXRoLnBpCitvb2UxLnNvbWVfY2hhcmFjdGVycyA9ICJEZWJ1ZyBUSElTISIKK29vZTEuem9tZ191bmljb2RlID0gdSJceGQ3XG5cYVx0IgorCitvb2UyID0gT25lT2ZFYWNoKCkKK29vZTIuaW50ZWdlcjE2ID0gMTYKK29vZTIuaW50ZWdlcjMyID0gMzIKK29vZTIuaW50ZWdlcjY0ID0gNjQKK29vZTIuZG91YmxlX3ByZWNpc2lvbiA9IChtYXRoLnNxcnQoNSkgKyAxKSAvIDIKK29vZTIuc29tZV9jaGFyYWN0ZXJzID0gIjpSIChtZSBnb2luZyBcInJycnJcIikiCitvb2UyLnpvbWdfdW5pY29kZSA9IHUiXHhkM1x4ODBceGUyXHg4NVx4YWVceGNlXHg5ZFx4MjAiXAorICAgICAgICAgICAgICAgICAgICB1Ilx4ZDBceDlkXHhjZVx4YmZceGUyXHg4NVx4YmZceGQwXHhiZSJcCisgICAgICAgICAgICAgICAgICAgIHUiXHhjOVx4YTFceGQwXHhiM1x4ZDBceGIwXHhjZlx4ODFceGUyXHg4NFx4OGUiXAorICAgICAgICAgICAgICAgICAgICB1Ilx4MjBceGNlXHg5MVx4NzRceDc0XHhjZVx4YjFceGUyXHg4NVx4YmRceGNlXHhiYSJcCisgICAgICAgICAgICAgICAgICAgIHUiXHhjN1x4ODNceGUyXHg4MFx4YmMiCisKK2lmIHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMiBhbmQgb3MuZW52aXJvbi5nZXQoJ1RIUklGVF9URVNUX1BZX05PX1VURjhTVFJJTkdTJyk6CisgICAgb29lMS56b21nX3VuaWNvZGUgPSBvb2UxLnpvbWdfdW5pY29kZS5lbmNvZGUoJ3V0ZjgnKQorICAgIG9vZTIuem9tZ191bmljb2RlID0gb29lMi56b21nX3VuaWNvZGUuZW5jb2RlKCd1dGY4JykKKworaG0gPSBIb2x5TW9sZXkoKip7ImJpZyI6IFtdLCAiY29udGFpbiI6IHNldCgpLCAiYm9ua3MiOiB7fX0pCitobS5iaWcuYXBwZW5kKG9vZTEpCitobS5iaWcuYXBwZW5kKG9vZTIpCitobS5iaWdbMF0uYV9iaXRlID0gMHgyMgoraG0uYmlnWzFdLmFfYml0ZSA9IDB4MjIKKworaG0uY29udGFpbi5hZGQoKCJhbmQgYSBvbmUiLCAiYW5kIGEgdHdvIikpCitobS5jb250YWluLmFkZCgoInRoZW4gYSBvbmUsIHR3byIsICJ0aHJlZSEiLCAiRk9VUiEiKSkKK2lmIHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMiBhbmQgb3MuZW52aXJvbi5nZXQoJ1RIUklGVF9URVNUX1BZX05PX1VURjhTVFJJTkdTJyk6CisgICAgaG0uY29udGFpbi5hZGQoKHUiXHhkN1xuXGFcdCIuZW5jb2RlKCd1dGY4JyksKSkKK2Vsc2U6CisgICAgaG0uY29udGFpbi5hZGQoKHUiXHhkN1xuXGFcdCIsKSkKK2htLmNvbnRhaW4uYWRkKCgpKQorCitobS5ib25rc1sibm90aGluZyJdID0gW10KK2htLmJvbmtzWyJzb21ldGhpbmciXSA9IFsKKyAgICBCb25rKCoqeyJ0eXBlIjogMSwgIm1lc3NhZ2UiOiAiV2FpdC4ifSksCisgICAgQm9uaygqKnsidHlwZSI6IDIsICJtZXNzYWdlIjogIldoYXQ/In0pLAorXQoraG0uYm9ua3NbInBvZSJdID0gWworICAgIEJvbmsoKip7InR5cGUiOiAzLCAibWVzc2FnZSI6ICJxdW90aCJ9KSwKKyAgICBCb25rKCoqeyJ0eXBlIjogNCwgIm1lc3NhZ2UiOiAidGhlIHJhdmVuIn0pLAorICAgIEJvbmsoKip7InR5cGUiOiA1LCAibWVzc2FnZSI6ICJuZXZlcm1vcmUifSksCitdCisKK3JzID0gUmFuZG9tU3R1ZmYoKQorcnMuYSA9IDEKK3JzLmIgPSAyCitycy5jID0gMworcnMubXlpbnRsaXN0ID0gbGlzdChyYW5nZSgyMCkpCitycy5tYXBzID0gezE6IFdyYXBwZXIoKip7ImZvbyI6IEVtcHR5KCl9KSwgMjogV3JhcHBlcigqKnsiZm9vIjogRW1wdHkoKX0pfQorcnMuYmlnaW50ID0gMTI0NTIzNDUyNDM1Citycy50cmlwbGUgPSAzLjE0CisKKyMgbWFrZSBzdXJlIHRoaXMgc3BsaXRzIHR3byBidWZmZXJzIGluIGEgYnVmZmVyZWQgcHJvdG9jb2wKK3JzaHVnZSA9IFJhbmRvbVN0dWZmKCkKK3JzaHVnZS5teWludGxpc3QgPSBsaXN0KHJhbmdlKDEwMDAwKSkKKworbXlfemVybyA9IFNydi5KYW5reV9yZXN1bHQoKip7InN1Y2Nlc3MiOiA1fSkKKworCitjbGFzcyBUZXN0KG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZhc3QsIHNsb3cpOgorICAgICAgICBzZWxmLl9mYXN0ID0gZmFzdAorICAgICAgICBzZWxmLl9zbG93ID0gc2xvdworCisgICAgZGVmIF9jaGVja193cml0ZShzZWxmLCBvKToKKyAgICAgICAgdHJhbnNfZmFzdCA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcigpCisgICAgICAgIHRyYW5zX3Nsb3cgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoKQorICAgICAgICBwcm90X2Zhc3QgPSBzZWxmLl9mYXN0KHRyYW5zX2Zhc3QsIGZhbGxiYWNrPUZhbHNlKQorICAgICAgICBwcm90X3Nsb3cgPSBzZWxmLl9zbG93KHRyYW5zX3Nsb3cpCisKKyAgICAgICAgby53cml0ZShwcm90X2Zhc3QpCisgICAgICAgIG8ud3JpdGUocHJvdF9zbG93KQorICAgICAgICBPUklHID0gdHJhbnNfc2xvdy5nZXR2YWx1ZSgpCisgICAgICAgIE1JTkUgPSB0cmFuc19mYXN0LmdldHZhbHVlKCkKKyAgICAgICAgaWYgT1JJRyAhPSBNSU5FOgorICAgICAgICAgICAgcHJpbnQoImFjdHVhbCAgOiAlc1xuZXhwZWN0ZWQ6ICVzIiAlIChyZXByKE1JTkUpLCByZXByKE9SSUcpKSkKKyAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbignd3JpdGUgdmFsdWUgbWlzbWF0Y2gnKQorCisgICAgZGVmIF9jaGVja19yZWFkKHNlbGYsIG8pOgorICAgICAgICBwcm90ID0gc2VsZi5fc2xvdyhUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoKSkKKyAgICAgICAgby53cml0ZShwcm90KQorCisgICAgICAgIHNsb3dfdmVyc2lvbl9iaW5hcnkgPSBwcm90LnRyYW5zLmdldHZhbHVlKCkKKworICAgICAgICBwcm90ID0gc2VsZi5fZmFzdCgKKyAgICAgICAgICAgIFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcihzbG93X3ZlcnNpb25fYmluYXJ5KSwgZmFsbGJhY2s9RmFsc2UpCisgICAgICAgIGMgPSBvLl9fY2xhc3NfXygpCisgICAgICAgIGMucmVhZChwcm90KQorICAgICAgICBpZiBjICE9IG86CisgICAgICAgICAgICBwcmludCgiYWN0dWFsICA6ICIpCisgICAgICAgICAgICBwcHJpbnQocmVwcihjKSkKKyAgICAgICAgICAgIHByaW50KCJleHBlY3RlZDogIikKKyAgICAgICAgICAgIHBwcmludChyZXByKG8pKQorICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCdyZWFkIHZhbHVlIG1pc21hdGNoJykKKworICAgICAgICBwcm90ID0gc2VsZi5fZmFzdCgKKyAgICAgICAgICAgIFRUcmFuc3BvcnQuVEJ1ZmZlcmVkVHJhbnNwb3J0KAorICAgICAgICAgICAgICAgIFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcihzbG93X3ZlcnNpb25fYmluYXJ5KSksIGZhbGxiYWNrPUZhbHNlKQorICAgICAgICBjID0gby5fX2NsYXNzX18oKQorICAgICAgICBjLnJlYWQocHJvdCkKKyAgICAgICAgaWYgYyAhPSBvOgorICAgICAgICAgICAgcHJpbnQoImFjdHVhbCAgOiAiKQorICAgICAgICAgICAgcHByaW50KHJlcHIoYykpCisgICAgICAgICAgICBwcmludCgiZXhwZWN0ZWQ6ICIpCisgICAgICAgICAgICBwcHJpbnQocmVwcihvKSkKKyAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigncmVhZCB2YWx1ZSBtaXNtYXRjaCcpCisKKyAgICBkZWYgZG9fdGVzdChzZWxmKToKKyAgICAgICAgc2VsZi5fY2hlY2tfd3JpdGUoSG9seU1vbGV5KCkpCisgICAgICAgIHNlbGYuX2NoZWNrX3JlYWQoSG9seU1vbGV5KCkpCisKKyAgICAgICAgc2VsZi5fY2hlY2tfd3JpdGUoaG0pCisgICAgICAgIG5vX3NldCA9IGRlZXBjb3B5KGhtKQorICAgICAgICBub19zZXQuY29udGFpbiA9IHNldCgpCisgICAgICAgIHNlbGYuX2NoZWNrX3JlYWQobm9fc2V0KQorICAgICAgICBzZWxmLl9jaGVja19yZWFkKGhtKQorCisgICAgICAgIHNlbGYuX2NoZWNrX3dyaXRlKHJzKQorICAgICAgICBzZWxmLl9jaGVja19yZWFkKHJzKQorCisgICAgICAgIHNlbGYuX2NoZWNrX3dyaXRlKHJzaHVnZSkKKyAgICAgICAgc2VsZi5fY2hlY2tfcmVhZChyc2h1Z2UpCisKKyAgICAgICAgc2VsZi5fY2hlY2tfd3JpdGUobXlfemVybykKKyAgICAgICAgc2VsZi5fY2hlY2tfcmVhZChteV96ZXJvKQorCisgICAgICAgIHNlbGYuX2NoZWNrX3JlYWQoQmFja3dhcmRzKCoqeyJmaXJzdF90YWcyIjogNCwgInNlY29uZF90YWcxIjogMn0pKQorCisgICAgICAgICMgT25lIGNhc2Ugd2hlcmUgdGhlIHNlcmlhbGl6ZWQgZm9ybSBjaGFuZ2VzLCBidXQgb25seSBzdXBlcmZpY2lhbGx5LgorICAgICAgICBvID0gQmFja3dhcmRzKCoqeyJmaXJzdF90YWcyIjogNCwgInNlY29uZF90YWcxIjogMn0pCisgICAgICAgIHRyYW5zX2Zhc3QgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoKQorICAgICAgICB0cmFuc19zbG93ID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKCkKKyAgICAgICAgcHJvdF9mYXN0ID0gc2VsZi5fZmFzdCh0cmFuc19mYXN0LCBmYWxsYmFjaz1GYWxzZSkKKyAgICAgICAgcHJvdF9zbG93ID0gc2VsZi5fc2xvdyh0cmFuc19zbG93KQorCisgICAgICAgIG8ud3JpdGUocHJvdF9mYXN0KQorICAgICAgICBvLndyaXRlKHByb3Rfc2xvdykKKyAgICAgICAgT1JJRyA9IHRyYW5zX3Nsb3cuZ2V0dmFsdWUoKQorICAgICAgICBNSU5FID0gdHJhbnNfZmFzdC5nZXR2YWx1ZSgpCisgICAgICAgIGFzc2VydCBpZChPUklHKSAhPSBpZChNSU5FKQorCisgICAgICAgIHByb3QgPSBzZWxmLl9mYXN0KFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcigpLCBmYWxsYmFjaz1GYWxzZSkKKyAgICAgICAgby53cml0ZShwcm90KQorICAgICAgICBwcm90ID0gc2VsZi5fc2xvdygKKyAgICAgICAgICAgIFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcihwcm90LnRyYW5zLmdldHZhbHVlKCkpKQorICAgICAgICBjID0gby5fX2NsYXNzX18oKQorICAgICAgICBjLnJlYWQocHJvdCkKKyAgICAgICAgaWYgYyAhPSBvOgorICAgICAgICAgICAgcHJpbnQoImNvcHk6ICIpCisgICAgICAgICAgICBwcHJpbnQocmVwcihjKSkKKyAgICAgICAgICAgIHByaW50KCJvcmlnOiAiKQorICAgICAgICAgICAgcHByaW50KHJlcHIobykpCisKKworZGVmIGRvX3Rlc3QoZmFzdCwgc2xvdyk6CisgICAgVGVzdChmYXN0LCBzbG93KS5kb190ZXN0KCkKKworCitkZWYgZG9fYmVuY2htYXJrKHByb3RvY29sLCBpdGVycz01MDAwLCBza2lwX3Nsb3c9RmFsc2UpOgorICAgIHNldHVwID0gIiIiCitmcm9tIF9fbWFpbl9fIGltcG9ydCBobSwgcnMsIFREZXZOdWxsVHJhbnNwb3J0Citmcm9tIHRocmlmdC5wcm90b2NvbC57MH0gaW1wb3J0IHswfXsxfQordHJhbnMgPSBURGV2TnVsbFRyYW5zcG9ydCgpCitwcm90ID0gezB9ezF9KHRyYW5zezJ9KQorIiIiCisKKyAgICBzZXR1cF9mYXN0ID0gc2V0dXAuZm9ybWF0KHByb3RvY29sLCAnQWNjZWxlcmF0ZWQnLCAnLCBmYWxsYmFjaz1GYWxzZScpCisgICAgaWYgbm90IHNraXBfc2xvdzoKKyAgICAgICAgc2V0dXBfc2xvdyA9IHNldHVwLmZvcm1hdChwcm90b2NvbCwgJycsICcnKQorCisgICAgcHJpbnQoIlN0YXJ0aW5nIEJlbmNobWFya3MiKQorCisgICAgaWYgbm90IHNraXBfc2xvdzoKKyAgICAgICAgcHJpbnQoIkhvbHlNb2xleSBTdGFuZGFyZCA9ICVmIiAlCisgICAgICAgICAgICAgIHRpbWVpdC5UaW1lcignaG0ud3JpdGUocHJvdCknLCBzZXR1cF9zbG93KS50aW1laXQobnVtYmVyPWl0ZXJzKSkKKworICAgIHByaW50KCJIb2x5TW9sZXkgQWNjZWxlci4gPSAlZiIgJQorICAgICAgICAgIHRpbWVpdC5UaW1lcignaG0ud3JpdGUocHJvdCknLCBzZXR1cF9mYXN0KS50aW1laXQobnVtYmVyPWl0ZXJzKSkKKworICAgIGlmIG5vdCBza2lwX3Nsb3c6CisgICAgICAgIHByaW50KCJGYXN0U3RydWN0IFN0YW5kYXJkID0gJWYiICUKKyAgICAgICAgICAgICAgdGltZWl0LlRpbWVyKCdycy53cml0ZShwcm90KScsIHNldHVwX3Nsb3cpLnRpbWVpdChudW1iZXI9aXRlcnMpKQorCisgICAgcHJpbnQoIkZhc3RTdHJ1Y3QgQWNjZWxlci4gPSAlZiIgJQorICAgICAgICAgIHRpbWVpdC5UaW1lcigncnMud3JpdGUocHJvdCknLCBzZXR1cF9mYXN0KS50aW1laXQobnVtYmVyPWl0ZXJzKSkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHByaW50KCdUZXN0aW5nIFRCaW5hcnlBY2NlbGVyYXRlZCcpCisgICAgZG9fdGVzdChUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCwgVEJpbmFyeVByb3RvY29sKQorICAgIGRvX2JlbmNobWFyaygnVEJpbmFyeVByb3RvY29sJykKKyAgICBwcmludCgnVGVzdGluZyBUQ29tcGFjdEFjY2VsZXJhdGVkJykKKyAgICBkb190ZXN0KFRDb21wYWN0UHJvdG9jb2xBY2NlbGVyYXRlZCwgVENvbXBhY3RQcm90b2NvbCkKKyAgICBkb19iZW5jaG1hcmsoJ1RDb21wYWN0UHJvdG9jb2wnKQpkaWZmIC0tZ2l0IGEvdGVzdC9weS9NYWtlZmlsZS5hbSBiL3Rlc3QvcHkvTWFrZWZpbGUuYW0Kb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCAyZmU5YjVhLi44Mjk2MjAwCi0tLSBhL3Rlc3QvcHkvTWFrZWZpbGUuYW0KKysrIGIvdGVzdC9weS9NYWtlZmlsZS5hbQpAQCAtMTgsMjUgKzE4LDQxIEBACiAjCiBBVVRPTUFLRV9PUFRJT05TID0gc2VyaWFsLXRlc3RzCiAKLVRIUklGVCA9ICQodG9wX3NyY2RpcikvY29tcGlsZXIvY3BwL3RocmlmdAotCiBweV91bml0X3Rlc3RzID0gUnVuQ2xpZW50U2VydmVyLnB5CiAKIHRocmlmdF9nZW4gPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgZ2VuLXB5L1RocmlmdFRlc3QvX19pbml0X18ucHkgICAgICAgICAgIFwKICAgICAgICAgZ2VuLXB5L0RlYnVnUHJvdG9UZXN0L19faW5pdF9fLnB5IFwKKyAgICAgICAgZ2VuLXB5L0RvdWJsZUNvbnN0YW50c1Rlc3QvX19pbml0X18ucHkgXAorICAgICAgICBnZW4tcHkvUmVjdXJzaXZlL19faW5pdF9fLnB5IFwKICAgICAgICAgZ2VuLXB5LWRlZmF1bHQvVGhyaWZ0VGVzdC9fX2luaXRfXy5weSAgICAgICAgICAgXAogICAgICAgICBnZW4tcHktZGVmYXVsdC9EZWJ1Z1Byb3RvVGVzdC9fX2luaXRfXy5weSBcCisgICAgICAgIGdlbi1weS1kZWZhdWx0L0RvdWJsZUNvbnN0YW50c1Rlc3QvX19pbml0X18ucHkgXAorICAgICAgICBnZW4tcHktZGVmYXVsdC9SZWN1cnNpdmUvX19pbml0X18ucHkgXAogICAgICAgICBnZW4tcHktc2xvdHMvVGhyaWZ0VGVzdC9fX2luaXRfXy5weSAgICAgICAgICAgXAogICAgICAgICBnZW4tcHktc2xvdHMvRGVidWdQcm90b1Rlc3QvX19pbml0X18ucHkgXAotICAgICAgICBnZW4tcHktbmV3c3R5bGUvVGhyaWZ0VGVzdC9fX2luaXRfXy5weSAgICAgICAgICAgXAotICAgICAgICBnZW4tcHktbmV3c3R5bGUvRGVidWdQcm90b1Rlc3QvX19pbml0X18ucHkgXAotICAgICAgICBnZW4tcHktbmV3c3R5bGVzbG90cy9UaHJpZnRUZXN0L19faW5pdF9fLnB5ICAgICAgICAgICBcCi0gICAgICAgIGdlbi1weS1uZXdzdHlsZXNsb3RzL0RlYnVnUHJvdG9UZXN0L19faW5pdF9fLnB5IFwKKyAgICAgICAgZ2VuLXB5LXNsb3RzL0RvdWJsZUNvbnN0YW50c1Rlc3QvX19pbml0X18ucHkgXAorICAgICAgICBnZW4tcHktc2xvdHMvUmVjdXJzaXZlL19faW5pdF9fLnB5IFwKKyAgICAgICAgZ2VuLXB5LW9sZHN0eWxlL1RocmlmdFRlc3QvX19pbml0X18ucHkgXAorICAgICAgICBnZW4tcHktb2xkc3R5bGUvRGVidWdQcm90b1Rlc3QvX19pbml0X18ucHkgXAorICAgICAgICBnZW4tcHktb2xkc3R5bGUvRG91YmxlQ29uc3RhbnRzVGVzdC9fX2luaXRfXy5weSBcCisgICAgICAgIGdlbi1weS1vbGRzdHlsZS9SZWN1cnNpdmUvX19pbml0X18ucHkgXAorICAgICAgICBnZW4tcHktbm9fdXRmOHN0cmluZ3MvVGhyaWZ0VGVzdC9fX2luaXRfXy5weSBcCisgICAgICAgIGdlbi1weS1ub191dGY4c3RyaW5ncy9EZWJ1Z1Byb3RvVGVzdC9fX2luaXRfXy5weSBcCisgICAgICAgIGdlbi1weS1ub191dGY4c3RyaW5ncy9Eb3VibGVDb25zdGFudHNUZXN0L19faW5pdF9fLnB5IFwKKyAgICAgICAgZ2VuLXB5LW5vX3V0ZjhzdHJpbmdzL1JlY3Vyc2l2ZS9fX2luaXRfXy5weSBcCiAgICAgICAgIGdlbi1weS1keW5hbWljL1RocmlmdFRlc3QvX19pbml0X18ucHkgICAgICAgICAgIFwKICAgICAgICAgZ2VuLXB5LWR5bmFtaWMvRGVidWdQcm90b1Rlc3QvX19pbml0X18ucHkgXAorICAgICAgICBnZW4tcHktZHluYW1pYy9Eb3VibGVDb25zdGFudHNUZXN0L19faW5pdF9fLnB5IFwKKyAgICAgICAgZ2VuLXB5LWR5bmFtaWMvUmVjdXJzaXZlL19faW5pdF9fLnB5IFwKICAgICAgICAgZ2VuLXB5LWR5bmFtaWNzbG90cy9UaHJpZnRUZXN0L19faW5pdF9fLnB5ICAgICAgICAgICBcCi0gICAgICAgIGdlbi1weS1keW5hbWljc2xvdHMvRGVidWdQcm90b1Rlc3QvX19pbml0X18ucHkKKyAgICAgICAgZ2VuLXB5LWR5bmFtaWNzbG90cy9EZWJ1Z1Byb3RvVGVzdC9fX2luaXRfXy5weSBcCisgICAgICAgIGdlbi1weS1keW5hbWljc2xvdHMvRG91YmxlQ29uc3RhbnRzVGVzdC9fX2luaXRfXy5weSBcCisgICAgICAgIGdlbi1weS1keW5hbWljc2xvdHMvUmVjdXJzaXZlL19faW5pdF9fLnB5CisKKworcHJlY3Jvc3M6ICQodGhyaWZ0X2dlbikKK0JVSUxUX1NPVVJDRVMgPSAkKHRocmlmdF9nZW4pCiAKIGhlbHBlcl9zY3JpcHRzPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgVGVzdENsaWVudC5weSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTUwLDMwICs2NiwzMiBAQAogVEVTVFM9ICQocHlfdW5pdF90ZXN0cykKIAogCi1nZW4tcHkvJS9fX2luaXRfXy5weTogLi4vJS50aHJpZnQKK2dlbi1weS8lL19faW5pdF9fLnB5OiAuLi8lLnRocmlmdCAkKFRIUklGVCkKIAkkKFRIUklGVCkgLS1nZW4gcHkgICQ8Ci0JdGVzdCAtZCBnZW4tcHktZGVmYXVsdCB8fCBta2RpciBnZW4tcHktZGVmYXVsdAorCitnZW4tcHktZGVmYXVsdC8lL19faW5pdF9fLnB5OiAuLi8lLnRocmlmdCAkKFRIUklGVCkKKwl0ZXN0IC1kIGdlbi1weS1kZWZhdWx0IHx8ICQoTUtESVJfUCkgZ2VuLXB5LWRlZmF1bHQKIAkkKFRIUklGVCkgLS1nZW4gcHkgLW91dCBnZW4tcHktZGVmYXVsdCAkPAogCi1nZW4tcHktc2xvdHMvJS9fX2luaXRfXy5weTogLi4vJS50aHJpZnQKLQl0ZXN0IC1kIGdlbi1weS1zbG90cyB8fCBta2RpciBnZW4tcHktc2xvdHMKK2dlbi1weS1zbG90cy8lL19faW5pdF9fLnB5OiAuLi8lLnRocmlmdCAkKFRIUklGVCkKKwl0ZXN0IC1kIGdlbi1weS1zbG90cyB8fCAkKE1LRElSX1ApIGdlbi1weS1zbG90cwogCSQoVEhSSUZUKSAtLWdlbiBweTpzbG90cyAtb3V0IGdlbi1weS1zbG90cyAkPAogCi1nZW4tcHktbmV3c3R5bGUvJS9fX2luaXRfXy5weTogLi4vJS50aHJpZnQKLQl0ZXN0IC1kIGdlbi1weS1uZXdzdHlsZSB8fCBta2RpciBnZW4tcHktbmV3c3R5bGUKLQkkKFRIUklGVCkgLS1nZW4gcHk6bmV3X3N0eWxlIC1vdXQgZ2VuLXB5LW5ld3N0eWxlICQ8CitnZW4tcHktb2xkc3R5bGUvJS9fX2luaXRfXy5weTogLi4vJS50aHJpZnQgJChUSFJJRlQpCisJdGVzdCAtZCBnZW4tcHktb2xkc3R5bGUgfHwgJChNS0RJUl9QKSBnZW4tcHktb2xkc3R5bGUKKwkkKFRIUklGVCkgLS1nZW4gcHk6b2xkX3N0eWxlIC1vdXQgZ2VuLXB5LW9sZHN0eWxlICQ8CiAKLWdlbi1weS1uZXdzdHlsZXNsb3RzLyUvX19pbml0X18ucHk6IC4uLyUudGhyaWZ0Ci0JdGVzdCAtZCBnZW4tcHktbmV3c3R5bGVzbG90cyB8fCBta2RpciBnZW4tcHktbmV3c3R5bGVzbG90cwotCSQoVEhSSUZUKSAtLWdlbiBweTpuZXdfc3R5bGUsc2xvdHMgLW91dCBnZW4tcHktbmV3c3R5bGVzbG90cyAkPAorZ2VuLXB5LW5vX3V0ZjhzdHJpbmdzLyUvX19pbml0X18ucHk6IC4uLyUudGhyaWZ0ICQoVEhSSUZUKQorCXRlc3QgLWQgZ2VuLXB5LW5vX3V0ZjhzdHJpbmdzIHx8ICQoTUtESVJfUCkgZ2VuLXB5LW5vX3V0ZjhzdHJpbmdzCisJJChUSFJJRlQpIC0tZ2VuIHB5Om5vX3V0ZjhzdHJpbmdzIC1vdXQgZ2VuLXB5LW5vX3V0ZjhzdHJpbmdzICQ8CiAKLWdlbi1weS1keW5hbWljLyUvX19pbml0X18ucHk6IC4uLyUudGhyaWZ0Ci0JdGVzdCAtZCBnZW4tcHktZHluYW1pYyB8fCBta2RpciBnZW4tcHktZHluYW1pYworZ2VuLXB5LWR5bmFtaWMvJS9fX2luaXRfXy5weTogLi4vJS50aHJpZnQgJChUSFJJRlQpCisJdGVzdCAtZCBnZW4tcHktZHluYW1pYyB8fCAkKE1LRElSX1ApIGdlbi1weS1keW5hbWljCiAJJChUSFJJRlQpIC0tZ2VuIHB5OmR5bmFtaWMgLW91dCBnZW4tcHktZHluYW1pYyAkPAogCi1nZW4tcHktZHluYW1pY3Nsb3RzLyUvX19pbml0X18ucHk6IC4uLyUudGhyaWZ0Ci0JdGVzdCAtZCBnZW4tcHktZHluYW1pY3Nsb3RzIHx8IG1rZGlyIGdlbi1weS1keW5hbWljc2xvdHMKK2dlbi1weS1keW5hbWljc2xvdHMvJS9fX2luaXRfXy5weTogLi4vJS50aHJpZnQgJChUSFJJRlQpCisJdGVzdCAtZCBnZW4tcHktZHluYW1pY3Nsb3RzIHx8ICQoTUtESVJfUCkgZ2VuLXB5LWR5bmFtaWNzbG90cwogCSQoVEhSSUZUKSAtLWdlbiBweTpkeW5hbWljLHNsb3RzIC1vdXQgZ2VuLXB5LWR5bmFtaWNzbG90cyAkPAogCiBjbGVhbi1sb2NhbDoKLQkkKFJNKSAtciBnZW4tcHkgZ2VuLXB5LXNsb3RzIGdlbi1weS1kZWZhdWx0IGdlbi1weS1uZXdzdHlsZSBnZW4tcHktbmV3c3R5bGVzbG90cyBnZW4tcHktZHluYW1pYyBnZW4tcHktZHluYW1pY3Nsb3RzCisJJChSTSkgLXIgZ2VuLXB5IGdlbi1weS1zbG90cyBnZW4tcHktZGVmYXVsdCBnZW4tcHktb2xkc3R5bGUgZ2VuLXB5LW5vX3V0ZjhzdHJpbmdzIGdlbi1weS1keW5hbWljIGdlbi1weS1keW5hbWljc2xvdHMKZGlmZiAtLWdpdCBhL3Rlc3QvcHkvUnVuQ2xpZW50U2VydmVyLnB5IGIvdGVzdC9weS9SdW5DbGllbnRTZXJ2ZXIucHkKaW5kZXggNDZjOWY4YS4uNTZhNDA4ZSAxMDA3NTUKLS0tIGEvdGVzdC9weS9SdW5DbGllbnRTZXJ2ZXIucHkKKysrIGIvdGVzdC9weS9SdW5DbGllbnRTZXJ2ZXIucHkKQEAgLTIwLDE5NiArMjAsMzA0IEBACiAjCiAKIGZyb20gX19mdXR1cmVfXyBpbXBvcnQgZGl2aXNpb24KLWltcG9ydCB0aW1lCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCitpbXBvcnQgcGxhdGZvcm0KK2ltcG9ydCBjb3B5CitpbXBvcnQgb3MKK2ltcG9ydCBzaWduYWwKIGltcG9ydCBzb2NrZXQKIGltcG9ydCBzdWJwcm9jZXNzCiBpbXBvcnQgc3lzCi1pbXBvcnQgb3MKLWltcG9ydCBzaWduYWwKK2ltcG9ydCB0aW1lCiBmcm9tIG9wdHBhcnNlIGltcG9ydCBPcHRpb25QYXJzZXIKIAotcGFyc2VyID0gT3B0aW9uUGFyc2VyKCkKLXBhcnNlci5hZGRfb3B0aW9uKCctLWdlbnB5ZGlycycsIHR5cGU9J3N0cmluZycsIGRlc3Q9J2dlbnB5ZGlycycsCi0gICAgZGVmYXVsdD0nZGVmYXVsdCxzbG90cyxuZXdzdHlsZSxuZXdzdHlsZXNsb3RzLGR5bmFtaWMsZHluYW1pY3Nsb3RzJywKLSAgICBoZWxwPSdkaXJlY3RvcnkgZXh0ZW5zaW9ucyBmb3IgZ2VuZXJhdGVkIGNvZGUsIHVzZWQgYXMgc3VmZml4ZXMgZm9yIFwiZ2VuLXB5LSpcIiBhZGRlZCBzeXMucGF0aCBmb3IgaW5kaXZpZHVhbCB0ZXN0cycpCi1wYXJzZXIuYWRkX29wdGlvbigiLS1wb3J0IiwgdHlwZT0iaW50IiwgZGVzdD0icG9ydCIsIGRlZmF1bHQ9OTA5MCwKLSAgICBoZWxwPSJwb3J0IG51bWJlciBmb3Igc2VydmVyIHRvIGxpc3RlbiBvbiIpCi1wYXJzZXIuYWRkX29wdGlvbignLXYnLCAnLS12ZXJib3NlJywgYWN0aW9uPSJzdG9yZV9jb25zdCIsCi0gICAgZGVzdD0idmVyYm9zZSIsIGNvbnN0PTIsCi0gICAgaGVscD0idmVyYm9zZSBvdXRwdXQiKQotcGFyc2VyLmFkZF9vcHRpb24oJy1xJywgJy0tcXVpZXQnLCBhY3Rpb249InN0b3JlX2NvbnN0IiwKLSAgICBkZXN0PSJ2ZXJib3NlIiwgY29uc3Q9MCwKLSAgICBoZWxwPSJtaW5pbWFsIG91dHB1dCIpCi1wYXJzZXIuc2V0X2RlZmF1bHRzKHZlcmJvc2U9MSkKLW9wdGlvbnMsIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncygpCitmcm9tIHV0aWwgaW1wb3J0IGxvY2FsX2xpYnBhdGgKIAotZ2VuZXJhdGVkX2RpcnMgPSBbXQotZm9yIGdwX2RpciBpbiBvcHRpb25zLmdlbnB5ZGlycy5zcGxpdCgnLCcpOgotICBnZW5lcmF0ZWRfZGlycy5hcHBlbmQoJ2dlbi1weS0lcycgJSAoZ3BfZGlyKSkKK1NDUklQVF9ESVIgPSBvcy5wYXRoLmFic3BhdGgob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSkKIAotU0NSSVBUUyA9IFsnVFNpbXBsZUpTT05Qcm90b2NvbFRlc3QucHknLAotICAgICAgICAgICAnU2VyaWFsaXphdGlvblRlc3QucHknLAotICAgICAgICAgICAnVGVzdEVvZi5weScsCi0gICAgICAgICAgICdUZXN0U3ludGF4LnB5JywKLSAgICAgICAgICAgJ1Rlc3RTb2NrZXQucHknXQorU0NSSVBUUyA9IFsKKyAgICAnRmFzdGJpbmFyeVRlc3QucHknLAorICAgICdUZXN0RnJvemVuLnB5JywKKyAgICAnVGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLnB5JywKKyAgICAnVFNpbXBsZUpTT05Qcm90b2NvbFRlc3QucHknLAorICAgICdTZXJpYWxpemF0aW9uVGVzdC5weScsCisgICAgJ1Rlc3RFb2YucHknLAorICAgICdUZXN0U3ludGF4LnB5JywKKyAgICAnVGVzdFNvY2tldC5weScsCitdCiBGUkFNRUQgPSBbIlROb25ibG9ja2luZ1NlcnZlciJdCiBTS0lQX1pMSUIgPSBbJ1ROb25ibG9ja2luZ1NlcnZlcicsICdUSHR0cFNlcnZlciddCi1TS0lQX1NTTCA9IFsnVE5vbmJsb2NraW5nU2VydmVyJywgJ1RIdHRwU2VydmVyJ10KLUVYVFJBX0RFTEFZID0gZGljdChUUHJvY2Vzc1Bvb2xTZXJ2ZXI9My41KQorU0tJUF9TU0wgPSBbJ1RIdHRwU2VydmVyJ10KK0VYVFJBX0RFTEFZID0gZGljdChUUHJvY2Vzc1Bvb2xTZXJ2ZXI9NS41KQogCi1QUk9UT1M9IFsKK1BST1RPUyA9IFsKICAgICAnYWNjZWwnLAorICAgICdhY2NlbGMnLAogICAgICdiaW5hcnknLAotICAgICdjb21wYWN0J10KLSMgRklYTUU6IGFkZCBqc29uCi0jIGRpc2FibGVkIGJlY2F1c2UganNvbiBIVFRQIHRlc3QgaGFuZ3MuLi4gd2h5PworICAgICdjb21wYWN0JywKKyAgICAnanNvbicsCisgICAgJ2hlYWRlcicsCitdCiAKLVNFUlZFUlMgPSBbCi0gICJUU2ltcGxlU2VydmVyIiwKLSAgIlRUaHJlYWRlZFNlcnZlciIsCi0gICJUVGhyZWFkUG9vbFNlcnZlciIsCi0gICJUUHJvY2Vzc1Bvb2xTZXJ2ZXIiLCAjIG5ldyEKLSAgIlRGb3JraW5nU2VydmVyIiwKLSAgIlROb25ibG9ja2luZ1NlcnZlciIsCi0gICJUSHR0cFNlcnZlciIgXQogCi0jIFRlc3QgZm9yIHByZXNlbmNlIG9mIG11bHRpcHJvY2Vzc2luZyBtb2R1bGUsIGFuZCBpZiBpdCBpcyBub3QgcHJlc2VudCwgdGhlbgotIyByZW1vdmUgaXQgZnJvbSB0aGUgbGlzdCBvZiBhdmFpbGFibGUgc2VydmVycy4KLXRyeToKLSAgaW1wb3J0IG11bHRpcHJvY2Vzc2luZwotZXhjZXB0OgotICBwcmludCAnV2FybmluZzogdGhlIG11bHRpcHJvY2Vzc2luZyBtb2R1bGUgaXMgdW5hdmFpbGFibGUuIFNraXBwaW5nIHRlc3RzIGZvciBUUHJvY2Vzc1Bvb2xTZXJ2ZXInCi0gIFNFUlZFUlMucmVtb3ZlKCdUUHJvY2Vzc1Bvb2xTZXJ2ZXInKQotCi10cnk6Ci0gIGltcG9ydCBzc2wKLWV4Y2VwdDoKLSAgcHJpbnQgJ1dhcm5pbmcsIG5vIHNzbCBtb2R1bGUgYXZhaWxhYmxlLiBTa2lwcGluZyBhbGwgU1NMIHRlc3RzLicKLSAgU0tJUF9TU0wuZXh0ZW5kKFNFUlZFUlMpCi0KLSMgY29tbWFuZGxpbmUgcGVybWl0cyBhIHNpbmdsZSBjbGFzcyBuYW1lIHRvIGJlIHNwZWNpZmllZCB0byBvdmVycmlkZSBTRVJWRVJTPVsuLi5dCi1pZiBsZW4oYXJncykgPT0gMToKLSAgaWYgYXJnc1swXSBpbiBTRVJWRVJTOgotICAgIFNFUlZFUlMgPSBhcmdzCi0gIGVsc2U6Ci0gICAgcHJpbnQgJ1VuYXZhaWxhYmxlIHNlcnZlciB0eXBlICIlcyIsIHBsZWFzZSBjaG9vc2Ugb25lIG9mOiAlcycgJSAoYXJnc1swXSwgU0VSVkVSUykKLSAgICBzeXMuZXhpdCgwKQorZGVmIGRlZmF1bHRfc2VydmVycygpOgorICAgIHNlcnZlcnMgPSBbCisgICAgICAgICdUU2ltcGxlU2VydmVyJywKKyAgICAgICAgJ1RUaHJlYWRlZFNlcnZlcicsCisgICAgICAgICdUVGhyZWFkUG9vbFNlcnZlcicsCisgICAgICAgICdUTm9uYmxvY2tpbmdTZXJ2ZXInLAorICAgICAgICAnVEh0dHBTZXJ2ZXInLAorICAgIF0KKyAgICBpZiBwbGF0Zm9ybS5zeXN0ZW0oKSAhPSAnV2luZG93cyc6CisgICAgICAgIHNlcnZlcnMuYXBwZW5kKCdUUHJvY2Vzc1Bvb2xTZXJ2ZXInKQorICAgICAgICBzZXJ2ZXJzLmFwcGVuZCgnVEZvcmtpbmdTZXJ2ZXInKQorICAgIHJldHVybiBzZXJ2ZXJzCiAKIAogZGVmIHJlbGZpbGUoZm5hbWUpOgotICAgIHJldHVybiBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSwgZm5hbWUpCisgICAgcmV0dXJuIG9zLnBhdGguam9pbihTQ1JJUFRfRElSLCBmbmFtZSkKIAotZGVmIHJ1blNjcmlwdFRlc3QoZ2VucHlkaXIsIHNjcmlwdCk6Ci0gIHNjcmlwdF9hcmdzID0gW3N5cy5leGVjdXRhYmxlLCByZWxmaWxlKHNjcmlwdCkgXQotICBzY3JpcHRfYXJncy5hcHBlbmQoJy0tZ2VucHlkaXI9JXMnICUgZ2VucHlkaXIpCi0gIHNlcnZlcnByb2MgPSBzdWJwcm9jZXNzLlBvcGVuKHNjcmlwdF9hcmdzKQotICBwcmludCAnXG5UZXN0aW5nIHNjcmlwdDogJXNcbi0tLS0nICUgKCcgJy5qb2luKHNjcmlwdF9hcmdzKSkKLSAgcmV0ID0gc3VicHJvY2Vzcy5jYWxsKHNjcmlwdF9hcmdzKQotICBpZiByZXQgIT0gMDoKLSAgICByYWlzZSBFeGNlcHRpb24oIlNjcmlwdCBzdWJwcm9jZXNzIGZhaWxlZCwgcmV0Y29kZT0lZCwgYXJnczogJXMiICUgKHJldCwgJyAnLmpvaW4oc2NyaXB0X2FyZ3MpKSkKIAotZGVmIHJ1blNlcnZpY2VUZXN0KGdlbnB5ZGlyLCBzZXJ2ZXJfY2xhc3MsIHByb3RvLCBwb3J0LCB1c2VfemxpYiwgdXNlX3NzbCk6Ci0gICMgQnVpbGQgY29tbWFuZCBsaW5lIGFyZ3VtZW50cwotICBzZXJ2ZXJfYXJncyA9IFtzeXMuZXhlY3V0YWJsZSwgcmVsZmlsZSgnVGVzdFNlcnZlci5weScpIF0KLSAgY2xpX2FyZ3MgPSBbc3lzLmV4ZWN1dGFibGUsIHJlbGZpbGUoJ1Rlc3RDbGllbnQucHknKSBdCi0gIGZvciB3aGljaCBpbiAoc2VydmVyX2FyZ3MsIGNsaV9hcmdzKToKLSAgICB3aGljaC5hcHBlbmQoJy0tZ2VucHlkaXI9JXMnICUgZ2VucHlkaXIpCi0gICAgd2hpY2guYXBwZW5kKCctLXByb3RvY29sPSVzJyAlIHByb3RvKSAjIGFjY2VsLCBiaW5hcnkgb3IgY29tcGFjdAotICAgIHdoaWNoLmFwcGVuZCgnLS1wb3J0PSVkJyAlIHBvcnQpICMgZGVmYXVsdCB0byA5MDkwCi0gICAgaWYgdXNlX3psaWI6Ci0gICAgICB3aGljaC5hcHBlbmQoJy0temxpYicpCi0gICAgaWYgdXNlX3NzbDoKLSAgICAgIHdoaWNoLmFwcGVuZCgnLS1zc2wnKQotICAgIGlmIG9wdGlvbnMudmVyYm9zZSA9PSAwOgotICAgICAgd2hpY2guYXBwZW5kKCctcScpCi0gICAgaWYgb3B0aW9ucy52ZXJib3NlID09IDI6Ci0gICAgICB3aGljaC5hcHBlbmQoJy12JykKLSAgIyBzZXJ2ZXItc3BlY2lmaWMgb3B0aW9uIHRvIHNlbGVjdCBzZXJ2ZXIgY2xhc3MKLSAgc2VydmVyX2FyZ3MuYXBwZW5kKHNlcnZlcl9jbGFzcykKLSAgIyBjbGllbnQtc3BlY2lmaWMgY21kbGluZSBvcHRpb25zCi0gIGlmIHNlcnZlcl9jbGFzcyBpbiBGUkFNRUQ6Ci0gICAgY2xpX2FyZ3MuYXBwZW5kKCctLXRyYW5zcG9ydD1mcmFtZWQnKQotICBlbHNlOgotICAgICBjbGlfYXJncy5hcHBlbmQoJy0tdHJhbnNwb3J0PWJ1ZmZlcmVkJykKLSAgaWYgc2VydmVyX2NsYXNzID09ICdUSHR0cFNlcnZlcic6Ci0gICAgY2xpX2FyZ3MuYXBwZW5kKCctLWh0dHA9LycpCi0gIGlmIG9wdGlvbnMudmVyYm9zZSA+IDA6Ci0gICAgcHJpbnQgJ1Rlc3Rpbmcgc2VydmVyICVzOiAlcycgJSAoc2VydmVyX2NsYXNzLCAnICcuam9pbihzZXJ2ZXJfYXJncykpCi0gIHNlcnZlcnByb2MgPSBzdWJwcm9jZXNzLlBvcGVuKHNlcnZlcl9hcmdzKQorZGVmIHNldHVwX3B5cGF0aChsaWJkaXIsIGdlbmRpcik6CisgICAgZGlycyA9IFtsaWJkaXIsIGdlbmRpcl0KKyAgICBlbnYgPSBjb3B5LmRlZXBjb3B5KG9zLmVudmlyb24pCisgICAgcHlwYXRoID0gZW52LmdldCgnUFlUSE9OUEFUSCcsIE5vbmUpCisgICAgaWYgcHlwYXRoOgorICAgICAgICBkaXJzLmFwcGVuZChweXBhdGgpCisgICAgZW52WydQWVRIT05QQVRIJ10gPSBvcy5wYXRoc2VwLmpvaW4oZGlycykKKyAgICBpZiBnZW5kaXIuZW5kc3dpdGgoJ2dlbi1weS1ub191dGY4c3RyaW5ncycpOgorICAgICAgICBlbnZbJ1RIUklGVF9URVNUX1BZX05PX1VURjhTVFJJTkdTJ10gPSAnMScKKyAgICByZXR1cm4gZW52CiAKLSAgZGVmIGVuc3VyZVNlcnZlckFsaXZlKCk6Ci0gICAgaWYgc2VydmVycHJvYy5wb2xsKCkgaXMgbm90IE5vbmU6Ci0gICAgICBwcmludCAoJ0ZBSUw6IFNlcnZlciBwcm9jZXNzICglcykgZmFpbGVkIHdpdGggcmV0Y29kZSAlZCcKLSAgICAgICAgICAgICAlICgnICcuam9pbihzZXJ2ZXJfYXJncyksIHNlcnZlcnByb2MucmV0dXJuY29kZSkpCi0gICAgICByYWlzZSBFeGNlcHRpb24oJ1NlcnZlciBzdWJwcm9jZXNzICVzIGRpZWQsIGFyZ3M6ICVzJwotICAgICAgICAgICAgICAgICAgICAgICUgKHNlcnZlcl9jbGFzcywgJyAnLmpvaW4oc2VydmVyX2FyZ3MpKSkKIAotICAjIFdhaXQgZm9yIHRoZSBzZXJ2ZXIgdG8gc3RhcnQgYWNjZXB0aW5nIGNvbm5lY3Rpb25zIG9uIHRoZSBnaXZlbiBwb3J0LgotICBzb2NrID0gc29ja2V0LnNvY2tldCgpCi0gIHNsZWVwX3RpbWUgPSAwLjEgICMgU2Vjb25kcwotICBtYXhfYXR0ZW1wdHMgPSAxMDAKLSAgdHJ5OgotICAgIGF0dGVtcHQgPSAwCi0gICAgd2hpbGUgc29jay5jb25uZWN0X2V4KCgnMTI3LjAuMC4xJywgcG9ydCkpICE9IDA6Ci0gICAgICBhdHRlbXB0ICs9IDEKLSAgICAgIGlmIGF0dGVtcHQgPj0gbWF4X2F0dGVtcHRzOgotICAgICAgICByYWlzZSBFeGNlcHRpb24oIlRlc3RTZXJ2ZXIgbm90IHJlYWR5IG9uIHBvcnQgJWQgYWZ0ZXIgJS4yZiBzZWNvbmRzIgotICAgICAgICAgICAgICAgICAgICAgICAgJSAocG9ydCwgc2xlZXBfdGltZSAqIGF0dGVtcHQpKQotICAgICAgZW5zdXJlU2VydmVyQWxpdmUoKQotICAgICAgdGltZS5zbGVlcChzbGVlcF90aW1lKQotICBmaW5hbGx5OgotICAgIHNvY2suY2xvc2UoKQotCi0gIHRyeToKLSAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAwOgotICAgICAgcHJpbnQgJ1Rlc3RpbmcgY2xpZW50OiAlcycgJSAoJyAnLmpvaW4oY2xpX2FyZ3MpKQotICAgIHJldCA9IHN1YnByb2Nlc3MuY2FsbChjbGlfYXJncykKK2RlZiBydW5TY3JpcHRUZXN0KGxpYmRpciwgZ2VuYmFzZSwgZ2VucHlkaXIsIHNjcmlwdCk6CisgICAgZW52ID0gc2V0dXBfcHlwYXRoKGxpYmRpciwgb3MucGF0aC5qb2luKGdlbmJhc2UsIGdlbnB5ZGlyKSkKKyAgICBzY3JpcHRfYXJncyA9IFtzeXMuZXhlY3V0YWJsZSwgcmVsZmlsZShzY3JpcHQpXQorICAgIHByaW50KCdcblRlc3Rpbmcgc2NyaXB0OiAlc1xuLS0tLScgJSAoJyAnLmpvaW4oc2NyaXB0X2FyZ3MpKSkKKyAgICByZXQgPSBzdWJwcm9jZXNzLmNhbGwoc2NyaXB0X2FyZ3MsIGVudj1lbnYpCiAgICAgaWYgcmV0ICE9IDA6Ci0gICAgICByYWlzZSBFeGNlcHRpb24oIkNsaWVudCBzdWJwcm9jZXNzIGZhaWxlZCwgcmV0Y29kZT0lZCwgYXJnczogJXMiICUgKHJldCwgJyAnLmpvaW4oY2xpX2FyZ3MpKSkKLSAgZmluYWxseToKLSAgICAjIGNoZWNrIHRoYXQgc2VydmVyIGRpZG4ndCBkaWUKLSAgICBlbnN1cmVTZXJ2ZXJBbGl2ZSgpCi0gICAgZXh0cmFfc2xlZXAgPSBFWFRSQV9ERUxBWS5nZXQoc2VydmVyX2NsYXNzLCAwKQotICAgIGlmIGV4dHJhX3NsZWVwID4gMCBhbmQgb3B0aW9ucy52ZXJib3NlID4gMDoKLSAgICAgIHByaW50ICgnR2l2aW5nICVzIChwcm90bz0lcyx6bGliPSVzLHNzbD0lcykgYW4gZXh0cmEgJWQgc2Vjb25kcyBmb3IgY2hpbGQnCi0gICAgICAgICAgICAgJ3Byb2Nlc3NlcyB0byB0ZXJtaW5hdGUgdmlhIGFsYXJtJwotICAgICAgICAgICAgICUgKHNlcnZlcl9jbGFzcywgcHJvdG8sIHVzZV96bGliLCB1c2Vfc3NsLCBleHRyYV9zbGVlcCkpCi0gICAgICB0aW1lLnNsZWVwKGV4dHJhX3NsZWVwKQotICAgIG9zLmtpbGwoc2VydmVycHJvYy5waWQsIHNpZ25hbC5TSUdLSUxMKQotICAgIHNlcnZlcnByb2Mud2FpdCgpCisgICAgICAgIHByaW50KCcqKiogRkFJTEVEICoqKicsIGZpbGU9c3lzLnN0ZGVycikKKyAgICAgICAgcHJpbnQoJ0xJQkRJUjogJXMnICUgbGliZGlyLCBmaWxlPXN5cy5zdGRlcnIpCisgICAgICAgIHByaW50KCdQWV9HRU46ICVzJyAlIGdlbnB5ZGlyLCBmaWxlPXN5cy5zdGRlcnIpCisgICAgICAgIHByaW50KCdTQ1JJUFQ6ICVzJyAlIHNjcmlwdCwgZmlsZT1zeXMuc3RkZXJyKQorICAgICAgICByYWlzZSBFeGNlcHRpb24oIlNjcmlwdCBzdWJwcm9jZXNzIGZhaWxlZCwgcmV0Y29kZT0lZCwgYXJnczogJXMiICUgKHJldCwgJyAnLmpvaW4oc2NyaXB0X2FyZ3MpKSkKIAotdGVzdF9jb3VudCA9IDAKLSMgcnVuIHRlc3RzIHdpdGhvdXQgYSBjbGllbnQvc2VydmVyIGZpcnN0Ci1wcmludCAnLS0tLS0tLS0tLS0tLS0tLScKLXByaW50ICcgRXhlY3V0aW5nIGluZGl2aWR1YWwgdGVzdCBzY3JpcHRzIHdpdGggdmFyaW91cyBnZW5lcmF0ZWQgY29kZSBkaXJlY3RvcmllcycKLXByaW50ICcgRGlyZWN0b3JpZXMgdG8gYmUgdGVzdGVkOiAnICsgJywgJy5qb2luKGdlbmVyYXRlZF9kaXJzKQotcHJpbnQgJyBTY3JpcHRzIHRvIGJlIHRlc3RlZDogJyArICcsICcuam9pbihTQ1JJUFRTKQotcHJpbnQgJy0tLS0tLS0tLS0tLS0tLS0nCi1mb3IgZ2VucHlkaXIgaW4gZ2VuZXJhdGVkX2RpcnM6Ci0gIGZvciBzY3JpcHQgaW4gU0NSSVBUUzoKLSAgICBydW5TY3JpcHRUZXN0KGdlbnB5ZGlyLCBzY3JpcHQpCiAKLXByaW50ICctLS0tLS0tLS0tLS0tLS0tJwotcHJpbnQgJyBFeGVjdXRpbmcgQ2xpZW50L1NlcnZlciB0ZXN0cyB3aXRoIHZhcmlvdXMgZ2VuZXJhdGVkIGNvZGUgZGlyZWN0b3JpZXMnCi1wcmludCAnIFNlcnZlcnMgdG8gYmUgdGVzdGVkOiAnICsgJywgJy5qb2luKFNFUlZFUlMpCi1wcmludCAnIERpcmVjdG9yaWVzIHRvIGJlIHRlc3RlZDogJyArICcsICcuam9pbihnZW5lcmF0ZWRfZGlycykKLXByaW50ICcgUHJvdG9jb2xzIHRvIGJlIHRlc3RlZDogJyArICcsICcuam9pbihQUk9UT1MpCi1wcmludCAnIE9wdGlvbnMgdG8gYmUgdGVzdGVkOiBaTElCKHllcy9ubyksIFNTTCh5ZXMvbm8pJwotcHJpbnQgJy0tLS0tLS0tLS0tLS0tLS0nCi1mb3IgdHJ5X3NlcnZlciBpbiBTRVJWRVJTOgotICBmb3IgZ2VucHlkaXIgaW4gZ2VuZXJhdGVkX2RpcnM6Ci0gICAgZm9yIHRyeV9wcm90byBpbiBQUk9UT1M6Ci0gICAgICBmb3Igd2l0aF96bGliIGluIChGYWxzZSwgVHJ1ZSk6CitkZWYgcnVuU2VydmljZVRlc3QobGliZGlyLCBnZW5iYXNlLCBnZW5weWRpciwgc2VydmVyX2NsYXNzLCBwcm90bywgcG9ydCwgdXNlX3psaWIsIHVzZV9zc2wsIHZlcmJvc2UpOgorICAgIGVudiA9IHNldHVwX3B5cGF0aChsaWJkaXIsIG9zLnBhdGguam9pbihnZW5iYXNlLCBnZW5weWRpcikpCisgICAgIyBCdWlsZCBjb21tYW5kIGxpbmUgYXJndW1lbnRzCisgICAgc2VydmVyX2FyZ3MgPSBbc3lzLmV4ZWN1dGFibGUsIHJlbGZpbGUoJ1Rlc3RTZXJ2ZXIucHknKV0KKyAgICBjbGlfYXJncyA9IFtzeXMuZXhlY3V0YWJsZSwgcmVsZmlsZSgnVGVzdENsaWVudC5weScpXQorICAgIGZvciB3aGljaCBpbiAoc2VydmVyX2FyZ3MsIGNsaV9hcmdzKToKKyAgICAgICAgd2hpY2guYXBwZW5kKCctLXByb3RvY29sPSVzJyAlIHByb3RvKSAgIyBhY2NlbCwgYmluYXJ5LCBjb21wYWN0IG9yIGpzb24KKyAgICAgICAgd2hpY2guYXBwZW5kKCctLXBvcnQ9JWQnICUgcG9ydCkgICMgZGVmYXVsdCB0byA5MDkwCisgICAgICAgIGlmIHVzZV96bGliOgorICAgICAgICAgICAgd2hpY2guYXBwZW5kKCctLXpsaWInKQorICAgICAgICBpZiB1c2Vfc3NsOgorICAgICAgICAgICAgd2hpY2guYXBwZW5kKCctLXNzbCcpCisgICAgICAgIGlmIHZlcmJvc2UgPT0gMDoKKyAgICAgICAgICAgIHdoaWNoLmFwcGVuZCgnLXEnKQorICAgICAgICBpZiB2ZXJib3NlID09IDI6CisgICAgICAgICAgICB3aGljaC5hcHBlbmQoJy12JykKKyAgICAjIHNlcnZlci1zcGVjaWZpYyBvcHRpb24gdG8gc2VsZWN0IHNlcnZlciBjbGFzcworICAgIHNlcnZlcl9hcmdzLmFwcGVuZChzZXJ2ZXJfY2xhc3MpCisgICAgIyBjbGllbnQtc3BlY2lmaWMgY21kbGluZSBvcHRpb25zCisgICAgaWYgc2VydmVyX2NsYXNzIGluIEZSQU1FRDoKKyAgICAgICAgY2xpX2FyZ3MuYXBwZW5kKCctLXRyYW5zcG9ydD1mcmFtZWQnKQorICAgIGVsc2U6CisgICAgICAgIGNsaV9hcmdzLmFwcGVuZCgnLS10cmFuc3BvcnQ9YnVmZmVyZWQnKQorICAgIGlmIHNlcnZlcl9jbGFzcyA9PSAnVEh0dHBTZXJ2ZXInOgorICAgICAgICBjbGlfYXJncy5hcHBlbmQoJy0taHR0cD0vJykKKyAgICBpZiB2ZXJib3NlID4gMDoKKyAgICAgICAgcHJpbnQoJ1Rlc3Rpbmcgc2VydmVyICVzOiAlcycgJSAoc2VydmVyX2NsYXNzLCAnICcuam9pbihzZXJ2ZXJfYXJncykpKQorICAgIHNlcnZlcnByb2MgPSBzdWJwcm9jZXNzLlBvcGVuKHNlcnZlcl9hcmdzLCBlbnY9ZW52KQorCisgICAgZGVmIGVuc3VyZVNlcnZlckFsaXZlKCk6CisgICAgICAgIGlmIHNlcnZlcnByb2MucG9sbCgpIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcHJpbnQoKCdGQUlMOiBTZXJ2ZXIgcHJvY2VzcyAoJXMpIGZhaWxlZCB3aXRoIHJldGNvZGUgJWQnKQorICAgICAgICAgICAgICAgICAgJSAoJyAnLmpvaW4oc2VydmVyX2FyZ3MpLCBzZXJ2ZXJwcm9jLnJldHVybmNvZGUpKQorICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCdTZXJ2ZXIgc3VicHJvY2VzcyAlcyBkaWVkLCBhcmdzOiAlcycKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIChzZXJ2ZXJfY2xhc3MsICcgJy5qb2luKHNlcnZlcl9hcmdzKSkpCisKKyAgICAjIFdhaXQgZm9yIHRoZSBzZXJ2ZXIgdG8gc3RhcnQgYWNjZXB0aW5nIGNvbm5lY3Rpb25zIG9uIHRoZSBnaXZlbiBwb3J0LgorICAgIHNsZWVwX3RpbWUgPSAwLjEgICMgU2Vjb25kcworICAgIG1heF9hdHRlbXB0cyA9IDEwMAorICAgIGF0dGVtcHQgPSAwCisgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgc29jazQgPSBzb2NrZXQuc29ja2V0KCkKKyAgICAgICAgc29jazYgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUNikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgc29jazQuY29ubmVjdF9leCgoJzEyNy4wLjAuMScsIHBvcnQpKSA9PSAwIFwKKyAgICAgICAgICAgICAgICAgICAgb3Igc29jazYuY29ubmVjdF9leCgoJzo6MScsIHBvcnQpKSA9PSAwOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBhdHRlbXB0ICs9IDEKKyAgICAgICAgICAgIGlmIGF0dGVtcHQgPj0gbWF4X2F0dGVtcHRzOgorICAgICAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiVGVzdFNlcnZlciBub3QgcmVhZHkgb24gcG9ydCAlZCBhZnRlciAlLjJmIHNlY29uZHMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgKHBvcnQsIHNsZWVwX3RpbWUgKiBhdHRlbXB0KSkKKyAgICAgICAgICAgIGVuc3VyZVNlcnZlckFsaXZlKCkKKyAgICAgICAgICAgIHRpbWUuc2xlZXAoc2xlZXBfdGltZSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNvY2s0LmNsb3NlKCkKKyAgICAgICAgICAgIHNvY2s2LmNsb3NlKCkKKworICAgIHRyeToKKyAgICAgICAgaWYgdmVyYm9zZSA+IDA6CisgICAgICAgICAgICBwcmludCgnVGVzdGluZyBjbGllbnQ6ICVzJyAlICgnICcuam9pbihjbGlfYXJncykpKQorICAgICAgICByZXQgPSBzdWJwcm9jZXNzLmNhbGwoY2xpX2FyZ3MsIGVudj1lbnYpCisgICAgICAgIGlmIHJldCAhPSAwOgorICAgICAgICAgICAgcHJpbnQoJyoqKiBGQUlMRUQgKioqJywgZmlsZT1zeXMuc3RkZXJyKQorICAgICAgICAgICAgcHJpbnQoJ0xJQkRJUjogJXMnICUgbGliZGlyLCBmaWxlPXN5cy5zdGRlcnIpCisgICAgICAgICAgICBwcmludCgnUFlfR0VOOiAlcycgJSBnZW5weWRpciwgZmlsZT1zeXMuc3RkZXJyKQorICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJDbGllbnQgc3VicHJvY2VzcyBmYWlsZWQsIHJldGNvZGU9JWQsIGFyZ3M6ICVzIiAlIChyZXQsICcgJy5qb2luKGNsaV9hcmdzKSkpCisgICAgZmluYWxseToKKyAgICAgICAgIyBjaGVjayB0aGF0IHNlcnZlciBkaWRuJ3QgZGllCisgICAgICAgIGVuc3VyZVNlcnZlckFsaXZlKCkKKyAgICAgICAgZXh0cmFfc2xlZXAgPSBFWFRSQV9ERUxBWS5nZXQoc2VydmVyX2NsYXNzLCAwKQorICAgICAgICBpZiBleHRyYV9zbGVlcCA+IDAgYW5kIHZlcmJvc2UgPiAwOgorICAgICAgICAgICAgcHJpbnQoJ0dpdmluZyAlcyAocHJvdG89JXMsemxpYj0lcyxzc2w9JXMpIGFuIGV4dHJhICVkIHNlY29uZHMgZm9yIGNoaWxkJworICAgICAgICAgICAgICAgICAgJ3Byb2Nlc3NlcyB0byB0ZXJtaW5hdGUgdmlhIGFsYXJtJworICAgICAgICAgICAgICAgICAgJSAoc2VydmVyX2NsYXNzLCBwcm90bywgdXNlX3psaWIsIHVzZV9zc2wsIGV4dHJhX3NsZWVwKSkKKyAgICAgICAgICAgIHRpbWUuc2xlZXAoZXh0cmFfc2xlZXApCisgICAgICAgIHNpZyA9IHNpZ25hbC5TSUdLSUxMIGlmIHBsYXRmb3JtLnN5c3RlbSgpICE9ICdXaW5kb3dzJyBlbHNlIHNpZ25hbC5TSUdBQlJUCisgICAgICAgIG9zLmtpbGwoc2VydmVycHJvYy5waWQsIHNpZykKKyAgICAgICAgc2VydmVycHJvYy53YWl0KCkKKworCitjbGFzcyBUZXN0Q2FzZXMob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZ2VuYmFzZSwgbGliZGlyLCBwb3J0LCBnZW5kaXJzLCBzZXJ2ZXJzLCB2ZXJib3NlKToKKyAgICAgICAgc2VsZi5nZW5iYXNlID0gZ2VuYmFzZQorICAgICAgICBzZWxmLmxpYmRpciA9IGxpYmRpcgorICAgICAgICBzZWxmLnBvcnQgPSBwb3J0CisgICAgICAgIHNlbGYudmVyYm9zZSA9IHZlcmJvc2UKKyAgICAgICAgc2VsZi5nZW5kaXJzID0gZ2VuZGlycworICAgICAgICBzZWxmLnNlcnZlcnMgPSBzZXJ2ZXJzCisKKyAgICBkZWYgZGVmYXVsdF9jb25mKHNlbGYpOgorICAgICAgICByZXR1cm4geworICAgICAgICAgICAgJ2dlbmRpcic6IHNlbGYuZ2VuZGlyc1swXSwKKyAgICAgICAgICAgICdzZXJ2ZXInOiBzZWxmLnNlcnZlcnNbMF0sCisgICAgICAgICAgICAncHJvdG8nOiBQUk9UT1NbMF0sCisgICAgICAgICAgICAnemxpYic6IEZhbHNlLAorICAgICAgICAgICAgJ3NzbCc6IEZhbHNlLAorICAgICAgICB9CisKKyAgICBkZWYgcnVuKHNlbGYsIGNvbmYsIHRlc3RfY291bnQpOgorICAgICAgICB3aXRoX3psaWIgPSBjb25mWyd6bGliJ10KKyAgICAgICAgd2l0aF9zc2wgPSBjb25mWydzc2wnXQorICAgICAgICB0cnlfc2VydmVyID0gY29uZlsnc2VydmVyJ10KKyAgICAgICAgdHJ5X3Byb3RvID0gY29uZlsncHJvdG8nXQorICAgICAgICBnZW5weWRpciA9IGNvbmZbJ2dlbmRpciddCiAgICAgICAgICMgc2tpcCBhbnkgc2VydmVycyB0aGF0IGRvbid0IHdvcmsgd2l0aCB0aGUgWmxpYiB0cmFuc3BvcnQKICAgICAgICAgaWYgd2l0aF96bGliIGFuZCB0cnlfc2VydmVyIGluIFNLSVBfWkxJQjoKLSAgICAgICAgICBjb250aW51ZQotICAgICAgICBmb3Igd2l0aF9zc2wgaW4gKEZhbHNlLCBUcnVlKToKLSAgICAgICAgICAjIHNraXAgYW55IHNlcnZlcnMgdGhhdCBkb24ndCB3b3JrIHdpdGggU1NMCi0gICAgICAgICAgaWYgd2l0aF9zc2wgYW5kIHRyeV9zZXJ2ZXIgaW4gU0tJUF9TU0w6Ci0gICAgICAgICAgICBjb250aW51ZQotICAgICAgICAgIHRlc3RfY291bnQgKz0gMQotICAgICAgICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDA6Ci0gICAgICAgICAgICBwcmludCAnXG5UZXN0IHJ1biAjJWQ6ICAoaW5jbHVkZXMgJXMpIFNlcnZlcj0lcywgIFByb3RvPSVzLCAgemxpYj0lcywgIFNTTD0lcycgJSAodGVzdF9jb3VudCwgZ2VucHlkaXIsIHRyeV9zZXJ2ZXIsIHRyeV9wcm90bywgd2l0aF96bGliLCB3aXRoX3NzbCkKLSAgICAgICAgICBydW5TZXJ2aWNlVGVzdChnZW5weWRpciwgdHJ5X3NlcnZlciwgdHJ5X3Byb3RvLCBvcHRpb25zLnBvcnQsIHdpdGhfemxpYiwgd2l0aF9zc2wpCi0gICAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMDoKLSAgICAgICAgICAgIHByaW50ICdPSzogRmluaXNoZWQgKGluY2x1ZGVzICVzKSAgJXMgLyAlcyBwcm90byAvIHpsaWI9JXMgLyBTU0w9JXMuICAgJWQgY29tYmluYXRpb25zIHRlc3RlZC4nICUgKGdlbnB5ZGlyLCB0cnlfc2VydmVyLCB0cnlfcHJvdG8sIHdpdGhfemxpYiwgd2l0aF9zc2wsIHRlc3RfY291bnQpCisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgIyBza2lwIGFueSBzZXJ2ZXJzIHRoYXQgZG9uJ3Qgd29yayB3aXRoIFNTTAorICAgICAgICBpZiB3aXRoX3NzbCBhbmQgdHJ5X3NlcnZlciBpbiBTS0lQX1NTTDoKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBpZiBzZWxmLnZlcmJvc2UgPiAwOgorICAgICAgICAgICAgcHJpbnQoJ1xuVGVzdCBydW4gIyVkOiAgKGluY2x1ZGVzICVzKSBTZXJ2ZXI9JXMsICBQcm90bz0lcywgIHpsaWI9JXMsICBTU0w9JXMnCisgICAgICAgICAgICAgICAgICAlICh0ZXN0X2NvdW50LCBnZW5weWRpciwgdHJ5X3NlcnZlciwgdHJ5X3Byb3RvLCB3aXRoX3psaWIsIHdpdGhfc3NsKSkKKyAgICAgICAgcnVuU2VydmljZVRlc3Qoc2VsZi5saWJkaXIsIHNlbGYuZ2VuYmFzZSwgZ2VucHlkaXIsIHRyeV9zZXJ2ZXIsIHRyeV9wcm90bywgc2VsZi5wb3J0LCB3aXRoX3psaWIsIHdpdGhfc3NsLCBzZWxmLnZlcmJvc2UpCisgICAgICAgIGlmIHNlbGYudmVyYm9zZSA+IDA6CisgICAgICAgICAgICBwcmludCgnT0s6IEZpbmlzaGVkIChpbmNsdWRlcyAlcykgICVzIC8gJXMgcHJvdG8gLyB6bGliPSVzIC8gU1NMPSVzLiAgICVkIGNvbWJpbmF0aW9ucyB0ZXN0ZWQuJworICAgICAgICAgICAgICAgICAgJSAoZ2VucHlkaXIsIHRyeV9zZXJ2ZXIsIHRyeV9wcm90bywgd2l0aF96bGliLCB3aXRoX3NzbCwgdGVzdF9jb3VudCkpCisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgdGVzdF9mZWF0dXJlKHNlbGYsIG5hbWUsIHZhbHVlcyk6CisgICAgICAgIHRlc3RfY291bnQgPSAwCisgICAgICAgIGNvbmYgPSBzZWxmLmRlZmF1bHRfY29uZigpCisgICAgICAgIGZvciB0cnlfc2VydmVyIGluIHZhbHVlczoKKyAgICAgICAgICAgIGNvbmZbbmFtZV0gPSB0cnlfc2VydmVyCisgICAgICAgICAgICBpZiBzZWxmLnJ1bihjb25mLCB0ZXN0X2NvdW50KToKKyAgICAgICAgICAgICAgICB0ZXN0X2NvdW50ICs9IDEKKyAgICAgICAgcmV0dXJuIHRlc3RfY291bnQKKworICAgIGRlZiBydW5fYWxsX3Rlc3RzKHNlbGYpOgorICAgICAgICB0ZXN0X2NvdW50ID0gMAorICAgICAgICBmb3IgdHJ5X3NlcnZlciBpbiBzZWxmLnNlcnZlcnM6CisgICAgICAgICAgICBmb3IgZ2VucHlkaXIgaW4gc2VsZi5nZW5kaXJzOgorICAgICAgICAgICAgICAgIGZvciB0cnlfcHJvdG8gaW4gUFJPVE9TOgorICAgICAgICAgICAgICAgICAgICBmb3Igd2l0aF96bGliIGluIChGYWxzZSwgVHJ1ZSk6CisgICAgICAgICAgICAgICAgICAgICAgICAjIHNraXAgYW55IHNlcnZlcnMgdGhhdCBkb24ndCB3b3JrIHdpdGggdGhlIFpsaWIgdHJhbnNwb3J0CisgICAgICAgICAgICAgICAgICAgICAgICBpZiB3aXRoX3psaWIgYW5kIHRyeV9zZXJ2ZXIgaW4gU0tJUF9aTElCOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgICAgICBmb3Igd2l0aF9zc2wgaW4gKEZhbHNlLCBUcnVlKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHNraXAgYW55IHNlcnZlcnMgdGhhdCBkb24ndCB3b3JrIHdpdGggU1NMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgd2l0aF9zc2wgYW5kIHRyeV9zZXJ2ZXIgaW4gU0tJUF9TU0w6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9jb3VudCArPSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi52ZXJib3NlID4gMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQoJ1xuVGVzdCBydW4gIyVkOiAgKGluY2x1ZGVzICVzKSBTZXJ2ZXI9JXMsICBQcm90bz0lcywgIHpsaWI9JXMsICBTU0w9JXMnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgKHRlc3RfY291bnQsIGdlbnB5ZGlyLCB0cnlfc2VydmVyLCB0cnlfcHJvdG8sIHdpdGhfemxpYiwgd2l0aF9zc2wpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1blNlcnZpY2VUZXN0KHNlbGYubGliZGlyLCBzZWxmLmdlbmJhc2UsIGdlbnB5ZGlyLCB0cnlfc2VydmVyLCB0cnlfcHJvdG8sIHNlbGYucG9ydCwgd2l0aF96bGliLCB3aXRoX3NzbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLnZlcmJvc2UgPiAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludCgnT0s6IEZpbmlzaGVkIChpbmNsdWRlcyAlcykgICVzIC8gJXMgcHJvdG8gLyB6bGliPSVzIC8gU1NMPSVzLiAgICVkIGNvbWJpbmF0aW9ucyB0ZXN0ZWQuJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIChnZW5weWRpciwgdHJ5X3NlcnZlciwgdHJ5X3Byb3RvLCB3aXRoX3psaWIsIHdpdGhfc3NsLCB0ZXN0X2NvdW50KSkKKyAgICAgICAgcmV0dXJuIHRlc3RfY291bnQKKworCitkZWYgbWFpbigpOgorICAgIHBhcnNlciA9IE9wdGlvblBhcnNlcigpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oJy0tYWxsJywgYWN0aW9uPSJzdG9yZV90cnVlIiwgZGVzdD0nYWxsJykKKyAgICBwYXJzZXIuYWRkX29wdGlvbignLS1nZW5weWRpcnMnLCB0eXBlPSdzdHJpbmcnLCBkZXN0PSdnZW5weWRpcnMnLAorICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9J2RlZmF1bHQsc2xvdHMsb2xkc3R5bGUsbm9fdXRmOHN0cmluZ3MsZHluYW1pYyxkeW5hbWljc2xvdHMnLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J2RpcmVjdG9yeSBleHRlbnNpb25zIGZvciBnZW5lcmF0ZWQgY29kZSwgdXNlZCBhcyBzdWZmaXhlcyBmb3IgXCJnZW4tcHktKlwiIGFkZGVkIHN5cy5wYXRoIGZvciBpbmRpdmlkdWFsIHRlc3RzJykKKyAgICBwYXJzZXIuYWRkX29wdGlvbigiLS1wb3J0IiwgdHlwZT0iaW50IiwgZGVzdD0icG9ydCIsIGRlZmF1bHQ9OTA5MCwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJwb3J0IG51bWJlciBmb3Igc2VydmVyIHRvIGxpc3RlbiBvbiIpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oJy12JywgJy0tdmVyYm9zZScsIGFjdGlvbj0ic3RvcmVfY29uc3QiLAorICAgICAgICAgICAgICAgICAgICAgIGRlc3Q9InZlcmJvc2UiLCBjb25zdD0yLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9InZlcmJvc2Ugb3V0cHV0IikKKyAgICBwYXJzZXIuYWRkX29wdGlvbignLXEnLCAnLS1xdWlldCcsIGFjdGlvbj0ic3RvcmVfY29uc3QiLAorICAgICAgICAgICAgICAgICAgICAgIGRlc3Q9InZlcmJvc2UiLCBjb25zdD0wLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9Im1pbmltYWwgb3V0cHV0IikKKyAgICBwYXJzZXIuYWRkX29wdGlvbignLUwnLCAnLS1saWJkaXInLCBkZXN0PSJsaWJkaXIiLCBkZWZhdWx0PWxvY2FsX2xpYnBhdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJkaXJlY3RvcnkgcGF0aCB0aGF0IGNvbnRhaW5zIFRocmlmdCBQeXRob24gbGlicmFyeSIpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oJy0tZ2VuLWJhc2UnLCBkZXN0PSJnZW5fYmFzZSIsIGRlZmF1bHQ9U0NSSVBUX0RJUiwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJkaXJlY3RvcnkgcGF0aCB0aGF0IGNvbnRhaW5zIFRocmlmdCBQeXRob24gbGlicmFyeSIpCisgICAgcGFyc2VyLnNldF9kZWZhdWx0cyh2ZXJib3NlPTEpCisgICAgb3B0aW9ucywgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKKworICAgIGdlbmVyYXRlZF9kaXJzID0gW10KKyAgICBmb3IgZ3BfZGlyIGluIG9wdGlvbnMuZ2VucHlkaXJzLnNwbGl0KCcsJyk6CisgICAgICAgIGdlbmVyYXRlZF9kaXJzLmFwcGVuZCgnZ2VuLXB5LSVzJyAlIChncF9kaXIpKQorCisgICAgIyBjb21tYW5kbGluZSBwZXJtaXRzIGEgc2luZ2xlIGNsYXNzIG5hbWUgdG8gYmUgc3BlY2lmaWVkIHRvIG92ZXJyaWRlIFNFUlZFUlM9Wy4uLl0KKyAgICBzZXJ2ZXJzID0gZGVmYXVsdF9zZXJ2ZXJzKCkKKyAgICBpZiBsZW4oYXJncykgPT0gMToKKyAgICAgICAgaWYgYXJnc1swXSBpbiBzZXJ2ZXJzOgorICAgICAgICAgICAgc2VydmVycyA9IGFyZ3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByaW50KCdVbmF2YWlsYWJsZSBzZXJ2ZXIgdHlwZSAiJXMiLCBwbGVhc2UgY2hvb3NlIG9uZSBvZjogJXMnICUgKGFyZ3NbMF0sIHNlcnZlcnMpKQorICAgICAgICAgICAgc3lzLmV4aXQoMCkKKworICAgIHRlc3RzID0gVGVzdENhc2VzKG9wdGlvbnMuZ2VuX2Jhc2UsIG9wdGlvbnMubGliZGlyLCBvcHRpb25zLnBvcnQsIGdlbmVyYXRlZF9kaXJzLCBzZXJ2ZXJzLCBvcHRpb25zLnZlcmJvc2UpCisKKyAgICAjIHJ1biB0ZXN0cyB3aXRob3V0IGEgY2xpZW50L3NlcnZlciBmaXJzdAorICAgIHByaW50KCctLS0tLS0tLS0tLS0tLS0tJykKKyAgICBwcmludCgnIEV4ZWN1dGluZyBpbmRpdmlkdWFsIHRlc3Qgc2NyaXB0cyB3aXRoIHZhcmlvdXMgZ2VuZXJhdGVkIGNvZGUgZGlyZWN0b3JpZXMnKQorICAgIHByaW50KCcgRGlyZWN0b3JpZXMgdG8gYmUgdGVzdGVkOiAnICsgJywgJy5qb2luKGdlbmVyYXRlZF9kaXJzKSkKKyAgICBwcmludCgnIFNjcmlwdHMgdG8gYmUgdGVzdGVkOiAnICsgJywgJy5qb2luKFNDUklQVFMpKQorICAgIHByaW50KCctLS0tLS0tLS0tLS0tLS0tJykKKyAgICBmb3IgZ2VucHlkaXIgaW4gZ2VuZXJhdGVkX2RpcnM6CisgICAgICAgIGZvciBzY3JpcHQgaW4gU0NSSVBUUzoKKyAgICAgICAgICAgIHJ1blNjcmlwdFRlc3Qob3B0aW9ucy5saWJkaXIsIG9wdGlvbnMuZ2VuX2Jhc2UsIGdlbnB5ZGlyLCBzY3JpcHQpCisKKyAgICBwcmludCgnLS0tLS0tLS0tLS0tLS0tLScpCisgICAgcHJpbnQoJyBFeGVjdXRpbmcgQ2xpZW50L1NlcnZlciB0ZXN0cyB3aXRoIHZhcmlvdXMgZ2VuZXJhdGVkIGNvZGUgZGlyZWN0b3JpZXMnKQorICAgIHByaW50KCcgU2VydmVycyB0byBiZSB0ZXN0ZWQ6ICcgKyAnLCAnLmpvaW4oc2VydmVycykpCisgICAgcHJpbnQoJyBEaXJlY3RvcmllcyB0byBiZSB0ZXN0ZWQ6ICcgKyAnLCAnLmpvaW4oZ2VuZXJhdGVkX2RpcnMpKQorICAgIHByaW50KCcgUHJvdG9jb2xzIHRvIGJlIHRlc3RlZDogJyArICcsICcuam9pbihQUk9UT1MpKQorICAgIHByaW50KCcgT3B0aW9ucyB0byBiZSB0ZXN0ZWQ6IFpMSUIoeWVzL25vKSwgU1NMKHllcy9ubyknKQorICAgIHByaW50KCctLS0tLS0tLS0tLS0tLS0tJykKKworICAgIGlmIG9wdGlvbnMuYWxsOgorICAgICAgICB0ZXN0cy5ydW5fYWxsX3Rlc3RzKCkKKyAgICBlbHNlOgorICAgICAgICB0ZXN0cy50ZXN0X2ZlYXR1cmUoJ2dlbmRpcicsIGdlbmVyYXRlZF9kaXJzKQorICAgICAgICB0ZXN0cy50ZXN0X2ZlYXR1cmUoJ3NlcnZlcicsIHNlcnZlcnMpCisgICAgICAgIHRlc3RzLnRlc3RfZmVhdHVyZSgncHJvdG8nLCBQUk9UT1MpCisgICAgICAgIHRlc3RzLnRlc3RfZmVhdHVyZSgnemxpYicsIFtGYWxzZSwgVHJ1ZV0pCisgICAgICAgIHRlc3RzLnRlc3RfZmVhdHVyZSgnc3NsJywgW0ZhbHNlLCBUcnVlXSkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHN5cy5leGl0KG1haW4oKSkKZGlmZiAtLWdpdCBhL3Rlc3QvcHkvU2VyaWFsaXphdGlvblRlc3QucHkgYi90ZXN0L3B5L1NlcmlhbGl6YXRpb25UZXN0LnB5CmluZGV4IDQwYTUyZTYuLmVmNzk4MzUgMTAwNzU1Ci0tLSBhL3Rlc3QvcHkvU2VyaWFsaXphdGlvblRlc3QucHkKKysrIGIvdGVzdC9weS9TZXJpYWxpemF0aW9uVGVzdC5weQpAQCAtMTksMzUzICsxOSw0MzkgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLWltcG9ydCBzeXMsIGdsb2IKLWZyb20gb3B0cGFyc2UgaW1wb3J0IE9wdGlvblBhcnNlcgotcGFyc2VyID0gT3B0aW9uUGFyc2VyKCkKLXBhcnNlci5hZGRfb3B0aW9uKCctLWdlbnB5ZGlyJywgdHlwZT0nc3RyaW5nJywgZGVzdD0nZ2VucHlkaXInLCBkZWZhdWx0PSdnZW4tcHknKQotb3B0aW9ucywgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKLWRlbCBzeXMuYXJndlsxOl0gIyBjbGVhbiB1cCBoYWNrIHNvIHVuaXR0ZXN0IGRvZXNuJ3QgY29tcGxhaW4KLXN5cy5wYXRoLmluc2VydCgwLCBvcHRpb25zLmdlbnB5ZGlyKQotc3lzLnBhdGguaW5zZXJ0KDAsIGdsb2IuZ2xvYignLi4vLi4vbGliL3B5L2J1aWxkL2xpYi4qJylbMF0pCitmcm9tIFRocmlmdFRlc3QudHR5cGVzIGltcG9ydCAoCisgICAgQm9uaywKKyAgICBCb29scywKKyAgICBMYXJnZURlbHRhcywKKyAgICBMaXN0Qm9ua3MsCisgICAgTmVzdGVkTGlzdHNCb25rLAorICAgIE5lc3RlZExpc3RzSTMyeDIsCisgICAgTmVzdGVkTGlzdHNJMzJ4MywKKyAgICBOZXN0ZWRNaXhlZHgyLAorICAgIE51bWJlcnosCisgICAgVmVyc2lvbmluZ1Rlc3RWMSwKKyAgICBWZXJzaW9uaW5nVGVzdFYyLAorICAgIFh0cnVjdCwKKyAgICBYdHJ1Y3QyLAorKQogCi1mcm9tIFRocmlmdFRlc3QudHR5cGVzIGltcG9ydCAqCitmcm9tIFJlY3Vyc2l2ZS50dHlwZXMgaW1wb3J0IFJlY1RyZWUKK2Zyb20gUmVjdXJzaXZlLnR0eXBlcyBpbXBvcnQgUmVjTGlzdAorZnJvbSBSZWN1cnNpdmUudHR5cGVzIGltcG9ydCBDb1JlYworZnJvbSBSZWN1cnNpdmUudHR5cGVzIGltcG9ydCBDb1JlYzIKK2Zyb20gUmVjdXJzaXZlLnR0eXBlcyBpbXBvcnQgVmVjdG9yVGVzdAogZnJvbSBEZWJ1Z1Byb3RvVGVzdC50dHlwZXMgaW1wb3J0IENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QsIEVtcHR5CiBmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQKLWZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFNvY2tldAogZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbCwgVENvbXBhY3RQcm90b2NvbCwgVEpTT05Qcm90b2NvbAogZnJvbSB0aHJpZnQuVFNlcmlhbGl6YXRpb24gaW1wb3J0IHNlcmlhbGl6ZSwgZGVzZXJpYWxpemUKK2ltcG9ydCBzeXMKIGltcG9ydCB1bml0dGVzdAotaW1wb3J0IHRpbWUKKwogCiBjbGFzcyBBYnN0cmFjdFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogCi0gIGRlZiBzZXRVcChzZWxmKToKLSAgICAgIHNlbGYudjFvYmogPSBWZXJzaW9uaW5nVGVzdFYxKAotICAgICAgICAgIGJlZ2luX2luX2JvdGg9MTIzNDUsCi0gICAgICAgICAgb2xkX3N0cmluZz0nYWFhJywKLSAgICAgICAgICBlbmRfaW5fYm90aD01NDMyMSwKLSAgICAgICAgICApCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnYxb2JqID0gVmVyc2lvbmluZ1Rlc3RWMSgKKyAgICAgICAgICAgIGJlZ2luX2luX2JvdGg9MTIzNDUsCisgICAgICAgICAgICBvbGRfc3RyaW5nPSdhYWEnLAorICAgICAgICAgICAgZW5kX2luX2JvdGg9NTQzMjEsCisgICAgICAgICkKIAotICAgICAgc2VsZi52Mm9iaiA9IFZlcnNpb25pbmdUZXN0VjIoCi0gICAgICAgICAgYmVnaW5faW5fYm90aD0xMjM0NSwKLSAgICAgICAgICBuZXdpbnQ9MSwKLSAgICAgICAgICBuZXdieXRlPTIsCi0gICAgICAgICAgbmV3c2hvcnQ9MywKLSAgICAgICAgICBuZXdsb25nPTQsCi0gICAgICAgICAgbmV3ZG91YmxlPTUuMCwKLSAgICAgICAgICBuZXdzdHJ1Y3Q9Qm9uayhtZXNzYWdlPSJIZWxsbyEiLCB0eXBlPTEyMyksCi0gICAgICAgICAgbmV3bGlzdD1bNyw4LDldLAotICAgICAgICAgIG5ld3NldD1zZXQoWzQyLDEsOF0pLAotICAgICAgICAgIG5ld21hcD17MToyLDI6M30sCi0gICAgICAgICAgbmV3c3RyaW5nPSJIb2xhISIsCi0gICAgICAgICAgZW5kX2luX2JvdGg9NTQzMjEsCi0gICAgICAgICAgKQorICAgICAgICBzZWxmLnYyb2JqID0gVmVyc2lvbmluZ1Rlc3RWMigKKyAgICAgICAgICAgIGJlZ2luX2luX2JvdGg9MTIzNDUsCisgICAgICAgICAgICBuZXdpbnQ9MSwKKyAgICAgICAgICAgIG5ld2J5dGU9MiwKKyAgICAgICAgICAgIG5ld3Nob3J0PTMsCisgICAgICAgICAgICBuZXdsb25nPTQsCisgICAgICAgICAgICBuZXdkb3VibGU9NS4wLAorICAgICAgICAgICAgbmV3c3RydWN0PUJvbmsobWVzc2FnZT0iSGVsbG8hIiwgdHlwZT0xMjMpLAorICAgICAgICAgICAgbmV3bGlzdD1bNywgOCwgOV0sCisgICAgICAgICAgICBuZXdzZXQ9c2V0KFs0MiwgMSwgOF0pLAorICAgICAgICAgICAgbmV3bWFwPXsxOiAyLCAyOiAzfSwKKyAgICAgICAgICAgIG5ld3N0cmluZz0iSG9sYSEiLAorICAgICAgICAgICAgZW5kX2luX2JvdGg9NTQzMjEsCisgICAgICAgICkKIAotICAgICAgc2VsZi5ib29scyA9IEJvb2xzKGltX3RydWU9VHJ1ZSwgaW1fZmFsc2U9RmFsc2UpCi0gICAgICBzZWxmLmJvb2xzX2ZsaXBwZWQgPSBCb29scyhpbV90cnVlPUZhbHNlLCBpbV9mYWxzZT1UcnVlKQorICAgICAgICBzZWxmLmJvb2xzID0gQm9vbHMoaW1fdHJ1ZT1UcnVlLCBpbV9mYWxzZT1GYWxzZSkKKyAgICAgICAgc2VsZi5ib29sc19mbGlwcGVkID0gQm9vbHMoaW1fdHJ1ZT1GYWxzZSwgaW1fZmFsc2U9VHJ1ZSkKIAotICAgICAgc2VsZi5sYXJnZV9kZWx0YXMgPSBMYXJnZURlbHRhcyAoCi0gICAgICAgICAgYjE9c2VsZi5ib29scywKLSAgICAgICAgICBiMTA9c2VsZi5ib29sc19mbGlwcGVkLAotICAgICAgICAgIGIxMDA9c2VsZi5ib29scywKLSAgICAgICAgICBjaGVja190cnVlPVRydWUsCi0gICAgICAgICAgYjEwMDA9c2VsZi5ib29sc19mbGlwcGVkLAotICAgICAgICAgIGNoZWNrX2ZhbHNlPUZhbHNlLAotICAgICAgICAgIHZlcnR3bzIwMDA9VmVyc2lvbmluZ1Rlc3RWMihuZXdzdHJ1Y3Q9Qm9uayhtZXNzYWdlPSdXb3JsZCEnLCB0eXBlPTMxNCkpLAotICAgICAgICAgIGFfc2V0MjUwMD1zZXQoWydsYXp5JywgJ2Jyb3duJywgJ2NvdyddKSwKLSAgICAgICAgICB2ZXJ0d28zMDAwPVZlcnNpb25pbmdUZXN0VjIobmV3c2V0PXNldChbMiwgMywgNSwgNywgMTFdKSksCi0gICAgICAgICAgYmlnX251bWJlcnM9WzIqKjgsIDIqKjE2LCAyKiozMS0xLCAtKDIqKjMxLTEpXQotICAgICAgICAgICkKKyAgICAgICAgc2VsZi5sYXJnZV9kZWx0YXMgPSBMYXJnZURlbHRhcygKKyAgICAgICAgICAgIGIxPXNlbGYuYm9vbHMsCisgICAgICAgICAgICBiMTA9c2VsZi5ib29sc19mbGlwcGVkLAorICAgICAgICAgICAgYjEwMD1zZWxmLmJvb2xzLAorICAgICAgICAgICAgY2hlY2tfdHJ1ZT1UcnVlLAorICAgICAgICAgICAgYjEwMDA9c2VsZi5ib29sc19mbGlwcGVkLAorICAgICAgICAgICAgY2hlY2tfZmFsc2U9RmFsc2UsCisgICAgICAgICAgICB2ZXJ0d28yMDAwPVZlcnNpb25pbmdUZXN0VjIobmV3c3RydWN0PUJvbmsobWVzc2FnZT0nV29ybGQhJywgdHlwZT0zMTQpKSwKKyAgICAgICAgICAgIGFfc2V0MjUwMD1zZXQoWydsYXp5JywgJ2Jyb3duJywgJ2NvdyddKSwKKyAgICAgICAgICAgIHZlcnR3bzMwMDA9VmVyc2lvbmluZ1Rlc3RWMihuZXdzZXQ9c2V0KFsyLCAzLCA1LCA3LCAxMV0pKSwKKyAgICAgICAgICAgIGJpZ19udW1iZXJzPVsyICoqIDgsIDIgKiogMTYsIDIgKiogMzEgLSAxLCAtKDIgKiogMzEgLSAxKV0KKyAgICAgICAgKQogCi0gICAgICBzZWxmLmNvbXBhY3Rfc3RydWN0ID0gQ29tcGFjdFByb3RvVGVzdFN0cnVjdCgKLSAgICAgICAgICBhX2J5dGUgPSAxMjcsCi0gICAgICAgICAgYV9pMTY9MzIwMDAsCi0gICAgICAgICAgYV9pMzI9MTAwMDAwMDAwMCwKLSAgICAgICAgICBhX2k2ND0weGZmZmZmZmZmZmYsCi0gICAgICAgICAgYV9kb3VibGU9NS42Nzg5LAotICAgICAgICAgIGFfc3RyaW5nPSJteSBzdHJpbmciLAotICAgICAgICAgIHRydWVfZmllbGQ9VHJ1ZSwKLSAgICAgICAgICBmYWxzZV9maWVsZD1GYWxzZSwKLSAgICAgICAgICBlbXB0eV9zdHJ1Y3RfZmllbGQ9RW1wdHkoKSwKLSAgICAgICAgICBieXRlX2xpc3Q9Wy0xMjcsIC0xLCAwLCAxLCAxMjddLAotICAgICAgICAgIGkxNl9saXN0PVstMSwgMCwgMSwgMHg3ZmZmXSwKLSAgICAgICAgICBpMzJfbGlzdD0gWy0xLCAwLCAweGZmLCAweGZmZmYsIDB4ZmZmZmZmLCAweDdmZmZmZmZmXSwKLSAgICAgICAgICBpNjRfbGlzdD1bLTEsIDAsIDB4ZmYsIDB4ZmZmZiwgMHhmZmZmZmYsIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmZmZiwgMHhmZmZmZmZmZmZmZmYsIDB4ZmZmZmZmZmZmZmZmZmYsIDB4N2ZmZmZmZmZmZmZmZmZmZl0sCi0gICAgICAgICAgZG91YmxlX2xpc3Q9WzAuMSwgMC4yLCAwLjNdLAotICAgICAgICAgIHN0cmluZ19saXN0PVsiZmlyc3QiLCAic2Vjb25kIiwgInRoaXJkIl0sCi0gICAgICAgICAgYm9vbGVhbl9saXN0PVtUcnVlLCBUcnVlLCBUcnVlLCBGYWxzZSwgRmFsc2UsIEZhbHNlXSwKLSAgICAgICAgICBzdHJ1Y3RfbGlzdD1bRW1wdHkoKSwgRW1wdHkoKV0sCi0gICAgICAgICAgYnl0ZV9zZXQ9c2V0KFstMTI3LCAtMSwgMCwgMSwgMTI3XSksCi0gICAgICAgICAgaTE2X3NldD1zZXQoWy0xLCAwLCAxLCAweDdmZmZdKSwKLSAgICAgICAgICBpMzJfc2V0PXNldChbMSwgMiwgM10pLAotICAgICAgICAgIGk2NF9zZXQ9c2V0KFstMSwgMCwgMHhmZiwgMHhmZmZmLCAweGZmZmZmZiwgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZmZmLCAweGZmZmZmZmZmZmZmZiwgMHhmZmZmZmZmZmZmZmZmZiwgMHg3ZmZmZmZmZmZmZmZmZmZmXSksCi0gICAgICAgICAgZG91YmxlX3NldD1zZXQoWzAuMSwgMC4yLCAwLjNdKSwKLSAgICAgICAgICBzdHJpbmdfc2V0PXNldChbImZpcnN0IiwgInNlY29uZCIsICJ0aGlyZCJdKSwKLSAgICAgICAgICBib29sZWFuX3NldD1zZXQoW1RydWUsIEZhbHNlXSksCi0gICAgICAgICAgI3N0cnVjdF9zZXQ9c2V0KFtFbXB0eSgpXSksICMgdW5oYXNoYWJsZSBpbnN0YW5jZQotICAgICAgICAgIGJ5dGVfYnl0ZV9tYXA9ezEgOiAyfSwKLSAgICAgICAgICBpMTZfYnl0ZV9tYXA9ezEgOiAxLCAtMSA6IDEsIDB4N2ZmZiA6IDF9LAotICAgICAgICAgIGkzMl9ieXRlX21hcD17MSA6IDEsIC0xIDogMSwgMHg3ZmZmZmZmZiA6IDF9LAotICAgICAgICAgIGk2NF9ieXRlX21hcD17MCA6IDEsICAxIDogMSwgLTEgOiAxLCAweDdmZmZmZmZmZmZmZmZmZmYgOiAxfSwKLSAgICAgICAgICBkb3VibGVfYnl0ZV9tYXA9ey0xLjEgOiAxLCAxLjEgOiAxfSwKLSAgICAgICAgICBzdHJpbmdfYnl0ZV9tYXA9eyJmaXJzdCIgOiAxLCAic2Vjb25kIiA6IDIsICJ0aGlyZCIgOiAzLCAiIiA6IDB9LAotICAgICAgICAgIGJvb2xlYW5fYnl0ZV9tYXA9e1RydWUgOiAxLCBGYWxzZTogMH0sCi0gICAgICAgICAgYnl0ZV9pMTZfbWFwPXsxIDogMSwgMiA6IC0xLCAzIDogMHg3ZmZmfSwKLSAgICAgICAgICBieXRlX2kzMl9tYXA9ezEgOiAxLCAyIDogLTEsIDMgOiAweDdmZmZmZmZmfSwKLSAgICAgICAgICBieXRlX2k2NF9tYXA9ezEgOiAxLCAyIDogLTEsIDMgOiAweDdmZmZmZmZmZmZmZmZmZmZ9LAotICAgICAgICAgIGJ5dGVfZG91YmxlX21hcD17MSA6IDAuMSwgMiA6IC0wLjEsIDMgOiAxMDAwMDAwLjF9LAotICAgICAgICAgIGJ5dGVfc3RyaW5nX21hcD17MSA6ICIiLCAyIDogImJsYWgiLCAzIDogImxvb29vb29vb29vb29vb25nIHN0cmluZyJ9LAotICAgICAgICAgIGJ5dGVfYm9vbGVhbl9tYXA9ezEgOiBUcnVlLCAyIDogRmFsc2V9LAotICAgICAgICAgICNsaXN0X2J5dGVfbWFwICMgdW5oYXNoYWJsZQotICAgICAgICAgICNzZXRfYnl0ZV9tYXA9e3NldChbMSwgMiwgM10pIDogMSwgc2V0KFswLCAxXSkgOiAyLCBzZXQoW10pIDogMH0sICMgdW5oYXNoYWJsZQotICAgICAgICAgICNtYXBfYnl0ZV9tYXAgIyB1bmhhc2hhYmxlCi0gICAgICAgICAgYnl0ZV9tYXBfbWFwPXswIDoge30sIDEgOiB7MSA6IDF9LCAyIDogezEgOiAxLCAyIDogMn19LAotICAgICAgICAgIGJ5dGVfc2V0X21hcD17MCA6IHNldChbXSksIDEgOiBzZXQoWzFdKSwgMiA6IHNldChbMSwgMl0pfSwKLSAgICAgICAgICBieXRlX2xpc3RfbWFwPXswIDogW10sIDEgOiBbMV0sIDIgOiBbMSwgMl19LAotICAgICAgICAgICkKKyAgICAgICAgc2VsZi5jb21wYWN0X3N0cnVjdCA9IENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QoCisgICAgICAgICAgICBhX2J5dGU9MTI3LAorICAgICAgICAgICAgYV9pMTY9MzIwMDAsCisgICAgICAgICAgICBhX2kzMj0xMDAwMDAwMDAwLAorICAgICAgICAgICAgYV9pNjQ9MHhmZmZmZmZmZmZmLAorICAgICAgICAgICAgYV9kb3VibGU9NS42Nzg5LAorICAgICAgICAgICAgYV9zdHJpbmc9Im15IHN0cmluZyIsCisgICAgICAgICAgICB0cnVlX2ZpZWxkPVRydWUsCisgICAgICAgICAgICBmYWxzZV9maWVsZD1GYWxzZSwKKyAgICAgICAgICAgIGVtcHR5X3N0cnVjdF9maWVsZD1FbXB0eSgpLAorICAgICAgICAgICAgYnl0ZV9saXN0PVstMTI3LCAtMSwgMCwgMSwgMTI3XSwKKyAgICAgICAgICAgIGkxNl9saXN0PVstMSwgMCwgMSwgMHg3ZmZmXSwKKyAgICAgICAgICAgIGkzMl9saXN0PVstMSwgMCwgMHhmZiwgMHhmZmZmLCAweGZmZmZmZiwgMHg3ZmZmZmZmZl0sCisgICAgICAgICAgICBpNjRfbGlzdD1bLTEsIDAsIDB4ZmYsIDB4ZmZmZiwgMHhmZmZmZmYsIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmZmZiwgMHhmZmZmZmZmZmZmZmYsIDB4ZmZmZmZmZmZmZmZmZmYsIDB4N2ZmZmZmZmZmZmZmZmZmZl0sCisgICAgICAgICAgICBkb3VibGVfbGlzdD1bMC4xLCAwLjIsIDAuM10sCisgICAgICAgICAgICBzdHJpbmdfbGlzdD1bImZpcnN0IiwgInNlY29uZCIsICJ0aGlyZCJdLAorICAgICAgICAgICAgYm9vbGVhbl9saXN0PVtUcnVlLCBUcnVlLCBUcnVlLCBGYWxzZSwgRmFsc2UsIEZhbHNlXSwKKyAgICAgICAgICAgIHN0cnVjdF9saXN0PVtFbXB0eSgpLCBFbXB0eSgpXSwKKyAgICAgICAgICAgIGJ5dGVfc2V0PXNldChbLTEyNywgLTEsIDAsIDEsIDEyN10pLAorICAgICAgICAgICAgaTE2X3NldD1zZXQoWy0xLCAwLCAxLCAweDdmZmZdKSwKKyAgICAgICAgICAgIGkzMl9zZXQ9c2V0KFsxLCAyLCAzXSksCisgICAgICAgICAgICBpNjRfc2V0PXNldChbLTEsIDAsIDB4ZmYsIDB4ZmZmZiwgMHhmZmZmZmYsIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmZmZiwgMHhmZmZmZmZmZmZmZmYsIDB4ZmZmZmZmZmZmZmZmZmYsIDB4N2ZmZmZmZmZmZmZmZmZmZl0pLAorICAgICAgICAgICAgZG91YmxlX3NldD1zZXQoWzAuMSwgMC4yLCAwLjNdKSwKKyAgICAgICAgICAgIHN0cmluZ19zZXQ9c2V0KFsiZmlyc3QiLCAic2Vjb25kIiwgInRoaXJkIl0pLAorICAgICAgICAgICAgYm9vbGVhbl9zZXQ9c2V0KFtUcnVlLCBGYWxzZV0pLAorICAgICAgICAgICAgIyBzdHJ1Y3Rfc2V0PXNldChbRW1wdHkoKV0pLCAjIHVuaGFzaGFibGUgaW5zdGFuY2UKKyAgICAgICAgICAgIGJ5dGVfYnl0ZV9tYXA9ezE6IDJ9LAorICAgICAgICAgICAgaTE2X2J5dGVfbWFwPXsxOiAxLCAtMTogMSwgMHg3ZmZmOiAxfSwKKyAgICAgICAgICAgIGkzMl9ieXRlX21hcD17MTogMSwgLTE6IDEsIDB4N2ZmZmZmZmY6IDF9LAorICAgICAgICAgICAgaTY0X2J5dGVfbWFwPXswOiAxLCAxOiAxLCAtMTogMSwgMHg3ZmZmZmZmZmZmZmZmZmZmOiAxfSwKKyAgICAgICAgICAgIGRvdWJsZV9ieXRlX21hcD17LTEuMTogMSwgMS4xOiAxfSwKKyAgICAgICAgICAgIHN0cmluZ19ieXRlX21hcD17ImZpcnN0IjogMSwgInNlY29uZCI6IDIsICJ0aGlyZCI6IDMsICIiOiAwfSwKKyAgICAgICAgICAgIGJvb2xlYW5fYnl0ZV9tYXA9e1RydWU6IDEsIEZhbHNlOiAwfSwKKyAgICAgICAgICAgIGJ5dGVfaTE2X21hcD17MTogMSwgMjogLTEsIDM6IDB4N2ZmZn0sCisgICAgICAgICAgICBieXRlX2kzMl9tYXA9ezE6IDEsIDI6IC0xLCAzOiAweDdmZmZmZmZmfSwKKyAgICAgICAgICAgIGJ5dGVfaTY0X21hcD17MTogMSwgMjogLTEsIDM6IDB4N2ZmZmZmZmZmZmZmZmZmZn0sCisgICAgICAgICAgICBieXRlX2RvdWJsZV9tYXA9ezE6IDAuMSwgMjogLTAuMSwgMzogMTAwMDAwMC4xfSwKKyAgICAgICAgICAgIGJ5dGVfc3RyaW5nX21hcD17MTogIiIsIDI6ICJibGFoIiwgMzogImxvb29vb29vb29vb29vb25nIHN0cmluZyJ9LAorICAgICAgICAgICAgYnl0ZV9ib29sZWFuX21hcD17MTogVHJ1ZSwgMjogRmFsc2V9LAorICAgICAgICAgICAgIyBsaXN0X2J5dGVfbWFwICMgdW5oYXNoYWJsZQorICAgICAgICAgICAgIyBzZXRfYnl0ZV9tYXA9e3NldChbMSwgMiwgM10pIDogMSwgc2V0KFswLCAxXSkgOiAyLCBzZXQoW10pIDogMH0sICMgdW5oYXNoYWJsZQorICAgICAgICAgICAgIyBtYXBfYnl0ZV9tYXAgIyB1bmhhc2hhYmxlCisgICAgICAgICAgICBieXRlX21hcF9tYXA9ezA6IHt9LCAxOiB7MTogMX0sIDI6IHsxOiAxLCAyOiAyfX0sCisgICAgICAgICAgICBieXRlX3NldF9tYXA9ezA6IHNldChbXSksIDE6IHNldChbMV0pLCAyOiBzZXQoWzEsIDJdKX0sCisgICAgICAgICAgICBieXRlX2xpc3RfbWFwPXswOiBbXSwgMTogWzFdLCAyOiBbMSwgMl19LAorICAgICAgICApCiAKLSAgICAgIHNlbGYubmVzdGVkX2xpc3RzX2kzMngyID0gTmVzdGVkTGlzdHNJMzJ4MigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIDEsIDEsIDIgXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsgMiwgNywgOSBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyAzLCA1LCA4IF0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgc2VsZi5uZXN0ZWRfbGlzdHNfaTMyeDIgPSBOZXN0ZWRMaXN0c0kzMngyKAorICAgICAgICAgICAgWworICAgICAgICAgICAgICAgIFsxLCAxLCAyXSwKKyAgICAgICAgICAgICAgICBbMiwgNywgOV0sCisgICAgICAgICAgICAgICAgWzMsIDUsIDhdCisgICAgICAgICAgICBdCisgICAgICAgICkKIAotICAgICAgc2VsZi5uZXN0ZWRfbGlzdHNfaTMyeDMgPSBOZXN0ZWRMaXN0c0kzMngzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyAyLCA3LCA5IF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsgMywgNSwgOCBdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIDEsIDEsIDIgXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyAxLCA0LCA5IF0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLQotICAgICAgc2VsZi5uZXN0ZWRfbWl4ZWR4MiA9IE5lc3RlZE1peGVkeDIoIGludF9zZXRfbGlzdD1bCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldChbMSwyLDNdKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0KFsxLDQsOV0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQoWzEsMiwzLDUsOCwxMywyMV0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQoWy0xLCAwLCAxXSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBub3RlLCB0aGUgc2V0cyBiZWxvdyBhcmUgc2V0cyBvZiBjaGFycywgc2luY2UgdGhlIHN0cmluZ3MgYXJlIGl0ZXJhdGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9pbnRfc3Ryc2V0PXsgMTA6c2V0KCdhYmMnKSwgMjA6c2V0KCdkZWYnKSwgMzA6c2V0KCdHSEknKSB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBfaW50X3N0cnNldF9saXN0PVsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAxMDpzZXQoJ2FiYycpLCAyMDpzZXQoJ2RlZicpLCAzMDpzZXQoJ0dISScpIH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMTAwOnNldCgnbG1uJyksIDIwMDpzZXQoJ29wcScpLCAzMDA6c2V0KCdSU1QnKSB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDEwMDA6c2V0KCd1dncnKSwgMjAwMDpzZXQoJ3d4eScpLCAzMDAwOnNldCgnWFlaJykgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi0KLSAgICAgIHNlbGYubmVzdGVkX2xpc3RzX2JvbmsgPSBOZXN0ZWRMaXN0c0JvbmsoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQm9uayhtZXNzYWdlPSdpbm5lciBBIGZpcnN0JywgdHlwZT0xKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb25rKG1lc3NhZ2U9J2lubmVyIEEgc2Vjb25kJywgdHlwZT0xKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvbmsobWVzc2FnZT0naW5uZXIgQiBmaXJzdCcsIHR5cGU9MiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvbmsobWVzc2FnZT0naW5uZXIgQiBzZWNvbmQnLCB0eXBlPTIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLQotICAgICAgc2VsZi5saXN0X2JvbmtzID0gTGlzdEJvbmtzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb25rKG1lc3NhZ2U9J2lubmVyIEEnLCB0eXBlPTEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb25rKG1lc3NhZ2U9J2lubmVyIEInLCB0eXBlPTIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb25rKG1lc3NhZ2U9J2lubmVyIEMnLCB0eXBlPTApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQotCi0gIGRlZiBfc2VyaWFsaXplKHNlbGYsIG9iaik6Ci0gICAgdHJhbnMgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoKQotICAgIHByb3QgPSBzZWxmLnByb3RvY29sX2ZhY3RvcnkuZ2V0UHJvdG9jb2wodHJhbnMpCi0gICAgb2JqLndyaXRlKHByb3QpCi0gICAgcmV0dXJuIHRyYW5zLmdldHZhbHVlKCkKLQotICBkZWYgX2Rlc2VyaWFsaXplKHNlbGYsIG9ianR5cGUsIGRhdGEpOgotICAgIHByb3QgPSBzZWxmLnByb3RvY29sX2ZhY3RvcnkuZ2V0UHJvdG9jb2woVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKGRhdGEpKQotICAgIHJldCA9IG9ianR5cGUoKQotICAgIHJldC5yZWFkKHByb3QpCi0gICAgcmV0dXJuIHJldAotCi0gIGRlZiB0ZXN0Rm9yd2FyZHMoc2VsZik6Ci0gICAgb2JqID0gc2VsZi5fZGVzZXJpYWxpemUoVmVyc2lvbmluZ1Rlc3RWMiwgc2VsZi5fc2VyaWFsaXplKHNlbGYudjFvYmopKQotICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iai5iZWdpbl9pbl9ib3RoLCBzZWxmLnYxb2JqLmJlZ2luX2luX2JvdGgpCi0gICAgc2VsZi5hc3NlcnRFcXVhbHMob2JqLmVuZF9pbl9ib3RoLCBzZWxmLnYxb2JqLmVuZF9pbl9ib3RoKQotCi0gIGRlZiB0ZXN0QmFja3dhcmRzKHNlbGYpOgotICAgIG9iaiA9IHNlbGYuX2Rlc2VyaWFsaXplKFZlcnNpb25pbmdUZXN0VjEsIHNlbGYuX3NlcmlhbGl6ZShzZWxmLnYyb2JqKSkKLSAgICBzZWxmLmFzc2VydEVxdWFscyhvYmouYmVnaW5faW5fYm90aCwgc2VsZi52Mm9iai5iZWdpbl9pbl9ib3RoKQotICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iai5lbmRfaW5fYm90aCwgc2VsZi52Mm9iai5lbmRfaW5fYm90aCkKLQotICBkZWYgdGVzdFNlcmlhbGl6ZVYxKHNlbGYpOgotICAgIG9iaiA9IHNlbGYuX2Rlc2VyaWFsaXplKFZlcnNpb25pbmdUZXN0VjEsIHNlbGYuX3NlcmlhbGl6ZShzZWxmLnYxb2JqKSkKLSAgICBzZWxmLmFzc2VydEVxdWFscyhvYmosIHNlbGYudjFvYmopCi0KLSAgZGVmIHRlc3RTZXJpYWxpemVWMihzZWxmKToKLSAgICBvYmogPSBzZWxmLl9kZXNlcmlhbGl6ZShWZXJzaW9uaW5nVGVzdFYyLCBzZWxmLl9zZXJpYWxpemUoc2VsZi52Mm9iaikpCi0gICAgc2VsZi5hc3NlcnRFcXVhbHMob2JqLCBzZWxmLnYyb2JqKQotCi0gIGRlZiB0ZXN0Qm9vbHMoc2VsZik6Ci0gICAgc2VsZi5hc3NlcnROb3RFcXVhbHMoc2VsZi5ib29scywgc2VsZi5ib29sc19mbGlwcGVkKQotICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWxzKHNlbGYuYm9vbHMsIHNlbGYudjFvYmopCi0gICAgb2JqID0gc2VsZi5fZGVzZXJpYWxpemUoQm9vbHMsIHNlbGYuX3NlcmlhbGl6ZShzZWxmLmJvb2xzKSkKLSAgICBzZWxmLmFzc2VydEVxdWFscyhvYmosIHNlbGYuYm9vbHMpCi0gICAgb2JqID0gc2VsZi5fZGVzZXJpYWxpemUoQm9vbHMsIHNlbGYuX3NlcmlhbGl6ZShzZWxmLmJvb2xzX2ZsaXBwZWQpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iaiwgc2VsZi5ib29sc19mbGlwcGVkKQotICAgIHJlcCA9IHJlcHIoc2VsZi5ib29scykKLSAgICBzZWxmLmFzc2VydFRydWUobGVuKHJlcCkgPiAwKQotCi0gIGRlZiB0ZXN0TGFyZ2VEZWx0YXMoc2VsZik6Ci0gICAgIyB0ZXN0IGxhcmdlIGZpZWxkIGRlbHRhcyAobWVhbmluZ2Z1bCBpbiBDb21wYWN0UHJvdG8gb25seSkKLSAgICBvYmogPSBzZWxmLl9kZXNlcmlhbGl6ZShMYXJnZURlbHRhcywgc2VsZi5fc2VyaWFsaXplKHNlbGYubGFyZ2VfZGVsdGFzKSkKLSAgICBzZWxmLmFzc2VydEVxdWFscyhvYmosIHNlbGYubGFyZ2VfZGVsdGFzKQotICAgIHJlcCA9IHJlcHIoc2VsZi5sYXJnZV9kZWx0YXMpCi0gICAgc2VsZi5hc3NlcnRUcnVlKGxlbihyZXApID4gMCkKLQotICBkZWYgdGVzdE5lc3RlZExpc3RzSTMyeDIoc2VsZik6Ci0gICAgb2JqID0gc2VsZi5fZGVzZXJpYWxpemUoTmVzdGVkTGlzdHNJMzJ4Miwgc2VsZi5fc2VyaWFsaXplKHNlbGYubmVzdGVkX2xpc3RzX2kzMngyKSkKLSAgICBzZWxmLmFzc2VydEVxdWFscyhvYmosIHNlbGYubmVzdGVkX2xpc3RzX2kzMngyKQotICAgIHJlcCA9IHJlcHIoc2VsZi5uZXN0ZWRfbGlzdHNfaTMyeDIpCi0gICAgc2VsZi5hc3NlcnRUcnVlKGxlbihyZXApID4gMCkKLQotICBkZWYgdGVzdE5lc3RlZExpc3RzSTMyeDMoc2VsZik6Ci0gICAgb2JqID0gc2VsZi5fZGVzZXJpYWxpemUoTmVzdGVkTGlzdHNJMzJ4Mywgc2VsZi5fc2VyaWFsaXplKHNlbGYubmVzdGVkX2xpc3RzX2kzMngzKSkKLSAgICBzZWxmLmFzc2VydEVxdWFscyhvYmosIHNlbGYubmVzdGVkX2xpc3RzX2kzMngzKQotICAgIHJlcCA9IHJlcHIoc2VsZi5uZXN0ZWRfbGlzdHNfaTMyeDMpCi0gICAgc2VsZi5hc3NlcnRUcnVlKGxlbihyZXApID4gMCkKLQotICBkZWYgdGVzdE5lc3RlZE1peGVkeDIoc2VsZik6Ci0gICAgb2JqID0gc2VsZi5fZGVzZXJpYWxpemUoTmVzdGVkTWl4ZWR4Miwgc2VsZi5fc2VyaWFsaXplKHNlbGYubmVzdGVkX21peGVkeDIpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iaiwgc2VsZi5uZXN0ZWRfbWl4ZWR4MikKLSAgICByZXAgPSByZXByKHNlbGYubmVzdGVkX21peGVkeDIpCi0gICAgc2VsZi5hc3NlcnRUcnVlKGxlbihyZXApID4gMCkKLQotICBkZWYgdGVzdE5lc3RlZExpc3RzQm9uayhzZWxmKToKLSAgICBvYmogPSBzZWxmLl9kZXNlcmlhbGl6ZShOZXN0ZWRMaXN0c0JvbmssIHNlbGYuX3NlcmlhbGl6ZShzZWxmLm5lc3RlZF9saXN0c19ib25rKSkKLSAgICBzZWxmLmFzc2VydEVxdWFscyhvYmosIHNlbGYubmVzdGVkX2xpc3RzX2JvbmspCi0gICAgcmVwID0gcmVwcihzZWxmLm5lc3RlZF9saXN0c19ib25rKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4ocmVwKSA+IDApCi0KLSAgZGVmIHRlc3RMaXN0Qm9ua3Moc2VsZik6Ci0gICAgb2JqID0gc2VsZi5fZGVzZXJpYWxpemUoTGlzdEJvbmtzLCBzZWxmLl9zZXJpYWxpemUoc2VsZi5saXN0X2JvbmtzKSkKLSAgICBzZWxmLmFzc2VydEVxdWFscyhvYmosIHNlbGYubGlzdF9ib25rcykKLSAgICByZXAgPSByZXByKHNlbGYubGlzdF9ib25rcykKLSAgICBzZWxmLmFzc2VydFRydWUobGVuKHJlcCkgPiAwKQotCi0gIGRlZiB0ZXN0Q29tcGFjdFN0cnVjdChzZWxmKToKLSAgICAjIHRlc3QgbGFyZ2UgZmllbGQgZGVsdGFzIChtZWFuaW5nZnVsIGluIENvbXBhY3RQcm90byBvbmx5KQotICAgIG9iaiA9IHNlbGYuX2Rlc2VyaWFsaXplKENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QsIHNlbGYuX3NlcmlhbGl6ZShzZWxmLmNvbXBhY3Rfc3RydWN0KSkKLSAgICBzZWxmLmFzc2VydEVxdWFscyhvYmosIHNlbGYuY29tcGFjdF9zdHJ1Y3QpCi0gICAgcmVwID0gcmVwcihzZWxmLmNvbXBhY3Rfc3RydWN0KQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4ocmVwKSA+IDApCi0KLSAgZGVmIHRlc3RJbnRlZ2VyTGltaXRzKHNlbGYpOgotICAgIGJhZF92YWx1ZXMgPSBbQ29tcGFjdFByb3RvVGVzdFN0cnVjdChhX2J5dGU9MTI4KSwgQ29tcGFjdFByb3RvVGVzdFN0cnVjdChhX2J5dGU9LTEyOSksCi0gICAgICAgICAgICAgICAgICBDb21wYWN0UHJvdG9UZXN0U3RydWN0KGFfaTE2PTMyNzY4KSwgQ29tcGFjdFByb3RvVGVzdFN0cnVjdChhX2kxNj0tMzI3NjkpLAotICAgICAgICAgICAgICAgICAgQ29tcGFjdFByb3RvVGVzdFN0cnVjdChhX2kzMj0yMTQ3NDgzNjQ4KSwgQ29tcGFjdFByb3RvVGVzdFN0cnVjdChhX2kzMj0tMjE0NzQ4MzY0OSksCi0gICAgICAgICAgICAgICAgICBDb21wYWN0UHJvdG9UZXN0U3RydWN0KGFfaTY0PTkyMjMzNzIwMzY4NTQ3NzU4MDgpLCBDb21wYWN0UHJvdG9UZXN0U3RydWN0KGFfaTY0PS05MjIzMzcyMDM2ODU0Nzc1ODA5KQorICAgICAgICBzZWxmLm5lc3RlZF9saXN0c19pMzJ4MyA9IE5lc3RlZExpc3RzSTMyeDMoCisgICAgICAgICAgICBbCisgICAgICAgICAgICAgICAgWworICAgICAgICAgICAgICAgICAgICBbMiwgNywgOV0sCisgICAgICAgICAgICAgICAgICAgIFszLCA1LCA4XQorICAgICAgICAgICAgICAgIF0sCisgICAgICAgICAgICAgICAgWworICAgICAgICAgICAgICAgICAgICBbMSwgMSwgMl0sCisgICAgICAgICAgICAgICAgICAgIFsxLCA0LCA5XQogICAgICAgICAgICAgICAgIF0KKyAgICAgICAgICAgIF0KKyAgICAgICAgKQogCi0gICAgZm9yIHZhbHVlIGluIGJhZF92YWx1ZXM6Ci0gICAgICBzZWxmLmFzc2VydFJhaXNlcyhFeGNlcHRpb24sIHNlbGYuX3NlcmlhbGl6ZSwgdmFsdWUpCisgICAgICAgIHNlbGYubmVzdGVkX21peGVkeDIgPSBOZXN0ZWRNaXhlZHgyKGludF9zZXRfbGlzdD1bCisgICAgICAgICAgICBzZXQoWzEsIDIsIDNdKSwKKyAgICAgICAgICAgIHNldChbMSwgNCwgOV0pLAorICAgICAgICAgICAgc2V0KFsxLCAyLCAzLCA1LCA4LCAxMywgMjFdKSwKKyAgICAgICAgICAgIHNldChbLTEsIDAsIDFdKQorICAgICAgICBdLAorICAgICAgICAgICAgIyBub3RlLCB0aGUgc2V0cyBiZWxvdyBhcmUgc2V0cyBvZiBjaGFycywgc2luY2UgdGhlIHN0cmluZ3MgYXJlIGl0ZXJhdGVkCisgICAgICAgICAgICBtYXBfaW50X3N0cnNldD17MTA6IHNldCgnYWJjJyksIDIwOiBzZXQoJ2RlZicpLCAzMDogc2V0KCdHSEknKX0sCisgICAgICAgICAgICBtYXBfaW50X3N0cnNldF9saXN0PVsKKyAgICAgICAgICAgICAgICB7MTA6IHNldCgnYWJjJyksIDIwOiBzZXQoJ2RlZicpLCAzMDogc2V0KCdHSEknKX0sCisgICAgICAgICAgICAgICAgezEwMDogc2V0KCdsbW4nKSwgMjAwOiBzZXQoJ29wcScpLCAzMDA6IHNldCgnUlNUJyl9LAorICAgICAgICAgICAgICAgIHsxMDAwOiBzZXQoJ3V2dycpLCAyMDAwOiBzZXQoJ3d4eScpLCAzMDAwOiBzZXQoJ1hZWicpfV0KKyAgICAgICAgKQorCisgICAgICAgIHNlbGYubmVzdGVkX2xpc3RzX2JvbmsgPSBOZXN0ZWRMaXN0c0JvbmsoCisgICAgICAgICAgICBbCisgICAgICAgICAgICAgICAgWworICAgICAgICAgICAgICAgICAgICBbCisgICAgICAgICAgICAgICAgICAgICAgICBCb25rKG1lc3NhZ2U9J2lubmVyIEEgZmlyc3QnLCB0eXBlPTEpLAorICAgICAgICAgICAgICAgICAgICAgICAgQm9uayhtZXNzYWdlPSdpbm5lciBBIHNlY29uZCcsIHR5cGU9MSkKKyAgICAgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgICAgICAgWworICAgICAgICAgICAgICAgICAgICAgICAgQm9uayhtZXNzYWdlPSdpbm5lciBCIGZpcnN0JywgdHlwZT0yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvbmsobWVzc2FnZT0naW5uZXIgQiBzZWNvbmQnLCB0eXBlPTIpCisgICAgICAgICAgICAgICAgICAgIF0KKyAgICAgICAgICAgICAgICBdCisgICAgICAgICAgICBdCisgICAgICAgICkKKworICAgICAgICBzZWxmLmxpc3RfYm9ua3MgPSBMaXN0Qm9ua3MoCisgICAgICAgICAgICBbCisgICAgICAgICAgICAgICAgQm9uayhtZXNzYWdlPSdpbm5lciBBJywgdHlwZT0xKSwKKyAgICAgICAgICAgICAgICBCb25rKG1lc3NhZ2U9J2lubmVyIEInLCB0eXBlPTIpLAorICAgICAgICAgICAgICAgIEJvbmsobWVzc2FnZT0naW5uZXIgQycsIHR5cGU9MCkKKyAgICAgICAgICAgIF0KKyAgICAgICAgKQorCisgICAgZGVmIF9zZXJpYWxpemUoc2VsZiwgb2JqKToKKyAgICAgICAgdHJhbnMgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoKQorICAgICAgICBwcm90ID0gc2VsZi5wcm90b2NvbF9mYWN0b3J5LmdldFByb3RvY29sKHRyYW5zKQorICAgICAgICBvYmoud3JpdGUocHJvdCkKKyAgICAgICAgcmV0dXJuIHRyYW5zLmdldHZhbHVlKCkKKworICAgIGRlZiBfZGVzZXJpYWxpemUoc2VsZiwgb2JqdHlwZSwgZGF0YSk6CisgICAgICAgIHByb3QgPSBzZWxmLnByb3RvY29sX2ZhY3RvcnkuZ2V0UHJvdG9jb2woVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKGRhdGEpKQorICAgICAgICByZXQgPSBvYmp0eXBlKCkKKyAgICAgICAgcmV0LnJlYWQocHJvdCkKKyAgICAgICAgcmV0dXJuIHJldAorCisgICAgZGVmIHRlc3RGb3J3YXJkcyhzZWxmKToKKyAgICAgICAgb2JqID0gc2VsZi5fZGVzZXJpYWxpemUoVmVyc2lvbmluZ1Rlc3RWMiwgc2VsZi5fc2VyaWFsaXplKHNlbGYudjFvYmopKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhvYmouYmVnaW5faW5fYm90aCwgc2VsZi52MW9iai5iZWdpbl9pbl9ib3RoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhvYmouZW5kX2luX2JvdGgsIHNlbGYudjFvYmouZW5kX2luX2JvdGgpCisKKyAgICBkZWYgdGVzdEJhY2t3YXJkcyhzZWxmKToKKyAgICAgICAgb2JqID0gc2VsZi5fZGVzZXJpYWxpemUoVmVyc2lvbmluZ1Rlc3RWMSwgc2VsZi5fc2VyaWFsaXplKHNlbGYudjJvYmopKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhvYmouYmVnaW5faW5fYm90aCwgc2VsZi52Mm9iai5iZWdpbl9pbl9ib3RoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhvYmouZW5kX2luX2JvdGgsIHNlbGYudjJvYmouZW5kX2luX2JvdGgpCisKKyAgICBkZWYgdGVzdFNlcmlhbGl6ZVYxKHNlbGYpOgorICAgICAgICBvYmogPSBzZWxmLl9kZXNlcmlhbGl6ZShWZXJzaW9uaW5nVGVzdFYxLCBzZWxmLl9zZXJpYWxpemUoc2VsZi52MW9iaikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iaiwgc2VsZi52MW9iaikKKworICAgIGRlZiB0ZXN0U2VyaWFsaXplVjIoc2VsZik6CisgICAgICAgIG9iaiA9IHNlbGYuX2Rlc2VyaWFsaXplKFZlcnNpb25pbmdUZXN0VjIsIHNlbGYuX3NlcmlhbGl6ZShzZWxmLnYyb2JqKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMob2JqLCBzZWxmLnYyb2JqKQorCisgICAgZGVmIHRlc3RCb29scyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbHMoc2VsZi5ib29scywgc2VsZi5ib29sc19mbGlwcGVkKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFscyhzZWxmLmJvb2xzLCBzZWxmLnYxb2JqKQorICAgICAgICBvYmogPSBzZWxmLl9kZXNlcmlhbGl6ZShCb29scywgc2VsZi5fc2VyaWFsaXplKHNlbGYuYm9vbHMpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhvYmosIHNlbGYuYm9vbHMpCisgICAgICAgIG9iaiA9IHNlbGYuX2Rlc2VyaWFsaXplKEJvb2xzLCBzZWxmLl9zZXJpYWxpemUoc2VsZi5ib29sc19mbGlwcGVkKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMob2JqLCBzZWxmLmJvb2xzX2ZsaXBwZWQpCisgICAgICAgIHJlcCA9IHJlcHIoc2VsZi5ib29scykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihyZXApID4gMCkKKworICAgIGRlZiB0ZXN0TGFyZ2VEZWx0YXMoc2VsZik6CisgICAgICAgICMgdGVzdCBsYXJnZSBmaWVsZCBkZWx0YXMgKG1lYW5pbmdmdWwgaW4gQ29tcGFjdFByb3RvIG9ubHkpCisgICAgICAgIG9iaiA9IHNlbGYuX2Rlc2VyaWFsaXplKExhcmdlRGVsdGFzLCBzZWxmLl9zZXJpYWxpemUoc2VsZi5sYXJnZV9kZWx0YXMpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhvYmosIHNlbGYubGFyZ2VfZGVsdGFzKQorICAgICAgICByZXAgPSByZXByKHNlbGYubGFyZ2VfZGVsdGFzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKHJlcCkgPiAwKQorCisgICAgZGVmIHRlc3ROZXN0ZWRMaXN0c0kzMngyKHNlbGYpOgorICAgICAgICBvYmogPSBzZWxmLl9kZXNlcmlhbGl6ZShOZXN0ZWRMaXN0c0kzMngyLCBzZWxmLl9zZXJpYWxpemUoc2VsZi5uZXN0ZWRfbGlzdHNfaTMyeDIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhvYmosIHNlbGYubmVzdGVkX2xpc3RzX2kzMngyKQorICAgICAgICByZXAgPSByZXByKHNlbGYubmVzdGVkX2xpc3RzX2kzMngyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKHJlcCkgPiAwKQorCisgICAgZGVmIHRlc3ROZXN0ZWRMaXN0c0kzMngzKHNlbGYpOgorICAgICAgICBvYmogPSBzZWxmLl9kZXNlcmlhbGl6ZShOZXN0ZWRMaXN0c0kzMngzLCBzZWxmLl9zZXJpYWxpemUoc2VsZi5uZXN0ZWRfbGlzdHNfaTMyeDMpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhvYmosIHNlbGYubmVzdGVkX2xpc3RzX2kzMngzKQorICAgICAgICByZXAgPSByZXByKHNlbGYubmVzdGVkX2xpc3RzX2kzMngzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKHJlcCkgPiAwKQorCisgICAgZGVmIHRlc3ROZXN0ZWRNaXhlZHgyKHNlbGYpOgorICAgICAgICBvYmogPSBzZWxmLl9kZXNlcmlhbGl6ZShOZXN0ZWRNaXhlZHgyLCBzZWxmLl9zZXJpYWxpemUoc2VsZi5uZXN0ZWRfbWl4ZWR4MikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iaiwgc2VsZi5uZXN0ZWRfbWl4ZWR4MikKKyAgICAgICAgcmVwID0gcmVwcihzZWxmLm5lc3RlZF9taXhlZHgyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKHJlcCkgPiAwKQorCisgICAgZGVmIHRlc3ROZXN0ZWRMaXN0c0Jvbmsoc2VsZik6CisgICAgICAgIG9iaiA9IHNlbGYuX2Rlc2VyaWFsaXplKE5lc3RlZExpc3RzQm9uaywgc2VsZi5fc2VyaWFsaXplKHNlbGYubmVzdGVkX2xpc3RzX2JvbmspKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhvYmosIHNlbGYubmVzdGVkX2xpc3RzX2JvbmspCisgICAgICAgIHJlcCA9IHJlcHIoc2VsZi5uZXN0ZWRfbGlzdHNfYm9uaykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihyZXApID4gMCkKKworICAgIGRlZiB0ZXN0TGlzdEJvbmtzKHNlbGYpOgorICAgICAgICBvYmogPSBzZWxmLl9kZXNlcmlhbGl6ZShMaXN0Qm9ua3MsIHNlbGYuX3NlcmlhbGl6ZShzZWxmLmxpc3RfYm9ua3MpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhvYmosIHNlbGYubGlzdF9ib25rcykKKyAgICAgICAgcmVwID0gcmVwcihzZWxmLmxpc3RfYm9ua3MpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4ocmVwKSA+IDApCisKKyAgICBkZWYgdGVzdENvbXBhY3RTdHJ1Y3Qoc2VsZik6CisgICAgICAgICMgdGVzdCBsYXJnZSBmaWVsZCBkZWx0YXMgKG1lYW5pbmdmdWwgaW4gQ29tcGFjdFByb3RvIG9ubHkpCisgICAgICAgIG9iaiA9IHNlbGYuX2Rlc2VyaWFsaXplKENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QsIHNlbGYuX3NlcmlhbGl6ZShzZWxmLmNvbXBhY3Rfc3RydWN0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMob2JqLCBzZWxmLmNvbXBhY3Rfc3RydWN0KQorICAgICAgICByZXAgPSByZXByKHNlbGYuY29tcGFjdF9zdHJ1Y3QpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4ocmVwKSA+IDApCisKKyAgICBkZWYgdGVzdEludGVnZXJMaW1pdHMoc2VsZik6CisgICAgICAgIGlmIChzeXMudmVyc2lvbl9pbmZvWzBdID09IDIgYW5kIHN5cy52ZXJzaW9uX2luZm9bMV0gPD0gNik6CisgICAgICAgICAgICBwcmludCgnU2tpcHBpbmcgdGVzdEludGVnZXJMaW1pdHMgZm9yIFB5dGhvbiAyLjYnKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGJhZF92YWx1ZXMgPSBbQ29tcGFjdFByb3RvVGVzdFN0cnVjdChhX2J5dGU9MTI4KSwgQ29tcGFjdFByb3RvVGVzdFN0cnVjdChhX2J5dGU9LTEyOSksCisgICAgICAgICAgICAgICAgICAgICAgQ29tcGFjdFByb3RvVGVzdFN0cnVjdChhX2kxNj0zMjc2OCksIENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QoYV9pMTY9LTMyNzY5KSwKKyAgICAgICAgICAgICAgICAgICAgICBDb21wYWN0UHJvdG9UZXN0U3RydWN0KGFfaTMyPTIxNDc0ODM2NDgpLCBDb21wYWN0UHJvdG9UZXN0U3RydWN0KGFfaTMyPS0yMTQ3NDgzNjQ5KSwKKyAgICAgICAgICAgICAgICAgICAgICBDb21wYWN0UHJvdG9UZXN0U3RydWN0KGFfaTY0PTkyMjMzNzIwMzY4NTQ3NzU4MDgpLCBDb21wYWN0UHJvdG9UZXN0U3RydWN0KGFfaTY0PS05MjIzMzcyMDM2ODU0Nzc1ODA5KQorICAgICAgICAgICAgICAgICAgICAgIF0KKworICAgICAgICBmb3IgdmFsdWUgaW4gYmFkX3ZhbHVlczoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEV4Y2VwdGlvbiwgc2VsZi5fc2VyaWFsaXplLCB2YWx1ZSkKKworICAgIGRlZiB0ZXN0UmVjVHJlZShzZWxmKToKKyAgICAgICAgIiIiRW5zdXJlIHJlY3Vyc2l2ZSB0cmVlIG5vZGUgY2FuIGJlIGNyZWF0ZWQuIiIiCisgICAgICAgIGNoaWxkcmVuID0gW10KKyAgICAgICAgZm9yIGlkeCBpbiByYW5nZSgxLCA1KToKKyAgICAgICAgICAgIG5vZGUgPSBSZWNUcmVlKGl0ZW09aWR4LCBjaGlsZHJlbj1Ob25lKQorICAgICAgICAgICAgY2hpbGRyZW4uYXBwZW5kKG5vZGUpCisKKyAgICAgICAgcGFyZW50ID0gUmVjVHJlZShpdGVtPTAsIGNoaWxkcmVuPWNoaWxkcmVuKQorICAgICAgICBzZXJkZV9wYXJlbnQgPSBzZWxmLl9kZXNlcmlhbGl6ZShSZWNUcmVlLCBzZWxmLl9zZXJpYWxpemUocGFyZW50KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoMCwgc2VyZGVfcGFyZW50Lml0ZW0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDQsIGxlbihzZXJkZV9wYXJlbnQuY2hpbGRyZW4pKQorICAgICAgICBmb3IgY2hpbGQgaW4gc2VyZGVfcGFyZW50LmNoaWxkcmVuOgorICAgICAgICAgICAgIyBDYW5ub3QgdXNlIGFzc2VydElzSW5zdGFuY2UgaW4gcHl0aG9uIDIuNj8KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKGNoaWxkLCBSZWNUcmVlKSkKKworICAgIGRlZiBfYnVpbGRMaW5rZWRMaXN0KHNlbGYpOgorICAgICAgICBoZWFkID0gY3VyID0gUmVjTGlzdChpdGVtPTApCisgICAgICAgIGZvciBpZHggaW4gcmFuZ2UoMSwgNSk6CisgICAgICAgICAgICBub2RlID0gUmVjTGlzdChpdGVtPWlkeCkKKyAgICAgICAgICAgIGN1ci5uZXh0aXRlbSA9IG5vZGUKKyAgICAgICAgICAgIGN1ciA9IG5vZGUKKyAgICAgICAgcmV0dXJuIGhlYWQKKworICAgIGRlZiBfY29sbGFwc2VMaW5rZWRMaXN0KHNlbGYsIGhlYWQpOgorICAgICAgICBvdXRfbGlzdCA9IFtdCisgICAgICAgIGN1ciA9IGhlYWQKKyAgICAgICAgd2hpbGUgY3VyIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgb3V0X2xpc3QuYXBwZW5kKGN1ci5pdGVtKQorICAgICAgICAgICAgY3VyID0gY3VyLm5leHRpdGVtCisgICAgICAgIHJldHVybiBvdXRfbGlzdAorCisgICAgZGVmIHRlc3RSZWNMaXN0KHNlbGYpOgorICAgICAgICAiIiJFbnN1cmUgcmVjdXJzaXZlIGxpbmtlZCBsaXN0IGNhbiBiZSBjcmVhdGVkLiIiIgorICAgICAgICByZWNfbGlzdCA9IHNlbGYuX2J1aWxkTGlua2VkTGlzdCgpCisgICAgICAgIHNlcmRlX2xpc3QgPSBzZWxmLl9kZXNlcmlhbGl6ZShSZWNMaXN0LCBzZWxmLl9zZXJpYWxpemUocmVjX2xpc3QpKQorICAgICAgICBvdXRfbGlzdCA9IHNlbGYuX2NvbGxhcHNlTGlua2VkTGlzdChzZXJkZV9saXN0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhbMCwgMSwgMiwgMywgNF0sIG91dF9saXN0KQorCisgICAgZGVmIHRlc3RDb1JlYyhzZWxmKToKKyAgICAgICAgIiIiRW5zdXJlIGNvLXJlY3Vyc2l2ZSBzdHJ1Y3R1cmVzIGNhbiBiZSBjcmVhdGVkLiIiIgorICAgICAgICBpdGVtMSA9IENvUmVjKCkKKyAgICAgICAgaXRlbTIgPSBDb1JlYzIoKQorCisgICAgICAgIGl0ZW0xLm90aGVyID0gaXRlbTIKKyAgICAgICAgaXRlbTIub3RoZXIgPSBpdGVtMQorCisgICAgICAgICMgTk9URSBbZWNvbm5lcjcyNCwyMDE3LTA2LTIxXTogVGhlc2Ugb2JqZWN0cyBjYW5ub3QgYmUgc2VyaWFsaXplZCBhcyBzZXJpYWxpemF0aW9uCisgICAgICAgICMgcmVzdWx0cyBpbiBhbiBpbmZpbml0ZSBsb29wLiBmYnRocmlmdCBhbHNvIHN1ZmZlcnMgZnJvbSB0aGlzCisgICAgICAgICMgcHJvYmxlbS4KKworICAgIGRlZiB0ZXN0UmVjVmVjdG9yKHNlbGYpOgorICAgICAgICAiIiJFbnN1cmUgYSBsaXN0IG9mIHJlY3Vyc2l2ZSBub2RlcyBjYW4gYmUgY3JlYXRlZC4iIiIKKyAgICAgICAgbXlsaXN0ID0gW3NlbGYuX2J1aWxkTGlua2VkTGlzdCgpLCBzZWxmLl9idWlsZExpbmtlZExpc3QoKV0KKyAgICAgICAgbXl2ZWMgPSBWZWN0b3JUZXN0KGxpc3Rlcj1teWxpc3QpCisKKyAgICAgICAgc2VyZGVfdmVjID0gc2VsZi5fZGVzZXJpYWxpemUoVmVjdG9yVGVzdCwgc2VsZi5fc2VyaWFsaXplKG15dmVjKSkKKyAgICAgICAgZ29sZGVuX2xpc3QgPSBbMCwgMSwgMiwgMywgNF0KKyAgICAgICAgZm9yIGN1cl9saXN0IGluIHNlcmRlX3ZlYy5saXN0ZXI6CisgICAgICAgICAgICBvdXRfbGlzdCA9IHNlbGYuX2NvbGxhcHNlTGlua2VkTGlzdChjdXJfbGlzdCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ29sZGVuX2xpc3QsIG91dF9saXN0KQorCiAKIGNsYXNzIE5vcm1hbEJpbmFyeVRlc3QoQWJzdHJhY3RUZXN0KToKLSAgcHJvdG9jb2xfZmFjdG9yeSA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkKKyAgICBwcm90b2NvbF9mYWN0b3J5ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKQorCiAKIGNsYXNzIEFjY2VsZXJhdGVkQmluYXJ5VGVzdChBYnN0cmFjdFRlc3QpOgotICBwcm90b2NvbF9mYWN0b3J5ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeSgpCisgICAgcHJvdG9jb2xfZmFjdG9yeSA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3RvcnkoZmFsbGJhY2s9RmFsc2UpCisKIAogY2xhc3MgQ29tcGFjdFByb3RvY29sVGVzdChBYnN0cmFjdFRlc3QpOgotICBwcm90b2NvbF9mYWN0b3J5ID0gVENvbXBhY3RQcm90b2NvbC5UQ29tcGFjdFByb3RvY29sRmFjdG9yeSgpCisgICAgcHJvdG9jb2xfZmFjdG9yeSA9IFRDb21wYWN0UHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbEZhY3RvcnkoKQorCisKK2NsYXNzIEFjY2VsZXJhdGVkQ29tcGFjdFRlc3QoQWJzdHJhY3RUZXN0KToKKyAgICBwcm90b2NvbF9mYWN0b3J5ID0gVENvbXBhY3RQcm90b2NvbC5UQ29tcGFjdFByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5KGZhbGxiYWNrPUZhbHNlKQorCiAKIGNsYXNzIEpTT05Qcm90b2NvbFRlc3QoQWJzdHJhY3RUZXN0KToKLSAgcHJvdG9jb2xfZmFjdG9yeSA9IFRKU09OUHJvdG9jb2wuVEpTT05Qcm90b2NvbEZhY3RvcnkoKQorICAgIHByb3RvY29sX2ZhY3RvcnkgPSBUSlNPTlByb3RvY29sLlRKU09OUHJvdG9jb2xGYWN0b3J5KCkKKwogCiBjbGFzcyBBY2NlbGVyYXRlZEZyYW1lZFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgotICBkZWYgdGVzdFNwbGl0KHNlbGYpOgotICAgICIiIlRlc3QgRnJhbWVkVHJhbnNwb3J0IGFuZCBCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkCisgICAgZGVmIHRlc3RTcGxpdChzZWxmKToKKyAgICAgICAgIiIiVGVzdCBGcmFtZWRUcmFuc3BvcnQgYW5kIEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQKIAotICAgIFRlc3RzIHRoYXQgVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQgYW5kIFRGcmFtZWRUcmFuc3BvcnQKLSAgICBwbGF5IG5pY2VseSB0b2dldGhlciB3aGVuIGEgcmVhZCBzcGFucyBhIGZyYW1lIiIiCisgICAgICAgIFRlc3RzIHRoYXQgVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQgYW5kIFRGcmFtZWRUcmFuc3BvcnQKKyAgICAgICAgcGxheSBuaWNlbHkgdG9nZXRoZXIgd2hlbiBhIHJlYWQgc3BhbnMgYSBmcmFtZSIiIgogCi0gICAgcHJvdG9jb2xfZmFjdG9yeSA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3RvcnkoKQotICAgIGJpZ3N0cmluZyA9ICIiLmpvaW4oY2hyKGJ5dGUpIGZvciBieXRlIGluIHJhbmdlKG9yZCgiYSIpLCBvcmQoInoiKSsxKSkKKyAgICAgICAgcHJvdG9jb2xfZmFjdG9yeSA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3RvcnkoKQorICAgICAgICBiaWdzdHJpbmcgPSAiIi5qb2luKGNocihieXRlKSBmb3IgYnl0ZSBpbiByYW5nZShvcmQoImEiKSwgb3JkKCJ6IikgKyAxKSkKIAotICAgIGRhdGFidWYgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoKQotICAgIHByb3QgPSBwcm90b2NvbF9mYWN0b3J5LmdldFByb3RvY29sKGRhdGFidWYpCi0gICAgcHJvdC53cml0ZUkzMig0MikKLSAgICBwcm90LndyaXRlU3RyaW5nKGJpZ3N0cmluZykKLSAgICBwcm90LndyaXRlSTE2KDI0KQotICAgIGRhdGEgPSBkYXRhYnVmLmdldHZhbHVlKCkKLSAgICBjdXRwb2ludCA9IGxlbihkYXRhKS8yCi0gICAgcGFydHMgPSBbIGRhdGFbOmN1dHBvaW50XSwgZGF0YVtjdXRwb2ludDpdIF0KKyAgICAgICAgZGF0YWJ1ZiA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcigpCisgICAgICAgIHByb3QgPSBwcm90b2NvbF9mYWN0b3J5LmdldFByb3RvY29sKGRhdGFidWYpCisgICAgICAgIHByb3Qud3JpdGVJMzIoNDIpCisgICAgICAgIHByb3Qud3JpdGVTdHJpbmcoYmlnc3RyaW5nKQorICAgICAgICBwcm90LndyaXRlSTE2KDI0KQorICAgICAgICBkYXRhID0gZGF0YWJ1Zi5nZXR2YWx1ZSgpCisgICAgICAgIGN1dHBvaW50ID0gbGVuKGRhdGEpIC8vIDIKKyAgICAgICAgcGFydHMgPSBbZGF0YVs6Y3V0cG9pbnRdLCBkYXRhW2N1dHBvaW50Ol1dCiAKLSAgICBmcmFtZWRfYnVmZmVyID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKCkKLSAgICBmcmFtZWRfd3JpdGVyID0gVFRyYW5zcG9ydC5URnJhbWVkVHJhbnNwb3J0KGZyYW1lZF9idWZmZXIpCi0gICAgZm9yIHBhcnQgaW4gcGFydHM6Ci0gICAgICBmcmFtZWRfd3JpdGVyLndyaXRlKHBhcnQpCi0gICAgICBmcmFtZWRfd3JpdGVyLmZsdXNoKCkKLSAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4oZnJhbWVkX2J1ZmZlci5nZXR2YWx1ZSgpKSwgbGVuKGRhdGEpICsgOCkKKyAgICAgICAgZnJhbWVkX2J1ZmZlciA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcigpCisgICAgICAgIGZyYW1lZF93cml0ZXIgPSBUVHJhbnNwb3J0LlRGcmFtZWRUcmFuc3BvcnQoZnJhbWVkX2J1ZmZlcikKKyAgICAgICAgZm9yIHBhcnQgaW4gcGFydHM6CisgICAgICAgICAgICBmcmFtZWRfd3JpdGVyLndyaXRlKHBhcnQpCisgICAgICAgICAgICBmcmFtZWRfd3JpdGVyLmZsdXNoKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGZyYW1lZF9idWZmZXIuZ2V0dmFsdWUoKSksIGxlbihkYXRhKSArIDgpCiAKLSAgICAjIFJlY3JlYXRlIGZyYW1lZF9idWZmZXIgc28gd2UgY2FuIHJlYWQgZnJvbSBpdC4KLSAgICBmcmFtZWRfYnVmZmVyID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKGZyYW1lZF9idWZmZXIuZ2V0dmFsdWUoKSkKLSAgICBmcmFtZWRfcmVhZGVyID0gVFRyYW5zcG9ydC5URnJhbWVkVHJhbnNwb3J0KGZyYW1lZF9idWZmZXIpCi0gICAgcHJvdCA9IHByb3RvY29sX2ZhY3RvcnkuZ2V0UHJvdG9jb2woZnJhbWVkX3JlYWRlcikKLSAgICBzZWxmLmFzc2VydEVxdWFsKHByb3QucmVhZEkzMigpLCA0MikKLSAgICBzZWxmLmFzc2VydEVxdWFsKHByb3QucmVhZFN0cmluZygpLCBiaWdzdHJpbmcpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChwcm90LnJlYWRJMTYoKSwgMjQpCisgICAgICAgICMgUmVjcmVhdGUgZnJhbWVkX2J1ZmZlciBzbyB3ZSBjYW4gcmVhZCBmcm9tIGl0LgorICAgICAgICBmcmFtZWRfYnVmZmVyID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKGZyYW1lZF9idWZmZXIuZ2V0dmFsdWUoKSkKKyAgICAgICAgZnJhbWVkX3JlYWRlciA9IFRUcmFuc3BvcnQuVEZyYW1lZFRyYW5zcG9ydChmcmFtZWRfYnVmZmVyKQorICAgICAgICBwcm90ID0gcHJvdG9jb2xfZmFjdG9yeS5nZXRQcm90b2NvbChmcmFtZWRfcmVhZGVyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHByb3QucmVhZEkzMigpLCA0MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwcm90LnJlYWRTdHJpbmcoKSwgYmlnc3RyaW5nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHByb3QucmVhZEkxNigpLCAyNCkKKwogCiBjbGFzcyBTZXJpYWxpemVyc1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogCi0gIGRlZiB0ZXN0U2VyaWFsaXplVGhlbkRlc2VyaWFsaXplKHNlbGYpOgotICAgIG9iaiA9IFh0cnVjdDIoaTMyX3RoaW5nPTEsCi0gICAgICAgICAgICAgICAgICBzdHJ1Y3RfdGhpbmc9WHRydWN0KHN0cmluZ190aGluZz0iZm9vIikpCisgICAgZGVmIHRlc3RTZXJpYWxpemVUaGVuRGVzZXJpYWxpemUoc2VsZik6CisgICAgICAgIG9iaiA9IFh0cnVjdDIoaTMyX3RoaW5nPTEsCisgICAgICAgICAgICAgICAgICAgICAgc3RydWN0X3RoaW5nPVh0cnVjdChzdHJpbmdfdGhpbmc9ImZvbyIpKQogCi0gICAgczEgPSBzZXJpYWxpemUob2JqKQotICAgIGZvciBpIGluIHJhbmdlKDEwKToKLSAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHMxLCBzZXJpYWxpemUob2JqKSkKLSAgICAgIG9iamNvcHkgPSBYdHJ1Y3QyKCkKLSAgICAgIGRlc2VyaWFsaXplKG9iamNvcHksIHNlcmlhbGl6ZShvYmopKQotICAgICAgc2VsZi5hc3NlcnRFcXVhbHMob2JqLCBvYmpjb3B5KQorICAgICAgICBzMSA9IHNlcmlhbGl6ZShvYmopCisgICAgICAgIGZvciBpIGluIHJhbmdlKDEwKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHMxLCBzZXJpYWxpemUob2JqKSkKKyAgICAgICAgICAgIG9iamNvcHkgPSBYdHJ1Y3QyKCkKKyAgICAgICAgICAgIGRlc2VyaWFsaXplKG9iamNvcHksIHNlcmlhbGl6ZShvYmopKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMob2JqLCBvYmpjb3B5KQogCi0gICAgb2JqID0gWHRydWN0KHN0cmluZ190aGluZz0iYmFyIikKLSAgICBvYmpjb3B5ID0gWHRydWN0KCkKLSAgICBkZXNlcmlhbGl6ZShvYmpjb3B5LCBzZXJpYWxpemUob2JqKSkKLSAgICBzZWxmLmFzc2VydEVxdWFscyhvYmosIG9iamNvcHkpCisgICAgICAgIG9iaiA9IFh0cnVjdChzdHJpbmdfdGhpbmc9ImJhciIpCisgICAgICAgIG9iamNvcHkgPSBYdHJ1Y3QoKQorICAgICAgICBkZXNlcmlhbGl6ZShvYmpjb3B5LCBzZXJpYWxpemUob2JqKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMob2JqLCBvYmpjb3B5KQogCi0gICAgIyB0ZXN0IGJvb2xlYW5zCi0gICAgb2JqID0gQm9vbHMoaW1fdHJ1ZT1UcnVlLCBpbV9mYWxzZT1GYWxzZSkKLSAgICBvYmpjb3B5ID0gQm9vbHMoKQotICAgIGRlc2VyaWFsaXplKG9iamNvcHksIHNlcmlhbGl6ZShvYmopKQotICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iaiwgb2JqY29weSkKLSAgICAKLSAgICAjIHRlc3QgZW51bXMKLSAgICBmb3IgbnVtLCBuYW1lIGluIE51bWJlcnouX1ZBTFVFU19UT19OQU1FUy5pdGVyaXRlbXMoKToKLSAgICAgIG9iaiA9IEJvbmsobWVzc2FnZT0nZW51bSBOdW1iZXJ6IHZhbHVlICVkIGlzIHN0cmluZyAlcycgJSAobnVtLCBuYW1lKSwgdHlwZT1udW0pCi0gICAgICBvYmpjb3B5ID0gQm9uaygpCi0gICAgICBkZXNlcmlhbGl6ZShvYmpjb3B5LCBzZXJpYWxpemUob2JqKSkKLSAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iaiwgb2JqY29weSkKLSAgCisgICAgICAgICMgdGVzdCBib29sZWFucworICAgICAgICBvYmogPSBCb29scyhpbV90cnVlPVRydWUsIGltX2ZhbHNlPUZhbHNlKQorICAgICAgICBvYmpjb3B5ID0gQm9vbHMoKQorICAgICAgICBkZXNlcmlhbGl6ZShvYmpjb3B5LCBzZXJpYWxpemUob2JqKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMob2JqLCBvYmpjb3B5KQorCisgICAgICAgICMgdGVzdCBlbnVtcworICAgICAgICBmb3IgbnVtLCBuYW1lIGluIE51bWJlcnouX1ZBTFVFU19UT19OQU1FUy5pdGVtcygpOgorICAgICAgICAgICAgb2JqID0gQm9uayhtZXNzYWdlPSdlbnVtIE51bWJlcnogdmFsdWUgJWQgaXMgc3RyaW5nICVzJyAlIChudW0sIG5hbWUpLCB0eXBlPW51bSkKKyAgICAgICAgICAgIG9iamNvcHkgPSBCb25rKCkKKyAgICAgICAgICAgIGRlc2VyaWFsaXplKG9iamNvcHksIHNlcmlhbGl6ZShvYmopKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMob2JqLCBvYmpjb3B5KQorCiAKIGRlZiBzdWl0ZSgpOgotICBzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpCi0gIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQorICAgIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKKyAgICBsb2FkZXIgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkKIAotICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoTm9ybWFsQmluYXJ5VGVzdCkpCi0gIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShBY2NlbGVyYXRlZEJpbmFyeVRlc3QpKQotICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoQ29tcGFjdFByb3RvY29sVGVzdCkpCi0gIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShKU09OUHJvdG9jb2xUZXN0KSkKLSAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKEFjY2VsZXJhdGVkRnJhbWVkVGVzdCkpCi0gIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShTZXJpYWxpemVyc1Rlc3QpKQotICByZXR1cm4gc3VpdGUKKyAgICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoTm9ybWFsQmluYXJ5VGVzdCkpCisgICAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKEFjY2VsZXJhdGVkQmluYXJ5VGVzdCkpCisgICAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKEFjY2VsZXJhdGVkQ29tcGFjdFRlc3QpKQorICAgIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShDb21wYWN0UHJvdG9jb2xUZXN0KSkKKyAgICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoSlNPTlByb3RvY29sVGVzdCkpCisgICAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKEFjY2VsZXJhdGVkRnJhbWVkVGVzdCkpCisgICAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKFNlcmlhbGl6ZXJzVGVzdCkpCisgICAgcmV0dXJuIHN1aXRlCisKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKLSAgdW5pdHRlc3QubWFpbihkZWZhdWx0VGVzdD0ic3VpdGUiLCB0ZXN0UnVubmVyPXVuaXR0ZXN0LlRleHRUZXN0UnVubmVyKHZlcmJvc2l0eT0yKSkKKyAgICB1bml0dGVzdC5tYWluKGRlZmF1bHRUZXN0PSJzdWl0ZSIsIHRlc3RSdW5uZXI9dW5pdHRlc3QuVGV4dFRlc3RSdW5uZXIodmVyYm9zaXR5PTIpKQpkaWZmIC0tZ2l0IGEvdGVzdC9weS9UU2ltcGxlSlNPTlByb3RvY29sVGVzdC5weSBiL3Rlc3QvcHkvVFNpbXBsZUpTT05Qcm90b2NvbFRlc3QucHkKaW5kZXggMDgwMjkzYS4uNzI5ODc2MCAxMDA2NDQKLS0tIGEvdGVzdC9weS9UU2ltcGxlSlNPTlByb3RvY29sVGVzdC5weQorKysgYi90ZXN0L3B5L1RTaW1wbGVKU09OUHJvdG9jb2xUZXN0LnB5CkBAIC0xOSwxNyArMTksNyBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotaW1wb3J0IHN5cwotaW1wb3J0IGdsb2IKLWZyb20gb3B0cGFyc2UgaW1wb3J0IE9wdGlvblBhcnNlcgotcGFyc2VyID0gT3B0aW9uUGFyc2VyKCkKLXBhcnNlci5hZGRfb3B0aW9uKCctLWdlbnB5ZGlyJywgdHlwZT0nc3RyaW5nJywgZGVzdD0nZ2VucHlkaXInLCBkZWZhdWx0PSdnZW4tcHknKQotb3B0aW9ucywgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKLWRlbCBzeXMuYXJndlsxOl0gIyBjbGVhbiB1cCBoYWNrIHNvIHVuaXR0ZXN0IGRvZXNuJ3QgY29tcGxhaW4KLXN5cy5wYXRoLmluc2VydCgwLCBvcHRpb25zLmdlbnB5ZGlyKQotc3lzLnBhdGguaW5zZXJ0KDAsIGdsb2IuZ2xvYignLi4vLi4vbGliL3B5L2J1aWxkL2xpYi4qJylbMF0pCi0KLWZyb20gVGhyaWZ0VGVzdC50dHlwZXMgaW1wb3J0ICoKK2Zyb20gVGhyaWZ0VGVzdC50dHlwZXMgaW1wb3J0IEJvbmssIFZlcnNpb25pbmdUZXN0VjEsIFZlcnNpb25pbmdUZXN0VjIKIGZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUSlNPTlByb3RvY29sCiBmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQKIApAQCAtMzgsODIgKzI4LDgxIEBACiAKIAogY2xhc3MgU2ltcGxlSlNPTlByb3RvY29sVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0gIHByb3RvY29sX2ZhY3RvcnkgPSBUSlNPTlByb3RvY29sLlRTaW1wbGVKU09OUHJvdG9jb2xGYWN0b3J5KCkKKyAgICBwcm90b2NvbF9mYWN0b3J5ID0gVEpTT05Qcm90b2NvbC5UU2ltcGxlSlNPTlByb3RvY29sRmFjdG9yeSgpCiAKLSAgZGVmIF9hc3NlcnREaWN0RXF1YWwoc2VsZiwgYSAsYiwgbXNnPU5vbmUpOgotICAgIGlmIGhhc2F0dHIoc2VsZiwgJ2Fzc2VydERpY3RFcXVhbCcpOgotICAgICAgIyBhc3NlcnREaWN0RXF1YWwgb25seSBpbiBQeXRob24gMi43LiBEZXBlbmRzIG9uIHlvdXIgbWFjaGluZS4KLSAgICAgIHNlbGYuYXNzZXJ0RGljdEVxdWFsKGEsIGIsIG1zZykKLSAgICAgIHJldHVybgotICAgIAotICAgICMgU3Vic3RpdHV0ZSBpbXBsZW1lbnRhdGlvbiBub3QgYXMgZ29vZCBhcyB1bml0dGVzdCBsaWJyYXJ5J3MKLSAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4oYSksIGxlbihiKSwgbXNnKQotICAgIGZvciBrLCB2IGluIGEuaXRlcml0ZW1zKCk6Ci0gICAgICBzZWxmLmFzc2VydFRydWUoayBpbiBiLCBtc2cpCi0gICAgICBzZWxmLmFzc2VydEVxdWFscyhiLmdldChrKSwgdiwgbXNnKQorICAgIGRlZiBfYXNzZXJ0RGljdEVxdWFsKHNlbGYsIGEsIGIsIG1zZz1Ob25lKToKKyAgICAgICAgaWYgaGFzYXR0cihzZWxmLCAnYXNzZXJ0RGljdEVxdWFsJyk6CisgICAgICAgICAgICAjIGFzc2VydERpY3RFcXVhbCBvbmx5IGluIFB5dGhvbiAyLjcuIERlcGVuZHMgb24geW91ciBtYWNoaW5lLgorICAgICAgICAgICAgc2VsZi5hc3NlcnREaWN0RXF1YWwoYSwgYiwgbXNnKQorICAgICAgICAgICAgcmV0dXJuCiAKLSAgZGVmIF9zZXJpYWxpemUoc2VsZiwgb2JqKToKLSAgICB0cmFucyA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcigpCi0gICAgcHJvdCA9IHNlbGYucHJvdG9jb2xfZmFjdG9yeS5nZXRQcm90b2NvbCh0cmFucykKLSAgICBvYmoud3JpdGUocHJvdCkKLSAgICByZXR1cm4gdHJhbnMuZ2V0dmFsdWUoKQorICAgICAgICAjIFN1YnN0aXR1dGUgaW1wbGVtZW50YXRpb24gbm90IGFzIGdvb2QgYXMgdW5pdHRlc3QgbGlicmFyeSdzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihhKSwgbGVuKGIpLCBtc2cpCisgICAgICAgIGZvciBrLCB2IGluIGEuaXRlcml0ZW1zKCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoayBpbiBiLCBtc2cpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhiLmdldChrKSwgdiwgbXNnKQogCi0gIGRlZiBfZGVzZXJpYWxpemUoc2VsZiwgb2JqdHlwZSwgZGF0YSk6Ci0gICAgcHJvdCA9IHNlbGYucHJvdG9jb2xfZmFjdG9yeS5nZXRQcm90b2NvbChUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoZGF0YSkpCi0gICAgcmV0ID0gb2JqdHlwZSgpCi0gICAgcmV0LnJlYWQocHJvdCkKLSAgICByZXR1cm4gcmV0CisgICAgZGVmIF9zZXJpYWxpemUoc2VsZiwgb2JqKToKKyAgICAgICAgdHJhbnMgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoKQorICAgICAgICBwcm90ID0gc2VsZi5wcm90b2NvbF9mYWN0b3J5LmdldFByb3RvY29sKHRyYW5zKQorICAgICAgICBvYmoud3JpdGUocHJvdCkKKyAgICAgICAgcmV0dXJuIHRyYW5zLmdldHZhbHVlKCkKIAotICBkZWYgdGVzdFdyaXRlT25seShzZWxmKToKLSAgICBzZWxmLmFzc2VydFJhaXNlcyhOb3RJbXBsZW1lbnRlZEVycm9yLAotICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2Rlc2VyaWFsaXplLCBWZXJzaW9uaW5nVGVzdFYxLCAne30nKQorICAgIGRlZiBfZGVzZXJpYWxpemUoc2VsZiwgb2JqdHlwZSwgZGF0YSk6CisgICAgICAgIHByb3QgPSBzZWxmLnByb3RvY29sX2ZhY3RvcnkuZ2V0UHJvdG9jb2woVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKGRhdGEpKQorICAgICAgICByZXQgPSBvYmp0eXBlKCkKKyAgICAgICAgcmV0LnJlYWQocHJvdCkKKyAgICAgICAgcmV0dXJuIHJldAogCi0gIGRlZiB0ZXN0U2ltcGxlTWVzc2FnZShzZWxmKToKLSAgICAgIHYxb2JqID0gVmVyc2lvbmluZ1Rlc3RWMSgKLSAgICAgICAgICBiZWdpbl9pbl9ib3RoPTEyMzQ1LAotICAgICAgICAgIG9sZF9zdHJpbmc9J2FhYScsCi0gICAgICAgICAgZW5kX2luX2JvdGg9NTQzMjEpCi0gICAgICBleHBlY3RlZCA9IGRpY3QoYmVnaW5faW5fYm90aD12MW9iai5iZWdpbl9pbl9ib3RoLAotICAgICAgICAgICAgICAgICAgICAgIG9sZF9zdHJpbmc9djFvYmoub2xkX3N0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICBlbmRfaW5fYm90aD12MW9iai5lbmRfaW5fYm90aCkKLSAgICAgIGFjdHVhbCA9IGpzb24ubG9hZHMoc2VsZi5fc2VyaWFsaXplKHYxb2JqKSkKKyAgICBkZWYgdGVzdFdyaXRlT25seShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoTm90SW1wbGVtZW50ZWRFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZGVzZXJpYWxpemUsIFZlcnNpb25pbmdUZXN0VjEsIGIne30nKQogCi0gICAgICBzZWxmLl9hc3NlcnREaWN0RXF1YWwoZXhwZWN0ZWQsIGFjdHVhbCkKLSAgICAgCi0gIGRlZiB0ZXN0Q29tcGxpY2F0ZWQoc2VsZik6Ci0gICAgICB2Mm9iaiA9IFZlcnNpb25pbmdUZXN0VjIoCi0gICAgICAgICAgYmVnaW5faW5fYm90aD0xMjM0NSwKLSAgICAgICAgICBuZXdpbnQ9MSwKLSAgICAgICAgICBuZXdieXRlPTIsCi0gICAgICAgICAgbmV3c2hvcnQ9MywKLSAgICAgICAgICBuZXdsb25nPTQsCi0gICAgICAgICAgbmV3ZG91YmxlPTUuMCwKLSAgICAgICAgICBuZXdzdHJ1Y3Q9Qm9uayhtZXNzYWdlPSJIZWxsbyEiLCB0eXBlPTEyMyksCi0gICAgICAgICAgbmV3bGlzdD1bNyw4LDldLAotICAgICAgICAgIG5ld3NldD1zZXQoWzQyLDEsOF0pLAotICAgICAgICAgIG5ld21hcD17MToyLDI6M30sCi0gICAgICAgICAgbmV3c3RyaW5nPSJIb2xhISIsCi0gICAgICAgICAgZW5kX2luX2JvdGg9NTQzMjEpCi0gICAgICBleHBlY3RlZCA9IGRpY3QoYmVnaW5faW5fYm90aD12Mm9iai5iZWdpbl9pbl9ib3RoLAotICAgICAgICAgICAgICAgICAgICAgIG5ld2ludD12Mm9iai5uZXdpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgbmV3Ynl0ZT12Mm9iai5uZXdieXRlLAotICAgICAgICAgICAgICAgICAgICAgIG5ld3Nob3J0PXYyb2JqLm5ld3Nob3J0LAotICAgICAgICAgICAgICAgICAgICAgIG5ld2xvbmc9djJvYmoubmV3bG9uZywKLSAgICAgICAgICAgICAgICAgICAgICBuZXdkb3VibGU9djJvYmoubmV3ZG91YmxlLAotICAgICAgICAgICAgICAgICAgICAgIG5ld3N0cnVjdD1kaWN0KG1lc3NhZ2U9djJvYmoubmV3c3RydWN0Lm1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT12Mm9iai5uZXdzdHJ1Y3QudHlwZSksCi0gICAgICAgICAgICAgICAgICAgICAgbmV3bGlzdD12Mm9iai5uZXdsaXN0LAotICAgICAgICAgICAgICAgICAgICAgIG5ld3NldD1saXN0KHYyb2JqLm5ld3NldCksCi0gICAgICAgICAgICAgICAgICAgICAgbmV3bWFwPXYyb2JqLm5ld21hcCwKLSAgICAgICAgICAgICAgICAgICAgICBuZXdzdHJpbmc9djJvYmoubmV3c3RyaW5nLAotICAgICAgICAgICAgICAgICAgICAgIGVuZF9pbl9ib3RoPXYyb2JqLmVuZF9pbl9ib3RoKQotICAgICAgCi0gICAgICAjIE5lZWQgdG8gbG9hZC9kdW1wIGJlY2F1c2UgbWFwIGtleXMgZ2V0IGVzY2FwZWQuCi0gICAgICBleHBlY3RlZCA9IGpzb24ubG9hZHMoanNvbi5kdW1wcyhleHBlY3RlZCkpCi0gICAgICBhY3R1YWwgPSBqc29uLmxvYWRzKHNlbGYuX3NlcmlhbGl6ZSh2Mm9iaikpCi0gICAgICBzZWxmLl9hc3NlcnREaWN0RXF1YWwoZXhwZWN0ZWQsIGFjdHVhbCkKKyAgICBkZWYgdGVzdFNpbXBsZU1lc3NhZ2Uoc2VsZik6CisgICAgICAgIHYxb2JqID0gVmVyc2lvbmluZ1Rlc3RWMSgKKyAgICAgICAgICAgIGJlZ2luX2luX2JvdGg9MTIzNDUsCisgICAgICAgICAgICBvbGRfc3RyaW5nPSdhYWEnLAorICAgICAgICAgICAgZW5kX2luX2JvdGg9NTQzMjEpCisgICAgICAgIGV4cGVjdGVkID0gZGljdChiZWdpbl9pbl9ib3RoPXYxb2JqLmJlZ2luX2luX2JvdGgsCisgICAgICAgICAgICAgICAgICAgICAgICBvbGRfc3RyaW5nPXYxb2JqLm9sZF9zdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBlbmRfaW5fYm90aD12MW9iai5lbmRfaW5fYm90aCkKKyAgICAgICAgYWN0dWFsID0ganNvbi5sb2FkcyhzZWxmLl9zZXJpYWxpemUodjFvYmopLmRlY29kZSgnYXNjaWknKSkKKworICAgICAgICBzZWxmLl9hc3NlcnREaWN0RXF1YWwoZXhwZWN0ZWQsIGFjdHVhbCkKKworICAgIGRlZiB0ZXN0Q29tcGxpY2F0ZWQoc2VsZik6CisgICAgICAgIHYyb2JqID0gVmVyc2lvbmluZ1Rlc3RWMigKKyAgICAgICAgICAgIGJlZ2luX2luX2JvdGg9MTIzNDUsCisgICAgICAgICAgICBuZXdpbnQ9MSwKKyAgICAgICAgICAgIG5ld2J5dGU9MiwKKyAgICAgICAgICAgIG5ld3Nob3J0PTMsCisgICAgICAgICAgICBuZXdsb25nPTQsCisgICAgICAgICAgICBuZXdkb3VibGU9NS4wLAorICAgICAgICAgICAgbmV3c3RydWN0PUJvbmsobWVzc2FnZT0iSGVsbG8hIiwgdHlwZT0xMjMpLAorICAgICAgICAgICAgbmV3bGlzdD1bNywgOCwgOV0sCisgICAgICAgICAgICBuZXdzZXQ9c2V0KFs0MiwgMSwgOF0pLAorICAgICAgICAgICAgbmV3bWFwPXsxOiAyLCAyOiAzfSwKKyAgICAgICAgICAgIG5ld3N0cmluZz0iSG9sYSEiLAorICAgICAgICAgICAgZW5kX2luX2JvdGg9NTQzMjEpCisgICAgICAgIGV4cGVjdGVkID0gZGljdChiZWdpbl9pbl9ib3RoPXYyb2JqLmJlZ2luX2luX2JvdGgsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdpbnQ9djJvYmoubmV3aW50LAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3Ynl0ZT12Mm9iai5uZXdieXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3c2hvcnQ9djJvYmoubmV3c2hvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdsb25nPXYyb2JqLm5ld2xvbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdkb3VibGU9djJvYmoubmV3ZG91YmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3c3RydWN0PWRpY3QobWVzc2FnZT12Mm9iai5uZXdzdHJ1Y3QubWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9djJvYmoubmV3c3RydWN0LnR5cGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3bGlzdD12Mm9iai5uZXdsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3c2V0PWxpc3QodjJvYmoubmV3c2V0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld21hcD12Mm9iai5uZXdtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdzdHJpbmc9djJvYmoubmV3c3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgZW5kX2luX2JvdGg9djJvYmouZW5kX2luX2JvdGgpCisKKyAgICAgICAgIyBOZWVkIHRvIGxvYWQvZHVtcCBiZWNhdXNlIG1hcCBrZXlzIGdldCBlc2NhcGVkLgorICAgICAgICBleHBlY3RlZCA9IGpzb24ubG9hZHMoanNvbi5kdW1wcyhleHBlY3RlZCkpCisgICAgICAgIGFjdHVhbCA9IGpzb24ubG9hZHMoc2VsZi5fc2VyaWFsaXplKHYyb2JqKS5kZWNvZGUoJ2FzY2lpJykpCisgICAgICAgIHNlbGYuX2Fzc2VydERpY3RFcXVhbChleHBlY3RlZCwgYWN0dWFsKQogCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0gIHVuaXR0ZXN0Lm1haW4oKQotCisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS90ZXN0L3B5L1Rlc3RDbGllbnQucHkgYi90ZXN0L3B5L1Rlc3RDbGllbnQucHkKaW5kZXggODdmZWRlNi4uZGRjY2U4ZCAxMDA3NTUKLS0tIGEvdGVzdC9weS9UZXN0Q2xpZW50LnB5CisrKyBiL3Rlc3QvcHkvVGVzdENsaWVudC5weQpAQCAtMSw1ICsxLDUgQEAKICMhL3Vzci9iaW4vZW52IHB5dGhvbgotCisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQogIwogIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCiAjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCkBAIC0xOSwyMjkgKzE5LDQyOCBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotaW1wb3J0IHN5cywgZ2xvYiwgb3MKLXN5cy5wYXRoLmluc2VydCgwLCBnbG9iLmdsb2Iob3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXyksJy4uLy4uL2xpYi9weS9idWlsZC9saWIuKicpKVswXSkKLQotaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKIGltcG9ydCB0aW1lCitpbXBvcnQgdW5pdHRlc3QKIGZyb20gb3B0cGFyc2UgaW1wb3J0IE9wdGlvblBhcnNlcgogCi1wYXJzZXIgPSBPcHRpb25QYXJzZXIoKQotcGFyc2VyLmFkZF9vcHRpb24oJy0tZ2VucHlkaXInLCB0eXBlPSdzdHJpbmcnLCBkZXN0PSdnZW5weWRpcicsCi0gICAgICAgICAgICAgICAgICBkZWZhdWx0PSdnZW4tcHknLAotICAgICAgICAgICAgICAgICAgaGVscD0naW5jbHVkZSB0aGlzIGxvY2FsIGRpcmVjdG9yeSBpbiBzeXMucGF0aCBmb3IgbG9jYXRpbmcgZ2VuZXJhdGVkIGNvZGUnKQotcGFyc2VyLmFkZF9vcHRpb24oIi0tcG9ydCIsIHR5cGU9ImludCIsIGRlc3Q9InBvcnQiLAotICAgIGhlbHA9ImNvbm5lY3QgdG8gc2VydmVyIGF0IHBvcnQiKQotcGFyc2VyLmFkZF9vcHRpb24oIi0taG9zdCIsIHR5cGU9InN0cmluZyIsIGRlc3Q9Imhvc3QiLAotICAgIGhlbHA9ImNvbm5lY3QgdG8gc2VydmVyIikKLXBhcnNlci5hZGRfb3B0aW9uKCItLXpsaWIiLCBhY3Rpb249InN0b3JlX3RydWUiLCBkZXN0PSJ6bGliIiwKLSAgICBoZWxwPSJ1c2UgemxpYiB3cmFwcGVyIGZvciBjb21wcmVzc2VkIHRyYW5zcG9ydCIpCi1wYXJzZXIuYWRkX29wdGlvbigiLS1zc2wiLCBhY3Rpb249InN0b3JlX3RydWUiLCBkZXN0PSJzc2wiLAotICAgIGhlbHA9InVzZSBTU0wgZm9yIGVuY3J5cHRlZCB0cmFuc3BvcnQiKQotcGFyc2VyLmFkZF9vcHRpb24oIi0taHR0cCIsIGRlc3Q9Imh0dHBfcGF0aCIsCi0gICAgaGVscD0iVXNlIHRoZSBIVFRQIHRyYW5zcG9ydCB3aXRoIHRoZSBzcGVjaWZpZWQgcGF0aCIpCi1wYXJzZXIuYWRkX29wdGlvbignLXYnLCAnLS12ZXJib3NlJywgYWN0aW9uPSJzdG9yZV9jb25zdCIsCi0gICAgZGVzdD0idmVyYm9zZSIsIGNvbnN0PTIsCi0gICAgaGVscD0idmVyYm9zZSBvdXRwdXQiKQotcGFyc2VyLmFkZF9vcHRpb24oJy1xJywgJy0tcXVpZXQnLCBhY3Rpb249InN0b3JlX2NvbnN0IiwKLSAgICBkZXN0PSJ2ZXJib3NlIiwgY29uc3Q9MCwKLSAgICBoZWxwPSJtaW5pbWFsIG91dHB1dCIpCi1wYXJzZXIuYWRkX29wdGlvbignLS1wcm90b2NvbCcsICBkZXN0PSJwcm90byIsIHR5cGU9InN0cmluZyIsCi0gICAgaGVscD0icHJvdG9jb2wgdG8gdXNlLCBvbmUgb2Y6IGFjY2VsLCBiaW5hcnksIGNvbXBhY3QsIGpzb24iKQotcGFyc2VyLmFkZF9vcHRpb24oJy0tdHJhbnNwb3J0JywgIGRlc3Q9InRyYW5zIiwgdHlwZT0ic3RyaW5nIiwKLSAgICBoZWxwPSJ0cmFuc3BvcnQgdG8gdXNlLCBvbmUgb2Y6IGJ1ZmZlcmVkLCBmcmFtZWQiKQotcGFyc2VyLnNldF9kZWZhdWx0cyhmcmFtZWQ9RmFsc2UsIGh0dHBfcGF0aD1Ob25lLCB2ZXJib3NlPTEsIGhvc3Q9J2xvY2FsaG9zdCcsIHBvcnQ9OTA5MCwgcHJvdG89J2JpbmFyeScpCi1vcHRpb25zLCBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQorZnJvbSB1dGlsIGltcG9ydCBsb2NhbF9saWJwYXRoCiAKLXNjcmlwdF9kaXIgPSBvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pCi1zeXMucGF0aC5pbnNlcnQoMCwgb3MucGF0aC5qb2luKHNjcmlwdF9kaXIsIG9wdGlvbnMuZ2VucHlkaXIpKQorU0NSSVBUX0RJUiA9IG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pKQogCi1mcm9tIFRocmlmdFRlc3QgaW1wb3J0IFRocmlmdFRlc3QsIFNlY29uZFNlcnZpY2UKLWZyb20gVGhyaWZ0VGVzdC50dHlwZXMgaW1wb3J0ICoKLWZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydAotZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUU29ja2V0Ci1mcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRIdHRwQ2xpZW50Ci1mcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRabGliVHJhbnNwb3J0Ci1mcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sCi1mcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVENvbXBhY3RQcm90b2NvbAotZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRKU09OUHJvdG9jb2wKIAogY2xhc3MgQWJzdHJhY3RUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKLSAgZGVmIHNldFVwKHNlbGYpOgotICAgIGlmIG9wdGlvbnMuaHR0cF9wYXRoOgotICAgICAgc2VsZi50cmFuc3BvcnQgPSBUSHR0cENsaWVudC5USHR0cENsaWVudChvcHRpb25zLmhvc3QsIHBvcnQ9b3B0aW9ucy5wb3J0LCBwYXRoPW9wdGlvbnMuaHR0cF9wYXRoKQotICAgIGVsc2U6Ci0gICAgICBpZiBvcHRpb25zLnNzbDoKLSAgICAgICAgZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUU1NMU29ja2V0Ci0gICAgICAgIHNvY2tldCA9IFRTU0xTb2NrZXQuVFNTTFNvY2tldChvcHRpb25zLmhvc3QsIG9wdGlvbnMucG9ydCwgdmFsaWRhdGU9RmFsc2UpCi0gICAgICBlbHNlOgotICAgICAgICBzb2NrZXQgPSBUU29ja2V0LlRTb2NrZXQob3B0aW9ucy5ob3N0LCBvcHRpb25zLnBvcnQpCi0gICAgICAjIGZyYW1lIG9yIGJ1ZmZlciBkZXBlbmRpbmcgdXBvbiBhcmdzCi0gICAgICBzZWxmLnRyYW5zcG9ydCA9IFRUcmFuc3BvcnQuVEJ1ZmZlcmVkVHJhbnNwb3J0KHNvY2tldCkKLSAgICAgIGlmIG9wdGlvbnMudHJhbnMgPT0gJ2ZyYW1lZCc6Ci0gICAgICAgIHNlbGYudHJhbnNwb3J0ID0gVFRyYW5zcG9ydC5URnJhbWVkVHJhbnNwb3J0KHNvY2tldCkKLSAgICAgIGVsaWYgb3B0aW9ucy50cmFucyA9PSAnYnVmZmVyZWQnOgotICAgICAgICBzZWxmLnRyYW5zcG9ydCA9IFRUcmFuc3BvcnQuVEJ1ZmZlcmVkVHJhbnNwb3J0KHNvY2tldCkKLSAgICAgIGVsaWYgb3B0aW9ucy50cmFucyA9PSAnJzoKLSAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoJ1Vua25vd24gLS10cmFuc3BvcnQgb3B0aW9uOiAlcycgJSBvcHRpb25zLnRyYW5zKQotICAgICAgaWYgb3B0aW9ucy56bGliOgotICAgICAgICBzZWxmLnRyYW5zcG9ydCA9IFRabGliVHJhbnNwb3J0LlRabGliVHJhbnNwb3J0KHNlbGYudHJhbnNwb3J0LCA5KQotICAgIHNlbGYudHJhbnNwb3J0Lm9wZW4oKQotICAgIHByb3RvY29sID0gc2VsZi5wcm90b2NvbF9mYWN0b3J5LmdldFByb3RvY29sKHNlbGYudHJhbnNwb3J0KQotICAgIHNlbGYuY2xpZW50ID0gVGhyaWZ0VGVzdC5DbGllbnQocHJvdG9jb2wpCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBpZiBvcHRpb25zLnRyYW5zID09ICdodHRwJzoKKyAgICAgICAgICAgIHVyaSA9ICd7MH06Ly97MX06ezJ9ezN9Jy5mb3JtYXQoKCdodHRwcycgaWYgb3B0aW9ucy5zc2wgZWxzZSAnaHR0cCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmhvc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMucG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9wdGlvbnMuaHR0cF9wYXRoIGlmIG9wdGlvbnMuaHR0cF9wYXRoIGVsc2UgJy8nKSkKKyAgICAgICAgICAgIGlmIG9wdGlvbnMuc3NsOgorICAgICAgICAgICAgICAgIF9fY2FmaWxlID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShTQ1JJUFRfRElSKSwgImtleXMiLCAiQ0EucGVtIikKKyAgICAgICAgICAgICAgICBfX2NlcnRmaWxlID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShTQ1JJUFRfRElSKSwgImtleXMiLCAiY2xpZW50LmNydCIpCisgICAgICAgICAgICAgICAgX19rZXlmaWxlID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShTQ1JJUFRfRElSKSwgImtleXMiLCAiY2xpZW50LmtleSIpCisgICAgICAgICAgICAgICAgc2VsZi50cmFuc3BvcnQgPSBUSHR0cENsaWVudC5USHR0cENsaWVudCh1cmksIGNhZmlsZT1fX2NhZmlsZSwgY2VydF9maWxlPV9fY2VydGZpbGUsIGtleV9maWxlPV9fa2V5ZmlsZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi50cmFuc3BvcnQgPSBUSHR0cENsaWVudC5USHR0cENsaWVudCh1cmkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBvcHRpb25zLnNzbDoKKyAgICAgICAgICAgICAgICBmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRTU0xTb2NrZXQKKyAgICAgICAgICAgICAgICBzb2NrZXQgPSBUU1NMU29ja2V0LlRTU0xTb2NrZXQob3B0aW9ucy5ob3N0LCBvcHRpb25zLnBvcnQsIHZhbGlkYXRlPUZhbHNlKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzb2NrZXQgPSBUU29ja2V0LlRTb2NrZXQob3B0aW9ucy5ob3N0LCBvcHRpb25zLnBvcnQpCisgICAgICAgICAgICAjIGZyYW1lIG9yIGJ1ZmZlciBkZXBlbmRpbmcgdXBvbiBhcmdzCisgICAgICAgICAgICBzZWxmLnRyYW5zcG9ydCA9IFRUcmFuc3BvcnQuVEJ1ZmZlcmVkVHJhbnNwb3J0KHNvY2tldCkKKyAgICAgICAgICAgIGlmIG9wdGlvbnMudHJhbnMgPT0gJ2ZyYW1lZCc6CisgICAgICAgICAgICAgICAgc2VsZi50cmFuc3BvcnQgPSBUVHJhbnNwb3J0LlRGcmFtZWRUcmFuc3BvcnQoc29ja2V0KQorICAgICAgICAgICAgZWxpZiBvcHRpb25zLnRyYW5zID09ICdidWZmZXJlZCc6CisgICAgICAgICAgICAgICAgc2VsZi50cmFuc3BvcnQgPSBUVHJhbnNwb3J0LlRCdWZmZXJlZFRyYW5zcG9ydChzb2NrZXQpCisgICAgICAgICAgICBlbGlmIG9wdGlvbnMudHJhbnMgPT0gJyc6CisgICAgICAgICAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoJ1Vua25vd24gLS10cmFuc3BvcnQgb3B0aW9uOiAlcycgJSBvcHRpb25zLnRyYW5zKQorICAgICAgICAgICAgaWYgb3B0aW9ucy56bGliOgorICAgICAgICAgICAgICAgIHNlbGYudHJhbnNwb3J0ID0gVFpsaWJUcmFuc3BvcnQuVFpsaWJUcmFuc3BvcnQoc2VsZi50cmFuc3BvcnQsIDkpCisgICAgICAgIHNlbGYudHJhbnNwb3J0Lm9wZW4oKQorICAgICAgICBwcm90b2NvbCA9IHNlbGYuZ2V0X3Byb3RvY29sKHNlbGYudHJhbnNwb3J0KQorICAgICAgICBzZWxmLmNsaWVudCA9IFRocmlmdFRlc3QuQ2xpZW50KHByb3RvY29sKQorICAgICAgICAjIGZvciBtdWx0aXBsZXhlZCBzZXJ2aWNlczoKKyAgICAgICAgcHJvdG9jb2wyID0gc2VsZi5nZXRfcHJvdG9jb2wyKHNlbGYudHJhbnNwb3J0KQorICAgICAgICBzZWxmLmNsaWVudDIgPSBTZWNvbmRTZXJ2aWNlLkNsaWVudChwcm90b2NvbDIpIGlmIHByb3RvY29sMiBpcyBub3QgTm9uZSBlbHNlIE5vbmUKIAotICBkZWYgdGVhckRvd24oc2VsZik6Ci0gICAgIyBDbG9zZSEKLSAgICBzZWxmLnRyYW5zcG9ydC5jbG9zZSgpCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzZWxmLnRyYW5zcG9ydC5jbG9zZSgpCiAKLSAgZGVmIHRlc3RWb2lkKHNlbGYpOgotICAgIHNlbGYuY2xpZW50LnRlc3RWb2lkKCkKKyAgICBkZWYgdGVzdFZvaWQoc2VsZik6CisgICAgICAgIHByaW50KCd0ZXN0Vm9pZCcpCisgICAgICAgIHNlbGYuY2xpZW50LnRlc3RWb2lkKCkKIAotICBkZWYgdGVzdFN0cmluZyhzZWxmKToKLSAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3RTdHJpbmcoJ1B5dGhvbicgKiAyMCksICdQeXRob24nICogMjApCi0gICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsaWVudC50ZXN0U3RyaW5nKCcnKSwgJycpCisgICAgZGVmIHRlc3RTdHJpbmcoc2VsZik6CisgICAgICAgIHByaW50KCd0ZXN0U3RyaW5nJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsaWVudC50ZXN0U3RyaW5nKCdQeXRob24nICogMjApLCAnUHl0aG9uJyAqIDIwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3RTdHJpbmcoJycpLCAnJykKKyAgICAgICAgczEgPSB1J1xiXHRcbi9cXFxcXHJ7fTrjg5HjgqTjgr3jg7MiJworICAgICAgICBzMiA9IHUiIiJBZnJpa2FhbnMsIEFsZW1hbm5pc2NoLCBBcmFnb27DqXMsINin2YTYudix2KjZitipLCDZhdi12LHZiSwKKyAgICAgICAgQXN0dXJpYW51LCBBeW1hciBhcnUsIEF6yZlyYmF5Y2FuLCDQkdCw0YjSodC+0YDRgiwgQm9hcmlzY2gsIMW9ZW1haXTEl8Wha2EsCisgICAgICAgINCR0LXQu9Cw0YDRg9GB0LrQsNGPLCDQkdC10LvQsNGA0YPRgdC60LDRjyAo0YLQsNGA0LDRiNC60LXQstGW0YbQsCksINCR0YrQu9Cz0LDRgNGB0LrQuCwgQmFtYW5hbmthbiwKKyAgICAgICAg4Kas4Ka+4KaC4Kay4Ka+LCBCcmV6aG9uZWcsIEJvc2Fuc2tpLCBDYXRhbMOgLCBNw6xuZy1kxJXMpG5nLW5n4bmzzIQsINCd0L7RhdGH0LjQudC9LAorICAgICAgICBDZWJ1YW5vLCDhj6PhjrPhjqksIMSMZXNreSwg0KHQu9C+0LLRo8yB0L3RjNGB0LrRiiAvIOKwlOKwjuKwkeKwguKwoeKwkOKwoOKwlOKwjeKwnywg0KfTkdCy0LDRiNC70LAsIEN5bXJhZWcsCisgICAgICAgIERhbnNrLCBaYXpha2ksIN6L3qjeiN6s3oDeqN6E3qbekN6wLCDOlc67zrvOt869zrnOus6sLCBFbWlsacOgbiBlIHJ1bWFnbsOybCwgRW5nbGlzaCwKKyAgICAgICAgRXNwZXJhbnRvLCBFc3Bhw7FvbCwgRWVzdGksIEV1c2thcmEsINmB2KfYsdiz24wsIFN1b21pLCBWw7VybywgRsO4cm95c2t0LAorICAgICAgICBGcmFuw6dhaXMsIEFycGV0YW4sIEZ1cmxhbiwgRnJ5c2ssIEdhZWlsZ2UsIOi0m+iqniwgR8OgaWRobGlnLCBHYWxlZ28sCisgICAgICAgIEF2YcOxZSfhur0sIOCql+CrgeCqnOCqsOCqvuCqpOCrgCwgR2FlbGcsINei15HXqNeZ16osIOCkueCkv+CkqOCljeCkpuClgCwgRmlqaSBIaW5kaSwgSHJ2YXRza2ksCisgICAgICAgIEtyZXnDsmwgYXlpc3llbiwgTWFneWFyLCDVgNWh1bXVpdaA1aXVtiwgSW50ZXJsaW5ndWEsIEJhaGFzYSBJbmRvbmVzaWEsCisgICAgICAgIElsb2thbm8sIElkbywgw41zbGVuc2thLCBJdGFsaWFubywg5pel5pys6KqeLCBMb2piYW4sIEJhc2EgSmF3YSwKKyAgICAgICAg4YOl4YOQ4YOg4YOX4YOj4YOa4YOYLCBLb25nbywgS2FsYWFsbGlzdXQsIOCyleCyqOCzjeCyqOCyoSwg7ZWc6rWt7Ja0LCDQmtGK0LDRgNCw0YfQsNC5LdCc0LDQu9C60YrQsNGALAorICAgICAgICBSaXBvYXJpc2NoLCBLdXJkw64sINCa0L7QvNC4LCBLZXJuZXdlaywg0JrRi9GA0LPRi9C30YfQsCwgTGF0aW5hLCBMYWRpbm8sCisgICAgICAgIEzDq3R6ZWJ1ZXJnZXNjaCwgTGltYnVyZ3MsIExpbmfDoWxhLCDguqXgurLguqcsIExpZXR1dmnFsywgTGF0dmllxaF1LCBCYXNhCisgICAgICAgIEJhbnl1bWFzYW4sIE1hbGFnYXN5LCDQnNCw0LrQtdC00L7QvdGB0LrQuCwg4LSu4LSy4LSv4LS+4LSz4LSCLCDgpK7gpLDgpL7gpKDgpYAsINmF2KfYstmQ2LHZiNmG24wsIEJhaGFzYQorICAgICAgICBNZWxheXUsIE5uYXB1bGl0YW5vLCBOZWRlcnNha3Npc2NoLCDgpKjgpYfgpKrgpL7gpLIg4KSt4KS+4KS34KS+LCBOZWRlcmxhbmRzLCDigKoKKyAgICAgICAgTm9yc2sgKG55bm9yc2sp4oCsLCDigKpOb3JzayAoYm9rbcOlbCnigKwsIE5vdW9ybWFuZCwgRGluw6kgYml6YWFkLAorICAgICAgICBPY2NpdGFuLCDQmNGA0L7QvdCw0YMsIFBhcGlhbWVudHUsIERlaXRzY2gsIFBvbHNraSwg2b7Zhtis2KfYqNuMLCDZvtqa2KrZiCwKKyAgICAgICAgTm9yZnVrIC8gUGl0a2VybiwgUG9ydHVndcOqcywgUnVuYSBTaW1pLCBSdW1hbnRzY2gsIFJvbWFuaSwgUm9tw6JuxIMsCisgICAgICAgINCg0YPRgdGB0LrQuNC5LCDQodCw0YXQsCDRgtGL0LvQsCwgU2FyZHUsIFNpY2lsaWFudSwgU2NvdHMsIFPDoW1lZ2llbGxhLCBTaW1wbGUKKyAgICAgICAgRW5nbGlzaCwgU2xvdmVuxI1pbmEsIFNsb3ZlbsWhxI1pbmEsINCh0YDQv9GB0LrQuCAvIFNycHNraSwgU2VlbHRlcnNrLAorICAgICAgICBTdmVuc2thLCBLaXN3YWhpbGksIOCupOCuruCuv+CutOCvjSwg4LCk4LGG4LCy4LGB4LCX4LGBLCDQotC+0rfQuNC606MsIOC5hOC4l+C4oiwgVMO8cmttZW7Dp2UsIFRhZ2Fsb2csCisgICAgICAgIFTDvHJrw6dlLCDQotCw0YLQsNGA0YfQsC9UYXRhcsOnYSwg0KPQutGA0LDRl9C90YHRjNC60LAsINin2LHYr9mILCBUaeG6v25nIFZp4buHdCwgVm9sYXDDvGssCisgICAgICAgIFdhbG9uLCBXaW5hcmF5LCDlkLTor60sIGlzaVhob3NhLCDXmdeZ1rTXk9eZ16ksIFlvcsO5YsOhLCBaZcOqdXdzLCDkuK3mlocsCisgICAgICAgIELDom4tbMOibS1nw7osIOeyteiqniIiIgorICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzBdID09IDIgYW5kIG9zLmVudmlyb24uZ2V0KCdUSFJJRlRfVEVTVF9QWV9OT19VVEY4U1RSSU5HUycpOgorICAgICAgICAgICAgczEgPSBzMS5lbmNvZGUoJ3V0ZjgnKQorICAgICAgICAgICAgczIgPSBzMi5lbmNvZGUoJ3V0ZjgnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3RTdHJpbmcoczEpLCBzMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsaWVudC50ZXN0U3RyaW5nKHMyKSwgczIpCiAKLSAgZGVmIHRlc3RCeXRlKHNlbGYpOgotICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGllbnQudGVzdEJ5dGUoNjMpLCA2MykKLSAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3RCeXRlKC0xMjcpLCAtMTI3KQorICAgIGRlZiB0ZXN0TXVsdGlwbGV4ZWQoc2VsZik6CisgICAgICAgIGlmIHNlbGYuY2xpZW50MiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHByaW50KCd0ZXN0TXVsdGlwbGV4ZWQnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsaWVudDIuc2Vjb25kdGVzdFN0cmluZygnZm9vYmFyJyksICd0ZXN0U3RyaW5nKCJmb29iYXIiKScpCiAKLSAgZGVmIHRlc3RJMzIoc2VsZik6Ci0gICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsaWVudC50ZXN0STMyKC0xKSwgLTEpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsaWVudC50ZXN0STMyKDApLCAwKQorICAgIGRlZiB0ZXN0Qm9vbChzZWxmKToKKyAgICAgICAgcHJpbnQoJ3Rlc3RCb29sJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsaWVudC50ZXN0Qm9vbChUcnVlKSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsaWVudC50ZXN0Qm9vbChGYWxzZSksIEZhbHNlKQogCi0gIGRlZiB0ZXN0STY0KHNlbGYpOgotICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGllbnQudGVzdEk2NCgxKSwgMSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3RJNjQoLTM0MzU5NzM4MzY4KSwgLTM0MzU5NzM4MzY4KQorICAgIGRlZiB0ZXN0Qnl0ZShzZWxmKToKKyAgICAgICAgcHJpbnQoJ3Rlc3RCeXRlJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsaWVudC50ZXN0Qnl0ZSg2MyksIDYzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3RCeXRlKC0xMjcpLCAtMTI3KQogCi0gIGRlZiB0ZXN0RG91YmxlKHNlbGYpOgotICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGllbnQudGVzdERvdWJsZSgtNS4yMzUwOTgyMzUpLCAtNS4yMzUwOTgyMzUpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsaWVudC50ZXN0RG91YmxlKDApLCAwKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGllbnQudGVzdERvdWJsZSgtMSksIC0xKQorICAgIGRlZiB0ZXN0STMyKHNlbGYpOgorICAgICAgICBwcmludCgndGVzdEkzMicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGllbnQudGVzdEkzMigtMSksIC0xKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3RJMzIoMCksIDApCiAKLSAgZGVmIHRlc3RTdHJ1Y3Qoc2VsZik6Ci0gICAgeCA9IFh0cnVjdCgpCi0gICAgeC5zdHJpbmdfdGhpbmcgPSAiWmVybyIKLSAgICB4LmJ5dGVfdGhpbmcgPSAxCi0gICAgeC5pMzJfdGhpbmcgPSAtMwotICAgIHguaTY0X3RoaW5nID0gLTUKLSAgICB5ID0gc2VsZi5jbGllbnQudGVzdFN0cnVjdCh4KQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoeSwgeCkKKyAgICBkZWYgdGVzdEk2NChzZWxmKToKKyAgICAgICAgcHJpbnQoJ3Rlc3RJNjQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3RJNjQoMSksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGllbnQudGVzdEk2NCgtMzQzNTk3MzgzNjgpLCAtMzQzNTk3MzgzNjgpCiAKLSAgZGVmIHRlc3ROZXN0KHNlbGYpOgotICAgIGlubmVyID0gWHRydWN0KHN0cmluZ190aGluZz0iWmVybyIsIGJ5dGVfdGhpbmc9MSwgaTMyX3RoaW5nPS0zLAotICAgICAgaTY0X3RoaW5nPS01KQotICAgIHggPSBYdHJ1Y3QyKHN0cnVjdF90aGluZz1pbm5lciwgYnl0ZV90aGluZz0wLCBpMzJfdGhpbmc9MCkKLSAgICB5ID0gc2VsZi5jbGllbnQudGVzdE5lc3QoeCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHksIHgpCisgICAgZGVmIHRlc3REb3VibGUoc2VsZik6CisgICAgICAgIHByaW50KCd0ZXN0RG91YmxlJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsaWVudC50ZXN0RG91YmxlKC01LjIzNTA5ODIzNSksIC01LjIzNTA5ODIzNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsaWVudC50ZXN0RG91YmxlKDApLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3REb3VibGUoLTEpLCAtMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsaWVudC50ZXN0RG91YmxlKC0wLjAwMDM0MTAxMjQzOTYzODU5ODI3OSksIC0wLjAwMDM0MTAxMjQzOTYzODU5ODI3OSkKIAotICBkZWYgdGVzdE1hcChzZWxmKToKLSAgICB4ID0gezA6MSwgMToyLCAyOjMsIDM6NCwgLTE6LTJ9Ci0gICAgeSA9IHNlbGYuY2xpZW50LnRlc3RNYXAoeCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHksIHgpCisgICAgZGVmIHRlc3RCaW5hcnkoc2VsZik6CisgICAgICAgIHByaW50KCd0ZXN0QmluYXJ5JykKKyAgICAgICAgdmFsID0gYnl0ZWFycmF5KFtpIGZvciBpIGluIHJhbmdlKDAsIDI1NildKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ5dGVhcnJheShzZWxmLmNsaWVudC50ZXN0QmluYXJ5KGJ5dGVzKHZhbCkpKSwgdmFsKQogCi0gIGRlZiB0ZXN0U2V0KHNlbGYpOgotICAgIHggPSBzZXQoWzgsIDEsIDQyXSkKLSAgICB5ID0gc2VsZi5jbGllbnQudGVzdFNldCh4KQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoeSwgeCkKKyAgICBkZWYgdGVzdFN0cnVjdChzZWxmKToKKyAgICAgICAgcHJpbnQoJ3Rlc3RTdHJ1Y3QnKQorICAgICAgICB4ID0gWHRydWN0KCkKKyAgICAgICAgeC5zdHJpbmdfdGhpbmcgPSAiWmVybyIKKyAgICAgICAgeC5ieXRlX3RoaW5nID0gMQorICAgICAgICB4LmkzMl90aGluZyA9IC0zCisgICAgICAgIHguaTY0X3RoaW5nID0gLTUKKyAgICAgICAgeSA9IHNlbGYuY2xpZW50LnRlc3RTdHJ1Y3QoeCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5LCB4KQogCi0gIGRlZiB0ZXN0TGlzdChzZWxmKToKLSAgICB4ID0gWzEsIDQsIDksIC00Ml0KLSAgICB5ID0gc2VsZi5jbGllbnQudGVzdExpc3QoeCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHksIHgpCisgICAgZGVmIHRlc3ROZXN0KHNlbGYpOgorICAgICAgICBwcmludCgndGVzdE5lc3QnKQorICAgICAgICBpbm5lciA9IFh0cnVjdChzdHJpbmdfdGhpbmc9Ilplcm8iLCBieXRlX3RoaW5nPTEsIGkzMl90aGluZz0tMywgaTY0X3RoaW5nPS01KQorICAgICAgICB4ID0gWHRydWN0MihzdHJ1Y3RfdGhpbmc9aW5uZXIsIGJ5dGVfdGhpbmc9MCwgaTMyX3RoaW5nPTApCisgICAgICAgIHkgPSBzZWxmLmNsaWVudC50ZXN0TmVzdCh4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHksIHgpCiAKLSAgZGVmIHRlc3RFbnVtKHNlbGYpOgotICAgIHggPSBOdW1iZXJ6LkZJVkUKLSAgICB5ID0gc2VsZi5jbGllbnQudGVzdEVudW0oeCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHksIHgpCisgICAgZGVmIHRlc3RNYXAoc2VsZik6CisgICAgICAgIHByaW50KCd0ZXN0TWFwJykKKyAgICAgICAgeCA9IHswOiAxLCAxOiAyLCAyOiAzLCAzOiA0LCAtMTogLTJ9CisgICAgICAgIHkgPSBzZWxmLmNsaWVudC50ZXN0TWFwKHgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeSwgeCkKIAotICBkZWYgdGVzdFR5cGVkZWYoc2VsZik6Ci0gICAgeCA9IDB4ZmZmZmZmZmZmZmZmZmYgIyA3IGJ5dGVzIG9mIDB4ZmYKLSAgICB5ID0gc2VsZi5jbGllbnQudGVzdFR5cGVkZWYoeCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHksIHgpCisgICAgZGVmIHRlc3RTZXQoc2VsZik6CisgICAgICAgIHByaW50KCd0ZXN0U2V0JykKKyAgICAgICAgeCA9IHNldChbOCwgMSwgNDJdKQorICAgICAgICB5ID0gc2VsZi5jbGllbnQudGVzdFNldCh4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHksIHgpCiAKLSAgZGVmIHRlc3RNYXBNYXAoc2VsZik6Ci0gICAgIyBkb2VzIG5vdCB3b3JrOiBkaWN0KCkgaXMgbm90IGEgaGFzaGFibGUgdHlwZSwgc28gYSBkaWN0KCkgY2Fubm90IGJlIHVzZWQgYXMgYSBrZXkgaW4gYW5vdGhlciBkaWN0KCkKLSAgICAjeCA9IHsgezE6MTAsIDI6MjB9LCB7MToxMDAsIDI6MjAwLCAzOjMwMH0sIHsxOjEwMDAsIDI6MjAwMCwgMzozMDAwLCA0OjQwMDB9IH0KLSAgICB0cnk6Ci0gICAgICB5ID0gc2VsZi5jbGllbnQudGVzdE1hcE1hcCgpCi0gICAgZXhjZXB0OgotICAgICAgcGFzcworICAgIGRlZiB0ZXN0TGlzdChzZWxmKToKKyAgICAgICAgcHJpbnQoJ3Rlc3RMaXN0JykKKyAgICAgICAgeCA9IFsxLCA0LCA5LCAtNDJdCisgICAgICAgIHkgPSBzZWxmLmNsaWVudC50ZXN0TGlzdCh4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHksIHgpCiAKLSAgZGVmIHRlc3RNdWx0aShzZWxmKToKLSAgICB4cGVjdGVkID0gWHRydWN0KHN0cmluZ190aGluZz0nSGVsbG8yJywgYnl0ZV90aGluZz03NCwgaTMyX3RoaW5nPTB4ZmYwMGZmLCBpNjRfdGhpbmc9MHhmZmZmZmZmZmQwZDApCi0gICAgeSA9IHNlbGYuY2xpZW50LnRlc3RNdWx0aSh4cGVjdGVkLmJ5dGVfdGhpbmcsCi0gICAgICAgICAgeHBlY3RlZC5pMzJfdGhpbmcsCi0gICAgICAgICAgeHBlY3RlZC5pNjRfdGhpbmcsCi0gICAgICAgICAgeyAwOidhYmMnIH0sCi0gICAgICAgICAgTnVtYmVyei5GSVZFLAotICAgICAgICAgIDB4ZjBmMGYwKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoeSwgeHBlY3RlZCkKKyAgICBkZWYgdGVzdEVudW0oc2VsZik6CisgICAgICAgIHByaW50KCd0ZXN0RW51bScpCisgICAgICAgIHggPSBOdW1iZXJ6LkZJVkUKKyAgICAgICAgeSA9IHNlbGYuY2xpZW50LnRlc3RFbnVtKHgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeSwgeCkKIAotICBkZWYgdGVzdEV4Y2VwdGlvbihzZWxmKToKLSAgICBzZWxmLmNsaWVudC50ZXN0RXhjZXB0aW9uKCdTYWZlJykKLSAgICB0cnk6Ci0gICAgICBzZWxmLmNsaWVudC50ZXN0RXhjZXB0aW9uKCdYY2VwdGlvbicpCi0gICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIGdvdHRlbiBleGNlcHRpb24iKQotICAgIGV4Y2VwdCBYY2VwdGlvbiwgeDoKLSAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5lcnJvckNvZGUsIDEwMDEpCi0gICAgICBzZWxmLmFzc2VydEVxdWFsKHgubWVzc2FnZSwgJ1hjZXB0aW9uJykKLSAgICAgICMgVE9ETyBlbnN1cmUgc2FtZSBiZWhhdmlvciBmb3IgcmVwciB3aXRoaW4gZ2VuZXJhdGVkIHB5dGhvbiB2YXJpYW50cwotICAgICAgIyBlbnN1cmUgZXhjZXB0aW9uJ3MgcmVwciBtZXRob2Qgd29ya3MKLSAgICAgICN4X3JlcHIgPSByZXByKHgpCi0gICAgICAjc2VsZi5hc3NlcnRFcXVhbCh4X3JlcHIsICdYY2VwdGlvbihlcnJvckNvZGU9MTAwMSwgbWVzc2FnZT1cJ1hjZXB0aW9uXCcpJykKKyAgICBkZWYgdGVzdFR5cGVkZWYoc2VsZik6CisgICAgICAgIHByaW50KCd0ZXN0VHlwZWRlZicpCisgICAgICAgIHggPSAweGZmZmZmZmZmZmZmZmZmICAjIDcgYnl0ZXMgb2YgMHhmZgorICAgICAgICB5ID0gc2VsZi5jbGllbnQudGVzdFR5cGVkZWYoeCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5LCB4KQogCi0gICAgdHJ5OgotICAgICAgc2VsZi5jbGllbnQudGVzdEV4Y2VwdGlvbigidGhyb3dfdW5kZWNsYXJlZCIpCi0gICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHRocm93biBleGNlcHRpb24iKQotICAgIGV4Y2VwdCBFeGNlcHRpb246ICMgdHlwZSBpcyB1bmRlZmluZWQKLSAgICAgIHBhc3MKKyAgICBkZWYgdGVzdE1hcE1hcChzZWxmKToKKyAgICAgICAgcHJpbnQoJ3Rlc3RNYXBNYXAnKQorICAgICAgICB4ID0geworICAgICAgICAgICAgLTQ6IHstNDogLTQsIC0zOiAtMywgLTI6IC0yLCAtMTogLTF9LAorICAgICAgICAgICAgNDogezQ6IDQsIDM6IDMsIDI6IDIsIDE6IDF9LAorICAgICAgICB9CisgICAgICAgIHkgPSBzZWxmLmNsaWVudC50ZXN0TWFwTWFwKDQyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHksIHgpCiAKLSAgZGVmIHRlc3RPbmV3YXkoc2VsZik6Ci0gICAgc3RhcnQgPSB0aW1lLnRpbWUoKQotICAgIHNlbGYuY2xpZW50LnRlc3RPbmV3YXkoMSkgIyB0eXBlIGlzIGludCwgbm90IGZsb2F0Ci0gICAgZW5kID0gdGltZS50aW1lKCkKLSAgICBzZWxmLmFzc2VydFRydWUoZW5kIC0gc3RhcnQgPCAzLAotICAgICAgICAgICAgICAgICAgICAib25ld2F5IHNsZWVwIHRvb2sgJWYgc2VjIiAlIChlbmQgLSBzdGFydCkpCisgICAgZGVmIHRlc3RNdWx0aShzZWxmKToKKyAgICAgICAgcHJpbnQoJ3Rlc3RNdWx0aScpCisgICAgICAgIHhwZWN0ZWQgPSBYdHJ1Y3Qoc3RyaW5nX3RoaW5nPSdIZWxsbzInLCBieXRlX3RoaW5nPTc0LCBpMzJfdGhpbmc9MHhmZjAwZmYsIGk2NF90aGluZz0weGZmZmZmZmZmZDBkMCkKKyAgICAgICAgeSA9IHNlbGYuY2xpZW50LnRlc3RNdWx0aSh4cGVjdGVkLmJ5dGVfdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeHBlY3RlZC5pMzJfdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeHBlY3RlZC5pNjRfdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezA6ICdhYmMnfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1iZXJ6LkZJVkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmMGYwZjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeSwgeHBlY3RlZCkKIAotICBkZWYgdGVzdE9uZXdheVRoZW5Ob3JtYWwoc2VsZik6Ci0gICAgc2VsZi5jbGllbnQudGVzdE9uZXdheSgxKSAjIHR5cGUgaXMgaW50LCBub3QgZmxvYXQKLSAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3RTdHJpbmcoJ1B5dGhvbicpLCAnUHl0aG9uJykKKyAgICBkZWYgdGVzdEV4Y2VwdGlvbihzZWxmKToKKyAgICAgICAgcHJpbnQoJ3Rlc3RFeGNlcHRpb24nKQorICAgICAgICBzZWxmLmNsaWVudC50ZXN0RXhjZXB0aW9uKCdTYWZlJykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5jbGllbnQudGVzdEV4Y2VwdGlvbignWGNlcHRpb24nKQorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSBnb3R0ZW4gZXhjZXB0aW9uIikKKyAgICAgICAgZXhjZXB0IFhjZXB0aW9uIGFzIHg6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguZXJyb3JDb2RlLCAxMDAxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4Lm1lc3NhZ2UsICdYY2VwdGlvbicpCisgICAgICAgICAgICAjIFRPRE8gZW5zdXJlIHNhbWUgYmVoYXZpb3IgZm9yIHJlcHIgd2l0aGluIGdlbmVyYXRlZCBweXRob24gdmFyaWFudHMKKyAgICAgICAgICAgICMgZW5zdXJlIGV4Y2VwdGlvbidzIHJlcHIgbWV0aG9kIHdvcmtzCisgICAgICAgICAgICAjIHhfcmVwciA9IHJlcHIoeCkKKyAgICAgICAgICAgICMgc2VsZi5hc3NlcnRFcXVhbCh4X3JlcHIsICdYY2VwdGlvbihlcnJvckNvZGU9MTAwMSwgbWVzc2FnZT1cJ1hjZXB0aW9uXCcpJykKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmNsaWVudC50ZXN0RXhjZXB0aW9uKCdURXhjZXB0aW9uJykKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgZ290dGVuIGV4Y2VwdGlvbiIpCisgICAgICAgIGV4Y2VwdCBURXhjZXB0aW9uIGFzIHg6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgIyBTaG91bGQgbm90IHRocm93CisgICAgICAgIHNlbGYuY2xpZW50LnRlc3RFeGNlcHRpb24oJ3N1Y2Nlc3MnKQorCisgICAgZGVmIHRlc3RNdWx0aUV4Y2VwdGlvbihzZWxmKToKKyAgICAgICAgcHJpbnQoJ3Rlc3RNdWx0aUV4Y2VwdGlvbicpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuY2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbignWGNlcHRpb24nLCAnaWdub3JlJykKKyAgICAgICAgZXhjZXB0IFhjZXB0aW9uIGFzIGV4OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleC5lcnJvckNvZGUsIDEwMDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4Lm1lc3NhZ2UsICdUaGlzIGlzIGFuIFhjZXB0aW9uJykKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmNsaWVudC50ZXN0TXVsdGlFeGNlcHRpb24oJ1hjZXB0aW9uMicsICdpZ25vcmUnKQorICAgICAgICBleGNlcHQgWGNlcHRpb24yIGFzIGV4OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleC5lcnJvckNvZGUsIDIwMDIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4LnN0cnVjdF90aGluZy5zdHJpbmdfdGhpbmcsICdUaGlzIGlzIGFuIFhjZXB0aW9uMicpCisKKyAgICAgICAgeSA9IHNlbGYuY2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbignc3VjY2VzcycsICdmb29iYXInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHkuc3RyaW5nX3RoaW5nLCAnZm9vYmFyJykKKworICAgIGRlZiB0ZXN0T25ld2F5KHNlbGYpOgorICAgICAgICBwcmludCgndGVzdE9uZXdheScpCisgICAgICAgIHN0YXJ0ID0gdGltZS50aW1lKCkKKyAgICAgICAgc2VsZi5jbGllbnQudGVzdE9uZXdheSgxKSAgIyB0eXBlIGlzIGludCwgbm90IGZsb2F0CisgICAgICAgIGVuZCA9IHRpbWUudGltZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShlbmQgLSBzdGFydCA8IDMsCisgICAgICAgICAgICAgICAgICAgICAgICAib25ld2F5IHNsZWVwIHRvb2sgJWYgc2VjIiAlIChlbmQgLSBzdGFydCkpCisKKyAgICBkZWYgdGVzdE9uZXdheVRoZW5Ob3JtYWwoc2VsZik6CisgICAgICAgIHByaW50KCd0ZXN0T25ld2F5VGhlbk5vcm1hbCcpCisgICAgICAgIHNlbGYuY2xpZW50LnRlc3RPbmV3YXkoMSkgICMgdHlwZSBpcyBpbnQsIG5vdCBmbG9hdAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3RTdHJpbmcoJ1B5dGhvbicpLCAnUHl0aG9uJykKIAogCi1jbGFzcyBOb3JtYWxCaW5hcnlUZXN0KEFic3RyYWN0VGVzdCk6Ci0gIHByb3RvY29sX2ZhY3RvcnkgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpCitjbGFzcyBNdWx0aXBsZXhlZE9wdGlvbmFsVGVzdChBYnN0cmFjdFRlc3QpOgorICAgIGRlZiBnZXRfcHJvdG9jb2wyKHNlbGYsIHRyYW5zcG9ydCk6CisgICAgICAgIHJldHVybiBOb25lCiAKLWNsYXNzIENvbXBhY3RUZXN0KEFic3RyYWN0VGVzdCk6Ci0gIHByb3RvY29sX2ZhY3RvcnkgPSBUQ29tcGFjdFByb3RvY29sLlRDb21wYWN0UHJvdG9jb2xGYWN0b3J5KCkKIAotY2xhc3MgSlNPTlRlc3QoQWJzdHJhY3RUZXN0KToKLSAgcHJvdG9jb2xfZmFjdG9yeSA9IFRKU09OUHJvdG9jb2wuVEpTT05Qcm90b2NvbEZhY3RvcnkoKQorY2xhc3MgQmluYXJ5VGVzdChNdWx0aXBsZXhlZE9wdGlvbmFsVGVzdCk6CisgICAgZGVmIGdldF9wcm90b2NvbChzZWxmLCB0cmFuc3BvcnQpOgorICAgICAgICByZXR1cm4gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKS5nZXRQcm90b2NvbCh0cmFuc3BvcnQpCiAKLWNsYXNzIEFjY2VsZXJhdGVkQmluYXJ5VGVzdChBYnN0cmFjdFRlc3QpOgotICBwcm90b2NvbF9mYWN0b3J5ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeSgpCisKK2NsYXNzIE11bHRpcGxleGVkQmluYXJ5VGVzdChNdWx0aXBsZXhlZE9wdGlvbmFsVGVzdCk6CisgICAgZGVmIGdldF9wcm90b2NvbChzZWxmLCB0cmFuc3BvcnQpOgorICAgICAgICB3cmFwcGVkX3Byb3RvID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKS5nZXRQcm90b2NvbCh0cmFuc3BvcnQpCisgICAgICAgIHJldHVybiBUTXVsdGlwbGV4ZWRQcm90b2NvbC5UTXVsdGlwbGV4ZWRQcm90b2NvbCh3cmFwcGVkX3Byb3RvLCAiVGhyaWZ0VGVzdCIpCisKKyAgICBkZWYgZ2V0X3Byb3RvY29sMihzZWxmLCB0cmFuc3BvcnQpOgorICAgICAgICB3cmFwcGVkX3Byb3RvID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKS5nZXRQcm90b2NvbCh0cmFuc3BvcnQpCisgICAgICAgIHJldHVybiBUTXVsdGlwbGV4ZWRQcm90b2NvbC5UTXVsdGlwbGV4ZWRQcm90b2NvbCh3cmFwcGVkX3Byb3RvLCAiU2Vjb25kU2VydmljZSIpCisKKworY2xhc3MgQWNjZWxlcmF0ZWRCaW5hcnlUZXN0KE11bHRpcGxleGVkT3B0aW9uYWxUZXN0KToKKyAgICBkZWYgZ2V0X3Byb3RvY29sKHNlbGYsIHRyYW5zcG9ydCk6CisgICAgICAgIHJldHVybiBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5KGZhbGxiYWNrPUZhbHNlKS5nZXRQcm90b2NvbCh0cmFuc3BvcnQpCisKKworY2xhc3MgTXVsdGlwbGV4ZWRBY2NlbGVyYXRlZEJpbmFyeVRlc3QoTXVsdGlwbGV4ZWRPcHRpb25hbFRlc3QpOgorICAgIGRlZiBnZXRfcHJvdG9jb2woc2VsZiwgdHJhbnNwb3J0KToKKyAgICAgICAgd3JhcHBlZF9wcm90byA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3RvcnkoZmFsbGJhY2s9RmFsc2UpLmdldFByb3RvY29sKHRyYW5zcG9ydCkKKyAgICAgICAgcmV0dXJuIFRNdWx0aXBsZXhlZFByb3RvY29sLlRNdWx0aXBsZXhlZFByb3RvY29sKHdyYXBwZWRfcHJvdG8sICJUaHJpZnRUZXN0IikKKworICAgIGRlZiBnZXRfcHJvdG9jb2wyKHNlbGYsIHRyYW5zcG9ydCk6CisgICAgICAgIHdyYXBwZWRfcHJvdG8gPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5KGZhbGxiYWNrPUZhbHNlKS5nZXRQcm90b2NvbCh0cmFuc3BvcnQpCisgICAgICAgIHJldHVybiBUTXVsdGlwbGV4ZWRQcm90b2NvbC5UTXVsdGlwbGV4ZWRQcm90b2NvbCh3cmFwcGVkX3Byb3RvLCAiU2Vjb25kU2VydmljZSIpCisKKworY2xhc3MgQ29tcGFjdFRlc3QoTXVsdGlwbGV4ZWRPcHRpb25hbFRlc3QpOgorICAgIGRlZiBnZXRfcHJvdG9jb2woc2VsZiwgdHJhbnNwb3J0KToKKyAgICAgICAgcmV0dXJuIFRDb21wYWN0UHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbEZhY3RvcnkoKS5nZXRQcm90b2NvbCh0cmFuc3BvcnQpCisKKworY2xhc3MgTXVsdGlwbGV4ZWRDb21wYWN0VGVzdChNdWx0aXBsZXhlZE9wdGlvbmFsVGVzdCk6CisgICAgZGVmIGdldF9wcm90b2NvbChzZWxmLCB0cmFuc3BvcnQpOgorICAgICAgICB3cmFwcGVkX3Byb3RvID0gVENvbXBhY3RQcm90b2NvbC5UQ29tcGFjdFByb3RvY29sRmFjdG9yeSgpLmdldFByb3RvY29sKHRyYW5zcG9ydCkKKyAgICAgICAgcmV0dXJuIFRNdWx0aXBsZXhlZFByb3RvY29sLlRNdWx0aXBsZXhlZFByb3RvY29sKHdyYXBwZWRfcHJvdG8sICJUaHJpZnRUZXN0IikKKworICAgIGRlZiBnZXRfcHJvdG9jb2wyKHNlbGYsIHRyYW5zcG9ydCk6CisgICAgICAgIHdyYXBwZWRfcHJvdG8gPSBUQ29tcGFjdFByb3RvY29sLlRDb21wYWN0UHJvdG9jb2xGYWN0b3J5KCkuZ2V0UHJvdG9jb2wodHJhbnNwb3J0KQorICAgICAgICByZXR1cm4gVE11bHRpcGxleGVkUHJvdG9jb2wuVE11bHRpcGxleGVkUHJvdG9jb2wod3JhcHBlZF9wcm90bywgIlNlY29uZFNlcnZpY2UiKQorCisKK2NsYXNzIEFjY2VsZXJhdGVkQ29tcGFjdFRlc3QoTXVsdGlwbGV4ZWRPcHRpb25hbFRlc3QpOgorICAgIGRlZiBnZXRfcHJvdG9jb2woc2VsZiwgdHJhbnNwb3J0KToKKyAgICAgICAgcmV0dXJuIFRDb21wYWN0UHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeShmYWxsYmFjaz1GYWxzZSkuZ2V0UHJvdG9jb2wodHJhbnNwb3J0KQorCisKK2NsYXNzIE11bHRpcGxleGVkQWNjZWxlcmF0ZWRDb21wYWN0VGVzdChNdWx0aXBsZXhlZE9wdGlvbmFsVGVzdCk6CisgICAgZGVmIGdldF9wcm90b2NvbChzZWxmLCB0cmFuc3BvcnQpOgorICAgICAgICB3cmFwcGVkX3Byb3RvID0gVENvbXBhY3RQcm90b2NvbC5UQ29tcGFjdFByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5KGZhbGxiYWNrPUZhbHNlKS5nZXRQcm90b2NvbCh0cmFuc3BvcnQpCisgICAgICAgIHJldHVybiBUTXVsdGlwbGV4ZWRQcm90b2NvbC5UTXVsdGlwbGV4ZWRQcm90b2NvbCh3cmFwcGVkX3Byb3RvLCAiVGhyaWZ0VGVzdCIpCisKKyAgICBkZWYgZ2V0X3Byb3RvY29sMihzZWxmLCB0cmFuc3BvcnQpOgorICAgICAgICB3cmFwcGVkX3Byb3RvID0gVENvbXBhY3RQcm90b2NvbC5UQ29tcGFjdFByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5KGZhbGxiYWNrPUZhbHNlKS5nZXRQcm90b2NvbCh0cmFuc3BvcnQpCisgICAgICAgIHJldHVybiBUTXVsdGlwbGV4ZWRQcm90b2NvbC5UTXVsdGlwbGV4ZWRQcm90b2NvbCh3cmFwcGVkX3Byb3RvLCAiU2Vjb25kU2VydmljZSIpCisKKworY2xhc3MgSlNPTlRlc3QoTXVsdGlwbGV4ZWRPcHRpb25hbFRlc3QpOgorICAgIGRlZiBnZXRfcHJvdG9jb2woc2VsZiwgdHJhbnNwb3J0KToKKyAgICAgICAgcmV0dXJuIFRKU09OUHJvdG9jb2wuVEpTT05Qcm90b2NvbEZhY3RvcnkoKS5nZXRQcm90b2NvbCh0cmFuc3BvcnQpCisKKworY2xhc3MgTXVsdGlwbGV4ZWRKU09OVGVzdChNdWx0aXBsZXhlZE9wdGlvbmFsVGVzdCk6CisgICAgZGVmIGdldF9wcm90b2NvbChzZWxmLCB0cmFuc3BvcnQpOgorICAgICAgICB3cmFwcGVkX3Byb3RvID0gVEpTT05Qcm90b2NvbC5USlNPTlByb3RvY29sRmFjdG9yeSgpLmdldFByb3RvY29sKHRyYW5zcG9ydCkKKyAgICAgICAgcmV0dXJuIFRNdWx0aXBsZXhlZFByb3RvY29sLlRNdWx0aXBsZXhlZFByb3RvY29sKHdyYXBwZWRfcHJvdG8sICJUaHJpZnRUZXN0IikKKworICAgIGRlZiBnZXRfcHJvdG9jb2wyKHNlbGYsIHRyYW5zcG9ydCk6CisgICAgICAgIHdyYXBwZWRfcHJvdG8gPSBUSlNPTlByb3RvY29sLlRKU09OUHJvdG9jb2xGYWN0b3J5KCkuZ2V0UHJvdG9jb2wodHJhbnNwb3J0KQorICAgICAgICByZXR1cm4gVE11bHRpcGxleGVkUHJvdG9jb2wuVE11bHRpcGxleGVkUHJvdG9jb2wod3JhcHBlZF9wcm90bywgIlNlY29uZFNlcnZpY2UiKQorCisKK2NsYXNzIEhlYWRlclRlc3QoTXVsdGlwbGV4ZWRPcHRpb25hbFRlc3QpOgorICAgIGRlZiBnZXRfcHJvdG9jb2woc2VsZiwgdHJhbnNwb3J0KToKKyAgICAgICAgZmFjdG9yeSA9IFRIZWFkZXJQcm90b2NvbC5USGVhZGVyUHJvdG9jb2xGYWN0b3J5KCkKKyAgICAgICAgcmV0dXJuIGZhY3RvcnkuZ2V0UHJvdG9jb2wodHJhbnNwb3J0KQorCiAKIGRlZiBzdWl0ZSgpOgotICBzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpCi0gIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQotICBpZiBvcHRpb25zLnByb3RvID09ICdiaW5hcnknOiAjIGxvb2sgZm9yIC0tcHJvdG8gb24gY21kbGluZQotICAgIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShOb3JtYWxCaW5hcnlUZXN0KSkKLSAgZWxpZiBvcHRpb25zLnByb3RvID09ICdhY2NlbCc6Ci0gICAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKEFjY2VsZXJhdGVkQmluYXJ5VGVzdCkpCi0gIGVsaWYgb3B0aW9ucy5wcm90byA9PSAnY29tcGFjdCc6Ci0gICAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKENvbXBhY3RUZXN0KSkKLSAgZWxpZiBvcHRpb25zLnByb3RvID09ICdqc29uJzoKLSAgICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoSlNPTlRlc3QpKQotICBlbHNlOgotICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCdVbmtub3duIHByb3RvY29sIGdpdmVuIHdpdGggLS1wcm90b2NvbDogJXMnICUgb3B0aW9ucy5wcm90bykKLSAgcmV0dXJuIHN1aXRlCisgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQorICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQorICAgIGlmIG9wdGlvbnMucHJvdG8gPT0gJ2JpbmFyeSc6ICAjIGxvb2sgZm9yIC0tcHJvdG8gb24gY21kbGluZQorICAgICAgICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoQmluYXJ5VGVzdCkpCisgICAgZWxpZiBvcHRpb25zLnByb3RvID09ICdhY2NlbCc6CisgICAgICAgIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShBY2NlbGVyYXRlZEJpbmFyeVRlc3QpKQorICAgIGVsaWYgb3B0aW9ucy5wcm90byA9PSAnYWNjZWxjJzoKKyAgICAgICAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKEFjY2VsZXJhdGVkQ29tcGFjdFRlc3QpKQorICAgIGVsaWYgb3B0aW9ucy5wcm90byA9PSAnY29tcGFjdCc6CisgICAgICAgIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShDb21wYWN0VGVzdCkpCisgICAgZWxpZiBvcHRpb25zLnByb3RvID09ICdoZWFkZXInOgorICAgICAgICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoSGVhZGVyVGVzdCkpCisgICAgZWxpZiBvcHRpb25zLnByb3RvID09ICdqc29uJzoKKyAgICAgICAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKEpTT05UZXN0KSkKKyAgICBlbGlmIG9wdGlvbnMucHJvdG8gPT0gJ211bHRpJzoKKyAgICAgICAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKE11bHRpcGxleGVkQmluYXJ5VGVzdCkpCisgICAgZWxpZiBvcHRpb25zLnByb3RvID09ICdtdWx0aWEnOgorICAgICAgICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoTXVsdGlwbGV4ZWRBY2NlbGVyYXRlZEJpbmFyeVRlc3QpKQorICAgIGVsaWYgb3B0aW9ucy5wcm90byA9PSAnbXVsdGlhYyc6CisgICAgICAgIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShNdWx0aXBsZXhlZEFjY2VsZXJhdGVkQ29tcGFjdFRlc3QpKQorICAgIGVsaWYgb3B0aW9ucy5wcm90byA9PSAnbXVsdGljJzoKKyAgICAgICAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKE11bHRpcGxleGVkQ29tcGFjdFRlc3QpKQorICAgIGVsaWYgb3B0aW9ucy5wcm90byA9PSAnbXVsdGlqJzoKKyAgICAgICAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKE11bHRpcGxleGVkSlNPTlRlc3QpKQorICAgIGVsc2U6CisgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCdVbmtub3duIHByb3RvY29sIGdpdmVuIHdpdGggLS1wcm90b2NvbDogJXMnICUgb3B0aW9ucy5wcm90bykKKyAgICByZXR1cm4gc3VpdGUKKwogCiBjbGFzcyBPd25BcmdzVGVzdFByb2dyYW0odW5pdHRlc3QuVGVzdFByb2dyYW0pOgogICAgIGRlZiBwYXJzZUFyZ3Moc2VsZiwgYXJndik6CiAgICAgICAgIGlmIGFyZ3M6CiAgICAgICAgICAgICBzZWxmLnRlc3ROYW1lcyA9IGFyZ3MKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYudGVzdE5hbWVzID0gKHNlbGYuZGVmYXVsdFRlc3QsKQorICAgICAgICAgICAgc2VsZi50ZXN0TmFtZXMgPSAoW3NlbGYuZGVmYXVsdFRlc3RdKQogICAgICAgICBzZWxmLmNyZWF0ZVRlc3RzKCkKIAorCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgotICBPd25BcmdzVGVzdFByb2dyYW0oZGVmYXVsdFRlc3Q9InN1aXRlIiwgdGVzdFJ1bm5lcj11bml0dGVzdC5UZXh0VGVzdFJ1bm5lcih2ZXJib3NpdHk9MSkpCisgICAgcGFyc2VyID0gT3B0aW9uUGFyc2VyKCkKKyAgICBwYXJzZXIuYWRkX29wdGlvbignLS1saWJweWRpcicsIHR5cGU9J3N0cmluZycsIGRlc3Q9J2xpYnB5ZGlyJywKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdpbmNsdWRlIHRoaXMgZGlyZWN0b3J5IGluIHN5cy5wYXRoIGZvciBsb2NhdGluZyBsaWJyYXJ5IGNvZGUnKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCctLWdlbnB5ZGlyJywgdHlwZT0nc3RyaW5nJywgZGVzdD0nZ2VucHlkaXInLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J2luY2x1ZGUgdGhpcyBkaXJlY3RvcnkgaW4gc3lzLnBhdGggZm9yIGxvY2F0aW5nIGdlbmVyYXRlZCBjb2RlJykKKyAgICBwYXJzZXIuYWRkX29wdGlvbigiLS1wb3J0IiwgdHlwZT0iaW50IiwgZGVzdD0icG9ydCIsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0iY29ubmVjdCB0byBzZXJ2ZXIgYXQgcG9ydCIpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oIi0taG9zdCIsIHR5cGU9InN0cmluZyIsIGRlc3Q9Imhvc3QiLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9ImNvbm5lY3QgdG8gc2VydmVyIikKKyAgICBwYXJzZXIuYWRkX29wdGlvbigiLS16bGliIiwgYWN0aW9uPSJzdG9yZV90cnVlIiwgZGVzdD0iemxpYiIsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0idXNlIHpsaWIgd3JhcHBlciBmb3IgY29tcHJlc3NlZCB0cmFuc3BvcnQiKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCItLXNzbCIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsIGRlc3Q9InNzbCIsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0idXNlIFNTTCBmb3IgZW5jcnlwdGVkIHRyYW5zcG9ydCIpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oIi0taHR0cCIsIGRlc3Q9Imh0dHBfcGF0aCIsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0iVXNlIHRoZSBIVFRQIHRyYW5zcG9ydCB3aXRoIHRoZSBzcGVjaWZpZWQgcGF0aCIpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oJy12JywgJy0tdmVyYm9zZScsIGFjdGlvbj0ic3RvcmVfY29uc3QiLAorICAgICAgICAgICAgICAgICAgICAgIGRlc3Q9InZlcmJvc2UiLCBjb25zdD0yLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9InZlcmJvc2Ugb3V0cHV0IikKKyAgICBwYXJzZXIuYWRkX29wdGlvbignLXEnLCAnLS1xdWlldCcsIGFjdGlvbj0ic3RvcmVfY29uc3QiLAorICAgICAgICAgICAgICAgICAgICAgIGRlc3Q9InZlcmJvc2UiLCBjb25zdD0wLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9Im1pbmltYWwgb3V0cHV0IikKKyAgICBwYXJzZXIuYWRkX29wdGlvbignLS1wcm90b2NvbCcsIGRlc3Q9InByb3RvIiwgdHlwZT0ic3RyaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJwcm90b2NvbCB0byB1c2UsIG9uZSBvZjogYWNjZWwsIGFjY2VsYywgYmluYXJ5LCBjb21wYWN0LCBoZWFkZXIsIGpzb24sIG11bHRpLCBtdWx0aWEsIG11bHRpYWMsIG11bHRpYywgbXVsdGlqIikKKyAgICBwYXJzZXIuYWRkX29wdGlvbignLS10cmFuc3BvcnQnLCBkZXN0PSJ0cmFucyIsIHR5cGU9InN0cmluZyIsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0idHJhbnNwb3J0IHRvIHVzZSwgb25lIG9mOiBidWZmZXJlZCwgZnJhbWVkLCBodHRwIikKKyAgICBwYXJzZXIuc2V0X2RlZmF1bHRzKGZyYW1lZD1GYWxzZSwgaHR0cF9wYXRoPU5vbmUsIHZlcmJvc2U9MSwgaG9zdD0nbG9jYWxob3N0JywgcG9ydD05MDkwLCBwcm90bz0nYmluYXJ5JykKKyAgICBvcHRpb25zLCBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQorCisgICAgaWYgb3B0aW9ucy5nZW5weWRpcjoKKyAgICAgICAgc3lzLnBhdGguaW5zZXJ0KDAsIG9zLnBhdGguam9pbihTQ1JJUFRfRElSLCBvcHRpb25zLmdlbnB5ZGlyKSkKKyAgICBzeXMucGF0aC5pbnNlcnQoMCwgbG9jYWxfbGlicGF0aCgpKQorCisgICAgaWYgb3B0aW9ucy5odHRwX3BhdGg6CisgICAgICAgIG9wdGlvbnMudHJhbnMgPSAnaHR0cCcKKworICAgIGZyb20gVGhyaWZ0VGVzdCBpbXBvcnQgU2Vjb25kU2VydmljZQorICAgIGZyb20gVGhyaWZ0VGVzdCBpbXBvcnQgVGhyaWZ0VGVzdAorICAgIGZyb20gVGhyaWZ0VGVzdC50dHlwZXMgaW1wb3J0IFh0cnVjdCwgWHRydWN0MiwgTnVtYmVyeiwgWGNlcHRpb24sIFhjZXB0aW9uMgorICAgIGZyb20gdGhyaWZ0LlRocmlmdCBpbXBvcnQgVEV4Y2VwdGlvbgorICAgIGZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydAorICAgIGZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFNvY2tldAorICAgIGZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVEh0dHBDbGllbnQKKyAgICBmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRabGliVHJhbnNwb3J0CisgICAgZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbAorICAgIGZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQ29tcGFjdFByb3RvY29sCisgICAgZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRIZWFkZXJQcm90b2NvbAorICAgIGZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUSlNPTlByb3RvY29sCisgICAgZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRNdWx0aXBsZXhlZFByb3RvY29sCisKKyAgICBPd25BcmdzVGVzdFByb2dyYW0oZGVmYXVsdFRlc3Q9InN1aXRlIiwgdGVzdFJ1bm5lcj11bml0dGVzdC5UZXh0VGVzdFJ1bm5lcih2ZXJib3NpdHk9MSkpCmRpZmYgLS1naXQgYS90ZXN0L3B5L1Rlc3RFb2YucHkgYi90ZXN0L3B5L1Rlc3RFb2YucHkKaW5kZXggYTlkODFmMS4uMGI0YTgyOSAxMDA3NTUKLS0tIGEvdGVzdC9weS9UZXN0RW9mLnB5CisrKyBiL3Rlc3QvcHkvVGVzdEVvZi5weQpAQCAtMTksMTE4ICsxOSwxMTQgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLWltcG9ydCBzeXMsIGdsb2IKLWZyb20gb3B0cGFyc2UgaW1wb3J0IE9wdGlvblBhcnNlcgotcGFyc2VyID0gT3B0aW9uUGFyc2VyKCkKLXBhcnNlci5hZGRfb3B0aW9uKCctLWdlbnB5ZGlyJywgdHlwZT0nc3RyaW5nJywgZGVzdD0nZ2VucHlkaXInLCBkZWZhdWx0PSdnZW4tcHknKQotb3B0aW9ucywgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKLWRlbCBzeXMuYXJndlsxOl0gIyBjbGVhbiB1cCBoYWNrIHNvIHVuaXR0ZXN0IGRvZXNuJ3QgY29tcGxhaW4KLXN5cy5wYXRoLmluc2VydCgwLCBvcHRpb25zLmdlbnB5ZGlyKQotc3lzLnBhdGguaW5zZXJ0KDAsIGdsb2IuZ2xvYignLi4vLi4vbGliL3B5L2J1aWxkL2xpYi4qJylbMF0pCi0KLWZyb20gVGhyaWZ0VGVzdCBpbXBvcnQgVGhyaWZ0VGVzdAotZnJvbSBUaHJpZnRUZXN0LnR0eXBlcyBpbXBvcnQgKgorZnJvbSBUaHJpZnRUZXN0LnR0eXBlcyBpbXBvcnQgWHRydWN0CiBmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQKLWZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFNvY2tldAogZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbAogZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRDb21wYWN0UHJvdG9jb2wKIGltcG9ydCB1bml0dGVzdAotaW1wb3J0IHRpbWUKKwogCiBjbGFzcyBUZXN0RW9mKHVuaXR0ZXN0LlRlc3RDYXNlKToKIAotICBkZWYgbWFrZV9kYXRhKHNlbGYsIHBmYWN0b3J5PU5vbmUpOgotICAgIHRyYW5zID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKCkKLSAgICBpZiBwZmFjdG9yeToKLSAgICAgIHByb3QgPSBwZmFjdG9yeS5nZXRQcm90b2NvbCh0cmFucykKLSAgICBlbHNlOgotICAgICAgcHJvdCA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2wodHJhbnMpCisgICAgZGVmIG1ha2VfZGF0YShzZWxmLCBwZmFjdG9yeT1Ob25lKToKKyAgICAgICAgdHJhbnMgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoKQorICAgICAgICBpZiBwZmFjdG9yeToKKyAgICAgICAgICAgIHByb3QgPSBwZmFjdG9yeS5nZXRQcm90b2NvbCh0cmFucykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByb3QgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sKHRyYW5zKQogCi0gICAgeCA9IFh0cnVjdCgpCi0gICAgeC5zdHJpbmdfdGhpbmcgPSAiWmVybyIKLSAgICB4LmJ5dGVfdGhpbmcgPSAwCisgICAgICAgIHggPSBYdHJ1Y3QoKQorICAgICAgICB4LnN0cmluZ190aGluZyA9ICJaZXJvIgorICAgICAgICB4LmJ5dGVfdGhpbmcgPSAwCiAKLSAgICB4LndyaXRlKHByb3QpCisgICAgICAgIHgud3JpdGUocHJvdCkKIAotICAgIHggPSBYdHJ1Y3QoKQotICAgIHguc3RyaW5nX3RoaW5nID0gIk9uZSIKLSAgICB4LmJ5dGVfdGhpbmcgPSAxCisgICAgICAgIHggPSBYdHJ1Y3QoKQorICAgICAgICB4LnN0cmluZ190aGluZyA9ICJPbmUiCisgICAgICAgIHguYnl0ZV90aGluZyA9IDEKIAotICAgIHgud3JpdGUocHJvdCkKKyAgICAgICAgeC53cml0ZShwcm90KQogCi0gICAgcmV0dXJuIHRyYW5zLmdldHZhbHVlKCkKKyAgICAgICAgcmV0dXJuIHRyYW5zLmdldHZhbHVlKCkKIAotICBkZWYgdGVzdFRyYW5zcG9ydFJlYWRBbGwoc2VsZik6Ci0gICAgIiIiVGVzdCB0aGF0IHJlYWRBbGwgb24gYW55IHR5cGUgb2YgdHJhbnNwb3J0IHRocm93cyBhbiBFT0ZFcnJvciIiIgotICAgIHRyYW5zID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKHNlbGYubWFrZV9kYXRhKCkpCi0gICAgdHJhbnMucmVhZEFsbCgxKQorICAgIGRlZiB0ZXN0VHJhbnNwb3J0UmVhZEFsbChzZWxmKToKKyAgICAgICAgIiIiVGVzdCB0aGF0IHJlYWRBbGwgb24gYW55IHR5cGUgb2YgdHJhbnNwb3J0IHRocm93cyBhbiBFT0ZFcnJvciIiIgorICAgICAgICB0cmFucyA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcihzZWxmLm1ha2VfZGF0YSgpKQorICAgICAgICB0cmFucy5yZWFkQWxsKDEpCiAKLSAgICB0cnk6Ci0gICAgICB0cmFucy5yZWFkQWxsKDEwMDAwKQotICAgIGV4Y2VwdCBFT0ZFcnJvcjoKLSAgICAgIHJldHVybgorICAgICAgICB0cnk6CisgICAgICAgICAgICB0cmFucy5yZWFkQWxsKDEwMDAwKQorICAgICAgICBleGNlcHQgRU9GRXJyb3I6CisgICAgICAgICAgICByZXR1cm4KIAotICAgIHNlbGYuZmFpbCgiU2hvdWxkIGhhdmUgZ290dGVuIEVPRkVycm9yIikKKyAgICAgICAgc2VsZi5mYWlsKCJTaG91bGQgaGF2ZSBnb3R0ZW4gRU9GRXJyb3IiKQogCi0gIGRlZiBlb2ZUZXN0SGVscGVyKHNlbGYsIHBmYWN0b3J5KToKLSAgICB0cmFucyA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcihzZWxmLm1ha2VfZGF0YShwZmFjdG9yeSkpCi0gICAgcHJvdCA9IHBmYWN0b3J5LmdldFByb3RvY29sKHRyYW5zKQorICAgIGRlZiBlb2ZUZXN0SGVscGVyKHNlbGYsIHBmYWN0b3J5KToKKyAgICAgICAgdHJhbnMgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoc2VsZi5tYWtlX2RhdGEocGZhY3RvcnkpKQorICAgICAgICBwcm90ID0gcGZhY3RvcnkuZ2V0UHJvdG9jb2wodHJhbnMpCiAKLSAgICB4ID0gWHRydWN0KCkKLSAgICB4LnJlYWQocHJvdCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHguc3RyaW5nX3RoaW5nLCAiWmVybyIpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCh4LmJ5dGVfdGhpbmcsIDApCi0KLSAgICB4ID0gWHRydWN0KCkKLSAgICB4LnJlYWQocHJvdCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHguc3RyaW5nX3RoaW5nLCAiT25lIikKLSAgICBzZWxmLmFzc2VydEVxdWFsKHguYnl0ZV90aGluZywgMSkKLQotICAgIHRyeToKLSAgICAgIHggPSBYdHJ1Y3QoKQotICAgICAgeC5yZWFkKHByb3QpCi0gICAgZXhjZXB0IEVPRkVycm9yOgotICAgICAgcmV0dXJuCi0KLSAgICBzZWxmLmZhaWwoIlNob3VsZCBoYXZlIGdvdHRlbiBFT0ZFcnJvciIpCi0KLSAgZGVmIGVvZlRlc3RIZWxwZXJTdHJlc3Moc2VsZiwgcGZhY3RvcnkpOgotICAgICIiIlRlZXN0IHRoZSBhYmlsaXR5IG9mIFRCaW5hcnlQcm90b2NvbCB0byBkZWFsIHdpdGggdGhlIHJlbW92YWwgb2YgZXZlcnkgYnl0ZSBpbiB0aGUgZmlsZSIiIgotICAgICMgVE9ETzogd2Ugc2hvdWxkIG1ha2Ugc3VyZSB0aGlzIGNvdmVycyBtb3JlIG9mIHRoZSBjb2RlIHBhdGhzCi0KLSAgICBkYXRhID0gc2VsZi5tYWtlX2RhdGEocGZhY3RvcnkpCi0gICAgZm9yIGkgaW4geHJhbmdlKDAsIGxlbihkYXRhKSArIDEpOgotICAgICAgdHJhbnMgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoZGF0YVswOmldKQotICAgICAgcHJvdCA9IHBmYWN0b3J5LmdldFByb3RvY29sKHRyYW5zKQotICAgICAgdHJ5OgogICAgICAgICB4ID0gWHRydWN0KCkKICAgICAgICAgeC5yZWFkKHByb3QpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5zdHJpbmdfdGhpbmcsICJaZXJvIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LmJ5dGVfdGhpbmcsIDApCisKKyAgICAgICAgeCA9IFh0cnVjdCgpCiAgICAgICAgIHgucmVhZChwcm90KQotICAgICAgICB4LnJlYWQocHJvdCkKLSAgICAgIGV4Y2VwdCBFT0ZFcnJvcjoKLSAgICAgICAgY29udGludWUKLSAgICAgIHNlbGYuZmFpbCgiU2hvdWxkIGhhdmUgZ290dGVuIGFuIEVPRkVycm9yIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LnN0cmluZ190aGluZywgIk9uZSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5ieXRlX3RoaW5nLCAxKQogCi0gIGRlZiB0ZXN0QmluYXJ5UHJvdG9jb2xFb2Yoc2VsZik6Ci0gICAgIiIiVGVzdCB0aGF0IFRCaW5hcnlQcm90b2NvbCB0aHJvd3MgYW4gRU9GRXJyb3Igd2hlbiBpdCByZWFjaGVzIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSIiIgotICAgIHNlbGYuZW9mVGVzdEhlbHBlcihUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKQotICAgIHNlbGYuZW9mVGVzdEhlbHBlclN0cmVzcyhUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB4ID0gWHRydWN0KCkKKyAgICAgICAgICAgIHgucmVhZChwcm90KQorICAgICAgICBleGNlcHQgRU9GRXJyb3I6CisgICAgICAgICAgICByZXR1cm4KIAotICBkZWYgdGVzdEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWRFb2Yoc2VsZik6Ci0gICAgIiIiVGVzdCB0aGF0IFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkIHRocm93cyBhbiBFT0ZFcnJvciB3aGVuIGl0IHJlYWNoZXMgdGhlIGVuZCBvZiB0aGUgc3RyZWFtIiIiCi0gICAgc2VsZi5lb2ZUZXN0SGVscGVyKFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3RvcnkoKSkKLSAgICBzZWxmLmVvZlRlc3RIZWxwZXJTdHJlc3MoVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeSgpKQorICAgICAgICBzZWxmLmZhaWwoIlNob3VsZCBoYXZlIGdvdHRlbiBFT0ZFcnJvciIpCiAKLSAgZGVmIHRlc3RDb21wYWN0UHJvdG9jb2xFb2Yoc2VsZik6Ci0gICAgIiIiVGVzdCB0aGF0IFRDb21wYWN0UHJvdG9jb2wgdGhyb3dzIGFuIEVPRkVycm9yIHdoZW4gaXQgcmVhY2hlcyB0aGUgZW5kIG9mIHRoZSBzdHJlYW0iIiIKLSAgICBzZWxmLmVvZlRlc3RIZWxwZXIoVENvbXBhY3RQcm90b2NvbC5UQ29tcGFjdFByb3RvY29sRmFjdG9yeSgpKQotICAgIHNlbGYuZW9mVGVzdEhlbHBlclN0cmVzcyhUQ29tcGFjdFByb3RvY29sLlRDb21wYWN0UHJvdG9jb2xGYWN0b3J5KCkpCisgICAgZGVmIGVvZlRlc3RIZWxwZXJTdHJlc3Moc2VsZiwgcGZhY3RvcnkpOgorICAgICAgICAiIiJUZXN0IHRoZSBhYmlsaXR5IG9mIFRCaW5hcnlQcm90b2NvbCB0byBkZWFsIHdpdGggdGhlIHJlbW92YWwgb2YgZXZlcnkgYnl0ZSBpbiB0aGUgZmlsZSIiIgorICAgICAgICAjIFRPRE86IHdlIHNob3VsZCBtYWtlIHN1cmUgdGhpcyBjb3ZlcnMgbW9yZSBvZiB0aGUgY29kZSBwYXRocworCisgICAgICAgIGRhdGEgPSBzZWxmLm1ha2VfZGF0YShwZmFjdG9yeSkKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMCwgbGVuKGRhdGEpICsgMSk6CisgICAgICAgICAgICB0cmFucyA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcihkYXRhWzA6aV0pCisgICAgICAgICAgICBwcm90ID0gcGZhY3RvcnkuZ2V0UHJvdG9jb2wodHJhbnMpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgeCA9IFh0cnVjdCgpCisgICAgICAgICAgICAgICAgeC5yZWFkKHByb3QpCisgICAgICAgICAgICAgICAgeC5yZWFkKHByb3QpCisgICAgICAgICAgICAgICAgeC5yZWFkKHByb3QpCisgICAgICAgICAgICBleGNlcHQgRU9GRXJyb3I6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiU2hvdWxkIGhhdmUgZ290dGVuIGFuIEVPRkVycm9yIikKKworICAgIGRlZiB0ZXN0QmluYXJ5UHJvdG9jb2xFb2Yoc2VsZik6CisgICAgICAgICIiIlRlc3QgdGhhdCBUQmluYXJ5UHJvdG9jb2wgdGhyb3dzIGFuIEVPRkVycm9yIHdoZW4gaXQgcmVhY2hlcyB0aGUgZW5kIG9mIHRoZSBzdHJlYW0iIiIKKyAgICAgICAgc2VsZi5lb2ZUZXN0SGVscGVyKFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpCisgICAgICAgIHNlbGYuZW9mVGVzdEhlbHBlclN0cmVzcyhUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKQorCisgICAgZGVmIHRlc3RCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkQmluYXJ5RW9mKHNlbGYpOgorICAgICAgICAiIiJUZXN0IHRoYXQgVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQgdGhyb3dzIGFuIEVPRkVycm9yIHdoZW4gaXQgcmVhY2hlcyB0aGUgZW5kIG9mIHRoZSBzdHJlYW0iIiIKKyAgICAgICAgc2VsZi5lb2ZUZXN0SGVscGVyKFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3RvcnkoZmFsbGJhY2s9RmFsc2UpKQorICAgICAgICBzZWxmLmVvZlRlc3RIZWxwZXJTdHJlc3MoVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeShmYWxsYmFjaz1GYWxzZSkpCisKKyAgICBkZWYgdGVzdENvbXBhY3RQcm90b2NvbEVvZihzZWxmKToKKyAgICAgICAgIiIiVGVzdCB0aGF0IFRDb21wYWN0UHJvdG9jb2wgdGhyb3dzIGFuIEVPRkVycm9yIHdoZW4gaXQgcmVhY2hlcyB0aGUgZW5kIG9mIHRoZSBzdHJlYW0iIiIKKyAgICAgICAgc2VsZi5lb2ZUZXN0SGVscGVyKFRDb21wYWN0UHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbEZhY3RvcnkoKSkKKyAgICAgICAgc2VsZi5lb2ZUZXN0SGVscGVyU3RyZXNzKFRDb21wYWN0UHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbEZhY3RvcnkoKSkKKworICAgIGRlZiB0ZXN0Q29tcGFjdFByb3RvY29sQWNjZWxlcmF0ZWRDb21wYWN0RW9mKHNlbGYpOgorICAgICAgICAiIiJUZXN0IHRoYXQgVENvbXBhY3RQcm90b2NvbEFjY2VsZXJhdGVkIHRocm93cyBhbiBFT0ZFcnJvciB3aGVuIGl0IHJlYWNoZXMgdGhlIGVuZCBvZiB0aGUgc3RyZWFtIiIiCisgICAgICAgIHNlbGYuZW9mVGVzdEhlbHBlcihUQ29tcGFjdFByb3RvY29sLlRDb21wYWN0UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3RvcnkoZmFsbGJhY2s9RmFsc2UpKQorICAgICAgICBzZWxmLmVvZlRlc3RIZWxwZXJTdHJlc3MoVENvbXBhY3RQcm90b2NvbC5UQ29tcGFjdFByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5KGZhbGxiYWNrPUZhbHNlKSkKKwogCiBkZWYgc3VpdGUoKToKLSAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQotICBsb2FkZXIgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkKLSAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKFRlc3RFb2YpKQotICByZXR1cm4gc3VpdGUKKyAgICBzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpCisgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisgICAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKFRlc3RFb2YpKQorICAgIHJldHVybiBzdWl0ZQorCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6Ci0gIHVuaXR0ZXN0Lm1haW4oZGVmYXVsdFRlc3Q9InN1aXRlIiwgdGVzdFJ1bm5lcj11bml0dGVzdC5UZXh0VGVzdFJ1bm5lcih2ZXJib3NpdHk9MikpCisgICAgdW5pdHRlc3QubWFpbihkZWZhdWx0VGVzdD0ic3VpdGUiLCB0ZXN0UnVubmVyPXVuaXR0ZXN0LlRleHRUZXN0UnVubmVyKHZlcmJvc2l0eT0yKSkKZGlmZiAtLWdpdCBhL3Rlc3QvcHkvVGVzdEZyb3plbi5weSBiL3Rlc3QvcHkvVGVzdEZyb3plbi5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42ZDI1OTVjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9weS9UZXN0RnJvemVuLnB5CkBAIC0wLDAgKzEsMTIzIEBACisjIS91c3IvYmluL2VudiBweXRob24KKworIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2Zyb20gRGVidWdQcm90b1Rlc3QudHR5cGVzIGltcG9ydCBDb21wYWN0UHJvdG9UZXN0U3RydWN0LCBFbXB0eSwgV3JhcHBlcgorZnJvbSB0aHJpZnQuVGhyaWZ0IGltcG9ydCBURnJvemVuRGljdAorZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0Citmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sLCBUQ29tcGFjdFByb3RvY29sCitpbXBvcnQgY29sbGVjdGlvbnMKK2ltcG9ydCB1bml0dGVzdAorCisKK2NsYXNzIFRlc3RGcm96ZW5CYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgX3JvdW5kdHJpcChzZWxmLCBzcmMsIGRzdCk6CisgICAgICAgIG90cmFucyA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcigpCisgICAgICAgIG9wdG9ybyA9IHNlbGYucHJvdG9jb2wob3RyYW5zKQorICAgICAgICBzcmMud3JpdGUob3B0b3JvKQorICAgICAgICBpdHJhbnMgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIob3RyYW5zLmdldHZhbHVlKCkpCisgICAgICAgIGlwcm90byA9IHNlbGYucHJvdG9jb2woaXRyYW5zKQorICAgICAgICByZXR1cm4gZHN0LnJlYWQoaXByb3RvKSBvciBkc3QKKworICAgIGRlZiB0ZXN0X2RpY3RfaXNfaGFzaGFibGVfb25seV9hZnRlcl9mcm96ZW4oc2VsZik6CisgICAgICAgIGQwID0ge30KKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc2luc3RhbmNlKGQwLCBjb2xsZWN0aW9ucy5IYXNoYWJsZSkpCisgICAgICAgIGQxID0gVEZyb3plbkRpY3QoZDApCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKGQxLCBjb2xsZWN0aW9ucy5IYXNoYWJsZSkpCisKKyAgICBkZWYgdGVzdF9zdHJ1Y3Rfd2l0aF9jb2xsZWN0aW9uX2ZpZWxkcyhzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIHRlc3Rfc2V0KHNlbGYpOgorICAgICAgICAiIiJUZXN0IHRoYXQgYW5ub3RhdGVkIHNldCBmaWVsZCBjYW4gYmUgc2VyaWFsaXplZCBhbmQgZGVzZXJpYWxpemVkIiIiCisgICAgICAgIHggPSBDb21wYWN0UHJvdG9UZXN0U3RydWN0KHNldF9ieXRlX21hcD17CisgICAgICAgICAgICBmcm96ZW5zZXQoWzQyLCAxMDAsIC0xMDBdKTogOTksCisgICAgICAgICAgICBmcm96ZW5zZXQoWzBdKTogMTAwLAorICAgICAgICAgICAgZnJvemVuc2V0KFtdKTogMCwKKyAgICAgICAgfSkKKyAgICAgICAgeDIgPSBzZWxmLl9yb3VuZHRyaXAoeCwgQ29tcGFjdFByb3RvVGVzdFN0cnVjdCgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgyLnNldF9ieXRlX21hcFtmcm96ZW5zZXQoWzQyLCAxMDAsIC0xMDBdKV0sIDk5KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgyLnNldF9ieXRlX21hcFtmcm96ZW5zZXQoWzBdKV0sIDEwMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4Mi5zZXRfYnl0ZV9tYXBbZnJvemVuc2V0KFtdKV0sIDApCisKKyAgICBkZWYgdGVzdF9tYXAoc2VsZik6CisgICAgICAgICIiIlRlc3QgdGhhdCBhbm5vdGF0ZWQgbWFwIGZpZWxkIGNhbiBiZSBzZXJpYWxpemVkIGFuZCBkZXNlcmlhbGl6ZWQiIiIKKyAgICAgICAgeCA9IENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QobWFwX2J5dGVfbWFwPXsKKyAgICAgICAgICAgIFRGcm96ZW5EaWN0KHs0MjogNDIsIDEwMDogLTEwMH0pOiA5OSwKKyAgICAgICAgICAgIFRGcm96ZW5EaWN0KHswOiAwfSk6IDEwMCwKKyAgICAgICAgICAgIFRGcm96ZW5EaWN0KHt9KTogMCwKKyAgICAgICAgfSkKKyAgICAgICAgeDIgPSBzZWxmLl9yb3VuZHRyaXAoeCwgQ29tcGFjdFByb3RvVGVzdFN0cnVjdCgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgyLm1hcF9ieXRlX21hcFtURnJvemVuRGljdCh7NDI6IDQyLCAxMDA6IC0xMDB9KV0sIDk5KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgyLm1hcF9ieXRlX21hcFtURnJvemVuRGljdCh7MDogMH0pXSwgMTAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgyLm1hcF9ieXRlX21hcFtURnJvemVuRGljdCh7fSldLCAwKQorCisgICAgZGVmIHRlc3RfbGlzdChzZWxmKToKKyAgICAgICAgIiIiVGVzdCB0aGF0IGFubm90YXRlZCBsaXN0IGZpZWxkIGNhbiBiZSBzZXJpYWxpemVkIGFuZCBkZXNlcmlhbGl6ZWQiIiIKKyAgICAgICAgeCA9IENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QobGlzdF9ieXRlX21hcD17CisgICAgICAgICAgICAoNDIsIDEwMCwgLTEwMCk6IDk5LAorICAgICAgICAgICAgKDAsKTogMTAwLAorICAgICAgICAgICAgKCk6IDAsCisgICAgICAgIH0pCisgICAgICAgIHgyID0gc2VsZi5fcm91bmR0cmlwKHgsIENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4Mi5saXN0X2J5dGVfbWFwWyg0MiwgMTAwLCAtMTAwKV0sIDk5KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgyLmxpc3RfYnl0ZV9tYXBbKDAsKV0sIDEwMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4Mi5saXN0X2J5dGVfbWFwWygpXSwgMCkKKworICAgIGRlZiB0ZXN0X2VtcHR5X3N0cnVjdChzZWxmKToKKyAgICAgICAgIiIiVGVzdCB0aGF0IGFubm90YXRlZCBlbXB0eSBzdHJ1Y3QgY2FuIGJlIHNlcmlhbGl6ZWQgYW5kIGRlc2VyaWFsaXplZCIiIgorICAgICAgICB4ID0gQ29tcGFjdFByb3RvVGVzdFN0cnVjdChlbXB0eV9zdHJ1Y3RfZmllbGQ9RW1wdHkoKSkKKyAgICAgICAgeDIgPSBzZWxmLl9yb3VuZHRyaXAoeCwgQ29tcGFjdFByb3RvVGVzdFN0cnVjdCgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgyLmVtcHR5X3N0cnVjdF9maWVsZCwgRW1wdHkoKSkKKworICAgIGRlZiB0ZXN0X3N0cnVjdChzZWxmKToKKyAgICAgICAgIiIiVGVzdCB0aGF0IGFubm90YXRlZCBzdHJ1Y3QgY2FuIGJlIHNlcmlhbGl6ZWQgYW5kIGRlc2VyaWFsaXplZCIiIgorICAgICAgICB4ID0gV3JhcHBlcihmb289RW1wdHkoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LmZvbywgRW1wdHkoKSkKKyAgICAgICAgeDIgPSBzZWxmLl9yb3VuZHRyaXAoeCwgV3JhcHBlcikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4Mi5mb28sIEVtcHR5KCkpCisKKworY2xhc3MgVGVzdEZyb3plbihUZXN0RnJvemVuQmFzZSk6CisgICAgZGVmIHByb3RvY29sKHNlbGYsIHRyYW5zKToKKyAgICAgICAgcmV0dXJuIFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkuZ2V0UHJvdG9jb2wodHJhbnMpCisKKworY2xhc3MgVGVzdEZyb3plbkFjY2VsZXJhdGVkQmluYXJ5KFRlc3RGcm96ZW5CYXNlKToKKyAgICBkZWYgcHJvdG9jb2woc2VsZiwgdHJhbnMpOgorICAgICAgICByZXR1cm4gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeShmYWxsYmFjaz1GYWxzZSkuZ2V0UHJvdG9jb2wodHJhbnMpCisKKworY2xhc3MgVGVzdEZyb3plbkFjY2VsZXJhdGVkQ29tcGFjdChUZXN0RnJvemVuQmFzZSk6CisgICAgZGVmIHByb3RvY29sKHNlbGYsIHRyYW5zKToKKyAgICAgICAgcmV0dXJuIFRDb21wYWN0UHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeShmYWxsYmFjaz1GYWxzZSkuZ2V0UHJvdG9jb2wodHJhbnMpCisKKworZGVmIHN1aXRlKCk6CisgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQorICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQorICAgIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShUZXN0RnJvemVuKSkKKyAgICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoVGVzdEZyb3plbkFjY2VsZXJhdGVkQmluYXJ5KSkKKyAgICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoVGVzdEZyb3plbkFjY2VsZXJhdGVkQ29tcGFjdCkpCisgICAgcmV0dXJuIHN1aXRlCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB1bml0dGVzdC5tYWluKGRlZmF1bHRUZXN0PSJzdWl0ZSIsIHRlc3RSdW5uZXI9dW5pdHRlc3QuVGV4dFRlc3RSdW5uZXIodmVyYm9zaXR5PTIpKQpkaWZmIC0tZ2l0IGEvdGVzdC9weS9UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMucHkgYi90ZXN0L3B5L1Rlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDkwM2Q4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9weS9UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMucHkKQEAgLTAsMCArMSwxNzcgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitpbXBvcnQgdW5pdHRlc3QKKworZnJvbSBEb3VibGVDb25zdGFudHNUZXN0IGltcG9ydCBjb25zdGFudHMKKworIworIyBJbiBvcmRlciB0byBydW4gdGhlIHRlc3QgdW5kZXIgV2luZG93cy4gV2UgbmVlZCB0byBjcmVhdGUgc3ltYm9saWMgbGluaworIyBuYW1lICd0aHJpZnQnIHRvICcuLi9zcmMnIGZvbGRlciBieSB1c2luZzoKKyMKKyMgbWtsaW5rIC9EIHRocmlmdCAuLlxzcmMKKyMKKworCitjbGFzcyBUZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9SRU5ERVJFRF9ET1VCTEVfQ09OU1RBTlRTX1RFU1QgPSBcCisgICAgICAgICJmYWlsZWQgdG8gdmVyaWZ5IGEgZG91YmxlIGNvbnN0YW50IGdlbmVyYXRlZCBieSBUaHJpZnQgKGV4cGVjdGVkID0gJWYsIGdvdCA9ICVmKSIKKyAgICBBU1NFUlRJT05fTUVTU0FHRV9GT1JfUkVOREVSRURfRE9VQkxFX0xJU1RfVEVTVCA9XAorICAgICAgICAiZmFpbGVkIHRvIHZlcmlmeSBhIGxpc3QgaXRlbSBieSBUaHJpZnQgKGV4cGVjdGVkID0gJWYsIGdvdCA9ICVmKSIKKyAgICBBU1NFUlRJT05fTUVTU0FHRV9GT1JfVFlQRV9DSEVDS1MgPSAidGhlIHJlbmRlcmVkIHZhcmlhYmxlIHdpdGggbmFtZSAlcyBpcyBub3Qgb2YgZG91YmxlIHR5cGUiCisKKyAgICAjIHRvIG1ha2Ugc3VyZSB0aGUgdmFyaWFibGVzIGluc2lkZSBUaHJpZnQgZmlsZXMgYXJlIGdlbmVyYXRlZCBjb3JyZWN0bHkKKyAgICBkZWYgdGVzdF9yZW5kZXJlZF9kb3VibGVfY29uc3RhbnRzKHNlbGYpOgorICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fSU5UX0NPTlNUQU5UID0gMS4wCisgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9JTlRfQ09OU1RBTlQgPSAtMTAwLjAKKyAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFU1RfSU5UX0NPTlNUQU5UID0gOTIyMzM3MjAzNjg1NDc3NTgwNy4wCisgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19TTUFMTEVTVF9JTlRfQ09OU1RBTlQgPSAtOTIyMzM3MjAzNjg1NDc3NTgwNy4wCisgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ET1VCTEVfV0lUSF9NQU5ZX0RFQ0lNQUxTID0gMy4xNDE1OTI2NTM1OQorICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fRlJBQ1RJT05BTF9ET1VCTEUgPSAxMDAwMDAwLjEKKyAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0ZSQUNUSU9OQUxfRE9VQkxFID0gLTEwMDAwMDAuMQorICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRE9VQkxFID0gMS43ZSszMDgKKyAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFID0gOTIyMzM3MjAzNjg1NDc3NTgxNi40MworICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fU01BTExfRE9VQkxFID0gLTEuN2UrMzA4CisgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9CVVRfTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEUgPSAtOTIyMzM3MjAzNjg1NDc3NTgxNi40MworICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKAorICAgICAgICAgICAgY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19JTlRfQ09OU1RBTlRfVEVTVCwgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0lOVF9DT05TVEFOVCwgcGxhY2VzPTcsCisgICAgICAgICAgICBtc2c9VGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLkFTU0VSVElPTl9NRVNTQUdFX0ZPUl9SRU5ERVJFRF9ET1VCTEVfQ09OU1RBTlRTX1RFU1QgJSAoCisgICAgICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0lOVF9DT05TVEFOVCwgY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19JTlRfQ09OU1RBTlRfVEVTVCkpCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoCisgICAgICAgICAgICBjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0lOVF9DT05TVEFOVF9URVNULCBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfSU5UX0NPTlNUQU5ULAorICAgICAgICAgICAgcGxhY2VzPTcsCisgICAgICAgICAgICBtc2c9VGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLkFTU0VSVElPTl9NRVNTQUdFX0ZPUl9SRU5ERVJFRF9ET1VCTEVfQ09OU1RBTlRTX1RFU1QgJSAoCisgICAgICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0lOVF9DT05TVEFOVCwKKyAgICAgICAgICAgICAgICBjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0lOVF9DT05TVEFOVF9URVNUKSkKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbCgKKyAgICAgICAgICAgIGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VTVF9JTlRfQ09OU1RBTlRfVEVTVCwgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFU1RfSU5UX0NPTlNUQU5ULAorICAgICAgICAgICAgcGxhY2VzPTcsCisgICAgICAgICAgICBtc2c9VGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLkFTU0VSVElPTl9NRVNTQUdFX0ZPUl9SRU5ERVJFRF9ET1VCTEVfQ09OU1RBTlRTX1RFU1QgJSAoCisgICAgICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFU1RfSU5UX0NPTlNUQU5ULAorICAgICAgICAgICAgICAgIGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VTVF9JTlRfQ09OU1RBTlRfVEVTVCkpCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoCisgICAgICAgICAgICBjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMRVNUX0lOVF9DT05TVEFOVF9URVNULCBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fU01BTExFU1RfSU5UX0NPTlNUQU5ULAorICAgICAgICAgICAgcGxhY2VzPTcsCisgICAgICAgICAgICBtc2c9VGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLkFTU0VSVElPTl9NRVNTQUdFX0ZPUl9SRU5ERVJFRF9ET1VCTEVfQ09OU1RBTlRTX1RFU1QgJSAoCisgICAgICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMRVNUX0lOVF9DT05TVEFOVCwKKyAgICAgICAgICAgICAgICBjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMRVNUX0lOVF9DT05TVEFOVF9URVNUKSkKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbCgKKyAgICAgICAgICAgIGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fRE9VQkxFX1dJVEhfTUFOWV9ERUNJTUFMU19URVNULAorICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0RPVUJMRV9XSVRIX01BTllfREVDSU1BTFMsIHBsYWNlcz03LAorICAgICAgICAgICAgbXNnPVRlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cy5BU1NFUlRJT05fTUVTU0FHRV9GT1JfUkVOREVSRURfRE9VQkxFX0NPTlNUQU5UU19URVNUICUgKAorICAgICAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ET1VCTEVfV0lUSF9NQU5ZX0RFQ0lNQUxTLAorICAgICAgICAgICAgICAgIGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fRE9VQkxFX1dJVEhfTUFOWV9ERUNJTUFMU19URVNUKSkKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbCgKKyAgICAgICAgICAgIGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCwgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0ZSQUNUSU9OQUxfRE9VQkxFLAorICAgICAgICAgICAgcGxhY2VzPTcsCisgICAgICAgICAgICBtc2c9VGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLkFTU0VSVElPTl9NRVNTQUdFX0ZPUl9SRU5ERVJFRF9ET1VCTEVfQ09OU1RBTlRTX1RFU1QgJSAoCisgICAgICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0ZSQUNUSU9OQUxfRE9VQkxFLAorICAgICAgICAgICAgICAgIGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCkpCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoCisgICAgICAgICAgICBjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QsCisgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfRlJBQ1RJT05BTF9ET1VCTEUsIHBsYWNlcz03LAorICAgICAgICAgICAgbXNnPVRlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cy5BU1NFUlRJT05fTUVTU0FHRV9GT1JfUkVOREVSRURfRE9VQkxFX0NPTlNUQU5UU19URVNUICUgKAorICAgICAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9GUkFDVElPTkFMX0RPVUJMRSwKKyAgICAgICAgICAgICAgICBjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QpKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKAorICAgICAgICAgICAgY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9ET1VCTEVfVEVTVCwgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0RPVUJMRSwgcGxhY2VzPTcsCisgICAgICAgICAgICBtc2c9VGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLkFTU0VSVElPTl9NRVNTQUdFX0ZPUl9SRU5ERVJFRF9ET1VCTEVfQ09OU1RBTlRTX1RFU1QgJSAoCisgICAgICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0RPVUJMRSwKKyAgICAgICAgICAgICAgICBjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0RPVUJMRV9URVNUKSkKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbCgKKyAgICAgICAgICAgIGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCwKKyAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9GUkFDVElPTkFMX0RPVUJMRSwgcGxhY2VzPTcsCisgICAgICAgICAgICBtc2c9VGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLkFTU0VSVElPTl9NRVNTQUdFX0ZPUl9SRU5ERVJFRF9ET1VCTEVfQ09OU1RBTlRTX1RFU1QgJSAoCisgICAgICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFLAorICAgICAgICAgICAgICAgIGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCkpCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoCisgICAgICAgICAgICBjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMX0RPVUJMRV9URVNULCBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fU01BTExfRE9VQkxFLCBwbGFjZXM9NywKKyAgICAgICAgICAgIG1zZz1UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMuQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9DT05TVEFOVFNfVEVTVCAlICgKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fU01BTExfRE9VQkxFLAorICAgICAgICAgICAgICAgIGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fU01BTExfRE9VQkxFX1RFU1QpKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKAorICAgICAgICAgICAgY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9CVVRfTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCwKKyAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9CVVRfTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEUsIHBsYWNlcz03LAorICAgICAgICAgICAgbXNnPVRlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cy5BU1NFUlRJT05fTUVTU0FHRV9GT1JfUkVOREVSRURfRE9VQkxFX0NPTlNUQU5UU19URVNUICUgKAorICAgICAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9CVVRfTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEUsCisgICAgICAgICAgICAgICAgY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9CVVRfTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgIGlzaW5zdGFuY2UoY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19JTlRfQ09OU1RBTlRfVEVTVCwgZmxvYXQpLAorICAgICAgICAgICAgbXNnPVRlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cy5BU1NFUlRJT05fTUVTU0FHRV9GT1JfVFlQRV9DSEVDS1MgJQorICAgICAgICAgICAgIkRPVUJMRV9BU1NJR05FRF9UT19JTlRfQ09OU1RBTlRfVEVTVCIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgIGlzaW5zdGFuY2UoY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9JTlRfQ09OU1RBTlRfVEVTVCwgZmxvYXQpLAorICAgICAgICAgICAgbXNnPVRlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cy5BU1NFUlRJT05fTUVTU0FHRV9GT1JfVFlQRV9DSEVDS1MgJQorICAgICAgICAgICAgIkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9JTlRfQ09OU1RBTlRfVEVTVCIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgIGlzaW5zdGFuY2UoY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRVNUX0lOVF9DT05TVEFOVF9URVNULCBmbG9hdCksCisgICAgICAgICAgICBtc2c9VGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLkFTU0VSVElPTl9NRVNTQUdFX0ZPUl9UWVBFX0NIRUNLUyAlCisgICAgICAgICAgICAiRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFU1RfSU5UX0NPTlNUQU5UX1RFU1QiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoCisgICAgICAgICAgICBpc2luc3RhbmNlKGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fU01BTExFU1RfSU5UX0NPTlNUQU5UX1RFU1QsIGZsb2F0KSwKKyAgICAgICAgICAgIG1zZz1UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMuQVNTRVJUSU9OX01FU1NBR0VfRk9SX1RZUEVfQ0hFQ0tTICUKKyAgICAgICAgICAgICJET1VCTEVfQVNTSUdORURfVE9fU01BTExFU1RfSU5UX0NPTlNUQU5UX1RFU1QiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoCisgICAgICAgICAgICBpc2luc3RhbmNlKGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fRE9VQkxFX1dJVEhfTUFOWV9ERUNJTUFMU19URVNULCBmbG9hdCksCisgICAgICAgICAgICBtc2c9VGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLkFTU0VSVElPTl9NRVNTQUdFX0ZPUl9UWVBFX0NIRUNLUyAlCisgICAgICAgICAgICAiRE9VQkxFX0FTU0lHTkVEX1RPX0RPVUJMRV9XSVRIX01BTllfREVDSU1BTFNfVEVTVCIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgIGlzaW5zdGFuY2UoY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19GUkFDVElPTkFMX0RPVUJMRV9URVNULCBmbG9hdCksCisgICAgICAgICAgICBtc2c9VGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLkFTU0VSVElPTl9NRVNTQUdFX0ZPUl9UWVBFX0NIRUNLUyAlCisgICAgICAgICAgICAiRE9VQkxFX0FTU0lHTkVEX1RPX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoCisgICAgICAgICAgICBpc2luc3RhbmNlKGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCwgZmxvYXQpLAorICAgICAgICAgICAgbXNnPVRlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cy5BU1NFUlRJT05fTUVTU0FHRV9GT1JfVFlQRV9DSEVDS1MgJQorICAgICAgICAgICAgIkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9GUkFDVElPTkFMX0RPVUJMRV9URVNUIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAorICAgICAgICAgICAgaXNpbnN0YW5jZShjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0RPVUJMRV9URVNULCBmbG9hdCksCisgICAgICAgICAgICBtc2c9VGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLkFTU0VSVElPTl9NRVNTQUdFX0ZPUl9UWVBFX0NIRUNLUyAlCisgICAgICAgICAgICAiRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0RPVUJMRV9URVNUIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAorICAgICAgICAgICAgaXNpbnN0YW5jZShjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QsIGZsb2F0KSwKKyAgICAgICAgICAgIG1zZz1UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMuQVNTRVJUSU9OX01FU1NBR0VfRk9SX1RZUEVfQ0hFQ0tTICUKKyAgICAgICAgICAgICJET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgIGlzaW5zdGFuY2UoY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19TTUFMTF9ET1VCTEVfVEVTVCwgZmxvYXQpLAorICAgICAgICAgICAgbXNnPVRlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cy5BU1NFUlRJT05fTUVTU0FHRV9GT1JfVFlQRV9DSEVDS1MgJQorICAgICAgICAgICAgIkRPVUJMRV9BU1NJR05FRF9UT19TTUFMTF9ET1VCTEVfVEVTVCIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgIGlzaW5zdGFuY2UoY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9CVVRfTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCwgZmxvYXQpLAorICAgICAgICAgICAgbXNnPVRlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cy5BU1NFUlRJT05fTUVTU0FHRV9GT1JfVFlQRV9DSEVDS1MgJQorICAgICAgICAgICAgIkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9CVVRfTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCIpCisKKyAgICAjIHRvIG1ha2Ugc3VyZSB0aGUgdmFyaWFibGVzIGluc2lkZSBUaHJpZnQgZmlsZXMgYXJlIGdlbmVyYXRlZCBjb3JyZWN0bHkKKyAgICBkZWYgdGVzdF9yZW5kZXJlZF9kb3VibGVfbGlzdChzZWxmKToKKyAgICAgICAgRVhQRUNURURfRE9VQkxFX0xJU1QgPSBbMS4wLCAtMTAwLjAsIDEwMC4wLCA5MjIzMzcyMDM2ODU0Nzc1ODA3LjAsIC05MjIzMzcyMDM2ODU0Nzc1ODA3LjAsIDMuMTQxNTkyNjUzNTksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAwMDAuMSwgLTEwMDAwMDAuMSwgMS43ZSszMDgsIC0xLjdlKzMwOCwgOTIyMzM3MjAzNjg1NDc3NTgxNi40MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTkyMjMzNzIwMzY4NTQ3NzU4MTYuNDNdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGNvbnN0YW50cy5ET1VCTEVfTElTVF9URVNUKSwgbGVuKEVYUEVDVEVEX0RPVUJMRV9MSVNUKSkKKyAgICAgICAgZm9yIGksIGV4cGVjdGVkVmFsdWUgaW4gZW51bWVyYXRlKEVYUEVDVEVEX0RPVUJMRV9MSVNUKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoY29uc3RhbnRzLkRPVUJMRV9MSVNUX1RFU1RbaV0sIGV4cGVjdGVkVmFsdWUsIHBsYWNlcz03KQorCisKK2RlZiBzdWl0ZSgpOgorICAgIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKKyAgICBsb2FkZXIgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkKKyAgICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoVGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzKSkKKyAgICByZXR1cm4gc3VpdGUKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHVuaXR0ZXN0Lm1haW4oZGVmYXVsdFRlc3Q9InN1aXRlIiwgdGVzdFJ1bm5lcj11bml0dGVzdC5UZXh0VGVzdFJ1bm5lcih2ZXJib3NpdHk9MikpCmRpZmYgLS1naXQgYS90ZXN0L3B5L1Rlc3RTZXJ2ZXIucHkgYi90ZXN0L3B5L1Rlc3RTZXJ2ZXIucHkKaW5kZXggODIwYjgxNi4uYWJhMGQ0MiAxMDA3NTUKLS0tIGEvdGVzdC9weS9UZXN0U2VydmVyLnB5CisrKyBiL3Rlc3QvcHkvVGVzdFNlcnZlci5weQpAQCAtMTksMjM4ICsxOSwzMjQgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiBmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGRpdmlzaW9uCi1pbXBvcnQgc3lzLCBnbG9iLCB0aW1lLCBvcwotc3lzLnBhdGguaW5zZXJ0KDAsIGdsb2IuZ2xvYihvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSwnLi4vLi4vbGliL3B5L2J1aWxkL2xpYi4qJykpWzBdKQoraW1wb3J0IGxvZ2dpbmcKK2ltcG9ydCBvcworaW1wb3J0IHNpZ25hbAoraW1wb3J0IHN5cworaW1wb3J0IHRpbWUKIGZyb20gb3B0cGFyc2UgaW1wb3J0IE9wdGlvblBhcnNlcgogCi1wYXJzZXIgPSBPcHRpb25QYXJzZXIoKQotcGFyc2VyLmFkZF9vcHRpb24oJy0tZ2VucHlkaXInLCB0eXBlPSdzdHJpbmcnLCBkZXN0PSdnZW5weWRpcicsCi0gICAgICAgICAgICAgICAgICBkZWZhdWx0PSdnZW4tcHknLAotICAgICAgICAgICAgICAgICAgaGVscD0naW5jbHVkZSB0aGlzIGxvY2FsIGRpcmVjdG9yeSBpbiBzeXMucGF0aCBmb3IgbG9jYXRpbmcgZ2VuZXJhdGVkIGNvZGUnKQotcGFyc2VyLmFkZF9vcHRpb24oIi0tcG9ydCIsIHR5cGU9ImludCIsIGRlc3Q9InBvcnQiLAotICAgIGhlbHA9InBvcnQgbnVtYmVyIGZvciBzZXJ2ZXIgdG8gbGlzdGVuIG9uIikKLXBhcnNlci5hZGRfb3B0aW9uKCItLXpsaWIiLCBhY3Rpb249InN0b3JlX3RydWUiLCBkZXN0PSJ6bGliIiwKLSAgICBoZWxwPSJ1c2UgemxpYiB3cmFwcGVyIGZvciBjb21wcmVzc2VkIHRyYW5zcG9ydCIpCi1wYXJzZXIuYWRkX29wdGlvbigiLS1zc2wiLCBhY3Rpb249InN0b3JlX3RydWUiLCBkZXN0PSJzc2wiLAotICAgIGhlbHA9InVzZSBTU0wgZm9yIGVuY3J5cHRlZCB0cmFuc3BvcnQiKQotcGFyc2VyLmFkZF9vcHRpb24oJy12JywgJy0tdmVyYm9zZScsIGFjdGlvbj0ic3RvcmVfY29uc3QiLAotICAgIGRlc3Q9InZlcmJvc2UiLCBjb25zdD0yLAotICAgIGhlbHA9InZlcmJvc2Ugb3V0cHV0IikKLXBhcnNlci5hZGRfb3B0aW9uKCctcScsICctLXF1aWV0JywgYWN0aW9uPSJzdG9yZV9jb25zdCIsCi0gICAgZGVzdD0idmVyYm9zZSIsIGNvbnN0PTAsCi0gICAgaGVscD0ibWluaW1hbCBvdXRwdXQiKQotcGFyc2VyLmFkZF9vcHRpb24oJy0tcHJvdG9jb2wnLCAgZGVzdD0icHJvdG8iLCB0eXBlPSJzdHJpbmciLAotICAgIGhlbHA9InByb3RvY29sIHRvIHVzZSwgb25lIG9mOiBhY2NlbCwgYmluYXJ5LCBjb21wYWN0LCBqc29uIikKLXBhcnNlci5hZGRfb3B0aW9uKCctLXRyYW5zcG9ydCcsICBkZXN0PSJ0cmFucyIsIHR5cGU9InN0cmluZyIsCi0gICAgaGVscD0idHJhbnNwb3J0IHRvIHVzZSwgb25lIG9mOiBidWZmZXJlZCwgZnJhbWVkIikKLXBhcnNlci5zZXRfZGVmYXVsdHMocG9ydD05MDkwLCB2ZXJib3NlPTEsIHByb3RvPSdiaW5hcnknKQotb3B0aW9ucywgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKK2Zyb20gdXRpbCBpbXBvcnQgbG9jYWxfbGlicGF0aAogCi1zY3JpcHRfZGlyID0gb3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSAjPC0tIGFic29sdXRlIGRpciB0aGUgc2NyaXB0IGlzIGluCi1zeXMucGF0aC5pbnNlcnQoMCwgb3MucGF0aC5qb2luKHNjcmlwdF9kaXIsIG9wdGlvbnMuZ2VucHlkaXIpKQotCi1mcm9tIFRocmlmdFRlc3QgaW1wb3J0IFRocmlmdFRlc3QKLWZyb20gVGhyaWZ0VGVzdC50dHlwZXMgaW1wb3J0ICoKLWZyb20gdGhyaWZ0LlRocmlmdCBpbXBvcnQgVEV4Y2VwdGlvbgotZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0Ci1mcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRTb2NrZXQKLWZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFpsaWJUcmFuc3BvcnQKLWZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wKLWZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQ29tcGFjdFByb3RvY29sCi1mcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEpTT05Qcm90b2NvbAotZnJvbSB0aHJpZnQuc2VydmVyIGltcG9ydCBUU2VydmVyLCBUTm9uYmxvY2tpbmdTZXJ2ZXIsIFRIdHRwU2VydmVyCi0KLVBST1RfRkFDVE9SSUVTID0geydiaW5hcnknOiBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sRmFjdG9yeSwKLSAgICAnYWNjZWwnOiBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5LAotICAgICdjb21wYWN0JzogVENvbXBhY3RQcm90b2NvbC5UQ29tcGFjdFByb3RvY29sRmFjdG9yeSwKLSAgICAnanNvbic6IFRKU09OUHJvdG9jb2wuVEpTT05Qcm90b2NvbEZhY3Rvcnl9Ci0KLWNsYXNzIFRlc3RIYW5kbGVyOgotCi0gIGRlZiB0ZXN0Vm9pZChzZWxmKToKLSAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgotICAgICAgcHJpbnQgJ3Rlc3RWb2lkKCknCi0KLSAgZGVmIHRlc3RTdHJpbmcoc2VsZiwgc3RyKToKLSAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgotICAgICAgcHJpbnQgJ3Rlc3RTdHJpbmcoJXMpJyAlIHN0cgotICAgIHJldHVybiBzdHIKLQotICBkZWYgdGVzdEJ5dGUoc2VsZiwgYnl0ZSk6Ci0gICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKLSAgICAgIHByaW50ICd0ZXN0Qnl0ZSglZCknICUgYnl0ZQotICAgIHJldHVybiBieXRlCi0KLSAgZGVmIHRlc3RJMTYoc2VsZiwgaTE2KToKLSAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgotICAgICAgcHJpbnQgJ3Rlc3RJMTYoJWQpJyAlIGkxNgotICAgIHJldHVybiBpMTYKLQotICBkZWYgdGVzdEkzMihzZWxmLCBpMzIpOgotICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6Ci0gICAgICBwcmludCAndGVzdEkzMiglZCknICUgaTMyCi0gICAgcmV0dXJuIGkzMgotCi0gIGRlZiB0ZXN0STY0KHNlbGYsIGk2NCk6Ci0gICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKLSAgICAgIHByaW50ICd0ZXN0STY0KCVkKScgJSBpNjQKLSAgICByZXR1cm4gaTY0Ci0KLSAgZGVmIHRlc3REb3VibGUoc2VsZiwgZHViKToKLSAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgotICAgICAgcHJpbnQgJ3Rlc3REb3VibGUoJWYpJyAlIGR1YgotICAgIHJldHVybiBkdWIKLQotICBkZWYgdGVzdFN0cnVjdChzZWxmLCB0aGluZyk6Ci0gICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKLSAgICAgIHByaW50ICd0ZXN0U3RydWN0KHslcywgJWQsICVkLCAlZH0pJyAlICh0aGluZy5zdHJpbmdfdGhpbmcsIHRoaW5nLmJ5dGVfdGhpbmcsIHRoaW5nLmkzMl90aGluZywgdGhpbmcuaTY0X3RoaW5nKQotICAgIHJldHVybiB0aGluZwotCi0gIGRlZiB0ZXN0RXhjZXB0aW9uKHNlbGYsIGFyZyk6Ci0gICAgI2lmIG9wdGlvbnMudmVyYm9zZSA+IDE6Ci0gICAgcHJpbnQgJ3Rlc3RFeGNlcHRpb24oJXMpJyAlIGFyZwotICAgIGlmIGFyZyA9PSAnWGNlcHRpb24nOgotICAgICAgcmFpc2UgWGNlcHRpb24oZXJyb3JDb2RlPTEwMDEsIG1lc3NhZ2U9YXJnKQotICAgIGVsaWYgYXJnID09ICdURXhjZXB0aW9uJzoKLSAgICAgIHJhaXNlIFRFeGNlcHRpb24obWVzc2FnZT0nVGhpcyBpcyBhIFRFeGNlcHRpb24nKQotCi0gIGRlZiB0ZXN0TXVsdGlFeGNlcHRpb24oc2VsZiwgYXJnMCwgYXJnMSk6Ci0gICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKLSAgICAgIHByaW50ICd0ZXN0TXVsdGlFeGNlcHRpb24oJXMsICVzKScgJSAoYXJnMCwgYXJnMSkKLSAgICBpZiBhcmcwID09ICdYY2VwdGlvbic6Ci0gICAgICByYWlzZSBYY2VwdGlvbihlcnJvckNvZGU9MTAwMSwgbWVzc2FnZT0nVGhpcyBpcyBhbiBYY2VwdGlvbicpCi0gICAgZWxpZiBhcmcwID09ICdYY2VwdGlvbjInOgotICAgICAgcmFpc2UgWGNlcHRpb24yKAotICAgICAgICBlcnJvckNvZGU9MjAwMiwKLSAgICAgICAgc3RydWN0X3RoaW5nPVh0cnVjdChzdHJpbmdfdGhpbmc9J1RoaXMgaXMgYW4gWGNlcHRpb24yJykpCi0gICAgcmV0dXJuIFh0cnVjdChzdHJpbmdfdGhpbmc9YXJnMSkKLQotICBkZWYgdGVzdE9uZXdheShzZWxmLCBzZWNvbmRzKToKLSAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgotICAgICAgcHJpbnQgJ3Rlc3RPbmV3YXkoJWQpID0+IHNsZWVwaW5nLi4uJyAlIHNlY29uZHMKLSAgICB0aW1lLnNsZWVwKHNlY29uZHMgLyAzKSAjIGJlIHF1aWNrCi0gICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKLSAgICAgIHByaW50ICdkb25lIHNsZWVwaW5nJwotCi0gIGRlZiB0ZXN0TmVzdChzZWxmLCB0aGluZyk6Ci0gICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKLSAgICAgIHByaW50ICd0ZXN0TmVzdCglcyknICUgdGhpbmcKLSAgICByZXR1cm4gdGhpbmcKLQotICBkZWYgdGVzdE1hcChzZWxmLCB0aGluZyk6Ci0gICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKLSAgICAgIHByaW50ICd0ZXN0TWFwKCVzKScgJSB0aGluZwotICAgIHJldHVybiB0aGluZwotCi0gIGRlZiB0ZXN0U2V0KHNlbGYsIHRoaW5nKToKLSAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgotICAgICAgcHJpbnQgJ3Rlc3RTZXQoJXMpJyAlIHRoaW5nCi0gICAgcmV0dXJuIHRoaW5nCi0KLSAgZGVmIHRlc3RMaXN0KHNlbGYsIHRoaW5nKToKLSAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgotICAgICAgcHJpbnQgJ3Rlc3RMaXN0KCVzKScgJSB0aGluZwotICAgIHJldHVybiB0aGluZwotCi0gIGRlZiB0ZXN0RW51bShzZWxmLCB0aGluZyk6Ci0gICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKLSAgICAgIHByaW50ICd0ZXN0RW51bSglcyknICUgdGhpbmcKLSAgICByZXR1cm4gdGhpbmcKLQotICBkZWYgdGVzdFR5cGVkZWYoc2VsZiwgdGhpbmcpOgotICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6Ci0gICAgICBwcmludCAndGVzdFR5cGVkZWYoJXMpJyAlIHRoaW5nCi0gICAgcmV0dXJuIHRoaW5nCi0KLSAgZGVmIHRlc3RNYXBNYXAoc2VsZiwgdGhpbmcpOgotICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6Ci0gICAgICBwcmludCAndGVzdE1hcE1hcCglcyknICUgdGhpbmcKLSAgICByZXR1cm4ge3RoaW5nOiB7dGhpbmc6IHRoaW5nfX0KLQotICBkZWYgdGVzdEluc2FuaXR5KHNlbGYsIGFyZ3VtZW50KToKLSAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgotICAgICAgcHJpbnQgJ3Rlc3RJbnNhbml0eSglcyknICUgYXJndW1lbnQKLSAgICByZXR1cm4gezEyMzQ4OToge051bWJlcnouT05FOmFyZ3VtZW50fX0KLQotICBkZWYgdGVzdE11bHRpKHNlbGYsIGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUpOgotICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6Ci0gICAgICBwcmludCAndGVzdE11bHRpKCVzKScgJSBbYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNV0KLSAgICByZXR1cm4gWHRydWN0KHN0cmluZ190aGluZz0nSGVsbG8yJywKLSAgICAgICAgICAgICAgICAgIGJ5dGVfdGhpbmc9YXJnMCwgaTMyX3RoaW5nPWFyZzEsIGk2NF90aGluZz1hcmcyKQorU0NSSVBUX0RJUiA9IG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pKQogCiAKLSMgc2V0IHVwIHRoZSBwcm90b2NvbCBmYWN0b3J5IGZvcm0gdGhlIC0tcHJvdG9jb2wgb3B0aW9uCi1wZmFjdG9yeV9jbHMgPSBQUk9UX0ZBQ1RPUklFUy5nZXQob3B0aW9ucy5wcm90bywgTm9uZSkKLWlmIHBmYWN0b3J5X2NscyBpcyBOb25lOgotICByYWlzZSBBc3NlcnRpb25FcnJvcignVW5rbm93biAtLXByb3RvY29sIG9wdGlvbjogJXMnICUgb3B0aW9ucy5wcm90bykKLXBmYWN0b3J5ID0gcGZhY3RvcnlfY2xzKCkKK2NsYXNzIFRlc3RIYW5kbGVyKG9iamVjdCk6CisgICAgZGVmIHRlc3RWb2lkKHNlbGYpOgorICAgICAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgorICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCd0ZXN0Vm9pZCgpJykKIAotIyBnZXQgdGhlIHNlcnZlciB0eXBlIChUU2ltcGxlU2VydmVyLCBUTm9uYmxvY2tpbmdTZXJ2ZXIsIGV0Yy4uLikKLWlmIGxlbihhcmdzKSA+IDE6Ci0gIHJhaXNlIEFzc2VydGlvbkVycm9yKCdPbmx5IG9uZSBzZXJ2ZXIgdHlwZSBtYXkgYmUgc3BlY2lmaWVkLCBub3QgbXVsdGlwbGUgdHlwZXMuJykKLXNlcnZlcl90eXBlID0gYXJnc1swXQorICAgIGRlZiB0ZXN0U3RyaW5nKHNlbGYsIHN0cik6CisgICAgICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6CisgICAgICAgICAgICBsb2dnaW5nLmluZm8oJ3Rlc3RTdHJpbmcoJXMpJyAlIHN0cikKKyAgICAgICAgcmV0dXJuIHN0cgogCi0jIFNldCB1cCB0aGUgaGFuZGxlciBhbmQgcHJvY2Vzc29yIG9iamVjdHMKLWhhbmRsZXIgICA9IFRlc3RIYW5kbGVyKCkKLXByb2Nlc3NvciA9IFRocmlmdFRlc3QuUHJvY2Vzc29yKGhhbmRsZXIpCisgICAgZGVmIHRlc3RCb29sKHNlbGYsIGJvb2xlYW4pOgorICAgICAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgorICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCd0ZXN0Qm9vbCglcyknICUgc3RyKGJvb2xlYW4pLmxvd2VyKCkpCisgICAgICAgIHJldHVybiBib29sZWFuCiAKLSMgSGFuZGxlIFRIdHRwU2VydmVyIGFzIGEgc3BlY2lhbCBjYXNlCi1pZiBzZXJ2ZXJfdHlwZSA9PSAnVEh0dHBTZXJ2ZXInOgotICBzZXJ2ZXIgPVRIdHRwU2VydmVyLlRIdHRwU2VydmVyKHByb2Nlc3NvciwgKCcnLCBvcHRpb25zLnBvcnQpLCBwZmFjdG9yeSkKLSAgc2VydmVyLnNlcnZlKCkKLSAgc3lzLmV4aXQoMCkKKyAgICBkZWYgdGVzdEJ5dGUoc2VsZiwgYnl0ZSk6CisgICAgICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6CisgICAgICAgICAgICBsb2dnaW5nLmluZm8oJ3Rlc3RCeXRlKCVkKScgJSBieXRlKQorICAgICAgICByZXR1cm4gYnl0ZQogCi0jIHNldCB1cCBzZXJ2ZXIgdHJhbnNwb3J0IGFuZCB0cmFuc3BvcnQgZmFjdG9yeQorICAgIGRlZiB0ZXN0STE2KHNlbGYsIGkxNik6CisgICAgICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6CisgICAgICAgICAgICBsb2dnaW5nLmluZm8oJ3Rlc3RJMTYoJWQpJyAlIGkxNikKKyAgICAgICAgcmV0dXJuIGkxNgogCi1yZWxfcGF0aCA9ICIuLi9rZXlzL3NlcnZlci5wZW0iCi1hYnNfa2V5X3BhdGggPSBvcy5wYXRoLmpvaW4oc2NyaXB0X2RpciwgcmVsX3BhdGgpCisgICAgZGVmIHRlc3RJMzIoc2VsZiwgaTMyKToKKyAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKKyAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygndGVzdEkzMiglZCknICUgaTMyKQorICAgICAgICByZXR1cm4gaTMyCiAKLWhvc3QgPSBOb25lCi1pZiBvcHRpb25zLnNzbDoKLSAgZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUU1NMU29ja2V0Ci0gIHRyYW5zcG9ydCA9IFRTU0xTb2NrZXQuVFNTTFNlcnZlclNvY2tldChob3N0LCBvcHRpb25zLnBvcnQsIGNlcnRmaWxlPWFic19rZXlfcGF0aCkKLWVsc2U6Ci0gIHRyYW5zcG9ydCA9IFRTb2NrZXQuVFNlcnZlclNvY2tldChob3N0LCBvcHRpb25zLnBvcnQpCi10ZmFjdG9yeSA9IFRUcmFuc3BvcnQuVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSgpCi1pZiBvcHRpb25zLnRyYW5zID09ICdidWZmZXJlZCc6Ci0gIHRmYWN0b3J5ID0gVFRyYW5zcG9ydC5UQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KCkKLWVsaWYgb3B0aW9ucy50cmFucyA9PSAnZnJhbWVkJzoKLSAgdGZhY3RvcnkgPSBUVHJhbnNwb3J0LlRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5KCkKLWVsaWYgb3B0aW9ucy50cmFucyA9PSAnJzoKLSAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoJ1Vua25vd24gLS10cmFuc3BvcnQgb3B0aW9uOiAlcycgJSBvcHRpb25zLnRyYW5zKQotZWxzZToKLSAgdGZhY3RvcnkgPSBUVHJhbnNwb3J0LlRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkoKQotIyBpZiAtLXpsaWIsIHRoZW4gd3JhcCBzZXJ2ZXIgdHJhbnNwb3J0LCBhbmQgdXNlIGEgZGlmZmVyZW50IHRyYW5zcG9ydCBmYWN0b3J5Ci1pZiBvcHRpb25zLnpsaWI6Ci0gIHRyYW5zcG9ydCA9IFRabGliVHJhbnNwb3J0LlRabGliVHJhbnNwb3J0KHRyYW5zcG9ydCkgIyB3cmFwICB3aXRoIHpsaWIKLSAgdGZhY3RvcnkgPSBUWmxpYlRyYW5zcG9ydC5UWmxpYlRyYW5zcG9ydEZhY3RvcnkoKQorICAgIGRlZiB0ZXN0STY0KHNlbGYsIGk2NCk6CisgICAgICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6CisgICAgICAgICAgICBsb2dnaW5nLmluZm8oJ3Rlc3RJNjQoJWQpJyAlIGk2NCkKKyAgICAgICAgcmV0dXJuIGk2NAogCi0jIGRvIHNlcnZlci1zcGVjaWZpYyBzZXR1cCBoZXJlOgotaWYgc2VydmVyX3R5cGUgPT0gIlROb25ibG9ja2luZ1NlcnZlciI6Ci0gIHNlcnZlciA9IFROb25ibG9ja2luZ1NlcnZlci5UTm9uYmxvY2tpbmdTZXJ2ZXIocHJvY2Vzc29yLCB0cmFuc3BvcnQsIGlucHV0UHJvdG9jb2xGYWN0b3J5PXBmYWN0b3J5KQotZWxpZiBzZXJ2ZXJfdHlwZSA9PSAiVFByb2Nlc3NQb29sU2VydmVyIjoKLSAgaW1wb3J0IHNpZ25hbAotICBmcm9tIHRocmlmdC5zZXJ2ZXIgaW1wb3J0IFRQcm9jZXNzUG9vbFNlcnZlcgotICBzZXJ2ZXIgPSBUUHJvY2Vzc1Bvb2xTZXJ2ZXIuVFByb2Nlc3NQb29sU2VydmVyKHByb2Nlc3NvciwgdHJhbnNwb3J0LCB0ZmFjdG9yeSwgcGZhY3RvcnkpCi0gIHNlcnZlci5zZXROdW1Xb3JrZXJzKDUpCi0gIGRlZiBzZXRfYWxhcm0oKToKLSAgICBkZWYgY2xlYW5fc2h1dGRvd24oc2lnbnVtLCBmcmFtZSk6Ci0gICAgICBmb3Igd29ya2VyIGluIHNlcnZlci53b3JrZXJzOgotICAgICAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAwOgotICAgICAgICAgIHByaW50ICdUZXJtaW5hdGluZyB3b3JrZXI6ICVzJyAlIHdvcmtlcgotICAgICAgICB3b3JrZXIudGVybWluYXRlKCkKLSAgICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDA6Ci0gICAgICAgIHByaW50ICdSZXF1ZXN0aW5nIHNlcnZlciB0byBzdG9wKCknCi0gICAgICB0cnk6Ci0gICAgICAgIHNlcnZlci5zdG9wKCkKLSAgICAgIGV4Y2VwdDoKKyAgICBkZWYgdGVzdERvdWJsZShzZWxmLCBkdWIpOgorICAgICAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgorICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCd0ZXN0RG91YmxlKCVmKScgJSBkdWIpCisgICAgICAgIHJldHVybiBkdWIKKworICAgIGRlZiB0ZXN0QmluYXJ5KHNlbGYsIHRoaW5nKToKKyAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKKyAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygndGVzdEJpbmFyeSgpJykgICMgVE9ETzogaGV4IG91dHB1dAorICAgICAgICByZXR1cm4gdGhpbmcKKworICAgIGRlZiB0ZXN0U3RydWN0KHNlbGYsIHRoaW5nKToKKyAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKKyAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygndGVzdFN0cnVjdCh7JXMsICVzLCAlcywgJXN9KScgJSAodGhpbmcuc3RyaW5nX3RoaW5nLCB0aGluZy5ieXRlX3RoaW5nLCB0aGluZy5pMzJfdGhpbmcsIHRoaW5nLmk2NF90aGluZykpCisgICAgICAgIHJldHVybiB0aGluZworCisgICAgZGVmIHRlc3RFeGNlcHRpb24oc2VsZiwgYXJnKToKKyAgICAgICAgIyBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgorICAgICAgICBsb2dnaW5nLmluZm8oJ3Rlc3RFeGNlcHRpb24oJXMpJyAlIGFyZykKKyAgICAgICAgaWYgYXJnID09ICdYY2VwdGlvbic6CisgICAgICAgICAgICByYWlzZSBYY2VwdGlvbihlcnJvckNvZGU9MTAwMSwgbWVzc2FnZT1hcmcpCisgICAgICAgIGVsaWYgYXJnID09ICdURXhjZXB0aW9uJzoKKyAgICAgICAgICAgIHJhaXNlIFRFeGNlcHRpb24obWVzc2FnZT0nVGhpcyBpcyBhIFRFeGNlcHRpb24nKQorCisgICAgZGVmIHRlc3RNdWx0aUV4Y2VwdGlvbihzZWxmLCBhcmcwLCBhcmcxKToKKyAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKKyAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygndGVzdE11bHRpRXhjZXB0aW9uKCVzLCAlcyknICUgKGFyZzAsIGFyZzEpKQorICAgICAgICBpZiBhcmcwID09ICdYY2VwdGlvbic6CisgICAgICAgICAgICByYWlzZSBYY2VwdGlvbihlcnJvckNvZGU9MTAwMSwgbWVzc2FnZT0nVGhpcyBpcyBhbiBYY2VwdGlvbicpCisgICAgICAgIGVsaWYgYXJnMCA9PSAnWGNlcHRpb24yJzoKKyAgICAgICAgICAgIHJhaXNlIFhjZXB0aW9uMigKKyAgICAgICAgICAgICAgICBlcnJvckNvZGU9MjAwMiwKKyAgICAgICAgICAgICAgICBzdHJ1Y3RfdGhpbmc9WHRydWN0KHN0cmluZ190aGluZz0nVGhpcyBpcyBhbiBYY2VwdGlvbjInKSkKKyAgICAgICAgcmV0dXJuIFh0cnVjdChzdHJpbmdfdGhpbmc9YXJnMSkKKworICAgIGRlZiB0ZXN0T25ld2F5KHNlbGYsIHNlY29uZHMpOgorICAgICAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgorICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCd0ZXN0T25ld2F5KCVkKSA9PiBzbGVlcGluZy4uLicgJSBzZWNvbmRzKQorICAgICAgICB0aW1lLnNsZWVwKHNlY29uZHMgLyAzKSAgIyBiZSBxdWljaworICAgICAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgorICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCdkb25lIHNsZWVwaW5nJykKKworICAgIGRlZiB0ZXN0TmVzdChzZWxmLCB0aGluZyk6CisgICAgICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6CisgICAgICAgICAgICBsb2dnaW5nLmluZm8oJ3Rlc3ROZXN0KCVzKScgJSB0aGluZykKKyAgICAgICAgcmV0dXJuIHRoaW5nCisKKyAgICBkZWYgdGVzdE1hcChzZWxmLCB0aGluZyk6CisgICAgICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6CisgICAgICAgICAgICBsb2dnaW5nLmluZm8oJ3Rlc3RNYXAoJXMpJyAlIHRoaW5nKQorICAgICAgICByZXR1cm4gdGhpbmcKKworICAgIGRlZiB0ZXN0U3RyaW5nTWFwKHNlbGYsIHRoaW5nKToKKyAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKKyAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygndGVzdFN0cmluZ01hcCglcyknICUgdGhpbmcpCisgICAgICAgIHJldHVybiB0aGluZworCisgICAgZGVmIHRlc3RTZXQoc2VsZiwgdGhpbmcpOgorICAgICAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgorICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCd0ZXN0U2V0KCVzKScgJSB0aGluZykKKyAgICAgICAgcmV0dXJuIHRoaW5nCisKKyAgICBkZWYgdGVzdExpc3Qoc2VsZiwgdGhpbmcpOgorICAgICAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgorICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCd0ZXN0TGlzdCglcyknICUgdGhpbmcpCisgICAgICAgIHJldHVybiB0aGluZworCisgICAgZGVmIHRlc3RFbnVtKHNlbGYsIHRoaW5nKToKKyAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKKyAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygndGVzdEVudW0oJXMpJyAlIHRoaW5nKQorICAgICAgICByZXR1cm4gdGhpbmcKKworICAgIGRlZiB0ZXN0VHlwZWRlZihzZWxmLCB0aGluZyk6CisgICAgICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6CisgICAgICAgICAgICBsb2dnaW5nLmluZm8oJ3Rlc3RUeXBlZGVmKCVzKScgJSB0aGluZykKKyAgICAgICAgcmV0dXJuIHRoaW5nCisKKyAgICBkZWYgdGVzdE1hcE1hcChzZWxmLCB0aGluZyk6CisgICAgICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6CisgICAgICAgICAgICBsb2dnaW5nLmluZm8oJ3Rlc3RNYXBNYXAoJXMpJyAlIHRoaW5nKQorICAgICAgICByZXR1cm4geworICAgICAgICAgICAgLTQ6IHsKKyAgICAgICAgICAgICAgICAtNDogLTQsCisgICAgICAgICAgICAgICAgLTM6IC0zLAorICAgICAgICAgICAgICAgIC0yOiAtMiwKKyAgICAgICAgICAgICAgICAtMTogLTEsCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgNDogeworICAgICAgICAgICAgICAgIDQ6IDQsCisgICAgICAgICAgICAgICAgMzogMywKKyAgICAgICAgICAgICAgICAyOiAyLAorICAgICAgICAgICAgICAgIDE6IDEsCisgICAgICAgICAgICB9LAorICAgICAgICB9CisKKyAgICBkZWYgdGVzdEluc2FuaXR5KHNlbGYsIGFyZ3VtZW50KToKKyAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKKyAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygndGVzdEluc2FuaXR5KCVzKScgJSBhcmd1bWVudCkKKyAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICAgIDE6IHsKKyAgICAgICAgICAgICAgICAyOiBhcmd1bWVudCwKKyAgICAgICAgICAgICAgICAzOiBhcmd1bWVudCwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAyOiB7NjogSW5zYW5pdHkoKX0sCisgICAgICAgIH0KKworICAgIGRlZiB0ZXN0TXVsdGkoc2VsZiwgYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSk6CisgICAgICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6CisgICAgICAgICAgICBsb2dnaW5nLmluZm8oJ3Rlc3RNdWx0aSglcyknICUgW2FyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzVdKQorICAgICAgICByZXR1cm4gWHRydWN0KHN0cmluZ190aGluZz0nSGVsbG8yJywKKyAgICAgICAgICAgICAgICAgICAgICBieXRlX3RoaW5nPWFyZzAsIGkzMl90aGluZz1hcmcxLCBpNjRfdGhpbmc9YXJnMikKKworCitkZWYgbWFpbihvcHRpb25zKToKKyAgICAjIHNldCB1cCB0aGUgcHJvdG9jb2wgZmFjdG9yeSBmb3JtIHRoZSAtLXByb3RvY29sIG9wdGlvbgorICAgIHByb3RfZmFjdG9yaWVzID0geworICAgICAgICAnYWNjZWwnOiBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5KCksCisgICAgICAgICdhY2NlbGMnOiBUQ29tcGFjdFByb3RvY29sLlRDb21wYWN0UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3RvcnkoKSwKKyAgICAgICAgJ2JpbmFyeSc6IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCksCisgICAgICAgICdjb21wYWN0JzogVENvbXBhY3RQcm90b2NvbC5UQ29tcGFjdFByb3RvY29sRmFjdG9yeSgpLAorICAgICAgICAnaGVhZGVyJzogVEhlYWRlclByb3RvY29sLlRIZWFkZXJQcm90b2NvbEZhY3RvcnkoYWxsb3dlZF9jbGllbnRfdHlwZXM9WworICAgICAgICAgICAgVEhlYWRlclRyYW5zcG9ydC5USGVhZGVyQ2xpZW50VHlwZS5IRUFERVJTLAorICAgICAgICAgICAgVEhlYWRlclRyYW5zcG9ydC5USGVhZGVyQ2xpZW50VHlwZS5GUkFNRURfQklOQVJZLAorICAgICAgICAgICAgVEhlYWRlclRyYW5zcG9ydC5USGVhZGVyQ2xpZW50VHlwZS5VTkZSQU1FRF9CSU5BUlksCisgICAgICAgICAgICBUSGVhZGVyVHJhbnNwb3J0LlRIZWFkZXJDbGllbnRUeXBlLkZSQU1FRF9DT01QQUNULAorICAgICAgICAgICAgVEhlYWRlclRyYW5zcG9ydC5USGVhZGVyQ2xpZW50VHlwZS5VTkZSQU1FRF9DT01QQUNULAorICAgICAgICBdKSwKKyAgICAgICAgJ2pzb24nOiBUSlNPTlByb3RvY29sLlRKU09OUHJvdG9jb2xGYWN0b3J5KCksCisgICAgfQorICAgIHBmYWN0b3J5ID0gcHJvdF9mYWN0b3JpZXMuZ2V0KG9wdGlvbnMucHJvdG8sIE5vbmUpCisgICAgaWYgcGZhY3RvcnkgaXMgTm9uZToKKyAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoJ1Vua25vd24gLS1wcm90b2NvbCBvcHRpb246ICVzJyAlIG9wdGlvbnMucHJvdG8pCisgICAgdHJ5OgorICAgICAgICBwZmFjdG9yeS5zdHJpbmdfbGVuZ3RoX2xpbWl0ID0gb3B0aW9ucy5zdHJpbmdfbGltaXQKKyAgICAgICAgcGZhY3RvcnkuY29udGFpbmVyX2xlbmd0aF9saW1pdCA9IG9wdGlvbnMuY29udGFpbmVyX2xpbWl0CisgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgIyBJZ25vcmUgZXJyb3JzIGZvciB0aG9zZSBwcm90b2NvbHMgdGhhdCBkb2VzIG5vdCBzdXBwb3J0IGxlbmd0aCBsaW1pdAogICAgICAgICBwYXNzCi0gICAgc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHQUxSTSwgY2xlYW5fc2h1dGRvd24pCi0gICAgc2lnbmFsLmFsYXJtKDIpCi0gIHNldF9hbGFybSgpCi1lbHNlOgotICAjIGxvb2sgdXAgc2VydmVyIGNsYXNzIGR5bmFtaWNhbGx5IHRvIGluc3RhbnRpYXRlIHNlcnZlcgotICBTZXJ2ZXJDbGFzcyA9IGdldGF0dHIoVFNlcnZlciwgc2VydmVyX3R5cGUpCi0gIHNlcnZlciA9IFNlcnZlckNsYXNzKHByb2Nlc3NvciwgdHJhbnNwb3J0LCB0ZmFjdG9yeSwgcGZhY3RvcnkpCi0jIGVudGVyIHNlcnZlciBtYWluIGxvb3AKLXNlcnZlci5zZXJ2ZSgpCisKKyAgICAjIGdldCB0aGUgc2VydmVyIHR5cGUgKFRTaW1wbGVTZXJ2ZXIsIFROb25ibG9ja2luZ1NlcnZlciwgZXRjLi4uKQorICAgIGlmIGxlbihhcmdzKSA+IDE6CisgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCdPbmx5IG9uZSBzZXJ2ZXIgdHlwZSBtYXkgYmUgc3BlY2lmaWVkLCBub3QgbXVsdGlwbGUgdHlwZXMuJykKKyAgICBzZXJ2ZXJfdHlwZSA9IGFyZ3NbMF0KKyAgICBpZiBvcHRpb25zLnRyYW5zID09ICdodHRwJzoKKyAgICAgICAgc2VydmVyX3R5cGUgPSAnVEh0dHBTZXJ2ZXInCisKKyAgICAjIFNldCB1cCB0aGUgaGFuZGxlciBhbmQgcHJvY2Vzc29yIG9iamVjdHMKKyAgICBoYW5kbGVyID0gVGVzdEhhbmRsZXIoKQorICAgIHByb2Nlc3NvciA9IFRocmlmdFRlc3QuUHJvY2Vzc29yKGhhbmRsZXIpCisKKyAgICBnbG9iYWwgc2VydmVyCisKKyAgICAjIEhhbmRsZSBUSHR0cFNlcnZlciBhcyBhIHNwZWNpYWwgY2FzZQorICAgIGlmIHNlcnZlcl90eXBlID09ICdUSHR0cFNlcnZlcic6CisgICAgICAgIGlmIG9wdGlvbnMuc3NsOgorICAgICAgICAgICAgX19jZXJ0ZmlsZSA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoU0NSSVBUX0RJUiksICJrZXlzIiwgInNlcnZlci5jcnQiKQorICAgICAgICAgICAgX19rZXlmaWxlID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShTQ1JJUFRfRElSKSwgImtleXMiLCAic2VydmVyLmtleSIpCisgICAgICAgICAgICBzZXJ2ZXIgPSBUSHR0cFNlcnZlci5USHR0cFNlcnZlcihwcm9jZXNzb3IsICgnJywgb3B0aW9ucy5wb3J0KSwgcGZhY3RvcnksIGNlcnRfZmlsZT1fX2NlcnRmaWxlLCBrZXlfZmlsZT1fX2tleWZpbGUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZXJ2ZXIgPSBUSHR0cFNlcnZlci5USHR0cFNlcnZlcihwcm9jZXNzb3IsICgnJywgb3B0aW9ucy5wb3J0KSwgcGZhY3RvcnkpCisgICAgICAgIHNlcnZlci5zZXJ2ZSgpCisgICAgICAgIHN5cy5leGl0KDApCisKKyAgICAjIHNldCB1cCBzZXJ2ZXIgdHJhbnNwb3J0IGFuZCB0cmFuc3BvcnQgZmFjdG9yeQorCisgICAgYWJzX2tleV9wYXRoID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShTQ1JJUFRfRElSKSwgJ2tleXMnLCAnc2VydmVyLnBlbScpCisKKyAgICBob3N0ID0gTm9uZQorICAgIGlmIG9wdGlvbnMuc3NsOgorICAgICAgICBmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRTU0xTb2NrZXQKKyAgICAgICAgdHJhbnNwb3J0ID0gVFNTTFNvY2tldC5UU1NMU2VydmVyU29ja2V0KGhvc3QsIG9wdGlvbnMucG9ydCwgY2VydGZpbGU9YWJzX2tleV9wYXRoKQorICAgIGVsc2U6CisgICAgICAgIHRyYW5zcG9ydCA9IFRTb2NrZXQuVFNlcnZlclNvY2tldChob3N0LCBvcHRpb25zLnBvcnQpCisgICAgdGZhY3RvcnkgPSBUVHJhbnNwb3J0LlRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkoKQorICAgIGlmIG9wdGlvbnMudHJhbnMgPT0gJ2J1ZmZlcmVkJzoKKyAgICAgICAgdGZhY3RvcnkgPSBUVHJhbnNwb3J0LlRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkoKQorICAgIGVsaWYgb3B0aW9ucy50cmFucyA9PSAnZnJhbWVkJzoKKyAgICAgICAgdGZhY3RvcnkgPSBUVHJhbnNwb3J0LlRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5KCkKKyAgICBlbGlmIG9wdGlvbnMudHJhbnMgPT0gJyc6CisgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCdVbmtub3duIC0tdHJhbnNwb3J0IG9wdGlvbjogJXMnICUgb3B0aW9ucy50cmFucykKKyAgICBlbHNlOgorICAgICAgICB0ZmFjdG9yeSA9IFRUcmFuc3BvcnQuVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSgpCisgICAgIyBpZiAtLXpsaWIsIHRoZW4gd3JhcCBzZXJ2ZXIgdHJhbnNwb3J0LCBhbmQgdXNlIGEgZGlmZmVyZW50IHRyYW5zcG9ydCBmYWN0b3J5CisgICAgaWYgb3B0aW9ucy56bGliOgorICAgICAgICB0cmFuc3BvcnQgPSBUWmxpYlRyYW5zcG9ydC5UWmxpYlRyYW5zcG9ydCh0cmFuc3BvcnQpICAjIHdyYXAgIHdpdGggemxpYgorICAgICAgICB0ZmFjdG9yeSA9IFRabGliVHJhbnNwb3J0LlRabGliVHJhbnNwb3J0RmFjdG9yeSgpCisKKyAgICAjIGRvIHNlcnZlci1zcGVjaWZpYyBzZXR1cCBoZXJlOgorICAgIGlmIHNlcnZlcl90eXBlID09ICJUTm9uYmxvY2tpbmdTZXJ2ZXIiOgorICAgICAgICBzZXJ2ZXIgPSBUTm9uYmxvY2tpbmdTZXJ2ZXIuVE5vbmJsb2NraW5nU2VydmVyKHByb2Nlc3NvciwgdHJhbnNwb3J0LCBpbnB1dFByb3RvY29sRmFjdG9yeT1wZmFjdG9yeSkKKyAgICBlbGlmIHNlcnZlcl90eXBlID09ICJUUHJvY2Vzc1Bvb2xTZXJ2ZXIiOgorICAgICAgICBpbXBvcnQgc2lnbmFsCisgICAgICAgIGZyb20gdGhyaWZ0LnNlcnZlciBpbXBvcnQgVFByb2Nlc3NQb29sU2VydmVyCisgICAgICAgIHNlcnZlciA9IFRQcm9jZXNzUG9vbFNlcnZlci5UUHJvY2Vzc1Bvb2xTZXJ2ZXIocHJvY2Vzc29yLCB0cmFuc3BvcnQsIHRmYWN0b3J5LCBwZmFjdG9yeSkKKyAgICAgICAgc2VydmVyLnNldE51bVdvcmtlcnMoNSkKKworICAgICAgICBkZWYgc2V0X2FsYXJtKCk6CisgICAgICAgICAgICBkZWYgY2xlYW5fc2h1dGRvd24oc2lnbnVtLCBmcmFtZSk6CisgICAgICAgICAgICAgICAgZm9yIHdvcmtlciBpbiBzZXJ2ZXIud29ya2VyczoKKyAgICAgICAgICAgICAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygnVGVybWluYXRpbmcgd29ya2VyOiAlcycgJSB3b3JrZXIpCisgICAgICAgICAgICAgICAgICAgIHdvcmtlci50ZXJtaW5hdGUoKQorICAgICAgICAgICAgICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDA6CisgICAgICAgICAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygnUmVxdWVzdGluZyBzZXJ2ZXIgdG8gc3RvcCgpJykKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHNlcnZlci5zdG9wKCkKKyAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdBTFJNLCBjbGVhbl9zaHV0ZG93bikKKyAgICAgICAgICAgIHNpZ25hbC5hbGFybSg0KQorICAgICAgICBzZXRfYWxhcm0oKQorICAgIGVsc2U6CisgICAgICAgICMgbG9vayB1cCBzZXJ2ZXIgY2xhc3MgZHluYW1pY2FsbHkgdG8gaW5zdGFudGlhdGUgc2VydmVyCisgICAgICAgIFNlcnZlckNsYXNzID0gZ2V0YXR0cihUU2VydmVyLCBzZXJ2ZXJfdHlwZSkKKyAgICAgICAgc2VydmVyID0gU2VydmVyQ2xhc3MocHJvY2Vzc29yLCB0cmFuc3BvcnQsIHRmYWN0b3J5LCBwZmFjdG9yeSkKKyAgICAjIGVudGVyIHNlcnZlciBtYWluIGxvb3AKKyAgICBzZXJ2ZXIuc2VydmUoKQorCisKK2RlZiBleGl0X2dyYWNlZnVsbHkoc2lnbnVtLCBmcmFtZSk6CisgICAgcHJpbnQoIlNJR0lOVCByZWNlaXZlZFxuIikKKyAgICBzZXJ2ZXIuc2h1dGRvd24oKSAgICMgZG9lc24ndCB3b3JrIHByb3Blcmx5LCB5ZXQKKyAgICBzeXMuZXhpdCgwKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHSU5ULCBleGl0X2dyYWNlZnVsbHkpCisKKyAgICBwYXJzZXIgPSBPcHRpb25QYXJzZXIoKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCctLWxpYnB5ZGlyJywgdHlwZT0nc3RyaW5nJywgZGVzdD0nbGlicHlkaXInLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J2luY2x1ZGUgdGhpcyBkaXJlY3RvcnkgdG8gc3lzLnBhdGggZm9yIGxvY2F0aW5nIGxpYnJhcnkgY29kZScpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oJy0tZ2VucHlkaXInLCB0eXBlPSdzdHJpbmcnLCBkZXN0PSdnZW5weWRpcicsCisgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0nZ2VuLXB5JywKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdpbmNsdWRlIHRoaXMgZGlyZWN0b3J5IHRvIHN5cy5wYXRoIGZvciBsb2NhdGluZyBnZW5lcmF0ZWQgY29kZScpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oIi0tcG9ydCIsIHR5cGU9ImludCIsIGRlc3Q9InBvcnQiLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9InBvcnQgbnVtYmVyIGZvciBzZXJ2ZXIgdG8gbGlzdGVuIG9uIikKKyAgICBwYXJzZXIuYWRkX29wdGlvbigiLS16bGliIiwgYWN0aW9uPSJzdG9yZV90cnVlIiwgZGVzdD0iemxpYiIsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0idXNlIHpsaWIgd3JhcHBlciBmb3IgY29tcHJlc3NlZCB0cmFuc3BvcnQiKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCItLXNzbCIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsIGRlc3Q9InNzbCIsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0idXNlIFNTTCBmb3IgZW5jcnlwdGVkIHRyYW5zcG9ydCIpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oJy12JywgJy0tdmVyYm9zZScsIGFjdGlvbj0ic3RvcmVfY29uc3QiLAorICAgICAgICAgICAgICAgICAgICAgIGRlc3Q9InZlcmJvc2UiLCBjb25zdD0yLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9InZlcmJvc2Ugb3V0cHV0IikKKyAgICBwYXJzZXIuYWRkX29wdGlvbignLXEnLCAnLS1xdWlldCcsIGFjdGlvbj0ic3RvcmVfY29uc3QiLAorICAgICAgICAgICAgICAgICAgICAgIGRlc3Q9InZlcmJvc2UiLCBjb25zdD0wLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9Im1pbmltYWwgb3V0cHV0IikKKyAgICBwYXJzZXIuYWRkX29wdGlvbignLS1wcm90b2NvbCcsIGRlc3Q9InByb3RvIiwgdHlwZT0ic3RyaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJwcm90b2NvbCB0byB1c2UsIG9uZSBvZjogYWNjZWwsIGFjY2VsYywgYmluYXJ5LCBjb21wYWN0LCBqc29uIikKKyAgICBwYXJzZXIuYWRkX29wdGlvbignLS10cmFuc3BvcnQnLCBkZXN0PSJ0cmFucyIsIHR5cGU9InN0cmluZyIsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0idHJhbnNwb3J0IHRvIHVzZSwgb25lIG9mOiBidWZmZXJlZCwgZnJhbWVkLCBodHRwIikKKyAgICBwYXJzZXIuYWRkX29wdGlvbignLS1jb250YWluZXItbGltaXQnLCBkZXN0PSdjb250YWluZXJfbGltaXQnLCB0eXBlPSdpbnQnLCBkZWZhdWx0PU5vbmUpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oJy0tc3RyaW5nLWxpbWl0JywgZGVzdD0nc3RyaW5nX2xpbWl0JywgdHlwZT0naW50JywgZGVmYXVsdD1Ob25lKQorICAgIHBhcnNlci5zZXRfZGVmYXVsdHMocG9ydD05MDkwLCB2ZXJib3NlPTEsIHByb3RvPSdiaW5hcnknLCB0cmFuc3BvcnQ9J2J1ZmZlcmVkJykKKyAgICBvcHRpb25zLCBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQorCisgICAgIyBQcmludCBUU2VydmVyIGxvZyB0byBzdGRvdXQgc28gdGhhdCB0aGUgdGVzdC1ydW5uZXIgY2FuIHJlZGlyZWN0IGl0IHRvIGxvZyBmaWxlcworICAgIGxvZ2dpbmcuYmFzaWNDb25maWcobGV2ZWw9b3B0aW9ucy52ZXJib3NlKQorCisgICAgc3lzLnBhdGguaW5zZXJ0KDAsIG9zLnBhdGguam9pbihTQ1JJUFRfRElSLCBvcHRpb25zLmdlbnB5ZGlyKSkKKyAgICBzeXMucGF0aC5pbnNlcnQoMCwgbG9jYWxfbGlicGF0aCgpKQorCisgICAgZnJvbSBUaHJpZnRUZXN0IGltcG9ydCBUaHJpZnRUZXN0CisgICAgZnJvbSBUaHJpZnRUZXN0LnR0eXBlcyBpbXBvcnQgWHRydWN0LCBYY2VwdGlvbiwgWGNlcHRpb24yLCBJbnNhbml0eQorICAgIGZyb20gdGhyaWZ0LlRocmlmdCBpbXBvcnQgVEV4Y2VwdGlvbgorICAgIGZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVEhlYWRlclRyYW5zcG9ydAorICAgIGZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydAorICAgIGZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFNvY2tldAorICAgIGZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFpsaWJUcmFuc3BvcnQKKyAgICBmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sCisgICAgZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRDb21wYWN0UHJvdG9jb2wKKyAgICBmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEhlYWRlclByb3RvY29sCisgICAgZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRKU09OUHJvdG9jb2wKKyAgICBmcm9tIHRocmlmdC5zZXJ2ZXIgaW1wb3J0IFRTZXJ2ZXIsIFROb25ibG9ja2luZ1NlcnZlciwgVEh0dHBTZXJ2ZXIKKworICAgIHN5cy5leGl0KG1haW4ob3B0aW9ucykpCmRpZmYgLS1naXQgYS90ZXN0L3B5L1Rlc3RTb2NrZXQucHkgYi90ZXN0L3B5L1Rlc3RTb2NrZXQucHkKaW5kZXggYjliZGYyNy4uNjE5ZWIxMCAxMDA3NTUKLS0tIGEvdGVzdC9weS9UZXN0U29ja2V0LnB5CisrKyBiL3Rlc3QvcHkvVGVzdFNvY2tldC5weQpAQCAtMTksMjkgKzE5LDE2IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1pbXBvcnQgc3lzLCBnbG9iCi1mcm9tIG9wdHBhcnNlIGltcG9ydCBPcHRpb25QYXJzZXIKLXBhcnNlciA9IE9wdGlvblBhcnNlcigpCi1wYXJzZXIuYWRkX29wdGlvbignLS1nZW5weWRpcicsIHR5cGU9J3N0cmluZycsIGRlc3Q9J2dlbnB5ZGlyJywgZGVmYXVsdD0nZ2VuLXB5JykKLW9wdGlvbnMsIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncygpCi1kZWwgc3lzLmFyZ3ZbMTpdICMgY2xlYW4gdXAgaGFjayBzbyB1bml0dGVzdCBkb2Vzbid0IGNvbXBsYWluCi1zeXMucGF0aC5pbnNlcnQoMCwgb3B0aW9ucy5nZW5weWRpcikKLXN5cy5wYXRoLmluc2VydCgwLCBnbG9iLmdsb2IoJy4uLy4uL2xpYi9weS9idWlsZC9saWIuKicpWzBdKQotCi1mcm9tIFRocmlmdFRlc3QgaW1wb3J0IFRocmlmdFRlc3QKLWZyb20gVGhyaWZ0VGVzdC50dHlwZXMgaW1wb3J0ICoKLWZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydAogZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUU29ja2V0Ci1mcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sCiBpbXBvcnQgdW5pdHRlc3QKIGltcG9ydCB0aW1lCiBpbXBvcnQgc29ja2V0CiBpbXBvcnQgcmFuZG9tCi1mcm9tIG9wdHBhcnNlIGltcG9ydCBPcHRpb25QYXJzZXIKKwogCiBjbGFzcyBUaW1lb3V0VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIHNldFVwKHNlbGYpOgotICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoNTApOgorICAgICAgICBmb3IgaSBpbiByYW5nZSg1MCk6CiAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgIyBmaW5kIGEgcG9ydCB3ZSBjYW4gdXNlCiAgICAgICAgICAgICAgICAgc2VsZi5saXN0ZW5fc29jayA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX1NUUkVBTSkKQEAgLTQ5LDcgKzM2LDcgQEAKICAgICAgICAgICAgICAgICBzZWxmLmxpc3Rlbl9zb2NrLmJpbmQoKCdsb2NhbGhvc3QnLCBzZWxmLnBvcnQpKQogICAgICAgICAgICAgICAgIHNlbGYubGlzdGVuX3NvY2subGlzdGVuKDUpCiAgICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgICAgICAgaWYgaSA9PSA0OToKICAgICAgICAgICAgICAgICAgICAgcmFpc2UKIApAQCAtNTgsMTIgKzQ1LDEyIEBACiAKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgbGVha3kgPSBbXQotICAgICAgICAgICAgZm9yIGkgaW4geHJhbmdlKDEwMCk6CisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZSgxMDApOgogICAgICAgICAgICAgICAgIHNvY2tldCA9IFRTb2NrZXQuVFNvY2tldCgnbG9jYWxob3N0Jywgc2VsZi5wb3J0KQogICAgICAgICAgICAgICAgIHNvY2tldC5zZXRUaW1lb3V0KDEwKQogICAgICAgICAgICAgICAgIHNvY2tldC5vcGVuKCkKICAgICAgICAgICAgICAgICBsZWFreS5hcHBlbmQoc29ja2V0KQotICAgICAgICBleGNlcHQ6CisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgICBzZWxmLmFzc2VydF8odGltZS50aW1lKCkgLSBzdGFydHRpbWUgPCA1LjApCiAKICAgICBkZWYgdGVzdFdyaXRlVGltZW91dChzZWxmKToKQEAgLTc1LDE1ICs2MiwxNyBAQAogICAgICAgICAgICAgc29ja2V0Lm9wZW4oKQogICAgICAgICAgICAgbHNvY2sgPSBzZWxmLmxpc3Rlbl9zb2NrLmFjY2VwdCgpCiAgICAgICAgICAgICB3aGlsZSBUcnVlOgotICAgICAgICAgICAgICAgIHNvY2tldC53cml0ZSgiaGkiICogMTAwKQorICAgICAgICAgICAgICAgIGxzb2NrLndyaXRlKCJoaSIgKiAxMDApCiAKLSAgICAgICAgZXhjZXB0OgorICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHRpbWUudGltZSgpIC0gc3RhcnR0aW1lIDwgNS4wKQogCi1zdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpCi1sb2FkZXIgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkKIAotc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKFRpbWVvdXRUZXN0KSkKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQorICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQogCi10ZXN0UnVubmVyID0gdW5pdHRlc3QuVGV4dFRlc3RSdW5uZXIodmVyYm9zaXR5PTIpCi10ZXN0UnVubmVyLnJ1bihzdWl0ZSkKKyAgICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoVGltZW91dFRlc3QpKQorCisgICAgdGVzdFJ1bm5lciA9IHVuaXR0ZXN0LlRleHRUZXN0UnVubmVyKHZlcmJvc2l0eT0yKQorICAgIHRlc3RSdW5uZXIucnVuKHN1aXRlKQpkaWZmIC0tZ2l0IGEvdGVzdC9weS9UZXN0U3ludGF4LnB5IGIvdGVzdC9weS9UZXN0U3ludGF4LnB5CmluZGV4IDlmNzFjZjUuLmRiZTc5NzUgMTAwNzU1Ci0tLSBhL3Rlc3QvcHkvVGVzdFN5bnRheC5weQorKysgYi90ZXN0L3B5L1Rlc3RTeW50YXgucHkKQEAgLTE5LDE1ICsxOSw2IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1pbXBvcnQgc3lzLCBnbG9iCi1mcm9tIG9wdHBhcnNlIGltcG9ydCBPcHRpb25QYXJzZXIKLXBhcnNlciA9IE9wdGlvblBhcnNlcigpCi1wYXJzZXIuYWRkX29wdGlvbignLS1nZW5weWRpcicsIHR5cGU9J3N0cmluZycsIGRlc3Q9J2dlbnB5ZGlyJywgZGVmYXVsdD0nZ2VuLXB5JykKLW9wdGlvbnMsIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncygpCi1kZWwgc3lzLmFyZ3ZbMTpdICMgY2xlYW4gdXAgaGFjayBzbyB1bml0dGVzdCBkb2Vzbid0IGNvbXBsYWluCi1zeXMucGF0aC5pbnNlcnQoMCwgb3B0aW9ucy5nZW5weWRpcikKLXN5cy5wYXRoLmluc2VydCgwLCBnbG9iLmdsb2IoJy4uLy4uL2xpYi9weS9idWlsZC9saWIuKicpWzBdKQotCiAjIEp1c3QgaW1wb3J0IHRoZXNlIGdlbmVyYXRlZCBmaWxlcyB0byBtYWtlIHN1cmUgdGhleSBhcmUgc3ludGFjdGljYWxseSB2YWxpZAotZnJvbSBEZWJ1Z1Byb3RvVGVzdCBpbXBvcnQgRW1wdHlTZXJ2aWNlCi1mcm9tIERlYnVnUHJvdG9UZXN0IGltcG9ydCBJbmhlcml0ZWQKK2Zyb20gRGVidWdQcm90b1Rlc3QgaW1wb3J0IEVtcHR5U2VydmljZSAgIyBub3FhCitmcm9tIERlYnVnUHJvdG9UZXN0IGltcG9ydCBJbmhlcml0ZWQgICMgbm9xYQpkaWZmIC0tZ2l0IGEvdGVzdC9weS9leHBsaWNpdF9tb2R1bGUvcnVudGVzdC5zaCBiL3Rlc3QvcHkvZXhwbGljaXRfbW9kdWxlL3J1bnRlc3Quc2gKaW5kZXggMmU1YTRmMS4uNmQ3MzQ2MiAxMDA3NTUKLS0tIGEvdGVzdC9weS9leHBsaWNpdF9tb2R1bGUvcnVudGVzdC5zaAorKysgYi90ZXN0L3B5L2V4cGxpY2l0X21vZHVsZS9ydW50ZXN0LnNoCkBAIC0yMiw2ICsyMiw3IEBACiBybSAtcmYgZ2VuLXB5CiAuLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC0tZ2VuIHB5IHRlc3QxLnRocmlmdCB8fCBleGl0IDEKIC4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLS1nZW4gcHkgdGVzdDIudGhyaWZ0IHx8IGV4aXQgMQorLi4vLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtLWdlbiBweSB0ZXN0My50aHJpZnQgJiYgZXhpdCAxICAjIEZhaWwgc2luY2UgdGVzdDMudGhyaWZ0IGhhcyBweXRob24ga2V5d29yZHMKIFBZVEhPTlBBVEg9Li9nZW4tcHkgcHl0aG9uIC1jICdpbXBvcnQgZm9vLmJhci5iYXonIHx8IGV4aXQgMQogUFlUSE9OUEFUSD0uL2dlbi1weSBweXRob24gLWMgJ2ltcG9ydCB0ZXN0MicgfHwgZXhpdCAxCiBQWVRIT05QQVRIPS4vZ2VuLXB5IHB5dGhvbiAtYyAnaW1wb3J0IHRlc3QxJyAmPi9kZXYvbnVsbCAmJiBleGl0IDEgICMgU2hvdWxkIGZhaWwuCmRpZmYgLS1naXQgYS90ZXN0L3B5L2V4cGxpY2l0X21vZHVsZS90ZXN0My50aHJpZnQgYi90ZXN0L3B5L2V4cGxpY2l0X21vZHVsZS90ZXN0My50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU0Nzg2YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvcHkvZXhwbGljaXRfbW9kdWxlL3Rlc3QzLnRocmlmdApAQCAtMCwwICsxLDI1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK25hbWVzcGFjZSBweSB2YWxpZGF0aW9ucworCitzdHJ1Y3QgZnJvbSB7CisgIDE6IGkzMiBkZWY7Cit9CisKZGlmZiAtLWdpdCBhL3Rlc3QvcHkvZ2VuZXJhdGUuY21ha2UgYi90ZXN0L3B5L2dlbmVyYXRlLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlZDE0Y2MKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3B5L2dlbmVyYXRlLmNtYWtlCkBAIC0wLDAgKzEsMzYgQEAKK21hY3JvKEdFTkVSQVRFIEZJTEVOQU1FIEdFTkVSQVRPUiBPVVRQVVRESVIpCisgIGZpbGUoTUFLRV9ESVJFQ1RPUlkgJHtNWV9DVVJSRU5UX0JJTkFSWV9ESVJ9LyR7T1VUUFVURElSfSkKKyAgZXhlY3V0ZV9wcm9jZXNzKENPTU1BTkQgJHtUSFJJRlRDT01QSUxFUn0gLS1nZW4gJHtHRU5FUkFUT1J9IC1vdXQgJHtNWV9DVVJSRU5UX0JJTkFSWV9ESVJ9LyR7T1VUUFVURElSfSAke0ZJTEVOQU1FfQorICAgICAgICAgICAgICAgICAgUkVTVUxUX1ZBUklBQkxFIENNRF9SRVNVTFQpCisgIGlmKENNRF9SRVNVTFQpCisgICAgICAgIG1lc3NhZ2UoRkFUQUxfRVJST1IgIkVycm9yIGdlbmVyYXRpbmcgJHtGSUxFTkFNRX0gd2l0aCBnZW5lcmF0b3IgJHtHRU5FUkFUT1J9IikKKyAgZW5kaWYoKQorZW5kbWFjcm8oR0VORVJBVEUpCisKK2dlbmVyYXRlKCR7TVlfUFJPSkVDVF9ESVJ9L3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQgcHkgZ2VuLXB5LWRlZmF1bHQpCitnZW5lcmF0ZSgke01ZX1BST0pFQ1RfRElSfS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0IHB5OnNsb3RzIGdlbi1weS1zbG90cykKK2dlbmVyYXRlKCR7TVlfUFJPSkVDVF9ESVJ9L3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQgcHk6b2xkX3N0eWxlIGdlbi1weS1vbGRzdHlsZSkKK2dlbmVyYXRlKCR7TVlfUFJPSkVDVF9ESVJ9L3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQgcHk6bm9fdXRmOHN0cmluZ3MgZ2VuLXB5LW5vX3V0ZjhzdHJpbmdzKQorZ2VuZXJhdGUoJHtNWV9QUk9KRUNUX0RJUn0vdGVzdC9UaHJpZnRUZXN0LnRocmlmdCBweTpkeW5hbWljIGdlbi1weS1keW5hbWljKQorZ2VuZXJhdGUoJHtNWV9QUk9KRUNUX0RJUn0vdGVzdC9UaHJpZnRUZXN0LnRocmlmdCBweTpkeW5hbWljLHNsb3RzIGdlbi1weS1keW5hbWljc2xvdHMpCisKK2dlbmVyYXRlKCR7TVlfUFJPSkVDVF9ESVJ9L3Rlc3QvRGVidWdQcm90b1Rlc3QudGhyaWZ0IHB5IGdlbi1weS1kZWZhdWx0KQorZ2VuZXJhdGUoJHtNWV9QUk9KRUNUX0RJUn0vdGVzdC9EZWJ1Z1Byb3RvVGVzdC50aHJpZnQgcHk6c2xvdHMgZ2VuLXB5LXNsb3RzKQorZ2VuZXJhdGUoJHtNWV9QUk9KRUNUX0RJUn0vdGVzdC9EZWJ1Z1Byb3RvVGVzdC50aHJpZnQgcHk6b2xkX3N0eWxlIGdlbi1weS1vbGRzdHlsZSkKK2dlbmVyYXRlKCR7TVlfUFJPSkVDVF9ESVJ9L3Rlc3QvRGVidWdQcm90b1Rlc3QudGhyaWZ0IHB5Om5vX3V0ZjhzdHJpbmdzIGdlbi1weS1ub191dGY4c3RyaW5ncykKK2dlbmVyYXRlKCR7TVlfUFJPSkVDVF9ESVJ9L3Rlc3QvRGVidWdQcm90b1Rlc3QudGhyaWZ0IHB5OmR5bmFtaWMgZ2VuLXB5LWR5bmFtaWMpCitnZW5lcmF0ZSgke01ZX1BST0pFQ1RfRElSfS90ZXN0L0RlYnVnUHJvdG9UZXN0LnRocmlmdCBweTpkeW5hbWljLHNsb3RzIGdlbi1weS1keW5hbWljc2xvdHMpCisKK2dlbmVyYXRlKCR7TVlfUFJPSkVDVF9ESVJ9L3Rlc3QvRG91YmxlQ29uc3RhbnRzVGVzdC50aHJpZnQgcHkgZ2VuLXB5LWRlZmF1bHQpCitnZW5lcmF0ZSgke01ZX1BST0pFQ1RfRElSfS90ZXN0L0RvdWJsZUNvbnN0YW50c1Rlc3QudGhyaWZ0IHB5OnNsb3RzIGdlbi1weS1zbG90cykKK2dlbmVyYXRlKCR7TVlfUFJPSkVDVF9ESVJ9L3Rlc3QvRG91YmxlQ29uc3RhbnRzVGVzdC50aHJpZnQgcHk6b2xkX3N0eWxlIGdlbi1weS1vbGRzdHlsZSkKK2dlbmVyYXRlKCR7TVlfUFJPSkVDVF9ESVJ9L3Rlc3QvRG91YmxlQ29uc3RhbnRzVGVzdC50aHJpZnQgcHk6bm9fdXRmOHN0cmluZ3MgZ2VuLXB5LW5vX3V0ZjhzdHJpbmdzKQorZ2VuZXJhdGUoJHtNWV9QUk9KRUNUX0RJUn0vdGVzdC9Eb3VibGVDb25zdGFudHNUZXN0LnRocmlmdCBweTpkeW5hbWljIGdlbi1weS1keW5hbWljKQorZ2VuZXJhdGUoJHtNWV9QUk9KRUNUX0RJUn0vdGVzdC9Eb3VibGVDb25zdGFudHNUZXN0LnRocmlmdCBweTpkeW5hbWljLHNsb3RzIGdlbi1weS1keW5hbWljc2xvdHMpCisKK2dlbmVyYXRlKCR7TVlfUFJPSkVDVF9ESVJ9L3Rlc3QvUmVjdXJzaXZlLnRocmlmdCBweSBnZW4tcHktZGVmYXVsdCkKK2dlbmVyYXRlKCR7TVlfUFJPSkVDVF9ESVJ9L3Rlc3QvUmVjdXJzaXZlLnRocmlmdCBweTpzbG90cyBnZW4tcHktc2xvdHMpCitnZW5lcmF0ZSgke01ZX1BST0pFQ1RfRElSfS90ZXN0L1JlY3Vyc2l2ZS50aHJpZnQgcHk6b2xkX3N0eWxlIGdlbi1weS1vbGRzdHlsZSkKK2dlbmVyYXRlKCR7TVlfUFJPSkVDVF9ESVJ9L3Rlc3QvUmVjdXJzaXZlLnRocmlmdCBweTpub191dGY4c3RyaW5ncyBnZW4tcHktbm9fdXRmOHN0cmluZ3MpCitnZW5lcmF0ZSgke01ZX1BST0pFQ1RfRElSfS90ZXN0L1JlY3Vyc2l2ZS50aHJpZnQgcHk6ZHluYW1pYyBnZW4tcHktZHluYW1pYykKK2dlbmVyYXRlKCR7TVlfUFJPSkVDVF9ESVJ9L3Rlc3QvUmVjdXJzaXZlLnRocmlmdCBweTpkeW5hbWljLHNsb3RzIGdlbi1weS1keW5hbWljc2xvdHMpCmRpZmYgLS1naXQgYS90ZXN0L3B5L3NldHVwLmNmZyBiL3Rlc3QvcHkvc2V0dXAuY2ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkYTFmOTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3B5L3NldHVwLmNmZwpAQCAtMCwwICsxLDIgQEAKK1tmbGFrZThdCittYXgtbGluZS1sZW5ndGggPSAxMDAKZGlmZiAtLWdpdCBhL3Rlc3QvcHkvdXRpbC5weSBiL3Rlc3QvcHkvdXRpbC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmIzZjVjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9weS91dGlsLnB5CkBAIC0wLDAgKzEsMzIgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitpbXBvcnQgZ2xvYgoraW1wb3J0IG9zCitpbXBvcnQgc3lzCisKK19TQ1JJUFRfRElSID0gb3MucGF0aC5hYnNwYXRoKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykpCitfUk9PVF9ESVIgPSBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5kaXJuYW1lKF9TQ1JJUFRfRElSKSkKKworCitkZWYgbG9jYWxfbGlicGF0aCgpOgorICAgIGdsb2JkaXIgPSBvcy5wYXRoLmpvaW4oX1JPT1RfRElSLCAnbGliJywgJ3B5JywgJ2J1aWxkJywgJ2xpYi4qJykKKyAgICBmb3IgbGlicGF0aCBpbiBnbG9iLmdsb2IoZ2xvYmRpcik6CisgICAgICAgIGlmIGxpYnBhdGguZW5kc3dpdGgoJy0lZC4lZCcgJSAoc3lzLnZlcnNpb25faW5mb1swXSwgc3lzLnZlcnNpb25faW5mb1sxXSkpOgorICAgICAgICAgICAgcmV0dXJuIGxpYnBhdGgKZGlmZiAtLWdpdCBhL3Rlc3QvcmIvR2VtZmlsZSBiL3Rlc3QvcmIvR2VtZmlsZQppbmRleCA4MzAxZTQ0Li40ZmYwNTM5IDEwMDY0NAotLS0gYS90ZXN0L3JiL0dlbWZpbGUKKysrIGIvdGVzdC9yYi9HZW1maWxlCkBAIC0yLDUgKzIsNiBAQAogCiByZXF1aXJlICJydWJ5Z2VtcyIKIAotZ2VtICJyYWNrIiwgIn4+IDEuNS4yIgotZ2VtICJ0aGluIiwgIn4+IDEuNS4wIgorZ2VtICdyYWNrJywgJ34+IDIuMCcsICc+PSAyLjAuNCcKK2dlbSAndGhpbicsICd+PiAxLjcnLCAnPj0gMS43LjInCitnZW0gJ3Rlc3QtdW5pdCcsICd+PiAzLjInLCAnPj0gMy4yLjcnCmRpZmYgLS1naXQgYS90ZXN0L3JiL01ha2VmaWxlLmFtIGIvdGVzdC9yYi9NYWtlZmlsZS5hbQppbmRleCA5Y2RkOTliLi5jZmRjMTQ5IDEwMDY0NAotLS0gYS90ZXN0L3JiL01ha2VmaWxlLmFtCisrKyBiL3Rlc3QvcmIvTWFrZWZpbGUuYW0KQEAgLTE3LDExICsxNywxMiBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotVEhSSUZUID0gJCh0b3Bfc3JjZGlyKS9jb21waWxlci9jcHAvdGhyaWZ0Ci0KLXN0dWJzOiAuLi9UaHJpZnRUZXN0LnRocmlmdCAuLi9TbWFsbFRlc3QudGhyaWZ0CitzdHViczogJChUSFJJRlQpIC4uL1RocmlmdFRlc3QudGhyaWZ0IC4uL1NtYWxsVGVzdC50aHJpZnQKIAkkKFRIUklGVCkgLS1nZW4gcmIgLi4vVGhyaWZ0VGVzdC50aHJpZnQKIAkkKFRIUklGVCkgLS1nZW4gcmIgLi4vU21hbGxUZXN0LnRocmlmdAorCSQoVEhSSUZUKSAtLWdlbiByYiAuLi9SZWN1cnNpdmUudGhyaWZ0CisKK3ByZWNyb3NzOiBzdHVicwogCiBjaGVjazogc3R1YnMKIGlmIEhBVkVfQlVORExFUgpkaWZmIC0tZ2l0IGEvdGVzdC9yYi9jb3JlL3RyYW5zcG9ydC90ZXN0X3RyYW5zcG9ydC5yYiBiL3Rlc3QvcmIvY29yZS90cmFuc3BvcnQvdGVzdF90cmFuc3BvcnQucmIKaW5kZXggNTI3NTVjMS4uMzdhZmE4NSAxMDA2NDQKLS0tIGEvdGVzdC9yYi9jb3JlL3RyYW5zcG9ydC90ZXN0X3RyYW5zcG9ydC5yYgorKysgYi90ZXN0L3JiL2NvcmUvdHJhbnNwb3J0L3Rlc3RfdHJhbnNwb3J0LnJiCkBAIC01MSw3ICs1MSw3IEBACiAgIAogICAjIFRPRE86CiAgICMgVGhpcyBkb2Vzbid0IG5lY2Vzc2FyaWx5IHRlc3QgaGUgcmlnaHQgdGhpbmcuCi0gICMgSXQgX2xvb2tzXyBsaWtlIHJlYWQgaXNuJ3QgZ3VhcmVudGVlZCB0byByZXR1cm4gdGhlIGxlbmd0aAorICAjIEl0IF9sb29rc18gbGlrZSByZWFkIGlzbid0IGd1YXJhbnRlZWQgdG8gcmV0dXJuIHRoZSBsZW5ndGgKICAgIyB5b3UgYXNrIGZvciBhbmQgcmVhZF9hbGwgaXMuIFRoaXMgbWVhbnMgb3VyIHRlc3QgbmVlZHMgdG8gY2hlY2sKICAgIyBmb3IgYmxvY2tpbmcuIC0tIEtldmluIENsYXJrIDMvMjcvMDgKICAgZGVmIHRlc3RfcmVhZF9hbGwKZGlmZiAtLWdpdCBhL3Rlc3QvcmIvZ2VuZXJhdGlvbi90ZXN0X3JlY3Vyc2l2ZS5yYiBiL3Rlc3QvcmIvZ2VuZXJhdGlvbi90ZXN0X3JlY3Vyc2l2ZS5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTEyZjcyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9yYi9nZW5lcmF0aW9uL3Rlc3RfcmVjdXJzaXZlLnJiCkBAIC0wLDAgKzEsNDEgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCityZXF1aXJlIEZpbGUuam9pbihGaWxlLmRpcm5hbWUoX19GSUxFX18pLCAnLi4vdGVzdF9oZWxwZXInKQorcmVxdWlyZSAncmVjdXJzaXZlX3R5cGVzJworCitjbGFzcyBUZXN0UmVjdXJzaXZlR2VuZXJhdGlvbiA8IFRlc3Q6OlVuaXQ6OlRlc3RDYXNlCisgIENISUxEX0lURU0gPSAiY2hpbGQgaXRlbSIKKyAgUEFSRU5UX0lURU0gPSAicGFyZW50IGl0ZW0iCisKKyAgZGVmIHRlc3RfY2FuX2NyZWF0ZV9yZWN1cnNpdmVfdHJlZQorCisgICAgY2hpbGRfdHJlZSA9IFJlY1RyZWUubmV3CisgICAgY2hpbGRfdHJlZS5pdGVtID0gQ0hJTERfSVRFTQorCisgICAgcGFyZW50X3RyZWUgPSBSZWNUcmVlLm5ldworICAgIHBhcmVudF90cmVlLml0ZW0gPSBQQVJFTlRfSVRFTQorICAgIHBhcmVudF90cmVlLmNoaWxkcmVuID0gW2NoaWxkX3RyZWVdCisKKyAgICBhc3NlcnRfZXF1YWwoUEFSRU5UX0lURU0sIHBhcmVudF90cmVlLml0ZW0pCisgICAgYXNzZXJ0X2VxdWFsKDEsIHBhcmVudF90cmVlLmNoaWxkcmVuLmxlbmd0aCkKKyAgICBhc3NlcnRfZXF1YWwoQ0hJTERfSVRFTSwgcGFyZW50X3RyZWUuY2hpbGRyZW4uZmlyc3QuaXRlbSkKKyAgICBhc3NlcnRfbmlsKHBhcmVudF90cmVlLmNoaWxkcmVuLmZpcnN0LmNoaWxkcmVuKQorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdGVzdC9yYi9pbnRlZ3JhdGlvbi9UZXN0Q2xpZW50LnJiIGIvdGVzdC9yYi9pbnRlZ3JhdGlvbi9UZXN0Q2xpZW50LnJiCmluZGV4IDQxNjI1YTguLjYzOWFjYTkgMTAwNzU1Ci0tLSBhL3Rlc3QvcmIvaW50ZWdyYXRpb24vVGVzdENsaWVudC5yYgorKysgYi90ZXN0L3JiL2ludGVncmF0aW9uL1Rlc3RDbGllbnQucmIKQEAgLTEsNCArMSw1IEBACiAjIS91c3IvYmluL2VudiBydWJ5CisjIGVuY29kaW5nOiB1dGYtOAogCiAjCiAjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKQEAgLTI1LDQwICsyNiw2NSBAQAogcmVxdWlyZSAndGhyaWZ0JwogcmVxdWlyZSAndGhyaWZ0X3Rlc3QnCiAKLSRwcm90b2NvbFR5cGUgPSAiYmluYXJ5IgorJGRvbWFpbl9zb2NrZXQgPSBuaWwKICRob3N0ID0gImxvY2FsaG9zdCIKICRwb3J0ID0gOTA5MAorJHByb3RvY29sVHlwZSA9ICJiaW5hcnkiCiskc3NsID0gZmFsc2UKICR0cmFuc3BvcnQgPSAiYnVmZmVyZWQiCisKIEFSR1YuZWFjaCBkb3xhfAogICBpZiBhID09ICItLWhlbHAiCiAgICAgcHV0cyAiQWxsb3dlZCBvcHRpb25zOiIKICAgICBwdXRzICJcdCAtaCBbIC0taGVscCBdIFx0IHByb2R1Y2UgaGVscCBtZXNzYWdlIgotICAgIHB1dHMgIlx0LS1ob3N0IGFyZyAoPWxvY2FsaG9zdCkgXHQgSG9zdCB0byBjb25uZWN0IgotICAgIHB1dHMgIlx0LS1wb3J0IGFyZyAoPTkwOTApIFx0IFBvcnQgbnVtYmVyIHRvIGxpc3RlbiIKLSAgICBwdXRzICJcdC0tcHJvdG9jb2wgYXJnICg9YmluYXJ5KSBcdCBwcm90b2NvbDogYmluYXJ5LCBhY2NlbCIKKyAgICBwdXRzICJcdC0tZG9tYWluLXNvY2tldCBhcmcgKD0pIFx0IFVuaXggZG9tYWluIHNvY2tldCBwYXRoIgorICAgIHB1dHMgIlx0LS1ob3N0IGFyZyAoPWxvY2FsaG9zdCkgXHQgSG9zdCB0byBjb25uZWN0IFx0IG5vdCB2YWxpZCB3aXRoIGRvbWFpbi1zb2NrZXQiCisgICAgcHV0cyAiXHQtLXBvcnQgYXJnICg9OTA5MCkgXHQgUG9ydCBudW1iZXIgdG8gbGlzdGVuIFx0IG5vdCB2YWxpZCB3aXRoIGRvbWFpbi1zb2NrZXQiCisgICAgcHV0cyAiXHQtLXByb3RvY29sIGFyZyAoPWJpbmFyeSkgXHQgcHJvdG9jb2w6IGFjY2VsLCBiaW5hcnksIGNvbXBhY3QsIGpzb24iCisgICAgcHV0cyAiXHQtLXNzbCBcdCB1c2Ugc3NsIFx0IG5vdCB2YWxpZCB3aXRoIGRvbWFpbi1zb2NrZXQiCiAgICAgcHV0cyAiXHQtLXRyYW5zcG9ydCBhcmcgKD1idWZmZXJlZCkgdHJhbnNwb3J0OiBidWZmZXJlZCwgZnJhbWVkLCBodHRwIgogICAgIGV4aXQKKyAgZWxzaWYgYS5zdGFydF93aXRoPygiLS1kb21haW4tc29ja2V0IikKKyAgICAkZG9tYWluX3NvY2tldCA9IGEuc3BsaXQoIj0iKVsxXQogICBlbHNpZiBhLnN0YXJ0X3dpdGg/KCItLWhvc3QiKQogICAgICRob3N0ID0gYS5zcGxpdCgiPSIpWzFdCiAgIGVsc2lmIGEuc3RhcnRfd2l0aD8oIi0tcHJvdG9jb2wiKQogICAgICRwcm90b2NvbFR5cGUgPSBhLnNwbGl0KCI9IilbMV0KKyAgZWxzaWYgYSA9PSAiLS1zc2wiCisgICAgJHNzbCA9IHRydWUKICAgZWxzaWYgYS5zdGFydF93aXRoPygiLS10cmFuc3BvcnQiKQogICAgICR0cmFuc3BvcnQgPSBhLnNwbGl0KCI9IilbMV0KICAgZWxzaWYgYS5zdGFydF93aXRoPygiLS1wb3J0IikKLSAgICAkcG9ydCA9IGEuc3BsaXQoIj0iKVsxXS50b19pIAorICAgICRwb3J0ID0gYS5zcGxpdCgiPSIpWzFdLnRvX2kKICAgZW5kCiBlbmQKLUFSR1Y9W10KIAogY2xhc3MgU2ltcGxlQ2xpZW50VGVzdCA8IFRlc3Q6OlVuaXQ6OlRlc3RDYXNlCi0gIGRlZiBzZXR1cCAKKyAgZGVmIHNldHVwCiAgICAgdW5sZXNzIEBzb2NrZXQKLSAgICAgIEBzb2NrZXQgICA9IFRocmlmdDo6U29ja2V0Lm5ldygkaG9zdCwgJHBvcnQpCi0gICAgICB0cmFuc3BvcnRGYWN0b3J5ID0gVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydC5uZXcoQHNvY2tldCkKKyAgICAgIGlmICRkb21haW5fc29ja2V0LnRvX3Muc3RyaXAuZW1wdHk/CisgICAgICAgIGlmICRzc2wKKyAgICAgICAgICAjIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBmb3IgcnVieSBjcm9zc3Rlc3QgaXMgdGVzdC9yYi9nZW4tcmIKKyAgICAgICAgICBrZXlzRGlyID0gRmlsZS5qb2luKEZpbGUuZGlybmFtZShGaWxlLmRpcm5hbWUoRGlyLnB3ZCkpLCAia2V5cyIpCisgICAgICAgICAgY3R4ID0gT3BlblNTTDo6U1NMOjpTU0xDb250ZXh0Lm5ldworICAgICAgICAgIGN0eC5jYV9maWxlID0gRmlsZS5qb2luKGtleXNEaXIsICJDQS5wZW0iKQorICAgICAgICAgIGN0eC5jZXJ0ID0gT3BlblNTTDo6WDUwOTo6Q2VydGlmaWNhdGUubmV3KEZpbGUub3BlbihGaWxlLmpvaW4oa2V5c0RpciwgImNsaWVudC5jcnQiKSkpCisgICAgICAgICAgY3R4LmNlcnRfc3RvcmUgPSBPcGVuU1NMOjpYNTA5OjpTdG9yZS5uZXcKKyAgICAgICAgICBjdHguY2VydF9zdG9yZS5hZGRfZmlsZShGaWxlLmpvaW4oa2V5c0RpciwgJ3NlcnZlci5wZW0nKSkKKyAgICAgICAgICBjdHgua2V5ID0gT3BlblNTTDo6UEtleTo6UlNBLm5ldyhGaWxlLm9wZW4oRmlsZS5qb2luKGtleXNEaXIsICJjbGllbnQua2V5IikpKQorICAgICAgICAgIGN0eC5vcHRpb25zID0gT3BlblNTTDo6U1NMOjpPUF9OT19TU0x2MiB8IE9wZW5TU0w6OlNTTDo6T1BfTk9fU1NMdjMKKyAgICAgICAgICBjdHguc3NsX3ZlcnNpb24gPSA6U1NMdjIzCisgICAgICAgICAgY3R4LnZlcmlmeV9tb2RlID0gT3BlblNTTDo6U1NMOjpWRVJJRllfUEVFUgorICAgICAgICAgIEBzb2NrZXQgPSBUaHJpZnQ6OlNTTFNvY2tldC5uZXcoJGhvc3QsICRwb3J0LCBuaWwsIGN0eCkKKyAgICAgICAgZWxzZQorICAgICAgICAgIEBzb2NrZXQgPSBUaHJpZnQ6OlNvY2tldC5uZXcoJGhvc3QsICRwb3J0KQorICAgICAgICBlbmQKKyAgICAgIGVsc2UKKyAgICAgICAgQHNvY2tldCA9IFRocmlmdDo6VU5JWFNvY2tldC5uZXcoJGRvbWFpbl9zb2NrZXQpCisgICAgICBlbmQKKyAgICAgIAogICAgICAgaWYgJHRyYW5zcG9ydCA9PSAiYnVmZmVyZWQiCiAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnkgPSBUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0Lm5ldyhAc29ja2V0KQotICAgICAgZWxzaWYgJHRyYW5zcG9ydCA9PSAiIgotICAgICAgICB0cmFuc3BvcnRGYWN0b3J5ID0gVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydC5uZXcoQHNvY2tldCkKICAgICAgIGVsc2lmICR0cmFuc3BvcnQgPT0gImZyYW1lZCIKICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSA9IFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0Lm5ldyhAc29ja2V0KQogICAgICAgZWxzZQpAQCAtNjcsOCArOTMsNiBAQAogCiAgICAgICBpZiAkcHJvdG9jb2xUeXBlID09ICJiaW5hcnkiCiAgICAgICAgIEBwcm90b2NvbCA9IFRocmlmdDo6QmluYXJ5UHJvdG9jb2wubmV3KHRyYW5zcG9ydEZhY3RvcnkpCi0gICAgICBlbHNpZiAkcHJvdG9jb2xUeXBlID09ICIiCi0gICAgICAgIEBwcm90b2NvbCA9IFRocmlmdDo6QmluYXJ5UHJvdG9jb2wubmV3KHRyYW5zcG9ydEZhY3RvcnkpCiAgICAgICBlbHNpZiAkcHJvdG9jb2xUeXBlID09ICJjb21wYWN0IgogICAgICAgICBAcHJvdG9jb2wgPSBUaHJpZnQ6OkNvbXBhY3RQcm90b2NvbC5uZXcodHJhbnNwb3J0RmFjdG9yeSkKICAgICAgIGVsc2lmICRwcm90b2NvbFR5cGUgPT0gImpzb24iCkBAIC03OCw1NyArMTAyLDEyNSBAQAogICAgICAgZWxzZQogICAgICAgICByYWlzZSAnVW5rbm93biBwcm90b2NvbCB0eXBlJwogICAgICAgZW5kCi0gICAgICBAY2xpZW50ICAgPSBUaHJpZnQ6OlRlc3Q6OlRocmlmdFRlc3Q6OkNsaWVudC5uZXcoQHByb3RvY29sKQorICAgICAgQGNsaWVudCA9IFRocmlmdDo6VGVzdDo6VGhyaWZ0VGVzdDo6Q2xpZW50Lm5ldyhAcHJvdG9jb2wpCiAgICAgICBAc29ja2V0Lm9wZW4KICAgICBlbmQKICAgZW5kCi0gIAorCisgIGRlZiB0ZWFyZG93bgorICAgIEBzb2NrZXQuY2xvc2UKKyAgZW5kCisKICAgZGVmIHRlc3Rfdm9pZAorICAgIHAgJ3Rlc3Rfdm9pZCcKICAgICBAY2xpZW50LnRlc3RWb2lkKCkKICAgZW5kCiAKICAgZGVmIHRlc3Rfc3RyaW5nCi0gICAgYXNzZXJ0X2VxdWFsKEBjbGllbnQudGVzdFN0cmluZygnc3RyaW5nJyksICdzdHJpbmcnKQorICAgIHAgJ3Rlc3Rfc3RyaW5nJworICAgIHRlc3Rfc3RyaW5nID0KKyAgICAgICdxdW90ZTogXCIgYmFja3NsYXNoOicgKworICAgICAgJyBmb3J3YXJkc2xhc2gtZXNjYXBlZDogXC8gJyArCisgICAgICAnIGJhY2tzcGFjZTogXGIgZm9ybWZlZWQ6IFxmIG5ld2xpbmU6IFxuIHJldHVybjogXHIgdGFiOiAnICsKKyAgICAgICcgbm93LWFsbC1vZi10aGVtLXRvZ2V0aGVyOiAiXFxcL1xiXG5cclx0JyArCisgICAgICAnIG5vdy1hLWJ1bmNoLW9mLWp1bms6ICFAIyQlJigpKCYlJCN7fXt9PD48PjwnICsKKyAgICAgICcgY2hhci10by10ZXN0LWpzb24tcGFyc2luZzogXV0gXCJdXSBcXCIgfX19eyBbW1sgJworICAgIHRlc3Rfc3RyaW5nID0gIkFmcmlrYWFucywgQWxlbWFubmlzY2gsIEFyYWdvbsOpcywg2KfZhNi52LHYqNmK2KksINmF2LXYsdmJLCAiICsKKyAgICAgICJBc3R1cmlhbnUsIEF5bWFyIGFydSwgQXrJmXJiYXljYW4sINCR0LDRiNKh0L7RgNGCLCBCb2FyaXNjaCwgxb1lbWFpdMSXxaFrYSwgIiArCisgICAgICAi0JHQtdC70LDRgNGD0YHQutCw0Y8sINCR0LXQu9Cw0YDRg9GB0LrQsNGPICjRgtCw0YDQsNGI0LrQtdCy0ZbRhtCwKSwg0JHRitC70LPQsNGA0YHQutC4LCBCYW1hbmFua2FuLCAiICsKKyAgICAgICLgpqzgpr7gpoLgprLgpr4sIEJyZXpob25lZywgQm9zYW5za2ksIENhdGFsw6AsIE3DrG5nLWTElcykbmctbmfhubPMhCwg0J3QvtGF0YfQuNC50L0sICIgKworICAgICAgIkNlYnVhbm8sIOGPo+GOs+GOqSwgxIxlc2t5LCDQodC70L7QstGjzIHQvdGM0YHQutGKIC8g4rCU4rCO4rCR4rCC4rCh4rCQ4rCg4rCU4rCN4rCfLCDQp9OR0LLQsNGI0LvQsCwgQ3ltcmFlZywgIiArCisgICAgICAiRGFuc2ssIFphemFraSwg3oveqN6I3qzegN6o3oTept6Q3rAsIM6VzrvOu863zr3Ouc66zqwsIEVtaWxpw6BuIGUgcnVtYWduw7JsLCBFbmdsaXNoLCAiICsKKyAgICAgICJFc3BlcmFudG8sIEVzcGHDsW9sLCBFZXN0aSwgRXVza2FyYSwg2YHYp9ix2LPbjCwgU3VvbWksIFbDtXJvLCBGw7hyb3lza3QsICIgKworICAgICAgIkZyYW7Dp2FpcywgQXJwZXRhbiwgRnVybGFuLCBGcnlzaywgR2FlaWxnZSwg6LSb6KqeLCBHw6BpZGhsaWcsIEdhbGVnbywgIiArCisgICAgICAiQXZhw7FlJ+G6vSwg4KqX4KuB4Kqc4Kqw4Kq+4Kqk4KuALCBHYWVsZywg16LXkdeo15nXqiwg4KS54KS/4KSo4KWN4KSm4KWALCBGaWppIEhpbmRpLCBIcnZhdHNraSwgIiArCisgICAgICAiS3JlecOybCBheWlzeWVuLCBNYWd5YXIsINWA1aHVtdWl1oDVpdW2LCBJbnRlcmxpbmd1YSwgQmFoYXNhIEluZG9uZXNpYSwgIiArCisgICAgICAiSWxva2FubywgSWRvLCDDjXNsZW5za2EsIEl0YWxpYW5vLCDml6XmnKzoqp4sIExvamJhbiwgQmFzYSBKYXdhLCAiICsKKyAgICAgICLhg6Xhg5Dhg6Dhg5fhg6Phg5rhg5gsIEtvbmdvLCBLYWxhYWxsaXN1dCwg4LKV4LKo4LON4LKo4LKhLCDtlZzqta3slrQsINCa0YrQsNGA0LDRh9Cw0Lkt0JzQsNC70LrRitCw0YAsICIgKworICAgICAgIlJpcG9hcmlzY2gsIEt1cmTDriwg0JrQvtC80LgsIEtlcm5ld2VrLCDQmtGL0YDQs9GL0LfRh9CwLCBMYXRpbmEsIExhZGlubywgIiArCisgICAgICAiTMOrdHplYnVlcmdlc2NoLCBMaW1idXJncywgTGluZ8OhbGEsIOC6peC6suC6pywgTGlldHV2acWzLCBMYXR2aWXFoXUsIEJhc2EgIiArCisgICAgICAiQmFueXVtYXNhbiwgTWFsYWdhc3ksINCc0LDQutC10LTQvtC90YHQutC4LCDgtK7gtLLgtK/gtL7gtLPgtIIsIOCkruCksOCkvuCkoOClgCwg2YXYp9iy2ZDYsdmI2YbbjCwgQmFoYXNhICIgKworICAgICAgIk1lbGF5dSwgTm5hcHVsaXRhbm8sIE5lZGVyc2Frc2lzY2gsIOCkqOClh+CkquCkvuCksiDgpK3gpL7gpLfgpL4sIE5lZGVybGFuZHMsIOKAqiIgKworICAgICAgIk5vcnNrIChueW5vcnNrKeKArCwg4oCqTm9yc2sgKGJva23DpWwp4oCsLCBOb3Vvcm1hbmQsIERpbsOpIGJpemFhZCwgIiArCisgICAgICAiT2NjaXRhbiwg0JjRgNC+0L3QsNGDLCBQYXBpYW1lbnR1LCBEZWl0c2NoLCBQb2xza2ksINm+2YbYrNin2KjbjCwg2b7amtiq2YgsICIgKworICAgICAgIk5vcmZ1ayAvIFBpdGtlcm4sIFBvcnR1Z3XDqnMsIFJ1bmEgU2ltaSwgUnVtYW50c2NoLCBSb21hbmksIFJvbcOibsSDLCAiICsKKyAgICAgICLQoNGD0YHRgdC60LjQuSwg0KHQsNGF0LAg0YLRi9C70LAsIFNhcmR1LCBTaWNpbGlhbnUsIFNjb3RzLCBTw6FtZWdpZWxsYSwgU2ltcGxlICIgKworICAgICAgIkVuZ2xpc2gsIFNsb3ZlbsSNaW5hLCBTbG92ZW7FocSNaW5hLCDQodGA0L/RgdC60LggLyBTcnBza2ksIFNlZWx0ZXJzaywgIiArCisgICAgICAiU3ZlbnNrYSwgS2lzd2FoaWxpLCDgrqTgrq7grr/grrTgr40sIOCwpOCxhuCwsuCxgeCwl+CxgSwg0KLQvtK30LjQutOjLCDguYTguJfguKIsIFTDvHJrbWVuw6dlLCBUYWdhbG9nLCAiICsKKyAgICAgICJUw7xya8OnZSwg0KLQsNGC0LDRgNGH0LAvVGF0YXLDp2EsINCj0LrRgNCw0ZfQvdGB0YzQutCwLCDYp9ix2K/ZiCwgVGnhur9uZyBWaeG7h3QsIFZvbGFww7xrLCAiICsKKyAgICAgICJXYWxvbiwgV2luYXJheSwg5ZC06K+tLCBpc2lYaG9zYSwg15nXmda015PXmdepLCBZb3LDuWLDoSwgWmXDqnV3cywg5Lit5paHLCAiICsKKyAgICAgICJCw6JuLWzDom0tZ8O6LCDnsrXoqp4iCisKKyAgICByZXN1bHRfc3RyaW5nID0gQGNsaWVudC50ZXN0U3RyaW5nKHRlc3Rfc3RyaW5nKQorICAgIGFzc2VydF9lcXVhbCh0ZXN0X3N0cmluZywgcmVzdWx0X3N0cmluZy5mb3JjZV9lbmNvZGluZyhFbmNvZGluZzo6VVRGXzgpKQorICBlbmQKKworICBkZWYgdGVzdF9ib29sCisgICAgcCAndGVzdF9ib29sJworICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3RCb29sKHRydWUpLCB0cnVlKQorICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3RCb29sKGZhbHNlKSwgZmFsc2UpCiAgIGVuZAogCiAgIGRlZiB0ZXN0X2J5dGUKLSAgICB2YWwgPSA4CisgICAgcCAndGVzdF9ieXRlJworICAgIHZhbCA9IDEyMAogICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3RCeXRlKHZhbCksIHZhbCkKICAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0Qnl0ZSgtdmFsKSwgLXZhbCkKICAgZW5kCiAKICAgZGVmIHRlc3RfaTMyCi0gICAgdmFsID0gMzIKKyAgICBwICd0ZXN0X2kzMicKKyAgICB2YWwgPSAyMDAwMDAwMDMyCiAgICAgYXNzZXJ0X2VxdWFsKEBjbGllbnQudGVzdEkzMih2YWwpLCB2YWwpCiAgICAgYXNzZXJ0X2VxdWFsKEBjbGllbnQudGVzdEkzMigtdmFsKSwgLXZhbCkKICAgZW5kCiAKICAgZGVmIHRlc3RfaTY0Ci0gICAgdmFsID0gNjQKKyAgICBwICd0ZXN0X2k2NCcKKyAgICB2YWwgPSA5MDAwMDAwMDAwMDAwMDAwMDY0CiAgICAgYXNzZXJ0X2VxdWFsKEBjbGllbnQudGVzdEk2NCh2YWwpLCB2YWwpCiAgICAgYXNzZXJ0X2VxdWFsKEBjbGllbnQudGVzdEk2NCgtdmFsKSwgLXZhbCkKICAgZW5kCiAKICAgZGVmIHRlc3RfZG91YmxlCi0gICAgdmFsID0gMy4xNAorICAgIHAgJ3Rlc3RfZG91YmxlJworICAgIHZhbCA9IDMuMTQxNTkyNjUzNTg5NzkzMjM4NDYKICAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0RG91YmxlKHZhbCksIHZhbCkKICAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0RG91YmxlKC12YWwpLCAtdmFsKQogICAgIGFzc2VydF9raW5kX29mKEZsb2F0LCBAY2xpZW50LnRlc3REb3VibGUodmFsKSkKICAgZW5kCiAKKyAgZGVmIHRlc3RfYmluYXJ5CisgICAgcCAndGVzdF9iaW5hcnknCisgICAgdmFsID0gKDAuLi4yNTYpLnJldmVyc2VfZWFjaC50b19hCisgICAgcmV0ID0gQGNsaWVudC50ZXN0QmluYXJ5KHZhbC5wYWNrKCdDKicpKQorICAgIGFzc2VydF9lcXVhbCh2YWwsIHJldC5ieXRlcy50b19hKQorICBlbmQKKwogICBkZWYgdGVzdF9tYXAKKyAgICBwICd0ZXN0X21hcCcKICAgICB2YWwgPSB7MSA9PiAxLCAyID0+IDIsIDMgPT4gM30KICAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0TWFwKHZhbCksIHZhbCkKICAgICBhc3NlcnRfa2luZF9vZihIYXNoLCBAY2xpZW50LnRlc3RNYXAodmFsKSkKICAgZW5kCiAKKyAgZGVmIHRlc3Rfc3RyaW5nX21hcAorICAgIHAgJ3Rlc3Rfc3RyaW5nX21hcCcKKyAgICB2YWwgPSB7J2EnID0+ICcyJywgJ2InID0+ICdibGFoJywgJ3NvbWUnID0+ICd0aGluZyd9CisgICAgcmV0ID0gQGNsaWVudC50ZXN0U3RyaW5nTWFwKHZhbCkKKyAgICBhc3NlcnRfZXF1YWwodmFsLCByZXQpCisgICAgYXNzZXJ0X2tpbmRfb2YoSGFzaCwgcmV0KQorICBlbmQKKwogICBkZWYgdGVzdF9saXN0CisgICAgcCAndGVzdF9saXN0JwogICAgIHZhbCA9IFsxLDIsMyw0LDVdCiAgICAgYXNzZXJ0X2VxdWFsKEBjbGllbnQudGVzdExpc3QodmFsKSwgdmFsKQogICAgIGFzc2VydF9raW5kX29mKEFycmF5LCBAY2xpZW50LnRlc3RMaXN0KHZhbCkpCiAgIGVuZAogCiAgIGRlZiB0ZXN0X2VudW0KKyAgICBwICd0ZXN0X2VudW0nCiAgICAgdmFsID0gVGhyaWZ0OjpUZXN0OjpOdW1iZXJ6OjpTSVgKICAgICByZXQgPSBAY2xpZW50LnRlc3RFbnVtKHZhbCkKIApAQCAtMTM3LDYgKzIyOSw3IEBACiAgIGVuZAogCiAgIGRlZiB0ZXN0X3R5cGVkZWYKKyAgICBwICd0ZXN0X3R5cGVkZWYnCiAgICAgI1VzZXJJZCAgdGVzdFR5cGVkZWYoMTogVXNlcklkIHRoaW5nKSwKICAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0VHlwZWRlZigzMDk4NTgyMzUwODI1MjMpLCAzMDk4NTgyMzUwODI1MjMpCiAgICAgYXNzZXJ0X2tpbmRfb2YoRml4bnVtLCBAY2xpZW50LnRlc3RUeXBlZGVmKDMwOTg1ODIzNTA4MjUyMykpCkBAIC0xNDQsNiArMjM3LDcgQEAKICAgZW5kCiAKICAgZGVmIHRlc3Rfc2V0CisgICAgcCAndGVzdF9zZXQnCiAgICAgdmFsID0gU2V0Lm5ldyhbMSwyLDNdKQogICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3RTZXQodmFsKSwgdmFsKQogICAgIGFzc2VydF9raW5kX29mKFNldCwgQGNsaWVudC50ZXN0U2V0KHZhbCkpCkBAIC0xNTQsMjIgKzI0OCwyOCBAQAogICBlbmQKIAogICBkZWYgdGVzdF9zdHJ1Y3QKKyAgICBwICd0ZXN0X3N0cnVjdCcKICAgICByZXQgPSBAY2xpZW50LnRlc3RTdHJ1Y3QoZ2V0X3N0cnVjdCkKIAotICAgIGFzc2VydF9uaWwocmV0LmJ5dGVfdGhpbmcsIG5pbCkKLSAgICBhc3NlcnRfbmlsKHJldC5pNjRfdGhpbmcsIG5pbCkKKyAgICAjIFRPRE86IG5vdCBzdXJlIHdoYXQgdW5zcGVjaWZpZWQgImRlZmF1bHQiIHJlcXVpcmVkbmVzcyB2YWx1ZXMgc2hvdWxkIGJlCisgICAgYXNzZXJ0KHJldC5ieXRlX3RoaW5nID09IG5pbCB8fCByZXQuYnl0ZV90aGluZyA9PSAwKQorICAgIGFzc2VydChyZXQuaTY0X3RoaW5nID09IG5pbCB8fCByZXQuaTY0X3RoaW5nID09IDApCisKICAgICBhc3NlcnRfZXF1YWwocmV0LnN0cmluZ190aGluZywgJ2hpIScpCiAgICAgYXNzZXJ0X2VxdWFsKHJldC5pMzJfdGhpbmcsIDQpCiAgICAgYXNzZXJ0X2tpbmRfb2YoVGhyaWZ0OjpUZXN0OjpYdHJ1Y3QsIHJldCkKICAgZW5kCiAKICAgZGVmIHRlc3RfbmVzdAorICAgIHAgJ3Rlc3RfbmVzdCcKICAgICBzdHJ1Y3QyID0gVGhyaWZ0OjpUZXN0OjpYdHJ1Y3QyLm5ldyh7J3N0cnVjdF90aGluZycgPT4gZ2V0X3N0cnVjdCwgJ2kzMl90aGluZycgPT4gMTB9KQogCiAgICAgcmV0ID0gQGNsaWVudC50ZXN0TmVzdChzdHJ1Y3QyKQogCi0gICAgYXNzZXJ0X25pbChyZXQuc3RydWN0X3RoaW5nLmJ5dGVfdGhpbmcsIG5pbCkKLSAgICBhc3NlcnRfbmlsKHJldC5zdHJ1Y3RfdGhpbmcuaTY0X3RoaW5nLCBuaWwpCisgICAgIyBUT0RPOiBub3Qgc3VyZSB3aGF0IHVuc3BlY2lmaWVkICJkZWZhdWx0IiByZXF1aXJlZG5lc3MgdmFsdWVzIHNob3VsZCBiZQorICAgIGFzc2VydChyZXQuc3RydWN0X3RoaW5nLmJ5dGVfdGhpbmcgPT0gbmlsIHx8IHJldC5zdHJ1Y3RfdGhpbmcuYnl0ZV90aGluZyA9PSAwKQorICAgIGFzc2VydChyZXQuc3RydWN0X3RoaW5nLmk2NF90aGluZyA9PSBuaWwgfHwgcmV0LnN0cnVjdF90aGluZy5pNjRfdGhpbmcgPT0gMCkKKwogICAgIGFzc2VydF9lcXVhbChyZXQuc3RydWN0X3RoaW5nLnN0cmluZ190aGluZywgJ2hpIScpCiAgICAgYXNzZXJ0X2VxdWFsKHJldC5zdHJ1Y3RfdGhpbmcuaTMyX3RoaW5nLCA0KQogICAgIGFzc2VydF9lcXVhbChyZXQuaTMyX3RoaW5nLCAxMCkKQEAgLTE3OSw0OSArMjc5LDg3IEBACiAgIGVuZAogCiAgIGRlZiB0ZXN0X2luc2FuaXR5CisgICAgcCAndGVzdF9pbnNhbml0eScKICAgICBpbnNhbmUgPSBUaHJpZnQ6OlRlc3Q6Okluc2FuaXR5Lm5ldyh7Ci0gICAgICAndXNlck1hcCcgPT4geyBUaHJpZnQ6OlRlc3Q6Ok51bWJlcno6Ok9ORSA9PiA0NCB9LAotICAgICAgJ3h0cnVjdHMnID0+IFtnZXRfc3RydWN0LAorICAgICAgJ3VzZXJNYXAnID0+IHsKKyAgICAgICAgVGhyaWZ0OjpUZXN0OjpOdW1iZXJ6OjpGSVZFID0+IDUsCisgICAgICAgIFRocmlmdDo6VGVzdDo6TnVtYmVyejo6RUlHSFQgPT4gOCwKKyAgICAgIH0sCisgICAgICAneHRydWN0cycgPT4gWwogICAgICAgICBUaHJpZnQ6OlRlc3Q6Olh0cnVjdC5uZXcoewotICAgICAgICAgICdzdHJpbmdfdGhpbmcnID0+ICdoaSBhZ2FpbicsCi0gICAgICAgICAgJ2kzMl90aGluZycgPT4gMTIKKyAgICAgICAgICAnc3RyaW5nX3RoaW5nJyA9PiAnR29vZGJ5ZTQnLAorICAgICAgICAgICdieXRlX3RoaW5nJyA9PiA0LAorICAgICAgICAgICdpMzJfdGhpbmcnID0+IDQsCisgICAgICAgICAgJ2k2NF90aGluZycgPT4gNCwKKyAgICAgICAgfSksCisgICAgICAgIFRocmlmdDo6VGVzdDo6WHRydWN0Lm5ldyh7CisgICAgICAgICAgJ3N0cmluZ190aGluZycgPT4gJ0hlbGxvMicsCisgICAgICAgICAgJ2J5dGVfdGhpbmcnID0+IDIsCisgICAgICAgICAgJ2kzMl90aGluZycgPT4gMiwKKyAgICAgICAgICAnaTY0X3RoaW5nJyA9PiAyLAogICAgICAgICB9KQogICAgICAgXQogICAgIH0pCiAKICAgICByZXQgPSBAY2xpZW50LnRlc3RJbnNhbml0eShpbnNhbmUpCiAKLSAgICBhc3NlcnRfbm90X25pbChyZXRbNDRdKQotICAgIGFzc2VydF9ub3RfbmlsKHJldFs0NF1bMV0pCisgICAgYXNzZXJ0X2VxdWFsKGluc2FuZSwgcmV0WzFdWzJdKQorICAgIGFzc2VydF9lcXVhbChpbnNhbmUsIHJldFsxXVszXSkKIAotICAgIHN0cnVjdCA9IHJldFs0NF1bMV0KLQotICAgIGFzc2VydF9lcXVhbChzdHJ1Y3QudXNlck1hcFtUaHJpZnQ6OlRlc3Q6Ok51bWJlcno6Ok9ORV0sIDQ0KQotICAgIGFzc2VydF9lcXVhbChzdHJ1Y3QueHRydWN0c1sxXS5zdHJpbmdfdGhpbmcsICdoaSBhZ2FpbicpCi0gICAgYXNzZXJ0X2VxdWFsKHN0cnVjdC54dHJ1Y3RzWzFdLmkzMl90aGluZywgMTIpCi0KLSAgICBhc3NlcnRfa2luZF9vZihIYXNoLCBzdHJ1Y3QudXNlck1hcCkKLSAgICBhc3NlcnRfa2luZF9vZihBcnJheSwgc3RydWN0Lnh0cnVjdHMpCi0gICAgYXNzZXJ0X2tpbmRfb2YoVGhyaWZ0OjpUZXN0OjpJbnNhbml0eSwgc3RydWN0KQorICAgIGFzc2VydChyZXRbMl1bNl0udXNlck1hcCA9PSBuaWwgfHwgcmV0WzJdWzZdLnVzZXJNYXAubGVuZ3RoID09IDApCisgICAgYXNzZXJ0KHJldFsyXVs2XS54dHJ1Y3RzID09IG5pbCB8fCByZXRbMl1bNl0ueHRydWN0cy5sZW5ndGggPT0gMCkKICAgZW5kCiAKICAgZGVmIHRlc3RfbWFwX21hcAorICAgIHAgJ3Rlc3RfbWFwX21hcCcKICAgICByZXQgPSBAY2xpZW50LnRlc3RNYXBNYXAoNCkKICAgICBhc3NlcnRfa2luZF9vZihIYXNoLCByZXQpCi0gICAgYXNzZXJ0X2VxdWFsKHJldCwgeyA0ID0+IHsgNCA9PiA0fX0pCisgICAgZXhwZWN0ZWQgPSB7CisgICAgICAtNCA9PiB7CisgICAgICAgIC00ID0+IC00LAorICAgICAgICAtMyA9PiAtMywKKyAgICAgICAgLTIgPT4gLTIsCisgICAgICAgIC0xID0+IC0xLAorICAgICAgfSwKKyAgICAgIDQgPT4geworICAgICAgICA0ID0+IDQsCisgICAgICAgIDMgPT4gMywKKyAgICAgICAgMiA9PiAyLAorICAgICAgICAxID0+IDEsCisgICAgICB9CisgICAgfQorICAgIGFzc2VydF9lcXVhbChleHBlY3RlZCwgcmV0KQorICBlbmQKKworICBkZWYgdGVzdF9tdWx0aQorICAgIHAgJ3Rlc3RfbXVsdGknCisgICAgcmV0ID0gQGNsaWVudC50ZXN0TXVsdGkoNDIsIDQyNDIsIDQyNDI0MiwgezEgPT4gJ2JsYWgnLCAyID0+ICd0aGluZyd9LCBUaHJpZnQ6OlRlc3Q6Ok51bWJlcno6OkVJR0hULCAyNCkKKyAgICBleHBlY3RlZCA9IFRocmlmdDo6VGVzdDo6WHRydWN0Lm5ldyh7CisgICAgICA6c3RyaW5nX3RoaW5nID0+ICdIZWxsbzInLAorICAgICAgOmJ5dGVfdGhpbmcgPT4gICA0MiwKKyAgICAgIDppMzJfdGhpbmcgPT4gICAgNDI0MiwKKyAgICAgIDppNjRfdGhpbmcgPT4gICAgNDI0MjQyCisgICAgfSkKKyAgICBhc3NlcnRfZXF1YWwoZXhwZWN0ZWQsIHJldCkKICAgZW5kCiAKICAgZGVmIHRlc3RfZXhjZXB0aW9uCisgICAgcCAndGVzdF9leGNlcHRpb24nCiAgICAgYXNzZXJ0X3JhaXNlIFRocmlmdDo6VGVzdDo6WGNlcHRpb24gZG8KICAgICAgIEBjbGllbnQudGVzdEV4Y2VwdGlvbignWGNlcHRpb24nKQogICAgIGVuZAotIyAgICBhc3NlcnRfcmFpc2UgVGhyaWZ0OjpURXhjZXB0aW9uIGRvCi0jICAgICAgQGNsaWVudC50ZXN0RXhjZXB0aW9uKCdURXhjZXB0aW9uJykKLSMgICAgZW5kCi0gICAgYXNzZXJ0X2VxdWFsKCBAY2xpZW50LnRlc3RFeGNlcHRpb24oJ3Rlc3QnKSwgInRlc3QiKQorICAgIGJlZ2luCisgICAgICBAY2xpZW50LnRlc3RFeGNlcHRpb24oJ1RFeGNlcHRpb24nKQorICAgIHJlc2N1ZSA9PiBlCisgICAgICBhc3NlcnQgZS5jbGFzcy5hbmNlc3RvcnMuaW5jbHVkZT8oVGhyaWZ0OjpFeGNlcHRpb24pCisgICAgZW5kCisgICAgYXNzZXJ0X25vdGhpbmdfcmFpc2VkIGRvCisgICAgICBAY2xpZW50LnRlc3RFeGNlcHRpb24oJ3Rlc3QnKQorICAgIGVuZAogICBlbmQKIAogICBkZWYgdGVzdF9tdWx0aV9leGNlcHRpb24KKyAgICBwICd0ZXN0X211bHRpX2V4Y2VwdGlvbicKICAgICBhc3NlcnRfcmFpc2UgVGhyaWZ0OjpUZXN0OjpYY2VwdGlvbiBkbwogICAgICAgQGNsaWVudC50ZXN0TXVsdGlFeGNlcHRpb24oIlhjZXB0aW9uIiwgInRlc3QgMSIpCiAgICAgZW5kCkBAIC0yMzIsMTAgKzM3MCwxMSBAQAogICBlbmQKIAogICBkZWYgdGVzdF9vbmV3YXkKKyAgICBwICd0ZXN0X29uZXdheScKICAgICB0aW1lMSA9IFRpbWUubm93LnRvX2YKLSAgICBAY2xpZW50LnRlc3RPbmV3YXkoMykKKyAgICBAY2xpZW50LnRlc3RPbmV3YXkoMSkKICAgICB0aW1lMiA9IFRpbWUubm93LnRvX2YKLSAgICBhc3NlcnRfZXF1YWwoKHRpbWUyLXRpbWUxKSoxMDAwMDAwPDQwMCwgdHJ1ZSkKKyAgICBhc3NlcnRfb3BlcmF0b3IgKHRpbWUyLXRpbWUxKSwgOjwsIDAuMQogICBlbmQKIAogZW5kCmRpZmYgLS1naXQgYS90ZXN0L3JiL2ludGVncmF0aW9uL1Rlc3RTZXJ2ZXIucmIgYi90ZXN0L3JiL2ludGVncmF0aW9uL1Rlc3RTZXJ2ZXIucmIKaW5kZXggM2UzNjVjYS4uN2NhZjZhOCAxMDA3NTUKLS0tIGEvdGVzdC9yYi9pbnRlZ3JhdGlvbi9UZXN0U2VydmVyLnJiCisrKyBiL3Rlc3QvcmIvaW50ZWdyYXRpb24vVGVzdFNlcnZlci5yYgpAQCAtMjQsMTMgKzI0LDE2IEBACiByZXF1aXJlICd0ZXN0X2hlbHBlcicKIHJlcXVpcmUgJ3RocmlmdCcKIHJlcXVpcmUgJ3RocmlmdF90ZXN0JworcmVxdWlyZSAndGhyaWZ0X3Rlc3RfdHlwZXMnCiAKIGNsYXNzIFNpbXBsZUhhbmRsZXIKLSAgWzp0ZXN0Vm9pZCwgOnRlc3RTdHJpbmcsIDp0ZXN0Qnl0ZSwgOnRlc3RJMzIsIDp0ZXN0STY0LCA6dGVzdERvdWJsZSwKLSAgIDp0ZXN0U3RydWN0LCA6dGVzdE1hcCwgOnRlc3RTZXQsIDp0ZXN0TGlzdCwgOnRlc3ROZXN0LAorICBbOnRlc3RWb2lkLCA6dGVzdFN0cmluZywgOnRlc3RCb29sLCA6dGVzdEJ5dGUsIDp0ZXN0STMyLCA6dGVzdEk2NCwgOnRlc3REb3VibGUsIDp0ZXN0QmluYXJ5LAorICAgOnRlc3RTdHJ1Y3QsIDp0ZXN0TWFwLCA6dGVzdFN0cmluZ01hcCwgOnRlc3RTZXQsIDp0ZXN0TGlzdCwgOnRlc3ROZXN0LCA6dGVzdEVudW0sIDp0ZXN0VHlwZWRlZiwKICAgIDp0ZXN0RW51bSwgOnRlc3RUeXBlZGVmLCA6dGVzdE11bHRpRXhjZXB0aW9uXS5lYWNoIGRvIHxtZXRofAogCiAgICAgZGVmaW5lX21ldGhvZChtZXRoKSBkbyB8dGhpbmd8CisgICAgICBwIG1ldGgKKyAgICAgIHAgdGhpbmcKICAgICAgIHRoaW5nCiAgICAgZW5kCiAKQEAgLTQwLDU5ICs0Myw5MyBAQAogICBlbmQKIAogICBkZWYgdGVzdEluc2FuaXR5KHRoaW5nKQotICAgIG51bSwgdWlkID0gdGhpbmcudXNlck1hcC5maW5kIHsgdHJ1ZSB9Ci0gICAgcmV0dXJuIHt1aWQgPT4ge251bSA9PiB0aGluZ319CisgICAgcmV0dXJuIHsKKyAgICAgIDEgPT4geworICAgICAgICAyID0+IHRoaW5nLAorICAgICAgICAzID0+IHRoaW5nCisgICAgICB9LAorICAgICAgMiA9PiB7CisgICAgICAgIDYgPT4gVGhyaWZ0OjpUZXN0OjpJbnNhbml0eTo6bmV3KCkKKyAgICAgIH0KKyAgICB9CiAgIGVuZAogCiAgIGRlZiB0ZXN0TWFwTWFwKHRoaW5nKQotICAgIHJldHVybiB7dGhpbmcgPT4ge3RoaW5nID0+IHRoaW5nfX0KKyAgICByZXR1cm4geworICAgICAgLTQgPT4geworICAgICAgICAtNCA9PiAtNCwKKyAgICAgICAgLTMgPT4gLTMsCisgICAgICAgIC0yID0+IC0yLAorICAgICAgICAtMSA9PiAtMSwKKyAgICAgIH0sCisgICAgICA0ID0+IHsKKyAgICAgICAgNCA9PiA0LAorICAgICAgICAzID0+IDMsCisgICAgICAgIDIgPT4gMiwKKyAgICAgICAgMSA9PiAxLAorICAgICAgfQorICAgIH0KICAgZW5kCiAKLSAgZGVmIHRlc3RFbnVtKHRoaW5nKQotICAgIHJldHVybiB0aGluZwotICBlbmQKLQotICBkZWYgdGVzdFR5cGVkZWYodGhpbmcpCi0gICAgcmV0dXJuIHRoaW5nCisgIGRlZiB0ZXN0TXVsdGkoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSkKKyAgICByZXR1cm4gVGhyaWZ0OjpUZXN0OjpYdHJ1Y3QubmV3KHsKKyAgICAgICdzdHJpbmdfdGhpbmcnID0+ICdIZWxsbzInLAorICAgICAgJ2J5dGVfdGhpbmcnID0+IGFyZzAsCisgICAgICAnaTMyX3RoaW5nJyA9PiBhcmcxLAorICAgICAgJ2k2NF90aGluZycgPT4gYXJnMiwKKyAgICB9KQogICBlbmQKIAogICBkZWYgdGVzdEV4Y2VwdGlvbih0aGluZykKICAgICBpZiB0aGluZyA9PSAiWGNlcHRpb24iCi0gICAgICByYWlzZSBUaHJpZnQ6OlRlc3Q6OlhjZXB0aW9uLCA6bWVzc2FnZSA9PiB0aGluZworICAgICAgcmFpc2UgVGhyaWZ0OjpUZXN0OjpYY2VwdGlvbiwgOmVycm9yQ29kZSA9PiAxMDAxLCA6bWVzc2FnZSA9PiB0aGluZwogICAgIGVsc2lmIHRoaW5nID09ICJURXhjZXB0aW9uIgotICAgICAgcmFpc2UgVGhyaWZ0OjpUZXN0OjpURXhjZXB0aW9uLCA6bWVzc2FnZSA9PiB0aGluZworICAgICAgcmFpc2UgVGhyaWZ0OjpFeGNlcHRpb24sIDptZXNzYWdlID0+IHRoaW5nCiAgICAgZWxzZQotICAgICAgcmV0dXJuIGFyZzEKKyAgICAgICMgbm8tb3AKICAgICBlbmQKICAgZW5kCiAKICAgZGVmIHRlc3RNdWx0aUV4Y2VwdGlvbihhcmcwLCBhcmcxKQogICAgIGlmIGFyZzAgPT0gIlhjZXB0aW9uMiIKLSAgICAgIHJhaXNlIFRocmlmdDo6VGVzdDo6WGNlcHRpb24yLCA6bWVzc2FnZSA9PiAnVGhpcyBpcyBhbiBYY2VwdGlvbjInCisgICAgICByYWlzZSBUaHJpZnQ6OlRlc3Q6OlhjZXB0aW9uMiwgOmVycm9yQ29kZSA9PiAyMDAyLCA6c3RydWN0X3RoaW5nID0+IDo6VGhyaWZ0OjpUZXN0OjpYdHJ1Y3QubmV3KHsgOnN0cmluZ190aGluZyA9PiAnVGhpcyBpcyBhbiBYY2VwdGlvbjInIH0pCiAgICAgZWxzaWYgYXJnMCA9PSAiWGNlcHRpb24iCi0gICAgICByYWlzZSBUaHJpZnQ6OlRlc3Q6OlhjZXB0aW9uLCA6bWVzc2FnZSA9PiAnVGhpcyBpcyBhbiBYY2VwdGlvbicKKyAgICAgIHJhaXNlIFRocmlmdDo6VGVzdDo6WGNlcHRpb24sIDplcnJvckNvZGUgPT4gMTAwMSwgOm1lc3NhZ2UgPT4gJ1RoaXMgaXMgYW4gWGNlcHRpb24nCiAgICAgZWxzZQotICAgICAgcmV0dXJuIGFyZzEKKyAgICAgIHJldHVybiA6OlRocmlmdDo6VGVzdDo6WHRydWN0Lm5ldyh7J3N0cmluZ190aGluZycgPT4gYXJnMX0pCiAgICAgZW5kCiAgIGVuZAogCisgIGRlZiB0ZXN0T25ld2F5KGFyZzApCisgICAgc2xlZXAoYXJnMCkKKyAgZW5kCisKIGVuZAogCi1wcm90b2NvbCA9ICJiaW5hcnkiCitkb21haW5fc29ja2V0ID0gbmlsCiBwb3J0ID0gOTA5MAorcHJvdG9jb2wgPSAiYmluYXJ5IgorQHByb3RvY29sRmFjdG9yeSA9IG5pbAorc3NsID0gZmFsc2UKIHRyYW5zcG9ydCA9ICJidWZmZXJlZCIKLUB0cmFuc3BvcnRGYWN0b3J5ID0gVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkubmV3Ci1AcHJvdG9jb2xGYWN0b3J5ID0gVGhyaWZ0OjpCaW5hcnlQcm90b2NvbEZhY3RvcnkubmV3CitAdHJhbnNwb3J0RmFjdG9yeSA9IG5pbAorCiBBUkdWLmVhY2ggZG98YXwKICAgaWYgYSA9PSAiLS1oZWxwIgogICAgIHB1dHMgIkFsbG93ZWQgb3B0aW9uczoiCiAgICAgcHV0cyAiXHQgLWggWyAtLWhlbHAgXSBcdCBwcm9kdWNlIGhlbHAgbWVzc2FnZSIKLSAgICBwdXRzICJcdC0tcG9ydCBhcmcgKD05MDkwKSBcdCBQb3J0IG51bWJlciB0byBsaXN0ZW4iCi0gICAgcHV0cyAiXHQtLXByb3RvY29sIGFyZyAoPWJpbmFyeSkgXHQgcHJvdG9jb2w6IGJpbmFyeSwgYWNjZWwiCisgICAgcHV0cyAiXHQtLWRvbWFpbi1zb2NrZXQgYXJnICg9KSBcdCBVbml4IGRvbWFpbiBzb2NrZXQgcGF0aCIKKyAgICBwdXRzICJcdC0tcG9ydCBhcmcgKD05MDkwKSBcdCBQb3J0IG51bWJlciB0byBsaXN0ZW4gXHQgbm90IHZhbGlkIHdpdGggZG9tYWluLXNvY2tldCIKKyAgICBwdXRzICJcdC0tcHJvdG9jb2wgYXJnICg9YmluYXJ5KSBcdCBwcm90b2NvbDogYWNjZWwsIGJpbmFyeSwgY29tcGFjdCwganNvbiIKKyAgICBwdXRzICJcdC0tc3NsIFx0IHVzZSBzc2wgXHQgbm90IHZhbGlkIHdpdGggZG9tYWluLXNvY2tldCIKICAgICBwdXRzICJcdC0tdHJhbnNwb3J0IGFyZyAoPWJ1ZmZlcmVkKSB0cmFuc3BvcnQ6IGJ1ZmZlcmVkLCBmcmFtZWQsIGh0dHAiCiAgICAgZXhpdAorICBlbHNpZiBhLnN0YXJ0X3dpdGg/KCItLWRvbWFpbi1zb2NrZXQiKQorICAgIGRvbWFpbl9zb2NrZXQgPSBhLnNwbGl0KCI9IilbMV0KICAgZWxzaWYgYS5zdGFydF93aXRoPygiLS1wcm90b2NvbCIpCiAgICAgcHJvdG9jb2wgPSBhLnNwbGl0KCI9IilbMV0KKyAgZWxzaWYgYSA9PSAiLS1zc2wiCisgICAgc3NsID0gdHJ1ZQogICBlbHNpZiBhLnN0YXJ0X3dpdGg/KCItLXRyYW5zcG9ydCIpCiAgICAgdHJhbnNwb3J0ID0gYS5zcGxpdCgiPSIpWzFdCiAgIGVsc2lmIGEuc3RhcnRfd2l0aD8oIi0tcG9ydCIpCkBAIC0xMDAsOSArMTM3LDcgQEAKICAgZW5kCiBlbmQKIAotaWYgcHJvdG9jb2wgPT0gImJpbmFyeSIKLSAgQHByb3RvY29sRmFjdG9yeSA9IFRocmlmdDo6QmluYXJ5UHJvdG9jb2xGYWN0b3J5Lm5ldwotZWxzaWYgcHJvdG9jb2wgPT0gIiIKK2lmIHByb3RvY29sID09ICJiaW5hcnkiIHx8IHByb3RvY29sLnRvX3Muc3RyaXAuZW1wdHk/CiAgIEBwcm90b2NvbEZhY3RvcnkgPSBUaHJpZnQ6OkJpbmFyeVByb3RvY29sRmFjdG9yeS5uZXcKIGVsc2lmIHByb3RvY29sID09ICJjb21wYWN0IgogICBAcHJvdG9jb2xGYWN0b3J5ID0gVGhyaWZ0OjpDb21wYWN0UHJvdG9jb2xGYWN0b3J5Lm5ldwpAQCAtMTE0LDkgKzE0OSw3IEBACiAgIHJhaXNlICdVbmtub3duIHByb3RvY29sIHR5cGUnCiBlbmQKIAotaWYgdHJhbnNwb3J0ID09ICJidWZmZXJlZCIKLSAgQHRyYW5zcG9ydEZhY3RvcnkgPSBUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeS5uZXcKLWVsc2lmIHRyYW5zcG9ydCA9PSAiIgoraWYgdHJhbnNwb3J0ID09ICJidWZmZXJlZCIgfHwgdHJhbnNwb3J0LnRvX3Muc3RyaXAuZW1wdHk/CiAgIEB0cmFuc3BvcnRGYWN0b3J5ID0gVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkubmV3CiBlbHNpZiB0cmFuc3BvcnQgPT0gImZyYW1lZCIKICAgQHRyYW5zcG9ydEZhY3RvcnkgPSBUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydEZhY3RvcnkubmV3CkBAIC0xMjQsOCArMTU3LDMyIEBACiAgIHJhaXNlICdVbmtub3duIHRyYW5zcG9ydCB0eXBlJwogZW5kCiAKLUBoYW5kbGVyICAgPSBTaW1wbGVIYW5kbGVyLm5ldworQGhhbmRsZXIgPSBTaW1wbGVIYW5kbGVyLm5ldwogQHByb2Nlc3NvciA9IFRocmlmdDo6VGVzdDo6VGhyaWZ0VGVzdDo6UHJvY2Vzc29yLm5ldyhAaGFuZGxlcikKLUB0cmFuc3BvcnQgPSBUaHJpZnQ6OlNlcnZlclNvY2tldC5uZXcocG9ydCkKLUBzZXJ2ZXIgICAgPSBUaHJpZnQ6OlRocmVhZGVkU2VydmVyLm5ldyhAcHJvY2Vzc29yLCBAdHJhbnNwb3J0LCBAdHJhbnNwb3J0RmFjdG9yeSwgQHByb3RvY29sRmFjdG9yeSkKK0B0cmFuc3BvcnQgPSBuaWwKK2lmIGRvbWFpbl9zb2NrZXQudG9fcy5zdHJpcC5lbXB0eT8KKyAgaWYgc3NsCisgICAgIyB0aGUgd29ya2luZyBkaXJlY3RvcnkgZm9yIHJ1YnkgY3Jvc3N0ZXN0IGlzIHRlc3QvcmIvZ2VuLXJiCisgICAga2V5c0RpciA9IEZpbGUuam9pbihGaWxlLmRpcm5hbWUoRmlsZS5kaXJuYW1lKERpci5wd2QpKSwgImtleXMiKQorICAgIGN0eCA9IE9wZW5TU0w6OlNTTDo6U1NMQ29udGV4dC5uZXcKKyAgICBjdHguY2FfZmlsZSA9IEZpbGUuam9pbihrZXlzRGlyLCAiQ0EucGVtIikKKyAgICBjdHguY2VydCA9IE9wZW5TU0w6Olg1MDk6OkNlcnRpZmljYXRlLm5ldyhGaWxlLm9wZW4oRmlsZS5qb2luKGtleXNEaXIsICJzZXJ2ZXIuY3J0IikpKQorICAgIGN0eC5jZXJ0X3N0b3JlID0gT3BlblNTTDo6WDUwOTo6U3RvcmUubmV3CisgICAgY3R4LmNlcnRfc3RvcmUuYWRkX2ZpbGUoRmlsZS5qb2luKGtleXNEaXIsICdjbGllbnQucGVtJykpCisgICAgY3R4LmtleSA9IE9wZW5TU0w6OlBLZXk6OlJTQS5uZXcoRmlsZS5vcGVuKEZpbGUuam9pbihrZXlzRGlyLCAic2VydmVyLmtleSIpKSkKKyAgICBjdHgub3B0aW9ucyA9IE9wZW5TU0w6OlNTTDo6T1BfTk9fU1NMdjIgfCBPcGVuU1NMOjpTU0w6Ok9QX05PX1NTTHYzCisgICAgY3R4LnNzbF92ZXJzaW9uID0gOlNTTHYyMworICAgIGN0eC52ZXJpZnlfbW9kZSA9IE9wZW5TU0w6OlNTTDo6VkVSSUZZX1BFRVIKKyAgICBAdHJhbnNwb3J0ID0gVGhyaWZ0OjpTU0xTZXJ2ZXJTb2NrZXQubmV3KG5pbCwgcG9ydCwgY3R4KQorICBlbHNlCisgICAgQHRyYW5zcG9ydCA9IFRocmlmdDo6U2VydmVyU29ja2V0Lm5ldyhwb3J0KQorICBlbmQKK2Vsc2UKKyAgQHRyYW5zcG9ydCA9IFRocmlmdDo6VU5JWFNlcnZlclNvY2tldC5uZXcoZG9tYWluX3NvY2tldCkKK2VuZAorCitAc2VydmVyID0gVGhyaWZ0OjpUaHJlYWRlZFNlcnZlci5uZXcoQHByb2Nlc3NvciwgQHRyYW5zcG9ydCwgQHRyYW5zcG9ydEZhY3RvcnksIEBwcm90b2NvbEZhY3RvcnkpCisKK3B1dHMgIlN0YXJ0aW5nIFRlc3RTZXJ2ZXIgI3tAc2VydmVyLnRvX3N9IgogQHNlcnZlci5zZXJ2ZQorcHV0cyAiZG9uZS4iCmRpZmYgLS1naXQgYS90ZXN0L3JlYnVpbGRfa25vd25fZmFpbHVyZXMuc2ggYi90ZXN0L3JlYnVpbGRfa25vd25fZmFpbHVyZXMuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg4NjlmZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvcmVidWlsZF9rbm93bl9mYWlsdXJlcy5zaApAQCAtMCwwICsxLDI0IEBACisjIS9iaW4vYmFzaAorCitpZiBbIC16ICQxIF07IHRoZW4KKyAgZWNobyBVc2FnZTogJDAgTEFOR1VBR0UKKyAgZWNobyBSZS1saXN0IGFsbCBmYWlsdXJlcyBvZiBhIHNwZWNpZmljIExBTkdVQUdFIGludG8ga25vd25fZmFpbHVyZXNfTGludXguanNvbgorICBlY2hvIExBTkdVQUdFIHNob3VsZCBiZSBsaWJyYXJ5IG5hbWUgbGlrZSBjcHAsIGphdmEsIHB5IGV0YworICBleGl0IDEKK2ZpCisKK2lmIFsgLXogJFBZVEhPTl07IHRoZW4KKyAgUFlUSE9OPXB5dGhvbgorZmkKKworVEFSR0VUX0xBTkc9JDEKK09VVF9GSUxFPWtub3duX2ZhaWx1cmVzX0xpbnV4Lmpzb24KK2VjaG8gUmVidWlsZGluZyBrbm93biBmYWlsdXJlcyBmb3IgJFRBUkdFVF9MQU5HCisKK1RNUEZJTEU9Ll9fdG1wX19yZWJ1aWxkX18KK2dyZXAgLXYgLWUgIlwiJDEtIiAtZSAiXC0kMV8iICRPVVRfRklMRSA+ICRUTVBGSUxFCittdiAkVE1QRklMRSAkT1VUX0ZJTEUKKyRQWVRIT04gdGVzdC5weSAtLWNsaWVudCAkMQorJFBZVEhPTiB0ZXN0LnB5IC1VIG1lcmdlCiskUFlUSE9OIHRlc3QucHkgLS1zZXJ2ZXIgJDEKKyRQWVRIT04gdGVzdC5weSAtVSBtZXJnZQpkaWZmIC0tZ2l0IGEvdGVzdC9yZXN1bHQuaHRtbCBiL3Rlc3QvcmVzdWx0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyZGFjMmMuLjAwMDAwMDAKLS0tIGEvdGVzdC9yZXN1bHQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGNoYXJzZXQ9InV0Zi04Ij4KLTx0aXRsZT5BcGFjaGUgVGhyaWZ0IC0gaW50ZWdyYXRpb24gdGVzdCBzdWl0ZTwvdGl0bGU+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJodHRwOi8vY2RuLmRhdGF0YWJsZXMubmV0LzEuMTAuMC9jc3MvanF1ZXJ5LmRhdGFUYWJsZXMuY3NzIj4KLTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCIgc3JjPSJodHRwOi8vY29kZS5qcXVlcnkuY29tL2pxdWVyeS0xLjEwLjIubWluLmpzIj48L3NjcmlwdD4KLTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCIgc3JjPSJodHRwOi8vY2RuLmRhdGF0YWJsZXMubmV0LzEuMTAuMC9qcy9qcXVlcnkuZGF0YVRhYmxlcy5qcyI+PC9zY3JpcHQ+Ci08c2NyaXB0PgotIHZhciB0ZXN0X2RhdGE7Ci0KLSAgICAkKGRvY3VtZW50KS5yZWFkeSggZnVuY3Rpb24gKCkgewotICAgICAgJC5nZXRKU09OKCdyZXN1bHRzLmpzb24nLCBmdW5jdGlvbih0ZXN0RGF0YSkgewotICAgICAgICAgIHRlc3RUYWJsZSA9ICQoJyN0ZXN0X3Jlc3VsdHMnKS5EYXRhVGFibGUoIHsKLSAgICAgICAgICAgIGRhdGE6IHRlc3REYXRhLAotICAgICAgImNvbHVtbkRlZnMiOiBbCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgInJlbmRlciI6IGZ1bmN0aW9uICggZGF0YSwgdHlwZSwgcm93ICkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF0YSArJyAoJysgJzxhIGhyZWY9Iicrcm93WzVdLkNsaWVudCsnIj5DbGllbnQ8L2E+LDxhIGhyZWY9Iicrcm93WzVdLlNlcnZlcisnIj5TZXJ2ZXI8L2E+JysnKSc7Ci0gICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICAidGFyZ2V0cyI6IDQKLSAgICAgICAgICAgIH0KLSAgICAgICAgXQotCi0gICAgICAgICAgfSk7Ci0gICAgICAgICQoJyN0ZXN0X3Jlc3VsdHNfZmlsdGVyIGxhYmVsIGlucHV0JykKLSAgICAgICAgICAuZm9jdXMoKQotICAgICAgICAgIC52YWwoJ2ZhaWx1cmUnKTsKLSAgICAgICAgfSk7Ci0gICAgICB9KTsKLTwvc2NyaXB0PgotPC9oZWFkPgotPGJvZHk+Ci08aDI+QXBhY2hlIFRocmlmdCAtIGludGVncmF0aW9uIHRlc3Qgc3VpdGU6IFJlc3VsdHM8L2gyPgotPHRhYmxlIGlkPSJ0ZXN0X3Jlc3VsdHMiIGNsYXNzPSJkaXNwbGF5Ij4KLSAgICA8dGhlYWQ+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0aD5TZXJ2ZXI8L3RoPgotICAgICAgICAgICAgPHRoPkNsaWVudDwvdGg+Ci0gICAgICAgICAgICA8dGg+UHJvdG9jb2w8L3RoPgotICAgICAgICAgICAgPHRoPlRyYW5zcG9ydDwvdGg+Ci0gICAgICAgICAgICA8dGg+UmVzdWx0IChsb2cpPC90aD4KLSAgICAgICAgPC90cj4KLSAgICA8L3RoZWFkPgotPC90YWJsZT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rlc3QvcmVzdWx0LmpzIGIvdGVzdC9yZXN1bHQuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThiMWE1OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvcmVzdWx0LmpzCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIHVuZGVyIHRoZSBMaWNlbnNlLgorCisqLworCiskLmdldEpTT04oJ3Jlc3VsdHMuanNvbicsIGZ1bmN0aW9uKHJlc3VsdHMpIHsKKyAgICAkKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpIHsKKyAgICAgICAgdmFyIHRyYW5zcG9ydCA9IDM7CisgICAgICAgIHZhciBzb2NrZXQgPSA0OworICAgICAgICB2YXIgc3VjY2VzcyA9IDU7CisgICAgICAgIHZhciBleHBlY3RlZCA9IDY7CisgICAgICAgIHZhciByZXR1cm5Db2RlID0gNzsKKyAgICAgICAgdmFyIGxvZ0ZpbGUgPSA4OworICAgICAgICB0ZXN0VGFibGUgPSAkKCcjdGVzdF9yZXN1bHRzJykuRGF0YVRhYmxlKHsKKyAgICAgICAgICAgIGRhdGE6IHJlc3VsdHNbJ3Jlc3VsdHMnXSwKKyAgICAgICAgICAgIGNvbHVtbkRlZnM6IFsKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRhcmdldHM6IDMsCisgICAgICAgICAgICAgICAgICAgIHJlbmRlcjogZnVuY3Rpb24oZGF0YSwgdHlwZSwgcm93KSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcm93W3RyYW5zcG9ydF0gKyAnLScgKyByb3dbc29ja2V0XTsKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0czogNCwKKyAgICAgICAgICAgICAgICAgICAgcmVuZGVyOiBmdW5jdGlvbihkYXRhLCB0eXBlLCByb3cpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAocm93W3N1Y2Nlc3NdID8gJ3N1Y2Nlc3MnIDogJ2ZhaWx1cmUnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICcoJyArIChyb3dbcmV0dXJuQ29kZV0gPT0gMTI4ID8gJ3RpbWVvdXQnIDogcm93W3JldHVybkNvZGVdKSArICcpJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICcoPGEgaHJlZj0iJyArIHJvd1tsb2dGaWxlXS5zZXJ2ZXIgKyAnIj5TZXJ2ZXI8L2E+LCAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgJzxhIGhyZWY9IicgKyByb3dbbG9nRmlsZV0uY2xpZW50ICsgJyI+Q2xpZW50PC9hPiknOworICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0YXJnZXRzOiA1LAorICAgICAgICAgICAgICAgICAgICByZW5kZXI6IGZ1bmN0aW9uKGRhdGEsIHR5cGUsIHJvdykgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gJ3llcycgcmF0aGVyIHRoYW4gJ2V4cGVjdGVkJyB0byBlYXNlIHNlYXJjaAorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJvd1tleHBlY3RlZF0gPyAneWVzJyA6ICd1bmV4cGVjdGVkJzsKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBdLAorICAgICAgICB9KTsKKyAgICAgICAgJCgnI3Rlc3RfcmVzdWx0c19maWx0ZXIgbGFiZWwgaW5wdXQnKS5mb2N1cygpLnZhbCgndW5leHBlY3RlZCBmYWlsdXJlJyk7CisgICAgICAgICQoJyN0ZXN0X2luZm8nKS50ZXh0KAorICAgICAgICAgICAgIlRlc3QgRGF0ZTogICAgICIgKyByZXN1bHRzWydkYXRlJ10gKyAiXG4iICsKKyAgICAgICAgICAgICJSZXZpc2lvbjogICAgICAiICsgcmVzdWx0c1sncmV2aXNpb24nXSArICJcbiIgKworICAgICAgICAgICAgIlBsYXRmb3JtOiAgICAgICIgKyByZXN1bHRzWydwbGF0Zm9ybSddICsgIlxuIiArCisgICAgICAgICAgICAiVGVzdCBkdXJhdGlvbjogIiArIHJlc3VsdHNbJ2R1cmF0aW9uJ10pICsgIiBzZWNvbmRzIjsKKyAgICB9KTsKK30pOworCmRpZmYgLS1naXQgYS90ZXN0L3JzL0NhcmdvLnRvbWwgYi90ZXN0L3JzL0NhcmdvLnRvbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWIzNWUzYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvcnMvQ2FyZ28udG9tbApAQCAtMCwwICsxLDE3IEBACitbcGFja2FnZV0KK25hbWUgPSAidGhyaWZ0LXRlc3QiCit2ZXJzaW9uID0gIjAuMS4wIgorbGljZW5zZSA9ICJBcGFjaGUtMi4wIgorYXV0aG9ycyA9IFsiQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzIDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+Il0KK3B1Ymxpc2ggPSBmYWxzZQorCitbZGVwZW5kZW5jaWVzXQorY2xhcCA9ICI8Mi4yOC4wIgorZW52X2xvZ2dlciA9ICIwLjQuMCIKK2xvZyA9ICIwLjMuNyIKK29yZGVyZWQtZmxvYXQgPSAiMC4zLjAiCit0cnlfZnJvbSA9ICIwLjIuMCIKKworW2RlcGVuZGVuY2llcy50aHJpZnRdCitwYXRoID0gIi4uLy4uL2xpYi9ycyIKKwpkaWZmIC0tZ2l0IGEvdGVzdC9ycy9NYWtlZmlsZS5hbSBiL3Rlc3QvcnMvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ5MDViNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvcnMvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw0MCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3N0dWJzOiAuLi9UaHJpZnRUZXN0LnRocmlmdAorCSQoVEhSSUZUKSAtSSAuL3RocmlmdHMgLW91dCBzcmMgLS1nZW4gcnMgLi4vVGhyaWZ0VGVzdC50aHJpZnQKKworcHJlY3Jvc3M6IHN0dWJzCisJJChDQVJHTykgYnVpbGQKKwlbIC1kIGJpbiBdIHx8IG1rZGlyIGJpbgorCWNwIHRhcmdldC9kZWJ1Zy90ZXN0X3NlcnZlciBiaW4vdGVzdF9zZXJ2ZXIKKwljcCB0YXJnZXQvZGVidWcvdGVzdF9jbGllbnQgYmluL3Rlc3RfY2xpZW50CisKK2NsZWFuLWxvY2FsOgorCSQoQ0FSR08pIGNsZWFuCisJLSQoUk0pIENhcmdvLmxvY2sKKwktJChSTSkgc3JjL3RocmlmdF90ZXN0LnJzCisJLSQoUk0pIC1yIGJpbgorCitFWFRSQV9ESVNUID0gXAorCUNhcmdvLnRvbWwgXAorICAgICAgICBzcmMvbGliLnJzIFwKKwlzcmMvYmluL3Rlc3Rfc2VydmVyLnJzIFwKKwlzcmMvYmluL3Rlc3RfY2xpZW50LnJzCisKZGlmZiAtLWdpdCBhL3Rlc3QvcnMvc3JjL2Jpbi90ZXN0X2NsaWVudC5ycyBiL3Rlc3QvcnMvc3JjL2Jpbi90ZXN0X2NsaWVudC5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWI1Yjg4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9ycy9zcmMvYmluL3Rlc3RfY2xpZW50LnJzCkBAIC0wLDAgKzEsNjA1IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNbbWFjcm9fdXNlXQorZXh0ZXJuIGNyYXRlIGxvZzsKK2V4dGVybiBjcmF0ZSBlbnZfbG9nZ2VyOworCisjW21hY3JvX3VzZV0KK2V4dGVybiBjcmF0ZSBjbGFwOworZXh0ZXJuIGNyYXRlIG9yZGVyZWRfZmxvYXQ7CitleHRlcm4gY3JhdGUgdGhyaWZ0OworZXh0ZXJuIGNyYXRlIHRocmlmdF90ZXN0OyAvLyBodWguIEkgaGF2ZSB0byBkbyB0aGlzIHRvIHVzZSBteSBsaWIKKwordXNlIG9yZGVyZWRfZmxvYXQ6Ok9yZGVyZWRGbG9hdDsKK3VzZSBzdGQ6OmNvbGxlY3Rpb25zOjp7QlRyZWVNYXAsIEJUcmVlU2V0fTsKK3VzZSBzdGQ6OmZtdDo6RGVidWc7CisKK3VzZSB0aHJpZnQ6OnByb3RvY29sOjp7VEJpbmFyeUlucHV0UHJvdG9jb2wsIFRCaW5hcnlPdXRwdXRQcm90b2NvbCwgVENvbXBhY3RJbnB1dFByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICBUQ29tcGFjdE91dHB1dFByb3RvY29sLCBUSW5wdXRQcm90b2NvbCwgVE11bHRpcGxleGVkT3V0cHV0UHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgIFRPdXRwdXRQcm90b2NvbH07Cit1c2UgdGhyaWZ0Ojp0cmFuc3BvcnQ6OntSZWFkSGFsZiwgVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydCwgVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICBURnJhbWVkUmVhZFRyYW5zcG9ydCwgVEZyYW1lZFdyaXRlVHJhbnNwb3J0LCBUSW9DaGFubmVsLCBUUmVhZFRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRUY3BDaGFubmVsLCBUV3JpdGVUcmFuc3BvcnQsIFdyaXRlSGFsZn07Cit1c2UgdGhyaWZ0X3Rlc3Q6Oio7CisKK2ZuIG1haW4oKSB7CisgICAgZW52X2xvZ2dlcjo6aW5pdCgpLmV4cGVjdCgibG9nZ2VyIHNldHVwIGZhaWxlZCIpOworCisgICAgZGVidWchKCJpbml0aWFsaXplZCBsb2dnZXIgLSBydW5uaW5nIGNyb3NzLXRlc3QgY2xpZW50Iik7CisKKyAgICBtYXRjaCBydW4oKSB7CisgICAgICAgIE9rKCgpKSA9PiBpbmZvISgiY3Jvc3MtdGVzdCBjbGllbnQgc3VjY2VlZGVkIiksCisgICAgICAgIEVycihlKSA9PiB7CisgICAgICAgICAgICBpbmZvISgiY3Jvc3MtdGVzdCBjbGllbnQgZmFpbGVkIHdpdGggZXJyb3Igezo/fSIsIGUpOworICAgICAgICAgICAgc3RkOjpwcm9jZXNzOjpleGl0KDEpOworICAgICAgICB9CisgICAgfQorfQorCitmbiBydW4oKSAtPiB0aHJpZnQ6OlJlc3VsdDwoKT4geworICAgIC8vIHVuc3VwcG9ydGVkIG9wdGlvbnM6CisgICAgLy8gLS1kb21haW4tc29ja2V0CisgICAgLy8gLS1uYW1lZC1waXBlCisgICAgLy8gLS1hbm9uLXBpcGVzCisgICAgLy8gLS1zc2wKKyAgICAvLyAtLXRocmVhZHMKKyAgICBsZXQgbWF0Y2hlcyA9IGNsYXBfYXBwIShydXN0X3Rlc3RfY2xpZW50ID0+CisgICAgICAgICh2ZXJzaW9uOiAiMS4wIikKKyAgICAgICAgKGF1dGhvcjogIkFwYWNoZSBUaHJpZnQgRGV2ZWxvcGVycyA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPiIpCisgICAgICAgIChhYm91dDogIlJ1c3QgVGhyaWZ0IHRlc3QgY2xpZW50IikKKyAgICAgICAgKEBhcmcgaG9zdDogLS1ob3N0ICt0YWtlc192YWx1ZSAiSG9zdCBvbiB3aGljaCB0aGUgVGhyaWZ0IHRlc3Qgc2VydmVyIGlzIGxvY2F0ZWQiKQorICAgICAgICAoQGFyZyBwb3J0OiAtLXBvcnQgK3Rha2VzX3ZhbHVlICJQb3J0IG9uIHdoaWNoIHRoZSBUaHJpZnQgdGVzdCBzZXJ2ZXIgaXMgbGlzdGVuaW5nIikKKyAgICAgICAgKEBhcmcgdHJhbnNwb3J0OiAtLXRyYW5zcG9ydCArdGFrZXNfdmFsdWUgIlRocmlmdCB0cmFuc3BvcnQgaW1wbGVtZW50YXRpb24gdG8gdXNlIChcImJ1ZmZlcmVkXCIsIFwiZnJhbWVkXCIpIikKKyAgICAgICAgKEBhcmcgcHJvdG9jb2w6IC0tcHJvdG9jb2wgK3Rha2VzX3ZhbHVlICJUaHJpZnQgcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gdG8gdXNlIChcImJpbmFyeVwiLCBcImNvbXBhY3RcIikiKQorICAgICAgICAoQGFyZyB0ZXN0bG9vcHM6IC1uIC0tdGVzdGxvb3BzICt0YWtlc192YWx1ZSAiTnVtYmVyIG9mIHRpbWVzIHRvIHJ1biB0ZXN0cyIpCisgICAgKQorICAgICAgICAuZ2V0X21hdGNoZXMoKTsKKworICAgIGxldCBob3N0ID0gbWF0Y2hlcy52YWx1ZV9vZigiaG9zdCIpLnVud3JhcF9vcigiMTI3LjAuMC4xIik7CisgICAgbGV0IHBvcnQgPSB2YWx1ZV90IShtYXRjaGVzLCAicG9ydCIsIHUxNikudW53cmFwX29yKDkwOTApOworICAgIGxldCB0ZXN0bG9vcHMgPSB2YWx1ZV90IShtYXRjaGVzLCAidGVzdGxvb3BzIiwgdTgpLnVud3JhcF9vcigxKTsKKyAgICBsZXQgdHJhbnNwb3J0ID0gbWF0Y2hlcy52YWx1ZV9vZigidHJhbnNwb3J0IikudW53cmFwX29yKCJidWZmZXJlZCIpOworICAgIGxldCBwcm90b2NvbCA9IG1hdGNoZXMudmFsdWVfb2YoInByb3RvY29sIikudW53cmFwX29yKCJiaW5hcnkiKTsKKworCisgICAgbGV0IG11dCB0aHJpZnRfdGVzdF9jbGllbnQgPSB7CisgICAgICAgIGxldCAoaV9wcm90LCBvX3Byb3QpID0gYnVpbGRfcHJvdG9jb2xzKGhvc3QsIHBvcnQsIHRyYW5zcG9ydCwgcHJvdG9jb2wsICJUaHJpZnRUZXN0Iik/OworICAgICAgICBUaHJpZnRUZXN0U3luY0NsaWVudDo6bmV3KGlfcHJvdCwgb19wcm90KQorICAgIH07CisKKyAgICBsZXQgbXV0IHNlY29uZF9zZXJ2aWNlX2NsaWVudCA9IGlmIHByb3RvY29sLnN0YXJ0c193aXRoKCJtdWx0aSIpIHsKKyAgICAgICAgbGV0IChpX3Byb3QsIG9fcHJvdCkgPSBidWlsZF9wcm90b2NvbHMoaG9zdCwgcG9ydCwgdHJhbnNwb3J0LCBwcm90b2NvbCwgIlNlY29uZFNlcnZpY2UiKT87CisgICAgICAgIFNvbWUoU2Vjb25kU2VydmljZVN5bmNDbGllbnQ6Om5ldyhpX3Byb3QsIG9fcHJvdCkpCisgICAgfSBlbHNlIHsKKyAgICAgICAgTm9uZQorICAgIH07CisKKyAgICBpbmZvISgKKyAgICAgICAgImNvbm5lY3RpbmcgdG8ge306e30gd2l0aCB7fSt7fSBzdGFjayIsCisgICAgICAgIGhvc3QsCisgICAgICAgIHBvcnQsCisgICAgICAgIHByb3RvY29sLAorICAgICAgICB0cmFuc3BvcnQKKyAgICApOworCisgICAgZm9yIF8gaW4gMC4udGVzdGxvb3BzIHsKKyAgICAgICAgbWFrZV90aHJpZnRfY2FsbHMoJm11dCB0aHJpZnRfdGVzdF9jbGllbnQsICZtdXQgc2Vjb25kX3NlcnZpY2VfY2xpZW50KT8KKyAgICB9CisKKyAgICBPaygoKSkKK30KKworZm4gYnVpbGRfcHJvdG9jb2xzKAorICAgIGhvc3Q6ICZzdHIsCisgICAgcG9ydDogdTE2LAorICAgIHRyYW5zcG9ydDogJnN0ciwKKyAgICBwcm90b2NvbDogJnN0ciwKKyAgICBzZXJ2aWNlX25hbWU6ICZzdHIsCispIC0+IHRocmlmdDo6UmVzdWx0PChCb3g8VElucHV0UHJvdG9jb2w+LCBCb3g8VE91dHB1dFByb3RvY29sPik+IHsKKyAgICBsZXQgKGlfY2hhbiwgb19jaGFuKSA9IHRjcF9jaGFubmVsKGhvc3QsIHBvcnQpPzsKKworICAgIGxldCAoaV90cmFuLCBvX3RyYW4pOiAoQm94PFRSZWFkVHJhbnNwb3J0PiwgQm94PFRXcml0ZVRyYW5zcG9ydD4pID0gbWF0Y2ggdHJhbnNwb3J0IHsKKyAgICAgICAgImJ1ZmZlcmVkIiA9PiB7CisgICAgICAgICAgICAoQm94OjpuZXcoVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydDo6bmV3KGlfY2hhbikpLAorICAgICAgICAgICAgIEJveDo6bmV3KFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0OjpuZXcob19jaGFuKSkpCisgICAgICAgIH0KKyAgICAgICAgImZyYW1lZCIgPT4geworICAgICAgICAgICAgKEJveDo6bmV3KFRGcmFtZWRSZWFkVHJhbnNwb3J0OjpuZXcoaV9jaGFuKSksCisgICAgICAgICAgICAgQm94OjpuZXcoVEZyYW1lZFdyaXRlVHJhbnNwb3J0OjpuZXcob19jaGFuKSkpCisgICAgICAgIH0KKyAgICAgICAgdW5tYXRjaGVkID0+IHJldHVybiBFcnIoZm9ybWF0ISgidW5zdXBwb3J0ZWQgdHJhbnNwb3J0IHt9IiwgdW5tYXRjaGVkKS5pbnRvKCkpLAorICAgIH07CisKKyAgICBsZXQgKGlfcHJvdCwgb19wcm90KTogKEJveDxUSW5wdXRQcm90b2NvbD4sIEJveDxUT3V0cHV0UHJvdG9jb2w+KSA9IG1hdGNoIHByb3RvY29sIHsKKyAgICAgICAgImJpbmFyeSIgPT4geworICAgICAgICAgICAgKEJveDo6bmV3KFRCaW5hcnlJbnB1dFByb3RvY29sOjpuZXcoaV90cmFuLCB0cnVlKSksCisgICAgICAgICAgICAgQm94OjpuZXcoVEJpbmFyeU91dHB1dFByb3RvY29sOjpuZXcob190cmFuLCB0cnVlKSkpCisgICAgICAgIH0KKyAgICAgICAgIm11bHRpIiA9PiB7CisgICAgICAgICAgICAoQm94OjpuZXcoVEJpbmFyeUlucHV0UHJvdG9jb2w6Om5ldyhpX3RyYW4sIHRydWUpKSwKKyAgICAgICAgICAgICBCb3g6Om5ldygKKyAgICAgICAgICAgICAgICBUTXVsdGlwbGV4ZWRPdXRwdXRQcm90b2NvbDo6bmV3KAorICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgIFRCaW5hcnlPdXRwdXRQcm90b2NvbDo6bmV3KG9fdHJhbiwgdHJ1ZSksCisgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICkpCisgICAgICAgIH0KKyAgICAgICAgImNvbXBhY3QiID0+IHsKKyAgICAgICAgICAgIChCb3g6Om5ldyhUQ29tcGFjdElucHV0UHJvdG9jb2w6Om5ldyhpX3RyYW4pKSwKKyAgICAgICAgICAgICBCb3g6Om5ldyhUQ29tcGFjdE91dHB1dFByb3RvY29sOjpuZXcob190cmFuKSkpCisgICAgICAgIH0KKyAgICAgICAgIm11bHRpYyIgPT4geworICAgICAgICAgICAgKEJveDo6bmV3KFRDb21wYWN0SW5wdXRQcm90b2NvbDo6bmV3KGlfdHJhbikpLAorICAgICAgICAgICAgIEJveDo6bmV3KFRNdWx0aXBsZXhlZE91dHB1dFByb3RvY29sOjpuZXcoc2VydmljZV9uYW1lLCBUQ29tcGFjdE91dHB1dFByb3RvY29sOjpuZXcob190cmFuKSksKSkKKyAgICAgICAgfQorICAgICAgICB1bm1hdGNoZWQgPT4gcmV0dXJuIEVycihmb3JtYXQhKCJ1bnN1cHBvcnRlZCBwcm90b2NvbCB7fSIsIHVubWF0Y2hlZCkuaW50bygpKSwKKyAgICB9OworCisgICAgT2soKGlfcHJvdCwgb19wcm90KSkKK30KKworLy8gRklYTUU6IGV4cG9zZSAib3BlbiIgdGhyb3VnaCB0aGUgY2xpZW50IGludGVyZmFjZSBzbyBJIGRvbid0IGhhdmUgdG8gZWFybHkKKy8vIG9wZW4KK2ZuIHRjcF9jaGFubmVsKAorICAgIGhvc3Q6ICZzdHIsCisgICAgcG9ydDogdTE2LAorKSAtPiB0aHJpZnQ6OlJlc3VsdDwoUmVhZEhhbGY8VFRjcENoYW5uZWw+LCBXcml0ZUhhbGY8VFRjcENoYW5uZWw+KT4geworICAgIGxldCBtdXQgYyA9IFRUY3BDaGFubmVsOjpuZXcoKTsKKyAgICBjLm9wZW4oJmZvcm1hdCEoInt9Ont9IiwgaG9zdCwgcG9ydCkpPzsKKyAgICBjLnNwbGl0KCkKK30KKwordHlwZSBCdWlsZFRocmlmdFRlc3RDbGllbnQgPSBUaHJpZnRUZXN0U3luY0NsaWVudDxCb3g8VElucHV0UHJvdG9jb2w+LCBCb3g8VE91dHB1dFByb3RvY29sPj47Cit0eXBlIEJ1aWx0U2Vjb25kU2VydmljZUNsaWVudCA9IFNlY29uZFNlcnZpY2VTeW5jQ2xpZW50PEJveDxUSW5wdXRQcm90b2NvbD4sIEJveDxUT3V0cHV0UHJvdG9jb2w+PjsKKworI1tjZmdfYXR0cihmZWF0dXJlID0gImNhcmdvLWNsaXBweSIsIGFsbG93KGN5Y2xvbWF0aWNfY29tcGxleGl0eSkpXQorZm4gbWFrZV90aHJpZnRfY2FsbHMoCisgICAgdGhyaWZ0X3Rlc3RfY2xpZW50OiAmbXV0IEJ1aWxkVGhyaWZ0VGVzdENsaWVudCwKKyAgICBzZWNvbmRfc2VydmljZV9jbGllbnQ6ICZtdXQgT3B0aW9uPEJ1aWx0U2Vjb25kU2VydmljZUNsaWVudD4sCispIC0+IFJlc3VsdDwoKSwgdGhyaWZ0OjpFcnJvcj4geworICAgIGluZm8hKCJ0ZXN0Vm9pZCIpOworICAgIHRocmlmdF90ZXN0X2NsaWVudC50ZXN0X3ZvaWQoKT87CisKKyAgICBpbmZvISgidGVzdFN0cmluZyIpOworICAgIHZlcmlmeV9leHBlY3RlZF9yZXN1bHQoCisgICAgICAgIHRocmlmdF90ZXN0X2NsaWVudC50ZXN0X3N0cmluZygidGhpbmciLnRvX293bmVkKCkpLAorICAgICAgICAidGhpbmciLnRvX293bmVkKCksCisgICAgKT87CisKKyAgICBpbmZvISgidGVzdEJvb2wiKTsKKyAgICB2ZXJpZnlfZXhwZWN0ZWRfcmVzdWx0KHRocmlmdF90ZXN0X2NsaWVudC50ZXN0X2Jvb2wodHJ1ZSksIHRydWUpPzsKKworICAgIGluZm8hKCJ0ZXN0Qm9vbCIpOworICAgIHZlcmlmeV9leHBlY3RlZF9yZXN1bHQodGhyaWZ0X3Rlc3RfY2xpZW50LnRlc3RfYm9vbChmYWxzZSksIGZhbHNlKT87CisKKyAgICBpbmZvISgidGVzdEJ5dGUiKTsKKyAgICB2ZXJpZnlfZXhwZWN0ZWRfcmVzdWx0KHRocmlmdF90ZXN0X2NsaWVudC50ZXN0X2J5dGUoNDIpLCA0Mik/OworCisgICAgaW5mbyEoInRlc3RpMzIiKTsKKyAgICB2ZXJpZnlfZXhwZWN0ZWRfcmVzdWx0KHRocmlmdF90ZXN0X2NsaWVudC50ZXN0X2kzMigxMTU5MzQ4Mzc0KSwgMTE1OTM0ODM3NCk/OworCisgICAgaW5mbyEoInRlc3RpNjQiKTsKKyAgICAvLyB0cnkhKHZlcmlmeV9leHBlY3RlZF9yZXN1bHQodGhyaWZ0X3Rlc3RfY2xpZW50LnRlc3RfaTY0KC04NjUxODI5ODc5NDM4Mjk0NTY1KSwKKyAgICAvLyAtODY1MTgyOTg3OTQzODI5NDU2NSkpOworICAgIHZlcmlmeV9leHBlY3RlZF9yZXN1bHQoCisgICAgICAgIHRocmlmdF90ZXN0X2NsaWVudC50ZXN0X2k2NChpNjQ6Om1pbl92YWx1ZSgpKSwKKyAgICAgICAgaTY0OjptaW5fdmFsdWUoKSwKKyAgICApPzsKKworICAgIGluZm8hKCJ0ZXN0RG91YmxlIik7CisgICAgdmVyaWZ5X2V4cGVjdGVkX3Jlc3VsdCgKKyAgICAgICAgdGhyaWZ0X3Rlc3RfY2xpZW50LnRlc3RfZG91YmxlKE9yZGVyZWRGbG9hdDo6ZnJvbSg0Mi40MikpLAorICAgICAgICBPcmRlcmVkRmxvYXQ6OmZyb20oNDIuNDIpLAorICAgICk/OworCisgICAgaW5mbyEoInRlc3RUeXBlZGVmIik7CisgICAgeworICAgICAgICBsZXQgdV9zbmQ6IFVzZXJJZCA9IDIzNDg7CisgICAgICAgIGxldCB1X2NtcDogVXNlcklkID0gMjM0ODsKKyAgICAgICAgdmVyaWZ5X2V4cGVjdGVkX3Jlc3VsdCh0aHJpZnRfdGVzdF9jbGllbnQudGVzdF90eXBlZGVmKHVfc25kKSwgdV9jbXApPzsKKyAgICB9CisKKyAgICBpbmZvISgidGVzdEVudW0iKTsKKyAgICB7CisgICAgICAgIHZlcmlmeV9leHBlY3RlZF9yZXN1bHQodGhyaWZ0X3Rlc3RfY2xpZW50LnRlc3RfZW51bShOdW1iZXJ6OjpUd28pLCBOdW1iZXJ6OjpUd28pPzsKKyAgICB9CisKKyAgICBpbmZvISgidGVzdEJpbmFyeSIpOworICAgIHsKKyAgICAgICAgbGV0IGJfc25kID0gdmVjIVsweDc3LCAweDMwLCAweDMwLCAweDc0LCAweDIxLCAweDIwLCAweDUyLCAweDc1LCAweDczLCAweDc0XTsKKyAgICAgICAgbGV0IGJfY21wID0gdmVjIVsweDc3LCAweDMwLCAweDMwLCAweDc0LCAweDIxLCAweDIwLCAweDUyLCAweDc1LCAweDczLCAweDc0XTsKKyAgICAgICAgdmVyaWZ5X2V4cGVjdGVkX3Jlc3VsdCh0aHJpZnRfdGVzdF9jbGllbnQudGVzdF9iaW5hcnkoYl9zbmQpLCBiX2NtcCk/OworICAgIH0KKworICAgIGluZm8hKCJ0ZXN0U3RydWN0Iik7CisgICAgeworICAgICAgICBsZXQgeF9zbmQgPSBYdHJ1Y3QgeworICAgICAgICAgICAgc3RyaW5nX3RoaW5nOiBTb21lKCJmb28iLnRvX293bmVkKCkpLAorICAgICAgICAgICAgYnl0ZV90aGluZzogU29tZSgxMiksCisgICAgICAgICAgICBpMzJfdGhpbmc6IFNvbWUoMjE5MTI5KSwKKyAgICAgICAgICAgIGk2NF90aGluZzogU29tZSgxMjkzODQ5MjgxOCksCisgICAgICAgIH07CisgICAgICAgIGxldCB4X2NtcCA9IFh0cnVjdCB7CisgICAgICAgICAgICBzdHJpbmdfdGhpbmc6IFNvbWUoImZvbyIudG9fb3duZWQoKSksCisgICAgICAgICAgICBieXRlX3RoaW5nOiBTb21lKDEyKSwKKyAgICAgICAgICAgIGkzMl90aGluZzogU29tZSgyMTkxMjkpLAorICAgICAgICAgICAgaTY0X3RoaW5nOiBTb21lKDEyOTM4NDkyODE4KSwKKyAgICAgICAgfTsKKyAgICAgICAgdmVyaWZ5X2V4cGVjdGVkX3Jlc3VsdCh0aHJpZnRfdGVzdF9jbGllbnQudGVzdF9zdHJ1Y3QoeF9zbmQpLCB4X2NtcCk/OworICAgIH0KKworICAgIC8vIFh0cnVjdCBhZ2Fpbiwgd2l0aCBvcHRpb25hbCB2YWx1ZXMKKyAgICAvLyBGSVhNRTogYXBwYXJlbnRseSB0aGUgZXJsYW5nIHRocmlmdCBzZXJ2ZXIgZG9lcyBub3QgbGlrZSBvcHQtaW4tcmVxLW91dAorICAgIC8vIHBhcmFtZXRlcnMgdGhhdCBhcmUgdW5kZWZpbmVkLiBKb3kuCisgICAgLy8geworICAgIC8vIGxldCB4X3NuZCA9IFh0cnVjdCB7IHN0cmluZ190aGluZzogU29tZSgiZm9vIi50b19vd25lZCgpKSwgYnl0ZV90aGluZzogTm9uZSwKKyAgICAvLyBpMzJfdGhpbmc6IE5vbmUsIGk2NF90aGluZzogU29tZSgxMjkzODQ5MjgxOCkgfTsKKyAgICAvLyBsZXQgeF9jbXAgPSBYdHJ1Y3QgeyBzdHJpbmdfdGhpbmc6IFNvbWUoImZvbyIudG9fb3duZWQoKSksIGJ5dGVfdGhpbmc6CisgICAgLy8gU29tZSgwKSwgaTMyX3RoaW5nOiBTb21lKDApLCBpNjRfdGhpbmc6IFNvbWUoMTI5Mzg0OTI4MTgpIH07IC8vIHRoZSBDKysKKyAgICAvLyBzZXJ2ZXIgaXMgcmVzcG9uZGluZyBjb3JyZWN0bHkKKyAgICAvLyB0cnkhKHZlcmlmeV9leHBlY3RlZF9yZXN1bHQodGhyaWZ0X3Rlc3RfY2xpZW50LnRlc3Rfc3RydWN0KHhfc25kKSwgeF9jbXApKTsKKyAgICAvLyB9CisgICAgLy8KKworICAgIGluZm8hKCJ0ZXN0TmVzdCIpOyAvLyAoRklYTUU6IHRyeSBYdHJ1Y3QyIHdpdGggb3B0aW9uYWwgdmFsdWVzKQorICAgIHsKKyAgICAgICAgbGV0IHhfc25kID0gWHRydWN0MiB7CisgICAgICAgICAgICBieXRlX3RoaW5nOiBTb21lKDMyKSwKKyAgICAgICAgICAgIHN0cnVjdF90aGluZzogU29tZSgKKyAgICAgICAgICAgICAgICBYdHJ1Y3QgeworICAgICAgICAgICAgICAgICAgICBzdHJpbmdfdGhpbmc6IFNvbWUoImZvbyIudG9fb3duZWQoKSksCisgICAgICAgICAgICAgICAgICAgIGJ5dGVfdGhpbmc6IFNvbWUoMSksCisgICAgICAgICAgICAgICAgICAgIGkzMl90aGluZzogU29tZSgzMjQzODIwOTgpLAorICAgICAgICAgICAgICAgICAgICBpNjRfdGhpbmc6IFNvbWUoMTI5Mzg0OTI4MTgpLAorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICApLAorICAgICAgICAgICAgaTMyX3RoaW5nOiBTb21lKDI5MzQ4MTA5OCksCisgICAgICAgIH07CisgICAgICAgIGxldCB4X2NtcCA9IFh0cnVjdDIgeworICAgICAgICAgICAgYnl0ZV90aGluZzogU29tZSgzMiksCisgICAgICAgICAgICBzdHJ1Y3RfdGhpbmc6IFNvbWUoCisgICAgICAgICAgICAgICAgWHRydWN0IHsKKyAgICAgICAgICAgICAgICAgICAgc3RyaW5nX3RoaW5nOiBTb21lKCJmb28iLnRvX293bmVkKCkpLAorICAgICAgICAgICAgICAgICAgICBieXRlX3RoaW5nOiBTb21lKDEpLAorICAgICAgICAgICAgICAgICAgICBpMzJfdGhpbmc6IFNvbWUoMzI0MzgyMDk4KSwKKyAgICAgICAgICAgICAgICAgICAgaTY0X3RoaW5nOiBTb21lKDEyOTM4NDkyODE4KSwKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgKSwKKyAgICAgICAgICAgIGkzMl90aGluZzogU29tZSgyOTM0ODEwOTgpLAorICAgICAgICB9OworICAgICAgICB2ZXJpZnlfZXhwZWN0ZWRfcmVzdWx0KHRocmlmdF90ZXN0X2NsaWVudC50ZXN0X25lc3QoeF9zbmQpLCB4X2NtcCk/OworICAgIH0KKworICAgIC8vIGRvIHRoZSBtdWx0aXBsZXhlZCBjYWxscyB3aGlsZSBtYWtpbmcgdGhlIG1haW4gVGhyaWZ0VGVzdCBjYWxscworICAgIGlmIGxldCBTb21lKHJlZiBtdXQgY2xpZW50KSA9IHNlY29uZF9zZXJ2aWNlX2NsaWVudC5hc19tdXQoKSB7CisgICAgICAgIGluZm8hKCJTZWNvbmRTZXJ2aWNlIHNlY29uZHRlc3RTdHJpbmciKTsKKyAgICAgICAgeworICAgICAgICAgICAgdmVyaWZ5X2V4cGVjdGVkX3Jlc3VsdCgKKyAgICAgICAgICAgICAgICBjbGllbnQuc2Vjb25kdGVzdF9zdHJpbmcoInRlc3Rfc3RyaW5nIi50b19vd25lZCgpKSwKKyAgICAgICAgICAgICAgICAidGVzdFN0cmluZyhcInRlc3Rfc3RyaW5nXCIpIi50b19vd25lZCgpLAorICAgICAgICAgICAgKT87CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbmZvISgidGVzdExpc3QiKTsKKyAgICB7CisgICAgICAgIGxldCBtdXQgdl9zbmQ6IFZlYzxpMzI+ID0gVmVjOjpuZXcoKTsKKyAgICAgICAgdl9zbmQucHVzaCgyOTM4NCk7CisgICAgICAgIHZfc25kLnB1c2goMjM4KTsKKyAgICAgICAgdl9zbmQucHVzaCgzMjQ5OCk7CisKKyAgICAgICAgbGV0IG11dCB2X2NtcDogVmVjPGkzMj4gPSBWZWM6Om5ldygpOworICAgICAgICB2X2NtcC5wdXNoKDI5Mzg0KTsKKyAgICAgICAgdl9jbXAucHVzaCgyMzgpOworICAgICAgICB2X2NtcC5wdXNoKDMyNDk4KTsKKworICAgICAgICB2ZXJpZnlfZXhwZWN0ZWRfcmVzdWx0KHRocmlmdF90ZXN0X2NsaWVudC50ZXN0X2xpc3Qodl9zbmQpLCB2X2NtcCk/OworICAgIH0KKworICAgIGluZm8hKCJ0ZXN0U2V0Iik7CisgICAgeworICAgICAgICBsZXQgbXV0IHNfc25kOiBCVHJlZVNldDxpMzI+ID0gQlRyZWVTZXQ6Om5ldygpOworICAgICAgICBzX3NuZC5pbnNlcnQoMjkzNDgxKTsKKyAgICAgICAgc19zbmQuaW5zZXJ0KDIzKTsKKyAgICAgICAgc19zbmQuaW5zZXJ0KDMyMzQpOworCisgICAgICAgIGxldCBtdXQgc19jbXA6IEJUcmVlU2V0PGkzMj4gPSBCVHJlZVNldDo6bmV3KCk7CisgICAgICAgIHNfY21wLmluc2VydCgyOTM0ODEpOworICAgICAgICBzX2NtcC5pbnNlcnQoMjMpOworICAgICAgICBzX2NtcC5pbnNlcnQoMzIzNCk7CisKKyAgICAgICAgdmVyaWZ5X2V4cGVjdGVkX3Jlc3VsdCh0aHJpZnRfdGVzdF9jbGllbnQudGVzdF9zZXQoc19zbmQpLCBzX2NtcCk/OworICAgIH0KKworICAgIGluZm8hKCJ0ZXN0TWFwIik7CisgICAgeworICAgICAgICBsZXQgbXV0IG1fc25kOiBCVHJlZU1hcDxpMzIsIGkzMj4gPSBCVHJlZU1hcDo6bmV3KCk7CisgICAgICAgIG1fc25kLmluc2VydCgyLCA0KTsKKyAgICAgICAgbV9zbmQuaW5zZXJ0KDQsIDYpOworICAgICAgICBtX3NuZC5pbnNlcnQoOCwgNyk7CisKKyAgICAgICAgbGV0IG11dCBtX2NtcDogQlRyZWVNYXA8aTMyLCBpMzI+ID0gQlRyZWVNYXA6Om5ldygpOworICAgICAgICBtX2NtcC5pbnNlcnQoMiwgNCk7CisgICAgICAgIG1fY21wLmluc2VydCg0LCA2KTsKKyAgICAgICAgbV9jbXAuaW5zZXJ0KDgsIDcpOworCisgICAgICAgIHZlcmlmeV9leHBlY3RlZF9yZXN1bHQodGhyaWZ0X3Rlc3RfY2xpZW50LnRlc3RfbWFwKG1fc25kKSwgbV9jbXApPzsKKyAgICB9CisKKyAgICBpbmZvISgidGVzdFN0cmluZ01hcCIpOworICAgIHsKKyAgICAgICAgbGV0IG11dCBtX3NuZDogQlRyZWVNYXA8U3RyaW5nLCBTdHJpbmc+ID0gQlRyZWVNYXA6Om5ldygpOworICAgICAgICBtX3NuZC5pbnNlcnQoIjIiLnRvX293bmVkKCksICI0X3N0cmluZyIudG9fb3duZWQoKSk7CisgICAgICAgIG1fc25kLmluc2VydCgiNCIudG9fb3duZWQoKSwgIjZfc3RyaW5nIi50b19vd25lZCgpKTsKKyAgICAgICAgbV9zbmQuaW5zZXJ0KCI4Ii50b19vd25lZCgpLCAiN19zdHJpbmciLnRvX293bmVkKCkpOworCisgICAgICAgIGxldCBtdXQgbV9yY3Y6IEJUcmVlTWFwPFN0cmluZywgU3RyaW5nPiA9IEJUcmVlTWFwOjpuZXcoKTsKKyAgICAgICAgbV9yY3YuaW5zZXJ0KCIyIi50b19vd25lZCgpLCAiNF9zdHJpbmciLnRvX293bmVkKCkpOworICAgICAgICBtX3Jjdi5pbnNlcnQoIjQiLnRvX293bmVkKCksICI2X3N0cmluZyIudG9fb3duZWQoKSk7CisgICAgICAgIG1fcmN2Lmluc2VydCgiOCIudG9fb3duZWQoKSwgIjdfc3RyaW5nIi50b19vd25lZCgpKTsKKworICAgICAgICB2ZXJpZnlfZXhwZWN0ZWRfcmVzdWx0KHRocmlmdF90ZXN0X2NsaWVudC50ZXN0X3N0cmluZ19tYXAobV9zbmQpLCBtX3Jjdik/OworICAgIH0KKworICAgIC8vIG5lc3RlZCBtYXAKKyAgICAvLyBleHBlY3QgOiB7LTQgPT4gey00ID0+IC00LCAtMyA9PiAtMywgLTIgPT4gLTIsIC0xID0+IC0xLCB9LCA0ID0+IHsxID0+IDEsIDIKKyAgICAvLyA9PiAyLCAzID0+IDMsIDQgPT4gNCwgfSwgfQorICAgIGluZm8hKCJ0ZXN0TWFwTWFwIik7CisgICAgeworICAgICAgICBsZXQgbXV0IG1fY21wX25lc3RlZF8wOiBCVHJlZU1hcDxpMzIsIGkzMj4gPSBCVHJlZU1hcDo6bmV3KCk7CisgICAgICAgIGZvciBpIGluICgtNCBhcyBpMzIpLi4wIHsKKyAgICAgICAgICAgIG1fY21wX25lc3RlZF8wLmluc2VydChpLCBpKTsKKyAgICAgICAgfQorICAgICAgICBsZXQgbXV0IG1fY21wX25lc3RlZF8xOiBCVHJlZU1hcDxpMzIsIGkzMj4gPSBCVHJlZU1hcDo6bmV3KCk7CisgICAgICAgIGZvciBpIGluIDEuLjUgeworICAgICAgICAgICAgbV9jbXBfbmVzdGVkXzEuaW5zZXJ0KGksIGkpOworICAgICAgICB9CisKKyAgICAgICAgbGV0IG11dCBtX2NtcDogQlRyZWVNYXA8aTMyLCBCVHJlZU1hcDxpMzIsIGkzMj4+ID0gQlRyZWVNYXA6Om5ldygpOworICAgICAgICBtX2NtcC5pbnNlcnQoLTQsIG1fY21wX25lc3RlZF8wKTsKKyAgICAgICAgbV9jbXAuaW5zZXJ0KDQsIG1fY21wX25lc3RlZF8xKTsKKworICAgICAgICB2ZXJpZnlfZXhwZWN0ZWRfcmVzdWx0KHRocmlmdF90ZXN0X2NsaWVudC50ZXN0X21hcF9tYXAoNDIpLCBtX2NtcCk/OworICAgIH0KKworICAgIGluZm8hKCJ0ZXN0TXVsdGkiKTsKKyAgICB7CisgICAgICAgIGxldCBtdXQgbV9zbmQ6IEJUcmVlTWFwPGkxNiwgU3RyaW5nPiA9IEJUcmVlTWFwOjpuZXcoKTsKKyAgICAgICAgbV9zbmQuaW5zZXJ0KDEyOTgsICJmaXp6Ii50b19vd25lZCgpKTsKKyAgICAgICAgbV9zbmQuaW5zZXJ0KC0xNDgsICJidXp6Ii50b19vd25lZCgpKTsKKworICAgICAgICBsZXQgc19jbXAgPSBYdHJ1Y3QgeworICAgICAgICAgICAgc3RyaW5nX3RoaW5nOiBTb21lKCJIZWxsbzIiLnRvX293bmVkKCkpLAorICAgICAgICAgICAgYnl0ZV90aGluZzogU29tZSgxKSwKKyAgICAgICAgICAgIGkzMl90aGluZzogU29tZSgtMTIzOTQ4KSwKKyAgICAgICAgICAgIGk2NF90aGluZzogU29tZSgtMTkyMzQxMjM5ODEpLAorICAgICAgICB9OworCisgICAgICAgIHZlcmlmeV9leHBlY3RlZF9yZXN1bHQoCisgICAgICAgICAgICB0aHJpZnRfdGVzdF9jbGllbnQudGVzdF9tdWx0aSgxLCAtMTIzOTQ4LCAtMTkyMzQxMjM5ODEsIG1fc25kLCBOdW1iZXJ6OjpFaWdodCwgODEpLAorICAgICAgICAgICAgc19jbXAsCisgICAgICAgICk/OworICAgIH0KKworICAgIC8vIEluc2FuaXR5CisgICAgLy8gcmV0dXJuczoKKyAgICAvLyB7IDEgPT4geyAyID0+IGFyZ3VtZW50LAorICAgIC8vICAgICAgICAgIDMgPT4gYXJndW1lbnQsCisgICAgLy8gICAgICAgIH0sCisgICAgLy8gICAyID0+IHsgNiA9PiA8ZW1wdHkgSW5zYW5pdHkgc3RydWN0PiwgfSwKKyAgICAvLyB9CisgICAgeworICAgICAgICBsZXQgbXV0IGFyZ19tYXBfdXNlcm1hcDogQlRyZWVNYXA8TnVtYmVyeiwgaTY0PiA9IEJUcmVlTWFwOjpuZXcoKTsKKyAgICAgICAgYXJnX21hcF91c2VybWFwLmluc2VydChOdW1iZXJ6OjpPbmUsIDQyODkpOworICAgICAgICBhcmdfbWFwX3VzZXJtYXAuaW5zZXJ0KE51bWJlcno6OkVpZ2h0LCAxOSk7CisKKyAgICAgICAgbGV0IG11dCBhcmdfdmVjX3h0cnVjdHM6IFZlYzxYdHJ1Y3Q+ID0gVmVjOjpuZXcoKTsKKyAgICAgICAgYXJnX3ZlY194dHJ1Y3RzLnB1c2goCisgICAgICAgICAgICBYdHJ1Y3QgeworICAgICAgICAgICAgICAgIHN0cmluZ190aGluZzogU29tZSgiZm9vIi50b19vd25lZCgpKSwKKyAgICAgICAgICAgICAgICBieXRlX3RoaW5nOiBTb21lKDgpLAorICAgICAgICAgICAgICAgIGkzMl90aGluZzogU29tZSgyOSksCisgICAgICAgICAgICAgICAgaTY0X3RoaW5nOiBTb21lKDkyMzg0KSwKKyAgICAgICAgICAgIH0sCisgICAgICAgICk7CisgICAgICAgIGFyZ192ZWNfeHRydWN0cy5wdXNoKAorICAgICAgICAgICAgWHRydWN0IHsKKyAgICAgICAgICAgICAgICBzdHJpbmdfdGhpbmc6IFNvbWUoImJhciIudG9fb3duZWQoKSksCisgICAgICAgICAgICAgICAgYnl0ZV90aGluZzogU29tZSgyOCksCisgICAgICAgICAgICAgICAgaTMyX3RoaW5nOiBTb21lKDIpLAorICAgICAgICAgICAgICAgIGk2NF90aGluZzogU29tZSgtMTI4MSksCisgICAgICAgICAgICB9LAorICAgICAgICApOworICAgICAgICBhcmdfdmVjX3h0cnVjdHMucHVzaCgKKyAgICAgICAgICAgIFh0cnVjdCB7CisgICAgICAgICAgICAgICAgc3RyaW5nX3RoaW5nOiBTb21lKCJiYXoiLnRvX293bmVkKCkpLAorICAgICAgICAgICAgICAgIGJ5dGVfdGhpbmc6IFNvbWUoMCksCisgICAgICAgICAgICAgICAgaTMyX3RoaW5nOiBTb21lKDM5NDg1MzkpLAorICAgICAgICAgICAgICAgIGk2NF90aGluZzogU29tZSgtMTI5Mzg0OTIpLAorICAgICAgICAgICAgfSwKKyAgICAgICAgKTsKKworICAgICAgICBsZXQgbXV0IHNfY21wX25lc3RlZF8xOiBCVHJlZU1hcDxOdW1iZXJ6LCBJbnNhbml0eT4gPSBCVHJlZU1hcDo6bmV3KCk7CisgICAgICAgIGxldCBpbnNhbml0eSA9IEluc2FuaXR5IHsKKyAgICAgICAgICAgIHVzZXJfbWFwOiBTb21lKGFyZ19tYXBfdXNlcm1hcCksCisgICAgICAgICAgICB4dHJ1Y3RzOiBTb21lKGFyZ192ZWNfeHRydWN0cyksCisgICAgICAgIH07CisgICAgICAgIHNfY21wX25lc3RlZF8xLmluc2VydChOdW1iZXJ6OjpUd28sIGluc2FuaXR5LmNsb25lKCkpOworICAgICAgICBzX2NtcF9uZXN0ZWRfMS5pbnNlcnQoTnVtYmVyejo6VGhyZWUsIGluc2FuaXR5LmNsb25lKCkpOworCisgICAgICAgIGxldCBtdXQgc19jbXBfbmVzdGVkXzI6IEJUcmVlTWFwPE51bWJlcnosIEluc2FuaXR5PiA9IEJUcmVlTWFwOjpuZXcoKTsKKyAgICAgICAgbGV0IGVtcHR5X2luc2FuaXR5ID0gSW5zYW5pdHkgeworICAgICAgICAgICAgdXNlcl9tYXA6IFNvbWUoQlRyZWVNYXA6Om5ldygpKSwKKyAgICAgICAgICAgIHh0cnVjdHM6IFNvbWUoVmVjOjpuZXcoKSksCisgICAgICAgIH07CisgICAgICAgIHNfY21wX25lc3RlZF8yLmluc2VydChOdW1iZXJ6OjpTaXgsIGVtcHR5X2luc2FuaXR5KTsKKworICAgICAgICBsZXQgbXV0IHNfY21wOiBCVHJlZU1hcDxVc2VySWQsIEJUcmVlTWFwPE51bWJlcnosIEluc2FuaXR5Pj4gPSBCVHJlZU1hcDo6bmV3KCk7CisgICAgICAgIHNfY21wLmluc2VydCgxIGFzIFVzZXJJZCwgc19jbXBfbmVzdGVkXzEpOworICAgICAgICBzX2NtcC5pbnNlcnQoMiBhcyBVc2VySWQsIHNfY21wX25lc3RlZF8yKTsKKworICAgICAgICB2ZXJpZnlfZXhwZWN0ZWRfcmVzdWx0KHRocmlmdF90ZXN0X2NsaWVudC50ZXN0X2luc2FuaXR5KGluc2FuaXR5LmNsb25lKCkpLCBzX2NtcCk/OworICAgIH0KKworICAgIGluZm8hKCJ0ZXN0RXhjZXB0aW9uIC0gcmVtb3RlIHRocm93cyBYY2VwdGlvbiIpOworICAgIHsKKyAgICAgICAgbGV0IHIgPSB0aHJpZnRfdGVzdF9jbGllbnQudGVzdF9leGNlcHRpb24oIlhjZXB0aW9uIi50b19vd25lZCgpKTsKKyAgICAgICAgbGV0IHggPSBtYXRjaCByIHsKKyAgICAgICAgICAgIEVycih0aHJpZnQ6OkVycm9yOjpVc2VyKHJlZiBlKSkgPT4geworICAgICAgICAgICAgICAgIG1hdGNoIGUuZG93bmNhc3RfcmVmOjo8WGNlcHRpb24+KCkgeworICAgICAgICAgICAgICAgICAgICBTb21lKHgpID0+IE9rKHgpLAorICAgICAgICAgICAgICAgICAgICBOb25lID0+IEVycih0aHJpZnQ6OkVycm9yOjpVc2VyKCJkaWQgbm90IGdldCBleHBlY3RlZCBYY2VwdGlvbiBzdHJ1Y3QiLmludG8oKSksKSwKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfID0+IEVycih0aHJpZnQ6OkVycm9yOjpVc2VyKCJkaWQgbm90IGdldCBleGNlcHRpb24iLmludG8oKSkpLAorICAgICAgICB9PzsKKworICAgICAgICBsZXQgeF9jbXAgPSBYY2VwdGlvbiB7CisgICAgICAgICAgICBlcnJvcl9jb2RlOiBTb21lKDEwMDEpLAorICAgICAgICAgICAgbWVzc2FnZTogU29tZSgiWGNlcHRpb24iLnRvX293bmVkKCkpLAorICAgICAgICB9OworCisgICAgICAgIHZlcmlmeV9leHBlY3RlZF9yZXN1bHQoT2soeCksICZ4X2NtcCk/OworICAgIH0KKworICAgIGluZm8hKCJ0ZXN0RXhjZXB0aW9uIC0gcmVtb3RlIHRocm93cyBUQXBwbGljYXRpb25FeGNlcHRpb24iKTsKKyAgICB7CisgICAgICAgIGxldCByID0gdGhyaWZ0X3Rlc3RfY2xpZW50LnRlc3RfZXhjZXB0aW9uKCJURXhjZXB0aW9uIi50b19vd25lZCgpKTsKKyAgICAgICAgbWF0Y2ggciB7CisgICAgICAgICAgICBFcnIodGhyaWZ0OjpFcnJvcjo6QXBwbGljYXRpb24ocmVmIGUpKSA9PiB7CisgICAgICAgICAgICAgICAgaW5mbyEoInJlY2VpdmVkIGFuIHs6P30iLCBlKTsKKyAgICAgICAgICAgICAgICBPaygoKSkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF8gPT4gRXJyKHRocmlmdDo6RXJyb3I6OlVzZXIoImRpZCBub3QgZ2V0IGV4Y2VwdGlvbiIuaW50bygpKSksCisgICAgICAgIH0/OworICAgIH0KKworICAgIGluZm8hKCJ0ZXN0RXhjZXB0aW9uIC0gcmVtb3RlIHN1Y2NlZWRzIik7CisgICAgeworICAgICAgICBsZXQgciA9IHRocmlmdF90ZXN0X2NsaWVudC50ZXN0X2V4Y2VwdGlvbigiZm9vIi50b19vd25lZCgpKTsKKyAgICAgICAgbWF0Y2ggciB7CisgICAgICAgICAgICBPayhfKSA9PiBPaygoKSksCisgICAgICAgICAgICBfID0+IEVycih0aHJpZnQ6OkVycm9yOjpVc2VyKCJyZWNlaXZlZCBhbiBleGNlcHRpb24iLmludG8oKSkpLAorICAgICAgICB9PzsKKyAgICB9CisKKyAgICBpbmZvISgidGVzdE11bHRpRXhjZXB0aW9uIC0gcmVtb3RlIHRocm93cyBYY2VwdGlvbiIpOworICAgIHsKKyAgICAgICAgbGV0IHIgPQorICAgICAgICAgICAgdGhyaWZ0X3Rlc3RfY2xpZW50LnRlc3RfbXVsdGlfZXhjZXB0aW9uKCJYY2VwdGlvbiIudG9fb3duZWQoKSwgImlnbm9yZWQiLnRvX293bmVkKCkpOworICAgICAgICBsZXQgeCA9IG1hdGNoIHIgeworICAgICAgICAgICAgRXJyKHRocmlmdDo6RXJyb3I6OlVzZXIocmVmIGUpKSA9PiB7CisgICAgICAgICAgICAgICAgbWF0Y2ggZS5kb3duY2FzdF9yZWY6OjxYY2VwdGlvbj4oKSB7CisgICAgICAgICAgICAgICAgICAgIFNvbWUoeCkgPT4gT2soeCksCisgICAgICAgICAgICAgICAgICAgIE5vbmUgPT4gRXJyKHRocmlmdDo6RXJyb3I6OlVzZXIoImRpZCBub3QgZ2V0IGV4cGVjdGVkIFhjZXB0aW9uIHN0cnVjdCIuaW50bygpKSwpLAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF8gPT4gRXJyKHRocmlmdDo6RXJyb3I6OlVzZXIoImRpZCBub3QgZ2V0IGV4Y2VwdGlvbiIuaW50bygpKSksCisgICAgICAgIH0/OworCisgICAgICAgIGxldCB4X2NtcCA9IFhjZXB0aW9uIHsKKyAgICAgICAgICAgIGVycm9yX2NvZGU6IFNvbWUoMTAwMSksCisgICAgICAgICAgICBtZXNzYWdlOiBTb21lKCJUaGlzIGlzIGFuIFhjZXB0aW9uIi50b19vd25lZCgpKSwKKyAgICAgICAgfTsKKworICAgICAgICB2ZXJpZnlfZXhwZWN0ZWRfcmVzdWx0KE9rKHgpLCAmeF9jbXApPzsKKyAgICB9CisKKyAgICBpbmZvISgidGVzdE11bHRpRXhjZXB0aW9uIC0gcmVtb3RlIHRocm93cyBYY2VwdGlvbjIiKTsKKyAgICB7CisgICAgICAgIGxldCByID0KKyAgICAgICAgICAgIHRocmlmdF90ZXN0X2NsaWVudC50ZXN0X211bHRpX2V4Y2VwdGlvbigiWGNlcHRpb24yIi50b19vd25lZCgpLCAiaWdub3JlZCIudG9fb3duZWQoKSk7CisgICAgICAgIGxldCB4ID0gbWF0Y2ggciB7CisgICAgICAgICAgICBFcnIodGhyaWZ0OjpFcnJvcjo6VXNlcihyZWYgZSkpID0+IHsKKyAgICAgICAgICAgICAgICBtYXRjaCBlLmRvd25jYXN0X3JlZjo6PFhjZXB0aW9uMj4oKSB7CisgICAgICAgICAgICAgICAgICAgIFNvbWUoeCkgPT4gT2soeCksCisgICAgICAgICAgICAgICAgICAgIE5vbmUgPT4gRXJyKHRocmlmdDo6RXJyb3I6OlVzZXIoImRpZCBub3QgZ2V0IGV4cGVjdGVkIFhjZXB0aW9uIHN0cnVjdCIuaW50bygpKSwpLAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF8gPT4gRXJyKHRocmlmdDo6RXJyb3I6OlVzZXIoImRpZCBub3QgZ2V0IGV4Y2VwdGlvbiIuaW50bygpKSksCisgICAgICAgIH0/OworCisgICAgICAgIGxldCB4X2NtcCA9IFhjZXB0aW9uMiB7CisgICAgICAgICAgICBlcnJvcl9jb2RlOiBTb21lKDIwMDIpLAorICAgICAgICAgICAgc3RydWN0X3RoaW5nOiBTb21lKAorICAgICAgICAgICAgICAgIFh0cnVjdCB7CisgICAgICAgICAgICAgICAgICAgIHN0cmluZ190aGluZzogU29tZSgiVGhpcyBpcyBhbiBYY2VwdGlvbjIiLnRvX293bmVkKCkpLAorICAgICAgICAgICAgICAgICAgICAvLyBzaW5jZSB0aGlzIGlzIGFuIE9QVF9JTl9SRVFfT1VUIGZpZWxkIHRoZSBzZW5kZXIgc2V0cyBhIGRlZmF1bHQKKyAgICAgICAgICAgICAgICAgICAgYnl0ZV90aGluZzogU29tZSgwKSwKKyAgICAgICAgICAgICAgICAgICAgLy8gc2luY2UgdGhpcyBpcyBhbiBPUFRfSU5fUkVRX09VVCBmaWVsZCB0aGUgc2VuZGVyIHNldHMgYSBkZWZhdWx0CisgICAgICAgICAgICAgICAgICAgIGkzMl90aGluZzogU29tZSgwKSwKKyAgICAgICAgICAgICAgICAgICAgLy8gc2luY2UgdGhpcyBpcyBhbiBPUFRfSU5fUkVRX09VVCBmaWVsZCB0aGUgc2VuZGVyIHNldHMgYSBkZWZhdWx0CisgICAgICAgICAgICAgICAgICAgIGk2NF90aGluZzogU29tZSgwKSwKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgKSwKKyAgICAgICAgfTsKKworICAgICAgICB2ZXJpZnlfZXhwZWN0ZWRfcmVzdWx0KE9rKHgpLCAmeF9jbXApPzsKKyAgICB9CisKKyAgICBpbmZvISgidGVzdE11bHRpRXhjZXB0aW9uIC0gcmVtb3RlIHN1Y2NlZWRzIik7CisgICAgeworICAgICAgICBsZXQgciA9IHRocmlmdF90ZXN0X2NsaWVudC50ZXN0X211bHRpX2V4Y2VwdGlvbigiaGFoYSIudG9fb3duZWQoKSwgIlJFVFVSTkVEIi50b19vd25lZCgpKTsKKyAgICAgICAgbGV0IHggPSBtYXRjaCByIHsKKyAgICAgICAgICAgIEVycihlKSA9PiBFcnIodGhyaWZ0OjpFcnJvcjo6VXNlcihmb3JtYXQhKCJyZWNlaXZlZCBhbiB1bmV4cGVjdGVkIGV4Y2VwdGlvbiB7Oj99IiwgZSkuaW50bygpLCksKSwKKyAgICAgICAgICAgIF8gPT4gciwKKyAgICAgICAgfT87CisKKyAgICAgICAgbGV0IHhfY21wID0gWHRydWN0IHsKKyAgICAgICAgICAgIHN0cmluZ190aGluZzogU29tZSgiUkVUVVJORUQiLnRvX293bmVkKCkpLAorICAgICAgICAgICAgLy8gc2luY2UgdGhpcyBpcyBhbiBPUFRfSU5fUkVRX09VVCBmaWVsZCB0aGUgc2VuZGVyIHNldHMgYSBkZWZhdWx0CisgICAgICAgICAgICBieXRlX3RoaW5nOiBTb21lKDApLAorICAgICAgICAgICAgLy8gc2luY2UgdGhpcyBpcyBhbiBPUFRfSU5fUkVRX09VVCBmaWVsZCB0aGUgc2VuZGVyIHNldHMgYSBkZWZhdWx0CisgICAgICAgICAgICBpMzJfdGhpbmc6IFNvbWUoMCksCisgICAgICAgICAgICAvLyBzaW5jZSB0aGlzIGlzIGFuIE9QVF9JTl9SRVFfT1VUIGZpZWxkIHRoZSBzZW5kZXIgc2V0cyBhIGRlZmF1bHQKKyAgICAgICAgICAgIGk2NF90aGluZzogU29tZSgwKSwKKyAgICAgICAgfTsKKworICAgICAgICB2ZXJpZnlfZXhwZWN0ZWRfcmVzdWx0KE9rKHgpLCB4X2NtcCk/OworICAgIH0KKworICAgIGluZm8hKCJ0ZXN0T25lV2F5IC0gcmVtb3RlIHNsZWVwcyBmb3IgMSBzZWNvbmQiKTsKKyAgICB7CisgICAgICAgIHRocmlmdF90ZXN0X2NsaWVudC50ZXN0X29uZXdheSgxKT87CisgICAgfQorCisgICAgLy8gZmluYWwgdGVzdCB0byB2ZXJpZnkgdGhhdCB0aGUgY29ubmVjdGlvbiBpcyBzdGlsbCB3cml0YWJsZSBhZnRlciB0aGUgb25lLXdheQorICAgIC8vIGNhbGwKKyAgICB0aHJpZnRfdGVzdF9jbGllbnQudGVzdF92b2lkKCkKK30KKworI1tjZmdfYXR0cihmZWF0dXJlID0gImNhcmdvLWNsaXBweSIsIGFsbG93KG5lZWRsZXNzX3Bhc3NfYnlfdmFsdWUpKV0KK2ZuIHZlcmlmeV9leHBlY3RlZF9yZXN1bHQ8VDogRGVidWcgKyBQYXJ0aWFsRXEgKyBTaXplZD4oCisgICAgYWN0dWFsOiBSZXN1bHQ8VCwgdGhyaWZ0OjpFcnJvcj4sCisgICAgZXhwZWN0ZWQ6IFQsCispIC0+IFJlc3VsdDwoKSwgdGhyaWZ0OjpFcnJvcj4geworICAgIGluZm8hKCIqKiogRVhQRUNURUQ6IE9rKHs6P30pIiwgZXhwZWN0ZWQpOworICAgIGluZm8hKCIqKiogQUNUVUFMICA6IHs6P30iLCBhY3R1YWwpOworICAgIG1hdGNoIGFjdHVhbCB7CisgICAgICAgIE9rKHYpID0+IHsKKyAgICAgICAgICAgIGlmIHYgPT0gZXhwZWN0ZWQgeworICAgICAgICAgICAgICAgIGluZm8hKCIqKiogT0sgKioqIik7CisgICAgICAgICAgICAgICAgT2soKCkpCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGluZm8hKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIEVycih0aHJpZnQ6OkVycm9yOjpVc2VyKGZvcm1hdCEoImV4cGVjdGVkIHs6P30gYnV0IGdvdCB7Oj99IiwgJmV4cGVjdGVkLCAmdikuaW50bygpKSwpCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgRXJyKGUpID0+IEVycihlKSwKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3JzL3NyYy9iaW4vdGVzdF9zZXJ2ZXIucnMgYi90ZXN0L3JzL3NyYy9iaW4vdGVzdF9zZXJ2ZXIucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFjMWVjNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvcnMvc3JjL2Jpbi90ZXN0X3NlcnZlci5ycwpAQCAtMCwwICsxLDM5OCBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjW21hY3JvX3VzZV0KK2V4dGVybiBjcmF0ZSBsb2c7CitleHRlcm4gY3JhdGUgZW52X2xvZ2dlcjsKKworI1ttYWNyb191c2VdCitleHRlcm4gY3JhdGUgY2xhcDsKK2V4dGVybiBjcmF0ZSBvcmRlcmVkX2Zsb2F0OworZXh0ZXJuIGNyYXRlIHRocmlmdDsKK2V4dGVybiBjcmF0ZSB0aHJpZnRfdGVzdDsKKwordXNlIG9yZGVyZWRfZmxvYXQ6Ok9yZGVyZWRGbG9hdDsKK3VzZSBzdGQ6OmNvbGxlY3Rpb25zOjp7QlRyZWVNYXAsIEJUcmVlU2V0fTsKK3VzZSBzdGQ6OnRocmVhZDsKK3VzZSBzdGQ6OnRpbWU6OkR1cmF0aW9uOworCit1c2UgdGhyaWZ0Ojpwcm90b2NvbDo6e1RCaW5hcnlJbnB1dFByb3RvY29sRmFjdG9yeSwgVEJpbmFyeU91dHB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgVENvbXBhY3RJbnB1dFByb3RvY29sRmFjdG9yeSwgVENvbXBhY3RPdXRwdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgIFRJbnB1dFByb3RvY29sRmFjdG9yeSwgVE91dHB1dFByb3RvY29sRmFjdG9yeX07Cit1c2UgdGhyaWZ0OjpzZXJ2ZXI6OntUTXVsdGlwbGV4ZWRQcm9jZXNzb3IsIFRTZXJ2ZXJ9OwordXNlIHRocmlmdDo6dHJhbnNwb3J0Ojp7VEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydEZhY3RvcnksIFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRGcmFtZWRSZWFkVHJhbnNwb3J0RmFjdG9yeSwgVEZyYW1lZFdyaXRlVHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRSZWFkVHJhbnNwb3J0RmFjdG9yeSwgVFdyaXRlVHJhbnNwb3J0RmFjdG9yeX07Cit1c2UgdGhyaWZ0X3Rlc3Q6Oio7CisKK2ZuIG1haW4oKSB7CisgICAgZW52X2xvZ2dlcjo6aW5pdCgpLmV4cGVjdCgibG9nZ2VyIHNldHVwIGZhaWxlZCIpOworCisgICAgZGVidWchKCJpbml0aWFsaXplZCBsb2dnZXIgLSBydW5uaW5nIGNyb3NzLXRlc3Qgc2VydmVyIik7CisKKyAgICBtYXRjaCBydW4oKSB7CisgICAgICAgIE9rKCgpKSA9PiBpbmZvISgiY3Jvc3MtdGVzdCBzZXJ2ZXIgc3VjY2VlZGVkIiksCisgICAgICAgIEVycihlKSA9PiB7CisgICAgICAgICAgICBpbmZvISgiY3Jvc3MtdGVzdCBzZXJ2ZXIgZmFpbGVkIHdpdGggZXJyb3Igezo/fSIsIGUpOworICAgICAgICAgICAgc3RkOjpwcm9jZXNzOjpleGl0KDEpOworICAgICAgICB9CisgICAgfQorfQorCitmbiBydW4oKSAtPiB0aHJpZnQ6OlJlc3VsdDwoKT4geworCisgICAgLy8gdW5zdXBwb3J0ZWQgb3B0aW9uczoKKyAgICAvLyAtLWRvbWFpbi1zb2NrZXQKKyAgICAvLyAtLW5hbWVkLXBpcGUKKyAgICAvLyAtLXNzbAorICAgIGxldCBtYXRjaGVzID0gY2xhcF9hcHAhKHJ1c3RfdGVzdF9jbGllbnQgPT4KKyAgICAgICAgKHZlcnNpb246ICIxLjAiKQorICAgICAgICAoYXV0aG9yOiAiQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzIDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+IikKKyAgICAgICAgKGFib3V0OiAiUnVzdCBUaHJpZnQgdGVzdCBzZXJ2ZXIiKQorICAgICAgICAoQGFyZyBwb3J0OiAtLXBvcnQgK3Rha2VzX3ZhbHVlICJwb3J0IG9uIHdoaWNoIHRoZSB0ZXN0IHNlcnZlciBsaXN0ZW5zIikKKyAgICAgICAgKEBhcmcgdHJhbnNwb3J0OiAtLXRyYW5zcG9ydCArdGFrZXNfdmFsdWUgInRyYW5zcG9ydCBpbXBsZW1lbnRhdGlvbiB0byB1c2UgKFwiYnVmZmVyZWRcIiwgXCJmcmFtZWRcIikiKQorICAgICAgICAoQGFyZyBwcm90b2NvbDogLS1wcm90b2NvbCArdGFrZXNfdmFsdWUgInByb3RvY29sIGltcGxlbWVudGF0aW9uIHRvIHVzZSAoXCJiaW5hcnlcIiwgXCJjb21wYWN0XCIpIikKKyAgICAgICAgKEBhcmcgc2VydmVyX3R5cGU6IC0tc2VydmVyX3R5cGUgK3Rha2VzX3ZhbHVlICJ0eXBlIG9mIHNlcnZlciBpbnN0YW50aWF0ZWQgKFwic2ltcGxlXCIsIFwidGhyZWFkLXBvb2xcIikiKQorICAgICAgICAoQGFyZyB3b3JrZXJzOiAtbiAtLXdvcmtlcnMgK3Rha2VzX3ZhbHVlICJudW1iZXIgb2YgdGhyZWFkLXBvb2wgd29ya2VycyAoXCI0XCIpIikKKyAgICApCisgICAgICAgICAgICAuZ2V0X21hdGNoZXMoKTsKKworICAgIGxldCBwb3J0ID0gdmFsdWVfdCEobWF0Y2hlcywgInBvcnQiLCB1MTYpLnVud3JhcF9vcig5MDkwKTsKKyAgICBsZXQgdHJhbnNwb3J0ID0gbWF0Y2hlcy52YWx1ZV9vZigidHJhbnNwb3J0IikudW53cmFwX29yKCJidWZmZXJlZCIpOworICAgIGxldCBwcm90b2NvbCA9IG1hdGNoZXMudmFsdWVfb2YoInByb3RvY29sIikudW53cmFwX29yKCJiaW5hcnkiKTsKKyAgICBsZXQgc2VydmVyX3R5cGUgPSBtYXRjaGVzLnZhbHVlX29mKCJzZXJ2ZXJfdHlwZSIpLnVud3JhcF9vcigidGhyZWFkLXBvb2wiKTsKKyAgICBsZXQgd29ya2VycyA9IHZhbHVlX3QhKG1hdGNoZXMsICJ3b3JrZXJzIiwgdXNpemUpLnVud3JhcF9vcig0KTsKKyAgICBsZXQgbGlzdGVuX2FkZHJlc3MgPSBmb3JtYXQhKCIxMjcuMC4wLjE6e30iLCBwb3J0KTsKKworICAgIGluZm8hKCJiaW5kaW5nIHRvIHt9IiwgbGlzdGVuX2FkZHJlc3MpOworCisgICAgbGV0IChpX3RyYW5zcG9ydF9mYWN0b3J5LCBvX3RyYW5zcG9ydF9mYWN0b3J5KTogKEJveDxUUmVhZFRyYW5zcG9ydEZhY3Rvcnk+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb3g8VFdyaXRlVHJhbnNwb3J0RmFjdG9yeT4pID0KKyAgICAgICAgbWF0Y2ggJip0cmFuc3BvcnQgeworICAgICAgICAgICAgImJ1ZmZlcmVkIiA9PiB7CisgICAgICAgICAgICAgICAgKEJveDo6bmV3KFRCdWZmZXJlZFJlYWRUcmFuc3BvcnRGYWN0b3J5OjpuZXcoKSksCisgICAgICAgICAgICAgICAgIEJveDo6bmV3KFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0RmFjdG9yeTo6bmV3KCkpKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgImZyYW1lZCIgPT4geworICAgICAgICAgICAgICAgIChCb3g6Om5ldyhURnJhbWVkUmVhZFRyYW5zcG9ydEZhY3Rvcnk6Om5ldygpKSwKKyAgICAgICAgICAgICAgICAgQm94OjpuZXcoVEZyYW1lZFdyaXRlVHJhbnNwb3J0RmFjdG9yeTo6bmV3KCkpKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdW5rbm93biA9PiB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVycihmb3JtYXQhKCJ1bnN1cHBvcnRlZCB0cmFuc3BvcnQgdHlwZSB7fSIsIHVua25vd24pLmludG8oKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICBsZXQgKGlfcHJvdG9jb2xfZmFjdG9yeSwgb19wcm90b2NvbF9mYWN0b3J5KTogKEJveDxUSW5wdXRQcm90b2NvbEZhY3Rvcnk+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQm94PFRPdXRwdXRQcm90b2NvbEZhY3Rvcnk+KSA9CisgICAgICAgIG1hdGNoICYqcHJvdG9jb2wgeworICAgICAgICAgICAgImJpbmFyeSIgfCAibXVsdGkiIHwgIm11bHRpOmJpbmFyeSIgPT4geworICAgICAgICAgICAgICAgIChCb3g6Om5ldyhUQmluYXJ5SW5wdXRQcm90b2NvbEZhY3Rvcnk6Om5ldygpKSwKKyAgICAgICAgICAgICAgICAgQm94OjpuZXcoVEJpbmFyeU91dHB1dFByb3RvY29sRmFjdG9yeTo6bmV3KCkpKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgImNvbXBhY3QiIHwgIm11bHRpYyIgfCAibXVsdGk6Y29tcGFjdCIgPT4geworICAgICAgICAgICAgICAgIChCb3g6Om5ldyhUQ29tcGFjdElucHV0UHJvdG9jb2xGYWN0b3J5OjpuZXcoKSksCisgICAgICAgICAgICAgICAgIEJveDo6bmV3KFRDb21wYWN0T3V0cHV0UHJvdG9jb2xGYWN0b3J5OjpuZXcoKSkpCisgICAgICAgICAgICB9CisgICAgICAgICAgICB1bmtub3duID0+IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRXJyKGZvcm1hdCEoInVuc3VwcG9ydGVkIHRyYW5zcG9ydCB0eXBlIHt9IiwgdW5rbm93bikuaW50bygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgIGxldCB0ZXN0X3Byb2Nlc3NvciA9IFRocmlmdFRlc3RTeW5jUHJvY2Vzc29yOjpuZXcoVGhyaWZ0VGVzdFN5bmNIYW5kbGVySW1wbCB7fSk7CisKKyAgICBtYXRjaCAmKnNlcnZlcl90eXBlIHsKKyAgICAgICAgInNpbXBsZSIgfCAidGhyZWFkLXBvb2wiID0+IHsKKyAgICAgICAgICAgIGlmIHByb3RvY29sID09ICJtdWx0aSIgfHwgcHJvdG9jb2wgPT0gIm11bHRpYyIgeworICAgICAgICAgICAgICAgIGxldCBzZWNvbmRfc2VydmljZV9wcm9jZXNzb3IgPSBTZWNvbmRTZXJ2aWNlU3luY1Byb2Nlc3Nvcjo6bmV3KFNlY29uZFNlcnZpY2VTeW5jSGFuZGxlckltcGwge30sKTsKKworICAgICAgICAgICAgICAgIGxldCBtdXQgbXVsdGlwbGV4ZWRfcHJvY2Vzc29yID0gVE11bHRpcGxleGVkUHJvY2Vzc29yOjpuZXcoKTsKKyAgICAgICAgICAgICAgICBtdWx0aXBsZXhlZF9wcm9jZXNzb3IKKyAgICAgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKCJUaHJpZnRUZXN0IiwgQm94OjpuZXcodGVzdF9wcm9jZXNzb3IpLCB0cnVlKT87CisgICAgICAgICAgICAgICAgbXVsdGlwbGV4ZWRfcHJvY2Vzc29yCisgICAgICAgICAgICAgICAgICAgIC5yZWdpc3RlcigiU2Vjb25kU2VydmljZSIsIEJveDo6bmV3KHNlY29uZF9zZXJ2aWNlX3Byb2Nlc3NvciksIGZhbHNlKT87CisKKyAgICAgICAgICAgICAgICBsZXQgbXV0IHNlcnZlciA9IFRTZXJ2ZXI6Om5ldygKKyAgICAgICAgICAgICAgICAgICAgaV90cmFuc3BvcnRfZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgaV9wcm90b2NvbF9mYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICBvX3RyYW5zcG9ydF9mYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICBvX3Byb3RvY29sX2ZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgIG11bHRpcGxleGVkX3Byb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgd29ya2VycywKKyAgICAgICAgICAgICAgICApOworCisgICAgICAgICAgICAgICAgc2VydmVyLmxpc3RlbigmbGlzdGVuX2FkZHJlc3MpCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGxldCBtdXQgc2VydmVyID0gVFNlcnZlcjo6bmV3KAorICAgICAgICAgICAgICAgICAgICBpX3RyYW5zcG9ydF9mYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICBpX3Byb3RvY29sX2ZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgIG9fdHJhbnNwb3J0X2ZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgIG9fcHJvdG9jb2xfZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgdGVzdF9wcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgIHdvcmtlcnMsCisgICAgICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgICAgIHNlcnZlci5saXN0ZW4oJmxpc3Rlbl9hZGRyZXNzKQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHVua25vd24gPT4gRXJyKGZvcm1hdCEoInVuc3VwcG9ydGVkIHNlcnZlciB0eXBlIHt9IiwgdW5rbm93bikuaW50bygpKSwKKyAgICB9Cit9CisKK3N0cnVjdCBUaHJpZnRUZXN0U3luY0hhbmRsZXJJbXBsOworaW1wbCBUaHJpZnRUZXN0U3luY0hhbmRsZXIgZm9yIFRocmlmdFRlc3RTeW5jSGFuZGxlckltcGwgeworICAgIGZuIGhhbmRsZV90ZXN0X3ZvaWQoJnNlbGYpIC0+IHRocmlmdDo6UmVzdWx0PCgpPiB7CisgICAgICAgIGluZm8hKCJ0ZXN0Vm9pZCgpIik7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIGZuIGhhbmRsZV90ZXN0X3N0cmluZygmc2VsZiwgdGhpbmc6IFN0cmluZykgLT4gdGhyaWZ0OjpSZXN1bHQ8U3RyaW5nPiB7CisgICAgICAgIGluZm8hKCJ0ZXN0U3RyaW5nKHt9KSIsICZ0aGluZyk7CisgICAgICAgIE9rKHRoaW5nKQorICAgIH0KKworICAgIGZuIGhhbmRsZV90ZXN0X2Jvb2woJnNlbGYsIHRoaW5nOiBib29sKSAtPiB0aHJpZnQ6OlJlc3VsdDxib29sPiB7CisgICAgICAgIGluZm8hKCJ0ZXN0Qm9vbCh7fSkiLCB0aGluZyk7CisgICAgICAgIE9rKHRoaW5nKQorICAgIH0KKworICAgIGZuIGhhbmRsZV90ZXN0X2J5dGUoJnNlbGYsIHRoaW5nOiBpOCkgLT4gdGhyaWZ0OjpSZXN1bHQ8aTg+IHsKKyAgICAgICAgaW5mbyEoInRlc3RCeXRlKHt9KSIsIHRoaW5nKTsKKyAgICAgICAgT2sodGhpbmcpCisgICAgfQorCisgICAgZm4gaGFuZGxlX3Rlc3RfaTMyKCZzZWxmLCB0aGluZzogaTMyKSAtPiB0aHJpZnQ6OlJlc3VsdDxpMzI+IHsKKyAgICAgICAgaW5mbyEoInRlc3RpMzIoe30pIiwgdGhpbmcpOworICAgICAgICBPayh0aGluZykKKyAgICB9CisKKyAgICBmbiBoYW5kbGVfdGVzdF9pNjQoJnNlbGYsIHRoaW5nOiBpNjQpIC0+IHRocmlmdDo6UmVzdWx0PGk2ND4geworICAgICAgICBpbmZvISgidGVzdGk2NCh7fSkiLCB0aGluZyk7CisgICAgICAgIE9rKHRoaW5nKQorICAgIH0KKworICAgIGZuIGhhbmRsZV90ZXN0X2RvdWJsZSgmc2VsZiwgdGhpbmc6IE9yZGVyZWRGbG9hdDxmNjQ+KSAtPiB0aHJpZnQ6OlJlc3VsdDxPcmRlcmVkRmxvYXQ8ZjY0Pj4geworICAgICAgICBpbmZvISgidGVzdERvdWJsZSh7fSkiLCB0aGluZyk7CisgICAgICAgIE9rKHRoaW5nKQorICAgIH0KKworICAgIGZuIGhhbmRsZV90ZXN0X2JpbmFyeSgmc2VsZiwgdGhpbmc6IFZlYzx1OD4pIC0+IHRocmlmdDo6UmVzdWx0PFZlYzx1OD4+IHsKKyAgICAgICAgaW5mbyEoInRlc3RCaW5hcnkoezo/fSkiLCB0aGluZyk7CisgICAgICAgIE9rKHRoaW5nKQorICAgIH0KKworICAgIGZuIGhhbmRsZV90ZXN0X3N0cnVjdCgmc2VsZiwgdGhpbmc6IFh0cnVjdCkgLT4gdGhyaWZ0OjpSZXN1bHQ8WHRydWN0PiB7CisgICAgICAgIGluZm8hKCJ0ZXN0U3RydWN0KHs6P30pIiwgdGhpbmcpOworICAgICAgICBPayh0aGluZykKKyAgICB9CisKKyAgICBmbiBoYW5kbGVfdGVzdF9uZXN0KCZzZWxmLCB0aGluZzogWHRydWN0MikgLT4gdGhyaWZ0OjpSZXN1bHQ8WHRydWN0Mj4geworICAgICAgICBpbmZvISgidGVzdE5lc3Qoezo/fSkiLCB0aGluZyk7CisgICAgICAgIE9rKHRoaW5nKQorICAgIH0KKworICAgIGZuIGhhbmRsZV90ZXN0X21hcCgmc2VsZiwgdGhpbmc6IEJUcmVlTWFwPGkzMiwgaTMyPikgLT4gdGhyaWZ0OjpSZXN1bHQ8QlRyZWVNYXA8aTMyLCBpMzI+PiB7CisgICAgICAgIGluZm8hKCJ0ZXN0TWFwKHs6P30pIiwgdGhpbmcpOworICAgICAgICBPayh0aGluZykKKyAgICB9CisKKyAgICBmbiBoYW5kbGVfdGVzdF9zdHJpbmdfbWFwKAorICAgICAgICAmc2VsZiwKKyAgICAgICAgdGhpbmc6IEJUcmVlTWFwPFN0cmluZywgU3RyaW5nPiwKKyAgICApIC0+IHRocmlmdDo6UmVzdWx0PEJUcmVlTWFwPFN0cmluZywgU3RyaW5nPj4geworICAgICAgICBpbmZvISgidGVzdFN0cmluZ01hcCh7Oj99KSIsIHRoaW5nKTsKKyAgICAgICAgT2sodGhpbmcpCisgICAgfQorCisgICAgZm4gaGFuZGxlX3Rlc3Rfc2V0KCZzZWxmLCB0aGluZzogQlRyZWVTZXQ8aTMyPikgLT4gdGhyaWZ0OjpSZXN1bHQ8QlRyZWVTZXQ8aTMyPj4geworICAgICAgICBpbmZvISgidGVzdFNldCh7Oj99KSIsIHRoaW5nKTsKKyAgICAgICAgT2sodGhpbmcpCisgICAgfQorCisgICAgZm4gaGFuZGxlX3Rlc3RfbGlzdCgmc2VsZiwgdGhpbmc6IFZlYzxpMzI+KSAtPiB0aHJpZnQ6OlJlc3VsdDxWZWM8aTMyPj4geworICAgICAgICBpbmZvISgidGVzdExpc3Qoezo/fSkiLCB0aGluZyk7CisgICAgICAgIE9rKHRoaW5nKQorICAgIH0KKworICAgIGZuIGhhbmRsZV90ZXN0X2VudW0oJnNlbGYsIHRoaW5nOiBOdW1iZXJ6KSAtPiB0aHJpZnQ6OlJlc3VsdDxOdW1iZXJ6PiB7CisgICAgICAgIGluZm8hKCJ0ZXN0RW51bSh7Oj99KSIsIHRoaW5nKTsKKyAgICAgICAgT2sodGhpbmcpCisgICAgfQorCisgICAgZm4gaGFuZGxlX3Rlc3RfdHlwZWRlZigmc2VsZiwgdGhpbmc6IFVzZXJJZCkgLT4gdGhyaWZ0OjpSZXN1bHQ8VXNlcklkPiB7CisgICAgICAgIGluZm8hKCJ0ZXN0VHlwZWRlZih7fSkiLCB0aGluZyk7CisgICAgICAgIE9rKHRoaW5nKQorICAgIH0KKworICAgIC8vLyBAcmV0dXJuIG1hcDxpMzIsbWFwPGkzMixpMzI+PiAtIHJldHVybnMgYSBkaWN0aW9uYXJ5IHdpdGggdGhlc2UgdmFsdWVzOgorICAgIC8vLyB7LTQgPT4gey00ID0+IC00LCAtMyA9PiAtMywgLTIgPT4gLTIsIC0xID0+IC0xLCB9LCA0ID0+IHsxID0+IDEsIDIgPT4KKyAgICAvLy8gMiwgMyA9PiAzLCA0ID0+IDQsIH0sIH0KKyAgICBmbiBoYW5kbGVfdGVzdF9tYXBfbWFwKCZzZWxmLCBoZWxsbzogaTMyKSAtPiB0aHJpZnQ6OlJlc3VsdDxCVHJlZU1hcDxpMzIsIEJUcmVlTWFwPGkzMiwgaTMyPj4+IHsKKyAgICAgICAgaW5mbyEoInRlc3RNYXBNYXAoe30pIiwgaGVsbG8pOworCisgICAgICAgIGxldCBtdXQgaW5uZXJfbWFwXzA6IEJUcmVlTWFwPGkzMiwgaTMyPiA9IEJUcmVlTWFwOjpuZXcoKTsKKyAgICAgICAgZm9yIGkgaW4gLTQuLigwIGFzIGkzMikgeworICAgICAgICAgICAgaW5uZXJfbWFwXzAuaW5zZXJ0KGksIGkpOworICAgICAgICB9CisKKyAgICAgICAgbGV0IG11dCBpbm5lcl9tYXBfMTogQlRyZWVNYXA8aTMyLCBpMzI+ID0gQlRyZWVNYXA6Om5ldygpOworICAgICAgICBmb3IgaSBpbiAxLi41IHsKKyAgICAgICAgICAgIGlubmVyX21hcF8xLmluc2VydChpLCBpKTsKKyAgICAgICAgfQorCisgICAgICAgIGxldCBtdXQgcmV0X21hcDogQlRyZWVNYXA8aTMyLCBCVHJlZU1hcDxpMzIsIGkzMj4+ID0gQlRyZWVNYXA6Om5ldygpOworICAgICAgICByZXRfbWFwLmluc2VydCgtNCwgaW5uZXJfbWFwXzApOworICAgICAgICByZXRfbWFwLmluc2VydCg0LCBpbm5lcl9tYXBfMSk7CisKKyAgICAgICAgT2socmV0X21hcCkKKyAgICB9CisKKyAgICAvLy8gQ3JlYXRlcyBhIHRoZSByZXR1cm5lZCBtYXAgd2l0aCB0aGVzZSB2YWx1ZXMgYW5kIHByaW50cyBpdCBvdXQ6CisgICAgLy8vICAgICB7IDEgPT4geyAyID0+IGFyZ3VtZW50LAorICAgIC8vLyAgICAgICAgICAgICAgMyA9PiBhcmd1bWVudCwKKyAgICAvLy8gICAgICAgICAgICB9LAorICAgIC8vLyAgICAgICAyID0+IHsgNiA9PiA8ZW1wdHkgSW5zYW5pdHkgc3RydWN0PiwgfSwKKyAgICAvLy8gICAgIH0KKyAgICAvLy8gcmV0dXJuIG1hcDxVc2VySWQsIG1hcDxOdW1iZXJ6LEluc2FuaXR5Pj4gLSBhIG1hcCB3aXRoIHRoZSBhYm92ZSB2YWx1ZXMKKyAgICBmbiBoYW5kbGVfdGVzdF9pbnNhbml0eSgKKyAgICAgICAgJnNlbGYsCisgICAgICAgIGFyZ3VtZW50OiBJbnNhbml0eSwKKyAgICApIC0+IHRocmlmdDo6UmVzdWx0PEJUcmVlTWFwPFVzZXJJZCwgQlRyZWVNYXA8TnVtYmVyeiwgSW5zYW5pdHk+Pj4geworICAgICAgICBpbmZvISgidGVzdEluc2FuaXR5KHs6P30pIiwgYXJndW1lbnQpOworICAgICAgICBsZXQgbXV0IG1hcF8wOiBCVHJlZU1hcDxOdW1iZXJ6LCBJbnNhbml0eT4gPSBCVHJlZU1hcDo6bmV3KCk7CisgICAgICAgIG1hcF8wLmluc2VydChOdW1iZXJ6OjpUd28sIGFyZ3VtZW50LmNsb25lKCkpOworICAgICAgICBtYXBfMC5pbnNlcnQoTnVtYmVyejo6VGhyZWUsIGFyZ3VtZW50LmNsb25lKCkpOworCisgICAgICAgIGxldCBtdXQgbWFwXzE6IEJUcmVlTWFwPE51bWJlcnosIEluc2FuaXR5PiA9IEJUcmVlTWFwOjpuZXcoKTsKKyAgICAgICAgbGV0IGluc2FuaXR5ID0gSW5zYW5pdHkgeworICAgICAgICAgICAgdXNlcl9tYXA6IE5vbmUsCisgICAgICAgICAgICB4dHJ1Y3RzOiBOb25lLAorICAgICAgICB9OworICAgICAgICBtYXBfMS5pbnNlcnQoTnVtYmVyejo6U2l4LCBpbnNhbml0eSk7CisKKyAgICAgICAgbGV0IG11dCByZXQ6IEJUcmVlTWFwPFVzZXJJZCwgQlRyZWVNYXA8TnVtYmVyeiwgSW5zYW5pdHk+PiA9IEJUcmVlTWFwOjpuZXcoKTsKKyAgICAgICAgcmV0Lmluc2VydCgxLCBtYXBfMCk7CisgICAgICAgIHJldC5pbnNlcnQoMiwgbWFwXzEpOworCisgICAgICAgIE9rKHJldCkKKyAgICB9CisKKyAgICAvLy8gcmV0dXJucyBhbiBYdHJ1Y3Qgd2l0aDoKKyAgICAvLy8gc3RyaW5nX3RoaW5nID0gIkhlbGxvMiIsIGJ5dGVfdGhpbmcgPSBhcmcwLCBpMzJfdGhpbmcgPSBhcmcxIGFuZAorICAgIC8vLyBpNjRfdGhpbmcgPSBhcmcyCisgICAgZm4gaGFuZGxlX3Rlc3RfbXVsdGkoCisgICAgICAgICZzZWxmLAorICAgICAgICBhcmcwOiBpOCwKKyAgICAgICAgYXJnMTogaTMyLAorICAgICAgICBhcmcyOiBpNjQsCisgICAgICAgIF86IEJUcmVlTWFwPGkxNiwgU3RyaW5nPiwKKyAgICAgICAgXzogTnVtYmVyeiwKKyAgICAgICAgXzogVXNlcklkLAorICAgICkgLT4gdGhyaWZ0OjpSZXN1bHQ8WHRydWN0PiB7CisgICAgICAgIGxldCB4X3JldCA9IFh0cnVjdCB7CisgICAgICAgICAgICBzdHJpbmdfdGhpbmc6IFNvbWUoIkhlbGxvMiIudG9fb3duZWQoKSksCisgICAgICAgICAgICBieXRlX3RoaW5nOiBTb21lKGFyZzApLAorICAgICAgICAgICAgaTMyX3RoaW5nOiBTb21lKGFyZzEpLAorICAgICAgICAgICAgaTY0X3RoaW5nOiBTb21lKGFyZzIpLAorICAgICAgICB9OworCisgICAgICAgIE9rKHhfcmV0KQorICAgIH0KKworICAgIC8vLyBpZiBhcmcgPT0gIlhjZXB0aW9uIiB0aHJvdyBYY2VwdGlvbiB3aXRoIGVycm9yQ29kZSA9IDEwMDEgYW5kIG1lc3NhZ2UgPQorICAgIC8vLyBhcmcKKyAgICAvLy8gZWxzZSBpZiBhcmcgPT0gIlRFeGNlcHRpb24iIHRocm93IFRFeGNlcHRpb24KKyAgICAvLy8gZWxzZSBkbyBub3QgdGhyb3cgYW55dGhpbmcKKyAgICBmbiBoYW5kbGVfdGVzdF9leGNlcHRpb24oJnNlbGYsIGFyZzogU3RyaW5nKSAtPiB0aHJpZnQ6OlJlc3VsdDwoKT4geworICAgICAgICBpbmZvISgidGVzdEV4Y2VwdGlvbih7fSkiLCBhcmcpOworCisgICAgICAgIG1hdGNoICYqYXJnIHsKKyAgICAgICAgICAgICJYY2VwdGlvbiIgPT4geworICAgICAgICAgICAgICAgIEVycigKKyAgICAgICAgICAgICAgICAgICAgKFhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfY29kZTogU29tZSgxMDAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogU29tZShhcmcpLAorICAgICAgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgICAgICAgICAuaW50bygpLAorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICJURXhjZXB0aW9uIiA9PiBFcnIoInRoaXMgaXMgYSByYW5kb20gZXJyb3IiLmludG8oKSksCisgICAgICAgICAgICBfID0+IE9rKCgpKSwKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vLyBpZiBhcmcwID09ICJYY2VwdGlvbiI6CisgICAgLy8vIHRocm93IFhjZXB0aW9uIHdpdGggZXJyb3JDb2RlID0gMTAwMSBhbmQgbWVzc2FnZSA9ICJUaGlzIGlzIGFuCisgICAgLy8vIFhjZXB0aW9uIgorICAgIC8vLyBlbHNlIGlmIGFyZzAgPT0gIlhjZXB0aW9uMiI6CisgICAgLy8vIHRocm93IFhjZXB0aW9uMiB3aXRoIGVycm9yQ29kZSA9IDIwMDIgYW5kIHN0cnVjdF90aGluZy5zdHJpbmdfdGhpbmcgPQorICAgIC8vLyAiVGhpcyBpcyBhbiBYY2VwdGlvbjIiCisgICAgLy8gZWxzZToKKyAgICAvLyAgIGRvIG5vdCB0aHJvdyBhbnl0aGluZyBhbmQgcmV0dXJuIFh0cnVjdCB3aXRoIHN0cmluZ190aGluZyA9IGFyZzEKKyAgICBmbiBoYW5kbGVfdGVzdF9tdWx0aV9leGNlcHRpb24oJnNlbGYsIGFyZzA6IFN0cmluZywgYXJnMTogU3RyaW5nKSAtPiB0aHJpZnQ6OlJlc3VsdDxYdHJ1Y3Q+IHsKKyAgICAgICAgbWF0Y2ggJiphcmcwIHsKKyAgICAgICAgICAgICJYY2VwdGlvbiIgPT4geworICAgICAgICAgICAgICAgIEVycigKKyAgICAgICAgICAgICAgICAgICAgKFhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfY29kZTogU29tZSgxMDAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogU29tZSgiVGhpcyBpcyBhbiBYY2VwdGlvbiIudG9fb3duZWQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5pbnRvKCksCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgIlhjZXB0aW9uMiIgPT4geworICAgICAgICAgICAgICAgIEVycigKKyAgICAgICAgICAgICAgICAgICAgKFhjZXB0aW9uMiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX2NvZGU6IFNvbWUoMjAwMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdF90aGluZzogU29tZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYdHJ1Y3QgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfdGhpbmc6IFNvbWUoIlRoaXMgaXMgYW4gWGNlcHRpb24yIi50b19vd25lZCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZV90aGluZzogTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTMyX3RoaW5nOiBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpNjRfdGhpbmc6IE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5pbnRvKCksCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgXyA9PiB7CisgICAgICAgICAgICAgICAgT2soCisgICAgICAgICAgICAgICAgICAgIFh0cnVjdCB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfdGhpbmc6IFNvbWUoYXJnMSksCisgICAgICAgICAgICAgICAgICAgICAgICBieXRlX3RoaW5nOiBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgaTMyX3RoaW5nOiBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgaTY0X3RoaW5nOiBOb25lLAorICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGZuIGhhbmRsZV90ZXN0X29uZXdheSgmc2VsZiwgc2Vjb25kc190b19zbGVlcDogaTMyKSAtPiB0aHJpZnQ6OlJlc3VsdDwoKT4geworICAgICAgICB0aHJlYWQ6OnNsZWVwKER1cmF0aW9uOjpmcm9tX3NlY3Moc2Vjb25kc190b19zbGVlcCBhcyB1NjQpKTsKKyAgICAgICAgT2soKCkpCisgICAgfQorfQorCitzdHJ1Y3QgU2Vjb25kU2VydmljZVN5bmNIYW5kbGVySW1wbDsKK2ltcGwgU2Vjb25kU2VydmljZVN5bmNIYW5kbGVyIGZvciBTZWNvbmRTZXJ2aWNlU3luY0hhbmRsZXJJbXBsIHsKKyAgICBmbiBoYW5kbGVfc2Vjb25kdGVzdF9zdHJpbmcoJnNlbGYsIHRoaW5nOiBTdHJpbmcpIC0+IHRocmlmdDo6UmVzdWx0PFN0cmluZz4geworICAgICAgICBpbmZvISgiKHNlY29uZCl0ZXN0U3RyaW5nKHt9KSIsICZ0aGluZyk7CisgICAgICAgIGxldCByZXQgPSBmb3JtYXQhKCJ0ZXN0U3RyaW5nKFwie31cIikiLCAmdGhpbmcpOworICAgICAgICBPayhyZXQpCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9ycy9zcmMvbGliLnJzIGIvdGVzdC9ycy9zcmMvbGliLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3OWJmOTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3JzL3NyYy9saWIucnMKQEAgLTAsMCArMSwyMyBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitleHRlcm4gY3JhdGUgb3JkZXJlZF9mbG9hdDsKK2V4dGVybiBjcmF0ZSB0aHJpZnQ7CitleHRlcm4gY3JhdGUgdHJ5X2Zyb207CisKK21vZCB0aHJpZnRfdGVzdDsKK3B1YiB1c2UgdGhyaWZ0X3Rlc3Q6Oio7CmRpZmYgLS1naXQgYS90ZXN0L3Rlc3QucHkgYi90ZXN0L3Rlc3QucHkKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCBhN2U2MTA1Li5mNTkyNTZhCi0tLSBhL3Rlc3QvdGVzdC5weQorKysgYi90ZXN0L3Rlc3QucHkKQEAgLTEsNSArMSw0IEBACi0jIS91c3IvYmluL2VudiBweXRob24KLQorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwogIwogIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCiAjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCkBAIC0xOSwyODUgKzE4LDE3NSBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBkaXZpc2lvbgotaW1wb3J0IHRpbWUKLWltcG9ydCBzb2NrZXQKLWltcG9ydCBzdWJwcm9jZXNzCi1pbXBvcnQgc3lzCi1pbXBvcnQgb3MKLWltcG9ydCBzaWduYWwKKyMKKyMgQXBhY2hlIFRocmlmdCAtIGludGVncmF0aW9uIChjcm9zcykgdGVzdCBzdWl0ZQorIworIyB0ZXN0cyBkaWZmZXJlbnQgc2VydmVyLWNsaWVudCwgcHJvdG9jb2wgYW5kIHRyYW5zcG9ydCBjb21iaW5hdGlvbnMKKyMKKyMgVGhpcyBzY3JpcHQgcmVxdWlyZXMgcHl0aG9uIDMueCBkdWUgdG8gdGhlIGltcHJvdmVtZW50cyBpbgorIyBzdWJwcm9jZXNzIG1hbmFnZW1lbnQgdGhhdCBhcmUgbmVlZGVkIGZvciByZWxpYWJpbGl0eS4KKyMKKworZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgorZnJvbSBpdGVydG9vbHMgaW1wb3J0IGNoYWluCiBpbXBvcnQganNvbgotaW1wb3J0IHBsYXRmb3JtCi1pbXBvcnQgc2h1dGlsCi1pbXBvcnQgdGhyZWFkaW5nCi1mcm9tIG9wdHBhcnNlIGltcG9ydCBPcHRpb25QYXJzZXIKK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgbXVsdGlwcm9jZXNzaW5nCitpbXBvcnQgYXJncGFyc2UKK2ltcG9ydCBvcworaW1wb3J0IHN5cwogCi1wYXJzZXIgPSBPcHRpb25QYXJzZXIoKQotcGFyc2VyLmFkZF9vcHRpb24oIi0tcG9ydCIsIHR5cGU9ImludCIsIGRlc3Q9InBvcnQiLCBkZWZhdWx0PTkwOTAsCi0gICAgaGVscD0icG9ydCBudW1iZXIgZm9yIHNlcnZlciB0byBsaXN0ZW4gb24iKQotcGFyc2VyLmFkZF9vcHRpb24oJy12JywgJy0tdmVyYm9zZScsIGFjdGlvbj0ic3RvcmVfY29uc3QiLAotICAgIGRlc3Q9InZlcmJvc2UiLCBjb25zdD0yLAotICAgIGhlbHA9InZlcmJvc2Ugb3V0cHV0IikKLXBhcnNlci5hZGRfb3B0aW9uKCctcScsICctLXF1aWV0JywgYWN0aW9uPSJzdG9yZV9jb25zdCIsCi0gICAgZGVzdD0idmVyYm9zZSIsIGNvbnN0PTAsCi0gICAgaGVscD0ibWluaW1hbCBvdXRwdXQiKQotcGFyc2VyLmFkZF9vcHRpb24oIi0tc2VydmVyIiwgdHlwZT0ic3RyaW5nIiwgZGVzdD0ic2VydmVycyIsIGRlZmF1bHQ9IiIsCi0gICAgaGVscD0ibGlzdCBvZiBzZXJ2ZXJzIHRvIHRlc3Qgc2VwZXJhdGVkIGJ5IGNvbW1hcywgZWc6LSAtLXNlcnZlcj1jcHAsamF2YSIpCi1wYXJzZXIuYWRkX29wdGlvbigiLS1jbGllbnQiLCB0eXBlPSJzdHJpbmciLCBkZXN0PSJjbGllbnRzIiwgZGVmYXVsdD0iIiwKLSAgICBoZWxwPSJsaXN0IG9mIGNsaWVudHMgdG8gdGVzdCBzZXBlcmF0ZWQgYnkgY29tbWFzLCBlZzotIC0tY2xpZW50PWNwcCxqYXZhIikKLXBhcnNlci5zZXRfZGVmYXVsdHModmVyYm9zZT0xKQotb3B0aW9ucywgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKK2ltcG9ydCBjcm9zc3J1bm5lcgorZnJvbSBjcm9zc3J1bm5lci5jb21wYXQgaW1wb3J0IHBhdGhfam9pbgogCi1pZiBvcHRpb25zLnNlcnZlcnMgPT0gIiI6Ci0gIHNlcnZlcnNMaXN0ID0gW10KLWVsc2U6Ci0gIHNlcnZlcnNMaXN0ID0gb3B0aW9ucy5zZXJ2ZXJzLnNwbGl0KCIsIikKLWlmIG9wdGlvbnMuY2xpZW50cyA9PSAiIjoKLSAgY2xpZW50c0xpc3QgPSBbXQotZWxzZToKLSAgY2xpZW50c0xpc3QgPSBvcHRpb25zLmNsaWVudHMuc3BsaXQoIiwiKQorIyAzLjMgaW50cm9kdWNlZCBzdWJwcm9jZXNzIHRpbWVvdXRzIG9uIHdhaXRpbmcgZm9yIGNoaWxkCityZXFfdmVyc2lvbiA9ICgzLCAzKQorY3VyX3ZlcnNpb24gPSBzeXMudmVyc2lvbl9pbmZvCithc3NlcnQgKGN1cl92ZXJzaW9uID49IHJlcV92ZXJzaW9uKSwgIlB5dGhvbiAzLjMgb3IgbGF0ZXIgaXMgcmVxdWlyZWQgZm9yIHByb3BlciBvcGVyYXRpb24uIgogCi1kZWYgcmVsZmlsZShmbmFtZSk6Ci0gICAgcmV0dXJuIG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pLCBmbmFtZSkKIAotZGVmIGdldFNvY2tldEFyZ3Moc29ja2V0X3R5cGUpOgotICBpZiBzb2NrZXRfdHlwZSA9PSAnaXAnOgotICAgIHJldHVybiAiIgotICBlbGlmIHNvY2tldF90eXBlID09ICdpcC1zc2wnOgotICAgIHJldHVybiAiLS1zc2wiCi0gIGVsaWYgc29ja2V0X3R5cGUgPT0gJ2RvbWFpbic6Ci0gICAgcmV0dXJuICItLWRvbWFpbi1zb2NrZXQ9L3RtcC9UaHJpZnRUZXN0LnRocmlmdCIKK1JPT1RfRElSID0gb3MucGF0aC5kaXJuYW1lKG9zLnBhdGgucmVhbHBhdGgob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSkpCitURVNUX0RJUl9SRUxBVElWRSA9ICd0ZXN0JworVEVTVF9ESVIgPSBwYXRoX2pvaW4oUk9PVF9ESVIsIFRFU1RfRElSX1JFTEFUSVZFKQorRkVBVFVSRV9ESVJfUkVMQVRJVkUgPSBwYXRoX2pvaW4oVEVTVF9ESVJfUkVMQVRJVkUsICdmZWF0dXJlcycpCitDT05GSUdfRklMRSA9ICd0ZXN0cy5qc29uJwogCi1kZWYgcnVuU2VydmljZVRlc3QodGVzdF9uYW1lLCBzZXJ2ZXJfbGliLCBzZXJ2ZXJfZXhlY3V0YWJsZSwgc2VydmVyX2V4dHJhX2FyZ3MsIGNsaWVudF9saWIsICBjbGllbnRfZXhlY3V0YWJsZSwgY2xpZW50X2V4dHJhX2FyZ3MsIHNlcnZlcl9wcm90b2NvbCwgY2xpZW50X3Byb3RvY29sLCB0cmFuc3BvcnQsIHBvcnQsIHVzZV96bGliLCBzb2NrZXRfdHlwZSk6Ci0gICMgQnVpbGQgY29tbWFuZCBsaW5lIGFyZ3VtZW50cwotICBzZXJ2ZXJfYXJncyA9IFtdCi0gIGNsaV9hcmdzID0gW10KLSAgaWYgc2VydmVyX2xpYiA9PSAnamF2YSc6Ci0gICAgc2VydmVyX2FyZ3MuYXBwZW5kKHNlcnZlcl9leGVjdXRhYmxlWzBdKQotICAgIHNlcnZlcl9hcmdzLmFwcGVuZChzZXJ2ZXJfZXhlY3V0YWJsZVsxXSkKLSAgICBzZXJ2ZXJfYXJncy5hcHBlbmQocmVsZmlsZShzZXJ2ZXJfZXhlY3V0YWJsZVsyXSkpCi0gICAgc2VydmVyX2FyZ3MuZXh0ZW5kKFsnLUR0ZXN0YXJncycsJ1wiJ10pCi0gIGVsc2U6Ci0gICAgc2VydmVyX2FyZ3MgPSBbcmVsZmlsZShzZXJ2ZXJfZXhlY3V0YWJsZSldCi0gIGlmIGNsaWVudF9saWIgPT0gJ2phdmEnOgotICAgIGNsaV9hcmdzLmFwcGVuZChjbGllbnRfZXhlY3V0YWJsZVswXSkKLSAgICBjbGlfYXJncy5hcHBlbmQoY2xpZW50X2V4ZWN1dGFibGVbMV0pCi0gICAgY2xpX2FyZ3MuYXBwZW5kKHJlbGZpbGUoY2xpZW50X2V4ZWN1dGFibGVbMl0pKQotICAgIGNsaV9hcmdzLmV4dGVuZChbJy1EdGVzdGFyZ3MnLCdcIiddKQotICBlbHNlOgotICAgIGNsaV9hcmdzID0gW3JlbGZpbGUoY2xpZW50X2V4ZWN1dGFibGUpXQogCi0gIHNlcnZlcl9hcmdzLmFwcGVuZCgnLS1wcm90b2NvbD0lcycgJSBzZXJ2ZXJfcHJvdG9jb2wpCi0gIGNsaV9hcmdzLmFwcGVuZCgnLS1wcm90b2NvbD0lcycgJSBjbGllbnRfcHJvdG9jb2wpCitkZWYgcnVuX2Nyb3NzX3Rlc3RzKHNlcnZlcl9tYXRjaCwgY2xpZW50X21hdGNoLCBqb2JzLCBza2lwX2tub3duX2ZhaWx1cmVzLCBvbmx5X2tub3duX2ZhaWx1cmVzLCByZXRyeV9jb3VudCwgcmVnZXgpOgorICAgIGxvZ2dlciA9IG11bHRpcHJvY2Vzc2luZy5nZXRfbG9nZ2VyKCkKKyAgICBsb2dnZXIuZGVidWcoJ0NvbGxlY3RpbmcgdGVzdHMnKQorICAgIHdpdGggb3BlbihwYXRoX2pvaW4oVEVTVF9ESVIsIENPTkZJR19GSUxFKSwgJ3InKSBhcyBmcDoKKyAgICAgICAgaiA9IGpzb24ubG9hZChmcCkKKyAgICB0ZXN0cyA9IGNyb3NzcnVubmVyLmNvbGxlY3RfY3Jvc3NfdGVzdHMoaiwgc2VydmVyX21hdGNoLCBjbGllbnRfbWF0Y2gsIHJlZ2V4KQorICAgIGlmIG5vdCB0ZXN0czoKKyAgICAgICAgcHJpbnQoJ05vIHRlc3QgZm91bmQgdGhhdCBtYXRjaGVzIHRoZSBjcml0ZXJpYScsIGZpbGU9c3lzLnN0ZGVycikKKyAgICAgICAgcHJpbnQoJyAgc2VydmVyczogJXMnICUgc2VydmVyX21hdGNoLCBmaWxlPXN5cy5zdGRlcnIpCisgICAgICAgIHByaW50KCcgIGNsaWVudHM6ICVzJyAlIGNsaWVudF9tYXRjaCwgZmlsZT1zeXMuc3RkZXJyKQorICAgICAgICByZXR1cm4gRmFsc2UKKyAgICBpZiBvbmx5X2tub3duX2ZhaWx1cmVzOgorICAgICAgICBsb2dnZXIuZGVidWcoJ09ubHkgcnVubmluZyBrbm93biBmYWlsdXJlcycpCisgICAgICAgIGtub3duID0gY3Jvc3NydW5uZXIubG9hZF9rbm93bl9mYWlsdXJlcyhURVNUX0RJUikKKyAgICAgICAgdGVzdHMgPSBsaXN0KGZpbHRlcihsYW1iZGEgdDogY3Jvc3NydW5uZXIudGVzdF9uYW1lKCoqdCkgaW4ga25vd24sIHRlc3RzKSkKKyAgICBpZiBza2lwX2tub3duX2ZhaWx1cmVzOgorICAgICAgICBsb2dnZXIuZGVidWcoJ1NraXBwaW5nIGtub3duIGZhaWx1cmVzJykKKyAgICAgICAga25vd24gPSBjcm9zc3J1bm5lci5sb2FkX2tub3duX2ZhaWx1cmVzKFRFU1RfRElSKQorICAgICAgICB0ZXN0cyA9IGxpc3QoZmlsdGVyKGxhbWJkYSB0OiBjcm9zc3J1bm5lci50ZXN0X25hbWUoKip0KSBub3QgaW4ga25vd24sIHRlc3RzKSkKIAotICBmb3Igd2hpY2ggaW4gKHNlcnZlcl9hcmdzLCBjbGlfYXJncyk6Ci0gICAgd2hpY2guYXBwZW5kKCctLXRyYW5zcG9ydD0lcycgJSB0cmFuc3BvcnQpCi0gICAgd2hpY2guYXBwZW5kKCctLXBvcnQ9JWQnICUgcG9ydCkgIyBkZWZhdWx0IHRvIDkwOTAKLSAgICBpZiB1c2VfemxpYjoKLSAgICAgIHdoaWNoLmFwcGVuZCgnLS16bGliJykKLSAgICBpZiBzb2NrZXRfdHlwZSA9PSAnaXAtc3NsJzoKLSAgICAgIHdoaWNoLmFwcGVuZCgnLS1zc2wnKQotICAgIGVsaWYgc29ja2V0X3R5cGUgPT0gJ2RvbWFpbic6Ci0gICAgICB3aGljaC5hcHBlbmQoJy0tZG9tYWluLXNvY2tldD0vdG1wL1RocmlmdFRlc3QudGhyaWZ0JykKLSMgICAgaWYgb3B0aW9ucy52ZXJib3NlID09IDA6Ci0jICAgICAgd2hpY2guYXBwZW5kKCctcScpCi0jICAgIGlmIG9wdGlvbnMudmVyYm9zZSA9PSAyOgotIyAgICAgIHdoaWNoLmFwcGVuZCgnLXYnKQotICBpZiBzZXJ2ZXJfbGliID09ICdqYXZhJzoKLSAgICBzZXJ2ZXJfYXJncy5hcHBlbmQoJ1wiJykKLSAgaWYgY2xpZW50X2xpYiA9PSAnamF2YSc6Ci0gICAgY2xpX2FyZ3MuYXBwZW5kKCdcIicpCisgICAgZGlzcGF0Y2hlciA9IGNyb3NzcnVubmVyLlRlc3REaXNwYXRjaGVyKFRFU1RfRElSLCBST09UX0RJUiwgVEVTVF9ESVJfUkVMQVRJVkUsIGpvYnMpCisgICAgbG9nZ2VyLmRlYnVnKCdFeGVjdXRpbmcgJWQgdGVzdHMnICUgbGVuKHRlc3RzKSkKKyAgICB0cnk6CisgICAgICAgIGZvciByIGluIFtkaXNwYXRjaGVyLmRpc3BhdGNoKHRlc3QsIHJldHJ5X2NvdW50KSBmb3IgdGVzdCBpbiB0ZXN0c106CisgICAgICAgICAgICByLndhaXQoKQorICAgICAgICBsb2dnZXIuZGVidWcoJ1dhaXRpbmcgZm9yIGNvbXBsZXRpb24nKQorICAgICAgICByZXR1cm4gZGlzcGF0Y2hlci53YWl0KCkKKyAgICBleGNlcHQgKEtleWJvYXJkSW50ZXJydXB0LCBTeXN0ZW1FeGl0KToKKyAgICAgICAgbG9nZ2VyLmRlYnVnKCdJbnRlcnJ1cHRlZCwgc2h1dHRpbmcgZG93bicpCisgICAgICAgIGRpc3BhdGNoZXIudGVybWluYXRlKCkKKyAgICAgICAgcmV0dXJuIEZhbHNlCiAKLSAgc2VydmVyX2FyZ3MuZXh0ZW5kKHNlcnZlcl9leHRyYV9hcmdzKQotICBjbGlfYXJncy5leHRlbmQoY2xpZW50X2V4dHJhX2FyZ3MpCiAKLSAgc2VydmVyX2xvZz1vcGVuKHJlbGZpbGUoImxvZy8iICsgdGVzdF9uYW1lICsgIl9zZXJ2ZXIubG9nIiksImEiKQotICBjbGllbnRfbG9nPW9wZW4ocmVsZmlsZSgibG9nLyIgKyB0ZXN0X25hbWUgKyAiX2NsaWVudC5sb2ciKSwiYSIpCitkZWYgcnVuX2ZlYXR1cmVfdGVzdHMoc2VydmVyX21hdGNoLCBmZWF0dXJlX21hdGNoLCBqb2JzLCBza2lwX2tub3duX2ZhaWx1cmVzLCBvbmx5X2tub3duX2ZhaWx1cmVzLCByZXRyeV9jb3VudCwgcmVnZXgpOgorICAgIGJhc2VkaXIgPSBwYXRoX2pvaW4oUk9PVF9ESVIsIEZFQVRVUkVfRElSX1JFTEFUSVZFKQorICAgIGxvZ2dlciA9IG11bHRpcHJvY2Vzc2luZy5nZXRfbG9nZ2VyKCkKKyAgICBsb2dnZXIuZGVidWcoJ0NvbGxlY3RpbmcgdGVzdHMnKQorICAgIHdpdGggb3BlbihwYXRoX2pvaW4oVEVTVF9ESVIsIENPTkZJR19GSUxFKSwgJ3InKSBhcyBmcDoKKyAgICAgICAgaiA9IGpzb24ubG9hZChmcCkKKyAgICB3aXRoIG9wZW4ocGF0aF9qb2luKGJhc2VkaXIsIENPTkZJR19GSUxFKSwgJ3InKSBhcyBmcDoKKyAgICAgICAgajIgPSBqc29uLmxvYWQoZnApCisgICAgdGVzdHMgPSBjcm9zc3J1bm5lci5jb2xsZWN0X2ZlYXR1cmVfdGVzdHMoaiwgajIsIHNlcnZlcl9tYXRjaCwgZmVhdHVyZV9tYXRjaCwgcmVnZXgpCisgICAgaWYgbm90IHRlc3RzOgorICAgICAgICBwcmludCgnTm8gdGVzdCBmb3VuZCB0aGF0IG1hdGNoZXMgdGhlIGNyaXRlcmlhJywgZmlsZT1zeXMuc3RkZXJyKQorICAgICAgICBwcmludCgnICBzZXJ2ZXJzOiAlcycgJSBzZXJ2ZXJfbWF0Y2gsIGZpbGU9c3lzLnN0ZGVycikKKyAgICAgICAgcHJpbnQoJyAgZmVhdHVyZXM6ICVzJyAlIGZlYXR1cmVfbWF0Y2gsIGZpbGU9c3lzLnN0ZGVycikKKyAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgaWYgb25seV9rbm93bl9mYWlsdXJlczoKKyAgICAgICAgbG9nZ2VyLmRlYnVnKCdPbmx5IHJ1bm5pbmcga25vd24gZmFpbHVyZXMnKQorICAgICAgICBrbm93biA9IGNyb3NzcnVubmVyLmxvYWRfa25vd25fZmFpbHVyZXMoYmFzZWRpcikKKyAgICAgICAgdGVzdHMgPSBsaXN0KGZpbHRlcihsYW1iZGEgdDogY3Jvc3NydW5uZXIudGVzdF9uYW1lKCoqdCkgaW4ga25vd24sIHRlc3RzKSkKKyAgICBpZiBza2lwX2tub3duX2ZhaWx1cmVzOgorICAgICAgICBsb2dnZXIuZGVidWcoJ1NraXBwaW5nIGtub3duIGZhaWx1cmVzJykKKyAgICAgICAga25vd24gPSBjcm9zc3J1bm5lci5sb2FkX2tub3duX2ZhaWx1cmVzKGJhc2VkaXIpCisgICAgICAgIHRlc3RzID0gbGlzdChmaWx0ZXIobGFtYmRhIHQ6IGNyb3NzcnVubmVyLnRlc3RfbmFtZSgqKnQpIG5vdCBpbiBrbm93biwgdGVzdHMpKQogCi0gIHRyeToKLSAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAwOgotICAgICAgcHJpbnQgJ1Rlc3Rpbmcgc2VydmVyOiAlcycgJSAoJyAnLmpvaW4oc2VydmVyX2FyZ3MpKQotICAgICAgc2VydmVycHJvYyA9IHN1YnByb2Nlc3MuUG9wZW4oc2VydmVyX2FyZ3MsIHN0ZG91dD1zZXJ2ZXJfbG9nLCBzdGRlcnI9c2VydmVyX2xvZykKKyAgICBkaXNwYXRjaGVyID0gY3Jvc3NydW5uZXIuVGVzdERpc3BhdGNoZXIoVEVTVF9ESVIsIFJPT1RfRElSLCBGRUFUVVJFX0RJUl9SRUxBVElWRSwgam9icykKKyAgICBsb2dnZXIuZGVidWcoJ0V4ZWN1dGluZyAlZCB0ZXN0cycgJSBsZW4odGVzdHMpKQorICAgIHRyeToKKyAgICAgICAgZm9yIHIgaW4gW2Rpc3BhdGNoZXIuZGlzcGF0Y2godGVzdCwgcmV0cnlfY291bnQpIGZvciB0ZXN0IGluIHRlc3RzXToKKyAgICAgICAgICAgIHIud2FpdCgpCisgICAgICAgIGxvZ2dlci5kZWJ1ZygnV2FpdGluZyBmb3IgY29tcGxldGlvbicpCisgICAgICAgIHJldHVybiBkaXNwYXRjaGVyLndhaXQoKQorICAgIGV4Y2VwdCAoS2V5Ym9hcmRJbnRlcnJ1cHQsIFN5c3RlbUV4aXQpOgorICAgICAgICBsb2dnZXIuZGVidWcoJ0ludGVycnVwdGVkLCBzaHV0dGluZyBkb3duJykKKyAgICAgICAgZGlzcGF0Y2hlci50ZXJtaW5hdGUoKQorICAgICAgICByZXR1cm4gRmFsc2UKKworCitkZWYgZGVmYXVsdF9jb25jdXJyZW50eSgpOgorICAgIHRyeToKKyAgICAgICAgcmV0dXJuIGludChvcy5lbnZpcm9uLmdldCgnVEhSSUZUX0NST1NTVEVTVF9DT05DVVJSRU5DWScpKQorICAgIGV4Y2VwdCAoVHlwZUVycm9yLCBWYWx1ZUVycm9yKToKKyAgICAgICAgIyBTaW5jZSBtdWNoIHRpbWUgaXMgc3BlbnQgc2xlZXBpbmcsIHVzZSBtYW55IHRocmVhZHMKKyAgICAgICAgcmV0dXJuIGludChtdWx0aXByb2Nlc3NpbmcuY3B1X2NvdW50KCkgKiAxLjI1KSArIDEKKworCitkZWYgbWFpbihhcmd2KToKKyAgICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1zZXJ2ZXInLCBkZWZhdWx0PScnLCBuYXJncz0nKicsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdsaXN0IG9mIHNlcnZlcnMgdG8gdGVzdCcpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1jbGllbnQnLCBkZWZhdWx0PScnLCBuYXJncz0nKicsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdsaXN0IG9mIGNsaWVudHMgdG8gdGVzdCcpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLUYnLCAnLS1mZWF0dXJlcycsIG5hcmdzPScqJywgZGVmYXVsdD1Ob25lLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0ncnVuIHNlcnZlciBmZWF0dXJlIHRlc3RzIGluc3RlYWQgb2YgY3Jvc3MgbGFuZ3VhZ2UgdGVzdHMnKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy1SJywgJy0tcmVnZXgnLCBoZWxwPSd0ZXN0IG5hbWUgcGF0dGVybiB0byBydW4nKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy1vJywgJy0tb25seS1rbm93bl9mYWlsdXJlcycsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsIGRlc3Q9J29ubHlfa25vd25fZmFpbHVyZXMnLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nb25seSBleGVjdXRlIHRlc3RzIHRoYXQgYXJlIGtub3duIHRvIGZhaWwnKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy1zJywgJy0tc2tpcC1rbm93bi1mYWlsdXJlcycsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsIGRlc3Q9J3NraXBfa25vd25fZmFpbHVyZXMnLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nZG8gbm90IGV4ZWN1dGUgdGVzdHMgdGhhdCBhcmUga25vd24gdG8gZmFpbCcpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLXInLCAnLS1yZXRyeS1jb3VudCcsIHR5cGU9aW50LAorICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0wLCBoZWxwPSdtYXhpbXVtIHJldHJ5IG9uIGZhaWx1cmUnKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy1qJywgJy0tam9icycsIHR5cGU9aW50LAorICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD1kZWZhdWx0X2NvbmN1cnJlbnR5KCksCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdudW1iZXIgb2YgY29uY3VycmVudCB0ZXN0IGV4ZWN1dGlvbnMnKQorCisgICAgZyA9IHBhcnNlci5hZGRfYXJndW1lbnRfZ3JvdXAodGl0bGU9J0FkdmFuY2VkJykKKyAgICBnLmFkZF9hcmd1bWVudCgnLXYnLCAnLS12ZXJib3NlJywgYWN0aW9uPSdzdG9yZV9jb25zdCcsCisgICAgICAgICAgICAgICAgICAgZGVzdD0nbG9nX2xldmVsJywgY29uc3Q9bG9nZ2luZy5ERUJVRywgZGVmYXVsdD1sb2dnaW5nLldBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgaGVscD0nc2hvdyBkZWJ1ZyBvdXRwdXQgZm9yIHRlc3QgcnVubmVyJykKKyAgICBnLmFkZF9hcmd1bWVudCgnLVAnLCAnLS1wcmludC1leHBlY3RlZC1mYWlsdXJlcycsIGNob2ljZXM9WydtZXJnZScsICdvdmVyd3JpdGUnXSwKKyAgICAgICAgICAgICAgICAgICBkZXN0PSdwcmludF9mYWlsdXJlcycsCisgICAgICAgICAgICAgICAgICAgaGVscD0iZ2VuZXJhdGUgZXhwZWN0ZWQgZmFpbHVyZXMgYmFzZWQgb24gbGFzdCByZXN1bHQgYW5kIHByaW50IHRvIHN0ZG91dCIpCisgICAgZy5hZGRfYXJndW1lbnQoJy1VJywgJy0tdXBkYXRlLWV4cGVjdGVkLWZhaWx1cmVzJywgY2hvaWNlcz1bJ21lcmdlJywgJ292ZXJ3cml0ZSddLAorICAgICAgICAgICAgICAgICAgIGRlc3Q9J3VwZGF0ZV9mYWlsdXJlcycsCisgICAgICAgICAgICAgICAgICAgaGVscD0iZ2VuZXJhdGUgZXhwZWN0ZWQgZmFpbHVyZXMgYmFzZWQgb24gbGFzdCByZXN1bHQgYW5kIHNhdmUgdG8gZGVmYXVsdCBmaWxlIGxvY2F0aW9uIikKKyAgICBvcHRpb25zID0gcGFyc2VyLnBhcnNlX2FyZ3MoYXJndikKKworICAgIGxvZ2dlciA9IG11bHRpcHJvY2Vzc2luZy5sb2dfdG9fc3RkZXJyKCkKKyAgICBsb2dnZXIuc2V0TGV2ZWwob3B0aW9ucy5sb2dfbGV2ZWwpCisKKyAgICBpZiBvcHRpb25zLmZlYXR1cmVzIGlzIG5vdCBOb25lIGFuZCBvcHRpb25zLmNsaWVudDoKKyAgICAgICAgcHJpbnQoJ0Nhbm5vdCBzcGVjaWZ5IGJvdGggLS1mZWF0dXJlcyBhbmQgLS1jbGllbnQgJywgZmlsZT1zeXMuc3RkZXJyKQorICAgICAgICByZXR1cm4gMQorCisgICAgIyBBbGxvdyBtdWx0aXBsZSBhcmdzIHNlcGFyYXRlZCB3aXRoICcsJyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eQorICAgIHNlcnZlcl9tYXRjaCA9IGxpc3QoY2hhaW4oKlt4LnNwbGl0KCcsJykgZm9yIHggaW4gb3B0aW9ucy5zZXJ2ZXJdKSkKKyAgICBjbGllbnRfbWF0Y2ggPSBsaXN0KGNoYWluKCpbeC5zcGxpdCgnLCcpIGZvciB4IGluIG9wdGlvbnMuY2xpZW50XSkpCisKKyAgICBpZiBvcHRpb25zLnVwZGF0ZV9mYWlsdXJlcyBvciBvcHRpb25zLnByaW50X2ZhaWx1cmVzOgorICAgICAgICBkaXJlID0gcGF0aF9qb2luKFJPT1RfRElSLCBGRUFUVVJFX0RJUl9SRUxBVElWRSkgaWYgb3B0aW9ucy5mZWF0dXJlcyBpcyBub3QgTm9uZSBlbHNlIFRFU1RfRElSCisgICAgICAgIHJlcyA9IGNyb3NzcnVubmVyLmdlbmVyYXRlX2tub3duX2ZhaWx1cmVzKAorICAgICAgICAgICAgZGlyZSwgb3B0aW9ucy51cGRhdGVfZmFpbHVyZXMgPT0gJ292ZXJ3cml0ZScsCisgICAgICAgICAgICBvcHRpb25zLnVwZGF0ZV9mYWlsdXJlcywgb3B0aW9ucy5wcmludF9mYWlsdXJlcykKKyAgICBlbGlmIG9wdGlvbnMuZmVhdHVyZXMgaXMgbm90IE5vbmU6CisgICAgICAgIGZlYXR1cmVzID0gb3B0aW9ucy5mZWF0dXJlcyBvciBbJy4qJ10KKyAgICAgICAgcmVzID0gcnVuX2ZlYXR1cmVfdGVzdHMoc2VydmVyX21hdGNoLCBmZWF0dXJlcywgb3B0aW9ucy5qb2JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnNraXBfa25vd25fZmFpbHVyZXMsIG9wdGlvbnMub25seV9rbm93bl9mYWlsdXJlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5yZXRyeV9jb3VudCwgb3B0aW9ucy5yZWdleCkKICAgICBlbHNlOgotICAgICAgc2VydmVycHJvYyA9IHN1YnByb2Nlc3MuUG9wZW4oc2VydmVyX2FyZ3MsIHN0ZG91dD1zZXJ2ZXJfbG9nLCBzdGRlcnI9c2VydmVyX2xvZykKLSAgZXhjZXB0IE9TRXJyb3IgYXMgZToKLSAgICByZXR1cm4gIk9TIGVycm9yKHswfSk6IHsxfSIuZm9ybWF0KGUuZXJybm8sIGUuc3RyZXJyb3IpCisgICAgICAgIHJlcyA9IHJ1bl9jcm9zc190ZXN0cyhzZXJ2ZXJfbWF0Y2gsIGNsaWVudF9tYXRjaCwgb3B0aW9ucy5qb2JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5za2lwX2tub3duX2ZhaWx1cmVzLCBvcHRpb25zLm9ubHlfa25vd25fZmFpbHVyZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnJldHJ5X2NvdW50LCBvcHRpb25zLnJlZ2V4KQorICAgIHJldHVybiAwIGlmIHJlcyBlbHNlIDEKIAotICBkZWYgZW5zdXJlU2VydmVyQWxpdmUoKToKLSAgICBpZiBzZXJ2ZXJwcm9jLnBvbGwoKSBpcyBub3QgTm9uZToKLSAgICAgIHJldHVybiAnU2VydmVyIHN1YnByb2Nlc3MgZGllZCwgYXJnczogJXMnICUgKCcgJy5qb2luKHNlcnZlcl9hcmdzKSkKIAotICAjIFdhaXQgZm9yIHRoZSBzZXJ2ZXIgdG8gc3RhcnQgYWNjZXB0aW5nIGNvbm5lY3Rpb25zIG9uIHRoZSBnaXZlbiBwb3J0LgotICBzb2NrID0gc29ja2V0LnNvY2tldCgpCi0gIHNsZWVwX3RpbWUgPSAwLjEgICMgU2Vjb25kcwotICBtYXhfYXR0ZW1wdHMgPSAxMDAKLSAgdHJ5OgotICAgIGF0dGVtcHQgPSAwCi0KLSAgICBpZiBzb2NrZXRfdHlwZSAhPSAnZG9tYWluJzoKLSAgICAgIHdoaWxlIHNvY2suY29ubmVjdF9leCgoJzEyNy4wLjAuMScsIHBvcnQpKSAhPSAwOgotICAgICAgICBhdHRlbXB0ICs9IDEKLSAgICAgICAgaWYgYXR0ZW1wdCA+PSBtYXhfYXR0ZW1wdHM6Ci0gICAgICAgICAgcmV0dXJuICJUZXN0U2VydmVyIG5vdCByZWFkeSBvbiBwb3J0ICVkIGFmdGVyICUuMmYgc2Vjb25kcyIgJSAocG9ydCwgc2xlZXBfdGltZSAqIGF0dGVtcHQpCi0gICAgICAgIGVuc3VyZVNlcnZlckFsaXZlKCkKLSAgICAgICAgdGltZS5zbGVlcChzbGVlcF90aW1lKQotICBmaW5hbGx5OgotICAgIHNvY2suY2xvc2UoKQotCi0gIHRyeToKLSAgICBvID0gW10KLSAgICBkZWYgdGFyZ2V0KCk6Ci0gICAgICB0cnk6Ci0gICAgICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDA6Ci0gICAgICAgICAgcHJpbnQgJ1Rlc3RpbmcgY2xpZW50OiAlcycgJSAoJyAnLmpvaW4oY2xpX2FyZ3MpKQotICAgICAgICAgIHByb2Nlc3MgPSBzdWJwcm9jZXNzLlBvcGVuKGNsaV9hcmdzLCBzdGRvdXQ9Y2xpZW50X2xvZywgc3RkZXJyPWNsaWVudF9sb2cpCi0gICAgICAgICAgby5hcHBlbmQocHJvY2VzcykKLSAgICAgICAgICBwcm9jZXNzLmNvbW11bmljYXRlKCkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICBwcm9jZXNzID0gc3VicHJvY2Vzcy5Qb3BlbihjbGlfYXJncywgc3Rkb3V0PWNsaWVudF9sb2csIHN0ZGVycj1jbGllbnRfbG9nKQotICAgICAgICAgIG8uYXBwZW5kKHByb2Nlc3MpCi0gICAgICAgICAgcHJvY2Vzcy5jb21tdW5pY2F0ZSgpCi0gICAgICBleGNlcHQgT1NFcnJvciBhcyBlOgotICAgICAgICByZXR1cm4gIk9TIGVycm9yKHswfSk6IHsxfSIuZm9ybWF0KGUuZXJybm8sIGUuc3RyZXJyb3IpCi0gICAgICBleGNlcHQ6Ci0gICAgICAgIHJldHVybiAiVW5leHBlY3RlZCBlcnJvcjoiLCBzeXMuZXhjX2luZm8oKVswXQotICAgIHRocmVhZCA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PXRhcmdldCkKLSAgICB0aHJlYWQuc3RhcnQoKQotCi0gICAgdGhyZWFkLmpvaW4oMTApCi0gICAgaWYgdGhyZWFkLmlzX2FsaXZlKCk6Ci0gICAgICBwcmludCAnVGVybWluYXRpbmcgcHJvY2VzcycKLSAgICAgIG9bMF0udGVybWluYXRlKCkKLSAgICAgIHRocmVhZC5qb2luKCkKLSAgICBpZihsZW4obyk9PTApOgotICAgICAgcmV0dXJuICJDbGllbnQgc3VicHJvY2VzcyBmYWlsZWQsIGFyZ3M6ICVzIiAlICgnICcuam9pbihjbGlfYXJncykpCi0gICAgcmV0ID0gb1swXS5yZXR1cm5jb2RlCi0gICAgaWYgcmV0ICE9IDA6Ci0gICAgICByZXR1cm4gIkNsaWVudCBzdWJwcm9jZXNzIGZhaWxlZCwgcmV0Y29kZT0lZCwgYXJnczogJXMiICUgKHJldCwgJyAnLmpvaW4oY2xpX2FyZ3MpKQotICAgICAgI3JhaXNlIEV4Y2VwdGlvbigiQ2xpZW50IHN1YnByb2Nlc3MgZmFpbGVkLCByZXRjb2RlPSVkLCBhcmdzOiAlcyIgJSAocmV0LCAnICcuam9pbihjbGlfYXJncykpKQotICBmaW5hbGx5OgotICAgICMgY2hlY2sgdGhhdCBzZXJ2ZXIgZGlkbid0IGRpZQotICAgICNlbnN1cmVTZXJ2ZXJBbGl2ZSgpCi0gICAgZXh0cmFfc2xlZXAgPSAwCi0gICAgaWYgZXh0cmFfc2xlZXAgPiAwIGFuZCBvcHRpb25zLnZlcmJvc2UgPiAwOgotICAgICAgcHJpbnQgKCdHaXZpbmcgKHByb3RvY29sPSVzLHpsaWI9JXMsc3NsPSVzKSBhbiBleHRyYSAlZCBzZWNvbmRzIGZvciBjaGlsZCcKLSAgICAgICAgICAgICAncHJvY2Vzc2VzIHRvIHRlcm1pbmF0ZSB2aWEgYWxhcm0nCi0gICAgICAgICAgICAgJSAocHJvdG9jb2wsIHVzZV96bGliLCB1c2Vfc3NsLCBleHRyYV9zbGVlcCkpCi0gICAgICB0aW1lLnNsZWVwKGV4dHJhX3NsZWVwKQotICAgIG9zLmtpbGwoc2VydmVycHJvYy5waWQsIHNpZ25hbC5TSUdURVJNKQotICAgICNzZXJ2ZXJwcm9jLndhaXQoKQotICBjbGllbnRfbG9nLmZsdXNoKCkKLSAgc2VydmVyX2xvZy5mbHVzaCgpCi0gIGNsaWVudF9sb2cuY2xvc2UoKQotICBzZXJ2ZXJfbG9nLmNsb3NlKCkKLQotdGVzdF9jb3VudCA9IDAKLWZhaWxlZCA9IDAKLWhhcmRfZmFpbF9jb3VudCA9IDAKLXBsYXRmb3JtID0gcGxhdGZvcm0uc3lzdGVtKCkKLWlmIG9zLnBhdGguZXhpc3RzKHJlbGZpbGUoJ2xvZycpKTogc2h1dGlsLnJtdHJlZShyZWxmaWxlKCdsb2cnKSkKLW9zLm1ha2VkaXJzKHJlbGZpbGUoJ2xvZycpKQotaWYgb3MucGF0aC5leGlzdHMocmVsZmlsZSgncmVzdWx0cy5qc29uJykpOiBvcy5yZW1vdmUocmVsZmlsZSgncmVzdWx0cy5qc29uJykpCi1yZXN1bHRzX2pzb24gPSBvcGVuKHJlbGZpbGUoInJlc3VsdHMuanNvbiIpLCJhIikKLXJlc3VsdHNfanNvbi53cml0ZSgiW1xuIikKLQotd2l0aCBvcGVuKHJlbGZpbGUoJ3Rlc3RzLmpzb24nKSkgYXMgZGF0YV9maWxlOgotICAgIGRhdGEgPSBqc29uLmxvYWQoZGF0YV9maWxlKQotCi0jc3VicHJvY2Vzcy5jYWxsKCJleHBvcnQgTk9ERV9QQVRIPS4uL2xpYi9ub2RlanMvdGVzdDouLi9saWIvbm9kZWpzL2xpYjoke05PREVfUEFUSH0iKQotY291bnQgPSAwCi1mb3Igc2VydmVyIGluIGRhdGFbInNlcnZlciJdOgotICBpZiAoc2VydmVyWyJsaWIiXSBpbiBzZXJ2ZXJzTGlzdCBvciBsZW4oc2VydmVyc0xpc3QpID09IDApIGFuZCBwbGF0Zm9ybSBpbiBzZXJ2ZXJbInBsYXRmb3JtIl06Ci0gICAgc2VydmVyX2V4ZWN1dGFibGUgPSBzZXJ2ZXJbImV4ZWN1dGFibGUiXQotICAgIHNlcnZlcl9leHRyYV9hcmdzID0gIiIKLSAgICBzZXJ2ZXJfbGliID0gc2VydmVyWyJsaWIiXQotICAgIGlmICJleHRyYV9hcmdzIiBpbiBzZXJ2ZXI6Ci0gICAgICBzZXJ2ZXJfZXh0cmFfYXJncyA9IHNlcnZlclsiZXh0cmFfYXJncyJdCi0gICAgZm9yIHByb3RvY29sIGluIHNlcnZlclsicHJvdG9jb2xzIl06Ci0gICAgICBmb3IgdHJhbnNwb3J0IGluIHNlcnZlclsidHJhbnNwb3J0cyJdOgotICAgICAgICBmb3Igc29jayBpbiBzZXJ2ZXJbInNvY2tldHMiXToKLSAgICAgICAgICBmb3IgY2xpZW50IGluIGRhdGFbImNsaWVudCJdOgotICAgICAgICAgICAgaWYgKGNsaWVudFsibGliIl0gaW4gY2xpZW50c0xpc3Qgb3IgbGVuKGNsaWVudHNMaXN0KSA9PSAwKSBhbmQgcGxhdGZvcm0gaW4gY2xpZW50WyJwbGF0Zm9ybSJdOgotICAgICAgICAgICAgICBjbGllbnRfZXhlY3V0YWJsZSA9IGNsaWVudFsiZXhlY3V0YWJsZSJdCi0gICAgICAgICAgICAgIGNsaWVudF9leHRyYV9hcmdzID0gIiIKLSAgICAgICAgICAgICAgY2xpZW50X2xpYiA9IGNsaWVudFsibGliIl0KLSAgICAgICAgICAgICAgaWYgImV4dHJhX2FyZ3MiIGluIGNsaWVudDoKLSAgICAgICAgICAgICAgICBjbGllbnRfZXh0cmFfYXJncyA9IGNsaWVudFsiZXh0cmFfYXJncyJdCi0gICAgICAgICAgICAgIGlmIHByb3RvY29sIGluIGNsaWVudFsicHJvdG9jb2xzIl06Ci0gICAgICAgICAgICAgICAgaWYgdHJhbnNwb3J0IGluIGNsaWVudFsidHJhbnNwb3J0cyJdOgotICAgICAgICAgICAgICAgICAgaWYgc29jayBpbiBjbGllbnRbInNvY2tldHMiXToKLSAgICAgICAgICAgICAgICAgICAgaWYgY291bnQgIT0gMDoKLSAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzX2pzb24ud3JpdGUoIixcbiIpCi0gICAgICAgICAgICAgICAgICAgIGNvdW50ID0gMQotICAgICAgICAgICAgICAgICAgICByZXN1bHRzX2pzb24ud3JpdGUoIlx0W1xuXHRcdFwiIiArIHNlcnZlcl9saWIgKyAiXCIsXG5cdFx0XCIiICsgY2xpZW50X2xpYiArICJcIixcblx0XHRcIiIgKyBwcm90b2NvbCArICJcIixcblx0XHRcIiIgKyB0cmFuc3BvcnQgKyAiLSIgKyBzb2NrICsgIlwiLFxuIiApCi0gICAgICAgICAgICAgICAgICAgIHRlc3RfbmFtZSA9IHNlcnZlcl9saWIgKyAiXyIgKyBjbGllbnRfbGliICsgIl8iICsgcHJvdG9jb2wgKyAiXyIgKyB0cmFuc3BvcnQgKyAiXyIgKyBzb2NrCi0gICAgICAgICAgICAgICAgICAgIHJldCA9IHJ1blNlcnZpY2VUZXN0KHRlc3RfbmFtZSwgc2VydmVyX2xpYiwgc2VydmVyX2V4ZWN1dGFibGUsIHNlcnZlcl9leHRyYV9hcmdzLCBjbGllbnRfbGliLCBjbGllbnRfZXhlY3V0YWJsZSwgY2xpZW50X2V4dHJhX2FyZ3MsIHByb3RvY29sLCBwcm90b2NvbCwgdHJhbnNwb3J0LCBvcHRpb25zLnBvcnQsIDAsIHNvY2spCi0gICAgICAgICAgICAgICAgICAgIGlmIHJldCAhPSBOb25lOgotICAgICAgICAgICAgICAgICAgICAgIGZhaWxlZCArPSAxCi0gICAgICAgICAgICAgICAgICAgICAgaWYgY2xpZW50WyJleGl0Il0gPT0gImhhcmQiIGFuZCBzZXJ2ZXJbImV4aXQiXSA9PSAiaGFyZCI6Ci0gICAgICAgICAgICAgICAgICAgICAgICBoYXJkX2ZhaWxfY291bnQgKz0xCi0gICAgICAgICAgICAgICAgICAgICAgcHJpbnQgIkVycm9yOiAlcyIgJSByZXQKLSAgICAgICAgICAgICAgICAgICAgICBwcmludCAiVXNpbmciCi0gICAgICAgICAgICAgICAgICAgICAgcHJpbnQgKCcgU2VydmVyOiAlcyAtLXByb3RvY29sPSVzIC0tdHJhbnNwb3J0PSVzICVzICVzJwotICAgICAgICAgICAgICAgICAgICAgICAgJSAoc2VydmVyX2V4ZWN1dGFibGUsIHByb3RvY29sLCB0cmFuc3BvcnQsIGdldFNvY2tldEFyZ3Moc29jayksICcgJy5qb2luKHNlcnZlcl9leHRyYV9hcmdzKSkpCi0gICAgICAgICAgICAgICAgICAgICAgcHJpbnQgKCcgQ2xpZW50OiAlcyAtLXByb3RvY29sPSVzIC0tdHJhbnNwb3J0PSVzICVzICVzJwotICAgICAgICAgICAgICAgICAgICAgICAgJSAoY2xpZW50X2V4ZWN1dGFibGUsIHByb3RvY29sLCB0cmFuc3BvcnQsIGdldFNvY2tldEFyZ3Moc29jayksICcnLmpvaW4oY2xpZW50X2V4dHJhX2FyZ3MpKSkKLSAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzX2pzb24ud3JpdGUoIlx0XHRcImZhaWx1cmVcIixcbiIpCi0gICAgICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgICAgcmVzdWx0c19qc29uLndyaXRlKCJcdFx0XCJzdWNjZXNzXCIsXG4iKQotICAgICAgICAgICAgICAgICAgICByZXN1bHRzX2pzb24ud3JpdGUoIlx0XHR7XG5cdFx0XHRcIkNsaWVudFwiOlwibG9nLyIgKyB0ZXN0X25hbWUgKyAiX2NsaWVudC5sb2dcIixcblx0XHRcdFwiU2VydmVyXCI6XCJsb2cvIiArIHRlc3RfbmFtZSArICJfc2VydmVyLmxvZ1wiXG5cdFx0fVxuXHRdIikKLSAgICAgICAgICAgICAgICAgICAgdGVzdF9jb3VudCArPSAxCi0gICAgICAgICAgICAgIGlmIHByb3RvY29sID09ICdiaW5hcnknIGFuZCAnYWNjZWwnIGluIGNsaWVudFsicHJvdG9jb2xzIl06Ci0gICAgICAgICAgICAgICAgaWYgdHJhbnNwb3J0IGluIGNsaWVudFsidHJhbnNwb3J0cyJdOgotICAgICAgICAgICAgICAgICAgaWYgc29jayBpbiBjbGllbnRbInNvY2tldHMiXToKLSAgICAgICAgICAgICAgICAgICAgaWYgY291bnQgIT0gMDoKLSAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzX2pzb24ud3JpdGUoIixcbiIpCi0gICAgICAgICAgICAgICAgICAgIGNvdW50ID0gMQotICAgICAgICAgICAgICAgICAgICByZXN1bHRzX2pzb24ud3JpdGUoIlx0W1xuXHRcdFwiIiArIHNlcnZlcl9saWIgKyAiXCIsXG5cdFx0XCIiICsgY2xpZW50X2xpYiArICJcIixcblx0XHRcImFjY2VsLWJpbmFyeVwiLFxuXHRcdFwiIiArIHRyYW5zcG9ydCArICItIiArIHNvY2sgKyAiXCIsXG4iICkKLSAgICAgICAgICAgICAgICAgICAgdGVzdF9uYW1lID0gc2VydmVyX2xpYiArICJfIiArIGNsaWVudF9saWIgKyAiX2FjY2VsLWJpbmFyeV8iICsgdHJhbnNwb3J0ICsgIl8iICsgc29jawotICAgICAgICAgICAgICAgICAgICByZXQgPSBydW5TZXJ2aWNlVGVzdCh0ZXN0X25hbWUsIHNlcnZlcl9saWIsc2VydmVyX2V4ZWN1dGFibGUsIHNlcnZlcl9leHRyYV9hcmdzLCBjbGllbnRfbGliLCBjbGllbnRfZXhlY3V0YWJsZSwgY2xpZW50X2V4dHJhX2FyZ3MsIHByb3RvY29sLCAnYWNjZWwnLCB0cmFuc3BvcnQsIG9wdGlvbnMucG9ydCwgMCwgc29jaykKLQotICAgICAgICAgICAgICAgICAgICBpZiByZXQgIT0gTm9uZToKLSAgICAgICAgICAgICAgICAgICAgICBmYWlsZWQgKz0gMQotICAgICAgICAgICAgICAgICAgICAgIGlmIGNsaWVudFsiZXhpdCJdID09ICJoYXJkIiBhbmQgc2VydmVyWyJleGl0Il0gPT0gImhhcmQiOgotICAgICAgICAgICAgICAgICAgICAgICAgaGFyZF9mYWlsX2NvdW50ICs9MQotICAgICAgICAgICAgICAgICAgICAgIHByaW50ICJFcnJvcjogJXMiICUgcmV0Ci0gICAgICAgICAgICAgICAgICAgICAgcHJpbnQgIlVzaW5nIgotICAgICAgICAgICAgICAgICAgICAgIHByaW50ICgnIFNlcnZlcjogJXMgLS1wcm90b2NvbD0lcyAtLXRyYW5zcG9ydD0lcyAlcyAlcycKLSAgICAgICAgICAgICAgICAgICAgICAgICUgKHNlcnZlcl9leGVjdXRhYmxlLCBwcm90b2NvbCwgdHJhbnNwb3J0LCBnZXRTb2NrZXRBcmdzKHNvY2spLCAnICcuam9pbihzZXJ2ZXJfZXh0cmFfYXJncykpKQotICAgICAgICAgICAgICAgICAgICAgIHByaW50ICgnIENsaWVudDogJXMgLS1wcm90b2NvbD0lcyAtLXRyYW5zcG9ydD0lcyAlcyAlcycKLSAgICAgICAgICAgICAgICAgICAgICAgICUgKGNsaWVudF9leGVjdXRhYmxlLCBwcm90b2NvbCwgdHJhbnNwb3J0ICwgZ2V0U29ja2V0QXJncyhzb2NrKSwgJycuam9pbihjbGllbnRfZXh0cmFfYXJncykpKQotICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHNfanNvbi53cml0ZSgiXHRcdFwiZmFpbHVyZVwiLFxuIikKLSAgICAgICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzX2pzb24ud3JpdGUoIlx0XHRcInN1Y2Nlc3NcIixcbiIpCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdHNfanNvbi53cml0ZSgiXHRcdHtcblx0XHRcdFwiQ2xpZW50XCI6XCJsb2cvIiArIHRlc3RfbmFtZSArICJfY2xpZW50LmxvZ1wiLFxuXHRcdFx0XCJTZXJ2ZXJcIjpcImxvZy8iICsgdGVzdF9uYW1lICsgIl9zZXJ2ZXIubG9nXCJcblx0XHR9XG5cdF0iKQotICAgICAgICAgICAgICAgICAgICB0ZXN0X2NvdW50ICs9IDEKLSAgICAgICAgICAgICAgaWYgcHJvdG9jb2wgPT0gJ2FjY2VsJyBhbmQgJ2JpbmFyeScgaW4gY2xpZW50WyJwcm90b2NvbHMiXToKLSAgICAgICAgICAgICAgICBpZiB0cmFuc3BvcnQgaW4gY2xpZW50WyJ0cmFuc3BvcnRzIl06Ci0gICAgICAgICAgICAgICAgICBpZiBzb2NrIGluIGNsaWVudFsic29ja2V0cyJdOgotICAgICAgICAgICAgICAgICAgICBpZiBjb3VudCAhPSAwOgotICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHNfanNvbi53cml0ZSgiLFxuIikKLSAgICAgICAgICAgICAgICAgICAgY291bnQgPSAxCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdHNfanNvbi53cml0ZSgiXHRbXG5cdFx0XCIiICsgc2VydmVyX2xpYiArICJcIixcblx0XHRcIiIgKyBjbGllbnRfbGliICsgIlwiLFxuXHRcdFwiYmluYXJ5LWFjY2VsXCIsXG5cdFx0XCIiICsgdHJhbnNwb3J0ICsgIi0iICsgc29jayArICJcIixcbiIgKQotICAgICAgICAgICAgICAgICAgICB0ZXN0X25hbWUgPSBzZXJ2ZXJfbGliICsgIl8iICsgY2xpZW50X2xpYiArICJfYmluYXJ5LWFjY2VsXyIgKyB0cmFuc3BvcnQgKyAiXyIgKyBzb2NrCi0gICAgICAgICAgICAgICAgICAgIHJldCA9IHJ1blNlcnZpY2VUZXN0KHRlc3RfbmFtZSwgc2VydmVyX2xpYixzZXJ2ZXJfZXhlY3V0YWJsZSwgc2VydmVyX2V4dHJhX2FyZ3MsIGNsaWVudF9saWIsIGNsaWVudF9leGVjdXRhYmxlLCBjbGllbnRfZXh0cmFfYXJncywgcHJvdG9jb2wsICdiaW5hcnknLCB0cmFuc3BvcnQsIG9wdGlvbnMucG9ydCwgMCwgc29jaykKLSAgICAgICAgICAgICAgICAgICAgaWYgcmV0ICE9IE5vbmU6Ci0gICAgICAgICAgICAgICAgICAgICAgZmFpbGVkICs9IDEKLSAgICAgICAgICAgICAgICAgICAgICBpZiBjbGllbnRbImV4aXQiXSA9PSAiaGFyZCIgYW5kIHNlcnZlclsiZXhpdCJdID09ICJoYXJkIjoKLSAgICAgICAgICAgICAgICAgICAgICAgIGhhcmRfZmFpbF9jb3VudCArPTEKLSAgICAgICAgICAgICAgICAgICAgICBwcmludCAiRXJyb3I6ICVzIiAlIHJldAotICAgICAgICAgICAgICAgICAgICAgIHByaW50ICJVc2luZyIKLSAgICAgICAgICAgICAgICAgICAgICBwcmludCAoJyBTZXJ2ZXI6ICVzIC0tcHJvdG9jb2w9JXMgLS10cmFuc3BvcnQ9JXMgJXMgJXMnCi0gICAgICAgICAgICAgICAgICAgICAgICAlIChzZXJ2ZXJfZXhlY3V0YWJsZSwgcHJvdG9jb2wsIHRyYW5zcG9ydCArIHNvY2ssIGdldFNvY2tldEFyZ3Moc29jayksICcgJy5qb2luKHNlcnZlcl9leHRyYV9hcmdzKSkpCi0gICAgICAgICAgICAgICAgICAgICAgcHJpbnQgKCcgQ2xpZW50OiAlcyAtLXByb3RvY29sPSVzIC0tdHJhbnNwb3J0PSVzICVzICVzJwotICAgICAgICAgICAgICAgICAgICAgICAgJSAoY2xpZW50X2V4ZWN1dGFibGUsIHByb3RvY29sLCB0cmFuc3BvcnQgKyBzb2NrLCBnZXRTb2NrZXRBcmdzKHNvY2spLCAnJy5qb2luKGNsaWVudF9leHRyYV9hcmdzKSkpCi0gICAgICAgICAgICAgICAgICAgICAgcmVzdWx0c19qc29uLndyaXRlKCJcdFx0XCJmYWlsdXJlXCIsXG4iKQotICAgICAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHNfanNvbi53cml0ZSgiXHRcdFwic3VjY2Vzc1wiLFxuIikKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0c19qc29uLndyaXRlKCJcdFx0e1xuXHRcdFx0XCJDbGllbnRcIjpcImxvZy8iICsgdGVzdF9uYW1lICsgIl9jbGllbnQubG9nXCIsXG5cdFx0XHRcIlNlcnZlclwiOlwibG9nLyIgKyB0ZXN0X25hbWUgKyAiX3NlcnZlci5sb2dcIlxuXHRcdH1cblx0XSIpCi0gICAgICAgICAgICAgICAgICAgIHRlc3RfY291bnQgKz0gMQotcmVzdWx0c19qc29uLndyaXRlKCJcbl0iKQotcmVzdWx0c19qc29uLmZsdXNoKCkKLXJlc3VsdHNfanNvbi5jbG9zZSgpCi1wcmludCAnJXMgZmFpbGVkIG9mICVzIHRlc3RzIGluIHRvdGFsJyAlIChmYWlsZWQsIHRlc3RfY291bnQpCi1zeXMuZXhpdChoYXJkX2ZhaWxfY291bnQpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQoraWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBzeXMuZXhpdChtYWluKHN5cy5hcmd2WzE6XSkpCmRpZmYgLS1naXQgYS90ZXN0L3Rlc3Quc2ggYi90ZXN0L3Rlc3Quc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVkYjIyMzcuLjAwMDAwMDAKLS0tIGEvdGVzdC90ZXN0LnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTM5OSArMCwwIEBACi0jIS9iaW4vc2gKLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi0jIEFwYWNoZSBUaHJpZnQgLSBpbnRlZ3JhdGlvbiB0ZXN0IHN1aXRlCi0jCi0jIHRlc3RzIGRpZmZlcmVudCBjbGllbnQtc2VydmVyLCBwcm90b2NvbCBhbmQgdHJhbnNwb3J0IGNvbWJpbmF0aW9ucwotCi0jIHJlbGF0ZWQgaXNzdWVzOgotIyBUSFJJRlQtODQ3IFRlc3QgRnJhbWV3b3JrIGhhcm1vbml6YXRpb24gYWNyb3NzIGFsbCBsYW5ndWFnZXMKLSMgVEhSSUZULTgxOSBhZGQgRW51bWVyYXRpb24gZm9yIHByb3RvY29sLCB0cmFuc3BvcnQgYW5kIHNlcnZlciB0eXBlcwotCi1TVEFSVF9USU1FPSRTRUNPTkRTCi1jZCAiJCggZGlybmFtZSAiJDAiICkiCi1CQVNFRElSPSQocHdkKQotCi1URVNUQ09VTlQ9MAotRkFJTEVEPTAKLQotcHJpbnRfaGVhZGVyKCkgewotICBwcmludGYgIiUtMTZzICUtMTNzICUtMTdzICUtc1xuIiAiY2xpZW50LXNlcnZlcjoiICJwcm90b2NvbDoiICJ0cmFuc3BvcnQ6IiAicmVzdWx0OiIKLX0KLQotU1RBVFVTX0hUTUw9InN0YXR1cy5odG1sIgotCi1wcmludF9odG1sX2hlYWRlcigpIHsKLWNhdCA8PCBFT0YgPiAkU1RBVFVTX0hUTUwKLTwhRE9DVFlQRSBIVE1MPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGNoYXJzZXQ9InV0Zi04Ij4KLTx0aXRsZT5BcGFjaGUgVGhyaWZ0IC0gaW50ZWdyYXRpb24gdGVzdCBzdWl0ZTwvdGl0bGU+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJodHRwOi8vY2RuLmRhdGF0YWJsZXMubmV0LzEuMTAuMC9jc3MvanF1ZXJ5LmRhdGFUYWJsZXMuY3NzIj4KLTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCIgc3JjPSJodHRwOi8vY29kZS5qcXVlcnkuY29tL2pxdWVyeS0xLjEwLjIubWluLmpzIj48L3NjcmlwdD4KLTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCIgc3JjPSJodHRwOi8vY2RuLmRhdGF0YWJsZXMubmV0LzEuMTAuMC9qcy9qcXVlcnkuZGF0YVRhYmxlcy5qcyI+PC9zY3JpcHQ+Ci08c2NyaXB0PgotICB2YXIgdGVzdF9kYXRhOwotICBcJChkb2N1bWVudCkucmVhZHkoIGZ1bmN0aW9uICgpIHsKLSAgICB0ZXN0VGFibGUgPSBcJCgnI3Rlc3RfcmVzdWx0cycpLkRhdGFUYWJsZSggewotICAgICAgZGF0YTogdGVzdF9kYXRhCi0gICAgfSk7Ci0gIFwkKCcjdGVzdF9yZXN1bHRzX2ZpbHRlciBsYWJlbCBpbnB1dCcpCi0gICAgLmZvY3VzKCkKLSAgICAudmFsKCdmYWlsdXJlJyk7Ci0gIH0pOwotPC9zY3JpcHQ+Ci08L2hlYWQ+Ci08Ym9keT4KLTxoMj5BcGFjaGUgVGhyaWZ0IC0gaW50ZWdyYXRpb24gdGVzdCBzdWl0ZTogUmVzdWx0czwvaDI+Ci08dGFibGUgaWQ9InRlc3RfcmVzdWx0cyIgY2xhc3M9ImRpc3BsYXkiPgotICAgIDx0aGVhZD4KLSAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRoPlNlcnZlcjwvdGg+Ci0gICAgICAgICAgICA8dGg+Q2xpZW50PC90aD4KLSAgICAgICAgICAgIDx0aD5Qcm90b2NvbDwvdGg+Ci0gICAgICAgICAgICA8dGg+VHJhbnNwb3J0PC90aD4KLSAgICAgICAgICAgIDx0aD5SZXN1bHQgKGxvZyk8L3RoPgotICAgICAgICA8L3RyPgotICAgIDwvdGhlYWQ+Ci08L3RhYmxlPgotPHNjcmlwdD4KLXRlc3RfZGF0YSA9IFsKLUVPRgotfQotCi1wcmludF9odG1sX2Zvb3RlcigpIHsKLWR1cmF0aW9uPSQxCi1jYXQgPDwgRU9GID4+ICRTVEFUVVNfSFRNTAotXQotPC9zY3JpcHQ+Ci08aDI+VGVzdCBJbmZvcm1hdGlvbjwvaDI+Ci08cHJlPgotVGVzdCBEYXRlOiAgICAgYGRhdGUgLS1pc28tODYwMT1zZWNvbmRzYAotUmV2aXNpb246ICAgICAgYGdpdCByZXYtcGFyc2UgLS1zaG9ydCBIRUFEYAotT1M6ICAgICAgICAgICAgYHVuYW1lIC1hYAotVGVzdCBkdXJhdGlvbjogJGR1cmF0aW9uCi08L3ByZT4KLTwvYm9keT4KLTwvaHRtbD4KLUVPRgotfQotCi1pbnRlcnNlY3Rpb24oKSB7Ci0gIHJldHVybl92YWx1ZT0iIgotICBmb3Igb25lIGluICQxOyBkbwotICAgIGZvciB0d28gaW4gJDI7IGRvCi0gICAgICBpZiBbICR7b25lfSA9ICR7dHdvfSBdOyB0aGVuCi0gICAgICAgIHJldHVybl92YWx1ZT0ke3JldHVybl92YWx1ZX0iICIke29uZX0KLSAgICAgIGZpCi0gICAgZG9uZTsKLSAgZG9uZTsKLSAgZWNobyAke3JldHVybl92YWx1ZX07Ci19Ci0KLWRvX3Rlc3QgKCkgewotICAgIGNsaWVudF9zZXJ2ZXI9JDEKLSAgICBwcm90b2NvbD0kMgotICAgIHRyYW5zcG9ydD0kMwotICAgIGNsaWVudF9leGVjPSQ0Ci0gICAgc2VydmVyX2V4ZWM9JDUKLSAgICBjbGllbnRfdGltZW91dD0kNgotICAgIHNlcnZlcl9zdGFydHVwX3RpbWU9JDcKLQotICAgIHRlc3RuYW1lPSR7Y2xpZW50X3NlcnZlcn1fJHtwcm90b2NvbH1fJHt0cmFuc3BvcnR9Ci0gICAgc2VydmVyX3RpbWVvdXQ9JChlY2hvICIoJHtzZXJ2ZXJfc3RhcnR1cF90aW1lfSske2NsaWVudF90aW1lb3V0fSkiIHwgYmMpCi0gICAgcHJpbnRmICIlLTE2cyAlLTEzcyAlLTE3cyIgJHtjbGllbnRfc2VydmVyfSAke3Byb3RvY29sfSAke3RyYW5zcG9ydH0KLQotICAgIHRpbWVvdXQgJHNlcnZlcl90aW1lb3V0ICRzZXJ2ZXJfZXhlYyA+IGxvZy8ke3Rlc3RuYW1lfV9zZXJ2ZXIubG9nIDI+JjEgJgotICAgIHNlcnZlcl9waWQ9JCEKLQotICAgIHNsZWVwICRzZXJ2ZXJfc3RhcnR1cF90aW1lCi0gICAgdGltZW91dCAkY2xpZW50X3RpbWVvdXQgJGNsaWVudF9leGVjID4gbG9nLyR7dGVzdG5hbWV9X2NsaWVudC5sb2cgMj4mMQotCi0gICAgaWYgWyAiJD8iIC1lcSAiMCIgXTsgdGhlbgotICAgICAgcmVzdWx0PSJzdWNjZXNzKCQ/KSIKLSAgICAgIGVjaG8gIiAkcmVzdWx0IgotICAgIGVsc2UKLSAgICAgIHJlc3VsdD0iZmFpbHVyZSgkPykiCi0gICAgICBlY2hvICIgJHJlc3VsdCIKLSAgICAgICMgYWRkIGRldGFpbHMgdG8gdGhlIGVycm9yLmxvZwotICAgICAgcHJpbnRfaGVhZGVyID4+IGxvZy9lcnJvci5sb2cKLSAgICAgIHByaW50ZiAiJS0xNnMgJS0xMXMgJS0xN3NcbiIgJHtjbGllbnRfc2VydmVyfSAke3Byb3RvY29sfSAke3RyYW5zcG9ydH0gPj4gbG9nL2Vycm9yLmxvZwotICAgICAgZWNobyAiPT09PT09PT09PT09PT09PT09PSBzZXJ2ZXIgbWVzc2FnZSA9PT09PT09PT09PT09PT09PT09IiA+PiBsb2cvZXJyb3IubG9nCi0gICAgICB0YWlsIGxvZy8ke3Rlc3RuYW1lfV9zZXJ2ZXIubG9nICA+PiBsb2cvZXJyb3IubG9nCi0gICAgICBlY2hvICI9PT09PT09PT09PT09PT09PT09IGNsaWVudCBtZXNzYWdlID09PT09PT09PT09PT09PT09PT0iID4+IGxvZy9lcnJvci5sb2cKLSAgICAgIHRhaWwgbG9nLyR7dGVzdG5hbWV9X2NsaWVudC5sb2cgPj4gbG9nL2Vycm9yLmxvZwotICAgICAgZWNobyAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IiA+PiBsb2cvZXJyb3IubG9nCi0gICAgICBlY2hvICIiID4+IGxvZy9lcnJvci5sb2cKLSAgICAgIEZBSUxFRD0kKCgkRkFJTEVEICsgMSkpCi0gICAgZmkKLSAgICBURVNUQ09VTlQ9JCgoJFRFU1RDT1VOVCArIDEpKQotCi0gICAgIyBzcGxpdCBjbGllbnQtc2VydmVyIHN0cmluZwotICAgIGNsaWVudD0ke2NsaWVudF9zZXJ2ZXIlLSp9Ci0gICAgc2VydmVyPSR7Y2xpZW50X3NlcnZlciMqLX0KLQotICAgIGNhdCA8PCBFT0YgPj4gJFNUQVRVU19IVE1MCi0gICAgICBbCi0gICAgICAgICIke3NlcnZlcn0iLAotICAgICAgICAiJHtjbGllbnR9IiwKLSAgICAgICAgIiR7cHJvdG9jb2x9IiwKLSAgICAgICAgIiR7dHJhbnNwb3J0fSIsCi0gICAgICAgICIke3Jlc3VsdH0gKDxhIGhyZWY9XCJsb2cvJHt0ZXN0bmFtZX1fY2xpZW50LmxvZ1wiPmNsaWVudDwvYT4sIDxhIGhyZWY9XCJsb2cvJHt0ZXN0bmFtZX1fc2VydmVyLmxvZ1wiPnNlcnZlcjwvYT4pIgotICAgICAgXSwKLUVPRgotCi0gICAgIyBzaWxlbnRseSBraWxsIHNlcnZlcgotICAgIGtpbGwgJHtzZXJ2ZXJfcGlkfSAyPi9kZXYvbnVsbCAmJiB3YWl0ICR7c2VydmVyX3BpZH0gMj4vZGV2L251bGwKLX0KLQotZWNobyAiQXBhY2hlIFRocmlmdCAtIGludGVncmF0aW9uIHRlc3Qgc3VpdGUiCi1pZiBbICIkIyIgLWVxICIwIiBdOyB0aGVuCi0gIFRIUklGVF9URVNUX1BPUlQ9OTA5MAotZWxzZQotICBUSFJJRlRfVEVTVF9QT1JUPSQxCi1maQotZGF0ZQotCi0KLWVjaG8gIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIKLQotcm0gLXJmIGxvZwotbWtkaXIgLXAgbG9nCi0KLQotcHJpbnRfaGVhZGVyCi1wcmludF9odG1sX2hlYWRlcgotCi1hbnQgLWYgLi4vbGliL2phdmEvYnVpbGQueG1sIGNvbXBpbGUtdGVzdCAxPi9kZXYvbnVsbAotCi0KLSNUT0RPIGFkZCBlbnVtIGZvciBwYXJhbWV0ZXJzCi0jVE9ETyBhbGlnbiBwcm9ncmFtIGFyZ3VtZW50cyBhY3Jvc3MgbGFuZ3VhZ2VzCi0KLWNwcF9wcm90b2NvbHM9ImJpbmFyeSBjb21wYWN0IGpzb24iCi1qYXZhX3Byb3RvY29scz0iYmluYXJ5IGNvbXBhY3QganNvbiIKLWNwcF90cmFuc3BvcnRzPSJidWZmZXJlZCBmcmFtZWQgaHR0cCIKLWphdmFfc2VydmVyX3RyYW5zcG9ydHM9ImJ1ZmZlcmVkIGZyYW1lZCBmYXN0ZnJhbWVkIgotamF2YV9jbGllbnRfdHJhbnNwb3J0cz0ke2phdmFfc2VydmVyX3RyYW5zcG9ydHN9IiBodHRwIgotY3BwX3NvY2tldHM9ImlwIGRvbWFpbiBpcC1zc2wiCi1qYXZhX3NvY2tldHM9ImlwIGlwLXNzbCIKLSMgVE9ETyBmYXN0ZnJhbWVkIGphdmEgdHJhbnNwb3J0IGlzIGFub3RoZXIgaW1wbGVtZW50YXRpb24gb2YgZnJhbWVkIHRyYW5zcG9ydAotCi1jX2dsaWJfcHJvdG9jb2xzPSJiaW5hcnkiCi1jX2dsaWJfdHJhbnNwb3J0cz0iYnVmZmVyZWQgZnJhbWVkIgotY19nbGliX3NvY2tldHM9ImlwIgotCi1ub2RlanNfcHJvdG9jb2xzPSJiaW5hcnkgY29tcGFjdCBqc29uIgotbm9kZWpzX3RyYW5zcG9ydHM9ImJ1ZmZlcmVkIGZyYW1lZCIKLW5vZGVqc19zb2NrZXRzPSJpcCBpcC1zc2wiCi0KLWNzaGFycF9wcm90b2NvbHM9ImJpbmFyeSBjb21wYWN0IGpzb24iCi1jc2hhcnBfdHJhbnNwb3J0cz0iYnVmZmVyZWQgZnJhbWVkIgotY3NoYXJwX3NvY2tldHM9ImlwIGlwLXNzbCIKLQotcHlfcHJvdG9jb2xzPSJiaW5hcnkgY29tcGFjdCBqc29uIGFjY2VsIgotcHlfdHJhbnNwb3J0cz0iYnVmZmVyZWQgZnJhbWVkIgotcHlfc29ja2V0cz0iaXAgaXAtc3NsIgotCi1ydWJ5X3Byb3RvY29scz0iYmluYXJ5IGNvbXBhY3QganNvbiBhY2NlbCIKLXJ1YnlfdHJhbnNwb3J0cz0iYnVmZmVyZWQgZnJhbWVkIgotcnVieV9zb2NrZXRzPSJpcCIKLQotaHNfcHJvdG9jb2xzPSJiaW5hcnkgY29tcGFjdCBqc29uIgotaHNfdHJhbnNwb3J0cz0iYnVmZmVyZWQiCi1oc19zb2NrZXRzPSJpcCIKLQotIyMjIyMjIyMjIGphdmEgY2xpZW50IC0gamF2YSBzZXJ2ZXIgIyMjIyMjIyMjIyMjIwotZm9yIHByb3RvIGluICRqYXZhX3Byb3RvY29sczsgZG8KLSAgZm9yIHRyYW5zIGluICRqYXZhX3NlcnZlcl90cmFuc3BvcnRzOyBkbwotICAgIGZvciBzb2NrIGluICRqYXZhX3NvY2tldHM7IGRvCi0gICAgICBjYXNlICIkc29jayIgaW4KLSAgICAgICAgImlwIiApIGV4dHJhcGFyYW09IiI7OwotICAgICAgICAiaXAtc3NsIiApIGV4dHJhcGFyYW09Ii0tc3NsIjs7Ci0gICAgICBlc2FjCi0gICAgICBkb190ZXN0ICJqYXZhLWphdmEiICIke3Byb3RvfSIgIiR7dHJhbnN9LSR7c29ja30iIFwKLSAgICAgICAgICAgICAgImFudCAtZiAgLi4vbGliL2phdmEvYnVpbGQueG1sIC1Ebm8tZ2VuLXRocmlmdD1cIlwiIC1EdGVzdGFyZ3MgXCItLXByb3RvY29sPSR7cHJvdG99IC0tdHJhbnNwb3J0PSR7dHJhbnN9IC0tcG9ydD0ke1RIUklGVF9URVNUX1BPUlR9ICR7ZXh0cmFwYXJhbX1cIiBydW4tdGVzdGNsaWVudCIgXAotICAgICAgICAgICAgICAiYW50IC1mICAuLi9saWIvamF2YS9idWlsZC54bWwgLURuby1nZW4tdGhyaWZ0PVwiXCIgLUR0ZXN0YXJncyBcIi0tcHJvdG9jb2w9JHtwcm90b30gLS10cmFuc3BvcnQ9JHt0cmFuc30gLS1wb3J0PSR7VEhSSUZUX1RFU1RfUE9SVH0gJHtleHRyYXBhcmFtfVwiIHJ1bi10ZXN0c2VydmVyIiBcCi0gICAgICAgICAgICAgICI1IiAiMSIKLSAgICBkb25lCi0gIGRvbmUKLWRvbmUKLQotIyMjIyMjIyMjIGNwcCBjbGllbnQgLSBjcHAgc2VydmVyICMjIyMjIyMjIyMjIyMjIwotZm9yIHByb3RvIGluICRjcHBfcHJvdG9jb2xzOyBkbwotICBmb3IgdHJhbnMgaW4gJGNwcF90cmFuc3BvcnRzOyBkbwotICAgIGZvciBzb2NrIGluICRjcHBfc29ja2V0czsgZG8KLSAgICAgIGNhc2UgIiRzb2NrIiBpbgotICAgICAgICJpcCIgKSAgICAgZXh0cmFwYXJhbT0iIjs7Ci0gICAgICAgImlwLXNzbCIgKSBleHRyYXBhcmFtPSItLXNzbCI7OwotICAgICAgICJkb21haW4iICkgZXh0cmFwYXJhbT0iLS1kb21haW4tc29ja2V0PS90bXAvVGhyaWZ0VGVzdC50aHJpZnQiOzsKLSAgICAgIGVzYWMKLSAgICAgIGRvX3Rlc3QgImNwcC1jcHAiICAgIiR7cHJvdG99IiAiJHt0cmFuc30tJHtzb2NrfSIgXAotICAgICAgICAgICAgICAiY3BwL1Rlc3RDbGllbnQgLS1wcm90b2NvbD0ke3Byb3RvfSAtLXRyYW5zcG9ydD0ke3RyYW5zfSAtLXBvcnQ9JHtUSFJJRlRfVEVTVF9QT1JUfSAke2V4dHJhcGFyYW19IiBcCi0gICAgICAgICAgICAgICJjcHAvVGVzdFNlcnZlciAtLXByb3RvY29sPSR7cHJvdG99IC0tdHJhbnNwb3J0PSR7dHJhbnN9IC0tcG9ydD0ke1RIUklGVF9URVNUX1BPUlR9ICR7ZXh0cmFwYXJhbX0iIFwKLSAgICAgICAgICAgICAgIjIiICIwLjEiCi0gICAgZG9uZQotICBkb25lCi1kb25lCi0KLQotIyMjIyMjIyMjIGphdmEgY2xpZW50IC0gY3BwIHNlcnZlciAjIyMjIyMjIyMjIyMjIwotIyB3YXJuaW5nOiBzc2wgb3ZlciBodHRwIGlzIG5vdCBzdXBwb3J0ZWQgaW4gamF2YSBjbGllbnQhCi1mb3IgcHJvdG8gaW4gJChpbnRlcnNlY3Rpb24gIiR7amF2YV9wcm90b2NvbHN9IiAiJHtjcHBfcHJvdG9jb2xzfSIpOyBkbwotICBmb3IgdHJhbnMgaW4gJChpbnRlcnNlY3Rpb24gIiR7amF2YV9jbGllbnRfdHJhbnNwb3J0c30iICIke2NwcF90cmFuc3BvcnRzfSIpOyBkbwotICAgIGZvciBzb2NrIGluICQoaW50ZXJzZWN0aW9uICIke2phdmFfc29ja2V0c30iICIke2NwcF9zb2NrZXRzfSIpOyBkbwotICAgICAgY2FzZSAiJHNvY2siIGluCi0gICAgICAgICJpcCIgKSBleHRyYXBhcmFtPSIiOzsKLSAgICAgICAgImlwLXNzbCIgKSBleHRyYXBhcmFtPSItLXNzbCI7OwotICAgICAgZXNhYwotICAgICAgZG9fdGVzdCAiamF2YS1jcHAiICIke3Byb3RvfSIgIiR7dHJhbnN9LSR7c29ja30iIFwKLSAgICAgICAgICAgICAgImFudCAtZiAgLi4vbGliL2phdmEvYnVpbGQueG1sIC1Ebm8tZ2VuLXRocmlmdD1cIlwiIC1EdGVzdGFyZ3MgXCItLXByb3RvY29sPSR7cHJvdG99IC0tdHJhbnNwb3J0PSR7dHJhbnN9IC0tcG9ydD0ke1RIUklGVF9URVNUX1BPUlR9ICR7ZXh0cmFwYXJhbX1cIiBydW4tdGVzdGNsaWVudCIgXAotICAgICAgICAgICAgICAiY3BwL1Rlc3RTZXJ2ZXIgLS1wcm90b2NvbD0ke3Byb3RvfSAtLXRyYW5zcG9ydD0ke3RyYW5zfSAtLXBvcnQ9JHtUSFJJRlRfVEVTVF9QT1JUfSAke2V4dHJhcGFyYW19IlwKLSAgICAgICAgICAgICAgIjUiICIwLjEiCi0gICAgZG9uZQotICBkb25lCi1kb25lCi0KLSMjIyMjIyMjIyBjcHAgY2xpZW50IC0gamF2YSBzZXJ2ZXIgIyMjIyMjIyMjIyMjIyMKLWZvciBwcm90byBpbiAkKGludGVyc2VjdGlvbiAiJHtjcHBfcHJvdG9jb2xzfSIgIiR7amF2YV9wcm90b2NvbHN9Iik7IGRvCi0gIGZvciB0cmFucyBpbiAkKGludGVyc2VjdGlvbiAiJHtjcHBfdHJhbnNwb3J0c30iICIke2phdmFfc2VydmVyX3RyYW5zcG9ydHN9Iik7IGRvCi0gICAgZm9yIHNvY2sgaW4gJChpbnRlcnNlY3Rpb24gIiR7amF2YV9zb2NrZXRzfSIgIiR7Y3BwX3NvY2tldHN9Iik7IGRvCi0gICAgICBjYXNlICIkc29jayIgaW4KLSAgICAgICAgImlwIiApIGV4dHJhcGFyYW09IiI7OwotICAgICAgICAiaXAtc3NsIiApIGV4dHJhcGFyYW09Ii0tc3NsIjs7Ci0gICAgICBlc2FjCi0gICAgICBkb190ZXN0ICJjcHAtamF2YSIgIiR7cHJvdG99IiAiJHt0cmFuc30tJHtzb2NrfSIgXAotICAgICAgICAgICAgICAiY3BwL1Rlc3RDbGllbnQgLS1wcm90b2NvbD0ke3Byb3RvfSAtLXRyYW5zcG9ydD0ke3RyYW5zfSAtLXBvcnQ9JHtUSFJJRlRfVEVTVF9QT1JUfSAke2V4dHJhcGFyYW19IiBcCi0gICAgICAgICAgICAgICJhbnQgLWYgIC4uL2xpYi9qYXZhL2J1aWxkLnhtbCAtRG5vLWdlbi10aHJpZnQ9XCJcIiAtRHRlc3RhcmdzIFwiLS1wcm90b2NvbD0ke3Byb3RvfSAtLXRyYW5zcG9ydD0ke3RyYW5zfSAtLXBvcnQ9JHtUSFJJRlRfVEVTVF9QT1JUfSAgJHtleHRyYXBhcmFtfVwiIHJ1bi10ZXN0c2VydmVyIiBcCi0gICAgICAgICAgICAgICI1IiAiMSIKLSAgICBkb25lCi0gIGRvbmUKLWRvbmUKLQotIyMjIyMjIyMjIGNfZ2xpYiBjbGllbnQgLSBjX2dsaWIgc2VydmVyICMjIyMjIyMjIyMjIyMjCi1mb3IgcHJvdG8gaW4gJHtjX2dsaWJfcHJvdG9jb2xzfTsgZG8KLSAgZm9yIHRyYW5zIGluICR7Y19nbGliX3RyYW5zcG9ydHN9OyBkbwotICAgIGZvciBzb2NrIGluICR7Y19nbGliX3NvY2tldHN9OyBkbwotICAgICAgY2FzZSAiJHNvY2siIGluCi0gICAgICAgICJpcCIgKSBleHRyYXBhcmFtPSIiOzsKLSAgICAgICAgImlwLXNzbCIgKSBleHRyYXBhcmFtPSItLXNzbCI7OwotICAgICAgICAiZG9tYWluIiApIGV4dHJhcGFyYW09Ii0tZG9tYWluLXNvY2tldD0vdG1wL1RocmlmdFRlc3QudGhyaWZ0Ijs7Ci0gICAgICBlc2FjCi0gICAgICBkb190ZXN0ICJjX2dsaWItY19nbGliIiAiJHtwcm90b30iICIke3RyYW5zfS0ke3NvY2t9IiBcCi0gICAgICAgICAgICAgICJjX2dsaWIvdGVzdF9jbGllbnQgLS1wcm90b2NvbD0ke3Byb3RvfSAgLS10cmFuc3BvcnQ9JHt0cmFuc30gLS1wb3J0PSR7VEhSSUZUX1RFU1RfUE9SVH0gJHtleHRyYXBhcmFtfSIgXAotICAgICAgICAgICAgICAiY19nbGliL3Rlc3Rfc2VydmVyIC0tcHJvdG9jb2w9JHtwcm90b30gIC0tdHJhbnNwb3J0PSR7dHJhbnN9IC0tcG9ydD0ke1RIUklGVF9URVNUX1BPUlR9ICR7ZXh0cmFwYXJhbX0iIFwKLSAgICAgICAgICAgICAgIjIiICIwLjEiCi0gICAgZG9uZQotICBkb25lCi1kb25lCi0KLSMjIyMjIyMjIyBjX2dsaWIgY2xpZW50IC0gY3BwIHNlcnZlciAjIyMjIyMjIyMjIyMjIwotZm9yIHByb3RvIGluICQoaW50ZXJzZWN0aW9uICIke2NfZ2xpYl9wcm90b2NvbHN9IiAiJHtjcHBfcHJvdG9jb2xzfSIpOyBkbwotICBmb3IgdHJhbnMgaW4gJChpbnRlcnNlY3Rpb24gIiR7Y19nbGliX3RyYW5zcG9ydHN9IiAiJHtjcHBfdHJhbnNwb3J0c30iKTsgZG8KLSAgICBmb3Igc29jayBpbiAkKGludGVyc2VjdGlvbiAiJHtjX2dsaWJfc29ja2V0c30iICIke2NwcF9zb2NrZXRzfSIpOyBkbwotICAgICAgY2FzZSAiJHNvY2siIGluCi0gICAgICAgICJpcCIgKSBleHRyYXBhcmFtPSIiOzsKLSAgICAgICAgImlwLXNzbCIgKSBleHRyYXBhcmFtPSItLXNzbCI7OwotICAgICAgICAiZG9tYWluIiApIGV4dHJhcGFyYW09Ii0tZG9tYWluLXNvY2tldD0vdG1wL1RocmlmdFRlc3QudGhyaWZ0Ijs7Ci0gICAgICBlc2FjCi0gICAgICBkb190ZXN0ICJjX2dsaWItY3BwIiAiJHtwcm90b30iICIke3RyYW5zfS0ke3NvY2t9IiBcCi0gICAgICAgICAgICAgICJjX2dsaWIvdGVzdF9jbGllbnQgLS1wcm90b2NvbD0ke3Byb3RvfSAgLS10cmFuc3BvcnQ9JHt0cmFuc30gLS1wb3J0PSR7VEhSSUZUX1RFU1RfUE9SVH0gJHtleHRyYXBhcmFtfSIgXAotICAgICAgICAgICAgICAiY3BwL1Rlc3RTZXJ2ZXIgLS1wcm90b2NvbD0ke3Byb3RvfSAtLXRyYW5zcG9ydD0ke3RyYW5zfSAtLXBvcnQ9JHtUSFJJRlRfVEVTVF9QT1JUfSAke2V4dHJhcGFyYW19IlwKLSAgICAgICAgICAgICAgIjIiICIwLjEiCi0gICAgZG9uZQotICBkb25lCi1kb25lCi0KLSMjIyMjIyMjIyBjcHAgY2xpZW50IC0gY19nbGliIHNlcnZlciAjIyMjIyMjIyMjIyMjIwotZm9yIHByb3RvIGluICQoaW50ZXJzZWN0aW9uICIke2NwcF9wcm90b2NvbHN9IiAiJHtjX2dsaWJfcHJvdG9jb2xzfSIpOyBkbwotICBmb3IgdHJhbnMgaW4gJChpbnRlcnNlY3Rpb24gIiR7Y3BwX3RyYW5zcG9ydHN9IiAiJHtjX2dsaWJfdHJhbnNwb3J0c30iKTsgZG8KLSAgICBmb3Igc29jayBpbiAkKGludGVyc2VjdGlvbiAiJHtjcHBfc29ja2V0c30iICIke2NfZ2xpYl9zb2NrZXRzfSIpOyBkbwotICAgICAgY2FzZSAiJHNvY2siIGluCi0gICAgICAgICJpcCIgKSBleHRyYXBhcmFtPSIiOzsKLSAgICAgICAgImlwLXNzbCIgKSBleHRyYXBhcmFtPSItLXNzbCI7OwotICAgICAgICAiZG9tYWluIiApIGV4dHJhcGFyYW09Ii0tZG9tYWluLXNvY2tldD0vdG1wL1RocmlmdFRlc3QudGhyaWZ0Ijs7Ci0gICAgICBlc2FjCi0gICAgICBkb190ZXN0ICJjcHAtY19nbGliIiAiJHtwcm90b30iICIke3RyYW5zfS0ke3NvY2t9IiBcCi0gICAgICAgICAgICAgICJjcHAvVGVzdENsaWVudCAtLXByb3RvY29sPSR7cHJvdG99IC0tdHJhbnNwb3J0PSR7dHJhbnN9IC0tcG9ydD0ke1RIUklGVF9URVNUX1BPUlR9ICR7ZXh0cmFwYXJhbX0iXAotICAgICAgICAgICAgICAiY19nbGliL3Rlc3Rfc2VydmVyIC0tcHJvdG9jb2w9JHtwcm90b30gIC0tdHJhbnNwb3J0PSR7dHJhbnN9IC0tcG9ydD0ke1RIUklGVF9URVNUX1BPUlR9ICR7ZXh0cmFwYXJhbX0iIFwKLSAgICAgICAgICAgICAgIjIiICIwLjEiCi0gICAgZG9uZQotICBkb25lCi1kb25lCi0KLSMjIyMjIyMjIyBjX2dsaWIgY2xpZW50IC0gamF2YSBzZXJ2ZXIgIyMjIyMjIyMjIyMjIyMKLWZvciBwcm90byBpbiAkKGludGVyc2VjdGlvbiAiJHtjX2dsaWJfcHJvdG9jb2xzfSIgIiR7amF2YV9wcm90b2NvbHN9Iik7IGRvCi0gIGZvciB0cmFucyBpbiAkKGludGVyc2VjdGlvbiAiJHtjX2dsaWJfdHJhbnNwb3J0c30iICIke2phdmFfc2VydmVyX3RyYW5zcG9ydHN9Iik7IGRvCi0gICAgZm9yIHNvY2sgaW4gJChpbnRlcnNlY3Rpb24gIiR7Y19nbGliX3NvY2tldHN9IiAiJHtqYXZhX3NvY2tldHN9Iik7IGRvCi0gICAgICBjYXNlICIkc29jayIgaW4KLSAgICAgICAgImlwIiApIGV4dHJhcGFyYW09IiI7OwotICAgICAgICAiaXAtc3NsIiApIGV4dHJhcGFyYW09Ii0tc3NsIjs7Ci0gICAgICBlc2FjCi0gICAgICBkb190ZXN0ICJjX2dsaWItamF2YSIgIiR7cHJvdG99IiAiJHt0cmFuc30tJHtzb2NrfSIgXAotICAgICAgICAgICAgICAiY19nbGliL3Rlc3RfY2xpZW50IC0tcHJvdG9jb2w9JHtwcm90b30gIC0tdHJhbnNwb3J0PSR7dHJhbnN9IC0tcG9ydD0ke1RIUklGVF9URVNUX1BPUlR9ICR7ZXh0cmFwYXJhbX0iIFwKLSAgICAgICAgICAgICAgImFudCAtZiAuLi9saWIvamF2YS9idWlsZC54bWwgLURuby1nZW4tdGhyaWZ0PVwiXCIgLUR0ZXN0YXJncyBcIi0tcHJvdG9jb2w9JHtwcm90b30gLS10cmFuc3BvcnQ9JHt0cmFuc30gLS1wb3J0PSR7VEhSSUZUX1RFU1RfUE9SVH0gJHtleHRyYXBhcmFtfVwiIHJ1bi10ZXN0c2VydmVyIiBcCi0gICAgICAgICAgICAgICIyIiAiMiIKLSAgICBkb25lCi0gIGRvbmUKLWRvbmUKLQotIyMjIyMjIyMjIGphdmEgY2xpZW50IC0gY19nbGliIHNlcnZlciAjIyMjIyMjIyMjIyMjIwotZm9yIHByb3RvIGluICQoaW50ZXJzZWN0aW9uICIke2phdmFfcHJvdG9jb2xzfSIgIiR7Y19nbGliX3Byb3RvY29sc30iKTsgZG8KLSAgZm9yIHRyYW5zIGluICQoaW50ZXJzZWN0aW9uICIke2phdmFfY2xpZW50X3RyYW5zcG9ydHN9IiAiJHtjX2dsaWJfdHJhbnNwb3J0c30iKTsgZG8KLSAgICBmb3Igc29jayBpbiAkKGludGVyc2VjdGlvbiAiJHtqYXZhX3NvY2tldHN9IiAiJHtjX2dsaWJfc29ja2V0c30iKTsgZG8KLSAgICAgIGNhc2UgIiRzb2NrIiBpbgotICAgICAgICAiaXAiICkgZXh0cmFwYXJhbT0iIjs7Ci0gICAgICAgICJpcC1zc2wiICkgZXh0cmFwYXJhbT0iLS1zc2wiOzsKLSAgICAgIGVzYWMKLSAgICAgIGRvX3Rlc3QgImphdmEtY19nbGliIiAiJHtwcm90b30iICIke3RyYW5zfS0ke3NvY2t9IiBcCi0gICAgICAgICAgICAgICJhbnQgLWYgIC4uL2xpYi9qYXZhL2J1aWxkLnhtbCAtRG5vLWdlbi10aHJpZnQ9XCJcIiAtRHRlc3RhcmdzIFwiLS1wcm90b2NvbD0ke3Byb3RvfSAtLXRyYW5zcG9ydD0ke3RyYW5zfSAtLXBvcnQ9JHtUSFJJRlRfVEVTVF9QT1JUfSAke2V4dHJhcGFyYW19XCIgcnVuLXRlc3RjbGllbnQiIFwKLSAgICAgICAgICAgICAgImNfZ2xpYi90ZXN0X3NlcnZlciAtLXByb3RvY29sPSR7cHJvdG99ICAtLXRyYW5zcG9ydD0ke3RyYW5zfSAtLXBvcnQ9JHtUSFJJRlRfVEVTVF9QT1JUfSAke2V4dHJhcGFyYW19IiBcCi0gICAgICAgICAgICAgICI1IiAiMC4xIgotICAgIGRvbmUKLSAgZG9uZQotZG9uZQotCi0KLU5PREVfVEVTVF9ESVI9JHtCQVNFRElSfS8uLi9saWIvbm9kZWpzL3Rlc3QKLWV4cG9ydCBOT0RFX1BBVEg9JHtOT0RFX1RFU1RfRElSfToke05PREVfVEVTVF9ESVJ9Ly4uL2xpYjoke05PREVfUEFUSH0KLSMjIyMjIyMjIyBub2RlanMgY2xpZW50IC0gbm9kZWpzIHNlcnZlciAjIyMjIyMjIyMjIyMjIwotZm9yIHByb3RvIGluICR7bm9kZWpzX3Byb3RvY29sc307IGRvCi0gIGZvciB0cmFucyBpbiAke25vZGVqc190cmFuc3BvcnRzfTsgZG8KLSAgICBmb3Igc29jayBpbiAke25vZGVqc19zb2NrZXRzfTsgZG8KLSAgICAgIGNhc2UgIiRzb2NrIiBpbgotICAgICAgICAiaXAiICkgZXh0cmFwYXJhbT0iIjs7Ci0gICAgICAgICJpcC1zc2wiICkgZXh0cmFwYXJhbT0iLS1zc2wiOzsKLSAgICAgIGVzYWMKLSAgICAgIGRvX3Rlc3QgIm5vZGVqcy1ub2RlanMiICIke3Byb3RvfSIgIiR7dHJhbnN9LSR7c29ja30iIFwKLSAgICAgICAgICAgICAgIm5vZGUgJHtOT0RFX1RFU1RfRElSfS9jbGllbnQuanMgLXAgJHtwcm90b30gLXQgJHt0cmFuc30gLS1wb3J0PSR7VEhSSUZUX1RFU1RfUE9SVH0gJHtleHRyYXBhcmFtfSIgXAotICAgICAgICAgICAgICAibm9kZSAke05PREVfVEVTVF9ESVJ9L3NlcnZlci5qcyAtcCAke3Byb3RvfSAtdCAke3RyYW5zfSAtLXBvcnQ9JHtUSFJJRlRfVEVTVF9QT1JUfSAke2V4dHJhcGFyYW19IiBcCi0gICAgICAgICAgICAgICI1IiAiMC4yIgotICAgIGRvbmUKLSAgZG9uZQotZG9uZQotCi0jIyMjIyMjIyMgbm9kZWpzIGNsaWVudCAtIGNwcCBzZXJ2ZXIgIyMjIyMjIyMjIyMjIyMKLWZvciBwcm90byBpbiAkKGludGVyc2VjdGlvbiAiJHtub2RlanNfcHJvdG9jb2xzfSIgIiR7Y3BwX3Byb3RvY29sc30iKTsgZG8KLSAgZm9yIHRyYW5zIGluICQoaW50ZXJzZWN0aW9uICIke25vZGVqc190cmFuc3BvcnRzfSIgIiR7Y3BwX3RyYW5zcG9ydHN9Iik7IGRvCi0gICAgZm9yIHNvY2sgaW4gJChpbnRlcnNlY3Rpb24gIiR7bm9kZWpzX3NvY2tldHN9IiAiJHtjcHBfc29ja2V0c30iKTsgZG8KLSAgICAgIGNhc2UgIiRzb2NrIiBpbgotICAgICAgICAiaXAiICkgZXh0cmFwYXJhbT0iIjs7Ci0gICAgICAgICJpcC1zc2wiICkgZXh0cmFwYXJhbT0iLS1zc2wiOzsKLSAgICAgIGVzYWMKLSAgICAgIGRvX3Rlc3QgIm5vZGVqcy1jcHAiICIke3Byb3RvfSIgIiR7dHJhbnN9LSR7c29ja30iIFwKLSAgICAgICAgICAgICAgIm5vZGUgJHtOT0RFX1RFU1RfRElSfS9jbGllbnQuanMgLXAgJHtwcm90b30gLXQgJHt0cmFuc30gLS1wb3J0PSR7VEhSSUZUX1RFU1RfUE9SVH0gJHtleHRyYXBhcmFtfSIgXAotICAgICAgICAgICAgICAiY3BwL1Rlc3RTZXJ2ZXIgLS1wcm90b2NvbD0ke3Byb3RvfSAtLXRyYW5zcG9ydD0ke3RyYW5zfSAtLXBvcnQ9JHtUSFJJRlRfVEVTVF9QT1JUfSAke2V4dHJhcGFyYW19IiBcCi0gICAgICAgICAgICAgICI1IiAiMC4yIgotICAgIGRvbmUKLSAgZG9uZQotZG9uZQotCi0jIyMjIyMjIyMgY3BwIGNsaWVudCAtIG5vZGVqcyBzZXJ2ZXIgIyMjIyMjIyMjIyMjIyMKLWZvciBwcm90byBpbiAkKGludGVyc2VjdGlvbiAiJHtub2RlanNfcHJvdG9jb2xzfSIgIiR7Y3BwX3Byb3RvY29sc30iKTsgZG8KLSAgZm9yIHRyYW5zIGluICQoaW50ZXJzZWN0aW9uICIke25vZGVqc190cmFuc3BvcnRzfSIgIiR7Y3BwX3RyYW5zcG9ydHN9Iik7IGRvCi0gICAgZm9yIHNvY2sgaW4gJChpbnRlcnNlY3Rpb24gIiR7bm9kZWpzX3NvY2tldHN9IiAiJHtjcHBfc29ja2V0c30iKTsgZG8KLSAgICAgIGNhc2UgIiRzb2NrIiBpbgotICAgICAgICAiaXAiICkgZXh0cmFwYXJhbT0iIjs7Ci0gICAgICAgICJpcC1zc2wiICkgZXh0cmFwYXJhbT0iLS1zc2wiOzsKLSAgICAgIGVzYWMKLSAgICAgIGRvX3Rlc3QgImNwcC1ub2RlanMiICIke3Byb3RvfSIgIiR7dHJhbnN9LSR7c29ja30iIFwKLSAgICAgICAgICAgICAgImNwcC9UZXN0Q2xpZW50IC0tcHJvdG9jb2w9JHtwcm90b30gLS10cmFuc3BvcnQ9JHt0cmFuc30gLS1wb3J0PSR7VEhSSUZUX1RFU1RfUE9SVH0gJHtleHRyYXBhcmFtfSIgXAotICAgICAgICAgICAgICAibm9kZSAke05PREVfVEVTVF9ESVJ9L3NlcnZlci5qcyAtcCAke3Byb3RvfSAtdCAke3RyYW5zfSAtLXBvcnQ9JHtUSFJJRlRfVEVTVF9QT1JUfSAke2V4dHJhcGFyYW19IiBcCi0gICAgICAgICAgICAgICI1IiAiMiIKLSAgICBkb25lCi0gIGRvbmUKLWRvbmUKLQotIyMjIyMjIyMjIG5vZGVqcyBjbGllbnQgLSBqYXZhIHNlcnZlciAjIyMjIyMjIyMjIyMjIwotZm9yIHByb3RvIGluICQoaW50ZXJzZWN0aW9uICIke25vZGVqc19wcm90b2NvbHN9IiAiJHtqYXZhX3Byb3RvY29sc30iKTsgZG8KLSAgZm9yIHRyYW5zIGluICQoaW50ZXJzZWN0aW9uICIke25vZGVqc190cmFuc3BvcnRzfSIgIiR7amF2YV9zZXJ2ZXJfdHJhbnNwb3J0c30iKTsgZG8KLSAgICBmb3Igc29jayBpbiAkKGludGVyc2VjdGlvbiAiJHtub2RlanNfc29ja2V0c30iICIke2phdmFfc29ja2V0c30iKTsgZG8KLSAgICAgIGNhc2UgIiRzb2NrIiBpbgotICAgICAgICAiaXAiICkgZXh0cmFwYXJhbT0iIjs7Ci0gICAgICAgICJpcC1zc2wiICkgZXh0cmFwYXJhbT0iLS1zc2wiOzsKLSAgICAgIGVzYWMKLSAgICAgIGRvX3Rlc3QgIm5vZGVqcy1qYXZhIiAiJHtwcm90b30iICIke3RyYW5zfS0ke3NvY2t9IiBcCi0gICAgICAgICAgICAgICJub2RlICR7Tk9ERV9URVNUX0RJUn0vY2xpZW50LmpzIC1wICR7cHJvdG99IC10ICR7dHJhbnN9IC0tcG9ydD0ke1RIUklGVF9URVNUX1BPUlR9ICR7ZXh0cmFwYXJhbX0iIFwKLSAgICAgICAgICAgICAgImFudCAtZiAgLi4vbGliL2phdmEvYnVpbGQueG1sIC1Ebm8tZ2VuLXRocmlmdD1cIlwiIC1EdGVzdGFyZ3MgXCItLXByb3RvY29sPSR7cHJvdG99IC0tdHJhbnNwb3J0PSR7dHJhbnN9IC0tcG9ydD0ke1RIUklGVF9URVNUX1BPUlR9ICR7ZXh0cmFwYXJhbX1cIiBydW4tdGVzdHNlcnZlciIgXAotICAgICAgICAgICAgICAiNSIgIjEiCi0gICAgZG9uZQotICBkb25lCi1kb25lCi0KLSMjIyMjIyMjIyBqYXZhIGNsaWVudCAtIG5vZGVqcyBzZXJ2ZXIgIyMjIyMjIyMjIyMjIyMKLWZvciBwcm90byBpbiAkKGludGVyc2VjdGlvbiAiJHtub2RlanNfcHJvdG9jb2xzfSIgIiR7amF2YV9wcm90b2NvbHN9Iik7IGRvCi0gIGZvciB0cmFucyBpbiAkKGludGVyc2VjdGlvbiAiJHtub2RlanNfdHJhbnNwb3J0c30iICIke2phdmFfY2xpZW50X3RyYW5zcG9ydHN9Iik7IGRvCi0gICAgZm9yIHNvY2sgaW4gJChpbnRlcnNlY3Rpb24gIiR7bm9kZWpzX3NvY2tldHN9IiAiJHtqYXZhX3NvY2tldHN9Iik7IGRvCi0gICAgICBjYXNlICIkc29jayIgaW4KLSAgICAgICAgImlwIiApIGV4dHJhcGFyYW09IiI7OwotICAgICAgICAiaXAtc3NsIiApIGV4dHJhcGFyYW09Ii0tc3NsIjs7Ci0gICAgICBlc2FjCi0gICAgICBkb190ZXN0ICJqYXZhLW5vZGVqcyIgIiR7cHJvdG99IiAiJHt0cmFuc30tJHtzb2NrfSIgXAotICAgICAgICAgICAgICAiYW50IC1mICAuLi9saWIvamF2YS9idWlsZC54bWwgLURuby1nZW4tdGhyaWZ0PVwiXCIgLUR0ZXN0YXJncyBcIi0tcHJvdG9jb2w9JHtwcm90b30gLS10cmFuc3BvcnQ9JHt0cmFuc30gLS1wb3J0PSR7VEhSSUZUX1RFU1RfUE9SVH0gJHtleHRyYXBhcmFtfVwiIHJ1bi10ZXN0Y2xpZW50IiBcCi0gICAgICAgICAgICAgICJub2RlICR7Tk9ERV9URVNUX0RJUn0vc2VydmVyLmpzIC1wICR7cHJvdG99IC10ICR7dHJhbnN9IC0tcG9ydD0ke1RIUklGVF9URVNUX1BPUlR9ICR7ZXh0cmFwYXJhbX0iIFwKLSAgICAgICAgICAgICAgIjUiICIyIgotICAgIGRvbmUKLSAgZG9uZQotZG9uZQotCi0jIyMjIyMjIyMgbm9kZWpzIGNsaWVudCAtIGNfZ2xpYiBzZXJ2ZXIgIyMjIyMjIyMjIyMjIyMKLWZvciBwcm90byBpbiAkKGludGVyc2VjdGlvbiAiJHtub2RlanNfcHJvdG9jb2xzfSIgIiR7Y19nbGliX3Byb3RvY29sc30iKTsgZG8KLSAgZm9yIHRyYW5zIGluICQoaW50ZXJzZWN0aW9uICIke25vZGVqc190cmFuc3BvcnRzfSIgIiR7Y19nbGliX3RyYW5zcG9ydHN9Iik7IGRvCi0gICAgZm9yIHNvY2sgaW4gJChpbnRlcnNlY3Rpb24gIiR7bm9kZWpzX3NvY2tldHN9IiAiJHtjX2dsaWJfc29ja2V0c30iKTsgZG8KLSAgICAgIGNhc2UgIiRzb2NrIiBpbgotICAgICAgICAiaXAiICkgZXh0cmFwYXJhbT0iIjs7Ci0gICAgICAgICJpcC1zc2wiICkgZXh0cmFwYXJhbT0iLS1zc2wiOzsKLSAgICAgIGVzYWMKLSAgICAgIGRvX3Rlc3QgIm5vZGVqcy1jX2dsaWIiICIke3Byb3RvfSIgIiR7dHJhbnN9LSR7c29ja30iIFwKLSAgICAgICAgICAgICAgIm5vZGUgJHtOT0RFX1RFU1RfRElSfS9jbGllbnQuanMgLXAgJHtwcm90b30gLXQgJHt0cmFuc30gLS1wb3J0PSR7VEhSSUZUX1RFU1RfUE9SVH0gJHtleHRyYXBhcmFtfSIgXAotICAgICAgICAgICAgICAiY19nbGliL3Rlc3Rfc2VydmVyIC0tcHJvdG9jb2w9JHtwcm90b30gLS10cmFuc3BvcnQ9JHt0cmFuc30gLS1wb3J0PSR7VEhSSUZUX1RFU1RfUE9SVH0gJHtleHRyYXBhcmFtfSIgXAotICAgICAgICAgICAgICAiNSIgIjAuMSIKLSAgICBkb25lCi0gIGRvbmUKLWRvbmUKLQotIyMjIyMjIyMjIGNfZ2xpYiBjbGllbnQgLSBub2RlanMgc2VydmVyICMjIyMjIyMjIyMjIyMjCi1mb3IgcHJvdG8gaW4gJChpbnRlcnNlY3Rpb24gIiR7Y19nbGliX3Byb3RvY29sc30iICIke25vZGVqc19wcm90b2NvbHN9Iik7IGRvCi0gIGZvciB0cmFucyBpbiAkKGludGVyc2VjdGlvbiAiJHtjX2dsaWJfdHJhbnNwb3J0c30iICIke25vZGVqc190cmFuc3BvcnRzfSIpOyBkbwotICAgIGZvciBzb2NrIGluICQoaW50ZXJzZWN0aW9uICIke2NfZ2xpYl9zb2NrZXRzfSIgIiR7bm9kZWpzX3NvY2tldHN9Iik7IGRvCi0gICAgICBjYXNlICIkc29jayIgaW4KLSAgICAgICAgImlwIiApIGV4dHJhcGFyYW09IiI7OwotICAgICAgICAiaXAtc3NsIiApIGV4dHJhcGFyYW09Ii0tc3NsIjs7Ci0gICAgICBlc2FjCi0gICAgICBkb190ZXN0ICJjX2dsaWItbm9kZWpzIiAiJHtwcm90b30iICIke3RyYW5zfS0ke3NvY2t9IiBcCi0gICAgICAgICAgICAgICJjX2dsaWIvdGVzdF9jbGllbnQgLS1wcm90b2NvbD0ke3Byb3RvfSAgLS10cmFuc3BvcnQ9JHt0cmFuc30gLS1wb3J0PSR7VEhSSUZUX1RFU1RfUE9SVH0gJHtleHRyYXBhcmFtfSIgXAotICAgICAgICAgICAgICAibm9kZSAke05PREVfVEVTVF9ESVJ9L3NlcnZlci5qcyAtcCAke3Byb3RvfSAtdCAke3RyYW5zfSAtLXBvcnQ9JHtUSFJJRlRfVEVTVF9QT1JUfSAke2V4dHJhcGFyYW19IiBcCi0gICAgICAgICAgICAgICIyIiAiMiIKLSAgICBkb25lCi0gIGRvbmUKLWRvbmUKLQotIyMjIyMjIyMjIHB5IGNsaWVudCAtIHB5IHNlcnZlciAjIyMjIyMjIyMjIyMjIwotZm9yIHByb3RvIGluICR7cHlfcHJvdG9jb2xzfTsgZG8KLSAgZm9yIHRyYW5zIGluICR7cHlfdHJhbnNwb3J0c307IGRvCi0gICAgZm9yIHNvY2sgaW4gJHtweV9zb2NrZXRzfTsgZG8KLSAgICAgIGNhc2UgIiRzb2NrIiBpbgotICAgICAgICAiaXAiICkgZXh0cmFwYXJhbT0iIjs7Ci0gICAgICAgICJpcC1zc2wiICkgZXh0cmFwYXJhbT0iLS1zc2wiOzsKLSAgICAgIGVzYWMKLSAgICAgIGRvX3Rlc3QgInB5LXB5IiAiJHtwcm90b30iICIke3RyYW5zfS0ke3NvY2t9IiBcCi0gICAgICAgICAgICAgICJweS9UZXN0Q2xpZW50LnB5IC0tcHJvdG9jb2w9JHtwcm90b30gLS10cmFuc3BvcnQ9e3RyYW5zfSAtLXBvcnQ9JHtUSFJJRlRfVEVTVF9QT1JUfSAtLWhvc3Q9bG9jYWxob3N0IC0tZ2VucHlkaXI9Z2VuLXB5ICR7ZXh0cmFwYXJhbX0iIFwKLSAgICAgICAgICAgICAgInB5L1Rlc3RTZXJ2ZXIucHkgLS1wcm90b2NvbD0ke3Byb3RvfSAtLXRyYW5zcG9ydD17dHJhbnN9IC0tcG9ydD0ke1RIUklGVF9URVNUX1BPUlR9IC0tZ2VucHlkaXI9Z2VuLXB5IFRTaW1wbGVTZXJ2ZXIgJHtleHRyYXBhcmFtfSIgXAotICAgICAgICAgICAgICAiMTAiICIyIgotICAgIGRvbmUKLSAgZG9uZQotZG9uZQotCi1mb3IgdHJhbnMgaW4gJHtweV90cmFuc3BvcnRzfTsgZG8KLSAgICBmb3Igc29jayBpbiAke3B5X3NvY2tldHN9OyBkbwotICAgICAgY2FzZSAiJHNvY2siIGluCi0gICAgICAgICJpcCIgKSBleHRyYXBhcmFtPSIiOzsKLSAgICAgICAgImlwLXNzbCIgKSBleHRyYXBhcmFtPSItLXNzbCI7OwotICAgICAgZXNhYwotICAgICAgZG9fdGVzdCAicHktcHkiICJhY2NlbC1iaW5hcnkiICIke3RyYW5zfS0ke3NvY2t9IiBcCi0gICAgICAgICAgICAgICJweS9UZXN0Q2xpZW50LnB5IC0tcHJvdG9jb2w9YWNjZWwgLS10cmFuc3BvcnQ9JHt0cmFuc30gLS1wb3J0PSR7VEhSSUZUX1RFU1RfUE9SVH0gLS1ob3N0PWxvY2FsaG9zdCAtLWdlbnB5ZGlyPWdlbi1weSAke2V4dHJhcGFyYW19IiBcCi0gICAgICAgICAgICAgICJweS9UZXN0U2VydmVyLnB5IC0tcHJvdG9jb2w9YmluYXJ5IC0tdHJhbnNwb3J0PSR7dHJhbnN9IC0tcG9ydD0ke1RIUklGVF9URVNUX1BPUlR9IC0tZ2VucHlkaXI9Z2VuLXB5IFRTaW1wbGVTZXJ2ZXIgJHtleHRyYXBhcmFtfSIgXAotICAgICAgICAgICAgICAiMTAiICIyIgotICAgICAgZG9fdGVzdCAicHktcHkiICJiaW5hcnktYWNjZWwiICIke3RyYW5zfS0ke3NvY2t9IiBcCi0gICAgICAgICAgICAgICJweS9UZXN0Q2xpZW50LnB5IC0tcHJvdG9jb2w9YmluYXJ5IC0tdHJhbnNwb3J0PXt0cmFuc30gLS1wb3J0PSR7VEhSSUZUX1RFU1RfUE9SVH0gLS1ob3N0PWxvY2FsaG9zdCAtLWdlbnB5ZGlyPWdlbi1weSAke2V4dHJhcGFyYW19IiBcCi0gICAgICAgICAgICAgICJweS9UZXN0U2VydmVyLnB5IC0tcHJvdG9jb2w9YWNjZWwgLS10cmFuc3BvcnQ9e3RyYW5zfSAtLXBvcnQ9JHtUSFJJRlRfVEVTVF9QT1JUfSAtLWdlbnB5ZGlyPWdlbi1weSBUU2ltcGxlU2VydmVyICR7ZXh0cmFwYXJhbX0iIFwKLSAgICAgICAgICAgICAgIjEwIiAiMiIKLSAgICBkb25lCi0gIGRvbmUKLQotIyMjIyMjIyMjIHB5IGNsaWVudCAtIGNwcCBzZXJ2ZXIgIyMjIyMjIyMjIyMjIyMKLWZvciBwcm90byBpbiAkKGludGVyc2VjdGlvbiAiJHtjcHBfcHJvdG9jb2xzfSIgIiR7cHlfcHJvdG9jb2xzfSIpOyBkbwotICBmb3IgdHJhbnMgaW4gJChpbnRlcnNlY3Rpb24gIiR7Y3BwX3RyYW5zcG9ydHN9IiAiJHtweV90cmFuc3BvcnRzfSIpOyBkbwotICAgIGZvciBzb2NrIGluICQoaW50ZXJzZWN0aW9uICIke2NwcF9zb2NrZXRzfSIgIiR7cHlfc29ja2V0c30iKTsgZG8KLSAgICAgIGNhc2UgIiRzb2NrIiBpbgotICAgICAgICAiaXAiICkgZXh0cmFwYXJhbT0iIjs7Ci0gICAgICAgICJpcC1zc2wiICkgZXh0cmFwYXJhbT0iLS1zc2wiOzsKLSAgICAgIGVzYWMKLSAgICAgIGRvX3Rlc3QgInB5LWNwcCIgIiR7cHJvdG99IiAiJHt0cmFuc30tJHtzb2NrfSIgXAotICAgICAgICAgICAgICAicHkvVGVzdENsaWVudC5weSAtLXByb3RvY29sPSR7cHJvdG99IC0tdHJhbnNwb3J0PSR7dHJhbnN9IC0tcG9ydD0ke1RIUklGVF9URVNUX1BPUlR9IC0taG9zdD1sb2NhbGhvc3QgLS1nZW5weWRpcj1nZW4tcHkgJHtleHRyYXBhcmFtfSIgXAotICAgICAgICAgICAgICAiY3BwL1Rlc3RTZXJ2ZXIgLS1wcm90b2NvbD0ke3Byb3RvfSAtLXRyYW5zcG9ydD0ke3RyYW5zfSAtLXBvcnQ9JHtUSFJJRlRfVEVTVF9QT1JUfSAke2V4dHJhcGFyYW19IiBcCi0gICAgICAgICAgICAgICIxMCIgIjIiCi0gICAgZG9uZQotICBkb25lCi1kb25lCi0KLWZvciB0cmFucyBpbiAkKGludGVyc2VjdGlvbiAiJHtjcHBfdHJhbnNwb3J0c30iICIke3B5X3RyYW5zcG9ydHN9Iik7IGRvCi0gICAgZm9yIHNvY2sgaW4gJChpbnRlcnNlY3Rpb24gIiR7Y3BwX3NvY2tldHN9IiAiJHtweV9zb2NrZXRzfSIpOyBkbwotICAgICAgY2FzZSAiJHNvY2siIGluCi0gICAgICAgICJpcCIgKSBleHRyYXBhcmFtPSIiOzsKLSAgICAgICAgImlwLXNzbCIgKSBleHRyYXBhcmFtPSItLXNzbCI7OwotICAgICAgZXNhYwotICAgICAgZG9fdGVzdCAicHktY3BwIiAiYWNjZWwtYmluYXJ5IiAiJHt0cmFuc30tJHtzb2NrfSIgXAotICAgICAgICAgICAgICAicHkvVGVzdENsaWVudC5weSAtLXByb3RvY29sPWFjY2VsIC0tdHJhbnNwb3J0PSR7dHJhbnN9IC0tcG9ydD0ke1RIUklGVF9URVNUX1BPUlR9IC0taG9zdD1sb2NhbGhvc3QgLS1nZW5weWRpcj1nZW4tcHkgJHtleHRyYXBhcmFtfSIgXAotICAgICAgICAgICAgICAiY3BwL1Rlc3RTZXJ2ZXIgLS1wcm90b2NvbD1iaW5hcnkgLS10cmFuc3BvcnQ9JHt0cmFuc30gLS1wb3J0PSR7VEhSSUZUX1RFU1RfUE9SVH0gJHtleHRyYXBhcmFtfSIgXAotICAgICAgICAgICAgICAiMTAiICIyIgotICAgIGRvbmUKLSAgZG9uZQotCi0jIyMjIyMjIyMgY3BwIGNsaWVudCAtIHB5IHNlcnZlciAjIyMjIyMjIyMjIyMjIwotZm9yIHByb3RvIGluICQoaW50ZXJzZWN0aW9uICIke2NwcF9wcm90b2NvbHN9IiAiJHtweV9wcm90b2NvbHN9Iik7IGRvCi0gIGZvciB0cmFucyBpbiAkKGludGVyc2VjdGlvbiAiJHtjcHBfdHJhbnNwb3J0c30iICIke3B5X3RyYW5zcG9ydHN9Iik7IGRvCi0gICAgZm9yIHNvY2sgaW4gJChpbnRlcnNlY3Rpb24gIiR7Y3BwX3NvY2tldHN9IiAiJHtweV9zb2NrZXRzfSIpOyBkbwotICAgICAgY2FzZSAiJHNvY2siIGluCi0gICAgICAgICJpcCIgKSBleHRyYXBhcmFtPSIiOzsKLSAgICAgICAgImlwLXNzbCIgKSBleHRyYXBhcmFtPSItLXNzbCI7OwotICAgICAgZXNhYwotICAgICAgZG9fdGVzdCAiY3BwLXB5IiAiJHtwcm90b30iICIke3RyYW5zfS0ke3NvY2t9IiBcCi0gICAgICAgICAgICAgICJjcHAvVGVzdENsaWVudCAtLXByb3RvY29sPSR7cHJvdG99IC0tdHJhbnNwb3J0PSR7dHJhbnN9IC0tcG9ydD0ke1RIUklGVF9URVNUX1BPUlR9ICR7ZXh0cmFwYXJhbX0iIFwKLSAgICAgICAgICAgICAgInB5L1Rlc3RTZXJ2ZXIucHkgLS1wcm90b2NvbD0ke3Byb3RvfSAtLXRyYW5zcG9ydD0ke3RyYW5zfSAtLXBvcnQ9JHtUSFJJRlRfVEVTVF9QT1JUfSAtLWdlbnB5ZGlyPWdlbi1weSBUU2ltcGxlU2VydmVyICR7ZXh0cmFwYXJhbX0iIFwKLSAgICAgICAgICAgICAgIjEwIiAiMiIKLSAgICBkb25lCi0gIGRvbmUKLWRvbmUKLQotZm9yIHRyYW5zIGluICQoaW50ZXJzZWN0aW9uICIke2NwcF90cmFuc3BvcnRzfSIgIiR7cHlfdHJhbnNwb3J0c30iKTsgZG8KLSAgICBmb3Igc29jayBpbiAkKGludGVyc2VjdGlvbiAiJHtjcHBfc29ja2V0c30iICIke3B5X3NvY2tldHN9Iik7IGRvCi0gICAgICBjYXNlICIkc29jayIgaW4KLSAgICAgICAgImlwIiApIGV4dHJhcGFyYW09IiI7OwotICAgICAgICAiaXAtc3NsIiApIGV4dHJhcGFyYW09Ii0tc3NsIjs7Ci0gICAgICBlc2FjCi0gICAgICBkb190ZXN0ICJjcHAtcHkiICJiaW5hcnktYWNjZWwiICIke3RyYW5zfS0ke3NvY2t9IiBcCi0gICAgICAgICAgICAgICJjcHAvVGVzdENsaWVudCAtLXByb3RvY29sPWJpbmFyeSAtLXRyYW5zcG9ydD0ke3RyYW5zfSAtLXBvcnQ9JHtUSFJJRlRfVEVTVF9QT1JUfSAke2V4dHJhcGFyYW19IiBcCi0gICAgICAgICAgICAgICJweS9UZXN0U2VydmVyLnB5IC0tcHJvdG9jb2w9YWNjZWwgLS10cmFuc3BvcnQ9JHt0cmFuc30gLS1wb3J0PSR7VEhSSUZUX1RFU1RfUE9SVH0gLS1nZW5weWRpcj1nZW4tcHkgVFNpbXBsZVNlcnZlciAke2V4dHJhcGFyYW19IiBcCi0gICAgICAgICAgICAgICIxMCIgIjIiCi0gICAgZG9uZQotICBkb25lCi0KLSMjIyMjIyMjIyBweSBjbGllbnQgLSBqYXZhIHNlcnZlciAjIyMjIyMjIyMjIyMjIwotZm9yIHByb3RvIGluICQoaW50ZXJzZWN0aW9uICIke3B5X3Byb3RvY29sc30iICIke2phdmFfcHJvdG9jb2xzfSIpOyBkbwotICBmb3IgdHJhbnMgaW4gJChpbnRlcnNlY3Rpb24gIiR7cHlfdHJhbnNwb3J0c30iICIke2phdmFfc2VydmVyX3RyYW5zcG9ydHN9Iik7IGRvCi0gICAgZm9yIHNvY2sgaW4gJChpbnRlcnNlY3Rpb24gIiR7cHlfc29ja2V0c30iICIke2phdmFfc29ja2V0c30iKTsgZG8KLSAgICAgIGNhc2UgIiRzb2NrIiBpbgotICAgICAgICAiaXAiICkgZXh0cmFwYXJhbT0iIjs7Ci0gICAgICAgICJpcC1zc2wiICkgZXh0cmFwYXJhbT0iLS1zc2wiOzsKLSAgICAgIGVzYWMKLSAgICAgIGRvX3Rlc3QgInB5LWphdmEiICIke3Byb3RvfSIgIiR7dHJhbnN9LSR7c29ja30iIFwKLSAgICAgICAgICAgICAgInB5L1Rlc3RDbGllbnQucHkgLS1wcm90b2NvbD0ke3Byb3RvfSAtLXRyYW5zcG9ydD0ke3RyYW5zfSAtLXBvcnQ9JHtUSFJJRlRfVEVTVF9QT1JUfSAtLWhvc3Q9bG9jYWxob3N0IC0tZ2VucHlkaXI9Z2VuLXB5ICR7ZXh0cmFwYXJhbX0iIFwKLSAgICAgICAgICAgICAgImFudCAtZiAgLi4vbGliL2phdmEvYnVpbGQueG1sIC1Ebm8tZ2VuLXRocmlmdD1cIlwiIC1EdGVzdGFyZ3MgXCItLXByb3RvY29sPSR7cHJvdG99IC0tdHJhbnNwb3J0PSR7dHJhbnN9IC0tcG9ydD0ke1RIUklGVF9URVNUX1BPUlR9ICR7ZXh0cmFwYXJhbX1cIiBydW4tdGVzdHNlcnZlciIgXAotICAgICAgICAgICAgICAiMTUiICIyIgotICAgIGRvbmUKLSAgZG9uZQotZG9uZQotCi1mb3IgdHJhbnMgaW4gJChpbnRlcnNlY3Rpb24gIiR7cHlfdHJhbnNwb3J0c30iICIke2phdmFfc2VydmVyX3RyYW5zcG9ydHN9Iik7IGRvCi0gICAgZm9yIHNvY2sgaW4gJChpbnRlcnNlY3Rpb24gIiR7cHlfc29ja2V0c30iICIke2phdmFfc29ja2V0c30iKTsgZG8KLSAgICAgIGNhc2UgIiRzb2NrIiBpbgotICAgICAgICAiaXAiICkgZXh0cmFwYXJhbT0iIjs7Ci0gICAgICAgICJpcC1zc2wiICkgZXh0cmFwYXJhbT0iLS1zc2wiOzsKLSAgICAgIGVzYWMKLSAgICAgIGRvX3Rlc3QgInB5LWphdmEiICJhY2NlbC1iaW5hcnkiICIke3RyYW5zfS0ke3NvY2t9IiBcCi0gICAgICAgICAgICAgICJweS9UZXN0Q2xpZW50LnB5IC0tcHJvdG9jb2w9YWNjZWwgLS10cmFuc3BvcnQ9JHt0cmFuc30gLS1wb3J0PSR7VEhSSUZUX1RFU1RfUE9SVH0gLS1ob3N0PWxvY2FsaG9zdCAtLWdlbnB5ZGlyPWdlbi1weSAke2V4dHJhcGFyYW19IiBcCi0gICAgICAgICAgICAgICJhbnQgLWYgIC4uL2xpYi9qYXZhL2J1aWxkLnhtbCAtRG5vLWdlbi10aHJpZnQ9XCJcIiAtRHRlc3RhcmdzIFwiLS1wcm90b2NvbD1iaW5hcnkgLS10cmFuc3BvcnQ9JHt0cmFuc30gLS1wb3J0PSR7VEhSSUZUX1RFU1RfUE9SVH0gJHtleHRyYXBhcmFtfVwiIHJ1bi10ZXN0c2VydmVyIiBcCi0gICAgICAgICAgICAgICIxNSIgIjIiCi0gICAgZG9uZQotICBkb25lCi0KLSMjIyMjIyMjIyBqYXZhIGNsaWVudCAtIHB5IHNlcnZlciAjIyMjIyMjIyMjIyMjIwotZm9yIHByb3RvIGluICQoaW50ZXJzZWN0aW9uICIke3B5X3Byb3RvY29sc30iICIke2phdmFfcHJvdG9jb2xzfSIpOyBkbwotICBmb3IgdHJhbnMgaW4gJChpbnRlcnNlY3Rpb24gIiR7cHlfdHJhbnNwb3J0c30iICIke2phdmFfY2xpZW50X3RyYW5zcG9ydHN9Iik7IGRvCi0gICAgZm9yIHNvY2sgaW4gJChpbnRlcnNlY3Rpb24gIiR7cHlfc29ja2V0c30iICIke2phdmFfc29ja2V0c30iKTsgZG8KLSAgICAgIGNhc2UgIiRzb2NrIiBpbgotICAgICAgICAiaXAiICkgZXh0cmFwYXJhbT0iIjs7Ci0gICAgICAgICJpcC1zc2wiICkgZXh0cmFwYXJhbT0iLS1zc2wiOzsKLSAgICAgIGVzYWMKLSAgICAgIGRvX3Rlc3QgImphdmEtcHkiICIke3Byb3RvfSIgIiR7dHJhbnN9LSR7c29ja30iIFwKLSAgICAgICAgICAgICAgImFudCAtZiAgLi4vbGliL2phdmEvYnVpbGQueG1sIC1Ebm8tZ2VuLXRocmlmdD1cIlwiIC1EdGVzdGFyZ3MgXCItLXByb3RvY29sPSR7cHJvdG99IC0tdHJhbnNwb3J0PSR7dHJhbnN9IC0tcG9ydD0ke1RIUklGVF9URVNUX1BPUlR9ICR7ZXh0cmFwYXJhbX1cIiBydW4tdGVzdGNsaWVudCIgXAotICAgICAgICAgICAgICAicHkvVGVzdFNlcnZlci5weSAtLXByb3RvY29sPSR7cHJvdG99IC0tdHJhbnNwb3J0PSR7dHJhbnN9IC0tcG9ydD0ke1RIUklGVF9URVNUX1BPUlR9IC0tZ2VucHlkaXI9Z2VuLXB5IFRTaW1wbGVTZXJ2ZXIgJHtleHRyYXBhcmFtfSIgXAotICAgICAgICAgICAgICAiMTAiICI1IgotICAgIGRvbmUKLSAgZG9uZQotZG9uZQotCi1mb3IgdHJhbnMgaW4gJChpbnRlcnNlY3Rpb24gIiR7cHlfdHJhbnNwb3J0c30iICIke2phdmFfY2xpZW50X3RyYW5zcG9ydHN9Iik7IGRvCi0gICAgZm9yIHNvY2sgaW4gJChpbnRlcnNlY3Rpb24gIiR7cHlfc29ja2V0c30iICIke2phdmFfc29ja2V0c30iKTsgZG8KLSAgICAgIGNhc2UgIiRzb2NrIiBpbgotICAgICAgICAiaXAiICkgZXh0cmFwYXJhbT0iIjs7Ci0gICAgICAgICJpcC1zc2wiICkgZXh0cmFwYXJhbT0iLS1zc2wiOzsKLSAgICAgIGVzYWMKLSAgICAgIGRvX3Rlc3QgImphdmEtcHkiICJiaW5hcnktYWNjZWwiICIke3RyYW5zfS0ke3NvY2t9IiBcCi0gICAgICAgICAgICAgICJhbnQgLWYgIC4uL2xpYi9qYXZhL2J1aWxkLnhtbCAtRG5vLWdlbi10aHJpZnQ9XCJcIiAtRHRlc3RhcmdzIFwiLS1wcm90b2NvbD1iaW5hcnkgLS10cmFuc3BvcnQ9JHt0cmFuc30gLS1wb3J0PSR7VEhSSUZUX1RFU1RfUE9SVH0gJHtleHRyYXBhcmFtfVwiIHJ1bi10ZXN0Y2xpZW50IiBcCi0gICAgICAgICAgICAgICJweS9UZXN0U2VydmVyLnB5IC0tcHJvdG9jb2w9YWNjZWwgLS10cmFuc3BvcnQ9JHt0cmFuc30gLS1wb3J0PSR7VEhSSUZUX1RFU1RfUE9SVH0gLS1nZW5weWRpcj1nZW4tcHkgVFNpbXBsZVNlcnZlciAke2V4dHJhcGFyYW19IiBcCi0gICAgICAgICAgICAgICIxMCIgIjUiCi0gICAgZG9uZQotICBkb25lCi0KLSMjIyMjIyMjIyBweSBjbGllbnQgLSBjX2dsaWIgc2VydmVyICMjIyMjIyMjIyMjIyMjCi1mb3IgcHJvdG8gaW4gJChpbnRlcnNlY3Rpb24gIiR7cHlfcHJvdG9jb2xzfSIgIiR7Y19nbGliX3Byb3RvY29sc30iKTsgZG8KLSAgZm9yIHRyYW5zIGluICQoaW50ZXJzZWN0aW9uICIke3B5X3RyYW5zcG9ydHN9IiAiJHtjX2dsaWJfdHJhbnNwb3J0c30iKTsgZG8KLSAgICBmb3Igc29jayBpbiAkKGludGVyc2VjdGlvbiAiJHtweV9zb2NrZXRzfSIgIiR7Y19nbGliX3NvY2tldHN9Iik7IGRvCi0gICAgICBjYXNlICIkc29jayIgaW4KLSAgICAgICAgImlwIiApIGV4dHJhcGFyYW09IiI7OwotICAgICAgICAiaXAtc3NsIiApIGV4dHJhcGFyYW09Ii0tc3NsIjs7Ci0gICAgICBlc2FjCi0gICAgICBkb190ZXN0ICJweS1jX2dsaWIiICIke3Byb3RvfSIgIiR7dHJhbnN9LSR7c29ja30iIFwKLSAgICAgICAgICAgICAgInB5L1Rlc3RDbGllbnQucHkgLS1wcm90b2NvbD0ke3Byb3RvfSAtLXRyYW5zcG9ydD0ke3RyYW5zfSAtLXBvcnQ9JHtUSFJJRlRfVEVTVF9QT1JUfSAtLWhvc3Q9bG9jYWxob3N0IC0tZ2VucHlkaXI9Z2VuLXB5ICR7ZXh0cmFwYXJhbX0iIFwKLSAgICAgICAgICAgICAgImNfZ2xpYi90ZXN0X3NlcnZlciAtLXByb3RvY29sPSR7cHJvdG99IC0tdHJhbnNwb3J0PSR7dHJhbnN9IC0tcG9ydD0ke1RIUklGVF9URVNUX1BPUlR9ICR7ZXh0cmFwYXJhbX0iIFwKLSAgICAgICAgICAgICAgIjEwIiAiMC4xIgotICAgIGRvbmUKLSAgZG9uZQotZG9uZQotCi1mb3IgdHJhbnMgaW4gJChpbnRlcnNlY3Rpb24gIiR7cHlfdHJhbnNwb3J0c30iICIke2NfZ2xpYl90cmFuc3BvcnRzfSIpOyBkbwotICAgIGZvciBzb2NrIGluICQoaW50ZXJzZWN0aW9uICIke3B5X3NvY2tldHN9IiAiJHtjX2dsaWJfc29ja2V0c30iKTsgZG8KLSAgICAgIGNhc2UgIiRzb2NrIiBpbgotICAgICAgICAiaXAiICkgZXh0cmFwYXJhbT0iIjs7Ci0gICAgICAgICJpcC1zc2wiICkgZXh0cmFwYXJhbT0iLS1zc2wiOzsKLSAgICAgIGVzYWMKLSAgICAgIGRvX3Rlc3QgInB5LWNfZ2xpYiIgImFjY2VsLWJpbmFyeSIgIiR7dHJhbnN9LSR7c29ja30iIFwKLSAgICAgICAgICAgICAgInB5L1Rlc3RDbGllbnQucHkgLS1wcm90b2NvbD1hY2NlbCAtLXRyYW5zcG9ydD0ke3RyYW5zfSAtLXBvcnQ9JHtUSFJJRlRfVEVTVF9QT1JUfSAtLWhvc3Q9bG9jYWxob3N0IC0tZ2VucHlkaXI9Z2VuLXB5ICR7ZXh0cmFwYXJhbX0iIFwKLSAgICAgICAgICAgICAgImNfZ2xpYi90ZXN0X3NlcnZlciAtLXByb3RvY29sPWJpbmFyeSAtLXRyYW5zcG9ydD0ke3RyYW5zfSAtLXBvcnQ9JHtUSFJJRlRfVEVTVF9QT1JUfSAke2V4dHJhcGFyYW19IiBcCi0gICAgICAgICAgICAgICIxMCIgIjAuMSIKLSAgICBkb25lCi0gIGRvbmUKLQotIyMjIyMjIyMjIGNfZ2xpYiBjbGllbnQgLSBweSBzZXJ2ZXIgIyMjIyMjIyMjIyMjIyMKLWZvciBwcm90byBpbiAkKGludGVyc2VjdGlvbiAiJHtjX2dsaWJfcHJvdG9jb2xzfSIgIiR7cHlfcHJvdG9jb2xzfSIpOyBkbwotICBmb3IgdHJhbnMgaW4gJChpbnRlcnNlY3Rpb24gIiR7Y19nbGliX3RyYW5zcG9ydHN9IiAiJHtweV90cmFuc3BvcnRzfSIpOyBkbwotICAgIGZvciBzb2NrIGluICQoaW50ZXJzZWN0aW9uICIke2NfZ2xpYl9zb2NrZXRzfSIgIiR7cHlfc29ja2V0c30iKTsgZG8KLSAgICAgIGNhc2UgIiRzb2NrIiBpbgotICAgICAgICAiaXAiICkgZXh0cmFwYXJhbT0iIjs7Ci0gICAgICAgICJpcC1zc2wiICkgZXh0cmFwYXJhbT0iLS1zc2wiOzsKLSAgICAgIGVzYWMKLSAgICAgIGRvX3Rlc3QgImNfZ2xpYi1weSIgIiR7cHJvdG99IiAiJHt0cmFuc30tJHtzb2NrfSIgXAotICAgICAgICAgICAgICAiY19nbGliL3Rlc3RfY2xpZW50IC0tcHJvdG9jb2w9JHtwcm90b30gIC0tdHJhbnNwb3J0PSR7dHJhbnN9IC0tcG9ydD0ke1RIUklGVF9URVNUX1BPUlR9ICR7ZXh0cmFwYXJhbX0iIFwKLSAgICAgICAgICAgICAgInB5L1Rlc3RTZXJ2ZXIucHkgLS1wcm90b2NvbD0ke3Byb3RvfSAtLXRyYW5zcG9ydD0ke3RyYW5zfSAtLXBvcnQ9JHtUSFJJRlRfVEVTVF9QT1JUfSAtLWdlbnB5ZGlyPWdlbi1weSBUU2ltcGxlU2VydmVyICR7ZXh0cmFwYXJhbX0iIFwKLSAgICAgICAgICAgICAgIjIiICIyIgotICAgIGRvbmUKLSAgZG9uZQotZG9uZQotCi1mb3IgdHJhbnMgaW4gJChpbnRlcnNlY3Rpb24gIiR7Y19nbGliX3RyYW5zcG9ydHN9IiAiJHtweV90cmFuc3BvcnRzfSIpOyBkbwotICAgIGZvciBzb2NrIGluICQoaW50ZXJzZWN0aW9uICIke2NfZ2xpYl9zb2NrZXRzfSIgIiR7cHlfc29ja2V0c30iKTsgZG8KLSAgICAgIGNhc2UgIiRzb2NrIiBpbgotICAgICAgICAiaXAiICkgZXh0cmFwYXJhbT0iIjs7Ci0gICAgICAgICJpcC1zc2wiICkgZXh0cmFwYXJhbT0iLS1zc2wiOzsKLSAgICAgIGVzYWMKLSAgICAgIGRvX3Rlc3QgImNfZ2xpYi1weSIgImJpbmFyeS1hY2NlbCIgIiR7dHJhbnN9LSR7c29ja30iIFwKLSAgICAgICAgICAgICAgImNfZ2xpYi90ZXN0X2NsaWVudCAtLXByb3RvY29sPWJpbmFyeSAtLXRyYW5zcG9ydD0ke3RyYW5zfSAtLXBvcnQ9JHtUSFJJRlRfVEVTVF9QT1JUfSAke2V4dHJhcGFyYW19IiBcCi0gICAgICAgICAgICAgICJweS9UZXN0U2VydmVyLnB5IC0tcHJvdG9jb2w9YWNjZWwgLS10cmFuc3BvcnQ9JHt0cmFuc30gLS1wb3J0PSR7VEhSSUZUX1RFU1RfUE9SVH0gLS1nZW5weWRpcj1nZW4tcHkgVFNpbXBsZVNlcnZlciAke2V4dHJhcGFyYW19IiBcCi0gICAgICAgICAgICAgICIxMCIgIjIiCi0gICAgZG9uZQotICBkb25lCi0KLSMjIyMjIyMjIyBweSBjbGllbnQgLSBub2RlanMgc2VydmVyICMjIyMjIyMjIyMjIyMjCi1mb3IgcHJvdG8gaW4gJChpbnRlcnNlY3Rpb24gIiR7cHlfcHJvdG9jb2xzfSIgIiR7bm9kZWpzX3Byb3RvY29sc30iKTsgZG8KLSAgZm9yIHRyYW5zIGluICQoaW50ZXJzZWN0aW9uICIke3B5X3RyYW5zcG9ydHN9IiAiJHtub2RlanNfdHJhbnNwb3J0c30iKTsgZG8KLSAgICBmb3Igc29jayBpbiAkKGludGVyc2VjdGlvbiAiJHtweV9zb2NrZXRzfSIgIiR7bm9kZWpzX3NvY2tldHN9Iik7IGRvCi0gICAgICBjYXNlICIkc29jayIgaW4KLSAgICAgICAgImlwIiApIGV4dHJhcGFyYW09IiI7OwotICAgICAgICAiaXAtc3NsIiApIGV4dHJhcGFyYW09Ii0tc3NsIjs7Ci0gICAgICBlc2FjCi0gICAgICBkb190ZXN0ICJweS1ub2RlanMiICIke3Byb3RvfSIgIiR7dHJhbnN9LSR7c29ja30iIFwKLSAgICAgICAgICAgICAgInB5L1Rlc3RDbGllbnQucHkgLS1wcm90b2NvbD0ke3Byb3RvfSAtLXRyYW5zcG9ydD0ke3RyYW5zfSAtLXBvcnQ9JHtUSFJJRlRfVEVTVF9QT1JUfSAtLWhvc3Q9bG9jYWxob3N0IC0tZ2VucHlkaXI9Z2VuLXB5ICR7ZXh0cmFwYXJhbX0iIFwKLSAgICAgICAgICAgICAgIm5vZGUgJHtOT0RFX1RFU1RfRElSfS9zZXJ2ZXIuanMgLXAgJHtwcm90b30gLXQgJHt0cmFuc30gLS1wb3J0PSR7VEhSSUZUX1RFU1RfUE9SVH0gJHtleHRyYXBhcmFtfSIgXAotICAgICAgICAgICAgICAiMTUiICIyIgotICAgIGRvbmUKLSAgZG9uZQotZG9uZQotCi1mb3IgdHJhbnMgaW4gJChpbnRlcnNlY3Rpb24gIiR7cHlfdHJhbnNwb3J0c30iICIke25vZGVqc190cmFuc3BvcnRzfSIpOyBkbwotICAgIGZvciBzb2NrIGluICQoaW50ZXJzZWN0aW9uICIke3B5X3NvY2tldHN9IiAiJHtub2RlanNfc29ja2V0c30iKTsgZG8KLSAgICAgIGNhc2UgIiRzb2NrIiBpbgotICAgICAgICAiaXAiICkgZXh0cmFwYXJhbT0iIjs7Ci0gICAgICAgICJpcC1zc2wiICkgZXh0cmFwYXJhbT0iLS1zc2wiOzsKLSAgICAgIGVzYWMKLSAgICAgIGRvX3Rlc3QgInB5LW5vZGVqcyIgIiR7cHJvdG99IiAiJHt0cmFuc30tJHtzb2NrfSIgXAotICAgICAgICAgICAgICAicHkvVGVzdENsaWVudC5weSAtLXByb3RvY29sPWFjY2VsIC0tdHJhbnNwb3J0PSR7dHJhbnN9IC0tcG9ydD0ke1RIUklGVF9URVNUX1BPUlR9IC0taG9zdD1sb2NhbGhvc3QgLS1nZW5weWRpcj1nZW4tcHkgJHtleHRyYXBhcmFtfSIgXAotICAgICAgICAgICAgICAibm9kZSAke05PREVfVEVTVF9ESVJ9L3NlcnZlci5qcyAtcCBiaW5hcnkgLXQgJHt0cmFuc30gLS1wb3J0PSR7VEhSSUZUX1RFU1RfUE9SVH0gJHtleHRyYXBhcmFtfSIgXAotICAgICAgICAgICAgICAiMTUiICIyIgotICAgIGRvbmUKLSAgZG9uZQotCi0jIyMjIyMjIyMgbm9kZWpzIGNsaWVudCAtIHB5IHNlcnZlciAjIyMjIyMjIyMjIyMjIwotZm9yIHByb3RvIGluICQoaW50ZXJzZWN0aW9uICIke3B5X3Byb3RvY29sc30iICIke25vZGVqc19wcm90b2NvbHN9Iik7IGRvCi0gIGZvciB0cmFucyBpbiAkKGludGVyc2VjdGlvbiAiJHtweV90cmFuc3BvcnRzfSIgIiR7bm9kZWpzX3RyYW5zcG9ydHN9Iik7IGRvCi0gICAgZm9yIHNvY2sgaW4gJChpbnRlcnNlY3Rpb24gIiR7cHlfc29ja2V0c30iICIke25vZGVqc19zb2NrZXRzfSIpOyBkbwotICAgICAgY2FzZSAiJHNvY2siIGluCi0gICAgICAgICJpcCIgKSBleHRyYXBhcmFtPSIiOzsKLSAgICAgICAgImlwLXNzbCIgKSBleHRyYXBhcmFtPSItLXNzbCI7OwotICAgICAgZXNhYwotICAgICAgZG9fdGVzdCAibm9kZWpzLXB5IiAiJHtwcm90b30iICIke3RyYW5zfS0ke3NvY2t9IiBcCi0gICAgICAgICAgICAgICJub2RlICR7Tk9ERV9URVNUX0RJUn0vY2xpZW50LmpzIC1wICR7cHJvdG99IC10ICR7dHJhbnN9IC0tcG9ydD0ke1RIUklGVF9URVNUX1BPUlR9ICR7ZXh0cmFwYXJhbX0iIFwKLSAgICAgICAgICAgICAgInB5L1Rlc3RTZXJ2ZXIucHkgLS1wcm90b2NvbD0ke3Byb3RvfSAtLXRyYW5zcG9ydD0ke3RyYW5zfSAtLXBvcnQ9JHtUSFJJRlRfVEVTVF9QT1JUfSAtLWdlbnB5ZGlyPWdlbi1weSBUU2ltcGxlU2VydmVyICR7ZXh0cmFwYXJhbX0iIFwKLSAgICAgICAgICAgICAgIjEwIiAiMiIKLSAgICBkb25lCi0gIGRvbmUKLWRvbmUKLQotZm9yIHRyYW5zIGluICQoaW50ZXJzZWN0aW9uICIke3B5X3RyYW5zcG9ydHN9IiAiJHtub2RlanNfdHJhbnNwb3J0c30iKTsgZG8KLSAgICBmb3Igc29jayBpbiAkKGludGVyc2VjdGlvbiAiJHtweV9zb2NrZXRzfSIgIiR7bm9kZWpzX3NvY2tldHN9Iik7IGRvCi0gICAgICBjYXNlICIkc29jayIgaW4KLSAgICAgICAgImlwIiApIGV4dHJhcGFyYW09IiI7OwotICAgICAgICAiaXAtc3NsIiApIGV4dHJhcGFyYW09Ii0tc3NsIjs7Ci0gICAgICBlc2FjCi0gICAgICBkb190ZXN0ICJub2RlanMtcHkiICJiaW5hcnktYWNjZWwiICIke3RyYW5zfS0ke3NvY2t9IiBcCi0gICAgICAgICAgICAgICJub2RlICR7Tk9ERV9URVNUX0RJUn0vY2xpZW50LmpzIC1wIGJpbmFyeSAtdCAke3RyYW5zfSAtLXBvcnQ9JHtUSFJJRlRfVEVTVF9QT1JUfSAke2V4dHJhcGFyYW19IiBcCi0gICAgICAgICAgICAgICJweS9UZXN0U2VydmVyLnB5IC0tcHJvdG9jb2w9YWNjZWwgLS10cmFuc3BvcnQ9JHt0cmFuc30gLS1wb3J0PSR7VEhSSUZUX1RFU1RfUE9SVH0gLS1nZW5weWRpcj1nZW4tcHkgVFNpbXBsZVNlcnZlciAke2V4dHJhcGFyYW19IiBcCi0gICAgICAgICAgICAgICIxMCIgIjIiCi0gICAgZG9uZQotICBkb25lCi0KLSMjIyMjIyMjIyBydWJ5IGNsaWVudCAtIHJ1Ynkgc2VydmVyICMjIyMjIyMjIyMjIyMjCi1mb3IgcHJvdG8gaW4gJHtydWJ5X3Byb3RvY29sc307IGRvCi0gIGZvciB0cmFucyBpbiAke3J1YnlfdHJhbnNwb3J0c307IGRvCi0gICAgZm9yIHNvY2sgaW4gJHtydWJ5X3NvY2tldHN9OyBkbwotICAgICAgY2FzZSAiJHNvY2siIGluCi0gICAgICAgICJpcCIgKSBleHRyYXBhcmFtPSIiOzsKLSAgICAgICAgImlwLXNzbCIgKSBleHRyYXBhcmFtPSItLXNzbCI7OwotICAgICAgZXNhYwotICAgICAgZG9fdGVzdCAicnVieS1ydWJ5IiAiJHtwcm90b30iICIke3RyYW5zfS0ke3NvY2t9IiBcCi0gICAgICAgICAgICAgICJydWJ5IHJiL2ludGVncmF0aW9uL1Rlc3RDbGllbnQucmIgLS1wcm90b2NvbD0ke3Byb3RvfSAtLXRyYW5zcG9ydD0ke3RyYW5zfSAtLXBvcnQ9JHtUSFJJRlRfVEVTVF9QT1JUfSAke2V4dHJhcGFyYW19IiBcCi0gICAgICAgICAgICAgICJydWJ5IHJiL2ludGVncmF0aW9uL1Rlc3RTZXJ2ZXIucmIgLS1wcm90b2NvbD0ke3Byb3RvfSAtLXRyYW5zcG9ydD0ke3RyYW5zfSAtLXBvcnQ9JHtUSFJJRlRfVEVTVF9QT1JUfSAke2V4dHJhcGFyYW19IiBcCi0gICAgICAgICAgICAgICI1IiAiNSIKLSAgICBkb25lCi0gIGRvbmUKLWRvbmUKLQotZm9yIHRyYW5zIGluICR7cnVieV90cmFuc3BvcnRzfTsgZG8KLSAgICBmb3Igc29jayBpbiAke3J1Ynlfc29ja2V0c307IGRvCi0gICAgICBjYXNlICIkc29jayIgaW4KLSAgICAgICAgImlwIiApIGV4dHJhcGFyYW09IiI7OwotICAgICAgICAiaXAtc3NsIiApIGV4dHJhcGFyYW09Ii0tc3NsIjs7Ci0gICAgICBlc2FjCi0gICAgICBkb190ZXN0ICJydWJ5LXJ1YnkiICJhY2NlbC1iaW5hcnkiICIke3RyYW5zfS0ke3NvY2t9IiBcCi0gICAgICAgICAgICAgICJydWJ5IHJiL2ludGVncmF0aW9uL1Rlc3RDbGllbnQucmIgLS1wcm90b2NvbD1hY2NlbCAtLXRyYW5zcG9ydD0ke3RyYW5zfSAtLXBvcnQ9JHtUSFJJRlRfVEVTVF9QT1JUfSAke2V4dHJhcGFyYW19IiBcCi0gICAgICAgICAgICAgICJydWJ5IHJiL2ludGVncmF0aW9uL1Rlc3RTZXJ2ZXIucmIgLS1wcm90b2NvbD1iaW5hcnkgLS10cmFuc3BvcnQ9JHt0cmFuc30gLS1wb3J0PSR7VEhSSUZUX1RFU1RfUE9SVH0gJHtleHRyYXBhcmFtfSIgXAotICAgICAgICAgICAgICAiNSIgIjUiCi0gICAgICBkb190ZXN0ICJydWJ5LXJ1YnkiICJiaW5hcnktYWNjZWwiICIke3RyYW5zfS0ke3NvY2t9IiBcCi0gICAgICAgICAgICAgICJydWJ5IHJiL2ludGVncmF0aW9uL1Rlc3RDbGllbnQucmIgLS1wcm90b2NvbD1iaW5hcnkgLS10cmFuc3BvcnQ9JHt0cmFuc30gLS1wb3J0PSR7VEhSSUZUX1RFU1RfUE9SVH0gJHtleHRyYXBhcmFtfSIgXAotICAgICAgICAgICAgICAicnVieSByYi9pbnRlZ3JhdGlvbi9UZXN0U2VydmVyLnJiIC0tcHJvdG9jb2w9YWNjZWwgLS10cmFuc3BvcnQ9JHt0cmFuc30gLS1wb3J0PSR7VEhSSUZUX1RFU1RfUE9SVH0gJHtleHRyYXBhcmFtfSIgXAotICAgICAgICAgICAgICAiNSIgIjUiCi0gICAgZG9uZQotICBkb25lCi0KLSMjIyMjIyMjIyBydWJ5IGNsaWVudCAtIGNwcCBzZXJ2ZXIgIyMjIyMjIyMjIyMjIyMKLWZvciBwcm90byBpbiAkKGludGVyc2VjdGlvbiAiJHtjcHBfcHJvdG9jb2xzfSIgIiR7cnVieV9wcm90b2NvbHN9Iik7IGRvCi0gIGZvciB0cmFucyBpbiAkKGludGVyc2VjdGlvbiAiJHtjcHBfdHJhbnNwb3J0c30iICIke3J1YnlfdHJhbnNwb3J0c30iKTsgZG8KLSAgICBmb3Igc29jayBpbiAkKGludGVyc2VjdGlvbiAiJHtjcHBfc29ja2V0c30iICIke3J1Ynlfc29ja2V0c30iKTsgZG8KLSAgICAgIGNhc2UgIiRzb2NrIiBpbgotICAgICAgICAiaXAiICkgZXh0cmFwYXJhbT0iIjs7Ci0gICAgICAgICJpcC1zc2wiICkgZXh0cmFwYXJhbT0iLS1zc2wiOzsKLSAgICAgIGVzYWMKLSAgICAgIGRvX3Rlc3QgInJ1YnktY3BwIiAiJHtwcm90b30iICIke3RyYW5zfS0ke3NvY2t9IiBcCi0gICAgICAgICAgICAgICJydWJ5IHJiL2ludGVncmF0aW9uL1Rlc3RDbGllbnQucmIgLS1wcm90b2NvbD0ke3Byb3RvfSAtLXRyYW5zcG9ydD0ke3RyYW5zfSAtLXBvcnQ9JHtUSFJJRlRfVEVTVF9QT1JUfSAke2V4dHJhcGFyYW19IiBcCi0gICAgICAgICAgICAgICJjcHAvVGVzdFNlcnZlciAtLXByb3RvY29sPSR7cHJvdG99IC0tdHJhbnNwb3J0PSR7dHJhbnN9IC0tcG9ydD0ke1RIUklGVF9URVNUX1BPUlR9ICR7ZXh0cmFwYXJhbX0iIFwKLSAgICAgICAgICAgICAgIjUiICI1IgotICAgIGRvbmUKLSAgZG9uZQotZG9uZQotCi1mb3IgdHJhbnMgaW4gJChpbnRlcnNlY3Rpb24gIiR7Y3BwX3RyYW5zcG9ydHN9IiAiJHtydWJ5X3RyYW5zcG9ydHN9Iik7IGRvCi0gICAgZm9yIHNvY2sgaW4gJChpbnRlcnNlY3Rpb24gIiR7Y3BwX3NvY2tldHN9IiAiJHtydWJ5X3NvY2tldHN9Iik7IGRvCi0gICAgICBjYXNlICIkc29jayIgaW4KLSAgICAgICAgImlwIiApIGV4dHJhcGFyYW09IiI7OwotICAgICAgICAiaXAtc3NsIiApIGV4dHJhcGFyYW09Ii0tc3NsIjs7Ci0gICAgICBlc2FjCi0gICAgICBkb190ZXN0ICJydWJ5LWNwcCIgImFjY2VsLWJpbmFyeSIgIiR7dHJhbnN9LSR7c29ja30iIFwKLSAgICAgICAgICAgICAgInJ1YnkgcmIvaW50ZWdyYXRpb24vVGVzdENsaWVudC5yYiAtLXByb3RvY29sPWFjY2VsIC0tdHJhbnNwb3J0PSR7dHJhbnN9IC0tcG9ydD0ke1RIUklGVF9URVNUX1BPUlR9ICR7ZXh0cmFwYXJhbX0iIFwKLSAgICAgICAgICAgICAgImNwcC9UZXN0U2VydmVyIC0tcHJvdG9jb2w9YmluYXJ5IC0tdHJhbnNwb3J0PSR7dHJhbnN9IC0tcG9ydD0ke1RIUklGVF9URVNUX1BPUlR9ICR7ZXh0cmFwYXJhbX0iIFwKLSAgICAgICAgICAgICAgIjUiICI1IgotICAgIGRvbmUKLSAgZG9uZQotCi0jIyMjIyMjIyMgY3BwIGNsaWVudCAtIHJ1Ynkgc2VydmVyICMjIyMjIyMjIyMjIyMjCi1mb3IgcHJvdG8gaW4gJChpbnRlcnNlY3Rpb24gIiR7Y3BwX3Byb3RvY29sc30iICIke3J1YnlfcHJvdG9jb2xzfSIpOyBkbwotICBmb3IgdHJhbnMgaW4gJChpbnRlcnNlY3Rpb24gIiR7Y3BwX3RyYW5zcG9ydHN9IiAiJHtydWJ5X3RyYW5zcG9ydHN9Iik7IGRvCi0gICAgZm9yIHNvY2sgaW4gJChpbnRlcnNlY3Rpb24gIiR7Y3BwX3NvY2tldHN9IiAiJHtydWJ5X3NvY2tldHN9Iik7IGRvCi0gICAgICBjYXNlICIkc29jayIgaW4KLSAgICAgICAgImlwIiApIGV4dHJhcGFyYW09IiI7OwotICAgICAgICAiaXAtc3NsIiApIGV4dHJhcGFyYW09Ii0tc3NsIjs7Ci0gICAgICBlc2FjCi0gICAgICBkb190ZXN0ICJjcHAtcnVieSIgIiR7cHJvdG99IiAiJHt0cmFuc30tJHtzb2NrfSIgXAotICAgICAgICAgICAgICAiY3BwL1Rlc3RDbGllbnQgLS1wcm90b2NvbD0ke3Byb3RvfSAtLXRyYW5zcG9ydD0ke3RyYW5zfSAtLXBvcnQ9JHtUSFJJRlRfVEVTVF9QT1JUfSAtLXBvcnQ9JHtUSFJJRlRfVEVTVF9QT1JUfSAtLXBvcnQ9JHtUSFJJRlRfVEVTVF9QT1JUfSAtLXBvcnQ9JHtUSFJJRlRfVEVTVF9QT1JUfSAke2V4dHJhcGFyYW19IiBcCi0gICAgICAgICAgICAgICJydWJ5IHJiL2ludGVncmF0aW9uL1Rlc3RTZXJ2ZXIucmIgLS1wcm90b2NvbD0ke3Byb3RvfSAtLXRyYW5zcG9ydD0ke3RyYW5zfSAtLXBvcnQ9JHtUSFJJRlRfVEVTVF9QT1JUfSAtLXBvcnQ9JHtUSFJJRlRfVEVTVF9QT1JUfSAtLXBvcnQ9JHtUSFJJRlRfVEVTVF9QT1JUfSAke2V4dHJhcGFyYW19IiBcCi0gICAgICAgICAgICAgICI1IiAiNSIKLSAgICBkb25lCi0gIGRvbmUKLWRvbmUKLQotZm9yIHRyYW5zIGluICQoaW50ZXJzZWN0aW9uICIke2NwcF90cmFuc3BvcnRzfSIgIiR7cnVieV90cmFuc3BvcnRzfSIpOyBkbwotICAgIGZvciBzb2NrIGluICQoaW50ZXJzZWN0aW9uICIke2NwcF9zb2NrZXRzfSIgIiR7cnVieV9zb2NrZXRzfSIpOyBkbwotICAgICAgY2FzZSAiJHNvY2siIGluCi0gICAgICAgICJpcCIgKSBleHRyYXBhcmFtPSIiOzsKLSAgICAgICAgImlwLXNzbCIgKSBleHRyYXBhcmFtPSItLXNzbCI7OwotICAgICAgZXNhYwotICAgICAgZG9fdGVzdCAiY3BwLXJ1YnkiICJiaW5hcnktYWNjZWwiICIke3RyYW5zfS0ke3NvY2t9IiBcCi0gICAgICAgICAgICAgICJjcHAvVGVzdENsaWVudCAtLXByb3RvY29sPWJpbmFyeSAtLXRyYW5zcG9ydD0ke3RyYW5zfSAtLXBvcnQ9JHtUSFJJRlRfVEVTVF9QT1JUfSAtLXBvcnQ9JHtUSFJJRlRfVEVTVF9QT1JUfSAke2V4dHJhcGFyYW19IiBcCi0gICAgICAgICAgICAgICJydWJ5IHJiL2ludGVncmF0aW9uL1Rlc3RTZXJ2ZXIucmIgLS1wcm90b2NvbD1hY2NlbCAtLXRyYW5zcG9ydD0ke3RyYW5zfSAtLXBvcnQ9JHtUSFJJRlRfVEVTVF9QT1JUfSAke2V4dHJhcGFyYW19IiBcCi0gICAgICAgICAgICAgICI1IiAiNSIKLSAgICBkb25lCi0gIGRvbmUKLQotIyMjIyMjIyMjIHJ1YnkgY2xpZW50IC0gamF2YSBzZXJ2ZXIgIyMjIyMjIyMjIyMjIyMKLWZvciBwcm90byBpbiAkKGludGVyc2VjdGlvbiAiJHtydWJ5X3Byb3RvY29sc30iICIke2phdmFfcHJvdG9jb2xzfSIpOyBkbwotICBmb3IgdHJhbnMgaW4gJChpbnRlcnNlY3Rpb24gIiR7cnVieV90cmFuc3BvcnRzfSIgIiR7amF2YV9zZXJ2ZXJfdHJhbnNwb3J0c30iKTsgZG8KLSAgICBmb3Igc29jayBpbiAkKGludGVyc2VjdGlvbiAiJHtydWJ5X3NvY2tldHN9IiAiJHtqYXZhX3NvY2tldHN9Iik7IGRvCi0gICAgICBjYXNlICIkc29jayIgaW4KLSAgICAgICAgImlwIiApIGV4dHJhcGFyYW09IiI7OwotICAgICAgICAiaXAtc3NsIiApIGV4dHJhcGFyYW09Ii0tc3NsIjs7Ci0gICAgICBlc2FjCi0gICAgICBkb190ZXN0ICJydWJ5LWphdmEiICIke3Byb3RvfSIgIiR7dHJhbnN9LSR7c29ja30iIFwKLSAgICAgICAgICAgICAgInJ1YnkgcmIvaW50ZWdyYXRpb24vVGVzdENsaWVudC5yYiAtLXByb3RvY29sPSR7cHJvdG99IC0tdHJhbnNwb3J0PSR7dHJhbnN9IC0tcG9ydD0ke1RIUklGVF9URVNUX1BPUlR9ICR7ZXh0cmFwYXJhbX0iIFwKLSAgICAgICAgICAgICAgImFudCAtZiAgLi4vbGliL2phdmEvYnVpbGQueG1sIC1Ebm8tZ2VuLXRocmlmdD1cIlwiIC1EdGVzdGFyZ3MgXCItLXByb3RvY29sPSR7cHJvdG99IC0tdHJhbnNwb3J0PSR7dHJhbnN9IC0tcG9ydD0ke1RIUklGVF9URVNUX1BPUlR9ICR7ZXh0cmFwYXJhbX1cIiBydW4tdGVzdHNlcnZlciIgXAotICAgICAgICAgICAgICAiMTUiICI1IgotICAgIGRvbmUKLSAgZG9uZQotZG9uZQotCi1mb3IgdHJhbnMgaW4gJChpbnRlcnNlY3Rpb24gIiR7cnVieV90cmFuc3BvcnRzfSIgIiR7amF2YV9zZXJ2ZXJfdHJhbnNwb3J0c30iKTsgZG8KLSAgICBmb3Igc29jayBpbiAkKGludGVyc2VjdGlvbiAiJHtydWJ5X3NvY2tldHN9IiAiJHtqYXZhX3NvY2tldHN9Iik7IGRvCi0gICAgICBjYXNlICIkc29jayIgaW4KLSAgICAgICAgImlwIiApIGV4dHJhcGFyYW09IiI7OwotICAgICAgICAiaXAtc3NsIiApIGV4dHJhcGFyYW09Ii0tc3NsIjs7Ci0gICAgICBlc2FjCi0gICAgICBkb190ZXN0ICJydWJ5LWphdmEiICJhY2NlbC1iaW5hcnkiICIke3RyYW5zfS0ke3NvY2t9IiBcCi0gICAgICAgICAgICAgICJydWJ5IHJiL2ludGVncmF0aW9uL1Rlc3RDbGllbnQucmIgLS1wcm90b2NvbD1hY2NlbCAtLXRyYW5zcG9ydD0ke3RyYW5zfSAtLXBvcnQ9JHtUSFJJRlRfVEVTVF9QT1JUfSAke2V4dHJhcGFyYW19IiBcCi0gICAgICAgICAgICAgICJhbnQgLWYgIC4uL2xpYi9qYXZhL2J1aWxkLnhtbCAtRG5vLWdlbi10aHJpZnQ9XCJcIiAtRHRlc3RhcmdzIFwiLS1wcm90b2NvbD1iaW5hcnkgLS10cmFuc3BvcnQ9JHt0cmFuc30gLS1wb3J0PSR7VEhSSUZUX1RFU1RfUE9SVH0gJHtleHRyYXBhcmFtfVwiIHJ1bi10ZXN0c2VydmVyIiBcCi0gICAgICAgICAgICAgICIxNSIgIjUiCi0gICAgZG9uZQotICBkb25lCi0KLSMjIyMjIyMjIyBqYXZhIGNsaWVudCAtIHJ1Ynkgc2VydmVyICMjIyMjIyMjIyMjIyMjCi1mb3IgcHJvdG8gaW4gJChpbnRlcnNlY3Rpb24gIiR7cnVieV9wcm90b2NvbHN9IiAiJHtqYXZhX3Byb3RvY29sc30iKTsgZG8KLSAgZm9yIHRyYW5zIGluICQoaW50ZXJzZWN0aW9uICIke3J1YnlfdHJhbnNwb3J0c30iICIke2phdmFfY2xpZW50X3RyYW5zcG9ydHN9Iik7IGRvCi0gICAgZm9yIHNvY2sgaW4gJChpbnRlcnNlY3Rpb24gIiR7cnVieV9zb2NrZXRzfSIgIiR7amF2YV9zb2NrZXRzfSIpOyBkbwotICAgICAgY2FzZSAiJHNvY2siIGluCi0gICAgICAgICJpcCIgKSBleHRyYXBhcmFtPSIiOzsKLSAgICAgICAgImlwLXNzbCIgKSBleHRyYXBhcmFtPSItLXNzbCI7OwotICAgICAgZXNhYwotICAgICAgZG9fdGVzdCAiamF2YS1ydWJ5IiAiJHtwcm90b30iICIke3RyYW5zfS0ke3NvY2t9IiBcCi0gICAgICAgICAgICAgICJhbnQgLWYgIC4uL2xpYi9qYXZhL2J1aWxkLnhtbCAtRG5vLWdlbi10aHJpZnQ9XCJcIiAtRHRlc3RhcmdzIFwiLS1wcm90b2NvbD0ke3Byb3RvfSAtLXRyYW5zcG9ydD0ke3RyYW5zfSAtLXBvcnQ9JHtUSFJJRlRfVEVTVF9QT1JUfSAke2V4dHJhcGFyYW19XCIgcnVuLXRlc3RjbGllbnQiIFwKLSAgICAgICAgICAgICAgInJ1YnkgcmIvaW50ZWdyYXRpb24vVGVzdFNlcnZlci5yYiAtLXByb3RvY29sPSR7cHJvdG99IC0tdHJhbnNwb3J0PSR7dHJhbnN9IC0tcG9ydD0ke1RIUklGVF9URVNUX1BPUlR9ICR7ZXh0cmFwYXJhbX0iIFwKLSAgICAgICAgICAgICAgIjEwIiAiNSIKLSAgICBkb25lCi0gIGRvbmUKLWRvbmUKLQotZm9yIHRyYW5zIGluICQoaW50ZXJzZWN0aW9uICIke3J1YnlfdHJhbnNwb3J0c30iICIke2phdmFfY2xpZW50X3RyYW5zcG9ydHN9Iik7IGRvCi0gICAgZm9yIHNvY2sgaW4gJChpbnRlcnNlY3Rpb24gIiR7cnVieV9zb2NrZXRzfSIgIiR7amF2YV9zb2NrZXRzfSIpOyBkbwotICAgICAgY2FzZSAiJHNvY2siIGluCi0gICAgICAgICJpcCIgKSBleHRyYXBhcmFtPSIiOzsKLSAgICAgICAgImlwLXNzbCIgKSBleHRyYXBhcmFtPSItLXNzbCI7OwotICAgICAgZXNhYwotICAgICAgZG9fdGVzdCAiamF2YS1ydWJ5IiAiYmluYXJ5LWFjY2VsIiAiJHt0cmFuc30tJHtzb2NrfSIgXAotICAgICAgICAgICAgICAiYW50IC1mICAuLi9saWIvamF2YS9idWlsZC54bWwgLURuby1nZW4tdGhyaWZ0PVwiXCIgLUR0ZXN0YXJncyBcIi0tcHJvdG9jb2w9YmluYXJ5IC0tdHJhbnNwb3J0PSR7dHJhbnN9IC0tcG9ydD0ke1RIUklGVF9URVNUX1BPUlR9IC0tcG9ydD0ke1RIUklGVF9URVNUX1BPUlR9ICR7ZXh0cmFwYXJhbX1cIiBydW4tdGVzdGNsaWVudCIgXAotICAgICAgICAgICAgICAicnVieSByYi9pbnRlZ3JhdGlvbi9UZXN0U2VydmVyLnJiIC0tcHJvdG9jb2w9YWNjZWwgLS10cmFuc3BvcnQ9JHt0cmFuc30gLS1wb3J0PSR7VEhSSUZUX1RFU1RfUE9SVH0gJHtleHRyYXBhcmFtfSIgXAotICAgICAgICAgICAgICAiMTAiICI1IgotICAgIGRvbmUKLSAgZG9uZQotCi0jIyMjIyMjIyMgcnVieSBjbGllbnQgLSBjX2dsaWIgc2VydmVyICMjIyMjIyMjIyMjIyMjCi1mb3IgcHJvdG8gaW4gJChpbnRlcnNlY3Rpb24gIiR7cnVieV9wcm90b2NvbHN9IiAiJHtjX2dsaWJfcHJvdG9jb2xzfSIpOyBkbwotICBmb3IgdHJhbnMgaW4gJChpbnRlcnNlY3Rpb24gIiR7cnVieV90cmFuc3BvcnRzfSIgIiR7Y19nbGliX3RyYW5zcG9ydHN9Iik7IGRvCi0gICAgZm9yIHNvY2sgaW4gJChpbnRlcnNlY3Rpb24gIiR7cnVieV9zb2NrZXRzfSIgIiR7Y19nbGliX3NvY2tldHN9Iik7IGRvCi0gICAgICBjYXNlICIkc29jayIgaW4KLSAgICAgICAgImlwIiApIGV4dHJhcGFyYW09IiI7OwotICAgICAgICAiaXAtc3NsIiApIGV4dHJhcGFyYW09Ii0tc3NsIjs7Ci0gICAgICBlc2FjCi0gICAgICBkb190ZXN0ICJydWJ5LWNfZ2xpYiIgIiR7cHJvdG99IiAiJHt0cmFuc30tJHtzb2NrfSIgXAotICAgICAgICAgICAgICAicnVieSByYi9pbnRlZ3JhdGlvbi9UZXN0Q2xpZW50LnJiIC0tcHJvdG9jb2w9JHtwcm90b30gLS10cmFuc3BvcnQ9JHt0cmFuc30gLS1wb3J0PSR7VEhSSUZUX1RFU1RfUE9SVH0gJHtleHRyYXBhcmFtfSIgXAotICAgICAgICAgICAgICAiY19nbGliL3Rlc3Rfc2VydmVyIC0tcHJvdG9jb2w9JHtwcm90b30gLS10cmFuc3BvcnQ9JHt0cmFuc30gLS1wb3J0PSR7VEhSSUZUX1RFU1RfUE9SVH0gJHtleHRyYXBhcmFtfSIgXAotICAgICAgICAgICAgICAiNSIgIjAuMSIKLSAgICBkb25lCi0gIGRvbmUKLWRvbmUKLQotZm9yIHRyYW5zIGluICQoaW50ZXJzZWN0aW9uICIke3J1YnlfdHJhbnNwb3J0c30iICIke2NfZ2xpYl90cmFuc3BvcnRzfSIpOyBkbwotICAgIGZvciBzb2NrIGluICQoaW50ZXJzZWN0aW9uICIke3J1Ynlfc29ja2V0c30iICIke2NfZ2xpYl9zb2NrZXRzfSIpOyBkbwotICAgICAgY2FzZSAiJHNvY2siIGluCi0gICAgICAgICJpcCIgKSBleHRyYXBhcmFtPSIiOzsKLSAgICAgICAgImlwLXNzbCIgKSBleHRyYXBhcmFtPSItLXNzbCI7OwotICAgICAgZXNhYwotICAgICAgZG9fdGVzdCAicnVieS1jX2dsaWIiICJhY2NlbC1iaW5hcnkiICIke3RyYW5zfS0ke3NvY2t9IiBcCi0gICAgICAgICAgICAgICJydWJ5IHJiL2ludGVncmF0aW9uL1Rlc3RDbGllbnQucmIgLS1wcm90b2NvbD1hY2NlbCAtLXRyYW5zcG9ydD0ke3RyYW5zfSAtLXBvcnQ9JHtUSFJJRlRfVEVTVF9QT1JUfSAke2V4dHJhcGFyYW19IiBcCi0gICAgICAgICAgICAgICJjX2dsaWIvdGVzdF9zZXJ2ZXIgLS1wcm90b2NvbD1iaW5hcnkgLS10cmFuc3BvcnQ9JHt0cmFuc30gLS1wb3J0PSR7VEhSSUZUX1RFU1RfUE9SVH0gJHtleHRyYXBhcmFtfSIgXAotICAgICAgICAgICAgICAiNSIgIjAuMSIKLSAgICBkb25lCi0gIGRvbmUKLQotIyMjIyMjIyMjIGNfZ2xpYiBjbGllbnQgLSBydWJ5IHNlcnZlciAjIyMjIyMjIyMjIyMjIwotZm9yIHByb3RvIGluICQoaW50ZXJzZWN0aW9uICIke2NfZ2xpYl9wcm90b2NvbHN9IiAiJHtydWJ5X3Byb3RvY29sc30iKTsgZG8KLSAgZm9yIHRyYW5zIGluICQoaW50ZXJzZWN0aW9uICIke2NfZ2xpYl90cmFuc3BvcnRzfSIgIiR7cnVieV90cmFuc3BvcnRzfSIpOyBkbwotICAgIGZvciBzb2NrIGluICQoaW50ZXJzZWN0aW9uICIke2NfZ2xpYl9zb2NrZXRzfSIgIiR7cnVieV9zb2NrZXRzfSIpOyBkbwotICAgICAgY2FzZSAiJHNvY2siIGluCi0gICAgICAgICJpcCIgKSBleHRyYXBhcmFtPSIiOzsKLSAgICAgICAgImlwLXNzbCIgKSBleHRyYXBhcmFtPSItLXNzbCI7OwotICAgICAgZXNhYwotICAgICAgZG9fdGVzdCAiY19nbGliLXJ1YnkiICIke3Byb3RvfSIgIiR7dHJhbnN9LSR7c29ja30iIFwKLSAgICAgICAgICAgICAgImNfZ2xpYi90ZXN0X2NsaWVudCAtLXByb3RvY29sPSR7cHJvdG99ICAtLXRyYW5zcG9ydD0ke3RyYW5zfSAtLXBvcnQ9JHtUSFJJRlRfVEVTVF9QT1JUfSAke2V4dHJhcGFyYW19IiBcCi0gICAgICAgICAgICAgICJydWJ5IHJiL2ludGVncmF0aW9uL1Rlc3RTZXJ2ZXIucmIgLS1wcm90b2NvbD0ke3Byb3RvfSAtLXRyYW5zcG9ydD0ke3RyYW5zfSAtLXBvcnQ9JHtUSFJJRlRfVEVTVF9QT1JUfSAke2V4dHJhcGFyYW19IiBcCi0gICAgICAgICAgICAgICIyIiAiMiIKLSAgICBkb25lCi0gIGRvbmUKLWRvbmUKLQotZm9yIHRyYW5zIGluICQoaW50ZXJzZWN0aW9uICIke2NfZ2xpYl90cmFuc3BvcnRzfSIgIiR7cnVieV90cmFuc3BvcnRzfSIpOyBkbwotICAgIGZvciBzb2NrIGluICQoaW50ZXJzZWN0aW9uICIke2NfZ2xpYl9zb2NrZXRzfSIgIiR7cnVieV9zb2NrZXRzfSIpOyBkbwotICAgICAgY2FzZSAiJHNvY2siIGluCi0gICAgICAgICJpcCIgKSBleHRyYXBhcmFtPSIiOzsKLSAgICAgICAgImlwLXNzbCIgKSBleHRyYXBhcmFtPSItLXNzbCI7OwotICAgICAgZXNhYwotICAgICAgZG9fdGVzdCAiY19nbGliLXJ1YnkiICJiaW5hcnktYWNjZWwiICIke3RyYW5zfS0ke3NvY2t9IiBcCi0gICAgICAgICAgICAgICJjX2dsaWIvdGVzdF9jbGllbnQgLS1wcm90b2NvbD1iaW5hcnkgLS10cmFuc3BvcnQ9JHt0cmFuc30gLS1wb3J0PSR7VEhSSUZUX1RFU1RfUE9SVH0gLS1wb3J0PSR7VEhSSUZUX1RFU1RfUE9SVH0gJHtleHRyYXBhcmFtfSIgXAotICAgICAgICAgICAgICAicnVieSByYi9pbnRlZ3JhdGlvbi9UZXN0U2VydmVyLnJiIC0tcHJvdG9jb2w9YWNjZWwgLS10cmFuc3BvcnQ9JHt0cmFuc30gLS1wb3J0PSR7VEhSSUZUX1RFU1RfUE9SVH0gJHtleHRyYXBhcmFtfSIgXAotICAgICAgICAgICAgICAiNSIgIjUiCi0gICAgZG9uZQotICBkb25lCi0KLSMjIyMjIyMjIyBydWJ5IGNsaWVudCAtIG5vZGVqcyBzZXJ2ZXIgIyMjIyMjIyMjIyMjIyMKLWZvciBwcm90byBpbiAkKGludGVyc2VjdGlvbiAiJHtydWJ5X3Byb3RvY29sc30iICIke25vZGVqc19wcm90b2NvbHN9Iik7IGRvCi0gIGZvciB0cmFucyBpbiAkKGludGVyc2VjdGlvbiAiJHtydWJ5X3RyYW5zcG9ydHN9IiAiJHtub2RlanNfdHJhbnNwb3J0c30iKTsgZG8KLSAgICBmb3Igc29jayBpbiAkKGludGVyc2VjdGlvbiAiJHtydWJ5X3NvY2tldHN9IiAiJHtub2RlanNfc29ja2V0c30iKTsgZG8KLSAgICAgIGNhc2UgIiRzb2NrIiBpbgotICAgICAgICAiaXAiICkgZXh0cmFwYXJhbT0iIjs7Ci0gICAgICAgICJpcC1zc2wiICkgZXh0cmFwYXJhbT0iLS1zc2wiOzsKLSAgICAgIGVzYWMKLSAgICAgIGRvX3Rlc3QgInJ1Ynktbm9kZWpzIiAiJHtwcm90b30iICIke3RyYW5zfS0ke3NvY2t9IiBcCi0gICAgICAgICAgICAgICJydWJ5IHJiL2ludGVncmF0aW9uL1Rlc3RDbGllbnQucmIgLS1wcm90b2NvbD0ke3Byb3RvfSAtLXRyYW5zcG9ydD0ke3RyYW5zfSAtLXBvcnQ9JHtUSFJJRlRfVEVTVF9QT1JUfSAke2V4dHJhcGFyYW19IiBcCi0gICAgICAgICAgICAgICJub2RlICR7Tk9ERV9URVNUX0RJUn0vc2VydmVyLmpzIC1wICR7cHJvdG99IC10ICR7dHJhbnN9IC0tcG9ydD0ke1RIUklGVF9URVNUX1BPUlR9ICR7ZXh0cmFwYXJhbX0iIFwKLSAgICAgICAgICAgICAgIjUiICIyIgotICAgIGRvbmUKLSAgZG9uZQotZG9uZQotCi1mb3IgdHJhbnMgaW4gJChpbnRlcnNlY3Rpb24gIiR7cnVieV90cmFuc3BvcnRzfSIgIiR7bm9kZWpzX3RyYW5zcG9ydHN9Iik7IGRvCi0gICAgZm9yIHNvY2sgaW4gJChpbnRlcnNlY3Rpb24gIiR7cnVieV9zb2NrZXRzfSIgIiR7bm9kZWpzX3NvY2tldHN9Iik7IGRvCi0gICAgICBjYXNlICIkc29jayIgaW4KLSAgICAgICAgImlwIiApIGV4dHJhcGFyYW09IiI7OwotICAgICAgICAiaXAtc3NsIiApIGV4dHJhcGFyYW09Ii0tc3NsIjs7Ci0gICAgICBlc2FjCi0gICAgICBkb190ZXN0ICJydWJ5LW5vZGVqcyIgIiR7cHJvdG99IiAiJHt0cmFuc30tJHtzb2NrfSIgXAotICAgICAgICAgICAgICAicnVieSByYi9pbnRlZ3JhdGlvbi9UZXN0Q2xpZW50LnJiIC0tcHJvdG9jb2w9YWNjZWwgLS10cmFuc3BvcnQ9JHt0cmFuc30gLS1wb3J0PSR7VEhSSUZUX1RFU1RfUE9SVH0gJHtleHRyYXBhcmFtfSIgXAotICAgICAgICAgICAgICAibm9kZSAke05PREVfVEVTVF9ESVJ9L3NlcnZlci5qcyAtcCBiaW5hcnkgLXQgJHt0cmFuc30gLS1wb3J0PSR7VEhSSUZUX1RFU1RfUE9SVH0gJHtleHRyYXBhcmFtfSIgXAotICAgICAgICAgICAgICAiNSIgIjIiCi0gICAgZG9uZQotICBkb25lCi0KLSMjIyMjIyMjIyBub2RlanMgY2xpZW50IC0gcnVieSBzZXJ2ZXIgIyMjIyMjIyMjIyMjIyMKLWZvciBwcm90byBpbiAkKGludGVyc2VjdGlvbiAiJHtydWJ5X3Byb3RvY29sc30iICIke25vZGVqc19wcm90b2NvbHN9Iik7IGRvCi0gIGZvciB0cmFucyBpbiAkKGludGVyc2VjdGlvbiAiJHtydWJ5X3RyYW5zcG9ydHN9IiAiJHtub2RlanNfdHJhbnNwb3J0c30iKTsgZG8KLSAgICBmb3Igc29jayBpbiAkKGludGVyc2VjdGlvbiAiJHtydWJ5X3NvY2tldHN9IiAiJHtub2RlanNfc29ja2V0c30iKTsgZG8KLSAgICAgIGNhc2UgIiRzb2NrIiBpbgotICAgICAgICAiaXAiICkgZXh0cmFwYXJhbT0iIjs7Ci0gICAgICAgICJpcC1zc2wiICkgZXh0cmFwYXJhbT0iLS1zc2wiOzsKLSAgICAgIGVzYWMKLSAgICAgIGRvX3Rlc3QgIm5vZGVqcy1ydWJ5IiAiJHtwcm90b30iICIke3RyYW5zfS0ke3NvY2t9IiBcCi0gICAgICAgICAgICAgICJub2RlICR7Tk9ERV9URVNUX0RJUn0vY2xpZW50LmpzIC1wICR7cHJvdG99IC10ICR7dHJhbnN9IC0tcG9ydD0ke1RIUklGVF9URVNUX1BPUlR9ICR7ZXh0cmFwYXJhbX0iIFwKLSAgICAgICAgICAgICAgInJ1YnkgcmIvaW50ZWdyYXRpb24vVGVzdFNlcnZlci5yYiAtLXByb3RvY29sPSR7cHJvdG99IC0tdHJhbnNwb3J0PSR7dHJhbnN9IC0tcG9ydD0ke1RIUklGVF9URVNUX1BPUlR9ICR7ZXh0cmFwYXJhbX0iIFwKLSAgICAgICAgICAgICAgIjEwIiAiNSIKLSAgICBkb25lCi0gIGRvbmUKLWRvbmUKLQotZm9yIHRyYW5zIGluICQoaW50ZXJzZWN0aW9uICIke3J1YnlfdHJhbnNwb3J0c30iICIke25vZGVqc190cmFuc3BvcnRzfSIpOyBkbwotICAgIGZvciBzb2NrIGluICQoaW50ZXJzZWN0aW9uICIke3J1Ynlfc29ja2V0c30iICIke25vZGVqc19zb2NrZXRzfSIpOyBkbwotICAgICAgY2FzZSAiJHNvY2siIGluCi0gICAgICAgICJpcCIgKSBleHRyYXBhcmFtPSIiOzsKLSAgICAgICAgImlwLXNzbCIgKSBleHRyYXBhcmFtPSItLXNzbCI7OwotICAgICAgZXNhYwotICAgICAgZG9fdGVzdCAibm9kZWpzLXJ1YnkiICJiaW5hcnktYWNjZWwiICIke3RyYW5zfS0ke3NvY2t9IiBcCi0gICAgICAgICAgICAgICJub2RlICR7Tk9ERV9URVNUX0RJUn0vY2xpZW50LmpzIC1wIGJpbmFyeSAtdCAke3RyYW5zfSAtLXBvcnQ9JHtUSFJJRlRfVEVTVF9QT1JUfSAke2V4dHJhcGFyYW19IiBcCi0gICAgICAgICAgICAgICJydWJ5IHJiL2ludGVncmF0aW9uL1Rlc3RTZXJ2ZXIucmIgLS1wcm90b2NvbD1hY2NlbCAtLXRyYW5zcG9ydD0ke3RyYW5zfSAtLXBvcnQ9JHtUSFJJRlRfVEVTVF9QT1JUfSAke2V4dHJhcGFyYW19IiBcCi0gICAgICAgICAgICAgICIxMCIgIjIiCi0gICAgZG9uZQotICBkb25lCi0KLSMjIyMjIyMjIyBweSBjbGllbnQgLSBydWJ5IHNlcnZlciAjIyMjIyMjIyMjIyMjIwotZm9yIHByb3RvIGluICQoaW50ZXJzZWN0aW9uICIke3B5X3Byb3RvY29sc30iICIke3J1YnlfcHJvdG9jb2xzfSIpOyBkbwotICBmb3IgdHJhbnMgaW4gJChpbnRlcnNlY3Rpb24gIiR7cHlfdHJhbnNwb3J0c30iICIke3J1YnlfdHJhbnNwb3J0c30iKTsgZG8KLSAgICBmb3Igc29jayBpbiAkKGludGVyc2VjdGlvbiAiJHtweV9zb2NrZXRzfSIgIiR7cnVieV9zb2NrZXRzfSIpOyBkbwotICAgICAgY2FzZSAiJHNvY2siIGluCi0gICAgICAgICJpcCIgKSBleHRyYXBhcmFtPSIiOzsKLSAgICAgICAgImlwLXNzbCIgKSBleHRyYXBhcmFtPSItLXNzbCI7OwotICAgICAgZXNhYwotICAgICAgZG9fdGVzdCAicHktcnVieSIgIiR7cHJvdG99IiAiJHt0cmFuc30tJHtzb2NrfSIgXAotICAgICAgICAgICAgICAicHkvVGVzdENsaWVudC5weSAtLXByb3RvY29sPSR7cHJvdG99IC0tdHJhbnNwb3J0PSR7dHJhbnN9IC0tcG9ydD0ke1RIUklGVF9URVNUX1BPUlR9IC0taG9zdD1sb2NhbGhvc3QgLS1nZW5weWRpcj1nZW4tcHkgJHtleHRyYXBhcmFtfSIgXAotICAgICAgICAgICAgICAicnVieSByYi9pbnRlZ3JhdGlvbi9UZXN0U2VydmVyLnJiIC0tcHJvdG9jb2w9JHtwcm90b30gLS10cmFuc3BvcnQ9JHt0cmFuc30gLS1wb3J0PSR7VEhSSUZUX1RFU1RfUE9SVH0gJHtleHRyYXBhcmFtfSIgXAotICAgICAgICAgICAgICAiMTUiICI1IgotICAgIGRvbmUKLSAgZG9uZQotZG9uZQotCi1mb3IgdHJhbnMgaW4gJChpbnRlcnNlY3Rpb24gIiR7cHlfdHJhbnNwb3J0c30iICIke3J1YnlfdHJhbnNwb3J0c30iKTsgZG8KLSAgICBmb3Igc29jayBpbiAkKGludGVyc2VjdGlvbiAiJHtweV9zb2NrZXRzfSIgIiR7cnVieV9zb2NrZXRzfSIpOyBkbwotICAgICAgY2FzZSAiJHNvY2siIGluCi0gICAgICAgICJpcCIgKSBleHRyYXBhcmFtPSIiOzsKLSAgICAgICAgImlwLXNzbCIgKSBleHRyYXBhcmFtPSItLXNzbCI7OwotICAgICAgZXNhYwotICAgICAgZG9fdGVzdCAicHktcnVieSIgIiR7cHJvdG99IiAiJHt0cmFuc30tJHtzb2NrfSIgXAotICAgICAgICAgICAgICAicHkvVGVzdENsaWVudC5weSAtLXByb3RvY29sPWFjY2VsIC0tdHJhbnNwb3J0PSR7dHJhbnN9IC0tcG9ydD0ke1RIUklGVF9URVNUX1BPUlR9IC0taG9zdD1sb2NhbGhvc3QgLS1nZW5weWRpcj1nZW4tcHkgJHtleHRyYXBhcmFtfSIgXAotICAgICAgICAgICAgICAicnVieSByYi9pbnRlZ3JhdGlvbi9UZXN0U2VydmVyLnJiIC0tcHJvdG9jb2w9YmluYXJ5IC0tdHJhbnNwb3J0PSR7dHJhbnN9IC0tcG9ydD0ke1RIUklGVF9URVNUX1BPUlR9ICR7ZXh0cmFwYXJhbX0iIFwKLSAgICAgICAgICAgICAgIjE1IiAiNSIKLSAgICAgIGRvX3Rlc3QgInB5LXJ1YnkiICIke3Byb3RvfSIgIiR7dHJhbnN9LSR7c29ja30iIFwKLSAgICAgICAgICAgICAgInB5L1Rlc3RDbGllbnQucHkgLS1wcm90b2NvbD1iaW5hcnkgLS10cmFuc3BvcnQ9JHt0cmFuc30gLS1wb3J0PSR7VEhSSUZUX1RFU1RfUE9SVH0gLS1ob3N0PWxvY2FsaG9zdCAtLWdlbnB5ZGlyPWdlbi1weSAke2V4dHJhcGFyYW19IiBcCi0gICAgICAgICAgICAgICJydWJ5IHJiL2ludGVncmF0aW9uL1Rlc3RTZXJ2ZXIucmIgLS1wcm90b2NvbD1hY2NlbCAtLXRyYW5zcG9ydD0ke3RyYW5zfSAtLXBvcnQ9JHtUSFJJRlRfVEVTVF9QT1JUfSAke2V4dHJhcGFyYW19IiBcCi0gICAgICAgICAgICAgICIxNSIgIjUiCi0gICAgZG9uZQotICBkb25lCi0KLSMjIyMjIyMjIyBydWJ5IGNsaWVudCAtIHB5IHNlcnZlciAjIyMjIyMjIyMjIyMjIwotZm9yIHByb3RvIGluICQoaW50ZXJzZWN0aW9uICIke3B5X3Byb3RvY29sc30iICIke3J1YnlfcHJvdG9jb2xzfSIpOyBkbwotICBmb3IgdHJhbnMgaW4gJChpbnRlcnNlY3Rpb24gIiR7cHlfdHJhbnNwb3J0c30iICIke3J1YnlfdHJhbnNwb3J0c30iKTsgZG8KLSAgICBmb3Igc29jayBpbiAkKGludGVyc2VjdGlvbiAiJHtweV9zb2NrZXRzfSIgIiR7cnVieV9zb2NrZXRzfSIpOyBkbwotICAgICAgY2FzZSAiJHNvY2siIGluCi0gICAgICAgICJpcCIgKSBleHRyYXBhcmFtPSIiOzsKLSAgICAgICAgImlwLXNzbCIgKSBleHRyYXBhcmFtPSItLXNzbCI7OwotICAgICAgZXNhYwotICAgICAgZG9fdGVzdCAicnVieS1weSIgIiR7cHJvdG99IiAiJHt0cmFuc30tJHtzb2NrfSIgXAotICAgICAgICAgICAgICAicnVieSByYi9pbnRlZ3JhdGlvbi9UZXN0Q2xpZW50LnJiIC0tcHJvdG9jb2w9JHtwcm90b30gLS10cmFuc3BvcnQ9JHt0cmFuc30gLS1wb3J0PSR7VEhSSUZUX1RFU1RfUE9SVH0gJHtleHRyYXBhcmFtfSIgXAotICAgICAgICAgICAgICAicHkvVGVzdFNlcnZlci5weSAtLXByb3RvY29sPSR7cHJvdG99IC0tdHJhbnNwb3J0PSR7dHJhbnN9IC0tcG9ydD0ke1RIUklGVF9URVNUX1BPUlR9IC0tZ2VucHlkaXI9Z2VuLXB5IFRTaW1wbGVTZXJ2ZXIgJHtleHRyYXBhcmFtfSIgXAotICAgICAgICAgICAgICAiNSIgIjIiCi0gICAgZG9uZQotICBkb25lCi1kb25lCi0KLWZvciB0cmFucyBpbiAkKGludGVyc2VjdGlvbiAiJHtweV90cmFuc3BvcnRzfSIgIiR7cnVieV90cmFuc3BvcnRzfSIpOyBkbwotICAgIGZvciBzb2NrIGluICQoaW50ZXJzZWN0aW9uICIke3B5X3NvY2tldHN9IiAiJHtydWJ5X3NvY2tldHN9Iik7IGRvCi0gICAgICBjYXNlICIkc29jayIgaW4KLSAgICAgICAgImlwIiApIGV4dHJhcGFyYW09IiI7OwotICAgICAgICAiaXAtc3NsIiApIGV4dHJhcGFyYW09Ii0tc3NsIjs7Ci0gICAgICBlc2FjCi0gICAgICBkb190ZXN0ICJydWJ5LXB5IiAiYmluYXJ5LWFjY2VsIiAiJHt0cmFuc30tJHtzb2NrfSIgXAotICAgICAgICAgICAgICAicnVieSByYi9pbnRlZ3JhdGlvbi9UZXN0Q2xpZW50LnJiIC0tcHJvdG9jb2w9YmluYXJ5IC0tdHJhbnNwb3J0PSR7dHJhbnN9IC0tcG9ydD0ke1RIUklGVF9URVNUX1BPUlR9ICR7ZXh0cmFwYXJhbX0iIFwKLSAgICAgICAgICAgICAgInB5L1Rlc3RTZXJ2ZXIucHkgLS1wcm90b2NvbD1hY2NlbCAtLXRyYW5zcG9ydD0ke3RyYW5zfSAtLXBvcnQ9JHtUSFJJRlRfVEVTVF9QT1JUfSAtLWdlbnB5ZGlyPWdlbi1weSBUU2ltcGxlU2VydmVyICR7ZXh0cmFwYXJhbX0iIFwKLSAgICAgICAgICAgICAgIjUiICIyIgotICAgICAgZG9fdGVzdCAicnVieS1weSIgImFjY2VsLWJpbmFyeSIgIiR7dHJhbnN9LSR7c29ja30iIFwKLSAgICAgICAgICAgICAgInJ1YnkgcmIvaW50ZWdyYXRpb24vVGVzdENsaWVudC5yYiAtLXByb3RvY29sPWFjY2VsIC0tdHJhbnNwb3J0PSR7dHJhbnN9IC0tcG9ydD0ke1RIUklGVF9URVNUX1BPUlR9ICR7ZXh0cmFwYXJhbX0iIFwKLSAgICAgICAgICAgICAgInB5L1Rlc3RTZXJ2ZXIucHkgLS1wcm90b2NvbD1iaW5hcnkgLS10cmFuc3BvcnQ9JHt0cmFuc30gLS1wb3J0PSR7VEhSSUZUX1RFU1RfUE9SVH0gLS1nZW5weWRpcj1nZW4tcHkgVFNpbXBsZVNlcnZlciAke2V4dHJhcGFyYW19IiBcCi0gICAgICAgICAgICAgICI1IiAiMiIKLSAgICBkb25lCi0gIGRvbmUKLQotIyMjIyMjIyMjIGhzIGNsaWVudCAtIGhzIHNlcnZlciAjIyMjIyMjIyMjIyMjIyMKLWZvciBwcm90byBpbiAkaHNfcHJvdG9jb2xzOyBkbwotICBmb3IgdHJhbnMgaW4gJGhzX3RyYW5zcG9ydHM7IGRvCi0gICAgZm9yIHNvY2sgaW4gJGhzX3NvY2tldHM7IGRvCi0gICAgICBjYXNlICIkc29jayIgaW4KLSAgICAgICAiaXAiICkgICAgIGV4dHJhcGFyYW09IiI7OwotICAgICAgICJpcC1zc2wiICkgZXh0cmFwYXJhbT0iLS1zc2wiOzsKLSAgICAgICAiZG9tYWluIiApIGV4dHJhcGFyYW09Ii0tZG9tYWluLXNvY2tldD0vdG1wL1RocmlmdFRlc3QudGhyaWZ0Ijs7Ci0gICAgICBlc2FjCi0gICAgICBkb190ZXN0ICJocy1ocyIgICAiJHtwcm90b30iICIke3RyYW5zfS0ke3NvY2t9IiBcCi0gICAgICAgICAgICAgICJocy9UZXN0Q2xpZW50IC0tcHJvdG9jb2w9JHtwcm90b30gLS10cmFuc3BvcnQ9JHt0cmFuc30gLS1wb3J0PSR7VEhSSUZUX1RFU1RfUE9SVH0gJHtleHRyYXBhcmFtfSIgXAotICAgICAgICAgICAgICAiaHMvVGVzdFNlcnZlciAtLXByb3RvY29sPSR7cHJvdG99IC0tdHJhbnNwb3J0PSR7dHJhbnN9IC0tcG9ydD0ke1RIUklGVF9URVNUX1BPUlR9ICR7ZXh0cmFwYXJhbX0iIFwKLSAgICAgICAgICAgICAgIjIiICIwLjEiCi0gICAgZG9uZQotICBkb25lCi1kb25lCi0KLSMjIyMjIyMjIyBocyBjbGllbnQgLSBjcHAgc2VydmVyICMjIyMjIyMjIyMjIyMjIwotZm9yIHByb3RvIGluICQoaW50ZXJzZWN0aW9uICIke2hzX3Byb3RvY29sc30iICIke2NwcF9wcm90b2NvbHN9Iik7IGRvCi0gIGZvciB0cmFucyBpbiAgJChpbnRlcnNlY3Rpb24gIiR7aHNfdHJhbnNwb3J0c30iICIke2NwcF90cmFuc3BvcnRzfSIpOyBkbwotICAgIGZvciBzb2NrIGluICQoaW50ZXJzZWN0aW9uICIke2hzX3NvY2tldHN9IiAiJHtjcHBfc29ja2V0c30iKTsgZG8KLSAgICAgIGNhc2UgIiRzb2NrIiBpbgotICAgICAgICJpcCIgKSAgICAgZXh0cmFwYXJhbT0iIjs7Ci0gICAgICAgImlwLXNzbCIgKSBleHRyYXBhcmFtPSItLXNzbCI7OwotICAgICAgICJkb21haW4iICkgZXh0cmFwYXJhbT0iLS1kb21haW4tc29ja2V0PS90bXAvVGhyaWZ0VGVzdC50aHJpZnQiOzsKLSAgICAgIGVzYWMKLSAgICAgIGRvX3Rlc3QgImhzLWNwcCIgICAiJHtwcm90b30iICIke3RyYW5zfS0ke3NvY2t9IiBcCi0gICAgICAgICAgICAgICJocy9UZXN0Q2xpZW50IC0tcHJvdG9jb2w9JHtwcm90b30gLS10cmFuc3BvcnQ9JHt0cmFuc30gLS1wb3J0PSR7VEhSSUZUX1RFU1RfUE9SVH0gJHtleHRyYXBhcmFtfSIgXAotICAgICAgICAgICAgICAiY3BwL1Rlc3RTZXJ2ZXIgLS1wcm90b2NvbD0ke3Byb3RvfSAtLXRyYW5zcG9ydD0ke3RyYW5zfSAtLXBvcnQ9JHtUSFJJRlRfVEVTVF9QT1JUfSAke2V4dHJhcGFyYW19IiBcCi0gICAgICAgICAgICAgICIyIiAiMC4xIgotICAgIGRvbmUKLSAgZG9uZQotZG9uZQotCi0jIyMjIyMjIyMgY3BwIGNsaWVudCAtIGhzIHNlcnZlciAjIyMjIyMjIyMjIyMjIyMKLWZvciBwcm90byBpbiAkKGludGVyc2VjdGlvbiAiJHtoc19wcm90b2NvbHN9IiAiJHtjcHBfcHJvdG9jb2xzfSIpOyBkbwotICBmb3IgdHJhbnMgaW4gICQoaW50ZXJzZWN0aW9uICIke2hzX3RyYW5zcG9ydHN9IiAiJHtjcHBfdHJhbnNwb3J0c30iKTsgZG8KLSAgICBmb3Igc29jayBpbiAkKGludGVyc2VjdGlvbiAiJHtoc19zb2NrZXRzfSIgIiR7Y3BwX3NvY2tldHN9Iik7IGRvCi0gICAgICBjYXNlICIkc29jayIgaW4KLSAgICAgICAiaXAiICkgICAgIGV4dHJhcGFyYW09IiI7OwotICAgICAgICJpcC1zc2wiICkgZXh0cmFwYXJhbT0iLS1zc2wiOzsKLSAgICAgICAiZG9tYWluIiApIGV4dHJhcGFyYW09Ii0tZG9tYWluLXNvY2tldD0vdG1wL1RocmlmdFRlc3QudGhyaWZ0Ijs7Ci0gICAgICBlc2FjCi0gICAgICBkb190ZXN0ICJjcHAtaHMiICAgIiR7cHJvdG99IiAiJHt0cmFuc30tJHtzb2NrfSIgXAotICAgICAgICAgICAgICAiY3BwL1Rlc3RDbGllbnQgLS1wcm90b2NvbD0ke3Byb3RvfSAtLXRyYW5zcG9ydD0ke3RyYW5zfSAtLXBvcnQ9JHtUSFJJRlRfVEVTVF9QT1JUfSAke2V4dHJhcGFyYW19IiBcCi0gICAgICAgICAgICAgICJocy9UZXN0U2VydmVyIC0tcHJvdG9jb2w9JHtwcm90b30gLS10cmFuc3BvcnQ9JHt0cmFuc30gLS1wb3J0PSR7VEhSSUZUX1RFU1RfUE9SVH0gLS1wb3J0PSR7VEhSSUZUX1RFU1RfUE9SVH0gJHtleHRyYXBhcmFtfSIgXAotICAgICAgICAgICAgICAiMiIgIjAuMSIKLSAgICBkb25lCi0gIGRvbmUKLWRvbmUKLQotIyMjIyMjIyMjIGhzIGNsaWVudCAtIGphdmEgc2VydmVyICMjIyMjIyMjIyMjIyMjIwotZm9yIHByb3RvIGluICQoaW50ZXJzZWN0aW9uICIke2hzX3Byb3RvY29sc30iICIke2phdmFfcHJvdG9jb2xzfSIpOyBkbwotICBmb3IgdHJhbnMgaW4gICQoaW50ZXJzZWN0aW9uICIke2hzX3RyYW5zcG9ydHN9IiAiJHtqYXZhX3RyYW5zcG9ydHN9Iik7IGRvCi0gICAgZm9yIHNvY2sgaW4gJChpbnRlcnNlY3Rpb24gIiR7aHNfc29ja2V0c30iICIke2phdmFfc29ja2V0c30iKTsgZG8KLSAgICAgIGNhc2UgIiRzb2NrIiBpbgotICAgICAgICJpcCIgKSAgICAgZXh0cmFwYXJhbT0iIjs7Ci0gICAgICAgImlwLXNzbCIgKSBleHRyYXBhcmFtPSItLXNzbCI7OwotICAgICAgICJkb21haW4iICkgZXh0cmFwYXJhbT0iLS1kb21haW4tc29ja2V0PS90bXAvVGhyaWZ0VGVzdC50aHJpZnQiOzsKLSAgICAgIGVzYWMKLSAgICAgIGRvX3Rlc3QgImhzLWphdmEiICIke3Byb3RvfSIgIiR7dHJhbnN9LSR7c29ja30iIFwKLSAgICAgICAgICAgICAgImhzL1Rlc3RDbGllbnQgLS1wcm90b2NvbD0ke3Byb3RvfSAtLXRyYW5zcG9ydD0ke3RyYW5zfSAtLXBvcnQ9JHtUSFJJRlRfVEVTVF9QT1JUfSAke2V4dHJhcGFyYW19IiBcCi0gICAgICAgICJhbnQgLWYgIC4uL2xpYi9qYXZhL2J1aWxkLnhtbCAtRG5vLWdlbi10aHJpZnQ9XCJcIiAtRHRlc3RhcmdzIFwiLS1wcm90b2NvbD0ke3Byb3RvfSAtLXRyYW5zcG9ydD0ke3RyYW5zfSAtLXBvcnQ9JHtUSFJJRlRfVEVTVF9QT1JUfSAke2V4dHJhcGFyYW19XCIgcnVuLXRlc3RzZXJ2ZXIiIFwKLSAgICAgICAgICAgICAgIjUiICIxIgotICAgIGRvbmUKLSAgZG9uZQotZG9uZQotCi0jIyMjIyMjIyMgamF2YSBjbGllbnQgLSBocyBzZXJ2ZXIgIyMjIyMjIyMjIyMjIyMjCi1mb3IgcHJvdG8gaW4gJChpbnRlcnNlY3Rpb24gIiR7aHNfcHJvdG9jb2xzfSIgIiR7amF2YV9wcm90b2NvbHN9Iik7IGRvCi0gIGZvciB0cmFucyBpbiAgJChpbnRlcnNlY3Rpb24gIiR7aHNfdHJhbnNwb3J0c30iICIke2phdmFfdHJhbnNwb3J0c30iKTsgZG8KLSAgICBmb3Igc29jayBpbiAkKGludGVyc2VjdGlvbiAiJHtoc19zb2NrZXRzfSIgIiR7amF2YV9zb2NrZXRzfSIpOyBkbwotICAgICAgY2FzZSAiJHNvY2siIGluCi0gICAgICAgImlwIiApICAgICBleHRyYXBhcmFtPSIiOzsKLSAgICAgICAiaXAtc3NsIiApIGV4dHJhcGFyYW09Ii0tc3NsIjs7Ci0gICAgICAgImRvbWFpbiIgKSBleHRyYXBhcmFtPSItLWRvbWFpbi1zb2NrZXQ9L3RtcC9UaHJpZnRUZXN0LnRocmlmdCI7OwotICAgICAgZXNhYwotICAgICAgZG9fdGVzdCAiamF2YS1ocyIgIiR7cHJvdG99IiAiJHt0cmFuc30tJHtzb2NrfSIgXAotICAgICAgICAgICAgICAiYW50IC1mICAuLi9saWIvamF2YS9idWlsZC54bWwgLURuby1nZW4tdGhyaWZ0PVwiXCIgLUR0ZXN0YXJncyBcIi0tcHJvdG9jb2w9JHtwcm90b30gLS10cmFuc3BvcnQ9JHt0cmFuc30gLS1wb3J0PSR7VEhSSUZUX1RFU1RfUE9SVH0gLS1wb3J0PSR7VEhSSUZUX1RFU1RfUE9SVH0gJHtleHRyYXBhcmFtfVwiIHJ1bi10ZXN0Y2xpZW50IiBcCi0gICAgICAgICAgICAgICJocy9UZXN0U2VydmVyIC0tcHJvdG9jb2w9JHtwcm90b30gLS10cmFuc3BvcnQ9JHt0cmFuc30gLS1wb3J0PSR7VEhSSUZUX1RFU1RfUE9SVH0gJHtleHRyYXBhcmFtfSIgXAotICAgICAgICAgICAgICAiNSIgIjEiCi0gICAgZG9uZQotICBkb25lCi1kb25lCi0KLSMjIyMjIyMjIyBocyBjbGllbnQgLSBjX2dsaWIgc2VydmVyICMjIyMjIyMjIyMjIyMjIwotZm9yIHByb3RvIGluICQoaW50ZXJzZWN0aW9uICIke2hzX3Byb3RvY29sc30iICIke2NfZ2xpYl9wcm90b2NvbHN9Iik7IGRvCi0gIGZvciB0cmFucyBpbiAgJChpbnRlcnNlY3Rpb24gIiR7aHNfdHJhbnNwb3J0c30iICIke2NfZ2xpYl90cmFuc3BvcnRzfSIpOyBkbwotICAgIGZvciBzb2NrIGluICQoaW50ZXJzZWN0aW9uICIke2hzX3NvY2tldHN9IiAiJHtjX2dsaWJfc29ja2V0c30iKTsgZG8KLSAgICAgIGNhc2UgIiRzb2NrIiBpbgotICAgICAgICJpcCIgKSAgICAgZXh0cmFwYXJhbT0iIjs7Ci0gICAgICAgImlwLXNzbCIgKSBleHRyYXBhcmFtPSItLXNzbCI7OwotICAgICAgICJkb21haW4iICkgZXh0cmFwYXJhbT0iLS1kb21haW4tc29ja2V0PS90bXAvVGhyaWZ0VGVzdC50aHJpZnQiOzsKLSAgICAgIGVzYWMKLSAgICAgIGRvX3Rlc3QgImhzLWNfZ2xpYiIgICAiJHtwcm90b30iICIke3RyYW5zfS0ke3NvY2t9IiBcCi0gICAgICAgICAgICAgICJocy9UZXN0Q2xpZW50IC0tcHJvdG9jb2w9JHtwcm90b30gLS10cmFuc3BvcnQ9JHt0cmFuc30gLS1wb3J0PSR7VEhSSUZUX1RFU1RfUE9SVH0gJHtleHRyYXBhcmFtfSIgXAotICAgICAgICAgICAgICAiY19nbGliL3Rlc3Rfc2VydmVyIC0tcHJvdG9jb2w9JHtwcm90b30gLS10cmFuc3BvcnQ9JHt0cmFuc30gLS1wb3J0PSR7VEhSSUZUX1RFU1RfUE9SVH0gJHtleHRyYXBhcmFtfSIgXAotICAgICAgICAgICAgICAiMiIgIjAuMSIKLSAgICBkb25lCi0gIGRvbmUKLWRvbmUKLQotIyMjIyMjIyMjIGNfZ2xpYiBjbGllbnQgLSBocyBzZXJ2ZXIgIyMjIyMjIyMjIyMjIyMjCi1mb3IgcHJvdG8gaW4gJChpbnRlcnNlY3Rpb24gIiR7Y19nbGliX3Byb3RvY29sc30iICIke2hzX3Byb3RvY29sc30iKTsgZG8KLSAgZm9yIHRyYW5zIGluICAkKGludGVyc2VjdGlvbiAiJHtjX2dsaWJfdHJhbnNwb3J0c30iICIke2hzX3RyYW5zcG9ydHN9Iik7IGRvCi0gICAgZm9yIHNvY2sgaW4gJChpbnRlcnNlY3Rpb24gIiR7Y19nbGliX3NvY2tldHN9IiAiJHtoc19zb2NrZXRzfSIpOyBkbwotICAgICAgY2FzZSAiJHNvY2siIGluCi0gICAgICAgImlwIiApICAgICBleHRyYXBhcmFtPSIiOzsKLSAgICAgICAiaXAtc3NsIiApIGV4dHJhcGFyYW09Ii0tc3NsIjs7Ci0gICAgICAgImRvbWFpbiIgKSBleHRyYXBhcmFtPSItLWRvbWFpbi1zb2NrZXQ9L3RtcC9UaHJpZnRUZXN0LnRocmlmdCI7OwotICAgICAgZXNhYwotICAgICAgZG9fdGVzdCAiY19nbGliLWhzIiAgICIke3Byb3RvfSIgIiR7dHJhbnN9LSR7c29ja30iIFwKLSAgICAgICAgICAgICAgImNfZ2xpYi90ZXN0X2NsaWVudCAtLXByb3RvY29sPSR7cHJvdG99ICAtLXRyYW5zcG9ydD0ke3RyYW5zfSAtLXBvcnQ9JHtUSFJJRlRfVEVTVF9QT1JUfSAke2V4dHJhcGFyYW19IiBcCi0gICAgICAgICAgICAgICJocy9UZXN0U2VydmVyIC0tcHJvdG9jb2w9JHtwcm90b30gLS10cmFuc3BvcnQ9JHt0cmFuc30gLS1wb3J0PSR7VEhSSUZUX1RFU1RfUE9SVH0gLS1wb3J0PSR7VEhSSUZUX1RFU1RfUE9SVH0gJHtleHRyYXBhcmFtfSIgXAotICAgICAgICAgICAgICAiMiIgIjAuMSIKLSAgICBkb25lCi0gIGRvbmUKLWRvbmUKLQotIyMjIyMjIyMjIHB5IGNsaWVudCAtaHMgc2VydmVyICMjIyMjIyMjIyMjIyMjCi1mb3IgcHJvdG8gaW4gJChpbnRlcnNlY3Rpb24gIiR7aHNfcHJvdG9jb2xzfSIgIiR7cHlfcHJvdG9jb2xzfSIpOyBkbwotICBmb3IgdHJhbnMgaW4gJChpbnRlcnNlY3Rpb24gIiR7aHNfdHJhbnNwb3J0c30iICIke3B5X3RyYW5zcG9ydHN9Iik7IGRvCi0gICAgZm9yIHNvY2sgaW4gJChpbnRlcnNlY3Rpb24gIiR7aHNfc29ja2V0c30iICIke3B5X3NvY2tldHN9Iik7IGRvCi0gICAgICBjYXNlICIkc29jayIgaW4KLSAgICAgICAgImlwIiApIGV4dHJhcGFyYW09IiI7OwotICAgICAgICAiaXAtc3NsIiApIGV4dHJhcGFyYW09Ii0tc3NsIjs7Ci0gICAgICBlc2FjCi0gICAgICBkb190ZXN0ICJweS1ocyIgIiR7cHJvdG99IiAiJHt0cmFuc30tJHtzb2NrfSIgXAotICAgICAgICAgICAgICAicHkvVGVzdENsaWVudC5weSAtLXByb3RvY29sPSR7cHJvdG99IC0tdHJhbnNwb3J0PSR7dHJhbnN9IC0tcG9ydD0ke1RIUklGVF9URVNUX1BPUlR9IC0taG9zdD1sb2NhbGhvc3QgLS1nZW5weWRpcj1nZW4tcHkgJHtleHRyYXBhcmFtfSIgXAotICAgICAgICAgICAgICAiaHMvVGVzdFNlcnZlciAtLXByb3RvY29sPSR7cHJvdG99IC0tdHJhbnNwb3J0PSR7dHJhbnN9IC0tcG9ydD0ke1RIUklGVF9URVNUX1BPUlR9ICR7ZXh0cmFwYXJhbX0iIFwKLSAgICAgICAgICAgICAgIjEwIiAiMiIKLSAgICBkb25lCi0gIGRvbmUKLWRvbmUKLQotZm9yIHRyYW5zIGluICQoaW50ZXJzZWN0aW9uICIke2hzX3RyYW5zcG9ydHN9IiAiJHtweV90cmFuc3BvcnRzfSIpOyBkbwotICAgIGZvciBzb2NrIGluICQoaW50ZXJzZWN0aW9uICIke2hzX3NvY2tldHN9IiAiJHtweV9zb2NrZXRzfSIpOyBkbwotICAgICAgY2FzZSAiJHNvY2siIGluCi0gICAgICAgICJpcCIgKSBleHRyYXBhcmFtPSIiOzsKLSAgICAgICAgImlwLXNzbCIgKSBleHRyYXBhcmFtPSItLXNzbCI7OwotICAgICAgZXNhYwotICAgICAgZG9fdGVzdCAicHktaHMiICJhY2NlbC1iaW5hcnkiICIke3RyYW5zfS0ke3NvY2t9IiBcCi0gICAgICAgICAgICAgICJweS9UZXN0Q2xpZW50LnB5IC0tcHJvdG9jb2w9YWNjZWwgLS10cmFuc3BvcnQ9JHt0cmFuc30gLS1wb3J0PSR7VEhSSUZUX1RFU1RfUE9SVH0gLS1ob3N0PWxvY2FsaG9zdCAtLWdlbnB5ZGlyPWdlbi1weSAke2V4dHJhcGFyYW19IiBcCi0gICAgICAgICAgICAgICJocy9UZXN0U2VydmVyIC0tcHJvdG9jb2w9YmluYXJ5IC0tdHJhbnNwb3J0PSR7dHJhbnN9IC0tcG9ydD0ke1RIUklGVF9URVNUX1BPUlR9ICR7ZXh0cmFwYXJhbX0iIFwKLSAgICAgICAgICAgICAgIjEwIiAiMiIKLSAgICBkb25lCi0gIGRvbmUKLQotIyMjIyMjIyMjIGhzIGNsaWVudCAtIHB5IHNlcnZlciAjIyMjIyMjIyMjIyMjIwotZm9yIHByb3RvIGluICQoaW50ZXJzZWN0aW9uICIke2hzX3Byb3RvY29sc30iICIke3B5X3Byb3RvY29sc30iKTsgZG8KLSAgZm9yIHRyYW5zIGluICQoaW50ZXJzZWN0aW9uICIke2hzX3RyYW5zcG9ydHN9IiAiJHtweV90cmFuc3BvcnRzfSIpOyBkbwotICAgIGZvciBzb2NrIGluICQoaW50ZXJzZWN0aW9uICIke2hzX3NvY2tldHN9IiAiJHtweV9zb2NrZXRzfSIpOyBkbwotICAgICAgY2FzZSAiJHNvY2siIGluCi0gICAgICAgICJpcCIgKSBleHRyYXBhcmFtPSIiOzsKLSAgICAgICAgImlwLXNzbCIgKSBleHRyYXBhcmFtPSItLXNzbCI7OwotICAgICAgZXNhYwotICAgICAgZG9fdGVzdCAiaHMtcHkiICIke3Byb3RvfSIgIiR7dHJhbnN9LSR7c29ja30iIFwKLSAgICAgICAgICAgICAgImhzL1Rlc3RDbGllbnQgLS1wcm90b2NvbD0ke3Byb3RvfSAtLXRyYW5zcG9ydD0ke3RyYW5zfSAtLXBvcnQ9JHtUSFJJRlRfVEVTVF9QT1JUfSAke2V4dHJhcGFyYW19IiBcCi0gICAgICAgICAgICAgICJweS9UZXN0U2VydmVyLnB5IC0tcHJvdG9jb2w9JHtwcm90b30gLS10cmFuc3BvcnQ9JHt0cmFuc30gLS1wb3J0PSR7VEhSSUZUX1RFU1RfUE9SVH0gLS1nZW5weWRpcj1nZW4tcHkgVFNpbXBsZVNlcnZlciAke2V4dHJhcGFyYW19IiBcCi0gICAgICAgICAgICAgICIxMCIgIjIiCi0gICAgZG9uZQotICBkb25lCi1kb25lCi0KLWZvciB0cmFucyBpbiAkKGludGVyc2VjdGlvbiAiJHtoc190cmFuc3BvcnRzfSIgIiR7cHlfdHJhbnNwb3J0c30iKTsgZG8KLSAgICBmb3Igc29jayBpbiAkKGludGVyc2VjdGlvbiAiJHtoc19zb2NrZXRzfSIgIiR7cHlfc29ja2V0c30iKTsgZG8KLSAgICAgIGNhc2UgIiRzb2NrIiBpbgotICAgICAgICAiaXAiICkgZXh0cmFwYXJhbT0iIjs7Ci0gICAgICAgICJpcC1zc2wiICkgZXh0cmFwYXJhbT0iLS1zc2wiOzsKLSAgICAgIGVzYWMKLSAgICAgIGRvX3Rlc3QgImhzLXB5IiAiYmluYXJ5LWFjY2VsIiAiJHt0cmFuc30tJHtzb2NrfSIgXAotICAgICAgICAgICAgICAiaHMvVGVzdENsaWVudCAtLXByb3RvY29sPWJpbmFyeSAtLXRyYW5zcG9ydD0ke3RyYW5zfSAtLXBvcnQ9JHtUSFJJRlRfVEVTVF9QT1JUfSAke2V4dHJhcGFyYW19IiBcCi0gICAgICAgICAgICAgICJweS9UZXN0U2VydmVyLnB5IC0tcHJvdG9jb2w9YWNjZWwgLS10cmFuc3BvcnQ9JHt0cmFuc30gLS1wb3J0PSR7VEhSSUZUX1RFU1RfUE9SVH0gLS1nZW5weWRpcj1nZW4tcHkgVFNpbXBsZVNlcnZlciAke2V4dHJhcGFyYW19IiBcCi0gICAgICAgICAgICAgICIxMCIgIjIiCi0gICAgZG9uZQotICBkb25lCi0KLSMjIyMjIyMjIyBub2RlanMgY2xpZW50IC0gaHMgc2VydmVyICMjIyMjIyMjIyMjIyMjCi1mb3IgcHJvdG8gaW4gJChpbnRlcnNlY3Rpb24gIiR7bm9kZWpzX3Byb3RvY29sc30iICIke2hzX3Byb3RvY29sc30iKTsgZG8KLSAgZm9yIHRyYW5zIGluICQoaW50ZXJzZWN0aW9uICIke25vZGVqc190cmFuc3BvcnRzfSIgIiR7aHNfdHJhbnNwb3J0c30iKTsgZG8KLSAgICBmb3Igc29jayBpbiAkKGludGVyc2VjdGlvbiAiJHtub2RlanNfc29ja2V0c30iICIke2hzX3NvY2tldHN9Iik7IGRvCi0gICAgICBjYXNlICIkc29jayIgaW4KLSAgICAgICAgImlwIiApIGV4dHJhcGFyYW09IiI7OwotICAgICAgICAiaXAtc3NsIiApIGV4dHJhcGFyYW09Ii0tc3NsIjs7Ci0gICAgICBlc2FjCi0gICAgICBkb190ZXN0ICJub2RlanMtaHMiICIke3Byb3RvfSIgIiR7dHJhbnN9LSR7c29ja30iIFwKLSAgICAgICAgICAgICAgIm5vZGUgJHtOT0RFX1RFU1RfRElSfS9jbGllbnQuanMgLXAgJHtwcm90b30gLXQgJHt0cmFuc30gLS1wb3J0PSR7VEhSSUZUX1RFU1RfUE9SVH0gJHtleHRyYXBhcmFtfSIgXAotICAgICAgICAgICAgICAiaHMvVGVzdFNlcnZlciAtLXByb3RvY29sPSR7cHJvdG99IC0tdHJhbnNwb3J0PSR7dHJhbnN9IC0tcG9ydD0ke1RIUklGVF9URVNUX1BPUlR9ICR7ZXh0cmFwYXJhbX0iIFwKLSAgICAgICAgICAgICAgIjUiICIwLjIiCi0gICAgZG9uZQotICBkb25lCi1kb25lCi0KLSMjIyMjIyMjIyBocyBjbGllbnQgLSBub2RlanMgc2VydmVyICMjIyMjIyMjIyMjIyMjCi1mb3IgcHJvdG8gaW4gJChpbnRlcnNlY3Rpb24gIiR7bm9kZWpzX3Byb3RvY29sc30iICIke2hzX3Byb3RvY29sc30iKTsgZG8KLSAgZm9yIHRyYW5zIGluICQoaW50ZXJzZWN0aW9uICIke25vZGVqc190cmFuc3BvcnRzfSIgIiR7aHNfdHJhbnNwb3J0c30iKTsgZG8KLSAgICBmb3Igc29jayBpbiAkKGludGVyc2VjdGlvbiAiJHtub2RlanNfc29ja2V0c30iICIke2hzX3NvY2tldHN9Iik7IGRvCi0gICAgICBjYXNlICIkc29jayIgaW4KLSAgICAgICAgImlwIiApIGV4dHJhcGFyYW09IiI7OwotICAgICAgICAiaXAtc3NsIiApIGV4dHJhcGFyYW09Ii0tc3NsIjs7Ci0gICAgICBlc2FjCi0gICAgICBkb190ZXN0ICJocy1ub2RlanMiICIke3Byb3RvfSIgIiR7dHJhbnN9LSR7c29ja30iIFwKLSAgICAgICAgICAgICAgImhzL1Rlc3RDbGllbnQgLS1wcm90b2NvbD0ke3Byb3RvfSAtLXRyYW5zcG9ydD0ke3RyYW5zfSAtLXBvcnQ9JHtUSFJJRlRfVEVTVF9QT1JUfSAke2V4dHJhcGFyYW19IiBcCi0gICAgICAgICAgICAgICJub2RlICR7Tk9ERV9URVNUX0RJUn0vc2VydmVyLmpzIC1wICR7cHJvdG99IC10ICR7dHJhbnN9IC0tcG9ydD0ke1RIUklGVF9URVNUX1BPUlR9ICR7ZXh0cmFwYXJhbX0iIFwKLSAgICAgICAgICAgICAgIjUiICIyIgotICAgIGRvbmUKLSAgZG9uZQotZG9uZQotCi0jIyMjIyMjIyMgcnVieSBjbGllbnQgLSBocyBzZXJ2ZXIgIyMjIyMjIyMjIyMjIyMKLWZvciBwcm90byBpbiAkKGludGVyc2VjdGlvbiAiJHtoc19wcm90b2NvbHN9IiAiJHtydWJ5X3Byb3RvY29sc30iKTsgZG8KLSAgZm9yIHRyYW5zIGluICQoaW50ZXJzZWN0aW9uICIke2hzX3RyYW5zcG9ydHN9IiAiJHtydWJ5X3RyYW5zcG9ydHN9Iik7IGRvCi0gICAgZm9yIHNvY2sgaW4gJChpbnRlcnNlY3Rpb24gIiR7aHNfc29ja2V0c30iICIke3J1Ynlfc29ja2V0c30iKTsgZG8KLSAgICAgIGNhc2UgIiRzb2NrIiBpbgotICAgICAgICAiaXAiICkgZXh0cmFwYXJhbT0iIjs7Ci0gICAgICAgICJpcC1zc2wiICkgZXh0cmFwYXJhbT0iLS1zc2wiOzsKLSAgICAgIGVzYWMKLSAgICAgIGRvX3Rlc3QgInJ1YnktaHMiICIke3Byb3RvfSIgIiR7dHJhbnN9LSR7c29ja30iIFwKLSAgICAgICAgICAgICAgInJ1YnkgcmIvaW50ZWdyYXRpb24vVGVzdENsaWVudC5yYiAtLXByb3RvY29sPSR7cHJvdG99IC0tdHJhbnNwb3J0PSR7dHJhbnN9IC0tcG9ydD0ke1RIUklGVF9URVNUX1BPUlR9ICR7ZXh0cmFwYXJhbX0iIFwKLSAgICAgICAgICAgICAgImhzL1Rlc3RTZXJ2ZXIgLS1wcm90b2NvbD0ke3Byb3RvfSAtLXRyYW5zcG9ydD0ke3RyYW5zfSAtLXBvcnQ9JHtUSFJJRlRfVEVTVF9QT1JUfSAke2V4dHJhcGFyYW19IiBcCi0gICAgICAgICAgICAgICI1IiAiNSIKLSAgICBkb25lCi0gIGRvbmUKLWRvbmUKLQotZm9yIHRyYW5zIGluICQoaW50ZXJzZWN0aW9uICIke2hzX3RyYW5zcG9ydHN9IiAiJHtydWJ5X3RyYW5zcG9ydHN9Iik7IGRvCi0gICAgZm9yIHNvY2sgaW4gJChpbnRlcnNlY3Rpb24gIiR7aHNfc29ja2V0c30iICIke3J1Ynlfc29ja2V0c30iKTsgZG8KLSAgICAgIGNhc2UgIiRzb2NrIiBpbgotICAgICAgICAiaXAiICkgZXh0cmFwYXJhbT0iIjs7Ci0gICAgICAgICJpcC1zc2wiICkgZXh0cmFwYXJhbT0iLS1zc2wiOzsKLSAgICAgIGVzYWMKLSAgICAgIGRvX3Rlc3QgInJ1YnktY3BwIiAiYWNjZWwtYmluYXJ5IiAiJHt0cmFuc30tJHtzb2NrfSIgXAotICAgICAgICAgICAgICAicnVieSByYi9pbnRlZ3JhdGlvbi9UZXN0Q2xpZW50LnJiIC0tcHJvdG9jb2w9YWNjZWwgLS10cmFuc3BvcnQ9JHt0cmFuc30gLS1wb3J0PSR7VEhSSUZUX1RFU1RfUE9SVH0gJHtleHRyYXBhcmFtfSAke2V4dHJhcGFyYW19IiBcCi0gICAgICAgICAgICAgICJocy9UZXN0U2VydmVyIC0tcHJvdG9jb2w9YmluYXJ5IC0tdHJhbnNwb3J0PSR7dHJhbnN9IC0tcG9ydD0ke1RIUklGVF9URVNUX1BPUlR9ICR7ZXh0cmFwYXJhbX0iIFwKLSAgICAgICAgICAgICAgIjUiICI1IgotICAgIGRvbmUKLSAgZG9uZQotCi0jIyMjIyMjIyMgaHMgY2xpZW50IC0gcnVieSBzZXJ2ZXIgIyMjIyMjIyMjIyMjIyMKLWZvciBwcm90byBpbiAkKGludGVyc2VjdGlvbiAiJHtoc19wcm90b2NvbHN9IiAiJHtydWJ5X3Byb3RvY29sc30iKTsgZG8KLSAgZm9yIHRyYW5zIGluICQoaW50ZXJzZWN0aW9uICIke2hzX3RyYW5zcG9ydHN9IiAiJHtydWJ5X3RyYW5zcG9ydHN9Iik7IGRvCi0gICAgZm9yIHNvY2sgaW4gJChpbnRlcnNlY3Rpb24gIiR7aHNfc29ja2V0c30iICIke3J1Ynlfc29ja2V0c30iKTsgZG8KLSAgICAgIGNhc2UgIiRzb2NrIiBpbgotICAgICAgICAiaXAiICkgZXh0cmFwYXJhbT0iIjs7Ci0gICAgICAgICJpcC1zc2wiICkgZXh0cmFwYXJhbT0iLS1zc2wiOzsKLSAgICAgIGVzYWMKLSAgICAgIGRvX3Rlc3QgImhzLXJ1YnkiICIke3Byb3RvfSIgIiR7dHJhbnN9LSR7c29ja30iIFwKLSAgICAgICAgICAgICAgImhzL1Rlc3RDbGllbnQgLS1wcm90b2NvbD0ke3Byb3RvfSAtLXRyYW5zcG9ydD0ke3RyYW5zfSAtLXBvcnQ9JHtUSFJJRlRfVEVTVF9QT1JUfSAke2V4dHJhcGFyYW19IiBcCi0gICAgICAgICAgICAgICJydWJ5IHJiL2ludGVncmF0aW9uL1Rlc3RTZXJ2ZXIucmIgLS1wcm90b2NvbD0ke3Byb3RvfSAtLXRyYW5zcG9ydD0ke3RyYW5zfSAtLXBvcnQ9JHtUSFJJRlRfVEVTVF9QT1JUfSAke2V4dHJhcGFyYW19IiBcCi0gICAgICAgICAgICAgICI1IiAiNSIKLSAgICBkb25lCi0gIGRvbmUKLWRvbmUKLQotZm9yIHRyYW5zIGluICQoaW50ZXJzZWN0aW9uICIke2hzX3RyYW5zcG9ydHN9IiAiJHtydWJ5X3RyYW5zcG9ydHN9Iik7IGRvCi0gICAgZm9yIHNvY2sgaW4gJChpbnRlcnNlY3Rpb24gIiR7aHNfc29ja2V0c30iICIke3J1Ynlfc29ja2V0c30iKTsgZG8KLSAgICAgIGNhc2UgIiRzb2NrIiBpbgotICAgICAgICAiaXAiICkgZXh0cmFwYXJhbT0iIjs7Ci0gICAgICAgICJpcC1zc2wiICkgZXh0cmFwYXJhbT0iLS1zc2wiOzsKLSAgICAgIGVzYWMKLSAgICAgIGRvX3Rlc3QgImhzLXJ1YnkiICJiaW5hcnktYWNjZWwiICIke3RyYW5zfS0ke3NvY2t9IiBcCi0gICAgICAgICAgICAgICJocy9UZXN0Q2xpZW50IC0tcHJvdG9jb2w9YmluYXJ5IC0tdHJhbnNwb3J0PSR7dHJhbnN9IC0tcG9ydD0ke1RIUklGVF9URVNUX1BPUlR9ICR7ZXh0cmFwYXJhbX0iIFwKLSAgICAgICAgICAgICAgInJ1YnkgcmIvaW50ZWdyYXRpb24vVGVzdFNlcnZlci5yYiAtLXByb3RvY29sPWFjY2VsIC0tdHJhbnNwb3J0PSR7dHJhbnN9IC0tcG9ydD0ke1RIUklGVF9URVNUX1BPUlR9ICR7ZXh0cmFwYXJhbX0iIFwKLSAgICAgICAgICAgICAgIjUiICI1IgotICAgIGRvbmUKLSAgZG9uZQotCi0KLSMgZGVsZXRlIFVuaXggRG9tYWluIFNvY2tldCB1c2VkIGJ5IGNwcCB0ZXN0cwotcm0gLWYgL3RtcC9UaHJpZnRUZXN0LnRocmlmdAotCi0jIyMjIyMjIyMgY3NoYXJwIGNsaWVudCAtIGNzaGFycCBzZXJ2ZXIgIyMjIyMjIyMjIyMjIwotZXhwb3J0IE1PTk9fUEFUSD0uLi9saWIvY3NoYXJwCi1mb3IgcHJvdG8gaW4gJGNzaGFycF9wcm90b2NvbHM7IGRvCi0gIGZvciB0cmFucyBpbiAkY3NoYXJwX3RyYW5zcG9ydHM7IGRvCi0gICAgZm9yIHNvY2sgaW4gJGNzaGFycF9zb2NrZXRzOyBkbwotICAgICAgY2FzZSAiJHNvY2siIGluCi0gICAgICAgICJpcCIgKSBleHRyYXBhcmFtPSIiOzsKLSAgICAgICAgImlwLXNzbCIgKSBleHRyYXBhcmFtPSItLXNzbCI7OwotICAgICAgZXNhYwotICAgICAgZG9fdGVzdCAiY3NoYXJwLWNzaGFycCIgICAiJHtwcm90b30iICIke3RyYW5zfS0ke3NvY2t9IiBcCi0gICAgICAgICAgICAgICIuLi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0VGVzdC9UZXN0Q2xpZW50U2VydmVyLmV4ZSBjbGllbnQgLS1wcm90b2NvbD0ke3Byb3RvfSAtLXRyYW5zcG9ydD0ke3RyYW5zfSAtLXBvcnQ9JHtUSFJJRlRfVEVTVF9QT1JUfSAke2V4dHJhcGFyYW19IiBcCi0gICAgICAgICAgICAgICIuLi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0VGVzdC9UZXN0Q2xpZW50U2VydmVyLmV4ZSBzZXJ2ZXIgLS1wcm90b2NvbD0ke3Byb3RvfSAtLXRyYW5zcG9ydD0ke3RyYW5zfSAtLXBvcnQ9JHtUSFJJRlRfVEVTVF9QT1JUfSAke2V4dHJhcGFyYW19IiBcCi0gICAgICAgICAgICAgICI1IiAiMSIKLSAgICBkb25lCi0gIGRvbmUKLWRvbmUKLQotZG9fdGVzdCAianMtamF2YSIgICAianNvbiIgICJodHRwLWlwIiBcCi0gICAgICAgICIiIFwKLSAgICAgICAgImFudCAtZiAgLi4vbGliL2pzL3Rlc3QvYnVpbGQueG1sIHVuaXR0ZXN0IiBcCi0gICAgICAgICIyIiAiMiIKLWRvX3Rlc3QgInBlcmwtY3BwIiAgImJpbmFyeSIgImJ1ZmZlcmVkLWlwIiBcCi0gICAgICAgICJwZXJsIC1JIHBlcmwvZ2VuLXBlcmwvIC1JLi4vbGliL3BlcmwvbGliLyBwZXJsL1Rlc3RDbGllbnQucGwiIFwKLSAgICAgICAgImNwcC9UZXN0U2VydmVyICAtLXBvcnQ9JHtUSFJJRlRfVEVTVF9QT1JUfSIgXAotICAgICAgICAiMTAiICIyIgotZG9fdGVzdCAicGhwLWNwcCIgICJiaW5hcnkiICJidWZmZXJlZC1pcCIgXAotICAgICAgICAibWFrZSAtQyBwaHAvIGNsaWVudCIgXAotICAgICAgICAiY3BwL1Rlc3RTZXJ2ZXIgLS1wb3J0PSR7VEhSSUZUX1RFU1RfUE9SVH0iIFwKLSAgICAgICAgIjEwIiAiMiIKLQotZWNobyAiIGZhaWxlZCB0ZXN0cyBhcmUgbG9nZ2VkIHRvIHRlc3QvbG9nL2Vycm9yLmxvZyIKLWVjaG8gIiBmdWxsIGxvZyBpcyBoZXJlIHRlc3QvbG9nL2NsaWVudF9zZXJ2ZXJfcHJvdG9jb2xfdHJhbnNwb3J0X2NsaWVudC5sb2ciCi1lY2hvICIgZnVsbCBsb2cgaXMgaGVyZSB0ZXN0L2xvZy9jbGllbnRfc2VydmVyX3Byb3RvY29sX3RyYW5zcG9ydF9zZXJ2ZXIubG9nIgotZWNobyAiIG9yIGxvb2sgYXQgZmlsZTovLyRCQVNFRElSLyRTVEFUVVNfSFRNTCIKLQotRUxBUFNFRF9USU1FPSQoZWNobyAiKCR7U0VDT05EU30gLSAke1NUQVJUX1RJTUV9KSIgfCBiYykKLURVUkFUSU9OPSIke0VMQVBTRURfVElNRX0gc2Vjb25kcyIKLQotZWNobyAkRkFJTEVEIGZhaWxlZCBvZiAkVEVTVENPVU5UIHRlc3RzIGluIHRvdGFsCi1lY2hvICJ0ZXN0IGFuIHRvb2siICREVVJBVElPTgotcHJpbnRfaHRtbF9mb290ZXIgIiREVVJBVElPTiIKLQotZGF0ZQotY2QgLQpkaWZmIC0tZ2l0IGEvdGVzdC90ZXN0cy5qc29uIGIvdGVzdC90ZXN0cy5qc29uCmluZGV4IDVhYmFmZGYuLjQzZDZkZWQgMTAwNjQ0Ci0tLSBhL3Rlc3QvdGVzdHMuanNvbgorKysgYi90ZXN0L3Rlc3RzLmpzb24KQEAgLTEsMjgwICsxLDc0OSBAQAotewotICAgICJjbGllbnQiOiBbCi0gICAgICAgIHsKLSAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJQeXRob24gVGVzdENsaWVudCIsCi0gICAgICAgICAgICAibGliIjogInB5IiwKLSAgICAgICAgICAgICJleGVjdXRhYmxlIjogInB5L1Rlc3RDbGllbnQucHkiLAotICAgICAgICAgICAgImV4aXQiOiAiaGFyZCIsCi0gICAgICAgICAgICAiZXh0cmFfYXJncyI6ICBbIi0tZ2VucHlkaXI9Z2VuLXB5Il0sCi0gICAgICAgICAgICAicHJvdG9jb2xzIjogWwotICAgICAgICAgICAgICAgICJiaW5hcnkiLAotICAgICAgICAgICAgICAgICJjb21wYWN0IiwKLSAgICAgICAgICAgICAgICAianNvbiIsCi0gICAgICAgICAgICAgICAgImFjY2VsIgotICAgICAgICAgICAgXSwKLSAgICAgICAgICAgICJ0cmFuc3BvcnRzIjogWwotICAgICAgICAgICAgICAgICJidWZmZXJlZCIsCi0gICAgICAgICAgICAgICAgImZyYW1lZCIKLSAgICAgICAgICAgIF0sCi0gICAgICAgICAgICAic29ja2V0cyI6IFsKLSAgICAgICAgICAgICAgICAiaXAiLAotICAgICAgICAgICAgICAgICJpcC1zc2wiCi0gICAgICAgICAgICBdLAotICAgICAgICAgICAgInBsYXRmb3JtIjogWwotICAgICAgICAgICAgICAgICJMaW51eCIKLSAgICAgICAgICAgIF0KLSAgICAgICAgfSwKLSAgICAgICAgewotICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkMrKyBUZXN0Q2xpZW50IiwKLSAgICAgICAgICAgICJsaWIiOiAiY3BwIiwKLSAgICAgICAgICAgICJleGVjdXRhYmxlIjogImNwcC9UZXN0Q2xpZW50IiwKLSAgICAgICAgICAgICJleGl0IjogImhhcmQiLAotICAgICAgICAgICAgInByb3RvY29scyI6IFsKLSAgICAgICAgICAgICAgICAiYmluYXJ5IiwKLSAgICAgICAgICAgICAgICAiY29tcGFjdCIsCi0gICAgICAgICAgICAgICAgImpzb24iCi0gICAgICAgICAgICBdLAotICAgICAgICAgICAgInRyYW5zcG9ydHMiOiBbCi0gICAgICAgICAgICAgICAgImJ1ZmZlcmVkIiwKLSAgICAgICAgICAgICAgICAiZnJhbWVkIiwKLSAgICAgICAgICAgICAgICAiaHR0cCIKLSAgICAgICAgICAgIF0sCi0gICAgICAgICAgICAic29ja2V0cyI6IFsKLSAgICAgICAgICAgICAgICAiaXAiLAotICAgICAgICAgICAgICAgICJpcC1zc2wiLAotICAgICAgICAgICAgICAgICJkb21haW4iCi0gICAgICAgICAgICBdLAotICAgICAgICAgICAgInBsYXRmb3JtIjogWwotICAgICAgICAgICAgICAgICJMaW51eCIKLSAgICAgICAgICAgIF0KLSAgICAgICAgfSwKLSAgICAgICAgewotICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk5vZGVqcyBUZXN0Q2xpZW50IiwKLSAgICAgICAgICAgICJsaWIiOiAibm9kZWpzIiwKLSAgICAgICAgICAgICJleGVjdXRhYmxlIjogIi4uL2xpYi9ub2RlanMvdGVzdC9jbGllbnQuanMiLAotICAgICAgICAgICAgImV4aXQiOiAic29mdCIsCi0gICAgICAgICAgICAicHJvdG9jb2xzIjogWwotICAgICAgICAgICAgICAgICJiaW5hcnkiLAotICAgICAgICAgICAgICAgICJjb21wYWN0IiwKLSAgICAgICAgICAgICAgICAianNvbiIKLSAgICAgICAgICAgIF0sCi0gICAgICAgICAgICAidHJhbnNwb3J0cyI6IFsKLSAgICAgICAgICAgICAgICAiYnVmZmVyZWQiLAotICAgICAgICAgICAgICAgICJmcmFtZWQiCi0gICAgICAgICAgICBdLAotICAgICAgICAgICAgInNvY2tldHMiOiBbCi0gICAgICAgICAgICAgICAgImlwIiwKLSAgICAgICAgICAgICAgICAiaXAtc3NsIgotICAgICAgICAgICAgXSwKLSAgICAgICAgICAgICJwbGF0Zm9ybSI6IFsKLSAgICAgICAgICAgICAgICAiTGludXgiCi0gICAgICAgICAgICBdCi0gICAgICAgIH0sCi0gICAgICAgIHsKLSAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJSdWJ5IFRlc3RDbGllbnQiLAotICAgICAgICAgICAgImxpYiI6ICJydWJ5IiwKLSAgICAgICAgICAgICJleGVjdXRhYmxlIjogInJiL2ludGVncmF0aW9uL1Rlc3RDbGllbnQucmIiLAotICAgICAgICAgICAgImV4aXQiOiAic29mdCIsCi0gICAgICAgICAgICAicHJvdG9jb2xzIjogWwotICAgICAgICAgICAgICAgICJiaW5hcnkiLAotICAgICAgICAgICAgICAgICJjb21wYWN0IiwKLSAgICAgICAgICAgICAgICAianNvbiIsCi0gICAgICAgICAgICAgICAgImFjY2VsIgotICAgICAgICAgICAgXSwKLSAgICAgICAgICAgICJ0cmFuc3BvcnRzIjogWwotICAgICAgICAgICAgICAgICJidWZmZXJlZCIsCi0gICAgICAgICAgICAgICAgImZyYW1lZCIKLSAgICAgICAgICAgIF0sCi0gICAgICAgICAgICAic29ja2V0cyI6IFsKLSAgICAgICAgICAgICAgICAiaXAiCi0gICAgICAgICAgICBdLAotICAgICAgICAgICAgInBsYXRmb3JtIjogWwotICAgICAgICAgICAgICAgICJMaW51eCIKLSAgICAgICAgICAgIF0KLSAgICAgICAgfSwKLSAgICAgICAgewotICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkphdmEgVGVzdENsaWVudCIsCi0gICAgICAgICAgICAibGliIjogImphdmEiLAotICAgICAgICAgICAgImV4ZWN1dGFibGUiOiBbImFudCIsIi1mIiwiLi4vbGliL2phdmEvYnVpbGQueG1sIiwiLURuby1nZW4tdGhyaWZ0PVwiXCIiXSwKLSAgICAgICAgICAgICJleHRyYV9hcmdzIjogWyJydW4tdGVzdGNsaWVudCJdLAotICAgICAgICAgICAgImV4aXQiOiAiaGFyZCIsCi0gICAgICAgICAgICAicHJvdG9jb2xzIjogWwotICAgICAgICAgICAgICAgICJiaW5hcnkiLAotICAgICAgICAgICAgICAgICJjb21wYWN0IiwKLSAgICAgICAgICAgICAgICAianNvbiIKLSAgICAgICAgICAgIF0sCi0gICAgICAgICAgICAidHJhbnNwb3J0cyI6IFsKLSAgICAgICAgICAgICAgICAiYnVmZmVyZWQiLAotICAgICAgICAgICAgICAgICJmcmFtZWQiLAotICAgICAgICAgICAgICAgICJmYXN0ZnJhbWVkIiwKLSAgICAgICAgICAgICAgICAiaHR0cCIKLSAgICAgICAgICAgIF0sCi0gICAgICAgICAgICAic29ja2V0cyI6IFsKLSAgICAgICAgICAgICAgICAiaXAiLAotICAgICAgICAgICAgICAgICJpcC1zc2wiCi0gICAgICAgICAgICBdLAotICAgICAgICAgICAgInBsYXRmb3JtIjogWwotICAgICAgICAgICAgICAgICJMaW51eCIKLSAgICAgICAgICAgIF0KLSAgICAgICAgfSwKLSAgICAgICAgewotICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkhhc2tlbGwgVGVzdENsaWVudCIsCi0gICAgICAgICAgICAibGliIjogImhzIiwKLSAgICAgICAgICAgICJleGVjdXRhYmxlIjogImhzL1Rlc3RDbGllbnQiLAotICAgICAgICAgICAgImV4aXQiOiAiaGFyZCIsCi0gICAgICAgICAgICAicHJvdG9jb2xzIjogWwotICAgICAgICAgICAgICAgICJiaW5hcnkiLAotICAgICAgICAgICAgICAgICJjb21wYWN0IiwKLSAgICAgICAgICAgICAgICAianNvbiIKLSAgICAgICAgICAgIF0sCi0gICAgICAgICAgICAidHJhbnNwb3J0cyI6IFsKLSAgICAgICAgICAgICAgICAiYnVmZmVyZWQiCi0gICAgICAgICAgICBdLAotICAgICAgICAgICAgInNvY2tldHMiOiBbCi0gICAgICAgICAgICAgICAgImlwIgotICAgICAgICAgICAgXSwKLSAgICAgICAgICAgICJwbGF0Zm9ybSI6IFsKLSAgICAgICAgICAgICAgICAiTGludXgiCi0gICAgICAgICAgICBdCi0gICAgICAgIH0KK1sKKyAgeworICAgICJuYW1lIjogImNfZ2xpYiIsCisgICAgInBsYXRmb3JtcyI6IFsKKyAgICAgICJMaW51eCIKICAgICBdLAotICAgICJzZXJ2ZXIiOiBbCi0gICAgICAgIHsKLSAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJQeXRob24gVFNpbXBsZVNlcnZlciIsCi0gICAgICAgICAgICAibGliIjogInB5IiwKLSAgICAgICAgICAgICJleGVjdXRhYmxlIjogInB5L1Rlc3RTZXJ2ZXIucHkiLAotICAgICAgICAgICAgImV4dHJhX2FyZ3MiOiBbIi0tZ2VucHlkaXI9Z2VuLXB5IiwgIlRTaW1wbGVTZXJ2ZXIiXSwKLSAgICAgICAgICAgICJleHRyYV9kZWxheSI6IDAsCi0gICAgICAgICAgICAiZXhpdCI6ICJzb2Z0IiwKLSAgICAgICAgICAgICJwcm90b2NvbHMiOiBbCi0gICAgICAgICAgICAgICAgImJpbmFyeSIsCi0gICAgICAgICAgICAgICAgImNvbXBhY3QiLAotICAgICAgICAgICAgICAgICJqc29uIiwKLSAgICAgICAgICAgICAgICAiYWNjZWwiCi0gICAgICAgICAgICBdLAotICAgICAgICAgICAgInRyYW5zcG9ydHMiOiBbCi0gICAgICAgICAgICAgICAgImJ1ZmZlcmVkIiwKLSAgICAgICAgICAgICAgICAiZnJhbWVkIgotICAgICAgICAgICAgXSwKLSAgICAgICAgICAgICJzb2NrZXRzIjogWwotICAgICAgICAgICAgICAgICJpcCIsCi0gICAgICAgICAgICAgICAgImlwLXNzbCIKLSAgICAgICAgICAgIF0sCi0gICAgICAgICAgICAicGxhdGZvcm0iOiBbCi0gICAgICAgICAgICAgICAgIkxpbnV4IgotICAgICAgICAgICAgXQotICAgICAgICB9LAotICAgICAgICB7Ci0gICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQysrIFRlc3RTZXJ2ZXIiLAotICAgICAgICAgICAgImxpYiI6ICJjcHAiLAotICAgICAgICAgICAgImV4ZWN1dGFibGUiOiAiY3BwL1Rlc3RTZXJ2ZXIiLAotICAgICAgICAgICAgImV4aXQiOiAiaGFyZCIsCi0gICAgICAgICAgICAicHJvdG9jb2xzIjogWwotICAgICAgICAgICAgICAgICJiaW5hcnkiLAotICAgICAgICAgICAgICAgICJjb21wYWN0IiwKLSAgICAgICAgICAgICAgICAianNvbiIKLSAgICAgICAgICAgIF0sCi0gICAgICAgICAgICAidHJhbnNwb3J0cyI6IFsKLSAgICAgICAgICAgICAgICAiYnVmZmVyZWQiLAotICAgICAgICAgICAgICAgICJmcmFtZWQiLAotICAgICAgICAgICAgICAgICJodHRwIgotICAgICAgICAgICAgXSwKLSAgICAgICAgICAgICJzb2NrZXRzIjogWwotICAgICAgICAgICAgICAgICJpcCIsCi0gICAgICAgICAgICAgICAgImlwLXNzbCIsCi0gICAgICAgICAgICAgICAgImRvbWFpbiIKLSAgICAgICAgICAgIF0sCi0gICAgICAgICAgICAicGxhdGZvcm0iOiBbCi0gICAgICAgICAgICAgICAgIkxpbnV4IgotICAgICAgICAgICAgXQotICAgICAgICB9LAotICAgICAgICB7Ci0gICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiUnVieSBUZXN0U2VydmVyIiwKLSAgICAgICAgICAgICJsaWIiOiAicnVieSIsCi0gICAgICAgICAgICAiZXhlY3V0YWJsZSI6ICJyYi9pbnRlZ3JhdGlvbi9UZXN0U2VydmVyLnJiIiwKLSAgICAgICAgICAgICJleGl0IjogInNvZnQiLAotICAgICAgICAgICAgInByb3RvY29scyI6IFsKLSAgICAgICAgICAgICAgICAiYmluYXJ5IiwKLSAgICAgICAgICAgICAgICAiY29tcGFjdCIsCi0gICAgICAgICAgICAgICAgImpzb24iLAotICAgICAgICAgICAgICAgICJhY2NlbCIKLSAgICAgICAgICAgIF0sCi0gICAgICAgICAgICAidHJhbnNwb3J0cyI6IFsKLSAgICAgICAgICAgICAgICAiYnVmZmVyZWQiLAotICAgICAgICAgICAgICAgICJmcmFtZWQiCi0gICAgICAgICAgICBdLAotICAgICAgICAgICAgInNvY2tldHMiOiBbCi0gICAgICAgICAgICAgICAgImlwIgotICAgICAgICAgICAgXSwKLSAgICAgICAgICAgICJwbGF0Zm9ybSI6IFsKLSAgICAgICAgICAgICAgICAiTGludXgiCi0gICAgICAgICAgICBdCi0gICAgICAgIH0sCi0gICAgICAgIHsKLSAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJOb2RlanMgVGVzdFNlcnZlciIsCi0gICAgICAgICAgICAibGliIjogIm5vZGVqcyIsCi0gICAgICAgICAgICAiZXhlY3V0YWJsZSI6ICIuLi9saWIvbm9kZWpzL3Rlc3Qvc2VydmVyLmpzIiwKLSAgICAgICAgICAgICJleGl0IjogInNvZnQiLAotICAgICAgICAgICAgInByb3RvY29scyI6IFsKLSAgICAgICAgICAgICAgICAiYmluYXJ5IiwKLSAgICAgICAgICAgICAgICAiY29tcGFjdCIsCi0gICAgICAgICAgICAgICAgImpzb24iCi0gICAgICAgICAgICBdLAotICAgICAgICAgICAgInRyYW5zcG9ydHMiOiBbCi0gICAgICAgICAgICAgICAgImJ1ZmZlcmVkIiwKLSAgICAgICAgICAgICAgICAiZnJhbWVkIgotICAgICAgICAgICAgXSwKLSAgICAgICAgICAgICJzb2NrZXRzIjogWwotICAgICAgICAgICAgICAgICJpcCIsCi0gICAgICAgICAgICAgICAgImlwLXNzbCIKLSAgICAgICAgICAgIF0sCi0gICAgICAgICAgICAicGxhdGZvcm0iOiBbCi0gICAgICAgICAgICAgICAgIkxpbnV4IgotICAgICAgICAgICAgXQotICAgICAgICB9LAotICAgICAgICB7Ci0gICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSmF2YSBUZXN0U2VydmVyIiwKLSAgICAgICAgICAgICJsaWIiOiAiamF2YSIsCi0gICAgICAgICAgICAiZXhlY3V0YWJsZSI6IFsiYW50IiwiLWYiLCIuLi9saWIvamF2YS9idWlsZC54bWwiLCItRG5vLWdlbi10aHJpZnQ9XCJcIiJdLAotICAgICAgICAgICAgImV4dHJhX2FyZ3MiOiBbInJ1bi10ZXN0c2VydmVyIl0sCi0gICAgICAgICAgICAiZXhpdCI6ICJoYXJkIiwKLSAgICAgICAgICAgICJwcm90b2NvbHMiOiBbCi0gICAgICAgICAgICAgICAgImJpbmFyeSIsCi0gICAgICAgICAgICAgICAgImNvbXBhY3QiLAotICAgICAgICAgICAgICAgICJqc29uIgotICAgICAgICAgICAgXSwKLSAgICAgICAgICAgICJ0cmFuc3BvcnRzIjogWwotICAgICAgICAgICAgICAgICJidWZmZXJlZCIsCi0gICAgICAgICAgICAgICAgImZyYW1lZCIsCi0gICAgICAgICAgICAgICAgImZhc3RmcmFtZWQiCi0gICAgICAgICAgICBdLAotICAgICAgICAgICAgInNvY2tldHMiOiBbCi0gICAgICAgICAgICAgICAgImlwIiwKLSAgICAgICAgICAgICAgICAiaXAtc3NsIgotICAgICAgICAgICAgXSwKLSAgICAgICAgICAgICJwbGF0Zm9ybSI6IFsKLSAgICAgICAgICAgICAgICAiTGludXgiCi0gICAgICAgICAgICBdCi0gICAgICAgIH0sCi0gICAgICAgIHsKLSAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJIYXNrZWxsIFRlc3RTZXJ2ZXIiLAotICAgICAgICAgICAgImxpYiI6ICJocyIsCi0gICAgICAgICAgICAiZXhlY3V0YWJsZSI6ICJocy9UZXN0U2VydmVyIiwKLSAgICAgICAgICAgICJleGl0IjogImhhcmQiLAotICAgICAgICAgICAgInByb3RvY29scyI6IFsKLSAgICAgICAgICAgICAgICAiYmluYXJ5IiwKLSAgICAgICAgICAgICAgICAiY29tcGFjdCIsCi0gICAgICAgICAgICAgICAgImpzb24iCi0gICAgICAgICAgICBdLAotICAgICAgICAgICAgInRyYW5zcG9ydHMiOiBbCi0gICAgICAgICAgICAgICAgImJ1ZmZlcmVkIgotICAgICAgICAgICAgXSwKLSAgICAgICAgICAgICJzb2NrZXRzIjogWwotICAgICAgICAgICAgICAgICJpcCIKLSAgICAgICAgICAgIF0sCi0gICAgICAgICAgICAicGxhdGZvcm0iOiBbCi0gICAgICAgICAgICAgICAgIkxpbnV4IgotICAgICAgICAgICAgXQotICAgICAgICB9Ci0gICAgXQotfQorICAgICJzZXJ2ZXIiOiB7CisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgInRlc3Rfc2VydmVyIiwKKyAgICAgICAgIi0tbHQtZGVidWciCisgICAgICBdLAorICAgICAgInByb3RvY29scyI6IFsKKyAgICAgICAgImJpbmFyeTptdWx0aSIsCisgICAgICAgICJjb21wYWN0Om11bHRpYyIKKyAgICAgIF0KKyAgICB9LAorICAgICJjbGllbnQiOiB7CisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgInRlc3RfY2xpZW50IiwKKyAgICAgICAgIi0tbHQtZGVidWciCisgICAgICBdLAorICAgICAgInByb3RvY29scyI6IFsKKyAgICAgICAgIm11bHRpOmJpbmFyeSIsCisgICAgICAgICJtdWx0aWM6Y29tcGFjdCIKKyAgICAgIF0sCisgICAgICAic29ja2V0cyI6IFsKKyAgICAgICAgImlwLXNzbCIKKyAgICAgIF0KKyAgICB9LAorICAgICJ0cmFuc3BvcnRzIjogWworICAgICAgImJ1ZmZlcmVkIiwKKyAgICAgICJmcmFtZWQiCisgICAgXSwKKyAgICAic29ja2V0cyI6IFsKKyAgICAgICJpcCIKKyAgICBdLAorICAgICJwcm90b2NvbHMiOiBbCisgICAgICAiYmluYXJ5IiwKKyAgICAgICJjb21wYWN0IiwKKyAgICAgICJtdWx0aSIsCisgICAgICAibXVsdGljIgorICAgIF0sCisgICAgIndvcmtkaXIiOiAiY19nbGliIgorICB9LAorICB7CisgICAgIm5hbWUiOiAiY2wiLAorICAgICJzZXJ2ZXIiOiB7CisgICAgICAiY29tbWFuZCI6IFsiVGVzdFNlcnZlciJdLAorICAgICAgIndvcmtkaXIiOiAiY2wiLAorICAgICAgInByb3RvY29scyI6IFsiYmluYXJ5IiwgIm11bHRpIl0sCisgICAgICAidHJhbnNwb3J0cyI6IFsiYnVmZmVyZWQiLCAiZnJhbWVkIl0sCisgICAgICAic29ja2V0cyI6IFsiaXAiXQorICAgIH0sCisgICAgImNsaWVudCI6IHsKKyAgICAgICJjb21tYW5kIjogWyJUZXN0Q2xpZW50Il0sCisgICAgICAid29ya2RpciI6ICJjbCIsCisgICAgICAicHJvdG9jb2xzIjogWyJiaW5hcnkiLCAibXVsdGkiXSwKKyAgICAgICJ0cmFuc3BvcnRzIjogWyJidWZmZXJlZCIsICJmcmFtZWQiXSwKKyAgICAgICJzb2NrZXRzIjogWyJpcCJdCisgICAgfQorICB9LAorICB7CisgICAgIm5hbWUiOiAiZCIsCisgICAgInNlcnZlciI6IHsKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAidGhyaWZ0X3Rlc3Rfc2VydmVyIiwKKyAgICAgICAgIi0tdHJhY2UiCisgICAgICBdCisgICAgfSwKKyAgICAiY2xpZW50IjogeworICAgICAgImNvbW1hbmQiOiBbCisgICAgICAgICJ0aHJpZnRfdGVzdF9jbGllbnQiCisgICAgICBdCisgICAgfSwKKyAgICAidHJhbnNwb3J0cyI6IFsKKyAgICAgICJodHRwIiwKKyAgICAgICJidWZmZXJlZCIsCisgICAgICAiZnJhbWVkIgorICAgIF0sCisgICAgInNvY2tldHMiOiBbCisgICAgICAiaXAiLAorICAgICAgImlwLXNzbCIKKyAgICBdLAorICAgICJwcm90b2NvbHMiOiBbCisgICAgICAiYmluYXJ5IiwKKyAgICAgICJjb21wYWN0IiwKKyAgICAgICJqc29uIgorICAgIF0sCisgICAgIndvcmtkaXIiOiAiLi4vbGliL2QvdGVzdCIKKyAgfSwKKyAgeworICAgICJuYW1lIjogImdvIiwKKyAgICAic2VydmVyIjogeworICAgICAgImNvbW1hbmQiOiBbCisgICAgICAgICJ0ZXN0c2VydmVyIiwKKyAgICAgICAgIi0tY2VydFBhdGg9Li4vLi4va2V5cyIKKyAgICAgIF0KKyAgICB9LAorICAgICJjbGllbnQiOiB7CisgICAgICAidGltZW91dCI6IDYsCisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgInRlc3RjbGllbnQiCisgICAgICBdCisgICAgfSwKKyAgICAidHJhbnNwb3J0cyI6IFsKKyAgICAgICJidWZmZXJlZCIsCisgICAgICAiZnJhbWVkIiwKKyAgICAgICJodHRwIiwKKyAgICAgICJ6bGliIgorICAgIF0sCisgICAgInNvY2tldHMiOiBbCisgICAgICAiaXAiLAorICAgICAgImlwLXNzbCIKKyAgICBdLAorICAgICJwcm90b2NvbHMiOiBbCisgICAgICAiYmluYXJ5IiwKKyAgICAgICJjb21wYWN0IiwKKyAgICAgICJqc29uIgorICAgIF0sCisgICAgIndvcmtkaXIiOiAiZ28vYmluIgorICB9LAorICB7CisgICAgIm5hbWUiOiAiamF2YSIsCisgICAgImpvaW5fYXJncyI6IGZhbHNlLAorICAgICJzZXJ2ZXIiOiB7CisgICAgICAiZGVsYXkiOiAxNSwKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAiYnVpbGQvcnVuc2VydmVyIgorICAgICAgXSwKKyAgICAgICJwcm90b2NvbHMiOiBbCisgICAgICAgICJiaW5hcnk6bXVsdGkiLAorICAgICAgICAiY29tcGFjdDptdWx0aWMiLAorICAgICAgICAianNvbjptdWx0aWoiCisgICAgICBdCisgICAgfSwKKyAgICAiY2xpZW50IjogeworICAgICAgInRpbWVvdXQiOiAxMywKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAiYnVpbGQvcnVuY2xpZW50IgorICAgICAgXSwKKyAgICAgICJ0cmFuc3BvcnRzIjogWworICAgICAgICAiaHR0cCIKKyAgICAgIF0sCisgICAgICAicHJvdG9jb2xzIjogWworICAgICAgICAibXVsdGk6YmluYXJ5IiwKKyAgICAgICAgIm11bHRpYzpjb21wYWN0IiwKKyAgICAgICAgIm11bHRpajpqc29uIgorICAgICAgXQorICAgIH0sCisgICAgInRyYW5zcG9ydHMiOiBbCisgICAgICAiYnVmZmVyZWQiLAorICAgICAgImZyYW1lZCIsCisgICAgICAiZnJhbWVkOmZhc3RmcmFtZWQiCisgICAgXSwKKyAgICAic29ja2V0cyI6IFsKKyAgICAgICJpcCIsCisgICAgICAiaXAtc3NsIgorICAgIF0sCisgICAgInByb3RvY29scyI6IFsKKyAgICAgICJiaW5hcnkiLAorICAgICAgImNvbXBhY3QiLAorICAgICAgImpzb24iLAorICAgICAgIm11bHRpIiwKKyAgICAgICJtdWx0aWMiLAorICAgICAgIm11bHRpaiIKKyAgICBdLAorICAgICJ3b3JrZGlyIjogIi4uL2xpYi9qYXZhIgorICB9LAorICB7CisgICAgIm5hbWUiOiAibm9kZWpzIiwKKyAgICAiZW52IjogeworICAgICAgIk5PREVfUEFUSCI6ICIuLi9saWIiCisgICAgfSwKKyAgICAic2VydmVyIjogeworICAgICAgImNvbW1hbmQiOiBbCisgICAgICAgICJub2RlIiwKKyAgICAgICAgInNlcnZlci5qcyIsCisgICAgICAgICItLXR5cGU9dGNwIgorICAgICAgXQorICAgIH0sCisgICAgImNsaWVudCI6IHsKKyAgICAgICJ0aW1lb3V0IjogNiwKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAibm9kZSIsCisgICAgICAgICJjbGllbnQuanMiLAorICAgICAgICAiLS10eXBlPXRjcCIKKyAgICAgIF0KKyAgICB9LAorICAgICJ0cmFuc3BvcnRzIjogWworICAgICAgImJ1ZmZlcmVkIiwKKyAgICAgICJmcmFtZWQiLAorICAgICAgImh0dHAiCisgICAgXSwKKyAgICAic29ja2V0cyI6IFsKKyAgICAgICJpcCIsCisgICAgICAiaXAtc3NsIiwKKyAgICAgICJkb21haW4iCisgICAgXSwKKyAgICAicHJvdG9jb2xzIjogWworICAgICAgImNvbXBhY3QiLAorICAgICAgImJpbmFyeSIsCisgICAgICAianNvbiIKKyAgICBdLAorICAgICJ3b3JrZGlyIjogIi4uL2xpYi9ub2RlanMvdGVzdCIKKyAgfSwKKyAgeworICAgICJuYW1lIjogImhzIiwKKyAgICAic2VydmVyIjogeworICAgICAgImNvbW1hbmQiOiBbCisgICAgICAgICJUZXN0U2VydmVyIgorICAgICAgXQorICAgIH0sCisgICAgImNsaWVudCI6IHsKKyAgICAgICJ0aW1lb3V0IjogNiwKKyAgICAgICJ0cmFuc3BvcnRzIjogWworICAgICAgICAiaHR0cCIKKyAgICAgIF0sCisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgIlRlc3RDbGllbnQiCisgICAgICBdCisgICAgfSwKKyAgICAidHJhbnNwb3J0cyI6IFsKKyAgICAgICJidWZmZXJlZCIsCisgICAgICAiZnJhbWVkIgorICAgIF0sCisgICAgInNvY2tldHMiOiBbCisgICAgICAiaXAiCisgICAgXSwKKyAgICAicHJvdG9jb2xzIjogWworICAgICAgImhlYWRlciIsCisgICAgICAiY29tcGFjdCIsCisgICAgICAiYmluYXJ5IiwKKyAgICAgICJqc29uIgorICAgIF0sCisgICAgIndvcmtkaXIiOiAiaHMiCisgIH0sCisgIHsKKyAgICAibmFtZSI6ICJweSIsCisgICAgInNlcnZlciI6IHsKKyAgICAgICJleHRyYV9hcmdzIjogWyJUU2ltcGxlU2VydmVyIl0sCisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgIlRlc3RTZXJ2ZXIucHkiLAorICAgICAgICAiLS12ZXJib3NlIiwKKyAgICAgICAgIi0tZ2VucHlkaXI9Z2VuLXB5IgorICAgICAgXQorICAgIH0sCisgICAgImNsaWVudCI6IHsKKyAgICAgICJ0aW1lb3V0IjogMTAsCisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgIlRlc3RDbGllbnQucHkiLAorICAgICAgICAiLS12ZXJib3NlIiwKKyAgICAgICAgIi0taG9zdD1sb2NhbGhvc3QiLAorICAgICAgICAiLS1nZW5weWRpcj1nZW4tcHkiCisgICAgICBdLAorICAgICAgInByb3RvY29scyI6IFsKKyAgICAgICAgIm11bHRpIiwKKyAgICAgICAgIm11bHRpOm11bHRpYSIsCisgICAgICAgICJtdWx0aWMiLAorICAgICAgICAibXVsdGljOm11bHRpYWMiLAorICAgICAgICAibXVsdGlqIgorICAgICAgXQorICAgIH0sCisgICAgInRyYW5zcG9ydHMiOiBbCisgICAgICAiYnVmZmVyZWQiLAorICAgICAgImZyYW1lZCIsCisgICAgICAiaHR0cCIsCisgICAgICAiemxpYiIKKyAgICBdLAorICAgICJzb2NrZXRzIjogWworICAgICAgImlwIiwKKyAgICAgICJpcC1zc2wiCisgICAgXSwKKyAgICAicHJvdG9jb2xzIjogWworICAgICAgImNvbXBhY3QiLAorICAgICAgImJpbmFyeSIsCisgICAgICAianNvbiIsCisgICAgICAiYmluYXJ5OmFjY2VsIiwKKyAgICAgICJjb21wYWN0OmFjY2VsYyIsCisgICAgICAiaGVhZGVyIgorICAgIF0sCisgICAgIndvcmtkaXIiOiAicHkiCisgIH0sCisgIHsKKyAgICAiY29tbWVudCI6ICJVc2luZyAncHl0aG9uMycgZXhlY3V0YWJsZSB0byB0ZXN0IHB5MiBhbmQgMyBhdCBvbmNlIiwKKyAgICAibmFtZSI6ICJweTMiLAorICAgICJzZXJ2ZXIiOiB7CisgICAgICAiZXh0cmFfYXJncyI6IFsiVFNpbXBsZVNlcnZlciJdLAorICAgICAgImNvbW1hbmQiOiBbCisgICAgICAgICJweXRob24zIiwKKyAgICAgICAgIlRlc3RTZXJ2ZXIucHkiLAorICAgICAgICAiLS12ZXJib3NlIiwKKyAgICAgICAgIi0tZ2VucHlkaXI9Z2VuLXB5IgorICAgICAgXQorICAgIH0sCisgICAgImNsaWVudCI6IHsKKyAgICAgICJ0aW1lb3V0IjogMTAsCisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgInB5dGhvbjMiLAorICAgICAgICAiVGVzdENsaWVudC5weSIsCisgICAgICAgICItLWhvc3Q9bG9jYWxob3N0IiwKKyAgICAgICAgIi0tZ2VucHlkaXI9Z2VuLXB5IgorICAgICAgXSwKKyAgICAgICJwcm90b2NvbHMiOiBbCisgICAgICAgICJtdWx0aSIsCisgICAgICAgICJtdWx0aTptdWx0aWEiLAorICAgICAgICAibXVsdGljIiwKKyAgICAgICAgIm11bHRpYzptdWx0aWFjIiwKKyAgICAgICAgIm11bHRpaiIKKyAgICAgIF0KKyAgICB9LAorICAgICJ0cmFuc3BvcnRzIjogWworICAgICAgImJ1ZmZlcmVkIiwKKyAgICAgICJmcmFtZWQiLAorICAgICAgImh0dHAiLAorICAgICAgInpsaWIiCisgICAgXSwKKyAgICAic29ja2V0cyI6IFsKKyAgICAgICJpcCIsCisgICAgICAiaXAtc3NsIgorICAgIF0sCisgICAgInByb3RvY29scyI6IFsKKyAgICAgICJjb21wYWN0IiwKKyAgICAgICJiaW5hcnkiLAorICAgICAgImpzb24iLAorICAgICAgImJpbmFyeTphY2NlbCIsCisgICAgICAiY29tcGFjdDphY2NlbGMiLAorICAgICAgImhlYWRlciIKKyAgICBdLAorICAgICJ3b3JrZGlyIjogInB5IgorICB9LAorICB7CisgICAgIm5hbWUiOiAiY3BwIiwKKyAgICAic2VydmVyIjogeworICAgICAgImNvbW1hbmQiOiBbCisgICAgICAgICJUZXN0U2VydmVyIgorICAgICAgXSwKKyAgICAgICJwcm90b2NvbHMiOiBbCisgICAgICAgICJiaW5hcnk6bXVsdGkiLAorICAgICAgICAiY29tcGFjdDptdWx0aWMiLAorICAgICAgICAiaGVhZGVyOm11bHRpaCIsCisgICAgICAgICJqc29uOm11bHRpaiIKKyAgICAgIF0KKyAgICB9LAorICAgICJjbGllbnQiOiB7CisgICAgICAidGltZW91dCI6IDgsCisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgIlRlc3RDbGllbnQiCisgICAgICBdLAorICAgICAgInByb3RvY29scyI6IFsKKyAgICAgICAgIm11bHRpOmJpbmFyeSIsCisgICAgICAgICJtdWx0aWM6Y29tcGFjdCIsCisgICAgICAgICJtdWx0aWg6aGVhZGVyIiwKKyAgICAgICAgIm11bHRpajpqc29uIgorICAgICAgXQorICAgIH0sCisgICAgInRyYW5zcG9ydHMiOiBbCisgICAgICAiYnVmZmVyZWQiLAorICAgICAgImh0dHAiLAorICAgICAgImZyYW1lZCIsCisgICAgICAiemxpYiIKKyAgICBdLAorICAgICJzb2NrZXRzIjogWworICAgICAgImlwIiwKKyAgICAgICJpcC1zc2wiLAorICAgICAgImRvbWFpbiIKKyAgICBdLAorICAgICJwcm90b2NvbHMiOiBbCisgICAgICAiY29tcGFjdCIsCisgICAgICAiYmluYXJ5IiwKKyAgICAgICJqc29uIiwKKyAgICAgICJoZWFkZXIiLAorICAgICAgIm11bHRpIiwKKyAgICAgICJtdWx0aWMiLAorICAgICAgIm11bHRpaCIsCisgICAgICAibXVsdGlqIgorICAgIF0sCisgICAgIndvcmtkaXIiOiAiY3BwIgorICB9LAorICB7CisgICAgIm5hbWUiOiAicmIiLAorICAgICJzZXJ2ZXIiOiB7CisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgInJ1YnkiLAorICAgICAgICAiLi4vaW50ZWdyYXRpb24vVGVzdFNlcnZlci5yYiIKKyAgICAgIF0KKyAgICB9LAorICAgICJjbGllbnQiOiB7CisgICAgICAidGltZW91dCI6IDUsCisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgInJ1YnkiLAorICAgICAgICAiLi4vaW50ZWdyYXRpb24vVGVzdENsaWVudC5yYiIsCisgICAgICAgICItLSIKKyAgICAgIF0KKyAgICB9LAorICAgICJ0cmFuc3BvcnRzIjogWworICAgICAgImJ1ZmZlcmVkIiwKKyAgICAgICJmcmFtZWQiCisgICAgXSwKKyAgICAic29ja2V0cyI6IFsKKyAgICAgICJkb21haW4iLAorICAgICAgImlwIiwKKyAgICAgICJpcC1zc2wiCisgICAgXSwKKyAgICAicHJvdG9jb2xzIjogWworICAgICAgImJpbmFyeSIsCisgICAgICAiYmluYXJ5OmFjY2VsIiwKKyAgICAgICJjb21wYWN0IiwKKyAgICAgICJqc29uIgorICAgIF0sCisgICAgIndvcmtkaXIiOiAicmIvZ2VuLXJiIgorICB9LAorICB7CisgICAgIm5hbWUiOiAiY3NoYXJwIiwKKyAgICAiZW52IjogeworICAgICAgIk1PTk9fUEFUSCI6ICIuLi8uLi9saWIvY3NoYXJwLyIKKyAgICB9LAorICAgICJ0cmFuc3BvcnRzIjogWworICAgICAgImJ1ZmZlcmVkIiwKKyAgICAgICJmcmFtZWQiCisgICAgXSwKKyAgICAic29ja2V0cyI6IFsKKyAgICAgICJpcCIsCisgICAgICAiaXAtc3NsIgorICAgIF0sCisgICAgInByb3RvY29scyI6IFsKKyAgICAgICJiaW5hcnkiLAorICAgICAgImNvbXBhY3QiLAorICAgICAgImpzb24iCisgICAgXSwKKyAgICAic2VydmVyIjogeworICAgICAgImNvbW1hbmQiOiBbCisgICAgICAgICJtb25vIiwKKyAgICAgICAgIlRlc3RDbGllbnRTZXJ2ZXIuZXhlIiwKKyAgICAgICAgInNlcnZlciIKKyAgICAgIF0KKyAgICB9LAorICAgICJjbGllbnQiOiB7CisgICAgICAidGltZW91dCI6IDksCisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgIm1vbm8iLAorICAgICAgICAiVGVzdENsaWVudFNlcnZlci5leGUiLAorICAgICAgICAiY2xpZW50IgorICAgICAgXSwKKyAgICAgICJwcm90b2NvbHMiOiBbCisgICAgICAgICJtdWx0aSIsCisgICAgICAgICJtdWx0aWMiLAorICAgICAgICAibXVsdGk6YmluYXJ5IiwKKyAgICAgICAgIm11bHRpYzpjb21wYWN0IgorICAgICAgXQorICAgIH0sCisgICAgIndvcmtkaXIiOiAiY3NoYXJwIgorICB9LAorICB7CisgICAgIm5hbWUiOiAibmV0Y29yZSIsCisgICAgInRyYW5zcG9ydHMiOiBbCisgICAgICAiYnVmZmVyZWQiLAorICAgICAgImZyYW1lZCIKKyAgICBdLAorICAgICJzb2NrZXRzIjogWworICAgICAgImlwIiwKKyAgICAgICJpcC1zc2wiCisgICAgXSwKKyAgICAicHJvdG9jb2xzIjogWworICAgICAgImJpbmFyeSIsCisgICAgICAiY29tcGFjdCIsCisgICAgICAianNvbiIKKyAgICBdLAorICAgICJzZXJ2ZXIiOiB7CisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgImRvdG5ldCIsCisgICAgICAgICJydW4iLAorICAgICAgICAiLS1uby1idWlsZCIsCisgICAgICAgICItLXByb2plY3Q9U2VydmVyL1NlcnZlci5jc3Byb2oiLAorICAgICAgICAic2VydmVyIgorICAgICAgXQorICAgIH0sCisgICAgImNsaWVudCI6IHsKKyAgICAgICJ0aW1lb3V0IjogMTAsCisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgImRvdG5ldCIsCisgICAgICAgICJydW4iLAorICAgICAgICAiLS1uby1idWlsZCIsCisgICAgICAgICItLXByb2plY3Q9Q2xpZW50L0NsaWVudC5jc3Byb2oiLAorICAgICAgICAiY2xpZW50IgorICAgICAgXQorICAgIH0sCisgICAgICAgICJ3b3JrZGlyIjogIm5ldGNvcmUiCisgIH0sCisgIHsKKyAgICAibmFtZSI6ICJwZXJsIiwKKyAgICAidHJhbnNwb3J0cyI6IFsKKyAgICAgICJidWZmZXJlZCIsCisgICAgICAiZnJhbWVkIgorICAgIF0sCisgICAgInNvY2tldHMiOiBbCisgICAgICAiaXAiLAorICAgICAgImlwLXNzbCIsCisgICAgICAiZG9tYWluIgorICAgIF0sCisgICAgInByb3RvY29scyI6IFsKKyAgICAgICJiaW5hcnkiLAorICAgICAgIm11bHRpIgorICAgIF0sCisgICAgImNsaWVudCI6IHsKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAicGVybCIsCisgICAgICAgICItSWdlbi1wZXJsLyIsCisgICAgICAgICItSS4uLy4uL2xpYi9wZXJsL2xpYi8iLAorICAgICAgICAiVGVzdENsaWVudC5wbCIsCisgICAgICAgICItLWNhPS4uL2tleXMvQ0EucGVtIiwKKyAgICAgICAgIi0tY2VydD0uLi9rZXlzL2NsaWVudC5jcnQiLAorICAgICAgICAiLS1rZXk9Li4va2V5cy9jbGllbnQua2V5IgorICAgICAgXSwKKyAgICAgICJwcm90b2NvbHMiOiBbCisgICAgICAgICJtdWx0aTpiaW5hcnkiCisgICAgICBdCisgICAgfSwKKyAgICAic2VydmVyIjogeworICAgICAgImNvbW1hbmQiOiBbCisgICAgICAgICJwZXJsIiwKKyAgICAgICAgIi1JZ2VuLXBlcmwvIiwKKyAgICAgICAgIi1JLi4vLi4vbGliL3BlcmwvbGliLyIsCisgICAgICAgICJUZXN0U2VydmVyLnBsIiwKKyAgICAgICAgIi0tY2VydD0uLi9rZXlzL3NlcnZlci5jcnQiLAorICAgICAgICAiLS1rZXk9Li4va2V5cy9zZXJ2ZXIua2V5IgorICAgICAgXSwKKyAgICAgICJwcm90b2NvbHMiOiBbCisgICAgICAgICJiaW5hcnk6bXVsdGkiCisgICAgICBdCisgICAgfSwKKyAgICAid29ya2RpciI6ICJwZXJsIgorICB9LAorICB7CisgICAgIm5hbWUiOiAicGhwIiwKKyAgICAiY2xpZW50IjogeworICAgICAgInRpbWVvdXQiOiA2LAorICAgICAgInRyYW5zcG9ydHMiOiBbCisgICAgICAgICJidWZmZXJlZCIsCisgICAgICAgICJmcmFtZWQiCisgICAgICBdLAorICAgICAgInNvY2tldHMiOiBbCisgICAgICAgICJpcCIKKyAgICAgIF0sCisgICAgICAicHJvdG9jb2xzIjogWworICAgICAgICAiYmluYXJ5IiwKKyAgICAgICAgImNvbXBhY3QiLAorICAgICAgICAiYmluYXJ5OmFjY2VsIgorICAgICAgXSwKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAicGhwIiwKKyAgICAgICAgIi1kZXh0ZW5zaW9uX2Rpcj1waHBfZXh0X2RpciIsCisgICAgICAgICItLXBocC1pbmk9dGVzdF9waHAuaW5pIiwKKyAgICAgICAgIi0tbm8tcGhwLWluaSIsCisgICAgICAgICItZGRpc3BsYXlfZXJyb3JzPXN0ZGVyciIsCisgICAgICAgICItZGxvZ19lcnJvcnM9MCIsCisgICAgICAgICItZGVycm9yX3JlcG9ydGluZz1FX0FMTCIsCisgICAgICAgICJUZXN0Q2xpZW50LnBocCIKKyAgICAgIF0KKyAgICB9LAorICAgICJ3b3JrZGlyIjogInBocCIKKyAgfSwKKyAgeworICAgICJuYW1lIjogImRhcnQiLAorICAgICJjbGllbnQiOiB7CisgICAgICAidHJhbnNwb3J0cyI6IFsKKyAgICAgICAgImJ1ZmZlcmVkIiwKKyAgICAgICAgImZyYW1lZCIsCisgICAgICAgICJodHRwIgorICAgICAgXSwKKyAgICAgICJzb2NrZXRzIjogWworICAgICAgICAiaXAiCisgICAgICBdLAorICAgICAgInByb3RvY29scyI6IFsKKyAgICAgICAgImJpbmFyeSIsCisgICAgICAgICJjb21wYWN0IiwKKyAgICAgICAgImpzb24iCisgICAgICBdLAorICAgICAgImNvbW1hbmQiOiBbCisgICAgICAgICJkYXJ0IiwKKyAgICAgICAgInRlc3RfY2xpZW50L2Jpbi9tYWluLmRhcnQiCisgICAgICBdCisgICAgfSwKKyAgICAid29ya2RpciI6ICJkYXJ0IgorICB9LAorICB7CisgICAgIm5hbWUiOiAiZXJsIiwKKyAgICAidHJhbnNwb3J0cyI6IFsKKyAgICAgICJidWZmZXJlZCIsCisgICAgICAiZnJhbWVkIgorICAgIF0sCisgICAgInNvY2tldHMiOiBbCisgICAgICAiaXAiLAorICAgICAgImlwLXNzbCIKKyAgICBdLAorICAgICJwcm90b2NvbHMiOiBbCisgICAgICAiYmluYXJ5IiwKKyAgICAgICJjb21wYWN0IgorICAgIF0sCisgICAgImNsaWVudCI6IHsKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAiZXJsIiwKKyAgICAgICAgIitLIiwKKyAgICAgICAgInRydWUiLAorICAgICAgICAiLW5vc2hlbGwiLAorICAgICAgICAiLXBhIiwKKyAgICAgICAgIi4uLy4uL2xpYi9lcmwvZWJpbi8iLAorICAgICAgICAiLXBhIiwKKyAgICAgICAgIi4vZWJpbiIsCisgICAgICAgICItcyIsCisgICAgICAgICJ0ZXN0X2NsaWVudCIsCisgICAgICAgICItcyIsCisgICAgICAgICJpbml0IiwKKyAgICAgICAgInN0b3AiLAorICAgICAgICAiLWV4dHJhIgorICAgICAgXQorICAgIH0sCisgICAgInNlcnZlciI6IHsKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAiZXJsIiwKKyAgICAgICAgIitLIiwKKyAgICAgICAgInRydWUiLAorICAgICAgICAiLW5vc2hlbGwiLAorICAgICAgICAiLXBhIiwKKyAgICAgICAgIi4uLy4uL2xpYi9lcmwvZWJpbi8iLAorICAgICAgICAiLXBhIiwKKyAgICAgICAgIi4vZWJpbiIsCisgICAgICAgICItcyIsCisgICAgICAgICJ0ZXN0X3RocmlmdF9zZXJ2ZXIiLAorICAgICAgICAiLWV4dHJhIgorICAgICAgXQorICAgIH0sCisgICAgIndvcmtkaXIiOiAiZXJsIgorICB9LAorICB7CisgICAgIm5hbWUiOiAianMiLAorICAgICJ0cmFuc3BvcnRzIjogWworICAgICAgImh0dHAiCisgICAgXSwKKyAgICAic29ja2V0cyI6IFsKKyAgICAgICJpcCIKKyAgICBdLAorICAgICJwcm90b2NvbHMiOiBbCisgICAgICAianNvbiIKKyAgICBdLAorICAgICJjbGllbnQiOiB7CisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgInBoYW50b21qcyIsCisgICAgICAgICJ0ZXN0L3BoYW50b20tY2xpZW50LmpzIgorICAgICAgXQorICAgIH0sCisgICAgIndvcmtkaXIiOiAiLi4vbGliL2pzIgorICB9LAorICB7CisgICAgIm5hbWUiOiAibHVhIiwKKyAgICAiVE9ETyI6ICJBZGQgZGxsIHRvIExVQV9DUEFUSCIsCisgICAgImVudiI6IHsKKyAgICAgICJMVUFfUEFUSCI6ICI7O2dlbi1sdWEvPy5sdWE7Li4vLi4vbGliL2x1YS8/Lmx1YSIsCisgICAgICAiTFVBX0NQQVRIIjogIjs7Li4vLi4vbGliL2x1YS8ubGlicy8/LnNvIgorICAgIH0sCisgICAgImNsaWVudCI6IHsKKyAgICAgICJ0aW1lb3V0IjogNSwKKyAgICAgICJ0cmFuc3BvcnRzIjogWworICAgICAgICAiYnVmZmVyZWQiLAorICAgICAgICAiZnJhbWVkIiwKKyAgICAgICAgImh0dHAiCisgICAgICBdLAorICAgICAgInNvY2tldHMiOiBbCisgICAgICAgICJpcCIKKyAgICAgIF0sCisgICAgICAicHJvdG9jb2xzIjogWworICAgICAgICAiYmluYXJ5IiwKKyAgICAgICAgImNvbXBhY3QiLAorICAgICAgICAianNvbiIKKyAgICAgIF0sCisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgImx1YSIsCisgICAgICAgICJ0ZXN0X2Jhc2ljX2NsaWVudC5sdWEiCisgICAgICBdCisgICAgfSwKKyAgICAid29ya2RpciI6ICJsdWEiCisgIH0sCisgIHsKKyAgICAibmFtZSI6ICJycyIsCisgICAgImVudiI6IHsKKyAgICAgICJSVVNUX0JBQ0tUUkFDRSI6ICIxIiwKKyAgICAgICJSVVNUX0xPRyI6ICJpbmZvIgorICAgIH0sCisgICAgInNlcnZlciI6IHsKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAidGVzdF9zZXJ2ZXIiCisgICAgICBdLAorICAgICAgInByb3RvY29scyI6IFsKKyAgICAgICAgImJpbmFyeTptdWx0aSIsCisgICAgICAgICJjb21wYWN0Om11bHRpYyIKKyAgICAgIF0KKyAgICB9LAorICAgICJjbGllbnQiOiB7CisgICAgICAidGltZW91dCI6IDYsCisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgInRlc3RfY2xpZW50IgorICAgICAgXSwKKyAgICAgICJwcm90b2NvbHMiOiBbCisgICAgICAgICJtdWx0aTpiaW5hcnkiLAorICAgICAgICAibXVsdGljOmNvbXBhY3QiCisgICAgICBdCisgICAgfSwKKyAgICAic29ja2V0cyI6IFsKKyAgICAgICJpcCIKKyAgICBdLAorICAgICJ0cmFuc3BvcnRzIjogWworICAgICAgImJ1ZmZlcmVkIiwKKyAgICAgICJmcmFtZWQiCisgICAgXSwKKyAgICAicHJvdG9jb2xzIjogWworICAgICAgImJpbmFyeSIsCisgICAgICAiY29tcGFjdCIsCisgICAgICAibXVsdGkiLAorICAgICAgIm11bHRpYyIKKyAgICBdLAorICAgICJ3b3JrZGlyIjogInJzL2JpbiIKKyAgfSwKKyAgeworICAgICJuYW1lIjogIm5vZGV0cyIsCisgICAgImVudiI6IHsKKyAgICAgICJOT0RFX1BBVEgiOiAiLi4vbGliIgorICAgIH0sCisgICAgInNlcnZlciI6IHsKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAicnVuU2VydmVyLnNoIgorICAgICAgXQorICAgIH0sCisgICAgImNsaWVudCI6IHsKKyAgICAgICJ0aW1lb3V0IjogNiwKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAicnVuQ2xpZW50LnNoIgorICAgICAgXQorICAgIH0sCisgICAgInByb3RvY29scyI6IFsKKyAgICAgICJiaW5hcnkiCisgICAgXSwKKyAgICAic29ja2V0cyI6IFsKKyAgICAgICJpcCIKKyAgICBdLAorICAgICJ0cmFuc3BvcnRzIjogWworICAgICAgImJ1ZmZlcmVkIgorICAgIF0sCisgICAgIndvcmtkaXIiOiAiLi4vbGliL25vZGV0cy90ZXN0IgorICB9CitdCmRpZmYgLS1naXQgYS90ZXN0L3ZhbGdyaW5kLnN1cHByZXNzIGIvdGVzdC92YWxncmluZC5zdXBwcmVzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTE3Y2I4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC92YWxncmluZC5zdXBwcmVzcwpAQCAtMCwwICsxLDUzIEBACit7CisgICBib29zdC9nZXRfb25jZV9wZXJfdGhyZWFkX2Vwb2NoL2lnbm9yZQorICAgTWVtY2hlY2s6TGVhaworICAgbWF0Y2gtbGVhay1raW5kczogcmVhY2hhYmxlCisgICBmdW46bWFsbG9jCisgICBmdW46X1pONWJvb3N0NmRldGFpbDI1Z2V0X29uY2VfcGVyX3RocmVhZF9lcG9jaEV2Cit9Cit7CisgICBib29zdHRocmVhZHMvb25jZS9pZ25vcmUKKyAgIEhlbGdyaW5kOlJhY2UKKyAgIGZ1bjpfWk41Ym9vc3QxM3RocmVhZF9kZXRhaWwxN2VudGVyX29uY2VfcmVnaW9uRVJOU185b25jZV9mbGFnRQorICAgZnVuOl9aTjVib29zdDZkZXRhaWwyM2dldF9jdXJyZW50X3RocmVhZF9kYXRhRXYKKyAgIGZ1bjpfWk41Ym9vc3Q2ZGV0YWlsMjBpbnRlcnJ1cHRpb25fY2hlY2tlckMxRVAxNXB0aHJlYWRfbXV0ZXhfdFAxNHB0aHJlYWRfY29uZF90CisgICBmdW46X1pONWJvb3N0MjJjb25kaXRpb25fdmFyaWFibGVfYW55NHdhaXRJTlNfMTF1bmlxdWVfbG9ja0lOU18xMXRpbWVkX211dGV4RUVFRUV2UlRfCisgICBmdW46X1pONmFwYWNoZTZ0aHJpZnQxMWNvbmN1cnJlbmN5N01vbml0b3I0SW1wbDExd2FpdEZvcmV2ZXJFdgorICAgZnVuOl9aTjZhcGFjaGU2dGhyaWZ0MTFjb25jdXJyZW5jeTdNb25pdG9yNEltcGwxOXdhaXRGb3JUaW1lUmVsYXRpdmVFbAorICAgZnVuOl9aTjZhcGFjaGU2dGhyaWZ0MTFjb25jdXJyZW5jeTdNb25pdG9yNEltcGw0d2FpdEVsCisgICBmdW46X1pOSzZhcGFjaGU2dGhyaWZ0MTFjb25jdXJyZW5jeTdNb25pdG9yNHdhaXRFbAorICAgZnVuOl9aTjZhcGFjaGU2dGhyaWZ0MTFjb25jdXJyZW5jeTExQm9vc3RUaHJlYWQ1c3RhcnRFdgorICAgZnVuOl9aTjZhcGFjaGU2dGhyaWZ0MTFjb25jdXJyZW5jeTR0ZXN0MThUaHJlYWRGYWN0b3J5VGVzdHMxMnJlYXBOVGhyZWFkc0VpaQorICAgZnVuOm1haW4KK30KK3sKKyAgIHB0aHJlYWQvY3JlYXRpb24tdGxzL2lnbm9yZQorICAgSGVsZ3JpbmQ6UmFjZQorICAgZnVuOm1lbXBjcHkKKyAgIGZ1bjpfZGxfYWxsb2NhdGVfdGxzX2luaXQKKyAgIGZ1bjpnZXRfY2FjaGVkX3N0YWNrCisgICBmdW46YWxsb2NhdGVfc3RhY2sKKyAgIGZ1bjpwdGhyZWFkX2NyZWF0ZUBAR0xJQkNfMi4yKgorICAgb2JqOi91c3IvbGliL3ZhbGdyaW5kL3ZncHJlbG9hZF9oZWxncmluZC1hbWQ2NC1saW51eC5zbworICAgZnVuOl9aTjZhcGFjaGU2dGhyaWZ0MTFjb25jdXJyZW5jeTEzUHRocmVhZFRocmVhZDVzdGFydEV2CisgICBmdW46X1pONmFwYWNoZTZ0aHJpZnQxMWNvbmN1cnJlbmN5NHRlc3QxOFRocmVhZEZhY3RvcnlUZXN0czEycmVhcE5UaHJlYWRzRWlpCisgICBmdW46bWFpbgorfQoreworICAgYm9vc3QtdGhyZWFkL2NyZWF0aW9uLXRscy9pZ25vcmUKKyAgIEhlbGdyaW5kOlJhY2UKKyAgIGZ1bjptZW1wY3B5CisgICBmdW46X2RsX2FsbG9jYXRlX3Rsc19pbml0CisgICBmdW46Z2V0X2NhY2hlZF9zdGFjaworICAgZnVuOmFsbG9jYXRlX3N0YWNrCisgICBmdW46cHRocmVhZF9jcmVhdGVAQEdMSUJDXzIuMi41CisgICBvYmo6L3Vzci9saWIvdmFsZ3JpbmQvdmdwcmVsb2FkX2hlbGdyaW5kLWFtZDY0LWxpbnV4LnNvCisgICBmdW46X1pONWJvb3N0NnRocmVhZDIxc3RhcnRfdGhyZWFkX25vZXhjZXB0RXYKKyAgIGZ1bjpfWk41Ym9vc3Q2dGhyZWFkMTJzdGFydF90aHJlYWRFdgorICAgZnVuOl9aTjVib29zdDZ0aHJlYWRDMUlTdDVfQmluZElGUEZQdlMzX0VTM19FRUVFT1RfCisgICBmdW46X1pONmFwYWNoZTZ0aHJpZnQxMWNvbmN1cnJlbmN5MTFCb29zdFRocmVhZDVzdGFydEV2CisgICBmdW46X1pONmFwYWNoZTZ0aHJpZnQxMWNvbmN1cnJlbmN5NHRlc3QxOFRocmVhZEZhY3RvcnlUZXN0czEycmVhcE5UaHJlYWRzRWlpCisgICBmdW46bWFpbgorfQorCisKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL01ha2VmaWxlLmFtIGIvdHV0b3JpYWwvTWFrZWZpbGUuYW0KaW5kZXggMmI5YmU1Mi4uMDQ5OTQ2MCAxMDA3NTUKLS0tIGEvdHV0b3JpYWwvTWFrZWZpbGUuYW0KKysrIGIvdHV0b3JpYWwvTWFrZWZpbGUuYW0KQEAgLTMxLDYgKzMxLDEwIEBACiBTVUJESVJTICs9IGNwcAogZW5kaWYKIAoraWYgV0lUSF9ECitTVUJESVJTICs9IGQKK2VuZGlmCisKIGlmIFdJVEhfSkFWQQogU1VCRElSUyArPSBqYXZhCiBTVUJESVJTICs9IGpzCkBAIC01MCw2ICs1NCwxNCBAQAogU1VCRElSUyArPSBocwogZW5kaWYKIAoraWYgV0lUSF9IQVhFCitTVUJESVJTICs9IGhheGUKK2VuZGlmCisKK2lmIFdJVEhfRE9UTkVUQ09SRQorU1VCRElSUyArPSBuZXRjb3JlCitlbmRpZgorCiBpZiBXSVRIX0dPCiBTVUJESVJTICs9IGdvCiBlbmRpZgpAQCAtNTgsMTEgKzcwLDI3IEBACiBTVUJESVJTICs9IG5vZGVqcwogZW5kaWYKIAoraWYgV0lUSF9EQVJUCitTVUJESVJTICs9IGRhcnQKK2VuZGlmCisKK2lmIFdJVEhfUlMKK1NVQkRJUlMgKz0gcnMKK2VuZGlmCisKK2lmIFdJVEhfQ0wKK1NVQkRJUlMgKz0gY2wKK2VuZGlmCisKICMKICMgZ2VuZXJhdGUgaHRtbCBmb3IgVGhyaWZ0VGVzdC50aHJpZnQKICMKIGFsbC1sb2NhbDoKIAkkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL3RocmlmdCAtLWdlbiBodG1sIC1yICQodG9wX3NyY2RpcikvdHV0b3JpYWwvdHV0b3JpYWwudGhyaWZ0CisKK2NsZWFuLWxvY2FsOgorCXJtIC1yZiAkKHRvcF9zcmNkaXIpL3R1dG9yaWFsL2dlbi1odG1sCisKIGVuZGlmCiAKICMgQW55IGZvbGRlcnMgb3IgZmlsZXMgbm90IGxpc3RlZCBhYm92ZSBiZWluZyBhZGRlZCB0byBTVUJESVIgbmVlZCB0byBiZSBwbGFjZWQgaGVyZSBpbgpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvY19nbGliL01ha2VmaWxlLmFtIGIvdHV0b3JpYWwvY19nbGliL01ha2VmaWxlLmFtCmluZGV4IDM3NzI5ODQuLjRkYmU2NTUgMTAwNzU1Ci0tLSBhL3R1dG9yaWFsL2NfZ2xpYi9NYWtlZmlsZS5hbQorKysgYi90dXRvcmlhbC9jX2dsaWIvTWFrZWZpbGUuYW0KQEAgLTE4LDExICsxOCwxNSBAQAogIwogQVVUT01BS0VfT1BUSU9OUyA9IHN1YmRpci1vYmplY3RzIHNlcmlhbC10ZXN0cwogCi1BTV9DRkxBR1MgPSAtZyAtV2FsbCAtV2V4dHJhIC1wZWRhbnRpYyAkKEdMSUJfQ0ZMQUdTKSAkKEdPQkpFQ1RfQ0ZMQUdTKSBAR0NPVl9DRkxBR1NACi1BTV9DUFBGTEFHUyA9IC1JJCh0b3Bfc3JjZGlyKS9saWIvY19nbGliL3NyYyAtSWdlbi1jX2dsaWIKLUFNX0xERkxBR1MgPSAkKEdMSUJfTElCUykgJChHT0JKRUNUX0xJQlMpIEBHQ09WX0xERkxBR1NACitCVUlMVF9TT1VSQ0VTID0gXAorCWdlbi1jX2dsaWIvY2FsY3VsYXRvci5oIFwKKwlnZW4tY19nbGliL3NoYXJlZF9zZXJ2aWNlLmggXAorCWdlbi1jX2dsaWIvc2hhcmVkX3R5cGVzLmggXAorCWdlbi1jX2dsaWIvdHV0b3JpYWxfdHlwZXMuaAogCi1USFJJRlQgPSAkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL3RocmlmdAorQU1fQ0ZMQUdTID0gLWcgLVdhbGwgLVdleHRyYSAtcGVkYW50aWMgJChHTElCX0NGTEFHUykgJChHT0JKRUNUX0NGTEFHUykgJChPUEVOU1NMX0lOQ0xVREVTKSBAR0NPVl9DRkxBR1NACitBTV9DUFBGTEFHUyA9IC1JJCh0b3Bfc3JjZGlyKS9saWIvY19nbGliL3NyYyAtSWdlbi1jX2dsaWIKK0FNX0xERkxBR1MgPSAkKEdMSUJfTElCUykgJChHT0JKRUNUX0xJQlMpICQoT1BFTlNTTF9MREZMQUdTKSAkKE9QRU5TU0xfTElCUykgQEdDT1ZfTERGTEFHU0AKIAogbm9pbnN0X0xUTElCUkFSSUVTID0gXAogCWxpYnR1dG9yaWFsZ2VuY2dsaWIubGEKQEAgLTQwLDYgKzQ0LDggQEAKIGxpYnR1dG9yaWFsZ2VuY2dsaWJfbGFfTElCQUREID0gXAogCSQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL2xpYnRocmlmdF9jX2dsaWIubGEKIAorbGlidHV0b3JpYWxnZW5jZ2xpYl9sYV9DRkxBR1MgPSBcCisJJChBTV9DRkxBR1MpIC1Xbm8tdW51c2VkLWZ1bmN0aW9uCiAKIG5vaW5zdF9QUk9HUkFNUyA9IFwKIAl0dXRvcmlhbF9zZXJ2ZXIgXApAQCAtNDcsNiArNTMsNyBAQAogCiB0dXRvcmlhbF9zZXJ2ZXJfU09VUkNFUyA9IFwKIAljX2dsaWJfc2VydmVyLmMKK3R1dG9yaWFsX3NlcnZlcl9MREZMQUdTID0gJChPUEVOU1NMX0xJQlMpCiAKIHR1dG9yaWFsX3NlcnZlcl9MREFERCA9IFwKIAlsaWJ0dXRvcmlhbGdlbmNnbGliLmxhIFwKQEAgLTYwLDExICs2NywxMSBAQAogCSQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL2xpYnRocmlmdF9jX2dsaWIubGEKIAogCi0kKG5vZGlzdF9saWJ0dXRvcmlhbGdlbmNnbGliX2xhX1NPVVJDRVMpOiAkKHRvcF9zcmNkaXIpL3R1dG9yaWFsL3R1dG9yaWFsLnRocmlmdAorZ2VuLWNfZ2xpYi9jYWxjdWxhdG9yLmMgZ2VuLWNfZ2xpYi9jYWxjdWxhdG9yLmggZ2VuLWNfZ2xpYi9zaGFyZWRfc2VydmljZS5jIGdlbi1jX2dsaWIvc2hhcmVkX3NlcnZpY2UuaCBnZW4tY19nbGliL3NoYXJlZF90eXBlcy5jIGdlbi1jX2dsaWIvc2hhcmVkX3R5cGVzLmggZ2VuLWNfZ2xpYi90dXRvcmlhbF90eXBlcy5jIGdlbi1jX2dsaWIvdHV0b3JpYWxfdHlwZXMuaDogJCh0b3Bfc3JjZGlyKS90dXRvcmlhbC90dXRvcmlhbC50aHJpZnQKIAkkKFRIUklGVCkgLS1nZW4gY19nbGliIC1yICQ8CiAKIGNsZWFuLWxvY2FsOgotCSQoUk0pIC1yIGdlbi1jX2dsaWIKKwkkKFJNKSBnZW4tY19nbGliLyoKIAogdHV0b3JpYWxzZXJ2ZXI6IGFsbAogCS4vdHV0b3JpYWxfc2VydmVyCmRpZmYgLS1naXQgYS90dXRvcmlhbC9jX2dsaWIvY19nbGliX2NsaWVudC5jIGIvdHV0b3JpYWwvY19nbGliL2NfZ2xpYl9jbGllbnQuYwppbmRleCAzY2VhMGMyLi45ODZkNTE3IDEwMDY0NAotLS0gYS90dXRvcmlhbC9jX2dsaWIvY19nbGliX2NsaWVudC5jCisrKyBiL3R1dG9yaWFsL2NfZ2xpYi9jX2dsaWJfY2xpZW50LmMKQEAgLTc3LDcgKzc3LDcgQEAKICAgICAgaW5mb3JtYXRpb24gYWJvdXQgYW55IGVycm9yIHRoYXQgb2NjdXJzLgogCiAgICAgIE9uIHN1Y2Nlc3MsIGNsaWVudCBtZXRob2RzIHJldHVybiBUUlVFLiBBIHJldHVybiB2YWx1ZSBvZiBGQUxTRQotICAgICBpbmRpY2F0ZXMgYW4gZXJyb3Igb2NjdXJlZCBhbmQgdGhlIGVycm9yIHBhcmFtZXRlciBoYXMgYmVlbgorICAgICBpbmRpY2F0ZXMgYW4gZXJyb3Igb2NjdXJyZWQgYW5kIHRoZSBlcnJvciBwYXJhbWV0ZXIgaGFzIGJlZW4KICAgICAgc2V0LiAqLwogICBpZiAoIWVycm9yICYmIGNhbGN1bGF0b3JfaWZfcGluZyAoY2xpZW50LCAmZXJyb3IpKSB7CiAgICAgcHV0cyAoInBpbmcoKSIpOwpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvY19nbGliL2NfZ2xpYl9zZXJ2ZXIuYyBiL3R1dG9yaWFsL2NfZ2xpYi9jX2dsaWJfc2VydmVyLmMKaW5kZXggMjdmOWY5NS4uNDdiZjQ3ZiAxMDA2NDQKLS0tIGEvdHV0b3JpYWwvY19nbGliL2NfZ2xpYl9zZXJ2ZXIuYworKysgYi90dXRvcmlhbC9jX2dsaWIvY19nbGliX3NlcnZlci5jCkBAIC0xMDAsNyArMTAwLDcgQEAKIAogR19ERUZJTkVfVFlQRSAoVHV0b3JpYWxDYWxjdWxhdG9ySGFuZGxlciwKICAgICAgICAgICAgICAgIHR1dG9yaWFsX2NhbGN1bGF0b3JfaGFuZGxlciwKLSAgICAgICAgICAgICAgIFRZUEVfQ0FMQ1VMQVRPUl9IQU5ETEVSKTsKKyAgICAgICAgICAgICAgIFRZUEVfQ0FMQ1VMQVRPUl9IQU5ETEVSKQogCiAvKiBFYWNoIG9mIGEgaGFuZGxlcidzIG1ldGhvZHMgYWNjZXB0cyBhdCBsZWFzdCB0d28gcGFyYW1ldGVyczogQQogICAgcG9pbnRlciB0byB0aGUgc2VydmljZS1pbnRlcmZhY2UgaW1wbGVtZW50YXRpb24gKHRoZSBoYW5kbGVyIG9iamVjdApAQCAtMTA4LDcgKzEwOCw3IEBACiAgICBhYm91dCBhbnkgZXJyb3IgdGhhdCBvY2N1cnMuCiAKICAgIE9uIHN1Y2Nlc3MsIGEgaGFuZGxlciBtZXRob2QgcmV0dXJucyBUUlVFLiBBIHJldHVybiB2YWx1ZSBvZiBGQUxTRQotICAgaW5kaWNhdGVzIGFuIGVycm9yIG9jY3VyZWQgYW5kIHRoZSBlcnJvciBwYXJhbWV0ZXIgaGFzIGJlZW4KKyAgIGluZGljYXRlcyBhbiBlcnJvciBvY2N1cnJlZCBhbmQgdGhlIGVycm9yIHBhcmFtZXRlciBoYXMgYmVlbgogICAgc2V0LiAoTWV0aG9kcyBzaG91bGQgbm90IHJldHVybiBGQUxTRSB3aXRob3V0IGZpcnN0IHNldHRpbmcgdGhlCiAgICBlcnJvciBwYXJhbWV0ZXIuKSAqLwogc3RhdGljIGdib29sZWFuCkBAIC0xNzMsOCArMTczLDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludmFsaWRPcGVyYXRpb24gKipvdWNoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAqKmVycm9yKQogewotICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOwotCiAgIFR1dG9yaWFsQ2FsY3VsYXRvckhhbmRsZXIgKnNlbGY7CiAKICAgZ2ludCAqbG9nX2tleTsKQEAgLTE4Niw2ICsxODQsOCBAQAogICBPcGVyYXRpb24gb3A7CiAgIGdib29sZWFuIHJlc3VsdCA9IFRSVUU7CiAKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKwogICBnX3JldHVybl92YWxfaWZfZmFpbCAoSVNfVFVUT1JJQUxfQ0FMQ1VMQVRPUl9IQU5ETEVSIChpZmFjZSksCiAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSk7CiAgIHNlbGYgPSBUVVRPUklBTF9DQUxDVUxBVE9SX0hBTkRMRVIgKGlmYWNlKTsKQEAgLTIzMSw3ICsyMzEsNyBAQAogICAgICAgICAgc2V0dGluZyB0aGUgY29ycmVzcG9uZGluZyBvdXRwdXQgcGFyYW1ldGVyIHRvIGEgbmV3IGluc3RhbmNlCiAgICAgICAgICBvZiBpdHMgdHlwZSBhbmQgcmV0dXJuaW5nIEZBTFNFLiAqLwogICAgICAgKm91Y2ggPSBnX29iamVjdF9uZXcgKFRZUEVfSU5WQUxJRF9PUEVSQVRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIndoYXQiLCBvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2hhdE9wIiwgb3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndoeSIsICBnX3N0cmR1cCAoIkNhbm5vdCBkaXZpZGUgYnkgMCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwogICAgICAgcmVzdWx0ID0gRkFMU0U7CkBAIC0yNDksNyArMjQ5LDcgQEAKIAogICBkZWZhdWx0OgogICAgICpvdWNoID0gZ19vYmplY3RfbmV3IChUWVBFX0lOVkFMSURfT1BFUkFUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAid2hhdCIsIG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAid2hhdE9wIiwgb3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aHkiLCAgZ19zdHJkdXAgKCJJbnZhbGlkIE9wZXJhdGlvbiIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKICAgICByZXN1bHQgPSBGQUxTRTsKQEAgLTMwMCwxNCArMzAwLDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2ludDMyICAgICAga2V5MzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICoqZXJyb3IpCiB7Ci0gIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7Ci0KICAgZ2ludCBrZXkgPSAoZ2ludClrZXkzMjsKICAgVHV0b3JpYWxDYWxjdWxhdG9ySGFuZGxlciAqc2VsZjsKICAgU2hhcmVkU3RydWN0ICpsb2dfc3RydWN0OwogICBnaW50IGxvZ19rZXk7CiAgIGdjaGFyICpsb2dfdmFsdWU7CiAKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKwogICBnX3JldHVybl92YWxfaWZfZmFpbCAoSVNfVFVUT1JJQUxfQ0FMQ1VMQVRPUl9IQU5ETEVSIChpZmFjZSksCiAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSk7CiAgIHNlbGYgPSBUVVRPUklBTF9DQUxDVUxBVE9SX0hBTkRMRVIgKGlmYWNlKTsKQEAgLTQ0MCw3ICs0NDAsNyBAQAogCiAgIHN0cnVjdCBzaWdhY3Rpb24gc2lnaW50X2FjdGlvbjsKIAotICBHRXJyb3IgKmVycm9yOworICBHRXJyb3IgKmVycm9yID0gTlVMTDsKICAgaW50IGV4aXRfc3RhdHVzID0gMDsKIAogI2lmICghR0xJQl9DSEVDS19WRVJTSU9OICgyLCAzNiwgMCkpCmRpZmYgLS1naXQgYS90dXRvcmlhbC9jbC9NYWtlZmlsZS5hbSBiL3R1dG9yaWFsL2NsL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjJiMjAxM2EKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9jbC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDY1IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKworc2V0dXAtbG9jYWwtbGlzcC1lbnY6IGVuc3VyZS1leHRlcm5hbHMuc2gKKwliYXNoIGVuc3VyZS1leHRlcm5hbHMuc2gKKworZ2VuLWNsOiAkKHRvcF9zcmNkaXIpL3R1dG9yaWFsL3R1dG9yaWFsLnRocmlmdAorCSQoVEhSSUZUKSAtLWdlbiBjbCAtciAkPAorCitBTExfRklMRV9QUkVSRVFTID0gXAorCQkgICBsb2FkLWxvY2FsbHkubGlzcCBcCisJCSAgIG1ha2UtdHV0b3JpYWwtc2VydmVyLmxpc3AgXAorCQkgICBtYWtlLXR1dG9yaWFsLWNsaWVudC5saXNwIFwKKwkJICAgc2hhcmVkLWltcGxlbWVudGF0aW9uLmxpc3AgXAorCQkgICB0aHJpZnQtdHV0b3JpYWwuYXNkIFwKKwkJICAgdHV0b3JpYWwtaW1wbGVtZW50YXRpb24ubGlzcAorCisjIE5PVEU6IHRoZSBzZXJ2ZXIgYW5kIGNsaWVudCBjYW5ub3QgYmUgYnVpbHQgaW4gcGFyYWxsZWwKKyMgYmVjYXVzZSBvbiBsb2FkaW5nIHRoZSBtYWtlLXR1dG9yaWFsLSogc2NyaXB0cyBTQkNMIHdpbGwKKyMgYXR0ZW1wdCB0byBjb21waWxlIHRoZWlyIGRlcGVuZGVuY2llcy4gVW5mb3J0dW5hdGVseSwKKyMgYmVjYXVzZSB0aGVpciBkZXBlbmRlbmNpZXMgYXJlIHNoYXJlZCwgcGFyYWxsZWwgam9icyBjYW4KKyMgZW5kIHVwIG92ZXJ3cml0aW5nIG9yIGNvcnJ1cHRpbmcgdGhlIGNvbXBpbGVkIGZpbGVzCithbGwtbG9jYWw6IGdlbi1jbCBzZXR1cC1sb2NhbC1saXNwLWVudiAkKEFMTF9GSUxFX1BSRVJFUVMpCisJJChTQkNMKSAtLXNjcmlwdCBtYWtlLXR1dG9yaWFsLXNlcnZlci5saXNwCisJJChTQkNMKSAtLXNjcmlwdCBtYWtlLXR1dG9yaWFsLWNsaWVudC5saXNwCisKK3R1dG9yaWFsc2VydmVyOiBhbGwKKwkuL1R1dG9yaWFsU2VydmVyCisKK3R1dG9yaWFsY2xpZW50OiBhbGwKKwkuL1R1dG9yaWFsQ2xpZW50CisKK2NsZWFuLWxvY2FsOgorCS0kKFJNKSAtciBnZW4tKgorCS0kKFJNKSAtciBleHRlcm5hbHMKKwktJChSTSkgLXIgcXVpY2tsaXNwCisJLSQoUk0pIC1yIGxpYgorCS0kKFJNKSBxdWlja2xpc3AubGlzcAorCS0kKFJNKSBiYWNrcG9ydC11cGRhdGUuemlwCisJLSQoUk0pIHNoYXJlZC1pbXBsZW1lbnRhdGlvbi5mYXNsCisJLSQoUk0pIHR1dG9yaWFsLWltcGxlbWVudGF0aW9uLmZhc2wKKwktJChSTSkgVHV0b3JpYWxTZXJ2ZXIKKwktJChSTSkgVHV0b3JpYWxDbGllbnQKKworRVhUUkFfRElTVCA9IFwKKwl0dXRvcmlhbC1pbXBsZW1lbnRhdGlvbi5saXNwIFwKKwlzaGFyZWQtaW1wbGVtZW50YXRpb24ubGlzcCBcCisJdGhyaWZ0LXR1dG9yaWFsLmFzZCBcCisJbWFrZS10dXRvcmlhbC1zZXJ2ZXIubGlzcCBcCisJbWFrZS10dXRvcmlhbC1jbGllbnQubGlzcApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvY2wvZW5zdXJlLWV4dGVybmFscy5zaCBiL3R1dG9yaWFsL2NsL2Vuc3VyZS1leHRlcm5hbHMuc2gKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNWFlOGM1NgotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2NsL2Vuc3VyZS1leHRlcm5hbHMuc2gKQEAgLTAsMCArMSBAQAorLi4vLi4vbGliL2NsL2Vuc3VyZS1leHRlcm5hbHMuc2gKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90dXRvcmlhbC9jbC9sb2FkLWxvY2FsbHkubGlzcCBiL3R1dG9yaWFsL2NsL2xvYWQtbG9jYWxseS5saXNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MmEwYTIKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9jbC9sb2FkLWxvY2FsbHkubGlzcApAQCAtMCwwICsxLDIyIEBACisoaW4tcGFja2FnZSAjOmNsLXVzZXIpCisKKzs7OzsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis7Ozs7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzs7OzsgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis7Ozs7Cis7Ozs7ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzs7OzsKKzs7OzsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOzs7OyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOzs7OyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzs7OzsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOzs7OyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworOzs7OyBKdXN0IGEgc2NyaXB0IGZvciBsb2FkaW5nIHRoZSBsaWJyYXJ5IGl0c2VsZiwgdXNpbmcgYnVuZGxlZCBkZXBlbmRlbmNpZXMuCis7Ozs7IFRoaXMgaXMgYW4gaWRlbnRpY2FsIGNvcHkgb2YgdGhlIGZpbGUgaW4gbGliL2NsLgorCisocmVxdWlyZSAiYXNkZiIpCisKKyhsb2FkIChtZXJnZS1wYXRobmFtZXMgImV4dGVybmFscy9idW5kbGUubGlzcCIgKmxvYWQtdHJ1ZW5hbWUqKSkKKyhhc2RmOmxvYWQtYXNkIChtZXJnZS1wYXRobmFtZXMgImxpYi9kZS5zZXRmLnRocmlmdC1iYWNrcG9ydC11cGRhdGUvdGhyaWZ0LmFzZCIgKmxvYWQtdHJ1ZW5hbWUqKSkKKyhhc2RmOmxvYWQtc3lzdGVtIDp0aHJpZnQpCmRpZmYgLS1naXQgYS90dXRvcmlhbC9jbC9tYWtlLXR1dG9yaWFsLWNsaWVudC5saXNwIGIvdHV0b3JpYWwvY2wvbWFrZS10dXRvcmlhbC1jbGllbnQubGlzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTZkODYxCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvY2wvbWFrZS10dXRvcmlhbC1jbGllbnQubGlzcApAQCAtMCwwICsxLDUxIEBACisoaW4tcGFja2FnZSAjOmNsLXVzZXIpCisKKzs7OzsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis7Ozs7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzs7OzsgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis7Ozs7Cis7Ozs7ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzs7OzsKKzs7OzsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOzs7OyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOzs7OyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzs7OzsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOzs7OyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworKHJlcXVpcmUgImFzZGYiKQorKGxvYWQgKG1lcmdlLXBhdGhuYW1lcyAibG9hZC1sb2NhbGx5Lmxpc3AiICpsb2FkLXRydWVuYW1lKikpCisoYXNkZjpsb2FkLXN5c3RlbSA6bmV0LmRpZGllcnZlcm5hLmNsb24pCisoYXNkZjpsb2FkLWFzZCAobWVyZ2UtcGF0aG5hbWVzICJnZW4tY2wvc2hhcmVkL3RocmlmdC1nZW4tc2hhcmVkLmFzZCIgKmxvYWQtdHJ1ZW5hbWUqKSkKKyhhc2RmOmxvYWQtYXNkIChtZXJnZS1wYXRobmFtZXMgImdlbi1jbC90dXRvcmlhbC90aHJpZnQtZ2VuLXR1dG9yaWFsLmFzZCIgKmxvYWQtdHJ1ZW5hbWUqKSkKKyhhc2RmOmxvYWQtYXNkIChtZXJnZS1wYXRobmFtZXMgInRocmlmdC10dXRvcmlhbC5hc2QiICpsb2FkLXRydWVuYW1lKikpCisoYXNkZjpsb2FkLXN5c3RlbSA6dGhyaWZ0LXR1dG9yaWFsKQorCisobmV0LmRpZGllcnZlcm5hLmNsb246bmlja25hbWUtcGFja2FnZSkKKworKGRlZnVuIG1haW4gKCkKKyAgIkVudHJ5IHBvaW50IGZvciB0aGUgYmluYXJ5LiIKKyAgKHRocmlmdDp3aXRoLWNsaWVudCAocHJvdCAjdSJ0aHJpZnQ6Ly8xMjcuMC4wLjE6OTA5MCIpCisgICAgKHR1dG9yaWFsLmNhbGN1bGF0b3I6cGluZyBwcm90KQorICAgIChmb3JtYXQgdCAicGluZygpfiUiKQorICAgIChmb3JtYXQgdCAiMSArIDEgPSB+YX4lIiAodHV0b3JpYWwuY2FsY3VsYXRvcjphZGQgcHJvdCAxIDEpKQorICAgIChsZXQgKCh3b3JrLWluc3RhbmNlICh0dXRvcmlhbDptYWtlLXdvcmsgOm51bTEgNQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOm51bTIgMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOm9wIHR1dG9yaWFsOm9wZXJhdGlvbi5kaXZpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpjb21tZW50ICJCb295YSEiKSkpCisgICAgICAoaGFuZGxlci1jYXNlIChmb3JtYXQgdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICI1IC8gMCA9IH5hIC0gT2gsIHJlYWxseT8gQW4gZXhjZXB0aW9uIHNob3VsZCBoYXZlIGJlZW4gdGhyb3duIGhlcmUufiUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHR1dG9yaWFsLmNhbGN1bGF0b3I6Y2FsY3VsYXRlIHByb3QgMSB3b3JrLWluc3RhbmNlKSkKKyAgICAgICAgKHR1dG9yaWFsOmludmFsaWRvcGVyYXRpb24gKGUpCisgICAgICAgICAgKGZvcm1hdCB0ICItLS1+JShFeHBlY3RlZCkgSW52YWxpZCBPcGVyYXRpb24gY2F1Z2h0OiB+JX5hfiUtLS1+JSIgZSkpKSkKKyAgICAobGV0ICgod29yay1pbnN0YW5jZSAodHV0b3JpYWw6bWFrZS13b3JrIDpudW0xIDE1CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6bnVtMiAxMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOm9wIHR1dG9yaWFsOm9wZXJhdGlvbi5zdWJ0cmFjdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmNvbW1lbnQgIlBsYXlpbmcgbmljZSB0aGlzIHRpbWUuIikpKQorICAgICAgKGhhbmRsZXItY2FzZSAoZm9ybWF0IHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMTUgLSAxMCA9IH5hfiUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHR1dG9yaWFsLmNhbGN1bGF0b3I6Y2FsY3VsYXRlIHByb3QgMSB3b3JrLWluc3RhbmNlKSkKKyAgICAgICAgKHR1dG9yaWFsOmludmFsaWRvcGVyYXRpb24gKGUpCisgICAgICAgICAgKGZvcm1hdCB0ICItLS1+JShVbmV4cGVjdGVkKSBJbnZhbGlkIE9wZXJhdGlvbiBjYXVnaHQ6IH4lfmF+JS0tLX4lIiBlKSkpKQorICAgIChmb3JtYXQgdCAiQ2hlY2sgbG9nOiB+YX4lIiAoc2hhcmVkLnNoYXJlZC1zZXJ2aWNlOmdldC1zdHJ1Y3QgcHJvdCAxKSkpKQorCisoY2xvbjpkdW1wICJUdXRvcmlhbENsaWVudCIgbWFpbikKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2NsL21ha2UtdHV0b3JpYWwtc2VydmVyLmxpc3AgYi90dXRvcmlhbC9jbC9tYWtlLXR1dG9yaWFsLXNlcnZlci5saXNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjZjFhOTAKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9jbC9tYWtlLXR1dG9yaWFsLXNlcnZlci5saXNwCkBAIC0wLDAgKzEsMjkgQEAKKyhpbi1wYWNrYWdlICM6Y2wtdXNlcikKKworOzs7OyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzs7OzsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOzs7OyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzs7OzsKKzs7OzsgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOzs7OworOzs7OyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis7Ozs7IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis7Ozs7IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOzs7OyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis7Ozs7IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisocmVxdWlyZSAiYXNkZiIpCisobG9hZCAobWVyZ2UtcGF0aG5hbWVzICJsb2FkLWxvY2FsbHkubGlzcCIgKmxvYWQtdHJ1ZW5hbWUqKSkKKyhhc2RmOmxvYWQtc3lzdGVtIDpuZXQuZGlkaWVydmVybmEuY2xvbikKKyhhc2RmOmxvYWQtYXNkIChtZXJnZS1wYXRobmFtZXMgImdlbi1jbC9zaGFyZWQvdGhyaWZ0LWdlbi1zaGFyZWQuYXNkIiAqbG9hZC10cnVlbmFtZSopKQorKGFzZGY6bG9hZC1hc2QgKG1lcmdlLXBhdGhuYW1lcyAiZ2VuLWNsL3R1dG9yaWFsL3RocmlmdC1nZW4tdHV0b3JpYWwuYXNkIiAqbG9hZC10cnVlbmFtZSopKQorKGFzZGY6bG9hZC1hc2QgKG1lcmdlLXBhdGhuYW1lcyAidGhyaWZ0LXR1dG9yaWFsLmFzZCIgKmxvYWQtdHJ1ZW5hbWUqKSkKKyhhc2RmOmxvYWQtc3lzdGVtIDp0aHJpZnQtdHV0b3JpYWwpCisKKyhuZXQuZGlkaWVydmVybmEuY2xvbjpuaWNrbmFtZS1wYWNrYWdlKQorCisoZGVmdW4gbWFpbiAoKQorICAiRW50cnkgcG9pbnQgZm9yIHRoZSBiaW5hcnkuIgorICAodGhyaWZ0OnNlcnZlICN1InRocmlmdDovLzEyNy4wLjAuMTo5MDkwIiB0dXRvcmlhbDpjYWxjdWxhdG9yKSkKKworKGNsb246ZHVtcCAiVHV0b3JpYWxTZXJ2ZXIiIG1haW4pCmRpZmYgLS1naXQgYS90dXRvcmlhbC9jbC9zaGFyZWQtaW1wbGVtZW50YXRpb24ubGlzcCBiL3R1dG9yaWFsL2NsL3NoYXJlZC1pbXBsZW1lbnRhdGlvbi5saXNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxOTc2MjYKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9jbC9zaGFyZWQtaW1wbGVtZW50YXRpb24ubGlzcApAQCAtMCwwICsxLDI1IEBACisoaW4tcGFja2FnZSAjOnNoYXJlZC1pbXBsZW1lbnRhdGlvbikKKworOzs7OyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzs7OzsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOzs7OyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzs7OzsKKzs7OzsgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOzs7OworOzs7OyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis7Ozs7IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis7Ozs7IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOzs7OyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis7Ozs7IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisoZGVmdmFyICpzdHJ1Y3RzKiAobWFrZS1oYXNoLXRhYmxlKSkKKworKGRlZnVuIHNoYXJlZC5zaGFyZWQtc2VydmljZS1pbXBsZW1lbnRhdGlvbjpnZXQtc3RydWN0IChrZXkpCisgIChmb3JtYXQgdCAiZ2V0U3RydWN0KH5hKX4lIiBrZXkpCisgIChnZXRoYXNoIGtleSAqc3RydWN0cyopKQorCisoZGVmdW4gYWRkLWxvZyAoa2V5IHZhbHVlKQorICAoc2V0ZiAoZ2V0aGFzaCBrZXkgKnN0cnVjdHMqKQorICAgICAgICAobWFrZS1pbnN0YW5jZSAnc2hhcmVkOnNoYXJlZHN0cnVjdAorICAgICAgICAgICAgICAgICAgICAgICA6a2V5IGtleQorICAgICAgICAgICAgICAgICAgICAgICA6dmFsdWUgKHdyaXRlLXRvLXN0cmluZyB2YWx1ZSkpKSkKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2NsL3RocmlmdC10dXRvcmlhbC5hc2QgYi90dXRvcmlhbC9jbC90aHJpZnQtdHV0b3JpYWwuYXNkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhMDM1MzcKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9jbC90aHJpZnQtdHV0b3JpYWwuYXNkCkBAIC0wLDAgKzEsMTcgQEAKKzs7OzsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis7Ozs7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzs7OzsgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis7Ozs7Cis7Ozs7ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzs7OzsKKzs7OzsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOzs7OyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOzs7OyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzs7OzsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOzs7OyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworKGFzZGY6ZGVmc3lzdGVtICM6dGhyaWZ0LXR1dG9yaWFsCisgIDpkZXBlbmRzLW9uICgjOnRocmlmdC1nZW4tdHV0b3JpYWwpCisgIDpzZXJpYWwgdAorICA6Y29tcG9uZW50cyAoKDpmaWxlICJzaGFyZWQtaW1wbGVtZW50YXRpb24iKQorICAgICAgICAgICAgICAgKDpmaWxlICJ0dXRvcmlhbC1pbXBsZW1lbnRhdGlvbiIpKSkKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2NsL3R1dG9yaWFsLWltcGxlbWVudGF0aW9uLmxpc3AgYi90dXRvcmlhbC9jbC90dXRvcmlhbC1pbXBsZW1lbnRhdGlvbi5saXNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjOTJmZTQKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9jbC90dXRvcmlhbC1pbXBsZW1lbnRhdGlvbi5saXNwCkBAIC0wLDAgKzEsNDEgQEAKKyhpbi1wYWNrYWdlICM6dHV0b3JpYWwtaW1wbGVtZW50YXRpb24pCisKKzs7OzsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis7Ozs7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzs7OzsgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis7Ozs7Cis7Ozs7ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzs7OzsKKzs7OzsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOzs7OyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOzs7OyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzs7OzsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOzs7OyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworKGRlZnVuIHR1dG9yaWFsLmNhbGN1bGF0b3ItaW1wbGVtZW50YXRpb246cGluZyAoKQorICAoZm9ybWF0IHQgInBpbmcoKX4lIikpCisKKyhkZWZ1biB0dXRvcmlhbC5jYWxjdWxhdG9yLWltcGxlbWVudGF0aW9uOmFkZCAobnVtMSBudW0yKQorICAoZm9ybWF0IHQgImFkZCh+YSwgfmEpfiUiIG51bTEgbnVtMikKKyAgKCsgbnVtMSBudW0yKSkKKworKGRlZnVuIHR1dG9yaWFsLmNhbGN1bGF0b3ItaW1wbGVtZW50YXRpb246Y2FsY3VsYXRlIChsb2dpZCB3b3JrKQorICAoZm9ybWF0IHQgImNhbGN1bGF0ZSh+YSwgfmEpfiUiIGxvZ2lkIHdvcmspCisgIChoYW5kbGVyLWNhc2UKKyAgICAgIChsZXQqICgobnVtMSAodHV0b3JpYWw6d29yay1udW0xIHdvcmspKQorICAgICAgICAgICAgIChudW0yICh0dXRvcmlhbDp3b3JrLW51bTIgd29yaykpCisgICAgICAgICAgICAgKG9wICh0dXRvcmlhbDp3b3JrLW9wIHdvcmspKQorICAgICAgICAgICAgIChyZXN1bHQKKyAgICAgICAgICAgICAgKGNvbmQKKyAgICAgICAgICAgICAgICAoKD0gb3AgdHV0b3JpYWw6b3BlcmF0aW9uLmFkZCkgKCsgbnVtMSBudW0yKSkKKyAgICAgICAgICAgICAgICAoKD0gb3AgdHV0b3JpYWw6b3BlcmF0aW9uLnN1YnRyYWN0KSAoLSBudW0xIG51bTIpKQorICAgICAgICAgICAgICAgICgoPSBvcCB0dXRvcmlhbDpvcGVyYXRpb24ubXVsdGlwbHkpICgqIG51bTEgbnVtMikpCisgICAgICAgICAgICAgICAgKCg9IG9wIHR1dG9yaWFsOm9wZXJhdGlvbi5kaXZpZGUpICgvIG51bTEgbnVtMikpKSkpCisgICAgICAgIChzaGFyZWQtaW1wbGVtZW50YXRpb246OmFkZC1sb2cgbG9naWQgcmVzdWx0KQorICAgICAgICByZXN1bHQpCisgICAgKGRpdmlzaW9uLWJ5LXplcm8gKCkgKGVycm9yICd0dXRvcmlhbDppbnZhbGlkb3BlcmF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDp3aHkgIkRpdmlzaW9uIGJ5IHplcm8uIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6d2hhdC1vcCAodHV0b3JpYWw6d29yay1vcCB3b3JrKSkpKSkKKworKGRlZnVuIHR1dG9yaWFsLmNhbGN1bGF0b3ItaW1wbGVtZW50YXRpb246emlwICgpCisgIChmb3JtYXQgdCAiemlwKCl+JSIpKQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvY3BwL0NNYWtlTGlzdHMudHh0IGIvdHV0b3JpYWwvY3BwL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2MzRiNDEKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9jcHAvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw1NiBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2luY2x1ZGVfZGlyZWN0b3JpZXMoU1lTVEVNICIke0Jvb3N0X0lOQ0xVREVfRElSU30iKQorCisjTWFrZSBzdXJlIGdlbi1jcHAgZmlsZXMgY2FuIGJlIGluY2x1ZGVkCitpbmNsdWRlX2RpcmVjdG9yaWVzKCIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0iKQoraW5jbHVkZV9kaXJlY3RvcmllcygiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1jcHAiKQoraW5jbHVkZV9kaXJlY3RvcmllcygiJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L2xpYi9jcHAvc3JjIikKKworaW5jbHVkZShUaHJpZnRNYWNyb3MpCisKK3NldCh0dXRvcmlhbGdlbmNwcF9TT1VSQ0VTCisgICAgZ2VuLWNwcC9DYWxjdWxhdG9yLmNwcAorICAgIGdlbi1jcHAvU2hhcmVkU2VydmljZS5jcHAKKyAgICBnZW4tY3BwL3NoYXJlZF9jb25zdGFudHMuY3BwCisgICAgZ2VuLWNwcC9zaGFyZWRfdHlwZXMuY3BwCisgICAgZ2VuLWNwcC90dXRvcmlhbF9jb25zdGFudHMuY3BwCisgICAgZ2VuLWNwcC90dXRvcmlhbF90eXBlcy5jcHAKKykKK2FkZF9saWJyYXJ5KHR1dG9yaWFsZ2VuY3BwIFNUQVRJQyAke3R1dG9yaWFsZ2VuY3BwX1NPVVJDRVN9KQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKHR1dG9yaWFsZ2VuY3BwIHRocmlmdCkKKworYWRkX2N1c3RvbV9jb21tYW5kKE9VVFBVVCBnZW4tY3BwL0NhbGN1bGF0b3IuY3BwIGdlbi1jcHAvU2hhcmVkU2VydmljZS5jcHAgZ2VuLWNwcC9zaGFyZWRfY29uc3RhbnRzLmNwcCBnZW4tY3BwL3NoYXJlZF90eXBlcy5jcHAgZ2VuLWNwcC90dXRvcmlhbF9jb25zdGFudHMuY3BwIGdlbi1jcHAvdHV0b3JpYWxfdHlwZXMuY3BwCisgICAgQ09NTUFORCAke1RIUklGVF9DT01QSUxFUn0gLS1nZW4gY3BwIC1yICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90dXRvcmlhbC90dXRvcmlhbC50aHJpZnQKKykKKworYWRkX2V4ZWN1dGFibGUoVHV0b3JpYWxTZXJ2ZXIgQ3BwU2VydmVyLmNwcCkKK3RhcmdldF9saW5rX2xpYnJhcmllcyhUdXRvcmlhbFNlcnZlciB0dXRvcmlhbGdlbmNwcCkKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShUdXRvcmlhbFNlcnZlciB0aHJpZnQpCitpZiAoWkxJQl9GT1VORCkKKyAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKFR1dG9yaWFsU2VydmVyICR7WkxJQl9MSUJSQVJJRVN9KQorZW5kaWYgKCkKKworYWRkX2V4ZWN1dGFibGUoVHV0b3JpYWxDbGllbnQgQ3BwQ2xpZW50LmNwcCkKK3RhcmdldF9saW5rX2xpYnJhcmllcyhUdXRvcmlhbENsaWVudCB0dXRvcmlhbGdlbmNwcCkKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShUdXRvcmlhbENsaWVudCB0aHJpZnQpCitpZiAoWkxJQl9GT1VORCkKKyAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKFR1dG9yaWFsQ2xpZW50ICR7WkxJQl9MSUJSQVJJRVN9KQorZW5kaWYgKCkKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2NwcC9DcHBDbGllbnQuY3BwIGIvdHV0b3JpYWwvY3BwL0NwcENsaWVudC5jcHAKaW5kZXggOGVmOTc2Yi4uNTIwODQxMSAxMDA2NDQKLS0tIGEvdHV0b3JpYWwvY3BwL0NwcENsaWVudC5jcHAKKysrIGIvdHV0b3JpYWwvY3BwL0NwcENsaWVudC5jcHAKQEAgLTMzLDEwICszMywxMCBAQAogdXNpbmcgbmFtZXNwYWNlIHR1dG9yaWFsOwogdXNpbmcgbmFtZXNwYWNlIHNoYXJlZDsKIAotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHNvY2tldChuZXcgVFNvY2tldCgibG9jYWxob3N0IiwgOTA5MCkpOwotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQobmV3IFRCdWZmZXJlZFRyYW5zcG9ydChzb2NrZXQpKTsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90b2NvbChuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCkpOworaW50IG1haW4oKSB7CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBzb2NrZXQobmV3IFRTb2NrZXQoImxvY2FsaG9zdCIsIDkwOTApKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydChuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KHNvY2tldCkpOworICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90b2NvbChuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCkpOwogICBDYWxjdWxhdG9yQ2xpZW50IGNsaWVudChwcm90b2NvbCk7CiAKICAgdHJ5IHsKQEAgLTU4LDYgKzU4LDcgQEAKICAgICB9IGNhdGNoIChJbnZhbGlkT3BlcmF0aW9uJiBpbykgewogICAgICAgY291dCA8PCAiSW52YWxpZE9wZXJhdGlvbjogIiA8PCBpby53aHkgPDwgZW5kbDsKICAgICAgIC8vIG9yIHVzaW5nIGdlbmVyYXRlZCBvcGVyYXRvcjw8OiBjb3V0IDw8IGlvIDw8IGVuZGw7CisgICAgICAvLyBvciBieSB1c2luZyBzdGQ6OmV4Y2VwdGlvbiBuYXRpdmUgbWV0aG9kIHdoYXQoKTogY291dCA8PCBpby53aGF0KCkgPDwgZW5kbDsKICAgICB9CiAKICAgICB3b3JrLm9wID0gT3BlcmF0aW9uOjpTVUJUUkFDVDsKQEAgLTc2LDUgKzc3LDQgQEAKICAgfSBjYXRjaCAoVEV4Y2VwdGlvbiYgdHgpIHsKICAgICBjb3V0IDw8ICJFUlJPUjogIiA8PCB0eC53aGF0KCkgPDwgZW5kbDsKICAgfQotCiB9CmRpZmYgLS1naXQgYS90dXRvcmlhbC9jcHAvQ3BwU2VydmVyLmNwcCBiL3R1dG9yaWFsL2NwcC9DcHBTZXJ2ZXIuY3BwCmluZGV4IGY3YTY5ZTIuLmY3Mzc5ZDUgMTAwNjQ0Ci0tLSBhL3R1dG9yaWFsL2NwcC9DcHBTZXJ2ZXIuY3BwCisrKyBiL3R1dG9yaWFsL2NwcC9DcHBTZXJ2ZXIuY3BwCkBAIC0xOCwxMiArMTgsMTMgQEAKICAqLwogCiAjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXIuaD4KLSNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvUG9zaXhUaHJlYWRGYWN0b3J5Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1BsYXRmb3JtVGhyZWFkRmFjdG9yeS5oPgogI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KICNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuaD4KICNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UVGhyZWFkZWRTZXJ2ZXIuaD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRVdGlscy5oPgogI2luY2x1ZGUgPHRocmlmdC9UVG9TdHJpbmcuaD4KIApAQCAtNDQsMTIgKzQ1LDEwIEBACiB1c2luZyBuYW1lc3BhY2Ugc2hhcmVkOwogCiBjbGFzcyBDYWxjdWxhdG9ySGFuZGxlciA6IHB1YmxpYyBDYWxjdWxhdG9ySWYgewotIHB1YmxpYzoKK3B1YmxpYzoKICAgQ2FsY3VsYXRvckhhbmRsZXIoKSB7fQogCi0gIHZvaWQgcGluZygpIHsKLSAgICBjb3V0IDw8ICJwaW5nKCkiIDw8IGVuZGw7Ci0gIH0KKyAgdm9pZCBwaW5nKCkgeyBjb3V0IDw8ICJwaW5nKCkiIDw8IGVuZGw7IH0KIAogICBpbnQzMl90IGFkZChjb25zdCBpbnQzMl90IG4xLCBjb25zdCBpbnQzMl90IG4yKSB7CiAgICAgY291dCA8PCAiYWRkKCIgPDwgbjEgPDwgIiwgIiA8PCBuMiA8PCAiKSIgPDwgZW5kbDsKQEAgLTczLDcgKzcyLDcgQEAKICAgICBjYXNlIE9wZXJhdGlvbjo6RElWSURFOgogICAgICAgaWYgKHdvcmsubnVtMiA9PSAwKSB7CiAgICAgICAgIEludmFsaWRPcGVyYXRpb24gaW87Ci0gICAgICAgIGlvLndoYXQgPSB3b3JrLm9wOworICAgICAgICBpby53aGF0T3AgPSB3b3JrLm9wOwogICAgICAgICBpby53aHkgPSAiQ2Fubm90IGRpdmlkZSBieSAwIjsKICAgICAgICAgdGhyb3cgaW87CiAgICAgICB9CkBAIC04MSw3ICs4MCw3IEBACiAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgogICAgICAgSW52YWxpZE9wZXJhdGlvbiBpbzsKLSAgICAgIGlvLndoYXQgPSB3b3JrLm9wOworICAgICAgaW8ud2hhdE9wID0gd29yay5vcDsKICAgICAgIGlvLndoeSA9ICJJbnZhbGlkIE9wZXJhdGlvbiI7CiAgICAgICB0aHJvdyBpbzsKICAgICB9CkBAIC05NSw1NiArOTQsODIgQEAKICAgICByZXR1cm4gdmFsOwogICB9CiAKLSAgdm9pZCBnZXRTdHJ1Y3QoU2hhcmVkU3RydWN0ICZyZXQsIGNvbnN0IGludDMyX3QgbG9naWQpIHsKKyAgdm9pZCBnZXRTdHJ1Y3QoU2hhcmVkU3RydWN0JiByZXQsIGNvbnN0IGludDMyX3QgbG9naWQpIHsKICAgICBjb3V0IDw8ICJnZXRTdHJ1Y3QoIiA8PCBsb2dpZCA8PCAiKSIgPDwgZW5kbDsKICAgICByZXQgPSBsb2dbbG9naWRdOwogICB9CiAKLSAgdm9pZCB6aXAoKSB7Ci0gICAgY291dCA8PCAiemlwKCkiIDw8IGVuZGw7Ci0gIH0KKyAgdm9pZCB6aXAoKSB7IGNvdXQgPDwgInppcCgpIiA8PCBlbmRsOyB9CiAKIHByb3RlY3RlZDoKICAgbWFwPGludDMyX3QsIFNoYXJlZFN0cnVjdD4gbG9nOwotCiB9OwogCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKy8qCisgIENhbGN1bGF0b3JJZkZhY3RvcnkgaXMgY29kZSBnZW5lcmF0ZWQuCisgIENhbGN1bGF0b3JDbG9uZUZhY3RvcnkgaXMgdXNlZnVsIGZvciBnZXR0aW5nIGFjY2VzcyB0byB0aGUgc2VydmVyIHNpZGUgb2YgdGhlCisgIHRyYW5zcG9ydC4gIEl0IGlzIGFsc28gdXNlZnVsIGZvciBtYWtpbmcgcGVyLWNvbm5lY3Rpb24gc3RhdGUuICBXaXRob3V0IHRoaXMKKyAgQ2xvbmVGYWN0b3J5LCBhbGwgY29ubmVjdGlvbnMgd2lsbCBlbmQgdXAgc2hhcmluZyB0aGUgc2FtZSBoYW5kbGVyIGluc3RhbmNlLgorKi8KK2NsYXNzIENhbGN1bGF0b3JDbG9uZUZhY3RvcnkgOiB2aXJ0dWFsIHB1YmxpYyBDYWxjdWxhdG9ySWZGYWN0b3J5IHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgfkNhbGN1bGF0b3JDbG9uZUZhY3RvcnkoKSB7fQorICB2aXJ0dWFsIENhbGN1bGF0b3JJZiogZ2V0SGFuZGxlcihjb25zdCA6OmFwYWNoZTo6dGhyaWZ0OjpUQ29ubmVjdGlvbkluZm8mIGNvbm5JbmZvKQorICB7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+IHNvY2sgPSBzdGQ6OmR5bmFtaWNfcG9pbnRlcl9jYXN0PFRTb2NrZXQ+KGNvbm5JbmZvLnRyYW5zcG9ydCk7CisgICAgY291dCA8PCAiSW5jb21pbmcgY29ubmVjdGlvblxuIjsKKyAgICBjb3V0IDw8ICJcdFNvY2tldEluZm86ICIgIDw8IHNvY2stPmdldFNvY2tldEluZm8oKSA8PCAiXG4iOworICAgIGNvdXQgPDwgIlx0UGVlckhvc3Q6ICIgICAgPDwgc29jay0+Z2V0UGVlckhvc3QoKSA8PCAiXG4iOworICAgIGNvdXQgPDwgIlx0UGVlckFkZHJlc3M6ICIgPDwgc29jay0+Z2V0UGVlckFkZHJlc3MoKSA8PCAiXG4iOworICAgIGNvdXQgPDwgIlx0UGVlclBvcnQ6ICIgICAgPDwgc29jay0+Z2V0UGVlclBvcnQoKSA8PCAiXG4iOworICAgIHJldHVybiBuZXcgQ2FsY3VsYXRvckhhbmRsZXI7CisgIH0KKyAgdmlydHVhbCB2b2lkIHJlbGVhc2VIYW5kbGVyKCA6OnNoYXJlZDo6U2hhcmVkU2VydmljZUlmKiBoYW5kbGVyKSB7CisgICAgZGVsZXRlIGhhbmRsZXI7CisgIH0KK307CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpOwotICBib29zdDo6c2hhcmVkX3B0cjxDYWxjdWxhdG9ySGFuZGxlcj4gaGFuZGxlcihuZXcgQ2FsY3VsYXRvckhhbmRsZXIoKSk7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvcihuZXcgQ2FsY3VsYXRvclByb2Nlc3NvcihoYW5kbGVyKSk7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+IHNlcnZlclRyYW5zcG9ydChuZXcgVFNlcnZlclNvY2tldCg5MDkwKSk7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiB0cmFuc3BvcnRGYWN0b3J5KG5ldyBUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KCkpOworaW50IG1haW4oKSB7CisgIFRUaHJlYWRlZFNlcnZlciBzZXJ2ZXIoCisgICAgc3RkOjptYWtlX3NoYXJlZDxDYWxjdWxhdG9yUHJvY2Vzc29yRmFjdG9yeT4oc3RkOjptYWtlX3NoYXJlZDxDYWxjdWxhdG9yQ2xvbmVGYWN0b3J5PigpKSwKKyAgICBzdGQ6Om1ha2Vfc2hhcmVkPFRTZXJ2ZXJTb2NrZXQ+KDkwOTApLCAvL3BvcnQKKyAgICBzdGQ6Om1ha2Vfc2hhcmVkPFRCdWZmZXJlZFRyYW5zcG9ydEZhY3Rvcnk+KCksCisgICAgc3RkOjptYWtlX3NoYXJlZDxUQmluYXJ5UHJvdG9jb2xGYWN0b3J5PigpKTsKIAotICBUU2ltcGxlU2VydmVyIHNlcnZlcihwcm9jZXNzb3IsCi0gICAgICAgICAgICAgICAgICAgICAgIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2xGYWN0b3J5KTsKLQorICAvKgorICAvLyBpZiB5b3UgZG9uJ3QgbmVlZCBwZXItY29ubmVjdGlvbiBzdGF0ZSwgZG8gdGhlIGZvbGxvd2luZyBpbnN0ZWFkCisgIFRUaHJlYWRlZFNlcnZlciBzZXJ2ZXIoCisgICAgc3RkOjptYWtlX3NoYXJlZDxDYWxjdWxhdG9yUHJvY2Vzc29yPihzdGQ6Om1ha2Vfc2hhcmVkPENhbGN1bGF0b3JIYW5kbGVyPigpKSwKKyAgICBzdGQ6Om1ha2Vfc2hhcmVkPFRTZXJ2ZXJTb2NrZXQ+KDkwOTApLCAvL3BvcnQKKyAgICBzdGQ6Om1ha2Vfc2hhcmVkPFRCdWZmZXJlZFRyYW5zcG9ydEZhY3Rvcnk+KCksCisgICAgc3RkOjptYWtlX3NoYXJlZDxUQmluYXJ5UHJvdG9jb2xGYWN0b3J5PigpKTsKKyAgKi8KIAogICAvKioKLSAgICogT3IgeW91IGNvdWxkIGRvIG9uZSBvZiB0aGVzZQorICAgKiBIZXJlIGFyZSBzb21lIGFsdGVybmF0ZSBzZXJ2ZXIgdHlwZXMuLi4KKworICAvLyBUaGlzIHNlcnZlciBvbmx5IGFsbG93cyBvbmUgY29ubmVjdGlvbiBhdCBhIHRpbWUsIGJ1dCBzcGF3bnMgbm8gdGhyZWFkcworICBUU2ltcGxlU2VydmVyIHNlcnZlcigKKyAgICBzdGQ6Om1ha2Vfc2hhcmVkPENhbGN1bGF0b3JQcm9jZXNzb3I+KHN0ZDo6bWFrZV9zaGFyZWQ8Q2FsY3VsYXRvckhhbmRsZXI+KCkpLAorICAgIHN0ZDo6bWFrZV9zaGFyZWQ8VFNlcnZlclNvY2tldD4oOTA5MCksCisgICAgc3RkOjptYWtlX3NoYXJlZDxUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5PigpLAorICAgIHN0ZDo6bWFrZV9zaGFyZWQ8VEJpbmFyeVByb3RvY29sRmFjdG9yeT4oKSk7CiAKICAgY29uc3QgaW50IHdvcmtlckNvdW50ID0gNDsKIAotICBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyID0KKyAgc3RkOjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IHRocmVhZE1hbmFnZXIgPQogICAgIFRocmVhZE1hbmFnZXI6Om5ld1NpbXBsZVRocmVhZE1hbmFnZXIod29ya2VyQ291bnQpOwotICBib29zdDo6c2hhcmVkX3B0cjxQb3NpeFRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnkgPQotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFBvc2l4VGhyZWFkRmFjdG9yeT4obmV3IFBvc2l4VGhyZWFkRmFjdG9yeSgpKTsKLSAgdGhyZWFkTWFuYWdlci0+dGhyZWFkRmFjdG9yeSh0aHJlYWRGYWN0b3J5KTsKKyAgdGhyZWFkTWFuYWdlci0+dGhyZWFkRmFjdG9yeSgKKyAgICBzdGQ6Om1ha2Vfc2hhcmVkPFBsYXRmb3JtVGhyZWFkRmFjdG9yeT4oKSk7CiAgIHRocmVhZE1hbmFnZXItPnN0YXJ0KCk7Ci0gIFRUaHJlYWRQb29sU2VydmVyIHNlcnZlcihwcm9jZXNzb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkTWFuYWdlcik7CiAKLSAgVFRocmVhZGVkU2VydmVyIHNlcnZlcihwcm9jZXNzb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2xGYWN0b3J5KTsKLQorICAvLyBUaGlzIHNlcnZlciBhbGxvd3MgIndvcmtlckNvdW50IiBjb25uZWN0aW9uIGF0IGEgdGltZSwgYW5kIHJldXNlcyB0aHJlYWRzCisgIFRUaHJlYWRQb29sU2VydmVyIHNlcnZlcigKKyAgICBzdGQ6Om1ha2Vfc2hhcmVkPENhbGN1bGF0b3JQcm9jZXNzb3JGYWN0b3J5PihzdGQ6Om1ha2Vfc2hhcmVkPENhbGN1bGF0b3JDbG9uZUZhY3Rvcnk+KCkpLAorICAgIHN0ZDo6bWFrZV9zaGFyZWQ8VFNlcnZlclNvY2tldD4oOTA5MCksCisgICAgc3RkOjptYWtlX3NoYXJlZDxUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5PigpLAorICAgIHN0ZDo6bWFrZV9zaGFyZWQ8VEJpbmFyeVByb3RvY29sRmFjdG9yeT4oKSwKKyAgICB0aHJlYWRNYW5hZ2VyKTsKICAgKi8KIAogICBjb3V0IDw8ICJTdGFydGluZyB0aGUgc2VydmVyLi4uIiA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvY3BwL01ha2VmaWxlLmFtIGIvdHV0b3JpYWwvY3BwL01ha2VmaWxlLmFtCmluZGV4IDk3NjhjNTEuLjQ5Y2YzYmUgMTAwNzU1Ci0tLSBhL3R1dG9yaWFsL2NwcC9NYWtlZmlsZS5hbQorKysgYi90dXRvcmlhbC9jcHAvTWFrZWZpbGUuYW0KQEAgLTE4LDYgKzE4LDkgQEAKICMKIEFVVE9NQUtFX09QVElPTlMgPSBzdWJkaXItb2JqZWN0cyBzZXJpYWwtdGVzdHMKIAorQlVJTFRfU09VUkNFUyA9IGdlbi1jcHAvc2hhcmVkX3R5cGVzLmNwcCBcCisgICAgICAgICAgICAgICAgZ2VuLWNwcC90dXRvcmlhbF90eXBlcy5jcHAKKwogbm9pbnN0X0xUTElCUkFSSUVTID0gbGlidHV0b3JpYWxnZW5jcHAubGEKIG5vZGlzdF9saWJ0dXRvcmlhbGdlbmNwcF9sYV9TT1VSQ0VTID0gXAogCWdlbi1jcHAvQ2FsY3VsYXRvci5jcHAgXApAQCAtNTgsOCArNjEsNiBAQAogIwogIyBDb21tb24gdGhyaWZ0IGNvZGUgZ2VuZXJhdGlvbiBydWxlcwogIwotVEhSSUZUID0gJCh0b3BfYnVpbGRkaXIpL2NvbXBpbGVyL2NwcC90aHJpZnQKLQogZ2VuLWNwcC9DYWxjdWxhdG9yLmNwcCBnZW4tY3BwL1NoYXJlZFNlcnZpY2UuY3BwIGdlbi1jcHAvc2hhcmVkX2NvbnN0YW50cy5jcHAgZ2VuLWNwcC9zaGFyZWRfdHlwZXMuY3BwIGdlbi1jcHAvdHV0b3JpYWxfY29uc3RhbnRzLmNwcCBnZW4tY3BwL3R1dG9yaWFsX3R5cGVzLmNwcDogJCh0b3Bfc3JjZGlyKS90dXRvcmlhbC90dXRvcmlhbC50aHJpZnQKIAkkKFRIUklGVCkgLS1nZW4gY3BwIC1yICQ8CiAKQEAgLTY4LDcgKzY5LDcgQEAKIEFNX0xERkxBR1MgPSAkKEJPT1NUX0xERkxBR1MpICQoTElCRVZFTlRfTERGTEFHUykKIAogY2xlYW4tbG9jYWw6Ci0JJChSTSkgLXIgZ2VuLWNwcAorCSQoUk0pIGdlbi1jcHAvKgogCiB0dXRvcmlhbHNlcnZlcjogYWxsCiAJLi9UdXRvcmlhbFNlcnZlcgpAQCAtNzYsNiArNzcsMTAgQEAKIHR1dG9yaWFsY2xpZW50OiBhbGwKIAkuL1R1dG9yaWFsQ2xpZW50CiAKK3N0eWxlLWxvY2FsOgorCSQoQ1BQU1RZTEVfQ01EKQorCiBFWFRSQV9ESVNUID0gXAorCUNNYWtlTGlzdHMudHh0IFwKIAlDcHBDbGllbnQuY3BwIFwKIAlDcHBTZXJ2ZXIuY3BwCmRpZmYgLS1naXQgYS90dXRvcmlhbC9jc2hhcnAvQ3NoYXJwQ2xpZW50L0NzaGFycENsaWVudC5jc3Byb2ogYi90dXRvcmlhbC9jc2hhcnAvQ3NoYXJwQ2xpZW50L0NzaGFycENsaWVudC5jc3Byb2oKaW5kZXggYWZjZTcwZC4uMWVhN2ZmNiAxMDA2NDQKLS0tIGEvdHV0b3JpYWwvY3NoYXJwL0NzaGFycENsaWVudC9Dc2hhcnBDbGllbnQuY3Nwcm9qCisrKyBiL3R1dG9yaWFsL2NzaGFycC9Dc2hhcnBDbGllbnQvQ3NoYXJwQ2xpZW50LmNzcHJvagpAQCAtNjEsMjMgKzYxLDQ1IEBACiAgICAgPC9SZWZlcmVuY2U+CiAgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uRGF0YSIgLz4KICAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5YbWwiIC8+Ci0gICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJUaHJpZnQsIFZlcnNpb249MC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBwcm9jZXNzb3JBcmNoaXRlY3R1cmU9TVNJTCI+Ci0gICAgICA8U3BlY2lmaWNWZXJzaW9uPkZhbHNlPC9TcGVjaWZpY1ZlcnNpb24+Ci0gICAgICA8SGludFBhdGg+Li5cLi5cLi5cbGliXGNzaGFycFxzcmNcYmluXFJlbGVhc2VcVGhyaWZ0LmRsbDwvSGludFBhdGg+Ci0gICAgPC9SZWZlcmVuY2U+CiAgIDwvSXRlbUdyb3VwPgogICA8SXRlbUdyb3VwPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXGdlbi1jc2hhcnBcQ2FsY3VsYXRvci5jcyI+CisgICAgICA8TGluaz5DYWxjdWxhdG9yLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlxnZW4tY3NoYXJwXEludmFsaWRPcGVyYXRpb24uY3MiPgorICAgICAgPExpbms+SW52YWxpZE9wZXJhdGlvbi5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cZ2VuLWNzaGFycFxPcGVyYXRpb24uY3MiPgorICAgICAgPExpbms+T3BlcmF0aW9uLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlxnZW4tY3NoYXJwXFNoYXJlZFNlcnZpY2UuY3MiPgorICAgICAgPExpbms+U2hhcmVkU2VydmljZS5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cZ2VuLWNzaGFycFxTaGFyZWRTdHJ1Y3QuY3MiPgorICAgICAgPExpbms+U2hhcmVkU3RydWN0LmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlxnZW4tY3NoYXJwXHR1dG9yaWFsLkNvbnN0YW50cy5jcyI+CisgICAgICA8TGluaz50dXRvcmlhbC5Db25zdGFudHMuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXGdlbi1jc2hhcnBcV29yay5jcyI+CisgICAgICA8TGluaz5Xb3JrLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJDc2hhcnBDbGllbnQuY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvcGVydGllc1xBc3NlbWJseUluZm8uY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cZ2VuLWNzaGFycFxDYWxjdWxhdG9yLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGdlbi1jc2hhcnBcQ29uc3RhbnRzLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGdlbi1jc2hhcnBcSW52YWxpZE9wZXJhdGlvbi5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlxnZW4tY3NoYXJwXE9wZXJhdGlvbi5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlxnZW4tY3NoYXJwXFNoYXJlZFNlcnZpY2UuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cZ2VuLWNzaGFycFxTaGFyZWRTdHJ1Y3QuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cZ2VuLWNzaGFycFxXb3JrLmNzIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlwuLlxsaWJcY3NoYXJwXHNyY1xUaHJpZnQuY3Nwcm9qIj4KKyAgICAgIDxQcm9qZWN0Pns0OTllYjYzYy1kNzRjLTQ3ZTgtYWU0OC1hMmZjOTQ1MzhlOWR9PC9Qcm9qZWN0PgorICAgICAgPE5hbWU+VGhyaWZ0PC9OYW1lPgorICAgIDwvUHJvamVjdFJlZmVyZW5jZT4KICAgPC9JdGVtR3JvdXA+CiAgIDxJbXBvcnQgUHJvamVjdD0iJChNU0J1aWxkVG9vbHNQYXRoKVxNaWNyb3NvZnQuQ1NoYXJwLnRhcmdldHMiIC8+CisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxQcmVCdWlsZEV2ZW50PnB1c2hkICIkKFNvbHV0aW9uRGlyKSIKK3RocmlmdCAgLWdlbiBjc2hhcnAgICAtciAgLi4vdHV0b3JpYWwudGhyaWZ0Citwb3BkCis8L1ByZUJ1aWxkRXZlbnQ+CisgIDwvUHJvcGVydHlHcm91cD4KICAgPCEtLSBUbyBtb2RpZnkgeW91ciBidWlsZCBwcm9jZXNzLCBhZGQgeW91ciB0YXNrIGluc2lkZSBvbmUgb2YgdGhlIHRhcmdldHMgYmVsb3cgYW5kIHVuY29tbWVudCBpdC4KICAgICAgICBPdGhlciBzaW1pbGFyIGV4dGVuc2lvbiBwb2ludHMgZXhpc3QsIHNlZSBNaWNyb3NvZnQuQ29tbW9uLnRhcmdldHMuCiAgIDxUYXJnZXQgTmFtZT0iQmVmb3JlQnVpbGQiPgpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvY3NoYXJwL0NzaGFycENsaWVudC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcyBiL3R1dG9yaWFsL2NzaGFycC9Dc2hhcnBDbGllbnQvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKaW5kZXggNzJhZTYxNi4uMWZmNjU4YyAxMDA2NDQKLS0tIGEvdHV0b3JpYWwvY3NoYXJwL0NzaGFycENsaWVudC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcworKysgYi90dXRvcmlhbC9jc2hhcnAvQ3NoYXJwQ2xpZW50L1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCkBAIC0yNyw5ICsyNyw5IEBACiBbYXNzZW1ibHk6IEFzc2VtYmx5VGl0bGUoIkNzaGFycENsaWVudCIpXQogW2Fzc2VtYmx5OiBBc3NlbWJseURlc2NyaXB0aW9uKCIiKV0KIFthc3NlbWJseTogQXNzZW1ibHlDb25maWd1cmF0aW9uKCIiKV0KLVthc3NlbWJseTogQXNzZW1ibHlDb21wYW55KCIiKV0KLVthc3NlbWJseTogQXNzZW1ibHlQcm9kdWN0KCJDc2hhcnBDbGllbnQiKV0KLVthc3NlbWJseTogQXNzZW1ibHlDb3B5cmlnaHQoIkNvcHlyaWdodCDCqSAyMDEwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVByb2R1Y3QoIlRocmlmdCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvcHlyaWdodCgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCiBbYXNzZW1ibHk6IEFzc2VtYmx5VHJhZGVtYXJrKCIiKV0KIFthc3NlbWJseTogQXNzZW1ibHlDdWx0dXJlKCIiKV0KIApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvY3NoYXJwL0NzaGFycFNlcnZlci9Dc2hhcnBTZXJ2ZXIuY3MgYi90dXRvcmlhbC9jc2hhcnAvQ3NoYXJwU2VydmVyL0NzaGFycFNlcnZlci5jcwppbmRleCBkMzIwMTZmLi40Mzk3OTBhIDEwMDY0NAotLS0gYS90dXRvcmlhbC9jc2hhcnAvQ3NoYXJwU2VydmVyL0NzaGFycFNlcnZlci5jcworKysgYi90dXRvcmlhbC9jc2hhcnAvQ3NoYXJwU2VydmVyL0NzaGFycFNlcnZlci5jcwpAQCAtNjYsNyArNjYsNyBAQAogICAgICAgICAgICAgICAgICAgICBpZiAod29yay5OdW0yID09IDApCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgIEludmFsaWRPcGVyYXRpb24gaW8gPSBuZXcgSW52YWxpZE9wZXJhdGlvbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgaW8uV2hhdCA9IChpbnQpd29yay5PcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlvLldoYXRPcCA9IChpbnQpd29yay5PcDsKICAgICAgICAgICAgICAgICAgICAgICAgIGlvLldoeSA9ICJDYW5ub3QgZGl2aWRlIGJ5IDAiOwogICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgaW87CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTc2LDcgKzc2LDcgQEAKICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICBJbnZhbGlkT3BlcmF0aW9uIGlvID0gbmV3IEludmFsaWRPcGVyYXRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlvLldoYXQgPSAoaW50KXdvcmsuT3A7CisgICAgICAgICAgICAgICAgICAgICAgICBpby5XaGF0T3AgPSAoaW50KXdvcmsuT3A7CiAgICAgICAgICAgICAgICAgICAgICAgICBpby5XaHkgPSAiVW5rbm93biBvcGVyYXRpb24iOwogICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgaW87CiAgICAgICAgICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2NzaGFycC9Dc2hhcnBTZXJ2ZXIvQ3NoYXJwU2VydmVyLmNzcHJvaiBiL3R1dG9yaWFsL2NzaGFycC9Dc2hhcnBTZXJ2ZXIvQ3NoYXJwU2VydmVyLmNzcHJvagppbmRleCAwNTUwMjYxLi4wNzQ4MTgwIDEwMDY0NAotLS0gYS90dXRvcmlhbC9jc2hhcnAvQ3NoYXJwU2VydmVyL0NzaGFycFNlcnZlci5jc3Byb2oKKysrIGIvdHV0b3JpYWwvY3NoYXJwL0NzaGFycFNlcnZlci9Dc2hhcnBTZXJ2ZXIuY3Nwcm9qCkBAIC02MSwyMyArNjEsNDYgQEAKICAgICA8L1JlZmVyZW5jZT4KICAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5EYXRhIiAvPgogICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlhtbCIgLz4KLSAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlRocmlmdCwgVmVyc2lvbj0wLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIHByb2Nlc3NvckFyY2hpdGVjdHVyZT1NU0lMIj4KLSAgICAgIDxTcGVjaWZpY1ZlcnNpb24+RmFsc2U8L1NwZWNpZmljVmVyc2lvbj4KLSAgICAgIDxIaW50UGF0aD4uLlwuLlwuLlxsaWJcY3NoYXJwXHNyY1xiaW5cUmVsZWFzZVxUaHJpZnQuZGxsPC9IaW50UGF0aD4KLSAgICA8L1JlZmVyZW5jZT4KICAgPC9JdGVtR3JvdXA+CiAgIDxJdGVtR3JvdXA+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cZ2VuLWNzaGFycFxDYWxjdWxhdG9yLmNzIj4KKyAgICAgIDxMaW5rPkNhbGN1bGF0b3IuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXGdlbi1jc2hhcnBcSW52YWxpZE9wZXJhdGlvbi5jcyI+CisgICAgICA8TGluaz5JbnZhbGlkT3BlcmF0aW9uLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlxnZW4tY3NoYXJwXE9wZXJhdGlvbi5jcyI+CisgICAgICA8TGluaz5PcGVyYXRpb24uY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXGdlbi1jc2hhcnBcU2hhcmVkU2VydmljZS5jcyI+CisgICAgICA8TGluaz5TaGFyZWRTZXJ2aWNlLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlxnZW4tY3NoYXJwXFNoYXJlZFN0cnVjdC5jcyI+CisgICAgICA8TGluaz5TaGFyZWRTdHJ1Y3QuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXGdlbi1jc2hhcnBcdHV0b3JpYWwuQ29uc3RhbnRzLmNzIj4KKyAgICAgIDxMaW5rPnR1dG9yaWFsLkNvbnN0YW50cy5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cZ2VuLWNzaGFycFxXb3JrLmNzIj4KKyAgICAgIDxMaW5rPldvcmsuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgogICAgIDxDb21waWxlIEluY2x1ZGU9IkNzaGFycFNlcnZlci5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm9wZXJ0aWVzXEFzc2VtYmx5SW5mby5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlxnZW4tY3NoYXJwXENhbGN1bGF0b3IuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cZ2VuLWNzaGFycFxDb25zdGFudHMuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cZ2VuLWNzaGFycFxJbnZhbGlkT3BlcmF0aW9uLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGdlbi1jc2hhcnBcT3BlcmF0aW9uLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGdlbi1jc2hhcnBcU2hhcmVkU2VydmljZS5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlxnZW4tY3NoYXJwXFNoYXJlZFN0cnVjdC5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlxnZW4tY3NoYXJwXFdvcmsuY3MiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXC4uXGxpYlxjc2hhcnBcc3JjXFRocmlmdC5jc3Byb2oiPgorICAgICAgPFByb2plY3Q+ezQ5OWViNjNjLWQ3NGMtNDdlOC1hZTQ4LWEyZmM5NDUzOGU5ZH08L1Byb2plY3Q+CisgICAgICA8TmFtZT5UaHJpZnQ8L05hbWU+CisgICAgPC9Qcm9qZWN0UmVmZXJlbmNlPgogICA8L0l0ZW1Hcm91cD4KICAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRUb29sc1BhdGgpXE1pY3Jvc29mdC5DU2hhcnAudGFyZ2V0cyIgLz4KKyAgPFByb3BlcnR5R3JvdXA+CisgICAgPFByZUJ1aWxkRXZlbnQ+cHVzaGQgIiQoU29sdXRpb25EaXIpIgordGhyaWZ0ICAtZ2VuIGNzaGFycCAgIC1yICAuLi90dXRvcmlhbC50aHJpZnQKK3BvcGQKKworPC9QcmVCdWlsZEV2ZW50PgorICA8L1Byb3BlcnR5R3JvdXA+CiAgIDwhLS0gVG8gbW9kaWZ5IHlvdXIgYnVpbGQgcHJvY2VzcywgYWRkIHlvdXIgdGFzayBpbnNpZGUgb25lIG9mIHRoZSB0YXJnZXRzIGJlbG93IGFuZCB1bmNvbW1lbnQgaXQuCiAgICAgICAgT3RoZXIgc2ltaWxhciBleHRlbnNpb24gcG9pbnRzIGV4aXN0LCBzZWUgTWljcm9zb2Z0LkNvbW1vbi50YXJnZXRzLgogICA8VGFyZ2V0IE5hbWU9IkJlZm9yZUJ1aWxkIj4KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2NzaGFycC9Dc2hhcnBTZXJ2ZXIvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MgYi90dXRvcmlhbC9jc2hhcnAvQ3NoYXJwU2VydmVyL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCmluZGV4IDI4YTY5ZDIuLjc0ZmE0NzYgMTAwNjQ0Ci0tLSBhL3R1dG9yaWFsL2NzaGFycC9Dc2hhcnBTZXJ2ZXIvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKKysrIGIvdHV0b3JpYWwvY3NoYXJwL0NzaGFycFNlcnZlci9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpAQCAtMjcsOSArMjcsOSBAQAogW2Fzc2VtYmx5OiBBc3NlbWJseVRpdGxlKCJDc2hhcnBTZXJ2ZXIiKV0KIFthc3NlbWJseTogQXNzZW1ibHlEZXNjcmlwdGlvbigiIildCiBbYXNzZW1ibHk6IEFzc2VtYmx5Q29uZmlndXJhdGlvbigiIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5Q29tcGFueSgiIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5UHJvZHVjdCgiQ3NoYXJwU2VydmVyIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5Q29weXJpZ2h0KCJDb3B5cmlnaHQgwqkgMjAxMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb21wYW55KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlQcm9kdWN0KCJUaHJpZnQiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb3B5cmlnaHQoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQogW2Fzc2VtYmx5OiBBc3NlbWJseVRyYWRlbWFyaygiIildCiBbYXNzZW1ibHk6IEFzc2VtYmx5Q3VsdHVyZSgiIildCiAKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2QvTWFrZWZpbGUgYi90dXRvcmlhbC9kL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2VlOWFmLi4wMDAwMDAwCi0tLSBhL3R1dG9yaWFsL2QvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0jCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotTElCX0RfRElSID0gLi4vLi4vbGliL2QKLQotR0VOX1NSQyA9IC4uL2dlbi1kL3NoYXJlL1NoYXJlZFNlcnZpY2UuZCAuLi9nZW4tZC9zaGFyZS9zaGFyZWRfdHlwZXMuZCBcCi0JLi4vZ2VuLWQvdHV0b3JpYWwvdHV0b3JpYWxfdHlwZXMuZCAuLi9nZW4tZC90dXRvcmlhbC9DYWxjdWxhdG9yLmQKLQotZGVmYXVsdDogc2VydmVyIGNsaWVudCBhc3luY19jbGllbnQKLQotc2VydmVyOiBzZXJ2ZXIuZAotCWRtZCAtSSR7TElCX0RfRElSfS9zcmMgLUwtTCR7TElCX0RfRElSfSAtTC1sdGhyaWZ0ZCBzZXJ2ZXIuZCAke0dFTl9TUkN9Ci0KLWNsaWVudDogY2xpZW50LmQKLQlkbWQgLUkke0xJQl9EX0RJUn0vc3JjIC1MLUwke0xJQl9EX0RJUn0gLUwtbHRocmlmdGQgY2xpZW50LmQgJHtHRU5fU1JDfQotCi1hc3luY19jbGllbnQ6IGFzeW5jX2NsaWVudC5kCi0JZG1kIC1JJHtMSUJfRF9ESVJ9L3NyYyAtTC1MJHtMSUJfRF9ESVJ9IC1MLWx0aHJpZnRkLWV2ZW50IC1MLWx0aHJpZnRkIC1MLWxldmVudCBhc3luY19jbGllbnQuZCAke0dFTl9TUkN9Ci0KLWNsZWFuOgotCSQoUk0pIC1mIHNlcnZlciBjbGllbnQgYXN5bmNfY2xpZW50CmRpZmYgLS1naXQgYS90dXRvcmlhbC9kL01ha2VmaWxlLmFtIGIvdHV0b3JpYWwvZC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGM4YjI5Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvZC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDQ2IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworTElCX0RfRElSID0gJCh0b3Bfc3JjZGlyKS9saWIvZAorCitHRU5fU1JDID0gZ2VuLWQvc2hhcmUvU2hhcmVkU2VydmljZS5kIGdlbi1kL3NoYXJlL3NoYXJlZF90eXBlcy5kIFwKKwlnZW4tZC90dXRvcmlhbC90dXRvcmlhbF90eXBlcy5kIGdlbi1kL3R1dG9yaWFsL0NhbGN1bGF0b3IuZAorCiskKEdFTl9TUkMpOiAkKHRvcF9zcmNkaXIpL3R1dG9yaWFsL3R1dG9yaWFsLnRocmlmdAorCSQodG9wX2J1aWxkZGlyKS9jb21waWxlci9jcHAvdGhyaWZ0IC0tZ2VuIGQgLXIgJDwKKworc2VydmVyOiBzZXJ2ZXIuZCAkKEdFTl9TUkMpCisJJChETUQpIC1JJHtMSUJfRF9ESVJ9L3NyYyAtTC1MJHtMSUJfRF9ESVJ9IC1MLWx0aHJpZnRkIHNlcnZlci5kICR7R0VOX1NSQ30KKworY2xpZW50OiBjbGllbnQuZCAkKEdFTl9TUkMpCisJJChETUQpIC1JJHtMSUJfRF9ESVJ9L3NyYyAtTC1MJHtMSUJfRF9ESVJ9IC1MLWx0aHJpZnRkIGNsaWVudC5kICR7R0VOX1NSQ30KKworUFJPR1MgPSBzZXJ2ZXIgY2xpZW50CisKK2lmIFdJVEhfRF9FVkVOVF9URVNUUworYXN5bmNfY2xpZW50OiBhc3luY19jbGllbnQuZCAkKEdFTl9TUkMpCisJJChETUQpIC1JJHtMSUJfRF9ESVJ9L3NyYyAtTC1MJHtMSUJfRF9ESVJ9IC1MLWx0aHJpZnRkLWV2ZW50IC1MLWx0aHJpZnRkIC1MLWxldmVudCBhc3luY19jbGllbnQuZCAke0dFTl9TUkN9CisKK1BST0dTICs9IGFzeW5jX2NsaWVudAorZW5kaWYKKworYWxsLWxvY2FsOiAkKFBST0dTKQorCitjbGVhbjoKKwkkKFJNKSAtZiAkKFBST0dTKQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZC9zZXJ2ZXIuZCBiL3R1dG9yaWFsL2Qvc2VydmVyLmQKaW5kZXggZDMyYjkzNy4uY2JjZWRjYyAxMDA2NDQKLS0tIGEvdHV0b3JpYWwvZC9zZXJ2ZXIuZAorKysgYi90dXRvcmlhbC9kL3NlcnZlci5kCkBAIC02Miw3ICs2Miw3IEBACiAgICAgY2FzZSBPcGVyYXRpb24uRElWSURFOgogICAgICAgaWYgKHdvcmsubnVtMiA9PSAwKSB7CiAgICAgICAgIGF1dG8gaW8gPSBuZXcgSW52YWxpZE9wZXJhdGlvbigpOwotICAgICAgICBpby53aGF0ID0gd29yay5vcDsKKyAgICAgICAgaW8ud2hhdE9wID0gd29yay5vcDsKICAgICAgICAgaW8ud2h5ID0gIkNhbm5vdCBkaXZpZGUgYnkgMCI7CiAgICAgICAgIHRocm93IGlvOwogICAgICAgfQpAQCAtNzAsNyArNzAsNyBAQAogICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKICAgICAgIGF1dG8gaW8gPSBuZXcgSW52YWxpZE9wZXJhdGlvbigpOwotICAgICAgaW8ud2hhdCA9IHdvcmsub3A7CisgICAgICBpby53aGF0T3AgPSB3b3JrLm9wOwogICAgICAgaW8ud2h5ID0gIkludmFsaWQgT3BlcmF0aW9uIjsKICAgICAgIHRocm93IGlvOwogICAgIH0KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2RhcnQvTWFrZWZpbGUuYW0gYi90dXRvcmlhbC9kYXJ0L01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0OTVhY2EKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9kYXJ0L01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNzMgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitCVUlMVF9TT1VSQ0VTID0gZ2VuLWRhcnQvdHV0b3JpYWwvbGliL3R1dG9yaWFsLmRhcnQgZ2VuLWRhcnQvc2hhcmVkL2xpYi9zaGFyZWQuZGFydAorCitnZW4tZGFydC90dXRvcmlhbC9saWIvdHV0b3JpYWwuZGFydCBnZW4tZGFydC9zaGFyZWQvbGliL3NoYXJlZC5kYXJ0OiAkKHRvcF9zcmNkaXIpL3R1dG9yaWFsL3R1dG9yaWFsLnRocmlmdAorCSQoVEhSSUZUKSAtLWdlbiBkYXJ0IC1yICQ8CisKK2FsbC1sb2NhbDogZ2VuLWRhcnQvdHV0b3JpYWwvbGliL3R1dG9yaWFsLmRhcnQgcHViLWdldAorCitjbGVhbi1sb2NhbDoKKwkkKFJNKSAtciBnZW4tKgorCWZpbmQgLiAtdHlwZSBkIC1uYW1lICJwYWNrYWdlcyIgfCB4YXJncyAkKFJNKSAtcgorCWZpbmQgLiAtdHlwZSBmIC1uYW1lICIucGFja2FnZXMiIHwgeGFyZ3MgJChSTSkKKwlmaW5kIC4gLXR5cGUgZiAtbmFtZSAicHVic3BlYy5sb2NrIiB8IHhhcmdzICQoUk0pCisKK3B1Yi1nZXQ6IHB1Yi1nZXQtZ2VuIHB1Yi1nZXQtY2xpZW50IHB1Yi1nZXQtY29uc29sZS1jbGllbnQgcHViLWdldC1zZXJ2ZXIKKworcHViLWdldC1nZW46IHB1Yi1nZXQtdHV0b3JpYWwgcHViLWdldC1zaGFyZWQKKworcHViLWdldC10dXRvcmlhbDogZ2VuLWRhcnQvdHV0b3JpYWwvbGliL3R1dG9yaWFsLmRhcnQKKwljZCBnZW4tZGFydC90dXRvcmlhbDsgJHtEQVJUUFVCfSBnZXQKKworcHViLWdldC1zaGFyZWQ6IGdlbi1kYXJ0L3NoYXJlZC9saWIvc2hhcmVkLmRhcnQKKwljZCBnZW4tZGFydC9zaGFyZWQ7ICR7REFSVFBVQn0gZ2V0CisKK3B1Yi1nZXQtY2xpZW50OgorCWNkIGNsaWVudDsgJHtEQVJUUFVCfSBnZXQKKworcHViLWdldC1jb25zb2xlLWNsaWVudDoKKwljZCBjb25zb2xlX2NsaWVudDsgJHtEQVJUUFVCfSBnZXQKKworcHViLWdldC1zZXJ2ZXI6CisJY2Qgc2VydmVyOyAke0RBUlRQVUJ9IGdldAorCit0dXRvcmlhbHNlcnZlcjogcHViLWdldC1nZW4gcHViLWdldC1zZXJ2ZXIKKwkke0RBUlR9IHNlcnZlci9iaW4vbWFpbi5kYXJ0CisKK3R1dG9yaWFsY2xpZW50OiBwdWItZ2V0LWdlbiBwdWItZ2V0LWNsaWVudAorCWNkIGNsaWVudDsgJHtEQVJUUFVCfSBzZXJ2ZQorCit0dXRvcmlhbGNvbnNvbGVjbGllbnQ6IHB1Yi1nZXQtY29uc29sZS1jbGllbnQKKwkke0RBUlR9IGNvbnNvbGVfY2xpZW50L2Jpbi9tYWluLmRhcnQKKworRVhUUkFfRElTVCA9IFwKKwljbGllbnQvd2ViL2NsaWVudC5kYXJ0IFwKKwljbGllbnQvd2ViL2luZGV4Lmh0bWwgXAorCWNsaWVudC93ZWIvc3R5bGVzLmNzcyBcCisJY2xpZW50L3B1YnNwZWMueWFtbCBcCisJY29uc29sZV9jbGllbnQvYmluL21haW4uZGFydCBcCisJY29uc29sZV9jbGllbnQvcHVic3BlYy55YW1sIFwKKwlzZXJ2ZXIvYmluL21haW4uZGFydCBcCisJc2VydmVyL3B1YnNwZWMueWFtbCBcCisJY29uc29sZV9jbGllbnQvLmFuYWx5c2lzX29wdGlvbnMgXAorCWNsaWVudC8uYW5hbHlzaXNfb3B0aW9ucyBcCisJc2VydmVyLy5hbmFseXNpc19vcHRpb25zIFwKKwlidWlsZC5zaApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZGFydC9idWlsZC5zaCBiL3R1dG9yaWFsL2RhcnQvYnVpbGQuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFiZTA0YQotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2RhcnQvYnVpbGQuc2gKQEAgLTAsMCArMSw1NiBAQAorIyEvYmluL3NoCisKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAnTGljZW5zZScpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAnQVMgSVMnIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKworc2V0IC1lOworcm0gLXIgZ2VuLWRhcnQgfHwgdHJ1ZTsKKwordGhyaWZ0IC0tZ2VuIGRhcnQgLi4vc2hhcmVkLnRocmlmdDsKK2NkIGdlbi1kYXJ0L3NoYXJlZDsKK3B1YiBnZXQ7CitjZCAuLi8uLjsKKwordGhyaWZ0IC0tZ2VuIGRhcnQgLi4vdHV0b3JpYWwudGhyaWZ0OworY2QgZ2VuLWRhcnQvdHV0b3JpYWw7CitwdWIgZ2V0OworY2QgLi4vLi47CisKK2NkIGNsaWVudDsKK3B1YiBnZXQ7CitjZCAuLjsKKworY2QgY29uc29sZV9jbGllbnQ7CitwdWIgZ2V0OworY2QgLi47CisKK2NkIHNlcnZlcjsKK3B1YiBnZXQ7CitjZCAuLjsKKworZGFydGZtdCAtdyBnZW4tZGFydDsKKworZWNobyAiXG5FbmpveSB0aGUgRGFydCB0dXRvcmlhbCEiOworZWNobyAiXG5UbyBydW4gdGhlIHNlcnZlcjoiOworZWNobyAiPiBkYXJ0IHNlcnZlci9iaW4vbWFpbi5kYXJ0IjsKK2VjaG8gIlxuVG8gcnVuIHRoZSBjbGllbnQ6IjsKK2VjaG8gIiMgU2VydmUgdGhlIGFwcCBmcm9tIHRoZSBjbGllbnQgZGlyZWN0b3J5IGFuZCB2aWV3IGluIGEgYnJvd3NlciI7CitlY2hvICI+IGNkIGNsaWVudDsiOworZWNobyAiPiBwdWIgc2VydmU7IjsKK2VjaG8gIlxuVG8gcnVuIHRoZSBjb25zb2xlIGNsaWVudDoiOworZWNobyAiPiBkYXJ0IGNvbnNvbGVfY2xpZW50L2Jpbi9tYWluLmRhcnQiOworZWNobyAiIjsKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2RhcnQvY2xpZW50Ly5hbmFseXNpc19vcHRpb25zIGIvdHV0b3JpYWwvZGFydC9jbGllbnQvLmFuYWx5c2lzX29wdGlvbnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTEwZDRjNQotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2RhcnQvY2xpZW50Ly5hbmFseXNpc19vcHRpb25zCkBAIC0wLDAgKzEsMiBAQAorYW5hbHl6ZXI6CisgIHN0cm9uZy1tb2RlOiB0cnVlCmRpZmYgLS1naXQgYS90dXRvcmlhbC9kYXJ0L2NsaWVudC9wdWJzcGVjLnlhbWwgYi90dXRvcmlhbC9kYXJ0L2NsaWVudC9wdWJzcGVjLnlhbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhlZGUxNAotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2RhcnQvY2xpZW50L3B1YnNwZWMueWFtbApAQCAtMCwwICsxLDM0IEBACisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgJ0xpY2Vuc2UnKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgJ0FTIElTJyBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK25hbWU6IHR1dG9yaWFsX2NsaWVudAordmVyc2lvbjogMS4wLjAKK2Rlc2NyaXB0aW9uOiBBIERhcnQgY2xpZW50IGltcGxlbWVudGF0aW9uIG9mIHRoZSBBcGFjaGUgVGhyaWZ0IHR1dG9yaWFsCithdXRob3I6IEFwYWNoZSBUaHJpZnQgRGV2ZWxvcGVycyA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPgoraG9tZXBhZ2U6IGh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZworCitlbnZpcm9ubWVudDoKKyAgc2RrOiAiPj0xLjEzLjAgPDIuMC4wIgorCitkZXBlbmRlbmNpZXM6CisgIGJyb3dzZXI6IF4wLjEwLjAKKyAgc2hhcmVkOgorICAgIHBhdGg6IC4uL2dlbi1kYXJ0L3NoYXJlZAorICB0aHJpZnQ6CisgICAgcGF0aDogLi4vLi4vLi4vbGliL2RhcnQKKyAgdHV0b3JpYWw6CisgICAgcGF0aDogLi4vZ2VuLWRhcnQvdHV0b3JpYWwKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2RhcnQvY2xpZW50L3dlYi9jbGllbnQuZGFydCBiL3R1dG9yaWFsL2RhcnQvY2xpZW50L3dlYi9jbGllbnQuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjAyZDBkCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvZGFydC9jbGllbnQvd2ViL2NsaWVudC5kYXJ0CkBAIC0wLDAgKzEsMjc4IEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworaW1wb3J0ICdkYXJ0Omh0bWwnOworCitpbXBvcnQgJ3BhY2thZ2U6dGhyaWZ0L3RocmlmdC5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTp0aHJpZnQvdGhyaWZ0X2Jyb3dzZXIuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6c2hhcmVkL3NoYXJlZC5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTp0dXRvcmlhbC90dXRvcmlhbC5kYXJ0JzsKKworLy8vIEFkYXB0ZWQgZnJvbSB0aGUgQVMzIHR1dG9yaWFsCit2b2lkIG1haW4oKSB7CisgIG5ldyBDYWxjdWxhdG9yVUkocXVlcnlTZWxlY3RvcignI291dHB1dCcpKS5zdGFydCgpOworfQorCitjbGFzcyBDYWxjdWxhdG9yVUkgeworICBmaW5hbCBEaXZFbGVtZW50IG91dHB1dDsKKworICBDYWxjdWxhdG9yVUkodGhpcy5vdXRwdXQpOworCisgIFRUcmFuc3BvcnQgX3RyYW5zcG9ydDsKKyAgQ2FsY3VsYXRvciBfY2FsY3VsYXRvckNsaWVudDsKKworICB2b2lkIHN0YXJ0KCkgeworICAgIF9idWlsZEludGVyZmFjZSgpOworICAgIF9pbml0Q29ubmVjdGlvbigpOworICB9CisKKyAgdm9pZCBfdmFsaWRhdGUoKSB7CisgICAgaWYgKCFfdHJhbnNwb3J0LmlzT3BlbikgeworICAgICAgd2luZG93LmFsZXJ0KCJUaGUgdHJhbnNwb3J0IGlzIG5vdCBvcGVuISIpOworICAgIH0KKyAgfQorCisgIHZvaWQgX2luaXRDb25uZWN0aW9uKCkgeworICAgIF90cmFuc3BvcnQgPSBuZXcgVEFzeW5jQ2xpZW50U29ja2V0VHJhbnNwb3J0KAorICAgICAgICBuZXcgVFdlYlNvY2tldChVcmkucGFyc2UoJ3dzOi8vMTI3LjAuMC4xOjkwOTAvd3MnKSksCisgICAgICAgIG5ldyBUTWVzc2FnZVJlYWRlcihuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKSk7CisgICAgVFByb3RvY29sIHByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbChfdHJhbnNwb3J0KTsKKyAgICBfdHJhbnNwb3J0Lm9wZW4oKTsKKworICAgIF9jYWxjdWxhdG9yQ2xpZW50ID0gbmV3IENhbGN1bGF0b3JDbGllbnQocHJvdG9jb2wpOworICB9CisKKyAgdm9pZCBfYnVpbGRJbnRlcmZhY2UoKSB7CisgICAgb3V0cHV0LmNoaWxkcmVuLmZvckVhY2goKGUpIHsKKyAgICAgIGUucmVtb3ZlKCk7CisgICAgfSk7CisKKyAgICBfYnVpbGRQaW5nQ29tcG9uZW50KCk7CisKKyAgICBfYnVpbGRBZGRDb21wb25lbnQoKTsKKworICAgIF9idWlsZENhbGN1bGF0b3JDb21wb25lbnQoKTsKKworICAgIF9idWlsZEdldFN0cnVjdENvbXBvbmVudCgpOworICB9CisKKyAgdm9pZCBfYnVpbGRQaW5nQ29tcG9uZW50KCkgeworICAgIG91dHB1dC5hcHBlbmQobmV3IEhlYWRpbmdFbGVtZW50LmgzKCkuLnRleHQgPSAiUGluZyIpOworICAgIEJ1dHRvbkVsZW1lbnQgcGluZ0J1dHRvbiA9IG5ldyBCdXR0b25FbGVtZW50KCkKKyAgICAgIC4udGV4dCA9ICJQSU5HIgorICAgICAgLi5vbkNsaWNrLmxpc3Rlbihfb25QaW5nQ2xpY2spOworICAgIG91dHB1dC5hcHBlbmQocGluZ0J1dHRvbik7CisgIH0KKworICB2b2lkIF9vblBpbmdDbGljayhNb3VzZUV2ZW50IGUpIHsKKyAgICBfdmFsaWRhdGUoKTsKKworICAgIF9jYWxjdWxhdG9yQ2xpZW50LnBpbmcoKTsKKyAgfQorCisgIHZvaWQgX2J1aWxkQWRkQ29tcG9uZW50KCkgeworICAgIG91dHB1dC5hcHBlbmQobmV3IEhlYWRpbmdFbGVtZW50LmgzKCkuLnRleHQgPSAiQWRkIik7CisgICAgSW5wdXRFbGVtZW50IG51bTEgPSBuZXcgSW5wdXRFbGVtZW50KCkKKyAgICAgIC4uaWQgPSAiYWRkMSIKKyAgICAgIC4udHlwZSA9ICJudW1iZXIiCisgICAgICAuLnN0eWxlLmZvbnRTaXplID0gIjE0cHgiCisgICAgICAuLnN0eWxlLndpZHRoID0gIjUwcHgiOworICAgIG91dHB1dC5hcHBlbmQobnVtMSk7CisgICAgU3BhbkVsZW1lbnQgb3AgPSBuZXcgU3BhbkVsZW1lbnQoKQorICAgICAgLi50ZXh0ID0gIisiCisgICAgICAuLnN0eWxlLmZvbnRTaXplID0gIjE0cHgiCisgICAgICAuLnN0eWxlLm1hcmdpbkxlZnQgPSAiMTBweCI7CisgICAgb3V0cHV0LmFwcGVuZChvcCk7CisgICAgSW5wdXRFbGVtZW50IG51bTIgPSBuZXcgSW5wdXRFbGVtZW50KCkKKyAgICAgIC4uaWQgPSAiYWRkMiIKKyAgICAgIC4udHlwZSA9ICJudW1iZXIiCisgICAgICAuLnN0eWxlLmZvbnRTaXplID0gIjE0cHgiCisgICAgICAuLnN0eWxlLndpZHRoID0gIjUwcHgiCisgICAgICAuLnN0eWxlLm1hcmdpbkxlZnQgPSAiMTBweCI7CisgICAgb3V0cHV0LmFwcGVuZChudW0yKTsKKyAgICBCdXR0b25FbGVtZW50IGFkZEJ1dHRvbiA9IG5ldyBCdXR0b25FbGVtZW50KCkKKyAgICAgIC4udGV4dCA9ICI9IgorICAgICAgLi5zdHlsZS5mb250U2l6ZSA9ICIxNHB4IgorICAgICAgLi5zdHlsZS5tYXJnaW5MZWZ0ID0gIjEwcHgiCisgICAgICAuLm9uQ2xpY2subGlzdGVuKF9vbkFkZENsaWNrKTsKKyAgICBvdXRwdXQuYXBwZW5kKGFkZEJ1dHRvbik7CisgICAgU3BhbkVsZW1lbnQgcmVzdWx0ID0gbmV3IFNwYW5FbGVtZW50KCkKKyAgICAgIC4uaWQgPSAiYWRkUmVzdWx0IgorICAgICAgLi5zdHlsZS5mb250U2l6ZSA9ICIxNHB4IgorICAgICAgLi5zdHlsZS5tYXJnaW5MZWZ0ID0gIjEwcHgiOworICAgIG91dHB1dC5hcHBlbmQocmVzdWx0KTsKKyAgfQorCisgIHZvaWQgX29uQWRkQ2xpY2soTW91c2VFdmVudCBlKSB7CisgICAgX3ZhbGlkYXRlKCk7CisKKyAgICBJbnB1dEVsZW1lbnQgbnVtMSA9IHF1ZXJ5U2VsZWN0b3IoIiNhZGQxIik7CisgICAgSW5wdXRFbGVtZW50IG51bTIgPSBxdWVyeVNlbGVjdG9yKCIjYWRkMiIpOworICAgIFNwYW5FbGVtZW50IHJlc3VsdCA9IHF1ZXJ5U2VsZWN0b3IoIiNhZGRSZXN1bHQiKTsKKworICAgIF9jYWxjdWxhdG9yQ2xpZW50CisgICAgICAgIC5hZGQoaW50LnBhcnNlKG51bTEudmFsdWUpLCBpbnQucGFyc2UobnVtMi52YWx1ZSkpCisgICAgICAgIC50aGVuKChpbnQgbikgeworICAgICAgcmVzdWx0LnRleHQgPSAiJG4iOworICAgIH0pOworICB9CisKKyAgdm9pZCBfYnVpbGRDYWxjdWxhdG9yQ29tcG9uZW50KCkgeworICAgIG91dHB1dC5hcHBlbmQobmV3IEhlYWRpbmdFbGVtZW50LmgzKCkuLnRleHQgPSAiQ2FsY3VsYXRvciIpOworICAgIElucHV0RWxlbWVudCBudW0xID0gbmV3IElucHV0RWxlbWVudCgpCisgICAgICAuLmlkID0gImNhbGMxIgorICAgICAgLi50eXBlID0gIm51bWJlciIKKyAgICAgIC4uc3R5bGUuZm9udFNpemUgPSAiMTRweCIKKyAgICAgIC4uc3R5bGUud2lkdGggPSAiNTBweCI7CisgICAgb3V0cHV0LmFwcGVuZChudW0xKTsKKyAgICBTZWxlY3RFbGVtZW50IG9wID0gbmV3IFNlbGVjdEVsZW1lbnQoKQorICAgICAgLi5pZCA9ICJjYWxjT3AiCisgICAgICAuLm11bHRpcGxlID0gZmFsc2UKKyAgICAgIC4uc2VsZWN0ZWRJbmRleCA9IDAKKyAgICAgIC4uc3R5bGUuZm9udFNpemUgPSAiMTZweCIKKyAgICAgIC4uc3R5bGUubWFyZ2luTGVmdCA9ICIxMHB4IgorICAgICAgLi5zdHlsZS53aWR0aCA9ICI1MHB4IjsKKyAgICBPcHRpb25FbGVtZW50IGFkZE9wID0gbmV3IE9wdGlvbkVsZW1lbnQoKQorICAgICAgLi50ZXh0ID0gIisiCisgICAgICAuLnZhbHVlID0gT3BlcmF0aW9uLkFERC50b1N0cmluZygpOworICAgIG9wLmFkZChhZGRPcCwgMCk7CisgICAgT3B0aW9uRWxlbWVudCBzdWJ0cmFjdE9wID0gbmV3IE9wdGlvbkVsZW1lbnQoKQorICAgICAgLi50ZXh0ID0gIi0iCisgICAgICAuLnZhbHVlID0gT3BlcmF0aW9uLlNVQlRSQUNULnRvU3RyaW5nKCk7CisgICAgb3AuYWRkKHN1YnRyYWN0T3AsIDEpOworICAgIE9wdGlvbkVsZW1lbnQgbXVsdGlwbHlPcCA9IG5ldyBPcHRpb25FbGVtZW50KCkKKyAgICAgIC4udGV4dCA9ICIqIgorICAgICAgLi52YWx1ZSA9IE9wZXJhdGlvbi5NVUxUSVBMWS50b1N0cmluZygpOworICAgIG9wLmFkZChtdWx0aXBseU9wLCAyKTsKKyAgICBPcHRpb25FbGVtZW50IGRpdmlkZU9wID0gbmV3IE9wdGlvbkVsZW1lbnQoKQorICAgICAgLi50ZXh0ID0gIi8iCisgICAgICAuLnZhbHVlID0gT3BlcmF0aW9uLkRJVklERS50b1N0cmluZygpOworICAgIG9wLmFkZChkaXZpZGVPcCwgMyk7CisgICAgb3V0cHV0LmFwcGVuZChvcCk7CisgICAgSW5wdXRFbGVtZW50IG51bTIgPSBuZXcgSW5wdXRFbGVtZW50KCkKKyAgICAgIC4uaWQgPSAiY2FsYzIiCisgICAgICAuLnR5cGUgPSAibnVtYmVyIgorICAgICAgLi5zdHlsZS5mb250U2l6ZSA9ICIxNHB4IgorICAgICAgLi5zdHlsZS53aWR0aCA9ICI1MHB4IgorICAgICAgLi5zdHlsZS5tYXJnaW5MZWZ0ID0gIjEwcHgiOworICAgIG91dHB1dC5hcHBlbmQobnVtMik7CisgICAgQnV0dG9uRWxlbWVudCBjYWxjQnV0dG9uID0gbmV3IEJ1dHRvbkVsZW1lbnQoKQorICAgICAgLi50ZXh0ID0gIj0iCisgICAgICAuLnN0eWxlLmZvbnRTaXplID0gIjE0cHgiCisgICAgICAuLnN0eWxlLm1hcmdpbkxlZnQgPSAiMTBweCIKKyAgICAgIC4ub25DbGljay5saXN0ZW4oX29uQ2FsY0NsaWNrKTsKKyAgICBvdXRwdXQuYXBwZW5kKGNhbGNCdXR0b24pOworICAgIFNwYW5FbGVtZW50IHJlc3VsdCA9IG5ldyBTcGFuRWxlbWVudCgpCisgICAgICAuLmlkID0gImNhbGNSZXN1bHQiCisgICAgICAuLnN0eWxlLmZvbnRTaXplID0gIjE0cHgiCisgICAgICAuLnN0eWxlLm1hcmdpbkxlZnQgPSAiMTBweCI7CisgICAgb3V0cHV0LmFwcGVuZChyZXN1bHQpOworICAgIG91dHB1dC5hcHBlbmQobmV3IEJSRWxlbWVudCgpKTsKKyAgICBvdXRwdXQuYXBwZW5kKG5ldyBCUkVsZW1lbnQoKSk7CisgICAgTGFiZWxFbGVtZW50IGxvZ0lkTGFiZWwgPSBuZXcgTGFiZWxFbGVtZW50KCkKKyAgICAgIC4udGV4dCA9ICJMb2cgSUQ6IgorICAgICAgLi5zdHlsZS5mb250U2l6ZSA9ICIxNHB4IjsKKyAgICBvdXRwdXQuYXBwZW5kKGxvZ0lkTGFiZWwpOworICAgIElucHV0RWxlbWVudCBsb2dJZCA9IG5ldyBJbnB1dEVsZW1lbnQoKQorICAgICAgLi5pZCA9ICJsb2dJZCIKKyAgICAgIC4udHlwZSA9ICJudW1iZXIiCisgICAgICAuLnZhbHVlID0gIjEiCisgICAgICAuLnN0eWxlLmZvbnRTaXplID0gIjE0cHgiCisgICAgICAuLnN0eWxlLndpZHRoID0gIjUwcHgiCisgICAgICAuLnN0eWxlLm1hcmdpbkxlZnQgPSAiMTBweCI7CisgICAgb3V0cHV0LmFwcGVuZChsb2dJZCk7CisgICAgTGFiZWxFbGVtZW50IGNvbW1lbnRMYWJlbCA9IG5ldyBMYWJlbEVsZW1lbnQoKQorICAgICAgLi50ZXh0ID0gIkNvbW1lbnQ6IgorICAgICAgLi5zdHlsZS5mb250U2l6ZSA9ICIxNHB4IgorICAgICAgLi5zdHlsZS5tYXJnaW5MZWZ0ID0gIjEwcHgiOworICAgIG91dHB1dC5hcHBlbmQoY29tbWVudExhYmVsKTsKKyAgICBJbnB1dEVsZW1lbnQgY29tbWVudCA9IG5ldyBJbnB1dEVsZW1lbnQoKQorICAgICAgLi5pZCA9ICJjb21tZW50IgorICAgICAgLi5zdHlsZS5mb250U2l6ZSA9ICIxNHB4IgorICAgICAgLi5zdHlsZS53aWR0aCA9ICIxMDBweCIKKyAgICAgIC4uc3R5bGUubWFyZ2luTGVmdCA9ICIxMHB4IjsKKyAgICBvdXRwdXQuYXBwZW5kKGNvbW1lbnQpOworICB9CisKKyAgdm9pZCBfb25DYWxjQ2xpY2soTW91c2VFdmVudCBlKSB7CisgICAgX3ZhbGlkYXRlKCk7CisKKyAgICBJbnB1dEVsZW1lbnQgbnVtMSA9IHF1ZXJ5U2VsZWN0b3IoIiNjYWxjMSIpOworICAgIElucHV0RWxlbWVudCBudW0yID0gcXVlcnlTZWxlY3RvcigiI2NhbGMyIik7CisgICAgU2VsZWN0RWxlbWVudCBvcCA9IHF1ZXJ5U2VsZWN0b3IoIiNjYWxjT3AiKTsKKyAgICBTcGFuRWxlbWVudCByZXN1bHQgPSBxdWVyeVNlbGVjdG9yKCIjY2FsY1Jlc3VsdCIpOworICAgIElucHV0RWxlbWVudCBsb2dJZCA9IHF1ZXJ5U2VsZWN0b3IoIiNsb2dJZCIpOworICAgIElucHV0RWxlbWVudCBjb21tZW50ID0gcXVlcnlTZWxlY3RvcigiI2NvbW1lbnQiKTsKKworICAgIGludCBsb2dJZFZhbHVlID0gaW50LnBhcnNlKGxvZ0lkLnZhbHVlKTsKKyAgICBsb2dJZC52YWx1ZSA9IChsb2dJZFZhbHVlICsgMSkudG9TdHJpbmcoKTsKKworICAgIFdvcmsgd29yayA9IG5ldyBXb3JrKCk7CisgICAgd29yay5udW0xID0gaW50LnBhcnNlKG51bTEudmFsdWUpOworICAgIHdvcmsubnVtMiA9IGludC5wYXJzZShudW0yLnZhbHVlKTsKKyAgICB3b3JrLm9wID0gaW50LnBhcnNlKG9wLm9wdGlvbnNbb3Auc2VsZWN0ZWRJbmRleF0udmFsdWUpOworICAgIHdvcmsuY29tbWVudCA9IGNvbW1lbnQudmFsdWU7CisKKyAgICBfY2FsY3VsYXRvckNsaWVudC5jYWxjdWxhdGUobG9nSWRWYWx1ZSwgd29yaykudGhlbigoaW50IG4pIHsKKyAgICAgIHJlc3VsdC50ZXh0ID0gIiRuIjsKKyAgICB9KTsKKyAgfQorCisgIHZvaWQgX2J1aWxkR2V0U3RydWN0Q29tcG9uZW50KCkgeworICAgIG91dHB1dC5hcHBlbmQobmV3IEhlYWRpbmdFbGVtZW50LmgzKCkuLnRleHQgPSAiR2V0IFN0cnVjdCIpOworICAgIExhYmVsRWxlbWVudCBsb2dJZExhYmVsID0gbmV3IExhYmVsRWxlbWVudCgpCisgICAgICAuLnRleHQgPSAiU3RydWN0IEtleToiCisgICAgICAuLnN0eWxlLmZvbnRTaXplID0gIjE0cHgiOworICAgIG91dHB1dC5hcHBlbmQobG9nSWRMYWJlbCk7CisgICAgSW5wdXRFbGVtZW50IGxvZ0lkID0gbmV3IElucHV0RWxlbWVudCgpCisgICAgICAuLmlkID0gInN0cnVjdEtleSIKKyAgICAgIC4udHlwZSA9ICJudW1iZXIiCisgICAgICAuLnZhbHVlID0gIjEiCisgICAgICAuLnN0eWxlLmZvbnRTaXplID0gIjE0cHgiCisgICAgICAuLnN0eWxlLndpZHRoID0gIjUwcHgiCisgICAgICAuLnN0eWxlLm1hcmdpbkxlZnQgPSAiMTBweCI7CisgICAgb3V0cHV0LmFwcGVuZChsb2dJZCk7CisgICAgQnV0dG9uRWxlbWVudCBnZXRTdHJ1Y3RCdXR0b24gPSBuZXcgQnV0dG9uRWxlbWVudCgpCisgICAgICAuLnRleHQgPSAiR0VUIgorICAgICAgLi5zdHlsZS5mb250U2l6ZSA9ICIxNHB4IgorICAgICAgLi5zdHlsZS5tYXJnaW5MZWZ0ID0gIjEwcHgiCisgICAgICAuLm9uQ2xpY2subGlzdGVuKF9vbkdldFN0cnVjdENsaWNrKTsKKyAgICBvdXRwdXQuYXBwZW5kKGdldFN0cnVjdEJ1dHRvbik7CisgICAgb3V0cHV0LmFwcGVuZChuZXcgQlJFbGVtZW50KCkpOworICAgIG91dHB1dC5hcHBlbmQobmV3IEJSRWxlbWVudCgpKTsKKyAgICBUZXh0QXJlYUVsZW1lbnQgcmVzdWx0ID0gbmV3IFRleHRBcmVhRWxlbWVudCgpCisgICAgICAuLmlkID0gImdldFN0cnVjdFJlc3VsdCIKKyAgICAgIC4uc3R5bGUuZm9udFNpemUgPSAiMTRweCIKKyAgICAgIC4uc3R5bGUud2lkdGggPSAiMzAwcHgiCisgICAgICAuLnN0eWxlLmhlaWdodCA9ICI1MHB4IgorICAgICAgLi5zdHlsZS5tYXJnaW5MZWZ0ID0gIjEwcHgiOworICAgIG91dHB1dC5hcHBlbmQocmVzdWx0KTsKKyAgfQorCisgIHZvaWQgX29uR2V0U3RydWN0Q2xpY2soTW91c2VFdmVudCBlKSB7CisgICAgX3ZhbGlkYXRlKCk7CisKKyAgICBJbnB1dEVsZW1lbnQgc3RydWN0S2V5ID0gcXVlcnlTZWxlY3RvcigiI3N0cnVjdEtleSIpOworICAgIFRleHRBcmVhRWxlbWVudCByZXN1bHQgPSBxdWVyeVNlbGVjdG9yKCIjZ2V0U3RydWN0UmVzdWx0Iik7CisKKyAgICBfY2FsY3VsYXRvckNsaWVudAorICAgICAgICAuZ2V0U3RydWN0KGludC5wYXJzZShzdHJ1Y3RLZXkudmFsdWUpKQorICAgICAgICAudGhlbigoU2hhcmVkU3RydWN0IHMpIHsKKyAgICAgIHJlc3VsdC50ZXh0ID0gIiR7cy50b1N0cmluZygpfSI7CisgICAgfSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2RhcnQvY2xpZW50L3dlYi9pbmRleC5odG1sIGIvdHV0b3JpYWwvZGFydC9jbGllbnQvd2ViL2luZGV4Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRiMTg0ZQotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2RhcnQvY2xpZW50L3dlYi9pbmRleC5odG1sCkBAIC0wLDAgKzEsMzYgQEAKKzwhLS0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPCFET0NUWVBFIGh0bWw+Cis8aHRtbD4KKzxoZWFkPgorICAgIDxtZXRhIGNoYXJzZXQ9InV0Zi04Ij4KKyAgICA8bWV0YSBodHRwLWVxdWl2PSJYLVVBLUNvbXBhdGlibGUiIGNvbnRlbnQ9IklFPWVkZ2UiPgorICAgIDxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MS4wIj4KKyAgICA8dGl0bGU+VGhyaWZ0IFR1dG9yaWFsPC90aXRsZT4KKyAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9InN0eWxlcy5jc3MiPgorICAgIDxzY3JpcHQgYXN5bmMgc3JjPSJjbGllbnQuZGFydCIgdHlwZT0iYXBwbGljYXRpb24vZGFydCI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCBhc3luYyBzcmM9InBhY2thZ2VzL2Jyb3dzZXIvZGFydC5qcyI+PC9zY3JpcHQ+Cis8L2hlYWQ+CisKKzxib2R5PgorCisgIDxkaXYgaWQ9Im91dHB1dCI+PC9kaXY+CisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2RhcnQvY2xpZW50L3dlYi9zdHlsZXMuY3NzIGIvdHV0b3JpYWwvZGFydC9jbGllbnQvd2ViL3N0eWxlcy5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzAzMTUwMgotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2RhcnQvY2xpZW50L3dlYi9zdHlsZXMuY3NzCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK0BpbXBvcnQgdXJsKGh0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzP2ZhbWlseT1Sb2JvdG8pOworCitodG1sLCBib2R5IHsKKyAgICB3aWR0aDogMTAwJTsKKyAgICBoZWlnaHQ6IDEwMCU7CisgICAgbWFyZ2luOiAwOworICAgIHBhZGRpbmc6IDEwcHg7CisgICAgZm9udC1mYW1pbHk6ICdSb2JvdG8nLCBzYW5zLXNlcmlmOworfQorCitoMyB7CisgICAgYm9yZGVyLWJvdHRvbTogc29saWQ7CisgICAgYm9yZGVyLXdpZHRoOiB0aGluOworICAgIHBhZGRpbmctdG9wOiAyMHB4OworfQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZGFydC9jb25zb2xlX2NsaWVudC8uYW5hbHlzaXNfb3B0aW9ucyBiL3R1dG9yaWFsL2RhcnQvY29uc29sZV9jbGllbnQvLmFuYWx5c2lzX29wdGlvbnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTEwZDRjNQotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2RhcnQvY29uc29sZV9jbGllbnQvLmFuYWx5c2lzX29wdGlvbnMKQEAgLTAsMCArMSwyIEBACithbmFseXplcjoKKyAgc3Ryb25nLW1vZGU6IHRydWUKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2RhcnQvY29uc29sZV9jbGllbnQvYmluL21haW4uZGFydCBiL3R1dG9yaWFsL2RhcnQvY29uc29sZV9jbGllbnQvYmluL21haW4uZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGEyMDZhCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvZGFydC9jb25zb2xlX2NsaWVudC9iaW4vbWFpbi5kYXJ0CkBAIC0wLDAgKzEsMTQ5IEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworaW1wb3J0ICdkYXJ0OmFzeW5jJzsKK2ltcG9ydCAnZGFydDppbyc7CisKK2ltcG9ydCAncGFja2FnZTphcmdzL2FyZ3MuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6bG9nZ2luZy9sb2dnaW5nLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOnRocmlmdC90aHJpZnQuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6dGhyaWZ0L3RocmlmdF9jb25zb2xlLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOnR1dG9yaWFsL3R1dG9yaWFsLmRhcnQnOworCitUVHJhbnNwb3J0IF90cmFuc3BvcnQ7CitDYWxjdWxhdG9yIF9jYWxjdWxhdG9yOworaW50IGxvZ2lkID0gMDsKKworY29uc3QgTWFwPFN0cmluZywgaW50PiBvcGVyYXRpb25Mb29rdXAgPSBjb25zdCB7CisgICcrJzogT3BlcmF0aW9uLkFERCwKKyAgJy0nOiBPcGVyYXRpb24uU1VCVFJBQ1QsCisgICcqJzogT3BlcmF0aW9uLk1VTFRJUExZLAorICAnLyc6IE9wZXJhdGlvbi5ESVZJREUKK307CisKK21haW4oTGlzdDxTdHJpbmc+IGFyZ3MpIHsKKyAgTG9nZ2VyLnJvb3QubGV2ZWwgPSBMZXZlbC5BTEw7CisgIExvZ2dlci5yb290Lm9uUmVjb3JkLmxpc3RlbigoTG9nUmVjb3JkIHJlYykgeworICAgIHByaW50KCcke3JlYy5sZXZlbC5uYW1lfTogJHtyZWMudGltZX06ICR7cmVjLm1lc3NhZ2V9Jyk7CisgIH0pOworCisgIHZhciBwYXJzZXIgPSBuZXcgQXJnUGFyc2VyKCk7CisgIHBhcnNlci5hZGRPcHRpb24oJ3BvcnQnLCBkZWZhdWx0c1RvOiAnOTA5MCcsIGhlbHA6ICdUaGUgcG9ydCB0byBjb25uZWN0IHRvJyk7CisKKyAgQXJnUmVzdWx0cyByZXN1bHRzOworICB0cnkgeworICAgIHJlc3VsdHMgPSBwYXJzZXIucGFyc2UoYXJncyk7CisgIH0gY2F0Y2ggKGUpIHsKKyAgICByZXN1bHRzID0gbnVsbDsKKyAgfQorCisgIGlmIChyZXN1bHRzID09IG51bGwpIHsKKyAgICBwcmludChwYXJzZXIudXNhZ2UpOworICAgIGV4aXQoMCk7CisgIH0KKworICBpbnQgcG9ydCA9IGludC5wYXJzZShyZXN1bHRzWydwb3J0J10pOworCisgIF9pbml0Q29ubmVjdGlvbihwb3J0KS50aGVuKChfKSA9PiBfcnVuKCkpOworfQorCitGdXR1cmUgX2luaXRDb25uZWN0aW9uKGludCBwb3J0KSBhc3luYyB7CisgIHZhciBzb2NrZXQgPSBhd2FpdCBTb2NrZXQuY29ubmVjdCgnMTI3LjAuMC4xJywgcG9ydCk7CisgIF90cmFuc3BvcnQgPSBuZXcgVEFzeW5jQ2xpZW50U29ja2V0VHJhbnNwb3J0KAorICAgICAgbmV3IFRUY3BTb2NrZXQoc29ja2V0KSwgbmV3IFRNZXNzYWdlUmVhZGVyKG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpKTsKKyAgVFByb3RvY29sIHByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbChfdHJhbnNwb3J0KTsKKyAgYXdhaXQgX3RyYW5zcG9ydC5vcGVuKCk7CisKKyAgX2NhbGN1bGF0b3IgPSBuZXcgQ2FsY3VsYXRvckNsaWVudChwcm90b2NvbCk7Cit9CisKK0Z1dHVyZSBfcnVuKCkgYXN5bmMgeworICBfaGVscCgpOworCisgIHdoaWxlICh0cnVlKSB7CisgICAgc3Rkb3V0LndyaXRlKCI+ICIpOworICAgIHZhciBpbnB1dCA9IHN0ZGluLnJlYWRMaW5lU3luYygpOworICAgIHZhciBwYXJ0cyA9IGlucHV0LnNwbGl0KCcgJyk7CisgICAgdmFyIGNvbW1hbmQgPSBwYXJ0c1swXTsKKyAgICB2YXIgYXJncyA9IHBhcnRzLmxlbmd0aCA+IDEgPyBwYXJ0cy5zdWJsaXN0KDEpIDogW107CisKKyAgICBzd2l0Y2ggKGNvbW1hbmQpIHsKKyAgICAgIGNhc2UgJ3BpbmcnOgorICAgICAgICBhd2FpdCBfcGluZygpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSAnYWRkJzoKKyAgICAgICAgYXdhaXQgX2FkZChpbnQucGFyc2UoYXJnc1swXSksIGludC5wYXJzZShhcmdzWzFdKSk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlICdjYWxjJzoKKyAgICAgICAgaW50IG9wID0gb3BlcmF0aW9uTG9va3VwW2FyZ3NbMV1dOworICAgICAgICBpZiAoIU9wZXJhdGlvbi5WQUxJRF9WQUxVRVMuY29udGFpbnMob3ApKSB7CisgICAgICAgICAgc3Rkb3V0LndyaXRlbG4oJ1Vua25vd24gb3BlcmF0b3IgJHthcmdzWzFdfScpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgdmFyIHdvcmsgPSBuZXcgV29yaygpCisgICAgICAgICAgLi5udW0xID0gaW50LnBhcnNlKGFyZ3NbMF0pCisgICAgICAgICAgLi5vcCA9IG9wCisgICAgICAgICAgLi5udW0yID0gaW50LnBhcnNlKGFyZ3NbMl0pCisgICAgICAgICAgLi5jb21tZW50ID0gYXJncy5sZW5ndGggPiAzID8gYXJnc1szXSA6ICcnOworCisgICAgICAgIGF3YWl0IF9jYWxjKHdvcmspOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSAnc3RydWN0JzoKKyAgICAgICAgYXdhaXQgX3N0cnVjdChpbnQucGFyc2UoYXJnc1swXSkpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSAnaGVscCc6CisgICAgICBkZWZhdWx0OgorICAgICAgICBfaGVscCgpOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KK30KKwordm9pZCBfaGVscCgpIHsKKyAgc3Rkb3V0LndyaXRlbG4oJ0NvbW1hbmRzOicpOworICBzdGRvdXQud3JpdGVsbignICBoZWxwJyk7CisgIHN0ZG91dC53cml0ZWxuKCcgIHBpbmcnKTsKKyAgc3Rkb3V0LndyaXRlbG4oJyAgYWRkIHggeScpOworICBzdGRvdXQud3JpdGVsbignICBjYWxjIHggb3AgeSBbY29tbWVudF0nKTsKKyAgc3Rkb3V0LndyaXRlbG4oJyAgc3RydWN0IGlkJyk7CisgIHN0ZG91dC53cml0ZWxuKCcnKTsKK30KKworRnV0dXJlIF9waW5nKCkgYXN5bmMgeworICBhd2FpdCBfY2FsY3VsYXRvci5waW5nKCk7CisgIHN0ZG91dC53cml0ZWxuKCdwaW5nIHN1Y2NlZWRlZCcpOworfQorCitGdXR1cmUgX2FkZChpbnQgeCwgaW50IHkpIGFzeW5jIHsKKyAgaW50IHJlc3VsdCA9IGF3YWl0IF9jYWxjdWxhdG9yLmFkZCh4LCB5KTsKKyAgc3Rkb3V0LndyaXRlbG4oJz0gJHJlc3VsdCcpOworfQorCitGdXR1cmUgX2NhbGMoV29yayB3b3JrKSBhc3luYyB7CisgIGludCByZXN1bHQgPSBhd2FpdCBfY2FsY3VsYXRvci5jYWxjdWxhdGUobG9naWQrKywgd29yayk7CisgIHN0ZG91dC53cml0ZWxuKCc9ICRyZXN1bHQnKTsKK30KKworRnV0dXJlIF9zdHJ1Y3QoaW50IGtleSkgYXN5bmMgeworICB2YXIgc3RydWN0ID0gYXdhaXQgX2NhbGN1bGF0b3IuZ2V0U3RydWN0KGtleSk7CisgIHN0ZG91dC53cml0ZWxuKHN0cnVjdC50b1N0cmluZygpKTsKK30KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2RhcnQvY29uc29sZV9jbGllbnQvcHVic3BlYy55YW1sIGIvdHV0b3JpYWwvZGFydC9jb25zb2xlX2NsaWVudC9wdWJzcGVjLnlhbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM0ZTI2ZgotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2RhcnQvY29uc29sZV9jbGllbnQvcHVic3BlYy55YW1sCkBAIC0wLDAgKzEsMzYgQEAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAnTGljZW5zZScpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAnQVMgSVMnIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKworbmFtZTogdHV0b3JpYWxfY29uc29sZV9jbGllbnQKK3ZlcnNpb246IDEuMC4wCitkZXNjcmlwdGlvbjogPgorICBBIERhcnQgY29uc29sZSBjbGllbnQgdG8gaW1wbGVtZW50YXRpb24gb2YgdGhlIEFwYWNoZSBUaHJpZnQgdHV0b3JpYWwKK2F1dGhvcjogQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzIDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+Citob21lcGFnZTogaHR0cDovL3RocmlmdC5hcGFjaGUub3JnCisKK2Vudmlyb25tZW50OgorICBzZGs6ICI+PTEuMTMuMCA8Mi4wLjAiCisKK2RlcGVuZGVuY2llczoKKyAgYXJnczogXjAuMTMuMAorICBjb2xsZWN0aW9uOiBeMS4xLjAKKyAgc2hhcmVkOgorICAgIHBhdGg6IC4uL2dlbi1kYXJ0L3NoYXJlZAorICB0aHJpZnQ6CisgICAgcGF0aDogLi4vLi4vLi4vbGliL2RhcnQKKyAgdHV0b3JpYWw6CisgICAgcGF0aDogLi4vZ2VuLWRhcnQvdHV0b3JpYWwKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2RhcnQvc2VydmVyLy5hbmFseXNpc19vcHRpb25zIGIvdHV0b3JpYWwvZGFydC9zZXJ2ZXIvLmFuYWx5c2lzX29wdGlvbnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTEwZDRjNQotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2RhcnQvc2VydmVyLy5hbmFseXNpc19vcHRpb25zCkBAIC0wLDAgKzEsMiBAQAorYW5hbHl6ZXI6CisgIHN0cm9uZy1tb2RlOiB0cnVlCmRpZmYgLS1naXQgYS90dXRvcmlhbC9kYXJ0L3NlcnZlci9iaW4vbWFpbi5kYXJ0IGIvdHV0b3JpYWwvZGFydC9zZXJ2ZXIvYmluL21haW4uZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGFjMzBkCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvZGFydC9zZXJ2ZXIvYmluL21haW4uZGFydApAQCAtMCwwICsxLDE2MyBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK2ltcG9ydCAnZGFydDphc3luYyc7CitpbXBvcnQgJ2RhcnQ6aW8nOworCitpbXBvcnQgJ3BhY2thZ2U6YXJncy9hcmdzLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmxvZ2dpbmcvbG9nZ2luZy5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTp0aHJpZnQvdGhyaWZ0LmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOnRocmlmdC90aHJpZnRfY29uc29sZS5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTp0dXRvcmlhbC90dXRvcmlhbC5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTpzaGFyZWQvc2hhcmVkLmRhcnQnOworCitUUHJvdG9jb2wgX3Byb3RvY29sOworVFByb2Nlc3NvciBfcHJvY2Vzc29yOworV2ViU29ja2V0IF93ZWJTb2NrZXQ7CisKK21haW4oTGlzdDxTdHJpbmc+IGFyZ3MpIHsKKyAgTG9nZ2VyLnJvb3QubGV2ZWwgPSBMZXZlbC5BTEw7CisgIExvZ2dlci5yb290Lm9uUmVjb3JkLmxpc3RlbigoTG9nUmVjb3JkIHJlYykgeworICAgIHByaW50KCcke3JlYy5sZXZlbC5uYW1lfTogJHtyZWMudGltZX06ICR7cmVjLm1lc3NhZ2V9Jyk7CisgIH0pOworCisgIHZhciBwYXJzZXIgPSBuZXcgQXJnUGFyc2VyKCk7CisgIHBhcnNlci5hZGRPcHRpb24oJ3BvcnQnLCBkZWZhdWx0c1RvOiAnOTA5MCcsIGhlbHA6ICdUaGUgcG9ydCB0byBsaXN0ZW4gb24nKTsKKyAgcGFyc2VyLmFkZE9wdGlvbigndHlwZScsCisgICAgICBkZWZhdWx0c1RvOiAnd3MnLAorICAgICAgYWxsb3dlZDogWyd3cycsICd0Y3AnXSwKKyAgICAgIGhlbHA6ICdUaGUgdHlwZSBvZiBzb2NrZXQnLAorICAgICAgYWxsb3dlZEhlbHA6IHsnd3MnOiAnV2ViU29ja2V0JywgJ3RjcCc6ICdUQ1AgU29ja2V0J30pOworCisgIEFyZ1Jlc3VsdHMgcmVzdWx0czsKKyAgdHJ5IHsKKyAgICByZXN1bHRzID0gcGFyc2VyLnBhcnNlKGFyZ3MpOworICB9IGNhdGNoIChlKSB7CisgICAgcmVzdWx0cyA9IG51bGw7CisgIH0KKworICBpZiAocmVzdWx0cyA9PSBudWxsKSB7CisgICAgcHJpbnQocGFyc2VyLnVzYWdlKTsKKyAgICBleGl0KDApOworICB9CisKKyAgaW50IHBvcnQgPSBpbnQucGFyc2UocmVzdWx0c1sncG9ydCddKTsKKyAgU3RyaW5nIHNvY2tldFR5cGUgPSByZXN1bHRzWyd0eXBlJ107CisKKyAgaWYgKHNvY2tldFR5cGUgPT0gJ3RjcCcpIHsKKyAgICBfcnVuVGNwU2VydmVyKHBvcnQpOworICB9IGVsc2UgaWYgKHNvY2tldFR5cGUgPT0gJ3dzJykgeworICAgIF9ydW5XZWJTb2NrZXRTZXJ2ZXIocG9ydCk7CisgIH0KK30KKworRnV0dXJlIF9ydW5XZWJTb2NrZXRTZXJ2ZXIoaW50IHBvcnQpIGFzeW5jIHsKKyAgdmFyIGh0dHBTZXJ2ZXIgPSBhd2FpdCBIdHRwU2VydmVyLmJpbmQoJzEyNy4wLjAuMScsIHBvcnQpOworICBwcmludCgnbGlzdGVuaW5nIGZvciBXZWJTb2NrZXQgY29ubmVjdGlvbnMgb24gJHBvcnQnKTsKKworICBodHRwU2VydmVyLmxpc3RlbigoSHR0cFJlcXVlc3QgcmVxdWVzdCkgYXN5bmMgeworICAgIGlmIChyZXF1ZXN0LnVyaS5wYXRoID09ICcvd3MnKSB7CisgICAgICBfd2ViU29ja2V0ID0gYXdhaXQgV2ViU29ja2V0VHJhbnNmb3JtZXIudXBncmFkZShyZXF1ZXN0KTsKKyAgICAgIGF3YWl0IF9pbml0UHJvY2Vzc29yKG5ldyBUV2ViU29ja2V0KF93ZWJTb2NrZXQpKTsKKyAgICB9IGVsc2UgeworICAgICAgcHJpbnQoJ0ludmFsaWQgcGF0aDogJHtyZXF1ZXN0LnVyaS5wYXRofScpOworICAgIH0KKyAgfSk7Cit9CisKK0Z1dHVyZSBfcnVuVGNwU2VydmVyKGludCBwb3J0KSBhc3luYyB7CisgIHZhciBzZXJ2ZXJTb2NrZXQgPSBhd2FpdCBTZXJ2ZXJTb2NrZXQuYmluZCgnMTI3LjAuMC4xJywgcG9ydCk7CisgIHByaW50KCdsaXN0ZW5pbmcgZm9yIFRDUCBjb25uZWN0aW9ucyBvbiAkcG9ydCcpOworCisgIFNvY2tldCBzb2NrZXQgPSBhd2FpdCBzZXJ2ZXJTb2NrZXQuZmlyc3Q7CisgIGF3YWl0IF9pbml0UHJvY2Vzc29yKG5ldyBUVGNwU29ja2V0KHNvY2tldCkpOworfQorCitGdXR1cmUgX2luaXRQcm9jZXNzb3IoVFNvY2tldCBzb2NrZXQpIGFzeW5jIHsKKyAgVFNlcnZlclNvY2tldFRyYW5zcG9ydCB0cmFuc3BvcnQgPSBuZXcgVFNlcnZlclNvY2tldFRyYW5zcG9ydChzb2NrZXQpOworICB0cmFuc3BvcnQub25JbmNvbWluZ01lc3NhZ2UubGlzdGVuKF9wcm9jZXNzTWVzc2FnZSk7CisgIF9wcm9jZXNzb3IgPSBuZXcgQ2FsY3VsYXRvclByb2Nlc3NvcihuZXcgQ2FsY3VsYXRvclNlcnZlcigpKTsKKyAgX3Byb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpOworICBhd2FpdCBfcHJvdG9jb2wudHJhbnNwb3J0Lm9wZW4oKTsKKworICBwcmludCgnY29ubmVjdGVkJyk7Cit9CisKK0Z1dHVyZSBfcHJvY2Vzc01lc3NhZ2UoXykgYXN5bmMgeworICBfcHJvY2Vzc29yLnByb2Nlc3MoX3Byb3RvY29sLCBfcHJvdG9jb2wpOworfQorCitjbGFzcyBDYWxjdWxhdG9yU2VydmVyIGltcGxlbWVudHMgQ2FsY3VsYXRvciB7CisgIGZpbmFsIE1hcDxpbnQsIFNoYXJlZFN0cnVjdD4gX2xvZyA9IHt9OworCisgIEZ1dHVyZSBwaW5nKCkgYXN5bmMgeworICAgIHByaW50KCdwaW5nKCknKTsKKyAgfQorCisgIEZ1dHVyZTxpbnQ+IGFkZChpbnQgbnVtMSwgaW50IG51bTIpIGFzeW5jIHsKKyAgICBwcmludCgnYWRkKCRudW0xLCAkbnVtMiknKTsKKworICAgIHJldHVybiBudW0xICsgbnVtMjsKKyAgfQorCisgIEZ1dHVyZTxpbnQ+IGNhbGN1bGF0ZShpbnQgbG9naWQsIFdvcmsgd29yaykgYXN5bmMgeworICAgIHByaW50KCdjYWx1bGF0ZSgkbG9naWQsICR7d29yay50b1N0cmluZygpfSknKTsKKworICAgIGludCB2YWw7CisKKyAgICBzd2l0Y2ggKHdvcmsub3ApIHsKKyAgICAgIGNhc2UgT3BlcmF0aW9uLkFERDoKKyAgICAgICAgdmFsID0gd29yay5udW0xICsgd29yay5udW0yOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBPcGVyYXRpb24uU1VCVFJBQ1Q6CisgICAgICAgIHZhbCA9IHdvcmsubnVtMSAtIHdvcmsubnVtMjsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgT3BlcmF0aW9uLk1VTFRJUExZOgorICAgICAgICB2YWwgPSB3b3JrLm51bTEgKiB3b3JrLm51bTI7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIE9wZXJhdGlvbi5ESVZJREU6CisgICAgICAgIGlmICh3b3JrLm51bTIgPT0gMCkgeworICAgICAgICAgIHZhciB4ID0gbmV3IEludmFsaWRPcGVyYXRpb24oKTsKKyAgICAgICAgICB4LndoYXRPcCA9IHdvcmsub3A7CisgICAgICAgICAgeC53aHkgPSAnQ2Fubm90IGRpdmlkZSBieSAwJzsKKyAgICAgICAgICB0aHJvdyB4OworICAgICAgICB9CisgICAgICAgIHZhbCA9ICh3b3JrLm51bTEgLyB3b3JrLm51bTIpLmZsb29yKCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHZhciBsb2cgPSBuZXcgU2hhcmVkU3RydWN0KCk7CisgICAgbG9nLmtleSA9IGxvZ2lkOworICAgIGxvZy52YWx1ZSA9ICckdmFsICIke3dvcmsuY29tbWVudH0iJzsKKyAgICB0aGlzLl9sb2dbbG9naWRdID0gbG9nOworCisgICAgcmV0dXJuIHZhbDsKKyAgfQorCisgIEZ1dHVyZSB6aXAoKSBhc3luYyB7CisgICAgcHJpbnQoJ3ppcCgpJyk7CisgIH0KKworICBGdXR1cmU8U2hhcmVkU3RydWN0PiBnZXRTdHJ1Y3QoaW50IGtleSkgYXN5bmMgeworICAgIHByaW50KCdnZXRTdHJ1Y3QoJGtleSknKTsKKworICAgIHJldHVybiBfbG9nW2tleV07CisgIH0KK30KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2RhcnQvc2VydmVyL3B1YnNwZWMueWFtbCBiL3R1dG9yaWFsL2RhcnQvc2VydmVyL3B1YnNwZWMueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGQwNzM3Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvZGFydC9zZXJ2ZXIvcHVic3BlYy55YW1sCkBAIC0wLDAgKzEsMzQgQEAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAnTGljZW5zZScpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAnQVMgSVMnIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKworbmFtZTogdHV0b3JpYWxfc2VydmVyCit2ZXJzaW9uOiAxLjAuMAorZGVzY3JpcHRpb246IEEgRGFydCBzZXJ2ZXIgdG8gc3VwcG9ydCB0aGUgQXBhY2hlIFRocmlmdCB0dXRvcmlhbAorYXV0aG9yOiBBcGFjaGUgVGhyaWZ0IERldmVsb3BlcnMgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4KK2hvbWVwYWdlOiBodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcKKworZW52aXJvbm1lbnQ6CisgIHNkazogIj49MS4xMy4wIDwyLjAuMCIKKworZGVwZW5kZW5jaWVzOgorICBhcmdzOiBeMC4xMy4wCisgIHNoYXJlZDoKKyAgICBwYXRoOiAuLi9nZW4tZGFydC9zaGFyZWQKKyAgdGhyaWZ0OgorICAgIHBhdGg6IC4uLy4uLy4uL2xpYi9kYXJ0CisgIHR1dG9yaWFsOgorICAgIHBhdGg6IC4uL2dlbi1kYXJ0L3R1dG9yaWFsCmRpZmYgLS1naXQgYS90dXRvcmlhbC9kZWxwaGkvRGVscGhpQ2xpZW50L0RlbHBoaUNsaWVudC5kcHIgYi90dXRvcmlhbC9kZWxwaGkvRGVscGhpQ2xpZW50L0RlbHBoaUNsaWVudC5kcHIKaW5kZXggMGYzODBiMC4uNzRkMGQ0NSAxMDA2NDQKLS0tIGEvdHV0b3JpYWwvZGVscGhpL0RlbHBoaUNsaWVudC9EZWxwaGlDbGllbnQuZHByCisrKyBiL3R1dG9yaWFsL2RlbHBoaS9EZWxwaGlDbGllbnQvRGVscGhpQ2xpZW50LmRwcgpAQCAtMjYsNyArMjYsNyBAQAogICBHZW5lcmljcy5Db2xsZWN0aW9ucywKICAgVGhyaWZ0IGluICcuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQucGFzJywKICAgVGhyaWZ0LkNvbGxlY3Rpb25zIGluICcuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuQ29sbGVjdGlvbnMucGFzJywKLSAgVGhyaWZ0LkNvbnNvbGUgaW4gJy4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5Db25zb2xlLnBhcycsCisgIFRocmlmdC5FeGNlcHRpb24gaW4gJy4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5FeGNlcHRpb24ucGFzJywKICAgVGhyaWZ0LlV0aWxzIGluICcuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuVXRpbHMucGFzJywKICAgVGhyaWZ0LlN0cmVhbSBpbiAnLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LlN0cmVhbS5wYXMnLAogICBUaHJpZnQuUHJvdG9jb2wgaW4gJy4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5Qcm90b2NvbC5wYXMnLApAQCAtNjIsMTAgKzYyLDEwIEBACiAgICAgdHJhbnNwb3J0Lk9wZW47CiAKICAgICBjbGllbnQucGluZzsKLSAgICBDb25zb2xlLldyaXRlTGluZSgncGluZygpJyk7CisgICAgV3JpdGVMbigncGluZygpJyk7CiAKICAgICBzdW0gOj0gY2xpZW50LmFkZCggMSwgMSk7Ci0gICAgQ29uc29sZS5Xcml0ZUxpbmUoIEZvcm1hdCggJzErMT0lZCcsIFtzdW1dKSk7CisgICAgV3JpdGVMbiggRm9ybWF0KCAnMSsxPSVkJywgW3N1bV0pKTsKIAogICAgIHdvcmsgOj0gVFdvcmtJbXBsLkNyZWF0ZTsKIApAQCAtNzQsMTEgKzc0LDExIEBACiAgICAgd29yay5OdW0yIDo9IDA7CiAgICAgdHJ5CiAgICAgICBxdW90aWVudCA6PSBjbGllbnQuY2FsY3VsYXRlKDEsIHdvcmspOwotICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoICdXaG9hIHdlIGNhbiBkaXZpZGUgYnkgMCcpOwotICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIEZvcm1hdCgnMS8wPSVkJyxbcXVvdGllbnRdKSk7CisgICAgICBXcml0ZUxuKCAnV2hvYSB3ZSBjYW4gZGl2aWRlIGJ5IDAnKTsKKyAgICAgIFdyaXRlTG4oIEZvcm1hdCgnMS8wPSVkJyxbcXVvdGllbnRdKSk7CiAgICAgZXhjZXB0CiAgICAgICBvbiBpbzogVEludmFsaWRPcGVyYXRpb24KLSAgICAgIGRvIENvbnNvbGUuV3JpdGVMaW5lKCAnSW52YWxpZCBvcGVyYXRpb246ICcgKyBpby5XaHkpOworICAgICAgZG8gV3JpdGVMbiggJ0ludmFsaWQgb3BlcmF0aW9uOiAnICsgaW8uV2h5KTsKICAgICBlbmQ7CiAKICAgICB3b3JrLk9wICAgOj0gVE9wZXJhdGlvbi5TVUJUUkFDVDsKQEAgLTg2LDIwICs4NiwyMCBAQAogICAgIHdvcmsuTnVtMiA6PSAxMDsKICAgICB0cnkKICAgICAgIGRpZmYgOj0gY2xpZW50LmNhbGN1bGF0ZSggMSwgd29yayk7Ci0gICAgICBDb25zb2xlLldyaXRlTGluZSggRm9ybWF0KCcxNS0xMD0lZCcsIFtkaWZmXSkpOworICAgICAgV3JpdGVMbiggRm9ybWF0KCcxNS0xMD0lZCcsIFtkaWZmXSkpOwogICAgIGV4Y2VwdAogICAgICAgb24gaW86IFRJbnZhbGlkT3BlcmF0aW9uCi0gICAgICBkbyBDb25zb2xlLldyaXRlTGluZSggJ0ludmFsaWQgb3BlcmF0aW9uOiAnICsgaW8uV2h5KTsKKyAgICAgIGRvIFdyaXRlTG4oICdJbnZhbGlkIG9wZXJhdGlvbjogJyArIGlvLldoeSk7CiAgICAgZW5kOwogCiAgICAgbG9nIDo9IGNsaWVudC5nZXRTdHJ1Y3QoMSk7Ci0gICAgQ29uc29sZS5Xcml0ZUxpbmUoIEZvcm1hdCggJ0NoZWNrIGxvZzogJXMnLCBbbG9nLlZhbHVlXSkpOworICAgIFdyaXRlTG4oIEZvcm1hdCggJ0NoZWNrIGxvZzogJXMnLCBbbG9nLlZhbHVlXSkpOwogCiAgICAgdHJhbnNwb3J0LkNsb3NlKCk7CiAKICAgZXhjZXB0CiAgICAgb24gZSA6IEV4Y2VwdGlvbgotICAgIGRvIENvbnNvbGUuV3JpdGVMaW5lKCBlLkNsYXNzTmFtZSsnOiAnK2UuTWVzc2FnZSk7CisgICAgZG8gV3JpdGVMbiggZS5DbGFzc05hbWUrJzogJytlLk1lc3NhZ2UpOwogICBlbmQ7CiBlbmQ7CiAKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2RlbHBoaS9EZWxwaGlDbGllbnQvRGVscGhpQ2xpZW50LmRwcm9qIGIvdHV0b3JpYWwvZGVscGhpL0RlbHBoaUNsaWVudC9EZWxwaGlDbGllbnQuZHByb2oKaW5kZXggMzRhYTUzMy4uZDA2Nzk5MiAxMDA2NDQKLS0tIGEvdHV0b3JpYWwvZGVscGhpL0RlbHBoaUNsaWVudC9EZWxwaGlDbGllbnQuZHByb2oKKysrIGIvdHV0b3JpYWwvZGVscGhpL0RlbHBoaUNsaWVudC9EZWxwaGlDbGllbnQuZHByb2oKQEAgLTEsMTE5ICsxLDExOSBAQAot77u/ICAgIDxQcm9qZWN0IHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgotICAgICAgICA8UHJvcGVydHlHcm91cD4KLSAgICAgICAgICAgIDxQcm9qZWN0R3VpZD57MkI4RkIzQTEtMkY5RS00ODgzLThDNTMtMEY1NjIyMEIzNEY2fTwvUHJvamVjdEd1aWQ+Ci0gICAgICAgICAgICA8TWFpblNvdXJjZT5EZWxwaGlDbGllbnQuZHByPC9NYWluU291cmNlPgotICAgICAgICAgICAgPFByb2plY3RWZXJzaW9uPjEyLjM8L1Byb2plY3RWZXJzaW9uPgotICAgICAgICAgICAgPEJhc2lzPlRydWU8L0Jhc2lzPgotICAgICAgICAgICAgPENvbmZpZyBDb25kaXRpb249IickKENvbmZpZyknPT0nJyI+RGVidWc8L0NvbmZpZz4KLSAgICAgICAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+Ci0gICAgICAgICAgICA8QXBwVHlwZT5Db25zb2xlPC9BcHBUeXBlPgotICAgICAgICAgICAgPEZyYW1ld29ya1R5cGU+Tm9uZTwvRnJhbWV3b3JrVHlwZT4KLSAgICAgICAgICAgIDxEQ0NfRENDQ29tcGlsZXI+RENDMzI8L0RDQ19EQ0NDb21waWxlcj4KLSAgICAgICAgPC9Qcm9wZXJ0eUdyb3VwPgotICAgICAgICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZyknPT0nQmFzaXMnIG9yICckKEJhc2UpJyE9JyciPgotICAgICAgICAgICAgPEJhc2U+dHJ1ZTwvQmFzZT4KLSAgICAgICAgPC9Qcm9wZXJ0eUdyb3VwPgotICAgICAgICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZyknPT0nRGVidWcnIG9yICckKENmZ18xKSchPScnIj4KLSAgICAgICAgICAgIDxDZmdfMT50cnVlPC9DZmdfMT4KLSAgICAgICAgICAgIDxDZmdQYXJlbnQ+QmFzZTwvQ2ZnUGFyZW50PgotICAgICAgICAgICAgPEJhc2U+dHJ1ZTwvQmFzZT4KLSAgICAgICAgPC9Qcm9wZXJ0eUdyb3VwPgotICAgICAgICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZyknPT0nUmVsZWFzZScgb3IgJyQoQ2ZnXzIpJyE9JyciPgotICAgICAgICAgICAgPENmZ18yPnRydWU8L0NmZ18yPgotICAgICAgICAgICAgPENmZ1BhcmVudD5CYXNlPC9DZmdQYXJlbnQ+Ci0gICAgICAgICAgICA8QmFzZT50cnVlPC9CYXNlPgotICAgICAgICA8L1Byb3BlcnR5R3JvdXA+Ci0gICAgICAgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQmFzZSknIT0nJyI+Ci0gICAgICAgICAgICA8RENDX1VuaXRTZWFyY2hQYXRoPi4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjOyQoRENDX1VuaXRTZWFyY2hQYXRoKTwvRENDX1VuaXRTZWFyY2hQYXRoPgotICAgICAgICAgICAgPERDQ19JbWFnZUJhc2U+MDA0MDAwMDA8L0RDQ19JbWFnZUJhc2U+Ci0gICAgICAgICAgICA8RENDX0RjdU91dHB1dD4uXGRjdVwkKENvbmZpZylcJChQbGF0Zm9ybSk8L0RDQ19EY3VPdXRwdXQ+Ci0gICAgICAgICAgICA8RENDX1VuaXRBbGlhcz5XaW5UeXBlcz1XaW5kb3dzO1dpblByb2NzPVdpbmRvd3M7RGJpVHlwZXM9QkRFO0RiaVByb2NzPUJERTskKERDQ19Vbml0QWxpYXMpPC9EQ0NfVW5pdEFsaWFzPgotICAgICAgICAgICAgPERDQ19FeGVPdXRwdXQ+Li5cYmluXCQoQ29uZmlnKVwkKFBsYXRmb3JtKTwvRENDX0V4ZU91dHB1dD4KLSAgICAgICAgICAgIDxEQ0NfRT5mYWxzZTwvRENDX0U+Ci0gICAgICAgICAgICA8RENDX04+ZmFsc2U8L0RDQ19OPgotICAgICAgICAgICAgPERDQ19TPmZhbHNlPC9EQ0NfUz4KLSAgICAgICAgICAgIDxEQ0NfRj5mYWxzZTwvRENDX0Y+Ci0gICAgICAgICAgICA8RENDX0s+ZmFsc2U8L0RDQ19LPgotICAgICAgICA8L1Byb3BlcnR5R3JvdXA+Ci0gICAgICAgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ2ZnXzEpJyE9JyciPgotICAgICAgICAgICAgPERDQ19EZWZpbmU+REVCVUc7JChEQ0NfRGVmaW5lKTwvRENDX0RlZmluZT4KLSAgICAgICAgICAgIDxEQ0NfT3B0aW1pemU+ZmFsc2U8L0RDQ19PcHRpbWl6ZT4KLSAgICAgICAgICAgIDxEQ0NfR2VuZXJhdGVTdGFja0ZyYW1lcz50cnVlPC9EQ0NfR2VuZXJhdGVTdGFja0ZyYW1lcz4KLSAgICAgICAgPC9Qcm9wZXJ0eUdyb3VwPgotICAgICAgICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENmZ18yKSchPScnIj4KLSAgICAgICAgICAgIDxEQ0NfTG9jYWxEZWJ1Z1N5bWJvbHM+ZmFsc2U8L0RDQ19Mb2NhbERlYnVnU3ltYm9scz4KLSAgICAgICAgICAgIDxEQ0NfRGVmaW5lPlJFTEVBU0U7JChEQ0NfRGVmaW5lKTwvRENDX0RlZmluZT4KLSAgICAgICAgICAgIDxEQ0NfU3ltYm9sUmVmZXJlbmNlSW5mbz4wPC9EQ0NfU3ltYm9sUmVmZXJlbmNlSW5mbz4KLSAgICAgICAgICAgIDxEQ0NfRGVidWdJbmZvcm1hdGlvbj5mYWxzZTwvRENDX0RlYnVnSW5mb3JtYXRpb24+Ci0gICAgICAgIDwvUHJvcGVydHlHcm91cD4KLSAgICAgICAgPEl0ZW1Hcm91cD4KLSAgICAgICAgICAgIDxEZWxwaGlDb21waWxlIEluY2x1ZGU9IkRlbHBoaUNsaWVudC5kcHIiPgotICAgICAgICAgICAgICAgIDxNYWluU291cmNlPk1haW5Tb3VyY2U8L01haW5Tb3VyY2U+Ci0gICAgICAgICAgICA8L0RlbHBoaUNvbXBpbGU+Ci0gICAgICAgICAgICA8RENDUmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5wYXMiLz4KLSAgICAgICAgICAgIDxEQ0NSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LkNvbGxlY3Rpb25zLnBhcyIvPgotICAgICAgICAgICAgPERDQ1JlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuQ29uc29sZS5wYXMiLz4KLSAgICAgICAgICAgIDxEQ0NSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LlV0aWxzLnBhcyIvPgotICAgICAgICAgICAgPERDQ1JlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuU3RyZWFtLnBhcyIvPgotICAgICAgICAgICAgPERDQ1JlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuUHJvdG9jb2wucGFzIi8+Ci0gICAgICAgICAgICA8RENDUmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5TZXJ2ZXIucGFzIi8+Ci0gICAgICAgICAgICA8RENDUmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5UcmFuc3BvcnQucGFzIi8+Ci0gICAgICAgICAgICA8RENDUmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXGdlbi1kZWxwaGlcU2hhcmVkLnBhcyIvPgotICAgICAgICAgICAgPERDQ1JlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlxnZW4tZGVscGhpXFR1dG9yaWFsLnBhcyIvPgotICAgICAgICAgICAgPEJ1aWxkQ29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlIj4KLSAgICAgICAgICAgICAgICA8S2V5PkNmZ18yPC9LZXk+Ci0gICAgICAgICAgICAgICAgPENmZ1BhcmVudD5CYXNlPC9DZmdQYXJlbnQ+Ci0gICAgICAgICAgICA8L0J1aWxkQ29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDxCdWlsZENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iQmFzaXMiPgotICAgICAgICAgICAgICAgIDxLZXk+QmFzZTwvS2V5PgotICAgICAgICAgICAgPC9CdWlsZENvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8QnVpbGRDb25maWd1cmF0aW9uIEluY2x1ZGU9IkRlYnVnIj4KLSAgICAgICAgICAgICAgICA8S2V5PkNmZ18xPC9LZXk+Ci0gICAgICAgICAgICAgICAgPENmZ1BhcmVudD5CYXNlPC9DZmdQYXJlbnQ+Ci0gICAgICAgICAgICA8L0J1aWxkQ29uZmlndXJhdGlvbj4KLSAgICAgICAgPC9JdGVtR3JvdXA+Ci0gICAgICAgIDxJbXBvcnQgQ29uZGl0aW9uPSJFeGlzdHMoJyQoQkRTKVxCaW5cQ29kZUdlYXIuRGVscGhpLlRhcmdldHMnKSIgUHJvamVjdD0iJChCRFMpXEJpblxDb2RlR2Vhci5EZWxwaGkuVGFyZ2V0cyIvPgotICAgICAgICA8SW1wb3J0IENvbmRpdGlvbj0iRXhpc3RzKCckKEFQUERBVEEpXEVtYmFyY2FkZXJvXCQoQkRTQVBQREFUQUJBU0VESVIpXCQoUFJPRFVDVFZFUlNJT04pXFVzZXJUb29scy5wcm9qJykiIFByb2plY3Q9IiQoQVBQREFUQSlcRW1iYXJjYWRlcm9cJChCRFNBUFBEQVRBQkFTRURJUilcJChQUk9EVUNUVkVSU0lPTilcVXNlclRvb2xzLnByb2oiLz4KLSAgICAgICAgPFByb2plY3RFeHRlbnNpb25zPgotICAgICAgICAgICAgPEJvcmxhbmQuUGVyc29uYWxpdHk+RGVscGhpLlBlcnNvbmFsaXR5LjEyPC9Cb3JsYW5kLlBlcnNvbmFsaXR5PgotICAgICAgICAgICAgPEJvcmxhbmQuUHJvamVjdFR5cGUvPgotICAgICAgICAgICAgPEJvcmxhbmRQcm9qZWN0PgotICAgICAgICAgICAgICAgIDxEZWxwaGkuUGVyc29uYWxpdHk+Ci0gICAgICAgICAgICAgICAgICAgIDxWZXJzaW9uSW5mbz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxWZXJzaW9uSW5mbyBOYW1lPSJJbmNsdWRlVmVySW5mbyI+VHJ1ZTwvVmVyc2lvbkluZm8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8VmVyc2lvbkluZm8gTmFtZT0iQXV0b0luY0J1aWxkIj5GYWxzZTwvVmVyc2lvbkluZm8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8VmVyc2lvbkluZm8gTmFtZT0iTWFqb3JWZXIiPjE8L1ZlcnNpb25JbmZvPgotICAgICAgICAgICAgICAgICAgICAgICAgPFZlcnNpb25JbmZvIE5hbWU9Ik1pbm9yVmVyIj4wPC9WZXJzaW9uSW5mbz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxWZXJzaW9uSW5mbyBOYW1lPSJSZWxlYXNlIj4wPC9WZXJzaW9uSW5mbz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxWZXJzaW9uSW5mbyBOYW1lPSJCdWlsZCI+MDwvVmVyc2lvbkluZm8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8VmVyc2lvbkluZm8gTmFtZT0iRGVidWciPkZhbHNlPC9WZXJzaW9uSW5mbz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxWZXJzaW9uSW5mbyBOYW1lPSJQcmVSZWxlYXNlIj5GYWxzZTwvVmVyc2lvbkluZm8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8VmVyc2lvbkluZm8gTmFtZT0iU3BlY2lhbCI+RmFsc2U8L1ZlcnNpb25JbmZvPgotICAgICAgICAgICAgICAgICAgICAgICAgPFZlcnNpb25JbmZvIE5hbWU9IlByaXZhdGUiPkZhbHNlPC9WZXJzaW9uSW5mbz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxWZXJzaW9uSW5mbyBOYW1lPSJETEwiPkZhbHNlPC9WZXJzaW9uSW5mbz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxWZXJzaW9uSW5mbyBOYW1lPSJMb2NhbGUiPjEwMzM8L1ZlcnNpb25JbmZvPgotICAgICAgICAgICAgICAgICAgICAgICAgPFZlcnNpb25JbmZvIE5hbWU9IkNvZGVQYWdlIj4xMjUyPC9WZXJzaW9uSW5mbz4KLSAgICAgICAgICAgICAgICAgICAgPC9WZXJzaW9uSW5mbz4KLSAgICAgICAgICAgICAgICAgICAgPFZlcnNpb25JbmZvS2V5cz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxWZXJzaW9uSW5mb0tleXMgTmFtZT0iQ29tcGFueU5hbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxWZXJzaW9uSW5mb0tleXMgTmFtZT0iRmlsZURlc2NyaXB0aW9uIj5UaHJpZnQgVHV0b3JpYWw8L1ZlcnNpb25JbmZvS2V5cz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxWZXJzaW9uSW5mb0tleXMgTmFtZT0iRmlsZVZlcnNpb24iPjEuMC4wLjA8L1ZlcnNpb25JbmZvS2V5cz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxWZXJzaW9uSW5mb0tleXMgTmFtZT0iSW50ZXJuYWxOYW1lIj5EZWxwaGlDbGllbnQ8L1ZlcnNpb25JbmZvS2V5cz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxWZXJzaW9uSW5mb0tleXMgTmFtZT0iTGVnYWxDb3B5cmlnaHQiPkNvcHlyaWdodCDCqSAyMDEyIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbjwvVmVyc2lvbkluZm9LZXlzPgotICAgICAgICAgICAgICAgICAgICAgICAgPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJMZWdhbFRyYWRlbWFya3MiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxWZXJzaW9uSW5mb0tleXMgTmFtZT0iT3JpZ2luYWxGaWxlbmFtZSI+RGVscGhpQ2xpZW50LmV4ZTwvVmVyc2lvbkluZm9LZXlzPgotICAgICAgICAgICAgICAgICAgICAgICAgPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJQcm9kdWN0TmFtZSI+VGhyaWZ0PC9WZXJzaW9uSW5mb0tleXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8VmVyc2lvbkluZm9LZXlzIE5hbWU9IlByb2R1Y3RWZXJzaW9uIj4xLjAuMC4wPC9WZXJzaW9uSW5mb0tleXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8VmVyc2lvbkluZm9LZXlzIE5hbWU9IkNvbW1lbnRzIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvVmVyc2lvbkluZm9LZXlzPgotICAgICAgICAgICAgICAgICAgICA8U291cmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNvdXJjZSBOYW1lPSJNYWluU291cmNlIj5EZWxwaGlDbGllbnQuZHByPC9Tb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgIDwvU291cmNlPgotICAgICAgICAgICAgICAgIDwvRGVscGhpLlBlcnNvbmFsaXR5PgotICAgICAgICAgICAgICAgIDxQbGF0Zm9ybXM+Ci0gICAgICAgICAgICAgICAgICAgIDxQbGF0Zm9ybSB2YWx1ZT0iV2luMzIiPlRydWU8L1BsYXRmb3JtPgotICAgICAgICAgICAgICAgIDwvUGxhdGZvcm1zPgotICAgICAgICAgICAgPC9Cb3JsYW5kUHJvamVjdD4KLSAgICAgICAgICAgIDxQcm9qZWN0RmlsZVZlcnNpb24+MTI8L1Byb2plY3RGaWxlVmVyc2lvbj4KLSAgICAgICAgPC9Qcm9qZWN0RXh0ZW5zaW9ucz4KLSAgICA8L1Byb2plY3Q+Civvu78JPFByb2plY3QgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+CisJCTxQcm9wZXJ0eUdyb3VwPgorCQkJPFByb2plY3RHdWlkPnsyQjhGQjNBMS0yRjlFLTQ4ODMtOEM1My0wRjU2MjIwQjM0RjZ9PC9Qcm9qZWN0R3VpZD4KKwkJCTxNYWluU291cmNlPkRlbHBoaUNsaWVudC5kcHI8L01haW5Tb3VyY2U+CisJCQk8UHJvamVjdFZlcnNpb24+MTIuMzwvUHJvamVjdFZlcnNpb24+CisJCQk8QmFzaXM+VHJ1ZTwvQmFzaXM+CisJCQk8Q29uZmlnIENvbmRpdGlvbj0iJyQoQ29uZmlnKSc9PScnIj5EZWJ1ZzwvQ29uZmlnPgorCQkJPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4KKwkJCTxBcHBUeXBlPkNvbnNvbGU8L0FwcFR5cGU+CisJCQk8RnJhbWV3b3JrVHlwZT5Ob25lPC9GcmFtZXdvcmtUeXBlPgorCQkJPERDQ19EQ0NDb21waWxlcj5EQ0MzMjwvRENDX0RDQ0NvbXBpbGVyPgorCQk8L1Byb3BlcnR5R3JvdXA+CisJCTxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlnKSc9PSdCYXNpcycgb3IgJyQoQmFzZSknIT0nJyI+CisJCQk8QmFzZT50cnVlPC9CYXNlPgorCQk8L1Byb3BlcnR5R3JvdXA+CisJCTxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlnKSc9PSdEZWJ1Zycgb3IgJyQoQ2ZnXzEpJyE9JyciPgorCQkJPENmZ18xPnRydWU8L0NmZ18xPgorCQkJPENmZ1BhcmVudD5CYXNlPC9DZmdQYXJlbnQ+CisJCQk8QmFzZT50cnVlPC9CYXNlPgorCQk8L1Byb3BlcnR5R3JvdXA+CisJCTxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlnKSc9PSdSZWxlYXNlJyBvciAnJChDZmdfMiknIT0nJyI+CisJCQk8Q2ZnXzI+dHJ1ZTwvQ2ZnXzI+CisJCQk8Q2ZnUGFyZW50PkJhc2U8L0NmZ1BhcmVudD4KKwkJCTxCYXNlPnRydWU8L0Jhc2U+CisJCTwvUHJvcGVydHlHcm91cD4KKwkJPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChCYXNlKSchPScnIj4KKwkJCTxEQ0NfVW5pdFNlYXJjaFBhdGg+Li5cLi5cLi5cbGliXGRlbHBoaVxzcmM7JChEQ0NfVW5pdFNlYXJjaFBhdGgpPC9EQ0NfVW5pdFNlYXJjaFBhdGg+CisJCQk8RENDX0ltYWdlQmFzZT4wMDQwMDAwMDwvRENDX0ltYWdlQmFzZT4KKwkJCTxEQ0NfRGN1T3V0cHV0Pi5cZGN1XCQoQ29uZmlnKVwkKFBsYXRmb3JtKTwvRENDX0RjdU91dHB1dD4KKwkJCTxEQ0NfVW5pdEFsaWFzPldpblR5cGVzPVdpbmRvd3M7V2luUHJvY3M9V2luZG93cztEYmlUeXBlcz1CREU7RGJpUHJvY3M9QkRFOyQoRENDX1VuaXRBbGlhcyk8L0RDQ19Vbml0QWxpYXM+CisJCQk8RENDX0V4ZU91dHB1dD4uLlxiaW5cJChDb25maWcpXCQoUGxhdGZvcm0pPC9EQ0NfRXhlT3V0cHV0PgorCQkJPERDQ19FPmZhbHNlPC9EQ0NfRT4KKwkJCTxEQ0NfTj5mYWxzZTwvRENDX04+CisJCQk8RENDX1M+ZmFsc2U8L0RDQ19TPgorCQkJPERDQ19GPmZhbHNlPC9EQ0NfRj4KKwkJCTxEQ0NfSz5mYWxzZTwvRENDX0s+CisJCTwvUHJvcGVydHlHcm91cD4KKwkJPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDZmdfMSknIT0nJyI+CisJCQk8RENDX0RlZmluZT5ERUJVRzskKERDQ19EZWZpbmUpPC9EQ0NfRGVmaW5lPgorCQkJPERDQ19PcHRpbWl6ZT5mYWxzZTwvRENDX09wdGltaXplPgorCQkJPERDQ19HZW5lcmF0ZVN0YWNrRnJhbWVzPnRydWU8L0RDQ19HZW5lcmF0ZVN0YWNrRnJhbWVzPgorCQk8L1Byb3BlcnR5R3JvdXA+CisJCTxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ2ZnXzIpJyE9JyciPgorCQkJPERDQ19Mb2NhbERlYnVnU3ltYm9scz5mYWxzZTwvRENDX0xvY2FsRGVidWdTeW1ib2xzPgorCQkJPERDQ19EZWZpbmU+UkVMRUFTRTskKERDQ19EZWZpbmUpPC9EQ0NfRGVmaW5lPgorCQkJPERDQ19TeW1ib2xSZWZlcmVuY2VJbmZvPjA8L0RDQ19TeW1ib2xSZWZlcmVuY2VJbmZvPgorCQkJPERDQ19EZWJ1Z0luZm9ybWF0aW9uPmZhbHNlPC9EQ0NfRGVidWdJbmZvcm1hdGlvbj4KKwkJPC9Qcm9wZXJ0eUdyb3VwPgorCQk8SXRlbUdyb3VwPgorCQkJPERlbHBoaUNvbXBpbGUgSW5jbHVkZT0iRGVscGhpQ2xpZW50LmRwciI+CisJCQkJPE1haW5Tb3VyY2U+TWFpblNvdXJjZTwvTWFpblNvdXJjZT4KKwkJCTwvRGVscGhpQ29tcGlsZT4KKwkJCTxEQ0NSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LnBhcyIvPgorCQkJPERDQ1JlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuQ29sbGVjdGlvbnMucGFzIi8+CisJCQk8RENDUmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5FeGNlcHRpb24ucGFzIi8+CisJCQk8RENDUmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5VdGlscy5wYXMiLz4KKwkJCTxEQ0NSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LlN0cmVhbS5wYXMiLz4KKwkJCTxEQ0NSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LlByb3RvY29sLnBhcyIvPgorCQkJPERDQ1JlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuU2VydmVyLnBhcyIvPgorCQkJPERDQ1JlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuVHJhbnNwb3J0LnBhcyIvPgorCQkJPERDQ1JlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlxnZW4tZGVscGhpXFNoYXJlZC5wYXMiLz4KKwkJCTxEQ0NSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cZ2VuLWRlbHBoaVxUdXRvcmlhbC5wYXMiLz4KKwkJCTxCdWlsZENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZSI+CisJCQkJPEtleT5DZmdfMjwvS2V5PgorCQkJCTxDZmdQYXJlbnQ+QmFzZTwvQ2ZnUGFyZW50PgorCQkJPC9CdWlsZENvbmZpZ3VyYXRpb24+CisJCQk8QnVpbGRDb25maWd1cmF0aW9uIEluY2x1ZGU9IkJhc2lzIj4KKwkJCQk8S2V5PkJhc2U8L0tleT4KKwkJCTwvQnVpbGRDb25maWd1cmF0aW9uPgorCQkJPEJ1aWxkQ29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1ZyI+CisJCQkJPEtleT5DZmdfMTwvS2V5PgorCQkJCTxDZmdQYXJlbnQ+QmFzZTwvQ2ZnUGFyZW50PgorCQkJPC9CdWlsZENvbmZpZ3VyYXRpb24+CisJCTwvSXRlbUdyb3VwPgorCQk8SW1wb3J0IENvbmRpdGlvbj0iRXhpc3RzKCckKEJEUylcQmluXENvZGVHZWFyLkRlbHBoaS5UYXJnZXRzJykiIFByb2plY3Q9IiQoQkRTKVxCaW5cQ29kZUdlYXIuRGVscGhpLlRhcmdldHMiLz4KKwkJPEltcG9ydCBDb25kaXRpb249IkV4aXN0cygnJChBUFBEQVRBKVxFbWJhcmNhZGVyb1wkKEJEU0FQUERBVEFCQVNFRElSKVwkKFBST0RVQ1RWRVJTSU9OKVxVc2VyVG9vbHMucHJvaicpIiBQcm9qZWN0PSIkKEFQUERBVEEpXEVtYmFyY2FkZXJvXCQoQkRTQVBQREFUQUJBU0VESVIpXCQoUFJPRFVDVFZFUlNJT04pXFVzZXJUb29scy5wcm9qIi8+CisJCTxQcm9qZWN0RXh0ZW5zaW9ucz4KKwkJCTxCb3JsYW5kLlBlcnNvbmFsaXR5PkRlbHBoaS5QZXJzb25hbGl0eS4xMjwvQm9ybGFuZC5QZXJzb25hbGl0eT4KKwkJCTxCb3JsYW5kLlByb2plY3RUeXBlLz4KKwkJCTxCb3JsYW5kUHJvamVjdD4KKwkJCQk8RGVscGhpLlBlcnNvbmFsaXR5PgorCQkJCQk8VmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iSW5jbHVkZVZlckluZm8iPlRydWU8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IkF1dG9JbmNCdWlsZCI+RmFsc2U8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9Ik1ham9yVmVyIj4wPC9WZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJNaW5vclZlciI+MTI8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IlJlbGVhc2UiPjA8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IkJ1aWxkIj4wPC9WZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJEZWJ1ZyI+RmFsc2U8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IlByZVJlbGVhc2UiPkZhbHNlPC9WZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJTcGVjaWFsIj5GYWxzZTwvVmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iUHJpdmF0ZSI+RmFsc2U8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IkRMTCI+RmFsc2U8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IkxvY2FsZSI+MTAzMzwvVmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iQ29kZVBhZ2UiPjEyNTI8L1ZlcnNpb25JbmZvPgorCQkJCQk8L1ZlcnNpb25JbmZvPgorCQkJCQk8VmVyc2lvbkluZm9LZXlzPgorCQkJCQkJPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJDb21wYW55TmFtZSIvPgorCQkJCQkJPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJGaWxlRGVzY3JpcHRpb24iPlRocmlmdCBUdXRvcmlhbDwvVmVyc2lvbkluZm9LZXlzPgorCQkJCQkJPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJGaWxlVmVyc2lvbiI+MS4wLjAuMDwvVmVyc2lvbkluZm9LZXlzPgorCQkJCQkJPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJJbnRlcm5hbE5hbWUiPkRlbHBoaUNsaWVudDwvVmVyc2lvbkluZm9LZXlzPgorCQkJCQkJPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJMZWdhbENvcHlyaWdodCI+Q29weXJpZ2h0IMKpIDIwMTIgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uPC9WZXJzaW9uSW5mb0tleXM+CisJCQkJCQk8VmVyc2lvbkluZm9LZXlzIE5hbWU9IkxlZ2FsVHJhZGVtYXJrcyIvPgorCQkJCQkJPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJPcmlnaW5hbEZpbGVuYW1lIj5EZWxwaGlDbGllbnQuZXhlPC9WZXJzaW9uSW5mb0tleXM+CisJCQkJCQk8VmVyc2lvbkluZm9LZXlzIE5hbWU9IlByb2R1Y3ROYW1lIj5UaHJpZnQ8L1ZlcnNpb25JbmZvS2V5cz4KKwkJCQkJCTxWZXJzaW9uSW5mb0tleXMgTmFtZT0iUHJvZHVjdFZlcnNpb24iPjEuMC4wLjA8L1ZlcnNpb25JbmZvS2V5cz4KKwkJCQkJCTxWZXJzaW9uSW5mb0tleXMgTmFtZT0iQ29tbWVudHMiLz4KKwkJCQkJPC9WZXJzaW9uSW5mb0tleXM+CisJCQkJCTxTb3VyY2U+CisJCQkJCQk8U291cmNlIE5hbWU9Ik1haW5Tb3VyY2UiPkRlbHBoaUNsaWVudC5kcHI8L1NvdXJjZT4KKwkJCQkJPC9Tb3VyY2U+CisJCQkJPC9EZWxwaGkuUGVyc29uYWxpdHk+CisJCQkJPFBsYXRmb3Jtcz4KKwkJCQkJPFBsYXRmb3JtIHZhbHVlPSJXaW4zMiI+VHJ1ZTwvUGxhdGZvcm0+CisJCQkJPC9QbGF0Zm9ybXM+CisJCQk8L0JvcmxhbmRQcm9qZWN0PgorCQkJPFByb2plY3RGaWxlVmVyc2lvbj4xMjwvUHJvamVjdEZpbGVWZXJzaW9uPgorCQk8L1Byb2plY3RFeHRlbnNpb25zPgorCTwvUHJvamVjdD4KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2RlbHBoaS9EZWxwaGlTZXJ2ZXIvRGVscGhpU2VydmVyLmRwciBiL3R1dG9yaWFsL2RlbHBoaS9EZWxwaGlTZXJ2ZXIvRGVscGhpU2VydmVyLmRwcgppbmRleCA5ZDU0YTJlLi41ZjQyZTdlIDEwMDY0NAotLS0gYS90dXRvcmlhbC9kZWxwaGkvRGVscGhpU2VydmVyL0RlbHBoaVNlcnZlci5kcHIKKysrIGIvdHV0b3JpYWwvZGVscGhpL0RlbHBoaVNlcnZlci9EZWxwaGlTZXJ2ZXIuZHByCkBAIC0yOCw3ICsyOCw3IEBACiAgIEdlbmVyaWNzLkNvbGxlY3Rpb25zLAogICBUaHJpZnQgaW4gJy4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5wYXMnLAogICBUaHJpZnQuQ29sbGVjdGlvbnMgaW4gJy4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5Db2xsZWN0aW9ucy5wYXMnLAotICBUaHJpZnQuQ29uc29sZSBpbiAnLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LkNvbnNvbGUucGFzJywKKyAgVGhyaWZ0LkV4Y2VwdGlvbiBpbiAnLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LkV4Y2VwdGlvbi5wYXMnLAogICBUaHJpZnQuVXRpbHMgaW4gJy4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5VdGlscy5wYXMnLAogICBUaHJpZnQuU3RyZWFtIGluICcuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuU3RyZWFtLnBhcycsCiAgIFRocmlmdC5Qcm90b2NvbCBpbiAnLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LlByb3RvY29sLnBhcycsCkBAIC04NiwxMyArODYsMTMgQEAKIAogcHJvY2VkdXJlIFRDYWxjdWxhdG9ySGFuZGxlci5waW5nOwogYmVnaW4KLSAgQ29uc29sZS5Xcml0ZUxpbmUoICdwaW5nKCknKTsKKyAgV3JpdGVMbiggJ3BpbmcoKScpOwogZW5kOwogCiAKIGZ1bmN0aW9uIFRDYWxjdWxhdG9ySGFuZGxlci5hZGQobnVtMTogSW50ZWdlcjsgbnVtMjogSW50ZWdlcik6IEludGVnZXI7CiBiZWdpbgotICBDb25zb2xlLldyaXRlTGluZSggRm9ybWF0KCAnYWRkKCAlZCwgJWQpJywgW251bTEsIG51bTJdKSk7CisgIFdyaXRlTG4oIEZvcm1hdCggJ2FkZCggJWQsICVkKScsIFtudW0xLCBudW0yXSkpOwogICByZXN1bHQgOj0gbnVtMSArIG51bTI7CiBlbmQ7CiAKQEAgLTEwMSw3ICsxMDEsNyBAQAogdmFyIGVudHJ5IDogSVNoYXJlZFN0cnVjdDsKIGJlZ2luCiAgIHRyeQotICAgIENvbnNvbGUuV3JpdGVMaW5lKCBGb3JtYXQoJ2NhbGN1bGF0ZSggJWQsIFslZCwlZCwlZF0pJywgW2xvZ2lkLCBPcmQody5PcCksIHcuTnVtMSwgdy5OdW0yXSkpOworICAgIFdyaXRlTG4oIEZvcm1hdCgnY2FsY3VsYXRlKCAlZCwgWyVkLCVkLCVkXSknLCBbbG9naWQsIE9yZCh3Lk9wKSwgdy5OdW0xLCB3Lk51bTJdKSk7CiAKICAgICBjYXNlIHcuT3Agb2YKICAgICAgIFRPcGVyYXRpb24uQUREICAgICAgOiAgcmVzdWx0IDo9IHcuTnVtMSArIHcuTnVtMjsKQEAgLTEyNiwxNCArMTI2LDE0IEBACiAKIGZ1bmN0aW9uIFRDYWxjdWxhdG9ySGFuZGxlci5nZXRTdHJ1Y3Qoa2V5OiBJbnRlZ2VyKTogSVNoYXJlZFN0cnVjdDsKIGJlZ2luCi0gIENvbnNvbGUuV3JpdGVMaW5lKCBGb3JtYXQoICdnZXRTdHJ1Y3QoJWQpJywgW2tleV0pKTsKKyAgV3JpdGVMbiggRm9ybWF0KCAnZ2V0U3RydWN0KCVkKScsIFtrZXldKSk7CiAgIHJlc3VsdCA6PSBGTG9nW2tleV07CiBlbmQ7CiAKIAogcHJvY2VkdXJlIFRDYWxjdWxhdG9ySGFuZGxlci56aXA7CiBiZWdpbgotICBDb25zb2xlLldyaXRlTGluZSggJ3ppcCgpJyk7CisgIFdyaXRlTG4oICd6aXAoKScpOwogZW5kOwogCiAKQEAgLTE1MiwxNCArMTUyLDE0IEBACiAgICAgdHJhbnNwb3J0IDo9IFRTZXJ2ZXJTb2NrZXRJbXBsLkNyZWF0ZSggOTA5MCk7CiAgICAgc2VydmVyICAgIDo9IFRTaW1wbGVTZXJ2ZXIuQ3JlYXRlKCBwcm9jZXNzb3IsIHRyYW5zcG9ydCk7CiAKLSAgICBDb25zb2xlLldyaXRlTGluZSggJ1N0YXJ0aW5nIHRoZSBzZXJ2ZXIuLi4nKTsKKyAgICBXcml0ZUxuKCAnU3RhcnRpbmcgdGhlIHNlcnZlci4uLicpOwogICAgIHNlcnZlci5TZXJ2ZSgpOwogCiAgIGV4Y2VwdAotICAgIG9uIGU6IEV4Y2VwdGlvbiBkbyBDb25zb2xlLldyaXRlTGluZSggZS5NZXNzYWdlKTsKKyAgICBvbiBlOiBFeGNlcHRpb24gZG8gV3JpdGVMbiggZS5NZXNzYWdlKTsKICAgZW5kOwogCi0gIENvbnNvbGUuV3JpdGVMaW5lKCdkb25lLicpOworICBXcml0ZUxuKCdkb25lLicpOwogZW5kOwogCiAKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2RlbHBoaS9EZWxwaGlTZXJ2ZXIvRGVscGhpU2VydmVyLmRwcm9qIGIvdHV0b3JpYWwvZGVscGhpL0RlbHBoaVNlcnZlci9EZWxwaGlTZXJ2ZXIuZHByb2oKaW5kZXggNzQ4MTFiYy4uZTM0YTZhMSAxMDA2NDQKLS0tIGEvdHV0b3JpYWwvZGVscGhpL0RlbHBoaVNlcnZlci9EZWxwaGlTZXJ2ZXIuZHByb2oKKysrIGIvdHV0b3JpYWwvZGVscGhpL0RlbHBoaVNlcnZlci9EZWxwaGlTZXJ2ZXIuZHByb2oKQEAgLTEsMTE4ICsxLDExOCBAQAot77u/ICAgIDxQcm9qZWN0IHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgotICAgICAgICA8UHJvcGVydHlHcm91cD4KLSAgICAgICAgICAgIDxQcm9qZWN0R3VpZD57MkI4RkIzQTEtMkY5RS00ODgzLThDNTMtMEY1NjIyMEIzNEY2fTwvUHJvamVjdEd1aWQ+Ci0gICAgICAgICAgICA8TWFpblNvdXJjZT5EZWxwaGlTZXJ2ZXIuZHByPC9NYWluU291cmNlPgotICAgICAgICAgICAgPFByb2plY3RWZXJzaW9uPjEyLjM8L1Byb2plY3RWZXJzaW9uPgotICAgICAgICAgICAgPEJhc2lzPlRydWU8L0Jhc2lzPgotICAgICAgICAgICAgPENvbmZpZyBDb25kaXRpb249IickKENvbmZpZyknPT0nJyI+RGVidWc8L0NvbmZpZz4KLSAgICAgICAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+Ci0gICAgICAgICAgICA8QXBwVHlwZT5Db25zb2xlPC9BcHBUeXBlPgotICAgICAgICAgICAgPEZyYW1ld29ya1R5cGU+Tm9uZTwvRnJhbWV3b3JrVHlwZT4KLSAgICAgICAgICAgIDxEQ0NfRENDQ29tcGlsZXI+RENDMzI8L0RDQ19EQ0NDb21waWxlcj4KLSAgICAgICAgPC9Qcm9wZXJ0eUdyb3VwPgotICAgICAgICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZyknPT0nQmFzaXMnIG9yICckKEJhc2UpJyE9JyciPgotICAgICAgICAgICAgPEJhc2U+dHJ1ZTwvQmFzZT4KLSAgICAgICAgPC9Qcm9wZXJ0eUdyb3VwPgotICAgICAgICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZyknPT0nRGVidWcnIG9yICckKENmZ18xKSchPScnIj4KLSAgICAgICAgICAgIDxDZmdfMT50cnVlPC9DZmdfMT4KLSAgICAgICAgICAgIDxDZmdQYXJlbnQ+QmFzZTwvQ2ZnUGFyZW50PgotICAgICAgICAgICAgPEJhc2U+dHJ1ZTwvQmFzZT4KLSAgICAgICAgPC9Qcm9wZXJ0eUdyb3VwPgotICAgICAgICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZyknPT0nUmVsZWFzZScgb3IgJyQoQ2ZnXzIpJyE9JyciPgotICAgICAgICAgICAgPENmZ18yPnRydWU8L0NmZ18yPgotICAgICAgICAgICAgPENmZ1BhcmVudD5CYXNlPC9DZmdQYXJlbnQ+Ci0gICAgICAgICAgICA8QmFzZT50cnVlPC9CYXNlPgotICAgICAgICA8L1Byb3BlcnR5R3JvdXA+Ci0gICAgICAgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQmFzZSknIT0nJyI+Ci0gICAgICAgICAgICA8RENDX0ltYWdlQmFzZT4wMDQwMDAwMDwvRENDX0ltYWdlQmFzZT4KLSAgICAgICAgICAgIDxEQ0NfRGN1T3V0cHV0Pi5cZGN1XCQoQ29uZmlnKVwkKFBsYXRmb3JtKTwvRENDX0RjdU91dHB1dD4KLSAgICAgICAgICAgIDxEQ0NfVW5pdEFsaWFzPldpblR5cGVzPVdpbmRvd3M7V2luUHJvY3M9V2luZG93cztEYmlUeXBlcz1CREU7RGJpUHJvY3M9QkRFOyQoRENDX1VuaXRBbGlhcyk8L0RDQ19Vbml0QWxpYXM+Ci0gICAgICAgICAgICA8RENDX0V4ZU91dHB1dD4uLlxiaW5cJChDb25maWcpXCQoUGxhdGZvcm0pPC9EQ0NfRXhlT3V0cHV0PgotICAgICAgICAgICAgPERDQ19FPmZhbHNlPC9EQ0NfRT4KLSAgICAgICAgICAgIDxEQ0NfTj5mYWxzZTwvRENDX04+Ci0gICAgICAgICAgICA8RENDX1M+ZmFsc2U8L0RDQ19TPgotICAgICAgICAgICAgPERDQ19GPmZhbHNlPC9EQ0NfRj4KLSAgICAgICAgICAgIDxEQ0NfSz5mYWxzZTwvRENDX0s+Ci0gICAgICAgIDwvUHJvcGVydHlHcm91cD4KLSAgICAgICAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDZmdfMSknIT0nJyI+Ci0gICAgICAgICAgICA8RENDX0RlZmluZT5ERUJVRzskKERDQ19EZWZpbmUpPC9EQ0NfRGVmaW5lPgotICAgICAgICAgICAgPERDQ19PcHRpbWl6ZT5mYWxzZTwvRENDX09wdGltaXplPgotICAgICAgICAgICAgPERDQ19HZW5lcmF0ZVN0YWNrRnJhbWVzPnRydWU8L0RDQ19HZW5lcmF0ZVN0YWNrRnJhbWVzPgotICAgICAgICA8L1Byb3BlcnR5R3JvdXA+Ci0gICAgICAgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ2ZnXzIpJyE9JyciPgotICAgICAgICAgICAgPERDQ19Mb2NhbERlYnVnU3ltYm9scz5mYWxzZTwvRENDX0xvY2FsRGVidWdTeW1ib2xzPgotICAgICAgICAgICAgPERDQ19EZWZpbmU+UkVMRUFTRTskKERDQ19EZWZpbmUpPC9EQ0NfRGVmaW5lPgotICAgICAgICAgICAgPERDQ19TeW1ib2xSZWZlcmVuY2VJbmZvPjA8L0RDQ19TeW1ib2xSZWZlcmVuY2VJbmZvPgotICAgICAgICAgICAgPERDQ19EZWJ1Z0luZm9ybWF0aW9uPmZhbHNlPC9EQ0NfRGVidWdJbmZvcm1hdGlvbj4KLSAgICAgICAgPC9Qcm9wZXJ0eUdyb3VwPgotICAgICAgICA8SXRlbUdyb3VwPgotICAgICAgICAgICAgPERlbHBoaUNvbXBpbGUgSW5jbHVkZT0iRGVscGhpU2VydmVyLmRwciI+Ci0gICAgICAgICAgICAgICAgPE1haW5Tb3VyY2U+TWFpblNvdXJjZTwvTWFpblNvdXJjZT4KLSAgICAgICAgICAgIDwvRGVscGhpQ29tcGlsZT4KLSAgICAgICAgICAgIDxEQ0NSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LnBhcyIvPgotICAgICAgICAgICAgPERDQ1JlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuQ29sbGVjdGlvbnMucGFzIi8+Ci0gICAgICAgICAgICA8RENDUmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5Db25zb2xlLnBhcyIvPgotICAgICAgICAgICAgPERDQ1JlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuVXRpbHMucGFzIi8+Ci0gICAgICAgICAgICA8RENDUmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5TdHJlYW0ucGFzIi8+Ci0gICAgICAgICAgICA8RENDUmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5Qcm90b2NvbC5wYXMiLz4KLSAgICAgICAgICAgIDxEQ0NSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LlNlcnZlci5wYXMiLz4KLSAgICAgICAgICAgIDxEQ0NSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LlRyYW5zcG9ydC5wYXMiLz4KLSAgICAgICAgICAgIDxEQ0NSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cZ2VuLWRlbHBoaVxTaGFyZWQucGFzIi8+Ci0gICAgICAgICAgICA8RENDUmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXGdlbi1kZWxwaGlcVHV0b3JpYWwucGFzIi8+Ci0gICAgICAgICAgICA8QnVpbGRDb25maWd1cmF0aW9uIEluY2x1ZGU9IlJlbGVhc2UiPgotICAgICAgICAgICAgICAgIDxLZXk+Q2ZnXzI8L0tleT4KLSAgICAgICAgICAgICAgICA8Q2ZnUGFyZW50PkJhc2U8L0NmZ1BhcmVudD4KLSAgICAgICAgICAgIDwvQnVpbGRDb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPEJ1aWxkQ29uZmlndXJhdGlvbiBJbmNsdWRlPSJCYXNpcyI+Ci0gICAgICAgICAgICAgICAgPEtleT5CYXNlPC9LZXk+Ci0gICAgICAgICAgICA8L0J1aWxkQ29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDxCdWlsZENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iRGVidWciPgotICAgICAgICAgICAgICAgIDxLZXk+Q2ZnXzE8L0tleT4KLSAgICAgICAgICAgICAgICA8Q2ZnUGFyZW50PkJhc2U8L0NmZ1BhcmVudD4KLSAgICAgICAgICAgIDwvQnVpbGRDb25maWd1cmF0aW9uPgotICAgICAgICA8L0l0ZW1Hcm91cD4KLSAgICAgICAgPEltcG9ydCBDb25kaXRpb249IkV4aXN0cygnJChCRFMpXEJpblxDb2RlR2Vhci5EZWxwaGkuVGFyZ2V0cycpIiBQcm9qZWN0PSIkKEJEUylcQmluXENvZGVHZWFyLkRlbHBoaS5UYXJnZXRzIi8+Ci0gICAgICAgIDxJbXBvcnQgQ29uZGl0aW9uPSJFeGlzdHMoJyQoQVBQREFUQSlcRW1iYXJjYWRlcm9cJChCRFNBUFBEQVRBQkFTRURJUilcJChQUk9EVUNUVkVSU0lPTilcVXNlclRvb2xzLnByb2onKSIgUHJvamVjdD0iJChBUFBEQVRBKVxFbWJhcmNhZGVyb1wkKEJEU0FQUERBVEFCQVNFRElSKVwkKFBST0RVQ1RWRVJTSU9OKVxVc2VyVG9vbHMucHJvaiIvPgotICAgICAgICA8UHJvamVjdEV4dGVuc2lvbnM+Ci0gICAgICAgICAgICA8Qm9ybGFuZC5QZXJzb25hbGl0eT5EZWxwaGkuUGVyc29uYWxpdHkuMTI8L0JvcmxhbmQuUGVyc29uYWxpdHk+Ci0gICAgICAgICAgICA8Qm9ybGFuZC5Qcm9qZWN0VHlwZS8+Ci0gICAgICAgICAgICA8Qm9ybGFuZFByb2plY3Q+Ci0gICAgICAgICAgICAgICAgPERlbHBoaS5QZXJzb25hbGl0eT4KLSAgICAgICAgICAgICAgICAgICAgPFZlcnNpb25JbmZvPgotICAgICAgICAgICAgICAgICAgICAgICAgPFZlcnNpb25JbmZvIE5hbWU9IkluY2x1ZGVWZXJJbmZvIj5UcnVlPC9WZXJzaW9uSW5mbz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxWZXJzaW9uSW5mbyBOYW1lPSJBdXRvSW5jQnVpbGQiPkZhbHNlPC9WZXJzaW9uSW5mbz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxWZXJzaW9uSW5mbyBOYW1lPSJNYWpvclZlciI+MTwvVmVyc2lvbkluZm8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8VmVyc2lvbkluZm8gTmFtZT0iTWlub3JWZXIiPjA8L1ZlcnNpb25JbmZvPgotICAgICAgICAgICAgICAgICAgICAgICAgPFZlcnNpb25JbmZvIE5hbWU9IlJlbGVhc2UiPjA8L1ZlcnNpb25JbmZvPgotICAgICAgICAgICAgICAgICAgICAgICAgPFZlcnNpb25JbmZvIE5hbWU9IkJ1aWxkIj4wPC9WZXJzaW9uSW5mbz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxWZXJzaW9uSW5mbyBOYW1lPSJEZWJ1ZyI+RmFsc2U8L1ZlcnNpb25JbmZvPgotICAgICAgICAgICAgICAgICAgICAgICAgPFZlcnNpb25JbmZvIE5hbWU9IlByZVJlbGVhc2UiPkZhbHNlPC9WZXJzaW9uSW5mbz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxWZXJzaW9uSW5mbyBOYW1lPSJTcGVjaWFsIj5GYWxzZTwvVmVyc2lvbkluZm8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8VmVyc2lvbkluZm8gTmFtZT0iUHJpdmF0ZSI+RmFsc2U8L1ZlcnNpb25JbmZvPgotICAgICAgICAgICAgICAgICAgICAgICAgPFZlcnNpb25JbmZvIE5hbWU9IkRMTCI+RmFsc2U8L1ZlcnNpb25JbmZvPgotICAgICAgICAgICAgICAgICAgICAgICAgPFZlcnNpb25JbmZvIE5hbWU9IkxvY2FsZSI+MTAzMzwvVmVyc2lvbkluZm8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8VmVyc2lvbkluZm8gTmFtZT0iQ29kZVBhZ2UiPjEyNTI8L1ZlcnNpb25JbmZvPgotICAgICAgICAgICAgICAgICAgICA8L1ZlcnNpb25JbmZvPgotICAgICAgICAgICAgICAgICAgICA8VmVyc2lvbkluZm9LZXlzPgotICAgICAgICAgICAgICAgICAgICAgICAgPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJDb21wYW55TmFtZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJGaWxlRGVzY3JpcHRpb24iPlRocmlmdCBUdXRvcmlhbDwvVmVyc2lvbkluZm9LZXlzPgotICAgICAgICAgICAgICAgICAgICAgICAgPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJGaWxlVmVyc2lvbiI+MS4wLjAuMDwvVmVyc2lvbkluZm9LZXlzPgotICAgICAgICAgICAgICAgICAgICAgICAgPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJJbnRlcm5hbE5hbWUiPkRlbHBoaVNlcnZlcjwvVmVyc2lvbkluZm9LZXlzPgotICAgICAgICAgICAgICAgICAgICAgICAgPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJMZWdhbENvcHlyaWdodCI+Q29weXJpZ2h0IMKpIDIwMTIgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uPC9WZXJzaW9uSW5mb0tleXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8VmVyc2lvbkluZm9LZXlzIE5hbWU9IkxlZ2FsVHJhZGVtYXJrcyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJPcmlnaW5hbEZpbGVuYW1lIj5EZWxwaGlTZXJ2ZXIuZXhlPC9WZXJzaW9uSW5mb0tleXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8VmVyc2lvbkluZm9LZXlzIE5hbWU9IlByb2R1Y3ROYW1lIj5UaHJpZnQ8L1ZlcnNpb25JbmZvS2V5cz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxWZXJzaW9uSW5mb0tleXMgTmFtZT0iUHJvZHVjdFZlcnNpb24iPjEuMC4wLjA8L1ZlcnNpb25JbmZvS2V5cz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxWZXJzaW9uSW5mb0tleXMgTmFtZT0iQ29tbWVudHMiLz4KLSAgICAgICAgICAgICAgICAgICAgPC9WZXJzaW9uSW5mb0tleXM+Ci0gICAgICAgICAgICAgICAgICAgIDxTb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U291cmNlIE5hbWU9Ik1haW5Tb3VyY2UiPkRlbHBoaVNlcnZlci5kcHI8L1NvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgPC9Tb3VyY2U+Ci0gICAgICAgICAgICAgICAgPC9EZWxwaGkuUGVyc29uYWxpdHk+Ci0gICAgICAgICAgICAgICAgPFBsYXRmb3Jtcz4KLSAgICAgICAgICAgICAgICAgICAgPFBsYXRmb3JtIHZhbHVlPSJXaW4zMiI+VHJ1ZTwvUGxhdGZvcm0+Ci0gICAgICAgICAgICAgICAgPC9QbGF0Zm9ybXM+Ci0gICAgICAgICAgICA8L0JvcmxhbmRQcm9qZWN0PgotICAgICAgICAgICAgPFByb2plY3RGaWxlVmVyc2lvbj4xMjwvUHJvamVjdEZpbGVWZXJzaW9uPgotICAgICAgICA8L1Byb2plY3RFeHRlbnNpb25zPgotICAgIDwvUHJvamVjdD4KK++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+CmRpZmYgLS1naXQgYS90dXRvcmlhbC9lcmwvY2xpZW50LmVybCBiL3R1dG9yaWFsL2VybC9jbGllbnQuZXJsCmluZGV4IDVkNDA5MTYuLjAzNzQyMjAgMTAwNjQ0Ci0tLSBhL3R1dG9yaWFsL2VybC9jbGllbnQuZXJsCisrKyBiL3R1dG9yaWFsL2VybC9jbGllbnQuZXJsCkBAIC0yOCw3ICsyOCw3IEBACiAgICAgb2suCiAKIHQoKSAtPgotICAgIFBvcnQgPSA5OTk5LAorICAgIFBvcnQgPSA5MDkwLAogCiAgICAge29rLCBDbGllbnQwfSA9IHRocmlmdF9jbGllbnRfdXRpbDpuZXcoIjEyNy4wLjAuMSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9ydCwKQEAgLTQ0LDcgKzQ0LDcgQEAKICAgICB7Q2xpZW50Mywge29rLCBTdW0xfX0gPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MiwgYWRkLCBbMSwgNF0pLAogICAgIGlvOmZvcm1hdCgiMSs0PX5wfm4iLCBbU3VtMV0pLAogCi0gICAgV29yayA9ICN3b3Jre29wPT90dXRvcmlhbF9PcGVyYXRpb25fU1VCVFJBQ1QsCisgICAgV29yayA9ICMnV29yayd7b3A9P1RVVE9SSUFMX09QRVJBVElPTl9TVUJUUkFDVCwKICAgICAgICAgICAgICAgICAgbnVtMT0xNSwKICAgICAgICAgICAgICAgICAgbnVtMj0xMH0sCiAgICAge0NsaWVudDQsIHtvaywgRGlmZn19ID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDMsIGNhbGN1bGF0ZSwgWzEsIFdvcmtdKSwKQEAgLTU1LDcgKzU1LDcgQEAKIAogICAgIENsaWVudDYgPQogICAgICAgICB0cnkKLSAgICAgICAgICAgIFdvcmsxID0gI3dvcmt7b3A9P3R1dG9yaWFsX09wZXJhdGlvbl9ESVZJREUsCisgICAgICAgICAgICBXb3JrMSA9ICMnV29yayd7b3A9P1RVVE9SSUFMX09QRVJBVElPTl9ESVZJREUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bTE9MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtMj0wfSwKICAgICAgICAgICAgIHtDbGllbnRTMSwge29rLCBfUXVvdH19ID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDUsIGNhbGN1bGF0ZSwgWzIsIFdvcmsxXSksCmRpZmYgLS1naXQgYS90dXRvcmlhbC9lcmwvY2xpZW50LnNoIGIvdHV0b3JpYWwvZXJsL2NsaWVudC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggYTQxN2UwZC4uMDAwMDAwMAotLS0gYS90dXRvcmlhbC9lcmwvY2xpZW50LnNoCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotc2VydmVyLnNoClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZXJsL2NsaWVudC5zaCBiL3R1dG9yaWFsL2VybC9jbGllbnQuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzc1YWZiNgotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2VybC9jbGllbnQuc2gKQEAgLTAsMCArMSwzNyBAQAorIyEvYmluL3NoCisKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitFUkxfVEhSSUZUPS4uLy4uL2xpYi9lcmwKKworaWYgISBbIC1kICR7RVJMX1RIUklGVH0vZWJpbiBdOyB0aGVuCisgICAgZWNobyAiUGxlYXNlIGJ1aWxkIHRoZSBUaHJpZnQgbGlicmFyeSBieSBydW5uaW5nIFxgbWFrZScgaW4gJHtFUkxfVEhSSUZUfSIKKyAgICBleGl0IDEKK2ZpCisKK2lmICEgWyAtZCBnZW4tZXJsIF07IHRoZW4KKyAgLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtciAtLWdlbiBlcmwgLi4vdHV0b3JpYWwudGhyaWZ0CitmaQorCisKK2VybGMgLUkgJHtFUkxfVEhSSUZUfS9pbmNsdWRlIC1JICR7RVJMX1RIUklGVH0vZWJpbiBcCisgICAgIC1JIGdlbi1lcmwgLW8gZ2VuLWVybCBnZW4tZXJsLyouZXJsICYmCisgIGVybGMgLUkgJHtFUkxfVEhSSUZUfS9pbmNsdWRlIC1JIGdlbi1lcmwgKi5lcmwgJiYKKyAgZXJsICtLIHRydWUgLXBhICR7RVJMX1RIUklGVH0vZWJpbiAtcGEgZ2VuLWVybApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZXJsL2pzb25fY2xpZW50LmVybCBiL3R1dG9yaWFsL2VybC9qc29uX2NsaWVudC5lcmwKaW5kZXggNTI0ZTlhZS4uMGIzOWNlZCAxMDA2NDQKLS0tIGEvdHV0b3JpYWwvZXJsL2pzb25fY2xpZW50LmVybAorKysgYi90dXRvcmlhbC9lcmwvanNvbl9jbGllbnQuZXJsCkBAIC0yNyw4ICsyNyw4IEBACiAKIC1leHBvcnQoW3QvMF0pLgogCi0lJSBDbGllbnQgY29uc3RydWN0b3IgZm9yIHRoZSBjb21tb24tY2FzZSBvZiBzb2NrZXQgdHJhbnNwb3J0cwotJSUgd2l0aCB0aGUgYmluYXJ5IHByb3RvY29sCislJSBDbGllbnQgY29uc3RydWN0b3IgZm9yIHRoZSBodHRwIHRyYW5zcG9ydHMKKyUlIHdpdGggdGhlIGpzb24gcHJvdG9jb2wKIG5ld19jbGllbnQoSG9zdCwgUGF0aCwgU2VydmljZSwgX09wdGlvbnMpIC0+CiAgICAge1Byb3RvT3B0cywgVHJhbnNPcHRzfSA9IHtbXSxbXX0sCiAgICAgVHJhbnNwb3J0RmFjdG9yeSA9IGZ1bigpIC0+IHRocmlmdF9odHRwX3RyYW5zcG9ydDpuZXcoSG9zdCwgUGF0aCwgVHJhbnNPcHRzKSBlbmQsCkBAIC01NSw3ICs1NSw3IEBACiAgICAge0NsaWVudDMsIHtvaywgU3VtMX19ID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDIsIGFkZCwgWzEsIDRdKSwKICAgICBpbzpmb3JtYXQoIjErND1+cH5uIiwgW1N1bTFdKSwKIAotICAgIFdvcmsgPSAjd29ya3tvcD0/dHV0b3JpYWxfT3BlcmF0aW9uX1NVQlRSQUNULAorICAgIFdvcmsgPSAjJ1dvcmsne29wPT9UVVRPUklBTF9PUEVSQVRJT05fU1VCVFJBQ1QsCiAgICAgICAgICAgICAgICAgIG51bTE9MTUsCiAgICAgICAgICAgICAgICAgIG51bTI9MTB9LAogICAgIHtDbGllbnQ0LCB7b2ssIERpZmZ9fSA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQzLCBjYWxjdWxhdGUsIFsxLCBXb3JrXSksCkBAIC02Niw3ICs2Niw3IEBACiAKICAgICBDbGllbnQ2ID0KICAgICAgICAgdHJ5Ci0gICAgICAgICAgICBXb3JrMSA9ICN3b3Jre29wPT90dXRvcmlhbF9PcGVyYXRpb25fRElWSURFLAorICAgICAgICAgICAgV29yazEgPSAjJ1dvcmsne29wPT9UVVRPUklBTF9PUEVSQVRJT05fRElWSURFLAogICAgICAgICAgICAgICAgICAgICAgICAgICBudW0xPTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bTI9MH0sCiAgICAgICAgICAgICB7Q2xpZW50UzEsIHtvaywgX1F1b3R9fSA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQ1LCBjYWxjdWxhdGUsIFsyLCBXb3JrMV0pLApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZXJsL3NlcnZlci5lcmwgYi90dXRvcmlhbC9lcmwvc2VydmVyLmVybAppbmRleCA0OTE1NjA2Li42NDdjYzI0IDEwMDY0NAotLS0gYS90dXRvcmlhbC9lcmwvc2VydmVyLmVybAorKysgYi90dXRvcmlhbC9lcmwvc2VydmVyLmVybApAQCAtMzYsMjUgKzM2LDI1IEBACiAgICAgTjErTjIuCiAKIGNhbGN1bGF0ZShMb2dpZCwgV29yaykgLT4KLSAgICB7IE9wLCBOdW0xLCBOdW0yIH0gPSB7IFdvcmsjd29yay5vcCwgV29yayN3b3JrLm51bTEsIFdvcmsjd29yay5udW0yIH0sCisgICAgeyBPcCwgTnVtMSwgTnVtMiB9ID0geyBXb3JrIydXb3JrJy5vcCwgV29yayMnV29yaycubnVtMSwgV29yayMnV29yaycubnVtMiB9LAogICAgIGRlYnVnKCJjYWxjdWxhdGUofnAsIHt+cCx+cCx+cH0pIiwgW0xvZ2lkLCBPcCwgTnVtMSwgTnVtMl0pLAogICAgIGNhc2UgT3Agb2YKLSAgICAgICAgP3R1dG9yaWFsX09wZXJhdGlvbl9BREQgICAgICAtPiBOdW0xICsgTnVtMjsKLSAgICAgICAgP3R1dG9yaWFsX09wZXJhdGlvbl9TVUJUUkFDVCAtPiBOdW0xIC0gTnVtMjsKLSAgICAgICAgP3R1dG9yaWFsX09wZXJhdGlvbl9NVUxUSVBMWSAtPiBOdW0xICogTnVtMjsKKyAgICAgICAgP1RVVE9SSUFMX09QRVJBVElPTl9BREQgICAgICAtPiBOdW0xICsgTnVtMjsKKyAgICAgICAgP1RVVE9SSUFMX09QRVJBVElPTl9TVUJUUkFDVCAtPiBOdW0xIC0gTnVtMjsKKyAgICAgICAgP1RVVE9SSUFMX09QRVJBVElPTl9NVUxUSVBMWSAtPiBOdW0xICogTnVtMjsKIAotICAgICAgICA/dHV0b3JpYWxfT3BlcmF0aW9uX0RJVklERSB3aGVuIE51bTIgPT0gMCAtPgotICAgICAgICAgIHRocm93KCNpbnZhbGlkT3BlcmF0aW9ue3doYXQ9T3AsIHdoeT0iQ2Fubm90IGRpdmlkZSBieSAwIn0pOwotICAgICAgICA/dHV0b3JpYWxfT3BlcmF0aW9uX0RJVklERSAtPgorICAgICAgICA/VFVUT1JJQUxfT1BFUkFUSU9OX0RJVklERSB3aGVuIE51bTIgPT0gMCAtPgorICAgICAgICAgIHRocm93KCMnSW52YWxpZE9wZXJhdGlvbid7d2hhdE9wPU9wLCB3aHk9IkNhbm5vdCBkaXZpZGUgYnkgMCJ9KTsKKyAgICAgICAgP1RVVE9SSUFMX09QRVJBVElPTl9ESVZJREUgLT4KICAgICAgICAgICBOdW0xIGRpdiBOdW0yOwogCiAgICAgICAgIF9FbHNlIC0+Ci0gICAgICAgICAgdGhyb3coI2ludmFsaWRPcGVyYXRpb257d2hhdD1PcCwgd2h5PSJJbnZhbGlkIG9wZXJhdGlvbiJ9KQorICAgICAgICAgIHRocm93KCMnSW52YWxpZE9wZXJhdGlvbid7d2hhdE9wPU9wLCB3aHk9IkludmFsaWQgb3BlcmF0aW9uIn0pCiAgICAgZW5kLgogCiBnZXRTdHJ1Y3QoS2V5KSAtPgogICAgIGRlYnVnKCJnZXRTdHJ1Y3QofnApIiwgW0tleV0pLAotICAgICNzaGFyZWRTdHJ1Y3R7a2V5PUtleSwgdmFsdWU9IlJBUkcifS4KKyAgICAjJ1NoYXJlZFN0cnVjdCd7a2V5PUtleSwgdmFsdWU9IlJBUkcifS4KIAogemlwKCkgLT4KICAgICBkZWJ1ZygiemlwIiwgW10pLApAQCAtNjMsNyArNjMsNyBAQAogJSUKIAogc3RhcnQoKSAtPgotICAgIHN0YXJ0KDk5OTkpLgorICAgIHN0YXJ0KDkwOTApLgogCiBzdGFydChQb3J0KSAtPgogICAgIEhhbmRsZXIgICA9ID9NT0RVTEUsCmRpZmYgLS1naXQgYS90dXRvcmlhbC9nby9NYWtlZmlsZS5hbSBiL3R1dG9yaWFsL2dvL01ha2VmaWxlLmFtCmluZGV4IGE3MDdkNWQuLmJkNTdkNjUgMTAwNjQ0Ci0tLSBhL3R1dG9yaWFsL2dvL01ha2VmaWxlLmFtCisrKyBiL3R1dG9yaWFsL2dvL01ha2VmaWxlLmFtCkBAIC0xNywzMCArMTcsMjggQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLVRIUklGVCA9ICQodG9wX2J1aWxkZGlyKS9jb21waWxlci9jcHAvdGhyaWZ0Ci0KIGdlbi1nby90dXRvcmlhbC9jYWxjdWxhdG9yLmdvIGdlbi1nby9zaGFyZWQvc2hhcmVkX3NlcnZpY2UuZ286ICQodG9wX3NyY2RpcikvdHV0b3JpYWwvdHV0b3JpYWwudGhyaWZ0Ci0JJChUSFJJRlQpIC0tZ2VuIGdvIC1yICQ8CisJJChUSFJJRlQpIC0tZ2VuIGdvJChDT01QSUxFUl9FWFRSQUZMQUcpIC1yICQ8CiAKIGFsbC1sb2NhbDogZ2VuLWdvL3R1dG9yaWFsL2NhbGN1bGF0b3IuZ28KIAotCi1jaGVjazogc3JjL2dpdC5hcGFjaGUub3JnL3RocmlmdC5naXQvbGliL2dvL3RocmlmdAotCSQoVEhSSUZUKSAtciAtLWdlbiBnbyAkKHRvcF9zcmNkaXIpL3R1dG9yaWFsL3R1dG9yaWFsLnRocmlmdAorY2hlY2s6IHNyYy9naXRodWIuY29tL2FwYWNoZS90aHJpZnQvbGliL2dvL3RocmlmdCB0aGlyZHBhcnR5LWRlcAorCSQoVEhSSUZUKSAtciAtLWdlbiBnbyQoQ09NUElMRVJfRVhUUkFGTEFHKSAkKHRvcF9zcmNkaXIpL3R1dG9yaWFsL3R1dG9yaWFsLnRocmlmdAogCWNwIC1yIGdlbi1nby8qIHNyYy8KLQlHT1BBVEg9YHB3ZGAgJChHTykgYnVpbGQgLi8uLi4KLQlHT1BBVEg9YHB3ZGAgJChHTykgYnVpbGQgLW8gZ28tdHV0b3JpYWwgc3JjLyouZ28KKwlHT1BBVEg9YHB3ZGAgJChHTykgYnVpbGQgLW8gZ28tdHV0b3JpYWwgLi9zcmMKIAlHT1BBVEg9YHB3ZGAgJChHTykgYnVpbGQgLW8gY2FsY3VsYXRvci1yZW1vdGUgc3JjL3R1dG9yaWFsL2NhbGN1bGF0b3ItcmVtb3RlL2NhbGN1bGF0b3ItcmVtb3RlLmdvCiAKLXNyYy9naXQuYXBhY2hlLm9yZy90aHJpZnQuZ2l0L2xpYi9nby90aHJpZnQ6Ci0JbWtkaXIgLXAgc3JjL2dpdC5hcGFjaGUub3JnL3RocmlmdC5naXQvbGliL2dvCi0JbG4gLXNmICQocmVhbHBhdGggJCh0b3Bfc3JjZGlyKS9saWIvZ28vdGhyaWZ0KSBzcmMvZ2l0LmFwYWNoZS5vcmcvdGhyaWZ0LmdpdC9saWIvZ28vdGhyaWZ0CitzcmMvZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0L2xpYi9nby90aHJpZnQ6CisJbWtkaXIgLXAgc3JjL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC9saWIvZ28KKwlsbiAtc2YgJChyZWFscGF0aCAkKHRvcF9zcmNkaXIpL2xpYi9nby90aHJpZnQpIHNyYy9naXRodWIuY29tL2FwYWNoZS90aHJpZnQvbGliL2dvL3RocmlmdAorCit0aGlyZHBhcnR5LWRlcDoKIAogdHV0b3JpYWxzZXJ2ZXI6IGFsbAogCUdPUEFUSD1gcHdkYCAkKEdPKSBydW4gc3JjLyouZ28gLXNlcnZlcj10cnVlCiAKIHR1dG9yaWFsY2xpZW50OiBhbGwKLQlHT1BBVEg9YHB3ZGAgJChHTykgcnVuIHNyYy8qLmdvIAorCUdPUEFUSD1gcHdkYCAkKEdPKSBydW4gc3JjLyouZ28KIAogdHV0b3JpYWxzZWN1cmVzZXJ2ZXI6IGFsbAogCUdPUEFUSD1gcHdkYCAkKEdPKSBydW4gc3JjLyouZ28gLXNlcnZlcj10cnVlIC1zZWN1cmU9dHJ1ZQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZ28vc3JjL2NsaWVudC5nbyBiL3R1dG9yaWFsL2dvL3NyYy9jbGllbnQuZ28KaW5kZXggYTQ5N2Q3Zi4uZTNlYmUwMCAxMDA2NDQKLS0tIGEvdHV0b3JpYWwvZ28vc3JjL2NsaWVudC5nbworKysgYi90dXRvcmlhbC9nby9zcmMvY2xpZW50LmdvCkBAIC0yMCwyNCArMjAsMjggQEAKICAqLwogCiBpbXBvcnQgKAorCSJjb250ZXh0IgogCSJjcnlwdG8vdGxzIgogCSJmbXQiCi0JImdpdC5hcGFjaGUub3JnL3RocmlmdC5naXQvbGliL2dvL3RocmlmdCIKIAkidHV0b3JpYWwiCisKKwkiZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0L2xpYi9nby90aHJpZnQiCiApCiAKK3ZhciBkZWZhdWx0Q3R4ID0gY29udGV4dC5CYWNrZ3JvdW5kKCkKKwogZnVuYyBoYW5kbGVDbGllbnQoY2xpZW50ICp0dXRvcmlhbC5DYWxjdWxhdG9yQ2xpZW50KSAoZXJyIGVycm9yKSB7Ci0JY2xpZW50LlBpbmcoKQorCWNsaWVudC5QaW5nKGRlZmF1bHRDdHgpCiAJZm10LlByaW50bG4oInBpbmcoKSIpCiAKLQlzdW0sIF8gOj0gY2xpZW50LkFkZCgxLCAxKQorCXN1bSwgXyA6PSBjbGllbnQuQWRkKGRlZmF1bHRDdHgsIDEsIDEpCiAJZm10LlByaW50KCIxKzE9Iiwgc3VtLCAiXG4iKQogCiAJd29yayA6PSB0dXRvcmlhbC5OZXdXb3JrKCkKIAl3b3JrLk9wID0gdHV0b3JpYWwuT3BlcmF0aW9uX0RJVklERQogCXdvcmsuTnVtMSA9IDEKIAl3b3JrLk51bTIgPSAwCi0JcXVvdGllbnQsIGVyciA6PSBjbGllbnQuQ2FsY3VsYXRlKDEsIHdvcmspCisJcXVvdGllbnQsIGVyciA6PSBjbGllbnQuQ2FsY3VsYXRlKGRlZmF1bHRDdHgsIDEsIHdvcmspCiAJaWYgZXJyICE9IG5pbCB7CiAJCXN3aXRjaCB2IDo9IGVyci4odHlwZSkgewogCQljYXNlICp0dXRvcmlhbC5JbnZhbGlkT3BlcmF0aW9uOgpAQCAtNTMsNyArNTcsNyBAQAogCXdvcmsuT3AgPSB0dXRvcmlhbC5PcGVyYXRpb25fU1VCVFJBQ1QKIAl3b3JrLk51bTEgPSAxNQogCXdvcmsuTnVtMiA9IDEwCi0JZGlmZiwgZXJyIDo9IGNsaWVudC5DYWxjdWxhdGUoMSwgd29yaykKKwlkaWZmLCBlcnIgOj0gY2xpZW50LkNhbGN1bGF0ZShkZWZhdWx0Q3R4LCAxLCB3b3JrKQogCWlmIGVyciAhPSBuaWwgewogCQlzd2l0Y2ggdiA6PSBlcnIuKHR5cGUpIHsKIAkJY2FzZSAqdHV0b3JpYWwuSW52YWxpZE9wZXJhdGlvbjoKQEAgLTY2LDcgKzcwLDcgQEAKIAkJZm10LlByaW50KCIxNS0xMD0iLCBkaWZmLCAiXG4iKQogCX0KIAotCWxvZywgZXJyIDo9IGNsaWVudC5HZXRTdHJ1Y3QoMSkKKwlsb2csIGVyciA6PSBjbGllbnQuR2V0U3RydWN0KGRlZmF1bHRDdHgsIDEpCiAJaWYgZXJyICE9IG5pbCB7CiAJCWZtdC5QcmludGxuKCJVbmFibGUgdG8gZ2V0IHN0cnVjdDoiLCBlcnIpCiAJCXJldHVybiBlcnIKQEAgLTkwLDEwICs5NCwxNSBAQAogCQlmbXQuUHJpbnRsbigiRXJyb3Igb3BlbmluZyBzb2NrZXQ6IiwgZXJyKQogCQlyZXR1cm4gZXJyCiAJfQotCXRyYW5zcG9ydCA9IHRyYW5zcG9ydEZhY3RvcnkuR2V0VHJhbnNwb3J0KHRyYW5zcG9ydCkKKwl0cmFuc3BvcnQsIGVyciA9IHRyYW5zcG9ydEZhY3RvcnkuR2V0VHJhbnNwb3J0KHRyYW5zcG9ydCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KIAlkZWZlciB0cmFuc3BvcnQuQ2xvc2UoKQogCWlmIGVyciA6PSB0cmFuc3BvcnQuT3BlbigpOyBlcnIgIT0gbmlsIHsKIAkJcmV0dXJuIGVycgogCX0KLQlyZXR1cm4gaGFuZGxlQ2xpZW50KHR1dG9yaWFsLk5ld0NhbGN1bGF0b3JDbGllbnRGYWN0b3J5KHRyYW5zcG9ydCwgcHJvdG9jb2xGYWN0b3J5KSkKKwlpcHJvdCA6PSBwcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wodHJhbnNwb3J0KQorCW9wcm90IDo9IHByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbCh0cmFuc3BvcnQpCisJcmV0dXJuIGhhbmRsZUNsaWVudCh0dXRvcmlhbC5OZXdDYWxjdWxhdG9yQ2xpZW50KHRocmlmdC5OZXdUU3RhbmRhcmRDbGllbnQoaXByb3QsIG9wcm90KSkpCiB9CmRpZmYgLS1naXQgYS90dXRvcmlhbC9nby9zcmMvaGFuZGxlci5nbyBiL3R1dG9yaWFsL2dvL3NyYy9oYW5kbGVyLmdvCmluZGV4IGZiMGRhZWYuLjVjMGVlZDAgMTAwNjQ0Ci0tLSBhL3R1dG9yaWFsL2dvL3NyYy9oYW5kbGVyLmdvCisrKyBiL3R1dG9yaWFsL2dvL3NyYy9oYW5kbGVyLmdvCkBAIC0yMCw2ICsyMCw3IEBACiAgKi8KIAogaW1wb3J0ICgKKwkiY29udGV4dCIKIAkiZm10IgogCSJzaGFyZWQiCiAJInN0cmNvbnYiCkBAIC0zNCwxNyArMzUsMTcgQEAKIAlyZXR1cm4gJkNhbGN1bGF0b3JIYW5kbGVye2xvZzogbWFrZShtYXBbaW50XSpzaGFyZWQuU2hhcmVkU3RydWN0KX0KIH0KIAotZnVuYyAocCAqQ2FsY3VsYXRvckhhbmRsZXIpIFBpbmcoKSAoZXJyIGVycm9yKSB7CitmdW5jIChwICpDYWxjdWxhdG9ySGFuZGxlcikgUGluZyhjdHggY29udGV4dC5Db250ZXh0KSAoZXJyIGVycm9yKSB7CiAJZm10LlByaW50KCJwaW5nKClcbiIpCiAJcmV0dXJuIG5pbAogfQogCi1mdW5jIChwICpDYWxjdWxhdG9ySGFuZGxlcikgQWRkKG51bTEgaW50MzIsIG51bTIgaW50MzIpIChyZXR2YWwxNyBpbnQzMiwgZXJyIGVycm9yKSB7CitmdW5jIChwICpDYWxjdWxhdG9ySGFuZGxlcikgQWRkKGN0eCBjb250ZXh0LkNvbnRleHQsIG51bTEgaW50MzIsIG51bTIgaW50MzIpIChyZXR2YWwxNyBpbnQzMiwgZXJyIGVycm9yKSB7CiAJZm10LlByaW50KCJhZGQoIiwgbnVtMSwgIiwiLCBudW0yLCAiKVxuIikKIAlyZXR1cm4gbnVtMSArIG51bTIsIG5pbAogfQogCi1mdW5jIChwICpDYWxjdWxhdG9ySGFuZGxlcikgQ2FsY3VsYXRlKGxvZ2lkIGludDMyLCB3ICp0dXRvcmlhbC5Xb3JrKSAodmFsIGludDMyLCBlcnIgZXJyb3IpIHsKK2Z1bmMgKHAgKkNhbGN1bGF0b3JIYW5kbGVyKSBDYWxjdWxhdGUoY3R4IGNvbnRleHQuQ29udGV4dCwgbG9naWQgaW50MzIsIHcgKnR1dG9yaWFsLldvcmspICh2YWwgaW50MzIsIGVyciBlcnJvcikgewogCWZtdC5QcmludCgiY2FsY3VsYXRlKCIsIGxvZ2lkLCAiLCB7Iiwgdy5PcCwgIiwiLCB3Lk51bTEsICIsIiwgdy5OdW0yLCAifSlcbiIpCiAJc3dpdGNoIHcuT3AgewogCWNhc2UgdHV0b3JpYWwuT3BlcmF0aW9uX0FERDoKQEAgLTU5LDcgKzYwLDcgQEAKIAljYXNlIHR1dG9yaWFsLk9wZXJhdGlvbl9ESVZJREU6CiAJCWlmIHcuTnVtMiA9PSAwIHsKIAkJCW91Y2ggOj0gdHV0b3JpYWwuTmV3SW52YWxpZE9wZXJhdGlvbigpCi0JCQlvdWNoLldoYXQgPSBpbnQzMih3Lk9wKQorCQkJb3VjaC5XaGF0T3AgPSBpbnQzMih3Lk9wKQogCQkJb3VjaC5XaHkgPSAiQ2Fubm90IGRpdmlkZSBieSAwIgogCQkJZXJyID0gb3VjaAogCQkJcmV0dXJuCkBAIC02OCw3ICs2OSw3IEBACiAJCWJyZWFrCiAJZGVmYXVsdDoKIAkJb3VjaCA6PSB0dXRvcmlhbC5OZXdJbnZhbGlkT3BlcmF0aW9uKCkKLQkJb3VjaC5XaGF0ID0gaW50MzIody5PcCkKKwkJb3VjaC5XaGF0T3AgPSBpbnQzMih3Lk9wKQogCQlvdWNoLldoeSA9ICJVbmtub3duIG9wZXJhdGlvbiIKIAkJZXJyID0gb3VjaAogCQlyZXR1cm4KQEAgLTg5LDEzICs5MCwxMyBAQAogCXJldHVybiB2YWwsIGVycgogfQogCi1mdW5jIChwICpDYWxjdWxhdG9ySGFuZGxlcikgR2V0U3RydWN0KGtleSBpbnQzMikgKCpzaGFyZWQuU2hhcmVkU3RydWN0LCBlcnJvcikgeworZnVuYyAocCAqQ2FsY3VsYXRvckhhbmRsZXIpIEdldFN0cnVjdChjdHggY29udGV4dC5Db250ZXh0LCBrZXkgaW50MzIpICgqc2hhcmVkLlNoYXJlZFN0cnVjdCwgZXJyb3IpIHsKIAlmbXQuUHJpbnQoImdldFN0cnVjdCgiLCBrZXksICIpXG4iKQogCXYsIF8gOj0gcC5sb2dbaW50KGtleSldCiAJcmV0dXJuIHYsIG5pbAogfQogCi1mdW5jIChwICpDYWxjdWxhdG9ySGFuZGxlcikgWmlwKCkgKGVyciBlcnJvcikgeworZnVuYyAocCAqQ2FsY3VsYXRvckhhbmRsZXIpIFppcChjdHggY29udGV4dC5Db250ZXh0KSAoZXJyIGVycm9yKSB7CiAJZm10LlByaW50KCJ6aXAoKVxuIikKIAlyZXR1cm4gbmlsCiB9CmRpZmYgLS1naXQgYS90dXRvcmlhbC9nby9zcmMvbWFpbi5nbyBiL3R1dG9yaWFsL2dvL3NyYy9tYWluLmdvCmluZGV4IDYzMTU0ZTMuLjc3MzBkN2IgMTAwNjQ0Ci0tLSBhL3R1dG9yaWFsL2dvL3NyYy9tYWluLmdvCisrKyBiL3R1dG9yaWFsL2dvL3NyYy9tYWluLmdvCkBAIC0yMiw3ICsyMiw3IEBACiBpbXBvcnQgKAogCSJmbGFnIgogCSJmbXQiCi0JImdpdC5hcGFjaGUub3JnL3RocmlmdC5naXQvbGliL2dvL3RocmlmdCIKKwkiZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0L2xpYi9nby90aHJpZnQiCiAJIm9zIgogKQogCmRpZmYgLS1naXQgYS90dXRvcmlhbC9nby9zcmMvc2VydmVyLmdvIGIvdHV0b3JpYWwvZ28vc3JjL3NlcnZlci5nbwppbmRleCBlNGM0Yjk3Li45NTcwOGViIDEwMDY0NAotLS0gYS90dXRvcmlhbC9nby9zcmMvc2VydmVyLmdvCisrKyBiL3R1dG9yaWFsL2dvL3NyYy9zZXJ2ZXIuZ28KQEAgLTIyLDcgKzIyLDcgQEAKIGltcG9ydCAoCiAJImNyeXB0by90bHMiCiAJImZtdCIKLQkiZ2l0LmFwYWNoZS5vcmcvdGhyaWZ0LmdpdC9saWIvZ28vdGhyaWZ0IgorCSJnaXRodWIuY29tL2FwYWNoZS90aHJpZnQvbGliL2dvL3RocmlmdCIKIAkidHV0b3JpYWwiCiApCiAKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2hheGUvTWFrZWZpbGUuYW0gYi90dXRvcmlhbC9oYXhlL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2ZjI3MTMKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9oYXhlL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsOTcgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitCSU5fQ1BQID0gYmluL01haW4tZGVidWcKK0JJTl9QSFAgPSBiaW4vcGhwL01haW4tZGVidWcucGhwCitCSU5fUEhQX1dFQiA9IGJpbi9waHAtd2ViLXNlcnZlci9NYWluLWRlYnVnLnBocAorCitnZW4taGF4ZS90dXRvcmlhbC9jYWxjdWxhdG9yLmh4IGdlbi1oYXhlL3NoYXJlZC9zaGFyZWRfc2VydmljZS5oeDogJCh0b3Bfc3JjZGlyKS90dXRvcmlhbC90dXRvcmlhbC50aHJpZnQKKwkkKFRIUklGVCkgLS1nZW4gaGF4ZSAtciAkPAorCithbGwtbG9jYWw6ICQoQklOX0NQUCkgJChCSU5fUEhQKSAkKEJJTl9QSFBfV0VCKQorCitjaGVjazogZ2VuLWhheGUvdHV0b3JpYWwvY2FsY3VsYXRvci5oeAorCiskKEJJTl9DUFApOiBcCisJCXNyYy8qLmh4IFwKKwkJLi4vLi4vbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0LyoqLyouaHggXAorCQlnZW4taGF4ZS90dXRvcmlhbC9jYWxjdWxhdG9yLmh4CisJJChIQVhFKSAtLWN3ZCAuICBjcHAuaHhtbAorCiskKEJJTl9QSFApOiBcCisJCXNyYy8qLmh4IFwKKwkJLi4vLi4vbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0LyoqLyouaHggXAorCQlnZW4taGF4ZS90dXRvcmlhbC9jYWxjdWxhdG9yLmh4CisJJChIQVhFKSAtLWN3ZCAuICBwaHAuaHhtbAorCiskKEJJTl9QSFBfV0VCKTogXAorCQlzcmMvKi5oeCBcCisJCS4uLy4uL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC8qKi8qLmh4IFwKKwkJZ2VuLWhheGUvdHV0b3JpYWwvY2FsY3VsYXRvci5oeAorCSQoSEFYRSkgLS1jd2QgLiAgcGhwLXdlYi1zZXJ2ZXIuaHhtbAorCit0dXRvcmlhbHNlcnZlcjogYWxsCisJJChCSU5fQ1BQKSBzZXJ2ZXIKKwordHV0b3JpYWxzZXJ2ZXJfcGhwOiBhbGwKKwlwaHAgLWYgJChCSU5fUEhQKSBzZXJ2ZXIKKwordHV0b3JpYWxjbGllbnQ6IGFsbAorCSQoQklOX0NQUCkKKwordHV0b3JpYWxjbGllbnRfcGhwOiBhbGwKKwlwaHAgLWYgJChCSU5fUEhQKSAKKwordHV0b3JpYWxzZWN1cmVzZXJ2ZXI6IGFsbAorCSQoQklOX0NQUCkgc2VydmVyIHNlY3VyZQorCit0dXRvcmlhbHNlY3VyZXNlcnZlcl9waHA6IGFsbAorCXBocCAtZiAkKEJJTl9QSFApIHNlcnZlciBzZWN1cmUKKwordHV0b3JpYWxzZWN1cmVjbGllbnQ6IGFsbAorCSQoQklOX0NQUCkgc2VjdXJlCisKK3R1dG9yaWFsc2VjdXJlY2xpZW50X3BocDogYWxsCisJcGhwIC1mICQoQklOX1BIUCkgc2VjdXJlCisKK3R1dG9yaWFsc2VydmVyX3BocF9odHRwOiBhbGwKKwlwaHAgLVMgMTI3LjAuMC4xOjkwOTAgcm91dGVyLnBocAorCit0dXRvcmlhbGNsaWVudF9odHRwOiBhbGwKKwkkKEJJTl9DUFApIGNsaWVudCBodHRwCisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIC1yIGdlbi1oYXhlIGJpbgorCitFWFRSQV9ESVNUID0gXAorCXNyYyBcCisJY3BwLmh4bWwgXAorCWNzaGFycC5oeG1sIFwKKwlmbGFzaC5oeG1sIFwKKwlqYXZhLmh4bWwgXAorCWphdmFzY3JpcHQuaHhtbCBcCisJcGhwLXdlYi1zZXJ2ZXIuaHhtbCBcCisJbmVrby5oeG1sIFwKKwlwaHAuaHhtbCBcCisJcHl0aG9uLmh4bWwgXAorCXJvdXRlci5waHAgXAorCXByb2plY3QuaGlkZSBcCisJVHV0b3JpYWwuaHhwcm9qIFwKKwltYWtlX2FsbC5iYXQgXAorCW1ha2VfYWxsLnNoCmRpZmYgLS1naXQgYS90dXRvcmlhbC9oYXhlL1R1dG9yaWFsLmh4cHJvaiBiL3R1dG9yaWFsL2hheGUvVHV0b3JpYWwuaHhwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5NmY2NDgKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9oYXhlL1R1dG9yaWFsLmh4cHJvagpAQCAtMCwwICsxLDY3IEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPHByb2plY3QgdmVyc2lvbj0iMiI+CisgIDwhLS0gT3V0cHV0IFNXRiBvcHRpb25zIC0tPgorICA8b3V0cHV0PgorICAgIDxtb3ZpZSBvdXRwdXRUeXBlPSJBcHBsaWNhdGlvbiIgLz4KKyAgICA8bW92aWUgaW5wdXQ9IiIgLz4KKyAgICA8bW92aWUgcGF0aD0iYmluL0hheGVUdXRvcmlhbCIgLz4KKyAgICA8bW92aWUgZnBzPSIzMCIgLz4KKyAgICA8bW92aWUgd2lkdGg9IjgwMCIgLz4KKyAgICA8bW92aWUgaGVpZ2h0PSI2MDAiIC8+CisgICAgPG1vdmllIHZlcnNpb249IjEiIC8+CisgICAgPG1vdmllIG1pbm9yVmVyc2lvbj0iMCIgLz4KKyAgICA8bW92aWUgcGxhdGZvcm09IkMrKyIgLz4KKyAgICA8bW92aWUgYmFja2dyb3VuZD0iI0ZGRkZGRiIgLz4KKyAgPC9vdXRwdXQ+CisgIDwhLS0gT3RoZXIgY2xhc3NlcyB0byBiZSBjb21waWxlZCBpbnRvIHlvdXIgU1dGIC0tPgorICA8Y2xhc3NwYXRocz4KKyAgICA8Y2xhc3MgcGF0aD0ic3JjIiAvPgorICAgIDxjbGFzcyBwYXRoPSJnZW4taGF4ZSIgLz4KKyAgICA8Y2xhc3MgcGF0aD0iLi4vLi4vbGliL2hheGUvc3JjIiAvPgorICA8L2NsYXNzcGF0aHM+CisgIDwhLS0gQnVpbGQgb3B0aW9ucyAtLT4KKyAgPGJ1aWxkPgorICAgIDxvcHRpb24gZGlyZWN0aXZlcz0iIiAvPgorICAgIDxvcHRpb24gZmxhc2hTdHJpY3Q9IkZhbHNlIiAvPgorICAgIDxvcHRpb24gbm9JbmxpbmVPbkRlYnVnPSJGYWxzZSIgLz4KKyAgICA8b3B0aW9uIG1haW5DbGFzcz0iTWFpbiIgLz4KKyAgICA8b3B0aW9uIGVuYWJsZWRlYnVnPSJGYWxzZSIgLz4KKyAgICA8b3B0aW9uIGFkZGl0aW9uYWw9IiIgLz4KKyAgPC9idWlsZD4KKyAgPCEtLSBoYXhlbGliIGxpYnJhcmllcyAtLT4KKyAgPGhheGVsaWI+CisgICAgPCEtLSBleGFtcGxlOiA8bGlicmFyeSBuYW1lPSIuLi4iIC8+IC0tPgorICA8L2hheGVsaWI+CisgIDwhLS0gQ2xhc3MgZmlsZXMgdG8gY29tcGlsZSAob3RoZXIgcmVmZXJlbmNlZCBjbGFzc2VzIHdpbGwgYXV0b21hdGljYWxseSBiZSBpbmNsdWRlZCkgLS0+CisgIDxjb21waWxlVGFyZ2V0cz4KKyAgICA8IS0tIGV4YW1wbGU6IDxjb21waWxlIHBhdGg9Ii4uLiIgLz4gLS0+CisgIDwvY29tcGlsZVRhcmdldHM+CisgIDwhLS0gUGF0aHMgdG8gZXhjbHVkZSBmcm9tIHRoZSBQcm9qZWN0IEV4cGxvcmVyIHRyZWUgLS0+CisgIDxoaWRkZW5QYXRocz4KKyAgICA8aGlkZGVuIHBhdGg9Im9iaiIgLz4KKyAgICA8aGlkZGVuIHBhdGg9ImNwcC5oeG1sIiAvPgorICAgIDxoaWRkZW4gcGF0aD0iY3NoYXJwLmh4bWwiIC8+CisgICAgPGhpZGRlbiBwYXRoPSJmbGFzaC5oeG1sIiAvPgorICAgIDxoaWRkZW4gcGF0aD0iamF2YS5oeG1sIiAvPgorICAgIDxoaWRkZW4gcGF0aD0iamF2YXNjcmlwdC5oeG1sIiAvPgorICAgIDxoaWRkZW4gcGF0aD0ibWFrZV9hbGwuYmF0IiAvPgorICAgIDxoaWRkZW4gcGF0aD0ibWFrZV9hbGwuc2giIC8+CisgICAgPGhpZGRlbiBwYXRoPSJNYWtlZmlsZS5hbSIgLz4KKyAgICA8aGlkZGVuIHBhdGg9Im5la28uaHhtbCIgLz4KKyAgICA8aGlkZGVuIHBhdGg9InBocC5oeG1sIiAvPgorICAgIDxoaWRkZW4gcGF0aD0icHJvamVjdC5oaWRlIiAvPgorICAgIDxoaWRkZW4gcGF0aD0icHl0aG9uLmh4bWwiIC8+CisgIDwvaGlkZGVuUGF0aHM+CisgIDwhLS0gRXhlY3V0ZWQgYmVmb3JlIGJ1aWxkIC0tPgorICA8cHJlQnVpbGRDb21tYW5kPnRocmlmdCAtciAtZ2VuIGhheGUgIC4uL3R1dG9yaWFsLnRocmlmdDwvcHJlQnVpbGRDb21tYW5kPgorICA8IS0tIEV4ZWN1dGVkIGFmdGVyIGJ1aWxkIC0tPgorICA8cG9zdEJ1aWxkQ29tbWFuZCBhbHdheXNSdW49IkZhbHNlIiAvPgorICA8IS0tIE90aGVyIHByb2plY3Qgb3B0aW9ucyAtLT4KKyAgPG9wdGlvbnM+CisgICAgPG9wdGlvbiBzaG93SGlkZGVuUGF0aHM9IkZhbHNlIiAvPgorICAgIDxvcHRpb24gdGVzdE1vdmllPSJVbmtub3duIiAvPgorICAgIDxvcHRpb24gdGVzdE1vdmllQ29tbWFuZD0iIiAvPgorICA8L29wdGlvbnM+CisgIDwhLS0gUGx1Z2luIHN0b3JhZ2UgLS0+CisgIDxzdG9yYWdlIC8+Cis8L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvaGF4ZS9jcHAuaHhtbCBiL3R1dG9yaWFsL2hheGUvY3BwLmh4bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFkYjUyZAotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2hheGUvY3BwLmh4bWwKQEAgLTAsMCArMSw0MSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisgCisjaW50ZWdyYXRlIGZpbGVzIHRvIGNsYXNzcGF0aAorLWNwIHNyYworLWNwIGdlbi1oYXhlCistY3AgLi4vLi4vbGliL2hheGUvc3JjCisKKyN0aGlzIGNsYXNzIHdpbCBiZSB1c2VkIGFzIGVudHJ5IHBvaW50IGZvciB5b3VyIGFwcC4KKy1tYWluIE1haW4KKworI0NQUCB0YXJnZXQKKy1jcHAgYmluCisKKyNUbyBwcm9kdWNlIDY0IGJpdCBiaW5hcmllcyB0aGUgZmlsZSBzaG91bGQgZGVmaW5lIHRoZSBIWENQUF9NNjQgY29tcGlsZSB2YXJpYWJsZToKKyMtRCBIWENQUF9NNjQKKworI0FkZCBkZWJ1ZyBpbmZvcm1hdGlvbgorLWRlYnVnCisKKyNkZWFkIGNvZGUgZWxpbWluYXRpb24gOiByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBubyIgOiBkbyBub3QgcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugc3RkIiA6IHJlbW92ZSB1bnVzZWQgY29kZSBpbiB0aGUgc3RkIGxpYiAoZGVmYXVsdCkKKyMiLWRjZSBmdWxsIiA6IHJlbW92ZSBhbGwgdW51c2VkIGNvZGUKKy1kY2UgZnVsbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2hheGUvY3NoYXJwLmh4bWwgYi90dXRvcmlhbC9oYXhlL2NzaGFycC5oeG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5NWMwMTcKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9oYXhlL2NzaGFycC5oeG1sCkBAIC0wLDAgKzEsMzggQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIAorI2ludGVncmF0ZSBmaWxlcyB0byBjbGFzc3BhdGgKKy1jcCBzcmMKKy1jcCBnZW4taGF4ZQorLWNwIC4uLy4uL2xpYi9oYXhlL3NyYworCisjdGhpcyBjbGFzcyB3aWwgYmUgdXNlZCBhcyBlbnRyeSBwb2ludCBmb3IgeW91ciBhcHAuCistbWFpbiBNYWluCisKKyNDU0hBUlAgdGFyZ2V0CistY3MgYmluL1R1dG9yaWFsLmV4ZQorCisjQWRkIGRlYnVnIGluZm9ybWF0aW9uCistZGVidWcKKworI2RlYWQgY29kZSBlbGltaW5hdGlvbiA6IHJlbW92ZSB1bnVzZWQgY29kZQorIyItZGNlIG5vIiA6IGRvIG5vdCByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBzdGQiIDogcmVtb3ZlIHVudXNlZCBjb2RlIGluIHRoZSBzdGQgbGliIChkZWZhdWx0KQorIyItZGNlIGZ1bGwiIDogcmVtb3ZlIGFsbCB1bnVzZWQgY29kZQorLWRjZSBmdWxsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvaGF4ZS9mbGFzaC5oeG1sIGIvdHV0b3JpYWwvaGF4ZS9mbGFzaC5oeG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExZjA1NjgKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9oYXhlL2ZsYXNoLmh4bWwKQEAgLTAsMCArMSw0MSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisgCisjaW50ZWdyYXRlIGZpbGVzIHRvIGNsYXNzcGF0aAorLWNwIHNyYworLWNwIGdlbi1oYXhlCistY3AgLi4vLi4vbGliL2hheGUvc3JjCisKKyN0aGlzIGNsYXNzIHdpbCBiZSB1c2VkIGFzIGVudHJ5IHBvaW50IGZvciB5b3VyIGFwcC4KKy1tYWluIE1haW4KKworI0ZsYXNoIHRhcmdldAorLXN3ZiBiaW4vVHV0b3JpYWwuc3dmCisKKyNBZGQgZGVidWcgaW5mb3JtYXRpb24KKy1kZWJ1ZworCisjIHdlIG5lZWQgc29tZSBnb29kaWVzIGZyb20gc3lzLm5ldAorIyAtLW1hY3JvIGFsbG93UGFja2FnZSgic3lzIikKKworI2RlYWQgY29kZSBlbGltaW5hdGlvbiA6IHJlbW92ZSB1bnVzZWQgY29kZQorIyItZGNlIG5vIiA6IGRvIG5vdCByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBzdGQiIDogcmVtb3ZlIHVudXNlZCBjb2RlIGluIHRoZSBzdGQgbGliIChkZWZhdWx0KQorIyItZGNlIGZ1bGwiIDogcmVtb3ZlIGFsbCB1bnVzZWQgY29kZQorLWRjZSBmdWxsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvaGF4ZS9qYXZhLmh4bWwgYi90dXRvcmlhbC9oYXhlL2phdmEuaHhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjE1NTY1Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvaGF4ZS9qYXZhLmh4bWwKQEAgLTAsMCArMSwzOCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisgCisjaW50ZWdyYXRlIGZpbGVzIHRvIGNsYXNzcGF0aAorLWNwIHNyYworLWNwIGdlbi1oYXhlCistY3AgLi4vLi4vbGliL2hheGUvc3JjIAorCisjdGhpcyBjbGFzcyB3aWwgYmUgdXNlZCBhcyBlbnRyeSBwb2ludCBmb3IgeW91ciBhcHAuCistbWFpbiBNYWluCisKKyNKYXZhIHRhcmdldAorLWphdmEgYmluL1R1dG9yaWFsLmphcgorCisjQWRkIGRlYnVnIGluZm9ybWF0aW9uCistZGVidWcKKworI2RlYWQgY29kZSBlbGltaW5hdGlvbiA6IHJlbW92ZSB1bnVzZWQgY29kZQorIyItZGNlIG5vIiA6IGRvIG5vdCByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBzdGQiIDogcmVtb3ZlIHVudXNlZCBjb2RlIGluIHRoZSBzdGQgbGliIChkZWZhdWx0KQorIyItZGNlIGZ1bGwiIDogcmVtb3ZlIGFsbCB1bnVzZWQgY29kZQorLWRjZSBmdWxsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvaGF4ZS9qYXZhc2NyaXB0Lmh4bWwgYi90dXRvcmlhbC9oYXhlL2phdmFzY3JpcHQuaHhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmIzODc2Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvaGF4ZS9qYXZhc2NyaXB0Lmh4bWwKQEAgLTAsMCArMSw0NCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisgCisjaW50ZWdyYXRlIGZpbGVzIHRvIGNsYXNzcGF0aAorLWNwIHNyYworLWNwIGdlbi1oYXhlCistY3AgLi4vLi4vbGliL2hheGUvc3JjCisKKyN0aGlzIGNsYXNzIHdpbCBiZSB1c2VkIGFzIGVudHJ5IHBvaW50IGZvciB5b3VyIGFwcC4KKy1tYWluIE1haW4KKworI0phdmFTY3JpcHQgdGFyZ2V0CistanMgYmluL1R1dG9yaWFsLmpzCisKKyNZb3UgY2FuIHVzZSAtRCBzb3VyY2UtbWFwLWNvbnRlbnQgKHJlcXVpcmVzIEhheGUgMy4xKykgdG8gaGF2ZSB0aGUgLmh4IAorI2ZpbGVzIGRpcmVjdGx5IGVtYmVkZGVkIGludG8gdGhlIG1hcCBmaWxlLCB0aGlzIHdheSB5b3Ugb25seSBoYXZlIHRvIAorI3VwbG9hZCBpdCwgYW5kIGl0IHdpbGwgYmUgYWx3YXlzIGluIHN5bmMgd2l0aCB0aGUgY29tcGlsZWQgLmpzIGV2ZW4gaWYgCisjeW91IG1vZGlmeSB5b3VyIC5oeCBmaWxlcy4KKy1EIHNvdXJjZS1tYXAtY29udGVudAorCisjR2VuZXJhdGUgc291cmNlIG1hcCBhbmQgYWRkIGRlYnVnIGluZm9ybWF0aW9uCistZGVidWcKKworI2RlYWQgY29kZSBlbGltaW5hdGlvbiA6IHJlbW92ZSB1bnVzZWQgY29kZQorIyItZGNlIG5vIiA6IGRvIG5vdCByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBzdGQiIDogcmVtb3ZlIHVudXNlZCBjb2RlIGluIHRoZSBzdGQgbGliIChkZWZhdWx0KQorIyItZGNlIGZ1bGwiIDogcmVtb3ZlIGFsbCB1bnVzZWQgY29kZQorLWRjZSBmdWxsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvaGF4ZS9tYWtlX2FsbC5iYXQgYi90dXRvcmlhbC9oYXhlL21ha2VfYWxsLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTZkZDE1Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvaGF4ZS9tYWtlX2FsbC5iYXQKQEAgLTAsMCArMSw2OCBAQAorQGVjaG8gb2ZmCityZW0gLyoKK3JlbSAgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCityZW0gICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKK3JlbSAgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorcmVtICAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorcmVtICAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKK3JlbSAgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCityZW0gICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CityZW0gICoKK3JlbSAgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorcmVtICAqCityZW0gICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorcmVtICAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCityZW0gICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCityZW0gICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKK3JlbSAgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCityZW0gICogdW5kZXIgdGhlIExpY2Vuc2UuCityZW0gICovCisKK3NldGxvY2FsCitpZiAiJUhPTUVEUklWRSUiPT0iIiBnb3RvIE1JU1NJTkdWQVJTCitpZiAiJUhPTUVQQVRIJSI9PSIiIGdvdG8gTUlTU0lOR1ZBUlMKK2lmICIlSEFYRVBBVEglIj09IiIgZ290byBOT1RJTlNUQUxMRUQKKworc2V0IHBhdGg9JUhBWEVQQVRIJTslSEFYRVBBVEglXC4uXG5la287JXBhdGglCisKK3JlbSAjIGludm9rZSBUaHJpZnQgY29tbnBpbGVyCit0aHJpZnQgLXIgLWdlbiBoYXhlICAgLi5cdHV0b3JpYWwudGhyaWZ0CitpZiBlcnJvcmxldmVsIDEgZ290byBTVE9QCisKK3JlbSAjIGludm9rZSBIYXhlIGNvbXBpbGVyIGZvciBhbGwgdGFyZ2V0cworZm9yICUlYSBpbiAoKi5oeG1sKSBkbyAoCisJcmVtICogZmlsdGVyIFB5dGhvbiwgYXMgaXQgaXMgbm90IHN1cHBvcnRlZCBieSBIYXhlIDMuMS4zIChidXQgd2lsbCBiZSBpbiAzLjEuNCkKKwlpZiBub3QgIiUlYSI9PSJweXRob24uaHhtbCIgKAorCQllY2hvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCWVjaG8gQnVpbGRpbmcgJSVhIC4uLgorCQllY2hvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCWhheGUgIC0tY3dkIC4gICUlYQorCSkKKykKKworCitlY2hvLgorZWNobyBkb25lLgorcGF1c2UKK2dvdG8gZW9mCisKKzpOT1RJTlNUQUxMRUQKK2VjaG8gRkFUQUw6IEVpdGhlciBIYXhlIGlzIG5vdCBpbnN0YWxsZWQsIG9yIHRoZSBIQVhFUEFUSCB2YXJpYWJsZSBpcyBub3Qgc2V0LgorcGF1c2UKK2dvdG8gZW9mCisKKzpNSVNTSU5HVkFSUworZWNobyBGQVRBTDogVW5hYmxlIHRvIGxvY2F0ZSBob21lIGZvbGRlci4KK2VjaG8uCitlY2hvIEJvdGggSE9NRURSSVZFIGFuZCBIT01FUEFUSCBuZWVkIHRvIGJlIHNldCB0byBwb2ludCB0byB5b3VyIEhvbWUgZm9sZGVyLgorZWNobyBUaGUgY3VycmVudCB2YWx1ZXMgYXJlOgorZWNobyBIT01FRFJJVkU9JUhPTUVEUklWRSUKK2VjaG8gSE9NRVBBVEg9JUhPTUVQQVRIJQorcGF1c2UKK2dvdG8gZW9mCisKKzpTVE9QCitwYXVzZQorZ290byBlb2YKKworOmVvZgpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvaGF4ZS9tYWtlX2FsbC5zaCBiL3R1dG9yaWFsL2hheGUvbWFrZV9hbGwuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmVlNjUwZAotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2hheGUvbWFrZV9hbGwuc2gKQEAgLTAsMCArMSw0MSBAQAorIyEvYmluL3NoCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIyBpbnZva2UgVGhyaWZ0IGNvbW5waWxlcgordGhyaWZ0IC1yIC1nZW4gaGF4ZSAgLi4vdHV0b3JpYWwudGhyaWZ0CisKKyMgb3V0cHV0IGZvbGRlcgoraWYgWyAhIC1kIGJpbiBdOyB0aGVuCisgIG1rZGlyICBiaW4KK2ZpCisKKyMgaW52b2tlIEhheGUgY29tcG9pbGVyCitmb3IgdGFyZ2V0IGluICouaHhtbDsgZG8gCisgIGVjaG8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgZWNobyBCdWlsZGluZyAke3RhcmdldH0gLi4uCisgIGVjaG8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgaWYgWyAhIC1kIGJpbi8ke3RhcmdldH0gXTsgdGhlbgorICAgIG1rZGlyICBiaW4vJHt0YXJnZXR9CisgIGZpCisgIGhheGUgIC0tY3dkIC4gICR7dGFyZ2V0fSAKK2RvbmUKKworCisjZW9mCmRpZmYgLS1naXQgYS90dXRvcmlhbC9oYXhlL25la28uaHhtbCBiL3R1dG9yaWFsL2hheGUvbmVrby5oeG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxNjFmNjkKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9oYXhlL25la28uaHhtbApAQCAtMCwwICsxLDM4IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyAKKyNpbnRlZ3JhdGUgZmlsZXMgdG8gY2xhc3NwYXRoCistY3Agc3JjCistY3AgZ2VuLWhheGUKKy1jcCAuLi8uLi9saWIvaGF4ZS9zcmMKKworI3RoaXMgY2xhc3Mgd2lsIGJlIHVzZWQgYXMgZW50cnkgcG9pbnQgZm9yIHlvdXIgYXBwLgorLW1haW4gTWFpbgorCisjbmVrbyB0YXJnZXQKKy1uZWtvIGJpbi9UdXRvcmlhbC5uCisKKyNBZGQgZGVidWcgaW5mb3JtYXRpb24KKy1kZWJ1ZworCisjZGVhZCBjb2RlIGVsaW1pbmF0aW9uIDogcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugbm8iIDogZG8gbm90IHJlbW92ZSB1bnVzZWQgY29kZQorIyItZGNlIHN0ZCIgOiByZW1vdmUgdW51c2VkIGNvZGUgaW4gdGhlIHN0ZCBsaWIgKGRlZmF1bHQpCisjIi1kY2UgZnVsbCIgOiByZW1vdmUgYWxsIHVudXNlZCBjb2RlCistZGNlIGZ1bGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90dXRvcmlhbC9oYXhlL3BocC13ZWItc2VydmVyLmh4bWwgYi90dXRvcmlhbC9oYXhlL3BocC13ZWItc2VydmVyLmh4bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk1YTg1MgotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2hheGUvcGhwLXdlYi1zZXJ2ZXIuaHhtbApAQCAtMCwwICsxLDQzIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyAKKyNpbnRlZ3JhdGUgZmlsZXMgdG8gY2xhc3NwYXRoCistY3Agc3JjCistY3AgZ2VuLWhheGUKKy1jcCAuLi8uLi9saWIvaGF4ZS9zcmMKKworI3RoaXMgY2xhc3Mgd2lsIGJlIHVzZWQgYXMgZW50cnkgcG9pbnQgZm9yIHlvdXIgYXBwLgorLW1haW4gTWFpbgorCisjUEhQIHRhcmdldAorLXBocCBiaW4vcGhwLXdlYi1zZXJ2ZXIvCistLXBocC1mcm9udCBNYWluLWRlYnVnLnBocAorCisjZGVmaW5lcworLUQgcGhwd2Vic2VydmVyCisKKworI0FkZCBkZWJ1ZyBpbmZvcm1hdGlvbgorLWRlYnVnCisKKyNkZWFkIGNvZGUgZWxpbWluYXRpb24gOiByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBubyIgOiBkbyBub3QgcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugc3RkIiA6IHJlbW92ZSB1bnVzZWQgY29kZSBpbiB0aGUgc3RkIGxpYiAoZGVmYXVsdCkKKyMiLWRjZSBmdWxsIiA6IHJlbW92ZSBhbGwgdW51c2VkIGNvZGUKKy1kY2UgZnVsbApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvaGF4ZS9waHAuaHhtbCBiL3R1dG9yaWFsL2hheGUvcGhwLmh4bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJmNjg4NwotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2hheGUvcGhwLmh4bWwKQEAgLTAsMCArMSwzOSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisgCisjaW50ZWdyYXRlIGZpbGVzIHRvIGNsYXNzcGF0aAorLWNwIHNyYworLWNwIGdlbi1oYXhlCistY3AgLi4vLi4vbGliL2hheGUvc3JjCisKKyN0aGlzIGNsYXNzIHdpbCBiZSB1c2VkIGFzIGVudHJ5IHBvaW50IGZvciB5b3VyIGFwcC4KKy1tYWluIE1haW4KKworI1BIUCB0YXJnZXQKKy1waHAgYmluL3BocC8KKy0tcGhwLWZyb250IE1haW4tZGVidWcucGhwCisKKyNBZGQgZGVidWcgaW5mb3JtYXRpb24KKy1kZWJ1ZworCisjZGVhZCBjb2RlIGVsaW1pbmF0aW9uIDogcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugbm8iIDogZG8gbm90IHJlbW92ZSB1bnVzZWQgY29kZQorIyItZGNlIHN0ZCIgOiByZW1vdmUgdW51c2VkIGNvZGUgaW4gdGhlIHN0ZCBsaWIgKGRlZmF1bHQpCisjIi1kY2UgZnVsbCIgOiByZW1vdmUgYWxsIHVudXNlZCBjb2RlCistZGNlIGZ1bGwKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2hheGUvcHJvamVjdC5oaWRlIGIvdHV0b3JpYWwvaGF4ZS9wcm9qZWN0LmhpZGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ1ZDRlYwotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2hheGUvcHJvamVjdC5oaWRlCkBAIC0wLDAgKzEsMTA1IEBACit7CisgICAgICJ0eXBlIiA6IDAKKyAgICAsInRhcmdldCIgOiA0CisgICAgLCJuYW1lIiA6ICJBcGFjaGUgVGhyaWZ0IFR1dG9yaWFsIgorICAgICwibWFpbiIgOiBudWxsCisgICAgLCJwcm9qZWN0UGFja2FnZSIgOiAiIgorICAgICwiY29tcGFueSIgOiAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikiCisgICAgLCJsaWNlbnNlIiA6ICJBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAiCisgICAgLCJ1cmwiIDogImh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCIKKyAgICAsInRhcmdldERhdGEiIDogWworICAgICAgICAgeworICAgICAgICAgICAgICJwYXRoVG9IeG1sIiA6ICJmbGFzaC5oeG1sIgorICAgICAgICAgICAgLCJydW5BY3Rpb25UeXBlIiA6IDEKKyAgICAgICAgICAgICwicnVuQWN0aW9uVGV4dCIgOiAiYmluL1R1dG9yaWFsLnN3ZiIKKyAgICAgICAgfQorICAgICAgICAseworICAgICAgICAgICAgICJwYXRoVG9IeG1sIiA6ICJqYXZhc2NyaXB0Lmh4bWwiCisgICAgICAgICAgICAsInJ1bkFjdGlvblR5cGUiIDogMQorICAgICAgICAgICAgLCJydW5BY3Rpb25UZXh0IiA6ICJiaW5cXGluZGV4Lmh0bWwiCisgICAgICAgIH0KKyAgICAgICAgLHsKKyAgICAgICAgICAgICAicGF0aFRvSHhtbCIgOiAibmVrby5oeG1sIgorICAgICAgICAgICAgLCJydW5BY3Rpb25UeXBlIiA6IDIKKyAgICAgICAgICAgICwicnVuQWN0aW9uVGV4dCIgOiAibmVrbyBiaW4vVHV0b3JpYWwubiIKKyAgICAgICAgfQorICAgICAgICAseworICAgICAgICAgICAgICJwYXRoVG9IeG1sIiA6ICJwaHAuaHhtbCIKKyAgICAgICAgfQorICAgICAgICAseworICAgICAgICAgICAgICJwYXRoVG9IeG1sIiA6ICJjcHAuaHhtbCIKKyAgICAgICAgICAgICwicnVuQWN0aW9uVHlwZSIgOiAyCisgICAgICAgICAgICAsInJ1bkFjdGlvblRleHQiIDogImJpbi9NYWluLWRlYnVnLmV4ZSIKKyAgICAgICAgfQorICAgICAgICAseworICAgICAgICAgICAgICJwYXRoVG9IeG1sIiA6ICJqYXZhLmh4bWwiCisgICAgICAgIH0KKyAgICAgICAgLHsKKyAgICAgICAgICAgICAicGF0aFRvSHhtbCIgOiAiY3NoYXJwLmh4bWwiCisgICAgICAgICAgICAsInJ1bkFjdGlvblR5cGUiIDogMgorICAgICAgICAgICAgLCJydW5BY3Rpb25UZXh0IiA6ICJiaW5cXFR1dG9yaWFsLmV4ZVxcYmluXFxNYWluLURlYnVnLmV4ZSIKKyAgICAgICAgfQorICAgICAgICAseworICAgICAgICAgICAgICJwYXRoVG9IeG1sIiA6ICJweXRob24uaHhtbCIKKyAgICAgICAgICAgICwicnVuQWN0aW9uVHlwZSIgOiAyCisgICAgICAgICAgICAsInJ1bkFjdGlvblRleHQiIDogInB5dGhvbiBiaW4vVHV0b3JpYWwucHkiCisgICAgICAgIH0KKyAgICBdCisgICAgLCJmaWxlcyIgOiBbCisgICAgICAgICB7CisgICAgICAgICAgICAgInBhdGgiIDogInNyY1xcb3JnXFxhcGFjaGVcXHRocmlmdFxcc2VydmVyXFxUU2VydmVyLmh4IgorICAgICAgICAgICAgLCJ1c2VUYWJzIiA6IHRydWUKKyAgICAgICAgICAgICwiaW5kZW50U2l6ZSIgOiA0CisgICAgICAgICAgICAsImZvbGRlZFJlZ2lvbnMiIDogWworCisgICAgICAgICAgICBdCisgICAgICAgICAgICAsImFjdGl2ZUxpbmUiIDogNzYKKyAgICAgICAgfQorICAgICAgICAseworICAgICAgICAgICAgICJwYXRoIiA6ICJzcmNcXG9yZ1xcYXBhY2hlXFx0aHJpZnRcXHNlcnZlclxcVFNpbXBsZVNlcnZlci5oeCIKKyAgICAgICAgICAgICwidXNlVGFicyIgOiB0cnVlCisgICAgICAgICAgICAsImluZGVudFNpemUiIDogNAorICAgICAgICAgICAgLCJmb2xkZWRSZWdpb25zIiA6IFsKKworICAgICAgICAgICAgXQorICAgICAgICAgICAgLCJhY3RpdmVMaW5lIiA6IDEwMAorICAgICAgICB9CisgICAgICAgICx7CisgICAgICAgICAgICAgInBhdGgiIDogInNyY1xcc2hhcmVkXFxTaGFyZWRTZXJ2aWNlUHJvY2Vzc29yLmh4IgorICAgICAgICAgICAgLCJ1c2VUYWJzIiA6IHRydWUKKyAgICAgICAgICAgICwiaW5kZW50U2l6ZSIgOiA0CisgICAgICAgICAgICAsImZvbGRlZFJlZ2lvbnMiIDogWworCisgICAgICAgICAgICBdCisgICAgICAgICAgICAsImFjdGl2ZUxpbmUiIDogMjAKKyAgICAgICAgfQorICAgICAgICAseworICAgICAgICAgICAgICJwYXRoIiA6ICJzcmNcXHR1dG9yaWFsXFxDYWxjdWxhdG9yUHJvY2Vzc29yLmh4IgorICAgICAgICAgICAgLCJ1c2VUYWJzIiA6IHRydWUKKyAgICAgICAgICAgICwiaW5kZW50U2l6ZSIgOiA0CisgICAgICAgICAgICAsImZvbGRlZFJlZ2lvbnMiIDogWworCisgICAgICAgICAgICBdCisgICAgICAgICAgICAsImFjdGl2ZUxpbmUiIDogNzkKKyAgICAgICAgfQorICAgICAgICAseworICAgICAgICAgICAgICJwYXRoIiA6ICJzcmNcXE1haW4uaHgiCisgICAgICAgICAgICAsInVzZVRhYnMiIDogdHJ1ZQorICAgICAgICAgICAgLCJpbmRlbnRTaXplIiA6IDQKKyAgICAgICAgICAgICwiZm9sZGVkUmVnaW9ucyIgOiBbCisKKyAgICAgICAgICAgIF0KKyAgICAgICAgICAgICwiYWN0aXZlTGluZSIgOiAwCisgICAgICAgIH0KKyAgICBdCisgICAgLCJhY3RpdmVGaWxlIiA6ICJzcmNcXE1haW4uaHgiCisgICAgLCJvcGVuRkxUYXJnZXQiIDogbnVsbAorICAgICwib3BlbkZMQnVpbGRNb2RlIiA6ICJEZWJ1ZyIKKyAgICAsInJ1bkFjdGlvblR5cGUiIDogbnVsbAorICAgICwicnVuQWN0aW9uVGV4dCIgOiBudWxsCisgICAgLCJidWlsZEFjdGlvbkNvbW1hbmQiIDogbnVsbAorICAgICwiaGlkZGVuSXRlbXMiIDogWworCisgICAgXQorICAgICwic2hvd0hpZGRlbkl0ZW1zIiA6IGZhbHNlCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvaGF4ZS9weXRob24uaHhtbCBiL3R1dG9yaWFsL2hheGUvcHl0aG9uLmh4bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJjMTlmYQotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2hheGUvcHl0aG9uLmh4bWwKQEAgLTAsMCArMSwzOCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisgCisjaW50ZWdyYXRlIGZpbGVzIHRvIGNsYXNzcGF0aAorLWNwIHNyYworLWNwIGdlbi1oYXhlCistY3AgLi4vLi4vbGliL2hheGUvc3JjCisKKyN0aGlzIGNsYXNzIHdpbCBiZSB1c2VkIGFzIGVudHJ5IHBvaW50IGZvciB5b3VyIGFwcC4KKy1tYWluIE1haW4KKworI1B5dGhvbiB0YXJnZXQKKy1weXRob24gYmluL1R1dG9yaWFsLnB5CisKKyNBZGQgZGVidWcgaW5mb3JtYXRpb24KKy1kZWJ1ZworCisjZGVhZCBjb2RlIGVsaW1pbmF0aW9uIDogcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugbm8iIDogZG8gbm90IHJlbW92ZSB1bnVzZWQgY29kZQorIyItZGNlIHN0ZCIgOiByZW1vdmUgdW51c2VkIGNvZGUgaW4gdGhlIHN0ZCBsaWIgKGRlZmF1bHQpCisjIi1kY2UgZnVsbCIgOiByZW1vdmUgYWxsIHVudXNlZCBjb2RlCistZGNlIGZ1bGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90dXRvcmlhbC9oYXhlL3JvdXRlci5waHAgYi90dXRvcmlhbC9oYXhlL3JvdXRlci5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM0MTM1YwotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2hheGUvcm91dGVyLnBocApAQCAtMCwwICsxLDMxIEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQKKyAqLworCisKKworLy9yb3V0ZXIgZmlsZSB0byBydW4gdGVzdGluZyB3ZWIgc2VydmVyCisKKy8vc2V0X3RpbWVfbGltaXQoMSk7CisKK3JlcXVpcmVfb25jZSAgZGlybmFtZShfX0ZJTEVfXykgLiAnL2Jpbi9waHAtd2ViLXNlcnZlci9NYWluLWRlYnVnLnBocCc7CisKKwpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvaGF4ZS9zcmMvQ2FsY3VsYXRvckhhbmRsZXIuaHggYi90dXRvcmlhbC9oYXhlL3NyYy9DYWxjdWxhdG9ySGFuZGxlci5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTc1MmRiCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvaGF4ZS9zcmMvQ2FsY3VsYXRvckhhbmRsZXIuaHgKQEAgLTAsMCArMSwxMDEgQEAKK++7vy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZTsKKworaW1wb3J0IGhheGUuZHMuSW50TWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlci4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS4qOworCitpbXBvcnQgdHV0b3JpYWwuKjsKK2ltcG9ydCBzaGFyZWQuKjsKKworCitjbGFzcyBDYWxjdWxhdG9ySGFuZGxlciBpbXBsZW1lbnRzIENhbGN1bGF0b3IgeworCisgICAgcHJpdmF0ZSB2YXIgbG9nID0gbmV3IEludE1hcDxTaGFyZWRTdHJ1Y3Q+KCk7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KCkgeworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBwaW5nKCkgOiBWb2lkIHsKKyAgICAgICAgdHJhY2UoInBpbmcoKSIpOworICAgIH0KKworCisgICAgcHVibGljIGZ1bmN0aW9uIGFkZCggbnVtMSA6IGhheGUuSW50MzIsIG51bTIgOiBoYXhlLkludDMyKSA6IGhheGUuSW50MzIgeworICAgICAgICB0cmFjZSgnYWRkKCAkbnVtMSwgJG51bTIpJyk7CisgICAgICAgIHJldHVybiBudW0xICsgbnVtMjsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gY2FsY3VsYXRlKCBsb2dpZCA6IGhheGUuSW50MzIsIHdvcmsgOiBXb3JrKSA6IGhheGUuSW50MzIgIHsKKyAgICAgICAgdHJhY2UoJ2NhbGN1bGF0ZSggJGxvZ2lkLCAnK3dvcmsub3ArIiwiK3dvcmsubnVtMSsiLCIrd29yay5udW0yKyIpIik7CisKKyAgICAgICAgdmFyIHZhbCA6IGhheGUuSW50MzIgPSAwOworICAgICAgICBzd2l0Y2ggKHdvcmsub3ApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgT3BlcmF0aW9uLkFERDoKKyAgICAgICAgICAgICAgICB2YWwgPSB3b3JrLm51bTEgKyB3b3JrLm51bTI7CisKKyAgICAgICAgICAgIGNhc2UgT3BlcmF0aW9uLlNVQlRSQUNUOgorICAgICAgICAgICAgICAgIHZhbCA9IHdvcmsubnVtMSAtIHdvcmsubnVtMjsKKworICAgICAgICAgICAgY2FzZSBPcGVyYXRpb24uTVVMVElQTFk6CisgICAgICAgICAgICAgICAgdmFsID0gd29yay5udW0xICogd29yay5udW0yOworCisgICAgICAgICAgICBjYXNlIE9wZXJhdGlvbi5ESVZJREU6CisgICAgICAgICAgICAgICAgaWYgKHdvcmsubnVtMiA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGlvID0gbmV3IEludmFsaWRPcGVyYXRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgaW8ud2hhdE9wID0gd29yay5vcDsKKyAgICAgICAgICAgICAgICAgICAgaW8ud2h5ID0gIkNhbm5vdCBkaXZpZGUgYnkgMCI7CisgICAgICAgICAgICAgICAgICAgIHRocm93IGlvOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2YWwgPSBTdGQuaW50KCB3b3JrLm51bTEgLyB3b3JrLm51bTIpOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHZhciBpbyA9IG5ldyBJbnZhbGlkT3BlcmF0aW9uKCk7CisgICAgICAgICAgICAgICAgaW8ud2hhdE9wID0gd29yay5vcDsKKyAgICAgICAgICAgICAgICBpby53aHkgPSAiVW5rbm93biBvcGVyYXRpb24iOworICAgICAgICAgICAgICAgIHRocm93IGlvOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGVudHJ5ID0gbmV3IFNoYXJlZFN0cnVjdCgpOworICAgICAgICBlbnRyeS5rZXkgPSBsb2dpZDsKKyAgICAgICAgZW50cnkudmFsdWUgPSAnJHZhbCc7CisgICAgICAgIGxvZy5zZXQobG9naWQsIGVudHJ5KTsKKworICAgICAgICByZXR1cm4gdmFsOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRTdHJ1Y3QoIGtleSA6IGhheGUuSW50MzIpIDogU2hhcmVkU3RydWN0IHsKKyAgICAgICAgdHJhY2UoJ2dldFN0cnVjdCgka2V5KScpOworICAgICAgICByZXR1cm4gbG9nLmdldChrZXkpOworICAgIH0KKworICAgIC8vIG9uZXdheSBtZXRob2QsICBubyBhcmdzCisgICAgcHVibGljIGZ1bmN0aW9uIHppcCgpIDogVm9pZCB7CisgICAgICAgIHRyYWNlKCJ6aXAoKSIpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvaGF4ZS9zcmMvTWFpbi5oeCBiL3R1dG9yaWFsL2hheGUvc3JjL01haW4uaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJlYmU3MQotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2hheGUvc3JjL01haW4uaHgKQEAgLTAsMCArMSwzNzUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZTsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0Lio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXIuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuKjsKKworaW1wb3J0IHR1dG9yaWFsLio7CitpbXBvcnQgc2hhcmVkLio7CisKKworZW51bSBQcm90IHsKKyAgICBiaW5hcnk7CisgICAganNvbjsKK30KKworZW51bSBUcm5zIHsKKyAgICBzb2NrZXQ7CisgICAgaHR0cDsKK30KKworY2xhc3MgTWFpbiB7CisKKyAgICBwcml2YXRlIHN0YXRpYyB2YXIgc2VydmVyIDogQm9vbCA9IGZhbHNlOworICAgIHByaXZhdGUgc3RhdGljIHZhciBmcmFtZWQgOiBCb29sID0gZmFsc2U7CisgICAgcHJpdmF0ZSBzdGF0aWMgdmFyIGJ1ZmZlcmVkIDogQm9vbCA9IGZhbHNlOworICAgIHByaXZhdGUgc3RhdGljIHZhciBwcm90IDogUHJvdCA9IGJpbmFyeTsKKyAgICBwcml2YXRlIHN0YXRpYyB2YXIgdHJucyA6IFRybnMgPSBzb2NrZXQ7CisKKyAgICBwcml2YXRlIHN0YXRpYyB2YXIgdGFyZ2V0SG9zdCA6IFN0cmluZyA9ICJsb2NhbGhvc3QiOworICAgIHByaXZhdGUgc3RhdGljIHZhciB0YXJnZXRQb3J0IDogSW50ID0gOTA5MDsKKworICAgIHN0YXRpYyBmdW5jdGlvbiBtYWluKCkgeworCisgICAgICAgICNpZiAhIChmbGFzaCB8fCBqcyB8fCBwaHB3ZWJzZXJ2ZXIpCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgIFBhcnNlQXJncygpOworICAgICAgICB9IGNhdGNoIChlIDogU3RyaW5nKSB7CisgICAgICAgICAgICB0cmFjZShlKTsKKyAgICAgICAgICAgIHRyYWNlKEdldEhlbHAoKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAjZWxzZWlmICBwaHB3ZWJzZXJ2ZXIKKyAgICAgICAgLy9mb3JjaW5nIHNlcnZlcgorICAgICAgICBzZXJ2ZXIgPSB0cnVlOworICAgICAgICB0cm5zID0gaHR0cDsKKyAgICAgICAgaW5pdFBocFdlYlNlcnZlcigpOworICAgICAgICAvL2NoZWNrIG1ldGhvZAorICAgICAgICBpZihwaHAuV2ViLmdldE1ldGhvZCgpICE9ICdQT1NUJykgeworICAgICAgICAgIFN5cy5wcmludGxuKCdodHRwIGVuZHBvaW50IGZvciB0aHJpZnQgdGVzdCBzZXJ2ZXInKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgI2VuZAorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoc2VydmVyKQorICAgICAgICAgICAgICAgIFJ1blNlcnZlcigpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIFJ1bkNsaWVudCgpOworICAgICAgICB9IGNhdGNoIChlIDogU3RyaW5nKSB7CisgICAgICAgICAgICB0cmFjZShlKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyYWNlKCJDb21wbGV0ZWQuIik7CisgICAgfQorCisgICAgI2lmIHBocHdlYnNlcnZlcgorICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGluaXRQaHBXZWJTZXJ2ZXIoKQorICAgIHsKKyAgICAgICAgLy9yZW1hcCB0cmFjZSB0byBlcnJvciBsb2cKKyAgICAgICAgaGF4ZS5Mb2cudHJhY2UgPSBmdW5jdGlvbih2OkR5bmFtaWMsID9pbmZvczpoYXhlLlBvc0luZm9zKQorICAgICAgICB7CisgICAgICAgICAgLy8gaGFuZGxlIHRyYWNlCisgICAgICAgICAgdmFyIG5ld1ZhbHVlIDogRHluYW1pYzsKKyAgICAgICAgICBpZiAoaW5mb3MgIT0gbnVsbCAmJiBpbmZvcy5jdXN0b21QYXJhbXMhPW51bGwpIHsKKyAgICAgICAgICAgIHZhciBleHRyYTpTdHJpbmcgPSAiIjsKKyAgICAgICAgICAgIGZvciggdiBpbiBpbmZvcy5jdXN0b21QYXJhbXMgKQorICAgICAgICAgICAgICBleHRyYSArPSAiLCIgKyB2OworICAgICAgICAgICAgbmV3VmFsdWUgPSB2ICsgZXh0cmE7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgbmV3VmFsdWUgPSB2OworICAgICAgICAgIH0KKyAgICAgICAgICB2YXIgbXNnID0gaW5mb3MgIT0gbnVsbCA/IGluZm9zLmZpbGVOYW1lICsgJzonICsgaW5mb3MubGluZU51bWJlciArICc6ICcgOiAnJzsKKyAgICAgICAgICBTeXMuc3RkZXJyKCkud3JpdGVTdHJpbmcoJyR7bXNnfSR7bmV3VmFsdWV9XG4nKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAjZW5kCisKKworICAgICNpZiAhIChmbGFzaCB8fCBqcykKKworICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIEdldEhlbHAoKSA6IFN0cmluZyB7CisgICAgICAgIHJldHVybiBTeXMuZXhlY3V0YWJsZVBhdGgoKSsiICBtb2R1cyAgdHJuc09wdGlvbiAgdHJhbnNwb3J0ICBwcm90b2NvbFxuIgorICAgICAgICArIk9wdGlvbnM6XG4iCisgICAgICAgICsiICBtb2R1czogICAgICAgY2xpZW50LCBzZXJ2ZXIgICAoZGVmYXVsdDogY2xpZW50KVxuIgorICAgICAgICArIiAgdHJuc09wdGlvbjogIGZyYW1lZCwgYnVmZmVyZWQgKGRlZmF1bHQ6IG5vbmUpXG4iCisgICAgICAgICsiICB0cmFuc3BvcnQ6ICAgc29ja2V0LCBodHRwICAgICAoZGVmYXVsdDogc29ja2V0KVxuIgorICAgICAgICArIiAgcHJvdG9jb2w6ICAgIGJpbmFyeSwganNvbiAgICAgKGRlZmF1bHQ6IGJpbmFyeSlcbiIKKyAgICAgICAgKyJcbiIKKyAgICAgICAgKyJBbGwgYXJndW1lbnRzIGFyZSBvcHRpb25hbC5cbiI7CisgICAgfQorCisKKyAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBQYXJzZUFyZ3MoKSA6IFZvaWQgeworICAgICAgICB2YXIgc3RlcCA9IDA7CisgICAgICAgIGZvciAoYXJnIGluIFN5cy5hcmdzKCkpIHsKKworICAgICAgICAgICAgLy8gc2VydmVyfGNsaWVudAorICAgICAgICAgICAgc3dpdGNoKHN0ZXApIHsKKyAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICArK3N0ZXA7CisgICAgICAgICAgICAgICAgaWYgKCBhcmcgPT0gImNsaWVudCIpCisgICAgICAgICAgICAgICAgICAgIHNlcnZlciA9IGZhbHNlOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBhcmcgPT0gInNlcnZlciIpCisgICAgICAgICAgICAgICAgICAgIHNlcnZlciA9IHRydWU7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB0aHJvdyAiRmlyc3QgYXJndW1lbnQgbXVzdCBiZSAnc2VydmVyJyBvciAnY2xpZW50JyI7CisKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICBpZiAoIGFyZyA9PSAiZnJhbWVkIikgeworICAgICAgICAgICAgICAgICAgICBmcmFtZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIGFyZyA9PSAiYnVmZmVyZWQiKSB7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcmVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCBhcmcgPT0gInNvY2tldCIpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJucyA9IHNvY2tldDsKKyAgICAgICAgICAgICAgICAgICAgKytzdGVwOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIGFyZyA9PSAiaHR0cCIpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJucyA9IGh0dHA7CisgICAgICAgICAgICAgICAgICAgICsrc3RlcDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyAiVW5rbm93biB0cmFuc3BvcnQgIithcmc7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgaWYgKCBhcmcgPT0gImJpbmFyeSIpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJvdCA9IGJpbmFyeTsKKyAgICAgICAgICAgICAgICAgICAgKytzdGVwOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIGFyZyA9PSAianNvbiIpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJvdCA9IGpzb247CisgICAgICAgICAgICAgICAgICAgICsrc3RlcDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyAiVW5rbm93biBwcm90b2NvbCAiK2FyZzsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgIlVuZXhwZWN0ZWQgYXJndW1lbnQgIithcmc7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggZnJhbWVkICYmIGJ1ZmZlcmVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyYWNlKCJXTjogZnJhbWVkIHN1cGVyc2VkZXMgYnVmZmVyZWQiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgfQorCisgICAgI2VuZAorCisgICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gQ2xpZW50U2V0dXAoKSA6IENhbGN1bGF0b3IgeworICAgICAgICAgdHJhY2UoIkNsaWVudCBjb25maWd1cmF0aW9uOiIpOworCisgICAgICAgIC8vIGVuZHBvaW50IHRyYW5zcG9ydAorICAgICAgICB2YXIgdHJhbnNwb3J0IDogVFRyYW5zcG9ydDsKKyAgICAgICAgc3dpdGNoKHRybnMpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBzb2NrZXQ6CisgICAgICAgICAgICAgdHJhY2UoJy0gc29ja2V0IHRyYW5zcG9ydCAkdGFyZ2V0SG9zdDokdGFyZ2V0UG9ydCcpOworICAgICAgICAgICAgdHJhbnNwb3J0ID0gbmV3IFRTb2NrZXQoIHRhcmdldEhvc3QsIHRhcmdldFBvcnQpOworICAgICAgICBjYXNlIGh0dHA6CisgICAgICAgICAgICB2YXIgdXJpID0gJ2h0dHA6Ly8ke3RhcmdldEhvc3R9OiR7dGFyZ2V0UG9ydH0nOworICAgICAgICAgICAgdHJhY2UoJy0gSFRUUCB0cmFuc3BvcnQgJHVyaScpOworICAgICAgICAgICAgdHJhbnNwb3J0ID0gbmV3IFRIdHRwQ2xpZW50KHVyaSk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB0aHJvdyAiVW5oYW5kbGVkIHRyYW5zcG9ydCI7CisgICAgICAgIH0KKworCisgICAgICAgIC8vIG9wdGluYWwgbGF5ZXJlZCB0cmFuc3BvcnQKKyAgICAgICAgaWYgKCBmcmFtZWQpIHsKKyAgICAgICAgICAgIHRyYWNlKCItIGZyYW1lZCB0cmFuc3BvcnQiKTsKKyAgICAgICAgICAgIHRyYW5zcG9ydCA9IG5ldyBURnJhbWVkVHJhbnNwb3J0KHRyYW5zcG9ydCk7CisgICAgICAgIH0gZWxzZSBpZiAoIGJ1ZmZlcmVkKSB7CisgICAgICAgICAgICB0cmFjZSgiLSBidWZmZXJlZCB0cmFuc3BvcnQiKTsKKyAgICAgICAgICAgIHRyYW5zcG9ydCA9IG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQodHJhbnNwb3J0KTsKKyAgICAgICAgfQorCisKKyAgICAgICAgLy8gcHJvdG9jb2wKKyAgICAgICAgdmFyIHByb3RvY29sIDogVFByb3RvY29sOworICAgICAgICBzd2l0Y2gocHJvdCkKKyAgICAgICAgeworICAgICAgICBjYXNlIGJpbmFyeToKKyAgICAgICAgICAgICB0cmFjZSgiLSBiaW5hcnkgcHJvdG9jb2wiKTsKKyAgICAgICAgICAgICBwcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2woIHRyYW5zcG9ydCk7CisgICAgICAgIGNhc2UganNvbjoKKyAgICAgICAgICAgICB0cmFjZSgiLSBKU09OIHByb3RvY29sIik7CisgICAgICAgICAgICAgcHJvdG9jb2wgPSBuZXcgVEpTT05Qcm90b2NvbCggdHJhbnNwb3J0KTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHRocm93ICJVbmhhbmRsZWQgcHJvdG9jb2wiOworICAgICAgICB9CisKKworICAgICAgICAvLyBwdXQgZXZlcnl0aGluZyB0b2dldGhlcgorICAgICAgICB0cmFuc3BvcnQub3BlbigpOworICAgICAgICByZXR1cm4gbmV3IENhbGN1bGF0b3JJbXBsKHByb3RvY29sLHByb3RvY29sKTsKKyAgICB9CisKKworICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIFJ1bkNsaWVudCgpIDogVm9pZCB7CisgICAgICAgIHZhciBjbGllbnQgPSBDbGllbnRTZXR1cCgpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgIGNsaWVudC5waW5nKCk7CisgICAgICAgICAgICB0cmFjZSgicGluZygpIHN1Y2Nlc3NmdWwiKTsKKyAgICAgICAgfSBjYXRjaChlcnJvciA6IFRFeGNlcHRpb24pIHsKKyAgICAgICAgICAgIHRyYWNlKCdwaW5nKCkgZmFpbGVkOiAkZXJyb3InKTsKKyAgICAgICAgfSBjYXRjaChlcnJvciA6IER5bmFtaWMpIHsKKyAgICAgICAgICAgIHRyYWNlKCdwaW5nKCkgZmFpbGVkOiAkZXJyb3InKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB2YXIgc3VtID0gY2xpZW50LmFkZCggMSwgMSk7CisgICAgICAgICAgICB0cmFjZSgnMSsxPSRzdW0nKTsKKyAgICAgICAgfSBjYXRjaChlcnJvciA6IFRFeGNlcHRpb24pIHsKKyAgICAgICAgICAgIHRyYWNlKCdhZGQoKSBmYWlsZWQ6ICRlcnJvcicpOworICAgICAgICB9IGNhdGNoKGVycm9yIDogRHluYW1pYykgeworICAgICAgICAgICAgdHJhY2UoJ2FkZCgpIGZhaWxlZDogJGVycm9yJyk7CisgICAgICAgIH0KKworCisgICAgICAgIHZhciB3b3JrID0gbmV3IHR1dG9yaWFsLldvcmsoKTsKKyAgICAgICAgd29yay5vcCA9IHR1dG9yaWFsLk9wZXJhdGlvbi5ESVZJREU7CisgICAgICAgIHdvcmsubnVtMSA9IDE7CisgICAgICAgIHdvcmsubnVtMiA9IDA7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB2YXIgcXVvdGllbnQgPSBjbGllbnQuY2FsY3VsYXRlKCAxLCB3b3JrKTsKKyAgICAgICAgICAgIHRyYWNlKCdXaG9hIHdlIGNhbiBkaXZpZGUgYnkgMCEgUmVzdWx0ID0gJHF1b3RpZW50Jyk7CisgICAgICAgIH0gY2F0Y2goZXJyb3IgOiBURXhjZXB0aW9uKSB7CisgICAgICAgICAgICB0cmFjZSgnY2FsY3VsYXRlKCkgZmFpbGVkOiAkZXJyb3InKTsKKyAgICAgICAgfSBjYXRjaChlcnJvciA6IER5bmFtaWMpIHsKKyAgICAgICAgICAgIHRyYWNlKCdjYWxjdWxhdGUoKSBmYWlsZWQ6ICRlcnJvcicpOworICAgICAgICB9CisKKyAgICAgICAgd29yay5vcCA9IHR1dG9yaWFsLk9wZXJhdGlvbi5TVUJUUkFDVDsKKyAgICAgICAgd29yay5udW0xID0gMTU7CisgICAgICAgIHdvcmsubnVtMiA9IDEwOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdmFyIGRpZmYgPSBjbGllbnQuY2FsY3VsYXRlKCAxLCB3b3JrKTsKKyAgICAgICAgICAgIHRyYWNlKCcxNS0xMD0kZGlmZicpOworICAgICAgICB9IGNhdGNoKGVycm9yIDogVEV4Y2VwdGlvbikgeworICAgICAgICAgICAgdHJhY2UoJ2NhbGN1bGF0ZSgpIGZhaWxlZDogJGVycm9yJyk7CisgICAgICAgIH0gY2F0Y2goZXJyb3IgOiBEeW5hbWljKSB7CisgICAgICAgICAgICB0cmFjZSgnY2FsY3VsYXRlKCkgZmFpbGVkOiAkZXJyb3InKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHZhciBsb2cgOiBTaGFyZWRTdHJ1Y3QgPSBjbGllbnQuZ2V0U3RydWN0KCAxKTsKKyAgICAgICAgICAgIHZhciBsb2d2YWwgPSBsb2cudmFsdWU7CisgICAgICAgICAgICB0cmFjZSgnQ2hlY2sgbG9nOiAkbG9ndmFsJyk7CisgICAgICAgIH0gY2F0Y2goZXJyb3IgOiBURXhjZXB0aW9uKSB7CisgICAgICAgICAgICB0cmFjZSgnZ2V0U3RydWN0KCkgZmFpbGVkOiAkZXJyb3InKTsKKyAgICAgICAgfSBjYXRjaChlcnJvciA6IER5bmFtaWMpIHsKKyAgICAgICAgICAgIHRyYWNlKCdnZXRTdHJ1Y3QoKSBmYWlsZWQ6ICRlcnJvcicpOworICAgICAgICB9CisgICAgfQorCisKKyAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBTZXJ2ZXJTZXR1cCgpIDogVFNlcnZlciB7CisgICAgICAgICB0cmFjZSgiU2VydmVyIGNvbmZpZ3VyYXRpb246Iik7CisKKyAgICAgICAgLy8gZW5kcG9pbnQgdHJhbnNwb3J0CisgICAgICAgIHZhciB0cmFuc3BvcnQgOiBUU2VydmVyVHJhbnNwb3J0ID0gbnVsbDsKKyAgICAgICAgc3dpdGNoKHRybnMpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBzb2NrZXQ6CisgICAgICAgICAgICAjaWYgKGZsYXNoIHx8IGpzKQorICAgICAgICAgICAgdGhyb3cgJ2N1cnJlbnQgcGxhdGZvcm0gZG9lcyBub3Qgc3VwcG9ydCBzb2NrZXQgc2VydmVycyc7CisgICAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgIHRyYWNlKCctIHNvY2tldCB0cmFuc3BvcnQgcG9ydCAkdGFyZ2V0UG9ydCcpOworICAgICAgICAgICAgdHJhbnNwb3J0ID0gbmV3IFRTZXJ2ZXJTb2NrZXQoIHRhcmdldFBvcnQpOworICAgICAgICAgICAgI2VuZAorICAgICAgICBjYXNlIGh0dHA6CisgICAgICAgICAgICAjaWYgIXBocHdlYnNlcnZlcgorICAgICAgICAgICAgICB0aHJvdyAiSFRUUCBzZXJ2ZXIgbm90IGltcGxlbWVudGVkIHlldCI7CisgICAgICAgICAgICAgIC8vdHJhY2UoIi0gaHR0cCB0cmFuc3BvcnQiKTsKKyAgICAgICAgICAgICAgLy90cmFuc3BvcnQgPSBuZXcgVEh0dHBDbGllbnQoIHRhcmdldEhvc3QpOworICAgICAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgICAgdHJhY2UoIi0gaHR0cCB0cmFuc3BvcnQiKTsKKyAgICAgICAgICAgICAgdHJhbnNwb3J0ID0gbmV3IFRXcmFwcGluZ1NlcnZlclRyYW5zcG9ydCgKKyAgICAgICAgICAgICAgICAgICAgICBuZXcgVFN0cmVhbVRyYW5zcG9ydCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBURmlsZVN0cmVhbSgicGhwOi8vaW5wdXQiLCBSZWFkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBURmlsZVN0cmVhbSgicGhwOi8vb3V0cHV0IiwgQXBwZW5kKQorICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgICNlbmQKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHRocm93ICJVbmhhbmRsZWQgdHJhbnNwb3J0IjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIG9wdGlvbmFsOiBsYXllcmVkIHRyYW5zcG9ydAorICAgICAgICB2YXIgdHJhbnNmYWN0b3J5IDogVFRyYW5zcG9ydEZhY3RvcnkgPSBudWxsOworICAgICAgICBpZiAoIGZyYW1lZCkgeworICAgICAgICAgICAgdHJhY2UoIi0gZnJhbWVkIHRyYW5zcG9ydCIpOworICAgICAgICAgICAgdHJhbnNmYWN0b3J5ID0gbmV3IFRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5KCk7CisgICAgICAgIH0gZWxzZSBpZiAoIGJ1ZmZlcmVkKSB7CisgICAgICAgICAgICB0cmFjZSgiLSBidWZmZXJlZCB0cmFuc3BvcnQiKTsKKyAgICAgICAgICAgIHRyYW5zZmFjdG9yeSA9IG5ldyBUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBwcm90b2NvbAorICAgICAgICB2YXIgcHJvdGZhY3RvcnkgOiBUUHJvdG9jb2xGYWN0b3J5ID0gbnVsbDsKKyAgICAgICAgc3dpdGNoKHByb3QpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBiaW5hcnk6CisgICAgICAgICAgICAgdHJhY2UoIi0gYmluYXJ5IHByb3RvY29sIik7CisgICAgICAgICAgICAgcHJvdGZhY3RvcnkgPSBuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpOworICAgICAgICBjYXNlIGpzb246CisgICAgICAgICAgICB0cmFjZSgiLSBKU09OIHByb3RvY29sIik7CisgICAgICAgICAgICAgcHJvdGZhY3RvcnkgPSBuZXcgVEpTT05Qcm90b2NvbEZhY3RvcnkoKTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHRocm93ICJVbmhhbmRsZWQgcHJvdG9jb2wiOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGhhbmRsZXIgPSBuZXcgQ2FsY3VsYXRvckhhbmRsZXIoKTsKKyAgICAgICAgdmFyIHByb2Nlc3NvciA9IG5ldyBDYWxjdWxhdG9yUHJvY2Vzc29yKGhhbmRsZXIpOworICAgICAgICB2YXIgc2VydmVyID0gbmV3IFRTaW1wbGVTZXJ2ZXIoIHByb2Nlc3NvciwgdHJhbnNwb3J0LCB0cmFuc2ZhY3RvcnksIHByb3RmYWN0b3J5KTsKKyAgICAgICAgI2lmIHBocHdlYnNlcnZlcgorICAgICAgICBzZXJ2ZXIucnVuT25jZSA9IHRydWU7CisgICAgICAgICNlbmQKKworICAgICAgICByZXR1cm4gc2VydmVyOworICAgIH0KKworCisgICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gUnVuU2VydmVyKCkgOiBWb2lkIHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBzZXJ2ZXIgPSBTZXJ2ZXJTZXR1cCgpOworCisgICAgICAgICAgICB0cmFjZSgiXG5TdGFydGluZyB0aGUgc2VydmVyLi4uIik7CisgICAgICAgICAgICBzZXJ2ZXIuU2VydmUoKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCggZSA6IER5bmFtaWMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyYWNlKCdSdW5TZXJ2ZXIoKSBmYWlsZWQ6ICRlJyk7CisgICAgICAgIH0KKyAgICAgICAgdHJhY2UoImRvbmUuIik7CisgICAgfQorCit9CisKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2hzL0hhc2tlbGxTZXJ2ZXIuaHMgYi90dXRvcmlhbC9ocy9IYXNrZWxsU2VydmVyLmhzCmluZGV4IDc3ZjE2NzkuLmNmZTEzNDQgMTAwNjQ0Ci0tLSBhL3R1dG9yaWFsL2hzL0hhc2tlbGxTZXJ2ZXIuaHMKKysrIGIvdHV0b3JpYWwvaHMvSGFza2VsbFNlcnZlci5ocwpAQCAtNzQsNyArNzQsNyBAQAogICAgICAgICAgICAgICAgICAgICBpZiBudW0yIHdvcmsgPT0gMCB0aGVuCiAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyAkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnZhbGlkT3BlcmF0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRPcGVyYXRpb25fd2hhdCA9IGZyb21JbnRlZ3JhbCAkIGZyb21FbnVtICQgb3Agd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRPcGVyYXRpb25fd2hhdE9wID0gZnJvbUludGVncmFsICQgZnJvbUVudW0gJCBvcCB3b3JrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZE9wZXJhdGlvbl93aHkgPSAiQ2Fubm90IGRpdmlkZSBieSAwIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGVsc2UKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2hzL0xJQ0VOU0UgYi90dXRvcmlhbC9ocy9MSUNFTlNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiNmQ3ZDcKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9ocy9MSUNFTlNFCkBAIC0wLDAgKzEsMjM5IEBACisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0CisgICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCisKKyAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgorCisgICAxLiBEZWZpbml0aW9ucy4KKworICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKKyAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgorCisgICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQorICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCisgICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCisgICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAorICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCisgICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgorICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCisgICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgorCisgICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgorCisgICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKKyAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KKyAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCisKKyAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCisgICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CisgICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCisgICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCisKKyAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCisgICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCisgICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKKyAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCisKKyAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKKyAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKKyAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKKyAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCisgICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KKyAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKKyAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCisKKyAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCisgICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCisgICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKKyAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKKyAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgorICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCisgICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50CisgICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bworICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKKyAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCisgICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKKyAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCisgICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKKworICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAorICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCisKKyAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAorICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCisgICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgorCisgICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKKyAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAorICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKKyAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCisgICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCisgICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQorICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKKyAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKKyAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0CisgICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCisgICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKKyAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KKworICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKKyAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAorICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKKyAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgorICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCisKKyAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKKworICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCisgICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAorICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCisgICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgorICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKKworICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCisgICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAorICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAorICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAorICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQorICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCisgICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgorICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAorICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKKyAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKKyAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCisgICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KKyAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQorICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAorICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAorICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KKworICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCisgICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCisgICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKKyAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAorICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KKworICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAorICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCisgICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCisgICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5CisgICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAorICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgorCisgICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCisgICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCisgICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKKyAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgorCisgICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKKyAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKKyAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisgICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucworICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQorICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCisgICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKKyAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KKworICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCisgICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKKyAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5CisgICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQorICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAorICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCisgICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCisgICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCisgICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAorICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgorICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgorCisgICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCisgICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAorICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKKyAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCisgICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQorICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKKyAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKKyAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQorICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgorICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCisKKyAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworCisgICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCisKKyAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nCisgICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCisgICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQorICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUKKyAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQorICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQorICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyCisgICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCisKKyAgIENvcHlyaWdodCBbeXl5eV0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXQorCisgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU09GVFdBUkUgRElTVFJJQlVURUQgV0lUSCBUSFJJRlQ6CisKK1RoZSBBcGFjaGUgVGhyaWZ0IHNvZnR3YXJlIGluY2x1ZGVzIGEgbnVtYmVyIG9mIHN1YmNvbXBvbmVudHMgd2l0aAorc2VwYXJhdGUgY29weXJpZ2h0IG5vdGljZXMgYW5kIGxpY2Vuc2UgdGVybXMuIFlvdXIgdXNlIG9mIHRoZSBzb3VyY2UKK2NvZGUgZm9yIHRoZSB0aGVzZSBzdWJjb21wb25lbnRzIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZAorY29uZGl0aW9ucyBvZiB0aGUgZm9sbG93aW5nIGxpY2Vuc2VzLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUG9ydGlvbnMgb2YgdGhlIGZvbGxvd2luZyBmaWxlcyBhcmUgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlOgorCisgIGxpYi9lcmwvc3JjL01ha2VmaWxlLmFtCisKK1BsZWFzZSBzZWUgZG9jL290cC1iYXNlLWxpY2Vuc2UudHh0IGZvciB0aGUgZnVsbCB0ZXJtcyBvZiB0aGlzIGxpY2Vuc2UuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitGb3IgdGhlIGFjbG9jYWwvYXhfYm9vc3RfYmFzZS5tNCBhbmQgY29udHJpYi9mYjMwMy9hY2xvY2FsL2F4X2Jvb3N0X2Jhc2UubTQgY29tcG9uZW50czoKKworIyAgIENvcHlyaWdodCAoYykgMjAwNyBUaG9tYXMgUG9yc2NoYmVyZyA8dGhvbWFzQHJhbmRzcHJpbmdlci5kZT4KKyMKKyMgICBDb3B5aW5nIGFuZCBkaXN0cmlidXRpb24gb2YgdGhpcyBmaWxlLCB3aXRoIG9yIHdpdGhvdXQKKyMgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgaW4gYW55IG1lZGl1bSB3aXRob3V0IHJveWFsdHkgcHJvdmlkZWQKKyMgICB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBub3RpY2UgYXJlIHByZXNlcnZlZC4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0ZvciB0aGUgbGliL25vZGVqcy9saWIvdGhyaWZ0L2pzb25fcGFyc2UuanM6CisKKy8qCisgICAganNvbl9wYXJzZS5qcworICAgIDIwMTUtMDUtMDIKKyAgICBQdWJsaWMgRG9tYWluLgorICAgIE5PIFdBUlJBTlRZIEVYUFJFU1NFRCBPUiBJTVBMSUVELiBVU0UgQVQgWU9VUiBPV04gUklTSy4KKworKi8KKyhCeSBEb3VnbGFzIENyb2NrZm9yZCA8ZG91Z2xhc0Bjcm9ja2ZvcmQuY29tPikKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS90dXRvcmlhbC9ocy9NYWtlZmlsZS5hbSBiL3R1dG9yaWFsL2hzL01ha2VmaWxlLmFtCmluZGV4IGYyNzRlYjYuLmEzZWNjYzIgMTAwNzU1Ci0tLSBhL3R1dG9yaWFsL2hzL01ha2VmaWxlLmFtCisrKyBiL3R1dG9yaWFsL2hzL01ha2VmaWxlLmFtCkBAIC0zNywzICszNyw2IEBACiAKIHR1dG9yaWFsY2xpZW50OiBhbGwKIAlkaXN0L2J1aWxkL0hhc2tlbGxDbGllbnQvSGFza2VsbENsaWVudAorCitFWFRSQV9ESVNUID0gXAorCUxJQ0VOU0UKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2hzL1RocmlmdFR1dG9yaWFsLmNhYmFsIGIvdHV0b3JpYWwvaHMvVGhyaWZ0VHV0b3JpYWwuY2FiYWwKaW5kZXggZTZmMDE4Mi4uNjJlNjgyZiAxMDA3NTUKLS0tIGEvdHV0b3JpYWwvaHMvVGhyaWZ0VHV0b3JpYWwuY2FiYWwKKysrIGIvdHV0b3JpYWwvaHMvVGhyaWZ0VHV0b3JpYWwuY2FiYWwKQEAgLTE4LDcgKzE4LDcgQEAKIC0tCiAKIE5hbWU6ICAgICAgICAgICBUaHJpZnRUdXRvcmlhbAotVmVyc2lvbjogICAgICAgIDAuMS4wCitWZXJzaW9uOiAgICAgICAgMS4wLjAKIENhYmFsLVZlcnNpb246ICA+PSAxLjQKIExpY2Vuc2U6ICAgICAgICBPdGhlckxpY2Vuc2UKIENhdGVnb3J5OiAgICAgICBGb3JlaWduCkBAIC0yNyw3ICsyNyw3IEBACiBIb21lcGFnZTogICAgICAgaHR0cDovL3RocmlmdC5hcGFjaGUub3JnCiBCdWctUmVwb3J0czogICAgaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQKIE1haW50YWluZXI6ICAgICBkZXZAdGhyaWZ0LmFwYWNoZS5vcmcKLUxpY2Vuc2UtRmlsZTogICAuLi8uLi9MSUNFTlNFCitMaWNlbnNlLUZpbGU6ICAgTElDRU5TRQogCiBEZXNjcmlwdGlvbjoKICAgSGFza2VsbCB0dXRvcmlhbCBmb3IgdGhlIEFwYWNoZSBUaHJpZnQgUlBDIHN5c3RlbS4gUmVxdWlyZXMgdGhlIHVzZSBvZiB0aGUgdGhyaWZ0IGNvZGUgZ2VuZXJhdG9yLgpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvamF2YS9idWlsZC54bWwgYi90dXRvcmlhbC9qYXZhL2J1aWxkLnhtbAppbmRleCBlY2VlY2E3Li41NWNkYjhmIDEwMDY0NAotLS0gYS90dXRvcmlhbC9qYXZhL2J1aWxkLnhtbAorKysgYi90dXRvcmlhbC9qYXZhL2J1aWxkLnhtbApAQCAtMjUsMTEgKzI1LDEzIEBACiAgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZCIgbG9jYXRpb249ImJ1aWxkIiAvPgogCiAgIDxwYXRoIGlkPSJsaWJzLmNsYXNzcGF0aCI+Ci0gICAgPGZpbGVzZXQgZGlyPSIuLi8uLi9saWIvamF2YS9idWlsZCI+Ci0gICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciIgLz4KLSAgICAgIDxleGNsdWRlIG5hbWU9Ii10ZXN0LmphciIgLz4KKyAgICA8ZmlsZXNldCBkaXI9Ii4uLy4uL2xpYi9qYXZhL2J1aWxkL2xpYnMiPgorICAgICAgPGluY2x1ZGUgbmFtZT0ibGlidGhyaWZ0Ki5qYXIiIC8+CisgICAgICA8ZXhjbHVkZSBuYW1lPSJsaWJ0aHJpZnQqdGVzdC5qYXIiIC8+CisgICAgICA8ZXhjbHVkZSBuYW1lPSJsaWJ0aHJpZnQqamF2YWRvYy5qYXIiIC8+CisgICAgICA8ZXhjbHVkZSBuYW1lPSJsaWJ0aHJpZnQqc291cmNlcy5qYXIiIC8+CiAgICAgPC9maWxlc2V0PgotICAgIDxmaWxlc2V0IGRpcj0iLi4vLi4vbGliL2phdmEvYnVpbGQvbGliIj4KKyAgICA8ZmlsZXNldCBkaXI9Ii4uLy4uL2xpYi9qYXZhL2J1aWxkL2RlcHMiPgogICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiIC8+CiAgICAgPC9maWxlc2V0PgogICA8L3BhdGg+CkBAIC00Miw3ICs0NCw3IEBACiAgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7YnVpbGR9IiAvPgogICAgIDxwYXRoZWxlbWVudCBwYXRoPSJ0dXRvcmlhbC5qYXIiIC8+CiAgIDwvcGF0aD4KLSAgCisKICAgPHRhcmdldCBuYW1lPSJpbml0Ij4KICAgICA8dHN0YW1wIC8+CiAgICAgPG1rZGlyIGRpcj0iJHtidWlsZH0iLz4KQEAgLTUwLDggKzUyLDggQEAKICAgPC90YXJnZXQ+CiAKICAgPHRhcmdldCBuYW1lPSJjb21waWxlIiBkZXBlbmRzPSJpbml0LCBnZW5lcmF0ZSI+Ci0gICAgPGphdmFjIHNyY2Rpcj0iJHtnZW59IiBkZXN0ZGlyPSIke2J1aWxkfSIgY2xhc3NwYXRocmVmPSJsaWJzLmNsYXNzcGF0aCIgLz4KLSAgICA8amF2YWMgc3JjZGlyPSIke3NyY30iIGRlc3RkaXI9IiR7YnVpbGR9IiBjbGFzc3BhdGhyZWY9ImJ1aWxkLmNsYXNzcGF0aCIgLz4KKyAgICA8amF2YWMgY29tcGlsZXI9Im1vZGVybiIgaW5jbHVkZWFudHJ1bnRpbWU9ImZhbHNlIiBzcmNkaXI9IiR7Z2VufSIgZGVzdGRpcj0iJHtidWlsZH0iIGNsYXNzcGF0aHJlZj0ibGlicy5jbGFzc3BhdGgiIC8+CisgICAgPGphdmFjIGNvbXBpbGVyPSJtb2Rlcm4iIGluY2x1ZGVhbnRydW50aW1lPSJmYWxzZSIgc3JjZGlyPSIke3NyY30iIGRlc3RkaXI9IiR7YnVpbGR9IiBjbGFzc3BhdGhyZWY9ImJ1aWxkLmNsYXNzcGF0aCIgLz4KICAgPC90YXJnZXQ+CiAKICAgPHRhcmdldCBuYW1lPSJ0ZXN0IiBkZXBlbmRzPSJ0dXRvcmlhbCIgLz4KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2phdmEvc3JjL0NhbGN1bGF0b3JIYW5kbGVyLmphdmEgYi90dXRvcmlhbC9qYXZhL3NyYy9DYWxjdWxhdG9ySGFuZGxlci5qYXZhCmluZGV4IDQyMTZiZTUuLjkyOTQ0YjAgMTAwNjQ0Ci0tLSBhL3R1dG9yaWFsL2phdmEvc3JjL0NhbGN1bGF0b3JIYW5kbGVyLmphdmEKKysrIGIvdHV0b3JpYWwvamF2YS9zcmMvQ2FsY3VsYXRvckhhbmRsZXIuamF2YQpAQCAtNTgsNyArNTgsNyBAQAogICAgIGNhc2UgRElWSURFOgogICAgICAgaWYgKHdvcmsubnVtMiA9PSAwKSB7CiAgICAgICAgIEludmFsaWRPcGVyYXRpb24gaW8gPSBuZXcgSW52YWxpZE9wZXJhdGlvbigpOwotICAgICAgICBpby53aGF0ID0gd29yay5vcC5nZXRWYWx1ZSgpOworICAgICAgICBpby53aGF0T3AgPSB3b3JrLm9wLmdldFZhbHVlKCk7CiAgICAgICAgIGlvLndoeSA9ICJDYW5ub3QgZGl2aWRlIGJ5IDAiOwogICAgICAgICB0aHJvdyBpbzsKICAgICAgIH0KQEAgLTY2LDcgKzY2LDcgQEAKICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6CiAgICAgICBJbnZhbGlkT3BlcmF0aW9uIGlvID0gbmV3IEludmFsaWRPcGVyYXRpb24oKTsKLSAgICAgIGlvLndoYXQgPSB3b3JrLm9wLmdldFZhbHVlKCk7CisgICAgICBpby53aGF0T3AgPSB3b3JrLm9wLmdldFZhbHVlKCk7CiAgICAgICBpby53aHkgPSAiVW5rbm93biBvcGVyYXRpb24iOwogICAgICAgdGhyb3cgaW87CiAgICAgfQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvanMvYnVpbGQueG1sIGIvdHV0b3JpYWwvanMvYnVpbGQueG1sCmluZGV4IDczZDUzNWQuLjAzYTZlN2MgMTAwNjQ0Ci0tLSBhL3R1dG9yaWFsL2pzL2J1aWxkLnhtbAorKysgYi90dXRvcmlhbC9qcy9idWlsZC54bWwKQEAgLTMxLDExICszMSwxMyBAQAogICA8cHJvcGVydHkgbmFtZT0idGhyaWZ0LmphdmEuZGlyIiBsb2NhdGlvbj0iJHt0aHJpZnQuZGlyfS9saWIvamF2YSIgLz4KIAogICA8cGF0aCBpZD0ibGlicy5jbGFzc3BhdGgiPgotICAgIDxmaWxlc2V0IGRpcj0iLi4vLi4vbGliL2phdmEvYnVpbGQiPgotICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiIC8+Ci0gICAgICA8ZXhjbHVkZSBuYW1lPSItdGVzdC5qYXIiIC8+CisgICAgPGZpbGVzZXQgZGlyPSIke3RocmlmdC5qYXZhLmRpcn0vYnVpbGQvbGlicyI+CisgICAgICA8aW5jbHVkZSBuYW1lPSJsaWJ0aHJpZnQqLmphciIgLz4KKyAgICAgIDxleGNsdWRlIG5hbWU9ImxpYnRocmlmdCp0ZXN0LmphciIgLz4KKyAgICAgIDxleGNsdWRlIG5hbWU9ImxpYnRocmlmdCpqYXZhZG9jLmphciIgLz4KKyAgICAgIDxleGNsdWRlIG5hbWU9ImxpYnRocmlmdCpzb3VyY2VzLmphciIgLz4KICAgICA8L2ZpbGVzZXQ+Ci0gICAgPGZpbGVzZXQgZGlyPSIuLi8uLi9saWIvamF2YS9idWlsZC9saWIiPgorICAgIDxmaWxlc2V0IGRpcj0iJHt0aHJpZnQuamF2YS5kaXJ9L2J1aWxkL2RlcHMiPgogICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiIC8+CiAgICAgPC9maWxlc2V0PgogICA8L3BhdGg+CkBAIC01MSwxMyArNTMsMTMgQEAKICAgPC90YXJnZXQ+CiAKICAgPHRhcmdldCBuYW1lPSJjb21waWxlIiBkZXBlbmRzPSJpbml0Ij4KLSAgICA8amF2YWMgc3JjZGlyPSIke2dlbn0iIGRlc3RkaXI9IiR7YnVpbGR9IiBjbGFzc3BhdGhyZWY9ImxpYnMuY2xhc3NwYXRoIiAvPgotICAgIDxqYXZhYyBzcmNkaXI9IiR7amF2YXNyY30iIGRlc3RkaXI9IiR7YnVpbGR9IiBjbGFzc3BhdGhyZWY9ImJ1aWxkLmNsYXNzcGF0aCI+CisgICAgPGphdmFjIGNvbXBpbGVyPSJtb2Rlcm4iIGluY2x1ZGVhbnRydW50aW1lPSJmYWxzZSIgc3JjZGlyPSIke2dlbn0iIGRlc3RkaXI9IiR7YnVpbGR9IiBjbGFzc3BhdGhyZWY9ImxpYnMuY2xhc3NwYXRoIiAvPgorICAgIDxqYXZhYyBjb21waWxlcj0ibW9kZXJuIiBpbmNsdWRlYW50cnVudGltZT0iZmFsc2UiIHNyY2Rpcj0iJHtqYXZhc3JjfSIgZGVzdGRpcj0iJHtidWlsZH0iIGNsYXNzcGF0aHJlZj0iYnVpbGQuY2xhc3NwYXRoIj4KICAgICAgIDxleGNsdWRlIG5hbWU9IkphdmFDbGllbnQuamF2YSIvPgogICAgICAgPGV4Y2x1ZGUgbmFtZT0iSmF2YVNlcnZlci5qYXZhIi8+CiAgICAgICA8aW5jbHVkZSBuYW1lPSJDYWxjdWxhdG9ySGFuZGxlci5qYXZhIi8+CiAgICAgPC9qYXZhYz4KLSAgICA8amF2YWMgc3JjZGlyPSIke3NyY30iIGRlc3RkaXI9IiR7YnVpbGR9IiBjbGFzc3BhdGhyZWY9ImJ1aWxkLmNsYXNzcGF0aCI+CisgICAgPGphdmFjIGNvbXBpbGVyPSJtb2Rlcm4iIGluY2x1ZGVhbnRydW50aW1lPSJmYWxzZSIgc3JjZGlyPSIke3NyY30iIGRlc3RkaXI9IiR7YnVpbGR9IiBjbGFzc3BhdGhyZWY9ImJ1aWxkLmNsYXNzcGF0aCI+CiAgICAgICA8Y29tcGlsZXJhcmcgdmFsdWU9Ii1YbGludDphbGwiLz4KICAgICA8L2phdmFjPgogICA8L3RhcmdldD4KQEAgLTgwLDcgKzgyLDcgQEAKICAgICAgIDxhcmcgbGluZT0iLS1nZW4ganMgLXIgIC4uL3R1dG9yaWFsLnRocmlmdCIvPgogICAgIDwvZXhlYz4KICAgPC90YXJnZXQ+Ci0gIAorCiAgIDx0YXJnZXQgbmFtZT0iY2xlYW4iPgogICAgIDxkZWxldGUgZGlyPSIke2J1aWxkfSIgLz4KICAgICA8ZGVsZXRlIGRpcj0iZ2VuLWpzIi8+CmRpZmYgLS1naXQgYS90dXRvcmlhbC9qcy90dXRvcmlhbC5odG1sIGIvdHV0b3JpYWwvanMvdHV0b3JpYWwuaHRtbAppbmRleCBkN2YzOTQ1Li5kMDIwYmVkIDEwMDc1NQotLS0gYS90dXRvcmlhbC9qcy90dXRvcmlhbC5odG1sCisrKyBiL3R1dG9yaWFsL2pzL3R1dG9yaWFsLmh0bWwKQEAgLTk4LDcgKzk4LDcgQEAKICAgPC90YWJsZT4KICAgPC9mb3JtPgogICAKLSAgPHA+VGhpcyBKYXZhIFNjcmlwdCBleGFtcGxlIHVzZXMgPGEgaHJlZj0iaHR0cHM6Ly9naXQtd2lwLXVzLmFwYWNoZS5vcmcvcmVwb3MvYXNmP3A9dGhyaWZ0LmdpdDthPWJsb2I7Zj10dXRvcmlhbC90dXRvcmlhbC50aHJpZnQ7aGI9SEVBRCI+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+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iTWljcm9zb2Z0LkV4dGVuc2lvbnMuQ29uZmlndXJhdGlvbi5GaWxlRXh0ZW5zaW9ucyIgVmVyc2lvbj0iWzIuMCwpIiAvPgorICA8L0l0ZW1Hcm91cD4KKworPC9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvbmV0Y29yZS9TZXJ2ZXIvVGhyaWZ0VGVzdC5wZnggYi90dXRvcmlhbC9uZXRjb3JlL1NlcnZlci9UaHJpZnRUZXN0LnBmeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGRlZDI4Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvbmV0Y29yZS9TZXJ2ZXIvVGhyaWZ0VGVzdC5wZngKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvbmV0Y29yZS9UdXRvcmlhbC5zbG4gYi90dXRvcmlhbC9uZXRjb3JlL1R1dG9yaWFsLnNsbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGRjZDQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvbmV0Y29yZS9UdXRvcmlhbC5zbG4KQEAgLTAsMCArMSw3OCBAQAorTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gU29sdXRpb24gRmlsZSwgRm9ybWF0IFZlcnNpb24gMTIuMDAKKyMgVmlzdWFsIFN0dWRpbyAxNQorVmlzdWFsU3R1ZGlvVmVyc2lvbiA9IDE1LjAuMjYxMTQuMgorTWluaW11bVZpc3VhbFN0dWRpb1ZlcnNpb24gPSAxMC4wLjQwMjE5LjEKK1Byb2plY3QoIns5QTE5MTAzRi0xNkY3LTQ2NjgtQkU1NC05QTFFN0E0Rjc1NTZ9IikgPSAiVGhyaWZ0IiwgIi4uXC4uXGxpYlxuZXRjb3JlXFRocmlmdFxUaHJpZnQuY3Nwcm9qIiwgIntDMjBFQTJBOS03NjYwLTQ3REUtOUE0OS1EMUVGMTJGQjI4OTV9IgorRW5kUHJvamVjdAorUHJvamVjdCgiezlBMTkxMDNGLTE2RjctNDY2OC1CRTU0LTlBMUU3QTRGNzU1Nn0iKSA9ICJJbnRlcmZhY2VzIiwgIkludGVyZmFjZXNcSW50ZXJmYWNlcy5jc3Byb2oiLCAie0I5RTI0RDg0LTI3MTItNDE1OC04RjFBLURERTQ0Q0QxQkIwQX0iCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7OUExOTEwM0YtMTZGNy00NjY4LUJFNTQtOUExRTdBNEY3NTU2fSIpID0gIkNsaWVudCIsICJDbGllbnRcQ2xpZW50LmNzcHJvaiIsICJ7RTRDQTFFRjAtQjE4MS00QTVELUEwMkMtREIwNzUwQTU5Q0RGfSIKK0VuZFByb2plY3QKK1Byb2plY3QoIns5QTE5MTAzRi0xNkY3LTQ2NjgtQkU1NC05QTFFN0E0Rjc1NTZ9IikgPSAiU2VydmVyIiwgIlNlcnZlclxTZXJ2ZXIuY3Nwcm9qIiwgIntFMDhGNUI4NC0yQjRBLTRFMDktODJEMS1FMDcxNTc3NUNFNUV9IgorRW5kUHJvamVjdAorR2xvYmFsCisJR2xvYmFsU2VjdGlvbihTb2x1dGlvbkNvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcHJlU29sdXRpb24KKwkJRGVidWd8QW55IENQVSA9IERlYnVnfEFueSBDUFUKKwkJRGVidWd8eDY0ID0gRGVidWd8eDY0CisJCURlYnVnfHg4NiA9IERlYnVnfHg4NgorCQlSZWxlYXNlfEFueSBDUFUgPSBSZWxlYXNlfEFueSBDUFUKKwkJUmVsZWFzZXx4NjQgPSBSZWxlYXNlfHg2NAorCQlSZWxlYXNlfHg4NiA9IFJlbGVhc2V8eDg2CisJRW5kR2xvYmFsU2VjdGlvbgorCUdsb2JhbFNlY3Rpb24oUHJvamVjdENvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcG9zdFNvbHV0aW9uCisJCXtDMjBFQTJBOS03NjYwLTQ3REUtOUE0OS1EMUVGMTJGQjI4OTV9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7QzIwRUEyQTktNzY2MC00N0RFLTlBNDktRDFFRjEyRkIyODk1fS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtDMjBFQTJBOS03NjYwLTQ3REUtOUE0OS1EMUVGMTJGQjI4OTV9LkRlYnVnfHg2NC5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtDMjBFQTJBOS03NjYwLTQ3REUtOUE0OS1EMUVGMTJGQjI4OTV9LkRlYnVnfHg2NC5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7QzIwRUEyQTktNzY2MC00N0RFLTlBNDktRDFFRjEyRkIyODk1fS5EZWJ1Z3x4ODYuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7QzIwRUEyQTktNzY2MC00N0RFLTlBNDktRDFFRjEyRkIyODk1fS5EZWJ1Z3x4ODYuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7QzIwRUEyQTktNzY2MC00N0RFLTlBNDktRDFFRjEyRkIyODk1fS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7QzIwRUEyQTktNzY2MC00N0RFLTlBNDktRDFFRjEyRkIyODk1fS5SZWxlYXNlfHg2NC5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uUmVsZWFzZXx4NjQuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7QzIwRUEyQTktNzY2MC00N0RFLTlBNDktRDFFRjEyRkIyODk1fS5SZWxlYXNlfHg4Ni5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uUmVsZWFzZXx4ODYuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7QjlFMjREODQtMjcxMi00MTU4LThGMUEtRERFNDRDRDFCQjBBfS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJe0I5RTI0RDg0LTI3MTItNDE1OC04RjFBLURERTQ0Q0QxQkIwQX0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7QjlFMjREODQtMjcxMi00MTU4LThGMUEtRERFNDRDRDFCQjBBfS5EZWJ1Z3x4NjQuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7QjlFMjREODQtMjcxMi00MTU4LThGMUEtRERFNDRDRDFCQjBBfS5EZWJ1Z3x4NjQuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJe0I5RTI0RDg0LTI3MTItNDE1OC04RjFBLURERTQ0Q0QxQkIwQX0uRGVidWd8eDg2LkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJe0I5RTI0RDg0LTI3MTItNDE1OC04RjFBLURERTQ0Q0QxQkIwQX0uRGVidWd8eDg2LkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtCOUUyNEQ4NC0yNzEyLTQxNTgtOEYxQS1EREU0NENEMUJCMEF9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0I5RTI0RDg0LTI3MTItNDE1OC04RjFBLURERTQ0Q0QxQkIwQX0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0I5RTI0RDg0LTI3MTItNDE1OC04RjFBLURERTQ0Q0QxQkIwQX0uUmVsZWFzZXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtCOUUyNEQ4NC0yNzEyLTQxNTgtOEYxQS1EREU0NENEMUJCMEF9LlJlbGVhc2V8eDY0LkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0I5RTI0RDg0LTI3MTItNDE1OC04RjFBLURERTQ0Q0QxQkIwQX0uUmVsZWFzZXx4ODYuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtCOUUyNEQ4NC0yNzEyLTQxNTgtOEYxQS1EREU0NENEMUJCMEF9LlJlbGVhc2V8eDg2LkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0U0Q0ExRUYwLUIxODEtNEE1RC1BMDJDLURCMDc1MEE1OUNERn0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtFNENBMUVGMC1CMTgxLTRBNUQtQTAyQy1EQjA3NTBBNTlDREZ9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJe0U0Q0ExRUYwLUIxODEtNEE1RC1BMDJDLURCMDc1MEE1OUNERn0uRGVidWd8eDY0LkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJe0U0Q0ExRUYwLUIxODEtNEE1RC1BMDJDLURCMDc1MEE1OUNERn0uRGVidWd8eDY0LkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtFNENBMUVGMC1CMTgxLTRBNUQtQTAyQy1EQjA3NTBBNTlDREZ9LkRlYnVnfHg4Ni5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtFNENBMUVGMC1CMTgxLTRBNUQtQTAyQy1EQjA3NTBBNTlDREZ9LkRlYnVnfHg4Ni5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7RTRDQTFFRjAtQjE4MS00QTVELUEwMkMtREIwNzUwQTU5Q0RGfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtFNENBMUVGMC1CMTgxLTRBNUQtQTAyQy1EQjA3NTBBNTlDREZ9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtFNENBMUVGMC1CMTgxLTRBNUQtQTAyQy1EQjA3NTBBNTlDREZ9LlJlbGVhc2V8eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7RTRDQTFFRjAtQjE4MS00QTVELUEwMkMtREIwNzUwQTU5Q0RGfS5SZWxlYXNlfHg2NC5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtFNENBMUVGMC1CMTgxLTRBNUQtQTAyQy1EQjA3NTBBNTlDREZ9LlJlbGVhc2V8eDg2LkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7RTRDQTFFRjAtQjE4MS00QTVELUEwMkMtREIwNzUwQTU5Q0RGfS5SZWxlYXNlfHg4Ni5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtFMDhGNUI4NC0yQjRBLTRFMDktODJEMS1FMDcxNTc3NUNFNUV9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7RTA4RjVCODQtMkI0QS00RTA5LTgyRDEtRTA3MTU3NzVDRTVFfS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtFMDhGNUI4NC0yQjRBLTRFMDktODJEMS1FMDcxNTc3NUNFNUV9LkRlYnVnfHg2NC5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtFMDhGNUI4NC0yQjRBLTRFMDktODJEMS1FMDcxNTc3NUNFNUV9LkRlYnVnfHg2NC5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7RTA4RjVCODQtMkI0QS00RTA5LTgyRDEtRTA3MTU3NzVDRTVFfS5EZWJ1Z3x4ODYuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7RTA4RjVCODQtMkI0QS00RTA5LTgyRDEtRTA3MTU3NzVDRTVFfS5EZWJ1Z3x4ODYuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJe0UwOEY1Qjg0LTJCNEEtNEUwOS04MkQxLUUwNzE1Nzc1Q0U1RX0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7RTA4RjVCODQtMkI0QS00RTA5LTgyRDEtRTA3MTU3NzVDRTVFfS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7RTA4RjVCODQtMkI0QS00RTA5LTgyRDEtRTA3MTU3NzVDRTVFfS5SZWxlYXNlfHg2NC5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0UwOEY1Qjg0LTJCNEEtNEUwOS04MkQxLUUwNzE1Nzc1Q0U1RX0uUmVsZWFzZXx4NjQuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7RTA4RjVCODQtMkI0QS00RTA5LTgyRDEtRTA3MTU3NzVDRTVFfS5SZWxlYXNlfHg4Ni5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0UwOEY1Qjg0LTJCNEEtNEUwOS04MkQxLUUwNzE1Nzc1Q0U1RX0uUmVsZWFzZXx4ODYuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCUVuZEdsb2JhbFNlY3Rpb24KKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uUHJvcGVydGllcykgPSBwcmVTb2x1dGlvbgorCQlIaWRlU29sdXRpb25Ob2RlID0gRkFMU0UKKwlFbmRHbG9iYWxTZWN0aW9uCisJR2xvYmFsU2VjdGlvbihFeHRlbnNpYmlsaXR5R2xvYmFscykgPSBwb3N0U29sdXRpb24KKwkJU29sdXRpb25HdWlkID0gezA3MEE1RDFELUIyOUQtNDYwMy05OTlELTY5M0RCNDQ0QUQwRH0KKwlFbmRHbG9iYWxTZWN0aW9uCitFbmRHbG9iYWwKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL25ldGNvcmUvYnVpbGQuY21kIGIvdHV0b3JpYWwvbmV0Y29yZS9idWlsZC5jbWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI4NGVmMgotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL25ldGNvcmUvYnVpbGQuY21kCkBAIC0wLDAgKzEsMjUgQEAKK0BlY2hvIG9mZgorcmVtIC8qCityZW0gICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorcmVtICAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCityZW0gICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlbSAgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK3JlbSAgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCityZW0gICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorcmVtICAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorcmVtICAqCityZW0gICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKK3JlbSAgKgorcmVtICAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3JlbSAgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorcmVtICAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorcmVtICAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCityZW0gICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworcmVtICAqIHVuZGVyIHRoZSBMaWNlbnNlLgorcmVtICAqLworc2V0bG9jYWwKKworZG90bmV0IC0taW5mbworZG90bmV0IGJ1aWxkCisKKzplb2YKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL25ldGNvcmUvYnVpbGQuc2ggYi90dXRvcmlhbC9uZXRjb3JlL2J1aWxkLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmM5N2UzMTAKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9uZXRjb3JlL2J1aWxkLnNoCkBAIC0wLDAgKzEsMjYgQEAKKyMhL3Vzci9iaW4vZW52IGJhc2gKKworIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyNleGl0IGlmIGFueSBjb21tYW5kIGZhaWxzCitzZXQgLWUKKworZG90bmV0IC0taW5mbworZG90bmV0IGJ1aWxkCmRpZmYgLS1naXQgYS90dXRvcmlhbC9ub2RlanMvTWFrZWZpbGUuYW0gYi90dXRvcmlhbC9ub2RlanMvTWFrZWZpbGUuYW0KaW5kZXggZWNmM2IyYi4uMTUxNmZlYyAxMDA2NDQKLS0tIGEvdHV0b3JpYWwvbm9kZWpzL01ha2VmaWxlLmFtCisrKyBiL3R1dG9yaWFsL25vZGVqcy9NYWtlZmlsZS5hbQpAQCAtMTcsOCArMTcsNiBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotVEhSSUZUID0gJCh0b3BfYnVpbGRkaXIpL2NvbXBpbGVyL2NwcC90aHJpZnQKLQogZ2VuLW5vZGVqcy9DYWxjdWxhdG9yLmpzIGdlbi1ub2RlanMvU2hhcmVkU2VydmljZS5qczogJCh0b3Bfc3JjZGlyKS90dXRvcmlhbC90dXRvcmlhbC50aHJpZnQKIAkkKFRIUklGVCkgLS1nZW4ganM6bm9kZSAtciAkPAogCmRpZmYgLS1naXQgYS90dXRvcmlhbC9ub2RlanMvTm9kZUNsaWVudC5qcyBiL3R1dG9yaWFsL25vZGVqcy9Ob2RlQ2xpZW50LmpzCmluZGV4IDc0YWE1NWEuLmI0ODg2ZTggMTAwNjQ0Ci0tLSBhL3R1dG9yaWFsL25vZGVqcy9Ob2RlQ2xpZW50LmpzCisrKyBiL3R1dG9yaWFsL25vZGVqcy9Ob2RlQ2xpZW50LmpzCkBAIC0xOCwxNCArMTgsMTIgQEAKICAqLwogCiB2YXIgdGhyaWZ0ID0gcmVxdWlyZSgndGhyaWZ0Jyk7Ci12YXIgVGhyaWZ0VHJhbnNwb3J0cyA9IHJlcXVpcmUoJ3RocmlmdC90cmFuc3BvcnQnKTsKLXZhciBUaHJpZnRQcm90b2NvbHMgPSByZXF1aXJlKCd0aHJpZnQvcHJvdG9jb2wnKTsKIHZhciBDYWxjdWxhdG9yID0gcmVxdWlyZSgnLi9nZW4tbm9kZWpzL0NhbGN1bGF0b3InKTsKIHZhciB0dHlwZXMgPSByZXF1aXJlKCcuL2dlbi1ub2RlanMvdHV0b3JpYWxfdHlwZXMnKTsKK2NvbnN0IGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydCcpOwogCi0KLXRyYW5zcG9ydCA9IFRocmlmdFRyYW5zcG9ydHMuVEJ1ZmZlcmVkVHJhbnNwb3J0KCkKLXByb3RvY29sID0gVGhyaWZ0UHJvdG9jb2xzLlRCaW5hcnlQcm90b2NvbCgpCit2YXIgdHJhbnNwb3J0ID0gdGhyaWZ0LlRCdWZmZXJlZFRyYW5zcG9ydDsKK3ZhciBwcm90b2NvbCA9IHRocmlmdC5UQmluYXJ5UHJvdG9jb2w7CiAKIHZhciBjb25uZWN0aW9uID0gdGhyaWZ0LmNyZWF0ZUNvbm5lY3Rpb24oImxvY2FsaG9zdCIsIDkwOTAsIHsKICAgdHJhbnNwb3J0IDogdHJhbnNwb3J0LApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvbm9kZWpzL05vZGVDbGllbnRQcm9taXNlLmpzIGIvdHV0b3JpYWwvbm9kZWpzL05vZGVDbGllbnRQcm9taXNlLmpzCmluZGV4IDdiY2Y4ODQuLjJjZGMxODQgMTAwNjQ0Ci0tLSBhL3R1dG9yaWFsL25vZGVqcy9Ob2RlQ2xpZW50UHJvbWlzZS5qcworKysgYi90dXRvcmlhbC9ub2RlanMvTm9kZUNsaWVudFByb21pc2UuanMKQEAgLTE4LDE0ICsxOCwxMiBAQAogICovCiAKIHZhciB0aHJpZnQgPSByZXF1aXJlKCd0aHJpZnQnKTsKLXZhciBUaHJpZnRUcmFuc3BvcnRzID0gcmVxdWlyZSgndGhyaWZ0L3RyYW5zcG9ydCcpOwotdmFyIFRocmlmdFByb3RvY29scyA9IHJlcXVpcmUoJ3RocmlmdC9wcm90b2NvbCcpOwogdmFyIENhbGN1bGF0b3IgPSByZXF1aXJlKCcuL2dlbi1ub2RlanMvQ2FsY3VsYXRvcicpOwogdmFyIHR0eXBlcyA9IHJlcXVpcmUoJy4vZ2VuLW5vZGVqcy90dXRvcmlhbF90eXBlcycpOworY29uc3QgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0Jyk7CiAKLQotdHJhbnNwb3J0ID0gVGhyaWZ0VHJhbnNwb3J0cy5UQnVmZmVyZWRUcmFuc3BvcnQoKQotcHJvdG9jb2wgPSBUaHJpZnRQcm90b2NvbHMuVEJpbmFyeVByb3RvY29sKCkKK3ZhciB0cmFuc3BvcnQgPSB0aHJpZnQuVEJ1ZmZlcmVkVHJhbnNwb3J0OwordmFyIHByb3RvY29sID0gdGhyaWZ0LlRCaW5hcnlQcm90b2NvbDsKIAogdmFyIGNvbm5lY3Rpb24gPSB0aHJpZnQuY3JlYXRlQ29ubmVjdGlvbigibG9jYWxob3N0IiwgOTA5MCwgewogICB0cmFuc3BvcnQgOiB0cmFuc3BvcnQsCmRpZmYgLS1naXQgYS90dXRvcmlhbC9ub2RlanMvTm9kZVNlcnZlci5qcyBiL3R1dG9yaWFsL25vZGVqcy9Ob2RlU2VydmVyLmpzCmluZGV4IGJhMzYxMDUuLjU1ZDM4MTcgMTAwNjQ0Ci0tLSBhL3R1dG9yaWFsL25vZGVqcy9Ob2RlU2VydmVyLmpzCisrKyBiL3R1dG9yaWFsL25vZGVqcy9Ob2RlU2VydmVyLmpzCkBAIC00OCw3ICs0OCw3IEBACiAgICAgfSBlbHNlIGlmICh3b3JrLm9wID09PSB0dHlwZXMuT3BlcmF0aW9uLkRJVklERSkgewogICAgICAgaWYgKHdvcmsubnVtMiA9PT0gMCkgewogICAgICAgICB2YXIgeCA9IG5ldyB0dHlwZXMuSW52YWxpZE9wZXJhdGlvbigpOwotICAgICAgICB4LndoYXQgPSB3b3JrLm9wOworICAgICAgICB4LndoYXRPcCA9IHdvcmsub3A7CiAgICAgICAgIHgud2h5ID0gJ0Nhbm5vdCBkaXZpZGUgYnkgMCc7CiAgICAgICAgIHJlc3VsdCh4KTsKICAgICAgICAgcmV0dXJuOwpAQCAtNTYsNyArNTYsNyBAQAogICAgICAgdmFsID0gd29yay5udW0xIC8gd29yay5udW0yOwogICAgIH0gZWxzZSB7CiAgICAgICB2YXIgeCA9IG5ldyB0dHlwZXMuSW52YWxpZE9wZXJhdGlvbigpOwotICAgICAgeC53aGF0ID0gd29yay5vcDsKKyAgICAgIHgud2hhdE9wID0gd29yay5vcDsKICAgICAgIHgud2h5ID0gJ0ludmFsaWQgb3BlcmF0aW9uJzsKICAgICAgIHJlc3VsdCh4KTsKICAgICAgIHJldHVybjsKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL25vZGVqcy9Ob2RlU2VydmVyUHJvbWlzZS5qcyBiL3R1dG9yaWFsL25vZGVqcy9Ob2RlU2VydmVyUHJvbWlzZS5qcwppbmRleCA0ZmQwYTM1Li5iZmYyODdiIDEwMDY0NAotLS0gYS90dXRvcmlhbC9ub2RlanMvTm9kZVNlcnZlclByb21pc2UuanMKKysrIGIvdHV0b3JpYWwvbm9kZWpzL05vZGVTZXJ2ZXJQcm9taXNlLmpzCkBAIC00NywxNCArNDcsMTQgQEAKICAgICB9IGVsc2UgaWYgKHdvcmsub3AgPT09IHR0eXBlcy5PcGVyYXRpb24uRElWSURFKSB7CiAgICAgICBpZiAod29yay5udW0yID09PSAwKSB7CiAgICAgICAgIHZhciB4ID0gbmV3IHR0eXBlcy5JbnZhbGlkT3BlcmF0aW9uKCk7Ci0gICAgICAgIHgud2hhdCA9IHdvcmsub3A7CisgICAgICAgIHgud2hhdE9wID0gd29yay5vcDsKICAgICAgICAgeC53aHkgPSAnQ2Fubm90IGRpdmlkZSBieSAwJzsKIAkJdGhyb3cgeDsKICAgICAgIH0KICAgICAgIHZhbCA9IHdvcmsubnVtMSAvIHdvcmsubnVtMjsKICAgICB9IGVsc2UgewogICAgICAgdmFyIHggPSBuZXcgdHR5cGVzLkludmFsaWRPcGVyYXRpb24oKTsKLSAgICAgIHgud2hhdCA9IHdvcmsub3A7CisgICAgICB4LndoYXRPcCA9IHdvcmsub3A7CiAgICAgICB4LndoeSA9ICdJbnZhbGlkIG9wZXJhdGlvbic7CiAgICAgICB0aHJvdyB4OwogICAgIH0KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL29jYW1sL0NhbGNTZXJ2ZXIubWwgYi90dXRvcmlhbC9vY2FtbC9DYWxjU2VydmVyLm1sCmluZGV4IDI0ZDdkMDMuLmI1ZmFjYjcgMTAwNzU1Ci0tLSBhL3R1dG9yaWFsL29jYW1sL0NhbGNTZXJ2ZXIubWwKKysrIGIvdHV0b3JpYWwvb2NhbWwvQ2FsY1NlcnZlci5tbApAQCAtNDksNyArNDksNyBAQAogCXwgT3BlcmF0aW9uLkRJVklERSAtPgogCSAgICBpZiB3I2dyYWJfbnVtMiA9IEludDMyLnplcm8gdGhlbgogCSAgICAgIGxldCBpbyA9IG5ldyBpbnZhbGlkT3BlcmF0aW9uIGluCi0JCWlvI3NldF93aGF0IChPcGVyYXRpb24udG9faSB3I2dyYWJfb3ApIDsKKwkJaW8jc2V0X3doYXRPcCAoT3BlcmF0aW9uLnRvX2kgdyNncmFiX29wKSA7CiAJCWlvI3NldF93aHkgIkNhbm5vdCBkaXZpZGUgYnkgMCIgOwogCQlyYWlzZSAoSW52YWxpZE9wZXJhdGlvbiBpbykKIAkgICAgZWxzZQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvb2NhbWwvX29hc2lzIGIvdHV0b3JpYWwvb2NhbWwvX29hc2lzCmluZGV4IGQ4ZTRlOTAuLjc0NWMwOTYgMTAwNjQ0Ci0tLSBhL3R1dG9yaWFsL29jYW1sL19vYXNpcworKysgYi90dXRvcmlhbC9vY2FtbC9fb2FzaXMKQEAgLTEsNSArMSw1IEBACiBOYW1lOiB0dXRvcmlhbAotVmVyc2lvbjogMC45LjIKK1ZlcnNpb246IDEuMC4wCiBPQVNJU0Zvcm1hdDogMC4zCiBTeW5vcHNpczogT0NhbWwgVHV0b3JpYWwgZXhhbXBsZQogQXV0aG9yczogQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzIDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+CmRpZmYgLS1naXQgYS90dXRvcmlhbC9wZXJsL1BlcmxDbGllbnQucGwgYi90dXRvcmlhbC9wZXJsL1BlcmxDbGllbnQucGwKaW5kZXggMWQ1OTY1Ni4uN2MyMzI4OSAxMDA2NDQKLS0tIGEvdHV0b3JpYWwvcGVybC9QZXJsQ2xpZW50LnBsCisrKyBiL3R1dG9yaWFsL3BlcmwvUGVybENsaWVudC5wbApAQCAtMzcsMTAgKzM3LDEwIEBACiAKIHVzZSBEYXRhOjpEdW1wZXI7CiAKLW15ICRzb2NrZXQgICAgPSBuZXcgVGhyaWZ0OjpTb2NrZXQoJ2xvY2FsaG9zdCcsOTA5MCk7Ci1teSAkdHJhbnNwb3J0ID0gbmV3IFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnQoJHNvY2tldCwxMDI0LDEwMjQpOwotbXkgJHByb3RvY29sICA9IG5ldyBUaHJpZnQ6OkJpbmFyeVByb3RvY29sKCR0cmFuc3BvcnQpOwotbXkgJGNsaWVudCAgICA9IG5ldyB0dXRvcmlhbDo6Q2FsY3VsYXRvckNsaWVudCgkcHJvdG9jb2wpOworbXkgJHNvY2tldCAgICA9IFRocmlmdDo6U29ja2V0LT5uZXcoJ2xvY2FsaG9zdCcsOTA5MCk7CitteSAkdHJhbnNwb3J0ID0gVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydC0+bmV3KCRzb2NrZXQsMTAyNCwxMDI0KTsKK215ICRwcm90b2NvbCAgPSBUaHJpZnQ6OkJpbmFyeVByb3RvY29sLT5uZXcoJHRyYW5zcG9ydCk7CitteSAkY2xpZW50ICAgID0gdHV0b3JpYWw6OkNhbGN1bGF0b3JDbGllbnQtPm5ldygkcHJvdG9jb2wpOwogCiAKIGV2YWx7CkBAIC01Myw3ICs1Myw3IEBACiAgICAgbXkgJHN1bSA9ICRjbGllbnQtPmFkZCgxLDEpOwogICAgIHByaW50ICIxKzE9JHN1bVxuIjsKIAotICAgIG15ICR3b3JrID0gbmV3IHR1dG9yaWFsOjpXb3JrKCk7CisgICAgbXkgJHdvcmsgPSB0dXRvcmlhbDo6V29yay0+bmV3KCk7CiAKICAgICAkd29yay0+b3AodHV0b3JpYWw6Ok9wZXJhdGlvbjo6RElWSURFKTsKICAgICAkd29yay0+bnVtMSgxKTsKQEAgLTYzLDcgKzYzLDcgQEAKICAgICAgICAgJGNsaWVudC0+Y2FsY3VsYXRlKDEsICR3b3JrKTsKICAgICAgICAgcHJpbnQgIldob2EhIFdlIGNhbiBkaXZpZGUgYnkgemVybz9cbiI7CiAgICAgfTsgaWYoJEApIHsKLSAgICAgICAgd2FybiAiSW52YWxpZE9wZXJhdGlvbjogIi5EdW1wZXIoJEApOworICAgICAgICB3YXJuICdJbnZhbGlkT3BlcmF0aW9uOiAnLkR1bXBlcigkQCk7CiAgICAgfQogCiAgICAgJHdvcmstPm9wKHR1dG9yaWFsOjpPcGVyYXRpb246OlNVQlRSQUNUKTsKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL3BlcmwvUGVybFNlcnZlci5wbCBiL3R1dG9yaWFsL3BlcmwvUGVybFNlcnZlci5wbAppbmRleCBhNDBlYzY5Li5kZmU2Yjg5IDEwMDY0NAotLS0gYS90dXRvcmlhbC9wZXJsL1BlcmxTZXJ2ZXIucGwKKysrIGIvdHV0b3JpYWwvcGVybC9QZXJsU2VydmVyLnBsCkBAIC0xLDQgKzEsNCBAQAotIyEvdXNyL2Jpbi9wZXJsCisjIS91c3IvYmluL2VudiBwZXJsCiAKICMKICMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQpAQCAtNjcsMjAgKzY3LDIwIEBACiAgIH0gZWxzaWYgKCRvcCA9PSB0dXRvcmlhbDo6T3BlcmF0aW9uOjpESVZJREUpIHsKICAgICBpZiAoJG51bTIgPT0gMCkKICAgICB7Ci0gICAgICBteSAkeCA9IG5ldyB0dXRvcmlhbDo6SW52YWxpZE9wZXJhdGlvbjsKLSAgICAgICR4LT53aGF0KCRvcCk7CisgICAgICBteSAkeCA9IHR1dG9yaWFsOjpJbnZhbGlkT3BlcmF0aW9uLT5uZXcoKTsKKyAgICAgICR4LT53aGF0T3AoJG9wKTsKICAgICAgICR4LT53aHkoJ0Nhbm5vdCBkaXZpZGUgYnkgMCcpOwogICAgICAgZGllICR4OwogICAgIH0KICAgICAkdmFsID0gJG51bTEgLyAkbnVtMjsKICAgfSBlbHNlIHsKLSAgICBteSAkeCA9IG5ldyB0dXRvcmlhbDo6SW52YWxpZE9wZXJhdGlvbjsKLSAgICAkeC0+d2hhdCgkb3ApOworICAgIG15ICR4ID0gdHV0b3JpYWw6OkludmFsaWRPcGVyYXRpb24tPm5ldygpOworICAgICR4LT53aGF0T3AoJG9wKTsKICAgICAkeC0+d2h5KCdJbnZhbGlkIG9wZXJhdGlvbicpOwogICAgIGRpZSAkeDsKICAgfQogCi0gIG15ICRsb2cgPSBuZXcgc2hhcmVkOjpTaGFyZWRTdHJ1Y3Q7CisgIG15ICRsb2cgPSBzaGFyZWQ6OlNoYXJlZFN0cnVjdC0+bmV3KCk7CiAgICRsb2ctPmtleSgkbG9naWQpOwogICAkbG9nLT52YWx1ZShpbnQoJHZhbCkpOwogICAkc2VsZi0+e2xvZ30tPnskbG9naWR9ID0gJGxvZzsKQEAgLTEwNCwxMCArMTA0LDEwIEBACiAKIAogZXZhbCB7Ci0gIG15ICRoYW5kbGVyICAgICAgID0gbmV3IENhbGN1bGF0b3JIYW5kbGVyOwotICBteSAkcHJvY2Vzc29yICAgICA9IG5ldyB0dXRvcmlhbDo6Q2FsY3VsYXRvclByb2Nlc3NvcigkaGFuZGxlcik7Ci0gIG15ICRzZXJ2ZXJzb2NrZXQgID0gbmV3IFRocmlmdDo6U2VydmVyU29ja2V0KDkwOTApOwotICBteSAkZm9ya2luZ3NlcnZlciA9IG5ldyBUaHJpZnQ6OkZvcmtpbmdTZXJ2ZXIoJHByb2Nlc3NvciwgJHNlcnZlcnNvY2tldCk7CisgIG15ICRoYW5kbGVyICAgICAgID0gQ2FsY3VsYXRvckhhbmRsZXItPm5ldygpOworICBteSAkcHJvY2Vzc29yICAgICA9IHR1dG9yaWFsOjpDYWxjdWxhdG9yUHJvY2Vzc29yLT5uZXcoJGhhbmRsZXIpOworICBteSAkc2VydmVyc29ja2V0ICA9IFRocmlmdDo6U2VydmVyU29ja2V0LT5uZXcoOTA5MCk7CisgIG15ICRmb3JraW5nc2VydmVyID0gVGhyaWZ0OjpGb3JraW5nU2VydmVyLT5uZXcoJHByb2Nlc3NvciwgJHNlcnZlcnNvY2tldCk7CiAgIHByaW50ICJTdGFydGluZyB0aGUgc2VydmVyLi4uXG4iOwogICAkZm9ya2luZ3NlcnZlci0+c2VydmUoKTsKICAgcHJpbnQgImRvbmUuXG4iOwpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvcGhwL1BocENsaWVudC5waHAgYi90dXRvcmlhbC9waHAvUGhwQ2xpZW50LnBocAppbmRleCBkMjYyYjhmLi45MmRjM2NiIDEwMDc1NQotLS0gYS90dXRvcmlhbC9waHAvUGhwQ2xpZW50LnBocAorKysgYi90dXRvcmlhbC9waHAvUGhwQ2xpZW50LnBocApAQCAtNSw3ICs1LDcgQEAKIAogZXJyb3JfcmVwb3J0aW5nKEVfQUxMKTsKIAotcmVxdWlyZV9vbmNlIF9fRElSX18uJy8uLi8uLi9saWIvcGhwL2xpYi9UaHJpZnQvQ2xhc3NMb2FkZXIvVGhyaWZ0Q2xhc3NMb2FkZXIucGhwJzsKK3JlcXVpcmVfb25jZSBfX0RJUl9fLicvLi4vLi4vbGliL3BocC9saWIvQ2xhc3NMb2FkZXIvVGhyaWZ0Q2xhc3NMb2FkZXIucGhwJzsKIAogdXNlIFRocmlmdFxDbGFzc0xvYWRlclxUaHJpZnRDbGFzc0xvYWRlcjsKIApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvcGhwL1BocFNlcnZlci5waHAgYi90dXRvcmlhbC9waHAvUGhwU2VydmVyLnBocAppbmRleCA0YWY3MGE0Li41YTliNDliIDEwMDc1NQotLS0gYS90dXRvcmlhbC9waHAvUGhwU2VydmVyLnBocAorKysgYi90dXRvcmlhbC9waHAvUGhwU2VydmVyLnBocApAQCAtNSw3ICs1LDcgQEAKIAogZXJyb3JfcmVwb3J0aW5nKEVfQUxMKTsKIAotcmVxdWlyZV9vbmNlIF9fRElSX18uJy8uLi8uLi9saWIvcGhwL2xpYi9UaHJpZnQvQ2xhc3NMb2FkZXIvVGhyaWZ0Q2xhc3NMb2FkZXIucGhwJzsKK3JlcXVpcmVfb25jZSBfX0RJUl9fLicvLi4vLi4vbGliL3BocC9saWIvQ2xhc3NMb2FkZXIvVGhyaWZ0Q2xhc3NMb2FkZXIucGhwJzsKIAogdXNlIFRocmlmdFxDbGFzc0xvYWRlclxUaHJpZnRDbGFzc0xvYWRlcjsKIApAQCAtNzksNyArNzksNyBAQAogICAgICAgY2FzZSBcdHV0b3JpYWxcT3BlcmF0aW9uOjpESVZJREU6CiAgICAgICAgIGlmICgkdy0+bnVtMiA9PSAwKSB7CiAgICAgICAgICAgJGlvID0gbmV3IFx0dXRvcmlhbFxJbnZhbGlkT3BlcmF0aW9uKCk7Ci0gICAgICAgICAgJGlvLT53aGF0ID0gJHctPm9wOworICAgICAgICAgICRpby0+d2hhdE9wID0gJHctPm9wOwogICAgICAgICAgICRpby0+d2h5ID0gIkNhbm5vdCBkaXZpZGUgYnkgMCI7CiAgICAgICAgICAgdGhyb3cgJGlvOwogICAgICAgICB9CkBAIC04Nyw3ICs4Nyw3IEBACiAgICAgICAgIGJyZWFrOwogICAgICAgZGVmYXVsdDoKICAgICAgICAgJGlvID0gbmV3IFx0dXRvcmlhbFxJbnZhbGlkT3BlcmF0aW9uKCk7Ci0gICAgICAgICRpby0+d2hhdCA9ICR3LT5vcDsKKyAgICAgICAgJGlvLT53aGF0T3AgPSAkdy0+b3A7CiAgICAgICAgICRpby0+d2h5ID0gIkludmFsaWQgT3BlcmF0aW9uIjsKICAgICAgICAgdGhyb3cgJGlvOwogICAgIH0KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL3BocC9ydW5zZXJ2ZXIucHkgYi90dXRvcmlhbC9waHAvcnVuc2VydmVyLnB5CmluZGV4IGFlMjlmZWQuLjA3N2RhYTEgMTAwNzU1Ci0tLSBhL3R1dG9yaWFsL3BocC9ydW5zZXJ2ZXIucHkKKysrIGIvdHV0b3JpYWwvcGhwL3J1bnNlcnZlci5weQpAQCAtMjYsNyArMjYsOCBAQAogIyBjaGRpcigyKSBpbnRvIHRoZSB0dXRvcmlhbCBkaXJlY3RvcnkuCiBvcy5jaGRpcihvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5kaXJuYW1lKG9zLnBhdGgucmVhbHBhdGgoX19maWxlX18pKSkpCiAKKwogY2xhc3MgSGFuZGxlcihDR0lIVFRQU2VydmVyLkNHSUhUVFBSZXF1ZXN0SGFuZGxlcik6Ci0gIGNnaV9kaXJlY3RvcmllcyAgPSBbJy9waHAnXQorICAgIGNnaV9kaXJlY3RvcmllcyA9IFsnL3BocCddCiAKIEJhc2VIVFRQU2VydmVyLkhUVFBTZXJ2ZXIoKCcnLCA4MDgwKSwgSGFuZGxlcikuc2VydmVfZm9yZXZlcigpCmRpZmYgLS1naXQgYS90dXRvcmlhbC9weS50b3JuYWRvL01ha2VmaWxlLmFtIGIvdHV0b3JpYWwvcHkudG9ybmFkby9NYWtlZmlsZS5hbQppbmRleCA2YWM2MDIzLi40YjczYzFlIDEwMDc1NQotLS0gYS90dXRvcmlhbC9weS50b3JuYWRvL01ha2VmaWxlLmFtCisrKyBiL3R1dG9yaWFsL3B5LnRvcm5hZG8vTWFrZWZpbGUuYW0KQEAgLTE3LDggKzE3LDYgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLVRIUklGVCA9ICQodG9wX2J1aWxkZGlyKS9jb21waWxlci9jcHAvdGhyaWZ0Ci0KIGdlbi1weS50b3JuYWRvL3R1dG9yaWFsL0NhbGN1bGF0b3IucHkgZ2VuLXB5LnRvcm5hZG8vc2hhcmVkL1NoYXJlZFNlcnZpY2UucHk6ICQodG9wX3NyY2RpcikvdHV0b3JpYWwvdHV0b3JpYWwudGhyaWZ0CiAJJChUSFJJRlQpIC0tZ2VuIHB5OnRvcm5hZG8gLXIgJDwKIApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvcHkudG9ybmFkby9QeXRob25DbGllbnQucHkgYi90dXRvcmlhbC9weS50b3JuYWRvL1B5dGhvbkNsaWVudC5weQppbmRleCA5NWQ3OGI4Li40MjYxNDZmIDEwMDc1NQotLS0gYS90dXRvcmlhbC9weS50b3JuYWRvL1B5dGhvbkNsaWVudC5weQorKysgYi90dXRvcmlhbC9weS50b3JuYWRvL1B5dGhvbkNsaWVudC5weQpAQCAtMTksMTggKzE5LDE3IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1pbXBvcnQgc3lzCiBpbXBvcnQgZ2xvYgotc3lzLnBhdGguYXBwZW5kKCdnZW4tcHkudG9ybmFkbycpCi1zeXMucGF0aC5pbnNlcnQoMCwgZ2xvYi5nbG9iKCcuLi8uLi9saWIvcHkvYnVpbGQvbGliLionKVswXSkKLQogaW1wb3J0IGxvZ2dpbmcKK2ltcG9ydCBzeXMKKworc3lzLnBhdGguYXBwZW5kKCdnZW4tcHkudG9ybmFkbycpCitzeXMucGF0aC5pbnNlcnQoMCwgZ2xvYi5nbG9iKCcuLi8uLi9saWIvcHkvYnVpbGQvbGliKicpWzBdKQogCiBmcm9tIHR1dG9yaWFsIGltcG9ydCBDYWxjdWxhdG9yCiBmcm9tIHR1dG9yaWFsLnR0eXBlcyBpbXBvcnQgT3BlcmF0aW9uLCBXb3JrLCBJbnZhbGlkT3BlcmF0aW9uCiAKIGZyb20gdGhyaWZ0IGltcG9ydCBUVG9ybmFkbwotZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUU29ja2V0CiBmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQKIGZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wKIApAQCAtMzgsMzkgKzM3LDM4IEBACiBmcm9tIHRvcm5hZG8gaW1wb3J0IGlvbG9vcAogCiAKLUBnZW4uZW5naW5lCi1kZWYgY29tbXVuaWNhdGUoY2FsbGJhY2s9Tm9uZSk6CitAZ2VuLmNvcm91dGluZQorZGVmIGNvbW11bmljYXRlKCk6CiAgICAgIyBjcmVhdGUgY2xpZW50CiAgICAgdHJhbnNwb3J0ID0gVFRvcm5hZG8uVFRvcm5hZG9TdHJlYW1UcmFuc3BvcnQoJ2xvY2FsaG9zdCcsIDkwOTApCisgICAgIyBvcGVuIHRoZSB0cmFuc3BvcnQsIGJhaWwgb24gZXJyb3IKKyAgICB0cnk6CisgICAgICAgIHlpZWxkIHRyYW5zcG9ydC5vcGVuKCkKKyAgICAgICAgcHJpbnQoJ1RyYW5zcG9ydCBpcyBvcGVuZWQnKQorICAgIGV4Y2VwdCBUVHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb24gYXMgZXg6CisgICAgICAgIGxvZ2dpbmcuZXJyb3IoZXgpCisgICAgICAgIHJhaXNlIGdlbi5SZXR1cm4oKQorCiAgICAgcGZhY3RvcnkgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpCiAgICAgY2xpZW50ID0gQ2FsY3VsYXRvci5DbGllbnQodHJhbnNwb3J0LCBwZmFjdG9yeSkKIAotICAgICMgb3BlbiB0aGUgdHJhbnNwb3J0LCBiYWlsIG9uIGVycm9yCi0gICAgdHJ5OgotICAgICAgICB5aWVsZCBnZW4uVGFzayh0cmFuc3BvcnQub3BlbikKLSAgICBleGNlcHQgVFRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uIGFzIGV4OgotICAgICAgICBsb2dnaW5nLmVycm9yKGV4KQotICAgICAgICBpZiBjYWxsYmFjazoKLSAgICAgICAgICAgIGNhbGxiYWNrKCkKLSAgICAgICAgcmV0dXJuCi0KICAgICAjIHBpbmcKLSAgICB5aWVsZCBnZW4uVGFzayhjbGllbnQucGluZykKLSAgICBwcmludCAicGluZygpIgorICAgIHlpZWxkIGNsaWVudC5waW5nKCkKKyAgICBwcmludCgicGluZygpIikKIAogICAgICMgYWRkCi0gICAgc3VtXyA9IHlpZWxkIGdlbi5UYXNrKGNsaWVudC5hZGQsIDEsIDEpCi0gICAgcHJpbnQgIjEgKyAxID0ge30iLmZvcm1hdChzdW1fKQorICAgIHN1bV8gPSB5aWVsZCBjbGllbnQuYWRkKDEsIDEpCisgICAgcHJpbnQoIjEgKyAxID0gezB9Ii5mb3JtYXQoc3VtXykpCiAKICAgICAjIG1ha2UgYSBvbmV3YXkgY2FsbCB3aXRob3V0IGEgY2FsbGJhY2sgKHNjaGVkdWxlIHRoZSB3cml0ZSBhbmQgY29udGludWUKICAgICAjIHdpdGhvdXQgYmxvY2tpbmcpCiAgICAgY2xpZW50LnppcCgpCi0gICAgcHJpbnQgInppcCgpIHdpdGhvdXQgY2FsbGJhY2siCisgICAgcHJpbnQoInppcCgpIHdpdGhvdXQgY2FsbGJhY2siKQogCiAgICAgIyBtYWtlIGEgb25ld2F5IGNhbGwgd2l0aCBhIGNhbGxiYWNrICh3ZSdsbCB3YWl0IGZvciB0aGUgc3RyZWFtIHdyaXRlIHRvCiAgICAgIyBjb21wbGV0ZSBiZWZvcmUgY29udGludWluZykKLSAgICB5aWVsZCBnZW4uVGFzayhjbGllbnQuemlwKQotICAgIHByaW50ICJ6aXAoKSB3aXRoIGNhbGxiYWNrIgorICAgIGNsaWVudC56aXAoKQorICAgIHByaW50KCJ6aXAoKSB3aXRoIGNhbGxiYWNrIikKIAogICAgICMgY2FsY3VsYXRlIDEvMAogICAgIHdvcmsgPSBXb3JrKCkKQEAgLTc5LDM3ICs3NywzMSBAQAogICAgIHdvcmsubnVtMiA9IDAKIAogICAgIHRyeToKLSAgICAgICAgcXVvdGllbnQgPSB5aWVsZCBnZW4uVGFzayhjbGllbnQuY2FsY3VsYXRlLCAxLCB3b3JrKQotICAgICAgICBwcmludCAiV2hvYT8gWW91IGtub3cgaG93IHRvIGRpdmlkZSBieSB6ZXJvPyIKKyAgICAgICAgcXVvdGllbnQgPSB5aWVsZCBjbGllbnQuY2FsY3VsYXRlKDEsIHdvcmspCisgICAgICAgIHByaW50KCJXaG9hPyBZb3Uga25vdyBob3cgdG8gZGl2aWRlIGJ5IHplcm8gPyAtPiB7MH0iLmZvcm1hdChxdW90aWVudCkpCiAgICAgZXhjZXB0IEludmFsaWRPcGVyYXRpb24gYXMgaW86Ci0gICAgICAgIHByaW50ICJJbnZhbGlkT3BlcmF0aW9uOiB7fSIuZm9ybWF0KGlvKQorICAgICAgICBwcmludCgiSW52YWxpZE9wZXJhdGlvbjogezB9Ii5mb3JtYXQoaW8pKQogCiAgICAgIyBjYWxjdWxhdGUgMTUtMTAKICAgICB3b3JrLm9wID0gT3BlcmF0aW9uLlNVQlRSQUNUCiAgICAgd29yay5udW0xID0gMTUKICAgICB3b3JrLm51bTIgPSAxMAogCi0gICAgZGlmZiA9IHlpZWxkIGdlbi5UYXNrKGNsaWVudC5jYWxjdWxhdGUsIDEsIHdvcmspCi0gICAgcHJpbnQgIjE1IC0gMTAgPSB7fSIuZm9ybWF0KGRpZmYpCisgICAgZGlmZiA9IHlpZWxkIGNsaWVudC5jYWxjdWxhdGUoMSwgd29yaykKKyAgICBwcmludCgiMTUgLSAxMCA9IHswfSIuZm9ybWF0KGRpZmYpKQogCiAgICAgIyBnZXRTdHJ1Y3QKLSAgICBsb2cgPSB5aWVsZCBnZW4uVGFzayhjbGllbnQuZ2V0U3RydWN0LCAxKQotICAgIHByaW50ICJDaGVjayBsb2c6IHt9Ii5mb3JtYXQobG9nLnZhbHVlKQorICAgIGxvZyA9IHlpZWxkIGNsaWVudC5nZXRTdHJ1Y3QoMSkKKyAgICBwcmludCgiQ2hlY2sgbG9nOiB7MH0iLmZvcm1hdChsb2cudmFsdWUpKQogCiAgICAgIyBjbG9zZSB0aGUgdHJhbnNwb3J0CiAgICAgY2xpZW50Ll90cmFuc3BvcnQuY2xvc2UoKQotCi0gICAgaWYgY2FsbGJhY2s6Ci0gICAgICAgIGNhbGxiYWNrKCkKKyAgICByYWlzZSBnZW4uUmV0dXJuKCkKIAogCiBkZWYgbWFpbigpOgogICAgICMgY3JlYXRlIGFuIGlvbG9vcCwgZG8gdGhlIGFib3ZlLCB0aGVuIHN0b3AKLSAgICBpb19sb29wID0gaW9sb29wLklPTG9vcC5pbnN0YW5jZSgpCi0gICAgZGVmIHRoaXNfam9pbnQoKToKLSAgICAgICAgY29tbXVuaWNhdGUoY2FsbGJhY2s9aW9fbG9vcC5zdG9wKQotICAgIGlvX2xvb3AuYWRkX2NhbGxiYWNrKHRoaXNfam9pbnQpCi0gICAgaW9fbG9vcC5zdGFydCgpCisgICAgaW9sb29wLklPTG9vcC5jdXJyZW50KCkucnVuX3N5bmMoY29tbXVuaWNhdGUpCiAKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL3B5LnRvcm5hZG8vUHl0aG9uU2VydmVyLnB5IGIvdHV0b3JpYWwvcHkudG9ybmFkby9QeXRob25TZXJ2ZXIucHkKaW5kZXggNTI5MzJmZi4uZTAyMjlhMiAxMDA3NTUKLS0tIGEvdHV0b3JpYWwvcHkudG9ybmFkby9QeXRob25TZXJ2ZXIucHkKKysrIGIvdHV0b3JpYWwvcHkudG9ybmFkby9QeXRob25TZXJ2ZXIucHkKQEAgLTE5LDEwICsxOSwxMSBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotaW1wb3J0IHN5cwogaW1wb3J0IGdsb2IKK2ltcG9ydCBzeXMKKwogc3lzLnBhdGguYXBwZW5kKCdnZW4tcHkudG9ybmFkbycpCi1zeXMucGF0aC5pbnNlcnQoMCwgZ2xvYi5nbG9iKCcuLi8uLi9saWIvcHkvYnVpbGQvbGliLionKVswXSkKK3N5cy5wYXRoLmluc2VydCgwLCBnbG9iLmdsb2IoJy4uLy4uL2xpYi9weS9idWlsZC9saWIqJylbMF0pCiAKIGZyb20gdHV0b3JpYWwgaW1wb3J0IENhbGN1bGF0b3IKIGZyb20gdHV0b3JpYWwudHR5cGVzIGltcG9ydCBPcGVyYXRpb24sIEludmFsaWRPcGVyYXRpb24KQEAgLTMwLDEwICszMSw3IEBACiBmcm9tIHNoYXJlZC50dHlwZXMgaW1wb3J0IFNoYXJlZFN0cnVjdAogCiBmcm9tIHRocmlmdCBpbXBvcnQgVFRvcm5hZG8KLWZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFNvY2tldAotZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0CiBmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sCi1mcm9tIHRocmlmdC5zZXJ2ZXIgaW1wb3J0IFRTZXJ2ZXIKIAogZnJvbSB0b3JuYWRvIGltcG9ydCBpb2xvb3AKIApAQCAtNDIsMTYgKzQwLDE1IEBACiAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgICBzZWxmLmxvZyA9IHt9CiAKLSAgICBkZWYgcGluZyhzZWxmLCBjYWxsYmFjayk6Ci0gICAgICAgIHByaW50ICJwaW5nKCkiCi0gICAgICAgIGNhbGxiYWNrKCkKKyAgICBkZWYgcGluZyhzZWxmKToKKyAgICAgICAgcHJpbnQoInBpbmcoKSIpCiAKLSAgICBkZWYgYWRkKHNlbGYsIG4xLCBuMiwgY2FsbGJhY2spOgotICAgICAgICBwcmludCAiYWRkKHt9LCB7fSkiLmZvcm1hdChuMSwgbjIpCi0gICAgICAgIGNhbGxiYWNrKG4xICsgbjIpCisgICAgZGVmIGFkZChzZWxmLCBuMSwgbjIpOgorICAgICAgICBwcmludCgiYWRkKHt9LCB7fSkiLmZvcm1hdChuMSwgbjIpKQorICAgICAgICByZXR1cm4gbjEgKyBuMgogCi0gICAgZGVmIGNhbGN1bGF0ZShzZWxmLCBsb2dpZCwgd29yaywgY2FsbGJhY2spOgotICAgICAgICBwcmludCAiY2FsY3VsYXRlKHt9LCB7fSkiLmZvcm1hdChsb2dpZCwgd29yaykKKyAgICBkZWYgY2FsY3VsYXRlKHNlbGYsIGxvZ2lkLCB3b3JrKToKKyAgICAgICAgcHJpbnQoImNhbGN1bGF0ZSh7fSwge30pIi5mb3JtYXQobG9naWQsIHdvcmspKQogCiAgICAgICAgIGlmIHdvcmsub3AgPT0gT3BlcmF0aW9uLkFERDoKICAgICAgICAgICAgIHZhbCA9IHdvcmsubnVtMSArIHdvcmsubnVtMgpAQCAtNjIsMTMgKzU5LDEzIEBACiAgICAgICAgIGVsaWYgd29yay5vcCA9PSBPcGVyYXRpb24uRElWSURFOgogICAgICAgICAgICAgaWYgd29yay5udW0yID09IDA6CiAgICAgICAgICAgICAgICAgeCA9IEludmFsaWRPcGVyYXRpb24oKQotICAgICAgICAgICAgICAgIHgud2hhdCA9IHdvcmsub3AKKyAgICAgICAgICAgICAgICB4LndoYXRPcCA9IHdvcmsub3AKICAgICAgICAgICAgICAgICB4LndoeSA9ICJDYW5ub3QgZGl2aWRlIGJ5IDAiCiAgICAgICAgICAgICAgICAgcmFpc2UgeAogICAgICAgICAgICAgdmFsID0gd29yay5udW0xIC8gd29yay5udW0yCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICB4ID0gSW52YWxpZE9wZXJhdGlvbigpCi0gICAgICAgICAgICB4LndoYXQgPSB3b3JrLm9wCisgICAgICAgICAgICB4LndoYXRPcCA9IHdvcmsub3AKICAgICAgICAgICAgIHgud2h5ID0gIkludmFsaWQgb3BlcmF0aW9uIgogICAgICAgICAgICAgcmFpc2UgeAogCkBAIC03NiwxNSArNzMsMTQgQEAKICAgICAgICAgbG9nLmtleSA9IGxvZ2lkCiAgICAgICAgIGxvZy52YWx1ZSA9ICclZCcgJSAodmFsKQogICAgICAgICBzZWxmLmxvZ1tsb2dpZF0gPSBsb2cKLSAgICAgICAgY2FsbGJhY2sodmFsKQorICAgICAgICByZXR1cm4gdmFsCiAKLSAgICBkZWYgZ2V0U3RydWN0KHNlbGYsIGtleSwgY2FsbGJhY2spOgotICAgICAgICBwcmludCAiZ2V0U3RydWN0KHt9KSIuZm9ybWF0KGtleSkKLSAgICAgICAgY2FsbGJhY2soc2VsZi5sb2dba2V5XSkKKyAgICBkZWYgZ2V0U3RydWN0KHNlbGYsIGtleSk6CisgICAgICAgIHByaW50KCJnZXRTdHJ1Y3Qoe30pIi5mb3JtYXQoa2V5KSkKKyAgICAgICAgcmV0dXJuIHNlbGYubG9nW2tleV0KIAotICAgIGRlZiB6aXAoc2VsZiwgY2FsbGJhY2spOgotICAgICAgICBwcmludCAiemlwKCkiCi0gICAgICAgIGNhbGxiYWNrKCkKKyAgICBkZWYgemlwKHNlbGYpOgorICAgICAgICBwcmludCgiemlwKCkiKQogCiAKIGRlZiBtYWluKCk6CkBAIC05MywxMSArODksMTEgQEAKICAgICBwZmFjdG9yeSA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkKICAgICBzZXJ2ZXIgPSBUVG9ybmFkby5UVG9ybmFkb1NlcnZlcihwcm9jZXNzb3IsIHBmYWN0b3J5KQogCi0gICAgcHJpbnQgIlN0YXJ0aW5nIHRoZSBzZXJ2ZXIuLi4iCisgICAgcHJpbnQoIlN0YXJ0aW5nIHRoZSBzZXJ2ZXIuLi4iKQogICAgIHNlcnZlci5iaW5kKDkwOTApCiAgICAgc2VydmVyLnN0YXJ0KDEpCiAgICAgaW9sb29wLklPTG9vcC5pbnN0YW5jZSgpLnN0YXJ0KCkKLSAgICBwcmludCAiZG9uZS4iCisgICAgcHJpbnQoImRvbmUuIikKIAogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvcHkudHdpc3RlZC9NYWtlZmlsZS5hbSBiL3R1dG9yaWFsL3B5LnR3aXN0ZWQvTWFrZWZpbGUuYW0KaW5kZXggYzZjYmQ0NS4uNTBjZDM0MiAxMDA3NTUKLS0tIGEvdHV0b3JpYWwvcHkudHdpc3RlZC9NYWtlZmlsZS5hbQorKysgYi90dXRvcmlhbC9weS50d2lzdGVkL01ha2VmaWxlLmFtCkBAIC0xNyw4ICsxNyw2IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1USFJJRlQgPSAkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL3RocmlmdAotCiBnZW4tcHkvdHV0b3JpYWwvQ2FsY3VsYXRvci5weSBnZW4tcHkvc2hhcmVkL1NoYXJlZFNlcnZpY2UucHk6ICQodG9wX3NyY2RpcikvdHV0b3JpYWwvdHV0b3JpYWwudGhyaWZ0CiAJJChUSFJJRlQpIC0tZ2VuIHB5OnR3aXN0ZWQgLXIgJDwKIApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvcHkudHdpc3RlZC9QeXRob25DbGllbnQucHkgYi90dXRvcmlhbC9weS50d2lzdGVkL1B5dGhvbkNsaWVudC5weQppbmRleCA5ZTA4NmYwLi42M2RkZTdlIDEwMDc1NQotLS0gYS90dXRvcmlhbC9weS50d2lzdGVkL1B5dGhvbkNsaWVudC5weQorKysgYi90dXRvcmlhbC9weS50d2lzdGVkL1B5dGhvbkNsaWVudC5weQpAQCAtMTksNTEgKzE5LDUzIEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1pbXBvcnQgc3lzLCBnbG9iCitpbXBvcnQgZ2xvYgoraW1wb3J0IHN5cwogc3lzLnBhdGguYXBwZW5kKCdnZW4tcHkudHdpc3RlZCcpCi1zeXMucGF0aC5pbnNlcnQoMCwgZ2xvYi5nbG9iKCcuLi8uLi9saWIvcHkvYnVpbGQvbGliLionKVswXSkKK3N5cy5wYXRoLmluc2VydCgwLCBnbG9iLmdsb2IoJy4uLy4uL2xpYi9weS9idWlsZC9saWIqJylbMF0pCiAKIGZyb20gdHV0b3JpYWwgaW1wb3J0IENhbGN1bGF0b3IKLWZyb20gdHV0b3JpYWwudHR5cGVzIGltcG9ydCAqCitmcm9tIHR1dG9yaWFsLnR0eXBlcyBpbXBvcnQgSW52YWxpZE9wZXJhdGlvbiwgT3BlcmF0aW9uLCBXb3JrCiAKIGZyb20gdHdpc3RlZC5pbnRlcm5ldC5kZWZlciBpbXBvcnQgaW5saW5lQ2FsbGJhY2tzCiBmcm9tIHR3aXN0ZWQuaW50ZXJuZXQgaW1wb3J0IHJlYWN0b3IKIGZyb20gdHdpc3RlZC5pbnRlcm5ldC5wcm90b2NvbCBpbXBvcnQgQ2xpZW50Q3JlYXRvcgogCi1mcm9tIHRocmlmdCBpbXBvcnQgVGhyaWZ0CiBmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUd2lzdGVkCiBmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sCiAKKwogQGlubGluZUNhbGxiYWNrcwogZGVmIG1haW4oY2xpZW50KToKLSAgeWllbGQgY2xpZW50LnBpbmcoKQotICBwcmludCAncGluZygpJworICAgIHlpZWxkIGNsaWVudC5waW5nKCkKKyAgICBwcmludCgncGluZygpJykKIAotICBzdW0gPSB5aWVsZCBjbGllbnQuYWRkKDEsMSkKLSAgcHJpbnQgJzErMT0lZCcgJSAoc3VtKQorICAgIHN1bSA9IHlpZWxkIGNsaWVudC5hZGQoMSwgMSkKKyAgICBwcmludCgoJzErMT0lZCcgJSAoc3VtKSkpCiAKLSAgd29yayA9IFdvcmsoKQorICAgIHdvcmsgPSBXb3JrKCkKIAotICB3b3JrLm9wID0gT3BlcmF0aW9uLkRJVklERQotICB3b3JrLm51bTEgPSAxCi0gIHdvcmsubnVtMiA9IDAKKyAgICB3b3JrLm9wID0gT3BlcmF0aW9uLkRJVklERQorICAgIHdvcmsubnVtMSA9IDEKKyAgICB3b3JrLm51bTIgPSAwCiAKLSAgdHJ5OgotICAgIHF1b3RpZW50ID0geWllbGQgY2xpZW50LmNhbGN1bGF0ZSgxLCB3b3JrKQotICAgIHByaW50ICdXaG9hPyBZb3Uga25vdyBob3cgdG8gZGl2aWRlIGJ5IHplcm8/JwotICBleGNlcHQgSW52YWxpZE9wZXJhdGlvbiwgaW86Ci0gICAgcHJpbnQgJ0ludmFsaWRPcGVyYXRpb246ICVyJyAlIGlvCisgICAgdHJ5OgorICAgICAgICBxdW90aWVudCA9IHlpZWxkIGNsaWVudC5jYWxjdWxhdGUoMSwgd29yaykKKyAgICAgICAgcHJpbnQoJ1dob2E/IFlvdSBrbm93IGhvdyB0byBkaXZpZGUgYnkgemVybz8nKQorICAgICAgICBwcmludCgnRllJIHRoZSBhbnN3ZXIgaXMgJWQnICUgcXVvdGllbnQpCisgICAgZXhjZXB0IEludmFsaWRPcGVyYXRpb24gYXMgZToKKyAgICAgICAgcHJpbnQoKCdJbnZhbGlkT3BlcmF0aW9uOiAlcicgJSBlKSkKIAotICB3b3JrLm9wID0gT3BlcmF0aW9uLlNVQlRSQUNUCi0gIHdvcmsubnVtMSA9IDE1Ci0gIHdvcmsubnVtMiA9IDEwCisgICAgd29yay5vcCA9IE9wZXJhdGlvbi5TVUJUUkFDVAorICAgIHdvcmsubnVtMSA9IDE1CisgICAgd29yay5udW0yID0gMTAKIAotICBkaWZmID0geWllbGQgY2xpZW50LmNhbGN1bGF0ZSgxLCB3b3JrKQotICBwcmludCAnMTUtMTA9JWQnICUgKGRpZmYpCisgICAgZGlmZiA9IHlpZWxkIGNsaWVudC5jYWxjdWxhdGUoMSwgd29yaykKKyAgICBwcmludCgoJzE1LTEwPSVkJyAlIChkaWZmKSkpCiAKLSAgbG9nID0geWllbGQgY2xpZW50LmdldFN0cnVjdCgxKQotICBwcmludCAnQ2hlY2sgbG9nOiAlcycgJSAobG9nLnZhbHVlKQotICByZWFjdG9yLnN0b3AoKQorICAgIGxvZyA9IHlpZWxkIGNsaWVudC5nZXRTdHJ1Y3QoMSkKKyAgICBwcmludCgoJ0NoZWNrIGxvZzogJXMnICUgKGxvZy52YWx1ZSkpKQorICAgIHJlYWN0b3Iuc3RvcCgpCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICAgZCA9IENsaWVudENyZWF0b3IocmVhY3RvciwKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL3B5LnR3aXN0ZWQvUHl0aG9uU2VydmVyLnB5IGIvdHV0b3JpYWwvcHkudHdpc3RlZC9QeXRob25TZXJ2ZXIucHkKaW5kZXggZjAyM2NhYy4uMWIwZTJkNSAxMDA3NTUKLS0tIGEvdHV0b3JpYWwvcHkudHdpc3RlZC9QeXRob25TZXJ2ZXIucHkKKysrIGIvdHV0b3JpYWwvcHkudHdpc3RlZC9QeXRob25TZXJ2ZXIucHkKQEAgLTE5LDEyICsxOSwxMyBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotaW1wb3J0IHN5cywgZ2xvYgoraW1wb3J0IGdsb2IKK2ltcG9ydCBzeXMKIHN5cy5wYXRoLmFwcGVuZCgnZ2VuLXB5LnR3aXN0ZWQnKQotc3lzLnBhdGguaW5zZXJ0KDAsIGdsb2IuZ2xvYignLi4vLi4vbGliL3B5L2J1aWxkL2xpYi4qJylbMF0pCitzeXMucGF0aC5pbnNlcnQoMCwgZ2xvYi5nbG9iKCcuLi8uLi9saWIvcHkvYnVpbGQvbGliKicpWzBdKQogCiBmcm9tIHR1dG9yaWFsIGltcG9ydCBDYWxjdWxhdG9yCi1mcm9tIHR1dG9yaWFsLnR0eXBlcyBpbXBvcnQgKgorZnJvbSB0dXRvcmlhbC50dHlwZXMgaW1wb3J0IEludmFsaWRPcGVyYXRpb24sIE9wZXJhdGlvbgogCiBmcm9tIHNoYXJlZC50dHlwZXMgaW1wb3J0IFNoYXJlZFN0cnVjdAogCkBAIC0zMyw2MSArMzQsNjMgQEAKIAogZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUVHdpc3RlZAogZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbAotZnJvbSB0aHJpZnQuc2VydmVyIGltcG9ydCBUU2VydmVyCisKIAogY2xhc3MgQ2FsY3VsYXRvckhhbmRsZXI6Ci0gIGltcGxlbWVudHMoQ2FsY3VsYXRvci5JZmFjZSkgIAotICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgc2VsZi5sb2cgPSB7fQorICAgIGltcGxlbWVudHMoQ2FsY3VsYXRvci5JZmFjZSkKIAotICBkZWYgcGluZyhzZWxmKToKLSAgICBwcmludCAncGluZygpJworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5sb2cgPSB7fQogCi0gIGRlZiBhZGQoc2VsZiwgbjEsIG4yKToKLSAgICBwcmludCAnYWRkKCVkLCVkKScgJSAobjEsIG4yKQotICAgIHJldHVybiBuMStuMgorICAgIGRlZiBwaW5nKHNlbGYpOgorICAgICAgICBwcmludCgncGluZygpJykKIAotICBkZWYgY2FsY3VsYXRlKHNlbGYsIGxvZ2lkLCB3b3JrKToKLSAgICBwcmludCAnY2FsY3VsYXRlKCVkLCAlciknICUgKGxvZ2lkLCB3b3JrKQorICAgIGRlZiBhZGQoc2VsZiwgbjEsIG4yKToKKyAgICAgICAgcHJpbnQoJ2FkZCglZCwlZCknICUgKG4xLCBuMikpCisgICAgICAgIHJldHVybiBuMSArIG4yCiAKLSAgICBpZiB3b3JrLm9wID09IE9wZXJhdGlvbi5BREQ6Ci0gICAgICB2YWwgPSB3b3JrLm51bTEgKyB3b3JrLm51bTIKLSAgICBlbGlmIHdvcmsub3AgPT0gT3BlcmF0aW9uLlNVQlRSQUNUOgotICAgICAgdmFsID0gd29yay5udW0xIC0gd29yay5udW0yCi0gICAgZWxpZiB3b3JrLm9wID09IE9wZXJhdGlvbi5NVUxUSVBMWToKLSAgICAgIHZhbCA9IHdvcmsubnVtMSAqIHdvcmsubnVtMgotICAgIGVsaWYgd29yay5vcCA9PSBPcGVyYXRpb24uRElWSURFOgotICAgICAgaWYgd29yay5udW0yID09IDA6Ci0gICAgICAgIHggPSBJbnZhbGlkT3BlcmF0aW9uKCkKLSAgICAgICAgeC53aGF0ID0gd29yay5vcAotICAgICAgICB4LndoeSA9ICdDYW5ub3QgZGl2aWRlIGJ5IDAnCi0gICAgICAgIHJhaXNlIHgKLSAgICAgIHZhbCA9IHdvcmsubnVtMSAvIHdvcmsubnVtMgotICAgIGVsc2U6Ci0gICAgICB4ID0gSW52YWxpZE9wZXJhdGlvbigpCi0gICAgICB4LndoYXQgPSB3b3JrLm9wCi0gICAgICB4LndoeSA9ICdJbnZhbGlkIG9wZXJhdGlvbicKLSAgICAgIHJhaXNlIHgKKyAgICBkZWYgY2FsY3VsYXRlKHNlbGYsIGxvZ2lkLCB3b3JrKToKKyAgICAgICAgcHJpbnQoJ2NhbGN1bGF0ZSglZCwgJXIpJyAlIChsb2dpZCwgd29yaykpCiAKLSAgICBsb2cgPSBTaGFyZWRTdHJ1Y3QoKQotICAgIGxvZy5rZXkgPSBsb2dpZAotICAgIGxvZy52YWx1ZSA9ICclZCcgJSAodmFsKQotICAgIHNlbGYubG9nW2xvZ2lkXSA9IGxvZworICAgICAgICBpZiB3b3JrLm9wID09IE9wZXJhdGlvbi5BREQ6CisgICAgICAgICAgICB2YWwgPSB3b3JrLm51bTEgKyB3b3JrLm51bTIKKyAgICAgICAgZWxpZiB3b3JrLm9wID09IE9wZXJhdGlvbi5TVUJUUkFDVDoKKyAgICAgICAgICAgIHZhbCA9IHdvcmsubnVtMSAtIHdvcmsubnVtMgorICAgICAgICBlbGlmIHdvcmsub3AgPT0gT3BlcmF0aW9uLk1VTFRJUExZOgorICAgICAgICAgICAgdmFsID0gd29yay5udW0xICogd29yay5udW0yCisgICAgICAgIGVsaWYgd29yay5vcCA9PSBPcGVyYXRpb24uRElWSURFOgorICAgICAgICAgICAgaWYgd29yay5udW0yID09IDA6CisgICAgICAgICAgICAgICAgeCA9IEludmFsaWRPcGVyYXRpb24oKQorICAgICAgICAgICAgICAgIHgud2hhdE9wID0gd29yay5vcAorICAgICAgICAgICAgICAgIHgud2h5ID0gJ0Nhbm5vdCBkaXZpZGUgYnkgMCcKKyAgICAgICAgICAgICAgICByYWlzZSB4CisgICAgICAgICAgICB2YWwgPSB3b3JrLm51bTEgLyB3b3JrLm51bTIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHggPSBJbnZhbGlkT3BlcmF0aW9uKCkKKyAgICAgICAgICAgIHgud2hhdE9wID0gd29yay5vcAorICAgICAgICAgICAgeC53aHkgPSAnSW52YWxpZCBvcGVyYXRpb24nCisgICAgICAgICAgICByYWlzZSB4CiAKLSAgICByZXR1cm4gdmFsCisgICAgICAgIGxvZyA9IFNoYXJlZFN0cnVjdCgpCisgICAgICAgIGxvZy5rZXkgPSBsb2dpZAorICAgICAgICBsb2cudmFsdWUgPSAnJWQnICUgKHZhbCkKKyAgICAgICAgc2VsZi5sb2dbbG9naWRdID0gbG9nCiAKLSAgZGVmIGdldFN0cnVjdChzZWxmLCBrZXkpOgotICAgIHByaW50ICdnZXRTdHJ1Y3QoJWQpJyAlIChrZXkpCi0gICAgcmV0dXJuIHNlbGYubG9nW2tleV0KKyAgICAgICAgcmV0dXJuIHZhbAogCi0gIGRlZiB6aXAoc2VsZik6Ci0gICAgcHJpbnQgJ3ppcCgpJworICAgIGRlZiBnZXRTdHJ1Y3Qoc2VsZiwga2V5KToKKyAgICAgICAgcHJpbnQoJ2dldFN0cnVjdCglZCknICUgKGtleSkpCisgICAgICAgIHJldHVybiBzZWxmLmxvZ1trZXldCisKKyAgICBkZWYgemlwKHNlbGYpOgorICAgICAgICBwcmludCgnemlwKCknKQogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIGhhbmRsZXIgPSBDYWxjdWxhdG9ySGFuZGxlcigpCiAgICAgcHJvY2Vzc29yID0gQ2FsY3VsYXRvci5Qcm9jZXNzb3IoaGFuZGxlcikKICAgICBwZmFjdG9yeSA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkKLSAgICBzZXJ2ZXIgPSByZWFjdG9yLmxpc3RlblRDUCg5MDkwLAotICAgICAgICAgICAgICAgIFRUd2lzdGVkLlRocmlmdFNlcnZlckZhY3RvcnkocHJvY2Vzc29yLAotICAgICAgICAgICAgICAgIHBmYWN0b3J5KSwgaW50ZXJmYWNlPSIxMjcuMC4wLjEiKQorICAgIHNlcnZlciA9IHJlYWN0b3IubGlzdGVuVENQKAorICAgICAgICA5MDkwLAorICAgICAgICBUVHdpc3RlZC5UaHJpZnRTZXJ2ZXJGYWN0b3J5KHByb2Nlc3NvciwgcGZhY3RvcnkpLAorICAgICAgICBpbnRlcmZhY2U9IjEyNy4wLjAuMSIpCiAgICAgcmVhY3Rvci5ydW4oKQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvcHkudHdpc3RlZC9QeXRob25TZXJ2ZXIudGFjIGIvdHV0b3JpYWwvcHkudHdpc3RlZC9QeXRob25TZXJ2ZXIudGFjCmluZGV4IDFkMGI2YzQuLjA0Nzk2MzYgMTAwNzU1Ci0tLSBhL3R1dG9yaWFsL3B5LnR3aXN0ZWQvUHl0aG9uU2VydmVyLnRhYworKysgYi90dXRvcmlhbC9weS50d2lzdGVkL1B5dGhvblNlcnZlci50YWMKQEAgLTIyLDEyICsyMiwxNCBAQAogZnJvbSB0d2lzdGVkLmFwcGxpY2F0aW9uIGltcG9ydCBpbnRlcm5ldCwgc2VydmljZQogZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUVHdpc3RlZAogCi1pbXBvcnQgc3lzLCBnbG9iCitpbXBvcnQgZ2xvYgoraW1wb3J0IHN5cwogc3lzLnBhdGguYXBwZW5kKCdnZW4tcHkudHdpc3RlZCcpCi1zeXMucGF0aC5pbnNlcnQoMCwgZ2xvYi5nbG9iKCcuLi8uLi9saWIvcHkvYnVpbGQvbGliLionKVswXSkKK3N5cy5wYXRoLmluc2VydCgwLCBnbG9iLmdsb2IoJy4uLy4uL2xpYi9weS9idWlsZC9saWIqJylbMF0pCiBmcm9tIHR1dG9yaWFsIGltcG9ydCBDYWxjdWxhdG9yCi1mcm9tIHR1dG9yaWFsLnR0eXBlcyBpbXBvcnQgKgogZnJvbSBQeXRob25TZXJ2ZXIgaW1wb3J0IENhbGN1bGF0b3JIYW5kbGVyCitmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sCisKIAogZGVmIG1ha2VfYXBwbGljYXRpb24oKToKICAgICBhcHBsaWNhdGlvbiA9IHNlcnZpY2UuQXBwbGljYXRpb24oJ0NhbGNTZXJ2ZXInKQpAQCAtMzUsOCArMzcsOSBAQAogICAgIGhhbmRsZXIgPSBDYWxjdWxhdG9ySGFuZGxlcigpCiAgICAgcHJvY2Vzc29yID0gQ2FsY3VsYXRvci5Qcm9jZXNzb3IoaGFuZGxlcikKIAotICAgIHNlcnZlckZhY3RvcnkgPSBUVHdpc3RlZC5UaHJpZnRTZXJ2ZXJGYWN0b3J5KHByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpCisgICAgc2VydmVyRmFjdG9yeSA9IFRUd2lzdGVkLlRocmlmdFNlcnZlckZhY3RvcnkoCisgICAgICAgIHByb2Nlc3NvciwKKyAgICAgICAgVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSkKIAogICAgIGNhbGNTZXJ2aWNlID0gaW50ZXJuZXQuVENQU2VydmVyKDkwOTAsIHNlcnZlckZhY3RvcnkpCiAKQEAgLTQ2LDQgKzQ5LDUgQEAKIAogICAgIHJldHVybiBhcHBsaWNhdGlvbgogCi1hcHBsaWNhdGlvbiA9IG1ha2VfYXBwbGljYXRpb24oKQoraWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBhcHBsaWNhdGlvbiA9IG1ha2VfYXBwbGljYXRpb24oKQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvcHkvTWFrZWZpbGUuYW0gYi90dXRvcmlhbC9weS9NYWtlZmlsZS5hbQppbmRleCAyMzk3YTEyLi43ZGI4MTZkIDEwMDc1NQotLS0gYS90dXRvcmlhbC9weS9NYWtlZmlsZS5hbQorKysgYi90dXRvcmlhbC9weS9NYWtlZmlsZS5hbQpAQCAtMTcsOCArMTcsNiBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotVEhSSUZUID0gJCh0b3BfYnVpbGRkaXIpL2NvbXBpbGVyL2NwcC90aHJpZnQKLQogZ2VuLXB5L3R1dG9yaWFsL0NhbGN1bGF0b3IucHkgZ2VuLXB5L3NoYXJlZC9TaGFyZWRTZXJ2aWNlLnB5OiAkKHRvcF9zcmNkaXIpL3R1dG9yaWFsL3R1dG9yaWFsLnRocmlmdAogCSQoVEhSSUZUKSAtLWdlbiBweSAtciAkPAogCkBAIC0zNCw1ICszMiw2IEBACiAJJChSTSkgLXIgZ2VuLSoKIAogRVhUUkFfRElTVCA9IFwKKwlzZXR1cC5jZmcgXAogCVB5dGhvblNlcnZlci5weSBcCiAJUHl0aG9uQ2xpZW50LnB5CmRpZmYgLS1naXQgYS90dXRvcmlhbC9weS9QeXRob25DbGllbnQucHkgYi90dXRvcmlhbC9weS9QeXRob25DbGllbnQucHkKaW5kZXggMDU1NGVlMS4uYTZjMTk2NiAxMDA3NTUKLS0tIGEvdHV0b3JpYWwvcHkvUHl0aG9uQ2xpZW50LnB5CisrKyBiL3R1dG9yaWFsL3B5L1B5dGhvbkNsaWVudC5weQpAQCAtMTksNjUgKzE5LDcxIEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1pbXBvcnQgc3lzLCBnbG9iCitpbXBvcnQgc3lzCitpbXBvcnQgZ2xvYgogc3lzLnBhdGguYXBwZW5kKCdnZW4tcHknKQotc3lzLnBhdGguaW5zZXJ0KDAsIGdsb2IuZ2xvYignLi4vLi4vbGliL3B5L2J1aWxkL2xpYi4qJylbMF0pCitzeXMucGF0aC5pbnNlcnQoMCwgZ2xvYi5nbG9iKCcuLi8uLi9saWIvcHkvYnVpbGQvbGliKicpWzBdKQogCiBmcm9tIHR1dG9yaWFsIGltcG9ydCBDYWxjdWxhdG9yCi1mcm9tIHR1dG9yaWFsLnR0eXBlcyBpbXBvcnQgKgorZnJvbSB0dXRvcmlhbC50dHlwZXMgaW1wb3J0IEludmFsaWRPcGVyYXRpb24sIE9wZXJhdGlvbiwgV29yawogCiBmcm9tIHRocmlmdCBpbXBvcnQgVGhyaWZ0CiBmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRTb2NrZXQKIGZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydAogZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbAogCi10cnk6CiAKLSAgIyBNYWtlIHNvY2tldAotICB0cmFuc3BvcnQgPSBUU29ja2V0LlRTb2NrZXQoJ2xvY2FsaG9zdCcsIDkwOTApCitkZWYgbWFpbigpOgorICAgICMgTWFrZSBzb2NrZXQKKyAgICB0cmFuc3BvcnQgPSBUU29ja2V0LlRTb2NrZXQoJ2xvY2FsaG9zdCcsIDkwOTApCiAKLSAgIyBCdWZmZXJpbmcgaXMgY3JpdGljYWwuIFJhdyBzb2NrZXRzIGFyZSB2ZXJ5IHNsb3cKLSAgdHJhbnNwb3J0ID0gVFRyYW5zcG9ydC5UQnVmZmVyZWRUcmFuc3BvcnQodHJhbnNwb3J0KQorICAgICMgQnVmZmVyaW5nIGlzIGNyaXRpY2FsLiBSYXcgc29ja2V0cyBhcmUgdmVyeSBzbG93CisgICAgdHJhbnNwb3J0ID0gVFRyYW5zcG9ydC5UQnVmZmVyZWRUcmFuc3BvcnQodHJhbnNwb3J0KQogCi0gICMgV3JhcCBpbiBhIHByb3RvY29sCi0gIHByb3RvY29sID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpCisgICAgIyBXcmFwIGluIGEgcHJvdG9jb2wKKyAgICBwcm90b2NvbCA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2wodHJhbnNwb3J0KQogCi0gICMgQ3JlYXRlIGEgY2xpZW50IHRvIHVzZSB0aGUgcHJvdG9jb2wgZW5jb2RlcgotICBjbGllbnQgPSBDYWxjdWxhdG9yLkNsaWVudChwcm90b2NvbCkKKyAgICAjIENyZWF0ZSBhIGNsaWVudCB0byB1c2UgdGhlIHByb3RvY29sIGVuY29kZXIKKyAgICBjbGllbnQgPSBDYWxjdWxhdG9yLkNsaWVudChwcm90b2NvbCkKIAotICAjIENvbm5lY3QhCi0gIHRyYW5zcG9ydC5vcGVuKCkKKyAgICAjIENvbm5lY3QhCisgICAgdHJhbnNwb3J0Lm9wZW4oKQogCi0gIGNsaWVudC5waW5nKCkKLSAgcHJpbnQgJ3BpbmcoKScKKyAgICBjbGllbnQucGluZygpCisgICAgcHJpbnQoJ3BpbmcoKScpCiAKLSAgc3VtID0gY2xpZW50LmFkZCgxLDEpCi0gIHByaW50ICcxKzE9JWQnICUgKHN1bSkKKyAgICBzdW1fID0gY2xpZW50LmFkZCgxLCAxKQorICAgIHByaW50KCcxKzE9JWQnICUgc3VtXykKIAotICB3b3JrID0gV29yaygpCisgICAgd29yayA9IFdvcmsoKQogCi0gIHdvcmsub3AgPSBPcGVyYXRpb24uRElWSURFCi0gIHdvcmsubnVtMSA9IDEKLSAgd29yay5udW0yID0gMAorICAgIHdvcmsub3AgPSBPcGVyYXRpb24uRElWSURFCisgICAgd29yay5udW0xID0gMQorICAgIHdvcmsubnVtMiA9IDAKIAotICB0cnk6Ci0gICAgcXVvdGllbnQgPSBjbGllbnQuY2FsY3VsYXRlKDEsIHdvcmspCi0gICAgcHJpbnQgJ1dob2E/IFlvdSBrbm93IGhvdyB0byBkaXZpZGUgYnkgemVybz8nCi0gIGV4Y2VwdCBJbnZhbGlkT3BlcmF0aW9uLCBpbzoKLSAgICBwcmludCAnSW52YWxpZE9wZXJhdGlvbjogJXInICUgaW8KKyAgICB0cnk6CisgICAgICAgIHF1b3RpZW50ID0gY2xpZW50LmNhbGN1bGF0ZSgxLCB3b3JrKQorICAgICAgICBwcmludCgnV2hvYT8gWW91IGtub3cgaG93IHRvIGRpdmlkZSBieSB6ZXJvPycpCisgICAgICAgIHByaW50KCdGWUkgdGhlIGFuc3dlciBpcyAlZCcgJSBxdW90aWVudCkKKyAgICBleGNlcHQgSW52YWxpZE9wZXJhdGlvbiBhcyBlOgorICAgICAgICBwcmludCgnSW52YWxpZE9wZXJhdGlvbjogJXInICUgZSkKIAotICB3b3JrLm9wID0gT3BlcmF0aW9uLlNVQlRSQUNUCi0gIHdvcmsubnVtMSA9IDE1Ci0gIHdvcmsubnVtMiA9IDEwCisgICAgd29yay5vcCA9IE9wZXJhdGlvbi5TVUJUUkFDVAorICAgIHdvcmsubnVtMSA9IDE1CisgICAgd29yay5udW0yID0gMTAKIAotICBkaWZmID0gY2xpZW50LmNhbGN1bGF0ZSgxLCB3b3JrKQotICBwcmludCAnMTUtMTA9JWQnICUgKGRpZmYpCisgICAgZGlmZiA9IGNsaWVudC5jYWxjdWxhdGUoMSwgd29yaykKKyAgICBwcmludCgnMTUtMTA9JWQnICUgZGlmZikKIAotICBsb2cgPSBjbGllbnQuZ2V0U3RydWN0KDEpCi0gIHByaW50ICdDaGVjayBsb2c6ICVzJyAlIChsb2cudmFsdWUpCisgICAgbG9nID0gY2xpZW50LmdldFN0cnVjdCgxKQorICAgIHByaW50KCdDaGVjayBsb2c6ICVzJyAlIGxvZy52YWx1ZSkKIAotICAjIENsb3NlIQotICB0cmFuc3BvcnQuY2xvc2UoKQorICAgICMgQ2xvc2UhCisgICAgdHJhbnNwb3J0LmNsb3NlKCkKIAotZXhjZXB0IFRocmlmdC5URXhjZXB0aW9uLCB0eDoKLSAgcHJpbnQgJyVzJyAlICh0eC5tZXNzYWdlKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRyeToKKyAgICAgICAgbWFpbigpCisgICAgZXhjZXB0IFRocmlmdC5URXhjZXB0aW9uIGFzIHR4OgorICAgICAgICBwcmludCgnJXMnICUgdHgubWVzc2FnZSkKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL3B5L1B5dGhvblNlcnZlci5weSBiL3R1dG9yaWFsL3B5L1B5dGhvblNlcnZlci5weQppbmRleCAwMTRhMTJlLi5lNjQyMWVmIDEwMDc1NQotLS0gYS90dXRvcmlhbC9weS9QeXRob25TZXJ2ZXIucHkKKysrIGIvdHV0b3JpYWwvcHkvUHl0aG9uU2VydmVyLnB5CkBAIC0xOSwxMiArMTksMTMgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLWltcG9ydCBzeXMsIGdsb2IKK2ltcG9ydCBnbG9iCitpbXBvcnQgc3lzCiBzeXMucGF0aC5hcHBlbmQoJ2dlbi1weScpCi1zeXMucGF0aC5pbnNlcnQoMCwgZ2xvYi5nbG9iKCcuLi8uLi9saWIvcHkvYnVpbGQvbGliLionKVswXSkKK3N5cy5wYXRoLmluc2VydCgwLCBnbG9iLmdsb2IoJy4uLy4uL2xpYi9weS9idWlsZC9saWIqJylbMF0pCiAKIGZyb20gdHV0b3JpYWwgaW1wb3J0IENhbGN1bGF0b3IKLWZyb20gdHV0b3JpYWwudHR5cGVzIGltcG9ydCAqCitmcm9tIHR1dG9yaWFsLnR0eXBlcyBpbXBvcnQgSW52YWxpZE9wZXJhdGlvbiwgT3BlcmF0aW9uCiAKIGZyb20gc2hhcmVkLnR0eXBlcyBpbXBvcnQgU2hhcmVkU3RydWN0CiAKQEAgLTMzLDY1ICszNCw3MCBAQAogZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbAogZnJvbSB0aHJpZnQuc2VydmVyIGltcG9ydCBUU2VydmVyCiAKKwogY2xhc3MgQ2FsY3VsYXRvckhhbmRsZXI6Ci0gIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICBzZWxmLmxvZyA9IHt9CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLmxvZyA9IHt9CiAKLSAgZGVmIHBpbmcoc2VsZik6Ci0gICAgcHJpbnQgJ3BpbmcoKScKKyAgICBkZWYgcGluZyhzZWxmKToKKyAgICAgICAgcHJpbnQoJ3BpbmcoKScpCiAKLSAgZGVmIGFkZChzZWxmLCBuMSwgbjIpOgotICAgIHByaW50ICdhZGQoJWQsJWQpJyAlIChuMSwgbjIpCi0gICAgcmV0dXJuIG4xK24yCisgICAgZGVmIGFkZChzZWxmLCBuMSwgbjIpOgorICAgICAgICBwcmludCgnYWRkKCVkLCVkKScgJSAobjEsIG4yKSkKKyAgICAgICAgcmV0dXJuIG4xICsgbjIKIAotICBkZWYgY2FsY3VsYXRlKHNlbGYsIGxvZ2lkLCB3b3JrKToKLSAgICBwcmludCAnY2FsY3VsYXRlKCVkLCAlciknICUgKGxvZ2lkLCB3b3JrKQorICAgIGRlZiBjYWxjdWxhdGUoc2VsZiwgbG9naWQsIHdvcmspOgorICAgICAgICBwcmludCgnY2FsY3VsYXRlKCVkLCAlciknICUgKGxvZ2lkLCB3b3JrKSkKIAotICAgIGlmIHdvcmsub3AgPT0gT3BlcmF0aW9uLkFERDoKLSAgICAgIHZhbCA9IHdvcmsubnVtMSArIHdvcmsubnVtMgotICAgIGVsaWYgd29yay5vcCA9PSBPcGVyYXRpb24uU1VCVFJBQ1Q6Ci0gICAgICB2YWwgPSB3b3JrLm51bTEgLSB3b3JrLm51bTIKLSAgICBlbGlmIHdvcmsub3AgPT0gT3BlcmF0aW9uLk1VTFRJUExZOgotICAgICAgdmFsID0gd29yay5udW0xICogd29yay5udW0yCi0gICAgZWxpZiB3b3JrLm9wID09IE9wZXJhdGlvbi5ESVZJREU6Ci0gICAgICBpZiB3b3JrLm51bTIgPT0gMDoKLSAgICAgICAgeCA9IEludmFsaWRPcGVyYXRpb24oKQotICAgICAgICB4LndoYXQgPSB3b3JrLm9wCi0gICAgICAgIHgud2h5ID0gJ0Nhbm5vdCBkaXZpZGUgYnkgMCcKLSAgICAgICAgcmFpc2UgeAotICAgICAgdmFsID0gd29yay5udW0xIC8gd29yay5udW0yCi0gICAgZWxzZToKLSAgICAgIHggPSBJbnZhbGlkT3BlcmF0aW9uKCkKLSAgICAgIHgud2hhdCA9IHdvcmsub3AKLSAgICAgIHgud2h5ID0gJ0ludmFsaWQgb3BlcmF0aW9uJwotICAgICAgcmFpc2UgeAorICAgICAgICBpZiB3b3JrLm9wID09IE9wZXJhdGlvbi5BREQ6CisgICAgICAgICAgICB2YWwgPSB3b3JrLm51bTEgKyB3b3JrLm51bTIKKyAgICAgICAgZWxpZiB3b3JrLm9wID09IE9wZXJhdGlvbi5TVUJUUkFDVDoKKyAgICAgICAgICAgIHZhbCA9IHdvcmsubnVtMSAtIHdvcmsubnVtMgorICAgICAgICBlbGlmIHdvcmsub3AgPT0gT3BlcmF0aW9uLk1VTFRJUExZOgorICAgICAgICAgICAgdmFsID0gd29yay5udW0xICogd29yay5udW0yCisgICAgICAgIGVsaWYgd29yay5vcCA9PSBPcGVyYXRpb24uRElWSURFOgorICAgICAgICAgICAgaWYgd29yay5udW0yID09IDA6CisgICAgICAgICAgICAgICAgeCA9IEludmFsaWRPcGVyYXRpb24oKQorICAgICAgICAgICAgICAgIHgud2hhdE9wID0gd29yay5vcAorICAgICAgICAgICAgICAgIHgud2h5ID0gJ0Nhbm5vdCBkaXZpZGUgYnkgMCcKKyAgICAgICAgICAgICAgICByYWlzZSB4CisgICAgICAgICAgICB2YWwgPSB3b3JrLm51bTEgLyB3b3JrLm51bTIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHggPSBJbnZhbGlkT3BlcmF0aW9uKCkKKyAgICAgICAgICAgIHgud2hhdE9wID0gd29yay5vcAorICAgICAgICAgICAgeC53aHkgPSAnSW52YWxpZCBvcGVyYXRpb24nCisgICAgICAgICAgICByYWlzZSB4CiAKLSAgICBsb2cgPSBTaGFyZWRTdHJ1Y3QoKQotICAgIGxvZy5rZXkgPSBsb2dpZAotICAgIGxvZy52YWx1ZSA9ICclZCcgJSAodmFsKQotICAgIHNlbGYubG9nW2xvZ2lkXSA9IGxvZworICAgICAgICBsb2cgPSBTaGFyZWRTdHJ1Y3QoKQorICAgICAgICBsb2cua2V5ID0gbG9naWQKKyAgICAgICAgbG9nLnZhbHVlID0gJyVkJyAlICh2YWwpCisgICAgICAgIHNlbGYubG9nW2xvZ2lkXSA9IGxvZwogCi0gICAgcmV0dXJuIHZhbAorICAgICAgICByZXR1cm4gdmFsCiAKLSAgZGVmIGdldFN0cnVjdChzZWxmLCBrZXkpOgotICAgIHByaW50ICdnZXRTdHJ1Y3QoJWQpJyAlIChrZXkpCi0gICAgcmV0dXJuIHNlbGYubG9nW2tleV0KKyAgICBkZWYgZ2V0U3RydWN0KHNlbGYsIGtleSk6CisgICAgICAgIHByaW50KCdnZXRTdHJ1Y3QoJWQpJyAlIChrZXkpKQorICAgICAgICByZXR1cm4gc2VsZi5sb2dba2V5XQogCi0gIGRlZiB6aXAoc2VsZik6Ci0gICAgcHJpbnQgJ3ppcCgpJworICAgIGRlZiB6aXAoc2VsZik6CisgICAgICAgIHByaW50KCd6aXAoKScpCiAKLWhhbmRsZXIgPSBDYWxjdWxhdG9ySGFuZGxlcigpCi1wcm9jZXNzb3IgPSBDYWxjdWxhdG9yLlByb2Nlc3NvcihoYW5kbGVyKQotdHJhbnNwb3J0ID0gVFNvY2tldC5UU2VydmVyU29ja2V0KHBvcnQ9OTA5MCkKLXRmYWN0b3J5ID0gVFRyYW5zcG9ydC5UQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KCkKLXBmYWN0b3J5ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKQogCi1zZXJ2ZXIgPSBUU2VydmVyLlRTaW1wbGVTZXJ2ZXIocHJvY2Vzc29yLCB0cmFuc3BvcnQsIHRmYWN0b3J5LCBwZmFjdG9yeSkKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgaGFuZGxlciA9IENhbGN1bGF0b3JIYW5kbGVyKCkKKyAgICBwcm9jZXNzb3IgPSBDYWxjdWxhdG9yLlByb2Nlc3NvcihoYW5kbGVyKQorICAgIHRyYW5zcG9ydCA9IFRTb2NrZXQuVFNlcnZlclNvY2tldChob3N0PScxMjcuMC4wLjEnLCBwb3J0PTkwOTApCisgICAgdGZhY3RvcnkgPSBUVHJhbnNwb3J0LlRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkoKQorICAgIHBmYWN0b3J5ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKQogCi0jIFlvdSBjb3VsZCBkbyBvbmUgb2YgdGhlc2UgZm9yIGEgbXVsdGl0aHJlYWRlZCBzZXJ2ZXIKLSNzZXJ2ZXIgPSBUU2VydmVyLlRUaHJlYWRlZFNlcnZlcihwcm9jZXNzb3IsIHRyYW5zcG9ydCwgdGZhY3RvcnksIHBmYWN0b3J5KQotI3NlcnZlciA9IFRTZXJ2ZXIuVFRocmVhZFBvb2xTZXJ2ZXIocHJvY2Vzc29yLCB0cmFuc3BvcnQsIHRmYWN0b3J5LCBwZmFjdG9yeSkKKyAgICBzZXJ2ZXIgPSBUU2VydmVyLlRTaW1wbGVTZXJ2ZXIocHJvY2Vzc29yLCB0cmFuc3BvcnQsIHRmYWN0b3J5LCBwZmFjdG9yeSkKIAotcHJpbnQgJ1N0YXJ0aW5nIHRoZSBzZXJ2ZXIuLi4nCi1zZXJ2ZXIuc2VydmUoKQotcHJpbnQgJ2RvbmUuJworICAgICMgWW91IGNvdWxkIGRvIG9uZSBvZiB0aGVzZSBmb3IgYSBtdWx0aXRocmVhZGVkIHNlcnZlcgorICAgICMgc2VydmVyID0gVFNlcnZlci5UVGhyZWFkZWRTZXJ2ZXIoCisgICAgIyAgICAgcHJvY2Vzc29yLCB0cmFuc3BvcnQsIHRmYWN0b3J5LCBwZmFjdG9yeSkKKyAgICAjIHNlcnZlciA9IFRTZXJ2ZXIuVFRocmVhZFBvb2xTZXJ2ZXIoCisgICAgIyAgICAgcHJvY2Vzc29yLCB0cmFuc3BvcnQsIHRmYWN0b3J5LCBwZmFjdG9yeSkKKworICAgIHByaW50KCdTdGFydGluZyB0aGUgc2VydmVyLi4uJykKKyAgICBzZXJ2ZXIuc2VydmUoKQorICAgIHByaW50KCdkb25lLicpCmRpZmYgLS1naXQgYS90dXRvcmlhbC9weS9zZXR1cC5jZmcgYi90dXRvcmlhbC9weS9zZXR1cC5jZmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE3MTIwYQotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL3B5L3NldHVwLmNmZwpAQCAtMCwwICsxLDIgQEAKK1tmbGFrZThdCitpZ25vcmUgPSBFNDAyCmRpZmYgLS1naXQgYS90dXRvcmlhbC9yYi9NYWtlZmlsZS5hbSBiL3R1dG9yaWFsL3JiL01ha2VmaWxlLmFtCmluZGV4IDM2OWU5MDMuLjkzNzI0MTMgMTAwNzU1Ci0tLSBhL3R1dG9yaWFsL3JiL01ha2VmaWxlLmFtCisrKyBiL3R1dG9yaWFsL3JiL01ha2VmaWxlLmFtCkBAIC0xNyw4ICsxNyw2IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1USFJJRlQgPSAkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL3RocmlmdAotCiBnZW4tcHkvY2FsY3VsYXRvci5yYiBnZW4tcHkvc2hhcmVkX3NlcnZpY2UucmI6ICQodG9wX3NyY2RpcikvdHV0b3JpYWwvdHV0b3JpYWwudGhyaWZ0CiAJJChUSFJJRlQpIC0tZ2VuIHJiIC1yICQ8CiAKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL3JiL1J1YnlTZXJ2ZXIucmIgYi90dXRvcmlhbC9yYi9SdWJ5U2VydmVyLnJiCmluZGV4IDIyY2VjMzEuLjFkNzA3ZDcgMTAwNzU1Ci0tLSBhL3R1dG9yaWFsL3JiL1J1YnlTZXJ2ZXIucmIKKysrIGIvdHV0b3JpYWwvcmIvUnVieVNlcnZlci5yYgpAQCAtNTIsMTQgKzUyLDE0IEBACiAgICAgZWxzaWYgd29yay5vcCA9PSBPcGVyYXRpb246OkRJVklERQogICAgICAgaWYgd29yay5udW0yID09IDAKICAgICAgICAgeCA9IEludmFsaWRPcGVyYXRpb24ubmV3KCkKLSAgICAgICAgeC53aGF0ID0gd29yay5vcAorICAgICAgICB4LndoYXRPcCA9IHdvcmsub3AKICAgICAgICAgeC53aHkgPSAiQ2Fubm90IGRpdmlkZSBieSAwIgogICAgICAgICByYWlzZSB4CiAgICAgICBlbmQKICAgICAgIHZhbCA9IHdvcmsubnVtMSAvIHdvcmsubnVtMgogICAgIGVsc2UKICAgICAgIHggPSBJbnZhbGlkT3BlcmF0aW9uLm5ldygpCi0gICAgICB4LndoYXQgPSB3b3JrLm9wCisgICAgICB4LndoYXRPcCA9IHdvcmsub3AKICAgICAgIHgud2h5ID0gIkludmFsaWQgb3BlcmF0aW9uIgogICAgICAgcmFpc2UgeAogICAgIGVuZApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvcnMvQ2FyZ28udG9tbCBiL3R1dG9yaWFsL3JzL0NhcmdvLnRvbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjEwYTBkYQotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL3JzL0NhcmdvLnRvbWwKQEAgLTAsMCArMSwxNiBAQAorW3BhY2thZ2VdCituYW1lID0gInRocmlmdC10dXRvcmlhbCIKK3ZlcnNpb24gPSAiMC4xLjAiCitsaWNlbnNlID0gIkFwYWNoZS0yLjAiCithdXRob3JzID0gWyJBcGFjaGUgVGhyaWZ0IERldmVsb3BlcnMgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4iXQorZXhjbHVkZSA9IFsiTWFrZWZpbGUqIiwgInNoYXJlZC5ycyIsICJ0dXRvcmlhbC5ycyJdCitwdWJsaXNoID0gZmFsc2UKKworW2RlcGVuZGVuY2llc10KK2NsYXAgPSAiPDIuMjguMCIKK29yZGVyZWQtZmxvYXQgPSAiMC4zLjAiCit0cnlfZnJvbSA9ICIwLjIuMCIKKworW2RlcGVuZGVuY2llcy50aHJpZnRdCitwYXRoID0gIi4uLy4uL2xpYi9ycyIKKwpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvcnMvTWFrZWZpbGUuYW0gYi90dXRvcmlhbC9ycy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjYzMzFlCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvcnMvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw1MiBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK1RIUklGVCA9ICQodG9wX2J1aWxkZGlyKS9jb21waWxlci9jcHAvdGhyaWZ0CisKK2dlbi1ycy90dXRvcmlhbC5ycyBnZW4tcnMvc2hhcmVkLnJzOiAkKHRvcF9zcmNkaXIpL3R1dG9yaWFsL3R1dG9yaWFsLnRocmlmdAorCSQoVEhSSUZUKSAtb3V0IHNyYyAtLWdlbiBycyAtciAkPAorCithbGwtbG9jYWw6IGdlbi1ycy90dXRvcmlhbC5ycworCSQoQ0FSR08pIGJ1aWxkCisJWyAtZCBiaW4gXSB8fCBta2RpciBiaW4KKwljcCB0YXJnZXQvZGVidWcvdHV0b3JpYWxfc2VydmVyIGJpbi90dXRvcmlhbF9zZXJ2ZXIKKwljcCB0YXJnZXQvZGVidWcvdHV0b3JpYWxfY2xpZW50IGJpbi90dXRvcmlhbF9jbGllbnQKKworY2hlY2s6IGFsbAorCit0dXRvcmlhbHNlcnZlcjogYWxsCisJYmluL3R1dG9yaWFsX3NlcnZlcgkKKwordHV0b3JpYWxjbGllbnQ6IGFsbAorCWJpbi90dXRvcmlhbF9jbGllbnQKKworY2xlYW4tbG9jYWw6CisJJChDQVJHTykgY2xlYW4KKwktJChSTSkgQ2FyZ28ubG9jaworCS0kKFJNKSBzcmMvc2hhcmVkLnJzCisJLSQoUk0pIHNyYy90dXRvcmlhbC5ycworCS0kKFJNKSAtciBiaW4KKworRVhUUkFfRElTVCA9IFwKKwlDYXJnby50b21sIFwKKwlzcmMvbGliLnJzIFwKKwlzcmMvYmluL3R1dG9yaWFsX3NlcnZlci5ycyBcCisJc3JjL2Jpbi90dXRvcmlhbF9jbGllbnQucnMgXAorCVJFQURNRS5tZAorCmRpZmYgLS1naXQgYS90dXRvcmlhbC9ycy9SRUFETUUubWQgYi90dXRvcmlhbC9ycy9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg0ZTlmOAotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL3JzL1JFQURNRS5tZApAQCAtMCwwICsxLDMxNyBAQAorIyBSdXN0IExhbmd1YWdlIEJpbmRpbmdzIGZvciBUaHJpZnQKKworIyMgR2V0dGluZyBTdGFydGVkCisKKzEuIEdldCB0aGUgW1RocmlmdCBjb21waWxlcl0oaHR0cHM6Ly90aHJpZnQuYXBhY2hlLm9yZykuCisKKzIuIEFkZCB0aGUgZm9sbG93aW5nIGNyYXRlcyB0byB5b3VyIGBDYXJnby50b21sYC4KKworYGBgdG9tbAordGhyaWZ0ID0gIngueS56IiAjIHgueS56IGlzIHRoZSB2ZXJzaW9uIG9mIHRoZSB0aHJpZnQgY29tcGlsZXIKK29yZGVyZWRfZmxvYXQgPSAiMC4zLjAiCit0cnlfZnJvbSA9ICIwLjIuMCIKK2BgYAorCiszLiBBZGQgdGhlIHNhbWUgY3JhdGVzIHRvIHlvdXIgYGxpYi5yc2Agb3IgYG1haW4ucnNgLgorCitgYGBydXN0CitleHRlcm4gY3JhdGUgb3JkZXJlZF9mbG9hdDsKK2V4dGVybiBjcmF0ZSB0aHJpZnQ7CitleHRlcm4gY3JhdGUgdHJ5X2Zyb207CitgYGAKKworNC4gR2VuZXJhdGUgUnVzdCBzb3VyY2VzIGZvciB5b3VyIElETCAoZm9yIGV4YW1wbGUsIGBUdXRvcmlhbC50aHJpZnRgKS4KKworYGBgc2hlbGwKK3RocmlmdCAtb3V0IG15X3J1c3RfcHJvZ3JhbS9zcmMgLS1nZW4gcnMgLXIgVHV0b3JpYWwudGhyaWZ0CitgYGAKKworNS4gVXNlIHRoZSBnZW5lcmF0ZWQgc291cmNlIGluIHlvdXIgY29kZS4KKworYGBgcnVzdAorLy8gYWRkIGV4dGVybiBjcmF0ZXMgaGVyZSwgb3IgaW4geW91ciBsaWIucnMKK2V4dGVybiBjcmF0ZSBvcmRlcmVkX2Zsb2F0OworZXh0ZXJuIGNyYXRlIHRocmlmdDsKK2V4dGVybiBjcmF0ZSB0cnlfZnJvbTsKKworLy8gZ2VuZXJhdGVkIFJ1c3QgbW9kdWxlCit1c2UgdHV0b3JpYWw7CisKK3VzZSB0aHJpZnQ6OnByb3RvY29sOjp7VENvbXBhY3RJbnB1dFByb3RvY29sLCBUQ29tcGFjdE91dHB1dFByb3RvY29sfTsKK3VzZSB0aHJpZnQ6OnByb3RvY29sOjp7VElucHV0UHJvdG9jb2wsIFRPdXRwdXRQcm90b2NvbH07Cit1c2UgdGhyaWZ0Ojp0cmFuc3BvcnQ6OntURnJhbWVkUmVhZFRyYW5zcG9ydCwgVEZyYW1lZFdyaXRlVHJhbnNwb3J0fTsKK3VzZSB0aHJpZnQ6OnRyYW5zcG9ydDo6e1RJb0NoYW5uZWwsIFRUY3BDaGFubmVsfTsKK3VzZSB0dXRvcmlhbDo6e0NhbGN1bGF0b3JTeW5jQ2xpZW50LCBUQ2FsY3VsYXRvclN5bmNDbGllbnR9OwordXNlIHR1dG9yaWFsOjp7T3BlcmF0aW9uLCBXb3JrfTsKKworZm4gbWFpbigpIHsKKyAgICBtYXRjaCBydW4oKSB7CisgICAgICAgIE9rKCgpKSA9PiBwcmludGxuISgiY2xpZW50IHJhbiBzdWNjZXNzZnVsbHkiKSwKKyAgICAgICAgRXJyKGUpID0+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+IHsKKyAgICAgICAgcHJpbnRsbiEoImhhbmRsaW5nIHppcCIpOworICAgICAgICBPaygoKSkKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90dXRvcmlhbC9ycy9zcmMvbGliLnJzIGIvdHV0b3JpYWwvcnMvc3JjL2xpYi5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDAwN2U1Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvcnMvc3JjL2xpYi5ycwpAQCAtMCwwICsxLDIzIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK2V4dGVybiBjcmF0ZSBvcmRlcmVkX2Zsb2F0OworZXh0ZXJuIGNyYXRlIHRocmlmdDsKK2V4dGVybiBjcmF0ZSB0cnlfZnJvbTsKKworcHViIG1vZCBzaGFyZWQ7CitwdWIgbW9kIHR1dG9yaWFsOwpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvc2hhcmVkLnRocmlmdCBiL3R1dG9yaWFsL3NoYXJlZC50aHJpZnQKaW5kZXggZGI0YjY5NC4uZjE2ODViZCAxMDA2NDQKLS0tIGEvdHV0b3JpYWwvc2hhcmVkLnRocmlmdAorKysgYi90dXRvcmlhbC9zaGFyZWQudGhyaWZ0CkBAIC0yMiwxMSArMjIsMTUgQEAKICAqIHRoZXNlIGRlZmluaXRpb25zLgogICovCiAKK25hbWVzcGFjZSBjbCBzaGFyZWQKIG5hbWVzcGFjZSBjcHAgc2hhcmVkCiBuYW1lc3BhY2UgZCBzaGFyZSAvLyAic2hhcmVkIiB3b3VsZCBjb2xsaWRlIHdpdGggdGhlIGVwb255bW91cyBEIGtleXdvcmQuCituYW1lc3BhY2UgZGFydCBzaGFyZWQKIG5hbWVzcGFjZSBqYXZhIHNoYXJlZAogbmFtZXNwYWNlIHBlcmwgc2hhcmVkCiBuYW1lc3BhY2UgcGhwIHNoYXJlZAorbmFtZXNwYWNlIGhheGUgc2hhcmVkCituYW1lc3BhY2UgbmV0Y29yZSBzaGFyZWQKIAogc3RydWN0IFNoYXJlZFN0cnVjdCB7CiAgIDE6IGkzMiBrZXkKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL3R1dG9yaWFsLnRocmlmdCBiL3R1dG9yaWFsL3R1dG9yaWFsLnRocmlmdAppbmRleCAzMTUwMTUxLi5lMDI3NTQ2IDEwMDY0NAotLS0gYS90dXRvcmlhbC90dXRvcmlhbC50aHJpZnQKKysrIGIvdHV0b3JpYWwvdHV0b3JpYWwudGhyaWZ0CkBAIC0zMiw3ICszMiw3IEBACiAgKiBUaGUgZmlyc3QgdGhpbmcgdG8ga25vdyBhYm91dCBhcmUgdHlwZXMuIFRoZSBhdmFpbGFibGUgdHlwZXMgaW4gVGhyaWZ0IGFyZToKICAqCiAgKiAgYm9vbCAgICAgICAgQm9vbGVhbiwgb25lIGJ5dGUKLSAqICBieXRlICAgICAgICBTaWduZWQgYnl0ZQorICogIGk4IChieXRlKSAgIFNpZ25lZCA4LWJpdCBpbnRlZ2VyCiAgKiAgaTE2ICAgICAgICAgU2lnbmVkIDE2LWJpdCBpbnRlZ2VyCiAgKiAgaTMyICAgICAgICAgU2lnbmVkIDMyLWJpdCBpbnRlZ2VyCiAgKiAgaTY0ICAgICAgICAgU2lnbmVkIDY0LWJpdCBpbnRlZ2VyCkBAIC02MiwxMSArNjIsMTYgQEAKICAqIFRocmlmdCBmaWxlcyBjYW4gbmFtZXNwYWNlLCBwYWNrYWdlLCBvciBwcmVmaXggdGhlaXIgb3V0cHV0IGluIHZhcmlvdXMKICAqIHRhcmdldCBsYW5ndWFnZXMuCiAgKi8KKworbmFtZXNwYWNlIGNsIHR1dG9yaWFsCiBuYW1lc3BhY2UgY3BwIHR1dG9yaWFsCiBuYW1lc3BhY2UgZCB0dXRvcmlhbAorbmFtZXNwYWNlIGRhcnQgdHV0b3JpYWwKIG5hbWVzcGFjZSBqYXZhIHR1dG9yaWFsCiBuYW1lc3BhY2UgcGhwIHR1dG9yaWFsCiBuYW1lc3BhY2UgcGVybCB0dXRvcmlhbAorbmFtZXNwYWNlIGhheGUgdHV0b3JpYWwKK25hbWVzcGFjZSBuZXRjb3JlIHR1dG9yaWFsCiAKIC8qKgogICogVGhyaWZ0IGxldHMgeW91IGRvIHR5cGVkZWZzIHRvIGdldCBwcmV0dHkgbmFtZXMgZm9yIHlvdXIgdHlwZXMuIFN0YW5kYXJkCkBAIC0xMTIsNyArMTE3LDcgQEAKICAqIFN0cnVjdHMgY2FuIGFsc28gYmUgZXhjZXB0aW9ucywgaWYgdGhleSBhcmUgbmFzdHkuCiAgKi8KIGV4Y2VwdGlvbiBJbnZhbGlkT3BlcmF0aW9uIHsKLSAgMTogaTMyIHdoYXQsCisgIDE6IGkzMiB3aGF0T3AsCiAgIDI6IHN0cmluZyB3aHkKIH0KIAo=